diff --git a/Makefile b/Makefile index 11483d08d0d..da47d6ba556 100644 --- a/Makefile +++ b/Makefile @@ -92,7 +92,7 @@ TGTS= all all-man buildenv buildenvvars buildkernel buildworld \ delete-old delete-old-dirs delete-old-files delete-old-libs \ depend distribute distributekernel distributekernel.debug \ distributeworld distrib-dirs distribution doxygen \ - everything hierarchy install installcheck installkernel \ + everything hier hierarchy install installcheck installkernel \ installkernel.debug packagekernel packageworld \ reinstallkernel reinstallkernel.debug \ installworld kernel-toolchain libraries lint maninstall \ diff --git a/Makefile.inc1 b/Makefile.inc1 index 72a45781d86..bd3c7218a94 100644 --- a/Makefile.inc1 +++ b/Makefile.inc1 @@ -15,6 +15,7 @@ # -DNO_WWWUPDATE do not update www in ${MAKE} update # -DNO_CTF do not run the DTrace CTF conversion tools on built objects # LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list +# LOCAL_LIB_DIRS="list of dirs" to add additional dirs to libraries target # LOCAL_TOOL_DIRS="list of dirs" to add additional dirs to the build-tools # list # TARGET="machine" to crossbuild world for a different machine type @@ -88,7 +89,7 @@ SUBDIR+=etc # These are last, since it is nice to at least get the base system # rebuilt before you do them. -.for _DIR in ${LOCAL_DIRS} +.for _DIR in ${LOCAL_LIB_DIRS} ${LOCAL_DIRS} .if exists(${.CURDIR}/${_DIR}/Makefile) SUBDIR+= ${_DIR} .endif @@ -223,9 +224,6 @@ CROSSENV= MAKEOBJDIRPREFIX=${OBJTREE} \ MACHINE_ARCH=${TARGET_ARCH} \ MACHINE=${TARGET} \ CPUTYPE=${TARGET_CPUTYPE} -.if ${OSRELDATE} < 700044 -CROSSENV+= AR=gnu-ar RANLIB=gnu-ranlib -.endif .if ${MK_GROFF} != "no" CROSSENV+= GROFF_BIN_PATH=${WORLDTMP}/legacy/usr/bin \ GROFF_FONT_PATH=${WORLDTMP}/legacy/usr/share/groff_font \ @@ -245,7 +243,7 @@ BMAKE= MAKEOBJDIRPREFIX=${WORLDTMP} \ SSP_CFLAGS= \ -DWITHOUT_HTML -DWITHOUT_INFO -DNO_LINT -DWITHOUT_MAN \ -DNO_PIC -DNO_PROFILE -DNO_SHARED \ - -DNO_CPU_CFLAGS -DNO_WARNS -DNO_CTF + -DNO_CPU_CFLAGS -DNO_WARNS -DNO_CTF -DEARLY_BUILD # build-tools stage TMAKE= MAKEOBJDIRPREFIX=${OBJTREE} \ @@ -255,7 +253,7 @@ TMAKE= MAKEOBJDIRPREFIX=${OBJTREE} \ BOOTSTRAPPING=${OSRELDATE} \ SSP_CFLAGS= \ -DNO_LINT \ - -DNO_CPU_CFLAGS -DNO_WARNS -DNO_CTF + -DNO_CPU_CFLAGS -DNO_WARNS -DNO_CTF -DEARLY_BUILD # cross-tools stage XMAKE= TOOLS_PREFIX=${WORLDTMP} ${BMAKE} \ @@ -265,6 +263,7 @@ XMAKE= TOOLS_PREFIX=${WORLDTMP} ${BMAKE} \ # world stage WMAKEENV= ${CROSSENV} \ _SHLIBDIRPREFIX=${WORLDTMP} \ + _LDSCRIPTROOT= \ VERSION="${VERSION}" \ INSTALL="sh ${.CURDIR}/tools/install.sh" \ PATH=${TMPPATH} @@ -307,6 +306,7 @@ LIB32FLAGS= -m32 ${LIB32CPUFLAGS} -DCOMPAT_32BIT \ # Yes, the flags are redundant. LIB32WMAKEENV+= MAKEOBJDIRPREFIX=${OBJTREE}/lib32 \ _SHLIBDIRPREFIX=${LIB32TMP} \ + _LDSCRIPTROOT=${LIB32TMP} \ VERSION="${VERSION}" \ INSTALL="sh ${.CURDIR}/tools/install.sh" \ PATH=${TMPPATH} \ @@ -319,11 +319,11 @@ LIB32WMAKE= ${LIB32WMAKEENV} ${MAKE} -DNO_CPU_CFLAGS -DCOMPAT_32BIT \ -DWITHOUT_BIND -DWITHOUT_MAN -DWITHOUT_INFO \ -DWITHOUT_HTML -DNO_CTF -DNO_LINT -ECC -ECXX -EAS -ELD \ DESTDIR=${LIB32TMP} -LIB32IMAKE= ${LIB32WMAKE:NINSTALL=*:NDESTDIR=*} -DNO_INCS +LIB32IMAKE= ${LIB32WMAKE:NINSTALL=*:NDESTDIR=*:N_LDSCRIPTROOT=*} -DNO_INCS .endif # install stage -IMAKEENV= ${CROSSENV} +IMAKEENV= ${CROSSENV:N_LDSCRIPTROOT=*} IMAKE= ${IMAKEENV} ${MAKE} -f Makefile.inc1 .if empty(.MAKEFLAGS:M-n) IMAKEENV+= PATH=${STRICTTMPPATH}:${INSTALLTMP} \ @@ -488,7 +488,8 @@ build32: .for _dir in lib/ncurses/ncurses lib/ncurses/ncursesw lib/libmagic cd ${.CURDIR}/${_dir}; \ MAKEOBJDIRPREFIX=${OBJTREE}/lib32 ${MAKE} SSP_CFLAGS= DESTDIR= \ - DIRPRFX=${_dir}/ build-tools + DIRPRFX=${_dir}/ -DNO_LINT -DNO_CPU_CFLAGS -DNO_WARNS -DNO_CTF \ + -DEARLY_BUILD build-tools .endfor cd ${.CURDIR}; \ ${LIB32WMAKE} -f Makefile.inc1 libraries @@ -830,7 +831,7 @@ buildkernel: cd ${KRNLOBJDIR}/${_kernel}; \ PATH=${BPATH}:${PATH} \ MAKESRCPATH=${KERNSRCDIR}/dev/aic7xxx/aicasm \ - ${MAKE} SSP_CFLAGS= -DNO_CPU_CFLAGS -DNO_CTF \ + ${MAKE} SSP_CFLAGS= -DNO_CPU_CFLAGS -DNO_CTF -DEARLY_BUILD \ -f ${KERNSRCDIR}/dev/aic7xxx/aicasm/Makefile # XXX - Gratuitously builds aicasm in the ``makeoptions NO_MODULES'' case. .if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists(${KERNSRCDIR}/modules) @@ -838,7 +839,7 @@ buildkernel: cd ${KERNSRCDIR}/modules/aic7xxx/aicasm; \ PATH=${BPATH}:${PATH} \ MAKEOBJDIRPREFIX=${KRNLOBJDIR}/${_kernel}/modules \ - ${MAKE} SSP_CFLAGS= -DNO_CPU_CFLAGS -DNO_CTF ${target} + ${MAKE} SSP_CFLAGS= -DNO_CPU_CFLAGS -DNO_CTF -DEARLY_BUILD ${target} .endfor .endif .if !defined(NO_KERNELDEPEND) @@ -979,8 +980,8 @@ update: # legacy: Build compatibility shims for the next three targets # legacy: -.if ${BOOTSTRAPPING} < 600034 && ${BOOTSTRAPPING} != 0 - @echo "ERROR: Source upgrades from versions prior to 6.0 not supported."; \ +.if ${BOOTSTRAPPING} < 700055 && ${BOOTSTRAPPING} != 0 + @echo "ERROR: Source upgrades from versions prior to 7.0 not supported."; \ false .endif .for _tool in tools/build @@ -1008,7 +1009,7 @@ _gperf= gnu/usr.bin/gperf _groff= gnu/usr.bin/groff .endif -.if ${BOOTSTRAPPING} >= 700044 && ${BOOTSTRAPPING} < 800022 +.if ${BOOTSTRAPPING} < 800022 _ar= usr.bin/ar .endif @@ -1022,6 +1023,9 @@ _sed= usr.bin/sed .if ${BOOTSTRAPPING} < 900006 _lex= usr.bin/lex +.endif + +.if ${BOOTSTRAPPING} < 1000013 _yacc= usr.bin/yacc .endif @@ -1029,16 +1033,10 @@ _yacc= usr.bin/yacc _awk= usr.bin/awk .endif -.if ${MK_BSNMP} != "no" && \ - (${BOOTSTRAPPING} < 700018 || !exists(/usr/sbin/gensnmptree)) +.if ${MK_BSNMP} != "no" && !exists(/usr/sbin/gensnmptree) _gensnmptree= usr.sbin/bsnmpd/gensnmptree .endif -.if ${MK_RESCUE} != "no" && \ - ${BOOTSTRAPPING} < 700026 -_crunchgen= usr.sbin/crunch/crunchgen -.endif - .if ${MK_CLANG} != "no" _clang_tblgen= \ lib/clang/libllvmsupport \ @@ -1088,12 +1086,11 @@ bootstrap-tools: ${_mklocale} \ usr.bin/rpcgen \ ${_sed} \ - ${_lex} \ ${_yacc} \ + ${_lex} \ usr.bin/xinstall \ ${_gensnmptree} \ - usr.sbin/config \ - ${_crunchgen} + usr.sbin/config ${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all,install)"; \ cd ${.CURDIR}/${_tool}; \ ${MAKE} DIRPRFX=${_tool}/ obj; \ @@ -1200,7 +1197,7 @@ cross-tools: # # hierarchy - ensure that all the needed directories are present # -hierarchy: +hierarchy hier: cd ${.CURDIR}/etc; ${MAKE} distrib-dirs # @@ -1277,6 +1274,11 @@ _ofed_lib= contrib/ofed/usr.lib/ .endif _generic_libs= ${_cddl_lib} gnu/lib ${_kerberos5_lib} lib ${_secure_lib} usr.bin/lex/lib ${_ofed_lib} +.for _DIR in ${LOCAL_LIB_DIRS} +.if exists(${.CURDIR}/${_DIR}/Makefile) +_generic_libs+= ${_DIR} +.endif +.endfor lib/libopie__L lib/libtacplus__L: lib/libmd__L @@ -1649,8 +1651,8 @@ _xi-mtree: mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \ -p ${XDDESTDIR}/usr/include >/dev/null -.ORDER: _xi-mtree _xi-cross-tools _xi-includes _xi-libraries _xi-links -xdev-install: _xi-mtree _xi-cross-tools _xi-includes _xi-libraries _xi-links +.ORDER: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries _xi-links +xdev-install: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries _xi-links _xi-cross-tools: @echo "_xi-cross-tools" diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index c77b36ac81b..6328151ed23 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -38,6 +38,31 @@ # xargs -n1 | sort | uniq -d; # done +# 20120621: remove old man page +OLD_FILES+=usr/share/man/man8/vnconfig.8.gz +# 20120613: auth.conf removed +OLD_FILES+=etc/auth.conf +OLD_FILES+=usr/share/examples/etc/auth.conf +OLD_FILES+=usr/share/man/man3/auth.3.gz +OLD_FILES+=usr/share/man/man5/auth.conf.5.gz +# 20120530: kde pam lives now in ports +OLD_FILES+=etc/pam.d/kde +# 20120505: new clang import installed a redundant internal header +OLD_FILES+=usr/include/clang/3.1/stdalign.h +# 20120428: MD2 removed from libmd +OLD_FILES+=usr/include/md2.h +OLD_FILES+=usr/share/man/man3/MD2Data.3.gz +OLD_FILES+=usr/share/man/man3/MD2End.3.gz +OLD_FILES+=usr/share/man/man3/MD2File.3.gz +OLD_FILES+=usr/share/man/man3/MD2FileChunk.3.gz +OLD_FILES+=usr/share/man/man3/MD2Final.3.gz +OLD_FILES+=usr/share/man/man3/MD2Init.3.gz +OLD_FILES+=usr/share/man/man3/MD2Update.3.gz +OLD_FILES+=usr/share/man/man3/md2.3.gz +# 20120425: libusb version bump (r234684) +OLD_LIBS+=usr/lib/libusb.so.2 +OLD_LIBS+=usr/lib32/libusb.so.2 +OLD_FILES+=usr/share/man/man3/libsub_get_active_config_descriptor.3.gz # 20120415: new clang import which bumps version from 3.0 to 3.1 OLD_FILES+=usr/include/clang/3.0/altivec.h OLD_FILES+=usr/include/clang/3.0/avxintrin.h @@ -54,6 +79,17 @@ OLD_FILES+=usr/include/clang/3.0/wmmintrin.h OLD_FILES+=usr/include/clang/3.0/x86intrin.h OLD_FILES+=usr/include/clang/3.0/xmmintrin.h OLD_DIRS+=usr/include/clang/3.0 +# 20120412: BIND 9.8.1 release notes removed +OLD_FILES+=usr/share/doc/bind9/RELEASE-NOTES-BIND-9.8.1.pdf +OLD_FILES+=usr/share/doc/bind9/RELEASE-NOTES-BIND-9.8.1.txt +OLD_FILES+=usr/share/doc/bind9/RELEASE-NOTES-BIND-9.8.1.html +OLD_FILES+=usr/share/doc/bind9/release-notes.css +# 20120330: legacy(4) moved to x86 +OLD_FILES+=usr/include/machine/legacyvar.h +# 20120324: MPI headers updated +OLD_FILES+=usr/include/dev/mpt/mpilib/mpi_inb.h +# 20120322: hwpmc_mips24k.h removed +OLD_FILES+=usr/include/dev/hwpmc/hwpmc_mips24k.h # 20120322: Update heimdal to 1.5.1. OLD_FILES+=usr/include/krb5-v4compat.h \ usr/include/krb_err.h \ @@ -98,6 +134,8 @@ OLD_LIBS+=usr/lib/libasn1.so.10 \ # 20120309: Remove fifofs header files. OLD_FILES+=usr/include/fs/fifofs/fifo.h OLD_DIRS+=usr/include/fs/fifofs +# 20120304: xlocale cleanup +OLD_FILES+=usr/include/_xlocale_ctype.h # 20120225: libarchive 3.0.3 OLD_FILES+=usr/share/man/man3/archive_read_data_into_buffer.3.gz \ usr/share/man/man3/archive_read_support_compression_all.3.gz \ @@ -459,7 +497,7 @@ OLD_FILES+=usr/share/man/man5/lastlog.5.gz OLD_FILES+=usr/share/man/man5/utmp.5.gz OLD_FILES+=usr/share/man/man5/wtmp.5.gz OLD_LIBS+=lib/libutil.so.8 -OLB_LIBS+=usr/lib32/libutil.so.8 +OLD_LIBS+=usr/lib32/libutil.so.8 # 20100105: new userland semaphore implementation OLD_FILES+=usr/include/sys/semaphore.h # 20100103: ntptrace(8) removed @@ -579,6 +617,7 @@ OLD_LIBS+=lib/libipx.so.4 OLD_LIBS+=lib/libkiconv.so.3 OLD_LIBS+=lib/libkvm.so.4 OLD_LIBS+=lib/libmd.so.4 +OLD_LIBS+=lib/libmd.so.5 OLD_LIBS+=lib/libncurses.so.7 OLD_LIBS+=lib/libncursesw.so.7 OLD_LIBS+=lib/libnvpair.so.1 diff --git a/UPDATING b/UPDATING index 89021c5015b..7fdb630fb72 100644 --- a/UPDATING +++ b/UPDATING @@ -24,6 +24,23 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 10.x IS SLOW: disable the most expensive debugging functionality run "ln -s 'abort:false,junk:false' /etc/malloc.conf".) +20120628: + The sort utility has been replaced with BSD sort. For now, GNU sort + is also available as "gnusort" or the default can be set back to + GNU sort by setting WITH_GNU_SORT. In this case, BSD sort will be + installed as "bsdsort". + +20120611: + A new version of ZFS (pool version 5000) has been merged to -HEAD. + Starting with this version the old system of ZFS pool versioning + is superseded by "feature flags". This concept enables forward + compatibility against certain future changes in functionality of ZFS + pools. The first read-only compatible "feature flag" for ZFS pools + is named "com.delphix:async_destroy". For more information + read the new zpool-features(5) manual page. + Please refer to the "ZFS notes" section of this file for information + on upgrading boot ZFS pools. + 20120417: The malloc(3) implementation embedded in libc now uses sources imported as contrib/jemalloc. The most disruptive API change is to diff --git a/bin/ed/Makefile b/bin/ed/Makefile index 5a7e37de104..7c39e54bdf4 100644 --- a/bin/ed/Makefile +++ b/bin/ed/Makefile @@ -7,12 +7,12 @@ SRCS= buf.c cbc.c glbl.c io.c main.c re.c sub.c undo.c LINKS= ${BINDIR}/ed ${BINDIR}/red MLINKS= ed.1 red.1 -.if !defined(RELEASE_CRUNCH) -.if ${MK_OPENSSL} != "no" +.if !defined(RELEASE_CRUNCH) && \ + ${MK_OPENSSL} != "no" && \ + ${MK_ED_CRYPTO} != "no" CFLAGS+=-DDES DPADD= ${LIBCRYPTO} LDADD= -lcrypto .endif -.endif .include diff --git a/bin/expr/expr.1 b/bin/expr/expr.1 index 4550edbacad..34be0b8fa9d 100644 --- a/bin/expr/expr.1 +++ b/bin/expr/expr.1 @@ -77,7 +77,7 @@ Operators with equal precedence are grouped within symbols and .Ql } . .Bl -tag -width indent -.It Ar expr1 Li | Ar expr2 +.It Ar expr1 Li \&| Ar expr2 Return the evaluation of .Ar expr1 if it is neither an empty string nor zero; diff --git a/bin/expr/expr.y b/bin/expr/expr.y index 30704ed2818..1856ec84d0f 100644 --- a/bin/expr/expr.y +++ b/bin/expr/expr.y @@ -74,7 +74,6 @@ int to_integer(struct val *); void to_string(struct val *); int yyerror(const char *); int yylex(void); -int yyparse(void); %} diff --git a/bin/kenv/kenv.1 b/bin/kenv/kenv.1 index b31802bd054..ac6e4b9b27d 100644 --- a/bin/kenv/kenv.1 +++ b/bin/kenv/kenv.1 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 13, 2009 +.Dd May 11, 2012 .Dt KENV 1 .Os .Sh NAME @@ -32,9 +32,9 @@ .Nd dump or modify the kernel environment .Sh SYNOPSIS .Nm -.Op Fl hq +.Op Fl hNq .Nm -.Op Fl q +.Op Fl qv .Ar variable Ns Op = Ns Ar value .Nm .Op Fl q @@ -54,6 +54,11 @@ name is specified, .Nm will only report that value. If the +.Fl N +option is specified, +.Nm +will only display variable names and not their values. +If the .Fl u option is specified, .Nm @@ -68,6 +73,13 @@ If the option is set, warnings normally printed as a result of being unable to perform the requested operation will be suppressed. .Pp +If the +.Fl v +option is set, the variable name will be printed out for the +environment variable in addition to the value when +.Nm +is executed with a variable name. +.Pp Variables can be added to the kernel environment using the .Pa /boot/loader.conf file, or also statically compiled into the kernel using the statement diff --git a/bin/kenv/kenv.c b/bin/kenv/kenv.c index 6c59b2cdce9..5ba9a5e413f 100644 --- a/bin/kenv/kenv.c +++ b/bin/kenv/kenv.c @@ -42,15 +42,17 @@ static int ksetenv(char *, char *); static int kunsetenv(char *); static int hflag = 0; +static int Nflag = 0; static int qflag = 0; static int uflag = 0; +static int vflag = 0; static void usage(void) { (void)fprintf(stderr, "%s\n%s\n%s\n", - "usage: kenv [-hq]", - " kenv [-q] variable[=value]", + "usage: kenv [-hNq]", + " kenv [-qv] variable[=value]", " kenv [-q] -u variable"); exit(1); } @@ -64,17 +66,23 @@ main(int argc, char **argv) error = 0; val = NULL; env = NULL; - while ((ch = getopt(argc, argv, "hqu")) != -1) { + while ((ch = getopt(argc, argv, "hNquv")) != -1) { switch (ch) { case 'h': hflag++; break; + case 'N': + Nflag++; + break; case 'q': qflag++; break; case 'u': uflag++; break; + case 'v': + vflag++; + break; default: usage(); } @@ -91,9 +99,9 @@ main(int argc, char **argv) argv++; argc--; } - if (hflag && (env != NULL)) + if ((hflag || Nflag) && env != NULL) usage(); - if ((argc > 0) || (uflag && (env == NULL))) + if (argc > 0 || ((uflag || vflag) && env == NULL)) usage(); if (env == NULL) { error = kdumpenv(); @@ -152,7 +160,10 @@ kdumpenv(void) if (cp == NULL) continue; *cp++ = '\0'; - printf("%s=\"%s\"\n", buf, cp); + if (Nflag) + printf("%s\n", buf); + else + printf("%s=\"%s\"\n", buf, cp); buf = cp; } return (0); @@ -167,7 +178,10 @@ kgetenv(char *env) ret = kenv(KENV_GET, env, buf, sizeof(buf)); if (ret == -1) return (ret); - printf("%s\n", buf); + if (vflag) + printf("%s=\"%s\"\n", env, buf); + else + printf("%s\n", buf); return (0); } diff --git a/bin/ls/Makefile b/bin/ls/Makefile index 2af1203b1d3..4d02a7ec94a 100644 --- a/bin/ls/Makefile +++ b/bin/ls/Makefile @@ -1,12 +1,15 @@ # @(#)Makefile 8.1 (Berkeley) 6/2/93 # $FreeBSD$ +.include + PROG= ls SRCS= cmp.c ls.c print.c util.c DPADD= ${LIBUTIL} LDADD= -lutil -.if !defined(RELEASE_CRUNCH) +.if !defined(RELEASE_CRUNCH) && \ + ${MK_LS_COLORS} != no CFLAGS+= -DCOLORLS DPADD+= ${LIBTERMCAP} LDADD+= -ltermcap diff --git a/bin/ps/keyword.c b/bin/ps/keyword.c index 17ca0d87c51..6c380e8b8f1 100644 --- a/bin/ps/keyword.c +++ b/bin/ps/keyword.c @@ -76,6 +76,7 @@ static VAR var[] = { {"comm", "COMMAND", NULL, LJUST, ucomm, 0, CHAR, NULL, 0}, {"command", "COMMAND", NULL, COMM|LJUST|USER, command, 0, CHAR, NULL, 0}, + {"cow", "COW", NULL, 0, kvar, KOFF(ki_cow), UINT, "u", 0}, {"cpu", "CPU", NULL, 0, kvar, KOFF(ki_estcpu), UINT, "d", 0}, {"cputime", "", "time", 0, NULL, 0, CHAR, NULL, 0}, {"egid", "", "gid", 0, NULL, 0, CHAR, NULL, 0}, diff --git a/bin/ps/ps.1 b/bin/ps/ps.1 index 59f29ee4ba6..d1627f640cd 100644 --- a/bin/ps/ps.1 +++ b/bin/ps/ps.1 @@ -29,7 +29,7 @@ .\" @(#)ps.1 8.3 (Berkeley) 4/18/94 .\" $FreeBSD$ .\" -.Dd March 8, 2012 +.Dd May 20, 2012 .Dt PS 1 .Os .Sh NAME @@ -496,6 +496,8 @@ login class command .It Cm command command and arguments +.It Cm cow +number of copy-on-write faults .It Cm cpu short-term CPU usage factor (for scheduling) .It Cm emul diff --git a/bin/rcp/rcp.1 b/bin/rcp/rcp.1 index f3c3a8edd33..71bdab9887f 100644 --- a/bin/rcp/rcp.1 +++ b/bin/rcp/rcp.1 @@ -116,17 +116,11 @@ The .Nm utility handles third party copies, where neither source nor target files are on the current machine. -.Sh FILES -.Bl -tag -width ".Pa /etc/auth.conf" -compact -.It Pa /etc/auth.conf -configure authentication services -.El .Sh SEE ALSO .Xr cp 1 , .Xr ftp 1 , .Xr rlogin 1 , .Xr rsh 1 , -.Xr auth.conf 5 , .Xr hosts.equiv 5 .Sh HISTORY The diff --git a/bin/rcp/rcp.c b/bin/rcp/rcp.c index 4577b208f04..33577054095 100644 --- a/bin/rcp/rcp.c +++ b/bin/rcp/rcp.c @@ -61,7 +61,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/bin/rm/rm.c b/bin/rm/rm.c index 3c2ba61b3c5..6575a8de891 100644 --- a/bin/rm/rm.c +++ b/bin/rm/rm.c @@ -301,10 +301,16 @@ rm_tree(char **argv) if (fflag) continue; /* FALLTHROUGH */ - default: + + case FTS_F: + case FTS_NSOK: if (Pflag) - if (!rm_overwrite(p->fts_accpath, NULL)) + if (!rm_overwrite(p->fts_accpath, p->fts_info == + FTS_NSOK ? NULL : p->fts_statp)) continue; + /* FALLTHROUGH */ + + default: rval = unlink(p->fts_accpath); if (rval == 0 || (fflag && errno == ENOENT)) { if (rval == 0 && vflag) @@ -408,7 +414,7 @@ rm_file(char **argv) int rm_overwrite(char *file, struct stat *sbp) { - struct stat sb; + struct stat sb, sb2; struct statfs fsb; off_t len; int bsize, fd, wlen; @@ -427,8 +433,15 @@ rm_overwrite(char *file, struct stat *sbp) file, sbp->st_ino); return (0); } - if ((fd = open(file, O_WRONLY, 0)) == -1) + if ((fd = open(file, O_WRONLY|O_NONBLOCK|O_NOFOLLOW, 0)) == -1) goto err; + if (fstat(fd, &sb2)) + goto err; + if (sb2.st_dev != sbp->st_dev || sb2.st_ino != sbp->st_ino || + !S_ISREG(sb2.st_mode)) { + errno = EPERM; + goto err; + } if (fstatfs(fd, &fsb) == -1) goto err; bsize = MAX(fsb.f_iosize, 1024); diff --git a/bin/sh/Makefile b/bin/sh/Makefile index afca8a332af..cc04aa42db5 100644 --- a/bin/sh/Makefile +++ b/bin/sh/Makefile @@ -38,7 +38,7 @@ build-tools: mkinit mknodes mksyntax .ORDER: builtins.c builtins.h builtins.c builtins.h: mkbuiltins builtins.def - cd ${.CURDIR}; sh mkbuiltins ${.OBJDIR} + sh ${.CURDIR}/mkbuiltins ${.CURDIR} init.c: mkinit alias.c eval.c exec.c input.c jobs.c options.c parser.c \ redir.c trap.c var.c diff --git a/bin/sh/miscbltin.c b/bin/sh/miscbltin.c index fce13b5c147..f602177552a 100644 --- a/bin/sh/miscbltin.c +++ b/bin/sh/miscbltin.c @@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include "shell.h" #include "options.h" diff --git a/bin/sh/mkbuiltins b/bin/sh/mkbuiltins index 49af058461c..1be7ff14908 100755 --- a/bin/sh/mkbuiltins +++ b/bin/sh/mkbuiltins @@ -35,17 +35,17 @@ # $FreeBSD$ temp=`/usr/bin/mktemp -t ka` -havejobs=0 -if grep '^#define[ ]*JOBS[ ]*1' shell.h > /dev/null -then havejobs=1 -fi havehist=1 if [ "X$1" = "X-h" ]; then havehist=0 shift fi -objdir=$1 -exec > ${objdir}/builtins.c +srcdir=$1 +havejobs=0 +if grep '^#define[ ]*JOBS[ ]*1' $srcdir/shell.h > /dev/null +then havejobs=1 +fi +exec > builtins.c cat <<\! /* * This file was generated by the mkbuiltins program. @@ -57,7 +57,7 @@ cat <<\! ! awk '/^[^#]/ {if(('$havejobs' || $2 != "-j") && ('$havehist' || $2 != "-h")) \ - print $0}' builtins.def | sed 's/-[hj]//' > $temp + print $0}' $srcdir/builtins.def | sed 's/-[hj]//' > $temp echo 'int (*const builtinfunc[])(int, char **) = {' awk '/^[^#]/ { printf "\t%s,\n", $1}' $temp echo '}; @@ -74,7 +74,7 @@ awk '{ for (i = 2 ; i <= NF ; i++) { echo ' { NULL, 0, 0 } };' -exec > ${objdir}/builtins.h +exec > builtins.h cat <<\! /* * This file was generated by the mkbuiltins program. diff --git a/bin/sh/sh.1 b/bin/sh/sh.1 index 92fa35257de..34b6b2b8969 100644 --- a/bin/sh/sh.1 +++ b/bin/sh/sh.1 @@ -375,8 +375,8 @@ The following is a list of valid operators: .Bl -tag -width indent .It Control operators: .Bl -column "XXX" "XXX" "XXX" "XXX" "XXX" -offset center -compact -.It Li & Ta Li && Ta Li ( Ta Li ) Ta Li \en -.It Li ;; Ta Li ;& Ta Li ; Ta Li | Ta Li || +.It Li & Ta Li && Ta Li \&( Ta Li \&) Ta Li \en +.It Li ;; Ta Li ;& Ta Li \&; Ta Li \&| Ta Li || .El .It Redirection operators: .Bl -column "XXX" "XXX" "XXX" "XXX" "XXX" -offset center -compact diff --git a/bin/test/test.1 b/bin/test/test.1 index 5815b1255de..d73f794b0c2 100644 --- a/bin/test/test.1 +++ b/bin/test/test.1 @@ -43,7 +43,7 @@ .Nm .Ar expression .Nm \&[ -.Ar expression Cm ] +.Ar expression Cm \&] .Sh DESCRIPTION The .Nm diff --git a/bin/uuidgen/uuidgen.1 b/bin/uuidgen/uuidgen.1 index 58dff699cec..f793fb248cd 100644 --- a/bin/uuidgen/uuidgen.1 +++ b/bin/uuidgen/uuidgen.1 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 7, 2005 +.Dd May 23, 2012 .Dt UUIDGEN 1 .Os .Sh NAME @@ -52,8 +52,11 @@ instructs to not generate them in batch, but one at a time. .It Fl n This option controls the number of identifiers generated. -By default, multiple -identifiers are generated in batch. +By default, multiple identifiers are generated in batch. +The upper hard limit is 2048 +.Po see +.Xr uuidgen 2 +.Pc . .It Fl o Redirect output to .Ar filename diff --git a/cddl/compat/opensolaris/include/stdlib.h b/cddl/compat/opensolaris/include/stdlib.h index 4e21ea6280a..9ba32322c03 100644 --- a/cddl/compat/opensolaris/include/stdlib.h +++ b/cddl/compat/opensolaris/include/stdlib.h @@ -27,11 +27,11 @@ * */ +#include_next + #ifndef _COMPAT_OPENSOLARIS_STDLIB_H_ #define _COMPAT_OPENSOLARIS_STDLIB_H_ -#include_next - #define getexecname getprogname #endif diff --git a/cddl/compat/opensolaris/misc/deviceid.c b/cddl/compat/opensolaris/misc/deviceid.c index e67d94aad50..9f3ea8458b3 100644 --- a/cddl/compat/opensolaris/misc/deviceid.c +++ b/cddl/compat/opensolaris/misc/deviceid.c @@ -45,7 +45,7 @@ devid_str_decode(char *devidstr, ddi_devid_t *retdevid, char **retminor_name) return (EINVAL); } *retminor_name = strdup(""); - if (*retminor_name == NULL); + if (*retminor_name == NULL) return (ENOMEM); return (0); } diff --git a/cddl/contrib/dtracetoolkit/Apps/Readme b/cddl/contrib/dtracetoolkit/Apps/Readme new file mode 100644 index 00000000000..3a6812f4bfa --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Apps/Readme @@ -0,0 +1,5 @@ +Apps - Specific Application based analysis + + These are DTrace scripts that are written to analyse a particular + application or applictaion layer protocol. For example, Apache or NFS + scripts would appear here. diff --git a/cddl/contrib/dtracetoolkit/Apps/httpdstat.d b/cddl/contrib/dtracetoolkit/Apps/httpdstat.d new file mode 100755 index 00000000000..a053482a6c1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Apps/httpdstat.d @@ -0,0 +1,132 @@ +#!/usr/sbin/dtrace -s +/* + * httpdstat.d - realtime httpd statistics. Uses DTrace. + * + * $Id: httpdstat.d 2 2007-08-01 10:01:43Z brendan $ + * + * USAGE: httpdstat.d [interval [count]] + * + * interval seconds + * count number of samples + * + * FIELDS: + * TIME Time, string + * NUM Number of connections + * GET Number of "GET"s + * POST Number of "POST"s + * HEAD Number of "HEAD"s + * TRACE Number of "TRACE"s + * + * All of the statistics are printed as a value per interval (not per second). + * + * NOTE: This version does not process subsequent operations on keepalives. + * + * IDEA: Ryan Matteson (who first wrote a solution to this). + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 20-Nov-2005 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option defaultargs + +inline int SCREEN = 21; + +/* + * Program Start + */ +dtrace:::BEGIN +{ + num = 0; get = 0; head = 0; post = 0; trac = 0; + lines = SCREEN + 1; + secs = $1 ? $1 : 1; + counts = $2 ? $2 : -1; + first = 1; +} + +profile:::tick-1sec +{ + secs--; +} + +/* + * Print Header + */ +dtrace:::BEGIN, +profile:::tick-1sec +/first || (secs == 0 && lines > SCREEN)/ +{ + printf("%-20s %6s %6s %5s %5s %5s\n", "TIME", + "NUM", "GET", "POST", "HEAD", "TRACE"); + lines = 0; + first = 0; +} + +/* + * Track Accept Events + */ +syscall::accept:return +/execname == "httpd"/ +{ + self->buf = 1; +} + +syscall::read:entry +/self->buf/ +{ + self->buf = arg1; +} + +/* + * Tally Data + */ +syscall::read:return +/self->buf && arg0/ +{ + this->str = (char *)copyin(self->buf, arg0); + this->str[4] = '\0'; + get += stringof(this->str) == "GET " ? 1 : 0; + post += stringof(this->str) == "POST" ? 1 : 0; + head += stringof(this->str) == "HEAD" ? 1 : 0; + trac += stringof(this->str) == "TRAC" ? 1 : 0; + num++; + self->buf = 0; +} + +/* + * Print Output + */ +profile:::tick-1sec +/secs == 0/ +{ + printf("%-20Y %6d %6d %5d %5d %5d\n", walltimestamp, + num, get, post, head, trac); + num = 0; get = 0; head = 0; post = 0; trac = 0; + secs = $1 ? $1 : 1; + lines++; + counts--; +} + +/* + * End + */ +profile:::tick-1sec +/counts == 0/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Apps/nfswizard.d b/cddl/contrib/dtracetoolkit/Apps/nfswizard.d new file mode 100755 index 00000000000..c63bc33dfa4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Apps/nfswizard.d @@ -0,0 +1,102 @@ +#!/usr/sbin/dtrace -s +/* + * nfswizard.d - nfs client activity wizard. + * Written using DTrace (Solaris 10 3/05). + * + * This examines activity caused by NFS client processes on the same server + * that you are running this script on. A detailed report is generated + * to explain various details of NFS client activity, including response + * times and file access. + * + * $Id: nfswizard.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: nfswizard.d # hit Ctrl-C to end sample + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 02-Dec-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); + scriptstart = walltimestamp; + timestart = timestamp; +} + +io:nfs::start +{ + /* tally file sizes */ + @file[args[2]->fi_pathname] = sum(args[0]->b_bcount); + + /* time response */ + start[args[0]->b_addr] = timestamp; + + /* overall stats */ + @rbytes = sum(args[0]->b_flags & B_READ ? args[0]->b_bcount : 0); + @wbytes = sum(args[0]->b_flags & B_READ ? 0 : args[0]->b_bcount); + @events = count(); +} + +io:nfs::done +/start[args[0]->b_addr]/ +{ + /* calculate and save response time stats */ + this->elapsed = timestamp - start[args[0]->b_addr]; + @maxtime = max(this->elapsed); + @avgtime = avg(this->elapsed); + @qnztime = quantize(this->elapsed / 1000); +} + +dtrace:::END +{ + /* print header */ + printf("NFS Client Wizard. %Y -> %Y\n\n", scriptstart, walltimestamp); + + /* print read/write stats */ + printa("Read: %@d bytes ", @rbytes); + normalize(@rbytes, 1000000); + printa("(%@d Mb)\n", @rbytes); + printa("Write: %@d bytes ", @wbytes); + normalize(@wbytes, 1000000); + printa("(%@d Mb)\n\n", @wbytes); + + /* print throughput stats */ + denormalize(@rbytes); + normalize(@rbytes, (timestamp - timestart) / 1000000); + printa("Read: %@d Kb/sec\n", @rbytes); + denormalize(@wbytes); + normalize(@wbytes, (timestamp - timestart) / 1000000); + printa("Write: %@d Kb/sec\n\n", @wbytes); + + /* print time stats */ + printa("NFS I/O events: %@d\n", @events); + normalize(@avgtime, 1000000); + printa("Avg response time: %@d ms\n", @avgtime); + normalize(@maxtime, 1000000); + printa("Max response time: %@d ms\n\n", @maxtime); + printa("Response times (us):%@d\n", @qnztime); + + /* print file stats */ + printf("Top 25 files accessed (bytes):\n"); + printf(" %-64s %s\n", "PATHNAME", "BYTES"); + trunc(@file, 25); + printa(" %-64s %@d\n", @file); +} diff --git a/cddl/contrib/dtracetoolkit/Apps/shellsnoop b/cddl/contrib/dtracetoolkit/Apps/shellsnoop new file mode 100755 index 00000000000..95f42c04652 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Apps/shellsnoop @@ -0,0 +1,268 @@ +#!/usr/bin/sh +# +# shellsnoop - A program to print read/write details from shells, +# such as keystrokes and command outputs. +# Written using DTrace (Solaris 10 3/05). +# +# This program sounds somewhat dangerous (snooping keystrokes), but is +# no more so than /usr/bin/truss, and both need root or dtrace privileges to +# run. In fact, less dangerous, as we only print visible text (not password +# text, for example). Having said that, it goes without saying that this +# program shouldn't be used for breeching privacy of other users. +# +# This was written as a tool to demonstrate the capabilities of DTrace. +# +# $Id: shellsnoop 19 2007-09-12 07:47:59Z brendan $ +# +# USAGE: shellsnoop [-hqsv] [-p PID] [-u UID] +# +# -q # quiet, only print data +# -s # include start time, us +# -v # include start time, string +# -p PID # process ID to snoop +# -u UID # user ID to snoop +# eg, +# shellsnoop # default output +# shellsnoop -v # human readable timestamps +# shellsnoop -p 1892 # snoop this PID only +# shellsnoop -qp 1892 # watch this PID data only +# +# FIELDS: +# UID User ID +# PID process ID +# PPID parent process ID +# COMM command name +# DIR direction (R read, W write) +# TEXT text contained in the read/write +# TIME timestamp for the command, us +# STRTIME timestamp for the command, string +# +# SEE ALSO: ttywatcher +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 28-Mar-2004 Brendan Gregg Created this. +# 21-Jan-2005 " " Wrapped in sh to provide options. +# 30-Nov-2005 " " Fixed trailing buffer text bug. +# 30-Nov-2005 " " Fixed sh no keystroke text in quiet bug. +# 30-Nov-2005 " " Last update. +# + + +############################## +# --- Process Arguments --- +# +opt_pid=0; opt_uid=0; opt_time=0; opt_timestr=0; opt_quiet=0; opt_debug=0 +filter=0; pid=0; uid=0 + +while getopts dhp:qsu:v name +do + case $name in + d) opt_debug=1 ;; + p) opt_pid=1; pid=$OPTARG ;; + q) opt_quiet=1 ;; + s) opt_time=1 ;; + u) opt_uid=1; uid=$OPTARG ;; + v) opt_timestr=1 ;; + h|?) cat <<-END >&2 + USAGE: shellsnoop [-hqsv] [-p PID] [-u UID] + shellsnoop # default output + -q # quiet, only print data + -s # include start time, us + -v # include start time, string + -p PID # process ID to snoop + -u UID # user ID to snoop + END + exit 1 + esac +done + +if [ $opt_quiet -eq 1 ]; then + opt_time=0; opt_timestr=0 +fi +if [ $opt_pid -eq 1 -o $opt_uid -eq 1 ]; then + filter=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_debug = '$opt_debug'; + inline int OPT_quiet = '$opt_quiet'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_uid = '$opt_uid'; + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int FILTER = '$filter'; + inline int PID = '$pid'; + inline int UID = '$uid'; + + #pragma D option quiet + #pragma D option switchrate=20hz + + /* + * Print header + */ + dtrace:::BEGIN /OPT_time == 1/ + { + printf("%-14s ","TIME"); + } + dtrace:::BEGIN /OPT_timestr == 1/ + { + printf("%-20s ","STRTIME"); + } + dtrace:::BEGIN /OPT_quiet == 0/ + { + printf("%5s %5s %8s %3s %s\n", "PID", "PPID", "CMD", "DIR", "TEXT"); + } + + /* + * Remember this PID is a shell child + */ + syscall::exec:entry, syscall::exece:entry + /execname == "sh" || execname == "ksh" || execname == "csh" || + execname == "tcsh" || execname == "zsh" || execname == "bash"/ + { + child[pid] = 1; + + /* debug */ + this->parent = (char *)curthread->t_procp->p_parent->p_user.u_comm; + OPT_debug == 1 ? printf("PID %d CMD %s started. (%s)\n", + pid, execname, stringof(this->parent)) : 1; + } + syscall::exec:entry, syscall::exece:entry + /(OPT_pid == 1 && PID != ppid) || (OPT_uid == 1 && UID != uid)/ + { + /* forget if filtered */ + child[pid] = 0; + } + + /* + * Print shell keystrokes + */ + syscall::write:entry, syscall::read:entry + /(execname == "sh" || execname == "ksh" || execname == "csh" || + execname == "tcsh" || execname == "zsh" || execname == "bash") + && (arg0 >= 0 && arg0 <= 2)/ + { + self->buf = arg1; + } + syscall::write:entry, syscall::read:entry + /(OPT_pid == 1 && PID != pid) || (OPT_uid == 1 && UID != uid)/ + { + self->buf = 0; + } + syscall::write:return, syscall::read:return + /self->buf && child[pid] == 0 && OPT_time == 1/ + { + printf("%-14d ", timestamp/1000); + } + syscall::write:return, syscall::read:return + /self->buf && child[pid] == 0 && OPT_timestr == 1/ + { + printf("%-20Y ", walltimestamp); + } + syscall::write:return, syscall::read:return + /self->buf && child[pid] == 0 && OPT_quiet == 0/ + { + this->text = (char *)copyin(self->buf, arg0); + this->text[arg0] = '\'\\0\''; + + printf("%5d %5d %8s %3s %s\n", pid, curpsinfo->pr_ppid, execname, + probefunc == "read" ? "R" : "W", stringof(this->text)); + } + syscall::write:return + /self->buf && child[pid] == 0 && OPT_quiet == 1/ + { + this->text = (char *)copyin(self->buf, arg0); + this->text[arg0] = '\'\\0\''; + printf("%s", stringof(this->text)); + } + syscall::read:return + /self->buf && execname == "sh" && child[pid] == 0 && OPT_quiet == 1/ + { + this->text = (char *)copyin(self->buf, arg0); + this->text[arg0] = '\'\\0\''; + printf("%s", stringof(this->text)); + } + syscall::write:return, syscall::read:return + /self->buf && child[pid] == 0/ + { + self->buf = 0; + } + + /* + * Print command output + */ + syscall::write:entry, syscall::read:entry + /child[pid] == 1 && (arg0 == 1 || arg0 == 2)/ + { + self->buf = arg1; + } + syscall::write:return, syscall::read:return + /self->buf && OPT_time == 1/ + { + printf("%-14d ", timestamp/1000); + } + syscall::write:return, syscall::read:return + /self->buf && OPT_timestr == 1/ + { + printf("%-20Y ", walltimestamp); + } + syscall::write:return, syscall::read:return + /self->buf && OPT_quiet == 0/ + { + this->text = (char *)copyin(self->buf, arg0); + this->text[arg0] = '\'\\0\''; + + printf("%5d %5d %8s %3s %s", pid, curpsinfo->pr_ppid, execname, + probefunc == "read" ? "R" : "W", stringof(this->text)); + + /* here we check if a newline is needed */ + this->length = strlen(this->text); + printf("%s", this->text[this->length - 1] == '\'\\n\'' ? "" : "\n"); + self->buf = 0; + } + syscall::write:return, syscall::read:return + /self->buf && OPT_quiet == 1/ + { + this->text = (char *)copyin(self->buf, arg0); + this->text[arg0] = '\'\\0\''; + printf("%s", stringof(this->text)); + self->buf = 0; + } + + /* + * Cleanup + */ + syscall::rexit:entry + { + child[pid] = 0; + + /* debug */ + this->parent = (char *)curthread->t_procp->p_parent->p_user.u_comm; + OPT_debug == 1 ? printf("PID %d CMD %s exited. (%s)\n", + pid, execname, stringof(this->parent)) : 1; + } +' diff --git a/cddl/contrib/dtracetoolkit/Apps/weblatency.d b/cddl/contrib/dtracetoolkit/Apps/weblatency.d new file mode 100755 index 00000000000..8d96d5cdd88 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Apps/weblatency.d @@ -0,0 +1,186 @@ +#!/usr/sbin/dtrace -s +/* + * weblatency.d - website latency statistics. + * Written using DTrace (Solaris 10 3/05). + * + * $Id: weblatency.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: weblatency.d # hit Ctrl-C to end sample + * + * See the code below for the "BROWSER" variable, which sets the browser + * to trace (currently set to "mozilla-bin"). + * + * This is written as an experimental tool, and may not work at all with + * your browser. + * + * FIELDS: + * HOST Hostname from URL + * NUM Number of GETs + * AVGTIME(ms) Average time for response, ms + * MAXTIME(ms) Maximum time for response, ms + * + * NOTE: + * + * The latency measured here is from the browser sending the GET + * request to when the browser begins to recieve the response. It + * is an overall response time for the client, and encompasses + * connection speed delays, DNS lookups, proxy delays, and web server + * response time. + * + * IDEA: Bryan Cantrill (who wrote an elegant version for Sol 10 update 1) + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * ToDo: + * Check write fd for socket, not file. + * + * 30-Nov-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +/* browser's execname */ +inline string BROWSER = "mozilla-bin"; + +/* maximum expected hostname length + "GET http://" */ +inline int MAX_REQ = 64; + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +/* + * Trace brower request + * + * This is achieved by matching writes for the browser's execname that + * start with "GET", and then timing from the return of the write to + * the return of the next read in the same thread. Various stateful flags + * are used: self->fd, self->read. + * + * For performance reasons, I'd like to only process writes that follow a + * connect(), however this approach fails to process keepalives. + */ +syscall::write:entry +/execname == BROWSER/ +{ + self->buf = arg1; + self->fd = arg0 + 1; + self->nam = ""; +} + +syscall::write:return +/self->fd/ +{ + this->str = (char *)copyin(self->buf, MAX_REQ); + this->str[4] = '\0'; + self->fd = stringof(this->str) == "GET " ? self->fd : 0; +} + +syscall::write:return +/self->fd/ +{ + /* fetch browser request */ + this->str = (char *)copyin(self->buf, MAX_REQ); + this->str[MAX_REQ] = '\0'; + + /* + * This unrolled loop strips down a URL to it's hostname. + * We ought to use strtok(), but it's not available on Sol 10 3/05, + * so instead I used dirname(). It's not pretty - it's done so that + * this works on all Sol 10 versions. + */ + self->req = stringof(this->str); + self->nam = strlen(self->req) > 15 ? self->req : self->nam; + self->req = dirname(self->req); + self->nam = strlen(self->req) > 15 ? self->req : self->nam; + self->req = dirname(self->req); + self->nam = strlen(self->req) > 15 ? self->req : self->nam; + self->req = dirname(self->req); + self->nam = strlen(self->req) > 15 ? self->req : self->nam; + self->req = dirname(self->req); + self->nam = strlen(self->req) > 15 ? self->req : self->nam; + self->req = dirname(self->req); + self->nam = strlen(self->req) > 15 ? self->req : self->nam; + self->req = dirname(self->req); + self->nam = strlen(self->req) > 15 ? self->req : self->nam; + self->req = dirname(self->req); + self->nam = strlen(self->req) > 15 ? self->req : self->nam; + self->req = dirname(self->req); + self->nam = strlen(self->req) > 15 ? self->req : self->nam; + self->nam = basename(self->nam); + + /* start the timer */ + start[pid, self->fd - 1] = timestamp; + host[pid, self->fd - 1] = self->nam; + self->buf = 0; + self->fd = 0; + self->req = 0; + self->nam = 0; +} + +/* this one wasn't a GET */ +syscall::write:return +/self->buf/ +{ + self->buf = 0; + self->fd = 0; +} + +syscall::read:entry +/execname == BROWSER && start[pid, arg0]/ +{ + self->fd = arg0 + 1; +} + +/* + * Record host details + */ +syscall::read:return +/self->fd/ +{ + /* fetch details */ + self->host = stringof(host[pid, self->fd - 1]); + this->start = start[pid, self->fd - 1]; + + /* save details */ + @Avg[self->host] = avg((timestamp - this->start)/1000000); + @Max[self->host] = max((timestamp - this->start)/1000000); + @Num[self->host] = count(); + + /* clear vars */ + start[pid, self->fd - 1] = 0; + host[pid, self->fd - 1] = 0; + self->host = 0; + self->fd = 0; +} + +/* + * Output report + */ +dtrace:::END +{ + printf("%-32s %11s\n", "HOST", "NUM"); + printa("%-32s %@11d\n", @Num); + + printf("\n%-32s %11s\n", "HOST", "AVGTIME(ms)"); + printa("%-32s %@11d\n", @Avg); + + printf("\n%-32s %11s\n", "HOST", "MAXTIME(ms)"); + printa("%-32s %@11d\n", @Max); +} diff --git a/cddl/contrib/dtracetoolkit/Bin/anonpgpid.d b/cddl/contrib/dtracetoolkit/Bin/anonpgpid.d new file mode 120000 index 00000000000..f48a5104fc6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/anonpgpid.d @@ -0,0 +1 @@ +../Mem/anonpgpid.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/bitesize.d b/cddl/contrib/dtracetoolkit/Bin/bitesize.d new file mode 120000 index 00000000000..6f984e083f9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/bitesize.d @@ -0,0 +1 @@ +../Disk/bitesize.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/connections b/cddl/contrib/dtracetoolkit/Bin/connections new file mode 120000 index 00000000000..1be9a640e58 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/connections @@ -0,0 +1 @@ +../Net/connections \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/cpudists b/cddl/contrib/dtracetoolkit/Bin/cpudists new file mode 120000 index 00000000000..91f0d802296 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/cpudists @@ -0,0 +1 @@ +../Kernel/cpudists \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/cputimes b/cddl/contrib/dtracetoolkit/Bin/cputimes new file mode 120000 index 00000000000..219dbbc6ca6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/cputimes @@ -0,0 +1 @@ +../Kernel/cputimes \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/cputypes.d b/cddl/contrib/dtracetoolkit/Bin/cputypes.d new file mode 120000 index 00000000000..da583feb485 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/cputypes.d @@ -0,0 +1 @@ +../Cpu/cputypes.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/cpuwalk.d b/cddl/contrib/dtracetoolkit/Bin/cpuwalk.d new file mode 120000 index 00000000000..5a1c26e74bf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/cpuwalk.d @@ -0,0 +1 @@ +../Cpu/cpuwalk.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/crash.d b/cddl/contrib/dtracetoolkit/Bin/crash.d new file mode 120000 index 00000000000..d3a3cf8c78d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/crash.d @@ -0,0 +1 @@ +../Proc/crash.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/creatbyproc.d b/cddl/contrib/dtracetoolkit/Bin/creatbyproc.d new file mode 120000 index 00000000000..fecd0f32021 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/creatbyproc.d @@ -0,0 +1 @@ +../Proc/creatbyproc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/cswstat.d b/cddl/contrib/dtracetoolkit/Bin/cswstat.d new file mode 120000 index 00000000000..ea54280e10a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/cswstat.d @@ -0,0 +1 @@ +../Kernel/cswstat.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dappprof b/cddl/contrib/dtracetoolkit/Bin/dappprof new file mode 120000 index 00000000000..e4fc32ef565 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dappprof @@ -0,0 +1 @@ +../Proc/dappprof \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dapptrace b/cddl/contrib/dtracetoolkit/Bin/dapptrace new file mode 120000 index 00000000000..1d38cb5ee7c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dapptrace @@ -0,0 +1 @@ +../Proc/dapptrace \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dexplorer b/cddl/contrib/dtracetoolkit/Bin/dexplorer new file mode 120000 index 00000000000..41c36e49bd9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dexplorer @@ -0,0 +1 @@ +../dexplorer \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/diskhits b/cddl/contrib/dtracetoolkit/Bin/diskhits new file mode 120000 index 00000000000..4a57310d933 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/diskhits @@ -0,0 +1 @@ +../Disk/diskhits \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dispqlen.d b/cddl/contrib/dtracetoolkit/Bin/dispqlen.d new file mode 120000 index 00000000000..1073e0b863f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dispqlen.d @@ -0,0 +1 @@ +../Cpu/dispqlen.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dnlcps.d b/cddl/contrib/dtracetoolkit/Bin/dnlcps.d new file mode 120000 index 00000000000..efca13ceaf4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dnlcps.d @@ -0,0 +1 @@ +../Kernel/dnlcps.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dnlcsnoop.d b/cddl/contrib/dtracetoolkit/Bin/dnlcsnoop.d new file mode 120000 index 00000000000..247868728e0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dnlcsnoop.d @@ -0,0 +1 @@ +../Kernel/dnlcsnoop.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dnlcstat b/cddl/contrib/dtracetoolkit/Bin/dnlcstat new file mode 120000 index 00000000000..baec1890545 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dnlcstat @@ -0,0 +1 @@ +../Kernel/dnlcstat \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dtruss b/cddl/contrib/dtracetoolkit/Bin/dtruss new file mode 120000 index 00000000000..90c00c6fe12 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dtruss @@ -0,0 +1 @@ +../dtruss \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dvmstat b/cddl/contrib/dtracetoolkit/Bin/dvmstat new file mode 120000 index 00000000000..1b92321f0d4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dvmstat @@ -0,0 +1 @@ +../dvmstat \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/errinfo b/cddl/contrib/dtracetoolkit/Bin/errinfo new file mode 120000 index 00000000000..fbecf4da7e2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/errinfo @@ -0,0 +1 @@ +../errinfo \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/execsnoop b/cddl/contrib/dtracetoolkit/Bin/execsnoop new file mode 120000 index 00000000000..3a0dde2b1d5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/execsnoop @@ -0,0 +1 @@ +../execsnoop \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/fddist b/cddl/contrib/dtracetoolkit/Bin/fddist new file mode 120000 index 00000000000..11d6e20f371 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/fddist @@ -0,0 +1 @@ +../Proc/fddist \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/filebyproc.d b/cddl/contrib/dtracetoolkit/Bin/filebyproc.d new file mode 120000 index 00000000000..5c2b2c596a7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/filebyproc.d @@ -0,0 +1 @@ +../Proc/filebyproc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/fspaging.d b/cddl/contrib/dtracetoolkit/Bin/fspaging.d new file mode 120000 index 00000000000..54db157bb48 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/fspaging.d @@ -0,0 +1 @@ +../FS/fspaging.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/fsrw.d b/cddl/contrib/dtracetoolkit/Bin/fsrw.d new file mode 120000 index 00000000000..829e583e25b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/fsrw.d @@ -0,0 +1 @@ +../FS/fsrw.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/guess.d b/cddl/contrib/dtracetoolkit/Bin/guess.d new file mode 120000 index 00000000000..b5a41fdf9de --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/guess.d @@ -0,0 +1 @@ +../Misc/guess.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/hotkernel b/cddl/contrib/dtracetoolkit/Bin/hotkernel new file mode 120000 index 00000000000..0b872c32e98 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/hotkernel @@ -0,0 +1 @@ +../hotkernel \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/hotspot.d b/cddl/contrib/dtracetoolkit/Bin/hotspot.d new file mode 120000 index 00000000000..dad526acd3f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/hotspot.d @@ -0,0 +1 @@ +../Disk/hotspot.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/hotuser b/cddl/contrib/dtracetoolkit/Bin/hotuser new file mode 120000 index 00000000000..4ff615e9c28 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/hotuser @@ -0,0 +1 @@ +../hotuser \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/httpdstat.d b/cddl/contrib/dtracetoolkit/Bin/httpdstat.d new file mode 120000 index 00000000000..5d8900d5aa2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/httpdstat.d @@ -0,0 +1 @@ +../Apps/httpdstat.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/icmpstat.d b/cddl/contrib/dtracetoolkit/Bin/icmpstat.d new file mode 120000 index 00000000000..1d63bb75875 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/icmpstat.d @@ -0,0 +1 @@ +../Net/icmpstat.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/intbycpu.d b/cddl/contrib/dtracetoolkit/Bin/intbycpu.d new file mode 120000 index 00000000000..4897057d693 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/intbycpu.d @@ -0,0 +1 @@ +../Cpu/intbycpu.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/intoncpu.d b/cddl/contrib/dtracetoolkit/Bin/intoncpu.d new file mode 120000 index 00000000000..814c7be06da --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/intoncpu.d @@ -0,0 +1 @@ +../Cpu/intoncpu.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/inttimes.d b/cddl/contrib/dtracetoolkit/Bin/inttimes.d new file mode 120000 index 00000000000..5b179eecfe3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/inttimes.d @@ -0,0 +1 @@ +../Cpu/inttimes.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/iofile.d b/cddl/contrib/dtracetoolkit/Bin/iofile.d new file mode 120000 index 00000000000..8c63c162646 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/iofile.d @@ -0,0 +1 @@ +../Disk/iofile.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/iofileb.d b/cddl/contrib/dtracetoolkit/Bin/iofileb.d new file mode 120000 index 00000000000..7d6d404ad0c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/iofileb.d @@ -0,0 +1 @@ +../Disk/iofileb.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/iopattern b/cddl/contrib/dtracetoolkit/Bin/iopattern new file mode 120000 index 00000000000..0257e0f83f0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/iopattern @@ -0,0 +1 @@ +../iopattern \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/iopending b/cddl/contrib/dtracetoolkit/Bin/iopending new file mode 120000 index 00000000000..6ba93282352 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/iopending @@ -0,0 +1 @@ +../Disk/iopending \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/iosnoop b/cddl/contrib/dtracetoolkit/Bin/iosnoop new file mode 120000 index 00000000000..2b86bcb70f6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/iosnoop @@ -0,0 +1 @@ +../iosnoop \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/iotop b/cddl/contrib/dtracetoolkit/Bin/iotop new file mode 120000 index 00000000000..14c124b300c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/iotop @@ -0,0 +1 @@ +../iotop \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_calldist.d b/cddl/contrib/dtracetoolkit/Bin/j_calldist.d new file mode 120000 index 00000000000..3d40bca1308 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_calldist.d @@ -0,0 +1 @@ +../Java/j_calldist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_calls.d b/cddl/contrib/dtracetoolkit/Bin/j_calls.d new file mode 120000 index 00000000000..81ddfc590d2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_calls.d @@ -0,0 +1 @@ +../Java/j_calls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_calltime.d b/cddl/contrib/dtracetoolkit/Bin/j_calltime.d new file mode 120000 index 00000000000..5261cabcb91 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_calltime.d @@ -0,0 +1 @@ +../Java/j_calltime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_classflow.d b/cddl/contrib/dtracetoolkit/Bin/j_classflow.d new file mode 120000 index 00000000000..e6fb86ad014 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_classflow.d @@ -0,0 +1 @@ +../Java/j_classflow.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/j_cpudist.d new file mode 120000 index 00000000000..22f9adf86a0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_cpudist.d @@ -0,0 +1 @@ +../Java/j_cpudist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_cputime.d b/cddl/contrib/dtracetoolkit/Bin/j_cputime.d new file mode 120000 index 00000000000..bfb68436607 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_cputime.d @@ -0,0 +1 @@ +../Java/j_cputime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_events.d b/cddl/contrib/dtracetoolkit/Bin/j_events.d new file mode 120000 index 00000000000..385456118aa --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_events.d @@ -0,0 +1 @@ +../Java/j_events.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_flow.d b/cddl/contrib/dtracetoolkit/Bin/j_flow.d new file mode 120000 index 00000000000..852a740c83b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_flow.d @@ -0,0 +1 @@ +../Java/j_flow.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/j_flowtime.d new file mode 120000 index 00000000000..c0f9faeed01 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_flowtime.d @@ -0,0 +1 @@ +../Java/j_flowtime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_methodcalls.d b/cddl/contrib/dtracetoolkit/Bin/j_methodcalls.d new file mode 120000 index 00000000000..9e5e17f4328 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_methodcalls.d @@ -0,0 +1 @@ +../Java/j_methodcalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_objnew.d b/cddl/contrib/dtracetoolkit/Bin/j_objnew.d new file mode 120000 index 00000000000..b91ddafd2cb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_objnew.d @@ -0,0 +1 @@ +../Java/j_objnew.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_package.d b/cddl/contrib/dtracetoolkit/Bin/j_package.d new file mode 120000 index 00000000000..7627671107c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_package.d @@ -0,0 +1 @@ +../Java/j_package.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_profile.d b/cddl/contrib/dtracetoolkit/Bin/j_profile.d new file mode 120000 index 00000000000..270532ca797 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_profile.d @@ -0,0 +1 @@ +../Java/j_profile.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_stat.d b/cddl/contrib/dtracetoolkit/Bin/j_stat.d new file mode 120000 index 00000000000..128f913603f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_stat.d @@ -0,0 +1 @@ +../Java/j_stat.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/j_syscalls.d new file mode 120000 index 00000000000..fae39687ab5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_syscalls.d @@ -0,0 +1 @@ +../Java/j_syscalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/j_syscolors.d new file mode 120000 index 00000000000..4acffad372b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_syscolors.d @@ -0,0 +1 @@ +../Java/j_syscolors.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_thread.d b/cddl/contrib/dtracetoolkit/Bin/j_thread.d new file mode 120000 index 00000000000..f88296ce202 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_thread.d @@ -0,0 +1 @@ +../Java/j_thread.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_who.d b/cddl/contrib/dtracetoolkit/Bin/j_who.d new file mode 120000 index 00000000000..f2aba284055 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_who.d @@ -0,0 +1 @@ +../Java/j_who.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_calldist.d b/cddl/contrib/dtracetoolkit/Bin/js_calldist.d new file mode 120000 index 00000000000..93277b09ba6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_calldist.d @@ -0,0 +1 @@ +../JavaScript/js_calldist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_calls.d b/cddl/contrib/dtracetoolkit/Bin/js_calls.d new file mode 120000 index 00000000000..9c27755e5f7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_calls.d @@ -0,0 +1 @@ +../JavaScript/js_calls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_calltime.d b/cddl/contrib/dtracetoolkit/Bin/js_calltime.d new file mode 120000 index 00000000000..6ec2eedd737 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_calltime.d @@ -0,0 +1 @@ +../JavaScript/js_calltime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/js_cpudist.d new file mode 120000 index 00000000000..2d0c07ab537 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_cpudist.d @@ -0,0 +1 @@ +../JavaScript/js_cpudist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_cputime.d b/cddl/contrib/dtracetoolkit/Bin/js_cputime.d new file mode 120000 index 00000000000..1c5c716a3b1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_cputime.d @@ -0,0 +1 @@ +../JavaScript/js_cputime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_execs.d b/cddl/contrib/dtracetoolkit/Bin/js_execs.d new file mode 120000 index 00000000000..2f5c4a6861f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_execs.d @@ -0,0 +1 @@ +../JavaScript/js_execs.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_flow.d b/cddl/contrib/dtracetoolkit/Bin/js_flow.d new file mode 120000 index 00000000000..ea2f3e78fab --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_flow.d @@ -0,0 +1 @@ +../JavaScript/js_flow.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_flowinfo.d b/cddl/contrib/dtracetoolkit/Bin/js_flowinfo.d new file mode 120000 index 00000000000..0edb8bd84ac --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_flowinfo.d @@ -0,0 +1 @@ +../JavaScript/js_flowinfo.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/js_flowtime.d new file mode 120000 index 00000000000..cec488cbfe9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_flowtime.d @@ -0,0 +1 @@ +../JavaScript/js_flowtime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_objcpu.d b/cddl/contrib/dtracetoolkit/Bin/js_objcpu.d new file mode 120000 index 00000000000..51aacf53ef0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_objcpu.d @@ -0,0 +1 @@ +../JavaScript/js_objcpu.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_objgc.d b/cddl/contrib/dtracetoolkit/Bin/js_objgc.d new file mode 120000 index 00000000000..06f84602208 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_objgc.d @@ -0,0 +1 @@ +../JavaScript/js_objgc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_objnew.d b/cddl/contrib/dtracetoolkit/Bin/js_objnew.d new file mode 120000 index 00000000000..1a7fc16abac --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_objnew.d @@ -0,0 +1 @@ +../JavaScript/js_objnew.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_stat.d b/cddl/contrib/dtracetoolkit/Bin/js_stat.d new file mode 120000 index 00000000000..b2bc6da5871 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_stat.d @@ -0,0 +1 @@ +../JavaScript/js_stat.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_who.d b/cddl/contrib/dtracetoolkit/Bin/js_who.d new file mode 120000 index 00000000000..40bea74dbd1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_who.d @@ -0,0 +1 @@ +../JavaScript/js_who.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/kill.d b/cddl/contrib/dtracetoolkit/Bin/kill.d new file mode 120000 index 00000000000..d8c4a73c0d5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/kill.d @@ -0,0 +1 @@ +../Proc/kill.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/kstat_types.d b/cddl/contrib/dtracetoolkit/Bin/kstat_types.d new file mode 120000 index 00000000000..156079c0e12 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/kstat_types.d @@ -0,0 +1 @@ +../Kernel/kstat_types.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/lastwords b/cddl/contrib/dtracetoolkit/Bin/lastwords new file mode 120000 index 00000000000..54fc3ae2cb8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/lastwords @@ -0,0 +1 @@ +../Proc/lastwords \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/loads.d b/cddl/contrib/dtracetoolkit/Bin/loads.d new file mode 120000 index 00000000000..842dd94cce0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/loads.d @@ -0,0 +1 @@ +../Cpu/loads.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/lockbydist.d b/cddl/contrib/dtracetoolkit/Bin/lockbydist.d new file mode 120000 index 00000000000..5e9b4a51ea7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/lockbydist.d @@ -0,0 +1 @@ +../Locks/lockbydist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/lockbyproc.d b/cddl/contrib/dtracetoolkit/Bin/lockbyproc.d new file mode 120000 index 00000000000..d16d9412107 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/lockbyproc.d @@ -0,0 +1 @@ +../Locks/lockbyproc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/minfbypid.d b/cddl/contrib/dtracetoolkit/Bin/minfbypid.d new file mode 120000 index 00000000000..b8ccf800e54 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/minfbypid.d @@ -0,0 +1 @@ +../Mem/minfbypid.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/minfbyproc.d b/cddl/contrib/dtracetoolkit/Bin/minfbyproc.d new file mode 120000 index 00000000000..95532033551 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/minfbyproc.d @@ -0,0 +1 @@ +../Mem/minfbyproc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/mmapfiles.d b/cddl/contrib/dtracetoolkit/Bin/mmapfiles.d new file mode 120000 index 00000000000..728fd755187 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/mmapfiles.d @@ -0,0 +1 @@ +../Proc/mmapfiles.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/modcalls.d b/cddl/contrib/dtracetoolkit/Bin/modcalls.d new file mode 120000 index 00000000000..fe49549de23 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/modcalls.d @@ -0,0 +1 @@ +../Kernel/modcalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/newproc.d b/cddl/contrib/dtracetoolkit/Bin/newproc.d new file mode 120000 index 00000000000..9387784fc71 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/newproc.d @@ -0,0 +1 @@ +../Proc/newproc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/nfswizard.d b/cddl/contrib/dtracetoolkit/Bin/nfswizard.d new file mode 120000 index 00000000000..ddc19d2f804 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/nfswizard.d @@ -0,0 +1 @@ +../Apps/nfswizard.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/opensnoop b/cddl/contrib/dtracetoolkit/Bin/opensnoop new file mode 120000 index 00000000000..3fcae851448 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/opensnoop @@ -0,0 +1 @@ +../opensnoop \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pathopens.d b/cddl/contrib/dtracetoolkit/Bin/pathopens.d new file mode 120000 index 00000000000..21c28a5017b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pathopens.d @@ -0,0 +1 @@ +../Proc/pathopens.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pfilestat b/cddl/contrib/dtracetoolkit/Bin/pfilestat new file mode 120000 index 00000000000..333765ff98d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pfilestat @@ -0,0 +1 @@ +../Proc/pfilestat \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pgpginbypid.d b/cddl/contrib/dtracetoolkit/Bin/pgpginbypid.d new file mode 120000 index 00000000000..cfa2d799f0b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pgpginbypid.d @@ -0,0 +1 @@ +../Mem/pgpginbypid.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pgpginbyproc.d b/cddl/contrib/dtracetoolkit/Bin/pgpginbyproc.d new file mode 120000 index 00000000000..4e9a8b754f5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pgpginbyproc.d @@ -0,0 +1 @@ +../Mem/pgpginbyproc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_calldist.d b/cddl/contrib/dtracetoolkit/Bin/php_calldist.d new file mode 120000 index 00000000000..5ac4b43e2f7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_calldist.d @@ -0,0 +1 @@ +../Php/php_calldist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_calltime.d b/cddl/contrib/dtracetoolkit/Bin/php_calltime.d new file mode 120000 index 00000000000..49fb14b78cd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_calltime.d @@ -0,0 +1 @@ +../Php/php_calltime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/php_cpudist.d new file mode 120000 index 00000000000..6e6595e00e1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_cpudist.d @@ -0,0 +1 @@ +../Php/php_cpudist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_cputime.d b/cddl/contrib/dtracetoolkit/Bin/php_cputime.d new file mode 120000 index 00000000000..3e8ccb942b0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_cputime.d @@ -0,0 +1 @@ +../Php/php_cputime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_flow.d b/cddl/contrib/dtracetoolkit/Bin/php_flow.d new file mode 120000 index 00000000000..fa86f75a0bb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_flow.d @@ -0,0 +1 @@ +../Php/php_flow.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_flowinfo.d b/cddl/contrib/dtracetoolkit/Bin/php_flowinfo.d new file mode 120000 index 00000000000..52ef64b7f45 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_flowinfo.d @@ -0,0 +1 @@ +../Php/php_flowinfo.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/php_flowtime.d new file mode 120000 index 00000000000..67dbe844b30 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_flowtime.d @@ -0,0 +1 @@ +../Php/php_flowtime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_funccalls.d b/cddl/contrib/dtracetoolkit/Bin/php_funccalls.d new file mode 120000 index 00000000000..2ba056bfe5e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_funccalls.d @@ -0,0 +1 @@ +../Php/php_funccalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_malloc.d b/cddl/contrib/dtracetoolkit/Bin/php_malloc.d new file mode 120000 index 00000000000..9c51d8344eb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_malloc.d @@ -0,0 +1 @@ +../Php/php_malloc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/php_syscalls.d new file mode 120000 index 00000000000..6587c4e1c38 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_syscalls.d @@ -0,0 +1 @@ +../Php/php_syscalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/php_syscolors.d new file mode 120000 index 00000000000..463f287a412 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_syscolors.d @@ -0,0 +1 @@ +../Php/php_syscolors.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_who.d b/cddl/contrib/dtracetoolkit/Bin/php_who.d new file mode 120000 index 00000000000..31d6acfd577 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_who.d @@ -0,0 +1 @@ +../Php/php_who.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pidpersec.d b/cddl/contrib/dtracetoolkit/Bin/pidpersec.d new file mode 120000 index 00000000000..2ec6eb14514 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pidpersec.d @@ -0,0 +1 @@ +../Proc/pidpersec.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_calldist.d b/cddl/contrib/dtracetoolkit/Bin/pl_calldist.d new file mode 120000 index 00000000000..d5ef923a267 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_calldist.d @@ -0,0 +1 @@ +../Perl/pl_calldist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_calltime.d b/cddl/contrib/dtracetoolkit/Bin/pl_calltime.d new file mode 120000 index 00000000000..38986ec85b6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_calltime.d @@ -0,0 +1 @@ +../Perl/pl_calltime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/pl_cpudist.d new file mode 120000 index 00000000000..ce4703602d0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_cpudist.d @@ -0,0 +1 @@ +../Perl/pl_cpudist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_cputime.d b/cddl/contrib/dtracetoolkit/Bin/pl_cputime.d new file mode 120000 index 00000000000..66ea2f7867f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_cputime.d @@ -0,0 +1 @@ +../Perl/pl_cputime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_flow.d b/cddl/contrib/dtracetoolkit/Bin/pl_flow.d new file mode 120000 index 00000000000..b5d566e1e13 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_flow.d @@ -0,0 +1 @@ +../Perl/pl_flow.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_flowinfo.d b/cddl/contrib/dtracetoolkit/Bin/pl_flowinfo.d new file mode 120000 index 00000000000..ad53e51a6c7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_flowinfo.d @@ -0,0 +1 @@ +../Perl/pl_flowinfo.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/pl_flowtime.d new file mode 120000 index 00000000000..89bee37932e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_flowtime.d @@ -0,0 +1 @@ +../Perl/pl_flowtime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_malloc.d b/cddl/contrib/dtracetoolkit/Bin/pl_malloc.d new file mode 120000 index 00000000000..025e4ef92f4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_malloc.d @@ -0,0 +1 @@ +../Perl/pl_malloc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_subcalls.d b/cddl/contrib/dtracetoolkit/Bin/pl_subcalls.d new file mode 120000 index 00000000000..350f8c12055 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_subcalls.d @@ -0,0 +1 @@ +../Perl/pl_subcalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/pl_syscalls.d new file mode 120000 index 00000000000..a1ab6e5e939 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_syscalls.d @@ -0,0 +1 @@ +../Perl/pl_syscalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/pl_syscolors.d new file mode 120000 index 00000000000..ebc087f4e4a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_syscolors.d @@ -0,0 +1 @@ +../Perl/pl_syscolors.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_who.d b/cddl/contrib/dtracetoolkit/Bin/pl_who.d new file mode 120000 index 00000000000..398de670a22 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_who.d @@ -0,0 +1 @@ +../Perl/pl_who.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/priclass.d b/cddl/contrib/dtracetoolkit/Bin/priclass.d new file mode 120000 index 00000000000..09cd160a737 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/priclass.d @@ -0,0 +1 @@ +../Kernel/priclass.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pridist.d b/cddl/contrib/dtracetoolkit/Bin/pridist.d new file mode 120000 index 00000000000..3c25cbdd35d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pridist.d @@ -0,0 +1 @@ +../Kernel/pridist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/procsystime b/cddl/contrib/dtracetoolkit/Bin/procsystime new file mode 120000 index 00000000000..891c2a1d2f0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/procsystime @@ -0,0 +1 @@ +../procsystime \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/putnexts.d b/cddl/contrib/dtracetoolkit/Bin/putnexts.d new file mode 120000 index 00000000000..23cba6e4653 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/putnexts.d @@ -0,0 +1 @@ +../Kernel/putnexts.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_calldist.d b/cddl/contrib/dtracetoolkit/Bin/py_calldist.d new file mode 120000 index 00000000000..4a007c54fff --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_calldist.d @@ -0,0 +1 @@ +../Python/py_calldist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_calltime.d b/cddl/contrib/dtracetoolkit/Bin/py_calltime.d new file mode 120000 index 00000000000..6f1c400aba0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_calltime.d @@ -0,0 +1 @@ +../Python/py_calltime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/py_cpudist.d new file mode 120000 index 00000000000..76ce8db570a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_cpudist.d @@ -0,0 +1 @@ +../Python/py_cpudist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_cputime.d b/cddl/contrib/dtracetoolkit/Bin/py_cputime.d new file mode 120000 index 00000000000..d11dd87ac40 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_cputime.d @@ -0,0 +1 @@ +../Python/py_cputime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_flow.d b/cddl/contrib/dtracetoolkit/Bin/py_flow.d new file mode 120000 index 00000000000..bf1485aff77 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_flow.d @@ -0,0 +1 @@ +../Python/py_flow.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_flowinfo.d b/cddl/contrib/dtracetoolkit/Bin/py_flowinfo.d new file mode 120000 index 00000000000..adc61149920 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_flowinfo.d @@ -0,0 +1 @@ +../Python/py_flowinfo.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/py_flowtime.d new file mode 120000 index 00000000000..1ae51db26bf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_flowtime.d @@ -0,0 +1 @@ +../Python/py_flowtime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_funccalls.d b/cddl/contrib/dtracetoolkit/Bin/py_funccalls.d new file mode 120000 index 00000000000..81015120f6a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_funccalls.d @@ -0,0 +1 @@ +../Python/py_funccalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_malloc.d b/cddl/contrib/dtracetoolkit/Bin/py_malloc.d new file mode 120000 index 00000000000..ed37a3b0567 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_malloc.d @@ -0,0 +1 @@ +../Python/py_malloc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_mallocstk.d b/cddl/contrib/dtracetoolkit/Bin/py_mallocstk.d new file mode 120000 index 00000000000..d2bb1bbfc71 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_mallocstk.d @@ -0,0 +1 @@ +../Python/py_mallocstk.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_profile.d b/cddl/contrib/dtracetoolkit/Bin/py_profile.d new file mode 120000 index 00000000000..3eb72196f3f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_profile.d @@ -0,0 +1 @@ +../Python/py_profile.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/py_syscalls.d new file mode 120000 index 00000000000..ecf137c3140 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_syscalls.d @@ -0,0 +1 @@ +../Python/py_syscalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/py_syscolors.d new file mode 120000 index 00000000000..6781115d28a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_syscolors.d @@ -0,0 +1 @@ +../Python/py_syscolors.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_who.d b/cddl/contrib/dtracetoolkit/Bin/py_who.d new file mode 120000 index 00000000000..28db7e5f3e0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_who.d @@ -0,0 +1 @@ +../Python/py_who.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_calldist.d b/cddl/contrib/dtracetoolkit/Bin/rb_calldist.d new file mode 120000 index 00000000000..8067860713c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_calldist.d @@ -0,0 +1 @@ +../Ruby/rb_calldist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_calls.d b/cddl/contrib/dtracetoolkit/Bin/rb_calls.d new file mode 120000 index 00000000000..266bacb2bf1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_calls.d @@ -0,0 +1 @@ +../Ruby/rb_calls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_calltime.d b/cddl/contrib/dtracetoolkit/Bin/rb_calltime.d new file mode 120000 index 00000000000..f00df1a616b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_calltime.d @@ -0,0 +1 @@ +../Ruby/rb_calltime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/rb_cpudist.d new file mode 120000 index 00000000000..6e77cc33b7f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_cpudist.d @@ -0,0 +1 @@ +../Ruby/rb_cpudist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_cputime.d b/cddl/contrib/dtracetoolkit/Bin/rb_cputime.d new file mode 120000 index 00000000000..88d9138ef8f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_cputime.d @@ -0,0 +1 @@ +../Ruby/rb_cputime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_flow.d b/cddl/contrib/dtracetoolkit/Bin/rb_flow.d new file mode 120000 index 00000000000..1a0f490cde7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_flow.d @@ -0,0 +1 @@ +../Ruby/rb_flow.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_flowinfo.d b/cddl/contrib/dtracetoolkit/Bin/rb_flowinfo.d new file mode 120000 index 00000000000..b8130191c8f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_flowinfo.d @@ -0,0 +1 @@ +../Ruby/rb_flowinfo.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/rb_flowtime.d new file mode 120000 index 00000000000..911ea08907c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_flowtime.d @@ -0,0 +1 @@ +../Ruby/rb_flowtime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_funccalls.d b/cddl/contrib/dtracetoolkit/Bin/rb_funccalls.d new file mode 120000 index 00000000000..2a3ac9a4adc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_funccalls.d @@ -0,0 +1 @@ +../Ruby/rb_funccalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_lines.d b/cddl/contrib/dtracetoolkit/Bin/rb_lines.d new file mode 120000 index 00000000000..3447ccfedde --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_lines.d @@ -0,0 +1 @@ +../Ruby/rb_lines.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_malloc.d b/cddl/contrib/dtracetoolkit/Bin/rb_malloc.d new file mode 120000 index 00000000000..b3e2ba77de9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_malloc.d @@ -0,0 +1 @@ +../Ruby/rb_malloc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_objcpu.d b/cddl/contrib/dtracetoolkit/Bin/rb_objcpu.d new file mode 120000 index 00000000000..ac7d6a22403 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_objcpu.d @@ -0,0 +1 @@ +../Ruby/rb_objcpu.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_objnew.d b/cddl/contrib/dtracetoolkit/Bin/rb_objnew.d new file mode 120000 index 00000000000..ca7689888ea --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_objnew.d @@ -0,0 +1 @@ +../Ruby/rb_objnew.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_stat.d b/cddl/contrib/dtracetoolkit/Bin/rb_stat.d new file mode 120000 index 00000000000..7a0e2aef110 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_stat.d @@ -0,0 +1 @@ +../Ruby/rb_stat.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/rb_syscalls.d new file mode 120000 index 00000000000..1b15e57e464 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_syscalls.d @@ -0,0 +1 @@ +../Ruby/rb_syscalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/rb_syscolors.d new file mode 120000 index 00000000000..4fd3d6a0c42 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_syscolors.d @@ -0,0 +1 @@ +../Ruby/rb_syscolors.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_who.d b/cddl/contrib/dtracetoolkit/Bin/rb_who.d new file mode 120000 index 00000000000..effc0ce8221 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_who.d @@ -0,0 +1 @@ +../Ruby/rb_who.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/readbytes.d b/cddl/contrib/dtracetoolkit/Bin/readbytes.d new file mode 120000 index 00000000000..4b82f0ced66 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/readbytes.d @@ -0,0 +1 @@ +../Proc/readbytes.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/readdist.d b/cddl/contrib/dtracetoolkit/Bin/readdist.d new file mode 120000 index 00000000000..d73e49cec88 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/readdist.d @@ -0,0 +1 @@ +../Proc/readdist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rfileio.d b/cddl/contrib/dtracetoolkit/Bin/rfileio.d new file mode 120000 index 00000000000..a73a1bcfbfb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rfileio.d @@ -0,0 +1 @@ +../FS/rfileio.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rfsio.d b/cddl/contrib/dtracetoolkit/Bin/rfsio.d new file mode 120000 index 00000000000..2dcbe2cd149 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rfsio.d @@ -0,0 +1 @@ +../FS/rfsio.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/runocc.d b/cddl/contrib/dtracetoolkit/Bin/runocc.d new file mode 120000 index 00000000000..9b856b36629 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/runocc.d @@ -0,0 +1 @@ +../Cpu/runocc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rwbbypid.d b/cddl/contrib/dtracetoolkit/Bin/rwbbypid.d new file mode 120000 index 00000000000..be6540134d5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rwbbypid.d @@ -0,0 +1 @@ +../Proc/rwbbypid.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rwbypid.d b/cddl/contrib/dtracetoolkit/Bin/rwbypid.d new file mode 120000 index 00000000000..9dcec04b7b3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rwbypid.d @@ -0,0 +1 @@ +../Proc/rwbypid.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rwbytype.d b/cddl/contrib/dtracetoolkit/Bin/rwbytype.d new file mode 120000 index 00000000000..a02b48d0a46 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rwbytype.d @@ -0,0 +1 @@ +../Proc/rwbytype.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rwsnoop b/cddl/contrib/dtracetoolkit/Bin/rwsnoop new file mode 120000 index 00000000000..3398d039476 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rwsnoop @@ -0,0 +1 @@ +../rwsnoop \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rwtop b/cddl/contrib/dtracetoolkit/Bin/rwtop new file mode 120000 index 00000000000..64e421bd72a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rwtop @@ -0,0 +1 @@ +../rwtop \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sampleproc b/cddl/contrib/dtracetoolkit/Bin/sampleproc new file mode 120000 index 00000000000..7bdd2896b6f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sampleproc @@ -0,0 +1 @@ +../Proc/sampleproc \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sar-c.d b/cddl/contrib/dtracetoolkit/Bin/sar-c.d new file mode 120000 index 00000000000..9a222102578 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sar-c.d @@ -0,0 +1 @@ +../System/sar-c.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/seeksize.d b/cddl/contrib/dtracetoolkit/Bin/seeksize.d new file mode 120000 index 00000000000..3f853d79798 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/seeksize.d @@ -0,0 +1 @@ +../Disk/seeksize.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/setuids.d b/cddl/contrib/dtracetoolkit/Bin/setuids.d new file mode 120000 index 00000000000..43dbf8a7236 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/setuids.d @@ -0,0 +1 @@ +../User/setuids.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_calldist.d b/cddl/contrib/dtracetoolkit/Bin/sh_calldist.d new file mode 120000 index 00000000000..abc69280fe6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_calldist.d @@ -0,0 +1 @@ +../Shell/sh_calldist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_calls.d b/cddl/contrib/dtracetoolkit/Bin/sh_calls.d new file mode 120000 index 00000000000..2fa61317e21 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_calls.d @@ -0,0 +1 @@ +../Shell/sh_calls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_calltime.d b/cddl/contrib/dtracetoolkit/Bin/sh_calltime.d new file mode 120000 index 00000000000..35331d36160 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_calltime.d @@ -0,0 +1 @@ +../Shell/sh_calltime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/sh_cpudist.d new file mode 120000 index 00000000000..d2fd1ce9d9f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_cpudist.d @@ -0,0 +1 @@ +../Shell/sh_cpudist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_cputime.d b/cddl/contrib/dtracetoolkit/Bin/sh_cputime.d new file mode 120000 index 00000000000..7188fc50a32 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_cputime.d @@ -0,0 +1 @@ +../Shell/sh_cputime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_flow.d b/cddl/contrib/dtracetoolkit/Bin/sh_flow.d new file mode 120000 index 00000000000..fc02ecf3354 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_flow.d @@ -0,0 +1 @@ +../Shell/sh_flow.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_flowinfo.d b/cddl/contrib/dtracetoolkit/Bin/sh_flowinfo.d new file mode 120000 index 00000000000..10da77a9e07 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_flowinfo.d @@ -0,0 +1 @@ +../Shell/sh_flowinfo.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/sh_flowtime.d new file mode 120000 index 00000000000..c3c3cb8a0cf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_flowtime.d @@ -0,0 +1 @@ +../Shell/sh_flowtime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_lines.d b/cddl/contrib/dtracetoolkit/Bin/sh_lines.d new file mode 120000 index 00000000000..918890ebfb9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_lines.d @@ -0,0 +1 @@ +../Shell/sh_lines.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_pidcolors.d b/cddl/contrib/dtracetoolkit/Bin/sh_pidcolors.d new file mode 120000 index 00000000000..24ae0547116 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_pidcolors.d @@ -0,0 +1 @@ +../Shell/sh_pidcolors.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_stat.d b/cddl/contrib/dtracetoolkit/Bin/sh_stat.d new file mode 120000 index 00000000000..0dafd999b0e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_stat.d @@ -0,0 +1 @@ +../Shell/sh_stat.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/sh_syscalls.d new file mode 120000 index 00000000000..0402c76e8e0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_syscalls.d @@ -0,0 +1 @@ +../Shell/sh_syscalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/sh_syscolors.d new file mode 120000 index 00000000000..c79f8288352 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_syscolors.d @@ -0,0 +1 @@ +../Shell/sh_syscolors.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_wasted.d b/cddl/contrib/dtracetoolkit/Bin/sh_wasted.d new file mode 120000 index 00000000000..564fc98adfe --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_wasted.d @@ -0,0 +1 @@ +../Shell/sh_wasted.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_who.d b/cddl/contrib/dtracetoolkit/Bin/sh_who.d new file mode 120000 index 00000000000..ca00fab11e4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_who.d @@ -0,0 +1 @@ +../Shell/sh_who.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/shellsnoop b/cddl/contrib/dtracetoolkit/Bin/shellsnoop new file mode 120000 index 00000000000..84169abed06 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/shellsnoop @@ -0,0 +1 @@ +../Apps/shellsnoop \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/shortlived.d b/cddl/contrib/dtracetoolkit/Bin/shortlived.d new file mode 120000 index 00000000000..6c234cf6dc4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/shortlived.d @@ -0,0 +1 @@ +../Proc/shortlived.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sigdist.d b/cddl/contrib/dtracetoolkit/Bin/sigdist.d new file mode 120000 index 00000000000..838da268654 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sigdist.d @@ -0,0 +1 @@ +../Proc/sigdist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/stacksize.d b/cddl/contrib/dtracetoolkit/Bin/stacksize.d new file mode 120000 index 00000000000..cb6fec40bb7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/stacksize.d @@ -0,0 +1 @@ +../Proc/stacksize.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/statsnoop b/cddl/contrib/dtracetoolkit/Bin/statsnoop new file mode 120000 index 00000000000..445e361554a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/statsnoop @@ -0,0 +1 @@ +../statsnoop \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/swapinfo.d b/cddl/contrib/dtracetoolkit/Bin/swapinfo.d new file mode 120000 index 00000000000..e5cd10f7692 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/swapinfo.d @@ -0,0 +1 @@ +../Mem/swapinfo.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sysbypid.d b/cddl/contrib/dtracetoolkit/Bin/sysbypid.d new file mode 120000 index 00000000000..761ada95b82 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sysbypid.d @@ -0,0 +1 @@ +../Proc/sysbypid.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/syscallbypid.d b/cddl/contrib/dtracetoolkit/Bin/syscallbypid.d new file mode 120000 index 00000000000..eca83c7bf2d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/syscallbypid.d @@ -0,0 +1 @@ +../Proc/syscallbypid.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/syscallbyproc.d b/cddl/contrib/dtracetoolkit/Bin/syscallbyproc.d new file mode 120000 index 00000000000..0260655574b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/syscallbyproc.d @@ -0,0 +1 @@ +../Proc/syscallbyproc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/syscallbysysc.d b/cddl/contrib/dtracetoolkit/Bin/syscallbysysc.d new file mode 120000 index 00000000000..43258f1ebdc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/syscallbysysc.d @@ -0,0 +1 @@ +../System/syscallbysysc.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_calldist.d b/cddl/contrib/dtracetoolkit/Bin/tcl_calldist.d new file mode 120000 index 00000000000..6e3cf23de47 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_calldist.d @@ -0,0 +1 @@ +../Tcl/tcl_calldist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_calls.d b/cddl/contrib/dtracetoolkit/Bin/tcl_calls.d new file mode 120000 index 00000000000..3a48d0b3eda --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_calls.d @@ -0,0 +1 @@ +../Tcl/tcl_calls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_calltime.d b/cddl/contrib/dtracetoolkit/Bin/tcl_calltime.d new file mode 120000 index 00000000000..32cead5d1ed --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_calltime.d @@ -0,0 +1 @@ +../Tcl/tcl_calltime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/tcl_cpudist.d new file mode 120000 index 00000000000..1724115a9b6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_cpudist.d @@ -0,0 +1 @@ +../Tcl/tcl_cpudist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_cputime.d b/cddl/contrib/dtracetoolkit/Bin/tcl_cputime.d new file mode 120000 index 00000000000..e8269db5c87 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_cputime.d @@ -0,0 +1 @@ +../Tcl/tcl_cputime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_flow.d b/cddl/contrib/dtracetoolkit/Bin/tcl_flow.d new file mode 120000 index 00000000000..4f3e01f1654 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_flow.d @@ -0,0 +1 @@ +../Tcl/tcl_flow.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/tcl_flowtime.d new file mode 120000 index 00000000000..3664f7a1100 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_flowtime.d @@ -0,0 +1 @@ +../Tcl/tcl_flowtime.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_ins.d b/cddl/contrib/dtracetoolkit/Bin/tcl_ins.d new file mode 120000 index 00000000000..d7480340a0f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_ins.d @@ -0,0 +1 @@ +../Tcl/tcl_ins.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_insflow.d b/cddl/contrib/dtracetoolkit/Bin/tcl_insflow.d new file mode 120000 index 00000000000..9f716bda057 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_insflow.d @@ -0,0 +1 @@ +../Tcl/tcl_insflow.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_proccalls.d b/cddl/contrib/dtracetoolkit/Bin/tcl_proccalls.d new file mode 120000 index 00000000000..704e0b5cf20 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_proccalls.d @@ -0,0 +1 @@ +../Tcl/tcl_proccalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_procflow.d b/cddl/contrib/dtracetoolkit/Bin/tcl_procflow.d new file mode 120000 index 00000000000..51da9dcd15b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_procflow.d @@ -0,0 +1 @@ +../Tcl/tcl_procflow.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_stat.d b/cddl/contrib/dtracetoolkit/Bin/tcl_stat.d new file mode 120000 index 00000000000..7f9659a2e8c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_stat.d @@ -0,0 +1 @@ +../Tcl/tcl_stat.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/tcl_syscalls.d new file mode 120000 index 00000000000..aec76739ca2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_syscalls.d @@ -0,0 +1 @@ +../Tcl/tcl_syscalls.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/tcl_syscolors.d new file mode 120000 index 00000000000..890ea5ff3a2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_syscolors.d @@ -0,0 +1 @@ +../Tcl/tcl_syscolors.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_who.d b/cddl/contrib/dtracetoolkit/Bin/tcl_who.d new file mode 120000 index 00000000000..7917b5ed7ba --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_who.d @@ -0,0 +1 @@ +../Tcl/tcl_who.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcpsnoop b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop new file mode 120000 index 00000000000..7f7b37d4394 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop @@ -0,0 +1 @@ +../Net/tcpsnoop \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcpsnoop.d b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop.d new file mode 120000 index 00000000000..ad9ccf93a10 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop.d @@ -0,0 +1 @@ +../Net/tcpsnoop.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcpsnoop_snv b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop_snv new file mode 120000 index 00000000000..7ea5a09274d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop_snv @@ -0,0 +1 @@ +../Net/tcpsnoop_snv \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcpsnoop_snv.d b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop_snv.d new file mode 120000 index 00000000000..a2321e0d594 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop_snv.d @@ -0,0 +1 @@ +../Net/tcpsnoop_snv.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcpstat.d b/cddl/contrib/dtracetoolkit/Bin/tcpstat.d new file mode 120000 index 00000000000..176f0e32275 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcpstat.d @@ -0,0 +1 @@ +../Net/tcpstat.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcptop b/cddl/contrib/dtracetoolkit/Bin/tcptop new file mode 120000 index 00000000000..a97fec35930 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcptop @@ -0,0 +1 @@ +../Net/tcptop \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcptop_snv b/cddl/contrib/dtracetoolkit/Bin/tcptop_snv new file mode 120000 index 00000000000..ad75a7b7759 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcptop_snv @@ -0,0 +1 @@ +../Net/tcptop_snv \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcpwdist.d b/cddl/contrib/dtracetoolkit/Bin/tcpwdist.d new file mode 120000 index 00000000000..0be2a413977 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcpwdist.d @@ -0,0 +1 @@ +../Net/tcpwdist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/threaded.d b/cddl/contrib/dtracetoolkit/Bin/threaded.d new file mode 120000 index 00000000000..b9febd84799 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/threaded.d @@ -0,0 +1 @@ +../Proc/threaded.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/topsyscall b/cddl/contrib/dtracetoolkit/Bin/topsyscall new file mode 120000 index 00000000000..b9a2eec61fa --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/topsyscall @@ -0,0 +1 @@ +../System/topsyscall \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/topsysproc b/cddl/contrib/dtracetoolkit/Bin/topsysproc new file mode 120000 index 00000000000..d523f507cf9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/topsysproc @@ -0,0 +1 @@ +../Proc/topsysproc \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/udpstat.d b/cddl/contrib/dtracetoolkit/Bin/udpstat.d new file mode 120000 index 00000000000..11d0bca5f36 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/udpstat.d @@ -0,0 +1 @@ +../Net/udpstat.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/uname-a.d b/cddl/contrib/dtracetoolkit/Bin/uname-a.d new file mode 120000 index 00000000000..11251757f57 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/uname-a.d @@ -0,0 +1 @@ +../System/uname-a.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/vmbypid.d b/cddl/contrib/dtracetoolkit/Bin/vmbypid.d new file mode 120000 index 00000000000..16e5ac4edad --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/vmbypid.d @@ -0,0 +1 @@ +../Mem/vmbypid.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/vmstat-p.d b/cddl/contrib/dtracetoolkit/Bin/vmstat-p.d new file mode 120000 index 00000000000..a75e5a1b154 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/vmstat-p.d @@ -0,0 +1 @@ +../Mem/vmstat-p.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/vmstat.d b/cddl/contrib/dtracetoolkit/Bin/vmstat.d new file mode 120000 index 00000000000..395ba5f8085 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/vmstat.d @@ -0,0 +1 @@ +../Mem/vmstat.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/vopstat b/cddl/contrib/dtracetoolkit/Bin/vopstat new file mode 120000 index 00000000000..f38b57905d6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/vopstat @@ -0,0 +1 @@ +../FS/vopstat \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/weblatency.d b/cddl/contrib/dtracetoolkit/Bin/weblatency.d new file mode 120000 index 00000000000..c16bb2ee361 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/weblatency.d @@ -0,0 +1 @@ +../Apps/weblatency.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/whatexec.d b/cddl/contrib/dtracetoolkit/Bin/whatexec.d new file mode 120000 index 00000000000..660ff83826b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/whatexec.d @@ -0,0 +1 @@ +../Kernel/whatexec.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/woof.d b/cddl/contrib/dtracetoolkit/Bin/woof.d new file mode 120000 index 00000000000..a380d7c2f2c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/woof.d @@ -0,0 +1 @@ +../Misc/woof.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/wpm.d b/cddl/contrib/dtracetoolkit/Bin/wpm.d new file mode 120000 index 00000000000..fee9c99a1ef --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/wpm.d @@ -0,0 +1 @@ +../Misc/wpm.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/writebytes.d b/cddl/contrib/dtracetoolkit/Bin/writebytes.d new file mode 120000 index 00000000000..586cbd75ba8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/writebytes.d @@ -0,0 +1 @@ +../Proc/writebytes.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/writedist.d b/cddl/contrib/dtracetoolkit/Bin/writedist.d new file mode 120000 index 00000000000..3710f132fe1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/writedist.d @@ -0,0 +1 @@ +../Proc/writedist.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/xcallsbypid.d b/cddl/contrib/dtracetoolkit/Bin/xcallsbypid.d new file mode 120000 index 00000000000..08c7feca823 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/xcallsbypid.d @@ -0,0 +1 @@ +../Cpu/xcallsbypid.d \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/xvmstat b/cddl/contrib/dtracetoolkit/Bin/xvmstat new file mode 120000 index 00000000000..24008fbb467 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/xvmstat @@ -0,0 +1 @@ +../Mem/xvmstat \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/zvmstat b/cddl/contrib/dtracetoolkit/Bin/zvmstat new file mode 120000 index 00000000000..41c7dbbb31e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/zvmstat @@ -0,0 +1 @@ +../Zones/zvmstat \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Code/Java/Func_abc.java b/cddl/contrib/dtracetoolkit/Code/Java/Func_abc.java new file mode 100644 index 00000000000..c14012e4988 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Java/Func_abc.java @@ -0,0 +1,26 @@ +public class Func_abc { + public static void func_c() { + System.out.println("Function C"); + try { + Thread.currentThread().sleep(1000); + } catch (Exception e) { } + } + public static void func_b() { + System.out.println("Function B"); + try { + Thread.currentThread().sleep(1000); + } catch (Exception e) { } + func_c(); + } + public static void func_a() { + System.out.println("Function A"); + try { + Thread.currentThread().sleep(1000); + } catch (Exception e) { } + func_b(); + } + + public static void main(String[] args) { + func_a(); + } +} diff --git a/cddl/contrib/dtracetoolkit/Code/Java/Func_loop.java b/cddl/contrib/dtracetoolkit/Code/Java/Func_loop.java new file mode 100644 index 00000000000..81be852bb7f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Java/Func_loop.java @@ -0,0 +1,19 @@ +public class Func_loop { + public static void func_c() { + System.out.println("Function C"); + while (true) { + } + } + public static void func_b() { + System.out.println("Function B"); + func_c(); + } + public static void func_a() { + System.out.println("Function A"); + func_b(); + } + + public static void main(String[] args) { + func_a(); + } +} diff --git a/cddl/contrib/dtracetoolkit/Code/JavaScript/func_clock.html b/cddl/contrib/dtracetoolkit/Code/JavaScript/func_clock.html new file mode 100644 index 00000000000..c25610b30f2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/JavaScript/func_clock.html @@ -0,0 +1,39 @@ + + +func_clock, JavaScript + + + +
+ + diff --git a/cddl/contrib/dtracetoolkit/Code/JavaScript/func_slow.html b/cddl/contrib/dtracetoolkit/Code/JavaScript/func_slow.html new file mode 100644 index 00000000000..14fdfda3870 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/JavaScript/func_slow.html @@ -0,0 +1,31 @@ + +func_slow, JavaScript + + + + diff --git a/cddl/contrib/dtracetoolkit/Code/Perl/func_abc.pl b/cddl/contrib/dtracetoolkit/Code/Perl/func_abc.pl new file mode 100755 index 00000000000..394f1c2b245 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Perl/func_abc.pl @@ -0,0 +1,20 @@ +#!./perl -w + +sub func_c { + print "Function C\n"; + sleep 1; +} + +sub func_b { + print "Function B\n"; + sleep 1; + func_c(); +} + +sub func_a { + print "Function A\n"; + sleep 1; + func_b(); +} + +func_a(); diff --git a/cddl/contrib/dtracetoolkit/Code/Perl/func_malloc.pl b/cddl/contrib/dtracetoolkit/Code/Perl/func_malloc.pl new file mode 100755 index 00000000000..5340c82b2cd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Perl/func_malloc.pl @@ -0,0 +1,18 @@ +#!./perl -w + +sub func_c { + print "Function C\n"; +} + +sub func_b { + print "Function B\n"; + my $b = "B" x 100_000; + func_c(); +} + +sub func_a { + print "Function A\n"; + func_b(); +} + +func_a(); diff --git a/cddl/contrib/dtracetoolkit/Code/Perl/func_slow.pl b/cddl/contrib/dtracetoolkit/Code/Perl/func_slow.pl new file mode 100755 index 00000000000..f32d09ed9bf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Perl/func_slow.pl @@ -0,0 +1,20 @@ +#!./perl -w + +sub func_c { + print "Function C\n"; + for (my $i = 0; $i < 3000000; $i++) { my $j = $i + 1; } +} + +sub func_b { + print "Function B\n"; + for (my $i = 0; $i < 2000000; $i++) { my $j = $i + 1 ; } + func_c(); +} + +sub func_a { + print "Function A\n"; + for (my $i = 0; $i < 1000000; $i++) { my $j = $i + 1; } + func_b(); +} + +func_a(); diff --git a/cddl/contrib/dtracetoolkit/Code/Perl/hello.pl b/cddl/contrib/dtracetoolkit/Code/Perl/hello.pl new file mode 100755 index 00000000000..3ca70a2847c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Perl/hello.pl @@ -0,0 +1,3 @@ +#!./perl + +print "Hello World!\n"; diff --git a/cddl/contrib/dtracetoolkit/Code/Perl/hello_strict.pl b/cddl/contrib/dtracetoolkit/Code/Perl/hello_strict.pl new file mode 100755 index 00000000000..78003a97144 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Perl/hello_strict.pl @@ -0,0 +1,5 @@ +#!./perl -w + +use strict; + +print "Hello World!\n"; diff --git a/cddl/contrib/dtracetoolkit/Code/Php/func_abc.php b/cddl/contrib/dtracetoolkit/Code/Php/func_abc.php new file mode 100644 index 00000000000..91656115788 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Php/func_abc.php @@ -0,0 +1,23 @@ + diff --git a/cddl/contrib/dtracetoolkit/Code/Python/func_abc.py b/cddl/contrib/dtracetoolkit/Code/Python/func_abc.py new file mode 100755 index 00000000000..0d4919fb893 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Python/func_abc.py @@ -0,0 +1,19 @@ +#!/usr/bin/python + +import time + +def func_c(): + print "Function C" + time.sleep(1) + +def func_b(): + print "Function B" + time.sleep(1) + func_c() + +def func_a(): + print "Function A" + time.sleep(1) + func_b() + +func_a() diff --git a/cddl/contrib/dtracetoolkit/Code/Python/func_slow.py b/cddl/contrib/dtracetoolkit/Code/Python/func_slow.py new file mode 100755 index 00000000000..9cba9c5b120 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Python/func_slow.py @@ -0,0 +1,26 @@ +#!/usr/bin/python + +def func_c(): + print "Function C" + i = 0 + while (i < 3000000): + i = i + 1 + j = i + 1 + +def func_b(): + print "Function B" + i = 0 + while (i < 2000000): + i = i + 1 + j = i + 1 + func_c() + +def func_a(): + print "Function A" + i = 0 + while (i < 1000000): + i = i + 1 + j = i + 1 + func_b() + +func_a() diff --git a/cddl/contrib/dtracetoolkit/Code/Readme b/cddl/contrib/dtracetoolkit/Code/Readme new file mode 100644 index 00000000000..f8b16d79b7e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Readme @@ -0,0 +1,16 @@ +Code - Example Programs + + This directory contains example software sorted by language, which may + be used as the target for DTrace scripts. These examples are simple and + to the point, and are intended as example targets for when learing + DTrace. + + Some people attempt to learn DTrace by tracing their complex real + world application first. That's the hard way. Try these programs instead, + and once you are confident here, move onto harder targets. + + Some of these programs feature in the example files in the /Examples + directory. + + This directory does not contain DTrace scripts. + diff --git a/cddl/contrib/dtracetoolkit/Code/Ruby/func_abc.rb b/cddl/contrib/dtracetoolkit/Code/Ruby/func_abc.rb new file mode 100755 index 00000000000..75adaf9f7ff --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Ruby/func_abc.rb @@ -0,0 +1,20 @@ +#!./ruby -w + +def func_c + print "Function C\n" + sleep 1 +end + +def func_b + print "Function B\n" + sleep 1 + func_c +end + +def func_a + print "Function A\n" + sleep 1 + func_b +end + +func_a diff --git a/cddl/contrib/dtracetoolkit/Code/Ruby/func_slow.rb b/cddl/contrib/dtracetoolkit/Code/Ruby/func_slow.rb new file mode 100755 index 00000000000..87a498c6a3b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Ruby/func_slow.rb @@ -0,0 +1,32 @@ +#!./ruby -w + +def func_c + print "Function C\n" + i = 0 + while i < 300000 + i = i + 1 + j = i + 1 + end +end + +def func_b + print "Function B\n" + i = 0 + while i < 200000 + i = i + 1 + j = i + 1 + end + func_c +end + +def func_a + print "Function A\n" + i = 0 + while i < 100000 + i = i + 1 + j = i + 1 + end + func_b +end + +func_a diff --git a/cddl/contrib/dtracetoolkit/Code/Shell/func_abc.sh b/cddl/contrib/dtracetoolkit/Code/Shell/func_abc.sh new file mode 100755 index 00000000000..b44ce570ab9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Shell/func_abc.sh @@ -0,0 +1,23 @@ +#!./sh + +func_c() +{ + echo "Function C" + sleep 1 +} + +func_b() +{ + echo "Function B" + sleep 1 + func_c +} + +func_a() +{ + echo "Function A" + sleep 1 + func_b +} + +func_a diff --git a/cddl/contrib/dtracetoolkit/Code/Shell/func_slow.sh b/cddl/contrib/dtracetoolkit/Code/Shell/func_slow.sh new file mode 100755 index 00000000000..3407646f9c6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Shell/func_slow.sh @@ -0,0 +1,35 @@ +#!./sh + +func_c() +{ + echo "Function C" + i=0 + while [ $i -lt 300 ] + do + i=`expr $i + 1` + done +} + +func_b() +{ + echo "Function B" + i=0 + while [ $i -lt 200 ] + do + i=`expr $i + 1` + done + func_c +} + +func_a() +{ + echo "Function A" + i=0 + while [ $i -lt 100 ] + do + i=`expr $i + 1` + done + func_b +} + +func_a diff --git a/cddl/contrib/dtracetoolkit/Code/Shell/func_waste.sh b/cddl/contrib/dtracetoolkit/Code/Shell/func_waste.sh new file mode 100755 index 00000000000..bfeeecb4ef4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Shell/func_waste.sh @@ -0,0 +1,23 @@ +#!./sh + +func_c() +{ + /usr/bin/echo "Function C" + sleep 1 +} + +func_b() +{ + /usr/bin/echo "Function B" + sleep 1 + func_c +} + +func_a() +{ + /usr/bin/echo "Function A" + sleep 1 + func_b +} + +func_a diff --git a/cddl/contrib/dtracetoolkit/Code/Tcl/func_abc.tcl b/cddl/contrib/dtracetoolkit/Code/Tcl/func_abc.tcl new file mode 100644 index 00000000000..c84acb07488 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Tcl/func_abc.tcl @@ -0,0 +1,20 @@ +#!./tclsh + +proc func_c {} { + puts "Function C" + after 1000 +} + +proc func_b {} { + puts "Function B" + after 1000 + func_c +} + +proc func_a {} { + puts "Function A" + after 1000 + func_b +} + +func_a diff --git a/cddl/contrib/dtracetoolkit/Code/Tcl/func_slow.tcl b/cddl/contrib/dtracetoolkit/Code/Tcl/func_slow.tcl new file mode 100644 index 00000000000..d4fc5989468 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Tcl/func_slow.tcl @@ -0,0 +1,29 @@ +#!./tclsh + +proc func_c {} { + puts "Function C" + set i 0 + while {$i < 300000} { + set i [expr $i + 1] + } +} + +proc func_b {} { + puts "Function B" + set i 0 + while {$i < 200000} { + set i [expr $i + 1] + } + func_c +} + +proc func_a {} { + puts "Function A" + set i 0 + while {$i < 100000} { + set i [expr $i + 1] + } + func_b +} + +func_a diff --git a/cddl/contrib/dtracetoolkit/Cpu/Readme b/cddl/contrib/dtracetoolkit/Cpu/Readme new file mode 100644 index 00000000000..e0f8698c71b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Cpu/Readme @@ -0,0 +1,3 @@ +Cpu - CPU based analysis + + This would include activity by CPU. diff --git a/cddl/contrib/dtracetoolkit/Cpu/cputypes.d b/cddl/contrib/dtracetoolkit/Cpu/cputypes.d new file mode 100755 index 00000000000..213af9efa93 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Cpu/cputypes.d @@ -0,0 +1,66 @@ +#!/usr/sbin/dtrace -s +/* + * cputypes.d - list CPU type info. + * Written using DTrace (Solaris 10 3/05). + * + * $Id: cputypes.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: cputypes.d + * + * FIELDS: + * CPU CPU ID + * CHIP chip ID + * PSET processor set ID + * LGRP latency group ID + * CLOCK clock speed, MHz + * TYPE CPU type + * FPU floating point identifier types + * + * SEE ALSO: psrinfo(1M) + * /usr/include/sys/processor.h + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 27-Jun-2005 Brendan Gregg Created this. + * 27-Jun-2005 " " Last update. + */ + +#pragma D option quiet +#pragma D option bufsize=64k + +dtrace:::BEGIN +{ + printf("%4s %4s %4s %4s %6s %-16s %s\n", + "CPU", "CHIP", "PSET", "LGRP", "CLOCK", "TYPE", "FPU"); + done[0] = 0; +} + +profile:::profile-10ms +/done[cpu] == 0/ +{ + printf("%4d %4d %4d %4d %6d %-16s %s\n", + cpu, curcpu->cpu_chip, curcpu->cpu_pset, + curcpu->cpu_lgrp, curcpu->cpu_info.pi_clock, + stringof(curcpu->cpu_info.pi_processor_type), + stringof(curcpu->cpu_info.pi_fputypes)); + done[cpu]++; +} + +profile:::tick-100ms +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Cpu/cpuwalk.d b/cddl/contrib/dtracetoolkit/Cpu/cpuwalk.d new file mode 100755 index 00000000000..495f64bb5f9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Cpu/cpuwalk.d @@ -0,0 +1,72 @@ +#!/usr/sbin/dtrace -s +/* + * cpuwalk.d - Measure which CPUs a process runs on. + * Written using DTrace (Solaris 10 3/05) + * + * This program is for multi-CPU servers, and can help identify if a process + * is running on multiple CPUs concurrently or not. + * + * $Id: cpuwalk.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: cpuwalk.d [duration] + * eg, + * cpuwalk.d 10 # sample for 10 seconds + * cpuwalk.d # sample until Ctrl-C is hit + * + * FIELDS: + * value CPU id + * count Number of 1000 hz samples on this CPU + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 22-Sep-2005 Brendan Gregg Created this. + * 14-Feb-2006 " " Last update. + */ + +#pragma D option quiet +#pragma D option defaultargs + +inline int MAXCPUID = 1024; + +dtrace:::BEGIN +{ + $1 ? printf("Sampling...\n") : + printf("Sampling... Hit Ctrl-C to end.\n"); + seconds = 0; +} + +profile:::profile-1000hz +/pid/ +{ + @sample[pid, execname] = lquantize(cpu, 0, MAXCPUID, 1); +} + +profile:::tick-1sec +{ + seconds++; +} + +profile:::tick-1sec +/seconds == $1/ +{ + exit(0); +} + +dtrace:::END +{ + printa("\n PID: %-8d CMD: %s\n%@d", @sample); +} diff --git a/cddl/contrib/dtracetoolkit/Cpu/dispqlen.d b/cddl/contrib/dtracetoolkit/Cpu/dispqlen.d new file mode 100755 index 00000000000..46742c5a02b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Cpu/dispqlen.d @@ -0,0 +1,52 @@ +#!/usr/sbin/dtrace -s +/* + * dispqlen.d - dispatcher queue length by CPU. + * Written using DTrace (Solaris 10 3/05). + * + * $Id: dispqlen.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: dispqlen.d # hit Ctrl-C to end sample + * + * NOTES: The dispatcher queue length is an indication of CPU saturation. + * It is not an indicatior of utilisation - the CPUs may or may not be + * utilised when the dispatcher queue reports a length of zero. + * + * SEE ALSO: uptime(1M) + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 27-Jun-2005 Brendan Gregg Created this. + * 14-Feb-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Sampling... Hit Ctrl-C to end.\n"); +} + +profile:::profile-1000hz +{ + @queue[cpu] = + lquantize(curthread->t_cpu->cpu_disp->disp_nrunnable, 0, 64, 1); +} + +dtrace:::END +{ + printa(" CPU %d%@d\n", @queue); +} diff --git a/cddl/contrib/dtracetoolkit/Cpu/intbycpu.d b/cddl/contrib/dtracetoolkit/Cpu/intbycpu.d new file mode 100755 index 00000000000..606f4028056 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Cpu/intbycpu.d @@ -0,0 +1,49 @@ +#!/usr/sbin/dtrace -s +/* + * intbycpu.d - interrupts by CPU. + * Written using DTrace (Solaris 10 3/05). + * + * $Id: intbycpu.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: intbycpu.d # hit Ctrl-C to end sample + * + * FIELDS: + * CPU CPU number + * INTERRUPTS number of interrupts in sample + * + * This is based on a DTrace OneLiner from the DTraceToolkit. + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 15-May-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sdt:::interrupt-start { @num[cpu] = count(); } + +dtrace:::END +{ + printf("%-16s %16s\n", "CPU", "INTERRUPTS"); + printa("%-16d %@16d\n", @num); +} diff --git a/cddl/contrib/dtracetoolkit/Cpu/intoncpu.d b/cddl/contrib/dtracetoolkit/Cpu/intoncpu.d new file mode 100755 index 00000000000..b32685ab689 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Cpu/intoncpu.d @@ -0,0 +1,66 @@ +#!/usr/sbin/dtrace -s +/* + * intoncpu.d - print interrupt on-cpu usage. + * Written using DTrace (Solaris 10 3/05) + * + * $Id: intoncpu.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: intoncpu.d # wait several seconds, then hit Ctrl-C + * + * FIELDS: + * value Time interrupt thread was on-cpu, ns + * count Number of occurrences of at least this time + * + * BASED ON: /usr/demo/dtrace/intr.d + * + * SEE ALSO: DTrace Guide "sdt Provider" chapter (docs.sun.com) + * intrstat(1M) + * + * PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-May-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sdt:::interrupt-start +{ + self->ts = vtimestamp; +} + +sdt:::interrupt-complete +/self->ts && arg0 != 0/ +{ + this->devi = (struct dev_info *)arg0; + /* this checks the pointer is valid, */ + self->name = this->devi != 0 ? + stringof(`devnamesp[this->devi->devi_major].dn_name) : "?"; + this->inst = this->devi != 0 ? this->devi->devi_instance : 0; + @Time[self->name, this->inst] = quantize(vtimestamp - self->ts); + self->name = 0; +} + +dtrace:::END +{ + printa("%s%d\n%@d", @Time); +} diff --git a/cddl/contrib/dtracetoolkit/Cpu/inttimes.d b/cddl/contrib/dtracetoolkit/Cpu/inttimes.d new file mode 100755 index 00000000000..926a566553e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Cpu/inttimes.d @@ -0,0 +1,73 @@ +#!/usr/sbin/dtrace -s +/* + * inttimes.d - print interrupt on-cpu time. + * Written using DTrace (Solaris 10 3/05) + * + * $Id: inttimes.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: inttimes.d # wait several seconds, then hit Ctrl-C + * + * FIELDS: + * DEVICE instance name of device driver + * TIME (ns) sum of time spent servicing interrupt (ns) + * + * BASED ON: /usr/demo/dtrace/intr.d + * + * SEE ALSO: + * DTrace Guide "sdt Provider" chapter (docs.sun.com) + * intrstat(1M) + * + * PORTIONS: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 28-Jun-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sdt:::interrupt-start +{ + self->ts = vtimestamp; +} + +sdt:::interrupt-complete +/self->ts && arg0 != 0/ +{ + this->devi = (struct dev_info *)arg0; + /* this checks the pointer is valid, */ + self->name = this->devi != 0 ? + stringof(`devnamesp[this->devi->devi_major].dn_name) : "?"; + this->inst = this->devi != 0 ? this->devi->devi_instance : 0; + @num[self->name, this->inst] = sum(vtimestamp - self->ts); + self->name = 0; +} + +sdt:::interrupt-complete +{ + self->ts = 0; +} + +dtrace:::END +{ + printf("%11s %16s\n", "DEVICE", "TIME (ns)"); + printa("%10s%-3d %@16d\n", @num); +} diff --git a/cddl/contrib/dtracetoolkit/Cpu/loads.d b/cddl/contrib/dtracetoolkit/Cpu/loads.d new file mode 100755 index 00000000000..681e8f6beb7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Cpu/loads.d @@ -0,0 +1,58 @@ +#!/usr/sbin/dtrace -s +/* + * loads.d - print load averages. Written using DTrace (Solaris 10 3/05). + * + * These are the same load averages that the "uptime" command prints. + * The purpose of this script is to demonstrate fetching these values + * from the DTrace language. + * + * $Id: loads.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: loads.d + * + * SEE ALSO: uptime(1) + * + * The first field is the 1 minute average, the second is the 5 minute, + * and the third is the 15 minute average. The value represents the average + * number of runnable threads in the system, a value higher than your + * CPU (core/hwthread) count may be a sign of CPU saturation. + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 10-Jun-2005 Brendan Gregg Created this. + * 10-Jun-2005 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + /* fetch load averages */ + this->load1a = `hp_avenrun[0] / 65536; + this->load5a = `hp_avenrun[1] / 65536; + this->load15a = `hp_avenrun[2] / 65536; + this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; + this->load5b = ((`hp_avenrun[1] % 65536) * 100) / 65536; + this->load15b = ((`hp_avenrun[2] % 65536) * 100) / 65536; + + /* print load average */ + printf("%Y, load average: %d.%02d, %d.%02d, %d.%02d\n", + walltimestamp, this->load1a, this->load1b, this->load5a, + this->load5b, this->load15a, this->load15b); + + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Cpu/runocc.d b/cddl/contrib/dtracetoolkit/Cpu/runocc.d new file mode 100755 index 00000000000..a2b046971a2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Cpu/runocc.d @@ -0,0 +1,56 @@ +#!/usr/sbin/dtrace -s +/* + * runocc.d - run queue occupancy by CPU. + * Written using DTrace (Solaris 10 3/05). + * + * This prints the dispatcher run queue occupancy by CPU each second. + * A consistant run queue occupancy is a sign of CPU saturation. + * + * The value is similar to that seen in "sar -q", however this is + * calculated in a more accurate manner - sampling at 1000 Hertz. + * + * $Id: runocc.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: runocc.d + * + * FIELDS: + * CPU cpu ID + * %runocc % run queue occupancy, sampled at 1000 Hertz + * + * SEE ALSO: Solaris Internals 2nd Ed, vol 2, CPU chapter. + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 02-Mar-2006 Brendan Gregg Created this. + * 24-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +profile-1000hz +/curthread->t_cpu->cpu_disp->disp_nrunnable/ +{ + @qocc[cpu] = count(); +} + +profile:::tick-1sec +{ + normalize(@qocc, 10); + printf("\n%8s %8s\n", "CPU", "%runocc"); + printa("%8d %@8d\n", @qocc); + clear(@qocc); +} diff --git a/cddl/contrib/dtracetoolkit/Cpu/xcallsbypid.d b/cddl/contrib/dtracetoolkit/Cpu/xcallsbypid.d new file mode 100755 index 00000000000..b08027c2a25 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Cpu/xcallsbypid.d @@ -0,0 +1,51 @@ +#!/usr/sbin/dtrace -s +/* + * xcallsbypid.d - CPU cross calls by PID. + * Writen using DTrace (Solaris 10 3/05). + * + * $Id: xcallsbypid.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: xcallsbypid.d # hit Ctrl-C to end sample + * + * FIELDS: + * PID process ID + * CMD process name + * XCALLS number of cross calls + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 17-Sep-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sysinfo:::xcalls +{ + @num[pid, execname] = count(); +} + +dtrace:::END +{ + printf("%6s %-16s %16s\n", "PID", "CMD", "XCALLS"); + printa("%6d %-16s %@16d\n", @num); +} diff --git a/cddl/contrib/dtracetoolkit/Disk/Readme b/cddl/contrib/dtracetoolkit/Disk/Readme new file mode 100644 index 00000000000..37a5301cb46 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Disk/Readme @@ -0,0 +1,3 @@ +Disk - Disk based analysis + + These are scripts that analyse I/O activity that has made it to the disks. diff --git a/cddl/contrib/dtracetoolkit/Disk/bitesize.d b/cddl/contrib/dtracetoolkit/Disk/bitesize.d new file mode 100755 index 00000000000..f2e8ea4fcc3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Disk/bitesize.d @@ -0,0 +1,81 @@ +#!/usr/sbin/dtrace -s +/* + * bitesize.d - analyse disk I/O size by process. + * Written using DTrace (Solaris 10 3/05). + * + * This produces a report for the size of disk events caused by + * processes. These are the disk events sent by the block I/O driver. + * + * If applications must use the disks, we generally prefer they do so + * with large I/O sizes. + * + * $Id: bitesize.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: bitesize.d # wait several seconds, then hit Ctrl-C + * + * FIELDS: + * PID process ID + * CMD command and argument list + * value size in bytes + * count number of I/O operations + * + * NOTES: + * + * The application may be requesting smaller sized operations, which + * are being rounded up to the nearest sector size or UFS block size. + * To analyse what the application is requesting, DTraceToolkit programs + * such as Proc/fddist may help. + * + * SEE ALSO: seeksize.d, iosnoop + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 31-Mar-2004 Brendan Gregg Created this, build 51. + * 10-Oct-2004 " " Rewrote to use the io provider, build 63. + * 18-Feb-2006 " " Last update. + */ + +#pragma D option quiet + +/* + * Print header + */ +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +/* + * Process io start + */ +io:::start +{ + /* fetch details */ + this->size = args[0]->b_bcount; + + /* store details */ + @Size[pid, curpsinfo->pr_psargs] = quantize(this->size); +} + +/* + * Print final report + */ +dtrace:::END +{ + printf("\n%8s %s\n", "PID", "CMD"); + printa("%8d %S\n%@d\n", @Size); +} diff --git a/cddl/contrib/dtracetoolkit/Disk/diskhits b/cddl/contrib/dtracetoolkit/Disk/diskhits new file mode 100755 index 00000000000..3d72e4ade58 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Disk/diskhits @@ -0,0 +1,113 @@ +#!/usr/bin/ksh +# +# diskhits - disk access by file offset. +# Written using DTrace (Solaris 10 3/05). +# +# $Id: diskhits 3 2007-08-01 10:50:08Z brendan $ +# +# This prints how a file was accessed, the locations on a distribution plot. +# This is for the cache misses only - the file activity that resulted in +# disk events. +# +# USAGE: diskhits pathname +# eg, +# diskhits /var/adm/messages +# +# FIELDS: +# Location (KB) The file offset of the disk activity, Kbytes. +# Size (KB) Size of the disk activity, Kbytes. +# Total RW Total disk activity, reads + writes. +# +# BASED ON: /usr/demo/dtrace/applicat.d +# +# SEE ALSO: DTrace Guide "io Provider" chapter (docs.sun.com) +# iosnoop (DTraceToolkit) +# +# PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# 08-Jun-2005 Brendan Gregg Created this. +# 20-Apr-2006 " " Last update. +# + +### Usage +function usage +{ + cat <<-END >&2 + USAGE: diskhits pathname + eg, + diskhits /var/adm/wtmpx + END + exit 1 +} + +### Process arguments +if (( $# != 1 )); then + usage +fi +if [[ $1 == "-h" ]]; then + usage +fi +pathname=$1 +if [[ ! -e $pathname ]]; then + print "ERROR2: file $pathname not found" >&2 + exit 2 +fi + +### Calculate output scale +report_lines=20 +set -- `ls -l $pathname` +filesize=$5 +(( file_kb_max = filesize / 1024 )) +(( scale_kb = filesize / (1024 * report_lines) )) +if (( file_kb_max < 20 )); then file_kb_max=20; fi +if (( scale_kb < 1 )); then scale_kb=1; fi + +# +# Run DTrace +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + + inline string PATHNAME = "'$pathname'"; + inline int FILE_KB_MAX = '$file_kb_max'; + inline int SCALE_KB = '$scale_kb'; + + dtrace:::BEGIN + { + printf("Tracing... Hit Ctrl-C to end.\n"); + } + + io:::start + /args[2]->fi_pathname == PATHNAME/ + { + this->kb = args[2]->fi_offset == -1 ? -1 : args[2]->fi_offset / 1024; + @Location = lquantize(this->kb, 0, FILE_KB_MAX, SCALE_KB); + @Size = quantize(args[0]->b_bcount/1024); + @Total = sum(args[0]->b_bcount/1024); + } + + dtrace:::END + { + printf("Location (KB),"); + printa(@Location); + + printf("Size (KB),"); + printa(@Size); + + printa("Total RW: %@d KB\n", @Total); + } +' diff --git a/cddl/contrib/dtracetoolkit/Disk/hotspot.d b/cddl/contrib/dtracetoolkit/Disk/hotspot.d new file mode 100755 index 00000000000..6ab6ee45d69 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Disk/hotspot.d @@ -0,0 +1,71 @@ +#!/usr/sbin/dtrace -s +/* + * hotspot.d - plot disk event by location, look for hotspots. + * Written in DTrace (Solaris 10 3/05). + * + * This simple DTrace script determines if disk activity is occuring in + * the one place - a "hotspot". This helps us understand the system's usage + * of a disk, it does not imply that the existance or not of a hotspot is + * good or bad (often may be good, less seeking). + * + * $Id: hotspot.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: hotspot.d # hit Ctrl-C to end + * + * FIELDS: + * Disk disk instance name + * Major driver major number + * Minor driver minor number + * value location, by megabyte + * count number of I/O operations + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 07-May-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +inline int DISK_MB_MAX = 1000000; /* max size of a single disk */ +inline int REPORT_SCALE_MB = 1000; /* output step size for report */ + +/* + * Print header + */ +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +/* + * Process disk event + */ +io:::start +{ + this->mb = args[0]->b_blkno / 2048; + @Block[args[1]->dev_statname, args[1]->dev_major, args[1]->dev_minor] = + lquantize(this->mb, 0, DISK_MB_MAX, REPORT_SCALE_MB); +} + +/* + * Print final report + */ +dtrace:::END +{ + printa("Disk: %s Major,Minor: %d,%d\n%@d\n", @Block); +} diff --git a/cddl/contrib/dtracetoolkit/Disk/iofile.d b/cddl/contrib/dtracetoolkit/Disk/iofile.d new file mode 100755 index 00000000000..255057a7ebd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Disk/iofile.d @@ -0,0 +1,79 @@ +#!/usr/sbin/dtrace -s +/* + * iofile.d - I/O wait time by filename and process. + * Written using DTrace (Solaris 10 3/05). + * + * This prints the total I/O wait times for each filename by process. + * This can help determine why an application is performing poorly by + * identifying which file they are waiting on, and the total times. + * Both disk and NFS I/O are measured. + * + * $Id: iofile.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: iofile.d # wait, then hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * CMD Process name + * TIME Total wait time for disk events, us + * FILE File pathname + * + * BASED ON: /usr/demo/dtrace/iocpu.d + * + * SEE ALSO: iosnoop, iotop + * + * PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 24-Jul-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +/* print header */ +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +/* save time at start */ +io:::wait-start +{ + self->start = timestamp; +} + +/* process event */ +io:::wait-done +/self->start/ +{ + /* + * wait-done is used as we are measing wait times. It also + * is triggered when the correct thread is on the CPU, obviating + * the need to link process details to the start event. + */ + this->elapsed = timestamp - self->start; + @files[pid, execname, args[2]->fi_pathname] = sum(this->elapsed); + self->start = 0; +} + +/* print report */ +dtrace:::END +{ + normalize(@files, 1000); + printf("%6s %-12s %8s %s\n", "PID", "CMD", "TIME", "FILE"); + printa("%6d %-12.12s %@8d %s\n", @files); +} diff --git a/cddl/contrib/dtracetoolkit/Disk/iofileb.d b/cddl/contrib/dtracetoolkit/Disk/iofileb.d new file mode 100755 index 00000000000..e7572f338ad --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Disk/iofileb.d @@ -0,0 +1,59 @@ +#!/usr/sbin/dtrace -s +/* + * iofileb.d - I/O bytes by filename and process. + * Written using DTrace (Solaris 10 3/05). + * + * This prints a summary of requested disk activity by pathname, + * providing totals of the I/O events in bytes. It is a companion to the + * iofile.d script - which prints in terms of I/O wait time, not bytes. + * I/O wait time is a better metric for understanding performance issues. + * Both disk and NFS I/O are measured. + * + * $Id: iofileb.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: iofileb.d # wait several seconds, then hit Ctrl-C + * + * FIELDS: + * PID process ID + * CMD command name + * KB Kilobytes of disk I/O + * FILE Full pathname of the file + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 20-Feb-2006 Brendan Gregg Created this. + * 20-Feb-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +io:::start +{ + @files[pid, execname, args[2]->fi_pathname] = sum(args[0]->b_bcount); +} + +dtrace:::END +{ + normalize(@files, 1024); + printf("%6s %-12s %6s %s\n", "PID", "CMD", "KB", "FILE"); + printa("%6d %-12.12s %@6d %s\n", @files); +} diff --git a/cddl/contrib/dtracetoolkit/Disk/iopending b/cddl/contrib/dtracetoolkit/Disk/iopending new file mode 100755 index 00000000000..ef9d4da7a62 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Disk/iopending @@ -0,0 +1,261 @@ +#!/usr/bin/ksh +# +# iopending - Print a plot for the number of pending disk I/O events. +# Written using DTrace (Solaris 10 3/05). +# +# This is measuring disk events that have made it past system caches. +# By plotting a distribution graph of the number of pending events, the +# "serialness" or "parallelness" of disk behaviour can be distinguished. +# +# $Id: iopending 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: iopending [-c] [-d device] [-f filename] +# [-m mount_point] [interval [count]] +# +# -c # clear the screen +# -d device # instance name to snoop (eg, dad0) +# -f filename # full pathname of file to snoop +# -m mount_point # this FS only (will skip raw events) +# eg, +# iopending # default output, 5 second intervals +# iopending 1 # 1 second samples +# iopending -c # clear the screen +# iopending 5 12 # print 12 x 5 second samples +# +# FIELDS: +# value number of pending events, 0 == idle +# count number of samples @ 1000 Hz +# load 1 min load average +# disk_r total disk read Kbytes for sample +# disk_w total disk write Kbytes for sample +# +# SEE ALSO: iosnoop, iotop +# +# IDEA: Dr Rex di Bona (Sydney, Australia) +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 01-Nov-2005 Brendan Gregg Created this. +# 20-Apr-2006 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### default variables +opt_device=0; opt_file=0; opt_mount=0; opt_clear=0; +opt_def=1; filter=0; device=.; filename=.; mount=. +interval=5; count=-1 + +### process options +while getopts cd:f:hm: name +do + case $name in + c) opt_clear=1 ;; + d) opt_device=1; device=$OPTARG ;; + f) opt_file=1; filename=$OPTARG ;; + m) opt_mount=1; mount=$OPTARG ;; + h|?) cat <<-END >&2 + USAGE: iopending [-c] [-d device] [-f filename] + [-m mount_point] [interval [count]] + + -c # clear the screen + -d device # instance name to snoop + -f filename # snoop this file only + -m mount_point # this FS only + eg, + iopending # default output, 5 second samples + iopending 1 # 1 second samples + iopending -m / # snoop events on filesystem / only + iopending 5 12 # print 12 x 5 second samples + END + exit 1 + esac +done + +shift $(( $OPTIND - 1 )) + +### option logic +if [[ "$1" > 0 ]]; then + interval=$1; shift +fi +if [[ "$1" > 0 ]]; then + count=$1; shift +fi +if (( opt_device || opt_mount || opt_file )); then + filter=1 +fi +if (( opt_clear )); then + clearstr=`clear` +else + clearstr=. +fi + + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_def = '$opt_def'; + inline int OPT_clear = '$opt_clear'; + inline int OPT_device = '$opt_device'; + inline int OPT_mount = '$opt_mount'; + inline int OPT_file = '$opt_file'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + inline int FILTER = '$filter'; + inline string DEVICE = "'$device'"; + inline string FILENAME = "'$filename'"; + inline string MOUNT = "'$mount'"; + inline string CLEAR = "'$clearstr'"; + + inline int MAX_PENDING = 32; /* max pending value */ + + #pragma D option quiet + + /* + * Print header + */ + dtrace:::BEGIN + { + /* starting values */ + counts = COUNTER; + secs = INTERVAL; + disk_r = 0; + disk_w = 0; + pending = 0; + + printf("Tracing... Please wait.\n"); + } + + /* + * Check event is being traced + */ + io:genunix::start, + io:genunix::done + { + /* default is to trace unless filtering, */ + this->ok = FILTER ? 0 : 1; + + /* check each filter, */ + (OPT_device == 1 && DEVICE == args[1]->dev_statname)? this->ok = 1 : 1; + (OPT_file == 1 && FILENAME == args[2]->fi_pathname) ? this->ok = 1 : 1; + (OPT_mount == 1 && MOUNT == args[2]->fi_mount) ? this->ok = 1 : 1; + } + + /* + * Store entry details + */ + io:genunix::start + /this->ok/ + { + /* track bytes */ + disk_r += args[0]->b_flags & B_READ ? args[0]->b_bcount : 0; + disk_w += args[0]->b_flags & B_READ ? 0 : args[0]->b_bcount; + + /* increase event pending count */ + pending++; + } + + /* + * Process and Print completion + */ + io:genunix::done + /this->ok/ + { + /* decrease event pending count */ + pending--; + } + + /* + * Prevent pending from underflowing + * this can happen if this program is started during disk events. + */ + io:genunix::done + /pending < 0/ + { + pending = 0; + } + + /* + * Timer + */ + profile:::tick-1sec + { + secs--; + } + + profile:::profile-1000hz + { + @out = lquantize(pending, 0, MAX_PENDING, 1); + } + + /* + * Print Report + */ + profile:::tick-1sec + /secs == 0/ + { + /* fetch 1 min load average */ + this->load1a = `hp_avenrun[0] / 65536; + this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; + + /* convert counters to Kbytes */ + disk_r /= 1024; + disk_w /= 1024; + + /* print status */ + OPT_clear ? printf("%s", CLEAR) : 1; + printf("%Y, load: %d.%02d, disk_r: %6d KB, disk_w: %6d KB", + walltimestamp, this->load1a, this->load1b, disk_r, disk_w); + + /* print output */ + printa(@out); + + /* clear data */ + trunc(@out); + disk_r = 0; + disk_w = 0; + secs = INTERVAL; + counts--; + } + + /* + * End of program + */ + profile:::tick-1sec + /counts == 0/ + { + exit(0); + } + + /* + * Cleanup for Ctrl-C + */ + dtrace:::END + { + trunc(@out); + } +' diff --git a/cddl/contrib/dtracetoolkit/Disk/seeksize.d b/cddl/contrib/dtracetoolkit/Disk/seeksize.d new file mode 100755 index 00000000000..963d9ad6d63 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Disk/seeksize.d @@ -0,0 +1,85 @@ +#!/usr/sbin/dtrace -s +/* + * seeksize.d - analyse disk head seek distance by process. + * Written using DTrace (Solaris 10 3/05). + * + * Disk I/O events caused by processes will in turn cause the disk heads + * to seek. This program analyses those seeks, so that we can determine + * if processes are causing the disks to seek in a "random" or "sequential" + * manner. + * + * $Id: seeksize.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: seeksize.d # wait several seconds, then hit Ctrl-C + * + * FIELDS: + * PID process ID + * CMD command and argument list + * value distance in disk blocks (sectors) + * count number of I/O operations + * + * SEE ALSO: bitesize.d, iosnoop + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 11-Sep-2004 Brendan Gregg Created this. + * 10-Oct-2004 " " Rewrote to use the io provider. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +/* + * Print header + */ +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +self int last[dev_t]; + +/* + * Process io start + */ +io:genunix::start +/self->last[args[0]->b_edev] != 0/ +{ + /* calculate seek distance */ + this->last = self->last[args[0]->b_edev]; + this->dist = (int)(args[0]->b_blkno - this->last) > 0 ? + args[0]->b_blkno - this->last : this->last - args[0]->b_blkno; + + /* store details */ + @Size[pid, curpsinfo->pr_psargs] = quantize(this->dist); +} + +io:genunix::start +{ + /* save last position of disk head */ + self->last[args[0]->b_edev] = args[0]->b_blkno + + args[0]->b_bcount / 512; +} + +/* + * Print final report + */ +dtrace:::END +{ + printf("\n%8s %s\n", "PID", "CMD"); + printa("%8d %S\n%@d\n", @Size); +} diff --git a/cddl/contrib/dtracetoolkit/Docs/Contents b/cddl/contrib/dtracetoolkit/Docs/Contents new file mode 100644 index 00000000000..525fd05b85a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/Contents @@ -0,0 +1,152 @@ +Contents - Command Summary + + The following is a list of commands found in the DTraceToolkit, along + with their directory location. + +Generally commands that end in a ".d" are DTrace scripts, and commands +that don't are DTrace scripts wrapped in another language (eg, shell +or Perl). See the Docs/Readme for instructions for finding their docs. + +DTraceToolkit/ + dexplorer run a series of scripts and archive output + dtruss process syscall info. DTrace truss + dvmstat vmstat by PID/name/command + errinfo report syscall failures with details + execsnoop snoop process execution as it occurs + iosnoop snoop I/O events as they occur + iopattern print disk I/O pattern + iotop display top disk I/O events by process + opensnoop snoop file opens as they occur + procsystime analyse process system call times + rwsnoop snoop read/write events + rwtop display top read/write bytes by process + statsnoop snoop file stats as they occur + Apps/ + httpdstat.d realtime httpd statistics + nfswizard.d NFS client activity wizard + shellsnoop snoop live shell activity + weblatency.d website latency statistics + Cpu/ + cputypes.d list CPU types + cpuwalk.d measure which CPUs a process runs on + dispqlen.d dispatcher queue length by CPU + intbycpu.d interrupts by CPU + intoncpu.d interrput on-cpu usage + inttimes.d interrput on-cpu time total + loads.d print load averages + runocc.d run queue occupancy by CPU + xcallsbypid.d CPU cross calls by PID + Disk/ + bitesize.d print disk event size report + diskhits disk access by file offset + hotspot.d print disk event by location + iofile.d I/O wait time by filename and process + iofileb.d I/O bytes by filename and process + iopending plot number of pending disk events + pathopens.d pathnames successfully opened count + seeksize.d print disk seek size report + Docs/ + oneliners.txt DTrace oneliners + FS/ + fsrw.d file system read/write event tracing + fspaging.d file system read/write and paging tracing + rfsio.d read FS I/O stats, with cache miss rate + rfileio.d read file I/O stats, with cache miss rate + vopstat vnode interface statistics + Java/ + j_*.d 18 scripts for tracing Java using the hotspot provider + JavaScript/ + js_*.d 14 scripts for JavaScript with the Mozilla provider + Kernel/ + cputimes print time by Kernel/Idle/Process + cpudists time distribution by Kernel/Idle/Process + cswstat.d context switch time statistics + dnlcps.d DNLC stats by process + dnlcsnoop.d snoop DNLC activity + dnlcstat DNLC statistics + kstat_types.d trace kstat reads with type info + modcalls.d kernel function calls by module name + priclass.d priority distribution by scheduling class + pridist.d process priority distribution + putnexts.d trace who is putting to which streams module + whatexec.d examine the type of files executed + Locks/ + lockbyproc.d lock time by process name + lockbydist.d lock time distribution by process name + Mem/ + anonpgpid.d anonymous memory paging info by PID on CPU + minfbypid.d minor faults by PID + minfbyproc.d minor faults by process name + pgpginbypid.d pages paged in by PID + pgpginbyproc.d pages paged in by process name + swapinfo.d print virtual memory info + vmbypid.d virtual memory stats by PID + vmstat.d vmstat demo using DTrace + vmstat-p.d vmstat -p demo using DTrace + xvmstat extended vmstat demo using DTrace + Misc/ + guess.d guessing game + wpm.d words per minute tracing + woof.d audio alert for new processes + Net/ + connections print inbound TCP connections by process + icmpstat.d print ICMP statistics + tcpsnoop snoop TCP network packets by process, Solaris 10 3/05 + tcpsnoop_snv snoop TCP network packets by process, Solaris Nevada + tcpsnoop.d snoop TCP network packets by process, Solaris 10 3/05 + tcpsnoop_snv.d snoop TCP network packets by process, Solaris Nevada + tcpstat.d print TCP statistics + tcptop display top TCP network packets by PID, Solaris 10 3/05 + tcptop_snv display top TCP network packets by PID, Solaris Nevada + tcpwdist.d simple TCP write distribution by process + udpstat.d print UDP statistics + Perl/ + pl_*.d 12 scripts for tracing Perl + Php/ + php_*.d 12 scripts for tracing Php + Proc/ + crash.d crashed application report + creatbyproc.d snoop file creat() by process name + dappprof profile user and lib function usage + dapptrace trace user and lib function usage + fddist file descriptor usage distribution + fileproc.d snoop files opened by process + kill.d snoop process signals + lastwords print syscalls before exit + mmapfiles.d mmap'd files by process + newproc.d snoop new processes + pfilestat show I/O latency break down by FD + pidpersec.d print new PIDs per sec + readbytes.d read bytes by process name + readdist.d read distribution by process name + rwbbypid.d read/write bytes by PID + rwbypid.d read/write calls by PID + rwbytype.d read/write bytes by vnode type + sampleproc sample processes on the CPUs + shortlived.d check short lived process time + sigdist.d signal distribution by process name + stacksize.d measure stack size for running threads + sysbypid.d system stats by PID + syscallbyproc.d system calls by process name + syscallbypid.d system calls by process ID + threaded.d sample multi-threaded CPU usage + topsysproc display top syscalls by process name + writebytes.d write bytes by process name + writedist.d write distribution by process name + Python/ + py_*.d 14 scripts for tracing Python + Shell/ + sh_*.d 15 scripts for tracing the Bourne shell + System/ + sar-c.d sar -c demo using DTrace + syscallbysysc.d system calls by system call + topsyscall display top system call type + uname-a.d uname -a demo using DTrace + Tcl/ + tcl_*.d 15 scripts for tracing Tcl + User/ + setuids.d snoop setuid calls + Zones/ + zvmstat vmstat info by zone + +Total: 230 scripts diff --git a/cddl/contrib/dtracetoolkit/Docs/Examples b/cddl/contrib/dtracetoolkit/Docs/Examples new file mode 120000 index 00000000000..30983268360 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/Examples @@ -0,0 +1 @@ +../Examples \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Docs/Faq b/cddl/contrib/dtracetoolkit/Docs/Faq new file mode 100644 index 00000000000..4919cac9fc5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/Faq @@ -0,0 +1,126 @@ +Faq - Frequently Asked Questions + + The following may serve as a guide to the DTraceToolkit. + +16-May-2005, ver 0.30 (first version of the FAQ) + +The DTraceToolkit is new, and as such there hasn't been many questions asked. +This may be better called a "possibly asked questions" :) + + +Questions + +1. Intro +1.1. What is the DTraceToolkit? +1.2. Who wrote the DTraceToolkit? +1.3. Where do I get support? +1.4. Am I now a performance tuning expert? +1.5. Will this solve all my performance problems? +1.6. So the DTraceToolkit *is* DTrace? + +2. Toolkit +2.1. What is in it? +2.2. What performance effect can the DTraceToolkit cause? + +3. Contributing +3.1. Where do I send bugs? + + +Answers + +1. Intro + +1.1. What is the DTraceToolkit? + + The DTraceToolkit is a collection of tools written using DTrace for + the Solaris 10[tm] OS by Sun Microsystems[tm]. Many of these scripts + will also work on OpenSolaris. + +1.2. Who wrote the DTraceToolkit? + + Volunteers of the DTrace and OpenSolaris community. Check the scripts + themselves, Docs/Contrib, Docs/Who and Docs/History. + +1.3. Where do I get support? + + As the DTraceToolkit is a freeware product, there is no official company + offering support for this. Sun Microsystems does not support this. If you + post messages to the DTrace forums found in the Docs/Links file, a + volunteer may help you out. + +1.4. Am I now a performance tuning expert? + + The DTraceToolkit does not turn people into performance tuning experts in + the same way that owning a set of golf clubs won't make you a professional + golfer. Experience and understanding are necessary. The toolkit certainly + helps by fetching the data in an easy way, and also by providing some + documentation. So it is valuable, but not magical. + +1.5. Will this solve all my performance problems? + + This is similar to the previous point; the DTraceToolkit is valuable + for it's scripts and documentation, but it's no magical product. + Understanding and experience are necessary. + +1.6. So the DTraceToolkit *is* DTrace? + + The DTraceToolkit is one use of DTrace, but there is far more to DTrace + than just the toolkit. DTrace allows people to write their own customised + scripts to solve a wide number of problems. + + Think of the DTraceToolkit as a starting point. Maybe your problem has + a solution in the kit. Maybe changing one of the toolkit programs slightly + is what you want. Finally you may need to write your script from scratch. + + +2. Toolkit + +2.1. What is in it? + + Read the Guide file for a table of contents, and Docs/Contents for a + list of commands. + +2.2. What performance effect can the DTraceToolkit cause? + + Enabling DTrace to monitor events has little effect on the system, + especially when compared to the disruptive behaviour of truss (See + http://www.brendangregg.com/DTrace/dtracevstruss.html for a comparison). + + It really boils down to how often the events occur that you are monitoring. + The following numbers have been provided as an approximation: + + 1. Fixed rate scripts. For example, dispqlen.d samples at 1000 hz. + The impact will be negligible, close to 0% CPU. (in testing, 0.1% CPU). + + 2. Demand rated scripts. For example, iosnoop probes disk I/O events. + The impact depends on the rate of events, for many servers the disk + events would be slow enough for this to be less than 0.2% CPU. + Scripts such as execsnoop would expect even fewer events, their impact + would be close to 0.0% CPU. However scripts that monitor potentially + very rapid events will have a greater impact, for example running + dapptrace on Xorg (over 6000 lines of output per second) was consuming + around 10% of a CPU to do so. + + 3. Heavy voodoo scripts. A few scripts in the toolkit must probe either + a ton of different events, or very rapid events, or both. They are + going to hurt and there is no way around it. Scripts such as cputimes + and cpudists trace very frequent events, and can chew around 5% of + the CPUs; scripts such as dapptrace and dappprof trace extreamly + frequent events, and can chew over 20%. + + There is an emphasis in the DTraceToolkit to write demand rated scripts + that measure the fewest events, such that their impact is close to 0.0% + CPU usage. Some scripts are fixed rate, which are safer as their impact + has a known upper bound, and are most suitable to run in production. + + There are additional notes in Notes/ALLoverhead_notes.txt about the + overheads for running DTrace. + + +3. Contributing + +3.1. Where do I send bugs? + + The DTraceToolkit maintainer. See the Docs/Maintainer file. + + diff --git a/cddl/contrib/dtracetoolkit/Docs/History b/cddl/contrib/dtracetoolkit/Docs/History new file mode 100644 index 00000000000..d92bf11436e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/History @@ -0,0 +1,249 @@ +History - History of the DTraceToolkit + +------------------------------------------------------------------------------ +20-Apr-2005 Brendan Gregg Idea + For a while I had thought that a DTrace toolkit would be a nice + idea, but on this day it became clear. I was explaining DTrace to + an SSE from Sun (Canberra, Australia), who had a need for using + DTrace but didn't have the time to sit down and write all the + tools he was after. It simply made sense to have a DTrace toolkit + that people could download or carry around a copy to use. Some + people would write DTrace tools, others would use the toolkit. +------------------------------------------------------------------------------ +15-May-2005 Brendan Gregg Version 0.30 + I had discussed the idea of a DTrace toolkit with the Sun PAE guys in + Adelaide, Australia. It was making more sense now. It would be much + like the SE Toolkit, not just due to the large number of sample + scripts provided, but also due to the role it would play: few people + wrote SE Toolkit programs, more people used it as a toolkit. While + we would like a majority of Solaris users to write DTrace scripts, + the reality is that many would want to use a prewritten toolkit. + Today I created the toolkit as version 0.30, with 11 main directories, + a dozen scripts, man pages and a structure for documentation. +------------------------------------------------------------------------------ +16-May-2005 Brendan Gregg OneLiners + I've been using the toolkit for a day now (wow!), and have noticed + a few problems I've been fixing. One of them was the dtrace oneliners. + I have them in two files, Docs/oneliners.txt and the examples in + Docs/Examples/oneliners_examples.txt. The problem is that when I'm + looking for a script, I'm looking in Docs/Commands - a list of the + seperate script files, or I'm doing an ls or find. Ok, so I've now + made each one liner a seperate script. This seems at first pretty + silly since they are oneliners and shouldn't deserve an entire script + each, but I've found having them as seperate scripts makes them far + easier to find and use. The scripts and man page for each script do + point out the fact that it's a one liner. +------------------------------------------------------------------------------ +17-May-2005 Brendan Gregg Version 0.33 + Version 0.33 with 33 scripts. Maybe I should make the version number + equal the script count. :) I just finished dtruss, dapptrace and + dappprof. +------------------------------------------------------------------------------ +08-Jun-2005 Brendan Gregg Name changes. + I've renamed Docs/Commands to Docs/Contents. I found myself typing + "more Docs/Contents" by mistake a lot. ok, maybe it made more sense + to call it Contents after all. I've also made a symlink to it called + Index. +------------------------------------------------------------------------------ +08-Jun-2005 Brendan Gregg Version 0.35 + Version 0.35 with 35 scripts. Also touched up procsystime and some + man pages. Added the CDDL version 1.0. +------------------------------------------------------------------------------ +09-Jun-2005 Brendan Gregg Version 0.42 + Added 7 more scripts. +------------------------------------------------------------------------------ +14-Jun-2005 Brendan Gregg Version 0.57 + Added heaps of new scripts. Now at 57 scripts. +------------------------------------------------------------------------------ +17-Jun-2005 Brendan Gregg Version 0.61 + Restyled many commands. +------------------------------------------------------------------------------ +28-Jun-2005 Brendan Gregg Version 0.70 + Added several commands including dexplorer. Developed a few useful + variants of classic scripts while writing dexplorer, and have added + them to the toolkit (I kept wanting to run them individually but + not have to run an entire dexplorer). +------------------------------------------------------------------------------ +25-Jul-2005 Brendan Gregg Version 0.77 + Added tcpsnoop.d, tcpsnoop, tcptop. Because of their addition I have + dropped tcpwbytes.d and tcpwlist. These are complex scripts, but they + track TCP in an accurate manner. However! also because they are + complex scripts, I expect they will require maintainence for newer + versions of [Open]Solaris, as various probes may change. They will + become much more stable once a network provider has been added to + DTrace (which may be some time away). + Also added iotop, and updated a bunch of scripts. A lot of work went + into this version, although the version change doesn't reflect that + (I'm still keeping the version number == to number of scripts). + Also added rwsnoop, rwtop, and more. +------------------------------------------------------------------------------ +26-Jul-2005 Brendan Gregg Version 0.82 + Many new scripts added, many updates. This is a major release. +------------------------------------------------------------------------------ +17-Sep-2005 Brendan Gregg Version 0.83 + A few scripts have been updated so that they work better. + execsnoop, iosnoop, opensnoop and rwsnoop will be more responsive + (increased switchrate). +------------------------------------------------------------------------------ +22-Sep-2005 Brendan Gregg Version 0.84 + Some updates, fixed some bugs (cputimes, cpudists). Added cpuwalk.d. +------------------------------------------------------------------------------ +15-Nov-2005 Brendan Gregg Sys Admin Magazine + Ryan Matteson wrote an article on the DTraceToolkit which has been + printed in Sys Admin Magazine, December 2005. It's quite good, + and made it as the feature article - which means it will be available + online for some time. Thanks Matty, and Sys Admin Magazine! + "Observing I/O Behavior with the DTraceToolkit" + http://www.samag.com/documents/sam0512a/ +------------------------------------------------------------------------------ +01-Dec-2005 Brendan Gregg Version 0.88 + Many scripts were updated. Added the Apps category. I had planned + to add some key scripts, but they haven't made it out of testing yet. +------------------------------------------------------------------------------ +03-Dec-2005 Brendan Gregg Version 0.89 + Added nfswisard.d, fixed a minor bug with tcp* tools (see + dtrace-discuss mailing list). +------------------------------------------------------------------------------ +12-Jan-2006 Brendan Gregg Version 0.92 + Added a few scripts including rwbytype.d. Fixed several issues. +------------------------------------------------------------------------------ +09-Apr-2006 Brendan Gregg Solaris Internals 2nd Edition + In the past few months I have been contributing to Solaris Internals + 2nd Edition. This book (now two volumes) is really amazing. The 2nd + volume does use the DTraceToolkit where appropriate, and covers loads + of useful topics. While writing and reviewing material for Solaris + Internals, I've had numerous new ideas for DTrace scripts. Not only + that, but a few people have managed to send me well styled, carefully + tested, well considered DTrace scripts for inclusion in the toolkit. +------------------------------------------------------------------------------ +20-Apr-2006 Brendan Gregg TCP bug fixed + Stefan Parvu sent me a bug for the tcp* scripts: on build 31+ they + error'd on the symbol SS_TCP_FAST_ACCEPT. This symbol was + renamed to SS_DIRECT (I checked the code, they are used in the + same way). Ironically, when I first wrote the scripts I had hardcoded + the value 0x00200000, then rewrote it "properly" by importing + the header files and using the symbol name. Had I been lazy and left + it hardcoded, the bug would never have eventuated. Not to worry, + it has returned to being hardcoded, so that it works on all builds + (until something else changes). +------------------------------------------------------------------------------ +21-Apr-2006 Brendan Gregg Restyled - again! + I've been writing the "DTraceToolkit Style Guide", to document + the style that these scripts obey. It is quite strict, and sets + the bar fairly high. I've been warned that it may cause very few + people to ever contribute scripts, which is fine. At some point + I'll carefully explain the mentality behind this, but in a nutshell: + Users on critical production servers expect the tools to be + accurate, carefully tested, and cause no undocumented harm. +------------------------------------------------------------------------------ +22-Apr-2006 Brendan Gregg Docs changes + The "Contrib" file was merged into the "Who" file. In hindsight + it is better to keep this data together than to split it up. +------------------------------------------------------------------------------ +24-Apr-2006 Brendan Gregg Version 0.96 + The toolkit now contains 104 scripts, however I'll keep the version + number < 1.00 until the dust has settled on these new scripts. + There is some special significance with version 1.00, it would + imply that every script had been tested for some time - not that + I've just added a few. + There is a new main directory, FS for file system related scripts. + There are some interesting scripts in there, from or based on + Solaris Internals 2nd ed, vol 2. +------------------------------------------------------------------------------ +30-Sep-2007 Brendan Gregg Version 0.99 + It's been a year and a half since the last release, and a lot has + happneed. Firstly, the DTraceToolkit has featured in the Prentice Hall + book, + Solaris Performance and Tools + DTrace and mdb techniques for Solaris 10 and OpenSolaris + + written by Richard McDougall, Jim Mauro and myself. It is a companion + book to "Solaris Internals 2nd edition" by Richard McDougall and + Jim Mauro. If you are serious about becomming a DTrace guru, + especially on Solaris, then please study both books. (Yes, I realize + that many people are using the DTraceToolkit because they don't have + the time or don't want to become DTrace gurus; well, so long as + you are using DTrace anyway :). The performance book was a great relief + to write - since we were able to put to print much performance wisdom + and knowledge that was begging to be documented. + + Then, in late 2006 I joined an advanced products engineering team + at Sun in San Francisco, a team which includes the three members of + team DTrace. It's been a great opportunity to learn from such + engineers, and to contribute more directly to DTrace. So far my work + has included writing a JavaScript provider, integrated inet_ntoa() + style functions into DTrace, and prototying DTrace IP, TCP and UDP + providers. + + Working on the network providers is good news for the DTraceToolkit, + as it will indirectly help the tcp* scripts become more stable. Yes, + those scripts have broken a few more times during the last 18 months, + sorry about that, and it will keep happening until we have stable + network providers. This is why I only ever wrote three tcp* scripts, + and not at least a dozen, which I'd really like to do. + + I did leave my pile of old SPARC and x86 development servers behind + in Australia, and brought over a couple of laptops. That has made me + more dependant on Stefan for testing the toolkit - especially on SPARC. + + So, it's been about 18 months since the last release, which is + mostly due to having less spare time due to moving countries and + learning a new job. + + Michelle from Sun docs has been asking for a newer version of the + DTraceToolkit for the OpenSolaris starter kit, which is why I'm + releasing this version now and not waiting a few more weeks as + I complete bug fixes. + + So the good and the bad news for this release, starting with the bad, + + Bad: tcpsnoop/tcptop still don't work on some Solaris 10 releases. + I've added versions that should work on Solaris Nevada and OpenSolaris + for releases from around late 2007. They are likely to break again. + The real answer, as always, is for stable nework providers to be + integrated into Solaris. + + Many of the exciting new language provider scripts in this release + currently require downloading, patching and compling of the language + interpreter to get working. See the Readme file in each directory + for pointers. + + Good: many more scripts to cover the new DTrace language providers + that are available (the DTraceToolkit is now 227 scripts). Many + updates to the Notes directory. Bug fixes. Some new categories + other than for scripts: Code - for simple programs to DTrace (and + for the example files), and Snippits - for useful lumps of DTrace + code to copy-n-paste from. The man pages are also making room + for documenting both stability and supported operating systems for + each script - now that DTrace exists for MacOS X Leopard, the + DTraceToolkit will begin supporting multiple operating systems. + + This can be thought of as a developer's release of the DTraceToolkit - + to help people start using DTrace with Perl, Python, Ruby, Php, Java, + JavaScript, Shell and Tcl. I've written about 15 scripts for each + language, to cover the basics and to show the way for deeper analysis. + The scripts are also similar from one language to another, having + devoleped a tried-and-tested group of scripts for analyzing real world + issues - it made sense to repeat these scripts for every language + possible. To see what I mean, try reading, + + Examples/j_cputime_example.txt Examples/py_cputime_example.txt + Examples/js_cputime_example.txt Examples/rb_cputime_example.txt + Examples/php_cputime_example.txt Examples/sh_cputime_example.txt + Examples/pl_cputime_example.txt Examples/tcl_cputime_example.txt + + You might notice that the example files are more clearly and carefully + explained. Claire (my wife), wrote close to one hundred of them for + this release while I focused on writing and testing the scripts. + Claire has worked as a SysAdmin and as an IT instructor, and is well + skilled at explaining relavent technical details. And she can spell + much better than I can. :) + + The future: I still have many new scripts and some bug fixes in mind, + as well as generally improving the Notes and Examples provided. + Hopefully it won't be too many months before you see another + release. Check here for the lastest installment, + + http://www.opensolaris.org/os/community/dtrace/dtracetoolkit +------------------------------------------------------------------------------ + diff --git a/cddl/contrib/dtracetoolkit/Docs/Index b/cddl/contrib/dtracetoolkit/Docs/Index new file mode 120000 index 00000000000..9ae9ea0ab58 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/Index @@ -0,0 +1 @@ +Contents \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Docs/Links b/cddl/contrib/dtracetoolkit/Docs/Links new file mode 100644 index 00000000000..182bb548b5b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/Links @@ -0,0 +1,30 @@ +Links - DTrace links + + http://www.opensolaris.org/os/community/dtrace/dtracetoolkit + DTraceToolkit Home + + http://www.opensolaris.org/os/community/dtrace + OpenSolaris DTrace site + + http://www.brendangregg.com/dtrace.html + DTraceToolkit + DTrace Tools + + http://www.sun.com/bigadmin/content/dtrace + DTrace site on BigAdmin + + http://docs.sun.com/db/doc/817-6223 + DTrace Guide (answerbook) + + http://blogs.sun.com/roller/page/bmc + Bryan Cantrill's Blog (DTrace Team) + + http://blogs.sun.com/roller/page/ahl + Adam Leventhal's Blog (DTrace Team) + + http://blogs.sun.com/mws + Mike Shapiro's Blog (DTrace Team) + + http://www.solarisinternals.com/si/dtrace/index.php + DTrace scripts by Richard McDougall + diff --git a/cddl/contrib/dtracetoolkit/Docs/Maintainer b/cddl/contrib/dtracetoolkit/Docs/Maintainer new file mode 100644 index 00000000000..3a8bb429a1c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/Maintainer @@ -0,0 +1,6 @@ +Maintainer - The DTraceToolkit Author and Maintainer, + + Brendan Gregg + brendan@sun.com (or see website below for emailaddr) + http://www.brendangregg.com + diff --git a/cddl/contrib/dtracetoolkit/Docs/Notes b/cddl/contrib/dtracetoolkit/Docs/Notes new file mode 120000 index 00000000000..e0856feb268 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/Notes @@ -0,0 +1 @@ +../Notes \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Docs/Readme b/cddl/contrib/dtracetoolkit/Docs/Readme new file mode 100644 index 00000000000..1f98f38d30f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/Readme @@ -0,0 +1,21 @@ +Docs - DTraceToolkit Documentation + + Docs/Contents summary of toolkit commands + Examples examples of command usage + Notes notes on commands + +The following may be followed to learn about a DTraceToolkit command, + + 1. read "Contents" for a command name and toolkit location. + 2. run the command with "-h" to check it's usage. + 3. read the manpage from Man/man1m. + 4. read the examples from Examples. + 5. read the notes from Notes. + 6. read the script itself + +Try the following to discover all docs related to a command, eg iosnoop, + + find . | grep iosnoop + +best run from the DTraceToolkit root directory. + diff --git a/cddl/contrib/dtracetoolkit/Docs/ToDo b/cddl/contrib/dtracetoolkit/Docs/ToDo new file mode 100644 index 00000000000..5561ea4b17a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/ToDo @@ -0,0 +1,7 @@ +ToDo - To Do List + + The following is a list of todo reminders for the DTraceToolkit. + +* Run PHP examples on mediawiki. + + diff --git a/cddl/contrib/dtracetoolkit/Docs/Who b/cddl/contrib/dtracetoolkit/Docs/Who new file mode 100644 index 00000000000..f1019a9b92b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/Who @@ -0,0 +1,74 @@ +Who - Who the Contributers are + + This is a record of contributors to the DTraceToolkit whose name isn't + already mentioned (such as in the source of a script). + + +In alphabetical first-name order, + +Adam Leventhal + Location: CA, USA + Blog: http://blogs.sun.com/ahl + wrote DTrace itself + +Ben Rockwood + Location: CA, USA + Website: http://www.cuddletech.com + first encouraged the idea of DTrace oneliners + +Brendan Gregg + Location: Sydney, Australia + Website: http://www.brendangregg.com + Email: brendan.gregg@tpg.com.au (maybe, check the website above) + Blog: http://bdgregg.blogspot.com + Notes: Also see http://www.brendangregg.com/dtrace.html + created toolkit, tools, manpages, example docs, notes docs, testing + +Bryan Cantrill + Location: CA, USA + Blog: http://blogs.sun.com/bmc + wrote DTrace itself + +David Rubio + technical advice + +James Dickens + Location: WI, USA + Blog: http://uadmin.blogspot.com + tool ideas and testing + +Jonathan Adams + Blog: http://blogs.sun.com/jwadams + wrote stacksize.d + +Mike Shapiro + Location: CA, USA + Blog: http://blogs.sun.com/mws + wrote DTrace itself + +Nathan Kroenert + Location: Sydney, Australia + thoughts on how to present tools + +Richard McDougall + Location: CA, USA + Website: http://www.solarisinternals.com + Blog: http://blogs.sun.com/rmc + wrote pfilestat, vopstat + +Ryan Matteson + Location: USA + Blog: http://blogomatty.blogspot.com + tool ideas and testing + +Stefan Parvu + Blog: http://stefanparvu.blogspot.com + suggestions, bug fixes, extensive testing + +unknown Sun people + wrote /usr/demo/dtrace tools, which some of the toolkit tools are + based on. See "BASED ON" in source or man page, or try the following, + cd Bin + grep 'BASED ON' * + for a list. + diff --git a/cddl/contrib/dtracetoolkit/Docs/cddl1.txt b/cddl/contrib/dtracetoolkit/Docs/cddl1.txt new file mode 100644 index 00000000000..b3487ade1b8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/cddl1.txt @@ -0,0 +1,385 @@ + +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + + + 1. Definitions. + + 1.1. ÒContributorÓ means each individual or entity that + creates or contributes to the creation of Modifications. + + 1.2. ÒContributor VersionÓ means the combination of the + Original Software, prior Modifications used by a + Contributor (if any), and the Modifications made by that + particular Contributor. + + 1.3. ÒCovered SoftwareÓ means (a) the Original Software, or + (b) Modifications, or (c) the combination of files + containing Original Software with files containing + Modifications, in each case including portions thereof. + + 1.4. ÒExecutableÓ means the Covered Software in any form + other than Source Code. + + 1.5. ÒInitial DeveloperÓ means the individual or entity + that first makes Original Software available under this + License. + + 1.6. ÒLarger WorkÓ means a work which combines Covered + Software or portions thereof with code not governed by the + terms of this License. + + 1.7. ÒLicenseÓ means this document. + + 1.8. ÒLicensableÓ means having the right to grant, to the + maximum extent possible, whether at the time of the initial + grant or subsequently acquired, any and all of the rights + conveyed herein. + + 1.9. ÒModificationsÓ means the Source Code and Executable + form of any of the following: + + A. Any file that results from an addition to, + deletion from or modification of the contents of a + file containing Original Software or previous + Modifications; + + B. Any new file that contains any part of the + Original Software or previous Modification; or + + C. Any new file that is contributed or otherwise made + available under the terms of this License. + + 1.10. ÒOriginal SoftwareÓ means the Source Code and + Executable form of computer software code that is + originally released under this License. + + 1.11. ÒPatent ClaimsÓ means any patent claim(s), now owned + or hereafter acquired, including without limitation, + method, process, and apparatus claims, in any patent + Licensable by grantor. + + 1.12. ÒSource CodeÓ means (a) the common form of computer + software code in which modifications are made and (b) + associated documentation included in or with such code. + + 1.13. ÒYouÓ (or ÒYourÓ) means an individual or a legal + entity exercising rights under, and complying with all of + the terms of, this License. For legal entities, ÒYouÓ + includes any entity which controls, is controlled by, or is + under common control with You. For purposes of this + definition, ÒcontrolÓ means (a) the power, direct or + indirect, to cause the direction or management of such + entity, whether by contract or otherwise, or (b) ownership + of more than fifty percent (50%) of the outstanding shares + or beneficial ownership of such entity. + + 2. License Grants. + + 2.1. The Initial Developer Grant. + + Conditioned upon Your compliance with Section 3.1 below and + subject to third party intellectual property claims, the + Initial Developer hereby grants You a world-wide, + royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than + patent or trademark) Licensable by Initial Developer, + to use, reproduce, modify, display, perform, + sublicense and distribute the Original Software (or + portions thereof), with or without Modifications, + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, + using or selling of Original Software, to make, have + made, use, practice, sell, and offer for sale, and/or + otherwise dispose of the Original Software (or + portions thereof). + + (c) The licenses granted in Sections 2.1(a) and (b) + are effective on the date Initial Developer first + distributes or otherwise makes the Original Software + available to a third party under the terms of this + License. + + (d) Notwithstanding Section 2.1(b) above, no patent + license is granted: (1) for code that You delete from + the Original Software, or (2) for infringements + caused by: (i) the modification of the Original + Software, or (ii) the combination of the Original + Software with other software or devices. + + 2.2. Contributor Grant. + + Conditioned upon Your compliance with Section 3.1 below and + subject to third party intellectual property claims, each + Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + (a) under intellectual property rights (other than + patent or trademark) Licensable by Contributor to + use, reproduce, modify, display, perform, sublicense + and distribute the Modifications created by such + Contributor (or portions thereof), either on an + unmodified basis, with other Modifications, as + Covered Software and/or as part of a Larger Work; and + + + (b) under Patent Claims infringed by the making, + using, or selling of Modifications made by that + Contributor either alone and/or in combination with + its Contributor Version (or portions of such + combination), to make, use, sell, offer for sale, + have made, and/or otherwise dispose of: (1) + Modifications made by that Contributor (or portions + thereof); and (2) the combination of Modifications + made by that Contributor with its Contributor Version + (or portions of such combination). + + (c) The licenses granted in Sections 2.2(a) and + 2.2(b) are effective on the date Contributor first + distributes or otherwise makes the Modifications + available to a third party. + + (d) Notwithstanding Section 2.2(b) above, no patent + license is granted: (1) for any code that Contributor + has deleted from the Contributor Version; (2) for + infringements caused by: (i) third party + modifications of Contributor Version, or (ii) the + combination of Modifications made by that Contributor + with other software (except as part of the + Contributor Version) or other devices; or (3) under + Patent Claims infringed by Covered Software in the + absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1. Availability of Source Code. + + Any Covered Software that You distribute or otherwise make + available in Executable form must also be made available in + Source Code form and that Source Code form must be + distributed only under the terms of this License. You must + include a copy of this License with every copy of the + Source Code form of the Covered Software You distribute or + otherwise make available. You must inform recipients of any + such Covered Software in Executable form as to how they can + obtain such Covered Software in Source Code form in a + reasonable manner on or through a medium customarily used + for software exchange. + + 3.2. Modifications. + + The Modifications that You create or to which You + contribute are governed by the terms of this License. You + represent that You believe Your Modifications are Your + original creation(s) and/or You have sufficient rights to + grant the rights conveyed by this License. + + 3.3. Required Notices. + + You must include a notice in each of Your Modifications + that identifies You as the Contributor of the Modification. + You may not remove or alter any copyright, patent or + trademark notices contained within the Covered Software, or + any notices of licensing or any descriptive text giving + attribution to any Contributor or the Initial Developer. + + 3.4. Application of Additional Terms. + + You may not offer or impose any terms on any Covered + Software in Source Code form that alters or restricts the + applicable version of this License or the recipientsÕ + rights hereunder. You may choose to offer, and to charge a + fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Software. + However, you may do so only on Your own behalf, and not on + behalf of the Initial Developer or any Contributor. You + must make it absolutely clear that any such warranty, + support, indemnity or liability obligation is offered by + You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred + by the Initial Developer or such Contributor as a result of + warranty, support, indemnity or liability terms You offer. + + + 3.5. Distribution of Executable Versions. + + You may distribute the Executable form of the Covered + Software under the terms of this License or under the terms + of a license of Your choice, which may contain terms + different from this License, provided that You are in + compliance with the terms of this License and that the + license for the Executable form does not attempt to limit + or alter the recipientÕs rights in the Source Code form + from the rights set forth in this License. If You + distribute the Covered Software in Executable form under a + different license, You must make it absolutely clear that + any terms which differ from this License are offered by You + alone, not by the Initial Developer or Contributor. You + hereby agree to indemnify the Initial Developer and every + Contributor for any liability incurred by the Initial + Developer or such Contributor as a result of any such terms + You offer. + + 3.6. Larger Works. + + You may create a Larger Work by combining Covered Software + with other code not governed by the terms of this License + and distribute the Larger Work as a single product. In such + a case, You must make sure the requirements of this License + are fulfilled for the Covered Software. + + 4. Versions of the License. + + 4.1. New Versions. + + Sun Microsystems, Inc. is the initial license steward and + may publish revised and/or new versions of this License + from time to time. Each version will be given a + distinguishing version number. Except as provided in + Section 4.3, no one other than the license steward has the + right to modify this License. + + 4.2. Effect of New Versions. + + You may always continue to use, distribute or otherwise + make the Covered Software available under the terms of the + version of the License under which You originally received + the Covered Software. If the Initial Developer includes a + notice in the Original Software prohibiting it from being + distributed or otherwise made available under any + subsequent version of the License, You must distribute and + make the Covered Software available under the terms of the + version of the License under which You originally received + the Covered Software. Otherwise, You may also choose to + use, distribute or otherwise make the Covered Software + available under the terms of any subsequent version of the + License published by the license steward. + + 4.3. Modified Versions. + + When You are an Initial Developer and You want to create a + new license for Your Original Software, You may create and + use a modified version of this License if You: (a) rename + the license and remove any references to the name of the + license steward (except to note that the license differs + from this License); and (b) otherwise make it clear that + the license contains terms which differ from this License. + + + 5. DISCLAIMER OF WARRANTY. + + COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN ÒAS ISÓ + BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, + INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED + SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR + PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND + PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY + COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE + INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF + ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF + WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS + DISCLAIMER. + + 6. TERMINATION. + + 6.1. This License and the rights granted hereunder will + terminate automatically if You fail to comply with terms + herein and fail to cure such breach within 30 days of + becoming aware of the breach. Provisions which, by their + nature, must remain in effect beyond the termination of + this License shall survive. + + 6.2. If You assert a patent infringement claim (excluding + declaratory judgment actions) against Initial Developer or + a Contributor (the Initial Developer or Contributor against + whom You assert such claim is referred to as ÒParticipantÓ) + alleging that the Participant Software (meaning the + Contributor Version where the Participant is a Contributor + or the Original Software where the Participant is the + Initial Developer) directly or indirectly infringes any + patent, then any and all rights granted directly or + indirectly to You by such Participant, the Initial + Developer (if the Initial Developer is not the Participant) + and all Contributors under Sections 2.1 and/or 2.2 of this + License shall, upon 60 days notice from Participant + terminate prospectively and automatically at the expiration + of such 60 day notice period, unless if within such 60 day + period You withdraw Your claim with respect to the + Participant Software against such Participant either + unilaterally or pursuant to a written agreement with + Participant. + + 6.3. In the event of termination under Sections 6.1 or 6.2 + above, all end user licenses that have been validly granted + by You or any distributor hereunder prior to termination + (excluding licenses granted to You by any distributor) + shall survive termination. + + 7. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE + INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF + COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE + LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR + CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT + LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK + STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL + INJURY RESULTING FROM SUCH PARTYÕS NEGLIGENCE TO THE EXTENT + APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO + NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR + CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT + APPLY TO YOU. + + 8. U.S. GOVERNMENT END USERS. + + The Covered Software is a Òcommercial item,Ó as that term is + defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of Òcommercial + computer softwareÓ (as that term is defined at 48 C.F.R. ¤ + 252.227-7014(a)(1)) and Òcommercial computer software + documentationÓ as such terms are used in 48 C.F.R. 12.212 (Sept. + 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 + through 227.7202-4 (June 1995), all U.S. Government End Users + acquire Covered Software with only those rights set forth herein. + This U.S. Government Rights clause is in lieu of, and supersedes, + any other FAR, DFAR, or other clause or provision that addresses + Government rights in computer software under this License. + + 9. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the + extent necessary to make it enforceable. This License shall be + governed by the law of the jurisdiction specified in a notice + contained within the Original Software (except to the extent + applicable law, if any, provides otherwise), excluding such + jurisdictionÕs conflict-of-law provisions. Any litigation + relating to this License shall be subject to the jurisdiction of + the courts located in the jurisdiction and venue specified in a + notice contained within the Original Software, with the losing + party responsible for costs, including, without limitation, court + costs and reasonable attorneysÕ fees and expenses. The + application of the United Nations Convention on Contracts for the + International Sale of Goods is expressly excluded. Any law or + regulation which provides that the language of a contract shall + be construed against the drafter shall not apply to this License. + You agree that You alone are responsible for compliance with the + United States export administration regulations (and the export + control laws and regulation of any other countries) when You use, + distribute or otherwise make available any Covered Software. + + 10. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or + indirectly, out of its utilization of rights under this License + and You agree to work with Initial Developer and Contributors to + distribute such responsibility on an equitable basis. Nothing + herein is intended or shall be deemed to constitute any admission + of liability. diff --git a/cddl/contrib/dtracetoolkit/Docs/oneliners.txt b/cddl/contrib/dtracetoolkit/Docs/oneliners.txt new file mode 100644 index 00000000000..fca2aa313e2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/oneliners.txt @@ -0,0 +1,81 @@ +# +# DTrace OneLiners +# + +DTrace One Liners, + +# New processes with arguments, +dtrace -n 'proc:::exec-success { trace(curpsinfo->pr_psargs); }' + +# Files opened by process name, +dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }' + +# Files created using creat() by process name, +dtrace -n 'syscall::creat*:entry { printf("%s %s",execname,copyinstr(arg0)); }' + +# Syscall count by process name, +dtrace -n 'syscall:::entry { @num[execname] = count(); }' + +# Syscall count by syscall, +dtrace -n 'syscall:::entry { @num[probefunc] = count(); }' + +# Syscall count by process ID, +dtrace -n 'syscall:::entry { @num[pid,execname] = count(); }' + +# Read bytes by process name, +dtrace -n 'sysinfo:::readch { @bytes[execname] = sum(arg0); }' + +# Write bytes by process name, +dtrace -n 'sysinfo:::writech { @bytes[execname] = sum(arg0); }' + +# Read size distribution by process name, +dtrace -n 'sysinfo:::readch { @dist[execname] = quantize(arg0); }' + +# Write size distribution by process name, +dtrace -n 'sysinfo:::writech { @dist[execname] = quantize(arg0); }' + +# Disk size by process ID, +dtrace -n 'io:::start { printf("%d %s %d",pid,execname,args[0]->b_bcount); }' + +# Disk size aggregation +dtrace -n 'io:::start { @size[execname] = quantize(args[0]->b_bcount); }' + +# Pages paged in by process name, +dtrace -n 'vminfo:::pgpgin { @pg[execname] = sum(arg0); }' + +# Minor faults by process name, +dtrace -n 'vminfo:::as_fault { @mem[execname] = sum(arg0); }' + +# Interrupts by CPU, +dtrace -n 'sdt:::interrupt-start { @num[cpu] = count(); }' + +# CPU cross calls by process name, +dtrace -n 'sysinfo:::xcalls { @num[execname] = count(); }' + +# Lock time by process name, +dtrace -n 'lockstat:::adaptive-block { @time[execname] = sum(arg1); }' + +# Lock distribution by process name, +dtrace -n 'lockstat:::adaptive-block { @time[execname] = quantize(arg1); }' + +# Kernel funtion calls by module +dtrace -n 'fbt:::entry { @calls[probemod] = count(); }' + +# Stack size for processes +dtrace -n 'sched:::on-cpu { @[execname] = max(curthread->t_procp->p_stksize);}' + +# Kill all top processes when they are invoked, +dtrace -wn 'syscall::exece:return /execname == "top"/ { raise(9); }' + + + +DTrace Longer One Liners, + +# New processes with arguments and time, +dtrace -qn 'syscall::exec*:return { printf("%Y %s\n",walltimestamp,curpsinfo->pr_psargs); }' + +# Successful signal details, +dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }' + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/Copyright b/cddl/contrib/dtracetoolkit/Examples/Copyright new file mode 100644 index 00000000000..d802fe9086b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/Copyright @@ -0,0 +1 @@ +The examples in this directory are copyright to their author. diff --git a/cddl/contrib/dtracetoolkit/Examples/Readme b/cddl/contrib/dtracetoolkit/Examples/Readme new file mode 100644 index 00000000000..762a3312abf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/Readme @@ -0,0 +1,21 @@ +Examples - Script demos, screenshots, and how to read the output + + This directory contains an example file per script in the DTraceToolkit. + + When I hear of a new performance tool or what not, the first thing I want + to see are screenshots. They illustrate, + + - generally what the tool is for + - many details and features, since the output is (supposed to be) + as intuitive as possible + - how to use the tool (command line usage) + + It is a rapid way to get a handle on what a tool generally is, and how + to start using it. The files in this directory serve that purpose. + + These are especially important now that the DTraceToolkit has over 200 + scripts. Flicking through these files and seeing the screenshots may + be the quickest way to find what you are after. + + Of course, don't forget to read the man pages and notes files too :) + diff --git a/cddl/contrib/dtracetoolkit/Examples/anonpgpid_example.txt b/cddl/contrib/dtracetoolkit/Examples/anonpgpid_example.txt new file mode 100644 index 00000000000..b505f3d1596 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/anonpgpid_example.txt @@ -0,0 +1,73 @@ +The following is a demonstration of the anonpgpid.d script, + + +Here we run it on a system that is implementing memory caps using the +resource capping daemon, "rcapd", + + # anonpgpid.d + Tracing... Hit Ctrl-C to end. + ^C + PID CMD D BYTES + 6215 bash R 8192 + 6215 bash W 126976 + 5809 rcapd R 245760 + 6222 memleak.pl R 974848 + 6222 memleak.pl W 3055616 + +The "memleak.pl" process consumes memory, and we can see above that it has +encountered both reads and writes to the physical swap device - it is being +paged out. A bash shell was also effected (which was in the same project that +rcapd was monitoring). + + + +The following is an ordinary system that is very low on memory, + + # anonpgpid.d + Tracing... Hit Ctrl-C to end. + ^C + PID CMD D BYTES + 18885 sendmail R 4096 + 18600 automountd R 4096 + 1 init R 4096 + 2456 inetd R 8192 + 18546 nscd R 8192 + 2400 bash R 12288 + 217 utmpd R 28672 + 221 ttymon R 32768 + 210 sac R 36864 + 18777 snmpd R 49152 + 18440 init R 49152 + 89 nscd R 61440 + 318 syslogd R 73728 + 487 snmpd R 81920 + 2453 inetd R 102400 + 165 in.routed R 131072 + 294 automountd R 135168 + 215 inetd R 135168 + 187 rpcbind R 204800 + 86 kcfd R 290816 + 7 svc.startd R 1015808 + 9 svc.configd R 1478656 + 2 pageout W 23453696 + +The "pageout" process is responsible for writing all the anonymous memory +pages to the physical swap device, and we can see from the above that it +has written 23 Mb. When processes access anonymous memory that has been +swapped out, a major fault occurs and the memory is paged back in; in this +case we can trace the process that was effected, and from the above we can +see that several processes have been effected by the memory pressure. +The most is "svc.configd", which needed to page back in 1.4 Mb of anonymous +memory. + + + +Sometimes anonpgpid.d doesn't help too much. Here we only have pageouts +to the physical swap device and no pageins, + + # anonpgpid.d + ^C + PID CMD D BYTES + 2 pageout W 61083648 + +Only pageout is identified. diff --git a/cddl/contrib/dtracetoolkit/Examples/bitesize_example.txt b/cddl/contrib/dtracetoolkit/Examples/bitesize_example.txt new file mode 100644 index 00000000000..dcc697d5070 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/bitesize_example.txt @@ -0,0 +1,74 @@ +In this example, bitesize.d was run for several seconds then Ctrl-C was hit. +As bitesize.d runs it records how processes on the system are accessing the +disks - in particular the size of the I/O operation. It is usually desirable +for processes to be requesting large I/O operations rather than taking many +small "bites". + +The final report highlights how processes performed. The find command mostly +read 1K blocks while the tar command was reading large blocks - both as +expected. + + # bitesize.d + Tracing... Hit Ctrl-C to end. + ^C + + PID CMD + 7110 -bash\0 + + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 2048 | 0 + 4096 |@@@@@@@@@@@@@ 1 + 8192 | 0 + + 7110 sync\0 + + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@ 1 + 2048 |@@@@@@@@@@ 2 + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 16384 | 0 + + 0 sched\0 + + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@ 1 + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 16384 | 0 + + 7109 find /\0 + + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1452 + 2048 |@@ 91 + 4096 | 33 + 8192 |@@ 97 + 16384 | 0 + + 3 fsflush\0 + + value ------------- Distribution ------------- count + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 449 + 16384 | 0 + + 7108 tar cf /dev/null /\0 + + value ------------- Distribution ------------- count + 256 | 0 + 512 | 70 + 1024 |@@@@@@@@@@ 1306 + 2048 |@@@@ 569 + 4096 |@@@@@@@@@ 1286 + 8192 |@@@@@@@@@@ 1403 + 16384 |@ 190 + 32768 |@@@ 396 + 65536 | 0 + + diff --git a/cddl/contrib/dtracetoolkit/Examples/connections_example.txt b/cddl/contrib/dtracetoolkit/Examples/connections_example.txt new file mode 100644 index 00000000000..e39d063113a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/connections_example.txt @@ -0,0 +1,23 @@ +The following is an example of connections. As inbound TCP connections are +established their details are printed out. This includes the UID, PID and +CMD of the server process that is listening on that port, + + # connections + UID PID CMD TYPE PORT IP_SOURCE + 0 242 inetd tcp 79 192.168.1.1 + 0 359 sshd tcp 22 192.168.1.1 + 100 1532 Xorg tcp 6000 192.168.1.1 + ^C + + +In another window snoop was running for comparison, + + # snoop 'tcp[13:1] = 0x02' + Using device /dev/rtls0 (promiscuous mode) + mars -> jupiter FINGER C port=56760 + mars -> jupiter TCP D=22 S=56761 Syn Seq=3264782212 Len=0 ... + mars -> jupiter XWIN C port=56763 + +snoop can already tell me that these connections are happening - but does not +print out details of the server that accepted the connection. + diff --git a/cddl/contrib/dtracetoolkit/Examples/cpudists_example.txt b/cddl/contrib/dtracetoolkit/Examples/cpudists_example.txt new file mode 100644 index 00000000000..aa8256b7b7a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/cpudists_example.txt @@ -0,0 +1,276 @@ +The following demonstrates the cpudists program. It prints distributions +of CPU time consumed by the Kernel, Idle thread, or Processes. + +Here we run cpudists for 5 seconds once, + +# ./cpudists 5 1 +2005 Apr 28 00:08:42, + KERNEL + value ------------- Distribution ------------- count + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1134 + 16384 |@@@@@@@@@ 344 + 32768 |@@@ 104 + 65536 | 3 + 131072 | 0 + 262144 | 1 + 524288 | 0 + 1048576 | 11 + 2097152 | 0 + + PROCESS + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@ 170 + 32768 |@@@@@@@@@@@@@@@@@@ 331 + 65536 |@@@@@@@@ 152 + 131072 |@ 17 + 262144 |@ 25 + 524288 |@ 13 + 1048576 | 4 + 2097152 | 9 + 4194304 | 0 + + IDLE + value ------------- Distribution ------------- count + 2097152 | 0 + 4194304 |@ 9 + 8388608 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 418 + 16777216 |@@@ 31 + 33554432 | 0 + +The value indicates the time in nanoseconds, the count the number of +runs for this length. + +From the above, we can see the kernel has run many times - but for short +intervals each time. Processes have taken fom 10 to 60 microseconds; +and when the idle thread runs it runs for some time - around 8 milliseconds +for each. + + + + +cpudists has a "-a" option for all processes, + +# ./cpudists -a 5 1 +2005 Apr 28 00:17:34, + mapping-daemon + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32768 |@@@@@@@@@@@@@ 1 + 65536 | 0 + + sendmail + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32768 | 0 + 65536 |@@@@@@@@@@@@@ 1 + 131072 | 0 + + nautilus + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32768 | 0 + 65536 |@@@@@@@@@@@@@ 1 + 131072 | 0 + + fmd + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32768 | 0 + 65536 |@@@@@@@@@@@@@ 1 + 131072 | 0 + + in.routed + value ------------- Distribution ------------- count + 65536 | 0 + 131072 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 262144 | 0 + + miniserv.pl + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32768 | 0 + 65536 | 0 + 131072 |@@@@@@@@@@@@@ 1 + 262144 | 0 + + xscreensaver + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@ 2 + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@ 2 + 131072 | 0 + +gnome-vfs-daemon + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@ 2 + 131072 | 0 + + gnome-panel + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@ 1 + 32768 |@@@@@@@@@@@@@@@@ 2 + 65536 | 0 + 131072 |@@@@@@@@@@@@@@@@ 2 + 262144 | 0 + + svc.startd + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 32768 |@@@@@@@@@@@ 4 + 65536 |@@@ 1 + 131072 | 0 + + nscd + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 25 + 32768 |@ 1 + 65536 | 0 + 131072 |@ 1 + 262144 | 0 + +gnome-netstatus- + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32768 | 0 + 65536 | 0 + 131072 | 0 + 262144 | 0 + 524288 | 0 + 1048576 |@@@@@@@@@@@@@ 1 + 2097152 | 0 + + mixer_applet2 + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@ 10 + 32768 |@@@@@@@@@@@@@@@@@ 19 + 65536 |@@@@@@@@@@@@@@ 16 + 131072 | 0 + + soffice.bin + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@ 7 + 32768 |@@@@@@@@@@@@@@@@@@@ 14 + 65536 |@@@@@@@@ 6 + 131072 | 0 + 262144 |@@@ 2 + 524288 | 0 + 1048576 | 0 + 2097152 |@ 1 + 4194304 | 0 + + dtrace + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@ 8 + 32768 | 0 + 65536 | 0 + 131072 | 0 + 262144 |@@@ 1 + 524288 |@@@@@@@@@ 3 + 1048576 | 0 + 2097152 |@@@ 1 + 4194304 | 0 + + Xorg + value ------------- Distribution ------------- count + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@ 15 + 131072 |@@@@@@@@ 6 + 262144 |@@@@@@@@@@@@ 9 + 524288 | 0 + + java_vm + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@ 101 + 32768 |@@@@@@@@@@@@@@@@ 84 + 65536 |@@@@ 20 + 131072 | 0 + + gnome-terminal + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@ 12 + 65536 |@@@@@@@@@@@ 8 + 131072 |@ 1 + 262144 | 0 + 524288 |@@@@@@@@@@@@ 9 + 1048576 | 0 + + acroread + value ------------- Distribution ------------- count + 8192 | 0 + 16384 | 1 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 188 + 65536 |@@@@@@@@ 47 + 131072 |@@ 10 + 262144 | 0 + + mozilla-bin + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@ 21 + 32768 |@@@@@ 13 + 65536 |@@@@@@@@@@@@@ 36 + 131072 |@@@@@@@ 19 + 262144 |@@@ 9 + 524288 |@@ 5 + 1048576 |@ 2 + 2097152 |@@ 5 + 4194304 | 0 + + KERNEL + value ------------- Distribution ------------- count + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 1085 + 16384 |@@@@@@@@@@@ 443 + 32768 |@@ 98 + 65536 | 5 + 131072 | 1 + 262144 | 1 + 524288 | 0 + 1048576 | 11 + 2097152 | 0 + + fsflush + value ------------- Distribution ------------- count + 131072 | 0 + 262144 |@@@@@@@ 1 + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 2097152 | 0 + 4194304 | 0 + 8388608 | 0 + 16777216 | 0 + 33554432 |@@@@@@@ 1 + 67108864 | 0 + + IDLE + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 | 1 + 2097152 | 0 + 4194304 |@ 13 + 8388608 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 411 + 16777216 |@@@ 31 + 33554432 | 0 + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/cputimes_example.txt b/cddl/contrib/dtracetoolkit/Examples/cputimes_example.txt new file mode 100644 index 00000000000..253a7a34bd6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/cputimes_example.txt @@ -0,0 +1,210 @@ +The following demonstrates running the cputimes program on an idle system. +We use an interval of 1 second and a count of 3, + + # ./cputimes 1 3 + 2005 Apr 27 23:37:58, + THREADS TIME (ns) + KERNEL 10795499 + PROCESS 20941091 + IDLE 970707443 + 2005 Apr 27 23:37:59, + THREADS TIME (ns) + KERNEL 8919418 + PROCESS 77446789 + IDLE 910555040 + 2005 Apr 27 23:38:00, + THREADS TIME (ns) + KERNEL 8615123 + PROCESS 78314246 + IDLE 810100417 + +In the above output, we can see a breakdown of CPU time into the catagories +KERNEL, PROCESS and IDLE. The time is measured in nanoseconds. Most of the +time is in the IDLE category, as the system is idle. Very little time +was spent serving the kernel. + + + + +In the following example, several programs are run to hog the CPUs, + + # ./cputimes 1 3 + 2005 Apr 27 23:40:58, + THREADS TIME (ns) + KERNEL 11398807 + PROCESS 992254664 + 2005 Apr 27 23:40:59, + THREADS TIME (ns) + KERNEL 9205260 + PROCESS 987561182 + 2005 Apr 27 23:41:00, + THREADS TIME (ns) + KERNEL 9196669 + PROCESS 877850474 + +Now there is no IDLE category, as the system is 100% utilised. +The programs were the following, + + while :; do :; done & + +which keeps the CPU busy. + + + + +In the following example a different style of program is run to hog the CPUs, + + while :; do date; done + +This causes many processes to be created and destroyed in a hurry, and can +be difficult to troubleshoot (tools like prstat cannot sample quick enough +to easily identify what is going on). The following is the cputimes output, + + # ./cputimes 1 3 + 2005 Apr 27 23:45:30, + THREADS TIME (ns) + KERNEL 192647392 + PROCESS 835397568 + 2005 Apr 27 23:45:31, + THREADS TIME (ns) + KERNEL 168773713 + PROCESS 810825730 + 2005 Apr 27 23:45:32, + THREADS TIME (ns) + KERNEL 151676122 + PROCESS 728477272 + +Now the kernel is doing a substantial amount of work to create and destroy +these processes. + + + + +In the following example, a large amount of network activity occurs while +cputimes is running, + + # ./cputimes 1 6 + 2005 Apr 27 23:49:29, + THREADS TIME (ns) + KERNEL 10596399 + PROCESS 21793920 + IDLE 974395713 + 2005 Apr 27 23:49:30, + THREADS TIME (ns) + KERNEL 251465759 + IDLE 357436576 + PROCESS 508986422 + 2005 Apr 27 23:49:31, + THREADS TIME (ns) + IDLE 9758227 + KERNEL 367645318 + PROCESS 385427847 + 2005 Apr 27 23:49:32, + THREADS TIME (ns) + IDLE 28351679 + KERNEL 436022725 + PROCESS 451304688 + 2005 Apr 27 23:49:33, + THREADS TIME (ns) + KERNEL 262586158 + PROCESS 325238896 + IDLE 358243503 + 2005 Apr 27 23:49:34, + THREADS TIME (ns) + KERNEL 10075578 + PROCESS 238170506 + IDLE 647956998 + +Initially the system is idle. A command is run to cause heavy network +activity, which peaks during the fourth sample - during which the kernel +is using around 40% of the CPU. The Solaris 10 command "intrstat" can +help to analyse this activity further. + + + + +Longer samples are possible. The following is a 60 second sample, + + # ./cputimes 60 1 + 2005 Apr 27 23:53:02, + THREADS TIME (ns) + KERNEL 689808449 + PROCESS 8529562214 + IDLE 50406951876 + # + + + + +cputimes has a "-a" option to print all processes. The following is a +single 1 second sample with -a, + + # ./cputimes -a 1 1 + 2005 Apr 28 00:00:32, + THREADS TIME (ns) + svc.startd 51042 + nautilus 130645 + in.routed 131823 + fmd 152822 + nscd 307042 + dsdm 415799 + mixer_applet2 551066 + gnome-smproxy 587234 + xscreensaver 672270 + fsflush 1060196 + java_vm 1552988 + wnck-applet 2060870 + dtrace 2398658 + acroread 2614687 + soffice.bin 2825117 + mozilla-bin 5497488 + KERNEL 13541120 + metacity 28924204 + gnome-terminal 74304348 + Xorg 289631407 + IDLE 465054209 + +The times are in nanoseconds, and multiple processes with the same name +have their times aggregated. The above output is at an amazing resolution - +svc.startd ran for 51 microseconds, and soffice.bin ran for 28 milliseconds. + + + + +The following is a 10 second sample on an idle desktop, + + # ./cputimes -a 10 1 + 2005 Apr 28 00:03:57, + THREADS TIME (ns) + snmpd 127859 + fmd 171897 + inetd 177134 + svc.configd 185006 + mapping-daemon 197674 + miniserv.pl 305603 + gconfd-2 330511 + xscreensaver 443207 + sendmail 473434 + nautilus 506799 + gnome-vfs-daemon 549037 + gnome-panel 770631 + nscd 885353 + svc.startd 1181286 + gnome-netstatus- 4329671 + mixer_applet2 4833519 + dtrace 6244366 + in.routed 6556075 + fsflush 9553155 + soffice.bin 13954327 + java_vm 16285243 + acroread 32126193 + gnome-terminal 34891991 + Xorg 35553412 + mozilla-bin 67855629 + KERNEL 94834997 + IDLE 9540941846 + +Wow, maybe not as idle as I thought! + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/cputypes_example.txt b/cddl/contrib/dtracetoolkit/Examples/cputypes_example.txt new file mode 100644 index 00000000000..158a43f1587 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/cputypes_example.txt @@ -0,0 +1,40 @@ +The following are demonstrations of the cputypes.d script, + + +This is running cputypes.d on a desktop, + + # cputypes.d + CPU CHIP PSET LGRP CLOCK TYPE FPU + 0 0 0 0 867 i386 i387 compatible + +fairly boring. + + + +The following is a multi CPU x86 server, + + # cputypes.d + CPU CHIP PSET LGRP CLOCK TYPE FPU + 0 0 0 0 2791 i386 i387 compatible + 1 3 1 0 2791 i386 i387 compatible + 2 0 0 0 2791 i386 i387 compatible + 3 3 0 0 2791 i386 i387 compatible + +Much more interesting! We can see from the CHIP field that there is actually +two CPUs, each with two cores. There is also two processor sets (0, 1). + +The CPUs were printed in CPU id order by mere chance. + + + +Here is a multi CPU SPARC server, + + # cputypes.d + CPU CHIP PSET LGRP CLOCK TYPE FPU + 0 0 0 0 400 sparcv9 sparcv9 + 1 1 0 0 400 sparcv9 sparcv9 + 4 4 0 0 400 sparcv9 sparcv9 + 5 5 0 0 400 sparcv9 sparcv9 + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/cpuwalk_example.txt b/cddl/contrib/dtracetoolkit/Examples/cpuwalk_example.txt new file mode 100644 index 00000000000..34afa959815 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/cpuwalk_example.txt @@ -0,0 +1,85 @@ +The following is a demonstration of the cpuwalk.d script, + + +cpuwalk.d is not that useful on a single CPU server, + + # cpuwalk.d + Sampling... Hit Ctrl-C to end. + ^C + + PID: 18843 CMD: bash + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 30 + 1 | 0 + + PID: 8079 CMD: mozilla-bin + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 1 | 0 + +The output above shows that PID 18843, "bash", was sampled on CPU 0 a total +of 30 times (we sample at 1000 hz). + + + +The following is a demonstration of running cpuwalk.d with a 5 second +duration. This is on a 4 CPU server running a multithreaded CPU bound +application called "cputhread", + + # cpuwalk.d 5 + Sampling... + + PID: 3 CMD: fsflush + + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 30 + 3 | 0 + + PID: 12186 CMD: cputhread + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@ 4900 + 1 |@@@@@@@@@@ 4900 + 2 |@@@@@@@@@@ 4860 + 3 |@@@@@@@@@@ 4890 + 4 | 0 + +As we are sampling at 1000 hz, the application cputhread is indeed running +concurrently across all available CPUs. We measured the applicaiton on +CPU 0 a total of 4900 times, on CPU 1 a total of 4900 times, etc. As there +are around 5000 samples per CPU available in this 5 second 1000 hz sample, +the application is using almost all the CPU capacity in this server well. + + + +The following is a similar demonstration, this time running a multithreaded +CPU bound application called "cpuserial" that has a poor use of locking +such that the threads "serialise", + + + # cpuwalk.d 5 + Sampling... + + PID: 12194 CMD: cpuserial + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@ 470 + 1 |@@@@@@ 920 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@ 3840 + 3 |@@@@@@ 850 + 4 | 0 + +In the above, we can see that this CPU bound application is not making +efficient use of the CPU resources available, only reaching 3840 samples +on CPU 2 out of a potential 5000. This problem was caused by a poor use +of locks. + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/crash_example.txt b/cddl/contrib/dtracetoolkit/Examples/crash_example.txt new file mode 100644 index 00000000000..f0034d3b74d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/crash_example.txt @@ -0,0 +1,68 @@ +The following is an example of the crashed application script, crash.d +This demonstration is for version 0.80 of crash.d, newer versions may +produce enhanced output. + +Here is the report generated as crash.d catches a crashing procmail process, + +# ./crash.d +Waiting for crashing applications... + +----------------------------------------------------- +CRASH DETECTED at 2005 May 30 19:41:34 +----------------------------------------------------- +Type: SIGSEGV +Program: procmail +Args: procmail -m\0 +PID: 2877 +TID: 1 +LWPs: 1 +PPID: 1778 +UID: 100 +GID: 1 +TaskID: 76 +ProjID: 3 +PoolID: 0 +ZoneID: 0 +zone: global +CWD: /usr/include/sys +errno: 0 + +User Stack Backtrace, + procmail`sendcomsat+0x24 + procmail`Terminate+0x76 + procmail`0x805a2b0 + procmail`0x805a40f + libc.so.1`__sighndlr+0xf + libc.so.1`call_user_handler+0x22b + libc.so.1`sigacthandler+0xbb + 0xffffffff + procmail`rread+0x1d + procmail`0x805bcb4 + procmail`read2blk+0x6b + procmail`readdyn+0x1f + procmail`readmail+0x181 + procmail`main+0x532 + procmail`_start+0x5d + +Kernel Stack Backtrace, + genunix`sigaddqa+0x3f + genunix`trapsig+0xdb + unix`trap+0xc2b + unix`_cmntrap+0x83 + +Ansestors, + 2877 procmail -m\0 + 1778 bash\0 + 1777 xterm -bg black -fg grey70 -sl 500 -vb\0 + 1 /sbin/init\0 + 0 sched\0 + +Times, + User: 0 ticks + Sys: 1 ticks + Elapsed: 3307 ms + +Sizes, + Heap: 16388 bytes + Stack: 8192 bytes + diff --git a/cddl/contrib/dtracetoolkit/Examples/creatbyproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/creatbyproc_example.txt new file mode 100644 index 00000000000..295e07ff2fb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/creatbyproc_example.txt @@ -0,0 +1,23 @@ +The following is an example of the creatbyproc.d script, + + +Here we run creatbyproc.d for several seconds, + + # ./creatbyproc.d + dtrace: script './creatbyproc.d' matched 2 probes + CPU ID FUNCTION:NAME + 0 5438 creat64:entry touch /tmp/newfile + 0 5438 creat64:entry sh /tmp/mpLaaOik + 0 5438 creat64:entry sh /dev/null + ^C + +In another window, the following commands were run, + + touch /tmp/newfile + man ls + +The file creation activity caused by these commands can be seen in the +output by creatbyproc.d + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/cswstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/cswstat_example.txt new file mode 100644 index 00000000000..d45347c64f3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/cswstat_example.txt @@ -0,0 +1,25 @@ +The following is an example of the cswstat.d script, + + # cswstat.d + TIME NUM CSWTIME AVGTIME + 2005 May 17 01:57:21 276 2407 8 + 2005 May 17 01:57:22 283 2251 7 + 2005 May 17 01:57:23 259 2098 8 + 2005 May 17 01:57:24 268 2169 8 + 2005 May 17 01:57:25 1248 10864 8 + 2005 May 17 01:57:26 2421 21263 8 + 2005 May 17 01:57:27 2183 19804 9 + 2005 May 17 01:57:28 1980 18640 9 + 2005 May 17 01:57:29 794 7422 9 + 2005 May 17 01:57:30 275 2233 8 + 2005 May 17 01:57:31 288 2338 8 + 2005 May 17 01:57:32 545 4154 7 + 2005 May 17 01:57:33 264 2149 8 + ^C + +In the above output, the average context switch time is 8 microseconds. +During the sample there was a burst of activity, increasing the number +of context switches per second from around 270 to over 2000. The time +consumed by all of these context switches in total is printed, peaking +at 21 ms. + diff --git a/cddl/contrib/dtracetoolkit/Examples/dappprof_example.txt b/cddl/contrib/dtracetoolkit/Examples/dappprof_example.txt new file mode 100644 index 00000000000..a2c3935939c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/dappprof_example.txt @@ -0,0 +1,71 @@ +The following is a demonstration of the dappprof command, + +This is the usage for version 0.60, + + # dappprof -h + USAGE: dappprof [-cehoTU] [-u lib] { -p PID | command } + + -p PID # examine this PID + -a # print all details + -c # print syscall counts + -e # print elapsed times (us) + -o # print on cpu times + -T # print totals + -u lib # trace this library instead + -U # trace all libraries + user funcs + -b bufsize # dynamic variable buf size + eg, + dappprof df -h # run and examine "df -h" + dappprof -p 1871 # examine PID 1871 + dappprof -ap 1871 # print all data + + + +The following shows running dappprof with the "banner hello" command. +Elapsed and on-cpu times are printed (-eo), as well as counts (-c) and +totals (-T), + + # dappprof -eocT banner hello + + # # ###### # # #### + # # # # # # # + ###### ##### # # # # + # # # # # # # + # # # # # # # + # # ###### ###### ###### #### + + + CALL COUNT + __fsr 1 + main 1 + banprt 1 + banner 1 + banset 1 + convert 5 + banfil 5 + TOTAL: 15 + + CALL ELAPSED + banset 37363 + banfil 147407 + convert 149606 + banprt 423507 + banner 891088 + __fsr 1694349 + TOTAL: 3343320 + + CALL CPU + banset 7532 + convert 8805 + banfil 11092 + __fsr 15708 + banner 48696 + banprt 388853 + TOTAL: 480686 + +The above output has analysed user functions (the default). It makes it +easy to identify which function is being called the most (COUNT), which +is taking the most time (ELAPSED), and which is consuming the most CPU (CPU). +These times are totals for all the functions called. + + diff --git a/cddl/contrib/dtracetoolkit/Examples/dapptrace_example.txt b/cddl/contrib/dtracetoolkit/Examples/dapptrace_example.txt new file mode 100644 index 00000000000..f19606ceca5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/dapptrace_example.txt @@ -0,0 +1,215 @@ +The following is a demonstration of the dapptrace command, + +This is the usage for version 0.60, + + # dapptrace -h + USAGE: dapptrace [-acdeholFLU] [-u lib] { -p PID | command } + + -p PID # examine this PID + -a # print all details + -c # print syscall counts + -d # print relative times (us) + -e # print elapsed times (us) + -F # print flow indentation + -l # print pid/lwpid + -o # print CPU on cpu times + -u lib # trace this library instead + -U # trace all libraries + user funcs + -b bufsize # dynamic variable buf size + eg, + dapptrace df -h # run and examine "df -h" + dapptrace -p 1871 # examine PID 1871 + dapptrace -Fp 1871 # print using flow indents + dapptrace -eop 1871 # print elapsed and CPU times + + + +The following is an example of the default output. We run dapptrace with +the "banner hello" command, + + # dapptrace banner hi + + # # # + # # # + ###### # + # # # + # # # + # # # + + CALL(args) = return + -> __fsr(0x2, 0x8047D7C, 0x8047D88) + <- __fsr = 122 + -> main(0x2, 0x8047D7C, 0x8047D88) + -> banner(0x8047E3B, 0x80614C2, 0x8047D38) + -> banset(0x20, 0x80614C2, 0x8047DCC) + <- banset = 36 + -> convert(0x68, 0x8047DCC, 0x2) + <- convert = 319 + -> banfil(0x8061412, 0x80614C2, 0x8047DCC) + <- banfil = 57 + -> convert(0x69, 0x8047DCC, 0x2) + <- convert = 319 + -> banfil(0x8061419, 0x80614CA, 0x8047DCC) + <- banfil = 57 + <- banner = 118 + -> banprt(0x80614C2, 0x8047D38, 0xD27FB824) + <- banprt = 74 + +The default output shows user function calls. An entry is prefixed +with a "->", and the return has a "<-". + + + +Here we run dapptrace with the -F for flow indent option, + + # dapptrace -F banner hi + + # # # + # # # + ###### # + # # # + # # # + # # # + + CALL(args) = return + -> __fsr(0x2, 0x8047D7C, 0x8047D88) + <- __fsr = 122 + -> main(0x2, 0x8047D7C, 0x8047D88) + -> banner(0x8047E3B, 0x80614C2, 0x8047D38) + -> banset(0x20, 0x80614C2, 0x8047DCC) + <- banset = 36 + -> convert(0x68, 0x8047DCC, 0x2) + <- convert = 319 + -> banfil(0x8061412, 0x80614C2, 0x8047DCC) + <- banfil = 57 + -> convert(0x69, 0x8047DCC, 0x2) + <- convert = 319 + -> banfil(0x8061419, 0x80614CA, 0x8047DCC) + <- banfil = 57 + <- banner = 118 + -> banprt(0x80614C2, 0x8047D38, 0xD27FB824) + <- banprt = 74 + +The above output illustrates the flow of the program, which functions +call which other functions. + + + +Now the same command is run with -d to display relative timestamps, + + # dapptrace -dF banner hi + + # # # + # # # + ###### # + # # # + # # # + # # # + + RELATIVE CALL(args) = return + 2512 -> __fsr(0x2, 0x8047D7C, 0x8047D88) + 2516 <- __fsr = 122 + 2518 -> main(0x2, 0x8047D7C, 0x8047D88) + 2863 -> banner(0x8047E3B, 0x80614C2, 0x8047D38) + 2865 -> banset(0x20, 0x80614C2, 0x8047DCC) + 2872 <- banset = 36 + 2874 -> convert(0x68, 0x8047DCC, 0x2) + 2877 <- convert = 319 + 2879 -> banfil(0x8061412, 0x80614C2, 0x8047DCC) + 2882 <- banfil = 57 + 2883 -> convert(0x69, 0x8047DCC, 0x2) + 2885 <- convert = 319 + 2886 -> banfil(0x8061419, 0x80614CA, 0x8047DCC) + 2888 <- banfil = 57 + 2890 <- banner = 118 + 2892 -> banprt(0x80614C2, 0x8047D38, 0xD27FB824) + 3214 <- banprt = 74 + +The relative times are in microseconds since the program's invocation. Great! + + + +Even better is if we use the -eo options, to print elapsed times and on-cpu +times, + + # dapptrace -eoF banner hi + + # # # + # # # + ###### # + # # # + # # # + # # # + + ELAPSD CPU CALL(args) = return + . . -> __fsr(0x2, 0x8047D7C, 0x8047D88) + 41 4 <- __fsr = 122 + . . -> main(0x2, 0x8047D7C, 0x8047D88) + . . -> banner(0x8047E3B, 0x80614C2, 0x8047D38) + . . -> banset(0x20, 0x80614C2, 0x8047DCC) + 29 6 <- banset = 36 + . . -> convert(0x68, 0x8047DCC, 0x2) + 26 3 <- convert = 319 + . . -> banfil(0x8061412, 0x80614C2, 0x8047DCC) + 25 2 <- banfil = 57 + . . -> convert(0x69, 0x8047DCC, 0x2) + 23 1 <- convert = 319 + . . -> banfil(0x8061419, 0x80614CA, 0x8047DCC) + 23 1 <- banfil = 57 + 309 28 <- banner = 118 + . . -> banprt(0x80614C2, 0x8047D38, 0xD27FB824) + 349 322 <- banprt = 74 + +Now it is easy to see which functions take the longest (elapsed), and +which consume the most CPU cycles. + + + +The following demonstrates the -U option, to trace all libraries, + + # dapptrace -U banner hi + + # # # + # # # + ###### # + # # # + # # # + # # # + + CALL(args) = return + -> ld.so.1:_rt_boot(0x8047E34, 0x8047E3B, 0x0) + -> ld.so.1:_setup(0x8047D38, 0x20AE4, 0x3) + -> ld.so.1:setup(0x8047D88, 0x8047DCC, 0x0) + -> ld.so.1:fmap_setup(0x0, 0xD27FB2E4, 0xD27FB824) + <- ld.so.1:fmap_setup = 125 + -> ld.so.1:addfree(0xD27FD3C0, 0xC40, 0x0) + <- ld.so.1:addfree = 65 + -> ld.so.1:security(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF) + <- ld.so.1:security = 142 + -> ld.so.1:readenv_user(0x8047D88, 0xD27FB204, 0xD27FB220) + -> ld.so.1:ld_str_env(0x8047E3E, 0xD27FB204, 0xD27FB220) + <- ld.so.1:ld_str_env = 389 + -> ld.so.1:ld_str_env(0x8047E45, 0xD27FB204, 0xD27FB220) + <- ld.so.1:ld_str_env = 389 + -> ld.so.1:ld_str_env(0x8047E49, 0xD27FB204, 0xD27FB220) + <- ld.so.1:ld_str_env = 389 + -> ld.so.1:ld_str_env(0x8047E50, 0xD27FB204, 0xD27FB220) + -> ld.so.1:strncmp(0x8047E53, 0xD27F7BEB, 0x4) + <- ld.so.1:strncmp = 113 + -> ld.so.1:rd_event(0xD27FB1F8, 0x3, 0x0) + [...4486 lines deleted...] + -> ld.so.1:_lwp_mutex_unlock(0xD27FD380, 0xD27FB824, 0x8047C04) + <- ld.so.1:_lwp_mutex_unlock = 47 + <- ld.so.1:rt_mutex_unlock = 34 + -> ld.so.1:rt_bind_clear(0x1, 0xD279ECC0, 0xD27FDB2C) + <- ld.so.1:rt_bind_clear = 34 + <- ld.so.1:leave = 210 + <- ld.so.1:elf_bndr = 803 + <- ld.so.1:elf_rtbndr = 35 + +The output was huge, around 4500 lines long. Function names are prefixed +with their library name, eg "ld.so.1". + +This full output should be used with caution, as it enables so many probes +it could well be a burden on the system. + diff --git a/cddl/contrib/dtracetoolkit/Examples/dexplorer_example.txt b/cddl/contrib/dtracetoolkit/Examples/dexplorer_example.txt new file mode 100644 index 00000000000..cba6171c350 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/dexplorer_example.txt @@ -0,0 +1,95 @@ +The following is a demonstration of the dexplorer program. + + +Here we run dexplorer with no arguments. By default it will sample various +system activities using DTrace at 5 seconds per sample. It creates an +output tar.gz file containing all the DTrace output, + + # dexplorer + Output dir will be the current dir (/export/home/root/DTrace/Dexplorer). + Hit enter for yes, or type path: + Starting dexplorer ver 0.70. + Sample interval is 5 seconds. Total run is > 100 seconds. + 0% Interrupts by CPU... + 5% Interrupt counts... + 10% Dispatcher queue length by CPU... + 15% Sdt counts... + 20% Pages paged in by process name... + 25% Files opened count... + 30% Disk I/O size distribution by process name... + 35% Minor faults by process name... + 40% Vminfo data by process name... + 45% Mib data by mib statistic... + 50% TCP write bytes by process... + 55% Sample process @ 1000 Hz... + 60% Syscall count by process name... + 65% Syscall count by syscall... + 70% Read bytes by process name... + 75% Write bytes by process name... + 80% Sysinfo counts by process name... + 85% New process counts with arguments... + 90% Signal counts... + 95% Syscall error counts... + 100% Done. + File is de_jupiter_200506271803.tar.gz + +As each sample is taken, a line of output is printed above. The above example +is for version 0.70, newer versions of dexplorer are likely to print more +lines as they take more samples. + +The final line states which file all the output is now in. + + + + +The following displays the contents of a dexplorer file, + + # gunzip de_jupiter_200506271803.tar.gz + # tar xf de_jupiter_200506271803.tar + de_jupiter_200506271803 + de_jupiter_200506271803/Cpu + de_jupiter_200506271803/Cpu/interrupt_by_cpu + de_jupiter_200506271803/Cpu/interrupt_time + de_jupiter_200506271803/Cpu/dispqlen_by_cpu + de_jupiter_200506271803/Cpu/sdt_count + de_jupiter_200506271803/Disk + de_jupiter_200506271803/Disk/pgpgin_by_processname + de_jupiter_200506271803/Disk/fileopen_count + de_jupiter_200506271803/Disk/sizedist_by_processname + de_jupiter_200506271803/Mem + de_jupiter_200506271803/Mem/minf_by_processname + de_jupiter_200506271803/Mem/vminfo_by_processname + de_jupiter_200506271803/Net + de_jupiter_200506271803/Net/mib_data + de_jupiter_200506271803/Net/tcpw_by_process + de_jupiter_200506271803/Proc + de_jupiter_200506271803/Proc/sample_process + de_jupiter_200506271803/Proc/syscall_by_processname + de_jupiter_200506271803/Proc/syscall_count + de_jupiter_200506271803/Proc/readb_by_processname + de_jupiter_200506271803/Proc/writeb_by_processname + de_jupiter_200506271803/Proc/sysinfo_by_processname + de_jupiter_200506271803/Proc/newprocess_count + de_jupiter_200506271803/Proc/signal_count + de_jupiter_200506271803/Proc/syscall_errors + de_jupiter_200506271803/Info + de_jupiter_200506271803/Info/uname-a + de_jupiter_200506271803/Info/psrinfo-v + de_jupiter_200506271803/Info/prtconf + de_jupiter_200506271803/Info/df-k + de_jupiter_200506271803/Info/ifconfig-a + de_jupiter_200506271803/Info/ps-o + de_jupiter_200506271803/Info/uptime + de_jupiter_200506271803/log + + + +The following demonstrates running dexplorer in full quiet mode, + + # dexplorer -qy -d /var/tmp + # + +No text is written to the screen (-qy). The output file will have been +put in /var/tmp (-d). + + diff --git a/cddl/contrib/dtracetoolkit/Examples/diskhits_example.txt b/cddl/contrib/dtracetoolkit/Examples/diskhits_example.txt new file mode 100644 index 00000000000..6fe3a859a97 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/diskhits_example.txt @@ -0,0 +1,107 @@ +The following is a demonstration of the diskhits command. + + +Here we run diskhits on a large file, /extra1/contents with is 46 Mb, and +currently hasn't been accessed (so isn't in any cache). + +While diskhits is running, the file is grep'd in another window. This causes +the entire file to be read, + + # ./diskhits /extra1/contents + Tracing... Hit Ctrl-C to end. + ^C + Location (KB), + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@ 47 + 2303 |@@ 41 + 4606 |@@ 41 + 6909 |@@ 42 + 9212 |@@ 41 + 11515 |@@ 41 + 13818 |@@ 42 + 16121 |@@ 43 + 18424 |@@ 42 + 20727 |@@ 41 + 23030 |@@ 41 + 25333 |@@ 41 + 27636 |@@ 41 + 29939 |@@ 42 + 32242 |@@ 44 + 34545 |@@ 41 + 36848 |@@ 41 + 39151 |@@ 41 + 41454 |@@ 41 + 43757 |@@ 40 + >= 46060 | 0 + + Size (KB), + + value ------------- Distribution ------------- count + 4 | 0 + 8 | 6 + 16 | 10 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 818 + 64 | 0 + + Total RW: 46064 KB + +Ok, so the file was read evently with each access around 32 to 63 Kb in size, +and a total of 46 Mb read. This all makes sense, as it is reading the file +for the first time. + + + +Now the same file is grep'd with diskhits running, this time we can see what +effect caching the file has made, + + # ./diskhits /extra1/contents + Tracing... Hit Ctrl-C to end. + ^C + Location (KB), + + value ------------- Distribution ------------- count + 2303 | 0 + 4606 | 5 + 6909 |@ 67 + 9212 |@@@@ 170 + 11515 |@@@@@ 216 + 13818 |@@@@@ 224 + 16121 |@@@@@@ 287 + 18424 |@@@@@ 227 + 20727 |@@@ 144 + 23030 |@@ 75 + 25333 |@ 59 + 27636 |@ 42 + 29939 |@ 41 + 32242 |@ 44 + 34545 |@ 41 + 36848 |@ 41 + 39151 |@ 41 + 41454 |@ 41 + 43757 |@ 39 + >= 46060 | 0 + + Size (KB), + + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@ 1137 + 8 |@@@@@ 211 + 16 |@@ 111 + 32 |@@@@@@@@ 345 + 64 | 0 + + Total RW: 29392 KB + +The difference is dramatic. This time only 29 Mb is read, leaving around +17 Mb that was read from the cache. The way the file is read differs - +in the later half of the file it looks the same, but in the first half there +are many more events; oddly enough, this is because the early part of the +file is cached more, the extra events are likely to be much smaller in size - +as indicated in the difference in the size distribution. + +It appears that everything less that 4606 Kb has remained in the cache, with +zero hits for that range. + diff --git a/cddl/contrib/dtracetoolkit/Examples/dispqlen_example.txt b/cddl/contrib/dtracetoolkit/Examples/dispqlen_example.txt new file mode 100644 index 00000000000..f3542c00ea8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/dispqlen_example.txt @@ -0,0 +1,62 @@ +This is a demonstration of the dispqlen.d script, + + +Here we run it on a single CPU desktop, + + # dispqlen.d + Sampling... Hit Ctrl-C to end. + ^C + CPU 0 + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1790 + 1 |@@@ 160 + 2 | 10 + 3 | 0 + +The output shows the length of the dispatcher queue is mostly 0. This is +evidence that the CPU is not very saturated. It does not indicate that the +CPU is idle - as we are measuring the length of the queue, not what is +on the CPU. + + + +Here it is run on a multi CPU server, + + # dispqlen.d + Sampling... Hit Ctrl-C to end. + ^C + CPU 1 + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1573 + 1 |@@@@@@@@@ 436 + 2 | 4 + 3 | 0 + + CPU 4 + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@ 1100 + 1 |@@@@@@@@@@@@@@@@@@ 912 + 2 | 1 + 3 | 0 + + CPU 0 + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@@ 846 + 1 |@@@@@@@@@@@@@@@@@@@@@@@ 1167 + 2 | 0 + + CPU 5 + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@ 397 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1537 + 2 |@@ 79 + 3 | 0 + +The above output shows that threads are queueing up on CPU 5 much more than +CPU 0. + diff --git a/cddl/contrib/dtracetoolkit/Examples/dnlcps_example.txt b/cddl/contrib/dtracetoolkit/Examples/dnlcps_example.txt new file mode 100644 index 00000000000..eed35b41f70 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/dnlcps_example.txt @@ -0,0 +1,47 @@ +The following is a demonstration of the dnlcps.d script. + + +Here we run dnlcps.d for o few seconds, then hit Ctrl-C, + + # dnlcps.d + Tracing... Hit Ctrl-C to end. + ^C + CMD: bash PID: 12508 + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@ 2 + >= 1 |@@@@@@@@@@@@@@@@@@@@@@@@ 3 + + CMD: nscd PID: 109 + + value ------------- Distribution ------------- count + 0 | 0 + >= 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + + CMD: in.routed PID: 143 + + value ------------- Distribution ------------- count + 0 | 0 + >= 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 12 + + CMD: ls PID: 12508 + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@ 2 + >= 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22 + + CMD: find PID: 12507 + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@ 5768 + >= 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 11263 + +A "find" command was running at the time, which had 11,263 hits on the DNLC +and 5768 misses. An "ls" command scored 22 hits. + +The above distribution output can help us identify if procesess +are both using the DNLC a lot, and what hit rate they are scoring. + diff --git a/cddl/contrib/dtracetoolkit/Examples/dnlcsnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/dnlcsnoop_example.txt new file mode 100644 index 00000000000..45915f1088b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/dnlcsnoop_example.txt @@ -0,0 +1,88 @@ +The following is a demonstration of the dnlcsnoop.d script. + + +Here we run dnlcsnoop.d, while in another window a "find /etc/default" +command is executed, + + # dnlcsnoop.d + PID CMD TIME HIT PATH + 9185 bash 9 Y /etc + 9185 bash 3 Y /etc + 12293 bash 9 Y /usr + 12293 bash 3 Y /usr/bin + 12293 bash 4 Y /usr/bin/find + 12293 bash 7 Y /lib + 12293 bash 3 Y /lib/ld.so.1 + 12293 find 6 Y /usr + 12293 find 3 Y /usr/bin + 12293 find 3 Y /usr/bin/find + 12293 find 3 Y /usr + 12293 find 3 Y /usr/lib + 12293 find 3 Y /usr/lib/ld.so.1 + 12293 find 3 Y /usr/lib/.. + 12293 find 3 Y /usr/.. + 12293 find 3 Y /lib + 12293 find 3 Y /lib/ld.so.1 + 12293 find 3 Y /usr + 12293 find 3 Y /usr/bin + 12293 find 2 Y /usr/bin/find + 12293 find 4 Y /var + 12293 find 3 Y /var/ld + 12293 find 3 Y /var/ld/ld.config + 12293 find 3 Y /lib + 12293 find 3 Y /lib/libc.so.1 + 12293 find 3 Y /lib + 12293 find 3 Y /lib/libc.so.1 + 12293 find 3 Y /lib + 12293 find 3 Y /lib/libc.so.1 + 12293 find 8 Y /export + 12293 find 4 Y /export/home + 12293 find 3 Y /export/home/root + 12293 find 4 Y /export/home/root/CacheKit-0.93 + 12293 find 3 Y /export + 12293 find 3 Y /export/home + 12293 find 3 Y /export/home/root + 12293 find 3 Y /export/home/root/CacheKit-0.93 + 12293 find 3 Y /etc + 12293 find 3 Y /etc/default + 12293 find 3 Y /etc + 12293 find 3 Y /etc/default + 12293 find 5 N /etc/default/cron + 12293 find 3 N /etc/default/devfsadm + 12293 find 4 N /etc/default/fs + 12293 find 4 N /etc/default/kbd + 12293 find 3 N /etc/default/keyserv + 12293 find 4 N /etc/default/nss + 12293 find 3 N /etc/default/syslogd + 12293 find 3 N /etc/default/tar + 12293 find 4 N /etc/default/utmpd + 12293 find 5 N /etc/default/init + 12293 find 4 Y /etc/default/login + 12293 find 4 Y /etc/default/su + 12293 find 3 N /etc/default/passwd + 12293 find 3 N /etc/default/dhcpagent + 12293 find 4 N /etc/default/inetinit + 12293 find 3 N /etc/default/ipsec + 12293 find 3 N /etc/default/mpathd + 12293 find 3 N /etc/default/telnetd + 12293 find 3 Y /etc/default/nfs + 12293 find 3 N /etc/default/autofs + 12293 find 9 Y /etc/default/ftp + 12293 find 5 N /etc/default/rpc.nisd + 12293 find 5 N /etc/default/nfslogd + 12293 find 4 N /etc/default/lu + 12293 find 6 N /etc/default/power + 12293 find 5 N /etc/default/sys-suspend + 12293 find 6 N /etc/default/metassist.xml + 12293 find 5 N /etc/default/yppasswdd + 12293 find 4 N /etc/default/webconsole + 12293 find 5 Y /export + 12293 find 4 Y /export/home + 12293 find 4 Y /export/home/root + 12293 find 4 Y /export/home/root/CacheKit-0.93 + +The DNLC is the Directory Name Lookup Cache. Here we can see name lookups, +and whether the cache returned a hit. "/export/home/root/CacheKit-0.93" was +looked up a few times - this was the current directory that the find +command was executed from. + diff --git a/cddl/contrib/dtracetoolkit/Examples/dnlcstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/dnlcstat_example.txt new file mode 100644 index 00000000000..a6ce1d6ec3d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/dnlcstat_example.txt @@ -0,0 +1,40 @@ +The following is a demonstration of the dnlcstat command. + + +Here we run dnlcstat with no options. It prints a line every second, + + # dnlcstat + dnlc %hit hit miss + 0 0 0 + 0 0 0 + 93 95 7 + 89 1920 231 + 89 2130 243 + 91 2358 232 + 92 1476 124 + 92 1953 159 + 94 2416 134 + 94 1962 114 + 95 2113 101 + 97 1969 54 + 98 1489 26 + 41 564 786 + 40 622 913 + 35 520 952 + 27 937 2503 + 22 1696 5806 + 22 955 3281 + 21 1377 5059 + 31 2043 4516 + 22 1423 4968 + 13 550 3438 + 2 95 3810 + 0 58 6410 + 4 223 4433 + 4 198 4491 + 7 339 4383 + +In another window, a "find /" was run. We can see the DNLC activity above, +initially there are high hit rates in the DNLC - over 90%. Eventually +the find command exhausts the DNLC, and the hit rate drops to below 10%. + diff --git a/cddl/contrib/dtracetoolkit/Examples/dtruss_example.txt b/cddl/contrib/dtracetoolkit/Examples/dtruss_example.txt new file mode 100644 index 00000000000..107fc197842 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/dtruss_example.txt @@ -0,0 +1,120 @@ +The following demonstrates the dtruss command - a DTrace version of truss. +This version is designed to be less intrusive and safer than running truss. + +dtruss has many options. Here is the help for version 0.70, + + USAGE: dtruss [-acdefholL] [-t syscall] { -p PID | -n name | command } + + -p PID # examine this PID + -n name # examine this process name + -t syscall # examine this syscall only + -a # print all details + -c # print syscall counts + -d # print relative times (us) + -e # print elapsed times (us) + -f # follow children + -l # force printing pid/lwpid + -o # print on cpu times + -L # don't print pid/lwpid + -b bufsize # dynamic variable buf size + eg, + dtruss df -h # run and examine "df -h" + dtruss -p 1871 # examine PID 1871 + dtruss -n tar # examine all processes called "tar" + dtruss -f test.sh # run test.sh and follow children + + + +For example, here we dtruss any process with the name "ksh" - the Korn shell, + + # dtruss -n ksh + PID/LWP SYSCALL(args) = return + 27547/1: llseek(0x3F, 0xE4E, 0x0) = 3662 0 + 27547/1: read(0x3F, "\0", 0x400) = 0 0 + 27547/1: llseek(0x3F, 0x0, 0x0) = 3662 0 + 27547/1: write(0x3F, "ls -l\n\0", 0x8) = 8 0 + 27547/1: fdsync(0x3F, 0x10, 0xFEC1D444) = 0 0 + 27547/1: lwp_sigmask(0x3, 0x20000, 0x0) = 0xFFBFFEFF 0 + 27547/1: stat64("/usr/bin/ls\0", 0x8047A00, 0xFEC1D444) = 0 0 + 27547/1: lwp_sigmask(0x3, 0x0, 0x0) = 0xFFBFFEFF 0 + [...] + +The output for each system call does not yet evaluate as much as truss does. + + + +In the following example, syscall elapsed and overhead times are measured. +Elapsed times represent the time from syscall start to finish; overhead +times measure the time spent on the CPU, + + # dtruss -eon bash + PID/LWP ELAPSD CPU SYSCALL(args) = return + 3911/1: 41 26 write(0x2, "l\0", 0x1) = 1 0 + 3911/1: 1001579 43 read(0x0, "s\0", 0x1) = 1 0 + 3911/1: 38 26 write(0x2, "s\0", 0x1) = 1 0 + 3911/1: 1019129 43 read(0x0, " \001\0", 0x1) = 1 0 + 3911/1: 38 26 write(0x2, " \0", 0x1) = 1 0 + 3911/1: 998533 43 read(0x0, "-\0", 0x1) = 1 0 + 3911/1: 38 26 write(0x2, "-\001\0", 0x1) = 1 0 + 3911/1: 1094323 42 read(0x0, "l\0", 0x1) = 1 0 + 3911/1: 39 27 write(0x2, "l\001\0", 0x1) = 1 0 + 3911/1: 1210496 44 read(0x0, "\r\0", 0x1) = 1 0 + 3911/1: 40 28 write(0x2, "\n\001\0", 0x1) = 1 0 + 3911/1: 9 1 lwp_sigmask(0x3, 0x2, 0x0) = 0xFFBFFEFF 0 + 3911/1: 70 63 ioctl(0x0, 0x540F, 0x80F6D00) = 0 0 + +A bash command was in another window, where the "ls -l" command was being +typed. The keystrokes can be seen above, along with the long elapsed times +(keystroke delays), and short overhead times (as the bash process blocks +on the read and leaves the CPU). + + + +Now dtruss is put to the test. Here we truss a test program that runs several +hundred smaller programs, which in turn generate thousands of system calls. + +First, as a "control" we run the program without a truss or dtruss running, + + # time ./test + real 0m38.508s + user 0m5.299s + sys 0m25.668s + +Now we try truss, + + # time truss ./test 2> /dev/null + real 0m41.281s + user 0m0.558s + sys 0m1.351s + +Now we try dtruss, + + # time dtruss ./test 2> /dev/null + real 0m46.226s + user 0m6.771s + sys 0m31.703s + +In the above test, truss slowed the program from 38 seconds to 41. dtruss +slowed the program from 38 seconds to 46, slightly slower that truss... + +Now we try follow mode "-f". The test program does run several hundred +smaller programs, so now there are plenty more system calls to track, + + # time truss -f ./test 2> /dev/null + real 2m28.317s + user 0m0.893s + sys 0m3.527s + +Now we try dtruss, + + # time dtruss -f ./test 2> /dev/null + real 0m56.179s + user 0m10.040s + sys 0m38.185s + +Wow, the difference is huge! truss slows the program from 38 to 148 seconds; +but dtruss has only slowed the program from 38 to 56 seconds. + + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/dvmstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/dvmstat_example.txt new file mode 100644 index 00000000000..1fb7fbb739d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/dvmstat_example.txt @@ -0,0 +1,91 @@ +The following is a demonstration of the dvmstat program, + + +Here we run dvmstat to monitor all processes called "find". In another +window, a "find /" command is run, + + # dvmstat -n find + re maj mf fr epi epo api apo fpi fpo sy + 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 + 6336 0 372 0 0 0 0 0 0 0 22255 + 1624 0 0 0 0 0 0 0 0 0 5497 + 2292 0 0 0 0 0 0 0 0 0 7715 + 13064 0 0 0 0 0 0 0 0 0 43998 + 7972 168 0 0 0 0 0 0 168 0 38361 + 468 636 0 0 0 0 0 0 636 0 13774 + 376 588 0 0 0 0 0 0 588 0 10723 + 80 636 0 0 0 0 0 0 656 0 11078 + 48 772 0 0 0 0 0 0 812 0 9841 + 16 1028 0 0 0 0 0 0 1056 0 10752 + 0 1712 0 0 0 0 0 0 1740 0 12176 + 4 1224 0 0 0 0 0 0 1236 0 9024 + +The output above is spectacular! When the find command is first run, +it begins be reading data from the file cache, as indicated by the "re" +reclaims, and a lack of "fpi" filesystem page ins. + +Eventually the find command travels to places which are not cached, we can +see the "re" value drops, and both the "maj" major faults and "fpi" values +increase. This transition from cache hits to file system activity is +very clear from the above output. + + + +Here we run a dvmstat to examine the PID 3778, + + # dvmstat -p 3778 + re maj mf fr epi epo api apo fpi fpo sy + 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 + 24 28 0 0 0 0 0 0 28 0 109 + 4 148 16 0 0 0 0 0 148 0 1883 + 16 412 384 0 0 0 0 0 412 0 21019 + 0 0 0 0 0 0 0 0 0 0 3 + 0 0 0 0 0 0 0 0 0 0 221 + 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 84 + 0 0 0 0 0 0 0 0 0 0 0 + +Here we can see the statistics for that process only. + + + +The following runs the date command through dvmstat, + + # dvmstat date + Sun Jun 12 17:44:24 EST 2005 + re maj mf fr epi epo api apo fpi fpo sy + 16 0 208 0 0 0 0 0 0 0 38 + +The values above are for the date command only. + + + +Now we run dvmstat on a tar command. Here we tar around 50Mb of files, +so the command takes around 20 seconds to complete, + + # dvmstat tar cf backup.tar DTrace + re maj mf fr epi epo api apo fpi fpo sy + 20 256 304 0 8 0 0 0 352 0 621 + 4540 56 896 0 0 0 0 0 4636 0 1005 + 4432 12 644 0 0 0 0 0 4384 0 906 + 680 180 136 0 8 0 0 0 1056 0 502 + 2328 60 468 0 0 0 0 0 2296 0 592 + 1300 380 272 0 0 0 0 0 1704 0 1095 + 2816 72 560 0 0 0 0 0 2940 0 709 + 4084 40 416 0 0 0 0 0 4220 0 894 + 2764 4 276 0 0 0 0 0 2700 0 566 + 1824 96 328 0 0 0 0 0 2072 0 556 + 3408 80 392 0 20 0 0 0 3496 0 857 + 2804 92 552 0 4 0 0 0 2924 0 741 + 1344 16 272 0 0 0 0 0 1376 0 289 + 3284 52 520 0 12 0 0 0 3260 0 743 + 4832 200 812 0 0 0 0 0 5292 0 1276 + 11052 56 2200 0 0 0 0 0 8676 0 2326 + 5256 328 1020 0 8 0 0 0 4404 0 1725 + re maj mf fr epi epo api apo fpi fpo sy + 404 340 72 0 64 0 0 0 536 0 1135 + +Great! Activity from the tar command such as "fpi"s can be clearly seen. + diff --git a/cddl/contrib/dtracetoolkit/Examples/errinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/errinfo_example.txt new file mode 100644 index 00000000000..1dcb28d29db --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/errinfo_example.txt @@ -0,0 +1,90 @@ +This is an example of the errinfo program, which prints details on syscall +failures. + +By default it "snoops" syscall failures and prints their details, + + # ./errinfo + EXEC SYSCALL ERR DESC + wnck-applet read 11 Resource temporarily unavailable + Xorg read 11 Resource temporarily unavailable + nautilus read 11 Resource temporarily unavailable + Xorg read 11 Resource temporarily unavailable + dsdm read 11 Resource temporarily unavailable + Xorg read 11 Resource temporarily unavailable + Xorg pollsys 4 interrupted system call + mozilla-bin lwp_park 62 timer expired + gnome-netstatus- ioctl 12 Not enough core + mozilla-bin lwp_park 62 timer expired + Xorg read 11 Resource temporarily unavailable + mozilla-bin lwp_park 62 timer expired + [...] + +which is useful to see these events live, but can scroll off the screen +somewhat rapidly.. so, + + + +The "-c" option will count the number of errors. Hit Ctrl-C to stop the +sample. For example, + +# ./errinfo -c +Tracing... Hit Ctrl-C to end. +^C + EXEC SYSCALL ERR COUNT DESC + nscd fcntl 22 1 Invalid argument + xscreensaver read 11 1 Resource temporarily unavailable + inetd lwp_park 62 1 timer expired + svc.startd lwp_park 62 1 timer expired + svc.configd lwp_park 62 1 timer expired + ttymon ioctl 25 1 Inappropriate ioctl for device +gnome-netstatus- ioctl 12 2 Not enough core + mozilla-bin lwp_kill 3 2 No such process + mozilla-bin connect 150 5 operation now in progress + svc.startd portfs 62 8 timer expired + java_vm lwp_cond_wait 62 8 timer expired + soffice.bin read 11 9 Resource temporarily unavailable + gnome-terminal read 11 23 Resource temporarily unavailable + mozilla-bin recv 11 26 Resource temporarily unavailable + nautilus read 11 26 Resource temporarily unavailable +gnome-settings-d read 11 26 Resource temporarily unavailable + gnome-smproxy read 11 34 Resource temporarily unavailable + gnome-panel read 11 42 Resource temporarily unavailable + dsdm read 11 112 Resource temporarily unavailable + metacity read 11 128 Resource temporarily unavailable + mozilla-bin lwp_park 62 133 timer expired + Xorg pollsys 4 147 interrupted system call + wnck-applet read 11 179 Resource temporarily unavailable + mozilla-bin read 11 258 Resource temporarily unavailable + Xorg read 11 1707 Resource temporarily unavailable + +Ok, so Xorg has received 1707 of the same type of error for the syscall read(). + + + +The "-n" option lets us match on one type of process only. In the following +we match processes that have the name "mozilla-bin", + +# ./errinfo -c -n mozilla-bin +Tracing... Hit Ctrl-C to end. +^C + EXEC SYSCALL ERR COUNT DESC + mozilla-bin getpeername 134 1 Socket is not connected + mozilla-bin recv 11 2 Resource temporarily unavailable + mozilla-bin lwp_kill 3 2 No such process + mozilla-bin connect 150 5 operation now in progress + mozilla-bin lwp_park 62 207 timer expired + mozilla-bin read 11 396 Resource temporarily unavailable + + + +The "-p" option lets us examine one PID only. The following example examines +PID 1119, + +# ./errinfo -c -p 1119 +Tracing... Hit Ctrl-C to end. +^C + EXEC SYSCALL ERR COUNT DESC + Xorg pollsys 4 47 interrupted system call + Xorg read 11 669 Resource temporarily unavailable + + diff --git a/cddl/contrib/dtracetoolkit/Examples/execsnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/execsnoop_example.txt new file mode 100644 index 00000000000..e55682a9e64 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/execsnoop_example.txt @@ -0,0 +1,78 @@ +The following is an example of execsnoop. As processes are executed their +details are printed out. Another user was logged in running a few commands +which can be viewed below, + + # ./execsnoop + UID PID PPID ARGS + 100 3008 2656 ls + 100 3009 2656 ls -l + 100 3010 2656 cat /etc/passwd + 100 3011 2656 vi /etc/hosts + 100 3012 2656 date + 100 3013 2656 ls -l + 100 3014 2656 ls + 100 3015 2656 finger + [...] + + + +In this example the command "man gzip" was executed. The output lets us +see what the man command is actually doing, + + # ./execsnoop + UID PID PPID ARGS + 100 3064 2656 man gzip + 100 3065 3064 sh -c cd /usr/share/man; tbl /usr/share/man/man1/gzip.1 |nroff -u0 -Tlp -man - + 100 3067 3066 tbl /usr/share/man/man1/gzip.1 + 100 3068 3066 nroff -u0 -Tlp -man - + 100 3066 3065 col -x + 100 3069 3064 sh -c trap '' 1 15; /usr/bin/mv -f /tmp/mpoMaa_f /usr/share/man/cat1/gzip.1 2> + 100 3070 3069 /usr/bin/mv -f /tmp/mpoMaa_f /usr/share/man/cat1/gzip.1 + 100 3071 3064 sh -c more -s /tmp/mpoMaa_f + 100 3072 3071 more -s /tmp/mpoMaa_f + ^C + + + +Execsnoop has other options, + + # ./execsnoop -h + USAGE: execsnoop [-a|-A|-sv] [-c command] + execsnoop # default output + -a # print all data + -A # dump all data, space delimited + -s # include start time, us + -v # include start time, string + -c command # command name to snoop + + + +In particular the verbose option for human readable timestamps is +very useful, + + # ./execsnoop -v + STRTIME UID PID PPID ARGS + 2005 Jan 22 00:07:22 0 23053 20933 date + 2005 Jan 22 00:07:24 0 23054 20933 uname -a + 2005 Jan 22 00:07:25 0 23055 20933 ls -latr + 2005 Jan 22 00:07:27 0 23056 20933 df -k + 2005 Jan 22 00:07:29 0 23057 20933 ps -ef + 2005 Jan 22 00:07:29 0 23057 20933 ps -ef + 2005 Jan 22 00:07:34 0 23058 20933 uptime + 2005 Jan 22 00:07:34 0 23058 20933 uptime + [...] + + + +It is also possible to match particular commands. Here we watch +anyone using the vi command only, + + # ./execsnoop -vc vi + STRTIME UID PID PPID ARGS + 2005 Jan 22 00:10:33 0 23063 20933 vi /etc/passwd + 2005 Jan 22 00:10:40 0 23064 20933 vi /etc/shadow + 2005 Jan 22 00:10:51 0 23065 20933 vi /etc/group + 2005 Jan 22 00:10:57 0 23066 20933 vi /.rhosts + [...] + + diff --git a/cddl/contrib/dtracetoolkit/Examples/fddist_example.txt b/cddl/contrib/dtracetoolkit/Examples/fddist_example.txt new file mode 100644 index 00000000000..3d943b9e018 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/fddist_example.txt @@ -0,0 +1,38 @@ +The following is a demonstration of the fddist command, + + +Here fddist is run for a few seconds on an idle workstation, + + Tracing reads and writes... Hit Ctrl-C to end. + ^C + EXEC: dtrace PID: 3288 + + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 2 | 0 + + EXEC: mozilla-bin PID: 1659 + + value ------------- Distribution ------------- count + 3 | 0 + 4 |@@@@@@@@@@ 28 + 5 | 0 + 6 |@@@@@@@@@@@@@@@ 40 + 7 |@@@@@@@@@@@@@@@ 40 + 8 | 0 + + EXEC: Xorg PID: 1532 + + value ------------- Distribution ------------- count + 22 | 0 + 23 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 57 + 24 | 0 + +The above displays the usage pattern for process file descriptors. +We can see the Xorg process (PID 1532) has made 57 reads or writes to +it's file descriptor 23. + +The pfiles(1) command can be used to help determine what file +descriptor 23 actually is. + diff --git a/cddl/contrib/dtracetoolkit/Examples/filebyproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/filebyproc_example.txt new file mode 100644 index 00000000000..8267da2fc08 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/filebyproc_example.txt @@ -0,0 +1,27 @@ +The following is an example of the filebyproc.d script, + + # filebyproc.d + dtrace: description 'syscall::open*:entry ' matched 2 probes + CPU ID FUNCTION:NAME + 0 14 open:entry gnome-netstatus- /dev/kstat + 0 14 open:entry man /var/ld/ld.config + 0 14 open:entry man /lib/libc.so.1 + 0 14 open:entry man /usr/share/man/man.cf + 0 14 open:entry man /usr/share/man/windex + 0 14 open:entry man /usr/share/man/man1/ls.1 + 0 14 open:entry man /usr/share/man/man1/ls.1 + 0 14 open:entry man /tmp/mpqea4RF + 0 14 open:entry sh /var/ld/ld.config + 0 14 open:entry sh /lib/libc.so.1 + 0 14 open:entry neqn /var/ld/ld.config + 0 14 open:entry neqn /lib/libc.so.1 + 0 14 open:entry neqn /usr/share/lib/pub/eqnchar + 0 14 open:entry tbl /var/ld/ld.config + 0 14 open:entry tbl /lib/libc.so.1 + 0 14 open:entry tbl /usr/share/man/man1/ls.1 + 0 14 open:entry nroff /var/ld/ld.config + [...] + +In the above example, the command "man ls" was run. Each file that was +attempted to be opened can be seen, along with the program name responsible. + diff --git a/cddl/contrib/dtracetoolkit/Examples/fspaging_example.txt b/cddl/contrib/dtracetoolkit/Examples/fspaging_example.txt new file mode 100644 index 00000000000..c29cb086b83 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/fspaging_example.txt @@ -0,0 +1,32 @@ +The following is a short sample of output from the fspaging.d script. + + +fspaging.d traces syscall read and writes, vnode interface reads, writes, +getpage and putpage, and disk io. + + # ./fspaging.d + Event Device RW Size Offset Path + disk_io dad1 R 1024 0 /extra1 + disk_io dad1 R 8192 0 + disk_io dad1 R 2048 0 + sc-write . W 51200 0 /extra1/outfile + fop_write . W 51200 0 /extra1/outfile + fop_getpage . R 8192 0 /extra1/50k + disk_io dad1 R 8192 0 /extra1/50k + disk_ra dad1 R 8192 8 /extra1/50k + fop_getpage . R 8192 8 /extra1/50k + disk_ra dad1 R 34816 16 /extra1/50k + fop_getpage . R 8192 16 /extra1/50k + fop_getpage . R 8192 24 /extra1/50k + fop_getpage . R 8192 32 /extra1/50k + fop_getpage . R 8192 40 /extra1/50k + fop_getpage . R 8192 48 /extra1/50k + fop_putpage . W 8192 0 /extra1/outfile + fop_putpage . W 8192 8 /extra1/outfile + fop_putpage . W 8192 16 /extra1/outfile + fop_putpage . W 8192 24 /extra1/outfile + fop_putpage . W 8192 32 /extra1/outfile + fop_putpage . W 8192 40 /extra1/outfile + disk_io dad1 W 51200 0 /extra1/outfile + +For a full discussion of this example, see fsrw_example.txt. diff --git a/cddl/contrib/dtracetoolkit/Examples/fsrw_example.txt b/cddl/contrib/dtracetoolkit/Examples/fsrw_example.txt new file mode 100644 index 00000000000..b153303738e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/fsrw_example.txt @@ -0,0 +1,129 @@ +The following are demonstrations of the fsrw.d script. + + +Here the fsrw.d script was running while a 50 Kbyte file was read, + + # ./fsrw.d + Event Device RW Size Offset Path + sc-read . R 8192 0 /extra1/50k + fop_read . R 8192 0 /extra1/50k + disk_io cmdk0 R 8192 0 /extra1/50k + disk_ra cmdk0 R 8192 8 /extra1/50k + sc-read . R 8192 8 /extra1/50k + fop_read . R 8192 8 /extra1/50k + disk_ra cmdk0 R 34816 16 /extra1/50k + sc-read . R 8192 16 /extra1/50k + fop_read . R 8192 16 /extra1/50k + sc-read . R 8192 24 /extra1/50k + fop_read . R 8192 24 /extra1/50k + sc-read . R 8192 32 /extra1/50k + fop_read . R 8192 32 /extra1/50k + sc-read . R 8192 40 /extra1/50k + fop_read . R 8192 40 /extra1/50k + sc-read . R 8192 48 /extra1/50k + fop_read . R 8192 48 /extra1/50k + sc-read . R 8192 50 /extra1/50k + fop_read . R 8192 50 /extra1/50k + ^C + +By looking closely at the Offset (Kbytes) and Size of each transaction, we +can see how the read() system calls (sc-read) were satisfied by the file +system. There were 8 read() system calls, and 3 disk events - 2 of which were +UFS read-ahead (disk_ra). The final read-ahead was for 34 Kbytes and began +with an offset of 16 Kbytes, which read the remaining file data (34 + 16 = 50 +Kbytes). The subsequent read() system calls and corresponding fop_read() calls +returned from the page cache. + + + +The following demonstrates how a logical I/O is broken up into multiple +physical I/O events. Here a dd command was used to read 1 Mbytes from the +/var/sadm/install/contents file while fsrw.d was tracing. + + # ./fsrw.d + Event Device RW Size Offset Path + sc-read . R 1048576 0 /var/sadm/install/contents + fop_read . R 1048576 0 /var/sadm/install/contents + disk_ra cmdk0 R 4096 72 /var/sadm/install/contents + disk_ra cmdk0 R 8192 96 + disk_ra cmdk0 R 57344 96 /var/sadm/install/contents + disk_ra cmdk0 R 57344 152 /var/sadm/install/contents + disk_ra cmdk0 R 57344 208 /var/sadm/install/contents + disk_ra cmdk0 R 49152 264 /var/sadm/install/contents + disk_ra cmdk0 R 57344 312 /var/sadm/install/contents + disk_ra cmdk0 R 57344 368 /var/sadm/install/contents + disk_ra cmdk0 R 57344 424 /var/sadm/install/contents + disk_ra cmdk0 R 57344 480 /var/sadm/install/contents + disk_ra cmdk0 R 57344 536 /var/sadm/install/contents + disk_ra cmdk0 R 57344 592 /var/sadm/install/contents + disk_ra cmdk0 R 57344 648 /var/sadm/install/contents + disk_ra cmdk0 R 57344 704 /var/sadm/install/contents + disk_ra cmdk0 R 57344 760 /var/sadm/install/contents + disk_ra cmdk0 R 57344 816 /var/sadm/install/contents + disk_ra cmdk0 R 57344 872 /var/sadm/install/contents + disk_ra cmdk0 R 57344 928 /var/sadm/install/contents + disk_ra cmdk0 R 57344 984 /var/sadm/install/contents + disk_ra cmdk0 R 57344 1040 /var/sadm/install/contents + ^C + +Both the read() syscall (sc-read) and the fop_read() call asked the file system +for 1048576 bytes, which was then broken into numerous disk I/O events of up to +56 Kbytes in size. The 8192 byte read with a path of "" is likely to be +the file system reading the indirect block pointers for the +/var/sadm/install/contents file (something DTrace could confirm in detail). + + + + +The following traces activity as a cp command copies a 50 Kbyte file. + + # ./fsrw.d + Event Device RW Size Offset Path + disk_io dad1 R 1024 0 /extra1 + disk_io dad1 R 8192 0 + disk_io dad1 R 8192 0 + disk_io dad1 R 2048 0 + disk_io dad1 R 2048 0 + sc-write . W 51200 0 /extra1/outfile + fop_write . W 51200 0 /extra1/outfile + disk_io dad1 R 8192 0 /extra1/50k + disk_ra dad1 R 8192 8 /extra1/50k + disk_ra dad1 R 34816 16 /extra1/50k + disk_io dad1 R 2048 0 + disk_io dad1 W 49152 0 /extra1/outfile + ^C + +Reads including UFS read-ahead can be seen as the file is read. +The output finishes with disk writes as the new file is flushed to disk. +The syscall write() and fop_write() can be seen to the /extra1/outfile, +however there is no syscall read() or fop_read() to /extra1/50k - which +we may have expected to occur before the writes. This is due to the way +the cp command now works, it uses mmap() to map files in for reading. +This activity can be seen if we also trace fop_getpage() and fop_putpage(), +as the fspaging.d dtrace script does. + + # ./fspaging.d + Event Device RW Size Offset Path + disk_io dad1 R 1024 0 /extra1 + disk_io dad1 R 8192 0 + disk_io dad1 R 2048 0 + sc-write . W 51200 0 /extra1/outfile + fop_write . W 51200 0 /extra1/outfile + fop_getpage . R 8192 0 /extra1/50k + disk_io dad1 R 8192 0 /extra1/50k + disk_ra dad1 R 8192 8 /extra1/50k + fop_getpage . R 8192 8 /extra1/50k + disk_ra dad1 R 34816 16 /extra1/50k + fop_getpage . R 8192 16 /extra1/50k + fop_getpage . R 8192 24 /extra1/50k + fop_getpage . R 8192 32 /extra1/50k + fop_getpage . R 8192 40 /extra1/50k + fop_getpage . R 8192 48 /extra1/50k + fop_putpage . W 8192 0 /extra1/outfile + fop_putpage . W 8192 8 /extra1/outfile + fop_putpage . W 8192 16 /extra1/outfile + fop_putpage . W 8192 24 /extra1/outfile + fop_putpage . W 8192 32 /extra1/outfile + fop_putpage . W 8192 40 /extra1/outfile + disk_io dad1 W 51200 0 /extra1/outfile + diff --git a/cddl/contrib/dtracetoolkit/Examples/guess_example.txt b/cddl/contrib/dtracetoolkit/Examples/guess_example.txt new file mode 100644 index 00000000000..74be8b3a4d8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/guess_example.txt @@ -0,0 +1,39 @@ +The following is a demonstration of the guess.d script, + + +guess.d is a guessing game written in DTrace. It goes like this, + + # ./guess.d + guess.d - Guess a number between 1 and 100 + + Enter guess 1: 50 + Lower... + Enter guess 2: 25 + Higher... + Enter guess 3: 37 + Higher... + Enter guess 4: 44 + Higher... + Enter guess 5: 48 + Lower... + Enter guess 6: 46 + Lower... + Enter guess 7: 45 + Correct! That took 7 guesses. + + Please enter your name: Brendan Gregg + + Previous high scores, + Fred Nurk 7 + Brendan Gregg 7 + +It was written as a demonstration of the same code written in dozens of +languages. It makes a good demonstration, as it covers integer and string +variables, conditional statements, loops, keyboard input, screen output, +and file input and output. + +Written in DTrace however, is not such a good demonstration! DTrace doesn't +have loops (it doesn't really need them either) which made the code a +little odd. DTrace also doesn't have keyboard input... So this script is +somewhat amusing as an example, but not terribly useful. + diff --git a/cddl/contrib/dtracetoolkit/Examples/hotkernel_example.txt b/cddl/contrib/dtracetoolkit/Examples/hotkernel_example.txt new file mode 100644 index 00000000000..d8a5aec0b98 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/hotkernel_example.txt @@ -0,0 +1,153 @@ +The following are demonstrations of the hotkernel DTrace program. + + +Here hotkernel is run for a couple of seconds then Ctrl-C is hit, + + # ./hotkernel + Sampling... Hit Ctrl-C to end. + ^C + FUNCTION COUNT PCNT + unix`swtch 1 0.1% + pcplusmp`apic_redistribute_compute 1 0.1% + genunix`strrput 1 0.1% + unix`sys_call 1 0.1% + genunix`fsflush_do_pages 1 0.1% + TS`ts_wakeup 1 0.1% + genunix`callout_schedule_1 1 0.1% + unix`page_create_putback 1 0.1% + unix`mutex_enter 4 0.3% + unix`cpu_halt 1575 99.2% + +The output summarises which kernel-level function was sampled on the +CPU the most. This report shows that unix`cpu_halt was sampled 1575 +times, which was 99.2% of the kernel-level samples. + +As it turns out, unix`cpu_halt is called on this x86 server as part of the +kernel idle thread - explaining why it is so often found on the CPU, + + # dtrace -n 'fbt::cpu_halt:entry { @[stack()] = count(); }' + dtrace: description 'fbt::cpu_halt:entry ' matched 1 probe + ^C + + unix`idle+0x3b + unix`thread_start+0x3 + 956 + +This kernel stack trace indicates that cpu_halt() is called by idle(). + +The following is a SPARC example, + + # ./hotkernel + Sampling... Hit Ctrl-C to end. + ^C + FUNCTION COUNT PCNT + genunix`fop_ioctl 1 0.1% + genunix`allocb_cred 1 0.1% + genunix`poll_common 1 0.1% + genunix`cv_block 1 0.1% + genunix`strioctl 1 0.1% + genunix`disp_lock_exit 1 0.1% + genunix`crfree 1 0.1% + ufs`ufs_getpage 1 0.1% + SUNW,UltraSPARC-IIi`copyin 1 0.1% + genunix`strmakedata 1 0.1% + genunix`cv_waituntil_sig 1 0.1% + SUNW,UltraSPARC-IIi`prefetch_page_r 1 0.1% + unix`set_freemem 1 0.1% + unix`page_trylock 1 0.1% + genunix`anon_get_ptr 1 0.1% + unix`page_hashin 1 0.1% + genunix`bt_getlowbit 1 0.1% + unix`pp_load_tlb 1 0.1% + unix`_resume_from_idle 1 0.1% + unix`hat_pageunload 1 0.1% + genunix`strrput 1 0.1% + genunix`strpoll 1 0.1% + unix`page_do_hashin 1 0.1% + unix`cpu_vm_stats_ks_update 1 0.1% + genunix`sleepq_wakeone_chan 1 0.1% + unix`lock_set_spl 1 0.1% + tl`tl_wput 1 0.1% + genunix`kstrgetmsg 1 0.1% + genunix`qbackenable 1 0.1% + genunix`releasef 1 0.1% + genunix`callout_execute 1 0.1% + uata`ata_hba_start 1 0.1% + genunix`pcacheset_cmp 1 0.1% + genunix`sleepq_insert 1 0.1% + genunix`syscall_mstate 1 0.1% + sockfs`sotpi_recvmsg 1 0.1% + genunix`strput 1 0.1% + genunix`timespectohz 1 0.1% + unix`lock_clear_splx 1 0.1% + genunix`read 1 0.1% + genunix`as_segcompar 1 0.1% + unix`atomic_cas_64 1 0.1% + unix`mutex_exit 1 0.1% + genunix`cv_unsleep 1 0.1% + unix`putnext 1 0.1% + unix`intr_thread 1 0.1% + genunix`hrt2tv 1 0.1% + sockfs`socktpi_poll 1 0.1% + unix`sfmmu_mlspl_enter 1 0.1% + SUNW,UltraSPARC-IIi`get_ecache_tag 1 0.1% + SUNW,UltraSPARC-IIi`gethrestime 1 0.1% + genunix`cv_timedwait_sig 1 0.1% + genunix`getq_noenab 1 0.1% + SUNW,UltraSPARC-IIi`flushecacheline 1 0.1% + unix`utl0 1 0.1% + genunix`anon_alloc 1 0.1% + unix`page_downgrade 1 0.1% + unix`setfrontdq 1 0.1% + genunix`timeout_common 1 0.1% + unix`bzero 1 0.1% + unix`ktl0 2 0.1% + genunix`canputnext 2 0.1% + genunix`clear_active_fd 2 0.1% + unix`sfmmu_tlb_demap 2 0.1% + unix`page_vpadd 2 0.1% + SUNW,UltraSPARC-IIi`check_ecache_line 2 0.1% + genunix`cyclic_softint 2 0.1% + genunix`restore_mstate 2 0.1% + genunix`anon_map_getpages 2 0.1% + genunix`putq 2 0.1% + unix`page_lookup_create 2 0.1% + dtrace`dtrace_dynvar_clean 2 0.1% + unix`sfmmu_pageunload 2 0.1% + genunix`cpu_decay 2 0.1% + genunix`kmem_cache_alloc 3 0.2% + unix`rw_exit 3 0.2% + tl`tl_wput_data_ser 3 0.2% + unix`page_get_replacement_page 3 0.2% + unix`page_sub 3 0.2% + genunix`clock 3 0.2% + SUNW,UltraSPARC-IIi`copyout 3 0.2% + unix`mutex_enter 4 0.2% + genunix`pcache_poll 5 0.3% + SUNW,UltraSPARC-IIi`scrub_ecache_line 5 0.3% + SUNW,UltraSPARC-IIi`hwblkpagecopy 22 1.2% + SUNW,UltraSPARC-IIi`hwblkclr 39 2.1% + unix`generic_idle_cpu 506 26.8% + unix`idle 1199 63.5% + +Which shows the most common function is unix`idle. + + + + +Now the hotkernel tool is demonstrated with the -m option, to only print +out samples by module, + + # ./hotkernel -m + Sampling... Hit Ctrl-C to end. + ^C + MODULE COUNT PCNT + usbms 1 0.0% + specfs 1 0.0% + uhci 1 0.0% + sockfs 2 0.0% + genunix 28 0.6% + unix 4539 99.3% + +Here, genunix and unix (the two core parts of the kernel) were the most +common module to be executing on-CPU. diff --git a/cddl/contrib/dtracetoolkit/Examples/hotspot_example.txt b/cddl/contrib/dtracetoolkit/Examples/hotspot_example.txt new file mode 100644 index 00000000000..179ba8d0a18 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/hotspot_example.txt @@ -0,0 +1,34 @@ +The following is a demonstration of the hotspot.d script. + +Here the script is run while a large file is copied from one filesystem +(cmdk0 102,0) to another (cmdk0 102,3). We can see the file mostly resided +around the 9000 to 10999 Mb range on the source disk (102,0), and was +copied to the 0 to 999 Mb range on the target disk (102,3). + + # ./hotspot.d + Tracing... Hit Ctrl-C to end. + ^C + Disk: cmdk0 Major,Minor: 102,3 + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 418 + 1000 | 0 + + Disk: cmdk0 Major,Minor: 102,0 + + value ------------- Distribution ------------- count + < 0 | 0 + 0 | 1 + 1000 | 5 + 2000 | 0 + 3000 | 0 + 4000 | 0 + 5000 | 0 + 6000 | 0 + 7000 | 0 + 8000 | 0 + 9000 |@@@@@ 171 + 10000 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1157 + 11000 | 0 + diff --git a/cddl/contrib/dtracetoolkit/Examples/hotuser_example.txt b/cddl/contrib/dtracetoolkit/Examples/hotuser_example.txt new file mode 100644 index 00000000000..c038acd6cda --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/hotuser_example.txt @@ -0,0 +1,107 @@ +The following are demonstrations of the hotuser DTrace program. + + +Here, hotuser is run on a test program called "dofuncs", which is hard coded +to spend half its time in delta(), a third in beta() and a sixth in alpha(). + + # ./hotuser -c ./dofuncs + Sampling... Hit Ctrl-C to end. + ^C + FUNCTION COUNT PCNT + dofuncs`alpha 511 16.5% + dofuncs`beta 1029 33.3% + dofuncs`delta 1552 50.2% + +hotuser has accurately sampled which user-level functions are on the CPU, +producing a report of the expected breakdown. The hottest user-level function +is delta(), which was sampled 1552 times - 50.2% of the total samples. + + + +Now hotuser is run on gunzip, to find which functions are most often +on the CPU, + + # ./hotuser -c 'gunzip contents.gz' + Sampling... Hit Ctrl-C to end. + + FUNCTION COUNT PCNT + libc.so.1`_free_unlocked 1 0.1% + gunzip`unzip 1 0.1% + ld.so.1`strcmp 1 0.1% + gunzip`inflate_dynamic 1 0.1% + libc.so.1`_write 1 0.1% + gunzip`write_buf 1 0.1% + gunzip`0x2d990 2 0.3% + libc.so.1`write 2 0.3% + gunzip`0x2d994 2 0.3% + ld.so.1`rtld_db_preinit 3 0.4% + gunzip`0x2d98c 7 0.9% + gunzip`huft_build 9 1.2% + libc_psr.so.1`memcpy 138 18.5% + gunzip`inflate_codes 233 31.2% + gunzip`updcrc 344 46.1% + +This shows that updcrc() was sampled 344 times, and 46.1% of the total +samples. + + + +A -l option will provide a breakdown on libraries only. hotuser +is run on gzip to show library usage only, + + # ./hotuser -lc 'gzip contents' + Sampling... Hit Ctrl-C to end. + + LIBRARY COUNT PCNT + libc.so.1 2 0.0% + libc_psr.so.1 37 0.9% + gzip 4113 99.1% + +This shows that code in the gzip binary itself was on the CPU 99.1% of +the sample times, with libc_psr.so.1 code on the CPU 0.9% of the time. + + + +The following shows library usage of mozilla. The pgrep command is used to +match the most recent PID of mozilla-bin. + + # ./hotuser -lp `pgrep -n mozilla-bin` + Sampling... Hit Ctrl-C to end. + ^C + LIBRARY COUNT PCNT + libplds4.so 1 0.1% + libappcomps.so 1 0.1% + libi18n.so 1 0.1% + libuconv.so 1 0.1% + libpref.so 1 0.1% + libblueprint.so 1 0.1% + libz.so.1 2 0.2% + libcaps.so 2 0.2% + libXrender.so.1 2 0.2% + libimglib2.so 2 0.2% + libXft.so.2 3 0.3% + libCrun.so.1 3 0.3% + libdocshell.so 3 0.3% + libplc4.so 4 0.4% + libgtk-x11-2.0.so.0.400.9 5 0.5% + libjsd.so 5 0.5% + libX11.so.4 5 0.5% + libnecko.so 8 0.9% + libwidget_gtk2.so 9 1.0% + libgkgfx.so 13 1.4% + libglib-2.0.so.0.400.1 14 1.5% + libgfx_gtk.so 18 2.0% + libnspr4.so 20 2.2% + libxpconnect.so 22 2.4% + libgdk-x11-2.0.so.0.400.9 23 2.5% + libgobject-2.0.so.0.400.1 25 2.7% + libhtmlpars.so 27 3.0% + libfontconfig.so.1 41 4.5% + libxpcom.so 49 5.4% + mozilla-bin 55 6.0% + libmozjs.so 80 8.8% + libc.so.1 115 12.6% + libgklayout.so 352 38.6% + +This shows that 352 samples found code from libgklayout.so running, which +was 38.6% of the samples. diff --git a/cddl/contrib/dtracetoolkit/Examples/httpdstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/httpdstat_example.txt new file mode 100644 index 00000000000..b9f59e8ca68 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/httpdstat_example.txt @@ -0,0 +1,36 @@ +The following is an example of using the httpdstat.d script. + + +This Solaris 10 server is running Apache as a webserver. The script matches +on the process name "httpd". Here it shows many GET connections, + + # httpdstat.d + TIME NUM GET POST HEAD TRACE + 2005 Nov 29 18:46:46 38 38 0 0 0 + 2005 Nov 29 18:46:47 109 109 0 0 0 + 2005 Nov 29 18:46:48 112 112 0 0 0 + 2005 Nov 29 18:46:49 113 113 0 0 0 + 2005 Nov 29 18:46:50 107 107 0 0 0 + 2005 Nov 29 18:46:51 56 56 0 0 0 + 2005 Nov 29 18:46:52 0 0 0 0 0 + 2005 Nov 29 18:46:53 0 0 0 0 0 + 2005 Nov 29 18:46:54 20 20 0 0 0 + 2005 Nov 29 18:46:55 48 48 0 0 0 + ^C + +For a few seconds we had around 100 GETs per second. + + + +httpdstat.d accepts an argument as the sample interval, here we print a +line every 30 seconds, + + # httpdstat.d 30 + TIME NUM GET POST HEAD TRACE + 2005 Nov 29 18:50:49 462 458 3 1 0 + 2005 Nov 29 18:51:19 421 413 5 2 1 + 2005 Nov 29 18:51:49 1361 1358 3 0 0 + ^C + +The values are for the entire interval. + diff --git a/cddl/contrib/dtracetoolkit/Examples/icmpstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/icmpstat_example.txt new file mode 100644 index 00000000000..e8b8cfe6500 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/icmpstat_example.txt @@ -0,0 +1,29 @@ +The following is a demonstration of the icmpstat.d script, + + +Here we run it and catch an inbound ping, + + # icmpstat.d + 2005 Jul 25 23:05:39, + + STATISTIC VALUE + + 2005 Jul 25 23:05:40, + + STATISTIC VALUE + icmpOutMsgs 1 + icmpOutEchoReps 1 + icmpInEchos 1 + icmpInMsgs 1 + + 2005 Jul 25 23:05:41, + + STATISTIC VALUE + + ^C + +Files such as /usr/include/inet/mib2.h may explain each of the statistics. + +The icmpstat.d is a simple demonstration of tracing ICMP activity. It may +serve as the starting point for other scripts. + diff --git a/cddl/contrib/dtracetoolkit/Examples/intbycpu_example.txt b/cddl/contrib/dtracetoolkit/Examples/intbycpu_example.txt new file mode 100644 index 00000000000..5ed213cba6b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/intbycpu_example.txt @@ -0,0 +1,11 @@ +The following is a demonstration of the intbycpu.d script, + + # intbycpu.d + Tracing... Hit Ctrl-C to end. + ^C + CPU INTERRUPTS + 0 374 + 1 412 + +In the above output, CPU 1 had 412 interrupts, and CPU 0 had 374. + diff --git a/cddl/contrib/dtracetoolkit/Examples/intoncpu_example.txt b/cddl/contrib/dtracetoolkit/Examples/intoncpu_example.txt new file mode 100644 index 00000000000..ed408eb6a17 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/intoncpu_example.txt @@ -0,0 +1,93 @@ +The following is an example of the intoncpu.d script. + + +Here we run it for a few seconds then hit Ctrl-C, + + # ./intoncpu.d + Tracing... Hit Ctrl-C to end. + ^C + uhci1 + + value ------------- Distribution ------------- count + 2048 | 0 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8192 | 0 + uhci0 + + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16 + 2048 |@@@@ 2 + 4096 |@@ 1 + 8192 |@@ 1 + 16384 | 0 + rtls0 + + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@ 8 + 2048 |@@@@@@@@@@ 5 + 4096 |@@@@@@ 3 + 8192 | 0 + 16384 |@@ 1 + 32768 |@@ 1 + 65536 |@@@@ 2 + 131072 | 0 + +The rtls0 driver (the network interface) has encourtered the most interrupts, +with the time taken to process each interrupt visible as a distribution. +These times ranged from around 1000 ns (1 us), to at least 65536 ns (65 us). + +To determine which devices the instance names represent (eg, "uhci1"), the +/etc/path_to_inst file could be examied. + + + +The following is a longer example of running intoncpu.d, + + # ./intoncpu.d + Tracing... Hit Ctrl-C to end. + ^C + uhci1 + + value ------------- Distribution ------------- count + 2048 | 0 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 8192 | 0 + ata1 + + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@ 2 + 32768 |@@@@@@@@@@@@@@@@@@@@ 2 + 65536 | 0 + ata0 + + value ------------- Distribution ------------- count + 2048 | 0 + 4096 |@@@@@@@@@@@@@ 55 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 113 + 16384 |@ 5 + 32768 | 0 + uhci0 + + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1288 + 2048 |@@ 53 + 4096 | 6 + 8192 | 0 + rtls0 + + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@ 665 + 2048 |@@@@@@@@@ 307 + 4096 |@ 35 + 8192 | 0 + 16384 |@@@@@@@ 229 + 32768 |@@@ 91 + 65536 |@ 19 + 131072 | 1 + 262144 | 0 + diff --git a/cddl/contrib/dtracetoolkit/Examples/inttimes_example.txt b/cddl/contrib/dtracetoolkit/Examples/inttimes_example.txt new file mode 100644 index 00000000000..384d700ba23 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/inttimes_example.txt @@ -0,0 +1,18 @@ +The following is a demonstration of the inttimes.d script, + + +Here we run it for a few seconds then hit Ctrl-C, + + # inttimes.d + Tracing... Hit Ctrl-C to end. + ^C + DEVICE TIME (ns) + ata0 22324 + uhci1 45893 + ata1 138559 + uhci0 229226 + i80420 1305617 + rtls0 2540175 + +In the above output, we can see that the rtls0 driver spent 2540 us on the +CPU servicing interrupts, while ata0 spent only 22 us. diff --git a/cddl/contrib/dtracetoolkit/Examples/iofile_example.txt b/cddl/contrib/dtracetoolkit/Examples/iofile_example.txt new file mode 100644 index 00000000000..f4fc476910f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/iofile_example.txt @@ -0,0 +1,35 @@ +The following is a demonstration of the iofile.d script, + + +Here we run it while a tar command is backing up /var/adm, + + # iofile.d + Tracing... Hit Ctrl-C to end. + ^C + PID CMD TIME FILE + 5206 tar 109 /var/adm/acct/nite + 5206 tar 110 /var/adm/acct/sum + 5206 tar 114 /var/adm/acct/fiscal + 5206 tar 117 /var/adm/messages.3 + 5206 tar 172 /var/adm/sa + 5206 tar 3605 /var/adm/messages.2 + 5206 tar 4548 /var/adm/spellhist + 5206 tar 5769 /var/adm/exacct/brendan1task + 5206 tar 6416 /var/adm/acct + 5206 tar 7587 /var/adm/messages.1 + 5206 tar 8246 /var/adm/exacct/task + 5206 tar 8320 /var/adm/pool + 5206 tar 8973 /var/adm/pool/history + 5206 tar 9183 /var/adm/exacct + 3 fsflush 10882 + 5206 tar 11861 /var/adm/exacct/flow + 5206 tar 12042 /var/adm/messages.0 + 5206 tar 12408 /var/adm/sm.bin + 5206 tar 13021 /var/adm/sulog + 5206 tar 19007 /var/adm/streams + 5206 tar 21811 + 5206 tar 24918 /var/adm/exacct/proc + +In the above output, we can see that the tar command spent 24918 us (25 ms) +waiting for disk I/O on the /var/adm/exacct/proc file. + diff --git a/cddl/contrib/dtracetoolkit/Examples/iofileb_example.txt b/cddl/contrib/dtracetoolkit/Examples/iofileb_example.txt new file mode 100644 index 00000000000..21597f7e776 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/iofileb_example.txt @@ -0,0 +1,23 @@ +The following is a demonstration of the iofileb.d script, + + +Here we run it while a tar command is backing up /var/adm, + + # ./iofileb.d + Tracing... Hit Ctrl-C to end. + ^C + PID CMD KB FILE + 29529 tar 56 /var/adm/sa/sa31 + 29529 tar 56 /var/adm/sa/sa03 + 29529 tar 56 /var/adm/sa/sa02 + 29529 tar 56 /var/adm/sa/sa01 + 29529 tar 56 /var/adm/sa/sa04 + 29529 tar 56 /var/adm/sa/sa27 + 29529 tar 56 /var/adm/sa/sa28 + 29529 tar 324 /var/adm/exacct/task + 29529 tar 736 /var/adm/wtmpx + +In the above output, we can see that the tar command has caused 736 Kbytes +of the /var/adm/wtmpx file to be read from disk. All af the Kbyte values +measured are for disk activity. + diff --git a/cddl/contrib/dtracetoolkit/Examples/iopattern_example.txt b/cddl/contrib/dtracetoolkit/Examples/iopattern_example.txt new file mode 100644 index 00000000000..818a4a22e6d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/iopattern_example.txt @@ -0,0 +1,57 @@ +The following is a demonstration of the iopattern program, + + +Here we run iopattern for a few seconds then hit Ctrl-C. There is a "dd" +command running on this system to intentionally create heavy sequential +disk activity, + + # iopattern + %RAN %SEQ COUNT MIN MAX AVG KR KW + 1 99 465 4096 57344 52992 23916 148 + 0 100 556 57344 57344 57344 31136 0 + 0 100 634 57344 57344 57344 35504 0 + 6 94 554 512 57344 54034 29184 49 + 0 100 489 57344 57344 57344 27384 0 + 21 79 568 4096 57344 46188 25576 44 + 4 96 431 4096 57344 56118 23620 0 + ^C + +In the above output we can see that the disk activity is mostly sequential. +The disks are also pulling around 30 Mb during each sample, with a large +average event size. + + + +The following demonstrates iopattern while running a "find" command to +cause random disk activity, + + # iopattern + %RAN %SEQ COUNT MIN MAX AVG KR KW + 86 14 400 1024 8192 1543 603 0 + 81 19 455 1024 8192 1606 714 0 + 89 11 469 512 8192 1854 550 299 + 83 17 463 1024 8192 1782 806 0 + 87 13 394 1024 8192 1551 597 0 + 85 15 348 512 57344 2835 808 155 + 91 9 513 512 47616 2812 570 839 + 76 24 317 512 35840 3755 562 600 + ^C + +In the above output, we can see from the percentages that the disk events +were mostly random. We can also see that the average event size is small - +which makes sense if we are reading through many directory files. + + + +iopattern has options. Here we print timestamps "-v" and measure every 10 +seconds, + + # iopattern -v 10 + TIME %RAN %SEQ COUNT MIN MAX AVG KR KW + 2005 Jul 25 20:40:55 97 3 33 512 8192 1163 8 29 + 2005 Jul 25 20:41:05 0 0 0 0 0 0 0 0 + 2005 Jul 25 20:41:15 84 16 6 512 11776 5973 22 13 + 2005 Jul 25 20:41:25 100 0 26 512 8192 1496 8 30 + 2005 Jul 25 20:41:35 0 0 0 0 0 0 0 0 + ^C + diff --git a/cddl/contrib/dtracetoolkit/Examples/iopending_example.txt b/cddl/contrib/dtracetoolkit/Examples/iopending_example.txt new file mode 100644 index 00000000000..f4bc8225c86 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/iopending_example.txt @@ -0,0 +1,126 @@ +The following is a demonstration of the iopending tool, + +Here we run it with a sample interval of 1 second, + + # iopending 1 + Tracing... Please wait. + 2006 Jan 6 20:21:59, load: 0.02, disk_r: 0 KB, disk_w: 0 KB + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1010 + 1 | 0 + + 2006 Jan 6 20:22:00, load: 0.03, disk_r: 0 KB, disk_w: 0 KB + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1000 + 1 | 0 + + 2006 Jan 6 20:22:01, load: 0.03, disk_r: 0 KB, disk_w: 0 KB + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1000 + 1 | 0 + + ^C + +The iopending tool samples at 1000 Hz, and prints a distribution of how many +disk events were "pending" completion. In the above example the disks are +quiet - for all the samples there are zero disk events pending. + + + +Now iopending is run with no arguments. It will default to an interval of 5 +seconds, + + # iopending + Tracing... Please wait. + 2006 Jan 6 19:15:41, load: 0.03, disk_r: 3599 KB, disk_w: 0 KB + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4450 + 1 |@@@ 390 + 2 |@ 80 + 3 | 40 + 4 | 20 + 5 | 30 + 6 | 0 + + ^C + +In the above output there was a little disk activity. For 390 samples there +was 1 I/O event pending; for 80 samples there was 2, and so on. + + + + +In the following example iopending is run during heavy disk activity. We +print output every 10 seconds, + + # iopending 10 + Tracing... Please wait. + 2006 Jan 6 20:58:07, load: 0.03, disk_r: 25172 KB, disk_w: 33321 KB + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@ 2160 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6720 + 2 |@@@@ 1000 + 3 | 50 + 4 | 30 + 5 | 20 + 6 | 10 + 7 | 10 + 8 | 10 + 9 | 0 + + 2006 Jan 6 20:58:17, load: 0.05, disk_r: 8409 KB, disk_w: 12449 KB + + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7260 + 1 |@@@@@@@ 1700 + 2 |@ 300 + 3 | 0 + 4 | 10 + 5 | 10 + 6 | 10 + 7 | 20 + 8 | 0 + 9 | 0 + 10 | 0 + 11 | 0 + 12 | 0 + 13 | 0 + 14 | 0 + 15 | 0 + 16 | 0 + 17 | 10 + 18 | 20 + 19 | 0 + 20 | 0 + 21 | 0 + 22 | 0 + 23 | 0 + 24 | 0 + 25 | 0 + 26 | 0 + 27 | 0 + 28 | 0 + 29 | 0 + 30 | 0 + 31 | 10 + >= 32 |@@@ 650 + + ^C + +In the first output, most of the time (67%) there was 1 event pending, +and for a short time there were 8 events pending. In the second output we +see many samples were off the scale - 650 samples at 32 or more pending +events. For this sample I had typed "sync" in another window, which +queued many disk events immediately which were eventually completed. + diff --git a/cddl/contrib/dtracetoolkit/Examples/iosnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/iosnoop_example.txt new file mode 100644 index 00000000000..addb7dcbbe4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/iosnoop_example.txt @@ -0,0 +1,39 @@ +The following demonstrates iosnoop. It was run on a system that was +fairly quiet until a tar command was run, + +# ./iosnoop + UID PID D BLOCK SIZE COMM PATHNAME + 0 0 W 1067 512 sched + 0 0 W 6496304 1024 sched + 0 3 W 6498797 512 fsflush + 0 0 W 1067 512 sched + 0 0 W 6496304 1024 sched + 100 443 R 892288 4096 Xsun /usr/openwin/bin/Xsun + 100 443 R 891456 4096 Xsun /usr/openwin/bin/Xsun + 100 15795 R 3808 8192 tar /usr/bin/eject + 100 15795 R 35904 6144 tar /usr/bin/eject + 100 15795 R 39828 6144 tar /usr/bin/env + 100 15795 R 3872 8192 tar /usr/bin/expr + 100 15795 R 21120 7168 tar /usr/bin/expr + 100 15795 R 43680 6144 tar /usr/bin/false + 100 15795 R 44176 6144 tar /usr/bin/fdetach + 100 15795 R 3920 8192 tar /usr/bin/fdformat + 100 15795 R 3936 8192 tar /usr/bin/fdformat + 100 15795 R 4080 8192 tar /usr/bin/fdformat + 100 15795 R 9680 3072 tar /usr/bin/fdformat + 100 15795 R 4096 8192 tar /usr/bin/fgrep + 100 15795 R 46896 6144 tar /usr/bin/fgrep + 100 15795 R 4112 8192 tar /usr/bin/file + 100 15795 R 4128 8192 tar /usr/bin/file + 100 15795 R 4144 8192 tar /usr/bin/file + 100 15795 R 21552 7168 tar /usr/bin/file + 100 15795 R 4192 8192 tar /usr/bin/fmli + 100 15795 R 4208 8192 tar /usr/bin/fmli + 100 15795 R 4224 57344 tar /usr/bin/fmli + 100 15795 R 4336 24576 tar /usr/bin/fmli + 100 15795 R 695792 8192 tar + 100 15795 R 696432 57344 tar /usr/bin/fmli +[...] + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/iotop_example.txt b/cddl/contrib/dtracetoolkit/Examples/iotop_example.txt new file mode 100644 index 00000000000..8cf55c189ba --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/iotop_example.txt @@ -0,0 +1,142 @@ +The following are demonstrations of the iotop program, + + +Here we run iotop with the -C option to not clear the screen, but instead +provide a scrolling output, + + # iotop -C + Tracing... Please wait. + 2005 Jul 16 00:34:40, load: 1.21, disk_r: 12891 KB, disk_w: 1087 KB + + UID PID PPID CMD DEVICE MAJ MIN D BYTES + 0 3 0 fsflush cmdk0 102 4 W 512 + 0 3 0 fsflush cmdk0 102 0 W 11776 + 0 27751 20320 tar cmdk0 102 16 W 23040 + 0 3 0 fsflush cmdk0 102 0 R 73728 + 0 0 0 sched cmdk0 102 0 R 548864 + 0 0 0 sched cmdk0 102 0 W 1078272 + 0 27751 20320 tar cmdk0 102 16 R 1514496 + 0 27751 20320 tar cmdk0 102 3 R 11767808 + + 2005 Jul 16 00:34:45, load: 1.23, disk_r: 83849 KB, disk_w: 488 KB + + UID PID PPID CMD DEVICE MAJ MIN D BYTES + 0 0 0 sched cmdk0 102 4 W 1536 + 0 0 0 sched cmdk0 102 0 R 131072 + 0 27752 20320 find cmdk0 102 0 R 262144 + 0 0 0 sched cmdk0 102 0 W 498176 + 0 27751 20320 tar cmdk0 102 3 R 11780096 + 0 27751 20320 tar cmdk0 102 5 R 29745152 + 0 27751 20320 tar cmdk0 102 4 R 47203328 + + 2005 Jul 16 00:34:50, load: 1.25, disk_r: 22394 KB, disk_w: 2 KB + + UID PID PPID CMD DEVICE MAJ MIN D BYTES + 0 27752 20320 find cmdk0 102 0 W 2048 + 0 0 0 sched cmdk0 102 0 R 16384 + 0 321 1 automountd cmdk0 102 0 R 22528 + 0 27752 20320 find cmdk0 102 0 R 1462272 + 0 27751 20320 tar cmdk0 102 5 R 17465344 + +In the above output, we can see a tar command is reading from the cmdk0 +disk, from several different slices (different minor numbers), on the last +report focusing on 102,5 (an "ls -lL" in /dev/dsk can explain the number to +slice mappings). + +The disk_r and disk_w values give a summary of the overall activity in +bytes. + + + +Bytes can be used as a yardstick to determine which process is keeping the +disks busy, however either of the delta times available from iotop would +be more accurate (as they take into account whether the activity is random +or sequential). + + # iotop -Co + Tracing... Please wait. + 2005 Jul 16 00:39:03, load: 1.10, disk_r: 5302 KB, disk_w: 20 KB + + UID PID PPID CMD DEVICE MAJ MIN D DISKTIME + 0 0 0 sched cmdk0 102 0 W 532 + 0 0 0 sched cmdk0 102 0 R 245398 + 0 27758 20320 find cmdk0 102 0 R 3094794 + + 2005 Jul 16 00:39:08, load: 1.14, disk_r: 5268 KB, disk_w: 273 KB + + UID PID PPID CMD DEVICE MAJ MIN D DISKTIME + 0 3 0 fsflush cmdk0 102 0 W 2834 + 0 0 0 sched cmdk0 102 0 W 263527 + 0 0 0 sched cmdk0 102 0 R 285015 + 0 3 0 fsflush cmdk0 102 0 R 519187 + 0 27758 20320 find cmdk0 102 0 R 2429232 + + 2005 Jul 16 00:39:13, load: 1.16, disk_r: 602 KB, disk_w: 1238 KB + + UID PID PPID CMD DEVICE MAJ MIN D DISKTIME + 0 3 0 fsflush cmdk0 102 4 W 200 + 0 3 0 fsflush cmdk0 102 6 W 260 + 0 3 0 fsflush cmdk0 102 0 W 883 + 0 27758 20320 find cmdk0 102 0 R 55686 + 0 3 0 fsflush cmdk0 102 0 R 317508 + 0 0 0 sched cmdk0 102 0 R 320195 + 0 0 0 sched cmdk0 102 0 W 571084 + [...] + +The disk time is in microseconds. In the first sample, we can see the find +command caused a total of 3.094 seconds of disk time - the duration of the +samples here is 5 seconds (the default), so it would be fair to say that +the find command is keeping the disk 60% busy. + + + +A new option for iotop is to print percents "-P" which are based on disk +I/O times, and hense are a fair measurementt of what is keeping the disks +busy. + + # iotop -PC 1 + Tracing... Please wait. + 2005 Nov 18 15:26:14, load: 0.24, disk_r: 13176 KB, disk_w: 0 KB + + UID PID PPID CMD DEVICE MAJ MIN D %I/O + 0 2215 1663 bart cmdk0 102 0 R 85 + + 2005 Nov 18 15:26:15, load: 0.25, disk_r: 5263 KB, disk_w: 0 KB + + UID PID PPID CMD DEVICE MAJ MIN D %I/O + 0 2214 1663 find cmdk0 102 0 R 15 + 0 2215 1663 bart cmdk0 102 0 R 67 + + 2005 Nov 18 15:26:16, load: 0.25, disk_r: 8724 KB, disk_w: 0 KB + + UID PID PPID CMD DEVICE MAJ MIN D %I/O + 0 2214 1663 find cmdk0 102 0 R 10 + 0 2215 1663 bart cmdk0 102 0 R 71 + + 2005 Nov 18 15:26:17, load: 0.25, disk_r: 7528 KB, disk_w: 0 KB + + UID PID PPID CMD DEVICE MAJ MIN D %I/O + 0 2214 1663 find cmdk0 102 0 R 0 + 0 2215 1663 bart cmdk0 102 0 R 85 + + 2005 Nov 18 15:26:18, load: 0.26, disk_r: 11389 KB, disk_w: 0 KB + + UID PID PPID CMD DEVICE MAJ MIN D %I/O + 0 2214 1663 find cmdk0 102 0 R 2 + 0 2215 1663 bart cmdk0 102 0 R 80 + + 2005 Nov 18 15:26:19, load: 0.26, disk_r: 22109 KB, disk_w: 0 KB + + UID PID PPID CMD DEVICE MAJ MIN D %I/O + 0 2215 1663 bart cmdk0 102 0 R 76 + + ^C + +In the above output, bart and find jostle for disk access as they create +a database of file checksums. The command was, + + find / | bart create -I > /dev/null + +Note that the %I/O is in terms of 1 disk. A %I/O of say 200 is allowed - it +would mean that effectively 2 disks were at 100%, or 4 disks at 50%, etc. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_calldist_example.txt new file mode 100644 index 00000000000..b659c0afc3e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_calldist_example.txt @@ -0,0 +1,247 @@ +This is an example of j_calldist.d showing the elapsed times for different +types of Java operations. + +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0), and produces the output in graphical format, showing +a histogram of the amount of time taken by each call. Method calls are only +visible when using the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile + +Because of the extensive results returned otherwise, this script will show you +a configurable number of results in each section. The default (as in this +example) is ten. + +Here we see it tracing the activity of Code/Java/Func_abc. + +# j_calldist.d +Tracing... Hit Ctrl-C to end. +^C + +Top 10 elapsed times (us), + +Top 10 exclusive method elapsed times (us), + PID=311342, method, sun/net/www/ParseUtil.decode + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@ 3 + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@ 5 + 2048 |@@@@ 1 + 4096 | 0 + + PID=311342, method, java/net/URLClassLoader. + value ------------- Distribution ------------- count + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16384 | 0 + + PID=311342, method, java/util/jar/JarFile.hasClassPathAttribute + value ------------- Distribution ------------- count + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16384 | 0 + + PID=311342, method, java/util/zip/ZipFile.read + value ------------- Distribution ------------- count + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16384 | 0 + + PID=311342, method, sun/nio/cs/US_ASCII.newEncoder + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@ 1 + 16384 | 0 + + PID=311342, method, java/util/zip/ZipFile.getInputStream + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@ 1 + 16384 | 0 + + PID=311342, method, sun/nio/cs/US_ASCII.newDecoder + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@ 1 + 16 |@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 |@@@@@@@@@@ 1 + 16384 | 0 + + PID=311342, method, java/util/HashMap. + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@ 8 + 16 |@@@@@@@@@@@@@@@@ 9 + 32 |@@@@@@@@@ 5 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 |@@ 1 + 16384 | 0 + + PID=311342, method, java/io/UnixFileSystem.normalize + value ------------- Distribution ------------- count + 4 | 0 + 8 |@ 1 + 16 | 0 + 32 | 0 + 64 |@@@@@@@@@ 8 + 128 |@@@@@@@@@@@@@ 11 + 256 |@@@@@@ 5 + 512 |@@@@@@@@@ 8 + 1024 | 0 + 2048 | 0 + 4096 |@ 1 + 8192 | 0 + + PID=311342, method, java/lang/Thread.sleep + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 1048576 | 0 + + +Top 10 inclusive method elapsed times (us), + PID=311342, method, java/net/URLClassLoader$1.run + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@ 1 + 131072 | 0 + + PID=311342, method, java/net/URLClassLoader.findClass + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@ 1 + 131072 | 0 + + PID=311342, method, sun/misc/URLClassPath.getLoader + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@ 1 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@ 2 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@ 8 + 8192 | 0 + 16384 |@@@ 1 + 32768 | 0 + 65536 |@@@ 1 + 131072 | 0 + + PID=311342, method, java/lang/ClassLoader.loadClass + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@ 6 + 256 |@@@@@@@@@@@@@@@@@@@@@@ 15 + 512 |@@@@ 3 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 | 0 + 32768 | 0 + 65536 |@@@@ 3 + 131072 | 0 + + PID=311342, method, java/security/AccessController.doPrivileged + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@ 2 + 32 |@ 1 + 64 |@@@@ 4 + 128 |@@@@@@@@@@@@@@@@ 17 + 256 |@ 1 + 512 |@@@@ 4 + 1024 |@@ 2 + 2048 |@ 1 + 4096 |@@@@@@ 6 + 8192 |@ 1 + 16384 |@@ 2 + 32768 | 0 + 65536 |@@ 2 + 131072 | 0 + + PID=311342, method, Func_abc.func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + PID=311342, method, Func_abc.func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + PID=311342, method, java/lang/Thread.sleep + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 1048576 | 0 + + PID=311342, method, Func_abc.func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + + PID=311342, method, Func_abc.main + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + +The elapsed times section is empty. It would show us anything that is not a +Java method - garbage collection for example. However there was nothing of +the kind in this example. + +The exclusive method elapsed times show us the time spent in the top ten most +time consuming methods, not including time spent in subroutines called by +those methods. + +The inclusive method elapsed times show us the time spent in the top ten most +time consuming methods including time spent in subroutines called by those +methods. + +It is important to pay close attention to the third column, "count" as this +will indicate if there were any instances in a particular timeframe, even if +the number is too small to show up on the histogram clearly. diff --git a/cddl/contrib/dtracetoolkit/Examples/j_calls_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_calls_example.txt new file mode 100644 index 00000000000..3aacb2c9025 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_calls_example.txt @@ -0,0 +1,137 @@ +The following are examples of running the j_calls.d script. + +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0). Method calls and object allocation are only visible +when using the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile + +Here we see it running on Code/Java/Func_abc + +# j_calls.d +Tracing... Hit Ctrl-C to end. +^C + + PID TYPE NAME COUNT + 311334 cload Func_abc 1 + 311334 cload java/io/BufferedInputStream 1 + 311334 cload java/io/BufferedOutputStream 1 + 311334 cload java/io/BufferedReader 1 + 311334 cload java/io/BufferedWriter 1 + 311334 cload java/io/Closeable 1 + 311334 cload java/io/Console 1 + 311334 cload java/io/Console$1 1 + 311334 cload java/io/Console$1$1 1 + 311334 cload java/io/DataInput 1 + 311334 cload java/io/DataInputStream 1 + 311334 cload java/io/DeleteOnExitHook 1 + 311334 cload java/io/ExpiringCache 1 + 311334 cload java/io/ExpiringCache$1 1 + 311334 cload java/io/ExpiringCache$Entry 1 + 311334 cload java/io/File 1 + 311334 cload java/io/File$1 1 + 311334 cload java/io/FileDescriptor 1 + 311334 cload java/io/FileInputStream 1 + 311334 cload java/io/FileOutputStream 1 + 311334 cload java/io/FilePermission 1 + 311334 cload java/io/FilePermission$1 1 + 311334 cload java/io/FilePermissionCollection 1 + 311334 cload java/io/FileReader 1 + 311334 cload java/io/FileSystem 1 + 311334 cload java/io/FilterInputStream 1 + 311334 cload java/io/FilterOutputStream 1 + 311334 cload java/io/Flushable 1 + 311334 cload java/io/InputStream 1 + 311334 cload java/io/InputStreamReader 1 + 311334 cload java/io/ObjectStreamClass 1 + 311334 cload java/io/ObjectStreamField 1 + 311334 cload java/io/OutputStream 1 + 311334 cload java/io/OutputStreamWriter 1 + 311334 cload java/io/PrintStream 1 + 311334 cload java/io/Reader 1 + 311334 cload java/io/Serializable 1 + 311334 cload java/io/UnixFileSystem 1 + 311334 cload java/io/Writer 1 + 311334 cload java/lang/AbstractStringBuilder 1 + 311334 cload java/lang/Appendable 1 + 311334 cload java/lang/ApplicationShutdownHooks 1 + 311334 cload java/lang/ArithmeticException 1 + 311334 cload java/lang/ArrayStoreException 1 + 311334 cload java/lang/Boolean 1 + 311334 cload java/lang/Byte 1 + 311334 cload java/lang/CharSequence 1 + 311334 cload java/lang/Character 1 + 311334 cload java/lang/CharacterDataLatin1 1 + 311334 cload java/lang/Class 1 +[... 1400 lines truncated ...] + 311334 method java/lang/Class.getClassLoader0 34 + 311334 method java/lang/String.toLowerCase 34 + 311334 method sun/security/action/GetPropertyAction.run 34 + 311334 method java/nio/CharBuffer.arrayOffset 36 + 311334 method java/util/HashMap.getEntry 36 + 311334 method java/io/File. 37 + 311334 method java/io/UnixFileSystem.prefixLength 37 + 311334 oalloc java/io/File 37 + 311334 oalloc java/lang/reflect/Field 37 + 311334 method java/io/BufferedReader.readLine 38 + 311334 method java/util/concurrent/locks/AbstractOwnableSynchronizer.setExclusiveOwnerThread 38 + 311334 method java/lang/CharacterDataLatin1.toLowerCase 41 + 311334 method java/lang/CharacterDataLatin1.getProperties 43 + 311334 method java/security/AccessController.doPrivileged 43 + 311334 method java/util/Vector.size 43 + 311334 method java/nio/Buffer.position 44 + 311334 method java/nio/ByteBuffer.arrayOffset 44 + 311334 method java/lang/System.getProperty 48 + 311334 method java/util/Properties.getProperty 50 + 311334 method java/util/BitSet.expandTo 51 + 311334 method java/util/BitSet.set 51 + 311334 method java/lang/System.checkKey 56 + 311334 method java/lang/Thread.currentThread 57 + 311334 method java/util/Hashtable$Entry. 57 + 311334 oalloc [Ljava/lang/String; 57 + 311334 oalloc java/util/Hashtable$Entry 57 + 311334 method java/util/Hashtable.get 59 + 311334 method java/util/Hashtable.put 63 + 311334 method java/util/BitSet.checkInvariants 71 + 311334 method java/util/BitSet.wordIndex 72 + 311334 method java/lang/StringBuilder. 73 + 311334 method java/lang/StringBuilder.toString 73 + 311334 oalloc java/lang/StringBuilder 73 + 311334 method java/lang/AbstractStringBuilder.expandCapacity 81 + 311334 method java/util/HashMap.hash 81 + 311334 method java/util/HashMap.indexFor 81 + 311334 method java/lang/AbstractStringBuilder. 82 + 311334 method java/lang/Character.toLowerCase 82 + 311334 method java/lang/String.startsWith 83 + 311334 method java/util/Arrays.copyOf 87 + 311334 method java/lang/String.lastIndexOf 90 + 311334 method java/lang/String.substring 94 + 311334 method java/util/Arrays.copyOfRange 107 + 311334 method java/lang/String.getChars 156 + 311334 method java/lang/System.getSecurityManager 174 + 311334 method java/lang/String. 175 + 311334 method java/lang/String.equals 202 + 311334 method java/lang/Math.min 208 + 311334 method java/lang/String.hashCode 213 + 311334 method java/lang/String.indexOf 302 + 311334 oalloc [Ljava/lang/Object; 326 + 311334 method java/lang/System.arraycopy 360 + 311334 oalloc [I 374 + 311334 oalloc java/lang/Class 395 + 311334 oalloc [B 406 + 311334 oalloc [S 486 + 311334 method java/lang/StringBuilder.append 533 + 311334 oalloc [[I 541 + 311334 method java/lang/AbstractStringBuilder.append 549 + 311334 method java/lang/Object. 823 + 311334 oalloc java/lang/String 931 + 311334 oalloc [C 1076 + 311334 method java/lang/String.charAt 1960 + +This shows us each of the events associated with the PID 311334, and the +number of times each event happened. These events can be of type cload (class +load), method (method call), mcompile (method compile), mload (compiled method +load), oalloc (object alloc) or thread (thread start). + +In this case you can see 1960 calls to java/lang/String.charAt, and 1076 +object allocations of type [C. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_calltime_example.txt new file mode 100644 index 00000000000..937e06f2a08 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_calltime_example.txt @@ -0,0 +1,67 @@ +The following are examples of j_calltime.d. + +This script traces the elapsed time of Java methods and prints a report of the +top ten in each category. This number is configurable with simple edit of +the DTrace script + +Here it traces the example program, Code/Java/Func_abc + +# j_calltime.d +Tracing... Hit Ctrl-C to end. +^C + +Top 10 counts, + PID TYPE NAME COUNT + 311358 method java/lang/String.equals 202 + 311358 method java/lang/Math.min 208 + 311358 method java/lang/String.hashCode 213 + 311358 method java/lang/String.indexOf 302 + 311358 method java/lang/System.arraycopy 360 + 311358 method java/lang/StringBuilder.append 533 + 311358 method java/lang/AbstractStringBuilder.append 549 + 311358 method java/lang/Object. 823 + 311358 method java/lang/String.charAt 1960 + 0 total - 12020 + +Top 10 elapsed times (us), + PID TYPE NAME TOTAL + +Top 10 exclusive method elapsed times (us), + PID TYPE NAME TOTAL + 311358 method java/nio/ByteBuffer. 5430 + 311358 method java/lang/String.charAt 6079 + 311358 method java/lang/String. 7306 + 311358 method java/lang/StringBuilder.append 10240 + 311358 method java/util/StringTokenizer.scanToken 11075 + 311358 method java/net/URL. 12519 + 311358 method java/io/UnixFileSystem.normalize 13218 + 311358 method sun/net/www/ParseUtil.decode 14208 + 311358 method java/lang/Thread.sleep 3016374 + 0 total - 3344993 + +Top 10 inclusive method elapsed times (us), + PID TYPE NAME TOTAL + 311358 method sun/misc/Launcher. 129120 + 311358 method java/lang/ClassLoader.initSystemClassLoader 129851 + 311358 method java/lang/ClassLoader.getSystemClassLoader 129897 + 311358 method java/lang/ClassLoader.loadClass 267404 + 311358 method java/security/AccessController.doPrivileged 278364 + 311358 method Func_abc.func_c 1009971 + 311358 method Func_abc.func_b 2019995 + 311358 method java/lang/Thread.sleep 3016374 + 311358 method Func_abc.func_a 3027043 + 311358 method Func_abc.main 3027068 + +Counts shows us how many times each different method was called, and how +many methods were called in total. + +The exclusive method elapsed times show the time that each method spent +processing code - while not in other method. + +The inclusive method elapsed times show the time that each method spent +processing code, including the time spent in other calls. + +These elapsed times are the absolute time from when the method began to +when it completed - which includes off-CPU time due to other system events +such as I/O, scheduling, interrupts, etc. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_classflow_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_classflow_example.txt new file mode 100644 index 00000000000..b8a9b75000c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_classflow_example.txt @@ -0,0 +1,89 @@ +Following are examples of j_classflow.d. + +This watches Java method entries and returns from all Java processes on the +system with hotspot provider support (1.6.0) and the flag +"+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile + +Here we can see it run on Code/Java/Func_abc. + +# j_classflow.d Func_abc + C PID TIME(us) -- CLASS.METHOD + 0 311425 4789778117827 -> Func_abc.main + 0 311425 4789778117844 -> Func_abc.func_a + 0 311425 4789779120071 -> Func_abc.func_b + 0 311425 4789780130070 -> Func_abc.func_c + 0 311425 4789781140067 <- Func_abc.func_c + 0 311425 4789781140079 <- Func_abc.func_b + 0 311425 4789781140087 <- Func_abc.func_a + 0 311425 4789781140095 <- Func_abc.main +^C + +The first column, C gives us the CPU ID. + +The second column, TIME(us), gives us the time since boot in microseconds. + +The third column, PID gives us the Process ID. + +The fourth column, CLASS.METHOD gives us the Java class and method name. + +We can see that Func_abc.main called Func.abc.func_a, which in turn +called Func_abc.funcb etc. + +Here we can see an example of running it on java/io/BufferedOutputStream + +# j_classflow.d java/io/BufferedOutputStream + C PID TIME(us) -- CLASS.METHOD + 0 311461 4790094765413 -> java/io/BufferedOutputStream. + 0 311461 4790094765459 <- java/io/BufferedOutputStream. + 0 311461 4790094779559 -> java/io/BufferedOutputStream. + 0 311461 4790094779595 <- java/io/BufferedOutputStream. + 0 311461 4790094965883 -> java/io/BufferedOutputStream.write + 0 311461 4790094965913 <- java/io/BufferedOutputStream.write + 0 311461 4790094965926 -> java/io/BufferedOutputStream.flush + 0 311461 4790094965936 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790094966279 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790094966293 <- java/io/BufferedOutputStream.flush + 0 311461 4790094966588 -> java/io/BufferedOutputStream.write + 0 311461 4790094966602 <- java/io/BufferedOutputStream.write + 0 311461 4790094966610 -> java/io/BufferedOutputStream.flush + 0 311461 4790094966618 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790094966778 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790094966787 <- java/io/BufferedOutputStream.flush + 0 311461 4790094966811 -> java/io/BufferedOutputStream.flush + 0 311461 4790094966819 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790094966828 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790094966836 <- java/io/BufferedOutputStream.flush + 0 311461 4790095970345 -> java/io/BufferedOutputStream.write + 0 311461 4790095970372 <- java/io/BufferedOutputStream.write + 0 311461 4790095970382 -> java/io/BufferedOutputStream.flush + 0 311461 4790095970390 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790095970453 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790095970462 <- java/io/BufferedOutputStream.flush + 0 311461 4790095970737 -> java/io/BufferedOutputStream.write + 0 311461 4790095970751 <- java/io/BufferedOutputStream.write + 0 311461 4790095970759 -> java/io/BufferedOutputStream.flush + 0 311461 4790095970766 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790095970795 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790095970804 <- java/io/BufferedOutputStream.flush + 0 311461 4790095970828 -> java/io/BufferedOutputStream.flush + 0 311461 4790095970836 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790095970844 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790095970853 <- java/io/BufferedOutputStream.flush + 0 311461 4790096980348 -> java/io/BufferedOutputStream.write + 0 311461 4790096980373 <- java/io/BufferedOutputStream.write + 0 311461 4790096980383 -> java/io/BufferedOutputStream.flush + 0 311461 4790096980391 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790096980452 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790096980460 <- java/io/BufferedOutputStream.flush + 0 311461 4790096980735 -> java/io/BufferedOutputStream.write + 0 311461 4790096980749 <- java/io/BufferedOutputStream.write + 0 311461 4790096980757 -> java/io/BufferedOutputStream.flush + 0 311461 4790096980765 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790096980794 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790096980803 <- java/io/BufferedOutputStream.flush + 0 311461 4790096980826 -> java/io/BufferedOutputStream.flush + 0 311461 4790096980834 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790096980843 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790096980851 <- java/io/BufferedOutputStream.flush + + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_cpudist_example.txt new file mode 100644 index 00000000000..15abac649a5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_cpudist_example.txt @@ -0,0 +1,252 @@ +This is an example of j_cpudist.d showing the elapsed times for different +types of Java operations. + +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0), and produces the output in graphical format, showing +a histogram of the amount of time taken by each call. Method calls are only +visible when using the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile + +Because of the extensive results returned otherwise, this script will show you +a configurable number of results in each section. The default (as in this +example) is ten. + +Here we see it tracing the activity of Code/Java/Func_abc. + +# j_cpudist.d +Tracing... Hit Ctrl-C to end. +^C + +Top 10 on-CPU times (us), + +Top 10 exclusive method on-CPU times (us), + PID=311364, method, java/lang/AbstractStringBuilder.append + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 382 + 2 |@@@@@@@@@@@ 151 + 4 |@ 13 + 8 | 1 + 16 | 1 + 32 | 1 + 64 | 0 + + PID=311364, method, java/util/Arrays.copyOf + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 68 + 4 |@@@@@@@ 15 + 8 | 0 + 16 | 0 + 32 | 1 + 64 | 1 + 128 | 0 + 256 |@ 2 + 512 | 0 + + PID=311364, method, java/io/UnixFileSystem.normalize + value ------------- Distribution ------------- count + 1 | 0 + 2 |@ 1 + 4 | 0 + 8 |@@@@@@@@@@@ 9 + 16 |@@@@@@@@@@@@@@ 12 + 32 |@@@@@@ 5 + 64 |@@@@@@@ 6 + 128 |@ 1 + 256 | 0 + + PID=311364, method, java/io/File. + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + PID=311364, method, sun/misc/URLClassPath$JarLoader.getJarFile + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + PID=311364, method, java/io/FilePermission$1.run + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 2 + 4 |@@@@@@@@@@ 1 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 |@@@@@@@@@@ 1 + 2048 | 0 + + PID=311364, method, java/lang/StringBuilder.append + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 526 + 4 | 2 + 8 | 0 + 16 | 4 + 32 | 1 + 64 | 0 + + PID=311364, method, java/lang/String. + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 162 + 4 |@@ 10 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 1 + 128 | 0 + 256 | 1 + 512 | 0 + 1024 | 1 + 2048 | 0 + + PID=311364, method, java/lang/String.charAt + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1953 + 2 | 3 + 4 | 1 + 8 | 1 + 16 | 2 + 32 | 0 + + PID=311364, method, java/lang/System.initializeSystemClass + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + +Top 10 inclusive method on-CPU times (us), + PID=311364, method, sun/misc/Launcher$ExtClassLoader. + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/Launcher$ExtClassLoader.getExtClassLoader + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/Launcher$ExtClassLoader.getExtURLs + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/Launcher. + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/Launcher. + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + + PID=311364, method, java/lang/ClassLoader.loadClassInternal + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 128 |@@@@@@@@@ 2 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 |@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/Launcher$AppClassLoader.loadClass + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 128 |@@@@@@@@@ 2 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 |@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/URLClassPath.getLoader + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@ 1 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 |@@@ 1 + 512 |@@@@@@@@@@@@@@@@@@@@@@ 7 + 1024 |@@@@@@ 2 + 2048 | 0 + 4096 |@@@ 1 + 8192 |@@@ 1 + 16384 | 0 + + PID=311364, method, java/lang/ClassLoader.loadClass + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@ 6 + 64 |@@@@@@@@@@@@@@@@@@@@@ 14 + 128 |@@@@@@ 4 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 |@ 1 + 16384 |@@@ 2 + 32768 | 0 + + PID=311364, method, java/security/AccessController.doPrivileged + value ------------- Distribution ------------- count + 2 | 0 + 4 |@ 1 + 8 |@@@@ 4 + 16 |@@@@@@@@@@ 11 + 32 |@@@@@@@@@@ 11 + 64 | 0 + 128 |@@@ 3 + 256 |@ 1 + 512 |@@@@@ 5 + 1024 |@@ 2 + 2048 |@ 1 + 4096 |@ 1 + 8192 |@@ 2 + 16384 |@ 1 + 32768 | 0 + +The elapsed times section is empty. It would show us anything that is not a +Java method - garbage collection for example. However there was nothing of +the kind in this example. + +The exclusive method elapsed times show us the time spent on-CPU by the most +time consuming methods, not including time spent in subroutines called by +those methods. + +The inclusive method elapsed times show us the time spent on-CPU by the top +ten most time consuming methods including time spent in subroutines called by +those methods. + +It is important to pay close attention to the third column, "count" as this +will indicate if there were any instances in a particular timeframe, even if +the number is too small to show up on the histogram clearly. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_cputime_example.txt new file mode 100644 index 00000000000..0947cc05cbc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_cputime_example.txt @@ -0,0 +1,75 @@ +The following are examples of j_cputime.d. + +This script traces the on-CPU time of Java methods and prints a report. Here +it traces the example program, Code/Java/Func_abc + +# j_cputime.d +Tracing... Hit Ctrl-C to end. +^C + +Top 10 counts, + PID TYPE NAME COUNT + 311374 method java/lang/String.equals 202 + 311374 method java/lang/Math.min 208 + 311374 method java/lang/String.hashCode 213 + 311374 method java/lang/String.indexOf 302 + 311374 method java/lang/System.arraycopy 360 + 311374 method java/lang/StringBuilder.append 533 + 311374 method java/lang/AbstractStringBuilder.append 549 + 311374 method java/lang/Object. 823 + 311374 method java/lang/String.charAt 1960 + 0 total - 12020 + +Top 10 on-CPU times (us), + PID TYPE NAME TOTAL + +Top 10 exclusive method on-CPU times (us), + PID TYPE NAME TOTAL + 311374 method java/io/FilePermission$1.run 1055 + 311374 method java/util/Arrays.copyOf 1110 + 311374 method sun/net/www/ParseUtil.decode 1161 + 311374 method java/io/File. 1212 + 311374 method java/lang/StringBuilder.append 1228 + 311374 method java/io/UnixFileSystem.normalize 1402 + 311374 method java/lang/String. 2251 + 311374 method java/lang/String.charAt 2262 + 311374 method java/lang/System.initializeSystemClass 2751 + 0 total - 99868 + +Top 10 inclusive method on-CPU times (us), + PID TYPE NAME TOTAL + 311374 method java/lang/ClassLoader.loadClassInternal 25826 + 311374 method sun/misc/Launcher$ExtClassLoader.getExtClassLoader 25914 + 311374 method java/net/URL. 27677 + 311374 method sun/misc/Launcher. 28566 + 311374 method sun/misc/Launcher. 28744 + 311374 method java/lang/ClassLoader.initSystemClassLoader 29241 + 311374 method java/lang/ClassLoader.getSystemClassLoader 29249 + 311374 method java/lang/System.initializeSystemClass 33814 + 311374 method java/lang/ClassLoader.loadClass 66564 + 311374 method java/security/AccessController.doPrivileged 67499 + +You can see that it prints the top ten results in each of four categories. + +The first section reports how many times each subroutine was called, and it's +type. + +The second section reports on the on-CPU time of anything that was not of type +"method", in this case - none. + +The exclusive method on-CPU times shows, amongst other results, that +java/lang/String.charAt spent around 2,200 microseconds on-CPU. This times +excludes time spent in other subroutines. + +The inclusive method on-CPU times show the times that various methods +spent on-CPU. This includes the time spent in other subroutines called. + +These on-CPU times are the time the thread spent running on a CPU, from when +the subroutine began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_events_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_events_example.txt new file mode 100644 index 00000000000..2c48700f3d2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_events_example.txt @@ -0,0 +1,134 @@ +The following are examples of j_events.d. + +This counts events from all Java processes on the system with hotspot +provider support (1.6.0). Some events such as method calls are only visible +when using the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile + +Here you can see it running while the program Code/Java/Func_abc + +# j_events.d +Tracing... Hit Ctrl-C to end. +^C + + PID EVENT COUNT + 311379 AttachCurrentThread-entry 1 + 311379 AttachCurrentThread-return 1 + 311379 CallIntMethod-entry 1 + 311379 CallIntMethod-return 1 + 311379 CallStaticBooleanMethod-entry 1 + 311379 CallStaticBooleanMethod-return 1 + 311379 CallStaticObjectMethod-entry 1 + 311379 CallStaticObjectMethod-return 1 + 311379 CallStaticObjectMethodV-entry 1 + 311379 CallStaticObjectMethodV-return 1 + 311379 CallStaticVoidMethod-entry 1 + 311379 CallStaticVoidMethod-return 1 + 311379 CreateJavaVM-entry 1 + 311379 CreateJavaVM-return 1 + 311379 DestroyJavaVM-entry 1 + 311379 DestroyJavaVM-return 1 + 311379 DetachCurrentThread-entry 1 + 311379 DetachCurrentThread-return 1 + 311379 ExceptionCheck-entry 1 + 311379 ExceptionCheck-return 1 + 311379 ExceptionClear-entry 1 + 311379 ExceptionClear-return 1 + 311379 GetDefaultJavaVMInitArgs-entry 1 + 311379 GetDefaultJavaVMInitArgs-return 1 + 311379 GetJavaVM-entry 1 + 311379 GetJavaVM-return 1 + 311379 GetStringRegion-entry 1 + 311379 GetStringRegion-return 1 + 311379 NewByteArray-entry 1 + 311379 NewByteArray-return 1 + 311379 NewObject-entry 1 + 311379 NewObject-return 1 + 311379 NewObjectV-entry 1 + 311379 NewObjectV-return 1 + 311379 SetBooleanField-entry 1 + 311379 SetBooleanField-return 1 + 311379 ToReflectedMethod-entry 1 + 311379 ToReflectedMethod-return 1 + 311379 vm-init-begin 1 + 311379 vm-init-end 1 + 311379 vm-shutdown 1 + 311379 NewGlobalRef-entry 2 + 311379 NewGlobalRef-return 2 + 311379 monitor-wait 2 + 311379 GetStaticFieldID-entry 3 + 311379 GetStaticFieldID-return 3 + 311379 NewObjectArray-entry 3 + 311379 NewObjectArray-return 3 + 311379 SetStaticObjectField-entry 3 + 311379 SetStaticObjectField-return 3 + 311379 GetStaticMethodID-entry 4 + 311379 GetStaticMethodID-return 4 + 311379 EnsureLocalCapacity-entry 5 + 311379 EnsureLocalCapacity-return 5 + 311379 SetByteArrayRegion-entry 5 + 311379 SetByteArrayRegion-return 5 + 311379 SetLongField-entry 5 + 311379 SetLongField-return 5 + 311379 GetMethodID-entry 6 + 311379 GetMethodID-return 6 + 311379 GetObjectArrayElement-entry 6 + 311379 GetObjectArrayElement-return 6 + 311379 GetSuperclass-entry 6 + 311379 GetSuperclass-return 6 + 311379 thread-start 6 + 311379 SetIntField-entry 8 + 311379 SetIntField-return 8 + 311379 GetArrayLength-entry 9 + 311379 GetArrayLength-return 9 + 311379 GetByteArrayRegion-entry 9 + 311379 GetByteArrayRegion-return 9 + 311379 RegisterNatives-entry 9 + 311379 RegisterNatives-return 9 + 311379 GetObjectClass-entry 10 + 311379 GetObjectClass-return 10 + 311379 FindClass-entry 11 + 311379 FindClass-return 11 + 311379 SetObjectArrayElement-entry 12 + 311379 SetObjectArrayElement-return 12 + 311379 GetStringUTFLength-entry 18 + 311379 GetStringUTFLength-return 18 + 311379 GetStringUTFRegion-entry 18 + 311379 GetStringUTFRegion-return 18 + 311379 GetFieldID-entry 21 + 311379 GetFieldID-return 21 + 309790 CallStaticVoidMethod-entry 24 + 309790 CallStaticVoidMethod-return 24 + 194441 CallStaticVoidMethod-entry 26 + 194441 CallStaticVoidMethod-return 26 + 311379 GetStringUTFChars-entry 29 + 311379 GetStringUTFChars-return 29 + 311379 ReleaseStringUTFChars-entry 29 + 311379 ReleaseStringUTFChars-return 29 + 311379 CallObjectMethod-entry 30 + 311379 CallObjectMethod-return 30 + 311379 GetStringCritical-entry 35 + 311379 GetStringCritical-return 35 + 311379 ReleaseStringCritical-entry 35 + 311379 ReleaseStringCritical-return 35 + 311379 ExceptionOccurred-entry 46 + 311379 ExceptionOccurred-return 46 + 311379 GetStringLength-entry 54 + 311379 GetStringLength-return 54 + 311379 NewStringUTF-entry 54 + 311379 NewStringUTF-return 54 + 311379 NewString-entry 55 + 311379 NewString-return 55 + 311379 GetObjectField-entry 60 + 311379 GetObjectField-return 60 + 311379 DeleteLocalRef-entry 108 + 311379 DeleteLocalRef-return 108 + 311379 class-loaded 327 + 311379 object-alloc 5389 + 311379 method-return 12024 + 311379 method-entry 12031 + +You can see that nearly all of the events recorded are from PID 311379, which +we can assume in this case is the program in question. Not all of the lines +correspond to this, however, which is something to be aware of while analysing +the results. diff --git a/cddl/contrib/dtracetoolkit/Examples/j_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_flow_example.txt new file mode 100644 index 00000000000..433bef31422 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_flow_example.txt @@ -0,0 +1,1292 @@ +The following are examples of j_flow.d. + +This is a simple script to trace the not-so-simple flow of Java methods and +classes. Here it traces the example program, Code/Java/func_abc + +# j_flow.d + C PID TIME(us) -- CLASS.METHOD + 0 311403 4789112583163 -> java/lang/Object. + 0 311403 4789112583207 -> java/lang/Object.registerNatives + 0 311403 4789112583323 <- java/lang/Object.registerNatives + 0 311403 4789112583333 <- java/lang/Object. + 0 311403 4789112583343 -> java/lang/String. + 0 311403 4789112583732 -> java/lang/String$CaseInsensitiveComparator. + 0 311403 4789112583743 -> java/lang/String$CaseInsensitiveComparator. + 0 311403 4789112583752 -> java/lang/Object. + 0 311403 4789112583760 <- java/lang/Object. + 0 311403 4789112583767 <- java/lang/String$CaseInsensitiveComparator. + 0 311403 4789112583774 <- java/lang/String$CaseInsensitiveComparator. + 0 311403 4789112583783 <- java/lang/String. + 0 311403 4789112583849 -> java/lang/System. + 0 311403 4789112583859 -> java/lang/System.registerNatives + 0 311403 4789112583878 <- java/lang/System.registerNatives + 0 311403 4789112583887 -> java/lang/System.nullInputStream + 0 311403 4789112583895 -> java/lang/System.currentTimeMillis + 0 311403 4789112583905 <- java/lang/System.currentTimeMillis + 0 311403 4789112583913 <- java/lang/System.nullInputStream + 0 311403 4789112583923 -> java/lang/System.nullPrintStream + 0 311403 4789112583929 -> java/lang/System.currentTimeMillis + 0 311403 4789112583937 <- java/lang/System.currentTimeMillis + 0 311403 4789112583944 <- java/lang/System.nullPrintStream + 0 311403 4789112583951 -> java/lang/System.nullPrintStream + 0 311403 4789112583958 -> java/lang/System.currentTimeMillis + 0 311403 4789112583965 <- java/lang/System.currentTimeMillis + 0 311403 4789112583972 <- java/lang/System.nullPrintStream + 0 311403 4789112583982 <- java/lang/System. + 0 311403 4789112584058 -> java/lang/ThreadGroup. + 0 311403 4789112584068 -> java/lang/Object. + 0 311403 4789112584075 <- java/lang/Object. + 0 311403 4789112584100 <- java/lang/ThreadGroup. + 0 311403 4789112584109 -> java/lang/ThreadGroup. + 0 311403 4789112584116 -> java/lang/Object. + 0 311403 4789112584123 <- java/lang/Object. + 0 311403 4789112584139 -> java/lang/ThreadGroup.checkAccess + 0 311403 4789112584148 -> java/lang/System.getSecurityManager + 0 311403 4789112584157 <- java/lang/System.getSecurityManager + 0 311403 4789112584164 <- java/lang/ThreadGroup.checkAccess + 0 311403 4789112584175 -> java/lang/ThreadGroup.add + 0 311403 4789112584196 <- java/lang/ThreadGroup.add + 0 311403 4789112584202 <- java/lang/ThreadGroup. + 0 311403 4789112584385 -> java/lang/Thread. + 0 311403 4789112584396 -> java/lang/Thread.registerNatives + 0 311403 4789112584421 <- java/lang/Thread.registerNatives + 0 311403 4789112584779 -> java/lang/RuntimePermission. + 0 311403 4789112584789 -> java/security/BasicPermission. + 0 311403 4789112584798 -> java/security/Permission. + 0 311403 4789112584806 -> java/lang/Object. + 0 311403 4789112584814 <- java/lang/Object. + 0 311403 4789112584823 <- java/security/Permission. + 0 311403 4789112584831 -> java/security/BasicPermission.init + 0 311403 4789112584842 -> java/lang/String.length + 0 311403 4789112584850 <- java/lang/String.length + 0 311403 4789112584860 -> java/lang/String.charAt + 0 311403 4789112584869 <- java/lang/String.charAt + 0 311403 4789112584880 -> java/lang/String.equals + 0 311403 4789112584888 <- java/lang/String.equals + 0 311403 4789112584896 <- java/security/BasicPermission.init + 0 311403 4789112584903 <- java/security/BasicPermission. + 0 311403 4789112584910 <- java/lang/RuntimePermission. + 0 311403 4789112585319 -> sun/misc/SoftCache. + 0 311403 4789112585329 -> java/util/AbstractMap. + 0 311403 4789112585337 -> java/lang/Object. + 0 311403 4789112585345 <- java/lang/Object. + 0 311403 4789112585355 <- java/util/AbstractMap. + 0 311403 4789112585485 -> java/lang/ref/ReferenceQueue. + 0 311403 4789112585554 -> java/lang/ref/ReferenceQueue$Null. + 0 311403 4789112585564 -> java/lang/ref/ReferenceQueue$Null. + 0 311403 4789112585572 -> java/lang/ref/ReferenceQueue. + 0 311403 4789112585581 -> java/lang/Object. + 0 311403 4789112585589 <- java/lang/Object. + 0 311403 4789112585646 -> java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585656 -> java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585664 -> java/lang/Object. + 0 311403 4789112585671 <- java/lang/Object. + 0 311403 4789112585678 <- java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585685 <- java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585696 <- java/lang/ref/ReferenceQueue. + 0 311403 4789112585702 <- java/lang/ref/ReferenceQueue$Null. + 0 311403 4789112585709 <- java/lang/ref/ReferenceQueue$Null. + 0 311403 4789112585717 -> java/lang/ref/ReferenceQueue$Null. + 0 311403 4789112585723 -> java/lang/ref/ReferenceQueue$Null. + 0 311403 4789112585729 -> java/lang/ref/ReferenceQueue. + 0 311403 4789112585736 -> java/lang/Object. + 0 311403 4789112585743 <- java/lang/Object. + 0 311403 4789112585748 -> java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585755 -> java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585761 -> java/lang/Object. + 0 311403 4789112585768 <- java/lang/Object. + 0 311403 4789112585796 <- java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585803 <- java/lang/ref/ReferenceQueue$Lock. +[... 22800 lines truncated ...] + 0 311403 4789112982170 <- java/lang/reflect/Method.getModifiers + 0 311403 4789112982182 -> Func_abc.main + 0 311403 4789112982193 -> Func_abc.func_a + 0 311403 4789112982201 -> java/lang/ClassLoader.checkPackageAccess + 0 311403 4789112982208 -> java/lang/System.getSecurityManager + 0 311403 4789112982215 <- java/lang/System.getSecurityManager + 0 311403 4789112982221 -> java/util/HashSet.add + 0 311403 4789112982228 -> java/util/HashMap.put + 0 311403 4789112982234 -> java/lang/Object.hashCode + 0 311403 4789112982241 <- java/lang/Object.hashCode + 0 311403 4789112982247 -> java/util/HashMap.hash + 0 311403 4789112982254 <- java/util/HashMap.hash + 0 311403 4789112982260 -> java/util/HashMap.indexFor + 0 311403 4789112982267 <- java/util/HashMap.indexFor + 0 311403 4789112982274 <- java/util/HashMap.put + 0 311403 4789112982280 <- java/util/HashSet.add + 0 311403 4789112982287 <- java/lang/ClassLoader.checkPackageAccess + 0 311403 4789112982349 -> java/lang/ClassLoader.loadClassInternal + 0 311403 4789112982356 -> java/lang/ClassLoader.loadClass + 0 311403 4789112982363 -> sun/misc/Launcher$AppClassLoader.loadClass + 0 311403 4789112982369 -> java/lang/String.lastIndexOf + 0 311403 4789112982376 -> java/lang/String.lastIndexOf + 0 311403 4789112982384 <- java/lang/String.lastIndexOf + 0 311403 4789112982391 <- java/lang/String.lastIndexOf + 0 311403 4789112982396 -> java/lang/System.getSecurityManager + 0 311403 4789112982404 <- java/lang/System.getSecurityManager + 0 311403 4789112982410 -> java/lang/ClassLoader.loadClass + 0 311403 4789112982416 -> java/lang/ClassLoader.findLoadedClass + 0 311403 4789112982422 -> java/lang/ClassLoader.check + 0 311403 4789112982429 <- java/lang/ClassLoader.check + 0 311403 4789112982435 -> java/lang/ClassLoader.checkName + 0 311403 4789112982442 -> java/lang/String.indexOf + 0 311403 4789112982448 -> java/lang/String.indexOf + 0 311403 4789112982456 <- java/lang/String.indexOf + 0 311403 4789112982462 <- java/lang/String.indexOf + 0 311403 4789112982468 -> sun/misc/VM.allowArraySyntax + 0 311403 4789112982475 <- sun/misc/VM.allowArraySyntax + 0 311403 4789112982481 -> java/lang/String.charAt + 0 311403 4789112982488 <- java/lang/String.charAt + 0 311403 4789112982495 <- java/lang/ClassLoader.checkName + 0 311403 4789112982501 -> java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112982510 <- java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112982517 <- java/lang/ClassLoader.findLoadedClass + 0 311403 4789112982524 -> java/lang/ClassLoader.loadClass + 0 311403 4789112982530 -> java/lang/ClassLoader.findLoadedClass + 0 311403 4789112982536 -> java/lang/ClassLoader.check + 0 311403 4789112982543 <- java/lang/ClassLoader.check + 0 311403 4789112982549 -> java/lang/ClassLoader.checkName + 0 311403 4789112982555 -> java/lang/String.indexOf + 0 311403 4789112982561 -> java/lang/String.indexOf + 0 311403 4789112982569 <- java/lang/String.indexOf + 0 311403 4789112982576 <- java/lang/String.indexOf + 0 311403 4789112982582 -> sun/misc/VM.allowArraySyntax + 0 311403 4789112982589 <- sun/misc/VM.allowArraySyntax + 0 311403 4789112982594 -> java/lang/String.charAt + 0 311403 4789112982602 <- java/lang/String.charAt + 0 311403 4789112982608 <- java/lang/ClassLoader.checkName + 0 311403 4789112982614 -> java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112982623 <- java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112982630 <- java/lang/ClassLoader.findLoadedClass + 0 311403 4789112982636 -> java/lang/ClassLoader.findBootstrapClass0 + 0 311403 4789112982642 -> java/lang/ClassLoader.check + 0 311403 4789112982650 <- java/lang/ClassLoader.check + 0 311403 4789112982655 -> java/lang/ClassLoader.checkName + 0 311403 4789112982662 -> java/lang/String.indexOf + 0 311403 4789112982668 -> java/lang/String.indexOf + 0 311403 4789112982676 <- java/lang/String.indexOf + 0 311403 4789112982682 <- java/lang/String.indexOf + 0 311403 4789112982688 -> sun/misc/VM.allowArraySyntax + 0 311403 4789112982695 <- sun/misc/VM.allowArraySyntax + 0 311403 4789112982701 -> java/lang/String.charAt + 0 311403 4789112982708 <- java/lang/String.charAt + 0 311403 4789112982715 <- java/lang/ClassLoader.checkName + 0 311403 4789112982720 -> java/lang/ClassLoader.findBootstrapClass + 0 311403 4789112982730 <- java/lang/ClassLoader.findBootstrapClass + 0 311403 4789112982737 <- java/lang/ClassLoader.findBootstrapClass0 + 0 311403 4789112982744 <- java/lang/ClassLoader.loadClass + 0 311403 4789112982751 <- java/lang/ClassLoader.loadClass + 0 311403 4789112982757 <- sun/misc/Launcher$AppClassLoader.loadClass + 0 311403 4789112982764 <- java/lang/ClassLoader.loadClass + 0 311403 4789112982771 <- java/lang/ClassLoader.loadClassInternal + 0 311403 4789112982780 -> java/lang/ClassLoader.checkPackageAccess + 0 311403 4789112982787 -> java/lang/System.getSecurityManager + 0 311403 4789112982794 <- java/lang/System.getSecurityManager + 0 311403 4789112982800 -> java/util/HashSet.add + 0 311403 4789112982806 -> java/util/HashMap.put + 0 311403 4789112982813 -> java/lang/Object.hashCode + 0 311403 4789112982820 <- java/lang/Object.hashCode + 0 311403 4789112982826 -> java/util/HashMap.hash + 0 311403 4789112982833 <- java/util/HashMap.hash + 0 311403 4789112982839 -> java/util/HashMap.indexFor + 0 311403 4789112982846 <- java/util/HashMap.indexFor + 0 311403 4789112982853 <- java/util/HashMap.put + 0 311403 4789112982859 <- java/util/HashSet.add + 0 311403 4789112982866 <- java/lang/ClassLoader.checkPackageAccess + 0 311403 4789112982879 -> java/io/PrintStream.println + 0 311403 4789112982889 -> java/io/PrintStream.print + 0 311403 4789112982897 -> java/io/PrintStream.write + 0 311403 4789112982906 -> java/io/PrintStream.ensureOpen + 0 311403 4789112982916 <- java/io/PrintStream.ensureOpen + 0 311403 4789112982927 -> java/io/Writer.write + 0 311403 4789112982939 -> java/io/BufferedWriter.write + 0 311403 4789112982948 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789112982956 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789112982964 -> java/io/BufferedWriter.min + 0 311403 4789112982971 <- java/io/BufferedWriter.min + 0 311403 4789112982980 -> java/lang/String.getChars + 0 311403 4789112982987 -> java/lang/System.arraycopy + 0 311403 4789112982995 <- java/lang/System.arraycopy + 0 311403 4789112983002 <- java/lang/String.getChars + 0 311403 4789112983009 <- java/io/BufferedWriter.write + 0 311403 4789112983016 <- java/io/Writer.write + 0 311403 4789112983024 -> java/io/BufferedWriter.flushBuffer + 0 311403 4789112983031 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789112983038 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789112983046 -> java/io/OutputStreamWriter.write + 0 311403 4789112983056 -> sun/nio/cs/StreamEncoder.write + 0 311403 4789112983066 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789112983073 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789112983082 -> sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789112983093 -> java/nio/CharBuffer.wrap + 0 311403 4789112983099 -> java/nio/HeapCharBuffer. + 0 311403 4789112983106 -> java/nio/CharBuffer. + 0 311403 4789112983113 -> java/nio/Buffer. + 0 311403 4789112983119 -> java/lang/Object. + 0 311403 4789112983126 <- java/lang/Object. + 0 311403 4789112983133 -> java/nio/Buffer.limit + 0 311403 4789112983140 <- java/nio/Buffer.limit + 0 311403 4789112983146 -> java/nio/Buffer.position + 0 311403 4789112983153 <- java/nio/Buffer.position + 0 311403 4789112983160 <- java/nio/Buffer. + 0 311403 4789112983166 <- java/nio/CharBuffer. + 0 311403 4789112983173 <- java/nio/HeapCharBuffer. + 0 311403 4789112983180 <- java/nio/CharBuffer.wrap + 0 311403 4789112983188 -> java/nio/Buffer.hasRemaining + 0 311403 4789112983196 <- java/nio/Buffer.hasRemaining + 0 311403 4789112983206 -> java/nio/charset/CharsetEncoder.encode + 0 311403 4789112983216 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789112983226 -> java/nio/CharBuffer.hasArray + 0 311403 4789112983233 <- java/nio/CharBuffer.hasArray + 0 311403 4789112983243 -> java/nio/ByteBuffer.hasArray + 0 311403 4789112983250 <- java/nio/ByteBuffer.hasArray + 0 311403 4789112983259 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789112983267 -> java/nio/CharBuffer.array + 0 311403 4789112983274 <- java/nio/CharBuffer.array + 0 311403 4789112983282 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789112983289 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789112983297 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789112983305 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789112983316 -> java/nio/ByteBuffer.array + 0 311403 4789112983323 <- java/nio/ByteBuffer.array + 0 311403 4789112983331 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983338 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983346 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983354 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983366 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789112983374 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789112983382 -> java/nio/Buffer.position + 0 311403 4789112983389 <- java/nio/Buffer.position + 0 311403 4789112983395 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983402 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983410 -> java/nio/Buffer.position + 0 311403 4789112983417 <- java/nio/Buffer.position + 0 311403 4789112983424 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789112983431 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789112983439 -> java/nio/charset/CoderResult.isOverflow + 0 311403 4789112983447 <- java/nio/charset/CoderResult.isOverflow + 0 311403 4789112983454 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112983462 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112983469 <- java/nio/charset/CharsetEncoder.encode + 0 311403 4789112983477 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112983485 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112983494 -> java/nio/Buffer.remaining + 0 311403 4789112983501 <- java/nio/Buffer.remaining + 0 311403 4789112983508 <- sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789112983515 <- sun/nio/cs/StreamEncoder.write + 0 311403 4789112983522 <- java/io/OutputStreamWriter.write + 0 311403 4789112983528 <- java/io/BufferedWriter.flushBuffer + 0 311403 4789112983537 -> java/io/OutputStreamWriter.flushBuffer + 0 311403 4789112983546 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789112983555 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789112983565 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789112983574 -> java/nio/Buffer.flip + 0 311403 4789112983581 <- java/nio/Buffer.flip + 0 311403 4789112983591 -> java/nio/ByteBuffer.array + 0 311403 4789112983598 <- java/nio/ByteBuffer.array + 0 311403 4789112983606 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983613 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983623 -> java/io/PrintStream.write + 0 311403 4789112983629 -> java/io/PrintStream.ensureOpen + 0 311403 4789112983636 <- java/io/PrintStream.ensureOpen + 0 311403 4789112983645 -> java/io/BufferedOutputStream.write + 0 311403 4789112983657 -> java/lang/System.arraycopy + 0 311403 4789112983664 <- java/lang/System.arraycopy + 0 311403 4789112983671 <- java/io/BufferedOutputStream.write + 0 311403 4789112983679 -> java/io/BufferedOutputStream.flush + 0 311403 4789112983688 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789112983698 -> java/io/FileOutputStream.write + 0 311403 4789112983707 -> java/io/FileOutputStream.writeBytes + 0 311403 4789112983860 <- java/io/FileOutputStream.writeBytes + 0 311403 4789112983868 <- java/io/FileOutputStream.write + 0 311403 4789112983874 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789112983885 <- java/io/BufferedOutputStream.flush + 0 311403 4789112983892 <- java/io/PrintStream.write + 0 311403 4789112983901 -> java/nio/Buffer.clear + 0 311403 4789112983909 <- java/nio/Buffer.clear + 0 311403 4789112983915 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789112983922 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789112983929 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789112983936 <- java/io/OutputStreamWriter.flushBuffer + 0 311403 4789112983946 -> java/lang/String.indexOf + 0 311403 4789112983952 -> java/lang/String.indexOf + 0 311403 4789112983961 <- java/lang/String.indexOf + 0 311403 4789112983967 <- java/lang/String.indexOf + 0 311403 4789112983974 <- java/io/PrintStream.write + 0 311403 4789112983981 <- java/io/PrintStream.print + 0 311403 4789112983989 -> java/io/PrintStream.newLine + 0 311403 4789112983995 -> java/io/PrintStream.ensureOpen + 0 311403 4789112984002 <- java/io/PrintStream.ensureOpen + 0 311403 4789112984010 -> java/io/BufferedWriter.newLine + 0 311403 4789112984019 -> java/io/Writer.write + 0 311403 4789112984025 -> java/io/BufferedWriter.write + 0 311403 4789112984031 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789112984039 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789112984045 -> java/io/BufferedWriter.min + 0 311403 4789112984052 <- java/io/BufferedWriter.min + 0 311403 4789112984058 -> java/lang/String.getChars + 0 311403 4789112984064 -> java/lang/System.arraycopy + 0 311403 4789112984072 <- java/lang/System.arraycopy + 0 311403 4789112984078 <- java/lang/String.getChars + 0 311403 4789112984085 <- java/io/BufferedWriter.write + 0 311403 4789112984092 <- java/io/Writer.write + 0 311403 4789112984099 <- java/io/BufferedWriter.newLine + 0 311403 4789112984104 -> java/io/BufferedWriter.flushBuffer + 0 311403 4789112984111 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789112984118 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789112984124 -> java/io/OutputStreamWriter.write + 0 311403 4789112984130 -> sun/nio/cs/StreamEncoder.write + 0 311403 4789112984137 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789112984144 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789112984150 -> sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789112984156 -> java/nio/CharBuffer.wrap + 0 311403 4789112984163 -> java/nio/HeapCharBuffer. + 0 311403 4789112984169 -> java/nio/CharBuffer. + 0 311403 4789112984175 -> java/nio/Buffer. + 0 311403 4789112984181 -> java/lang/Object. + 0 311403 4789112984189 <- java/lang/Object. + 0 311403 4789112984194 -> java/nio/Buffer.limit + 0 311403 4789112984202 <- java/nio/Buffer.limit + 0 311403 4789112984207 -> java/nio/Buffer.position + 0 311403 4789112984214 <- java/nio/Buffer.position + 0 311403 4789112984221 <- java/nio/Buffer. + 0 311403 4789112984228 <- java/nio/CharBuffer. + 0 311403 4789112984234 <- java/nio/HeapCharBuffer. + 0 311403 4789112984241 <- java/nio/CharBuffer.wrap + 0 311403 4789112984247 -> java/nio/Buffer.hasRemaining + 0 311403 4789112984254 <- java/nio/Buffer.hasRemaining + 0 311403 4789112984260 -> java/nio/charset/CharsetEncoder.encode + 0 311403 4789112984266 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789112984273 -> java/nio/CharBuffer.hasArray + 0 311403 4789112984280 <- java/nio/CharBuffer.hasArray + 0 311403 4789112984286 -> java/nio/ByteBuffer.hasArray + 0 311403 4789112984293 <- java/nio/ByteBuffer.hasArray + 0 311403 4789112984299 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789112984305 -> java/nio/CharBuffer.array + 0 311403 4789112984312 <- java/nio/CharBuffer.array + 0 311403 4789112984318 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789112984325 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789112984331 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789112984338 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789112984344 -> java/nio/ByteBuffer.array + 0 311403 4789112984352 <- java/nio/ByteBuffer.array + 0 311403 4789112984358 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984365 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984371 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984378 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984384 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789112984391 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789112984397 -> java/nio/Buffer.position + 0 311403 4789112984404 <- java/nio/Buffer.position + 0 311403 4789112984410 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984417 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984423 -> java/nio/Buffer.position + 0 311403 4789112984430 <- java/nio/Buffer.position + 0 311403 4789112984437 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789112984444 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789112984450 -> java/nio/charset/CoderResult.isOverflow + 0 311403 4789112984457 <- java/nio/charset/CoderResult.isOverflow + 0 311403 4789112984463 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112984470 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112984477 <- java/nio/charset/CharsetEncoder.encode + 0 311403 4789112984483 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112984491 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112984497 -> java/nio/Buffer.remaining + 0 311403 4789112984504 <- java/nio/Buffer.remaining + 0 311403 4789112984510 <- sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789112984517 <- sun/nio/cs/StreamEncoder.write + 0 311403 4789112984524 <- java/io/OutputStreamWriter.write + 0 311403 4789112984531 <- java/io/BufferedWriter.flushBuffer + 0 311403 4789112984536 -> java/io/OutputStreamWriter.flushBuffer + 0 311403 4789112984543 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789112984549 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789112984556 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789112984562 -> java/nio/Buffer.flip + 0 311403 4789112984569 <- java/nio/Buffer.flip + 0 311403 4789112984575 -> java/nio/ByteBuffer.array + 0 311403 4789112984582 <- java/nio/ByteBuffer.array + 0 311403 4789112984588 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984595 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984601 -> java/io/PrintStream.write + 0 311403 4789112984607 -> java/io/PrintStream.ensureOpen + 0 311403 4789112984615 <- java/io/PrintStream.ensureOpen + 0 311403 4789112984621 -> java/io/BufferedOutputStream.write + 0 311403 4789112984627 -> java/lang/System.arraycopy + 0 311403 4789112984635 <- java/lang/System.arraycopy + 0 311403 4789112984641 <- java/io/BufferedOutputStream.write + 0 311403 4789112984647 -> java/io/BufferedOutputStream.flush + 0 311403 4789112984654 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789112984660 -> java/io/FileOutputStream.write + 0 311403 4789112984666 -> java/io/FileOutputStream.writeBytes + 0 311403 4789112984712 <- java/io/FileOutputStream.writeBytes + 0 311403 4789112984719 <- java/io/FileOutputStream.write + 0 311403 4789112984726 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789112984733 <- java/io/BufferedOutputStream.flush + 0 311403 4789112984740 <- java/io/PrintStream.write + 0 311403 4789112984746 -> java/nio/Buffer.clear + 0 311403 4789112984753 <- java/nio/Buffer.clear + 0 311403 4789112984760 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789112984766 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789112984773 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789112984780 <- java/io/OutputStreamWriter.flushBuffer + 0 311403 4789112984786 -> java/io/BufferedOutputStream.flush + 0 311403 4789112984792 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789112984800 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789112984807 <- java/io/BufferedOutputStream.flush + 0 311403 4789112984813 <- java/io/PrintStream.newLine + 0 311403 4789112984820 <- java/io/PrintStream.println + 0 311403 4789112984835 -> java/lang/ClassLoader.loadClassInternal + 0 311403 4789112984842 -> java/lang/ClassLoader.loadClass + 0 311403 4789112984849 -> sun/misc/Launcher$AppClassLoader.loadClass + 0 311403 4789112984855 -> java/lang/String.lastIndexOf + 0 311403 4789112984862 -> java/lang/String.lastIndexOf + 0 311403 4789112984870 <- java/lang/String.lastIndexOf + 0 311403 4789112984877 <- java/lang/String.lastIndexOf + 0 311403 4789112984882 -> java/lang/System.getSecurityManager + 0 311403 4789112984890 <- java/lang/System.getSecurityManager + 0 311403 4789112984896 -> java/lang/ClassLoader.loadClass + 0 311403 4789112984902 -> java/lang/ClassLoader.findLoadedClass + 0 311403 4789112984908 -> java/lang/ClassLoader.check + 0 311403 4789112984915 <- java/lang/ClassLoader.check + 0 311403 4789112984921 -> java/lang/ClassLoader.checkName + 0 311403 4789112984927 -> java/lang/String.indexOf + 0 311403 4789112984934 -> java/lang/String.indexOf + 0 311403 4789112984942 <- java/lang/String.indexOf + 0 311403 4789112984948 <- java/lang/String.indexOf + 0 311403 4789112984954 -> sun/misc/VM.allowArraySyntax + 0 311403 4789112984961 <- sun/misc/VM.allowArraySyntax + 0 311403 4789112984967 -> java/lang/String.charAt + 0 311403 4789112984974 <- java/lang/String.charAt + 0 311403 4789112984981 <- java/lang/ClassLoader.checkName + 0 311403 4789112984987 -> java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112984998 <- java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112985005 <- java/lang/ClassLoader.findLoadedClass + 0 311403 4789112985011 -> java/lang/ClassLoader.loadClass + 0 311403 4789112985018 -> java/lang/ClassLoader.findLoadedClass + 0 311403 4789112985024 -> java/lang/ClassLoader.check + 0 311403 4789112985031 <- java/lang/ClassLoader.check + 0 311403 4789112985037 -> java/lang/ClassLoader.checkName + 0 311403 4789112985043 -> java/lang/String.indexOf + 0 311403 4789112985049 -> java/lang/String.indexOf + 0 311403 4789112985057 <- java/lang/String.indexOf + 0 311403 4789112985064 <- java/lang/String.indexOf + 0 311403 4789112985070 -> sun/misc/VM.allowArraySyntax + 0 311403 4789112985077 <- sun/misc/VM.allowArraySyntax + 0 311403 4789112985083 -> java/lang/String.charAt + 0 311403 4789112985090 <- java/lang/String.charAt + 0 311403 4789112985096 <- java/lang/ClassLoader.checkName + 0 311403 4789112985102 -> java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112985111 <- java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112985118 <- java/lang/ClassLoader.findLoadedClass + 0 311403 4789112985124 -> java/lang/ClassLoader.findBootstrapClass0 + 0 311403 4789112985130 -> java/lang/ClassLoader.check + 0 311403 4789112985138 <- java/lang/ClassLoader.check + 0 311403 4789112985143 -> java/lang/ClassLoader.checkName + 0 311403 4789112985150 -> java/lang/String.indexOf + 0 311403 4789112985156 -> java/lang/String.indexOf + 0 311403 4789112985164 <- java/lang/String.indexOf + 0 311403 4789112985170 <- java/lang/String.indexOf + 0 311403 4789112985176 -> sun/misc/VM.allowArraySyntax + 0 311403 4789112985183 <- sun/misc/VM.allowArraySyntax + 0 311403 4789112985189 -> java/lang/String.charAt + 0 311403 4789112985196 <- java/lang/String.charAt + 0 311403 4789112985203 <- java/lang/ClassLoader.checkName + 0 311403 4789112985208 -> java/lang/ClassLoader.findBootstrapClass + 0 311403 4789112985219 <- java/lang/ClassLoader.findBootstrapClass + 0 311403 4789112985226 <- java/lang/ClassLoader.findBootstrapClass0 + 0 311403 4789112985233 <- java/lang/ClassLoader.loadClass + 0 311403 4789112985240 <- java/lang/ClassLoader.loadClass + 0 311403 4789112985247 <- sun/misc/Launcher$AppClassLoader.loadClass + 0 311403 4789112985253 <- java/lang/ClassLoader.loadClass + 0 311403 4789112985260 <- java/lang/ClassLoader.loadClassInternal + 0 311403 4789112985270 -> java/lang/ClassLoader.checkPackageAccess + 0 311403 4789112985277 -> java/lang/System.getSecurityManager + 0 311403 4789112985285 <- java/lang/System.getSecurityManager + 0 311403 4789112985291 -> java/util/HashSet.add + 0 311403 4789112985297 -> java/util/HashMap.put + 0 311403 4789112985304 -> java/lang/Object.hashCode + 0 311403 4789112985311 <- java/lang/Object.hashCode + 0 311403 4789112985317 -> java/util/HashMap.hash + 0 311403 4789112985324 <- java/util/HashMap.hash + 0 311403 4789112985330 -> java/util/HashMap.indexFor + 0 311403 4789112985337 <- java/util/HashMap.indexFor + 0 311403 4789112985344 <- java/util/HashMap.put + 0 311403 4789112985351 <- java/util/HashSet.add + 0 311403 4789112985358 <- java/lang/ClassLoader.checkPackageAccess + 0 311403 4789112985371 -> java/lang/Thread.currentThread + 0 311403 4789112985379 <- java/lang/Thread.currentThread + 0 311403 4789112985387 -> java/lang/Thread.sleep + 0 311403 4789113990048 <- java/lang/Thread.sleep + 0 311403 4789113990080 -> Func_abc.func_b + 0 311403 4789113990104 -> java/io/PrintStream.println + 0 311403 4789113990112 -> java/io/PrintStream.print + 0 311403 4789113990118 -> java/io/PrintStream.write + 0 311403 4789113990125 -> java/io/PrintStream.ensureOpen + 0 311403 4789113990133 <- java/io/PrintStream.ensureOpen + 0 311403 4789113990139 -> java/io/Writer.write + 0 311403 4789113990147 -> java/io/BufferedWriter.write + 0 311403 4789113990154 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789113990161 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789113990168 -> java/io/BufferedWriter.min + 0 311403 4789113990176 <- java/io/BufferedWriter.min + 0 311403 4789113990182 -> java/lang/String.getChars + 0 311403 4789113990189 -> java/lang/System.arraycopy + 0 311403 4789113990198 <- java/lang/System.arraycopy + 0 311403 4789113990205 <- java/lang/String.getChars + 0 311403 4789113990212 <- java/io/BufferedWriter.write + 0 311403 4789113990219 <- java/io/Writer.write + 0 311403 4789113990225 -> java/io/BufferedWriter.flushBuffer + 0 311403 4789113990231 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789113990238 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789113990245 -> java/io/OutputStreamWriter.write + 0 311403 4789113990252 -> sun/nio/cs/StreamEncoder.write + 0 311403 4789113990258 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789113990265 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789113990272 -> sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789113990279 -> java/nio/CharBuffer.wrap + 0 311403 4789113990286 -> java/nio/HeapCharBuffer. + 0 311403 4789113990293 -> java/nio/CharBuffer. + 0 311403 4789113990299 -> java/nio/Buffer. + 0 311403 4789113990306 -> java/lang/Object. + 0 311403 4789113990313 <- java/lang/Object. + 0 311403 4789113990320 -> java/nio/Buffer.limit + 0 311403 4789113990327 <- java/nio/Buffer.limit + 0 311403 4789113990333 -> java/nio/Buffer.position + 0 311403 4789113990340 <- java/nio/Buffer.position + 0 311403 4789113990347 <- java/nio/Buffer. + 0 311403 4789113990354 <- java/nio/CharBuffer. + 0 311403 4789113990360 <- java/nio/HeapCharBuffer. + 0 311403 4789113990367 <- java/nio/CharBuffer.wrap + 0 311403 4789113990373 -> java/nio/Buffer.hasRemaining + 0 311403 4789113990381 <- java/nio/Buffer.hasRemaining + 0 311403 4789113990387 -> java/nio/charset/CharsetEncoder.encode + 0 311403 4789113990394 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789113990401 -> java/nio/CharBuffer.hasArray + 0 311403 4789113990409 <- java/nio/CharBuffer.hasArray + 0 311403 4789113990415 -> java/nio/ByteBuffer.hasArray + 0 311403 4789113990422 <- java/nio/ByteBuffer.hasArray + 0 311403 4789113990428 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789113990435 -> java/nio/CharBuffer.array + 0 311403 4789113990442 <- java/nio/CharBuffer.array + 0 311403 4789113990448 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789113990455 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789113990461 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789113990468 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789113990475 -> java/nio/ByteBuffer.array + 0 311403 4789113990482 <- java/nio/ByteBuffer.array + 0 311403 4789113990488 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990495 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990501 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990508 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990517 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789113990524 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789113990529 -> java/nio/Buffer.position + 0 311403 4789113990537 <- java/nio/Buffer.position + 0 311403 4789113990542 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990550 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990555 -> java/nio/Buffer.position + 0 311403 4789113990563 <- java/nio/Buffer.position + 0 311403 4789113990569 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789113990576 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789113990583 -> java/nio/charset/CoderResult.isOverflow + 0 311403 4789113990590 <- java/nio/charset/CoderResult.isOverflow + 0 311403 4789113990596 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113990603 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113990610 <- java/nio/charset/CharsetEncoder.encode + 0 311403 4789113990616 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113990624 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113990630 -> java/nio/Buffer.remaining + 0 311403 4789113990637 <- java/nio/Buffer.remaining + 0 311403 4789113990643 <- sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789113990650 <- sun/nio/cs/StreamEncoder.write + 0 311403 4789113990657 <- java/io/OutputStreamWriter.write + 0 311403 4789113990664 <- java/io/BufferedWriter.flushBuffer + 0 311403 4789113990670 -> java/io/OutputStreamWriter.flushBuffer + 0 311403 4789113990677 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789113990683 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789113990690 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789113990697 -> java/nio/Buffer.flip + 0 311403 4789113990704 <- java/nio/Buffer.flip + 0 311403 4789113990710 -> java/nio/ByteBuffer.array + 0 311403 4789113990717 <- java/nio/ByteBuffer.array + 0 311403 4789113990723 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990730 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990736 -> java/io/PrintStream.write + 0 311403 4789113990742 -> java/io/PrintStream.ensureOpen + 0 311403 4789113990749 <- java/io/PrintStream.ensureOpen + 0 311403 4789113990756 -> java/io/BufferedOutputStream.write + 0 311403 4789113990763 -> java/lang/System.arraycopy + 0 311403 4789113990770 <- java/lang/System.arraycopy + 0 311403 4789113990777 <- java/io/BufferedOutputStream.write + 0 311403 4789113990783 -> java/io/BufferedOutputStream.flush + 0 311403 4789113990790 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789113990797 -> java/io/FileOutputStream.write + 0 311403 4789113990803 -> java/io/FileOutputStream.writeBytes + 0 311403 4789113990841 <- java/io/FileOutputStream.writeBytes + 0 311403 4789113990848 <- java/io/FileOutputStream.write + 0 311403 4789113990855 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789113990862 <- java/io/BufferedOutputStream.flush + 0 311403 4789113990869 <- java/io/PrintStream.write + 0 311403 4789113990875 -> java/nio/Buffer.clear + 0 311403 4789113990882 <- java/nio/Buffer.clear + 0 311403 4789113990888 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789113990895 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789113990902 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789113990909 <- java/io/OutputStreamWriter.flushBuffer + 0 311403 4789113990915 -> java/lang/String.indexOf + 0 311403 4789113990922 -> java/lang/String.indexOf + 0 311403 4789113990930 <- java/lang/String.indexOf + 0 311403 4789113990936 <- java/lang/String.indexOf + 0 311403 4789113990943 <- java/io/PrintStream.write + 0 311403 4789113990950 <- java/io/PrintStream.print + 0 311403 4789113990956 -> java/io/PrintStream.newLine + 0 311403 4789113990962 -> java/io/PrintStream.ensureOpen + 0 311403 4789113990969 <- java/io/PrintStream.ensureOpen + 0 311403 4789113990975 -> java/io/BufferedWriter.newLine + 0 311403 4789113990981 -> java/io/Writer.write + 0 311403 4789113990988 -> java/io/BufferedWriter.write + 0 311403 4789113990994 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789113991001 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789113991007 -> java/io/BufferedWriter.min + 0 311403 4789113991014 <- java/io/BufferedWriter.min + 0 311403 4789113991020 -> java/lang/String.getChars + 0 311403 4789113991026 -> java/lang/System.arraycopy + 0 311403 4789113991034 <- java/lang/System.arraycopy + 0 311403 4789113991040 <- java/lang/String.getChars + 0 311403 4789113991047 <- java/io/BufferedWriter.write + 0 311403 4789113991054 <- java/io/Writer.write + 0 311403 4789113991060 <- java/io/BufferedWriter.newLine + 0 311403 4789113991066 -> java/io/BufferedWriter.flushBuffer + 0 311403 4789113991072 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789113991080 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789113991086 -> java/io/OutputStreamWriter.write + 0 311403 4789113991092 -> sun/nio/cs/StreamEncoder.write + 0 311403 4789113991098 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789113991106 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789113991112 -> sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789113991118 -> java/nio/CharBuffer.wrap + 0 311403 4789113991124 -> java/nio/HeapCharBuffer. + 0 311403 4789113991131 -> java/nio/CharBuffer. + 0 311403 4789113991137 -> java/nio/Buffer. + 0 311403 4789113991143 -> java/lang/Object. + 0 311403 4789113991150 <- java/lang/Object. + 0 311403 4789113991156 -> java/nio/Buffer.limit + 0 311403 4789113991163 <- java/nio/Buffer.limit + 0 311403 4789113991169 -> java/nio/Buffer.position + 0 311403 4789113991176 <- java/nio/Buffer.position + 0 311403 4789113991182 <- java/nio/Buffer. + 0 311403 4789113991189 <- java/nio/CharBuffer. + 0 311403 4789113991196 <- java/nio/HeapCharBuffer. + 0 311403 4789113991202 <- java/nio/CharBuffer.wrap + 0 311403 4789113991208 -> java/nio/Buffer.hasRemaining + 0 311403 4789113991215 <- java/nio/Buffer.hasRemaining + 0 311403 4789113991221 -> java/nio/charset/CharsetEncoder.encode + 0 311403 4789113991281 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789113991287 -> java/nio/CharBuffer.hasArray + 0 311403 4789113991295 <- java/nio/CharBuffer.hasArray + 0 311403 4789113991301 -> java/nio/ByteBuffer.hasArray + 0 311403 4789113991308 <- java/nio/ByteBuffer.hasArray + 0 311403 4789113991314 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789113991320 -> java/nio/CharBuffer.array + 0 311403 4789113991328 <- java/nio/CharBuffer.array + 0 311403 4789113991333 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789113991341 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789113991347 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789113991354 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789113991360 -> java/nio/ByteBuffer.array + 0 311403 4789113991367 <- java/nio/ByteBuffer.array + 0 311403 4789113991373 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991380 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991386 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991393 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991400 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789113991407 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789113991413 -> java/nio/Buffer.position + 0 311403 4789113991420 <- java/nio/Buffer.position + 0 311403 4789113991426 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991433 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991439 -> java/nio/Buffer.position + 0 311403 4789113991446 <- java/nio/Buffer.position + 0 311403 4789113991453 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789113991459 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789113991465 -> java/nio/charset/CoderResult.isOverflow + 0 311403 4789113991473 <- java/nio/charset/CoderResult.isOverflow + 0 311403 4789113991479 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113991486 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113991493 <- java/nio/charset/CharsetEncoder.encode + 0 311403 4789113991499 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113991506 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113991512 -> java/nio/Buffer.remaining + 0 311403 4789113991519 <- java/nio/Buffer.remaining + 0 311403 4789113991526 <- sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789113991533 <- sun/nio/cs/StreamEncoder.write + 0 311403 4789113991539 <- java/io/OutputStreamWriter.write + 0 311403 4789113991546 <- java/io/BufferedWriter.flushBuffer + 0 311403 4789113991552 -> java/io/OutputStreamWriter.flushBuffer + 0 311403 4789113991559 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789113991565 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789113991572 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789113991578 -> java/nio/Buffer.flip + 0 311403 4789113991585 <- java/nio/Buffer.flip + 0 311403 4789113991591 -> java/nio/ByteBuffer.array + 0 311403 4789113991598 <- java/nio/ByteBuffer.array + 0 311403 4789113991604 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991611 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991617 -> java/io/PrintStream.write + 0 311403 4789113991623 -> java/io/PrintStream.ensureOpen + 0 311403 4789113991630 <- java/io/PrintStream.ensureOpen + 0 311403 4789113991636 -> java/io/BufferedOutputStream.write + 0 311403 4789113991643 -> java/lang/System.arraycopy + 0 311403 4789113991651 <- java/lang/System.arraycopy + 0 311403 4789113991657 <- java/io/BufferedOutputStream.write + 0 311403 4789113991663 -> java/io/BufferedOutputStream.flush + 0 311403 4789113991670 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789113991676 -> java/io/FileOutputStream.write + 0 311403 4789113991682 -> java/io/FileOutputStream.writeBytes + 0 311403 4789113991701 <- java/io/FileOutputStream.writeBytes + 0 311403 4789113991708 <- java/io/FileOutputStream.write + 0 311403 4789113991720 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789113991728 <- java/io/BufferedOutputStream.flush + 0 311403 4789113991734 <- java/io/PrintStream.write + 0 311403 4789113991740 -> java/nio/Buffer.clear + 0 311403 4789113991747 <- java/nio/Buffer.clear + 0 311403 4789113991754 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789113991761 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789113991768 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789113991774 <- java/io/OutputStreamWriter.flushBuffer + 0 311403 4789113991780 -> java/io/BufferedOutputStream.flush + 0 311403 4789113991787 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789113991794 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789113991801 <- java/io/BufferedOutputStream.flush + 0 311403 4789113991808 <- java/io/PrintStream.newLine + 0 311403 4789113991815 <- java/io/PrintStream.println + 0 311403 4789113991821 -> java/lang/Thread.currentThread + 0 311403 4789113991828 <- java/lang/Thread.currentThread + 0 311403 4789113991834 -> java/lang/Thread.sleep + 0 311403 4789115000050 <- java/lang/Thread.sleep + 0 311403 4789115000081 -> Func_abc.func_c + 0 311403 4789115000105 -> java/io/PrintStream.println + 0 311403 4789115000113 -> java/io/PrintStream.print + 0 311403 4789115000120 -> java/io/PrintStream.write + 0 311403 4789115000126 -> java/io/PrintStream.ensureOpen + 0 311403 4789115000134 <- java/io/PrintStream.ensureOpen + 0 311403 4789115000141 -> java/io/Writer.write + 0 311403 4789115000148 -> java/io/BufferedWriter.write + 0 311403 4789115000155 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789115000162 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789115000170 -> java/io/BufferedWriter.min + 0 311403 4789115000177 <- java/io/BufferedWriter.min + 0 311403 4789115000183 -> java/lang/String.getChars + 0 311403 4789115000191 -> java/lang/System.arraycopy + 0 311403 4789115000199 <- java/lang/System.arraycopy + 0 311403 4789115000206 <- java/lang/String.getChars + 0 311403 4789115000213 <- java/io/BufferedWriter.write + 0 311403 4789115000220 <- java/io/Writer.write + 0 311403 4789115000226 -> java/io/BufferedWriter.flushBuffer + 0 311403 4789115000233 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789115000240 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789115000246 -> java/io/OutputStreamWriter.write + 0 311403 4789115000253 -> sun/nio/cs/StreamEncoder.write + 0 311403 4789115000260 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789115000267 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789115000274 -> sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789115000281 -> java/nio/CharBuffer.wrap + 0 311403 4789115000288 -> java/nio/HeapCharBuffer. + 0 311403 4789115000294 -> java/nio/CharBuffer. + 0 311403 4789115000301 -> java/nio/Buffer. + 0 311403 4789115000307 -> java/lang/Object. + 0 311403 4789115000315 <- java/lang/Object. + 0 311403 4789115000321 -> java/nio/Buffer.limit + 0 311403 4789115000328 <- java/nio/Buffer.limit + 0 311403 4789115000334 -> java/nio/Buffer.position + 0 311403 4789115000342 <- java/nio/Buffer.position + 0 311403 4789115000348 <- java/nio/Buffer. + 0 311403 4789115000355 <- java/nio/CharBuffer. + 0 311403 4789115000362 <- java/nio/HeapCharBuffer. + 0 311403 4789115000368 <- java/nio/CharBuffer.wrap + 0 311403 4789115000374 -> java/nio/Buffer.hasRemaining + 0 311403 4789115000382 <- java/nio/Buffer.hasRemaining + 0 311403 4789115000388 -> java/nio/charset/CharsetEncoder.encode + 0 311403 4789115000396 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789115000402 -> java/nio/CharBuffer.hasArray + 0 311403 4789115000410 <- java/nio/CharBuffer.hasArray + 0 311403 4789115000416 -> java/nio/ByteBuffer.hasArray + 0 311403 4789115000424 <- java/nio/ByteBuffer.hasArray + 0 311403 4789115000430 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789115000436 -> java/nio/CharBuffer.array + 0 311403 4789115000444 <- java/nio/CharBuffer.array + 0 311403 4789115000450 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789115000457 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789115000463 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789115000470 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789115000476 -> java/nio/ByteBuffer.array + 0 311403 4789115000483 <- java/nio/ByteBuffer.array + 0 311403 4789115000489 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000496 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000502 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000509 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000518 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789115000525 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789115000531 -> java/nio/Buffer.position + 0 311403 4789115000538 <- java/nio/Buffer.position + 0 311403 4789115000544 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000551 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000557 -> java/nio/Buffer.position + 0 311403 4789115000564 <- java/nio/Buffer.position + 0 311403 4789115000570 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789115000577 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789115000584 -> java/nio/charset/CoderResult.isOverflow + 0 311403 4789115000591 <- java/nio/charset/CoderResult.isOverflow + 0 311403 4789115000597 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115000605 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115000611 <- java/nio/charset/CharsetEncoder.encode + 0 311403 4789115000617 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115000625 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115000631 -> java/nio/Buffer.remaining + 0 311403 4789115000638 <- java/nio/Buffer.remaining + 0 311403 4789115000645 <- sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789115000652 <- sun/nio/cs/StreamEncoder.write + 0 311403 4789115000658 <- java/io/OutputStreamWriter.write + 0 311403 4789115000665 <- java/io/BufferedWriter.flushBuffer + 0 311403 4789115000671 -> java/io/OutputStreamWriter.flushBuffer + 0 311403 4789115000678 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789115000685 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789115000692 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789115000698 -> java/nio/Buffer.flip + 0 311403 4789115000705 <- java/nio/Buffer.flip + 0 311403 4789115000711 -> java/nio/ByteBuffer.array + 0 311403 4789115000718 <- java/nio/ByteBuffer.array + 0 311403 4789115000724 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000731 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000738 -> java/io/PrintStream.write + 0 311403 4789115000744 -> java/io/PrintStream.ensureOpen + 0 311403 4789115000751 <- java/io/PrintStream.ensureOpen + 0 311403 4789115000758 -> java/io/BufferedOutputStream.write + 0 311403 4789115000764 -> java/lang/System.arraycopy + 0 311403 4789115000772 <- java/lang/System.arraycopy + 0 311403 4789115000778 <- java/io/BufferedOutputStream.write + 0 311403 4789115000785 -> java/io/BufferedOutputStream.flush + 0 311403 4789115000791 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789115000798 -> java/io/FileOutputStream.write + 0 311403 4789115000805 -> java/io/FileOutputStream.writeBytes + 0 311403 4789115000843 <- java/io/FileOutputStream.writeBytes + 0 311403 4789115000850 <- java/io/FileOutputStream.write + 0 311403 4789115000857 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789115000864 <- java/io/BufferedOutputStream.flush + 0 311403 4789115000871 <- java/io/PrintStream.write + 0 311403 4789115000877 -> java/nio/Buffer.clear + 0 311403 4789115000884 <- java/nio/Buffer.clear + 0 311403 4789115000891 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789115000897 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789115000904 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789115000911 <- java/io/OutputStreamWriter.flushBuffer + 0 311403 4789115000917 -> java/lang/String.indexOf + 0 311403 4789115000924 -> java/lang/String.indexOf + 0 311403 4789115000932 <- java/lang/String.indexOf + 0 311403 4789115000939 <- java/lang/String.indexOf + 0 311403 4789115000945 <- java/io/PrintStream.write + 0 311403 4789115000952 <- java/io/PrintStream.print + 0 311403 4789115000958 -> java/io/PrintStream.newLine + 0 311403 4789115000964 -> java/io/PrintStream.ensureOpen + 0 311403 4789115000971 <- java/io/PrintStream.ensureOpen + 0 311403 4789115000977 -> java/io/BufferedWriter.newLine + 0 311403 4789115000983 -> java/io/Writer.write + 0 311403 4789115000990 -> java/io/BufferedWriter.write + 0 311403 4789115000996 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789115001003 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789115001009 -> java/io/BufferedWriter.min + 0 311403 4789115001016 <- java/io/BufferedWriter.min + 0 311403 4789115001022 -> java/lang/String.getChars + 0 311403 4789115001029 -> java/lang/System.arraycopy + 0 311403 4789115001036 <- java/lang/System.arraycopy + 0 311403 4789115001042 <- java/lang/String.getChars + 0 311403 4789115001049 <- java/io/BufferedWriter.write + 0 311403 4789115001056 <- java/io/Writer.write + 0 311403 4789115001062 <- java/io/BufferedWriter.newLine + 0 311403 4789115001068 -> java/io/BufferedWriter.flushBuffer + 0 311403 4789115001075 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789115001082 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789115001088 -> java/io/OutputStreamWriter.write + 0 311403 4789115001094 -> sun/nio/cs/StreamEncoder.write + 0 311403 4789115001101 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789115001108 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789115001114 -> sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789115001120 -> java/nio/CharBuffer.wrap + 0 311403 4789115001127 -> java/nio/HeapCharBuffer. + 0 311403 4789115001133 -> java/nio/CharBuffer. + 0 311403 4789115001139 -> java/nio/Buffer. + 0 311403 4789115001145 -> java/lang/Object. + 0 311403 4789115001152 <- java/lang/Object. + 0 311403 4789115001158 -> java/nio/Buffer.limit + 0 311403 4789115001165 <- java/nio/Buffer.limit + 0 311403 4789115001171 -> java/nio/Buffer.position + 0 311403 4789115001178 <- java/nio/Buffer.position + 0 311403 4789115001185 <- java/nio/Buffer. + 0 311403 4789115001191 <- java/nio/CharBuffer. + 0 311403 4789115001198 <- java/nio/HeapCharBuffer. + 0 311403 4789115001204 <- java/nio/CharBuffer.wrap + 0 311403 4789115001210 -> java/nio/Buffer.hasRemaining + 0 311403 4789115001217 <- java/nio/Buffer.hasRemaining + 0 311403 4789115001223 -> java/nio/charset/CharsetEncoder.encode + 0 311403 4789115001230 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789115001236 -> java/nio/CharBuffer.hasArray + 0 311403 4789115001243 <- java/nio/CharBuffer.hasArray + 0 311403 4789115001249 -> java/nio/ByteBuffer.hasArray + 0 311403 4789115001256 <- java/nio/ByteBuffer.hasArray + 0 311403 4789115001262 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789115001269 -> java/nio/CharBuffer.array + 0 311403 4789115001276 <- java/nio/CharBuffer.array + 0 311403 4789115001281 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789115001288 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789115001294 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789115001302 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789115001308 -> java/nio/ByteBuffer.array + 0 311403 4789115001315 <- java/nio/ByteBuffer.array + 0 311403 4789115001320 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001328 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001334 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001341 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001347 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789115001354 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789115001360 -> java/nio/Buffer.position + 0 311403 4789115001367 <- java/nio/Buffer.position + 0 311403 4789115001373 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001380 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001386 -> java/nio/Buffer.position + 0 311403 4789115001393 <- java/nio/Buffer.position + 0 311403 4789115001400 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789115001407 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789115001413 -> java/nio/charset/CoderResult.isOverflow + 0 311403 4789115001420 <- java/nio/charset/CoderResult.isOverflow + 0 311403 4789115001426 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115001433 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115001440 <- java/nio/charset/CharsetEncoder.encode + 0 311403 4789115001446 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115001453 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115001459 -> java/nio/Buffer.remaining + 0 311403 4789115001466 <- java/nio/Buffer.remaining + 0 311403 4789115001473 <- sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789115001480 <- sun/nio/cs/StreamEncoder.write + 0 311403 4789115001487 <- java/io/OutputStreamWriter.write + 0 311403 4789115001493 <- java/io/BufferedWriter.flushBuffer + 0 311403 4789115001499 -> java/io/OutputStreamWriter.flushBuffer + 0 311403 4789115001506 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789115001512 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789115001519 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789115001525 -> java/nio/Buffer.flip + 0 311403 4789115001532 <- java/nio/Buffer.flip + 0 311403 4789115001538 -> java/nio/ByteBuffer.array + 0 311403 4789115001545 <- java/nio/ByteBuffer.array + 0 311403 4789115001551 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001558 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001564 -> java/io/PrintStream.write + 0 311403 4789115001570 -> java/io/PrintStream.ensureOpen + 0 311403 4789115001577 <- java/io/PrintStream.ensureOpen + 0 311403 4789115001583 -> java/io/BufferedOutputStream.write + 0 311403 4789115001590 -> java/lang/System.arraycopy + 0 311403 4789115001597 <- java/lang/System.arraycopy + 0 311403 4789115001604 <- java/io/BufferedOutputStream.write + 0 311403 4789115001610 -> java/io/BufferedOutputStream.flush + 0 311403 4789115001621 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789115001628 -> java/io/FileOutputStream.write + 0 311403 4789115001634 -> java/io/FileOutputStream.writeBytes + 0 311403 4789115001652 <- java/io/FileOutputStream.writeBytes + 0 311403 4789115001706 <- java/io/FileOutputStream.write + 0 311403 4789115001713 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789115001720 <- java/io/BufferedOutputStream.flush + 0 311403 4789115001727 <- java/io/PrintStream.write + 0 311403 4789115001733 -> java/nio/Buffer.clear + 0 311403 4789115001740 <- java/nio/Buffer.clear + 0 311403 4789115001747 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789115001753 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789115001760 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789115001767 <- java/io/OutputStreamWriter.flushBuffer + 0 311403 4789115001773 -> java/io/BufferedOutputStream.flush + 0 311403 4789115001779 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789115001787 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789115001794 <- java/io/BufferedOutputStream.flush + 0 311403 4789115001801 <- java/io/PrintStream.newLine + 0 311403 4789115001807 <- java/io/PrintStream.println + 0 311403 4789115001813 -> java/lang/Thread.currentThread + 0 311403 4789115001821 <- java/lang/Thread.currentThread + 0 311403 4789115001827 -> java/lang/Thread.sleep + 0 311403 4789116010060 <- java/lang/Thread.sleep + 0 311403 4789116010073 <- Func_abc.func_c + 0 311403 4789116010080 <- Func_abc.func_b + 0 311403 4789116010086 <- Func_abc.func_a + 0 311403 4789116010093 <- Func_abc.main + 0 311403 4789116010118 -> java/lang/Thread.exit + 0 311403 4789116010145 -> java/lang/ThreadGroup.remove + 0 311403 4789116010160 -> java/lang/System.arraycopy + 0 311403 4789116010169 <- java/lang/System.arraycopy + 0 311403 4789116010178 -> java/lang/Object.notifyAll + 0 311403 4789116010192 <- java/lang/Object.notifyAll + 0 311403 4789116010199 <- java/lang/ThreadGroup.remove + 0 311403 4789116010212 <- java/lang/Thread.exit + 0 311403 4789116010380 -> java/lang/Thread. + 0 311403 4789116010388 -> java/lang/Object. + 0 311403 4789116010395 <- java/lang/Object. + 0 311403 4789116010402 -> java/lang/Object. + 0 311403 4789116010409 <- java/lang/Object. + 0 311403 4789116010415 -> java/lang/Thread.init + 0 311403 4789116010422 -> java/lang/Thread.currentThread + 0 311403 4789116010430 <- java/lang/Thread.currentThread + 0 311403 4789116010436 -> java/lang/System.getSecurityManager + 0 311403 4789116010444 <- java/lang/System.getSecurityManager + 0 311403 4789116010450 -> java/lang/ThreadGroup.checkAccess + 0 311403 4789116010457 -> java/lang/System.getSecurityManager + 0 311403 4789116010464 <- java/lang/System.getSecurityManager + 0 311403 4789116010471 <- java/lang/ThreadGroup.checkAccess + 0 311403 4789116010477 -> java/lang/ThreadGroup.addUnstarted + 0 311403 4789116010484 <- java/lang/ThreadGroup.addUnstarted + 0 311403 4789116010491 -> java/lang/String.toCharArray + 0 311403 4789116010499 -> java/lang/String.getChars + 0 311403 4789116010506 -> java/lang/System.arraycopy + 0 311403 4789116010514 <- java/lang/System.arraycopy + 0 311403 4789116010521 <- java/lang/String.getChars + 0 311403 4789116010527 <- java/lang/String.toCharArray + 0 311403 4789116010534 -> java/lang/Thread.getContextClassLoader + 0 311403 4789116010541 <- java/lang/Thread.getContextClassLoader + 0 311403 4789116010548 -> java/security/AccessController.getContext + 0 311403 4789116010554 -> java/security/AccessController.getStackAccessControlContext + 0 311403 4789116010569 <- java/security/AccessController.getStackAccessControlContext + 0 311403 4789116010576 -> java/security/AccessControlContext.optimize + 0 311403 4789116010583 -> java/security/AccessController.getInheritedAccessControlContext + 0 311403 4789116010591 <- java/security/AccessController.getInheritedAccessControlContext + 0 311403 4789116010599 <- java/security/AccessControlContext.optimize + 0 311403 4789116010606 <- java/security/AccessController.getContext + 0 311403 4789116010612 -> java/lang/Thread.setPriority + 0 311403 4789116010618 -> java/lang/Thread.checkAccess + 0 311403 4789116010625 -> java/lang/System.getSecurityManager + 0 311403 4789116010632 <- java/lang/System.getSecurityManager + 0 311403 4789116010639 <- java/lang/Thread.checkAccess + 0 311403 4789116010645 -> java/lang/Thread.setPriority0 + 0 311403 4789116010664 <- java/lang/Thread.setPriority0 + 0 311403 4789116010671 <- java/lang/Thread.setPriority + 0 311403 4789116010678 -> java/lang/Thread.nextThreadID + 0 311403 4789116010686 <- java/lang/Thread.nextThreadID + 0 311403 4789116010693 <- java/lang/Thread.init + 0 311403 4789116010700 <- java/lang/Thread. + 0 311403 4789116010707 -> java/lang/ThreadGroup.add + 0 311403 4789116010716 <- java/lang/ThreadGroup.add + 0 311403 4789116010729 -> java/lang/Shutdown.shutdown + 0 311403 4789116010740 -> java/lang/Shutdown.sequence + 0 311403 4789116010748 -> java/lang/Shutdown.runHooks + 0 311403 4789116010758 -> java/util/AbstractList.iterator + 0 311403 4789116011022 -> java/util/AbstractList$Itr. + 0 311403 4789116011032 -> java/util/AbstractList$Itr. + 0 311403 4789116011042 -> java/lang/Object. + 0 311403 4789116011050 <- java/lang/Object. + 0 311403 4789116011062 <- java/util/AbstractList$Itr. + 0 311403 4789116011069 <- java/util/AbstractList$Itr. + 0 311403 4789116011076 <- java/util/AbstractList.iterator + 0 311403 4789116011087 -> java/util/AbstractList$Itr.hasNext + 0 311403 4789116011099 <- java/util/AbstractList$Itr.hasNext + 0 311403 4789116011107 -> java/util/AbstractList$Itr.next + 0 311403 4789116011115 -> java/util/AbstractList$Itr.checkForComodification + 0 311403 4789116011123 <- java/util/AbstractList$Itr.checkForComodification + 0 311403 4789116011131 -> java/util/ArrayList.get + 0 311403 4789116011138 -> java/util/ArrayList.RangeCheck + 0 311403 4789116011145 <- java/util/ArrayList.RangeCheck + 0 311403 4789116011152 <- java/util/ArrayList.get + 0 311403 4789116011159 <- java/util/AbstractList$Itr.next + 0 311403 4789116011170 -> java/io/Console$1$1.run + 0 311403 4789116011180 -> java/io/Console.access$600 + 0 311403 4789116011189 <- java/io/Console.access$600 + 0 311403 4789116011196 <- java/io/Console$1$1.run + 0 311403 4789116011202 -> java/util/AbstractList$Itr.hasNext + 0 311403 4789116011209 <- java/util/AbstractList$Itr.hasNext + 0 311403 4789116011215 -> java/util/AbstractList$Itr.next + 0 311403 4789116011221 -> java/util/AbstractList$Itr.checkForComodification + 0 311403 4789116011229 <- java/util/AbstractList$Itr.checkForComodification + 0 311403 4789116011235 -> java/util/ArrayList.get + 0 311403 4789116011241 -> java/util/ArrayList.RangeCheck + 0 311403 4789116011248 <- java/util/ArrayList.RangeCheck + 0 311403 4789116011255 <- java/util/ArrayList.get + 0 311403 4789116011262 <- java/util/AbstractList$Itr.next + 0 311403 4789116011268 -> java/lang/ApplicationShutdownHooks.run + 0 311403 4789116011280 -> java/util/IdentityHashMap.keySet + 0 311403 4789116011442 -> java/util/IdentityHashMap$KeySet. + 0 311403 4789116011452 -> java/util/IdentityHashMap$KeySet. + 0 311403 4789116011462 -> java/util/AbstractSet. + 0 311403 4789116011469 -> java/util/AbstractCollection. + 0 311403 4789116011475 -> java/lang/Object. + 0 311403 4789116011483 <- java/lang/Object. + 0 311403 4789116011490 <- java/util/AbstractCollection. + 0 311403 4789116011497 <- java/util/AbstractSet. + 0 311403 4789116011503 <- java/util/IdentityHashMap$KeySet. + 0 311403 4789116011510 <- java/util/IdentityHashMap$KeySet. + 0 311403 4789116011528 <- java/util/IdentityHashMap.keySet + 0 311403 4789116011538 -> java/util/IdentityHashMap$KeySet.iterator + 0 311403 4789116011727 -> java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011737 -> java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011748 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011757 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011766 -> java/lang/Object. + 0 311403 4789116011774 <- java/lang/Object. + 0 311403 4789116011784 -> java/util/IdentityHashMap.access$000 + 0 311403 4789116011793 <- java/util/IdentityHashMap.access$000 + 0 311403 4789116011803 -> java/util/IdentityHashMap.access$200 + 0 311403 4789116011811 <- java/util/IdentityHashMap.access$200 + 0 311403 4789116011821 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011828 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011835 <- java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011842 <- java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011849 <- java/util/IdentityHashMap$KeySet.iterator + 0 311403 4789116011858 -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311403 4789116011866 <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311403 4789116011873 -> java/util/IdentityHashMap$KeySet.iterator + 0 311403 4789116011879 -> java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011886 -> java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011892 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011899 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011905 -> java/lang/Object. + 0 311403 4789116011912 <- java/lang/Object. + 0 311403 4789116011919 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011926 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011934 <- java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011940 <- java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011947 <- java/util/IdentityHashMap$KeySet.iterator + 0 311403 4789116011953 -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311403 4789116011961 <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311403 4789116011968 <- java/lang/ApplicationShutdownHooks.run + 0 311403 4789116011974 -> java/util/AbstractList$Itr.hasNext + 0 311403 4789116011982 <- java/util/AbstractList$Itr.hasNext + 0 311403 4789116011988 -> java/util/AbstractList$Itr.next + 0 311403 4789116011994 -> java/util/AbstractList$Itr.checkForComodification + 0 311403 4789116012002 <- java/util/AbstractList$Itr.checkForComodification + 0 311403 4789116012008 -> java/util/ArrayList.get + 0 311403 4789116012014 -> java/util/ArrayList.RangeCheck + 0 311403 4789116012021 <- java/util/ArrayList.RangeCheck + 0 311403 4789116012028 <- java/util/ArrayList.get + 0 311403 4789116012035 <- java/util/AbstractList$Itr.next + 0 311403 4789116012041 -> java/io/File$1.run + 0 311403 4789116012187 -> java/io/DeleteOnExitHook. + 0 311403 4789116012333 -> java/util/LinkedHashSet. + 0 311403 4789116012343 -> java/util/HashSet. + 0 311403 4789116012350 -> java/util/AbstractSet. + 0 311403 4789116012356 -> java/util/AbstractCollection. + 0 311403 4789116012362 -> java/lang/Object. + 0 311403 4789116012370 <- java/lang/Object. + 0 311403 4789116012377 <- java/util/AbstractCollection. + 0 311403 4789116012384 <- java/util/AbstractSet. + 0 311403 4789116012394 -> java/util/LinkedHashMap. + 0 311403 4789116012404 -> java/util/HashMap. + 0 311403 4789116012410 -> java/util/AbstractMap. + 0 311403 4789116012417 -> java/lang/Object. + 0 311403 4789116012424 <- java/lang/Object. + 0 311403 4789116012431 <- java/util/AbstractMap. + 0 311403 4789116012438 -> java/lang/Float.isNaN + 0 311403 4789116012445 <- java/lang/Float.isNaN + 0 311403 4789116012456 -> java/util/LinkedHashMap.init + 0 311403 4789116012463 -> java/util/LinkedHashMap$Entry. + 0 311403 4789116012469 -> java/util/HashMap$Entry. + 0 311403 4789116012476 -> java/lang/Object. + 0 311403 4789116012482 <- java/lang/Object. + 0 311403 4789116012489 <- java/util/HashMap$Entry. + 0 311403 4789116012496 <- java/util/LinkedHashMap$Entry. + 0 311403 4789116012503 <- java/util/LinkedHashMap.init + 0 311403 4789116012510 <- java/util/HashMap. + 0 311403 4789116012516 <- java/util/LinkedHashMap. + 0 311403 4789116012523 <- java/util/HashSet. + 0 311403 4789116012529 <- java/util/LinkedHashSet. + 0 311403 4789116012538 <- java/io/DeleteOnExitHook. + 0 311403 4789116012547 -> java/io/DeleteOnExitHook.hook + 0 311403 4789116012556 -> java/io/DeleteOnExitHook. + 0 311403 4789116012565 -> java/lang/Object. + 0 311403 4789116012572 <- java/lang/Object. + 0 311403 4789116012579 <- java/io/DeleteOnExitHook. + 0 311403 4789116012586 <- java/io/DeleteOnExitHook.hook + 0 311403 4789116012594 -> java/io/DeleteOnExitHook.run + 0 311403 4789116012605 -> java/util/ArrayList. + 0 311403 4789116012612 -> java/util/AbstractList. + 0 311403 4789116012618 -> java/util/AbstractCollection. + 0 311403 4789116012624 -> java/lang/Object. + 0 311403 4789116012631 <- java/lang/Object. + 0 311403 4789116012638 <- java/util/AbstractCollection. + 0 311403 4789116012645 <- java/util/AbstractList. + 0 311403 4789116012654 -> java/util/AbstractCollection.toArray + 0 311403 4789116012664 -> java/util/HashSet.size + 0 311403 4789116012674 <- java/util/HashSet.size + 0 311403 4789116012682 -> java/util/HashSet.iterator + 0 311403 4789116012691 -> java/util/HashMap.keySet + 0 311403 4789116012782 -> java/util/HashMap$KeySet. + 0 311403 4789116012791 -> java/util/HashMap$KeySet. + 0 311403 4789116012801 -> java/util/AbstractSet. + 0 311403 4789116012807 -> java/util/AbstractCollection. + 0 311403 4789116012814 -> java/lang/Object. + 0 311403 4789116012821 <- java/lang/Object. + 0 311403 4789116012828 <- java/util/AbstractCollection. + 0 311403 4789116012835 <- java/util/AbstractSet. + 0 311403 4789116012841 <- java/util/HashMap$KeySet. + 0 311403 4789116012848 <- java/util/HashMap$KeySet. + 0 311403 4789116012855 <- java/util/HashMap.keySet + 0 311403 4789116012864 -> java/util/HashMap$KeySet.iterator + 0 311403 4789116012874 -> java/util/LinkedHashMap.newKeyIterator + 0 311403 4789116013056 -> java/util/LinkedHashMap$KeyIterator. + 0 311403 4789116013066 -> java/util/LinkedHashMap$KeyIterator. + 0 311403 4789116013076 -> java/util/LinkedHashMap$LinkedHashIterator. + 0 311403 4789116013085 -> java/util/LinkedHashMap$LinkedHashIterator. + 0 311403 4789116013095 -> java/lang/Object. + 0 311403 4789116013102 <- java/lang/Object. + 0 311403 4789116013117 <- java/util/LinkedHashMap$LinkedHashIterator. + 0 311403 4789116013125 <- java/util/LinkedHashMap$LinkedHashIterator. + 0 311403 4789116013132 <- java/util/LinkedHashMap$KeyIterator. + 0 311403 4789116013138 <- java/util/LinkedHashMap$KeyIterator. + 0 311403 4789116013145 <- java/util/LinkedHashMap.newKeyIterator + 0 311403 4789116013152 <- java/util/HashMap$KeySet.iterator + 0 311403 4789116013159 <- java/util/HashSet.iterator + 0 311403 4789116013168 -> java/util/LinkedHashMap$LinkedHashIterator.hasNext + 0 311403 4789116013176 <- java/util/LinkedHashMap$LinkedHashIterator.hasNext + 0 311403 4789116013183 <- java/util/AbstractCollection.toArray + 0 311403 4789116013190 -> java/lang/Object.getClass + 0 311403 4789116013198 <- java/lang/Object.getClass + 0 311403 4789116013206 <- java/util/ArrayList. + 0 311403 4789116013216 -> java/util/Collections.reverse + 0 311403 4789116013228 <- java/util/Collections.reverse + 0 311403 4789116013236 -> java/util/AbstractList.iterator + 0 311403 4789116013243 -> java/util/AbstractList$Itr. + 0 311403 4789116013250 -> java/util/AbstractList$Itr. + 0 311403 4789116013256 -> java/lang/Object. + 0 311403 4789116013263 <- java/lang/Object. + 0 311403 4789116013270 <- java/util/AbstractList$Itr. + 0 311403 4789116013276 <- java/util/AbstractList$Itr. + 0 311403 4789116013283 <- java/util/AbstractList.iterator + 0 311403 4789116013292 -> java/util/AbstractList$Itr.hasNext + 0 311403 4789116013299 <- java/util/AbstractList$Itr.hasNext + 0 311403 4789116013306 <- java/io/DeleteOnExitHook.run + 0 311403 4789116013313 <- java/io/File$1.run + 0 311403 4789116013319 -> java/util/AbstractList$Itr.hasNext + 0 311403 4789116013326 <- java/util/AbstractList$Itr.hasNext + 0 311403 4789116013333 <- java/lang/Shutdown.runHooks + 0 311403 4789116013342 <- java/lang/Shutdown.sequence + 0 311403 4789116013349 <- java/lang/Shutdown.shutdown + +The fourth column is indented by 2 spaces to show when a new method begins. +This shows what is calling what. + +The TIME(us) column shows time from boot in microseconds. + +If the output looks strange, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + +I truncated the above output by 22800 lines so that it would fit. To make +sense of the output, try searching for "Func_abc" or using grep. The +lines were, + + 0 311403 4789112982182 -> Func_abc.main + 0 311403 4789112982193 -> Func_abc.func_a + 0 311403 4789113990080 -> Func_abc.func_b + 0 311403 4789115000081 -> Func_abc.func_c + 0 311403 4789116010073 <- Func_abc.func_c + 0 311403 4789116010080 <- Func_abc.func_b + 0 311403 4789116010086 <- Func_abc.func_a + 0 311403 4789116010093 <- Func_abc.main + +You can also use the j_classflow.d script to only trace one class. + +If you see "drops" warnings, see the Notes/ALLjava_notes.txt file for details. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_flowtime_example.txt new file mode 100644 index 00000000000..22c6a612f87 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_flowtime_example.txt @@ -0,0 +1,1287 @@ +The following are examples of j_flowtime.d. + +This is a simple script to trace the timing and the not-so-simple flow of +Java methods and classes. Here it traces the example program, +Code/Java/func_abc + +# j_flowtime.d + C PID/TID TIME(us) DELTA(us) -- CLASS.METHOD + 0 311481/2 4790256870903 2 -> java/lang/Object. + 0 311481/2 4790256870950 46 -> java/lang/Object.registerNatives + 0 311481/2 4790256871090 140 <- java/lang/Object.registerNatives + 0 311481/2 4790256871109 18 <- java/lang/Object. + 0 311481/2 4790256871121 12 -> java/lang/String. + 0 311481/2 4790256871518 397 -> java/lang/String$CaseInsensitiveComparator. + 0 311481/2 4790256871531 12 -> java/lang/String$CaseInsensitiveComparator. + 0 311481/2 4790256871541 10 -> java/lang/Object. + 0 311481/2 4790256871549 7 <- java/lang/Object. + 0 311481/2 4790256871558 8 <- java/lang/String$CaseInsensitiveComparator. + 0 311481/2 4790256871566 7 <- java/lang/String$CaseInsensitiveComparator. + 0 311481/2 4790256871575 9 <- java/lang/String. + 0 311481/2 4790256871644 68 -> java/lang/System. + 0 311481/2 4790256871656 11 -> java/lang/System.registerNatives + 0 311481/2 4790256871675 18 <- java/lang/System.registerNatives + 0 311481/2 4790256871686 10 -> java/lang/System.nullInputStream + 0 311481/2 4790256871695 9 -> java/lang/System.currentTimeMillis + 0 311481/2 4790256871705 10 <- java/lang/System.currentTimeMillis + 0 311481/2 4790256871714 8 <- java/lang/System.nullInputStream + 0 311481/2 4790256871726 11 -> java/lang/System.nullPrintStream + 0 311481/2 4790256871734 7 -> java/lang/System.currentTimeMillis + 0 311481/2 4790256871741 7 <- java/lang/System.currentTimeMillis + 0 311481/2 4790256871749 7 <- java/lang/System.nullPrintStream + 0 311481/2 4790256871758 9 -> java/lang/System.nullPrintStream + 0 311481/2 4790256871766 7 -> java/lang/System.currentTimeMillis + 0 311481/2 4790256871773 7 <- java/lang/System.currentTimeMillis + 0 311481/2 4790256871781 7 <- java/lang/System.nullPrintStream + 0 311481/2 4790256871792 10 <- java/lang/System. + 0 311481/2 4790256871870 78 -> java/lang/ThreadGroup. + 0 311481/2 4790256871881 10 -> java/lang/Object. + 0 311481/2 4790256871889 7 <- java/lang/Object. + 0 311481/2 4790256871906 17 <- java/lang/ThreadGroup. + 0 311481/2 4790256871918 11 -> java/lang/ThreadGroup. + 0 311481/2 4790256871926 7 -> java/lang/Object. + 0 311481/2 4790256871933 7 <- java/lang/Object. + 0 311481/2 4790256871945 12 -> java/lang/ThreadGroup.checkAccess + 0 311481/2 4790256871955 10 -> java/lang/System.getSecurityManager + 0 311481/2 4790256871964 8 <- java/lang/System.getSecurityManager + 0 311481/2 4790256871972 8 <- java/lang/ThreadGroup.checkAccess + 0 311481/2 4790256871984 12 -> java/lang/ThreadGroup.add + 0 311481/2 4790256872006 21 <- java/lang/ThreadGroup.add + 0 311481/2 4790256872014 8 <- java/lang/ThreadGroup. + 0 311481/2 4790256872201 187 -> java/lang/Thread. + 0 311481/2 4790256872213 12 -> java/lang/Thread.registerNatives + 0 311481/2 4790256872239 25 <- java/lang/Thread.registerNatives + 0 311481/2 4790256872606 367 -> java/lang/RuntimePermission. + 0 311481/2 4790256872618 11 -> java/security/BasicPermission. + 0 311481/2 4790256872628 9 -> java/security/Permission. + 0 311481/2 4790256872637 9 -> java/lang/Object. + 0 311481/2 4790256872645 7 <- java/lang/Object. + 0 311481/2 4790256872656 10 <- java/security/Permission. + 0 311481/2 4790256872666 10 -> java/security/BasicPermission.init + 0 311481/2 4790256872677 11 -> java/lang/String.length + 0 311481/2 4790256872686 8 <- java/lang/String.length + 0 311481/2 4790256872697 11 -> java/lang/String.charAt + 0 311481/2 4790256872707 10 <- java/lang/String.charAt + 0 311481/2 4790256872720 12 -> java/lang/String.equals + 0 311481/2 4790256872728 8 <- java/lang/String.equals + 0 311481/2 4790256872737 9 <- java/security/BasicPermission.init + 0 311481/2 4790256872745 7 <- java/security/BasicPermission. + 0 311481/2 4790256872753 7 <- java/lang/RuntimePermission. + 0 311481/2 4790256873195 442 -> sun/misc/SoftCache. + 0 311481/2 4790256873208 12 -> java/util/AbstractMap. + 0 311481/2 4790256873218 9 -> java/lang/Object. + 0 311481/2 4790256873226 7 <- java/lang/Object. + 0 311481/2 4790256873238 11 <- java/util/AbstractMap. + 0 311481/2 4790256873371 133 -> java/lang/ref/ReferenceQueue. + 0 311481/2 4790256873443 72 -> java/lang/ref/ReferenceQueue$Null. + 0 311481/2 4790256873454 10 -> java/lang/ref/ReferenceQueue$Null. + 0 311481/2 4790256873464 9 -> java/lang/ref/ReferenceQueue. + 0 311481/2 4790256873474 9 -> java/lang/Object. + 0 311481/2 4790256873481 7 <- java/lang/Object. + 0 311481/2 4790256873542 60 -> java/lang/ref/ReferenceQueue$Lock. + 0 311481/2 4790256873553 10 -> java/lang/ref/ReferenceQueue$Lock. + 0 311481/2 4790256873562 9 -> java/lang/Object. + 0 311481/2 4790256873570 7 <- java/lang/Object. + 0 311481/2 4790256873578 7 <- java/lang/ref/ReferenceQueue$Lock. + 0 311481/2 4790256873585 7 <- java/lang/ref/ReferenceQueue$Lock. + 0 311481/2 4790256873597 11 <- java/lang/ref/ReferenceQueue. + 0 311481/2 4790256873604 7 <- java/lang/ref/ReferenceQueue$Null. + 0 311481/2 4790256873612 7 <- java/lang/ref/ReferenceQueue$Null. + 0 311481/2 4790256873622 9 -> java/lang/ref/ReferenceQueue$Null. + 0 311481/2 4790256873629 7 -> java/lang/ref/ReferenceQueue$Null. + 0 311481/2 4790256873636 7 -> java/lang/ref/ReferenceQueue. + 0 311481/2 4790256873644 7 -> java/lang/Object. + 0 311481/2 4790256873651 6 <- java/lang/Object. + 0 311481/2 4790256873659 7 -> java/lang/ref/ReferenceQueue$Lock. +[... 22800 lines truncated ...] + 0 311481/2 4790257387424 7 <- java/util/HashMap.indexFor + 0 311481/2 4790257387432 8 <- java/util/HashMap.put + 0 311481/2 4790257387440 7 <- java/util/HashSet.add + 0 311481/2 4790257387447 7 <- java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257387473 26 -> java/lang/reflect/Method.getModifiers + 0 311481/2 4790257387486 12 <- java/lang/reflect/Method.getModifiers + 0 311481/2 4790257387500 14 -> Func_abc.main + 0 311481/2 4790257387512 11 -> Func_abc.func_a + 0 311481/2 4790257387522 9 -> java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257387530 7 -> java/lang/System.getSecurityManager + 0 311481/2 4790257387537 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790257387545 8 -> java/util/HashSet.add + 0 311481/2 4790257387552 7 -> java/util/HashMap.put + 0 311481/2 4790257387559 7 -> java/lang/Object.hashCode + 0 311481/2 4790257387567 7 <- java/lang/Object.hashCode + 0 311481/2 4790257387574 7 -> java/util/HashMap.hash + 0 311481/2 4790257387581 7 <- java/util/HashMap.hash + 0 311481/2 4790257387589 7 -> java/util/HashMap.indexFor + 0 311481/2 4790257387596 7 <- java/util/HashMap.indexFor + 0 311481/2 4790257387604 8 <- java/util/HashMap.put + 0 311481/2 4790257387611 7 <- java/util/HashSet.add + 0 311481/2 4790257387619 7 <- java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257387683 64 -> java/lang/ClassLoader.loadClassInternal + 0 311481/2 4790257387691 8 -> java/lang/ClassLoader.loadClass + 0 311481/2 4790257387699 7 -> sun/misc/Launcher$AppClassLoader.loadClass + 0 311481/2 4790257387706 7 -> java/lang/String.lastIndexOf + 0 311481/2 4790257387713 7 -> java/lang/String.lastIndexOf + 0 311481/2 4790257387722 8 <- java/lang/String.lastIndexOf + 0 311481/2 4790257387729 7 <- java/lang/String.lastIndexOf + 0 311481/2 4790257387737 7 -> java/lang/System.getSecurityManager + 0 311481/2 4790257387760 22 <- java/lang/System.getSecurityManager + 0 311481/2 4790257387768 7 -> java/lang/ClassLoader.loadClass + 0 311481/2 4790257387775 7 -> java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257387782 7 -> java/lang/ClassLoader.check + 0 311481/2 4790257387789 7 <- java/lang/ClassLoader.check + 0 311481/2 4790257387797 7 -> java/lang/ClassLoader.checkName + 0 311481/2 4790257387805 7 -> java/lang/String.indexOf + 0 311481/2 4790257387812 7 -> java/lang/String.indexOf + 0 311481/2 4790257387820 8 <- java/lang/String.indexOf + 0 311481/2 4790257387828 7 <- java/lang/String.indexOf + 0 311481/2 4790257387835 7 -> sun/misc/VM.allowArraySyntax + 0 311481/2 4790257387843 7 <- sun/misc/VM.allowArraySyntax + 0 311481/2 4790257387850 7 -> java/lang/String.charAt + 0 311481/2 4790257387857 7 <- java/lang/String.charAt + 0 311481/2 4790257387865 7 <- java/lang/ClassLoader.checkName + 0 311481/2 4790257387873 7 -> java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257387883 9 <- java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257387890 7 <- java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257387899 8 -> java/lang/ClassLoader.loadClass + 0 311481/2 4790257387906 7 -> java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257387913 7 -> java/lang/ClassLoader.check + 0 311481/2 4790257387920 7 <- java/lang/ClassLoader.check + 0 311481/2 4790257387928 7 -> java/lang/ClassLoader.checkName + 0 311481/2 4790257387935 7 -> java/lang/String.indexOf + 0 311481/2 4790257387942 7 -> java/lang/String.indexOf + 0 311481/2 4790257387951 8 <- java/lang/String.indexOf + 0 311481/2 4790257387958 7 <- java/lang/String.indexOf + 0 311481/2 4790257387966 7 -> sun/misc/VM.allowArraySyntax + 0 311481/2 4790257387973 7 <- sun/misc/VM.allowArraySyntax + 0 311481/2 4790257387981 7 -> java/lang/String.charAt + 0 311481/2 4790257387988 7 <- java/lang/String.charAt + 0 311481/2 4790257387995 7 <- java/lang/ClassLoader.checkName + 0 311481/2 4790257388003 7 -> java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257388012 8 <- java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257388020 7 <- java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257388028 7 -> java/lang/ClassLoader.findBootstrapClass0 + 0 311481/2 4790257388035 7 -> java/lang/ClassLoader.check + 0 311481/2 4790257388042 7 <- java/lang/ClassLoader.check + 0 311481/2 4790257388050 7 -> java/lang/ClassLoader.checkName + 0 311481/2 4790257388057 7 -> java/lang/String.indexOf + 0 311481/2 4790257388064 7 -> java/lang/String.indexOf + 0 311481/2 4790257388072 8 <- java/lang/String.indexOf + 0 311481/2 4790257388080 7 <- java/lang/String.indexOf + 0 311481/2 4790257388087 7 -> sun/misc/VM.allowArraySyntax + 0 311481/2 4790257388094 7 <- sun/misc/VM.allowArraySyntax + 0 311481/2 4790257388102 7 -> java/lang/String.charAt + 0 311481/2 4790257388109 7 <- java/lang/String.charAt + 0 311481/2 4790257388117 7 <- java/lang/ClassLoader.checkName + 0 311481/2 4790257388124 7 -> java/lang/ClassLoader.findBootstrapClass + 0 311481/2 4790257388134 9 <- java/lang/ClassLoader.findBootstrapClass + 0 311481/2 4790257388142 8 <- java/lang/ClassLoader.findBootstrapClass0 + 0 311481/2 4790257388150 8 <- java/lang/ClassLoader.loadClass + 0 311481/2 4790257388158 7 <- java/lang/ClassLoader.loadClass + 0 311481/2 4790257388166 7 <- sun/misc/Launcher$AppClassLoader.loadClass + 0 311481/2 4790257388173 7 <- java/lang/ClassLoader.loadClass + 0 311481/2 4790257388181 7 <- java/lang/ClassLoader.loadClassInternal + 0 311481/2 4790257388193 11 -> java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257388200 7 -> java/lang/System.getSecurityManager + 0 311481/2 4790257388207 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790257388215 7 -> java/util/HashSet.add + 0 311481/2 4790257388223 7 -> java/util/HashMap.put + 0 311481/2 4790257388230 7 -> java/lang/Object.hashCode + 0 311481/2 4790257388237 7 <- java/lang/Object.hashCode + 0 311481/2 4790257388245 7 -> java/util/HashMap.hash + 0 311481/2 4790257388252 7 <- java/util/HashMap.hash + 0 311481/2 4790257388260 7 -> java/util/HashMap.indexFor + 0 311481/2 4790257388267 7 <- java/util/HashMap.indexFor + 0 311481/2 4790257388275 7 <- java/util/HashMap.put + 0 311481/2 4790257388282 7 <- java/util/HashSet.add + 0 311481/2 4790257388290 7 <- java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257388305 15 -> java/io/PrintStream.println + 0 311481/2 4790257388316 11 -> java/io/PrintStream.print + 0 311481/2 4790257388326 9 -> java/io/PrintStream.write + 0 311481/2 4790257388335 9 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790257388345 10 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790257388358 12 -> java/io/Writer.write + 0 311481/2 4790257388371 13 -> java/io/BufferedWriter.write + 0 311481/2 4790257388382 10 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257388389 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257388399 10 -> java/io/BufferedWriter.min + 0 311481/2 4790257388407 7 <- java/io/BufferedWriter.min + 0 311481/2 4790257388417 10 -> java/lang/String.getChars + 0 311481/2 4790257388425 8 -> java/lang/System.arraycopy + 0 311481/2 4790257388434 8 <- java/lang/System.arraycopy + 0 311481/2 4790257388442 7 <- java/lang/String.getChars + 0 311481/2 4790257388450 8 <- java/io/BufferedWriter.write + 0 311481/2 4790257388457 7 <- java/io/Writer.write + 0 311481/2 4790257388467 10 -> java/io/BufferedWriter.flushBuffer + 0 311481/2 4790257388475 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257388482 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257388493 10 -> java/io/OutputStreamWriter.write + 0 311481/2 4790257388504 11 -> sun/nio/cs/StreamEncoder.write + 0 311481/2 4790257388515 10 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790257388522 7 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790257388533 10 -> sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790257388544 11 -> java/nio/CharBuffer.wrap + 0 311481/2 4790257388552 8 -> java/nio/HeapCharBuffer. + 0 311481/2 4790257388560 7 -> java/nio/CharBuffer. + 0 311481/2 4790257388567 7 -> java/nio/Buffer. + 0 311481/2 4790257388574 7 -> java/lang/Object. + 0 311481/2 4790257388582 7 <- java/lang/Object. + 0 311481/2 4790257388590 8 -> java/nio/Buffer.limit + 0 311481/2 4790257388598 7 <- java/nio/Buffer.limit + 0 311481/2 4790257388605 7 -> java/nio/Buffer.position + 0 311481/2 4790257388612 7 <- java/nio/Buffer.position + 0 311481/2 4790257388620 7 <- java/nio/Buffer. + 0 311481/2 4790257388628 7 <- java/nio/CharBuffer. + 0 311481/2 4790257388635 7 <- java/nio/HeapCharBuffer. + 0 311481/2 4790257388643 7 <- java/nio/CharBuffer.wrap + 0 311481/2 4790257388654 10 -> java/nio/Buffer.hasRemaining + 0 311481/2 4790257388661 7 <- java/nio/Buffer.hasRemaining + 0 311481/2 4790257388673 11 -> java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790257388684 10 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790257388695 10 -> java/nio/CharBuffer.hasArray + 0 311481/2 4790257388702 7 <- java/nio/CharBuffer.hasArray + 0 311481/2 4790257388714 11 -> java/nio/ByteBuffer.hasArray + 0 311481/2 4790257388722 7 <- java/nio/ByteBuffer.hasArray + 0 311481/2 4790257388732 10 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790257388742 9 -> java/nio/CharBuffer.array + 0 311481/2 4790257388749 7 <- java/nio/CharBuffer.array + 0 311481/2 4790257388759 9 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257388766 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257388776 9 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257388784 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257388797 13 -> java/nio/ByteBuffer.array + 0 311481/2 4790257388804 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790257388814 9 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257388821 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257388831 9 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257388838 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257388853 14 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257388861 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257388871 9 -> java/nio/Buffer.position + 0 311481/2 4790257388878 7 <- java/nio/Buffer.position + 0 311481/2 4790257388886 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257388893 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257388903 9 -> java/nio/Buffer.position + 0 311481/2 4790257388910 7 <- java/nio/Buffer.position + 0 311481/2 4790257388918 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790257388925 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790257388936 10 -> java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790257388943 7 <- java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790257388953 9 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257388961 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257388969 7 <- java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790257388979 10 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257388987 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257388998 11 -> java/nio/Buffer.remaining + 0 311481/2 4790257389005 7 <- java/nio/Buffer.remaining + 0 311481/2 4790257389013 7 <- sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790257389020 7 <- sun/nio/cs/StreamEncoder.write + 0 311481/2 4790257389028 7 <- java/io/OutputStreamWriter.write + 0 311481/2 4790257389113 85 <- java/io/BufferedWriter.flushBuffer + 0 311481/2 4790257389125 11 -> java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790257389135 9 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790257389146 11 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790257389158 11 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790257389167 9 -> java/nio/Buffer.flip + 0 311481/2 4790257389174 7 <- java/nio/Buffer.flip + 0 311481/2 4790257389186 11 -> java/nio/ByteBuffer.array + 0 311481/2 4790257389193 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790257389203 9 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257389210 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257389222 11 -> java/io/PrintStream.write + 0 311481/2 4790257389230 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790257389237 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790257389248 11 -> java/io/BufferedOutputStream.write + 0 311481/2 4790257389261 12 -> java/lang/System.arraycopy + 0 311481/2 4790257389268 7 <- java/lang/System.arraycopy + 0 311481/2 4790257389276 7 <- java/io/BufferedOutputStream.write + 0 311481/2 4790257389286 9 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790257389295 9 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790257389307 11 -> java/io/FileOutputStream.write + 0 311481/2 4790257389317 10 -> java/io/FileOutputStream.writeBytes + 0 311481/2 4790257389479 162 <- java/io/FileOutputStream.writeBytes + 0 311481/2 4790257389489 9 <- java/io/FileOutputStream.write + 0 311481/2 4790257389497 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790257389509 12 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790257389517 8 <- java/io/PrintStream.write + 0 311481/2 4790257389527 10 -> java/nio/Buffer.clear + 0 311481/2 4790257389536 8 <- java/nio/Buffer.clear + 0 311481/2 4790257389543 7 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790257389551 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790257389559 7 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790257389566 7 <- java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790257389579 12 -> java/lang/String.indexOf + 0 311481/2 4790257389586 7 -> java/lang/String.indexOf + 0 311481/2 4790257389595 8 <- java/lang/String.indexOf + 0 311481/2 4790257389602 7 <- java/lang/String.indexOf + 0 311481/2 4790257389610 7 <- java/io/PrintStream.write + 0 311481/2 4790257389617 7 <- java/io/PrintStream.print + 0 311481/2 4790257389627 9 -> java/io/PrintStream.newLine + 0 311481/2 4790257389635 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790257389642 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790257389651 9 -> java/io/BufferedWriter.newLine + 0 311481/2 4790257389661 9 -> java/io/Writer.write + 0 311481/2 4790257389668 7 -> java/io/BufferedWriter.write + 0 311481/2 4790257389713 44 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257389721 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257389729 8 -> java/io/BufferedWriter.min + 0 311481/2 4790257389737 7 <- java/io/BufferedWriter.min + 0 311481/2 4790257389744 7 -> java/lang/String.getChars + 0 311481/2 4790257389752 7 -> java/lang/System.arraycopy + 0 311481/2 4790257389760 7 <- java/lang/System.arraycopy + 0 311481/2 4790257389767 7 <- java/lang/String.getChars + 0 311481/2 4790257389775 7 <- java/io/BufferedWriter.write + 0 311481/2 4790257389783 7 <- java/io/Writer.write + 0 311481/2 4790257389790 7 <- java/io/BufferedWriter.newLine + 0 311481/2 4790257389798 7 -> java/io/BufferedWriter.flushBuffer + 0 311481/2 4790257389805 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257389812 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257389820 7 -> java/io/OutputStreamWriter.write + 0 311481/2 4790257389828 7 -> sun/nio/cs/StreamEncoder.write + 0 311481/2 4790257389835 7 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790257389842 7 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790257389850 7 -> sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790257389857 7 -> java/nio/CharBuffer.wrap + 0 311481/2 4790257389865 7 -> java/nio/HeapCharBuffer. + 0 311481/2 4790257389872 7 -> java/nio/CharBuffer. + 0 311481/2 4790257389879 7 -> java/nio/Buffer. + 0 311481/2 4790257389886 6 -> java/lang/Object. + 0 311481/2 4790257389893 7 <- java/lang/Object. + 0 311481/2 4790257389901 7 -> java/nio/Buffer.limit + 0 311481/2 4790257389908 7 <- java/nio/Buffer.limit + 0 311481/2 4790257389916 7 -> java/nio/Buffer.position + 0 311481/2 4790257389923 7 <- java/nio/Buffer.position + 0 311481/2 4790257389930 7 <- java/nio/Buffer. + 0 311481/2 4790257389938 7 <- java/nio/CharBuffer. + 0 311481/2 4790257389946 7 <- java/nio/HeapCharBuffer. + 0 311481/2 4790257389953 7 <- java/nio/CharBuffer.wrap + 0 311481/2 4790257389961 7 -> java/nio/Buffer.hasRemaining + 0 311481/2 4790257389968 7 <- java/nio/Buffer.hasRemaining + 0 311481/2 4790257389976 7 -> java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790257389984 7 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790257389991 7 -> java/nio/CharBuffer.hasArray + 0 311481/2 4790257389998 7 <- java/nio/CharBuffer.hasArray + 0 311481/2 4790257390760 761 -> java/nio/ByteBuffer.hasArray + 0 311481/2 4790257390772 11 <- java/nio/ByteBuffer.hasArray + 0 311481/2 4790257390782 10 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790257390790 7 -> java/nio/CharBuffer.array + 0 311481/2 4790257390797 7 <- java/nio/CharBuffer.array + 0 311481/2 4790257390805 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257390812 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257390820 8 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257390828 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257390836 8 -> java/nio/ByteBuffer.array + 0 311481/2 4790257390844 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790257390851 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257390859 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257390866 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257390874 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257390883 8 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257390890 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257390898 8 -> java/nio/Buffer.position + 0 311481/2 4790257390906 7 <- java/nio/Buffer.position + 0 311481/2 4790257390913 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257390921 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257390928 7 -> java/nio/Buffer.position + 0 311481/2 4790257390936 7 <- java/nio/Buffer.position + 0 311481/2 4790257390943 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790257390951 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790257390959 8 -> java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790257390967 7 <- java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790257390974 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257390982 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257390990 7 <- java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790257390998 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257391005 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257391013 8 -> java/nio/Buffer.remaining + 0 311481/2 4790257391020 7 <- java/nio/Buffer.remaining + 0 311481/2 4790257391028 7 <- sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790257391036 7 <- sun/nio/cs/StreamEncoder.write + 0 311481/2 4790257391044 7 <- java/io/OutputStreamWriter.write + 0 311481/2 4790257391052 8 <- java/io/BufferedWriter.flushBuffer + 0 311481/2 4790257391060 7 -> java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790257391067 7 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790257391075 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790257391082 7 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790257391090 7 -> java/nio/Buffer.flip + 0 311481/2 4790257391097 7 <- java/nio/Buffer.flip + 0 311481/2 4790257391105 8 -> java/nio/ByteBuffer.array + 0 311481/2 4790257391112 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790257391120 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257391127 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257391135 8 -> java/io/PrintStream.write + 0 311481/2 4790257391142 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790257391150 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790257391158 8 -> java/io/BufferedOutputStream.write + 0 311481/2 4790257391166 7 -> java/lang/System.arraycopy + 0 311481/2 4790257391174 8 <- java/lang/System.arraycopy + 0 311481/2 4790257391182 7 <- java/io/BufferedOutputStream.write + 0 311481/2 4790257391190 7 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790257391197 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790257391205 7 -> java/io/FileOutputStream.write + 0 311481/2 4790257391212 7 -> java/io/FileOutputStream.writeBytes + 0 311481/2 4790257391280 67 <- java/io/FileOutputStream.writeBytes + 0 311481/2 4790257391289 9 <- java/io/FileOutputStream.write + 0 311481/2 4790257391297 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790257391305 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790257391313 7 <- java/io/PrintStream.write + 0 311481/2 4790257391321 7 -> java/nio/Buffer.clear + 0 311481/2 4790257391329 7 <- java/nio/Buffer.clear + 0 311481/2 4790257391336 7 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790257391344 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790257391352 7 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790257391359 7 <- java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790257391368 8 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790257391375 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790257391383 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790257391391 8 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790257391398 7 <- java/io/PrintStream.newLine + 0 311481/2 4790257391406 7 <- java/io/PrintStream.println + 0 311481/2 4790257391439 32 -> java/lang/ClassLoader.loadClassInternal + 0 311481/2 4790257391447 8 -> java/lang/ClassLoader.loadClass + 0 311481/2 4790257391455 7 -> sun/misc/Launcher$AppClassLoader.loadClass + 0 311481/2 4790257391463 7 -> java/lang/String.lastIndexOf + 0 311481/2 4790257391471 7 -> java/lang/String.lastIndexOf + 0 311481/2 4790257391479 8 <- java/lang/String.lastIndexOf + 0 311481/2 4790257391487 7 <- java/lang/String.lastIndexOf + 0 311481/2 4790257391495 8 -> java/lang/System.getSecurityManager + 0 311481/2 4790257391503 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790257391511 8 -> java/lang/ClassLoader.loadClass + 0 311481/2 4790257391518 7 -> java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257391526 7 -> java/lang/ClassLoader.check + 0 311481/2 4790257391533 7 <- java/lang/ClassLoader.check + 0 311481/2 4790257391541 7 -> java/lang/ClassLoader.checkName + 0 311481/2 4790257391549 7 -> java/lang/String.indexOf + 0 311481/2 4790257391556 7 -> java/lang/String.indexOf + 0 311481/2 4790257391564 8 <- java/lang/String.indexOf + 0 311481/2 4790257391572 7 <- java/lang/String.indexOf + 0 311481/2 4790257391580 8 -> sun/misc/VM.allowArraySyntax + 0 311481/2 4790257391587 7 <- sun/misc/VM.allowArraySyntax + 0 311481/2 4790257391595 7 -> java/lang/String.charAt + 0 311481/2 4790257391603 7 <- java/lang/String.charAt + 0 311481/2 4790257391610 7 <- java/lang/ClassLoader.checkName + 0 311481/2 4790257391618 7 -> java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257391633 14 <- java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257391641 8 <- java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257391651 9 -> java/lang/ClassLoader.loadClass + 0 311481/2 4790257391658 7 -> java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257391665 7 -> java/lang/ClassLoader.check + 0 311481/2 4790257391672 7 <- java/lang/ClassLoader.check + 0 311481/2 4790257391680 7 -> java/lang/ClassLoader.checkName + 0 311481/2 4790257391688 7 -> java/lang/String.indexOf + 0 311481/2 4790257391695 7 -> java/lang/String.indexOf + 0 311481/2 4790257391703 8 <- java/lang/String.indexOf + 0 311481/2 4790257391711 7 <- java/lang/String.indexOf + 0 311481/2 4790257391718 7 -> sun/misc/VM.allowArraySyntax + 0 311481/2 4790257391725 7 <- sun/misc/VM.allowArraySyntax + 0 311481/2 4790257391733 7 -> java/lang/String.charAt + 0 311481/2 4790257391740 7 <- java/lang/String.charAt + 0 311481/2 4790257391748 7 <- java/lang/ClassLoader.checkName + 0 311481/2 4790257391755 7 -> java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257391765 9 <- java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257391773 8 <- java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257391781 8 -> java/lang/ClassLoader.findBootstrapClass0 + 0 311481/2 4790257391788 7 -> java/lang/ClassLoader.check + 0 311481/2 4790257391795 7 <- java/lang/ClassLoader.check + 0 311481/2 4790257391803 7 -> java/lang/ClassLoader.checkName + 0 311481/2 4790257391810 7 -> java/lang/String.indexOf + 0 311481/2 4790257391817 7 -> java/lang/String.indexOf + 0 311481/2 4790257391825 7 <- java/lang/String.indexOf + 0 311481/2 4790257391833 7 <- java/lang/String.indexOf + 0 311481/2 4790257391840 7 -> sun/misc/VM.allowArraySyntax + 0 311481/2 4790257391848 7 <- sun/misc/VM.allowArraySyntax + 0 311481/2 4790257391855 7 -> java/lang/String.charAt + 0 311481/2 4790257391862 7 <- java/lang/String.charAt + 0 311481/2 4790257391870 7 <- java/lang/ClassLoader.checkName + 0 311481/2 4790257391877 7 -> java/lang/ClassLoader.findBootstrapClass + 0 311481/2 4790257391891 13 <- java/lang/ClassLoader.findBootstrapClass + 0 311481/2 4790257391899 7 <- java/lang/ClassLoader.findBootstrapClass0 + 0 311481/2 4790257391907 8 <- java/lang/ClassLoader.loadClass + 0 311481/2 4790257391915 7 <- java/lang/ClassLoader.loadClass + 0 311481/2 4790257391922 7 <- sun/misc/Launcher$AppClassLoader.loadClass + 0 311481/2 4790257391930 7 <- java/lang/ClassLoader.loadClass + 0 311481/2 4790257391938 7 <- java/lang/ClassLoader.loadClassInternal + 0 311481/2 4790257391954 16 -> java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257391962 7 -> java/lang/System.getSecurityManager + 0 311481/2 4790257391969 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790257391978 8 -> java/util/HashSet.add + 0 311481/2 4790257391986 8 -> java/util/HashMap.put + 0 311481/2 4790257391994 7 -> java/lang/Object.hashCode + 0 311481/2 4790257392001 7 <- java/lang/Object.hashCode + 0 311481/2 4790257392009 8 -> java/util/HashMap.hash + 0 311481/2 4790257392017 7 <- java/util/HashMap.hash + 0 311481/2 4790257392025 7 -> java/util/HashMap.indexFor + 0 311481/2 4790257392032 7 <- java/util/HashMap.indexFor + 0 311481/2 4790257392040 8 <- java/util/HashMap.put + 0 311481/2 4790257392048 7 <- java/util/HashSet.add + 0 311481/2 4790257392055 7 <- java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257392076 20 -> java/lang/Thread.currentThread + 0 311481/2 4790257392084 8 <- java/lang/Thread.currentThread + 0 311481/2 4790257392094 10 -> java/lang/Thread.sleep + 0 311481/2 4790258400253 1008158 <- java/lang/Thread.sleep + 0 311481/2 4790258400299 45 -> Func_abc.func_b + 0 311481/2 4790258400329 30 -> java/io/PrintStream.println + 0 311481/2 4790258400338 8 -> java/io/PrintStream.print + 0 311481/2 4790258400345 7 -> java/io/PrintStream.write + 0 311481/2 4790258400353 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790258400361 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790258400369 8 -> java/io/Writer.write + 0 311481/2 4790258400378 8 -> java/io/BufferedWriter.write + 0 311481/2 4790258400386 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258400393 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258400402 9 -> java/io/BufferedWriter.min + 0 311481/2 4790258400410 7 <- java/io/BufferedWriter.min + 0 311481/2 4790258400418 8 -> java/lang/String.getChars + 0 311481/2 4790258400426 8 -> java/lang/System.arraycopy + 0 311481/2 4790258400435 8 <- java/lang/System.arraycopy + 0 311481/2 4790258400442 7 <- java/lang/String.getChars + 0 311481/2 4790258400451 8 <- java/io/BufferedWriter.write + 0 311481/2 4790258400458 7 <- java/io/Writer.write + 0 311481/2 4790258400466 7 -> java/io/BufferedWriter.flushBuffer + 0 311481/2 4790258400474 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258400481 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258400489 8 -> java/io/OutputStreamWriter.write + 0 311481/2 4790258400497 7 -> sun/nio/cs/StreamEncoder.write + 0 311481/2 4790258400504 7 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790258400511 7 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790258400520 8 -> sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790258400528 7 -> java/nio/CharBuffer.wrap + 0 311481/2 4790258400536 7 -> java/nio/HeapCharBuffer. + 0 311481/2 4790258400544 7 -> java/nio/CharBuffer. + 0 311481/2 4790258400551 7 -> java/nio/Buffer. + 0 311481/2 4790258400559 7 -> java/lang/Object. + 0 311481/2 4790258400566 7 <- java/lang/Object. + 0 311481/2 4790258400574 8 -> java/nio/Buffer.limit + 0 311481/2 4790258400582 7 <- java/nio/Buffer.limit + 0 311481/2 4790258400590 7 -> java/nio/Buffer.position + 0 311481/2 4790258400597 7 <- java/nio/Buffer.position + 0 311481/2 4790258400604 7 <- java/nio/Buffer. + 0 311481/2 4790258400612 7 <- java/nio/CharBuffer. + 0 311481/2 4790258400620 7 <- java/nio/HeapCharBuffer. + 0 311481/2 4790258400627 7 <- java/nio/CharBuffer.wrap + 0 311481/2 4790258400635 8 -> java/nio/Buffer.hasRemaining + 0 311481/2 4790258400643 7 <- java/nio/Buffer.hasRemaining + 0 311481/2 4790258400651 8 -> java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790258400659 8 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790258400667 7 -> java/nio/CharBuffer.hasArray + 0 311481/2 4790258400675 7 <- java/nio/CharBuffer.hasArray + 0 311481/2 4790258400683 8 -> java/nio/ByteBuffer.hasArray + 0 311481/2 4790258400690 7 <- java/nio/ByteBuffer.hasArray + 0 311481/2 4790258400698 7 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790258400706 7 -> java/nio/CharBuffer.array + 0 311481/2 4790258400713 7 <- java/nio/CharBuffer.array + 0 311481/2 4790258400721 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258400728 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258400736 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258400743 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258400752 8 -> java/nio/ByteBuffer.array + 0 311481/2 4790258400759 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790258400766 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258400774 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258400781 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258400789 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258400799 9 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258400806 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258400813 7 -> java/nio/Buffer.position + 0 311481/2 4790258400821 7 <- java/nio/Buffer.position + 0 311481/2 4790258400828 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258400836 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258400843 7 -> java/nio/Buffer.position + 0 311481/2 4790258400850 7 <- java/nio/Buffer.position + 0 311481/2 4790258400858 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790258400866 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790258400874 8 -> java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790258400881 7 <- java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790258400889 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258400896 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258400904 7 <- java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790258400912 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258400919 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258400927 8 -> java/nio/Buffer.remaining + 0 311481/2 4790258400934 7 <- java/nio/Buffer.remaining + 0 311481/2 4790258400942 7 <- sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790258400950 7 <- sun/nio/cs/StreamEncoder.write + 0 311481/2 4790258400957 7 <- java/io/OutputStreamWriter.write + 0 311481/2 4790258400965 7 <- java/io/BufferedWriter.flushBuffer + 0 311481/2 4790258400973 8 -> java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790258400981 7 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790258400988 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790258400996 7 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790258401004 7 -> java/nio/Buffer.flip + 0 311481/2 4790258401011 6 <- java/nio/Buffer.flip + 0 311481/2 4790258401019 8 -> java/nio/ByteBuffer.array + 0 311481/2 4790258401026 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790258401033 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401041 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401049 7 -> java/io/PrintStream.write + 0 311481/2 4790258401056 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790258401063 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790258401071 8 -> java/io/BufferedOutputStream.write + 0 311481/2 4790258401079 7 -> java/lang/System.arraycopy + 0 311481/2 4790258401087 7 <- java/lang/System.arraycopy + 0 311481/2 4790258401094 7 <- java/io/BufferedOutputStream.write + 0 311481/2 4790258401103 8 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790258401110 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790258401118 7 -> java/io/FileOutputStream.write + 0 311481/2 4790258401125 7 -> java/io/FileOutputStream.writeBytes + 0 311481/2 4790258401164 39 <- java/io/FileOutputStream.writeBytes + 0 311481/2 4790258401173 8 <- java/io/FileOutputStream.write + 0 311481/2 4790258401181 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790258401189 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790258401196 7 <- java/io/PrintStream.write + 0 311481/2 4790258401204 7 -> java/nio/Buffer.clear + 0 311481/2 4790258401212 7 <- java/nio/Buffer.clear + 0 311481/2 4790258401219 7 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790258401227 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790258401235 7 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790258401242 7 <- java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790258401251 8 -> java/lang/String.indexOf + 0 311481/2 4790258401258 7 -> java/lang/String.indexOf + 0 311481/2 4790258401266 8 <- java/lang/String.indexOf + 0 311481/2 4790258401274 7 <- java/lang/String.indexOf + 0 311481/2 4790258401281 7 <- java/io/PrintStream.write + 0 311481/2 4790258401289 7 <- java/io/PrintStream.print + 0 311481/2 4790258401297 7 -> java/io/PrintStream.newLine + 0 311481/2 4790258401304 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790258401311 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790258401319 7 -> java/io/BufferedWriter.newLine + 0 311481/2 4790258401326 7 -> java/io/Writer.write + 0 311481/2 4790258401334 7 -> java/io/BufferedWriter.write + 0 311481/2 4790258401341 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258401348 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258401356 7 -> java/io/BufferedWriter.min + 0 311481/2 4790258401363 7 <- java/io/BufferedWriter.min + 0 311481/2 4790258401371 7 -> java/lang/String.getChars + 0 311481/2 4790258401378 7 -> java/lang/System.arraycopy + 0 311481/2 4790258401385 7 <- java/lang/System.arraycopy + 0 311481/2 4790258401393 7 <- java/lang/String.getChars + 0 311481/2 4790258401401 7 <- java/io/BufferedWriter.write + 0 311481/2 4790258401408 7 <- java/io/Writer.write + 0 311481/2 4790258401416 7 <- java/io/BufferedWriter.newLine + 0 311481/2 4790258401423 7 -> java/io/BufferedWriter.flushBuffer + 0 311481/2 4790258401430 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258401438 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258401446 7 -> java/io/OutputStreamWriter.write + 0 311481/2 4790258401453 7 -> sun/nio/cs/StreamEncoder.write + 0 311481/2 4790258401460 7 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790258401467 7 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790258401475 7 -> sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790258401482 7 -> java/nio/CharBuffer.wrap + 0 311481/2 4790258401490 7 -> java/nio/HeapCharBuffer. + 0 311481/2 4790258401497 7 -> java/nio/CharBuffer. + 0 311481/2 4790258401504 7 -> java/nio/Buffer. + 0 311481/2 4790258401511 7 -> java/lang/Object. + 0 311481/2 4790258401518 7 <- java/lang/Object. + 0 311481/2 4790258401526 7 -> java/nio/Buffer.limit + 0 311481/2 4790258401533 7 <- java/nio/Buffer.limit + 0 311481/2 4790258401541 7 -> java/nio/Buffer.position + 0 311481/2 4790258401548 7 <- java/nio/Buffer.position + 0 311481/2 4790258401556 7 <- java/nio/Buffer. + 0 311481/2 4790258401563 7 <- java/nio/CharBuffer. + 0 311481/2 4790258401570 7 <- java/nio/HeapCharBuffer. + 0 311481/2 4790258401578 7 <- java/nio/CharBuffer.wrap + 0 311481/2 4790258401586 7 -> java/nio/Buffer.hasRemaining + 0 311481/2 4790258401593 7 <- java/nio/Buffer.hasRemaining + 0 311481/2 4790258401601 7 -> java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790258401608 7 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790258401615 7 -> java/nio/CharBuffer.hasArray + 0 311481/2 4790258401623 7 <- java/nio/CharBuffer.hasArray + 0 311481/2 4790258401630 7 -> java/nio/ByteBuffer.hasArray + 0 311481/2 4790258401638 7 <- java/nio/ByteBuffer.hasArray + 0 311481/2 4790258401645 7 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790258401653 7 -> java/nio/CharBuffer.array + 0 311481/2 4790258401660 7 <- java/nio/CharBuffer.array + 0 311481/2 4790258401667 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258401675 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258401682 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258401690 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258401697 7 -> java/nio/ByteBuffer.array + 0 311481/2 4790258401705 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790258401712 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401719 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401727 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401734 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401743 8 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258401750 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258401757 7 -> java/nio/Buffer.position + 0 311481/2 4790258401765 7 <- java/nio/Buffer.position + 0 311481/2 4790258401772 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401780 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401787 7 -> java/nio/Buffer.position + 0 311481/2 4790258401794 7 <- java/nio/Buffer.position + 0 311481/2 4790258401802 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790258401809 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790258401817 7 -> java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790258401825 7 <- java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790258401832 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258401840 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258401848 7 <- java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790258401855 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258401863 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258401871 7 -> java/nio/Buffer.remaining + 0 311481/2 4790258401878 7 <- java/nio/Buffer.remaining + 0 311481/2 4790258401885 7 <- sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790258401893 7 <- sun/nio/cs/StreamEncoder.write + 0 311481/2 4790258401901 7 <- java/io/OutputStreamWriter.write + 0 311481/2 4790258401908 7 <- java/io/BufferedWriter.flushBuffer + 0 311481/2 4790258401916 7 -> java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790258401923 7 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790258401931 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790258401938 7 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790258401945 7 -> java/nio/Buffer.flip + 0 311481/2 4790258401952 7 <- java/nio/Buffer.flip + 0 311481/2 4790258401960 7 -> java/nio/ByteBuffer.array + 0 311481/2 4790258401967 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790258401975 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401982 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401990 7 -> java/io/PrintStream.write + 0 311481/2 4790258401997 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790258402004 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790258402012 7 -> java/io/BufferedOutputStream.write + 0 311481/2 4790258402020 7 -> java/lang/System.arraycopy + 0 311481/2 4790258402027 7 <- java/lang/System.arraycopy + 0 311481/2 4790258402035 7 <- java/io/BufferedOutputStream.write + 0 311481/2 4790258402042 7 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790258402050 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790258402057 7 -> java/io/FileOutputStream.write + 0 311481/2 4790258402064 7 -> java/io/FileOutputStream.writeBytes + 0 311481/2 4790258402082 17 <- java/io/FileOutputStream.writeBytes + 0 311481/2 4790258402090 8 <- java/io/FileOutputStream.write + 0 311481/2 4790258402098 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790258402106 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790258402113 7 <- java/io/PrintStream.write + 0 311481/2 4790258402121 7 -> java/nio/Buffer.clear + 0 311481/2 4790258402128 7 <- java/nio/Buffer.clear + 0 311481/2 4790258402136 7 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790258402143 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790258402151 7 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790258402159 7 <- java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790258402166 7 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790258402174 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790258402181 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790258402189 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790258402196 7 <- java/io/PrintStream.newLine + 0 311481/2 4790258402204 7 <- java/io/PrintStream.println + 0 311481/2 4790258402212 7 -> java/lang/Thread.currentThread + 0 311481/2 4790258402220 7 <- java/lang/Thread.currentThread + 0 311481/2 4790258402228 7 -> java/lang/Thread.sleep + 0 311481/2 4790259410328 1008099 <- java/lang/Thread.sleep + 0 311481/2 4790259410374 46 -> Func_abc.func_c + 0 311481/2 4790259410404 29 -> java/io/PrintStream.println + 0 311481/2 4790259410412 8 -> java/io/PrintStream.print + 0 311481/2 4790259410420 7 -> java/io/PrintStream.write + 0 311481/2 4790259410428 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790259410435 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790259410444 8 -> java/io/Writer.write + 0 311481/2 4790259410453 8 -> java/io/BufferedWriter.write + 0 311481/2 4790259410460 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259410467 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259410477 9 -> java/io/BufferedWriter.min + 0 311481/2 4790259410484 7 <- java/io/BufferedWriter.min + 0 311481/2 4790259410492 8 -> java/lang/String.getChars + 0 311481/2 4790259410501 8 -> java/lang/System.arraycopy + 0 311481/2 4790259410509 8 <- java/lang/System.arraycopy + 0 311481/2 4790259410517 7 <- java/lang/String.getChars + 0 311481/2 4790259410525 8 <- java/io/BufferedWriter.write + 0 311481/2 4790259410533 7 <- java/io/Writer.write + 0 311481/2 4790259410541 7 -> java/io/BufferedWriter.flushBuffer + 0 311481/2 4790259410548 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259410555 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259410563 8 -> java/io/OutputStreamWriter.write + 0 311481/2 4790259410571 7 -> sun/nio/cs/StreamEncoder.write + 0 311481/2 4790259410579 7 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790259410586 7 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790259410595 8 -> sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790259410602 7 -> java/nio/CharBuffer.wrap + 0 311481/2 4790259410610 7 -> java/nio/HeapCharBuffer. + 0 311481/2 4790259410618 7 -> java/nio/CharBuffer. + 0 311481/2 4790259410625 7 -> java/nio/Buffer. + 0 311481/2 4790259410633 7 -> java/lang/Object. + 0 311481/2 4790259410640 7 <- java/lang/Object. + 0 311481/2 4790259410648 8 -> java/nio/Buffer.limit + 0 311481/2 4790259410656 7 <- java/nio/Buffer.limit + 0 311481/2 4790259410664 7 -> java/nio/Buffer.position + 0 311481/2 4790259410671 7 <- java/nio/Buffer.position + 0 311481/2 4790259410678 7 <- java/nio/Buffer. + 0 311481/2 4790259410686 7 <- java/nio/CharBuffer. + 0 311481/2 4790259410694 7 <- java/nio/HeapCharBuffer. + 0 311481/2 4790259410701 7 <- java/nio/CharBuffer.wrap + 0 311481/2 4790259410710 8 -> java/nio/Buffer.hasRemaining + 0 311481/2 4790259410717 7 <- java/nio/Buffer.hasRemaining + 0 311481/2 4790259410725 8 -> java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790259410733 8 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790259410741 7 -> java/nio/CharBuffer.hasArray + 0 311481/2 4790259410749 7 <- java/nio/CharBuffer.hasArray + 0 311481/2 4790259410757 8 -> java/nio/ByteBuffer.hasArray + 0 311481/2 4790259410764 7 <- java/nio/ByteBuffer.hasArray + 0 311481/2 4790259410772 7 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790259410780 7 -> java/nio/CharBuffer.array + 0 311481/2 4790259410787 7 <- java/nio/CharBuffer.array + 0 311481/2 4790259410795 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259410802 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259410810 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259410817 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259410826 8 -> java/nio/ByteBuffer.array + 0 311481/2 4790259410833 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790259410841 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259410848 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259410855 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259410863 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259410873 9 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259410880 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259410888 7 -> java/nio/Buffer.position + 0 311481/2 4790259410895 7 <- java/nio/Buffer.position + 0 311481/2 4790259410902 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259410910 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259410917 7 -> java/nio/Buffer.position + 0 311481/2 4790259410924 7 <- java/nio/Buffer.position + 0 311481/2 4790259410932 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790259410940 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790259410948 8 -> java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790259410955 7 <- java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790259410963 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259410970 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259410978 7 <- java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790259410986 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259410993 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259411001 8 -> java/nio/Buffer.remaining + 0 311481/2 4790259411008 7 <- java/nio/Buffer.remaining + 0 311481/2 4790259411016 7 <- sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790259411024 7 <- sun/nio/cs/StreamEncoder.write + 0 311481/2 4790259411031 7 <- java/io/OutputStreamWriter.write + 0 311481/2 4790259411039 7 <- java/io/BufferedWriter.flushBuffer + 0 311481/2 4790259411047 8 -> java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790259411055 7 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790259411062 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790259411070 7 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790259411077 7 -> java/nio/Buffer.flip + 0 311481/2 4790259411084 6 <- java/nio/Buffer.flip + 0 311481/2 4790259411092 8 -> java/nio/ByteBuffer.array + 0 311481/2 4790259411100 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790259411107 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411114 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411122 7 -> java/io/PrintStream.write + 0 311481/2 4790259411130 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790259411137 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790259411145 8 -> java/io/BufferedOutputStream.write + 0 311481/2 4790259411153 7 -> java/lang/System.arraycopy + 0 311481/2 4790259411160 7 <- java/lang/System.arraycopy + 0 311481/2 4790259411168 7 <- java/io/BufferedOutputStream.write + 0 311481/2 4790259411176 8 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790259411184 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790259411192 7 -> java/io/FileOutputStream.write + 0 311481/2 4790259411199 7 -> java/io/FileOutputStream.writeBytes + 0 311481/2 4790259411241 41 <- java/io/FileOutputStream.writeBytes + 0 311481/2 4790259411249 8 <- java/io/FileOutputStream.write + 0 311481/2 4790259411257 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790259411265 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790259411272 7 <- java/io/PrintStream.write + 0 311481/2 4790259411280 7 -> java/nio/Buffer.clear + 0 311481/2 4790259411288 7 <- java/nio/Buffer.clear + 0 311481/2 4790259411295 7 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790259411303 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790259411310 7 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790259411318 7 <- java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790259411326 8 -> java/lang/String.indexOf + 0 311481/2 4790259411334 7 -> java/lang/String.indexOf + 0 311481/2 4790259411342 8 <- java/lang/String.indexOf + 0 311481/2 4790259411349 7 <- java/lang/String.indexOf + 0 311481/2 4790259411357 7 <- java/io/PrintStream.write + 0 311481/2 4790259411365 7 <- java/io/PrintStream.print + 0 311481/2 4790259411372 7 -> java/io/PrintStream.newLine + 0 311481/2 4790259411380 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790259411387 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790259411395 7 -> java/io/BufferedWriter.newLine + 0 311481/2 4790259411402 7 -> java/io/Writer.write + 0 311481/2 4790259411409 7 -> java/io/BufferedWriter.write + 0 311481/2 4790259411416 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259411423 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259411431 7 -> java/io/BufferedWriter.min + 0 311481/2 4790259411439 7 <- java/io/BufferedWriter.min + 0 311481/2 4790259411446 7 -> java/lang/String.getChars + 0 311481/2 4790259411454 7 -> java/lang/System.arraycopy + 0 311481/2 4790259411461 7 <- java/lang/System.arraycopy + 0 311481/2 4790259411468 7 <- java/lang/String.getChars + 0 311481/2 4790259411476 7 <- java/io/BufferedWriter.write + 0 311481/2 4790259411484 7 <- java/io/Writer.write + 0 311481/2 4790259411491 7 <- java/io/BufferedWriter.newLine + 0 311481/2 4790259411499 7 -> java/io/BufferedWriter.flushBuffer + 0 311481/2 4790259411506 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259411513 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259411521 7 -> java/io/OutputStreamWriter.write + 0 311481/2 4790259411528 7 -> sun/nio/cs/StreamEncoder.write + 0 311481/2 4790259411535 7 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790259411543 7 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790259411550 7 -> sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790259411558 7 -> java/nio/CharBuffer.wrap + 0 311481/2 4790259411565 7 -> java/nio/HeapCharBuffer. + 0 311481/2 4790259411572 7 -> java/nio/CharBuffer. + 0 311481/2 4790259411579 7 -> java/nio/Buffer. + 0 311481/2 4790259411586 6 -> java/lang/Object. + 0 311481/2 4790259411594 7 <- java/lang/Object. + 0 311481/2 4790259411601 7 -> java/nio/Buffer.limit + 0 311481/2 4790259411608 7 <- java/nio/Buffer.limit + 0 311481/2 4790259411616 7 -> java/nio/Buffer.position + 0 311481/2 4790259411623 7 <- java/nio/Buffer.position + 0 311481/2 4790259411631 7 <- java/nio/Buffer. + 0 311481/2 4790259411638 7 <- java/nio/CharBuffer. + 0 311481/2 4790259411646 7 <- java/nio/HeapCharBuffer. + 0 311481/2 4790259411653 7 <- java/nio/CharBuffer.wrap + 0 311481/2 4790259411661 7 -> java/nio/Buffer.hasRemaining + 0 311481/2 4790259411668 7 <- java/nio/Buffer.hasRemaining + 0 311481/2 4790259411676 7 -> java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790259411684 7 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790259411691 7 -> java/nio/CharBuffer.hasArray + 0 311481/2 4790259411698 7 <- java/nio/CharBuffer.hasArray + 0 311481/2 4790259411706 7 -> java/nio/ByteBuffer.hasArray + 0 311481/2 4790259411713 7 <- java/nio/ByteBuffer.hasArray + 0 311481/2 4790259411721 7 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790259411728 7 -> java/nio/CharBuffer.array + 0 311481/2 4790259411735 7 <- java/nio/CharBuffer.array + 0 311481/2 4790259411743 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259411750 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259411758 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259411765 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259411773 7 -> java/nio/ByteBuffer.array + 0 311481/2 4790259411780 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790259411787 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411795 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411802 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411809 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411818 8 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259411825 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259411833 7 -> java/nio/Buffer.position + 0 311481/2 4790259411840 7 <- java/nio/Buffer.position + 0 311481/2 4790259411847 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411855 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411862 7 -> java/nio/Buffer.position + 0 311481/2 4790259411869 7 <- java/nio/Buffer.position + 0 311481/2 4790259411877 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790259411885 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790259411893 8 -> java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790259411900 7 <- java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790259411908 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259411915 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259411923 7 <- java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790259411931 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259411938 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259411946 7 -> java/nio/Buffer.remaining + 0 311481/2 4790259411953 7 <- java/nio/Buffer.remaining + 0 311481/2 4790259411960 7 <- sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790259411968 7 <- sun/nio/cs/StreamEncoder.write + 0 311481/2 4790259411976 7 <- java/io/OutputStreamWriter.write + 0 311481/2 4790259411983 7 <- java/io/BufferedWriter.flushBuffer + 0 311481/2 4790259411991 7 -> java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790259411999 7 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790259412006 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790259412013 7 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790259412021 7 -> java/nio/Buffer.flip + 0 311481/2 4790259412028 6 <- java/nio/Buffer.flip + 0 311481/2 4790259412035 7 -> java/nio/ByteBuffer.array + 0 311481/2 4790259412043 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790259412050 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259412057 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259412065 7 -> java/io/PrintStream.write + 0 311481/2 4790259412072 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790259412080 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790259412087 7 -> java/io/BufferedOutputStream.write + 0 311481/2 4790259412095 7 -> java/lang/System.arraycopy + 0 311481/2 4790259412102 7 <- java/lang/System.arraycopy + 0 311481/2 4790259412110 7 <- java/io/BufferedOutputStream.write + 0 311481/2 4790259412118 7 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790259412125 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790259412132 7 -> java/io/FileOutputStream.write + 0 311481/2 4790259412140 7 -> java/io/FileOutputStream.writeBytes + 0 311481/2 4790259412157 17 <- java/io/FileOutputStream.writeBytes + 0 311481/2 4790259412165 8 <- java/io/FileOutputStream.write + 0 311481/2 4790259412172 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790259412180 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790259412188 7 <- java/io/PrintStream.write + 0 311481/2 4790259412195 7 -> java/nio/Buffer.clear + 0 311481/2 4790259412203 7 <- java/nio/Buffer.clear + 0 311481/2 4790259412210 7 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790259412218 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790259412226 7 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790259412233 7 <- java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790259412241 7 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790259412248 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790259412256 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790259412263 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790259412271 7 <- java/io/PrintStream.newLine + 0 311481/2 4790259412279 7 <- java/io/PrintStream.println + 0 311481/2 4790259412287 8 -> java/lang/Thread.currentThread + 0 311481/2 4790259412294 7 <- java/lang/Thread.currentThread + 0 311481/2 4790259412302 7 -> java/lang/Thread.sleep + 0 311481/2 4790260420044 1007741 <- java/lang/Thread.sleep + 0 311481/2 4790260420073 29 <- Func_abc.func_c + 0 311481/2 4790260420081 7 <- Func_abc.func_b + 0 311481/2 4790260420088 7 <- Func_abc.func_a + 0 311481/2 4790260420096 7 <- Func_abc.main + 0 311481/2 4790260420121 24 -> java/lang/Thread.exit + 0 311481/2 4790260420153 32 -> java/lang/ThreadGroup.remove + 0 311481/2 4790260420169 15 -> java/lang/System.arraycopy + 0 311481/2 4790260420178 8 <- java/lang/System.arraycopy + 0 311481/2 4790260420190 11 -> java/lang/Object.notifyAll + 0 311481/2 4790260420203 13 <- java/lang/Object.notifyAll + 0 311481/2 4790260420211 8 <- java/lang/ThreadGroup.remove + 0 311481/2 4790260420225 13 <- java/lang/Thread.exit + 0 311481/2 4790260420438 212 -> java/lang/Thread. + 0 311481/2 4790260420447 8 -> java/lang/Object. + 0 311481/2 4790260420454 7 <- java/lang/Object. + 0 311481/2 4790260420464 9 -> java/lang/Object. + 0 311481/2 4790260420471 7 <- java/lang/Object. + 0 311481/2 4790260420479 8 -> java/lang/Thread.init + 0 311481/2 4790260420486 7 -> java/lang/Thread.currentThread + 0 311481/2 4790260420494 7 <- java/lang/Thread.currentThread + 0 311481/2 4790260420503 8 -> java/lang/System.getSecurityManager + 0 311481/2 4790260420511 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790260420519 8 -> java/lang/ThreadGroup.checkAccess + 0 311481/2 4790260420526 7 -> java/lang/System.getSecurityManager + 0 311481/2 4790260420534 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790260420542 8 <- java/lang/ThreadGroup.checkAccess + 0 311481/2 4790260420550 8 -> java/lang/ThreadGroup.addUnstarted + 0 311481/2 4790260420558 7 <- java/lang/ThreadGroup.addUnstarted + 0 311481/2 4790260420567 9 -> java/lang/String.toCharArray + 0 311481/2 4790260420575 8 -> java/lang/String.getChars + 0 311481/2 4790260420584 8 -> java/lang/System.arraycopy + 0 311481/2 4790260420592 8 <- java/lang/System.arraycopy + 0 311481/2 4790260420599 7 <- java/lang/String.getChars + 0 311481/2 4790260420607 7 <- java/lang/String.toCharArray + 0 311481/2 4790260420615 7 -> java/lang/Thread.getContextClassLoader + 0 311481/2 4790260420622 7 <- java/lang/Thread.getContextClassLoader + 0 311481/2 4790260420631 8 -> java/security/AccessController.getContext + 0 311481/2 4790260420638 7 -> java/security/AccessController.getStackAccessControlContext + 0 311481/2 4790260420653 14 <- java/security/AccessController.getStackAccessControlContext + 0 311481/2 4790260420662 8 -> java/security/AccessControlContext.optimize + 0 311481/2 4790260420670 8 -> java/security/AccessController.getInheritedAccessControlContext + 0 311481/2 4790260420678 8 <- java/security/AccessController.getInheritedAccessControlContext + 0 311481/2 4790260420687 8 <- java/security/AccessControlContext.optimize + 0 311481/2 4790260420695 7 <- java/security/AccessController.getContext + 0 311481/2 4790260420703 8 -> java/lang/Thread.setPriority + 0 311481/2 4790260420710 7 -> java/lang/Thread.checkAccess + 0 311481/2 4790260420718 7 -> java/lang/System.getSecurityManager + 0 311481/2 4790260420725 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790260420732 7 <- java/lang/Thread.checkAccess + 0 311481/2 4790260420741 8 -> java/lang/Thread.setPriority0 + 0 311481/2 4790260420760 19 <- java/lang/Thread.setPriority0 + 0 311481/2 4790260420768 8 <- java/lang/Thread.setPriority + 0 311481/2 4790260420777 8 -> java/lang/Thread.nextThreadID + 0 311481/2 4790260420785 8 <- java/lang/Thread.nextThreadID + 0 311481/2 4790260420793 7 <- java/lang/Thread.init + 0 311481/2 4790260420801 7 <- java/lang/Thread. + 0 311481/2 4790260420810 9 -> java/lang/ThreadGroup.add + 0 311481/2 4790260420819 8 <- java/lang/ThreadGroup.add + 0 311481/2 4790260420834 15 -> java/lang/Shutdown.shutdown + 0 311481/2 4790260420846 12 -> java/lang/Shutdown.sequence + 0 311481/2 4790260420855 9 -> java/lang/Shutdown.runHooks + 0 311481/2 4790260420867 11 -> java/util/AbstractList.iterator + 0 311481/2 4790260421144 277 -> java/util/AbstractList$Itr. + 0 311481/2 4790260421156 12 -> java/util/AbstractList$Itr. + 0 311481/2 4790260421168 11 -> java/lang/Object. + 0 311481/2 4790260421175 7 <- java/lang/Object. + 0 311481/2 4790260421189 13 <- java/util/AbstractList$Itr. + 0 311481/2 4790260421197 7 <- java/util/AbstractList$Itr. + 0 311481/2 4790260421205 7 <- java/util/AbstractList.iterator + 0 311481/2 4790260421218 13 -> java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260421229 11 <- java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260421240 10 -> java/util/AbstractList$Itr.next + 0 311481/2 4790260421249 9 -> java/util/AbstractList$Itr.checkForComodification + 0 311481/2 4790260421256 7 <- java/util/AbstractList$Itr.checkForComodification + 0 311481/2 4790260421267 10 -> java/util/ArrayList.get + 0 311481/2 4790260421274 7 -> java/util/ArrayList.RangeCheck + 0 311481/2 4790260421282 7 <- java/util/ArrayList.RangeCheck + 0 311481/2 4790260421290 7 <- java/util/ArrayList.get + 0 311481/2 4790260421297 7 <- java/util/AbstractList$Itr.next + 0 311481/2 4790260421310 12 -> java/io/Console$1$1.run + 0 311481/2 4790260421321 10 -> java/io/Console.access$600 + 0 311481/2 4790260421330 9 <- java/io/Console.access$600 + 0 311481/2 4790260421338 7 <- java/io/Console$1$1.run + 0 311481/2 4790260421346 7 -> java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260421353 7 <- java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260421361 7 -> java/util/AbstractList$Itr.next + 0 311481/2 4790260421368 7 -> java/util/AbstractList$Itr.checkForComodification + 0 311481/2 4790260421376 7 <- java/util/AbstractList$Itr.checkForComodification + 0 311481/2 4790260421384 8 -> java/util/ArrayList.get + 0 311481/2 4790260421391 7 -> java/util/ArrayList.RangeCheck + 0 311481/2 4790260421398 7 <- java/util/ArrayList.RangeCheck + 0 311481/2 4790260421406 7 <- java/util/ArrayList.get + 0 311481/2 4790260421414 7 <- java/util/AbstractList$Itr.next + 0 311481/2 4790260421422 8 -> java/lang/ApplicationShutdownHooks.run + 0 311481/2 4790260421435 13 -> java/util/IdentityHashMap.keySet + 0 311481/2 4790260421598 163 -> java/util/IdentityHashMap$KeySet. + 0 311481/2 4790260421610 11 -> java/util/IdentityHashMap$KeySet. + 0 311481/2 4790260421622 11 -> java/util/AbstractSet. + 0 311481/2 4790260421629 7 -> java/util/AbstractCollection. + 0 311481/2 4790260421637 7 -> java/lang/Object. + 0 311481/2 4790260421644 7 <- java/lang/Object. + 0 311481/2 4790260421652 8 <- java/util/AbstractCollection. + 0 311481/2 4790260421660 7 <- java/util/AbstractSet. + 0 311481/2 4790260421668 7 <- java/util/IdentityHashMap$KeySet. + 0 311481/2 4790260421675 7 <- java/util/IdentityHashMap$KeySet. + 0 311481/2 4790260421683 7 <- java/util/IdentityHashMap.keySet + 0 311481/2 4790260421695 11 -> java/util/IdentityHashMap$KeySet.iterator + 0 311481/2 4790260421882 187 -> java/util/IdentityHashMap$KeyIterator. + 0 311481/2 4790260421894 11 -> java/util/IdentityHashMap$KeyIterator. + 0 311481/2 4790260421905 11 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260421915 10 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260421926 10 -> java/lang/Object. + 0 311481/2 4790260421934 7 <- java/lang/Object. + 0 311481/2 4790260421945 11 -> java/util/IdentityHashMap.access$000 + 0 311481/2 4790260421954 8 <- java/util/IdentityHashMap.access$000 + 0 311481/2 4790260421967 12 -> java/util/IdentityHashMap.access$200 + 0 311481/2 4790260421975 8 <- java/util/IdentityHashMap.access$200 + 0 311481/2 4790260421986 10 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260421994 8 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260422002 7 <- java/util/IdentityHashMap$KeyIterator. + 0 311481/2 4790260422010 7 <- java/util/IdentityHashMap$KeyIterator. + 0 311481/2 4790260422018 7 <- java/util/IdentityHashMap$KeySet.iterator + 0 311481/2 4790260422029 11 -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311481/2 4790260422037 8 <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311481/2 4790260422045 8 -> java/util/IdentityHashMap$KeySet.iterator + 0 311481/2 4790260422053 7 -> java/util/IdentityHashMap$KeyIterator. + 0 311481/2 4790260422060 7 -> java/util/IdentityHashMap$KeyIterator. + 0 311481/2 4790260422068 7 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260422075 7 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260422083 7 -> java/lang/Object. + 0 311481/2 4790260422090 7 <- java/lang/Object. + 0 311481/2 4790260422098 8 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260422106 8 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260422114 7 <- java/util/IdentityHashMap$KeyIterator. + 0 311481/2 4790260422121 7 <- java/util/IdentityHashMap$KeyIterator. + 0 311481/2 4790260422129 7 <- java/util/IdentityHashMap$KeySet.iterator + 0 311481/2 4790260422137 7 -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311481/2 4790260422145 7 <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311481/2 4790260422153 8 <- java/lang/ApplicationShutdownHooks.run + 0 311481/2 4790260422161 7 -> java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260422168 7 <- java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260422176 7 -> java/util/AbstractList$Itr.next + 0 311481/2 4790260422183 7 -> java/util/AbstractList$Itr.checkForComodification + 0 311481/2 4790260422191 7 <- java/util/AbstractList$Itr.checkForComodification + 0 311481/2 4790260422199 8 -> java/util/ArrayList.get + 0 311481/2 4790260422206 7 -> java/util/ArrayList.RangeCheck + 0 311481/2 4790260422213 7 <- java/util/ArrayList.RangeCheck + 0 311481/2 4790260422221 7 <- java/util/ArrayList.get + 0 311481/2 4790260422229 7 <- java/util/AbstractList$Itr.next + 0 311481/2 4790260422237 8 -> java/io/File$1.run + 0 311481/2 4790260422318 81 -> java/io/DeleteOnExitHook. + 0 311481/2 4790260422461 143 -> java/util/LinkedHashSet. + 0 311481/2 4790260422473 12 -> java/util/HashSet. + 0 311481/2 4790260422481 7 -> java/util/AbstractSet. + 0 311481/2 4790260422488 7 -> java/util/AbstractCollection. + 0 311481/2 4790260422495 7 -> java/lang/Object. + 0 311481/2 4790260422502 7 <- java/lang/Object. + 0 311481/2 4790260422511 8 <- java/util/AbstractCollection. + 0 311481/2 4790260422519 7 <- java/util/AbstractSet. + 0 311481/2 4790260422531 12 -> java/util/LinkedHashMap. + 0 311481/2 4790260422541 10 -> java/util/HashMap. + 0 311481/2 4790260422549 7 -> java/util/AbstractMap. + 0 311481/2 4790260422556 7 -> java/lang/Object. + 0 311481/2 4790260422563 7 <- java/lang/Object. + 0 311481/2 4790260422571 7 <- java/util/AbstractMap. + 0 311481/2 4790260422580 9 -> java/lang/Float.isNaN + 0 311481/2 4790260422588 7 <- java/lang/Float.isNaN + 0 311481/2 4790260422600 12 -> java/util/LinkedHashMap.init + 0 311481/2 4790260422608 8 -> java/util/LinkedHashMap$Entry. + 0 311481/2 4790260422615 7 -> java/util/HashMap$Entry. + 0 311481/2 4790260422623 7 -> java/lang/Object. + 0 311481/2 4790260422630 6 <- java/lang/Object. + 0 311481/2 4790260422638 7 <- java/util/HashMap$Entry. + 0 311481/2 4790260422645 7 <- java/util/LinkedHashMap$Entry. + 0 311481/2 4790260422653 7 <- java/util/LinkedHashMap.init + 0 311481/2 4790260422660 7 <- java/util/HashMap. + 0 311481/2 4790260422668 7 <- java/util/LinkedHashMap. + 0 311481/2 4790260422676 7 <- java/util/HashSet. + 0 311481/2 4790260422683 7 <- java/util/LinkedHashSet. + 0 311481/2 4790260422692 9 <- java/io/DeleteOnExitHook. + 0 311481/2 4790260422703 10 -> java/io/DeleteOnExitHook.hook + 0 311481/2 4790260422713 10 -> java/io/DeleteOnExitHook. + 0 311481/2 4790260422723 9 -> java/lang/Object. + 0 311481/2 4790260422730 7 <- java/lang/Object. + 0 311481/2 4790260422738 7 <- java/io/DeleteOnExitHook. + 0 311481/2 4790260422746 7 <- java/io/DeleteOnExitHook.hook + 0 311481/2 4790260422756 10 -> java/io/DeleteOnExitHook.run + 0 311481/2 4790260422768 12 -> java/util/ArrayList. + 0 311481/2 4790260422775 7 -> java/util/AbstractList. + 0 311481/2 4790260422783 7 -> java/util/AbstractCollection. + 0 311481/2 4790260422790 7 -> java/lang/Object. + 0 311481/2 4790260422797 7 <- java/lang/Object. + 0 311481/2 4790260422805 7 <- java/util/AbstractCollection. + 0 311481/2 4790260422813 7 <- java/util/AbstractList. + 0 311481/2 4790260422824 11 -> java/util/AbstractCollection.toArray + 0 311481/2 4790260422835 10 -> java/util/HashSet.size + 0 311481/2 4790260422844 9 <- java/util/HashSet.size + 0 311481/2 4790260422855 10 -> java/util/HashSet.iterator + 0 311481/2 4790260422865 9 -> java/util/HashMap.keySet + 0 311481/2 4790260422956 91 -> java/util/HashMap$KeySet. + 0 311481/2 4790260422967 10 -> java/util/HashMap$KeySet. + 0 311481/2 4790260422978 10 -> java/util/AbstractSet. + 0 311481/2 4790260422985 7 -> java/util/AbstractCollection. + 0 311481/2 4790260422993 7 -> java/lang/Object. + 0 311481/2 4790260423000 7 <- java/lang/Object. + 0 311481/2 4790260423008 7 <- java/util/AbstractCollection. + 0 311481/2 4790260423015 7 <- java/util/AbstractSet. + 0 311481/2 4790260423023 7 <- java/util/HashMap$KeySet. + 0 311481/2 4790260423031 7 <- java/util/HashMap$KeySet. + 0 311481/2 4790260423038 7 <- java/util/HashMap.keySet + 0 311481/2 4790260423049 10 -> java/util/HashMap$KeySet.iterator + 0 311481/2 4790260423060 11 -> java/util/LinkedHashMap.newKeyIterator + 0 311481/2 4790260423243 182 -> java/util/LinkedHashMap$KeyIterator. + 0 311481/2 4790260423254 11 -> java/util/LinkedHashMap$KeyIterator. + 0 311481/2 4790260423266 11 -> java/util/LinkedHashMap$LinkedHashIterator. + 0 311481/2 4790260423276 9 -> java/util/LinkedHashMap$LinkedHashIterator. + 0 311481/2 4790260423286 10 -> java/lang/Object. + 0 311481/2 4790260423294 7 <- java/lang/Object. + 0 311481/2 4790260423311 16 <- java/util/LinkedHashMap$LinkedHashIterator. + 0 311481/2 4790260423319 8 <- java/util/LinkedHashMap$LinkedHashIterator. + 0 311481/2 4790260423327 7 <- java/util/LinkedHashMap$KeyIterator. + 0 311481/2 4790260423334 7 <- java/util/LinkedHashMap$KeyIterator. + 0 311481/2 4790260423342 7 <- java/util/LinkedHashMap.newKeyIterator + 0 311481/2 4790260423350 7 <- java/util/HashMap$KeySet.iterator + 0 311481/2 4790260423357 7 <- java/util/HashSet.iterator + 0 311481/2 4790260423369 11 -> java/util/LinkedHashMap$LinkedHashIterator.hasNext + 0 311481/2 4790260423377 8 <- java/util/LinkedHashMap$LinkedHashIterator.hasNext + 0 311481/2 4790260423385 8 <- java/util/AbstractCollection.toArray + 0 311481/2 4790260423393 8 -> java/lang/Object.getClass + 0 311481/2 4790260423402 8 <- java/lang/Object.getClass + 0 311481/2 4790260423410 8 <- java/util/ArrayList. + 0 311481/2 4790260423422 11 -> java/util/Collections.reverse + 0 311481/2 4790260423435 13 <- java/util/Collections.reverse + 0 311481/2 4790260423445 10 -> java/util/AbstractList.iterator + 0 311481/2 4790260423453 8 -> java/util/AbstractList$Itr. + 0 311481/2 4790260423460 7 -> java/util/AbstractList$Itr. + 0 311481/2 4790260423468 7 -> java/lang/Object. + 0 311481/2 4790260423475 7 <- java/lang/Object. + 0 311481/2 4790260423483 7 <- java/util/AbstractList$Itr. + 0 311481/2 4790260423490 7 <- java/util/AbstractList$Itr. + 0 311481/2 4790260423498 7 <- java/util/AbstractList.iterator + 0 311481/2 4790260423508 10 -> java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260423516 7 <- java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260423524 8 <- java/io/DeleteOnExitHook.run + 0 311481/2 4790260423532 7 <- java/io/File$1.run + 0 311481/2 4790260423539 7 -> java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260423547 7 <- java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260423554 7 <- java/lang/Shutdown.runHooks + 0 311481/2 4790260423564 9 <- java/lang/Shutdown.sequence + 0 311481/2 4790260423572 7 <- java/lang/Shutdown.shutdown + +I truncated 22800 lines from the above output to make it fit here. + +The fifth column is indented by 2 spaces to show when a new method begins. +This shows which method is calling which. + +The TIME(us) column shows time since boot. + +The DELTA(us) column shows time from that line to the previous line, and +so can be a bit tricky to read. + +The FILE column shows file that was being executed. + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +Try skimming down the "DELTA(us)" column to find the largest delta time, +and see what lines it corresponds with. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + +If you see "drops" warnings, see the Notes/ALLjava_notes.txt file for details. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_methodcalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_methodcalls_example.txt new file mode 100644 index 00000000000..22a2b4d1a7e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_methodcalls_example.txt @@ -0,0 +1,999 @@ +The following are examples of running the j_methodcalls.d script. + +This traces calls to methods from all Java processes on the system with hotspot +provider support (1.6.0). Method calls are only visible when using the flag +"+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile + +Here we see it running on Code/Java/Func_abc + +# j_methodcalls_example.txt +Tracing... Hit Ctrl-C to end. + + PID COUNT CLASS.METHOD + 311492 1 Func_abc.func_a + 311492 1 Func_abc.func_b + 311492 1 Func_abc.func_c + 311492 1 Func_abc.main + 311492 1 java/io/BufferedInputStream. + 311492 1 java/io/BufferedReader. + 311492 1 java/io/BufferedReader.close + 311492 1 java/io/BufferedWriter. + 311492 1 java/io/Console$1$1. + 311492 1 java/io/Console$1$1.run + 311492 1 java/io/Console$1. + 311492 1 java/io/Console$1.consoleRestoreHook + 311492 1 java/io/Console. + 311492 1 java/io/Console.access$600 + 311492 1 java/io/DataInputStream. + 311492 1 java/io/DataInputStream.readFully + 311492 1 java/io/DeleteOnExitHook. + 311492 1 java/io/DeleteOnExitHook. + 311492 1 java/io/DeleteOnExitHook.hook + 311492 1 java/io/DeleteOnExitHook.run + 311492 1 java/io/File$1. + 311492 1 java/io/File$1.run + 311492 1 java/io/File. + 311492 1 java/io/File.lastModified + 311492 1 java/io/File.length + 311492 1 java/io/FileDescriptor. + 311492 1 java/io/FileDescriptor.initIDs + 311492 1 java/io/FileInputStream. + 311492 1 java/io/FileInputStream.available + 311492 1 java/io/FileInputStream.initIDs + 311492 1 java/io/FileOutputStream. + 311492 1 java/io/FileOutputStream.initIDs + 311492 1 java/io/FilePermission.newPermissionCollection + 311492 1 java/io/FilePermissionCollection. + 311492 1 java/io/FilePermissionCollection. + 311492 1 java/io/FilePermissionCollection.add + 311492 1 java/io/FileReader. + 311492 1 java/io/FileSystem. + 311492 1 java/io/FileSystem. + 311492 1 java/io/FileSystem.getFileSystem + 311492 1 java/io/FilterInputStream.close + 311492 1 java/io/InputStreamReader. + 311492 1 java/io/InputStreamReader.close + 311492 1 java/io/ObjectStreamClass. + 311492 1 java/io/ObjectStreamClass.initNative + 311492 1 java/io/UnixFileSystem. + 311492 1 java/io/UnixFileSystem. + 311492 1 java/io/UnixFileSystem.getLastModifiedTime + 311492 1 java/io/UnixFileSystem.getLength + 311492 1 java/io/UnixFileSystem.initIDs + 311492 1 java/lang/AbstractStringBuilder. + 311492 1 java/lang/ApplicationShutdownHooks. + 311492 1 java/lang/ApplicationShutdownHooks. + 311492 1 java/lang/ApplicationShutdownHooks.hook + 311492 1 java/lang/ApplicationShutdownHooks.run + 311492 1 java/lang/Boolean. + 311492 1 java/lang/Byte. + 311492 1 java/lang/Character. + 311492 1 java/lang/CharacterDataLatin1. + 311492 1 java/lang/Class. + 311492 1 java/lang/Class.access$302 + 311492 1 java/lang/Class.registerNatives + 311492 1 java/lang/ClassLoader$3. + 311492 1 java/lang/ClassLoader$3.run + 311492 1 java/lang/ClassLoader$NativeLibrary. + 311492 1 java/lang/ClassLoader$NativeLibrary.getFromClass + 311492 1 java/lang/ClassLoader$NativeLibrary.load + 311492 1 java/lang/ClassLoader. + 311492 1 java/lang/ClassLoader.access$100 + 311492 1 java/lang/ClassLoader.addClass + 311492 1 java/lang/ClassLoader.checkCerts + 311492 1 java/lang/ClassLoader.defineClass + 311492 1 java/lang/ClassLoader.defineClass1 + 311492 1 java/lang/ClassLoader.defineClassSourceLocation + 311492 1 java/lang/ClassLoader.getSystemClassLoader + 311492 1 java/lang/ClassLoader.initSystemClassLoader + 311492 1 java/lang/ClassLoader.loadLibrary + 311492 1 java/lang/ClassLoader.loadLibrary0 + 311492 1 java/lang/ClassLoader.postDefineClass + 311492 1 java/lang/ClassLoader.preDefineClass + 311492 1 java/lang/ClassLoader.registerNatives + 311492 1 java/lang/Compiler$1. + 311492 1 java/lang/Compiler$1.run + 311492 1 java/lang/Compiler. + 311492 1 java/lang/Compiler.registerNatives + 311492 1 java/lang/Double. + 311492 1 java/lang/Double.doubleToLongBits + 311492 1 java/lang/Double.doubleToRawLongBits + 311492 1 java/lang/Error. + 311492 1 java/lang/Float. + 311492 1 java/lang/Float.floatToIntBits + 311492 1 java/lang/Float.floatToRawIntBits + 311492 1 java/lang/IncompatibleClassChangeError. + 311492 1 java/lang/Integer. + 311492 1 java/lang/LinkageError. + 311492 1 java/lang/Long. + 311492 1 java/lang/Math. + 311492 1 java/lang/NoSuchMethodError. + 311492 1 java/lang/Object. + 311492 1 java/lang/Object.notifyAll + 311492 1 java/lang/Object.registerNatives + 311492 1 java/lang/Runtime. + 311492 1 java/lang/Runtime. + 311492 1 java/lang/Runtime.loadLibrary0 + 311492 1 java/lang/Runtime.maxMemory + 311492 1 java/lang/Short. + 311492 1 java/lang/Shutdown. + 311492 1 java/lang/Shutdown.runHooks + 311492 1 java/lang/Shutdown.sequence + 311492 1 java/lang/Shutdown.shutdown + 311492 1 java/lang/String. + 311492 1 java/lang/String.checkBounds + 311492 1 java/lang/String.length + 311492 1 java/lang/String.trim + 311492 1 java/lang/StringBuffer. + 311492 1 java/lang/StringCoding$StringDecoder.decode + 311492 1 java/lang/StringCoding. + 311492 1 java/lang/StringCoding.access$000 + 311492 1 java/lang/StringCoding.access$100 + 311492 1 java/lang/StringCoding.decode + 311492 1 java/lang/StringCoding.deref + 311492 1 java/lang/StringCoding.lookupCharset + 311492 1 java/lang/StringCoding.safeTrim + 311492 1 java/lang/StringCoding.scale + 311492 1 java/lang/StringCoding.set + 311492 1 java/lang/System$2. + 311492 1 java/lang/System. + 311492 1 java/lang/System.getCallerClass + 311492 1 java/lang/System.initProperties + 311492 1 java/lang/System.initializeSystemClass + 311492 1 java/lang/System.loadLibrary + 311492 1 java/lang/System.mapLibraryName + 311492 1 java/lang/System.nullInputStream + 311492 1 java/lang/System.registerNatives + 311492 1 java/lang/System.setErr0 + 311492 1 java/lang/System.setIn0 + 311492 1 java/lang/System.setOut0 + 311492 1 java/lang/SystemClassLoaderAction. + 311492 1 java/lang/SystemClassLoaderAction.run + 311492 1 java/lang/Terminator$1. + 311492 1 java/lang/Terminator. + 311492 1 java/lang/Terminator.setup + 311492 1 java/lang/Thread. + 311492 1 java/lang/Thread.exit + 311492 1 java/lang/Thread.getPriority + 311492 1 java/lang/Thread.interrupted + 311492 1 java/lang/Thread.isInterrupted + 311492 1 java/lang/Thread.registerNatives + 311492 1 java/lang/Thread.setContextClassLoader + 311492 1 java/lang/ThreadGroup.remove + 311492 1 java/lang/ThreadLocal$ThreadLocalMap$Entry. + 311492 1 java/lang/ThreadLocal$ThreadLocalMap. + 311492 1 java/lang/ThreadLocal$ThreadLocalMap.access$100 + 311492 1 java/lang/ThreadLocal$ThreadLocalMap.set + 311492 1 java/lang/ThreadLocal$ThreadLocalMap.setThreshold + 311492 1 java/lang/ThreadLocal. + 311492 1 java/lang/ThreadLocal.createMap + 311492 1 java/lang/ThreadLocal.get + 311492 1 java/lang/ThreadLocal.initialValue + 311492 1 java/lang/ThreadLocal.set + 311492 1 java/lang/ThreadLocal.setInitialValue + 311492 1 java/lang/ref/Finalizer$FinalizerThread. + 311492 1 java/lang/ref/Finalizer$FinalizerThread.run + 311492 1 java/lang/ref/Finalizer. + 311492 1 java/lang/ref/Finalizer.access$000 + 311492 1 java/lang/ref/Reference$ReferenceHandler. + 311492 1 java/lang/ref/Reference$ReferenceHandler.run + 311492 1 java/lang/ref/Reference. + 311492 1 java/lang/ref/Reference.access$200 + 311492 1 java/lang/ref/ReferenceQueue. + 311492 1 java/lang/ref/ReferenceQueue.reallyPoll + 311492 1 java/lang/reflect/AccessibleObject. + 311492 1 java/lang/reflect/Constructor. + 311492 1 java/lang/reflect/Field. + 311492 1 java/lang/reflect/Field.getName + 311492 1 java/lang/reflect/Method. + 311492 1 java/lang/reflect/Method.getModifiers + 311492 1 java/lang/reflect/Modifier. + 311492 1 java/lang/reflect/Modifier.isVolatile + 311492 1 java/lang/reflect/ReflectAccess. + 311492 1 java/lang/reflect/ReflectPermission. + 311492 1 java/net/ContentHandler. + 311492 1 java/net/Parts.getQuery + 311492 1 java/net/URL. + 311492 1 java/net/URL.openConnection + 311492 1 java/net/URLClassLoader$7. + 311492 1 java/net/URLClassLoader. + 311492 1 java/net/URLClassLoader.access$000 + 311492 1 java/net/URLClassLoader.defineClass + 311492 1 java/net/URLClassLoader.getPermissions + 311492 1 java/net/URLConnection. + 311492 1 java/net/URLConnection. + 311492 1 java/net/UnknownContentHandler. + 311492 1 java/nio/Bits. + 311492 1 java/nio/ByteOrder. + 311492 1 java/nio/charset/Charset. + 311492 1 java/nio/charset/Charset. + 311492 1 java/nio/charset/CharsetDecoder. + 311492 1 java/nio/charset/CharsetDecoder.flush + 311492 1 java/nio/charset/CharsetDecoder.implFlush + 311492 1 java/nio/charset/CharsetEncoder. + 311492 1 java/nio/charset/CoderResult$1. + 311492 1 java/nio/charset/CoderResult$2. + 311492 1 java/nio/charset/CoderResult. + 311492 1 java/nio/charset/CodingErrorAction. + 311492 1 java/nio/charset/spi/CharsetProvider. + 311492 1 java/security/AccessControlContext. + 311492 1 java/security/BasicPermission.newPermissionCollection + 311492 1 java/security/BasicPermissionCollection. + 311492 1 java/security/BasicPermissionCollection. + 311492 1 java/security/BasicPermissionCollection.add + 311492 1 java/security/CodeSource. + 311492 1 java/security/Permissions. + 311492 1 java/security/Policy$UnsupportedEmptyCollection. + 311492 1 java/security/Policy. + 311492 1 java/security/PrivilegedActionException. + 311492 1 java/security/ProtectionDomain. + 311492 1 java/security/ProtectionDomain. + 311492 1 java/security/SecureClassLoader. + 311492 1 java/security/SecureClassLoader.check + 311492 1 java/security/SecureClassLoader.defineClass + 311492 1 java/security/SecureClassLoader.getPermissions + 311492 1 java/security/SecureClassLoader.getProtectionDomain + 311492 1 java/util/AbstractCollection.toArray + 311492 1 java/util/BitSet. + 311492 1 java/util/BitSet. + 311492 1 java/util/BitSet.initWords + 311492 1 java/util/Collections$SynchronizedMap. + 311492 1 java/util/Collections. + 311492 1 java/util/Collections.reverse + 311492 1 java/util/Collections.synchronizedMap + 311492 1 java/util/HashMap$KeySet.iterator + 311492 1 java/util/HashMap.keySet + 311492 1 java/util/HashMap.size + 311492 1 java/util/HashSet. + 311492 1 java/util/HashSet.iterator + 311492 1 java/util/HashSet.size + 311492 1 java/util/Hashtable$EmptyEnumerator. + 311492 1 java/util/Hashtable$EmptyIterator. + 311492 1 java/util/Hashtable. + 311492 1 java/util/IdentityHashMap. + 311492 1 java/util/IdentityHashMap. + 311492 1 java/util/IdentityHashMap.access$000 + 311492 1 java/util/IdentityHashMap.access$200 + 311492 1 java/util/IdentityHashMap.init + 311492 1 java/util/IdentityHashMap.keySet + 311492 1 java/util/LinkedHashMap$LinkedHashIterator.hasNext + 311492 1 java/util/LinkedHashMap.newKeyIterator + 311492 1 java/util/LinkedHashSet. + 311492 1 java/util/Locale. + 311492 1 java/util/Locale.getInstance + 311492 1 java/util/Properties. + 311492 1 java/util/StringTokenizer.countTokens + 311492 1 java/util/StringTokenizer.hasMoreTokens + 311492 1 java/util/Vector.contains + 311492 1 java/util/Vector.copyInto + 311492 1 java/util/Vector.indexOf + 311492 1 java/util/concurrent/ConcurrentHashMap$Segment.get + 311492 1 java/util/concurrent/ConcurrentHashMap$Segment.getFirst + 311492 1 java/util/concurrent/ConcurrentHashMap$Segment.newArray + 311492 1 java/util/concurrent/ConcurrentHashMap.get + 311492 1 java/util/concurrent/atomic/AtomicInteger. + 311492 1 java/util/concurrent/atomic/AtomicInteger. + 311492 1 java/util/concurrent/atomic/AtomicInteger.get + 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl. + 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl. + 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater. + 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater.newUpdater + 311492 1 java/util/concurrent/locks/AbstractQueuedSynchronizer. + 311492 1 java/util/concurrent/locks/AbstractQueuedSynchronizer.getState + 311492 1 java/util/jar/JarEntry. + 311492 1 java/util/jar/JarFile$JarFileEntry. + 311492 1 java/util/jar/JarFile. + 311492 1 java/util/jar/JarFile.getManEntry + 311492 1 java/util/jar/JarFile.hasClassPathAttribute + 311492 1 java/util/jar/JarFile.isKnownToNotHaveClassPathAttribute + 311492 1 java/util/jar/JavaUtilJarAccessImpl. + 311492 1 java/util/jar/JavaUtilJarAccessImpl.jarFileHasClassPathAttribute + 311492 1 java/util/zip/Inflater. + 311492 1 java/util/zip/Inflater. + 311492 1 java/util/zip/Inflater.finished + 311492 1 java/util/zip/Inflater.init + 311492 1 java/util/zip/Inflater.initIDs + 311492 1 java/util/zip/Inflater.needsDictionary + 311492 1 java/util/zip/Inflater.needsInput + 311492 1 java/util/zip/Inflater.setInput + 311492 1 java/util/zip/InflaterInputStream. + 311492 1 java/util/zip/InflaterInputStream.ensureOpen + 311492 1 java/util/zip/InflaterInputStream.read + 311492 1 java/util/zip/ZipEntry. + 311492 1 java/util/zip/ZipEntry.getSize + 311492 1 java/util/zip/ZipEntry.initFields + 311492 1 java/util/zip/ZipEntry.initIDs + 311492 1 java/util/zip/ZipFile$1. + 311492 1 java/util/zip/ZipFile$1.close + 311492 1 java/util/zip/ZipFile$1.fill + 311492 1 java/util/zip/ZipFile$ZipFileInputStream. + 311492 1 java/util/zip/ZipFile$ZipFileInputStream.read + 311492 1 java/util/zip/ZipFile. + 311492 1 java/util/zip/ZipFile. + 311492 1 java/util/zip/ZipFile.access$000 + 311492 1 java/util/zip/ZipFile.access$1000 + 311492 1 java/util/zip/ZipFile.access$1100 + 311492 1 java/util/zip/ZipFile.access$1200 + 311492 1 java/util/zip/ZipFile.access$800 + 311492 1 java/util/zip/ZipFile.access$900 + 311492 1 java/util/zip/ZipFile.ensureOpenOrZipException + 311492 1 java/util/zip/ZipFile.getCSize + 311492 1 java/util/zip/ZipFile.getInflater + 311492 1 java/util/zip/ZipFile.getMethod + 311492 1 java/util/zip/ZipFile.getTotal + 311492 1 java/util/zip/ZipFile.initIDs + 311492 1 java/util/zip/ZipFile.open + 311492 1 java/util/zip/ZipFile.read + 311492 1 java/util/zip/ZipFile.releaseInflater + 311492 1 sun/misc/ExtensionDependency.checkExtensionsDependencies + 311492 1 sun/misc/FileURLMapper. + 311492 1 sun/misc/FileURLMapper.exists + 311492 1 sun/misc/JarIndex.getJarIndex + 311492 1 sun/misc/Launcher$AppClassLoader$1. + 311492 1 sun/misc/Launcher$AppClassLoader$1.run + 311492 1 sun/misc/Launcher$AppClassLoader. + 311492 1 sun/misc/Launcher$AppClassLoader. + 311492 1 sun/misc/Launcher$AppClassLoader.getAppClassLoader + 311492 1 sun/misc/Launcher$AppClassLoader.getPermissions + 311492 1 sun/misc/Launcher$ExtClassLoader$1. + 311492 1 sun/misc/Launcher$ExtClassLoader$1.run + 311492 1 sun/misc/Launcher$ExtClassLoader. + 311492 1 sun/misc/Launcher$ExtClassLoader.getExtClassLoader + 311492 1 sun/misc/Launcher$ExtClassLoader.getExtDirs + 311492 1 sun/misc/Launcher$ExtClassLoader.getExtURLs + 311492 1 sun/misc/Launcher$Factory. + 311492 1 sun/misc/Launcher. + 311492 1 sun/misc/Launcher. + 311492 1 sun/misc/Launcher.access$200 + 311492 1 sun/misc/Launcher.access$300 + 311492 1 sun/misc/Launcher.getClassPath + 311492 1 sun/misc/Launcher.getLauncher + 311492 1 sun/misc/Launcher.pathToURLs + 311492 1 sun/misc/MetaIndex. + 311492 1 sun/misc/Resource. + 311492 1 sun/misc/Resource.getByteBuffer + 311492 1 sun/misc/Resource.getBytes + 311492 1 sun/misc/Resource.getCodeSigners + 311492 1 sun/misc/SharedSecrets. + 311492 1 sun/misc/SharedSecrets.getJavaIOAccess + 311492 1 sun/misc/SharedSecrets.getJavaIODeleteOnExitAccess + 311492 1 sun/misc/SharedSecrets.javaUtilJarAccess + 311492 1 sun/misc/SharedSecrets.setJavaIOAccess + 311492 1 sun/misc/SharedSecrets.setJavaIODeleteOnExitAccess + 311492 1 sun/misc/SharedSecrets.setJavaLangAccess + 311492 1 sun/misc/SharedSecrets.setJavaNetAccess + 311492 1 sun/misc/SharedSecrets.setJavaUtilJarAccess + 311492 1 sun/misc/Signal. + 311492 1 sun/misc/SignalHandler. + 311492 1 sun/misc/SoftCache. + 311492 1 sun/misc/URLClassPath$FileLoader$1. + 311492 1 sun/misc/URLClassPath$FileLoader$1.getCodeSourceURL + 311492 1 sun/misc/URLClassPath$FileLoader$1.getContentLength + 311492 1 sun/misc/URLClassPath$FileLoader$1.getInputStream + 311492 1 sun/misc/URLClassPath$FileLoader. + 311492 1 sun/misc/URLClassPath$FileLoader.getResource + 311492 1 sun/misc/URLClassPath$JarLoader$1. + 311492 1 sun/misc/URLClassPath$JarLoader$1.run + 311492 1 sun/misc/URLClassPath$JarLoader.access$502 + 311492 1 sun/misc/URLClassPath$JarLoader.access$600 + 311492 1 sun/misc/URLClassPath$JarLoader.access$702 + 311492 1 sun/misc/URLClassPath$JarLoader.getJarFile + 311492 1 sun/misc/URLClassPath$JarLoader.parseExtensionsDependencies + 311492 1 sun/misc/URLClassPath$Loader.getClassPath + 311492 1 sun/misc/URLClassPath. + 311492 1 sun/misc/URLClassPath.access$300 + 311492 1 sun/misc/Unsafe. + 311492 1 sun/misc/Unsafe. + 311492 1 sun/misc/Unsafe.allocateMemory + 311492 1 sun/misc/Unsafe.ensureClassInitialized + 311492 1 sun/misc/Unsafe.freeMemory + 311492 1 sun/misc/Unsafe.getByte + 311492 1 sun/misc/Unsafe.putLong + 311492 1 sun/misc/Unsafe.registerNatives + 311492 1 sun/misc/VM. + 311492 1 sun/misc/VM.booted + 311492 1 sun/misc/VM.initialize + 311492 1 sun/misc/VM.initializeOSEnvironment + 311492 1 sun/misc/Version. + 311492 1 sun/net/www/MessageHeader. + 311492 1 sun/net/www/MessageHeader.grow + 311492 1 sun/net/www/ParseUtil. + 311492 1 sun/net/www/URLConnection. + 311492 1 sun/net/www/protocol/file/FileURLConnection. + 311492 1 sun/net/www/protocol/file/FileURLConnection. + 311492 1 sun/net/www/protocol/file/FileURLConnection.getPermission + 311492 1 sun/net/www/protocol/file/Handler. + 311492 1 sun/net/www/protocol/file/Handler.createFileURLConnection + 311492 1 sun/nio/cs/FastCharsetProvider. + 311492 1 sun/nio/cs/StandardCharsets$Aliases.init + 311492 1 sun/nio/cs/StandardCharsets$Cache.init + 311492 1 sun/nio/cs/StandardCharsets$Classes.init + 311492 1 sun/nio/cs/StandardCharsets. + 311492 1 sun/nio/cs/StandardCharsets. + 311492 1 sun/nio/cs/StreamDecoder. + 311492 1 sun/nio/cs/StreamDecoder.close + 311492 1 sun/nio/cs/StreamDecoder.forInputStreamReader + 311492 1 sun/nio/cs/StreamDecoder.implClose + 311492 1 sun/nio/cs/StreamDecoder.inReady + 311492 1 sun/nio/cs/StreamEncoder. + 311492 1 sun/nio/cs/Surrogate$Parser. + 311492 1 sun/nio/cs/US_ASCII$Decoder. + 311492 1 sun/nio/cs/US_ASCII$Encoder. + 311492 1 sun/nio/cs/US_ASCII. + 311492 1 sun/reflect/Reflection. + 311492 1 sun/reflect/ReflectionFactory$1. + 311492 1 sun/reflect/ReflectionFactory$1.run + 311492 1 sun/reflect/ReflectionFactory. + 311492 1 sun/reflect/ReflectionFactory. + 311492 1 sun/reflect/ReflectionFactory.access$202 + 311492 1 sun/reflect/ReflectionFactory.setLangReflectAccess + 311492 1 sun/reflect/misc/ReflectUtil.ensureMemberAccess + 311492 1 sun/security/provider/PolicyFile. + 311492 1 sun/security/util/Debug. + 311492 2 java/io/BufferedInputStream. + 311492 2 java/io/BufferedOutputStream. + 311492 2 java/io/BufferedReader. + 311492 2 java/io/BufferedReader.fill + 311492 2 java/io/ExpiringCache$1. + 311492 2 java/io/File.list + 311492 2 java/io/FileInputStream.close + 311492 2 java/io/FileInputStream.close0 + 311492 2 java/io/FileInputStream.open + 311492 2 java/io/FileOutputStream. + 311492 2 java/io/FilePermission$1. + 311492 2 java/io/FilePermission. + 311492 2 java/io/FilePermission.getMask + 311492 2 java/io/FilePermission.init + 311492 2 java/io/FileSystem.getBooleanProperty + 311492 2 java/io/InputStreamReader.read + 311492 2 java/io/OutputStreamWriter. + 311492 2 java/io/PrintStream.init + 311492 2 java/io/UnixFileSystem.list + 311492 2 java/lang/Character.charCount + 311492 2 java/lang/CharacterDataLatin1.toUpperCase + 311492 2 java/lang/Class$1. + 311492 2 java/lang/Class$1.run + 311492 2 java/lang/Class.arrayContentsEq + 311492 2 java/lang/Class.getConstructor0 + 311492 2 java/lang/Class.getDeclaredConstructors0 + 311492 2 java/lang/Class.isInterface + 311492 2 java/lang/Class.privateGetDeclaredConstructors + 311492 2 java/lang/ClassLoader. + 311492 2 java/lang/ClassLoader.initializePath + 311492 2 java/lang/ClassNotFoundException. + 311492 2 java/lang/Object.clone + 311492 2 java/lang/Runtime.getRuntime + 311492 2 java/lang/String$CaseInsensitiveComparator. + 311492 2 java/lang/String.concat + 311492 2 java/lang/String.regionMatches + 311492 2 java/lang/StringCoding$StringDecoder. + 311492 2 java/lang/System.getProperties + 311492 2 java/lang/System.nullPrintStream + 311492 2 java/lang/System.setProperties + 311492 2 java/lang/Thread.isAlive + 311492 2 java/lang/Thread.setDaemon + 311492 2 java/lang/Thread.start + 311492 2 java/lang/Thread.start0 + 311492 2 java/lang/ThreadGroup. + 311492 2 java/lang/ref/Reference$Lock. + 311492 2 java/lang/ref/Reference.access$100 + 311492 2 java/lang/ref/ReferenceQueue.remove + 311492 2 java/lang/ref/SoftReference.get + 311492 2 java/lang/reflect/AccessibleObject.setAccessible + 311492 2 java/lang/reflect/AccessibleObject.setAccessible0 + 311492 2 java/lang/reflect/Constructor. + 311492 2 java/lang/reflect/Constructor.acquireConstructorAccessor + 311492 2 java/lang/reflect/Constructor.copy + 311492 2 java/lang/reflect/Constructor.getParameterTypes + 311492 2 java/lang/reflect/Modifier.isAbstract + 311492 2 java/lang/reflect/Modifier.isProtected + 311492 2 java/lang/reflect/ReflectAccess.copyConstructor + 311492 2 java/net/URL.set + 311492 2 java/net/URLClassLoader$1. + 311492 2 java/net/URLClassLoader$1.run + 311492 2 java/net/URLClassLoader. + 311492 2 java/net/URLClassLoader.findClass + 311492 2 java/net/URLStreamHandler.parseURL + 311492 2 java/net/URLStreamHandler.setURL + 311492 2 java/nio/ByteOrder. + 311492 2 java/nio/CharBuffer.allocate + 311492 2 java/nio/HeapByteBuffer.compact + 311492 2 java/nio/charset/Charset.cache + 311492 2 java/nio/charset/CharsetDecoder.reset + 311492 2 java/nio/charset/CharsetEncoder.isLegalReplacement + 311492 2 java/nio/charset/CharsetEncoder.onMalformedInput + 311492 2 java/nio/charset/CharsetEncoder.onUnmappableCharacter + 311492 2 java/nio/charset/CharsetEncoder.replaceWith + 311492 2 java/nio/charset/CoderResult. + 311492 2 java/nio/charset/CoderResult.isError + 311492 2 java/security/AccessControlContext. + 311492 2 java/security/BasicPermission.getCanonicalName + 311492 2 java/security/CodeSource.getCertificates + 311492 2 java/security/CodeSource.hashCode + 311492 2 java/security/PermissionCollection.setReadOnly + 311492 2 java/security/Permissions. + 311492 2 java/security/Permissions.add + 311492 2 java/security/Permissions.getPermissionCollection + 311492 2 java/security/SecureClassLoader. + 311492 2 java/util/AbstractList.iterator + 311492 2 java/util/BitSet.ensureCapacity + 311492 2 java/util/Collections$EmptyList. + 311492 2 java/util/Collections$EmptyMap. + 311492 2 java/util/Collections$EmptySet. + 311492 2 java/util/Collections$ReverseComparator. + 311492 2 java/util/HashMap$KeySet. + 311492 2 java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 311492 2 java/util/IdentityHashMap$KeySet. + 311492 2 java/util/IdentityHashMap$KeySet.iterator + 311492 2 java/util/LinkedHashMap$KeyIterator. + 311492 2 java/util/LinkedHashMap$LinkedHashIterator. + 311492 2 java/util/Properties. + 311492 2 java/util/StringTokenizer.setMaxDelimCodePoint + 311492 2 java/util/concurrent/ConcurrentHashMap. + 311492 2 java/util/jar/JarFile. + 311492 2 java/util/zip/Inflater.inflate + 311492 2 java/util/zip/Inflater.inflateBytes + 311492 2 java/util/zip/ZipEntry. + 311492 2 java/util/zip/ZipFile$ZipFileInputStream.close + 311492 2 java/util/zip/ZipFile.freeEntry + 311492 2 java/util/zip/ZipFile.getInputStream + 311492 2 java/util/zip/ZipFile.getSize + 311492 2 sun/misc/FileURLMapper.getPath + 311492 2 sun/misc/Launcher$Factory. + 311492 2 sun/misc/Launcher$Factory.createURLStreamHandler + 311492 2 sun/misc/Launcher.access$100 + 311492 2 sun/misc/MetaIndex.registerDirectory + 311492 2 sun/misc/NativeSignalHandler. + 311492 2 sun/misc/Resource.cachedInputStream + 311492 2 sun/misc/URLClassPath. + 311492 2 sun/misc/URLClassPath.getResource + 311492 2 sun/misc/URLClassPath.push + 311492 2 sun/misc/VM.maxDirectMemory + 311492 2 sun/misc/Version.init + 311492 2 sun/net/www/protocol/file/Handler.openConnection + 311492 2 sun/net/www/protocol/file/Handler.parseURL + 311492 2 sun/net/www/protocol/jar/Handler. + 311492 2 sun/nio/cs/FastCharsetProvider.charsetForName + 311492 2 sun/nio/cs/FastCharsetProvider.lookup + 311492 2 sun/nio/cs/FastCharsetProvider.toLower + 311492 2 sun/nio/cs/StandardCharsets$Aliases. + 311492 2 sun/nio/cs/StandardCharsets$Cache. + 311492 2 sun/nio/cs/StandardCharsets$Classes. + 311492 2 sun/nio/cs/StreamDecoder. + 311492 2 sun/nio/cs/StreamDecoder.ensureOpen + 311492 2 sun/nio/cs/StreamDecoder.implRead + 311492 2 sun/nio/cs/StreamDecoder.read + 311492 2 sun/nio/cs/StreamDecoder.readBytes + 311492 2 sun/nio/cs/StreamEncoder.forOutputStreamWriter + 311492 2 sun/nio/cs/Surrogate$Parser. + 311492 2 sun/nio/cs/US_ASCII.newEncoder + 311492 2 sun/reflect/DelegatingConstructorAccessorImpl. + 311492 2 sun/reflect/DelegatingConstructorAccessorImpl.setDelegate + 311492 2 sun/reflect/NativeConstructorAccessorImpl. + 311492 2 sun/reflect/NativeConstructorAccessorImpl.setParent + 311492 2 sun/reflect/Reflection.ensureMemberAccess + 311492 2 sun/reflect/Reflection.isSubclassOf + 311492 2 sun/reflect/Reflection.verifyMemberAccess + 311492 2 sun/reflect/ReflectionFactory.checkInitted + 311492 2 sun/reflect/ReflectionFactory.copyConstructor + 311492 2 sun/reflect/ReflectionFactory.newConstructorAccessor + 311492 2 sun/reflect/misc/ReflectUtil.checkPackageAccess + 311492 2 sun/security/provider/PolicyFile.canonPath + 311492 2 sun/util/PreHashedMap.put + 311492 3 java/io/BufferedWriter.newLine + 311492 3 java/io/FileInputStream. + 311492 3 java/io/FileInputStream.read + 311492 3 java/io/FileInputStream.readBytes + 311492 3 java/io/FilterInputStream. + 311492 3 java/io/PrintStream.newLine + 311492 3 java/io/PrintStream.print + 311492 3 java/io/PrintStream.println + 311492 3 java/io/Reader. + 311492 3 java/lang/Boolean. + 311492 3 java/lang/Class$3. + 311492 3 java/lang/Class$3.run + 311492 3 java/lang/Class.forName + 311492 3 java/lang/Class.forName0 + 311492 3 java/lang/Class.newInstance + 311492 3 java/lang/Class.newInstance0 + 311492 3 java/lang/Exception. + 311492 3 java/lang/Integer. + 311492 3 java/lang/Object.wait + 311492 3 java/lang/RuntimePermission. + 311492 3 java/lang/Shutdown.add + 311492 3 java/lang/Thread.sleep + 311492 3 java/lang/ThreadLocal. + 311492 3 java/lang/ThreadLocal.getMap + 311492 3 java/lang/ThreadLocal.nextHashCode + 311492 3 java/lang/ref/WeakReference. + 311492 3 java/lang/reflect/Constructor.newInstance + 311492 3 java/net/URLStreamHandler. + 311492 3 java/nio/ByteBuffer.allocate + 311492 3 java/nio/charset/Charset.defaultCharset + 311492 3 java/nio/charset/Charset.lookup2 + 311492 3 java/nio/charset/CharsetDecoder.maxCharsPerByte + 311492 3 java/nio/charset/CodingErrorAction. + 311492 3 java/util/AbstractList$Itr.checkForComodification + 311492 3 java/util/AbstractList$Itr.next + 311492 3 java/util/ArrayList.clear + 311492 3 java/util/HashSet. + 311492 3 java/util/Hashtable.rehash + 311492 3 java/util/LinkedHashMap. + 311492 3 java/util/LinkedHashMap.init + 311492 3 java/util/Stack. + 311492 3 java/util/StringTokenizer.nextToken + 311492 3 java/util/concurrent/atomic/AtomicInteger.compareAndSet + 311492 3 java/util/concurrent/atomic/AtomicInteger.getAndAdd + 311492 3 java/util/jar/JarFile.getEntry + 311492 3 java/util/jar/JarFile.getJarEntry + 311492 3 java/util/zip/ZipFile.access$300 + 311492 3 sun/misc/Signal. + 311492 3 sun/misc/Signal.findSignal + 311492 3 sun/misc/Signal.handle + 311492 3 sun/misc/Signal.handle0 + 311492 3 sun/misc/URLClassPath$JarLoader.ensureOpen + 311492 3 sun/reflect/DelegatingConstructorAccessorImpl.newInstance + 311492 3 sun/reflect/NativeConstructorAccessorImpl.newInstance + 311492 3 sun/reflect/NativeConstructorAccessorImpl.newInstance0 + 311492 3 sun/reflect/Reflection.getClassAccessFlags + 311492 3 sun/reflect/Reflection.quickCheckMemberAccess + 311492 3 sun/reflect/ReflectionFactory.inflationThreshold + 311492 3 sun/util/PreHashedMap. + 311492 4 java/io/BufferedWriter. + 311492 4 java/io/ExpiringCache$Entry.timestamp + 311492 4 java/io/ExpiringCache. + 311492 4 java/io/File.compareTo + 311492 4 java/io/File.equals + 311492 4 java/io/FilePermission$1.run + 311492 4 java/io/FilterOutputStream. + 311492 4 java/io/PrintStream. + 311492 4 java/io/UnixFileSystem.compare + 311492 4 java/lang/Character.toUpperCase + 311492 4 java/lang/Class.getDeclaredFields0 + 311492 4 java/lang/Number. + 311492 4 java/lang/Shutdown$Lock. + 311492 4 java/lang/String.compareTo + 311492 4 java/lang/ThreadGroup.getParent + 311492 4 java/lang/Throwable. + 311492 4 java/lang/Throwable.fillInStackTrace + 311492 4 java/lang/ref/ReferenceQueue$Null. + 311492 4 java/lang/ref/ReferenceQueue. + 311492 4 java/lang/reflect/Array.newArray + 311492 4 java/lang/reflect/Array.newInstance + 311492 4 java/lang/reflect/Constructor.setConstructorAccessor + 311492 4 java/lang/reflect/Modifier.isPublic + 311492 4 java/nio/HeapByteBuffer.ix + 311492 4 java/nio/charset/Charset.forName + 311492 4 java/nio/charset/CharsetDecoder.onMalformedInput + 311492 4 java/nio/charset/CharsetDecoder.onUnmappableCharacter + 311492 4 java/nio/charset/CharsetDecoder.replaceWith + 311492 4 java/nio/charset/CharsetEncoder. + 311492 4 java/nio/charset/CoderResult$Cache. + 311492 4 java/security/BasicPermission. + 311492 4 java/security/BasicPermission.init + 311492 4 java/util/AbstractList$Itr. + 311492 4 java/util/ArrayList.toArray + 311492 4 java/util/Collections$SynchronizedMap.get + 311492 4 java/util/IdentityHashMap$IdentityHashMapIterator. + 311492 4 java/util/IdentityHashMap$KeyIterator. + 311492 4 java/util/LinkedHashMap$Entry.recordAccess + 311492 4 java/util/StringTokenizer. + 311492 4 java/util/zip/ZipFile.ensureOpen + 311492 4 sun/misc/MetaIndex. + 311492 4 sun/misc/MetaIndex.mayContain + 311492 4 sun/nio/cs/FastCharsetProvider.canonicalize + 311492 4 sun/nio/cs/StreamEncoder. + 311492 4 sun/nio/cs/US_ASCII$Encoder. + 311492 4 sun/nio/cs/US_ASCII.newDecoder + 311492 4 sun/reflect/ConstructorAccessorImpl. + 311492 4 sun/reflect/MagicAccessorImpl. + 311492 4 sun/reflect/Reflection.filterFields + 311492 4 sun/reflect/ReflectionFactory$GetReflectionFactoryAction. + 311492 4 sun/reflect/ReflectionFactory$GetReflectionFactoryAction.run + 311492 4 sun/reflect/ReflectionFactory.getReflectionFactory + 311492 4 sun/security/util/Debug.isOn + 311492 5 java/io/FileDescriptor. + 311492 5 java/lang/Class.getModifiers + 311492 5 java/lang/Class.getName0 + 311492 5 java/lang/String.valueOf + 311492 5 java/nio/ByteBuffer.wrap + 311492 5 java/nio/charset/Charset.isSupported + 311492 5 java/security/PermissionCollection. + 311492 5 java/util/AbstractList$Itr.hasNext + 311492 5 java/util/Hashtable.remove + 311492 5 java/util/StringTokenizer.scanToken + 311492 5 java/util/StringTokenizer.skipDelimiters + 311492 5 sun/misc/MetaIndex.forJar + 311492 5 sun/misc/URLClassPath$JarLoader. + 311492 5 sun/misc/URLClassPath$JarLoader.getClassPath + 311492 5 sun/misc/URLClassPath$JarLoader.getResource + 311492 5 sun/misc/Unsafe.getUnsafe + 311492 5 sun/util/PreHashedMap.toV + 311492 6 java/io/BufferedOutputStream.write + 311492 6 java/io/BufferedWriter.flushBuffer + 311492 6 java/io/BufferedWriter.min + 311492 6 java/io/BufferedWriter.write + 311492 6 java/io/File.getAbsolutePath + 311492 6 java/io/FileOutputStream.write + 311492 6 java/io/FileOutputStream.writeBytes + 311492 6 java/io/OutputStream. + 311492 6 java/io/OutputStreamWriter.flushBuffer + 311492 6 java/io/OutputStreamWriter.write + 311492 6 java/io/UnixFileSystem.canonicalize0 + 311492 6 java/io/Writer. + 311492 6 java/io/Writer.write + 311492 6 java/lang/Class.checkMemberAccess + 311492 6 java/lang/Class.getComponentType + 311492 6 java/lang/Class.getDeclaredField + 311492 6 java/lang/Class.getName + 311492 6 java/lang/Class.getSuperclass + 311492 6 java/lang/Class.privateGetDeclaredFields + 311492 6 java/lang/Class.searchFields + 311492 6 java/lang/ThreadGroup.add + 311492 6 java/lang/reflect/Field. + 311492 6 java/lang/reflect/Field.copy + 311492 6 java/lang/reflect/ReflectAccess.copyField + 311492 6 java/net/URL.getURLStreamHandler + 311492 6 java/net/URL.toExternalForm + 311492 6 java/net/URL.toString + 311492 6 java/net/URLStreamHandler.getDefaultPort + 311492 6 java/net/URLStreamHandler.getHostAddress + 311492 6 java/net/URLStreamHandler.hashCode + 311492 6 java/net/URLStreamHandler.toExternalForm + 311492 6 java/nio/Bits.byteOrder + 311492 6 java/nio/Buffer.clear + 311492 6 java/nio/ByteBuffer. + 311492 6 java/nio/HeapByteBuffer. + 311492 6 java/nio/charset/CharsetDecoder.decode + 311492 6 java/nio/charset/CharsetEncoder.encode + 311492 6 java/security/Permission. + 311492 6 java/util/AbstractSet. + 311492 6 java/util/HashMap.containsKey + 311492 6 java/util/Vector.add + 311492 6 java/util/concurrent/ConcurrentHashMap$Segment.rehash + 311492 6 sun/misc/Launcher.getFileURL + 311492 6 sun/misc/MetaIndex.getJarMap + 311492 6 sun/misc/URLClassPath$3. + 311492 6 sun/misc/URLClassPath$3.run + 311492 6 sun/misc/URLClassPath$JarLoader.isOptimizable + 311492 6 sun/misc/URLClassPath$Loader. + 311492 6 sun/misc/Unsafe.objectFieldOffset + 311492 6 sun/net/www/ParseUtil.fileToEncodedURL + 311492 6 sun/nio/cs/StreamEncoder.ensureOpen + 311492 6 sun/nio/cs/StreamEncoder.flushBuffer + 311492 6 sun/nio/cs/StreamEncoder.implFlushBuffer + 311492 6 sun/nio/cs/StreamEncoder.implWrite + 311492 6 sun/nio/cs/StreamEncoder.write + 311492 6 sun/nio/cs/StreamEncoder.writeBytes + 311492 6 sun/nio/cs/US_ASCII$Decoder.decodeArrayLoop + 311492 6 sun/nio/cs/US_ASCII$Decoder.decodeLoop + 311492 6 sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 311492 6 sun/nio/cs/US_ASCII$Encoder.encodeLoop + 311492 6 sun/reflect/ReflectionFactory.copyField + 311492 7 java/io/File.getCanonicalFile + 311492 7 java/io/InputStream. + 311492 7 java/lang/ClassLoader.checkPackageAccess + 311492 7 java/lang/ref/SoftReference. + 311492 7 java/util/Dictionary. + 311492 7 java/util/HashSet.add + 311492 7 java/util/Stack.empty + 311492 7 java/util/Stack.pop + 311492 7 java/util/Stack.push + 311492 7 java/util/Vector.removeElementAt + 311492 7 java/util/zip/ZipFile.getEntry + 311492 7 sun/util/PreHashedMap.get + 311492 8 java/lang/Class.checkInitted + 311492 8 java/lang/Class.clearCachesOnClassRedefinition + 311492 8 java/lang/Class.getPrimitiveClass + 311492 8 java/lang/Class.getReflectionFactory + 311492 8 java/lang/Object.getClass + 311492 8 java/lang/System.setProperty + 311492 8 java/lang/Thread. + 311492 8 java/lang/Thread.getContextClassLoader + 311492 8 java/lang/Thread.init + 311492 8 java/lang/Thread.nextThreadID + 311492 8 java/lang/ThreadGroup.addUnstarted + 311492 8 java/lang/ref/FinalReference. + 311492 8 java/lang/ref/Finalizer. + 311492 8 java/lang/ref/Finalizer.add + 311492 8 java/lang/ref/Finalizer.register + 311492 8 java/lang/ref/ReferenceQueue$Lock. + 311492 8 java/lang/reflect/AccessibleObject. + 311492 8 java/nio/charset/CharsetDecoder. + 311492 8 java/security/AccessControlContext.optimize + 311492 8 java/security/AccessController.getInheritedAccessControlContext + 311492 8 java/util/Properties.setProperty + 311492 8 java/util/Stack.peek + 311492 8 sun/nio/cs/US_ASCII$Decoder. + 311492 8 sun/reflect/ReflectionFactory.langReflectAccess + 311492 8 sun/security/util/Debug.getInstance + 311492 9 java/io/BufferedOutputStream.flush + 311492 9 java/io/BufferedOutputStream.flushBuffer + 311492 9 java/io/File.hashCode + 311492 9 java/io/File.isDirectory + 311492 9 java/io/PrintStream.write + 311492 9 java/io/UnixFileSystem.hashCode + 311492 9 java/lang/ClassLoader.findBootstrapClass + 311492 9 java/lang/ClassLoader.findBootstrapClass0 + 311492 9 java/lang/ClassLoader.getCallerClassLoader + 311492 9 java/lang/ClassLoader.loadClassInternal + 311492 9 java/lang/StringBuffer. + 311492 9 java/lang/StringBuffer.toString + 311492 9 java/nio/Buffer.flip + 311492 9 java/util/ArrayList.RangeCheck + 311492 9 java/util/ArrayList.get + 311492 9 sun/misc/Launcher$AppClassLoader.loadClass + 311492 9 sun/net/www/ParseUtil.decode + 311492 9 sun/net/www/ParseUtil.lowMask + 311492 10 java/io/File.getCanonicalPath + 311492 10 java/io/ObjectStreamClass.getClassSignature + 311492 10 java/io/UnixFileSystem.canonicalize + 311492 10 java/lang/Class.isPrimitive + 311492 10 java/lang/Thread.setPriority + 311492 10 java/lang/Thread.setPriority0 + 311492 10 java/nio/CharBuffer.wrap + 311492 10 java/nio/charset/Charset.lookup + 311492 10 java/security/AccessController.getContext + 311492 10 java/security/AccessController.getStackAccessControlContext + 311492 10 java/util/Vector.addElement + 311492 11 java/lang/String.replace + 311492 11 java/lang/ThreadGroup.checkAccess + 311492 11 java/net/Parts. + 311492 11 java/nio/CharBuffer. + 311492 11 java/nio/HeapCharBuffer. + 311492 12 java/io/BufferedWriter.ensureOpen + 311492 12 java/io/ExpiringCache$1.removeEldestEntry + 311492 12 java/io/ExpiringCache$Entry. + 311492 12 java/io/ExpiringCache.put + 311492 12 java/io/File.exists + 311492 12 java/io/PrintStream.ensureOpen + 311492 12 java/lang/Class.isArray + 311492 12 java/lang/Thread.checkAccess + 311492 12 java/nio/ByteBuffer.hasArray + 311492 12 java/nio/CharBuffer.array + 311492 12 java/nio/CharBuffer.hasArray + 311492 12 java/nio/charset/CoderResult.isOverflow + 311492 12 java/util/HashMap.get + 311492 12 java/util/LinkedHashMap$Entry.access$600 + 311492 12 java/util/LinkedHashMap$Entry.addBefore + 311492 12 java/util/LinkedHashMap.addEntry + 311492 12 java/util/LinkedHashMap.createEntry + 311492 12 sun/net/www/ParseUtil.highMask + 311492 13 java/io/UnixFileSystem.parentOrNull + 311492 13 java/nio/Buffer.hasRemaining + 311492 13 java/nio/Buffer.remaining + 311492 13 sun/misc/URLClassPath.getLoader + 311492 13 sun/net/www/ParseUtil.encodePath + 311492 14 java/lang/Float.isNaN + 311492 14 java/net/URL.hashCode + 311492 14 java/util/Hashtable. + 311492 15 java/lang/Object.hashCode + 311492 15 java/nio/charset/Charset.checkName + 311492 15 java/util/ArrayList. + 311492 15 java/util/HashMap.addEntry + 311492 15 java/util/LinkedHashMap$Entry. + 311492 16 java/io/UnixFileSystem.isAbsolute + 311492 16 java/lang/ClassLoader$NativeLibrary.find + 311492 16 java/lang/String.intern + 311492 16 java/util/Vector.ensureCapacityHelper + 311492 16 java/util/concurrent/ConcurrentHashMap$Segment. + 311492 16 java/util/concurrent/ConcurrentHashMap$Segment.setTable + 311492 16 java/util/concurrent/locks/AbstractOwnableSynchronizer. + 311492 16 java/util/concurrent/locks/AbstractQueuedSynchronizer. + 311492 16 java/util/concurrent/locks/ReentrantLock$NonfairSync. + 311492 16 java/util/concurrent/locks/ReentrantLock$Sync. + 311492 16 java/util/concurrent/locks/ReentrantLock. + 311492 16 sun/reflect/Reflection.getCallerClass + 311492 17 java/lang/ClassLoader.findNative + 311492 17 java/lang/Math.max + 311492 17 java/lang/String.toCharArray + 311492 17 java/nio/Buffer. + 311492 17 java/util/Locale.getDefault + 311492 17 sun/security/action/GetPropertyAction. + 311492 18 java/io/ExpiringCache.get + 311492 18 java/lang/Class.desiredAssertionStatus + 311492 18 java/lang/Class.desiredAssertionStatus0 + 311492 18 java/lang/ClassLoader.findLoadedClass + 311492 18 java/lang/ClassLoader.findLoadedClass0 + 311492 19 java/io/BufferedReader.ensureOpen + 311492 19 java/lang/System.currentTimeMillis + 311492 19 java/nio/Buffer.limit + 311492 19 java/util/Locale. + 311492 19 java/util/Locale.createSingleton + 311492 19 java/util/concurrent/ConcurrentHashMap$Segment.put + 311492 19 java/util/concurrent/ConcurrentHashMap.put + 311492 19 java/util/concurrent/locks/AbstractQueuedSynchronizer.compareAndSetState + 311492 19 java/util/concurrent/locks/AbstractQueuedSynchronizer.release + 311492 19 java/util/concurrent/locks/AbstractQueuedSynchronizer.setState + 311492 19 java/util/concurrent/locks/ReentrantLock$NonfairSync.lock + 311492 19 java/util/concurrent/locks/ReentrantLock$Sync.tryRelease + 311492 19 java/util/concurrent/locks/ReentrantLock.lock + 311492 19 java/util/concurrent/locks/ReentrantLock.unlock + 311492 20 java/io/ObjectStreamField. + 311492 20 java/nio/ByteBuffer.array + 311492 20 java/util/AbstractList. + 311492 20 java/util/BitSet.get + 311492 20 java/util/concurrent/ConcurrentHashMap.hash + 311492 20 java/util/concurrent/ConcurrentHashMap.segmentFor + 311492 20 sun/misc/VM.isBooted + 311492 21 java/io/File.getName + 311492 21 java/io/UnixFileSystem.getBooleanAttributes + 311492 21 java/io/UnixFileSystem.getBooleanAttributes0 + 311492 21 java/lang/StringBuffer.append + 311492 21 java/nio/charset/Charset.atBugLevel + 311492 22 java/util/concurrent/ConcurrentHashMap$HashEntry.newArray + 311492 22 sun/misc/Unsafe.compareAndSwapInt + 311492 23 java/util/HashMap. + 311492 23 java/util/concurrent/ConcurrentHashMap$HashEntry. + 311492 24 java/nio/charset/CoderResult.isUnderflow + 311492 24 java/util/AbstractMap. + 311492 24 java/util/Vector.elementAt + 311492 25 java/lang/Class.getClassLoader + 311492 26 java/util/AbstractCollection. + 311492 26 java/util/ArrayList.add + 311492 26 java/util/ArrayList.ensureCapacity + 311492 27 java/lang/ClassLoader.loadClass + 311492 27 java/net/URL. + 311492 28 java/lang/ClassLoader.check + 311492 28 java/lang/ClassLoader.checkName + 311492 28 java/lang/ref/Reference. + 311492 29 java/lang/String.endsWith + 311492 29 sun/misc/VM.allowArraySyntax + 311492 30 java/io/ExpiringCache.entryFor + 311492 30 java/io/UnixFileSystem.resolve + 311492 30 java/util/HashMap$Entry. + 311492 30 java/util/LinkedHashMap.get + 311492 33 java/util/HashMap.put + 311492 33 java/util/Vector. + 311492 34 java/io/UnixFileSystem.normalize + 311492 34 java/lang/Class.getClassLoader0 + 311492 34 java/lang/String.toLowerCase + 311492 34 sun/security/action/GetPropertyAction.run + 311492 36 java/nio/CharBuffer.arrayOffset + 311492 36 java/util/HashMap.getEntry + 311492 37 java/io/File. + 311492 37 java/io/UnixFileSystem.prefixLength + 311492 38 java/io/BufferedReader.readLine + 311492 38 java/util/concurrent/locks/AbstractOwnableSynchronizer.setExclusiveOwnerThread + 311492 41 java/lang/CharacterDataLatin1.toLowerCase + 311492 43 java/lang/CharacterDataLatin1.getProperties + 311492 43 java/security/AccessController.doPrivileged + 311492 43 java/util/Vector.size + 311492 44 java/nio/Buffer.position + 311492 44 java/nio/ByteBuffer.arrayOffset + 311492 48 java/lang/System.getProperty + 311492 50 java/util/Properties.getProperty + 311492 51 java/util/BitSet.expandTo + 311492 51 java/util/BitSet.set + 311492 56 java/lang/System.checkKey + 311492 57 java/lang/Thread.currentThread + 311492 57 java/util/Hashtable$Entry. + 311492 59 java/util/Hashtable.get + 311492 63 java/util/Hashtable.put + 311492 71 java/util/BitSet.checkInvariants + 311492 72 java/util/BitSet.wordIndex + 311492 73 java/lang/StringBuilder. + 311492 73 java/lang/StringBuilder.toString + 311492 81 java/lang/AbstractStringBuilder.expandCapacity + 311492 81 java/util/HashMap.hash + 311492 81 java/util/HashMap.indexFor + 311492 82 java/lang/AbstractStringBuilder. + 311492 82 java/lang/Character.toLowerCase + 311492 83 java/lang/String.startsWith + 311492 87 java/util/Arrays.copyOf + 311492 90 java/lang/String.lastIndexOf + 311492 94 java/lang/String.substring + 311492 107 java/util/Arrays.copyOfRange + 311492 156 java/lang/String.getChars + 311492 174 java/lang/System.getSecurityManager + 311492 175 java/lang/String. + 311492 202 java/lang/String.equals + 311492 208 java/lang/Math.min + 311492 213 java/lang/String.hashCode + 311492 302 java/lang/String.indexOf + 311492 360 java/lang/System.arraycopy + 311492 533 java/lang/StringBuilder.append + 311492 549 java/lang/AbstractStringBuilder.append + 311492 823 java/lang/Object. + 311492 1960 java/lang/String.charAt + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_objnew_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_objnew_example.txt new file mode 100644 index 00000000000..433c38fcd88 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_objnew_example.txt @@ -0,0 +1,1460 @@ +The following are examples of j_objnew.d. + +This traces activity of object allocation by Java. It will print a histogram +of the byte size of allocation of different type, followed by a count of each +type of allocation. + +Here you can see it running on Code/Java/Func_abc + +# j_objnew.d +Tracing... Hit Ctrl-C to end. +^C + +Java object allocation byte distributions by pid and class, + + 311496 java/io/Console$1 + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/io/DeleteOnExitHook + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/io/File$1 + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/lang/ApplicationShutdownHooks + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/lang/Compiler$1 + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/lang/Runtime + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/lang/String$CaseInsensitiveComparator + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/lang/System$2 + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/lang/Terminator$1 + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/lang/ref/Reference$Lock + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/lang/reflect/ReflectAccess + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/net/URLClassLoader$7 + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/net/UnknownContentHandler + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/util/Collections$EmptySet + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/util/Collections$ReverseComparator + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/util/Hashtable$EmptyEnumerator + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/util/Hashtable$EmptyIterator + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 java/util/jar/JavaUtilJarAccessImpl + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 sun/misc/Launcher$Factory + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 sun/misc/Unsafe + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 sun/net/www/protocol/file/Handler + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 sun/reflect/ReflectionFactory + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 sun/reflect/ReflectionFactory$1 + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + 311496 [Ljava/lang/StackTraceElement; + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 [Ljava/security/Principal; + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 [Ljava/security/cert/Certificate; + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/io/Console$1$1 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/io/FilePermissionCollection + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/io/FileReader + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/io/UnixFileSystem + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/lang/ArithmeticException + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/lang/ClassLoader$3 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/lang/NoSuchMethodError + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/lang/NullPointerException + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/lang/Shutdown$Lock + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 16 | 0 + + 311496 java/lang/StringCoding$StringDecoder + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/lang/SystemClassLoaderAction + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/lang/ThreadLocal$ThreadLocalMap + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/lang/VirtualMachineError + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/lang/reflect/ReflectPermission + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/nio/charset/CoderResult$1 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/nio/charset/CoderResult$2 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/security/BasicPermissionCollection + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/security/Policy$UnsupportedEmptyCollection + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/util/BitSet + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/util/Collections$EmptyList + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/util/Collections$EmptyMap + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/util/HashMap$KeySet + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/util/IdentityHashMap$KeySet + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/util/LinkedHashSet + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/util/concurrent/atomic/AtomicInteger + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 sun/misc/FileURLMapper + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 sun/misc/Launcher + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 sun/misc/Launcher$AppClassLoader$1 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 sun/misc/Launcher$ExtClassLoader$1 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 sun/misc/URLClassPath$FileLoader + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 sun/misc/URLClassPath$JarLoader$1 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 sun/net/www/MessageHeader + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 sun/net/www/protocol/jar/Handler + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 16 | 0 + + 311496 sun/nio/cs/StandardCharsets + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 sun/nio/cs/US_ASCII + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + 311496 java/lang/Class$3 + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 16 | 0 + + 311496 [J + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 [Ljava/io/File; + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 [Ljava/lang/OutOfMemoryError; + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 [Ljava/lang/ThreadGroup; + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 [Ljava/lang/reflect/Constructor; + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/io/BufferedInputStream + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/io/BufferedOutputStream + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/io/BufferedReader + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/io/DataInputStream + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/io/FileOutputStream + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/io/FilePermission$1 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/io/OutputStreamWriter + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/lang/Class$1 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/lang/ClassLoader$NativeLibrary + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/lang/ThreadLocal$ThreadLocalMap$Entry + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/lang/ref/ReferenceQueue + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/lang/ref/ReferenceQueue$Lock + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 16 | 0 + + 311496 java/lang/ref/ReferenceQueue$Null + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/lang/ref/WeakReference + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/net/URLClassLoader$1 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/nio/ByteOrder + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/nio/charset/CoderResult + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/security/CodeSource + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/security/Permissions + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/security/PrivilegedActionException + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/security/ProtectionDomain + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/util/AbstractList$Itr + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/util/Collections$SynchronizedMap + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/util/HashSet + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 java/util/IdentityHashMap + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/util/LinkedHashMap + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/util/LinkedHashMap$KeyIterator + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/util/Properties + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/util/concurrent/ConcurrentHashMap + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/util/jar/JarFile + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/util/zip/Inflater + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/util/zip/ZipFile$1 + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/util/zip/ZipFile$ZipFileInputStream + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 sun/misc/NativeSignalHandler + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 sun/misc/SoftCache + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 sun/misc/URLClassPath$FileLoader$1 + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 sun/nio/cs/StandardCharsets$Aliases + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 sun/nio/cs/StandardCharsets$Cache + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 sun/nio/cs/StandardCharsets$Classes + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 sun/nio/cs/StreamDecoder + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 sun/nio/cs/Surrogate$Parser + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 sun/reflect/DelegatingConstructorAccessorImpl + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 sun/reflect/NativeConstructorAccessorImpl + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + 311496 sun/reflect/ReflectionFactory$GetReflectionFactoryAction + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 16 | 0 + + 311496 [Ljava/net/URL; + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@ 1 + 32 |@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + 311496 java/io/FileInputStream + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 32 | 0 + + 311496 java/lang/Boolean + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 32 | 0 + + 311496 java/lang/Integer + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 32 | 0 + + 311496 java/lang/RuntimePermission + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 32 | 0 + + 311496 java/lang/ThreadLocal + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 32 | 0 + + 311496 java/nio/charset/CodingErrorAction + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 32 | 0 + + 311496 java/util/Stack + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 32 | 0 + + 311496 sun/misc/Signal + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 32 | 0 + + 311496 [Ljava/lang/Thread; + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 [Ljava/lang/ThreadLocal$ThreadLocalMap$Entry; + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + 311496 [Ljava/lang/annotation/Annotation; + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 32 | 0 + + 311496 [Ljava/util/concurrent/ConcurrentHashMap$Segment; + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + 311496 java/io/BufferedWriter + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 java/io/ExpiringCache + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 java/io/ExpiringCache$1 + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 java/io/FilePermission + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 java/io/PrintStream + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 java/lang/ClassNotFoundException + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 java/lang/ThreadGroup + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 java/lang/ref/Finalizer$FinalizerThread + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + 311496 java/lang/ref/Reference$ReferenceHandler + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + 311496 java/lang/reflect/Method + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + 311496 java/util/IdentityHashMap$KeyIterator + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 java/util/StringTokenizer + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 java/util/jar/JarFile$JarFileEntry + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + 311496 java/util/zip/ZipEntry + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + 311496 sun/misc/Launcher$AppClassLoader + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + 311496 sun/misc/Launcher$ExtClassLoader + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + 311496 sun/misc/MetaIndex + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 32 | 0 + + 311496 sun/misc/URLClassPath + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 sun/net/www/protocol/file/FileURLConnection + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + 311496 sun/nio/cs/StreamEncoder + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 sun/nio/cs/US_ASCII$Encoder + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + 311496 java/io/FileDescriptor + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 32 | 0 + + 311496 sun/misc/URLClassPath$3 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 32 | 0 + + 311496 [Ljava/io/ObjectStreamField; + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8 + 32 | 0 + + 311496 [Ljava/lang/reflect/Field; + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 64 | 0 + + 311496 java/lang/Object + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16 + 16 | 0 + + 311496 java/lang/OutOfMemoryError + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8 + 32 | 0 + + 311496 java/util/ArrayList + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8 + 32 | 0 + + 311496 java/util/Vector + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8 + 32 | 0 + + 311496 sun/nio/cs/US_ASCII$Decoder + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 64 | 0 + + 311496 java/lang/StringBuffer + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9 + 32 | 0 + + 311496 java/security/AccessControlContext + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 32 | 0 + + 311496 sun/misc/URLClassPath$JarLoader + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 64 | 0 + + 311496 java/net/Parts + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 11 + 32 | 0 + + 311496 [Ljava/lang/Class; + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 12 + 32 | 0 + + 311496 java/io/ExpiringCache$Entry + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 12 + 32 | 0 + + 311496 java/nio/HeapByteBuffer + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 64 | 0 + + 311496 java/util/Hashtable + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 64 | 0 + + 311496 java/lang/ref/SoftReference + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7 + 64 | 0 + + 311496 java/util/HashMap$Entry + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 15 + 32 | 0 + + 311496 java/lang/ref/Finalizer + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8 + 64 | 0 + + 311496 java/lang/reflect/Constructor + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 128 | 0 + + 311496 java/util/concurrent/locks/ReentrantLock$NonfairSync + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16 + 32 | 0 + + 311496 sun/security/action/GetPropertyAction + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 17 + 32 | 0 + + 311496 java/io/ObjectStreamField + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 64 | 0 + + 311496 java/nio/HeapCharBuffer + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 11 + 64 | 0 + + 311496 java/util/concurrent/ConcurrentHashMap$HashEntry + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 23 + 32 | 0 + + 311496 java/lang/Thread + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 128 | 0 + + 311496 java/net/URL + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 13 + 64 | 0 + + 311496 java/util/HashMap + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 + 64 | 0 + + 311496 java/util/LinkedHashMap$Entry + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 15 + 64 | 0 + + 311496 [Ljava/util/concurrent/ConcurrentHashMap$HashEntry; + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16 + 32 |@@@@@@@ 4 + 64 |@@@@ 2 + 128 | 0 + + 311496 java/util/concurrent/ConcurrentHashMap$Segment + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16 + 64 | 0 + + 311496 java/io/File + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 37 + 32 | 0 + + 311496 java/util/Locale + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 19 + 64 | 0 + + 311496 [Ljava/util/Hashtable$Entry; + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7 + 64 |@@@@ 1 + 128 |@@@@ 1 + 256 |@@@@ 1 + 512 | 0 + + 311496 java/util/Hashtable$Entry + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 57 + 32 | 0 + + 311496 [Ljava/util/HashMap$Entry; + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 17 + 128 | 0 + + 311496 java/lang/StringBuilder + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 73 + 32 | 0 + + 311496 [Ljava/lang/String; + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@ 26 + 32 |@@@@@@@@@@@@@@@ 22 + 64 |@@@@@@ 9 + 128 | 0 + + 311496 java/lang/reflect/Field + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 37 + 128 | 0 + + 311496 [Ljava/lang/Object; + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 296 + 32 |@@ 18 + 64 | 0 + 128 |@ 10 + 256 | 1 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 1 + 8192 | 0 + + 311496 java/lang/String + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 931 + 32 | 0 + + 311496 [S + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@ 161 + 32 |@@@@@@@@@@@@@@@@ 189 + 64 |@@@@@@@ 82 + 128 |@@@ 38 + 256 |@ 12 + 512 | 4 + 1024 | 0 + + 311496 [[I + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@ 270 + 32 |@@@@@@@@@@ 129 + 64 |@@@@@@ 85 + 128 |@@@ 34 + 256 |@@ 22 + 512 | 1 + 1024 | 0 + + 311496 java/lang/Class + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 395 + 128 | 0 + + 311496 [I + value ------------- Distribution ------------- count + 8 | 0 + 16 | 3 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 276 + 64 |@@@@@@@@@ 87 + 128 | 3 + 256 | 1 + 512 | 1 + 1024 | 1 + 2048 | 0 + 4096 | 1 + 8192 | 0 + 16384 | 1 + 32768 | 0 + + 311496 [B + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@ 87 + 32 |@@@@@@@@@@ 100 + 64 |@@@@@@@@ 83 + 128 |@@@@@@@ 71 + 256 |@@@@@ 47 + 512 |@ 14 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 | 4 + 16384 | 0 + + 311496 [C + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@ 271 + 32 |@@@@@@@@@@@@@@@@@@@@@ 573 + 64 |@@@@@@ 150 + 128 |@@@ 68 + 256 | 8 + 512 | 1 + 1024 | 2 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 | 3 + 32768 | 0 + +Java object allocation count by pid and class, + + PID OBJS CLASS + 311496 1 [J + 311496 1 [Ljava/lang/OutOfMemoryError; + 311496 1 [Ljava/lang/StackTraceElement; + 311496 1 [Ljava/lang/ThreadGroup; + 311496 1 [Ljava/lang/ThreadLocal$ThreadLocalMap$Entry; + 311496 1 [Ljava/security/Principal; + 311496 1 [Ljava/security/cert/Certificate; + 311496 1 [Ljava/util/concurrent/ConcurrentHashMap$Segment; + 311496 1 java/io/BufferedInputStream + 311496 1 java/io/BufferedReader + 311496 1 java/io/Console$1 + 311496 1 java/io/Console$1$1 + 311496 1 java/io/DataInputStream + 311496 1 java/io/DeleteOnExitHook + 311496 1 java/io/File$1 + 311496 1 java/io/FilePermissionCollection + 311496 1 java/io/FileReader + 311496 1 java/io/UnixFileSystem + 311496 1 java/lang/ApplicationShutdownHooks + 311496 1 java/lang/ArithmeticException + 311496 1 java/lang/ClassLoader$3 + 311496 1 java/lang/ClassLoader$NativeLibrary + 311496 1 java/lang/Compiler$1 + 311496 1 java/lang/NoSuchMethodError + 311496 1 java/lang/NullPointerException + 311496 1 java/lang/Runtime + 311496 1 java/lang/String$CaseInsensitiveComparator + 311496 1 java/lang/StringCoding$StringDecoder + 311496 1 java/lang/System$2 + 311496 1 java/lang/SystemClassLoaderAction + 311496 1 java/lang/Terminator$1 + 311496 1 java/lang/ThreadLocal$ThreadLocalMap + 311496 1 java/lang/ThreadLocal$ThreadLocalMap$Entry + 311496 1 java/lang/VirtualMachineError + 311496 1 java/lang/ref/Finalizer$FinalizerThread + 311496 1 java/lang/ref/Reference$Lock + 311496 1 java/lang/ref/Reference$ReferenceHandler + 311496 1 java/lang/reflect/Method + 311496 1 java/lang/reflect/ReflectAccess + 311496 1 java/lang/reflect/ReflectPermission + 311496 1 java/net/URLClassLoader$7 + 311496 1 java/net/UnknownContentHandler + 311496 1 java/nio/charset/CoderResult$1 + 311496 1 java/nio/charset/CoderResult$2 + 311496 1 java/security/BasicPermissionCollection + 311496 1 java/security/CodeSource + 311496 1 java/security/Policy$UnsupportedEmptyCollection + 311496 1 java/security/PrivilegedActionException + 311496 1 java/security/ProtectionDomain + 311496 1 java/util/BitSet + 311496 1 java/util/Collections$EmptyList + 311496 1 java/util/Collections$EmptyMap + 311496 1 java/util/Collections$EmptySet + 311496 1 java/util/Collections$ReverseComparator + 311496 1 java/util/Collections$SynchronizedMap + 311496 1 java/util/HashMap$KeySet + 311496 1 java/util/Hashtable$EmptyEnumerator + 311496 1 java/util/Hashtable$EmptyIterator + 311496 1 java/util/IdentityHashMap + 311496 1 java/util/IdentityHashMap$KeySet + 311496 1 java/util/LinkedHashMap + 311496 1 java/util/LinkedHashMap$KeyIterator + 311496 1 java/util/LinkedHashSet + 311496 1 java/util/Properties + 311496 1 java/util/concurrent/ConcurrentHashMap + 311496 1 java/util/concurrent/atomic/AtomicInteger + 311496 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl + 311496 1 java/util/jar/JarFile + 311496 1 java/util/jar/JarFile$JarFileEntry + 311496 1 java/util/jar/JavaUtilJarAccessImpl + 311496 1 java/util/zip/Inflater + 311496 1 java/util/zip/ZipEntry + 311496 1 java/util/zip/ZipFile$1 + 311496 1 java/util/zip/ZipFile$ZipFileInputStream + 311496 1 sun/misc/FileURLMapper + 311496 1 sun/misc/Launcher + 311496 1 sun/misc/Launcher$AppClassLoader + 311496 1 sun/misc/Launcher$AppClassLoader$1 + 311496 1 sun/misc/Launcher$ExtClassLoader + 311496 1 sun/misc/Launcher$ExtClassLoader$1 + 311496 1 sun/misc/Launcher$Factory + 311496 1 sun/misc/SoftCache + 311496 1 sun/misc/URLClassPath$FileLoader + 311496 1 sun/misc/URLClassPath$FileLoader$1 + 311496 1 sun/misc/URLClassPath$JarLoader$1 + 311496 1 sun/misc/Unsafe + 311496 1 sun/net/www/MessageHeader + 311496 1 sun/net/www/protocol/file/FileURLConnection + 311496 1 sun/net/www/protocol/file/Handler + 311496 1 sun/nio/cs/StandardCharsets + 311496 1 sun/nio/cs/StandardCharsets$Aliases + 311496 1 sun/nio/cs/StandardCharsets$Cache + 311496 1 sun/nio/cs/StandardCharsets$Classes + 311496 1 sun/nio/cs/StreamDecoder + 311496 1 sun/nio/cs/US_ASCII + 311496 1 sun/reflect/ReflectionFactory + 311496 1 sun/reflect/ReflectionFactory$1 + 311496 2 [Ljava/io/File; + 311496 2 [Ljava/lang/Thread; + 311496 2 [Ljava/lang/reflect/Constructor; + 311496 2 [Ljava/net/URL; + 311496 2 java/io/BufferedOutputStream + 311496 2 java/io/BufferedWriter + 311496 2 java/io/ExpiringCache + 311496 2 java/io/ExpiringCache$1 + 311496 2 java/io/FileOutputStream + 311496 2 java/io/FilePermission + 311496 2 java/io/FilePermission$1 + 311496 2 java/io/OutputStreamWriter + 311496 2 java/io/PrintStream + 311496 2 java/lang/Class$1 + 311496 2 java/lang/ClassNotFoundException + 311496 2 java/lang/Shutdown$Lock + 311496 2 java/lang/ThreadGroup + 311496 2 java/lang/ref/ReferenceQueue + 311496 2 java/lang/ref/ReferenceQueue$Null + 311496 2 java/lang/ref/WeakReference + 311496 2 java/net/URLClassLoader$1 + 311496 2 java/nio/ByteOrder + 311496 2 java/nio/charset/CoderResult + 311496 2 java/security/Permissions + 311496 2 java/util/AbstractList$Itr + 311496 2 java/util/HashSet + 311496 2 java/util/IdentityHashMap$KeyIterator + 311496 2 java/util/StringTokenizer + 311496 2 sun/misc/NativeSignalHandler + 311496 2 sun/misc/URLClassPath + 311496 2 sun/net/www/protocol/jar/Handler + 311496 2 sun/nio/cs/StreamEncoder + 311496 2 sun/nio/cs/Surrogate$Parser + 311496 2 sun/nio/cs/US_ASCII$Encoder + 311496 2 sun/reflect/DelegatingConstructorAccessorImpl + 311496 2 sun/reflect/NativeConstructorAccessorImpl + 311496 3 java/io/FileInputStream + 311496 3 java/lang/Boolean + 311496 3 java/lang/Class$3 + 311496 3 java/lang/Integer + 311496 3 java/lang/RuntimePermission + 311496 3 java/lang/ThreadLocal + 311496 3 java/nio/charset/CodingErrorAction + 311496 3 java/util/Stack + 311496 3 sun/misc/Signal + 311496 4 [Ljava/lang/annotation/Annotation; + 311496 4 [Ljava/lang/reflect/Field; + 311496 4 java/lang/ref/ReferenceQueue$Lock + 311496 4 java/lang/reflect/Constructor + 311496 4 sun/misc/MetaIndex + 311496 4 sun/nio/cs/US_ASCII$Decoder + 311496 4 sun/reflect/ReflectionFactory$GetReflectionFactoryAction + 311496 5 java/io/FileDescriptor + 311496 5 sun/misc/URLClassPath$JarLoader + 311496 6 java/lang/Thread + 311496 6 java/nio/HeapByteBuffer + 311496 6 java/util/Hashtable + 311496 6 sun/misc/URLClassPath$3 + 311496 7 java/lang/ref/SoftReference + 311496 8 [Ljava/io/ObjectStreamField; + 311496 8 java/lang/OutOfMemoryError + 311496 8 java/lang/ref/Finalizer + 311496 8 java/util/ArrayList + 311496 8 java/util/Vector + 311496 9 java/lang/StringBuffer + 311496 10 [Ljava/util/Hashtable$Entry; + 311496 10 java/io/ObjectStreamField + 311496 10 java/security/AccessControlContext + 311496 11 java/net/Parts + 311496 11 java/nio/HeapCharBuffer + 311496 12 [Ljava/lang/Class; + 311496 12 java/io/ExpiringCache$Entry + 311496 13 java/net/URL + 311496 14 java/util/HashMap + 311496 15 java/util/HashMap$Entry + 311496 15 java/util/LinkedHashMap$Entry + 311496 16 java/lang/Object + 311496 16 java/util/concurrent/ConcurrentHashMap$Segment + 311496 16 java/util/concurrent/locks/ReentrantLock$NonfairSync + 311496 17 [Ljava/util/HashMap$Entry; + 311496 17 sun/security/action/GetPropertyAction + 311496 19 java/util/Locale + 311496 22 [Ljava/util/concurrent/ConcurrentHashMap$HashEntry; + 311496 23 java/util/concurrent/ConcurrentHashMap$HashEntry + 311496 37 java/io/File + 311496 37 java/lang/reflect/Field + 311496 57 [Ljava/lang/String; + 311496 57 java/util/Hashtable$Entry + 311496 73 java/lang/StringBuilder + 311496 326 [Ljava/lang/Object; + 311496 374 [I + 311496 395 java/lang/Class + 311496 406 [B + 311496 486 [S + 311496 541 [[I + 311496 931 java/lang/String + 311496 1076 [C + +In the first section - Java object allocation byte distributions by PID and +class, you can see in graphical form the range of sizes of each type of +object. For example: + + 311496 [C + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@ 271 + 32 |@@@@@@@@@@@@@@@@@@@@@ 573 + 64 |@@@@@@ 150 + 128 |@@@ 68 + 256 | 8 + 512 | 1 + 1024 | 2 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 | 3 + 32768 | 0 + +shows that there were 271 objects of type [C and size 16 bytes to 31 bytes +created. It is important to pay close attention to the third column, +"count" as this will indicate if there were any instances in a particular +size, even if the number is too small to show up on the histogram scale. + +In the second section - Java object allocation count by pid and class, you can +easily see that there were 395 objects of java/lang/Class created, and 931 +objects of java/lang/String. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_package_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_package_example.txt new file mode 100644 index 00000000000..0d4da29d9e9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_package_example.txt @@ -0,0 +1,44 @@ +The following are examples of j_package.d. + +This script will show you the number of times a class is loaded from +particular packages. + +Here you can see it running when Code/Java/Func_abc runs. + +# j_package.d +Tracing... Hit Ctrl-C to end. + + PID LOADS PACKAGE + 311500 1 . + 311500 1 java/lang/annotation + 311500 1 java/nio/charset/spi + 311500 1 java/security/cert + 311500 1 sun/net/www/protocol/jar + 311500 1 sun/nio + 311500 1 sun/reflect/misc + 311500 1 sun/security/action + 311500 1 sun/security/provider + 311500 1 sun/security/util + 311500 1 sun/util + 311500 2 sun/net/www/protocol/file + 311500 3 java/util/concurrent/atomic + 311500 3 sun/net/www + 311500 4 java/util/concurrent + 311500 4 java/util/jar + 311500 7 java/nio + 311500 7 java/util/concurrent/locks + 311500 7 java/util/zip + 311500 8 java/nio/charset + 311500 10 java/net + 311500 12 java/lang/ref + 311500 12 java/lang/reflect + 311500 13 sun/nio/cs + 311500 18 sun/reflect + 311500 19 java/security + 311500 34 sun/misc + 311500 38 java/io + 311500 46 java/util + 311500 69 java/lang + +You can see that 69 classes from the java/lang package were loaded during the +time this script was running. diff --git a/cddl/contrib/dtracetoolkit/Examples/j_profile_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_profile_example.txt new file mode 100644 index 00000000000..bb45c4b3f75 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_profile_example.txt @@ -0,0 +1,209 @@ +The following are examples of j_profile.d. + +This script samples on-CPU stack traces and prints them with Java +translations. With DTrace, as well as tracing events, you can also sample +them. Each approach has its own advantages and disadvantages and you are +encouraged to try both when investigating performance issues (especially +tracing). Sampling is inaccurate and can miss events, yet is a quick and +easy way to discover a certain set of performance issues involving on-CPU +load. + +This script samples at 101 Hertz, printing out the 25 most frequently seen +stack traces down to 10 lines deep. All of these values can be tweaked in +the script. + +Here we run the script on Code/Java/Func_loop. The argument fed to the script +is the PID of the Java program we wish to investigate. Here the raw output is +show, then again after filtering using c++filt. + +# j_profile.d -p 1312 +Sampling 10-level stacks at 101 Hertz... Hit Ctrl-C to end. +^C + +Top 25 most frequently sampled stacks, + + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3 + libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27 + libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f + libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 30 + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3 + libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27 + libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f + libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 31 + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3 + libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27 + libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f + libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 32 + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3 + libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27 + libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f + libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 33 + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3 + libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27 + libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f + libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 41 + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3 + libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27 + libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f + libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 72 + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3 + libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27 + libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f + libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 116 + + +The most frequent stacks had Func_loop.func_c() on CPU, with a stack trace +showing func_b() and func_a() - as expected from the source to Func_loop.java. + + +Now passing that output through c++filt to translate the compiled C++ symbols +of the JVM. + +# j_profile.d -p 1312 -o out.j_profile +# c++filt out.j_profile +Sampling 10-level stacks at 101 Hertz... Hit Ctrl-C to end. + +Top 25 most frequently sampled stacks, + + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3 + libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27 + libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f + libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 10 + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3 + libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27 + libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f + libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 13 + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3 + libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27 + libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f + libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 19 + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3 + libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27 + libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f + libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 21 + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3 + libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27 + libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f + libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 29 + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3 + libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27 + libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f + libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 53 + + Func_loop.func_c()V + Func_loop.func_b()V + Func_loop.func_a()V + Func_loop.main([Ljava/lang/String;)V + StubRoutines (1) + libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3 + libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27 + libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f + libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df + libjvm.so`jni_CallStaticVoidMethod+0x15d + 74 + + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_stat_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_stat_example.txt new file mode 100644 index 00000000000..6c7e12e99cf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_stat_example.txt @@ -0,0 +1,33 @@ +The following are examples of running j_stat.d. + +j_stat.d shows you the number of events per second that have happened since +the last line output. The default interval is 1 second, but you can specify +other intervals as arguments to the script. + +This shows the j_stat.d script reflecting the Code/Ruby/Func_abc script. + +# j_stat.d +TIME EXEC/s THREAD/s METHOD/s OBJNEW/s CLOAD/s EXCP/s GC/s +2007 Sep 24 04:00:34 0 0 0 0 0 0 0 +2007 Sep 24 04:00:35 2 6 11660 5306 318 41 0 +2007 Sep 24 04:00:36 0 0 124 4 0 2 0 +2007 Sep 24 04:00:37 0 0 124 4 0 2 0 +2007 Sep 24 04:00:38 0 0 123 75 9 1 0 +2007 Sep 24 04:00:39 0 0 0 0 0 0 0 +2007 Sep 24 04:00:40 0 0 0 0 0 0 0 +^C + +Here we can see that at 2007 Sep 24 04:00:35 there were 2 Java programs +executed, (this number will include those without Java provider support), +there were 6 threads created, 11,660 methods called, 5306 new objects created, +318 class loads, 41 exceptions raised and no garbage collects. + +The numbers are per second counts for the interval specified. The default +interval is 1 second. + +If you see a count in "EXECS" but not in the other columns, then your Java +software is probably not running with the DTrace hotspot provider. + +If you see counts in "CLOAD" but not in "METHODS", then you Java software +probably isn't running with "+ExtendedDTraceProbes". + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_syscalls_example.txt new file mode 100644 index 00000000000..911d4b0ec5c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_syscalls_example.txt @@ -0,0 +1,165 @@ +The following are examples of j_syscalls.d. + +This is a simple script to count executed Java methods and system calls. +Here it traces an example program, Code/Java/Func_abc. + +# j_syscalls.d -c 'java -XX:+ExtendedDTraceProbes Func_abc' +Tracing... Hit Ctrl-C to end. +Function A +Function B +Function C + PID TYPE NAME COUNT + 311536 method Func_abc.func_a 1 + 311536 method Func_abc.func_b 1 + 311536 method Func_abc.func_c 1 + 311536 method Func_abc.main 1 + 311536 method java/io/BufferedInputStream. 1 + 311536 method java/io/BufferedReader. 1 + 311536 method java/io/BufferedReader.close 1 + 311536 method java/io/BufferedWriter. 1 + 311536 method java/io/Console$1$1. 1 + 311536 method java/io/Console$1$1.run 1 + 311536 method java/io/Console$1. 1 + 311536 method java/io/Console$1.consoleRestoreHook 1 + 311536 method java/io/Console. 1 + 311536 method java/io/Console.access$600 1 + 311536 method java/io/DataInputStream. 1 + 311536 method java/io/DataInputStream.readFully 1 + 311536 method java/io/DeleteOnExitHook. 1 + 311536 method java/io/DeleteOnExitHook. 1 + 311536 method java/io/DeleteOnExitHook.hook 1 + 311536 method java/io/DeleteOnExitHook.run 1 +[... 900 lines truncated ...] + 311536 method java/io/ExpiringCache.get 18 + 311536 method java/lang/Class.desiredAssertionStatus 18 + 311536 method java/lang/Class.desiredAssertionStatus0 18 + 311536 method java/lang/ClassLoader.findLoadedClass 18 + 311536 method java/lang/ClassLoader.findLoadedClass0 18 + 311536 method java/io/BufferedReader.ensureOpen 19 + 311536 method java/lang/System.currentTimeMillis 19 + 311536 method java/nio/Buffer.limit 19 + 311536 method java/util/Locale. 19 + 311536 method java/util/Locale.createSingleton 19 + 311536 method java/util/concurrent/ConcurrentHashMap$Segment.put 19 + 311536 method java/util/concurrent/ConcurrentHashMap.put 19 + 311536 method java/util/concurrent/locks/AbstractQueuedSynchronizer.compareAndSetState 19 + 311536 method java/util/concurrent/locks/AbstractQueuedSynchronizer.release 19 + 311536 method java/util/concurrent/locks/AbstractQueuedSynchronizer.setState 19 + 311536 method java/util/concurrent/locks/ReentrantLock$NonfairSync.lock 19 + 311536 method java/util/concurrent/locks/ReentrantLock$Sync.tryRelease 19 + 311536 method java/util/concurrent/locks/ReentrantLock.lock 19 + 311536 method java/util/concurrent/locks/ReentrantLock.unlock 19 + 311536 method java/io/ObjectStreamField. 20 + 311536 method java/nio/ByteBuffer.array 20 + 311536 method java/util/AbstractList. 20 + 311536 method java/util/BitSet.get 20 + 311536 method java/util/concurrent/ConcurrentHashMap.hash 20 + 311536 method java/util/concurrent/ConcurrentHashMap.segmentFor 20 + 311536 method sun/misc/VM.isBooted 20 + 311536 syscall memcntl 20 + 311536 method java/io/File.getName 21 + 311536 method java/io/UnixFileSystem.getBooleanAttributes 21 + 311536 method java/io/UnixFileSystem.getBooleanAttributes0 21 + 311536 method java/lang/StringBuffer.append 21 + 311536 method java/nio/charset/Charset.atBugLevel 21 + 311536 method java/util/concurrent/ConcurrentHashMap$HashEntry.newArray 22 + 311536 method sun/misc/Unsafe.compareAndSwapInt 22 + 311536 method java/util/HashMap. 23 + 311536 method java/util/concurrent/ConcurrentHashMap$HashEntry. 23 + 311536 syscall stat64 23 + 311536 method java/nio/charset/CoderResult.isUnderflow 24 + 311536 method java/util/AbstractMap. 24 + 311536 method java/util/Vector.elementAt 24 + 311536 syscall munmap 24 + 311536 method java/lang/Class.getClassLoader 25 + 311536 syscall lwp_sigmask 25 + 311536 syscall sigaction 25 + 311536 method java/util/AbstractCollection. 26 + 311536 method java/util/ArrayList.add 26 + 311536 method java/util/ArrayList.ensureCapacity 26 + 311536 method java/lang/ClassLoader.loadClass 27 + 311536 method java/net/URL. 27 + 311536 method java/lang/ClassLoader.check 28 + 311536 method java/lang/ClassLoader.checkName 28 + 311536 method java/lang/ref/Reference. 28 + 311536 method java/lang/String.endsWith 29 + 311536 method sun/misc/VM.allowArraySyntax 29 + 311536 method java/io/ExpiringCache.entryFor 30 + 311536 method java/io/UnixFileSystem.resolve 30 + 311536 method java/util/HashMap$Entry. 30 + 311536 method java/util/LinkedHashMap.get 30 + 311536 syscall priocntlsys 30 + 311536 method java/util/HashMap.put 33 + 311536 method java/util/Vector. 33 + 311536 method java/io/UnixFileSystem.normalize 34 + 311536 method java/lang/Class.getClassLoader0 34 + 311536 method java/lang/String.toLowerCase 34 + 311536 method sun/security/action/GetPropertyAction.run 34 + 311536 method java/nio/CharBuffer.arrayOffset 36 + 311536 method java/util/HashMap.getEntry 36 + 311536 method java/io/File. 37 + 311536 method java/io/UnixFileSystem.prefixLength 37 + 311536 method java/io/BufferedReader.readLine 38 + 311536 method java/util/concurrent/locks/AbstractOwnableSynchronizer.setExclusiveOwnerThread 38 + 311536 syscall resolvepath 38 + 311536 method java/lang/CharacterDataLatin1.toLowerCase 41 + 311536 method java/lang/CharacterDataLatin1.getProperties 43 + 311536 method java/security/AccessController.doPrivileged 43 + 311536 method java/util/Vector.size 43 + 311536 method java/nio/Buffer.position 44 + 311536 method java/nio/ByteBuffer.arrayOffset 44 + 311536 method java/lang/System.getProperty 48 + 311536 method java/util/Properties.getProperty 50 + 311536 method java/util/BitSet.expandTo 51 + 311536 method java/util/BitSet.set 51 + 311536 syscall pollsys 55 + 311536 method java/lang/System.checkKey 56 + 311536 method java/lang/Thread.currentThread 57 + 311536 method java/util/Hashtable$Entry. 57 + 311536 method java/util/Hashtable.get 59 + 311536 method java/util/Hashtable.put 63 + 311536 method java/util/BitSet.checkInvariants 71 + 311536 method java/util/BitSet.wordIndex 72 + 311536 method java/lang/StringBuilder. 73 + 311536 method java/lang/StringBuilder.toString 73 + 311536 method java/lang/AbstractStringBuilder.expandCapacity 81 + 311536 method java/util/HashMap.hash 81 + 311536 method java/util/HashMap.indexFor 81 + 311536 method java/lang/AbstractStringBuilder. 82 + 311536 method java/lang/Character.toLowerCase 82 + 311536 method java/lang/String.startsWith 83 + 311536 method java/util/Arrays.copyOf 87 + 311536 method java/lang/String.lastIndexOf 90 + 311536 method java/lang/String.substring 94 + 311536 syscall brk 102 + 311536 syscall ioctl 103 + 311536 method java/util/Arrays.copyOfRange 107 + 311536 syscall mmap 127 + 311536 syscall open 129 + 311536 syscall close 133 + 311536 method java/lang/String.getChars 156 + 311536 method java/lang/System.getSecurityManager 174 + 311536 method java/lang/String. 175 + 311536 syscall xstat 188 + 311536 method java/lang/String.equals 202 + 311536 method java/lang/Math.min 208 + 311536 method java/lang/String.hashCode 213 + 311536 syscall lwp_exit 291 + 311536 method java/lang/String.indexOf 302 + 311536 method java/lang/System.arraycopy 360 + 311536 method java/lang/StringBuilder.append 545 + 311536 method java/lang/AbstractStringBuilder.append 561 + 311536 syscall llseek 664 + 311536 syscall read 668 + 311536 method java/lang/Object. 823 + 311536 method java/lang/String.charAt 1987 + +While tracing there were numerous system calls made, including 668 reads()'s, +and 664 llseek()'s. Many Java methods were also called, with 1987 +java/lang/String.charAt being the most of a particular kind. + +This script can provide an insight to how an application is interacting +with the system, by providing both application method calls and +system calls in the same output. + + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_syscolors_example.txt new file mode 100644 index 00000000000..3b130ee8883 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_syscolors_example.txt @@ -0,0 +1,1550 @@ +The following are examples of j_syscolors.d. + +This is a simple script to trace the method flow of Java methods within a +program, and the system calls made. It watches Java method entries and +returns, and indents child * method calls. It renders the output in color +("colour") using terminal escape sequences (which you can tweak by modifying +the script). + +Here it traces the example program, Code/Java/Func_abc. + +WARNING: This output is full of terminal escape sequences, so if you are +trying to view this through an editor or web browser - it may look awful. +Try viewing this using "more" (although, depending on your terminal, it +still may look awful). + +The fields in the output are, in order; CPU-id, Process ID/Thread ID, Elapsed +time from previous line to current line, Type of call (func/syscall) and name +of Java method or syscall. + +If the flow appears to jump, check the TID column - the JVM may have switched +to another thread. + +WARNING: Watch the first column carefully, it prints the CPU-id. If it changes, +then it is very likely that the output has been shuffled. Changes in TID will +appear to shuffle output, as we change from one thread depth to the next. See +Docs/Notes/ALLjavaflow.txt for additional notes. + +# j_syscolors.d -c 'java -XX:+ExtendedDTraceProbes Func_abc' +C PID/TID DELTA(us) TYPE -- NAME +0 311542/1 2 syscall -> munmap +0 311542/1 33 syscall <- munmap +0 311542/1 52 syscall -> mmap +0 311542/1 16 syscall <- mmap +0 311542/1 34 syscall -> setcontext +0 311542/1 7 syscall <- setcontext +0 311542/1 7 syscall -> getrlimit +0 311542/1 7 syscall <- getrlimit +0 311542/1 7 syscall -> getpid +0 311542/1 6 syscall <- getpid +0 311542/1 58 syscall -> setcontext +0 311542/1 6 syscall <- setcontext +0 311542/1 975 syscall -> sysi86 +0 311542/1 9 syscall <- sysi86 +0 311542/1 134 syscall -> brk +0 311542/1 8 syscall <- brk +0 311542/1 7 syscall -> brk +0 311542/1 10 syscall <- brk +0 311542/1 47 syscall -> sysconfig +0 311542/1 6 syscall <- sysconfig +0 311542/1 36 syscall -> resolvepath +0 311542/1 31 syscall <- resolvepath +0 311542/1 9 syscall -> resolvepath +0 311542/1 18 syscall <- resolvepath +0 311542/1 85 syscall -> access +0 311542/1 20 syscall <- access +0 311542/1 8 syscall -> access +0 311542/1 24 syscall <- access +0 311542/1 115 syscall -> open +0 311542/1 27 syscall <- open +0 311542/1 14 syscall -> fstat64 +0 311542/1 7 syscall <- fstat64 +0 311542/1 11 syscall -> fstat64 +0 311542/1 6 syscall <- fstat64 +0 311542/1 22 syscall -> ioctl +0 311542/1 7 syscall <- ioctl +0 311542/1 11 syscall -> read +0 311542/1 43 syscall <- read +0 311542/1 39 syscall -> read +0 311542/1 7 syscall <- read +0 311542/1 10 syscall -> llseek +0 311542/1 7 syscall <- llseek +0 311542/1 8 syscall -> close +0 311542/1 9 syscall <- close +0 311542/1 12 syscall -> sysconfig +0 311542/1 6 syscall <- sysconfig +0 311542/1 7 syscall -> sysconfig +0 311542/1 6 syscall <- sysconfig +0 311542/1 6 syscall -> sysconfig +0 311542/1 6 syscall <- sysconfig +0 311542/1 11 syscall -> xstat +0 311542/1 27 syscall <- xstat +0 311542/1 19 syscall -> exece +0 311542/1 684 syscall <- exece +0 311542/1 3320 syscall -> mmap +0 311542/1 22 syscall <- mmap +0 311542/1 26 syscall -> resolvepath +0 311542/1 52 syscall <- resolvepath +0 311542/1 8 syscall -> resolvepath +0 311542/1 25 syscall <- resolvepath +0 311542/1 7 syscall -> sysconfig +0 311542/1 6 syscall <- sysconfig +0 311542/1 9 syscall -> xstat +0 311542/1 18 syscall <- xstat +0 311542/1 7 syscall -> open +0 311542/1 18 syscall <- open +0 311542/1 7 syscall -> fxstat +0 311542/1 7 syscall <- fxstat +0 311542/1 6 syscall -> mmap +0 311542/1 11 syscall <- mmap +0 311542/1 7 syscall -> close +0 311542/1 10 syscall <- close +0 311542/1 42 syscall -> xstat +0 311542/1 27 syscall <- xstat +0 311542/1 8 syscall -> xstat +0 311542/1 19 syscall <- xstat +0 311542/1 7 syscall -> xstat +0 311542/1 25 syscall <- xstat +[... 31000 lines truncated ...] +0 311542/2 10 method <- java/util/HashSet.add +0 311542/2 10 method <- java/lang/ClassLoader.checkPackageAccess +0 311542/2 28 method -> java/lang/reflect/Method.getModifiers +0 311542/2 14 method <- java/lang/reflect/Method.getModifiers +0 311542/2 17 method -> Func_abc.main +0 311542/2 14 method -> Func_abc.func_a +0 311542/2 12 method -> java/lang/ClassLoader.checkPackageAccess +0 311542/2 10 method -> java/lang/System.getSecurityManager +0 311542/2 10 method <- java/lang/System.getSecurityManager +0 311542/2 11 method -> java/util/HashSet.add +0 311542/2 10 method -> java/util/HashMap.put +0 311542/2 9 method -> java/lang/Object.hashCode +0 311542/2 10 method <- java/lang/Object.hashCode +0 311542/2 10 method -> java/util/HashMap.hash +0 311542/2 10 method <- java/util/HashMap.hash +0 311542/2 10 method -> java/util/HashMap.indexFor +0 311542/2 10 method <- java/util/HashMap.indexFor +0 311542/2 10 method <- java/util/HashMap.put +0 311542/2 10 method <- java/util/HashSet.add +0 311542/2 10 method <- java/lang/ClassLoader.checkPackageAccess +0 311542/2 20 syscall -> brk +0 311542/2 15 syscall <- brk +0 311542/2 13 syscall -> brk +0 311542/2 17 syscall <- brk +0 311542/2 47 method -> java/lang/ClassLoader.loadClassInternal +0 311542/2 12 method -> java/lang/ClassLoader.loadClass +0 311542/2 10 method -> sun/misc/Launcher$AppClassLoader.loadClass +0 311542/2 10 method -> java/lang/String.lastIndexOf +0 311542/2 10 method -> java/lang/String.lastIndexOf +0 311542/2 11 method <- java/lang/String.lastIndexOf +0 311542/2 10 method <- java/lang/String.lastIndexOf +0 311542/2 10 method -> java/lang/System.getSecurityManager +0 311542/2 10 method <- java/lang/System.getSecurityManager +0 311542/2 10 method -> java/lang/ClassLoader.loadClass +0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass +0 311542/2 10 method -> java/lang/ClassLoader.check +0 311542/2 9 method <- java/lang/ClassLoader.check +0 311542/2 10 method -> java/lang/ClassLoader.checkName +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 11 method <- java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method -> sun/misc/VM.allowArraySyntax +0 311542/2 10 method <- sun/misc/VM.allowArraySyntax +0 311542/2 10 method -> java/lang/String.charAt +0 311542/2 10 method <- java/lang/String.charAt +0 311542/2 10 method <- java/lang/ClassLoader.checkName +0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass0 +0 311542/2 12 method <- java/lang/ClassLoader.findLoadedClass0 +0 311542/2 10 method <- java/lang/ClassLoader.findLoadedClass +0 311542/2 11 method -> java/lang/ClassLoader.loadClass +0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass +0 311542/2 10 method -> java/lang/ClassLoader.check +0 311542/2 9 method <- java/lang/ClassLoader.check +0 311542/2 10 method -> java/lang/ClassLoader.checkName +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method -> sun/misc/VM.allowArraySyntax +0 311542/2 10 method <- sun/misc/VM.allowArraySyntax +0 311542/2 10 method -> java/lang/String.charAt +0 311542/2 9 method <- java/lang/String.charAt +0 311542/2 10 method <- java/lang/ClassLoader.checkName +0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass0 +0 311542/2 11 method <- java/lang/ClassLoader.findLoadedClass0 +0 311542/2 10 method <- java/lang/ClassLoader.findLoadedClass +0 311542/2 10 method -> java/lang/ClassLoader.findBootstrapClass0 +0 311542/2 10 method -> java/lang/ClassLoader.check +0 311542/2 10 method <- java/lang/ClassLoader.check +0 311542/2 10 method -> java/lang/ClassLoader.checkName +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method -> sun/misc/VM.allowArraySyntax +0 311542/2 10 method <- sun/misc/VM.allowArraySyntax +0 311542/2 10 method -> java/lang/String.charAt +0 311542/2 9 method <- java/lang/String.charAt +0 311542/2 10 method <- java/lang/ClassLoader.checkName +0 311542/2 10 method -> java/lang/ClassLoader.findBootstrapClass +0 311542/2 12 method <- java/lang/ClassLoader.findBootstrapClass +0 311542/2 10 method <- java/lang/ClassLoader.findBootstrapClass0 +0 311542/2 11 method <- java/lang/ClassLoader.loadClass +0 311542/2 10 method <- java/lang/ClassLoader.loadClass +0 311542/2 10 method <- sun/misc/Launcher$AppClassLoader.loadClass +0 311542/2 10 method <- java/lang/ClassLoader.loadClass +0 311542/2 10 method <- java/lang/ClassLoader.loadClassInternal +0 311542/2 14 method -> java/lang/ClassLoader.checkPackageAccess +0 311542/2 10 method -> java/lang/System.getSecurityManager +0 311542/2 10 method <- java/lang/System.getSecurityManager +0 311542/2 10 method -> java/util/HashSet.add +0 311542/2 10 method -> java/util/HashMap.put +0 311542/2 10 method -> java/lang/Object.hashCode +0 311542/2 9 method <- java/lang/Object.hashCode +0 311542/2 10 method -> java/util/HashMap.hash +0 311542/2 10 method <- java/util/HashMap.hash +0 311542/2 10 method -> java/util/HashMap.indexFor +0 311542/2 10 method <- java/util/HashMap.indexFor +0 311542/2 11 method <- java/util/HashMap.put +0 311542/2 10 method <- java/util/HashSet.add +0 311542/2 10 method <- java/lang/ClassLoader.checkPackageAccess +0 311542/2 18 method -> java/io/PrintStream.println +0 311542/2 13 method -> java/io/PrintStream.print +0 311542/2 12 method -> java/io/PrintStream.write +0 311542/2 12 method -> java/io/PrintStream.ensureOpen +0 311542/2 13 method <- java/io/PrintStream.ensureOpen +0 311542/2 15 method -> java/io/Writer.write +0 311542/2 16 method -> java/io/BufferedWriter.write +0 311542/2 13 method -> java/io/BufferedWriter.ensureOpen +0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen +0 311542/2 12 method -> java/io/BufferedWriter.min +0 311542/2 10 method <- java/io/BufferedWriter.min +0 311542/2 13 method -> java/lang/String.getChars +0 311542/2 10 method -> java/lang/System.arraycopy +0 311542/2 11 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/String.getChars +0 311542/2 10 method <- java/io/BufferedWriter.write +0 311542/2 10 method <- java/io/Writer.write +0 311542/2 13 method -> java/io/BufferedWriter.flushBuffer +0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen +0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen +0 311542/2 13 method -> java/io/OutputStreamWriter.write +0 311542/2 13 method -> sun/nio/cs/StreamEncoder.write +0 311542/2 13 method -> sun/nio/cs/StreamEncoder.ensureOpen +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen +0 311542/2 13 method -> sun/nio/cs/StreamEncoder.implWrite +0 311542/2 14 method -> java/nio/CharBuffer.wrap +0 311542/2 11 method -> java/nio/HeapCharBuffer. +0 311542/2 10 method -> java/nio/CharBuffer. +0 311542/2 10 method -> java/nio/Buffer. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 11 method -> java/nio/Buffer.limit +0 311542/2 10 method <- java/nio/Buffer.limit +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer. +0 311542/2 10 method <- java/nio/CharBuffer. +0 311542/2 10 method <- java/nio/HeapCharBuffer. +0 311542/2 10 method <- java/nio/CharBuffer.wrap +0 311542/2 13 method -> java/nio/Buffer.hasRemaining +0 311542/2 10 method <- java/nio/Buffer.hasRemaining +0 311542/2 14 method -> java/nio/charset/CharsetEncoder.encode +0 311542/2 13 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop +0 311542/2 13 method -> java/nio/CharBuffer.hasArray +0 311542/2 10 method <- java/nio/CharBuffer.hasArray +0 311542/2 14 method -> java/nio/ByteBuffer.hasArray +0 311542/2 10 method <- java/nio/ByteBuffer.hasArray +0 311542/2 13 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop +0 311542/2 56 method -> java/nio/CharBuffer.array +0 311542/2 11 method <- java/nio/CharBuffer.array +0 311542/2 12 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 13 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 16 method -> java/nio/ByteBuffer.array +0 311542/2 10 method <- java/nio/ByteBuffer.array +0 311542/2 12 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 12 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 17 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 12 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 12 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop +0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop +0 311542/2 12 method -> java/nio/charset/CoderResult.isOverflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow +0 311542/2 12 method -> java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode +0 311542/2 13 method -> java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow +0 311542/2 14 method -> java/nio/Buffer.remaining +0 311542/2 10 method <- java/nio/Buffer.remaining +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write +0 311542/2 10 method <- java/io/OutputStreamWriter.write +0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer +0 311542/2 13 method -> java/io/OutputStreamWriter.flushBuffer +0 311542/2 12 method -> sun/nio/cs/StreamEncoder.flushBuffer +0 311542/2 13 method -> sun/nio/cs/StreamEncoder.implFlushBuffer +0 311542/2 13 method -> sun/nio/cs/StreamEncoder.writeBytes +0 311542/2 12 method -> java/nio/Buffer.flip +0 311542/2 10 method <- java/nio/Buffer.flip +0 311542/2 14 method -> java/nio/ByteBuffer.array +0 311542/2 10 method <- java/nio/ByteBuffer.array +0 311542/2 12 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 14 method -> java/io/PrintStream.write +0 311542/2 10 method -> java/io/PrintStream.ensureOpen +0 311542/2 10 method <- java/io/PrintStream.ensureOpen +0 311542/2 13 method -> java/io/BufferedOutputStream.write +0 311542/2 15 method -> java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/io/BufferedOutputStream.write +0 311542/2 12 method -> java/io/BufferedOutputStream.flush +0 311542/2 12 method -> java/io/BufferedOutputStream.flushBuffer +0 311542/2 15 method -> java/io/FileOutputStream.write +0 311542/2 12 method -> java/io/FileOutputStream.writeBytes +0 311542/2 55 syscall -> write +0 311542/2 160 syscall <- write +0 311542/2 12 method <- java/io/FileOutputStream.writeBytes +0 311542/2 12 method <- java/io/FileOutputStream.write +0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer +0 311542/2 13 method <- java/io/BufferedOutputStream.flush +0 311542/2 11 method <- java/io/PrintStream.write +0 311542/2 13 method -> java/nio/Buffer.clear +0 311542/2 11 method <- java/nio/Buffer.clear +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer +0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer +0 311542/2 15 method -> java/lang/String.indexOf +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method <- java/io/PrintStream.write +0 311542/2 10 method <- java/io/PrintStream.print +0 311542/2 12 method -> java/io/PrintStream.newLine +0 311542/2 10 method -> java/io/PrintStream.ensureOpen +0 311542/2 10 method <- java/io/PrintStream.ensureOpen +0 311542/2 12 method -> java/io/BufferedWriter.newLine +0 311542/2 12 method -> java/io/Writer.write +0 311542/2 10 method -> java/io/BufferedWriter.write +0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen +0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen +0 311542/2 11 method -> java/io/BufferedWriter.min +0 311542/2 10 method <- java/io/BufferedWriter.min +0 311542/2 10 method -> java/lang/String.getChars +0 311542/2 10 method -> java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/String.getChars +0 311542/2 10 method <- java/io/BufferedWriter.write +0 311542/2 10 method <- java/io/Writer.write +0 311542/2 10 method <- java/io/BufferedWriter.newLine +0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer +0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen +0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen +0 311542/2 10 method -> java/io/OutputStreamWriter.write +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write +0 311542/2 9 method -> sun/nio/cs/StreamEncoder.ensureOpen +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implWrite +0 311542/2 10 method -> java/nio/CharBuffer.wrap +0 311542/2 10 method -> java/nio/HeapCharBuffer. +0 311542/2 10 method -> java/nio/CharBuffer. +0 311542/2 10 method -> java/nio/Buffer. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 9 method <- java/lang/Object. +0 311542/2 10 method -> java/nio/Buffer.limit +0 311542/2 10 method <- java/nio/Buffer.limit +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer. +0 311542/2 10 method <- java/nio/CharBuffer. +0 311542/2 10 method <- java/nio/HeapCharBuffer. +0 311542/2 10 method <- java/nio/CharBuffer.wrap +0 311542/2 10 method -> java/nio/Buffer.hasRemaining +0 311542/2 10 method <- java/nio/Buffer.hasRemaining +0 311542/2 10 method -> java/nio/charset/CharsetEncoder.encode +0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop +0 311542/2 10 method -> java/nio/CharBuffer.hasArray +0 311542/2 9 method <- java/nio/CharBuffer.hasArray +0 311542/2 10 method -> java/nio/ByteBuffer.hasArray +0 311542/2 9 method <- java/nio/ByteBuffer.hasArray +0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop +0 311542/2 10 method -> java/nio/CharBuffer.array +0 311542/2 9 method <- java/nio/CharBuffer.array +0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 10 method -> java/nio/ByteBuffer.array +0 311542/2 10 method <- java/nio/ByteBuffer.array +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 9 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 11 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop +0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop +0 311542/2 10 method -> java/nio/charset/CoderResult.isOverflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow +0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode +0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method -> java/nio/Buffer.remaining +0 311542/2 10 method <- java/nio/Buffer.remaining +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write +0 311542/2 10 method <- java/io/OutputStreamWriter.write +0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer +0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes +0 311542/2 10 method -> java/nio/Buffer.flip +0 311542/2 9 method <- java/nio/Buffer.flip +0 311542/2 11 method -> java/nio/ByteBuffer.array +0 311542/2 9 method <- java/nio/ByteBuffer.array +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/io/PrintStream.write +0 311542/2 10 method -> java/io/PrintStream.ensureOpen +0 311542/2 9 method <- java/io/PrintStream.ensureOpen +0 311542/2 10 method -> java/io/BufferedOutputStream.write +0 311542/2 10 method -> java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/io/BufferedOutputStream.write +0 311542/2 10 method -> java/io/BufferedOutputStream.flush +0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method -> java/io/FileOutputStream.write +0 311542/2 10 method -> java/io/FileOutputStream.writeBytes +0 311542/2 12 syscall -> write +0 311542/2 63 syscall <- write +0 311542/2 8 method <- java/io/FileOutputStream.writeBytes +0 311542/2 11 method <- java/io/FileOutputStream.write +0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method <- java/io/BufferedOutputStream.flush +0 311542/2 10 method <- java/io/PrintStream.write +0 311542/2 10 method -> java/nio/Buffer.clear +0 311542/2 10 method <- java/nio/Buffer.clear +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer +0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer +0 311542/2 10 method -> java/io/BufferedOutputStream.flush +0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method <- java/io/BufferedOutputStream.flush +0 311542/2 10 method <- java/io/PrintStream.newLine +0 311542/2 10 method <- java/io/PrintStream.println +0 311542/2 23 method -> java/lang/ClassLoader.loadClassInternal +0 311542/2 11 method -> java/lang/ClassLoader.loadClass +0 311542/2 10 method -> sun/misc/Launcher$AppClassLoader.loadClass +0 311542/2 10 method -> java/lang/String.lastIndexOf +0 311542/2 10 method -> java/lang/String.lastIndexOf +0 311542/2 10 method <- java/lang/String.lastIndexOf +0 311542/2 10 method <- java/lang/String.lastIndexOf +0 311542/2 10 method -> java/lang/System.getSecurityManager +0 311542/2 10 method <- java/lang/System.getSecurityManager +0 311542/2 10 method -> java/lang/ClassLoader.loadClass +0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass +0 311542/2 10 method -> java/lang/ClassLoader.check +0 311542/2 10 method <- java/lang/ClassLoader.check +0 311542/2 10 method -> java/lang/ClassLoader.checkName +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method -> sun/misc/VM.allowArraySyntax +0 311542/2 9 method <- sun/misc/VM.allowArraySyntax +0 311542/2 10 method -> java/lang/String.charAt +0 311542/2 10 method <- java/lang/String.charAt +0 311542/2 10 method <- java/lang/ClassLoader.checkName +0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass0 +0 311542/2 14 method <- java/lang/ClassLoader.findLoadedClass0 +0 311542/2 10 method <- java/lang/ClassLoader.findLoadedClass +0 311542/2 12 method -> java/lang/ClassLoader.loadClass +0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass +0 311542/2 10 method -> java/lang/ClassLoader.check +0 311542/2 9 method <- java/lang/ClassLoader.check +0 311542/2 10 method -> java/lang/ClassLoader.checkName +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 9 method -> java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method -> sun/misc/VM.allowArraySyntax +0 311542/2 10 method <- sun/misc/VM.allowArraySyntax +0 311542/2 10 method -> java/lang/String.charAt +0 311542/2 9 method <- java/lang/String.charAt +0 311542/2 10 method <- java/lang/ClassLoader.checkName +0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass0 +0 311542/2 12 method <- java/lang/ClassLoader.findLoadedClass0 +0 311542/2 10 method <- java/lang/ClassLoader.findLoadedClass +0 311542/2 10 method -> java/lang/ClassLoader.findBootstrapClass0 +0 311542/2 10 method -> java/lang/ClassLoader.check +0 311542/2 9 method <- java/lang/ClassLoader.check +0 311542/2 10 method -> java/lang/ClassLoader.checkName +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 9 method -> java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method -> sun/misc/VM.allowArraySyntax +0 311542/2 10 method <- sun/misc/VM.allowArraySyntax +0 311542/2 10 method -> java/lang/String.charAt +0 311542/2 10 method <- java/lang/String.charAt +0 311542/2 10 method <- java/lang/ClassLoader.checkName +0 311542/2 10 method -> java/lang/ClassLoader.findBootstrapClass +0 311542/2 15 method <- java/lang/ClassLoader.findBootstrapClass +0 311542/2 10 method <- java/lang/ClassLoader.findBootstrapClass0 +0 311542/2 11 method <- java/lang/ClassLoader.loadClass +0 311542/2 10 method <- java/lang/ClassLoader.loadClass +0 311542/2 10 method <- sun/misc/Launcher$AppClassLoader.loadClass +0 311542/2 10 method <- java/lang/ClassLoader.loadClass +0 311542/2 10 method <- java/lang/ClassLoader.loadClassInternal +0 311542/2 17 method -> java/lang/ClassLoader.checkPackageAccess +0 311542/2 10 method -> java/lang/System.getSecurityManager +0 311542/2 10 method <- java/lang/System.getSecurityManager +0 311542/2 11 method -> java/util/HashSet.add +0 311542/2 10 method -> java/util/HashMap.put +0 311542/2 10 method -> java/lang/Object.hashCode +0 311542/2 10 method <- java/lang/Object.hashCode +0 311542/2 10 method -> java/util/HashMap.hash +0 311542/2 10 method <- java/util/HashMap.hash +0 311542/2 10 method -> java/util/HashMap.indexFor +0 311542/2 10 method <- java/util/HashMap.indexFor +0 311542/2 11 method <- java/util/HashMap.put +0 311542/2 10 method <- java/util/HashSet.add +0 311542/2 10 method <- java/lang/ClassLoader.checkPackageAccess +0 311542/2 20 method -> java/lang/Thread.currentThread +0 311542/2 11 method <- java/lang/Thread.currentThread +0 311542/2 13 method -> java/lang/Thread.sleep +0 311542/2 21 syscall -> pollsys +0 311542/10 59827 syscall <- pollsys +0 311542/10 31 syscall -> pollsys +0 311542/10 59842 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 60087 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 59871 syscall <- pollsys +0 311542/10 26 syscall -> pollsys +0 311542/3 1008044 syscall <- lwp_cond_wait +0 311542/3 37 syscall -> lwp_cond_wait +0 311542/10 59402 syscall <- pollsys +0 311542/10 18 syscall -> pollsys +0 311542/10 59999 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 59965 syscall <- pollsys +0 311542/10 25 syscall -> pollsys +0 311542/10 59979 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 51241 syscall <- pollsys +0 311542/10 31 syscall -> pollsys +0 311542/10 58679 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 50215 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 59734 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 59977 syscall <- pollsys +0 311542/10 26 syscall -> pollsys +0 311542/10 59970 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 59966 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 60013 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 59924 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +Function B +0 311542/2 1003741 syscall <- pollsys +0 311542/2 28 method <- java/lang/Thread.sleep +0 311542/2 45 method -> Func_abc.func_b +0 311542/2 36 method -> java/io/PrintStream.println +0 311542/2 11 method -> java/io/PrintStream.print +0 311542/2 10 method -> java/io/PrintStream.write +0 311542/2 10 method -> java/io/PrintStream.ensureOpen +0 311542/2 10 method <- java/io/PrintStream.ensureOpen +0 311542/2 11 method -> java/io/Writer.write +0 311542/2 11 method -> java/io/BufferedWriter.write +0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen +0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen +0 311542/2 12 method -> java/io/BufferedWriter.min +0 311542/2 10 method <- java/io/BufferedWriter.min +0 311542/2 11 method -> java/lang/String.getChars +0 311542/2 11 method -> java/lang/System.arraycopy +0 311542/2 11 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/String.getChars +0 311542/2 11 method <- java/io/BufferedWriter.write +0 311542/2 10 method <- java/io/Writer.write +0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer +0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen +0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen +0 311542/2 11 method -> java/io/OutputStreamWriter.write +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.ensureOpen +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen +0 311542/2 11 method -> sun/nio/cs/StreamEncoder.implWrite +0 311542/2 10 method -> java/nio/CharBuffer.wrap +0 311542/2 10 method -> java/nio/HeapCharBuffer. +0 311542/2 10 method -> java/nio/CharBuffer. +0 311542/2 10 method -> java/nio/Buffer. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 11 method -> java/nio/Buffer.limit +0 311542/2 10 method <- java/nio/Buffer.limit +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer. +0 311542/2 10 method <- java/nio/CharBuffer. +0 311542/2 10 method <- java/nio/HeapCharBuffer. +0 311542/2 10 method <- java/nio/CharBuffer.wrap +0 311542/2 11 method -> java/nio/Buffer.hasRemaining +0 311542/2 10 method <- java/nio/Buffer.hasRemaining +0 311542/2 11 method -> java/nio/charset/CharsetEncoder.encode +0 311542/2 11 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop +0 311542/2 10 method -> java/nio/CharBuffer.hasArray +0 311542/2 10 method <- java/nio/CharBuffer.hasArray +0 311542/2 11 method -> java/nio/ByteBuffer.hasArray +0 311542/2 10 method <- java/nio/ByteBuffer.hasArray +0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop +0 311542/2 10 method -> java/nio/CharBuffer.array +0 311542/2 10 method <- java/nio/CharBuffer.array +0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 11 method -> java/nio/ByteBuffer.array +0 311542/2 10 method <- java/nio/ByteBuffer.array +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 9 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 12 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop +0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop +0 311542/2 11 method -> java/nio/charset/CoderResult.isOverflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow +0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode +0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method -> java/nio/Buffer.remaining +0 311542/2 10 method <- java/nio/Buffer.remaining +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write +0 311542/2 10 method <- java/io/OutputStreamWriter.write +0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer +0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes +0 311542/2 10 method -> java/nio/Buffer.flip +0 311542/2 9 method <- java/nio/Buffer.flip +0 311542/2 11 method -> java/nio/ByteBuffer.array +0 311542/2 9 method <- java/nio/ByteBuffer.array +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/io/PrintStream.write +0 311542/2 10 method -> java/io/PrintStream.ensureOpen +0 311542/2 9 method <- java/io/PrintStream.ensureOpen +0 311542/2 11 method -> java/io/BufferedOutputStream.write +0 311542/2 10 method -> java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/io/BufferedOutputStream.write +0 311542/2 10 method -> java/io/BufferedOutputStream.flush +0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method -> java/io/FileOutputStream.write +0 311542/2 10 method -> java/io/FileOutputStream.writeBytes +0 311542/2 17 syscall -> write +0 311542/2 104 syscall <- write +0 311542/2 9 method <- java/io/FileOutputStream.writeBytes +0 311542/2 11 method <- java/io/FileOutputStream.write +0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method <- java/io/BufferedOutputStream.flush +0 311542/2 10 method <- java/io/PrintStream.write +0 311542/2 10 method -> java/nio/Buffer.clear +0 311542/2 10 method <- java/nio/Buffer.clear +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer +0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer +0 311542/2 11 method -> java/lang/String.indexOf +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 11 method <- java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method <- java/io/PrintStream.write +0 311542/2 10 method <- java/io/PrintStream.print +0 311542/2 10 method -> java/io/PrintStream.newLine +0 311542/2 10 method -> java/io/PrintStream.ensureOpen +0 311542/2 10 method <- java/io/PrintStream.ensureOpen +0 311542/2 10 method -> java/io/BufferedWriter.newLine +0 311542/2 10 method -> java/io/Writer.write +0 311542/2 10 method -> java/io/BufferedWriter.write +0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen +0 311542/2 9 method <- java/io/BufferedWriter.ensureOpen +0 311542/2 10 method -> java/io/BufferedWriter.min +0 311542/2 9 method <- java/io/BufferedWriter.min +0 311542/2 10 method -> java/lang/String.getChars +0 311542/2 10 method -> java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/String.getChars +0 311542/2 10 method <- java/io/BufferedWriter.write +0 311542/2 10 method <- java/io/Writer.write +0 311542/2 10 method <- java/io/BufferedWriter.newLine +0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer +0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen +0 311542/2 9 method <- java/io/BufferedWriter.ensureOpen +0 311542/2 10 method -> java/io/OutputStreamWriter.write +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.ensureOpen +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implWrite +0 311542/2 10 method -> java/nio/CharBuffer.wrap +0 311542/2 10 method -> java/nio/HeapCharBuffer. +0 311542/2 10 method -> java/nio/CharBuffer. +0 311542/2 10 method -> java/nio/Buffer. +0 311542/2 9 method -> java/lang/Object. +0 311542/2 9 method <- java/lang/Object. +0 311542/2 10 method -> java/nio/Buffer.limit +0 311542/2 10 method <- java/nio/Buffer.limit +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer. +0 311542/2 10 method <- java/nio/CharBuffer. +0 311542/2 10 method <- java/nio/HeapCharBuffer. +0 311542/2 10 method <- java/nio/CharBuffer.wrap +0 311542/2 10 method -> java/nio/Buffer.hasRemaining +0 311542/2 10 method <- java/nio/Buffer.hasRemaining +0 311542/2 10 method -> java/nio/charset/CharsetEncoder.encode +0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop +0 311542/2 10 method -> java/nio/CharBuffer.hasArray +0 311542/2 10 method <- java/nio/CharBuffer.hasArray +0 311542/2 10 method -> java/nio/ByteBuffer.hasArray +0 311542/2 10 method <- java/nio/ByteBuffer.hasArray +0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop +0 311542/2 10 method -> java/nio/CharBuffer.array +0 311542/2 10 method <- java/nio/CharBuffer.array +0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 11 method -> java/nio/ByteBuffer.array +0 311542/2 9 method <- java/nio/ByteBuffer.array +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 11 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 9 method <- java/nio/Buffer.position +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop +0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop +0 311542/2 10 method -> java/nio/charset/CoderResult.isOverflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow +0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode +0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method -> java/nio/Buffer.remaining +0 311542/2 10 method <- java/nio/Buffer.remaining +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write +0 311542/2 10 method <- java/io/OutputStreamWriter.write +0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer +0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes +0 311542/2 10 method -> java/nio/Buffer.flip +0 311542/2 10 method <- java/nio/Buffer.flip +0 311542/2 10 method -> java/nio/ByteBuffer.array +0 311542/2 9 method <- java/nio/ByteBuffer.array +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/io/PrintStream.write +0 311542/2 10 method -> java/io/PrintStream.ensureOpen +0 311542/2 9 method <- java/io/PrintStream.ensureOpen +0 311542/2 10 method -> java/io/BufferedOutputStream.write +0 311542/2 10 method -> java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/io/BufferedOutputStream.write +0 311542/2 10 method -> java/io/BufferedOutputStream.flush +0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method -> java/io/FileOutputStream.write +0 311542/2 10 method -> java/io/FileOutputStream.writeBytes +0 311542/2 11 syscall -> write +0 311542/2 64 syscall <- write +0 311542/2 8 method <- java/io/FileOutputStream.writeBytes +0 311542/2 11 method <- java/io/FileOutputStream.write +0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method <- java/io/BufferedOutputStream.flush +0 311542/2 10 method <- java/io/PrintStream.write +0 311542/2 10 method -> java/nio/Buffer.clear +0 311542/2 10 method <- java/nio/Buffer.clear +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer +0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer +0 311542/2 10 method -> java/io/BufferedOutputStream.flush +0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method <- java/io/BufferedOutputStream.flush +0 311542/2 10 method <- java/io/PrintStream.newLine +0 311542/2 10 method <- java/io/PrintStream.println +0 311542/2 10 method -> java/lang/Thread.currentThread +0 311542/2 10 method <- java/lang/Thread.currentThread +0 311542/2 10 method -> java/lang/Thread.sleep +0 311542/2 14 syscall -> pollsys +0 311542/10 59985 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 59968 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 59981 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 59960 syscall <- pollsys +0 311542/10 28 syscall -> pollsys +0 311542/10 59967 syscall <- pollsys +0 311542/10 22 syscall -> pollsys +0 311542/3 1050003 syscall <- lwp_cond_wait +0 311542/3 14 syscall -> lwp_cond_wait +0 311542/10 59985 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 59969 syscall <- pollsys +0 311542/10 25 syscall -> pollsys +0 311542/10 59980 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 51269 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 58678 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 50207 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 59714 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 59967 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 59965 syscall <- pollsys +0 311542/10 28 syscall -> pollsys +0 311542/10 59970 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 59952 syscall <- pollsys +0 311542/10 31 syscall -> pollsys +0 311542/10 59969 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +Function C +0 311542/2 1006879 syscall <- pollsys +0 311542/2 29 method <- java/lang/Thread.sleep +0 311542/2 45 method -> Func_abc.func_c +0 311542/2 36 method -> java/io/PrintStream.println +0 311542/2 11 method -> java/io/PrintStream.print +0 311542/2 10 method -> java/io/PrintStream.write +0 311542/2 10 method -> java/io/PrintStream.ensureOpen +0 311542/2 10 method <- java/io/PrintStream.ensureOpen +0 311542/2 11 method -> java/io/Writer.write +0 311542/2 11 method -> java/io/BufferedWriter.write +0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen +0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen +0 311542/2 12 method -> java/io/BufferedWriter.min +0 311542/2 10 method <- java/io/BufferedWriter.min +0 311542/2 11 method -> java/lang/String.getChars +0 311542/2 11 method -> java/lang/System.arraycopy +0 311542/2 11 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/String.getChars +0 311542/2 11 method <- java/io/BufferedWriter.write +0 311542/2 10 method <- java/io/Writer.write +0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer +0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen +0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen +0 311542/2 11 method -> java/io/OutputStreamWriter.write +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.ensureOpen +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen +0 311542/2 11 method -> sun/nio/cs/StreamEncoder.implWrite +0 311542/2 10 method -> java/nio/CharBuffer.wrap +0 311542/2 11 method -> java/nio/HeapCharBuffer. +0 311542/2 10 method -> java/nio/CharBuffer. +0 311542/2 10 method -> java/nio/Buffer. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 11 method -> java/nio/Buffer.limit +0 311542/2 10 method <- java/nio/Buffer.limit +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer. +0 311542/2 10 method <- java/nio/CharBuffer. +0 311542/2 10 method <- java/nio/HeapCharBuffer. +0 311542/2 10 method <- java/nio/CharBuffer.wrap +0 311542/2 11 method -> java/nio/Buffer.hasRemaining +0 311542/2 10 method <- java/nio/Buffer.hasRemaining +0 311542/2 11 method -> java/nio/charset/CharsetEncoder.encode +0 311542/2 11 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop +0 311542/2 10 method -> java/nio/CharBuffer.hasArray +0 311542/2 10 method <- java/nio/CharBuffer.hasArray +0 311542/2 11 method -> java/nio/ByteBuffer.hasArray +0 311542/2 10 method <- java/nio/ByteBuffer.hasArray +0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop +0 311542/2 10 method -> java/nio/CharBuffer.array +0 311542/2 9 method <- java/nio/CharBuffer.array +0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 11 method -> java/nio/ByteBuffer.array +0 311542/2 10 method <- java/nio/ByteBuffer.array +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 12 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop +0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop +0 311542/2 11 method -> java/nio/charset/CoderResult.isOverflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow +0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode +0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method -> java/nio/Buffer.remaining +0 311542/2 10 method <- java/nio/Buffer.remaining +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write +0 311542/2 10 method <- java/io/OutputStreamWriter.write +0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer +0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes +0 311542/2 10 method -> java/nio/Buffer.flip +0 311542/2 9 method <- java/nio/Buffer.flip +0 311542/2 11 method -> java/nio/ByteBuffer.array +0 311542/2 9 method <- java/nio/ByteBuffer.array +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 11 method -> java/io/PrintStream.write +0 311542/2 10 method -> java/io/PrintStream.ensureOpen +0 311542/2 9 method <- java/io/PrintStream.ensureOpen +0 311542/2 11 method -> java/io/BufferedOutputStream.write +0 311542/2 10 method -> java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/io/BufferedOutputStream.write +0 311542/2 11 method -> java/io/BufferedOutputStream.flush +0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method -> java/io/FileOutputStream.write +0 311542/2 10 method -> java/io/FileOutputStream.writeBytes +0 311542/2 17 syscall -> write +0 311542/2 143 syscall <- write +0 311542/2 9 method <- java/io/FileOutputStream.writeBytes +0 311542/2 11 method <- java/io/FileOutputStream.write +0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method <- java/io/BufferedOutputStream.flush +0 311542/2 10 method <- java/io/PrintStream.write +0 311542/2 10 method -> java/nio/Buffer.clear +0 311542/2 10 method <- java/nio/Buffer.clear +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer +0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer +0 311542/2 11 method -> java/lang/String.indexOf +0 311542/2 10 method -> java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method <- java/lang/String.indexOf +0 311542/2 10 method <- java/io/PrintStream.write +0 311542/2 10 method <- java/io/PrintStream.print +0 311542/2 10 method -> java/io/PrintStream.newLine +0 311542/2 10 method -> java/io/PrintStream.ensureOpen +0 311542/2 10 method <- java/io/PrintStream.ensureOpen +0 311542/2 10 method -> java/io/BufferedWriter.newLine +0 311542/2 10 method -> java/io/Writer.write +0 311542/2 10 method -> java/io/BufferedWriter.write +0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen +0 311542/2 9 method <- java/io/BufferedWriter.ensureOpen +0 311542/2 10 method -> java/io/BufferedWriter.min +0 311542/2 9 method <- java/io/BufferedWriter.min +0 311542/2 10 method -> java/lang/String.getChars +0 311542/2 10 method -> java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/String.getChars +0 311542/2 10 method <- java/io/BufferedWriter.write +0 311542/2 10 method <- java/io/Writer.write +0 311542/2 10 method <- java/io/BufferedWriter.newLine +0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer +0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen +0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen +0 311542/2 10 method -> java/io/OutputStreamWriter.write +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.ensureOpen +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implWrite +0 311542/2 10 method -> java/nio/CharBuffer.wrap +0 311542/2 10 method -> java/nio/HeapCharBuffer. +0 311542/2 10 method -> java/nio/CharBuffer. +0 311542/2 10 method -> java/nio/Buffer. +0 311542/2 9 method -> java/lang/Object. +0 311542/2 9 method <- java/lang/Object. +0 311542/2 10 method -> java/nio/Buffer.limit +0 311542/2 10 method <- java/nio/Buffer.limit +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer. +0 311542/2 10 method <- java/nio/CharBuffer. +0 311542/2 10 method <- java/nio/HeapCharBuffer. +0 311542/2 10 method <- java/nio/CharBuffer.wrap +0 311542/2 10 method -> java/nio/Buffer.hasRemaining +0 311542/2 10 method <- java/nio/Buffer.hasRemaining +0 311542/2 10 method -> java/nio/charset/CharsetEncoder.encode +0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop +0 311542/2 10 method -> java/nio/CharBuffer.hasArray +0 311542/2 10 method <- java/nio/CharBuffer.hasArray +0 311542/2 10 method -> java/nio/ByteBuffer.hasArray +0 311542/2 10 method <- java/nio/ByteBuffer.hasArray +0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop +0 311542/2 10 method -> java/nio/CharBuffer.array +0 311542/2 10 method <- java/nio/CharBuffer.array +0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 11 method -> java/nio/ByteBuffer.array +0 311542/2 9 method <- java/nio/ByteBuffer.array +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 11 method -> java/nio/CharBuffer.arrayOffset +0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 9 method <- java/nio/Buffer.position +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/nio/Buffer.position +0 311542/2 10 method <- java/nio/Buffer.position +0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop +0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop +0 311542/2 10 method -> java/nio/charset/CoderResult.isOverflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow +0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode +0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow +0 311542/2 10 method -> java/nio/Buffer.remaining +0 311542/2 10 method <- java/nio/Buffer.remaining +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write +0 311542/2 10 method <- java/io/OutputStreamWriter.write +0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer +0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer +0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes +0 311542/2 10 method -> java/nio/Buffer.flip +0 311542/2 10 method <- java/nio/Buffer.flip +0 311542/2 10 method -> java/nio/ByteBuffer.array +0 311542/2 9 method <- java/nio/ByteBuffer.array +0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset +0 311542/2 9 method <- java/nio/ByteBuffer.arrayOffset +0 311542/2 10 method -> java/io/PrintStream.write +0 311542/2 10 method -> java/io/PrintStream.ensureOpen +0 311542/2 9 method <- java/io/PrintStream.ensureOpen +0 311542/2 10 method -> java/io/BufferedOutputStream.write +0 311542/2 10 method -> java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/io/BufferedOutputStream.write +0 311542/2 10 method -> java/io/BufferedOutputStream.flush +0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method -> java/io/FileOutputStream.write +0 311542/2 10 method -> java/io/FileOutputStream.writeBytes +0 311542/2 11 syscall -> write +0 311542/2 63 syscall <- write +0 311542/2 8 method <- java/io/FileOutputStream.writeBytes +0 311542/2 11 method <- java/io/FileOutputStream.write +0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method <- java/io/BufferedOutputStream.flush +0 311542/2 10 method <- java/io/PrintStream.write +0 311542/2 10 method -> java/nio/Buffer.clear +0 311542/2 10 method <- java/nio/Buffer.clear +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer +0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer +0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer +0 311542/2 10 method -> java/io/BufferedOutputStream.flush +0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer +0 311542/2 10 method <- java/io/BufferedOutputStream.flush +0 311542/2 10 method <- java/io/PrintStream.newLine +0 311542/2 10 method <- java/io/PrintStream.println +0 311542/2 10 method -> java/lang/Thread.currentThread +0 311542/2 10 method <- java/lang/Thread.currentThread +0 311542/2 11 method -> java/lang/Thread.sleep +0 311542/2 14 syscall -> pollsys +0 311542/10 59975 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 59963 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 59976 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 59961 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 59968 syscall <- pollsys +0 311542/10 22 syscall -> pollsys +0 311542/3 1009924 syscall <- lwp_cond_wait +0 311542/3 17 syscall -> lwp_cond_wait +0 311542/10 50021 syscall <- pollsys +0 311542/10 31 syscall -> pollsys +0 311542/10 59941 syscall <- pollsys +0 311542/10 27 syscall -> pollsys +0 311542/10 60034 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 61298 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 58590 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 50205 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 59723 syscall <- pollsys +0 311542/10 29 syscall -> pollsys +0 311542/10 60208 syscall <- pollsys +0 311542/10 28 syscall -> pollsys +0 311542/10 59733 syscall <- pollsys +0 311542/10 28 syscall -> pollsys +0 311542/10 59986 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 59938 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/10 59968 syscall <- pollsys +0 311542/10 30 syscall -> pollsys +0 311542/2 1007088 syscall <- pollsys +0 311542/2 30 method <- java/lang/Thread.sleep +0 311542/2 28 method <- Func_abc.func_c +0 311542/2 10 method <- Func_abc.func_b +0 311542/2 10 method <- Func_abc.func_a +0 311542/2 10 method <- Func_abc.main +0 311542/2 27 method -> java/lang/Thread.exit +0 311542/2 38 method -> java/lang/ThreadGroup.remove +0 311542/2 19 method -> java/lang/System.arraycopy +0 311542/2 11 method <- java/lang/System.arraycopy +0 311542/2 14 method -> java/lang/Object.notifyAll +0 311542/2 16 method <- java/lang/Object.notifyAll +0 311542/2 11 method <- java/lang/ThreadGroup.remove +0 311542/2 16 method <- java/lang/Thread.exit +0 311542/2 22 syscall -> mprotect +0 311542/2 19 syscall <- mprotect +0 311542/2 19 syscall -> lwp_sigmask +0 311542/2 7 syscall <- lwp_sigmask +0 311542/2 25 syscall -> lwp_self +0 311542/2 6 syscall <- lwp_self +0 311542/2 7 syscall -> lwp_sigmask +0 311542/2 5 syscall <- lwp_sigmask +0 311542/2 6 syscall -> lwp_sigmask +0 311542/2 6 syscall <- lwp_sigmask +0 311542/2 124 method -> java/lang/Thread. +0 311542/2 12 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 11 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 11 method -> java/lang/Thread.init +0 311542/2 10 method -> java/lang/Thread.currentThread +0 311542/2 10 method <- java/lang/Thread.currentThread +0 311542/2 11 method -> java/lang/System.getSecurityManager +0 311542/2 10 method <- java/lang/System.getSecurityManager +0 311542/2 11 method -> java/lang/ThreadGroup.checkAccess +0 311542/2 10 method -> java/lang/System.getSecurityManager +0 311542/2 10 method <- java/lang/System.getSecurityManager +0 311542/2 10 method <- java/lang/ThreadGroup.checkAccess +0 311542/2 10 method -> java/lang/ThreadGroup.addUnstarted +0 311542/2 10 method <- java/lang/ThreadGroup.addUnstarted +0 311542/2 11 method -> java/lang/String.toCharArray +0 311542/2 11 method -> java/lang/String.getChars +0 311542/2 10 method -> java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/System.arraycopy +0 311542/2 10 method <- java/lang/String.getChars +0 311542/2 10 method <- java/lang/String.toCharArray +0 311542/2 10 method -> java/lang/Thread.getContextClassLoader +0 311542/2 10 method <- java/lang/Thread.getContextClassLoader +0 311542/2 11 method -> java/security/AccessController.getContext +0 311542/2 10 method -> java/security/AccessController.getStackAccessControlContext +0 311542/2 17 method <- java/security/AccessController.getStackAccessControlContext +0 311542/2 11 method -> java/security/AccessControlContext.optimize +0 311542/2 10 method -> java/security/AccessController.getInheritedAccessControlContext +0 311542/2 11 method <- java/security/AccessController.getInheritedAccessControlContext +0 311542/2 11 method <- java/security/AccessControlContext.optimize +0 311542/2 10 method <- java/security/AccessController.getContext +0 311542/2 10 method -> java/lang/Thread.setPriority +0 311542/2 10 method -> java/lang/Thread.checkAccess +0 311542/2 9 method -> java/lang/System.getSecurityManager +0 311542/2 9 method <- java/lang/System.getSecurityManager +0 311542/2 10 method <- java/lang/Thread.checkAccess +0 311542/2 11 method -> java/lang/Thread.setPriority0 +0 311542/2 15 syscall -> priocntlsys +0 311542/2 9 syscall <- priocntlsys +0 311542/2 7 syscall -> priocntlsys +0 311542/2 8 syscall <- priocntlsys +0 311542/2 7 method <- java/lang/Thread.setPriority0 +0 311542/2 10 method <- java/lang/Thread.setPriority +0 311542/2 11 method -> java/lang/Thread.nextThreadID +0 311542/2 11 method <- java/lang/Thread.nextThreadID +0 311542/2 10 method <- java/lang/Thread.init +0 311542/2 10 method <- java/lang/Thread. +0 311542/2 12 method -> java/lang/ThreadGroup.add +0 311542/2 11 method <- java/lang/ThreadGroup.add +0 311542/2 10 syscall -> mprotect +0 311542/2 7 syscall <- mprotect +0 311542/2 12 method -> java/lang/Shutdown.shutdown +0 311542/2 15 method -> java/lang/Shutdown.sequence +0 311542/2 12 method -> java/lang/Shutdown.runHooks +0 311542/2 14 method -> java/util/AbstractList.iterator +0 311542/2 30 syscall -> llseek +0 311542/2 9 syscall <- llseek +0 311542/2 8 syscall -> read +0 311542/2 1709 syscall <- read +0 311542/2 27 syscall -> llseek +0 311542/2 14 syscall <- llseek +0 311542/2 7 syscall -> read +0 311542/2 23 syscall <- read +0 311542/2 280 method -> java/util/AbstractList$Itr. +0 311542/2 28 method -> java/util/AbstractList$Itr. +0 311542/2 17 method -> java/lang/Object. +0 311542/2 12 method <- java/lang/Object. +0 311542/2 25 method <- java/util/AbstractList$Itr. +0 311542/2 11 method <- java/util/AbstractList$Itr. +0 311542/2 10 method <- java/util/AbstractList.iterator +0 311542/2 17 method -> java/util/AbstractList$Itr.hasNext +0 311542/2 16 method <- java/util/AbstractList$Itr.hasNext +0 311542/2 13 method -> java/util/AbstractList$Itr.next +0 311542/2 12 method -> java/util/AbstractList$Itr.checkForComodification +0 311542/2 10 method <- java/util/AbstractList$Itr.checkForComodification +0 311542/2 13 method -> java/util/ArrayList.get +0 311542/2 11 method -> java/util/ArrayList.RangeCheck +0 311542/2 10 method <- java/util/ArrayList.RangeCheck +0 311542/2 10 method <- java/util/ArrayList.get +0 311542/2 10 method <- java/util/AbstractList$Itr.next +0 311542/2 15 method -> java/io/Console$1$1.run +0 311542/2 14 method -> java/io/Console.access$600 +0 311542/2 12 method <- java/io/Console.access$600 +0 311542/2 10 method <- java/io/Console$1$1.run +0 311542/2 10 method -> java/util/AbstractList$Itr.hasNext +0 311542/2 10 method <- java/util/AbstractList$Itr.hasNext +0 311542/2 10 method -> java/util/AbstractList$Itr.next +0 311542/2 10 method -> java/util/AbstractList$Itr.checkForComodification +0 311542/2 10 method <- java/util/AbstractList$Itr.checkForComodification +0 311542/2 11 method -> java/util/ArrayList.get +0 311542/2 10 method -> java/util/ArrayList.RangeCheck +0 311542/2 10 method <- java/util/ArrayList.RangeCheck +0 311542/2 10 method <- java/util/ArrayList.get +0 311542/2 10 method <- java/util/AbstractList$Itr.next +0 311542/2 11 method -> java/lang/ApplicationShutdownHooks.run +0 311542/2 16 method -> java/util/IdentityHashMap.keySet +0 311542/2 27 syscall -> llseek +0 311542/2 7 syscall <- llseek +0 311542/2 8 syscall -> read +0 311542/2 18 syscall <- read +0 311542/2 7 syscall -> llseek +0 311542/2 6 syscall <- llseek +0 311542/2 6 syscall -> read +0 311542/2 17 syscall <- read +0 311542/2 139 method -> java/util/IdentityHashMap$KeySet. +0 311542/2 14 method -> java/util/IdentityHashMap$KeySet. +0 311542/2 14 method -> java/util/AbstractSet. +0 311542/2 10 method -> java/util/AbstractCollection. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 11 method <- java/util/AbstractCollection. +0 311542/2 10 method <- java/util/AbstractSet. +0 311542/2 10 method <- java/util/IdentityHashMap$KeySet. +0 311542/2 10 method <- java/util/IdentityHashMap$KeySet. +0 311542/2 10 method <- java/util/IdentityHashMap.keySet +0 311542/2 14 method -> java/util/IdentityHashMap$KeySet.iterator +0 311542/2 17 syscall -> llseek +0 311542/2 7 syscall <- llseek +0 311542/2 7 syscall -> read +0 311542/2 15 syscall <- read +0 311542/2 7 syscall -> llseek +0 311542/2 6 syscall <- llseek +0 311542/2 6 syscall -> read +0 311542/2 12 syscall <- read +0 311542/2 30 syscall -> llseek +0 311542/2 6 syscall <- llseek +0 311542/2 7 syscall -> read +0 311542/2 14 syscall <- read +0 311542/2 7 syscall -> llseek +0 311542/2 6 syscall <- llseek +0 311542/2 6 syscall -> read +0 311542/2 17 syscall <- read +0 311542/2 125 method -> java/util/IdentityHashMap$KeyIterator. +0 311542/2 14 method -> java/util/IdentityHashMap$KeyIterator. +0 311542/2 14 method -> java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 13 method -> java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 57 method -> java/lang/Object. +0 311542/2 11 method <- java/lang/Object. +0 311542/2 15 method -> java/util/IdentityHashMap.access$000 +0 311542/2 11 method <- java/util/IdentityHashMap.access$000 +0 311542/2 15 method -> java/util/IdentityHashMap.access$200 +0 311542/2 11 method <- java/util/IdentityHashMap.access$200 +0 311542/2 13 method <- java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$KeySet.iterator +0 311542/2 14 method -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext +0 311542/2 11 method <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext +0 311542/2 11 method -> java/util/IdentityHashMap$KeySet.iterator +0 311542/2 10 method -> java/util/IdentityHashMap$KeyIterator. +0 311542/2 10 method -> java/util/IdentityHashMap$KeyIterator. +0 311542/2 10 method -> java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 10 method -> java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$KeySet.iterator +0 311542/2 10 method -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext +0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext +0 311542/2 11 method <- java/lang/ApplicationShutdownHooks.run +0 311542/2 10 method -> java/util/AbstractList$Itr.hasNext +0 311542/2 10 method <- java/util/AbstractList$Itr.hasNext +0 311542/2 10 method -> java/util/AbstractList$Itr.next +0 311542/2 10 method -> java/util/AbstractList$Itr.checkForComodification +0 311542/2 10 method <- java/util/AbstractList$Itr.checkForComodification +0 311542/2 11 method -> java/util/ArrayList.get +0 311542/2 10 method -> java/util/ArrayList.RangeCheck +0 311542/2 10 method <- java/util/ArrayList.RangeCheck +0 311542/2 10 method <- java/util/ArrayList.get +0 311542/2 10 method <- java/util/AbstractList$Itr.next +0 311542/2 11 method -> java/io/File$1.run +0 311542/2 17 syscall -> llseek +0 311542/2 8 syscall <- llseek +0 311542/2 8 syscall -> read +0 311542/2 17 syscall <- read +0 311542/2 7 syscall -> llseek +0 311542/2 6 syscall <- llseek +0 311542/2 6 syscall -> read +0 311542/2 12 syscall <- read +0 311542/2 62 method -> java/io/DeleteOnExitHook. +0 311542/2 19 syscall -> llseek +0 311542/2 6 syscall <- llseek +0 311542/2 7 syscall -> read +0 311542/2 14 syscall <- read +0 311542/2 7 syscall -> llseek +0 311542/2 6 syscall <- llseek +0 311542/2 6 syscall -> read +0 311542/2 12 syscall <- read +0 311542/2 130 method -> java/util/LinkedHashSet. +0 311542/2 15 method -> java/util/HashSet. +0 311542/2 10 method -> java/util/AbstractSet. +0 311542/2 10 method -> java/util/AbstractCollection. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 11 method <- java/util/AbstractCollection. +0 311542/2 10 method <- java/util/AbstractSet. +0 311542/2 15 method -> java/util/LinkedHashMap. +0 311542/2 13 method -> java/util/HashMap. +0 311542/2 10 method -> java/util/AbstractMap. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 10 method <- java/util/AbstractMap. +0 311542/2 12 method -> java/lang/Float.isNaN +0 311542/2 10 method <- java/lang/Float.isNaN +0 311542/2 15 method -> java/util/LinkedHashMap.init +0 311542/2 10 method -> java/util/LinkedHashMap$Entry. +0 311542/2 10 method -> java/util/HashMap$Entry. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 9 method <- java/lang/Object. +0 311542/2 10 method <- java/util/HashMap$Entry. +0 311542/2 10 method <- java/util/LinkedHashMap$Entry. +0 311542/2 10 method <- java/util/LinkedHashMap.init +0 311542/2 10 method <- java/util/HashMap. +0 311542/2 10 method <- java/util/LinkedHashMap. +0 311542/2 10 method <- java/util/HashSet. +0 311542/2 10 method <- java/util/LinkedHashSet. +0 311542/2 12 method <- java/io/DeleteOnExitHook. +0 311542/2 13 method -> java/io/DeleteOnExitHook.hook +0 311542/2 13 method -> java/io/DeleteOnExitHook. +0 311542/2 12 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 10 method <- java/io/DeleteOnExitHook. +0 311542/2 10 method <- java/io/DeleteOnExitHook.hook +0 311542/2 13 method -> java/io/DeleteOnExitHook.run +0 311542/2 15 method -> java/util/ArrayList. +0 311542/2 10 method -> java/util/AbstractList. +0 311542/2 10 method -> java/util/AbstractCollection. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 9 method <- java/lang/Object. +0 311542/2 10 method <- java/util/AbstractCollection. +0 311542/2 10 method <- java/util/AbstractList. +0 311542/2 15 method -> java/util/AbstractCollection.toArray +0 311542/2 13 method -> java/util/HashSet.size +0 311542/2 12 method <- java/util/HashSet.size +0 311542/2 13 method -> java/util/HashSet.iterator +0 311542/2 12 method -> java/util/HashMap.keySet +0 311542/2 19 syscall -> llseek +0 311542/2 7 syscall <- llseek +0 311542/2 8 syscall -> read +0 311542/2 17 syscall <- read +0 311542/2 7 syscall -> llseek +0 311542/2 6 syscall <- llseek +0 311542/2 6 syscall -> read +0 311542/2 12 syscall <- read +0 311542/2 68 method -> java/util/HashMap$KeySet. +0 311542/2 14 method -> java/util/HashMap$KeySet. +0 311542/2 14 method -> java/util/AbstractSet. +0 311542/2 10 method -> java/util/AbstractCollection. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 11 method <- java/util/AbstractCollection. +0 311542/2 10 method <- java/util/AbstractSet. +0 311542/2 10 method <- java/util/HashMap$KeySet. +0 311542/2 10 method <- java/util/HashMap$KeySet. +0 311542/2 10 method <- java/util/HashMap.keySet +0 311542/2 13 method -> java/util/HashMap$KeySet.iterator +0 311542/2 14 method -> java/util/LinkedHashMap.newKeyIterator +0 311542/2 16 syscall -> llseek +0 311542/2 6 syscall <- llseek +0 311542/2 7 syscall -> read +0 311542/2 14 syscall <- read +0 311542/2 7 syscall -> llseek +0 311542/2 6 syscall <- llseek +0 311542/2 6 syscall -> read +0 311542/2 16 syscall <- read +0 311542/2 81 syscall -> llseek +0 311542/2 7 syscall <- llseek +0 311542/2 7 syscall -> read +0 311542/2 14 syscall <- read +0 311542/2 7 syscall -> llseek +0 311542/2 6 syscall <- llseek +0 311542/2 6 syscall -> read +0 311542/2 12 syscall <- read +0 311542/2 77 method -> java/util/LinkedHashMap$KeyIterator. +0 311542/2 14 method -> java/util/LinkedHashMap$KeyIterator. +0 311542/2 14 method -> java/util/LinkedHashMap$LinkedHashIterator. +0 311542/2 12 method -> java/util/LinkedHashMap$LinkedHashIterator. +0 311542/2 13 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 19 method <- java/util/LinkedHashMap$LinkedHashIterator. +0 311542/2 11 method <- java/util/LinkedHashMap$LinkedHashIterator. +0 311542/2 10 method <- java/util/LinkedHashMap$KeyIterator. +0 311542/2 10 method <- java/util/LinkedHashMap$KeyIterator. +0 311542/2 10 method <- java/util/LinkedHashMap.newKeyIterator +0 311542/2 10 method <- java/util/HashMap$KeySet.iterator +0 311542/2 10 method <- java/util/HashSet.iterator +0 311542/2 14 method -> java/util/LinkedHashMap$LinkedHashIterator.hasNext +0 311542/2 11 method <- java/util/LinkedHashMap$LinkedHashIterator.hasNext +0 311542/2 11 method <- java/util/AbstractCollection.toArray +0 311542/2 11 method -> java/lang/Object.getClass +0 311542/2 12 method <- java/lang/Object.getClass +0 311542/2 11 method <- java/util/ArrayList. +0 311542/2 14 method -> java/util/Collections.reverse +0 311542/2 15 method <- java/util/Collections.reverse +0 311542/2 13 method -> java/util/AbstractList.iterator +0 311542/2 11 method -> java/util/AbstractList$Itr. +0 311542/2 10 method -> java/util/AbstractList$Itr. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 9 method <- java/lang/Object. +0 311542/2 10 method <- java/util/AbstractList$Itr. +0 311542/2 10 method <- java/util/AbstractList$Itr. +0 311542/2 10 method <- java/util/AbstractList.iterator +0 311542/2 13 method -> java/util/AbstractList$Itr.hasNext +0 311542/2 10 method <- java/util/AbstractList$Itr.hasNext +0 311542/2 10 method <- java/io/DeleteOnExitHook.run +0 311542/2 10 method <- java/io/File$1.run +0 311542/2 10 method -> java/util/AbstractList$Itr.hasNext +0 311542/2 10 method <- java/util/AbstractList$Itr.hasNext +0 311542/2 10 method <- java/lang/Shutdown.runHooks +0 311542/2 12 method <- java/lang/Shutdown.sequence +0 311542/2 10 method <- java/lang/Shutdown.shutdown +0 311542/2 16 syscall -> lwp_cond_wait +0 311542/10 59973 syscall <- pollsys +0 311542/10 31 syscall -> lwp_cond_signal +0 311542/10 15 syscall <- lwp_cond_signal +0 311542/10 12 syscall -> lwp_sigmask +0 311542/10 7 syscall <- lwp_sigmask +0 311542/10 29 syscall -> lwp_exit +0 311542/2 13322 syscall <- lwp_cond_wait +0 311542/2 22 syscall -> lwp_park +0 311542/2 8 syscall <- lwp_park +0 311542/2 17 syscall -> mprotect +0 311542/2 16 syscall <- mprotect +0 311542/2 12 syscall -> lwp_cond_signal +0 311542/2 7 syscall <- lwp_cond_signal +0 311542/2 8 syscall -> lwp_cond_wait +0 311542/3 750221 syscall <- lwp_cond_wait +0 311542/3 36 syscall -> mprotect +0 311542/3 9 syscall <- mprotect +0 311542/3 7 syscall -> mprotect +0 311542/3 8 syscall <- mprotect +0 311542/3 14 syscall -> mprotect +0 311542/3 6 syscall <- mprotect +0 311542/3 40 syscall -> lwp_cond_signal +0 311542/3 7 syscall <- lwp_cond_signal +0 311542/3 7 syscall -> lwp_sigmask +0 311542/3 6 syscall <- lwp_sigmask +0 311542/3 11 syscall -> lwp_exit +0 311542/2 184 syscall <- lwp_cond_wait +0 311542/2 16 syscall -> lwp_sigmask +0 311542/2 6 syscall <- lwp_sigmask +0 311542/2 108 syscall -> unlink +0 311542/2 36 syscall <- unlink +0 311542/2 9 syscall -> lwp_sigmask +0 311542/2 6 syscall <- lwp_sigmask +0 311542/2 50 syscall -> lwp_exit +0 311542/1 6423404 syscall <- lwp_wait +0 311542/1 40 syscall -> open64 +0 311542/1 101 syscall <- open64 +0 311542/1 8 syscall -> ioctl +0 311542/1 14 syscall <- ioctl +0 311542/1 10 syscall -> close +0 311542/1 14 syscall <- close +0 311542/1 8 syscall -> open64 +0 311542/1 31 syscall <- open64 +0 311542/1 7 syscall -> ioctl +0 311542/1 7 syscall <- ioctl +0 311542/1 7 syscall -> close +0 311542/1 9 syscall <- close +0 311542/1 27 syscall -> rexit +0 311542/9 3298915 syscall <- lwp_cond_wait +0 311542/8 3375816 syscall <- lwp_cond_wait +0 311542/7 3376775 syscall <- lwp_cond_wait +0 311542/5 3738267 syscall <- lwp_cond_wait +0 311542/4 3760581 syscall <- lwp_cond_wait +0 311542/6 3376767 syscall <- lwp_park + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_thread_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_thread_example.txt new file mode 100644 index 00000000000..3c5e83c6ee0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_thread_example.txt @@ -0,0 +1,20 @@ +Following we see examples of the results of running j_thread.d. + +Here it is running while Code/Java/Func_abc is executing. + +# j_thread.d +TIME PID/TID -- THREAD +2007 Sep 24 04:01:34 311512/5 => Finalizer +2007 Sep 24 04:01:34 311512/4 => Reference Handler +2007 Sep 24 04:01:34 311512/7 => CompilerThread0 +2007 Sep 24 04:01:34 311512/6 => Signal Dispatcher +2007 Sep 24 04:01:34 311512/8 => CompilerThread1 +2007 Sep 24 04:01:34 311512/9 => Low Memory Detector +^C + +The fields of the output are, in order, Event time, Process ID/Thread ID, +entry (=>) or exit (<=) and Thread name. + +In this example we see six different threads starting, but we do not see +thread exit events as the JVM exited when the program stopped. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_who_example.txt new file mode 100644 index 00000000000..f765d4852b8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_who_example.txt @@ -0,0 +1,17 @@ +In many cases, in order to get interesting or in-depth results the +ExtendedDTraceProbes flag needs to be set when DTracing Java programs. In +this case, because of the probes we have chosen to trace, running the program +Code/Java/Func_abc, both with (PID 311517) and without (311526) this flag, +and we can see that it has made no difference, with each reporting 35 lines +executed. + +# j_who.d +Tracing... Hit Ctrl-C to end. +^C + PID UID CALLS ARGS + 194441 100 18 /usr/local/lib/opera/9.02-20060919.1/opera + 309790 100 20 java_vm + 311517 100 35 java -XX:+ExtendedDTraceProbes Func_abc + 311526 100 35 java Func_abc + + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_calldist_example.txt new file mode 100644 index 00000000000..57058b7d9a7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_calldist_example.txt @@ -0,0 +1,110 @@ +The following are examples of running js_calldist.d. + +Here it is running while the code at Code/JavaScript/func_clock.html is +being executed. + +# js_calldist.d +Tracing... Hit Ctrl-C to end. +^C + +Elapsed times (us), + func_clock.html, obj-new, Date + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 16 | 0 + + +Exclusive function elapsed times (us), + func_clock.html, func, setTimeout + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 128 | 0 + + func_clock.html, func, getElementById + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@ 1 + 16 |@@@@@@@@@@@@@@@@@@ 9 + 32 |@@@@@@@@@@@@@@@@@@@@ 10 + 64 | 0 + + func_clock.html, func, start + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 2048 | 0 + + func_clock.html, func, func_a + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 32768 | 0 + + func_clock.html, func, func_b + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 65536 | 0 + + func_clock.html, func, func_c + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 65536 | 0 + + +Inclusive function elapsed times (us), + func_clock.html, func, setTimeout + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 128 | 0 + + func_clock.html, func, getElementById + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@ 1 + 16 |@@@@@@@@@@@@@@@@@@ 9 + 32 |@@@@@@@@@@@@@@@@@@@@ 10 + 64 | 0 + + func_clock.html, func, func_c + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 65536 | 0 + + func_clock.html, func, func_a + value ------------- Distribution ------------- count + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 131072 | 0 + + func_clock.html, func, func_b + value ------------- Distribution ------------- count + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 131072 | 0 + + func_clock.html, func, start + value ------------- Distribution ------------- count + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 131072 | 0 + +The elapsed times show us that the script spent some small amount of time +processing various events that were not functions. In this case there was +five new Date objects, and each event took between 8 microseconds and 15 +microseconds. + +The exclusive function elapsed times show the time each of our functions +takes, excluding the time spent in subroutines called by that function. We +can see in this example that func_a took between 16384 microseconds and 32767 +microseconds. + +The inclusive function elapsed times show that func_a took between 65536 +microseconds and 131071 microseconds, including the time spent in any +subroutines it calls. + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_calls_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_calls_example.txt new file mode 100644 index 00000000000..848e4362c9d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_calls_example.txt @@ -0,0 +1,312 @@ +The following are examples of the results of running js_calls.d + +A JavaScript program that behaves like a clock is frequently used by these +examples, since it can be left running in the background without browser +input. Browser input, such as hitting the reload button or using menus, +triggers many other JavaScript events since much of the browser uses +JavaScript. + +With Code/JavaScript/func_clock.html loaded, we trace one second of activity: + +# js_calls.d +Tracing... Hit Ctrl-C to end. +^C + FILE TYPE NAME CALLS + func_clock.html exec . 1 + func_clock.html func func_a 1 + func_clock.html func func_b 1 + func_clock.html func func_c 1 + func_clock.html func setTimeout 1 + func_clock.html func start 1 + func_clock.html obj-new Date 1 + func_clock.html func getElementById 4 + +This shows the type of calls made, 1 exec, one obj-new, several func; a more +descriptive name of each call; and a count of how many times a particular call +was made. + + +The following demonstrates what happens when a different program - +Code/JavaScript/func_slow.html is reloaded by hitting the reload button on the +browser. Apart from the func_slow.html JavaScript events, all those events +from the browser caused by moving the mouse pointer over the screen etc. have +been traced as well. + +# js_calls.d +Tracing... Hit Ctrl-C to end. + + FILE TYPE NAME CALLS + obj-free BarProp 1 + obj-free CSSStyleDeclaration 1 + obj-free Global Scope Polluter 1 + obj-free HTMLCollection 1 + obj-free HTMLDocument 1 + obj-free HTMLHtmlElement 1 + obj-free KeyboardEvent 1 + obj-free Location 1 + obj-free NodeList 1 + obj-free StyleSheetList 1 + obj-free TreeSelection 1 + obj-free Window 1 + obj-free XULCommandDispatcher 1 + obj-free chrome://global/content/bindings/scrollbar.xml#scrollbar 8c35ec2 1 + obj-free nsXPCComponents_Classes 1 + obj-free xpcTempGlobalClass 1 + obj-new BarProp 1 + obj-new CSSStyleDeclaration 1 + obj-new Global Scope Polluter 1 + obj-new HTMLCollection 1 + obj-new HTMLDocument 1 + obj-new HTMLHtmlElement 1 + obj-new KeyboardEvent 1 + obj-new NodeList 1 + obj-new StyleSheetList 1 + obj-new TreeSelection 1 + obj-new Window 1 + obj-new XULCommandDispatcher 1 + obj-new chrome://global/content/bindings/popup.xml#popup 8befc22 1 + obj-new chrome://global/content/bindings/popup.xml#popup 8befcea 1 + obj-new chrome://global/content/bindings/scrollbar.xml#scrollbar 8ce1c1a 1 + obj-new nsXPCComponents_Classes 1 + obj-new xpcTempGlobalClass 1 + autocomplete.xml func apply 1 + autocomplete.xml func attachController 1 + autocomplete.xml func detachController 1 + autocomplete.xml func fireEvent 1 + autocomplete.xml func getPreventDefault 1 + autocomplete.xml func handleEnter 1 + autocomplete.xml func onKeyPress 1 + autocomplete.xml obj-new Object 1 + browser.js func BrowserLoadURL 1 + browser.js func SetPageProxyState 1 + browser.js func URLBarFocusHandler 1 + browser.js func UpdateBackForwardButtons 1 + browser.js func addEventListener 1 + browser.js func addToUrlbarHistory 1 + browser.js func canonizeUrl 1 + browser.js func charsetLoadListener 1 + browser.js func checkForDirectoryListing 1 + browser.js func contentAreaClick 1 + browser.js func createExposableURI 1 + browser.js func createFixupURI 1 + browser.js func getShortcutOrURI 1 + browser.js func getWebNavigation 1 + browser.js func handleURLBarCommand 1 + browser.js func isSuccessCode 1 + browser.js func markPageAsTyped 1 + browser.js func resolveKeyword 1 + browser.js func search 1 + browser.js func test 1 + browser.js func updateLastVisitedDate 1 + browser.js obj-new Object 1 + browser.js obj-new XPC_WN_NoMods_Proto_JSClass 1 + browser.js obj-new nsJSCID 1 + browser.xml func attachFormFill 1 + browser.xml func getAttribute 1 + browser.xml func getBoolPref 1 + consoleAPI.js obj-new Call 1 + findBar.js func getElementById 1 + firebug.js func addEventListener 1 + firebug.js obj-new Constructor 1 + firebug.js obj-new Location 1 + firebug.js obj-new Object 1 + firebug.js obj-new XPC_WN_ModsAllowed_Proto_JSClass 1 + func_slow.html exec . 1 + func_slow.html func func_a 1 + func_slow.html func func_b 1 + func_slow.html func func_c 1 + func_slow.html obj-new Function 1 + preferences.js obj-new nsJSCID 1 + reporterOverlay.js func getElementById 1 + reporterOverlay.js func setAttribute 1 + tabbox.xml func getAttribute 1 + tabbrowser.xml func QueryInterface 1 + tabbrowser.xml func getAnonymousElementByAttribute 1 + tabbrowser.xml func getBrowserIndexForDocument 1 + tabbrowser.xml func indexOf 1 + tabbrowser.xml func push 1 + tabbrowser.xml func setIcon 1 + tabbrowser.xml func setTabTitle 1 + tabbrowser.xml func shouldLoadFavIcon 1 + tabbrowser.xml func updateTitlebar 1 + tabbrowser.xml func useDefaultIcon 1 + tabbrowser.xml obj-new Array 1 + tabbrowser.xml obj-new String 1 + textbox.xml func hasAttribute 1 + textbox.xml func setAttribute 1 + webdeveloper.js func getAttribute 1 + webdeveloper.js func hasAttribute 1 + webdeveloper.js func toLowerCase 1 + webdeveloper.js func webdeveloper_changeOptions 1 + webdeveloper.js func webdeveloper_configureElement 1 + webdeveloper.js func webdeveloper_openToolbarButton 1 + webdeveloper.js func webdeveloper_updateMetaRedirects 1 + webdeveloper.js func webdeveloper_updateRenderMode 1 + webdeveloper.js obj-new Array 1 + webdeveloper.js obj-new String 1 + obj-free BoxObject 2 + obj-free HTMLBodyElement 2 + obj-free JSOptions 2 + obj-free JavaArray 2 + obj-free JavaClass 2 + obj-free JavaMember 2 + obj-free JavaObject 2 + obj-free PageTransitionEvent 2 + obj-free nsJSCID 2 + obj-new BoxObject 2 + obj-new HTMLBodyElement 2 + obj-new JSOptions 2 + obj-new JavaArray 2 + obj-new JavaClass 2 + obj-new JavaMember 2 + obj-new JavaObject 2 + obj-new PageTransitionEvent 2 + autocomplete.xml func ensureRowIsVisible 2 + autocomplete.xml func initSearchNames 2 + autocomplete.xml func select 2 + autocomplete.xml obj-new Function 2 + browser.js func PageProxyClearIcon 2 + browser.js func PageProxySetIcon 2 + browser.js func URLBarClickHandler 2 + browser.js func URLBarMouseDownHandler 2 + browser.js func XPCNativeWrapper function wrapper 2 + browser.js func getService 2 + browser.js func loadURI 2 + browser.js func notifyObservers 2 + css.js func 2 + dom.js func 2 + events.js func 2 + firebug.js func appendChild 2 + firebug.js obj-new XPC_WN_NoMods_Proto_JSClass 2 + general.xml func getAttribute 2 + layout.js func 2 + preferences.js func webdeveloper_getStringPreference 2 + progressmeter.xml func createEvent 2 + progressmeter.xml func dispatchEvent 2 + progressmeter.xml func initEvent 2 + progressmeter.xml func setAttribute 2 + reporterOverlay.js obj-new Function 2 + scrollbar.xml func indexOf 2 + source.js func 2 + style.js func 2 + tabbox.xml func setAttribute 2 + tabbrowser.xml func getBoolPref 2 + tabbrowser.xml func getBrowserAtIndex 2 + tabbrowser.xml func schemeIs 2 + tabbrowser.xml func setAttribute 2 + textbox.xml func setSelectionRange 2 + toolbar.xml func updateStatusText 2 + tree.xml obj-new Function 2 + webdeveloper.js func getElementsByTagName 2 + webdeveloper.js func removeAttribute 2 + obj-free DOM Constructor.prototype 3 + obj-free With 3 + obj-free nsXPCComponents 3 + obj-new Array 3 + obj-new DOM Constructor.prototype 3 + obj-new With 3 + obj-new XPC_WN_NoMods_Proto_JSClass 3 + obj-new nsXPCComponents 3 + autocomplete.xml func getAttribute 3 + browser.js func QueryInterface 3 + func_slow.html func write 3 + globalOverlay.js obj-new Function 3 + progressmeter.xml func getAttribute 3 + progressmeter.xml func round 3 + scrollbar.xml obj-new String 3 + tabbrowser.xml func 3 + tabbrowser.xml func hasAttribute 3 + tabbrowser.xml func updateIcon 3 + text.xml func setAttribute 3 + textbox.xml func removeAttribute 3 + utils.js func join 3 + utils.js func splice 3 + utils.js func toLowerCase 3 + utils.js obj-new Array 3 + utils.js obj-new String 3 + autocomplete.xml func closePopup 4 + browser.js func indexOf 4 + browser.js obj-new Call 4 + browser.xml func getInterface 4 + preferences.js func webdeveloper_getBooleanPreference 4 + tabbrowser.xml func getAttribute 4 + tabbrowser.xml func removeAttribute 4 + utilityOverlay.js func goUpdateGlobalEditMenuItems 4 + utils.js func isElement 4 + obj-free Call 5 + view.js func 5 + obj-free XPCNativeWrapper 6 + obj-free XPC_WN_NoMods_Proto_JSClass 6 + obj-new XPCNativeWrapper 6 + XStringBundle func GetStringFromName 6 + XStringBundle func getString 6 + autocomplete.xml func createEvent 6 + autocomplete.xml func dispatchEvent 6 + autocomplete.xml func initEvent 6 + browser.js func getBrowser 6 + browser.js func setTimeout 6 + browser.js obj-new String 6 + preferences.js func getBranch 6 + preferences.js func getService 6 + preferences.js func prefHasUserValue 6 + preferences.js func webdeveloper_isPreferenceSet 6 + tabbrowser.xml func getBrowserForTab 6 + utils.js func 6 + webdeveloper.js obj-new Function 6 + obj-new Object 7 + firebug.js func removeAttribute 7 + tabbrowser.xml obj-new Function 7 + tree.xml func QueryInterface 7 + obj-free Array 8 + browser.js func hasAttribute 8 + globalOverlay.js func removeAttribute 8 + reporterOverlay.js func 8 + browser.js func getElementById 9 + browser.js func setAttribute 9 + browser.xml obj-new Function 9 + webdeveloper.js func getElementById 9 + obj-free Constructor 10 + obj-free Object 10 + obj-free XPC_WN_ModsAllowed_Proto_JSClass 10 + obj-new Constructor 10 + obj-new XPC_WN_ModsAllowed_Proto_JSClass 10 + browser.js func removeAttribute 10 + firebug.js obj-new Function 10 + text.xml obj-new String 12 + webdeveloper.js func item 14 + firebug.js func getElementById 15 + obj-free XULElement 16 + button.xml func hasAttribute 16 + obj-free Event 17 + browser.js func 17 + obj-new Event 18 + text.xml func getAttribute 19 + firebug.js func getAttribute 20 + globalOverlay.js func setAttribute 20 + obj-free MouseEvent 22 + obj-new MouseEvent 22 + globalOverlay.js func isCommandEnabled 22 + webdeveloper.js func setAttribute 22 + obj-free String 26 + firebug.js func setAttribute 26 + obj-free RegExp 28 + obj-new RegExp 28 + globalOverlay.js func getControllerForCommand 28 + globalOverlay.js func getElementById 28 + globalOverlay.js func goSetCommandEnabled 28 + globalOverlay.js func goUpdateCommand 28 + text.xml func test 28 + browser.js obj-new Function 30 + obj-free XPCWrappedNative_NoHelper 32 + obj-new XPCWrappedNative_NoHelper 32 + consoleAPI.js obj-new Function 33 + browser.xml func QueryInterface 38 + obj-free JavaPackage 41 + obj-new JavaPackage 41 + scrollbar.xml obj-new Function 61 + firebug.js func 62 + text.xml exec . 84 + obj-new XULElement 85 + obj-new Function 172 + obj-free Function 310 + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_calltime_example.txt new file mode 100644 index 00000000000..0b69b76e0a7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_calltime_example.txt @@ -0,0 +1,60 @@ +The following are examples of js_calltime.d. + +This script traces the elapsed time of JavaScript functions and +prints a report. Here it traces the example program, +Code/JavaScript/func_clock.html + +# js_calltime.d +Tracing... Hit Ctrl-C to end. +^C + +Count, + FILE TYPE NAME COUNT + func_clock.html func func_a 3 + func_clock.html func func_b 3 + func_clock.html func func_c 3 + func_clock.html func setTimeout 3 + func_clock.html func start 3 + func_clock.html obj-new Date 3 + func_clock.html func getElementById 12 + - total - 30 + +Elapsed times (us), + FILE TYPE NAME TOTAL + - total - 29 + func_clock.html obj-new Date 29 + +Exclusive function elapsed times (us), + FILE TYPE NAME TOTAL + func_clock.html func setTimeout 229 + func_clock.html func getElementById 378 + func_clock.html func start 4061 + func_clock.html func func_a 51080 + func_clock.html func func_b 102943 + func_clock.html func func_c 153330 + - total - 312024 + +Inclusive function elapsed times (us), + FILE TYPE NAME TOTAL + func_clock.html func setTimeout 229 + func_clock.html func getElementById 378 + func_clock.html func func_c 153454 + func_clock.html func func_b 256470 + func_clock.html func func_a 307601 + func_clock.html func start 312054 + +Counts shows us how many times each different function was called, and how +many functions were called in total. + +The elapsed time shows us the time spent not in a JavaScript function. + +The exclusive function elapsed times show the time that each function spent +processing code - while not in other functions. + +The inclusive function elapsed times show the time that each function spent +processing code, including the time spent in other calls. + +These elapsed times are the absolute time from when the function began to +when it completed - which includes off-CPU time due to other system events +such as I/O, scheduling, interrupts, etc. + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_cpudist_example.txt new file mode 100644 index 00000000000..c71a2ad82a2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_cpudist_example.txt @@ -0,0 +1,112 @@ +The following are examples of js_cpudist.d. + +This script traces the on-CPU time of JavaScript functions and prints a report +in the form of a histogram. Here it traces the example program, +Code/JavaScript/func_clock.html + +# js_cpudist.d +Tracing... Hit Ctrl-C to end. +^C + +Elapsed times (us), + func_clock.html, obj-new, Date + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 8 | 0 + + +Exclusive function on-CPU times (us), + func_clock.html, func, setTimeout + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@ 2 + 64 |@@@@@@@@@@@@@@@@@@@@ 2 + 128 | 0 + + func_clock.html, func, getElementById + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@ 4 + 16 |@@@@@@@@@@ 4 + 32 |@@@@@@@@@@@@@@@@@@@@ 8 + 64 | 0 + + func_clock.html, func, start + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 1024 | 0 + + func_clock.html, func, func_a + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 32768 | 0 + + func_clock.html, func, func_b + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 65536 | 0 + + func_clock.html, func, func_c + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 65536 | 0 + + +Inclusive function on-CPU times (us), + func_clock.html, func, setTimeout + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@ 2 + 64 |@@@@@@@@@@@@@@@@@@@@ 2 + 128 | 0 + + func_clock.html, func, getElementById + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@ 4 + 16 |@@@@@@@@@@ 4 + 32 |@@@@@@@@@@@@@@@@@@@@ 8 + 64 | 0 + + func_clock.html, func, func_c + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 65536 | 0 + + func_clock.html, func, func_a + value ------------- Distribution ------------- count + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 131072 | 0 + + func_clock.html, func, func_b + value ------------- Distribution ------------- count + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 131072 | 0 + + func_clock.html, func, start + value ------------- Distribution ------------- count + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 131072 | 0 + +The first section, Exclusive function on-CPU times, shows us the time spent +on-CPU by various functions, not including time spent in subroutines. You can +see here that func_a had four instances of being on-CPU between 16384 +microseconds and 32767 microseconds. + +The second section, Inclusive function on-CPU times, shows us the time spent +on-CPU by various functions, including that time spent in subroutines called +by those functions. You can see that here func_a had four instances of being +on-CPU between 65536 microseconds and 131071 microseconds. + +It is important to pay close attention to the third column, "count" as this +will indicate if there were any instances in a particular timeframe, even if +the number is too small to show up on the histogram clearly. diff --git a/cddl/contrib/dtracetoolkit/Examples/js_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_cputime_example.txt new file mode 100644 index 00000000000..dff42fdca9f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_cputime_example.txt @@ -0,0 +1,69 @@ +The following are examples of js_cputime.d. + +This script traces the on-CPU time of JavaScript functions and prints a report. +Here it traces the example program, Code/JavaScript/func_clock.html + +# js_cputime.d +Tracing... Hit Ctrl-C to end. +^C + +Count, + FILE TYPE NAME COUNT + func_clock.html func func_a 5 + func_clock.html func func_b 5 + func_clock.html func func_c 5 + func_clock.html func setTimeout 5 + func_clock.html func start 5 + func_clock.html obj-new Date 5 + func_clock.html func getElementById 20 + - total - 50 + +Elapsed times (us), + FILE TYPE NAME TOTAL + - total - 37 + func_clock.html obj-new Date 37 + +Exclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + func_clock.html func setTimeout 316 + func_clock.html func getElementById 588 + func_clock.html func start 4734 + func_clock.html func func_a 83465 + func_clock.html func func_b 166613 + func_clock.html func func_c 247683 + - total - 503402 + +Inclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + func_clock.html func setTimeout 316 + func_clock.html func getElementById 588 + func_clock.html func func_c 247872 + func_clock.html func func_b 414601 + func_clock.html func func_a 498142 + func_clock.html func start 503439 + +You can see the results are printed in four sections. + +The first section reports how many times each subroutine was called, and it's +type. + +The second section reports on the on-CPU time of anything that was not of type +"func", in this case the only elements reported here are Date obj-new. + +The exclusive subroutine on-CPU times shows, amongst other results, that func_a +spent around 83,000 microseconds on-CPU. This time excludes time spent in +other subroutines. + +The inclusive subroutine on-CPU times show that func_a spent around 0.5 +seconds on-CPU. This includes the time spent in other subroutines +called. + +These on-CPU times are the time the thread spent running on a CPU, from when +the subroutine began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_execs_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_execs_example.txt new file mode 100644 index 00000000000..d555c1a1c27 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_execs_example.txt @@ -0,0 +1,15 @@ +The following examples show the results of running the script js_execs.d. + +Here it runs on the program Code/JavaScript/func_clock.html. The script will +show you every time something is executed, including page reloads and +timeouts. + +# js_execs.d +TIME FILE:LINENO +2007 Sep 23 22:54:31 func_clock.html:32 +2007 Sep 23 22:54:32 func_clock.html:32 +2007 Sep 23 22:54:34 func_clock.html:32 +2007 Sep 23 22:54:35 func_clock.html:32 +2007 Sep 23 22:54:36 func_clock.html:32 +^C + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_flow_example.txt new file mode 100644 index 00000000000..7a9278d7ce6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_flow_example.txt @@ -0,0 +1,41 @@ +The following are examples of js_flow.d. + +This is a simple script to trace the flow of JavaScript functions. +Here it traces the example program, Code/JavaScript/func_clock.html + +# js_flow.d + C TIME(us) FILE -- FUNC + 0 3650471830941 func_clock.html -> start + 0 3650471831005 func_clock.html -> getElementById + 0 3650471831058 func_clock.html <- getElementById + 0 3650471831890 func_clock.html -> func_a + 0 3650471831906 func_clock.html -> getElementById + 0 3650471831929 func_clock.html <- getElementById + 0 3650471850084 func_clock.html -> func_b + 0 3650471850111 func_clock.html -> getElementById + 0 3650471850146 func_clock.html <- getElementById + 0 3650471886534 func_clock.html -> func_c + 0 3650471886573 func_clock.html -> getElementById + 0 3650471886624 func_clock.html <- getElementById + 0 3650471942212 func_clock.html <- func_c + 0 3650471942231 func_clock.html <- func_b + 0 3650471942242 func_clock.html <- func_a + 0 3650471942300 func_clock.html -> setTimeout + 0 3650471942392 func_clock.html <- setTimeout + 0 3650471942404 func_clock.html <- start +^C + +The fourth column is indented by 2 spaces to show when a new function begins. +This shows which function is calling which - the output above shows that +func_a called func_b, which in turn called func_c. + +The TIME(us) column shows time from boot in microseconds. + +The FILE column shows the file that was being executed. + +If the output looks strange, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_flowinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_flowinfo_example.txt new file mode 100644 index 00000000000..45970c1f9e6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_flowinfo_example.txt @@ -0,0 +1,42 @@ +Following are examples of js_flowinfo.d. + +This is a simple script to trace the flow of JavaScript functions. Here it +traces the example program Code/JavaScript/func_clock.html + +# js_flowinfo.d + C PID DELTA(us) FILE:LINE TYPE -- FUNC + 0 11651 2 .:0 func -> start + 0 11651 75 func_clock.html:30 func -> getElementById + 0 11651 51 func_clock.html:- func <- getElementById + 0 11651 479 func_clock.html:31 func -> func_a + 0 11651 25 func_clock.html:21 func -> getElementById + 0 11651 23 func_clock.html:- func <- getElementById + 0 11651 30611 func_clock.html:25 func -> func_b + 0 11651 79 func_clock.html:13 func -> getElementById + 0 11651 51 func_clock.html:- func <- getElementById + 0 11651 33922 func_clock.html:17 func -> func_c + 0 11651 75 func_clock.html:6 func -> getElementById + 0 11651 50 func_clock.html:- func <- getElementById + 0 11651 50481 func_clock.html:- func <- func_c + 0 11651 24 func_clock.html:- func <- func_b + 0 11651 10 func_clock.html:- func <- func_a + 0 11651 39 func_clock.html:32 func -> setTimeout + 0 11651 118 func_clock.html:- func <- setTimeout + 0 11651 11 func_clock.html:- func <- start +^C + +As each function is entered, the last column is indented by 2 spaces. This +shows which function is calling which. + +The DELTA(us) column shows the change in time from the previous line to the +current line. + +The FILE::LINE column shows which line in which file was being executed. Refer +to the source program to see what this line refers to. + +If the output looks shuffled, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_flowtime_example.txt new file mode 100644 index 00000000000..46b2f2f12b2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_flowtime_example.txt @@ -0,0 +1,42 @@ +The following are examples of js_flowtime.d. + +This is a simple script to trace the flow of JavaScript functions. +Here it traces the example program, Code/JavaScript/func_clock.html + +# js_flowtime.d + C TIME(us) FILE DELTA(us) -- FUNC + 0 3650523390654 func_clock.html 2 -> start + 0 3650523390721 func_clock.html 67 -> getElementById + 0 3650523390773 func_clock.html 51 <- getElementById + 0 3650523391609 func_clock.html 835 -> func_a + 0 3650523391627 func_clock.html 18 -> getElementById + 0 3650523391651 func_clock.html 23 <- getElementById + 0 3650523409735 func_clock.html 18084 -> func_b + 0 3650523409763 func_clock.html 27 -> getElementById + 0 3650523409795 func_clock.html 32 <- getElementById + 0 3650523445921 func_clock.html 36125 -> func_c + 0 3650523445959 func_clock.html 38 -> getElementById + 0 3650523446004 func_clock.html 44 <- getElementById + 0 3650523500557 func_clock.html 54552 <- func_c + 0 3650523500581 func_clock.html 24 <- func_b + 0 3650523500593 func_clock.html 11 <- func_a + 0 3650523500648 func_clock.html 54 -> setTimeout + 0 3650523500736 func_clock.html 88 <- setTimeout + 0 3650523500749 func_clock.html 12 <- start +^C + +The fifth column is indented by 2 spaces to show when a new function begins. +This shows which function is calling which. + +The TIME(us) column shows time since boot. + +The DELTA(us) column shows time from that line to the previous line, and +so can be a bit tricky to read. For example, the second line of data output +shows that a getElementById function happened 67 microseconds after start. + +The FILE column shows file that was being executed. + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. diff --git a/cddl/contrib/dtracetoolkit/Examples/js_objcpu_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_objcpu_example.txt new file mode 100644 index 00000000000..9e9a957ff9b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_objcpu_example.txt @@ -0,0 +1,317 @@ +The following are examples of running js_objcpu.d. + +This script will show the time on-CPU of object creation events in graphical +format. + +Here we see it running on Code/JavaScript/func_clock.html + +# js_objcpu.d +Tracing... Hit Ctrl-C to end. +^C +Total object creation on-CPU time (ms): 0 + +Object creation on-CPU time distributions (us), + + Date + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 16 | 0 + +We can see that there were two object creation events, both of type 'Date' +that spent between 8 microseconds and 15 microseconds on-CPU each. + + +Here we see the results of having Code/JavaScript/func_slow.html in a browser +window and hitting reload. This includes events that happen due to mouse +movement. + +# js_objcpu.d +Tracing... Hit Ctrl-C to end. +^C +Total object creation on-CPU time (ms): 2 + +Object creation on-CPU time distributions (us), + + HTMLBodyElement + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + HTMLCollection + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + HTMLDocument + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + HTMLHtmlElement + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + Location + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + NodeList + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + StyleSheetList + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + Window + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + chrome://global/content/bindings/popup.xml#popup 8830492 + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + chrome://global/content/bindings/scrollbar.xml#scrollbar 8beef52 + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + BarProp + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + BoxObject + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + CSSStyleDeclaration + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + chrome://global/content/bindings/popup.xml#popup 8bef592 + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + nsXPCComponents_Classes + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + nsJSCID + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + nsXPCComponents + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + Global Scope Polluter + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + JavaArray + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + JavaClass + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + JavaMember + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + JavaObject + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + KeyboardEvent + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + XPC_WN_NoMods_Proto_JSClass + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 |@@@@@@@@@@ 1 + 8 | 0 + + PageTransitionEvent + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 |@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + JSOptions + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 16 | 0 + + Call + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 8 | 0 + + DOM Constructor.prototype + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 4 | 0 + 8 | 0 + 16 |@@@@@@@@@@@@@ 1 + 32 | 0 + + With + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@ 1 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 16 | 0 + + Constructor + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9 + 4 |@@@@ 1 + 8 | 0 + + Object + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@ 3 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 8 | 0 + + XPCNativeWrapper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 8 |@@@@@@@ 1 + 16 | 0 + + XULElement + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@ 5 + 4 |@@@@@@@@@@@@@@@@@@ 4 + 8 | 0 + + Array + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@ 2 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 8 | 0 + + XPCWrappedNative_NoHelper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@ 3 + 4 |@@@@@@@@@@@@@@@@@@@@ 4 + 8 |@@@@@ 1 + 16 | 0 + + XPC_WN_ModsAllowed_Proto_JSClass + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 4 |@@@@@@@@@@@@ 3 + 8 |@@@@ 1 + 16 | 0 + + MouseEvent + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@ 3 + 8 |@@@@@@@@@@@@@@@@@@@@@@@ 4 + 16 | 0 + + String + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 11 + 8 | 0 + + Event + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 8 |@@@@@@@@@ 3 + 16 | 0 + + JavaPackage + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 40 + 4 | 0 + 8 |@ 1 + 16 | 0 + + Function + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 246 + 4 |@@@@@@@ 58 + 8 |@ 8 + 16 |@ 9 + 32 | 0 + + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_objgc_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_objgc_example.txt new file mode 100644 index 00000000000..711b223d08e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_objgc_example.txt @@ -0,0 +1,230 @@ +Following are examples of running js_objgc.d. + +This script reports on the garbage collection of Java objects. That is it +will keep track of when resources are allocated to an object, and when +resources are freed from an object. It is useful for providing information on +when garbage collection is not working correctly, as this can cause the +browser to have a memory leak. + +We trace object creation (+1) and destruction (-1), and provide a summary +each second of the running tally of the object class and originating filename. + +Here we can see it running on Code/JavaScript/func_clock.html + +# js_objgc.d +Tracing... Hit Ctrl-C to end. + + FILE TOTAL CLASS 2007 Sep 23 22:59:24 + func_clock.html 1 Date + + FILE TOTAL CLASS 2007 Sep 23 22:59:25 + func_clock.html 2 Date + + FILE TOTAL CLASS 2007 Sep 23 22:59:26 + func_clock.html 3 Date + + FILE TOTAL CLASS 2007 Sep 23 22:59:27 + func_clock.html 4 Date + + FILE TOTAL CLASS 2007 Sep 23 22:59:28 + func_clock.html 5 Date + + FILE TOTAL CLASS 2007 Sep 23 22:59:29 + browser.js 3 Function + 5 Function + func_clock.html 6 Date + 7 MouseEvent + + FILE TOTAL CLASS 2007 Sep 23 22:59:30 + browser.js 3 Function + 5 Function + func_clock.html 7 Date + 10 MouseEvent + + FILE TOTAL CLASS 2007 Sep 23 22:59:31 + 1 Constructor + 1 HTMLBodyElement + 1 XPCNativeWrapper + 1 XPC_WN_ModsAllowed_Proto_JSClass + browser.js 1 Array + browser.js 1 XPCNativeWrapper + popup.xml 1 Array + func_clock.html 7 Date + 13 MouseEvent + 18 Function + browser.js 20 Function + + FILE TOTAL CLASS 2007 Sep 23 22:59:32 + 1 BoxObject + 1 Constructor + 1 HTMLBodyElement + 1 NodeList + 1 UIEvent + 1 XPCNativeWrapper + 1 XPC_WN_ModsAllowed_Proto_JSClass + 1 chrome://global/content/bindings/menu.xml#menu-iconic 84ff45a + 1 chrome://global/content/bindings/menu.xml#menu-iconic 8befbba + bookmarksMenu.js 1 Function + browser.js 1 Array + browser.js 1 XPCNativeWrapper + popup.xml 1 Function + scrollbox.xml 1 Function + 2 Event + popup.xml 2 Array + bookmarks.js 3 With + firebug-service.js 3 Object + bookmarks.js 6 Object + bookmarks.js 6 XPCWrappedNative_NoHelper + func_clock.html 8 Date + firebug-service.js 10 Function + 15 MouseEvent + bookmarks.js 19 Error + browser.js 20 Function + bookmarks.js 22 Function + 39 XPCWrappedNative_NoHelper + 44 Function + 60 RegExp + 191 XULElement + +[... 39 seconds deleted ...] + + FILE TOTAL CLASS 2007 Sep 23 23:00:10 + 1 HTMLBodyElement + 1 HTMLCollection + 1 TreeColumns + 1 XPCNativeWrapper + 1 XPC_WN_NoMods_Proto_JSClass + 1 XULTreeBuilder + 1 chrome://global/content/bindings/menu.xml#menu-iconic 84ff45a + 1 chrome://global/content/bindings/menu.xml#menu-iconic 8befbba + 1 chrome://global/content/bindings/tree.xml#treebody 84caa3a + 1 chrome://global/content/bindings/tree.xml#treebody 84e3a72 + 1 nsXPCComponents_Interfaces + 1 nsXPCComponents_Results + bookmarksMenu.js 1 Function + browser.js 1 Array + browser.js 1 XPCNativeWrapper + browser.js 1 XPC_WN_NoMods_Proto_JSClass + nsUpdateService.js 1 XPC_WN_NoMods_Proto_JSClass + nsUpdateService.js 1 nsJSCID + popup.xml 1 Function + scrollbar.xml 1 String + scrollbox.xml 1 Function + tree.xml 1 Array + 2 Constructor + 2 UIEvent + 2 XPC_WN_ModsAllowed_Proto_JSClass + 2 nsXPCComponents_Classes + browser.js 2 nsJSCID + browser.js 2 nsJSIID + utilityOverlay.js 2 nsJSCID + utilityOverlay.js 2 nsJSIID + 3 Array + 3 NodeList + nsUpdateService.js 3 Array + nsUpdateService.js 3 Object + nsUpdateService.js 3 With + utilityOverlay.js 3 Call + tree.xml 4 Function + utilityOverlay.js 4 Function + nsUpdateService.js 7 nsJSIID + nsUpdateService.js 15 Function + bookmarks.js 22 Function + text.xml 23 String + 36 BoxObject + func_clock.html 42 Date + bookmarks.js 57 With + firebug-service.js 57 Object + bookmarks.js 73 Error + browser.js 78 Function + popup.xml 82 Array + bookmarks.js 114 Object + bookmarks.js 114 XPCWrappedNative_NoHelper + 157 MouseEvent + firebug-service.js 172 Function + 307 XPCWrappedNative_NoHelper + 388 RegExp + 488 Event + 876 XULElement + 1221 Function + + FILE TOTAL CLASS 2007 Sep 23 23:00:11 + -94 Date + -34 Function + -4 MouseEvent + -2 Array + -1 HTMLBodyElement + -1 HTMLCollection + -1 XPCNativeWrapper + -1 XPC_WN_ModsAllowed_Proto_JSClass + 0 Array + 0 HTMLBodyElement + 0 HTMLCollection + 0 RegExp + 0 TreeColumns + 0 UIEvent + 0 XPC_WN_NoMods_Proto_JSClass + 0 XULTreeBuilder + 0 nsXPCComponents_Classes + 0 nsXPCComponents_Interfaces + 0 nsXPCComponents_Results + browser.js 0 Array + browser.js 0 XPCNativeWrapper + browser.js 0 XPC_WN_NoMods_Proto_JSClass + browser.js 0 nsJSCID + nsUpdateService.js 0 Array + nsUpdateService.js 0 Function + nsUpdateService.js 0 Object + nsUpdateService.js 0 With + nsUpdateService.js 0 XPC_WN_NoMods_Proto_JSClass + nsUpdateService.js 0 nsJSCID + nsUpdateService.js 0 nsJSIID + scrollbar.xml 0 String + text.xml 0 String + tree.xml 0 Array + utilityOverlay.js 0 Call + utilityOverlay.js 0 Function + utilityOverlay.js 0 nsJSCID + 1 NodeList + 1 XPCNativeWrapper + 1 chrome://global/content/bindings/menu.xml#menu-iconic 84ff45a + 1 chrome://global/content/bindings/menu.xml#menu-iconic 8befbba + 1 chrome://global/content/bindings/tree.xml#treebody 84caa3a + 1 chrome://global/content/bindings/tree.xml#treebody 84e3a72 + bookmarksMenu.js 1 Function + browser.xul 1 Function + func_clock.html 1 Date + popup.xml 1 Function + scrollbox.xml 1 XULElement + scrollbox.xml 1 nsJSIID + 2 Constructor + 2 XPC_WN_ModsAllowed_Proto_JSClass + browser.js 2 nsJSIID + scrollbox.xml 2 Function + tree.xml 2 Function + utilityOverlay.js 2 nsJSIID + popup.xml 3 Array + bookmarks.js 5 With + firebug-service.js 5 Object + 6 Event + 6 MouseEvent + bookmarks.js 9 XPCWrappedNative_NoHelper + 10 XPCWrappedNative_NoHelper + bookmarks.js 10 Object + browser.js 10 Function + bookmarks.js 15 Function + firebug-service.js 16 Function + 18 BoxObject + bookmarks.js 75 Error + 79 Function + 315 XULElement +^C + +Just after time 23:00:10, garbage collection fired cleaning up many objects. +The final output shows a much reduced object count including a negative +count for objects created before this script was tracing. + +If over the period of several minutes an object type is still steadily +increasing, then that would be of interest. Be patient, depending on the rate +of object creation it can take over ten minutes for garbage collect to kick in. + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_objnew_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_objnew_example.txt new file mode 100644 index 00000000000..c3a888120f7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_objnew_example.txt @@ -0,0 +1,100 @@ +The following are examples of the results of running js_objnew.d. + +It reports on the class type of new objects created. + +Here we can see it running on the program Code/JavaScript/func_clock.html. + +# js_objnew.d +Tracing... Hit Ctrl-C to end. +^C + FILE CLASS COUNT + func_clock.html Date 2 + +The results are very simple, func_clock.html caused two new objects to be +created, both of type 'Date'. + + +Here is a more complicated example, running on the program +Code/JavaScript/func_slow.html, with the results of that plus JavaScript caused +by hitting reload on the browser. + + +# js_objnew.d +Tracing... Hit Ctrl-C to end. +^C + FILE CLASS COUNT + BarProp 1 + CSSStyleDeclaration 1 + Global Scope Polluter 1 + HTMLBodyElement 1 + HTMLDocument 1 + HTMLHtmlElement 1 + NodeList 1 + StyleSheetList 1 + TreeSelection 1 + Window 1 + XULCommandDispatcher 1 + chrome://global/content/bindings/popup.xml#popup 8c35c92 1 + chrome://global/content/bindings/popup.xml#popup 8fb299a 1 + chrome://global/content/bindings/scrollbar.xml#scrollbar 8fb2ea2 1 + nsXPCComponents_Classes 1 + xpcTempGlobalClass 1 + autocomplete.xml Object 1 + browser.js Array 1 + browser.js Object 1 + browser.js XPC_WN_NoMods_Proto_JSClass 1 + browser.js nsJSCID 1 + consoleAPI.js Call 1 + firebug.js Constructor 1 + firebug.js Location 1 + firebug.js Object 1 + firebug.js XPC_WN_ModsAllowed_Proto_JSClass 1 + func_slow.html Function 1 + popup.xml Array 1 + preferences.js nsJSCID 1 + tabbrowser.xml Array 1 + tabbrowser.xml String 1 + webdeveloper.js Array 1 + webdeveloper.js String 1 + BoxObject 2 + JSOptions 2 + JavaArray 2 + JavaClass 2 + JavaMember 2 + JavaObject 2 + PageTransitionEvent 2 + autocomplete.xml Function 2 + firebug.js XPC_WN_NoMods_Proto_JSClass 2 + reporterOverlay.js Function 2 + tree.xml Function 2 + Array 3 + DOM Constructor.prototype 3 + With 3 + XPC_WN_NoMods_Proto_JSClass 3 + nsXPCComponents 3 + globalOverlay.js Function 3 + scrollbar.xml String 3 + utils.js Array 3 + utils.js String 3 + browser.js Call 4 + func_clock.html Date 4 + webdeveloper.js Function 4 + XPCNativeWrapper 5 + browser.js String 6 + Object 7 + tabbrowser.xml Function 7 + XPC_WN_ModsAllowed_Proto_JSClass 8 + Constructor 9 + browser.xml Function 9 + firebug.js Function 10 + MouseEvent 12 + XPCWrappedNative_NoHelper 13 + KeyboardEvent 14 + XULElement 16 + Event 29 + browser.js Function 33 + consoleAPI.js Function 33 + JavaPackage 41 + scrollbar.xml Function 61 + Function 211 + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_stat_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_stat_example.txt new file mode 100644 index 00000000000..b658b4f0542 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_stat_example.txt @@ -0,0 +1,35 @@ +The following are examples of running js_stat.d + +Here is the result after running the program Code/JavaScript/func_clock.html. + +# js_stat.d +TIME EXEC/s FUNC/s OBJNEW/s OBJFRE/s +2007 Sep 23 23:04:59 1 9 1 0 +2007 Sep 23 23:05:00 1 9 1 0 +2007 Sep 23 23:05:01 1 9 1 0 +2007 Sep 23 23:05:02 1 6 1 0 +2007 Sep 23 23:05:03 0 3 0 0 +2007 Sep 23 23:05:04 1 9 1 0 +2007 Sep 23 23:05:05 1 9 1 0 +2007 Sep 23 23:05:06 1 9 1 0 +^C + +We can see that at 2007 Sep 23 23:05:02 there was one JavaScript program +executed, six functions called, one new object created and no objects freed. + + +Here is the result after running the program Code/JavaScript/func_slow.html. +This also includes browser JavaScript. + +# js_stat.d +TIME EXEC/s FUNC/s OBJNEW/s OBJFRE/s +2007 Sep 23 23:05:48 1 124 41 0 +2007 Sep 23 23:05:49 1 29 19 0 +2007 Sep 23 23:05:50 1 29 25 0 +2007 Sep 23 23:05:51 1 670 497 0 +2007 Sep 23 23:05:52 0 62 11 0 +2007 Sep 23 23:05:53 0 0 6 617 +2007 Sep 23 23:05:54 0 0 0 0 +2007 Sep 23 23:05:55 0 0 0 0 +^C + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_who_example.txt new file mode 100644 index 00000000000..06e3e31c602 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_who_example.txt @@ -0,0 +1,59 @@ +The following examples are the results of running the js_who.d script while +various JavaScript events happen. + +A JavaScript program that behaves like a clock is frequently used by these +examples, since it can be left running in the background without browser +input. Browser input, such as hitting the reload button or using menus, +triggers many other JavaScript events since much of the browser uses +JavaScript. This makes for interesting longer examples, but would be +overwhelming for example #1. + +In the first example, we can see what happens when we run this program, +Code/JavaScript/func_clock.html + +# js_who.d +Tracing... Hit Ctrl-C to end. +^C + PID UID FUNCS FILE + 10530 100 18 file:///export/home/brendan/Lang/JavaScript/func_clock.html + + +The second example is more complex, the reason for this is that the program +Code/Javascript/func_slow.html was loaded in the browser, and the reload +button was pressed. This output captured the many browser events that occured +when moving the mouse pointer to do so. + +# js_who.d +Tracing... Hit Ctrl-C to end. +^C + PID UID FUNCS FILE + 10530 100 2 chrome://firebug/content/views/css.js + 10530 100 2 chrome://firebug/content/views/dom.js + 10530 100 2 chrome://firebug/content/views/events.js + 10530 100 2 chrome://firebug/content/views/layout.js + 10530 100 2 chrome://firebug/content/views/source.js + 10530 100 2 chrome://firebug/content/views/style.js + 10530 100 2 chrome://global/content/bindings/scrollbar.xml + 10530 100 3 chrome://global/content/bindings/general.xml + 10530 100 3 chrome://global/content/bindings/tabbox.xml + 10530 100 3 chrome://global/content/bindings/text.xml + 10530 100 4 chrome://browser/content/utilityOverlay.js + 10530 100 5 chrome://firebug/content/views/view.js + 10530 100 6 file:///export/home/brendan/Lang/JavaScript/func_slow.html + 10530 100 7 chrome://global/content/bindings/textbox.xml + 10530 100 7 chrome://global/content/bindings/tree.xml + 10530 100 10 chrome://reporter/content/reporterOverlay.js + 10530 100 12 XStringBundle + 10530 100 14 chrome://global/content/bindings/progressmeter.xml + 10530 100 18 file:///export/home/brendan/Lang/JavaScript/func_clock.html + 10530 100 19 chrome://firebug/content/utils.js + 10530 100 30 chrome://webdeveloper/content/common/preferences.js + 10530 100 43 chrome://global/content/bindings/browser.xml + 10530 100 44 chrome://global/content/bindings/tabbrowser.xml + 10530 100 72 chrome://global/content/bindings/button.xml + 10530 100 88 chrome://global/content/bindings/autocomplete.xml + 10530 100 110 chrome://browser/content/browser.js + 10530 100 121 chrome://webdeveloper/content/webdeveloper.js + 10530 100 133 chrome://firebug/content/firebug.js + 10530 100 162 chrome://global/content/globalOverlay.js + diff --git a/cddl/contrib/dtracetoolkit/Examples/kill_example.txt b/cddl/contrib/dtracetoolkit/Examples/kill_example.txt new file mode 100644 index 00000000000..f73621c6d25 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/kill_example.txt @@ -0,0 +1,12 @@ +This is an example of the kill.d DTrace script, + + # kill.d + FROM COMMAND SIG TO RESULT + 2344 bash 2 3117 0 + 2344 bash 9 12345 -1 + ^C + +In the above output, a kill -2 (Ctrl-C) was sent from the bash command +to PID 3177. Then a kill -9 (SIGKILL) was sent to PID 12345 - which +returned a "-1" for failure. + diff --git a/cddl/contrib/dtracetoolkit/Examples/kstat_types_example.txt b/cddl/contrib/dtracetoolkit/Examples/kstat_types_example.txt new file mode 100644 index 00000000000..8ffecbff70e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/kstat_types_example.txt @@ -0,0 +1,1358 @@ +The following are demonstrations of the kstat_types.d script. + + +Here kstat_types.d is used to trace the kstat activity of the vmstat command, + + # ./kstat_types.d + CMD CLASS TYPE MOD:INS:NAME + vmstat . raw :0:kstat_headers + vmstat . raw :0:kstat_headers + vmstat misc named cpu_info:0:cpu_info0 + vmstat misc named cpu:0:vm + vmstat misc named cpu:0:sys + vmstat disk io cmdk:0:cmdk0 + vmstat disk io sd:0:sd0 + vmstat misc raw unix:0:sysinfo + vmstat vm raw unix:0:vminfo + vmstat misc named unix:0:dnlcstats + vmstat misc named unix:0:system_misc + ^C + +Details of each lookup can be seen, including each disk device that +was read. + + + +This is mpstat on a single CPU server, + + # ./kstat_types.d + CMD CLASS TYPE MOD:INS:NAME + mpstat . raw :0:kstat_headers + mpstat . raw :0:kstat_headers + mpstat misc named cpu_info:0:cpu_info0 + mpstat misc named cpu:0:vm + mpstat misc named cpu:0:sys + ^C + +The output shows that the focus was CPU statistics, as expected. + + + +The following has caught in.routed reading some statistics, + + # ./kstat_types.d + CMD CLASS TYPE MOD:INS:NAME + in.routed . raw :0:kstat_headers + in.routed . raw :0:kstat_headers + in.routed net named lo:0:lo0 + in.routed . raw :0:kstat_headers + in.routed . raw :0:kstat_headers + in.routed net named rtls:0:rtls0 + in.routed . raw :0:kstat_headers + in.routed . raw :0:kstat_headers + in.routed net named rtls:0:rtls0 + ^C + +Which shows that the network interfaces were checked. + + + +Finally, this is the kstats used when a "sar -u 1 1" command is run. +ie, this thing, + + $ sar -u 1 1 + + SunOS jupiter 5.10 Generic i86pc 04/21/2006 + + 23:28:53 %usr %sys %wio %idle + 23:28:54 1 3 0 96 + +sar actually forks a child "sadc" to do the lookups. sadc caused the +following kstat lookups (I'm not making this up), + + # ./kstat_types.d + CMD CLASS TYPE MOD:INS:NAME + sadc . raw :0:kstat_headers + sadc . raw :0:kstat_headers + sadc misc named unix:0:system_misc + sadc kmem_cache named unix:0:file_cache + sadc vmem named vmem:16:kmem_oversize + sadc ufs named ufs:0:inode_cache + sadc misc raw unix:0:var + sadc kmem_cache named unix:0:kmem_magazine_1 + sadc kmem_cache named unix:0:kmem_magazine_3 + sadc kmem_cache named unix:0:kmem_magazine_7 + sadc kmem_cache named unix:0:kmem_magazine_15 + sadc kmem_cache named unix:0:kmem_magazine_31 + sadc kmem_cache named unix:0:kmem_magazine_47 + sadc kmem_cache named unix:0:kmem_magazine_63 + sadc kmem_cache named unix:0:kmem_magazine_95 + sadc kmem_cache named unix:0:kmem_magazine_143 + sadc kmem_cache named unix:0:kmem_slab_cache + sadc kmem_cache named unix:0:kmem_bufctl_cache + sadc kmem_cache named unix:0:kmem_bufctl_audit_cache + sadc kmem_cache named unix:0:kmem_va_4096 + sadc kmem_cache named unix:0:kmem_va_8192 + sadc kmem_cache named unix:0:kmem_va_12288 + sadc kmem_cache named unix:0:kmem_va_16384 + sadc kmem_cache named unix:0:kmem_va_20480 + sadc kmem_cache named unix:0:kmem_va_24576 + sadc kmem_cache named unix:0:kmem_va_28672 + sadc kmem_cache named unix:0:kmem_va_32768 + sadc kmem_cache named unix:0:kmem_alloc_8 + sadc kmem_cache named unix:0:kmem_alloc_16 + sadc kmem_cache named unix:0:kmem_alloc_24 + sadc kmem_cache named unix:0:kmem_alloc_32 + sadc kmem_cache named unix:0:kmem_alloc_40 + sadc kmem_cache named unix:0:kmem_alloc_48 + sadc kmem_cache named unix:0:kmem_alloc_56 + sadc kmem_cache named unix:0:kmem_alloc_64 + sadc kmem_cache named unix:0:kmem_alloc_80 + sadc kmem_cache named unix:0:kmem_alloc_96 + sadc kmem_cache named unix:0:kmem_alloc_112 + sadc kmem_cache named unix:0:kmem_alloc_128 + sadc kmem_cache named unix:0:kmem_alloc_160 + sadc kmem_cache named unix:0:kmem_alloc_192 + sadc kmem_cache named unix:0:kmem_alloc_224 + sadc kmem_cache named unix:0:kmem_alloc_256 + sadc kmem_cache named unix:0:kmem_alloc_320 + sadc kmem_cache named unix:0:kmem_alloc_384 + sadc kmem_cache named unix:0:kmem_alloc_448 + sadc kmem_cache named unix:0:kmem_alloc_512 + sadc kmem_cache named unix:0:kmem_alloc_640 + sadc kmem_cache named unix:0:kmem_alloc_768 + sadc kmem_cache named unix:0:kmem_alloc_896 + sadc kmem_cache named unix:0:kmem_alloc_1152 + sadc kmem_cache named unix:0:kmem_alloc_1344 + sadc kmem_cache named unix:0:kmem_alloc_1600 + sadc kmem_cache named unix:0:kmem_alloc_2048 + sadc kmem_cache named unix:0:kmem_alloc_2688 + sadc kmem_cache named unix:0:kmem_alloc_4096 + sadc kmem_cache named unix:0:kmem_alloc_8192 + sadc kmem_cache named unix:0:kmem_alloc_12288 + sadc kmem_cache named unix:0:kmem_alloc_16384 + sadc kmem_cache named unix:0:streams_mblk + sadc kmem_cache named unix:0:streams_dblk_64 + sadc kmem_cache named unix:0:streams_dblk_128 + sadc kmem_cache named unix:0:streams_dblk_320 + sadc kmem_cache named unix:0:streams_dblk_576 + sadc kmem_cache named unix:0:streams_dblk_1088 + sadc kmem_cache named unix:0:streams_dblk_1536 + sadc kmem_cache named unix:0:streams_dblk_1984 + sadc kmem_cache named unix:0:streams_dblk_2624 + sadc kmem_cache named unix:0:streams_dblk_3968 + sadc kmem_cache named unix:0:streams_dblk_8192 + sadc kmem_cache named unix:0:streams_dblk_12160 + sadc kmem_cache named unix:0:streams_dblk_16384 + sadc kmem_cache named unix:0:streams_dblk_20352 + sadc kmem_cache named unix:0:streams_dblk_24576 + sadc kmem_cache named unix:0:streams_dblk_28544 + sadc kmem_cache named unix:0:streams_dblk_32768 + sadc kmem_cache named unix:0:streams_dblk_36736 + sadc kmem_cache named unix:0:streams_dblk_40960 + sadc kmem_cache named unix:0:streams_dblk_44928 + sadc kmem_cache named unix:0:streams_dblk_49152 + sadc kmem_cache named unix:0:streams_dblk_53120 + sadc kmem_cache named unix:0:streams_dblk_57344 + sadc kmem_cache named unix:0:streams_dblk_61312 + sadc kmem_cache named unix:0:streams_dblk_65536 + sadc kmem_cache named unix:0:streams_dblk_69504 + sadc kmem_cache named unix:0:streams_dblk_73728 + sadc kmem_cache named unix:0:streams_dblk_esb + sadc kmem_cache named unix:0:streams_fthdr + sadc kmem_cache named unix:0:streams_ftblk + sadc kmem_cache named unix:0:multidata + sadc kmem_cache named unix:0:multidata_pdslab + sadc kmem_cache named unix:0:multidata_pattbl + sadc kmem_cache named unix:0:taskq_ent_cache + sadc kmem_cache named unix:0:taskq_cache + sadc kmem_cache named unix:0:kmem_io_512M_128 + sadc kmem_cache named unix:0:kmem_io_512M_256 + sadc kmem_cache named unix:0:kmem_io_512M_512 + sadc kmem_cache named unix:0:kmem_io_512M_1024 + sadc kmem_cache named unix:0:kmem_io_512M_2048 + sadc kmem_cache named unix:0:kmem_io_512M_4096 + sadc kmem_cache named unix:0:kmem_io_16M_128 + sadc kmem_cache named unix:0:kmem_io_16M_256 + sadc kmem_cache named unix:0:kmem_io_16M_512 + sadc kmem_cache named unix:0:kmem_io_16M_1024 + sadc kmem_cache named unix:0:kmem_io_16M_2048 + sadc kmem_cache named unix:0:kmem_io_16M_4096 + sadc kmem_cache named unix:0:id32_cache + sadc kmem_cache named unix:0:bp_map_4096 + sadc kmem_cache named unix:0:bp_map_8192 + sadc kmem_cache named unix:0:bp_map_12288 + sadc kmem_cache named unix:0:bp_map_16384 + sadc kmem_cache named unix:0:bp_map_20480 + sadc kmem_cache named unix:0:bp_map_24576 + sadc kmem_cache named unix:0:bp_map_28672 + sadc kmem_cache named unix:0:bp_map_32768 + sadc kmem_cache named unix:0:mod_hash_entries + sadc kmem_cache named unix:0:ipp_mod + sadc kmem_cache named unix:0:ipp_action + sadc kmem_cache named unix:0:ipp_packet + sadc kmem_cache named unix:0:htable_t + sadc kmem_cache named unix:0:hment_t + sadc kmem_cache named unix:0:hat_t + sadc kmem_cache named unix:0:HatHash + sadc kmem_cache named unix:0:seg_cache + sadc kmem_cache named unix:0:snode_cache + sadc kmem_cache named unix:0:dv_node_cache + sadc kmem_cache named unix:0:dev_info_node_cache + sadc kmem_cache named unix:0:segkp_4096 + sadc kmem_cache named unix:0:segkp_8192 + sadc kmem_cache named unix:0:segkp_12288 + sadc kmem_cache named unix:0:segkp_16384 + sadc kmem_cache named unix:0:segkp_20480 + sadc kmem_cache named unix:0:thread_cache + sadc kmem_cache named unix:0:lwp_cache + sadc kmem_cache named unix:0:turnstile_cache + sadc kmem_cache named unix:0:cred_cache + sadc kmem_cache named unix:0:rctl_cache + sadc kmem_cache named unix:0:rctl_val_cache + sadc kmem_cache named unix:0:task_cache + sadc kmem_cache named unix:0:cyclic_id_cache + sadc kmem_cache named unix:0:dnlc_space_cache + sadc kmem_cache named unix:0:vn_cache + sadc kmem_cache named unix:0:file_cache + sadc kmem_cache named unix:0:stream_head_cache + sadc kmem_cache named unix:0:queue_cache + sadc kmem_cache named unix:0:syncq_cache + sadc kmem_cache named unix:0:qband_cache + sadc kmem_cache named unix:0:linkinfo_cache + sadc kmem_cache named unix:0:ciputctrl_cache + sadc kmem_cache named unix:0:serializer_cache + sadc kmem_cache named unix:0:as_cache + sadc kmem_cache named unix:0:marker_cache + sadc kmem_cache named unix:0:anon_cache + sadc kmem_cache named unix:0:anonmap_cache + sadc kmem_cache named unix:0:segvn_cache + sadc kmem_cache named unix:0:flk_edges + sadc kmem_cache named unix:0:fdb_cache + sadc kmem_cache named unix:0:timer_cache + sadc kmem_cache named unix:0:physio_buf_cache + sadc kmem_cache named unix:0:ufs_inode_cache + sadc kmem_cache named unix:0:directio_buf_cache + sadc kmem_cache named unix:0:lufs_save + sadc kmem_cache named unix:0:lufs_bufs + sadc kmem_cache named unix:0:lufs_mapentry_cache + sadc misc raw cpu_stat:0:cpu_stat0 + sadc kmem_cache named unix:0:kcf_sreq_cache + sadc kmem_cache named unix:0:kcf_areq_cache + sadc kmem_cache named unix:0:kcf_context_cache + sadc kmem_cache named unix:0:ipsec_actions + sadc kmem_cache named unix:0:ipsec_selectors + sadc kmem_cache named unix:0:ipsec_policy + sadc kmem_cache named unix:0:ipsec_info + sadc kmem_cache named unix:0:ip_minor_arena_1 + sadc kmem_cache named unix:0:ipcl_conn_cache + sadc kmem_cache named unix:0:ipcl_tcpconn_cache + sadc kmem_cache named unix:0:ire_cache + sadc kmem_cache named unix:0:tcp_timercache + sadc kmem_cache named unix:0:tcp_sack_info_cache + sadc kmem_cache named unix:0:tcp_iphc_cache + sadc kmem_cache named unix:0:squeue_cache + sadc kmem_cache named unix:0:sctp_conn_cache + sadc kmem_cache named unix:0:sctp_faddr_cache + sadc kmem_cache named unix:0:sctp_set_cache + sadc kmem_cache named unix:0:sctp_ftsn_set_cache + sadc kmem_cache named unix:0:sctpsock + sadc kmem_cache named unix:0:sctp_assoc + sadc kmem_cache named unix:0:socktpi_cache + sadc kmem_cache named unix:0:socktpi_unix_cache + sadc kmem_cache named unix:0:ncafs_cache + sadc kmem_cache named unix:0:process_cache + sadc kmem_cache named unix:0:exacct_object_cache + sadc kmem_cache named unix:0:fctl_cache + sadc kmem_cache named unix:0:tl_cache + sadc kmem_cache named unix:0:keysock_1 + sadc kmem_cache named unix:0:spdsock_1 + sadc kmem_cache named unix:0:fnode_cache + sadc kmem_cache named unix:0:pipe_cache + sadc kmem_cache named unix:0:namefs_inodes_1 + sadc kmem_cache named unix:0:port_cache + sadc kmem_cache named unix:0:lnode_cache + sadc kmem_cache named unix:0:clnt_clts_endpnt_cache + sadc kmem_cache named unix:0:pty_map + sadc kmem_cache named unix:0:sppptun_map + sadc kmem_cache named unix:0:dtrace_state_cache + sadc kmem_cache named unix:0:qif_head_cache + sadc kmem_cache named unix:0:udp_minor_1 + sadc kmem_cache named unix:0:authkern_cache + sadc kmem_cache named unix:0:authloopback_cache + sadc kmem_cache named unix:0:authdes_cache_handle + sadc kmem_cache named unix:0:rnode_cache + sadc kmem_cache named unix:0:nfs_access_cache + sadc kmem_cache named unix:0:client_handle_cache + sadc kmem_cache named unix:0:rnode4_cache + sadc kmem_cache named unix:0:svnode_cache + sadc kmem_cache named unix:0:nfs4_access_cache + sadc kmem_cache named unix:0:client_handle4_cache + sadc kmem_cache named unix:0:nfs4_ace4vals_cache + sadc kmem_cache named unix:0:nfs4_ace4_list_cache + sadc kmem_cache named unix:0:NFS_idmap_cache + sadc kmem_cache named unix:0:lm_vnode + sadc kmem_cache named unix:0:lm_xprt + sadc kmem_cache named unix:0:lm_sysid + sadc kmem_cache named unix:0:lm_client + sadc kmem_cache named unix:0:lm_async + sadc kmem_cache named unix:0:lm_sleep + sadc kmem_cache named unix:0:lm_config + sadc kmem_cache named unix:0:nfslog_small_rec + sadc kmem_cache named unix:0:nfslog_medium_rec + sadc kmem_cache named unix:0:nfslog_large_rec + sadc kmem_cache named unix:0:exi_cache_handle + sadc kmem_cache named unix:0:Client_entry_cache + sadc kmem_cache named unix:0:OpenOwner_entry_cache + sadc kmem_cache named unix:0:OpenStateID_entry_cache + sadc kmem_cache named unix:0:LockStateID_entry_cache + sadc kmem_cache named unix:0:Lockowner_entry_cache + sadc kmem_cache named unix:0:File_entry_cache + sadc kmem_cache named unix:0:DelegStateID_entry_cache + sadc kmem_cache named unix:0:ip_minor_1 + sadc kmem_cache named unix:0:ar_minor_1 + sadc kmem_cache named unix:0:icmp_minor_1 + sadc kmem_cache named unix:0:crypto_session_cache + sadc kmem_cache named unix:0:fcsm_job_cache + sadc kmem_cache named unix:0:sd0_cache + sadc kmem_cache named unix:0:hsfs_hsnode_cache + sadc kmem_cache named unix:0:kmem_magazine_1 + sadc misc named unix:0:system_misc + sadc kmem_cache named unix:0:file_cache + sadc vmem named vmem:16:kmem_oversize + sadc ufs named ufs:0:inode_cache + sadc misc raw unix:0:var + sadc kmem_cache named unix:0:kmem_magazine_1 + sadc kmem_cache named unix:0:kmem_magazine_3 + sadc kmem_cache named unix:0:kmem_magazine_7 + sadc kmem_cache named unix:0:kmem_magazine_15 + sadc kmem_cache named unix:0:kmem_magazine_31 + sadc kmem_cache named unix:0:kmem_magazine_47 + sadc kmem_cache named unix:0:kmem_magazine_63 + sadc kmem_cache named unix:0:kmem_magazine_95 + sadc kmem_cache named unix:0:kmem_magazine_143 + sadc kmem_cache named unix:0:kmem_slab_cache + sadc kmem_cache named unix:0:kmem_bufctl_cache + sadc kmem_cache named unix:0:kmem_bufctl_audit_cache + sadc kmem_cache named unix:0:kmem_va_4096 + sadc kmem_cache named unix:0:kmem_va_8192 + sadc kmem_cache named unix:0:kmem_va_12288 + sadc kmem_cache named unix:0:kmem_va_16384 + sadc kmem_cache named unix:0:kmem_va_20480 + sadc kmem_cache named unix:0:kmem_va_24576 + sadc kmem_cache named unix:0:kmem_va_28672 + sadc kmem_cache named unix:0:kmem_va_32768 + sadc kmem_cache named unix:0:kmem_alloc_8 + sadc kmem_cache named unix:0:kmem_alloc_16 + sadc kmem_cache named unix:0:kmem_alloc_24 + sadc kmem_cache named unix:0:kmem_alloc_32 + sadc kmem_cache named unix:0:kmem_alloc_40 + sadc kmem_cache named unix:0:kmem_alloc_48 + sadc kmem_cache named unix:0:kmem_alloc_56 + sadc kmem_cache named unix:0:kmem_alloc_64 + sadc kmem_cache named unix:0:kmem_alloc_80 + sadc kmem_cache named unix:0:kmem_alloc_96 + sadc kmem_cache named unix:0:kmem_alloc_112 + sadc kmem_cache named unix:0:kmem_alloc_128 + sadc kmem_cache named unix:0:kmem_alloc_160 + sadc kmem_cache named unix:0:kmem_alloc_192 + sadc kmem_cache named unix:0:kmem_alloc_224 + sadc kmem_cache named unix:0:kmem_alloc_256 + sadc kmem_cache named unix:0:kmem_alloc_320 + sadc kmem_cache named unix:0:kmem_alloc_384 + sadc kmem_cache named unix:0:kmem_alloc_448 + sadc kmem_cache named unix:0:kmem_alloc_512 + sadc kmem_cache named unix:0:kmem_alloc_640 + sadc kmem_cache named unix:0:kmem_alloc_768 + sadc kmem_cache named unix:0:kmem_alloc_896 + sadc kmem_cache named unix:0:kmem_alloc_1152 + sadc kmem_cache named unix:0:kmem_alloc_1344 + sadc kmem_cache named unix:0:kmem_alloc_1600 + sadc kmem_cache named unix:0:kmem_alloc_2048 + sadc kmem_cache named unix:0:kmem_alloc_2688 + sadc kmem_cache named unix:0:kmem_alloc_4096 + sadc kmem_cache named unix:0:kmem_alloc_8192 + sadc kmem_cache named unix:0:kmem_alloc_12288 + sadc kmem_cache named unix:0:kmem_alloc_16384 + sadc kmem_cache named unix:0:streams_mblk + sadc kmem_cache named unix:0:streams_dblk_64 + sadc kmem_cache named unix:0:streams_dblk_128 + sadc kmem_cache named unix:0:streams_dblk_320 + sadc kmem_cache named unix:0:streams_dblk_576 + sadc kmem_cache named unix:0:streams_dblk_1088 + sadc kmem_cache named unix:0:streams_dblk_1536 + sadc kmem_cache named unix:0:streams_dblk_1984 + sadc kmem_cache named unix:0:streams_dblk_2624 + sadc kmem_cache named unix:0:streams_dblk_3968 + sadc kmem_cache named unix:0:streams_dblk_8192 + sadc kmem_cache named unix:0:streams_dblk_12160 + sadc kmem_cache named unix:0:streams_dblk_16384 + sadc kmem_cache named unix:0:streams_dblk_20352 + sadc kmem_cache named unix:0:streams_dblk_24576 + sadc kmem_cache named unix:0:streams_dblk_28544 + sadc kmem_cache named unix:0:streams_dblk_32768 + sadc kmem_cache named unix:0:streams_dblk_36736 + sadc kmem_cache named unix:0:streams_dblk_40960 + sadc kmem_cache named unix:0:streams_dblk_44928 + sadc kmem_cache named unix:0:streams_dblk_49152 + sadc kmem_cache named unix:0:streams_dblk_53120 + sadc kmem_cache named unix:0:streams_dblk_57344 + sadc kmem_cache named unix:0:streams_dblk_61312 + sadc kmem_cache named unix:0:streams_dblk_65536 + sadc kmem_cache named unix:0:streams_dblk_69504 + sadc kmem_cache named unix:0:streams_dblk_73728 + sadc kmem_cache named unix:0:streams_dblk_esb + sadc kmem_cache named unix:0:streams_fthdr + sadc kmem_cache named unix:0:streams_ftblk + sadc kmem_cache named unix:0:multidata + sadc kmem_cache named unix:0:multidata_pdslab + sadc kmem_cache named unix:0:multidata_pattbl + sadc kmem_cache named unix:0:taskq_ent_cache + sadc kmem_cache named unix:0:taskq_cache + sadc kmem_cache named unix:0:kmem_io_512M_128 + sadc kmem_cache named unix:0:kmem_io_512M_256 + sadc kmem_cache named unix:0:kmem_io_512M_512 + sadc kmem_cache named unix:0:kmem_io_512M_1024 + sadc kmem_cache named unix:0:kmem_io_512M_2048 + sadc kmem_cache named unix:0:kmem_io_512M_4096 + sadc kmem_cache named unix:0:kmem_io_16M_128 + sadc kmem_cache named unix:0:kmem_io_16M_256 + sadc kmem_cache named unix:0:kmem_io_16M_512 + sadc kmem_cache named unix:0:kmem_io_16M_1024 + sadc kmem_cache named unix:0:kmem_io_16M_2048 + sadc kmem_cache named unix:0:kmem_io_16M_4096 + sadc kmem_cache named unix:0:id32_cache + sadc kmem_cache named unix:0:bp_map_4096 + sadc kmem_cache named unix:0:bp_map_8192 + sadc kmem_cache named unix:0:bp_map_12288 + sadc kmem_cache named unix:0:bp_map_16384 + sadc kmem_cache named unix:0:bp_map_20480 + sadc kmem_cache named unix:0:bp_map_24576 + sadc kmem_cache named unix:0:bp_map_28672 + sadc kmem_cache named unix:0:bp_map_32768 + sadc kmem_cache named unix:0:mod_hash_entries + sadc kmem_cache named unix:0:ipp_mod + sadc kmem_cache named unix:0:ipp_action + sadc kmem_cache named unix:0:ipp_packet + sadc kmem_cache named unix:0:htable_t + sadc kmem_cache named unix:0:hment_t + sadc kmem_cache named unix:0:hat_t + sadc kmem_cache named unix:0:HatHash + sadc kmem_cache named unix:0:seg_cache + sadc kmem_cache named unix:0:snode_cache + sadc kmem_cache named unix:0:dv_node_cache + sadc kmem_cache named unix:0:dev_info_node_cache + sadc kmem_cache named unix:0:segkp_4096 + sadc kmem_cache named unix:0:segkp_8192 + sadc kmem_cache named unix:0:segkp_12288 + sadc kmem_cache named unix:0:segkp_16384 + sadc kmem_cache named unix:0:segkp_20480 + sadc kmem_cache named unix:0:thread_cache + sadc kmem_cache named unix:0:lwp_cache + sadc kmem_cache named unix:0:turnstile_cache + sadc kmem_cache named unix:0:cred_cache + sadc kmem_cache named unix:0:rctl_cache + sadc kmem_cache named unix:0:rctl_val_cache + sadc kmem_cache named unix:0:task_cache + sadc kmem_cache named unix:0:cyclic_id_cache + sadc kmem_cache named unix:0:dnlc_space_cache + sadc kmem_cache named unix:0:vn_cache + sadc kmem_cache named unix:0:file_cache + sadc kmem_cache named unix:0:stream_head_cache + sadc kmem_cache named unix:0:queue_cache + sadc kmem_cache named unix:0:syncq_cache + sadc kmem_cache named unix:0:qband_cache + sadc kmem_cache named unix:0:linkinfo_cache + sadc kmem_cache named unix:0:ciputctrl_cache + sadc kmem_cache named unix:0:serializer_cache + sadc kmem_cache named unix:0:as_cache + sadc kmem_cache named unix:0:marker_cache + sadc kmem_cache named unix:0:anon_cache + sadc kmem_cache named unix:0:anonmap_cache + sadc kmem_cache named unix:0:segvn_cache + sadc kmem_cache named unix:0:flk_edges + sadc kmem_cache named unix:0:fdb_cache + sadc kmem_cache named unix:0:timer_cache + sadc kmem_cache named unix:0:physio_buf_cache + sadc kmem_cache named unix:0:ufs_inode_cache + sadc kmem_cache named unix:0:directio_buf_cache + sadc kmem_cache named unix:0:lufs_save + sadc kmem_cache named unix:0:lufs_bufs + sadc kmem_cache named unix:0:lufs_mapentry_cache + sadc misc raw cpu_stat:0:cpu_stat0 + sadc kmem_cache named unix:0:kcf_sreq_cache + sadc kmem_cache named unix:0:kcf_areq_cache + sadc kmem_cache named unix:0:kcf_context_cache + sadc kmem_cache named unix:0:ipsec_actions + sadc kmem_cache named unix:0:ipsec_selectors + sadc kmem_cache named unix:0:ipsec_policy + sadc kmem_cache named unix:0:ipsec_info + sadc kmem_cache named unix:0:ip_minor_arena_1 + sadc kmem_cache named unix:0:ipcl_conn_cache + sadc kmem_cache named unix:0:ipcl_tcpconn_cache + sadc kmem_cache named unix:0:ire_cache + sadc kmem_cache named unix:0:tcp_timercache + sadc kmem_cache named unix:0:tcp_sack_info_cache + sadc kmem_cache named unix:0:tcp_iphc_cache + sadc kmem_cache named unix:0:squeue_cache + sadc kmem_cache named unix:0:sctp_conn_cache + sadc kmem_cache named unix:0:sctp_faddr_cache + sadc kmem_cache named unix:0:sctp_set_cache + sadc kmem_cache named unix:0:sctp_ftsn_set_cache + sadc kmem_cache named unix:0:sctpsock + sadc kmem_cache named unix:0:sctp_assoc + sadc kmem_cache named unix:0:socktpi_cache + sadc kmem_cache named unix:0:socktpi_unix_cache + sadc kmem_cache named unix:0:ncafs_cache + sadc kmem_cache named unix:0:process_cache + sadc kmem_cache named unix:0:exacct_object_cache + sadc kmem_cache named unix:0:fctl_cache + sadc kmem_cache named unix:0:tl_cache + sadc kmem_cache named unix:0:keysock_1 + sadc kmem_cache named unix:0:spdsock_1 + sadc kmem_cache named unix:0:fnode_cache + sadc kmem_cache named unix:0:pipe_cache + sadc kmem_cache named unix:0:namefs_inodes_1 + sadc kmem_cache named unix:0:port_cache + sadc kmem_cache named unix:0:lnode_cache + sadc kmem_cache named unix:0:clnt_clts_endpnt_cache + sadc kmem_cache named unix:0:pty_map + sadc kmem_cache named unix:0:sppptun_map + sadc kmem_cache named unix:0:dtrace_state_cache + sadc kmem_cache named unix:0:qif_head_cache + sadc kmem_cache named unix:0:udp_minor_1 + sadc kmem_cache named unix:0:authkern_cache + sadc kmem_cache named unix:0:authloopback_cache + sadc kmem_cache named unix:0:authdes_cache_handle + sadc kmem_cache named unix:0:rnode_cache + sadc kmem_cache named unix:0:nfs_access_cache + sadc kmem_cache named unix:0:client_handle_cache + sadc kmem_cache named unix:0:rnode4_cache + sadc kmem_cache named unix:0:svnode_cache + sadc kmem_cache named unix:0:nfs4_access_cache + sadc kmem_cache named unix:0:client_handle4_cache + sadc kmem_cache named unix:0:nfs4_ace4vals_cache + sadc kmem_cache named unix:0:nfs4_ace4_list_cache + sadc kmem_cache named unix:0:NFS_idmap_cache + sadc kmem_cache named unix:0:lm_vnode + sadc kmem_cache named unix:0:lm_xprt + sadc kmem_cache named unix:0:lm_sysid + sadc kmem_cache named unix:0:lm_client + sadc kmem_cache named unix:0:lm_async + sadc kmem_cache named unix:0:lm_sleep + sadc kmem_cache named unix:0:lm_config + sadc kmem_cache named unix:0:nfslog_small_rec + sadc kmem_cache named unix:0:nfslog_medium_rec + sadc kmem_cache named unix:0:nfslog_large_rec + sadc kmem_cache named unix:0:exi_cache_handle + sadc kmem_cache named unix:0:Client_entry_cache + sadc kmem_cache named unix:0:OpenOwner_entry_cache + sadc kmem_cache named unix:0:OpenStateID_entry_cache + sadc kmem_cache named unix:0:LockStateID_entry_cache + sadc kmem_cache named unix:0:Lockowner_entry_cache + sadc kmem_cache named unix:0:File_entry_cache + sadc kmem_cache named unix:0:DelegStateID_entry_cache + sadc kmem_cache named unix:0:ip_minor_1 + sadc kmem_cache named unix:0:ar_minor_1 + sadc kmem_cache named unix:0:icmp_minor_1 + sadc kmem_cache named unix:0:crypto_session_cache + sadc kmem_cache named unix:0:fcsm_job_cache + sadc kmem_cache named unix:0:sd0_cache + sadc kmem_cache named unix:0:hsfs_hsnode_cache + sadc kmem_cache named unix:0:kmem_magazine_1 + sadc misc raw unix:0:sysinfo + sadc vm raw unix:0:vminfo + sadc misc named unix:0:system_misc + sadc kmem_cache named unix:0:file_cache + sadc ufs named ufs:0:inode_cache + sadc misc raw cpu_stat:0:cpu_stat0 + sadc kmem_cache named unix:0:kmem_magazine_1 + sadc kmem_cache named unix:0:kmem_magazine_3 + sadc kmem_cache named unix:0:kmem_magazine_7 + sadc kmem_cache named unix:0:kmem_magazine_15 + sadc kmem_cache named unix:0:kmem_magazine_31 + sadc kmem_cache named unix:0:kmem_magazine_47 + sadc kmem_cache named unix:0:kmem_magazine_63 + sadc kmem_cache named unix:0:kmem_magazine_95 + sadc kmem_cache named unix:0:kmem_magazine_143 + sadc kmem_cache named unix:0:kmem_slab_cache + sadc kmem_cache named unix:0:kmem_bufctl_cache + sadc kmem_cache named unix:0:kmem_bufctl_audit_cache + sadc kmem_cache named unix:0:kmem_va_4096 + sadc kmem_cache named unix:0:kmem_va_8192 + sadc kmem_cache named unix:0:kmem_va_12288 + sadc kmem_cache named unix:0:kmem_va_16384 + sadc kmem_cache named unix:0:kmem_va_20480 + sadc kmem_cache named unix:0:kmem_va_24576 + sadc kmem_cache named unix:0:kmem_va_28672 + sadc kmem_cache named unix:0:kmem_va_32768 + sadc kmem_cache named unix:0:kmem_alloc_8 + sadc kmem_cache named unix:0:kmem_alloc_16 + sadc kmem_cache named unix:0:kmem_alloc_24 + sadc kmem_cache named unix:0:kmem_alloc_32 + sadc kmem_cache named unix:0:kmem_alloc_40 + sadc kmem_cache named unix:0:kmem_alloc_48 + sadc kmem_cache named unix:0:kmem_alloc_56 + sadc kmem_cache named unix:0:kmem_alloc_64 + sadc kmem_cache named unix:0:kmem_alloc_80 + sadc kmem_cache named unix:0:kmem_alloc_96 + sadc kmem_cache named unix:0:kmem_alloc_112 + sadc kmem_cache named unix:0:kmem_alloc_128 + sadc kmem_cache named unix:0:kmem_alloc_160 + sadc kmem_cache named unix:0:kmem_alloc_192 + sadc kmem_cache named unix:0:kmem_alloc_224 + sadc kmem_cache named unix:0:kmem_alloc_256 + sadc kmem_cache named unix:0:kmem_alloc_320 + sadc kmem_cache named unix:0:kmem_alloc_384 + sadc kmem_cache named unix:0:kmem_alloc_448 + sadc kmem_cache named unix:0:kmem_alloc_512 + sadc kmem_cache named unix:0:kmem_alloc_640 + sadc kmem_cache named unix:0:kmem_alloc_768 + sadc kmem_cache named unix:0:kmem_alloc_896 + sadc kmem_cache named unix:0:kmem_alloc_1152 + sadc kmem_cache named unix:0:kmem_alloc_1344 + sadc kmem_cache named unix:0:kmem_alloc_1600 + sadc kmem_cache named unix:0:kmem_alloc_2048 + sadc kmem_cache named unix:0:kmem_alloc_2688 + sadc kmem_cache named unix:0:kmem_alloc_4096 + sadc kmem_cache named unix:0:kmem_alloc_8192 + sadc kmem_cache named unix:0:kmem_alloc_12288 + sadc kmem_cache named unix:0:kmem_alloc_16384 + sadc kmem_cache named unix:0:streams_mblk + sadc kmem_cache named unix:0:streams_dblk_64 + sadc kmem_cache named unix:0:streams_dblk_128 + sadc kmem_cache named unix:0:streams_dblk_320 + sadc kmem_cache named unix:0:streams_dblk_576 + sadc kmem_cache named unix:0:streams_dblk_1088 + sadc kmem_cache named unix:0:streams_dblk_1536 + sadc kmem_cache named unix:0:streams_dblk_1984 + sadc kmem_cache named unix:0:streams_dblk_2624 + sadc kmem_cache named unix:0:streams_dblk_3968 + sadc kmem_cache named unix:0:streams_dblk_8192 + sadc kmem_cache named unix:0:streams_dblk_12160 + sadc kmem_cache named unix:0:streams_dblk_16384 + sadc kmem_cache named unix:0:streams_dblk_20352 + sadc kmem_cache named unix:0:streams_dblk_24576 + sadc kmem_cache named unix:0:streams_dblk_28544 + sadc kmem_cache named unix:0:streams_dblk_32768 + sadc kmem_cache named unix:0:streams_dblk_36736 + sadc kmem_cache named unix:0:streams_dblk_40960 + sadc kmem_cache named unix:0:streams_dblk_44928 + sadc kmem_cache named unix:0:streams_dblk_49152 + sadc kmem_cache named unix:0:streams_dblk_53120 + sadc kmem_cache named unix:0:streams_dblk_57344 + sadc kmem_cache named unix:0:streams_dblk_61312 + sadc kmem_cache named unix:0:streams_dblk_65536 + sadc kmem_cache named unix:0:streams_dblk_69504 + sadc kmem_cache named unix:0:streams_dblk_73728 + sadc kmem_cache named unix:0:streams_dblk_esb + sadc kmem_cache named unix:0:streams_fthdr + sadc kmem_cache named unix:0:streams_ftblk + sadc kmem_cache named unix:0:multidata + sadc kmem_cache named unix:0:multidata_pdslab + sadc kmem_cache named unix:0:multidata_pattbl + sadc kmem_cache named unix:0:taskq_ent_cache + sadc kmem_cache named unix:0:taskq_cache + sadc kmem_cache named unix:0:kmem_io_512M_128 + sadc kmem_cache named unix:0:kmem_io_512M_256 + sadc kmem_cache named unix:0:kmem_io_512M_512 + sadc kmem_cache named unix:0:kmem_io_512M_1024 + sadc kmem_cache named unix:0:kmem_io_512M_2048 + sadc kmem_cache named unix:0:kmem_io_512M_4096 + sadc kmem_cache named unix:0:kmem_io_16M_128 + sadc kmem_cache named unix:0:kmem_io_16M_256 + sadc kmem_cache named unix:0:kmem_io_16M_512 + sadc kmem_cache named unix:0:kmem_io_16M_1024 + sadc kmem_cache named unix:0:kmem_io_16M_2048 + sadc kmem_cache named unix:0:kmem_io_16M_4096 + sadc kmem_cache named unix:0:id32_cache + sadc kmem_cache named unix:0:bp_map_4096 + sadc kmem_cache named unix:0:bp_map_8192 + sadc kmem_cache named unix:0:bp_map_12288 + sadc kmem_cache named unix:0:bp_map_16384 + sadc kmem_cache named unix:0:bp_map_20480 + sadc kmem_cache named unix:0:bp_map_24576 + sadc kmem_cache named unix:0:bp_map_28672 + sadc kmem_cache named unix:0:bp_map_32768 + sadc kmem_cache named unix:0:mod_hash_entries + sadc kmem_cache named unix:0:ipp_mod + sadc kmem_cache named unix:0:ipp_action + sadc kmem_cache named unix:0:ipp_packet + sadc kmem_cache named unix:0:htable_t + sadc kmem_cache named unix:0:hment_t + sadc kmem_cache named unix:0:hat_t + sadc kmem_cache named unix:0:HatHash + sadc kmem_cache named unix:0:seg_cache + sadc kmem_cache named unix:0:snode_cache + sadc kmem_cache named unix:0:dv_node_cache + sadc kmem_cache named unix:0:dev_info_node_cache + sadc kmem_cache named unix:0:segkp_4096 + sadc kmem_cache named unix:0:segkp_8192 + sadc kmem_cache named unix:0:segkp_12288 + sadc kmem_cache named unix:0:segkp_16384 + sadc kmem_cache named unix:0:segkp_20480 + sadc kmem_cache named unix:0:thread_cache + sadc kmem_cache named unix:0:lwp_cache + sadc kmem_cache named unix:0:turnstile_cache + sadc kmem_cache named unix:0:cred_cache + sadc kmem_cache named unix:0:rctl_cache + sadc kmem_cache named unix:0:rctl_val_cache + sadc kmem_cache named unix:0:task_cache + sadc kmem_cache named unix:0:cyclic_id_cache + sadc kmem_cache named unix:0:dnlc_space_cache + sadc kmem_cache named unix:0:vn_cache + sadc kmem_cache named unix:0:file_cache + sadc kmem_cache named unix:0:stream_head_cache + sadc kmem_cache named unix:0:queue_cache + sadc kmem_cache named unix:0:syncq_cache + sadc kmem_cache named unix:0:qband_cache + sadc kmem_cache named unix:0:linkinfo_cache + sadc kmem_cache named unix:0:ciputctrl_cache + sadc kmem_cache named unix:0:serializer_cache + sadc kmem_cache named unix:0:as_cache + sadc kmem_cache named unix:0:marker_cache + sadc kmem_cache named unix:0:anon_cache + sadc kmem_cache named unix:0:anonmap_cache + sadc kmem_cache named unix:0:segvn_cache + sadc kmem_cache named unix:0:flk_edges + sadc kmem_cache named unix:0:fdb_cache + sadc kmem_cache named unix:0:timer_cache + sadc kmem_cache named unix:0:physio_buf_cache + sadc kmem_cache named unix:0:ufs_inode_cache + sadc kmem_cache named unix:0:directio_buf_cache + sadc kmem_cache named unix:0:lufs_save + sadc kmem_cache named unix:0:lufs_bufs + sadc kmem_cache named unix:0:lufs_mapentry_cache + sadc kmem_cache named unix:0:kcf_sreq_cache + sadc kmem_cache named unix:0:kcf_areq_cache + sadc kmem_cache named unix:0:kcf_context_cache + sadc kmem_cache named unix:0:ipsec_actions + sadc kmem_cache named unix:0:ipsec_selectors + sadc kmem_cache named unix:0:ipsec_policy + sadc kmem_cache named unix:0:ipsec_info + sadc kmem_cache named unix:0:ip_minor_arena_1 + sadc kmem_cache named unix:0:ipcl_conn_cache + sadc kmem_cache named unix:0:ipcl_tcpconn_cache + sadc kmem_cache named unix:0:ire_cache + sadc kmem_cache named unix:0:tcp_timercache + sadc kmem_cache named unix:0:tcp_sack_info_cache + sadc kmem_cache named unix:0:tcp_iphc_cache + sadc kmem_cache named unix:0:squeue_cache + sadc kmem_cache named unix:0:sctp_conn_cache + sadc kmem_cache named unix:0:sctp_faddr_cache + sadc kmem_cache named unix:0:sctp_set_cache + sadc kmem_cache named unix:0:sctp_ftsn_set_cache + sadc kmem_cache named unix:0:sctpsock + sadc kmem_cache named unix:0:sctp_assoc + sadc kmem_cache named unix:0:socktpi_cache + sadc kmem_cache named unix:0:socktpi_unix_cache + sadc kmem_cache named unix:0:ncafs_cache + sadc kmem_cache named unix:0:process_cache + sadc kmem_cache named unix:0:exacct_object_cache + sadc kmem_cache named unix:0:fctl_cache + sadc kmem_cache named unix:0:tl_cache + sadc kmem_cache named unix:0:keysock_1 + sadc kmem_cache named unix:0:spdsock_1 + sadc kmem_cache named unix:0:fnode_cache + sadc kmem_cache named unix:0:pipe_cache + sadc kmem_cache named unix:0:namefs_inodes_1 + sadc kmem_cache named unix:0:port_cache + sadc kmem_cache named unix:0:lnode_cache + sadc kmem_cache named unix:0:clnt_clts_endpnt_cache + sadc kmem_cache named unix:0:pty_map + sadc kmem_cache named unix:0:sppptun_map + sadc kmem_cache named unix:0:dtrace_state_cache + sadc kmem_cache named unix:0:qif_head_cache + sadc kmem_cache named unix:0:udp_minor_1 + sadc kmem_cache named unix:0:authkern_cache + sadc kmem_cache named unix:0:authloopback_cache + sadc kmem_cache named unix:0:authdes_cache_handle + sadc kmem_cache named unix:0:rnode_cache + sadc kmem_cache named unix:0:nfs_access_cache + sadc kmem_cache named unix:0:client_handle_cache + sadc kmem_cache named unix:0:rnode4_cache + sadc kmem_cache named unix:0:svnode_cache + sadc kmem_cache named unix:0:nfs4_access_cache + sadc kmem_cache named unix:0:client_handle4_cache + sadc kmem_cache named unix:0:nfs4_ace4vals_cache + sadc kmem_cache named unix:0:nfs4_ace4_list_cache + sadc kmem_cache named unix:0:NFS_idmap_cache + sadc kmem_cache named unix:0:lm_vnode + sadc kmem_cache named unix:0:lm_xprt + sadc kmem_cache named unix:0:lm_sysid + sadc kmem_cache named unix:0:lm_client + sadc kmem_cache named unix:0:lm_async + sadc kmem_cache named unix:0:lm_sleep + sadc kmem_cache named unix:0:lm_config + sadc kmem_cache named unix:0:nfslog_small_rec + sadc kmem_cache named unix:0:nfslog_medium_rec + sadc kmem_cache named unix:0:nfslog_large_rec + sadc kmem_cache named unix:0:exi_cache_handle + sadc kmem_cache named unix:0:Client_entry_cache + sadc kmem_cache named unix:0:OpenOwner_entry_cache + sadc kmem_cache named unix:0:OpenStateID_entry_cache + sadc kmem_cache named unix:0:LockStateID_entry_cache + sadc kmem_cache named unix:0:Lockowner_entry_cache + sadc kmem_cache named unix:0:File_entry_cache + sadc kmem_cache named unix:0:DelegStateID_entry_cache + sadc kmem_cache named unix:0:ip_minor_1 + sadc kmem_cache named unix:0:ar_minor_1 + sadc kmem_cache named unix:0:icmp_minor_1 + sadc kmem_cache named unix:0:crypto_session_cache + sadc kmem_cache named unix:0:fcsm_job_cache + sadc kmem_cache named unix:0:sd0_cache + sadc kmem_cache named unix:0:hsfs_hsnode_cache + sadc vmem named vmem:16:kmem_oversize + sadc disk io cmdk:0:cmdk0 + sadc nfs io nfs:1:nfs1 + sadc disk io sd:0:sd0 + sadc usb_byte_count io usba:0:uhci0,bulk + sadc usb_byte_count io usba:0:uhci0,ctrl + sadc usb_byte_count io usba:0:uhci0,intr + sadc usb_byte_count io usba:0:uhci0,isoch + sadc usb_byte_count io usba:0:uhci0,total + sadc usb_byte_count io usba:1:uhci1,bulk + sadc usb_byte_count io usba:1:uhci1,ctrl + sadc usb_byte_count io usba:1:uhci1,intr + sadc usb_byte_count io usba:1:uhci1,isoch + sadc usb_byte_count io usba:1:uhci1,total + sadc misc named unix:0:system_misc + sadc kmem_cache named unix:0:file_cache + sadc vmem named vmem:16:kmem_oversize + sadc ufs named ufs:0:inode_cache + sadc misc raw unix:0:var + sadc kmem_cache named unix:0:kmem_magazine_1 + sadc kmem_cache named unix:0:kmem_magazine_3 + sadc kmem_cache named unix:0:kmem_magazine_7 + sadc kmem_cache named unix:0:kmem_magazine_15 + sadc kmem_cache named unix:0:kmem_magazine_31 + sadc kmem_cache named unix:0:kmem_magazine_47 + sadc kmem_cache named unix:0:kmem_magazine_63 + sadc kmem_cache named unix:0:kmem_magazine_95 + sadc kmem_cache named unix:0:kmem_magazine_143 + sadc kmem_cache named unix:0:kmem_slab_cache + sadc kmem_cache named unix:0:kmem_bufctl_cache + sadc kmem_cache named unix:0:kmem_bufctl_audit_cache + sadc kmem_cache named unix:0:kmem_va_4096 + sadc kmem_cache named unix:0:kmem_va_8192 + sadc kmem_cache named unix:0:kmem_va_12288 + sadc kmem_cache named unix:0:kmem_va_16384 + sadc kmem_cache named unix:0:kmem_va_20480 + sadc kmem_cache named unix:0:kmem_va_24576 + sadc kmem_cache named unix:0:kmem_va_28672 + sadc kmem_cache named unix:0:kmem_va_32768 + sadc kmem_cache named unix:0:kmem_alloc_8 + sadc kmem_cache named unix:0:kmem_alloc_16 + sadc kmem_cache named unix:0:kmem_alloc_24 + sadc kmem_cache named unix:0:kmem_alloc_32 + sadc kmem_cache named unix:0:kmem_alloc_40 + sadc kmem_cache named unix:0:kmem_alloc_48 + sadc kmem_cache named unix:0:kmem_alloc_56 + sadc kmem_cache named unix:0:kmem_alloc_64 + sadc kmem_cache named unix:0:kmem_alloc_80 + sadc kmem_cache named unix:0:kmem_alloc_96 + sadc kmem_cache named unix:0:kmem_alloc_112 + sadc kmem_cache named unix:0:kmem_alloc_128 + sadc kmem_cache named unix:0:kmem_alloc_160 + sadc kmem_cache named unix:0:kmem_alloc_192 + sadc kmem_cache named unix:0:kmem_alloc_224 + sadc kmem_cache named unix:0:kmem_alloc_256 + sadc kmem_cache named unix:0:kmem_alloc_320 + sadc kmem_cache named unix:0:kmem_alloc_384 + sadc kmem_cache named unix:0:kmem_alloc_448 + sadc kmem_cache named unix:0:kmem_alloc_512 + sadc kmem_cache named unix:0:kmem_alloc_640 + sadc kmem_cache named unix:0:kmem_alloc_768 + sadc kmem_cache named unix:0:kmem_alloc_896 + sadc kmem_cache named unix:0:kmem_alloc_1152 + sadc kmem_cache named unix:0:kmem_alloc_1344 + sadc kmem_cache named unix:0:kmem_alloc_1600 + sadc kmem_cache named unix:0:kmem_alloc_2048 + sadc kmem_cache named unix:0:kmem_alloc_2688 + sadc kmem_cache named unix:0:kmem_alloc_4096 + sadc kmem_cache named unix:0:kmem_alloc_8192 + sadc kmem_cache named unix:0:kmem_alloc_12288 + sadc kmem_cache named unix:0:kmem_alloc_16384 + sadc kmem_cache named unix:0:streams_mblk + sadc kmem_cache named unix:0:streams_dblk_64 + sadc kmem_cache named unix:0:streams_dblk_128 + sadc kmem_cache named unix:0:streams_dblk_320 + sadc kmem_cache named unix:0:streams_dblk_576 + sadc kmem_cache named unix:0:streams_dblk_1088 + sadc kmem_cache named unix:0:streams_dblk_1536 + sadc kmem_cache named unix:0:streams_dblk_1984 + sadc kmem_cache named unix:0:streams_dblk_2624 + sadc kmem_cache named unix:0:streams_dblk_3968 + sadc kmem_cache named unix:0:streams_dblk_8192 + sadc kmem_cache named unix:0:streams_dblk_12160 + sadc kmem_cache named unix:0:streams_dblk_16384 + sadc kmem_cache named unix:0:streams_dblk_20352 + sadc kmem_cache named unix:0:streams_dblk_24576 + sadc kmem_cache named unix:0:streams_dblk_28544 + sadc kmem_cache named unix:0:streams_dblk_32768 + sadc kmem_cache named unix:0:streams_dblk_36736 + sadc kmem_cache named unix:0:streams_dblk_40960 + sadc kmem_cache named unix:0:streams_dblk_44928 + sadc kmem_cache named unix:0:streams_dblk_49152 + sadc kmem_cache named unix:0:streams_dblk_53120 + sadc kmem_cache named unix:0:streams_dblk_57344 + sadc kmem_cache named unix:0:streams_dblk_61312 + sadc kmem_cache named unix:0:streams_dblk_65536 + sadc kmem_cache named unix:0:streams_dblk_69504 + sadc kmem_cache named unix:0:streams_dblk_73728 + sadc kmem_cache named unix:0:streams_dblk_esb + sadc kmem_cache named unix:0:streams_fthdr + sadc kmem_cache named unix:0:streams_ftblk + sadc kmem_cache named unix:0:multidata + sadc kmem_cache named unix:0:multidata_pdslab + sadc kmem_cache named unix:0:multidata_pattbl + sadc kmem_cache named unix:0:taskq_ent_cache + sadc kmem_cache named unix:0:taskq_cache + sadc kmem_cache named unix:0:kmem_io_512M_128 + sadc kmem_cache named unix:0:kmem_io_512M_256 + sadc kmem_cache named unix:0:kmem_io_512M_512 + sadc kmem_cache named unix:0:kmem_io_512M_1024 + sadc kmem_cache named unix:0:kmem_io_512M_2048 + sadc kmem_cache named unix:0:kmem_io_512M_4096 + sadc kmem_cache named unix:0:kmem_io_16M_128 + sadc kmem_cache named unix:0:kmem_io_16M_256 + sadc kmem_cache named unix:0:kmem_io_16M_512 + sadc kmem_cache named unix:0:kmem_io_16M_1024 + sadc kmem_cache named unix:0:kmem_io_16M_2048 + sadc kmem_cache named unix:0:kmem_io_16M_4096 + sadc kmem_cache named unix:0:id32_cache + sadc kmem_cache named unix:0:bp_map_4096 + sadc kmem_cache named unix:0:bp_map_8192 + sadc kmem_cache named unix:0:bp_map_12288 + sadc kmem_cache named unix:0:bp_map_16384 + sadc kmem_cache named unix:0:bp_map_20480 + sadc kmem_cache named unix:0:bp_map_24576 + sadc kmem_cache named unix:0:bp_map_28672 + sadc kmem_cache named unix:0:bp_map_32768 + sadc kmem_cache named unix:0:mod_hash_entries + sadc kmem_cache named unix:0:ipp_mod + sadc kmem_cache named unix:0:ipp_action + sadc kmem_cache named unix:0:ipp_packet + sadc kmem_cache named unix:0:htable_t + sadc kmem_cache named unix:0:hment_t + sadc kmem_cache named unix:0:hat_t + sadc kmem_cache named unix:0:HatHash + sadc kmem_cache named unix:0:seg_cache + sadc kmem_cache named unix:0:snode_cache + sadc kmem_cache named unix:0:dv_node_cache + sadc kmem_cache named unix:0:dev_info_node_cache + sadc kmem_cache named unix:0:segkp_4096 + sadc kmem_cache named unix:0:segkp_8192 + sadc kmem_cache named unix:0:segkp_12288 + sadc kmem_cache named unix:0:segkp_16384 + sadc kmem_cache named unix:0:segkp_20480 + sadc kmem_cache named unix:0:thread_cache + sadc kmem_cache named unix:0:lwp_cache + sadc kmem_cache named unix:0:turnstile_cache + sadc kmem_cache named unix:0:cred_cache + sadc kmem_cache named unix:0:rctl_cache + sadc kmem_cache named unix:0:rctl_val_cache + sadc kmem_cache named unix:0:task_cache + sadc kmem_cache named unix:0:cyclic_id_cache + sadc kmem_cache named unix:0:dnlc_space_cache + sadc kmem_cache named unix:0:vn_cache + sadc kmem_cache named unix:0:file_cache + sadc kmem_cache named unix:0:stream_head_cache + sadc kmem_cache named unix:0:queue_cache + sadc kmem_cache named unix:0:syncq_cache + sadc kmem_cache named unix:0:qband_cache + sadc kmem_cache named unix:0:linkinfo_cache + sadc kmem_cache named unix:0:ciputctrl_cache + sadc kmem_cache named unix:0:serializer_cache + sadc kmem_cache named unix:0:as_cache + sadc kmem_cache named unix:0:marker_cache + sadc kmem_cache named unix:0:anon_cache + sadc kmem_cache named unix:0:anonmap_cache + sadc kmem_cache named unix:0:segvn_cache + sadc kmem_cache named unix:0:flk_edges + sadc kmem_cache named unix:0:fdb_cache + sadc kmem_cache named unix:0:timer_cache + sadc kmem_cache named unix:0:physio_buf_cache + sadc kmem_cache named unix:0:ufs_inode_cache + sadc kmem_cache named unix:0:directio_buf_cache + sadc kmem_cache named unix:0:lufs_save + sadc kmem_cache named unix:0:lufs_bufs + sadc kmem_cache named unix:0:lufs_mapentry_cache + sadc misc raw cpu_stat:0:cpu_stat0 + sadc kmem_cache named unix:0:kcf_sreq_cache + sadc kmem_cache named unix:0:kcf_areq_cache + sadc kmem_cache named unix:0:kcf_context_cache + sadc kmem_cache named unix:0:ipsec_actions + sadc kmem_cache named unix:0:ipsec_selectors + sadc kmem_cache named unix:0:ipsec_policy + sadc kmem_cache named unix:0:ipsec_info + sadc kmem_cache named unix:0:ip_minor_arena_1 + sadc kmem_cache named unix:0:ipcl_conn_cache + sadc kmem_cache named unix:0:ipcl_tcpconn_cache + sadc kmem_cache named unix:0:ire_cache + sadc kmem_cache named unix:0:tcp_timercache + sadc kmem_cache named unix:0:tcp_sack_info_cache + sadc kmem_cache named unix:0:tcp_iphc_cache + sadc kmem_cache named unix:0:squeue_cache + sadc kmem_cache named unix:0:sctp_conn_cache + sadc kmem_cache named unix:0:sctp_faddr_cache + sadc kmem_cache named unix:0:sctp_set_cache + sadc kmem_cache named unix:0:sctp_ftsn_set_cache + sadc kmem_cache named unix:0:sctpsock + sadc kmem_cache named unix:0:sctp_assoc + sadc kmem_cache named unix:0:socktpi_cache + sadc kmem_cache named unix:0:socktpi_unix_cache + sadc kmem_cache named unix:0:ncafs_cache + sadc kmem_cache named unix:0:process_cache + sadc kmem_cache named unix:0:exacct_object_cache + sadc kmem_cache named unix:0:fctl_cache + sadc kmem_cache named unix:0:tl_cache + sadc kmem_cache named unix:0:keysock_1 + sadc kmem_cache named unix:0:spdsock_1 + sadc kmem_cache named unix:0:fnode_cache + sadc kmem_cache named unix:0:pipe_cache + sadc kmem_cache named unix:0:namefs_inodes_1 + sadc kmem_cache named unix:0:port_cache + sadc kmem_cache named unix:0:lnode_cache + sadc kmem_cache named unix:0:clnt_clts_endpnt_cache + sadc kmem_cache named unix:0:pty_map + sadc kmem_cache named unix:0:sppptun_map + sadc kmem_cache named unix:0:dtrace_state_cache + sadc kmem_cache named unix:0:qif_head_cache + sadc kmem_cache named unix:0:udp_minor_1 + sadc kmem_cache named unix:0:authkern_cache + sadc kmem_cache named unix:0:authloopback_cache + sadc kmem_cache named unix:0:authdes_cache_handle + sadc kmem_cache named unix:0:rnode_cache + sadc kmem_cache named unix:0:nfs_access_cache + sadc kmem_cache named unix:0:client_handle_cache + sadc kmem_cache named unix:0:rnode4_cache + sadc kmem_cache named unix:0:svnode_cache + sadc kmem_cache named unix:0:nfs4_access_cache + sadc kmem_cache named unix:0:client_handle4_cache + sadc kmem_cache named unix:0:nfs4_ace4vals_cache + sadc kmem_cache named unix:0:nfs4_ace4_list_cache + sadc kmem_cache named unix:0:NFS_idmap_cache + sadc kmem_cache named unix:0:lm_vnode + sadc kmem_cache named unix:0:lm_xprt + sadc kmem_cache named unix:0:lm_sysid + sadc kmem_cache named unix:0:lm_client + sadc kmem_cache named unix:0:lm_async + sadc kmem_cache named unix:0:lm_sleep + sadc kmem_cache named unix:0:lm_config + sadc kmem_cache named unix:0:nfslog_small_rec + sadc kmem_cache named unix:0:nfslog_medium_rec + sadc kmem_cache named unix:0:nfslog_large_rec + sadc kmem_cache named unix:0:exi_cache_handle + sadc kmem_cache named unix:0:Client_entry_cache + sadc kmem_cache named unix:0:OpenOwner_entry_cache + sadc kmem_cache named unix:0:OpenStateID_entry_cache + sadc kmem_cache named unix:0:LockStateID_entry_cache + sadc kmem_cache named unix:0:Lockowner_entry_cache + sadc kmem_cache named unix:0:File_entry_cache + sadc kmem_cache named unix:0:DelegStateID_entry_cache + sadc kmem_cache named unix:0:ip_minor_1 + sadc kmem_cache named unix:0:ar_minor_1 + sadc kmem_cache named unix:0:icmp_minor_1 + sadc kmem_cache named unix:0:crypto_session_cache + sadc kmem_cache named unix:0:fcsm_job_cache + sadc kmem_cache named unix:0:sd0_cache + sadc kmem_cache named unix:0:hsfs_hsnode_cache + sadc kmem_cache named unix:0:kmem_magazine_1 + sadc misc raw unix:0:sysinfo + sadc vm raw unix:0:vminfo + sadc misc named unix:0:system_misc + sadc kmem_cache named unix:0:file_cache + sadc ufs named ufs:0:inode_cache + sadc misc raw cpu_stat:0:cpu_stat0 + sadc kmem_cache named unix:0:kmem_magazine_1 + sadc kmem_cache named unix:0:kmem_magazine_3 + sadc kmem_cache named unix:0:kmem_magazine_7 + sadc kmem_cache named unix:0:kmem_magazine_15 + sadc kmem_cache named unix:0:kmem_magazine_31 + sadc kmem_cache named unix:0:kmem_magazine_47 + sadc kmem_cache named unix:0:kmem_magazine_63 + sadc kmem_cache named unix:0:kmem_magazine_95 + sadc kmem_cache named unix:0:kmem_magazine_143 + sadc kmem_cache named unix:0:kmem_slab_cache + sadc kmem_cache named unix:0:kmem_bufctl_cache + sadc kmem_cache named unix:0:kmem_bufctl_audit_cache + sadc kmem_cache named unix:0:kmem_va_4096 + sadc kmem_cache named unix:0:kmem_va_8192 + sadc kmem_cache named unix:0:kmem_va_12288 + sadc kmem_cache named unix:0:kmem_va_16384 + sadc kmem_cache named unix:0:kmem_va_20480 + sadc kmem_cache named unix:0:kmem_va_24576 + sadc kmem_cache named unix:0:kmem_va_28672 + sadc kmem_cache named unix:0:kmem_va_32768 + sadc kmem_cache named unix:0:kmem_alloc_8 + sadc kmem_cache named unix:0:kmem_alloc_16 + sadc kmem_cache named unix:0:kmem_alloc_24 + sadc kmem_cache named unix:0:kmem_alloc_32 + sadc kmem_cache named unix:0:kmem_alloc_40 + sadc kmem_cache named unix:0:kmem_alloc_48 + sadc kmem_cache named unix:0:kmem_alloc_56 + sadc kmem_cache named unix:0:kmem_alloc_64 + sadc kmem_cache named unix:0:kmem_alloc_80 + sadc kmem_cache named unix:0:kmem_alloc_96 + sadc kmem_cache named unix:0:kmem_alloc_112 + sadc kmem_cache named unix:0:kmem_alloc_128 + sadc kmem_cache named unix:0:kmem_alloc_160 + sadc kmem_cache named unix:0:kmem_alloc_192 + sadc kmem_cache named unix:0:kmem_alloc_224 + sadc kmem_cache named unix:0:kmem_alloc_256 + sadc kmem_cache named unix:0:kmem_alloc_320 + sadc kmem_cache named unix:0:kmem_alloc_384 + sadc kmem_cache named unix:0:kmem_alloc_448 + sadc kmem_cache named unix:0:kmem_alloc_512 + sadc kmem_cache named unix:0:kmem_alloc_640 + sadc kmem_cache named unix:0:kmem_alloc_768 + sadc kmem_cache named unix:0:kmem_alloc_896 + sadc kmem_cache named unix:0:kmem_alloc_1152 + sadc kmem_cache named unix:0:kmem_alloc_1344 + sadc kmem_cache named unix:0:kmem_alloc_1600 + sadc kmem_cache named unix:0:kmem_alloc_2048 + sadc kmem_cache named unix:0:kmem_alloc_2688 + sadc kmem_cache named unix:0:kmem_alloc_4096 + sadc kmem_cache named unix:0:kmem_alloc_8192 + sadc kmem_cache named unix:0:kmem_alloc_12288 + sadc kmem_cache named unix:0:kmem_alloc_16384 + sadc kmem_cache named unix:0:streams_mblk + sadc kmem_cache named unix:0:streams_dblk_64 + sadc kmem_cache named unix:0:streams_dblk_128 + sadc kmem_cache named unix:0:streams_dblk_320 + sadc kmem_cache named unix:0:streams_dblk_576 + sadc kmem_cache named unix:0:streams_dblk_1088 + sadc kmem_cache named unix:0:streams_dblk_1536 + sadc kmem_cache named unix:0:streams_dblk_1984 + sadc kmem_cache named unix:0:streams_dblk_2624 + sadc kmem_cache named unix:0:streams_dblk_3968 + sadc kmem_cache named unix:0:streams_dblk_8192 + sadc kmem_cache named unix:0:streams_dblk_12160 + sadc kmem_cache named unix:0:streams_dblk_16384 + sadc kmem_cache named unix:0:streams_dblk_20352 + sadc kmem_cache named unix:0:streams_dblk_24576 + sadc kmem_cache named unix:0:streams_dblk_28544 + sadc kmem_cache named unix:0:streams_dblk_32768 + sadc kmem_cache named unix:0:streams_dblk_36736 + sadc kmem_cache named unix:0:streams_dblk_40960 + sadc kmem_cache named unix:0:streams_dblk_44928 + sadc kmem_cache named unix:0:streams_dblk_49152 + sadc kmem_cache named unix:0:streams_dblk_53120 + sadc kmem_cache named unix:0:streams_dblk_57344 + sadc kmem_cache named unix:0:streams_dblk_61312 + sadc kmem_cache named unix:0:streams_dblk_65536 + sadc kmem_cache named unix:0:streams_dblk_69504 + sadc kmem_cache named unix:0:streams_dblk_73728 + sadc kmem_cache named unix:0:streams_dblk_esb + sadc kmem_cache named unix:0:streams_fthdr + sadc kmem_cache named unix:0:streams_ftblk + sadc kmem_cache named unix:0:multidata + sadc kmem_cache named unix:0:multidata_pdslab + sadc kmem_cache named unix:0:multidata_pattbl + sadc kmem_cache named unix:0:taskq_ent_cache + sadc kmem_cache named unix:0:taskq_cache + sadc kmem_cache named unix:0:kmem_io_512M_128 + sadc kmem_cache named unix:0:kmem_io_512M_256 + sadc kmem_cache named unix:0:kmem_io_512M_512 + sadc kmem_cache named unix:0:kmem_io_512M_1024 + sadc kmem_cache named unix:0:kmem_io_512M_2048 + sadc kmem_cache named unix:0:kmem_io_512M_4096 + sadc kmem_cache named unix:0:kmem_io_16M_128 + sadc kmem_cache named unix:0:kmem_io_16M_256 + sadc kmem_cache named unix:0:kmem_io_16M_512 + sadc kmem_cache named unix:0:kmem_io_16M_1024 + sadc kmem_cache named unix:0:kmem_io_16M_2048 + sadc kmem_cache named unix:0:kmem_io_16M_4096 + sadc kmem_cache named unix:0:id32_cache + sadc kmem_cache named unix:0:bp_map_4096 + sadc kmem_cache named unix:0:bp_map_8192 + sadc kmem_cache named unix:0:bp_map_12288 + sadc kmem_cache named unix:0:bp_map_16384 + sadc kmem_cache named unix:0:bp_map_20480 + sadc kmem_cache named unix:0:bp_map_24576 + sadc kmem_cache named unix:0:bp_map_28672 + sadc kmem_cache named unix:0:bp_map_32768 + sadc kmem_cache named unix:0:mod_hash_entries + sadc kmem_cache named unix:0:ipp_mod + sadc kmem_cache named unix:0:ipp_action + sadc kmem_cache named unix:0:ipp_packet + sadc kmem_cache named unix:0:htable_t + sadc kmem_cache named unix:0:hment_t + sadc kmem_cache named unix:0:hat_t + sadc kmem_cache named unix:0:HatHash + sadc kmem_cache named unix:0:seg_cache + sadc kmem_cache named unix:0:snode_cache + sadc kmem_cache named unix:0:dv_node_cache + sadc kmem_cache named unix:0:dev_info_node_cache + sadc kmem_cache named unix:0:segkp_4096 + sadc kmem_cache named unix:0:segkp_8192 + sadc kmem_cache named unix:0:segkp_12288 + sadc kmem_cache named unix:0:segkp_16384 + sadc kmem_cache named unix:0:segkp_20480 + sadc kmem_cache named unix:0:thread_cache + sadc kmem_cache named unix:0:lwp_cache + sadc kmem_cache named unix:0:turnstile_cache + sadc kmem_cache named unix:0:cred_cache + sadc kmem_cache named unix:0:rctl_cache + sadc kmem_cache named unix:0:rctl_val_cache + sadc kmem_cache named unix:0:task_cache + sadc kmem_cache named unix:0:cyclic_id_cache + sadc kmem_cache named unix:0:dnlc_space_cache + sadc kmem_cache named unix:0:vn_cache + sadc kmem_cache named unix:0:file_cache + sadc kmem_cache named unix:0:stream_head_cache + sadc kmem_cache named unix:0:queue_cache + sadc kmem_cache named unix:0:syncq_cache + sadc kmem_cache named unix:0:qband_cache + sadc kmem_cache named unix:0:linkinfo_cache + sadc kmem_cache named unix:0:ciputctrl_cache + sadc kmem_cache named unix:0:serializer_cache + sadc kmem_cache named unix:0:as_cache + sadc kmem_cache named unix:0:marker_cache + sadc kmem_cache named unix:0:anon_cache + sadc kmem_cache named unix:0:anonmap_cache + sadc kmem_cache named unix:0:segvn_cache + sadc kmem_cache named unix:0:flk_edges + sadc kmem_cache named unix:0:fdb_cache + sadc kmem_cache named unix:0:timer_cache + sadc kmem_cache named unix:0:physio_buf_cache + sadc kmem_cache named unix:0:ufs_inode_cache + sadc kmem_cache named unix:0:directio_buf_cache + sadc kmem_cache named unix:0:lufs_save + sadc kmem_cache named unix:0:lufs_bufs + sadc kmem_cache named unix:0:lufs_mapentry_cache + sadc kmem_cache named unix:0:kcf_sreq_cache + sadc kmem_cache named unix:0:kcf_areq_cache + sadc kmem_cache named unix:0:kcf_context_cache + sadc kmem_cache named unix:0:ipsec_actions + sadc kmem_cache named unix:0:ipsec_selectors + sadc kmem_cache named unix:0:ipsec_policy + sadc kmem_cache named unix:0:ipsec_info + sadc kmem_cache named unix:0:ip_minor_arena_1 + sadc kmem_cache named unix:0:ipcl_conn_cache + sadc kmem_cache named unix:0:ipcl_tcpconn_cache + sadc kmem_cache named unix:0:ire_cache + sadc kmem_cache named unix:0:tcp_timercache + sadc kmem_cache named unix:0:tcp_sack_info_cache + sadc kmem_cache named unix:0:tcp_iphc_cache + sadc kmem_cache named unix:0:squeue_cache + sadc kmem_cache named unix:0:sctp_conn_cache + sadc kmem_cache named unix:0:sctp_faddr_cache + sadc kmem_cache named unix:0:sctp_set_cache + sadc kmem_cache named unix:0:sctp_ftsn_set_cache + sadc kmem_cache named unix:0:sctpsock + sadc kmem_cache named unix:0:sctp_assoc + sadc kmem_cache named unix:0:socktpi_cache + sadc kmem_cache named unix:0:socktpi_unix_cache + sadc kmem_cache named unix:0:ncafs_cache + sadc kmem_cache named unix:0:process_cache + sadc kmem_cache named unix:0:exacct_object_cache + sadc kmem_cache named unix:0:fctl_cache + sadc kmem_cache named unix:0:tl_cache + sadc kmem_cache named unix:0:keysock_1 + sadc kmem_cache named unix:0:spdsock_1 + sadc kmem_cache named unix:0:fnode_cache + sadc kmem_cache named unix:0:pipe_cache + sadc kmem_cache named unix:0:namefs_inodes_1 + sadc kmem_cache named unix:0:port_cache + sadc kmem_cache named unix:0:lnode_cache + sadc kmem_cache named unix:0:clnt_clts_endpnt_cache + sadc kmem_cache named unix:0:pty_map + sadc kmem_cache named unix:0:sppptun_map + sadc kmem_cache named unix:0:dtrace_state_cache + sadc kmem_cache named unix:0:qif_head_cache + sadc kmem_cache named unix:0:udp_minor_1 + sadc kmem_cache named unix:0:authkern_cache + sadc kmem_cache named unix:0:authloopback_cache + sadc kmem_cache named unix:0:authdes_cache_handle + sadc kmem_cache named unix:0:rnode_cache + sadc kmem_cache named unix:0:nfs_access_cache + sadc kmem_cache named unix:0:client_handle_cache + sadc kmem_cache named unix:0:rnode4_cache + sadc kmem_cache named unix:0:svnode_cache + sadc kmem_cache named unix:0:nfs4_access_cache + sadc kmem_cache named unix:0:client_handle4_cache + sadc kmem_cache named unix:0:nfs4_ace4vals_cache + sadc kmem_cache named unix:0:nfs4_ace4_list_cache + sadc kmem_cache named unix:0:NFS_idmap_cache + sadc kmem_cache named unix:0:lm_vnode + sadc kmem_cache named unix:0:lm_xprt + sadc kmem_cache named unix:0:lm_sysid + sadc kmem_cache named unix:0:lm_client + sadc kmem_cache named unix:0:lm_async + sadc kmem_cache named unix:0:lm_sleep + sadc kmem_cache named unix:0:lm_config + sadc kmem_cache named unix:0:nfslog_small_rec + sadc kmem_cache named unix:0:nfslog_medium_rec + sadc kmem_cache named unix:0:nfslog_large_rec + sadc kmem_cache named unix:0:exi_cache_handle + sadc kmem_cache named unix:0:Client_entry_cache + sadc kmem_cache named unix:0:OpenOwner_entry_cache + sadc kmem_cache named unix:0:OpenStateID_entry_cache + sadc kmem_cache named unix:0:LockStateID_entry_cache + sadc kmem_cache named unix:0:Lockowner_entry_cache + sadc kmem_cache named unix:0:File_entry_cache + sadc kmem_cache named unix:0:DelegStateID_entry_cache + sadc kmem_cache named unix:0:ip_minor_1 + sadc kmem_cache named unix:0:ar_minor_1 + sadc kmem_cache named unix:0:icmp_minor_1 + sadc kmem_cache named unix:0:crypto_session_cache + sadc kmem_cache named unix:0:fcsm_job_cache + sadc kmem_cache named unix:0:sd0_cache + sadc kmem_cache named unix:0:hsfs_hsnode_cache + sadc vmem named vmem:16:kmem_oversize + sadc disk io cmdk:0:cmdk0 + sadc nfs io nfs:1:nfs1 + sadc disk io sd:0:sd0 + sadc usb_byte_count io usba:0:uhci0,bulk + sadc usb_byte_count io usba:0:uhci0,ctrl + sadc usb_byte_count io usba:0:uhci0,intr + sadc usb_byte_count io usba:0:uhci0,isoch + sadc usb_byte_count io usba:0:uhci0,total + sadc usb_byte_count io usba:1:uhci1,bulk + sadc usb_byte_count io usba:1:uhci1,ctrl + sadc usb_byte_count io usba:1:uhci1,intr + sadc usb_byte_count io usba:1:uhci1,isoch + sadc usb_byte_count io usba:1:uhci1,total + +Yep, to print the four fields from "sar -u 1 1", sadc read the ENTIRE +KSTAT TREE FIVE TIMES. + +Comparing the effect of this to vmstat, + + # ptime vmstat 1 6 + kthr memory page disk faults cpu + r b w swap free re mf pi po fr de sr cd s0 -- -- in sy cs us sy id + 0 0 43 907784 115324 29 124 34 1 1 0 4 2 0 0 0 277 470 210 1 2 97 + 0 0 38 750856 172304 1 40 0 0 0 0 0 0 0 0 0 230 224 130 1 1 98 + 0 0 38 750856 172304 0 0 0 0 0 0 0 0 0 0 0 219 168 111 0 1 99 + 0 0 38 750856 172304 0 0 0 0 0 0 0 0 0 0 0 226 109 113 0 0 100 + 0 0 38 750856 172304 0 0 0 0 0 0 0 0 0 0 0 225 246 137 1 1 98 + 0 0 38 750856 172304 0 0 0 0 0 0 0 0 0 0 0 222 175 119 0 1 99 + + real 5.060 + user 0.006 + sys 0.013 + +Ok, so vmstat causes a total of 13 ms of sys time - much of which would +be the fork and exec. Now lets try sar, + + # ptime sar -u 1 5 + + SunOS jupiter 5.10 Generic i86pc 04/21/2006 + + 23:42:55 %usr %sys %wio %idle + 23:42:56 0 3 0 97 + 23:42:57 1 2 0 97 + 23:42:58 0 2 0 98 + 23:42:59 1 3 0 96 + 23:43:00 0 2 0 98 + + Average 0 2 0 97 + + real 5.148 + user 0.010 + sys 0.127 + +Phwaorr - 127 ms of sys time to measure 5 samples. That is a LOT. diff --git a/cddl/contrib/dtracetoolkit/Examples/lastwords_example.txt b/cddl/contrib/dtracetoolkit/Examples/lastwords_example.txt new file mode 100644 index 00000000000..5452d2e36f2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/lastwords_example.txt @@ -0,0 +1,81 @@ +The following is a demonstration of the lastwords command, + + +Here we run lastwords to catch syscalls from processes named "bash" as they +exit, + + # ./lastwords bash + Tracing... Waiting for bash to exit... + 1091567219163679 1861 bash sigaction 0 0 + 1091567219177487 1861 bash sigaction 0 0 + 1091567219189692 1861 bash sigaction 0 0 + 1091567219202085 1861 bash sigaction 0 0 + 1091567219214553 1861 bash sigaction 0 0 + 1091567219226690 1861 bash sigaction 0 0 + 1091567219238786 1861 bash sigaction 0 0 + 1091567219251697 1861 bash sigaction 0 0 + 1091567219265770 1861 bash sigaction 0 0 + 1091567219294110 1861 bash gtime 42a7c194 0 + 1091567219428305 1861 bash write 5 0 + 1091567219451138 1861 bash setcontext 0 0 + 1091567219473911 1861 bash sigaction 0 0 + 1091567219516487 1861 bash stat64 0 0 + 1091567219547973 1861 bash open64 4 0 + 1091567219638345 1861 bash write 5 0 + 1091567219658886 1861 bash close 0 0 + 1091567219689094 1861 bash open64 4 0 + 1091567219704301 1861 bash fstat64 0 0 + 1091567219731796 1861 bash read 2fe 0 + 1091567219745541 1861 bash close 0 0 + 1091567219768536 1861 bash lwp_sigmask ffbffeff 0 + 1091567219787494 1861 bash ioctl 0 0 + 1091567219801338 1861 bash setpgrp 6a3 0 + 1091567219814067 1861 bash ioctl 0 0 + 1091567219825791 1861 bash lwp_sigmask ffbffeff 0 + 1091567219847778 1861 bash setpgrp 0 0 + TIME PID EXEC SYSCALL RETURN ERR + +In another window, a bash shell was executed and then exited normally. The +last few system calls that the bash shell made can be seen above. + + + + +In the following example we moniter the exit of bash shells again, but this +time the bash shell sends itself a "kill -8", + + # ./lastwords bash + Tracing... Waiting for bash to exit... + 1091650185555391 1865 bash sigaction 0 0 + 1091650185567963 1865 bash sigaction 0 0 + 1091650185580316 1865 bash sigaction 0 0 + 1091650185592381 1865 bash sigaction 0 0 + 1091650185605046 1865 bash sigaction 0 0 + 1091650185618451 1865 bash sigaction 0 0 + 1091650185647663 1865 bash gtime 42a7c1e7 0 + 1091650185794626 1865 bash kill 0 0 + 1091650185836941 1865 bash lwp_sigmask ffbffeff 0 + 1091650185884145 1865 bash stat64 0 0 + 1091650185916135 1865 bash open64 4 0 + 1091650186005673 1865 bash write b 0 + 1091650186025782 1865 bash close 0 0 + 1091650186052002 1865 bash open64 4 0 + 1091650186067538 1865 bash fstat64 0 0 + 1091650186094289 1865 bash read 309 0 + 1091650186108086 1865 bash close 0 0 + 1091650186129965 1865 bash lwp_sigmask ffbffeff 0 + 1091650186149092 1865 bash ioctl 0 0 + 1091650186162614 1865 bash setpgrp 6a3 0 + 1091650186175457 1865 bash ioctl 0 0 + 1091650186187206 1865 bash lwp_sigmask ffbffeff 0 + 1091650186209514 1865 bash setpgrp 0 0 + 1091650186225307 1865 bash sigaction 0 0 + 1091650186238832 1865 bash getpid 749 0 + 1091650186260149 1865 bash kill 0 0 + 1091650186277925 1865 bash setcontext 0 0 + TIME PID EXEC SYSCALL RETURN ERR + +The last few system calls are different, we can see the kill system call +before bash exits. + + diff --git a/cddl/contrib/dtracetoolkit/Examples/loads_example.txt b/cddl/contrib/dtracetoolkit/Examples/loads_example.txt new file mode 100644 index 00000000000..f369f960ad8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/loads_example.txt @@ -0,0 +1,19 @@ +The following is a demonstration of the loads.d script. + + +Here we run both loads.d and the uptime command for comparison, + + # uptime + 1:30am up 14 day(s), 2:27, 3 users, load average: 3.52, 3.45, 3.05 + + # ./loads.d + 2005 Jun 11 01:30:49, load average: 3.52, 3.45, 3.05 + +Both have returned the same load average, confirming that loads.d is +behaving as expected. + + +The point of loads.d is to demonstrate fetching the same data as uptime +does, in the DTrace language. It is not intended as a replacement +or substitute to the uptime(1) command. + diff --git a/cddl/contrib/dtracetoolkit/Examples/lockbydist_example.txt b/cddl/contrib/dtracetoolkit/Examples/lockbydist_example.txt new file mode 100644 index 00000000000..7310e5adde2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/lockbydist_example.txt @@ -0,0 +1,114 @@ +The following is a demonstration of the lockbyproc.d script, + + # lockbydist.d + dtrace: description 'lockstat:::adaptive-block ' matched 1 probe + ^C + + metadata-manager + value ------------- Distribution ------------- count + 131072 | 0 + 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 524288 | 0 + + sched + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9 + 65536 | 0 + + oracle + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@ 9 + 65536 |@@@@@@@@@@@@@@@@@@@@@ 10 + 131072 | 0 + +In the above output, oracle can be seen to have blocked 10 times from +65 to 131 microseconds, and 9 times from 32 to 65 microseconds. sched, +the kernel, has blocked several times also. metadata-manager only +blocked once, which was at least 262 microseconds. + + + +The following is a longer sample, + + # lockbydist.d + dtrace: description 'lockstat:::adaptive-block ' matched 1 probe + ^C + + svc.startd + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + + java + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 65536 | 0 + + oracle + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 65536 |@@@@@@@@@@@@@ 2 + 131072 | 0 + + mysql-test-run + value ------------- Distribution ------------- count + 65536 | 0 + 131072 |@@@@@@@@@@@@@@@@@@@@ 1 + 262144 |@@@@@@@@@@@@@@@@@@@@ 1 + 524288 | 0 + + pageout + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@ 1 + 65536 | 0 + 131072 | 0 + 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 524288 | 0 + + mysqltest + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@ 1 + 65536 |@@@@@@@@@@@ 2 + 131072 |@@@@@@@@@@@ 2 + 262144 |@@@@@@@@@@@ 2 + 524288 | 0 + + sched + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@ 11 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 25 + 65536 | 0 + 131072 |@ 1 + 262144 |@@ 2 + 524288 | 0 + + mysqld + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@ 22 + 65536 |@@@@@@@@@ 9 + 131072 | 0 + 262144 |@@@@ 4 + 524288 | 0 + 1048576 | 0 + 2097152 | 0 + 4194304 |@@ 2 + 8388608 |@@@@ 4 + 16777216 | 0 + +The length of time threads were blocked, and the number of such blocks +can be easily observed from the above output. + +mysqld can be seen to have many short blocks: 22 from 32 -> 65 microseconds, +and a few larger blocks: 4 from 8 -> 16 ms. + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/lockbyproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/lockbyproc_example.txt new file mode 100644 index 00000000000..11092353fdf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/lockbyproc_example.txt @@ -0,0 +1,42 @@ +The following is a demonstration of the lockbyproc.d script, + + # lockbyproc.d + dtrace: description 'lockstat:::adaptive-block ' matched 1 probe + ^C + + pageout 49438 + mysql-test-run 96414 + oracle 149086 + sched 220601 + +The above output shows that threads belonging to sched, the kernel, spent +a total of 220 microseconds waiting for an adaptive mutex lock. + + + + +This example sampled for a longer interval, + + # lockbyproc.d + dtrace: description 'lockstat:::adaptive-block ' matched 1 probe + ^C + + init 136228 + java 371896 + oracle 783402 + sched 2315779 + mysqltest 9428277 + mysql-test-run 10093658 + mysqld 17412999 + fsflush 19676738 + +Here we can see threads belonging to fsflush have spent a total of 19.7 ms +waiting for an adaptive mutex. Note: it's not easy to say that it means a +19.7 ms delay in the completion of the fsflush program, as this value is +the sum of the block times across all the threads. So it is possible that +many threads were blocked at the same time, eg, it could have been 19 threads +blocked during the same 1 ms. + + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/minfbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/minfbypid_example.txt new file mode 100644 index 00000000000..c2fffb4c6f2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/minfbypid_example.txt @@ -0,0 +1,20 @@ +The following is a demonstration of the minfbypid.d script, + + +Here we run it for a few seconds then hit Ctrl-C, + + # minfbypid.d + Tracing... Hit Ctrl-C to end. + ^C + PID CMD MINFAULTS + 11021 dtrace 54 + 11023 ls 56 + 11024 df 57 + 11023 bash 75 + 11022 bash 75 + 11024 bash 76 + 11022 find 91 + +In the above output, we can see that each of the bash shells had about 75 +minor faults each. Minor faults are an indication of memory consumption. + diff --git a/cddl/contrib/dtracetoolkit/Examples/minfbyproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/minfbyproc_example.txt new file mode 100644 index 00000000000..0c1ce8401c8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/minfbyproc_example.txt @@ -0,0 +1,14 @@ +The following is an example of the minfbyproc.d script, + + # minfbyproc.d + dtrace: description 'vminfo:::as_fault ' matched 1 probe + ^C + + mozilla-bin 18 + dtrace 57 + find 64 + bash 150 + tar 501 + +In the above output, tar processes caused 501 minor faults. + diff --git a/cddl/contrib/dtracetoolkit/Examples/mmapfiles_example.txt b/cddl/contrib/dtracetoolkit/Examples/mmapfiles_example.txt new file mode 100644 index 00000000000..eca43705604 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/mmapfiles_example.txt @@ -0,0 +1,109 @@ +The following is a demonstration of the mmapfiles.d script. + +Here we run mmapfiles.d while in another window a new bash shell is started. +The files that were mapped in aren't suprising, they are the common shared +librarios, + + # mmapfiles.d + Tracing... Hit Ctrl-C to end. + ^C + MMAPS CMD PATHNAME + 1 bash /lib/libdl.so.1 + 3 bash /lib/libsocket.so.1 + 3 bash /lib/libnsl.so.1 + 3 bash /lib/libc.so.1 + 3 bash /lib/libcurses.so.1 + + + +Now we examine zsh. This time a number of extra libraries are mapped, + + # mmapfiles.d + Tracing... Hit Ctrl-C to end. + ^C + MMAPS CMD PATHNAME + 1 zsh /lib/libdl.so.1 + 3 getent /lib/libc.so.1 + 3 getent /lib/libnsl.so.1 + 3 getent /lib/libsocket.so.1 + 3 zsh /usr/sfw/lib/zsh/4.2.1/zsh/parameter.so + 3 zsh /usr/sfw/lib/zsh/4.2.1/zsh/zutil.so + 3 zsh /usr/sfw/lib/zsh/4.2.1/zsh/complete.so + 3 zsh /usr/sfw/lib/zsh/4.2.1/zsh/stat.so + 3 zsh /usr/sfw/lib/zsh/4.2.1/zsh/zle.so + 3 tset /lib/libc.so.1 + 3 tset /opt/sfw/lib/libncurses.so.5.2 + 3 zsh /lib/libc.so.1 + 3 zsh /lib/libm.so.2 + 3 zsh /lib/libcurses.so.1 + 3 zsh /lib/libnsl.so.1 + 3 zsh /usr/sfw/lib/zsh/4.2.1/zsh/complist.so + 3 zsh /lib/libsocket.so.1 + + + +Sometimes the output can be quite suprising. The following shows the mmaps +caused by the "sdtaudiocontrol" tool, a java tool to change the volume levels +on Solaris, + + # mmapfiles.d + Tracing... Hit Ctrl-C to end. + + MMAPS CMD PATHNAME + 1 java /usr/jdk/packages/jmf/lib/ext/jmplay.jar + 1 java /usr/dt/appconfig/sdtaudiocontrol/classes/SDtAudioControl.jar + 1 java /usr/dt/classes/xservices.jar + 1 java /usr/dt/classes/jhall.jar + 1 java /usr/dt/classes/jsearch.jar + 1 java /usr/jdk/packages/jmf/lib/ext/mp3plugin.jar + 1 java /usr/jdk/packages/jmf/lib/ext/jmfmp3.jar + 1 java /usr/jdk/packages/jmf/lib/ext/multiplayer.jar + 1 java /usr/jdk/packages/jmf/lib/ext/mediaplayer.jar + 1 java /usr/jdk/packages/jmf/lib/ext/jmf.jar + 1 java /usr/jdk/packages/jai-imageio/lib/ext/jai_imageio.jar + 1 java /usr/jdk/packages/jai-imageio/lib/ext/clibwrapper_jiio.jar + 1 java /usr/jdk/packages/jai/lib/ext/mlibwrapper_jai.jar + 1 java /usr/jdk/packages/jai/lib/ext/jai_core.jar + 1 java /usr/jdk/packages/jai/lib/ext/jai_codec.jar + 1 java /usr/jdk/packages/javax.help-2.0/lib/jhall.jar + 1 java /usr/jdk/instances/jdk1.5.0/jre/lib/ext/sunpkcs11.jar + 1 java /usr/jdk/instances/jdk1.5.0/jre/lib/ext/sunjce_provider.jar + 1 java /usr/jdk/instances/jdk1.5.0/jre/lib/ext/localedata.jar + 1 java /usr/jdk/instances/jdk1.5.0/jre/lib/ext/dnsns.jar + 1 java /tmp/hsperfdata_root/6464 + 1 java /tmp/hsperfdata_root/6455 + 2 java /usr/lib/libsched.so.1 + 2 java /usr/jdk/instances/jdk1.5.0/jre/lib/charsets.jar + 2 java /usr/jdk/instances/jdk1.5.0/jre/lib/jce.jar + 2 java /usr/jdk/instances/jdk1.5.0/jre/lib/jsse.jar + 2 java /usr/jdk/instances/jdk1.5.0/jre/lib/rt.jar + 3 sdtaudiocontrol /lib/libc.so.1 + 3 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/headless/libmawt.so + 3 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/libmlib_image.so + 3 ls /lib/libc.so.1 + 3 rm /lib/libc.so.1 + 3 java /usr/dt/appconfig/sdtaudiocontrol/lib/libAudioControl.so + 3 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/libawt.so + 4 java /lib/libdl.so.1 + 6 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/libzip.so + 6 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/libjava.so + 6 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/libverify.so + 6 java /lib/libscf.so.1 + 6 java /usr/lib/libCrun.so.1 + 6 java /lib/libnsl.so.1 + 6 java /lib/libm.so.1 + 6 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/client/libjvm.so + 6 java /lib/libsocket.so.1 + 6 java /lib/libuutil.so.1 + 6 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/native_threads/libhpi.so + 6 java /lib/libmp.so.2 + 6 java /lib/libmd5.so.1 + 6 java /lib/libm.so.2 + 6 java /lib/libdoor.so.1 + 8 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/client/classes.jsa + 8 java /lib/libthread.so.1 + 12 java /lib/libc.so.1 + 21 awk /lib/libm.so.2 + 21 awk /lib/libc.so.1 + 65 java /devices/pseudo/mm@0:zero + diff --git a/cddl/contrib/dtracetoolkit/Examples/modcalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/modcalls_example.txt new file mode 100644 index 00000000000..f920d20581b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/modcalls_example.txt @@ -0,0 +1,47 @@ +The following is an example of the modcalls.d oneliner, + + +Here we run it for a few seconds then hit Ctrl-C, + + # modcalls.d + dtrace: script './modcalls.d' matched 18437 probes + ^C + + ptm 2 + mntfs 2 + pool 2 + kcf 4 + pts 5 + portfs 6 + pset 6 + ttcompat 9 + ptem 9 + devfs 13 + ipf 15 + namefs 20 + ctfs 22 + procfs 22 + ldterm 23 + ipgpc 48 + sockfs 58 + flowacct 69 + ata 70 + gld 75 + rtls 76 + specfs 83 + ip 201 + uhci 294 + TS 333 + tmpfs 694 + doorfs 897 + ufs 1329 + uppc 5617 + unix 49794 + genunix 53445 + +The output lists kernel modules, and the number of function calls for +each module. For example, "rtls" - the network driver, called 76 functions. + +This script may be useful to determine whether drivers are "thinking" when +troubleshooting driver issues. + diff --git a/cddl/contrib/dtracetoolkit/Examples/newproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/newproc_example.txt new file mode 100644 index 00000000000..f392b050f88 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/newproc_example.txt @@ -0,0 +1,19 @@ +The following is an example of the newproc.d script, + + # ./newproc.d + dtrace: description 'proc:::exec-success ' matched 1 probe + CPU ID FUNCTION:NAME + 0 3297 exec_common:exec-success man ls + 0 3297 exec_common:exec-success sh -c cd /usr/share/man; tbl /usr/share/man/man1/ls.1 |neqn /usr/share/lib/pub/ + 0 3297 exec_common:exec-success tbl /usr/share/man/man1/ls.1 + 0 3297 exec_common:exec-success neqn /usr/share/lib/pub/eqnchar - + 0 3297 exec_common:exec-success nroff -u0 -Tlp -man - + 0 3297 exec_common:exec-success col -x + 0 3297 exec_common:exec-success sh -c trap '' 1 15; /usr/bin/mv -f/tmp/mpzIaOZF /usr/share/man/cat1/ls.1 2> /d + 0 3297 exec_common:exec-success /usr/bin/mv -f /tmp/mpzIaOZF /usr/share/man/cat1/ls.1 + 0 3297 exec_common:exec-success sh -c more -s /tmp/mpzIaOZF + 0 3297 exec_common:exec-success more -s /tmp/mpzIaOZF + +The above output was caught when running "man ls". This identifies all the +commands responsible for processing the man page. + diff --git a/cddl/contrib/dtracetoolkit/Examples/nfswizard_example.txt b/cddl/contrib/dtracetoolkit/Examples/nfswizard_example.txt new file mode 100644 index 00000000000..68fb1854237 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/nfswizard_example.txt @@ -0,0 +1,67 @@ +The following is a demonstration of the NFS client wizard tool, nfswizard.d, + + + + # nfswizard.d + Tracing... Hit Ctrl-C to end. + ^C + NFS Client Wizard. 2005 Dec 2 14:59:07 -> 2005 Dec 2 14:59:14 + + Read: 4591616 bytes (4 Mb) + Write: 0 bytes (0 Mb) + + Read: 640 Kb/sec + Write: 0 Kb/sec + + NFS I/O events: 166 + Avg response time: 8 ms + Max response time: 14 ms + + Response times (us): + value ------------- Distribution ------------- count + 128 | 0 + 256 | 1 + 512 |@@@ 14 + 1024 |@ 4 + 2048 |@@@@@@@ 30 + 4096 |@@@@@ 20 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@ 97 + 16384 | 0 + + Top 25 files accessed (bytes): + PATHNAME BYTES + /net/mars/var/tmp/adm/vold.log 4096 + /net/mars/var/tmp/adm/uptime 4096 + /net/mars/var/tmp/adm/mail 4096 + /net/mars/var/tmp/adm/authlog.5 4096 + /net/mars/var/tmp/adm/ftpd 12288 + /net/mars/var/tmp/adm/spellhist 16384 + /net/mars/var/tmp/adm/messages 16384 + /net/mars/var/tmp/adm/utmpx 20480 + /net/mars/var/tmp/adm/ftpd.2 20480 + /net/mars/var/tmp/adm/ftpd.3 20480 + /net/mars/var/tmp/adm/ftpd.1 24576 + /net/mars/var/tmp/adm/ftpd.0 24576 + /net/mars/var/tmp/adm/lastlog 28672 + /net/mars/var/tmp/adm/ipf 61440 + /net/mars/var/tmp/adm/loginlog 69632 + /net/mars/var/tmp/adm/ipf.4 73728 + /net/mars/var/tmp/adm/messages.20040906 81920 + /net/mars/var/tmp/adm/ipf.3 102400 + /net/mars/var/tmp/adm/ipf.1 110592 + /net/mars/var/tmp/adm/ipf.5 114688 + /net/mars/var/tmp/adm/ipf.2 114688 + /net/mars/var/tmp/adm/ipf.0 122880 + /net/mars/var/tmp/adm/route.log 266240 + /net/mars/var/tmp/adm/pppd.log 425984 + /net/mars/var/tmp/adm/wtmpx 2842624 + + + +In the above demonstration, we run nfswizard.d for several seconds then hit +Ctrl-C. The report contains useful information about NFS client activity, +including response time statistics and file access details. + +Note: this is measuring activity caused by NFS client processes (which must +be on the same server). It is not examining NFS server processes. + diff --git a/cddl/contrib/dtracetoolkit/Examples/oneliners_examples.txt b/cddl/contrib/dtracetoolkit/Examples/oneliners_examples.txt new file mode 100644 index 00000000000..9ca0fa62f67 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/oneliners_examples.txt @@ -0,0 +1,307 @@ +# +# DTrace OneLiners Examples +# + +### New processes with arguments, + +# dtrace -n 'proc:::exec-success { trace(curpsinfo->pr_psargs); }' +dtrace: description 'proc:::exec-success ' matched 1 probe +CPU ID FUNCTION:NAME + 0 3297 exec_common:exec-success man ls + 0 3297 exec_common:exec-success sh -c cd /usr/share/man; tbl /usr/share/man/man1/ls.1 |neqn /usr/share/lib/pub/ + 0 3297 exec_common:exec-success tbl /usr/share/man/man1/ls.1 + 0 3297 exec_common:exec-success neqn /usr/share/lib/pub/eqnchar - + 0 3297 exec_common:exec-success nroff -u0 -Tlp -man - + 0 3297 exec_common:exec-success col -x + 0 3297 exec_common:exec-success sh -c trap '' 1 15; /usr/bin/mv -f /tmp/mpzIaOZF /usr/share/man/cat1/ls.1 2> /d + 0 3297 exec_common:exec-success /usr/bin/mv -f /tmp/mpzIaOZF /usr/share/man/cat1/ls.1 + 0 3297 exec_common:exec-success sh -c more -s /tmp/mpzIaOZF + 0 3297 exec_common:exec-success more -s /tmp/mpzIaOZF + + +### Files opened by process, + +# dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }' +dtrace: description 'syscall::open*:entry ' matched 2 probes +CPU ID FUNCTION:NAME + 0 14 open:entry gnome-netstatus- /dev/kstat + 0 14 open:entry man /var/ld/ld.config + 0 14 open:entry man /lib/libc.so.1 + 0 14 open:entry man /usr/share/man/man.cf + 0 14 open:entry man /usr/share/man/windex + 0 14 open:entry man /usr/share/man/man1/ls.1 + 0 14 open:entry man /usr/share/man/man1/ls.1 + 0 14 open:entry man /tmp/mpqea4RF + 0 14 open:entry sh /var/ld/ld.config + 0 14 open:entry sh /lib/libc.so.1 + 0 14 open:entry neqn /var/ld/ld.config + 0 14 open:entry neqn /lib/libc.so.1 + 0 14 open:entry neqn /usr/share/lib/pub/eqnchar + 0 14 open:entry tbl /var/ld/ld.config + 0 14 open:entry tbl /lib/libc.so.1 + 0 14 open:entry tbl /usr/share/man/man1/ls.1 + 0 14 open:entry nroff /var/ld/ld.config +[...] + + +### Syscall count by program, + +# dtrace -n 'syscall:::entry { @num[execname] = count(); }' +dtrace: description 'syscall:::entry ' matched 228 probes +^C + snmpd 1 + utmpd 2 + inetd 2 + nscd 7 + svc.startd 11 + sendmail 31 + poold 133 + dtrace 1720 + + +### Syscall count by syscall, + +# dtrace -n 'syscall:::entry { @num[probefunc] = count(); }' +dtrace: description 'syscall:::entry ' matched 228 probes +^C + fstat 1 + setcontext 1 + lwp_park 1 + schedctl 1 + mmap 1 + sigaction 2 + pset 2 + lwp_sigmask 2 + gtime 3 + sysconfig 3 + write 4 + brk 6 + pollsys 7 + p_online 558 + ioctl 579 + + +### Syscall count by process, + +# dtrace -n 'syscall:::entry { @num[pid,execname] = count(); }' +dtrace: description 'syscall:::entry ' matched 228 probes +^C + 1109 svc.startd 1 + 4588 svc.startd 2 + 7 svc.startd 2 + 3950 svc.startd 2 + 1626 nscd 2 + 870 svc.startd 2 + 82 nscd 6 + 5011 sendmail 10 + 6010 poold 74 + 8707 dtrace 1720 + + +### Read bytes by process, + +# dtrace -n 'sysinfo:::readch { @bytes[execname] = sum(arg0); }' +dtrace: description 'sysinfo:::readch ' matched 4 probes +^C + + mozilla-bin 16 + gnome-smproxy 64 + metacity 64 + dsdm 64 + wnck-applet 64 + xscreensaver 96 + gnome-terminal 900 + ttymon 5952 + Xorg 17544 + + +### Write bytes by process, + +# dtrace -n 'sysinfo:::writech { @bytes[execname] = sum(arg0); }' +dtrace: description 'sysinfo:::writech ' matched 4 probes +^C + + dtrace 1 + gnome-settings-d 8 + xscreensaver 8 + gnome-panel 8 + nautilus 8 + date 29 + wnck-applet 120 + bash 210 + mozilla-bin 1497 + ls 1947 + metacity 3172 + Xorg 7424 + gnome-terminal 51955 + + +### Read size distribution by process, + +# dtrace -n 'sysinfo:::readch { @dist[execname] = quantize(arg0); }' +dtrace: description 'sysinfo:::readch ' matched 4 probes +^C +[...] + gnome-terminal + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 15 + 64 |@@@ 1 + 128 | 0 + + Xorg + value ------------- Distribution ------------- count + -1 | 0 + 0 |@@@@@@@@@@@@@@@@@@@ 26 + 1 | 0 + 2 | 0 + 4 | 0 + 8 |@@@@ 6 + 16 |@ 2 + 32 |@ 2 + 64 | 0 + 128 |@@@@@@@@ 11 + 256 |@@@ 4 + 512 | 0 + + +### Write size distribution by process, + +# dtrace -n 'sysinfo:::writech { @dist[execname] = quantize(arg0); }' +dtrace: description 'sysinfo:::writech ' matched 4 probes +^C +[...] + Xorg + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 169 + 64 |@@@ 16 + 128 |@@ 10 + 256 | 0 + + gnome-terminal + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@ 6 + 2 | 0 + 4 | 0 + 8 | 1 + 16 |@ 2 + 32 |@@@ 7 + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@ 63 + 256 |@@@@ 10 + 512 | 1 + 1024 |@@@@@ 13 + 2048 |@ 2 + 4096 |@@@ 7 + + +### Disk size by process, + +# dtrace -n 'io:::start { printf("%d %s %d",pid,execname,args[0]->b_bcount); }' + 0 3271 bdev_strategy:start 16459 tar 1024 + 0 3271 bdev_strategy:start 16459 tar 1024 + 0 3271 bdev_strategy:start 16459 tar 2048 + 0 3271 bdev_strategy:start 16459 tar 1024 + 0 3271 bdev_strategy:start 16459 tar 1024 + 0 3271 bdev_strategy:start 16459 tar 1024 + 0 3271 bdev_strategy:start 16459 tar 8192 + 0 3271 bdev_strategy:start 16459 tar 8192 + 0 3271 bdev_strategy:start 16459 tar 16384 + 0 3271 bdev_strategy:start 16459 tar 2048 + 0 3271 bdev_strategy:start 16459 tar 1024 + 0 3271 bdev_strategy:start 16459 tar 1024 + + +### Pages paged in by process, + +# dtrace -n 'vminfo:::pgpgin { @pg[execname] = sum(arg0); }' +dtrace: description 'vminfo:::pgpgin ' matched 1 probe +^C + + ttymon 1 + bash 1 + mozilla-bin 36 + tar 6661 + + +### Minor faults by process, + +# dtrace -n 'vminfo:::as_fault { @mem[execname] = sum(arg0); }' +dtrace: description 'vminfo:::as_fault ' matched 1 probe +^C + + mozilla-bin 18 + dtrace 57 + find 64 + bash 150 + tar 501 + + +### Interrupts by CPU, + +# dtrace -n 'sdt:::interrupt-start { @num[cpu] = count(); }' +dtrace: description 'sdt:::interrupt-start ' matched 1 probe +^C + + 513 2 + 515 4 + 3 39 + 2 39 + + +### New processes with arguments and time, + +# dtrace -qn 'syscall::exec*:return { printf("%Y %s\n",walltimestamp,curpsinfo->pr_psargs); }' +2005 Apr 25 19:15:09 man ls +2005 Apr 25 19:15:09 sh -c cd /usr/share/man; tbl /usr/share/man/man1/ls.1 |... +2005 Apr 25 19:15:09 neqn /usr/share/lib/pub/eqnchar - +2005 Apr 25 19:15:09 tbl /usr/share/man/man1/ls.1 +2005 Apr 25 19:15:09 nroff -u0 -Tlp -man - +2005 Apr 25 19:15:09 col -x +2005 Apr 25 19:15:10 sh -c trap '' 1 15; /usr/bin/mv -f /tmp/mpRZaqTF /usr/s... +2005 Apr 25 19:15:10 /usr/bin/mv -f /tmp/mpRZaqTF /usr/share/man/cat1/ls.1 +2005 Apr 25 19:15:10 sh -c more -s /tmp/mpRZaqTF +2005 Apr 25 19:15:10 more -s /tmp/mpRZaqTF +[...] + + +### Successful signal details, + +# dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }' +dtrace: description 'proc:::signal-send ' matched 1 probe +CPU ID FUNCTION:NAME + 0 3303 sigtoproc:signal-send bash -15 16442 + 0 3303 sigtoproc:signal-send bash -9 16443 +^C + + +### Kernel function calls by module, + +# dtrace -n 'fbt:::entry { @calls[probemod] = count(); }' +dtrace: description 'fbt:::entry ' matched 18437 probes +^C + + devfs 2 + ptm 2 + ipf 5 + pts 5 + ttcompat 9 + ptem 9 + ldterm 23 + ipgpc 24 + ufs 24 + ata 25 + sockfs 27 + gld 32 + rtls 34 + flowacct 38 + specfs 50 + ip 84 + TS 92 + uhci 101 + uppc 1758 + unix 6347 + genunix 10023 + diff --git a/cddl/contrib/dtracetoolkit/Examples/opensnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/opensnoop_example.txt new file mode 100644 index 00000000000..329d09b5034 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/opensnoop_example.txt @@ -0,0 +1,110 @@ +The following are examples of opensnoop. File open events are traced +along with some process details. + + +This first example is of the default output. The commands "cat", "cal", +"ls" and "uname" were run. The returned file descriptor (or -1 for error) are +shown, along with the filenames. + + # ./opensnoop + UID PID COMM FD PATH + 100 3504 cat -1 /var/ld/ld.config + 100 3504 cat 3 /usr/lib/libc.so.1 + 100 3504 cat 3 /etc/passwd + 100 3505 cal -1 /var/ld/ld.config + 100 3505 cal 3 /usr/lib/libc.so.1 + 100 3505 cal 3 /usr/share/lib/zoneinfo/Australia/NSW + 100 3506 ls -1 /var/ld/ld.config + 100 3506 ls 3 /usr/lib/libc.so.1 + 100 3507 uname -1 /var/ld/ld.config + 100 3507 uname 3 /usr/lib/libc.so.1 + [...] + + +Full command arguments can be fetched using -g, + + # ./opensnoop -g + UID PID PATH FD ARGS + 100 3528 /var/ld/ld.config -1 cat /etc/passwd + 100 3528 /usr/lib/libc.so.1 3 cat /etc/passwd + 100 3528 /etc/passwd 3 cat /etc/passwd + 100 3529 /var/ld/ld.config -1 cal + 100 3529 /usr/lib/libc.so.1 3 cal + 100 3529 /usr/share/lib/zoneinfo/Australia/NSW 3 cal + 100 3530 /var/ld/ld.config -1 ls -l + 100 3530 /usr/lib/libc.so.1 3 ls -l + 100 3530 /var/run/name_service_door 3 ls -l + 100 3530 /usr/share/lib/zoneinfo/Australia/NSW 4 ls -l + 100 3531 /var/ld/ld.config -1 uname -a + 100 3531 /usr/lib/libc.so.1 3 uname -a + [...] + + + +The verbose option prints human readable timestamps, + + # ./opensnoop -v + STRTIME UID PID COMM FD PATH + 2005 Jan 22 01:22:50 0 23212 df -1 /var/ld/ld.config + 2005 Jan 22 01:22:50 0 23212 df 3 /lib/libcmd.so.1 + 2005 Jan 22 01:22:50 0 23212 df 3 /lib/libc.so.1 + 2005 Jan 22 01:22:50 0 23212 df 3 /platform/SUNW,Sun-Fire-V210/lib/libc_psr.so.1 + 2005 Jan 22 01:22:50 0 23212 df 3 /etc/mnttab + 2005 Jan 22 01:22:50 0 23211 dtrace 4 /usr/share/lib/zoneinfo/Australia/NSW + 2005 Jan 22 01:22:51 0 23213 uname -1 /var/ld/ld.config + 2005 Jan 22 01:22:51 0 23213 uname 3 /lib/libc.so.1 + 2005 Jan 22 01:22:51 0 23213 uname 3 /platform/SUNW,Sun-Fire-V210/lib/libc_psr.so.1 + [...] + + + +Particular files can be monitored using -f. For example, + + # ./opensnoop -vgf /etc/passwd + STRTIME UID PID PATH FD ARGS + 2005 Jan 22 01:28:50 0 23242 /etc/passwd 3 cat /etc/passwd + 2005 Jan 22 01:28:54 0 23243 /etc/passwd 4 vi /etc/passwd + 2005 Jan 22 01:29:06 0 23244 /etc/passwd 3 passwd brendan + [...] + + + +This example is of opensnoop running on a quiet system. We can see as +various daemons are opening files, + + # ./opensnoop + UID PID COMM FD PATH + 0 253 nscd 5 /etc/user_attr + 0 253 nscd 5 /etc/hosts + 0 419 mibiisa 2 /dev/kstat + 0 419 mibiisa 2 /dev/rtls + 0 419 mibiisa 2 /dev/kstat + 0 419 mibiisa 2 /dev/kstat + 0 419 mibiisa 2 /dev/rtls + 0 419 mibiisa 2 /dev/kstat + 0 253 nscd 5 /etc/user_attr + 0 419 mibiisa 2 /dev/kstat + 0 419 mibiisa 2 /dev/rtls + 0 419 mibiisa 2 /dev/kstat + 0 174 in.routed 8 /dev/kstat + 0 174 in.routed 8 /dev/kstat + 0 174 in.routed 6 /dev/ip + 0 419 mibiisa 2 /dev/kstat + 0 419 mibiisa 2 /dev/rtls + 0 419 mibiisa 2 /dev/kstat + 0 293 utmpd 4 /var/adm/utmpx + 0 293 utmpd 5 /var/adm/utmpx + 0 293 utmpd 6 /proc/442/psinfo + 0 293 utmpd 6 /proc/567/psinfo + 0 293 utmpd 6 /proc/567/psinfo + 0 293 utmpd 6 /proc/567/psinfo + 0 293 utmpd 6 /proc/567/psinfo + 0 293 utmpd 6 /proc/567/psinfo + 0 293 utmpd 6 /proc/567/psinfo + 0 293 utmpd 6 /proc/567/psinfo + 0 293 utmpd 6 /proc/567/psinfo + 0 293 utmpd 6 /proc/3013/psinfo + 0 419 mibiisa 2 /dev/kstat + 0 419 mibiisa 2 /dev/rtls + 0 419 mibiisa 2 /dev/kstat + [...] diff --git a/cddl/contrib/dtracetoolkit/Examples/pathopens_example.txt b/cddl/contrib/dtracetoolkit/Examples/pathopens_example.txt new file mode 100644 index 00000000000..b5004dd3fc9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pathopens_example.txt @@ -0,0 +1,32 @@ +The following is a demonstration of the pathopens.d script, + + +Here we run it for a few seconds then hit Ctrl-C, + + # pathopens.d + Tracing... Hit Ctrl-C to end. + ^C + COUNT PATHNAME + 1 /lib/libcmd.so.1 + 1 /export/home/root/DTrace/Dexplorer/dexplorer + 1 /lib/libmd5.so.1 + 1 /lib/libaio.so.1 + 1 /lib/librt.so.1 + 1 /etc/security/prof_attr + 1 /etc/mnttab + 2 /devices/pseudo/devinfo@0:devinfo + 2 /dev/kstat + 2 /lib/libnvpair.so.1 + 2 /lib/libkstat.so.1 + 2 /lib/libdevinfo.so.1 + 2 /lib/libnsl.so.1 + 4 /lib/libc.so.1 + 4 /var/ld/ld.config + 8 /export/home/brendan/Utils_solx86/setiathome-3.08.i386-pc-solaris2.6/outfile.sah + +In the above output, many of the files would have been opened using +absolute pathnames. However the "dexplorer" file was opened using a relative +pathname - and the pathopens.d script has correctly printed the full path. + +The above shows that the outfile.sah file was opened successfully 8 times. + diff --git a/cddl/contrib/dtracetoolkit/Examples/pfilestat_example.txt b/cddl/contrib/dtracetoolkit/Examples/pfilestat_example.txt new file mode 100644 index 00000000000..b2c54a031f0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pfilestat_example.txt @@ -0,0 +1,200 @@ +The following are sample outputs of the pfilestat tool for various scenarios. + + + +Starting with something simple, + +Running: dd if=/dev/rdsk/c0d0s0 of=/dev/null bs=56k # x86, 32-bit + + # ./pfilestat `pgrep -x dd` + + STATE FDNUM Time Filename + read 3 2% /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0 + write 4 3% /devices/pseudo/mm@0:null + waitcpu 0 7% + running 0 16% + sleep-r 0 69% + + STATE FDNUM KB/s Filename + write 4 53479 /devices/pseudo/mm@0:null + read 3 53479 /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0 + + Total event time (ms): 4999 Total Mbytes/sec: 104 + +Most of the time we are sleeping on read, which is to be expected as dd on +the raw device is simple -> read:entry, strategy, biodone, read:return. +CPU time in read() itself is small. + + + +Now for the dsk device, + +Running: dd if=/dev/dsk/c0d0s0 of=/dev/null bs=56k # x86, 32-bit + + # ./pfilestat `pgrep -x dd` + + STATE FDNUM Time Filename + write 4 5% /devices/pseudo/mm@0:null + waitcpu 0 8% + running 0 15% + sleep-r 0 18% + read 3 53% /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0 + + STATE FDNUM KB/s Filename + read 3 53492 /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0 + write 4 53492 /devices/pseudo/mm@0:null + + Total event time (ms): 4914 Total Mbytes/sec: 102 + +Woah, we are now spending much more time in read()! I imagine segmap is +a busy bee. The "running" and "write" times are hardly different. + + + +Now for a SPARC demo of the same, + +Running: dd if=/dev/dsk/c0d0s0 of=/dev/null bs=56k # SPARC, 64-bit + + # ./pfilestat `pgrep -x dd` + + STATE FDNUM Time Filename + write 4 3% /devices/pseudo/mm@0:zero + waitcpu 0 7% + running 0 17% + read 3 24% /devices/pci@1f,0/pci@1,1/ide@3/dad@0,0:a + sleep-r 0 54% + + STATE FDNUM KB/s Filename + read 3 13594 /devices/pci@1f,0/pci@1,1/ide@3/dad@0,0:a + write 4 13606 /devices/pseudo/mm@0:zero + + Total event time (ms): 4741 Total Mbytes/sec: 25 + +I did prime the cache by running this a few times first. There is less +read() time than with the x86 32-bit demo, as I would guess that the +process is more often exhausting the (faster) segmap cache and getting +to the point where it must sleep. (However, do take this comparison with +a grain of salt - my development servers aren't ideal for comparing +statistics: one is a 867 MHz Pentium, and the other a 360 MHz Ultra 5). + +The file system cache is faster on 64-bit systems due to the segkpm +enhancement in Solaris 10. For details see, +http://blogs.sun.com/roller/page/rmc?entry=solaris_10_fast_filesystem_cache + + + +Now, back to x86. + +Running: tar cf /dev/null / + + # ./pfilestat `pgrep -x tar` + + STATE FDNUM Time Filename + read 11 0% /extra1/test/amd64/libCstd.so.1 + read 11 0% /extra1/test/amd64/libXm.so + read 11 0% /extra1/test/amd64/libXm.so.4 + read 11 1% /extra1/test/amd64/libgtk-x11-2.0.so + read 11 2% /extra1/test/amd64/libgtk-x11-2.0.so.0 + waitcpu 0 2% + read 9 4% /extra1/5000 + write 3 7% /devices/pseudo/mm@0:null + running 0 19% + sleep-r 0 46% + + STATE FDNUM KB/s Filename + read 11 293 /extra1/test/amd64/libgdk-x11-2.0.so + read 11 295 /extra1/test/amd64/libgdk-x11-2.0.so.0 + read 9 476 /extra1/1000 + read 11 526 /extra1/test/amd64/libCstd.so.1 + read 11 594 /extra1/test/amd64/libXm.so.4 + read 11 594 /extra1/test/amd64/libXm.so + read 11 1603 /extra1/test/amd64/libgtk-x11-2.0.so.0 + read 11 1606 /extra1/test/amd64/libgtk-x11-2.0.so + read 9 4078 /extra1/5000 + write 3 21254 /devices/pseudo/mm@0:null + + Total event time (ms): 4903 Total Mbytes/sec: 41 + +Fair enough. tar is crusing along at 21 Mbytes/sec (writes to fd 3!). + + + +More interesting is to do the following, + +Running: tar cf - / | gzip > /dev/null + + # ./pfilestat `pgrep -x tar` + + STATE FDNUM Time Filename + read 11 0% /extra1/test/amd64/libm.so + read 11 0% /extra1/test/amd64/libm.so.2 + read 11 0% /extra1/test/amd64/libnsl.so + read 11 0% /extra1/test/amd64/libnsl.so.1 + read 11 0% /extra1/test/amd64/libc.so.1 + write 3 2% + waitcpu 0 4% + sleep-r 0 4% + running 0 6% + sleep-w 0 78% + + STATE FDNUM KB/s Filename + read 11 74 /extra1/test/amd64/libldap.so + read 11 75 /extra1/test/amd64/libldap.so.5 + read 11 75 /extra1/test/amd64/libresolv.so.2 + read 11 76 /extra1/test/amd64/libresolv.so + read 11 97 /extra1/test/amd64/libm.so.2 + read 11 98 /extra1/test/amd64/libm.so + read 11 174 /extra1/test/amd64/libnsl.so + read 11 176 /extra1/test/amd64/libnsl.so.1 + read 11 216 /extra1/test/amd64/libc.so.1 + write 3 3022 + + Total event time (ms): 4911 Total Mbytes/sec: 6 + +Woah now, tar is writing 3 Mbytes/sec - AND spending 78% of it's time on +sleep-w, sleeping on writes! Of course, this is because we are piping the +output to gzip, which is spending a while compressing the data. 78% +matches the time gzip was on the CPU (using either "prstat -m" or dtrace +to measure; procfs's pr_pctcpu would take too long to catch up). + + + + +Also interesting is, + +Running: perl -e 'while (1) {;}' & +Running: perl -e 'while (1) {;}' & +Running: perl -e 'while (1) {;}' & +Running: perl -e 'while (1) {;}' & +Running: tar cf /dev/null / + + # ./pfilestat `pgrep -x tar` + + STATE FDNUM Time Filename + read 11 0% /extra1/test/amd64/libxml2.so.2 + read 11 0% /extra1/test/amd64/libgdk-x11-2.0.so.0 + read 11 0% /extra1/test/amd64/libgdk-x11-2.0.so + read 11 0% /extra1/test/amd64/libCstd.so.1 + read 11 0% /extra1/test/amd64/libgtk-x11-2.0.so.0 + read 11 2% /extra1/test/amd64/libgtk-x11-2.0.so + write 3 2% /devices/pseudo/mm@0:null + running 0 8% + sleep-r 0 22% + waitcpu 0 65% + + STATE FDNUM KB/s Filename + read 11 182 /extra1/test/amd64/libsun_fc.so + read 11 264 /extra1/test/amd64/libglib-2.0.so + read 11 266 /extra1/test/amd64/libglib-2.0.so.0 + read 11 280 /extra1/test/amd64/libxml2.so.2 + read 11 293 /extra1/test/amd64/libgdk-x11-2.0.so + read 11 295 /extra1/test/amd64/libgdk-x11-2.0.so.0 + read 11 526 /extra1/test/amd64/libCstd.so.1 + read 11 761 /extra1/test/amd64/libgtk-x11-2.0.so.0 + read 11 1606 /extra1/test/amd64/libgtk-x11-2.0.so + write 3 7881 /devices/pseudo/mm@0:null + + Total event time (ms): 4596 Total Mbytes/sec: 13 + +Now we have "waitcpu" as tar competes for CPU cycles along with the greedy +infinite perl processes. diff --git a/cddl/contrib/dtracetoolkit/Examples/pgpginbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/pgpginbypid_example.txt new file mode 100644 index 00000000000..8326b904d94 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pgpginbypid_example.txt @@ -0,0 +1,14 @@ +The following is a demonstration of the pgpginbypid.d script, + + +Here we run it for a few seconds then hit Ctrl-C, + + # pgpginbypid.d + Tracing... Hit Ctrl-C to end. + ^C + PID CMD PAGES + 10692 find 128 + 10693 tar 11928 + +In the output above, we can see which processes are responsible for page ins, +as well as the number of pages paged in. diff --git a/cddl/contrib/dtracetoolkit/Examples/pgpginbyproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/pgpginbyproc_example.txt new file mode 100644 index 00000000000..e8bb8217a13 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pgpginbyproc_example.txt @@ -0,0 +1,13 @@ +The following is a demonstration of the pgpginbyproc.d script, + + # pgpginbyproc.d + dtrace: description 'vminfo:::pgpgin ' matched 1 probe + ^C + + ttymon 1 + bash 1 + mozilla-bin 36 + tar 6661 + +In the above output, tar processes have paged in 6661 pages from the filesystem. + diff --git a/cddl/contrib/dtracetoolkit/Examples/php_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_calldist_example.txt new file mode 100644 index 00000000000..db3b0af9d54 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/php_calldist_example.txt @@ -0,0 +1,84 @@ +The following are examples of php_calldist.d. + +This script traces the elapsed time of PHP functions and prints a report +containing distribution plots per subroutine. Here it traces the example program +Code/Php/func_abc.php. + +# php_calldist.d +Tracing... Hit Ctrl-C to end. +^C + +Exclusive function elapsed times (us), + func_abc.php, func, func_a + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + func_abc.php, func, func_b + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + func_abc.php, func, func_c + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + func_abc.php, func, sleep + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 1048576 | 0 + + +Inclusive function elapsed times (us), + func_abc.php, func, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_abc.php, func, func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_abc.php, func, sleep + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 1048576 | 0 + + func_abc.php, func, func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + +In total, 3 subroutines were called, one each of func_a(), func_b() and +func_c(), and sleep was called 3 times. You can see this reflected in the +"count" column on the right. + +The exclusive subroutine elapsed times show that each subroutine spent +between 256 and 512 microseconds. This time excludes the time spent in +other subroutines. + +The inclusive subroutine elapsed times show that func_c() took between 0.5 +seconds and 1 second, func_b() took between 1 second and 2.1 seconds, and +func_a() took between 2.1 seconds and 4.2 seconds to execute. This time +includes the time spent in other subroutines called, and since func_a() called +func_b() which called func_c(), these times make sense. + +These elapsed times are the absolute time from when the subroutine began to +when it completed - which includes off-CPU time due to other system events +such as I/O, scheduling, interrupts, etc. + +Elapsed times are useful for identifying where latencies are. +See Notes/ALLelapsed_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/php_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_calltime_example.txt new file mode 100644 index 00000000000..d76cb6e0258 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/php_calltime_example.txt @@ -0,0 +1,51 @@ +The following is an example of running php_calltime.d and tracing the elapsed +times for functions. + +We run php_calltime.d while running the program Code/Php/func_abc.php. We can +see that there are three sections in the DTrace output + +# php_calltime.d +Tracing... Hit Ctrl-C to end. +^C + +Count, + FILE TYPE NAME COUNT + func_abc.php func func_a 1 + func_abc.php func func_b 1 + func_abc.php func func_c 1 + func_abc.php func sleep 3 + - total - 6 + +Exclusive function elapsed times (us), + FILE TYPE NAME TOTAL + func_abc.php func func_c 330 + func_abc.php func func_b 367 + func_abc.php func func_a 418 + func_abc.php func sleep 3025644 + - total - 3026761 + +Inclusive function elapsed times (us), + FILE TYPE NAME TOTAL + func_abc.php func func_c 1010119 + func_abc.php func func_b 2020118 + func_abc.php func sleep 3025644 + func_abc.php func func_a 3026761 + +Section 1 - Count shows us how many times each function was called in the +Code/Php/func_abc.php program, with the last line giving us a total number of +functions called (in this case, six). + +Section 2 - These elapsed times shows us how many microseconds the program +spends in each function. This does not include the time spent in any +sub-functions called by that particular function. Again the last line gives +us the total time in microseconds. + +Section 3 - These elapsed times are the absolute time from when the function began to +when it completed - which includes off-CPU time due to other system events +such as I/O, scheduling, interrupts, etc. In particular, for this case it has +included the time waiting for the sleep commands. + +Elapsed times are useful for identifying where latencies are. +See Notes/ALLelapsed_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive function time. diff --git a/cddl/contrib/dtracetoolkit/Examples/php_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_cpudist_example.txt new file mode 100644 index 00000000000..6da7d29d8f4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/php_cpudist_example.txt @@ -0,0 +1,84 @@ +The following are examples of php_cpudist.d. + +This script traces the on-CPU time of PHP functions and prints a report +containing distribution plots per subroutine. Here it traces the example +program Code/Php/func_abc.php. + +# php_cpudist.d +Tracing... Hit Ctrl-C to end. +^C + +Exclusive function on-CPU times (us), + func_abc.php, func, func_a + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + func_abc.php, func, func_b + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + func_abc.php, func, func_c + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + func_abc.php, func, sleep + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 32 | 0 + + +Inclusive function on-CPU times (us), + func_abc.php, func, func_c + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + func_abc.php, func, sleep + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 32 | 0 + + func_abc.php, func, func_b + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + func_abc.php, func, func_a + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + +In total, 3 subroutines were called, one each of func_a(), func_b() and +func_c(), and sleep was called 3 times. You can see this reflected in the +"count" column on the right. + +The exclusive subroutine elapsed times show that each subroutine spent +between 16 and 31 microseconds on CPU. This time excludes the time spent in +other subroutines. + +The inclusive subroutine elapsed times show that func_c() took between 32 +microseconds and 63 microseconds on CPU; sleep ran three times and each time +took between 16 and 31 microseconds on CPU; func_b() took between 64 and 127 +microseconds on CPU; and func_a() took between 128 and 255 microseconds on +CPU. This time includes the time spent in other subroutines called, and since +func_a() called func_b() which called func_c(), these times make sense. + +These elapsed times are the on CPU time from when the subroutine began to +when it completed. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLelapsed_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/php_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_cputime_example.txt new file mode 100644 index 00000000000..db218e1d1f5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/php_cputime_example.txt @@ -0,0 +1,58 @@ +The following are examples of php_cputime.d. + +This script traces the on-CPU time of PHP functions and prints a report. +Here it traces the example program, Code/Php/func_abc.php. + +# php_cputime.d +Tracing... Hit Ctrl-C to end. +^C + +Count, + FILE TYPE NAME COUNT + func_abc.php func func_a 1 + func_abc.php func func_b 1 + func_abc.php func func_c 1 + func_abc.php func sleep 3 + - total - 6 + +Exclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + func_abc.php func func_c 17 + func_abc.php func func_b 25 + func_abc.php func func_a 74 + func_abc.php func sleep 93 + - total - 210 + +Inclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + func_abc.php func func_c 39 + func_abc.php func func_b 87 + func_abc.php func sleep 93 + func_abc.php func func_a 210 + +In total, six functions were called; sleep was called three times and there +was one call each of func_a(), func_b() and func_c(). + +The exclusive subroutine on-CPU times show that func_a() spent around 74 +microseconds on-CPU, func_b() spent 25 microseconds on-CPU, and func_c() spent +17 microseconds on-CPU. This exclusive times excludes time spent in other +subroutines. + +The inclusive subroutine on-CPU times show that func_c() spent around 39 +microseconds on-CPU, func_b() spent around 87 microseconds on-CPU and +func_a() spent around 210 microseconds. This inclusive time includes the time +spent in other functions called (including sleep), and since func_a() called +func_b() which called func_c(), these times make perfect sense. + +These on-CPU times are the time the program spent running on a CPU, from when +the function began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + +If you study the func_abc.php program alongside the above output, the numbers +should make sense. + diff --git a/cddl/contrib/dtracetoolkit/Examples/php_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_flow_example.txt new file mode 100644 index 00000000000..6470daf087b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/php_flow_example.txt @@ -0,0 +1,36 @@ +The following are examples of php_flow.d. + +This is a simple script to trace the flow of PHP functions. +Here it traces the example program, Code/Php/func_abc.php + +# php_flow.d + C TIME(us) FILE -- FUNC + 0 3645535409575 func_abc.php -> func_a + 0 3645535409653 func_abc.php -> sleep + 0 3645536410511 func_abc.php <- sleep + 0 3645536410536 func_abc.php -> func_b + 0 3645536410557 func_abc.php -> sleep + 0 3645537420627 func_abc.php <- sleep + 0 3645537420652 func_abc.php -> func_c + 0 3645537420673 func_abc.php -> sleep + 0 3645538430106 func_abc.php <- sleep + 0 3645538430125 func_abc.php <- func_c + 0 3645538430134 func_abc.php <- func_b + 0 3645538430143 func_abc.php <- func_a +^C + +The fourth column is indented by 2 spaces to show when a new function begins. +This shows which function is calling which - the output above begins by +showing that func_a() began; slept, and returned from sleep; and then called +func_b(). + +The TIME(us) column shows time from boot in microseconds. + +The FILE column shows the file that was being executed. + +If the output looks strange, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/php_flowinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_flowinfo_example.txt new file mode 100644 index 00000000000..3b2e3c1f314 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/php_flowinfo_example.txt @@ -0,0 +1,40 @@ +The following are examples of php_flowinfo.d. + +This is a simple script to trace the flow of PHP functions. +Here it traces the example program, Code/Php/func_abc.php + +# php_flowinfo.d +C PID/TID DELTA(us) FILE:LINE TYPE -- FUNC +0 18422/1 9 func_abc.php:22 func -> func_a +0 18422/1 35 func_abc.php:18 func -> sleep +0 18422/1 1009146 func_abc.php:18 func <- sleep +0 18422/1 35 func_abc.php:19 func -> func_b +0 18422/1 24 func_abc.php:11 func -> sleep +0 18422/1 1009803 func_abc.php:11 func <- sleep +0 18422/1 34 func_abc.php:12 func -> func_c +0 18422/1 24 func_abc.php:5 func -> sleep +0 18422/1 1009953 func_abc.php:5 func <- sleep +0 18422/1 28 func_abc.php:6 func <- func_c +0 18422/1 11 func_abc.php:13 func <- func_b +0 18422/1 10 func_abc.php:20 func <- func_a +^C + +The third column is indented by 2 spaces to show when a new function begins. +This shows which function is calling which - the output above begins by +showing that func_a() began; slept, and returned from sleep; and then called +func_b(). + +The DELTA(us) column shows time from that line to the previous line, and +so can be a bit tricky to read. For example, the second line of data output +(skipping the header) reads as "the time from func_a() beginning to +calling the sleep function beginning was 35 microseconds". + +The LINE column shows the line in the file what was being executed. Refer +to the source program to see what this line refers to. + +If the output looks shuffled, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/php_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_flowtime_example.txt new file mode 100644 index 00000000000..57eb69c6dc6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/php_flowtime_example.txt @@ -0,0 +1,41 @@ +The following are examples of php_flowtime.d. + +This is a simple script to trace the flow of PHP functions. +Here it traces the example program, Code/Php/func_abc.php + +# php_flowtime.d + C TIME(us) FILE DELTA(us) -- FUNC + 0 3646108339057 func_abc.php 9 -> func_a + 0 3646108339090 func_abc.php 32 -> sleep + 0 3646109341043 func_abc.php 1001953 <- sleep + 0 3646109341074 func_abc.php 31 -> func_b + 0 3646109341098 func_abc.php 23 -> sleep + 0 3646110350712 func_abc.php 1009614 <- sleep + 0 3646110350745 func_abc.php 32 -> func_c + 0 3646110350768 func_abc.php 23 -> sleep + 0 3646111362323 func_abc.php 1011554 <- sleep + 0 3646111362351 func_abc.php 27 <- func_c + 0 3646111362361 func_abc.php 10 <- func_b + 0 3646111362370 func_abc.php 9 <- func_a +^C + +The fifth column is indented by 2 spaces to show when a new function begins. +This shows which function is calling which - the output above begins by +showing that func_a() began; slept, and returned from sleep; and then called +func_b(). + +The TIME(us) column shows time since boot. + +The DELTA(us) column shows time from that line to the previous line, and +so can be a bit tricky to read. For example, the second line of data output +(skipping the header) reads as "the time from func_a() beginning to +calling the sleep function beginning was 32 microseconds". + +The FILE column shows file that was being executed. + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + + diff --git a/cddl/contrib/dtracetoolkit/Examples/php_funccalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_funccalls_example.txt new file mode 100644 index 00000000000..7155a7139b9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/php_funccalls_example.txt @@ -0,0 +1,17 @@ +The following are examples of php_funccalls.d. + +This is a simple script to count executed PHP functions. Here it traces +an example program, Code/Php/func_abc.php + +# php_funccalls.d +Tracing... Hit Ctrl-C to end. +^C + FILE FUNC CALLS + func_abc.php func_a 1 + func_abc.php func_b 1 + func_abc.php func_c 1 + func_abc.php sleep 3 + +While tracing, func_a() from the program "func_abc.php" was executed once, +as were func_b() and func_c(). sleep was executed three times. + diff --git a/cddl/contrib/dtracetoolkit/Examples/php_malloc_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_malloc_example.txt new file mode 100644 index 00000000000..853d0829931 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/php_malloc_example.txt @@ -0,0 +1,23 @@ +Following are examples of running php_malloc.d. + +Here it is running on Code/Php/func_abc.php + + # php_malloc.d -p 18523 + Tracing... Hit Ctrl-C to end. + ^C + + PHP malloc byte distributions by engine caller, + + + PHP malloc byte distributions by PHP file and function, + + +Theoretically this should show you mallocs. However there weren't any in this +example. The rest of these example files would have been so much easier to +write if they were all like this. I would have been finished by now and would +have been flicking through the TV channels with a nice, cold beer in hand. + + +... Fixing this example is on my todo list. Check for newer versions of the +toolkit. + diff --git a/cddl/contrib/dtracetoolkit/Examples/php_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_syscalls_example.txt new file mode 100644 index 00000000000..c783420fc0f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/php_syscalls_example.txt @@ -0,0 +1,22 @@ +The following are examples of php_syscalls.d. + +This is a simple script to count executed PHP functions and system calls. +Here it traces an example program, Code/Php/func_abc.php + +# php_syscalls.d +Tracing... Hit Ctrl-C to end. +^C + PID FILE TYPE NAME COUNT + 18419 func_abc.php func func_a 1 + 18419 func_abc.php func func_b 1 + 18419 func_abc.php func func_c 1 + 18419 func_abc.php func sleep 3 + 18419 httpd syscall nanosleep 3 + +While tracing, four functions were called - func_a(), func_b(), func_c(), and +sleep. There were also three instances of the system call nanosleep(). + +This script can provide an insight to how a PHP application is interacting +with the system, by providing both application function calls and system calls +in the same output. + diff --git a/cddl/contrib/dtracetoolkit/Examples/php_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_syscolors_example.txt new file mode 100644 index 00000000000..96b26a8877d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/php_syscolors_example.txt @@ -0,0 +1,63 @@ +The following are examples of php_syscolors.d. + +This is a simple script to trace the flow of PHP functions and system +calls made, and renders the output in color ("colour") using terminal +escape sequences (which you can tweak by modifying the script). + +Here it traces the example program, Code/Php/func_abc.php. + +WARNING: This output is full of terminal escape sequences, so if you are +trying to view this through an editor or web browser - it may look awful. +Try viewing this using "more" (although, depending on your terminal, it +still may look awful). + +# php_syscolors.d +C PID/TID DELTA(us) FILE:LINE TYPE -- NAME +0 18426/1 8 func_abc.php:22 func -> func_a +0 18426/1 41 func_abc.php:18 func -> sleep +0 18426/1 15 ":- syscall -> nanosleep +0 18426/1 1008700 ":- syscall <- nanosleep +0 18426/1 30 func_abc.php:18 func <- sleep +0 18426/1 42 func_abc.php:19 func -> func_b +0 18426/1 28 func_abc.php:11 func -> sleep +0 18426/1 14 ":- syscall -> nanosleep +0 18426/1 1010083 ":- syscall <- nanosleep +0 18426/1 29 func_abc.php:11 func <- sleep +0 18426/1 43 func_abc.php:12 func -> func_c +0 18426/1 28 func_abc.php:5 func -> sleep +0 18426/1 14 ":- syscall -> nanosleep +0 18426/1 1009794 ":- syscall <- nanosleep +0 18426/1 28 func_abc.php:5 func <- sleep +0 18426/1 34 func_abc.php:6 func <- func_c +0 18426/1 18 func_abc.php:13 func <- func_b +0 18426/1 17 func_abc.php:20 func <- func_a +0 18426/1 21 ":- syscall -> fchdir +0 18426/1 19 ":- syscall <- fchdir +0 18426/1 9 ":- syscall -> close +0 18426/1 13 ":- syscall <- close +0 18426/1 35 ":- syscall -> semsys +0 18426/1 12 ":- syscall <- semsys +0 18426/1 7 ":- syscall -> semsys +0 18426/1 7 ":- syscall <- semsys +0 18426/1 66 ":- syscall -> setitimer +0 18426/1 8 ":- syscall <- setitimer +0 18426/1 39 ":- syscall -> read +0 18426/1 14 ":- syscall <- read +0 18426/1 11 ":- syscall -> writev +0 18426/1 22 ":- syscall <- writev +0 18426/1 23 ":- syscall -> write +0 18426/1 110 ":- syscall <- write +0 18426/1 61 ":- syscall -> pollsys + +In this excerpt: +0 18426/1 43 func_abc.php:12 func -> func_c +0 18426/1 28 func_abc.php:5 func -> sleep +0 18426/1 14 ":- syscall -> nanosleep +0 18426/1 1009794 ":- syscall <- nanosleep +0 18426/1 28 func_abc.php:5 func <- sleep +0 18426/1 34 func_abc.php:6 func <- func_c + +we can see that we are at Line 12 of the program which invokes func_c. func_c +then invokes sleep, which uses the syscall nanosleep. Approximately one +second later nanosleep returns, then sleep finishes, then func_c finishes. + diff --git a/cddl/contrib/dtracetoolkit/Examples/php_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_who_example.txt new file mode 100644 index 00000000000..cee32b2f849 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/php_who_example.txt @@ -0,0 +1,10 @@ +The following are examples of the results of running php_who.d. + +# php_who.d +Tracing... Hit Ctrl-C to end. +^C + PID UID FUNCS FILE + 158525 80 7 /opt/coolstack/apache2/htdocs/php/func_abc.php + +Running the php_who.d while the func_abc.php program runs, we can see that +while func_abc.php was running, it called seven functions. diff --git a/cddl/contrib/dtracetoolkit/Examples/pidpersec_example.txt b/cddl/contrib/dtracetoolkit/Examples/pidpersec_example.txt new file mode 100644 index 00000000000..11f6bd7c1fc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pidpersec_example.txt @@ -0,0 +1,33 @@ +The following is a demonstration of the pidpersec.d script. + + +Here the program is run on an idle system, + + # ./pidpersec.d + TIME LASTPID PID/s + 2005 Jun 9 22:15:09 3010 0 + 2005 Jun 9 22:15:10 3010 0 + 2005 Jun 9 22:15:11 3010 0 + 2005 Jun 9 22:15:12 3010 0 + 2005 Jun 9 22:15:13 3010 0 + ^C + +This shows that there are now new processes being created. + + + +Now the script is run on a busy system, that is creating many processes +(which happen to be short-lived), + + # ./pidpersec.d + TIME LASTPID PID/s + 2005 Jun 9 22:16:30 3051 13 + 2005 Jun 9 22:16:31 3063 12 + 2005 Jun 9 22:16:32 3073 10 + 2005 Jun 9 22:16:33 3084 11 + 2005 Jun 9 22:16:34 3096 12 + ^C + +Now we can see that there are over 10 new processes created each second. +The value for lastpid confirms the rates printed. + diff --git a/cddl/contrib/dtracetoolkit/Examples/pl_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_calldist_example.txt new file mode 100644 index 00000000000..f53b7f54777 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pl_calldist_example.txt @@ -0,0 +1,456 @@ +The following are examples of pl_calldist.d. + +This script traces the elapsed time of Perl subroutines (functions) and +prints a report containing distribution plots per subroutine. Here it +traces the example program, Code/Perl/func_abc.pl. + + # pl_calldist.d + Tracing... Hit Ctrl-C to end. + ^C + + Exclusive subroutine elapsed times (us), + func_abc.pl, sub, func_a + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_abc.pl, sub, func_b + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_abc.pl, sub, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + + Inclusive subroutine elapsed times (us), + func_abc.pl, sub, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_abc.pl, sub, func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_abc.pl, sub, func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + +In total, 3 subroutines were called - func_a(), func_b(), and func_c(). + +The exclusive subroutine elapsed times show that each subroutine spent +between 524 and 1048 ms. This exclusive time excludes the time spent in +other subroutines. + +The inclusive subroutine elapsed times show that func_c() took between 0.5 and +1.0 seconds, func_b() took between 1.0 and 2.1 seconds, and func_a() took +between 2.1 and 4.2 seconds to execute. This inclusive time includes the +time spent in other subroutines called, and since func_a() called func_b() +which called func_c(), these times make sense. + +These elapsed times are the absolute time from when the subroutine began to +when it completed - which includes off-CPU time due to other system events +such as I/O, scheduling, interrupts, etc. + +Elapsed times are useful for identifying where latencies are. +See Notes/ALLelapsed_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + + + +The following traces a Perl network interface statistics tool, "nicstat" +version 0.99, + +# pl_calldist.d +Tracing... Hit Ctrl-C to end. +^C + +Exclusive subroutine elapsed times (us), + DynaLoader.pm, sub, dl_load_flags + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + Config.pm, sub, TIEHASH + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + Config.pm, sub, DESTROY + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + Config.pm, sub, import + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + register.pm, sub, mkMask + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8 | 0 + + Config.pm, sub, FETCH + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 2 + 4 |@@@@@@@@@@@@@@@@@@@@ 2 + 8 | 0 + + Config.pm, sub, BEGIN + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@ 1 + 16 |@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + strict.pm, sub, import + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@ 2 + 8 |@@@@@@@@ 1 + 16 |@@@@@@@@ 1 + 32 | 0 + + strict.pm, sub, bits + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 8 |@@@@@@@ 1 + 16 |@@@@@@@ 1 + 32 | 0 + + strict.pm, sub, unimport + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 16 |@@@@@@@@@@ 1 + 32 | 0 + + AutoLoader.pm, sub, BEGIN + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@ 1 + 4 |@@@@@@@ 1 + 8 |@@@@@@@@@@@@@@@@@@@@ 3 + 16 |@@@@@@@ 1 + 32 | 0 + + Std.pm, sub, getopts + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + register.pm, sub, import + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + vars.pm, sub, import + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + Exporter.pm, sub, import + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@ 1 + 64 |@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + DynaLoader.pm, sub, bootstrap + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + warnings.pm, sub, BEGIN + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + DynaLoader.pm, sub, BEGIN + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + nicstat, sub, print_neat + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@ 10 + 128 |@@@@@@@@@@@@@@@@@@ 8 + 256 | 0 + + vars.pm, sub, BEGIN + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@ 1 + 4 | 0 + 8 |@@@@@@@@@@@@@ 1 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@@@@@@@@ 1 + 4096 | 0 + + Kstat.pm, sub, BEGIN + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@@@@@@@@ 1 + 4096 | 0 + + nicstat, sub, BEGIN + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@ 1 + 512 |@@@@@@@@@@@@@ 1 + 1024 | 0 + 2048 |@@@@@@@@@@@@@ 1 + 4096 | 0 + + nicstat, sub, fetch_net_data + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 65536 | 0 + + nicstat, sub, find_nets + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 65536 | 0 + + +Inclusive subroutine elapsed times (us), + DynaLoader.pm, sub, dl_load_flags + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + Config.pm, sub, TIEHASH + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + Config.pm, sub, DESTROY + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + Config.pm, sub, import + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + register.pm, sub, mkMask + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8 | 0 + + Config.pm, sub, FETCH + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 2 + 4 |@@@@@@@@@@@@@@@@@@@@ 2 + 8 | 0 + + strict.pm, sub, bits + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 8 |@@@@@@@ 1 + 16 |@@@@@@@ 1 + 32 | 0 + + strict.pm, sub, import + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@ 2 + 8 | 0 + 16 |@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + Config.pm, sub, BEGIN + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@ 1 + 32 |@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + Std.pm, sub, getopts + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + register.pm, sub, import + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + strict.pm, sub, unimport + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 32 | 0 + + vars.pm, sub, import + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + AutoLoader.pm, sub, BEGIN + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@ 1 + 4 |@@@@@@@ 1 + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@ 3 + 32 |@@@@@@@ 1 + 64 | 0 + + Exporter.pm, sub, import + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@ 1 + 64 |@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + DynaLoader.pm, sub, bootstrap + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + warnings.pm, sub, BEGIN + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + nicstat, sub, print_neat + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@ 10 + 128 |@@@@@@@@@@@@@@@@@@ 8 + 256 | 0 + + vars.pm, sub, BEGIN + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@ 1 + 4 | 0 + 8 | 0 + 16 | 0 + 32 |@@@@@@@@@@@@@ 1 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@@@@@@@@ 1 + 4096 | 0 + + DynaLoader.pm, sub, BEGIN + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@ 1 + 2048 |@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + Kstat.pm, sub, BEGIN + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@ 1 + 32 |@@@@@@@@@@@@@ 1 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 |@@@@@@@@@@@@@ 1 + 16384 | 0 + + nicstat, sub, BEGIN + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@ 1 + 1024 | 0 + 2048 |@@@@@@@@@@@@@ 1 + 4096 | 0 + 8192 |@@@@@@@@@@@@@ 1 + 16384 | 0 + + nicstat, sub, fetch_net_data + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 65536 | 0 + + nicstat, sub, find_nets + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 65536 | 0 + +As an example of interpreting the output: the inclusive elapsed time for +the "print_neat" subroutine in "nicstat", + + nicstat, sub, print_neat + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@ 10 + 128 |@@@@@@@@@@@@@@@@@@ 8 + 256 | 0 + +shows that "print_neat" was called 18 times, 10 of which took between 64 +and 127 microseconds, and 8 of which took between 128 and 255 microseconds. + diff --git a/cddl/contrib/dtracetoolkit/Examples/pl_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_calltime_example.txt new file mode 100644 index 00000000000..3cc5480fdc2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pl_calltime_example.txt @@ -0,0 +1,150 @@ +The following are examples of pl_calltime.d. + +This script traces the elapsed time of Perl subroutines (functions) and +prints a report. Here it traces the example program, Code/Perl/func_abc.pl. + + # pl_calltime.d + Tracing... Hit Ctrl-C to end. + ^C + + Count, + FILE TYPE NAME COUNT + func_abc.pl sub func_a 1 + func_abc.pl sub func_b 1 + func_abc.pl sub func_c 1 + - total - 3 + + Exclusive subroutine elapsed times (us), + FILE TYPE NAME TOTAL + func_abc.pl sub func_a 1006119 + func_abc.pl sub func_c 1009978 + func_abc.pl sub func_b 1010273 + - total - 3026371 + + Inclusive subroutine elapsed times (us), + FILE TYPE NAME TOTAL + func_abc.pl sub func_c 1009978 + func_abc.pl sub func_b 2020252 + func_abc.pl sub func_a 3026371 + +In total, 3 subroutines were called, one of each. + +The exclusive subroutine elapsed times show that each subroutine spent around +1.0 seconds of time (~1000000 us) processing code - while not in other +subroutines. + +The inclusive subroutine elapsed times show that func_a() took around 3.0 +seconds to execute, followed by func_b() at 2.0 seconds, and func_c() at 1.0. +The inclusive time includes the time spent in other subroutines called, and +since func_a() called func_b() which called func_c(), these times make +perfect sense. + +These elapsed times are the absolute time from when the subroutine began to +when it completed - which includes off-CPU time due to other system events +such as I/O, scheduling, interrupts, etc. + +Elapsed times are useful for identifying where latencies are. +See Notes/ALLelapsed_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + +If you study the func_abc.pl program alongside the above output, the numbers +should make sense. + + + +The following traces a Perl network interface statistics tool, "nicstat" +version 0.99, + +# pl_calltime.d +Tracing... Hit Ctrl-C to end. +^C + +Count, + FILE TYPE NAME COUNT + Config.pm sub DESTROY 1 + Config.pm sub TIEHASH 1 + Config.pm sub import 1 + DynaLoader.pm sub bootstrap 1 + DynaLoader.pm sub dl_load_flags 1 + Std.pm sub getopts 1 + nicstat sub fetch_net_data 1 + nicstat sub find_nets 1 + register.pm sub import 1 + warnings.pm sub BEGIN 1 + Config.pm sub BEGIN 2 + DynaLoader.pm sub BEGIN 2 + Exporter.pm sub import 2 + register.pm sub mkMask 2 + vars.pm sub import 2 + Kstat.pm sub BEGIN 3 + nicstat sub BEGIN 3 + vars.pm sub BEGIN 3 + Config.pm sub FETCH 4 + strict.pm sub unimport 4 + strict.pm sub import 5 + AutoLoader.pm sub BEGIN 6 + strict.pm sub bits 6 + nicstat sub print_neat 18 + - total - 72 + +Exclusive subroutine elapsed times (us), + FILE TYPE NAME TOTAL + DynaLoader.pm sub dl_load_flags 2 + Config.pm sub TIEHASH 3 + Config.pm sub DESTROY 9 + register.pm sub mkMask 11 + Config.pm sub import 12 + Config.pm sub FETCH 17 + strict.pm sub import 38 + Config.pm sub BEGIN 38 + strict.pm sub bits 49 + vars.pm sub import 59 + strict.pm sub unimport 65 + AutoLoader.pm sub BEGIN 70 + Std.pm sub getopts 78 + register.pm sub import 86 + Exporter.pm sub import 112 + warnings.pm sub BEGIN 680 + DynaLoader.pm sub BEGIN 1131 + DynaLoader.pm sub bootstrap 1221 + nicstat sub print_neat 2450 + vars.pm sub BEGIN 2608 + Kstat.pm sub BEGIN 3171 + nicstat sub BEGIN 3963 + nicstat sub fetch_net_data 45424 + nicstat sub find_nets 55737 + - total - 117047 + +Inclusive subroutine elapsed times (us), + FILE TYPE NAME TOTAL + DynaLoader.pm sub dl_load_flags 2 + Config.pm sub TIEHASH 3 + Config.pm sub DESTROY 9 + register.pm sub mkMask 11 + Config.pm sub import 12 + Config.pm sub FETCH 17 + strict.pm sub import 46 + strict.pm sub bits 49 + vars.pm sub import 59 + Config.pm sub BEGIN 64 + strict.pm sub unimport 87 + register.pm sub import 97 + Std.pm sub getopts 112 + Exporter.pm sub import 112 + AutoLoader.pm sub BEGIN 140 + warnings.pm sub BEGIN 680 + DynaLoader.pm sub bootstrap 1224 + nicstat sub print_neat 2450 + vars.pm sub BEGIN 3412 + DynaLoader.pm sub BEGIN 4656 + Kstat.pm sub BEGIN 8020 + nicstat sub BEGIN 13313 + nicstat sub fetch_net_data 45424 + nicstat sub find_nets 55737 + +The output showed that the most time was spent in the subroutine find_nets(), +with a total exclusive elapsed time of 55.7 ms. This also matches the +total inclusive time, suggesting that find_nets() didn't call other +subroutines. + diff --git a/cddl/contrib/dtracetoolkit/Examples/pl_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_cpudist_example.txt new file mode 100644 index 00000000000..a2ccff83f4e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pl_cpudist_example.txt @@ -0,0 +1,470 @@ +The following are examples of pl_cpudist.d. + +This script traces the on-CPU time of Perl subroutines (functions) and +prints a report containing distribution plots per subroutine. Here it +traces the example program, Code/Perl/func_slow.pl. + + # pl_cpudist.d + Tracing... Hit Ctrl-C to end. + ^C + + Exclusive subroutine on-CPU times (us), + func_slow.pl, sub, func_a + value ------------- Distribution ------------- count + 131072 | 0 + 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 524288 | 0 + + func_slow.pl, sub, func_b + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_slow.pl, sub, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + + Inclusive subroutine on-CPU times (us), + func_slow.pl, sub, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_slow.pl, sub, func_a + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_slow.pl, sub, func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + +The exclusive subroutine on-CPU times show that func_a() spent between +262 ms and 524 ms on-CPU, while func_b() and func_c() both spent between +524 ms and 1048 ms on-CPU. + +The inclusive subroutine on-CPU times show that func_c() spent between 0.5 and +1.0 seconds, and both func_b() and func_a() spent between 1.0 and 2.1 seconds +of CPU time. This inclusive time includes the time spent in other subroutines +called, and since func_a() called func_b() which called func_c(), these times +make sense. + +These on-CPU times are the time the thread spent running on a CPU, from when +the subroutine began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + + +The following traces a Perl network interface statistics tool, "nicstat" +version 0.99, + +# pl_cpudist.pl +Tracing... Hit Ctrl-C to end. +^C + +Exclusive subroutine on-CPU times (us), + Config.pm, sub, TIEHASH + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + DynaLoader.pm, sub, dl_load_flags + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + Config.pm, sub, BEGIN + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 4 | 0 + + Config.pm, sub, DESTROY + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + register.pm, sub, mkMask + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + Config.pm, sub, import + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + Config.pm, sub, FETCH + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 |@@@@@@@@@@ 1 + 8 | 0 + + strict.pm, sub, unimport + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 8 |@@@@@@@@@@ 1 + 16 | 0 + + Std.pm, sub, getopts + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + register.pm, sub, import + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + strict.pm, sub, import + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@ 2 + 4 |@@@@@@@@ 1 + 8 |@@@@@@@@ 1 + 16 |@@@@@@@@ 1 + 32 | 0 + + strict.pm, sub, bits + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 8 |@@@@@@@ 1 + 16 |@@@@@@@ 1 + 32 | 0 + + AutoLoader.pm, sub, BEGIN + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@ 1 + 2 |@@@@@@@@@@@@@ 2 + 4 |@@@@@@@@@@@@@ 2 + 8 | 0 + 16 | 0 + 32 |@@@@@@@ 1 + 64 | 0 + + vars.pm, sub, import + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + Exporter.pm, sub, import + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + nicstat, sub, print_neat + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16 + 32 |@@ 1 + 64 |@@ 1 + 128 | 0 + + DynaLoader.pm, sub, bootstrap + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + warnings.pm, sub, BEGIN + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + DynaLoader.pm, sub, BEGIN + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@ 1 + 512 |@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + vars.pm, sub, BEGIN + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@ 1 + 2 |@@@@@@@@@@@@@ 1 + 4 | 0 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@@@@@@@@ 1 + 4096 | 0 + + Kstat.pm, sub, BEGIN + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 4 | 0 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@@@@@@@@ 1 + 4096 | 0 + + nicstat, sub, BEGIN + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@@@@@@@@ 1 + 4096 | 0 + + nicstat, sub, fetch_net_data + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 65536 | 0 + + nicstat, sub, find_nets + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 65536 | 0 + + +Inclusive subroutine on-CPU times (us), + Config.pm, sub, TIEHASH + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + DynaLoader.pm, sub, dl_load_flags + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + Config.pm, sub, DESTROY + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + register.pm, sub, mkMask + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + Config.pm, sub, import + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + Config.pm, sub, FETCH + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 |@@@@@@@@@@ 1 + 8 | 0 + + Config.pm, sub, BEGIN + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + strict.pm, sub, unimport + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 16 | 0 + + strict.pm, sub, import + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@ 2 + 4 | 0 + 8 |@@@@@@@@@@@@@@@@ 2 + 16 |@@@@@@@@ 1 + 32 | 0 + + strict.pm, sub, bits + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 8 |@@@@@@@ 1 + 16 |@@@@@@@ 1 + 32 | 0 + + Std.pm, sub, getopts + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + register.pm, sub, import + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + vars.pm, sub, import + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + AutoLoader.pm, sub, BEGIN + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@ 1 + 2 | 0 + 4 |@@@@@@@ 1 + 8 |@@@@@@@@@@@@@ 2 + 16 |@@@@@@@ 1 + 32 |@@@@@@@ 1 + 64 | 0 + + Exporter.pm, sub, import + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + nicstat, sub, print_neat + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16 + 32 |@@ 1 + 64 |@@ 1 + 128 | 0 + + DynaLoader.pm, sub, bootstrap + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + warnings.pm, sub, BEGIN + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + vars.pm, sub, BEGIN + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@ 1 + 2 | 0 + 4 | 0 + 8 | 0 + 16 |@@@@@@@@@@@@@ 1 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@@@@@@@@ 1 + 4096 | 0 + + DynaLoader.pm, sub, BEGIN + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + Kstat.pm, sub, BEGIN + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@ 1 + 8 | 0 + 16 | 0 + 32 |@@@@@@@@@@@@@ 1 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 |@@@@@@@@@@@@@ 1 + 8192 | 0 + + nicstat, sub, BEGIN + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@ 1 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@@@@@@@@ 1 + 4096 | 0 + 8192 |@@@@@@@@@@@@@ 1 + 16384 | 0 + + nicstat, sub, fetch_net_data + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 65536 | 0 + + nicstat, sub, find_nets + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 65536 | 0 + +As an example of interpreting the output: the inclusive on-CPU time for +the "print_neat" subroutine in "nicstat", + + nicstat, sub, print_neat + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16 + 32 |@@ 1 + 64 |@@ 1 + 128 | 0 + +shows that "print_neat" was called 18 times, 16 of which spent between 16 +and 31 microseconds on-CPU, once between 32 and 63 microseconds, and once +between 64 and 127 microseconds. + diff --git a/cddl/contrib/dtracetoolkit/Examples/pl_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_cputime_example.txt new file mode 100644 index 00000000000..5dc56eead28 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pl_cputime_example.txt @@ -0,0 +1,151 @@ +The following are examples of pl_cputime.d. + +This script traces the on-CPU time of Perl subroutines (functions) and +prints a report. Here it traces the example program, Code/Perl/func_slow.pl. + + # pl_cputime.d + Tracing... Hit Ctrl-C to end. + ^C + + Count, + FILE TYPE NAME COUNT + func_slow.pl sub func_a 1 + func_slow.pl sub func_b 1 + func_slow.pl sub func_c 1 + - total - 3 + + Exclusive subroutine on-CPU times (us), + FILE TYPE NAME TOTAL + func_slow.pl sub func_a 264193 + func_slow.pl sub func_b 538498 + func_slow.pl sub func_c 798961 + - total - 1601653 + + Inclusive subroutine on-CPU times (us), + FILE TYPE NAME TOTAL + func_slow.pl sub func_c 798961 + func_slow.pl sub func_b 1337459 + func_slow.pl sub func_a 1601653 + +In total, 3 subroutines were called, one each of func_a(), func_b() and +func_c(). + +The exclusive subroutine on-CPU times show that func_a() spent around 264.2 ms +on-CPU, func_b() spent 538.5 ms, and func_c() spent 799.0 ms. This exclusive +times excludes time spent in other subroutines. + +The inclusive subroutine on-CPU times show that func_c() spent around 799.0 ms +on-CPU, func_b() spent around 1.3 seconds, and func_a() spent around 1.6 +seconds. This inclusive time includes the time spent in other subroutines +called, and since func_a() called func_b() which called func_c(), these +times make perfect sense. + +These on-CPU times are the time the thread spent running on a CPU, from when +the subroutine began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + +If you study the func_slow.pl program alongside the above output, the numbers +should make sense. + + + +The following traces a Perl network interface statistics tool, "nicstat" +version 0.99, + +# pl_cputime.pl +Tracing... Hit Ctrl-C to end. +^C + +Count, + FILE TYPE NAME COUNT + Config.pm sub DESTROY 1 + Config.pm sub TIEHASH 1 + Config.pm sub import 1 + DynaLoader.pm sub bootstrap 1 + DynaLoader.pm sub dl_load_flags 1 + Std.pm sub getopts 1 + nicstat sub fetch_net_data 1 + nicstat sub find_nets 1 + register.pm sub import 1 + warnings.pm sub BEGIN 1 + Config.pm sub BEGIN 2 + DynaLoader.pm sub BEGIN 2 + Exporter.pm sub import 2 + register.pm sub mkMask 2 + vars.pm sub import 2 + Kstat.pm sub BEGIN 3 + nicstat sub BEGIN 3 + vars.pm sub BEGIN 3 + Config.pm sub FETCH 4 + strict.pm sub unimport 4 + strict.pm sub import 5 + AutoLoader.pm sub BEGIN 6 + strict.pm sub bits 6 + nicstat sub print_neat 18 + - total - 72 + +Exclusive subroutine on-CPU times (us), + FILE TYPE NAME TOTAL + DynaLoader.pm sub dl_load_flags 2 + Config.pm sub TIEHASH 2 + Config.pm sub DESTROY 6 + Config.pm sub BEGIN 7 + register.pm sub mkMask 8 + Config.pm sub import 11 + Config.pm sub FETCH 12 + strict.pm sub unimport 17 + strict.pm sub import 21 + AutoLoader.pm sub BEGIN 22 + Std.pm sub getopts 33 + strict.pm sub bits 40 + register.pm sub import 51 + vars.pm sub import 65 + Exporter.pm sub import 88 + nicstat sub print_neat 426 + warnings.pm sub BEGIN 598 + DynaLoader.pm sub bootstrap 677 + DynaLoader.pm sub BEGIN 1015 + Kstat.pm sub BEGIN 2627 + vars.pm sub BEGIN 2642 + nicstat sub BEGIN 3033 + nicstat sub fetch_net_data 42018 + nicstat sub find_nets 52094 + - total - 105526 + +Inclusive subroutine on-CPU times (us), + FILE TYPE NAME TOTAL + DynaLoader.pm sub dl_load_flags 2 + Config.pm sub TIEHASH 2 + Config.pm sub DESTROY 6 + register.pm sub mkMask 8 + Config.pm sub import 11 + Config.pm sub FETCH 12 + Config.pm sub BEGIN 19 + strict.pm sub import 28 + strict.pm sub unimport 35 + strict.pm sub bits 40 + AutoLoader.pm sub BEGIN 51 + register.pm sub import 59 + Std.pm sub getopts 63 + vars.pm sub import 65 + Exporter.pm sub import 88 + nicstat sub print_neat 426 + warnings.pm sub BEGIN 598 + DynaLoader.pm sub bootstrap 680 + vars.pm sub BEGIN 3313 + DynaLoader.pm sub BEGIN 4401 + Kstat.pm sub BEGIN 7124 + nicstat sub BEGIN 10916 + nicstat sub fetch_net_data 42018 + nicstat sub find_nets 52094 + +The output showed that the most CPU time was spent in the subroutine +find_nets(), with a total exclusive on-CPU time of 52.1 ms. This also matches +the total inclusive time, suggesting that find_nets() didn't call other +subroutines. + diff --git a/cddl/contrib/dtracetoolkit/Examples/pl_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_flow_example.txt new file mode 100644 index 00000000000..dcce6e04de0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pl_flow_example.txt @@ -0,0 +1,179 @@ +The following are examples of pl_flow.d. + +This is a simple script to trace the flow of Perl subroutines (functions). +Here it traces the example program, Code/Perl/func_abc.pl. + + # pl_flow.d + C TIME(us) FILE -- SUB + 0 2979519183757 func_abc.pl -> func_a + 0 2979520190159 func_abc.pl -> func_b + 0 2979521200166 func_abc.pl -> func_c + 0 2979522210184 func_abc.pl <- func_c + 0 2979522210199 func_abc.pl <- func_b + 0 2979522210207 func_abc.pl <- func_a + ^C + +As each subroutine is entered, the third column is indented by 2 spaces. This +shows which subroutine is calling who - the output abovebegins by showing that +func_a() began, and then called func_b(). + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + + + +The following traces a Perl network interface statistics tool, "nicstat" +version 0.99, + +# pl_flow.d + C TIME(us) FILE -- SUB + 0 4181899422549 nicstat -> BEGIN + 0 4181899423048 strict.pm -> bits + 0 4181899423081 strict.pm <- bits + 0 4181899423105 strict.pm -> import + 0 4181899423126 strict.pm <- import + 0 4181899423133 nicstat <- BEGIN + 0 4181899423157 nicstat -> BEGIN + 0 4181899445634 Exporter.pm -> import + 0 4181899445730 Exporter.pm <- import + 0 4181899445743 nicstat <- BEGIN + 0 4181899445770 nicstat -> BEGIN + 0 4181899446066 Kstat.pm -> BEGIN + 0 4181899446076 strict.pm -> import + 0 4181899446087 strict.pm <- import + 0 4181899446094 Kstat.pm <- BEGIN + 0 4181899446116 Kstat.pm -> BEGIN + 0 4181899453669 DynaLoader.pm -> BEGIN + 0 4181899453810 vars.pm -> BEGIN + 0 4181899453821 vars.pm <- BEGIN + 0 4181899453921 vars.pm -> BEGIN + 0 4181899454494 warnings.pm -> BEGIN + 0 4181899455149 warnings.pm <- BEGIN + 0 4181899457183 register.pm -> import + 0 4181899457202 register.pm -> mkMask + 0 4181899457214 register.pm <- mkMask + 0 4181899457264 register.pm -> mkMask + 0 4181899457274 register.pm <- mkMask + 0 4181899457283 register.pm <- import + 0 4181899457290 vars.pm <- BEGIN + 0 4181899457316 vars.pm -> BEGIN + 0 4181899457324 strict.pm -> import + 0 4181899457332 strict.pm -> bits + 0 4181899457345 strict.pm <- bits + 0 4181899457353 strict.pm <- import + 0 4181899457359 vars.pm <- BEGIN + 0 4181899457652 vars.pm -> import + 0 4181899457703 vars.pm <- import + 0 4181899457710 DynaLoader.pm <- BEGIN + 0 4181899457758 DynaLoader.pm -> BEGIN + 0 4181899457883 Config.pm -> BEGIN + 0 4181899457890 strict.pm -> import + 0 4181899457899 strict.pm <- import + 0 4181899457906 Config.pm <- BEGIN + 0 4181899458038 Config.pm -> BEGIN + 0 4181899458045 strict.pm -> unimport + 0 4181899458053 strict.pm -> bits + 0 4181899458063 strict.pm <- bits + 0 4181899458077 strict.pm <- unimport + 0 4181899458084 Config.pm <- BEGIN + 0 4181899458426 Config.pm -> TIEHASH + 0 4181899458435 Config.pm <- TIEHASH + 0 4181899458476 Config.pm -> import + 0 4181899458493 Config.pm <- import + 0 4181899458500 DynaLoader.pm <- BEGIN + 0 4181899459978 AutoLoader.pm -> BEGIN + 0 4181899459990 strict.pm -> import + 0 4181899460033 strict.pm <- import + 0 4181899460064 AutoLoader.pm <- BEGIN + 0 4181899460088 AutoLoader.pm -> BEGIN + 0 4181899460096 AutoLoader.pm <- BEGIN + 0 4181899460187 AutoLoader.pm -> BEGIN + 0 4181899460199 AutoLoader.pm <- BEGIN + 0 4181899460582 AutoLoader.pm -> BEGIN + 0 4181899460590 strict.pm -> unimport + 0 4181899460598 strict.pm -> bits + 0 4181899460611 strict.pm <- bits + 0 4181899460619 strict.pm <- unimport + 0 4181899460625 AutoLoader.pm <- BEGIN + 0 4181899460830 AutoLoader.pm -> BEGIN + 0 4181899460838 strict.pm -> unimport + 0 4181899460845 strict.pm -> bits + 0 4181899460855 strict.pm <- bits + 0 4181899460862 strict.pm <- unimport + 0 4181899460869 AutoLoader.pm <- BEGIN + 0 4181899461092 AutoLoader.pm -> BEGIN + 0 4181899461100 strict.pm -> unimport + 0 4181899461107 strict.pm -> bits + 0 4181899461116 strict.pm <- bits + 0 4181899461124 strict.pm <- unimport + 0 4181899461130 AutoLoader.pm <- BEGIN + 0 4181899461238 Config.pm -> FETCH + 0 4181899461250 Config.pm <- FETCH + 0 4181899461264 Config.pm -> FETCH + 0 4181899461272 Config.pm <- FETCH + 0 4181899461282 Config.pm -> FETCH + 0 4181899461290 Config.pm <- FETCH + 0 4181899461299 Config.pm -> FETCH + 0 4181899461307 Config.pm <- FETCH + 0 4181899461403 Kstat.pm <- BEGIN + 0 4181899461432 Kstat.pm -> BEGIN + 0 4181899461440 vars.pm -> import + 0 4181899461476 vars.pm <- import + 0 4181899461483 Kstat.pm <- BEGIN + 0 4181899461539 DynaLoader.pm -> bootstrap + 0 4181899461769 DynaLoader.pm -> dl_load_flags + 0 4181899461777 DynaLoader.pm <- dl_load_flags + 0 4181899462208 DynaLoader.pm <- bootstrap + 0 4181899462231 nicstat <- BEGIN + 0 4181899468306 Std.pm -> getopts + 0 4181899468351 Exporter.pm -> import + 0 4181899468390 Exporter.pm <- import + 0 4181899468405 Std.pm <- getopts + 0 4181899468426 nicstat -> find_nets + 0 4181899521011 nicstat <- find_nets + 0 4181899521415 nicstat -> fetch_net_data + 0 4181899564973 nicstat <- fetch_net_data + 0 4181899565526 nicstat -> print_neat + 0 4181899565672 nicstat <- print_neat + 0 4181899565680 nicstat -> print_neat + 0 4181899565902 nicstat <- print_neat + 0 4181899565909 nicstat -> print_neat + 0 4181899566033 nicstat <- print_neat + 0 4181899566039 nicstat -> print_neat + 0 4181899566165 nicstat <- print_neat + 0 4181899566172 nicstat -> print_neat + 0 4181899566331 nicstat <- print_neat + 0 4181899566338 nicstat -> print_neat + 0 4181899566494 nicstat <- print_neat + 0 4181899566791 nicstat -> print_neat + 0 4181899566953 nicstat <- print_neat + 0 4181899566961 nicstat -> print_neat + 0 4181899567085 nicstat <- print_neat + 0 4181899567091 nicstat -> print_neat + 0 4181899567247 nicstat <- print_neat + 0 4181899567254 nicstat -> print_neat + 0 4181899567377 nicstat <- print_neat + 0 4181899567383 nicstat -> print_neat + 0 4181899567538 nicstat <- print_neat + 0 4181899567544 nicstat -> print_neat + 0 4181899567666 nicstat <- print_neat + 0 4181899567977 nicstat -> print_neat + 0 4181899568232 nicstat <- print_neat + 0 4181899568240 nicstat -> print_neat + 0 4181899568397 nicstat <- print_neat + 0 4181899568404 nicstat -> print_neat + 0 4181899568528 nicstat <- print_neat + 0 4181899568535 nicstat -> print_neat + 0 4181899568656 nicstat <- print_neat + 0 4181899568663 nicstat -> print_neat + 0 4181899568819 nicstat <- print_neat + 0 4181899568826 nicstat -> print_neat + 0 4181899568947 nicstat <- print_neat + 0 4181899572708 Config.pm -> DESTROY + 0 4181899572735 Config.pm <- DESTROY + +After initialising Perl libraries and modules, the "nicstat" program ran, +the output matching what was expected from the source. + diff --git a/cddl/contrib/dtracetoolkit/Examples/pl_flowinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_flowinfo_example.txt new file mode 100644 index 00000000000..e4b406f14c4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pl_flowinfo_example.txt @@ -0,0 +1,188 @@ +The following are examples of pl_flowinfo.d. + +This is a simple script to trace the flow of Perl subroutines (functions). +Here it traces the example program, Code/Perl/func_abc.pl. + + # pl_flowinfo.d + C PID DELTA(us) FILE:LINE TYPE -- SUB + 0 305127 2 func_abc.pl:15 sub -> func_a + 0 305127 1008776 func_abc.pl:9 sub -> func_b + 0 305127 1010019 func_abc.pl:4 sub -> func_c + 0 305127 1009979 func_abc.pl:4 sub <- func_c + 0 305127 26 func_abc.pl:9 sub <- func_b + 0 305127 9 func_abc.pl:15 sub <- func_a + ^C + +As each subroutine is entered, the third column is indented by 2 spaces. This +shows which subroutine is calling who - the output abovebegins by showing that +func_a() began, and then called func_b(). + +The DELTA(us) column shows time from that line to the previous line, and +so can be a bit tricky to read. For example, the second line of data output +(skipping the header) reads as "the time from func_a() beginning to +func_b() beginning was 1008776 us, or 1.01 seconds". + +The LINE column shows the line in the file what was being executed. Refer +to the source program to see what this line refers to. + +If the output looks shuffled, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + + + +The following traces a Perl network interface statistics tool, "nicstat" +version 0.99, + +# pl_flowinfo.d +C PID DELTA(us) FILE:LINE TYPE -- SUB +0 305132 2 nicstat:83 sub -> BEGIN +0 305132 444 strict.pm:12 sub -> bits +0 305132 34 strict.pm:12 sub <- bits +0 305132 32 strict.pm:28 sub -> import +0 305132 22 strict.pm:28 sub <- import +0 305132 8 nicstat:83 sub <- BEGIN +0 305132 26 nicstat:84 sub -> BEGIN +0 305132 2339 Exporter.pm:30 sub -> import +0 305132 83 Exporter.pm:30 sub <- import +0 305132 14 nicstat:84 sub <- BEGIN +0 305132 27 nicstat:85 sub -> BEGIN +0 305132 205 Kstat.pm:34 sub -> BEGIN +0 305132 11 strict.pm:28 sub -> import +0 305132 11 strict.pm:28 sub <- import +0 305132 8 Kstat.pm:34 sub <- BEGIN +0 305132 23 Kstat.pm:35 sub -> BEGIN +0 305132 187 DynaLoader.pm:18 sub -> BEGIN +0 305132 73 vars.pm:3 sub -> BEGIN +0 305132 9 vars.pm:3 sub <- BEGIN +0 305132 34 vars.pm:7 sub -> BEGIN +0 305132 470 warnings.pm:134 sub -> BEGIN +0 305132 598 warnings.pm:134 sub <- BEGIN +0 305132 2151 register.pm:37 sub -> import +0 305132 23 register.pm:28 sub -> mkMask +0 305132 13 register.pm:28 sub <- mkMask +0 305132 53 register.pm:28 sub -> mkMask +0 305132 11 register.pm:28 sub <- mkMask +0 305132 11 register.pm:37 sub <- import +0 305132 8 vars.pm:7 sub <- BEGIN +0 305132 28 vars.pm:8 sub -> BEGIN +0 305132 9 strict.pm:28 sub -> import +0 305132 8 strict.pm:12 sub -> bits +0 305132 13 strict.pm:12 sub <- bits +0 305132 9 strict.pm:28 sub <- import +0 305132 8 vars.pm:8 sub <- BEGIN +0 305132 294 vars.pm:11 sub -> import +0 305132 52 vars.pm:11 sub <- import +0 305132 8 DynaLoader.pm:18 sub <- BEGIN +0 305132 48 DynaLoader.pm:25 sub -> BEGIN +0 305132 97 Config.pm:5 sub -> BEGIN +0 305132 9 strict.pm:28 sub -> import +0 305132 9 strict.pm:28 sub <- import +0 305132 8 Config.pm:5 sub <- BEGIN +0 305132 134 Config.pm:31 sub -> BEGIN +0 305132 9 strict.pm:33 sub -> unimport +0 305132 8 strict.pm:12 sub -> bits +0 305132 11 strict.pm:12 sub <- bits +0 305132 16 strict.pm:33 sub <- unimport +0 305132 8 Config.pm:31 sub <- BEGIN +0 305132 343 Config.pm:60 sub -> TIEHASH +0 305132 10 Config.pm:60 sub <- TIEHASH +0 305132 44 Config.pm:25 sub -> import +0 305132 18 Config.pm:25 sub <- import +0 305132 9 DynaLoader.pm:25 sub <- BEGIN +0 305132 1301 AutoLoader.pm:3 sub -> BEGIN +0 305132 11 strict.pm:28 sub -> import +0 305132 10 strict.pm:28 sub <- import +0 305132 9 AutoLoader.pm:3 sub <- BEGIN +0 305132 22 AutoLoader.pm:4 sub -> BEGIN +0 305132 9 AutoLoader.pm:4 sub <- BEGIN +0 305132 89 AutoLoader.pm:14 sub -> BEGIN +0 305132 13 AutoLoader.pm:14 sub <- BEGIN +0 305132 375 AutoLoader.pm:95 sub -> BEGIN +0 305132 9 strict.pm:33 sub -> unimport +0 305132 8 strict.pm:12 sub -> bits +0 305132 11 strict.pm:12 sub <- bits +0 305132 9 strict.pm:33 sub <- unimport +0 305132 8 AutoLoader.pm:95 sub <- BEGIN +0 305132 203 AutoLoader.pm:128 sub -> BEGIN +0 305132 9 strict.pm:33 sub -> unimport +0 305132 8 strict.pm:12 sub -> bits +0 305132 11 strict.pm:12 sub <- bits +0 305132 9 strict.pm:33 sub <- unimport +0 305132 8 AutoLoader.pm:128 sub <- BEGIN +0 305132 220 AutoLoader.pm:173 sub -> BEGIN +0 305132 9 strict.pm:33 sub -> unimport +0 305132 8 strict.pm:12 sub -> bits +0 305132 10 strict.pm:12 sub <- bits +0 305132 9 strict.pm:33 sub <- unimport +0 305132 8 AutoLoader.pm:173 sub <- BEGIN +0 305132 103 Config.pm:52 sub -> FETCH +0 305132 12 Config.pm:52 sub <- FETCH +0 305132 16 Config.pm:52 sub -> FETCH +0 305132 9 Config.pm:52 sub <- FETCH +0 305132 11 Config.pm:52 sub -> FETCH +0 305132 9 Config.pm:52 sub <- FETCH +0 305132 11 Config.pm:52 sub -> FETCH +0 305132 9 Config.pm:52 sub <- FETCH +0 305132 95 Kstat.pm:35 sub <- BEGIN +0 305132 29 Kstat.pm:36 sub -> BEGIN +0 305132 10 vars.pm:11 sub -> import +0 305132 33 vars.pm:11 sub <- import +0 305132 8 Kstat.pm:36 sub <- BEGIN +0 305132 56 DynaLoader.pm:133 sub -> bootstrap +0 305132 314 DynaLoader.pm:48 sub -> dl_load_flags +0 305132 11 DynaLoader.pm:48 sub <- dl_load_flags +0 305132 1113 DynaLoader.pm:133 sub <- bootstrap +0 305132 41 nicstat:85 sub <- BEGIN +0 305132 6102 Std.pm:219 sub -> getopts +0 305132 52 Exporter.pm:30 sub -> import +0 305132 40 Exporter.pm:30 sub <- import +0 305132 22 Std.pm:219 sub <- getopts +0 305132 24 nicstat:264 sub -> find_nets +0 305132 79662 nicstat:264 sub <- find_nets +0 305132 420 nicstat:304 sub -> fetch_net_data +0 305132 43871 nicstat:304 sub <- fetch_net_data +0 305132 479 nicstat:372 sub -> print_neat +0 305132 150 nicstat:372 sub <- print_neat +0 305132 10 nicstat:372 sub -> print_neat +0 305132 220 nicstat:372 sub <- print_neat +0 305132 10 nicstat:372 sub -> print_neat +0 305132 126 nicstat:372 sub <- print_neat +0 305132 10 nicstat:372 sub -> print_neat +0 305132 125 nicstat:372 sub <- print_neat +0 305132 10 nicstat:372 sub -> print_neat +0 305132 157 nicstat:372 sub <- print_neat +0 305132 10 nicstat:372 sub -> print_neat +0 305132 171 nicstat:372 sub <- print_neat +0 305132 343 nicstat:372 sub -> print_neat +0 305132 128 nicstat:372 sub <- print_neat +0 305132 10 nicstat:372 sub -> print_neat +0 305132 157 nicstat:372 sub <- print_neat +0 305132 9 nicstat:372 sub -> print_neat +0 305132 125 nicstat:372 sub <- print_neat +0 305132 9 nicstat:372 sub -> print_neat +0 305132 123 nicstat:372 sub <- print_neat +0 305132 9 nicstat:372 sub -> print_neat +0 305132 160 nicstat:372 sub <- print_neat +0 305132 10 nicstat:372 sub -> print_neat +0 305132 124 nicstat:372 sub <- print_neat +0 305132 342 nicstat:372 sub -> print_neat +0 305132 126 nicstat:372 sub <- print_neat +0 305132 10 nicstat:372 sub -> print_neat +0 305132 123 nicstat:372 sub <- print_neat +0 305132 10 nicstat:372 sub -> print_neat +0 305132 156 nicstat:372 sub <- print_neat +0 305132 10 nicstat:372 sub -> print_neat +0 305132 153 nicstat:372 sub <- print_neat +0 305132 10 nicstat:372 sub -> print_neat +0 305132 123 nicstat:372 sub <- print_neat +0 305132 9 nicstat:372 sub -> print_neat +0 305132 123 nicstat:372 sub <- print_neat +0 305132 3736 Config.pm:63 sub -> DESTROY +0 305132 32 Config.pm:63 sub <- DESTROY + +After initialising Perl libraries and modules, the "nicstat" program ran, +the output matching what was expected from the source. + diff --git a/cddl/contrib/dtracetoolkit/Examples/pl_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_flowtime_example.txt new file mode 100644 index 00000000000..24c53838a9e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pl_flowtime_example.txt @@ -0,0 +1,199 @@ +The following are examples of pl_flowtime.d. + +This is a simple script to trace the flow of Perl subroutines (functions). +Here it traces the example program, Code/Perl/func_abc.pl. + + # pl_flowtime.d + C TIME(us) FILE DELTA(us) -- SUB + 0 4201460363351 func_abc.pl 2 -> func_a + 0 4201461370041 func_abc.pl 1006689 -> func_b + 0 4201462380038 func_abc.pl 1009997 -> func_c + 0 4201463390094 func_abc.pl 1010055 <- func_c + 0 4201463390117 func_abc.pl 23 <- func_b + 0 4201463390126 func_abc.pl 8 <- func_a + ^C + +As each subroutine is entered, the third column is indented by 2 spaces. This +shows which subroutine is calling who - the output above begins by showing that +func_a() began, and then called func_b(). + +The DELTA(us) column shows time from that line to the previous line, and +so can be a bit tricky to read. For example, the second line of data output +(skipping the header) reads as "the time from func_a() beginning to +func_b() beginning was 1006689 us, or 1.01 seconds". + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + + + +The following traces a Perl network interface statistics tool, "nicstat" +version 0.99, + +# pl_flowtime.d + C TIME(us) FILE DELTA(us) -- SUB + 0 4201691465151 nicstat 2 -> BEGIN + 0 4201691465593 strict.pm 441 -> bits + 0 4201691465625 strict.pm 32 <- bits + 0 4201691465655 strict.pm 29 -> import + 0 4201691465676 strict.pm 21 <- import + 0 4201691465684 nicstat 7 <- BEGIN + 0 4201691465710 nicstat 25 -> BEGIN + 0 4201691468038 Exporter.pm 2328 -> import + 0 4201691468121 Exporter.pm 82 <- import + 0 4201691468133 nicstat 12 <- BEGIN + 0 4201691468160 nicstat 26 -> BEGIN + 0 4201691468367 Kstat.pm 207 -> BEGIN + 0 4201691468378 strict.pm 10 -> import + 0 4201691468388 strict.pm 10 <- import + 0 4201691468396 Kstat.pm 8 <- BEGIN + 0 4201691468419 Kstat.pm 23 -> BEGIN + 0 4201691468612 DynaLoader.pm 192 -> BEGIN + 0 4201691468685 vars.pm 73 -> BEGIN + 0 4201691468694 vars.pm 8 <- BEGIN + 0 4201691468727 vars.pm 33 -> BEGIN + 0 4201691469199 warnings.pm 471 -> BEGIN + 0 4201691469863 warnings.pm 663 <- BEGIN + 0 4201691471965 register.pm 2102 -> import + 0 4201691471986 register.pm 21 -> mkMask + 0 4201691472000 register.pm 13 <- mkMask + 0 4201691472052 register.pm 52 -> mkMask + 0 4201691472063 register.pm 10 <- mkMask + 0 4201691472074 register.pm 10 <- import + 0 4201691472081 vars.pm 7 <- BEGIN + 0 4201691472109 vars.pm 28 -> BEGIN + 0 4201691472118 strict.pm 8 -> import + 0 4201691472126 strict.pm 8 -> bits + 0 4201691472139 strict.pm 12 <- bits + 0 4201691472148 strict.pm 9 <- import + 0 4201691472155 vars.pm 7 <- BEGIN + 0 4201691472450 vars.pm 294 -> import + 0 4201691472501 vars.pm 51 <- import + 0 4201691472509 DynaLoader.pm 7 <- BEGIN + 0 4201691472557 DynaLoader.pm 48 -> BEGIN + 0 4201691472650 Config.pm 92 -> BEGIN + 0 4201691472658 strict.pm 8 -> import + 0 4201691472667 strict.pm 8 <- import + 0 4201691472675 Config.pm 7 <- BEGIN + 0 4201691472809 Config.pm 133 -> BEGIN + 0 4201691472817 strict.pm 8 -> unimport + 0 4201691472825 strict.pm 8 -> bits + 0 4201691472852 strict.pm 26 <- bits + 0 4201691472868 strict.pm 16 <- unimport + 0 4201691472876 Config.pm 7 <- BEGIN + 0 4201691473222 Config.pm 345 -> TIEHASH + 0 4201691473231 Config.pm 9 <- TIEHASH + 0 4201691473275 Config.pm 43 -> import + 0 4201691473292 Config.pm 17 <- import + 0 4201691473301 DynaLoader.pm 8 <- BEGIN + 0 4201691474650 AutoLoader.pm 1349 -> BEGIN + 0 4201691474661 strict.pm 10 -> import + 0 4201691474670 strict.pm 9 <- import + 0 4201691474679 AutoLoader.pm 8 <- BEGIN + 0 4201691474701 AutoLoader.pm 21 -> BEGIN + 0 4201691474709 AutoLoader.pm 8 <- BEGIN + 0 4201691474797 AutoLoader.pm 88 -> BEGIN + 0 4201691474810 AutoLoader.pm 12 <- BEGIN + 0 4201691475186 AutoLoader.pm 376 -> BEGIN + 0 4201691475195 strict.pm 9 -> unimport + 0 4201691475203 strict.pm 7 -> bits + 0 4201691475214 strict.pm 10 <- bits + 0 4201691475223 strict.pm 8 <- unimport + 0 4201691475230 AutoLoader.pm 7 <- BEGIN + 0 4201691475435 AutoLoader.pm 204 -> BEGIN + 0 4201691475444 strict.pm 8 -> unimport + 0 4201691475451 strict.pm 7 -> bits + 0 4201691475462 strict.pm 10 <- bits + 0 4201691475470 strict.pm 8 <- unimport + 0 4201691475478 AutoLoader.pm 7 <- BEGIN + 0 4201691475697 AutoLoader.pm 219 -> BEGIN + 0 4201691475706 strict.pm 8 -> unimport + 0 4201691475714 strict.pm 7 -> bits + 0 4201691475724 strict.pm 10 <- bits + 0 4201691475732 strict.pm 8 <- unimport + 0 4201691475739 AutoLoader.pm 7 <- BEGIN + 0 4201691475842 Config.pm 102 -> FETCH + 0 4201691475854 Config.pm 11 <- FETCH + 0 4201691475870 Config.pm 15 -> FETCH + 0 4201691475879 Config.pm 9 <- FETCH + 0 4201691475890 Config.pm 10 -> FETCH + 0 4201691475898 Config.pm 8 <- FETCH + 0 4201691475909 Config.pm 10 -> FETCH + 0 4201691475917 Config.pm 8 <- FETCH + 0 4201691476012 Kstat.pm 94 <- BEGIN + 0 4201691476041 Kstat.pm 29 -> BEGIN + 0 4201691476051 vars.pm 9 -> import + 0 4201691476084 vars.pm 32 <- import + 0 4201691476091 Kstat.pm 7 <- BEGIN + 0 4201691476147 DynaLoader.pm 56 -> bootstrap + 0 4201691476373 DynaLoader.pm 225 -> dl_load_flags + 0 4201691476383 DynaLoader.pm 9 <- dl_load_flags + 0 4201691476813 DynaLoader.pm 430 <- bootstrap + 0 4201691476837 nicstat 23 <- BEGIN + 0 4201691483648 Std.pm 6811 -> getopts + 0 4201691483697 Exporter.pm 49 -> import + 0 4201691483737 Exporter.pm 39 <- import + 0 4201691483756 Std.pm 19 <- getopts + 0 4201691483780 nicstat 24 -> find_nets + 0 4201691539198 nicstat 55418 <- find_nets + 0 4201691539610 nicstat 411 -> fetch_net_data + 0 4201691583290 nicstat 43679 <- fetch_net_data + 0 4201691583781 nicstat 491 -> print_neat + 0 4201691583930 nicstat 149 <- print_neat + 0 4201691583996 nicstat 65 -> print_neat + 0 4201691584165 nicstat 169 <- print_neat + 0 4201691584174 nicstat 9 -> print_neat + 0 4201691584298 nicstat 124 <- print_neat + 0 4201691584308 nicstat 9 -> print_neat + 0 4201691584432 nicstat 124 <- print_neat + 0 4201691584473 nicstat 41 -> print_neat + 0 4201691584597 nicstat 123 <- print_neat + 0 4201691584607 nicstat 9 -> print_neat + 0 4201691584730 nicstat 123 <- print_neat + 0 4201691585091 nicstat 361 -> print_neat + 0 4201691585217 nicstat 125 <- print_neat + 0 4201691585226 nicstat 9 -> print_neat + 0 4201691585379 nicstat 152 <- print_neat + 0 4201691585389 nicstat 9 -> print_neat + 0 4201691585512 nicstat 123 <- print_neat + 0 4201691585521 nicstat 9 -> print_neat + 0 4201691585644 nicstat 123 <- print_neat + 0 4201691585653 nicstat 9 -> print_neat + 0 4201691585825 nicstat 171 <- print_neat + 0 4201691585834 nicstat 9 -> print_neat + 0 4201691585988 nicstat 154 <- print_neat + 0 4201691586274 nicstat 285 -> print_neat + 0 4201691586434 nicstat 160 <- print_neat + 0 4201691586443 nicstat 9 -> print_neat + 0 4201691586567 nicstat 123 <- print_neat + 0 4201691586576 nicstat 9 -> print_neat + 0 4201691586731 nicstat 154 <- print_neat + 0 4201691586740 nicstat 8 -> print_neat + 0 4201691586892 nicstat 151 <- print_neat + 0 4201691586901 nicstat 9 -> print_neat + 0 4201691587025 nicstat 123 <- print_neat + 0 4201691587034 nicstat 9 -> print_neat + 0 4201691587157 nicstat 123 <- print_neat + 0 4201691590909 Config.pm 3751 -> DESTROY + 0 4201691590938 Config.pm 29 <- DESTROY + +After initialising Perl libraries and modules, the "nicstat" program ran, +the output matching what was expected from the source. + +The DELTA column shows that most time is spent in the find_nets() and +fetch_nets_data() subroutines, with 55.4 ms and 44.7 ms of elapsed +function time respectively. Those particular times were easy to interpret, +since there were no child subroutines called, and the delta spanned +the subroutine entry to its return. + +Some times get trickier to comprehend. The 2nd last line with a DELTA time +of 3751 us, means "the time from the print_neat() subroutine completing +to the DESTROY() subroutine starting, took 3751 us.". What is happening +during this time? It is hard to say based on this output - since it isn't +time within a function, rather it is time that Perl spent processing the +main program. Since we have the last function called, we may guess where +the program was at; or we could enhance this script to trace Perl engine +internals as well (and/or syscalls). + diff --git a/cddl/contrib/dtracetoolkit/Examples/pl_malloc_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_malloc_example.txt new file mode 100644 index 00000000000..a22a0082309 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pl_malloc_example.txt @@ -0,0 +1,79 @@ +The following are examples of pl_malloc.d. + +This is an expiremental script that attepmts to identify who is calling +malloc() from Perl, and to print byte distribution plots. + +Here it traces the example program, Code/Perl/func_malloc.pl. + +# pl_malloc.d -c ./func_malloc.pl +Function A +Function B +Function C +Tracing... Hit Ctrl-C to end. + +Perl malloc byte distributions by engine caller, + + perl`perl_alloc, total bytes = 1 + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + libc.so.1`_findbuf, total bytes = 520 + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + perl`Perl_safesysmalloc, total bytes = 72106 + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@ 26 + 4 |@@@@@ 72 + 8 |@@@@@@ 101 + 16 |@@@@@@@@@@@@@@ 216 + 32 |@@@@@@@@@@@ 178 + 64 |@ 21 + 128 | 6 + 256 | 2 + 512 | 4 + 1024 | 1 + 2048 |@ 11 + 4096 | 1 + 8192 | 0 + + +Perl malloc byte distributions by Perl file and subroutine, + + func_malloc.pl, func_a, bytes total = 42504 + value ------------- Distribution ------------- count + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 65536 | 0 + + func_malloc.pl, func_b, bytes total = 100008 + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 | 0 + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@ 1 + 131072 | 0 + +The func_malloc.pl program allocated around 100 Kbytes by creating a +variable ($b) and populating it with 100,000 "b" characters. This has been +identified in the last distribution plot printed, with one malloc event +of between 64 Kbytes and 128 Kbytes in size. There was also a malloc event +of between 4 and 7 bytes in size. + diff --git a/cddl/contrib/dtracetoolkit/Examples/pl_subcalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_subcalls_example.txt new file mode 100644 index 00000000000..1ea0369f4ed --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pl_subcalls_example.txt @@ -0,0 +1,53 @@ +The following are examples of pl_subcalls.d. + +This is a simple script to count executed Perl subroutines. Here it traces +an example program, Code/Perl/func_abc.pl. + + # pl_subcalls.d + Tracing... Hit Ctrl-C to end. + ^C + FILE SUB CALLS + func_abc.pl func_a 1 + func_abc.pl func_b 1 + func_abc.pl func_c 1 + +While tracing, func_a() from the program "func_abc.pl" was executed once, +along with func_b() and func_c(). + + + +The following traces a Perl network interface statistics tool, "nicstat" +version 0.99, + + # pl_subcalls.d + Tracing... Hit Ctrl-C to end. + ^C + FILE SUB CALLS + Config.pm DESTROY 1 + Config.pm TIEHASH 1 + Config.pm import 1 + DynaLoader.pm bootstrap 1 + DynaLoader.pm dl_load_flags 1 + Std.pm getopts 1 + nicstat fetch_net_data 1 + nicstat find_nets 1 + register.pm import 1 + warnings.pm BEGIN 1 + Config.pm BEGIN 2 + DynaLoader.pm BEGIN 2 + Exporter.pm import 2 + register.pm mkMask 2 + vars.pm import 2 + Kstat.pm BEGIN 3 + nicstat BEGIN 3 + vars.pm BEGIN 3 + Config.pm FETCH 4 + strict.pm unimport 4 + strict.pm import 5 + AutoLoader.pm BEGIN 6 + strict.pm bits 6 + nicstat print_neat 18 + +The number of subroutines called by nicstat can be seen above, which includes +subroutines from libraries and modules that the program used. + diff --git a/cddl/contrib/dtracetoolkit/Examples/pl_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_syscalls_example.txt new file mode 100644 index 00000000000..8cd50940170 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pl_syscalls_example.txt @@ -0,0 +1,50 @@ +The following are examples of pl_syscalls.d. + +This is a simple script to count executed Perl subroutines and system calls. +Here it traces an example program, Code/Perl/func_abc.pl. + + # pl_syscalls.d -c ./func_abc.pl + Function A + Tracing... Hit Ctrl-C to end. + Function B + Function C + + Calls for PID 305173, + + FILE TYPE NAME COUNT + func_abc.pl sub func_a 1 + func_abc.pl sub func_b 1 + func_abc.pl sub func_c 1 + func_abc.pl syscall fcntl 1 + func_abc.pl syscall getrlimit 1 + func_abc.pl syscall mmap 1 + func_abc.pl syscall munmap 1 + func_abc.pl syscall rexit 1 + func_abc.pl syscall schedctl 1 + func_abc.pl syscall sigpending 1 + func_abc.pl syscall sysi86 1 + func_abc.pl syscall getgid 2 + func_abc.pl syscall getpid 2 + func_abc.pl syscall getuid 2 + func_abc.pl syscall sigaction 2 + func_abc.pl syscall sysconfig 2 + func_abc.pl syscall fstat64 3 + func_abc.pl syscall nanosleep 3 + func_abc.pl syscall read 3 + func_abc.pl syscall setcontext 3 + func_abc.pl syscall write 3 + func_abc.pl syscall close 4 + func_abc.pl syscall ioctl 4 + func_abc.pl syscall open64 4 + func_abc.pl syscall llseek 5 + func_abc.pl syscall gtime 7 + func_abc.pl syscall brk 20 + +While tracing, three subroutines were called - func_a(), func_b() and func_c(). +There were numerous system calls made, including 20 brk()'s, 7 gtime()'s +and 5 llseek()'s. + +This script can provide an insight to how an application is interacting +with the system, by providing both application subroutine calls and +system calls in the same output. + diff --git a/cddl/contrib/dtracetoolkit/Examples/pl_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_syscolors_example.txt new file mode 100644 index 00000000000..3a5f249c917 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pl_syscolors_example.txt @@ -0,0 +1,183 @@ +The following are examples of pl_syscolors.d. + +This is a simple script to trace the flow of Perl subroutines and system +calls made, and renders the output in color ("colour") using terminal +escape sequences (which you can tweak by modifying the script). + +Here it traces the example program, Code/Perl/func_abc.pl. + +WARNING: This output is full of terminal escape sequences, so if you are +trying to view this through an editor or web browser - it may look awful. +Try viewing this using "more" (although, depending on your terminal, it +still may look awful). + +# pl_syscolors.d +C PID DELTA(us) FILE:LINE TYPE -- NAME +0 305181 2 ":- syscall -> munmap +0 305181 33 ":- syscall <- munmap +0 305181 59 ":- syscall -> mmap +0 305181 18 ":- syscall <- mmap +0 305181 35 ":- syscall -> setcontext +0 305181 8 ":- syscall <- setcontext +0 305181 8 ":- syscall -> getrlimit +0 305181 9 ":- syscall <- getrlimit +0 305181 8 ":- syscall -> getpid +0 305181 7 ":- syscall <- getpid +0 305181 64 ":- syscall -> setcontext +0 305181 6 ":- syscall <- setcontext +0 305181 137 ":- syscall -> sigpending +0 305181 8 ":- syscall <- sigpending +0 305181 1148 ":- syscall -> sysi86 +0 305181 11 ":- syscall <- sysi86 +0 305181 105 ":- syscall -> open64 +0 305181 96 ":- syscall <- open64 +0 305181 13 ":- syscall -> ioctl +0 305181 18 ":- syscall <- ioctl +0 305181 14 ":- syscall -> close +0 305181 14 ":- syscall <- close +0 305181 123 ":- syscall -> sigaction +0 305181 9 ":- syscall <- sigaction +0 305181 49 ":- syscall -> brk +0 305181 9 ":- syscall <- brk +0 305181 8 ":- syscall -> brk +0 305181 16 ":- syscall <- brk +0 305181 63 ":- syscall -> brk +0 305181 7 ":- syscall <- brk +0 305181 7 ":- syscall -> brk +0 305181 8 ":- syscall <- brk +0 305181 43 ":- syscall -> brk +0 305181 7 ":- syscall <- brk +0 305181 7 ":- syscall -> brk +0 305181 8 ":- syscall <- brk +0 305181 141 ":- syscall -> brk +0 305181 7 ":- syscall <- brk +0 305181 8 ":- syscall -> brk +0 305181 9 ":- syscall <- brk +0 305181 24 ":- syscall -> brk +0 305181 7 ":- syscall <- brk +0 305181 7 ":- syscall -> brk +0 305181 8 ":- syscall <- brk +0 305181 30 ":- syscall -> getuid +0 305181 7 ":- syscall <- getuid +0 305181 10 ":- syscall -> getuid +0 305181 6 ":- syscall <- getuid +0 305181 10 ":- syscall -> getgid +0 305181 7 ":- syscall <- getgid +0 305181 9 ":- syscall -> getgid +0 305181 6 ":- syscall <- getgid +0 305181 117 ":- syscall -> sysconfig +0 305181 9 ":- syscall <- sysconfig +0 305181 19 ":- syscall -> open64 +0 305181 59 ":- syscall <- open64 +0 305181 15 ":- syscall -> read +0 305181 11 ":- syscall <- read +0 305181 8 ":- syscall -> close +0 305181 8 ":- syscall <- close +0 305181 34 ":- syscall -> gtime +0 305181 7 ":- syscall <- gtime +0 305181 34 ":- syscall -> brk +0 305181 7 ":- syscall <- brk +0 305181 7 ":- syscall -> brk +0 305181 9 ":- syscall <- brk +0 305181 44 ":- syscall -> sysconfig +0 305181 7 ":- syscall <- sysconfig +0 305181 9 ":- syscall -> brk +0 305181 6 ":- syscall <- brk +0 305181 7 ":- syscall -> brk +0 305181 8 ":- syscall <- brk +0 305181 145 ":- syscall -> open64 +0 305181 16 ":- syscall <- open64 +0 305181 16 ":- syscall -> fcntl +0 305181 7 ":- syscall <- fcntl +0 305181 10 ":- syscall -> sigaction +0 305181 7 ":- syscall <- sigaction +0 305181 8 ":- syscall -> brk +0 305181 7 ":- syscall <- brk +0 305181 7 ":- syscall -> brk +0 305181 9 ":- syscall <- brk +0 305181 104 ":- syscall -> brk +0 305181 7 ":- syscall <- brk +0 305181 7 ":- syscall -> brk +0 305181 8 ":- syscall <- brk +0 305181 88 ":- syscall -> getpid +0 305181 7 ":- syscall <- getpid +0 305181 8 ":- syscall -> brk +0 305181 6 ":- syscall <- brk +0 305181 7 ":- syscall -> brk +0 305181 8 ":- syscall <- brk +0 305181 105 ":- syscall -> fstat64 +0 305181 10 ":- syscall <- fstat64 +0 305181 16 ":- syscall -> fstat64 +0 305181 7 ":- syscall <- fstat64 +0 305181 25 ":- syscall -> ioctl +0 305181 8 ":- syscall <- ioctl +0 305181 7 ":- syscall -> read +0 305181 23 ":- syscall <- read +0 305181 18 ":- syscall -> llseek +0 305181 8 ":- syscall <- llseek +0 305181 126 ":- syscall -> llseek +0 305181 7 ":- syscall <- llseek +0 305181 34 ":- syscall -> llseek +0 305181 7 ":- syscall <- llseek +0 305181 30 ":- syscall -> llseek +0 305181 7 ":- syscall <- llseek +0 305181 12 ":- syscall -> read +0 305181 8 ":- syscall <- read +0 305181 11 ":- syscall -> llseek +0 305181 6 ":- syscall <- llseek +0 305181 7 ":- syscall -> close +0 305181 8 ":- syscall <- close +0 305181 27 func_a:15 sub -> ./func_abc.pl +0 305181 36 ":- syscall -> ioctl +0 305181 7 ":- syscall <- ioctl +0 305181 8 ":- syscall -> fstat64 +0 305181 8 ":- syscall <- fstat64 +0 305181 8 ":- syscall -> brk +0 305181 7 ":- syscall <- brk +0 305181 7 ":- syscall -> brk +0 305181 9 ":- syscall <- brk +0 305181 23 ":- syscall -> fstat64 +0 305181 7 ":- syscall <- fstat64 +0 305181 13 ":- syscall -> gtime +0 305181 7 ":- syscall <- gtime +0 305181 11 ":- syscall -> nanosleep +0 305181 1007250 ":- syscall <- nanosleep +0 305181 24 ":- syscall -> gtime +0 305181 15 ":- syscall <- gtime +0 305181 21 func_b:9 sub -> ./func_abc.pl +0 305181 27 ":- syscall -> gtime +0 305181 6 ":- syscall <- gtime +0 305181 8 ":- syscall -> nanosleep +0 305181 1009847 ":- syscall <- nanosleep +0 305181 24 ":- syscall -> gtime +0 305181 15 ":- syscall <- gtime +0 305181 21 func_c:4 sub -> ./func_abc.pl +0 305181 27 ":- syscall -> gtime +0 305181 6 ":- syscall <- gtime +0 305181 8 ":- syscall -> nanosleep +Function A +Function B +Function C +0 305181 1009916 ":- syscall <- nanosleep +0 305181 24 ":- syscall -> gtime +0 305181 15 ":- syscall <- gtime +0 305181 20 func_c:4 sub <- ./func_abc.pl +0 305181 29 func_b:9 sub <- ./func_abc.pl +0 305181 12 func_a:15 sub <- ./func_abc.pl +0 305181 51 ":- syscall -> schedctl +0 305181 53 ":- syscall <- schedctl +0 305181 16 ":- syscall -> setcontext +0 305181 8 ":- syscall <- setcontext +0 305181 21 ":- syscall -> write +0 305181 97 ":- syscall <- write +0 305181 28 ":- syscall -> open64 +0 305181 101 ":- syscall <- open64 +0 305181 9 ":- syscall -> ioctl +0 305181 10 ":- syscall <- ioctl +0 305181 10 ":- syscall -> close +0 305181 15 ":- syscall <- close +0 305181 35 ":- syscall -> rexit + +If the colors don't suit you (or you'd rather HTML colored output), it +should be trivial to modify the script to do so. + diff --git a/cddl/contrib/dtracetoolkit/Examples/pl_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_who_example.txt new file mode 100644 index 00000000000..4ef361d69d0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pl_who_example.txt @@ -0,0 +1,41 @@ +The following are examples of pl_who.d. + +This is a simple script to see who is executing Perl subroutines. Here it +traces as a few examples programs are executed (from Code/Perl/*.pl). + + # pl_who.d + Tracing... Hit Ctrl-C to end. + ^C + PID UID SUBS FILE + 30817 100 3 ./func_abc.pl + 30818 100 3 ./func_slow.pl + 30819 100 3 ./func_slow.pl + +While tracing, the user with UID 100 executed three Perl programs; +"func_abc.pl" once getting PID 130817, and "func_slow.pl" twice. All +programs called three subroutines. + + + +The following traces a Perl network interface statistics tool, "nicstat" +version 0.99, + + # pl_who.d + Tracing... Hit Ctrl-C to end. + ^C + PID UID SUBS FILE + 14977 100 1 lib/Getopt/Std.pm + 14977 100 1 lib/warnings.pm + 14977 100 2 lib/Exporter.pm + 14977 100 3 /usr/perl5/5.8.4/lib/Sun/Solaris/Kstat.pm + 14977 100 3 lib/warnings/register.pm + 14977 100 4 lib/DynaLoader.pm + 14977 100 5 lib/vars.pm + 14977 100 6 lib/AutoLoader.pm + 14977 100 9 lib/Config.pm + 14977 100 15 lib/strict.pm + 14977 100 23 /tmp/nicstat + +This shows the location of libraries and modules from where subroutines were +called. + diff --git a/cddl/contrib/dtracetoolkit/Examples/priclass_example.txt b/cddl/contrib/dtracetoolkit/Examples/priclass_example.txt new file mode 100644 index 00000000000..bf63e098e62 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/priclass_example.txt @@ -0,0 +1,82 @@ +The following is a demonstration of the priclass.d script. + + +The script was run for several seconds then Ctrl-C was hit. During +this time, other processes in different scheduling classes were +running. + + # ./priclass.d + Sampling... Hit Ctrl-C to end. + ^C + + IA + value ------------- Distribution ------------- count + 40 | 0 + 50 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 30 + 60 | 0 + + SYS + value ------------- Distribution ------------- count + < 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4959 + 0 | 0 + 10 | 0 + 20 | 0 + 30 | 0 + 40 | 0 + 50 | 0 + 60 | 30 + 70 | 0 + 80 | 0 + 90 | 0 + 100 | 0 + 110 | 0 + 120 | 0 + 130 | 0 + 140 | 0 + 150 | 0 + 160 | 50 + >= 170 | 0 + + RT + value ------------- Distribution ------------- count + 90 | 0 + 100 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 110 + 110 | 0 + + TS + value ------------- Distribution ------------- count + < 0 | 0 + 0 |@@@@@@@@@@@@@@@ 2880 + 10 |@@@@@@@ 1280 + 20 |@@@@@ 990 + 30 |@@@@@ 920 + 40 |@@@@ 670 + 50 |@@@@ 730 + 60 | 0 + +The output is quite interesting, and illustrates neatly the behaviour +of different scheduling classes. + +The IA interactive class had 30 samples of a 50 to 59 priority, a fairly +high priority. This class is used for interactive processes, such as +the windowing system. I had clicked on a few windows to create this +activity. + +The SYS system class has had 4959 samples at a < 0 priority - the lowest, +which was for the idle thread. There are a few samples at higher +priorities, including some in the 160 to 169 range (the highest), which +are for interrupt threads. The system class is used by the kernel. + +The RT real time class had 110 samples in the 100 to 109 priority range. +This class is designed for real-time applications, those that must have +a consistant response time regardless of other process activity. For that +reason, the RT class trumps both TS and IA. I created these events by +running "prstat -R" as root, which runs prstat in the real time class. + +The TS time sharing class is the default scheduling class for the processes +on a Solaris system. I ran an infinite shell loop to create heavy activity, +"while :; do :; done", which shows a profile that leans towards lower +priorities. This is deliberate behaivour from the time sharing class, which +reduces the priority of CPU bound processes so that they interefere less +with I/O bound processes. The result is more samples in the lower priority +ranges. diff --git a/cddl/contrib/dtracetoolkit/Examples/pridist_example.txt b/cddl/contrib/dtracetoolkit/Examples/pridist_example.txt new file mode 100644 index 00000000000..1f930ab03ce --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pridist_example.txt @@ -0,0 +1,238 @@ +The following are demonstrations of the pridist.d script. + + +Here we run pridist.d for a few seconds then hit Ctrl-C, + + # pridist.d + Sampling... Hit Ctrl-C to end. + ^C + CMD: setiathome PID: 2190 + + value ------------- Distribution ------------- count + -5 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6629 + 5 | 0 + + CMD: sshd PID: 9172 + + value ------------- Distribution ------------- count + 50 | 0 + 55 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 60 | 0 + + CMD: mozilla-bin PID: 3164 + + value ------------- Distribution ------------- count + 40 | 0 + 45 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 20 + 50 | 0 + + CMD: perl PID: 11544 + + value ------------- Distribution ------------- count + 10 | 0 + 15 |@@@@@@@@ 60 + 20 | 0 + 25 |@@@@@@@@@@@@@@@ 120 + 30 | 0 + 35 |@@@@@@@@@@ 80 + 40 | 0 + 45 |@@@@@ 40 + 50 | 0 + 55 |@@@ 20 + 60 | 0 + +During this sample there was a CPU bound process called "setiathome" +running, and a new CPU bound "perl" process was executed. + +perl, executing an infinite loop, begins with a high priority of 55 to 59 +where it is sampled 20 times. pridist.d samples 1000 times per second, +so this equates to 20 ms. The perl process has also been sampled for 40 ms +at priority 45 to 49, for 80 ms at priority 35 to 39, down to 60 ms at a +priority 15 to 19 - at which point I had hit Ctrl-C to end sampling. + +The output is spectacular as it matches the behaviour of the dispatcher +table for the time sharing class perfectly! + +setiathome is running with the lowest priority, in the 0 to 4 range. + +... ok, so when I say 20 samples equates 20 ms, we know that's only an +estimate. It really means that for 20 samples that process was the one on +the CPU. In between the samples anything may have occured (I/O bound +processes will context switch off the CPU). DTrace can certainly be used +to measure this based on schedular events not samples (eg, cpudist), +however DTrace can then sometimes consume a noticable portion of the CPUs +(for example, 2%). + + + + +The following is a longer sample. Again, I start a new CPU bound perl +process, + + # pridist.d + Sampling... Hit Ctrl-C to end. + ^C + CMD: setiathome PID: 2190 + + value ------------- Distribution ------------- count + -5 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1820 + 5 | 0 + + CMD: mozilla-bin PID: 3164 + + value ------------- Distribution ------------- count + 40 | 0 + 45 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 50 | 0 + + CMD: bash PID: 9185 + + value ------------- Distribution ------------- count + 50 | 0 + 55 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 60 | 0 + + CMD: perl PID: 11547 + + value ------------- Distribution ------------- count + -5 | 0 + 0 |@@@@@@@@@@@@@@@ 2020 + 5 |@@ 200 + 10 |@@@@@@@ 960 + 15 |@ 160 + 20 |@@@@@ 720 + 25 |@ 120 + 30 |@@@@ 480 + 35 |@ 80 + 40 |@@ 240 + 45 | 40 + 50 |@@ 240 + 55 | 10 + 60 | 0 + +Now other behaviour can be observed as the perl process runs. The effect +here is due to ts_maxwait triggering a priority boot to avoid CPU starvation; +the priority is boosted to the 50 to 54 range, then decreases by 10 until +it reaches 0 and another ts_maxwait is triggered. The process spends +more time at lower priorities, as that is exactly how the TS dispatch table +has been configured. + + + + +Now we run prdist.d for a considerable time, + + # pridist.d + Sampling... Hit Ctrl-C to end. + ^C + CMD: setiathome PID: 2190 + + value ------------- Distribution ------------- count + -5 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3060 + 5 | 0 + + CMD: mozilla-bin PID: 3164 + + value ------------- Distribution ------------- count + 40 | 0 + 45 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 20 + 50 | 0 + + CMD: perl PID: 11549 + + value ------------- Distribution ------------- count + -5 | 0 + 0 |@@@@@@@@@@@@@@@@@@@ 7680 + 5 | 0 + 10 |@@@@@@@ 3040 + 15 | 70 + 20 |@@@@@@ 2280 + 25 | 120 + 30 |@@@@ 1580 + 35 | 80 + 40 |@@ 800 + 45 | 40 + 50 |@@ 800 + 55 | 20 + 60 | 0 + +The process has settled to a pattern of 0 priority, ts_maxwait boot to 50, +drop back to 0. + +Run "dispadmin -c TS -g" for a printout of the time sharing dispatcher table. + + + + + +The following shows running pridist.d on a completely idle system, + + # pridist.d + Sampling... Hit Ctrl-C to end. + ^C + CMD: sched PID: 0 + + value ------------- Distribution ------------- count + -10 | 0 + -5 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1190 + 0 | 0 + +Only the kernel "sched" was sampled. It would have been running the idle +thread. + + + + +The following is an unusual output that is worth mentioning, + + # pridist.d + Sampling... Hit Ctrl-C to end. + ^C + CMD: sched PID: 0 + + value ------------- Distribution ------------- count + -10 | 0 + -5 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 940 + 0 | 0 + 5 | 0 + 10 | 0 + 15 | 0 + 20 | 0 + 25 | 0 + 30 | 0 + 35 | 0 + 40 | 0 + 45 | 0 + 50 | 0 + 55 | 0 + 60 | 0 + 65 | 0 + 70 | 0 + 75 | 0 + 80 | 0 + 85 | 0 + 90 | 0 + 95 | 0 + 100 | 0 + 105 | 0 + 110 | 0 + 115 | 0 + 120 | 0 + 125 | 0 + 130 | 0 + 135 | 0 + 140 | 0 + 145 | 0 + 150 | 0 + 155 | 0 + 160 | 0 + 165 | 10 + >= 170 | 0 + +Here we have sampled the kernel running at a priority of 165 to 169. This +is the interrupt priority range, and would be an interrupt servicing thread. +Eg, a network interrupt. + diff --git a/cddl/contrib/dtracetoolkit/Examples/procsystime_example.txt b/cddl/contrib/dtracetoolkit/Examples/procsystime_example.txt new file mode 100644 index 00000000000..89f98bbca7d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/procsystime_example.txt @@ -0,0 +1,149 @@ +This is a demonstration of the procsystime tool, which can give details +on how processes make use of system calls. + +Here we run procsystime on processes which have the name "bash", + + # procsystime -n bash + Tracing... Hit Ctrl-C to end... + ^C + + Elapsed Times for process bash, + + SYSCALL TIME (ns) + setpgrp 27768 + gtime 28692 + lwp_sigmask 148074 + write 235814 + sigaction 553556 + ioctl 776691 + read 857401243 + +By default procsystime prints elapsed times, the time from when the syscall +was issued to it's completion. In the above output, we can see the read() +syscall took the most time for this process - 8.57 seconds for all the +reads combined. This is because the read syscall is waiting for keystrokes. + + + +Here we try the "-o" option to print CPU overhead times on "bash", + + # procsystime -o -n bash + Tracing... Hit Ctrl-C to end... + ^C + + CPU Times for process bash, + + SYSCALL TIME (ns) + setpgrp 6994 + gtime 8054 + lwp_sigmask 33865 + read 154895 + sigaction 259899 + write 343825 + ioctl 932280 + +This identifies which syscall type from bash is consuming the most CPU time. +This is ioctl, at 932 microseconds. Compare this output to the default in +the first example - both are useful for different reasons, this CPU overhead +output helps us see why processes are consuming a lot of sys time. + + + +This demonstrates using the "-a" for all details, this time with "ssh", + + # procsystime -a -n ssh + Tracing... Hit Ctrl-C to end... + ^C + + Elapsed Times for processes ssh, + + SYSCALL TIME (ns) + read 115833 + write 302419 + pollsys 114616076 + TOTAL: 115034328 + + CPU Times for processes ssh, + + SYSCALL TIME (ns) + read 82381 + pollsys 201818 + write 280390 + TOTAL: 564589 + + Syscall Counts for processes ssh, + + SYSCALL COUNT + read 4 + write 4 + pollsys 8 + TOTAL: 16 + +Now we can see elapsed times, overhead times, and syscall counts in one +report. Very handy. We can also see totals printed as "TOTAL:". + + + +procsystime also lets us just examine one PID. For example, + + # procsystime -p 1304 + Tracing... Hit Ctrl-C to end... + ^C + + Elapsed Times for PID 1304, + + SYSCALL TIME (ns) + fcntl 7323 + fstat64 21349 + ioctl 190683 + read 238197 + write 1276169 + pollsys 1005360640 + + + +Here is a longer example of running procsystime on mozilla, + + # procsystime -a -n mozilla-bin + Tracing... Hit Ctrl-C to end... + ^C + + Elapsed Times for processes mozilla-bin, + + SYSCALL TIME (ns) + readv 677958 + writev 1159088 + yield 1298742 + read 18019194 + write 35679619 + ioctl 108845685 + lwp_park 38090969432 + pollsys 65955258781 + TOTAL: 104211908499 + + CPU Times for processes mozilla-bin, + + SYSCALL TIME (ns) + yield 120345 + readv 398046 + writev 1117178 + lwp_park 8591428 + read 9752315 + write 29043460 + ioctl 37089349 + pollsys 189933470 + TOTAL: 276045591 + + Syscall Counts for processes mozilla-bin, + + SYSCALL COUNT + writev 3 + yield 9 + readv 58 + lwp_park 280 + write 1317 + read 1744 + pollsys 8268 + ioctl 16434 + TOTAL: 28113 + diff --git a/cddl/contrib/dtracetoolkit/Examples/putnexts_example.txt b/cddl/contrib/dtracetoolkit/Examples/putnexts_example.txt new file mode 100644 index 00000000000..fd7fc3db40d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/putnexts_example.txt @@ -0,0 +1,520 @@ +The following is an example of the putnexts.d script. + + +When investigating the operation of kernel streams, it can be extreamly +useful to trace who (which stack trace) is calling putnext to who (the +kernel modele). This script does that, + +# putnexts.d +dtrace: script './putnexts.d' matched 1 probe +^C + + bufmod + bufmod`sbrput+0xb9 + unix`putnext+0x1b7 + pts`ptswput+0x1e1 + unix`putnext+0x1b7 + ptem`ptemwput+0x22f + 1 + ip + ip`ip_fanout_proto+0x4d2 + ip`ip_proto_input+0x616 + ip`ip_fanout_proto_again+0x160 + ip`ip_proto_input+0x530 + ip`ip_rput+0x50d + 1 + ip + ip`ip_wput_ipsec_out+0x60a + ip`ipsec_out_process+0x322 + ip`ip_wput_ire+0x18d0 + ip`ip_output+0x70a + ip`ip_wput+0x14 + 1 + ip + ip`ip_wput_ire+0x17d1 + ip`ip_output+0x70a + ip`tcp_send_data+0x68c + ip`tcp_ack_timer+0xb0 + ip`tcp_timer_handler+0x1d + 1 + ip + ip`ip_udp_input+0x4e4 + ip`ip_rput+0x540 + unix`putnext+0x1b7 + gld`gld_recv_tagged+0xed + gld`gld_recv+0x10 + 1 + ldterm + genunix`putnextctl1+0x52 + ldterm`ldterm_dosig+0x7b + ldterm`ldtermrput+0x6fe + unix`putnext+0x1b7 + ptem`ptemrput+0xff + 1 + ldterm + ldterm`ldterm_ioctl_reply+0x93 + ldterm`ldtermrput+0x186 + genunix`qdrain_syncq+0x68 + genunix`drain_syncq+0x1a4 + genunix`putnext_tail+0x88 + 1 + ldterm + ldterm`ldtermrput+0x12a + unix`putnext+0x1b7 + ptem`ptemrput+0xff + genunix`qdrain_syncq+0x68 + genunix`drain_syncq+0x1a4 + 1 + ldterm + ldterm`ldterm_dosig+0x16f + ldterm`ldtermrput+0x6fe + unix`putnext+0x1b7 + ptem`ptemrput+0xff + unix`putnext+0x1b7 + 1 + ldterm + genunix`putnextctl1+0x52 + ldterm`ldterm_dosig+0x124 + ldterm`ldtermrput+0x6fe + unix`putnext+0x1b7 + ptem`ptemrput+0xff + 1 + ldterm + ldterm`ldterm_do_ioctl+0xd8b + ldterm`ldtermwmsg+0x41 + ldterm`ldtermwput+0x8e + unix`putnext+0x1b7 + ttcompat`ttcompat_do_ioctl+0x425 + 1 + ldterm + genunix`putnextctl1+0x52 + ldterm`ldterm_dosig+0xe3 + ldterm`ldtermrput+0x6fe + unix`putnext+0x1b7 + ptem`ptemrput+0xff + 1 + ptem + genunix`qreply+0x23 + ptem`ptemwmsg+0x2b9 + ptem`ptemwput+0xe1 + unix`putnext+0x1b7 + ldterm`ldterm_do_ioctl+0xd8b + 1 + ptem + ptem`ptemwput+0x22f + genunix`qdrain_syncq+0x68 + genunix`drain_syncq+0x1a4 + genunix`putnext_tail+0x88 + unix`putnext+0x38e + 1 + ptem + ptem`ptemrput+0xff + genunix`qdrain_syncq+0x68 + genunix`drain_syncq+0x1a4 + genunix`putnext_tail+0x88 + unix`putnext+0x38e + 1 + ptem + ptem`ptemwmsg+0x44d + ptem`ptemwput+0xe1 + genunix`qdrain_syncq+0x68 + genunix`drain_syncq+0x1a4 + genunix`putnext_tail+0x88 + 1 + ptm + pts`ptswsrv+0x7c + genunix`runservice+0x2a + genunix`queue_service+0x30 + genunix`stream_service+0x69 + genunix`taskq_d_thread+0x8a + 1 + ptm + pts`ptswput+0x1e1 + unix`putnext+0x1b7 + ptem`ptemwput+0x22f + genunix`qdrain_syncq+0x68 + genunix`drain_syncq+0x1a4 + 1 + pts + genunix`qreply+0x23 + pts`ptswput+0x201 + unix`putnext+0x1b7 + ptem`ptemwput+0x22f + genunix`qdrain_syncq+0x68 + 1 + strwhead + genunix`qreply+0x23 + genunix`strrput_nondata+0x22d + genunix`strrput+0x256 + unix`putnext+0x1b7 + ttcompat`ttcompatrput+0x1d + 1 + strwhead + genunix`strdoioctl+0x30d + genunix`strioctl+0x6ae + specfs`spec_ioctl+0x48 + genunix`fop_ioctl+0x1e + genunix`ioctl+0x199 + 1 + tcp + ip`tcp_rput_data+0x2221 + ip`tcp_input+0x39 + ip`squeue_enter+0x1bf + ip`ip_tcp_input+0x9f8 + ip`ip_rput+0x583 + 1 + ttcompat + ttcompat`ttcompat_ioctl_ack+0x398 + ttcompat`ttcompatrput+0x39 + genunix`qdrain_syncq+0x68 + genunix`drain_syncq+0x1a4 + genunix`putnext_tail+0x88 + 1 + ttcompat + ttcompat`ttcompatrput+0x1d + unix`putnext+0x1b7 + ldterm`ldtermrput+0x12a + unix`putnext+0x1b7 + ptem`ptemrput+0xff + 1 + ttcompat + ttcompat`ttcompatrput+0x1d + unix`putnext+0x1b7 + genunix`putnextctl1+0x52 + ldterm`ldterm_dosig+0x124 + ldterm`ldtermrput+0x6fe + 1 + ttcompat + ttcompat`ttcompatwput+0x32 + genunix`qdrain_syncq+0x68 + genunix`drain_syncq+0x1a4 + genunix`putnext_tail+0x88 + unix`putnext+0x38e + 1 + ttcompat + ttcompat`ttcompat_do_ioctl+0x425 + ttcompat`ttcompatwput+0x152 + unix`putnext+0x1b7 + genunix`strdoioctl+0x30d + genunix`strioctl+0x6ae + 1 + ttcompat + ttcompat`ttcompatrput+0x1d + unix`putnext+0x1b7 + genunix`putnextctl1+0x52 + ldterm`ldterm_dosig+0xe3 + ldterm`ldtermrput+0x6fe + 1 + tun + tun`tun_rdata_v4+0x58c + tun`tun_rproc+0x256 + tun`tun_rput+0x23 + unix`putnext+0x1b7 + ip`ip_fanout_proto+0x4d2 + 1 + tun + tun`tun_wputnext_v4+0x1f8 + tun`tun_wproc_mdata+0x71 + tun`tun_wproc+0xdf + tun`tun_wput+0x23 + unix`putnext+0x1b7 + 1 + udp + udp`udp_rput+0x975 + unix`putnext+0x1b7 + ip`ip_udp_input+0x4e4 + ip`ip_rput+0x540 + unix`putnext+0x1b7 + 1 + conskbd + genunix`qreply+0x23 + conskbd`conskbd_mux_upstream_msg+0x24f + conskbd`conskbd_lqs_ack_complete+0x65 + conskbd`conskbdlrput+0x9d + unix`putnext+0x1b7 + 2 + conskbd + conskbd`conskbdlwserv+0x2d + genunix`runservice+0x2a + genunix`queue_service+0x30 + genunix`stream_service+0x69 + genunix`taskq_d_thread+0x8a + 2 + kb8042 + genunix`qreply+0x23 + genunix`miocack+0x2a + kb8042`kb8042_ioctlmsg+0x281 + kb8042`kb8042_wsrv+0xcb + genunix`runservice+0x2a + 2 + strwhead + genunix`strdoioctl+0x30d + genunix`strioctl+0x587 + specfs`spec_ioctl+0x48 + genunix`fop_ioctl+0x1e + genunix`ioctl+0x199 + 2 + consms + consms`consmslrput+0x15a + unix`putnext+0x1b7 + vuid3ps2`vuid3ps2_putnext+0x94 + vuid3ps2`sendButtonEvent+0x58 + vuid3ps2`vuid3ps2+0x8ee + 4 + vuid3ps2 + vuid3ps2`vuid3ps2_putnext+0x94 + vuid3ps2`sendButtonEvent+0x58 + vuid3ps2`vuid3ps2+0x8ee + vuid3ps2`vuidmice_rsrv+0x69 + genunix`runservice+0x2a + 4 + ip + ip`tcp_send_data+0x55d + ip`tcp_ack_timer+0xb0 + ip`tcp_timer_handler+0x1d + ip`squeue_drain+0xbb + ip`squeue_worker+0xeb + 10 + ip + ip`tcp_send_data+0x55d + ip`tcp_rput_data+0x259e + ip`squeue_enter+0x1bf + ip`ip_tcp_input+0xcfb + ip`ip_rput+0x583 + 11 + ip + ip`ip_fanout_udp_conn+0x14b + ip`ip_fanout_udp+0x373 + ip`ip_wput_local+0x16f + ip`ip_wput_ire+0x1436 + ip`ip_output+0x70a + 14 + strwhead + genunix`strput+0x168 + genunix`strputmsg+0x1d5 + genunix`msgio+0x142 + genunix`putmsg+0x6e + unix`sys_sysenter+0xdc + 14 + timod + timod`timodwput+0xea + unix`putnext+0x1b7 + genunix`strput+0x168 + genunix`strputmsg+0x1d5 + genunix`msgio+0x142 + 14 + timod + timod`timodrput+0xa9 + unix`putnext+0x1b7 + udp`udp_rput+0x975 + unix`putnext+0x1b7 + ip`ip_fanout_udp_conn+0x14b + 14 + udp + udp`udp_rput+0x975 + unix`putnext+0x1b7 + ip`ip_fanout_udp_conn+0x14b + ip`ip_fanout_udp+0x373 + ip`ip_wput_local+0x16f + 14 + udp + udp`udp_wput+0x378 + unix`putnext+0x1b7 + timod`timodwput+0xea + unix`putnext+0x1b7 + genunix`strput+0x168 + 14 + bufmod + bufmod`sbsendit+0x5a + bufmod`sbclosechunk+0x2e + bufmod`sbrput+0xee + genunix`qdrain_syncq+0x68 + genunix`drain_syncq+0x1a4 + 21 + conskbd + kbtrans`kbtrans_queueevent+0x5c + kbtrans`kbtrans_keyreleased+0x3d + kbtrans`kbtrans_untrans_keyreleased_raw+0x10 + kbtrans`kbtrans_processkey+0x20 + kbtrans`kbtrans_streams_key+0x95 + 22 + kb8042 + kbtrans`kbtrans_queueevent+0x5c + kbtrans`kbtrans_keyreleased+0x3d + kbtrans`kbtrans_untrans_keyreleased_raw+0x10 + kbtrans`kbtrans_processkey+0x20 + kbtrans`kbtrans_streams_key+0x95 + 22 + ldterm + ldterm`ldterm_msg_upstream+0x2c + ldterm`vmin_satisfied+0x5e + ldterm`ldterm_dononcanon+0x230 + ldterm`ldtermrmsg+0x252 + ldterm`ldtermrput+0x7e9 + 22 + ttcompat + ttcompat`ttcompatrput+0x1d + unix`putnext+0x1b7 + ldterm`ldterm_msg_upstream+0x2c + ldterm`vmin_satisfied+0x5e + ldterm`ldterm_dononcanon+0x230 + 22 + bufmod + bufmod`sbwput+0x33 + unix`putnext+0x1b7 + genunix`strput+0x168 + genunix`strwrite+0x151 + specfs`spec_write+0x4e + 23 + ptem + ptem`ptemrput+0xff + unix`putnext+0x1b7 + ptm`ptmwsrv+0x90 + genunix`runservice+0x2a + genunix`queue_service+0x30 + 23 + pts + ptm`ptmwsrv+0x90 + genunix`runservice+0x2a + genunix`queue_service+0x30 + genunix`stream_runservice+0x96 + genunix`strput+0x171 + 23 + conskbd + kbtrans`kbtrans_queueevent+0x5c + kbtrans`kbtrans_queuepress+0x5f + kbtrans`kbtrans_untrans_keypressed_raw+0x36 + kbtrans`kbtrans_processkey+0x30 + kbtrans`kbtrans_streams_key+0x95 + 24 + kb8042 + kbtrans`kbtrans_queueevent+0x5c + kbtrans`kbtrans_queuepress+0x5f + kbtrans`kbtrans_untrans_keypressed_raw+0x36 + kbtrans`kbtrans_processkey+0x30 + kbtrans`kbtrans_streams_key+0x95 + 24 + ip + ip`tcp_send_data+0x55d + ip`tcp_output+0x562 + ip`squeue_enter+0x1bf + ip`tcp_wput+0x234 + unix`putnext+0x1b7 + 32 + ldterm + ldterm`ldtermwmsg+0x100 + ldterm`ldtermwput+0x8e + unix`putnext+0x1b7 + ttcompat`ttcompatwput+0x32 + unix`putnext+0x1b7 + 36 + ptem + ptem`ptemwmsg+0x44d + ptem`ptemwput+0xe1 + unix`putnext+0x1b7 + ldterm`ldtermwmsg+0x100 + ldterm`ldtermwput+0x8e + 36 + ptm + pts`ptswsrv+0x7c + genunix`runservice+0x2a + genunix`queue_service+0x30 + genunix`stream_runservice+0x96 + genunix`strput+0x171 + 36 + ttcompat + ttcompat`ttcompatwput+0x32 + unix`putnext+0x1b7 + genunix`strput+0x168 + genunix`strwrite+0x151 + specfs`spec_write+0x4e + 36 + tcp + ip`tcp_rput_data+0x2221 + ip`squeue_enter+0x1bf + ip`ip_tcp_input+0xcfb + ip`ip_rput+0x583 + unix`putnext+0x1b7 + 40 + rtls + gld`gld_recv_tagged+0xed + gld`gld_recv+0x10 + rtls`rtls_receive+0x18f + rtls`rtls_gld_intr+0x133 + gld`gld_intr+0x1e + 46 + consms + consms`consmslrput+0x15a + unix`putnext+0x1b7 + vuid3ps2`vuid3ps2_putnext+0x94 + vuid3ps2`vuid3ps2+0x82b + vuid3ps2`vuidmice_rsrv+0x69 + 59 + strwhead + genunix`strput+0x168 + genunix`strwrite+0x151 + specfs`spec_write+0x4e + genunix`fop_write+0x1b + genunix`write+0x29a + 59 + vuid3ps2 + vuid3ps2`vuid3ps2_putnext+0x94 + vuid3ps2`vuid3ps2+0x82b + vuid3ps2`vuidmice_rsrv+0x69 + genunix`runservice+0x2a + genunix`queue_service+0x30 + 59 + consms + consms`consmslrput+0x15a + unix`putnext+0x1b7 + vuid3ps2`vuid3ps2_putnext+0x94 + vuid3ps2`vuid3ps2+0x809 + vuid3ps2`vuidmice_rsrv+0x69 + 77 + vuid3ps2 + vuid3ps2`vuid3ps2_putnext+0x94 + vuid3ps2`vuid3ps2+0x809 + vuid3ps2`vuidmice_rsrv+0x69 + genunix`runservice+0x2a + genunix`queue_service+0x30 + 77 + strwhead + genunix`strput+0x168 + genunix`strwrite+0x151 + sockfs`socktpi_write+0xcb + genunix`fop_write+0x1b + genunix`writev+0x308 + 108 + rtls + gld`gld_passon+0x9e + gld`gld_sendup+0xfc + gld`gld_recv_tagged+0x15f + gld`gld_recv+0x10 + rtls`rtls_receive+0x18f + 124 + strwhead + genunix`strput+0x168 + genunix`strwrite+0x151 + sockfs`socktpi_write+0xcb + genunix`fop_write+0x1b + genunix`write+0x29a + 138 + tl + tl`tl_wput_data_ser+0x5e + genunix`serializer_exec+0x1d + genunix`serializer_enter+0x81 + tl`tl_serializer_enter+0x40 + tl`tl_wput+0x1c7 + 214 + mouse8042 + mouse8042`mouse8042_intr+0x68 + i8042`i8042_intr+0xa6 + unix`intr_thread+0x107 + 261 + +Highlights of the above output include, + +- gld calling putnext to rtls (my laptop network device driver) +- ip receive path calling putnext to tcp +- tcp_send_data() calling putnext to ip + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_calldist_example.txt new file mode 100644 index 00000000000..da44430213a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_calldist_example.txt @@ -0,0 +1,966 @@ +The following are examples of py_calldist.d. + +This script traces the elapsed time of Python functions and prints a report in +the form of a histogram. Here it traces the example program, +Code/Python/func_abc.py + +The results are displayed in two sections, the first, Exclusive function +elapsed times, shows us the time spent in each functions, not including time +spent in subroutines. + +The third section, Inclusive function elapsed times, shows us the time spent +in each function, this time including that time spent in subroutines called +by those functions. + +It is important to pay close attention to the third column, "count" as this +will indicate if there were any instances in a particular timeframe, even if +the number is too small to show up on the histogram clearly. + +# py_calldist.d +Tracing... Hit Ctrl-C to end. +^C + +Exclusive function elapsed times (us), + UserDict.py, func, IterableUserDict + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + __init__.py, func, CodecRegistryError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, Codec + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamConverter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamReader + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamWriter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, getregentry + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, _Helper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, aliasmbcs + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, setencoding + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, sethelper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + types.py, func, _C + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + warnings.py, func, _OptionError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + warnings.py, func, _processoptions + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + UserDict.py, func, __init__ + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, Codec + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamReader + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamReaderWriter + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamRecoder + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamWriter + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + os.py, func, _Environ + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, func, _Printer + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, func, setquit + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + copy_reg.py, func, constructor + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + site.py, func, __init__ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + warnings.py, func, simplefilter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + __init__.py, func, normalize_encoding + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + linecache.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, dirname + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, split + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8 | 0 + + stat.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + stat.py, func, S_IFMT + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 4 | 0 + + UserDict.py, func, UserDict + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + os.py, func, __init__ + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + posixpath.py, func, basename + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + posixpath.py, func, normcase + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@ 6 + 2 |@@@@@@@@@@@@@@@@@@@@@@@ 8 + 4 | 0 + + aliases.py, func, ? + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + copy_reg.py, func, pickle + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 16 |@@@@@@@@@@@@@ 1 + 32 | 0 + + posixpath.py, func, exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + , func, ? + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 4 | 0 + 8 | 0 + 16 |@@@@ 1 + 32 | 0 + + posixpath.py, func, isabs + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21 + 4 |@@ 1 + 8 | 0 + + stat.py, func, S_ISDIR + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 16 |@@@@@@@ 1 + 32 | 0 + + UserDict.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + ascii.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + site.py, func, addsitepackages + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + site.py, func, removeduppaths + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + site.py, func, setcopyright + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + types.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + posixpath.py, func, join + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@ 12 + 4 |@@@@@@@@@@@@ 6 + 8 |@@ 1 + 16 | 0 + 32 |@@ 1 + 64 | 0 + + UserDict.py, func, DictMixin + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + __init__.py, func, search_function + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + codecs.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + copy_reg.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + os.py, func, _get_exports_list + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + site.py, func, _init_pathinfo + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + site.py, func, abs__file__ + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + site.py, func, main + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + warnings.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + posixpath.py, func, normpath + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22 + 16 | 0 + + posixpath.py, func, isdir + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 32 |@@@@@ 1 + 64 |@@@@@ 1 + 128 | 0 + + site.py, func, addpackage + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@ 1 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 256 | 0 + + posixpath.py, func, abspath + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21 + 32 |@@ 1 + 64 | 0 + + site.py, func, makepath + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 + 64 | 0 + + posixpath.py, func, ? + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + site.py, func, ? + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + site.py, func, execsitecustomize + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + site.py, func, addsitedir + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + os.py, func, _exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7 + 32 |@@@@@@@@ 2 + 64 | 0 + 128 | 0 + 256 | 0 + 512 |@@@@ 1 + 1024 | 0 + + __init__.py, func, ? + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + os.py, func, ? + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + func_abc.py, func, ? + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + func_abc.py, func, func_a + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_abc.py, func, func_b + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_abc.py, func, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + +Inclusive function elapsed times (us), + UserDict.py, func, IterableUserDict + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + __init__.py, func, CodecRegistryError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, Codec + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamConverter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamReader + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamWriter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, getregentry + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, _Helper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, aliasmbcs + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, setencoding + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, sethelper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + types.py, func, _C + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + warnings.py, func, _OptionError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + warnings.py, func, _processoptions + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + UserDict.py, func, __init__ + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, Codec + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamReader + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamReaderWriter + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamRecoder + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamWriter + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + os.py, func, _Environ + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, func, _Printer + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, func, setquit + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + copy_reg.py, func, constructor + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + site.py, func, __init__ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + warnings.py, func, simplefilter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + __init__.py, func, normalize_encoding + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + linecache.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, split + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8 | 0 + + stat.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + stat.py, func, S_IFMT + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 4 | 0 + + UserDict.py, func, UserDict + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + os.py, func, __init__ + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + posixpath.py, func, basename + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + posixpath.py, func, dirname + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + posixpath.py, func, normcase + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@ 6 + 2 |@@@@@@@@@@@@@@@@@@@@@@@ 8 + 4 | 0 + + aliases.py, func, ? + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + posixpath.py, func, exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + copy_reg.py, func, pickle + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@ 1 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + posixpath.py, func, isabs + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21 + 4 |@@ 1 + 8 | 0 + + ascii.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + site.py, func, setcopyright + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + stat.py, func, S_ISDIR + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 16 |@@@@@@@@@@@@@ 2 + 32 | 0 + + types.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + posixpath.py, func, join + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@ 12 + 4 |@@@@@@@@@@@@ 6 + 8 |@@ 1 + 16 | 0 + 32 |@@ 1 + 64 | 0 + + UserDict.py, func, DictMixin + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + codecs.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + os.py, func, _get_exports_list + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + posixpath.py, func, normpath + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22 + 16 | 0 + + UserDict.py, func, ? + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + __init__.py, func, search_function + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + copy_reg.py, func, ? + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + site.py, func, abs__file__ + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + site.py, func, removeduppaths + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + warnings.py, func, ? + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + posixpath.py, func, isdir + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@ 1 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 64 |@@@@@@@@@@ 2 + 128 | 0 + + posixpath.py, func, ? + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + site.py, func, _init_pathinfo + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + site.py, func, execsitecustomize + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + posixpath.py, func, abspath + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22 + 64 | 0 + + os.py, func, _exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@ 4 + 32 |@@@@@@@@@@@@@@@@@@@@ 5 + 64 | 0 + 128 | 0 + 256 | 0 + 512 |@@@@ 1 + 1024 | 0 + + site.py, func, makepath + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 + 128 | 0 + + __init__.py, func, ? + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + , func, ? + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 4 | 0 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 |@@@@ 1 + 2048 | 0 + + site.py, func, addpackage + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@ 1 + 256 |@@@@@@@@@@@@@ 1 + 512 | 0 + 1024 |@@@@@@@@@@@@@ 1 + 2048 | 0 + + os.py, func, ? + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + site.py, func, addsitepackages + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + site.py, func, addsitedir + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@ 1 + 2048 |@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + site.py, func, main + value ------------- Distribution ------------- count + 2048 | 0 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8192 | 0 + + site.py, func, ? + value ------------- Distribution ------------- count + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16384 | 0 + + func_abc.py, func, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_abc.py, func, func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_abc.py, func, ? + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + + func_abc.py, func, func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_calltime_example.txt new file mode 100644 index 00000000000..bda8ea89882 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_calltime_example.txt @@ -0,0 +1,255 @@ +The following are examples of py_calltime.d. + +This script traces the elapsed time of Python functions and prints a report. +Here it traces the example program, Code/Python/func_abc.py + +# py_calltime.d +Tracing... Hit Ctrl-C to end. +^C + +Count, + FILE TYPE NAME COUNT + UserDict.py func ? 1 + UserDict.py func DictMixin 1 + UserDict.py func IterableUserDict 1 + UserDict.py func UserDict 1 + UserDict.py func __init__ 1 + __init__.py func ? 1 + __init__.py func CodecRegistryError 1 + __init__.py func normalize_encoding 1 + __init__.py func search_function 1 + aliases.py func ? 1 + ascii.py func ? 1 + ascii.py func Codec 1 + ascii.py func StreamConverter 1 + ascii.py func StreamReader 1 + ascii.py func StreamWriter 1 + ascii.py func getregentry 1 + codecs.py func ? 1 + codecs.py func Codec 1 + codecs.py func StreamReader 1 + codecs.py func StreamReaderWriter 1 + codecs.py func StreamRecoder 1 + codecs.py func StreamWriter 1 + copy_reg.py func ? 1 + func_abc.py func ? 1 + func_abc.py func func_a 1 + func_abc.py func func_b 1 + func_abc.py func func_c 1 + linecache.py func ? 1 + os.py func ? 1 + os.py func _Environ 1 + os.py func __init__ 1 + os.py func _get_exports_list 1 + posixpath.py func ? 1 + posixpath.py func basename 1 + posixpath.py func dirname 1 + site.py func ? 1 + site.py func _Helper 1 + site.py func _Printer 1 + site.py func _init_pathinfo 1 + site.py func abs__file__ 1 + site.py func addsitepackages 1 + site.py func aliasmbcs 1 + site.py func execsitecustomize 1 + site.py func main 1 + site.py func removeduppaths 1 + site.py func setcopyright 1 + site.py func setencoding 1 + site.py func sethelper 1 + site.py func setquit 1 + stat.py func ? 1 + types.py func ? 1 + types.py func _C 1 + warnings.py func ? 1 + warnings.py func _OptionError 1 + warnings.py func _processoptions 1 + posixpath.py func exists 2 + posixpath.py func split 2 + site.py func addsitedir 2 + warnings.py func simplefilter 2 + copy_reg.py func constructor 3 + copy_reg.py func pickle 3 + site.py func __init__ 3 + site.py func addpackage 3 + stat.py func S_IFMT 6 + stat.py func S_ISDIR 6 + posixpath.py func isdir 8 + os.py func _exists 10 + func ? 11 + posixpath.py func normcase 14 + site.py func makepath 14 + posixpath.py func join 20 + posixpath.py func abspath 22 + posixpath.py func isabs 22 + posixpath.py func normpath 22 + - total - 230 + +Exclusive function elapsed times (us), + FILE TYPE NAME TOTAL + ascii.py func StreamWriter 2 + ascii.py func StreamReader 2 + site.py func setencoding 2 + UserDict.py func IterableUserDict 2 + __init__.py func CodecRegistryError 2 + ascii.py func getregentry 2 + site.py func aliasmbcs 2 + warnings.py func _OptionError 3 + types.py func _C 3 + site.py func sethelper 3 + warnings.py func _processoptions 3 + ascii.py func StreamConverter 3 + ascii.py func Codec 3 + site.py func _Helper 3 + site.py func setquit 4 + codecs.py func StreamWriter 4 + UserDict.py func __init__ 4 + site.py func _Printer 4 + codecs.py func Codec 4 + os.py func _Environ 4 + codecs.py func StreamRecoder 5 + codecs.py func StreamReaderWriter 6 + codecs.py func StreamReader 6 + copy_reg.py func constructor 7 + __init__.py func normalize_encoding 9 + site.py func __init__ 10 + warnings.py func simplefilter 11 + linecache.py func ? 11 + posixpath.py func split 13 + stat.py func ? 14 + stat.py func S_IFMT 14 + posixpath.py func dirname 16 + posixpath.py func basename 24 + os.py func __init__ 26 + posixpath.py func normcase 29 + UserDict.py func UserDict 32 + posixpath.py func exists 37 + aliases.py func ? 46 + func ? 56 + copy_reg.py func pickle 59 + UserDict.py func ? 84 + site.py func addsitepackages 85 + posixpath.py func isabs 87 + site.py func setcopyright 94 + stat.py func S_ISDIR 98 + posixpath.py func join 105 + types.py func ? 106 + site.py func removeduppaths 115 + ascii.py func ? 122 + os.py func _get_exports_list 136 + site.py func _init_pathinfo 155 + site.py func abs__file__ 158 + codecs.py func ? 182 + UserDict.py func DictMixin 184 + __init__.py func search_function 205 + site.py func main 218 + posixpath.py func normpath 231 + copy_reg.py func ? 239 + posixpath.py func isdir 285 + site.py func addpackage 419 + site.py func addsitedir 473 + warnings.py func ? 500 + posixpath.py func ? 546 + site.py func execsitecustomize 558 + site.py func makepath 608 + posixpath.py func abspath 646 + os.py func _exists 925 + __init__.py func ? 1289 + os.py func ? 1473 + site.py func ? 1510 + func_abc.py func ? 1517 + func_abc.py func func_c 1000071 + func_abc.py func func_a 1005706 + func_abc.py func func_b 1010158 + - total - 3029815 + +Inclusive function elapsed times (us), + FILE TYPE NAME TOTAL + ascii.py func StreamWriter 2 + ascii.py func StreamReader 2 + site.py func setencoding 2 + UserDict.py func IterableUserDict 2 + __init__.py func CodecRegistryError 2 + ascii.py func getregentry 2 + site.py func aliasmbcs 2 + warnings.py func _OptionError 3 + types.py func _C 3 + site.py func sethelper 3 + warnings.py func _processoptions 3 + ascii.py func StreamConverter 3 + ascii.py func Codec 3 + site.py func _Helper 3 + site.py func setquit 4 + codecs.py func StreamWriter 4 + UserDict.py func __init__ 4 + site.py func _Printer 4 + codecs.py func Codec 4 + os.py func _Environ 4 + codecs.py func StreamRecoder 5 + codecs.py func StreamReaderWriter 6 + codecs.py func StreamReader 6 + copy_reg.py func constructor 7 + __init__.py func normalize_encoding 9 + site.py func __init__ 10 + warnings.py func simplefilter 11 + linecache.py func ? 11 + posixpath.py func split 13 + stat.py func ? 14 + stat.py func S_IFMT 14 + posixpath.py func dirname 22 + posixpath.py func normcase 29 + os.py func __init__ 31 + posixpath.py func basename 31 + UserDict.py func UserDict 32 + posixpath.py func exists 37 + aliases.py func ? 46 + copy_reg.py func pickle 66 + posixpath.py func isabs 87 + posixpath.py func join 105 + types.py func ? 109 + stat.py func S_ISDIR 113 + site.py func setcopyright 132 + ascii.py func ? 133 + os.py func _get_exports_list 136 + UserDict.py func DictMixin 184 + codecs.py func ? 210 + posixpath.py func normpath 231 + UserDict.py func ? 303 + __init__.py func search_function 350 + copy_reg.py func ? 377 + posixpath.py func isdir 399 + warnings.py func ? 530 + site.py func abs__file__ 540 + site.py func execsitecustomize 558 + posixpath.py func ? 560 + site.py func removeduppaths 565 + site.py func _init_pathinfo 899 + os.py func _exists 953 + posixpath.py func abspath 966 + site.py func makepath 1296 + __init__.py func ? 1548 + func ? 1808 + site.py func addsitepackages 2471 + site.py func addpackage 2475 + os.py func ? 3879 + site.py func addsitedir 4026 + site.py func main 4532 + site.py func ? 9930 + func_abc.py func func_c 1000071 + func_abc.py func func_b 2010230 + func_abc.py func func_a 3015936 + func_abc.py func ? 3017454 + +Counts shows us how many times each different function was called, and how +many functions were called in total. + +The exclusive function elapsed times show the time that each function spent +processing code - while not in other functions. + +The inclusive function elapsed times show the time that each function spent +processing code, including the time spent in other calls. + +These elapsed times are the absolute time from when the function began to +when it completed - which includes off-CPU time due to other system events +such as I/O, scheduling, interrupts, etc. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_cpudist_example.txt new file mode 100644 index 00000000000..3272e904387 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_cpudist_example.txt @@ -0,0 +1,966 @@ +The following are examples of py_cpudist.d. + +This script traces the on-CPU time of Python functions and prints a report +in the form of a histogram. Here it traces the example program, +Code/Python/func_slow.py + +# py_cpudist.d +Tracing... Hit Ctrl-C to end. +^C + +Exclusive function on-CPU times (us), + UserDict.py, func, IterableUserDict + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + __init__.py, func, CodecRegistryError + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ascii.py, func, StreamReader + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ascii.py, func, StreamWriter + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ascii.py, func, getregentry + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + site.py, func, aliasmbcs + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + site.py, func, sethelper + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + types.py, func, _C + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + warnings.py, func, _OptionError + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + UserDict.py, func, __init__ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, Codec + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamConverter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + codecs.py, func, Codec + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + codecs.py, func, StreamWriter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + os.py, func, _Environ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + posixpath.py, func, basename + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + posixpath.py, func, dirname + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, _Helper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, _Printer + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, setencoding + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, setquit + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + warnings.py, func, _processoptions + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + copy_reg.py, func, constructor + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 2 | 0 + + codecs.py, func, StreamReader + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamReaderWriter + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamRecoder + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + func_slow.py, func, ? + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + os.py, func, __init__ + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, func, __init__ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + stat.py, func, S_IFMT + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 2 | 0 + + warnings.py, func, simplefilter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + __init__.py, func, normalize_encoding + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + copy_reg.py, func, pickle + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 4 |@@@@@@@@@@@@@ 1 + 8 | 0 + + linecache.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, split + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8 | 0 + + stat.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + stat.py, func, S_ISDIR + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 4 | 0 + + posixpath.py, func, normcase + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 + 2 | 0 + + UserDict.py, func, ? + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + UserDict.py, func, UserDict + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + site.py, func, _init_pathinfo + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + site.py, func, addsitepackages + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + site.py, func, setcopyright + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + , func, ? + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@ 5 + 2 |@@@@@@@@@@@@@@@@@@ 5 + 4 |@@@@ 1 + 8 | 0 + + posixpath.py, func, isabs + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 20 + 2 |@@@@ 2 + 4 | 0 + + aliases.py, func, ? + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + ascii.py, func, ? + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + posixpath.py, func, exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + site.py, func, abs__file__ + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + site.py, func, removeduppaths + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + site.py, func, makepath + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 + 8 | 0 + + posixpath.py, func, join + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@ 12 + 2 |@@@@@@@@@@ 5 + 4 |@@@@ 2 + 8 | 0 + 16 | 0 + 32 |@@ 1 + 64 | 0 + + codecs.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + site.py, func, main + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + types.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + posixpath.py, func, abspath + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22 + 8 | 0 + + UserDict.py, func, DictMixin + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + __init__.py, func, search_function + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + copy_reg.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + os.py, func, _get_exports_list + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + posixpath.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + warnings.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + posixpath.py, func, isdir + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@ 1 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 32 | 0 + 64 |@@@@@ 1 + 128 | 0 + + posixpath.py, func, normpath + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@ 1 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21 + 16 | 0 + + site.py, func, addpackage + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 128 |@@@@@@@@@@@@@ 1 + 256 | 0 + + site.py, func, addsitedir + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 256 | 0 + + site.py, func, ? + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + site.py, func, execsitecustomize + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + os.py, func, _exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 |@@@@ 1 + 1024 | 0 + + __init__.py, func, ? + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + os.py, func, ? + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + func_slow.py, func, func_a + value ------------- Distribution ------------- count + 65536 | 0 + 131072 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 262144 | 0 + + func_slow.py, func, func_b + value ------------- Distribution ------------- count + 131072 | 0 + 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 524288 | 0 + + func_slow.py, func, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + +Inclusive function on-CPU times (us), + UserDict.py, func, IterableUserDict + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + __init__.py, func, CodecRegistryError + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ascii.py, func, StreamReader + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ascii.py, func, StreamWriter + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ascii.py, func, getregentry + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + site.py, func, aliasmbcs + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + site.py, func, sethelper + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + types.py, func, _C + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + warnings.py, func, _OptionError + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + UserDict.py, func, __init__ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, Codec + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamConverter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + codecs.py, func, Codec + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + codecs.py, func, StreamWriter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + os.py, func, _Environ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, _Helper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, _Printer + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, setencoding + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, setquit + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + warnings.py, func, _processoptions + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + copy_reg.py, func, constructor + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 2 | 0 + + codecs.py, func, StreamReader + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamReaderWriter + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamRecoder + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, func, __init__ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + stat.py, func, S_IFMT + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 2 | 0 + + warnings.py, func, simplefilter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + __init__.py, func, normalize_encoding + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + linecache.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + os.py, func, __init__ + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, basename + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, dirname + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, split + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8 | 0 + + stat.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + copy_reg.py, func, pickle + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 8 | 0 + + posixpath.py, func, normcase + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 + 2 | 0 + + UserDict.py, func, UserDict + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + stat.py, func, S_ISDIR + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 4 |@@@@@@@@@@@@@ 2 + 8 | 0 + + posixpath.py, func, isabs + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 20 + 2 |@@@@ 2 + 4 | 0 + + aliases.py, func, ? + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + ascii.py, func, ? + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + posixpath.py, func, exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + site.py, func, setcopyright + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + posixpath.py, func, join + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@ 12 + 2 |@@@@@@@@@@ 5 + 4 |@@@@ 2 + 8 | 0 + 16 | 0 + 32 |@@ 1 + 64 | 0 + + codecs.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + types.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + UserDict.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + UserDict.py, func, DictMixin + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + __init__.py, func, search_function + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + os.py, func, _get_exports_list + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + posixpath.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + site.py, func, abs__file__ + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + site.py, func, removeduppaths + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + warnings.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + posixpath.py, func, normpath + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@ 1 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21 + 16 | 0 + + posixpath.py, func, isdir + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7 + 32 | 0 + 64 |@@@@@ 1 + 128 | 0 + + posixpath.py, func, abspath + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 17 + 16 |@@@@@@@@@ 5 + 32 | 0 + + copy_reg.py, func, ? + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + site.py, func, _init_pathinfo + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + site.py, func, makepath + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 13 + 32 | 0 + 64 |@@@ 1 + 128 | 0 + + site.py, func, execsitecustomize + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + , func, ? + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@ 5 + 2 |@@@@@@@@@@@@@@@@@@ 5 + 4 | 0 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 |@@@@ 1 + 1024 | 0 + + os.py, func, _exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8 + 32 |@@@@ 1 + 64 | 0 + 128 | 0 + 256 | 0 + 512 |@@@@ 1 + 1024 | 0 + + site.py, func, addpackage + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 256 | 0 + 512 |@@@@@@@@@@@@@ 1 + 1024 | 0 + + __init__.py, func, ? + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + site.py, func, addsitepackages + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + site.py, func, addsitedir + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@ 1 + 1024 |@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + os.py, func, ? + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + site.py, func, main + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + site.py, func, ? + value ------------- Distribution ------------- count + 2048 | 0 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8192 | 0 + + func_slow.py, func, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_slow.py, func, ? + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_slow.py, func, func_a + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_slow.py, func, func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + +The first section, Exclusive function on-CPU times, shows us the time spent +on-CPU by various functions, not including time spent in subroutines. You can +see here that func_a had one instance of being on-CPU between 0.13 seconds and +0.25 seconds. + +The second section, Inclusive function on-CPU times, shows us the time spent +on-CPU by various functions, including that time spent in subroutines called +by those functions. You can see that here func_a had an instance of being +on-CPU between 1.0 seconds and 2.1 seconds. + +It is important to pay close attention to the third column, "count" as this +will indicate if there were any instances in a particular timeframe, even if +the number is too small to show up on the histogram clearly. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_cputime_example.txt new file mode 100644 index 00000000000..2f25922adc2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_cputime_example.txt @@ -0,0 +1,262 @@ +The following are examples of py_cputime.d. + +This script traces the on-CPU time of JavaScript functions and prints a +report. Here it traces the example program, Code/Python/func_slow.py + +# py_cputime.d +Tracing... Hit Ctrl-C to end. +^C + +Count, + FILE TYPE NAME COUNT + UserDict.py func ? 1 + UserDict.py func DictMixin 1 + UserDict.py func IterableUserDict 1 + UserDict.py func UserDict 1 + UserDict.py func __init__ 1 + __init__.py func ? 1 + __init__.py func CodecRegistryError 1 + __init__.py func normalize_encoding 1 + __init__.py func search_function 1 + aliases.py func ? 1 + ascii.py func ? 1 + ascii.py func Codec 1 + ascii.py func StreamConverter 1 + ascii.py func StreamReader 1 + ascii.py func StreamWriter 1 + ascii.py func getregentry 1 + codecs.py func ? 1 + codecs.py func Codec 1 + codecs.py func StreamReader 1 + codecs.py func StreamReaderWriter 1 + codecs.py func StreamRecoder 1 + codecs.py func StreamWriter 1 + copy_reg.py func ? 1 + func_slow.py func ? 1 + func_slow.py func func_a 1 + func_slow.py func func_b 1 + func_slow.py func func_c 1 + linecache.py func ? 1 + os.py func ? 1 + os.py func _Environ 1 + os.py func __init__ 1 + os.py func _get_exports_list 1 + posixpath.py func ? 1 + posixpath.py func basename 1 + posixpath.py func dirname 1 + site.py func ? 1 + site.py func _Helper 1 + site.py func _Printer 1 + site.py func _init_pathinfo 1 + site.py func abs__file__ 1 + site.py func addsitepackages 1 + site.py func aliasmbcs 1 + site.py func execsitecustomize 1 + site.py func main 1 + site.py func removeduppaths 1 + site.py func setcopyright 1 + site.py func setencoding 1 + site.py func sethelper 1 + site.py func setquit 1 + stat.py func ? 1 + types.py func ? 1 + types.py func _C 1 + warnings.py func ? 1 + warnings.py func _OptionError 1 + warnings.py func _processoptions 1 + posixpath.py func exists 2 + posixpath.py func split 2 + site.py func addsitedir 2 + warnings.py func simplefilter 2 + copy_reg.py func constructor 3 + copy_reg.py func pickle 3 + site.py func __init__ 3 + site.py func addpackage 3 + stat.py func S_IFMT 6 + stat.py func S_ISDIR 6 + posixpath.py func isdir 8 + os.py func _exists 10 + func ? 11 + posixpath.py func normcase 14 + site.py func makepath 14 + posixpath.py func join 20 + posixpath.py func abspath 22 + posixpath.py func isabs 22 + posixpath.py func normpath 22 + - total - 230 + +Exclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + ascii.py func StreamWriter 1 + __init__.py func CodecRegistryError 1 + ascii.py func StreamReader 1 + site.py func setencoding 1 + warnings.py func _OptionError 1 + UserDict.py func IterableUserDict 1 + site.py func aliasmbcs 1 + warnings.py func _processoptions 1 + types.py func _C 1 + ascii.py func getregentry 1 + site.py func _Helper 2 + ascii.py func Codec 2 + ascii.py func StreamConverter 2 + site.py func sethelper 2 + codecs.py func Codec 2 + UserDict.py func __init__ 3 + posixpath.py func dirname 3 + posixpath.py func basename 3 + site.py func _Printer 3 + os.py func _Environ 3 + codecs.py func StreamWriter 3 + site.py func setquit 3 + copy_reg.py func constructor 3 + codecs.py func StreamRecoder 4 + codecs.py func StreamReaderWriter 5 + codecs.py func StreamReader 5 + os.py func __init__ 6 + func_slow.py func ? 6 + __init__.py func normalize_encoding 7 + site.py func __init__ 7 + linecache.py func ? 7 + warnings.py func simplefilter 7 + stat.py func S_IFMT 9 + stat.py func ? 10 + copy_reg.py func pickle 12 + posixpath.py func split 12 + posixpath.py func normcase 15 + stat.py func S_ISDIR 17 + site.py func addsitepackages 20 + UserDict.py func ? 20 + site.py func setcopyright 23 + site.py func main 24 + func ? 28 + UserDict.py func UserDict 31 + site.py func _init_pathinfo 33 + posixpath.py func exists 35 + ascii.py func ? 38 + posixpath.py func isabs 42 + aliases.py func ? 43 + site.py func removeduppaths 51 + site.py func abs__file__ 56 + codecs.py func ? 75 + types.py func ? 83 + posixpath.py func join 85 + site.py func makepath 97 + posixpath.py func abspath 99 + os.py func _get_exports_list 132 + __init__.py func search_function 142 + warnings.py func ? 171 + UserDict.py func DictMixin 182 + posixpath.py func ? 192 + copy_reg.py func ? 196 + posixpath.py func normpath 209 + posixpath.py func isdir 255 + site.py func addpackage 375 + site.py func addsitedir 506 + site.py func execsitecustomize 540 + site.py func ? 725 + os.py func _exists 802 + os.py func ? 1138 + __init__.py func ? 1199 + func_slow.py func func_a 229669 + func_slow.py func func_b 456371 + func_slow.py func func_c 686056 + - total - 1379951 + +Inclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + ascii.py func StreamWriter 1 + __init__.py func CodecRegistryError 1 + ascii.py func StreamReader 1 + site.py func setencoding 1 + warnings.py func _OptionError 1 + UserDict.py func IterableUserDict 1 + site.py func aliasmbcs 1 + warnings.py func _processoptions 1 + types.py func _C 1 + ascii.py func getregentry 1 + site.py func _Helper 2 + ascii.py func Codec 2 + ascii.py func StreamConverter 2 + site.py func sethelper 2 + codecs.py func Codec 2 + UserDict.py func __init__ 3 + site.py func _Printer 3 + os.py func _Environ 3 + codecs.py func StreamWriter 3 + site.py func setquit 3 + copy_reg.py func constructor 3 + codecs.py func StreamRecoder 4 + codecs.py func StreamReaderWriter 5 + codecs.py func StreamReader 5 + __init__.py func normalize_encoding 7 + site.py func __init__ 7 + linecache.py func ? 7 + warnings.py func simplefilter 7 + stat.py func S_IFMT 9 + os.py func __init__ 9 + posixpath.py func basename 9 + posixpath.py func dirname 10 + stat.py func ? 10 + posixpath.py func split 12 + posixpath.py func normcase 15 + copy_reg.py func pickle 15 + stat.py func S_ISDIR 26 + UserDict.py func UserDict 31 + posixpath.py func exists 35 + posixpath.py func isabs 42 + aliases.py func ? 43 + site.py func setcopyright 44 + ascii.py func ? 45 + types.py func ? 85 + posixpath.py func join 85 + codecs.py func ? 97 + os.py func _get_exports_list 132 + site.py func removeduppaths 171 + UserDict.py func DictMixin 182 + site.py func abs__file__ 184 + warnings.py func ? 190 + __init__.py func search_function 196 + posixpath.py func ? 202 + posixpath.py func normpath 209 + UserDict.py func ? 235 + posixpath.py func isdir 281 + copy_reg.py func ? 288 + posixpath.py func abspath 351 + site.py func _init_pathinfo 392 + site.py func makepath 395 + site.py func execsitecustomize 540 + os.py func _exists 819 + func ? 973 + __init__.py func ? 1341 + site.py func addpackage 1470 + site.py func addsitepackages 1562 + site.py func addsitedir 2420 + site.py func main 2546 + os.py func ? 2839 + site.py func ? 6118 + func_slow.py func func_c 686056 + func_slow.py func func_b 1142427 + func_slow.py func func_a 1372097 + func_slow.py func ? 1372104 + +You can see the results are printed in three sections. + +The first section reports how many times each function was called. + +The exclusive function on-CPU times shows, amongst other results that func_a +spent around 0.22 seconds on-CPU. This times excludes time spent in +other functions. + +The inclusive function on-CPU times show that func_a spent around 1.4 +seconds on-CPU. This includes the time spent in other functions called. + +These on-CPU times are the time the thread spent running on a CPU, from when +the subroutine began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_flow_example.txt new file mode 100644 index 00000000000..d62269e3b03 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_flow_example.txt @@ -0,0 +1,485 @@ +The following are examples of py_flow.d. + +This is a simple script to trace the flow of Python functions. +Here it traces the example program, Code/Python/func_abc.py + +# py_flow.d + C TIME(us) FILE -- FUNC + 0 3064371810154 site.py -> ? + 0 3064371830069 os.py -> ? + 0 3064371840076 posixpath.py -> ? + 0 3064371840298 stat.py -> ? + 0 3064371840319 stat.py <- ? + 0 3064371840345 posixpath.py <- ? + 0 3064371840364 os.py -> _get_exports_list + 0 3064371840510 os.py <- _get_exports_list + 0 3064371849994 UserDict.py -> ? + 0 3064371850011 UserDict.py -> UserDict + 0 3064371850051 UserDict.py <- UserDict + 0 3064371850067 UserDict.py -> IterableUserDict + 0 3064371850075 UserDict.py <- IterableUserDict + 0 3064371850088 UserDict.py -> DictMixin + 0 3064371850291 UserDict.py <- DictMixin + 0 3064371850300 UserDict.py <- ? + 0 3064371850320 os.py -> _Environ + 0 3064371850330 os.py <- _Environ + 0 3064371850342 os.py -> __init__ + 0 3064371850353 UserDict.py -> __init__ + 0 3064371850363 UserDict.py <- __init__ + 0 3064371850372 os.py <- __init__ + 0 3064371850381 os.py -> _exists + 0 3064371851137 -> ? + 0 3064371851146 <- ? + 0 3064371851155 os.py <- _exists + 0 3064371851162 os.py -> _exists + 0 3064371851186 -> ? + 0 3064371851195 <- ? + 0 3064371851213 os.py <- _exists + 0 3064371851220 os.py -> _exists + 0 3064371851242 -> ? + 0 3064371851249 <- ? + 0 3064371851257 os.py <- _exists + 0 3064371851266 os.py -> _exists + 0 3064371851286 -> ? + 0 3064371851293 <- ? + 0 3064371851300 os.py <- _exists + 0 3064371851310 os.py -> _exists + 0 3064371851330 -> ? + 0 3064371851337 <- ? + 0 3064371851344 os.py <- _exists + 0 3064371851354 os.py -> _exists + 0 3064371851374 -> ? + 0 3064371851381 <- ? + 0 3064371851388 os.py <- _exists + 0 3064371851395 os.py -> _exists + 0 3064371851415 -> ? + 0 3064371851423 <- ? + 0 3064371851436 os.py <- _exists + 0 3064371851445 os.py -> _exists + 0 3064371851465 -> ? + 0 3064371851473 <- ? + 0 3064371851485 os.py <- _exists + 0 3064371851493 os.py -> _exists + 0 3064371851514 -> ? + 0 3064371851522 <- ? + 0 3064371851534 os.py <- _exists + 0 3064371851785 copy_reg.py -> ? + 0 3064371851996 types.py -> ? + 0 3064371852063 types.py -> _C + 0 3064371852073 types.py <- _C + 0 3064371852108 types.py <- ? + 0 3064371852129 copy_reg.py -> pickle + 0 3064371852139 copy_reg.py -> constructor + 0 3064371852147 copy_reg.py <- constructor + 0 3064371852155 copy_reg.py <- pickle + 0 3064371852166 copy_reg.py <- ? + 0 3064371852179 copy_reg.py -> pickle + 0 3064371852188 copy_reg.py -> constructor + 0 3064371852196 copy_reg.py <- constructor + 0 3064371852204 copy_reg.py <- pickle + 0 3064371852212 copy_reg.py -> pickle + 0 3064371852221 copy_reg.py -> constructor + 0 3064371852229 copy_reg.py <- constructor + 0 3064371852236 copy_reg.py <- pickle + 0 3064371852244 os.py -> _exists + 0 3064371852269 -> ? + 0 3064371852277 <- ? + 0 3064371852289 os.py <- _exists + 0 3064371852297 os.py <- ? + 0 3064371852330 site.py -> _Printer + 0 3064371852340 site.py <- _Printer + 0 3064371852376 site.py -> _Helper + 0 3064371852384 site.py <- _Helper + 0 3064371852416 site.py -> main + 0 3064371852423 site.py -> abs__file__ + 0 3064371852434 posixpath.py -> abspath + 0 3064371852442 posixpath.py -> isabs + 0 3064371852452 posixpath.py <- isabs + 0 3064371852460 posixpath.py -> normpath + 0 3064371852482 posixpath.py <- normpath + 0 3064371852490 posixpath.py <- abspath + 0 3064371852504 posixpath.py -> abspath + 0 3064371852511 posixpath.py -> isabs + 0 3064371852520 posixpath.py <- isabs + 0 3064371852527 posixpath.py -> normpath + 0 3064371852543 posixpath.py <- normpath + 0 3064371852552 posixpath.py <- abspath + 0 3064371852560 posixpath.py -> abspath + 0 3064371852567 posixpath.py -> isabs + 0 3064371852576 posixpath.py <- isabs + 0 3064371852583 posixpath.py -> normpath + 0 3064371852598 posixpath.py <- normpath + 0 3064371852607 posixpath.py <- abspath + 0 3064371852615 posixpath.py -> abspath + 0 3064371852622 posixpath.py -> isabs + 0 3064371852631 posixpath.py <- isabs + 0 3064371852638 posixpath.py -> normpath + 0 3064371852653 posixpath.py <- normpath + 0 3064371852661 posixpath.py <- abspath + 0 3064371852674 posixpath.py -> abspath + 0 3064371852682 posixpath.py -> isabs + 0 3064371852690 posixpath.py <- isabs + 0 3064371852697 posixpath.py -> normpath + 0 3064371852713 posixpath.py <- normpath + 0 3064371852721 posixpath.py <- abspath + 0 3064371852741 posixpath.py -> abspath + 0 3064371852748 posixpath.py -> isabs + 0 3064371852757 posixpath.py <- isabs + 0 3064371852764 posixpath.py -> normpath + 0 3064371852779 posixpath.py <- normpath + 0 3064371852787 posixpath.py <- abspath + 0 3064371852804 posixpath.py -> abspath + 0 3064371852811 posixpath.py -> isabs + 0 3064371852819 posixpath.py <- isabs + 0 3064371852826 posixpath.py -> normpath + 0 3064371852842 posixpath.py <- normpath + 0 3064371852850 posixpath.py <- abspath + 0 3064371852858 posixpath.py -> abspath + 0 3064371852865 posixpath.py -> isabs + 0 3064371852874 posixpath.py <- isabs + 0 3064371852881 posixpath.py -> normpath + 0 3064371852896 posixpath.py <- normpath + 0 3064371852904 posixpath.py <- abspath + 0 3064371852915 site.py <- abs__file__ + 0 3064371852922 site.py -> removeduppaths + 0 3064371852931 site.py -> makepath + 0 3064371852940 posixpath.py -> join + 0 3064371852948 posixpath.py <- join + 0 3064371852955 posixpath.py -> abspath + 0 3064371852963 posixpath.py -> isabs + 0 3064371852972 posixpath.py <- isabs + 0 3064371852980 posixpath.py -> normpath + 0 3064371852995 posixpath.py <- normpath + 0 3064371853002 posixpath.py <- abspath + 0 3064371853010 posixpath.py -> normcase + 0 3064371853018 posixpath.py <- normcase + 0 3064371853025 site.py <- makepath + 0 3064371853065 site.py -> makepath + 0 3064371853073 posixpath.py -> join + 0 3064371853081 posixpath.py <- join + 0 3064371853088 posixpath.py -> abspath + 0 3064371853096 posixpath.py -> isabs + 0 3064371853104 posixpath.py <- isabs + 0 3064371853111 posixpath.py -> normpath + 0 3064371853126 posixpath.py <- normpath + 0 3064371853134 posixpath.py <- abspath + 0 3064371853142 posixpath.py -> normcase + 0 3064371853150 posixpath.py <- normcase + 0 3064371853157 site.py <- makepath + 0 3064371853165 site.py -> makepath + 0 3064371853173 posixpath.py -> join + 0 3064371853181 posixpath.py <- join + 0 3064371853188 posixpath.py -> abspath + 0 3064371853195 posixpath.py -> isabs + 0 3064371853203 posixpath.py <- isabs + 0 3064371853210 posixpath.py -> normpath + 0 3064371853226 posixpath.py <- normpath + 0 3064371853234 posixpath.py <- abspath + 0 3064371853241 posixpath.py -> normcase + 0 3064371853249 posixpath.py <- normcase + 0 3064371853256 site.py <- makepath + 0 3064371853265 site.py -> makepath + 0 3064371853272 posixpath.py -> join + 0 3064371853280 posixpath.py <- join + 0 3064371853287 posixpath.py -> abspath + 0 3064371853294 posixpath.py -> isabs + 0 3064371853303 posixpath.py <- isabs + 0 3064371853310 posixpath.py -> normpath + 0 3064371853325 posixpath.py <- normpath + 0 3064371853333 posixpath.py <- abspath + 0 3064371853341 posixpath.py -> normcase + 0 3064371853348 posixpath.py <- normcase + 0 3064371853356 site.py <- makepath + 0 3064371853364 site.py -> makepath + 0 3064371853372 posixpath.py -> join + 0 3064371853380 posixpath.py <- join + 0 3064371853387 posixpath.py -> abspath + 0 3064371853394 posixpath.py -> isabs + 0 3064371853402 posixpath.py <- isabs + 0 3064371853409 posixpath.py -> normpath + 0 3064371853425 posixpath.py <- normpath + 0 3064371853433 posixpath.py <- abspath + 0 3064371853440 posixpath.py -> normcase + 0 3064371853448 posixpath.py <- normcase + 0 3064371853455 site.py <- makepath + 0 3064371853466 site.py <- removeduppaths + 0 3064371853476 posixpath.py -> basename + 0 3064371853484 posixpath.py -> split + 0 3064371853498 posixpath.py <- split + 0 3064371853505 posixpath.py <- basename + 0 3064371853513 site.py -> addsitepackages + 0 3064371853524 posixpath.py -> join + 0 3064371853538 posixpath.py <- join + 0 3064371853546 posixpath.py -> join + 0 3064371853557 posixpath.py <- join + 0 3064371853566 posixpath.py -> isdir + 0 3064371853597 stat.py -> S_ISDIR + 0 3064371853604 stat.py -> S_IFMT + 0 3064371853612 stat.py <- S_IFMT + 0 3064371853620 stat.py <- S_ISDIR + 0 3064371853627 posixpath.py <- isdir + 0 3064371853636 site.py -> addsitedir + 0 3064371853643 site.py -> makepath + 0 3064371853651 posixpath.py -> join + 0 3064371853659 posixpath.py <- join + 0 3064371853666 posixpath.py -> abspath + 0 3064371853674 posixpath.py -> isabs + 0 3064371853683 posixpath.py <- isabs + 0 3064371853691 posixpath.py -> normpath + 0 3064371853707 posixpath.py <- normpath + 0 3064371853715 posixpath.py <- abspath + 0 3064371853723 posixpath.py -> normcase + 0 3064371853730 posixpath.py <- normcase + 0 3064371853738 site.py <- makepath + 0 3064371853938 site.py -> addpackage + 0 3064371853948 posixpath.py -> join + 0 3064371853958 posixpath.py <- join + 0 3064371854087 -> ? + 0 3064371854098 site.py -> addsitedir + 0 3064371854106 site.py -> _init_pathinfo + 0 3064371854115 posixpath.py -> isdir + 0 3064371854195 posixpath.py <- isdir + 0 3064371854204 posixpath.py -> isdir + 0 3064371854224 stat.py -> S_ISDIR + 0 3064371854232 stat.py -> S_IFMT + 0 3064371854240 stat.py <- S_IFMT + 0 3064371854247 stat.py <- S_ISDIR + 0 3064371854254 posixpath.py <- isdir + 0 3064371854262 site.py -> makepath + 0 3064371854271 posixpath.py -> join + 0 3064371854279 posixpath.py <- join + 0 3064371854286 posixpath.py -> abspath + 0 3064371854293 posixpath.py -> isabs + 0 3064371854302 posixpath.py <- isabs + 0 3064371854309 posixpath.py -> normpath + 0 3064371854325 posixpath.py <- normpath + 0 3064371854333 posixpath.py <- abspath + 0 3064371854341 posixpath.py -> normcase + 0 3064371854349 posixpath.py <- normcase + 0 3064371854356 site.py <- makepath + 0 3064371854364 posixpath.py -> isdir + 0 3064371854386 stat.py -> S_ISDIR + 0 3064371854393 stat.py -> S_IFMT + 0 3064371854400 stat.py <- S_IFMT + 0 3064371854408 stat.py <- S_ISDIR + 0 3064371854415 posixpath.py <- isdir + 0 3064371854423 site.py -> makepath + 0 3064371854431 posixpath.py -> join + 0 3064371854438 posixpath.py <- join + 0 3064371854446 posixpath.py -> abspath + 0 3064371854453 posixpath.py -> isabs + 0 3064371854461 posixpath.py <- isabs + 0 3064371854469 posixpath.py -> normpath + 0 3064371854485 posixpath.py <- normpath + 0 3064371854493 posixpath.py <- abspath + 0 3064371854500 posixpath.py -> normcase + 0 3064371854508 posixpath.py <- normcase + 0 3064371854516 site.py <- makepath + 0 3064371854524 posixpath.py -> isdir + 0 3064371854556 stat.py -> S_ISDIR + 0 3064371854563 stat.py -> S_IFMT + 0 3064371854571 stat.py <- S_IFMT + 0 3064371854578 stat.py <- S_ISDIR + 0 3064371854585 posixpath.py <- isdir + 0 3064371854593 site.py -> makepath + 0 3064371854601 posixpath.py -> join + 0 3064371854609 posixpath.py <- join + 0 3064371854616 posixpath.py -> abspath + 0 3064371854624 posixpath.py -> isabs + 0 3064371854632 posixpath.py <- isabs + 0 3064371854639 posixpath.py -> normpath + 0 3064371854655 posixpath.py <- normpath + 0 3064371854663 posixpath.py <- abspath + 0 3064371854671 posixpath.py -> normcase + 0 3064371854679 posixpath.py <- normcase + 0 3064371854686 site.py <- makepath + 0 3064371854694 posixpath.py -> isdir + 0 3064371854715 stat.py -> S_ISDIR + 0 3064371854722 stat.py -> S_IFMT + 0 3064371854730 stat.py <- S_IFMT + 0 3064371854737 stat.py <- S_ISDIR + 0 3064371854744 posixpath.py <- isdir + 0 3064371854752 site.py -> makepath + 0 3064371854759 posixpath.py -> join + 0 3064371854767 posixpath.py <- join + 0 3064371854774 posixpath.py -> abspath + 0 3064371854782 posixpath.py -> isabs + 0 3064371854790 posixpath.py <- isabs + 0 3064371854797 posixpath.py -> normpath + 0 3064371854813 posixpath.py <- normpath + 0 3064371854821 posixpath.py <- abspath + 0 3064371854829 posixpath.py -> normcase + 0 3064371854837 posixpath.py <- normcase + 0 3064371854844 site.py <- makepath + 0 3064371854852 posixpath.py -> isdir + 0 3064371854872 stat.py -> S_ISDIR + 0 3064371854879 stat.py -> S_IFMT + 0 3064371854887 stat.py <- S_IFMT + 0 3064371854894 stat.py <- S_ISDIR + 0 3064371854901 posixpath.py <- isdir + 0 3064371854909 site.py -> makepath + 0 3064371854917 posixpath.py -> join + 0 3064371854925 posixpath.py <- join + 0 3064371854932 posixpath.py -> abspath + 0 3064371854939 posixpath.py -> isabs + 0 3064371854947 posixpath.py <- isabs + 0 3064371854954 posixpath.py -> normpath + 0 3064371854970 posixpath.py <- normpath + 0 3064371854978 posixpath.py <- abspath + 0 3064371854986 posixpath.py -> normcase + 0 3064371854994 posixpath.py <- normcase + 0 3064371855001 site.py <- makepath + 0 3064371855009 site.py <- _init_pathinfo + 0 3064371855016 site.py -> makepath + 0 3064371855024 posixpath.py -> join + 0 3064371855032 posixpath.py <- join + 0 3064371855039 posixpath.py -> abspath + 0 3064371855047 posixpath.py -> isabs + 0 3064371855055 posixpath.py <- isabs + 0 3064371855063 posixpath.py -> normpath + 0 3064371855078 posixpath.py <- normpath + 0 3064371855086 posixpath.py <- abspath + 0 3064371855094 posixpath.py -> normcase + 0 3064371855101 posixpath.py <- normcase + 0 3064371855144 site.py <- makepath + 0 3064371855318 site.py -> addpackage + 0 3064371855327 posixpath.py -> join + 0 3064371855337 posixpath.py <- join + 0 3064371855411 site.py -> makepath + 0 3064371855420 posixpath.py -> join + 0 3064371855430 posixpath.py <- join + 0 3064371855437 posixpath.py -> abspath + 0 3064371855445 posixpath.py -> isabs + 0 3064371855453 posixpath.py <- isabs + 0 3064371855460 posixpath.py -> normpath + 0 3064371855477 posixpath.py <- normpath + 0 3064371855485 posixpath.py <- abspath + 0 3064371855493 posixpath.py -> normcase + 0 3064371855501 posixpath.py <- normcase + 0 3064371855509 site.py <- makepath + 0 3064371855517 posixpath.py -> exists + 0 3064371855542 posixpath.py <- exists + 0 3064371855591 site.py <- addpackage + 0 3064371855611 site.py -> addpackage + 0 3064371855618 posixpath.py -> join + 0 3064371855628 posixpath.py <- join + 0 3064371855683 site.py -> makepath + 0 3064371855692 posixpath.py -> join + 0 3064371855739 posixpath.py <- join + 0 3064371855747 posixpath.py -> abspath + 0 3064371855754 posixpath.py -> isabs + 0 3064371855763 posixpath.py <- isabs + 0 3064371855770 posixpath.py -> normpath + 0 3064371855788 posixpath.py <- normpath + 0 3064371855796 posixpath.py <- abspath + 0 3064371855803 posixpath.py -> normcase + 0 3064371855811 posixpath.py <- normcase + 0 3064371855818 site.py <- makepath + 0 3064371855826 posixpath.py -> exists + 0 3064371855851 posixpath.py <- exists + 0 3064371855880 site.py <- addpackage + 0 3064371855892 site.py <- addsitedir + 0 3064371855900 <- ? + 0 3064371855915 site.py <- addpackage + 0 3064371855923 site.py <- addsitedir + 0 3064371855932 posixpath.py -> isdir + 0 3064371855965 posixpath.py <- isdir + 0 3064371855973 site.py <- addsitepackages + 0 3064371855982 site.py -> setquit + 0 3064371855993 site.py <- setquit + 0 3064371856000 site.py -> setcopyright + 0 3064371856009 site.py -> __init__ + 0 3064371856019 site.py <- __init__ + 0 3064371856028 site.py -> __init__ + 0 3064371856037 site.py <- __init__ + 0 3064371856045 posixpath.py -> dirname + 0 3064371856052 posixpath.py -> split + 0 3064371856065 posixpath.py <- split + 0 3064371856073 posixpath.py <- dirname + 0 3064371856085 posixpath.py -> join + 0 3064371856096 posixpath.py <- join + 0 3064371856104 site.py -> __init__ + 0 3064371856113 site.py <- __init__ + 0 3064371856121 site.py <- setcopyright + 0 3064371856128 site.py -> sethelper + 0 3064371856136 site.py <- sethelper + 0 3064371856143 site.py -> aliasmbcs + 0 3064371856151 site.py <- aliasmbcs + 0 3064371856158 site.py -> setencoding + 0 3064371856166 site.py <- setencoding + 0 3064371856173 site.py -> execsitecustomize + 0 3064371871773 site.py <- execsitecustomize + 0 3064371871794 site.py <- main + 0 3064371871805 site.py <- ? + 0 3064371872141 warnings.py -> ? + 0 306437187232e linecache.py -> ? + 0 3064371872336 linecache.py <- ? + 0 3064371872352 warnings.py -> _OptionError + 0 3064371872361 warnings.py <- _OptionError + 0 3064371872378 warnings.py -> _processoptions + 0 3064371872387 warnings.py <- _processoptions + 0 3064371872397 warnings.py -> simplefilter + 0 3064371872410 warnings.py <- simplefilter + 0 3064371872418 warnings.py -> simplefilter + 0 3064371872428 warnings.py <- simplefilter + 0 3064371872436 warnings.py <- ? + 0 3064371886557 __init__.py -> ? + 0 3064371891761 codecs.py -> ? + 0 3064371891836 codecs.py -> Codec + 0 3064371891848 codecs.py <- Codec + 0 3064371891864 codecs.py -> StreamWriter + 0 3064371891874 codecs.py <- StreamWriter + 0 3064371891885 codecs.py -> StreamReader + 0 3064371891897 codecs.py <- StreamReader + 0 3064371891907 codecs.py -> StreamReaderWriter + 0 3064371891918 codecs.py <- StreamReaderWriter + 0 3064371891926 codecs.py -> StreamRecoder + 0 3064371891938 codecs.py <- StreamRecoder + 0 3064371891953 codecs.py <- ? + 0 3064371902521 aliases.py -> ? + 0 3064371902580 aliases.py <- ? + 0 3064371902605 __init__.py -> CodecRegistryError + 0 3064371902614 __init__.py <- CodecRegistryError + 0 3064371902636 __init__.py <- ? + 0 3064371902655 __init__.py -> search_function + 0 3064371902666 __init__.py -> normalize_encoding + 0 3064371902682 __init__.py <- normalize_encoding + 0 3064371902888 ascii.py -> ? + 0 3064371902900 ascii.py -> Codec + 0 3064371902909 ascii.py <- Codec + 0 3064371902922 ascii.py -> StreamWriter + 0 3064371902930 ascii.py <- StreamWriter + 0 3064371902941 ascii.py -> StreamReader + 0 3064371902949 ascii.py <- StreamReader + 0 3064371902972 ascii.py -> StreamConverter + 0 3064371902981 ascii.py <- StreamConverter + 0 3064371902993 ascii.py <- ? + 0 3064371903009 ascii.py -> getregentry + 0 3064371903018 ascii.py <- getregentry + 0 3064371903044 __init__.py <- search_function + 0 3064371903414 func_abc.py -> ? + 0 3064371933251 func_abc.py -> func_a + 0 3064372940696 func_abc.py -> func_b + 0 3064373950608 func_abc.py -> func_c + 0 3064374960497 func_abc.py <- func_c + 0 3064374960512 func_abc.py <- func_b + 0 3064374960520 func_abc.py <- func_a + 0 3064374960528 func_abc.py <- ? +^C + +Here we can see that Python has done extensive pre-processing before it runs +the Code/Python/func_abc.py program itself. + +This shows which function is calling which - the output above ends by +showing that func_a called func_b which in turn called func_c etc. + +The TIME(us) column shows time from boot in microseconds. + +The FILE column shows the file that was being executed. + +If the output looks strange, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_flowinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_flowinfo_example.txt new file mode 100644 index 00000000000..f93dc09b89d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_flowinfo_example.txt @@ -0,0 +1,485 @@ +Following are examples of py_flowinfo.d. + +This is a simple script to trace the flow of Python functions. Here it traces +the flow into and out of libraries and the example program, +Code/Python/func_abc.py. + +# py_flowinfo.d +C PID DELTA(us) FILE:LINE TYPE -- FUNC +0 145424 3 site.py:58 func -> ? +0 145424 1375 os.py:22 func -> ? +0 145424 692 posixpath.py:11 func -> ? +0 145424 184 stat.py:4 func -> ? +0 145424 21 stat.py:86 func <- ? +0 145424 32 posixpath.py:454 func <- ? +0 145424 18 os.py:34 func -> _get_exports_list +0 145424 135 os.py:38 func <- _get_exports_list +0 145424 261 UserDict.py:1 func -> ? +0 145424 11 UserDict.py:3 func -> UserDict +0 145424 36 UserDict.py:71 func <- UserDict +0 145424 16 UserDict.py:73 func -> IterableUserDict +0 145424 9 UserDict.py:74 func <- IterableUserDict +0 145424 13 UserDict.py:77 func -> DictMixin +0 145424 174 UserDict.py:169 func <- DictMixin +0 145424 11 UserDict.py:77 func <- ? +0 145424 17 os.py:458 func -> _Environ +0 145424 11 os.py:489 func <- _Environ +0 145424 13 os.py:459 func -> __init__ +0 145424 11 UserDict.py:4 func -> __init__ +0 145424 11 UserDict.py:9 func <- __init__ +0 145424 10 os.py:461 func <- __init__ +0 145424 11 os.py:501 func -> _exists +0 145424 604 :0 func -> ? +0 145424 10 :0 func <- ? +0 145424 9 os.py:504 func <- _exists +0 145424 9 os.py:501 func -> _exists +0 145424 24 :0 func -> ? +0 145424 9 :0 func <- ? +0 145424 15 os.py:506 func <- _exists +0 145424 9 os.py:501 func -> _exists +0 145424 23 :0 func -> ? +0 145424 8 :0 func <- ? +0 145424 9 os.py:504 func <- _exists +0 145424 26 os.py:501 func -> _exists +0 145424 23 :0 func -> ? +0 145424 8 :0 func <- ? +0 145424 8 os.py:504 func <- _exists +0 145424 11 os.py:501 func -> _exists +0 145424 22 :0 func -> ? +0 145424 8 :0 func <- ? +0 145424 8 os.py:504 func <- _exists +0 145424 11 os.py:501 func -> _exists +0 145424 22 :0 func -> ? +0 145424 8 :0 func <- ? +0 145424 8 os.py:504 func <- _exists +0 145424 9 os.py:501 func -> _exists +0 145424 21 :0 func -> ? +0 145424 9 :0 func <- ? +0 145424 14 os.py:506 func <- _exists +0 145424 10 os.py:501 func -> _exists +0 145424 22 :0 func -> ? +0 145424 9 :0 func <- ? +0 145424 13 os.py:506 func <- _exists +0 145424 11 os.py:501 func -> _exists +0 145424 22 :0 func -> ? +0 145424 8 :0 func <- ? +0 145424 13 os.py:506 func <- _exists +0 145424 181 copy_reg.py:5 func -> ? +0 145424 181 types.py:4 func -> ? +0 145424 64 types.py:55 func -> _C +0 145424 10 types.py:56 func <- _C +0 145424 35 types.py:89 func <- ? +0 145424 22 copy_reg.py:14 func -> pickle +0 145424 11 copy_reg.py:27 func -> constructor +0 145424 9 copy_reg.py:29 func <- constructor +0 145424 9 copy_reg.py:25 func <- pickle +0 145424 12 copy_reg.py:175 func <- ? +0 145424 15 copy_reg.py:14 func -> pickle +0 145424 10 copy_reg.py:27 func -> constructor +0 145424 9 copy_reg.py:29 func <- constructor +0 145424 9 copy_reg.py:25 func <- pickle +0 145424 10 copy_reg.py:14 func -> pickle +0 145424 10 copy_reg.py:27 func -> constructor +0 145424 9 copy_reg.py:29 func <- constructor +0 145424 9 copy_reg.py:25 func <- pickle +0 145424 9 os.py:501 func -> _exists +0 145424 26 :0 func -> ? +0 145424 9 :0 func <- ? +0 145424 14 os.py:506 func <- _exists +0 145424 9 os.py:711 func <- ? +0 145424 33 site.py:238 func -> _Printer +0 145424 11 site.py:279 func <- _Printer +0 145424 38 site.py:317 func -> _Helper +0 145424 9 site.py:326 func <- _Helper +0 145424 34 site.py:376 func -> main +0 145424 8 site.py:69 func -> abs__file__ +0 145424 11 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 11 posixpath.py:49 func <- isabs +0 145424 10 posixpath.py:374 func -> normpath +0 145424 22 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 16 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 15 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 22 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 18 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 12 site.py:75 func <- abs__file__ +0 145424 9 site.py:77 func -> removeduppaths +0 145424 11 site.py:65 func -> makepath +0 145424 10 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 10 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 42 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:39 func -> normcase +0 145424 8 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 8 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 8 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 8 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 12 site.py:93 func <- removeduppaths +0 145424 11 posixpath.py:110 func -> basename +0 145424 10 posixpath.py:74 func -> split +0 145424 14 posixpath.py:81 func <- split +0 145424 9 posixpath.py:112 func <- basename +0 145424 9 site.py:171 func -> addsitepackages +0 145424 13 posixpath.py:56 func -> join +0 145424 15 posixpath.py:66 func <- join +0 145424 10 posixpath.py:56 func -> join +0 145424 12 posixpath.py:66 func <- join +0 145424 11 posixpath.py:192 func -> isdir +0 145424 34 stat.py:45 func -> S_ISDIR +0 145424 9 stat.py:29 func -> S_IFMT +0 145424 9 stat.py:30 func <- S_IFMT +0 145424 9 stat.py:46 func <- S_ISDIR +0 145424 9 posixpath.py:198 func <- isdir +0 145424 11 site.py:148 func -> addsitedir +0 145424 9 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 10 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 222 site.py:117 func -> addpackage +0 145424 12 posixpath.py:56 func -> join +0 145424 12 posixpath.py:66 func <- join +0 145424 132 :1 func -> ? +0 145424 13 site.py:148 func -> addsitedir +0 145424 9 site.py:105 func -> _init_pathinfo +0 145424 11 posixpath.py:192 func -> isdir +0 145424 84 posixpath.py:197 func <- isdir +0 145424 12 posixpath.py:192 func -> isdir +0 145424 23 stat.py:45 func -> S_ISDIR +0 145424 9 stat.py:29 func -> S_IFMT +0 145424 9 stat.py:30 func <- S_IFMT +0 145424 9 stat.py:46 func <- S_ISDIR +0 145424 9 posixpath.py:198 func <- isdir +0 145424 10 site.py:65 func -> makepath +0 145424 10 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 10 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 posixpath.py:192 func -> isdir +0 145424 23 stat.py:45 func -> S_ISDIR +0 145424 8 stat.py:29 func -> S_IFMT +0 145424 8 stat.py:30 func <- S_IFMT +0 145424 9 stat.py:46 func <- S_ISDIR +0 145424 9 posixpath.py:198 func <- isdir +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 posixpath.py:192 func -> isdir +0 145424 24 stat.py:45 func -> S_ISDIR +0 145424 8 stat.py:29 func -> S_IFMT +0 145424 8 stat.py:30 func <- S_IFMT +0 145424 9 stat.py:46 func <- S_ISDIR +0 145424 8 posixpath.py:198 func <- isdir +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 posixpath.py:192 func -> isdir +0 145424 23 stat.py:45 func -> S_ISDIR +0 145424 8 stat.py:29 func -> S_IFMT +0 145424 8 stat.py:30 func <- S_IFMT +0 145424 9 stat.py:46 func <- S_ISDIR +0 145424 9 posixpath.py:198 func <- isdir +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 posixpath.py:192 func -> isdir +0 145424 22 stat.py:45 func -> S_ISDIR +0 145424 8 stat.py:29 func -> S_IFMT +0 145424 8 stat.py:30 func <- S_IFMT +0 145424 9 stat.py:46 func <- S_ISDIR +0 145424 8 posixpath.py:198 func <- isdir +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:39 func -> normcase +0 145424 8 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 site.py:115 func <- _init_pathinfo +0 145424 9 site.py:65 func -> makepath +0 145424 10 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 10 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 170 site.py:117 func -> addpackage +0 145424 11 posixpath.py:56 func -> join +0 145424 12 posixpath.py:66 func <- join +0 145424 73 site.py:65 func -> makepath +0 145424 11 posixpath.py:56 func -> join +0 145424 11 posixpath.py:66 func <- join +0 145424 10 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 19 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 posixpath.py:168 func -> exists +0 145424 41 posixpath.py:174 func <- exists +0 145424 53 site.py:146 func <- addpackage +0 145424 21 site.py:117 func -> addpackage +0 145424 9 posixpath.py:56 func -> join +0 145424 11 posixpath.py:66 func <- join +0 145424 48 site.py:65 func -> makepath +0 145424 10 posixpath.py:56 func -> join +0 145424 47 posixpath.py:66 func <- join +0 145424 10 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 18 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 posixpath.py:168 func -> exists +0 145424 25 posixpath.py:174 func <- exists +0 145424 32 site.py:146 func <- addpackage +0 145424 14 site.py:169 func <- addsitedir +0 145424 10 :1 func <- ? +0 145424 16 site.py:146 func <- addpackage +0 145424 10 site.py:169 func <- addsitedir +0 145424 10 posixpath.py:192 func -> isdir +0 145424 34 posixpath.py:197 func <- isdir +0 145424 10 site.py:204 func <- addsitepackages +0 145424 11 site.py:224 func -> setquit +0 145424 11 site.py:235 func <- setquit +0 145424 9 site.py:299 func -> setcopyright +0 145424 11 site.py:244 func -> __init__ +0 145424 10 site.py:249 func <- __init__ +0 145424 12 site.py:244 func -> __init__ +0 145424 9 site.py:249 func <- __init__ +0 145424 10 posixpath.py:117 func -> dirname +0 145424 9 posixpath.py:74 func -> split +0 145424 14 posixpath.py:81 func <- split +0 145424 9 posixpath.py:119 func <- dirname +0 145424 14 posixpath.py:56 func -> join +0 145424 11 posixpath.py:66 func <- join +0 145424 11 site.py:244 func -> __init__ +0 145424 9 site.py:249 func <- __init__ +0 145424 9 site.py:314 func <- setcopyright +0 145424 9 site.py:330 func -> sethelper +0 145424 9 site.py:331 func <- sethelper +0 145424 9 site.py:333 func -> aliasmbcs +0 145424 9 site.py:346 func <- aliasmbcs +0 145424 9 site.py:348 func -> setencoding +0 145424 9 site.py:365 func <- setencoding +0 145424 9 site.py:368 func -> execsitecustomize +0 145424 706 site.py:373 func <- execsitecustomize +0 145424 16 site.py:395 func <- main +0 145424 12 site.py:406 func <- ? +0 145424 289 warnings.py:1 func -> ? +0 145424 158 linecache.py:6 func -> ? +0 145424 17 linecache.py:66 func <- ? +0 145424 20 warnings.py:179 func -> _OptionError +0 145424 9 warnings.py:180 func <- _OptionError +0 145424 19 warnings.py:184 func -> _processoptions +0 145424 10 warnings.py:189 func <- _processoptions +0 145424 12 warnings.py:160 func -> simplefilter +0 145424 13 warnings.py:173 func <- simplefilter +0 145424 10 warnings.py:160 func -> simplefilter +0 145424 11 warnings.py:173 func <- simplefilter +0 145424 9 warnings.py:259 func <- ? +0 145424 492 __init__.py:28 func -> ? +0 145424 599 codecs.py:8 func -> ? +0 145424 61 codecs.py:76 func -> Codec +0 145424 12 codecs.py:117 func <- Codec +0 145424 18 codecs.py:147 func -> StreamWriter +0 145424 11 codecs.py:200 func <- StreamWriter +0 145424 13 codecs.py:209 func -> StreamReader +0 145424 13 codecs.py:436 func <- StreamReader +0 145424 12 codecs.py:445 func -> StreamReaderWriter +0 145424 13 codecs.py:509 func <- StreamReaderWriter +0 145424 11 codecs.py:518 func -> StreamRecoder +0 145424 12 codecs.py:619 func <- StreamRecoder +0 145424 17 codecs.py:817 func <- ? +0 145424 625 aliases.py:17 func -> ? +0 145424 54 aliases.py:18 func <- ? +0 145424 21 __init__.py:43 func -> CodecRegistryError +0 145424 10 __init__.py:45 func <- CodecRegistryError +0 145424 19 __init__.py:145 func <- ? +0 145424 18 __init__.py:69 func -> search_function +0 145424 12 __init__.py:47 func -> normalize_encoding +0 145424 16 __init__.py:67 func <- normalize_encoding +0 145424 120 ascii.py:8 func -> ? +0 145424 14 ascii.py:13 func -> Codec +0 145424 10 ascii.py:18 func <- Codec +0 145424 15 ascii.py:20 func -> StreamWriter +0 145424 9 ascii.py:21 func <- StreamWriter +0 145424 13 ascii.py:23 func -> StreamReader +0 145424 9 ascii.py:24 func <- StreamReader +0 145424 24 ascii.py:26 func -> StreamConverter +0 145424 10 ascii.py:29 func <- StreamConverter +0 145424 14 ascii.py:33 func <- ? +0 145424 17 ascii.py:33 func -> getregentry +0 145424 10 ascii.py:35 func <- getregentry +0 145424 26 __init__.py:142 func <- search_function +0 145424 367 func_abc.py:3 func -> ? +0 145424 1722 func_abc.py:14 func -> func_a +0 145424 1005677 func_abc.py:9 func -> func_b +0 145424 1000271 func_abc.py:5 func -> func_c +0 145424 1009739 func_abc.py:7 func <- func_c +0 145424 25 func_abc.py:12 func <- func_b +0 145424 9 func_abc.py:17 func <- func_a +0 145424 9 func_abc.py:19 func <- ? +^C + +As each function is entered, the last column is indented by 2 spaces. This +shows which function is calling which. + +The DELTA(us) column shows the change in time from the previous line to the +current line. + +The FILE::LINE column shows which line in which file was being executed. Refer +to the source program to see what this line refers to. + +If the output looks shuffled, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_flowtime_example.txt new file mode 100644 index 00000000000..5ac494bba64 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_flowtime_example.txt @@ -0,0 +1,487 @@ +The following are examples of py_flowtime.d. + +This is a simple script to trace the flow of Python functions. Here it traces +the example program, Code/Python/func_abc.py + +# py_flowtime.d + C TIME(us) FILE DELTA(us) -- FUNC + 0 3064660319556 site.py 3 -> ? + 0 3064660320224 os.py 667 -> ? + 0 3064660321335 posixpath.py 1111 -> ? + 0 3064660321526 stat.py 190 -> ? + 0 3064660321546 stat.py 20 <- ? + 0 3064660321576 posixpath.py 29 <- ? + 0 3064660321593 os.py 17 -> _get_exports_list + 0 3064660321728 os.py 134 <- _get_exports_list + 0 3064660321989 UserDict.py 260 -> ? + 0 3064660322000 UserDict.py 10 -> UserDict + 0 3064660322035 UserDict.py 34 <- UserDict + 0 3064660322050 UserDict.py 15 -> IterableUserDict + 0 3064660322058 UserDict.py 8 <- IterableUserDict + 0 3064660322071 UserDict.py 12 -> DictMixin + 0 3064660322247 UserDict.py 176 <- DictMixin + 0 3064660322258 UserDict.py 10 <- ? + 0 3064660322275 os.py 16 -> _Environ + 0 3064660322285 os.py 10 <- _Environ + 0 3064660322298 os.py 13 -> __init__ + 0 3064660322308 UserDict.py 10 -> __init__ + 0 3064660322319 UserDict.py 10 <- __init__ + 0 3064660322328 os.py 9 <- __init__ + 0 3064660322338 os.py 10 -> _exists + 0 3064660322946 607 -> ? + 0 3064660322955 8 <- ? + 0 3064660322963 os.py 8 <- _exists + 0 3064660322972 os.py 8 -> _exists + 0 3064660322996 23 -> ? + 0 3064660323005 8 <- ? + 0 3064660323020 os.py 14 <- _exists + 0 3064660323029 os.py 8 -> _exists + 0 3064660323051 22 -> ? + 0 3064660323059 7 <- ? + 0 3064660323067 os.py 8 <- _exists + 0 3064660323077 os.py 10 -> _exists + 0 3064660323098 21 -> ? + 0 3064660323106 7 <- ? + 0 3064660323114 os.py 8 <- _exists + 0 3064660323125 os.py 10 -> _exists + 0 3064660323146 21 -> ? + 0 3064660323154 7 <- ? + 0 3064660323162 os.py 8 <- _exists + 0 3064660323173 os.py 10 -> _exists + 0 3064660323194 21 -> ? + 0 3064660323202 7 <- ? + 0 3064660323210 os.py 8 <- _exists + 0 3064660323218 os.py 8 -> _exists + 0 3064660323239 21 -> ? + 0 3064660323247 8 <- ? + 0 3064660323261 os.py 13 <- _exists + 0 3064660323271 os.py 10 -> _exists + 0 3064660323293 21 -> ? + 0 3064660323301 8 <- ? + 0 3064660323314 os.py 12 <- _exists + 0 3064660323324 os.py 10 -> _exists + 0 3064660323345 21 -> ? + 0 3064660323354 8 <- ? + 0 3064660323366 os.py 12 <- _exists + 0 3064660323545 copy_reg.py 178 -> ? + 0 3064660323726 types.py 180 -> ? + 0 3064660323790 types.py 64 -> _C + 0 3064660323800 types.py 9 <- _C + 0 3064660323834 types.py 33 <- ? + 0 3064660323855 copy_reg.py 21 -> pickle + 0 3064660323866 copy_reg.py 10 -> constructor + 0 3064660323874 copy_reg.py 8 <- constructor + 0 3064660323883 copy_reg.py 8 <- pickle + 0 3064660323895 copy_reg.py 11 <- ? + 0 3064660323909 copy_reg.py 14 -> pickle + 0 3064660323919 copy_reg.py 9 -> constructor + 0 3064660323927 copy_reg.py 8 <- constructor + 0 3064660323936 copy_reg.py 8 <- pickle + 0 3064660323946 copy_reg.py 9 -> pickle + 0 3064660323955 copy_reg.py 9 -> constructor + 0 3064660323963 copy_reg.py 8 <- constructor + 0 3064660323972 copy_reg.py 8 <- pickle + 0 3064660323981 os.py 9 -> _exists + 0 3064660324006 25 -> ? + 0 3064660324015 8 <- ? + 0 3064660324028 os.py 13 <- _exists + 0 3064660324037 os.py 8 <- ? + 0 3064660324069 site.py 31 -> _Printer + 0 3064660324080 site.py 10 <- _Printer + 0 3064660324118 site.py 38 -> _Helper + 0 3064660324127 site.py 9 <- _Helper + 0 3064660324160 site.py 33 -> main + 0 3064660324168 site.py 8 -> abs__file__ + 0 3064660324179 posixpath.py 10 -> abspath + 0 3064660324187 posixpath.py 8 -> isabs + 0 3064660324197 posixpath.py 9 <- isabs + 0 3064660324207 posixpath.py 9 -> normpath + 0 3064660324228 posixpath.py 21 <- normpath + 0 3064660324238 posixpath.py 9 <- abspath + 0 3064660324253 posixpath.py 15 -> abspath + 0 3064660324261 posixpath.py 8 -> isabs + 0 3064660324270 posixpath.py 8 <- isabs + 0 3064660324278 posixpath.py 8 -> normpath + 0 3064660324295 posixpath.py 16 <- normpath + 0 3064660324304 posixpath.py 9 <- abspath + 0 3064660324314 posixpath.py 9 -> abspath + 0 3064660324322 posixpath.py 8 -> isabs + 0 3064660324331 posixpath.py 8 <- isabs + 0 3064660324339 posixpath.py 8 -> normpath + 0 3064660324355 posixpath.py 15 <- normpath + 0 3064660324364 posixpath.py 8 <- abspath + 0 3064660324374 posixpath.py 9 -> abspath + 0 3064660324382 posixpath.py 8 -> isabs + 0 3064660324391 posixpath.py 8 <- isabs + 0 3064660324399 posixpath.py 8 -> normpath + 0 3064660324415 posixpath.py 15 <- normpath + 0 3064660324424 posixpath.py 8 <- abspath + 0 3064660324439 posixpath.py 14 -> abspath + 0 3064660324447 posixpath.py 8 -> isabs + 0 3064660324456 posixpath.py 8 <- isabs + 0 3064660324464 posixpath.py 8 -> normpath + 0 3064660324480 posixpath.py 15 <- normpath + 0 3064660324489 posixpath.py 8 <- abspath + 0 3064660324511 posixpath.py 21 -> abspath + 0 3064660324519 posixpath.py 8 -> isabs + 0 3064660324528 posixpath.py 8 <- isabs + 0 3064660324536 posixpath.py 8 -> normpath + 0 3064660324552 posixpath.py 15 <- normpath + 0 3064660324561 posixpath.py 9 <- abspath + 0 3064660324579 posixpath.py 17 -> abspath + 0 3064660324588 posixpath.py 8 -> isabs + 0 3064660324596 posixpath.py 8 <- isabs + 0 3064660324605 posixpath.py 8 -> normpath + 0 3064660324621 posixpath.py 15 <- normpath + 0 3064660324630 posixpath.py 8 <- abspath + 0 3064660324639 posixpath.py 9 -> abspath + 0 3064660324648 posixpath.py 8 -> isabs + 0 3064660324656 posixpath.py 8 <- isabs + 0 3064660324665 posixpath.py 8 -> normpath + 0 3064660324681 posixpath.py 15 <- normpath + 0 3064660324690 posixpath.py 9 <- abspath + 0 3064660324701 site.py 11 <- abs__file__ + 0 3064660324709 site.py 8 -> removeduppaths + 0 3064660324719 site.py 10 -> makepath + 0 3064660324729 posixpath.py 9 -> join + 0 3064660324738 posixpath.py 8 <- join + 0 3064660324746 posixpath.py 8 -> abspath + 0 3064660324755 posixpath.py 8 -> isabs + 0 3064660324764 posixpath.py 8 <- isabs + 0 3064660324773 posixpath.py 9 -> normpath + 0 3064660324789 posixpath.py 15 <- normpath + 0 3064660324797 posixpath.py 8 <- abspath + 0 3064660324806 posixpath.py 8 -> normcase + 0 3064660324814 posixpath.py 8 <- normcase + 0 3064660324823 site.py 8 <- makepath + 0 3064660324864 site.py 40 -> makepath + 0 3064660324873 posixpath.py 8 -> join + 0 3064660324881 posixpath.py 8 <- join + 0 3064660324889 posixpath.py 8 -> abspath + 0 3064660324898 posixpath.py 8 -> isabs + 0 3064660324906 posixpath.py 8 <- isabs + 0 3064660324915 posixpath.py 8 -> normpath + 0 3064660324931 posixpath.py 15 <- normpath + 0 3064660324939 posixpath.py 8 <- abspath + 0 3064660324948 posixpath.py 8 -> normcase + 0 3064660324957 posixpath.py 8 <- normcase + 0 3064660324965 site.py 8 <- makepath + 0 3064660324974 site.py 9 -> makepath + 0 3064660324983 posixpath.py 8 -> join + 0 3064660324991 posixpath.py 8 <- join + 0 3064660325000 posixpath.py 8 -> abspath + 0 3064660325008 posixpath.py 8 -> isabs + 0 3064660325017 posixpath.py 8 <- isabs + 0 3064660325025 posixpath.py 8 -> normpath + 0 3064660325041 posixpath.py 15 <- normpath + 0 3064660325050 posixpath.py 8 <- abspath + 0 3064660325059 posixpath.py 8 -> normcase + 0 3064660325067 posixpath.py 8 <- normcase + 0 3064660325075 site.py 8 <- makepath + 0 3064660325084 site.py 9 -> makepath + 0 3064660325093 posixpath.py 8 -> join + 0 3064660325102 posixpath.py 8 <- join + 0 3064660325110 posixpath.py 8 -> abspath + 0 3064660325118 posixpath.py 8 -> isabs + 0 3064660325127 posixpath.py 8 <- isabs + 0 3064660325135 posixpath.py 8 -> normpath + 0 3064660325151 posixpath.py 15 <- normpath + 0 3064660325160 posixpath.py 8 <- abspath + 0 3064660325169 posixpath.py 8 -> normcase + 0 3064660325177 posixpath.py 7 <- normcase + 0 3064660325185 site.py 8 <- makepath + 0 3064660325194 site.py 9 -> makepath + 0 3064660325203 posixpath.py 8 -> join + 0 3064660325212 posixpath.py 8 <- join + 0 3064660325220 posixpath.py 8 -> abspath + 0 3064660325228 posixpath.py 8 -> isabs + 0 3064660325237 posixpath.py 8 <- isabs + 0 3064660325245 posixpath.py 8 -> normpath + 0 3064660325261 posixpath.py 15 <- normpath + 0 3064660325270 posixpath.py 8 <- abspath + 0 3064660325279 posixpath.py 8 -> normcase + 0 3064660325287 posixpath.py 8 <- normcase + 0 3064660325295 site.py 8 <- makepath + 0 3064660325307 site.py 11 <- removeduppaths + 0 3064660325317 posixpath.py 10 -> basename + 0 3064660325327 posixpath.py 9 -> split + 0 3064660325340 posixpath.py 13 <- split + 0 3064660325349 posixpath.py 8 <- basename + 0 3064660325358 site.py 8 -> addsitepackages + 0 3064660325370 posixpath.py 12 -> join + 0 3064660325385 posixpath.py 14 <- join + 0 3064660325394 posixpath.py 9 -> join + 0 3064660325406 posixpath.py 11 <- join + 0 3064660325416 posixpath.py 10 -> isdir + 0 3064660325447 stat.py 31 -> S_ISDIR + 0 3064660325456 stat.py 8 -> S_IFMT + 0 3064660325464 stat.py 8 <- S_IFMT + 0 3064660325473 stat.py 8 <- S_ISDIR + 0 3064660325481 posixpath.py 7 <- isdir + 0 3064660325491 site.py 10 -> addsitedir + 0 3064660325500 site.py 8 -> makepath + 0 3064660325508 posixpath.py 8 -> join + 0 3064660325517 posixpath.py 8 <- join + 0 3064660325525 posixpath.py 8 -> abspath + 0 3064660325534 posixpath.py 8 -> isabs + 0 3064660325543 posixpath.py 8 <- isabs + 0 3064660325552 posixpath.py 9 -> normpath + 0 3064660325569 posixpath.py 16 <- normpath + 0 3064660325578 posixpath.py 8 <- abspath + 0 3064660325587 posixpath.py 8 -> normcase + 0 3064660325595 posixpath.py 8 <- normcase + 0 3064660325604 site.py 8 <- makepath + 0 3064660325823 site.py 219 -> addpackage + 0 3064660325834 posixpath.py 10 -> join + 0 3064660325844 posixpath.py 10 <- join + 0 3064660325972 127 -> ? + 0 3064660325985 site.py 13 -> addsitedir + 0 3064660325994 site.py 8 -> _init_pathinfo + 0 3064660326004 posixpath.py 10 -> isdir + 0 3064660326086 posixpath.py 81 <- isdir + 0 3064660326097 posixpath.py 10 -> isdir + 0 3064660326118 stat.py 21 -> S_ISDIR + 0 3064660326127 stat.py 9 -> S_IFMT + 0 3064660326136 stat.py 8 <- S_IFMT + 0 3064660326144 stat.py 8 <- S_ISDIR + 0 3064660326152 posixpath.py 7 <- isdir + 0 3064660326161 site.py 9 -> makepath + 0 3064660326171 posixpath.py 9 -> join + 0 3064660326179 posixpath.py 8 <- join + 0 3064660326188 posixpath.py 8 -> abspath + 0 3064660326196 posixpath.py 8 -> isabs + 0 3064660326205 posixpath.py 9 <- isabs + 0 3064660326215 posixpath.py 9 -> normpath + 0 3064660326231 posixpath.py 16 <- normpath + 0 3064660326240 posixpath.py 8 <- abspath + 0 3064660326249 posixpath.py 9 -> normcase + 0 3064660326258 posixpath.py 8 <- normcase + 0 3064660326266 site.py 8 <- makepath + 0 3064660326276 posixpath.py 9 -> isdir + 0 3064660326298 stat.py 22 -> S_ISDIR + 0 3064660326306 stat.py 8 -> S_IFMT + 0 3064660326314 stat.py 7 <- S_IFMT + 0 3064660326322 stat.py 8 <- S_ISDIR + 0 3064660326330 posixpath.py 8 <- isdir + 0 3064660326340 site.py 9 -> makepath + 0 3064660326349 posixpath.py 8 -> join + 0 3064660326357 posixpath.py 8 <- join + 0 3064660326382 posixpath.py 24 -> abspath + 0 3064660326390 posixpath.py 8 -> isabs + 0 3064660326399 posixpath.py 8 <- isabs + 0 3064660326408 posixpath.py 8 -> normpath + 0 3064660326425 posixpath.py 16 <- normpath + 0 3064660326434 posixpath.py 9 <- abspath + 0 3064660326443 posixpath.py 9 -> normcase + 0 3064660326451 posixpath.py 8 <- normcase + 0 3064660326460 site.py 8 <- makepath + 0 3064660326469 posixpath.py 9 -> isdir + 0 3064660326493 stat.py 23 -> S_ISDIR + 0 3064660326501 stat.py 8 -> S_IFMT + 0 3064660326509 stat.py 7 <- S_IFMT + 0 3064660326517 stat.py 8 <- S_ISDIR + 0 3064660326525 posixpath.py 7 <- isdir + 0 3064660326534 site.py 9 -> makepath + 0 3064660326542 posixpath.py 8 -> join + 0 3064660326551 posixpath.py 8 <- join + 0 3064660326559 posixpath.py 8 -> abspath + 0 3064660326568 posixpath.py 8 -> isabs + 0 3064660326576 posixpath.py 8 <- isabs + 0 3064660326585 posixpath.py 8 -> normpath + 0 3064660326602 posixpath.py 16 <- normpath + 0 3064660326610 posixpath.py 8 <- abspath + 0 3064660326619 posixpath.py 8 -> normcase + 0 3064660326628 posixpath.py 8 <- normcase + 0 3064660326636 site.py 8 <- makepath + 0 3064660326646 posixpath.py 9 -> isdir + 0 3064660326668 stat.py 22 -> S_ISDIR + 0 3064660326676 stat.py 8 -> S_IFMT + 0 3064660326684 stat.py 7 <- S_IFMT + 0 3064660326692 stat.py 8 <- S_ISDIR + 0 3064660326700 posixpath.py 8 <- isdir + 0 3064660326709 site.py 9 -> makepath + 0 3064660326718 posixpath.py 8 -> join + 0 3064660326726 posixpath.py 8 <- join + 0 3064660326735 posixpath.py 8 -> abspath + 0 3064660326743 posixpath.py 8 -> isabs + 0 3064660326752 posixpath.py 8 <- isabs + 0 3064660326760 posixpath.py 8 -> normpath + 0 3064660326777 posixpath.py 16 <- normpath + 0 3064660326786 posixpath.py 9 <- abspath + 0 3064660326795 posixpath.py 9 -> normcase + 0 3064660326803 posixpath.py 8 <- normcase + 0 3064660326811 site.py 8 <- makepath + 0 3064660326821 posixpath.py 9 -> isdir + 0 3064660326842 stat.py 21 -> S_ISDIR + 0 3064660326850 stat.py 8 -> S_IFMT + 0 3064660326858 stat.py 7 <- S_IFMT + 0 3064660326866 stat.py 8 <- S_ISDIR + 0 3064660326874 posixpath.py 7 <- isdir + 0 3064660326883 site.py 9 -> makepath + 0 3064660326892 posixpath.py 8 -> join + 0 3064660326901 posixpath.py 8 <- join + 0 3064660326909 posixpath.py 8 -> abspath + 0 3064660326917 posixpath.py 8 -> isabs + 0 3064660326926 posixpath.py 8 <- isabs + 0 3064660326935 posixpath.py 8 -> normpath + 0 3064660326951 posixpath.py 16 <- normpath + 0 3064660326960 posixpath.py 8 <- abspath + 0 3064660326970 posixpath.py 9 -> normcase + 0 3064660326978 posixpath.py 8 <- normcase + 0 3064660326986 site.py 8 <- makepath + 0 3064660326995 site.py 8 <- _init_pathinfo + 0 3064660327004 site.py 8 -> makepath + 0 3064660327013 posixpath.py 9 -> join + 0 3064660327021 posixpath.py 8 <- join + 0 3064660327030 posixpath.py 8 -> abspath + 0 3064660327038 posixpath.py 8 -> isabs + 0 3064660327047 posixpath.py 8 <- isabs + 0 3064660327056 posixpath.py 8 -> normpath + 0 3064660327072 posixpath.py 15 <- normpath + 0 3064660327081 posixpath.py 9 <- abspath + 0 3064660327090 posixpath.py 8 -> normcase + 0 3064660327098 posixpath.py 8 <- normcase + 0 3064660327106 site.py 8 <- makepath + 0 3064660327278 site.py 171 -> addpackage + 0 3064660327289 posixpath.py 10 -> join + 0 3064660327300 posixpath.py 10 <- join + 0 3064660327372 site.py 72 -> makepath + 0 3064660327382 posixpath.py 10 -> join + 0 3064660327393 posixpath.py 10 <- join + 0 3064660327402 posixpath.py 9 -> abspath + 0 3064660327410 posixpath.py 8 -> isabs + 0 3064660327419 posixpath.py 8 <- isabs + 0 3064660327427 posixpath.py 8 -> normpath + 0 3064660327445 posixpath.py 17 <- normpath + 0 3064660327454 posixpath.py 9 <- abspath + 0 3064660327463 posixpath.py 9 -> normcase + 0 3064660327472 posixpath.py 8 <- normcase + 0 3064660327480 site.py 8 <- makepath + 0 3064660327489 posixpath.py 9 -> exists + 0 3064660327515 posixpath.py 26 <- exists + 0 3064660327567 site.py 51 <- addpackage + 0 3064660327588 site.py 20 -> addpackage + 0 3064660327597 posixpath.py 8 -> join + 0 3064660327607 posixpath.py 10 <- join + 0 3064660327654 site.py 46 -> makepath + 0 3064660327663 posixpath.py 9 -> join + 0 3064660327710 posixpath.py 46 <- join + 0 3064660327720 posixpath.py 9 -> abspath + 0 3064660327728 posixpath.py 8 -> isabs + 0 3064660327737 posixpath.py 9 <- isabs + 0 3064660327746 posixpath.py 8 -> normpath + 0 3064660327764 posixpath.py 17 <- normpath + 0 3064660327773 posixpath.py 9 <- abspath + 0 3064660327782 posixpath.py 9 -> normcase + 0 3064660327791 posixpath.py 8 <- normcase + 0 3064660327799 site.py 8 <- makepath + 0 3064660327808 posixpath.py 9 -> exists + 0 3064660327833 posixpath.py 24 <- exists + 0 3064660327864 site.py 31 <- addpackage + 0 3064660327878 site.py 13 <- addsitedir + 0 3064660327887 9 <- ? + 0 3064660327903 site.py 15 <- addpackage + 0 3064660327913 site.py 9 <- addsitedir + 0 3064660327923 posixpath.py 10 -> isdir + 0 3064660327955 posixpath.py 32 <- isdir + 0 3064660327965 site.py 9 <- addsitepackages + 0 3064660327976 site.py 10 -> setquit + 0 3064660327986 site.py 10 <- setquit + 0 3064660327995 site.py 8 -> setcopyright + 0 3064660328005 site.py 10 -> __init__ + 0 3064660328015 site.py 9 <- __init__ + 0 3064660328026 site.py 11 -> __init__ + 0 3064660328035 site.py 8 <- __init__ + 0 3064660328045 posixpath.py 9 -> dirname + 0 3064660328053 posixpath.py 8 -> split + 0 3064660328066 posixpath.py 13 <- split + 0 3064660328075 posixpath.py 8 <- dirname + 0 3064660328089 posixpath.py 13 -> join + 0 3064660328099 posixpath.py 10 <- join + 0 3064660328109 site.py 10 -> __init__ + 0 3064660328118 site.py 9 <- __init__ + 0 3064660328127 site.py 8 <- setcopyright + 0 3064660328136 site.py 8 -> sethelper + 0 3064660328145 site.py 8 <- sethelper + 0 3064660328153 site.py 8 -> aliasmbcs + 0 3064660328161 site.py 8 <- aliasmbcs + 0 3064660328170 site.py 8 -> setencoding + 0 3064660328178 site.py 7 <- setencoding + 0 3064660328186 site.py 8 -> execsitecustomize + 0 3064660328736 site.py 549 <- execsitecustomize + 0 3064660328748 site.py 12 <- main + 0 3064660328758 site.py 9 <- ? + 0 3064660329029 warnings.py 270 -> ? + 0 3064660329184 linecache.py 155 -> ? + 0 3064660329201 linecache.py 16 <- ? + 0 3064660329220 warnings.py 18 -> _OptionError + 0 3064660329228 warnings.py 8 <- _OptionError + 0 3064660329246 warnings.py 17 -> _processoptions + 0 3064660329255 warnings.py 8 <- _processoptions + 0 3064660329266 warnings.py 10 -> simplefilter + 0 3064660329278 warnings.py 12 <- simplefilter + 0 3064660329288 warnings.py 9 -> simplefilter + 0 3064660329298 warnings.py 10 <- simplefilter + 0 3064660329307 warnings.py 8 <- ? + 0 3064660329533 __init__.py 226 -> ? + 0 3064660330090 codecs.py 557 -> ? + 0 3064660330148 codecs.py 57 -> Codec + 0 3064660330158 codecs.py 10 <- Codec + 0 3064660330171 codecs.py 13 -> StreamWriter + 0 3064660330182 codecs.py 10 <- StreamWriter + 0 3064660330194 codecs.py 11 -> StreamReader + 0 3064660330206 codecs.py 12 <- StreamReader + 0 3064660330217 codecs.py 11 -> StreamReaderWriter + 0 3064660330229 codecs.py 11 <- StreamReaderWriter + 0 3064660330239 codecs.py 10 -> StreamRecoder + 0 3064660330251 codecs.py 11 <- StreamRecoder + 0 3064660330267 codecs.py 16 <- ? + 0 3064660331439 aliases.py 1171 -> ? + 0 3064660331500 aliases.py 61 <- ? + 0 3064660331526 __init__.py 25 -> CodecRegistryError + 0 3064660331535 __init__.py 9 <- CodecRegistryError + 0 3064660331557 __init__.py 21 <- ? + 0 3064660331577 __init__.py 20 -> search_function + 0 3064660331590 __init__.py 12 -> normalize_encoding + 0 3064660331605 __init__.py 15 <- normalize_encoding + 0 3064660331728 ascii.py 122 -> ? + 0 3064660331742 ascii.py 13 -> Codec + 0 3064660331752 ascii.py 9 <- Codec + 0 3064660331766 ascii.py 13 -> StreamWriter + 0 3064660331774 ascii.py 8 <- StreamWriter + 0 3064660331787 ascii.py 13 -> StreamReader + 0 3064660331796 ascii.py 8 <- StreamReader + 0 3064660331819 ascii.py 23 -> StreamConverter + 0 3064660331829 ascii.py 9 <- StreamConverter + 0 3064660331842 ascii.py 13 <- ? + 0 3064660331860 ascii.py 17 -> getregentry + 0 3064660331869 ascii.py 9 <- getregentry + 0 3064660331897 __init__.py 27 <- search_function + 0 3064660332263 func_abc.py 366 -> ? + 0 3064660333735 func_abc.py 1471 -> func_a + 0 3064661340597 func_abc.py 1006862 -> func_b + 0 3064662350504 func_abc.py 1009906 -> func_c + 0 3064663350678 func_abc.py 1000174 <- func_c + 0 3064663350700 func_abc.py 22 <- func_b + 0 3064663350709 func_abc.py 8 <- func_a + 0 3064663350717 func_abc.py 8 <- ? +^C + +The fifth column is indented by 2 spaces to show when a new function begins. +This shows which function is calling which - first a whole lot of +pre-processing, then working through the func_abc.py program. + +The TIME(us) column shows time since boot. + +The DELTA(us) column shows time from that line to the previous line, and +so can be a bit tricky to read. For example, the third last line of data output +shows the time elapsing between func_c returning and func_b returning as 22 +microseconds. + +The FILE column shows file that was being executed. + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_funccalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_funccalls_example.txt new file mode 100644 index 00000000000..0ac87803fd8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_funccalls_example.txt @@ -0,0 +1,89 @@ +The following are examples of py_funccalls.d. + +This is a simple script to count executed PHP functions. Here it traces +an example program, Code/Python/func_abc.py + +# py_funccalls.d +Tracing... Hit Ctrl-C to end. +^C + + FILE FUNC CALLS + UserDict.py ? 1 + UserDict.py DictMixin 1 + UserDict.py IterableUserDict 1 + UserDict.py UserDict 1 + UserDict.py __init__ 1 + __init__.py ? 1 + __init__.py CodecRegistryError 1 + __init__.py normalize_encoding 1 + __init__.py search_function 1 + aliases.py ? 1 + ascii.py ? 1 + ascii.py Codec 1 + ascii.py StreamConverter 1 + ascii.py StreamReader 1 + ascii.py StreamWriter 1 + ascii.py getregentry 1 + codecs.py ? 1 + codecs.py Codec 1 + codecs.py StreamReader 1 + codecs.py StreamReaderWriter 1 + codecs.py StreamRecoder 1 + codecs.py StreamWriter 1 + copy_reg.py ? 1 + func_abc.py ? 1 + func_abc.py func_a 1 + func_abc.py func_b 1 + func_abc.py func_c 1 + linecache.py ? 1 + os.py ? 1 + os.py _Environ 1 + os.py __init__ 1 + os.py _get_exports_list 1 + posixpath.py ? 1 + posixpath.py basename 1 + posixpath.py dirname 1 + site.py ? 1 + site.py _Helper 1 + site.py _Printer 1 + site.py _init_pathinfo 1 + site.py abs__file__ 1 + site.py addsitepackages 1 + site.py aliasmbcs 1 + site.py execsitecustomize 1 + site.py main 1 + site.py removeduppaths 1 + site.py setcopyright 1 + site.py setencoding 1 + site.py sethelper 1 + site.py setquit 1 + stat.py ? 1 + types.py ? 1 + types.py _C 1 + warnings.py ? 1 + warnings.py _OptionError 1 + warnings.py _processoptions 1 + posixpath.py exists 2 + posixpath.py split 2 + site.py addsitedir 2 + warnings.py simplefilter 2 + copy_reg.py constructor 3 + copy_reg.py pickle 3 + site.py __init__ 3 + site.py addpackage 3 + stat.py S_IFMT 6 + stat.py S_ISDIR 6 + posixpath.py isdir 8 + os.py _exists 10 + ? 11 + posixpath.py normcase 14 + site.py makepath 14 + posixpath.py join 20 + posixpath.py abspath 22 + posixpath.py isabs 22 + posixpath.py normpath 22 + +It tells you how many times each function was called, and which file this +function was associated with. In this case you can see most of the function +calls come from functions within the posixpath.py library. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_malloc_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_malloc_example.txt new file mode 100644 index 00000000000..be8fc25a484 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_malloc_example.txt @@ -0,0 +1,508 @@ +The following are examples of py_malloc.d + +This is an experimental script to identify who is calling malloc() for memory +allocation, and to print distribution plots of the requested bytes. Here you +can see it running on Code/Python/func_abc.py + +# py_malloc.d -c ./func_abc.py +Tracing... Hit Ctrl-C to end. +Function A +Function B +Function C + +Python malloc byte distributions by engine caller, + + libpython2.4.so.1.0`_PyUnicode_New, total bytes = 2 + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + libpython2.4.so.1.0`find_key, total bytes = 16 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + libpython2.4.so.1.0`PyInterpreterState_New, total bytes = 36 + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + libpython2.4.so.1.0`_PyImport_Init, total bytes = 60 + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + libpython2.4.so.1.0`PyThreadState_New, total bytes = 84 + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + libpython2.4.so.1.0`pmerge, total bytes = 132 + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@ 1 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16 + 16 | 0 + + libpython2.4.so.1.0`PyThread_allocate_lock, total bytes = 144 + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 64 | 0 + + libpython2.4.so.1.0`convertsimple, total bytes = 210 + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 64 | 0 + + libc.so.1`strdup, total bytes = 451 + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@ 1 + 4 |@@@ 1 + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@ 8 + 32 |@@@@@@@@@@@@@@@ 6 + 64 | 0 + + libpython2.4.so.1.0`PyList_New, total bytes = 528 + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@ 22 + 8 |@@@@@@@@@@@@@@@@@ 21 + 16 |@@@@@ 6 + 32 | 0 + 64 | 0 + 128 |@ 1 + 256 | 0 + + libpython2.4.so.1.0`PyTokenizer_FromFile, total bytes = 1024 + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + libpython2.4.so.1.0`_PyExc_Init, total bytes = 1058 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 40 + 32 |@@ 2 + 64 | 0 + + libpython2.4.so.1.0`tok_new, total bytes = 1832 + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 1024 | 0 + + libpython2.4.so.1.0`fill_free_list, total bytes = 1976 + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 1024 | 0 + + libpython2.4.so.1.0`PyParser_New, total bytes = 12024 + value ------------- Distribution ------------- count + 2048 | 0 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8192 | 0 + + libpython2.4.so.1.0`PyObject_Malloc, total bytes = 35152 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@ 20 + 512 |@@@@@@@ 7 + 1024 |@@@@@@@@@@ 11 + 2048 |@@@@ 4 + 4096 | 0 + + libpython2.4.so.1.0`PyMem_Malloc, total bytes = 50683 + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@ 2 + 16 |@@@@@@@ 4 + 32 |@@ 1 + 64 |@@@@@@@@@@@@@ 8 + 128 |@@@@@ 3 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 |@@@@@@@@@@ 6 + 16384 | 0 + + libc.so.1`_findbuf, total bytes = 51800 + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@ 4 + 1024 |@@@@ 1 + 2048 | 0 + 4096 |@@@@@@@ 2 + 8192 |@@@@@@@@@@@@@@@ 4 + 16384 | 0 + + libpython2.4.so.1.0`dictresize, total bytes = 178752 + value ------------- Distribution ------------- count + 64 | 0 + 128 |@ 1 + 256 |@@@@@@@@@@@@@@@@@@@@@ 29 + 512 | 0 + 1024 |@@@@@@@@@@@@@@ 19 + 2048 |@ 1 + 4096 |@ 2 + 8192 | 0 + 16384 |@ 1 + 32768 | 0 + 65536 |@ 1 + 131072 | 0 + + libpython2.4.so.1.0`new_arena, total bytes = 262208 + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 | 0 + 32768 | 0 + 65536 | 0 + 131072 | 0 + 262144 |@@@@@@@@@@@@@@@@@@@@ 1 + 524288 | 0 + + +Python malloc byte distributions by Python file and function, + + site.py, addsitepackages, bytes total = 4 + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, abs__file__, bytes total = 60 + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + posixpath.py, exists, bytes total = 83 + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + stat.py, S_ISDIR, bytes total = 364 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + site.py, _init_pathinfo, bytes total = 380 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + UserDict.py, DictMixin, bytes total = 384 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + codecs.py, StreamReader, bytes total = 384 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + codecs.py, StreamReaderWriter, bytes total = 384 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + codecs.py, StreamRecoder, bytes total = 384 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + codecs.py, StreamWriter, bytes total = 384 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + os.py, _Environ, bytes total = 384 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + site.py, _Printer, bytes total = 384 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + site.py, addsitedir, bytes total = 388 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + linecache.py, ?, bytes total = 396 + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + posixpath.py, isdir, bytes total = 608 + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@ 2 + 4 | 0 + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@ 7 + 32 |@@@@@@@ 2 + 64 | 0 + 128 | 0 + 256 |@@@ 1 + 512 | 0 + + os.py, _get_exports_list, bytes total = 612 + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + posixpath.py, abspath, bytes total = 728 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 512 | 0 + + site.py, execsitecustomize, bytes total = 790 + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9 + 64 | 0 + 128 | 0 + 256 |@@@@ 1 + 512 | 0 + + UserDict.py, UserDict, bytes total = 1920 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + stat.py, ?, bytes total = 1920 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + types.py, ?, bytes total = 2680 + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@ 1 + 8 |@@@@@@@@@@@ 2 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@ 3 + 512 | 0 + 1024 |@@@@@@ 1 + 2048 | 0 + + posixpath.py, ?, bytes total = 3306 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@ 2 + 32 | 0 + 64 | 0 + 128 | 0 + 256 |@@@@@@@@@@@@@@@@ 2 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@@@ 1 + 4096 | 0 + + copy_reg.py, ?, bytes total = 3547 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@ 2 + 32 | 0 + 64 | 0 + 128 | 0 + 256 |@@@@@@@@ 1 + 512 |@@@@@@@@ 1 + 1024 | 0 + 2048 |@@@@@@@@ 1 + 4096 | 0 + + warnings.py, ?, bytes total = 3924 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@ 1 + 32 |@@@@@@@@ 1 + 64 | 0 + 128 | 0 + 256 |@@@@@@@@@@@@@@@@ 2 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@@@ 1 + 4096 | 0 + + func_abc.py, func_a, bytes total = 5100 + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + 2048 | 0 + 4096 |@@@@@@@@@@@@@@@@@@@@ 1 + 8192 | 0 + + codecs.py, ?, bytes total = 5612 + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@ 1 + 128 |@@@@@@ 1 + 256 |@@@@@@@@@@@ 2 + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@ 3 + 2048 | 0 + + aliases.py, ?, bytes total = 8064 + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@ 1 + 512 | 0 + 1024 |@@@@@@@@@@@@@ 1 + 2048 | 0 + 4096 |@@@@@@@@@@@@@ 1 + 8192 | 0 + + func_abc.py, ?, bytes total = 16105 + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@ 1 + 8 |@@@@@ 2 + 16 |@@@@@@@@@ 4 + 32 |@@@@@ 2 + 64 | 0 + 128 |@@ 1 + 256 |@@@@@@@ 3 + 512 |@@ 1 + 1024 |@@@@@ 2 + 2048 | 0 + 4096 | 0 + 8192 |@@ 1 + 16384 | 0 + + os.py, ?, bytes total = 58957 + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@ 3 + 8 |@@@@@ 6 + 16 |@ 1 + 32 |@@ 2 + 64 | 0 + 128 |@ 1 + 256 |@@@@@@@@@@@@@@@@@@ 23 + 512 |@@ 3 + 1024 |@@@@@ 7 + 2048 | 0 + 4096 |@@@ 4 + 8192 |@ 1 + 16384 | 0 + + site.py, ?, bytes total = 62589 + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@ 2 + 32 | 0 + 64 | 0 + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 20 + 512 |@ 1 + 1024 |@@@ 2 + 2048 |@ 1 + 4096 | 0 + 8192 | 0 + 16384 |@@@ 2 + 32768 | 0 + + __init__.py, ?, bytes total = 62593 + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@ 1 + 2 | 0 + 4 | 0 + 8 | 0 + 16 |@@@ 2 + 32 |@@ 1 + 64 | 0 + 128 | 0 + 256 |@@@@@@@@@@@ 7 + 512 |@@@@@@@@@@@@@@@@ 10 + 1024 |@@@ 2 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 |@@@ 2 + 32768 | 0 + + posixpath.py, join, bytes total = 262144 + value ------------- Distribution ------------- count + 131072 | 0 + 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 524288 | 0 + + os.py, _exists, bytes total = 362768 + value ------------- Distribution ------------- count + 2 | 0 + 4 |@ 10 + 8 |@ 10 + 16 |@@ 20 + 32 | 0 + 64 | 0 + 128 | 0 + 256 |@ 7 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 447 + 1024 |@@ 20 + 2048 | 0 + 4096 |@ 10 + 8192 | 0 + + +The results are divided into two sections. If a malloc() occurred while in a +Python function, then that function is identified as responsible; and the +results will appear in the second section - Python malloc byte distributions +by Python file and function. + +Otherwise the caller of malloc() is identified as responsible - which will be +a function from the Python engine, and these are noted in the first section - +Python malloc byte distributions by engine caller. diff --git a/cddl/contrib/dtracetoolkit/Examples/py_mallocstk_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_mallocstk_example.txt new file mode 100644 index 00000000000..a466737f34b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_mallocstk_example.txt @@ -0,0 +1,314 @@ +Following are examples of running py_mallocstk.d. This traces malloc() from +Python, printing byte distributions by user stack trace. + +Here we see the script runnin on the program Code/Python/func_abc.py + +# py_mallocstk.d -c ./func_abc.py + +Tracing... Hit Ctrl-C to end. +Function A +Function B +Function C + +Python malloc byte distributions by stack trace, + + + + libc.so.1`malloc + libpython2.4.so.1.0`r_object+0x52f + libpython2.4.so.1.0`r_object+0x491 + libpython2.4.so.1.0`r_object+0xd3 + libpython2.4.so.1.0`r_object+0x491 + libpython2.4.so.1.0`r_object+0xd3 + libpython2.4.so.1.0`r_object+0x491 + libpython2.4.so.1.0`r_object+0xd3 + libpython2.4.so.1.0`PyMarshal_ReadObjectFromString+0x36 + libpython2.4.so.1.0`PyMarshal_ReadLastObjectFromFile+0x6a + libpython2.4.so.1.0`read_compiled_module+0xf + libpython2.4.so.1.0`load_source_module+0x63 + libpython2.4.so.1.0`load_module+0xac + libpython2.4.so.1.0`import_submodule+0xfb + libpython2.4.so.1.0`load_next+0xee + libpython2.4.so.1.0`import_module_ex+0x48 + libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d + libpython2.4.so.1.0`builtin___import__+0x4e + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`PyObject_Call+0x1d + libpython2.4.so.1.0`PyEval_CallObjectWithKeywords+0xb8 + libpython2.4.so.1.0`PyEval_EvalFrame+0xd3c + [ /usr/lib/python2.4/encodings/__init__.py:28 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0 + libpython2.4.so.1.0`load_source_module+0xe6 + libpython2.4.so.1.0`load_module+0xac + libpython2.4.so.1.0`load_package+0xef + libpython2.4.so.1.0`load_module+0x6a + libpython2.4.so.1.0`import_submodule+0xfb + libpython2.4.so.1.0`load_next+0xa2 + libpython2.4.so.1.0`import_module_ex+0x48 + libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d + libpython2.4.so.1.0`_PyCodecRegistry_Init+0xce + libpython2.4.so.1.0`_PyCodec_Lookup+0x2a + libpython2.4.so.1.0`PyCodec_Encoder+0xf + libpython2.4.so.1.0`Py_InitializeEx+0x257 + libpython2.4.so.1.0`Py_Initialize+0xd + libpython2.4.so.1.0`Py_Main+0x4db + python`main+0x11 + python`_start+0x7a + + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + + libc.so.1`malloc + libpython2.4.so.1.0`_PyUnicode_New+0xb2 + libpython2.4.so.1.0`_PyUnicodeUCS2_Init+0x19 + libpython2.4.so.1.0`Py_InitializeEx+0x11c + libpython2.4.so.1.0`Py_Initialize+0xd + libpython2.4.so.1.0`Py_Main+0x4db + python`main+0x11 + python`_start+0x7a + + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + + libc.so.1`malloc + libc.so.1`_real_gettext_u+0x81 + libc.so.1`dgettext+0x5e + libc.so.1`strerror+0x40 + libpython2.4.so.1.0`PyErr_SetFromErrnoWithFilenameObject+0x2d + libpython2.4.so.1.0`PyErr_SetFromErrnoWithFilename+0x27 + libpython2.4.so.1.0`posix_error_with_allocated_filename+0x17 + libpython2.4.so.1.0`posix_do_stat+0x21f + libpython2.4.so.1.0`posix_stat+0x1f + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`call_function+0x406 + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/posixpath.py:195 (isdir) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:202 (addsitepackages) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:382 (main) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:397 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0 + libpython2.4.so.1.0`load_source_module+0xe6 + libpython2.4.so.1.0`load_module+0xac + libpython2.4.so.1.0`import_submodule+0xfb + libpython2.4.so.1.0`load_next+0xa2 + libpython2.4.so.1.0`import_module_ex+0x48 + libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d + libpython2.4.so.1.0`builtin___import__+0x4e + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`PyObject_Call+0x1d + libpython2.4.so.1.0`PyObject_CallFunction+0x90 + libpython2.4.so.1.0`PyImport_Import+0x163 + libpython2.4.so.1.0`PyImport_ImportModule+0x1f + libpython2.4.so.1.0`initsite+0x10 + libpython2.4.so.1.0`Py_InitializeEx+0x1ea + libpython2.4.so.1.0`Py_Initialize+0xd + libpython2.4.so.1.0`Py_Main+0x4db + python`main+0x11 + python`_start+0x7a + + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + +[... around 17000 lines truncated ...] + + + libc.so.1`malloc + libpython2.4.so.1.0`PyObject_Malloc+0x126 + libpython2.4.so.1.0`fixstate+0x26 + libpython2.4.so.1.0`fixdfa+0x2a + libpython2.4.so.1.0`PyGrammar_AddAccelerators+0x1b + libpython2.4.so.1.0`PyParser_New+0x18 + libpython2.4.so.1.0`parsetok+0x17 + libpython2.4.so.1.0`PyParser_ParseStringFlagsFilename+0x72 + libpython2.4.so.1.0`PyParser_ParseStringFlags+0x1c + libpython2.4.so.1.0`PyParser_SimpleParseStringFlags+0x23 + libpython2.4.so.1.0`PyRun_StringFlags+0x2c + libpython2.4.so.1.0`builtin_eval+0x273 + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`call_function+0x406 + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/os.py:503 (_exists) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/os.py:509 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0 + libpython2.4.so.1.0`load_source_module+0xe6 + libpython2.4.so.1.0`load_module+0xac + libpython2.4.so.1.0`import_submodule+0xfb + libpython2.4.so.1.0`load_next+0xa2 + libpython2.4.so.1.0`import_module_ex+0x48 + libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d + libpython2.4.so.1.0`builtin___import__+0x4e + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`PyObject_Call+0x1d + libpython2.4.so.1.0`PyEval_CallObjectWithKeywords+0xb8 + libpython2.4.so.1.0`PyEval_EvalFrame+0xd3c + [ /usr/lib/python2.4/site.py:58 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0 + libpython2.4.so.1.0`load_source_module+0xe6 + libpython2.4.so.1.0`load_module+0xac + libpython2.4.so.1.0`import_submodule+0xfb + libpython2.4.so.1.0`load_next+0xa2 + libpython2.4.so.1.0`import_module_ex+0x48 + libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d + libpython2.4.so.1.0`builtin___import__+0x4e + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`PyObject_Call+0x1d + libpython2.4.so.1.0`PyObject_CallFunction+0x90 + libpython2.4.so.1.0`PyImport_Import+0x163 + libpython2.4.so.1.0`PyImport_ImportModule+0x1f + libpython2.4.so.1.0`initsite+0x10 + libpython2.4.so.1.0`Py_InitializeEx+0x1ea + libpython2.4.so.1.0`Py_Initialize+0xd + libpython2.4.so.1.0`Py_Main+0x4db + python`main+0x11 + python`_start+0x7a + + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 331 + 1024 | 0 + + + libc.so.1`malloc + libpython2.4.so.1.0`new_arena+0x13 + libpython2.4.so.1.0`PyObject_Malloc+0x91 + libpython2.4.so.1.0`string_concat+0x109 + libpython2.4.so.1.0`PyString_Concat+0x3b + libpython2.4.so.1.0`string_concatenate+0x150 + libpython2.4.so.1.0`PyEval_EvalFrame+0x27cc + [ /usr/lib/python2.4/posixpath.py:62 (join) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`function_call+0x15e + libpython2.4.so.1.0`PyObject_Call+0x1d + libpython2.4.so.1.0`ext_do_call+0xfb + libpython2.4.so.1.0`PyEval_EvalFrame+0xb4f + [ /usr/lib/python2.4/site.py:66 (makepath) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`fast_function+0x112 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:138 (addpackage) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`fast_function+0x112 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:166 (addsitedir) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`fast_function+0x112 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ :1 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`run_node+0x35 + libpython2.4.so.1.0`run_err_node+0x1f + libpython2.4.so.1.0`PyRun_String+0x27 + libpython2.4.so.1.0`exec_statement+0x2b0 + libpython2.4.so.1.0`PyEval_EvalFrame+0x15d6 + [ /usr/lib/python2.4/site.py:134 (addpackage) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`fast_function+0x112 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:166 (addsitedir) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`fast_function+0x112 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:203 (addsitepackages) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:382 (main) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:397 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0 + libpython2.4.so.1.0`load_source_module+0xe6 + libpython2.4.so.1.0`load_module+0xac + libpython2.4.so.1.0`import_submodule+0xfb + libpython2.4.so.1.0`load_next+0xa2 + libpython2.4.so.1.0`import_module_ex+0x48 + libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d + libpython2.4.so.1.0`builtin___import__+0x4e + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`PyObject_Call+0x1d + libpython2.4.so.1.0`PyObject_CallFunction+0x90 + libpython2.4.so.1.0`PyImport_Import+0x163 + libpython2.4.so.1.0`PyImport_ImportModule+0x1f + libpython2.4.so.1.0`initsite+0x10 + libpython2.4.so.1.0`Py_InitializeEx+0x1ea + libpython2.4.so.1.0`Py_Initialize+0xd + libpython2.4.so.1.0`Py_Main+0x4db + + value ------------- Distribution ------------- count + 131072 | 0 + 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 524288 | 0 + + + libc.so.1`malloc + libpython2.4.so.1.0`new_arena+0x13 + libpython2.4.so.1.0`PyObject_Malloc+0x91 + libpython2.4.so.1.0`_PyObject_GC_Malloc+0x13 + libpython2.4.so.1.0`_PyObject_GC_NewVar+0x24 + libpython2.4.so.1.0`PyTuple_New+0x78 + libpython2.4.so.1.0`PyType_Ready+0x98 + libpython2.4.so.1.0`PyType_Ready+0x60 + libpython2.4.so.1.0`_Py_ReadyTypes+0x10 + libpython2.4.so.1.0`Py_InitializeEx+0xed + libpython2.4.so.1.0`Py_Initialize+0xd + libpython2.4.so.1.0`Py_Main+0x4db + python`main+0x11 + python`_start+0x7a + + value ------------- Distribution ------------- count + 131072 | 0 + 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 524288 | 0 + + +This output looks a little unusual at first glance, and can be confusing for +people unfamiliar with stack tracing and Python engine internals. + +Start by looking at the distribution plots below each stack trace - each plot +shows how many bytes were requested as a histogram by byte size. This should +indicated to you if python is malloc()ing much memory or not, and whether it +is doing so in a few large malloc()s or many small ones. + +With this information in mind you can inspect the stack traces - these explain +why Python called malloc() in that instance, along with translations of Python +functions buried in the stack trace. The stack traces can be hard to read at +first (or even at second or at third) - since you are examining Python engine +internals. Try looking for lines in square brackets - those are Python language +frames, and will show where (or if) the malloc() was caused by Python code. diff --git a/cddl/contrib/dtracetoolkit/Examples/py_profile_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_profile_example.txt new file mode 100644 index 00000000000..04c06886e4c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_profile_example.txt @@ -0,0 +1,399 @@ +The following are examples of py_profile.d. + +This samples stack traces for the process specified. This stack trace will +cross the Python engine and system libraries, and insert translations for +Python stack frames where appropriate. Here you can see it running on +Code/Python/func_slow.py + +# py_profile.d -c ./func_slow.py +Sampling 10-level stacks at 1001 Hertz... Hit Ctrl-C to end. +Function A +Function B +Function C +Top 25 most frequently sampled stacks, + + + libpython2.4.so.1.0`PyEval_EvalFrame+0x266 + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 11 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x278 + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 11 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x278a + [ ./func_slow.py:10 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`run_node+0x35 + 11 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x205 + [ ./func_slow.py:18 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`run_node+0x35 + libpython2.4.so.1.0`run_err_node+0x1f + libpython2.4.so.1.0`PyRun_FileExFlags+0x5e + libpython2.4.so.1.0`PyRun_SimpleFileExFlags+0x12f + 12 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x1fe + [ ./func_slow.py:10 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`run_node+0x35 + 13 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x35d + [ ./func_slow.py:10 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`run_node+0x35 + 13 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x1f5 + [ ./func_slow.py:10 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`run_node+0x35 + 14 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x149 + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 14 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x5aa + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 14 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x58f + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 15 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x58f + [ ./func_slow.py:10 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`run_node+0x35 + 15 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x254 + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 17 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x286 + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 17 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x2fbf + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 17 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x35d + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 18 + + libc.so.1`ioctl+0x7 + libpython2.4.so.1.0`_init+0x25 + ld.so.1`call_init+0xff + ld.so.1`setup+0xf93 + ld.so.1`_setup+0x310 + ld.so.1`_rt_boot+0x56 + 0x8047e5c + 19 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x5a4 + [ ./func_slow.py:18 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`run_node+0x35 + libpython2.4.so.1.0`run_err_node+0x1f + libpython2.4.so.1.0`PyRun_FileExFlags+0x5e + libpython2.4.so.1.0`PyRun_SimpleFileExFlags+0x12f + 20 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x5ba + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 20 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x583 + [ ./func_slow.py:10 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`run_node+0x35 + 22 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x5a4 + [ ./func_slow.py:10 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`run_node+0x35 + 22 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x278a + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 24 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x205 + [ ./func_slow.py:10 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`run_node+0x35 + 25 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x583 + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 35 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x5a4 + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 47 + + libpython2.4.so.1.0`PyEval_EvalFrame+0x205 + [ ./func_slow.py:3 (func_c) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:16 (func_b) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:24 (func_a) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ ./func_slow.py:26 (?) ] + 50 + + The lines in square brackets are the native Python frames, the rest + are the Python engine. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_syscalls_example.txt new file mode 100644 index 00000000000..3aac3d28e88 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_syscalls_example.txt @@ -0,0 +1,129 @@ +The following are examples of py_syscalls.d. + +This is a simple script to count executed Python functions and system calls. +Here it traces an example program, Code/Pythong/func_abc.py. + +# py_syscalls.d -c ./func_abc.py +Tracing... Hit Ctrl-C to end. +Function A +Function B +Function C + +Calls for PID 145538, + + FILE TYPE NAME COUNT + UserDict.py func ? 1 + UserDict.py func DictMixin 1 + UserDict.py func IterableUserDict 1 + UserDict.py func UserDict 1 + UserDict.py func __init__ 1 + __init__.py func ? 1 + __init__.py func CodecRegistryError 1 + __init__.py func normalize_encoding 1 + __init__.py func search_function 1 + aliases.py func ? 1 + ascii.py func ? 1 + ascii.py func Codec 1 + ascii.py func StreamConverter 1 + ascii.py func StreamReader 1 + ascii.py func StreamWriter 1 + ascii.py func getregentry 1 + codecs.py func ? 1 + codecs.py func Codec 1 + codecs.py func StreamReader 1 + codecs.py func StreamReaderWriter 1 + codecs.py func StreamRecoder 1 + codecs.py func StreamWriter 1 + copy_reg.py func ? 1 + func_abc.py func ? 1 + func_abc.py func func_a 1 + func_abc.py func func_b 1 + func_abc.py func func_c 1 + func_abc.py syscall getrlimit 1 + func_abc.py syscall gtime 1 + func_abc.py syscall memcntl 1 + func_abc.py syscall rexit 1 + func_abc.py syscall sigpending 1 + func_abc.py syscall sysi86 1 + func_abc.py syscall write 1 + func_abc.py syscall xstat 1 + linecache.py func ? 1 + os.py func ? 1 + os.py func _Environ 1 + os.py func __init__ 1 + os.py func _get_exports_list 1 + posixpath.py func ? 1 + posixpath.py func basename 1 + posixpath.py func dirname 1 + site.py func ? 1 + site.py func _Helper 1 + site.py func _Printer 1 + site.py func _init_pathinfo 1 + site.py func abs__file__ 1 + site.py func addsitepackages 1 + site.py func aliasmbcs 1 + site.py func execsitecustomize 1 + site.py func main 1 + site.py func removeduppaths 1 + site.py func setcopyright 1 + site.py func setencoding 1 + site.py func sethelper 1 + site.py func setquit 1 + stat.py func ? 1 + types.py func ? 1 + types.py func _C 1 + warnings.py func ? 1 + warnings.py func _OptionError 1 + warnings.py func _processoptions 1 + func_abc.py syscall fcntl 2 + func_abc.py syscall fsat 2 + func_abc.py syscall getcwd 2 + func_abc.py syscall getpid 2 + func_abc.py syscall mprotect 2 + func_abc.py syscall readlink 2 + func_abc.py syscall resolvepath 2 + func_abc.py syscall setcontext 2 + posixpath.py func exists 2 + posixpath.py func split 2 + site.py func addsitedir 2 + warnings.py func simplefilter 2 + copy_reg.py func constructor 3 + copy_reg.py func pickle 3 + func_abc.py syscall munmap 3 + func_abc.py syscall pollsys 3 + site.py func __init__ 3 + site.py func addpackage 3 + func_abc.py syscall getdents64 4 + func_abc.py syscall open 4 + func_abc.py syscall sysconfig 4 + func_abc.py syscall mmap 5 + func_abc.py syscall lwp_exit 6 + stat.py func S_IFMT 6 + stat.py func S_ISDIR 6 + posixpath.py func isdir 8 + os.py func _exists 10 + func ? 11 + posixpath.py func normcase 14 + site.py func makepath 14 + posixpath.py func join 20 + posixpath.py func abspath 22 + posixpath.py func isabs 22 + posixpath.py func normpath 22 + func_abc.py syscall ioctl 28 + func_abc.py syscall llseek 34 + func_abc.py syscall read 36 + func_abc.py syscall close 41 + func_abc.py syscall sigaction 52 + func_abc.py syscall brk 58 + func_abc.py syscall fstat64 74 + func_abc.py syscall stat64 77 + func_abc.py syscall open64 173 + +While tracing there were numerous system calls made, including 173 open64()'s, +and 77 stat64()'s. There were also many functions called, including 22 each +of abspath, isabs, and normpath by the posixpath.py library. + +This script can provide an insight to how an application is interacting +with the system, by providing both application function calls and +system calls in the same output. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_syscolors_example.txt new file mode 100644 index 00000000000..0a6367f9fe6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_syscolors_example.txt @@ -0,0 +1,584 @@ +The following are examples of py_syscolors.d. + +This is a simple script to trace the flow of Python functons and system +calls made, and renders the output in color ("colour") using terminal +escape sequences (which you can tweak by modifying the script). + +Here it traces the example program, Code/Python/func_abc.py. + +WARNING: This output is full of terminal escape sequences, so if you are +trying to view this through an editor or web browser - it may look awful. +Try viewing this using "more" (although, depending on your terminal, it +still may look awful). + +# py_syscolors.d -c ./func_abc.py +C PID DELTA(us) FILE:LINE TYPE -- NAME +0 145544 2 ":- syscall -> munmap +0 145544 34 ":- syscall <- munmap +0 145544 56 ":- syscall -> mmap +0 145544 19 ":- syscall <- mmap +0 145544 42 ":- syscall -> setcontext +0 145544 10 ":- syscall <- setcontext +0 145544 9 ":- syscall -> getrlimit +0 145544 10 ":- syscall <- getrlimit +0 145544 9 ":- syscall -> getpid +0 145544 8 ":- syscall <- getpid +0 145544 68 ":- syscall -> setcontext +0 145544 8 ":- syscall <- setcontext +0 145544 121 ":- syscall -> sigpending +0 145544 9 ":- syscall <- sigpending +0 145544 172 ":- syscall -> open64 +0 145544 114 ":- syscall <- open64 +0 145544 14 ":- syscall -> ioctl +0 145544 28209 ":- syscall <- ioctl +0 145544 285 ":- syscall -> close +0 145544 31 ":- syscall <- close +0 145544 41 ":- syscall -> open64 +0 145544 88 ":- syscall <- open64 +0 145544 9 ":- syscall -> ioctl +0 145544 293 ":- syscall <- ioctl +0 145544 11 ":- syscall -> close +0 145544 13 ":- syscall <- close +0 145544 1182 ":- syscall -> sysi86 +0 145544 12 ":- syscall <- sysi86 +0 145544 143 ":- syscall -> sysconfig +0 145544 53 ":- syscall <- sysconfig +0 145544 95 ":- syscall -> open64 +0 145544 22 ":- syscall <- open64 +0 145544 11 ":- syscall -> fstat64 +0 145544 10 ":- syscall <- fstat64 +0 145544 31 ":- syscall -> ioctl +0 145544 42 ":- syscall <- ioctl +0 145544 24 ":- syscall -> brk +0 145544 10 ":- syscall <- brk +0 145544 8 ":- syscall -> brk +0 145544 17 ":- syscall <- brk +0 145544 30 ":- syscall -> sysconfig +0 145544 8 ":- syscall <- sysconfig +0 145544 32 ":- syscall -> brk +0 145544 7 ":- syscall <- brk +0 145544 8 ":- syscall -> brk + +[... 1400 lines truncated ...] + +0 145544 8 ":- syscall -> fstat64 +0 145544 7 ":- syscall <- fstat64 +0 145544 11 ":- syscall -> read +0 145544 8 ":- syscall <- read +0 145544 29 ":- syscall -> brk +0 145544 8 ":- syscall <- brk +0 145544 8 ":- syscall -> brk +0 145544 10 ":- syscall <- brk +0 145544 393 ":- syscall -> llseek +0 145544 8 ":- syscall <- llseek +0 145544 9 ":- syscall -> close +0 145544 9 ":- syscall <- close +0 145544 14 aliases.py:17 func -> ? +0 145544 57 aliases.py:18 func <- ? +0 145544 20 ":- syscall -> llseek +0 145544 8 ":- syscall <- llseek +0 145544 8 ":- syscall -> close +0 145544 8 ":- syscall <- close +0 145544 15 __init__.py:43 func -> CodecRegistryError +0 145544 12 __init__.py:45 func <- CodecRegistryError +0 145544 26 __init__.py:145 func <- ? +0 145544 18 ":- syscall -> llseek +0 145544 8 ":- syscall <- llseek +0 145544 8 ":- syscall -> close +0 145544 9 ":- syscall <- close +0 145544 13 __init__.py:69 func -> search_function +0 145544 14 __init__.py:47 func -> normalize_encoding +0 145544 18 __init__.py:67 func <- normalize_encoding +0 145544 29 ":- syscall -> stat64 +0 145544 20 ":- syscall <- stat64 +0 145544 10 ":- syscall -> open64 +0 145544 18 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 17 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 18 ":- syscall <- open64 +0 145544 9 ":- syscall -> fstat64 +0 145544 8 ":- syscall <- fstat64 +0 145544 8 ":- syscall -> open64 +0 145544 18 ":- syscall <- open64 +0 145544 8 ":- syscall -> fstat64 +0 145544 8 ":- syscall <- fstat64 +0 145544 9 ":- syscall -> fstat64 +0 145544 7 ":- syscall <- fstat64 +0 145544 8 ":- syscall -> ioctl +0 145544 7 ":- syscall <- ioctl +0 145544 8 ":- syscall -> read +0 145544 19 ":- syscall <- read +0 145544 8 ":- syscall -> fstat64 +0 145544 8 ":- syscall <- fstat64 +0 145544 8 ":- syscall -> read +0 145544 8 ":- syscall <- read +0 145544 22 ":- syscall -> llseek +0 145544 8 ":- syscall <- llseek +0 145544 8 ":- syscall -> close +0 145544 9 ":- syscall <- close +0 145544 12 ascii.py:8 func -> ? +0 145544 16 ascii.py:13 func -> Codec +0 145544 12 ascii.py:18 func <- Codec +0 145544 22 ascii.py:20 func -> StreamWriter +0 145544 11 ascii.py:21 func <- StreamWriter +0 145544 20 ascii.py:23 func -> StreamReader +0 145544 11 ascii.py:24 func <- StreamReader +0 145544 32 ascii.py:26 func -> StreamConverter +0 145544 12 ascii.py:29 func <- StreamConverter +0 145544 21 ascii.py:33 func <- ? +0 145544 17 ":- syscall -> llseek +0 145544 8 ":- syscall <- llseek +0 145544 8 ":- syscall -> close +0 145544 8 ":- syscall <- close +0 145544 13 ascii.py:33 func -> getregentry +0 145544 12 ascii.py:35 func <- getregentry +0 145544 34 __init__.py:142 func <- search_function +0 145544 23 ":- syscall -> ioctl +0 145544 42 ":- syscall <- ioctl +0 145544 11 ":- syscall -> ioctl +0 145544 9 ":- syscall <- ioctl +0 145544 12 ":- syscall -> readlink +0 145544 16 ":- syscall <- readlink +0 145544 20 ":- syscall -> resolvepath +0 145544 18 ":- syscall <- resolvepath +0 145544 12 ":- syscall -> getcwd +0 145544 20 ":- syscall <- getcwd +0 145544 27 ":- syscall -> ioctl +0 145544 8 ":- syscall <- ioctl +0 145544 14 ":- syscall -> llseek +0 145544 7 ":- syscall <- llseek +0 145544 8 ":- syscall -> fstat64 +0 145544 8 ":- syscall <- fstat64 +0 145544 8 ":- syscall -> fstat64 +0 145544 7 ":- syscall <- fstat64 +0 145544 8 ":- syscall -> ioctl +0 145544 7 ":- syscall <- ioctl +0 145544 8 ":- syscall -> read +0 145544 19 ":- syscall <- read +0 145544 9 ":- syscall -> llseek +0 145544 7 ":- syscall <- llseek +0 145544 8 ":- syscall -> llseek +0 145544 7 ":- syscall <- llseek +0 145544 12 ":- syscall -> read +0 145544 13 ":- syscall <- read +0 145544 105 ":- syscall -> read +0 145544 9 ":- syscall <- read +0 145544 10 ":- syscall -> llseek +0 145544 7 ":- syscall <- llseek +0 145544 8 ":- syscall -> close +0 145544 9 ":- syscall <- close +0 145544 117 func_abc.py:3 func -> ? +0 145544 20 ":- syscall -> stat64 +0 145544 15 ":- syscall <- stat64 +0 145544 10 ":- syscall -> stat64 +0 145544 13 ":- syscall <- stat64 +0 145544 10 ":- syscall -> open64 +0 145544 15 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 13 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 13 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 13 ":- syscall <- open64 +0 145544 9 ":- syscall -> stat64 +0 145544 13 ":- syscall <- stat64 +0 145544 9 ":- syscall -> open64 +0 145544 13 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 13 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 13 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 13 ":- syscall <- open64 +0 145544 9 ":- syscall -> stat64 +0 145544 15 ":- syscall <- stat64 +0 145544 8 ":- syscall -> open64 +0 145544 15 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 15 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 15 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 15 ":- syscall <- open64 +0 145544 9 ":- syscall -> stat64 +0 145544 17 ":- syscall <- stat64 +0 145544 9 ":- syscall -> open64 +0 145544 17 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 16 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 16 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 16 ":- syscall <- open64 +0 145544 8 ":- syscall -> stat64 +0 145544 17 ":- syscall <- stat64 +0 145544 8 ":- syscall -> open64 +0 145544 17 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 16 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 16 ":- syscall <- open64 +0 145544 8 ":- syscall -> open64 +0 145544 16 ":- syscall <- open64 +0 145544 9 ":- syscall -> stat64 +0 145544 17 ":- syscall <- stat64 +0 145544 8 ":- syscall -> open64 +0 145544 19 ":- syscall <- open64 +0 145544 14 ":- syscall -> fstat64 +0 145544 9 ":- syscall <- fstat64 +0 145544 20 ":- syscall -> xstat +0 145544 18 ":- syscall <- xstat +0 145544 8 ":- syscall -> resolvepath +0 145544 19 ":- syscall <- resolvepath +0 145544 10 ":- syscall -> open +0 145544 19 ":- syscall <- open +0 145544 10 ":- syscall -> mmap +0 145544 21 ":- syscall <- mmap +0 145544 33 ":- syscall -> mmap +0 145544 13 ":- syscall <- mmap +0 145544 9 ":- syscall -> mmap +0 145544 16 ":- syscall <- mmap +0 145544 8 ":- syscall -> mmap +0 145544 11 ":- syscall <- mmap +0 145544 34 ":- syscall -> munmap +0 145544 11 ":- syscall <- munmap +0 145544 43 ":- syscall -> memcntl +0 145544 13 ":- syscall <- memcntl +0 145544 8 ":- syscall -> close +0 145544 9 ":- syscall <- close +0 145544 30 ":- syscall -> mprotect +0 145544 13 ":- syscall <- mprotect +0 145544 169 ":- syscall -> mprotect +0 145544 13 ":- syscall <- mprotect +0 145544 2 ":- syscall <- nosys +0 145544 280 ":- syscall -> open +0 145544 90 ":- syscall <- open +0 145544 154 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 214 ":- syscall -> ioctl +0 145544 301 ":- syscall <- ioctl +0 145544 186 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 210 ":- syscall -> close +0 145544 18 ":- syscall <- close +0 145544 146 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 208 ":- syscall -> open +0 145544 73 ":- syscall <- open +0 145544 151 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 209 ":- syscall -> ioctl +0 145544 45 ":- syscall <- ioctl +0 145544 171 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 194 ":- syscall -> close +0 145544 17 ":- syscall <- close +0 145544 145 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 203 ":- syscall -> open +0 145544 63 ":- syscall <- open +0 145544 150 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 209 ":- syscall -> ioctl +0 145544 280 ":- syscall <- ioctl +0 145544 185 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 193 ":- syscall -> close +0 145544 17 ":- syscall <- close +0 145544 145 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 230 ":- syscall -> open +0 145544 82 ":- syscall <- open +0 145544 151 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 210 ":- syscall -> ioctl +0 145544 45 ":- syscall <- ioctl +0 145544 171 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 195 ":- syscall -> close +0 145544 18 ":- syscall <- close +0 145544 145 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 204 ":- syscall -> open +0 145544 64 ":- syscall <- open +0 145544 149 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 208 ":- syscall -> ioctl +0 145544 283 ":- syscall <- ioctl +0 145544 184 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 192 ":- syscall -> close +0 145544 17 ":- syscall <- close +0 145544 146 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 209 ":- syscall -> open +0 145544 72 ":- syscall <- open +0 145544 150 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 209 ":- syscall -> ioctl +0 145544 45 ":- syscall <- ioctl +0 145544 171 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 198 ":- syscall -> close +0 145544 17 ":- syscall <- close +0 145544 860 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 223 ":- syscall -> open +0 145544 83 ":- syscall <- open +0 145544 151 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 213 ":- syscall -> ioctl +0 145544 281 ":- syscall <- ioctl +0 145544 187 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 196 ":- syscall -> close +0 145544 19 ":- syscall <- close +0 145544 145 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 209 ":- syscall -> open +0 145544 69 ":- syscall <- open +0 145544 151 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 213 ":- syscall -> ioctl +0 145544 47 ":- syscall <- ioctl +0 145544 173 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 199 ":- syscall -> close +0 145544 18 ":- syscall <- close +0 145544 144 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 212 ":- syscall -> open +0 145544 67 ":- syscall <- open +0 145544 149 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 213 ":- syscall -> ioctl +0 145544 282 ":- syscall <- ioctl +0 145544 187 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 197 ":- syscall -> close +0 145544 59 ":- syscall <- close +0 145544 637 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 222 ":- syscall -> open +0 145544 80 ":- syscall <- open +0 145544 151 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 214 ":- syscall -> ioctl +0 145544 47 ":- syscall <- ioctl +0 145544 172 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 199 ":- syscall -> close +0 145544 19 ":- syscall <- close +0 145544 144 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 205 ":- syscall -> open +0 145544 62 ":- syscall <- open +0 145544 150 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 211 ":- syscall -> ioctl +0 145544 304 ":- syscall <- ioctl +0 145544 190 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 197 ":- syscall -> close +0 145544 17 ":- syscall <- close +0 145544 145 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 211 ":- syscall -> open +0 145544 70 ":- syscall <- open +0 145544 149 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 211 ":- syscall -> ioctl +0 145544 46 ":- syscall <- ioctl +0 145544 172 ":- syscall -> lwp_exit +0 145544 2 ":- syscall <- nosys +0 145544 260 ":- syscall -> close +0 145544 26 ":- syscall <- close +0 145544 160 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 207 ":- syscall -> open +0 145544 79 ":- syscall <- open +0 145544 151 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 216 ":- syscall -> ioctl +0 145544 274 ":- syscall <- ioctl +0 145544 187 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 195 ":- syscall -> close +0 145544 17 ":- syscall <- close +0 145544 145 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 211 ":- syscall -> open +0 145544 70 ":- syscall <- open +0 145544 149 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 214 ":- syscall -> ioctl +0 145544 48 ":- syscall <- ioctl +0 145544 173 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 201 ":- syscall -> close +0 145544 17 ":- syscall <- close +0 145544 145 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 211 ":- syscall -> open +0 145544 65 ":- syscall <- open +0 145544 150 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 213 ":- syscall -> ioctl +0 145544 324 ":- syscall <- ioctl +0 145544 342 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 203 ":- syscall -> close +0 145544 19 ":- syscall <- close +0 145544 145 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 213 ":- syscall -> open +0 145544 76 ":- syscall <- open +0 145544 150 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 214 ":- syscall -> ioctl +0 145544 48 ":- syscall <- ioctl +0 145544 174 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 198 ":- syscall -> close +0 145544 18 ":- syscall <- close +0 145544 146 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 206 ":- syscall -> open +0 145544 63 ":- syscall <- open +0 145544 150 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 213 ":- syscall -> ioctl +0 145544 272 ":- syscall <- ioctl +0 145544 185 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 194 ":- syscall -> close +0 145544 17 ":- syscall <- close +0 145544 146 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 213 ":- syscall -> open +0 145544 70 ":- syscall <- open +0 145544 151 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 214 ":- syscall -> ioctl +0 145544 47 ":- syscall <- ioctl +0 145544 173 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 236 ":- syscall -> close +0 145544 23 ":- syscall <- close +0 145544 156 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 210 ":- syscall -> open +0 145544 76 ":- syscall <- open +0 145544 150 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 214 ":- syscall -> ioctl +0 145544 276 ":- syscall <- ioctl +0 145544 187 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 197 ":- syscall -> close +0 145544 17 ":- syscall <- close +0 145544 145 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 211 ":- syscall -> open +0 145544 71 ":- syscall <- open +0 145544 149 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 214 ":- syscall -> ioctl +0 145544 47 ":- syscall <- ioctl +0 145544 172 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 199 ":- syscall -> close +0 145544 19 ":- syscall <- close +0 145544 144 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 210 ":- syscall -> open +0 145544 64 ":- syscall <- open +0 145544 150 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 212 ":- syscall -> ioctl +0 145544 297 ":- syscall <- ioctl +0 145544 522 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 210 ":- syscall -> close +0 145544 21 ":- syscall <- close +0 145544 146 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 213 ":- syscall -> open +0 145544 79 ":- syscall <- open +0 145544 151 ":- syscall -> lwp_exit +0 145544 0 ":- syscall <- nosys +0 145544 213 ":- syscall -> ioctl +0 145544 47 ":- syscall <- ioctl +0 145544 173 ":- syscall -> lwp_exit +0 145544 1 ":- syscall <- nosys +0 145544 201 ":- syscall -> close +0 145544 19 ":- syscall <- close +0 145544 144 ":- syscall -> lwp_exit +0 145544 91667 ":- syscall -> munmap +0 145544 34 ":- syscall <- munmap +0 145544 65 ":- syscall -> gtime +0 145544 9 ":- syscall <- gtime +0 145544 13 ":- syscall -> open +0 145544 42 ":- syscall <- open +0 145544 10 ":- syscall -> fstat64 +0 145544 9 ":- syscall <- fstat64 +0 145544 8 ":- syscall -> read +0 145544 31 ":- syscall <- read +0 145544 9 ":- syscall -> close +0 145544 11 ":- syscall <- close +0 145544 65 ":- syscall -> llseek +0 145544 9 ":- syscall <- llseek +0 145544 8 ":- syscall -> close +0 145544 9 ":- syscall <- close +0 145544 25 func_abc.py:14 func -> func_a +0 145544 24 ":- syscall -> ioctl +0 145544 9 ":- syscall <- ioctl +0 145544 8 ":- syscall -> fstat64 +0 145544 8 ":- syscall <- fstat64 +0 145544 9 ":- syscall -> fstat64 +0 145544 7 ":- syscall <- fstat64 +0 145544 40 ":- syscall -> pollsys +0 145544 1009424 ":- syscall <- pollsys +0 145544 35 func_abc.py:9 func -> func_b +0 145544 40 ":- syscall -> pollsys +0 145544 1009681 ":- syscall <- pollsys +0 145544 36 func_abc.py:5 func -> func_c +0 145544 41 ":- syscall -> pollsys +Function A +Function B +Function C +0 145544 1000116 ":- syscall <- pollsys +0 145544 34 func_abc.py:7 func <- func_c +0 145544 28 func_abc.py:12 func <- func_b +0 145544 14 func_abc.py:17 func <- func_a +0 145544 14 func_abc.py:19 func <- ? +0 145544 26 ":- syscall -> sigaction +0 145544 15 ":- syscall <- sigaction +0 145544 1150 ":- syscall -> write +0 145544 21 ":- syscall <- write +0 145544 212 ":- syscall -> open64 +0 145544 116 ":- syscall <- open64 +0 145544 11 ":- syscall -> ioctl +0 145544 24 ":- syscall <- ioctl +0 145544 10 ":- syscall -> close +0 145544 16 ":- syscall <- close +0 145544 8 ":- syscall -> open64 +0 145544 32 ":- syscall <- open64 +0 145544 9 ":- syscall -> ioctl +0 145544 169 ":- syscall <- ioctl +0 145544 10 ":- syscall -> close +0 145544 12 ":- syscall <- close +0 145544 62 ":- syscall -> rexit + +Here you can see the output showing the path the script follows as it is +executed. + +0 145544 35 func_abc.py:9 func -> func_b +0 145544 40 ":- syscall -> pollsys +0 145544 1009681 ":- syscall <- pollsys +0 145544 36 func_abc.py:5 func -> func_c + +This excerpt shows line 9 of the script executing. It makes a pollsys syscall +in order to fulfill the request to sleep for one second, returns and then goes +to line 5. Checking the logic flow of the example program, this makes sense. diff --git a/cddl/contrib/dtracetoolkit/Examples/py_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_who_example.txt new file mode 100644 index 00000000000..7d1c3f1c27b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_who_example.txt @@ -0,0 +1,34 @@ +These are examples of the results after running the py_who.d script. + +This script shows which UIDs and PIDs are running Python programs with Python +provider support, and how active they are. It lists the name of the program, +along with the number of lines executed per program as recorded by the line +provider. + +Here it runs as the Code/Python/func_abc.py program is executed. + +# py_who.d +Tracing... Hit Ctrl-C to end. +^C + + PID UID FUNCS FILE + 145442 0 1 /usr/lib/python2.4/encodings/aliases.py + 145442 0 1 /usr/lib/python2.4/linecache.py + 145442 0 2 /usr/lib/python2.4/types.py + 145442 0 4 /usr/lib/python2.4/encodings/__init__.py + 145442 0 4 func_abc.py + 145442 0 5 /usr/lib/python2.4/UserDict.py + 145442 0 5 /usr/lib/python2.4/warnings.py + 145442 0 6 /usr/lib/python2.4/codecs.py + 145442 0 6 /usr/lib/python2.4/encodings/ascii.py + 145442 0 7 /usr/lib/python2.4/copy_reg.py + 145442 0 11 + 145442 0 13 /usr/lib/python2.4/stat.py + 145442 0 14 /usr/lib/python2.4/os.py + 145442 0 36 /usr/lib/python2.4/site.py + 145442 0 115 /usr/lib/python2.4/posixpath.py + +You can see that the program itself had four lines executed attributed to it, +and the other lines in the program were associated with their particular +Python library calls. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_calldist_example.txt new file mode 100644 index 00000000000..088497c5628 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_calldist_example.txt @@ -0,0 +1,153 @@ +The following is an example of running rb_calldist.d and tracing the elapsed +times for functions. + +We run rb_calldist.d while running the program Code/Ruby/func_abc.rb. We can +see that there are three sections in the DTrace output + +# rb_calldist.d +Tracing... Hit Ctrl-C to end. +^C + +Elapsed times (us), + ., obj-new, NoMemoryError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ., obj-new, SystemStackError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ., obj-new, ThreadGroup + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + ., obj-new, fatal + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + ., obj-new, Object + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 4 | 0 + 8 | 0 + 16 |@@@@@@@@@@@@@ 1 + 32 | 0 + + +Exclusive function elapsed times (us), + func_abc.rb, func, Module::method_added + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 4 |@@@@@@@@@@@@@ 1 + 8 | 0 + + func_abc.rb, func, Object::print + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 |@@@@@@@@@@@@@ 1 + 64 | 0 + + func_abc.rb, func, IO::write + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 |@@@@@@@@@@@@@ 1 + 128 | 0 + + func_abc.rb, func, Object::func_a + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + func_abc.rb, func, Object::func_b + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + func_abc.rb, func, Object::func_c + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + func_abc.rb, func, Object::sleep + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 1048576 | 0 + + +Inclusive function elapsed times (us), + func_abc.rb, func, Module::method_added + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 4 |@@@@@@@@@@@@@ 1 + 8 | 0 + + func_abc.rb, func, IO::write + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 |@@@@@@@@@@@@@ 1 + 128 | 0 + + func_abc.rb, func, Object::print + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 128 |@@@@@@@@@@@@@ 1 + 256 | 0 + + func_abc.rb, func, Object::func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_abc.rb, func, Object::func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_abc.rb, func, Object::sleep + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 1048576 | 0 + + func_abc.rb, func, Object::func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + +The elapsed times show us that the script spent some small amount of time +processing various events that were not functions. In this case they were all +obj-new events, and you can see that the slowest of these was a new Object at +between 16 microseconds and 31 microseconds. + +The exclusive subroutine elapsed times show that each of our user defined +functions took between 256 and 511 microseconds. This time excludes the time +spent in other subroutines. + +The inclusive subroutine elapsed times show that func_c() took between 0.5 +seconds and 1 second, func_b() took between 1 second and 2.1 seconds, and +func_a() took between 2.1 seconds and 4.2 seconds to execute. This time +includes the time spent in other subroutines called, and since func_a() called +func_b() which called func_c(), these times make sense. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_calls_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_calls_example.txt new file mode 100644 index 00000000000..acc0d4d4ef7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_calls_example.txt @@ -0,0 +1,29 @@ +The following are examples of the results of running the rb_calls.d script. + +This script traces activity from all Ruby programs on the system that are +running with Ruby provider support. In this example we see it running while +the Code/Ruby/func_abc.rb script is run. + +# rb_calls.d +Tracing... Hit Ctrl-C to end. +^C + FILE TYPE NAME CALLS + . obj-new NoMemoryError 1 + . obj-new SystemStackError 1 + . obj-new ThreadGroup 1 + . obj-new fatal 1 + func_abc.rb method Object::func_a 1 + func_abc.rb method Object::func_b 1 + func_abc.rb method Object::func_c 1 + . obj-new Object 3 + func_abc.rb method IO::write 3 + func_abc.rb method Module::method_added 3 + func_abc.rb method Object::print 3 + func_abc.rb method Object::sleep 3 + +We can see that the file func_abc.rb called each of the user-defined functions +included in the script; func_a, func_b, and func_c. It also called the print +object and sleep amongst other things. Interspersed in the output are calls +to new objects that are not tied to the program func_abc.rb. They are called +from the Ruby engine for some other reason. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_calltime_example.txt new file mode 100644 index 00000000000..7245fec0e7f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_calltime_example.txt @@ -0,0 +1,77 @@ +The following is an example of running rb_calltime.d and tracing the elapsed +times for functions. + +We run rb_calltime.d while running the program Code/Ruby/func_abc.rb. We can +see that there are four sections in the DTrace output + +# rb_calltime.d +Tracing... Hit Ctrl-C to end. +^C + +Count, + FILE TYPE NAME COUNT + . obj-new NoMemoryError 1 + . obj-new SystemStackError 1 + . obj-new ThreadGroup 1 + . obj-new fatal 1 + func_abc.rb func Object::func_a 1 + func_abc.rb func Object::func_b 1 + func_abc.rb func Object::func_c 1 + . obj-new Object 3 + func_abc.rb func IO::write 3 + func_abc.rb func Module::method_added 3 + func_abc.rb func Object::print 3 + func_abc.rb func Object::sleep 3 + - total - 15 + +Elapsed times (us), + FILE TYPE NAME TOTAL + . obj-new SystemStackError 3 + . obj-new NoMemoryError 3 + . obj-new fatal 11 + . obj-new ThreadGroup 13 + . obj-new Object 26 + +Exclusive function elapsed times (us), + FILE TYPE NAME TOTAL + func_abc.rb func Module::method_added 9 + func_abc.rb func Object::print 92 + func_abc.rb func IO::write 185 + func_abc.rb func Object::func_c 344 + func_abc.rb func Object::func_a 379 + func_abc.rb func Object::func_b 383 + func_abc.rb func Object::sleep 3020597 + - total - 3021992 + +Inclusive function elapsed times (us), + FILE TYPE NAME TOTAL + func_abc.rb func Module::method_added 9 + func_abc.rb func IO::write 185 + func_abc.rb func Object::print 277 + func_abc.rb func Object::func_c 1009829 + func_abc.rb func Object::func_b 2019781 + func_abc.rb func Object::sleep 3020597 + func_abc.rb func Object::func_a 3021983 + +The first section, Count, shows us how many times each function associated +with func_abc.rb was called. It also shows other functions called by the Ruby +engine. + +The second section, elapsed times, shows how long each action that was not +calling a function took. + +The third section, exclusive function elapsed times, shows us how many +microseconds the program spends in each function. This does not include the +time spent in any sub-functions called by that particular function. The last +line gives us the total time in microseconds. + +The fourth section, inclusive function elapsed times, are the absolute time +from when the function began to when it completed - which includes off-CPU time +due to other system events such as I/O, scheduling, interrupts, etc. In +particular, for this case it has included the time waiting for the sleep +commands. + +Elapsed times are useful for identifying where latencies are. +See Notes/ALLelapsed_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive function time. diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_cpudist_example.txt new file mode 100644 index 00000000000..718495e394f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_cpudist_example.txt @@ -0,0 +1,199 @@ +The following are examples of rb_cpudist.d. + +This script traces the on-CPU time of Ruby functions and prints a report in +the form of a histogram. Here it traces the example program, +Code/Ruby/func_slow.rb + +# rb_cpudist.d +Tracing... Hit Ctrl-C to end. +^C + +On-CPU times (us), + ., obj-new, NoMemoryError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ., obj-new, SystemStackError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ., obj-new, ThreadGroup + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + ., obj-new, fatal + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + ., obj-new, Object + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 4 | 0 + 8 |@@@@@@@@@@@@@ 1 + 16 | 0 + + +Exclusive function on-CPU times (us), + func_slow.rb, func, Module::method_added + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 2 | 0 + + func_slow.rb, func, Object::print + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8 |@@@@@@@@@@@@@ 1 + 16 | 0 + + func_slow.rb, func, IO::write + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 |@@@@@@@@@@@@@ 1 + 128 | 0 + + func_slow.rb, func, Object::func_a + value ------------- Distribution ------------- count + 131072 | 0 + 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 524288 | 0 + + func_slow.rb, func, Object::func_b + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_slow.rb, func, Fixnum::< + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 599556 + 2 | 72 + 4 | 35 + 8 | 128 + 16 | 158 + 32 | 49 + 64 | 3 + 128 | 2 + 256 | 0 + + func_slow.rb, func, Object::func_c + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_slow.rb, func, Fixnum::+ + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1199062 + 2 | 138 + 4 | 74 + 8 | 279 + 16 | 344 + 32 | 91 + 64 | 9 + 128 | 0 + 256 | 3 + 512 | 0 + + +Inclusive function on-CPU times (us), + func_slow.rb, func, Module::method_added + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 2 | 0 + + func_slow.rb, func, IO::write + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 |@@@@@@@@@@@@@ 1 + 128 | 0 + + func_slow.rb, func, Object::print + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 |@@@@@@@@@@@@@ 1 + 128 | 0 + + func_slow.rb, func, Fixnum::< + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 599556 + 2 | 72 + 4 | 35 + 8 | 128 + 16 | 158 + 32 | 49 + 64 | 3 + 128 | 2 + 256 | 0 + + func_slow.rb, func, Fixnum::+ + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1199062 + 2 | 138 + 4 | 74 + 8 | 279 + 16 | 344 + 32 | 91 + 64 | 9 + 128 | 0 + 256 | 3 + 512 | 0 + + func_slow.rb, func, Object::func_b + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + + func_slow.rb, func, Object::func_c + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + + func_slow.rb, func, Object::func_a + value ------------- Distribution ------------- count + 2097152 | 0 + 4194304 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8388608 | 0 + +You can see that the results are in three sections. + +The first section shows us the on-CPU time for actions that were not of the +type 'func'. + +The second section, Exclusive function on-CPU times, shows us the time spent +on-CPU by various functions, not including time spent in subroutines. You can +see here that Object::print had two instances of being on-CPU between 4 +microseconds and 7 microseconds, and once instance of being on-CPU between 8 +microseconds and 15 microseconds. + +The third section, Inclusive function on-CPU times, shows us the time spent +on-CPU by various functions, including that time spent in subroutines called +by those functions. You can see that here Object::print had two instances +of being on-CPU between 32 microseconds and 63 microseconds, and one instance +of being on-CPU between 64 microseconds and 127 microseconds. + +It is important to pay close attention to the third column, "count" as this +will indicate if there were any instances in a particular timeframe, even if +the number is too small to show up on the histogram clearly. See Inclusive +function on-CPU time for Fixnum::+ for an example. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_cputime_example.txt new file mode 100644 index 00000000000..edfa5aa75da --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_cputime_example.txt @@ -0,0 +1,81 @@ +The following are examples of rb_cputime.d. + +This script traces the on-CPU time of Ruby functions and prints a report. +Here it traces the example program, Code/Ruby/func_slow.rb + +# rb_cputime.d +Tracing... Hit Ctrl-C to end. +^C + +Count, + FILE TYPE NAME COUNT + . obj-new NoMemoryError 1 + . obj-new SystemStackError 1 + . obj-new ThreadGroup 1 + . obj-new fatal 1 + func_slow.rb func Object::func_a 1 + func_slow.rb func Object::func_b 1 + func_slow.rb func Object::func_c 1 + . obj-new Object 3 + func_slow.rb func IO::write 3 + func_slow.rb func Module::method_added 3 + func_slow.rb func Object::print 3 + func_slow.rb func Fixnum::< 600003 + func_slow.rb func Fixnum::+ 1200000 + - total - 1800015 + +Elapsed times (us), + FILE TYPE NAME TOTAL + . obj-new SystemStackError 2 + . obj-new NoMemoryError 2 + . obj-new fatal 11 + . obj-new ThreadGroup 12 + . obj-new Object 19 + +Exclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + func_slow.rb func Module::method_added 4 + func_slow.rb func Object::print 57 + func_slow.rb func IO::write 180 + func_slow.rb func Object::func_a 405946 + func_slow.rb func Fixnum::< 691125 + func_slow.rb func Object::func_b 809970 + func_slow.rb func Object::func_c 1225235 + func_slow.rb func Fixnum::+ 1285200 + - total - 4417721 + +Inclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + func_slow.rb func Module::method_added 4 + func_slow.rb func IO::write 180 + func_slow.rb func Object::print 238 + func_slow.rb func Fixnum::< 691125 + func_slow.rb func Fixnum::+ 1285200 + func_slow.rb func Object::func_c 2212572 + func_slow.rb func Object::func_b 3683688 + func_slow.rb func Object::func_a 4417717 + +You can see the results are printed in four sections. + +The first section reports how many times each subroutine was called, and it's +type. + +The second section reports on the on-CPU time of anything that was not of type +"func", in this case the only elements reported here are of type obj-new. + +The exclusive function on-CPU times shows, amongst other results, that func_a +spent around 0.4 seconds on-CPU. This time excludes time spent in other +subroutines. + +The inclusive function on-CPU times show that func_a spent around 4.4 +seconds on-CPU. This includes the time spent in other subroutines called. + +These on-CPU times are the time the thread spent running on a CPU, from when +the subroutine began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_flow_example.txt new file mode 100644 index 00000000000..6cfa54ff008 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_flow_example.txt @@ -0,0 +1,54 @@ +The following are examples of rb_flow.d. + +This is a simple script to trace the flow of Ruby functions. +Here it traces the example program, Code/Ruby/func_abc.rb + +# rb_flow.d + C TIME(us) FILE -- CLASS::METHOD + 0 3066417516583 func_abc.rb -> Module::method_added + 0 3066417516640 func_abc.rb <- Module::method_added + 0 3066417516658 func_abc.rb -> Module::method_added + 0 3066417516668 func_abc.rb <- Module::method_added + 0 3066417516680 func_abc.rb -> Module::method_added + 0 3066417516689 func_abc.rb <- Module::method_added + 0 3066417516701 func_abc.rb -> Object::func_a + 0 3066417516711 func_abc.rb -> Object::print + 0 3066417516730 func_abc.rb -> IO::write + 0 3066417516832 func_abc.rb <- IO::write + 0 3066417516841 func_abc.rb <- Object::print + 0 3066417516849 func_abc.rb -> Object::sleep + 0 3066418520705 func_abc.rb <- Object::sleep + 0 3066418520727 func_abc.rb -> Object::func_b + 0 3066418520744 func_abc.rb -> Object::print + 0 3066418520753 func_abc.rb -> IO::write + 0 3066418520796 func_abc.rb <- IO::write + 0 3066418520805 func_abc.rb <- Object::print + 0 3066418520813 func_abc.rb -> Object::sleep + 0 3066419530803 func_abc.rb <- Object::sleep + 0 3066419530825 func_abc.rb -> Object::func_c + 0 3066419530842 func_abc.rb -> Object::print + 0 3066419530852 func_abc.rb -> IO::write + 0 3066419530893 func_abc.rb <- IO::write + 0 3066419530902 func_abc.rb <- Object::print + 0 3066419530910 func_abc.rb -> Object::sleep + 0 3066420540804 func_abc.rb <- Object::sleep + 0 3066420540822 func_abc.rb <- Object::func_c + 0 3066420540831 func_abc.rb <- Object::func_b + 0 3066420540840 func_abc.rb <- Object::func_a +^C + +The fourth column is indented by 2 spaces to show when a new function begins. +This shows which function is calling which - the output above begins by adding +new methods, then showing that func_a began; did some print IO; slept, and +returned from sleep; and then called func_b. + +The TIME(us) column shows time from boot in microseconds. + +The FILE column shows the file that was being executed. + +If the output looks illogical, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_flowinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_flowinfo_example.txt new file mode 100644 index 00000000000..14fd851fab4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_flowinfo_example.txt @@ -0,0 +1,54 @@ +Following are examples of rb_flowinfo.d. + +This is a simple script to trace the flow of Ruby methods. Here it traces the +example program, Code/Ruby/func_abc.rb. + +# rb_flowinfo.d +C PID DELTA(us) FILE:LINE TYPE -- NAME +0 146395 2 func_abc.rb:3 method -> Module::method_added +0 146395 26 func_abc.rb:3 method <- Module::method_added +0 146395 25 func_abc.rb:8 method -> Module::method_added +0 146395 11 func_abc.rb:8 method <- Module::method_added +0 146395 16 func_abc.rb:14 method -> Module::method_added +0 146395 10 func_abc.rb:14 method <- Module::method_added +0 146395 15 func_abc.rb:20 method -> Object::func_a +0 146395 12 func_abc.rb:15 method -> Object::print +0 146395 20 func_abc.rb:15 method -> IO::write +0 146395 110 func_abc.rb:15 method <- IO::write +0 146395 11 func_abc.rb:15 method <- Object::print +0 146395 11 func_abc.rb:16 method -> Object::sleep +0 146395 1003728 func_abc.rb:16 method <- Object::sleep +0 146395 35 func_abc.rb:17 method -> Object::func_b +0 146395 20 func_abc.rb:9 method -> Object::print +0 146395 12 func_abc.rb:9 method -> IO::write +0 146395 42 func_abc.rb:9 method <- IO::write +0 146395 11 func_abc.rb:9 method <- Object::print +0 146395 11 func_abc.rb:10 method -> Object::sleep +0 146395 1009976 func_abc.rb:10 method <- Object::sleep +0 146395 35 func_abc.rb:11 method -> Object::func_c +0 146395 20 func_abc.rb:4 method -> Object::print +0 146395 12 func_abc.rb:4 method -> IO::write +0 146395 38 func_abc.rb:4 method <- IO::write +0 146395 11 func_abc.rb:4 method <- Object::print +0 146395 11 func_abc.rb:5 method -> Object::sleep +0 146395 1009883 func_abc.rb:5 method <- Object::sleep +0 146395 29 func_abc.rb:5 method <- Object::func_c +0 146395 12 func_abc.rb:11 method <- Object::func_b +0 146395 11 func_abc.rb:17 method <- Object::func_a +^C + +As each method is entered, the last column is indented by 2 spaces. This +shows which method is calling which. + +The DELTA(us) column shows the change in time from the previous line to the +current line. + +The LINE column shows the line in the file what was being executed. Refer +to the source program to see what this line refers to. + +If the output looks shuffled, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_flowtime_example.txt new file mode 100644 index 00000000000..27102da8ec3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_flowtime_example.txt @@ -0,0 +1,56 @@ +The following are examples of rb_flowtime.d. + +This is a simple script to trace the flow of Ruby methods. +Here it traces the example program, Code/Ruby/func_abc.rb + +# rb_flowtime.d + C TIME(us) FILE DELTA(us) -- CLASS::METHOD + 0 3066547402640 func_abc.rb 2 -> Module::method_added + 0 3066547402662 func_abc.rb 22 <- Module::method_added + 0 3066547402683 func_abc.rb 20 -> Module::method_added + 0 3066547402693 func_abc.rb 9 <- Module::method_added + 0 3066547402707 func_abc.rb 14 -> Module::method_added + 0 3066547402716 func_abc.rb 9 <- Module::method_added + 0 3066547402729 func_abc.rb 12 -> Object::func_a + 0 3066547402740 func_abc.rb 10 -> Object::print + 0 3066547402759 func_abc.rb 18 -> IO::write + 0 3066547402860 func_abc.rb 101 <- IO::write + 0 3066547402871 func_abc.rb 10 <- Object::print + 0 3066547402881 func_abc.rb 10 -> Object::sleep + 0 3066548410630 func_abc.rb 1007749 <- Object::sleep + 0 3066548410660 func_abc.rb 30 -> Object::func_b + 0 3066548410679 func_abc.rb 18 -> Object::print + 0 3066548410689 func_abc.rb 10 -> IO::write + 0 3066548410730 func_abc.rb 40 <- IO::write + 0 3066548410740 func_abc.rb 9 <- Object::print + 0 3066548410749 func_abc.rb 9 -> Object::sleep + 0 3066549420724 func_abc.rb 1009974 <- Object::sleep + 0 3066549420755 func_abc.rb 30 -> Object::func_c + 0 3066549420773 func_abc.rb 18 -> Object::print + 0 3066549420783 func_abc.rb 10 -> IO::write + 0 3066549420825 func_abc.rb 41 <- IO::write + 0 3066549420835 func_abc.rb 9 <- Object::print + 0 3066549420844 func_abc.rb 9 -> Object::sleep + 0 3066550430611 func_abc.rb 1009766 <- Object::sleep + 0 3066550430635 func_abc.rb 24 <- Object::func_c + 0 3066550430645 func_abc.rb 10 <- Object::func_b + 0 3066550430655 func_abc.rb 9 <- Object::func_a +^C + +The fifth column is indented by 2 spaces to show when a new method begins. +This shows which method is calling which. + +The TIME(us) column shows time since boot. + +The DELTA(us) column shows time from that line to the previous line, and +so can be a bit tricky to read. For example, the seventh line of data output +(skipping the header) reads as "the time from func_a beginning to +calling the print method was 10 microseconds". + +The FILE column shows file that was being executed. + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_funccalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_funccalls_example.txt new file mode 100644 index 00000000000..27c9c0c071e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_funccalls_example.txt @@ -0,0 +1,25 @@ +This is a list of examples of the usage of rb_funccalls.d. + +It reports method calls from all Ruby programs on the system that are +running with Ruby provider support. + +Here we run it while the program Code/Ruby/func_abc.rb is executing. + +# rb_funccalls.d +Tracing... Hit Ctrl-C to end. +^C + FILE CLASS METHOD CALLS + func_abc.rb Object func_a 1 + func_abc.rb Object func_b 1 + func_abc.rb Object func_c 1 + func_abc.rb IO write 3 + func_abc.rb Module method_added 3 + func_abc.rb Object print 3 + func_abc.rb Object sleep 3 + +We can see that during that one Ruby program, Our 3 user-defined methods, +func_a, func_b and func_c are called once each. Amongst other calls we can +see that a method from class IO - write, was called three times; probably by +the print method. If you look at the example program Code/Ruby/func_abc.rb, +you can see that 'print' is used three times, but IO::write is never directly +called. diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_lines_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_lines_example.txt new file mode 100644 index 00000000000..544b508f628 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_lines_example.txt @@ -0,0 +1,30 @@ +This simple script uses the line probe to count how many times a line was +executed in a Ruby program. In this example you can see it running on the +Code/Ruby/func_slow.rb program. + +# rb_lines.d +Tracing... Hit Ctrl-C to end. +^C + FILE:LINE COUNT + func_slow.rb:3 1 + func_slow.rb:4 1 + func_slow.rb:5 1 + func_slow.rb:6 1 + func_slow.rb:12 1 + func_slow.rb:13 1 + func_slow.rb:14 1 + func_slow.rb:15 1 + func_slow.rb:19 1 + func_slow.rb:22 1 + func_slow.rb:23 1 + func_slow.rb:24 1 + func_slow.rb:25 1 + func_slow.rb:29 1 + func_slow.rb:32 1 + func_slow.rb:26 100000 + func_slow.rb:27 100000 + func_slow.rb:16 200000 + func_slow.rb:17 200000 + func_slow.rb:7 300000 + func_slow.rb:8 300000 + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_malloc_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_malloc_example.txt new file mode 100644 index 00000000000..e0917c9af7c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_malloc_example.txt @@ -0,0 +1,120 @@ +The following is an example of rb_malloc.d. + +WARNING: This script is not 100% accurate; This prints graphical +representations of libc malloc() byte distributions by "recent" Ruby operation, +which we hope will be usually correct. This is an experimental script that may +be improved over time. + +Here we can see it running on Code/Ruby/func_abc.rb + +# rb_malloc.d -c ./func_abc.rb +Tracing... Hit Ctrl-C to end. +Function A +Function B +Function C +Ruby malloc byte distributions by recent Ruby operation, + func_abc.rb, method, Object::print + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + func_abc.rb, method, Module::method_added + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + ., objnew, fatal + value ------------- Distribution ------------- count + 1 | 0 + 2 |@ 1 + 4 |@ 1 + 8 |@@@ 2 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22 + 32 |@@@@@@ 5 + 64 | 0 + + func_abc.rb, method, IO::write + value ------------- Distribution ------------- count + 2048 | 0 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8192 | 0 + + ., objnew, SystemStackError + value ------------- Distribution ------------- count + 1 | 0 + 2 | 3 + 4 |@@@@ 32 + 8 |@@ 15 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 279 + 32 |@@@ 30 + 64 | 2 + 128 | 0 + + ., objnew, NoMemoryError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@ 3 + 4 |@@@ 17 + 8 |@@@@@@ 37 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@ 146 + 32 |@@ 13 + 64 | 2 + 128 |@@@ 20 + 256 | 0 + 512 | 0 + 1024 | 1 + 2048 | 0 + + ., objnew, ThreadGroup + value ------------- Distribution ------------- count + 1 | 0 + 2 | 8 + 4 |@@@ 224 + 8 |@ 93 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1806 + 32 |@@@@@@@@ 496 + 64 | 3 + 128 | 2 + 256 | 0 + 512 | 1 + 1024 | 0 + + ., objnew, Object + value ------------- Distribution ------------- count + 1 | 0 + 2 | 35 + 4 |@@@ 291 + 8 |@@@ 300 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2679 + 32 |@@ 215 + 64 | 7 + 128 | 0 + + ruby, startup, - + value ------------- Distribution ------------- count + 1 | 0 + 2 |@ 10 + 4 |@@@ 34 + 8 |@@@ 38 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 409 + 32 |@@ 30 + 64 | 1 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 2 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 | 0 + 32768 | 0 + 65536 | 0 + 131072 | 1 + 262144 | 0 + + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_objcpu_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_objcpu_example.txt new file mode 100644 index 00000000000..48e8a78abbc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_objcpu_example.txt @@ -0,0 +1,51 @@ +The following are examples of running rb_objcpu.d. + +The rb_objnew.d script reports the on-CPU time for new Object creation in Ruby +while the script is tracing. Here we see it running while +Code/Ruby/func_abc.rb is executed. + +# rb_objcpu.d +Tracing... Hit Ctrl-C to end. +^C +Total object creation on-CPU time (ms): 0 + +Object creation on-CPU time distributions (us), + + NoMemoryError + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + SystemStackError + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + fatal + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ThreadGroup + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + Object + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@ 1 + 2 |@@@@@@@@@@@@@ 1 + 4 | 0 + 8 |@@@@@@@@@@@@@ 1 + 16 | 0 + +We can see that there were several different types of Objects created +including three of type 'Object', one of which took 1 microsecond, one of +which took 2 to 3 microseconds, and the last of which took between 8 and 15 +microseconds. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_objnew_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_objnew_example.txt new file mode 100644 index 00000000000..340ac9a8cf1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_objnew_example.txt @@ -0,0 +1,21 @@ +The following are examples of running rb_objnew.d. + +The rb_objnew.d script reports the new Ruby objects created (by filename and +class) while the script is tracing. Here we see it running while +Code/Ruby/func_abc.rb is executed. + +# rb_objnew.d +Tracing... Hit Ctrl-C to end. +^C + FILE CLASS COUNT + . NoMemoryError 1 + . SystemStackError 1 + . ThreadGroup 1 + . fatal 1 + . Object 3 + +Since this is a simple example, not many objects were allocated - a few +for the ruby engine, and three of class Object. No file was associated +with these allocations, as they may have been caused by Ruby engine startup, +and not necessarily lines of code in the example program. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_stat_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_stat_example.txt new file mode 100644 index 00000000000..706bf95b15c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_stat_example.txt @@ -0,0 +1,22 @@ +The following are examples of running rb_stat.d on Ruby programs. + +rb_stat.d shows you the number of events per second that have happened since +the last line output. The default interval is 1 second, but you can specify +other intervals as arguments to the script. + +This shows the rb_stat.d script reflecting the Code/Ruby/func_slow.rb script. + +# ./rb_stat.d +TIME EXEC/s METHOD/s OBJNEW/s OBJFRE/s RAIS/s RESC/s GC/s +2007 Sep 17 03:59:07 0 0 0 0 0 0 0 +2007 Sep 17 03:59:08 0 210426 7 0 0 0 0 +2007 Sep 17 03:59:09 0 724067 0 0 0 0 0 +2007 Sep 17 03:59:10 0 730877 0 0 0 0 0 +2007 Sep 17 03:59:11 0 134645 0 0 0 0 0 +2007 Sep 17 03:59:12 0 0 0 0 0 0 0 +2007 Sep 17 03:59:13 0 0 0 0 0 0 0 +^C + +We can see that at 2007 Sep 17 03:59:08 there were 0 new Ruby programs +executed, 210426 methods called, 7 objects created, 0 objects freed, 0 raises, +0 rescues and 0 garbage collects. diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_syscalls_example.txt new file mode 100644 index 00000000000..869884b313c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_syscalls_example.txt @@ -0,0 +1,54 @@ +The following are examples of sh_syscalls.d. + +This is a simple script to count Ruby methods and system calls. Here we trace +an example program - Code/Ruby/func_abc.rb + +# rb_syscalls.d -c ./func_abc.rb +Tracing... Hit Ctrl-C to end. +Function A +Function B +Function C + +Calls for PID 146493, + + FILE TYPE NAME COUNT + func_abc.rb method Object::func_a 1 + func_abc.rb method Object::func_b 1 + func_abc.rb method Object::func_c 1 + func_abc.rb syscall getpid 1 + func_abc.rb syscall getrlimit 1 + func_abc.rb syscall getrlimit64 1 + func_abc.rb syscall mmap 1 + func_abc.rb syscall munmap 1 + func_abc.rb syscall rexit 1 + func_abc.rb syscall schedctl 1 + func_abc.rb syscall sigpending 1 + func_abc.rb syscall sysconfig 1 + func_abc.rb syscall sysi86 1 + func_abc.rb syscall write 1 + func_abc.rb syscall llseek 2 + func_abc.rb syscall read 2 + func_abc.rb syscall setcontext 2 + func_abc.rb method IO::write 3 + func_abc.rb method Module::method_added 3 + func_abc.rb method Object::print 3 + func_abc.rb method Object::sleep 3 + func_abc.rb syscall fstat64 3 + func_abc.rb syscall getgid 3 + func_abc.rb syscall getuid 3 + func_abc.rb syscall ioctl 3 + func_abc.rb syscall pollsys 3 + func_abc.rb syscall close 4 + func_abc.rb syscall lwp_sigmask 4 + func_abc.rb syscall open64 4 + func_abc.rb syscall gtime 6 + func_abc.rb syscall sigaction 12 + func_abc.rb syscall brk 56 + +While tracing, three user-defined functions were called - func_a, func_b and +func_c. There were 3 instances of the IO::write method being called. There +were also many system calls made, including 56 brk()'s, and 12 sigaction()'s. + +This script can provide an insight to how a Ruby program is interacting +with the system, by providing methods and system calls in the same output. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_syscolors_example.txt new file mode 100644 index 00000000000..854016e07e9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_syscolors_example.txt @@ -0,0 +1,331 @@ +The following are examples of rb_syscolors.d. + +This is a simple script to trace the method flow of Ruby functions within a +program, and the system calls made. It renders the output in color ("colour") +using terminal escape sequences (which you can tweak by modifying the script). + +Here it traces the example program, Code/Ruby/func_abc.rb. + +WARNING: This output is full of terminal escape sequences, so if you are +trying to view this through an editor or web browser - it may look awful. +Try viewing this using "more" (although, depending on your terminal, it +still may look awful). + +# rb_syscolors.d -c ./func_abc.rb +C PID DELTA(us) FILE:LINE TYPE -- NAME +0 146499 2 ":- syscall -> munmap +0 146499 35 ":- syscall <- munmap +0 146499 56 ":- syscall -> mmap +0 146499 18 ":- syscall <- mmap +0 146499 41 ":- syscall -> setcontext +0 146499 10 ":- syscall <- setcontext +0 146499 10 ":- syscall -> getrlimit +0 146499 11 ":- syscall <- getrlimit +0 146499 9 ":- syscall -> getpid +0 146499 8 ":- syscall <- getpid +0 146499 66 ":- syscall -> setcontext +0 146499 8 ":- syscall <- setcontext +0 146499 1125 ":- syscall -> sysi86 +0 146499 12 ":- syscall <- sysi86 +0 146499 86 ":- syscall -> open64 +0 146499 89 ":- syscall <- open64 +0 146499 13 ":- syscall -> ioctl +0 146499 35 ":- syscall <- ioctl +0 146499 15 ":- syscall -> close +0 146499 16 ":- syscall <- close +0 146499 141 ":- syscall -> getrlimit64 +0 146499 10 ":- syscall <- getrlimit64 +0 146499 37 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 9 ":- syscall -> brk +0 146499 17 ":- syscall <- brk +0 146499 19 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 11 ":- syscall <- brk +0 146499 495 ":- syscall -> brk +0 146499 11 ":- syscall <- brk +0 146499 9 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 55 ":- syscall -> sysconfig +0 146499 9 ":- syscall <- sysconfig +0 146499 109 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 189 ":- syscall -> brk +0 146499 9 ":- syscall <- brk +0 146499 9 ":- syscall -> brk +0 146499 9 ":- syscall <- brk +0 146499 161 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 9 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 144 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 9 ":- syscall <- brk +0 146499 184 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 9 ":- syscall -> brk +0 146499 9 ":- syscall <- brk +0 146499 129 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 174 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 9 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 145 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 129 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 9 ":- syscall <- brk +0 146499 134 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 135 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 9 ":- syscall <- brk +0 146499 136 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 98 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 9 ":- syscall -> brk +0 146499 9 ":- syscall <- brk +0 146499 132 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 125 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 9 ":- syscall <- brk +0 146499 189 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 413 ":- syscall -> brk +0 146499 11 ":- syscall <- brk +0 146499 9 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 171 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 9 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 137 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 188 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 9 ":- syscall -> brk +0 146499 9 ":- syscall <- brk +0 146499 135 ":- syscall -> sigaction +0 146499 10 ":- syscall <- sigaction +0 146499 10 ":- syscall -> sigaction +0 146499 7 ":- syscall <- sigaction +0 146499 8 ":- syscall -> sigaction +0 146499 7 ":- syscall <- sigaction +0 146499 8 ":- syscall -> sigaction +0 146499 7 ":- syscall <- sigaction +0 146499 8 ":- syscall -> sigaction +0 146499 7 ":- syscall <- sigaction +0 146499 8 ":- syscall -> sigaction +0 146499 8 ":- syscall <- sigaction +0 146499 8 ":- syscall -> sigaction +0 146499 7 ":- syscall <- sigaction +0 146499 9 ":- syscall -> sigaction +0 146499 7 ":- syscall <- sigaction +0 146499 8 ":- syscall -> sigaction +0 146499 7 ":- syscall <- sigaction +0 146499 12 ":- syscall -> sigpending +0 146499 8 ":- syscall <- sigpending +0 146499 15 ":- syscall -> schedctl +0 146499 44 ":- syscall <- schedctl +0 146499 17 ":- syscall -> lwp_sigmask +0 146499 8 ":- syscall <- lwp_sigmask +0 146499 9 ":- syscall -> sigaction +0 146499 8 ":- syscall <- sigaction +0 146499 11 ":- syscall -> lwp_sigmask +0 146499 8 ":- syscall <- lwp_sigmask +0 146499 9 ":- syscall -> lwp_sigmask +0 146499 7 ":- syscall <- lwp_sigmask +0 146499 8 ":- syscall -> sigaction +0 146499 7 ":- syscall <- sigaction +0 146499 8 ":- syscall -> lwp_sigmask +0 146499 7 ":- syscall <- lwp_sigmask +0 146499 65 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 11 ":- syscall <- brk +0 146499 149 ":- syscall -> getuid +0 146499 9 ":- syscall <- getuid +0 146499 12 ":- syscall -> getgid +0 146499 8 ":- syscall <- getgid +0 146499 29 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 184 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 9 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 171 ":- syscall -> brk +0 146499 9 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 10 ":- syscall <- brk +0 146499 48 ":- syscall -> getuid +0 146499 8 ":- syscall <- getuid +0 146499 9 ":- syscall -> getuid +0 146499 7 ":- syscall <- getuid +0 146499 10 ":- syscall -> getgid +0 146499 7 ":- syscall <- getgid +0 146499 8 ":- syscall -> getgid +0 146499 7 ":- syscall <- getgid +0 146499 79 ":- syscall -> open64 +0 146499 31 ":- syscall <- open64 +0 146499 14 ":- syscall -> llseek +0 146499 9 ":- syscall <- llseek +0 146499 9 ":- syscall -> close +0 146499 12 ":- syscall <- close +0 146499 15 ":- syscall -> open64 +0 146499 13 ":- syscall <- open64 +0 146499 21 ":- syscall -> fstat64 +0 146499 11 ":- syscall <- fstat64 +0 146499 22 ":- syscall -> read +0 146499 36 ":- syscall <- read +0 146499 153 ":- syscall -> read +0 146499 10 ":- syscall <- read +0 146499 11 ":- syscall -> llseek +0 146499 8 ":- syscall <- llseek +0 146499 8 ":- syscall -> close +0 146499 9 ":- syscall <- close +0 146499 23 func_abc.rb:3 line --  +0 146499 64 func_abc.rb:3 method -> Module::method_added +0 146499 24 func_abc.rb:3 method <- Module::method_added +0 146499 20 func_abc.rb:8 line --  +0 146499 15 func_abc.rb:8 method -> Module::method_added +0 146499 13 func_abc.rb:8 method <- Module::method_added +0 146499 13 func_abc.rb:14 line --  +0 146499 14 func_abc.rb:14 method -> Module::method_added +0 146499 13 func_abc.rb:14 method <- Module::method_added +0 146499 12 func_abc.rb:20 line --  +0 146499 13 func_abc.rb:20 method -> Object::func_a +0 146499 12 func_abc.rb:15 line --  +0 146499 10 func_abc.rb:15 method -> Object::print +0 146499 22 func_abc.rb:15 method -> IO::write +0 146499 38 ":- syscall -> ioctl +0 146499 11 ":- syscall <- ioctl +0 146499 20 ":- syscall -> fstat64 +0 146499 9 ":- syscall <- fstat64 +0 146499 9 ":- syscall -> brk +0 146499 8 ":- syscall <- brk +0 146499 8 ":- syscall -> brk +0 146499 11 ":- syscall <- brk +0 146499 25 ":- syscall -> fstat64 +0 146499 8 ":- syscall <- fstat64 +0 146499 10 func_abc.rb:15 method <- IO::write +0 146499 13 func_abc.rb:15 method <- Object::print +0 146499 12 func_abc.rb:16 line --  +0 146499 10 func_abc.rb:16 method -> Object::sleep +0 146499 20 ":- syscall -> gtime +0 146499 9 ":- syscall <- gtime +0 146499 24 ":- syscall -> pollsys +0 146499 1006964 ":- syscall <- pollsys +0 146499 26 ":- syscall -> gtime +0 146499 14 ":- syscall <- gtime +0 146499 18 func_abc.rb:16 method <- Object::sleep +0 146499 27 func_abc.rb:17 line --  +0 146499 21 func_abc.rb:17 method -> Object::func_b +0 146499 19 func_abc.rb:9 line --  +0 146499 12 func_abc.rb:9 method -> Object::print +0 146499 14 func_abc.rb:9 method -> IO::write +0 146499 15 func_abc.rb:9 method <- IO::write +0 146499 12 func_abc.rb:9 method <- Object::print +0 146499 12 func_abc.rb:10 line --  +0 146499 9 func_abc.rb:10 method -> Object::sleep +0 146499 12 ":- syscall -> gtime +0 146499 8 ":- syscall <- gtime +0 146499 11 ":- syscall -> pollsys +0 146499 1009739 ":- syscall <- pollsys +0 146499 26 ":- syscall -> gtime +0 146499 14 ":- syscall <- gtime +0 146499 18 func_abc.rb:10 method <- Object::sleep +0 146499 27 func_abc.rb:11 line --  +0 146499 21 func_abc.rb:11 method -> Object::func_c +0 146499 20 func_abc.rb:4 line --  +0 146499 12 func_abc.rb:4 method -> Object::print +0 146499 14 func_abc.rb:4 method -> IO::write +0 146499 15 func_abc.rb:4 method <- IO::write +0 146499 12 func_abc.rb:4 method <- Object::print +0 146499 12 func_abc.rb:5 line --  +0 146499 9 func_abc.rb:5 method -> Object::sleep +0 146499 12 ":- syscall -> gtime +0 146499 8 ":- syscall <- gtime +0 146499 11 ":- syscall -> pollsys +Function A +Function B +Function C +0 146499 1009762 ":- syscall <- pollsys +0 146499 25 ":- syscall -> gtime +0 146499 14 ":- syscall <- gtime +0 146499 19 func_abc.rb:5 method <- Object::sleep +0 146499 26 func_abc.rb:5 method <- Object::func_c +0 146499 13 func_abc.rb:11 method <- Object::func_b +0 146499 13 func_abc.rb:17 method <- Object::func_a +0 146499 33 ":- syscall -> sigaction +0 146499 10 ":- syscall <- sigaction +0 146499 100 ":- syscall -> open64 +0 146499 107 ":- syscall <- open64 +0 146499 10 ":- syscall -> ioctl +0 146499 10 ":- syscall <- ioctl +0 146499 11 ":- syscall -> close +0 146499 17 ":- syscall <- close +0 146499 28 ":- syscall -> write +0 146499 20 ":- syscall <- write +0 146499 11 ":- syscall -> rexit + +Here you can see the output showing the path the program follows in its +execution. + +ie: +0 146499 10 func_abc.rb:16 method -> Object::sleep +0 146499 20 ":- syscall -> gtime +0 146499 9 ":- syscall <- gtime +0 146499 24 ":- syscall -> pollsys +0 146499 1006964 ":- syscall <- pollsys +0 146499 26 ":- syscall -> gtime +0 146499 14 ":- syscall <- gtime +0 146499 18 func_abc.rb:16 method <- Object::sleep +0 146499 27 func_abc.rb:17 line --  +0 146499 21 func_abc.rb:17 method -> Object::func_b +0 146499 19 func_abc.rb:9 line --  +0 146499 12 func_abc.rb:9 method -> Object::print +0 146499 14 func_abc.rb:9 method -> IO::write +0 146499 15 func_abc.rb:9 method <- IO::write +0 146499 12 func_abc.rb:9 method <- Object::print +0 146499 12 func_abc.rb:10 line --  + +shows that on cpu 0 the program is running a sleep command at line 16 of the +func_abc.rb program (the pollsys and gtime syscalls are used in the Ruby +engine to implement sleep). Then func_b runs, and prints a line +(using Object::print which uses IO::write). Notice that the 'write' syscall +does not happen until later. It is probably being buffered by Ruby - you can +confirm this through further DTracing. Notice also tht you can see the output +of the program: + +Function A +Function B +Function C + +in the file happening before the write syscall is run. DTrace does not do its +output in 'real time'. There is a slight delay due to buffering. diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_who_example.txt new file mode 100644 index 00000000000..35c0bb70ede --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rb_who_example.txt @@ -0,0 +1,20 @@ +These are examples of the results after running the rb_who.d script. + +This script shows which UIDs and PIDs are running Ruby programs with Ruby +provider support, and how active they are. It lists the name of the program, +along with the number of lines executed per program as recorded by the line +provider. + +Here it runs as three Ruby programs are executed. Code/Ruby/func_abc.rb runs +twice and Code/Ruby/func_slow.rb once. + +# rb_who.d +Tracing... Hit Ctrl-C to end. +^C + PID UID LINES FILE + 146485 0 12 ./func_abc.rb + 146486 0 12 ./func_abc.rb + 146487 0 1200015 ./func_slow.rb + +You can see that func_abc.rb has twelve lines of executable Ruby code, and +that func_slow.rb has 100,000x that. diff --git a/cddl/contrib/dtracetoolkit/Examples/readbytes_example.txt b/cddl/contrib/dtracetoolkit/Examples/readbytes_example.txt new file mode 100644 index 00000000000..fa2923b1b64 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/readbytes_example.txt @@ -0,0 +1,22 @@ +The following is a demonstration of the readbytes.d script, + + +Here the readbytes.d script is run for a few seconds, then Ctrl-C is hit, + + # readbytes.d + dtrace: description 'sysinfo:::readch ' matched 4 probes + ^C + + mozilla-bin 16 + gnome-smproxy 64 + metacity 64 + dsdm 64 + wnck-applet 64 + xscreensaver 96 + gnome-terminal 900 + ttymon 5952 + Xorg 17544 + +In this interval the Xorg command has successfully read 17.5 Kb, while +ttymon has read 5952 bytes. + diff --git a/cddl/contrib/dtracetoolkit/Examples/readdist_example.txt b/cddl/contrib/dtracetoolkit/Examples/readdist_example.txt new file mode 100644 index 00000000000..42811d8d36a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/readdist_example.txt @@ -0,0 +1,35 @@ +The following is an example of the readdist.d script, + + +Here the readdist.d script is run for a few seconds, then Ctrl-C is hit, + + # readdist.d + dtrace: description 'sysinfo:::readch ' matched 4 probes + ^C + [...] + gnome-terminal + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 15 + 64 |@@@ 1 + 128 | 0 + + Xorg + value ------------- Distribution ------------- count + -1 | 0 + 0 |@@@@@@@@@@@@@@@@@@@ 26 + 1 | 0 + 2 | 0 + 4 | 0 + 8 |@@@@ 6 + 16 |@ 2 + 32 |@ 2 + 64 | 0 + 128 |@@@@@@@@ 11 + 256 |@@@ 4 + 512 | 0 + +This allows us to understand the read behaviour of each process. The +Xorg command has executed 26 reads that returned 0 bytes, through +to 4 reads that were at least 256 bytes (up to 511). + diff --git a/cddl/contrib/dtracetoolkit/Examples/rfileio_example.txt b/cddl/contrib/dtracetoolkit/Examples/rfileio_example.txt new file mode 100644 index 00000000000..dcce81ee4da --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rfileio_example.txt @@ -0,0 +1,94 @@ +The following are demonstrations of the rfileio.d script. + + +rfileio.d prints file system statistics by file, + + # ./rfileio.d + + Read IOPS, top 20 (count) + /lib/ld.so.1 logical 2 + /devices/pseudo/clone@0:ptm logical 4 + /usr/bin/grep logical 4 + /devices/pseudo/pts@0:3 logical 4 + /extra1/contents physical 1700 + /extra1/contents logical 11582 + + Read Bandwidth, top 20 (bytes) + /devices/pseudo/pts@0:3 logical 3 + /devices/pseudo/clone@0:ptm logical 92 + /lib/ld.so.1 logical 212 + /usr/bin/grep logical 269 + /extra1/contents physical 48115712 + /extra1/contents logical 94865162 + + Total File System miss-rate: 50% + ^C + + $ ls -l /extra1/contents + -rw-r--r-- 1 root root 94865162 Nov 2 21:08 /extra1/contents + +The /extra1/contents file was read using the grep command. The output shows +that half of the contents was returned from the cache, the other half from disk +(50% miss-rate). It is 94,865,162 bytes in size, which can be seen both in +the ls -l output and the logical read() bytes reported by rfileio.d. There +were 11,582 logical read() calls, which the disk driver satisfied by using +1,700 disk events (aggregation). + + + +The following demonstrates many files being read. + + # ./rfileio.d + + Read IOPS, top 20 (count) + /usr/bin/amd64/glib-mkenums logical 4 + /usr/bin/amd64/glib-genmarshal physical 4 + /usr/bin/amd64/gdk-pixbuf-query-loaders logical 4 + /usr/bin/amd64/ls logical 5 + /usr/bin/amd64/pargs logical 5 + /usr/bin/amd64/ps logical 5 + /usr/bin/amd64/gconf-merge-tree physical 6 + /usr/bin/amd64/cputrack logical 6 + /usr/bin/amd64/gconftool-2 physical 6 + /usr/bin/amd64/prctl logical 6 + /usr/bin/amd64/prstat logical 6 + /usr/bin/amd64/glib-genmarshal logical 7 + /usr/bin/amd64/truss physical 8 + /usr/bin/amd64/sort logical 9 + /usr/bin/amd64/prex logical 10 + /usr/bin/amd64/gconf-merge-tree logical 13 + /usr/bin/amd64/mdb physical 15 + /usr/bin/amd64/gconftool-2 logical 15 + /usr/bin/amd64/truss logical 26 + /usr/bin/amd64/mdb logical 63 + + Read Bandwidth, top 20 (bytes) + /usr/bin/amd64/prctl logical 36784 + /usr/bin/amd64/prctl physical 36864 + /usr/bin/amd64/prstat logical 44760 + /usr/bin/amd64/prstat physical 45056 + /usr/bin/amd64/glib-genmarshal logical 46064 + /usr/bin/amd64/glib-genmarshal physical 46080 + /usr/bin/amd64/cputrack logical 46912 + /usr/bin/amd64/cputrack physical 47104 + /usr/bin/amd64/sort logical 65120 + /usr/bin/amd64/sort physical 65536 + /usr/bin/amd64/prex logical 80968 + /usr/bin/amd64/prex physical 81920 + /usr/bin/amd64/gconf-merge-tree logical 113592 + /usr/bin/amd64/gconf-merge-tree physical 122880 + /usr/bin/amd64/gconftool-2 logical 129208 + /usr/bin/amd64/gconftool-2 physical 139264 + /usr/bin/amd64/truss logical 246360 + /usr/bin/amd64/truss physical 262144 + /usr/bin/amd64/mdb logical 627456 + /usr/bin/amd64/mdb physical 638976 + + Total File System miss-rate: 81% + ^C + +The miss-rate was 81%, meaning we are returning around 20% of the data from +the cache. Details for the top 20 files read by-bytes and by-count are listed; +this shows the /usr/bin/amd64/mdb file was read() 63 times, causing 15 disk +reads, and while 627,456 bytes were requested, 638,976 bytes were read from +disk (the extra bytes are due to read-ahead and file system metadata). diff --git a/cddl/contrib/dtracetoolkit/Examples/rfsio_example.txt b/cddl/contrib/dtracetoolkit/Examples/rfsio_example.txt new file mode 100644 index 00000000000..858ddf84008 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rfsio_example.txt @@ -0,0 +1,82 @@ +The following are demonstrations of the rfsio.d script. + + + +Here we trace file read() activity that has fully missed the cache and +must be read from disk, + + # ./rfsio.d + + Read IOPS (count) + / logical 7 + /extra1 physical 162 + /boot logical 235 + /boot physical 410 + /extra1 logical 9514 + + Read Bandwidth (bytes) + / logical 533 + /boot logical 1502386 + /boot physical 1512960 + /extra1 physical 97153024 + /extra1 logical 97228668 + + Total File System miss-rate: 100% + ^C + +The miss rate of 100% means that all of the file system activity missed +the cache, and had to read from disk. + + + +The following demonstrates file read() activity to the root filesystem +that mostly returned from the file system cache. + + # ./rfsio.d + + Read IOPS (count) + / physical 1 + /extra1 physical 9 + /devices logical 9 + / logical 15 + /extra1 logical 4096 + + Read Bandwidth (bytes) + /devices logical 9 + / logical 949 + / physical 8192 + /extra1 physical 917504 + /extra1 logical 4194304 + + Total File System miss-rate: 22% + ^C + +The total miss-rate was 22%, which is based on the bytes transferred that +missed the cache. + + + + +Now for an unusual demonstration, + + # ./rfsio.d + + Read IOPS (count) + /devices logical 1 + / logical 10 + /extra1 physical 106 + /extra1 logical 6337 + + Read Bandwidth (bytes) + /devices logical 2 + / logical 961 + /extra1 logical 64846450 + /extra1 physical 66151424 + + Total File System miss-rate: 102% + ^C + +Here the miss-rate is 102%, which indicates that more data was read from +disk than was requested; this can occur due to UFS read-ahead, which +assists the performance of sequential disk activity at the small risk of +reading too much data. diff --git a/cddl/contrib/dtracetoolkit/Examples/runocc_example.txt b/cddl/contrib/dtracetoolkit/Examples/runocc_example.txt new file mode 100644 index 00000000000..53dcb5f9667 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/runocc_example.txt @@ -0,0 +1,53 @@ +The following are demonstrations of the runocc.d script. + + + +Here we run it on a single CPU server that is fairly busy, + + # ./runocc.d + + CPU %runocc + 0 86 + + CPU %runocc + 0 85 + + CPU %runocc + 0 82 + ^C + +The run queue occupancy is around 85%, meaning most of the time there +are runnable threads queued waiting for CPU. + + + +This script is more interesting on a multi-CPU server, + + # ./runocc.d + + CPU %runocc + 1 16 + 3 27 + 0 38 + 2 75 + + CPU %runocc + 0 25 + 2 41 + 3 42 + 1 50 + + CPU %runocc + 3 1 + 0 17 + 2 26 + 1 27 + + CPU %runocc + 3 2 + 2 5 + 0 24 + 1 25 + ^C + +Here there was some degree of saturation, especially on CPU 2 to start with. diff --git a/cddl/contrib/dtracetoolkit/Examples/rwbbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/rwbbypid_example.txt new file mode 100644 index 00000000000..9091adfef85 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rwbbypid_example.txt @@ -0,0 +1,26 @@ +The following is a demonstration of the rwbbypid.d script, + + +Here we run it for a few seconds then hit Ctrl-C, + + # rwbbypid.d + Tracing... Hit Ctrl-C to end. + ^C + PID CMD DIR BYTES + 20347 bash R 22 + 11053 dtrace W 32 + 1532 Xorg W 64 + 20317 sshd R 86 + 20347 bash W 87 + 20317 sshd W 137 + 1659 mozilla-bin R 213 + 20334 sshd R 1232 + 20334 sshd W 1282 + 11054 cp W 18652 + 11054 cp R 18652 + 1532 Xorg R 51112 + 1659 mozilla-bin W 51261 + +In the above output, we can see that mozilla-bin with PID 1659 has written +51261 bytes, while Xorg has read 51112 bytes. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rwbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/rwbypid_example.txt new file mode 100644 index 00000000000..0c8559b45da --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rwbypid_example.txt @@ -0,0 +1,19 @@ +The following is a demonstration of the rwbypid.d script, + + +Here we run it for a few seconds then hit Ctrl-C, + + # rwbypid.d + Tracing... Hit Ctrl-C to end. + ^C + PID CMD DIR COUNT + 11131 dtrace W 2 + 20334 sshd W 17 + 20334 sshd R 24 + 1532 Xorg W 69 + 1659 mozilla-bin R 852 + 1659 mozilla-bin W 1128 + 1532 Xorg R 1702 + +In the above output, we can see that Xorg with PID 1532 has made 1702 reads. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rwbytype_example.txt b/cddl/contrib/dtracetoolkit/Examples/rwbytype_example.txt new file mode 100644 index 00000000000..118cf1657c6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rwbytype_example.txt @@ -0,0 +1,37 @@ +The following is an example fo the rwbytype.d script. + + +We run rwbytype.d for a few seconds then hit Ctrl-C, + + # rwbytype.d + Tracing... Hit Ctrl-C to end. + ^C + PID CMD VTYPE DIR BYTES + 1545 sshd chr W 1 + 10357 more chr R 30 + 2357 sshd chr W 31 + 10354 dtrace chr W 32 + 1545 sshd chr R 34 + 6778 bash chr W 44 + 1545 sshd sock R 52 + 405 poold reg W 68 + 1545 sshd sock W 136 + 10357 bash reg R 481 + 10356 find reg R 481 + 10355 bash reg R 481 + 10357 more reg R 1652 + 2357 sshd sock R 1664 + 10357 more chr W 96925 + 10357 more fifo R 97280 + 2357 sshd chr R 98686 + 10356 grep fifo W 117760 + 2357 sshd sock W 118972 + 10356 grep reg R 147645 + +Here we can see that the grep process with PID 10356 read 147645 bytes +from "regular" files. These are I/O bytes at the application level, so +much of these read bytes would have been cached by the filesystem page cache. + +vnode file types are listed in /usr/include/sys/vnode.h, and give an idea of +what the file descriptor refers to. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rwsnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/rwsnoop_example.txt new file mode 100644 index 00000000000..2ef26ababd9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rwsnoop_example.txt @@ -0,0 +1,98 @@ +The following is a demonstration of the rwsnoop program, + + +Here we run it for about a second, + + # rwsnoop + UID PID CMD D BYTES FILE + 100 20334 sshd R 52 + 100 20334 sshd W 1 /devices/pseudo/clone@0:ptm + 0 20320 bash W 1 /devices/pseudo/pts@0:12 + 100 20334 sshd R 2 /devices/pseudo/clone@0:ptm + 100 20334 sshd W 52 + 0 2848 ls W 58 /devices/pseudo/pts@0:12 + 0 2848 ls W 68 /devices/pseudo/pts@0:12 + 0 2848 ls W 57 /devices/pseudo/pts@0:12 + 0 2848 ls W 67 /devices/pseudo/pts@0:12 + 0 2848 ls W 48 /devices/pseudo/pts@0:12 + 0 2848 ls W 49 /devices/pseudo/pts@0:12 + 0 2848 ls W 33 /devices/pseudo/pts@0:12 + 0 2848 ls W 41 /devices/pseudo/pts@0:12 + 100 20334 sshd R 429 /devices/pseudo/clone@0:ptm + 100 20334 sshd W 468 + ^C + +The output scrolls rather fast. Above, we can see an ls command was run, +and we can see as ls writes each line. The "" read/writes are +socket activity, which have no corresponding filename. + + +For a summary style output, use the rwtop program. + + + +If a particular program is of interest, the "-n" option can be used +to match on process name. Here we match on "bash" during a login where +the user uses the bash shell as their default, + + # rwsnoop -n bash + UID PID CMD D BYTES FILE + 100 2854 bash R 757 /etc/nsswitch.conf + 100 2854 bash R 0 /etc/nsswitch.conf + 100 2854 bash R 668 /etc/passwd + 100 2854 bash R 980 /etc/profile + 100 2854 bash W 15 /devices/pseudo/pts@0:14 + 100 2854 bash R 10 /export/home/brendan/.bash_profile + 100 2854 bash R 867 /export/home/brendan/.bashrc + 100 2854 bash R 980 /etc/profile + 100 2854 bash W 15 /devices/pseudo/pts@0:14 + 100 2854 bash R 8951 /export/home/brendan/.bash_history + 100 2854 bash R 8951 /export/home/brendan/.bash_history + 100 2854 bash R 1652 /usr/share/lib/terminfo/d/dtterm + 100 2854 bash W 41 /devices/pseudo/pts@0:14 + 100 2854 bash R 1 /devices/pseudo/pts@0:14 + 100 2854 bash W 1 /devices/pseudo/pts@0:14 + 100 2854 bash W 41 /devices/pseudo/pts@0:14 + 100 2854 bash R 1 /devices/pseudo/pts@0:14 + 100 2854 bash W 7 /devices/pseudo/pts@0:14 + +In the above, various bash related files such as ".bash_profile" and +".bash_history" can be seen. The ".bashrc" is also read, as it was sourced +from the .bash_profile. + + + +Extra options with rwsnoop allow us to print zone ID, project ID, timestamps, +etc. Here we use "-v" to see the time printed, and match on "ps" processes, + + # rwsnoop -vn ps + TIMESTR UID PID CMD D BYTES FILE + 2005 Jul 24 04:23:45 0 2804 ps R 168 /proc/2804/auxv + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/2804/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 1495 /etc/ttysrch + 2005 Jul 24 04:23:45 0 2804 ps W 28 /devices/pseudo/pts. + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/0/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/1/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/2/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/3/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/218/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/7/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/9/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/360/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/91/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/112/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/307/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/226/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/242/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/228/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/243/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/234/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/119/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/143/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/361/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/20314/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/116/psinfo + [...] + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/rwtop_example.txt b/cddl/contrib/dtracetoolkit/Examples/rwtop_example.txt new file mode 100644 index 00000000000..728431243f8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rwtop_example.txt @@ -0,0 +1,59 @@ +The following is a demonstration of the rwtop program, + + +By default it will refresh the screen every 5 seconds, + + # rwtop + 2005 Jul 24 01:00:43, load: 1.02, app_r: 8 KB, app_w: 19 KB + + UID PID PPID CMD D BYTES + 0 20320 20347 bash R 10 + 0 20320 20347 bash W 95 + 100 20317 20314 sshd R 650 + 100 20317 20314 sshd W 733 + 0 2365 20320 ls W 1300 + 0 2364 20320 vi R 2323 + 0 2365 20320 ls R 2485 + 100 20334 20331 sshd R 3010 + 100 20334 20331 sshd W 3729 + 0 2364 20320 vi W 14128 + +In the above output, we can see that a "vi" process wrote 14 Kbytes and +read 2 Kbytes. + + + +In the following example, we print the top 5 processes in a scrolling +output by using "-C" to not clear the screen, + + # rwtop -C -t5 + Tracing... Please wait. + 2005 Jul 24 01:03:27, load: 1.05, app_r: 261 KB, app_w: 348 KB + + UID PID PPID CMD D BYTES + 0 2381 20320 svcs W 5801 + 0 9 1 svc.configd R 115712 + 0 2380 20320 find W 140003 + 100 20334 20331 sshd R 150740 + 100 20334 20331 sshd W 210773 + + 2005 Jul 24 01:03:32, load: 1.07, app_r: 110 KB, app_w: 233 KB + + UID PID PPID CMD D BYTES + 100 20317 20314 sshd R 419 + 100 20317 20314 sshd W 468 + 0 2382 20320 find W 110720 + 100 20334 20331 sshd R 112835 + 100 20334 20331 sshd W 128175 + + 2005 Jul 24 01:03:37, load: 1.07, app_r: 6 KB, app_w: 7 KB + + UID PID PPID CMD D BYTES + 0 2383 20320 df W 1154 + 0 2385 20320 ls W 1300 + 0 2385 20320 ls R 2485 + 100 20334 20331 sshd R 3929 + 100 20334 20331 sshd W 4339 + + ^C + diff --git a/cddl/contrib/dtracetoolkit/Examples/sampleproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/sampleproc_example.txt new file mode 100644 index 00000000000..d60d44644b7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sampleproc_example.txt @@ -0,0 +1,62 @@ +The following is an example of the sampleproc program. + + +Here we run sampleproc for a few seconds on a workstation, + + # ./sampleproc + Sampling at 100 hertz... Hit Ctrl-C to end. + ^C + PID CMD COUNT + 1659 mozilla-bin 3 + 109 nscd 4 + 2197 prstat 23 + 2190 setiathome 421 + + PID CMD PERCENT + 1659 mozilla-bin 0 + 109 nscd 0 + 2197 prstat 5 + 2190 setiathome 93 + +The first table shows a count of how many times each process was sampled +on the CPU. The second table gives this as a percentage. + +setiathome was on the CPU 421 times, which is 93% of the samples. + + + + +The following is sampleproc running on a server with 4 CPUs. A bash shell +is running in an infinate loop, + + # ./sampleproc + Sampling at 100 hertz... Hit Ctrl-C to end. + ^C + PID CMD COUNT + 10140 dtrace 1 + 28286 java 1 + 29345 esd 2 + 29731 esd 3 + 2 pageout 4 + 29733 esd 6 + 10098 bash 1015 + 0 sched 3028 + + PID CMD PERCENT + 10140 dtrace 0 + 28286 java 0 + 29345 esd 0 + 29731 esd 0 + 2 pageout 0 + 29733 esd 0 + 10098 bash 24 + 0 sched 74 + +The bash shell was on the CPUs for 24% of the time, which is consistant +with a CPU bound single threaded application on a 4 CPU server. + +The above sample was around 10 seconds long. During this time, there were +around 4000 samples (checking the COUNT column), this is due to +4000 = CPUs (4) * Hertz (100) * Seconds (10). + + diff --git a/cddl/contrib/dtracetoolkit/Examples/sar-c_example.txt b/cddl/contrib/dtracetoolkit/Examples/sar-c_example.txt new file mode 100644 index 00000000000..7669eba5b61 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sar-c_example.txt @@ -0,0 +1,55 @@ +The following is a demonstration of the sar-c.d script. + + +Here we run both sar-c.d and "sar -c 1 100" at the same time, to compare +outputs. + +The DTrace script, + + # ./sar-c.d + Time scall/s sread/s swrit/s fork/s exec/s rchar/s wchar/s + 2005 Jun 14 02:40:24 1556 82 71 0.00 0.00 10262 10508 + 2005 Jun 14 02:40:25 1553 88 75 0.00 0.00 15095 15341 + 2005 Jun 14 02:40:26 1596 89 76 0.00 0.00 14885 15131 + 2005 Jun 14 02:40:27 5395 290 154 9.00 10.00 185991 77219 + 2005 Jun 14 02:40:28 1755 91 98 1.00 1.00 15421 16788 + 2005 Jun 14 02:40:29 1757 100 91 1.00 1.00 17127 17462 + 2005 Jun 14 02:40:30 1603 95 80 0.00 0.00 16767 16634 + 2005 Jun 14 02:40:31 14380 83 2420 1.00 1.00 14556 126461 + 2005 Jun 14 02:40:32 10573 88 1586 0.00 0.00 14222 87888 + 2005 Jun 14 02:40:33 1645 87 76 0.00 0.00 15320 15608 + 2005 Jun 14 02:40:34 2099 167 130 0.00 0.00 126295 74281 + 2005 Jun 14 02:40:35 1559 79 67 0.00 0.00 11663 11977 + [...] + +The original command, + + $ sar -c 1 100 + + SunOS jupiter 5.10 Generic i86pc 06/14/2005 + + 02:40:23 scall/s sread/s swrit/s fork/s exec/s rchar/s wchar/s + 02:40:24 1549 86 74 0.00 0.00 14799 15040 + 02:40:25 1552 85 73 0.00 0.00 14475 14719 + 02:40:26 5479 300 161 9.00 10.00 186755 77983 + 02:40:27 1725 86 94 0.99 0.99 14819 16172 + 02:40:28 1596 96 82 0.00 0.00 16521 16762 + 02:40:29 1716 93 85 1.00 1.00 16395 16730 + 02:40:30 1579 88 75 0.00 0.00 15324 15192 + 02:40:32 23036 79 3887 0.99 0.99 10113 193520 + 02:40:33 1756 94 83 0.00 0.00 14935 15300 + 02:40:34 2099 165 130 0.00 0.00 125051 73552 + 02:40:35 1560 82 69 0.00 0.00 15976 16287 + [...] + +We can see that both tools are producing similar data. + +The DTrace output lacks the "summary since boot" line, as it is not using +Kstat to fetch this data. + + +The sar-c.d script is not intended itself as a useful program, rather it +is intended as a starting point for other DTrace scripts; a starting point +of familiar statistics to provide the programmer with a "common ground" +of knowledge. + diff --git a/cddl/contrib/dtracetoolkit/Examples/seeksize_example.txt b/cddl/contrib/dtracetoolkit/Examples/seeksize_example.txt new file mode 100644 index 00000000000..ba41a87e847 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/seeksize_example.txt @@ -0,0 +1,197 @@ +The following are examples of seeksize.d. + +seeksize.d records disk head seek size for each operation by process. +This allows up to identify processes that are causing "random" disk +access and those causing "sequential" disk access. + +It is desirable for processes to be accesing the disks in large +sequential operations. By using seeksize.d and bitesize.d we can +identify this behaviour. + + + +In this example we read through a large file by copying it to a +remote server. Most of the seek sizes are zero, indicating sequential +access - and we would expect good performance from the disks +under these conditions, + +# ./seeksize.d +Tracing... Hit Ctrl-C to end. +^C + + 22349 scp /dl/sol-10-b63-x86-v1.iso mars:\0 + + value ------------- Distribution ------------- count + -1 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 726 + 1 | 0 + 2 | 0 + 4 | 0 + 8 |@ 13 + 16 | 4 + 32 | 0 + 64 | 0 + 128 | 2 + 256 | 3 + 512 | 4 + 1024 | 4 + 2048 | 3 + 4096 | 0 + 8192 | 3 + 16384 | 0 + 32768 | 1 + 65536 | 0 + + + +In this example we run find. The disk operations are fairly scattered, +as illustrated below by the volume of non sequential reads, + +# ./seeksize.d +Tracing... Hit Ctrl-C to end. +^C + + 22399 find /var/sadm/pkg/\0 + + value ------------- Distribution ------------- count + -1 | 0 + 0 |@@@@@@@@@@@@@ 1475 + 1 | 0 + 2 | 44 + 4 |@ 77 + 8 |@@@ 286 + 16 |@@ 191 + 32 |@ 154 + 64 |@@ 173 + 128 |@@ 179 + 256 |@@ 201 + 512 |@@ 186 + 1024 |@@ 236 + 2048 |@@ 201 + 4096 |@@ 274 + 8192 |@@ 243 + 16384 |@ 154 + 32768 |@ 113 + 65536 |@@ 182 + 131072 |@ 81 + 262144 | 0 + + + + +I found the following interesting. This time I gzipp'd the large file. +While zipping, the process is reading from one location and writing +to another. One might expect that as the program toggles between +reading from one location and writing to another, that often the +distance would be the same (depending on where UFS puts the new file), + +# ./seeksize.d +Tracing... Hit Ctrl-C to end. +^C + + 22368 gzip sol-10-b63-x86-v1.iso\0 + + value ------------- Distribution ------------- count + -1 | 0 + 0 |@@@@@@@@@@@@ 353 + 1 | 0 + 2 | 0 + 4 | 0 + 8 | 7 + 16 | 4 + 32 | 2 + 64 | 4 + 128 | 14 + 256 | 3 + 512 | 3 + 1024 | 5 + 2048 | 1 + 4096 | 0 + 8192 | 3 + 16384 | 1 + 32768 | 1 + 65536 | 1 + 131072 | 1 + 262144 |@@@@@@@@ 249 + 524288 | 1 + 1048576 | 2 + 2097152 | 1 + 4194304 | 2 + 8388608 |@@@@@@@@@@@@@@@@@@ 536 + 16777216 | 0 + + + + +The following example compares the operation of "find" with "tar". +Both are reading from the same location, and we would expect that +both programs would generally need to do the same number of seeks +to navigate the direttory tree (depending on caching); and tar +causing extra operations as it reads the file contents as well, + +# ./seeksize.d +Tracing... Hit Ctrl-C to end. +^C + + PID CMD + 22278 find /etc\0 + + value ------------- Distribution ------------- count + -1 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@ 251 + 1 | 0 + 2 |@ 8 + 4 | 5 + 8 |@ 10 + 16 |@ 10 + 32 |@ 10 + 64 |@ 9 + 128 |@ 11 + 256 |@ 14 + 512 |@@ 20 + 1024 |@ 10 + 2048 | 6 + 4096 |@ 7 + 8192 |@ 10 + 16384 |@ 16 + 32768 |@@ 21 + 65536 |@@ 28 + 131072 |@ 7 + 262144 |@ 14 + 524288 | 6 + 1048576 |@ 15 + 2097152 |@ 7 + 4194304 | 0 + + + 22282 tar cf /dev/null /etc\0 + + value ------------- Distribution ------------- count + -1 | 0 + 0 |@@@@@@@@@@ 397 + 1 | 0 + 2 | 8 + 4 | 14 + 8 | 16 + 16 |@ 24 + 32 |@ 29 + 64 |@@ 99 + 128 |@@ 73 + 256 |@@ 78 + 512 |@@@ 109 + 1024 |@@ 62 + 2048 |@@ 69 + 4096 |@@ 73 + 8192 |@@@ 113 + 16384 |@@ 81 + 32768 |@@@ 111 + 65536 |@@@ 108 + 131072 |@ 49 + 262144 |@ 33 + 524288 | 20 + 1048576 | 13 + 2097152 | 7 + 4194304 | 5 + 8388608 |@ 30 + 16777216 | 0 + diff --git a/cddl/contrib/dtracetoolkit/Examples/setuids_example.txt b/cddl/contrib/dtracetoolkit/Examples/setuids_example.txt new file mode 100644 index 00000000000..be197bf4b56 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/setuids_example.txt @@ -0,0 +1,28 @@ +The following is an example of setuids.d. Login events in particular can +be seen, along with use of the "su" command. + + # ./setuids.d + UID SUID PPID PID PCMD CMD + 0 100 3037 3040 in.telnetd login -p -h mars -d /dev/pts/12 + 100 0 3040 3045 bash su - + 0 102 3045 3051 sh su - fred + 0 100 3055 3059 sshd /usr/lib/ssh/sshd + 0 100 3065 3067 in.rlogind login -d /dev/pts/12 -r mars + 0 100 3071 3073 in.rlogind login -d /dev/pts/12 -r mars + 0 102 3078 3081 in.telnetd login -p -h mars -d /dev/pts/12 + ^C + +The first line is a telnet login to the user brendan, UID 100. The parent +command is "in.telnetd", the telnet daemon spawned by inetd, and the +command that in.telnetd runs is "login". + +The second line shows UID 100 using the "su" command to become root. + +The third line has the root user using "su" to become fred, UID 102. + +The fourth line is an example of an ssh login. + +The fifth and sixth lines are examples of rsh and rlogin. + +The last line is another example of a telnet login for fred, UID 102. + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_calldist_example.txt new file mode 100644 index 00000000000..6c6a01faedb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_calldist_example.txt @@ -0,0 +1,309 @@ +The following are examples of sh_calldist.d. + +This script traces the elapsed time of Bourne shell functions and +prints a report containing distribution plots per function. Here it +traces the example program, Code/Shell/func_abc.sh. + + # sh_calldist.d + Tracing... Hit Ctrl-C to end. + ^C + + Elapsed times (us), + + func_abc.sh, builtin, echo + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@ 1 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + func_abc.sh, cmd, sleep + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 1048576 | 0 + + Exclusive function elapsed times (us), + + func_abc.sh, func, func_a + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + func_abc.sh, func, func_b + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + func_abc.sh, func, func_c + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + Inclusive function elapsed times (us), + + func_abc.sh, func, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_abc.sh, func, func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_abc.sh, func, func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + +The elapsed times show that the echo builtin takes between 16 and 64 us +to execute. + +The exclusive function elapsed times show that each function spent +between 2 and 4 ms. This exclusive time excludes the time spent in +other functions. + +The inclusive function elapsed times show that func_c() took between 0.5 and +1.0 seconds, func_b() took between 1.0 and 2.1 seconds, and func_a() took +between 2.1 and 4.2 seconds to execute. This inclusive time includes the +time spent in other functions and commands called, and since func_a() +calls func_b() which calls func_c(), and, each function is calling "sleep 1", +these times make sense. + +These elapsed times are the absolute time from when the function began to +when it completed - which includes off-CPU time due to other system events +such as I/O, scheduling, interrupts, etc. + +Elapsed times are useful for identifying where latencies are. +See Notes/ALLelapsed_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive function time. + + + +The following traces the firefox startup script. + +# sh_calldist.d +Tracing... Hit Ctrl-C to end. +^C + +Elapsed times (us), + + run-mozilla.sh, builtin, return + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + run-mozilla.sh, builtin, shift + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + run-mozilla.sh, builtin, break + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + firefox, builtin, break + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + run-mozilla.sh, builtin, export + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@ 1 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 4 | 0 + + firefox, builtin, export + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 4 |@@@@@@@@@@@@@ 1 + 8 | 0 + + firefox, builtin, : + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 2 | 0 + 4 |@@@@@@@ 1 + 8 | 0 + + firefox, builtin, pwd + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + firefox, builtin, test + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + firefox, builtin, cd + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@ 1 + 16 |@@@@@@@@@@@@@ 1 + 32 |@@@@@@@@@@@@@ 1 + 64 | 0 + + firefox, builtin, [ + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@ 3 + 2 |@@ 1 + 4 |@@ 1 + 8 |@@@@@@@ 3 + 16 |@@@@@@@@@@@ 5 + 32 |@@@@@@@ 3 + 64 |@@@@ 2 + 128 | 0 + + run-mozilla.sh, builtin, type + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + run-mozilla.sh, builtin, [ + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@ 4 + 2 |@@@@@@@@@@ 5 + 4 |@@@@ 2 + 8 |@@@@@@ 3 + 16 |@@@@@@@@@@ 5 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 |@@ 1 + 4096 | 0 + + firefox, builtin, echo + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + firefox, cmd, /usr/lib/firefox/run-mozilla.sh + value ------------- Distribution ------------- count + 2097152 | 0 + 4194304 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8388608 | 0 + + run-mozilla.sh, cmd, /usr/lib/firefox/firefox-bin + value ------------- Distribution ------------- count + 2097152 | 0 + 4194304 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8388608 | 0 + +Exclusive function elapsed times (us), + + run-mozilla.sh, func, moz_test_binary + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + firefox, func, moz_spc_verbose_echo + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@ 2 + 8 |@@@@@@@@@@@@@ 2 + 16 |@@@@@@@@@@@@@ 2 + 32 | 0 + + firefox, func, moz_pis_startstop_scripts + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@ 1 + 65536 | 0 + + run-mozilla.sh, func, moz_run_program + value ------------- Distribution ------------- count + 65536 | 0 + 131072 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 262144 | 0 + +Inclusive function elapsed times (us), + + firefox, func, moz_spc_verbose_echo + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 16 |@@@@@@@@@@@@@ 2 + 32 | 0 + + run-mozilla.sh, func, moz_test_binary + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + firefox, func, moz_pis_startstop_scripts + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 | 0 + 32768 |@@@@@@@@@@@@@@@@@@@@ 1 + 65536 | 0 + + run-mozilla.sh, func, moz_run_program + value ------------- Distribution ------------- count + 2097152 | 0 + 4194304 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8388608 | 0 + + +As an example of interpreting the output: the inclusive elapsed time for +the "[" (test) builtin, + + firefox, builtin, [ + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@ 3 + 2 |@@ 1 + 4 |@@ 1 + 8 |@@@@@@@ 3 + 16 |@@@@@@@@@@@ 5 + 32 |@@@@@@@ 3 + 64 |@@@@ 2 + 128 | 0 + +shows that it was called 17 times (after adding up the counts), 5 of which +took between 16 and 31 microseconds. + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_calls_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_calls_example.txt new file mode 100644 index 00000000000..064cf977936 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_calls_example.txt @@ -0,0 +1,60 @@ +The following are examples of sh_calls.d. + +This is a simple script to count Bourne shell calls. Here it traces an +example program, Code/Perl/func_abc.sh. + + # sh_calls.d + Tracing... Hit Ctrl-C to end. + ^C + FILE TYPE NAME COUNT + func_abc.sh func func_a 1 + func_abc.sh func func_b 1 + func_abc.sh func func_c 1 + func_abc.sh builtin echo 3 + func_abc.sh cmd sleep 3 + +While tracing, function func_a() from the program "func_abc.sh" was executed +once, along with func_b() and func_c(). The "echo" builtin was called 3 +times, as was the "sleep" command. + + +The following traced the firefox start script, + + # sh_calls.d + Tracing... Hit Ctrl-C to end. + ^C + FILE TYPE NAME COUNT + firefox builtin . 1 + firefox builtin break 1 + firefox builtin exit 1 + firefox builtin pwd 1 + firefox builtin test 1 + firefox cmd /usr/lib/firefox/run-mozilla.sh 1 + run-mozilla.sh builtin break 1 + run-mozilla.sh builtin exit 1 + run-mozilla.sh builtin return 1 + run-mozilla.sh builtin shift 1 + run-mozilla.sh builtin type 1 + run-mozilla.sh cmd /usr/lib/firefox/firefox-bin 1 + run-mozilla.sh func moz_run_program 1 + run-mozilla.sh func moz_test_binary 1 + firefox builtin echo 2 + firefox func moz_pis_startstop_scripts 2 + firefox builtin cd 3 + firefox builtin export 3 + run-mozilla.sh builtin export 3 + firefox builtin : 6 + firefox func moz_spc_verbose_echo 6 + run-mozilla.sh subsh - 9 + firefox builtin [ 18 + firefox subsh - 20 + run-mozilla.sh builtin [ 20 + +The firefox start script called run-mozilla.sh, which can be seen both +as a "cmd" call in the above output from the "firefox" script, and as +additionall calls from the "run-mozilla.sh" script. + +The builtin called "[" is the test builtin, and was called 20 times by +"run-mozilla.sh" and 18 times by "firefox". The "firefox" script also called +20 subshells. + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_calltime_example.txt new file mode 100644 index 00000000000..5c39ae404f0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_calltime_example.txt @@ -0,0 +1,144 @@ +The following are examples of sh_calltime.d. + +This script traces the elapsed time of Bourne shell functions and +prints a report. Here it traces the example program, Code/Shell/func_abc.sh. + + # sh_calltime.d + Tracing... Hit Ctrl-C to end. + ^C + + Counts, + FILE TYPE NAME COUNT + func_abc.sh func func_a 1 + func_abc.sh func func_b 1 + func_abc.sh func func_c 1 + func_abc.sh builtin echo 3 + func_abc.sh cmd sleep 3 + - total - 9 + + Elapsed times (us), + FILE TYPE NAME TOTAL + func_abc.sh builtin echo 108 + func_abc.sh cmd sleep 3023760 + - total - 3023868 + + Exclusive function elapsed times (us), + FILE TYPE NAME TOTAL + func_abc.sh func func_b 2629 + func_abc.sh func func_c 2822 + func_abc.sh func func_a 3249 + - total - 8702 + + Inclusive function elapsed times (us), + FILE TYPE NAME TOTAL + func_abc.sh func func_c 1009659 + func_abc.sh func func_b 2020077 + func_abc.sh func func_a 3032571 + +In total, three functions were called, one builtin and one command. + +The elapsed times show that 3.0 seconds was spent in the sleep command, +which is what would be expected based on the script. + +The exclusive function elapsed times show that each function spent around +2.7 milliseconds of time processing code - while not in other functions. + +The inclusive function elapsed times show that func_a() took around 3.0 +seconds to execute, followed by func_b() at 2.0 seconds, and func_c() at 1.0. +The inclusive time includes the time spent in other calls, and since +func_a() called func_b() which called func_c(), and they all call "sleep 1", +these times make sense. + +These elapsed times are the absolute time from when the function began to +when it completed - which includes off-CPU time due to other system events +such as I/O, scheduling, interrupts, etc. In particular, for this case it has +included the time waiting for the sleep commands. + +Elapsed times are useful for identifying where latencies are. +See Notes/ALLelapsed_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive function time. + +If you study the func_abc.sh program alongside the above output, the numbers +should make sense. + + + +The following traces the firefox start script. + +# sh_calltime.d +Tracing... Hit Ctrl-C to end. +^C + +Counts, + FILE TYPE NAME COUNT + firefox builtin break 1 + firefox builtin pwd 1 + firefox builtin test 1 + firefox cmd /usr/lib/firefox/run-mozilla.sh 1 + run-mozilla.sh builtin break 1 + run-mozilla.sh builtin return 1 + run-mozilla.sh builtin shift 1 + run-mozilla.sh builtin type 1 + run-mozilla.sh cmd /usr/lib/firefox/firefox-bin 1 + run-mozilla.sh func moz_run_program 1 + run-mozilla.sh func moz_test_binary 1 + firefox builtin echo 2 + firefox func moz_pis_startstop_scripts 2 + firefox builtin cd 3 + firefox builtin export 3 + run-mozilla.sh builtin export 3 + firefox builtin : 6 + firefox func moz_spc_verbose_echo 6 + firefox builtin [ 18 + run-mozilla.sh builtin [ 20 + - total - 103 + +Elapsed times (us), + FILE TYPE NAME TOTAL + run-mozilla.sh builtin return 1 + run-mozilla.sh builtin shift 1 + run-mozilla.sh builtin break 2 + firefox builtin break 4 + run-mozilla.sh builtin export 6 + firefox builtin export 10 + firefox builtin : 15 + firefox builtin pwd 50 + firefox builtin cd 72 + run-mozilla.sh builtin [ 210 + firefox builtin echo 323 + firefox builtin [ 480 + run-mozilla.sh builtin type 486 + firefox builtin test 15330 + run-mozilla.sh cmd /usr/lib/firefox/firefox-bin 8941269 + firefox cmd /usr/lib/firefox/run-mozilla.sh 9384335 + - total - 18342766 + +Exclusive function elapsed times (us), + FILE TYPE NAME TOTAL + run-mozilla.sh func moz_test_binary 54 + firefox func moz_spc_verbose_echo 136 + firefox func moz_pis_startstop_scripts 230221 + run-mozilla.sh func moz_run_program 402343 + - total - 632756 + +Inclusive function elapsed times (us), + FILE TYPE NAME TOTAL + run-mozilla.sh func moz_test_binary 91 + firefox func moz_spc_verbose_echo 151 + firefox func moz_pis_startstop_scripts 230587 + run-mozilla.sh func moz_run_program 9343826 + + + +The output showed that the most inclusive function elapsed time was in +moz_run_program() at 9.3 seconds, which comes as little suprise since +I let firefox run for several seconds before closing it. That same duration +explains the large command times in the elapsed times report. + +Of more interest are the exclusive function elapsed times, where +moz_pis_startstop_scripts() was the slowest at 230 ms. Other areas of the +report are also useful to sanity check your software - should it be calling +these things? Especially if there are any commands called that can be +builtins instead. + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_cpudist_example.txt new file mode 100644 index 00000000000..272e9093d55 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_cpudist_example.txt @@ -0,0 +1,92 @@ +The following are examples of sh_cpudist.d. + +This script traces the on-CPU time of Bourne shell functions and +prints a report containing distribution plots per function. Here it +traces the example program, Code/Shell/func_slow.sh. + + # sh_cpudist.d + Tracing... Hit Ctrl-C to end. + ^C + + On-CPU times (us), + + func_slow.sh, builtin, echo + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@ 1 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + + func_slow.sh, builtin, [ + value ------------- Distribution ------------- count + 0 | 0 + 1 | 1 + 2 | 1 + 4 |@ 22 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 575 + 16 | 2 + 32 | 0 + 64 | 2 + 128 | 0 + + Exclusive function on-CPU times (us), + + func_slow.sh, func, func_a + value ------------- Distribution ------------- count + 65536 | 0 + 131072 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 262144 | 0 + + func_slow.sh, func, func_b + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_slow.sh, func, func_c + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + Inclusive function on-CPU times (us), + + func_slow.sh, func, func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_slow.sh, func, func_c + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_slow.sh, func, func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + +The on-CPU times should that the "[" builtin (test) usually took between +8 and 15 microseconds to execute, and was called over 500 times. + +The exclusive function on-CPU times show that func_a() spent between +131 ms and 262 ms on-CPU. + +The inclusive function on-CPU times show that both func_b() and func_c() +spent between 1.0 and 2.1 seconds on-CPU, and func_a() spent between 2.1 +and 4.2 seconds on-CPU. This inclusive time includes the time spent in other +functions called, and since func_a() called func_b() which called func_c(), +these times make sense. + +These on-CPU times are the time the thread spent running on a CPU, from when +the function began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive function time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_cputime_example.txt new file mode 100644 index 00000000000..d3ae5bc50b1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_cputime_example.txt @@ -0,0 +1,131 @@ +The following are examples of sh_cputime.d. + +This script traces the on-CPU time of Bourne shell functions and +prints a report. Here it traces the example program, Code/Shell/func_slow.sh. + + # sh_cputime.d + Tracing... Hit Ctrl-C to end. + ^C + + Counts, + FILE TYPE NAME COUNT + func_slow.sh func func_a 1 + func_slow.sh func func_b 1 + func_slow.sh func func_c 1 + func_slow.sh builtin echo 3 + func_slow.sh builtin [ 603 + - total - 609 + + On-CPU times (us), + FILE TYPE NAME TOTAL + func_slow.sh builtin echo 162 + func_slow.sh builtin [ 6279 + - total - 6441 + + Exclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + func_slow.sh func func_a 269465 + func_slow.sh func func_b 670372 + func_slow.sh func func_c 1259073 + - total - 2198911 + + Inclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + func_slow.sh func func_c 1262209 + func_slow.sh func func_b 1934839 + func_slow.sh func func_a 2205352 + +In total, three functions were called, one builtin and one command. + +The exclusive function on-CPU times show that func_a() spent around 268.4 ms +on-CPU, func_b() spent 670.3 ms, and func_c() spent 1259 ms. This exclusive +times excludes time spent in other functions. + +The inclusive function on-CPU times show that func_c() spent around 1.3 +seconds on-CPU, func_b() spent around 1.9 seconds, and func_a() spent around +2.2 seconds. This inclusive time includes the time spent in other functions +called, and since func_a() called func_b() which called func_c(), these +times make sense. + +These on-CPU times are the time the thread spent running on a CPU, from when +the function began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive function time. + +If you study the func_slow.sh program alongside the above output, the numbers +should make sense. + + + +The following traced the firefox start script. + +# sh_cputime.d +Tracing... Hit Ctrl-C to end. +^C + +Counts, + FILE TYPE NAME COUNT + firefox builtin break 1 + firefox builtin pwd 1 + firefox builtin test 1 + firefox cmd run-mozilla.sh 1 + run-mozilla.sh builtin break 1 + run-mozilla.sh builtin return 1 + run-mozilla.sh builtin shift 1 + run-mozilla.sh builtin type 1 + run-mozilla.sh cmd firefox-bin 1 + run-mozilla.sh func moz_run_program 1 + run-mozilla.sh func moz_test_binary 1 + firefox builtin echo 2 + firefox func moz_pis_startstop_scripts 2 + firefox builtin cd 3 + firefox builtin export 3 + run-mozilla.sh builtin export 3 + firefox builtin : 6 + firefox func moz_spc_verbose_echo 6 + firefox builtin [ 18 + run-mozilla.sh builtin [ 20 + - total - 103 + +On-CPU times (us), + FILE TYPE NAME TOTAL + run-mozilla.sh builtin return 0 + run-mozilla.sh builtin shift 0 + run-mozilla.sh builtin break 1 + firefox builtin break 2 + run-mozilla.sh builtin export 4 + firefox builtin export 7 + firefox builtin : 9 + firefox builtin test 35 + firefox builtin pwd 49 + firefox builtin cd 64 + run-mozilla.sh builtin [ 176 + firefox builtin echo 309 + firefox builtin [ 357 + run-mozilla.sh builtin type 475 + firefox cmd run-mozilla.sh 17090 + run-mozilla.sh cmd firefox-bin 1932333 + - total - 1950979 + +Exclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + run-mozilla.sh func moz_test_binary 21 + firefox func moz_spc_verbose_echo 22 + run-mozilla.sh func moz_run_program 9098 + firefox func moz_pis_startstop_scripts 12960 + - total - 22103 + +Inclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + firefox func moz_spc_verbose_echo 31 + run-mozilla.sh func moz_test_binary 56 + run-mozilla.sh func moz_run_program 9243 + firefox func moz_pis_startstop_scripts 13133 + +The output showed that the most CPU time was spent in the firefox-bin command, +taking 1.9 seconds of on-CPU time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_flow_example.txt new file mode 100644 index 00000000000..de7f22b8819 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_flow_example.txt @@ -0,0 +1,129 @@ +The following are examples of sh_flow.d. + +This is a simple script to trace the flow of Bourne shell functions, +builtins and external commands. Here it traces the example program, +Code/Shell/func_abc.sh. + + # sh_flow.d + C TIME(us) FILE -- NAME + 0 3060274370505 func_abc.sh -> func_a + 0 3060274370529 func_abc.sh > echo + 0 3060274372742 func_abc.sh | sleep + 0 3060275381634 func_abc.sh -> func_b + 0 3060275381660 func_abc.sh > echo + 0 3060275383852 func_abc.sh | sleep + 0 3060276391653 func_abc.sh -> func_c + 0 3060276391679 func_abc.sh > echo + 0 3060276393671 func_abc.sh | sleep + 0 3060277401753 func_abc.sh <- func_c + 0 3060277401767 func_abc.sh <- func_b + 0 3060277401775 func_abc.sh <- func_a + ^C + +As each function is entered, the third column is indented by 2 spaces. This +shows which function is calling who - the output abovebegins by showing that +func_a() began, and then called func_b(). + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + + + +The following traces the firefox startup script. + +# sh_flow.d + C TIME(us) FILE -- NAME + 0 3060321598138 firefox > test + 0 3060321603730 firefox > [ + 0 3060321603796 firefox > cd + 0 3060321603878 firefox > [ + 0 3060321603900 firefox > [ + 0 3060321604099 firefox > [ + 0 3060321609050 firefox > echo + 0 3060321620601 firefox > echo + 0 3060321626369 firefox > [ + 0 3060321626432 firefox > export + 0 3060321626459 firefox -> moz_pis_startstop_scripts + 0 3060321626519 firefox > export + 0 3060321626966 firefox > [ + 0 3060321627031 firefox > . + 0 3060321628446 firefox -> moz_spc_verbose_echo + 0 3060321628458 firefox > : + 0 3060321628467 firefox <- moz_spc_verbose_echo + 0 3060321636461 firefox > [ + 0 3060321636738 firefox -> moz_spc_verbose_echo + 0 3060321636751 firefox > : + 0 3060321636760 firefox <- moz_spc_verbose_echo + 0 3060321636778 firefox > [ + 0 3060321636793 firefox > [ + 0 3060321636817 firefox > [ + 0 3060321637126 firefox -> moz_spc_verbose_echo + 0 3060321637136 firefox > : + 0 3060321637143 firefox <- moz_spc_verbose_echo + 0 3060321666922 firefox -> moz_spc_verbose_echo + 0 3060321666952 firefox > : + 0 3060321666964 firefox <- moz_spc_verbose_echo + 0 3060321674929 firefox > [ + 0 3060321680246 firefox > [ + 0 3060321680312 firefox -> moz_spc_verbose_echo + 0 3060321680323 firefox > : + 0 3060321680331 firefox <- moz_spc_verbose_echo + 0 3060321680356 firefox -> moz_spc_verbose_echo + 0 3060321680363 firefox > : + 0 3060321680370 firefox <- moz_spc_verbose_echo + 0 3060321680396 firefox > [ + 0 3060321680428 firefox <- moz_pis_startstop_scripts + 0 3060321680525 firefox > [ + 0 3060321680580 firefox > [ + 0 3060321685358 firefox | /usr/lib/firefox/run-mozilla.sh + 0 3060321700731 run-mozilla.sh > [ + 0 3060321700950 run-mozilla.sh > break + 0 3060321703259 run-mozilla.sh > [ + 0 3060321703292 run-mozilla.sh > shift + 0 3060321703382 run-mozilla.sh > [ + 0 3060321703421 run-mozilla.sh > [ + 0 3060321703493 run-mozilla.sh > [ + 0 3060321703642 run-mozilla.sh > [ + 0 3060321703669 run-mozilla.sh > export + 0 3060321703706 run-mozilla.sh > [ + 0 3060321703725 run-mozilla.sh > [ + 0 3060321703857 run-mozilla.sh > [ + 0 3060321703880 run-mozilla.sh > export + 0 3060321703925 run-mozilla.sh > export + 0 3060321703954 run-mozilla.sh > [ + 0 3060321703982 run-mozilla.sh -> moz_run_program + 0 3060321704013 run-mozilla.sh > [ + 0 3060321704049 run-mozilla.sh -> moz_test_binary + 0 3060321704065 run-mozilla.sh > [ + 0 3060321704097 run-mozilla.sh > [ + 0 3060321704127 run-mozilla.sh > return + 0 3060321704137 run-mozilla.sh <- moz_test_binary + 0 3060321704151 run-mozilla.sh > [ + 0 3060321709953 run-mozilla.sh > type + 0 3060321724260 run-mozilla.sh > [ + 0 3060321724559 run-mozilla.sh > [ + 0 3060321724574 run-mozilla.sh > [ + 0 3060321727396 run-mozilla.sh | /usr/lib/firefox/firefox-bin + 0 3060325513871 run-mozilla.sh > [ + 0 3060325513898 run-mozilla.sh > [ + 0 3060325513929 run-mozilla.sh > [ + 0 3060325513940 run-mozilla.sh <- moz_run_program + 0 3060325513967 run-mozilla.sh > exit + 0 3060325515113 firefox -> moz_pis_startstop_scripts + 0 3060325515189 firefox > export + 0 3060325515431 firefox > [ + 0 3060325515466 firefox > [ + 0 3060325515487 firefox <- moz_pis_startstop_scripts + 0 3060325515503 firefox > exit + +This shows the flow, incluing the handover between the "firefox" script +and the "run-mozilla.sh" script. + +There is a point in the output where flow appears to reverse (at time +3060321709953, with the entry "> type"). This is due to another instance +of the run-mozilla.sh script running, which is indistinguishable from +the other lines in the output. To confirm this for yourself, add a PID +column to the flow script (or use sh_flowinfo.d). + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_flowinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_flowinfo_example.txt new file mode 100644 index 00000000000..1fb27cf4ea2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_flowinfo_example.txt @@ -0,0 +1,242 @@ +The following are examples of sh_flowinfo.d. + +This is a simple script to trace the flow of Bourne shell functions, +builtins and external commands. Here it traces the example program, +Code/Shell/func_abc.sh. + + # sh_flowinfo.d + C PID DELTA(us) FILE:LINE TYPE -- NAME + 0 19634 2 func_abc.sh:23 func -> func_a + 0 19634 24 func_abc.sh:18 builtin -> echo + 0 19634 41 func_abc.sh:- builtin <- echo + 0 19634 5873 func_abc.sh:19 cmd -> sleep + 0 19634 999373 func_abc.sh:- cmd <- sleep + 0 19634 39 func_abc.sh:20 func -> func_b + 0 19634 22 func_abc.sh:11 builtin -> echo + 0 19634 40 func_abc.sh:- builtin <- echo + 0 19634 4661 func_abc.sh:12 cmd -> sleep + 0 19634 1005349 func_abc.sh:- cmd <- sleep + 0 19634 49 func_abc.sh:13 func -> func_c + 0 19634 22 func_abc.sh:5 builtin -> echo + 0 19634 38 func_abc.sh:- builtin <- echo + 0 19634 4949 func_abc.sh:6 cmd -> sleep + 0 19634 1004817 func_abc.sh:- cmd <- sleep + 0 19634 36 func_abc.sh:- func <- func_c + 0 19634 14 func_abc.sh:- func <- func_b + 0 19634 8 func_abc.sh:- func <- func_a + +As each function is entered, the third column is indented by 2 spaces. This +shows which function is calling who - the output abovebegins by showing that +func_a() began, and then called func_b(). + +The DELTA(us) column shows time from that line to the previous line, and +so can be a bit tricky to read. For example, the fifth line of data output +(skipping the header) reads as "the time from the command sleep beginning +to ending was 999373 us, or 1.0 seconds". + +The LINE column shows the line in the file what was being executed. Refer +to the source program to see what this line refers to. + +If the output looks shuffled, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + + +The following traces the firefox startup script. + +# sh_flowinfo.d + C PID DELTA(us) FILE:LINE TYPE -- NAME + 0 156789 1 firefox:- subsh -> pid 156790 + 0 156789 20 firefox:- subsh <- = 0 + 0 156789 31651 firefox:- subsh -> pid 156791 + 0 156789 20 firefox:- subsh <- = 0 + 0 156789 10502 firefox:109 builtin -> test + 0 156789 59 firefox:- builtin <- test + 0 156789 3804 firefox:- subsh -> pid 156792 + 0 156789 21 firefox:- subsh <- = 0 + 0 156789 22029 firefox:114 builtin -> [ + 0 156789 57 firefox:- builtin <- [ + 0 156789 90910 firefox:- subsh -> pid 156793 + 0 156789 22 firefox:- subsh <- = 0 + 0 156789 159492 firefox:- subsh -> pid 156794 + 0 156789 22 firefox:- subsh <- = 0 + 0 156789 127 firefox:116 builtin -> cd + 0 156789 54 firefox:- builtin <- cd + 0 156789 209757 firefox:- subsh -> pid 156795 + 0 156789 23 firefox:- subsh <- = 0 + 0 156795 206160 firefox:- subsh -> pid 156796 + 0 156795 9 firefox:- subsh <- = 0 + 0 156789 12115 firefox:118 builtin -> [ + 0 156789 61 firefox:- builtin <- [ + 0 156789 200529 firefox:- subsh -> pid 156797 + 0 156789 24 firefox:- subsh <- = 0 + 0 156789 136 firefox:123 builtin -> [ + 0 156789 58 firefox:- builtin <- [ + 0 156789 21 firefox:124 builtin -> cd + 0 156789 19 firefox:- builtin <- cd + 0 156798 175 firefox:1 builtin -> pwd + 0 156798 65 firefox:- builtin <- pwd + 0 156789 108835 firefox:- subsh -> pid 156798 + 0 156789 18 firefox:- subsh <- = 0 + 0 156789 119 firefox:128 builtin -> break + 0 156789 15 firefox:- builtin <- break + 0 156789 21 firefox:131 builtin -> cd + 0 156789 26 firefox:- builtin <- cd + 0 156789 61 firefox:133 builtin -> [ + 0 156789 9 firefox:- builtin <- [ + 0 156789 73508 firefox:147 builtin -> [ + 0 156789 25 firefox:- builtin <- [ + 0 156800 184 firefox:1 builtin -> echo + 0 156800 175 firefox:- builtin <- echo + 0 156789 15966 firefox:- subsh -> pid 156799 + 0 156789 22 firefox:- subsh <- = 0 + 0 156799 12091 firefox:- subsh -> pid 156800 + 0 156799 10 firefox:- subsh <- = 0 + 0 156802 178 firefox:1 builtin -> echo + 0 156802 167 firefox:- builtin <- echo + 0 156789 13822 firefox:- subsh -> pid 156801 + 0 156789 18 firefox:- subsh <- = 0 + 0 156801 81683 firefox:- subsh -> pid 156802 + 0 156801 21 firefox:- subsh <- = 0 + 0 156789 78324 firefox:158 builtin -> [ + 0 156789 37 firefox:- builtin <- [ + 0 156789 54 firefox:194 builtin -> export + 0 156789 9 firefox:- builtin <- export + 0 156789 26 firefox:197 func -> moz_pis_startstop_scripts + 0 156789 61 firefox:62 builtin -> export + 0 156789 9 firefox:- builtin <- export + 0 156789 413 firefox:67 builtin -> [ + 0 156789 34 firefox:- builtin <- [ + 0 156789 40 firefox:69 builtin -> . + 0 156789 20833 firefox:18 func -> moz_spc_verbose_echo + 0 156789 26 firefox:15 builtin -> : + 0 156789 16 firefox:- builtin <- : + 0 156789 15 firefox:- func <- moz_spc_verbose_echo + 0 156789 105106 firefox:- subsh -> pid 156803 + 0 156789 22 firefox:- subsh <- = 0 + 0 156789 129 firefox:19 builtin -> [ + 0 156789 17 firefox:- builtin <- [ + 0 156789 33 firefox:20 func -> moz_spc_verbose_echo + 0 156789 14 firefox:15 builtin -> : + 0 156789 7 firefox:- builtin <- : + 0 156789 9 firefox:- func <- moz_spc_verbose_echo + 0 156789 21 firefox:23 builtin -> [ + 0 156789 8 firefox:- builtin <- [ + 0 156789 16 firefox:26 builtin -> [ + 0 156789 8 firefox:- builtin <- [ + 0 156789 24 firefox:29 builtin -> [ + 0 156789 43 firefox:- builtin <- [ + 0 156789 77 firefox:36 func -> moz_spc_verbose_echo + 0 156789 9 firefox:15 builtin -> : + 0 156789 8 firefox:- builtin <- : + 0 156789 8 firefox:- func <- moz_spc_verbose_echo + 0 156789 158947 firefox:- subsh -> pid 156804 + 0 156789 22 firefox:- subsh <- = 0 + 0 156789 210112 firefox:- subsh -> pid 156805 + 0 156789 22 firefox:- subsh <- = 0 + 0 156805 205500 firefox:- subsh -> pid 156806 + 0 156805 10 firefox:- subsh <- = 0 + 0 156805 200987 firefox:- subsh -> pid 156807 + 0 156805 20 firefox:- subsh <- = 0 + 0 156789 363564 firefox:40 func -> moz_spc_verbose_echo + 0 156789 26 firefox:15 builtin -> : + 0 156789 17 firefox:- builtin <- : + 0 156789 15 firefox:- func <- moz_spc_verbose_echo + 0 156809 234 firefox:1 builtin -> [ + 0 156809 70 firefox:- builtin <- [ + 0 156789 46950 firefox:- subsh -> pid 156808 + 0 156789 22 firefox:- subsh <- = 0 + 0 156808 42371 firefox:- subsh -> pid 156809 + 0 156808 10 firefox:- subsh <- = 0 + 0 156789 27278 firefox:43 builtin -> [ + 0 156789 26 firefox:- builtin <- [ + 0 156789 62 firefox:44 func -> moz_spc_verbose_echo + 0 156789 15 firefox:15 builtin -> : + 0 156789 8 firefox:- builtin <- : + 0 156789 10 firefox:- func <- moz_spc_verbose_echo + 0 156789 30 firefox:67 func -> moz_spc_verbose_echo + 0 156789 9 firefox:15 builtin -> : + 0 156789 8 firefox:- builtin <- : + 0 156789 7 firefox:- func <- moz_spc_verbose_echo + 0 156789 8 firefox:- builtin <- . + 0 156789 28 firefox:67 builtin -> [ + 0 156789 31 firefox:- builtin <- [ + 0 156789 8 firefox:- func <- moz_pis_startstop_scripts + 0 156789 97 firefox:199 builtin -> [ + 0 156789 35 firefox:- builtin <- [ + 0 156789 29 firefox:205 builtin -> [ + 0 156789 9 firefox:- builtin <- [ + 0 156789 72519 firefox:209 cmd -> /usr/lib/firefox/run-mozilla.sh + 0 156810 1 run-mozilla.sh:- subsh -> pid 156811 + 0 156810 15 run-mozilla.sh:- subsh <- = 0 + 0 156810 129474 run-mozilla.sh:- subsh -> pid 156812 + 0 156810 24 run-mozilla.sh:- subsh <- = 0 + 0 156810 743 run-mozilla.sh:258 builtin -> [ + 0 156810 28 run-mozilla.sh:- builtin <- [ + 0 156810 212 run-mozilla.sh:275 builtin -> break + 0 156810 10 run-mozilla.sh:- builtin <- break + 0 156810 31 run-mozilla.sh:283 builtin -> [ + 0 156810 10 run-mozilla.sh:- builtin <- [ + 0 156810 16 run-mozilla.sh:286 builtin -> shift + 0 156810 9 run-mozilla.sh:- builtin <- shift + 0 156810 55 run-mozilla.sh:291 builtin -> [ + 0 156810 9 run-mozilla.sh:- builtin <- [ + 0 156810 36 run-mozilla.sh:317 builtin -> [ + 0 156810 34 run-mozilla.sh:- builtin <- [ + 0 156810 37 run-mozilla.sh:327 builtin -> [ + 0 156810 9 run-mozilla.sh:- builtin <- [ + 0 156810 142 run-mozilla.sh:362 builtin -> [ + 0 156810 9 run-mozilla.sh:- builtin <- [ + 0 156810 26 run-mozilla.sh:366 builtin -> export + 0 156810 9 run-mozilla.sh:- builtin <- export + 0 156810 37 run-mozilla.sh:369 builtin -> [ + 0 156810 9 run-mozilla.sh:- builtin <- [ + 0 156810 18 run-mozilla.sh:371 builtin -> [ + 0 156810 19 run-mozilla.sh:- builtin <- [ + 0 156810 112 run-mozilla.sh:379 builtin -> [ + 0 156810 10 run-mozilla.sh:- builtin <- [ + 0 156810 23 run-mozilla.sh:418 builtin -> export + 0 156810 9 run-mozilla.sh:- builtin <- export + 0 156810 45 run-mozilla.sh:419 builtin -> export + 0 156810 10 run-mozilla.sh:- builtin <- export + 0 156810 27 run-mozilla.sh:421 builtin -> [ + 0 156810 9 run-mozilla.sh:- builtin <- [ + 0 156810 29 run-mozilla.sh:425 func -> moz_run_program + 0 156810 32 run-mozilla.sh:137 builtin -> [ + 0 156810 25 run-mozilla.sh:- builtin <- [ + 0 156810 20 run-mozilla.sh:145 func -> moz_test_binary + 0 156810 17 run-mozilla.sh:97 builtin -> [ + 0 156810 23 run-mozilla.sh:- builtin <- [ + 0 156810 15 run-mozilla.sh:99 builtin -> [ + 0 156810 26 run-mozilla.sh:- builtin <- [ + 0 156810 13 run-mozilla.sh:101 builtin -> return + 0 156810 9 run-mozilla.sh:- builtin <- return + 0 156810 11 run-mozilla.sh:- func <- moz_test_binary + 0 156810 18 run-mozilla.sh:146 builtin -> [ + 0 156810 9 run-mozilla.sh:- builtin <- [ + 0 156814 185 run-mozilla.sh:1 builtin -> type + 0 156814 118188 run-mozilla.sh:- builtin <- type + 0 156810 167284 run-mozilla.sh:- subsh -> pid 156813 + 0 156810 23 run-mozilla.sh:- subsh <- = 0 + 0 156813 162135 run-mozilla.sh:- subsh -> pid 156814 + 0 156813 12 run-mozilla.sh:- subsh <- = 0 + 0 156813 200125 run-mozilla.sh:- subsh -> pid 156815 + 0 156813 22 run-mozilla.sh:- subsh <- = 0 + 0 156810 203465 run-mozilla.sh:152 builtin -> [ + 0 156810 51 run-mozilla.sh:- builtin <- [ + 0 156810 21 run-mozilla.sh:156 builtin -> [ + 0 156810 9 run-mozilla.sh:- builtin <- [ + 0 156810 15 run-mozilla.sh:159 builtin -> [ + 0 156810 14 run-mozilla.sh:- builtin <- [ + 0 156810 65752 run-mozilla.sh:- subsh -> pid 156816 + 0 156810 24 run-mozilla.sh:- subsh <- = 0 + 0 156816 251788 run-mozilla.sh:- subsh -> pid 156817 + 0 156816 22 run-mozilla.sh:- subsh <- = 0 + 0 156810 299677 run-mozilla.sh:167 cmd -> /usr/lib/firefox/firefox-bin + 0 156810 5124906 run-mozilla.sh:- cmd <- /usr/lib/firefox/firefox-bin + 0 156789 5993798 firefox:- cmd <- /usr/lib/firefox/run-mozilla.sh + +Now latencies can investigated by line number. + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_flowtime_example.txt new file mode 100644 index 00000000000..03848de62d8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_flowtime_example.txt @@ -0,0 +1,131 @@ +The following are examples of sh_flowtime.d. + +This is a simple script to trace the flow of Bourne shell functions, +builtins and external commands. Here it traces the example program, +Code/Shell/func_abc.sh. + + # sh_flowtime.d + C TIME(us) FILE DELTA(us) -- NAME + 0 3060817866026 func_abc.sh 2 -> func_a + 0 3060817866086 func_abc.sh 60 > echo + 0 3060818871601 func_abc.sh 1005514 | sleep + 0 3060818871639 func_abc.sh 38 -> func_b + 0 3060818871684 func_abc.sh 44 > echo + 0 3060819881597 func_abc.sh 1009912 | sleep + 0 3060819881657 func_abc.sh 60 -> func_c + 0 3060819881717 func_abc.sh 60 > echo + 0 3060820891613 func_abc.sh 1009896 | sleep + 0 3060820891661 func_abc.sh 47 <- func_c + 0 3060820891675 func_abc.sh 14 <- func_b + 0 3060820891683 func_abc.sh 7 <- func_a + ^C + +As each function is entered, the third column is indented by 2 spaces. This +shows which function is calling who - the output above begins by showing that +func_a() began, and then called func_b(). + +The DELTA(us) column is interpreted as follows, + + -> previous line to the start of this function + <- previous line to the end of this function + > previous line to the end of this builtin + | previous line to the end of this command + +And so the above output shows that each sleep command is taking around 1.0 +seconds to execute. + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + + + +The following traces the firefox start script. + +# sh_flowtime.d + C TIME(us) FILE DELTA(us) -- NAME + 0 3060994282580 firefox 2 > test + 0 3060994286921 firefox 4341 > [ + 0 3060994286955 firefox 34 > cd + 0 3060994287014 firefox 58 > [ + 0 3060994287059 firefox 45 > [ + 0 3060994287227 firefox 167 > [ + 0 3060994293793 firefox 2 > echo + 0 3060994305759 firefox 2 > echo + 0 3060994309613 firefox 22385 > [ + 0 3060994309665 firefox 52 > export + 0 3060994309691 firefox 25 -> moz_pis_startstop_scripts + 0 3060994309752 firefox 61 > export + 0 3060994310199 firefox 447 > [ + 0 3060994314462 firefox 4262 -> moz_spc_verbose_echo + 0 3060994314484 firefox 22 > : + 0 3060994314497 firefox 12 <- moz_spc_verbose_echo + 0 3060994322101 firefox 7604 > [ + 0 3060994322134 firefox 33 -> moz_spc_verbose_echo + 0 3060994322147 firefox 12 > : + 0 3060994322155 firefox 7 <- moz_spc_verbose_echo + 0 3060994322501 firefox 345 > [ + 0 3060994322518 firefox 17 > [ + 0 3060994322578 firefox 59 > [ + 0 3060994322641 firefox 62 -> moz_spc_verbose_echo + 0 3060994322650 firefox 9 > : + 0 3060994322656 firefox 6 <- moz_spc_verbose_echo + 0 3060994653794 firefox 331137 -> moz_spc_verbose_echo + 0 3060994653826 firefox 32 > : + 0 3060994653839 firefox 12 <- moz_spc_verbose_echo + 0 3060994659534 firefox 2 > [ + 0 3060994667539 firefox 13699 > [ + 0 3060994667604 firefox 65 -> moz_spc_verbose_echo + 0 3060994667617 firefox 13 > : + 0 3060994667625 firefox 8 <- moz_spc_verbose_echo + 0 3060994667653 firefox 27 -> moz_spc_verbose_echo + 0 3060994667661 firefox 7 > : + 0 3060994667668 firefox 6 <- moz_spc_verbose_echo + 0 3060994667675 firefox 7 > . + 0 3060994667725 firefox 49 > [ + 0 3060994667732 firefox 6 <- moz_pis_startstop_scripts + 0 3060994667853 firefox 121 > [ + 0 3060994667881 firefox 27 > [ + 0 3060994804329 run-mozilla.sh 2 > [ + 0 3060994804524 run-mozilla.sh 194 > break + 0 3060994804560 run-mozilla.sh 36 > [ + 0 3060994804580 run-mozilla.sh 20 > shift + 0 3060994804649 run-mozilla.sh 68 > [ + 0 3060994804710 run-mozilla.sh 61 > [ + 0 3060994804747 run-mozilla.sh 36 > [ + 0 3060994804889 run-mozilla.sh 142 > [ + 0 3060994804915 run-mozilla.sh 26 > export + 0 3060994804952 run-mozilla.sh 36 > [ + 0 3060994804981 run-mozilla.sh 28 > [ + 0 3060994805093 run-mozilla.sh 112 > [ + 0 3060994805116 run-mozilla.sh 22 > export + 0 3060994805160 run-mozilla.sh 44 > export + 0 3060994805187 run-mozilla.sh 27 > [ + 0 3060994805215 run-mozilla.sh 27 -> moz_run_program + 0 3060994805263 run-mozilla.sh 48 > [ + 0 3060994805283 run-mozilla.sh 19 -> moz_test_binary + 0 3060994805314 run-mozilla.sh 31 > [ + 0 3060994805346 run-mozilla.sh 31 > [ + 0 3060994805358 run-mozilla.sh 12 > return + 0 3060994805367 run-mozilla.sh 9 <- moz_test_binary + 0 3060994805385 run-mozilla.sh 17 > [ + 0 3060994964498 run-mozilla.sh 2 > type + 0 3060995520942 run-mozilla.sh 715556 > [ + 0 3060995520967 run-mozilla.sh 24 > [ + 0 3060995520987 run-mozilla.sh 20 > [ + 0 3061000622172 run-mozilla.sh 5101184 | /usr/lib/firefox/firefox-bin + 0 3061000622221 run-mozilla.sh 49 > [ + 0 3061000622252 run-mozilla.sh 30 > [ + 0 3061000622266 run-mozilla.sh 14 > [ + 0 3061000622275 run-mozilla.sh 9 <- moz_run_program + 0 3061000623686 firefox 5955805 | /usr/lib/firefox/run-mozilla.sh + 0 3061000623793 firefox 106 -> moz_pis_startstop_scripts + 0 3061000623864 firefox 71 > export + 0 3061000624108 firefox 244 > [ + 0 3061000624138 firefox 30 > [ + 0 3061000624147 firefox 8 <- moz_pis_startstop_scripts + +Points of latency during startup are visible in the output. For more details, +see Examples/sh_flowinfo_example.txt. + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_lines_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_lines_example.txt new file mode 100644 index 00000000000..f19487cc624 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_lines_example.txt @@ -0,0 +1,32 @@ +The following are examples of sh_lines.d. + +This is a simple script to count Bourne shell line execution. Here it traces an +example program, Code/Shell/func_slow.sh. + + # sh_lines.d + Tracing... Hit Ctrl-C to end. + ^C + + FILE:LINE COUNT + func_slow.sh:5 1 + func_slow.sh:6 1 + func_slow.sh:15 1 + func_slow.sh:16 1 + func_slow.sh:21 1 + func_slow.sh:26 1 + func_slow.sh:27 1 + func_slow.sh:32 1 + func_slow.sh:35 1 + func_slow.sh:30 100 + func_slow.sh:28 101 + func_slow.sh:19 200 + func_slow.sh:17 201 + func_slow.sh:9 300 + func_slow.sh:7 301 + func_slow.sh:1 600 + +The most frequently executed line was line 1 of func_slow.sh - which is actually +line 1 of func_slow.sh subshells (command substitution, ` `). Apart from +this slight confusion, the rest of the output should make sense (and most +scripts only call one line in command substitution anyway). + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_pidcolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_pidcolors_example.txt new file mode 100644 index 00000000000..a6025e49078 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_pidcolors_example.txt @@ -0,0 +1,574 @@ +The following are examples of sh_pidcolors.d. + +This is the same script as in sh_syscolors.d, except with additional tracing. +As well as the functions, lines and system calls traced in sh_syscolors.d, +this also adds some "pid" provider tracing as a starting point for deeper +analysis. In this case it adds the probes: + + pid$target:a.out:e*:entry, + pid$target:a.out:e*:return + +which means, all functions from the /usr/bin/sh binary that begin with +the letter "e". This adds about 34 probes, but you can customize it to be as +inclusive as you like. It renders the output in color ("colour") using terminal +escape sequences (which you can tweak by modifying the script). + +Here it traces the example program, Code/Shell/func_abc.sh. + +WARNING: This output is full of terminal escape sequences, so if you are +trying to view this through an editor or web browser - it may look awful. +Try viewing this using "more" (although, depending on your terminal, it +still may look awful). + +# sh_pidcolors.d -c ./func_abc.sh -o /tmp/out +Function A +Function B +Function C + +# cat /tmp/out +C PID DELTA(us) FILE:LINE TYPE -- NAME +0 12312 2 func_abc.sh:- syscall -> munmap +0 12312 34 func_abc.sh:- syscall <- munmap +0 12312 53 func_abc.sh:- syscall -> mmap +0 12312 19 func_abc.sh:- syscall <- mmap +0 12312 43 func_abc.sh:- syscall -> setcontext +0 12312 11 func_abc.sh:- syscall <- setcontext +0 12312 11 func_abc.sh:- syscall -> getrlimit +0 12312 11 func_abc.sh:- syscall <- getrlimit +0 12312 10 func_abc.sh:- syscall -> getpid +0 12312 9 func_abc.sh:- syscall <- getpid +0 12312 63 func_abc.sh:- syscall -> setcontext +0 12312 9 func_abc.sh:- syscall <- setcontext +0 12312 813 func_abc.sh:- syscall -> sysi86 +0 12312 13 func_abc.sh:- syscall <- sysi86 +0 12312 85 func_abc.sh:- syscall -> open64 +0 12312 88 func_abc.sh:- syscall <- open64 +0 12312 13 func_abc.sh:- syscall -> ioctl +0 12312 35 func_abc.sh:- syscall <- ioctl +0 12312 15 func_abc.sh:- syscall -> close +0 12312 17 func_abc.sh:- syscall <- close +0 12312 123 func_abc.sh:- syscall -> getpid +0 12312 9 func_abc.sh:- syscall <- getpid +0 12312 17 func_abc.sh:- syscall -> setpgrp +0 12312 9 func_abc.sh:- syscall <- setpgrp +0 12312 11 func_abc.sh:- syscall -> setpgrp +0 12312 8 func_abc.sh:- syscall <- setpgrp +0 12312 11 func_abc.sh:- syscall -> access +0 12312 19 func_abc.sh:- syscall <- access +0 12312 14 func_abc.sh:- syscall -> brk +0 12312 11 func_abc.sh:- syscall <- brk +0 12312 15 func_abc.sh:- syscall -> sysconfig +0 12312 9 func_abc.sh:- syscall <- sysconfig +0 12312 10 func_abc.sh:- syscall -> sysconfig +0 12312 8 func_abc.sh:- syscall <- sysconfig +0 12312 11 func_abc.sh:- syscall -> sigaltstack +0 12312 9 func_abc.sh:- syscall <- sigaltstack +0 12312 16 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 12 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 9 func_abc.sh:- syscall -> sigaction +0 12312 9 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 10 func_abc.sh:- syscall -> sigaction +0 12312 8 func_abc.sh:- syscall <- sigaction +0 12312 18 func_abc.sh:- sh -> endstak +0 12312 18 func_abc.sh:- sh <- endstak +0 12312 60 func_abc.sh:- syscall -> brk +0 12312 9 func_abc.sh:- syscall <- brk +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 13 func_abc.sh:- syscall -> getuid +0 12312 9 func_abc.sh:- syscall <- getuid +0 12312 10 func_abc.sh:- syscall -> getuid +0 12312 9 func_abc.sh:- syscall <- getuid +0 12312 11 func_abc.sh:- syscall -> getgid +0 12312 9 func_abc.sh:- syscall <- getgid +0 12312 11 func_abc.sh:- syscall -> getgid +0 12312 8 func_abc.sh:- syscall <- getgid +0 12312 16 func_abc.sh:- syscall -> open64 +0 12312 20 func_abc.sh:- syscall <- open64 +0 12312 11 func_abc.sh:- sh -> exfile +0 12312 10 func_abc.sh:- syscall -> close +0 12312 8 func_abc.sh:- syscall <- close +0 12312 24 func_abc.sh:- syscall -> fcntl +0 12312 23 func_abc.sh:- syscall <- fcntl +0 12312 10 func_abc.sh:- syscall -> close +0 12312 10 func_abc.sh:- syscall <- close +0 12312 9 func_abc.sh:- syscall -> fcntl +0 12312 8 func_abc.sh:- syscall <- fcntl +0 12312 28 func_abc.sh:- syscall -> ioctl +0 12312 42 func_abc.sh:- syscall <- ioctl +0 12312 10 func_abc.sh:- syscall -> ioctl +0 12312 9 func_abc.sh:- syscall <- ioctl +0 12312 14 func_abc.sh:- syscall -> read +0 12312 33 func_abc.sh:- syscall <- read +0 12312 11 func_abc.sh:- syscall -> brk +0 12312 20 func_abc.sh:- syscall <- brk +0 12312 13 func_abc.sh:- sh -> execute +0 12312 11 func_abc.sh:- sh <- execute +0 12312 10 func_abc.sh:- syscall -> brk +0 12312 9 func_abc.sh:- syscall <- brk +0 12312 10 func_abc.sh:- sh -> execute +0 12312 9 func_abc.sh:- sh <- execute +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 29 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> execute +0 12312 10 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- sh -> execute +0 12312 9 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- syscall -> brk +0 12312 9 func_abc.sh:- syscall <- brk +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> execute +0 12312 10 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- syscall -> brk +0 12312 9 func_abc.sh:- syscall <- brk +0 12312 10 func_abc.sh:- sh -> execute +0 12312 9 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- syscall -> read +0 12312 16 func_abc.sh:- syscall <- read +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 25 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> execute +0 12312 10 func_abc.sh:- sh <- execute +0 12312 10 func_abc.sh:- syscall -> brk +0 12312 9 func_abc.sh:- syscall <- brk +0 12312 10 func_abc.sh:- sh -> execute +0 12312 9 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- syscall -> brk +0 12312 9 func_abc.sh:- syscall <- brk +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> execute +0 12312 9 func_abc.sh:23 line --  +0 12312 14 func_abc.sh:- sh -> estabf +0 12312 10 func_abc.sh:- sh <- estabf +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 18 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 12 func_abc.sh:- sh -> expand +0 12312 10 func_abc.sh:- sh <- expand +0 12312 14 func_abc.sh:23 func -> func_a +0 12312 14 func_abc.sh:- sh -> execute +0 12312 9 func_abc.sh:- sh -> execute +0 12312 8 func_abc.sh:18 line --  +0 12312 8 func_abc.sh:- sh -> estabf +0 12312 9 func_abc.sh:- sh <- estabf +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 8 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> expand +0 12312 9 func_abc.sh:- sh <- expand +0 12312 9 func_abc.sh:- sh -> estabf +0 12312 9 func_abc.sh:- sh <- estabf +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 8 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> expand +0 12312 9 func_abc.sh:- sh <- expand +0 12312 13 func_abc.sh:18 builtin -> echo +0 12312 15 func_abc.sh:- sh -> echo +0 12312 14 func_abc.sh:- syscall -> write +0 12312 35 func_abc.sh:- syscall <- write +0 12312 321 func_abc.sh:- sh <- echo +0 12312 13 func_abc.sh:0 builtin <- echo +0 12312 17 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- sh -> execute +0 12312 9 func_abc.sh:- sh -> execute +0 12312 8 func_abc.sh:19 line --  +0 12312 8 func_abc.sh:- sh -> estabf +0 12312 9 func_abc.sh:- sh <- estabf +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> expand +0 12312 9 func_abc.sh:- sh <- expand +0 12312 9 func_abc.sh:- sh -> estabf +0 12312 9 func_abc.sh:- sh <- estabf +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> expand +0 12312 9 func_abc.sh:- sh <- expand +0 12312 11 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- syscall -> getuid +0 12312 9 func_abc.sh:- syscall <- getuid +0 12312 15 func_abc.sh:- syscall -> stat64 +0 12312 27 func_abc.sh:- syscall <- stat64 +0 12312 11 func_abc.sh:- syscall -> access +0 12312 15 func_abc.sh:- syscall <- access +0 12312 18 func_abc.sh:- syscall -> schedctl +0 12312 47 func_abc.sh:- syscall <- schedctl +0 12312 219 func_abc.sh:- syscall -> fork1 +0 12312 234375 func_abc.sh:- syscall <- fork1 +0 12312 277 func_abc.sh:- syscall -> lwp_sigmask +0 12312 13 func_abc.sh:- syscall <- lwp_sigmask +0 12312 33 func_abc.sh:19 cmd -> sleep +0 12312 59 func_abc.sh:- syscall -> waitsys +0 12312 870257 func_abc.sh:- syscall <- waitsys +0 12312 36 func_abc.sh:- syscall -> ioctl +0 12312 16 func_abc.sh:- syscall <- ioctl +0 12312 13 func_abc.sh:- syscall -> setpgrp +0 12312 9 func_abc.sh:- syscall <- setpgrp +0 12312 9 func_abc.sh:- syscall -> ioctl +0 12312 9 func_abc.sh:- syscall <- ioctl +0 12312 11 func_abc.sh:- syscall -> ioctl +0 12312 33 func_abc.sh:- syscall <- ioctl +0 12312 12 func_abc.sh:- syscall -> waitsys +0 12312 25 func_abc.sh:- syscall <- waitsys +0 12312 15 func_abc.sh:0 cmd <- sleep +0 12312 20 func_abc.sh:- sh <- execute +0 12312 15 func_abc.sh:- sh -> execute +0 12312 14 func_abc.sh:20 line --  +0 12312 13 func_abc.sh:- sh -> estabf +0 12312 10 func_abc.sh:- sh <- estabf +0 12312 11 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 12 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 11 func_abc.sh:- sh -> expand +0 12312 10 func_abc.sh:- sh <- expand +0 12312 17 func_abc.sh:20 func -> func_b +0 12312 14 func_abc.sh:- sh -> execute +0 12312 9 func_abc.sh:- sh -> execute +0 12312 8 func_abc.sh:11 line --  +0 12312 8 func_abc.sh:- sh -> estabf +0 12312 9 func_abc.sh:- sh <- estabf +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> expand +0 12312 9 func_abc.sh:- sh <- expand +0 12312 9 func_abc.sh:- sh -> estabf +0 12312 9 func_abc.sh:- sh <- estabf +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> expand +0 12312 9 func_abc.sh:- sh <- expand +0 12312 13 func_abc.sh:11 builtin -> echo +0 12312 15 func_abc.sh:- sh -> echo +0 12312 12 func_abc.sh:- syscall -> write +0 12312 32 func_abc.sh:- syscall <- write +0 12312 320 func_abc.sh:- sh <- echo +0 12312 12 func_abc.sh:0 builtin <- echo +0 12312 16 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- sh -> execute +0 12312 9 func_abc.sh:- sh -> execute +0 12312 8 func_abc.sh:12 line --  +0 12312 8 func_abc.sh:- sh -> estabf +0 12312 9 func_abc.sh:- sh <- estabf +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> expand +0 12312 9 func_abc.sh:- sh <- expand +0 12312 9 func_abc.sh:- sh -> estabf +0 12312 9 func_abc.sh:- sh <- estabf +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> expand +0 12312 9 func_abc.sh:- sh <- expand +0 12312 225 func_abc.sh:- syscall -> fork1 +0 12312 60940 func_abc.sh:- syscall <- fork1 +0 12312 243 func_abc.sh:- syscall -> lwp_sigmask +0 12312 15 func_abc.sh:- syscall <- lwp_sigmask +0 12312 31 func_abc.sh:12 cmd -> sleep +0 12312 31 func_abc.sh:- syscall -> waitsys +0 12312 1007422 func_abc.sh:- syscall <- waitsys +0 12312 28 func_abc.sh:- syscall -> ioctl +0 12312 17 func_abc.sh:- syscall <- ioctl +0 12312 11 func_abc.sh:- syscall -> setpgrp +0 12312 9 func_abc.sh:- syscall <- setpgrp +0 12312 9 func_abc.sh:- syscall -> ioctl +0 12312 9 func_abc.sh:- syscall <- ioctl +0 12312 9 func_abc.sh:- syscall -> ioctl +0 12312 38 func_abc.sh:- syscall <- ioctl +0 12312 12 func_abc.sh:- syscall -> waitsys +0 12312 26 func_abc.sh:- syscall <- waitsys +0 12312 15 func_abc.sh:0 cmd <- sleep +0 12312 32 func_abc.sh:- sh <- execute +0 12312 15 func_abc.sh:- sh -> execute +0 12312 14 func_abc.sh:13 line --  +0 12312 13 func_abc.sh:- sh -> estabf +0 12312 10 func_abc.sh:- sh <- estabf +0 12312 12 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 12 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> expand +0 12312 10 func_abc.sh:- sh <- expand +0 12312 17 func_abc.sh:13 func -> func_c +0 12312 13 func_abc.sh:- sh -> execute +0 12312 9 func_abc.sh:- sh -> execute +0 12312 8 func_abc.sh:5 line --  +0 12312 8 func_abc.sh:- sh -> estabf +0 12312 9 func_abc.sh:- sh <- estabf +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> expand +0 12312 9 func_abc.sh:- sh <- expand +0 12312 9 func_abc.sh:- sh -> estabf +0 12312 9 func_abc.sh:- sh <- estabf +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 10 func_abc.sh:- sh -> expand +0 12312 9 func_abc.sh:- sh <- expand +0 12312 13 func_abc.sh:5 builtin -> echo +0 12312 15 func_abc.sh:- sh -> echo +0 12312 12 func_abc.sh:- syscall -> write +0 12312 32 func_abc.sh:- syscall <- write +0 12312 309 func_abc.sh:- sh <- echo +0 12312 12 func_abc.sh:0 builtin <- echo +0 12312 16 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- sh -> execute +0 12312 9 func_abc.sh:6 line --  +0 12312 8 func_abc.sh:- sh -> estabf +0 12312 22 func_abc.sh:- sh <- estabf +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 11 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> expand +0 12312 9 func_abc.sh:- sh <- expand +0 12312 9 func_abc.sh:- sh -> estabf +0 12312 9 func_abc.sh:- sh <- estabf +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 9 func_abc.sh:- sh -> expand +0 12312 9 func_abc.sh:- sh <- expand +0 12312 220 func_abc.sh:- syscall -> fork1 +0 12312 60982 func_abc.sh:- syscall <- fork1 +0 12312 239 func_abc.sh:- syscall -> lwp_sigmask +0 12312 15 func_abc.sh:- syscall <- lwp_sigmask +0 12312 30 func_abc.sh:6 cmd -> sleep +0 12312 30 func_abc.sh:- syscall -> waitsys +0 12312 1007259 func_abc.sh:- syscall <- waitsys +0 12312 29 func_abc.sh:- syscall -> ioctl +0 12312 17 func_abc.sh:- syscall <- ioctl +0 12312 11 func_abc.sh:- syscall -> setpgrp +0 12312 9 func_abc.sh:- syscall <- setpgrp +0 12312 9 func_abc.sh:- syscall -> ioctl +0 12312 9 func_abc.sh:- syscall <- ioctl +0 12312 9 func_abc.sh:- syscall -> ioctl +0 12312 35 func_abc.sh:- syscall <- ioctl +0 12312 12 func_abc.sh:- syscall -> waitsys +0 12312 25 func_abc.sh:- syscall <- waitsys +0 12312 15 func_abc.sh:0 cmd <- sleep +0 12312 31 func_abc.sh:- sh <- execute +0 12312 13 func_abc.sh:- sh <- execute +0 12312 11 func_abc.sh:- func <- func_c +0 12312 14 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- func <- func_b +0 12312 10 func_abc.sh:- sh <- execute +0 12312 18 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- sh <- execute +0 12312 9 func_abc.sh:- func <- func_a +0 12312 9 func_abc.sh:- sh <- execute +0 12312 12 func_abc.sh:- syscall -> brk +0 12312 11 func_abc.sh:- syscall <- brk +0 12312 12 func_abc.sh:- syscall -> read +0 12312 16 func_abc.sh:- syscall <- read +0 12312 10 func_abc.sh:- syscall -> ioctl +0 12312 9 func_abc.sh:- syscall <- ioctl +0 12312 10 func_abc.sh:- syscall -> ioctl +0 12312 8 func_abc.sh:- syscall <- ioctl +0 12312 11 func_abc.sh:- syscall -> close +0 12312 13 func_abc.sh:- syscall <- close +0 12312 12 func_abc.sh:- sh -> endjobs +0 12312 14 func_abc.sh:- sh <- endjobs +0 12312 10 func_abc.sh:- sh <- exfile +0 12312 11 func_abc.sh:- sh -> endjobs +0 12312 9 func_abc.sh:- sh <- endjobs +0 12312 37 func_abc.sh:- syscall -> open64 +0 12312 103 func_abc.sh:- syscall <- open64 +0 12312 11 func_abc.sh:- syscall -> ioctl +0 12312 11 func_abc.sh:- syscall <- ioctl +0 12312 11 func_abc.sh:- syscall -> close +0 12312 15 func_abc.sh:- syscall <- close +0 12312 32 func_abc.sh:- syscall -> rexit + +Here you can see the output showing the path the script follows as it is +executed. + +At the end of the sh_syscolor_example.txt file, you can see the steps that the +script goes through when it runs func_a. The output contains the two +consecutive lines: + +0 12979 14 func_abc.sh:23 line --  +0 12979 32 func_abc.sh:23 func -> func_a + +Here we trace many more events that happen in between these two lines, as seen +below: + +0 12312 9 func_abc.sh:23 line --  +0 12312 14 func_abc.sh:- sh -> estabf +0 12312 10 func_abc.sh:- sh <- estabf +0 12312 10 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 18 func_abc.sh:- sh -> endstak +0 12312 9 func_abc.sh:- sh <- endstak +0 12312 12 func_abc.sh:- sh -> expand +0 12312 10 func_abc.sh:- sh <- expand +0 12312 14 func_abc.sh:23 func -> func_a +0 12312 14 func_abc.sh:- sh -> execute +0 12312 9 func_abc.sh:- sh -> execute + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_stat_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_stat_example.txt new file mode 100644 index 00000000000..a44a5638f66 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_stat_example.txt @@ -0,0 +1,44 @@ +Following are examples of running sh_stat.d on Shell scripts. + +sh_stat.d shows you the number of events per second that have happened since +the last line output. The default interval is 1 second, but you can specify +other intervals as arguments to the script. + +This shows the sh_stat.d script reflecting the Code/Shell/func_slow.sh script. + + # sh_stat.d + TIME EXEC/s FUNCS/s BLTINS/s SUB-SH/s CMD/s + 2007 Sep 17 03:29:02 1 1 50 96 0 + 2007 Sep 17 03:29:03 0 1 151 300 0 + 2007 Sep 17 03:29:04 0 1 142 280 0 + 2007 Sep 17 03:29:05 0 0 132 262 0 + 2007 Sep 17 03:29:06 0 0 122 245 0 + 2007 Sep 17 03:29:07 0 0 9 17 0 + 2007 Sep 17 03:29:08 0 0 0 0 0 + 2007 Sep 17 03:29:09 0 0 0 0 0 + ^C + +We can see that at 2007 Sep 17 03:29:04 there were 0 Bourne shells executed, +one function called, 142 built-in commands called, 280 sub-shells created and +0 external commands called. + + +Here the script runs when Mozilla Firefox is started. + + # sh_stat.d + TIME EXEC/s FUNCS/s BLTINS/s SUB-SH/s CMD/s + 2007 Sep 17 03:29:52 1 9 52 38 2 + 2007 Sep 17 03:29:53 0 0 0 0 0 + 2007 Sep 17 03:29:54 0 0 0 0 0 + 2007 Sep 17 03:29:55 0 0 0 0 0 + 2007 Sep 17 03:29:56 0 0 0 0 0 + 2007 Sep 17 03:29:57 0 0 0 0 0 + 2007 Sep 17 03:29:58 0 0 0 0 0 + 2007 Sep 17 03:29:59 0 0 0 0 0 + 2007 Sep 17 03:30:00 0 0 0 0 0 + 2007 Sep 17 03:30:01 1 1 8 0 0 + 2007 Sep 17 03:30:02 0 0 0 0 0 + 2007 Sep 17 03:30:03 0 0 0 0 0 + 2007 Sep 17 03:30:04 0 0 0 0 0 + ^C + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_syscalls_example.txt new file mode 100644 index 00000000000..fbda09525d3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_syscalls_example.txt @@ -0,0 +1,59 @@ +The following are examples of sh_syscalls.d. + +This is a simple script to count Shell functions, built-ins, external command +executions and system calls. Here we trace an example program - +Code/Shell/func_abc.sh. + +# sh_syscalls.d -c ./func_abc.sh -o /tmp/out +Function A +Function B +Function C + +# cat /tmp/out +Tracing... Hit Ctrl-C to end. + +Calls for PID 12966, + + FILE TYPE NAME COUNT + func_abc.sh func func_a 1 + func_abc.sh func func_b 1 + func_abc.sh func func_c 1 + func_abc.sh syscall getrlimit 1 + func_abc.sh syscall mmap 1 + func_abc.sh syscall munmap 1 + func_abc.sh syscall rexit 1 + func_abc.sh syscall schedctl 1 + func_abc.sh syscall sigaltstack 1 + func_abc.sh syscall stat64 1 + func_abc.sh syscall sysi86 1 + func_abc.sh syscall access 2 + func_abc.sh syscall fcntl 2 + func_abc.sh syscall getgid 2 + func_abc.sh syscall getpid 2 + func_abc.sh syscall setcontext 2 + func_abc.sh syscall sysconfig 2 + func_abc.sh builtin echo 3 + func_abc.sh cmd sleep 3 + func_abc.sh syscall fork1 3 + func_abc.sh syscall getuid 3 + func_abc.sh syscall lwp_sigmask 3 + func_abc.sh syscall open64 3 + func_abc.sh syscall read 3 + func_abc.sh syscall write 3 + func_abc.sh syscall close 5 + func_abc.sh syscall setpgrp 5 + func_abc.sh syscall waitsys 6 + func_abc.sh syscall brk 9 + func_abc.sh syscall ioctl 15 + func_abc.sh syscall sigaction 53 + +While tracing, three functions were called - func_a(), func_b() and +func_c(). There were 3 instances of the shell built-in 'echo' being called, +and 3 executions of the sleep command (which is probably /usr/bin/sleep - use +the syscall provider to confirm). There were numerous system calls made, +including 9 brk()'s, 15 ioctl()'s and 53 sigaction()'s. + +This script can provide an insight to how a script is interacting +with the system, by providing function calls, commands, built-ins and system +calls in the same output. + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_syscolors_example.txt new file mode 100644 index 00000000000..ccc722a825b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_syscolors_example.txt @@ -0,0 +1,328 @@ +The following are examples of sh_syscolors.d. + +This is a simple script to trace the flow of Shell functions, lines, and +system calls made. It renders the output in color ("colour") using terminal +escape sequences (which you can tweak by modifying the script). + +Here it traces the example program, Code/Shell/func_abc.sh. + +WARNING: This output is full of terminal escape sequences, so if you are +trying to view this through an editor or web browser - it may look awful. +Try viewing this using "more" (although, depending on your terminal, it +still may look awful). + +# sh_syscolors.d -c ./func_abc.sh -o /tmp/out +Function A +Function B +Function C + +# cat /tmp/out +C PID DELTA(us) FILE:LINE TYPE -- NAME +0 12979 2 func_abc.sh:- syscall -> munmap +0 12979 35 func_abc.sh:- syscall <- munmap +0 12979 56 func_abc.sh:- syscall -> mmap +0 12979 18 func_abc.sh:- syscall <- mmap +0 12979 40 func_abc.sh:- syscall -> setcontext +0 12979 11 func_abc.sh:- syscall <- setcontext +0 12979 11 func_abc.sh:- syscall -> getrlimit +0 12979 11 func_abc.sh:- syscall <- getrlimit +0 12979 10 func_abc.sh:- syscall -> getpid +0 12979 9 func_abc.sh:- syscall <- getpid +0 12979 61 func_abc.sh:- syscall -> setcontext +0 12979 9 func_abc.sh:- syscall <- setcontext +0 12979 865 func_abc.sh:- syscall -> sysi86 +0 12979 14 func_abc.sh:- syscall <- sysi86 +0 12979 84 func_abc.sh:- syscall -> open64 +0 12979 89 func_abc.sh:- syscall <- open64 +0 12979 14 func_abc.sh:- syscall -> ioctl +0 12979 35 func_abc.sh:- syscall <- ioctl +0 12979 15 func_abc.sh:- syscall -> close +0 12979 16 func_abc.sh:- syscall <- close +0 12979 119 func_abc.sh:- syscall -> getpid +0 12979 10 func_abc.sh:- syscall <- getpid +0 12979 17 func_abc.sh:- syscall -> setpgrp +0 12979 10 func_abc.sh:- syscall <- setpgrp +0 12979 11 func_abc.sh:- syscall -> setpgrp +0 12979 8 func_abc.sh:- syscall <- setpgrp +0 12979 12 func_abc.sh:- syscall -> access +0 12979 20 func_abc.sh:- syscall <- access +0 12979 15 func_abc.sh:- syscall -> brk +0 12979 11 func_abc.sh:- syscall <- brk +0 12979 15 func_abc.sh:- syscall -> sysconfig +0 12979 9 func_abc.sh:- syscall <- sysconfig +0 12979 9 func_abc.sh:- syscall -> sysconfig +0 12979 9 func_abc.sh:- syscall <- sysconfig +0 12979 11 func_abc.sh:- syscall -> sigaltstack +0 12979 9 func_abc.sh:- syscall <- sigaltstack +0 12979 16 func_abc.sh:- syscall -> sigaction +0 12979 10 func_abc.sh:- syscall <- sigaction +0 12979 12 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 10 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 10 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 10 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 9 func_abc.sh:- syscall -> sigaction +0 12979 8 func_abc.sh:- syscall <- sigaction +0 12979 10 func_abc.sh:- syscall -> sigaction +0 12979 9 func_abc.sh:- syscall <- sigaction +0 12979 61 func_abc.sh:- syscall -> brk +0 12979 9 func_abc.sh:- syscall <- brk +0 12979 13 func_abc.sh:- syscall -> getuid +0 12979 9 func_abc.sh:- syscall <- getuid +0 12979 10 func_abc.sh:- syscall -> getuid +0 12979 8 func_abc.sh:- syscall <- getuid +0 12979 11 func_abc.sh:- syscall -> getgid +0 12979 9 func_abc.sh:- syscall <- getgid +0 12979 10 func_abc.sh:- syscall -> getgid +0 12979 9 func_abc.sh:- syscall <- getgid +0 12979 15 func_abc.sh:- syscall -> open64 +0 12979 19 func_abc.sh:- syscall <- open64 +0 12979 11 func_abc.sh:- syscall -> close +0 12979 9 func_abc.sh:- syscall <- close +0 12979 24 func_abc.sh:- syscall -> fcntl +0 12979 23 func_abc.sh:- syscall <- fcntl +0 12979 10 func_abc.sh:- syscall -> close +0 12979 10 func_abc.sh:- syscall <- close +0 12979 9 func_abc.sh:- syscall -> fcntl +0 12979 9 func_abc.sh:- syscall <- fcntl +0 12979 28 func_abc.sh:- syscall -> ioctl +0 12979 42 func_abc.sh:- syscall <- ioctl +0 12979 10 func_abc.sh:- syscall -> ioctl +0 12979 9 func_abc.sh:- syscall <- ioctl +0 12979 14 func_abc.sh:- syscall -> read +0 12979 33 func_abc.sh:- syscall <- read +0 12979 11 func_abc.sh:- syscall -> brk +0 12979 21 func_abc.sh:- syscall <- brk +0 12979 12 func_abc.sh:- syscall -> brk +0 12979 9 func_abc.sh:- syscall <- brk +0 12979 19 func_abc.sh:- syscall -> brk +0 12979 9 func_abc.sh:- syscall <- brk +0 12979 11 func_abc.sh:- syscall -> brk +0 12979 9 func_abc.sh:- syscall <- brk +0 12979 11 func_abc.sh:- syscall -> read +0 12979 15 func_abc.sh:- syscall <- read +0 12979 28 func_abc.sh:- syscall -> brk +0 12979 9 func_abc.sh:- syscall <- brk +0 12979 10 func_abc.sh:- syscall -> brk +0 12979 8 func_abc.sh:- syscall <- brk +0 12979 14 func_abc.sh:23 line --  +0 12979 32 func_abc.sh:23 func -> func_a +0 12979 16 func_abc.sh:18 line --  +0 12979 18 func_abc.sh:18 builtin -> echo +0 12979 21 func_abc.sh:- syscall -> write +0 12979 33 func_abc.sh:- syscall <- write +0 12979 311 func_abc.sh:0 builtin <- echo +0 12979 65 func_abc.sh:19 line --  +0 12979 17 func_abc.sh:- syscall -> getuid +0 12979 10 func_abc.sh:- syscall <- getuid +0 12979 15 func_abc.sh:- syscall -> stat64 +0 12979 25 func_abc.sh:- syscall <- stat64 +0 12979 11 func_abc.sh:- syscall -> access +0 12979 15 func_abc.sh:- syscall <- access +0 12979 18 func_abc.sh:- syscall -> schedctl +0 12979 46 func_abc.sh:- syscall <- schedctl +0 12979 220 func_abc.sh:- syscall -> fork1 +0 12979 258957 func_abc.sh:- syscall <- fork1 +0 12979 244 func_abc.sh:- syscall -> lwp_sigmask +0 12979 16 func_abc.sh:- syscall <- lwp_sigmask +0 12979 31 func_abc.sh:19 cmd -> sleep +0 12979 53 func_abc.sh:- syscall -> waitsys +0 12979 1008036 func_abc.sh:- syscall <- waitsys +0 12979 38 func_abc.sh:- syscall -> ioctl +0 12979 18 func_abc.sh:- syscall <- ioctl +0 12979 12 func_abc.sh:- syscall -> setpgrp +0 12979 10 func_abc.sh:- syscall <- setpgrp +0 12979 9 func_abc.sh:- syscall -> ioctl +0 12979 9 func_abc.sh:- syscall <- ioctl +0 12979 11 func_abc.sh:- syscall -> ioctl +0 12979 37 func_abc.sh:- syscall <- ioctl +0 12979 12 func_abc.sh:- syscall -> waitsys +0 12979 26 func_abc.sh:- syscall <- waitsys +0 12979 14 func_abc.sh:0 cmd <- sleep +0 12979 21 func_abc.sh:20 line --  +0 12979 28 func_abc.sh:20 func -> func_b +0 12979 15 func_abc.sh:11 line --  +0 12979 17 func_abc.sh:11 builtin -> echo +0 12979 19 func_abc.sh:- syscall -> write +0 12979 33 func_abc.sh:- syscall <- write +0 12979 310 func_abc.sh:0 builtin <- echo +0 12979 16 func_abc.sh:12 line --  +0 12979 226 func_abc.sh:- syscall -> fork1 +0 12979 64931 func_abc.sh:- syscall <- fork1 +0 12979 262 func_abc.sh:- syscall -> lwp_sigmask +0 12979 16 func_abc.sh:- syscall <- lwp_sigmask +0 12979 31 func_abc.sh:12 cmd -> sleep +0 12979 31 func_abc.sh:- syscall -> waitsys +0 12979 1003941 func_abc.sh:- syscall <- waitsys +0 12979 30 func_abc.sh:- syscall -> ioctl +0 12979 19 func_abc.sh:- syscall <- ioctl +0 12979 11 func_abc.sh:- syscall -> setpgrp +0 12979 9 func_abc.sh:- syscall <- setpgrp +0 12979 9 func_abc.sh:- syscall -> ioctl +0 12979 9 func_abc.sh:- syscall <- ioctl +0 12979 9 func_abc.sh:- syscall -> ioctl +0 12979 38 func_abc.sh:- syscall <- ioctl +0 12979 11 func_abc.sh:- syscall -> waitsys +0 12979 26 func_abc.sh:- syscall <- waitsys +0 12979 14 func_abc.sh:0 cmd <- sleep +0 12979 33 func_abc.sh:13 line --  +0 12979 27 func_abc.sh:13 func -> func_c +0 12979 15 func_abc.sh:5 line --  +0 12979 17 func_abc.sh:5 builtin -> echo +0 12979 20 func_abc.sh:- syscall -> write +0 12979 33 func_abc.sh:- syscall <- write +0 12979 309 func_abc.sh:0 builtin <- echo +0 12979 17 func_abc.sh:6 line --  +0 12979 267 func_abc.sh:- syscall -> fork1 +0 12979 64649 func_abc.sh:- syscall <- fork1 +0 12979 257 func_abc.sh:- syscall -> lwp_sigmask +0 12979 16 func_abc.sh:- syscall <- lwp_sigmask +0 12979 31 func_abc.sh:6 cmd -> sleep +0 12979 31 func_abc.sh:- syscall -> waitsys +0 12979 1004183 func_abc.sh:- syscall <- waitsys +0 12979 31 func_abc.sh:- syscall -> ioctl +0 12979 18 func_abc.sh:- syscall <- ioctl +0 12979 11 func_abc.sh:- syscall -> setpgrp +0 12979 9 func_abc.sh:- syscall <- setpgrp +0 12979 9 func_abc.sh:- syscall -> ioctl +0 12979 9 func_abc.sh:- syscall <- ioctl +0 12979 9 func_abc.sh:- syscall -> ioctl +0 12979 38 func_abc.sh:- syscall <- ioctl +0 12979 12 func_abc.sh:- syscall -> waitsys +0 12979 27 func_abc.sh:- syscall <- waitsys +0 12979 14 func_abc.sh:0 cmd <- sleep +0 12979 32 func_abc.sh:- func <- func_c +0 12979 16 func_abc.sh:- func <- func_b +0 12979 10 func_abc.sh:- func <- func_a +0 12979 13 func_abc.sh:- syscall -> brk +0 12979 12 func_abc.sh:- syscall <- brk +0 12979 12 func_abc.sh:- syscall -> read +0 12979 16 func_abc.sh:- syscall <- read +0 12979 10 func_abc.sh:- syscall -> ioctl +0 12979 9 func_abc.sh:- syscall <- ioctl +0 12979 10 func_abc.sh:- syscall -> ioctl +0 12979 9 func_abc.sh:- syscall <- ioctl +0 12979 11 func_abc.sh:- syscall -> close +0 12979 13 func_abc.sh:- syscall <- close +0 12979 37 func_abc.sh:- syscall -> open64 +0 12979 105 func_abc.sh:- syscall <- open64 +0 12979 11 func_abc.sh:- syscall -> ioctl +0 12979 11 func_abc.sh:- syscall <- ioctl +0 12979 11 func_abc.sh:- syscall -> close +0 12979 15 func_abc.sh:- syscall <- close +0 12979 31 func_abc.sh:- syscall -> rexit + +Here you can see the output showing the path the script follows as it is +executed. + +ie: +0 12979 14 func_abc.sh:23 line --  +0 12979 32 func_abc.sh:23 func -> func_a +0 12979 16 func_abc.sh:18 line --  +0 12979 18 func_abc.sh:18 builtin -> echo +0 12979 21 func_abc.sh:- syscall -> write +0 12979 33 func_abc.sh:- syscall <- write +0 12979 311 func_abc.sh:0 builtin <- echo +0 12979 65 func_abc.sh:19 line --  + +shows that on CPU 0 we run func_a (which is line 23 of the example script), +where it uses the shell built-in echo command (on line 18 of the example +script) to write a line of text to the screen. You can see in column 3 (the +delta time) it takes 311 microseconds from when the write syscall finishes to +when the echo built-in completes its clean-up and finishes. + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_wasted_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_wasted_example.txt new file mode 100644 index 00000000000..b11f9523db3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_wasted_example.txt @@ -0,0 +1,45 @@ +Many shell programmers are in the habit of using calls to external commands +instead of using shell built-in commands (an example of this is a call to +usr/bin/echo instead of using the echo command built into the shell. + +This script shows sh_wasted.d tracing a shell script that calls /usr/bin/echo +instead of using the built-in. + +# sh_wasted.d -c ./func_waste.sh +Tracing... Hit Ctrl-C to end. +Function A +Function B +Function C +Script duration: 3101631 us + +External command elapsed times, + FILE NAME TIME(us) + func_waste.sh sleep 3019573 + +Wasted command elapsed times, + FILE NAME TIME(us) + func_waste.sh /usr/bin/echo 26510 + +You can see that the calls to /usr/bin/echo took around 26 thousand +microseconds; time wasted by the shell having to access an external command. + + +Here we trace the same script, except it uses the shell built-in echo command. + +# sh_wasted.d -c ./func_abc.sh +Function A +Tracing... Hit Ctrl-C to end. +Function B +Function C +Script duration: 3032616 us + +External command elapsed times, + FILE NAME TIME(us) + func_abc.sh sleep 3012920 + +Wasted command elapsed times, + FILE NAME TIME(us) + +The total time here is less and there are no 'wasted' calls to external +commands. + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_who_example.txt new file mode 100644 index 00000000000..b35e8e4531d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sh_who_example.txt @@ -0,0 +1,45 @@ +These are examples of the results after running the sh_who.d script. + +This script shows which UIDs and PIDs are running shell scripts, and how +active they are. It measures the number of lines executed according to +the line probe - which is a useful, but rough measure of shell activity. + +Here it runs as a script executes three times. + +# sh_who.d +Tracing... Hit Ctrl-C to end. +^C + PID UID LINES FILE + 13663 0 9 ./func_abc.sh + 13667 0 9 ./func_abc.sh + 13671 0 9 ./func_abc.sh + +We see func_abc.sh ran three seperate times, each with nine lines of shell +activity. + + +Here we trace an instance of starting Mozilla Firefox. + +# sh_who.d +Tracing... Hit Ctrl-C to end. +^C + PID UID LINES FILE + 13678 100 1 firefox + 13679 100 1 firefox + 13680 100 1 firefox + 13681 100 1 firefox + 13683 100 1 firefox + 13685 100 1 firefox + 13686 100 1 firefox + 13687 100 1 firefox + 13690 100 1 firefox + 13693 100 1 /usr/lib/firefox/run-mozilla.sh + 13694 100 1 /usr/lib/firefox/run-mozilla.sh + 13695 100 1 /usr/lib/firefox/run-mozilla.sh + 13692 100 55 /usr/lib/firefox/run-mozilla.sh + 13677 100 75 firefox + +Firefox itself (PID 13677) ran 75 lines of code. There are also instances of +firefox running a single line of code with a different PID each time. These +are probably calls to subshells. Use the sh provider to confirm. + diff --git a/cddl/contrib/dtracetoolkit/Examples/shellsnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/shellsnoop_example.txt new file mode 100644 index 00000000000..be307f80f63 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/shellsnoop_example.txt @@ -0,0 +1,112 @@ +shellsnoop captures the text input and output from shells running on the +system. In the following example shellsnoop was run in one window, while +in another several commands were run: date, cal, uname -a, uptime and find. +shellsnoop has successfully captured the text that was displayed on the +other window. + + +# shellsnoop + PID PPID CMD DIR TEXT + 4724 3762 ksh R + 4724 3762 ksh W date + + 4741 4724 date W Sun Mar 28 23:10:06 EST 2004 + 4724 3762 ksh R + 4724 3762 ksh W jupiter:/etc/init.d> + 4724 3762 ksh R + 4724 3762 ksh R + 4724 3762 ksh W cal + + 4742 4724 cal W March 2004 + 4742 4724 cal W S M Tu W Th F S + 4742 4724 cal W 1 2 3 4 5 6 + 4742 4724 cal W 7 8 9 10 11 12 13 + 4742 4724 cal W 14 15 16 17 18 19 20 + 4742 4724 cal W 21 22 23 24 25 26 27 + 4742 4724 cal W 28 29 30 31 + 4742 4724 cal W + 4724 3762 ksh R + 4724 3762 ksh W jupiter:/etc/init.d> + 4724 3762 ksh R + 4724 3762 ksh R + 4724 3762 ksh W uname -a + + 4743 4724 uname W SunOS jupiter 5.10 s10_51 i86pc i386 i86pc + 4724 3762 ksh R + 4724 3762 ksh W jupiter:/etc/init.d> + 4724 3762 ksh R + 4724 3762 ksh R + 4724 3762 ksh W uptime + + 4744 4724 uptime W 11:10pm up 4 day(s), 11:15, 4 users, load average: 0.05, 0.02, 0.02 + 4724 3762 ksh R + 4724 3762 ksh W jupiter:/etc/init.d> + 4724 3762 ksh R + 4724 3762 ksh R + 4724 3762 ksh R + 4724 3762 ksh W jupiter:/etc/init.d> + 4724 3762 ksh R + 4724 3762 ksh R + 4724 3762 ksh W ls -l d* + + 4745 4724 ls W -rwxr--r-- 3 root sys 1292 Jan 14 16:24 devfsadm + 4745 4724 ls W -rwxr--r-- 1 root sys 904 Jan 14 16:24 devlinks + 4745 4724 ls W -rwxr--r-- 6 root sys 621 Jan 14 16:17 dhcp + 4745 4724 ls W -rwxr--r-- 2 root sys 494 Jan 14 16:17 dhcpagent + 4745 4724 ls W -rwxr--r-- 5 root sys 1050 Jan 16 2002 directory + 4745 4724 ls W -rwxr--r-- 2 root sys 779 Jan 14 16:17 domainname + 4745 4724 ls W -rwxr--r-- 1 root sys 469 Jan 14 16:24 drvconfig + 4745 4724 ls W -r-xr-xr-x 4 root other 2804 Mar 27 13:37 dtlogin + 4724 3762 ksh R + 4724 3762 ksh W jupiter:/etc/init.d> + 4724 3762 ksh R + 4724 3762 ksh R + 4724 3762 ksh W find /etc/default + + 4746 4724 find W /etc/default + 4746 4724 find W /etc/default/cron + 4746 4724 find W /etc/default/devfsadm + 4746 4724 find W /etc/default/dhcpagent + 4746 4724 find W /etc/default/fs + 4746 4724 find W /etc/default/inetd + 4746 4724 find W /etc/default/inetinit + 4746 4724 find W /etc/default/kbd + 4746 4724 find W /etc/default/keyserv + 4746 4724 find W /etc/default/ipsec + 4746 4724 find W /etc/default/nss + 4746 4724 find W /etc/default/passwd + 4746 4724 find W /etc/default/syslogd + 4746 4724 find W /etc/default/tar + 4746 4724 find W /etc/default/utmpd + 4746 4724 find W /etc/default/init + 4746 4724 find W /etc/default/login + 4746 4724 find W /etc/default/su + 4746 4724 find W /etc/default/power + 4746 4724 find W /etc/default/sys-suspend + 4746 4724 find W /etc/default/rpc.nisd + 4746 4724 find W /etc/default/nfs +[...] + + + +shellsnoop has a "-q" option for running in "quiet" mode - the previous +columns are not printed, so only shell output is seen, + + # shellsnoop -q + # date + Wed Nov 30 16:19:48 EST 2005 + # + # cal + November 2005 + S M Tu W Th F S + 1 2 3 4 5 + 6 7 8 9 10 11 12 + 13 14 15 16 17 18 19 + 20 21 22 23 24 25 26 + 27 28 29 30 + + # + +The output appears somewhat boring, this is something you need to see +in realtime. + diff --git a/cddl/contrib/dtracetoolkit/Examples/shortlived_example.txt b/cddl/contrib/dtracetoolkit/Examples/shortlived_example.txt new file mode 100644 index 00000000000..ebe46925095 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/shortlived_example.txt @@ -0,0 +1,57 @@ +The following is an example of the shortlived.d program. +It can measure time spent processing short lived processes, +that may be responsible for heavy load on the system but +are usually difficult to see with sampling tools like prstat. + + + +Here we run in for a few seconds on a server, + + # shortlived.d + Tracing... Hit Ctrl-C to stop. + ^C + short lived processes: 0.456 secs + total sample duration: 9.352 secs + + Total time by process name, + date 12 ms + df 20 ms + ls 40 ms + perl 380 ms + + Total time by PPID, + 3279 452 ms + +In the above output, around 5% of the CPU was lost to short +lived processes - mostly perl. This may be many perl processes, +here we are aggregating on the process name not the instance. + + + +Now shortlived.d is run on a server with a performance problem, + + # uptime + 10:58pm up 5 day(s), 1:28, 1 user, load average: 2.20, 1.81, 1.04 + # + # shortlived.d + Tracing... Hit Ctrl-C to stop. + ^C + short lived processes: 4.546 secs + total sample duration: 9.858 secs + + Total time by process name, + expr 4122 ms + + Total time by PPID, + 3279 4122 ms + # + # ps -p 3279 + PID TTY TIME CMD + 3279 pts/10 0:45 report.sh + +shortlived.d showed that 50% of the CPU was consumed by short lived +processes, all of them the "expr" command, and all having the +parent proccess-ID 3279. We finished by checking PID 3279 to find +it is a Bourne shell script called "report.sh". + + diff --git a/cddl/contrib/dtracetoolkit/Examples/sigdist_example.txt b/cddl/contrib/dtracetoolkit/Examples/sigdist_example.txt new file mode 100644 index 00000000000..88b9df461f3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sigdist_example.txt @@ -0,0 +1,18 @@ +The following is a demonstration of the sigdist.d script. + + +Here we run sigdist.d, and in another window we kill -9 a sleep process, + + # ./sigdist.d + Tracing... Hit Ctrl-C to end. + ^C + SENDER RECIPIENT SIG COUNT + sched dtrace 2 1 + sched bash 18 1 + bash sleep 9 1 + sched Xorg 14 55 + +We can see the signal sent from bash to sleep. We can also see that Xorg +has recieved 55 signal 14s. a "man -s3head signal" may help explain what +signal 14 is (alarm clock). + diff --git a/cddl/contrib/dtracetoolkit/Examples/stacksize_example.txt b/cddl/contrib/dtracetoolkit/Examples/stacksize_example.txt new file mode 100644 index 00000000000..156f351d868 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/stacksize_example.txt @@ -0,0 +1,87 @@ +The following is a domonstration of the stacksize.d script. + + +Here it is run for a few seconds then Ctrl-C is hit. The output prints +distrubition plots of the size of the user stack as the value, and the +number of times sampled at that size as the count. + + # ./stacksize.d + Sampling... Hit Ctrl-C to end + + + automountd + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + nscd + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 256 | 0 + + svc.startd + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 512 | 0 + + sshd + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 4096 | 0 + + dtrace + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 2048 | 0 + + nautilus + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4096 | 0 + + Xvnc + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4096 | 0 + + gnome-vfs-daemon + value ------------- Distribution ------------- count + 2048 | 0 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 8192 | 0 + + Xorg + value ------------- Distribution ------------- count + 2048 | 0 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 8192 | 0 + + gnome-terminal + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@ 7 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@ 11 + 8192 | 0 + + acroread + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 92 + 4096 | 0 + + perl + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1945 + 2048 | 0 + + + Errors: + diff --git a/cddl/contrib/dtracetoolkit/Examples/statsnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/statsnoop_example.txt new file mode 100644 index 00000000000..842017ea433 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/statsnoop_example.txt @@ -0,0 +1,94 @@ +The following is an example of the statsnoop tool. + + +statsnoop is a companion to opensnoop, which traces a variety of stat() +calls rather than open() calls. + +Here I run statsnoop on my idle laptop for about 3 seconds, + + # statsnoop + UID PID COMM FD PATH + 0 1485 dtrace 0 /devices/pseudo/pts@0:6 + 100 791 dtwm -1 /usr/mail/brendan + 100 791 dtwm -1 /usr/mail/brendan + 100 791 dtwm -1 /usr/mail/brendan + 100 791 dtwm -1 /usr/mail/brendan + 100 795 sdtperfmeter 0 /devices/pseudo/mm@0:null + 0 803 rpc.rstatd 0 /devices/pseudo/udp@0:udp + 0 803 rpc.rstatd 0 /devices/pseudo/udp@0:udp + 100 795 sdtperfmeter 0 /devices/pseudo/mm@0:null + 100 791 dtwm 0 /export/home/brendan/.dt/Trash/.trashinfo + 100 791 dtwm 0 /export/home/brendan/.dt/Trash/.trashinfo + 100 791 dtwm 0 /devices/pseudo/mm@0:null + 100 783 ttsession 0 /devices/pseudo/pts@0:3 + 100 783 ttsession 0 /devices/pseudo/pts@0:3 + 100 783 ttsession 0 /devices/pseudo/pts@0:3 + 100 791 dtwm 0 /devices/pseudo/mm@0:null + 100 783 ttsession 0 /devices/pseudo/pts@0:3 + 100 783 ttsession 0 /devices/pseudo/pts@0:3 + 100 791 dtwm 0 /devices/pseudo/mm@0:null + 100 791 dtwm 0 /devices/pseudo/mm@0:null + 100 792 dtfile 0 /devices/pseudo/mm@0:null + 100 783 ttsession 0 /devices/pseudo/pts@0:3 + ^C + +It is interesting what turns up. In the above output, a "dtwm" process +with process ID 791 called stat on /usr/mail/brendan and received -1 as +a return value - as this file does not exist. (when were mailboxes ever +stored in /usr/mail??). + + +statsnoop has a variety of options, as opensnoop does. Here I trace stat()s +from processes called "bash", while a new bash shell is executed, + + # statsnoop -n bash + UID PID COMM FD PATH + 100 1493 bash 0 /usr/bin/bash + 100 1493 bash 0 /devices/pseudo/pts@0:8 + 100 1493 bash 0 /lib/libcurses.so.1 + 100 1493 bash 0 /lib/libsocket.so.1 + 100 1493 bash 0 /lib/libnsl.so.1 + 100 1493 bash 0 /lib/libdl.so.1 + 100 1493 bash 0 /lib/libc.so.1 + 100 1493 bash 0 /devices/pseudo/pts@0:8 + 100 1493 bash 0 /devices/pseudo/pts@0:8 + 100 1493 bash 0 /export/home/brendan + 100 1493 bash 0 . + 100 1493 bash 0 /export/home/brendan/.bashrc + 100 1493 bash -1 /usr/mail/brendan + 100 1493 bash 0 /export/home/brendan/.bash_history + 100 1493 bash 0 /export/home/brendan/.bash_history + 100 1493 bash 0 /export/home/brendan/.bash_history + 100 1493 bash -1 /export/home/brendan/.inputrc + 100 1493 bash 0 . + ^C + +bash also checked /usr/mail/brendan? hmm... + + $ echo $MAIL + /usr/mail/brendan + +hmmmmm... + + $ cat .profile + # This is the default standard profile provided to a user. + # They are expected to edit it to meet their own needs. + + MAIL=/usr/mail/${LOGNAME:?} + +huh? + + $ cat /etc/skel/.profile + # This is the default standard profile provided to a user. + # They are expected to edit it to meet their own needs. + + MAIL=/usr/mail/${LOGNAME:?} + + $ cat /var/sadm/pkg/SUNWcsr/save/pspool/SUNWcsr/reloc/etc/skel/.profile + # This is the default standard profile provided to a user. + # They are expected to edit it to meet their own needs. + + MAIL=/usr/mail/${LOGNAME:?} + +oh. + diff --git a/cddl/contrib/dtracetoolkit/Examples/swapinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/swapinfo_example.txt new file mode 100644 index 00000000000..e8697660f9c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/swapinfo_example.txt @@ -0,0 +1,22 @@ +The following is a demonstration of the swapinfo.d script, + + # ./swapinfo.d + RAM _______Total 511 MB + RAM Unusable 8 MB + RAM Kernel 128 MB + RAM Locked 0 MB + RAM Used 256 MB + RAM Free 118 MB + + Disk _______Total 1023 MB + Disk Resv 626 MB + Disk Avail 397 MB + + Swap _______Total 1335 MB + Swap Resv 626 MB + Swap Avail 709 MB + Swap (Minfree) 62 MB + +The output above gives a summary of the state of virtual memory (swap) +on the system. + diff --git a/cddl/contrib/dtracetoolkit/Examples/sysbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/sysbypid_example.txt new file mode 100644 index 00000000000..2858c5147c6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/sysbypid_example.txt @@ -0,0 +1,45 @@ +The following is a demonstration of the sysbypid.d command, + + # sysbypid.d + Tracing... Hit Ctrl-C to end. + ^C + EXEC PID SYS VALUE + xterm 24030 rawch 1 + sched 0 rcvint 1 + fsflush 3 pswitch 1 + dtrace 19235 inv_swtch 1 + xterm 24030 syswrite 2 + Xorg 3597 syswrite 2 + xterm 24030 inv_swtch 2 + dtrace 19235 pswitch 2 + dtrace 19235 syswrite 2 + soffice.bin 4019 pswitch 3 + xterm 24030 pswitch 3 + mozilla-bin 3730 inv_swtch 4 + xterm 24030 sysread 4 + mozilla-bin 3730 readch 9 + mozilla-bin 3730 sysread 9 + Xorg 3597 pswitch 10 + Xorg 3597 sysread 11 + mozilla-bin 3730 syswrite 13 + java_vm 28209 pswitch 13 + sched 0 pswitch 15 + mozilla-bin 3730 pswitch 25 + setiathome 3929 trap 26 + setiathome 3929 pswitch 26 + setiathome 3929 inv_swtch 26 + dtrace 19235 writech 32 + dtrace 19235 outch 34 + dtrace 19235 trap 53 + Xorg 3597 writech 64 + xterm 24030 readch 96 + xterm 24030 writech 133 + mozilla-bin 3730 writech 905 + Xorg 3597 readch 1044 + +In the above output, the Xorg command with PID 3597 read 1044 bytes, as +indicated by readch. + +mozilla-bin with PID 3730 wrote 905 bytes, as indicated by the writech. + + diff --git a/cddl/contrib/dtracetoolkit/Examples/syscallbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/syscallbypid_example.txt new file mode 100644 index 00000000000..e51bb14cf0f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/syscallbypid_example.txt @@ -0,0 +1,50 @@ +The following is a demonstration of the syscallbypid.d script, + + +Here we run syscallbypid.d for a few seconds then hit Ctrl-C, + + # syscallbypid.d + Tracing... Hit Ctrl-C to end. + ^C + PID CMD SYSCALL COUNT + 11039 dtrace setcontext 1 + 11039 dtrace lwp_sigmask 1 + 7 svc.startd portfs 1 + 357 poold lwp_cond_wait 1 + 27328 java_vm lwp_cond_wait 1 + 1532 Xorg writev 1 + 11039 dtrace lwp_park 1 + 11039 dtrace schedctl 1 + 11039 dtrace mmap 1 + 361 sendmail pollsys 1 + 11039 dtrace fstat64 1 + 11039 dtrace sigaction 2 + 11039 dtrace write 2 + 361 sendmail lwp_sigmask 2 + 1659 mozilla-bin yield 2 + 11039 dtrace sysconfig 3 + 361 sendmail pset 3 + 20317 sshd read 4 + 361 sendmail gtime 4 + 20317 sshd write 4 + 27328 java_vm ioctl 6 + 11039 dtrace brk 8 + 1532 Xorg setcontext 8 + 1532 Xorg lwp_sigmask 8 + 20317 sshd pollsys 8 + 357 poold pollsys 13 + 1659 mozilla-bin read 16 + 20317 sshd lwp_sigmask 16 + 1532 Xorg setitimer 17 + 27328 java_vm pollsys 18 + 1532 Xorg pollsys 19 + 11039 dtrace p_online 21 + 1532 Xorg read 22 + 1659 mozilla-bin write 25 + 1659 mozilla-bin lwp_park 26 + 11039 dtrace ioctl 36 + 1659 mozilla-bin pollsys 155 + 1659 mozilla-bin ioctl 306 + +In the above output, we can see that "mozilla-bin" with PID 1659 made the +most system calls - 306 ioctl()s. diff --git a/cddl/contrib/dtracetoolkit/Examples/syscallbyproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/syscallbyproc_example.txt new file mode 100644 index 00000000000..7469b79cc88 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/syscallbyproc_example.txt @@ -0,0 +1,17 @@ +The following is an example of the syscallbyproc.d script, + + # syscallbyproc.d + dtrace: description 'syscall:::entry ' matched 228 probes + ^C + snmpd 1 + utmpd 2 + inetd 2 + nscd 7 + svc.startd 11 + sendmail 31 + poold 133 + dtrace 1720 + +The above output shows that dtrace made the most system calls in this sample, +1720 syscalls. + diff --git a/cddl/contrib/dtracetoolkit/Examples/syscallbysysc_example.txt b/cddl/contrib/dtracetoolkit/Examples/syscallbysysc_example.txt new file mode 100644 index 00000000000..d131a176c10 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/syscallbysysc_example.txt @@ -0,0 +1,24 @@ +The following is a demonstration of the syscallbysysc.d script, + + # syscallbysysc.d + dtrace: description 'syscall:::entry ' matched 228 probes + ^C + fstat 1 + setcontext 1 + lwp_park 1 + schedctl 1 + mmap 1 + sigaction 2 + pset 2 + lwp_sigmask 2 + gtime 3 + sysconfig 3 + write 4 + brk 6 + pollsys 7 + p_online 558 + ioctl 579 + +In the above output, the ioctl system call was the most common, occuring +579 times. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_calldist_example.txt new file mode 100644 index 00000000000..3388963411e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_calldist_example.txt @@ -0,0 +1,166 @@ +The following are examples of tcl_calldist.d. + +This script traces the elapsed time of Tcl procedures and commands and +prints a report containing distribution plots per function. Here it traces the +example program, Code/Tcl/func_abc.tcl + +# tcl_calldist.d +Tracing... Hit Ctrl-C to end. +^C + +Top 10 exclusive elapsed times (us), + PID=16033, cmd, namespace + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@ 1 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 |@@@@@@@@@@@@@ 1 + 256 | 0 + + PID=16033, cmd, puts + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + 128 |@@@@@@@@@@@@@ 1 + 256 | 0 + + PID=16033, cmd, tclInit + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + PID=16033, proc, func_a + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + PID=16033, proc, func_b + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + PID=16033, proc, func_c + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + PID=16033, cmd, file + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@ 4 + 8 |@@@@@@@ 2 + 16 |@@@@@@@ 2 + 32 |@@@ 1 + 64 |@@@@@@@@@@ 3 + 128 | 0 + + PID=16033, cmd, source + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + PID=16033, cmd, if + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@ 4 + 32 |@@@@@@@@@@@@@@@ 3 + 64 | 0 + 128 | 0 + 256 | 0 + 512 |@@@@@ 1 + 1024 | 0 + + PID=16033, cmd, after + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 1048576 | 0 + + +Top 10 inclusive elapsed times (us), + PID=16033, cmd, uplevel + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + PID=16033, cmd, tclInit + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + PID=16033, proc, tclInit + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + PID=16033, cmd, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + PID=16033, proc, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + PID=16033, cmd, func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + PID=16033, proc, func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + PID=16033, cmd, after + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 1048576 | 0 + + PID=16033, cmd, func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + + PID=16033, proc, func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + +The exclusive function elapsed times show that each func_a took between 256 +and 511 microseconds. This time excludes the time spent in any other functions. + +The inclusive elapsed times section shows that each func_a spent +took between 2.1 and 4.2 seconds. This time also includes the time spent in +any other commands or procedures called by func_a. + +These elapsed times are the absolute time from when the function began to +when it completed - which includes off-CPU time due to other system events +such as I/O, scheduling, interrupts, etc. + +Elapsed times are useful for identifying where latencies are. +See Notes/ALLelapsed_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive function time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_calls_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_calls_example.txt new file mode 100644 index 00000000000..5ffada4957a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_calls_example.txt @@ -0,0 +1,41 @@ +The following are examples of the results of running the tcl_calls.d script. + +In this example we see it running while the Code/Tcl/func_abc.tcl script is run. + +# tcl_calls.d Tracing... Hit Ctrl-C to end. +^C + PID TYPE NAME COUNT + 16021 cmd concat 1 + 16021 cmd exit 1 + 16021 cmd func_a 1 + 16021 cmd func_b 1 + 16021 cmd func_c 1 + 16021 cmd list 1 + 16021 cmd rename 1 + 16021 cmd source 1 + 16021 cmd tclInit 1 + 16021 cmd unset 1 + 16021 cmd uplevel 1 + 16021 cmd variable 1 + 16021 proc func_a 1 + 16021 proc func_b 1 + 16021 proc func_c 1 + 16021 proc tclInit 1 + 16021 cmd foreach 2 + 16021 cmd global 2 + 16021 cmd interp 2 + 16021 cmd package 2 + 16021 cmd set 2 + 16021 cmd after 3 + 16021 cmd namespace 3 + 16021 cmd puts 3 + 16021 cmd lappend 4 + 16021 cmd lsearch 4 + 16021 cmd if 8 + 16021 cmd info 11 + 16021 cmd file 12 + 16021 cmd proc 12 + +You can see that PID 16021 made quite a few different types of command and +procedure calls during its execution. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_calltime_example.txt new file mode 100644 index 00000000000..56d100af93e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_calltime_example.txt @@ -0,0 +1,61 @@ +The following are examples of tcl_calltime.d. + +This script traces the total elapsed time of different Tcl commands and +procedures and prints a report. Here it traces the example program, +Code/Tcl/func_abc.tcl + +# tcl_calltime.d +Tracing... Hit Ctrl-C to end. +^C + +Top 10 counts, + PID TYPE NAME COUNT + 16028 cmd after 3 + 16028 cmd namespace 3 + 16028 cmd puts 3 + 16028 cmd lappend 4 + 16028 cmd lsearch 4 + 16028 cmd if 8 + 16028 cmd info 11 + 16028 cmd file 12 + 16028 cmd proc 12 + 0 total - 85 + +Top 10 exclusive elapsed times (us), + PID TYPE NAME TOTAL + 16028 cmd tclInit 253 + 16028 cmd namespace 272 + 16028 proc func_c 330 + 16028 proc func_b 357 + 16028 proc func_a 363 + 16028 cmd file 416 + 16028 cmd if 852 + 16028 cmd source 929 + 16028 cmd after 3025152 + 0 total - 3030001 + +Top 10 inclusive elapsed times (us), + PID TYPE NAME TOTAL + 16028 cmd uplevel 1849 + 16028 proc tclInit 2519 + 16028 cmd tclInit 2772 + 16028 proc func_c 1010031 + 16028 cmd func_c 1010088 + 16028 proc func_b 2020059 + 16028 cmd func_b 2020106 + 16028 cmd after 3025152 + 16028 proc func_a 3026545 + 16028 cmd func_a 3026572 + +The output is in three sections. The first shows the top ten most executed +commands while the script is tracing. + +The second (Top 10 exclusive elapsed times) shows us the top ten slowest +commands or procedures, this number excludes any subroutines called during +command execution. + +The third (Top 10 inclusive elapsed times) shows us the top ten slowest +commands or procedures including any time spent in subroutines. You can see +that func_a took the most amount of time all up. This makes sense if you +compare the code at Code/Tcl/func_abc.tcl with the results. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_cpudist_example.txt new file mode 100644 index 00000000000..09126f603ab --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_cpudist_example.txt @@ -0,0 +1,164 @@ +The following are examples of tcl_cpudist.d. + +This script traces the on-CPU time of Tcl commands and procedures and +prints a report containing distribution plots per subroutine. Here it +traces the example program, Code/Tcl/func_slow.tcl. + +# tcl_cpudist.d +Tracing... Hit Ctrl-C to end. +^C + +Top 10 exclusive on-CPU times (us), + PID=16043, cmd, info + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@ 1 + 2 |@@@@@@@@@@@@@@@ 4 + 4 |@@@@ 1 + 8 |@@@@ 1 + 16 |@@@@@@@@@@@ 3 + 32 |@@@@ 1 + 64 | 0 + + PID=16043, cmd, namespace + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@ 1 + 2 |@@@@@@@@@@@@@ 1 + 4 | 0 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 |@@@@@@@@@@@@@ 1 + 256 | 0 + + PID=16043, cmd, puts + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 64 | 0 + 128 |@@@@@@@@@@@@@ 1 + 256 | 0 + + PID=16043, cmd, if + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@ 2 + 16 |@@@@@@@@@@@@@@@@@@@@ 4 + 32 |@@@@@ 1 + 64 | 0 + 128 |@@@@@ 1 + 256 | 0 + + PID=16043, cmd, tclInit + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + PID=16043, cmd, file + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@ 4 + 8 |@@@@@@@@@@@@@ 4 + 16 | 0 + 32 |@@@ 1 + 64 |@@@@@@@@@@ 3 + 128 | 0 + + PID=16043, cmd, source + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + PID=16043, proc, func_a + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + PID=16043, proc, func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + PID=16043, proc, func_c + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + +Top 10 inclusive on-CPU times (us), + PID=16043, cmd, source + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + PID=16043, cmd, uplevel + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + PID=16043, proc, tclInit + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + PID=16043, cmd, tclInit + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + PID=16043, cmd, func_c + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + PID=16043, proc, func_c + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + PID=16043, cmd, func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + + PID=16043, cmd, func_b + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + + PID=16043, proc, func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + + PID=16043, proc, func_b + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + +These on-CPU times are the time the thread spent running on a CPU, from when +the subroutine began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_cputime_example.txt new file mode 100644 index 00000000000..c736201e262 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_cputime_example.txt @@ -0,0 +1,67 @@ +Following are examples of running tcl_cputime.d. + +Here it runs while we execute Code/Tcl/func_slow.tcl + +# tcl_cputime.d +Tracing... Hit Ctrl-C to end. +^C + +Top 10 counts, + PID TYPE NAME COUNT + 16038 cmd set 2 + 16038 cmd namespace 3 + 16038 cmd puts 3 + 16038 cmd lappend 4 + 16038 cmd lsearch 4 + 16038 cmd if 8 + 16038 cmd info 11 + 16038 cmd file 12 + 16038 cmd proc 12 + 0 total - 82 + +Top 10 exclusive on-CPU times (us), + PID TYPE NAME TOTAL + 16038 cmd namespace 130 + 16038 cmd puts 232 + 16038 cmd if 310 + 16038 cmd tclInit 315 + 16038 cmd file 411 + 16038 cmd source 760 + 16038 proc func_a 535521 + 16038 proc func_b 1071082 + 16038 proc func_c 1619323 + 0 total - 3228670 + +Top 10 inclusive on-CPU times (us), + PID TYPE NAME TOTAL + 16038 cmd source 1359 + 16038 cmd uplevel 1367 + 16038 proc tclInit 1865 + 16038 cmd tclInit 2180 + 16038 proc func_c 1619360 + 16038 cmd func_c 1619404 + 16038 proc func_b 2690525 + 16038 cmd func_b 2690568 + 16038 proc func_a 3226247 + 16038 cmd func_a 3226275 + +We can see that the output is in three sections. The first section represents +the ten most commonly executed commands while the script is tracing. + +The exclusive function on-CPU times show that func_a spent around 0.5 seconds +on-CPU, func_b spent about 1.0 seconds, and func_c, 1.6 seconds. This excludes +time spent in other procedures or commands. + +The inclusive function on-CPU times show the time spent by these procedures in +total, including the time spent in other functions called, and since func_a +called func_b which called func_c, these times make sense. + +These on-CPU times are the time the thread spent running on a CPU, from when +the function began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive function time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_flow_example.txt new file mode 100644 index 00000000000..dd2dcd60c77 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_flow_example.txt @@ -0,0 +1,195 @@ +The following are examples of running tcl_flow.d. + +Here the script is tracing the execution of Code/Tcl/func_abc.tcl + +# tcl_flow.d + C PID TIME(us) -- CALL + 0 16068 3904942506169 > if + 0 16068 3904942506261 > info + 0 16068 3904942506286 < info + 0 16068 3904942506350 > proc + 0 16068 3904942506363 < proc + 0 16068 3904942506369 < if + 0 16068 3904942506383 > tclInit + 0 16068 3904942506605 -> tclInit + 0 16068 3904942506614 > global + 0 16068 3904942506626 < global + 0 16068 3904942506632 > global + 0 16068 3904942506638 < global + 0 16068 3904942506643 > rename + 0 16068 3904942506666 < rename + 0 16068 3904942506675 > info + 0 16068 3904942506685 < info + 0 16068 3904942506694 > info + 0 16068 3904942506721 < info + 0 16068 3904942506728 > unset + 0 16068 3904942506741 < unset + 0 16068 3904942506746 > concat + 0 16068 3904942506760 < concat + 0 16068 3904942506774 > file + 0 16068 3904942506792 < file + 0 16068 3904942506797 > file + 0 16068 3904942506880 < file + 0 16068 3904942506885 > file + 0 16068 3904942506895 < file + 0 16068 3904942506901 > file + 0 16068 3904942507009 < file + 0 16068 3904942507015 > file + 0 16068 3904942507025 < file + 0 16068 3904942507031 > file + 0 16068 3904942507118 < file + 0 16068 3904942507124 > file + 0 16068 3904942507133 < file + 0 16068 3904942507139 > file + 0 16068 3904942507193 < file + 0 16068 3904942507200 > uplevel + 0 16068 3904942507209 > source + 0 16068 3904942507649 > if + 0 16068 3904942507664 > info + 0 16068 3904942507673 < info + 0 16068 3904942507681 < if + 0 16068 3904942507691 > package + 0 16068 3904942507700 < package + 0 16068 3904942507712 > if + 0 16068 3904942507722 > info + 0 16068 3904942507728 < info + 0 16068 3904942507749 > info + 0 16068 3904942507773 < info + 0 16068 3904942507780 < if + 0 16068 3904942507797 > namespace + 0 16068 3904942507898 > variable + 0 16068 3904942507905 < variable + 0 16068 3904942507911 > info + 0 16068 3904942507923 < info + 0 16068 3904942507928 > info + 0 16068 3904942507934 < info + 0 16068 3904942507939 > info + 0 16068 3904942507947 < info + 0 16068 3904942507952 > file + 0 16068 3904942507971 < file + 0 16068 3904942507977 > list + 0 16068 3904942507991 < list + 0 16068 3904942507996 > foreach + 0 16068 3904942508020 > lsearch + 0 16068 3904942508028 < lsearch + 0 16068 3904942508034 > lappend + 0 16068 3904942508041 < lappend + 0 16068 3904942508051 > lsearch + 0 16068 3904942508056 < lsearch + 0 16068 3904942508061 > lappend + 0 16068 3904942508068 < lappend + 0 16068 3904942508073 < foreach + 0 16068 3904942508078 > info + 0 16068 3904942508086 < info + 0 16068 3904942508090 > file + 0 16068 3904942508108 < file + 0 16068 3904942508113 > file + 0 16068 3904942508129 < file + 0 16068 3904942508134 > file + 0 16068 3904942508142 < file + 0 16068 3904942508148 > lsearch + 0 16068 3904942508153 < lsearch + 0 16068 3904942508158 > lappend + 0 16068 3904942508166 < lappend + 0 16068 3904942508170 > info + 0 16068 3904942508176 < info + 0 16068 3904942508181 > foreach + 0 16068 3904942508190 > lsearch + 0 16068 3904942508195 < lsearch + 0 16068 3904942508200 > lappend + 0 16068 3904942508206 < lappend + 0 16068 3904942508211 < foreach + 0 16068 3904942508217 < namespace + 0 16068 3904942508243 > if + 0 16068 3904942508261 > interp + 0 16068 3904942508276 < interp + 0 16068 3904942508283 < if + 0 16068 3904942508296 > package + 0 16068 3904942508302 < package + 0 16068 3904942508312 > if + 0 16068 3904942508322 > interp + 0 16068 3904942508328 < interp + 0 16068 3904942508369 < if + 0 16068 3904942508387 > if + 0 16068 3904942508398 > namespace + 0 16068 3904942508406 < namespace + 0 16068 3904942508412 < if + 0 16068 3904942508424 > set + 0 16068 3904942508430 < set + 0 16068 3904942508437 > set + 0 16068 3904942508443 < set + 0 16068 3904942508451 > if + 0 16068 3904942508463 > namespace + 0 16068 3904942508469 < namespace + 0 16068 3904942508479 > proc + 0 16068 3904942508488 < proc + 0 16068 3904942508493 < if + 0 16068 3904942508573 > proc + 0 16068 3904942508582 < proc + 0 16068 3904942508599 > proc + 0 16068 3904942508609 < proc + 0 16068 3904942508638 > proc + 0 16068 3904942508645 < proc + 0 16068 3904942508664 > proc + 0 16068 3904942508673 < proc + 0 16068 3904942508686 > proc + 0 16068 3904942508693 < proc + 0 16068 3904942508737 > if + 0 16068 3904942508760 > proc + 0 16068 3904942508782 < proc + 0 16068 3904942508788 < if + 0 16068 3904942508826 > proc + 0 16068 3904942508837 < proc + 0 16068 3904942508843 < source + 0 16068 3904942508848 < uplevel + 0 16068 3904942508857 <- tclInit + 0 16068 3904942508871 < tclInit + 0 16068 3904942509050 > proc + 0 16068 3904942509059 < proc + 0 16068 3904942509067 > proc + 0 16068 3904942509074 < proc + 0 16068 3904942509081 > proc + 0 16068 3904942509088 < proc + 0 16068 3904942509094 > func_a + 0 16068 3904942509110 -> func_a + 0 16068 3904942509116 > puts + 0 16068 3904942509256 < puts + 0 16068 3904942509262 > after + 0 16068 3904943510998 < after + 0 16068 3904943511016 > func_b + 0 16068 3904943511050 -> func_b + 0 16068 3904943511058 > puts + 0 16068 3904943511090 < puts + 0 16068 3904943511094 > after + 0 16068 3904944520994 < after + 0 16068 3904944521013 > func_c + 0 16068 3904944521043 -> func_c + 0 16068 3904944521051 > puts + 0 16068 3904944521092 < puts + 0 16068 3904944521097 > after + 0 16068 3904945530993 < after + 0 16068 3904945531012 <- func_c + 0 16068 3904945531020 < func_c + 0 16068 3904945531025 <- func_b + 0 16068 3904945531029 < func_b + 0 16068 3904945531034 <- func_a + 0 16068 3904945531039 < func_a + 0 16068 3904945531064 > exit +^C + +You can see the output is in five columns. + +The first column is CPU-id, the second is PID, third is the time since boot in +microseconds since the previous action. The fourth and fifth columns +represent the action happening. The Tcl command or procedure name is prefixed +by an indicator reprenting what is happening. These may be -> (procedure +entry), <- (procedure return), > (command entry), or < (command return). + +As each action is taken, the fourth and fifth columns are indented by 2 spaces. +This shows which procedure or command is calling which. + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_flowtime_example.txt new file mode 100644 index 00000000000..8e07238e130 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_flowtime_example.txt @@ -0,0 +1,197 @@ +Following are examples of running tcl_flowtime.d. + +Here the tcl_flowtime.d script is running on the program +Code/Tcl/func_abc.tcl. + + +# tcl_flowtime.d + C PID TIME(us) DELTA(us) -- CALL + 0 17901 4436098007906 2 > if + 0 17901 4436098007976 70 > info + 0 17901 4436098007998 21 < info + 0 17901 4436098008050 52 > proc + 0 17901 4436098008063 12 < proc + 0 17901 4436098008069 6 < if + 0 17901 4436098008085 15 > tclInit + 0 17901 4436098008286 201 -> tclInit + 0 17901 4436098008295 8 > global + 0 17901 4436098008305 10 < global + 0 17901 4436098008311 6 > global + 0 17901 4436098008318 6 < global + 0 17901 4436098008323 5 > rename + 0 17901 4436098008342 18 < rename + 0 17901 4436098008353 10 > info + 0 17901 4436098008362 9 < info + 0 17901 4436098008369 6 > info + 0 17901 4436098008395 25 < info + 0 17901 4436098008403 8 > unset + 0 17901 4436098008410 6 < unset + 0 17901 4436098008416 5 > concat + 0 17901 4436098008425 8 < concat + 0 17901 4436098008440 15 > file + 0 17901 4436098008459 18 < file + 0 17901 4436098008465 6 > file + 0 17901 4436098008543 78 < file + 0 17901 4436098008550 7 > file + 0 17901 4436098008560 9 < file + 0 17901 4436098008567 7 > file + 0 17901 4436098008671 104 < file + 0 17901 4436098008678 7 > file + 0 17901 4436098008688 9 < file + 0 17901 4436098008695 6 > file + 0 17901 4436098008780 84 < file + 0 17901 4436098008787 6 > file + 0 17901 4436098008796 9 < file + 0 17901 4436098008803 6 > file + 0 17901 4436098008854 51 < file + 0 17901 4436098008862 7 > uplevel + 0 17901 4436098008872 10 > source + 0 17901 4436098009290 417 > if + 0 17901 4436098009304 14 > info + 0 17901 4436098009311 7 < info + 0 17901 4436098009319 7 < if + 0 17901 4436098009331 11 > package + 0 17901 4436098009340 9 < package + 0 17901 4436098009353 12 > if + 0 17901 4436098009363 10 > info + 0 17901 4436098009369 6 < info + 0 17901 4436098009390 20 > info + 0 17901 4436098009413 22 < info + 0 17901 4436098009421 7 < if + 0 17901 4436098009439 18 > namespace + 0 17901 4436098009530 90 > variable + 0 17901 4436098009537 7 < variable + 0 17901 4436098009544 6 > info + 0 17901 4436098009554 10 < info + 0 17901 4436098009561 6 > info + 0 17901 4436098009567 6 < info + 0 17901 4436098009573 5 > info + 0 17901 4436098009579 6 < info + 0 17901 4436098009586 6 > file + 0 17901 4436098009605 19 < file + 0 17901 4436098009611 6 > list + 0 17901 4436098009627 15 < list + 0 17901 4436098009633 6 > foreach + 0 17901 4436098009658 24 > lsearch + 0 17901 4436098009665 7 < lsearch + 0 17901 4436098009673 7 > lappend + 0 17901 4436098009680 7 < lappend + 0 17901 4436098009689 9 > lsearch + 0 17901 4436098009694 5 < lsearch + 0 17901 4436098009700 6 > lappend + 0 17901 4436098009707 6 < lappend + 0 17901 4436098009712 5 < foreach + 0 17901 4436098009719 6 > info + 0 17901 4436098009726 7 < info + 0 17901 4436098009732 5 > file + 0 17901 4436098009749 17 < file + 0 17901 4436098009756 6 > file + 0 17901 4436098009772 16 < file + 0 17901 4436098009778 6 > file + 0 17901 4436098009787 9 < file + 0 17901 4436098009795 7 > lsearch + 0 17901 4436098009800 5 < lsearch + 0 17901 4436098009806 6 > lappend + 0 17901 4436098009812 5 < lappend + 0 17901 4436098009818 5 > info + 0 17901 4436098009823 5 < info + 0 17901 4436098009830 6 > foreach + 0 17901 4436098009840 9 > lsearch + 0 17901 4436098009845 5 < lsearch + 0 17901 4436098009851 6 > lappend + 0 17901 4436098009857 5 < lappend + 0 17901 4436098009862 5 < foreach + 0 17901 4436098009868 5 < namespace + 0 17901 4436098009896 27 > if + 0 17901 4436098009915 18 > interp + 0 17901 4436098009922 7 < interp + 0 17901 4436098009930 8 < if + 0 17901 4436098009943 12 > package + 0 17901 4436098009949 5 < package + 0 17901 4436098009960 10 > if + 0 17901 4436098009970 10 > interp + 0 17901 4436098009976 5 < interp + 0 17901 4436098010018 41 < if + 0 17901 4436098010036 18 > if + 0 17901 4436098010049 12 > namespace + 0 17901 4436098010057 7 < namespace + 0 17901 4436098010063 6 < if + 0 17901 4436098010074 11 > set + 0 17901 4436098010081 6 < set + 0 17901 4436098010089 8 > set + 0 17901 4436098010095 5 < set + 0 17901 4436098010104 9 > if + 0 17901 4436098010116 12 > namespace + 0 17901 4436098010122 6 < namespace + 0 17901 4436098010133 10 > proc + 0 17901 4436098010142 8 < proc + 0 17901 4436098010148 5 < if + 0 17901 4436098010228 79 > proc + 0 17901 4436098010237 8 < proc + 0 17901 4436098010255 18 > proc + 0 17901 4436098010264 9 < proc + 0 17901 4436098010293 29 > proc + 0 17901 4436098010301 7 < proc + 0 17901 4436098010320 18 > proc + 0 17901 4436098010329 9 < proc + 0 17901 4436098010342 13 > proc + 0 17901 4436098010350 7 < proc + 0 17901 4436098010394 44 > if + 0 17901 4436098010418 23 > proc + 0 17901 4436098010437 18 < proc + 0 17901 4436098010443 6 < if + 0 17901 4436098010563 120 > proc + 0 17901 4436098010575 12 < proc + 0 17901 4436098010582 7 < source + 0 17901 4436098010588 5 < uplevel + 0 17901 4436098010596 8 <- tclInit + 0 17901 4436098010610 13 < tclInit + 0 17901 4436098010800 190 > proc + 0 17901 4436098010809 8 < proc + 0 17901 4436098010818 9 > proc + 0 17901 4436098010825 6 < proc + 0 17901 4436098010833 8 > proc + 0 17901 4436098010840 6 < proc + 0 17901 4436098010847 7 > func_a + 0 17901 4436098010863 15 -> func_a + 0 17901 4436098010870 6 > puts + 0 17901 4436098011006 136 < puts + 0 17901 4436098011014 7 > after + 0 17901 4436099020588 1009573 < after + 0 17901 4436099020611 23 > func_b + 0 17901 4436099020646 34 -> func_b + 0 17901 4436099020655 8 > puts + 0 17901 4436099020697 41 < puts + 0 17901 4436099020703 6 > after + 0 17901 4436100030614 1009910 < after + 0 17901 4436100030638 24 > func_c + 0 17901 4436100030671 32 -> func_c + 0 17901 4436100030680 9 > puts + 0 17901 4436100030723 42 < puts + 0 17901 4436100030729 6 > after + 0 17901 4436101040600 1009870 < after + 0 17901 4436101040623 22 <- func_c + 0 17901 4436101040633 10 < func_c + 0 17901 4436101040639 6 <- func_b + 0 17901 4436101040645 5 < func_b + 0 17901 4436101040651 5 <- func_a + 0 17901 4436101040656 5 < func_a + 0 17901 4436101040682 25 > exit + +You can see the output is in six columns. + +The first column is CPU-id, the second is PID, third is the time since boot in +microseconds, fourth is the elapsed time since the previous action. The fifth +and sixth columns represent the action. The Tcl command or procedure name is +prefixed by an indicator reprenting what is happening. These may be -> +(procedure entry), <- (procedure return), > (command entry), or < (command +return). + +As each action is taken, the fifth and sixth columns are indented by 2 spaces. +This shows which procedure or command is calling which. + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_ins_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_ins_example.txt new file mode 100644 index 00000000000..6f1ba9a3d13 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_ins_example.txt @@ -0,0 +1,46 @@ +The following are examples of running the script tcl_ins.d + +Here it traces as Code/Tcl/func_slow.tcl executes. + +# tcl_ins.d +Tracing... Hit Ctrl-C to end. +^C + PID TYPE NAME COUNT + 16005 inst foreach_start4 1 + 16005 inst jumpTrue1 1 + 16005 inst lappendScalar1 1 + 16005 inst list 1 + 16005 inst strneq 1 + 16005 inst beginCatch4 2 + 16005 inst dup 2 + 16005 inst endCatch 2 + 16005 inst eq 2 + 16005 inst land 2 + 16005 inst storeScalarStk 2 + 16005 inst foreach_step4 4 + 16005 inst not 4 + 16005 inst loadArrayStk 5 + 16005 inst streq 7 + 16005 inst tryCvtToNumeric 8 + 16005 inst jumpFalse1 12 + 16005 inst loadScalarStk 13 + 16005 inst jump1 14 + 16005 inst pop 18 + 16005 inst invokeStk1 53 + 16005 inst add 600000 + 16005 inst concat1 600000 + 16005 inst exprStk 600000 + 16005 inst lt 600007 + 16005 inst storeScalar1 600016 + 16005 inst done 600021 + 16005 inst loadScalar1 1200020 + 16005 inst push1 4200193 + +It is showing the instructions called by Tcl as the program executes. The +larger counts toward the bottom of the display are from the looping construct +used in Code/Tcl/func_slow.tcl. + +Tracing the instructions is quite low-level and slow the target application +considerably and would probably be used only as a last resort if you have no +other indication of why CPUs are busy. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_insflow_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_insflow_example.txt new file mode 100644 index 00000000000..2919f8eb72f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_insflow_example.txt @@ -0,0 +1,997 @@ +The following are examples of running tcl_insflow.d + +Here you can see the script running while tracing Code/Tcl/func_abc.tcl + +# tcl_insflow.d + C PID TIME(us) DELTA(us) TYPE -- CALL + 0 174829 4436207514685 3 cmd -> if + 0 174829 4436207514793 107 inst -> push1 + 0 174829 4436207514805 11 inst <- push1 + 0 174829 4436207514814 8 inst -> push1 + 0 174829 4436207514820 5 inst <- push1 + 0 174829 4436207514826 5 inst -> push1 + 0 174829 4436207514832 5 inst <- push1 + 0 174829 4436207514838 5 inst -> invokeStk1 + 0 174829 4436207514845 6 cmd -> info + 0 174829 4436207514883 38 cmd <- info + 0 174829 4436207514895 11 inst <- invokeStk1 + 0 174829 4436207514901 6 inst -> push1 + 0 174829 4436207514907 5 inst <- push1 + 0 174829 4436207514913 5 inst -> eq + 0 174829 4436207514927 14 inst <- eq + 0 174829 4436207514933 6 inst -> done + 0 174829 4436207514940 6 inst <- done + 0 174829 4436207514978 38 inst -> push1 + 0 174829 4436207514985 6 inst <- push1 + 0 174829 4436207514991 5 inst -> push1 + 0 174829 4436207514996 5 inst <- push1 + 0 174829 4436207515002 5 inst -> push1 + 0 174829 4436207515007 5 inst <- push1 + 0 174829 4436207515013 5 inst -> push1 + 0 174829 4436207515019 5 inst <- push1 + 0 174829 4436207515024 5 inst -> invokeStk1 + 0 174829 4436207515031 6 cmd -> proc + 0 174829 4436207515045 13 cmd <- proc + 0 174829 4436207515051 6 inst <- invokeStk1 + 0 174829 4436207515057 6 inst -> done + 0 174829 4436207515063 5 inst <- done + 0 174829 4436207515069 6 cmd <- if + 0 174829 4436207515086 16 cmd -> tclInit + 0 174829 4436207515295 208 proc -> tclInit + 0 174829 4436207515305 10 inst -> push1 + 0 174829 4436207515311 5 inst <- push1 + 0 174829 4436207515317 6 inst -> push1 + 0 174829 4436207515323 5 inst <- push1 + 0 174829 4436207515328 5 inst -> push1 + 0 174829 4436207515334 5 inst <- push1 + 0 174829 4436207515340 5 inst -> push1 + 0 174829 4436207515345 5 inst <- push1 + 0 174829 4436207515351 5 inst -> invokeStk1 + 0 174829 4436207515357 6 cmd -> global + 0 174829 4436207515369 11 cmd <- global + 0 174829 4436207515375 6 inst <- invokeStk1 + 0 174829 4436207515381 5 inst -> pop + 0 174829 4436207515387 5 inst <- pop + 0 174829 4436207515393 5 inst -> push1 + 0 174829 4436207515398 5 inst <- push1 + 0 174829 4436207515404 5 inst -> push1 + 0 174829 4436207515410 5 inst <- push1 + 0 174829 4436207515415 5 inst -> push1 + 0 174829 4436207515421 5 inst <- push1 + 0 174829 4436207515427 5 inst -> invokeStk1 + 0 174829 4436207515433 6 cmd -> global + 0 174829 4436207515440 7 cmd <- global + 0 174829 4436207515446 6 inst <- invokeStk1 + 0 174829 4436207515452 5 inst -> pop + 0 174829 4436207515458 5 inst <- pop + 0 174829 4436207515463 5 inst -> push1 + 0 174829 4436207515469 5 inst <- push1 + 0 174829 4436207515475 5 inst -> push1 + 0 174829 4436207515480 5 inst <- push1 + 0 174829 4436207515486 5 inst -> push1 + 0 174829 4436207515492 5 inst <- push1 + 0 174829 4436207515497 5 inst -> invokeStk1 + 0 174829 4436207515504 6 cmd -> rename + 0 174829 4436207515553 49 cmd <- rename + 0 174829 4436207515560 6 inst <- invokeStk1 + 0 174829 4436207515566 6 inst -> pop + 0 174829 4436207515571 5 inst <- pop + 0 174829 4436207515577 5 inst -> push1 + 0 174829 4436207515583 5 inst <- push1 + 0 174829 4436207515589 5 inst -> storeScalar1 + 0 174829 4436207515598 9 inst <- storeScalar1 + 0 174829 4436207515605 6 inst -> push1 + 0 174829 4436207515610 5 inst <- push1 + 0 174829 4436207515616 5 inst -> storeScalar1 + 0 174829 4436207515622 5 inst <- storeScalar1 + 0 174829 4436207515628 5 inst -> push1 + 0 174829 4436207515633 5 inst <- push1 + 0 174829 4436207515639 5 inst -> push1 + 0 174829 4436207515645 5 inst <- push1 + 0 174829 4436207515650 5 inst -> push1 + 0 174829 4436207515656 5 inst <- push1 + 0 174829 4436207515662 5 inst -> invokeStk1 + 0 174829 4436207515668 6 cmd -> info + 0 174829 4436207515679 10 cmd <- info + 0 174829 4436207515685 6 inst <- invokeStk1 + 0 174829 4436207515691 5 inst -> tryCvtToNumeric + 0 174829 4436207515701 10 inst <- tryCvtToNumeric + 0 174829 4436207515708 6 inst -> jumpFalse1 + 0 174829 4436207515714 5 inst <- jumpFalse1 + 0 174829 4436207515719 5 inst -> push1 + 0 174829 4436207515725 5 inst <- push1 + 0 174829 4436207515731 5 inst -> push1 + 0 174829 4436207515736 5 inst <- push1 + 0 174829 4436207515742 5 inst -> push1 + 0 174829 4436207515747 5 inst <- push1 + 0 174829 4436207515753 5 inst -> invokeStk1 + 0 174829 4436207515760 6 cmd -> info + 0 174829 4436207515787 27 cmd <- info + 0 174829 4436207515793 6 inst <- invokeStk1 + 0 174829 4436207515799 5 inst -> tryCvtToNumeric + 0 174829 4436207515805 5 inst <- tryCvtToNumeric + 0 174829 4436207515811 5 inst -> jumpFalse1 + 0 174829 4436207515817 5 inst <- jumpFalse1 + 0 174829 4436207515823 5 inst -> push1 + 0 174829 4436207515828 5 inst <- push1 + 0 174829 4436207515834 5 inst -> pop + 0 174829 4436207515839 5 inst <- pop + 0 174829 4436207515845 5 inst -> beginCatch4 + 0 174829 4436207515851 5 inst <- beginCatch4 + 0 174829 4436207515857 5 inst -> loadScalar1 + 0 174829 4436207515863 5 inst <- loadScalar1 + 0 174829 4436207515868 5 inst -> lappendScalar1 + 0 174829 4436207515877 8 inst <- lappendScalar1 + 0 174829 4436207515883 6 inst -> push1 + 0 174829 4436207515889 5 inst <- push1 + 0 174829 4436207515895 5 inst -> push1 + 0 174829 4436207515900 5 inst <- push1 + 0 174829 4436207515906 5 inst -> invokeStk1 + 0 174829 4436207515912 6 cmd -> unset + 0 174829 4436207515920 7 cmd <- unset + 0 174829 4436207515926 6 inst <- invokeStk1 + 0 174829 4436207515932 5 inst -> pop + 0 174829 4436207515938 5 inst <- pop + 0 174829 4436207515943 5 inst -> push1 + 0 174829 4436207515949 5 inst <- push1 + 0 174829 4436207515955 5 inst -> jump1 + 0 174829 4436207515960 5 inst <- jump1 + 0 174829 4436207515966 5 inst -> endCatch + 0 174829 4436207515972 5 inst <- endCatch + 0 174829 4436207515977 5 inst -> pop + 0 174829 4436207515983 5 inst <- pop + 0 174829 4436207515989 5 inst -> push1 + 0 174829 4436207515994 5 inst <- push1 + 0 174829 4436207516000 5 inst -> loadScalar1 + 0 174829 4436207516006 5 inst <- loadScalar1 + 0 174829 4436207516012 5 inst -> loadScalar1 + 0 174829 4436207516017 5 inst <- loadScalar1 + 0 174829 4436207516023 5 inst -> invokeStk1 + 0 174829 4436207516029 6 cmd -> concat + 0 174829 4436207516049 19 cmd <- concat + 0 174829 4436207516055 6 inst <- invokeStk1 + 0 174829 4436207516061 5 inst -> storeScalar1 + 0 174829 4436207516068 6 inst <- storeScalar1 + 0 174829 4436207516074 6 inst -> loadScalar1 + 0 174829 4436207516080 5 inst <- loadScalar1 + 0 174829 4436207516085 5 inst -> storeScalar1 + 0 174829 4436207516091 5 inst <- storeScalar1 + 0 174829 4436207516097 5 inst -> foreach_start4 + 0 174829 4436207516104 6 inst <- foreach_start4 + 0 174829 4436207516110 6 inst -> foreach_step4 + 0 174829 4436207516125 14 inst <- foreach_step4 + 0 174829 4436207516131 5 inst -> loadScalar1 + 0 174829 4436207516137 5 inst <- loadScalar1 + 0 174829 4436207516143 5 inst -> storeScalar1 + 0 174829 4436207516148 5 inst <- storeScalar1 + 0 174829 4436207516154 5 inst -> push1 + 0 174829 4436207516160 5 inst <- push1 + 0 174829 4436207516165 5 inst -> push1 + 0 174829 4436207516171 5 inst <- push1 + 0 174829 4436207516177 5 inst -> loadScalar1 + 0 174829 4436207516182 5 inst <- loadScalar1 + 0 174829 4436207516188 5 inst -> push1 + 0 174829 4436207516194 5 inst <- push1 + 0 174829 4436207516200 5 inst -> invokeStk1 + 0 174829 4436207516206 6 cmd -> file + 0 174829 4436207516218 12 cmd <- file + 0 174829 4436207516224 6 inst <- invokeStk1 + 0 174829 4436207516230 5 inst -> storeScalar1 + 0 174829 4436207516236 5 inst <- storeScalar1 + 0 174829 4436207516242 5 inst -> push1 + 0 174829 4436207516247 5 inst <- push1 + 0 174829 4436207516253 5 inst -> push1 + 0 174829 4436207516258 5 inst <- push1 + 0 174829 4436207516264 5 inst -> loadScalar1 + 0 174829 4436207516270 5 inst <- loadScalar1 + 0 174829 4436207516276 5 inst -> invokeStk1 + 0 174829 4436207516282 6 cmd -> file + 0 174829 4436207516368 86 cmd <- file + 0 174829 4436207516375 6 inst <- invokeStk1 + 0 174829 4436207516381 6 inst -> tryCvtToNumeric + 0 174829 4436207516387 5 inst <- tryCvtToNumeric + 0 174829 4436207516393 5 inst -> jumpFalse1 + 0 174829 4436207516398 5 inst <- jumpFalse1 + 0 174829 4436207516404 5 inst -> push1 + 0 174829 4436207516410 5 inst <- push1 + 0 174829 4436207516416 5 inst -> pop + 0 174829 4436207516421 5 inst <- pop + 0 174829 4436207516427 5 inst -> jump1 + 0 174829 4436207516432 5 inst <- jump1 + 0 174829 4436207516438 5 inst -> foreach_step4 + 0 174829 4436207516444 5 inst <- foreach_step4 + 0 174829 4436207516450 5 inst -> loadScalar1 + 0 174829 4436207516456 5 inst <- loadScalar1 + 0 174829 4436207516462 6 inst -> storeScalar1 + 0 174829 4436207516468 5 inst <- storeScalar1 + 0 174829 4436207516473 5 inst -> push1 + 0 174829 4436207516479 5 inst <- push1 + 0 174829 4436207516485 5 inst -> push1 + 0 174829 4436207516490 5 inst <- push1 + 0 174829 4436207516496 5 inst -> loadScalar1 + 0 174829 4436207516502 5 inst <- loadScalar1 + 0 174829 4436207516508 5 inst -> push1 + 0 174829 4436207516513 5 inst <- push1 + 0 174829 4436207516519 5 inst -> invokeStk1 + 0 174829 4436207516525 6 cmd -> file + 0 174829 4436207516536 10 cmd <- file + 0 174829 4436207516542 6 inst <- invokeStk1 + 0 174829 4436207516548 5 inst -> storeScalar1 + 0 174829 4436207516555 6 inst <- storeScalar1 + 0 174829 4436207516561 6 inst -> push1 + 0 174829 4436207516566 5 inst <- push1 + 0 174829 4436207516572 5 inst -> push1 + 0 174829 4436207516578 5 inst <- push1 + 0 174829 4436207516583 5 inst -> loadScalar1 + 0 174829 4436207516589 5 inst <- loadScalar1 + 0 174829 4436207516595 5 inst -> invokeStk1 + 0 174829 4436207516601 6 cmd -> file + 0 174829 4436207516709 107 cmd <- file + 0 174829 4436207516716 6 inst <- invokeStk1 + 0 174829 4436207516722 6 inst -> tryCvtToNumeric + 0 174829 4436207516728 5 inst <- tryCvtToNumeric + 0 174829 4436207516733 5 inst -> jumpFalse1 + 0 174829 4436207516739 5 inst <- jumpFalse1 + 0 174829 4436207516745 5 inst -> push1 + 0 174829 4436207516751 5 inst <- push1 + 0 174829 4436207516756 5 inst -> pop + 0 174829 4436207516762 5 inst <- pop + 0 174829 4436207516768 5 inst -> jump1 + 0 174829 4436207516773 5 inst <- jump1 + 0 174829 4436207516779 5 inst -> foreach_step4 + 0 174829 4436207516785 5 inst <- foreach_step4 + 0 174829 4436207516791 5 inst -> loadScalar1 + 0 174829 4436207516796 5 inst <- loadScalar1 + 0 174829 4436207516802 5 inst -> storeScalar1 + 0 174829 4436207516808 5 inst <- storeScalar1 + 0 174829 4436207516814 5 inst -> push1 + 0 174829 4436207516820 5 inst <- push1 + 0 174829 4436207516825 5 inst -> push1 + 0 174829 4436207516831 5 inst <- push1 + 0 174829 4436207516837 5 inst -> loadScalar1 + 0 174829 4436207516842 5 inst <- loadScalar1 + 0 174829 4436207516848 5 inst -> push1 + 0 174829 4436207516854 5 inst <- push1 + 0 174829 4436207516859 5 inst -> invokeStk1 + 0 174829 4436207516866 6 cmd -> file + 0 174829 4436207516876 10 cmd <- file + 0 174829 4436207516882 6 inst <- invokeStk1 + 0 174829 4436207516888 5 inst -> storeScalar1 + 0 174829 4436207516895 6 inst <- storeScalar1 + 0 174829 4436207516901 6 inst -> push1 + 0 174829 4436207516906 5 inst <- push1 + 0 174829 4436207516912 5 inst -> push1 + 0 174829 4436207516918 5 inst <- push1 + 0 174829 4436207516923 5 inst -> loadScalar1 + 0 174829 4436207516929 5 inst <- loadScalar1 + 0 174829 4436207516935 5 inst -> invokeStk1 + 0 174829 4436207516941 6 cmd -> file + 0 174829 4436207517027 86 cmd <- file + 0 174829 4436207517034 6 inst <- invokeStk1 + 0 174829 4436207517040 6 inst -> tryCvtToNumeric + 0 174829 4436207517046 5 inst <- tryCvtToNumeric + 0 174829 4436207517052 5 inst -> jumpFalse1 + 0 174829 4436207517057 5 inst <- jumpFalse1 + 0 174829 4436207517063 5 inst -> push1 + 0 174829 4436207517069 5 inst <- push1 + 0 174829 4436207517075 5 inst -> pop + 0 174829 4436207517080 5 inst <- pop + 0 174829 4436207517086 5 inst -> jump1 + 0 174829 4436207517091 5 inst <- jump1 + 0 174829 4436207517097 5 inst -> foreach_step4 + 0 174829 4436207517103 5 inst <- foreach_step4 + 0 174829 4436207517109 5 inst -> loadScalar1 + 0 174829 4436207517115 5 inst <- loadScalar1 + 0 174829 4436207517121 5 inst -> storeScalar1 + 0 174829 4436207517127 5 inst <- storeScalar1 + 0 174829 4436207517132 5 inst -> push1 + 0 174829 4436207517138 5 inst <- push1 + 0 174829 4436207517144 5 inst -> push1 + 0 174829 4436207517149 5 inst <- push1 + 0 174829 4436207517155 5 inst -> loadScalar1 + 0 174829 4436207517161 5 inst <- loadScalar1 + 0 174829 4436207517167 5 inst -> push1 + 0 174829 4436207517172 5 inst <- push1 + 0 174829 4436207517178 5 inst -> invokeStk1 + 0 174829 4436207517184 6 cmd -> file + 0 174829 4436207517194 10 cmd <- file + 0 174829 4436207517201 6 inst <- invokeStk1 + 0 174829 4436207517206 5 inst -> storeScalar1 + 0 174829 4436207517213 6 inst <- storeScalar1 + 0 174829 4436207517219 5 inst -> push1 + 0 174829 4436207517225 5 inst <- push1 + 0 174829 4436207517231 5 inst -> push1 + 0 174829 4436207517236 5 inst <- push1 + 0 174829 4436207517242 5 inst -> loadScalar1 + 0 174829 4436207517247 5 inst <- loadScalar1 + 0 174829 4436207517253 5 inst -> invokeStk1 + 0 174829 4436207517260 6 cmd -> file + 0 174829 4436207517313 53 cmd <- file + 0 174829 4436207517319 6 inst <- invokeStk1 + 0 174829 4436207517325 5 inst -> tryCvtToNumeric + 0 174829 4436207517331 6 inst <- tryCvtToNumeric + 0 174829 4436207517337 5 inst -> jumpFalse1 + 0 174829 4436207517343 5 inst <- jumpFalse1 + 0 174829 4436207517348 5 inst -> beginCatch4 + 0 174829 4436207517354 5 inst <- beginCatch4 + 0 174829 4436207517360 6 inst -> push1 + 0 174829 4436207517366 5 inst <- push1 + 0 174829 4436207517371 5 inst -> push1 + 0 174829 4436207517377 5 inst <- push1 + 0 174829 4436207517383 5 inst -> push1 + 0 174829 4436207517388 5 inst <- push1 + 0 174829 4436207517394 5 inst -> loadScalar1 + 0 174829 4436207517400 5 inst <- loadScalar1 + 0 174829 4436207517405 5 inst -> list + 0 174829 4436207517412 6 inst <- list + 0 174829 4436207517418 5 inst -> invokeStk1 + 0 174829 4436207517424 6 cmd -> uplevel + 0 174829 4436207517436 11 cmd -> source + 0 174829 4436207517878 441 cmd -> if + 0 174829 4436207517897 18 inst -> push1 + 0 174829 4436207517903 6 inst <- push1 + 0 174829 4436207517910 6 inst -> push1 + 0 174829 4436207517915 5 inst <- push1 + 0 174829 4436207517921 5 inst -> push1 + 0 174829 4436207517927 5 inst <- push1 + 0 174829 4436207517932 5 inst -> invokeStk1 + 0 174829 4436207517939 6 cmd -> info + 0 174829 4436207517947 8 cmd <- info + 0 174829 4436207517954 6 inst <- invokeStk1 + 0 174829 4436207517960 5 inst -> push1 + 0 174829 4436207517965 5 inst <- push1 + 0 174829 4436207517971 5 inst -> eq + 0 174829 4436207517979 7 inst <- eq + 0 174829 4436207517985 5 inst -> done + 0 174829 4436207517991 5 inst <- done + 0 174829 4436207517997 6 cmd <- if + 0 174829 4436207518010 12 cmd -> package + 0 174829 4436207518021 10 cmd <- package + 0 174829 4436207518034 13 cmd -> if + 0 174829 4436207518046 11 inst -> push1 + 0 174829 4436207518051 5 inst <- push1 + 0 174829 4436207518057 5 inst -> push1 + 0 174829 4436207518063 5 inst <- push1 + 0 174829 4436207518068 5 inst -> push1 + 0 174829 4436207518074 5 inst <- push1 + 0 174829 4436207518080 5 inst -> invokeStk1 + 0 174829 4436207518086 6 cmd -> info + 0 174829 4436207518094 7 cmd <- info + 0 174829 4436207518099 5 inst <- invokeStk1 + 0 174829 4436207518105 5 inst -> not + 0 174829 4436207518111 6 inst <- not + 0 174829 4436207518117 5 inst -> done + 0 174829 4436207518123 5 inst <- done + 0 174829 4436207518147 24 inst -> push1 + 0 174829 4436207518153 5 inst <- push1 + 0 174829 4436207518159 5 inst -> push1 + 0 174829 4436207518164 5 inst <- push1 + 0 174829 4436207518170 5 inst -> push1 + 0 174829 4436207518175 5 inst <- push1 + 0 174829 4436207518181 5 inst -> invokeStk1 + 0 174829 4436207518187 6 cmd -> info + 0 174829 4436207518212 25 cmd <- info + 0 174829 4436207518218 6 inst <- invokeStk1 + 0 174829 4436207518224 5 inst -> tryCvtToNumeric + 0 174829 4436207518230 5 inst <- tryCvtToNumeric + 0 174829 4436207518236 5 inst -> jumpFalse1 + 0 174829 4436207518242 5 inst <- jumpFalse1 + 0 174829 4436207518248 5 inst -> push1 + 0 174829 4436207518253 5 inst <- push1 + 0 174829 4436207518259 5 inst -> push1 + 0 174829 4436207518264 5 inst <- push1 + 0 174829 4436207518270 5 inst -> storeScalarStk + 0 174829 4436207518278 7 inst <- storeScalarStk + 0 174829 4436207518284 5 inst -> done + 0 174829 4436207518289 5 inst <- done + 0 174829 4436207518295 6 cmd <- if + 0 174829 4436207518315 19 cmd -> namespace + 0 174829 4436207518421 106 inst -> push1 + 0 174829 4436207518428 6 inst <- push1 + 0 174829 4436207518434 5 inst -> push1 + 0 174829 4436207518440 5 inst <- push1 + 0 174829 4436207518445 5 inst -> invokeStk1 + 0 174829 4436207518452 6 cmd -> variable + 0 174829 4436207518460 8 cmd <- variable + 0 174829 4436207518466 6 inst <- invokeStk1 + 0 174829 4436207518472 5 inst -> pop + 0 174829 4436207518477 5 inst <- pop + 0 174829 4436207518483 5 inst -> push1 + 0 174829 4436207518489 5 inst <- push1 + 0 174829 4436207518494 5 inst -> push1 + 0 174829 4436207518500 5 inst <- push1 + 0 174829 4436207518506 5 inst -> invokeStk1 + 0 174829 4436207518513 7 cmd -> info + 0 174829 4436207518526 13 cmd <- info + 0 174829 4436207518532 6 inst <- invokeStk1 + 0 174829 4436207518538 5 inst -> push1 + 0 174829 4436207518544 5 inst <- push1 + 0 174829 4436207518549 5 inst -> strneq + 0 174829 4436207518555 6 inst <- strneq + 0 174829 4436207518561 5 inst -> push1 + 0 174829 4436207518567 5 inst <- push1 + 0 174829 4436207518573 5 inst -> push1 + 0 174829 4436207518578 5 inst <- push1 + 0 174829 4436207518584 5 inst -> push1 + 0 174829 4436207518589 5 inst <- push1 + 0 174829 4436207518595 5 inst -> push1 + 0 174829 4436207518600 5 inst <- push1 + 0 174829 4436207518606 5 inst -> push1 + 0 174829 4436207518612 5 inst <- push1 + 0 174829 4436207518617 5 inst -> invokeStk1 + 0 174829 4436207518624 6 cmd -> info + 0 174829 4436207518631 7 cmd <- info + 0 174829 4436207518637 6 inst <- invokeStk1 + 0 174829 4436207518643 5 inst -> push1 + 0 174829 4436207518648 5 inst <- push1 + 0 174829 4436207518654 5 inst -> push1 + 0 174829 4436207518660 5 inst <- push1 + 0 174829 4436207518665 5 inst -> push1 + 0 174829 4436207518671 5 inst <- push1 + 0 174829 4436207518677 5 inst -> push1 + 0 174829 4436207518682 5 inst <- push1 + 0 174829 4436207518688 5 inst -> invokeStk1 + 0 174829 4436207518694 6 cmd -> info + 0 174829 4436207518701 7 cmd <- info + 0 174829 4436207518707 6 inst <- invokeStk1 + 0 174829 4436207518713 5 inst -> invokeStk1 + 0 174829 4436207518720 7 cmd -> file + 0 174829 4436207518741 20 cmd <- file + 0 174829 4436207518748 6 inst <- invokeStk1 + 0 174829 4436207518753 5 inst -> invokeStk1 + 0 174829 4436207518760 6 cmd -> list + 0 174829 4436207518768 8 cmd <- list + 0 174829 4436207518774 6 inst <- invokeStk1 + 0 174829 4436207518780 5 inst -> push1 + 0 174829 4436207518786 5 inst <- push1 + 0 174829 4436207518791 5 inst -> invokeStk1 + 0 174829 4436207518798 6 cmd -> foreach + 0 174829 4436207518821 23 inst -> push1 + 0 174829 4436207518827 6 inst <- push1 + 0 174829 4436207518833 5 inst -> push1 + 0 174829 4436207518839 5 inst <- push1 + 0 174829 4436207518844 5 inst -> push1 + 0 174829 4436207518850 5 inst <- push1 + 0 174829 4436207518856 5 inst -> loadScalarStk + 0 174829 4436207518862 6 inst <- loadScalarStk + 0 174829 4436207518868 5 inst -> push1 + 0 174829 4436207518874 5 inst <- push1 + 0 174829 4436207518879 5 inst -> loadScalarStk + 0 174829 4436207518886 6 inst <- loadScalarStk + 0 174829 4436207518892 5 inst -> invokeStk1 + 0 174829 4436207518898 6 cmd -> lsearch + 0 174829 4436207518906 8 cmd <- lsearch + 0 174829 4436207518913 6 inst <- invokeStk1 + 0 174829 4436207518918 5 inst -> push1 + 0 174829 4436207518924 5 inst <- push1 + 0 174829 4436207518930 5 inst -> lt + 0 174829 4436207518936 6 inst <- lt + 0 174829 4436207518942 5 inst -> push1 + 0 174829 4436207518947 5 inst <- push1 + 0 174829 4436207518953 5 inst -> push1 + 0 174829 4436207518958 5 inst <- push1 + 0 174829 4436207518964 5 inst -> push1 + 0 174829 4436207518969 5 inst <- push1 + 0 174829 4436207518975 5 inst -> loadScalarStk + 0 174829 4436207518981 6 inst <- loadScalarStk + 0 174829 4436207518987 5 inst -> invokeStk1 + 0 174829 4436207518993 6 cmd -> lappend + 0 174829 4436207519002 8 cmd <- lappend + 0 174829 4436207519008 6 inst <- invokeStk1 + 0 174829 4436207519013 5 inst -> jump1 + 0 174829 4436207519019 5 inst <- jump1 + 0 174829 4436207519025 5 inst -> done + 0 174829 4436207519030 5 inst <- done + 0 174829 4436207519038 8 inst -> push1 + 0 174829 4436207519044 5 inst <- push1 + 0 174829 4436207519050 5 inst -> push1 + 0 174829 4436207519055 5 inst <- push1 + 0 174829 4436207519061 5 inst -> push1 + 0 174829 4436207519066 5 inst <- push1 + 0 174829 4436207519072 5 inst -> loadScalarStk + 0 174829 4436207519078 5 inst <- loadScalarStk + 0 174829 4436207519084 5 inst -> push1 + 0 174829 4436207519090 5 inst <- push1 + 0 174829 4436207519095 5 inst -> loadScalarStk + 0 174829 4436207519102 6 inst <- loadScalarStk + 0 174829 4436207519108 5 inst -> invokeStk1 + 0 174829 4436207519114 6 cmd -> lsearch + 0 174829 4436207519120 6 cmd <- lsearch + 0 174829 4436207519126 5 inst <- invokeStk1 + 0 174829 4436207519132 5 inst -> push1 + 0 174829 4436207519138 5 inst <- push1 + 0 174829 4436207519143 5 inst -> lt + 0 174829 4436207519149 5 inst <- lt + 0 174829 4436207519155 5 inst -> push1 + 0 174829 4436207519160 5 inst <- push1 + 0 174829 4436207519166 5 inst -> push1 + 0 174829 4436207519171 5 inst <- push1 + 0 174829 4436207519177 5 inst -> push1 + 0 174829 4436207519182 5 inst <- push1 + 0 174829 4436207519188 5 inst -> loadScalarStk + 0 174829 4436207519194 5 inst <- loadScalarStk + 0 174829 4436207519200 5 inst -> invokeStk1 + 0 174829 4436207519206 6 cmd -> lappend + 0 174829 4436207519213 7 cmd <- lappend + 0 174829 4436207519219 6 inst <- invokeStk1 + 0 174829 4436207519225 5 inst -> jump1 + 0 174829 4436207519231 5 inst <- jump1 + 0 174829 4436207519236 5 inst -> done + 0 174829 4436207519242 5 inst <- done + 0 174829 4436207519248 6 cmd <- foreach + 0 174829 4436207519255 6 inst <- invokeStk1 + 0 174829 4436207519260 5 inst -> jump1 + 0 174829 4436207519266 5 inst <- jump1 + 0 174829 4436207519272 5 inst -> pop + 0 174829 4436207519277 5 inst <- pop + 0 174829 4436207519283 5 inst -> push1 + 0 174829 4436207519288 5 inst <- push1 + 0 174829 4436207519294 5 inst -> push1 + 0 174829 4436207519300 5 inst <- push1 + 0 174829 4436207519305 5 inst -> push1 + 0 174829 4436207519311 5 inst <- push1 + 0 174829 4436207519316 5 inst -> push1 + 0 174829 4436207519322 5 inst <- push1 + 0 174829 4436207519328 5 inst -> push1 + 0 174829 4436207519333 5 inst <- push1 + 0 174829 4436207519339 5 inst -> push1 + 0 174829 4436207519344 5 inst <- push1 + 0 174829 4436207519350 5 inst -> push1 + 0 174829 4436207519356 5 inst <- push1 + 0 174829 4436207519362 5 inst -> push1 + 0 174829 4436207519367 5 inst <- push1 + 0 174829 4436207519373 5 inst -> push1 + 0 174829 4436207519378 5 inst <- push1 + 0 174829 4436207519384 5 inst -> invokeStk1 + 0 174829 4436207519390 6 cmd -> info + 0 174829 4436207519399 8 cmd <- info + 0 174829 4436207519405 5 inst <- invokeStk1 + 0 174829 4436207519411 5 inst -> invokeStk1 + 0 174829 4436207519417 6 cmd -> file + 0 174829 4436207519435 18 cmd <- file + 0 174829 4436207519442 6 inst <- invokeStk1 + 0 174829 4436207519448 5 inst -> invokeStk1 + 0 174829 4436207519454 6 cmd -> file + 0 174829 4436207519471 17 cmd <- file + 0 174829 4436207519478 6 inst <- invokeStk1 + 0 174829 4436207519484 5 inst -> push1 + 0 174829 4436207519490 5 inst <- push1 + 0 174829 4436207519495 5 inst -> invokeStk1 + 0 174829 4436207519502 6 cmd -> file + 0 174829 4436207519512 9 cmd <- file + 0 174829 4436207519518 6 inst <- invokeStk1 + 0 174829 4436207519524 5 inst -> storeScalarStk + 0 174829 4436207519530 6 inst <- storeScalarStk + 0 174829 4436207519536 6 inst -> push1 + 0 174829 4436207519542 5 inst <- push1 + 0 174829 4436207519547 5 inst -> push1 + 0 174829 4436207519553 5 inst <- push1 + 0 174829 4436207519559 5 inst -> push1 + 0 174829 4436207519564 5 inst <- push1 + 0 174829 4436207519570 5 inst -> loadScalarStk + 0 174829 4436207519576 6 inst <- loadScalarStk + 0 174829 4436207519582 5 inst -> push1 + 0 174829 4436207519587 5 inst <- push1 + 0 174829 4436207519593 5 inst -> loadScalarStk + 0 174829 4436207519599 5 inst <- loadScalarStk + 0 174829 4436207519605 5 inst -> invokeStk1 + 0 174829 4436207519611 6 cmd -> lsearch + 0 174829 4436207519617 6 cmd <- lsearch + 0 174829 4436207519623 6 inst <- invokeStk1 + 0 174829 4436207519629 5 inst -> push1 + 0 174829 4436207519635 5 inst <- push1 + 0 174829 4436207519640 5 inst -> lt + 0 174829 4436207519646 5 inst <- lt + 0 174829 4436207519652 5 inst -> push1 + 0 174829 4436207519657 5 inst <- push1 + 0 174829 4436207519663 5 inst -> push1 + 0 174829 4436207519668 5 inst <- push1 + 0 174829 4436207519674 5 inst -> push1 + 0 174829 4436207519679 5 inst <- push1 + 0 174829 4436207519685 5 inst -> loadScalarStk + 0 174829 4436207519691 5 inst <- loadScalarStk + 0 174829 4436207519697 5 inst -> invokeStk1 + 0 174829 4436207519703 6 cmd -> lappend + 0 174829 4436207519710 6 cmd <- lappend + 0 174829 4436207519716 6 inst <- invokeStk1 + 0 174829 4436207519722 5 inst -> jump1 + 0 174829 4436207519727 5 inst <- jump1 + 0 174829 4436207519733 5 inst -> pop + 0 174829 4436207519739 5 inst <- pop + 0 174829 4436207519744 5 inst -> push1 + 0 174829 4436207519750 5 inst <- push1 + 0 174829 4436207519756 5 inst -> push1 + 0 174829 4436207519761 5 inst <- push1 + 0 174829 4436207519767 5 inst -> push1 + 0 174829 4436207519772 5 inst <- push1 + 0 174829 4436207519778 5 inst -> invokeStk1 + 0 174829 4436207519784 6 cmd -> info + 0 174829 4436207519791 6 cmd <- info + 0 174829 4436207519797 6 inst <- invokeStk1 + 0 174829 4436207519803 5 inst -> tryCvtToNumeric + 0 174829 4436207519809 5 inst <- tryCvtToNumeric + 0 174829 4436207519815 5 inst -> jumpFalse1 + 0 174829 4436207519820 5 inst <- jumpFalse1 + 0 174829 4436207519826 5 inst -> push1 + 0 174829 4436207519832 5 inst <- push1 + 0 174829 4436207519837 5 inst -> push1 + 0 174829 4436207519843 5 inst <- push1 + 0 174829 4436207519849 5 inst -> push1 + 0 174829 4436207519854 5 inst <- push1 + 0 174829 4436207519860 5 inst -> loadScalarStk + 0 174829 4436207519866 6 inst <- loadScalarStk + 0 174829 4436207519872 5 inst -> push1 + 0 174829 4436207519877 5 inst <- push1 + 0 174829 4436207519883 5 inst -> invokeStk1 + 0 174829 4436207519889 6 cmd -> foreach + 0 174829 4436207519899 9 inst -> push1 + 0 174829 4436207519904 5 inst <- push1 + 0 174829 4436207519910 5 inst -> push1 + 0 174829 4436207519915 5 inst <- push1 + 0 174829 4436207519921 5 inst -> push1 + 0 174829 4436207519927 5 inst <- push1 + 0 174829 4436207519932 5 inst -> loadScalarStk + 0 174829 4436207519938 6 inst <- loadScalarStk + 0 174829 4436207519944 5 inst -> push1 + 0 174829 4436207519950 5 inst <- push1 + 0 174829 4436207519955 5 inst -> loadScalarStk + 0 174829 4436207519962 6 inst <- loadScalarStk + 0 174829 4436207519968 5 inst -> invokeStk1 + 0 174829 4436207519974 6 cmd -> lsearch + 0 174829 4436207519980 6 cmd <- lsearch + 0 174829 4436207519986 6 inst <- invokeStk1 + 0 174829 4436207519992 5 inst -> push1 + 0 174829 4436207519998 5 inst <- push1 + 0 174829 4436207520003 5 inst -> lt + 0 174829 4436207520009 5 inst <- lt + 0 174829 4436207520015 5 inst -> push1 + 0 174829 4436207520020 5 inst <- push1 + 0 174829 4436207520026 5 inst -> push1 + 0 174829 4436207520031 5 inst <- push1 + 0 174829 4436207520037 5 inst -> push1 + 0 174829 4436207520043 5 inst <- push1 + 0 174829 4436207520048 5 inst -> loadScalarStk + 0 174829 4436207520054 5 inst <- loadScalarStk + 0 174829 4436207520060 5 inst -> invokeStk1 + 0 174829 4436207520066 6 cmd -> lappend + 0 174829 4436207520073 6 cmd <- lappend + 0 174829 4436207520079 5 inst <- invokeStk1 + 0 174829 4436207520085 5 inst -> jump1 + 0 174829 4436207520090 5 inst <- jump1 + 0 174829 4436207520096 5 inst -> done + 0 174829 4436207520102 5 inst <- done + 0 174829 4436207520108 6 cmd <- foreach + 0 174829 4436207520114 5 inst <- invokeStk1 + 0 174829 4436207520119 5 inst -> jump1 + 0 174829 4436207520125 5 inst <- jump1 + 0 174829 4436207520131 5 inst -> done + 0 174829 4436207520136 5 inst <- done + 0 174829 4436207520143 6 cmd <- namespace + 0 174829 4436207520171 28 cmd -> if + 0 174829 4436207520192 20 inst -> push1 + 0 174829 4436207520198 6 inst <- push1 + 0 174829 4436207520203 5 inst -> push1 + 0 174829 4436207520209 5 inst <- push1 + 0 174829 4436207520215 5 inst -> invokeStk1 + 0 174829 4436207520221 6 cmd -> interp + 0 174829 4436207520230 9 cmd <- interp + 0 174829 4436207520236 5 inst <- invokeStk1 + 0 174829 4436207520242 5 inst -> not + 0 174829 4436207520247 5 inst <- not + 0 174829 4436207520253 5 inst -> jumpTrue1 + 0 174829 4436207520259 5 inst <- jumpTrue1 + 0 174829 4436207520265 5 inst -> push1 + 0 174829 4436207520270 5 inst <- push1 + 0 174829 4436207520276 5 inst -> dup + 0 174829 4436207520281 5 inst <- dup + 0 174829 4436207520287 5 inst -> jumpFalse1 + 0 174829 4436207520293 5 inst <- jumpFalse1 + 0 174829 4436207520298 5 inst -> push1 + 0 174829 4436207520304 5 inst <- push1 + 0 174829 4436207520310 5 inst -> push1 + 0 174829 4436207520315 5 inst <- push1 + 0 174829 4436207520321 5 inst -> loadArrayStk + 0 174829 4436207520328 6 inst <- loadArrayStk + 0 174829 4436207520334 5 inst -> push1 + 0 174829 4436207520339 5 inst <- push1 + 0 174829 4436207520345 5 inst -> streq + 0 174829 4436207520351 5 inst <- streq + 0 174829 4436207520357 5 inst -> land + 0 174829 4436207520363 6 inst <- land + 0 174829 4436207520368 5 inst -> done + 0 174829 4436207520374 5 inst <- done + 0 174829 4436207520381 6 cmd <- if + 0 174829 4436207520394 13 cmd -> package + 0 174829 4436207520401 6 cmd <- package + 0 174829 4436207520413 11 cmd -> if + 0 174829 4436207520424 11 inst -> push1 + 0 174829 4436207520429 5 inst <- push1 + 0 174829 4436207520435 5 inst -> push1 + 0 174829 4436207520441 5 inst <- push1 + 0 174829 4436207520446 5 inst -> invokeStk1 + 0 174829 4436207520453 6 cmd -> interp + 0 174829 4436207520459 6 cmd <- interp + 0 174829 4436207520465 5 inst <- invokeStk1 + 0 174829 4436207520471 5 inst -> not + 0 174829 4436207520476 5 inst <- not + 0 174829 4436207520482 5 inst -> done + 0 174829 4436207520488 5 inst <- done + 0 174829 4436207520527 39 inst -> push1 + 0 174829 4436207520533 5 inst <- push1 + 0 174829 4436207520539 5 inst -> push1 + 0 174829 4436207520544 5 inst <- push1 + 0 174829 4436207520550 5 inst -> loadArrayStk + 0 174829 4436207520557 6 inst <- loadArrayStk + 0 174829 4436207520563 5 inst -> push1 + 0 174829 4436207520568 5 inst <- push1 + 0 174829 4436207520574 5 inst -> streq + 0 174829 4436207520580 5 inst <- streq + 0 174829 4436207520586 5 inst -> push1 + 0 174829 4436207520591 5 inst <- push1 + 0 174829 4436207520597 5 inst -> dup + 0 174829 4436207520602 5 inst <- dup + 0 174829 4436207520608 5 inst -> jumpFalse1 + 0 174829 4436207520614 5 inst <- jumpFalse1 + 0 174829 4436207520619 5 inst -> push1 + 0 174829 4436207520625 5 inst <- push1 + 0 174829 4436207520631 5 inst -> push1 + 0 174829 4436207520636 5 inst <- push1 + 0 174829 4436207520642 5 inst -> loadArrayStk + 0 174829 4436207520648 6 inst <- loadArrayStk + 0 174829 4436207520654 5 inst -> push1 + 0 174829 4436207520660 5 inst <- push1 + 0 174829 4436207520665 5 inst -> streq + 0 174829 4436207520671 5 inst <- streq + 0 174829 4436207520677 5 inst -> land + 0 174829 4436207520682 5 inst <- land + 0 174829 4436207520688 5 inst -> jumpFalse1 + 0 174829 4436207520694 5 inst <- jumpFalse1 + 0 174829 4436207520700 5 inst -> push1 + 0 174829 4436207520705 5 inst <- push1 + 0 174829 4436207520711 5 inst -> pop + 0 174829 4436207520716 5 inst <- pop + 0 174829 4436207520722 5 inst -> push1 + 0 174829 4436207520728 5 inst <- push1 + 0 174829 4436207520733 5 inst -> push1 + 0 174829 4436207520739 5 inst <- push1 + 0 174829 4436207520744 5 inst -> loadArrayStk + 0 174829 4436207520751 6 inst <- loadArrayStk + 0 174829 4436207520757 5 inst -> push1 + 0 174829 4436207520762 5 inst <- push1 + 0 174829 4436207520768 5 inst -> streq + 0 174829 4436207520773 5 inst <- streq + 0 174829 4436207520779 5 inst -> push1 + 0 174829 4436207520785 5 inst <- push1 + 0 174829 4436207520791 5 inst -> done + 0 174829 4436207520796 5 inst <- done + 0 174829 4436207520802 6 cmd <- if + 0 174829 4436207520822 19 cmd -> if + 0 174829 4436207520835 13 inst -> push1 + 0 174829 4436207520841 5 inst <- push1 + 0 174829 4436207520847 5 inst -> push1 + 0 174829 4436207520852 5 inst <- push1 + 0 174829 4436207520858 5 inst -> push1 + 0 174829 4436207520864 5 inst <- push1 + 0 174829 4436207520869 5 inst -> push1 + 0 174829 4436207520875 5 inst <- push1 + 0 174829 4436207520881 5 inst -> invokeStk1 + 0 174829 4436207520887 6 cmd -> namespace + 0 174829 4436207520896 8 cmd <- namespace + 0 174829 4436207520902 6 inst <- invokeStk1 + 0 174829 4436207520908 5 inst -> push1 + 0 174829 4436207520913 5 inst <- push1 + 0 174829 4436207520919 5 inst -> streq + 0 174829 4436207520925 6 inst <- streq + 0 174829 4436207520931 5 inst -> done + 0 174829 4436207520936 5 inst <- done + 0 174829 4436207520942 6 cmd <- if + 0 174829 4436207521503 560 cmd -> set + 0 174829 4436207521515 11 cmd <- set + 0 174829 4436207521524 9 cmd -> set + 0 174829 4436207521531 6 cmd <- set + 0 174829 4436207521541 10 cmd -> if + 0 174829 4436207521559 17 inst -> push1 + 0 174829 4436207521566 7 inst <- push1 + 0 174829 4436207521573 6 inst -> push1 + 0 174829 4436207521578 5 inst <- push1 + 0 174829 4436207521584 5 inst -> push1 + 0 174829 4436207521590 5 inst <- push1 + 0 174829 4436207521596 5 inst -> push1 + 0 174829 4436207521601 5 inst <- push1 + 0 174829 4436207521607 5 inst -> invokeStk1 + 0 174829 4436207521613 6 cmd -> namespace + 0 174829 4436207521621 7 cmd <- namespace + 0 174829 4436207521627 6 inst <- invokeStk1 + 0 174829 4436207521633 5 inst -> push1 + 0 174829 4436207521639 5 inst <- push1 + 0 174829 4436207521644 5 inst -> streq + 0 174829 4436207521650 5 inst <- streq + 0 174829 4436207521656 5 inst -> done + 0 174829 4436207521662 5 inst <- done + 0 174829 4436207521674 11 inst -> push1 + 0 174829 4436207521679 5 inst <- push1 + 0 174829 4436207521685 5 inst -> push1 + 0 174829 4436207521691 5 inst <- push1 + 0 174829 4436207521697 5 inst -> push1 + 0 174829 4436207521702 5 inst <- push1 + 0 174829 4436207521708 5 inst -> push1 + 0 174829 4436207521714 5 inst <- push1 + 0 174829 4436207521720 5 inst -> invokeStk1 + 0 174829 4436207521726 6 cmd -> proc + 0 174829 4436207521738 12 cmd <- proc + 0 174829 4436207521744 6 inst <- invokeStk1 + 0 174829 4436207521750 5 inst -> done + 0 174829 4436207521756 5 inst <- done + 0 174829 4436207521762 6 cmd <- if + 0 174829 4436207521862 99 cmd -> proc + 0 174829 4436207521872 10 cmd <- proc + 0 174829 4436207521891 19 cmd -> proc + 0 174829 4436207521902 10 cmd <- proc + 0 174829 4436207521932 30 cmd -> proc + 0 174829 4436207521941 8 cmd <- proc + 0 174829 4436207521961 19 cmd -> proc + 0 174829 4436207521970 9 cmd <- proc + 0 174829 4436207521985 14 cmd -> proc + 0 174829 4436207521994 8 cmd <- proc + 0 174829 4436207522039 45 cmd -> if + 0 174829 4436207522053 14 inst -> push1 + 0 174829 4436207522059 5 inst <- push1 + 0 174829 4436207522065 6 inst -> push1 + 0 174829 4436207522070 5 inst <- push1 + 0 174829 4436207522076 5 inst -> loadArrayStk + 0 174829 4436207522083 7 inst <- loadArrayStk + 0 174829 4436207522089 5 inst -> push1 + 0 174829 4436207522094 5 inst <- push1 + 0 174829 4436207522100 5 inst -> streq + 0 174829 4436207522106 5 inst <- streq + 0 174829 4436207522112 5 inst -> done + 0 174829 4436207522117 5 inst <- done + 0 174829 4436207522134 16 inst -> push1 + 0 174829 4436207522140 5 inst <- push1 + 0 174829 4436207522146 5 inst -> push1 + 0 174829 4436207522151 5 inst <- push1 + 0 174829 4436207522157 5 inst -> push1 + 0 174829 4436207522163 5 inst <- push1 + 0 174829 4436207522168 5 inst -> push1 + 0 174829 4436207522174 5 inst <- push1 + 0 174829 4436207522180 5 inst -> invokeStk1 + 0 174829 4436207522186 6 cmd -> proc + 0 174829 4436207522205 19 cmd <- proc + 0 174829 4436207522212 6 inst <- invokeStk1 + 0 174829 4436207522218 5 inst -> done + 0 174829 4436207522223 5 inst <- done + 0 174829 4436207522230 6 cmd <- if + 0 174829 4436207522274 44 cmd -> proc + 0 174829 4436207522286 11 cmd <- proc + 0 174829 4436207522294 8 cmd <- source + 0 174829 4436207522301 6 cmd <- uplevel + 0 174829 4436207522307 6 inst <- invokeStk1 + 0 174829 4436207522313 6 inst -> storeScalar1 + 0 174829 4436207522319 5 inst <- storeScalar1 + 0 174829 4436207522325 5 inst -> push1 + 0 174829 4436207522331 5 inst <- push1 + 0 174829 4436207522337 5 inst -> jump1 + 0 174829 4436207522342 5 inst <- jump1 + 0 174829 4436207522348 5 inst -> endCatch + 0 174829 4436207522354 5 inst <- endCatch + 0 174829 4436207522360 5 inst -> not + 0 174829 4436207522366 5 inst <- not + 0 174829 4436207522371 5 inst -> jumpFalse1 + 0 174829 4436207522377 5 inst <- jumpFalse1 + 0 174829 4436207522383 5 inst -> push1 + 0 174829 4436207522389 5 inst <- push1 + 0 174829 4436207522394 5 inst -> done + 0 174829 4436207522400 5 inst <- done + 0 174829 4436207522409 8 proc <- tclInit + 0 174829 4436207522426 17 cmd <- tclInit + 0 174829 4436207522671 245 cmd -> proc + 0 174829 4436207522681 9 cmd <- proc + 0 174829 4436207522691 9 cmd -> proc + 0 174829 4436207522698 7 cmd <- proc + 0 174829 4436207522708 9 cmd -> proc + 0 174829 4436207522715 7 cmd <- proc + 0 174829 4436207522723 8 cmd -> func_a + 0 174829 4436207522742 18 proc -> func_a + 0 174829 4436207522752 10 inst -> push1 + 0 174829 4436207522757 5 inst <- push1 + 0 174829 4436207522763 5 inst -> push1 + 0 174829 4436207522769 5 inst <- push1 + 0 174829 4436207522775 5 inst -> invokeStk1 + 0 174829 4436207522781 6 cmd -> puts + 0 174829 4436207523212 430 cmd <- puts + 0 174829 4436207523266 54 inst <- invokeStk1 + 0 174829 4436207523275 8 inst -> pop + 0 174829 4436207523281 6 inst <- pop + 0 174829 4436207523287 5 inst -> push1 + 0 174829 4436207523292 5 inst <- push1 + 0 174829 4436207523298 5 inst -> push1 + 0 174829 4436207523304 5 inst <- push1 + 0 174829 4436207523310 5 inst -> invokeStk1 + 0 174829 4436207523318 7 cmd -> after + 0 174829 4436208530951 1007632 cmd <- after + 0 174829 4436208530972 21 inst <- invokeStk1 + 0 174829 4436208530984 12 inst -> pop + 0 174829 4436208530993 9 inst <- pop + 0 174829 4436208530999 5 inst -> push1 + 0 174829 4436208531005 5 inst <- push1 + 0 174829 4436208531010 5 inst -> invokeStk1 + 0 174829 4436208531021 10 cmd -> func_b + 0 174829 4436208531057 35 proc -> func_b + 0 174829 4436208531067 10 inst -> push1 + 0 174829 4436208531073 5 inst <- push1 + 0 174829 4436208531079 5 inst -> push1 + 0 174829 4436208531084 5 inst <- push1 + 0 174829 4436208531090 5 inst -> invokeStk1 + 0 174829 4436208531096 6 cmd -> puts + 0 174829 4436208531137 40 cmd <- puts + 0 174829 4436208531144 6 inst <- invokeStk1 + 0 174829 4436208531150 5 inst -> pop + 0 174829 4436208531155 5 inst <- pop + 0 174829 4436208531161 5 inst -> push1 + 0 174829 4436208531166 5 inst <- push1 + 0 174829 4436208531172 5 inst -> push1 + 0 174829 4436208531178 5 inst <- push1 + 0 174829 4436208531184 5 inst -> invokeStk1 + 0 174829 4436208531190 6 cmd -> after + 0 174829 4436209540924 1009734 cmd <- after + 0 174829 4436209540946 21 inst <- invokeStk1 + 0 174829 4436209540957 11 inst -> pop + 0 174829 4436209540967 9 inst <- pop + 0 174829 4436209540973 5 inst -> push1 + 0 174829 4436209540978 5 inst <- push1 + 0 174829 4436209540984 5 inst -> invokeStk1 + 0 174829 4436209540995 10 cmd -> func_c + 0 174829 4436209541029 34 proc -> func_c + 0 174829 4436209541039 10 inst -> push1 + 0 174829 4436209541045 5 inst <- push1 + 0 174829 4436209541051 5 inst -> push1 + 0 174829 4436209541056 5 inst <- push1 + 0 174829 4436209541062 5 inst -> invokeStk1 + 0 174829 4436209541068 6 cmd -> puts + 0 174829 4436209541111 42 cmd <- puts + 0 174829 4436209541118 7 inst <- invokeStk1 + 0 174829 4436209541124 5 inst -> pop + 0 174829 4436209541129 5 inst <- pop + 0 174829 4436209541135 5 inst -> push1 + 0 174829 4436209541141 5 inst <- push1 + 0 174829 4436209541147 5 inst -> push1 + 0 174829 4436209541153 5 inst <- push1 + 0 174829 4436209541158 5 inst -> invokeStk1 + 0 174829 4436209541165 6 cmd -> after + 0 174829 4436210550785 1009619 cmd <- after + 0 174829 4436210550807 22 inst <- invokeStk1 + 0 174829 4436210550819 11 inst -> done + 0 174829 4436210550830 10 inst <- done + 0 174829 4436210550839 9 proc <- func_c + 0 174829 4436210550850 11 cmd <- func_c + 0 174829 4436210550856 6 inst <- invokeStk1 + 0 174829 4436210550862 5 inst -> done + 0 174829 4436210550868 5 inst <- done + 0 174829 4436210550874 6 proc <- func_b + 0 174829 4436210550880 6 cmd <- func_b + 0 174829 4436210550887 6 inst <- invokeStk1 + 0 174829 4436210550892 5 inst -> done + 0 174829 4436210550898 5 inst <- done + 0 174829 4436210550904 6 proc <- func_a + 0 174829 4436210550911 6 cmd <- func_a + 0 174829 4436210550938 27 cmd -> exit + +As you can see the output is quite long, and in seven columns. The first +column is the CPU the action is on. The second is the PID. The third is the +time since boot in microseconds. + +The fourth column is the number of microseconds that has elapsed between the +previous line and the current one. + +The fifth column is the type of event that occurred (procedure, command or +instruction). + +The sixth and seventh columns are indented by 2 spaces to show when a new +event occurs. This shows us which command is calling which. + +If the output looks strange, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_proccalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_proccalls_example.txt new file mode 100644 index 00000000000..ed6820dddfb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_proccalls_example.txt @@ -0,0 +1,17 @@ +Following are examples of running tcl_proccalls.d. + +The output shows what happens when the code from Code/Tcl/func_abc.tcl is +traced. + +# tcl_proccalls.d +Tracing... Hit Ctrl-C to end. +^C + PID COUNT PROCEDURE + 16078 1 func_a + 16078 1 func_b + 16078 1 func_c + 16078 1 tclInit + +This simple output shows that PID 16078 was responsible for four procedures +beginning, one each of func_a, func_b, func_c, and tclInit. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_procflow_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_procflow_example.txt new file mode 100644 index 00000000000..93b822ec3eb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_procflow_example.txt @@ -0,0 +1,29 @@ +The following are examples of tcl_procflow.d. + +This is a simple script to trace the flow of Tcl procedures. + +Here it traces the example program, Code/Tcl/func_abc.tcl. + +# tcl_procflow.d + C PID TIME(us) -- PROCEDURE + 0 16073 3904971507502 -> tclInit + 0 16073 3904971509096 <- tclInit + 0 16073 3904971509305 -> func_a + 0 16073 3904972511039 -> func_b + 0 16073 3904973521023 -> func_c + 0 16073 3904974530998 <- func_c + 0 16073 3904974531008 <- func_b + 0 16073 3904974531014 <- func_a +^C + +As each procedure starts, the third column is indented by 2 spaces. This +shows which procedure is calling which - the output above begins with an init +procedure and then shows that func_a began, and then called func_b. + +The columns are CPU, PID, Time since boot, indicator and procedure name. + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_stat_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_stat_example.txt new file mode 100644 index 00000000000..178fef10b19 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_stat_example.txt @@ -0,0 +1,24 @@ +Following are examples of running tcl_stat.d on Tcl programs. + +tcl_stat.d shows you the number of events per second that have happened since +the last line output. The default interval is 1 second, but you can specify +other intervals as arguments to the script. + +This shows the sh_stat.d script reflecting the Code/Tcl/func_abc.tcl program. + +# tcl_stat.d +TIME EXEC/s PROC/s CMD/s OBJNEW/s OBJFRE/s OP/s +2007 Sep 26 23:34:36 0 0 0 0 0 0 +2007 Sep 26 23:34:37 1 2 75 911 805 377 +2007 Sep 26 23:34:38 0 1 3 4 2 10 +2007 Sep 26 23:34:39 0 1 3 3 2 10 +2007 Sep 26 23:34:40 0 0 1 7 8 3 +2007 Sep 26 23:34:41 0 0 0 0 0 0 +2007 Sep 26 23:34:42 0 0 0 0 0 0 +^C + + At 2007 Sep 26 23:34:37 we can see that there was one Tcl program executed +(this number may include those programs without Tcl provider support), two +procedures called, 75 new commands created, 911 objects created, 805 objects +freed, and 377 bytecode operations. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_syscalls_example.txt new file mode 100644 index 00000000000..5553b1c6a8c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_syscalls_example.txt @@ -0,0 +1,66 @@ +The following are examples of sh_syscalls.d. + +This is a simple script to count Tcl commands, procedures and system calls. + +Here we trace an example program - Code/Tcl/func_abc.tcl. + +# tcl_syscalls.d -c './tclsh func_abc.tcl ' +Tracing... Hit Ctrl-C to end. +Function A +Function B +Function C + PID TYPE NAME COUNT + 16580 cmd concat 1 + 16580 cmd exit 1 + 16580 cmd func_a 1 + 16580 cmd func_b 1 + 16580 cmd func_c 1 + 16580 cmd list 1 + 16580 cmd rename 1 + 16580 cmd source 1 + 16580 cmd tclInit 1 + 16580 cmd unset 1 + 16580 cmd uplevel 1 + 16580 cmd variable 1 + 16580 proc func_a 1 + 16580 proc func_b 1 + 16580 proc func_c 1 + 16580 proc tclInit 1 + 16580 syscall getpid 1 + 16580 syscall getrlimit 1 + 16580 syscall mmap 1 + 16580 syscall munmap 1 + 16580 syscall rexit 1 + 16580 syscall sigaction 1 + 16580 syscall sigpending 1 + 16580 syscall sysi86 1 + 16580 syscall uname 1 + 16580 cmd foreach 2 + 16580 cmd global 2 + 16580 cmd interp 2 + 16580 cmd package 2 + 16580 cmd set 2 + 16580 syscall setcontext 2 + 16580 syscall stat64 2 + 16580 syscall sysconfig 2 + 16580 cmd after 3 + 16580 cmd namespace 3 + 16580 cmd puts 3 + 16580 syscall pollsys 3 + 16580 syscall write 3 + 16580 cmd lappend 4 + 16580 cmd lsearch 4 + 16580 syscall close 5 + 16580 syscall llseek 6 + 16580 cmd if 8 + 16580 cmd info 11 + 16580 syscall read 11 + 16580 cmd file 12 + 16580 cmd proc 12 + 16580 syscall fcntl 12 + 16580 syscall ioctl 12 + 16580 syscall open64 14 + 16580 syscall resolvepath 25 + 16580 syscall brk 27 + 16580 syscall access 54 + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_syscolors_example.txt new file mode 100644 index 00000000000..b5929867eab --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_syscolors_example.txt @@ -0,0 +1,563 @@ +The following are examples of tcl_syscolors.d. + +This is a simple script to trace the flow of Tcl processes, Tcl commands and +system calls made, and renders the output in color ("colour") using terminal +escape sequences (which you can tweak by modifying the script). + +Here it traces the example program, Code/Tcl/func_abc.tcl. + +WARNING: This output is full of terminal escape sequences, so if you are +trying to view this through an editor or web browser - it may look awful. +Try viewing this using "more" (although, depending on your terminal, it +still may look awful). + +# tcl_syscolors.d -c './tclsh func_abc.tcl +Function A + C PID DELTA(us) TYPE -- NAME + 0 16624 2 syscall -> munmap + 0 16624 31 syscall <- munmap + 0 16624 52 syscall -> mmap + 0 16624 21 syscall <- mmap + 0 16624 38 syscall -> setcontext + 0 16624 8 syscall <- setcontext + 0 16624 8 syscall -> getrlimit + 0 16624 9 syscall <- getrlimit + 0 16624 8 syscall -> getpid + 0 16624 7 syscall <- getpid + 0 16624 68 syscall -> setcontext + 0 16624 7 syscall <- setcontext + 0 16624 177 syscall -> sigpending + 0 16624 8 syscall <- sigpending + 0 16624 88 syscall -> sysconfig + 0 16624 7 syscall <- sysconfig + 0 16624 107 syscall -> open64 + 0 16624 115 syscall <- open64 + 0 16624 13 syscall -> ioctl + 0 16624 64 syscall <- ioctl + 0 16624 16 syscall -> close + 0 16624 17 syscall <- close + 0 16624 1208 syscall -> sysi86 + 0 16624 9 syscall <- sysi86 + 0 16624 146 syscall -> llseek + 0 16624 10 syscall <- llseek + 0 16624 7 syscall -> llseek + 0 16624 7 syscall <- llseek + 0 16624 7 syscall -> llseek + 0 16624 6 syscall <- llseek + 0 16624 24 syscall -> sigaction + 0 16624 8 syscall <- sigaction + 0 16624 63 syscall -> brk + 0 16624 9 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 14 syscall <- brk + 0 16624 76 syscall -> brk + 0 16624 7 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 12 syscall <- brk + 0 16624 328 syscall -> resolvepath + 0 16624 35 syscall <- resolvepath + 0 16624 24 syscall -> access + 0 16624 10 syscall <- access + 0 16624 7 syscall -> access + 0 16624 10 syscall <- access + 0 16624 7 syscall -> access + 0 16624 11 syscall <- access + 0 16624 7 syscall -> access + 0 16624 13 syscall <- access + 0 16624 7 syscall -> access + 0 16624 14 syscall <- access + 0 16624 7 syscall -> access + 0 16624 16 syscall <- access + 0 16624 7 syscall -> resolvepath + 0 16624 17 syscall <- resolvepath + 0 16624 32 syscall -> open64 + 0 16624 22 syscall <- open64 + 0 16624 32 syscall -> resolvepath + 0 16624 18 syscall <- resolvepath + 0 16624 8 syscall -> access + 0 16624 8 syscall <- access + 0 16624 7 syscall -> access + 0 16624 9 syscall <- access + 0 16624 7 syscall -> access + 0 16624 11 syscall <- access + 0 16624 7 syscall -> access + 0 16624 12 syscall <- access + 0 16624 7 syscall -> access + 0 16624 14 syscall <- access + 0 16624 7 syscall -> resolvepath + 0 16624 15 syscall <- resolvepath + 0 16624 11 syscall -> open64 + 0 16624 16 syscall <- open64 + 0 16624 30 syscall -> resolvepath + 0 16624 23 syscall <- resolvepath + 0 16624 11 syscall -> open64 + 0 16624 21 syscall <- open64 + 0 16624 29 syscall -> resolvepath + 0 16624 17 syscall <- resolvepath + 0 16624 8 syscall -> access + 0 16624 8 syscall <- access + 0 16624 7 syscall -> access + 0 16624 9 syscall <- access + 0 16624 7 syscall -> access + 0 16624 11 syscall <- access + 0 16624 7 syscall -> access + 0 16624 12 syscall <- access + 0 16624 7 syscall -> access + 0 16624 14 syscall <- access + 0 16624 7 syscall -> resolvepath + 0 16624 15 syscall <- resolvepath + 0 16624 11 syscall -> open64 + 0 16624 15 syscall <- open64 + 0 16624 30 syscall -> resolvepath + 0 16624 20 syscall <- resolvepath + 0 16624 11 syscall -> open64 + 0 16624 20 syscall <- open64 + 0 16624 29 syscall -> resolvepath + 0 16624 16 syscall <- resolvepath + 0 16624 8 syscall -> access + 0 16624 8 syscall <- access + 0 16624 7 syscall -> access + 0 16624 10 syscall <- access + 0 16624 7 syscall -> access + 0 16624 11 syscall <- access + 0 16624 7 syscall -> access + 0 16624 12 syscall <- access + 0 16624 7 syscall -> resolvepath + 0 16624 14 syscall <- resolvepath + 0 16624 11 syscall -> open64 + 0 16624 14 syscall <- open64 + 0 16624 28 syscall -> resolvepath + 0 16624 20 syscall <- resolvepath + 0 16624 8 syscall -> access + 0 16624 8 syscall <- access + 0 16624 7 syscall -> access + 0 16624 9 syscall <- access + 0 16624 43 syscall -> access + 0 16624 12 syscall <- access + 0 16624 7 syscall -> access + 0 16624 13 syscall <- access + 0 16624 7 syscall -> resolvepath + 0 16624 13 syscall <- resolvepath + 0 16624 11 syscall -> open64 + 0 16624 14 syscall <- open64 + 0 16624 10 syscall -> sysconfig + 0 16624 7 syscall <- sysconfig + 0 16624 33 syscall -> resolvepath + 0 16624 19 syscall <- resolvepath + 0 16624 8 syscall -> access + 0 16624 8 syscall <- access + 0 16624 7 syscall -> access + 0 16624 9 syscall <- access + 0 16624 7 syscall -> access + 0 16624 11 syscall <- access + 0 16624 7 syscall -> access + 0 16624 13 syscall <- access + 0 16624 7 syscall -> access + 0 16624 14 syscall <- access + 0 16624 7 syscall -> access + 0 16624 15 syscall <- access + 0 16624 7 syscall -> resolvepath + 0 16624 17 syscall <- resolvepath + 0 16624 11 syscall -> open64 + 0 16624 18 syscall <- open64 + 0 16624 30 syscall -> resolvepath + 0 16624 17 syscall <- resolvepath + 0 16624 7 syscall -> access + 0 16624 8 syscall <- access + 0 16624 7 syscall -> access + 0 16624 9 syscall <- access + 0 16624 7 syscall -> access + 0 16624 11 syscall <- access + 0 16624 7 syscall -> access + 0 16624 12 syscall <- access + 0 16624 7 syscall -> access + 0 16624 14 syscall <- access + 0 16624 7 syscall -> resolvepath + 0 16624 15 syscall <- resolvepath + 0 16624 11 syscall -> open64 + 0 16624 16 syscall <- open64 + 0 16624 30 syscall -> resolvepath + 0 16624 21 syscall <- resolvepath + 0 16624 11 syscall -> open64 + 0 16624 25 syscall <- open64 + 0 16624 15 syscall -> fcntl + 0 16624 7 syscall <- fcntl + 0 16624 31 syscall -> ioctl + 0 16624 8 syscall <- ioctl + 0 16624 49 syscall -> brk + 0 16624 8 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 11 syscall <- brk + 0 16624 30 syscall -> read + 0 16624 35 syscall <- read + 0 16624 54 syscall -> read + 0 16624 8 syscall <- read + 0 16624 21 syscall -> close + 0 16624 10 syscall <- close + 0 16624 51 syscall -> brk + 0 16624 7 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 9 syscall <- brk + 0 16624 111 syscall -> brk + 0 16624 7 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 8 syscall <- brk + 0 16624 94 syscall -> uname + 0 16624 8 syscall <- uname + 0 16624 47 syscall -> ioctl + 0 16624 35 syscall <- ioctl + 0 16624 73 cmd -> if + 0 16624 89 cmd -> info + 0 16624 25 cmd <- info + 0 16624 46 cmd -> proc + 0 16624 11 syscall -> brk + 0 16624 7 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 9 syscall <- brk + 0 16624 23 cmd <- proc + 0 16624 9 cmd <- if + 0 16624 18 cmd -> tclInit + 0 16624 223 proc -> tclInit + 0 16624 12 cmd -> global + 0 16624 12 cmd <- global + 0 16624 9 cmd -> global + 0 16624 9 cmd <- global + 0 16624 8 cmd -> rename + 0 16624 24 cmd <- rename + 0 16624 13 cmd -> info + 0 16624 12 cmd <- info + 0 16624 13 cmd -> info + 0 16624 19 cmd <- info + 0 16624 11 cmd -> unset + 0 16624 13 cmd <- unset + 0 16624 9 cmd -> concat + 0 16624 15 cmd <- concat + 0 16624 18 cmd -> file + 0 16624 20 cmd <- file + 0 16624 8 cmd -> file + 0 16624 25 syscall -> resolvepath + 0 16624 24 syscall <- resolvepath + 0 16624 9 syscall -> access + 0 16624 8 syscall <- access + 0 16624 7 syscall -> access + 0 16624 9 syscall <- access + 0 16624 7 syscall -> access + 0 16624 11 syscall <- access + 0 16624 7 syscall -> access + 0 16624 12 syscall <- access + 0 16624 7 syscall -> resolvepath + 0 16624 14 syscall <- resolvepath + 0 16624 12 syscall -> access + 0 16624 13 syscall <- access + 0 16624 9 cmd <- file + 0 16624 10 cmd -> file + 0 16624 12 cmd <- file + 0 16624 9 cmd -> file + 0 16624 24 syscall -> resolvepath + 0 16624 23 syscall <- resolvepath + 0 16624 8 syscall -> access + 0 16624 8 syscall <- access + 0 16624 7 syscall -> access + 0 16624 9 syscall <- access + 0 16624 7 syscall -> access + 0 16624 11 syscall <- access + 0 16624 7 syscall -> access + 0 16624 13 syscall <- access + 0 16624 7 syscall -> access + 0 16624 14 syscall <- access + 0 16624 7 syscall -> access + 0 16624 16 syscall <- access + 0 16624 7 syscall -> resolvepath + 0 16624 17 syscall <- resolvepath + 0 16624 12 syscall -> access + 0 16624 16 syscall <- access + 0 16624 29 cmd <- file + 0 16624 10 cmd -> file + 0 16624 12 cmd <- file + 0 16624 9 cmd -> file + 0 16624 23 syscall -> resolvepath + 0 16624 20 syscall <- resolvepath + 0 16624 8 syscall -> access + 0 16624 9 syscall <- access + 0 16624 7 syscall -> access + 0 16624 10 syscall <- access + 0 16624 7 syscall -> access + 0 16624 11 syscall <- access + 0 16624 7 syscall -> access + 0 16624 13 syscall <- access + 0 16624 7 syscall -> access + 0 16624 14 syscall <- access + 0 16624 7 syscall -> resolvepath + 0 16624 15 syscall <- resolvepath + 0 16624 11 syscall -> access + 0 16624 14 syscall <- access + 0 16624 7 cmd <- file + 0 16624 9 cmd -> file + 0 16624 12 cmd <- file + 0 16624 9 cmd -> file + 0 16624 23 syscall -> resolvepath + 0 16624 20 syscall <- resolvepath + 0 16624 11 syscall -> access + 0 16624 19 syscall <- access + 0 16624 7 cmd <- file + 0 16624 10 cmd -> uplevel + 0 16624 13 cmd -> source + 0 16624 14 syscall -> stat64 + 0 16624 23 syscall <- stat64 + 0 16624 10 syscall -> open64 + 0 16624 23 syscall <- open64 + 0 16624 8 syscall -> fcntl + 0 16624 7 syscall <- fcntl + 0 16624 8 syscall -> ioctl + 0 16624 7 syscall <- ioctl + 0 16624 26 syscall -> read + 0 16624 29 syscall <- read + 0 16624 8 syscall -> brk + 0 16624 7 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 9 syscall <- brk + 0 16624 57 syscall -> read + 0 16624 15 syscall <- read + 0 16624 55 syscall -> read + 0 16624 14 syscall <- read + 0 16624 8 syscall -> brk + 0 16624 6 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 6 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 8 syscall <- brk + 0 16624 63 syscall -> read + 0 16624 14 syscall <- read + 0 16624 45 syscall -> read + 0 16624 13 syscall <- read + 0 16624 8 syscall -> brk + 0 16624 6 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 6 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 8 syscall <- brk + 0 16624 63 syscall -> read + 0 16624 14 syscall <- read + 0 16624 29 syscall -> read + 0 16624 7 syscall <- read + 0 16624 10 syscall -> close + 0 16624 10 syscall <- close + 0 16624 18 cmd -> if + 0 16624 19 cmd -> info + 0 16624 10 cmd <- info + 0 16624 12 cmd <- if + 0 16624 14 cmd -> package + 0 16624 12 cmd <- package + 0 16624 15 cmd -> if + 0 16624 12 cmd -> info + 0 16624 9 cmd <- info + 0 16624 26 cmd -> info + 0 16624 16 cmd <- info + 0 16624 10 cmd <- if + 0 16624 21 cmd -> namespace + 0 16624 87 cmd -> variable + 0 16624 10 cmd <- variable + 0 16624 9 cmd -> info + 0 16624 13 cmd <- info + 0 16624 9 cmd -> info + 0 16624 8 cmd <- info + 0 16624 8 cmd -> info + 0 16624 8 cmd <- info + 0 16624 9 cmd -> file + 0 16624 21 cmd <- file + 0 16624 9 cmd -> list + 0 16624 17 cmd <- list + 0 16624 8 cmd -> foreach + 0 16624 27 cmd -> lsearch + 0 16624 10 cmd <- lsearch + 0 16624 10 cmd -> lappend + 0 16624 9 cmd <- lappend + 0 16624 11 cmd -> lsearch + 0 16624 8 cmd <- lsearch + 0 16624 8 cmd -> lappend + 0 16624 8 cmd <- lappend + 0 16624 8 cmd <- foreach + 0 16624 8 cmd -> info + 0 16624 10 cmd <- info + 0 16624 8 cmd -> file + 0 16624 15 syscall -> brk + 0 16624 7 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 9 syscall <- brk + 0 16624 24 cmd <- file + 0 16624 9 cmd -> file + 0 16624 19 cmd <- file + 0 16624 9 cmd -> file + 0 16624 11 cmd <- file + 0 16624 10 cmd -> lsearch + 0 16624 8 cmd <- lsearch + 0 16624 9 cmd -> lappend + 0 16624 8 cmd <- lappend + 0 16624 8 cmd -> info + 0 16624 8 cmd <- info + 0 16624 9 cmd -> foreach + 0 16624 12 cmd -> lsearch + 0 16624 8 cmd <- lsearch + 0 16624 8 cmd -> lappend + 0 16624 8 cmd <- lappend + 0 16624 8 cmd <- foreach + 0 16624 8 cmd <- namespace + 0 16624 30 cmd -> if + 0 16624 22 cmd -> interp + 0 16624 17 cmd <- interp + 0 16624 11 cmd <- if + 0 16624 15 cmd -> package + 0 16624 8 cmd <- package + 0 16624 13 cmd -> if + 0 16624 12 cmd -> interp + 0 16624 8 cmd <- interp + 0 16624 44 cmd <- if + 0 16624 21 cmd -> if + 0 16624 15 cmd -> namespace + 0 16624 10 cmd <- namespace + 0 16624 9 cmd <- if + 0 16624 13 cmd -> set + 0 16624 9 cmd <- set + 0 16624 10 cmd -> set + 0 16624 8 cmd <- set + 0 16624 12 cmd -> if + 0 16624 14 cmd -> namespace + 0 16624 8 cmd <- namespace + 0 16624 13 cmd -> proc + 0 16624 12 cmd <- proc + 0 16624 8 cmd <- if + 0 16624 69 cmd -> proc + 0 16624 11 cmd <- proc + 0 16624 20 cmd -> proc + 0 16624 12 cmd <- proc + 0 16624 22 syscall -> brk + 0 16624 7 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 6 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 9 syscall <- brk + 0 16624 18 cmd -> proc + 0 16624 10 cmd <- proc + 0 16624 21 cmd -> proc + 0 16624 11 cmd <- proc + 0 16624 16 cmd -> proc + 0 16624 10 cmd <- proc + 0 16624 42 cmd -> if + 0 16624 25 cmd -> proc + 0 16624 9 syscall -> brk + 0 16624 6 syscall <- brk + 0 16624 7 syscall -> brk + 0 16624 9 syscall <- brk + 0 16624 21 cmd <- proc + 0 16624 9 cmd <- if + 0 16624 41 cmd -> proc + 0 16624 13 cmd <- proc + 0 16624 9 cmd <- source + 0 16624 8 cmd <- uplevel + 0 16624 10 proc <- tclInit + 0 16624 17 cmd <- tclInit + 0 16624 35 syscall -> resolvepath + 0 16624 31 syscall <- resolvepath + 0 16624 13 syscall -> stat64 + 0 16624 24 syscall <- stat64 + 0 16624 9 syscall -> open64 + 0 16624 23 syscall <- open64 + 0 16624 8 syscall -> fcntl + 0 16624 7 syscall <- fcntl + 0 16624 9 syscall -> ioctl + 0 16624 7 syscall <- ioctl + 0 16624 12 syscall -> read + 0 16624 21 syscall <- read + 0 16624 10 syscall -> read + 0 16624 7 syscall <- read + 0 16624 9 syscall -> close + 0 16624 8 syscall <- close + 0 16624 12 cmd -> proc + 0 16624 11 cmd <- proc + 0 16624 11 cmd -> proc + 0 16624 9 cmd <- proc + 0 16624 11 cmd -> proc + 0 16624 9 cmd <- proc + 0 16624 9 cmd -> func_a + 0 16624 17 proc -> func_a + 0 16624 10 cmd -> puts + 0 16624 25 syscall -> llseek + 0 16624 9 syscall <- llseek + 0 16624 9 syscall -> ioctl + 0 16624 6 syscall <- ioctl + 0 16624 13 syscall -> getsockname + 0 16624 8 syscall <- getsockname + 0 16624 18 syscall -> llseek + 0 16624 8 syscall <- llseek + 0 16624 7 syscall -> ioctl + 0 16624 86 syscall <- ioctl + 0 16624 184 syscall -> ioctl + 0 16624 17 syscall <- ioctl + 0 16624 14 syscall -> llseek + 0 16624 7 syscall <- llseek + 0 16624 7 syscall -> ioctl + 0 16624 13 syscall <- ioctl + 0 16624 8 syscall -> ioctl + 0 16624 12 syscall <- ioctl + 0 16624 24 syscall -> write + 0 16624 108 syscall <- write + 0 16624 10 cmd <- puts + 0 16624 11 cmd -> after + 0 16624 23 syscall -> pollsys +Function B + 0 16624 1009593 syscall <- pollsys + 0 16624 24 cmd <- after + 0 16624 23 cmd -> func_b + 0 16624 37 proc -> func_b + 0 16624 12 cmd -> puts + 0 16624 17 syscall -> write + 0 16624 74 syscall <- write + 0 16624 8 cmd <- puts + 0 16624 9 cmd -> after + 0 16624 10 syscall -> pollsys +Function C + 0 16624 1009748 syscall <- pollsys + 0 16624 24 cmd <- after + 0 16624 23 cmd -> func_c + 0 16624 35 proc -> func_c + 0 16624 12 cmd -> puts + 0 16624 17 syscall -> write + 0 16624 75 syscall <- write + 0 16624 8 cmd <- puts + 0 16624 9 cmd -> after + 0 16624 10 syscall -> pollsys + 0 16624 1009831 syscall <- pollsys + 0 16624 24 cmd <- after + 0 16624 23 proc <- func_c + 0 16624 13 cmd <- func_c + 0 16624 9 proc <- func_b + 0 16624 8 cmd <- func_b + 0 16624 8 proc <- func_a + 0 16624 8 cmd <- func_a + 0 16624 30 cmd -> exit + 0 16624 41 syscall -> fcntl + 0 16624 11 syscall <- fcntl + 0 16624 7 syscall -> fcntl + 0 16624 7 syscall <- fcntl + 0 16624 7 syscall -> fcntl + 0 16624 6 syscall <- fcntl + 0 16624 11 syscall -> fcntl + 0 16624 6 syscall <- fcntl + 0 16624 7 syscall -> fcntl + 0 16624 6 syscall <- fcntl + 0 16624 7 syscall -> fcntl + 0 16624 6 syscall <- fcntl + 0 16624 9 syscall -> fcntl + 0 16624 7 syscall <- fcntl + 0 16624 7 syscall -> fcntl + 0 16624 6 syscall <- fcntl + 0 16624 7 syscall -> fcntl + 0 16624 6 syscall <- fcntl + 0 16624 81 syscall -> open64 + 0 16624 119 syscall <- open64 + 0 16624 8 syscall -> ioctl + 0 16624 8 syscall <- ioctl + 0 16624 10 syscall -> close + 0 16624 16 syscall <- close + 0 16624 68 syscall -> rexit + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_who_example.txt new file mode 100644 index 00000000000..d1eefa3a9c8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcl_who_example.txt @@ -0,0 +1,17 @@ +The following is an example of running tcl_who.d. + +The output produces four fields of interest in tracing tcl calls by process. + +Here we see it running while Code/Tcl/func_slow.tcl and Code/Tcl/func_abc.tcl +are executed. +# tcl_who.d +Tracing... Hit Ctrl-C to end. +^C + PID UID CALLS ARGS + 16063 100 83 ./tclsh scripts/func_slow.tcl + 16061 100 86 ./tclsh scripts/func_abc.tcl + +CALLS is a measure of activity, and is a count of the procedures and commands +that Tcl called. The ARGS column shows the process name and arguments given +for a particular PID in order to identify the particular Tcl code involved. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_d_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_d_example.txt new file mode 100644 index 00000000000..a0a8cc85d37 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_d_example.txt @@ -0,0 +1,41 @@ +The following is a demonstration of the tcpsnoop script. + + + +Here we run tcpsnoop and wait for new TCP connections to be established, + + # tcpsnoop.d + UID PID LADDR LPORT DR RADDR RPORT SIZE CMD + 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 66 finger + 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 56 finger + 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 606 finger + 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 54 finger + 0 242 192.168.1.5 23 <- 192.168.1.1 54224 54 inetd + 0 242 192.168.1.5 23 -> 192.168.1.1 54224 54 inetd + 0 242 192.168.1.5 23 <- 192.168.1.1 54224 54 inetd + 0 242 192.168.1.5 23 <- 192.168.1.1 54224 78 inetd + 0 242 192.168.1.5 23 -> 192.168.1.1 54224 54 inetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 57 in.telnetd + 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 54 in.telnetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 78 in.telnetd + 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 57 in.telnetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 54 in.telnetd + 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 54 in.telnetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 60 in.telnetd + 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 63 in.telnetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 54 in.telnetd + 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 60 in.telnetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 60 in.telnetd + 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 60 in.telnetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 72 in.telnetd + [...] + +As new connections are made, each of the TCP packets are traced along with +the UID, PID and command name. diff --git a/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_example.txt new file mode 100644 index 00000000000..1124175d2d1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_example.txt @@ -0,0 +1,61 @@ +The following is a demonstration of the tcpsnoop program. + + + +Here we run tcpsnoop and wait for new TCP connections to be established, + + # tcpsnoop + UID PID LADDR LPORT DR RADDR RPORT SIZE CMD + 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 66 finger + 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 56 finger + 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 606 finger + 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger + 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 54 finger + 0 242 192.168.1.5 23 <- 192.168.1.1 54224 54 inetd + 0 242 192.168.1.5 23 -> 192.168.1.1 54224 54 inetd + 0 242 192.168.1.5 23 <- 192.168.1.1 54224 54 inetd + 0 242 192.168.1.5 23 <- 192.168.1.1 54224 78 inetd + 0 242 192.168.1.5 23 -> 192.168.1.1 54224 54 inetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 57 in.telnetd + 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 54 in.telnetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 78 in.telnetd + 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 57 in.telnetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 54 in.telnetd + 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 54 in.telnetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 60 in.telnetd + 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 63 in.telnetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 54 in.telnetd + 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 60 in.telnetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 60 in.telnetd + 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 60 in.telnetd + 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 72 in.telnetd + [...] + +As new connections are made, each of the TCP packets are traced along with +the UID, PID and command name. + + + +tcpsnoop has many options, for example here we use "-v" to print times, + + # tcpsnoop -v + STRTIME UID PID LADDR LPORT DR RADDR RPORT SIZE CMD + 2005 Jul 11 21:21:19 0 242 192.168.1.5 79 <- 192.168.1.1 49001 54 inetd + 2005 Jul 11 21:21:19 0 242 192.168.1.5 79 -> 192.168.1.1 49001 54 inetd + 2005 Jul 11 21:21:19 0 242 192.168.1.5 79 <- 192.168.1.1 49001 54 inetd + 2005 Jul 11 21:21:19 0 242 192.168.1.5 79 <- 192.168.1.1 49001 56 inetd + 2005 Jul 11 21:21:19 0 242 192.168.1.5 79 -> 192.168.1.1 49001 54 inetd + 2005 Jul 11 21:21:19 0 23181 192.168.1.5 79 -> 192.168.1.1 49001 444 in.fingerd + 2005 Jul 11 21:21:19 0 23181 192.168.1.5 79 -> 192.168.1.1 49001 54 in.fingerd + 2005 Jul 11 21:21:19 0 23181 192.168.1.5 79 <- 192.168.1.1 49001 54 in.fingerd + 2005 Jul 11 21:21:19 0 23181 192.168.1.5 79 <- 192.168.1.1 49001 54 in.fingerd + 2005 Jul 11 21:21:19 0 23181 192.168.1.5 79 <- 192.168.1.1 49001 54 in.fingerd + 2005 Jul 11 21:21:19 0 23181 192.168.1.5 79 -> 192.168.1.1 49001 54 in.fingerd + [...] + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_snv_d_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_snv_d_example.txt new file mode 120000 index 00000000000..d53301a9cc6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_snv_d_example.txt @@ -0,0 +1 @@ +tcpsnoop_d_example.txt \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_snv_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_snv_example.txt new file mode 120000 index 00000000000..794263cb8c1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_snv_example.txt @@ -0,0 +1 @@ +tcpsnoop_example.txt \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Examples/tcpstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcpstat_example.txt new file mode 100644 index 00000000000..d7d8cb379d9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcpstat_example.txt @@ -0,0 +1,22 @@ +The following is a demonstration of the tcpstat.d script, + + +Here we run tcpstat.d as a large file is downloaded, + + # tcpstat.d + TCP_out TCP_outRe TCP_in TCP_inDup TCP_inUn + 0 0 0 0 0 + 20 0 1540 0 0 + 632 0 576 0 0 + 560 0 115552 0 0 + 1872 0 2900480 0 0 + 1968 0 3032320 0 0 + 1776 0 2752160 0 0 + 752 0 999824 0 0 + 0 0 0 0 0 + 0 0 0 0 0 + 0 0 0 0 0 + ^C + +We can see the TCP_in value rise to around 3 Mb/sec as the download occurs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcptop_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcptop_example.txt new file mode 100644 index 00000000000..c90fc753d88 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcptop_example.txt @@ -0,0 +1,28 @@ +The following is a demonstration of the tcptop command, + + +tcptop will display info on newly established TCP connections, + + # tcptop -C 10 + Tracing... Please wait. + 2005 Jul 5 04:55:25, load: 1.11, TCPin: 2 KB, TCPout: 110 KB + + UID PID LADDR LPORT FADDR FPORT SIZE NAME + 100 20876 192.168.1.5 36396 192.168.1.1 79 1160 finger + 100 20875 192.168.1.5 36395 192.168.1.1 79 1160 finger + 100 20878 192.168.1.5 36397 192.168.1.1 23 1303 telnet + 100 20877 192.168.1.5 859 192.168.1.1 514 115712 rcp + + 2005 Jul 5 04:55:35, load: 1.10, TCPin: 0 KB, TCPout: 0 KB + + UID PID LADDR LPORT FADDR FPORT SIZE NAME + 0 242 192.168.1.5 79 192.168.1.1 54220 272 inetd + 0 20879 192.168.1.5 79 192.168.1.1 54220 714 in.fingerd + + [...] + + +In the above output, we run it with a 10 second interval and with -C so +that the screen does not clear. Some traffic was captured, around 110 Kbytes +by the rcp process (PID 20877), etc. + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcptop_snv_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcptop_snv_example.txt new file mode 120000 index 00000000000..f2a169ee6b5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcptop_snv_example.txt @@ -0,0 +1 @@ +tcptop_example.txt \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Examples/tcpwdist_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcpwdist_example.txt new file mode 100644 index 00000000000..02a392ce55a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcpwdist_example.txt @@ -0,0 +1,70 @@ +The following is a demonstration of the tcpwdist.d script. + + +Here the tcpwdist.d script is run for a few seconds then Ctrl-C is hit, + + # tcpwdist.d + Tracing... Hit Ctrl-C to end. + ^C + PID: 15300 CMD: finger @mars\0 + + value ------------- Distribution ------------- count + -1 | 0 + 0 |@@@@@@@@@@@@@@@@@@@@ 1 + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + PID: 4967 CMD: /usr/lib/ssh/sshd\0 + + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@ 1 + 64 |@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + PID: 9172 CMD: /usr/lib/ssh/sshd\0 + + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@ 4 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 + 128 | 0 + 256 | 0 + 512 |@@ 1 + 1024 | 0 + + PID: 15301 CMD: rcp 1Mb.gz mars:/tmp\0 + + value ------------- Distribution ------------- count + 0 | 0 + 1 |@ 2 + 2 |@ 1 + 4 | 0 + 8 |@ 2 + 16 |@ 2 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 64 + 32768 | 0 + +In the above output we can see the "rcp" command dominates, sending +large writes (16 to 31 Kb) 64 times. The "sshd" ssh daemons each sent +several smaller writes, from 32 to 127 bytes - which corresponds to +command line activity (eg, screen width of 80 bytes). The finger command +sent 2 bytes once, and zero data bytes once. + +These values are the TCP write payload sizes. + +The writes from the "rcp" command seem unusual at over 16 Kb each, when +this is an Ethernet network with an MTU of 1500 bytes. The reason is that +at this point the data has not yet been broken down into MTU sized packets, +so we are looking at the applications behaviour as it writes to TCP. + diff --git a/cddl/contrib/dtracetoolkit/Examples/threaded_example.txt b/cddl/contrib/dtracetoolkit/Examples/threaded_example.txt new file mode 100644 index 00000000000..1e41a0ef2ed --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/threaded_example.txt @@ -0,0 +1,108 @@ +The following is a demonstration of the threaded.d script, + + +Here we run a test program called "cputhread" that creates 4 busy threads +that run at the same time. Here we run it on a server with only 1 CPU, + + # threaded.d + + 2005 Jul 26 02:56:37, + + PID: 8516 CMD: cputhread + + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@ 17 + 3 |@@@@@@@@@@@ 28 + 4 |@@@@@@@@@@@ 27 + 5 |@@@@@@@@@@@ 28 + 6 | 0 + [...] + +In the above output, we can see that cputhread has four busy threads with +thread IDs 2, 3, 4 and 5. We are sampling at 100 Hertz, and have caught +each of these threads on the CPU between 17 and 28 times. + +Since the above counts add to 100, this is either a sign of a single CPU +server (which it is), or a sign that a multithreaded application may be +running "serialised" - only 1 thread at a time. Compare the above output +to a multi CPU server, + + + +Here we run the same test program on a server with 4 CPUs, + + # threaded.d + + 2005 Jul 26 02:48:44, + + PID: 5218 CMD: cputhread + + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@ 80 + 3 |@@@@@@@@@@ 72 + 4 |@@@@@@@@@ 64 + 5 |@@@@@@@@@@@ 78 + 6 | 0 + [...] + +This time the counts add to equal 294, so this program is definitely +running on multiple CPUs at the same time, otherwise this total would +not be beyond our sample rate of 100. The distribution of threads on CPU +is fairly even, and the above serves as an example of a multithreaded +application performing well. + + + +Now we run a test program called "cpuserial", which also create 4 busy +threads, however due to a coding problem (poor use of mutex locks) they +only run one at a time, + + # threaded.d + + 2005 Jul 26 03:07:21, + + PID: 5238 CMD: cpuserial + + value ------------- Distribution ------------- count + 2 | 0 + 3 |@@@@@@@@@@@@ 30 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 70 + 5 | 0 + [...] + +The above looks like we are back on a single CPU server with 100 samples +in total, however we are still on our 4 CPU server. Only two threads have +run, and the above distribution is a good indication that they have +run serialised. + + + +Now more of a fringe case. This version of cpuserial again creates 4 threads +that are all busy and hungry for the CPU, and again we run it on a 4 CPU +server, + + # threaded.d + + 2005 Jul 26 03:25:45, + + PID: 5280 CMD: cpuserial + + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@ 42 + 3 |@@@@@@@@@@@@@@@@@@ 50 + 4 |@@@@@@ 15 + 5 |@ 2 + 6 | 0 + [...] + +So all threads are running, good. And with a total of 109, at some point +more than one thread was running at the same time (otherwise this would +not have exceeded 100, bearing in mind a sample rate of 100 Hertz). However, +what is not so good is that with 4 CPUs we have only scored 109 samples - +since all threads are CPU hungry we'd hope that more often they could +run across the CPUs simultaneously; however this wasn't the case. Again, +this fault was created by poor use of mutex locks. + diff --git a/cddl/contrib/dtracetoolkit/Examples/topsyscall_example.txt b/cddl/contrib/dtracetoolkit/Examples/topsyscall_example.txt new file mode 100644 index 00000000000..dda1aa03e51 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/topsyscall_example.txt @@ -0,0 +1,65 @@ +The following is a demonstration of the topsyscall command, + + +Here topsyscall is run with no arguments, + + # topsyscall + 2005 Jun 13 22:13:21, load average: 1.24, 1.24, 1.22 syscalls: 1287 + + SYSCALL COUNT + getgid 4 + getuid 5 + waitsys 5 + xstat 7 + munmap 7 + sysconfig 8 + brk 8 + setcontext 8 + open 8 + getpid 9 + close 9 + resolvepath 10 + lwp_sigmask 22 + mmap 26 + lwp_park 43 + read 59 + write 72 + sigaction 113 + pollsys 294 + ioctl 520 + +The screen updates every second, and continues until Ctrl-C is hit to +end the program. + +In the above output we can see that the ioctl() system call occured 520 times, +pollsys() 294 times and sigaction() 113 times. + + + +Here the command is run with a 10 second interval, + + # topsyscall 10 + 2005 Jun 13 22:15:35, load average: 1.21, 1.22, 1.22 syscalls: 10189 + + SYSCALL COUNT + writev 6 + close 7 + lseek 7 + open 7 + brk 8 + nanosleep 9 + portfs 10 + llseek 14 + lwp_cond_wait 21 + p_online 21 + gtime 27 + rusagesys 71 + setcontext 92 + lwp_sigmask 98 + setitimer 183 + lwp_park 375 + write 438 + read 551 + pollsys 3071 + ioctl 5144 + diff --git a/cddl/contrib/dtracetoolkit/Examples/topsysproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/topsysproc_example.txt new file mode 100644 index 00000000000..368ea314c07 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/topsysproc_example.txt @@ -0,0 +1,56 @@ +The following is a demonstration of the topsysproc program, + + +Here we run topsysproc with no arguments, + + # topsysproc + 2005 Jun 13 22:25:16, load average: 1.24, 1.23, 1.21 syscalls: 1347 + + PROCESS COUNT + svc.startd 1 + nscd 1 + setiathome 7 + poold 18 + sshd 21 + java_vm 35 + tput 49 + dtrace 56 + Xorg 108 + sh 110 + clear 122 + mozilla-bin 819 + +The screen refreshes every 1 second, which can be changed by specifying +a different interval at the command line. + +In the above output we can see that processes with the name "mozilla-bin" +made 819 system calls, while processes with the name "clear" made 122. + + + +Now topsysproc is run with a 15 second interval, + + # topsysproc 15 + 2005 Jun 13 22:29:43, load average: 1.19, 1.20, 1.20 syscalls: 15909 + + PROCESS COUNT + fmd 1 + inetd 2 + svc.configd 2 + gconfd-2 3 + miniserv.pl 3 + sac 6 + snmpd 6 + sshd 8 + automountd 8 + ttymon 9 + svc.startd 17 + nscd 21 + in.routed 37 + sendmail 41 + setiathome 205 + poold 293 + dtrace 413 + java_vm 529 + Xorg 1234 + mozilla-bin 13071 diff --git a/cddl/contrib/dtracetoolkit/Examples/udpstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/udpstat_example.txt new file mode 100644 index 00000000000..4ffa3bafeac --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/udpstat_example.txt @@ -0,0 +1,39 @@ +The following is an example of the udpstat.d script, + + + +Here we run udpstat for a few seconds. Firstly, we run a "spray" command +outbound, followed by a spray inbound. Both can be identified in the +output below, + + # udpstat.d + UDP_out UDP_outErr UDP_in UDP_inErr UDP_noPort + 0 0 0 0 1 + 0 0 0 0 2 + 0 0 0 0 0 + 1165 0 2 0 0 + 0 0 0 0 0 + 0 0 0 0 2 + 3 0 1166 0 1 + 0 0 0 0 0 + 0 0 0 0 0 + 0 0 0 0 0 + ^C + + + +Here we run udpstat.d while an outbound DNS lookup is performed using +"nslookup", + + # udpstat.d + UDP_out UDP_outErr UDP_in UDP_inErr UDP_noPort + 0 0 0 0 1 + 0 0 0 0 1 + 1 0 1 0 0 + 0 0 0 0 0 + 0 0 0 0 3 + ^C + +Little output is observed as this tracks datagrams not bytes. There is +one outbound and one inbound datagram. + diff --git a/cddl/contrib/dtracetoolkit/Examples/uname-a_example.txt b/cddl/contrib/dtracetoolkit/Examples/uname-a_example.txt new file mode 100644 index 00000000000..281033dc872 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/uname-a_example.txt @@ -0,0 +1,15 @@ +The following is a demonstration of the uname.d script, + + +Here we run the usual "uname -a" command and compare the output to that +given by the uname.d script, + + # uname -a + SunOS jupiter 5.10 Generic i86pc i386 i86pc + + # ./uname-a.d + SunOS jupiter 5.10 Generic i86pc i386 i86pc + +The output is the same. uname-a.d is intended as a demonstration script, +and as a starting point for other scripts. + diff --git a/cddl/contrib/dtracetoolkit/Examples/vmbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/vmbypid_example.txt new file mode 100644 index 00000000000..9e09b836a4c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/vmbypid_example.txt @@ -0,0 +1,32 @@ +The following is a demonstration of the vmbypid.d command, + + # vmbypid.d + Tracing... Hit Ctrl-C to end. + ^C + EXEC PID VM VALUE + find 19216 prot_fault 1 + bash 19216 zfod 1 + dtrace 19215 pgfrec 3 + dtrace 19215 pgrec 3 + bash 19216 pgfrec 5 + bash 19216 pgrec 5 + find 19216 cow_fault 6 + find 19216 pgfrec 6 + find 19216 pgrec 6 + bash 19216 prot_fault 10 + bash 19216 cow_fault 15 + bash 19155 prot_fault 30 + dtrace 19215 zfod 52 + find 19216 zfod 54 + dtrace 19215 as_fault 56 + bash 19216 as_fault 74 + find 19216 as_fault 91 + find 19216 fspgin 315 + find 19216 pgin 315 + find 19216 pgpgin 315 + find 19216 maj_fault 315 + +In the above output, the find command at PID 19211 triggered 315 maj_faults - +major faults, that would require disk activity to satisfy (as confirmed by the +pgpgin value for pages paged in). + diff --git a/cddl/contrib/dtracetoolkit/Examples/vmstat-p_example.txt b/cddl/contrib/dtracetoolkit/Examples/vmstat-p_example.txt new file mode 100644 index 00000000000..1a0fe14b775 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/vmstat-p_example.txt @@ -0,0 +1,51 @@ +The following is a demonstration of the vmstat-p.d script, + + +We run both vmstat-p.d and the original vmstat(1M) command at the same time +to compare outputs, + + $ vmstat -p 1 + memory page executable anonymous filesystem + swap free re mf fr de sr epi epo epf api apo apf fpi fpo fpf + 1144488 142456 2 8 1 0 0 0 0 0 0 0 0 2 1 1 + 1063812 84472 18 92 0 0 0 0 0 0 0 0 0 0 0 0 + 1050404 75108 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1050404 75108 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1050404 75108 476 150 0 0 0 0 0 0 0 0 0 0 0 0 + 1050184 74772 73 0 0 0 0 0 0 0 0 0 0 788 0 0 + 1050400 74988 2371 173 0 0 0 0 0 0 0 0 0 0 0 0 + 1050400 75100 1057 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1050400 75100 2 0 0 0 0 0 0 0 0 0 0 4 0 0 + 1050400 75100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1050400 75100 4529 172 0 0 0 0 0 0 0 0 0 192 0 0 + 1050400 75104 0 0 0 0 0 0 0 0 0 0 0 467 0 0 + 1050400 75104 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + # ./vmstat-p.d + memory page executable anonymous filesystem + swap free re mf sr epi epo epf api apo apf fpi fpo fpf + 1050404 75108 8 80 0 0 0 0 0 0 0 0 0 0 + 1050404 75108 0 0 0 0 0 0 0 0 0 0 0 0 + 1050404 75108 0 0 0 0 0 0 0 0 0 0 0 0 + 1050180 74768 2216 608 0 0 0 0 0 0 0 568 0 0 + 1050400 74988 4 0 0 0 0 0 0 0 0 228 0 0 + 1050400 75100 13852 700 0 0 0 0 0 0 0 0 0 0 + 1050400 75100 8 0 0 0 0 0 0 0 0 4 0 0 + 1050400 75100 0 0 0 0 0 0 0 0 0 0 0 0 + 1050400 75100 0 0 0 0 0 0 0 0 0 0 0 0 + 1050400 75104 18480 700 0 0 0 0 0 0 0 668 0 0 + 1050400 75104 0 0 0 0 0 0 0 0 0 0 0 0 + +Above we can see the columns are corresponding well. "re" and "mf" in the +DTrace output appear four times as large as they should be, because in the +DTrace output we are printing Kbs not page counts (for consistancy). + +The DTrace output lacks the "summary since boot" line, as it is not using +Kstat to fetch this data. + + +The vmstat-p.d script is not intended itself as a useful program, rather it +is intended as a starting point for other DTrace scripts; a starting point +of familiar statistics to provide the programmer with a "common ground" +of knowledge. + diff --git a/cddl/contrib/dtracetoolkit/Examples/vmstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/vmstat_example.txt new file mode 100644 index 00000000000..7d953fd9b67 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/vmstat_example.txt @@ -0,0 +1,45 @@ +The following is an example of the vmstat.d script, + + +We run both vmstat.d and the original vmstat(1M) command at the same time +to compare outputs, + + $ vmstat 1 + kthr memory page disk faults cpu + r b w swap free re mf pi po fr de sr cd s0 -- -- in sy cs us sy id + 0 0 0 1147468 144324 2 8 2 1 1 0 0 1 0 0 0 294 990 355 18 2 80 + 1 0 0 1065480 92276 13 73 0 0 0 0 0 0 0 0 0 359 1055 376 85 15 0 + 0 0 0 1052088 82940 0 0 0 0 0 0 0 0 0 0 0 409 999 402 97 3 0 + 0 0 0 1052088 82940 0 0 0 0 0 0 0 0 0 0 0 406 975 407 97 3 0 + 0 0 0 1052088 82940 0 0 0 0 0 0 0 0 0 0 0 406 1037 429 97 3 0 + 0 0 0 1052088 82940 247 1763 0 0 0 0 0 2 0 0 0 427 4828 680 81 19 0 + 0 0 0 1051264 82300 0 0 0 0 0 0 0 0 0 0 0 414 1164 441 97 3 0 + 0 0 0 1051264 82300 11 134 0 0 0 0 0 0 0 0 0 423 1218 461 95 5 0 + 0 0 0 1051264 82300 0 0 0 0 0 0 0 0 0 0 0 416 1054 435 98 2 0 + [...] + + # ./vmstat.d + w swap free re mf pi po fr sr in sy cs + 0 1052088 82940 8 80 0 0 0 0 117 958 379 + 0 1052088 82940 0 0 0 0 0 0 123 955 402 + 0 1052088 82940 0 0 0 0 0 0 121 1025 420 + 0 1052088 82940 0 0 0 0 0 0 121 1065 433 + 0 1051264 82300 1008 7192 0 0 0 0 219 4886 684 + 0 1051264 82300 0 0 0 0 0 0 193 1188 461 + 0 1051264 82300 44 540 0 0 0 0 165 1226 450 + 0 1051264 82300 0 0 0 0 0 0 123 1012 421 + [...] + +Above we can see the columns are corresponding well. "re" and "mf" in the +DTrace output appear four times as large as they should be, because in the +DTrace output we are printing Kbs not page counts (for consistancy). + +The DTrace output lacks the "summary since boot" line, as it is not using +Kstat to fetch this data. + + +The vmstat.d script is not intended itself as a useful program, rather it +is intended as a starting point for other DTrace scripts; a starting point +of familiar statistics to provide the programmer with a "common ground" +of knowledge. + diff --git a/cddl/contrib/dtracetoolkit/Examples/vopstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/vopstat_example.txt new file mode 100644 index 00000000000..646419efada --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/vopstat_example.txt @@ -0,0 +1,89 @@ +The following are demonstrations of the vopstat script. + + +By default, vopstat traces activity at the vnode interface and prints +summaries every five seconds. It will either trace all filesystems or +just the mountpoint specified. + +Here it was run on /extra1, while a tar command archived /extra1, + + # ./vopstat /extra1 + VOP Physical IO Count + fop_getpage 66 + + VOP Count Count + fop_readdir 1 + fop_read 2 + fop_cmp 2 + fop_seek 3 + fop_close 7 + fop_open 10 + fop_getattr 12 + fop_access 13 + fop_lookup 16 + fop_rwunlock 3802 + fop_rwlock 3802 + fop_putpage 4701 + fop_getpage 6648 + fop_dispose 19109 + + VOP Wall Time mSeconds + fop_readdir 0 + fop_cmp 0 + fop_read 0 + fop_seek 0 + fop_close 0 + fop_open 0 + fop_access 0 + fop_getattr 0 + fop_lookup 0 + fop_rwunlock 64 + fop_putpage 86 + fop_rwlock 93 + fop_dispose 346 + fop_getpage 402 + ^C + +There were 66 calls for physical I/O operations, fop_getpage, as files +were read from disk. The VOP Count show that there were many calls to +fop_putpage and fop_getpage, as tar works its way through files; and +many more to fop_dispose. The total elaspsed time for these calls +are listed at the bottom, in milleseconds. + +This rate of events will put some pressure on the DTrace buffer, +you may see dynamic variable drops. + + + +vopstat also has a -t option to trace activity. Here it is run on /extra1 +while an "ls" command listed files from that directory, + +# ./vopstat -t /extra1 + Event Device Path RW Size Offset +-> fop_getattr - /extra1 - 0 0 +<- fop_getattr - /extra1 - 0 0 +-> fop_access - /extra1 - 0 0 +<- fop_access - /extra1 - 0 0 +-> fop_open - /extra1 - 0 0 +<- fop_open - /extra1 - 0 0 +-> fop_getattr - /extra1 - 0 0 +<- fop_getattr - /extra1 - 0 0 +-> fop_rwlock - /extra1 - 0 0 +<- fop_rwlock - /extra1 - 0 0 +-> fop_readdir - /extra1 - 0 0 +-> fop_getpage - /extra1 - 0 0 +<- fop_getpage - /extra1 - 0 0 +-> fop_rwunlock - /extra1 - 0 0 +<- fop_rwunlock - /extra1 - 0 0 +-> fop_rwlock - /extra1 - 0 0 +<- fop_rwlock - /extra1 - 0 0 +-> fop_readdir - /extra1 - 0 0 +<- fop_readdir - /extra1 - 0 0 +-> fop_rwunlock - /extra1 - 0 0 +<- fop_rwunlock - /extra1 - 0 0 +-> fop_close - /extra1 - 0 512 +<- fop_close - /extra1 - 0 512 +^C + +Each call can be seen as it happened, including the entry and return of +these calls. diff --git a/cddl/contrib/dtracetoolkit/Examples/weblatency_example.txt b/cddl/contrib/dtracetoolkit/Examples/weblatency_example.txt new file mode 100644 index 00000000000..995b545a366 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/weblatency_example.txt @@ -0,0 +1,127 @@ +The following is a demonstration of the weblatency.d script. + +Here we run weblatency.d while a mozilla browser loads the +http://www.planetsolaris.org website. After the website was loaded, Ctrl-C +was hit to print the following report, + + # weblatency.d + Tracing... Hit Ctrl-C to end. + ^C + HOST NUM + static.flickr.com 1 + images.pegasosppc.com 1 + www.planetsolaris.org 5 + blogs.sun.com 7 + + HOST AVGTIME(ms) + static.flickr.com 65 + blogs.sun.com 285 + images.pegasosppc.com 491 + www.planetsolaris.org 757 + + HOST MAXTIME(ms) + static.flickr.com 65 + images.pegasosppc.com 491 + blogs.sun.com 962 + www.planetsolaris.org 3689 + +This gives us an understanding on which hosts were responsible for the +time endured while loading the website. It turns out that requests to +www.planetsolaris.org were the slowest, with a maximum time of 3.7 seconds +(probably the first request, which incurred a DNS lookup). + + + +The following shows the same google lookup performed on a number of sites, + + # weblatency.d + Tracing... Hit Ctrl-C to end. + ^C + HOST NUM + www.google.com.au 3 + www.google.co.uk 3 + www.google.com 3 + www.google.co.nz 3 + + HOST AVGTIME(ms) + www.google.co.nz 450 + www.google.com.au 502 + www.google.com 567 + www.google.co.uk 595 + + HOST MAXTIME(ms) + www.google.co.nz 544 + www.google.com.au 559 + www.google.com 744 + www.google.co.uk 763 + +From the average time you would guess that I was running this from +New Zealand (the fastest), with times to the other hosts following suit +(Australia, USA, UK). I was actually running this from Australia - it's +interesting that the New Zealand server responded slightly faster. + + + + +Now several websites are loaded as a larger demonstration, + + # weblatency.d + Tracing... Hit Ctrl-C to end. + ^C + HOST NUM + shop.abc.net.au 1 + static.technorati.com 1 + sunopensolaris.112.2o7.net 1 + www.theage.com.au 1 + ffxcam.smh.com.au 1 + sunglobal.112.2o7.net 2 + embed.technorati.com 2 + technorati.com 2 + fdimages.fairfax.com.au 4 + blogs.sun.com 5 + bugs.opensolaris.org 7 + www.abc.net.au 34 + www.smh.com.au 51 + + HOST AVGTIME(ms) + ffxcam.smh.com.au 0 + sunglobal.112.2o7.net 0 + www.abc.net.au 56 + www.theage.com.au 64 + shop.abc.net.au 65 + www.smh.com.au 73 + fdimages.fairfax.com.au 88 + blogs.sun.com 130 + bugs.opensolaris.org 162 + static.technorati.com 350 + technorati.com 352 + embed.technorati.com 632 + sunopensolaris.112.2o7.net 900 + + HOST MAXTIME(ms) + ffxcam.smh.com.au 0 + sunglobal.112.2o7.net 0 + www.theage.com.au 64 + shop.abc.net.au 65 + fdimages.fairfax.com.au 243 + www.smh.com.au 244 + blogs.sun.com 293 + www.abc.net.au 315 + static.technorati.com 350 + technorati.com 356 + bugs.opensolaris.org 560 + sunopensolaris.112.2o7.net 900 + embed.technorati.com 973 + +It's interesting that the most common host (www.smh.com.au, NUM == 51), +responded with a fast AVGTIME (73 ms). The reason for this may be due to +cacheing by my proxy server. Less common hosts such as embed.technorati.com +were quite slow. + + + +The results from weblatency.d are interesting, but they don't point the +finger at one single cause for website latency. The value here is the response +time experienced by the client - which is a combination of many response +times (link speeds, proxy server, DNS server, web server). + diff --git a/cddl/contrib/dtracetoolkit/Examples/whatexec_example.txt b/cddl/contrib/dtracetoolkit/Examples/whatexec_example.txt new file mode 100644 index 00000000000..519909ec789 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/whatexec_example.txt @@ -0,0 +1,18 @@ +The following are demonstrations of the whatexec.d script. + + +Here we run it while a few commands are also executed, + + # ./whatexec.d + PEXEC EXEC OK TYPE + bash /usr/bin/clear Y #!/u\0 + bash /sbin/sh Y \177ELF\0 + clear /usr/bin/tput Y \177ELF\0 + bash /export/home/brendan/DOOM.EXE N MZ\644\0 + ^C + +whatexec.d has first found that "clear" was run, which has a type that +begins with "#!" - a script. clear runs "sh" and "tput", both ELF files. + +We finish by attempting to run a MZ file, "DOOM.EXE", which is rejected +(OK is "N"). diff --git a/cddl/contrib/dtracetoolkit/Examples/woof_example.txt b/cddl/contrib/dtracetoolkit/Examples/woof_example.txt new file mode 100644 index 00000000000..dc815272811 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/woof_example.txt @@ -0,0 +1,28 @@ +The following explains how to demonstrate the woof.d DTrace script. + +This script is only useful if you have an audio device, /dev/audio. To test +audio, you can run: + + $ audioplay /usr/share/audio/samples/au/sample.au + +The volume can be adjusted from a few tools, including, + + $ /usr/dt/bin/sdtaudiocontrol + +... + +woof.d will bark whenever a new process is created. In order to demonstrate +it, first run the following: + + # ./woof.d & + +You have now installed the dog (if the dog becomes a nusience, you are +allowed to kill it). Now compare the difference between these recursive +grep commands: + + $ find /etc -type f -exec grep localhost {} \; + + $ find /etc -type f -exec grep localhost {} + + +The first find command is the "bad way", the second is the "good way". You +will hear for yourself why this is the case. diff --git a/cddl/contrib/dtracetoolkit/Examples/wpm_example.txt b/cddl/contrib/dtracetoolkit/Examples/wpm_example.txt new file mode 100644 index 00000000000..bfc74a90ff3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/wpm_example.txt @@ -0,0 +1,57 @@ +The following is an example of the wpm.d script. + + +This script takes the name of a program to trace, and assumes that reads +on file descriptor zero (STDIN) are keystrokes. + +When run, a 5 second count down begins before keystrokes are measured, + + # wpm.d vim + Measuring will start in : 5 seconds + +While running, I retyped the first three sentences of this file a few times +which clocked the following result, + + # wpm.d vim + Measuring will start in : 0 seconds + Measuring will stop in : 0 seconds + + Characters typed : 509 + Words per minute : 84 + + Minimum keystroke latency : 12 ms + Average keystroke latency : 118 ms + Maximum keystroke latency : 493 ms + + Word size distribution (letters), + + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@ 6 + 2 |@@@@@ 11 + 3 |@@@@@ 11 + 4 |@@@@@@ 13 + 5 |@@@@ 8 + 6 |@@@@@@ 12 + 7 |@@@@@ 11 + 8 | 0 + 9 |@@ 4 + 10 |@ 3 + 11 |@ 2 + 12 | 0 + 13 | 0 + 14 | 1 + 15 | 0 + + Keystroke latency distribution (ms), + + value ------------- Distribution ------------- count + 4 | 0 + 8 | 1 + 16 | 5 + 32 |@@@@@ 66 + 64 |@@@@@@@@@@@@@@@@@@@@ 247 + 128 |@@@@@@@@@@@@@ 167 + 256 |@ 16 + 512 | 0 + diff --git a/cddl/contrib/dtracetoolkit/Examples/writebytes_example.txt b/cddl/contrib/dtracetoolkit/Examples/writebytes_example.txt new file mode 100644 index 00000000000..baa83fc971f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/writebytes_example.txt @@ -0,0 +1,26 @@ +The following is a demonstration of the writebytes.d script, + + +Here the writebytes.d script is run for a few seconds, then Ctrl-C is hit, + + # writebytes.d + dtrace: description 'sysinfo:::writech ' matched 4 probes + ^C + dtrace 1 + gnome-settings-d 8 + xscreensaver 8 + gnome-panel 8 + nautilus 8 + date 29 + wnck-applet 120 + bash 210 + mozilla-bin 1497 + ls 1947 + metacity 3172 + Xorg 7424 + gnome-terminal 51955 + + +In this interval the gnome-terminal command has successfully written 51.9 Kb, +while Xorg has written 7424 bytes. + diff --git a/cddl/contrib/dtracetoolkit/Examples/writedist_example.txt b/cddl/contrib/dtracetoolkit/Examples/writedist_example.txt new file mode 100644 index 00000000000..f334843e2c1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/writedist_example.txt @@ -0,0 +1,38 @@ +The following is an example of the writedist.d script, + + +Here the writedist.d script is run for a few seconds, then Ctrl-C is hit, + + # writedist.d + dtrace: description 'sysinfo:::writech ' matched 4 probes + ^C + [...] + Xorg + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 169 + 64 |@@@ 16 + 128 |@@ 10 + 256 | 0 + + gnome-terminal + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@ 6 + 2 | 0 + 4 | 0 + 8 | 1 + 16 |@ 2 + 32 |@@@ 7 + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@ 63 + 256 |@@@@ 10 + 512 | 1 + 1024 |@@@@@ 13 + 2048 |@ 2 + 4096 |@@@ 7 + +This allows us to understand the write behaviour of each process. The +gnome-terminal command has executed 6 writes that returned 0 bytes, through +to 7 writes that were at least 4096 bytes (up to 8192). + diff --git a/cddl/contrib/dtracetoolkit/Examples/xcallsbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/xcallsbypid_example.txt new file mode 100644 index 00000000000..1593b62de62 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/xcallsbypid_example.txt @@ -0,0 +1,17 @@ +The following is a demonstration of the xcallsbypid.d script, + + # xcallsbypid.d + Tracing... Hit Ctrl-C to end. + ^C + PID CMD XCALLS + 215 utmpd 3 + 6350 bash 3 + 6351 bash 3 + 6350 ls 24 + 0 sched 48 + 6349 dtrace 93 + 6351 find 5718 + +In the above output, we can see the find command with PID 6351 has caused +5718 cross calls. + diff --git a/cddl/contrib/dtracetoolkit/Examples/xvmstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/xvmstat_example.txt new file mode 100644 index 00000000000..544bd985e8b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/xvmstat_example.txt @@ -0,0 +1,44 @@ +The following is a demonstration of the xvmstat program. + + +Here we run it with no arguments. It will default to 1 second samples, and +will run forever, + + # xvmstat + w swap free re maj mf cow pro sr epi epo epf api apo apf fpi fpo fpf + 0 1025 73 2 0 21 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1025 73 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 0 1025 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1025 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1025 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1025 73 199 42 166 21 41 0 0 0 0 0 0 0 42 0 0 + 0 1025 73 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 + 0 1025 73 4404 47 175 26 30 0 0 0 0 0 0 0 48 0 0 + 0 1025 73 433 0 0 0 14 0 0 0 0 0 0 0 0 0 0 + 0 1025 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1025 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1025 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + ^C + +Both "swap" and "free" are in units of megabytes, the rest are in units of +pages. "maj" is major faults - a useful addition to the output. + +There is no summary since boot line, as this program in not using the +Kstat data. + + + +The following runs xvmstat with a 5 second interval, + + # xvmstat 5 + w swap free re maj mf cow pro sr epi epo epf api apo apf fpi fpo fpf + 0 1025 72 1531 2 40 5 9 0 0 0 0 0 0 0 2 0 0 + 0 1025 72 1534 0 36 5 9 0 0 0 0 0 0 0 0 0 0 + 0 1025 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1025 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1025 72 5 1 82 16 25 0 0 0 0 0 0 0 1 0 0 + 0 1025 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + ^C + +The values from "re" to "fpf" are per second values. + diff --git a/cddl/contrib/dtracetoolkit/Examples/zvmstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/zvmstat_example.txt new file mode 100644 index 00000000000..cb070c5d3e5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/zvmstat_example.txt @@ -0,0 +1,34 @@ +The following is a demonstration of the zvmstat command, which provides +vmstat style info per zone using DTrace. + +Here we run zvmstat with an interval of 5 seconds. This is a server that +only has two zones, "global" and "workzone1", + + # zvmstat 5 + ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf + global 62 340 0 0 0 0 0 0 0 0 0 0 0 + workzone1 4 2 0 0 0 0 0 0 0 0 0 0 0 + ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf + global 1132 484 0 0 2 0 0 0 0 0 832 0 0 + workzone1 0 0 0 0 0 0 0 0 0 0 0 0 0 + ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf + global 50 319 2 0 2 0 0 0 0 0 579 2 2 + workzone1 0 0 0 0 0 0 0 0 0 0 0 0 0 + ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf + global 54 317 0 0 0 0 0 0 0 0 0 0 0 + workzone1 0 0 0 0 0 0 0 0 0 0 0 0 0 + ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf + global 54 316 1 0 0 0 0 0 0 0 0 1 1 + workzone1 0 0 0 0 0 0 0 0 0 0 0 0 0 + ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf + global 157 659 1 0 10 0 0 0 0 0 3 2 1 + workzone1 770 1085 0 0 48 0 0 0 0 0 928 0 0 + ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf + global 56 317 0 0 6 0 0 0 0 0 2 0 0 + workzone1 1478 21 0 0 0 0 0 0 0 0 1635 0 0 + +During the first few samples, some filesystem activity can be observed in +the global zone, created by a "find /" in the global. In the last few samples, +filesystem activity can be seen in the non-global zone "workzone1" - this +time created by running a "find /" within the non-global zone, + diff --git a/cddl/contrib/dtracetoolkit/FS/Readme b/cddl/contrib/dtracetoolkit/FS/Readme new file mode 100644 index 00000000000..30927a5e2db --- /dev/null +++ b/cddl/contrib/dtracetoolkit/FS/Readme @@ -0,0 +1,3 @@ +FS - File System based analysis + + This would include VFS and UFS activity. diff --git a/cddl/contrib/dtracetoolkit/FS/fspaging.d b/cddl/contrib/dtracetoolkit/FS/fspaging.d new file mode 100755 index 00000000000..4eaa718a517 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/FS/fspaging.d @@ -0,0 +1,154 @@ +#!/usr/sbin/dtrace -s +/* + * fspaging.d - file system read/write and paging tracing. + * Written using DTrace (Solaris 10 3/05) + * + * This traces file related activity: system call reads and writes, + * vnode logical read and writes (fop), vnode putpage and getpage activity, + * and disk I/O. It can be used to examine the behaviour of each I/O + * layer, from the syscall interface to what the disk is doing. Behaviour + * such as read-ahead, and max I/O size breakup can be observed. + * + * This is a verbose version of fsrw.d, as this also traces paging activity. + * + * $Id: fspaging.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: fspaging.d + * + * FIELDS: + * Event Traced event (see EVENTS below) + * Device Device, for disk I/O + * RW Either Read or Write + * Size Size of I/O in bytes, if known + * Offset Offset of I/O in kilobytes, if known + * Path Path to file on disk + * + * EVENTS: + * sc-read System call read + * sc-write System call write + * fop_read Logical read + * fop_write Logical write + * fop_getpage Logical get page + * fop_putpage Logical put page + * disk_io Physical disk I/O + * disk_ra Physical disk I/O, read ahead + * + * The events are drawn with a level of indentation, which can sometimes + * help identify related events. + * + * SEE ALSO: fsrw.d + * + * IDEA: Richard McDougall, Solaris Internals 2nd Ed, FS Chapter. + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * ToDo: readv() + * + * 20-Mar-2006 Brendan Gregg Created this. + * 23-Apr-2006 " " Last update. + */ + +#pragma D option quiet +#pragma D option switchrate=10hz + +dtrace:::BEGIN +{ + printf("%-13s %10s %2s %8s %6s %s\n", + "Event", "Device", "RW", "Size", "Offset", "Path"); +} + +syscall::*read:entry, +syscall::*write*:entry +{ + /* + * starting with a file descriptior, dig out useful info + * from the corresponding file_t and vnode_t. + */ + this->filistp = curthread->t_procp->p_user.u_finfo.fi_list; + this->ufentryp = (uf_entry_t *)((uint64_t)this->filistp + + (uint64_t)arg0 * (uint64_t)sizeof (uf_entry_t)); + this->filep = this->ufentryp->uf_file; + self->offset = this->filep->f_offset; + this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0; + self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ? + cleanpath(this->vnodep->v_path) : "") : ""; + self->sc_trace = this->vnodep ? this->vnodep->v_type == 1 || + this->vnodep->v_type == 2 ? 1 : 0 : 0; +} + +syscall::*read:entry +/self->sc_trace/ +{ + printf("sc-%-10s %10s %2s %8d %6d %s\n", probefunc, ".", "R", + (int)arg2, self->offset / 1024, self->vpath); +} + +syscall::*write*:entry +/self->sc_trace/ +{ + printf("sc-%-10s %10s %2s %8d %6d %s\n", probefunc, ".", "W", + (int)arg2, self->offset / 1024, self->vpath); +} + +syscall::*read:return, +syscall::*write*:return +{ + self->vpath = 0; + self->offset = 0; + self->sc_trace = 0; +} + +fbt::fop_putpage:entry, +fbt::fop_getpage:entry +/self->sc_trace && args[0]->v_path/ +{ + printf(" %-11s %10s %2s %8d %6d %s\n", probefunc, ".", + probefunc == "fop_getpage" ? "R" : "W", (uint64_t)arg2, + args[1] / 1024, cleanpath(args[0]->v_path)); +} + + +fbt::fop_read:entry, +fbt::fop_write:entry +/self->sc_trace && args[0]->v_path/ +{ + printf(" %-11s %10s %2s %8d %6d %s\n", probefunc, ".", + probefunc == "fop_read" ? "R" : "W", args[1]->uio_resid, + args[1]->_uio_offset._f / 1024, cleanpath(args[0]->v_path)); +} + +fbt:ufs:ufs_getpage_ra:entry +{ + /* fetch the real offset (file_t is unaware of this) */ + self->offset = ((inode_t *)args[0]->v_data)->i_nextrio; + self->read_ahead = 1; +} + +fbt:ufs:ufs_getpage_ra:return +{ + self->read_ahead = 0; + self->offset = 0; +} + +io::bdev_strategy:start +{ + this->offset = self->read_ahead ? self->offset : args[2]->fi_offset; + printf(" %-9s %10s %2s %8d %6d %s\n", + self->read_ahead ? "disk_ra" : "disk_io", args[1]->dev_statname, + args[0]->b_flags & B_READ ? "R" : "W", args[0]->b_bcount, + this->offset / 1024, args[2]->fi_pathname); +} diff --git a/cddl/contrib/dtracetoolkit/FS/fsrw.d b/cddl/contrib/dtracetoolkit/FS/fsrw.d new file mode 100755 index 00000000000..291f09aaae0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/FS/fsrw.d @@ -0,0 +1,149 @@ +#!/usr/sbin/dtrace -s +/* + * fsrw.d - file system read/write event tracing. + * Written using DTrace (Solaris 10 3/05) + * + * This traces file related activity: system call reads and writes, + * vnode logical read and writes (fop), and disk I/O. It can be used + * to examine the behaviour of each I/O layer, from the syscall + * interface to what the disk is doing. Behaviour such as read-ahead, and + * max I/O size breakup can be observed. + * + * $Id: fsrw.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: fsrw.d + * + * FIELDS: + * Event Traced event (see EVENTS below) + * Device Device, for disk I/O + * RW Either Read or Write + * Size Size of I/O in bytes + * Offset Offset of I/O in kilobytes + * Path Path to file on disk + * + * EVENTS: + * sc-read System call read + * sc-write System call write + * fop_read Logical read + * fop_write Logical write + * disk_io Physical disk I/O + * disk_ra Physical disk I/O, read ahead + * + * The events are drawn with a level of indentation, which can sometimes + * help identify related events. + * + * SEE ALSO: fspaging.d + * + * IDEA: Richard McDougall, Solaris Internals 2nd Ed, FS Chapter. + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * ToDo: readv() + * + * 20-Mar-2006 Brendan Gregg Created this. + * 23-Apr-2006 " " Last update. + */ + +#pragma D option quiet +#pragma D option switchrate=10hz + +dtrace:::BEGIN +{ + printf("%-12s %10s %2s %8s %6s %s\n", + "Event", "Device", "RW", "Size", "Offset", "Path"); +} + +syscall::*read:entry, +syscall::*write*:entry +{ + /* + * starting with a file descriptior, dig out useful info + * from the corresponding file_t and vnode_t. + */ + this->filistp = curthread->t_procp->p_user.u_finfo.fi_list; + this->ufentryp = (uf_entry_t *)((uint64_t)this->filistp + + (uint64_t)arg0 * (uint64_t)sizeof (uf_entry_t)); + this->filep = this->ufentryp->uf_file; + self->offset = this->filep->f_offset; + this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0; + self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ? + cleanpath(this->vnodep->v_path) : "") : ""; + + /* only trace activity to regular files and directories, as */ + self->sc_trace = this->vnodep ? this->vnodep->v_type == VREG || + this->vnodep->v_type == VDIR ? 1 : 0 : 0; +} + +syscall::*read:entry +/self->sc_trace/ +{ + printf("sc-%-9s %10s %2s %8d %6d %s\n", probefunc, ".", "R", + (int)arg2, self->offset / 1024, self->vpath); +} + +syscall::*write*:entry +/self->sc_trace/ +{ + printf("sc-%-9s %10s %2s %8d %6d %s\n", probefunc, ".", "W", + (int)arg2, self->offset / 1024, self->vpath); +} + +syscall::*read:return, +syscall::*write*:return +{ + self->vpath = 0; + self->offset = 0; + self->sc_trace = 0; +} + +fbt::fop_read:entry, +fbt::fop_write:entry +/self->sc_trace && args[0]->v_path/ +{ + printf(" %-10s %10s %2s %8d %6d %s\n", probefunc, ".", + probefunc == "fop_read" ? "R" : "W", args[1]->uio_resid, + args[1]->_uio_offset._f / 1024, cleanpath(args[0]->v_path)); +} + +fbt:ufs:ufs_getpage_ra:entry +{ + /* fetch the real offset (file_t is unaware of this) */ + self->ra_offset = ((inode_t *)args[0]->v_data)->i_nextrio; + self->read_ahead = 1; +} + +fbt:ufs:ufs_getpage_ra:return +{ + self->read_ahead = 0; + self->ra_offset = 0; +} + +io::bdev_strategy:start +{ + this->offset = self->read_ahead ? self->ra_offset : args[2]->fi_offset; + printf(" %-8s %10s %2s %8d %6d %s\n", + self->read_ahead ? "disk_ra" : "disk_io", args[1]->dev_statname, + args[0]->b_flags & B_READ ? "R" : "W", args[0]->b_bcount, + this->offset / 1024, args[2]->fi_pathname); + /* + * it would seem to make sense to only trace disk events during + * an fop event, easily coded with a self->fop_trace flag. However + * writes are asynchronous to the fop_write calls (they are flushed + * at some later time), and so this approach will miss tracing + * most of the disk writes. + */ +} diff --git a/cddl/contrib/dtracetoolkit/FS/rfileio.d b/cddl/contrib/dtracetoolkit/FS/rfileio.d new file mode 100755 index 00000000000..95a6caad5c6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/FS/rfileio.d @@ -0,0 +1,91 @@ +#!/usr/sbin/dtrace -s +/* + * rfileio.d - read file I/O stats, with cache miss rate. + * Written using DTrace (Solaris 10 3/05) + * + * This script provides statistics on the number of reads and the bytes + * read from filesystems (logical), and the number of bytes read from + * disk (physical). A summary is printed every five seconds by file. + * + * A total miss-rate is also provided for the file system cache. + * + * $Id: rfileio.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: rfileio.d + * + * IDEA: Richard McDougall, Solaris Internals 2nd Ed, FS Chapter. + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 19-Mar-2006 Brendan Gregg Created this. + * 23-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +self int trace; +uint64_t lbytes; +uint64_t pbytes; + +dtrace:::BEGIN +{ + trace("Tracing...\n"); +} + +fbt::fop_read:entry +/self->trace == 0 && args[0]->v_path/ +{ + self->pathname = cleanpath(args[0]->v_path); + @rio[self->pathname, "logical"] = count(); + lbytes += args[1]->uio_resid; + self->size = args[1]->uio_resid; + self->uiop = args[1]; +} + +fbt::fop_read:return +/self->size/ +{ + @rbytes[self->pathname, "logical"] = + sum(self->size - self->uiop->uio_resid); + self->size = 0; + self->uiop = 0; + self->pathname = 0; +} + +io::bdev_strategy:start +/self->size && args[0]->b_flags & B_READ/ +{ + @rio[self->pathname, "physical"] = count(); + @rbytes[self->pathname, "physical"] = sum(args[0]->b_bcount); + pbytes += args[0]->b_bcount; +} + +profile:::tick-5s +{ + trunc(@rio, 20); + trunc(@rbytes, 20); + printf("\033[H\033[2J"); + printf("\nRead IOPS, top 20 (count)\n"); + printa("%-54s %10s %10@d\n", @rio); + printf("\nRead Bandwidth, top 20 (bytes)\n"); + printa("%-54s %10s %10@d\n", @rbytes); + printf("\nTotal File System miss-rate: %d%%\n", + lbytes ? 100 * pbytes / lbytes : 0); + trunc(@rbytes); + trunc(@rio); + lbytes = pbytes = 0; +} diff --git a/cddl/contrib/dtracetoolkit/FS/rfsio.d b/cddl/contrib/dtracetoolkit/FS/rfsio.d new file mode 100755 index 00000000000..847756314ba --- /dev/null +++ b/cddl/contrib/dtracetoolkit/FS/rfsio.d @@ -0,0 +1,98 @@ +#!/usr/sbin/dtrace -s +/* + * rfsio.d - read FS I/O stats, with cache miss rate. + * Written using DTrace (Solaris 10 3/05) + * + * This script provides statistics on the number of reads and the bytes + * read from filesystems (logical), and the number of bytes read from + * disk (physical). A summary is printed every five seconds by filesystem. + * + * A total miss-rate is also provided for the file system cache. + * + * $Id: rfsio.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: rfsio.d + * + * IDEA: Richard McDougall, Solaris Internals 2nd Ed, FS Chapter. + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 19-Mar-2006 Brendan Gregg Created this. + * 23-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +self int trace; +uint64_t lbytes; +uint64_t pbytes; + +dtrace:::BEGIN +{ + trace("Tracing...\n"); +} + +fbt::fop_read:entry +/self->trace == 0/ +{ + self->fs_mount = args[0]->v_vfsp == `rootvfs ? "/" : + args[0]->v_vfsp->vfs_vnodecovered ? + stringof(args[0]->v_vfsp->vfs_vnodecovered->v_path) : NULL; +} + +fbt::fop_read:entry +/self->fs_mount != NULL/ +{ + @rio[self->fs_mount, "logical"] = count(); + lbytes += args[1]->uio_resid; + self->size = args[1]->uio_resid; + self->uiop = args[1]; +} + +fbt::fop_read:return +/self->size/ +{ + @rbytes[self->fs_mount, "logical"] = + sum(self->size - self->uiop->uio_resid); + self->size = 0; + self->uiop = 0; + self->fs_mount = 0; +} + +io::bdev_strategy:start +/self->size && args[0]->b_flags & B_READ/ +{ + @rio[self->fs_mount, "physical"] = count(); + @rbytes[self->fs_mount, "physical"] = sum(args[0]->b_bcount); + pbytes += args[0]->b_bcount; +} + +profile:::tick-5s +{ + trunc(@rio, 20); + trunc(@rbytes, 20); + printf("\033[H\033[2J"); + printf("\nRead IOPS (count)\n"); + printa("%-32s %10s %10@d\n", @rio); + printf("\nRead Bandwidth (bytes)\n"); + printa("%-32s %10s %10@d\n", @rbytes); + printf("\nTotal File System miss-rate: %d%%\n", + lbytes ? 100 * pbytes / lbytes : 0); + trunc(@rbytes); + trunc(@rio); + lbytes = pbytes = 0; +} diff --git a/cddl/contrib/dtracetoolkit/FS/vopstat b/cddl/contrib/dtracetoolkit/FS/vopstat new file mode 100755 index 00000000000..a4c5af46d7d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/FS/vopstat @@ -0,0 +1,304 @@ +#!/usr/bin/sh +# +# vopstat - Trace the vnode interface. +# Written using DTrace (Solaris 10 3/05) +# +# Author: Richard McDougall +# +# $Id: vopstat 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: vopstat [-t] [/mountname] +# +# vopstat # default output, summary each 5 secs +# -t # trace activity as it occurs +# +# Example: +# +# ./vopstat +# +# VOP Physical IO Count +# fop_fsync 236 +# +# VOP Count Count +# fop_create 1 +# fop_fid 1 +# fop_lookup 2 +# fop_access 3 +# fop_read 3 +# fop_poll 11 +# fop_fsync 31 +# fop_putpage 32 +# fop_ioctl 115 +# fop_write 517 +# fop_rwlock 520 +# fop_rwunlock 520 +# fop_inactive 529 +# fop_getattr 1057 +# +# VOP Wall Time mSeconds +# fop_fid 0 +# fop_access 0 +# fop_read 0 +# fop_poll 0 +# fop_lookup 0 +# fop_create 0 +# fop_ioctl 0 +# fop_putpage 1 +# fop_rwunlock 1 +# fop_rwlock 1 +# fop_inactive 1 +# fop_getattr 2 +# fop_write 22 +# fop_fsync 504 +# +# COPYRIGHT: Copyright (c) 2006 Richard McDougall +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Shell Wrapper Concept by Brendan Gregg +# +# 08-Jan-2006 Richard McDougall Created this. +# 23-Apr-2006 Brendan Gregg Minor style tweaks. +# 23-Apr-2006 " " Last update. + + +############################## +# --- Process Arguments --- +# + +### default variables +opt_trace=0; opt_fs=0; opt_stats=1; opt_all=0 + +### process options +while getopts t name +do + case $name in + t) opt_trace=1 ;; + h|?) cat <<-END >&2 + USAGE: voptrace [-t] [/mountpoint] + voptrace # default output + -t # trace + eg, + voptrace -t # trace all file systems + voptrace -t /tmp # trace /tmp + voptrace /tmp # summary stats for /tmp + END + exit 1 + esac +done +shift `expr $OPTIND - 1` +filesys="$1" + +### option logic +if [ $opt_trace -eq 1 ]; then + opt_stats=0 +fi +if [ -z "$filesys" ]; then + opt_all=1 +fi + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_fs = '$opt_fs'; + inline int OPT_all = '$opt_all'; + inline int OPT_trace = '$opt_trace'; + inline int OPT_stats = '$opt_stats'; + inline string FILESYS = "'$filesys'"; + + #pragma D option quiet + + /* + * Print header + */ + dtrace:::BEGIN + { + last_event[""] = 0; + + /* print main headers */ + OPT_stats == 1 ? + printf("\033[H\033[2J") : 1; + + OPT_trace == 1 ? + printf("%2s %-15s %-10s %51s %2s %8s %8s\n", + "", "Event", "Device", "Path", "RW", "Size", "Offset") : 1; + self->path = ""; + self->trace = 0; + } + + dtrace:::BEGIN + /OPT_trace == 1/ + { + /* make D compiler happy */ + @vop_iocnt[""] = count(); + @vop_cnt[""] = count(); + @vop_time[""] = sum(0); + trunc(@vop_iocnt); + trunc(@vop_cnt); + trunc(@vop_time); + } + + fbt::fop_*:entry + { + self->trace = 0; + + /* Get vp: fop_open has a pointer to vp */ + this->vpp = (vnode_t **)arg0; + self->vp = (vnode_t *)arg0; + self->vp = probefunc == "fop_open" ? (vnode_t *)*this->vpp : self->vp; + + /* And the containing vfs */ + this->vfsp = self->vp ? self->vp->v_vfsp : 0; + + /* And the paths for the vp and containing vfs */ + this->vfsvp = this->vfsp ? + (struct vnode *)((vfs_t *)this->vfsp)->vfs_vnodecovered : 0; + self->vfspath = this->vfsvp ? stringof(this->vfsvp->v_path) : "unknown"; + + /* Check if we should trace the root fs */ + (OPT_all || + (FILESYS == "/" && this->vfsp && + (this->vfsp == `rootvfs))) ? self->trace = 1 : self->trace; + + /* Check if we should trace the fs */ + (OPT_all || (self->vfspath == FILESYS)) ? self->trace = 1 : self->trace; + + self->vfspath = 0; + } + + /* + * Trace the entry point to each fop + */ + fbt::fop_*:entry + /self->trace/ + { + self->path = (self->vp != NULL && self->vp->v_path) ? + stringof(self->vp->v_path) : "unknown"; + + /* Some fops has the len in arg2 */ + (probefunc == "fop_getpage" || + probefunc == "fop_putpage" || + probefunc == "fop_none") ? self->len = arg2 : 1; + + /* Some fops has the len in arg3 */ + (probefunc == "fop_pageio" || + probefunc == "fop_none") ? self->len = arg3 : 1; + + /* Some fops has the len in arg4 */ + (probefunc == "fop_addmap" || + probefunc == "fop_map" || + probefunc == "fop_delmap") ? self->len = arg4 : 1; + + /* Some fops has the offset in arg1 */ + (probefunc == "fop_addmap" || + probefunc == "fop_map" || + probefunc == "fop_getpage" || + probefunc == "fop_putpage" || + probefunc == "fop_seek" || + probefunc == "fop_delmap") ? self->off = arg1 : 1; + + /* Some fops has the offset in arg3 */ + (probefunc == "fop_close" || + probefunc == "fop_pageio") ? self->off = arg3 : 1; + + /* Some fops has the offset in arg4 */ + probefunc == "fop_frlock" ? self->off = arg4 : 1; + + /* Some fops has the pathname in arg1 */ + self->path = (probefunc == "fop_create" || + probefunc == "fop_mkdir" || + probefunc == "fop_rmdir" || + probefunc == "fop_remove" || + probefunc == "fop_lookup") ? + strjoin(self->path, strjoin("/", stringof(arg1))) : self->path; + + OPT_trace ? + printf("%2s %-15s %-10s %51s %2s %8d %8d\n", + "->", probefunc, "-", self->path, "-", + self->len, self->off) : 1; + + self->type = probefunc; + self->vop_entry[probefunc] = timestamp; + } + + fbt::fop_*:return + /self->trace == 1/ + { + OPT_trace ? + printf("%2s %-15s %-10s %51s %2s %8d %8d\n", + "<-", probefunc, "-", self->path, "-", + self->len, self->off) : 1; + + OPT_stats == 1 ? + @vop_time[probefunc] = + sum(timestamp - self->vop_entry[probefunc]) : 1; + OPT_stats == 1 ? + @vop_cnt[probefunc] = count() : 1; + + self->path = 0; + self->len = 0; + self->off = 0; + } + + fbt::fop_*:return + { + self->trace = 0; + self->type = 0; + self->vp = 0; + } + + /* Capture any I/O within this fop */ + io:::start + /self->trace/ + { + OPT_stats == 1 ? + @vop_iocnt[self->type] = count() : 1; + + OPT_trace == 1? + printf("%2s %-15s %-10s %51s %2s %8d %8u\n", + "--", self->type, args[1]->dev_statname, + self->path, args[0]->b_flags & B_READ ? "R" : "W", + args[0]->b_bcount, args[0]->b_blkno) : 1; + } + + profile:::tick-5s + /OPT_stats == 1/ + { + /* Print top 20 only */ + trunc(@vop_iocnt, 20); + trunc(@vop_time, 20); + + /* Display microseconds */ + normalize(@vop_time, 1000000); + printf("\033[H\033[2J"); + printf("%-60s %10s\n", "VOP Physical IO", "Count"); + printa("%-60s %10@d\n", @vop_iocnt); + printf("\n"); + printf("%-60s %10s\n", "VOP Count", "Count"); + printa("%-60s %10@d\n", @vop_cnt); + printf("\n"); + printf("%-60s %10s\n", "VOP Wall Time", "mSeconds"); + printa("%-60s %10@d\n", @vop_time); + + /* Clear data */ + trunc(@vop_iocnt); + trunc(@vop_cnt); + trunc(@vop_time); + } +' diff --git a/cddl/contrib/dtracetoolkit/Guide b/cddl/contrib/dtracetoolkit/Guide new file mode 100644 index 00000000000..739d3670b83 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Guide @@ -0,0 +1,91 @@ +Guide - Guide to the DTraceToolkit + + How to get started, and a table of contents. + +QuickStart + + 1. The top most useful scripts are in this directory. + 2. Try running them with "-h". Eg, "./execsnoop -h". + 3. Read Docs/Contents for a full list of scripts. + +QuickStart-by-Screenshot + + 1. Look through the examples in the Examples directory until + you see an output you like + 2. Find the script and run it + 3. Look for its man page in Man + +Not-so-QuickStart + + 1. Welcome! + 2. Check the Table of Contents below to become famaliar with the + directory structure of the DTraceToolkit. + 3. See Docs/Faq for any initial questions. + 4. Read Docs/Contents for a list of scripts. + 5. Read Docs/Readme to see where scripts are documented. + 6. Check Docs/Links for further DTrace. + 7. Once famaliar with the toolkit, the following may be useful to + add to your shell initialisation file, + PATH=$PATH:/opt/DTT/Bin + MANPATH=$MANPATH:/opt/DTT/Man + in this case assuming the toolkit was installed in /opt/DTT. + +Installation + + 1. Run ./install + This will replace any existing version of the DTraceToolkit + with this one. It will prompt. Final install location is + printed by this install script. + +Table of Contents + + DTraceToolkit-X.XX/ + Bin/ Symlinks to all the scripts + Apps/ Application specific scripts + Cpu/ Scripts for CPU analysis + Code/ Example code to practise on + Disk/ Scripts for disk I/O analysis + Docs/ Documentation + Contents Command list for the Toolkit + Faq Frequently asked questions + Links Further DTrace links + Readme Readme for using the docs + Examples/ Examples of command usage + Guide This file! + Include/ DTrace include files + Java/ Scripts for tracing Java + JavaScript/ Scripts for tracing JavaScript + Kernel/ Scripts for kernel analysis + License The CDDL license + Locks/ Scripts for lock analysis + Man/ Man pages + man1m/ Man pages for the Toolkit commands + Mem/ Scripts for memory analysis + Misc/ Misc scripts + Net/ Scripts for network analysis + Notes/ Notes on Toolkit commands + Perl/ Scripts for tracing Perl + Php/ Scripts for tracing Php + Proc/ Scripts for process analysis + Python/ Scripts for tracing Python + Ruby/ Scripts for tracing Ruby + Shell/ Scripts for tracing Shell languages + Snippits/ Snippits of D scripting + System/ Scripts for system analysis + Tcl/ Scripts for tracing Tcl + User/ Scripts for user based activity analysis + Zones/ Scripts for analysis by zone + Version DTraceToolkit version + install Install script, use for installs only + +When you type ls in the DTraceToolkit, you will be looking at the top ten +or so most useful scripts plus the top level directories. Other scripts have +been placed in meaningful subdirectories, such as Disk, Kernel, Proc, etc. + +An optional Bin directory has been provided that links to all the scripts. + +The DTraceToolkit is released under the CDDL license. It's the same open +source license that OpenSolaris has been released under. + +Thank you for using the DTraceToolkit! + diff --git a/cddl/contrib/dtracetoolkit/Include/Readme b/cddl/contrib/dtracetoolkit/Include/Readme new file mode 100644 index 00000000000..4aa46881e8f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Include/Readme @@ -0,0 +1,18 @@ +Include - include scripts for D scripting + + This directory contains files that can be included for use with D scripts. + + There are two types of include files, + + *.h + These can be included using, + + #!/usr/sbin/dtrace -Cs + #include + + *.d + These must be copyied to a translator directory (/usr/lib/dtrace), + and should be automatically pulled in. + + This directory does not contain runnable DTrace scripts. + diff --git a/cddl/contrib/dtracetoolkit/Include/test.ksh b/cddl/contrib/dtracetoolkit/Include/test.ksh new file mode 100755 index 00000000000..a3e1036a206 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Include/test.ksh @@ -0,0 +1,68 @@ +#!/usr/bin/ksh +/* + * test.ksh - DTrace include file test script. + * + * $Id: test.ksh 36 2007-09-15 06:51:18Z brendan $ + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 16-Sep-2007 Brendan Gregg Created this. + */ + +dtrace -CI . -s /dev/stdin << END + +#include "tostr.h" +#include "time.h" + +#pragma D option quiet +#pragma D option destructive + +dtrace:::BEGIN +{ + i = 1; + printf("\nNUM_TO_STR %12d = %s\n", i, NUM_TO_STR(i)); + i = 1100; + printf("NUM_TO_STR %12d = %s\n", i, NUM_TO_STR(i)); + i = 1100000; + printf("NUM_TO_STR %12d = %s\n", i, NUM_TO_STR(i)); + i = 999999999; + printf("NUM_TO_STR %12d = %s\n", i, NUM_TO_STR(i)); + + i = 1; + printf("\nBYTES_TO_STR %12d = %s\n", i, BYTES_TO_STR(i)); + i = 1024; + printf("BYTES_TO_STR %12d = %s\n", i, BYTES_TO_STR(i)); + i = 1000000; + printf("BYTES_TO_STR %12d = %s\n", i, BYTES_TO_STR(i)); + i = 999999999; + printf("BYTES_TO_STR %12d = %s\n", i, BYTES_TO_STR(i)); + + i = 1; + printf("\nUS_TO_STR %12d = %s\n", i, US_TO_STR(i)); + i = 1100; + printf("US_TO_STR %12d = %s\n", i, US_TO_STR(i)); + i = 999999; + printf("US_TO_STR %12d = %s\n", i, US_TO_STR(i)); + + printf("\nwalltimestamp : %Y\n", walltimestamp); + printf("TZ=GMT date : "); + system("TZ=GMT date '+%%H:%%M:%%S'"); + printf("TIME_HHMMSS : %s\n", TIME_HHMMSS); + + exit(0); +} +END diff --git a/cddl/contrib/dtracetoolkit/Include/time.h b/cddl/contrib/dtracetoolkit/Include/time.h new file mode 100644 index 00000000000..76caa2e9782 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Include/time.h @@ -0,0 +1,38 @@ +/* + * time.h - DTrace Time include file. + * + * $Id: time.h 36 2007-09-15 06:51:18Z brendan $ + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 16-Sep-2007 Brendan Gregg Created this. + */ + +/* + * TIME_HHMMSS - Returns GMT time as a "HH:MM:SS" string. + * + * eg, "21:53:07" + */ +#define TIME_HHMMSS \ + strjoin(strjoin(strjoin(strjoin(strjoin( \ + (((walltimestamp / 1000000000) % 86400) / 3600) < 10 ? "0" : "",\ + lltostr(((walltimestamp / 1000000000) % 86400) / 3600)), ":"), \ + strjoin((((walltimestamp / 1000000000) % 3600) / 60) < 10 ? \ + "0" : "", lltostr(((walltimestamp / 1000000000) % 3600) / 60))),\ + ":"), strjoin(((walltimestamp / 1000000000) % 60) < 10 ? \ + "0" : "", lltostr((walltimestamp / 1000000000) % 60))) + diff --git a/cddl/contrib/dtracetoolkit/Include/tostr.h b/cddl/contrib/dtracetoolkit/Include/tostr.h new file mode 100644 index 00000000000..6032f6afb32 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Include/tostr.h @@ -0,0 +1,89 @@ +/* + * tostr.h - DTrace To-String include file. + * + * $Id: tostr.h 36 2007-09-15 06:51:18Z brendan $ + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 16-Sep-2007 Brendan Gregg Created this. + */ + +/* + * NUM_TO_STR(n) - takes a number and returns a string with a prefix, + * intended to fit withen 6 chars. + * + * Input Output + * 0 0 + * 1 1 + * 10 10 + * 999 999 + * 1000 1.0K + * 1100 1.1K + * 10000 10.0K + * 999999 999.0K + * 1000000 1.0M + * 10000000 10.0M + * 999999999 999.9M + */ +#define NUM_TO_STR(n) \ + n >= 1000000 ? \ + strjoin(strjoin(strjoin(lltostr(n / 1000000), "."), \ + lltostr((n % 1000000) / 100000)), "M") : n >= 1000 ? \ + strjoin(strjoin(strjoin(lltostr(n / 1000), "."), \ + lltostr((n % 1000) / 100)), "K") : lltostr(n) + +/* + * BYTES_TO_STR(n) - takes a byte count and returns a string with a prefix, + * intended to fit withen 6 chars. + * + * Input Output + * 0 0 + * 1 1 + * 10 10 + * 999 0.9K + * 1000 0.9K + * 1024 1.0K + * 10240 10.0K + * 1000000 976.5K + * 1048576 1.0M + * 1000000000 953.6M + */ +#define BYTES_TO_STR(n) \ + n >= 1024000 ? \ + strjoin(strjoin(strjoin(lltostr(n / 1048576), "."), \ + lltostr((n % 1048576) / 104858)), "M") : n >= 1000 ? \ + strjoin(strjoin(strjoin(lltostr(n / 1024), "."), \ + lltostr((n % 1024) / 103)), "K") : lltostr(n) + +/* + * US_TO_STR(n) - takes microseconds and returns a string with a prefix, + * intended to fit withen 6 chars. + * + * Input Output + * 0 0 + * 1 1u + * 10 10u + * 999 999u + * 1000 1.0m + * 1100 1.1m + * 10000 10.0m + * 999999 999.0m + */ +#define US_TO_STR(n) \ + n == 0 ? "0" : n >= 1000 ? \ + strjoin(lltostr(n / 1000), "m") : strjoin(lltostr(n), "u") + diff --git a/cddl/contrib/dtracetoolkit/Java/Readme b/cddl/contrib/dtracetoolkit/Java/Readme new file mode 100644 index 00000000000..ae455a524d1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/Readme @@ -0,0 +1,17 @@ +Java - DTracing Java + + These scripts trace the JVM, and require the Java hotspot provider which + was shipped with Java starting with version 1.6.0. + + Some of these scripts measure method and object events, and require + the Java process to be run using the "+ExtendedDTraceProbes" flag. + For example, + + java -XX:+ExtendedDTraceProbes classfile + + The ExtendedDTraceProbes flag is not on by default to avoid the additional + overhead for maintaining these additional probes. When this flag is + enabled, the JVM may execute slightly slower than before; when the probes + are also enabled (especially method probes), the JVM may execute + significantly slower. + diff --git a/cddl/contrib/dtracetoolkit/Java/j_calldist.d b/cddl/contrib/dtracetoolkit/Java/j_calldist.d new file mode 100755 index 00000000000..f0cb087fc6a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_calldist.d @@ -0,0 +1,116 @@ +#!/usr/sbin/dtrace -CZs +/* + * j_calldist.d - measure Java elapsed times for different types of operation. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_calldist.d 59 2007-10-03 08:21:58Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0). Method calls are only visible when using the + * flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_calldist.d [top] # hit Ctrl-C to end + * + * The "top" optional argument will truncate the output for each report + * section to that many lines, with a default of 10. + * + * FIELDS: + * 1 Process ID + * 2 Type of call (method/gc) + * 3 Name of call + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#define TOP 10 /* default output truncation */ +#define B_FALSE 0 + +#pragma D option quiet +#pragma D option defaultargs + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); + top = $1 != 0 ? $1 : TOP; +} + +hotspot*:::method-entry +{ + self->depth[arg0]++; + self->exclude[arg0, self->depth[arg0]] = 0; + self->method[arg0, self->depth[arg0]] = timestamp; +} + +hotspot*:::method-return +/self->method[arg0, self->depth[arg0]]/ +{ + this->elapsed_incl = timestamp - self->method[arg0, self->depth[arg0]]; + this->elapsed_excl = this->elapsed_incl - + self->exclude[arg0, self->depth[arg0]]; + self->method[arg0, self->depth[arg0]] = 0; + self->exclude[arg0, self->depth[arg0]] = 0; + + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + this->name = strjoin(strjoin(stringof(this->class), "."), + stringof(this->method)); + + @types_incl[pid, "method", this->name] = + quantize(this->elapsed_incl / 1000); + @types_excl[pid, "method", this->name] = + quantize(this->elapsed_excl / 1000); + + self->depth[arg0]--; + self->exclude[arg0, self->depth[arg0]] += this->elapsed_incl; +} + +hotspot*:::gc-begin +{ + self->gc = timestamp; + self->full = (boolean_t)arg0; +} + +hotspot*:::gc-end +/self->gc/ +{ + this->elapsed = timestamp - self->gc; + + @types[pid, "gc", self->full == B_FALSE ? "GC" : "Full GC"] = + quantize(this->elapsed / 1000); + + self->gc = 0; + self->full = 0; +} + +dtrace:::END +{ + trunc(@types, top); + printf("\nTop %d elapsed times (us),\n", top); + printa(" PID=%d, %s, %s %@d\n", @types); + + trunc(@types_excl, top); + printf("\nTop %d exclusive method elapsed times (us),\n", top); + printa(" PID=%d, %s, %s %@d\n", @types_excl); + + trunc(@types_incl, top); + printf("\nTop %d inclusive method elapsed times (us),\n", top); + printa(" PID=%d, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_calls.d b/cddl/contrib/dtracetoolkit/Java/j_calls.d new file mode 100755 index 00000000000..087545d3ff3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_calls.d @@ -0,0 +1,113 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_calls.d - count Java calls (method/...) using DTrace. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_calls.d 19 2007-09-12 07:47:59Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0). Method calls and object allocation are only + * visible when using the flag "+ExtendedDTraceProbes". eg, + * java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_calls.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * TYPE Type of call (see below) + * NAME Name of call + * COUNT Number of calls during sample + * + * TYPEs: + * cload class load + * method method call + * mcompile method compile + * mload compiled method load + * oalloc object alloc + * thread thread start + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +hotspot*:::method-entry +{ + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + this->name = strjoin(strjoin(stringof(this->class), "."), + stringof(this->method)); + @calls[pid, "method", this->name] = count(); +} + +hotspot*:::object-alloc +{ + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + @calls[pid, "oalloc", stringof(this->class)] = count(); +} + +hotspot*:::class-loaded +{ + this->class = (char *)copyin(arg0, arg1 + 1); + this->class[arg1] = '\0'; + @calls[pid, "cload", stringof(this->class)] = count(); +} + +hotspot*:::thread-start +{ + this->thread = (char *)copyin(arg0, arg1 + 1); + this->thread[arg1] = '\0'; + @calls[pid, "thread", stringof(this->thread)] = count(); +} + +hotspot*:::method-compile-begin +{ + this->class = (char *)copyin(arg0, arg1 + 1); + this->class[arg1] = '\0'; + this->method = (char *)copyin(arg2, arg3 + 1); + this->method[arg3] = '\0'; + this->name = strjoin(strjoin(stringof(this->class), "."), + stringof(this->method)); + @calls[pid, "mcompile", this->name] = count(); +} + +hotspot*:::compiled-method-load +{ + this->class = (char *)copyin(arg0, arg1 + 1); + this->class[arg1] = '\0'; + this->method = (char *)copyin(arg2, arg3 + 1); + this->method[arg3] = '\0'; + this->name = strjoin(strjoin(stringof(this->class), "."), + stringof(this->method)); + @calls[pid, "mload", this->name] = count(); +} + +dtrace:::END +{ + printf(" %6s %-8s %-52s %8s\n", "PID", "TYPE", "NAME", "COUNT"); + printa(" %6d %-8s %-52s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_calltime.d b/cddl/contrib/dtracetoolkit/Java/j_calltime.d new file mode 100755 index 00000000000..be4da519180 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_calltime.d @@ -0,0 +1,129 @@ +#!/usr/sbin/dtrace -CZs +/* + * j_calltime.d - measure Java elapsed times for different types of operation. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_calltime.d 59 2007-10-03 08:21:58Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0). Method calls are only visible when using the + * flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_calltime.d [top] # hit Ctrl-C to end + * + * The "top" optional argument will truncate the output for each report + * section to that many lines, with a default of 10. + * + * FIELDS: + * PID Process ID + * TYPE Type of call (method/gc/total) + * NAME Name of call + * TOTAL Total elapsed time for calls (us) + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#define TOP 10 /* default output truncation */ +#define B_FALSE 0 + +#pragma D option quiet +#pragma D option defaultargs + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); + top = $1 != 0 ? $1 : TOP; +} + +hotspot*:::method-entry +{ + self->depth[arg0]++; + self->exclude[arg0, self->depth[arg0]] = 0; + self->method[arg0, self->depth[arg0]] = timestamp; +} + +hotspot*:::method-return +/self->method[arg0, self->depth[arg0]]/ +{ + this->elapsed_incl = timestamp - self->method[arg0, self->depth[arg0]]; + this->elapsed_excl = this->elapsed_incl - + self->exclude[arg0, self->depth[arg0]]; + self->method[arg0, self->depth[arg0]] = 0; + self->exclude[arg0, self->depth[arg0]] = 0; + + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + this->name = strjoin(strjoin(stringof(this->class), "."), + stringof(this->method)); + + @num[pid, "method", this->name] = count(); + @num[0, "total", "-"] = count(); + @types_incl[pid, "method", this->name] = sum(this->elapsed_incl); + @types_excl[pid, "method", this->name] = sum(this->elapsed_excl); + @types_excl[0, "total", "-"] = sum(this->elapsed_excl); + + self->depth[arg0]--; + self->exclude[arg0, self->depth[arg0]] += this->elapsed_incl; +} + +hotspot*:::gc-begin +{ + self->gc = timestamp; + self->full = (boolean_t)arg0; +} + +hotspot*:::gc-end +/self->gc/ +{ + this->elapsed = timestamp - self->gc; + self->gc = 0; + + @num[pid, "gc", self->full == B_FALSE ? "GC" : "Full GC"] = count(); + @types[pid, "gc", self->full == B_FALSE ? "GC" : "Full GC"] = + sum(this->elapsed); + self->full = 0; +} + +dtrace:::END +{ + trunc(@num, top); + printf("\nTop %d counts,\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "COUNT"); + printa(" %6d %-10s %-48s %@8d\n", @num); + + trunc(@types, top); + normalize(@types, 1000); + printf("\nTop %d elapsed times (us),\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL"); + printa(" %6d %-10s %-48s %@8d\n", @types); + + trunc(@types_excl, top); + normalize(@types_excl, 1000); + printf("\nTop %d exclusive method elapsed times (us),\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL"); + printa(" %6d %-10s %-48s %@8d\n", @types_excl); + + trunc(@types_incl, top); + normalize(@types_incl, 1000); + printf("\nTop %d inclusive method elapsed times (us),\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL"); + printa(" %6d %-10s %-48s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_classflow.d b/cddl/contrib/dtracetoolkit/Java/j_classflow.d new file mode 100755 index 00000000000..162338ad218 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_classflow.d @@ -0,0 +1,100 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_classflow.d - trace a Java class method flow using DTrace. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_classflow.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg, + * java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_classflow.d classname # hit Ctrl-C to end + * + * This watches Java method entries and returns, and indents child + * method calls. + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * PID Process ID + * CLASS.METHOD Java class and method name + * + * LEGEND: + * -> method entry + * <- method return + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * Changes in TID will appear to shuffle output, as we change from one thread + * depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +/* increasing bufsize can reduce drops */ +#pragma D option bufsize=16m +#pragma D option quiet +#pragma D option defaultargs +#pragma D option switchrate=10 + +self int depth[int]; + +dtrace:::BEGIN +/$$1 == ""/ +{ + printf("USAGE: j_classflow.d classname\n"); + exit(1); +} + +dtrace:::BEGIN +{ + printf("%3s %6s %-16s -- %s\n", "C", "PID", "TIME(us)", "CLASS.METHOD"); +} + +hotspot*:::method-entry, +hotspot*:::method-return +{ + this->class = stringof((char *)copyin(arg1, arg2 + 1)); + this->class[arg2] = '\0'; +} + +hotspot*:::method-entry +/this->class == $$1/ +{ + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + + printf("%3d %6d %-16d %*s-> %s.%s\n", cpu, pid, timestamp / 1000, + self->depth[arg0] * 2, "", stringof(this->class), + stringof(this->method)); + self->depth[arg0]++; +} + +hotspot*:::method-return +/this->class == $$1/ +{ + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + + self->depth[arg0] -= self->depth[arg0] > 0 ? 1 : 0; + printf("%3d %6d %-16d %*s<- %s.%s\n", cpu, pid, timestamp / 1000, + self->depth[arg0] * 2, "", stringof(this->class), + stringof(this->method)); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_cpudist.d b/cddl/contrib/dtracetoolkit/Java/j_cpudist.d new file mode 100755 index 00000000000..9a4626e4c62 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_cpudist.d @@ -0,0 +1,116 @@ +#!/usr/sbin/dtrace -CZs +/* + * j_cpudist.d - measure Java on-CPU times for different types of operation. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_cpudist.d 59 2007-10-03 08:21:58Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0). Method calls are only visible when using the + * flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_cpudist.d [top] # hit Ctrl-C to end + * + * The "top" optional argument will truncate the output for each report + * section to that many lines, with a default of 10. + * + * FIELDS: + * 1 Process ID + * 2 Type of call (method/gc) + * 3 Name of call + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#define TOP 10 /* default output truncation */ +#define B_FALSE 0 + +#pragma D option quiet +#pragma D option defaultargs + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); + top = $1 != 0 ? $1 : TOP; +} + +hotspot*:::method-entry +{ + self->depth[arg0]++; + self->exclude[arg0, self->depth[arg0]] = 0; + self->method[arg0, self->depth[arg0]] = vtimestamp; +} + +hotspot*:::method-return +/self->method[arg0, self->depth[arg0]]/ +{ + this->oncpu_incl = vtimestamp - self->method[arg0, self->depth[arg0]]; + this->oncpu_excl = this->oncpu_incl - + self->exclude[arg0, self->depth[arg0]]; + self->method[arg0, self->depth[arg0]] = 0; + self->exclude[arg0, self->depth[arg0]] = 0; + + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + this->name = strjoin(strjoin(stringof(this->class), "."), + stringof(this->method)); + + @types_incl[pid, "method", this->name] = + quantize(this->oncpu_incl / 1000); + @types_excl[pid, "method", this->name] = + quantize(this->oncpu_excl / 1000); + + self->depth[arg0]--; + self->exclude[arg0, self->depth[arg0]] += this->oncpu_incl; +} + +hotspot*:::gc-begin +{ + self->gc = vtimestamp; + self->full = (boolean_t)arg0; +} + +hotspot*:::gc-end +/self->gc/ +{ + this->oncpu = vtimestamp - self->gc; + + @types[pid, "gc", self->full == B_FALSE ? "GC" : "Full GC"] = + quantize(this->oncpu / 1000); + + self->gc = 0; + self->full = 0; +} + +dtrace:::END +{ + trunc(@types, top); + printf("\nTop %d on-CPU times (us),\n", top); + printa(" PID=%d, %s, %s %@d\n", @types); + + trunc(@types_excl, top); + printf("\nTop %d exclusive method on-CPU times (us),\n", top); + printa(" PID=%d, %s, %s %@d\n", @types_excl); + + trunc(@types_incl, top); + printf("\nTop %d inclusive method on-CPU times (us),\n", top); + printa(" PID=%d, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_cputime.d b/cddl/contrib/dtracetoolkit/Java/j_cputime.d new file mode 100755 index 00000000000..a720cdb439a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_cputime.d @@ -0,0 +1,129 @@ +#!/usr/sbin/dtrace -CZs +/* + * j_cputime.d - measure Java on-CPU times for different types of operation. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_cputime.d 59 2007-10-03 08:21:58Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0). Method calls are only visible when using the + * flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_cputime.d [top] # hit Ctrl-C to end + * + * The "top" optional argument will truncate the output for each report + * section to that many lines, with a default of 10. + * + * FIELDS: + * PID Process ID + * TYPE Type of call (method/gc/total) + * NAME Name of call + * TOTAL Total on-CPU time for calls (us) + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#define TOP 10 /* default output truncation */ +#define B_FALSE 0 + +#pragma D option quiet +#pragma D option defaultargs + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); + top = $1 != 0 ? $1 : TOP; +} + +hotspot*:::method-entry +{ + self->depth[arg0]++; + self->exclude[arg0, self->depth[arg0]] = 0; + self->method[arg0, self->depth[arg0]] = vtimestamp; +} + +hotspot*:::method-return +/self->method[arg0, self->depth[arg0]]/ +{ + this->oncpu_incl = vtimestamp - self->method[arg0, self->depth[arg0]]; + this->oncpu_excl = this->oncpu_incl - + self->exclude[arg0, self->depth[arg0]]; + self->method[arg0, self->depth[arg0]] = 0; + self->exclude[arg0, self->depth[arg0]] = 0; + + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + this->name = strjoin(strjoin(stringof(this->class), "."), + stringof(this->method)); + + @num[pid, "method", this->name] = count(); + @num[0, "total", "-"] = count(); + @types_incl[pid, "method", this->name] = sum(this->oncpu_incl); + @types_excl[pid, "method", this->name] = sum(this->oncpu_excl); + @types_excl[0, "total", "-"] = sum(this->oncpu_excl); + + self->depth[arg0]--; + self->exclude[arg0, self->depth[arg0]] += this->oncpu_incl; +} + +hotspot*:::gc-begin +{ + self->gc = vtimestamp; + self->full = (boolean_t)arg0; +} + +hotspot*:::gc-end +/self->gc/ +{ + this->oncpu = vtimestamp - self->gc; + self->gc = 0; + + @num[pid, "gc", self->full == B_FALSE ? "GC" : "Full GC"] = count(); + @types[pid, "gc", self->full == B_FALSE ? "GC" : "Full GC"] = + sum(this->oncpu); + self->full = 0; +} + +dtrace:::END +{ + trunc(@num, top); + printf("\nTop %d counts,\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "COUNT"); + printa(" %6d %-10s %-48s %@8d\n", @num); + + trunc(@types, top); + normalize(@types, 1000); + printf("\nTop %d on-CPU times (us),\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL"); + printa(" %6d %-10s %-48s %@8d\n", @types); + + trunc(@types_excl, top); + normalize(@types_excl, 1000); + printf("\nTop %d exclusive method on-CPU times (us),\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL"); + printa(" %6d %-10s %-48s %@8d\n", @types_excl); + + trunc(@types_incl, top); + normalize(@types_incl, 1000); + printf("\nTop %d inclusive method on-CPU times (us),\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL"); + printa(" %6d %-10s %-48s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_events.d b/cddl/contrib/dtracetoolkit/Java/j_events.d new file mode 100755 index 00000000000..d8c938b2c13 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_events.d @@ -0,0 +1,56 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_events.d - count Java events using DTrace. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_events.d 19 2007-09-12 07:47:59Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0). Some events such as method calls are only + * visible when using the flag "+ExtendedDTraceProbes". eg, + * java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_events.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * EVENT Event name (DTrace probe name) + * COUNT Number of calls during sample + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +/* this matches both hotspot and hotspot_jni providers */ +hotspot*::: +{ + @calls[pid, probename] = count(); +} + +dtrace:::END +{ + printf(" %6s %-36s %8s\n", "PID", "EVENT", "COUNT"); + printa(" %6d %-36s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_flow.d b/cddl/contrib/dtracetoolkit/Java/j_flow.d new file mode 100755 index 00000000000..e98c06784a4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_flow.d @@ -0,0 +1,87 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_flow.d - snoop Java execution showing method flow using DTrace. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_flow.d 38 2007-09-16 08:17:41Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg, + * java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_flow.d # hit Ctrl-C to end + * + * This watches Java method entries and returns, and indents child + * method calls. + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * PID Process ID + * CLASS.METHOD Java class and method name + * + * LEGEND: + * -> method entry + * <- method return + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * Changes in TID will appear to shuffle output, as we change from one thread + * depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +/* increasing bufsize can reduce drops */ +#pragma D option bufsize=16m +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth[int]; + +dtrace:::BEGIN +{ + printf("%3s %6s %-16s -- %s\n", "C", "PID", "TIME(us)", "CLASS.METHOD"); +} + +hotspot*:::method-entry +{ + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + + printf("%3d %6d %-16d %*s-> %s.%s\n", cpu, pid, timestamp / 1000, + self->depth[arg0] * 2, "", stringof(this->class), + stringof(this->method)); + self->depth[arg0]++; +} + +hotspot*:::method-return +{ + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + + self->depth[arg0] -= self->depth[arg0] > 0 ? 1 : 0; + printf("%3d %6d %-16d %*s<- %s.%s\n", cpu, pid, timestamp / 1000, + self->depth[arg0] * 2, "", stringof(this->class), + stringof(this->method)); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_flowtime.d b/cddl/contrib/dtracetoolkit/Java/j_flowtime.d new file mode 100755 index 00000000000..53e75cdf9cc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_flowtime.d @@ -0,0 +1,101 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_flowtime.d - snoop Java execution with method flow and delta times. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_flowtime.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg, + * java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_flowtime.d # hit Ctrl-C to end + * + * This watches Java method entries and returns, and indents child + * method calls. + * + * FIELDS: + * C CPU-id + * PID Process ID + * TID Thread ID + * TIME(us) Time since boot (us) + * DELTA(us) Elapsed time from previous line to this line + * CLASS.METHOD Java class and method name + * + * LEGEND: + * -> method entry + * <- method return + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * Changes in TID will appear to shuffle output, as we change from one thread + * depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +/* increasing bufsize can reduce drops */ +#pragma D option bufsize=16m +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth[int]; + +dtrace:::BEGIN +{ + printf("%3s %6s/%-5s %-16s %9s -- %s\n", "C", "PID", "TID", "TIME(us)", + "DELTA(us)", "CLASS.METHOD"); +} + +hotspot*:::method-entry, +hotspot*:::method-return +/self->last == 0/ +{ + self->last = timestamp; +} + +hotspot*:::method-entry +{ + this->delta = (timestamp - self->last) / 1000; + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + + printf("%3d %6d/%-5d %-16d %9d %*s-> %s.%s\n", cpu, pid, tid, + timestamp / 1000, this->delta, self->depth[arg0] * 2, "", + stringof(this->class), stringof(this->method)); + self->depth[arg0]++; + self->last = timestamp; +} + +hotspot*:::method-return +{ + this->delta = (timestamp - self->last) / 1000; + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + + self->depth[arg0] -= self->depth[arg0] > 0 ? 1 : 0; + printf("%3d %6d/%-5d %-16d %9d %*s<- %s.%s\n", cpu, pid, tid, + timestamp / 1000, this->delta, self->depth[arg0] * 2, "", + stringof(this->class), stringof(this->method)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_methodcalls.d b/cddl/contrib/dtracetoolkit/Java/j_methodcalls.d new file mode 100755 index 00000000000..606b8200c3c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_methodcalls.d @@ -0,0 +1,60 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_methodcalls.d - count Java method calls DTrace. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_methodcalls.d 19 2007-09-12 07:47:59Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg, + * java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_methodcalls.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * COUNT Number of calls during sample + * CLASS.METHOD Java class and method name + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +hotspot*:::method-entry +{ + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + this->name = strjoin(strjoin(stringof(this->class), "."), + stringof(this->method)); + @calls[pid, this->name] = count(); +} + +dtrace:::END +{ + printf(" %6s %8s %s\n", "PID", "COUNT", "CLASS.METHOD"); + printa(" %6d %@8d %s\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_objnew.d b/cddl/contrib/dtracetoolkit/Java/j_objnew.d new file mode 100755 index 00000000000..88470054c6a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_objnew.d @@ -0,0 +1,61 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_objnew.d - report Java object allocation using DTrace. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_objnew.d 19 2007-09-12 07:47:59Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg, + * java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_objnew.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * OBJS Number of objects created + * CLASS.METHOD Java class and method name + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +hotspot*:::object-alloc +{ + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + @objs[pid, stringof(this->class)] = count(); + @dist[pid, stringof(this->class)] = quantize(arg3); +} + +dtrace:::END +{ + printf("Java object allocation byte distributions by pid and class,\n"); + printa(@dist); + + printf("Java object allocation count by pid and class,\n\n"); + printf(" %6s %8s %s\n", "PID", "OBJS", "CLASS"); + printa(" %6d %8@d %s\n", @objs); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_package.d b/cddl/contrib/dtracetoolkit/Java/j_package.d new file mode 100755 index 00000000000..cfeaf050bd4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_package.d @@ -0,0 +1,56 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_package.d - count Java class loads by package using DTrace. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_package.d 19 2007-09-12 07:47:59Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0). + * + * USAGE: j_package.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * LOADS Class loads during trace + * PACKAGE Package name from class + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +hotspot*:::class-loaded +{ + this->class = (char *)copyin(arg0, arg1 + 1); + this->class[arg1] = '\0'; + + @loads[pid, dirname(stringof(this->class))] = count(); +} + +dtrace:::END +{ + printf(" %6s %8s %s\n", "PID", "LOADS", "PACKAGE"); + printa(" %6d %@8d %s\n", @loads); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_profile.d b/cddl/contrib/dtracetoolkit/Java/j_profile.d new file mode 100755 index 00000000000..4ff009e9106 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_profile.d @@ -0,0 +1,78 @@ +#!/usr/sbin/dtrace -CZs +/* + * j_profile.d - sample stack traces with Java translations using DTrace. + * + * USAGE: j_profile.d { -p PID | -c cmd } # hit Ctrl-C to end + * $Id: j_profile.d 19 2007-09-12 07:47:59Z brendan $ + * + * + * This samples stack traces for the process specified. This stack trace + * will cross the JVM and system libraries, and insert translations for Java + * stack frames where appropriate. This is best explained with an example + * stack frame output, + * + * Func_loop.func_c()V + * Func_loop.func_b()V + * Func_loop.func_a()V + * Func_loop.main([Ljava/lang/String;)V + * StubRoutines (1) + * libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHan + * libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmetho + * libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJ + * libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_j + * libjvm.so`jni_CallStaticVoidMethod+0x15d + * java`JavaMain+0xd30 + * libc.so.1`_thr_setup+0x52 + * libc.so.1`_lwp_start + * 101 + * + * The lines at the top are Java frames, followed by the JVM (libjvm.so). + * The JVM symbols may be translated by passing the output through c++filt. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option jstackstrsize=1024 + +/* + * Tunables + */ +#define DEPTH 10 /* stack depth, frames */ +#define RATE 101 /* sampling rate, Hertz */ +#define TOP 25 /* number of stacks to output */ + +dtrace:::BEGIN +{ + printf("Sampling %d-level stacks at %d Hertz... Hit Ctrl-C to end.\n", + DEPTH, RATE); +} + +profile-RATE +/pid == $target/ +{ + @stacks[jstack(DEPTH)] = count(); +} + +dtrace:::END +{ + trunc(@stacks, TOP); + printf("Top %d most frequently sampled stacks,\n", TOP); + printa(@stacks); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_stat.d b/cddl/contrib/dtracetoolkit/Java/j_stat.d new file mode 100755 index 00000000000..862fe31f46d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_stat.d @@ -0,0 +1,148 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_stat.d - Java operation stats using DTrace. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_stat.d 64 2007-10-04 08:35:29Z claire $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0). Method calls and object allocation are only + * visible when using the flag "+ExtendedDTraceProbes". eg, + * java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_stat.d [interval [count]] + * + * FIELDS: + * EXEC/s Java programs executed per second, including + * those without Java provider support + * THREAD/s Threads created, per second + * METHOD/s Methods called, per second + * OBJNEW/s Objects created, per second + * CLOAD/s Class loads, per second + * EXCP/s Exceptions raised, per second + * GC/s Garbage collects, per second + * + * The numbers are per second counts for the interval specified. The default + * interval is 1 second. + * + * If you see a count in "EXECS" but not in the other columns, then your + * Java software is probably not running with the DTrace hotspot provider. + * + * If you see counts in "CLOAD" but not in "METHODS", then you Java + * software probably isn't running with "+ExtendedDTraceProbes". + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option defaultargs + +inline int SCREEN = 21; + +dtrace:::BEGIN +{ + execs = threads = methods = objnew = cload = gc = exception = 0; + lines = SCREEN + 1; + interval = $1 ? $1 : 1; + counts = $2 ? $2 : -1; + secs = interval; + first = 1; +} + +profile:::tick-1sec +{ + secs--; +} + +/* + * Print Header + */ +dtrace:::BEGIN, +profile:::tick-1sec +/first || (secs == 0 && lines > SCREEN)/ +{ + printf("%-20s %6s %8s %8s %8s %8s %6s %6s\n", "TIME", "EXEC/s", + "THREAD/s", "METHOD/s", "OBJNEW/s", "CLOAD/s", "EXCP/s", "GC/s"); + lines = 0; + first = 0; +} + +/* + * Tally Data + */ +proc:::exec-success +/execname == "java"/ +{ + execs++; +} + +hotspot*:::thread-start +{ + threads++; +} + +hotspot*:::method-entry +{ + methods++; +} + +hotspot*:::object-alloc +{ + oalloc++; +} + +hotspot*:::class-loaded +{ + cload++; +} + +hotspot*:::gc-begin +{ + gc++; +} + +hotspot*:::ExceptionOccurred-entry +{ + exception++; +} + +/* + * Print Output + */ +profile:::tick-1sec +/secs == 0/ +{ + printf("%-20Y %6d %8d %8d %8d %8d %6d %6d\n", walltimestamp, + execs / interval, threads / interval, methods / interval, + oalloc / interval, cload / interval, exception / interval, + gc / interval); + execs = threads = methods = oalloc = cload = gc = exception = 0; + secs = interval; + lines++; + counts--; +} + +/* + * End + */ +profile:::tick-1sec +/counts == 0/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_syscalls.d b/cddl/contrib/dtracetoolkit/Java/j_syscalls.d new file mode 100755 index 00000000000..4a24dea75ae --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_syscalls.d @@ -0,0 +1,68 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_syscalls.d - count Java methods and syscalls using DTrace. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_syscalls.d 19 2007-09-12 07:47:59Z brendan $ + * + * This traces Java methods if the hotspot provider exists (1.6.0) and + * the flag "+ExtendedDTraceProbes" is used. eg, + * java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_syscalls.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * TYPE Type of call (method/syscall) + * NAME Name of call + * COUNT Number of calls during sample + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +hotspot$target:::method-entry +{ + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + this->name = strjoin(strjoin(stringof(this->class), "."), + stringof(this->method)); + @calls[pid, "method", this->name] = count(); +} + +syscall:::entry +/pid == $target/ +{ + @calls[pid, "syscall", probefunc] = count(); +} + + +dtrace:::END +{ + printf(" %6s %-8s %-52s %8s\n", "PID", "TYPE", "NAME", "COUNT"); + printa(" %6d %-8s %-52s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_syscolors.d b/cddl/contrib/dtracetoolkit/Java/j_syscolors.d new file mode 100755 index 00000000000..691ae7eda5e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_syscolors.d @@ -0,0 +1,135 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_syscolors.d - trace Java method flow plus syscalls, in color. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_syscolors.d 58 2007-10-01 13:36:29Z brendan $ + * + * This traces Java methods if the hotspot provider exists (1.6.0) and + * the flag "+ExtendedDTraceProbes" is used. eg, + * java -XX:+ExtendedDTraceProbes classfile + * + * USAGE: j_syscolors.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * This watches Java method entries and returns, and indents child + * method calls. + * + * FIELDS: + * C CPU-id + * PID Process ID + * TID Thread ID + * DELTA(us) Elapsed time from previous line to this line + * TYPE Type of call (func/syscall) + * NAME Java method or syscall name + * + * If the flow appears to jump, check the TID column - the JVM may have + * switched to another thread. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * Changes in TID will appear to shuffle output, as we change from one thread + * depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +/* increasing bufsize can reduce drops */ +#pragma D option bufsize=32m +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth[int]; + +dtrace:::BEGIN +{ + color_java = "\033[2;35m"; /* violet, faint */ + color_line = "\033[1;35m"; /* violet, bold */ + color_syscall = "\033[2;32m"; /* green, faint */ + color_off = "\033[0m"; /* default */ + + printf("%3s %6s/%-5s %9s %-8s -- %s\n", "C", "PID", "TID", "DELTA(us)", + "TYPE", "NAME"); +} + +hotspot$target:::method-entry, +hotspot$target:::method-return, +syscall:::entry, +syscall:::return +/self->last == 0 && pid == $target/ +{ + self->last = timestamp; +} + +hotspot$target:::method-entry +{ + this->delta = (timestamp - self->last) / 1000; + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + + printf("%s%3d %6d/%-5d %9d %-8s %*s-> %s.%s%s\n", color_java, cpu, + pid, tid, this->delta, "method", self->depth[arg0] * 2, "", + stringof(this->class), stringof(this->method), color_off); + self->depth[arg0]++; + self->depthlast = self->depth[arg0]; + self->last = timestamp; +} + +hotspot$target:::method-return +{ + this->delta = (timestamp - self->last) / 1000; + this->class = (char *)copyin(arg1, arg2 + 1); + this->class[arg2] = '\0'; + this->method = (char *)copyin(arg3, arg4 + 1); + this->method[arg4] = '\0'; + + self->depth[arg0] -= self->depth[arg0] > 0 ? 1 : 0; + printf("%s%3d %6d/%-5d %9d %-8s %*s<- %s.%s%s\n", color_java, cpu, + pid, tid, this->delta, "method", self->depth[arg0] * 2, "", + stringof(this->class), stringof(this->method), color_off); + self->depthlast = self->depth[arg0]; + self->last = timestamp; +} + +syscall:::entry +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%3d %6d/%-5d %9d %-8s %*s-> %s%s\n", color_syscall, + cpu, pid, tid, this->delta, "syscall", self->depthlast * 2, "", + probefunc, color_off); + self->last = timestamp; +} + +syscall:::return +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%3d %6d/%-5d %9d %-8s %*s<- %s%s\n", color_syscall, + cpu, pid, tid, this->delta, "syscall", self->depthlast * 2, "", + probefunc, color_off); + self->last = timestamp; +} + +proc:::exit +/pid == $target/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_thread.d b/cddl/contrib/dtracetoolkit/Java/j_thread.d new file mode 100755 index 00000000000..08d2de8b14c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_thread.d @@ -0,0 +1,64 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_thread.d - snoop Java thread execution using DTrace. + Written for the Java hotspot DTrace provider. + * + * $Id: j_thread.d 19 2007-09-12 07:47:59Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0). + * + * USAGE: j_thread.d # hit Ctrl-C to end + * + * FIELDS: + * TIME Time string + * PID Process ID + * TID Thread ID + * THREAD Thread name + * + * LEGEND: + * => thread start + * <= thread end + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +dtrace:::BEGIN +{ + printf("%-20s %6s/%-5s -- %s\n", "TIME", "PID", "TID", "THREAD"); +} + +hotspot*:::thread-start +{ + this->thread = (char *)copyin(arg0, arg1 + 1); + this->thread[arg1] = '\0'; + printf("%-20Y %6d/%-5d => %s\n", walltimestamp, pid, tid, + stringof(this->thread)); +} + +hotspot*:::thread-stop +{ + this->thread = (char *)copyin(arg0, arg1 + 1); + this->thread[arg1] = '\0'; + printf("%-20Y %6d/%-5d <= %s\n", walltimestamp, pid, tid, + stringof(this->thread)); +} diff --git a/cddl/contrib/dtracetoolkit/Java/j_who.d b/cddl/contrib/dtracetoolkit/Java/j_who.d new file mode 100755 index 00000000000..8785cca73bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Java/j_who.d @@ -0,0 +1,58 @@ +#!/usr/sbin/dtrace -Zs +/* + * j_who.d - trace Java calls by process using DTrace. + * Written for the Java hotspot DTrace provider. + * + * $Id: j_who.d 19 2007-09-12 07:47:59Z brendan $ + * + * This traces activity from all Java processes on the system with hotspot + * provider support (1.6.0). + * + * USAGE: j_who.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID of Java + * UID User ID of the owner + * CALLS Number of calls made (a measure of activity) + * ARGS Process name and arguments + * + * The argument list is truncated at 55 characters (up to 80 is easily + * available). To easily read the full argument list, use other system tools; + * on Solaris use "pargs PID". + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +hotspot*:::Call*-entry +{ + @calls[pid, uid, curpsinfo->pr_psargs] = count(); +} + +dtrace:::END +{ + printf(" %6s %6s %6s %-55s\n", "PID", "UID", "CALLS", "ARGS"); + printa(" %6d %6d %@6d %-55.55s\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/Readme b/cddl/contrib/dtracetoolkit/JavaScript/Readme new file mode 100644 index 00000000000..a9bebf86b89 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/Readme @@ -0,0 +1,54 @@ +JavaScript - DTracing JavaScript + + There scripts trace the JavaScript programming language, and require a + browser to be built with the DTrace JavaScript provider. + + The DTrace JavaScript provider was originally written by Brendan Gregg, + and later developed as part of a Mozilla DTrace provider suite by + engineers from both Sun and Mozilla. It currently exists as patches + to the Mozilla source tree and requires building from source to get + working; it may be integrated into Solaris builds by default in the + future. To download the current patches and instructions, visit, + + http://www.opensolaris.org/os/project/mozilla-dtrace/ + + A rough guide for the process is, + + 1. Download the Mozilla source + http://developer.mozilla.org/en/docs/Mozilla_Source_Code_Via_CVS + 2. Download the Mozilla DTrace framework patch, and apply + https://bugzilla.mozilla.org/show_bug.cgi?id=370906 + 3. Download the JavaScript DTrace provider patch, and apply + https://bugzilla.mozilla.org/show_bug.cgi?id=388564 + 4. Create a .mozconfig file (needed for compilation). + 5. Setup various compilation environment vars (CC/CFLAGS/CXX/...) + 6. autoconf + 7. ./configure --enable-dtrace + 8. gmake + + See John Rice's instructions linked from the OpenSolaris page above + for details on steps 4-8. + + Since the DTrace JavaScript provider may be developed further, there is a + chance that it has changed slightly by the time you are reading this, + causing these scripts to either break or behave oddly. Firstly, check for + newer versions of the DTraceToolkit; if it hasn't been updated and you need + to use these scripts immediately, then updating them shouldn't take + too long. The following was the state of the provider when these scripts + were written - check for changes and update the scripts accordingly, + + provider javascript { + probe function-entry(file, class, func) + probe function-info(file, class, func, lineno, runfile, runlineno) + probe function-args(file, class, func, argc, argv, argv0, argv1, + argv2, argv3, argv4) + probe function-rval(file, class, func, lineno, rval, rval0) + probe function-return(file, class, func) + probe object-create-start(file, class) + probe object-create(file, class, *object, rlineno) + probe object-create-done(file, class) + probe object-finalize(NULL, class, *object) + probe execute-start(file, lineno) + probe execute-done(file, lineno) + }; + diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_calldist.d b/cddl/contrib/dtracetoolkit/JavaScript/js_calldist.d new file mode 100755 index 00000000000..2c4923a5308 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_calldist.d @@ -0,0 +1,101 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_calldist.d - measure JavaScript elapsed times for types of operation. + * Written for the JavaScript DTrace provider. + * + * $Id: js_calldist.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces JavaScript activity from all browsers running on the system with + * JavaScript provider support. + * + * USAGE: js_calldist.d # hit Ctrl-C to end + * + * FIELDS: + * 1 Filename of the JavaScript program + * 2 Type of call (func/obj-new) + * 3 Name of call + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +javascript*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = timestamp; +} + +javascript*:::function-return +/self->function[self->depth]/ +{ + this->elapsed_incl = timestamp - self->function[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg2); + + @types_incl[this->file, "func", this->name] = + quantize(this->elapsed_incl / 1000); + @types_excl[this->file, "func", this->name] = + quantize(this->elapsed_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +javascript*:::object-create-start +{ + self->object = timestamp; +} + +javascript*:::object-create-done +/self->object/ +{ + this->elapsed = timestamp - self->object; + self->object = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @types[this->file, "obj-new", this->name] = + quantize(this->elapsed / 1000); + + self->exclude[self->depth] += this->elapsed; +} + +dtrace:::END +{ + printf("\nElapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types); + + printf("\nExclusive function elapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_excl); + + printf("\nInclusive function elapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_calls.d b/cddl/contrib/dtracetoolkit/JavaScript/js_calls.d new file mode 100755 index 00000000000..98f1a83ae54 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_calls.d @@ -0,0 +1,76 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_calls.d - count JavaScript calls using DTrace. + * Written for the JavaScript DTrace provider. + * + * $Id: js_calls.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all browsers on the system that are + * running with JavaScript provider support. + * + * USAGE: js_calls.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the JavaScript program + * TYPE Type of call (func/obj-new/...) + * NAME Descriptive name of call + * COUNT Number of calls during sample + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +javascript*:::function-entry +{ + this->name = copyinstr(arg2); + @calls[basename(copyinstr(arg0)), "func", this->name] = count(); +} + +javascript*:::execute-start +{ + this->filename = basename(copyinstr(arg0)); + @calls[this->filename, "exec", "."] = count(); +} + +javascript*:::object-create-start +{ + this->name = copyinstr(arg1); + this->filename = basename(copyinstr(arg0)); + @calls[this->filename, "obj-new", this->name] = count(); +} + +javascript*:::object-finalize +{ + this->name = copyinstr(arg1); + @calls["", "obj-free", this->name] = count(); +} + +dtrace:::END +{ + printf(" %-24s %-10s %-30s %8s\n", "FILE", "TYPE", "NAME", "CALLS"); + printa(" %-24s %-10s %-30s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_calltime.d b/cddl/contrib/dtracetoolkit/JavaScript/js_calltime.d new file mode 100755 index 00000000000..dce150e3e5a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_calltime.d @@ -0,0 +1,115 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_calltime.d - measure JavaScript elapsed times for types of operation. + * Written for the JavaScript DTrace provider. + * + * $Id: js_calltime.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces JavaScript activity from all browsers running on the system with + * JavaScript provider support. + * + * USAGE: js_calltime.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the JavaScript program + * TYPE Type of call (func/obj-new/gc/total) + * NAME Name of call + * TOTAL Total elapsed time for calls (us) + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +javascript*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = timestamp; +} + +javascript*:::function-return +/self->function[self->depth]/ +{ + this->elapsed_incl = timestamp - self->function[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg2); + + @num[this->file, "func", this->name] = count(); + @num["-", "total", "-"] = count(); + @types_incl[this->file, "func", this->name] = sum(this->elapsed_incl); + @types_excl[this->file, "func", this->name] = sum(this->elapsed_excl); + @types_excl["-", "total", "-"] = sum(this->elapsed_excl); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +javascript*:::object-create-start +{ + self->object = timestamp; +} + +javascript*:::object-create-done +/self->object/ +{ + this->elapsed = timestamp - self->object; + self->object = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @num[this->file, "obj-new", this->name] = count(); + @num["-", "total", "-"] = count(); + @types[this->file, "obj-new", this->name] = sum(this->elapsed); + @types["-", "total", "-"] = sum(this->elapsed); + + self->exclude[self->depth] += this->elapsed; +} + +dtrace:::END +{ + printf("\nCount,\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-20.20s %-10s %-32s %@8d\n", @num); + + normalize(@types, 1000); + printf("\nElapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20.20s %-10s %-32s %@8d\n", @types); + + normalize(@types_excl, 1000); + printf("\nExclusive function elapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20.20s %-10s %-32s %@8d\n", @types_excl); + + normalize(@types_incl, 1000); + printf("\nInclusive function elapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20.20s %-10s %-32s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_cpudist.d b/cddl/contrib/dtracetoolkit/JavaScript/js_cpudist.d new file mode 100755 index 00000000000..cbe168d742d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_cpudist.d @@ -0,0 +1,101 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_cpudist.d - measure JavaScript on-CPU times for types of operation. + * Written for the JavaScript DTrace provider. + * + * $Id: js_cpudist.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces JavaScript activity from all browsers running on the system with + * JavaScript provider support. + * + * USAGE: js_cpudist.d # hit Ctrl-C to end + * + * FIELDS: + * 1 Filename of the JavaScript program + * 2 Type of call (func/obj-new) + * 3 Name of call + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +javascript*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = vtimestamp; +} + +javascript*:::function-return +/self->function[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->function[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg2); + + @types_incl[this->file, "func", this->name] = + quantize(this->oncpu_incl / 1000); + @types_excl[this->file, "func", this->name] = + quantize(this->oncpu_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +javascript*:::object-create-start +{ + self->object = vtimestamp; +} + +javascript*:::object-create-done +/self->object/ +{ + this->oncpu = vtimestamp - self->object; + self->object = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @types[this->file, "obj-new", this->name] = + quantize(this->oncpu / 1000); + + self->exclude[self->depth] += this->oncpu; +} + +dtrace:::END +{ + printf("\nElapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types); + + printf("\nExclusive function on-CPU times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_excl); + + printf("\nInclusive function on-CPU times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_cputime.d b/cddl/contrib/dtracetoolkit/JavaScript/js_cputime.d new file mode 100755 index 00000000000..bee77abc995 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_cputime.d @@ -0,0 +1,115 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_cputime.d - measure JavaScript on-CPU times for types of operation. + * Written for the JavaScript DTrace provider. + * + * $Id: js_cputime.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces JavaScript activity from all browsers running on the system with + * JavaScript provider support. + * + * USAGE: js_cputime.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the JavaScript program + * TYPE Type of call (func/obj-new/gc/total) + * NAME Name of call + * TOTAL Total on-CPU time for calls (us) + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +javascript*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = vtimestamp; +} + +javascript*:::function-return +/self->function[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->function[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg2); + + @num[this->file, "func", this->name] = count(); + @num["-", "total", "-"] = count(); + @types_incl[this->file, "func", this->name] = sum(this->oncpu_incl); + @types_excl[this->file, "func", this->name] = sum(this->oncpu_excl); + @types_excl["-", "total", "-"] = sum(this->oncpu_excl); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +javascript*:::object-create-start +{ + self->object = vtimestamp; +} + +javascript*:::object-create-done +/self->object/ +{ + this->oncpu = vtimestamp - self->object; + self->object = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @num[this->file, "obj-new", this->name] = count(); + @num["-", "total", "-"] = count(); + @types[this->file, "obj-new", this->name] = sum(this->oncpu); + @types["-", "total", "-"] = sum(this->oncpu); + + self->exclude[self->depth] += this->oncpu; +} + +dtrace:::END +{ + printf("\nCount,\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-20.20s %-10s %-32s %@8d\n", @num); + + normalize(@types, 1000); + printf("\nElapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20.20s %-10s %-32s %@8d\n", @types); + + normalize(@types_excl, 1000); + printf("\nExclusive function on-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20.20s %-10s %-32s %@8d\n", @types_excl); + + normalize(@types_incl, 1000); + printf("\nInclusive function on-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20.20s %-10s %-32s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_execs.d b/cddl/contrib/dtracetoolkit/JavaScript/js_execs.d new file mode 100755 index 00000000000..fb0ca91fb56 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_execs.d @@ -0,0 +1,51 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_execs.d - JavaScript execute snoop using DTrace. + * Written for the JavaScript DTrace provider. + * + * $Id: js_execs.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all browsers on the system that are + * running with JavaScript provider support. + * + * USAGE: js_execs.d # hit Ctrl-C to end + * + * FIELDS: + * TIME Time of event + * FILE Filename of the JavaScript program + * LINENO Line number in filename + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +dtrace:::BEGIN +{ + printf("%-20s %32s:%s\n", "TIME", "FILE", "LINENO"); +} + +javascript*:::execute-start +{ + printf("%-20Y %32s:%d\n", walltimestamp, basename(copyinstr(arg0)), + arg1); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_flow.d b/cddl/contrib/dtracetoolkit/JavaScript/js_flow.d new file mode 100755 index 00000000000..450cc69e807 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_flow.d @@ -0,0 +1,69 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_flow.d - snoop JavaScript execution showing function flow using DTrace. + * Written for the JavaScript DTrace provider. + * + * $Id: js_flow.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all browsers on the system that are running + * with JavaScript provider support. + * + * USAGE: js_flow.d # hit Ctrl-C to end + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * FILE Filename that this function belongs to + * FUNC Function name + * + * LEGEND: + * -> function entry + * <- function return + * + * Filename and function names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%3s %-16s %-22s -- %s\n", "C", "TIME(us)", "FILE", "FUNC"); +} + +javascript*:::function-entry +{ + printf("%3d %-16d %-22s %*s-> %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg2)); + self->depth++; +} + +javascript*:::function-return +{ + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %-16d %-22s %*s<- %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg2)); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_flowinfo.d b/cddl/contrib/dtracetoolkit/JavaScript/js_flowinfo.d new file mode 100755 index 00000000000..b4b7d5c47e1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_flowinfo.d @@ -0,0 +1,86 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_flowinfo.d - JavaScript function flow with info using DTrace. + * Written for the JavaScript DTrace provider. + * + * $Id: js_flowinfo.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all browsers on the system that are running + * with JavaScript provider support. + * + * USAGE: js_flowinfo.d # hit Ctrl-C to end + * + * FIELDS: + * C CPU-id + * PID Process ID + * DELTA(us) Elapsed time from previous line to this line + * FILE Filename of the JavScript program + * LINE Line number of filename + * TYPE Type of call (func) + * FUNC Function name + * + * LEGEND: + * -> function entry + * <- function return + * + * Filename and function names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%3s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)", + "FILE", "LINE", "TYPE", "FUNC"); +} + +javascript*:::function-info, +javascript*:::function-return +/self->last == 0/ +{ + self->last = timestamp; +} + +javascript*:::function-info +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, + this->delta, basename(copyinstr(arg4)), arg5, "func", + self->depth * 2, "", copyinstr(arg2)); + self->depth++; + self->last = timestamp; +} + +javascript*:::function-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %10d %16s:- %-8s %*s<- %s\n", cpu, pid, + this->delta, basename(copyinstr(arg0)), "func", self->depth * 2, + "", copyinstr(arg2)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_flowtime.d b/cddl/contrib/dtracetoolkit/JavaScript/js_flowtime.d new file mode 100755 index 00000000000..9545274934a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_flowtime.d @@ -0,0 +1,84 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_flowtime.d - JavaScript function flow with delta times using DTrace. + * Written for the JavaScript DTrace provider. + * + * $Id: js_flowtime.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all browsers on the system that are running + * with JavaScript provider support. + * + * USAGE: js_flowtime.d # hit Ctrl-C to end + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * FILE Filename that this function belongs to + * DELTA(us) Elapsed time from previous line to this line + * FUNC Function name + * + * LEGEND: + * -> function entry + * <- function return + * + * Filename and function names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%3s %-16s %-18s %9s -- %s\n", "C", "TIME(us)", "FILE", + "DELTA(us)", "FUNC"); +} + +javascript*:::function-entry, +javascript*:::function-return +/self->last == 0/ +{ + self->last = timestamp; +} + +javascript*:::function-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %-16d %-18s %9d %*s-> %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), this->delta, self->depth * 2, "", + copyinstr(arg2)); + self->depth++; + self->last = timestamp; +} + +javascript*:::function-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %-16d %-18s %9d %*s<- %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), this->delta, self->depth * 2, "", + copyinstr(arg2)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_objcpu.d b/cddl/contrib/dtracetoolkit/JavaScript/js_objcpu.d new file mode 100755 index 00000000000..6611f59b4ef --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_objcpu.d @@ -0,0 +1,61 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_objcpu.d - measure JavaScript object creation on-CPU time using DTrace. + * Written for the JavaScript DTrace provider. + * + * $Id: js_objcpu.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces JavaScript activity from all browsers running on the system + * with JavaScript provider support. + * + * USAGE: js_objcpu.d # hit Ctrl-C to end + * + * Class names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +javascript*:::object-create-start +{ + self->vstart = vtimestamp; +} + +javascript*:::object-create-done +/self->vstart/ +{ + this->oncpu = vtimestamp - self->vstart; + @total = sum(this->oncpu); + @dist[copyinstr(arg1)] = quantize(this->oncpu / 1000); + self->vstart = 0; +} + +dtrace:::END +{ + normalize(@total, 1000000); + printa("Total object creation on-CPU time (ms): %@d\n\n", @total); + printf("Object creation on-CPU time distributions (us),\n"); + printa(@dist); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_objgc.d b/cddl/contrib/dtracetoolkit/JavaScript/js_objgc.d new file mode 100755 index 00000000000..575b2952f83 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_objgc.d @@ -0,0 +1,89 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_objgc.d - trace JavaScript Object GC using DTrace. + * Written for the JavaScript DTrace provider. + * + * $Id: js_objgc.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces JavaScript activity from all running browers on the system + * which support the JavaScript DTrace provider. + * + * USAGE: js_objgc.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename that contained the function + * CLASS Class to which this new object belongs + * TOTAL Object entropy (positive == uncollected) + * + * This script provides information on which objects are not being garbage + * collected, an issue which causes the browser to steadily leak memory. + * We trace object creation (+1) and destruction (-1), and provide a + * summary each second of the running tally of the object class and + * originating filename. If over the period of several minutes an object + * type is still steadily increasing, then that would be of interest. + * Be patient, depending on the rate of object creation it can take over + * ten minutes for garbage collect to kick in. + * + * NOTES: + * - it is possible that you will see negative entropy. That happens + * when you begin tracing after some objects have already been created, + * and then trace their destruction. + * - there are other Things that GC handles, other than Objects; extra + * probes can be added to trace them, should the need arise. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +/* if you get dynvardrops, increase this, */ +#pragma D option dynvarsize=32m +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +javascript*:::object-create +/arg2/ +{ + this->file = basename(copyinstr(arg0)); + @objs[this->file, copyinstr(arg1)] = sum(1); + filename[arg2] = this->file; +} + +javascript*:::object-finalize +/filename[arg2] == NULL/ +{ + @objs["", copyinstr(arg1)] = sum(-1); +} + +javascript*:::object-finalize +/filename[arg2] != NULL/ +{ + @objs[filename[arg2], copyinstr(arg1)] = sum(-1); + filename[arg2] = 0; +} + +profile:::tick-1sec, +dtrace:::END +{ + printf("\n %-24s %8s %-20s %23Y\n", "FILE", "TOTAL", "CLASS", + walltimestamp); + printa(" %-24.24s %@8d %s\n", @objs); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_objnew.d b/cddl/contrib/dtracetoolkit/JavaScript/js_objnew.d new file mode 100755 index 00000000000..f57c7b52ec6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_objnew.d @@ -0,0 +1,55 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_objnew.d - count JavaScript object creation using DTrace. + * Written for the JavaScript DTrace provider. + * + * $Id: js_objnew.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces JavaScript activity from all browsers running on the system + * with JavaScript provider support. + * + * USAGE: js_objnew.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the JavaScript program + * CLASS Class of new object + * COUNT Number of object creations during tracing + * + * Filename and class names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +javascript*:::object-create-done +{ + @objs[basename(copyinstr(arg0)), copyinstr(arg1)] = count(); +} + +dtrace:::END +{ + printf(" %-24s %-36s %8s\n", "FILE", "CLASS", "COUNT"); + printa(" %-24.24s %-36s %@8d\n", @objs); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_stat.d b/cddl/contrib/dtracetoolkit/JavaScript/js_stat.d new file mode 100755 index 00000000000..323776298a0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_stat.d @@ -0,0 +1,120 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_stat.d - JavaScript operation stats using DTrace. + * Written for the JavaScript DTrace provider. + * + * $Id: js_stat.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all browsers on the system that are + * running with JavaScript provider support. + * + * USAGE: js_stat.d [interval [count]] + * + * FIELDS: + * EXEC/s JavaScript programs executed per second + * FUNCS/s Functions called, per second + * OBJNEW/s Objects created, per second + * OBJFRE/s Objects freed (finalize), per second + * + * The numbers are counts for the interval specified. The default interval + * is 1 second. + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option defaultargs + +inline int SCREEN = 21; + +dtrace:::BEGIN +{ + execs = funcs = objnew = objfree = 0; + lines = SCREEN + 1; + interval = $1 ? $1 : 1; + counts = $2 ? $2 : -1; + secs = interval; + first = 1; +} + +profile:::tick-1sec +{ + secs--; +} + +/* + * Print Header + */ +dtrace:::BEGIN, +profile:::tick-1sec +/first || (secs == 0 && lines > SCREEN)/ +{ + printf("%-20s %8s %8s %8s %8s\n", "TIME", "EXEC/s", "FUNC/s", + "OBJNEW/s", "OBJFRE/s"); + lines = 0; + first = 0; +} + +/* + * Tally Data + */ +javascript*:::execute-start +{ + execs++; +} + +javascript*:::function-entry +{ + funcs++; +} + +javascript*:::object-create-start +{ + objnew++; +} + +javascript*:::object-finalize +{ + objfree++; +} + +/* + * Print Output + */ +profile:::tick-1sec +/secs == 0/ +{ + printf("%-20Y %8d %8d %8d %8d\n", walltimestamp, execs / interval, + funcs / interval, objnew / interval, objfree / interval); + execs = funcs = objnew = objfree = 0; + secs = interval; + lines++; + counts--; +} + +/* + * End + */ +profile:::tick-1sec +/counts == 0/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_who.d b/cddl/contrib/dtracetoolkit/JavaScript/js_who.d new file mode 100755 index 00000000000..f320b481fd3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_who.d @@ -0,0 +1,56 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_who.d - trace JavaScript function execution by process using DTrace. + * Written for the JavaScript DTrace provider. + * + * $Id: js_who.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces JavaScript activity from all browsers on the system that are + * running with JavaScript provider support. + * + * USAGE: js_who.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID of JavaScript + * UID User ID of the owner + * FUNCS Number of function calls + * FILE Pathname of the JavaScript program + * + * Filenames are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +javascript*:::function-entry +{ + @funcs[pid, uid, copyinstr(arg0)] = count(); +} + +dtrace:::END +{ + printf(" %6s %6s %6s %s\n", "PID", "UID", "FUNCS", "FILE"); + printa(" %6d %6d %@6d %s\n", @funcs); +} diff --git a/cddl/contrib/dtracetoolkit/Kernel/Readme b/cddl/contrib/dtracetoolkit/Kernel/Readme new file mode 100644 index 00000000000..3c5d6b3589d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/Readme @@ -0,0 +1,3 @@ +Kernel - Kernel based analysis + + These are scripts to monitor kernel activity. diff --git a/cddl/contrib/dtracetoolkit/Kernel/cpudists b/cddl/contrib/dtracetoolkit/Kernel/cpudists new file mode 100755 index 00000000000..b708216e191 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/cpudists @@ -0,0 +1,184 @@ +#!/usr/bin/sh +# +# cpudists - print CPU time distributions by Kernel/Idle/Processes. +# Written using DTrace (Solaris 10 3/05). +# +# $Id: cpudists 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: cpudists [-ahV] [-t top] [interval [count]] +# +# -a # print all processes +# -V # don't print timestamps +# -t num # print top num only +# eg, +# cpudists 1 # print every 1 second +# cpudists -a 10 # print all processes every 10 secs +# +# +# FIELDS: +# value The following or the process name, +# IDLE Idle time - CPU running idle thread +# KERNEL Kernel time - Kernel servicing interrupts, ... +# PROCESS Process time - PIDs running on the system +# count Number of occurances at least this duration (ns) +# +# NOTES: +# * This takes into account multiple CPU servers, the total +# seconds consumed will be a multiple of the CPU count and interval. +# +# SEE ALSO: cputimes +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 27-Apr-2005 Brendan Gregg Created this. +# 22-Sep-2005 " " Fixed key corruption bug. +# 22-Sep-2005 " " Last update. +# + + +############################## +# --- Process Arguments --- +# +opt_all=0; opt_time=1; opt_top=0; top=0; interval=1; count=1 + +while getopts aht:V name +do + case $name in + a) opt_all=1 ;; + V) opt_time=0 ;; + t) opt_top=1; top=$OPTARG ;; + h|?) cat <<-END >&2 + USAGE: cpudists [-ahV] [-t top] [interval [count]] + cpudists # default output + -a # print all processes + -V # don't print times + -t num # print top num only + END + exit 1 + esac +done +shift `expr $OPTIND - 1` + +if [ "$1" -gt 0 ]; then + interval=$1; count=-1; shift +fi +if [ "$1" -gt 0 ]; then + count=$1; shift +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + + /* + * Command line arguments + */ + inline int OPT_all = '$opt_all'; + inline int OPT_time = '$opt_time'; + inline int OPT_top = '$opt_top'; + inline int TOP = '$top'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + + /* Initialise variables */ + dtrace:::BEGIN + { + cpustart[cpu] = 0; + counts = COUNTER; + secs = INTERVAL; + } + + /* Flag this thread as idle */ + sysinfo:unix:idle_enter:idlethread + { + idle[cpu] = 1; + } + + /* Save kernel time between running threads */ + sched:::on-cpu + /cpustart[cpu]/ + { + this->elapsed = timestamp - cpustart[cpu]; + @Procs["KERNEL"] = quantize(this->elapsed); + } + + /* Save the elapsed time of a thread */ + sched:::off-cpu, + sched:::remain-cpu, + profile:::profile-1sec + /cpustart[cpu]/ + { + /* determine the name for this thread */ + program[cpu] = pid == 0 ? idle[cpu] ? "IDLE" : "KERNEL" : + OPT_all ? execname : "PROCESS"; + + /* save elapsed */ + this->elapsed = timestamp - cpustart[cpu]; + @Procs[program[cpu]] = quantize(this->elapsed); + cpustart[cpu] = timestamp; + } + + /* Record the start time of a thread */ + sched:::on-cpu, + sched:::remain-cpu + { + idle[cpu] = 0; + cpustart[cpu] = timestamp; + } + + profile:::tick-1sec + { + secs--; + } + + /* Print time */ + profile:::tick-1sec + /secs == 0 && OPT_time/ + { + printf("%Y,\n", walltimestamp); + } + + /* Print report */ + profile:::tick-1sec + /secs == 0/ + { + OPT_top ? trunc(@Procs, TOP) : 1; + printa("%16s %@16d\n", @Procs); + trunc(@Procs); + secs = INTERVAL; + counts--; + } + + /* End of program */ + profile:::tick-1sec + /counts == 0/ + { + exit(0); + } + + /* cleanup for Ctrl-C */ + dtrace:::END + { + trunc(@Procs); + } +' + diff --git a/cddl/contrib/dtracetoolkit/Kernel/cputimes b/cddl/contrib/dtracetoolkit/Kernel/cputimes new file mode 100755 index 00000000000..881bf90efec --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/cputimes @@ -0,0 +1,203 @@ +#!/usr/bin/sh +# +# cputimes - print CPU time consumed by Kernel/Idle/Processes. +# Written using DTrace (Solaris 10 3/05). +# +# $Id: cputimes 3 2007-08-01 10:50:08Z brendan $ +# +# This program accurately measures time consumed by the kernel, but in +# doing so creates extra kernel load of it's own. The extra kernel +# activity can be measured by running one cputimes and then another, and +# comparing the difference in kernel consumed time. This method can be +# used to estimate the load created by other DTrace scripts. +# +# USAGE: cputimes [-ahTV] [-t top] [interval [count]] +# +# -a # print all processes +# -T # print totals +# -V # don't print timestamps +# -t num # print top num lines only +# eg, +# cputimes 1 # print every 1 second +# cputimes -a 10 # print all processes every 10 secs +# cputimes -at 8 5 # print top 8 lines every 5 secs +# +# +# FIELDS: +# THREADS The following or the process name, +# IDLE Idle time - CPU running idle thread +# KERNEL Kernel time - Kernel servicing interrupts, ... +# PROCESS Process time - PIDs running on the system +# TIME (ns) Sum of the CPU time, ns (nanoseconds) +# +# NOTES: +# * This takes into account multiple CPU servers, the total +# seconds consumed will be a multiple of the CPU count and interval. +# +# SEE ALSO: cpudists +# Heisenberg's uncertainty principle. +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 27-Apr-2005 Brendan Gregg Created this. +# 22-Sep-2005 " " Fixed a key corruption bug. +# 22-Sep-2005 " " Last update. +# + + +############################## +# --- Process Arguments --- +# +opt_all=0; opt_time=1; opt_top=0; opt_totals=0 +top=0; interval=1; count=1 + +while getopts aht:TV name +do + case $name in + a) opt_all=1 ;; + T) opt_totals=1 ;; + V) opt_time=0 ;; + t) opt_top=1; top=$OPTARG ;; + h|?) cat <<-END >&2 + USAGE: cputimes [-ahTV] [-t top] [interval [count]] + cputimes # default output + -a # print all processes + -T # print totals + -V # don't print times + -t num # print top num lines only + eg, + cputimes 1 # print every 1 second + cputimes -a 10 # all processes per 10 sec + cputimes -at 8 5 # top 8 lines every 5 secs + END + exit 1 + esac +done +shift `expr $OPTIND - 1` + +if [ "$1" -gt 0 ]; then + interval=$1; count=-1; shift +fi +if [ "$1" -gt 0 ]; then + count=$1; shift +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + + /* + * Command line arguments + */ + inline int OPT_all = '$opt_all'; + inline int OPT_time = '$opt_time'; + inline int OPT_totals = '$opt_totals'; + inline int OPT_top = '$opt_top'; + inline int TOP = '$top'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + + /* Initialise variables */ + dtrace:::BEGIN + { + cpustart[cpu] = 0; + counts = COUNTER; + secs = INTERVAL; + } + + /* Flag this thread as idle */ + sysinfo:unix:idle_enter:idlethread + { + idle[cpu] = 1; + } + + /* Save kernel time between running threads */ + sched:::on-cpu + /cpustart[cpu]/ + { + this->elapsed = timestamp - cpustart[cpu]; + @Procs["KERNEL"] = sum(this->elapsed); + } + + /* Save the elapsed time of a thread */ + sched:::off-cpu, + sched:::remain-cpu, + profile:::profile-1sec + /cpustart[cpu]/ + { + /* determine the name for this thread */ + program[cpu] = pid == 0 ? idle[cpu] ? "IDLE" : "KERNEL" : + OPT_all ? execname : "PROCESS"; + + /* save elapsed */ + this->elapsed = timestamp - cpustart[cpu]; + @Procs[program[cpu]] = sum(this->elapsed); + cpustart[cpu] = timestamp; + } + + /* Record the start time of a thread */ + sched:::on-cpu, + sched:::remain-cpu + { + idle[cpu] = 0; + cpustart[cpu] = timestamp; + } + + + profile:::tick-1sec + { + secs--; + } + + /* Print time */ + profile:::tick-1sec + /secs == 0/ + { + OPT_time ? printf("%Y,\n", walltimestamp) : 1; + printf("%16s %16s\n", "THREADS", "TIME (ns)"); + } + + /* Print report */ + profile:::tick-1sec + /secs == 0/ + { + OPT_top ? trunc(@Procs, TOP) : 1; + printa("%16s %@16d\n", @Procs); + trunc(@Procs); + secs = INTERVAL; + counts--; + } + + /* End of program */ + profile:::tick-1sec + /counts == 0/ + { + exit(0); + } + + /* cleanup for Ctrl-C */ + dtrace:::END + { + trunc(@Procs); + } +' + diff --git a/cddl/contrib/dtracetoolkit/Kernel/cswstat.d b/cddl/contrib/dtracetoolkit/Kernel/cswstat.d new file mode 100755 index 00000000000..98ca83cc361 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/cswstat.d @@ -0,0 +1,74 @@ +#!/usr/sbin/dtrace -s +/* + * cswstat.d - context switch time stat. + * Uses DTrace (Solaris 10 03/05) + * + * This prints a context switch count and consumed time for context + * switching every second. + * + * $Id: cswstat.d 15 2007-09-11 09:09:25Z brendan $ + * + * USAGE: cswstat.d + * + * FIELDS: + * TIME Current time + * NUM Number of context switches + * CSWTIME(us) Time consumed context switching, us + * AVGTIME(us) Average context switch time, us + * + * THANKS: Toomas Soome + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 17-May-2005 Brendan Gregg Created this. + * 03-Nov-2005 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + /* print header */ + printf("%-20s %8s %12s %12s\n", "TIME", "NUM", "CSWTIME(us)", + "AVGTIME(us)"); + times = 0; + num = 0; +} + +sched:::off-cpu +{ + /* csw start */ + num++; + start[cpu] = timestamp; +} + +sched:::on-cpu +/start[cpu]/ +{ + /* csw end */ + times += timestamp - start[cpu]; + start[cpu] = 0; +} + +profile:::tick-1sec +{ + /* print output */ + printf("%20Y %8d %12d %12d\n", walltimestamp, num, times/1000, + num == 0 ? 0 : times/(1000 * num)); + times = 0; + num = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Kernel/dnlcps.d b/cddl/contrib/dtracetoolkit/Kernel/dnlcps.d new file mode 100755 index 00000000000..d3c3e58ff18 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/dnlcps.d @@ -0,0 +1,68 @@ +#!/usr/sbin/dtrace -s +/* + * dnlcps.d - DNLC stats by process. + * Written in DTrace (Solaris 10 3/05). + * + * The DNLC is the Directory Name Lookup Cache. Filename lookups often + * return a hit from here, before needing to traverse the regular file + * system cache or go to disk. + * + * dnlcps.d prints DNLC statistics by process. + * + * $Id: dnlcps.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: dnlcps.d # wait several seconds, then hit Ctrl-C + * + * FIELDS: + * PID Process ID + * CMD Command name + * value 0 == miss, 1 == hit + * count number of occurrences + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 27-Mar-2004 Brendan Gregg Created this. + * 14-Jun-2005 " " Rewrote this a lot. + * 18-Feb-2006 " " Last update. + */ + +#pragma D option quiet + +/* + * Print header + */ +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +/* + * DNLC return + */ +fbt:genunix:dnlc_lookup:return +{ + this->code = arg1 == 0 ? 0 : 1; + @Result[execname, pid] = lquantize(this->code, 0, 1, 1); +} + +/* + * Print report + */ +dtrace:::END +{ + printa(" CMD: %-16s PID: %d\n%@d\n", @Result); +} diff --git a/cddl/contrib/dtracetoolkit/Kernel/dnlcsnoop.d b/cddl/contrib/dtracetoolkit/Kernel/dnlcsnoop.d new file mode 100755 index 00000000000..1150f450230 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/dnlcsnoop.d @@ -0,0 +1,92 @@ +#!/usr/sbin/dtrace -s +/* + * dnlcsnoop.d - snoop DNLC activity. + * Written in DTrace (Solaris 10 3/05). + * + * The DNLC is the Directory Name Lookup Cache. Filename lookups often + * return a hit from here, before needing to traverse the regular file + * system cache or go to disk. + * + * $Id: dnlcsnoop.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: dnlcsnoop.d # wait several seconds, then hit Ctrl-C + * + * FIELDS: + * PID Process ID + * CMD Command name + * TIME Elapsed time for lookup, us + * HIT DNLC hit Y/N + * PATH Path for DNLC lookup + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 27-Mar-2004 Brendan Gregg Created this. + * 14-Jun-2005 " " Rewrote this a lot. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +/* + * Print header + */ +dtrace:::BEGIN +{ + printf("%6s %-12s %5s %3s %s\n", + "PID", "CMD", "TIME", "HIT", "PATH"); +} + +/* + * DNLC lookup + */ +fbt:genunix:dnlc_lookup:entry +{ + /* store path */ + self->path = stringof(args[0]->v_path); + + /* check for trailing "/" */ + this->len = strlen(self->path); + self->join = *(char *)(args[0]->v_path + this->len - 1) == '/' ? + "" : "/"; + + /* store lookup name */ + self->name = stringof(arg1); + + /* store start time */ + self->start = timestamp; +} + +/* + * DNLC return + */ +fbt:genunix:dnlc_lookup:return +/self->start/ +{ + /* calculate elapsed time */ + this->elapsed = (timestamp - self->start) / 1000; + + /* print output */ + printf("%6d %-12.12s %5d %3s %s%s%s\n", + pid, execname, this->elapsed, arg1 == 0 ? "N" : "Y", + self->path, self->join, self->name); + + /* clear variables */ + self->path = 0; + self->join = 0; + self->name = 0; + self->start = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Kernel/dnlcstat b/cddl/contrib/dtracetoolkit/Kernel/dnlcstat new file mode 100755 index 00000000000..b29e8c219bf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/dnlcstat @@ -0,0 +1,162 @@ +#!/usr/bin/sh +# +# dnlcstat - DNLC statistics. +# Written in DTrace (Solaris 10 3/05). +# +# The DNLC is the Directory Name Lookup Cache. Filename lookups often +# return a hit from here, before needing to traverse the regular file +# system cache or go to disk. +# +# $Id: dnlcstat 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: dnlcstat [interval [count]] +# +# FIELDS: +# +# %hit hit percentage for this sample +# hit number of DNLC hits in this sample +# miss number of DNLC misses in this sample +# +# SEE ALSO: CacheKit, http://www.brendangregg.com/cachekit.html +# (contains a dnlcstat written in Perl, which uses less CPU) +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# 27-Mar-2004 Brendan Gregg Created this. +# 14-Jun-2005 " " Updated style. +# 14-Jun-2005 " " Last update. +# + +############################## +# --- Process Arguments --- +# + +### default values +interval=1; count=-1 + +### check arguments +if [ "$1" = "-h" -o "$1" = "--help" ]; then + cat <<-END >&2 + USAGE: dnlcstat [interval [count]] + dnlcstat # 1 second samples, infinite + eg, + dnlcstat 1 # print every 1 second + dnlcstat 5 6 # print every 5 seconds, 6 times + END + exit 1 +fi + +### argument logic +if [ "$1" -gt 0 ]; then + interval=$1; count=-1; shift +fi +if [ "$1" -gt 0 ]; then + count=$1; shift +fi +if [ $interval -eq 0 ]; then + interval=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + + /* + * Command line arguments + */ + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + inline int SCREEN = 21; + + int hits; /* hits */ + int misses; /* misses */ + + /* + * Initialise variables + */ + dtrace:::BEGIN + { + lines = SCREEN + 1; + counts = COUNTER; + secs = INTERVAL; + first = 1; + } + + /* + * Print header + */ + dtrace:::BEGIN, + tick-1sec + /first || (secs == 0 && lines > SCREEN)/ + { + printf("%10s %8s %8s\n","dnlc %hit","hit","miss"); + lines = 0; + first = 0; + } + + /* + * Probe DNLC lookups + */ + fbt:genunix:dnlc_lookup:return + { + hits += arg1 == 0 ? 0 : 1; + misses += arg1 == 0 ? 1 : 0; + } + + profile:::tick-1sec + { + secs--; + } + + + /* + * Print output line + */ + profile:::tick-1sec + /secs == 0/ + { + /* calculate hit percent */ + this->divide = misses + hits == 0 ? 1 : misses + hits; + ratio = hits * 100 / this->divide; + + /* print output */ + printf("%10d %8d %8d\n",ratio,hits,misses); + + /* clear counters */ + hits = 0; + misses = 0; + + /* process counts */ + secs = INTERVAL; + counts--; + lines++; + + } + + /* + * End + */ + profile:::tick-1sec + /counts == 0/ + { + exit(0); + } +' + diff --git a/cddl/contrib/dtracetoolkit/Kernel/kstat_types.d b/cddl/contrib/dtracetoolkit/Kernel/kstat_types.d new file mode 100755 index 00000000000..119bc77d1d2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/kstat_types.d @@ -0,0 +1,66 @@ +#!/usr/sbin/dtrace -Cs +/* + * kstat_types.d - Trace kstat reads with type info. + * Written using DTrace (Solaris 10 3/05) + * + * kstat is the Kernel Statistics framework, which is used by tools + * such as vmstat, iostat, mpstat and sar. Try running vmstat while + * kstat_types.d is tracing - you should see details of the kstat + * reads performed. + * + * $Id: kstat_types.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: kstat_types.d (early release, check for updates) + * + * FIELDS: + * CMD command name + * CLASS kstat class (ks_class) + * TYPE kstat type as a string (ks_type) + * MOD:INS:NAME kstat module:instance:name + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 11-Feb-2006 Brendan Gregg Created this. + * 11-Feb-2006 " " Last update. + */ + +#include + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("%-16s %-16s %-6s %s\n", + "CMD", "CLASS", "TYPE", "MOD:INS:NAME"); +} + +fbt::read_kstat_data:entry +{ +#ifdef _MULTI_DATAMODEL + self->uk = (kstat32_t *)copyin((uintptr_t)arg1, sizeof (kstat32_t)); +#else + self->uk = (kstat_t *)copyin((uintptr_t)arg1, sizeof (kstat_t)); +#endif + printf("%-16s %-16s %-6s %s:%d:%s\n", execname, + self->uk->ks_class == "" ? "." : self->uk->ks_class, + self->uk->ks_type == 0 ? "raw" + : self->uk->ks_type == 1 ? "named" + : self->uk->ks_type == 2 ? "intr" + : self->uk->ks_type == 3 ? "io" + : self->uk->ks_type == 4 ? "timer" : "?", + self->uk->ks_module, self->uk->ks_instance, self->uk->ks_name); +} diff --git a/cddl/contrib/dtracetoolkit/Kernel/modcalls.d b/cddl/contrib/dtracetoolkit/Kernel/modcalls.d new file mode 100755 index 00000000000..0386a7a721a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/modcalls.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * modcalls.d - kernel function calls by module. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: modcalls.d 3 2007-08-01 10:50:08Z brendan $ + */ + +fbt:::entry { @calls[probemod] = count(); } diff --git a/cddl/contrib/dtracetoolkit/Kernel/priclass.d b/cddl/contrib/dtracetoolkit/Kernel/priclass.d new file mode 100755 index 00000000000..92275dcb4ed --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/priclass.d @@ -0,0 +1,67 @@ +#!/usr/sbin/dtrace -s +/* + * priclass.d - priority distribution by scheduling class. + * Written using DTrace (Solaris 10 3/05) + * + * This is a simple DTrace script that samples at 1000 Hz the current + * thread's scheduling class and priority. A distribution plot is printed. + * + * With priorities, the higher the priority the better chance the thread + * has of being scheduled. + * + * This idea came from the script /usr/demo/dtrace/pri.d, which + * produces similar output for priority changes, not samples. + * + * $Id: priclass.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: priclass.d # hit Ctrl-C to end sampling + * + * FIELDS: + * value process priority + * count number of samples of at least this priority + * + * Also printed is the scheduling class, + * + * TS time sharing + * IA interactive + * RT real time + * SYS system + * FSS fair share schedular + * + * BASED ON: /usr/demo/dtrace/pri.d + * + * SEE ALSO: DTrace Guide "profile Provider" chapter (docs.sun.com) + * dispadmin(1M) + * + * PORTIONS: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 12-Feb-2006 Brendan Gregg Created this. + * 22-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Sampling... Hit Ctrl-C to end.\n"); +} + +profile:::profile-1000hz +{ + @count[stringof(curlwpsinfo->pr_clname)] + = lquantize(curlwpsinfo->pr_pri, 0, 170, 10); +} diff --git a/cddl/contrib/dtracetoolkit/Kernel/pridist.d b/cddl/contrib/dtracetoolkit/Kernel/pridist.d new file mode 100755 index 00000000000..1b6d3ebb7b0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/pridist.d @@ -0,0 +1,66 @@ +#!/usr/sbin/dtrace -s +/* + * pridist.d - process priority distribution. + * Written using DTrace (Solaris 10 3/05) + * + * This is a simple DTrace script that samples at 1000 Hz which process + * is on the CPUs, and what the priority is. A distribution plot is printed. + * + * With priorities, the higher the priority the better chance the process + * (actually, thread) has of being scheduled. + * + * This idea came from the script /usr/demo/dtrace/profpri.d, which + * produces similar output for one particular PID. + * + * $Id: pridist.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: pridist.d # hit Ctrl-C to end sampling + * + * FIELDS: + * CMD process name + * PID process ID + * value process priority + * count number of samples of at least this priority + * + * BASED ON: /usr/demo/dtrace/profpri.d + * + * SEE ALSO: + * DTrace Guide "profile Provider" chapter (docs.sun.com) + * dispadmin(1M) + * + * PORTIONS: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 13-Jun-2005 Brendan Gregg Created this. + * 22-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Sampling... Hit Ctrl-C to end.\n"); +} + +profile:::profile-1000hz +{ + @Count[execname, pid] = lquantize(curlwpsinfo->pr_pri, 0, 170, 5); +} + +dtrace:::END +{ + printa(" CMD: %-16s PID: %d\n%@d\n", @Count); +} diff --git a/cddl/contrib/dtracetoolkit/Kernel/putnexts.d b/cddl/contrib/dtracetoolkit/Kernel/putnexts.d new file mode 100755 index 00000000000..cb99a721363 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/putnexts.d @@ -0,0 +1,38 @@ +#!/usr/sbin/dtrace -s +/* + * putnexts.d - stream putnext() tracing with stacks. Solaris, DTrace. + * + * This shows who is calling putnext() to who, by listing the destination + * queue and the calling stack, by frequency count. This is especially useful + * for understanding streams based frameworks, such as areas of the Solaris + * TCP/IP stack. + * + * $Id: putnexts.d 14 2007-09-11 08:03:35Z brendan $ + * + * USAGE: putnext.d + * + * BASED ON: /usr/demo/dtrace/putnext.d + * + * PORTIONS: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 12-Jun-2005 Brendan Gregg Created this. + */ + +fbt::putnext:entry +{ + @[stringof(args[0]->q_qinfo->qi_minfo->mi_idname), stack(5)] = count(); +} diff --git a/cddl/contrib/dtracetoolkit/Kernel/whatexec.d b/cddl/contrib/dtracetoolkit/Kernel/whatexec.d new file mode 100755 index 00000000000..e70173b8b73 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/whatexec.d @@ -0,0 +1,79 @@ +#!/usr/sbin/dtrace -s +/* + * whatexec.d - Examine the type of files exec'd. + * Written using DTrace (Solaris 10 3/05) + * + * This prints the first four chacacters of files that are executed. + * This traces the kernel function findexec_by_hdr(), which checks for + * a known magic number in the file's header. + * + * The idea came from a demo I heard about from the UK, where a + * "blue screen of death" was displayed for "MZ" files (although I + * haven't seen the script or the demo). + * + * $Id: whatexec.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: whatexec.d (early release, check for updates) + * + * FIELDS: + * PEXEC parent command name + * EXEC pathname to file exec'd + * OK is type runnable, Y/N + * TYPE first four characters from file + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 11-Feb-2006 Brendan Gregg Created this. + * 25-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +this char *buf; + +dtrace:::BEGIN +{ + printf("%-16s %-38s %2s %s\n", "PEXEC", "EXEC", "OK", "TYPE"); +} + +fbt::gexec:entry +{ + self->file = cleanpath((*(struct vnode **)arg0)->v_path); + self->ok = 1; +} + +fbt::findexec_by_hdr:entry +/self->ok/ +{ + bcopy(args[0], this->buf = alloca(5), 4); + this->buf[4] = '\0'; + self->hdr = stringof(this->buf); +} + +fbt::findexec_by_hdr:return +/self->ok/ +{ + printf("%-16s %-38s %2s %S\n", execname, self->file, + arg1 == NULL ? "N" : "Y", self->hdr); + self->hdr = 0; +} + +fbt::gexec:return +{ + self->file = 0; + self->ok = 0; +} diff --git a/cddl/contrib/dtracetoolkit/License b/cddl/contrib/dtracetoolkit/License new file mode 120000 index 00000000000..2095b9644d7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/License @@ -0,0 +1 @@ +Docs/cddl1.txt \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Locks/lockbydist.d b/cddl/contrib/dtracetoolkit/Locks/lockbydist.d new file mode 100755 index 00000000000..9bfc224f6d3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Locks/lockbydist.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * lockbydist.d - lock distrib. by process name. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: lockbydist.d 3 2007-08-01 10:50:08Z brendan $ + */ + +lockstat:::adaptive-block { @time[execname] = quantize(arg1); } diff --git a/cddl/contrib/dtracetoolkit/Locks/lockbyproc.d b/cddl/contrib/dtracetoolkit/Locks/lockbyproc.d new file mode 100755 index 00000000000..d7b92191341 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Locks/lockbyproc.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * lockbyproc.d - lock time by process name. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: lockbyproc.d 3 2007-08-01 10:50:08Z brendan $ + */ + +lockstat:::adaptive-block { @time[execname] = sum(arg1); } diff --git a/cddl/contrib/dtracetoolkit/Man/Readme b/cddl/contrib/dtracetoolkit/Man/Readme new file mode 100644 index 00000000000..31641230863 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/Readme @@ -0,0 +1,40 @@ +Man - Man pages + + There are a number of ways you can read these man pages. Either, + + 1. Add this directory to your MANPATH, + + cd Man + MANPATH=$MANPATH:$PWD + man iosnoop + + 2. If the DTraceToolkit has been installed, and that dir to your MANPATH, + + MANPATH=$MANPATH:/opt/DTT/Man + man iosnoop + + 3. Set MANPATH to "." every time you read a script, + + cd Man + MANPATH=. man iosnoop + + 4. Use the -M option to "man", if your OS has it, + + man -M Man iosnoop + + 5. Prentend that you are /usr/bin/man, if your OS has nroff, + + nroff -man Man/man1m/iosnoop.1m | more + + 6. Pretend that you are /usr/bin/nroff, + + more Man/man1m/iosnoop.1m + + 7. Pretend that you have no pagers installed, + + while read line; do echo $line; done < Man/man1m/iosnoop.1m + + 8. Pretend that you can read hex, + + od -x Man/man1m/iosnoop.1m + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/anonpgpid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/anonpgpid.d.1m new file mode 100644 index 00000000000..9cafd480626 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/anonpgpid.d.1m @@ -0,0 +1,54 @@ +.TH anonpgpid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +anonpgpid.d \- anonymous memory paging info by PID on CPU. Uses DTrace. +.SH SYNOPSIS +.B anonpgpid.d +.SH DESCRIPTION +This scripts may help identify which processes are affected by a system +with low memory, which is paging to the physical swap device. A report +of the process on the CPU when paging occured is printed. + +This program is currently an approximation - often the process when writing +pages to swap will be "pageout" the pageout scanner, or "rcapd" the +resource capping daemon. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Print report after Ctrl-C is hit, +# +.B anonpgpid.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +command name for the process +.TP +D +direction, Read or Write +.TP +BYTES +total bytes during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +anonpgpid.d will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/bitesize.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/bitesize.d.1m new file mode 100644 index 00000000000..4ef13bec7d8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/bitesize.d.1m @@ -0,0 +1,57 @@ +.TH bitesize.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +bitesize.d \- analyse disk I/O size by process. Uses DTrace. +.SH SYNOPSIS +.B bitesize.d +.SH DESCRIPTION +This produces a report for the size of disk events caused by +processes. These are the disk events sent by the block I/O driver. + +If applications must use the disks, we generally prefer they do so +sequentially with large I/O sizes, or larger "bites". + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the io provider. +.SH EXAMPLES +.TP +Sample until Ctrl\-C is hit then print report, +# +.B bitesize.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +command and argument list +.TP +value +size in bytes +.TP +count +number of I/O operations +.PP +.SH NOTES +The application may be requesting smaller sized operations, which +are being rounded up to the nearest sector size or UFS block size. + +To analyse what the application is requesting, DTraceToolkit programs +such as Proc/fddist may help. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +bitesize.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +iosnoop(1M), seeksize(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/connections.1m b/cddl/contrib/dtracetoolkit/Man/man1m/connections.1m new file mode 100644 index 00000000000..ea0285cc55e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/connections.1m @@ -0,0 +1,77 @@ +.TH connections 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +connections \- print inbound TCP connections by process. Uses DTrace. +.SH SYNOPSIS +.B connections +[\-htvZ] +.SH DESCRIPTION +This displays the PID and command name of the processes accepting +connections, along with the source IP address and destination port number + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH OPTIONS +.TP +\-t +print timestamps, us +.TP +\-v +print timestamps, string +.TP +\-Z +print zonename +.PP +.SH EXAMPLES +.TP +snoop inbound connections +# +.B connections +.TP +snoop connections with time +# +.B connections +\-v +.PP +.SH FIELDS +.TP +UID +user ID of the server +.TP +PID +process ID of the server +.TP +CMD +server command name +.TP +TIME +timestamp, us +.TP +TIMESTR +timestamp, string +.TP +PORT +server port +.TP +IP_SOURCE +source IP of the client, written in IPv4 style +.TP +ZONE +zonename +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +connections will run until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), snoop(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/cpudists.1m b/cddl/contrib/dtracetoolkit/Man/man1m/cpudists.1m new file mode 100644 index 00000000000..aeb29ca6a8f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/cpudists.1m @@ -0,0 +1,86 @@ +.TH cpudists 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +cpudists \- CPU distrib. by Kernel/Idle/Process. Uses DTrace. +.SH SYNOPSIS +.B cpudists +[\-ahV] [\-t top] [interval [count]] +.SH DESCRIPTION +cpudists prints the CPU time distributions consumed by the Kernel, +Idle threads and by Processes. + +This program is a variant on cputimes, and creates extra kernel load as +described in cputimes(1M). cpudists prints out a distribution report +(a quantize aggregation), such that the number of occurrences and +duration of each thread using the CPUs can be identified. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sysinfo and sched providers. +.SH OPTIONS +.TP +\-a +print all processes +.TP +\-T +print totals +.TP +\-V +don't print timestamps +.TP +\-t num +print top num lines only +.SH EXAMPLES +.TP +Default, print Kernel/Idle/Process time, 1 x 1 second sample, +# +.B cpudists +.PP +.TP +Print every 1 second, +# +.B cpudists +1 +.PP +.TP +Print all processes every 10 seconds, +# +.B cpudists +\-a 10 +.PP +.TP +Print top 8 lines every 5 seconds, +# +.B cpudists +\-at 8 5 +.PP +.SH FIELDS +.TP +IDLE +Idle time - CPU running idle thread +.TP +KERNEL +Kernel time - Kernel servicing interrupts, ... +.TP +PROCESS +Process time - PIDs running on the system +.TP +value +Time in nanoseconds +.TP +count +Number of occurrences that were at least this duration (ns) +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +cpudists will run once, unless a count is specified. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), vmstat(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/cputimes.1m b/cddl/contrib/dtracetoolkit/Man/man1m/cputimes.1m new file mode 100644 index 00000000000..bcafbb10658 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/cputimes.1m @@ -0,0 +1,87 @@ +.TH cputimes 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +cputimes \- print time by Kernel/Idle/Process. Uses DTrace. +.SH SYNOPSIS +.B cputimes +[\-ahTV] [\-t top] [interval [count]] +.SH DESCRIPTION +cputimes prints the CPU time consumed by the Kernel, Idle threads and +by Processes. + +This program accurately measures time consumed by the kernel, but in +doing so creates extra kernel load of it's own. This extra kernel +activity can be measured by running one cputimes and then another, and +comparing the difference in kernel consumed time. This method can be +used to estimate the load caused by other DTrace scripts. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sysinfo and sched providers. +.SH OPTIONS +.TP +\-a +print all processes +.TP +\-T +print totals +.TP +\-V +don't print timestamps +.TP +\-t num +print top num lines only +.SH EXAMPLES +.TP +Default, print Kernel/Idle/Process time, 1 x 1 second sample, +# +.B cputimes +.PP +.TP +Print every 1 second, +# +.B cputimes +1 +.PP +.TP +Print all processes every 10 seconds, +# +.B cputimes +\-a 10 +.PP +.TP +Print top 8 lines every 5 seconds, +# +.B cputimes +\-at 8 5 +.PP +.SH FIELDS +.TP +THREADS +Either KERNEL, IDLE, PROCESS or process name. +.TP +IDLE +Idle time - CPU running idle thread +.TP +KERNEL +Kernel time - Kernel servicing interrupts, ... +.TP +PROCESS +Process time - PIDs running on the system +.TP +TIME (ns) +Sum of the CPU time, ns (nanoseconds) +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +cputimes will run once, unless a count is specified. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), vmstat(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/cputypes.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/cputypes.d.1m new file mode 100644 index 00000000000..82b6fecdcca --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/cputypes.d.1m @@ -0,0 +1,54 @@ +.TH cputypes.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +cputypes.d \- list CPU types. Uses DTrace. +.SH SYNOPSIS +.B cputypes.d +.SH DESCRIPTION +This program lists CPU type information for the online CPUs +in the system. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable. +.SH EXAMPLES +.TP +List CPU types, +# +.B cputypes.d +.PP +.SH FIELDS +.TP +CPU +CPU ID +.TP +CHIP +chip ID +.TP +PSET +processor set ID +.TP +LGRP +latency group ID +.TP +CLOCK +clock speed, MHz +.TP +TYPE +CPU type +.TP +FPU +floating point identifier type +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +psrinfo(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/cpuwalk.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/cpuwalk.d.1m new file mode 100644 index 00000000000..16874d988e3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/cpuwalk.d.1m @@ -0,0 +1,53 @@ +.TH cpuwalk.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +cpuwalk.d \- Measure which CPUs a process runs on. Uses DTrace. +.SH SYNOPSIS +.B cpuwalk.d [duration] +.SH DESCRIPTION +This program is for multi-CPU servers, and can help identify if a process +is running on multiple CPUs concurrently or not. + +A duration may be specified in seconds. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Any +.SH STABILITY +stable. +.SH EXAMPLES +.TP +this runs until Ctrl\-C is hit, +# +.B cpuwalk.d +.PP +.TP +run for 5 seconds, +# +.B cpuwalk.d +5 +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +process name +.TP +value +CPU id +.TP +count +number of samples (sample at 100 hz) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +cpuwalk.d will run until Ctrl\-C is hit, or the duration specified +is reached. +.SH SEE ALSO +threaded.d(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/crash.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/crash.d.1m new file mode 100644 index 00000000000..368229b133e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/crash.d.1m @@ -0,0 +1,81 @@ +.TH crash.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +crash.d \- Crashed Application info. Uses DTrace. +.SH SYNOPSIS +.B crash.d +.SH DESCRIPTION +crash.d monitors for applications that crash. +When a crash via a SIGSEGV or SIGBUS is detected, a report of the +process state is printed out. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the proc provider, and uses /usr/bin/prun. +.SH FIELDS +.TP +Type +signal type +.TP +Program +execname of process +.TP +Args +argument listing of process +.TP +PID +process ID +.TP +TID +thread ID +.TP +LWPs +number of Light Weight Processes +.TP +PPID +parent process ID +.TP +UID +user ID +.TP +TaskID +task ID +.TP +ProjID +project ID +.TP +PoolID +pool ID +.TP +ZoneID +zone ID +.TP +zone +zone name +.TP +CWD +current working directory +.TP +errno +error number of last syscall +.PP +.SH EXAMPLES +.TP +Monitor for crashing applications. +# +.B crash.d +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +crash.d will run until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/creatbyproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/creatbyproc.d.1m new file mode 100644 index 00000000000..fe4f1236370 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/creatbyproc.d.1m @@ -0,0 +1,55 @@ +.TH creatbyproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +creatbyproc.d \- snoop creat()s by process name. Uses DTrace. +.SH SYNOPSIS +.B creatbyproc.d +.SH DESCRIPTION +creatbyproc.d is a DTrace OneLiner to print file creations as it +occurs, including the name of the process calling the open. + +This matches file creates from the creat() system call; not all +file creation occurs in this way, sometimes it is through open() +with a O_CREAT flag, this script will not monitor that activity. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH EXAMPLES +.TP +This prints process names and new pathnames until Ctrl\-C is hit. +# +.B creatbyproc.d +.PP +.SH FIELDS +.TP +CPU +The CPU that recieved the event +.TP +ID +A DTrace probe ID for the event +.TP +FUNCTION:NAME +The DTrace probe name for the event +.TP +remaining fields +The first is the name of the process, the second is the file pathname. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +creatbyproc.d will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/cswstat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/cswstat.d.1m new file mode 100644 index 00000000000..7256d5f315d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/cswstat.d.1m @@ -0,0 +1,51 @@ +.TH cswstat.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +cswstat.d \- context switch time stats. Uses DTrace. +.SH SYNOPSIS +.B cswstat.d +.SH DESCRIPTION +cswstat.d is a DTrace program to print context switch time +statistics. + +This program measures the time consumed during context switching, +and prints it with the number of context switches and the average +time. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sched provider. +.SH EXAMPLES +.TP +Print statistics every second, +# +.B cswstat.d +.PP +.SH FIELDS +.TP +TIME +The current time +.TP +NUM +Number of context switches in this sample +.TP +CSWTIME +Total time consumed context switching, us +.TP +AVGTIME +Average time for each context switch, us +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +cswstat.d will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +mpstat(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/dappprof.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dappprof.1m new file mode 100644 index 00000000000..de1b52a7fa2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/dappprof.1m @@ -0,0 +1,98 @@ +.TH dappprof 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +dappprof \- profile user and lib function usage. Uses DTrace. +.SH SYNOPSIS +.B dappprof +[\-acehoTU] [\-u lib] { \-p PID | command } +.SH DESCRIPTION +dappprof prints details on user and library call times for processes +as a summary style aggragation. By default the user fuctions are +traced, options can be used to trace library activity. Output can +include function counts, elapsed times and on cpu times. + +The elapsed times are interesting, to help identify functions +that take some time to complete (during which the process may +have slept). CPU time helps us identify syscalls that +are consuming CPU cycles to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the pid provider. +.SH OPTIONS +.TP +\-a +print all data +.TP +\-c +print function counts +.TP +\-e +print elapsed times, ns +.TP +\-o +print CPU times, ns +.TP +\-T +print totals +.TP +\-p PID +examine this PID +.TP +\-u lib +trace this library instead +.TP +\-U +trace all library and user functions +.PP +.SH EXAMPLES +.TP +run and examine the "df \-h" command, +# +.B dappprof +df \-h +.PP +.TP +print elapsed times, on-cpu times and counts for "df \-h", +# +.B dappprof +-ceo df \-h +.TP +print elapsed times for PID 1871, +# +.B dappprof +\-p 1871 +.PP +.TP +print all data for PID 1871, +# +.B dappprof +\-ap 1871 +.PP +.SH FIELDS +.TP +CALL +Function call name +.TP +ELAPSED +Total elapsed time, nanoseconds +.TP +CPU +Total on-cpu time, nanoseconds +.TP +COUNT +Number of occurrences +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +dappprof will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dapptrace(1M), dtrace(1M), apptrace(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/dapptrace.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dapptrace.1m new file mode 100644 index 00000000000..c439f05380c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/dapptrace.1m @@ -0,0 +1,112 @@ +.TH dapptrace 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +dapptrace \- trace user and library function usage. Uses DTrace. +.SH SYNOPSIS +.B dapptrace +[\-acdeFlhoU] [\-u lib] { \-p PID | command } +.SH DESCRIPTION +dapptrace prints details on user and library function calls. By +default it traces user functions only, options can be used to +trace library activity. + +Of particular interest is the elapsed times and on cpu times, which +can identify both function calls that are slow to complete, and those +which are consuming CPU cycles. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the pid provider. +.SH OPTIONS +.TP +\-a +print all details +.TP +\-b bufsize +dynamic variable buffer size. Increase this if you notice dynamic +variable drop errors. The default is "4m" for 4 megabytes per CPU. +.TP +\-c +print function call counts +.TP +\-d +print relative timestamps, us +.TP +\-e +print elapsed times, us +.TP +\-F +print flow indentation +.TP +\-l +force printing of pid/lwpid per line +.TP +\-o +print on-cpu times, us +.TP +\-p PID +examine this PID +.TP +\-u lib +trace this library instead +.TP +\-U +trace all library and user functions +.PP +.SH EXAMPLES +.TP +run and examine the "df -h" command, +# +.B dapptrace +df -h +.PP +.TP +examine PID 1871, +# +.B dapptrace +\-p 1871 +.PP +.TP +print using flow indents, +# +.B dapptrace +\-Fp 1871 +.PP +.TP +print elapsed and CPU times, +# +.B dapptrace +\-eop 1871 +.PP +.SH FIELDS +.TP +PID/LWPID +Process ID / Lightweight Process ID +.TP +RELATIVE +relative timestamps to the start of the thread, us (microseconds) +.TP +ELAPSD +elapsed time for this system call, us +.TP +CPU +on-cpu time for this system call, us +.TP +CALL(args) +function call name, with some arguments in hexadecimal +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +dapptrace will run forever until Ctrl\-C is hit, or if a command was +executed dapptrace will finish when the command ends. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dappprof(1M), dtrace(1M), apptrace(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/dexplorer.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dexplorer.1m new file mode 100644 index 00000000000..10683a93654 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/dexplorer.1m @@ -0,0 +1,64 @@ +.TH dexplorer 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +dexplorer \- run a series of scripts and archive output. Uses DTrace. +.SH SYNOPSIS +.B dexplorer +.SH DESCRIPTION +This program automatically runs a collection of DTrace scripts to examine +many areas of the system, and places the output in a meaningful directory +structure that is tar'd and gzip'd. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH OPTIONS +.TP +\-q +quiet mode +.TP +\-y +"yes", don't prompt for confirmation +.TP +\-D +don't delete output dir +.TP +\-T +don't create output tar.gz +.TP +\-d outputdir +output directory +.TP +\-i interval +interval for each sample +.PP +.SH EXAMPLES +.TP +Create output file in current directory, +# +.B dexplorer +.TP +Don't prompt +# +.B dexplorer +\-y +.TP +Leave expanded directories, don't archive and compress, +# +.B dexplorer +\-DT +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/diskhits.1m b/cddl/contrib/dtracetoolkit/Man/man1m/diskhits.1m new file mode 100644 index 00000000000..e8b9c57e1bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/diskhits.1m @@ -0,0 +1,46 @@ +.TH diskhits 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +diskhits \- disk access by file offset. Uses DTrace. +.SH SYNOPSIS +.B diskhits pathname +.SH DESCRIPTION +This prints how a file was accessed, the locations on a distribution plot. +This is for the cache misses only - the file activity that resulted in +disk events. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the io provider. +.SH EXAMPLES +.TP +Sample /var/adm/messages disk activity, +# +.B diskhits /var/adm/messages +.PP +.SH FIELDS +.TP +Location (KB) +the file offset of the disk activity, Kbytes +.TP +Size (KB) +size of the disk activity, Kbytes +.TP +Total RW +Total disk activity, reads + writes +.PP +.SH BASED ON +/usr/demo/dtrace/applicat.d +.PP +.SH DOCUMENTATION +DTrace Guide "io Provider" chapter (docs.sun.com) + +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +diskhits will sample until Ctrl\-C is hit. +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/dispqlen.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dispqlen.d.1m new file mode 100644 index 00000000000..dcc08200d8f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/dispqlen.d.1m @@ -0,0 +1,36 @@ +.TH dispqlen.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +dispqlen.d \- dispatcher queue length by CPU. Uses DTrace. +.SH SYNOPSIS +.B dispqlen.d +.SH DESCRIPTION +The dispatcher queue length is an indication of CPU saturation. +It is not an indicatior of utilisation - the CPUs may or may not be +utilised when the dispatcher queue reports a length of zero. + +This script measures this activity by sampling at 1000 Hertz per CPU. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - walks private kernel structs. +.SH EXAMPLES +.TP +Print dispatcher queue length by CPU. +# +.B dispqlen.d +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +dispqlen.d will sample until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +uptime(1), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/dnlcps.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dnlcps.d.1m new file mode 100644 index 00000000000..482fd0747cc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/dnlcps.d.1m @@ -0,0 +1,51 @@ +.TH dnlcps.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +dnlcps.d \- DNLC stats by process. Uses DTrace. +.SH SYNOPSIS +.B dnlcps.d +.SH DESCRIPTION +The DNLC is the Directory Name Lookup Cache. Filename lookups often +return a hit from here, before needing to traverse the regular file +system cache or go to disk. + +dnlcps.d prints DNLC statistics by process. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Sample until Ctrl\-C is hit then print report, +# +.B dnlcps.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +command name +.TP +value +0 == miss, 1 == hit +.TP +count +number of occurrences +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +dnlcps.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/dnlcsnoop.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dnlcsnoop.d.1m new file mode 100644 index 00000000000..cd9ac7be946 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/dnlcsnoop.d.1m @@ -0,0 +1,52 @@ +.TH dnlcsnoop.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +dnlcsnoop.d \- snoop DNLC activity. Uses DTrace. +.SH SYNOPSIS +.B dnlcsnoop.d +.SH DESCRIPTION +The DNLC is the Directory Name Lookup Cache. Filename lookups often +return a hit from here, before needing to traverse the regular file +system cache or go to disk. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Sample until Ctrl\-C is hit then print report, +# +.B dnlcsnoop.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +command name +.TP +TIME +Elapsed time for lookup, us +.TP +HIT +DNLC hit Y/N +.TP +PATH +Path for DNLC lookup +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +dnlcsnoop.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/dnlcstat.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dnlcstat.1m new file mode 100644 index 00000000000..146c39dc1d9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/dnlcstat.1m @@ -0,0 +1,57 @@ +.TH dnlcstat 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +dnlcstat \- DNLC statistics. Uses DTrace. +.SH SYNOPSIS +.B dnlcstat +[interval [count]] +.SH DESCRIPTION +The DNLC is the Directory Name Lookup Cache. Filename lookups often +return a hit from here, before needing to traverse the regular file +system cache or go to disk. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Print DNLC statistics every second, +# +.B dnlcstat +.TP +Print every 5 seconds, 6 times, +# +.B dnlcstat +5 6 +.PP +.SH FIELDS +.TP +%hit +hit percentage for this sample +.TP +hit +number of DNLC hits in this sample +.TP +miss +number of DNLC misses in this sample +.PP +.SH NOTES +See the CacheKit, http://www.brendangregg.com/cachekit.html for a version +of dnlcstat written in Perl (Kstat) that uses much less CPU. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +dnlcstat will run until Ctrl\-C is hit, or until the count argument +has been satisfied. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/dtruss.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dtruss.1m new file mode 100644 index 00000000000..7837f0e7b5e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/dtruss.1m @@ -0,0 +1,123 @@ +.TH dtruss 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +dtruss \- process syscall details. Uses DTrace. +.SH SYNOPSIS +.B dtruss +[\-acdeflhoLs] [\-t syscall] { \-p PID | \-n name | command } +.SH DESCRIPTION +dtruss prints details on process system calls. It is like a DTrace +version of truss, and has been designed to be less intrusive than +truss. + +Of particular interest is the elapsed times and on cpu times, which +can identify both system calls that are slow to complete, and those +which are consuming CPU cycles. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH OPTIONS +.TP +\-a +print all details +.TP +\-b bufsize +dynamic variable buffer size. Increase this if you notice dynamic +variable drop errors. The default is "4m" for 4 megabytes per CPU. +.TP +\-c +print system call counts +.TP +\-d +print relative timestamps, us +.TP +\-e +print elapsed times, us +.TP +\-f +follow children as they are forked +.TP +\-l +force printing of pid/lwpid per line +.TP +\-L +don't print pid/lwpid per line +.TP +\-n name +examine processes with this name +.TP +\-o +print on-cpu times, us +.TP +\-s +print stack backtraces +.TP +\-p PID +examine this PID +.TP +\-t syscall +examine this syscall only +.PP +.SH EXAMPLES +.TP +run and examine the "df -h" command +# +.B dtruss +df -h +.PP +.TP +examine PID 1871 +# +.B dtruss +\-p 1871 +.PP +.TP +examine all processes called "tar" +# +.B dtruss +\-n tar +.PP +.TP +run test.sh and follow children +# +.B dtruss +\-f test.sh +.TP +run the "date" command and print elapsed and on cpu times, +# +.B dtruss +\-eo date +.PP +.SH FIELDS +.TP +PID/LWPID +Process ID / Lightweight Process ID +.TP +RELATIVE +relative timestamps to the start of the thread, us (microseconds) +.TP +ELAPSD +elapsed time for this system call, us +.TP +CPU +on-cpu time for this system call, us +.TP +SYSCALL(args) +system call name, with arguments (some may be evaluated) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +dtruss will run forever until Ctrl\-C is hit, or if a command was +executed dtruss will finish when the command ends. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +procsystime(1M), dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/dvmstat.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dvmstat.1m new file mode 100644 index 00000000000..20fa955e0d7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/dvmstat.1m @@ -0,0 +1,93 @@ +.TH dvmstat 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +dvmstat \- vmstat by PID/name/command. Uses DTrace. +.SH SYNOPSIS +.B dvmstat +{ \-p PID | \-n name | command } +.SH DESCRIPTION +This program provides vmstat like data for one particular PID, a +process name, or when running a command. It prints statistics +every second. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the vminfo provider. +.SH OPTIONS +.TP +\-p PID +examine this Process ID +.TP +\-n name +examine processes with this name +.PP +.SH EXAMPLES +.TP +examine PID 1871, +# +.B dvmstat +\-p 1871 +.TP +examine processes called "tar", +# +.B dvmstat +\-n tar +.TP +run and examine "df -h", +# +.B dvmstat +df -h +.PP +.SH FIELDS +.TP +re +page reclaims, Kbytes +.TP +maj +major faults, Kbytes +.TP +mf +minor faults, Kbytes +.TP +fr +page frees, Kbytes +.TP +epi +executable page ins, Kbytes +.TP +epo +executable page outs, Kbytes +.TP +api +anonymous page ins, Kbytes +.TP +apo +anonymous page outs, Kbytes +.TP +fpi +filesystem page ins, Kbytes +.TP +fpo +filesystem page outs, Kbytes +.TP +sy +system calls, number +.PP +.SH NOTES +Most of the statistics are in units of kilobytes, unlike the +original vmstat command which sometimes uses pages. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +dvmstat will run until Ctrl\-C is hit, or the command it is +examining ends. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), vmstat(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/errinfo.1m b/cddl/contrib/dtracetoolkit/Man/man1m/errinfo.1m new file mode 100644 index 00000000000..6b63e521119 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/errinfo.1m @@ -0,0 +1,85 @@ +.TH errinfo 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +errinfo \- print errno for syscall fails. Uses DTrace. +.SH SYNOPSIS +.B errinfo +[\-a|\-A|\-hsvZ] [\-c command] +.SH DESCRIPTION +errinfo snoops syscall failures and prints the errno value and +description of the error number. + +This program can help determine if applications are silently +failing, providing some details on the cause. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH OPTIONS +.TP +\-c +counts - print an aggregate style report containing a +frequency count of errors +.TP +\-p PID +examine this PID only +.TP +\-n name +examine processes with ths name only (eg, "ls") +.SH EXAMPLES +.TP +Default output, print errors as they occur, +# +.B errinfo +.PP +.TP +Print a frequency count report, +# +.B errinfo +\-c +.PP +.TP +Snoop errors as they occur for "ssh" processes, +# +.B errinfo +\-n ssh +PP +.TP +Snoop errors for PID 81 only, +# +.B errinfo +\-p 81 +.PP +.SH FIELDS +.TP +EXEC +Program name (truncated) +.TP +SYSCALL +System call name +.TP +ERR +Value of errno +.TP +DESC +Description of errno message +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +errinfo will run forever until Ctrl\-C is hit. +.SH FILES +.TP +/usr/include/sys/errno.h +Contains the full descriptions for the error numbers. +.PP +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/execsnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/execsnoop.1m new file mode 100644 index 00000000000..a7114cec58d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/execsnoop.1m @@ -0,0 +1,108 @@ +.TH execsnoop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +execsnoop \- snoop new process execution. Uses DTrace. +.SH SYNOPSIS +.B execsnoop +[\-a|\-A|\-ejhsvZ] [\-c command] +.SH DESCRIPTION +execsnoop prints details of new processes as they are executed. +Details such as UID, PID and argument listing are printed out. + +This program is very useful to examine short lived processes that would +not normally appear in a prstat or "ps -ef" listing. Sometimes +applications will run hundreds of short lived processes in their +normal startup cycle, a behaviour that is easily monitored with execsnoop. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH OPTIONS +.TP +\-a +print all data +.TP +\-A +dump all data, space delimited +.TP +\-e +safe output, parseable. This prevents the ARGS field containing "\\n"s, +to assist postprocessing. +.TP +\-j +print project ID +.TP +\-s +print start time, us +.TP +\-v +print start time, string +.TP +\-Z +print zonename +.TP +\-c command +command name to snoop +.SH EXAMPLES +.TP +Default output, print processes as they are executed, +# +.B execsnoop +.TP +Print human readable timestamps, +# +.B execsnoop +\-v +.TP +Print zonename, +# +.B execsnoop +\-Z +.TP +Snoop this command only, +# +.B execsnoop +\-f ls +.PP +.SH FIELDS +.TP +UID +User ID +.TP +PID +Process ID +.TP +PPID +Parent Process ID +.TP +COMM +command name for the process +.TP +ARGS +argument listing for the process +.TP +ZONE +zonename +.TP +PROJ +project ID +.TP +TIME +timestamp for the exec event, us +.TP +STRTIME +timestamp for the exec event, string +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +execsnoop will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/fddist.1m b/cddl/contrib/dtracetoolkit/Man/man1m/fddist.1m new file mode 100644 index 00000000000..990d7617438 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/fddist.1m @@ -0,0 +1,63 @@ +.TH fddist 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +fddist \- file descriptor usage distributions. Uses DTrace. +.SH SYNOPSIS +.B fddist [\-r|\-w] +.SH DESCRIPTION +This prints distributions for read and write events by file descriptor, +by process. This can be used to determine which file descriptor a +process is doing the most I/O with. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH OPTIONS +.TP +\-r +reads only +.TP +\-w +writes only +.PP +.SH EXAMPLES +.TP +Sample both read and write activity, +# +.B fddist +.TP +Sample reads only, +# +.B fddist +\-r +.PP +.SH FIELDS +.TP +EXEC +process name +.TP +PID +process ID +.TP +value +file descriptor +.TP +count +number of events +.PP +.SH BASED ON +/usr/demo/dtrace/lquantize.d +.PP +.SH DOCUMENTATION +DTrace Guide "Aggregations" chapter (docs.sun.com) + +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +fddist will sample until Ctrl\-C is hit. +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/filebyproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/filebyproc.d.1m new file mode 100644 index 00000000000..23b56481662 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/filebyproc.d.1m @@ -0,0 +1,56 @@ +.TH filebyproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +filebyproc.d \- snoop opens by process name. Uses DTrace. +.SH SYNOPSIS +.B filebyproc.d +.SH DESCRIPTION +filebyproc.d is a DTrace OneLiner to print file pathnames as they are +opened, including the name of the process calling the open. +A line will be printed regardless of whether the open is actually +successful or not. + +This is useful to learn which files applications are attempting to +open, such as config files, database files, log files, etc. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH EXAMPLES +.TP +This prints new process name and pathnames until Ctrl\-C is hit. +# +.B filebyproc.d +.PP +.SH FIELDS +.TP +CPU +The CPU that recieved the event +.TP +ID +A DTrace probe ID for the event +.TP +FUNCTION:NAME +The DTrace probe name for the event +.TP +remaining fields +The first is the name of the process, the second is the file pathname. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +filebyproc.d will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +opensnoop(1M), dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/fspaging.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/fspaging.d.1m new file mode 100644 index 00000000000..6911ac5582d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/fspaging.d.1m @@ -0,0 +1,88 @@ +.TH fspaging.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +fspaging.d \- file system read/write and paging tracing. Uses DTrace. +.SH SYNOPSIS +.B fspaging.d +.SH DESCRIPTION +This traces file related activity: system call reads and writes, +vnode logical read and writes (fop), vnode putpage and getpage activity, +and disk I/O. It can be used to examine the behaviour of each I/O +layer, from the syscall interface to what the disk is doing. Behaviour +such as read-ahead, and max I/O size breakup can be observed. + +This is a verbose version of fsrw.d, as this also traces paging activity. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Trace file system read/write/paging events, +# +.B fspaging.d +.PP +.SH FIELDS +.TP +Event +traced event (see EVENTS below) +.TP +Device +device, for disk I/O +.TP +RW +either Read or Write +.TP +Size +size of I/O in bytes +.TP +Offset +offset of I/O in kilobytes +.TP +Path +path to file on disk +.PP +.SH EVENTS +.TP +sc-read +system call read +.TP +sc-write +system call write +.TP +fop_read +logical read +.TP +fop_write +logical write +.TP +fop_getpage +logical get page +.TP +fop_putpage +logical put page +.TP +disk_io +physical disk I/O +.TP +disk_ra +physical disk I/O, read ahead +.PP +.SH IDEA +Richard McDougall, Solaris Internals 2nd Ed, FS Chapter. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +fspaging.d will trace until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +fsrw.d(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/fsrw.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/fsrw.d.1m new file mode 100644 index 00000000000..4389c211f06 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/fsrw.d.1m @@ -0,0 +1,80 @@ +.TH fsrw.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +fsrw.d \- file system read/write event tracing. Uses DTrace. +.SH SYNOPSIS +.B fsrw.d +.SH DESCRIPTION +This traces file related activity: system call reads and writes, +vnode logical read and writes (fop), and disk I/O. It can be used +to examine the behaviour of each I/O layer, from the syscall +interface to what the disk is doing. Behaviour such as read-ahead, and +max I/O size breakup can be observed. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Trace file system read/write events, +# +.B fsrw.d +.PP +.SH FIELDS +.TP +Event +traced event (see EVENTS below) +.TP +Device +device, for disk I/O +.TP +RW +either Read or Write +.TP +Size +size of I/O in bytes +.TP +Offset +offset of I/O in kilobytes +.TP +Path +path to file on disk +.PP +.SH EVENTS +.TP +sc-read +system call read +.TP +sc-write +system call write +.TP +fop_read +logical read +.TP +fop_write +logical write +.TP +disk_io +physical disk I/O +.TP +disk_ra +physical disk I/O, read ahead +.PP +.SH IDEA +Richard McDougall, Solaris Internals 2nd Ed, FS Chapter. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +fsrw.d will trace until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +fspaging.d(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/guess.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/guess.d.1m new file mode 100644 index 00000000000..4c6d2e2ea47 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/guess.d.1m @@ -0,0 +1,37 @@ +.TH guess.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +guess.d \- guessing game. Uses DTrace. +.SH SYNOPSIS +.B guess.d +.SH DESCRIPTION +This is written to demonstrate this language versus the same program +written in other languages. + +See http://www.brendangregg.com/guessinggame.html + +It exists in the DTraceToolkit as a curiosity, rather than something +actually useful. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH EXAMPLES +.TP +Play the game, +# +.B guess.d +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +guess.d will only exit when you win the game. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/hotkernel.1m b/cddl/contrib/dtracetoolkit/Man/man1m/hotkernel.1m new file mode 100644 index 00000000000..49772b6ae1e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/hotkernel.1m @@ -0,0 +1,39 @@ +.TH hotkernel 1m "$Date:: 2007-09-24 #$" "USER COMMANDS" +.SH NAME +hotkernel - sample on-CPU kernel-level functions and modules. +.SH SYNOPSIS +.B hotkernel +[\-hm] +.SH DESCRIPTION +This samples the on-CPU function at 1001 Hertz, for a simple yet +effective kernel-level profiling tool for sampling exclusive function time. +The output will identify which function is on the CPU the most - which is +the hottest. See Notes/ALLexclusive_notes.txt for an explanation of +exclusive time. +.SH OS +Solaris +.SH STABILITY +stable - Written using Perl and DTrace (Solaris 10 03/05) +.SH EXAMPLES +.TP +Sample kernel functions, +# +.B hotkernel +.PP +.TP +Sample kernel modules, +# +.B hotkernel +\-m +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +hotkernel will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M), hotuser(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/hotspot.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/hotspot.d.1m new file mode 100644 index 00000000000..a99a589cc92 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/hotspot.d.1m @@ -0,0 +1,51 @@ +.TH hotspot.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +hotspot.d \- print disk event by location. Uses DTrace. +.SH SYNOPSIS +.B hotspot.d +.SH DESCRIPTION +hotspot.d is a simple DTrace script to determine if disk activity is +occuring in the one place - a "hotspot". This helps us understand the +system's usage of a disk, it does not imply that the existance or not +of a hotspot is good or bad (often may be good, less seeking). + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the io provider. +.SH EXAMPLES +.TP +Sample until Ctrl\-C is hit then print report, +# +.B hotspot.d +.PP +.SH FIELDS +.TP +Disk +disk instance name +.TP +Major +driver major number +.TP +Minor +driver minor number +.TP +value +location of disk event, megabytes +.TP +count +number of events +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +hotspot.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/hotuser.1m b/cddl/contrib/dtracetoolkit/Man/man1m/hotuser.1m new file mode 100644 index 00000000000..ab26523755c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/hotuser.1m @@ -0,0 +1,44 @@ +.TH hotuser 1m "$Date:: 2007-09-24 #$" "USER COMMANDS" +.SH NAME +hotuser - sample on-CPU user-level functions and libraries. +.SH SYNOPSIS +.B hotuser +[\-hl] { \-c command | \-p PID } +.SH DESCRIPTION +This samples the on-CPU function at 1001 Hertz, for a simple yet +effective user-level profiling tool for sampling exclusive function time. +The output will identify which function is on the CPU the most - which +is the hottest. See Notes/ALLexclusive_notes.txt for an explanation of +exclusive time. +.SH OS +Solaris +.SH STABILITY +stable - Written using Perl and DTrace (Solaris 10 03/05) +.SH EXAMPLES +.TP +Sample user functions from PID 81, +# +.B hotuser +\-p 81 +.TP +Sample user libraries from PID 81, +# +.B hotuser +\-lp 81 +.TP +Sample Xorg, +# +.B hotuser +`pgrep \-n Xorg` +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +hotuser will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M), hotkernel(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/httpdstat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/httpdstat.d.1m new file mode 100644 index 00000000000..5dd0a3fa96a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/httpdstat.d.1m @@ -0,0 +1,67 @@ +.TH httpdstat.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +httpdstat.d \- realtime httpd statistics. Uses DTrace. +.SH SYNOPSIS +.B httpdstat.d +[interval [count]] +.SH DESCRIPTION +This prints connection statistics for "httpd" processes, such as those +from an Apache web server. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH EXAMPLES +.TP +Print statistics every second, +# +.B httpdstat.d +.TP +Print every 5 seconds, 6 times, +# +.B httpdstat.d +5 6 +.PP +.SH FIELDS +.TP +TIME +time, string +.TP +NUM +number of connections +.TP +GET +number of GETs +.TP +POST +number of POSTs +.TP +HEAD +number of HEADs +.TP +TRACE +number of TRACEs +.PP +.SH NOTES +All statistics are printed as a value per interval. + +This version does not process subsequent operations on keepalives. +.PP +.SH IDEA +Ryan Matteson +(who first wrote a solution to this). +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +httpdstat.d will run until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/icmpstat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/icmpstat.d.1m new file mode 100644 index 00000000000..be4b87ae9f9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/icmpstat.d.1m @@ -0,0 +1,47 @@ +.TH icmpstat.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +icmpstat.d \- print ICMP statistics. Uses DTrace. +.SH SYNOPSIS +.B icmpstat.d +.SH DESCRIPTION +icmpstat.d is a DTrace program to print ICMP statistics every second, +retrieved from the MIB provider. This is a simple script to demonstrate the +ability to trace ICMP events. + +The ICMP statistics are documented in the mib2_icmp struct +in /usr/include/inet/mib2.h; and also in the mib provider +chapter of the DTrace Guide, found at +http://docs.sun.com/db/doc/817-6223. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the mib provider. +.SH EXAMPLES +.TP +Print statistics every second, +# +.B icmpstat.d +.PP +.SH FIELDS +.TP +STATISTIC +ICMP statistic name +.TP +VALUE +total of statistic during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +icmpstat.d will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/intbycpu.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/intbycpu.d.1m new file mode 100644 index 00000000000..79314dc4c26 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/intbycpu.d.1m @@ -0,0 +1,48 @@ +.TH intbycpu.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +intbycpu.d \- interrupts by CPU. Uses DTrace. +.SH SYNOPSIS +.B intbycpu.d +.SH DESCRIPTION +intbycpu.d is based on a DTrace OneLiner to a report of the number of +interrupts by CPU. + +The intrstat(1M) command can be used for further analysis +of interrputs. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sdt provider interrupt probes. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B intbycpu.d +.PP +.SH FIELDS +.TP +CPU +This is the CPU id. +.TP +INTERRUPTS +This is the number of interrputs received in the sample. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +intbycpu.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +intrstat(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/intoncpu.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/intoncpu.d.1m new file mode 100644 index 00000000000..ec52b815236 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/intoncpu.d.1m @@ -0,0 +1,42 @@ +.TH intoncpu.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +intoncpu.d \- print interrput on-cpu usage. Uses DTrace. +.SH SYNOPSIS +.B intoncpu.d +.SH DESCRIPTION +This prints a distribution of the on-cpu time for interrput threads. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sdt provider interrupt probes. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B intoncpu.d +.PP +.SH FIELDS +.TP +value +Time interrupt thread was on-cpu, ns +.TP +count +Number of occurrences of at least this time +.PP +.SH BASED ON +/usr/demo/dtrace/intr.d +.PP +.SH DOCUMENTATION +DTrace Guide "sdt Provider" chapter (docs.sun.com) + +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +intoncpu.d will sample until Ctrl\-C is hit. +.SH SEE ALSO +intrstat(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/inttimes.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/inttimes.d.1m new file mode 100644 index 00000000000..bc6d989aafd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/inttimes.d.1m @@ -0,0 +1,43 @@ +.TH inttimes.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +inttimes.d \- print interrput on-cpu time total. Uses DTrace. +.SH SYNOPSIS +.B inttimes.d +.SH DESCRIPTION +This prints the total time each driver instance has spent servicing +interrupts. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sdt provider interrupt probes. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B inttimes.d +.PP +.SH FIELDS +.TP +DEVICE +instance name of the device driver +.TP +TIME (ns) +sum of time spent servicing interrupt (nanoseconds) +.PP +.SH BASED ON +/usr/demo/dtrace/intr.d +.PP +.SH DOCUMENTATION +DTrace Guide "sdt Provider" chapter (docs.sun.com) + +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +inttimes.d will sample until Ctrl\-C is hit. +.SH SEE ALSO +intrstat(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/iofile.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/iofile.d.1m new file mode 100644 index 00000000000..fd3016dd567 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/iofile.d.1m @@ -0,0 +1,49 @@ +.TH iofile.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +iofile.d \- I/O wait time by file and process. Uses DTrace. +.SH SYNOPSIS +.B iofile.d +.SH DESCRIPTION +This prints the total I/O wait times for each filename by process. +This can help determine why an application is performing poorly by +identifying which file they are waiting on, and the total times. +Both disk and NFS I/O are measured. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the io provider. +.SH EXAMPLES +.TP +Sample until Ctrl\-C is hit then print report, +# +.B iofile.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +process name +.TP +TIME +total wait time for disk events, us +.TP +FILE +file pathname +.PP +.SH BASED ON +/usr/demo/dtrace/iocpu.d +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +iofile.d will sample until Ctrl\-C is hit. +.SH SEE ALSO +iosnoop(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/iofileb.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/iofileb.d.1m new file mode 100644 index 00000000000..56ca3acc83a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/iofileb.d.1m @@ -0,0 +1,46 @@ +.TH iofileb.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +iofileb.d \- I/O bytes by file and process. Uses DTrace. +.SH SYNOPSIS +.B iofileb.d +.SH DESCRIPTION +This prints a summary of requested disk activity by pathname, +providing totals of the I/O events in bytes. It is a companion to the +iofile.d script - which prints in terms of I/O wait time, not bytes. +I/O wait time is a better metric for understanding performance issues. +Both disk and NFS I/O are measured. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the io provider. +.SH EXAMPLES +.TP +Sample until Ctrl\-C is hit then print report, +# +.B iofileb.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +process name +.TP +KB +kilobytes of disk I/O +.TP +FILE +file pathname +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +iofileb.d will sample until Ctrl\-C is hit. +.SH SEE ALSO +iofile.d(1M), iosnoop(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/iopattern.1m b/cddl/contrib/dtracetoolkit/Man/man1m/iopattern.1m new file mode 100644 index 00000000000..6898f82672a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/iopattern.1m @@ -0,0 +1,112 @@ +.TH iopattern 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +iopattern \- print disk I/O pattern. Uses DTrace. +.SH SYNOPSIS +.B iopattern +[\-v] [\-d device] [\-f filename] [\-m mount_point] [interval [count]] +.SH DESCRIPTION +This prints details on the I/O access pattern for the disks, such as +percentage of events that were of a random or sequential nature. +By default totals for all disks are printed. + +An event is considered random when the heads seek. This program prints +the percentage of events that are random. The size of the seek is not +measured - it's either random or not. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the io provider. +.SH OPTIONS +.TP +\-v +print timestamp, string +.TP +\-d device +instance name to snoop (eg, dad0) +.TP +\-f filename +full pathname of file to snoop +.TP +\-m mount_point +mountpoint for filesystem to snoop +.SH EXAMPLES +.TP +Default output, print I/O summary every 1 second, +# +.B iopattern +.PP +.TP +Print 10 second samples, +# +.B iopattern +10 +.PP +.TP +Print 12 x 5 second samples, +# +.B iopattern +5 12 +.PP +.TP +Snoop events on the root filesystem only, +# +.B iopattern +\-m / +.PP +.SH FIELDS +.TP +%RAN +percentage of events of a random nature +.TP +%SEQ +percentage of events of a sequential nature +.TP +COUNT +number of I/O events +.TP +MIN +minimum I/O event size +.TP +MAX +maximum I/O event size +.TP +AVG +average I/O event size +.TP +KR +total kilobytes read during sample +.TP +KW +total kilobytes written during sample +.TP +DEVICE +device name +.TP +MOUNT +mount point +.TP +FILE +filename (basename) for I/O operation +.TP +TIME +timestamp, string +.PP +.SH IDEA +Ryan Matteson +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +iopattern will run forever until Ctrl\-C is hit, or the +specified count is reached. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +iosnoop(1M), iotop(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/iopending.1m b/cddl/contrib/dtracetoolkit/Man/man1m/iopending.1m new file mode 100644 index 00000000000..c31d967e6ee --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/iopending.1m @@ -0,0 +1,89 @@ +.TH iopending 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +iopending \- plot number of pending disk events. Uses DTrace. +.SH SYNOPSIS +.B iopending +[\-c] [\-d device] [\-f filename] [\-m mount_point] [interval [count]] +.SH DESCRIPTION +This samples the number of disk events that are pending and plots a +distribution graph. By doing this the +"serialness" or "parallelness" of disk behaviour can be distinguished. +A high occurance of a pending value of more than 1 is an indication of +saturation. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the io provider. +.SH OPTIONS +.TP +\-c +clear screen +.TP +\-d device +instance name to snoop (eg, dad0) +.TP +\-f filename +full pathname of file to snoop +.TP +\-m mount_point +mountpoint for filesystem to snoop +.SH EXAMPLES +.TP +Default output, print I/O summary every 1 second, +# +.B iopending +.PP +.TP +Print 10 second samples, +# +.B iopending +10 +.PP +.TP +Print 12 x 5 second samples, +# +.B iopending +5 12 +.PP +.TP +Snoop events on the root filesystem only, +# +.B iopending +\-m / +.PP +.SH FIELDS +.TP +value +number of pending events, 0 == idle +.TP +count +number of samples @ 1000 Hz +.TP +load +1 min load average +.TP +disk_r +total disk read Kb for sample +.TP +disk_w +total disk write Kb for sample +.PP +.SH IDEA +Dr Rex di Bona +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +iopending will run forever until Ctrl\-C is hit, or the +specified count is reached. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +iosnoop(1M), iotop(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/iosnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/iosnoop.1m new file mode 100644 index 00000000000..6e9058dabf3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/iosnoop.1m @@ -0,0 +1,167 @@ +.TH iosnoop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +iosnoop \- snoop I/O events as they occur. Uses DTrace. +.SH SYNOPSIS +.B iosnoop +[\-a|\-A|\-Deghinostv] [\-d device] [\-f filename] [\-m mount_point] +[\-n name] [\-p PID] +.SH DESCRIPTION +iosnoop prints I/O events as they happen, with useful details such +as UID, PID, block number, size, filename, etc. + +This is useful to determine the process responsible for +using the disks, as well as details on what activity the process +is requesting. Behaviour such as random or sequential I/O can +be observed by reading the block numbers. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the io provider. +.SH OPTIONS +.TP +\-a +print all data +.TP +\-A +dump all data, space delimited +.TP +\-D +print time delta, us (elapsed) +.TP +\-e +print device name +.TP +\-i +print device instance +.TP +\-n +print major and minor numbers +.TP +\-o +print disk delta time, us +.TP +\-s +print start time, us +.TP +\-t +print completion time, us +.TP +\-v +print completion time, string +.TP +\-d device +instance name to snoop (eg, dad0) +.TP +\-f filename +full pathname of file to snoop +.TP +\-m mount_point +mountpoint for filesystem to snoop +.TP +\-n name +process name +.TP +\-p PID +process ID +.PP +.SH EXAMPLES +.TP +Default output, print I/O activity as it occurs, +# +.B iosnoop +.PP +.TP +Print human readable timestamps, +# +.B iosnoop +\-v +.PP +.TP +Print major and minor numbers, +# +.B iosnoop +\-n +.PP +.TP +Snoop events on the root filesystem only, +# +.B iosnoop +\-m / +.PP +.SH FIELDS +.TP +UID +User ID +.TP +PID +Process ID +.TP +PPID +Parent Process ID +.TP +COMM +command name for the process +.TP +ARGS +argument listing for the process +.TP +SIZE +size of the operation, bytes +.TP +BLOCK +disk block for the operation (location. relative to this filesystem. +more useful with the -n option to print major and minor numbers) +.TP +STIME +timestamp for the disk request, us +.TP +TIME +timestamp for the disk completion, us +.TP +DELTA +elapsed time from request to completion, us (this is the elapsed +time from the disk request (strategy) to the disk completion (iodone)) +.TP +DTIME +time for disk to complete request, us (this is the time for the +disk to complete that event since it's last event (time between iodones), +or, the time to the strategy if the disk had been idle) +.TP +STRTIME +timestamp for the disk completion, string +.TP +DEVICE +device name +.TP +INS +device instance number +.TP +D +direction, Read or Write +.TP +MOUNT +mount point +.TP +FILE +filename (basename) for I/O operation +.PP +.SH NOTES +When filtering on PID or process name, be aware that poor disk event +times may be due to events that have been filtered away, for example +another process that may be seeking the disk heads elsewhere. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +iosnoop will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +iotop(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/iotop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/iotop.1m new file mode 100644 index 00000000000..80522436ec8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/iotop.1m @@ -0,0 +1,154 @@ +.TH iotop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +iotop \- display top disk I/O events by process. Uses DTrace. +.SH SYNOPSIS +.B iotop +[\-C] [\-D|\-o|\-P] [\-j|\-Z] [\-d device] [\-f filename] +[\-m mount_point] [\-t top] [interval [count]] +.SH DESCRIPTION +iotop tracks disk I/O by process, and prints a summary report that +is refreshed every interval. + +This is measuring disk events that have made it past system caches. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the io provider. +.SH OPTIONS +.TP +\-C +don't clear the screen +.TP +\-D +print delta times - elapsed, us +.TP +\-j +print project ID +.TP +\-o +print disk delta times, us +.TP +\-P +print %I/O (disk delta times) +.TP +\-Z +print zone ID +.TP +\-d device +instance name to snoop (eg, dad0) +.TP +\-f filename +full pathname of file to snoop +.TP +\-m mount_point +mountpoint for filesystem to snoop +.TP +\-t top +print top number only +.PP +.SH EXAMPLES +.TP +Default output, print summary every 5 seconds +# +.B iotop +.PP +.TP +One second samples, +# +.B iotop +1 +.PP +.TP +print %I/O (time based), +# +.B iotop +\-P +.PP +.TP +Snoop events on the root filesystem only, +# +.B iotop +\-m / +.TP +Print top 20 lines only, +# +.B iotop +\-t 20 +.TP +Print 12 x 5 second samples, scrolling, +# +.B iotop +\-C 5 12 +.PP +.SH FIELDS +.TP +UID +user ID +.TP +PID +process ID +.TP +PPID +parent process ID +.TP +PROJ +project ID +.TP +ZONE +zone ID +.TP +CMD +command name for the process +.TP +DEVICE +device name +.TP +MAJ +device major number +.TP +MIN +device minor number +.TP +D +direction, Read or Write +.TP +BYTES +total size of operations, bytes +.TP +ELAPSED +total elapsed times from request to completion, us (this is the elapsed +time from the disk request (strategy) to the disk completion (iodone)) +.TP +DISKTIME +total times for disk to complete request, us (this is the time for the +disk to complete that event since it's last event (time between iodones), +or, the time to the strategy if the disk had been idle) +.TP +%I/O +percent disk I/O, based on time (DISKTIME) +.TP +load +1 minute load average +.TP +disk_r +total disk read Kb for sample +.TP +disk_w +total disk write Kb for sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +iotop will run forever until Ctrl\-C is hit, or the specified +interval is reached. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +iosnoop(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_calldist.d.1m new file mode 100644 index 00000000000..d78ce8591b7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_calldist.d.1m @@ -0,0 +1,48 @@ +.TH j_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_calldist.d - measure Java elapsed times for different types of operation. +.SH SYNOPSIS +.B j_calldist.d +[top] +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0). Method calls are only visible when using the +flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile + +The "top" optional argument will truncate the output for each report +section to that many lines, with a default of 10. +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_calldist.d +.PP +.SH FIELDS +.TP +1 +Process ID +.TP +2 +Type of call (method/gc) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_calldist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_calls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_calls.d.1m new file mode 100644 index 00000000000..e89fb8e5396 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_calls.d.1m @@ -0,0 +1,57 @@ +.TH j_calls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_calls.d - count Java calls (method/...) using DTrace. +.SH SYNOPSIS +.B j_calls.d + +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0). Method calls and object allocation are only +visible when using the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile + +TYPEs: +cload class load +method method call +mcompile method compile +mload compiled method load +oalloc object alloc +thread thread start +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_calls.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +TYPE +Type of call (see below) +.TP +NAME +Name of call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_calls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_calltime.d.1m new file mode 100644 index 00000000000..479dc5bfb48 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_calltime.d.1m @@ -0,0 +1,51 @@ +.TH j_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_calltime.d - measure Java elapsed times for different types of operation. +.SH SYNOPSIS +.B j_calltime.d +[top] +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0). Method calls are only visible when using the +flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile + +The "top" optional argument will truncate the output for each report +section to that many lines, with a default of 10. +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_calltime.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +TYPE +Type of call (method/gc/total) +.TP +NAME +Name of call +.TP +TOTAL +Total elapsed time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_calltime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_classflow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_classflow.d.1m new file mode 100644 index 00000000000..af9d06c1a38 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_classflow.d.1m @@ -0,0 +1,63 @@ +.TH j_classflow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_classflow.d - trace a Java class method flow using DTrace. +.SH SYNOPSIS +.B j_classflow.d +classname +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile + +This watches Java method entries and returns, and indents child +method calls. +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_classflow.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +PID +Process ID +.TP +CLASS.METHOD +Java class and method name +.SH LEGEND +.TP +\-> +method entry +.TP +<\- +method return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +Changes in TID will appear to shuffle output, as we change from one thread +depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_classflow.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_cpudist.d.1m new file mode 100644 index 00000000000..37fe5f04fc3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_cpudist.d.1m @@ -0,0 +1,48 @@ +.TH j_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_cpudist.d - measure Java on-CPU times for different types of operation. +.SH SYNOPSIS +.B j_cpudist.d +[top] +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0). Method calls are only visible when using the +flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile + +The "top" optional argument will truncate the output for each report +section to that many lines, with a default of 10. +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_cpudist.d +.PP +.SH FIELDS +.TP +1 +Process ID +.TP +2 +Type of call (method/gc) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_cpudist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_cputime.d.1m new file mode 100644 index 00000000000..a0e767aedcc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_cputime.d.1m @@ -0,0 +1,51 @@ +.TH j_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_cputime.d - measure Java on-CPU times for different types of operation. +.SH SYNOPSIS +.B j_cputime.d +[top] +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0). Method calls are only visible when using the +flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile + +The "top" optional argument will truncate the output for each report +section to that many lines, with a default of 10. +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_cputime.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +TYPE +Type of call (method/gc/total) +.TP +NAME +Name of call +.TP +TOTAL +Total on-CPU time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_cputime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_events.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_events.d.1m new file mode 100644 index 00000000000..6df009b2a7a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_events.d.1m @@ -0,0 +1,46 @@ +.TH j_events.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_events.d - count Java events using DTrace. +.SH SYNOPSIS +.B j_events.d + +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0). Some events such as method calls are only +visible when using the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_events.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +EVENT +Event name (DTrace probe name) +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_events.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_flow.d.1m new file mode 100644 index 00000000000..579e68186c0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_flow.d.1m @@ -0,0 +1,63 @@ +.TH j_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_flow.d - snoop Java execution showing method flow using DTrace. +.SH SYNOPSIS +.B j_flow.d + +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile + +This watches Java method entries and returns, and indents child +method calls. +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_flow.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +PID +Process ID +.TP +CLASS.METHOD +Java class and method name +.SH LEGEND +.TP +\-> +method entry +.TP +<\- +method return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +Changes in TID will appear to shuffle output, as we change from one thread +depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_flow.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_flowtime.d.1m new file mode 100644 index 00000000000..e4334b23e5b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_flowtime.d.1m @@ -0,0 +1,69 @@ +.TH j_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_flowtime.d - snoop Java execution with method flow and delta times. +.SH SYNOPSIS +.B j_flowtime.d + +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile + +This watches Java method entries and returns, and indents child +method calls. +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_flowtime.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +TID +Thread ID +.TP +TIME(us) +Time since boot (us) +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +CLASS.METHOD +Java class and method name +.SH LEGEND +.TP +\-> +method entry +.TP +<\- +method return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +Changes in TID will appear to shuffle output, as we change from one thread +depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_flowtime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_methodcalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_methodcalls.d.1m new file mode 100644 index 00000000000..a44aea76dbd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_methodcalls.d.1m @@ -0,0 +1,45 @@ +.TH j_methodcalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_methodcalls.d - count Java method calls DTrace. +.SH SYNOPSIS +.B j_methodcalls.d + +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_methodcalls.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +COUNT +Number of calls during sample +.TP +CLASS.METHOD +Java class and method name +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_methodcalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_objnew.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_objnew.d.1m new file mode 100644 index 00000000000..14a6b21a053 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_objnew.d.1m @@ -0,0 +1,45 @@ +.TH j_objnew.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_objnew.d - report Java object allocation using DTrace. +.SH SYNOPSIS +.B j_objnew.d + +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_objnew.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +OBJS +Number of objects created +.TP +CLASS.METHOD +Java class and method name +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_objnew.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_package.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_package.d.1m new file mode 100644 index 00000000000..43f5b9b1623 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_package.d.1m @@ -0,0 +1,44 @@ +.TH j_package.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_package.d - count Java class loads by package using DTrace. +.SH SYNOPSIS +.B j_package.d + +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0). +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_package.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +LOADS +Class loads during trace +.TP +PACKAGE +Package name from class +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_package.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_profile.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_profile.d.1m new file mode 100644 index 00000000000..7c1ca28f6b2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_profile.d.1m @@ -0,0 +1,52 @@ +.TH j_profile.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_profile.d - sample stack traces with Java translations using DTrace. +.SH SYNOPSIS +.SH DESCRIPTION +This samples stack traces for the process specified. This stack trace +will cross the JVM and system libraries, and insert translations for Java +stack frames where appropriate. This is best explained with an example +stack frame output, + +Func_loop.func_c()V +Func_loop.func_b()V +Func_loop.func_a()V +Func_loop.main([Ljava/lang/String;)V +StubRoutines (1) +libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHan +libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmetho +libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJ +libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_j +libjvm.so`jni_CallStaticVoidMethod+0x15d +java`JavaMain+0xd30 +libc.so.1`_thr_setup+0x52 +libc.so.1`_lwp_start +101 + +The lines at the top are Java frames, followed by the JVM (libjvm.so). +The JVM symbols may be translated by passing the output through c++filt. +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_profile.d +.PP +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_profile.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_stat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_stat.d.1m new file mode 100644 index 00000000000..ab1495e7b69 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_stat.d.1m @@ -0,0 +1,68 @@ +.TH j_stat.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_stat.d - Java operation stats using DTrace. +.SH SYNOPSIS +.B j_stat.d +[interval [count]] +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0). Method calls and object allocation are only +visible when using the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile + +The numbers are counts for the interval specified. The default interval +is 1 second. + +If you see a count in "EXECS" but not in the other columns, then your +Java software is probably not running with the DTrace hotspot provider. + +If you see counts in "CLOAD" but not in "METHODS", then you Java +software probably isn't running with "+ExtendedDTraceProbes". +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_stat.d +.PP +.SH FIELDS +.TP +EXEC/s +Java programs executed per second, including +those without Java provider support +.TP +METHOD/s +Methods called, per second +.TP +OBJNEW/s +Objects created, per second +.TP +CLOAD/s +Class loads, per second +.TP +EXCP/s +Exceptions raised, per second +.TP +RESC/s +Rescues, per second +.TP +GC/s +Garbage collects, per second +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_stat.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_syscalls.d.1m new file mode 100644 index 00000000000..854c9017e59 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_syscalls.d.1m @@ -0,0 +1,48 @@ +.TH j_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_syscalls.d - count Java methods and syscalls using DTrace. +.SH SYNOPSIS +.B j_syscalls.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This traces Java methods if the hotspot provider exists (1.6.0) and +the flag "+ExtendedDTraceProbes" is used. eg, +java -XX:+ExtendedDTraceProbes classfile +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_syscalls.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +TYPE +Type of call (method/syscall) +.TP +NAME +Name of call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_syscalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_syscolors.d.1m new file mode 100644 index 00000000000..e6bdebee7d3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_syscolors.d.1m @@ -0,0 +1,65 @@ +.TH j_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_syscolors.d - trace Java method flow plus syscalls, in color. +.SH SYNOPSIS +.B j_syscolors.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This traces Java methods if the hotspot provider exists (1.6.0) and +the flag "+ExtendedDTraceProbes" is used. eg, +java -XX:+ExtendedDTraceProbes classfile + +This watches Java method entries and returns, and indents child +method calls. + +If the flow appears to jump, check the TID column - the JVM may have +switched to another thread. +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_syscolors.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +TID +Thread ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +TYPE +Type of call (func/syscall) +.TP +NAME +Java method or syscall name +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +Changes in TID will appear to shuffle output, as we change from one thread +depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_syscolors.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_thread.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_thread.d.1m new file mode 100644 index 00000000000..97caf9ffc77 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_thread.d.1m @@ -0,0 +1,54 @@ +.TH j_thread.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_thread.d - snoop Java thread execution using DTrace. +.SH SYNOPSIS +.B j_thread.d + +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0). +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_thread.d +.PP +.SH FIELDS +.TP +TIME +Time string +.TP +PID +Process ID +.TP +TID +Thread ID +.TP +THREAD +Thread name +.SH LEGEND +.TP +=> +thread start +.TP +<= +thread end +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_thread.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/j_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_who.d.1m new file mode 100644 index 00000000000..97d68e8baf5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/j_who.d.1m @@ -0,0 +1,51 @@ +.TH j_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +j_who.d - trace Java calls by process using DTrace. +.SH SYNOPSIS +.B j_who.d + +.SH DESCRIPTION +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0). + +The argument list is truncated at 55 characters (up to 80 is easily +available). To easily read the full argument list, use other system tools; +on Solaris use "pargs PID". +.SH OS +Solaris +.SH STABILITY +Evolving - uses the DTrace hotspot provider, which may change +as additional features are introduced. Check Java/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B j_who.d +.PP +.SH FIELDS +.TP +PID +Process ID of Java +.TP +UID +User ID of the owner +.TP +CALLS +Number of calls made (a measure of activity) +.TP +ARGS +Process name and arguments +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +j_who.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_calldist.d.1m new file mode 100644 index 00000000000..fbd20fcfbb3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_calldist.d.1m @@ -0,0 +1,46 @@ +.TH js_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_calldist.d - measure JavaScript elapsed times for types of operation. +.SH SYNOPSIS +.B js_calldist.d + +.SH DESCRIPTION +This traces JavaScript activity from all browsers running on the system with +JavaScript provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_calldist.d +.PP +.SH FIELDS +.TP +1 +Filename of the JavaScript program +.TP +2 +Type of call (func/obj-new) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_calldist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_calls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_calls.d.1m new file mode 100644 index 00000000000..c997293cdd0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_calls.d.1m @@ -0,0 +1,49 @@ +.TH js_calls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_calls.d - count JavaScript calls using DTrace. +.SH SYNOPSIS +.B js_calls.d + +.SH DESCRIPTION +This traces activity from all browsers on the system that are +running with JavaScript provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_calls.d +.PP +.SH FIELDS +.TP +FILE +Filename of the JavaScript program +.TP +TYPE +Type of call (func/obj-new/...) +.TP +NAME +Descriptive name of call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_calls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_calltime.d.1m new file mode 100644 index 00000000000..785587b16c1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_calltime.d.1m @@ -0,0 +1,49 @@ +.TH js_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_calltime.d - measure JavaScript elapsed times for types of operation. +.SH SYNOPSIS +.B js_calltime.d + +.SH DESCRIPTION +This traces JavaScript activity from all browsers running on the system with +JavaScript provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_calltime.d +.PP +.SH FIELDS +.TP +FILE +Filename of the JavaScript program +.TP +TYPE +Type of call (func/obj-new/gc/total) +.TP +NAME +Name of call +.TP +TOTAL +Total elapsed time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_calltime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_cpudist.d.1m new file mode 100644 index 00000000000..64a9aec98ec --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_cpudist.d.1m @@ -0,0 +1,46 @@ +.TH js_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_cpudist.d - measure JavaScript on-CPU times for types of operation. +.SH SYNOPSIS +.B js_cpudist.d + +.SH DESCRIPTION +This traces JavaScript activity from all browsers running on the system with +JavaScript provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_cpudist.d +.PP +.SH FIELDS +.TP +1 +Filename of the JavaScript program +.TP +2 +Type of call (func/obj-new) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_cpudist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_cputime.d.1m new file mode 100644 index 00000000000..2aaefc13c8e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_cputime.d.1m @@ -0,0 +1,49 @@ +.TH js_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_cputime.d - measure JavaScript on-CPU times for types of operation. +.SH SYNOPSIS +.B js_cputime.d + +.SH DESCRIPTION +This traces JavaScript activity from all browsers running on the system with +JavaScript provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_cputime.d +.PP +.SH FIELDS +.TP +FILE +Filename of the JavaScript program +.TP +TYPE +Type of call (func/obj-new/gc/total) +.TP +NAME +Name of call +.TP +TOTAL +Total on-CPU time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_cputime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_execs.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_execs.d.1m new file mode 100644 index 00000000000..61613c04005 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_execs.d.1m @@ -0,0 +1,46 @@ +.TH js_execs.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_execs.d - JavaScript execute snoop using DTrace. +.SH SYNOPSIS +.B js_execs.d + +.SH DESCRIPTION +This traces activity from all browsers on the system that are +running with JavaScript provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_execs.d +.PP +.SH FIELDS +.TP +TIME +Time of event +.TP +FILE +Filename of the JavaScript program +.TP +LINENO +Line number in filename +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_execs.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_flow.d.1m new file mode 100644 index 00000000000..5d4ba0d23e7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_flow.d.1m @@ -0,0 +1,59 @@ +.TH js_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_flow.d - snoop JavaScript execution showing function flow using DTrace. +.SH SYNOPSIS +.B js_flow.d + +.SH DESCRIPTION +This traces activity from all browsers on the system that are running +with JavaScript provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_flow.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +FILE +Filename that this function belongs to +.TP +FUNC +Function name +.SH LEGEND +.TP +\-> +function entry +.TP +<\- +function return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_flow.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_flowinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_flowinfo.d.1m new file mode 100644 index 00000000000..1531ce5b428 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_flowinfo.d.1m @@ -0,0 +1,68 @@ +.TH js_flowinfo.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_flowinfo.d - JavaScript function flow with info using DTrace. +.SH SYNOPSIS +.B js_flowinfo.d + +.SH DESCRIPTION +This traces activity from all browsers on the system that are running +with JavaScript provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_flowinfo.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FILE +Filename of the JavScript program +.TP +LINE +Line number of filename +.TP +TYPE +Type of call (func) +.TP +FUNC +Function name +.SH LEGEND +.TP +\-> +function entry +.TP +<\- +function return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_flowinfo.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_flowtime.d.1m new file mode 100644 index 00000000000..f90c9998fb7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_flowtime.d.1m @@ -0,0 +1,62 @@ +.TH js_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_flowtime.d - JavaScript function flow with delta times using DTrace. +.SH SYNOPSIS +.B js_flowtime.d + +.SH DESCRIPTION +This traces activity from all browsers on the system that are running +with JavaScript provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_flowtime.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +FILE +Filename that this function belongs to +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FUNC +Function name +.SH LEGEND +.TP +\-> +function entry +.TP +<\- +function return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_flowtime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_objcpu.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_objcpu.d.1m new file mode 100644 index 00000000000..088fa06e70b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_objcpu.d.1m @@ -0,0 +1,36 @@ +.TH js_objcpu.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_objcpu.d - measure JavaScript object creation on-CPU time using DTrace. +.SH SYNOPSIS +.B js_objcpu.d + +.SH DESCRIPTION +This traces JavaScript activity from all browsers running on the system +with JavaScript provider support. + +Class names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_objcpu.d +.PP +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_objcpu.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_objgc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_objgc.d.1m new file mode 100644 index 00000000000..691883e6dc6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_objgc.d.1m @@ -0,0 +1,60 @@ +.TH js_objgc.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_objgc.d - trace JavaScript Object GC using DTrace. +.SH SYNOPSIS +.B js_objgc.d + +.SH DESCRIPTION +This traces JavaScript activity from all running browers on the system +which support the JavaScript DTrace provider. + +This script provides information on which objects are not being garbage +collected, an issue which causes the browser to steadily leak memory. +We trace object creation (+1) and destruction (-1), and provide a +summary each second of the running tally of the object class and +originating filename. If over the period of several minutes an object +type is still steadily increasing, then that would be of interest. +Be patient, depending on the rate of object creation it can take over +ten minutes for garbage collect to kick in. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_objgc.d +.PP +.SH FIELDS +.TP +FILE +Filename that contained the function +.TP +CLASS +Class to which this new object belongs +.TP +TOTAL +Object entropy (positive == uncollected) +.SH NOTES + +\- it is possible that you will see negative entropy. That happens +when you begin tracing after some objects have already been created, +and then trace their destruction. +\- there are other Things that GC handles, other than Objects; extra +probes can be added to trace them, should the need arise. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_objgc.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_objnew.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_objnew.d.1m new file mode 100644 index 00000000000..83897b5dfba --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_objnew.d.1m @@ -0,0 +1,46 @@ +.TH js_objnew.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_objnew.d - count JavaScript object creation using DTrace. +.SH SYNOPSIS +.B js_objnew.d + +.SH DESCRIPTION +This traces JavaScript activity from all browsers running on the system +with JavaScript provider support. + +Filename and class names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_objnew.d +.PP +.SH FIELDS +.TP +FILE +Filename of the JavaScript program +.TP +CLASS +Class of new object +.TP +COUNT +Number of object creations during tracing +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_objnew.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_stat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_stat.d.1m new file mode 100644 index 00000000000..3234630a302 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_stat.d.1m @@ -0,0 +1,52 @@ +.TH js_stat.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_stat.d - JavaScript operation stats using DTrace. +.SH SYNOPSIS +.B js_stat.d +[interval [count]] +.SH DESCRIPTION +This traces activity from all browsers on the system that are +running with JavaScript provider support. + +The numbers are counts for the interval specified. The default interval +is 1 second. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_stat.d +.PP +.SH FIELDS +.TP +EXEC/s +JavaScript programs executed per second +.TP +FUNCS/s +Functions called, per second +.TP +OBJNEW/s +Objects created, per second +.TP +OBJFRE/s +Objects freed (finalize), per second +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_stat.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/js_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_who.d.1m new file mode 100644 index 00000000000..119ea2626bd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/js_who.d.1m @@ -0,0 +1,49 @@ +.TH js_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +js_who.d - trace JavaScript function execution by process using DTrace. +.SH SYNOPSIS +.B js_who.d + +.SH DESCRIPTION +This traces JavaScript activity from all browsers on the system that are +running with JavaScript provider support. + +Filenames are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace JavaScript provider, which may change +as additional features are introduced. Check JavaScript/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B js_who.d +.PP +.SH FIELDS +.TP +PID +Process ID of JavaScript +.TP +UID +User ID of the owner +.TP +FUNCS +Number of function calls +.TP +FILE +Pathname of the JavaScript program +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +js_who.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/kill.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/kill.d.1m new file mode 100644 index 00000000000..e9e966a9c92 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/kill.d.1m @@ -0,0 +1,53 @@ +.TH kill.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +kill.d \- snoop process signals as they occur. Uses DTrace. +.SH SYNOPSIS +.B kill.d +.SH DESCRIPTION +kill.d is a simple DTrace program to print details of process +signals as they are sent, such as the PID source and destination, +signal number and result. + +This program can be used to determine which process is sending +signals to which other process. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH EXAMPLES +.TP +Default output, print process signals as they are sent. +# +.B kill.d +.PP +.SH FIELDS +.TP +FROM +source PID +.TP +COMMAND +source command name +.TP +TO +destination PID +.TP +SIG +destination signal ("9" for a kill -9) +.TP +RESULT +result of signal (-1 is for failure) +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +kill.d will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/kstat_types.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/kstat_types.d.1m new file mode 100644 index 00000000000..8a2d11952c4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/kstat_types.d.1m @@ -0,0 +1,50 @@ +.TH kstat_types.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +kstat_types.d \- Trace kstat reads with type info. Uses DTrace. +.SH SYNOPSIS +.B kstat_types.d +.SH DESCRIPTION +kstat is the Kernel Statistics framework, which is used by tools +such as vmstat, iostat, mpstat and sar. Try running vmstat while +kstat_types.d is tracing - you should see details of the kstat +reads performed. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Trace kstat reads as they occur, +# +.B kstat_types.d +.PP +.SH FIELDS +.TP +CMD +command name +.TP +CLASS +kstat class (ks_class) +.TP +TYPE +kstat type as a string (ks_type) +.TP +MOD:INS:NAME +kstat module:instance:name +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +kstat_types.d will trace until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), kstat(1M), kstat(3KSTAT) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/lastwords.1m b/cddl/contrib/dtracetoolkit/Man/man1m/lastwords.1m new file mode 100644 index 00000000000..024234bf49f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/lastwords.1m @@ -0,0 +1,56 @@ +.TH lastwords 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +lastwords \- print syscalls before exit. Uses DTrace. +.SH SYNOPSIS +.B lastwords command +.SH DESCRIPTION +This prints the last few system calls for processes matching +the given name, when they exit. This makes use of a ring buffer +so that the impact on the system is minimised. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall and proc providers. +.SH EXAMPLES +.TP +Catch last few syscalls for dying netscape processes, +# +.B lastwords netscape +.PP +.SH FIELDS +.TP +TIME +time of syscall return, ns +.TP +PID +process ID +.TP +EXEC +process name (execname) +.TP +SYSCALL +system call +.TP +RETURN +return value for the system call +.TP +ERR +errno for the system call +.PP +.SH BASED ON +/usr/demo/dtrace/ring.d +.PP +.SH DOCUMENTATION +DTrace Guide "Buffers and Buffering" chapter (docs.sun.com) + +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +lastwords will sample until a command with that name exits. +.SH SEE ALSO +dtruss(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/loads.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/loads.d.1m new file mode 100644 index 00000000000..f18d3b11950 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/loads.d.1m @@ -0,0 +1,38 @@ +.TH loads.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +loads.d \- print load averages. Uses DTrace. +.SH SYNOPSIS +.B loads.d +.SH DESCRIPTION +These are the same load averages that the "uptime" command prints. +The purpose of this script is to demonstrate fetching these values +from the DTrace language. + +The first field is the 1 minute average, the second is the 5 minute, +and the third is the 15 minute average. The value represents the average +number of runnable threads in the system, a value higher than your +CPU (core/hwthread) count may be a sign of CPU saturation. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - uses kernel symbols, which may change for a future version +of this OS. +.SH EXAMPLES +.TP +Print load averages, +# +.B loads.d +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +uptime(1), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/lockbydist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/lockbydist.d.1m new file mode 100644 index 00000000000..188c5a4e5f4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/lockbydist.d.1m @@ -0,0 +1,54 @@ +.TH lockbydist.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +lockbydist.d \- lock distrib. by process name. Uses DTrace. +.SH SYNOPSIS +.B lockbydist.d +.SH DESCRIPTION +lockbydist.d is a DTrace OneLiner to a report the time threads have +spent blocked on adaptive mutexes, by process name. + +A distribution is printed to illustrate the number of blocks at +different lengths in time. This helps us identify if there are many +short blocks, or fewer large blocks. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the lockstat provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B lockbydist.d +.PP +.SH FIELDS +.TP +process name +The process name. There may be several PIDs that have the +same process name, for example with numerous instances of "bash". The +value reported will be the sum of them all. +.TP +value +The blocked time in nanoseconds +.TP +count +The number of occurrences that were at least this size +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +lockbydist.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +lockstat(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/lockbyproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/lockbyproc.d.1m new file mode 100644 index 00000000000..af6c9114b71 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/lockbyproc.d.1m @@ -0,0 +1,47 @@ +.TH lockbyproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +lockbyproc.d \- lock time by process name. Uses DTrace. +.SH SYNOPSIS +.B lockbyproc.d +.SH DESCRIPTION +lockbyproc.d is a DTrace OneLiner to a report the total time threads +have spent blocked on adaptive mutexes, by process name. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the lockstat provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B lockbyproc.d +.PP +.SH FIELDS +.TP +first field +This is the process name. There may be several PIDs that have the +same process name, for example with numerous instances of "bash". The +value reported will be the sum of them all. +.TP +second field +This is the total length of time blocked, in nanoseconds. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +lockbyproc.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +lockstat(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/minfbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/minfbypid.d.1m new file mode 100644 index 00000000000..45574f487ae --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/minfbypid.d.1m @@ -0,0 +1,46 @@ +.TH minfbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +minfbypid.d \- minor faults by process name. Uses DTrace. +.SH SYNOPSIS +.B minfbypid.d +.SH DESCRIPTION +minfbypid.d is a DTrace OneLiner to a report the number of minor +faults by process name. + +This is based on a script from DExplorer. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the vminfo provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B minfbypid.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +process name +.TP +MINFAULTS +number of minor faults in this sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +minfbypid.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/minfbyproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/minfbyproc.d.1m new file mode 100644 index 00000000000..9045e48da76 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/minfbyproc.d.1m @@ -0,0 +1,47 @@ +.TH minfbyproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +minfbyproc.d \- minor faults by process name. Uses DTrace. +.SH SYNOPSIS +.B minfbyproc.d +.SH DESCRIPTION +minfbyproc.d is a DTrace OneLiner to a report the number of minor +faults by process name. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the vminfo provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B minfbyproc.d +.PP +.SH FIELDS +.TP +first field +The process name. There may be several PIDs that have the +same process name, for example with numerous instances of "bash". The +value reported will be the sum of them all. +.TP +second field +The number minor faults +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +minfbyproc.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/mmapfiles.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/mmapfiles.d.1m new file mode 100644 index 00000000000..e4bb2c89eae --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/mmapfiles.d.1m @@ -0,0 +1,42 @@ +.TH mmapfiles.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +mmapfiles.d \- mmap'd files by process. Uses DTrace. +.SH SYNOPSIS +.B mmapfiles.d +.SH DESCRIPTION +This prints statistics on the pathnames that were mmap'd by processes. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B mmapfiles.d +.PP +.SH FIELDS +.TP +MMAPS +number of mmaps +.TP +CMD +process name +.TP +PATHNAME +pathname of mmap'd file +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +mmapfiles.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/modcalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/modcalls.d.1m new file mode 100644 index 00000000000..af7722b71c4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/modcalls.d.1m @@ -0,0 +1,50 @@ +.TH modcalls.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +modcalls.d \- kernel function calls by module. Uses DTrace. +.SH SYNOPSIS +.B modcalls.d +.SH DESCRIPTION +modcalls.d is a DTrace OneLiner to a report of the number of +kernel function calls by module. + +This script may be useful to determine whether drivers are "thinking" when +troubleshooting driver issues. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Any +.SH STABILITY +stable - while this script uses the unstable fbt provider, it does so +in a stable way. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B modcalls.d +.PP +.SH FIELDS +.TP +first field +This is the module name, or kernel driver name. if a name is +unfamiliar to you there may be a man page to explain what it is. +.TP +second field +This is the number of function calls by this module. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +modcalls.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/newproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/newproc.d.1m new file mode 100644 index 00000000000..b3b979b4e77 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/newproc.d.1m @@ -0,0 +1,54 @@ +.TH newproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +newproc.d \- snoop new processes. Uses DTrace. +.SH SYNOPSIS +.B newproc.d +.SH DESCRIPTION +newproc.d is a DTrace OneLiner to snoop new processes as they are run. +The argument listing is printed. + +This is useful to identify short lived processes that are usually +difficult to spot using traditional tools. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the proc provider. +.SH EXAMPLES +.TP +This prints new processes until Ctrl\-C is hit. +# +.B newproc.d +.PP +.SH FIELDS +.TP +CPU +The CPU that recieved the event +.TP +ID +A DTrace probe ID for the event +.TP +FUNCTION:NAME +The DTrace probe name for the event +.TP +remaining fields +These contains the argument listing for the new process +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +newproc.d will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +execsnoop(1M), dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/nfswizard.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/nfswizard.d.1m new file mode 100644 index 00000000000..64d8e416e83 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/nfswizard.d.1m @@ -0,0 +1,36 @@ +.TH nfswizard.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +nfswizard.d \- nfs client activity wizard. Uses DTrace. +.SH SYNOPSIS +.B nfswizard.d +.SH DESCRIPTION +This examines activity caused by NFS client processes on the same server +that you are running this script on. A detailed report is generated +to explain various details of NFS client activity, including response +times and file access. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.PP +.SH OS +Solaris +.SH STABILITY +stable - needs the io provider. +.SH EXAMPLES +.TP +Sample NFS client activity, then print a report after Ctrl\-C, +# +.B nfswizard.d +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +nfswizard.d will sample activity until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/opensnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/opensnoop.1m new file mode 100644 index 00000000000..bc449c05b1b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/opensnoop.1m @@ -0,0 +1,139 @@ +.TH opensnoop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +opensnoop \- snoop file opens as they occur. Uses DTrace. +.SH SYNOPSIS +.B opensnoop +[\-a|\-A|\-ceghsvxZ] [\-f pathname] [\-n name] [\-p PID] +.SH DESCRIPTION +opensnoop tracks file opens. As a process issues a file open, details +such as UID, PID and pathname are printed out. + +The returned file descriptor is printed, +a value of -1 indicates an error. This can be useful +for troubleshooting to determine if appliacions are attempting to +open files that do not exist. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH OPTIONS +.TP +\-a +print all data +.TP +\-A +dump all data, space delimited +.TP +\-c +print current working directory of process +.TP +\-e +print errno value +.TP +\-g +print full command arguments +.TP +\-s +print start time, us +.TP +\-v +print start time, string +.TP +\-x +only print failed opens +.TP +\-Z +print zonename +.TP +\-f pathname +file pathname to snoop +.TP +\-n name +process name to snoop +.TP +\-p PID +process ID to snoop +.PP +.SH EXAMPLES +.TP +Default output, print file opens by process as they occur, +# +.B opensnoop +.PP +.TP +Print human readable timestamps, +# +.B opensnoop +\-v +.PP +.TP +See error codes, +# +.B opensnoop +\-e +.PP +.TP +Snoop this file only, +# +.B opensnoop +\-f /etc/passwd +.PP +.SH FIELDS +.TP +ZONE +Zone name +.TP +UID +User ID +.TP +PID +Process ID +.TP +PPID +Parent Process ID +.TP +FD +File Descriptor (-1 is error) +.TP +ERR +errno value (see /usr/include/sys/errno.h) +.TP +CWD +current working directory of process +.TP +PATH +pathname for file open +.TP +COMM +command name for the process +.TP +ARGS +argument listing for the process +.TP +TIME +timestamp for the open event, us +.TP +STRTIME +timestamp for the open event, string +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +opensnoop will run forever until Ctrl\-C is hit. +.SH BUGS +occasionally the pathname for the file open cannot be read +and the following error will be seen, + +dtrace: error on enabled probe ID 6 (...): invalid address + +this is normal behaviour. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pathopens.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pathopens.d.1m new file mode 100644 index 00000000000..cf043bd1c3f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pathopens.d.1m @@ -0,0 +1,38 @@ +.TH pathopens.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +pathopens.d \- full pathnames opened ok count. Uses DTrace. +.SH SYNOPSIS +.B pathopens.d +.SH DESCRIPTION +This program prints a count of the number of times files have been +successfully opened. This is somewhat special in that the full pathname +is calculated, even if the file open referred to a relative pathname. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B pathopens.d +.PP +.SH FIELDS +.TP +PATHNAME +full pathname +.TP +COUNT +number of successful opens +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +pathopens.d will sample until Ctrl\-C is hit. +.SH SEE ALSO +opensnoop(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pfilestat.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pfilestat.1m new file mode 100644 index 00000000000..8780c2e58e1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pfilestat.1m @@ -0,0 +1,87 @@ +.TH pfilestat 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +pfilestat \- show I/O latency break down by FD. Uses DTrace. +.SH SYNOPSIS +.B pfilestat [\-r|\-w] pid +.SH DESCRIPTION +This prints I/O statistics for each file descriptor within a process. +In particular, the time break down during read() and write() events is +measured. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH OPTIONS +.TP +\-r +reads only +.TP +\-w +writes only +.TP +pid +process ID to examine +.PP +.SH EXAMPLES +.TP +Sample both read and write activity for PID 81, +# +.B pfilestat 81 +.TP +Sample reads only for PID 81, +# +.B pfilestat +\-r 81 +.PP +.SH FIELDS +.TP +STATE +microstate. see STATES below. +.TP +FDUM +file Descriptor ID +.TP +Time +percentage of wallclock time in each STATE +.TP +File +Name of file, if known +.PP +.SH STATES +.TP +read +Time spent during the execution of the read() syscall. +.TP +write +Time spent during the execution of the write() syscall. +.TP +waitcpu +Latency spent waiting to be scheduled after becoming runnable. +.TP +running +Process running user-mode code. +.TP +sleep-r +Process sleeping on reads. +.TP +sleep-w +Process sleeping on writes. +.PP +.SH DOCUMENTATION +pfilestat is discussed and demonstrated in Solaris Internals 2nd edition, +volume 2. + +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +pfilestat will sample until Ctrl\-C is hit. +.SH AUTHOR +Richard McDougall +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pgpginbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pgpginbypid.d.1m new file mode 100644 index 00000000000..fdaa297b51d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pgpginbypid.d.1m @@ -0,0 +1,47 @@ +.TH pgpginbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +pgpginbypid.d \- pages paged in by PID. Uses DTrace. +.SH SYNOPSIS +.B pgpginbypid.d +.SH DESCRIPTION +pgpginbypid.d reports the rumber of pages paged in from the disks +by process ID. This is an indicator that processes are reading +from the disks. + +This is based on a script from DExplorer. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the vminfo provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B pgpginbypid.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +process name +.TP +PAGES +number of pages paged in +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +pgpginbypid.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +iosnoop(1m), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pgpginbyproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pgpginbyproc.d.1m new file mode 100644 index 00000000000..413043af10e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pgpginbyproc.d.1m @@ -0,0 +1,50 @@ +.TH pgpginbyproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +pgpginbyproc.d \- pages pagedin by process name. Uses DTrace. +.SH SYNOPSIS +.B pgpginbyproc.d +.SH DESCRIPTION +pgpginbyproc.d is a DTrace OneLiner to a report the number of pages +paged in by process name. + +This may be one way to help identify the process responsible for +causing heavy read traffic to the disks. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the vminfo provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B pgpginbyproc.d +.PP +.SH FIELDS +.TP +first field +The process name. There may be several PIDs that have the +same process name, for example with numerous instances of "bash". The +value reported will be the sum of them all. +.TP +second field +The number of pages paged in +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +pgpginbyproc.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +iosnoop(1m), dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/php_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_calldist.d.1m new file mode 100644 index 00000000000..065d6db2d7d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/php_calldist.d.1m @@ -0,0 +1,49 @@ +.TH php_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +php_calldist.d - measure PHP elapsed times for functions. +.SH SYNOPSIS +.B php_calldist.d + +.SH DESCRIPTION +This traces PHP activity from all programs running on the system with +PHP provider support. + +This script prints distribution plots of elapsed time for PHP +operations. Use php_calltime.d for summary reports. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Php provider, which may change +as additional features are introduced. Check Php/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B php_calldist.d +.PP +.SH FIELDS +.TP +1 +Filename of the PHP program +.TP +2 +Type of call (func) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +php_calldist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/php_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_calltime.d.1m new file mode 100644 index 00000000000..f090b6e7016 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/php_calltime.d.1m @@ -0,0 +1,49 @@ +.TH php_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +php_calltime.d - measure PHP elapsed times for functions. +.SH SYNOPSIS +.B php_calltime.d + +.SH DESCRIPTION +This traces PHP activity from all programs running on the system with +PHP provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Php provider, which may change +as additional features are introduced. Check Php/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B php_calltime.d +.PP +.SH FIELDS +.TP +FILE +Filename of the PHP program +.TP +TYPE +Type of call (func/total) +.TP +NAME +Name of call +.TP +TOTAL +Total elapsed time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +php_calltime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/php_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_cpudist.d.1m new file mode 100644 index 00000000000..54ea0d195b8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/php_cpudist.d.1m @@ -0,0 +1,49 @@ +.TH php_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +php_cpudist.d - measure PHP on-CPU times for functions. +.SH SYNOPSIS +.B php_cpudist.d + +.SH DESCRIPTION +This traces PHP activity from all programs running on the system with +PHP provider support. + +This script prints distribution plots of elapsed time for PHP +operations. Use php_cputime.d for summary reports. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Php provider, which may change +as additional features are introduced. Check Php/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B php_cpudist.d +.PP +.SH FIELDS +.TP +1 +Filename of the PHP program +.TP +2 +Type of call (func) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +php_cpudist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/php_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_cputime.d.1m new file mode 100644 index 00000000000..2020969224f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/php_cputime.d.1m @@ -0,0 +1,49 @@ +.TH php_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +php_cputime.d - measure PHP on-CPU times for functions. +.SH SYNOPSIS +.B php_cputime.d + +.SH DESCRIPTION +This traces PHP activity from all programs running on the system with +PHP provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Php provider, which may change +as additional features are introduced. Check Php/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B php_cputime.d +.PP +.SH FIELDS +.TP +FILE +Filename of the PHP program +.TP +TYPE +Type of call (func/total) +.TP +NAME +Name of call (function name) +.TP +TOTAL +Total on-CPU time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +php_cputime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/php_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_flow.d.1m new file mode 100644 index 00000000000..bda09e3b24d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/php_flow.d.1m @@ -0,0 +1,60 @@ +.TH php_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +php_flow.d - snoop PHP execution showing function flow. +.SH SYNOPSIS +.B php_flow.d + +.SH DESCRIPTION +This traces PHP activity from all PHP programs on the system +running with PHP provider support. + +This watches PHP function entries and returns, and indents child +function calls. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Php provider, which may change +as additional features are introduced. Check Php/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B php_flow.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +FILE +Filename that this function belongs to +.TP +FUNC +Function name +.SH LEGEND +.TP +\-> +function entry +.TP +<\- +function return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +php_flow.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/php_flowinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_flowinfo.d.1m new file mode 100644 index 00000000000..2e9282e7303 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/php_flowinfo.d.1m @@ -0,0 +1,68 @@ +.TH php_flowinfo.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +php_flowinfo.d - snoop PHP function flow with info using DTrace. +.SH SYNOPSIS +.B php_flowinfo.d + +.SH DESCRIPTION +This traces activity from all PHP programs on the system that are +running with PHP provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Php provider, which may change +as additional features are introduced. Check Php/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B php_flowinfo.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FILE +Filename of the PHP program +.TP +LINE +Line number of filename +.TP +TYPE +Type of call (func) +.TP +FUNC +PHP function +.SH LEGEND +.TP +\-> +function entry +.TP +<\- +function return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +php_flowinfo.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/php_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_flowtime.d.1m new file mode 100644 index 00000000000..f30c283e547 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/php_flowtime.d.1m @@ -0,0 +1,65 @@ +.TH php_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +php_flowtime.d - snoop PHP functions with flow and delta times. +.SH SYNOPSIS +.B php_flowtime.d + +.SH DESCRIPTION +This traces shell activity from PHP programs on the system that are +running with PHP provider support. + +This watches PHP function entries and returns, and indents child +function calls. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Php provider, which may change +as additional features are introduced. Check Php/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B php_flowtime.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +FILE +Filename that this function belongs to +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FUNC +PHP function name +.SH LEGEND +.TP +\-> +function entry +.TP +<\- +function return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +php_flowtime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/php_funccalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_funccalls.d.1m new file mode 100644 index 00000000000..eb01963bb2f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/php_funccalls.d.1m @@ -0,0 +1,43 @@ +.TH php_funccalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +php_funccalls.d - measure PHP function calls using DTrace. +.SH SYNOPSIS +.B php_funccalls.d + +.SH DESCRIPTION +This traces PHP activity from all running programs on the system +which support the PHP DTrace provider. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Php provider, which may change +as additional features are introduced. Check Php/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B php_funccalls.d +.PP +.SH FIELDS +.TP +FUNC +PHP function name +.TP +CALLS +Function calls during this sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +php_funccalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/php_malloc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_malloc.d.1m new file mode 100644 index 00000000000..a11944d9537 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/php_malloc.d.1m @@ -0,0 +1,39 @@ +.TH php_malloc.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +php_malloc.d - PHP libc malloc analysis. +.SH SYNOPSIS +.B php_malloc.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This is an expiremental script to identify who is calling malloc() for +memory allocation, and to print distribution plots of the requested bytes. +If a malloc() occured while in a PHP function, then that function is +identified as responsible; else the caller of malloc() is identified as +responsible - which will be a function from the PHP engine. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Php provider, which may change +as additional features are introduced. Check Php/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B php_malloc.d +.PP +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +php_malloc.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/php_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_syscalls.d.1m new file mode 100644 index 00000000000..e2b10b0f84f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/php_syscalls.d.1m @@ -0,0 +1,54 @@ +.TH php_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +php_syscalls.d - count PHP function calls and syscalls using DTrace. +.SH SYNOPSIS +.B php_syscalls.d + +.SH DESCRIPTION +This traces syscalls that occured during a PHP function call. + +Filename and function names are printed if available. +The filename for syscalls may be printed as "php", if the program +was invoked using the form "php filename" rather than running the +program with an interpreter line. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Php provider, which may change +as additional features are introduced. Check Php/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B php_syscalls.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +FILE +Filename of the PHP program +.TP +TYPE +Type of call (func/syscall) +.TP +NAME +Name of call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +php_syscalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/php_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_syscolors.d.1m new file mode 100644 index 00000000000..0a29ffb4391 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/php_syscolors.d.1m @@ -0,0 +1,61 @@ +.TH php_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +php_syscolors.d - trace PHP function flow plus syscalls, in color. +.SH SYNOPSIS +.B php_syscolors.d + +.SH DESCRIPTION +This watches PHP function entries and returns, and indents child +function calls. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Php provider, which may change +as additional features are introduced. Check Php/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B php_syscolors.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FILE +Filename of the PHP program +.TP +LINE +Line number of filename +.TP +TYPE +Type of call (func/syscall) +.TP +NAME +PHP function or syscall name +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +php_syscolors.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/php_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_who.d.1m new file mode 100644 index 00000000000..9aacba6221e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/php_who.d.1m @@ -0,0 +1,49 @@ +.TH php_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +php_who.d - trace PHP function execution by process using DTrace. +.SH SYNOPSIS +.B php_who.d + +.SH DESCRIPTION +This traces PHP activity from all PHP programs on the system that are +running with PHP provider support. + +Filenames are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Php provider, which may change +as additional features are introduced. Check Php/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B php_who.d +.PP +.SH FIELDS +.TP +PID +Process ID of PHP +.TP +UID +User ID of the owner +.TP +FUNCS +Number of function calls +.TP +FILE +Pathname of the PHP program +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +php_who.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pidpersec.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pidpersec.d.1m new file mode 100644 index 00000000000..4040ae549f2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pidpersec.d.1m @@ -0,0 +1,42 @@ +.TH pidpersec.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +pidpersec.d \- print new PIDs per sec. Uses DTrace. +.SH SYNOPSIS +.B pidpersec.d +.SH DESCRIPTION +This script prints the number of new processes created per second. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the proc provider. +.SH EXAMPLES +.TP +Print PID statistics per second, +# +.B pidpersec.d +.PP +.SH FIELDS +.TP +TIME +time, as a string +.TP +LASTPID +last PID created +.TP +PID/s +Number of processes created per second +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +pidpersec.d will run until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +execsnoop(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pl_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_calldist.d.1m new file mode 100644 index 00000000000..ad2d1b83d18 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pl_calldist.d.1m @@ -0,0 +1,49 @@ +.TH pl_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +pl_calldist.d - measure Perl elapsed times for subroutines. +.SH SYNOPSIS +.B pl_calldist.d + +.SH DESCRIPTION +This traces Perl activity from all programs running on the system with +Perl provider support. + +This script prints distribution plots of elapsed time for Perl subroutines. +Use pl_calltime.d for summary reports. + +Filename and subroutine names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Perl provider, which may change +as additional features are introduced. Check Perl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B pl_calldist.d +.PP +.SH FIELDS +.TP +1 +Filename of the Perl program +.TP +2 +Type of call (sub) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +pl_calldist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pl_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_calltime.d.1m new file mode 100644 index 00000000000..7de6eaf7a7c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pl_calltime.d.1m @@ -0,0 +1,49 @@ +.TH pl_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +pl_calltime.d - measure Perl elapsed times for subroutines. +.SH SYNOPSIS +.B pl_calltime.d + +.SH DESCRIPTION +This traces Perl activity from all programs running on the system with +Perl provider support. + +Filename and subroutine names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Perl provider, which may change +as additional features are introduced. Check Perl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B pl_calltime.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Perl program +.TP +TYPE +Type of call (sub/total) +.TP +NAME +Name of call +.TP +TOTAL +Total elapsed time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +pl_calltime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pl_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_cpudist.d.1m new file mode 100644 index 00000000000..6df61f1bb4d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pl_cpudist.d.1m @@ -0,0 +1,49 @@ +.TH pl_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +pl_cpudist.d - measure Perl on-CPU times for subroutines. +.SH SYNOPSIS +.B pl_cpudist.d + +.SH DESCRIPTION +This traces Perl activity from all programs running on the system with +Perl provider support. + +This script prints distribution plots of elapsed time for Perl subrotines. +Use pl_cputime.d for summary reports. + +Filename and subroutine names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Perl provider, which may change +as additional features are introduced. Check Perl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B pl_cpudist.d +.PP +.SH FIELDS +.TP +1 +Filename of the Perl program +.TP +2 +Type of call (sub) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +pl_cpudist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pl_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_cputime.d.1m new file mode 100644 index 00000000000..f8cf75aed42 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pl_cputime.d.1m @@ -0,0 +1,49 @@ +.TH pl_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +pl_cputime.d - measure Perl on-CPU times for subroutines. +.SH SYNOPSIS +.B pl_cputime.d + +.SH DESCRIPTION +This traces Perl activity from all programs running on the system with +Perl provider support. + +Filename and subroutine names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Perl provider, which may change +as additional features are introduced. Check Perl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B pl_cputime.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Perl program +.TP +TYPE +Type of call (sub/total) +.TP +NAME +Name of call (subroutine name) +.TP +TOTAL +Total on-CPU time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +pl_cputime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pl_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_flow.d.1m new file mode 100644 index 00000000000..d66e4936306 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pl_flow.d.1m @@ -0,0 +1,60 @@ +.TH pl_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +pl_flow.d - snoop Perl execution showing subroutine flow. +.SH SYNOPSIS +.B pl_flow.d + +.SH DESCRIPTION +This traces Perl activity from all Perl programs on the system +running with Perl provider support. + +This watches Perl subroutine entries and returns, and indents child +subroutine calls. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Perl provider, which may change +as additional features are introduced. Check Perl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B pl_flow.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +FILE +Filename that this subroutine belongs to +.TP +SUB +Subroutine name +.SH LEGEND +.TP +\-> +subroutine entry +.TP +<\- +subroutine return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +pl_flow.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pl_flowinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_flowinfo.d.1m new file mode 100644 index 00000000000..0bf1384bfdb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pl_flowinfo.d.1m @@ -0,0 +1,68 @@ +.TH pl_flowinfo.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +pl_flowinfo.d - snoop Perl subroutine flow with info using DTrace. +.SH SYNOPSIS +.B pl_flowinfo.d + +.SH DESCRIPTION +This traces activity from all Perl programs on the system that are +running with Perl provider support. + +Filename and subroutine names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Perl provider, which may change +as additional features are introduced. Check Perl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B pl_flowinfo.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FILE +Filename of the Perl program +.TP +LINE +Line number of filename +.TP +TYPE +Type of call (sub) +.TP +SUB +Perl subroutine +.SH LEGEND +.TP +\-> +subroutine entry +.TP +<\- +subroutine return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +pl_flowinfo.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pl_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_flowtime.d.1m new file mode 100644 index 00000000000..59acddf363e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pl_flowtime.d.1m @@ -0,0 +1,65 @@ +.TH pl_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +pl_flowtime.d - snoop Perl subroutines with flow and delta times. +.SH SYNOPSIS +.B pl_flowtime.d + +.SH DESCRIPTION +This traces shell activity from Perl programs on the system that are +running with Perl provider support. + +This watches Perl subroutine entries and returns, and indents child +subroutine calls. + +Filename and subroutine names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Perl provider, which may change +as additional features are introduced. Check Perl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B pl_flowtime.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +FILE +Filename that this subroutine belongs to +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +SUB +Perl subroutine name +.SH LEGEND +.TP +\-> +method entry +.TP +<\- +method return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +pl_flowtime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pl_malloc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_malloc.d.1m new file mode 100644 index 00000000000..babee557d35 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pl_malloc.d.1m @@ -0,0 +1,39 @@ +.TH pl_malloc.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +pl_malloc.d - Perl libc malloc analysis. +.SH SYNOPSIS +.B pl_malloc.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This is an expiremental script to identify who is calling malloc() for +memory allocation, and to print distribution plots of the requested bytes. +If a malloc() occured while in a Perl subroutine, then that subroutine is +identified as responsible; else the caller of malloc() is identified as +responsible - which will be a function from the Perl engine. + +Filename and subroutine names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Perl provider, which may change +as additional features are introduced. Check Perl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B pl_malloc.d +.PP +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +pl_malloc.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pl_subcalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_subcalls.d.1m new file mode 100644 index 00000000000..710b39dde66 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pl_subcalls.d.1m @@ -0,0 +1,43 @@ +.TH pl_subcalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +pl_subcalls.d - measure Perl subroutine calls using DTrace. +.SH SYNOPSIS +.B pl_subcalls.d + +.SH DESCRIPTION +This traces Perl activity from all running programs on the system +which support the Perl DTrace provider. + +Filename and subroutine names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Perl provider, which may change +as additional features are introduced. Check Perl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B pl_subcalls.d +.PP +.SH FIELDS +.TP +SUB +Perl subroutine name +.TP +CALLS +Subroutine calls during this sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +pl_subcalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pl_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_syscalls.d.1m new file mode 100644 index 00000000000..bd35e5c685b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pl_syscalls.d.1m @@ -0,0 +1,49 @@ +.TH pl_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +pl_syscalls.d - count Perl subroutine calls and syscalls using DTrace. +.SH SYNOPSIS +.B pl_syscalls.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +Filename and subroutine names are printed if available. +The filename for syscalls may be printed as "perl", if the program +was invoked using the form "perl filename" rather than running the +program with an interpreter line. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Perl provider, which may change +as additional features are introduced. Check Perl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B pl_syscalls.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Perl program +.TP +TYPE +Type of call (sub/syscall) +.TP +NAME +Name of call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +pl_syscalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pl_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_syscolors.d.1m new file mode 100644 index 00000000000..5c4c4bac1db --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pl_syscolors.d.1m @@ -0,0 +1,61 @@ +.TH pl_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +pl_syscolors.d - trace Perl subroutine flow plus syscalls, in color. +.SH SYNOPSIS +.B pl_syscolors.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This watches Perl subroutine entries and returns, and indents child +subroutine calls. + +Filename and subroutine names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Perl provider, which may change +as additional features are introduced. Check Perl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B pl_syscolors.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FILE +Filename of the Perl program +.TP +LINE +Line number of filename +.TP +TYPE +Type of call (sub/syscall) +.TP +NAME +Perl subroutine or syscall name +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +pl_syscolors.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pl_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_who.d.1m new file mode 100644 index 00000000000..9239a702384 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pl_who.d.1m @@ -0,0 +1,49 @@ +.TH pl_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +pl_who.d - trace Perl subroutine execution by process using DTrace. +.SH SYNOPSIS +.B pl_who.d + +.SH DESCRIPTION +This traces Perl activity from all Perl programs on the system that are +running with Perl provider support. + +Filenames are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Perl provider, which may change +as additional features are introduced. Check Perl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B pl_who.d +.PP +.SH FIELDS +.TP +PID +Process ID of Perl +.TP +UID +User ID of the owner +.TP +SUBS +Number of subroutine calls +.TP +FILE +Pathname of the Perl program +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +pl_who.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/priclass.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/priclass.d.1m new file mode 100644 index 00000000000..d726ac2588f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/priclass.d.1m @@ -0,0 +1,66 @@ +.TH priclass.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +priclass.d \- priority distribution by scheduling class. Uses DTrace. +.SH SYNOPSIS +.B priclass.d +.SH DESCRIPTION +This is a simple DTrace script that samples at 1000 Hz the current +thread's scheduling class and priority. A distribution plot is printed. + +With priorities, the higher the priority the better chance the thread +has of being scheduled. + +This idea came from the script /usr/demo/dtrace/pri.d, which +produces similar output for priority changes, not samples. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B priclass.d +.PP +.SH FIELDS +.TP +value +process priority +.TP +count +number of samples of at least this priority +.PP +.SH SCHEDULING CLASSES +.TP +TS +time sharing +.TP +IA +interactive +.TP +RT +real time +.TP +SYS +system +.TP +FSS +fair share scheduler +.PP +.SH BASED ON +/usr/demo/dtrace/pri.d +.PP +.SH DOCUMENTATION +DTrace Guide "profile Provider" chapter (docs.sun.com) + +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +priclass.d will sample until Ctrl\-C is hit. +.SH SEE ALSO +pridist.d(1M), dispadmin(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/pridist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pridist.d.1m new file mode 100644 index 00000000000..1e7aba62544 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/pridist.d.1m @@ -0,0 +1,55 @@ +.TH pridist.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +pridist.d \- process priority distribution. Uses DTrace. +.SH SYNOPSIS +.B pridist.d +.SH DESCRIPTION +This is a simple DTrace script that samples at 1000 Hz which process +is on the CPUs, and what the priority is. A distribution plot is printed. + +With priorities, the higher the priority the better chance the process +(actually, thread) has of being scheduled. + +This idea came from the script /usr/demo/dtrace/profpri.d, which +produces similar output for one particular PID. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B pridist.d +.PP +.SH FIELDS +.TP +CMD +process name +.TP +PID +process ID +.TP +value +process priority +.TP +count +number of samples of at least this priority +.PP +.SH BASED ON +/usr/demo/dtrace/profpri.d +.PP +.SH DOCUMENTATION +DTrace Guide "profile Provider" chapter (docs.sun.com) + +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +pridist.d will sample until Ctrl\-C is hit. +.SH SEE ALSO +dispadmin(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/procsystime.1m b/cddl/contrib/dtracetoolkit/Man/man1m/procsystime.1m new file mode 100644 index 00000000000..0df87cf7883 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/procsystime.1m @@ -0,0 +1,108 @@ +.TH procsystime 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +procsystime \- analyse system call times. Uses DTrace. +.SH SYNOPSIS +.B procsystime +[\-acehoT] [ -p PID | -n name | command ] +.SH DESCRIPTION +procsystime prints details on system call times for processes, +both the elapsed times and on-cpu times can be printed. + +The elapsed times are interesting, to help identify syscalls +that take some time to complete (during which the process may +have slept). CPU time helps us identify syscalls that +are consuming CPU cycles to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH OPTIONS +.TP +\-a +print all data +.TP +\-c +print syscall counts +.TP +\-e +print elapsed times, ns +.TP +\-o +print CPU times, ns +.TP +\-T +print totals +.TP +\-p PID +examine this PID +.TP +\-n name +examine processes which have this name +.SH EXAMPLES +.TP +Print elapsed times for PID 1871, +# +.B procsystime +\-p 1871 +.PP +.TP +Print elapsed times for processes called "tar", +# +.B procsystime +\-n tar +.PP +.TP +Print CPU times for "tar" processes, +# +.B procsystime +\-on tar +.PP +.TP +Print syscall counts for "tar" processes, +# +.B procsystime +\-cn tar +.PP +.TP +Print elapsed and CPU times for "tar" processes, +# +.B procsystime +\-eon tar +.PP +.TP +print all details for "bash" processes, +# +.B procsystime +\-aTn bash +.PP +.TP +run and print details for "df -h", +# +.B procsystime +df \-h +.PP +.SH FIELDS +.TP +SYSCALL +System call name +.TP +TIME (ns) +Total time, nanoseconds +.TP +COUNT +Number of occurrences +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +procsystime will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtruss(1M), dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/putnexts.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/putnexts.d.1m new file mode 100644 index 00000000000..59335673299 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/putnexts.d.1m @@ -0,0 +1,27 @@ +.TH putnexts.d 1m "$Date:: 2007-09-12 #$" "USER COMMANDS" +.SH NAME +putnexts.d - +.SH SYNOPSIS +.SH DESCRIPTION + +.SH OS +Solaris +.SH STABILITY +stable - +.SH EXAMPLES +.TP +Default output, +# +.B putnexts.d +.PP +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +putnexts.d will run until Ctrl-C is hit. +.SH AUTHOR + +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_calldist.d.1m new file mode 100644 index 00000000000..1592af5e822 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_calldist.d.1m @@ -0,0 +1,49 @@ +.TH py_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_calldist.d - measure Python elapsed times for functions. +.SH SYNOPSIS +.B py_calldist.d + +.SH DESCRIPTION +This traces Python activity from all programs running on the system with +Python provider support. + +This script prints distribution plots of elapsed time for Python +operations. Use py_calltime.d for summary reports. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_calldist.d +.PP +.SH FIELDS +.TP +1 +Filename of the Python program +.TP +2 +Type of call (func) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_calldist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_calltime.d.1m new file mode 100644 index 00000000000..e055eb33366 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_calltime.d.1m @@ -0,0 +1,49 @@ +.TH py_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_calltime.d - measure Python elapsed times for functions. +.SH SYNOPSIS +.B py_calltime.d + +.SH DESCRIPTION +This traces Python activity from all programs running on the system with +Python provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_calltime.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Python program +.TP +TYPE +Type of call (func/total) +.TP +NAME +Name of call +.TP +TOTAL +Total elapsed time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_calltime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_cpudist.d.1m new file mode 100644 index 00000000000..825fc640128 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_cpudist.d.1m @@ -0,0 +1,49 @@ +.TH py_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_cpudist.d - measure Python on-CPU times for functions. +.SH SYNOPSIS +.B py_cpudist.d + +.SH DESCRIPTION +This traces Python activity from all programs running on the system with +Python provider support. + +This script prints distribution plots of elapsed time for Python +operations. Use py_cputime.d for summary reports. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_cpudist.d +.PP +.SH FIELDS +.TP +1 +Filename of the Python program +.TP +2 +Type of call (func) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_cpudist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_cputime.d.1m new file mode 100644 index 00000000000..f926204bb2b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_cputime.d.1m @@ -0,0 +1,49 @@ +.TH py_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_cputime.d - measure Python on-CPU times for functions. +.SH SYNOPSIS +.B py_cputime.d + +.SH DESCRIPTION +This traces Python activity from all programs running on the system with +Python provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_cputime.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Python program +.TP +TYPE +Type of call (func/total) +.TP +NAME +Name of call (function name) +.TP +TOTAL +Total on-CPU time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_cputime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_flow.d.1m new file mode 100644 index 00000000000..3659e0f6370 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_flow.d.1m @@ -0,0 +1,60 @@ +.TH py_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_flow.d - snoop Python execution showing function flow. +.SH SYNOPSIS +.B py_flow.d + +.SH DESCRIPTION +This traces Python activity from all Python programs on the system +running with Python provider support. + +This watches Python function entries and returns, and indents child +function calls. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_flow.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +FILE +Filename that this function belongs to +.TP +FUNC +Function name +.SH LEGEND +.TP +\-> +function entry +.TP +<\- +function return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_flow.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_flowinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_flowinfo.d.1m new file mode 100644 index 00000000000..4a25d0db2bd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_flowinfo.d.1m @@ -0,0 +1,68 @@ +.TH py_flowinfo.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_flowinfo.d - snoop Python function flow with info using DTrace. +.SH SYNOPSIS +.B py_flowinfo.d + +.SH DESCRIPTION +This traces activity from all Python programs on the system that are +running with Python provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_flowinfo.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FILE +Filename of the Python program +.TP +LINE +Line number of filename +.TP +TYPE +Type of call (func) +.TP +FUNC +Python function +.SH LEGEND +.TP +\-> +function entry +.TP +<\- +function return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_flowinfo.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_flowtime.d.1m new file mode 100644 index 00000000000..67882957e5c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_flowtime.d.1m @@ -0,0 +1,65 @@ +.TH py_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_flowtime.d - snoop Python functions with flow and delta times. +.SH SYNOPSIS +.B py_flowtime.d + +.SH DESCRIPTION +This traces shell activity from Python programs on the system that are +running with Python provider support. + +This watches Python function entries and returns, and indents child +function calls. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_flowtime.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +FILE +Filename that this function belongs to +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FUNC +Python function name +.SH LEGEND +.TP +\-> +function entry +.TP +<\- +function return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_flowtime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_funccalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_funccalls.d.1m new file mode 100644 index 00000000000..8a54976199e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_funccalls.d.1m @@ -0,0 +1,43 @@ +.TH py_funccalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_funccalls.d - measure Python function calls using DTrace. +.SH SYNOPSIS +.B py_funccalls.d + +.SH DESCRIPTION +This traces Python activity from all running programs on the system +which support the Python DTrace provider. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_funccalls.d +.PP +.SH FIELDS +.TP +FUNC +Python function name +.TP +CALLS +Function calls during this sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_funccalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_malloc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_malloc.d.1m new file mode 100644 index 00000000000..4468da8ae2b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_malloc.d.1m @@ -0,0 +1,39 @@ +.TH py_malloc.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_malloc.d - Python libc malloc analysis. +.SH SYNOPSIS +.B py_malloc.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This is an expiremental script to identify who is calling malloc() for +memory allocation, and to print distribution plots of the requested bytes. +If a malloc() occured while in a Python function, then that function is +identified as responsible; else the caller of malloc() is identified as +responsible - which will be a function from the Python engine. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_malloc.d +.PP +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_malloc.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_mallocstk.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_mallocstk.d.1m new file mode 100644 index 00000000000..fac0a1789b5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_mallocstk.d.1m @@ -0,0 +1,33 @@ +.TH py_mallocstk.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_mallocstk.d - Python libc malloc analysis with full stack traces. +.SH SYNOPSIS +.B py_mallocstk.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION + +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_mallocstk.d +.PP +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_mallocstk.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_profile.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_profile.d.1m new file mode 100644 index 00000000000..282bf48104f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_profile.d.1m @@ -0,0 +1,54 @@ +.TH py_profile.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_profile.d - sample stack traces with Python translations using DTrace. +.SH SYNOPSIS +.B py_profile.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This samples stack traces for the process specified. This stack trace +will cross the Python engine and system libraries, and insert +translations for Python stack frames where appropriate. This is best +explained with an example stack frame output, + +libpython2.4.so.1.0`PyEval_EvalFrame+0x2fbf +[ ./func_loop.py:5 (func_c) ] +libpython2.4.so.1.0`fast_function+0xa8 +libpython2.4.so.1.0`call_function+0xda +libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf +[ ./func_loop.py:11 (func_b) ] +libpython2.4.so.1.0`fast_function+0xa8 +libpython2.4.so.1.0`call_function+0xda +libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf +[ ./func_loop.py:14 (func_a) ] +libpython2.4.so.1.0`fast_function+0xa8 +libpython2.4.so.1.0`call_function+0xda +libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf +[ ./func_loop.py:16 (?) ] + +The lines in square brackets are the native Python frames, the rest +are the Python engine. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_profile.d +.PP +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_profile.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_syscalls.d.1m new file mode 100644 index 00000000000..cd471234971 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_syscalls.d.1m @@ -0,0 +1,49 @@ +.TH py_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_syscalls.d - count Python function calls and syscalls using DTrace. +.SH SYNOPSIS +.B py_syscalls.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +Filename and function names are printed if available. +The filename for syscalls may be printed as "python", if the program +was invoked using the form "python filename" rather than running the +program with an interpreter line. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_syscalls.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Python program +.TP +TYPE +Type of call (func/syscall) +.TP +NAME +Name of call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_syscalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_syscolors.d.1m new file mode 100644 index 00000000000..210fa1b61f7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_syscolors.d.1m @@ -0,0 +1,61 @@ +.TH py_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_syscolors.d - trace Python function flow plus syscalls, in color. +.SH SYNOPSIS +.B py_syscolors.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This watches Python function entries and returns, and indents child +function calls. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_syscolors.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FILE +Filename of the Python program +.TP +LINE +Line number of filename +.TP +TYPE +Type of call (func/syscall) +.TP +NAME +Python function or syscall name +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_syscolors.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/py_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_who.d.1m new file mode 100644 index 00000000000..e88190e6462 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/py_who.d.1m @@ -0,0 +1,49 @@ +.TH py_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +py_who.d - trace Python function execution by process using DTrace. +.SH SYNOPSIS +.B py_who.d + +.SH DESCRIPTION +This traces Python activity from all Python programs on the system that are +running with Python provider support. + +Filenames are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Python provider, which may change +as additional features are introduced. Check Python/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B py_who.d +.PP +.SH FIELDS +.TP +PID +Process ID of Python +.TP +UID +User ID of the owner +.TP +FUNCS +Number of function calls +.TP +FILE +Pathname of the Python program +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +py_who.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_calldist.d.1m new file mode 100644 index 00000000000..57a97562019 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_calldist.d.1m @@ -0,0 +1,49 @@ +.TH rb_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_calldist.d - measure Ruby elapsed times for types of operation. +.SH SYNOPSIS +.B rb_calldist.d + +.SH DESCRIPTION +This traces Ruby activity from all programs running on the system with +Ruby provider support. + +This script prints distribution plots of elapsed time for Ruby +operations. Use rb_calltime.d for summary reports. + +Filename and method names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_calldist.d +.PP +.SH FIELDS +.TP +1 +Filename of the Ruby program +.TP +2 +Type of call (method/obj-new/gc) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_calldist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_calls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_calls.d.1m new file mode 100644 index 00000000000..3e328f3ce7c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_calls.d.1m @@ -0,0 +1,49 @@ +.TH rb_calls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_calls.d - count Ruby calls using DTrace. +.SH SYNOPSIS +.B rb_calls.d + +.SH DESCRIPTION +This traces activity from all Ruby programs on the system that are +running with Ruby provider support. + +Filename and method names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_calls.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Ruby program +.TP +TYPE +Type of call (method/obj-new/...) +.TP +NAME +Descriptive name of call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_calls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_calltime.d.1m new file mode 100644 index 00000000000..0787a93aa50 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_calltime.d.1m @@ -0,0 +1,49 @@ +.TH rb_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_calltime.d - measure Ruby elapsed times for types of operation. +.SH SYNOPSIS +.B rb_calltime.d + +.SH DESCRIPTION +This traces Ruby activity from all programs running on the system with +Ruby provider support. + +Filename and method names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_calltime.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Ruby program +.TP +TYPE +Type of call (method/obj-new/gc/total) +.TP +NAME +Name of call +.TP +TOTAL +Total elapsed time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_calltime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_cpudist.d.1m new file mode 100644 index 00000000000..ff4f283bbf3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_cpudist.d.1m @@ -0,0 +1,49 @@ +.TH rb_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_cpudist.d - measure Ruby on-CPU times for types of operation. +.SH SYNOPSIS +.B rb_cpudist.d + +.SH DESCRIPTION +This traces Ruby activity from all programs running on the system with +Ruby provider support. + +This script prints distribution plots of elapsed time for Ruby +operations. Use rb_cputime.d for summary reports. + +Filename and method names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_cpudist.d +.PP +.SH FIELDS +.TP +1 +Filename of the Ruby program +.TP +2 +Type of call (method/obj-new/gc) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_cpudist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_cputime.d.1m new file mode 100644 index 00000000000..7e8302b895a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_cputime.d.1m @@ -0,0 +1,49 @@ +.TH rb_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_cputime.d - measure Ruby on-CPU times for types of operation. +.SH SYNOPSIS +.B rb_cputime.d + +.SH DESCRIPTION +This traces Ruby activity from all programs running on the system with +Ruby provider support. + +Filename and method names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_cputime.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Ruby program +.TP +TYPE +Type of call (method/obj-new/gc/total) +.TP +NAME +Name of call +.TP +TOTAL +Total on-CPU time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_cputime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_flow.d.1m new file mode 100644 index 00000000000..fa1f51834cf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_flow.d.1m @@ -0,0 +1,59 @@ +.TH rb_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_flow.d - snoop Ruby execution showing method flow using DTrace. +.SH SYNOPSIS +.B rb_flow.d + +.SH DESCRIPTION +This traces activity from all Ruby programs on the system that are +running with Ruby provider support. + +Filename and method names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_flow.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +FILE +Filename that this method belongs to +.TP +CLASS::METHOD +Ruby classname and method +.SH LEGEND +.TP +\-> +method entry +.TP +<\- +method return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_flow.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_flowinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_flowinfo.d.1m new file mode 100644 index 00000000000..08e124fbfa2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_flowinfo.d.1m @@ -0,0 +1,68 @@ +.TH rb_flowinfo.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_flowinfo.d - snoop Ruby function (method) flow with info using DTrace. +.SH SYNOPSIS +.B rb_flowinfo.d + +.SH DESCRIPTION +This traces activity from all Ruby programs on the system that are +running with Ruby provider support. + +Filename and method names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_flowinfo.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FILE +Filename of the Ruby program +.TP +LINE +Line number of filename +.TP +TYPE +Type of call (method) +.TP +NAME +Ruby class and method name +.SH LEGEND +.TP +\-> +method entry +.TP +<\- +method return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_flowinfo.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_flowtime.d.1m new file mode 100644 index 00000000000..64425b37f7b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_flowtime.d.1m @@ -0,0 +1,62 @@ +.TH rb_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_flowtime.d - snoop Ruby function (method) flow using DTrace. +.SH SYNOPSIS +.B rb_flowtime.d + +.SH DESCRIPTION +This traces activity from all Ruby programs on the system that are +running with Ruby provider support. + +Filename and method names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_flowtime.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +FILE +Filename that this method belongs to +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +CLASS::METHOD +Ruby class and method name +.SH LEGEND +.TP +\-> +method entry +.TP +<\- +method return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_flowtime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_funccalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_funccalls.d.1m new file mode 100644 index 00000000000..c4fe9fad251 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_funccalls.d.1m @@ -0,0 +1,46 @@ +.TH rb_funccalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_funccalls.d - count Ruby function (method) calls using DTrace. +.SH SYNOPSIS +.B rb_funccalls.d + +.SH DESCRIPTION +This traces activity from all Ruby programs on the system that are +running with Ruby provider support. + +Filename and method names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_funccalls.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Ruby program +.TP +METHOD +Method name +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_funccalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_lines.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_lines.d.1m new file mode 100644 index 00000000000..4bdbabcafb5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_lines.d.1m @@ -0,0 +1,46 @@ +.TH rb_lines.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_lines.d - trace Ruby line execution by process using DTrace. +.SH SYNOPSIS +.B rb_who.d + +.SH DESCRIPTION +This traces Ruby activity from all Ruby programs on the system that are +running with Ruby provider support. + +Filenames are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_lines.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Ruby program +.TP +LINE +Line number +.TP +COUNT +Number of times a line was executed +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_lines.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_malloc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_malloc.d.1m new file mode 100644 index 00000000000..d86bc46d14b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_malloc.d.1m @@ -0,0 +1,47 @@ +.TH rb_malloc.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_malloc.d - Ruby operations and libc malloc statistics. +.SH SYNOPSIS +.B rb_malloc.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +Filename and method names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_malloc.d +.PP +.SH FIELDS +.TP +1 +Filename of the Ruby program +.TP +2 +Type of operation (method/objnew/startup) +.TP +3 +Name of operation +.SH WARNING +This script is not 100% accurate; This prints libc malloc() byte +distributions by "recent" Ruby operation, which we hope will be usually +relevant. This is an experimental script that may be improved over time. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_malloc.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_objcpu.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_objcpu.d.1m new file mode 100644 index 00000000000..6d1d8b1e292 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_objcpu.d.1m @@ -0,0 +1,36 @@ +.TH rb_objcpu.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_objcpu.d - measure Ruby object creation on-CPU time using DTrace. +.SH SYNOPSIS +.B rb_objcpu.d + +.SH DESCRIPTION +This traces Ruby activity from all programs running on the system with +Ruby provider support. + +Class names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_objcpu.d +.PP +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_objcpu.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_objnew.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_objnew.d.1m new file mode 100644 index 00000000000..e40f493a499 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_objnew.d.1m @@ -0,0 +1,46 @@ +.TH rb_objnew.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_objnew.d - count Ruby object creation using DTrace. +.SH SYNOPSIS +.B rb_objnew.d + +.SH DESCRIPTION +This traces Ruby activity from all programs running on the system with +Ruby provider support. + +Filename and class names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_objnew.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Ruby program +.TP +CLASS +Class of new object +.TP +COUNT +Number of object creations during tracing +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_objnew.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_stat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_stat.d.1m new file mode 100644 index 00000000000..070faf42781 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_stat.d.1m @@ -0,0 +1,66 @@ +.TH rb_stat.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_stat.d - Ruby operation stats using DTrace. +.SH SYNOPSIS +.B rb_stat.d +[interval [count]] +.SH DESCRIPTION +This traces activity from all Ruby programs on the system that are +running with Ruby provider support. + +The numbers are counts for the interval specified. The default interval +is 1 second. + +If you see a count in "EXECS" but not in the other columns, then your +Ruby software is probably not running with the DTrace Ruby provider. +See Ruby/Readme. + +Filename and method names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_stat.d +.PP +.SH FIELDS +.TP +EXEC/s +Ruby programs executed per second, including +those without Ruby provider support +.TP +METHOD/s +Methods called, per second +.TP +OBJNEW/s +Objects created, per second +.TP +OBJFRE/s +Objects freed, per second +.TP +RAIS/s +Raises, per second +.TP +RESC/s +Rescues, per second +.TP +GC/s +Garbage collects, per second +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_stat.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_syscalls.d.1m new file mode 100644 index 00000000000..9fbe81d3f10 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_syscalls.d.1m @@ -0,0 +1,49 @@ +.TH rb_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_syscalls.d - count Ruby calls and syscalls using DTrace. +.SH SYNOPSIS +.B rb_syscalls.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +Filename and method names are printed if available. +The filename for syscalls may be printed as "ruby", if the program +was invoked using the form "ruby filename" rather than running the +program with an interpreter line. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_syscalls.d +.PP +.SH FIELDS +.TP +FILE +Filename of the Ruby program +.TP +TYPE +Type of call (method/syscall) +.TP +NAME +Name of call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_syscalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_syscolors.d.1m new file mode 100644 index 00000000000..bd18be9ea7d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_syscolors.d.1m @@ -0,0 +1,61 @@ +.TH rb_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_syscolors.d - trace Ruby method flow plus syscalls, in color. +.SH SYNOPSIS +.B rb_syscolors.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This watches Ruby method entries and returns, and indents child +function calls. + +Filename and method names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_syscolors.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FILE +Filename of the Ruby program +.TP +LINE +Line number of filename +.TP +TYPE +Type of call (method/line/syscall) +.TP +NAME +Ruby method or syscall name +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_syscolors.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rb_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_who.d.1m new file mode 100644 index 00000000000..5dd13d5e727 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rb_who.d.1m @@ -0,0 +1,49 @@ +.TH rb_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +rb_who.d - trace Ruby line execution by process using DTrace. +.SH SYNOPSIS +.B rb_who.d + +.SH DESCRIPTION +This traces Ruby activity from all Ruby programs on the system that are +running with Ruby provider support. + +Filenames are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Ruby provider, which may change +as additional features are introduced. Check Ruby/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B rb_who.d +.PP +.SH FIELDS +.TP +PID +Process ID of Ruby +.TP +UID +User ID of the owner +.TP +LINES +Number of times a line was executed +.TP +FILE +Pathname of the Ruby program +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +rb_who.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/readbytes.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/readbytes.d.1m new file mode 100644 index 00000000000..697339d493e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/readbytes.d.1m @@ -0,0 +1,47 @@ +.TH readbytes.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +readbytes.d \- read bytes by process name. Uses DTrace. +.SH SYNOPSIS +.B readbytes.d +.SH DESCRIPTION +readbytes.d is a DTrace OneLiner to a report of the number of +bytes read by process name. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sysinfo provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B readbytes.d +.PP +.SH FIELDS +.TP +first field +This is the process name. There may be several PIDs that have the +same process name, for example with numerous instances of "bash". The +value reported will be the sum of them all. +.TP +second field +This is the number of bytes read. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +readbytes.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/readdist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/readdist.d.1m new file mode 100644 index 00000000000..e11b21c7b0b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/readdist.d.1m @@ -0,0 +1,54 @@ +.TH readdist.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +readdist.d \- read distrib. by process name. Uses DTrace. +.SH SYNOPSIS +.B readdist.d +.SH DESCRIPTION +readdist.d is a DTrace OneLiner to a report the read size and +number of occurrences as a frequency distribution by process name. + +This can be useful to identify the behaviour of processes +that are doing reads. Are they using many small reads, or +fewer large reads. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sysinfo provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B readdist.d +.PP +.SH FIELDS +.TP +process name +The process name. There may be several PIDs that have the +same process name, for example with numerous instances of "bash". The +value reported will be the sum of them all. +.TP +value +The size in bytes +.TP +count +The number of occurrences that were at least this size +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +readdist.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rfileio.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rfileio.d.1m new file mode 100644 index 00000000000..08c25e9d4de --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rfileio.d.1m @@ -0,0 +1,41 @@ +.TH rfileio.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +rfileio.d \- read file I/O stats, with cache miss rate. Uses DTrace. +.SH SYNOPSIS +.B rfileio.d +.SH DESCRIPTION +This script provides statistics on the number of reads and the bytes +read from filesystems (logical), and the number of bytes read from +disk (physical). A summary is printed every five seconds by file. + +A total miss-rate is also provided for the file system cache. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Print a summary of activity every five seconds. +# +.B rfileio.d +.PP +.SH IDEA +Richard McDougall, Solaris Internals 2nd Ed, FS Chapter. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +rfileio.d will run until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +rfsio.d(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rfsio.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rfsio.d.1m new file mode 100644 index 00000000000..ecbb786a84e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rfsio.d.1m @@ -0,0 +1,41 @@ +.TH rfsio.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +rfsio.d \- read FS I/O stats, with cache miss rate. Uses DTrace. +.SH SYNOPSIS +.B rfsio.d +.SH DESCRIPTION +This script provides statistics on the number of reads and the bytes +read from filesystems (logical), and the number of bytes read from +disk (physical). A summary is printed every five seconds by filesystem. + +A total miss-rate is also provided for the file system cache. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Print a summary of activity every five seconds. +# +.B rfsio.d +.PP +.SH IDEA +Richard McDougall, Solaris Internals 2nd Ed, FS Chapter. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +rfsio.d will run until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +rfileio.d(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/runocc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/runocc.d.1m new file mode 100644 index 00000000000..0ba529ffcd8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/runocc.d.1m @@ -0,0 +1,46 @@ +.TH runocc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +runocc.d \- run queue occupancy by CPU. Uses DTrace. +.SH SYNOPSIS +.B runocc.d +.SH DESCRIPTION +This prints the dispatcher run queue occupancy by CPU each second. +A consistant run queue occupancy is a sign of CPU saturation. + +The value is similar to that seen in "sar -q", however this is +calculated in a more accurate manner - sampling at 1000 Hertz. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable. +.SH EXAMPLES +.TP +Print %runocc by CPU every second, +# +.B runocc.d +.PP +.SH FIELDS +.TP +CPU +cpu ID +.TP +%runocc +percent run queue occupancy, sampled at 1000 Hertz +.PP +.SH SEE ALSO +Solaris Internals 2nd Ed, vol 2, CPU chapter +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +runocc.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rwbbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rwbbypid.d.1m new file mode 100644 index 00000000000..36ab3f24ed0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rwbbypid.d.1m @@ -0,0 +1,48 @@ +.TH rwbbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +rwbbypid.d \- read/write bytes by PID. Uses DTrace. +.SH SYNOPSIS +.B rwbbypid.d +.SH DESCRIPTION +This script tracks the bytes read and written at the syscall level +by processes, printing the totals in a report. This is tracking the +successful number of bytes read or written. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sysinfo provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B rwbbypid.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +process name +.TP +DIR +direction, Read or Write +.TP +BYTES +total bytes +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +rwbbypid.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +rwbypid.d(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rwbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rwbypid.d.1m new file mode 100644 index 00000000000..869eb80e855 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rwbypid.d.1m @@ -0,0 +1,48 @@ +.TH rwbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +rwbypid.d \- read/write calls by PID. Uses DTrace. +.SH SYNOPSIS +.B rwbypid.d +.SH DESCRIPTION +This script tracks the number of reads and writes at the syscall level +by processes, printing the totals in a report. This matches reads +and writes whether they succeed or not. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B rwbypid.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +process name +.TP +DIR +direction, Read or Write +.TP +COUNT +total calls +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +rwbypid.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +rwbbypid.d(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rwbytype.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rwbytype.d.1m new file mode 100644 index 00000000000..85c8194baa9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rwbytype.d.1m @@ -0,0 +1,54 @@ +.TH rwbytype.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +rwbytype.d \- read/write bytes by vnode type. Uses DTrace. +.SH SYNOPSIS +.B rwbytype.d +.SH DESCRIPTION +This program identifies the vnode type of read/write activity - whether +that is for regular files, sockets, character special devices, etc. This +is measuring at the application level, so file activity may well be +cached by the system. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B rwbytype.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +process name +.TP +VNODE +vnode type (describes I/O type) +.TP +DIR +direction, Read or Write +.TP +BYTES +total bytes +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +rwbytype.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +rwbypid.d(1M), rwbbypid.d(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rwsnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rwsnoop.1m new file mode 100644 index 00000000000..d6e544169ce --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rwsnoop.1m @@ -0,0 +1,104 @@ +.TH rwsnoop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +rwsnoop \- snoop read/write events. Uses DTrace. +.SH SYNOPSIS +.B rwsnoop +[\-jPtvZ] [\-n name] [\-p PID] +.SH DESCRIPTION +This is measuring reads and writes at the application level. This +matches the syscalls read, write, pread and pwrite. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH OPTIONS +.TP +\-j +print project ID +.TP +\-P +print parent process ID +.TP +\-t +print timestamp, us +.TP +\-v +print time, string +.TP +\-Z +print zone ID +.TP +\-n name +process name to track +.TP +\-p PID +PID to track +.PP +.SH EXAMPLES +.TP +Default output, +# +.B rwsnoop +.TP +Print zone ID, +# +.B rwsnoop +-\Z +.TP +Monitor processes named "bash", +# +.B rwsnoop +\-n bash +.PP +.SH FIELDS +.TP +TIME +timestamp, us +.TP +TIMESTR +time, string +.TP +ZONE +zone ID +.TP +PROJ +project ID +.TP +UID +user ID +.TP +PID +process ID +.TP +PPID +parent process ID +.TP +CMD +command name for the process +.TP +D +direction, Read or Write +.TP +BYTES +total bytes during sample +.TP +FILE +filename, if file based. +Reads and writes that are not file based, for example with sockets, will +print "" as the filename. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +rwsnoop will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +rwtop(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rwtop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rwtop.1m new file mode 100644 index 00000000000..82af043462b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rwtop.1m @@ -0,0 +1,115 @@ +.TH rwtop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +rwtop \- display top read/write bytes process. Uses DTrace. +.SH SYNOPSIS +.B rwtop +[\-Cc] [\-j|\-Z] [\-n name] [\-p PID] +[\-t top] [interval [count]] +.SH DESCRIPTION +This is measuring reads and writes at the application level. +This matches read and write system calls. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sysinfo provider. +.SH OPTIONS +.TP +\-C +don't clear the screen +.TP +\-c +print counts +.TP +\-j +print project ID +.TP +\-Z +print zone ID +.TP +\-n name +process name to track +.TP +\-p PID +PID to track +.TP +\-t top +print top number only +.PP +.SH EXAMPLES +.TP +Default output, print summary every 5 seconds +# +.B rwtop +.PP +.TP +One second samples, +# +.B rwtop +1 +.TP +Print top 10 lines only, +# +.B rwtop +\-t 10 +.TP +Monitor processes named "bash", +# +.B rwtop +\-n bash +.TP +Print 12 x 5 second samples, scrolling, +# +.B rwtop +\-C 5 12 +.PP +.SH FIELDS +.TP +PROJ +project ID +.TP +ZONE +zone ID +.TP +UID +user ID +.TP +PID +process ID +.TP +PPID +parent process ID +.TP +CMD +command name for the process +.TP +D +direction, Read or Write +.TP +BYTES +total bytes during sample +.TP +load +1 minute load average +.TP +app_r +total read Kb for sample +.TP +app_w +total write Kb for sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +rwtop will run forever until Ctrl\-C is hit, or the specified +interval is reached. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +iotop(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sampleproc.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sampleproc.1m new file mode 100644 index 00000000000..0ae3a2de900 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sampleproc.1m @@ -0,0 +1,55 @@ +.TH sampleproc 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +sampleproc \- sample processes on the CPUs. Uses DTrace. +.SH SYNOPSIS +.B sampleproc [hertz] +.SH DESCRIPTION +This program samples which process is on each CPU, at a particular +configurable rate. This can be used as an estimate for which process +is consuming the most CPU time. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - uses the ncpus_online kernel symbol. +.SH EXAMPLES +.TP +Sample at 100 hertz, +# +.B sampleproc +.TP +Sample at 400 hertz, +# +.B sampleproc +400 +.PP +.SH FIELDS +.TP +PID +process ID +.TP +COMMAND +command name +.TP +COUNT +number of samples +.TP +PERCENT +percent of CPU usage +.PP +.SH BASED ON +/usr/demo/dtrace/prof.d +.PP +.SH DOCUMENTATION +DTrace Guide "profile Provider" chapter (docs.sun.com) + +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +sampleproc will sample until Ctrl\-C is hit. +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sar-c.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sar-c.d.1m new file mode 100644 index 00000000000..10192fb4875 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sar-c.d.1m @@ -0,0 +1,62 @@ +.TH sar\-c.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +sar\-c.d \- sar \-c demo in DTrace. Uses DTrace. +.SH SYNOPSIS +.B sar\-c.d +.SH DESCRIPTION +This has been written to demonstrate fetching the same data as sar \-c +from DTrace. This program is intended as a starting point for other +DTrace scripts, by beginning with familiar statistics. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall and sysinfo providers. +.SH EXAMPLES +.TP +Print system call counts every second, +# +.B sar\-c.d +.PP +.SH FIELDS +.TP +scall/s +System calls +.TP +sread/s +reads +.TP +swrit/s +writes +.TP +fork/s +forks +.TP +exec/s +execs +.TP +rchar/s +read characters +.TP +wchar/s +write characters +.PP +.SH IDEA +David Rubio, who also wrote the original. +.PP +.SH NOTES +As this program does not use Kstat, there is no summary since boot line. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +sar\-c.d will run until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +sar(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/seeksize.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/seeksize.d.1m new file mode 100644 index 00000000000..f15743d1e19 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/seeksize.d.1m @@ -0,0 +1,51 @@ +.TH seeksize.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +seeksize.d \- print disk event seek report. Uses DTrace. +.SH SYNOPSIS +.B seeksize.d +.SH DESCRIPTION +seeksize.d is a simple DTrace program to print a report of disk +event seeks by process. + +This can be used to identify whether processes are accessing the +disks in a "random" or "sequential" manner. Sequential is often +desirable, indicated by mostly zero length seeks. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the io provider. +.SH EXAMPLES +.TP +Sample until Ctrl\-C is hit then print report, +# +.B seeksize.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +command and argument list +.TP +value +distance in disk blocks (sectors) +.TP +count +number of I/O operations +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +seeksize.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +iosnoop(1M), bitesize.d(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/setuids.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/setuids.d.1m new file mode 100644 index 00000000000..50d131cf551 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/setuids.d.1m @@ -0,0 +1,53 @@ +.TH setuids.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +setuids.d \- snoop setuid calls as they occur. Uses DTrace. +.SH SYNOPSIS +.B setuids.d +.SH DESCRIPTION +setuids.d is a simple DTrace program to print details of setuid +calls, where a process assumes a different UID. These are usually +related to login events. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH EXAMPLES +.TP +Default output, print setuids as they occur, +# +.B setuids.d +.PP +.SH FIELDS +.TP +UID +user ID (from) +.TP +SUID +set user ID (to) +.TP +PPID +parent process ID +.TP +PID +process ID +.TP +PCMD +parent command +.TP +CMD +command (with arguments) +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +setuids.d will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), bsmconv(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_calldist.d.1m new file mode 100644 index 00000000000..760e699c0e4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_calldist.d.1m @@ -0,0 +1,49 @@ +.TH sh_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_calldist.d - measure Bourne shell elapsed times for types of operation. +.SH SYNOPSIS +.B sh_calldist.d + +.SH DESCRIPTION +This traces shell activity from all Bourne shells on the system that are +running with sh provider support. + +This script prints distribution plots of elapsed time for shell +operations. Use sh_calltime.d for summary reports. + +Filename and call names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_calldist.d +.PP +.SH FIELDS +.TP +1 +Filename of the shell or shellscript +.TP +2 +Type of call (func/builtin/cmd) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_calldist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_calls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_calls.d.1m new file mode 100644 index 00000000000..0afeaab6883 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_calls.d.1m @@ -0,0 +1,49 @@ +.TH sh_calls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_calls.d - count Bourne calls (func/builtin/cmd/subsh) using DTrace. +.SH SYNOPSIS +.B sh_calls.d + +.SH DESCRIPTION +This traces shell activity from all Bourne shells on the system that are +running with sh provider support. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_calls.d +.PP +.SH FIELDS +.TP +FILE +Filename of the shell or shellscript +.TP +TYPE +Type of call (func/builtin/cmd/subsh) +.TP +NAME +Name of call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_calls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_calltime.d.1m new file mode 100644 index 00000000000..6863d870a33 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_calltime.d.1m @@ -0,0 +1,49 @@ +.TH sh_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_calltime.d - measure Bourne shell elapsed times for types of operation. +.SH SYNOPSIS +.B sh_calltime.d + +.SH DESCRIPTION +This traces shell activity from all Bourne shells on the system that are +running with sh provider support. + +Filename and call names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_calltime.d +.PP +.SH FIELDS +.TP +FILE +Filename of the shell or shellscript +.TP +TYPE +Type of call (func/builtin/cmd/total) +.TP +NAME +Name of call +.TP +TOTAL +Total elapsed time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_calltime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_cpudist.d.1m new file mode 100644 index 00000000000..998e6ee8a42 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_cpudist.d.1m @@ -0,0 +1,49 @@ +.TH sh_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_cpudist.d - measure Bourne shell on-CPU times for types of operation. +.SH SYNOPSIS +.B sh_cpudist.d + +.SH DESCRIPTION +This traces shell activity from all Bourne shells on the system that are +running with sh provider support. + +This script prints distribution plots of on-CPU time for shell +operations. Use sh_cputime.d for summary reports. + +Filename and call names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_cpudist.d +.PP +.SH FIELDS +.TP +1 +Filename of the shell or shellscript +.TP +2 +Type of call (func/builtin/cmd) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_cpudist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_cputime.d.1m new file mode 100644 index 00000000000..3c98f94e213 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_cputime.d.1m @@ -0,0 +1,49 @@ +.TH sh_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_cputime.d - measure Bourne shell on-CPU times for types of operation. +.SH SYNOPSIS +.B sh_cputime.d + +.SH DESCRIPTION +This traces shell activity from all Bourne shells on the system that are +running with sh provider support. + +Filename and call names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_cputime.d +.PP +.SH FIELDS +.TP +FILE +Filename of the shell or shellscript +.TP +TYPE +Type of call (func/builtin/cmd/total) +.TP +NAME +Name of call +.TP +TOTAL +Total on-CPU time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_cputime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_flow.d.1m new file mode 100644 index 00000000000..42dc5cc4206 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_flow.d.1m @@ -0,0 +1,66 @@ +.TH sh_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_flow.d - snoop Bourne shell execution showing function flow using DTrace. +.SH SYNOPSIS +.B sh_flow.d + +.SH DESCRIPTION +This traces shell activity from all Bourne shells on the system that are +running with sh provider support. + +This watches shell function entries and returns, and indents child +function calls. Shell builtins are also printed. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_flow.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +FILE +Filename that this function belongs to +.TP +NAME +Shell function, builtin or command name +.SH LEGEND +.TP +\-> +function entry +.TP +<\- +function return +.TP +> +builtin +.TP +| +external command +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_flow.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_flowinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_flowinfo.d.1m new file mode 100644 index 00000000000..6fa15007821 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_flowinfo.d.1m @@ -0,0 +1,62 @@ +.TH sh_flowinfo.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_flowinfo.d - snoop Bourne shell flow with additional info. +.SH SYNOPSIS +.B sh_flowinfo.d + +.SH DESCRIPTION +This traces shell activity from all Bourne shells on the system that are +running with sh provider support. + +This watches shell function entries and returns, and indents child +function calls. Shell builtins and external commands are also printed. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_flowinfo.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FILE +Filename of the shell script +.TP +LINE +Line number of filename +.TP +TYPE +Type of call (func/builtin/cmd/subsh) +.TP +NAME +Shell function, builtin or command name +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_flowinfo.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_flowtime.d.1m new file mode 100644 index 00000000000..87906b6afeb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_flowtime.d.1m @@ -0,0 +1,76 @@ +.TH sh_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_flowtime.d - snoop Bourne shell execution with flow and delta times. +.SH SYNOPSIS +.B sh_flowtime.d + +.SH DESCRIPTION +This traces shell activity from all Bourne shells on the system that are +running with sh provider support. + +This watches shell function entries and returns, and indents child +function calls. Shell builtins are also printed. + +DELTAs: +-> previous line to the start of this function +<- previous line to the end of this function +> previous line to the end of this builtin +| previous line to the end of this command + +See sh_flowinfo.d for more verbose and more straightforward delta times. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_flowtime.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +FILE +Filename that this function belongs to +.TP +NAME +Shell function or builtin name +.SH LEGEND +.TP +\-> +function entry +.TP +<\- +function return +.TP +> +builtin +.TP +| +external command +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_flowtime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_lines.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_lines.d.1m new file mode 100644 index 00000000000..e3d85081ddf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_lines.d.1m @@ -0,0 +1,46 @@ +.TH sh_lines.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_lines.d - trace Bourne shell line execution using DTrace. +.SH SYNOPSIS +.B sh_lines.d + +.SH DESCRIPTION +This traces shell activity from all Bourne shells on the system that are +running with sh provider support. + +Filenames are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_lines.d +.PP +.SH FIELDS +.TP +FILE +Filename of the shell or shellscript +.TP +LINE +Line number +.TP +COUNT +Number of times a line was executed +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_lines.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_pidcolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_pidcolors.d.1m new file mode 100644 index 00000000000..3f6380ac041 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_pidcolors.d.1m @@ -0,0 +1,70 @@ +.TH sh_pidcolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_pidcolors.d - Demonstration of deeper DTrace Bourne shell analysis. +.SH SYNOPSIS +.B sh_pidcolors.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This extends sh_syscolors.d by including some "pid" provider tracing +as a starting point for deeper analysis. Currently it adds the probes, + +pid$target:a.out:e*:entry, +pid$target:a.out:e*:return + +which means, all functions from the /usr/bin/sh binary that begin with +the letter "e". This adds about 34 probes. Customise it to whichever +parts of /usr/bin/sh or the system libraries you are interested in. + +The filename for syscalls may be printed as the shell name, if the +script was invoked using the form "shell filename" rather than running +the script with an interpreter line. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_pidcolors.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FILE +Filename of the shell script +.TP +LINE +Line number of filename +.TP +TYPE +Type of call (func/builtin/cmd/line/shell) +.TP +NAME +Shell function, builtin or command name +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_pidcolors.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_stat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_stat.d.1m new file mode 100644 index 00000000000..40624f94955 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_stat.d.1m @@ -0,0 +1,59 @@ +.TH sh_stat.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_stat.d - Bourne shell operation stats using DTrace. +.SH SYNOPSIS +.B sh_stat.d +[interval [count]] +.SH DESCRIPTION +This traces activity from all sh processes on the system that are running +with sh provider support. + +The numbers are counts for the interval specified. The default interval +is 1 second. + +If you see a count in "EXECS" but not in the other columns, then sh +scripts may be running without the DTrace sh provider. See Shell/Readme. + +Filename and function names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_stat.d +.PP +.SH FIELDS +.TP +EXEC/s +Bourne shells executed per second, including +those without sh provider support +.TP +FUNC/s +Functions called, per second +.TP +BLTIN/s +Builtins called, per second +.TP +SUB-SH/s +Sub-shells called, per second +.TP +CMD/s +External commands called, per second +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_stat.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_syscalls.d.1m new file mode 100644 index 00000000000..67d74a3ff42 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_syscalls.d.1m @@ -0,0 +1,49 @@ +.TH sh_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_syscalls.d - count Bourne calls and syscalls using DTrace. +.SH SYNOPSIS +.B sh_syscalls.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +Filename and function names are printed if available. +The filename for syscalls may be printed as the shell name, if the +script was invoked using the form "shell filename" rather than running +the script with an interpreter line. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_syscalls.d +.PP +.SH FIELDS +.TP +FILE +Filename of the shell or shellscript +.TP +TYPE +Type of call (func/builtin/cmd/syscall) +.TP +NAME +Name of call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_syscalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_syscolors.d.1m new file mode 100644 index 00000000000..bfd1de5e863 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_syscolors.d.1m @@ -0,0 +1,63 @@ +.TH sh_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_syscolors.d - trace Bourne shell flow plus syscalls, in color. +.SH SYNOPSIS +.B sh_syscolors.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This watches shell function entries and returns, and indents child +function calls. Shell builtins, commands and lines are also printed. + +The filename for syscalls may be printed as the shell name, if the +script was invoked using the form "shell filename" rather than running +the script with an interpreter line. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_syscolors.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +FILE +Filename of the shell script +.TP +LINE +Line number of filename +.TP +TYPE +Type of call (func/builtin/cmd/line/shell) +.TP +NAME +Shell function, builtin or command name +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_syscolors.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_wasted.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_wasted.d.1m new file mode 100644 index 00000000000..1b983891b04 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_wasted.d.1m @@ -0,0 +1,49 @@ +.TH sh_wasted.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_wasted.d - measure Bourne shell elapsed times for "wasted" commands. +.SH SYNOPSIS +.B sh_wasted.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This script measures "wasted" commands - those which are called externally +but are in fact builtins to the shell. Ever seen a script which calls +/usr/bin/echo needlessly? This script measures that cost. + +Filename and call names are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_wasted.d +.PP +.SH FIELDS +.TP +FILE +Filename of the shell or shellscript +.TP +NAME +Name of call +.TP +TIME +Total elapsed time for calls (us) +.SH IDEA +Mike Shapiro +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_wasted.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sh_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_who.d.1m new file mode 100644 index 00000000000..f98bef83b22 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sh_who.d.1m @@ -0,0 +1,49 @@ +.TH sh_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +sh_who.d - trace Bourne shell line execution by process using DTrace. +.SH SYNOPSIS +.B sh_who.d + +.SH DESCRIPTION +This traces shell activity from all Bourne shells on the system that are +running with sh provider support. + +Filenames are printed if available. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Shell provider, which may change +as additional features are introduced. Check Shell/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B sh_who.d +.PP +.SH FIELDS +.TP +PID +Process ID of the shell +.TP +UID +User ID of the owner +.TP +LINES +Number of times a line was executed +.TP +FILE +Pathname of the shell or shellscript +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +sh_who.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/shellsnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/shellsnoop.1m new file mode 100644 index 00000000000..a533ab0e1c1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/shellsnoop.1m @@ -0,0 +1,99 @@ +.TH shellsnoop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +shellsnoop \- snoop live shell activity. Uses DTrace. +.SH SYNOPSIS +.B shellsnoop +[\-hqsv] [\-p PID] [\-u UID] +.SH DESCRIPTION +A program to print read/write details from shells, +such as keystrokes and command outputs. + +This program sounds somewhat dangerous (snooping keystrokes), but is +no more so than /usr/bin/truss, and both need root or dtrace privileges to +run. In fact, less dangerous, as we only print visible text (not password +text, for example). Having said that, it goes without saying that this +program shouldn't be used for breeching privacy of other users. + +This was written as a tool to demonstrate the capabilities of DTrace. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - this script uses the syscall provider. +.SH OPTIONS +.TP +\-q +quiet, only print data +.TP +\-s +include start time, us +.TP +\-v +include start time, string +.TP +\-p PID +PID to snoop +.TP +\-u UID +user ID to snoop +.PP +.SH EXAMPLES +.TP +Default output, +# +.B shellsnoop +.TP +human readable timestamps, +# +.B shellsnoop +\-v +.TP +watch this PID only, +# +.B shellsnoop +\-p 1892 +.TP +watch this PID data only, +# +.B shellsnoop +\-qp 1892 +.PP +.SH FIELDS +.TP +UID +user ID +.TP +PID +process ID +.TP +PPID +parent process ID +.TP +COMM +command name +.TP +DIR +direction (R read, W write) +.TP +TEXT +text contained in the read/write +.TP +TIME +timestamp for the command, us +.TP +STRTIME +timestamp for the command, string +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +shellsnoop will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/shortlived.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/shortlived.d.1m new file mode 100644 index 00000000000..cb4950726f8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/shortlived.d.1m @@ -0,0 +1,37 @@ +.TH shortlived.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +shortlived.d \- check short lived process time. Uses DTrace. +.SH SYNOPSIS +.B shortlived.d +.SH DESCRIPTION +shortlived.d is a DTrace program to measure the time consumed by +short lived processes. + +Many short lived processes can be a burden on the system, and may be +the cause of performance problems. This program can help identify +that case. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall and proc providers. +.SH EXAMPLES +.TP +This prints a report after Ctrl\-C has been hit, +# +.B shortlived.d +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +shortlived.d will run until Ctrl\-C is hit to end the sample. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sigdist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sigdist.d.1m new file mode 100644 index 00000000000..f9f02fee9a4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sigdist.d.1m @@ -0,0 +1,50 @@ +.TH sigdist.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +sigdist.d \- signal distribution by process. Uses DTrace. +.SH SYNOPSIS +.B sigdist.d +.SH DESCRIPTION +This is a simple DTrace script that prints the number of signals +recieved by process and signal number. This script is also available +as /usr/demo/dtrace/sig.d, where it originates. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the proc provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B sigdist.d +.PP +.SH FIELDS +.TP +SENDER +process name of sender +.TP +RECIPIENT +process name of target +.TP +SIG +signal number, see signal(3head) +.TP +COUNT +number of signals sent +.PP +.SH BASED ON +/usr/demo/dtrace/sig.d +.PP +.SH DOCUMENTATION +DTrace Guide "proc Provider" chapter (docs.sun.com) + +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +sigdist.d will sample until Ctrl\-C is hit. +.SH SEE ALSO +kill.d(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/stacksize.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/stacksize.d.1m new file mode 100644 index 00000000000..5b5a916ed39 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/stacksize.d.1m @@ -0,0 +1,42 @@ +.TH stacksize.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +stacksize.d \- measure stack size for running threads. Uses DTrace. +.SH SYNOPSIS +.B stacksize.d +.SH DESCRIPTION +This samples the user stack size by process name, and prints a +distribution plot so that the average stack size can be easily +identified. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sched provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B stacksize.d +.PP +.SH FIELDS +.TP +value +size of the user stack +.TP +count +number of samples at this size +.PP +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +stacksize.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Jonathan Adams +.SH SEE ALSO +pmap(1), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/statsnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/statsnoop.1m new file mode 100644 index 00000000000..9a1011dac67 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/statsnoop.1m @@ -0,0 +1,140 @@ +.TH statsnoop 1m "$Date:: 2007-09-23 #$" "USER COMMANDS" +.SH NAME +statsnoop \- snoop file stats as they occur. Uses DTrace. +.SH SYNOPSIS +.B statsnoop +[\-a|\-A|\-ceghsvxZ] [\-f pathname] [\-n name] [\-p PID] +.SH DESCRIPTION +statsnoop traces the stat variety of syscalls. +As a process issues a file stat, details +such as UID, PID and pathname are printed out. + +The returned file descriptor is printed, +a value of -1 indicates an error. This can be useful +for troubleshooting to determine if appliacions are attempting to +stat files that do not exist. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH OPTIONS +.TP +\-a +print all data +.TP +\-A +dump all data, space delimited +.TP +\-c +print current working directory of process +.TP +\-e +print errno value +.TP +\-g +print full command arguments +.TP +\-s +print start time, us +.TP +\-v +print start time, string +.TP +\-x +only print failed stats +.TP +\-Z +print zonename +.TP +\-f pathname +file pathname to snoop +.TP +\-n name +process name to snoop +.TP +\-p PID +process ID to snoop +.PP +.SH EXAMPLES +.TP +Default output, print file stats by process as they occur, +# +.B statsnoop +.PP +.TP +Print human readable timestamps, +# +.B statsnoop +\-v +.PP +.TP +See error codes, +# +.B statsnoop +\-e +.PP +.TP +Snoop this file only, +# +.B statsnoop +\-f /etc/passwd +.PP +.SH FIELDS +.TP +ZONE +Zone name +.TP +UID +User ID +.TP +PID +Process ID +.TP +PPID +Parent Process ID +.TP +FD +File Descriptor (-1 is error) +.TP +ERR +errno value (see /usr/include/sys/errno.h) +.TP +CWD +current working directory of process +.TP +PATH +pathname for file stat +.TP +COMM +command name for the process +.TP +ARGS +argument listing for the process +.TP +TIME +timestamp for the stat event, us +.TP +STRTIME +timestamp for the stat event, string +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +statsnoop will run forever until Ctrl\-C is hit. +.SH BUGS +occasionally the pathname for the file stat cannot be read +and the following error will be seen, + +dtrace: error on enabled probe ID 6 (...): invalid address + +this is normal behaviour. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/swapinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/swapinfo.d.1m new file mode 100644 index 00000000000..322d29d1608 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/swapinfo.d.1m @@ -0,0 +1,88 @@ +.TH swapinfo.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +swapinfo.d \- print virtual memory info. Uses DTrace. +.SH SYNOPSIS +.B swapinfo.d +.SH DESCRIPTION +Prints swap usage details for RAM and disk based swap. + +This script is UNDER CONSTRUCTION, check for newer versions. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - uses various kernel symbols. +.SH FIELDS +.TP +RAM Total +Total RAM installed +.TP +RAM Unusable +RAM consumed by the OBP and TSBs +.TP +RAM Kernel +Kernel resident in RAM (and usually locked) +.TP +RAM Locked +Locked memory pages from swap (Anon) +.TP +RAM Used +anon + exec + file pages used +.TP +RAM Free +free memory + page cache free +.TP +Disk Total +Total disk swap configured +.TP +Disk Resv +Disk swap allocated + reserved +.TP +Disk Avail +Disk swap available for reservation +.TP +Swap Total +Total Virtual Memory usable +.TP +Swap Resv +VM allocated + reserved +.TP +Swap Avail +VM available for reservation +.TP +Swap MinFree +VM kept free from reservations +.PP +.SH EXAMPLES +.TP +Print info, +# +.B swapinfo.d +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH ADDITIONAL RESOURCES +swapstat - K9Toolkit + +vmstat 1 2; swap -s; echo ::memstat | mdb -k + +RMCmem - The MemTool Package + +RICHPse - The SE Toolkit + +"Clearing up swap space confusion" Unix Insider, Adrian Cockcroft + +"Solaris Internals", Jim Mauro, Richard McDougall + +/usr/include/vm/anon.h, /usr/include/sys/systm.h + +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/sysbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sysbypid.d.1m new file mode 100644 index 00000000000..b956f1243db --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/sysbypid.d.1m @@ -0,0 +1,50 @@ +.TH sysbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +sysbypid.d \- system stats by PID. Uses DTrace. +.SH SYNOPSIS +.B sysbypid.d +.SH DESCRIPTION +sysbypid.d is a simple DTrace program to print System +statistics by process. + +The system statistics are documented in the cpu_sysinfo struct +in the /usr/include/sys/sysinfo.h file; and also in the sysinfo provider +chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sysinfo provider. +.SH EXAMPLES +.TP +Sample until Ctrl\-C is hit then print report, +# +.B sysbypid.d +.PP +.SH FIELDS +.TP +EXEC +process name +.TP +PID +process ID +.TP +VM +Virtual Memory statistic +.TP +VALUE +Value by which statistic was incremented +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +sysbypid.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), vmstat(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/syscallbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/syscallbypid.d.1m new file mode 100644 index 00000000000..e799dba9ebf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/syscallbypid.d.1m @@ -0,0 +1,50 @@ +.TH syscallbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +syscallbypid.d \- syscalls by process ID. Uses DTrace. +.SH SYNOPSIS +.B syscallbypid.d +.SH DESCRIPTION +This reports the number of each type of system call made by PID. +This is useful to identify which process is causing the most +system calls. + +This is based on a script from DExplorer. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B syscallbypid.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +process name +.TP +SYSCALL +system call name +.TP +COUNT +number of system calls made in this sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +syscallbypid.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +procsystime(1M), dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/syscallbyproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/syscallbyproc.d.1m new file mode 100644 index 00000000000..bb323482482 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/syscallbyproc.d.1m @@ -0,0 +1,50 @@ +.TH syscallbyproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +syscallbyproc.d \- syscalls by process name. Uses DTrace. +.SH SYNOPSIS +.B syscallbyproc.d +.SH DESCRIPTION +syscallbyproc.d is a DTrace OneLiner to a report of the number of +system calls made by process name. + +This is useful to identify which process is causing the most +system calls. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Any +.SH STABILITY +stable - needs the syscall provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B syscallbyproc.d +.PP +.SH FIELDS +.TP +first field +This is the process name. There may be several PIDs that have the +same process name, for example with numerous instances of "bash". The +value reported will be the sum of them all. +.TP +second field +This is the count, the number of system calls made. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +syscallbyproc.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +procsystime(1M), dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/syscallbysysc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/syscallbysysc.d.1m new file mode 100644 index 00000000000..c8f34f2d047 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/syscallbysysc.d.1m @@ -0,0 +1,47 @@ +.TH syscallbysysc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +syscallbysysc.d \- syscalls by syscall. Uses DTrace. +.SH SYNOPSIS +.B syscallbysysc.d +.SH DESCRIPTION +syscallbysysc.d is a DTrace OneLiner to a report of the number of +each type of system call made. + +This is useful to identify which system call is the most common. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Any +.SH STABILITY +stable - needs the syscall provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B syscallbysysc.d +.PP +.SH FIELDS +.TP +first field +This is the system call type. Most have man pages in section 2. +.TP +second field +This is the count, the number of occurrances for this system call. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +syscallbysysc.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +procsystime(1M), dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calldist.d.1m new file mode 100644 index 00000000000..351a3f431ee --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calldist.d.1m @@ -0,0 +1,47 @@ +.TH tcl_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_calldist.d - measure Tcl elapsed time for different types of operation. +.SH SYNOPSIS +.B tcl_calldist.d +[top] +eg, +tcl_calldist.d # default, truncate to 10 lines +tcl_calldist.d 25 # truncate each report section to 25 lines +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_calldist.d +.PP +.SH FIELDS +.TP +1 +Process ID +.TP +2 +Type of call (proc/cmd/total) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_calldist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calls.d.1m new file mode 100644 index 00000000000..df65cde5874 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calls.d.1m @@ -0,0 +1,68 @@ +.TH tcl_calls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_calls.d - count Tcl calls (proc/cmd) using DTrace. +.SH SYNOPSIS +.B tcl_calls.d + +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). + +TYPEs: +proc procedure +cmd command + +PORTIONS: Copyright (c) 2007 Brendan Gregg. + +CDDL HEADER START + +The contents of this file are subject to the terms of the +Common Development and Distribution License, Version 1.0 only +(the "License"). You may not use this file except in compliance +with the License. + +You can obtain a copy of the license at Docs/cddl1.txt +or http://www.opensolaris.org/os/licensing. +See the License for the specific language governing permissions +and limitations under the License. + +CDDL HEADER END + +09-Sep-2007 Brendan Gregg Created this. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_calls.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +TYPE +Type of call (see below) +.TP +NAME +Name of proc or cmd call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_calls.d will run until Ctrl-C is hit. +.SH AUTHOR + +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calltime.d.1m new file mode 100644 index 00000000000..14074af76cb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calltime.d.1m @@ -0,0 +1,50 @@ +.TH tcl_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_calltime.d - measure Tcl elapsed times for different types of operation. +.SH SYNOPSIS +.B tcl_calltime.d +[top] +eg, +tcl_calltime.d # default, truncate to 10 lines +tcl_calltime.d 25 # truncate each report section to 25 lines +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_calltime.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +TYPE +Type of call (proc/cmd/total) +.TP +NAME +Name of call +.TP +TOTAL +Total elapsed time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_calltime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_cpudist.d.1m new file mode 100644 index 00000000000..7ae55d86588 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_cpudist.d.1m @@ -0,0 +1,47 @@ +.TH tcl_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_cpudist.d - measure Tcl on-CPU time for different types of operation. +.SH SYNOPSIS +.B tcl_cpudist.d +[top] +eg, +tcl_cpudist.d # default, truncate to 10 lines +tcl_cpudist.d 25 # truncate each report section to 25 lines +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_cpudist.d +.PP +.SH FIELDS +.TP +1 +Process ID +.TP +2 +Type of call (proc/cmd/total) +.TP +3 +Name of call +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_cpudist.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_cputime.d.1m new file mode 100644 index 00000000000..efbac89f782 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_cputime.d.1m @@ -0,0 +1,50 @@ +.TH tcl_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_cputime.d - measure Tcl on-CPU times for different types of operation. +.SH SYNOPSIS +.B tcl_cputime.d +[top] +eg, +tcl_cputime.d # default, truncate to 10 lines +tcl_cputime.d 25 # truncate each report section to 25 lines +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_cputime.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +TYPE +Type of call (proc/cmd/total) +.TP +NAME +Name of call +.TP +TOTAL +Total on-CPU time for calls (us) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_cputime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_flow.d.1m new file mode 100644 index 00000000000..bba2e3a1778 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_flow.d.1m @@ -0,0 +1,66 @@ +.TH tcl_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_flow.d - snoop Tcl execution showing procedure flow using DTrace. +.SH SYNOPSIS +.B tcl_flow.d + +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). + +This watches Tcl method entries and returns, and indents child +method calls. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_flow.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +PID +Process ID +.TP +CALL +Tcl command or procedure name +.SH LEGEND +.TP +\-> +procedure entry +.TP +<\- +procedure return +.TP +> +command entry +.TP +< +command return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_flow.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_flowtime.d.1m new file mode 100644 index 00000000000..56194d2d9ce --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_flowtime.d.1m @@ -0,0 +1,69 @@ +.TH tcl_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_flowtime.d - snoop Tcl execution showing procedure flow and delta times. +.SH SYNOPSIS +.B tcl_flowtime.d + +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). + +This watches Tcl method entries and returns, and indents child +method calls. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_flowtime.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +TIME(us) +Time since boot, us +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +CALL +Tcl command or procedure name +.SH LEGEND +.TP +\-> +procedure entry +.TP +<\- +procedure return +.TP +> +command entry +.TP +< +command return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_flowtime.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_ins.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_ins.d.1m new file mode 100644 index 00000000000..f3ab7feb99b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_ins.d.1m @@ -0,0 +1,50 @@ +.TH tcl_calls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_calls.d - count Tcl calls (method/...) using DTrace. +.SH SYNOPSIS +.B tcl_calls.d + +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). + +TYPEs: +inst instruction +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_calls.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +TYPE +Type of call (see below) +.TP +NAME +Name of call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_calls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_insflow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_insflow.d.1m new file mode 100644 index 00000000000..877757d2291 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_insflow.d.1m @@ -0,0 +1,69 @@ +.TH tcl_insflow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_insflow.d - snoop Tcl execution showing procedure flow and delta times. +.SH SYNOPSIS +.B tcl_insflow.d + +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). + +This watches Tcl method entries and returns, and indents child +method calls. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_insflow.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +TIME(us) +Time since boot, us +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +TYPE +Type of call (proc/cmd/inst) +.TP +CALL +Tcl command or procedure name +.SH LEGEND +.TP +proc +procedure +.TP +cmd +command +.TP +inst +instruction +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_insflow.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_proccalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_proccalls.d.1m new file mode 100644 index 00000000000..9fda802351f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_proccalls.d.1m @@ -0,0 +1,44 @@ +.TH tcl_methodcalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_methodcalls.d - count Tcl method calls DTrace. +.SH SYNOPSIS +.B tcl_methodcalls.d + +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_methodcalls.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +COUNT +Number of calls during sample +.TP +PROCEDURE +Tcl procedure name +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_methodcalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_procflow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_procflow.d.1m new file mode 100644 index 00000000000..aa79e913b0c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_procflow.d.1m @@ -0,0 +1,60 @@ +.TH tcl_procflow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_procflow.d - snoop Tcl execution showing procedure flow using DTrace. +.SH SYNOPSIS +.B tcl_procflow.d + +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). + +This watches Tcl method entries and returns, and indents child +method calls. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_procflow.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +TIME(us) +Time since boot, us +.TP +PID +Process ID +.TP +PROCEDURE +Tcl procedure name +.SH LEGEND +.TP +\-> +proc entry +.TP +<\- +proc return +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_procflow.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_stat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_stat.d.1m new file mode 100644 index 00000000000..280b8c0d2ac --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_stat.d.1m @@ -0,0 +1,61 @@ +.TH tcl_stat.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_stat.d - Tcl operation stats using DTrace. +.SH SYNOPSIS +.B tcl_stat.d +[interval [count]] +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). + +The numbers are counts for the interval specified. The default interval +is 1 second. + +If you see a count in "EXECS" but not in the other columns, then you +may have older Tcl software that does not have the integrated DTrace +provider (or newer software where the provider has changed). +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_stat.d +.PP +.SH FIELDS +.TP +EXEC/s +Tcl programs executed per second, including +those without Tcl provider support +.TP +PROC/s +Procedures called, per second +.TP +CMD/s +Commands created, per second +.TP +OBJNEW/s +Objects created, per second +.TP +OBJFRE/s +Objects freed, per second +.TP +OP/s +Bytecode operations, per second +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_stat.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_syscalls.d.1m new file mode 100644 index 00000000000..ef4e5fe1f50 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_syscalls.d.1m @@ -0,0 +1,47 @@ +.TH tcl_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_syscalls.d - count Tcl calls and syscalls using DTrace. +.SH SYNOPSIS +.B tcl_syscalls.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_syscalls.d +.PP +.SH FIELDS +.TP +PID +Process ID +.TP +TYPE +Type of call (method/syscall) +.TP +NAME +Name of call +.TP +COUNT +Number of calls during sample +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_syscalls.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_syscolors.d.1m new file mode 100644 index 00000000000..4b920d55e32 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_syscolors.d.1m @@ -0,0 +1,59 @@ +.TH tcl_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_syscolors.d - trace Tcl program flow plus syscalls, in color. +.SH SYNOPSIS +.B tcl_syscolors.d +{ \-p PID | \-c cmd } +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). + +This watches Tcl method entries and returns, and indents child +method calls. +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_syscolors.d +.PP +.SH FIELDS +.TP +C +CPU-id +.TP +PID +Process ID +.TP +TID +Thread ID +.TP +DELTA(us) +Elapsed time from previous line to this line +.TP +TYPE +Type of call (proc/cmd/syscall) +.TP +NAME +Tcl proc/cmd or syscall name +.SH WARNING +Watch the first column carefully, it prints the CPU-id. If it +changes, then it is very likely that the output has been shuffled. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_syscolors.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcl_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_who.d.1m new file mode 100644 index 00000000000..f6a69944ea2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_who.d.1m @@ -0,0 +1,54 @@ +.TH tcl_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS" +.SH NAME +tcl_who.d - trace Tcl calls by process using DTrace. +.SH SYNOPSIS +.B tcl_who.d + +.SH DESCRIPTION +This traces activity from all Tcl processes on the system with DTrace +provider support (tcl8.4.16). + +Calls is a measure of activity, and is a count of the procedures and +commands that Tcl called. + +The argument list is truncated at 55 characters (up to 80 is easily +available). To easily read the full argument list, use other system tools; +on Solaris use "pargs PID". +.SH OS +Any +.SH STABILITY +Evolving - uses the DTrace Tcl provider, which may change +as additional features are introduced. Check Tcl/Readme +to see what version these scripts are based on. +.SH EXAMPLES +.TP +Default output, +# +.B tcl_who.d +.PP +.SH FIELDS +.TP +PID +Process ID of Tcl +.TP +UID +User ID of the owner +.TP +CALLS +Number of calls made (proc + cmd) +.TP +ARGS +Process name and arguments +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Examples, Notes and Docs directories. The example files may be +especially useful as they aim to demonstrate how to interpret +the output. +.SH EXIT +tcl_who.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop.1m new file mode 100644 index 00000000000..7fff62c535c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop.1m @@ -0,0 +1,116 @@ +.TH tcpsnoop 1m "$Date:: 2007-10-04 #$" "USER COMMANDS" +.SH NAME +tcpsnoop \- snoop TCP network packets by process. Uses DTrace. +.SH SYNOPSIS +.B tcpsnoop +[\-a|hjsvZ] [\-n name] [\-p pid] +.SH DESCRIPTION +This analyses TCP network packets and prints the responsible PID and UID, +plus standard details such as IP address and port. This captures traffic +of newly created TCP connections that were established while this program +was running. It can help identify which processes is causing TCP traffic. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris 10 3/05 +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH OPTIONS +.TP +\-a +print all data +.TP +\-j +print project ID +.TP +\-s +print time, us +.TP +\-v +print time, string +.TP +\-Z +print zone ID +.TP +\-n name +command name to snoop +.TP +\-p PID +process ID to snoop +.PP +.SH EXAMPLES +.TP +Default output, snoop TCP network packets with details, +# +.B tcpsnoop +.TP +Print human readable timestamps, +# +.B tcpsnoop +\-v +.TP +Print zonename, +# +.B tcpsnoop +\-Z +.TP +Print sshd traffic only, +# +.B tcpsnoop +\-n sshd +.PP +.SH FIELDS +.TP +UID +user ID +.TP +PID +process ID +.TP +CMD +command name +.TP +LADDR +local IP address +.TP +RADDR +remote IP address +.TP +LPORT +local port number +.TP +RPORT +remote port number +.TP +DR +direction +.TP +SIZE +packet size, bytes +.TP +TIME +timestamp, us +.TP +STRTIME +human readable timestamp, string +.TP +ZONE +zone ID +.TP +PROJ +project ID +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +tcpsnoop will print traffic until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +tcptop(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop.d.1m new file mode 100644 index 00000000000..e1cfd3c13f4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop.d.1m @@ -0,0 +1,68 @@ +.TH tcpsnoop.d 1m "$Date:: 2007-10-04 #$" "USER COMMANDS" +.SH NAME +tcpsnoop.d \- snoop TCP network packets by process. DTrace. +.SH SYNOPSIS +.B tcpsnoop.d +.SH DESCRIPTION +This analyses TCP network packets and prints the responsible PID and UID, +plus standard details such as IP address and port. This captures traffic +of newly created TCP connections that were established while this program +was running. It can help identify which processes is causing TCP traffic. + +This is a DTrace only version of "tcpsnoop" - an enhanced program that +provides command line options. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris 10 3/05 +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Default output, snoop TCP network packets with details, +# +.B tcpsnoop.d +.PP +.SH FIELDS +.TP +UID +user ID +.TP +PID +process ID +.TP +CMD +command name +.TP +LADDR +local IP address +.TP +RADDR +remote IP address +.TP +LPORT +local port number +.TP +RPORT +remote port number +.TP +DR +direction +.TP +SIZE +packet size, bytes +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +tcpsnoop.d will print traffic until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +tcpsnoop(1M), tcptop(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop_snv.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop_snv.1m new file mode 100644 index 00000000000..36e880d7831 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop_snv.1m @@ -0,0 +1,116 @@ +.TH tcpsnoop 1m "$Date:: 2007-10-04 #$" "USER COMMANDS" +.SH NAME +tcpsnoop \- snoop TCP network packets by process. Uses DTrace. +.SH SYNOPSIS +.B tcpsnoop +[\-a|hjsvZ] [\-n name] [\-p pid] +.SH DESCRIPTION +This analyses TCP network packets and prints the responsible PID and UID, +plus standard details such as IP address and port. This captures traffic +of newly created TCP connections that were established while this program +was running. It can help identify which processes is causing TCP traffic. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris Nevada / OpenSolaris, circa late 2007 +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH OPTIONS +.TP +\-a +print all data +.TP +\-j +print project ID +.TP +\-s +print time, us +.TP +\-v +print time, string +.TP +\-Z +print zone ID +.TP +\-n name +command name to snoop +.TP +\-p PID +process ID to snoop +.PP +.SH EXAMPLES +.TP +Default output, snoop TCP network packets with details, +# +.B tcpsnoop +.TP +Print human readable timestamps, +# +.B tcpsnoop +\-v +.TP +Print zonename, +# +.B tcpsnoop +\-Z +.TP +Print sshd traffic only, +# +.B tcpsnoop +\-n sshd +.PP +.SH FIELDS +.TP +UID +user ID +.TP +PID +process ID +.TP +CMD +command name +.TP +LADDR +local IP address +.TP +RADDR +remote IP address +.TP +LPORT +local port number +.TP +RPORT +remote port number +.TP +DR +direction +.TP +SIZE +packet size, bytes +.TP +TIME +timestamp, us +.TP +STRTIME +human readable timestamp, string +.TP +ZONE +zone ID +.TP +PROJ +project ID +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +tcpsnoop will print traffic until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +tcptop(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop_snv.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop_snv.d.1m new file mode 100644 index 00000000000..79bfda36285 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop_snv.d.1m @@ -0,0 +1,68 @@ +.TH tcpsnoop.d 1m "$Date:: 2007-10-04 #$" "USER COMMANDS" +.SH NAME +tcpsnoop.d \- snoop TCP network packets by process. DTrace. +.SH SYNOPSIS +.B tcpsnoop.d +.SH DESCRIPTION +This analyses TCP network packets and prints the responsible PID and UID, +plus standard details such as IP address and port. This captures traffic +of newly created TCP connections that were established while this program +was running. It can help identify which processes is causing TCP traffic. + +This is a DTrace only version of "tcpsnoop" - an enhanced program that +provides command line options. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris Nevada / OpenSolaris, circa late 2007 +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Default output, snoop TCP network packets with details, +# +.B tcpsnoop.d +.PP +.SH FIELDS +.TP +UID +user ID +.TP +PID +process ID +.TP +CMD +command name +.TP +LADDR +local IP address +.TP +RADDR +remote IP address +.TP +LPORT +local port number +.TP +RPORT +remote port number +.TP +DR +direction +.TP +SIZE +packet size, bytes +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +tcpsnoop.d will print traffic until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +tcpsnoop(1M), tcptop(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcpstat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcpstat.d.1m new file mode 100644 index 00000000000..4db577c446a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcpstat.d.1m @@ -0,0 +1,58 @@ +.TH tcpstat.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +tcpstat.d \- print TCP statistics. Uses DTrace. +.SH SYNOPSIS +.B tcpstat.d +.SH DESCRIPTION +tcpstat.d is a DTrace program to print TCP statistics every second, +retrieved from the MIB provider. + +This program can be used to help identify how utilised the network +interfaces may be, as well as TCP transmission errors. + +The TCP statistics are documented in the mib2_tcp struct +in /usr/include/inet/mib2.h; and also in the mib provider +chapter of the DTrace Guide, found at +http://docs.sun.com/db/doc/817-6223. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the mib provider. +.SH EXAMPLES +.TP +Print statistics every second, +# +.B tcpstat.d +.PP +.SH FIELDS +.TP +TCP_out +TCP bytes sent +.TP +TCP_outRe +TCP bytes retransmitted +.TP +TCP_in +TCP bytes received +.TP +TCP_inDup +TCP bytes received duplicated +.TP +TCP_inUn +TCP bytes received out of order +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +tcpstat.d will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +nicstat(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcptop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcptop.1m new file mode 100644 index 00000000000..156aaf50fc6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcptop.1m @@ -0,0 +1,111 @@ +.TH tcptop 1m "$Date:: 2007-10-04 #$" "USER COMMANDS" +.SH NAME +tcptop \- display top TCP network packets by process. Uses DTrace. +.SH SYNOPSIS +.B tcptop +[-Ch] [-j|-Z] [interval [count]] +.SH DESCRIPTION +This analyses TCP network packets and prints the responsible PID and UID, +plus standard details such as IP address and port. This captures traffic +of newly created TCP connections that were established while this program +was running. It can help identify which processes is causing TCP traffic. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris 10 3/05 +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH OPTIONS +.TP +\-C +don't clear the screen +.TP +\-j +print project IDs +.TP +\-Z +print zone IDs +.TP +interval +sample seconds between refreshing the screen +.TP +count +number of samples +.PP +.SH EXAMPLES +.TP +Print a report every 5 seconds, +# +.B tcptop +.TP +Don't clear the screen, scrolling output, +# +.B tcptop +\-C +.TP +Print project IDs, +# +.B tcptop +\-j +.TP +Print zone IDs, +# +.B tcptop +\-Z +.PP +.SH FIELDS +.TP +UID +user ID +.TP +PID +process ID +.TP +CMD +command name +.TP +LADDR +local IP address +.TP +RADDR +remote IP address +.TP +LPORT +local port number +.TP +RPORT +remote port number +.TP +SIZE +packet size, bytes +.TP +load +1 minute load average +.TP +TCPin +total TCP inbound payload data +.TP +TCPout +total TCP outbound payload data +.TP +ZONE +zone ID +.TP +PROJ +project ID +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +tcptop will print reports until Ctrl\-C is hit, or the specified +count is reached. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +tcpsnoop(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcptop_snv.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcptop_snv.1m new file mode 100644 index 00000000000..9ac14ac3a42 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcptop_snv.1m @@ -0,0 +1,111 @@ +.TH tcptop 1m "$Date:: 2007-10-04 #$" "USER COMMANDS" +.SH NAME +tcptop \- display top TCP network packets by process. Uses DTrace. +.SH SYNOPSIS +.B tcptop +[-Ch] [-j|-Z] [interval [count]] +.SH DESCRIPTION +This analyses TCP network packets and prints the responsible PID and UID, +plus standard details such as IP address and port. This captures traffic +of newly created TCP connections that were established while this program +was running. It can help identify which processes is causing TCP traffic. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris Nevada / OpenSolaris, circa late 2007 +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH OPTIONS +.TP +\-C +don't clear the screen +.TP +\-j +print project IDs +.TP +\-Z +print zone IDs +.TP +interval +sample seconds between refreshing the screen +.TP +count +number of samples +.PP +.SH EXAMPLES +.TP +Print a report every 5 seconds, +# +.B tcptop +.TP +Don't clear the screen, scrolling output, +# +.B tcptop +\-C +.TP +Print project IDs, +# +.B tcptop +\-j +.TP +Print zone IDs, +# +.B tcptop +\-Z +.PP +.SH FIELDS +.TP +UID +user ID +.TP +PID +process ID +.TP +CMD +command name +.TP +LADDR +local IP address +.TP +RADDR +remote IP address +.TP +LPORT +local port number +.TP +RPORT +remote port number +.TP +SIZE +packet size, bytes +.TP +load +1 minute load average +.TP +TCPin +total TCP inbound payload data +.TP +TCPout +total TCP outbound payload data +.TP +ZONE +zone ID +.TP +PROJ +project ID +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +tcptop will print reports until Ctrl\-C is hit, or the specified +count is reached. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +tcpsnoop(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/tcpwdist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcpwdist.d.1m new file mode 100644 index 00000000000..626d66e74f2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/tcpwdist.d.1m @@ -0,0 +1,60 @@ +.TH tcpwdist.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +tcpwdist.d \- simple TCP write dist by process. Uses DTrace. +.SH SYNOPSIS +.B tcpwdist.d +.SH DESCRIPTION +This measures the size of writes from applications to the TCP level, which +may well be much larger than the MTU size (this is application writes not +packet writes). It can help identify which process is creating network +traffic, and the size of the writes by that application. It uses a simple +probe that produces meaningful output for most protocols. + +Tracking TCP activity by process is complex for a number of reasons, +the greatest is that inbound TCP traffic is asynchronous to the process. +The easiest TCP traffic to match is writes, which this script demonstrates. +However there are still issues - for an inbound telnet connection the +writes are associated with the command, for example "ls -l", not something +meaningful such as "in.telnetd". + +Scripts that match TCP traffic properly include tcpsnoop and tcptop. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Sample until Ctrl\-C is hit then print report, +# +.B tcpwdist.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +command and argument list +.TP +value +TCP write payload size in bytes +.TP +count +number of writes +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +tcpwdist.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +tcpsnoop(1M), tcptop(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/threaded.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/threaded.d.1m new file mode 100644 index 00000000000..c17ad9acc9d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/threaded.d.1m @@ -0,0 +1,50 @@ +.TH threaded.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +threaded.d \- sample multi-threaded CPU usage. Uses DTrace. +.SH SYNOPSIS +.B threaded.d +.SH DESCRIPTION +This measures thread IDs as a process runs across multiple CPUs. +It is a simple script that can help determine if a multi-threaded +application is effectively using it's threads, or if the threads have +serialised. See the example file in Docs/Examples/threaded_example.txt +for a demonstration. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Any +.SH STABILITY +stable. +.SH EXAMPLES +.TP +This runs until Ctrl\-C is hit. +# +.B threaded.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +process name +.TP +value +thread ID +.TP +count +number of samples +.PP +.SH SEE ALSO +prstat \-L +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +threaded.d will run until Ctrl\-C is hit. +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/topsyscall.1m b/cddl/contrib/dtracetoolkit/Man/man1m/topsyscall.1m new file mode 100644 index 00000000000..34734546ac3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/topsyscall.1m @@ -0,0 +1,73 @@ +.TH topsyscall 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +topsyscall \- top syscalls by syscall name. Uses DTrace. +.SH SYNOPSIS +.B topsyscall +[-Cs] [interval [count]] +.SH DESCRIPTION +This program continually prints a report of the top system calls, +and refreshes the display every 1 second or as specified at the +command line. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - uses the hp_avenrun kernel symbol. +.SH OPTIONS +.TP +\-C +don't clear the screen +.TP +\-s +print per second values +.PP +.SH EXAMPLES +.TP +Default output, 1 second updates, +# +.B topsyscall +.TP +Print every 5 seconds, +# +.B topsyscall +5 +.TP +Print a scrolling output, +# +.B topsyscall +\-C +.PP +.SH FIELDS +.TP +load avg +load averages, see uptime(1) +.TP +syscalls +total syscalls in this interval +.TP +syscalls/s +syscalls per second +.TP +SYSCALL +system call name +.TP +COUNT +total syscalls in this interval +.TP +COUNT/s +syscalls per second +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +topsyscall will run until Ctrl\-C is hit, or the specified +interval is reached. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), prstat(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/topsysproc.1m b/cddl/contrib/dtracetoolkit/Man/man1m/topsysproc.1m new file mode 100644 index 00000000000..2f5e1c39d2c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/topsysproc.1m @@ -0,0 +1,75 @@ +.TH topsysproc 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +topsysproc \- top syscalls by process name. Uses DTrace. +.SH SYNOPSIS +.B topsysproc +[-Cs] [interval [count]] +.SH DESCRIPTION +This program continually prints a report of the number of system calls +by process name, and refreshes the display every 1 second or as specified +at the command line. Similar data can be fetched with "prstat -m". + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - uses the hp_avenrun kernel symbol. +.SH OPTIONS +.TP +\-C +don't clear the screen +.TP +\-s +print per second values +.PP +.SH EXAMPLES +.TP +Default output, 1 second updates, +# +.B topsysproc +.TP +Print every 5 seconds, +# +.B topsysproc +5 +.TP +Print a scrolling output, +# +.B topsysproc +\-C +.PP +.SH FIELDS +.TP +load avg +load averages, see uptime(1) +.TP +syscalls +total syscalls in this interval +.TP +syscalls/s +syscalls per second +.TP +PROCESS +process name +.TP +COUNT +total syscalls in this interval +.TP +COUNT/s +syscalls per second +.PP +.SH NOTES +There may be several PIDs with the same process name. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +topsysproc will run until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), prstat(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/udpstat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/udpstat.d.1m new file mode 100644 index 00000000000..340f659d06b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/udpstat.d.1m @@ -0,0 +1,55 @@ +.TH udpstat.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +udpstat.d \- print UDP statistics. Uses DTrace. +.SH SYNOPSIS +.B udpstat.d +.SH DESCRIPTION +udpstat.d is a DTrace program to print UDP statistics every second, +retrieved from the MIB provider. + +The UDP statistics are documented in the mib2_tcp struct +in /usr/include/inet/mib2.h; and also in the mib provider +chapter of the DTrace Guide, found at +http://docs.sun.com/db/doc/817-6223. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the mib provider. +.SH EXAMPLES +.TP +Print statistics every second, +# +.B udpstat.d +.PP +.SH FIELDS +.TP +UDP_out +UDP datagrams sent +.TP +UDP_outErr +UDP datagrams errored on send +.TP +UDP_in +UDP datagrams received +.TP +UDP_inErr +UDP datagrams undeliverable +.TP +UDP_noPort +UDP datagrams received to closed ports +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +udpstat.d will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/uname-a.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/uname-a.d.1m new file mode 100644 index 00000000000..60d10f700fe --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/uname-a.d.1m @@ -0,0 +1,35 @@ +.TH uname\-a.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +uname\-a.d \- "uname \-a" demo in DTrace. Uses DTrace. +.SH SYNOPSIS +.B uname\-a.d +.SH DESCRIPTION +This has been written to demonstrate fetching the "uname -a" info +from a DTrace script, which turns out to be all kernel variables. +This is intended as a starting point for other DTrace scripts, by +beginning with familiar statistics. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - uses various kernel symbols. +.SH EXAMPLES +.TP +Print system call counts every second, +# +.B uname\-c.d +.PP +.SH FIELDS +See uname(1) manpage for documentation. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +uname(1), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/vmbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/vmbypid.d.1m new file mode 100644 index 00000000000..3c8b8759071 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/vmbypid.d.1m @@ -0,0 +1,50 @@ +.TH vmbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +vmbypid.d \- virtual memory stats by PID. Uses DTrace. +.SH SYNOPSIS +.B vmbypid.d +.SH DESCRIPTION +vmbypid.d is a simple DTrace program to print Virtual Memory +statistics by process. + +The virtual memory statistics are documented in the cpu_vminfo struct +in the /usr/include/sys/sysinfo.h file; and also in the vminfo provider +chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the vminfo provider. +.SH EXAMPLES +.TP +Sample until Ctrl\-C is hit then print report, +# +.B vmbypid.d +.PP +.SH FIELDS +.TP +EXEC +process name +.TP +PID +process ID +.TP +VM +Virtual Memory statistic +.TP +VALUE +Value by which statistic was incremented +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +vmbypid.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), vmstat(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/vmstat-p.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/vmstat-p.d.1m new file mode 100644 index 00000000000..8198f3d55fe --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/vmstat-p.d.1m @@ -0,0 +1,85 @@ +.TH vmstat-p.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +vmstat-p.d \- vmstat -p demo in DTrace. Uses DTrace. +.SH SYNOPSIS +.B vmstat-p.d +.SH DESCRIPTION +This has been written to demonstrate fetching similar data as vmstat +from DTrace. This program is intended as a starting point for other +DTrace scripts, by beginning with familiar statistics. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - uses various kernel symbols. +.SH EXAMPLES +.TP +Print virtual memory statistics every second, +# +.B vmstat-p.d +.PP +.SH FIELDS +.TP +swap +virtual memory free, Kbytes +.TP +free +free RAM, Kbytes +.TP +re +page reclaims, Kbytes +.TP +mf +minor faults, Kbytes +.TP +sr +scan rate, pages +.TP +epi +executable page ins, Kbytes +.TP +epo +executable page outs, Kbytes +.TP +epf +executable frees, Kbytes +.TP +api +anonymous page ins, Kbytes +.TP +apo +anonymous page outs, Kbytes +.TP +apf +anonymous frees, Kbytes +.TP +fpi +filesystem page ins, Kbytes +.TP +fpo +filesystem page outs, Kbytes +.TP +fpf +filesystem frees, Kbytes +.PP +.SH NOTES +Most of the statistics are in units of kilobytes, unlike the +original vmstat command which sometimes uses page counts. + +As this program does not use Kstat, there is no summary since boot line. + +Free RAM is both free free + cache free. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +vmstat-p.d will run until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +vmstat(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/vmstat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/vmstat.d.1m new file mode 100644 index 00000000000..dfbc3605c52 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/vmstat.d.1m @@ -0,0 +1,79 @@ +.TH vmstat.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +vmstat.d \- vmstat demo in DTrace. Uses DTrace. +.SH SYNOPSIS +.B vmstat.d +.SH DESCRIPTION +This has been written to demonstrate fetching the same data as vmstat +from DTrace. This program is intended as a starting point for other +DTrace scripts, by beginning with familiar statistics. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - uses various kernel symbols. +.SH EXAMPLES +.TP +Print virtual memory statistics every second, +# +.B vmstat.d +.PP +.SH FIELDS +.TP +w +swapped out light weight processes +.TP +swap +virtual memory free, Kbytes +.TP +free +free RAM, Kbytes +.TP +re +page reclaims, Kbytes +.TP +mf +minor faults, Kbytes +.TP +pi +page ins, Kbytes +.TP +po +page outs, Kbytes +.TP +fr +pages freed, Kbytes +.TP +sr +scan rate, pages +.TP +in +interrupts, number +.TP +sy +system calls, number +.TP +cs +context switches, number +.PP +.SH NOTES +Most of the statistics are in units of kilobytes, unlike the +original vmstat command which sometimes uses page counts. + +As this program does not use Kstat, there is no summary since boot line. + +Free RAM is both free free + cache free. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +vmstat.d will run until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +vmstat(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/vopstat.1m b/cddl/contrib/dtracetoolkit/Man/man1m/vopstat.1m new file mode 100644 index 00000000000..fa81cc1e982 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/vopstat.1m @@ -0,0 +1,77 @@ +.TH vopstat 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +vopstat \- vnode interface statistics. Uses DTrace. +.SH SYNOPSIS +.B vopstat [\-t] [/mountname] +.SH DESCRIPTION +This will either produce summary reports of vnode statistics, or +trace activity. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH OPTIONS +.TP +\-t +trace activity as it occurs +.TP +/mountname +examine this FS only +.PP +.SH EXAMPLES +.TP +default output, summary each 5 secs, +# +.B vopstat +.TP +only examine /var, +# +.B vopstat +/var +.TP +trace activity to /var, +# +.B vopstat +\-t /var +.PP +.SH FIELDS +.TP +Count +number of calls +.TP +mSeconds +total of elapsed times +.TP +Event +vop call name +.TP +Device +device instance name +.TP +Path +full pathname to file +.TP +RW +Read or Write +.TP +Size +size in bytes, if available +.TP +Offset +offset in bytes, if available +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +vopstat will sample until Ctrl\-C is hit. +.SH AUTHOR +Richard McDougall +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/weblatency.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/weblatency.d.1m new file mode 100644 index 00000000000..c7ff3d38870 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/weblatency.d.1m @@ -0,0 +1,63 @@ +.TH weblatency.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +weblatency.d \- website latency statistics. Uses DTrace. +.SH SYNOPSIS +.B weblatency.d +.SH DESCRIPTION +This prints statistics for hostnames that browers have set GET requests +for, in particular latency by hostname. + +The latency measured is from the browser sending the GET +request to when the browser begins to recieve the response. It +is an overall response time for the client, and encompasses +connection speed delays, DNS lookups, proxy delays, and web server +response time. + +This is written as an experimental tool, and may not work at all with +your browser. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - depends on browser implementation. +.SH EXAMPLES +.TP +Print report after Ctrl-C is hit, +# +.B weblatency.d +.PP +.SH FIELDS +.TP +HOST +hostname from URL +.TP +NUM +number of GETs +.TP +AVGTIME(ms) +Average time for response, ms +.TP +MAXTIME(ms) +Maximum time for response, ms +.PP +.SH NOTES +See the source code for the "BROWSER" variable, which sets the browser +to trace (currently set to "mozilla-bin"). +.PP +.SH IDEA +Bryan Cantrill (who wrote an elegant version for Sol 10 update 1) +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +weblatency.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/whatexec.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/whatexec.d.1m new file mode 100644 index 00000000000..9c29b8ed5f2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/whatexec.d.1m @@ -0,0 +1,53 @@ +.TH whatexec.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +whatexec.d \- Examine the type of files exec'd. Uses DTrace. +.SH SYNOPSIS +.B whatexec.d +.SH DESCRIPTION +This prints the first four chacacters of files that are executed. +This traces the kernel function findexec_by_hdr(), which checks for +a known magic number in the file's header. + +The idea came from a demo I heard about from the UK, where a +"blue screen of death" was displayed for "MZ" files (although I +haven't seen the script or the demo). + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - this script uses fbt provider probes which may change for +future updates of the OS, invalidating this script. Please read +Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts. +.SH EXAMPLES +.TP +Trace execs as they occur, +# +.B whatexec.d +.PP +.SH FIELDS +.TP +PEXEC +parent command name +.TP +EXEC +pathname to file exec'd +.TP +OK +is type runnable, Y/N +.TP +TYPE +first four characters from file +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +whatexec.d will trace until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/woof.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/woof.d.1m new file mode 100644 index 00000000000..212346d6973 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/woof.d.1m @@ -0,0 +1,46 @@ +.TH woof.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +woof.d \- Bark for new processes. Needs /dev/audio. Uses DTrace. +.SH SYNOPSIS +.B woof.d & +.SH DESCRIPTION +This is an audio alert daemon for process creation. It is a virtual dog which +barks when it sees new processes. If many processes are being created +quickly, it will bark a lot (and become a nuisance - not just the noise, +but also from consuming too much CPU). + +This exists in the DTraceToolkit more for entertainment than +practicality. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the proc provider, /usr/bin/audioplay, and bark.au. +.SH EXAMPLES +.TP +Run the dog, +# +.B woof.d & +.TP +Hear the dog, +$ find /etc -type f -exec grep localhost {} + +.TP +Drive the dog crazy, +$ find /etc -type f -exec grep localhost {} \\; +.PP +.SH NOTES +Beware of the dog! +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +woof.d will exit on Ctrl-C. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +sdtaudiocontrol(1), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/wpm.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/wpm.d.1m new file mode 100644 index 00000000000..8022ae463f5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/wpm.d.1m @@ -0,0 +1,34 @@ +.TH wpm.d 1m "$Date:: 2007-09-12 #$" "USER COMMANDS" +.SH NAME +wpm.d - Measure words per minute of typing. +.SH SYNOPSIS +.B wpm.d +commandname +eg, +wpm.d bash +wpm.d vim +.SH DESCRIPTION +This script assumes that keystrokes arrive one at a time on STDIN. This +isn't the case for all processes that read keyboard input (eg, sh). +.SH OS +Solaris +.SH STABILITY +stable - Written in DTrace (Solaris 10 3/05). +.SH EXAMPLES +.TP +Default output, +# +.B wpm.d +.PP +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +wpm.d will run until Ctrl-C is hit. +.SH AUTHOR +Brendan Gregg +[CA, USA] +.SH SEE ALSO +dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/writebytes.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/writebytes.d.1m new file mode 100644 index 00000000000..6fb3d85fd08 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/writebytes.d.1m @@ -0,0 +1,47 @@ +.TH writebytes.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +writebytes.d \- write bytes by process name. Uses DTrace. +.SH SYNOPSIS +.B writebytes.d +.SH DESCRIPTION +writebytes.d is a DTrace OneLiner to a report of the number of +bytes write by process name. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sysinfo provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B writebytes.d +.PP +.SH FIELDS +.TP +first field +This is the process name. There may be several PIDs that have the +same process name, for example with numerous instances of "bash". The +value reported will be the sum of them all. +.TP +second field +This is the number of bytes write. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +writebytes.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/writedist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/writedist.d.1m new file mode 100644 index 00000000000..bdced08f1bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/writedist.d.1m @@ -0,0 +1,54 @@ +.TH writedist.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +writedist.d \- write distrib. by process name. Uses DTrace. +.SH SYNOPSIS +.B writedist.d +.SH DESCRIPTION +writedist.d is a DTrace OneLiner to a report the write size and +number of occurrences as a frequency distribution by process name. + +This can be useful to identify the behaviour of processes +that are doing writes. Are they using many small writes, or +fewer large writes. + +Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt +in the DTraceToolkit contain this as a oneliner that can be cut-n-paste +to run. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sysinfo provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B writedist.d +.PP +.SH FIELDS +.TP +process name +The process name. There may be several PIDs that have the +same process name, for example with numerous instances of "bash". The +value reported will be the sum of them all. +.TP +value +The size in bytes +.TP +count +The number of occurrences that were at least this size +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +writedist.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +dtrace(1M), truss(1) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/xcallsbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/xcallsbypid.d.1m new file mode 100644 index 00000000000..173a14f7f71 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/xcallsbypid.d.1m @@ -0,0 +1,46 @@ +.TH xcallsbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +xcallsbypid.d \- CPU cross calls by PID. Uses DTrace. +.SH SYNOPSIS +.B xcallsbypid.d +.SH DESCRIPTION +xcallsbypid.d reports the number of CPU cross calls by process name +and process ID. Cross calls occur when a CPU requests another CPU to +do work on it's behalf. A great number of these can be a burden +on the system. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the sysinfo provider. +.SH EXAMPLES +.TP +This samples until Ctrl\-C is hit. +# +.B xcallsbypid.d +.PP +.SH FIELDS +.TP +PID +process ID +.TP +CMD +process name +.TP +XCALLS +number cross calls +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +xcallsbypid.d will sample until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +mpstat(1m), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/xvmstat.1m b/cddl/contrib/dtracetoolkit/Man/man1m/xvmstat.1m new file mode 100644 index 00000000000..9f27d959a23 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/xvmstat.1m @@ -0,0 +1,104 @@ +.TH xvmstat 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +xvmstat \- extended vmstat demo in DTrace. Uses DTrace. +.SH SYNOPSIS +.B xvmstat +[interval [count]] +.SH DESCRIPTION +This has been written to demonstrate fetching similar data as vmstat +from DTrace, with a few extra fields. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +unstable - needs various kernel symbols. +.SH EXAMPLES +.TP +Print virtual memory statistics every second, +# +.B xvmstat +.TP +Print every 5 seconds, 6 times, +# +.B xvmstat +5 6 +.PP +.SH FIELDS +.TP +w +swapped out LWPs, number +.TP +swap +virtual memory free, Mb +.TP +free +free RAM, Mb +.TP +re +page reclaims, pages +.TP +maj +major faults, pages +.TP +mf +minor faults, pages +.TP +cow +copy-on-write faults, pages +.TP +pro +protection faults, pages +sr +scan rate, pages +.TP +epi +executable page ins, pages +.TP +epo +executable page outs, pages +.TP +epf +executable frees, pages +.TP +api +anonymous page ins, pages +.TP +apo +anonymous page outs, pages +.TP +apf +anonymous frees, pages +.TP +fpi +filesystem page ins, pages +.TP +fpo +filesystem page outs, pages +.TP +fpf +filesystem frees, pages +.PP +.SH NOTES +Most of the statistics are in units of pages, unlike the +original vmstat command which sometimes uses kilobytes. + +All page values are per second values. + +As this program does not use Kstat, there is no summary since boot line. + +Free RAM is both free free + cache free. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +xvmstat will run until Ctrl\-C is hit, or until the count argument +has been satisfied. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +vmstat(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/zvmstat.1m b/cddl/contrib/dtracetoolkit/Man/man1m/zvmstat.1m new file mode 100644 index 00000000000..cd830e06dba --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/zvmstat.1m @@ -0,0 +1,101 @@ +.TH zvmstat 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +zvmstat \- print vmstat style info per Zone. Uses DTrace. +.SH SYNOPSIS +.B zvmstat +[\-t] [interval [count]] +.SH DESCRIPTION +This program must be run from the global zone as root. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall and vminfo providers. +.SH OPTIONS +.TP +\-t +Print timestamps, string +.TP +interval +Duration for each sample, seconds. default is 1. +.TP +count +Number of samples. default is 1. +.PP +.SH EXAMPLES +.TP +Print virtual memory statistics every second, +# +.B zvmstat +.TP +Print every 5 seconds, 6 times, +# +.B zvmstat +5 6 +.PP +.SH FIELDS +.TP +ZONE +zonename +.TP +re +page reclaims, pages +.TP +mf +minor faults, pages +.TP +fr +pages freed, pages +.TP +sr +scan rate, pages +.TP +epi +executable page ins, pages +.TP +epo +executable page outs, pages +.TP +epf +executable frees, pages +.TP +api +anonymous page ins, pages +.TP +apo +anonymous page outs, pages +.TP +apf +anonymous frees, pages +.TP +fpi +filesystem page ins, pages +.TP +fpo +filesystem page outs, pages +.TP +fpf +filesystem frees, pages +.PP +.SH NOTES +Most of the statistics are in units of pages, unlike the +original vmstat command which sometimes uses kilobytes. + +All page values are a total for the sample duration. + +As this program does not use Kstat, there is no summary since boot line. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +zvmstat will run until Ctrl\-C is hit, or until the count argument +has been satisfied. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +vmstat(1M), dtrace(1M) diff --git a/cddl/contrib/dtracetoolkit/Mem/Readme b/cddl/contrib/dtracetoolkit/Mem/Readme new file mode 100644 index 00000000000..c4f7e3d90cc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/Readme @@ -0,0 +1,3 @@ +Mem - Memory based analysis + + These scripts analyse memory and virtual memory related activity. diff --git a/cddl/contrib/dtracetoolkit/Mem/anonpgpid.d b/cddl/contrib/dtracetoolkit/Mem/anonpgpid.d new file mode 100755 index 00000000000..73971d923d1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/anonpgpid.d @@ -0,0 +1,75 @@ +#!/usr/sbin/dtrace -Cs +/* + * anonpgpid.d - anonymous memory paging info by process on CPU. + * Written using DTrace (Solaris 10 3/05). + * + * This scripts may help identify which processes are affected by a system + * with low memory, which is paging to the physical swap device. A report + * of the process on the CPU when paging occured is printed. + * + * $Id: anonpgpid.d 8 2007-08-06 05:55:26Z brendan $ + * + * USAGE: anonpgpid.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * CMD Process name + * D Direction, Read or Write + * BYTES Total bytes during sample + * + * NOTES: + * + * This program is currently an approximation - often the process when writing + * pages to swap will be "pageout" the pageout scanner, or "rcapd" the + * resource capping daemon. + * + * THANKS: James Dickens + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * TODO: + * + * Track processes accurately. This is a little difficult - anonpgout + * occurs asynchronously to the process, and events related to this don't + * point back to the process. + * + * Author: Brendan Gregg [Sydney, Australia] + * + * 25-Jul-2005 Brendan Gregg Created this. + * 18-Feb-2006 " " Last update. + */ + +#include + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +fbt::pageio_setup:entry +/((args[2]->v_flag & (VISSWAP | VSWAPLIKE)) != 0)/ +{ + @total[pid, execname, args[3] & B_READ ? "R" : "W"] = sum(arg1); +} + +dtrace:::END +{ + printf("%6s %-16s %1s %s\n", "PID", "CMD", "D", "BYTES"); + printa("%6d %-16s %1s %@d\n", @total); +} diff --git a/cddl/contrib/dtracetoolkit/Mem/minfbypid.d b/cddl/contrib/dtracetoolkit/Mem/minfbypid.d new file mode 100755 index 00000000000..43f6f83e99c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/minfbypid.d @@ -0,0 +1,57 @@ +#!/usr/sbin/dtrace -s +/* + * minfbypid.d - minor faults by PID. + * Written using DTrace (Solaris 10 3/05) + * + * This program prints a report of minor faults by PID. Minor faults are + * an indiction of memory consumption. This script could be used to help + * determine which process was consuming the most memory during the sample. + * + * $Id: minfbypid.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: minfbypid.d # hit Ctrl-C to end sample + * + * FIELDS: + * PID process ID + * CMD process name + * MINFAULTS number of minor faults + * + * This is based on a script from DExplorer. + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 28-Jun-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +vminfo:::as_fault +{ + @mem[pid, execname] = sum(arg0); +} + +dtrace:::END +{ + printf("%6s %-16s %16s\n", "PID", "CMD", "MINFAULTS"); + printa("%6d %-16s %@16d\n", @mem); +} diff --git a/cddl/contrib/dtracetoolkit/Mem/minfbyproc.d b/cddl/contrib/dtracetoolkit/Mem/minfbyproc.d new file mode 100755 index 00000000000..4d7316c5f09 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/minfbyproc.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * minfbyproc.d - minor faults by process name. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: minfbyproc.d 3 2007-08-01 10:50:08Z brendan $ + */ + +vminfo:::as_fault { @mem[execname] = sum(arg0); } diff --git a/cddl/contrib/dtracetoolkit/Mem/pgpginbypid.d b/cddl/contrib/dtracetoolkit/Mem/pgpginbypid.d new file mode 100755 index 00000000000..bd0ee533475 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/pgpginbypid.d @@ -0,0 +1,53 @@ +#!/usr/sbin/dtrace -s +/* + * pgpginbypid.d - pages paged in by PID. + * Writen using DTrace (Solaris 10 3/05). + * + * $Id: pgpginbypid.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: pgpginbypid.d # hit Ctrl-C to end sample + * + * FIELDS: + * PID process ID + * CMD process name + * PAGES number of pages paged in + * + * This is based on a script from DExplorer. + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 28-Jun-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +vminfo:::pgpgin +{ + @pg[pid, execname] = sum(arg0); +} + +dtrace:::END +{ + printf("%6s %-16s %16s\n", "PID", "CMD", "PAGES"); + printa("%6d %-16s %@16d\n", @pg); +} diff --git a/cddl/contrib/dtracetoolkit/Mem/pgpginbyproc.d b/cddl/contrib/dtracetoolkit/Mem/pgpginbyproc.d new file mode 100755 index 00000000000..572271b5d7d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/pgpginbyproc.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * pgpginbyproc.d - pages paged in by process name. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: pgpginbyproc.d 3 2007-08-01 10:50:08Z brendan $ + */ + +vminfo:::pgpgin { @pg[execname] = sum(arg0); } diff --git a/cddl/contrib/dtracetoolkit/Mem/swapinfo.d b/cddl/contrib/dtracetoolkit/Mem/swapinfo.d new file mode 100755 index 00000000000..045cd7271b5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/swapinfo.d @@ -0,0 +1,149 @@ +#!/usr/sbin/dtrace -s +/* + * swapinfo.d - print virtual memory info (swap). + * Written using DTrace (Solaris 10 3/05) + * + * Prints swap usage details for RAM and disk based swap. + * This script is UNDER CONSTRUCTION, check for newer versions. + * + * $Id: swapinfo.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: swapinfo.d (check for newer versions) + * + * FIELDS: + * RAM Total Total RAM installed + * RAM Unusable RAM consumed by the OBP and TSBs + * RAM Kernel Kernel resident in RAM (and usually locked) + * RAM Locked Locked memory pages from swap (Anon) + * RAM Used anon + exec + file pages used + * RAM Free free memory + page cache free + * Disk Total Total disk swap configured + * Disk Resv Disk swap allocated + reserved + * Disk Avail Disk swap available for reservation + * Swap Total Total Virtual Memory usable + * Swap Resv VM allocated + reserved + * Swap Avail VM available for reservation + * Swap MinFree VM kept free from reservations + * + * SEE ALSO: swapinfo - K9Toolkit, http://www.brendangregg.com/k9toolkit.html + * vmstat 1 2; swap -s; echo ::memstat | mdb -k + * RMCmem - The MemTool Package + * RICHPse - The SE Toolkit + * "Clearing up swap space confusion" Unix Insider, Adrian Cockcroft + * "Solaris Internals", Jim Mauro, Richard McDougall + * /usr/include/vm/anon.h, /usr/include/sys/systm.h + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * Author: Brendan Gregg [Sydney, Australia] + * + * 11-Jun-2005 Brendan Gregg Created this. + * 24-Apr-2006 " " Improved disk measurements; changed terms. + * 24-Apr-2006 " " Last update. + */ + +#pragma D option quiet +#pragma D option bufsize=16k + +inline int DEBUG = 0; + +dtrace:::BEGIN +{ + /* Debug stats */ + this->ani_max = `k_anoninfo.ani_max; + this->ani_phys_resv = `k_anoninfo.ani_phys_resv; + this->ani_mem_resv = `k_anoninfo.ani_mem_resv; + this->ani_locked = `k_anoninfo.ani_locked_swap; + this->availrmem = `availrmem; + + /* RAM stats */ + this->ram_total = `physinstalled; + this->unusable = `physinstalled - `physmem; + this->locked = `pages_locked; + this->ram_used = `availrmem - `freemem; + this->freemem = `freemem; + this->kernel = `physmem - `pages_locked - `availrmem; + + /* Disk stats */ + this->disk_total = `k_anoninfo.ani_max; + this->disk_resv = `k_anoninfo.ani_phys_resv; + this->disk_avail = this->disk_total - this->disk_resv; + + /* Total Swap stats */ + this->minfree = `swapfs_minfree; + this->reserve = `swapfs_reserve; + /* this is TOTAL_AVAILABLE_SWAP from /usr/include/vm/anon.h, */ + this->swap_total = `k_anoninfo.ani_max + + (`availrmem - `swapfs_minfree > 0 ? + `availrmem - `swapfs_minfree : 0); + /* this is CURRENT_TOTAL_AVAILABLE_SWAP from /usr/include/vm/anon.h, */ + this->swap_avail = `k_anoninfo.ani_max - `k_anoninfo.ani_phys_resv + + (`availrmem - `swapfs_minfree > 0 ? + `availrmem - `swapfs_minfree : 0); + this->swap_resv = this->swap_total - this->swap_avail; + + /* Convert to Mbytes */ + this->ani_phys_resv *= `_pagesize; this->ani_phys_resv /= 1048576; + this->ani_mem_resv *= `_pagesize; this->ani_mem_resv /= 1048576; + this->ani_locked *= `_pagesize; this->ani_locked /= 1048576; + this->ani_max *= `_pagesize; this->ani_max /= 1048576; + this->availrmem *= `_pagesize; this->availrmem /= 1048576; + this->ram_total *= `_pagesize; this->ram_total /= 1048576; + this->unusable *= `_pagesize; this->unusable /= 1048576; + this->kernel *= `_pagesize; this->kernel /= 1048576; + this->locked *= `_pagesize; this->locked /= 1048576; + this->ram_used *= `_pagesize; this->ram_used /= 1048576; + this->freemem *= `_pagesize; this->freemem /= 1048576; + this->disk_total *= `_pagesize; this->disk_total /= 1048576; + this->disk_resv *= `_pagesize; this->disk_resv /= 1048576; + this->disk_avail *= `_pagesize; this->disk_avail /= 1048576; + this->swap_total *= `_pagesize; this->swap_total /= 1048576; + this->swap_avail *= `_pagesize; this->swap_avail /= 1048576; + this->swap_resv *= `_pagesize; this->swap_resv /= 1048576; + this->minfree *= `_pagesize; this->minfree /= 1048576; + this->reserve *= `_pagesize; this->reserve /= 1048576; + + /* Print debug */ + DEBUG ? printf("DEBUG availrmem %5d MB\n", this->availrmem) : 1; + DEBUG ? printf("DEBUG freemem %5d MB\n", this->freemem) : 1; + DEBUG ? printf("DEBUG ani_max %5d MB\n", this->ani_max) : 1; + DEBUG ? printf("DEBUG ani_phys_re %5d MB\n", this->ani_phys_resv) : 1; + DEBUG ? printf("DEBUG ani_mem_re %5d MB\n", this->ani_mem_resv) : 1; + DEBUG ? printf("DEBUG ani_locked %5d MB\n", this->ani_locked) : 1; + DEBUG ? printf("DEBUG reserve %5d MB\n", this->reserve) : 1; + DEBUG ? printf("\n") : 1; + + /* Print report */ + printf("RAM _______Total %5d MB\n", this->ram_total); + printf("RAM Unusable %5d MB\n", this->unusable); + printf("RAM Kernel %5d MB\n", this->kernel); + printf("RAM Locked %5d MB\n", this->locked); + printf("RAM Used %5d MB\n", this->ram_used); + printf("RAM Free %5d MB\n", this->freemem); + printf("\n"); + printf("Disk _______Total %5d MB\n", this->disk_total); + printf("Disk Resv %5d MB\n", this->disk_resv); + printf("Disk Avail %5d MB\n", this->disk_avail); + printf("\n"); + printf("Swap _______Total %5d MB\n", this->swap_total); + printf("Swap Resv %5d MB\n", this->swap_resv); + printf("Swap Avail %5d MB\n", this->swap_avail); + printf("Swap (Minfree) %5d MB\n", this->minfree); + + DEBUG ? printf("\nNow run other commands for confirmation.\n") : 1; + ! DEBUG ? exit(0) : 1; +} diff --git a/cddl/contrib/dtracetoolkit/Mem/vmbypid.d b/cddl/contrib/dtracetoolkit/Mem/vmbypid.d new file mode 100755 index 00000000000..5160c14d05b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/vmbypid.d @@ -0,0 +1,54 @@ +#!/usr/sbin/dtrace -s +/* + * vmbypid.d - print vminfo events by process. DTrace. + * + * $Id: vmbypid.d 8 2007-08-06 05:55:26Z brendan $ + * + * USAGE: vmbypid.d + * + * FIELDS: + * EXEC Process name + * PID Process ID + * VM Virtual Memory statistic (/usr/include/sys/sysinfo.h) + * VALUE Value by which statistic was incremented + * + * The virtual memory statistics are documented in the cpu_vminfo struct + * in the /usr/include/sys/sysinfo.h file; and also in the vminfo provider + * chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223. + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 14-May-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +vminfo::: +{ + @VM[execname, pid, probename] = sum(arg0); +} + +dtrace:::END { + printf("%16s %8s %22s %8s\n", "EXEC", "PID", "VM", "VALUE"); + printa("%16s %8d %22s %@8d\n", @VM); +} diff --git a/cddl/contrib/dtracetoolkit/Mem/vmstat-p.d b/cddl/contrib/dtracetoolkit/Mem/vmstat-p.d new file mode 100755 index 00000000000..835a0a6931b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/vmstat-p.d @@ -0,0 +1,155 @@ +#!/usr/sbin/dtrace -s +/* + * vmstat-p.d - vmstat -p demo in DTrace. + * Written using DTrace (Solaris 10 3/05). + * + * This has been written to demonstrate fetching similar data as vmstat + * from DTrace. This program is intended as a starting point for other + * DTrace scripts, by beginning with familiar statistics. + * + * $Id: vmstat-p.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: vmstat-p.d + * + * FIELDS: + * swap virtual memory free Kbytes + * free free RAM Kbytes + * re page reclaims Kbytes + * mf minor faults Kbytes + * sr scan rate pages + * epi executable page ins Kbytes + * epo executable page outs Kbytes + * epf executable frees Kbytes + * api anonymous page ins Kbytes + * apo anonymous page outs Kbytes + * apf anonymous frees Kbytes + * fpi filesystem page ins Kbytes + * fpo filesystem page outs Kbytes + * fpf filesystem frees Kbytes + * + * NOTES: + * Most of the statistics are in units of kilobytes, unlike the + * original vmstat command which sometimes uses page counts. + * As this program does not use Kstat, there is no summary since + * boot line. Free RAM is both free free + cache free. + * + * SEE ALSO: vmstat(1M) + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 11-Jun-2005 Brendan Gregg Created this. + * 08-Jan-2006 " " Last update. + */ + +#pragma D option quiet + +inline int SCREEN = 21; + +/* + * Initialise variables + */ +dtrace:::BEGIN +{ + pi = 0; po = 0; re = 0; sr = 0; mf = 0; fr = 0; + sy = 0; in = 0; cs = 0; maj = 0; cow = 0; pro = 0; + epi = 0; epo = 0; epf = 0; api = 0; apo = 0; apf = 0; + fpi = 0; fpo = 0; fpf = 0; + lines = SCREEN + 1; +} + +/* + * Print header + */ +dtrace:::BEGIN, +tick-1sec +/lines++ > SCREEN/ +{ + printf("%14s %13s %16s %14s %13s\n", + "memory", "page", "executable", "anonymous", "filesystem"); + printf("%9s %7s %5s %4s %3s ", + "swap", "free", "re", "mf", "sr"); + printf("%4s %4s %4s %4s %4s %4s %4s %4s %4s\n", + "epi", "epo", "epf", "api", "apo", "apf", "fpi", "fpo", "fpf"); + lines = 0; +} + +/* + * Probe events + */ +vminfo:::pgrec { re += arg0; } +vminfo:::scan { sr += arg0; } +vminfo:::as_fault { mf += arg0; } +vminfo:::execpgin { epi += arg0; } +vminfo:::execpgout { epo += arg0; } +vminfo:::execfree { epf += arg0; } +vminfo:::anonpgin { api += arg0; } +vminfo:::anonpgout { apo += arg0; } +vminfo:::anonfree { apf += arg0; } +vminfo:::fspgin { fpi += arg0; } +vminfo:::fspgout { fpo += arg0; } +vminfo:::fsfree { fpf += arg0; } + +/* + * Print output line + */ +profile:::tick-1sec +{ + /* fetch free mem */ + this->free = `freemem; + + /* + * fetch free swap + * + * free swap is described in /usr/include/vm/anon.h as, + * MAX(ani_max - ani_resv, 0) + (availrmem - swapfs_minfree) + */ + this->ani_max = `k_anoninfo.ani_max; + this->ani_resv = `k_anoninfo.ani_phys_resv + `k_anoninfo.ani_mem_resv; + this->swap = (this->ani_max - this->ani_resv > 0 ? + this->ani_max - this->ani_resv : 0) + `availrmem - `swapfs_minfree; + + /* fetch w */ + this->w = `nswapped; + + /* convert to Kbytes */ + epi *= `_pagesize / 1024; + epo *= `_pagesize / 1024; + epf *= `_pagesize / 1024; + api *= `_pagesize / 1024; + apo *= `_pagesize / 1024; + apf *= `_pagesize / 1024; + fpi *= `_pagesize / 1024; + fpo *= `_pagesize / 1024; + fpf *= `_pagesize / 1024; + re *= `_pagesize / 1024; + sr *= `_pagesize / 1024; + mf *= `_pagesize / 1024; + this->swap *= `_pagesize / 1024; + this->free *= `_pagesize / 1024; + + /* print line */ + printf("%9d %7d %5d %4d %3d ", + this->swap, this->free, re, mf, sr); + printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d\n", + epi, epo, epf, api, apo, apf, fpi, fpo, fpf); + + /* clear counters */ + pi = 0; po = 0; re = 0; sr = 0; mf = 0; fr = 0; + sy = 0; in = 0; cs = 0; maj = 0; cow = 0; pro = 0; + epi = 0; epo = 0; epf = 0; api = 0; apo = 0; apf = 0; + fpi = 0; fpo = 0; fpf = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Mem/vmstat.d b/cddl/contrib/dtracetoolkit/Mem/vmstat.d new file mode 100755 index 00000000000..f8e0ead0a50 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/vmstat.d @@ -0,0 +1,137 @@ +#!/usr/sbin/dtrace -s +/* + * vmstat.d - vmstat demo in DTrace. + * Written using DTrace (Solaris 10 3/05). + * + * This has been written to demonstrate fetching the same data as vmstat + * from DTrace. This program is intended as a starting point for other + * DTrace scripts, by beginning with familiar statistics. + * + * $Id: vmstat.d 8 2007-08-06 05:55:26Z brendan $ + * + * USAGE: vmstat.d + * + * FIELDS: + * w swapped out LWPs number + * swap virtual memory free Kbytes + * free free RAM Kbytes + * re page reclaims Kbytes + * mf minor faults Kbytes + * pi page ins Kbytes + * po page outs Kbytes + * fr pages freed Kbytes + * sr scan rate pages + * in interrupts number + * sy system calls number + * cs context switches number + * + * NOTES: + * Most of the statistics are in units of kilobytes, unlike the + * original vmstat command which sometimes uses page counts. + * As this program does not use Kstat, there is no summary since boot line. + * Free RAM is both free free + cache free. + * + * SEE ALSO: vmstat(1M) + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 11-Jun-2005 Brendan Gregg Created this. + * 08-Jan-2006 " " Last update. + */ + +#pragma D option quiet + +inline int SCREEN = 21; + +/* + * Initialise variables + */ +dtrace:::BEGIN +{ + pi = 0; po = 0; re = 0; sr = 0; mf = 0; fr = 0; + sy = 0; in = 0; cs = 0; + lines = SCREEN + 1; +} + +/* + * Print header + */ +dtrace:::BEGIN, +profile:::tick-1sec +/lines++ > SCREEN/ +{ + printf(" %1s %10s %8s %5s %5s %4s %4s %4s %4s %5s %6s %4s\n", + "w", "swap", "free", "re", "mf", "pi", "po", "fr", "sr", + "in", "sy", "cs"); + lines = 0; +} + +/* + * Probe events + */ +vminfo:::pgpgin { pi += arg0; } +vminfo:::pgpgout { po += arg0; } +vminfo:::pgrec { re += arg0; } +vminfo:::scan { sr += arg0; } +vminfo:::as_fault { mf += arg0; } +vminfo:::dfree { fr += arg0; } + +syscall:::entry { sy++; } +sdt:::interrupt-start { in++; } +sched::resume:on-cpu { cs++; } + +/* + * Print output line + */ +profile:::tick-1sec +{ + /* fetch free mem */ + this->free = `freemem; + + /* + * fetch free swap + * + * free swap is described in /usr/include/vm/anon.h as, + * MAX(ani_max - ani_resv, 0) + (availrmem - swapfs_minfree) + */ + this->ani_max = `k_anoninfo.ani_max; + this->ani_resv = `k_anoninfo.ani_phys_resv + `k_anoninfo.ani_mem_resv; + this->swap = (this->ani_max - this->ani_resv > 0 ? + this->ani_max - this->ani_resv : 0) + `availrmem - `swapfs_minfree; + + /* fetch w */ + this->w = `nswapped; + + /* convert to Kbytes */ + pi *= `_pagesize / 1024; + po *= `_pagesize / 1024; + re *= `_pagesize / 1024; + sr *= `_pagesize / 1024; + mf *= `_pagesize / 1024; + fr *= `_pagesize / 1024; + this->swap *= `_pagesize / 1024; + this->free *= `_pagesize / 1024; + + /* print line */ + printf(" %1d %10d %8d %5d %5d %4d %4d %4d %4d %5d %6d %4d\n", + this->w, this->swap, this->free, re, mf, pi, po, fr, sr, + in, sy, cs); + + /* clear counters */ + pi = 0; po = 0; re = 0; sr = 0; mf = 0; fr = 0; + sy = 0; in = 0; cs = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Mem/xvmstat b/cddl/contrib/dtracetoolkit/Mem/xvmstat new file mode 100755 index 00000000000..ce13ce7e261 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/xvmstat @@ -0,0 +1,217 @@ +#!/usr/bin/sh +# +# xvmstat - extended vmstat demo in DTrace. +# Written using DTrace (Solaris 10 3/05). +# +# This has been written to demonstrate fetching similar data as vmstat +# from DTrace, with a few extra fields. +# +# $Id: xvmstat 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: xvmstat [interval [count]] +# +# FIELDS: +# w swapped out LWPs number +# swap virtual memory free Mbytes +# free free RAM Mbytes +# re page reclaims pages/sec +# maj major faults pages/sec +# mf minor faults pages/sec +# cow copy-on-write faults pages/sec +# pro protection faults pages/sec +# sr scan rate pages/sec +# epi executable page ins pages/sec +# epo executable page outs pages/sec +# epf executable frees pages/sec +# api anonymous page ins pages/sec +# apo anonymous page outs pages/sec +# apf anonymous frees pages/sec +# fpi filesystem page ins pages/sec +# fpo filesystem page outs pages/sec +# fpf filesystem frees pages/sec +# +# NOTES: +# - Most of the statistics are in units of pages, unlike the +# original vmstat command which sometimes uses kilobytes. +# - As this program does not use Kstat, there is no summary since boot line. +# - Free RAM is both free free + cache free. +# +# SEE ALSO: vmstat(1M) +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# 12-Jun-2005 Brendan Gregg Created this. +# 01-Mar-2006 " " Last update. +# + +############################## +# --- Process Arguments --- +# + +### default values +interval=1; count=-1 + +### check arguments +if [ "$1" = "-h" -o "$1" = "--help" ]; then + cat <<-END >&2 + USAGE: xvmstat [interval [count]] + xvmstat # 1 second samples, infinite + eg, + xvmstat 1 # print every 1 second + xvmstat 5 6 # print every 5 seconds, 6 times + END + exit 1 +fi + +### argument logic +if [ "$1" -gt 0 ]; then + interval=$1; count=-1; shift +fi +if [ "$1" -gt 0 ]; then + count=$1; shift +fi +if [ $interval -eq 0 ]; then + interval=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + + /* + * Command line arguments + */ + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + inline int SCREEN = 21; + + /* + * Initialise variables + */ + dtrace:::BEGIN + { + re = 0; sr = 0; mf = 0; maj = 0; cow = 0; pro = 0; + epi = 0; epo = 0; epf = 0; api = 0; apo = 0; apf = 0; + fpi = 0; fpo = 0; fpf = 0; + lines = SCREEN + 1; + counts = COUNTER; + secs = INTERVAL; + first = 1; + } + + profile:::tick-1sec + { + secs--; + } + + /* + * Print header + */ + dtrace:::BEGIN, + profile:::tick-1sec + /first || (secs == 0 && lines > SCREEN)/ + { + printf("%2s %6s %5s %5s %3s %4s %3s %3s %3s ", + "w", "swap", "free", "re", "maj", "mf", "cow", "pro", "sr"); + printf("%3s %3s %3s %3s %3s %3s %3s %3s %3s\n", + "epi", "epo", "epf", "api", "apo", "apf", "fpi", "fpo", "fpf"); + lines = 0; + first = 0; + } + + /* + * Probe events + */ + vminfo:::pgrec { re += arg0; } + vminfo:::scan { sr += arg0; } + vminfo:::as_fault { mf += arg0; } + vminfo:::execpgin { epi += arg0; } + vminfo:::execpgout { epo += arg0; } + vminfo:::execfree { epf += arg0; } + vminfo:::anonpgin { api += arg0; } + vminfo:::anonpgout { apo += arg0; } + vminfo:::anonfree { apf += arg0; } + vminfo:::fspgin { fpi += arg0; } + vminfo:::fspgout { fpo += arg0; } + vminfo:::fsfree { fpf += arg0; } + vminfo:::maj_fault { maj += arg0; } + vminfo:::cow_fault { cow += arg0; } + vminfo:::prot_fault { pro += arg0; } + + /* + * Print output line + */ + profile:::tick-1sec + /secs == 0/ + { + /* fetch free mem */ + this->free = `freemem; + + /* + * fetch free swap + * + * free swap is described in /usr/include/vm/anon.h as, + * MAX(ani_max - ani_resv, 0) + (availrmem - swapfs_minfree) + */ + this->ani_max = `k_anoninfo.ani_max; + this->ani_resv = `k_anoninfo.ani_phys_resv + `k_anoninfo.ani_mem_resv; + this->swap = (this->ani_max - this->ani_resv > 0 ? + this->ani_max - this->ani_resv : 0) + `availrmem - `swapfs_minfree; + + /* fetch w */ + this->w = `nswapped; + + /* convert to Mbytes */ + this->swap *= `_pagesize; this->swap /= 1048576; + this->free *= `_pagesize; this->free /= 1048576; + + /* convert to per second values */ + re /= INTERVAL; maj /= INTERVAL; mf /= INTERVAL; + cow /= INTERVAL; pro /= INTERVAL; sr /= INTERVAL; + epi /= INTERVAL; epo /= INTERVAL; epf /= INTERVAL; + api /= INTERVAL; apo /= INTERVAL; apf /= INTERVAL; + fpi /= INTERVAL; fpo /= INTERVAL; fpf /= INTERVAL; + + /* print line */ + printf("%2d %6d %5d %5d %3d %4d %3d %3d %3d ", + this->w, this->swap, this->free, re, maj, mf, cow, pro, sr); + printf("%3d %3d %3d %3d %3d %3d %3d %3d %3d\n", + epi, epo, epf, api, apo, apf, fpi, fpo, fpf); + + /* clear counters */ + re = 0; sr = 0; mf = 0; maj = 0; cow = 0; pro = 0; + epi = 0; epo = 0; epf = 0; api = 0; apo = 0; apf = 0; + fpi = 0; fpo = 0; fpf = 0; + + /* process counts */ + secs = INTERVAL; + counts--; + lines++; + } + + /* + * End + */ + profile:::tick-1sec + /counts == 0/ + { + exit(0); + } +' diff --git a/cddl/contrib/dtracetoolkit/Misc/Readme b/cddl/contrib/dtracetoolkit/Misc/Readme new file mode 100644 index 00000000000..2b77f609210 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Misc/Readme @@ -0,0 +1,5 @@ +Extra - Extra DTrace scripts + + These are scripts that fall into no other category. They probably aren't + very useful, and are here as a particular coding example rather than + a useful tool. diff --git a/cddl/contrib/dtracetoolkit/Misc/guess.d b/cddl/contrib/dtracetoolkit/Misc/guess.d new file mode 100755 index 00000000000..3ebcd39c2ec --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Misc/guess.d @@ -0,0 +1,118 @@ +#!/usr/sbin/dtrace -wqs +/* + * guess.d - guessing game in D (DTrace) + * + * $Id: guess.d 32 2007-09-15 05:08:49Z brendan $ + * + * USAGE: guess.d + * + * SEE: http://www.brendangregg.com/guessinggame.html + * + * This is written to demonstrate this language versus the same program + * written in other languages. + * + * 11-May-2005 Brendan Gregg Created this. + */ + +inline string scorefile = "highscores_d"; + +dtrace:::BEGIN +{ + printf("guess.d - Guess a number between 1 and 100\n\n"); + num = 1; + state = 1; + + /* Generate random number */ + answer = (rand() % 100) + 1; + answer = answer > 0 ? answer : - answer; +} + +syscall::write:entry +/state == 1 && pid == $pid/ +{ + state = 2; + printf("Enter guess %d: ", num); + system("read guess"); + pos = 0; +} + +syscall::read:entry +/state == 2 && ppid == $pid && arg0 == 3/ +{ + self->inguess = 1; + self->buf = arg1; +} + +syscall::read:return +/self->inguess/ +{ + key = copyin(self->buf, arg0); + keys[pos] = *(char *)key; + self->buf = 0; + pos++; +} + +syscall::read:return +/self->inguess && keys[pos-1] == '\n'/ +{ + pos -= 2; + fac = 1; + guess = fac * (keys[pos] - '0'); + pos--; + fac *= 10; + guess = pos >= 0 ? guess + fac * (keys[pos] - '0') : guess; + pos--; + fac *= 10; + guess = pos >= 0 ? guess + fac * (keys[pos] - '0') : guess; + self->doneguess = 1; +} + +syscall::read:return +/self->inguess/ +{ + self->inguess = 0; +} + +/* Play game */ +syscall::read:return +/self->doneguess && guess == answer/ +{ + printf("Correct! That took %d guesses.\n\n", num); + self->doneguess = 0; + state = 3; + printf("Please enter your name: "); + system("/usr/bin/read name"); +} + +syscall::read:return +/self->doneguess && guess != answer/ +{ + num++; + + printf("%s...\n", guess < answer ? "Higher" : "Lower"); + + printf("Enter guess %d: ", num); + system("read line"); + pos = 0; +} + +syscall::read:entry +/state == 3 && curthread->t_procp->p_parent->p_ppid == $pid && arg0 == 0/ +{ + self->inname = 1; + self->buf = arg1; +} + +/* Save high score */ +syscall::read:return +/self->inname/ +{ + self->inname = 0; + name = stringof(copyin(self->buf, arg0 - 1)); + system("echo %s %d >> %s", name, num, scorefile); + + /* Print high scores */ + printf("\nPrevious high scores,\n"); + system("cat %s", scorefile); + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Misc/woof.d b/cddl/contrib/dtracetoolkit/Misc/woof.d new file mode 100755 index 00000000000..d856a09bc54 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Misc/woof.d @@ -0,0 +1,63 @@ +#!/usr/sbin/dtrace -s +/* + * woof.d - Bark whenever new processes appear. Needs /dev/audio. + * Written in DTrace (Solaris 10 3/05). + * + * $Id: woof.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: woof.d & + * + * SEE ALSO: /usr/dt/bin/sdtaudiocontrol # to set volume + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 14-Aug-2006 Brendan Gregg Created this. + * 14-Aug-2006 " " Last update. + */ + +#pragma D option quiet +#pragma D option destructive +#pragma D option switchrate=10hz + +inline int SCREEN_OUTPUT = 0; /* Set to 1 for screen output */ + +/* barks prevents woof.d from barking too much (up to 20 barks/second) */ +int barks; + +dtrace:::BEGIN +{ + SCREEN_OUTPUT ? trace("Beware of the dog!\n") : 1; +} + +/* + * Call the shell to run a background audioplay command (cat > /dev/audio + * doesn't always work). One problem this creates is a feedback loop, + * where we bark at our own barks, or at other dogs barks; entertaining + * as this is, it can really slog the system and has been avoided by + * checking our ancestory. + */ +proc:::exec-success +/!progenyof($pid) && barks++ < 2/ +{ + SCREEN_OUTPUT ? trace("Woof! ") : 1; + system("audioplay /usr/share/audio/samples/au/bark.au &"); +} + +profile:::tick-10hz +{ + barks = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Misc/wpm.d b/cddl/contrib/dtracetoolkit/Misc/wpm.d new file mode 100755 index 00000000000..7f3bff2d6fb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Misc/wpm.d @@ -0,0 +1,143 @@ +#!/usr/sbin/dtrace -s +/* + * wpm.d - Measure words per minute of typing. + * Written in DTrace (Solaris 10 3/05). + * + * $Id: wpm.d 52 2007-09-24 04:28:01Z brendan $ + * + * USAGE: wpm.d commandname + * eg, + * wpm.d bash + * wpm.d vim + * + * This script assumes that keystrokes arrive one at a time on STDIN. This + * isn't the case for all processes that read keyboard input (eg, sh). + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 05-Aug-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 +#pragma D option defaultargs + +inline int STDIN = 0; + +enum tracing_state { + BEGIN, + TRACING +}; + +dtrace:::BEGIN +/$$1 == ""/ +{ + trace("USAGE: wpm.d commandname\n"); + trace(" eg,\n"); + trace(" wpm.d bash\n"); + trace(" wpm.d vim\n"); + exit(1); +} + +dtrace:::BEGIN +{ + state = BEGIN; + keys = 0; + words = 0; + wordsize = 0; + countdown = 5; + last = 0; + printf("Measuring will start in : %2d seconds", countdown); +} + +profile:::tick-1sec +/--countdown >= 0/ +{ + printf("\b\b\b\b\b\b\b\b\b\b%2d seconds", countdown); +} + +profile:::tick-1sec +/state == BEGIN && countdown == -1/ +{ + state = TRACING; + countdown = 60; + printf("\nMeasuring will stop in : %2d seconds", countdown); +} + +syscall::read:entry +/state == TRACING && execname == $$1 && arg0 == STDIN/ +{ + self->buf = arg1; +} + +syscall::read:return +/self->buf && last/ +{ + this->elapsed = (timestamp - last) / 1000000; + @dist = quantize(this->elapsed); + @avg = avg(this->elapsed); + @min = min(this->elapsed); + @max = max(this->elapsed); +} + +syscall::read:return +/self->buf/ +{ + keys++; + wordsize++; + this->key = stringof(copyin(self->buf, arg0)); + last = timestamp; +} + +syscall::read:return +/self->buf && (this->key == " " || this->key == "\n" || this->key == "\r") && + wordsize == 1/ +{ + /* recurring space */ + wordsize = 0; + self->buf = 0; +} + +syscall::read:return +/self->buf && (this->key == " " || this->key == "\n" || this->key == "\r")/ +{ + words++; + @sizes = lquantize(wordsize - 1, 0, 32, 1); + wordsize = 0; +} + +syscall::read:return +/self->buf/ +{ + self->buf = 0; +} + +profile:::tick-1sec +/state == TRACING && countdown == -1/ +{ + printf("\n\nCharacters typed : %d\n", keys); + printf("Words per minute : %d\n\n", words); + + printa("Minimum keystroke latency : %@d ms\n", @min); + printa("Average keystroke latency : %@d ms\n", @avg); + printa("Maximum keystroke latency : %@d ms\n\n", @max); + + printa("Word size distribution (letters),\n%@d\n", @sizes); + printa("Keystroke latency distribution (ms),\n%@d\n", @dist); + + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Net/Readme b/cddl/contrib/dtracetoolkit/Net/Readme new file mode 100644 index 00000000000..3a53744ebe2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/Readme @@ -0,0 +1,4 @@ +Net - Network based analysis + + These scripts analyse activity of the network interfaces, the TCP/IP + stack, socket activity, etc. diff --git a/cddl/contrib/dtracetoolkit/Net/connections b/cddl/contrib/dtracetoolkit/Net/connections new file mode 100755 index 00000000000..523b880b14c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/connections @@ -0,0 +1,178 @@ +#!/usr/bin/ksh +# +# connections - print inbound TCP connections by process. +# Written in DTrace (Solaris 10 3/05). +# +# This displays the PID and command name of the processes accepting +# connections, along with the source IP address and destination port number. +# +# $Id: connections 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: connections [-htvZ] +# +# -t # print timestamps, us +# -v # print timestamps, string +# -Z # print zonename +# eg, +# connections -v # snoop connections with times +# +# FIELDS: +# UID user ID of the server +# PID process ID for the server +# CMD server command name +# TIME timestamp, us +# TIMESTR timestamp, string +# PORT server port +# IP_SOURCE source IP of the client, written in IPv4 style +# ZONE zonename +# +# SEE ALSO: snoop 'tcp[13:1] = 0x02' # snoop new connections +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# TODO: IPv6 +# +# 10-Apr-2004 Brendan Gregg Created this. +# 23-May-2004 " " Fixed issues on SPARC. +# 08-May-2005 " " Updated for newer Solaris 10. +# 17-Jun-2005 " " Rewrote, changed probes, wrapped in sh. +# 04-Dec-2005 " " Changed tcp_accept_finish -> sotpi_accept +# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. +# 20-Apr-2006 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### Default variables +opt_time=0; opt_timestr=0; opt_zone=0 + +### Process options +while getopts htvZ name +do + case $name in + t) opt_time=1 ;; + v) opt_timestr=1 ;; + Z) opt_zone=1 ;; + h|?) cat <<-END >&2 + USAGE: connections [-htvZ] + -t # print timestamps, us + -v # print timestamps, string + -Z # print zonename + eg, + connections -v # snoop connections with times + END + exit 1 + esac +done + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -C -s <( print -r ' +#include +#include +#include +#include +#include + + #pragma D option quiet + #pragma D option switchrate=10hz + + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int OPT_zone = '$opt_zone'; + + /* + * Print header + */ + dtrace:::BEGIN + { + /* print optional headers */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "TIMESTR") : 1; + OPT_zone ? printf("%-10s ", "ZONE") : 1; + + /* print header */ + printf("%5s %5s %-12s %4s %5s %s\n", + "UID", "PID", "CMD", "TYPE", "PORT", "IP_SOURCE"); + } + + /* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ + fbt:sockfs:sotpi_accept:entry + /(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ + { + self->sop = args[0]; + } + + fbt:sockfs:sotpi_create:return + /self->sop/ + { + self->nsop = (struct sonode *)arg1; + } + + + /* + * Probe TCP connections + */ + fbt:sockfs:sotpi_accept:return + /self->nsop/ + { + /* fetch connection details */ + this->tcpp = (tcp_t *)self->nsop->so_priv; + this->connp = (conn_t *)this->tcpp->tcp_connp; + +#if defined(_BIG_ENDIAN) + this->port0 = this->connp->u_port.tcpu_ports.tcpu_lport; +#else + this->port0 = BSWAP_16(this->connp->u_port.tcpu_ports.tcpu_lport); +#endif + this->rem12 = + (uint8_t)this->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->rem13 = + (uint8_t)this->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->rem14 = + (uint8_t)this->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->rem15 = + (uint8_t)this->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + + /* print optional fields */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%-10s ", zonename) : 1; + + /* print output line */ + printf("%5d %5d %-12s %4s %5d %d.%d.%d.%d\n", + uid, pid, execname, "tcp", this->port0, + this->rem12, this->rem13, this->rem14, this->rem15); + } + + fbt:sockfs:sotpi_accept:return + { + self->nsop = 0; + self->sop = 0; + } +') + diff --git a/cddl/contrib/dtracetoolkit/Net/icmpstat.d b/cddl/contrib/dtracetoolkit/Net/icmpstat.d new file mode 100755 index 00000000000..3df519999e3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/icmpstat.d @@ -0,0 +1,61 @@ +#!/usr/sbin/dtrace -s +/* + * icmpstat.d - print ICMP statistics. Uses DTrace. + * + * This prints ICMP statistics every second, retrieved from the MIB provider. + * This is a simple script to demonstrate the ability to trace ICMP events. + * + * $Id: icmpstat.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: icmpstat.d + * + * FIELDS: + * STATISTIC ICMP statistic name + * VALUE total of statistic during sample + * + * The above ICMP statistics are documented in the mib2_icmp struct + * in the /usr/include/inet/mib2.h file; and also in the mib provider + * chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223. + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 25-Jul-2005 Brendan Gregg Created this. + * 25-Jul-2005 " " Last update. + */ + +#pragma D option quiet + +/* + * Save Data + */ +mib:::icmp* +{ + @icmp[probename] = sum(arg0); +} + +/* + * Print Output + */ +profile:::tick-1sec +{ + printf("%Y,\n\n", walltimestamp); + printf("%32s %8s\n", "STATISTIC", "VALUE"); + printa("%32s %@8d\n", @icmp); + printf("\n"); + + trunc(@icmp); +} diff --git a/cddl/contrib/dtracetoolkit/Net/tcpsnoop b/cddl/contrib/dtracetoolkit/Net/tcpsnoop new file mode 100755 index 00000000000..e06912de015 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcpsnoop @@ -0,0 +1,581 @@ +#!/usr/bin/ksh +# +# tcpsnoop - snoop TCP network packets by process. +# Written using DTrace (Solaris 10 3/05) +# +# This analyses TCP network packets and prints the responsible PID and UID, +# plus standard details such as IP address and port. This captures traffic +# of newly created TCP connections that were established while this program +# was running. It can help identify which processes is causing TCP traffic. +# +# WARNING: This script may only work on Solaris 10 3/05, since it uses the +# fbt provider to trace the raw operation of a specific version of the kernel. +# In the future, a 'stable' network provider should exist which will allow +# this to be written for that and subsequent versions of the kernel. In the +# meantime, check for other versions of this script in the /Net directory, +# and read the Notes/ALLfbt_notes.txt for more background on fbt. +# +# $Id: tcpsnoop 69 2007-10-04 13:40:00Z brendan $ +# +# USAGE: tcpsnoop [-a|hjsvZ] [-n name] [-p pid] +# +# -a # print all data +# -j # print project ID +# -s # print time, us +# -v # print time, string +# -Z # print zone ID +# -n name # command name to snoop +# -p pid # PID to snoop +# eg, +# tcpsnoop -v # human readable timestamps +# tcpsnoop -Z # print zonename +# tcpsnoop -n sshd # snoop sshd traffic only +# +# FIELDS: +# UID user ID +# PID process ID +# CMD command +# LADDR local IP address +# RADDR remote IP address +# LPORT local port number +# RPORT remote port number +# DR direction +# SIZE packet size, bytes +# TIME timestamp, us +# STRTIME human readable timestamp, string +# ZONE zone ID +# PROJ project ID +# +# SEE ALSO: snoop -rS +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# TODO: IPv6 +# +# CODE: +# The FILTER syntax matches on packets rather than initial +# connections, so that it can follow inetd connections properly. +# +# 09-Jul-2004 Brendan Gregg Created this. +# 12-Mar-2005 " " Changed probes, size info now printed. +# 02-Jul-2005 " " Many more probes. Renamed "tcpsnoop.d". +# 04-Jul-2005 " " Now wrapped in shell, called "tcpsnoop". +# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct +# execname. Thanks Kias Belgaied for expertise. +# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. +# 20-Apr-2006 " " Last update. +# + +############################## +# --- Process Arguments --- +# + +### default variables +opt_name=0; opt_time=0; opt_timestr=0; filter=0; pname=. +opt_zone=0; opt_proj=0; opt_pid=0; pid=0 + +### process options +while getopts ahjsvZn:p: name +do + case $name in + a) opt_time=1; opt_timestr=1; opt_zone=1; opt_proj=1 ;; + n) opt_name=1; pname=$OPTARG ;; + p) opt_pid=1; pid=$OPTARG ;; + j) opt_proj=1 ;; + s) opt_time=1 ;; + v) opt_timestr=1 ;; + Z) opt_zone=1 ;; + h|?) cat <<-END >&2 + USAGE: tcpsnoop [-a|hjsvZ] [-n name] [-p pid] + tcpsnoop # default output + -a # print all data + -j # print project ID + -s # print start time, us + -v # print start time, string + -Z # print zonename + -n name # command name to snoop + -p pid # PID to snoop + eg, + tcpsnoop -v # human readable timestamps + tcpsnoop -Z # print zonename + tcpsnoop -n sshd # snoop sshd traffic only + END + exit 1 + esac +done + +### option logic +if (( opt_name || opt_pid )); then + filter=1 +fi + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -Cs <( print -r ' + /* + * Command line arguments + */ + inline int OPT_name = '$opt_name'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_proj = '$opt_proj'; + inline int PID = '$pid'; + inline int FILTER = '$filter'; + inline string NAME = "'$pname'"; + +#pragma D option quiet +#pragma D option switchrate=10hz + +#include +#include +#include +#include +#include + +/* + * Print header + */ +dtrace:::BEGIN +{ + /* print optional headers */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "STRTIME") : 1; + OPT_zone ? printf("%4s ", "ZONE") : 1; + OPT_proj ? printf("%4s ", "PROJ") : 1; + + /* print main headers */ + printf("%5s %6s %-15s %5s %2s %-15s %5s %5s %s\n", + "UID", "PID", "LADDR", "LPORT", "DR", "RADDR", "RPORT", + "SIZE", "CMD"); +} + + +/* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ +fbt:sockfs:sotpi_accept:entry +/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ +{ + self->sop = args[0]; +} + +fbt:sockfs:sotpi_create:return +/self->sop/ +{ + self->nsop = (struct sonode *)arg1; +} + +fbt:sockfs:sotpi_accept:return +/self->nsop/ +{ + this->tcpp = (tcp_t *)self->nsop->so_priv; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +fbt:sockfs:sotpi_accept:return +{ + self->nsop = 0; + self->sop = 0; +} + +/* + * TCP Process outbound connections + */ +fbt:ip:tcp_connect:entry +{ + this->tcpp = (tcp_t *)arg0; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; + OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1; +} + +/* + * TCP Data translations + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + /* fetch ports */ +#if defined(_BIG_ENDIAN) + self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; + self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; +#else + self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); + self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); +#endif + + /* fetch IPv4 addresses */ + this->fad12 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->fad13 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->fad14 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->fad15 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + this->lad12 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; + this->lad13 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; + this->lad14 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; + this->lad15 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; + + /* convert type for use with lltostr() */ + this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; + this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; + this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; + this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; + this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; + this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; + this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; + this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + /* fix direction and save values */ + tladdr[(int)self->connp] = self->laddr; + tfaddr[(int)self->connp] = self->faddr; + tlport[(int)self->connp] = self->lport; + tfport[(int)self->connp] = self->fport; + + /* all systems go */ + tok[(int)self->connp] = 1; +} + +/* + * TCP Clear connp + */ +fbt:ip:tcp_get_conn:return +{ + /* Q_TO_CONN */ + this->connp = (conn_t *)arg1; + tok[(int)this->connp] = 0; + tpid[(int)this->connp] = 0; + tuid[(int)this->connp] = 0; + tname[(int)this->connp] = 0; + tproj[(int)this->connp] = 0; +} + +/* + * TCP Process "port closed" + */ +fbt:ip:tcp_xmit_early_reset:entry +/FILTER == 0/ +{ + this->queuep = (queue_t *)`tcp_g_q; /* ` */ + this->connp = (conn_t *)this->queuep->q_ptr; + this->tcpp = (tcp_t *)this->connp->conn_tcp; + self->zoneid = this->connp->conn_zoneid; + + /* split addresses */ + this->ipha = (ipha_t *)args[1]->b_rptr; + this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; + this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; + this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; + this->fad12 = (this->ipha->ipha_src & 0x000000ff); + this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; + this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; + this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; + this->lad12 = (this->ipha->ipha_dst & 0x000000ff); + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + self->reset = 1; +} + +/* + * TCP Fetch "port closed" ports + */ +fbt:ip:tcp_xchg:entry +/self->reset/ +{ +#if defined(_BIG_ENDIAN) + self->lport = (uint16_t)arg0; + self->fport = (uint16_t)arg1; +#else + self->lport = BSWAP_16((uint16_t)arg0); + self->fport = BSWAP_16((uint16_t)arg1); +#endif + self->lport = BE16_TO_U16(arg0); + self->fport = BE16_TO_U16(arg1); +} + +/* + * TCP Print "port closed" + */ +fbt:ip:tcp_xmit_early_reset:return +/FILTER == 0/ +{ + self->name = ""; + self->pid = 0; + self->uid = 0; + self->proj = 0; + self->size = 54; /* should check trailers */ + self->dir = "<-"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->reset = 0; + self->size = 0; + self->name = 0; + self->zoneid = 0; +} + +/* + * TCP Process Write + */ +fbt:ip:tcp_send_data:entry +{ + self->conn_p = (conn_t *)args[0]->tcp_connp; +} + +fbt:ip:tcp_send_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "->"; + self->size = msgdsize(args[2]) + 14; /* should check trailers */ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Process Read + */ +fbt:ip:tcp_rput_data:entry +{ + self->conn_p = (conn_t *)arg0; + self->size = msgdsize(args[1]) + 14; /* should check trailers */ +} + +fbt:ip:tcp_rput_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "<-"; + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Complete printing outbound handshake + */ +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54; /* should check trailers */ + self->dir = "->"; +} + +fbt:ip:tcp_connect:return +/(self->connp) && + ((FILTER == 0) || + (OPT_pid && self->pid == PID) || + (OPT_name && self->name == NAME))/ +{ + /* this packet occured before connp was fully established */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Complete printing inbound handshake + */ +fbt:sockfs:sotpi_accept:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54; /* should check trailers */ + self->dir = "<-"; +} + +fbt:sockfs:sotpi_accept:return +/(self->connp) && + ((FILTER == 0) || + (OPT_pid && self->pid == PID) || + (OPT_name && self->name == NAME))/ +{ + /* these packets occured before connp was fully established */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "<-"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * Print output + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +/(self->ok == 2) && + ((FILTER == 0) || + (OPT_pid && self->pid == PID) || + (OPT_name && self->name == NAME))/ +{ + /* print optional fields */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + + /* print output line */ + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Clear connect variables + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->faddr = 0; + self->laddr = 0; + self->fport = 0; + self->lport = 0; + self->connp = 0; + self->name = 0; + self->pid = 0; + self->uid = 0; +} + +/* + * TCP Clear r/w variables + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +{ + self->ok = 0; + self->dir = 0; + self->uid = 0; + self->pid = 0; + self->size = 0; + self->name = 0; + self->lport = 0; + self->fport = 0; + self->laddr = 0; + self->faddr = 0; + self->conn_p = 0; + self->zoneid = 0; + self->proj = 0; +} +') diff --git a/cddl/contrib/dtracetoolkit/Net/tcpsnoop.d b/cddl/contrib/dtracetoolkit/Net/tcpsnoop.d new file mode 100755 index 00000000000..ca01864522a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcpsnoop.d @@ -0,0 +1,424 @@ +#!/usr/sbin/dtrace -Cs +/* + * tcpsnoop.d - snoop TCP network packets by process. + * Written using DTrace (Solaris 10 3/05) + * + * This analyses TCP network packets and prints the responsible PID and UID, + * plus standard details such as IP address and port. This captures traffic + * of newly created TCP connections that were established while this program + * was running. It can help identify which processes is causing TCP traffic. + * + * WARNING: This script may only work on Solaris 10 3/05, since it uses the + * fbt provider to trace the raw operation of a specific version of the kernel. + * In the future, a 'stable' network provider should exist which will allow + * this to be written for that and subsequent versions of the kernel. In the + * meantime, check for other versions of this script in the /Net directory, + * and read the Notes/ALLfbt_notes.txt for more background on fbt. + * + * $Id: tcpsnoop.d 69 2007-10-04 13:40:00Z brendan $ + * + * USAGE: tcpsnoop.d + * + * FIELDS: + * UID user ID + * PID process ID + * CMD command + * LADDR local IP address + * RADDR remote IP address + * LPORT local port number + * RPORT remote port number + * DR direction + * SIZE packet size, bytes + * + * SEE ALSO: snoop -rS + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * Author: Brendan Gregg [Sydney, Australia] + * + * TODO: IPv6 + * + * 09-Jul-2004 Brendan Gregg Created this. + * 12-Mar-2005 " " Changed probes, size info now printed. + * 02-Jul-2005 " " Many more probes. Renamed "tcpsnoop.d". + * 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct + * execname. Thanks Kias Belgaied for expertise. + * 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet +#pragma D option switchrate=10hz + +#include +#include +#include + +/* + * Print header + */ +dtrace:::BEGIN +{ + /* print main headers */ + printf("%5s %6s %-15s %5s %2s %-15s %5s %5s %s\n", + "UID", "PID", "LADDR", "LPORT", "DR", "RADDR", "RPORT", + "SIZE", "CMD"); +} + +/* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ +fbt:sockfs:sotpi_accept:entry +/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ +{ + self->sop = args[0]; +} + +fbt:sockfs:sotpi_create:return +/self->sop/ +{ + self->nsop = (struct sonode *)arg1; +} + +fbt:sockfs:sotpi_accept:return +/self->nsop/ +{ + this->tcpp = (tcp_t *)self->nsop->so_priv; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +fbt:sockfs:sotpi_accept:return +{ + self->nsop = 0; + self->sop = 0; +} + +/* + * TCP Process outbound connections + */ +fbt:ip:tcp_connect:entry +{ + this->tcpp = (tcp_t *)arg0; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +/* + * TCP Data translations + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + /* fetch ports */ +#if defined(_BIG_ENDIAN) + self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; + self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; +#else + self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); + self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); +#endif + + /* fetch IPv4 addresses */ + this->fad12 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->fad13 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->fad14 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->fad15 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + this->lad12 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; + this->lad13 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; + this->lad14 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; + this->lad15 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; + + /* convert type for use with lltostr() */ + this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; + this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; + this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; + this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; + this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; + this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; + this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; + this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + /* fix direction and save values */ + tladdr[(int)self->connp] = self->laddr; + tfaddr[(int)self->connp] = self->faddr; + tlport[(int)self->connp] = self->lport; + tfport[(int)self->connp] = self->fport; + + /* all systems go */ + tok[(int)self->connp] = 1; +} + +/* + * TCP Clear connp + */ +fbt:ip:tcp_get_conn:return +{ + /* Q_TO_CONN */ + this->connp = (conn_t *)arg1; + tok[(int)this->connp] = 0; + tpid[(int)this->connp] = 0; + tuid[(int)this->connp] = 0; + tname[(int)this->connp] = 0; +} + +/* + * TCP Process "port closed" + */ +fbt:ip:tcp_xmit_early_reset:entry +{ + this->queuep = (queue_t *)`tcp_g_q; /* ` */ + this->connp = (conn_t *)this->queuep->q_ptr; + this->tcpp = (tcp_t *)this->connp->conn_tcp; + + /* split addresses */ + this->ipha = (ipha_t *)args[1]->b_rptr; + this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; + this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; + this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; + this->fad12 = (this->ipha->ipha_src & 0x000000ff); + this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; + this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; + this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; + this->lad12 = (this->ipha->ipha_dst & 0x000000ff); + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + self->reset = 1; +} + +/* + * TCP Fetch "port closed" ports + */ +fbt:ip:tcp_xchg:entry +/self->reset/ +{ +#if defined(_BIG_ENDIAN) + self->lport = (uint16_t)arg0; + self->fport = (uint16_t)arg1; +#else + self->lport = BSWAP_16((uint16_t)arg0); + self->fport = BSWAP_16((uint16_t)arg1); +#endif + self->lport = BE16_TO_U16(arg0); + self->fport = BE16_TO_U16(arg1); +} + +/* + * TCP Print "port closed" + */ +fbt:ip:tcp_xmit_early_reset:return +{ + self->name = ""; + self->pid = 0; + self->uid = 0; + self->size = 54; /* should check trailers */ + self->dir = "<-"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->reset = 0; + self->size = 0; + self->name = 0; +} + +/* + * TCP Process Write + */ +fbt:ip:tcp_send_data:entry +{ + self->conn_p = (conn_t *)args[0]->tcp_connp; +} + +fbt:ip:tcp_send_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "->"; + self->size = msgdsize(args[2]) + 14; /* should check trailers */ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Process Read + */ +fbt:ip:tcp_rput_data:entry +{ + self->conn_p = (conn_t *)arg0; + self->size = msgdsize(args[1]) + 14; /* should check trailers */ +} + +fbt:ip:tcp_rput_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "<-"; + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Complete printing outbound handshake + */ +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->size = 54; /* should check trailers */ + self->dir = "->"; + /* this packet occured before connp was fully established */ + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Complete printing inbound handshake + */ +fbt:sockfs:sotpi_accept:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->size = 54; /* should check trailers */ + /* these packets occured before connp was fully established */ + self->dir = "<-"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "<-"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * Print output + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +/self->ok == 2/ +{ + /* print output line */ + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Clear connect variables + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->faddr = 0; + self->laddr = 0; + self->fport = 0; + self->lport = 0; + self->connp = 0; + self->name = 0; + self->pid = 0; + self->uid = 0; +} + +/* + * TCP Clear r/w variables + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +{ + self->ok = 0; + self->dir = 0; + self->uid = 0; + self->pid = 0; + self->size = 0; + self->name = 0; + self->lport = 0; + self->fport = 0; + self->laddr = 0; + self->faddr = 0; + self->conn_p = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Net/tcpsnoop_snv b/cddl/contrib/dtracetoolkit/Net/tcpsnoop_snv new file mode 100755 index 00000000000..85ebb6c898e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcpsnoop_snv @@ -0,0 +1,583 @@ +#!/usr/bin/ksh +# +# tcpsnoop_snv - snoop TCP network packets by process. +# Written using DTrace (Solaris Nevada) +# +# This analyses TCP network packets and prints the responsible PID and UID, +# plus standard details such as IP address and port. This captures traffic +# of newly created TCP connections that were established while this program +# was running. It can help identify which processes is causing TCP traffic. +# +# WARNING: This script may only work on Solaris Nevada and OpenSolaris +# of the late 2007 vintage, since it uses the fbt provider to trace the raw +# operation of a specific version of the kernel. In the future, a 'stable' +# network provider should exist which will allow this to be written for that +# and subsequent versions of the kernel. In the meantime, check for other +# versions of this script in the /Net directory, and read the +# Notes/ALLfbt_notes.txt for more background on fbt. +# +# $Id: tcpsnoop_snv 69 2007-10-04 13:40:00Z brendan $ +# +# USAGE: tcpsnoop [-a|hjsvZ] [-n name] [-p pid] +# +# -a # print all data +# -j # print project ID +# -s # print time, us +# -v # print time, string +# -Z # print zone ID +# -n name # command name to snoop +# -p pid # PID to snoop +# eg, +# tcpsnoop -v # human readable timestamps +# tcpsnoop -Z # print zonename +# tcpsnoop -n sshd # snoop sshd traffic only +# +# FIELDS: +# UID user ID +# PID process ID +# CMD command +# LADDR local IP address +# RADDR remote IP address +# LPORT local port number +# RPORT remote port number +# DR direction +# SIZE packet size, bytes +# TIME timestamp, us +# STRTIME human readable timestamp, string +# ZONE zone ID +# PROJ project ID +# +# SEE ALSO: snoop -rS +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# TODO: IPv6 +# +# CODE: +# The FILTER syntax matches on packets rather than initial +# connections, so that it can follow inetd connections properly. +# +# 09-Jul-2004 Brendan Gregg Created this. +# 12-Mar-2005 " " Changed probes, size info now printed. +# 02-Jul-2005 " " Many more probes. Renamed "tcpsnoop.d". +# 04-Jul-2005 " " Now wrapped in shell, called "tcpsnoop". +# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct +# execname. Thanks Kias Belgaied for expertise. +# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. +# 20-Apr-2006 " " Last update. +# 30-Sep-2007 " " Bumped this for recent OpenSolaris/Nevada. +# + +############################## +# --- Process Arguments --- +# + +### default variables +opt_name=0; opt_time=0; opt_timestr=0; filter=0; pname=. +opt_zone=0; opt_proj=0; opt_pid=0; pid=0 + +### process options +while getopts ahjsvZn:p: name +do + case $name in + a) opt_time=1; opt_timestr=1; opt_zone=1; opt_proj=1 ;; + n) opt_name=1; pname=$OPTARG ;; + p) opt_pid=1; pid=$OPTARG ;; + j) opt_proj=1 ;; + s) opt_time=1 ;; + v) opt_timestr=1 ;; + Z) opt_zone=1 ;; + h|?) cat <<-END >&2 + USAGE: tcpsnoop [-a|hjsvZ] [-n name] [-p pid] + tcpsnoop # default output + -a # print all data + -j # print project ID + -s # print start time, us + -v # print start time, string + -Z # print zonename + -n name # command name to snoop + -p pid # PID to snoop + eg, + tcpsnoop -v # human readable timestamps + tcpsnoop -Z # print zonename + tcpsnoop -n sshd # snoop sshd traffic only + END + exit 1 + esac +done + +### option logic +if (( opt_name || opt_pid )); then + filter=1 +fi + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -Cs <( print -r ' + /* + * Command line arguments + */ + inline int OPT_name = '$opt_name'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_proj = '$opt_proj'; + inline int PID = '$pid'; + inline int FILTER = '$filter'; + inline string NAME = "'$pname'"; + +#pragma D option quiet +#pragma D option switchrate=10hz + +#include +#include +#include +#include +#include + +/* + * Print header + */ +dtrace:::BEGIN +{ + /* print optional headers */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "STRTIME") : 1; + OPT_zone ? printf("%4s ", "ZONE") : 1; + OPT_proj ? printf("%4s ", "PROJ") : 1; + + /* print main headers */ + printf("%5s %6s %-15s %5s %2s %-15s %5s %5s %s\n", + "UID", "PID", "LADDR", "LPORT", "DR", "RADDR", "RPORT", + "SIZE", "CMD"); +} + + +/* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ +fbt:sockfs:sotpi_accept:entry +/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ +{ + self->sop = args[0]; +} + +fbt:sockfs:sotpi_create:return +/self->sop/ +{ + self->nsop = (struct sonode *)arg1; +} + +fbt:sockfs:sotpi_accept:return +/self->nsop/ +{ + this->tcpp = (tcp_t *)self->nsop->so_priv; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +fbt:sockfs:sotpi_accept:return +{ + self->nsop = 0; + self->sop = 0; +} + +/* + * TCP Process outbound connections + */ +fbt:ip:tcp_connect:entry +{ + this->tcpp = (tcp_t *)arg0; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; + OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1; +} + +/* + * TCP Data translations + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + /* fetch ports */ +#if defined(_BIG_ENDIAN) + self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; + self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; +#else + self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); + self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); +#endif + + /* fetch IPv4 addresses */ + this->fad12 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->fad13 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->fad14 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->fad15 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + this->lad12 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; + this->lad13 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; + this->lad14 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; + this->lad15 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; + + /* convert type for use with lltostr() */ + this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; + this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; + this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; + this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; + this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; + this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; + this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; + this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + /* fix direction and save values */ + tladdr[(int)self->connp] = self->laddr; + tfaddr[(int)self->connp] = self->faddr; + tlport[(int)self->connp] = self->lport; + tfport[(int)self->connp] = self->fport; + + /* all systems go */ + tok[(int)self->connp] = 1; +} + +/* + * TCP Clear connp + */ +fbt:ip:tcp_get_conn:return +{ + /* Q_TO_CONN */ + this->connp = (conn_t *)arg1; + tok[(int)this->connp] = 0; + tpid[(int)this->connp] = 0; + tuid[(int)this->connp] = 0; + tname[(int)this->connp] = 0; + tproj[(int)this->connp] = 0; +} + +/* + * TCP Process "port closed" + */ +fbt:ip:tcp_xmit_early_reset:entry +/FILTER == 0/ +{ + this->queuep = args[7]->tcps_g_q; + this->connp = (conn_t *)this->queuep->q_ptr; + this->tcpp = (tcp_t *)this->connp->conn_tcp; + self->zoneid = this->connp->conn_zoneid; + + /* split addresses */ + this->ipha = (ipha_t *)args[1]->b_rptr; + this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; + this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; + this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; + this->fad12 = (this->ipha->ipha_src & 0x000000ff); + this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; + this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; + this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; + this->lad12 = (this->ipha->ipha_dst & 0x000000ff); + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + self->reset = 1; +} + +/* + * TCP Fetch "port closed" ports + */ +fbt:ip:tcp_xchg:entry +/self->reset/ +{ +#if defined(_BIG_ENDIAN) + self->lport = (uint16_t)arg0; + self->fport = (uint16_t)arg1; +#else + self->lport = BSWAP_16((uint16_t)arg0); + self->fport = BSWAP_16((uint16_t)arg1); +#endif + self->lport = BE16_TO_U16(arg0); + self->fport = BE16_TO_U16(arg1); +} + +/* + * TCP Print "port closed" + */ +fbt:ip:tcp_xmit_early_reset:return +/FILTER == 0/ +{ + self->name = ""; + self->pid = 0; + self->uid = 0; + self->proj = 0; + self->size = 54; /* should check trailers */ + self->dir = "<-"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->reset = 0; + self->size = 0; + self->name = 0; + self->zoneid = 0; +} + +/* + * TCP Process Write + */ +fbt:ip:tcp_send_data:entry +{ + self->conn_p = (conn_t *)args[0]->tcp_connp; +} + +fbt:ip:tcp_send_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "->"; + self->size = msgdsize(args[2]) + 14; /* should check trailers */ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Process Read + */ +fbt:ip:tcp_rput_data:entry +{ + self->conn_p = (conn_t *)arg0; + self->size = msgdsize(args[1]) + 14; /* should check trailers */ +} + +fbt:ip:tcp_rput_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "<-"; + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Complete printing outbound handshake + */ +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54; /* should check trailers */ + self->dir = "->"; +} + +fbt:ip:tcp_connect:return +/(self->connp) && + ((FILTER == 0) || + (OPT_pid && self->pid == PID) || + (OPT_name && self->name == NAME))/ +{ + /* this packet occured before connp was fully established */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Complete printing inbound handshake + */ +fbt:sockfs:sotpi_accept:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54; /* should check trailers */ + self->dir = "<-"; +} + +fbt:sockfs:sotpi_accept:return +/(self->connp) && + ((FILTER == 0) || + (OPT_pid && self->pid == PID) || + (OPT_name && self->name == NAME))/ +{ + /* these packets occured before connp was fully established */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "<-"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * Print output + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +/(self->ok == 2) && + ((FILTER == 0) || + (OPT_pid && self->pid == PID) || + (OPT_name && self->name == NAME))/ +{ + /* print optional fields */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + + /* print output line */ + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Clear connect variables + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->faddr = 0; + self->laddr = 0; + self->fport = 0; + self->lport = 0; + self->connp = 0; + self->name = 0; + self->pid = 0; + self->uid = 0; +} + +/* + * TCP Clear r/w variables + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +{ + self->ok = 0; + self->dir = 0; + self->uid = 0; + self->pid = 0; + self->size = 0; + self->name = 0; + self->lport = 0; + self->fport = 0; + self->laddr = 0; + self->faddr = 0; + self->conn_p = 0; + self->zoneid = 0; + self->proj = 0; +} +') diff --git a/cddl/contrib/dtracetoolkit/Net/tcpsnoop_snv.d b/cddl/contrib/dtracetoolkit/Net/tcpsnoop_snv.d new file mode 100755 index 00000000000..b696f0e4661 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcpsnoop_snv.d @@ -0,0 +1,426 @@ +#!/usr/sbin/dtrace -Cs +/* + * tcpsnoop_snv.d - snoop TCP network packets by process. + * Written using DTrace (Solaris Nevada) + * + * This analyses TCP network packets and prints the responsible PID and UID, + * plus standard details such as IP address and port. This captures traffic + * of newly created TCP connections that were established while this program + * was running. It can help identify which processes is causing TCP traffic. + * + * WARNING: This script may only work on Solaris Nevada and OpenSolaris + * of the late 2007 vintage, since it uses the fbt provider to trace the raw + * operation of a specific version of the kernel. In the future, a 'stable' + * network provider should exist which will allow this to be written for that + * and subsequent versions of the kernel. In the meantime, check for other + * versions of this script in the /Net directory, and read the + * Notes/ALLfbt_notes.txt for more background on fbt. + * + * $Id: tcpsnoop_snv.d 69 2007-10-04 13:40:00Z brendan $ + * + * USAGE: tcpsnoop.d + * + * FIELDS: + * UID user ID + * PID process ID + * CMD command + * LADDR local IP address + * RADDR remote IP address + * LPORT local port number + * RPORT remote port number + * DR direction + * SIZE packet size, bytes + * + * SEE ALSO: snoop -rS + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * Author: Brendan Gregg [Sydney, Australia] + * + * TODO: IPv6 + * + * 09-Jul-2004 Brendan Gregg Created this. + * 12-Mar-2005 " " Changed probes, size info now printed. + * 02-Jul-2005 " " Many more probes. Renamed "tcpsnoop.d". + * 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct + * execname. Thanks Kias Belgaied for expertise. + * 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. + * 20-Apr-2006 " " Last update. + * 30-Sep-2007 " " Bumped this for recent OpenSolaris/Nevada. + */ + +#pragma D option quiet +#pragma D option switchrate=10hz + +#include +#include +#include + +/* + * Print header + */ +dtrace:::BEGIN +{ + /* print main headers */ + printf("%5s %6s %-15s %5s %2s %-15s %5s %5s %s\n", + "UID", "PID", "LADDR", "LPORT", "DR", "RADDR", "RPORT", + "SIZE", "CMD"); +} + +/* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ +fbt:sockfs:sotpi_accept:entry +/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ +{ + self->sop = args[0]; +} + +fbt:sockfs:sotpi_create:return +/self->sop/ +{ + self->nsop = (struct sonode *)arg1; +} + +fbt:sockfs:sotpi_accept:return +/self->nsop/ +{ + this->tcpp = (tcp_t *)self->nsop->so_priv; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +fbt:sockfs:sotpi_accept:return +{ + self->nsop = 0; + self->sop = 0; +} + +/* + * TCP Process outbound connections + */ +fbt:ip:tcp_connect:entry +{ + this->tcpp = (tcp_t *)arg0; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +/* + * TCP Data translations + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + /* fetch ports */ +#if defined(_BIG_ENDIAN) + self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; + self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; +#else + self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); + self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); +#endif + + /* fetch IPv4 addresses */ + this->fad12 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->fad13 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->fad14 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->fad15 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + this->lad12 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; + this->lad13 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; + this->lad14 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; + this->lad15 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; + + /* convert type for use with lltostr() */ + this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; + this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; + this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; + this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; + this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; + this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; + this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; + this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + /* fix direction and save values */ + tladdr[(int)self->connp] = self->laddr; + tfaddr[(int)self->connp] = self->faddr; + tlport[(int)self->connp] = self->lport; + tfport[(int)self->connp] = self->fport; + + /* all systems go */ + tok[(int)self->connp] = 1; +} + +/* + * TCP Clear connp + */ +fbt:ip:tcp_get_conn:return +{ + /* Q_TO_CONN */ + this->connp = (conn_t *)arg1; + tok[(int)this->connp] = 0; + tpid[(int)this->connp] = 0; + tuid[(int)this->connp] = 0; + tname[(int)this->connp] = 0; +} + +/* + * TCP Process "port closed" + */ +fbt:ip:tcp_xmit_early_reset:entry +{ + this->queuep = args[7]->tcps_g_q; + this->connp = (conn_t *)this->queuep->q_ptr; + this->tcpp = (tcp_t *)this->connp->conn_tcp; + + /* split addresses */ + this->ipha = (ipha_t *)args[1]->b_rptr; + this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; + this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; + this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; + this->fad12 = (this->ipha->ipha_src & 0x000000ff); + this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; + this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; + this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; + this->lad12 = (this->ipha->ipha_dst & 0x000000ff); + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + self->reset = 1; +} + +/* + * TCP Fetch "port closed" ports + */ +fbt:ip:tcp_xchg:entry +/self->reset/ +{ +#if defined(_BIG_ENDIAN) + self->lport = (uint16_t)arg0; + self->fport = (uint16_t)arg1; +#else + self->lport = BSWAP_16((uint16_t)arg0); + self->fport = BSWAP_16((uint16_t)arg1); +#endif + self->lport = BE16_TO_U16(arg0); + self->fport = BE16_TO_U16(arg1); +} + +/* + * TCP Print "port closed" + */ +fbt:ip:tcp_xmit_early_reset:return +{ + self->name = ""; + self->pid = 0; + self->uid = 0; + self->size = 54; /* should check trailers */ + self->dir = "<-"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->reset = 0; + self->size = 0; + self->name = 0; +} + +/* + * TCP Process Write + */ +fbt:ip:tcp_send_data:entry +{ + self->conn_p = (conn_t *)args[0]->tcp_connp; +} + +fbt:ip:tcp_send_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "->"; + self->size = msgdsize(args[2]) + 14; /* should check trailers */ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Process Read + */ +fbt:ip:tcp_rput_data:entry +{ + self->conn_p = (conn_t *)arg0; + self->size = msgdsize(args[1]) + 14; /* should check trailers */ +} + +fbt:ip:tcp_rput_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "<-"; + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Complete printing outbound handshake + */ +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->size = 54; /* should check trailers */ + self->dir = "->"; + /* this packet occured before connp was fully established */ + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Complete printing inbound handshake + */ +fbt:sockfs:sotpi_accept:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->size = 54; /* should check trailers */ + /* these packets occured before connp was fully established */ + self->dir = "<-"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "<-"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * Print output + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +/self->ok == 2/ +{ + /* print output line */ + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Clear connect variables + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->faddr = 0; + self->laddr = 0; + self->fport = 0; + self->lport = 0; + self->connp = 0; + self->name = 0; + self->pid = 0; + self->uid = 0; +} + +/* + * TCP Clear r/w variables + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +{ + self->ok = 0; + self->dir = 0; + self->uid = 0; + self->pid = 0; + self->size = 0; + self->name = 0; + self->lport = 0; + self->fport = 0; + self->laddr = 0; + self->faddr = 0; + self->conn_p = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Net/tcpstat.d b/cddl/contrib/dtracetoolkit/Net/tcpstat.d new file mode 100755 index 00000000000..1fe40040c6d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcpstat.d @@ -0,0 +1,91 @@ +#!/usr/sbin/dtrace -s +/* + * tcpstat.d - print TCP statistics. Uses DTrace. + * + * This prints TCP statistics every second, retrieved from the MIB provider. + * + * $Id: tcpstat.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: tcpstat.d + * + * FIELDS: + * TCP_out TCP bytes sent + * TCP_outRe TCP bytes retransmitted + * TCP_in TCP bytes received + * TCP_inDup TCP bytes received duplicated + * TCP_inUn TCP bytes received out of order + * + * The above TCP statistics are documented in the mib2_tcp struct + * in the /usr/include/inet/mib2.h file; and also in the mib provider + * chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223. + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 15-May-2005 Brendan Gregg Created this. + * 15-May-2005 " " Last update. + */ + +#pragma D option quiet + +/* + * Declare Globals + */ +dtrace:::BEGIN +{ + TCP_out = 0; TCP_outRe = 0; + TCP_in = 0; TCP_inDup = 0; TCP_inUn = 0; + LINES = 20; line = 0; +} + +/* + * Print Header + */ +profile:::tick-1sec { line--; } + +profile:::tick-1sec +/line <= 0 / +{ + printf("%11s %11s %11s %11s %11s\n", + "TCP_out", "TCP_outRe", "TCP_in", "TCP_inDup", "TCP_inUn"); + + line = LINES; +} + +/* + * Save Data + */ +mib:::tcpOutDataBytes { TCP_out += arg0; } +mib:::tcpRetransBytes { TCP_outRe += arg0; } +mib:::tcpInDataInorderBytes { TCP_in += arg0; } +mib:::tcpInDataDupBytes { TCP_inDup += arg0; } +mib:::tcpInDataUnorderBytes { TCP_inUn += arg0; } + +/* + * Print Output + */ +profile:::tick-1sec +{ + printf("%11d %11d %11d %11d %11d\n", + TCP_out, TCP_outRe, TCP_in, TCP_inDup, TCP_inUn); + + /* clear values */ + TCP_out = 0; + TCP_outRe = 0; + TCP_in = 0; + TCP_inDup = 0; + TCP_inUn = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Net/tcptop b/cddl/contrib/dtracetoolkit/Net/tcptop new file mode 100755 index 00000000000..70b6e6f3176 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcptop @@ -0,0 +1,579 @@ +#!/usr/bin/ksh +# +# tcptop - display top TCP network packets by process. +# Written using DTrace (Solaris 10 3/05) +# +# This analyses TCP network packets and prints the responsible PID and UID, +# plus standard details such as IP address and port. This captures traffic +# of newly created TCP connections that were established while this program +# was running. It can help identify which processes is causing TCP traffic. +# +# WARNING: This script may only work on Solaris 10 3/05, since it uses the +# fbt provider to trace the raw operation of a specific version of the kernel. +# In the future, a 'stable' network provider should exist which will allow +# this to be written for that and subsequent versions of the kernel. In the +# meantime, check for other versions of this script in the /Net directory, +# and read the Notes/ALLfbt_notes.txt for more background on fbt. +# +# $Id: tcptop 69 2007-10-04 13:40:00Z brendan $ +# +# USAGE: tcptop [-Ch] [-j|-Z] [interval [count]] +# +# -C # don't clear the screen +# -j # print project IDs +# -Z # print zone IDs +# +# FIELDS: +# UID user ID +# PID process ID +# CMD command +# LADDR local IP address +# RADDR remote IP address +# LPORT local port number +# RPORT remote port number +# SIZE packet size, bytes +# load 1 min load average +# TCPin TCP inbound payload data +# TCPout TCP outbound payload data +# ZONE zone ID +# PROJ project ID +# +# SEE ALSO: tcpsnoop +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# ToDo: IPv6 +# +# 05-Jul-2005 Brendan Gregg Created this. +# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct +# execname. Thanks Kias Belgaied for expertise. +# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. +# 20-Apr-2006 " " Last update. +# + +############################## +# --- Process Arguments --- +# + +### default variables +opt_def=1; opt_clear=1; opt_zone=0; opt_proj=0; interval=5; count=-1 + +### process options +while getopts ChjZ name +do + case $name in + C) opt_clear=0 ;; + j) opt_proj=1; opt_def=0 ;; + Z) opt_zone=1; opt_def=0 ;; + h|?) cat <<-END >&2 + USAGE: tcptop [-h] [-j|-Z] [interval [count]] + tcptop # default output + -C # don't clear the screen + -j # print project ID + -Z # print zonename + eg, + tcptop # default is 5 sec interval + tcptop 2 # 2 second interval + tcptop -C 1 10 # 10 x 1 sec samples, no clear + END + exit 1 + esac +done +shift $(( $OPTIND - 1 )) + +### option logic +if [[ "$1" > 0 ]]; then + interval=$1; shift +fi +if [[ "$1" > 0 ]]; then + count=$1; shift +fi +if (( opt_proj && opt_zone )); then + opt_proj=0 +fi +if (( opt_clear )); then + clearstr=`clear` +else + clearstr=. +fi + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -Cs <( print -r ' + /* + * Command line arguments + */ + inline int OPT_def = '$opt_def'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_proj = '$opt_proj'; + inline int OPT_clear = '$opt_clear'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + inline string CLEAR = "'$clearstr'"; + +#pragma D option quiet +#pragma D option switchrate=10hz + +#include +#include +#include +#include +#include + +/* + * Print header + */ +dtrace:::BEGIN +{ + /* starting values */ + counts = COUNTER; + secs = INTERVAL; + TCP_out = 0; + TCP_in = 0; + + printf("Tracing... Please wait.\n"); +} + +/* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ +fbt:sockfs:sotpi_accept:entry +/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ +{ + self->sop = args[0]; +} + +fbt:sockfs:sotpi_create:return +/self->sop/ +{ + self->nsop = (struct sonode *)arg1; +} + +fbt:sockfs:sotpi_accept:return +/self->nsop/ +{ + this->tcpp = (tcp_t *)self->nsop->so_priv; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +fbt:sockfs:sotpi_accept:return +{ + self->nsop = 0; + self->sop = 0; +} + +/* + * TCP Process outbound connections + */ +fbt:ip:tcp_connect:entry +{ + this->tcpp = (tcp_t *)arg0; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; + OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1; +} + +/* + * TCP Data translations + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + /* fetch ports */ +#if defined(_BIG_ENDIAN) + self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; + self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; +#else + self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); + self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); +#endif + + /* fetch IPv4 addresses */ + this->fad12 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->fad13 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->fad14 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->fad15 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + this->lad12 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; + this->lad13 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; + this->lad14 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; + this->lad15 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; + + /* convert type for use with lltostr() */ + this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; + this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; + this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; + this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; + this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; + this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; + this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; + this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + /* fix direction and save values */ + tladdr[(int)self->connp] = self->laddr; + tfaddr[(int)self->connp] = self->faddr; + tlport[(int)self->connp] = self->lport; + tfport[(int)self->connp] = self->fport; + + /* all systems go */ + tok[(int)self->connp] = 1; +} + +/* + * TCP Clear connp + */ +fbt:ip:tcp_get_conn:return +{ + /* Q_TO_CONN */ + this->connp = (conn_t *)arg1; + tok[(int)this->connp] = 0; + tpid[(int)this->connp] = 0; + tuid[(int)this->connp] = 0; + tname[(int)this->connp] = 0; + tproj[(int)this->connp] = 0; +} + +/* + * TCP Process "port closed" + */ +fbt:ip:tcp_xmit_early_reset:entry +{ + this->queuep = (queue_t *)`tcp_g_q; /* ` */ + this->connp = (conn_t *)this->queuep->q_ptr; + this->tcpp = (tcp_t *)this->connp->conn_tcp; + self->zoneid = this->connp->conn_zoneid; + + /* split addresses */ + this->ipha = (ipha_t *)args[1]->b_rptr; + this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; + this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; + this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; + this->fad12 = (this->ipha->ipha_src & 0x000000ff); + this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; + this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; + this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; + this->lad12 = (this->ipha->ipha_dst & 0x000000ff); + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + self->reset = 1; +} + +/* + * TCP Fetch "port closed" ports + */ +fbt:ip:tcp_xchg:entry +/self->reset/ +{ +#if defined(_BIG_ENDIAN) + self->lport = (uint16_t)arg0; + self->fport = (uint16_t)arg1; +#else + self->lport = BSWAP_16((uint16_t)arg0); + self->fport = BSWAP_16((uint16_t)arg1); +#endif + self->lport = BE16_TO_U16(arg0); + self->fport = BE16_TO_U16(arg1); +} + +/* + * TCP Print "port closed" + */ +fbt:ip:tcp_xmit_early_reset:return +{ + self->name = ""; + self->pid = 0; + self->uid = 0; + self->proj = 0; + self->size = 54 * 2; /* should check trailers */ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + self->reset = 0; + self->size = 0; + self->name = 0; +} + +/* + * TCP Process Write + */ +fbt:ip:tcp_send_data:entry +{ + self->conn_p = (conn_t *)args[0]->tcp_connp; +} + +fbt:ip:tcp_send_data:entry +/tok[(int)self->conn_p]/ +{ + self->size = msgdsize(args[2]) + 14; /* should check trailers */ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Process Read + */ +fbt:ip:tcp_rput_data:entry +{ + self->conn_p = (conn_t *)arg0; + self->size = msgdsize(args[1]) + 14; /* should check trailers */ +} + +fbt:ip:tcp_rput_data:entry +/tok[(int)self->conn_p]/ +{ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Complete printing outbound handshake + */ +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54; /* should check trailers */ + + /* this packet occured before connp was fully established */ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; +} + +/* + * TCP Complete printing inbound handshake + */ +fbt:sockfs:sotpi_accept:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54 * 3; /* should check trailers */ + + /* these packets occured before connp was fully established */ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; +} + +/* + * TCP Save data + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +/self->ok == 2/ +{ + /* save r+w data*/ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; +} + +/* + * TCP Clear connect variables + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->faddr = 0; + self->laddr = 0; + self->fport = 0; + self->lport = 0; + self->connp = 0; + self->name = 0; + self->pid = 0; + self->uid = 0; +} + +/* + * TCP Clear r/w variables + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +{ + self->ok = 0; + self->uid = 0; + self->pid = 0; + self->size = 0; + self->name = 0; + self->lport = 0; + self->fport = 0; + self->laddr = 0; + self->faddr = 0; + self->conn_p = 0; + self->zoneid = 0; + self->proj = 0; +} + +/* + * TCP Systemwide Stats + */ +mib:::tcpOutDataBytes { TCP_out += args[0]; } +mib:::tcpRetransBytes { TCP_out += args[0]; } +mib:::tcpInDataInorderBytes { TCP_in += args[0]; } +mib:::tcpInDataDupBytes { TCP_in += args[0]; } +mib:::tcpInDataUnorderBytes { TCP_in += args[0]; } + +/* + * Timer + */ +profile:::tick-1sec +{ + secs--; +} + +/* + * Print Report + */ +profile:::tick-1sec +/secs == 0/ +{ + /* fetch 1 min load average */ + this->load1a = `hp_avenrun[0] / 65536; + this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; + + /* convert TCP counters to Kbytes */ + TCP_out /= 1024; + TCP_in /= 1024; + + /* print status */ + OPT_clear ? printf("%s", CLEAR) : 1; + printf("%Y, load: %d.%02d, TCPin: %6d KB, TCPout: %6d KB\n\n", + walltimestamp, this->load1a, this->load1b, TCP_in, TCP_out); + + /* print headers */ + OPT_def ? printf(" UID ") : 1; + OPT_proj ? printf("PROJ ") : 1; + OPT_zone ? printf("ZONE ") : 1; + printf("%6s %-15s %5s %-15s %5s %9s %s\n", + "PID", "LADDR", "LPORT", "RADDR", "RPORT", "SIZE", "NAME"); + + /* print data */ + printa("%4d %6d %-15s %5d %-15s %5d %@9d %s\n", @out); + printf("\n"); + + /* clear data */ + trunc(@out); + TCP_in = 0; + TCP_out = 0; + secs = INTERVAL; + counts--; +} + +/* + * End of program + */ +profile:::tick-1sec +/counts == 0/ +{ + exit(0); +} + +/* + * Cleanup for Ctrl-C + */ +dtrace:::END +{ + trunc(@out); +} +') diff --git a/cddl/contrib/dtracetoolkit/Net/tcptop_snv b/cddl/contrib/dtracetoolkit/Net/tcptop_snv new file mode 100755 index 00000000000..56714e3c01f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcptop_snv @@ -0,0 +1,581 @@ +#!/usr/bin/ksh +# +# tcptop_snv - display top TCP network packets by process. +# Written using DTrace (Solaris Nevada) +# +# This analyses TCP network packets and prints the responsible PID and UID, +# plus standard details such as IP address and port. This captures traffic +# of newly created TCP connections that were established while this program +# was running. It can help identify which processes is causing TCP traffic. +# +# WARNING: This script may only work on Solaris Nevada and OpenSolaris +# of the late 2007 vintage, since it uses the fbt provider to trace the raw +# operation of a specific version of the kernel. In the future, a 'stable' +# network provider should exist which will allow this to be written for that +# and subsequent versions of the kernel. In the meantime, check for other +# versions of this script in the /Net directory, and read the +# Notes/ALLfbt_notes.txt for more background on fbt. +# +# $Id: tcptop_snv 69 2007-10-04 13:40:00Z brendan $ +# +# USAGE: tcptop [-Ch] [-j|-Z] [interval [count]] +# +# -C # don't clear the screen +# -j # print project IDs +# -Z # print zone IDs +# +# FIELDS: +# UID user ID +# PID process ID +# CMD command +# LADDR local IP address +# RADDR remote IP address +# LPORT local port number +# RPORT remote port number +# SIZE packet size, bytes +# load 1 min load average +# TCPin TCP inbound payload data +# TCPout TCP outbound payload data +# ZONE zone ID +# PROJ project ID +# +# SEE ALSO: tcpsnoop +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# ToDo: IPv6 +# +# 05-Jul-2005 Brendan Gregg Created this. +# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct +# execname. Thanks Kias Belgaied for expertise. +# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. +# 20-Apr-2006 " " Last update. +# 30-Sep-2007 " " Bumped this for recent OpenSolaris/Nevada. +# + +############################## +# --- Process Arguments --- +# + +### default variables +opt_def=1; opt_clear=1; opt_zone=0; opt_proj=0; interval=5; count=-1 + +### process options +while getopts ChjZ name +do + case $name in + C) opt_clear=0 ;; + j) opt_proj=1; opt_def=0 ;; + Z) opt_zone=1; opt_def=0 ;; + h|?) cat <<-END >&2 + USAGE: tcptop [-h] [-j|-Z] [interval [count]] + tcptop # default output + -C # don't clear the screen + -j # print project ID + -Z # print zonename + eg, + tcptop # default is 5 sec interval + tcptop 2 # 2 second interval + tcptop -C 1 10 # 10 x 1 sec samples, no clear + END + exit 1 + esac +done +shift $(( $OPTIND - 1 )) + +### option logic +if [[ "$1" > 0 ]]; then + interval=$1; shift +fi +if [[ "$1" > 0 ]]; then + count=$1; shift +fi +if (( opt_proj && opt_zone )); then + opt_proj=0 +fi +if (( opt_clear )); then + clearstr=`clear` +else + clearstr=. +fi + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -Cs <( print -r ' + /* + * Command line arguments + */ + inline int OPT_def = '$opt_def'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_proj = '$opt_proj'; + inline int OPT_clear = '$opt_clear'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + inline string CLEAR = "'$clearstr'"; + +#pragma D option quiet +#pragma D option switchrate=10hz + +#include +#include +#include +#include +#include + +/* + * Print header + */ +dtrace:::BEGIN +{ + /* starting values */ + counts = COUNTER; + secs = INTERVAL; + TCP_out = 0; + TCP_in = 0; + + printf("Tracing... Please wait.\n"); +} + +/* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ +fbt:sockfs:sotpi_accept:entry +/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ +{ + self->sop = args[0]; +} + +fbt:sockfs:sotpi_create:return +/self->sop/ +{ + self->nsop = (struct sonode *)arg1; +} + +fbt:sockfs:sotpi_accept:return +/self->nsop/ +{ + this->tcpp = (tcp_t *)self->nsop->so_priv; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +fbt:sockfs:sotpi_accept:return +{ + self->nsop = 0; + self->sop = 0; +} + +/* + * TCP Process outbound connections + */ +fbt:ip:tcp_connect:entry +{ + this->tcpp = (tcp_t *)arg0; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; + OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1; +} + +/* + * TCP Data translations + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + /* fetch ports */ +#if defined(_BIG_ENDIAN) + self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; + self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; +#else + self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); + self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); +#endif + + /* fetch IPv4 addresses */ + this->fad12 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->fad13 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->fad14 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->fad15 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + this->lad12 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; + this->lad13 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; + this->lad14 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; + this->lad15 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; + + /* convert type for use with lltostr() */ + this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; + this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; + this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; + this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; + this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; + this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; + this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; + this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + /* fix direction and save values */ + tladdr[(int)self->connp] = self->laddr; + tfaddr[(int)self->connp] = self->faddr; + tlport[(int)self->connp] = self->lport; + tfport[(int)self->connp] = self->fport; + + /* all systems go */ + tok[(int)self->connp] = 1; +} + +/* + * TCP Clear connp + */ +fbt:ip:tcp_get_conn:return +{ + /* Q_TO_CONN */ + this->connp = (conn_t *)arg1; + tok[(int)this->connp] = 0; + tpid[(int)this->connp] = 0; + tuid[(int)this->connp] = 0; + tname[(int)this->connp] = 0; + tproj[(int)this->connp] = 0; +} + +/* + * TCP Process "port closed" + */ +fbt:ip:tcp_xmit_early_reset:entry +{ + this->queuep = args[7]->tcps_g_q; + this->connp = (conn_t *)this->queuep->q_ptr; + this->tcpp = (tcp_t *)this->connp->conn_tcp; + self->zoneid = this->connp->conn_zoneid; + + /* split addresses */ + this->ipha = (ipha_t *)args[1]->b_rptr; + this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; + this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; + this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; + this->fad12 = (this->ipha->ipha_src & 0x000000ff); + this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; + this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; + this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; + this->lad12 = (this->ipha->ipha_dst & 0x000000ff); + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + self->reset = 1; +} + +/* + * TCP Fetch "port closed" ports + */ +fbt:ip:tcp_xchg:entry +/self->reset/ +{ +#if defined(_BIG_ENDIAN) + self->lport = (uint16_t)arg0; + self->fport = (uint16_t)arg1; +#else + self->lport = BSWAP_16((uint16_t)arg0); + self->fport = BSWAP_16((uint16_t)arg1); +#endif + self->lport = BE16_TO_U16(arg0); + self->fport = BE16_TO_U16(arg1); +} + +/* + * TCP Print "port closed" + */ +fbt:ip:tcp_xmit_early_reset:return +{ + self->name = ""; + self->pid = 0; + self->uid = 0; + self->proj = 0; + self->size = 54 * 2; /* should check trailers */ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + self->reset = 0; + self->size = 0; + self->name = 0; +} + +/* + * TCP Process Write + */ +fbt:ip:tcp_send_data:entry +{ + self->conn_p = (conn_t *)args[0]->tcp_connp; +} + +fbt:ip:tcp_send_data:entry +/tok[(int)self->conn_p]/ +{ + self->size = msgdsize(args[2]) + 14; /* should check trailers */ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Process Read + */ +fbt:ip:tcp_rput_data:entry +{ + self->conn_p = (conn_t *)arg0; + self->size = msgdsize(args[1]) + 14; /* should check trailers */ +} + +fbt:ip:tcp_rput_data:entry +/tok[(int)self->conn_p]/ +{ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Complete printing outbound handshake + */ +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54; /* should check trailers */ + + /* this packet occured before connp was fully established */ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; +} + +/* + * TCP Complete printing inbound handshake + */ +fbt:sockfs:sotpi_accept:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54 * 3; /* should check trailers */ + + /* these packets occured before connp was fully established */ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; +} + +/* + * TCP Save data + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +/self->ok == 2/ +{ + /* save r+w data*/ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; +} + +/* + * TCP Clear connect variables + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->faddr = 0; + self->laddr = 0; + self->fport = 0; + self->lport = 0; + self->connp = 0; + self->name = 0; + self->pid = 0; + self->uid = 0; +} + +/* + * TCP Clear r/w variables + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +{ + self->ok = 0; + self->uid = 0; + self->pid = 0; + self->size = 0; + self->name = 0; + self->lport = 0; + self->fport = 0; + self->laddr = 0; + self->faddr = 0; + self->conn_p = 0; + self->zoneid = 0; + self->proj = 0; +} + +/* + * TCP Systemwide Stats + */ +mib:::tcpOutDataBytes { TCP_out += args[0]; } +mib:::tcpRetransBytes { TCP_out += args[0]; } +mib:::tcpInDataInorderBytes { TCP_in += args[0]; } +mib:::tcpInDataDupBytes { TCP_in += args[0]; } +mib:::tcpInDataUnorderBytes { TCP_in += args[0]; } + +/* + * Timer + */ +profile:::tick-1sec +{ + secs--; +} + +/* + * Print Report + */ +profile:::tick-1sec +/secs == 0/ +{ + /* fetch 1 min load average */ + this->load1a = `hp_avenrun[0] / 65536; + this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; + + /* convert TCP counters to Kbytes */ + TCP_out /= 1024; + TCP_in /= 1024; + + /* print status */ + OPT_clear ? printf("%s", CLEAR) : 1; + printf("%Y, load: %d.%02d, TCPin: %6d KB, TCPout: %6d KB\n\n", + walltimestamp, this->load1a, this->load1b, TCP_in, TCP_out); + + /* print headers */ + OPT_def ? printf(" UID ") : 1; + OPT_proj ? printf("PROJ ") : 1; + OPT_zone ? printf("ZONE ") : 1; + printf("%6s %-15s %5s %-15s %5s %9s %s\n", + "PID", "LADDR", "LPORT", "RADDR", "RPORT", "SIZE", "NAME"); + + /* print data */ + printa("%4d %6d %-15s %5d %-15s %5d %@9d %s\n", @out); + printf("\n"); + + /* clear data */ + trunc(@out); + TCP_in = 0; + TCP_out = 0; + secs = INTERVAL; + counts--; +} + +/* + * End of program + */ +profile:::tick-1sec +/counts == 0/ +{ + exit(0); +} + +/* + * Cleanup for Ctrl-C + */ +dtrace:::END +{ + trunc(@out); +} +') diff --git a/cddl/contrib/dtracetoolkit/Net/tcpwdist.d b/cddl/contrib/dtracetoolkit/Net/tcpwdist.d new file mode 100755 index 00000000000..20753c182f6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcpwdist.d @@ -0,0 +1,82 @@ +#!/usr/sbin/dtrace -s +/* + * tcpwdist.d - simple TCP write distribution by process. + * Written in DTrace (Solaris 10 3/05). + * + * This measures the size of writes from applications to the TCP level, which + * may well be much larger than the MTU size (this is application writes not + * packet writes). It can help identify which process is creating network + * traffic, and the size of the writes by that application. It uses a simple + * probe that produces meaningful output for most protocols. + * + * Tracking TCP activity by process is complex for a number of reasons, + * the greatest is that inbound TCP traffic is asynchronous to the process. + * The easiest TCP traffic to match is writes, which this script demonstrates. + * However there are still issues - for an inbound telnet connection the + * writes are associated with the command, for example "ls -l", not something + * meaningful such as "in.telnetd". + * + * Scripts that match TCP traffic properly include tcpsnoop and tcptop. + * + * $Id: tcpwdist.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: tcpwdist.d # wait several seconds, then hit Ctrl-C + * + * FIELDS: + * PID process ID + * CMD command and argument list + * value TCP write payload size in bytes + * count number of writes + * + * SEE ALSO: tcpsnoop, tcptop + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Jul-2004 Brendan Gregg Created this. + * 14-Jun-2005 " " Rewrote this as tcpwdist.d. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +/* + * Print header + */ +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +/* + * Process TCP Write + */ +fbt:ip:tcp_output:entry +{ + /* fetch details */ + this->size = msgdsize(args[1]); + + /* store details */ + @Size[pid, curpsinfo->pr_psargs] = quantize(this->size); +} + +/* + * Print final report + */ +dtrace:::END +{ + printa(" PID: %-6d CMD: %S\n%@d\n", @Size); +} diff --git a/cddl/contrib/dtracetoolkit/Net/udpstat.d b/cddl/contrib/dtracetoolkit/Net/udpstat.d new file mode 100755 index 00000000000..7b27e4ec0b8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/udpstat.d @@ -0,0 +1,92 @@ +#!/usr/sbin/dtrace -s +/* + * udpstat.d - print UDP statistics. Uses DTrace. + * + * This prints UDP statistics every second, retrieved from the MIB provider. + * + * $Id: udpstat.d 59 2007-10-03 08:21:58Z brendan $ + * + * USAGE: udpstat.d + * + * FIELDS: + * UDP_out UDP datagrams sent + * UDP_outErr UDP datagrams errored on send + * UDP_in UDP datagrams received + * UDP_inErr UDP datagrams undeliverable + * UDP_noPort UDP datagrams received to closed ports + * + * The above UDP statistics are documented in the mib2_udp struct + * in the /usr/include/inet/mib2.h file; and also in the mib provider + * chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223. + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 25-Jul-2005 Brendan Gregg Created this. + * 25-Jul-2005 " " Last update. + */ + +#pragma D option quiet + +/* + * Declare Globals + */ +dtrace:::BEGIN +{ + UDP_in = 0; UDP_out = 0; + UDP_inErr = 0; UDP_outErr = 0; UDP_noPort = 0; + LINES = 20; line = 0; +} + +/* + * Print Header + */ +profile:::tick-1sec { line--; } + +profile:::tick-1sec +/line <= 0 / +{ + printf("%11s %11s %11s %11s %11s\n", + "UDP_out", "UDP_outErr", "UDP_in", "UDP_inErr", "UDP_noPort"); + + line = LINES; +} + +/* + * Save Data + */ +mib:::udp*InDatagrams { UDP_in += arg0; } +mib:::udp*OutDatagrams { UDP_out += arg0; } +mib:::udpInErrors { UDP_inErr += arg0; } +mib:::udpInCksumErrs { UDP_inErr += arg0; } +mib:::udpOutErrors { UDP_outErr += arg0; } +mib:::udpNoPorts { UDP_noPort += arg0; } + +/* + * Print Output + */ +profile:::tick-1sec +{ + printf("%11d %11d %11d %11d %11d\n", + UDP_out, UDP_outErr, UDP_in, UDP_inErr, UDP_noPort); + + /* clear values */ + UDP_out = 0; + UDP_outErr = 0; + UDP_in = 0; + UDP_inErr = 0; + UDP_noPort = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLcolors_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLcolors_notes.txt new file mode 100644 index 00000000000..bed6f9509b6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLcolors_notes.txt @@ -0,0 +1,127 @@ +************************************************************************** +* The following are additional notes on all programs that print a colorized +* ("colourised") output, *color*.d. +* +* $Id: ALLcolors_notes.txt 58 2007-10-01 13:36:29Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + +* The colors aren't working, I see rubbish characters + +Try using a terminal that supports colors, such as gnome-terminal or dtterm. + +The following text should test the spectrum of colors for your terminal. +Read this using "more" or "cat" (not "less" or "vim") to check if your +terminal will print colors, and what they will look like: + + Color Test String Dark Background + --------------------------------------------------------- + black color test color test + red color test color test + green color test color test + yellow color test color test + blue color test color test + magenta color test color test + cyan color test color test + white color test color test + +and now for a test of attributes: + + Color Bold Faint + --------------------------------------------------------- + black color test color test + red color test color test + green color test color test + yellow color test color test + blue color test color test + magenta color test color test + cyan color test color test + white color test color test + + +* Why so much green and violet in the toolkit scripts? + +As DTrace can examine the entire software stack, it is conceivable that +your script could print events from many different layers each with their +own color. Color scripts in the DTraceToolkit generally start by tracing +two layers, with extra layers added by the end user as needed (you). The +general plan is: + + Software Layer Example Provider Color + ------------------------------------------------------- + Dynamic Language perl violet + User Library pid:libperl blue + OS Library pid:libc cyan + System Calls syscall green + Kernel and Drivers fbt red + +How these colors will look will depend on your terminal software. Useful +variations can be made, for example using red/bold for kernel abstraction +providers (io, vminfo, ...); and red/faint for raw kernel tracing (fbt). + +The color examples in this toolkit usually trace the syscall and dynamic +language layers, hense the green and violet. + + +* I don't like the choosen terminal colors / your colors suck + +It should be easy to customize them by tweaking the script. I've tried +to use the following convention for declaring colors in D scripts: + + dtrace:::BEGIN + { + color_shell = "\033[2;35m"; /* violet, faint */ + color_line = "\033[1;35m"; /* violet, bold */ + color_syscall = "\033[2;32m"; /* green, faint */ + color_off = "\033[0m"; /* default */ + } + +That way, printf() statements can print these string variables to turn +on and off colors, as needed. These strings contain an escape sequence to +inform your terminal software to change the output color. Customizations +can be made by tweaking the variables; refer to documentation for your +terminal software to see what numbers will print what colors. + +For my terminal (dtterm), the numbers are (from dtterm(5)): + + Attributes + + 1 bold + 2 faint + + Forground colors + + 30 black + 31 red + 32 green + 33 yellow + 34 blue + 35 magenta + 36 cyan + 37 white + + Background colors + + 40 black + 41 red + ... etc, as above + + +* I'd like to use this colored output on a website. + +The easiest way would be to change the script to output HTML rather than +escape sequences. eg: + + dtrace:::BEGIN + { + color_shell = ""; /* violet, faint */ + color_line = ""; /* violet, bold */ + color_syscall = ""; /* green, faint */ + color_off = ""; /* default */ + } + +Other tweaks can be made to either print the output in a
 tagged block;
+or as seperate lines ending in 
along with changing the font to be +fixed width. + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLelapsed_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLelapsed_notes.txt new file mode 100644 index 00000000000..9e8f314feae --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLelapsed_notes.txt @@ -0,0 +1,46 @@ +************************************************************************** +* The following are notes for all scripts that measure elapsed time. +* +* $Id: ALLelapsed_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* What is "elapsed" time? + +Elapsed time is the absolute time from one point to another. This time +includes everything that happened between these points, including +off-CPU time due to other system events such as I/O, scheduling, +interrupts, etc. It also includes the small overheads of DTrace itself. + +Elapsed times are useful for identifying where latencies are, since +regardless of their nature (CPU, I/O, ...), they will be visible in +elapsed time. + +Since elapsed times don't filter out anything, they are suseptible to +"noise" - random system events that are unrelated to the analysis target. +For that reason, it may be best to take several measurements of elapsed +time and take the average (or run your workload several times and let +DTrace take the average). + +See Notes/ALLoncpu_notes.txt for a description of a different time +measurement, "on-CPU" time. + + +* How is "elapsed" time measured? + +In DTrace, the following template provides elapsed time as "this->elapsed", + + + { + self->start = timestamp; + } + + + { + this->elapsed = timestamp - self->start; + self->start = 0; + ... + } + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLexclusive_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLexclusive_notes.txt new file mode 100644 index 00000000000..7aeb9ffde84 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLexclusive_notes.txt @@ -0,0 +1,78 @@ +************************************************************************** +* Notes for all scripts that print exclusive function times (or method, +* or subroutine). +* +* $Id: ALLexclusive_notes.txt 45 2007-09-17 08:54:56Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* What is "exclusive" function time? + +This is the time of function execution, from when the function begins to +when it completes, excluding the time spent executing any child function. + +Exclusive function time can be calculated like this, + + exclusive function time = time(function end) - time(function start) - + time(total child exclusive time) + +To do this, the DTrace script needs to keep trace of child function execution +time, so that it can be subtracted from the parent execution time. + +Consider this Bourne shell program, + 1 #!./sh + 2 + 3 func_c() + 4 { + 5 echo "Function C" + 6 sleep 1 + 7 } + 8 + 9 func_b() + 10 { + 11 echo "Function B" + 12 sleep 1 + 13 func_c + 14 } + 15 + 16 func_a() + 17 { + 18 echo "Function A" + 19 sleep 1 + 20 func_b + 21 } + 22 + 23 func_a + +func_a() calls func_b() which calls func_c(). Tracing the flow using +sh_flowtime.d shows, + +# ./sh_flowtime.d | cat -n + 1 C TIME(us) FILE DELTA(us) -- NAME + 2 0 3052991099265 func_abc.sh 2 -> func_a + 3 0 3052991099324 func_abc.sh 59 > echo + 4 0 3052992111638 func_abc.sh 1012314 | sleep + 5 0 3052992111678 func_abc.sh 39 -> func_b + 6 0 3052992111729 func_abc.sh 51 > echo + 7 0 3052993121633 func_abc.sh 1009903 | sleep + 8 0 3052993121693 func_abc.sh 60 -> func_c + 9 0 3052993121745 func_abc.sh 52 > echo + 10 0 3052994131634 func_abc.sh 1009888 | sleep + 11 0 3052994131685 func_abc.sh 50 <- func_c + 12 0 3052994131699 func_abc.sh 14 <- func_b + 13 0 3052994131707 func_abc.sh 7 <- func_a + +the output of DTrace was piped through "cat -n" to enumerate the lines. + +Exclusive function time for func_a() in the above output would be the +time from line 2 to line 13 minus the time from line 5 to 12 to subtract +the time spent in both func_b() and func_c(). Or, you could say that +exclusive time for func_a() is the time from lines 2 to 4. + +Looking back at the code, exclusive time for func_a() is the time spent +in code lines 18 and 19 (and not line 20). + +See Notes/ALLinclusive_notes.txt for details on "inclusive" function time. + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLfbt_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLfbt_notes.txt new file mode 100644 index 00000000000..ef5f2b8eff3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLfbt_notes.txt @@ -0,0 +1,77 @@ +************************************************************************** +* The following are notes for any script that uses the "fbt" provider. +* To identify these scripts, check the "STABILITY" section of the script's +* man page, or try grepping for "fbt" on the script. +* +* $Id: ALLfbt_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +What is the "fbt" provider?... + +* A DTrace library of probes that instruments raw kernel function calls. +* An "unstable" provider; meaning, scripts written using "fbt" are not + guarenteed to work on future versions of the OS - including after + patching the kernel. + +In a perfect world... + +* None of the DTraceToolkit scripts would use the "fbt" provider; instead + they would all use stable providers such as "proc", "sched", "io", etc. +* All the DTraceToolkit scripts would run on any system that supports DTrace. + +In the real world... + +* Not all stable providers exist yet. Many are in development, such as + stable networking providers. +* In the meantime, useful tools such as "tcpsnoop" and "tcptop" can + only be written using the unstable "fbt" provider (and these scripts have + broken several times due to kernel changes since they were first written). +* "fbt" provider based scripts, + - only run on a particular OS (eg, Solaris) + - may only run on a particular version of an OS (eg, Solaris 10 3/05) + - are likely to break for future OS releases (eg, Solaris 10 6/06) +* "fbt" provider based scripts also make the impossible possible, albiet + in a very unstable way, as a temporary solution while stable providers + are still in development. +* Once stable providers exist, "fbt" scripts can be rewritten to use them; + however these new scripts will only run on newer OS builds that support + the stable providers. (in other words, this won't help you if you remain + on Solaris 10 6/06; you'll need to upgrade, or survive with "fbt"). +* Only some of the DTraceToolkit scripts use "fbt", and only a portion of + those have encountered stability issues - so this issue is limited. + +The "fbt" provider exports raw kernel implementation, which isn't guarenteed +to be stable nor should it ever be (to do so would freeze kernel development +and bug fixes). The only practical solution is the development and +integration of stable providers (although that doesn't help people who keep +running older versions of the OS). + +More harm than good?... + +Is the inclusion of these "fbt" scripts more harm than good? Consider, + +* the good, + - shows what is possible with DTrace + - should help a number of people solve specific performance issues, + on systems where they run + - a customer who really wants these scripts but on an OS version + where they don't work, have at least the source as a starting + point (and in some cases, the fix was trivial) + +* the bad, + - teases and frustrates people who find these scripts don't work + on their OS + +To minimise this issue, only a small number of "fbt" scripts have been +included, and they have been documented (see their man page) as unstable. + +Can I help?... + +If you really like an "fbt" based script and would like to keep using it +in a stable way, it may help to raise that with your vendor (Sun for Solaris, +Apple for MacOS). Sun has OpenSolaris forums, such as dtrace-discuss, which +are read by their engineers and the public. + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLflow_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLflow_notes.txt new file mode 100644 index 00000000000..4571491d467 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLflow_notes.txt @@ -0,0 +1,64 @@ +************************************************************************** +* Notes for all scripts that print a function or method flow. +* +* $Id: ALLflow_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* What is a flow? + +Output that has some meaningful indent, such as function flow indented by +stack depth. eg, + + # ./pl_flow.d + C TIME(us) FILE -- SUB + 0 2963130861619 func_abc.pl -> func_a + 0 2963131870998 func_abc.pl -> func_b + 0 2963132871121 func_abc.pl -> func_c + 0 2963133881150 func_abc.pl <- func_c + 0 2963133881166 func_abc.pl <- func_b + 0 2963133881174 func_abc.pl <- func_a + ^C + + +* The output looks shuffled? + +Eg, + + # ./pl_flow.d + C TIME(us) FILE -- SUB + 0 2963130861619 func_abc.pl -> func_a + 0 2963131870998 func_abc.pl -> func_b + 0 2963132871121 func_abc.pl -> func_c + 0 2963133881166 func_abc.pl <- func_b + 0 2963133881174 func_abc.pl <- func_a + 1 2963133881150 func_abc.pl <- func_c + ^C + +Yes, this is shuffled. DTrace has been designed with a number of important +goals in mind - including minimising the enabled performance overhead. To do +this, per-CPU kernel buffers have been used to collect output, which are +(currently) dumped in sequence by /usr/sbin/dtrace whenever it wakes +up ("switchrate" tunable). So, on multi-CPU servers, there is always the +possibility that any DTrace script can print out-of-order data. + +To deal with this behaviour, the flow scripts may, + +- print a "C" CPU column. If this changes from one line to the next then + the output is probably shuffled around that point. This is why the "C" + column appears in these flow scripts. +- print a "TIME(us)" column. You can eyeball this for shuffles, or just + post sort the dtrace output. + +Now have a closer look at the pl_flow.d output above. The change in C +indicates that a shuffle may have happened, and the out-of-order TIME(us) +shows that it did happen. + +It is possible that DTrace will be enhanced to always sort output before +printing, and this behaviour is no longer an issue. + +See "The output seems shuffled?" in Notes/ALLsnoop_notes.txt for more +notes on this behaviour. + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLinclusive_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLinclusive_notes.txt new file mode 100644 index 00000000000..eea4b5d88d9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLinclusive_notes.txt @@ -0,0 +1,74 @@ +************************************************************************** +* Notes for all scripts that print inclusive function times (or method, +* or subroutine). +* +* $Id: ALLinclusive_notes.txt 45 2007-09-17 08:54:56Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* What is "inclusive" function time? + +This is the time of function execution, from when the function begins to +when it completes. This includes the times from all child functions called. + +Inclusive function time is calculated in a very simple way, + + inclusive function time = time(function end) - time(function start) + +Consider this Bourne shell program, + + 1 #!./sh + 2 + 3 func_c() + 4 { + 5 echo "Function C" + 6 sleep 1 + 7 } + 8 + 9 func_b() + 10 { + 11 echo "Function B" + 12 sleep 1 + 13 func_c + 14 } + 15 + 16 func_a() + 17 { + 18 echo "Function A" + 19 sleep 1 + 20 func_b + 21 } + 22 + 23 func_a + +func_a() calls func_b() which calls func_c(). Tracing the flow using +sh_flowtime.d shows, + +# ./sh_flowtime.d | cat -n + 1 C TIME(us) FILE DELTA(us) -- NAME + 2 0 3052991099265 func_abc.sh 2 -> func_a + 3 0 3052991099324 func_abc.sh 59 > echo + 4 0 3052992111638 func_abc.sh 1012314 | sleep + 5 0 3052992111678 func_abc.sh 39 -> func_b + 6 0 3052992111729 func_abc.sh 51 > echo + 7 0 3052993121633 func_abc.sh 1009903 | sleep + 8 0 3052993121693 func_abc.sh 60 -> func_c + 9 0 3052993121745 func_abc.sh 52 > echo + 10 0 3052994131634 func_abc.sh 1009888 | sleep + 11 0 3052994131685 func_abc.sh 50 <- func_c + 12 0 3052994131699 func_abc.sh 14 <- func_b + 13 0 3052994131707 func_abc.sh 7 <- func_a + +the output of DTrace was piped through "cat -n" to enumerate the lines. + +Inclusive function time for func_a() in the above output would be the +time from line 2 to line 13. This inclusive time includes the time +for both func_b() and func_c(). + +Looking back at the code, inclusive time for func_a() is the time spent +in code lines 18, 19 and 20. + +See Notes/ALLexclusive_notes.txt for details on "exclusive" function time. + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLjava_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLjava_notes.txt new file mode 100644 index 00000000000..2d033c18a82 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLjava_notes.txt @@ -0,0 +1,35 @@ +************************************************************************** +* Notes for all scripts that trace Java using the hotspot provider. +* +* $Id: ALLjava_notes.txt 52 2007-09-24 04:28:01Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + +* I see "drops" + +If you see the following output, + + dtrace: 2547 drops on CPU 0 + +This means that JVM events (usually methods) were executed too quickly for +DTrace to keep up, and as a safety measure DTrace has let events slip by. +This means, at least, that the output is missing lines. At worst, the +output may contain corrupted values (time deltas between events that were +dropped). + +If you see drops, you should first ask yourself whether you need to be +tracing such frequent events at all - is there another way to get the same +data? For example, see the j_profile.d script, which uses a different +technique (sampling) than most of the other Java scripts (tracing). + +You can try tweaking DTrace tunables to prevent DTrace from dropping events. +A key tunable is "bufsize", and can be set in scripts like so, + + #pragma D option bufsize=32m + +That line means that 32 Mbytes will be allocated to the DTrace primary +buffer per-CPU (how depends on bufpolicy). If you have many CPUs, say 8, +then the above line means that 256 Mbytes (32 * 8) will be allocated as a +buffer while your D script is running. + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLoncpu_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLoncpu_notes.txt new file mode 100644 index 00000000000..41aead027bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLoncpu_notes.txt @@ -0,0 +1,42 @@ +************************************************************************** +* The following are notes for all scripts that measure on-CPU times. +* +* $Id: ALLoncpu_notes.txt 58 2007-10-01 13:36:29Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* What is "on-CPU" time? + +This is the time that a thread spent running on a CPU. It does not include +time spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy, +since they measure how much CPU time has been consumed by that thread. + +On-CPU times are also less susceptible to system "noise" than elapsed times, +since much of the noise will be filtered out. DTrace itself also tries +to subtract the small overheads of DTrace from the on-CPU time, to improve +the accuracy of this time. + +See Notes/ALLelapsed_notes.txt for a description of a different time +measurement, "elapsed" time. + + +* How is "on-CPU" time measured? + +In DTrace, the following template provides on-CPU time as "this->oncpu", + + + { + self->vstart = vtimestamp; + } + + + { + this->oncpu = vtimestamp - self->vstart; + self->vstart = 0; + ... + } + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLoverhead.txt b/cddl/contrib/dtracetoolkit/Notes/ALLoverhead.txt new file mode 100644 index 00000000000..844b3c08c1d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLoverhead.txt @@ -0,0 +1,96 @@ +************************************************************************** +* The following are notes regarding the overheads of running DTrace. +* +* $Id: ALLoverhead.txt 58 2007-10-01 13:36:29Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +The following are notes regarding the overheads of running DTrace. + +* What are the overheads of running DTrace? + +Often negligible. + +It depends what the DTrace script does, in particular, the frequency of +events that it is tracing. + +The following tips should explain what the overheads probably are, + +- if your script traces less than 1000 events per second, then the overhead + is probably negligible. ie, less than 0.1% CPU. +- if your script traces more than 100,000 events per second, then the + overhead will start to be significant. If you are tracing kernel events, + then perhaps this could be 10% per CPU. If you are tracing user land + application events, then the overhead can be greater than 30% per CPU. +- if your script produes pages of output, then the CPU cost of drawing + this output to the screen and rendering the fonts is usually far greater + than DTrace itself. Redirect the output of DTrace to a file in /tmp + ("-o" or ">"). +- a ballpark figure for the overhead of a DTrace probe would be 500 ns. + This can be much less (kernel only), or much more (many user to kerel + copyin()s); I've provided it to give you a very rough idea. Of course, + as CPUs become faster, this overhead will become smaller. + +If overheads are a concern - then perform tests to measure their magnitude +for both your workload and the scripts applied, such as benchmarks with +and without DTrace running. Also read the scripts you are using, and +consider how frequent the probes will fire, and if you can customise the +script to reduce the frequency of probes. + +For example, scripts that trace, + + pid$target:::entry, + pid$target:::return + +would usually cause significant performance overhead, since they fire two +probes for every function called (and can easily reach 100,000 per second). +You could reduce this by modifying the script to only trace the libraries +you are interested in. For example, if you were only interested in +libsocket and libnsl, then change the above lines wherever they appeared to, + + pid$target:libsocket::entry, + pid$target:libsocket::return, + pid$target:libnsl::entry, + pid$target:libnsl::return + +and you may notice the overheads are significantly reduced (especially anytime +you drop libc and libdl). To go further, only list functions of interest, + + pid$target:libsocket:connect:entry, + pid$target:libsocket:connect:return, + pid$target:libsocket:listen:entry, + pid$target:libsocket:listen:return, + [...] + +There are additional notes in Docs/Faq about the DTraceToolkit's scripts +and performance overhead. + + +* When are the overheads a problem? + +When they are significant (due to frequent events), and you are tracing +in a production environment that is sensitive to additional CPU load. + +Overheads should be considered if you are measuring times (delta, elapsed, +on-CPU, etc) for performance analysis. In practise, overheads aren't +that much of a problem -- the script will either identify your issues +correctly (great), or not (keep looking). Any it is usually easy to quickly +confirm what DTrace does find by using other tools, or by hacking quick +code changes. You might be using DTrace output that you know has a +significant margin of error - but that becomes moot after you prove that +the performance fix works through benchmarking a quick fix. + +At the end of the day, if DTrace helps find real measurable performance wins +(and it should), then it has been successful. + + +* When are overheads not a problem? + +When the script is not tracing extreamly frequent events. + +Also, when you are in development and tracing events for troubleshooting +purposes (args to functions, for example), DTrace overheads are usually +not an issue at all. + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLperl_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLperl_notes.txt new file mode 100644 index 00000000000..24039504f69 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLperl_notes.txt @@ -0,0 +1,44 @@ +************************************************************************** +* The following are notes for all the Perl tracing scripts, +* +* $Id: ALLperl_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* Where did those "BEGIN" subroutine calls come from? + +The following counts subroutines from the example program, Code/Perl/hello.pl, + + # pl_subcalls.d + Tracing... Hit Ctrl-C to end. + ^C + FILE SUB CALLS + +no subroutines were called, so there is no data to output. + +Now a similar program is traced, Code/Perl/hello_strict.pl, which uses +the "strict" pragma, + + # pl_subcalls.d + Tracing... Hit Ctrl-C to end. + ^C + FILE SUB CALLS + hello_strict.pl BEGIN 1 + strict.pm bits 1 + strict.pm import 1 + +not only were functions from "strict.pm" traced, but a "BEGIN" function +ran from the "hello_strict.pl" program - which doesn't appear to use "BEGIN", + + # cat -n ../Code/Perl/hello_strict.pl + 1 #!./perl -w + 2 + 3 use strict; + 4 + 5 print "Hello World!\n"; + +Perl appears to add a BEGIN block to process the "use" keyword. This makes +some degree of sense. + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLsnoop_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLsnoop_notes.txt new file mode 100644 index 00000000000..b43c70a1aef --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLsnoop_notes.txt @@ -0,0 +1,94 @@ +************************************************************************** +* The following are additional notes on ALL of the *snoop programs (such as +* execsnoop, iosnoop, ..., and dapptrace, dtruss). +* +* $Id: ALLsnoop_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* The output seems shuffled? + +Beware - due to the (current) way DTrace works, on multi-CPU systems there +is no guarentee that if you print traced events the output is in the same +order that the events occured. + +This is because events details are placed in kernel per-CPU buffers, and then +dumped in sequence by the DTrace consumer (/usr/sbin/dtrace) whenever it +wakes up ("switchrate" tunable). The DTrace consumer reads and prints the +buffers one by one, it doesn't combine them and sort them. + +To demonstrate this, + + # dtrace -n 'profile:::profile-3hz { trace(timestamp); }' + dtrace: description 'profile-3hz ' matched 1 probe + CPU ID FUNCTION:NAME + 0 41241 :profile-3hz 1898015274778547 + 0 41241 :profile-3hz 1898015608118262 + 0 41241 :profile-3hz 1898015941430060 + 1 41241 :profile-3hz 1898015275499014 + 1 41241 :profile-3hz 1898015609173485 + 1 41241 :profile-3hz 1898015942505828 + 2 41241 :profile-3hz 1898015275351257 + 2 41241 :profile-3hz 1898015609180861 + 2 41241 :profile-3hz 1898015942512708 + 3 41241 :profile-3hz 1898015274803528 + 3 41241 :profile-3hz 1898015608120522 + 3 41241 :profile-3hz 1898015941449884 + ^C + +If you read the timestamps carefully, you'll see that they aren't quite +in chronological order. If you look at the CPU column while reading the +timestamps, the way DTrace works should become clear. + +Most of the snoop tools have a switchrate of 10hz, so events may be shuffled +within a tenth of a second - not hugely noticable. + +This isn't really a problem anyway. If you must have the output in the correct +order, find the switch that prints timestamps and then sort the output. +As an example, + + # iosnoop -t > out.iosnoop + ^C + # sort -n out.iosnoop + + TIME UID PID D BLOCK SIZE COMM PATHNAME + 183710958520 0 3058 W 10507848 4096 sync /var/log/pool/poold + 183710990358 0 3058 W 6584858 1024 sync /etc/motd + 183711013469 0 3058 W 60655 9216 sync + 183711020149 0 3058 W 60673 1024 sync + +All shell-wrapped scripts should have some way to print timestamps, and +many DTrace-only scripts print timestamps by default. If you find a script +that doesn't print timestamps, it should be trivial for you to add an +extra column. + +To add a microsecond-since-boot time column to a script, try adding this +before every printf() you find, + + printf("%-16d ", timestamp / 1000); + +except for the header line, where you can add this, + + printf("%-16s ", "TIME(us)"); + +Now you will be able to post sort the script output on the TIME(us) column. + +In practise, I find post sorting the output a little annoying at times, +and use a couple of other ways to prevent shuffling from happening in the +first place: + +- offline all CPUs but one when running flow scripts. Naturally, you + probably don't want to do this on production servers, this is a trick + that may be handy for when developing on workstations or laptops. Bear + in mind that if you are trying to DTrace certain issues, such as + multi-thread locking contention, then offlining most CPUs may eliminate + the issue you are trying to observe. +- pbind the target process of interest to a single CPU. Most OSes provide + a way to glue a process to a single CPU; Solaris has both pbind and psrset. + +Another way to solve this problem would be to enhance DTrace to always print +in-order output. Maybe this will be done one day; maybe by the time you +are reading this it has already been done? + diff --git a/cddl/contrib/dtracetoolkit/Notes/Readme b/cddl/contrib/dtracetoolkit/Notes/Readme new file mode 100644 index 00000000000..99a1807e087 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/Readme @@ -0,0 +1,21 @@ +Notes - Discussion about tools and their output + + This directory contains files that provide deeper discussions about + tools and their output. + + Files are either named, + + ALL*_notes.txt - notes that cover a collection of tools + *_notes.txt - notes that cover a specific tool + + These files are exist as an informal place to dump "stuff". This might + range from caveats to bear in mind when interpreting tool output, to + general or bizzare knowledge. Tool documentation is placed in, + + /Man - formal man pages + /Examples - demos and how to read the output + *.d - implementation notes within the code itself + /Notes - everything else + + Many of the scripts and man pages refer to files in this directory. + diff --git a/cddl/contrib/dtracetoolkit/Notes/cputimes_notes.txt b/cddl/contrib/dtracetoolkit/Notes/cputimes_notes.txt new file mode 100644 index 00000000000..cdf7ecdac5a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/cputimes_notes.txt @@ -0,0 +1,138 @@ +************************************************************************** +* The following are additional notes on the cputimes command. +* +* $Id: cputimes_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* How cputimes works + +cputimes measures time consumed by the kernel, idle therads and processes, +by tracking the activity of the schedular. In particular we track on-cpu +and off-cpu events for kernel therads, measuring the timestamps at each event. + + +* Why cputimes? + +If you are interested in how much time processes are consuming, the data +given by "prstat" or "prstat -m" is fine. However there is no easy way to +see kernel consumed time, which is the idea behind cputimes. + + +* What does it mean? + +The output shows categories of threads by the sum of time, in nanoseconds. + +A nanosecond is 10^-9, or 0.000000001 of a second. This program uses +nanoseconds as units, but does not have nanosecond accuracy. It would be +reasonable to assume that this has microsecond accuracy (10^-6), so in +practise ignore the last three digits of the times. + +The sections reported are, + +PROCESSES - the sum of all the process time on the CPU. +KERNEL - the sum of the time spent in the kernel. +IDLE - the time the kernel spent in the idle thread, waiting for some work. + +If your system isn't doing much, then the idle time will be quite large. If +your system is running many applications, then there may be no idle time +at all - instead most of the time appearing under processes. + + +* When is there a problem? + +Expect to see most of the time in processes or idle, depending on how busy +your server is. Seeing a considerable amout of time in kernel would +definately be interesting. + +The kernel generally doesn't use much CPU time, usually less than 5%. +If it were using more, that may indicate heavy activity from an interrupt +thread, or activity caused by DTrace. + +For example, + + # cputimes 1 + 2005 Apr 27 23:49:32, + THREADS TIME (ns) + IDLE 28351679 + KERNEL 436022725 + PROCESS 451304688 + +In this sample the kernel is using a massive amount of the CPUs, around 47%. +This sample was taken during heavy network utilisation, the time consumed +by the TCP/IP and network driver threads (and DTrace). The "intrstat" command +could be used for further analysis of the interrupt threads responsible +for servicing the network interface. + + +* Problems with cputimes + +The way cputimes measures schedular activity turns out to be a lot of work. +There are many scheduling events per second where one thread steps onto a +CPU and another leaves. It turns out that cputimes itself causes some degree +of kernel load. + +Here we run 1 cputimes, + + # cputimes 1 + 2005 May 15 12:00:41, + THREADS TIME (ns) + KERNEL 12621985 + PROCESS 982751579 + 2005 May 15 12:00:42, + THREADS TIME (ns) + KERNEL 12267577 + PROCESS 983513765 + [...] + +Now a second cputimes is run at the same time, + + # cputimes 1 + 2005 May 15 12:02:06, + THREADS TIME (ns) + KERNEL 17366426 + PROCESS 978804165 + 2005 May 15 12:02:07, + THREADS TIME (ns) + KERNEL 17614829 + PROCESS 978671601 + [...] + +And now a third, + + # cputimes 1 + 2005 May 15 12:03:09, + THREADS TIME (ns) + KERNEL 21303089 + PROCESS 974925124 + 2005 May 15 12:03:10, + THREADS TIME (ns) + KERNEL 21222992 + PROCESS 975152727 + [...] + +Each extra cputimes is consuming an extra 4 to 5 ms of the CPU as kernel time. +Around 0.5%. This can be used as an estimate of the kernel load caused by +running cputimes, and a similar strategy could be used to measure the kernel +load of other DTrace scripts. + +However the following CPU characteristics must be taken into consideration, + + # psrinfo -v + Status of virtual processor 0 as of: 05/15/2005 12:06:05 + on-line since 04/30/2005 13:32:32. + The i386 processor operates at 867 MHz, + and has an i387 compatible floating point processor. + +as well as the type of activity that was also running on the system, which +cputimes was monitoring (frequency of scheduling events). + +A system with a slower CPU will use a larger proportion of kernel time to +perform the same tasks. Also, a system that is context switching more +(switching between different processes) is likely to consume more kernel time +as well. + + + diff --git a/cddl/contrib/dtracetoolkit/Notes/dappprof_notes.txt b/cddl/contrib/dtracetoolkit/Notes/dappprof_notes.txt new file mode 100644 index 00000000000..d617f2aeaba --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/dappprof_notes.txt @@ -0,0 +1,14 @@ +************************************************************************** +* The following are extra notes on the dappprof command. +* +* $Id: dappprof_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* Can I trust the elapsed and on-cpu times? + +See the documentation for this point in the dtruss_notes.txt file. + + diff --git a/cddl/contrib/dtracetoolkit/Notes/dapptrace_notes.txt b/cddl/contrib/dtracetoolkit/Notes/dapptrace_notes.txt new file mode 100644 index 00000000000..579c2dfd8c0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/dapptrace_notes.txt @@ -0,0 +1,19 @@ +************************************************************************** +* The following are extra notes on the dapptrace command. +* +* $Id: dapptrace_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* Can I trust the elapsed and on-cpu times? + +See the documentation for this point in the dtruss_notes.txt file. + + + +* The output appears shuffled? + +Read the answer to this in ALLsnoop_notes.txt. + diff --git a/cddl/contrib/dtracetoolkit/Notes/dtruss_notes.txt b/cddl/contrib/dtracetoolkit/Notes/dtruss_notes.txt new file mode 100644 index 00000000000..8ecbecf864b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/dtruss_notes.txt @@ -0,0 +1,97 @@ +************************************************************************** +* The following are additional notes on the dtruss program. +* +* $Id: dtruss_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* Can I trust the elapsed and on-cpu times? + +Firstly, lets see dtruss do something cool, + + # dtruss -eo -n bash + PID/LWP ELAPSD CPU SYSCALL(args) = return + 6215/1: 57 37 write(0x2, "h\0", 0x1) = 1 0 + 6215/1: 357210 45 read(0x0, "e\0", 0x1) = 1 0 + 6215/1: 53 37 write(0x2, "e\0", 0x1) = 1 0 + 6215/1: 359510 46 read(0x0, "l\0", 0x1) = 1 0 + 6215/1: 57 42 write(0x2, "l\0", 0x1) = 1 0 + 6215/1: 166495 47 read(0x0, "l\0", 0x1) = 1 0 + 6215/1: 56 40 write(0x2, "l\0", 0x1) = 1 0 + 6215/1: 346076 44 read(0x0, "o\0", 0x1) = 1 0 + 6215/1: 54 38 write(0x2, "o\0", 0x1) = 1 0 + 6215/1: 349852 45 read(0x0, " \0", 0x1) = 1 0 + 6215/1: 54 39 write(0x2, " \0", 0x1) = 1 0 + +In the above, the slow elapsed times for reads are due to the process context +switching off the CPU while we wait for the next keystroke. For example, +the second line shows an on-CPU time of 45 us and an elapsed time of 357210 us. +In fact, the elapsed times are equal to the inter-keystroke delays. + + +What about the writes? Their elapsed times are longer than the on-CPU times +also. Did we context switch off for them too? ... Lets run a different demo, + + # dtruss -eo date + ELAPSD CPU SYSCALL(args) = return + Mon Jul 25 21:41:40 EST 2005 + 44 23 resolvepath("/usr/bin/date\0", 0x80476CC, 0x3FF) = 13 0 + 10 1 sysconfig(0x6, 0xB25A1, 0xFEC1D444) = 4096 0 + 36 28 resolvepath("/usr/lib/ld.so.1\0", 0x80476CC, 0x3FF) = 12 0 + 18 9 xstat(0x2, 0x8047FEB, 0x8047AF8) = 0 0 + 25 16 open("/var/ld/ld.config\0", 0x0, 0x0) = -1 Err#2 + 27 18 xstat(0x2, 0xD27FBF38, 0x80473B0) = 0 0 + 17 9 resolvepath("/lib/libc.so.1\0", 0x8047438, 0x3FF) = 14 0 + 21 13 open("/lib/libc.so.1\0", 0x0, 0x0) = 3 0 + 30 22 mmap(0x10000, 0x1000, 0x5) = -763559936 0 + 15 6 mmap(0x10000, 0xCE000, 0x0) = -764411904 0 + 24 16 mmap(0xD2700000, 0xB5A45, 0x5) = -764411904 0 + 21 12 mmap(0xD27C6000, 0x5EB3, 0x3) = -763600896 0 + 18 9 mmap(0xD27CC000, 0x15C0, 0x3) = -763576320 0 + 14 5 munmap(0xD27B6000, 0x10000) = 0 0 + 186 176 memcntl(0xD2700000, 0x1B8D8, 0x4) = 0 0 + 17 7 close(0x3) = 0 0 + [...] + +For every syscall, the elapsed time is around 10 us (microseconds) slower +than the on-cpu time. These aren't micro context switches, this is due to +DTrace slowing down the program! The more closely we measure something the +more we effect it. (See Heisenberg's uncertainty principle). + +Ok, so for the above output we can tell that each elapsed time is around 10 us +longer than it should be. That's fine, since it's fairly consistant and not +a huge difference. This is an x86 server with a 867 MHz CPU. + + +Now lets try the same on an Ultra 5 with a 360 MHz CPU, + + # dtruss -eo date + ELAPSD CPU SYSCALL(args) = return + 216 142 resolvepath("/usr/bin/date\0", 0xFFBFF338, 0x3FF) = 13 0 + 234 187 resolvepath("/usr/lib/ld.so.1\0", 0xFFBFF338, 0x3FF) = 12 0 + 113 67 stat("/usr/bin/date\0", 0xFFBFF818, 0xFFBFFFEB) = 0 0 + 136 90 open("/var/ld/ld.config\0", 0x0, 0x0) = -1 Err#2 + 107 61 stat("/opt/onbld/lib/libc.so.1\0", 0xFFBFF330, 0xFFBFF55C) = -1 Err#2 + 98 54 stat("/opt/SUNWspro/lib/libc.so.1\0", 0xFFBFF330, 0xFFBFF55C) = -1 Err#2 + 96 53 stat("/opt/SUNWmlib/lib/libc.so.1\0", 0xFFBFF330, 0xFFBFF55C) = -1 Err#2 + 97 54 stat("/usr/sfw/lib/libc.so.1\0", 0xFFBFF330, 0xFFBFF55C) = -1 Err#2 + 96 53 stat("/lib/libc.so.1\0", 0xFFBFF330, 0xFFBFF55C) = 0 0 + 134 92 resolvepath("/lib/libc.so.1\0", 0xFFBFEF30, 0x3FF) = 14 0 + 109 69 open("/lib/libc.so.1\0", 0x0, 0x0) = 3 0 + 177 132 mmap(0x10000, 0x2000, 0x5) = -12976128 0 + [...] + +Now the time difference is around 40 us, and fairly consistant. + + +This difference is find so long as we bear it in mind. Or, run DTrace +on faster servers where the difference is much less. + + + +* The output appears shuffled? + +Read the answer to this in ALLsnoop_notes.txt. + diff --git a/cddl/contrib/dtracetoolkit/Notes/iosnoop_notes.txt b/cddl/contrib/dtracetoolkit/Notes/iosnoop_notes.txt new file mode 100644 index 00000000000..af3ab9bbbe2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/iosnoop_notes.txt @@ -0,0 +1,99 @@ +************************************************************************** +* The following are additional notes on the iosnoop program. +* +* $Id: iosnoop_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* What does the output represent? + +The output is disk events - I/O operations that cause the disk to physically +read or write data. The output is not application I/O events which may be +absorbed by memory caches - many of which will be. The output really is +physical disk events. + +iosnoop uses probes from the "io" provider - which traces the block device +driver before disk events happen. disk events. The stack goes like this, + + application + | + V + syscall + | + V + vfs + | + V + ufs/zfs/... + | + V + block device driver + | + V + physical device driver + | + V + disk + +Due to caching (after vfs) few events will make it to the disk for iosnoop +to see. If you want to trace all I/O activity, try using syscall provider +based scripts first. + + +* What do the elapsed and delta times mean? + +Glad you asked! + +The times may *not* be as useful as they appear. I should also add that +this quickly becomes a very complex topic, + +There are two different delta times reported. -D prints the +elapsed time from the disk request (strategy) to the disk completion +iodone); -o prints the time for the disk to complete that event +since it's last event (time between iodones, or since idle->strategy). + +The elapsed time is equivalent to the response time from the application +request to the application completion. The delta time resembles the +service time for this request (resembles means it will be generally +correct, but not 100% accurate). The service time is the the time for the +disk to complete the request, after it has travelled through any bus or +queue. + +buuuttt.... you need to think carefully about what these times mean before +jumping to conclusions. For example, + + You troubleshoot an application by running iosnoop and filtering + on your application's PID. You notice large times for the disk events + (responce, service, for this example it doesn't matter). + Does this mean there is a problem with that application? + What could be happening is that a different application is also using + the disks at the same time, and is causing the disk heads to seek to + elsewhere on the disk surface - increasing both service and response time. + +hmmm! so you can't just look at one application, one set of numbers, and +understand fully what is going on. + +But it gets worse. Disks implement "tagged queueing", where events in the +queue are reshuffeled to promote "elevator seeking" of the disk heads (this +reduces head seeking). So the time for a disk event can be effected not +just by the previous event (and previous location the heads had seeked to), +but the surrounding events that enter the queue. + +So the good and the bad. The good news is that iosnoop makes it easy to +fetch disk event data on a live system, the bad news is that understanding +all the data is not really easy. + +For further information on disk measurements see, + + "How do disks really work?" - Adrian Cockcroft, SunWorld Online, June 1996 + "Sun Performance and Tuning" - Adrian Cockcroft, Richard Pettit + "Solaris Internals" - Richard McDougall, Jim Mauro + + + +* The output appears shuffled? + +Read the answer to this in ALLsnoop_notes.txt. + diff --git a/cddl/contrib/dtracetoolkit/Notes/iotop_notes.txt b/cddl/contrib/dtracetoolkit/Notes/iotop_notes.txt new file mode 100644 index 00000000000..9663ec7b549 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/iotop_notes.txt @@ -0,0 +1,48 @@ +************************************************************************** +* The following are additional notes on the iotop program. +* +* $Id: iotop_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* When using -P, how can a process exceed 100% I/O? + +These percentages are based on disk time. They are in terms of a single disk. + +200% could mean 2 disks @ 100%, or 4 @ 50%, or some such combination. + +I could have capped it at 100% by dividing by disk count. I didn't. Disk +utilisation is an asymmetric resource (unlike CPUs, which are (mostly) +symmetric), so it's unfair to divide by all the disks capacity as an +application cannot use every disks capacity (eg, writing to a /opt disk only). + +Would it be wise to report utilisation as 10% of overall capacity, if it +could mean that 1 disk was SATURATED out of ten? A value of 10% could +understate the problem. + +Instead I add the utilisations and don't divide. 1 disk saturated out of 10 +would be reported as 100% utilisation. This has the danger of overstating +the problem (consider all ten disks at 10% utilisation, this would also be +reported as 100%). + +Nothing is perfect when you are summarising to a single value! + + + +* Beware of overcounting metadevices, such as SVM and Veritas. + +The current version of iotop reports on anything the kernel believes to be +a block disk device. A problem happens when a metadevice contains physical +disk devices, and iotop reports on activity to both the metadevice and +the physical devices, which overcounts activity. + +Consider a metadevice that contains two physical disks which are both +running at 100% utilised. iotop -P may report 300% utilisation, which is +200% for the disks + 100% for the metadevice. We'd probably want to see +a value of 200%, not 300%. Eliminating the counting of metadevices in DTrace +isn't easy (without inelegant "hardwiring" of device types), however I do +intend to find a way to fix this in future versions. + + diff --git a/cddl/contrib/dtracetoolkit/Notes/procsystime_notes.txt b/cddl/contrib/dtracetoolkit/Notes/procsystime_notes.txt new file mode 100644 index 00000000000..5e1c52f4e52 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/procsystime_notes.txt @@ -0,0 +1,14 @@ +************************************************************************** +* The following are extra notes on the procsystime command. +* +* $Id: procsystime_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* Can I trust the elapsed and on-cpu times? + +See the documentation for this point in the dtruss_notes.txt file. + + diff --git a/cddl/contrib/dtracetoolkit/Perl/Readme b/cddl/contrib/dtracetoolkit/Perl/Readme new file mode 100644 index 00000000000..36fcab5e523 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/Readme @@ -0,0 +1,38 @@ +Perl - DTracing Perl + + These scripts trace the Perl programming language, and require a version + of Perl to be built with the DTrace probes patch applied. + + The Perl DTrace provider was originally written by Alan Burlison, and + later rewritten by Richard Dawe. These scripts were written and tested + with Richard's patch to perl, which can be found in the comments on + Alan's original blog entry, + + http://blogs.sun.com/alanbur/entry/dtrace_and_perl + + To get this and these scripts working, the rough steps are, + + 1. Download and extract perl 5.8.8 (www.cpan.org) + 2. Download Richard's patch + 3. Apply Richard's patch (gpatch -p1 -i patchfile) + 4. sh Configure + 5. make perldtrace.h + 6. /usr/sbin/dtrace -h -s perldtrace.d -o perldtrace.h + 7. make + + If things go awry, you might find help by asking on the + dtrace-discuss@opensolaris.org mailing list. + + Since the DTrace Perl provider may be developed further, there is a chance + that it has changed slightly by the time you are reading this, causing + these scripts to either break or behave oddly. Firstly, check for newer + versions of the DTraceToolkit; if it hasn't been updated and you need + to use these scripts immediately, then updating them shouldn't take + too long. The following was the state of the provider when these scripts + were written - check for changes and update the scripts accordingly, + + provider perl { + probe sub-entry(subroutine, file, lineno) + probe sub-return(subroutine, file, lineno) + }; + diff --git a/cddl/contrib/dtracetoolkit/Perl/pl_calldist.d b/cddl/contrib/dtracetoolkit/Perl/pl_calldist.d new file mode 100755 index 00000000000..a4bd2da68bb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/pl_calldist.d @@ -0,0 +1,82 @@ +#!/usr/sbin/dtrace -Zs +/* + * pl_calldist.d - measure Perl elapsed times for subroutines. + * Written for the Perl DTrace provider. + * + * $Id: pl_calldist.d 28 2007-09-13 10:49:37Z brendan $ + * + * This traces Perl activity from all programs running on the system with + * Perl provider support. + * + * USAGE: pl_calldist.d # hit Ctrl-C to end + * + * This script prints distribution plots of elapsed time for Perl subroutines. + * Use pl_calltime.d for summary reports. + * + * FIELDS: + * 1 Filename of the Perl program + * 2 Type of call (sub) + * 3 Name of call + * + * Filename and subroutine names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +perl*:::sub-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->sub[self->depth] = timestamp; +} + +perl*:::sub-return +/self->sub[self->depth]/ +{ + this->elapsed_incl = timestamp - self->sub[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->sub[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg1)); + this->name = copyinstr(arg0); + + @types_incl[this->file, "sub", this->name] = + quantize(this->elapsed_incl / 1000); + @types_excl[this->file, "sub", this->name] = + quantize(this->elapsed_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +dtrace:::END +{ + printf("\nExclusive subroutine elapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_excl); + + printf("\nInclusive subroutine elapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Perl/pl_calltime.d b/cddl/contrib/dtracetoolkit/Perl/pl_calltime.d new file mode 100755 index 00000000000..0bf180420dd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/pl_calltime.d @@ -0,0 +1,89 @@ +#!/usr/sbin/dtrace -Zs +/* + * pl_calltime.d - measure Perl elapsed times for subroutines. + * Written for the Perl DTrace provider. + * + * $Id: pl_calltime.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces Perl activity from all programs running on the system with + * Perl provider support. + * + * USAGE: pl_calltime.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Perl program + * TYPE Type of call (sub/total) + * NAME Name of call + * TOTAL Total elapsed time for calls (us) + * + * Filename and subroutine names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +perl*:::sub-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->sub[self->depth] = timestamp; +} + +perl*:::sub-return +/self->sub[self->depth]/ +{ + this->elapsed_incl = timestamp - self->sub[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->sub[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg1)); + this->name = copyinstr(arg0); + + @num[this->file, "sub", this->name] = count(); + @num["-", "total", "-"] = count(); + @types_incl[this->file, "sub", this->name] = sum(this->elapsed_incl); + @types_excl[this->file, "sub", this->name] = sum(this->elapsed_excl); + @types_excl["-", "total", "-"] = sum(this->elapsed_excl); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +dtrace:::END +{ + printf("\nCount,\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-20s %-10s %-32s %@8d\n", @num); + + normalize(@types_excl, 1000); + printf("\nExclusive subroutine elapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_excl); + + normalize(@types_incl, 1000); + printf("\nInclusive subroutine elapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Perl/pl_cpudist.d b/cddl/contrib/dtracetoolkit/Perl/pl_cpudist.d new file mode 100755 index 00000000000..94c421f436c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/pl_cpudist.d @@ -0,0 +1,82 @@ +#!/usr/sbin/dtrace -Zs +/* + * pl_cpudist.d - measure Perl on-CPU times for subroutines. + * Written for the Perl DTrace provider. + * + * $Id: pl_cpudist.d 28 2007-09-13 10:49:37Z brendan $ + * + * This traces Perl activity from all programs running on the system with + * Perl provider support. + * + * USAGE: pl_cpudist.d # hit Ctrl-C to end + * + * This script prints distribution plots of elapsed time for Perl subrotines. + * Use pl_cputime.d for summary reports. + * + * FIELDS: + * 1 Filename of the Perl program + * 2 Type of call (sub) + * 3 Name of call + * + * Filename and subroutine names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +perl*:::sub-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->sub[self->depth] = vtimestamp; +} + +perl*:::sub-return +/self->sub[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->sub[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->sub[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg1)); + this->name = copyinstr(arg0); + + @types_incl[this->file, "sub", this->name] = + quantize(this->oncpu_incl / 1000); + @types_excl[this->file, "sub", this->name] = + quantize(this->oncpu_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +dtrace:::END +{ + printf("\nExclusive subroutine on-CPU times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_excl); + + printf("\nInclusive subroutine on-CPU times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Perl/pl_cputime.d b/cddl/contrib/dtracetoolkit/Perl/pl_cputime.d new file mode 100755 index 00000000000..150f204210a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/pl_cputime.d @@ -0,0 +1,89 @@ +#!/usr/sbin/dtrace -Zs +/* + * pl_cputime.d - measure Perl on-CPU times for subroutines. + * Written for the Perl DTrace provider. + * + * $Id: pl_cputime.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces Perl activity from all programs running on the system with + * Perl provider support. + * + * USAGE: pl_cputime.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Perl program + * TYPE Type of call (sub/total) + * NAME Name of call (subroutine name) + * TOTAL Total on-CPU time for calls (us) + * + * Filename and subroutine names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +perl*:::sub-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->sub[self->depth] = vtimestamp; +} + +perl*:::sub-return +/self->sub[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->sub[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->sub[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg1)); + this->name = copyinstr(arg0); + + @num[this->file, "sub", this->name] = count(); + @num["-", "total", "-"] = count(); + @types_incl[this->file, "sub", this->name] = sum(this->oncpu_incl); + @types_excl[this->file, "sub", this->name] = sum(this->oncpu_excl); + @types_excl["-", "total", "-"] = sum(this->oncpu_excl); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +dtrace:::END +{ + printf("\nCount,\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-20s %-10s %-32s %@8d\n", @num); + + normalize(@types_excl, 1000); + printf("\nExclusive subroutine on-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_excl); + + normalize(@types_incl, 1000); + printf("\nInclusive subroutine on-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Perl/pl_flow.d b/cddl/contrib/dtracetoolkit/Perl/pl_flow.d new file mode 100755 index 00000000000..7948db2bfd3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/pl_flow.d @@ -0,0 +1,70 @@ +#!/usr/sbin/dtrace -Zs +/* + * pl_flow.d - snoop Perl execution showing subroutine flow. + * Written for the Solaris Perl DTrace provider. + * + * $Id: pl_flow.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces Perl activity from all Perl programs on the system + * running with Perl provider support. + * + * USAGE: pl_flow.d # hit Ctrl-C to end + * + * This watches Perl subroutine entries and returns, and indents child + * subroutine calls. + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * FILE Filename that this subroutine belongs to + * SUB Subroutine name + * + * LEGEND: + * -> subroutine entry + * <- subroutine return + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%3s %-16s %-16s -- %s\n", "C", "TIME(us)", "FILE", "SUB"); +} + +perl*:::sub-entry +{ + printf("%3d %-16d %-16s %*s-> %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg1)), self->depth * 2, "", copyinstr(arg0)); + self->depth++; +} + +perl*:::sub-return +{ + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %-16d %-16s %*s<- %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg1)), self->depth * 2, "", copyinstr(arg0)); +} diff --git a/cddl/contrib/dtracetoolkit/Perl/pl_flowinfo.d b/cddl/contrib/dtracetoolkit/Perl/pl_flowinfo.d new file mode 100755 index 00000000000..06769fdb9cd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/pl_flowinfo.d @@ -0,0 +1,86 @@ +#!/usr/sbin/dtrace -Zs +/* + * pl_flowinfo.d - snoop Perl subroutine flow with info using DTrace. + * Written for the Perl DTrace provider. + * + * $Id: pl_flowinfo.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces activity from all Perl programs on the system that are + * running with Perl provider support. + * + * USAGE: pl_flowinfo.d # hit Ctrl-C to end + * + * FIELDS: + * C CPU-id + * PID Process ID + * DELTA(us) Elapsed time from previous line to this line + * FILE Filename of the Perl program + * LINE Line number of filename + * TYPE Type of call (sub) + * SUB Perl subroutine + * + * LEGEND: + * -> subroutine entry + * <- subroutine return + * + * Filename and subroutine names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)", + "FILE", "LINE", "TYPE", "SUB"); +} + +perl*:::sub-entry, +perl*:::sub-return +/self->last == 0/ +{ + self->last = timestamp; +} + +perl*:::sub-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, this->delta, + basename(copyinstr(arg1)), arg2, "sub", self->depth * 2, "", + copyinstr(arg0)); + self->depth++; + self->last = timestamp; +} + +perl*:::sub-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%d %6d %10d %16s:%-4d %-8s %*s<- %s\n", cpu, pid, this->delta, + basename(copyinstr(arg1)), arg2, "sub", self->depth * 2, "", + copyinstr(arg0)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Perl/pl_flowtime.d b/cddl/contrib/dtracetoolkit/Perl/pl_flowtime.d new file mode 100755 index 00000000000..1fa727cec76 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/pl_flowtime.d @@ -0,0 +1,88 @@ +#!/usr/sbin/dtrace -Zs +/* + * pl_flowtime.d - snoop Perl subroutines with flow and delta times. + * Written for the Perl DTrace provider. + * + * $Id: pl_flowtime.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces shell activity from Perl programs on the system that are + * running with Perl provider support. + * + * USAGE: pl_flowtime.d # hit Ctrl-C to end + * + * This watches Perl subroutine entries and returns, and indents child + * subroutine calls. + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * FILE Filename that this subroutine belongs to + * DELTA(us) Elapsed time from previous line to this line + * SUB Perl subroutine name + * + * LEGEND: + * -> method entry + * <- method return + * + * Filename and subroutine names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; +self int last; + +dtrace:::BEGIN +{ + printf("%3s %-16s %-16s %9s -- %s\n", "C", "TIME(us)", "FILE", + "DELTA(us)", "SUB"); +} + +perl*:::sub-entry, +perl*:::sub-return +/self->last == 0/ +{ + self->last = timestamp; +} + +perl*:::sub-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %-16d %-16s %9d %*s-> %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg1)), this->delta, self->depth * 2, "", + copyinstr(arg0)); + self->depth++; + self->last = timestamp; +} + +perl*:::sub-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %-16d %-16s %9d %*s<- %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg1)), this->delta, self->depth * 2, "", + copyinstr(arg0)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Perl/pl_malloc.d b/cddl/contrib/dtracetoolkit/Perl/pl_malloc.d new file mode 100755 index 00000000000..b71e7652d3d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/pl_malloc.d @@ -0,0 +1,81 @@ +#!/usr/sbin/dtrace -Zs +/* + * pl_malloc.d - Perl libc malloc analysis. + * Written for the Perl DTrace provider. + * + * $Id: pl_malloc.d 19 2007-09-12 07:47:59Z brendan $ + * + * This is an expiremental script to identify who is calling malloc() for + * memory allocation, and to print distribution plots of the requested bytes. + * If a malloc() occured while in a Perl subroutine, then that subroutine is + * identified as responsible; else the caller of malloc() is identified as + * responsible - which will be a function from the Perl engine. + * + * USAGE: pl_malloc.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * Filename and subroutine names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +perl$target:::sub-entry +{ + self->file = basename(copyinstr(arg1)); + self->name = copyinstr(arg0); +} + +perl$target:::sub-return +{ + self->file = 0; + self->name = 0; +} + +pid$target:libc:malloc:entry +/self->file != NULL/ +{ + @malloc_sub_size[self->file, self->name] = sum(arg0); + @malloc_sub_dist[self->file, self->name] = quantize(arg0); +} + +pid$target:libc:malloc:entry +/self->name == NULL/ +{ + @malloc_lib_size[usym(ucaller)] = sum(arg0); + @malloc_lib_dist[usym(ucaller)] = quantize(arg0); +} + + +dtrace:::END +{ + printf("\nPerl malloc byte distributions by engine caller,\n\n"); + printa(" %A, total bytes = %@d %@d\n", @malloc_lib_size, + @malloc_lib_dist); + + printf("\nPerl malloc byte distributions by Perl file and "); + printf("subroutine,\n\n"); + printa(" %s, %s, bytes total = %@d %@d\n", @malloc_sub_size, + @malloc_sub_dist); +} diff --git a/cddl/contrib/dtracetoolkit/Perl/pl_subcalls.d b/cddl/contrib/dtracetoolkit/Perl/pl_subcalls.d new file mode 100755 index 00000000000..30d922fc1ad --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/pl_subcalls.d @@ -0,0 +1,55 @@ +#!/usr/sbin/dtrace -Zs +/* + * pl_subcalls.d - measure Perl subroutine calls using DTrace. + * Written for the Perl DTrace provider. + * + * $Id: pl_subcalls.d 25 2007-09-12 09:51:58Z brendan $ + * + * This traces Perl activity from all running programs on the system + * which support the Perl DTrace provider. + * + * USAGE: pl_subcalls.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename that contained the subroutine + * SUB Perl subroutine name + * CALLS Subroutine calls during this sample + * + * Filename and subroutine names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +perl*:::sub-entry +{ + @subs[basename(copyinstr(arg1)), copyinstr(arg0)] = count(); +} + +dtrace:::END +{ + printf(" %-32s %-32s %8s\n", "FILE", "SUB", "CALLS"); + printa(" %-32s %-32s %@8d\n", @subs); +} diff --git a/cddl/contrib/dtracetoolkit/Perl/pl_syscalls.d b/cddl/contrib/dtracetoolkit/Perl/pl_syscalls.d new file mode 100755 index 00000000000..9c5a7651e86 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/pl_syscalls.d @@ -0,0 +1,65 @@ +#!/usr/sbin/dtrace -Zs +/* + * pl_syscalls.d - count Perl subroutine calls and syscalls using DTrace. + * Written for the Perl DTrace provider. + * + * $Id: pl_syscalls.d 25 2007-09-12 09:51:58Z brendan $ + * + * USAGE: pl_syscalls.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Perl program + * TYPE Type of call (sub/syscall) + * NAME Name of call + * COUNT Number of calls during sample + * + * Filename and subroutine names are printed if available. + * The filename for syscalls may be printed as "perl", if the program + * was invoked using the form "perl filename" rather than running the + * program with an interpreter line. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +self string filename; + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +perl$target:::sub-entry +{ + @calls[basename(copyinstr(arg1)), "sub", copyinstr(arg0)] = count(); +} + +syscall:::entry +/pid == $target/ +{ + @calls[basename(execname), "syscall", probefunc] = count(); +} + +dtrace:::END +{ + printf("\nCalls for PID %d,\n\n", $target); + printf(" %-32s %-10s %-22s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-32s %-10s %-22s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Perl/pl_syscolors.d b/cddl/contrib/dtracetoolkit/Perl/pl_syscolors.d new file mode 100755 index 00000000000..ec689f23337 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/pl_syscolors.d @@ -0,0 +1,119 @@ +#!/usr/sbin/dtrace -Zs +/* + * pl_syscolors.d - trace Perl subroutine flow plus syscalls, in color. + * Written for the Perl DTrace provider. + * + * $Id: pl_syscolors.d 27 2007-09-13 09:26:01Z brendan $ + * + * USAGE: pl_syscolors.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * This watches Perl subroutine entries and returns, and indents child + * subroutine calls. + * + * FIELDS: + * C CPU-id + * PID Process ID + * DELTA(us) Elapsed time from previous line to this line + * FILE Filename of the Perl program + * LINE Line number of filename + * TYPE Type of call (sub/syscall) + * NAME Perl subroutine or syscall name + * + * Filename and subroutine names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + /* + * The following are terminal color escape sequences. + * Change them to whatever you prefer, eg HTML font tags. + */ + color_perl = "\033[2;35m"; /* violet, faint */ + color_syscall = "\033[2;32m"; /* green, faint */ + color_off = "\033[0m"; /* default */ + + printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)", + "FILE", "LINE", "TYPE", "NAME"); +} + +perl$target:::sub-entry, +perl$target:::sub-return, +syscall:::entry, +syscall:::return +/self->last == 0 && pid == $target/ +{ + self->last = timestamp; +} + +perl$target:::sub-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_perl, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "sub", + self->depth * 2, "", copyinstr(arg1), color_off); + self->depth++; + self->last = timestamp; +} + +perl$target:::sub-return +{ + this->delta = (timestamp - self->last) / 1000; + this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_perl, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "sub", + self->depth * 2, "", copyinstr(arg1), color_off); + self->last = timestamp; +} + +syscall:::entry +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:- %-8s %*s-> %s%s\n", color_syscall, + cpu, pid, this->delta, "\"", "syscall", self->depth * 2, "", + probefunc, color_off); + self->last = timestamp; +} + +syscall:::return +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_syscall, + cpu, pid, this->delta, "\"", "syscall", self->depth * 2, "", + probefunc, color_off); + self->last = timestamp; +} + +proc:::exit +/pid == $target/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Perl/pl_who.d b/cddl/contrib/dtracetoolkit/Perl/pl_who.d new file mode 100755 index 00000000000..a461311816d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Perl/pl_who.d @@ -0,0 +1,56 @@ +#!/usr/sbin/dtrace -Zs +/* + * pl_who.d - trace Perl subroutine execution by process using DTrace. + * Written for the Perl DTrace provider. + * + * $Id: pl_who.d 25 2007-09-12 09:51:58Z brendan $ + * + * This traces Perl activity from all Perl programs on the system that are + * running with Perl provider support. + * + * USAGE: pl_who.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID of Perl + * UID User ID of the owner + * SUBS Number of subroutine calls + * FILE Pathname of the Perl program + * + * Filenames are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +perl*:::sub-entry +{ + @lines[pid, uid, copyinstr(arg1)] = count(); +} + +dtrace:::END +{ + printf(" %6s %6s %6s %s\n", "PID", "UID", "SUBS", "FILE"); + printa(" %6d %6d %@6d %s\n", @lines); +} diff --git a/cddl/contrib/dtracetoolkit/Php/Readme b/cddl/contrib/dtracetoolkit/Php/Readme new file mode 100644 index 00000000000..5c9101f227d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/Readme @@ -0,0 +1,39 @@ +Php - DTracing PHP + + These scripts trace the PHP programming language, and require the PHP + DTrace extension module to be installed and enabled. + + The PHP DTrace provider was written by Wes Furlong, and is available + for download both as source and in binary form. The easiest instructions + are currently at, + + http://blogs.sun.com/shanti/entry/dtrace_support_for_php + + which were written for Solaris and the coolstack distribution of PHP. + The steps are roughly, + + 1. Download the extension library from the URL above + 2. Copy the library to your php/extensions/* directory + 3. Edit your php.ini and add, + extension="dtrace.so" + + The website with the PHP DTrace provider source is, + + http://pecl.php.net/package/DTrace + + Here you can fetch the source to build the library yourself, especially + if Solaris binaries from the previous URL aren't going to work for you. + + Since the DTrace PHP provider may be developed further, there is a chance + that it has changed slightly by the time you are reading this, causing + these scripts to either break or behave oddly. Firstly, check for newer + versions of the DTraceToolkit; if it hasn't been updated and you need + to use these scripts immediately, then updating them shouldn't take + too long. The following was the state of the provider when these scripts + were written - check for changes and update the scripts accordingly, + + provider php { + probe function-entry(function, file, lineno) + probe function-return(function, file, lineno) + }; + diff --git a/cddl/contrib/dtracetoolkit/Php/php_calldist.d b/cddl/contrib/dtracetoolkit/Php/php_calldist.d new file mode 100755 index 00000000000..7a1b19e3e3f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/php_calldist.d @@ -0,0 +1,83 @@ +#!/usr/sbin/dtrace -Zs +/* + * php_calldist.d - measure PHP elapsed times for functions. + * Written for the PHP DTrace provider. + * + * $Id: php_calldist.d 53 2007-09-24 04:58:38Z brendan $ + * + * This traces PHP activity from all programs running on the system with + * PHP provider support. + * + * USAGE: php_calldist.d # hit Ctrl-C to end + * + * This script prints distribution plots of elapsed time for PHP + * operations. Use php_calltime.d for summary reports. + * + * FIELDS: + * 1 Filename of the PHP program + * 2 Type of call (func) + * 3 Name of call + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +php*:::function-entry +/arg0/ +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = timestamp; +} + +php*:::function-return +/arg0 && self->function[self->depth]/ +{ + this->elapsed_incl = timestamp - self->function[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg1)); + this->name = copyinstr(arg0); + + @types_incl[this->file, "func", this->name] = + quantize(this->elapsed_incl / 1000); + @types_excl[this->file, "func", this->name] = + quantize(this->elapsed_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +dtrace:::END +{ + printf("\nExclusive function elapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_excl); + + printf("\nInclusive function elapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Php/php_calltime.d b/cddl/contrib/dtracetoolkit/Php/php_calltime.d new file mode 100755 index 00000000000..dcb708c7ab9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/php_calltime.d @@ -0,0 +1,90 @@ +#!/usr/sbin/dtrace -Zs +/* + * php_calltime.d - measure PHP elapsed times for functions. + * Written for the PHP DTrace provider. + * + * $Id: php_calltime.d 53 2007-09-24 04:58:38Z brendan $ + * + * This traces PHP activity from all programs running on the system with + * PHP provider support. + * + * USAGE: php_calltime.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the PHP program + * TYPE Type of call (func/total) + * NAME Name of call + * TOTAL Total elapsed time for calls (us) + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +php*:::function-entry +/arg0/ +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = timestamp; +} + +php*:::function-return +/arg0 && self->function[self->depth]/ +{ + this->elapsed_incl = timestamp - self->function[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg1)); + this->name = copyinstr(arg0); + + @num[this->file, "func", this->name] = count(); + @num["-", "total", "-"] = count(); + @types_incl[this->file, "func", this->name] = sum(this->elapsed_incl); + @types_excl[this->file, "func", this->name] = sum(this->elapsed_excl); + @types_excl["-", "total", "-"] = sum(this->elapsed_excl); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +dtrace:::END +{ + printf("\nCount,\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-20s %-10s %-32s %@8d\n", @num); + + normalize(@types_excl, 1000); + printf("\nExclusive function elapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_excl); + + normalize(@types_incl, 1000); + printf("\nInclusive function elapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Php/php_cpudist.d b/cddl/contrib/dtracetoolkit/Php/php_cpudist.d new file mode 100755 index 00000000000..e10566c73cf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/php_cpudist.d @@ -0,0 +1,83 @@ +#!/usr/sbin/dtrace -Zs +/* + * php_cpudist.d - measure PHP on-CPU times for functions. + * Written for the PHP DTrace provider. + * + * $Id: php_cpudist.d 53 2007-09-24 04:58:38Z brendan $ + * + * This traces PHP activity from all programs running on the system with + * PHP provider support. + * + * USAGE: php_cpudist.d # hit Ctrl-C to end + * + * This script prints distribution plots of elapsed time for PHP + * operations. Use php_cputime.d for summary reports. + * + * FIELDS: + * 1 Filename of the PHP program + * 2 Type of call (func) + * 3 Name of call + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +php*:::function-entry +/arg0/ +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = vtimestamp; +} + +php*:::function-return +/arg0 && self->function[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->function[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg1)); + this->name = copyinstr(arg0); + + @types_incl[this->file, "func", this->name] = + quantize(this->oncpu_incl / 1000); + @types_excl[this->file, "func", this->name] = + quantize(this->oncpu_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +dtrace:::END +{ + printf("\nExclusive function on-CPU times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_excl); + + printf("\nInclusive function on-CPU times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Php/php_cputime.d b/cddl/contrib/dtracetoolkit/Php/php_cputime.d new file mode 100755 index 00000000000..856d5516f2f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/php_cputime.d @@ -0,0 +1,90 @@ +#!/usr/sbin/dtrace -Zs +/* + * php_cputime.d - measure PHP on-CPU times for functions. + * Written for the PHP DTrace provider. + * + * $Id: php_cputime.d 53 2007-09-24 04:58:38Z brendan $ + * + * This traces PHP activity from all programs running on the system with + * PHP provider support. + * + * USAGE: php_cputime.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the PHP program + * TYPE Type of call (func/total) + * NAME Name of call (function name) + * TOTAL Total on-CPU time for calls (us) + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +php*:::function-entry +/arg0/ +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = vtimestamp; +} + +php*:::function-return +/arg0 && self->function[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->function[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg1)); + this->name = copyinstr(arg0); + + @num[this->file, "func", this->name] = count(); + @num["-", "total", "-"] = count(); + @types_incl[this->file, "func", this->name] = sum(this->oncpu_incl); + @types_excl[this->file, "func", this->name] = sum(this->oncpu_excl); + @types_excl["-", "total", "-"] = sum(this->oncpu_excl); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +dtrace:::END +{ + printf("\nCount,\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-20s %-10s %-32s %@8d\n", @num); + + normalize(@types_excl, 1000); + printf("\nExclusive function on-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_excl); + + normalize(@types_incl, 1000); + printf("\nInclusive function on-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Php/php_flow.d b/cddl/contrib/dtracetoolkit/Php/php_flow.d new file mode 100755 index 00000000000..49472eacf82 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/php_flow.d @@ -0,0 +1,72 @@ +#!/usr/sbin/dtrace -Zs +/* + * php_flow.d - snoop PHP execution showing function flow. + * Written for the PHP DTrace provider. + * + * $Id: php_flow.d 53 2007-09-24 04:58:38Z brendan $ + * + * This traces PHP activity from all PHP programs on the system + * running with PHP provider support. + * + * USAGE: php_flow.d # hit Ctrl-C to end + * + * This watches PHP function entries and returns, and indents child + * function calls. + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * FILE Filename that this function belongs to + * FUNC Function name + * + * LEGEND: + * -> function entry + * <- function return + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%3s %-16s %-16s -- %s\n", "C", "TIME(us)", "FILE", "FUNC"); +} + +php*:::function-entry +/arg0/ +{ + printf("%3d %-16d %-16s %*s-> %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg1)), self->depth * 2, "", copyinstr(arg0)); + self->depth++; +} + +php*:::function-return +/arg0/ +{ + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %-16d %-16s %*s<- %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg1)), self->depth * 2, "", copyinstr(arg0)); +} diff --git a/cddl/contrib/dtracetoolkit/Php/php_flowinfo.d b/cddl/contrib/dtracetoolkit/Php/php_flowinfo.d new file mode 100755 index 00000000000..e537574920f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/php_flowinfo.d @@ -0,0 +1,88 @@ +#!/usr/sbin/dtrace -Zs +/* + * php_flowinfo.d - snoop PHP function flow with info using DTrace. + * Written for the PHP DTrace provider. + * + * $Id: php_flowinfo.d 53 2007-09-24 04:58:38Z brendan $ + * + * This traces activity from all PHP programs on the system that are + * running with PHP provider support. + * + * USAGE: php_flowinfo.d # hit Ctrl-C to end + * + * FIELDS: + * C CPU-id + * PID Process ID + * DELTA(us) Elapsed time from previous line to this line + * FILE Filename of the PHP program + * LINE Line number of filename + * TYPE Type of call (func) + * FUNC PHP function + * + * LEGEND: + * -> function entry + * <- function return + * + * Filename and function names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%s %6s/%-4s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "TID", + "DELTA(us)", "FILE", "LINE", "TYPE", "FUNC"); +} + +php*:::function-entry, +php*:::function-return +/self->last == 0/ +{ + self->last = timestamp; +} + +php*:::function-entry +/arg0/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%d %6d/%-4d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, tid, + this->delta, basename(copyinstr(arg1)), arg2, "func", + self->depth * 2, "", copyinstr(arg0)); + self->depth++; + self->last = timestamp; +} + +php*:::function-return +/arg0/ +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%d %6d/%-4d %10d %16s:%-4d %-8s %*s<- %s\n", cpu, pid, tid, + this->delta, basename(copyinstr(arg1)), arg2, "func", + self->depth * 2, "", copyinstr(arg0)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Php/php_flowtime.d b/cddl/contrib/dtracetoolkit/Php/php_flowtime.d new file mode 100755 index 00000000000..cadb66ad120 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/php_flowtime.d @@ -0,0 +1,91 @@ +#!/usr/sbin/dtrace -Zs +/* + * php_flowtime.d - snoop PHP functions with flow and delta times. + * Written for the PHP DTrace provider. + * + * $Id: php_flowtime.d 53 2007-09-24 04:58:38Z brendan $ + * + * This traces shell activity from PHP programs on the system that are + * running with PHP provider support. + * + * USAGE: php_flowtime.d # hit Ctrl-C to end + * + * This watches PHP function entries and returns, and indents child + * function calls. + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * FILE Filename that this function belongs to + * DELTA(us) Elapsed time from previous line to this line + * FUNC PHP function name + * + * LEGEND: + * -> function entry + * <- function return + * + * Filename and function names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +self int last; + +dtrace:::BEGIN +{ + printf("%3s %-16s %-16s %9s -- %s\n", "C", "TIME(us)", "FILE", + "DELTA(us)", "FUNC"); +} + +php*:::function-entry, +php*:::function-return +/self->last == 0/ +{ + self->last = timestamp; +} + +php*:::function-entry +/arg0/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %-16d %-16s %9d %*s-> %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg1)), this->delta, self->depth * 2, "", + copyinstr(arg0)); + self->depth++; + self->last = timestamp; +} + +php*:::function-return +/arg0/ +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %-16d %-16s %9d %*s<- %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg1)), this->delta, self->depth * 2, "", + copyinstr(arg0)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Php/php_funccalls.d b/cddl/contrib/dtracetoolkit/Php/php_funccalls.d new file mode 100755 index 00000000000..8a0ddcef43b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/php_funccalls.d @@ -0,0 +1,56 @@ +#!/usr/sbin/dtrace -Zs +/* + * php_funccalls.d - measure PHP function calls using DTrace. + * Written for the PHP DTrace provider. + * + * $Id: php_funccalls.d 53 2007-09-24 04:58:38Z brendan $ + * + * This traces PHP activity from all running programs on the system + * which support the PHP DTrace provider. + * + * USAGE: php_funccalls.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename that contained the function + * FUNC PHP function name + * CALLS Function calls during this sample + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +php*:::function-entry +/arg0/ +{ + @funcs[basename(copyinstr(arg1)), copyinstr(arg0)] = count(); +} + +dtrace:::END +{ + printf(" %-32s %-32s %8s\n", "FILE", "FUNC", "CALLS"); + printa(" %-32s %-32s %@8d\n", @funcs); +} diff --git a/cddl/contrib/dtracetoolkit/Php/php_malloc.d b/cddl/contrib/dtracetoolkit/Php/php_malloc.d new file mode 100755 index 00000000000..1ebab26ac20 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/php_malloc.d @@ -0,0 +1,82 @@ +#!/usr/sbin/dtrace -Zs +/* + * php_malloc.d - PHP libc malloc analysis. + * Written for the PHP DTrace provider. + * + * $Id: php_malloc.d 53 2007-09-24 04:58:38Z brendan $ + * + * This is an expiremental script to identify who is calling malloc() for + * memory allocation, and to print distribution plots of the requested bytes. + * If a malloc() occured while in a PHP function, then that function is + * identified as responsible; else the caller of malloc() is identified as + * responsible - which will be a function from the PHP engine. + * + * USAGE: php_malloc.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +php$target:::function-entry +/arg0/ +{ + self->file = basename(copyinstr(arg1)); + self->name = copyinstr(arg0); +} + +php$target:::function-return +{ + self->file = 0; + self->name = 0; +} + +pid$target:libc:malloc:entry +/self->file != NULL/ +{ + @malloc_func_size[self->file, self->name] = sum(arg1); + @malloc_func_dist[self->file, self->name] = quantize(arg1); +} + +pid$target:libc:malloc:entry +/self->name == NULL/ +{ + @malloc_lib_size[usym(ucaller)] = sum(arg1); + @malloc_lib_dist[usym(ucaller)] = quantize(arg1); +} + + +dtrace:::END +{ + printf("\nPHP malloc byte distributions by engine caller,\n\n"); + printa(" %A, total bytes = %@d %@d\n", @malloc_lib_size, + @malloc_lib_dist); + + printf("\nPHP malloc byte distributions by PHP file and "); + printf("function,\n\n"); + printa(" %s, %s, bytes total = %@d %@d\n", @malloc_func_size, + @malloc_func_dist); +} diff --git a/cddl/contrib/dtracetoolkit/Php/php_syscalls.d b/cddl/contrib/dtracetoolkit/Php/php_syscalls.d new file mode 100755 index 00000000000..7917c24d94e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/php_syscalls.d @@ -0,0 +1,75 @@ +#!/usr/sbin/dtrace -Zs +/* + * php_syscalls.d - count PHP function calls and syscalls using DTrace. + * Written for the PHP DTrace provider. + * + * This traces syscalls that occured during a PHP function call. + * + * $Id: php_syscalls.d 53 2007-09-24 04:58:38Z brendan $ + * + * USAGE: php_syscalls.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * FILE Filename of the PHP program + * TYPE Type of call (func/syscall) + * NAME Name of call + * COUNT Number of calls during sample + * + * Filename and function names are printed if available. + * The filename for syscalls may be printed as "php", if the program + * was invoked using the form "php filename" rather than running the + * program with an interpreter line. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +php*:::function-entry +/arg0/ +{ + @calls[pid, basename(copyinstr(arg1)), "func", copyinstr(arg0)] = + count(); + self->php++; +} + +php*:::function-return +/arg0/ +{ + self->php -= self->php == 0 ? 0 : 1; +} + +syscall:::entry +/self->php > 0/ +{ + @calls[pid, basename(execname), "syscall", probefunc] = count(); +} + +dtrace:::END +{ + printf(" %-6s %-26s %-10s %-22s %8s\n", "PID", "FILE", "TYPE", "NAME", + "COUNT"); + printa(" %-6d %-26s %-10s %-22s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Php/php_syscolors.d b/cddl/contrib/dtracetoolkit/Php/php_syscolors.d new file mode 100755 index 00000000000..ff5e9c95790 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/php_syscolors.d @@ -0,0 +1,116 @@ +#!/usr/sbin/dtrace -Zs +/* + * php_syscolors.d - trace PHP function flow plus syscalls, in color. + * Written for the PHP DTrace provider. + * + * $Id: php_syscolors.d 53 2007-09-24 04:58:38Z brendan $ + * + * USAGE: php_syscolors.d # hit Ctrl-C to end + * + * This watches PHP function entries and returns, and indents child + * function calls. + * + * FIELDS: + * C CPU-id + * PID Process ID + * DELTA(us) Elapsed time from previous line to this line + * FILE Filename of the PHP program + * LINE Line number of filename + * TYPE Type of call (func/syscall) + * NAME PHP function or syscall name + * + * Filename and function names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + color_php = "\033[2;35m"; /* violet, faint */ + color_syscall = "\033[2;32m"; /* green, faint */ + color_off = "\033[0m"; /* default */ + + self->depth = 0; + printf("%s %6s/%-4s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "TID", + "DELTA(us)", "FILE", "LINE", "TYPE", "NAME"); +} + +php*:::function-entry, +php*:::function-return +/self->last == 0/ +{ + self->last = timestamp; +} + +php*:::function-entry +/arg0/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d/%-4d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_php, + cpu, pid, tid, this->delta, basename(copyinstr(arg1)), arg2, "func", + self->depth * 2, "", copyinstr(arg0), color_off); + self->depth++; + self->last = timestamp; +} + +php*:::function-return +/arg0/ +{ + this->delta = (timestamp - self->last) / 1000; + this->name = strjoin(strjoin(copyinstr(arg1), "::"), copyinstr(arg0)); + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%d %6d/%-4d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_php, + cpu, pid, tid, this->delta, basename(copyinstr(arg1)), arg2, "func", + self->depth * 2, "", copyinstr(arg0), color_off); + self->last = timestamp; +} + +syscall:::entry +/self->last/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d/%-4d %10d %16s:- %-8s %*s-> %s%s\n", color_syscall, + cpu, pid, tid, this->delta, "\"", "syscall", self->depth * 2, "", + probefunc, color_off); + self->last = timestamp; +} + +syscall:::return +/self->last/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d/%-4d %10d %16s:- %-8s %*s<- %s%s\n", color_syscall, + cpu, pid, tid, this->delta, "\"", "syscall", self->depth * 2, "", + probefunc, color_off); + self->last = timestamp; +} + +proc:::exit +/pid == $target/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Php/php_who.d b/cddl/contrib/dtracetoolkit/Php/php_who.d new file mode 100755 index 00000000000..2ebb4b425f2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Php/php_who.d @@ -0,0 +1,56 @@ +#!/usr/sbin/dtrace -Zs +/* + * php_who.d - trace PHP function execution by process using DTrace. + * Written for the PHP DTrace provider. + * + * $Id: php_who.d 51 2007-09-24 00:55:23Z brendan $ + * + * This traces PHP activity from all PHP programs on the system that are + * running with PHP provider support. + * + * USAGE: php_who.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID of PHP + * UID User ID of the owner + * FUNCS Number of function calls + * FILE Pathname of the PHP program + * + * Filenames are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +php*:::function-entry +{ + @lines[pid, uid, copyinstr(arg1)] = count(); +} + +dtrace:::END +{ + printf(" %6s %6s %6s %s\n", "PID", "UID", "FUNCS", "FILE"); + printa(" %6d %6d %@6d %s\n", @lines); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/Readme b/cddl/contrib/dtracetoolkit/Proc/Readme new file mode 100644 index 00000000000..acc36344627 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/Readme @@ -0,0 +1,3 @@ +Proc - Process based analysis + + This would include activity by PID, and syscall analysis. diff --git a/cddl/contrib/dtracetoolkit/Proc/crash.d b/cddl/contrib/dtracetoolkit/Proc/crash.d new file mode 100755 index 00000000000..c1ed397a2a1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/crash.d @@ -0,0 +1,181 @@ +#!/usr/sbin/dtrace -Cs +/* + * crash.d - Crashed Application info. + * Written in DTrace (Solaris 10 3/05). + * + * $Id: crash.d 3 2007-08-01 10:50:08Z brendan $ + * + * When applications crash via a SIGSEGV or SIGBUS, a report of the + * process state is printed out. + * + * USAGE: crash.d + * + * FIELDS: + * Type Signal type + * Program Execname of process + * Agrs Argument listing of process + * PID Process ID + * TID Thread ID + * LWPs Number of Light Weight Processes + * PPID Parent Process ID + * UID User ID + * GID Group ID + * TaskID Task ID + * ProjID Project ID + * PoolID Pool ID + * ZoneID Zone ID + * zone Zone name + * CWD Current working directory + * errno Error number of last syscall + * + * SEE ALSO: mdb, pstack, coreadm + * app_crash.d - Greg Nakhimovsky & Morgan Herrington + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 29-May-2005 Brendan Gregg Created this. + * 24-Apr-2006 " " Last update. + */ + +#pragma D option quiet +#pragma D option destructive + +dtrace:::BEGIN +{ + printf("Waiting for crashing applications...\n"); +} + +/* + * Print Report Header + */ +proc:::signal-send +/(args[2] == SIGBUS || args[2] == SIGSEGV) && pid == args[1]->pr_pid/ +{ + stop(); + self->elapsed = timestamp - curthread->t_procp->p_mstart; + self->crash = 1; + + printf("\n-----------------------------------------------------\n"); + printf("CRASH DETECTED at %Y\n", walltimestamp); + printf("-----------------------------------------------------\n"); + printf("Type: %s\n", args[2] == SIGBUS ? "SIGBUS" : "SIGSEGV"); + printf("Program: %s\n", execname); + printf("Args: %S\n", curpsinfo->pr_psargs); + printf("PID: %d\n", pid); + printf("TID: %d\n", tid); + printf("LWPs: %d\n", curthread->t_procp->p_lwpcnt); + printf("PPID: %d\n", ppid); + printf("UID: %d\n", uid); + printf("GID: %d\n", gid); + printf("TaskID: %d\n", curpsinfo->pr_taskid); + printf("ProjID: %d\n", curpsinfo->pr_projid); + printf("PoolID: %d\n", curpsinfo->pr_poolid); + printf("ZoneID: %d\n", curpsinfo->pr_zoneid); + printf("zone: %s\n", zonename); + printf("CWD: %s\n", cwd); + printf("errno: %d\n", errno); + + printf("\nUser Stack Backtrace,"); + ustack(); + + printf("\nKernel Stack Backtrace,"); + stack(); +} + +/* + * Print Java Details + */ +proc:::signal-send +/self->crash && execname == "java"/ +{ + printf("\nJava Stack Backtrace,"); + jstack(); +} + +/* + * Print Ancestors + */ +proc:::signal-send +/self->crash/ +{ + printf("\nAnsestors,\n"); + self->level = 1; + self->procp = curthread->t_procp; + self->ptr = self->procp; +} + +/* ancestory un-rolled loop, reverse order, 6 deep */ +proc:::signal-send /self->crash && self->ptr != 0/ +{ + printf("%*s %d %S\n", self->level += 2, "", + self->ptr->p_pidp->pid_id, self->ptr->p_user.u_psargs); + self->ptr = self->ptr->p_parent; +} +proc:::signal-send /self->crash && self->ptr != 0/ +{ + printf("%*s %d %S\n", self->level += 2, "", + self->ptr->p_pidp->pid_id, self->ptr->p_user.u_psargs); + self->ptr = self->ptr->p_parent; +} +proc:::signal-send /self->crash && self->ptr != 0/ +{ + printf("%*s %d %S\n", self->level += 2, "", + self->ptr->p_pidp->pid_id, self->ptr->p_user.u_psargs); + self->ptr = self->ptr->p_parent; +} +proc:::signal-send /self->crash && self->ptr != 0/ +{ + printf("%*s %d %S\n", self->level += 2, "", + self->ptr->p_pidp->pid_id, self->ptr->p_user.u_psargs); + self->ptr = self->ptr->p_parent; +} +proc:::signal-send /self->crash && self->ptr != 0/ +{ + printf("%*s %d %S\n", self->level += 2, "", + self->ptr->p_pidp->pid_id, self->ptr->p_user.u_psargs); + self->ptr = self->ptr->p_parent; +} +proc:::signal-send /self->crash && self->ptr != 0/ +{ + printf("%*s %d %S\n", self->level += 2, "", + self->ptr->p_pidp->pid_id, self->ptr->p_user.u_psargs); + self->ptr = self->ptr->p_parent; +} + +/* + * Print Report Footer + */ +proc:::signal-send +/self->crash/ +{ + + printf("\nTimes,\n"); + printf(" User: %d ticks\n", self->procp->p_utime); + printf(" Sys: %d ticks\n", self->procp->p_stime); + printf(" Elapsed: %d ms\n", self->elapsed/1000000); + + printf("\nSizes,\n"); + printf(" Heap: %d bytes\n", self->procp->p_brksize); + printf(" Stack: %d bytes\n", self->procp->p_stksize); + + self->ptr = 0; + self->procp = 0; + self->crash = 0; + self->level = 0; + self->elapsed = 0; + system("/usr/bin/prun %d", pid); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/creatbyproc.d b/cddl/contrib/dtracetoolkit/Proc/creatbyproc.d new file mode 100755 index 00000000000..23e1f545948 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/creatbyproc.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * creatbyproc.d - file creat()s by process name. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: creatbyproc.d 3 2007-08-01 10:50:08Z brendan $ + */ + +syscall::creat*:entry { printf("%s %s", execname, copyinstr(arg0)); } diff --git a/cddl/contrib/dtracetoolkit/Proc/dappprof b/cddl/contrib/dtracetoolkit/Proc/dappprof new file mode 100755 index 00000000000..5aed3cb0312 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/dappprof @@ -0,0 +1,239 @@ +#!/usr/bin/sh +# +# dappprof - profile user and library function usage. +# Written using DTrace (Solaris 10 3/05). +# +# The default output traces user functions as they are called. Options +# can be used to examine libraries and timestamps. +# +# $Id: dappprof 65 2007-10-04 11:09:40Z brendan $ +# +# USAGE: dappprof [-acehoTU] [-u lib] { -p PID | command } +# +# -p PID # examine this PID +# -a # print all details +# -c # print call counts +# -e # print elapsed times (us) +# -o # print on cpu times (us) +# -T # print totals +# -u lib # trace this library instead +# -U # trace all libraries + user functions +# -b bufsize # dynamic variable buf size (default is "4m") +# eg, +# dappprof df -h # run and examine the "df -h" command +# dappprof -p 1871 # examine PID 1871 +# +# The elapsed times are interesting, to help identify calls that take +# some time to complete (during which the process may have context +# switched off the CPU). +# +# SEE ALSO: dapptrace # DTraceToolkit +# dtruss # DTraceToolkit +# apptrace +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 16-May-2005 Brendan Gregg Created this. +# 17-Jul-2005 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### Default variables +opt_totals=0; opt_pid=0; pid=0; opt_lib=0; lib="" +opt_elapsed=0; opt_cpu=0; opt_counts=0; opt_liball=0 +opt_command=0; command=""; opt_buf=0; buf="4m" + +### Process options +while getopts ab:cehop:Tu:U name +do + case $name in + a) opt_liball=1; opt_counts=1; opt_elapsed=1; opt_cpu=1 + opt_totals=1 ;; + b) opt_buf=1; buf=$OPTARG ;; + p) opt_pid=1; pid=$OPTARG ;; + u) opt_lib=1; lib=$OPTARG ;; + U) opt_liball=1 ;; + c) opt_counts=1 ;; + e) opt_elapsed=1 ;; + o) opt_cpu=1 ;; + T) opt_totals=1 ;; + h|?) cat <<-END >&2 + USAGE: dappprof [-cehoTU] [-u lib] { -p PID | command } + + -p PID # examine this PID + -a # print all details + -c # print syscall counts + -e # print elapsed times (us) + -o # print on cpu times + -T # print totals + -u lib # trace this library instead + -U # trace all libraries + user funcs + -b bufsize # dynamic variable buf size + eg, + dappprof df -h # run and examine "df -h" + dappprof -p 1871 # examine PID 1871 + dappprof -ap 1871 # print all data + END + exit 1 + esac +done +shift `expr $OPTIND - 1` + +### Option logic +if [ $opt_pid -eq 0 ]; then + opt_command=1 + if [ "$*" = "" ]; then + $0 -h + exit + fi + command="$*" +fi +if [ $opt_elapsed -eq 0 -a $opt_cpu -eq 0 -a $opt_counts -eq 0 ]; then + opt_elapsed=1; +fi + + +### Probe logic +if [ $opt_liball -eq 1 ]; then + probe_entry='pid$target:::entry' + probe_return='pid$target:::return' +elif [ $opt_lib -eq 1 ]; then + probe_entry='pid$target:'$lib'::entry' + probe_return='pid$target:'$lib'::return' +else + probe_entry='pid$target:a.out::entry' + probe_return='pid$target:a.out::return' +fi + +################################# +# --- Main Program, DTrace --- +# + +### Define D Script +dtrace=' + #pragma D option quiet + + /* + * Command line arguments + */ + inline int OPT_command = '$opt_command'; + inline int OPT_liball = '$opt_liball'; + inline int OPT_elapsed = '$opt_elapsed'; + inline int OPT_cpu = '$opt_cpu'; + inline int OPT_counts = '$opt_counts'; + inline int OPT_totals = '$opt_totals'; + inline int OPT_pid = '$opt_pid'; + inline int PID = '$pid'; + inline string NAME = "'$pname'"; + + dtrace:::BEGIN + /! OPT_command/ + { + printf("Tracing... Hit Ctrl-C to end...\n"); + } + + /* + * Save syscall entry info + */ + '$probe_entry' + { + /* set function depth */ + this->fdepth = ++fdepth[probefunc]; + + /* set start details */ + self->start[probefunc,this->fdepth] = timestamp; + self->vstart[probefunc,this->fdepth] = vtimestamp; + + /* count occurances */ + OPT_counts && OPT_liball ? @Counts[probemod,probefunc] = count() : 1; + OPT_counts && ! OPT_liball ? @Counts[probefunc] = count() : 1; + OPT_counts && OPT_totals && OPT_liball ? + @Counts["TOTAL:",""] = count() : 1; + OPT_counts && OPT_totals && ! OPT_liball ? + @Counts["TOTAL:"] = count() : 1; + } + + /* + * Print return data + */ + /* print 3 arg output - default */ + '$probe_return' + /self->start[probefunc,fdepth[probefunc]]/ + { + /* fetch function depth */ + this->fdepth = fdepth[probefunc]; + + /* calculate elapsed time */ + this->elapsed = timestamp - self->start[probefunc,this->fdepth]; + self->start[probefunc,this->fdepth] = 0; + this->cpu = vtimestamp - self->vstart[probefunc,this->fdepth]; + self->vstart[probefunc,this->fdepth] = 0; + + /* save elapsed times */ + OPT_elapsed && OPT_liball ? + @Elapsed[probemod,probefunc] = sum(this->elapsed) : 1; + OPT_elapsed && ! OPT_liball ? + @Elapsed[probefunc] = sum(this->elapsed) : 1; + OPT_elapsed && OPT_totals && OPT_liball ? + @Elapsed["TOTAL:",""] = sum(this->elapsed) : 1; + OPT_elapsed && OPT_totals && ! OPT_liball ? + @Elapsed["TOTAL:"] = sum(this->elapsed) : 1; + + /* save cpu times */ + OPT_cpu && OPT_liball ? @CPU[probemod,probefunc] = sum(this->cpu) : 1; + OPT_cpu && ! OPT_liball ? @CPU[probefunc] = sum(this->cpu) : 1; + OPT_cpu && OPT_totals && OPT_liball ? + @CPU["TOTAL:",""] = sum(this->cpu) : 1; + OPT_cpu && OPT_totals && ! OPT_liball ? + @CPU["TOTAL:"] = sum(this->cpu) : 1; + + } + + /* print counts */ + dtrace:::END + { + /* print counts */ + OPT_counts ? printf("\n%-49s %16s\n","CALL","COUNT") : 1; + OPT_counts && OPT_liball ? printa("%-16s %-32s %@16d\n",@Counts) : 1; + OPT_counts && ! OPT_liball ? printa("%-49s %@16d\n",@Counts) : 1; + + /* print elapsed times */ + OPT_elapsed ? printf("\n%-49s %16s\n","CALL","ELAPSED") : 1; + OPT_elapsed && OPT_liball ? printa("%-16s %-32s %@16d\n",@Elapsed) : 1; + OPT_elapsed && ! OPT_liball ? printa("%-49s %@16d\n",@Elapsed) : 1; + + /* print cpu times */ + OPT_cpu ? printf("\n%-49s %16s\n","CALL","CPU") : 1; + OPT_cpu && OPT_liball ? printa("%-16s %-32s %@16d\n",@CPU) : 1; + OPT_cpu && ! OPT_liball ? printa("%-49s %@16d\n",@CPU) : 1; + } +' + +### Run DTrace +if [ $opt_command -eq 1 ]; then + /usr/sbin/dtrace -x dynvarsize=$buf -x evaltime=exec -n "$dtrace" \ + -c "$command" >&2 +else + /usr/sbin/dtrace -x dynvarsize=$buf -n "$dtrace" -p "$pid" >&2 +fi + diff --git a/cddl/contrib/dtracetoolkit/Proc/dapptrace b/cddl/contrib/dtracetoolkit/Proc/dapptrace new file mode 100755 index 00000000000..7dece4ea099 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/dapptrace @@ -0,0 +1,259 @@ +#!/usr/bin/sh +# +# dapptrace - trace user and library function usage. +# Written using DTrace (Solaris 10 3/05). +# +# The default output traces user functions as they are called. Options +# can be used to examine libraries and timestamps. +# +# $Id: dapptrace 65 2007-10-04 11:09:40Z brendan $ +# +# USAGE: dapptrace [-acdeFlhoU] [-u lib] { -p PID | command } +# +# -p PID # examine this PID +# -a # print all details +# -c # print call counts +# -d # print relative timestamps (us) +# -e # print elapsed times (us) +# -F # print flow indentation +# -l # print pid/lwpid per line +# -o # print on cpu times (us) +# -u lib # trace this library instead +# -U # trace all libraries + user functions +# -b bufsize # dynamic variable buf size (default is "4m") +# eg, +# dapptrace df -h # run and examine the "df -h" command +# dapptrace -p 1871 # examine PID 1871 +# dapptrace -Fp 1871 # print using flow indents +# dapptrace -eop 1871 # print elapsed and CPU times +# +# The elapsed times are interesting, to help identify calls that take +# some time to complete (during which the process may have context +# switched off the CPU). +# +# SEE ALSO: dappprof # DTraceToolkit +# dtruss # DTraceToolkit +# apptrace +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 16-May-2005 Brendan Gregg Created this. +# 17-Jul-2005 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### Default variables +opt_pid=0; pid=0; opt_indent=0; opt_lib=0; lib="" +opt_elapsed=0; opt_cpu=0; opt_counts=0; +opt_relative=0; opt_printid=0; opt_liball=0 +opt_command=0; command=""; opt_buf=0; buf="4m" + +### Process options +while getopts ab:cdeFhlop:u:U name +do + case $name in + a) opt_liball=1; opt_counts=1; opt_relative=1; opt_elapsed=1 + opt_indent=1; opt_printid=1; opt_cpu=1 ;; + b) opt_buf=1; buf=$OPTARG ;; + p) opt_pid=1; pid=$OPTARG ;; + u) opt_lib=1; lib=$OPTARG ;; + U) opt_liball=1 ;; + c) opt_counts=1 ;; + d) opt_relative=1 ;; + e) opt_elapsed=1 ;; + F) opt_indent=1 ;; + l) opt_printid=1 ;; + o) opt_cpu=1 ;; + h|?) cat <<-END >&2 + USAGE: dapptrace [-acdeholFLU] [-u lib] { -p PID | command } + + -p PID # examine this PID + -a # print all details + -c # print syscall counts + -d # print relative times (us) + -e # print elapsed times (us) + -F # print flow indentation + -l # print pid/lwpid + -o # print CPU on cpu times + -u lib # trace this library instead + -U # trace all libraries + user funcs + -b bufsize # dynamic variable buf size + eg, + dapptrace df -h # run and examine "df -h" + dapptrace -p 1871 # examine PID 1871 + dapptrace -Fp 1871 # print using flow indents + dapptrace -eop 1871 # print elapsed and CPU times + END + exit 1 + esac +done +shift `expr $OPTIND - 1` + +### Option logic +if [ $opt_pid -eq 0 ]; then + opt_command=1 + if [ "$*" = "" ]; then + $0 -h + exit + fi + command="$*" +fi + +### Probe logic +if [ $opt_liball -eq 1 ]; then + probe_entry='pid$target:::entry' + probe_return='pid$target:::return' +elif [ $opt_lib -eq 1 ]; then + probe_entry='pid$target:'$lib'::entry' + probe_return='pid$target:'$lib'::return' +else + probe_entry='pid$target:a.out::entry' + probe_return='pid$target:a.out::return' +fi + +################################# +# --- Main Program, DTrace --- +# + +### Define D Script +dtrace=' + #pragma D option quiet + + /* + * Command line arguments + */ + inline int OPT_command = '$opt_command'; + inline int OPT_liball = '$opt_liball'; + inline int OPT_indent = '$opt_indent'; + inline int OPT_printid = '$opt_printid'; + inline int OPT_relative = '$opt_relative'; + inline int OPT_elapsed = '$opt_elapsed'; + inline int OPT_cpu = '$opt_cpu'; + inline int OPT_counts = '$opt_counts'; + inline int OPT_pid = '$opt_pid'; + inline int PID = '$pid'; + inline string NAME = "'$pname'"; + + dtrace:::BEGIN + { + /* print header */ + OPT_printid ? printf("%-8s ","PID/LWP") : 1; + OPT_relative ? printf("%8s ","RELATIVE") : 1; + OPT_elapsed ? printf("%7s ","ELAPSD") : 1; + OPT_cpu ? printf("%6s ","CPU") : 1; + printf("CALL(args) \t\t = return\n"); + + /* indent depth */ + depth = 0; + } + + /* + * Save syscall entry info + */ + '$probe_entry' + { + /* set function depth */ + this->fdepth = ++fdepth[probefunc]; + depth += 2; + + /* set start details */ + self->start[probefunc,this->fdepth] = timestamp; + self->vstart[probefunc,this->fdepth] = vtimestamp; + + /* count occurances */ + OPT_counts && OPT_liball ? @Counts[probemod,probefunc] = count() : 1; + OPT_counts && ! OPT_liball ? @Counts[probefunc] = count() : 1; + + /* print optional fields */ + OPT_printid ? printf("%5d/%d: ",pid,tid) : 1; + OPT_relative ? printf("%8d ",vtimestamp/1000) : 1; + OPT_elapsed ? printf(" . ") : 1; + OPT_cpu ? printf(" . ") : 1; + OPT_indent ? printf("%*s",depth,"") : 1; + + /* print main data */ + printf("-> "); + OPT_liball ? printf("%s:",probemod) : 1; + printf("%s(0x%X, 0x%X, 0x%X)\t\t\n",probefunc,arg0,arg1,arg2); + + } + + /* + * Print return data + */ + /* print 3 arg output - default */ + '$probe_return' + /self->start[probefunc,fdepth[probefunc]]/ + { + /* fetch function depth */ + this->fdepth = fdepth[probefunc]; + + /* calculate elapsed time */ + this->elapsed = timestamp - self->start[probefunc,this->fdepth]; + self->start[probefunc,this->fdepth] = 0; + this->cpu = vtimestamp - self->vstart[probefunc,this->fdepth]; + self->vstart[probefunc,this->fdepth] = 0; + + /* print optional fields */ + OPT_printid ? printf("%5d/%d: ",pid,tid) : 1; + OPT_relative ? printf("%8d ",vtimestamp/1000) : 1; + OPT_elapsed ? printf("%7d ",this->elapsed/1000) : 1; + OPT_cpu ? printf("%6d ",this->cpu/1000) : 1; + OPT_indent ? printf("%*s",depth,"") : 1; + + /* print main data */ + printf("<- "); + OPT_liball ? printf("%s:",probemod) : 1; + printf("%s = %d\n",probefunc,(int)arg0); + depth -= 2; + fdepth[probefunc]--; + } + + /* reset indent depth */ + profile:::tick-1sec + { + /* + * some probes generated by the pid provider have entries + * but not returns. this is a klude to fix that problem. this + * also explains fdepth[probefunc] rather than a single depth. + */ + depth = 0; + } + + /* print counts */ + dtrace:::END + { + OPT_counts ? printf("\n%-49s %16s\n","CALL","COUNT") : 1; + OPT_counts && OPT_liball ? printa("%-16s %-32s %@16d\n",@Counts) : 1; + OPT_counts && ! OPT_liball ? printa("%-49s %@16d\n",@Counts) : 1; + } +' + +### Run DTrace +if [ $opt_command -eq 1 ]; then + /usr/sbin/dtrace -x dynvarsize=$buf -x evaltime=exec -n "$dtrace" \ + -c "$command" >&2 +else + /usr/sbin/dtrace -x dynvarsize=$buf -n "$dtrace" -p "$pid" >&2 +fi + diff --git a/cddl/contrib/dtracetoolkit/Proc/fddist b/cddl/contrib/dtracetoolkit/Proc/fddist new file mode 100755 index 00000000000..b1fe17ad4d9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/fddist @@ -0,0 +1,116 @@ +#!/usr/bin/sh +# +# fddist - file descriptor usage distributions. +# Written using DTrace (Solaris 10 3/05). +# +# This prints distributions for read and write events by file descriptor, +# by process. This can be used to determine which file descriptor a +# process is doing the most I/O with. +# +# $Id: fddist 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: fddist [-r|-w] # hit Ctrl-C to end sample +# +# FIELDS: +# EXEC process name +# PID process ID +# value file descriptor +# count number of events +# +# BASED ON: /usr/demo/dtrace/lquantize.d +# +# SEE ALSO: +# DTrace Guide "Aggregations" chapter (docs.sun.com) +# +# PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# 09-Jun-2005 Brendan Gregg Created this. +# 20-Apr-2006 " " Last update. + + +############################## +# --- Process Arguments --- +# + +### Default variables +opt_read=0; opt_write=0 + +### Process options +while getopts hrw name +do + case $name in + r) opt_read=1 ;; + w) opt_write=1 ;; + h|?) cat <<-END >&2 + USAGE: fddist [-r|-w] + -r # reads only + -w # writes only + eg, + fddist # default, r+w counts + fddist -r # read count only + END + exit 1 + esac +done +shift `expr $OPTIND - 1` + +### Option logic +if [ $opt_read -eq 0 -a $opt_write -eq 0 ]; then + opt_read=1; opt_write=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + + inline int OPT_read = '$opt_read'; + inline int OPT_write = '$opt_write'; + inline int FDMAX = 255; + + /* print header */ + dtrace:::BEGIN + { + printf("Tracing "); + OPT_read && OPT_write ? printf("reads and writes") : 1; + OPT_read && ! OPT_write ? printf("reads") : 1; + ! OPT_read && OPT_write ? printf("writes") : 1; + printf("... Hit Ctrl-C to end.\n"); + } + + /* sample reads */ + syscall::*read*:entry + /OPT_read/ + { + @Count[execname, pid] = lquantize(arg0, 0, FDMAX, 1); + } + + /* sample writes */ + syscall::*write*:entry + /OPT_write/ + { + @Count[execname, pid] = lquantize(arg0, 0, FDMAX, 1); + } + + /* print report */ + dtrace:::END + { + printa("EXEC: %-16s PID: %d\n%@d\n",@Count); + } +' diff --git a/cddl/contrib/dtracetoolkit/Proc/filebyproc.d b/cddl/contrib/dtracetoolkit/Proc/filebyproc.d new file mode 100755 index 00000000000..d1f75897bf1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/filebyproc.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * filebyproc.d - snoop files opened by process name. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: filebyproc.d 3 2007-08-01 10:50:08Z brendan $ + */ + +syscall::open*:entry { printf("%s %s", execname, copyinstr(arg0)); } diff --git a/cddl/contrib/dtracetoolkit/Proc/kill.d b/cddl/contrib/dtracetoolkit/Proc/kill.d new file mode 100755 index 00000000000..215625f84f4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/kill.d @@ -0,0 +1,63 @@ +#!/usr/sbin/dtrace -qs +/* + * kill.d - watch process signals as they are sent (eg, kill -9). + * Written in DTrace (Solaris 10 3/05). + * + * $Id: kill.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: kill.d + * + * FIELDS: + * FROM source PID + * COMMAND source command name + * TO destination PID + * SIG destination signal ("9" for a kill -9) + * RESULT result of signal (-1 is for failure) + * + * SEE ALSO: Chapter 25, Solaris Dynamic Tracing Guide, docs.sun.com, + * for a solution using proc:::signal-send. + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-May-2004 Brendan Gregg Created this. + * 28-Jun-2005 " " Last update. + */ + +dtrace:::BEGIN +{ + /* Print header */ + printf("%5s %12s %5s %-6s %s\n", + "FROM", "COMMAND", "SIG", "TO", "RESULT"); +} + +syscall::kill:entry +{ + /* Record target PID and signal */ + self->target = arg0; + self->signal = arg1; +} + +syscall::kill:return +{ + /* Print source, target, and result */ + printf("%5d %12s %5d %-6d %d\n", + pid, execname, self->signal, self->target, (int)arg0); + + /* Cleanup memory */ + self->target = 0; + self->signal = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Proc/lastwords b/cddl/contrib/dtracetoolkit/Proc/lastwords new file mode 100755 index 00000000000..1258cc94edb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/lastwords @@ -0,0 +1,90 @@ +#!/usr/bin/ksh +# +# lastwords - print last few syscalls for dying processes. +# Written using DTrace (Solaris 10 3/05). +# +# $Id: lastwords 3 2007-08-01 10:50:08Z brendan $ +# +# This prints the last few system calls for processes matching +# the given name, when they exit. This makes use of a ring buffer +# so that the impact on the system is minimised. +# +# USAGE: lastwords command +# eg, +# lastwords netscape +# +# FIELDS: +# TIME Time of syscall return, ns +# PID Process ID +# EXEC Process name (execname) +# SYSCALL System call +# RETURN Return value for system call +# ERR errno for system call +# +# BASED ON: /usr/demo/dtrace/ring.d +# +# SEE ALSO: DTrace Guide "Buffers and Buffering" chapter (docs.sun.com) +# dtruss (DTraceToolkit) +# +# PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# 09-Jun-2005 Brendan Gregg Created this. +# 20-Apr-2006 " " Last update. +# + +### Usage +function usage +{ + cat <<-END >&2 + USAGE: lastwords command + eg, + lastwords netscape + END + exit 1 +} + +### Process arguments +if (( $# != 1 )); then + usage +fi +command=$1 + +print "Tracing... Waiting for $command to exit..." + +### Run DTrace +/usr/sbin/dtrace -n ' + #pragma D option quiet + #pragma D option bufpolicy=ring + #pragma D option bufsize=16k + + syscall:::return + /execname == $$1/ + { + /* buffer syscall details */ + printf("%-18d %5d %12s %12s %10x %3d\n", + timestamp,pid,execname,probefunc,(int)arg0,errno); + } + + proc::proc_exit:exit + /execname == $$1/ + { + /* print, erm, footer */ + printf("%-18s %5s %12s %12s %10s %3s\n", + "TIME","PID","EXEC","SYSCALL","RETURN","ERR"); + exit(0); + } +' "$command" diff --git a/cddl/contrib/dtracetoolkit/Proc/mmapfiles.d b/cddl/contrib/dtracetoolkit/Proc/mmapfiles.d new file mode 100755 index 00000000000..7690f509576 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/mmapfiles.d @@ -0,0 +1,62 @@ +#!/usr/sbin/dtrace -s +/* + * mmapfiles.d - mmap'd files by process. + * Written using DTrace (Solaris 10 3/05). + * + * $Id: mmapfiles.d 14 2007-09-11 08:03:35Z brendan $ + * + * USAGE: mmapfiles.d # hit Ctrl-C to end sample + * + * FIELDS: + * MMAPS number of mmaps + * CMD process name + * PATHNAME pathname of mmap'd file + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 18-Oct-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +syscall::mmap:entry +/(int)arg4 > 0/ +{ + /* + * Fetch filename + */ + this->filep = curthread->t_procp->p_user.u_finfo.fi_list[arg4].uf_file; + this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0; + self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ? + cleanpath(this->vnodep->v_path) : "") : ""; + + /* Store Details */ + @hits[execname, self->vpath] = count(); +} + +dtrace:::END +{ + /* Print Details */ + printf("%5s %-16s %s\n", "MMAPS", "CMD", "PATHNAME"); + printa("%@5d %-16s %s\n", @hits); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/newproc.d b/cddl/contrib/dtracetoolkit/Proc/newproc.d new file mode 100755 index 00000000000..6b6fad2af92 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/newproc.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * newproc.d - snoop new processes as they are executed. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: newproc.d 3 2007-08-01 10:50:08Z brendan $ + */ + +proc:::exec-success { trace(curpsinfo->pr_psargs); } diff --git a/cddl/contrib/dtracetoolkit/Proc/pathopens.d b/cddl/contrib/dtracetoolkit/Proc/pathopens.d new file mode 100755 index 00000000000..10cd0c82056 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/pathopens.d @@ -0,0 +1,100 @@ +#!/usr/sbin/dtrace -s +/* + * pathopens.d - full pathnames opened successfully count. + * Written using DTrace (Solaris 10 3/05) + * + * This program prints a count of the number of times files have been + * successfully opened. This is somewhat special in that the full pathname + * is calculated, even if the file open referred to a relative pathname. + * + * $Id: pathopens.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: fileopens.d + * + * FIELDS: + * PATHNAME full pathname + * COUNT number of successful opens + * + * Similar to a script from DExplorer. + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 28-Jun-2005 Brendan Gregg Created this. + * 12-Jan-2006 " " Fixed known error. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +syscall::open*:entry +{ + self->pathp = arg0; + self->ok = 1; +} + +syscall::open*:return +/self->ok && arg0 != -1/ +{ + self->file = copyinstr(self->pathp); + self->char0 = copyin(self->pathp, 1); + + /* fetch current working directory */ + this->path = curthread->t_procp->p_user.u_cdir->v_path; + + /* + * Make the full pathname + * + * This routine takes the cwd and the filename, and generates a + * full pathname. Sometimes the filename is absolute, so we must + * ignore the cwd. This also checks if the cwd ends in an + * unnecessary '/'. + */ + this->len = strlen(this->path); + self->join = *(char *)(this->path + this->len - 1) == '/' ? "" : "/"; + self->dir = strjoin(cwd, self->join); + self->dir = *(char *)self->char0 == '/' ? "" : self->dir; + self->full = strjoin(self->dir, self->file); + + /* save to aggregation */ + @num[self->full] = count(); + + /* cleanup */ + self->join = 0; + self->full = 0; + self->dir = 0; + self->file = 0; + self->char0 = 0; +} + +syscall::open*:return +/self->ok/ +{ + /* cleanup */ + self->ok = 0; + self->pathp = 0; +} + +dtrace:::END +{ + printf("%6s %s\n", "COUNT", "PATHNAME"); + printa("%@6d %s\n", @num); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/pfilestat b/cddl/contrib/dtracetoolkit/Proc/pfilestat new file mode 100755 index 00000000000..c6aaba3a0c2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/pfilestat @@ -0,0 +1,282 @@ +#!/usr/bin/sh +# +# pfilestat +# +# This prints I/O statistics for each file descriptor within a process. +# In particular, the time break down during read() and write() events is +# measured. +# +# $Id: pfilestat 4 2007-08-01 11:01:38Z brendan $ +# +# USAGE: pfilestat [-r|-w] pid +# +# FIELDS: +# STATE microstate: running, sleeping, waitcpu, read, write +# FDUM File Descriptor ID +# Time Percentage of wallclock time in each STATE +# File Name of file, if known +# +# COPYRIGHT: Copyright (c) 2006 Richard McDougall. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# ToDo: +# Trace readv() and writev(). +# +# 20-Feb-2006 Richard McDougall created this. +# 24-Feb-2006 Brendan Gregg tweaked code. +# 20-Mar-2006 " " tweaked code. +# 20-Mar-2006 " " last update. + + +############################## +# --- Process Arguments --- +# + +### Default variables +opt_read=0; opt_write=0 + +### Process options +while getopts hrw name +do + case $name in + r) opt_read=1 ;; + w) opt_write=1 ;; + h|?) cat <<-END >&2 + USAGE: pfilestat [-r|-w] pid + -r # reads only + -w # writes only + eg, + pfilestat pid # default, r+w counts + pfilestat -r pid # read count only + END + exit 1 + esac +done +shift `expr $OPTIND - 1` + +PID=$1 +clearstr=`clear` + +if [ -z "$PID" ] +then + echo "Must supply pid" + exit 1 +fi + +### Option logic +if [ $opt_read -eq 0 -a $opt_write -eq 0 ]; then + opt_read=1; opt_write=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + + inline string CLEAR = "'$clearstr'"; + inline int OPT_read = '$opt_read'; + inline int OPT_write = '$opt_write'; + inline int PID = '$PID'; + + unsigned long long totaltime; + unsigned long long totalbytes; + + enum runstate { + READ, + WRITE, + OTHER + }; + + /* print header */ + dtrace:::BEGIN + { + printf("Tracing "); + OPT_read && OPT_write ? printf("reads and writes") : 1; + OPT_read && ! OPT_write ? printf("reads") : 1; + ! OPT_read && OPT_write ? printf("writes") : 1; + printf("..."); + totaltime = 0; + totalbytes = 0; + last = timestamp; + stamp = timestamp; + } + + /* sample reads */ + syscall::read:entry, + syscall::pread*:entry + /pid == PID && OPT_read/ + { + runstate = READ; + @logical["running", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + + self->fd = arg0 + 1; + } + + fbt::fop_read:entry, + fbt::fop_write:entry + /self->fd/ + { + self->path = args[0]->v_path == 0 ? "" : + cleanpath(args[0]->v_path); + } + + syscall::read:return, + syscall::pread*:return + /pid == PID && OPT_read/ + { + runstate = OTHER; + this->bytes = (int)arg0 > 0 ? (int)arg0 : 0; + @logical["read", self->fd - 1, self->path] = sum(timestamp - last); + @bytes["read", self->fd - 1, self->path] = sum(this->bytes); + totalbytes += this->bytes; + totaltime += timestamp - last; + last = timestamp; + self->path = 0; + self->fd = 0; + } + + + /* sample writes */ + syscall::write:entry, + syscall::pwrite*:entry + /pid == PID && OPT_write/ + { + runstate = WRITE; + @logical["running", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + + self->fd = (int)arg0 + 1; + } + + syscall::write:return, + syscall::pwrite*:return + /pid == PID && OPT_write/ + { + runstate = OTHER; + this->bytes = (int)arg0 > 0 ? (int)arg0 : 0; + @logical["write", self->fd - 1, self->path] = sum(timestamp - last); + @bytes["write", self->fd - 1, self->path] = sum(this->bytes); + totalbytes += this->bytes; + totaltime += timestamp - last; + last = timestamp; + self->path = 0; + self->fd = 0; + } + + sched:::on-cpu + /pid == PID/ + { + @logical["waitcpu", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + + sched:::off-cpu + /pid == PID/ + { + @logical["running", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + sched:::sleep + /pid == PID/ + { + @logical["running", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + sched:::wakeup + /args[1]->pr_pid == PID && runstate == OTHER/ + { + @logical["sleep", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + sched:::wakeup + /args[1]->pr_pid == PID && runstate == READ/ + { + @logical["sleep-r", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + sched:::wakeup + /args[1]->pr_pid == PID && runstate == WRITE/ + { + @logical["sleep-w", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + sched:::enqueue + /args[1]->pr_pid == PID/ + { + @logical["waitcpu", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + sched:::dequeue + /args[1]->pr_pid == PID/ + { + @logical["waitcpu", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + /* print report */ + profile:::tick-5s + { + printf("%s", CLEAR); + normalize(@logical, totaltime / 100); + trunc(@logical, 10); + printf("%10s %7s %9s %-44s\n", "STATE", "FDNUM", "Time", "Filename"); + printa("%10s %7d %@8d%% %-44.44s\n", @logical); + trunc(@logical); + + delta = timestamp - stamp; + stamp = timestamp; + normalize(@bytes, (1024 * delta) / 1000000000); + trunc(@bytes, 10); + printf("\n%10s %7s %9s %-44s\n", "STATE", "FDNUM", "KB/s", + "Filename"); + printa("%10s %7d %@9d %-44.44s\n", @bytes); + trunc(@bytes); + + printf("\nTotal event time (ms): %d Total Mbytes/sec: %d\n", + totaltime / 1000000, + (totalbytes * 1000000000) / (delta * 1048576)); + + totaltime = 0; + totalbytes = 0; + last = timestamp; + } + + dtrace:::END + { + trunc(@logical); + trunc(@bytes); + } +' diff --git a/cddl/contrib/dtracetoolkit/Proc/pidpersec.d b/cddl/contrib/dtracetoolkit/Proc/pidpersec.d new file mode 100755 index 00000000000..71080b9e752 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/pidpersec.d @@ -0,0 +1,57 @@ +#!/usr/sbin/dtrace -s +/* + * pidpersec.d - print new PIDs per sec. + * Written using DTrace (Solaris 10 3/05) + * + * This script prints the number of new processes created per second. + * + * $Id: pidpersec.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: pidpersec.d + * + * FIELDS: + * + * TIME Time, as a string + * LASTPID Last PID created + * PID/s Number of processes created per second + * + * SEE ALSO: execsnoop + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Jun-2005 Brendan Gregg Created this. + * 09-Jun-2005 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("%-22s %8s %6s\n", "TIME", "LASTPID", "PID/s"); + pids = 0; +} + +proc:::exec-success +{ + pids++; +} + +profile:::tick-1sec +{ + printf("%-22Y %8d %6d\n", walltimestamp, `mpid, pids); + pids = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Proc/readbytes.d b/cddl/contrib/dtracetoolkit/Proc/readbytes.d new file mode 100755 index 00000000000..67612a2d5e0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/readbytes.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * readbytes.d - read bytes by process name. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: readbytes.d 3 2007-08-01 10:50:08Z brendan $ + */ + +sysinfo:::readch { @bytes[execname] = sum(arg0); } diff --git a/cddl/contrib/dtracetoolkit/Proc/readdist.d b/cddl/contrib/dtracetoolkit/Proc/readdist.d new file mode 100755 index 00000000000..0d0346dd8b9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/readdist.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * readdist.d - read distribution by process name. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: readdist.d 3 2007-08-01 10:50:08Z brendan $ + */ + +sysinfo:::readch { @dist[execname] = quantize(arg0); } diff --git a/cddl/contrib/dtracetoolkit/Proc/rwbbypid.d b/cddl/contrib/dtracetoolkit/Proc/rwbbypid.d new file mode 100755 index 00000000000..72cb00df59e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/rwbbypid.d @@ -0,0 +1,61 @@ +#!/usr/sbin/dtrace -s +/* + * rwbbypid.d - read/write bytes by PID. + * Written using DTrace (Solaris 10 3/05) + * + * This script tracks the bytes read and written at the syscall level + * by processes, printing the totals in a report. This is tracking the + * successful number of bytes read or written. + * + * $Id: rwbbypid.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: rwbbypid.d # hit Ctrl-C to end sample + * + * FIELDS: + * PID process ID + * CMD process name + * DIR direction, Read or Write + * BYTES total bytes + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 28-Jun-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sysinfo:::readch +{ + @bytes[pid, execname, "R"] = sum(arg0); +} + +sysinfo:::writech +{ + @bytes[pid, execname, "W"] = sum(arg0); +} + +dtrace:::END +{ + printf("%6s %-24s %4s %16s\n", "PID", "CMD", "DIR", "BYTES"); + printa("%6d %-24s %4s %@16d\n", @bytes); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/rwbypid.d b/cddl/contrib/dtracetoolkit/Proc/rwbypid.d new file mode 100755 index 00000000000..e4f0432f1ae --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/rwbypid.d @@ -0,0 +1,61 @@ +#!/usr/sbin/dtrace -s +/* + * rwbypid.d - read/write calls by PID. + * Written using DTrace (Solaris 10 3/05) + * + * This script tracks the number of reads and writes at the syscall level + * by processes, printing the totals in a report. This matches reads + * and writes whether they succeed or not. + * + * $Id: rwbypid.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: rwbypid.d # hit Ctrl-C to end sample + * + * FIELDS: + * PID process ID + * CMD process name + * DIR Read or Write + * COUNT total calls + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 28-Jun-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +syscall::*read*:entry +{ + @calls[pid, execname, "R"] = sum(arg0); +} + +syscall::*write*:entry +{ + @calls[pid, execname, "W"] = sum(arg0); +} + +dtrace:::END +{ + printf("%6s %-24s %4s %8s\n", "PID", "CMD", "DIR", "COUNT"); + printa("%6d %-24s %4s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/rwbytype.d b/cddl/contrib/dtracetoolkit/Proc/rwbytype.d new file mode 100755 index 00000000000..6705d99f3cd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/rwbytype.d @@ -0,0 +1,101 @@ +#!/usr/sbin/dtrace -s +/* + * rwbytype.d - read/write bytes by vnode type. + * Written using DTrace (Solaris 10 3/05). + * + * This program identifies the vnode type of read/write activity - whether + * that is for regular files, sockets, character special devices, etc. + * + * $Id: rwbytype.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: rwbytype.d # hit Ctrl-C to end sample + * + * FIELDS: + * PID number of rwbytype + * CMD process name + * VTYPE vnode type (describes I/O type) + * DIR direction (Read/Write) + * BYTES bytes transferred + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 18-Oct-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +typedef struct vtype2str { + string code; +}; + +translator struct vtype2str < int T > { + /* the order has been picked for performance reasons */ + code = + T == 1 ? "reg" : + T == 9 ? "sock" : + T == 4 ? "chr" : + T == 6 ? "fifo" : + T == 8 ? "proc" : + T == 2 ? "dir" : + T == 3 ? "blk" : + T == 5 ? "lnk" : + T == 7 ? "door" : + T == 10 ? "port" : + T == 11 ? "bad" : "non"; +}; + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +fbt::fop_read:entry, +fbt::fop_write:entry +{ + self->type = xlate (args[0]->v_type)->code; + self->size = args[1]->uio_resid; + self->uiop = args[1]; +} + +fbt::fop_read:return +/self->uiop/ +{ + this->resid = self->uiop->uio_resid; + @bytes[pid, execname, self->type, "R"] = sum(self->size - this->resid); + self->type = 0; + self->size = 0; + self->uiop = 0; +} + +/* this is delibrately redundant code for performance reasons */ +fbt::fop_write:return +/self->uiop/ +{ + this->resid = self->uiop->uio_resid; + @bytes[pid, execname, self->type, "W"] = sum(self->size - this->resid); + self->type = 0; + self->size = 0; + self->uiop = 0; +} + +dtrace:::END +{ + printf("%-6s %-16s %6s %4s %9s\n", + "PID", "CMD", "VTYPE", "DIR", "BYTES"); + printa("%-6d %-16s %6s %4s %@9d\n", @bytes); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/sampleproc b/cddl/contrib/dtracetoolkit/Proc/sampleproc new file mode 100755 index 00000000000..891be146509 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/sampleproc @@ -0,0 +1,105 @@ +#!/usr/bin/ksh +# +# sampleproc - sample processes on the CPUs. +# Written using DTrace (Solaris 10 3/05). +# +# This program samples which process is on each CPU, at a particular +# configurable rate. This can be used as an estimate for which process +# is consuming the most CPU time. +# +# $Id: sampleproc 8 2007-08-06 05:55:26Z brendan $ +# +# USAGE: sampleproc [hertz] # hit Ctrl-C to end sample +# +# FIELDS: +# PID Process ID +# COMMAND Command name +# COUNT Number of samples +# PERCENT Percent of CPU usage +# +# BASED ON: /usr/demo/dtrace/prof.d +# +# SEE ALSO: +# DTrace Guide "profile Provider" chapter (docs.sun.com) +# +# PORTIONS: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# 09-Jun-2005 Brendan Gregg Created this. +# 09-Jul-2005 " " Last update. + +### Usage +function usage +{ + cat <<-END >&2 + USAGE: sampleproc [hertz] + eg, + sampleproc # defaults to 100 hertz + sampleproc 1000 # 1000 hertz + END + exit 1 +} + +### Process arguments +if (( $# == 0 )); then + hertz=100 +elif (( $# == 1 )); then + hertz=$1 + if [[ "$hertz" = *[a-zA-Z]* ]]; then + print "ERROR2: $hertz hertz is invalid." >&2 + exit 2 + fi + if (( hertz > 5000 )); then + print "ERROR3: $hertz hertz is too fast (max 5000)." >&2 + exit 3 + fi + if (( hertz < 1 )); then + print "ERROR4: $hertz hertz is too low (min 1)." >&2 + exit 4 + fi +else + usage +fi + +### Run DTrace +/usr/sbin/dtrace -n ' + #pragma D option quiet + + dtrace:::BEGIN + { + printf("Sampling at %d hertz... Hit Ctrl-C to end.\n",$1); + self->start = timestamp; + } + + profile:::profile-$1 + { + @Proc[pid, execname] = count(); + @BigProc[pid, execname] = sum(1000); /* dont ask */ + } + + dtrace:::END + { + this->end = timestamp; + + printf("%5s %-20s %10s\n", "PID", "CMD", "COUNT"); + printa("%5d %-20s %10@d\n", @Proc); + + normalize(@BigProc, + ((`ncpus_online * $1 * (this->end - self->start))/100000000)); + printf("\n%5s %-20s %10s\n", "PID", "CMD", "PERCENT"); + printa("%5d %-20s %10@d\n", @BigProc); + } +' $hertz diff --git a/cddl/contrib/dtracetoolkit/Proc/shortlived.d b/cddl/contrib/dtracetoolkit/Proc/shortlived.d new file mode 100755 index 00000000000..268c370d11e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/shortlived.d @@ -0,0 +1,118 @@ +#!/usr/sbin/dtrace -qs +/* + * shortlived.d - determine time spent by short lived processes. + * Written in DTrace (Solaris 10 3/05). + * + * $Id: shortlived.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: shortlived.d # wait, then hit Ctrl-C + * + * Applications that run many short lived processes can cause load + * on the system that is difficult to identify - the processes + * aren't sampled in time by programs such as prstat. This program + * illustrates how much time was spent processing those extra + * processes, and a table of process name by total times for each. + * + * SEE ALSO: execsnoop + * + * Notes: + * - The measurements are minimum values, not all of the overheads + * caused by process generation and destruction are measured (DTrace + * can do so, but the script would become seriously complex). + * - The summary values are accurate, the by program and by PPID values + * are usually slightly smaller due to rounding errors. + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 22-Apr-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +/* + * Start + */ +dtrace:::BEGIN +{ + /* save start time */ + start = timestamp; + + /* this is time spent on shortlived processes */ + procs = 0; + + /* print header */ + printf("Tracing... Hit Ctrl-C to stop.\n"); +} + +/* + * Measure parent fork time + */ +syscall::*fork*:entry +{ + /* save start of fork */ + self->fork = vtimestamp; +} +syscall::*fork*:return +/arg0 != 0 && self->fork/ +{ + /* record elapsed time for the fork syscall */ + this->elapsed = vtimestamp - self->fork; + procs += this->elapsed; + self->fork = 0; +} + +/* + * Measure child processes time + */ +syscall::*fork*:return +/arg0 == 0/ +{ + /* save start of child process */ + self->start = vtimestamp; + + /* memory cleanup */ + self->fork = 0; +} +proc:::exit +/self->start/ +{ + /* record elapsed time for process execution */ + this->elapsed = vtimestamp - self->start; + procs += this->elapsed; + + /* sum elapsed by process name and ppid */ + @Times_exec[execname] = sum(this->elapsed/1000000); + @Times_ppid[ppid] = sum(this->elapsed/1000000); + + /* memory cleanup */ + self->start = 0; +} + +/* + * Print report + */ +dtrace:::END +{ + this->total = timestamp - start; + printf("short lived processes: %6d.%03d secs\n", + procs/1000000000, (procs%1000000000)/1000000); + printf("total sample duration: %6d.%03d secs\n", + this->total/1000000000, (this->total%1000000000)/1000000); + printf("\nTotal time by process name,\n"); + printa("%18s %@12d ms\n", @Times_exec); + printf("\nTotal time by PPID,\n"); + printa("%18d %@12d ms\n", @Times_ppid); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/sigdist.d b/cddl/contrib/dtracetoolkit/Proc/sigdist.d new file mode 100755 index 00000000000..c3b2bc075c6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/sigdist.d @@ -0,0 +1,61 @@ +#!/usr/sbin/dtrace -s +/* + * sigdist.d - signal distribution by process name. + * Written using DTrace (Solaris 10 3/05) + * + * This is a simple DTrace script that prints the number of signals + * recieved by process and signal number. This script is also available + * as /usr/demo/dtrace/sig.d, where it originates. + * + * $Id: sigdist.d 4 2007-08-01 11:01:38Z brendan $ + * + * USAGE: sigdist.d # hit Ctrl-C to end + * + * FIELDS: + * SENDER process name of sender + * RECIPIENT process name of target + * SIG signal number, see signal(3head) + * COUNT number of signals sent + * + * BASED ON: /usr/demo/dtrace/sig.d + * + * SEE ALSO: DTrace Guide "proc Provider" chapter (docs.sun.com) + * kill.d(1M) + * + * PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Jun-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +proc:::signal-send +{ + @Count[execname, stringof(args[1]->pr_fname), args[2]] = count(); +} + +dtrace:::END +{ + printf("%16s %16s %6s %6s\n", "SENDER", "RECIPIENT", "SIG", "COUNT"); + printa("%16s %16s %6d %6@d\n", @Count); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/stacksize.d b/cddl/contrib/dtracetoolkit/Proc/stacksize.d new file mode 100755 index 00000000000..fedcfbc6e78 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/stacksize.d @@ -0,0 +1,95 @@ +#!/usr/sbin/dtrace -s +/* + * stacksize.d - measure stack size for running threads. + * Written using DTrace (Solaris 10 3/05). + * + * $Id: stacksize.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: stacksize.d # hit Ctrl-C to end sample + * + * FIELDS: + * value size of the user stack + * count number of samples at this size + * + * SEE ALSO: pmap(1) + * + * COPYRIGHT: Copyright (c) 2006 Jonathan Adams + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 16-Feb-2006 Jonathan Adams Created this. + * 16-Feb-2006 " " Last update. + */ + +#pragma D option quiet + +this uintptr_t stkinfoptr; +this uintptr_t stkptr; + +dtrace:::BEGIN +{ + trace("Sampling... Hit Ctrl-C to end\n"); +} + +sched:::on-cpu, profile:::profile-997 +{ + this->stkinfoptr = 0; + this->stkptr = 0; +} + +sched:::on-cpu, profile:::profile-997 +/execname != "sched"/ +{ + this->stkinfoptr = curthread->t_lwp->lwp_ustack; + this->stkptr = (uintptr_t)0; +} + +sched:::on-cpu, profile:::profile-997 +/this->stkinfoptr != 0 && curpsinfo->pr_dmodel == PR_MODEL_ILP32/ +{ + this->stkinfo32 = (stack32_t *)copyin(this->stkinfoptr, + sizeof (stack32_t)); + this->stktop = (uintptr_t)this->stkinfo32->ss_sp + + this->stkinfo32->ss_size; + this->stkptr = (uintptr_t)uregs[R_SP]; +} + +sched:::on-cpu, profile:::profile-997 +/this->stkinfoptr != 0 && curpsinfo->pr_dmodel == PR_MODEL_LP64/ +{ + this->stkinfo = (stack_t *)copyin(this->stkinfoptr, + sizeof (stack_t)); + this->stktop = (uintptr_t)this->stkinfo->ss_sp + + this->stkinfo->ss_size; + this->stkptr = (uintptr_t)uregs[R_SP]; +} + +sched:::on-cpu, profile:::profile-997 +/this->stkptr != 0/ +{ + @sizes[execname] = quantize(this->stktop - this->stkptr); +} + +dtrace:::ERROR +{ + @errors[execname] = count(); +} + +dtrace:::END +{ + printa(@sizes); + printf("\nErrors:\n"); + printa(" %@d %s\n", @errors); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/sysbypid.d b/cddl/contrib/dtracetoolkit/Proc/sysbypid.d new file mode 100755 index 00000000000..bb806538c9d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/sysbypid.d @@ -0,0 +1,53 @@ +#!/usr/sbin/dtrace -s +/* + * sysbypid.d - print sysinfo events by process. + * Uses DTrace (Solaris 10 3/05). + * + * $Id: sysbypid.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: sysbypid.d + * + * FIELDS: + * EXEC Process name + * PID Process ID + * SYS System statistic (see /usr/include/sys/sysinfo.h) + * VALUE Value by which statistic was incremented + * + * The virtual memory statistics are documented in the cpu_sysinfo struct + * in the /usr/include/sys/sysinfo.h file; and also in the sysinfo provider + * chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223. + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 14-May-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN { + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sysinfo::: { + @Sys[execname, pid, probename] = sum(arg0); +} + +dtrace:::END { + printf("%16s %8s %22s %8s\n", "EXEC", "PID", "SYS", "VALUE"); + printa("%16s %8d %22s %@8d\n", @Sys); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/syscallbypid.d b/cddl/contrib/dtracetoolkit/Proc/syscallbypid.d new file mode 100755 index 00000000000..f33ac027ea9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/syscallbypid.d @@ -0,0 +1,54 @@ +#!/usr/sbin/dtrace -s +/* + * syscallbypid.d - report on syscalls by PID. + * Written using DTrace (Solaris 10 3/05) + * + * $Id: syscallbypid.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: syscallbypid.d # hit Ctrl-C to end sample + * + * FIELDS: + * PID process ID + * CMD process name + * SYSCALL syscall name + * COUNT number of syscalls for this PID + * + * This is based on a script from DExplorer. + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 15-May-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +syscall:::entry +{ + @num[pid, execname, probefunc] = count(); +} + +dtrace:::END +{ + printf("%6s %-24s %-24s %8s\n", "PID", "CMD", "SYSCALL", "COUNT"); + printa("%6d %-24s %-24s %@8d\n", @num); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/syscallbyproc.d b/cddl/contrib/dtracetoolkit/Proc/syscallbyproc.d new file mode 100755 index 00000000000..d0faa75556e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/syscallbyproc.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * syscallbyproc.d - report on syscalls by process name . DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: syscallbyproc.d 3 2007-08-01 10:50:08Z brendan $ + */ + +syscall:::entry { @num[execname] = count(); } diff --git a/cddl/contrib/dtracetoolkit/Proc/threaded.d b/cddl/contrib/dtracetoolkit/Proc/threaded.d new file mode 100755 index 00000000000..7f5770b5482 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/threaded.d @@ -0,0 +1,66 @@ +#!/usr/sbin/dtrace -s +/* + * threaded.d - sample multi-threaded CPU usage. + * Written using DTrace (Solaris 10 3/05). + * + * This measures thread IDs as a process runs across multiple CPUs. + * It is a simple script that can help determine if a multi-threaded + * application is effectively using it's threads, or if the threads have + * serialised. See the example file in Docs/Examples/threaded_example.txt + * for a demonstration. + * + * $Id: threaded.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: threaded.d + * + * FIELDS: + * PID process ID + * CMD process name + * value thread ID + * count number of samples + * + * SEE ALSO: prstat -L + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * Author: Brendan Gregg [Sydney, Australia] + * + * 25-Jul-2005 Brendan Gregg Created this. + * 25-Jul-2005 " " Last update. + */ + +#pragma D option quiet + +/* + * Sample at 100 Hertz + */ +profile:::profile-100 +/pid != 0/ +{ + @sample[pid, execname] = lquantize(tid, 0, 128, 1); +} + +/* + * Print output every 1 second + */ +profile:::tick-1sec +{ + printf("%Y,\n", walltimestamp); + printa("\n PID: %-8d CMD: %s\n%@d", @sample); + printf("\n"); + trunc(@sample); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/topsysproc b/cddl/contrib/dtracetoolkit/Proc/topsysproc new file mode 100755 index 00000000000..5836f6848bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/topsysproc @@ -0,0 +1,121 @@ +#!/usr/bin/sh +# +# topsysproc - display top syscalls by process name. +# Written using DTrace (Solaris 10 3/05). +# +# This program continually prints a report of the number of system calls +# by process name, and refreshes the display every 1 second or as specified +# at the command line. Similar data can be fetched with "prstat -m". +# +# $Id: topsysproc 19 2007-09-12 07:47:59Z brendan $ +# +# USAGE: topsysproc [interval] +# +# FIELDS: +# load avg load averages, see uptime(1) +# syscalls total number of syscalls in this interval +# PROCESS process name +# COUNT number of occurances in this interval +# +# NOTE: There may be several PIDs with the same process name. +# +# SEE ALSO: prstat(1M) +# +# INSPIRATION: top(1) by William LeFebvre +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# 13-Jun-2005 Brendan Gregg Created this. +# 20-Apr-2006 " " Last update. +# + +# +# Check options +# +if [ "$1" = "-h" -o "$1" = "--help" ]; then + cat <<-END + USAGE: topsysproc [interval] + eg, + topsysproc # default, 1 second updates + topsysproc 5 # 5 second updates + END + exit 1 +fi +interval=1 +if [ "$1" -gt 0 ]; then + interval=$1 +fi + +# +# Run DTrace +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + #pragma D option destructive + + /* constants */ + inline int INTERVAL = '$interval'; + inline int SCREEN = 20; + + /* variables */ + dtrace:::BEGIN + { + secs = 0; + printf("Tracing... Please wait.\n"); + } + + /* record syscall event */ + syscall:::entry + { + @Name[execname] = count(); + @Total = count(); + } + + /* update screen */ + profile:::tick-1sec + /++secs >= INTERVAL/ + { + /* fetch load averages */ + this->load1a = `hp_avenrun[0] / 65536; + this->load5a = `hp_avenrun[1] / 65536; + this->load15a = `hp_avenrun[2] / 65536; + this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; + this->load5b = ((`hp_avenrun[1] % 65536) * 100) / 65536; + this->load15b = ((`hp_avenrun[2] % 65536) * 100) / 65536; + + /* clear screen */ + system("clear"); + + /* print load average */ + printf("%Y, load average: %d.%02d, %d.%02d, %d.%02d", + walltimestamp, this->load1a, this->load1b, this->load5a, + this->load5b, this->load15a, this->load15b); + + /* print syscall count */ + printa(" syscalls: %@d\n",@Total); + + /* print report */ + trunc(@Name, SCREEN); + printf("\n %-25s %12s\n", "PROCESS", "COUNT"); + printa(" %-25s %@12d\n", @Name); + + /* reset variables */ + trunc(@Name); + clear(@Total); + secs = 0; + } +' diff --git a/cddl/contrib/dtracetoolkit/Proc/writebytes.d b/cddl/contrib/dtracetoolkit/Proc/writebytes.d new file mode 100755 index 00000000000..1fec0e9c22b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/writebytes.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * writebytes.d - write bytes by process name. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: writebytes.d 3 2007-08-01 10:50:08Z brendan $ + */ + +sysinfo:::writech { @bytes[execname] = sum(arg0); } diff --git a/cddl/contrib/dtracetoolkit/Proc/writedist.d b/cddl/contrib/dtracetoolkit/Proc/writedist.d new file mode 100755 index 00000000000..099c2525b6c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/writedist.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * writedist.d - write distribution by process name. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: writedist.d 3 2007-08-01 10:50:08Z brendan $ + */ + +sysinfo:::writech { @dist[execname] = quantize(arg0); } diff --git a/cddl/contrib/dtracetoolkit/Python/Readme b/cddl/contrib/dtracetoolkit/Python/Readme new file mode 100644 index 00000000000..f183c74fe64 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/Readme @@ -0,0 +1,28 @@ +Python - DTracing Python + + These scripts trace the Python programming language, and require a version + of Python which has been built with DTrace probes. + + The Python DTrace provider was originally written by John Levon, and + was integrated into Solaris Nevada in build 65. If you are on a different + OS with DTrace and would like to use these scripts, you could download + Python and the Python DTrace provider patch listed in the comments here, + + http://blogs.sun.com/levon/entry/python_and_dtrace_in_build + + You will need patch and build Python for these probes to work. + Or, check if a pre-built package is available someone on opensolaris.org. + + Since the DTrace Python provider may be developed further, there is a chance + that it has changed slightly by the time you are reading this, causing + these scripts to either break or behave oddly. Firstly, check for newer + versions of the DTraceToolkit; if it hasn't been updated and you need + to use these scripts immediately, then updating them shouldn't take + too long. The following was the state of the provider when these scripts + were written - check for changes and update the scripts accordingly, + + provider python { + probe function-entry(file, subroutine, lineno) + probe function-return(file, subroutine, lineno) + }; + diff --git a/cddl/contrib/dtracetoolkit/Python/py_calldist.d b/cddl/contrib/dtracetoolkit/Python/py_calldist.d new file mode 100755 index 00000000000..1c64c10797f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_calldist.d @@ -0,0 +1,82 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_calldist.d - measure Python elapsed times for functions. + * Written for the Python DTrace provider. + * + * $Id: py_calldist.d 28 2007-09-13 10:49:37Z brendan $ + * + * This traces Python activity from all programs running on the system with + * Python provider support. + * + * USAGE: py_calldist.d # hit Ctrl-C to end + * + * This script prints distribution plots of elapsed time for Python + * operations. Use py_calltime.d for summary reports. + * + * FIELDS: + * 1 Filename of the Python program + * 2 Type of call (func) + * 3 Name of call + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +python*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = timestamp; +} + +python*:::function-return +/self->function[self->depth]/ +{ + this->elapsed_incl = timestamp - self->function[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @types_incl[this->file, "func", this->name] = + quantize(this->elapsed_incl / 1000); + @types_excl[this->file, "func", this->name] = + quantize(this->elapsed_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +dtrace:::END +{ + printf("\nExclusive function elapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_excl); + + printf("\nInclusive function elapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_calltime.d b/cddl/contrib/dtracetoolkit/Python/py_calltime.d new file mode 100755 index 00000000000..d152b358d32 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_calltime.d @@ -0,0 +1,89 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_calltime.d - measure Python elapsed times for functions. + * Written for the Python DTrace provider. + * + * $Id: py_calltime.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces Python activity from all programs running on the system with + * Python provider support. + * + * USAGE: py_calltime.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Python program + * TYPE Type of call (func/total) + * NAME Name of call + * TOTAL Total elapsed time for calls (us) + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +python*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = timestamp; +} + +python*:::function-return +/self->function[self->depth]/ +{ + this->elapsed_incl = timestamp - self->function[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @num[this->file, "func", this->name] = count(); + @num["-", "total", "-"] = count(); + @types_incl[this->file, "func", this->name] = sum(this->elapsed_incl); + @types_excl[this->file, "func", this->name] = sum(this->elapsed_excl); + @types_excl["-", "total", "-"] = sum(this->elapsed_excl); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +dtrace:::END +{ + printf("\nCount,\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-20s %-10s %-32s %@8d\n", @num); + + normalize(@types_excl, 1000); + printf("\nExclusive function elapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_excl); + + normalize(@types_incl, 1000); + printf("\nInclusive function elapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_cpudist.d b/cddl/contrib/dtracetoolkit/Python/py_cpudist.d new file mode 100755 index 00000000000..cf0e7b2a241 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_cpudist.d @@ -0,0 +1,82 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_cpudist.d - measure Python on-CPU times for functions. + * Written for the Python DTrace provider. + * + * $Id: py_cpudist.d 28 2007-09-13 10:49:37Z brendan $ + * + * This traces Python activity from all programs running on the system with + * Python provider support. + * + * USAGE: py_cpudist.d # hit Ctrl-C to end + * + * This script prints distribution plots of elapsed time for Python + * operations. Use py_cputime.d for summary reports. + * + * FIELDS: + * 1 Filename of the Python program + * 2 Type of call (func) + * 3 Name of call + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +python*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = vtimestamp; +} + +python*:::function-return +/self->function[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->function[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @types_incl[this->file, "func", this->name] = + quantize(this->oncpu_incl / 1000); + @types_excl[this->file, "func", this->name] = + quantize(this->oncpu_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +dtrace:::END +{ + printf("\nExclusive function on-CPU times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_excl); + + printf("\nInclusive function on-CPU times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_cputime.d b/cddl/contrib/dtracetoolkit/Python/py_cputime.d new file mode 100755 index 00000000000..ca40a93abed --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_cputime.d @@ -0,0 +1,89 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_cputime.d - measure Python on-CPU times for functions. + * Written for the Python DTrace provider. + * + * $Id: py_cputime.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces Python activity from all programs running on the system with + * Python provider support. + * + * USAGE: py_cputime.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Python program + * TYPE Type of call (func/total) + * NAME Name of call (function name) + * TOTAL Total on-CPU time for calls (us) + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +python*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = vtimestamp; +} + +python*:::function-return +/self->function[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->function[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @num[this->file, "func", this->name] = count(); + @num["-", "total", "-"] = count(); + @types_incl[this->file, "func", this->name] = sum(this->oncpu_incl); + @types_excl[this->file, "func", this->name] = sum(this->oncpu_excl); + @types_excl["-", "total", "-"] = sum(this->oncpu_excl); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +dtrace:::END +{ + printf("\nCount,\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-20s %-10s %-32s %@8d\n", @num); + + normalize(@types_excl, 1000); + printf("\nExclusive function on-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_excl); + + normalize(@types_incl, 1000); + printf("\nInclusive function on-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_flow.d b/cddl/contrib/dtracetoolkit/Python/py_flow.d new file mode 100755 index 00000000000..893ea7802c9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_flow.d @@ -0,0 +1,70 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_flow.d - snoop Python execution showing function flow. + * Written for the Python DTrace provider. + * + * $Id: py_flow.d 51 2007-09-24 00:55:23Z brendan $ + * + * This traces Python activity from all Python programs on the system + * running with Python provider support. + * + * USAGE: py_flow.d # hit Ctrl-C to end + * + * This watches Python function entries and returns, and indents child + * function calls. + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * FILE Filename that this function belongs to + * FUNC Function name + * + * LEGEND: + * -> function entry + * <- function return + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%3s %-16s %-16s -- %s\n", "C", "TIME(us)", "FILE", "FUNC"); +} + +python*:::function-entry +{ + printf("%3d %-16d %-16s %*s-> %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg1)); + self->depth++; +} + +python*:::function-return +{ + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %-16d %-16s %*s<- %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg1)); +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_flowinfo.d b/cddl/contrib/dtracetoolkit/Python/py_flowinfo.d new file mode 100755 index 00000000000..ccba1df7d36 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_flowinfo.d @@ -0,0 +1,86 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_flowinfo.d - snoop Python function flow with info using DTrace. + * Written for the Python DTrace provider. + * + * $Id: py_flowinfo.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces activity from all Python programs on the system that are + * running with Python provider support. + * + * USAGE: py_flowinfo.d # hit Ctrl-C to end + * + * FIELDS: + * C CPU-id + * PID Process ID + * DELTA(us) Elapsed time from previous line to this line + * FILE Filename of the Python program + * LINE Line number of filename + * TYPE Type of call (func) + * FUNC Python function + * + * LEGEND: + * -> function entry + * <- function return + * + * Filename and function names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)", + "FILE", "LINE", "TYPE", "FUNC"); +} + +python*:::function-entry, +python*:::function-return +/self->last == 0/ +{ + self->last = timestamp; +} + +python*:::function-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, this->delta, + basename(copyinstr(arg0)), arg2, "func", self->depth * 2, "", + copyinstr(arg1)); + self->depth++; + self->last = timestamp; +} + +python*:::function-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%d %6d %10d %16s:%-4d %-8s %*s<- %s\n", cpu, pid, this->delta, + basename(copyinstr(arg0)), arg2, "func", self->depth * 2, "", + copyinstr(arg1)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_flowtime.d b/cddl/contrib/dtracetoolkit/Python/py_flowtime.d new file mode 100755 index 00000000000..a339eace3ae --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_flowtime.d @@ -0,0 +1,89 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_flowtime.d - snoop Python functions with flow and delta times. + * Written for the Python DTrace provider. + * + * $Id: py_flowtime.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces shell activity from Python programs on the system that are + * running with Python provider support. + * + * USAGE: py_flowtime.d # hit Ctrl-C to end + * + * This watches Python function entries and returns, and indents child + * function calls. + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * FILE Filename that this function belongs to + * DELTA(us) Elapsed time from previous line to this line + * FUNC Python function name + * + * LEGEND: + * -> function entry + * <- function return + * + * Filename and function names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +self int last; + +dtrace:::BEGIN +{ + printf("%3s %-16s %-16s %9s -- %s\n", "C", "TIME(us)", "FILE", + "DELTA(us)", "FUNC"); +} + +python*:::function-entry, +python*:::function-return +/self->last == 0/ +{ + self->last = timestamp; +} + +python*:::function-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %-16d %-16s %9d %*s-> %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), this->delta, self->depth * 2, "", + copyinstr(arg1)); + self->depth++; + self->last = timestamp; +} + +python*:::function-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %-16d %-16s %9d %*s<- %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), this->delta, self->depth * 2, "", + copyinstr(arg1)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_funccalls.d b/cddl/contrib/dtracetoolkit/Python/py_funccalls.d new file mode 100755 index 00000000000..b430f293e2b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_funccalls.d @@ -0,0 +1,55 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_funccalls.d - measure Python function calls using DTrace. + * Written for the Python DTrace provider. + * + * $Id: py_funccalls.d 25 2007-09-12 09:51:58Z brendan $ + * + * This traces Python activity from all running programs on the system + * which support the Python DTrace provider. + * + * USAGE: py_funccalls.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename that contained the function + * FUNC Python function name + * CALLS Function calls during this sample + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +python*:::function-entry +{ + @funcs[basename(copyinstr(arg0)), copyinstr(arg1)] = count(); +} + +dtrace:::END +{ + printf(" %-32s %-32s %8s\n", "FILE", "FUNC", "CALLS"); + printa(" %-32s %-32s %@8d\n", @funcs); +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_malloc.d b/cddl/contrib/dtracetoolkit/Python/py_malloc.d new file mode 100755 index 00000000000..7f0860ea636 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_malloc.d @@ -0,0 +1,81 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_malloc.d - Python libc malloc analysis. + * Written for the Python DTrace provider. + * + * $Id: py_malloc.d 19 2007-09-12 07:47:59Z brendan $ + * + * This is an expiremental script to identify who is calling malloc() for + * memory allocation, and to print distribution plots of the requested bytes. + * If a malloc() occured while in a Python function, then that function is + * identified as responsible; else the caller of malloc() is identified as + * responsible - which will be a function from the Python engine. + * + * USAGE: py_malloc.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +python$target:::function-entry +{ + self->file = basename(copyinstr(arg0)); + self->name = copyinstr(arg1); +} + +python$target:::function-return +{ + self->file = 0; + self->name = 0; +} + +pid$target:libc:malloc:entry +/self->file != NULL/ +{ + @malloc_func_size[self->file, self->name] = sum(arg0); + @malloc_func_dist[self->file, self->name] = quantize(arg0); +} + +pid$target:libc:malloc:entry +/self->name == NULL/ +{ + @malloc_lib_size[usym(ucaller)] = sum(arg0); + @malloc_lib_dist[usym(ucaller)] = quantize(arg0); +} + + +dtrace:::END +{ + printf("\nPython malloc byte distributions by engine caller,\n\n"); + printa(" %A, total bytes = %@d %@d\n", @malloc_lib_size, + @malloc_lib_dist); + + printf("\nPython malloc byte distributions by Python file and "); + printf("function,\n\n"); + printa(" %s, %s, bytes total = %@d %@d\n", @malloc_func_size, + @malloc_func_dist); +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_mallocstk.d b/cddl/contrib/dtracetoolkit/Python/py_mallocstk.d new file mode 100755 index 00000000000..ca428016b47 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_mallocstk.d @@ -0,0 +1,49 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_mallocstk.d - Python libc malloc analysis with full stack traces. + * Written for the Python DTrace provider. + * + * $Id: py_mallocstk.d 19 2007-09-12 07:47:59Z brendan $ + * + * USAGE: py_mallocstk.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +/* tune as desired, */ +#pragma D option jstackframes=64 +#pragma D option jstackstrsize=1024 + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +pid$target:libc:malloc:entry +{ + @mallocs[jstack()] = quantize(arg0); +} + +dtrace:::END +{ + printf("\nPython malloc byte distributions by stack trace,\n\n"); + printa(@mallocs); +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_profile.d b/cddl/contrib/dtracetoolkit/Python/py_profile.d new file mode 100755 index 00000000000..ff02df6e932 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_profile.d @@ -0,0 +1,79 @@ +#!/usr/sbin/dtrace -CZs +/* + * py_profile.d - sample stack traces with Python translations using DTrace. + * Written for the Python DTrace provider. + * + * $Id: py_profile.d 19 2007-09-12 07:47:59Z brendan $ + * + * USAGE: py_profile.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * This samples stack traces for the process specified. This stack trace + * will cross the Python engine and system libraries, and insert + * translations for Python stack frames where appropriate. This is best + * explained with an example stack frame output, + * + * libpython2.4.so.1.0`PyEval_EvalFrame+0x2fbf + * [ ./func_loop.py:5 (func_c) ] + * libpython2.4.so.1.0`fast_function+0xa8 + * libpython2.4.so.1.0`call_function+0xda + * libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + * [ ./func_loop.py:11 (func_b) ] + * libpython2.4.so.1.0`fast_function+0xa8 + * libpython2.4.so.1.0`call_function+0xda + * libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + * [ ./func_loop.py:14 (func_a) ] + * libpython2.4.so.1.0`fast_function+0xa8 + * libpython2.4.so.1.0`call_function+0xda + * libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + * [ ./func_loop.py:16 (?) ] + * + * The lines in square brackets are the native Python frames, the rest + * are the Python engine. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option jstackstrsize=1024 + +/* + * Tunables + */ +#define DEPTH 10 /* stack depth, frames */ +#define RATE 1001 /* sampling rate, Hertz */ +#define TOP 25 /* number of stacks to output */ + +dtrace:::BEGIN +{ + printf("Sampling %d-level stacks at %d Hertz... Hit Ctrl-C to end.\n", + DEPTH, RATE); +} + +profile-RATE +/pid == $target/ +{ + @stacks[jstack(DEPTH)] = count(); +} + +dtrace:::END +{ + trunc(@stacks, TOP); + printf("Top %d most frequently sampled stacks,\n", TOP); + printa(@stacks); +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_syscalls.d b/cddl/contrib/dtracetoolkit/Python/py_syscalls.d new file mode 100755 index 00000000000..2b3e44dc80b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_syscalls.d @@ -0,0 +1,63 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_syscalls.d - count Python function calls and syscalls using DTrace. + * Written for the Python DTrace provider. + * + * $Id: py_syscalls.d 25 2007-09-12 09:51:58Z brendan $ + * + * USAGE: py_syscalls.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Python program + * TYPE Type of call (func/syscall) + * NAME Name of call + * COUNT Number of calls during sample + * + * Filename and function names are printed if available. + * The filename for syscalls may be printed as "python", if the program + * was invoked using the form "python filename" rather than running the + * program with an interpreter line. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +python$target:::function-entry +{ + @calls[basename(copyinstr(arg0)), "func", copyinstr(arg1)] = count(); +} + +syscall:::entry +/pid == $target/ +{ + @calls[basename(execname), "syscall", probefunc] = count(); +} + +dtrace:::END +{ + printf("\nCalls for PID %d,\n\n", $target); + printf(" %-32s %-10s %-22s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-32s %-10s %-22s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_syscolors.d b/cddl/contrib/dtracetoolkit/Python/py_syscolors.d new file mode 100755 index 00000000000..9f958ef2353 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_syscolors.d @@ -0,0 +1,116 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_syscolors.d - trace Python function flow plus syscalls, in color. + * Written for the Python DTrace provider. + * + * $Id: py_syscolors.d 27 2007-09-13 09:26:01Z brendan $ + * + * USAGE: py_syscolors.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * This watches Python function entries and returns, and indents child + * function calls. + * + * FIELDS: + * C CPU-id + * PID Process ID + * DELTA(us) Elapsed time from previous line to this line + * FILE Filename of the Python program + * LINE Line number of filename + * TYPE Type of call (func/syscall) + * NAME Python function or syscall name + * + * Filename and function names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + color_python = "\033[2;35m"; /* violet, faint */ + color_syscall = "\033[2;32m"; /* green, faint */ + color_off = "\033[0m"; /* default */ + + self->depth = 0; + printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)", + "FILE", "LINE", "TYPE", "NAME"); +} + +python$target:::function-entry, +python$target:::function-return, +syscall:::entry, +syscall:::return +/self->last == 0 && pid == $target/ +{ + self->last = timestamp; +} + +python$target:::function-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_python, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "func", + self->depth * 2, "", copyinstr(arg1), color_off); + self->depth++; + self->last = timestamp; +} + +python$target:::function-return +{ + this->delta = (timestamp - self->last) / 1000; + this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_python, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "func", + self->depth * 2, "", copyinstr(arg1), color_off); + self->last = timestamp; +} + +syscall:::entry +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:- %-8s %*s-> %s%s\n", color_syscall, + cpu, pid, this->delta, "\"", "syscall", self->depth * 2, "", + probefunc, color_off); + self->last = timestamp; +} + +syscall:::return +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_syscall, + cpu, pid, this->delta, "\"", "syscall", self->depth * 2, "", + probefunc, color_off); + self->last = timestamp; +} + +proc:::exit +/pid == $target/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Python/py_who.d b/cddl/contrib/dtracetoolkit/Python/py_who.d new file mode 100755 index 00000000000..3a772e34d85 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Python/py_who.d @@ -0,0 +1,56 @@ +#!/usr/sbin/dtrace -Zs +/* + * py_who.d - trace Python function execution by process using DTrace. + * Written for the Python DTrace provider. + * + * $Id: py_who.d 25 2007-09-12 09:51:58Z brendan $ + * + * This traces Python activity from all Python programs on the system that are + * running with Python provider support. + * + * USAGE: py_who.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID of Python + * UID User ID of the owner + * FUNCS Number of function calls + * FILE Pathname of the Python program + * + * Filenames are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +python*:::function-entry +{ + @lines[pid, uid, copyinstr(arg0)] = count(); +} + +dtrace:::END +{ + printf(" %6s %6s %6s %s\n", "PID", "UID", "FUNCS", "FILE"); + printa(" %6d %6d %@6d %s\n", @lines); +} diff --git a/cddl/contrib/dtracetoolkit/README b/cddl/contrib/dtracetoolkit/README new file mode 120000 index 00000000000..216661b1bdd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/README @@ -0,0 +1 @@ +Guide \ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Ruby/Readme b/cddl/contrib/dtracetoolkit/Ruby/Readme new file mode 100644 index 00000000000..9dc3cc30398 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/Readme @@ -0,0 +1,31 @@ +Ruby - DTracing Ruby + + These scripts trace activity of the Ruby programming language, and + require the DTrace Ruby provider written by Joyent. + + Currently, the DTrace Ruby provider is a seperate download either in + patch, source or binary form. Start with the "Ruby DTrace" link on + http://dtrace.joyent.com/, and after getting a version running, the + scripts in this directory should work. + + Since the DTrace Ruby provider is under development, there is a chance + that it has changed slightly by the time you are reading this, causing + these scripts to either break or behave oddly. Firstly, check for newer + versions of the DTraceToolkit; if it hasn't been updated and you need + to use these scripts immediately, then updating them shouldn't take + too long. The following was the state of the provider when these scripts + were written - check for changes and update the scripts accordingly, + + provider ruby { + probe function-entry(class, method, file, lineno); + probe function-return(class, method, file, lineno); + probe raise(errinfo, file, lineno); + probe rescue(file, lineno); + probe line(file, lineno); + probe gc-begin(); + probe gc-end(); + probe object-create-start(object, file, lineno); + probe object-create-done(object, file, lineno); + probe object-free(object); + }; + diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_calldist.d b/cddl/contrib/dtracetoolkit/Ruby/rb_calldist.d new file mode 100755 index 00000000000..e3018eaf976 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_calldist.d @@ -0,0 +1,120 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_calldist.d - measure Ruby elapsed times for types of operation. + * Written for the Ruby DTrace provider. + * + * $Id: rb_calldist.d 28 2007-09-13 10:49:37Z brendan $ + * + * This traces Ruby activity from all programs running on the system with + * Ruby provider support. + * + * USAGE: rb_calldist.d # hit Ctrl-C to end + * + * This script prints distribution plots of elapsed time for Ruby + * operations. Use rb_calltime.d for summary reports. + * + * FIELDS: + * 1 Filename of the Ruby program + * 2 Type of call (method/obj-new/gc) + * 3 Name of call + * + * Filename and method names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +ruby*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = timestamp; +} + +ruby*:::function-return +/self->function[self->depth]/ +{ + this->elapsed_incl = timestamp - self->function[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg2)); + this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); + + @types_incl[this->file, "func", this->name] = + quantize(this->elapsed_incl / 1000); + @types_excl[this->file, "func", this->name] = + quantize(this->elapsed_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +ruby*:::object-create-start +{ + self->object = timestamp; +} + +ruby*:::object-create-done +/self->object/ +{ + this->elapsed = timestamp - self->object; + self->object = 0; + this->file = basename(copyinstr(arg1)); + this->file = this->file != NULL ? this->file : "."; + + @types[this->file, "obj-new", copyinstr(arg0)] = + quantize(this->elapsed / 1000); + + self->exclude[self->depth] += this->elapsed; +} + +ruby*:::gc-begin +{ + self->gc = timestamp; +} + +ruby*:::gc-end +/self->gc/ +{ + this->elapsed = timestamp - self->gc; + self->gc = 0; + + @types[".", "gc", "-"] = quantize(this->elapsed / 1000); + + self->exclude[self->depth] += this->elapsed; +} + +dtrace:::END +{ + printf("\nElapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types); + + printf("\nExclusive function elapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_excl); + + printf("\nInclusive function elapsed times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_calls.d b/cddl/contrib/dtracetoolkit/Ruby/rb_calls.d new file mode 100755 index 00000000000..10e3b5a75bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_calls.d @@ -0,0 +1,87 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_calls.d - count Ruby calls using DTrace. + * Written for the Ruby DTrace provider. + * + * $Id: rb_calls.d 28 2007-09-13 10:49:37Z brendan $ + * + * This traces activity from all Ruby programs on the system that are + * running with Ruby provider support. + * + * USAGE: rb_calls.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Ruby program + * TYPE Type of call (method/obj-new/...) + * NAME Descriptive name of call + * COUNT Number of calls during sample + * + * Filename and method names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +ruby*:::function-entry +{ + this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); + @calls[basename(copyinstr(arg2)), "method", this->name] = count(); +} + +ruby*:::object-create-start +{ + this->name = copyinstr(arg0); + this->filename = basename(copyinstr(arg1)); + this->filename = this->filename != NULL ? this->filename : "."; + @calls[this->filename, "obj-new", this->name] = count(); +} + +ruby*:::object-free +{ + this->name = copyinstr(arg0); + @calls[".", "obj-free", this->name] = count(); +} + +ruby*:::gc-begin +{ + @calls[".", "gc", "begin"] = count(); +} + +ruby*:::raise +{ + this->name = copyinstr(arg0); + @calls[basename(copyinstr(arg1)), "raise", this->name] = count(); +} + +ruby*:::rescue +{ + @calls[basename(copyinstr(arg0)), "rescue", "-"] = count(); +} + +dtrace:::END +{ + printf(" %-24s %-10s %-30s %8s\n", "FILE", "TYPE", "NAME", "CALLS"); + printa(" %-24s %-10s %-30s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_calltime.d b/cddl/contrib/dtracetoolkit/Ruby/rb_calltime.d new file mode 100755 index 00000000000..fac1261f917 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_calltime.d @@ -0,0 +1,129 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_calltime.d - measure Ruby elapsed times for types of operation. + * Written for the Ruby DTrace provider. + * + * $Id: rb_calltime.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces Ruby activity from all programs running on the system with + * Ruby provider support. + * + * USAGE: rb_calltime.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Ruby program + * TYPE Type of call (method/obj-new/gc/total) + * NAME Name of call + * TOTAL Total elapsed time for calls (us) + * + * Filename and method names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +ruby*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = timestamp; +} + +ruby*:::function-return +/self->function[self->depth]/ +{ + this->elapsed_incl = timestamp - self->function[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg2)); + this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); + + @num[this->file, "func", this->name] = count(); + @num["-", "total", "-"] = count(); + @types_incl[this->file, "func", this->name] = sum(this->elapsed_incl); + @types_excl[this->file, "func", this->name] = sum(this->elapsed_excl); + @types_excl["-", "total", "-"] = sum(this->elapsed_excl); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +ruby*:::object-create-start +{ + self->object = timestamp; +} + +ruby*:::object-create-done +/self->object/ +{ + this->elapsed = timestamp - self->object; + self->object = 0; + this->file = basename(copyinstr(arg1)); + this->file = this->file != NULL ? this->file : "."; + this->name = copyinstr(arg0); + + @num[this->file, "obj-new", this->name] = count(); + @types[this->file, "obj-new", this->name] = sum(this->elapsed); + + self->exclude[self->depth] += this->elapsed; +} + +ruby*:::gc-begin +{ + self->gc = timestamp; +} + +ruby*:::gc-end +/self->gc/ +{ + this->elapsed = timestamp - self->gc; + self->gc = 0; + @num[".", "gc", "-"] = count(); + @types[".", "gc", "-"] = sum(this->elapsed); + self->exclude[self->depth] += this->elapsed; +} + +dtrace:::END +{ + printf("\nCount,\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-20s %-10s %-32s %@8d\n", @num); + + normalize(@types, 1000); + printf("\nElapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types); + + normalize(@types_excl, 1000); + printf("\nExclusive function elapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_excl); + + normalize(@types_incl, 1000); + printf("\nInclusive function elapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_cpudist.d b/cddl/contrib/dtracetoolkit/Ruby/rb_cpudist.d new file mode 100755 index 00000000000..daa4d1a8296 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_cpudist.d @@ -0,0 +1,120 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_cpudist.d - measure Ruby on-CPU times for types of operation. + * Written for the Ruby DTrace provider. + * + * $Id: rb_cpudist.d 28 2007-09-13 10:49:37Z brendan $ + * + * This traces Ruby activity from all programs running on the system with + * Ruby provider support. + * + * USAGE: rb_cpudist.d # hit Ctrl-C to end + * + * This script prints distribution plots of elapsed time for Ruby + * operations. Use rb_cputime.d for summary reports. + * + * FIELDS: + * 1 Filename of the Ruby program + * 2 Type of call (method/obj-new/gc) + * 3 Name of call + * + * Filename and method names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +ruby*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = vtimestamp; +} + +ruby*:::function-return +/self->function[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->function[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg2)); + this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); + + @types_incl[this->file, "func", this->name] = + quantize(this->oncpu_incl / 1000); + @types_excl[this->file, "func", this->name] = + quantize(this->oncpu_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +ruby*:::object-create-start +{ + self->object = vtimestamp; +} + +ruby*:::object-create-done +/self->object/ +{ + this->oncpu = vtimestamp - self->object; + self->object = 0; + this->file = basename(copyinstr(arg1)); + this->file = this->file != NULL ? this->file : "."; + + @types[this->file, "obj-new", copyinstr(arg0)] = + quantize(this->oncpu / 1000); + + self->exclude[self->depth] += this->oncpu; +} + +ruby*:::gc-begin +{ + self->gc = vtimestamp; +} + +ruby*:::gc-end +/self->gc/ +{ + this->oncpu = vtimestamp - self->gc; + self->gc = 0; + + @types[".", "gc", "-"] = quantize(this->oncpu / 1000); + + self->exclude[self->depth] += this->oncpu; +} + +dtrace:::END +{ + printf("\nOn-CPU times (us),\n"); + printa(" %s, %s, %s %@d\n", @types); + + printf("\nExclusive function on-CPU times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_excl); + + printf("\nInclusive function on-CPU times (us),\n"); + printa(" %s, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_cputime.d b/cddl/contrib/dtracetoolkit/Ruby/rb_cputime.d new file mode 100755 index 00000000000..d5885c8188a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_cputime.d @@ -0,0 +1,129 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_cputime.d - measure Ruby on-CPU times for types of operation. + * Written for the Ruby DTrace provider. + * + * $Id: rb_cputime.d 49 2007-09-17 12:03:20Z brendan $ + * + * This traces Ruby activity from all programs running on the system with + * Ruby provider support. + * + * USAGE: rb_cputime.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Ruby program + * TYPE Type of call (method/obj-new/gc/total) + * NAME Name of call + * TOTAL Total on-CPU time for calls (us) + * + * Filename and method names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +ruby*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = vtimestamp; +} + +ruby*:::function-return +/self->function[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->function[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg2)); + this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); + + @num[this->file, "func", this->name] = count(); + @num["-", "total", "-"] = count(); + @types_incl[this->file, "func", this->name] = sum(this->oncpu_incl); + @types_excl[this->file, "func", this->name] = sum(this->oncpu_excl); + @types_excl["-", "total", "-"] = sum(this->oncpu_excl); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +ruby*:::object-create-start +{ + self->object = vtimestamp; +} + +ruby*:::object-create-done +/self->object/ +{ + this->oncpu = vtimestamp - self->object; + self->object = 0; + this->file = basename(copyinstr(arg1)); + this->file = this->file != NULL ? this->file : "."; + this->name = copyinstr(arg0); + + @num[this->file, "obj-new", this->name] = count(); + @types[this->file, "obj-new", this->name] = sum(this->oncpu); + + self->exclude[self->depth] += this->oncpu; +} + +ruby*:::gc-begin +{ + self->gc = vtimestamp; +} + +ruby*:::gc-end +/self->gc/ +{ + this->oncpu = vtimestamp - self->gc; + self->gc = 0; + @num[".", "gc", "-"] = count(); + @types[".", "gc", "-"] = sum(this->oncpu); + self->exclude[self->depth] += this->oncpu; +} + +dtrace:::END +{ + printf("\nCount,\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-20s %-10s %-32s %@8d\n", @num); + + normalize(@types, 1000); + printf("\nElapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types); + + normalize(@types_excl, 1000); + printf("\nExclusive function on-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_excl); + + normalize(@types_incl, 1000); + printf("\nInclusive function on-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_flow.d b/cddl/contrib/dtracetoolkit/Ruby/rb_flow.d new file mode 100755 index 00000000000..e4ff7600153 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_flow.d @@ -0,0 +1,72 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_flow.d - snoop Ruby execution showing method flow using DTrace. + * Written for the Ruby DTrace provider. + * + * $Id: rb_flow.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces activity from all Ruby programs on the system that are + * running with Ruby provider support. + * + * USAGE: rb_flow.d # hit Ctrl-C to end + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * FILE Filename that this method belongs to + * CLASS::METHOD Ruby classname and method + * + * LEGEND: + * -> method entry + * <- method return + * + * Filename and method names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%3s %-16s %-22s -- %s\n", "C", "TIME(us)", "FILE", + "CLASS::METHOD"); +} + +ruby*:::function-entry +{ + printf("%3d %-16d %-22s %*s-> %s::%s\n", cpu, timestamp / 1000, + basename(copyinstr(arg2)), self->depth * 2, "", copyinstr(arg0), + copyinstr(arg1)); + self->depth++; +} + +ruby*:::function-return +{ + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %-16d %-22s %*s<- %s::%s\n", cpu, timestamp / 1000, + basename(copyinstr(arg2)), self->depth * 2, "", copyinstr(arg0), + copyinstr(arg1)); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_flowinfo.d b/cddl/contrib/dtracetoolkit/Ruby/rb_flowinfo.d new file mode 100755 index 00000000000..4657263a0b3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_flowinfo.d @@ -0,0 +1,88 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_flowinfo.d - snoop Ruby function (method) flow with info using DTrace. + * Written for the Ruby DTrace provider. + * + * $Id: rb_flowinfo.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces activity from all Ruby programs on the system that are + * running with Ruby provider support. + * + * USAGE: rb_flowinfo.d # hit Ctrl-C to end + * + * FIELDS: + * C CPU-id + * PID Process ID + * DELTA(us) Elapsed time from previous line to this line + * FILE Filename of the Ruby program + * LINE Line number of filename + * TYPE Type of call (method) + * NAME Ruby class and method name + * + * LEGEND: + * -> method entry + * <- method return + * + * Filename and method names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)", + "FILE", "LINE", "TYPE", "NAME"); +} + +ruby*:::function-entry, +ruby*:::function-return +/self->last == 0/ +{ + self->last = timestamp; +} + +ruby*:::function-entry +{ + this->delta = (timestamp - self->last) / 1000; + this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); + printf("%d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, this->delta, + basename(copyinstr(arg2)), arg3, "method", self->depth * 2, "", + this->name); + self->depth++; + self->last = timestamp; +} + +ruby*:::function-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); + printf("%d %6d %10d %16s:%-4d %-8s %*s<- %s\n", cpu, pid, this->delta, + basename(copyinstr(arg2)), arg3, "method", self->depth * 2, "", + this->name); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_flowtime.d b/cddl/contrib/dtracetoolkit/Ruby/rb_flowtime.d new file mode 100755 index 00000000000..9b1c66803b2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_flowtime.d @@ -0,0 +1,84 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_flowtime.d - snoop Ruby function (method) flow using DTrace. + * Written for the Ruby DTrace provider. + * + * $Id: rb_flowtime.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces activity from all Ruby programs on the system that are + * running with Ruby provider support. + * + * USAGE: rb_flowtime.d # hit Ctrl-C to end + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * FILE Filename that this method belongs to + * DELTA(us) Elapsed time from previous line to this line + * CLASS::METHOD Ruby class and method name + * + * LEGEND: + * -> method entry + * <- method return + * + * Filename and method names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%3s %-16s %-16s %9s -- %s\n", "C", "TIME(us)", "FILE", + "DELTA(us)", "CLASS::METHOD"); +} + +ruby*:::function-entry, +ruby*:::function-return +/self->last == 0/ +{ + self->last = timestamp; +} + +ruby*:::function-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %-16d %-16s %9d %*s-> %s::%s\n", cpu, timestamp / 1000, + basename(copyinstr(arg2)), this->delta, self->depth * 2, "", + copyinstr(arg0), copyinstr(arg1)); + self->depth++; + self->last = timestamp; +} + +ruby*:::function-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %-16d %-16s %9d %*s<- %s::%s\n", cpu, timestamp / 1000, + basename(copyinstr(arg2)), this->delta, self->depth * 2, "", + copyinstr(arg0), copyinstr(arg1)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_funccalls.d b/cddl/contrib/dtracetoolkit/Ruby/rb_funccalls.d new file mode 100755 index 00000000000..76215006cfb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_funccalls.d @@ -0,0 +1,57 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_funccalls.d - count Ruby function (method) calls using DTrace. + * Written for the Ruby DTrace provider. + * + * $Id: rb_funccalls.d 20 2007-09-12 09:28:22Z brendan $ + * + * This traces activity from all Ruby programs on the system that are + * running with Ruby provider support. + * + * USAGE: rb_funccalls.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Ruby program + * METHOD Method name + * COUNT Number of calls during sample + * + * Filename and method names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +ruby*:::function-entry +{ + @funcs[basename(copyinstr(arg2)), copyinstr(arg0), copyinstr(arg1)] = + count(); +} + +dtrace:::END +{ + printf(" %-32.32s %-16s %-16s %8s\n", "FILE", "CLASS", "METHOD", + "CALLS"); + printa(" %-32.32s %-16s %-16s %@8d\n", @funcs); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_lines.d b/cddl/contrib/dtracetoolkit/Ruby/rb_lines.d new file mode 100755 index 00000000000..438f1f11a67 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_lines.d @@ -0,0 +1,55 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_lines.d - trace Ruby line execution by process using DTrace. + * Written for the Ruby DTrace provider. + * + * $Id: rb_lines.d 20 2007-09-12 09:28:22Z brendan $ + * + * This traces Ruby activity from all Ruby programs on the system that are + * running with Ruby provider support. + * + * USAGE: rb_who.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Ruby program + * LINE Line number + * COUNT Number of times a line was executed + * + * Filenames are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +ruby*:::line +{ + @calls[basename(copyinstr(arg0)), arg1] = count(); +} + +dtrace:::END +{ + printf(" %32s:%-6s %10s\n", "FILE", "LINE", "COUNT"); + printa(" %32s:%-6d %@10d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_malloc.d b/cddl/contrib/dtracetoolkit/Ruby/rb_malloc.d new file mode 100755 index 00000000000..891b8405029 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_malloc.d @@ -0,0 +1,80 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_malloc.d - Ruby operations and libc malloc statistics. + * Written for the Ruby DTrace provider. + * + * $Id: rb_malloc.d 20 2007-09-12 09:28:22Z brendan $ + * + * WARNING: This script is not 100% accurate; This prints libc malloc() byte + * distributions by "recent" Ruby operation, which we hope will be usually + * relevant. This is an experimental script that may be improved over time. + * + * USAGE: rb_malloc.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * FIELDS: + * 1 Filename of the Ruby program + * 2 Type of operation (method/objnew/startup) + * 3 Name of operation + * + * Filename and method names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +self string filename; + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +ruby$target:::function-entry +{ + self->file = basename(copyinstr(arg2)); + self->type = "method"; + self->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); +} + +ruby$target:::object-create-start +{ + self->file = basename(copyinstr(arg1)); + self->type = "objnew"; + self->name = copyinstr(arg0); +} + +pid$target:libc:malloc:entry +/self->file != NULL/ +{ + @mallocs[self->file, self->type, self->name] = quantize(arg0); +} + +pid$target:libc:malloc:entry +/self->file == NULL/ +{ + @mallocs["ruby", "startup", "-"] = quantize(arg0); +} + + +dtrace:::END +{ + printf("Ruby malloc byte distributions by recent Ruby operation,\n"); + printa(" %s, %s, %s %@d\n", @mallocs); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_objcpu.d b/cddl/contrib/dtracetoolkit/Ruby/rb_objcpu.d new file mode 100755 index 00000000000..23c55e88592 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_objcpu.d @@ -0,0 +1,61 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_objcpu.d - measure Ruby object creation on-CPU time using DTrace. + * Written for the Ruby DTrace provider. + * + * $Id: rb_objcpu.d 20 2007-09-12 09:28:22Z brendan $ + * + * This traces Ruby activity from all programs running on the system with + * Ruby provider support. + * + * USAGE: rb_objcpu.d # hit Ctrl-C to end + * + * Class names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +ruby*:::object-create-start +{ + self->vstart = vtimestamp; +} + +ruby*:::object-create-done +/self->vstart/ +{ + this->oncpu = vtimestamp - self->vstart; + @total = sum(this->oncpu); + @dist[copyinstr(arg0)] = quantize(this->oncpu / 1000); + self->vstart = 0; +} + +dtrace:::END +{ + normalize(@total, 1000000); + printa("Total object creation on-CPU time (ms): %@d\n\n", @total); + printf("Object creation on-CPU time distributions (us),\n"); + printa(@dist); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_objnew.d b/cddl/contrib/dtracetoolkit/Ruby/rb_objnew.d new file mode 100755 index 00000000000..f6f00f1d7af --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_objnew.d @@ -0,0 +1,55 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_objnew.d - count Ruby object creation using DTrace. + * Written for the Ruby DTrace provider. + * + * $Id: rb_objnew.d 20 2007-09-12 09:28:22Z brendan $ + * + * This traces Ruby activity from all programs running on the system with + * Ruby provider support. + * + * USAGE: rb_objnew.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Ruby program + * CLASS Class of new object + * COUNT Number of object creations during tracing + * + * Filename and class names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +ruby*:::object-create-done +{ + @objs[basename(copyinstr(arg1)), copyinstr(arg0)] = count(); +} + +dtrace:::END +{ + printf(" %-24s %-36s %8s\n", "FILE", "CLASS", "COUNT"); + printa(" %-24.24s %-36s %@8d\n", @objs); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_stat.d b/cddl/contrib/dtracetoolkit/Ruby/rb_stat.d new file mode 100755 index 00000000000..6de19f6e5b4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_stat.d @@ -0,0 +1,146 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_stat.d - Ruby operation stats using DTrace. + * Written for the Ruby DTrace provider. + * + * $Id: rb_stat.d 20 2007-09-12 09:28:22Z brendan $ + * + * This traces activity from all Ruby programs on the system that are + * running with Ruby provider support. + * + * USAGE: rb_stat.d [interval [count]] + * + * FIELDS: + * EXEC/s Ruby programs executed per second, including + * those without Ruby provider support + * METHOD/s Methods called, per second + * OBJNEW/s Objects created, per second + * OBJFRE/s Objects freed, per second + * RAIS/s Raises, per second + * RESC/s Rescues, per second + * GC/s Garbage collects, per second + * + * The numbers are counts for the interval specified. The default interval + * is 1 second. + * + * If you see a count in "EXECS" but not in the other columns, then your + * Ruby software is probably not running with the DTrace Ruby provider. + * See Ruby/Readme. + * + * Filename and method names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option defaultargs + +inline int SCREEN = 21; + +dtrace:::BEGIN +{ + execs = methods = objnew = objfree = gc = raised = rescue = 0; + lines = SCREEN + 1; + interval = $1 ? $1 : 1; + counts = $2 ? $2 : -1; + secs = interval; + first = 1; +} + +profile:::tick-1sec +{ + secs--; +} + +/* + * Print Header + */ +dtrace:::BEGIN, +profile:::tick-1sec +/first || (secs == 0 && lines > SCREEN)/ +{ + printf("%-20s %8s %8s %8s %8s %6s %6s %6s\n", "TIME", "EXEC/s", + "METHOD/s", "OBJNEW/s", "OBJFRE/s", "RAIS/s", "RESC/s", "GC/s"); + lines = 0; + first = 0; +} + +/* + * Tally Data + */ +proc:::exec-success +/execname == "ruby"/ +{ + execs++; +} + +ruby*:::function-entry +{ + methods++; +} + +ruby*:::object-create-start +{ + objnew++; +} + +ruby*:::object-free +{ + objfree++; +} + +ruby*:::raise +{ + raised++; +} + +ruby*:::rescue +{ + rescue++; +} + +ruby*:::gc-begin +{ + gc++; +} + +/* + * Print Output + */ +profile:::tick-1sec +/secs == 0/ +{ + printf("%-20Y %8d %8d %8d %8d %6d %6d %6d\n", walltimestamp, + execs / interval, methods / interval, objnew / interval, + objfree / interval, raised / interval, rescue / interval, + gc / interval); + execs = methods = objnew = objfree = gc = raised = rescue = 0; + secs = interval; + lines++; + counts--; +} + +/* + * End + */ +profile:::tick-1sec +/counts == 0/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_syscalls.d b/cddl/contrib/dtracetoolkit/Ruby/rb_syscalls.d new file mode 100755 index 00000000000..495060b9da8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_syscalls.d @@ -0,0 +1,66 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_syscalls.d - count Ruby calls and syscalls using DTrace. + * Written for the Ruby DTrace provider. + * + * $Id: rb_syscalls.d 20 2007-09-12 09:28:22Z brendan $ + * + * USAGE: rb_syscalls.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the Ruby program + * TYPE Type of call (method/syscall) + * NAME Name of call + * COUNT Number of calls during sample + * + * Filename and method names are printed if available. + * The filename for syscalls may be printed as "ruby", if the program + * was invoked using the form "ruby filename" rather than running the + * program with an interpreter line. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +self string filename; + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +ruby$target:::function-entry +{ + this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); + @calls[basename(copyinstr(arg2)), "method", this->name] = count(); +} + +syscall:::entry +/pid == $target/ +{ + @calls[basename(execname), "syscall", probefunc] = count(); +} + +dtrace:::END +{ + printf("\nCalls for PID %d,\n\n", $target); + printf(" %-32s %-10s %-22s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-32s %-10s %-22s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_syscolors.d b/cddl/contrib/dtracetoolkit/Ruby/rb_syscolors.d new file mode 100755 index 00000000000..e14ac0802e8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_syscolors.d @@ -0,0 +1,133 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_syscolors.d - trace Ruby method flow plus syscalls, in color. + * Written for the Ruby DTrace provider. + * + * $Id: rb_syscolors.d 27 2007-09-13 09:26:01Z brendan $ + * + * USAGE: rb_syscolors.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * This watches Ruby method entries and returns, and indents child + * function calls. + * + * FIELDS: + * C CPU-id + * PID Process ID + * DELTA(us) Elapsed time from previous line to this line + * FILE Filename of the Ruby program + * LINE Line number of filename + * TYPE Type of call (method/line/syscall) + * NAME Ruby method or syscall name + * + * Filename and method names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + /* + * The following are terminal color escape sequences. + * Change them to whatever you prefer, eg HTML font tags. + */ + color_ruby = "\033[2;35m"; /* violet, faint */ + color_line = "\033[1;35m"; /* violet, bold */ + color_syscall = "\033[2;32m"; /* green, faint */ + color_off = "\033[0m"; /* default */ + + printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)", + "FILE", "LINE", "TYPE", "NAME"); +} + +ruby$target:::function-entry, +ruby$target:::function-return, +ruby$target:::line, +syscall:::entry, +syscall:::return +/self->last == 0 && pid == $target/ +{ + self->last = timestamp; +} + +ruby$target:::function-entry +{ + this->delta = (timestamp - self->last) / 1000; + this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); + printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_ruby, + cpu, pid, this->delta, basename(copyinstr(arg2)), arg3, "method", + self->depth * 2, "", this->name, color_off); + self->depth++; + self->last = timestamp; +} + +ruby$target:::function-return +{ + this->delta = (timestamp - self->last) / 1000; + this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1)); + self->depth--; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_ruby, + cpu, pid, this->delta, basename(copyinstr(arg2)), arg3, "method", + self->depth * 2, "", this->name, color_off); + self->last = timestamp; +} + +ruby$target:::line +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s-- %s\n", color_line, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg1, "line", + self->depth * 2, "", color_off); + self->last = timestamp; +} + +syscall:::entry +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:- %-8s %*s-> %s%s\n", color_syscall, + cpu, pid, this->delta, "\"", "syscall", self->depth * 2, "", + probefunc, color_off); + self->depth++; + self->last = timestamp; +} + +syscall:::return +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + self->depth--; + printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_syscall, + cpu, pid, this->delta, "\"", "syscall", self->depth * 2, "", + probefunc, color_off); + self->last = timestamp; +} + +proc:::exit +/pid == $target/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Ruby/rb_who.d b/cddl/contrib/dtracetoolkit/Ruby/rb_who.d new file mode 100755 index 00000000000..01193689363 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Ruby/rb_who.d @@ -0,0 +1,56 @@ +#!/usr/sbin/dtrace -Zs +/* + * rb_who.d - trace Ruby line execution by process using DTrace. + * Written for the Ruby DTrace provider. + * + * $Id: rb_who.d 49 2007-09-17 12:03:20Z brendan $ + * + * This traces Ruby activity from all Ruby programs on the system that are + * running with Ruby provider support. + * + * USAGE: rb_who.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID of Ruby + * UID User ID of the owner + * LINES Number of times a line was executed + * FILE Pathname of the Ruby program + * + * Filenames are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +ruby*:::line +{ + @lines[pid, uid, copyinstr(arg0)] = count(); +} + +dtrace:::END +{ + printf(" %6s %6s %10s %s\n", "PID", "UID", "LINES", "FILE"); + printa(" %6d %6d %@10d %s\n", @lines); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/Readme b/cddl/contrib/dtracetoolkit/Shell/Readme new file mode 100644 index 00000000000..9bf96ffdf8b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/Readme @@ -0,0 +1,35 @@ +Shell - DTracing Shell Scripting + + These scripts trace activity of various shell programming languages, + and make use of specific shell DTrace providers, which are either + integrated or available for download from the shells page listed below. + Each script has a prefix to make the shell language clear. + + http://www.opensolaris.org/os/community/dtrace/shells/ + + sh - the Bourne Shell. This provider was written by Alan Hargreaves and + is currently available both as a diff and in binary form from the shells + page. + + Since the DTrace Shell providers are under development, there is a chance + that they have changed slightly by the time you are reading this, causing + these scripts to either break or behave oddly. Firstly, check for newer + versions of the DTraceToolkit; if it hasn't been updated and you need + to use these scripts immediately, then updating them shouldn't take + too long. The following was the state of the providers when these scripts + were written - check for changes and update the scripts accordingly, + + provider sh { + probe function-entry(file, function, lineno); + probe function-return(file, function, rval); + probe builtin-entry(file, function, lineno); + probe builtin-return(file, function, rval); + probe command-entry(file, function, lineno); + probe command-return(file, function, rval); + probe script-start(file); + probe script-done(file, rval); + probe subshell-entry(file, childpid); + probe subshell-return(file, rval); + probe line(file, lineno); + }; + diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_calldist.d b/cddl/contrib/dtracetoolkit/Shell/sh_calldist.d new file mode 100755 index 00000000000..e758bab9db1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_calldist.d @@ -0,0 +1,119 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_calldist.d - measure Bourne shell elapsed times for types of operation. + * Written for the sh DTrace provider. + * + * $Id: sh_calldist.d 28 2007-09-13 10:49:37Z brendan $ + * + * This traces shell activity from all Bourne shells on the system that are + * running with sh provider support. + * + * USAGE: sh_calldist.d # hit Ctrl-C to end + * + * This script prints distribution plots of elapsed time for shell + * operations. Use sh_calltime.d for summary reports. + * + * FIELDS: + * 1 Filename of the shell or shellscript + * 2 Type of call (func/builtin/cmd) + * 3 Name of call + * + * Filename and call names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sh*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = timestamp; +} + +sh*:::function-return +/self->function[self->depth]/ +{ + this->elapsed_incl = timestamp - self->function[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @types_incl[this->file, "func", this->name] = + quantize(this->elapsed_incl / 1000); + @types_excl[this->file, "func", this->name] = + quantize(this->elapsed_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +sh*:::builtin-entry +{ + self->builtin = timestamp; +} + +sh*:::builtin-return +/self->builtin/ +{ + this->elapsed = timestamp - self->builtin; + self->builtin = 0; + + @types[basename(copyinstr(arg0)), "builtin", copyinstr(arg1)] = + quantize(this->elapsed / 1000); + + self->exclude[self->depth] += this->elapsed; +} + +sh*:::command-entry +{ + self->command = timestamp; +} + +sh*:::command-return +/self->command/ +{ + this->elapsed = timestamp - self->command; + self->command = 0; + + @types[basename(copyinstr(arg0)), "cmd", copyinstr(arg1)] = + quantize(this->elapsed / 1000); + + self->exclude[self->depth] += this->elapsed; +} + +dtrace:::END +{ + printf("Elapsed times (us),\n\n"); + printa(" %s, %s, %s %@d\n", @types); + + printf("Exclusive function elapsed times (us),\n\n"); + printa(" %s, %s, %s %@d\n", @types_excl); + + printf("Inclusive function elapsed times (us),\n\n"); + printa(" %s, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_calls.d b/cddl/contrib/dtracetoolkit/Shell/sh_calls.d new file mode 100755 index 00000000000..2ad72f108f6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_calls.d @@ -0,0 +1,72 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_calls.d - count Bourne calls (func/builtin/cmd/subsh) using DTrace. + * Written for the sh DTrace provider. + * + * $Id: sh_calls.d 52 2007-09-24 04:28:01Z brendan $ + * + * This traces shell activity from all Bourne shells on the system that are + * running with sh provider support. + * + * USAGE: sh_calls.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the shell or shellscript + * TYPE Type of call (func/builtin/cmd/subsh) + * NAME Name of call + * COUNT Number of calls during sample + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sh*:::function-entry +{ + @calls[basename(copyinstr(arg0)), "func", copyinstr(arg1)] = count(); +} + +sh*:::builtin-entry +{ + @calls[basename(copyinstr(arg0)), "builtin", copyinstr(arg1)] = count(); +} + +sh*:::command-entry +{ + @calls[basename(copyinstr(arg0)), "cmd", copyinstr(arg1)] = count(); +} + +sh*:::subshell-entry +/arg1 != 0/ +{ + @calls[basename(copyinstr(arg0)), "subsh", "-"] = count(); +} + +dtrace:::END +{ + printf(" %-22s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-22s %-10s %-32s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_calltime.d b/cddl/contrib/dtracetoolkit/Shell/sh_calltime.d new file mode 100755 index 00000000000..e3c72b4ae4f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_calltime.d @@ -0,0 +1,136 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_calltime.d - measure Bourne shell elapsed times for types of operation. + * Written for the sh DTrace provider. + * + * $Id: sh_calltime.d 46 2007-09-17 10:25:36Z brendan $ + * + * This traces shell activity from all Bourne shells on the system that are + * running with sh provider support. + * + * USAGE: sh_calltime.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the shell or shellscript + * TYPE Type of call (func/builtin/cmd/total) + * NAME Name of call + * TOTAL Total elapsed time for calls (us) + * + * Filename and call names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sh*:::function-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->function[self->depth] = timestamp; +} + +sh*:::function-return +/self->function[self->depth]/ +{ + this->elapsed_incl = timestamp - self->function[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @num[this->file, "func", this->name] = count(); + @num["-", "total", "-"] = count(); + @types_incl[this->file, "func", this->name] = sum(this->elapsed_incl); + @types_excl[this->file, "func", this->name] = sum(this->elapsed_excl); + @types_excl["-", "total", "-"] = sum(this->elapsed_excl); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +sh*:::builtin-entry +{ + self->builtin = timestamp; +} + +sh*:::builtin-return +/self->builtin/ +{ + this->elapsed = timestamp - self->builtin; + self->builtin = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @num[this->file, "builtin", this->name] = count(); + @num["-", "total", "-"] = count(); + @types[this->file, "builtin", this->name] = sum(this->elapsed); + @types["-", "total", "-"] = sum(this->elapsed); + + self->exclude[self->depth] += this->elapsed; +} + +sh*:::command-entry +{ + self->command = timestamp; +} + +sh*:::command-return +/self->command/ +{ + this->elapsed = timestamp - self->command; + self->command = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @num[this->file, "cmd", this->name] = count(); + @num["-", "total", "-"] = count(); + @types[this->file, "cmd", this->name] = sum(this->elapsed); + @types["-", "total", "-"] = sum(this->elapsed); + + self->exclude[self->depth] += this->elapsed; +} + +dtrace:::END +{ + printf("\nCounts,\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-20s %-10s %-32s %@8d\n", @num); + + normalize(@types, 1000); + printf("\nElapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types); + + normalize(@types_excl, 1000); + printf("\nExclusive function elapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_excl); + + normalize(@types_incl, 1000); + printf("\nInclusive function elapsed times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_cpudist.d b/cddl/contrib/dtracetoolkit/Shell/sh_cpudist.d new file mode 100755 index 00000000000..0809fd5cd39 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_cpudist.d @@ -0,0 +1,142 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_cpudist.d - measure Bourne shell on-CPU times for types of operation. + * Written for the sh DTrace provider. + * + * $Id: sh_cpudist.d 28 2007-09-13 10:49:37Z brendan $ + * + * This traces shell activity from all Bourne shells on the system that are + * running with sh provider support. + * + * USAGE: sh_cpudist.d # hit Ctrl-C to end + * + * This script prints distribution plots of on-CPU time for shell + * operations. Use sh_cputime.d for summary reports. + * + * FIELDS: + * 1 Filename of the shell or shellscript + * 2 Type of call (func/builtin/cmd) + * 3 Name of call + * + * Filename and call names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sh*:::function-entry +{ + self->depth++; + self->function[self->depth] = vtimestamp; + self->exclude[self->depth] = 0; +} + +sh*:::function-return +/self->function[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->function[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @types_incl[this->file, "func", this->name] = + quantize(this->oncpu_incl / 1000); + @types_excl[this->file, "func", this->name] = + quantize(this->oncpu_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +sh*:::builtin-entry +{ + self->builtin = vtimestamp; +} + +sh*:::builtin-return +/self->builtin/ +{ + this->oncpu = vtimestamp - self->builtin; + self->builtin = 0; + + @types[basename(copyinstr(arg0)), "builtin", copyinstr(arg1)] = + quantize(this->oncpu / 1000); + + self->exclude[self->depth] += this->oncpu; +} + +sh*:::command-entry +{ + incmd[pid] = basename(copyinstr(arg0)); + depth[pid] = self->depth; +} + +sh*:::command-return +{ + incmd[pid] = 0; +} + +proc:::exec-success +{ + /* + * Due to thread timing after fork(), this probe can fire before + * sh*:::command-entry has, which means we can't predicate this + * exec() away just yet. Store the vtimestamp in case it is needed. + */ + self->command = vtimestamp; +} + +proc:::exit +/incmd[ppid] == NULL/ +{ + self->command = 0; +} + +proc:::exit +/incmd[ppid] != NULL/ +{ + this->oncpu = vtimestamp - self->command; + self->command = 0; + + @types[incmd[ppid], "cmd", execname] = quantize(this->oncpu / 1000); + + self->exclude[depth[ppid]] += this->oncpu; + incmd[ppid] = 0; + depth[ppid] = 0; +} + +dtrace:::END +{ + printf("On-CPU times (us),\n\n"); + printa(" %s, %s, %s %@d\n", @types); + + printf("Exclusive function on-CPU times (us),\n\n"); + printa(" %s, %s, %s %@d\n", @types_excl); + + printf("Inclusive function on-CPU times (us),\n\n"); + printa(" %s, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_cputime.d b/cddl/contrib/dtracetoolkit/Shell/sh_cputime.d new file mode 100755 index 00000000000..433ce8e2088 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_cputime.d @@ -0,0 +1,158 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_cputime.d - measure Bourne shell on-CPU times for types of operation. + * Written for the sh DTrace provider. + * + * $Id: sh_cputime.d 46 2007-09-17 10:25:36Z brendan $ + * + * This traces shell activity from all Bourne shells on the system that are + * running with sh provider support. + * + * USAGE: sh_cputime.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the shell or shellscript + * TYPE Type of call (func/builtin/cmd/total) + * NAME Name of call + * TOTAL Total on-CPU time for calls (us) + * + * Filename and call names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sh*:::function-entry +{ + self->depth++; + self->function[self->depth] = vtimestamp; + self->exclude[self->depth] = 0; +} + +sh*:::function-return +/self->function[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->function[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->function[self->depth] = 0; + self->exclude[self->depth] = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @num[this->file, "func", this->name] = count(); + @num["-", "total", "-"] = count(); + @types_incl[this->file, "func", this->name] = sum(this->oncpu_incl); + @types_excl[this->file, "func", this->name] = sum(this->oncpu_excl); + @types_excl["-", "total", "-"] = sum(this->oncpu_excl); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +sh*:::builtin-entry +{ + self->builtin = vtimestamp; +} + +sh*:::builtin-return +/self->builtin/ +{ + this->oncpu = vtimestamp - self->builtin; + self->builtin = 0; + this->file = basename(copyinstr(arg0)); + this->name = copyinstr(arg1); + + @num[this->file, "builtin", this->name] = count(); + @num["-", "total", "-"] = count(); + @types[this->file, "builtin", this->name] = sum(this->oncpu); + @types["-", "total", "-"] = sum(this->oncpu); + + self->exclude[self->depth] += this->oncpu; +} + +sh*:::command-entry +{ + incmd[pid] = basename(copyinstr(arg0)); + depth[pid] = self->depth; +} + +sh*:::command-return +{ + incmd[pid] = 0; +} + +proc:::exec-success +{ + /* + * Due to thread timing after fork(), this probe can fire before + * sh*:::command-entry has, which means we can't predicate this + * exec() away just yet. Store the vtimestamp in case it is needed. + */ + self->command = vtimestamp; +} + +proc:::exit +/incmd[ppid] == NULL/ +{ + self->command = 0; +} + +proc:::exit +/incmd[ppid] != NULL/ +{ + this->oncpu = vtimestamp - self->command; + self->command = 0; + + @num[incmd[ppid], "cmd", execname] = count(); + @num["-", "total", "-"] = count(); + @types[incmd[ppid], "cmd", execname] = sum(this->oncpu); + @types["-", "total", "-"] = sum(this->oncpu); + + self->exclude[depth[ppid]] += this->oncpu; + incmd[ppid] = 0; + depth[ppid] = 0; +} + +dtrace:::END +{ + printf("\nCounts,\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-20s %-10s %-32s %@8d\n", @num); + + normalize(@types, 1000); + printf("\nOn-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types); + + normalize(@types_excl, 1000); + printf("\nExclusive function on-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_excl); + + normalize(@types_incl, 1000); + printf("\nInclusive function on-CPU times (us),\n"); + printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL"); + printa(" %-20s %-10s %-32s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_flow.d b/cddl/contrib/dtracetoolkit/Shell/sh_flow.d new file mode 100755 index 00000000000..ff24f595cb8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_flow.d @@ -0,0 +1,85 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_flow.d - snoop Bourne shell execution showing function flow using DTrace. + * Written for the sh DTrace provider. + * + * $Id: sh_flow.d 41 2007-09-17 02:20:10Z brendan $ + * + * This traces shell activity from all Bourne shells on the system that are + * running with sh provider support. + * + * USAGE: sh_flow.d # hit Ctrl-C to end + * + * This watches shell function entries and returns, and indents child + * function calls. Shell builtins are also printed. + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * FILE Filename that this function belongs to + * NAME Shell function, builtin or command name + * + * LEGEND: + * -> function entry + * <- function return + * > builtin + * | external command + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + self->depth = 0; + printf("%3s %-16s %-16s -- %s\n", "C", "TIME(us)", "FILE", "NAME"); +} + +sh*:::function-entry +{ + printf("%3d %-16d %-16s %*s-> %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg1)); + self->depth++; +} + +sh*:::function-return +{ + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %-16d %-16s %*s<- %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg1)); +} + +sh*:::builtin-entry +{ + printf("%3d %-16d %-16s %*s> %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg1)); +} + +sh*:::command-entry +{ + printf("%3d %-16d %-16s %*s| %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg1)); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_flowinfo.d b/cddl/contrib/dtracetoolkit/Shell/sh_flowinfo.d new file mode 100755 index 00000000000..6da083681b1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_flowinfo.d @@ -0,0 +1,152 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_flowinfo.d - snoop Bourne shell flow with additional info. + * Written for the sh DTrace provider. + * + * $Id: sh_flowinfo.d 52 2007-09-24 04:28:01Z brendan $ + * + * This traces shell activity from all Bourne shells on the system that are + * running with sh provider support. + * + * USAGE: sh_flowinfo.d # hit Ctrl-C to end + * + * This watches shell function entries and returns, and indents child + * function calls. Shell builtins and external commands are also printed. + * + * FIELDS: + * C CPU-id + * PID Process ID + * DELTA(us) Elapsed time from previous line to this line + * FILE Filename of the shell script + * LINE Line number of filename + * TYPE Type of call (func/builtin/cmd/subsh) + * NAME Shell function, builtin or command name + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + self->depth = 0; + printf("%3s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)", + "FILE", "LINE", "TYPE", "NAME"); +} + +sh*:::function-entry, +sh*:::function-return, +sh*:::builtin-entry, +sh*:::builtin-return, +sh*:::command-entry, +sh*:::command-return, +sh*:::subshell-entry, +sh*:::subshell-return +/self->last == 0/ +{ + self->last = timestamp; +} + +sh*:::function-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, + this->delta, basename(copyinstr(arg0)), arg2, "func", + self->depth * 2, "", copyinstr(arg1)); + self->depth++; + self->last = timestamp; +} + +sh*:::function-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %10d %16s:- %-8s %*s<- %s\n", cpu, pid, + this->delta, basename(copyinstr(arg0)), "func", self->depth * 2, + "", copyinstr(arg1)); + self->last = timestamp; +} + +sh*:::builtin-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, + this->delta, basename(copyinstr(arg0)), arg2, "builtin", + self->depth * 2, "", copyinstr(arg1)); + self->depth++; + self->last = timestamp; +} + +sh*:::builtin-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %10d %16s:- %-8s %*s<- %s\n", cpu, pid, + this->delta, basename(copyinstr(arg0)), "builtin", + self->depth * 2, "", copyinstr(arg1)); + self->last = timestamp; +} + +sh*:::command-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, + this->delta, basename(copyinstr(arg0)), arg2, "cmd", + self->depth * 2, "", copyinstr(arg1)); + self->depth++; + self->last = timestamp; +} + +sh*:::command-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %10d %16s:- %-8s %*s<- %s\n", cpu, pid, + this->delta, basename(copyinstr(arg0)), "cmd", + self->depth * 2, "", copyinstr(arg1)); + self->last = timestamp; +} + +sh*:::subshell-entry +/arg1 != 0/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %6d %10d %16s:- %-8s %*s-> pid %d\n", cpu, pid, + this->delta, basename(copyinstr(arg0)), "subsh", + self->depth * 2, "", arg1); + self->depth++; + self->last = timestamp; +} + +sh*:::subshell-return +/self->last/ +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %10d %16s:- %-8s %*s<- = %d\n", cpu, pid, + this->delta, basename(copyinstr(arg0)), "subsh", + self->depth * 2, "", arg1); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_flowtime.d b/cddl/contrib/dtracetoolkit/Shell/sh_flowtime.d new file mode 100755 index 00000000000..5df118be171 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_flowtime.d @@ -0,0 +1,118 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_flowtime.d - snoop Bourne shell execution with flow and delta times. + * Written for the sh DTrace provider. + * + * $Id: sh_flowtime.d 45 2007-09-17 08:54:56Z brendan $ + * + * This traces shell activity from all Bourne shells on the system that are + * running with sh provider support. + * + * USAGE: sh_flowtime.d # hit Ctrl-C to end + * + * This watches shell function entries and returns, and indents child + * function calls. Shell builtins are also printed. + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * FILE Filename that this function belongs to + * NAME Shell function or builtin name + * + * LEGEND: + * -> function entry + * <- function return + * > builtin + * | external command + * + * DELTAs: + * -> previous line to the start of this function + * <- previous line to the end of this function + * > previous line to the end of this builtin + * | previous line to the end of this command + * + * See sh_flowinfo.d for more verbose and more straightforward delta times. + * + * Filename and function names are printed if available. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +self uint64_t last; + +dtrace:::BEGIN +{ + printf("%3s %-16s %-16s %9s -- %s\n", "C", "TIME(us)", "FILE", + "DELTA(us)", "NAME"); +} + +sh*:::function-entry, +sh*:::function-return, +sh*:::builtin-return, +sh*:::command-return +/self->last == 0/ +{ + self->last = timestamp; +} + +sh*:::function-entry +{ + this->elapsed = (timestamp - self->last) / 1000; + printf("%3d %-16d %-16s %9d %*s-> %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), this->elapsed, self->depth * 2, "", + copyinstr(arg1)); + self->depth++; + self->last = timestamp; +} + +sh*:::function-return +{ + this->elapsed = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %-16d %-16s %9d %*s<- %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), this->elapsed, self->depth * 2, "", + copyinstr(arg1)); + self->last = timestamp; +} + +sh*:::builtin-return +{ + this->elapsed = (timestamp - self->last) / 1000; + printf("%3d %-16d %-16s %9d %*s> %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), this->elapsed, self->depth * 2, "", + copyinstr(arg1)); + self->last = timestamp; +} + +sh*:::command-return +{ + this->elapsed = (timestamp - self->last) / 1000; + printf("%3d %-16d %-16s %9d %*s| %s\n", cpu, timestamp / 1000, + basename(copyinstr(arg0)), this->elapsed, self->depth * 2, "", + copyinstr(arg1)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_lines.d b/cddl/contrib/dtracetoolkit/Shell/sh_lines.d new file mode 100755 index 00000000000..5cfeb491210 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_lines.d @@ -0,0 +1,55 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_lines.d - trace Bourne shell line execution using DTrace. + * Written for the sh DTrace provider. + * + * $Id: sh_lines.d 25 2007-09-12 09:51:58Z brendan $ + * + * This traces shell activity from all Bourne shells on the system that are + * running with sh provider support. + * + * USAGE: sh_lines.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the shell or shellscript + * LINE Line number + * COUNT Number of times a line was executed + * + * Filenames are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sh*:::line +{ + @calls[basename(copyinstr(arg0)), arg1] = count(); +} + +dtrace:::END +{ + printf(" %32s:%-6s %10s\n", "FILE", "LINE", "COUNT"); + printa(" %32s:%-6d %@10d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_pidcolors.d b/cddl/contrib/dtracetoolkit/Shell/sh_pidcolors.d new file mode 100755 index 00000000000..0196218580d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_pidcolors.d @@ -0,0 +1,203 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_pidcolors.d - Demonstration of deeper DTrace Bourne shell analysis. + * Written for the sh DTrace provider. + * + * $Id: sh_pidcolors.d 27 2007-09-13 09:26:01Z brendan $ + * + * USAGE: sh_pidcolors.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * This extends sh_syscolors.d by including some "pid" provider tracing + * as a starting point for deeper analysis. Currently it adds the probes, + * + * pid$target:a.out:e*:entry, + * pid$target:a.out:e*:return + * + * which means, all functions from the /usr/bin/sh binary that begin with + * the letter "e". This adds about 34 probes. Customise it to whichever + * parts of /usr/bin/sh or the system libraries you are interested in. + * + * FIELDS: + * C CPU-id + * PID Process ID + * DELTA(us) Elapsed time from previous line to this line + * FILE Filename of the shell script + * LINE Line number of filename + * TYPE Type of call (func/builtin/cmd/line/shell) + * NAME Shell function, builtin or command name + * + * The filename for syscalls may be printed as the shell name, if the + * script was invoked using the form "shell filename" rather than running + * the script with an interpreter line. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + color_shell = "\033[2;35m"; /* violet, faint */ + color_line = "\033[1;35m"; /* violet, bold */ + color_lib = "\033[2;34m"; /* blue, faint */ + color_syscall = "\033[2;32m"; /* green, faint */ + color_off = "\033[0m"; /* default */ + + printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)", + "FILE", "LINE", "TYPE", "NAME"); +} + +sh$target:::function-entry, +sh$target:::function-return, +sh$target:::builtin-entry, +sh$target:::command-entry, +syscall:::entry, +syscall:::return, +/* Customize Here, */ +pid$target:a.out:e*:entry, +pid$target:a.out:e*:return +/self->last == 0 && pid == $target/ +{ + self->last = timestamp; +} + +sh$target:::function-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_shell, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "func", + self->depth * 2, "", copyinstr(arg1), color_off); + self->depth++; + self->last = timestamp; +} + +sh$target:::function-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_shell, + cpu, pid, this->delta, basename(copyinstr(arg0)), "func", + self->depth * 2, "", copyinstr(arg1), color_off); + self->last = timestamp; +} + +sh$target:::builtin-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_shell, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "builtin", + self->depth * 2, "", copyinstr(arg1), color_off); + self->depth++; + self->last = timestamp; +} + +sh$target:::builtin-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_shell, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "builtin", + self->depth * 2, "", copyinstr(arg1), color_off); + self->last = timestamp; +} + +sh$target:::command-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_shell, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "cmd", + self->depth * 2, "", copyinstr(arg1), color_off); + self->depth++; + self->last = timestamp; +} + +sh$target:::command-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_shell, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "cmd", + self->depth * 2, "", copyinstr(arg1), color_off); + self->last = timestamp; +} + +sh$target:::line +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s-- %s\n", color_line, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg1, "line", + self->depth * 2, "", color_off); + self->last = timestamp; +} + +/* Customise Here, */ +pid$target:a.out:e*:entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:- %-8s %*s-> %s%s\n", color_lib, + cpu, pid, this->delta, basename(execname), "sh", + self->depth * 2, "", probefunc, color_off); + self->depth++; + self->last = timestamp; +} + +/* Customise Here, */ +pid$target:a.out:e*:return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_lib, + cpu, pid, this->delta, basename(execname), "sh", + self->depth * 2, "", probefunc, color_off); + self->last = timestamp; +} + +syscall:::entry +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:- %-8s %*s-> %s%s\n", color_syscall, + cpu, pid, this->delta, basename(execname), "syscall", + self->depth * 2, "", probefunc, color_off); + self->depth++; + self->last = timestamp; +} + +syscall:::return +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_syscall, + cpu, pid, this->delta, basename(execname), "syscall", + self->depth * 2, "", probefunc, color_off); + self->last = timestamp; +} + +proc:::exit +/pid == $target/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_stat.d b/cddl/contrib/dtracetoolkit/Shell/sh_stat.d new file mode 100755 index 00000000000..70e29b480ee --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_stat.d @@ -0,0 +1,133 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_stat.d - Bourne shell operation stats using DTrace. + * Written for the sh DTrace provider. + * + * $Id: sh_stat.d 52 2007-09-24 04:28:01Z brendan $ + * + * This traces activity from all sh processes on the system that are running + * with sh provider support. + * + * USAGE: sh_stat.d [interval [count]] + * + * FIELDS: + * EXEC/s Bourne shells executed per second, including + * those without sh provider support + * FUNC/s Functions called, per second + * BLTIN/s Builtins called, per second + * SUB-SH/s Sub-shells called, per second + * CMD/s External commands called, per second + * + * The numbers are counts for the interval specified. The default interval + * is 1 second. + * + * If you see a count in "EXECS" but not in the other columns, then sh + * scripts may be running without the DTrace sh provider. See Shell/Readme. + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option defaultargs + +inline int SCREEN = 21; + +dtrace:::BEGIN +{ + execs = funcs = builtins = subs = cmds = 0; + lines = SCREEN + 1; + interval = $1 ? $1 : 1; + counts = $2 ? $2 : -1; + secs = interval; + first = 1; +} + +profile:::tick-1sec +{ + secs--; +} + +/* + * Print Header + */ +dtrace:::BEGIN, +profile:::tick-1sec +/first || (secs == 0 && lines > SCREEN)/ +{ + printf("%-20s %8s %8s %8s %8s %8s\n", "TIME", "EXEC/s", "FUNCS/s", + "BLTINS/s", "SUB-SH/s", "CMD/s"); + lines = 0; + first = 0; +} + +/* + * Tally Data + */ +proc:::exec-success +/execname == "sh"/ +{ + execs++; +} + +sh*:::function-entry +{ + funcs++; +} + +sh*:::builtin-entry +{ + builtins++; +} + +sh*:::subshell-entry +/arg0 != 0/ +{ + subs++; +} + +sh*:::command-entry +{ + cmds++; +} + +/* + * Print Output + */ +profile:::tick-1sec +/secs == 0/ +{ + printf("%-20Y %8d %8d %8d %8d %8d\n", walltimestamp, execs / interval, + funcs / interval, builtins / interval, subs / interval, + cmds / interval); + execs = funcs = builtins = subs = cmds = 0; + secs = interval; + lines++; + counts--; +} + +/* + * End + */ +profile:::tick-1sec +/counts == 0/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_syscalls.d b/cddl/contrib/dtracetoolkit/Shell/sh_syscalls.d new file mode 100755 index 00000000000..127bede5d8e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_syscalls.d @@ -0,0 +1,83 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_syscalls.d - count Bourne calls and syscalls using DTrace. + * Written for the sh DTrace provider. + * + * $Id: sh_syscalls.d 25 2007-09-12 09:51:58Z brendan $ + * + * USAGE: sh_syscalls.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the shell or shellscript + * TYPE Type of call (func/builtin/cmd/syscall) + * NAME Name of call + * COUNT Number of calls during sample + * + * Filename and function names are printed if available. + * The filename for syscalls may be printed as the shell name, if the + * script was invoked using the form "shell filename" rather than running + * the script with an interpreter line. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +self string filename; + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sh$target:::function-entry, +sh$target:::builtin-entry, +sh$target:::command-entry +/self->filename == NULL/ +{ + self->filename = basename(copyinstr(arg0)); +} + +sh$target:::function-entry +{ + @calls[self->filename, "func", copyinstr(arg1)] = count(); +} + +sh$target:::builtin-entry +{ + @calls[self->filename, "builtin", copyinstr(arg1)] = count(); +} + +sh$target:::command-entry +{ + @calls[self->filename, "cmd", copyinstr(arg1)] = count(); +} + +syscall:::entry +/pid == $target/ +{ + @calls[basename(execname), "syscall", probefunc] = count(); +} + +dtrace:::END +{ + printf("\nCalls for PID %d,\n\n", $target); + printf(" %-32s %-10s %-22s %8s\n", "FILE", "TYPE", "NAME", "COUNT"); + printa(" %-32s %-10s %-22s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_syscolors.d b/cddl/contrib/dtracetoolkit/Shell/sh_syscolors.d new file mode 100755 index 00000000000..3622cb39f48 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_syscolors.d @@ -0,0 +1,169 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_syscolors.d - trace Bourne shell flow plus syscalls, in color. + * Written for the sh DTrace provider. + * + * $Id: sh_syscolors.d 27 2007-09-13 09:26:01Z brendan $ + * + * USAGE: sh_syscolors.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * This watches shell function entries and returns, and indents child + * function calls. Shell builtins, commands and lines are also printed. + * + * FIELDS: + * C CPU-id + * PID Process ID + * DELTA(us) Elapsed time from previous line to this line + * FILE Filename of the shell script + * LINE Line number of filename + * TYPE Type of call (func/builtin/cmd/line/shell) + * NAME Shell function, builtin or command name + * + * The filename for syscalls may be printed as the shell name, if the + * script was invoked using the form "shell filename" rather than running + * the script with an interpreter line. + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + color_shell = "\033[2;35m"; /* violet, faint */ + color_line = "\033[1;35m"; /* violet, bold */ + color_syscall = "\033[2;32m"; /* green, faint */ + color_off = "\033[0m"; /* default */ + + printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)", + "FILE", "LINE", "TYPE", "NAME"); +} + +sh$target:::function-entry, +sh$target:::function-return, +sh$target:::builtin-entry, +sh$target:::command-entry, +sh$target:::line, +syscall:::entry, +syscall:::return +/self->last == 0 && pid == $target/ +{ + self->last = timestamp; +} + +sh$target:::function-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_shell, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "func", + self->depth * 2, "", copyinstr(arg1), color_off); + self->depth++; + self->last = timestamp; +} + +sh$target:::function-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_shell, + cpu, pid, this->delta, basename(copyinstr(arg0)), "func", + self->depth * 2, "", copyinstr(arg1), color_off); + self->last = timestamp; +} + +sh$target:::builtin-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_shell, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "builtin", + self->depth * 2, "", copyinstr(arg1), color_off); + self->depth++; + self->last = timestamp; +} + +sh$target:::builtin-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_shell, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "builtin", + self->depth * 2, "", copyinstr(arg1), color_off); + self->last = timestamp; +} + +sh$target:::command-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_shell, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "cmd", + self->depth * 2, "", copyinstr(arg1), color_off); + self->depth++; + self->last = timestamp; +} + +sh$target:::command-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_shell, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "cmd", + self->depth * 2, "", copyinstr(arg1), color_off); + self->last = timestamp; +} + +sh$target:::line +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:%-4d %-8s %*s-- %s\n", color_line, + cpu, pid, this->delta, basename(copyinstr(arg0)), arg1, "line", + self->depth * 2, "", color_off); + self->last = timestamp; +} + +syscall:::entry +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:- %-8s %*s-> %s%s\n", color_syscall, + cpu, pid, this->delta, basename(execname), "syscall", + self->depth * 2, "", probefunc, color_off); + self->last = timestamp; +} + +syscall:::return +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_syscall, + cpu, pid, this->delta, basename(execname), "syscall", + self->depth * 2, "", probefunc, color_off); + self->last = timestamp; +} + +proc:::exit +/pid == $target/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_wasted.d b/cddl/contrib/dtracetoolkit/Shell/sh_wasted.d new file mode 100755 index 00000000000..e20db8ea6ef --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_wasted.d @@ -0,0 +1,101 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_wasted.d - measure Bourne shell elapsed times for "wasted" commands. + * Written for the sh DTrace provider. + * + * $Id: sh_wasted.d 25 2007-09-12 09:51:58Z brendan $ + * + * USAGE: sh_wasted.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * This script measures "wasted" commands - those which are called externally + * but are in fact builtins to the shell. Ever seen a script which calls + * /usr/bin/echo needlessly? This script measures that cost. + * + * FIELDS: + * FILE Filename of the shell or shellscript + * NAME Name of call + * TIME Total elapsed time for calls (us) + * + * IDEA: Mike Shapiro + * + * Filename and call names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + isbuiltin["echo"] = 1; + isbuiltin["test"] = 1; + /* add builtins here */ + + printf("Tracing... Hit Ctrl-C to end.\n"); + self->start = timestamp; +} + +sh$target:::command-entry +{ + self->command = timestamp; +} + +sh$target:::command-return +{ + this->elapsed = timestamp - self->command; + this->path = copyinstr(arg1); + this->cmd = basename(this->path); +} + +sh$target:::command-return +/self->command && !isbuiltin[this->cmd]/ +{ + @types_cmd[basename(copyinstr(arg0)), this->path] = sum(this->elapsed); + self->command = 0; +} + +sh$target:::command-return +/self->command/ +{ + @types_wasted[basename(copyinstr(arg0)), this->path] = + sum(this->elapsed); + self->command = 0; +} + +proc:::exit +/pid == $target/ +{ + exit(0); +} + +dtrace:::END +{ + this->elapsed = (timestamp - self->start) / 1000; + printf("Script duration: %d us\n", this->elapsed); + + normalize(@types_cmd, 1000); + printf("\nExternal command elapsed times,\n"); + printf(" %-30s %-22s %8s\n", "FILE", "NAME", "TIME(us)"); + printa(" %-30s %-22s %@8d\n", @types_cmd); + + normalize(@types_wasted, 1000); + printf("\nWasted command elapsed times,\n"); + printf(" %-30s %-22s %8s\n", "FILE", "NAME", "TIME(us)"); + printa(" %-30s %-22s %@8d\n", @types_wasted); +} diff --git a/cddl/contrib/dtracetoolkit/Shell/sh_who.d b/cddl/contrib/dtracetoolkit/Shell/sh_who.d new file mode 100755 index 00000000000..3e106ff80f5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Shell/sh_who.d @@ -0,0 +1,56 @@ +#!/usr/sbin/dtrace -Zs +/* + * sh_who.d - trace Bourne shell line execution by process using DTrace. + * Written for the sh DTrace provider. + * + * $Id: sh_who.d 25 2007-09-12 09:51:58Z brendan $ + * + * This traces shell activity from all Bourne shells on the system that are + * running with sh provider support. + * + * USAGE: sh_who.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID of the shell + * UID User ID of the owner + * LINES Number of times a line was executed + * FILE Pathname of the shell or shellscript + * + * Filenames are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +sh*:::line +{ + @lines[pid, uid, copyinstr(arg0)] = count(); +} + +dtrace:::END +{ + printf(" %6s %6s %6s %s\n", "PID", "UID", "LINES", "FILE"); + printa(" %6d %6d %@6d %s\n", @lines); +} diff --git a/cddl/contrib/dtracetoolkit/Snippits/Readme b/cddl/contrib/dtracetoolkit/Snippits/Readme new file mode 100644 index 00000000000..b54dc77583b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Snippits/Readme @@ -0,0 +1,11 @@ +Snippits - DTrace code snippits + + This directory has useful snippits of D scripting in seperate files. + + When coding in DTrace, I frequently refer to the same chunks of code + from the same scripts, when I need to do certain things that I have + solved in the past. I also refer other people to them when asked. + This directory is a library for such "snippits" of code. + + This directory does not contain runnable DTrace scripts. + diff --git a/cddl/contrib/dtracetoolkit/Snippits/fd2pathname.txt b/cddl/contrib/dtracetoolkit/Snippits/fd2pathname.txt new file mode 100644 index 00000000000..b056e131813 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Snippits/fd2pathname.txt @@ -0,0 +1,32 @@ +You have a file descriptor (probably from a syscall), and you want the +corresponding pathname. + +If you are on newer versions of DTrace, there is the fds[] array, + +# dtrace -n 'syscall::read:entry { @[fds[arg0].fi_pathname] = count(); }' +dtrace: description 'syscall::read:entry ' matched 1 probe +^C + + /etc/minor_perm 2 + /etc/mnttab 2 + /etc/motd 2 + /etc/magic 4 + /usr/sbin/clri 5 + /devices/pseudo/clone@0:ptm 6 + /sbin/mount 6 + /dev/pts/28 7 + /devices/pseudo/consms@0:mouse 31 + /devices/pseudo/conskbd@0:kbd 47 + 351 + +easy. + +but if you are on an older version of DTrace, try this to convert from +this->fd to self->vpath, + + this->filep = + curthread->t_procp->p_user.u_finfo.fi_list[this->fd].uf_file; + this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0; + self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ? + cleanpath(this->vnodep->v_path) : "") : ""; + diff --git a/cddl/contrib/dtracetoolkit/System/Readme b/cddl/contrib/dtracetoolkit/System/Readme new file mode 100644 index 00000000000..3d739da38ee --- /dev/null +++ b/cddl/contrib/dtracetoolkit/System/Readme @@ -0,0 +1,3 @@ +System - System based analysis + + This would include measuring system wide activity. diff --git a/cddl/contrib/dtracetoolkit/System/sar-c.d b/cddl/contrib/dtracetoolkit/System/sar-c.d new file mode 100755 index 00000000000..ef631986858 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/System/sar-c.d @@ -0,0 +1,101 @@ +#!/usr/sbin/dtrace -s +/* + * sar-c.d - sar -c demo in DTrace. + * Written using DTrace (Solaris 10 3/05). + * + * This has been written to demonstrate fetching similar data as sar -c + * from DTrace. This program is intended as a starting point for other + * DTrace scripts, by beginning with familiar statistics. + * + * $Id: sar-c.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: sar-c.d + * + * FIELDS: + * scall/s System calls + * sread/s reads + * swrit/s writes + * fork/s forks + * exec/s execs + * rchar/s read characters + * wchar/s write characters + * + * IDEA: David Rubio, who also wrote the original. + * + * NOTES: + * As this program does not use Kstat, there is no summary since boot line. + * + * SEE ALSO: sar(1) + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 12-Jun-2005 Brendan Gregg Created this. + * 12-Jun-2005 " " Last update. + */ + +#pragma D option quiet + +inline int SCREEN = 21; + +/* + * Initialise variables + */ +dtrace:::BEGIN +{ + scall = 0; sread = 0; swrit = 0; fork = 0; exec = 0; + rchar = 0; wchar = 0; + lines = SCREEN + 1; +} + +/* + * Print header + */ +dtrace:::BEGIN, +tick-1sec +/lines++ > SCREEN/ +{ + printf("%-20s %7s %7s %7s %7s %7s %8s %8s\n", + "Time", "scall/s", "sread/s", "swrit/s", "fork/s", + "exec/s", "rchar/s", "wchar/s"); + lines = 0; +} + +/* + * Probe events + */ +syscall:::entry { scall++; } +sysinfo:::sysread { sread++; } +sysinfo:::syswrite { swrit++; } +sysinfo:::sysfork { fork++; } +sysinfo:::sysvfork { fork++; } +sysinfo:::sysexec { exec++; } +sysinfo:::readch { rchar += arg0; } +sysinfo:::writech { wchar += arg0; } + +/* + * Print output line + */ +profile:::tick-1sec +{ + /* print line */ + printf("%20Y %7d %7d %7d %4d.00 %4d.00 %8d %8d\n", + walltimestamp, scall, sread, swrit, fork, exec, rchar, wchar); + + /* clear counters */ + scall = 0; sread = 0; swrit = 0; fork = 0; exec = 0; + rchar = 0; wchar = 0; +} diff --git a/cddl/contrib/dtracetoolkit/System/syscallbysysc.d b/cddl/contrib/dtracetoolkit/System/syscallbysysc.d new file mode 100755 index 00000000000..86b8ac3e58a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/System/syscallbysysc.d @@ -0,0 +1,10 @@ +#!/usr/sbin/dtrace -s +/* + * syscallbysysc.d - report on syscalls by syscall. DTrace OneLiner. + * + * This is a DTrace OneLiner from the DTraceToolkit. + * + * $Id: syscallbysysc.d 3 2007-08-01 10:50:08Z brendan $ + */ + +syscall:::entry { @num[probefunc] = count(); } diff --git a/cddl/contrib/dtracetoolkit/System/topsyscall b/cddl/contrib/dtracetoolkit/System/topsyscall new file mode 100755 index 00000000000..63ef8c62034 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/System/topsyscall @@ -0,0 +1,184 @@ +#!/usr/bin/ksh +# +# topsyscall - display top syscalls by syscall name. +# Written using DTrace (Solaris 10 3/05). +# +# This program continually prints a report of the top system calls, +# and refreshes the display every 1 second or as specified at the +# command line. +# +# $Id: topsyscall 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: topsyscall [-Cs] [interval [count]] +# +# -C # don't clear the screen +# -s # print per second values +# +# FIELDS: +# load avg load averages, see uptime(1) +# syscalls total syscalls in this interval +# syscalls/s syscalls per second +# SYSCALL system call name +# COUNT total syscalls in this interval +# COUNT/s syscalls per second +# +# INSPIRATION: top(1) by William LeFebvre +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# 13-Jun-2005 Brendan Gregg Created this. +# 20-Apr-2006 " " Last update. +# + +############################## +# --- Process Arguments --- +# + +### Default variables +count=-1; interval=1; opt_persec=0; opt_clear=1 + +### Process options +while getopts Chs name +do + case $name in + C) opt_clear=0 ;; + s) opt_persec=1 ;; + h|?) cat <<-END >&2 + USAGE: topsyscall [-s] [interval [count]] + -C # don't clear the screen + -s # print per second values + eg, + topsyscall # default, 1 second updates + topsyscall 5 # 5 second updates + END + exit 1 + esac +done +shift $(( $OPTIND - 1 )) + +### option logic +if [[ "$1" > 0 ]]; then + interval=$1; shift +fi +if [[ "$1" > 0 ]]; then + count=$1; shift +fi +if (( opt_clear )); then + clearstr=`clear` +else + clearstr=. +fi + + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + #pragma D option destructive + + /* constants */ + inline int OPT_clear = '$opt_clear'; + inline int OPT_persec = '$opt_persec'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + inline int SCREEN = 20; + inline string CLEAR = "'$clearstr'"; + + /* variables */ + dtrace:::BEGIN + { + secs = INTERVAL; + counts = COUNTER; + printf("Tracing... Please wait.\n"); + } + + /* record syscall event */ + syscall:::entry + { + @Name[probefunc] = count(); + @Total = count(); + } + + /* timer */ + profile:::tick-1sec + { + secs--; + } + + /* update screen */ + profile:::tick-1sec + /secs == 0/ + { + /* fetch load averages */ + this->load1a = `hp_avenrun[0] / 65536; + this->load5a = `hp_avenrun[1] / 65536; + this->load15a = `hp_avenrun[2] / 65536; + this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; + this->load5b = ((`hp_avenrun[1] % 65536) * 100) / 65536; + this->load15b = ((`hp_avenrun[2] % 65536) * 100) / 65536; + + /* clear screen */ + OPT_clear ? printf("%s", CLEAR) : 1; + + /* print load average */ + printf("%Y, load average: %d.%02d, %d.%02d, %d.%02d", + walltimestamp, this->load1a, this->load1b, this->load5a, + this->load5b, this->load15a, this->load15b); + + /* calculate per second values if needed */ + OPT_persec ? normalize(@Total, INTERVAL) : 1; + OPT_persec ? normalize(@Name, INTERVAL) : 1; + + /* print syscall count */ + printf(" %s: ", OPT_persec ? "syscalls/s" : "syscalls"); + printa("%@d\n",@Total); + + /* print report */ + trunc(@Name, SCREEN); + printf("\n %-25s %12s\n", "SYSCALL", + OPT_persec ? "COUNT/s" : "COUNT"); + printa(" %-25s %@12d\n", @Name); + printf("\n"); + + /* reset variables */ + trunc(@Name); + clear(@Total); + secs = INTERVAL; + counts--; + } + + /* + * End of program + */ + profile:::tick-1sec + /counts == 0/ + { + exit(0); + } + + /* + * Cleanup for Ctrl-C + */ + dtrace:::END + { + trunc(@Name); + trunc(@Total); + } +' + diff --git a/cddl/contrib/dtracetoolkit/System/uname-a.d b/cddl/contrib/dtracetoolkit/System/uname-a.d new file mode 100755 index 00000000000..77750210969 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/System/uname-a.d @@ -0,0 +1,53 @@ +#!/usr/sbin/dtrace -s +/* + * uname-a.d - "uname -a" demo in DTrace. + * Written using DTrace (Solaris 10 3/05). + * + * This has been written to demonstrate fetching the "uname -a" info + * from a DTrace script, which turns out to be all kernel variables. + * This is intended as a starting point for other DTrace scripts, by + * beginning with familiar statistics. + * + * $Id: uname-a.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: uname-a.d + * + * FIELDS: See uname(1) manpage for documentation. + * + * SEE ALSO: uname + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * 24-Jul-2005 Brendan Gregg Created this. + * 24-Jul-2005 " " Last update. + */ + +#pragma D option quiet +#pragma D option bufsize=8k + +/* print system info */ +dtrace:::BEGIN +{ + printf("%s %s %s %s %s %s %s", + `utsname.sysname, + `utsname.nodename, + `utsname.release, + `utsname.version, + `utsname.machine, + `architecture, + `platform); + + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/Readme b/cddl/contrib/dtracetoolkit/Tcl/Readme new file mode 100644 index 00000000000..68c73528085 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/Readme @@ -0,0 +1,39 @@ +Tcl - DTracing Tcl Programs + + These scripts trace activity of the Tcl programming language, making use + of the Tcl DTrace provider which was integrated into the Tcl source in + version tcl8.4.16. See the Tcl DTrace wiki page for details: + + http://wiki.tcl.tk/19923 + + This provider was written by Daniel Steffen and is currently available + by downloading and compiling the Tcl source with the --enable-dtrace + option to configure. + + Since the DTrace Tcl provider could be developed a little further, there is + a chance that it has changed slightly by the time you are reading this, + causing these scripts to either break or behave oddly. Firstly, check for + newer versions of the DTraceToolkit; if it hasn't been updated and you need + to use these scripts immediately, then updating them shouldn't take + too long. The following was the state of the provider when these scripts + were written - check for changes and update the scripts accordingly, + + provider tcl { + probe proc-entry(procname, argc, argv); + probe proc-return(procname, retcode); + probe proc-result(procname, retcode, retval, retobj); + probe proc-args(procname, args, ...); + probe cmd-entry(cmdname, argc, argv); + probe cmd-return(cmdname, retval); + probe cmd-args(procname, args, ...); + probe inst-start(instname, depth, stackobj); + probe inst-done(instname, depth, stackobj); + probe obj-create(object); + probe obj-free(object); + proobe tcl-probe(strings, ...); + }; + + Update: it looks like two new probes have recently been added to the + provider: proc-info and cmd-info. I'll need to update these scripts to + make use of these new probes. + diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_calldist.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_calldist.d new file mode 100755 index 00000000000..47cbd4c9692 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_calldist.d @@ -0,0 +1,111 @@ +#!/usr/sbin/dtrace -CZs +/* + * tcl_calldist.d - measure Tcl elapsed time for different types of operation. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_calldist.d 63 2007-10-04 04:34:38Z brendan $ + * + * USAGE: tcl_calldist.d [top] # hit Ctrl-C to end + * eg, + * tcl_calldist.d # default, truncate to 10 lines + * tcl_calldist.d 25 # truncate each report section to 25 lines + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * FIELDS: + * 1 Process ID + * 2 Type of call (proc/cmd/total) + * 3 Name of call + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#define TOP 10 /* default output truncation */ +#define B_FALSE 0 + +#pragma D option quiet +#pragma D option defaultargs + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); + top = $1 != 0 ? $1 : TOP; +} + +tcl*:::proc-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->proc[self->depth] = timestamp; +} + +tcl*:::proc-return +/self->proc[self->depth]/ +{ + this->elapsed_incl = timestamp - self->proc[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->proc[self->depth] = 0; + self->exclude[self->depth] = 0; + this->name = copyinstr(arg0); + + @types_incl[pid, "proc", this->name] = + quantize(this->elapsed_incl / 1000); + @types_excl[pid, "proc", this->name] = + quantize(this->elapsed_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +tcl*:::cmd-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->cmd[self->depth] = timestamp; +} + +tcl*:::cmd-return +/self->cmd[self->depth]/ +{ + this->elapsed_incl = timestamp - self->cmd[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->cmd[self->depth] = 0; + self->exclude[self->depth] = 0; + this->name = copyinstr(arg0); + + @types_incl[pid, "cmd", this->name] = + quantize(this->elapsed_incl / 1000); + @types_excl[pid, "cmd", this->name] = + quantize(this->elapsed_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +dtrace:::END +{ + trunc(@types_excl, top); + printf("\nTop %d exclusive elapsed times (us),\n", top); + printa(" PID=%d, %s, %s %@d\n", @types_excl); + + trunc(@types_incl, top); + printf("\nTop %d inclusive elapsed times (us),\n", top); + printa(" PID=%d, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_calls.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_calls.d new file mode 100755 index 00000000000..755efe72bcb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_calls.d @@ -0,0 +1,63 @@ +#!/usr/sbin/dtrace -ZCs +/* + * tcl_calls.d - count Tcl calls (proc/cmd) using DTrace. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_calls.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * USAGE: tcl_calls.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * TYPE Type of call (see below) + * NAME Name of proc or cmd call + * COUNT Number of calls during sample + * + * TYPEs: + * proc procedure + * cmd command + * + * PORTIONS: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +tcl*:::proc-entry +{ + @calls[pid, "proc", copyinstr(arg0)] = count(); +} + +tcl*:::cmd-entry +{ + @calls[pid, "cmd", copyinstr(arg0)] = count(); +} + +dtrace:::END +{ + printf(" %6s %-8s %-52s %8s\n", "PID", "TYPE", "NAME", "COUNT"); + printa(" %6d %-8s %-52s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_calltime.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_calltime.d new file mode 100755 index 00000000000..bab2ade2d50 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_calltime.d @@ -0,0 +1,123 @@ +#!/usr/sbin/dtrace -CZs +/* + * tcl_calltime.d - measure Tcl elapsed times for different types of operation. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_calltime.d 63 2007-10-04 04:34:38Z brendan $ + * + * USAGE: tcl_calltime.d [top] # hit Ctrl-C to end + * eg, + * tcl_calltime.d # default, truncate to 10 lines + * tcl_calltime.d 25 # truncate each report section to 25 lines + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * FIELDS: + * PID Process ID + * TYPE Type of call (proc/cmd/total) + * NAME Name of call + * TOTAL Total elapsed time for calls (us) + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#define TOP 10 /* default output truncation */ +#define B_FALSE 0 + +#pragma D option quiet +#pragma D option defaultargs + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); + top = $1 != 0 ? $1 : TOP; +} + +tcl*:::proc-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->proc[self->depth] = timestamp; +} + +tcl*:::proc-return +/self->proc[self->depth]/ +{ + this->elapsed_incl = timestamp - self->proc[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->proc[self->depth] = 0; + self->exclude[self->depth] = 0; + this->name = copyinstr(arg0); + + @num[pid, "proc", this->name] = count(); + @num[0, "total", "-"] = count(); + @types_incl[pid, "proc", this->name] = sum(this->elapsed_incl); + @types_excl[pid, "proc", this->name] = sum(this->elapsed_excl); + @types_excl[0, "total", "-"] = sum(this->elapsed_excl); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +tcl*:::cmd-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->cmd[self->depth] = timestamp; +} + +tcl*:::cmd-return +/self->cmd[self->depth]/ +{ + this->elapsed_incl = timestamp - self->cmd[self->depth]; + this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth]; + self->cmd[self->depth] = 0; + self->exclude[self->depth] = 0; + this->name = copyinstr(arg0); + + @num[pid, "cmd", this->name] = count(); + @num[0, "total", "-"] = count(); + @types_incl[pid, "cmd", this->name] = sum(this->elapsed_incl); + @types_excl[pid, "cmd", this->name] = sum(this->elapsed_excl); + @types_excl[0, "total", "-"] = sum(this->elapsed_excl); + + self->depth--; + self->exclude[self->depth] += this->elapsed_incl; +} + +dtrace:::END +{ + trunc(@num, top); + printf("\nTop %d counts,\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "COUNT"); + printa(" %6d %-10s %-48s %@8d\n", @num); + + trunc(@types_excl, top); + normalize(@types_excl, 1000); + printf("\nTop %d exclusive elapsed times (us),\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL"); + printa(" %6d %-10s %-48s %@8d\n", @types_excl); + + trunc(@types_incl, top); + normalize(@types_incl, 1000); + printf("\nTop %d inclusive elapsed times (us),\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL"); + printa(" %6d %-10s %-48s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_cpudist.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_cpudist.d new file mode 100755 index 00000000000..69f4ba2bc2e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_cpudist.d @@ -0,0 +1,111 @@ +#!/usr/sbin/dtrace -CZs +/* + * tcl_cpudist.d - measure Tcl on-CPU time for different types of operation. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_cpudist.d 63 2007-10-04 04:34:38Z brendan $ + * + * USAGE: tcl_cpudist.d [top] # hit Ctrl-C to end + * eg, + * tcl_cpudist.d # default, truncate to 10 lines + * tcl_cpudist.d 25 # truncate each report section to 25 lines + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * FIELDS: + * 1 Process ID + * 2 Type of call (proc/cmd/total) + * 3 Name of call + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#define TOP 10 /* default output truncation */ +#define B_FALSE 0 + +#pragma D option quiet +#pragma D option defaultargs + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); + top = $1 != 0 ? $1 : TOP; +} + +tcl*:::proc-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->proc[self->depth] = vtimestamp; +} + +tcl*:::proc-return +/self->proc[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->proc[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->proc[self->depth] = 0; + self->exclude[self->depth] = 0; + this->name = copyinstr(arg0); + + @types_incl[pid, "proc", this->name] = + quantize(this->oncpu_incl / 1000); + @types_excl[pid, "proc", this->name] = + quantize(this->oncpu_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +tcl*:::cmd-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->cmd[self->depth] = vtimestamp; +} + +tcl*:::cmd-return +/self->cmd[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->cmd[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->cmd[self->depth] = 0; + self->exclude[self->depth] = 0; + this->name = copyinstr(arg0); + + @types_incl[pid, "cmd", this->name] = + quantize(this->oncpu_incl / 1000); + @types_excl[pid, "cmd", this->name] = + quantize(this->oncpu_excl / 1000); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +dtrace:::END +{ + trunc(@types_excl, top); + printf("\nTop %d exclusive on-CPU times (us),\n", top); + printa(" PID=%d, %s, %s %@d\n", @types_excl); + + trunc(@types_incl, top); + printf("\nTop %d inclusive on-CPU times (us),\n", top); + printa(" PID=%d, %s, %s %@d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_cputime.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_cputime.d new file mode 100755 index 00000000000..a29a541ed74 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_cputime.d @@ -0,0 +1,123 @@ +#!/usr/sbin/dtrace -CZs +/* + * tcl_cputime.d - measure Tcl on-CPU times for different types of operation. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_cputime.d 63 2007-10-04 04:34:38Z brendan $ + * + * USAGE: tcl_cputime.d [top] # hit Ctrl-C to end + * eg, + * tcl_cputime.d # default, truncate to 10 lines + * tcl_cputime.d 25 # truncate each report section to 25 lines + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * FIELDS: + * PID Process ID + * TYPE Type of call (proc/cmd/total) + * NAME Name of call + * TOTAL Total on-CPU time for calls (us) + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#define TOP 10 /* default output truncation */ +#define B_FALSE 0 + +#pragma D option quiet +#pragma D option defaultargs + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); + top = $1 != 0 ? $1 : TOP; +} + +tcl*:::proc-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->proc[self->depth] = vtimestamp; +} + +tcl*:::proc-return +/self->proc[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->proc[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->proc[self->depth] = 0; + self->exclude[self->depth] = 0; + this->name = copyinstr(arg0); + + @num[pid, "proc", this->name] = count(); + @num[0, "total", "-"] = count(); + @types_incl[pid, "proc", this->name] = sum(this->oncpu_incl); + @types_excl[pid, "proc", this->name] = sum(this->oncpu_excl); + @types_excl[0, "total", "-"] = sum(this->oncpu_excl); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +tcl*:::cmd-entry +{ + self->depth++; + self->exclude[self->depth] = 0; + self->cmd[self->depth] = vtimestamp; +} + +tcl*:::cmd-return +/self->cmd[self->depth]/ +{ + this->oncpu_incl = vtimestamp - self->cmd[self->depth]; + this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth]; + self->cmd[self->depth] = 0; + self->exclude[self->depth] = 0; + this->name = copyinstr(arg0); + + @num[pid, "cmd", this->name] = count(); + @num[0, "total", "-"] = count(); + @types_incl[pid, "cmd", this->name] = sum(this->oncpu_incl); + @types_excl[pid, "cmd", this->name] = sum(this->oncpu_excl); + @types_excl[0, "total", "-"] = sum(this->oncpu_excl); + + self->depth--; + self->exclude[self->depth] += this->oncpu_incl; +} + +dtrace:::END +{ + trunc(@num, top); + printf("\nTop %d counts,\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "COUNT"); + printa(" %6d %-10s %-48s %@8d\n", @num); + + trunc(@types_excl, top); + normalize(@types_excl, 1000); + printf("\nTop %d exclusive on-CPU times (us),\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL"); + printa(" %6d %-10s %-48s %@8d\n", @types_excl); + + trunc(@types_incl, top); + normalize(@types_incl, 1000); + printf("\nTop %d inclusive on-CPU times (us),\n", top); + printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL"); + printa(" %6d %-10s %-48s %@8d\n", @types_incl); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_flow.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_flow.d new file mode 100755 index 00000000000..91468282699 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_flow.d @@ -0,0 +1,86 @@ +#!/usr/sbin/dtrace -Zs +/* + * tcl_flow.d - snoop Tcl execution showing procedure flow using DTrace. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_flow.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * USAGE: tcl_flow.d # hit Ctrl-C to end + * + * This watches Tcl method entries and returns, and indents child + * method calls. + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * PID Process ID + * CALL Tcl command or procedure name + * + * LEGEND: + * -> procedure entry + * <- procedure return + * > command entry + * < command return + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%3s %6s %-16s -- %s\n", "C", "PID", "TIME(us)", "CALL"); +} + +tcl*:::proc-entry +{ + printf("%3d %6d %-16d %*s-> %s\n", cpu, pid, timestamp / 1000, + self->depth * 2, "", copyinstr(arg0)); + self->depth++; +} + +tcl*:::proc-return +{ + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %-16d %*s<- %s\n", cpu, pid, timestamp / 1000, + self->depth * 2, "", copyinstr(arg0)); +} + +tcl*:::cmd-entry +{ + printf("%3d %6d %-16d %*s > %s\n", cpu, pid, timestamp / 1000, + self->depth * 2, "", copyinstr(arg0)); + self->depth++; +} + +tcl*:::cmd-return +{ + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %-16d %*s < %s\n", cpu, pid, timestamp / 1000, + self->depth * 2, "", copyinstr(arg0)); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_flowtime.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_flowtime.d new file mode 100755 index 00000000000..85f1b998a2e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_flowtime.d @@ -0,0 +1,105 @@ +#!/usr/sbin/dtrace -Zs +/* + * tcl_flowtime.d - snoop Tcl execution showing procedure flow and delta times. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_flowtime.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * USAGE: tcl_flowtime.d # hit Ctrl-C to end + * + * This watches Tcl method entries and returns, and indents child + * method calls. + * + * FIELDS: + * C CPU-id + * PID Process ID + * TIME(us) Time since boot, us + * DELTA(us) Elapsed time from previous line to this line + * CALL Tcl command or procedure name + * + * LEGEND: + * -> procedure entry + * <- procedure return + * > command entry + * < command return + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%3s %6s %-16s %9s -- %s\n", "C", "PID", "TIME(us)", + "DELTA(us)", "CALL"); +} + +tcl*:::proc-entry, +tcl*:::proc-return, +tcl*:::cmd-entry, +tcl*:::cmd-return +/self->last == 0/ +{ + self->last = timestamp; +} + +tcl*:::proc-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %6d %-16d %9d %*s-> %s\n", cpu, pid, timestamp / 1000, + this->delta, self->depth * 2, "", copyinstr(arg0)); + self->depth++; + self->last = timestamp; +} + +tcl*:::proc-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %-16d %9d %*s<- %s\n", cpu, pid, timestamp / 1000, + this->delta, self->depth * 2, "", copyinstr(arg0)); + self->last = timestamp; +} + +tcl*:::cmd-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %6d %-16d %9d %*s > %s\n", cpu, pid, timestamp / 1000, + this->delta, self->depth * 2, "", copyinstr(arg0)); + self->depth++; + self->last = timestamp; +} + +tcl*:::cmd-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %-16d %9d %*s < %s\n", cpu, pid, timestamp / 1000, + this->delta, self->depth * 2, "", copyinstr(arg0)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_ins.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_ins.d new file mode 100755 index 00000000000..39518f9b54b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_ins.d @@ -0,0 +1,57 @@ +#!/usr/sbin/dtrace -ZCs +/* + * tcl_ins.d - count Tcl instructions using DTrace. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_ins.d 64 2007-10-04 08:35:29Z claire $ + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * USAGE: tcl_calls.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * TYPE Type of call (see below) + * NAME Name of call + * COUNT Number of calls during sample + * + * TYPEs: + * inst instruction + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +tcl*:::inst-start +{ + @calls[pid, "inst", copyinstr(arg0)] = count(); +} + +dtrace:::END +{ + printf(" %6s %-8s %-52s %8s\n", "PID", "TYPE", "NAME", "COUNT"); + printa(" %6d %-8s %-52s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_insflow.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_insflow.d new file mode 100755 index 00000000000..ba5e01cbf67 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_insflow.d @@ -0,0 +1,123 @@ +#!/usr/sbin/dtrace -Zs +/* + * tcl_insflow.d - snoop Tcl execution showing procedure flow and delta times. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_insflow.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * USAGE: tcl_insflow.d # hit Ctrl-C to end + * + * This watches Tcl method entries and returns, and indents child + * method calls. + * + * FIELDS: + * C CPU-id + * PID Process ID + * TIME(us) Time since boot, us + * DELTA(us) Elapsed time from previous line to this line + * TYPE Type of call (proc/cmd/inst) + * CALL Tcl command or procedure name + * + * LEGEND: + * proc procedure + * cmd command + * inst instruction + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%3s %6s %-16s %9s %5s -- %s\n", "C", "PID", "TIME(us)", + "DELTA(us)", "TYPE", "CALL"); +} + +tcl*:::proc-entry, +tcl*:::proc-return, +tcl*:::cmd-entry, +tcl*:::cmd-return +/self->last == 0/ +{ + self->last = timestamp; +} + +tcl*:::proc-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %6d %-16d %9d %5s %*s-> %s\n", cpu, pid, timestamp / 1000, + this->delta, "proc", self->depth * 2, "", copyinstr(arg0)); + self->depth++; + self->last = timestamp; +} + +tcl*:::proc-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %-16d %9d %5s %*s<- %s\n", cpu, pid, timestamp / 1000, + this->delta, "proc", self->depth * 2, "", copyinstr(arg0)); + self->last = timestamp; +} + +tcl*:::cmd-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %6d %-16d %9d %5s %*s-> %s\n", cpu, pid, timestamp / 1000, + this->delta, "cmd", self->depth * 2, "", copyinstr(arg0)); + self->depth++; + self->last = timestamp; +} + +tcl*:::cmd-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %-16d %9d %5s %*s<- %s\n", cpu, pid, timestamp / 1000, + this->delta, "cmd", self->depth * 2, "", copyinstr(arg0)); + self->last = timestamp; +} + +tcl*:::inst-start +{ + this->delta = (timestamp - self->last) / 1000; + printf("%3d %6d %-16d %9d %5s %*s-> %s\n", cpu, pid, timestamp / 1000, + this->delta, "inst", self->depth * 2, "", copyinstr(arg0)); + self->depth++; + self->last = timestamp; +} + +tcl*:::inst-done +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %-16d %9d %5s %*s<- %s\n", cpu, pid, timestamp / 1000, + this->delta, "inst", self->depth * 2, "", copyinstr(arg0)); + self->last = timestamp; +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_proccalls.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_proccalls.d new file mode 100755 index 00000000000..c874362f096 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_proccalls.d @@ -0,0 +1,53 @@ +#!/usr/sbin/dtrace -Zs +/* + * tcl_methodcalls.d - count Tcl method calls DTrace. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_proccalls.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * USAGE: tcl_methodcalls.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * COUNT Number of calls during sample + * PROCEDURE Tcl procedure name + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +tcl*:::proc-entry +{ + @calls[pid, copyinstr(arg0)] = count(); +} + +dtrace:::END +{ + printf(" %6s %8s %s\n", "PID", "COUNT", "PROCEDURE"); + printa(" %6d %@8d %s\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_procflow.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_procflow.d new file mode 100755 index 00000000000..258c198266b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_procflow.d @@ -0,0 +1,70 @@ +#!/usr/sbin/dtrace -Zs +/* + * tcl_procflow.d - snoop Tcl execution showing procedure flow using DTrace. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_procflow.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * USAGE: tcl_procflow.d # hit Ctrl-C to end + * + * This watches Tcl method entries and returns, and indents child + * method calls. + * + * FIELDS: + * C CPU-id + * TIME(us) Time since boot, us + * PID Process ID + * PROCEDURE Tcl procedure name + * + * LEGEND: + * -> proc entry + * <- proc return + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + printf("%3s %6s %-16s -- %s\n", "C", "PID", "TIME(us)", "PROCEDURE"); +} + +tcl*:::proc-entry +{ + printf("%3d %6d %-16d %*s-> %s\n", cpu, pid, timestamp / 1000, + self->depth * 2, "", copyinstr(arg0)); + self->depth++; +} + +tcl*:::proc-return +{ + self->depth -= self->depth > 0 ? 1 : 0; + printf("%3d %6d %-16d %*s<- %s\n", cpu, pid, timestamp / 1000, + self->depth * 2, "", copyinstr(arg0)); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_stat.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_stat.d new file mode 100755 index 00000000000..a321d700cea --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_stat.d @@ -0,0 +1,137 @@ +#!/usr/sbin/dtrace -Zs +/* + * tcl_stat.d - Tcl operation stats using DTrace. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_stat.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * USAGE: tcl_stat.d [interval [count]] + * + * FIELDS: + * EXEC/s Tcl programs executed per second, including + * those without Tcl provider support + * PROC/s Procedures called, per second + * CMD/s Commands created, per second + * OBJNEW/s Objects created, per second + * OBJFRE/s Objects freed, per second + * OP/s Bytecode operations, per second + * + * The numbers are counts for the interval specified. The default interval + * is 1 second. + * + * If you see a count in "EXECS" but not in the other columns, then you + * may have older Tcl software that does not have the integrated DTrace + * provider (or newer software where the provider has changed). + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option defaultargs + +inline int SCREEN = 21; + +dtrace:::BEGIN +{ + execs = procs = cmds = objnew = objfree = ops = 0; + lines = SCREEN + 1; + interval = $1 ? $1 : 1; + counts = $2 ? $2 : -1; + secs = interval; + first = 1; +} + +profile:::tick-1sec +{ + secs--; +} + +/* + * Print Header + */ +dtrace:::BEGIN, +profile:::tick-1sec +/first || (secs == 0 && lines > SCREEN)/ +{ + printf("%-20s %6s %8s %8s %8s %8s %8s\n", "TIME", "EXEC/s", + "PROC/s", "CMD/s", "OBJNEW/s", "OBJFRE/s", "OP/s"); + lines = 0; + first = 0; +} + +/* + * Tally Data + */ +proc:::exec-success +/execname == "tcl" || execname == "tclsh"/ +{ + execs++; +} + +tcl*:::proc-entry +{ + procs++; +} + +tcl*:::cmd-entry +{ + cmds++; +} + +tcl*:::obj-create +{ + objnew++; +} + +tcl*:::obj-free +{ + objfree++; +} + +tcl*:::inst-start +{ + ops++; +} + +/* + * Print Output + */ +profile:::tick-1sec +/secs == 0/ +{ + printf("%-20Y %6d %8d %8d %8d %8d %8d\n", walltimestamp, + execs / interval, procs / interval, cmds / interval, + objnew / interval, objfree / interval, ops / interval); + execs = procs = cmds = objnew = objfree = ops = 0; + secs = interval; + lines++; + counts--; +} + +/* + * End + */ +profile:::tick-1sec +/counts == 0/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_syscalls.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_syscalls.d new file mode 100755 index 00000000000..239d7d0a447 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_syscalls.d @@ -0,0 +1,66 @@ +#!/usr/sbin/dtrace -Zs +/* + * tcl_syscalls.d - count Tcl calls and syscalls using DTrace. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_syscalls.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * USAGE: tcl_syscalls.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * TYPE Type of call (method/syscall) + * NAME Name of call + * COUNT Number of calls during sample + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +tcl$target:::proc-entry +{ + @calls[pid, "proc", copyinstr(arg0)] = count(); +} + +tcl$target:::cmd-entry +{ + @calls[pid, "cmd", copyinstr(arg0)] = count(); +} + +syscall:::entry +/pid == $target/ +{ + @calls[pid, "syscall", probefunc] = count(); +} + + +dtrace:::END +{ + printf(" %6s %-8s %-52s %8s\n", "PID", "TYPE", "NAME", "COUNT"); + printa(" %6d %-8s %-52s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_syscolors.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_syscolors.d new file mode 100755 index 00000000000..f2529b5344d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_syscolors.d @@ -0,0 +1,139 @@ +#!/usr/sbin/dtrace -Zs +/* + * tcl_syscolors.d - trace Tcl program flow plus syscalls, in color. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_syscolors.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * USAGE: tcl_syscolors.d { -p PID | -c cmd } # hit Ctrl-C to end + * + * This watches Tcl method entries and returns, and indents child + * method calls. + * + * FIELDS: + * C CPU-id + * PID Process ID + * TID Thread ID + * DELTA(us) Elapsed time from previous line to this line + * TYPE Type of call (proc/cmd/syscall) + * NAME Tcl proc/cmd or syscall name + * + * WARNING: Watch the first column carefully, it prints the CPU-id. If it + * changes, then it is very likely that the output has been shuffled. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet +#pragma D option switchrate=10 + +self int depth; + +dtrace:::BEGIN +{ + color_tcl = "\033[2;35m"; /* violet, faint */ + color_line = "\033[1;35m"; /* violet, bold */ + color_syscall = "\033[2;32m"; /* green, faint */ + color_off = "\033[0m"; /* default */ + + printf("%3s %6s %9s %-8s -- %s\n", "C", "PID", "DELTA(us)", "TYPE", + "NAME"); +} + +tcl$target:::method-entry, +tcl$target:::method-return, +syscall:::entry, +syscall:::return +/self->last == 0 && pid == $target/ +{ + self->last = timestamp; +} + +tcl$target:::proc-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%3d %6d %9d %-8s %*s-> %s%s\n", color_tcl, cpu, + pid, this->delta, "proc", self->depth * 2, "", copyinstr(arg0), + color_off); + self->depth++; + self->depthlast = self->depth; + self->last = timestamp; +} + +tcl$target:::proc-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%3d %6d %9d %-8s %*s<- %s%s\n", color_tcl, cpu, + pid, this->delta, "proc", self->depth * 2, "", copyinstr(arg0), + color_off); + self->depthlast = self->depth; + self->last = timestamp; +} + +tcl$target:::cmd-entry +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%3d %6d %9d %-8s %*s-> %s%s\n", color_tcl, cpu, + pid, this->delta, "cmd", self->depth * 2, "", copyinstr(arg0), + color_off); + self->depth++; + self->depthlast = self->depth; + self->last = timestamp; +} + +tcl$target:::cmd-return +{ + this->delta = (timestamp - self->last) / 1000; + self->depth -= self->depth > 0 ? 1 : 0; + printf("%s%3d %6d %9d %-8s %*s<- %s%s\n", color_tcl, cpu, + pid, this->delta, "cmd", self->depth * 2, "", copyinstr(arg0), + color_off); + self->depthlast = self->depth; + self->last = timestamp; +} + +syscall:::entry +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%3d %6d %9d %-8s %*s-> %s%s\n", color_syscall, + cpu, pid, this->delta, "syscall", self->depthlast * 2, "", + probefunc, color_off); + self->last = timestamp; +} + +syscall:::return +/pid == $target/ +{ + this->delta = (timestamp - self->last) / 1000; + printf("%s%3d %6d %9d %-8s %*s<- %s%s\n", color_syscall, + cpu, pid, this->delta, "syscall", self->depthlast * 2, "", + probefunc, color_off); + self->last = timestamp; +} + +proc:::exit +/pid == $target/ +{ + exit(0); +} diff --git a/cddl/contrib/dtracetoolkit/Tcl/tcl_who.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_who.d new file mode 100755 index 00000000000..424ad31bf57 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Tcl/tcl_who.d @@ -0,0 +1,62 @@ +#!/usr/sbin/dtrace -Zs +/* + * tcl_who.d - trace Tcl calls by process using DTrace. + * Written for the Tcl DTrace provider. + * + * $Id: tcl_who.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all Tcl processes on the system with DTrace + * provider support (tcl8.4.16). + * + * USAGE: tcl_who.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID of Tcl + * UID User ID of the owner + * CALLS Number of calls made (proc + cmd) + * ARGS Process name and arguments + * + * Calls is a measure of activity, and is a count of the procedures and + * commands that Tcl called. + * + * The argument list is truncated at 55 characters (up to 80 is easily + * available). To easily read the full argument list, use other system tools; + * on Solaris use "pargs PID". + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +tcl*:::proc-entry, +tcl*:::cmd-entry +{ + @calls[pid, uid, curpsinfo->pr_psargs] = count(); +} + +dtrace:::END +{ + printf(" %6s %6s %6s %-55s\n", "PID", "UID", "CALLS", "ARGS"); + printa(" %6d %6d %@6d %-55.55s\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/User/Readme b/cddl/contrib/dtracetoolkit/User/Readme new file mode 100644 index 00000000000..d737125ca64 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/User/Readme @@ -0,0 +1,3 @@ +User - User based analysis + + This would include activity by UID. diff --git a/cddl/contrib/dtracetoolkit/User/setuids.d b/cddl/contrib/dtracetoolkit/User/setuids.d new file mode 100755 index 00000000000..f66d4415dc7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/User/setuids.d @@ -0,0 +1,82 @@ +#!/usr/sbin/dtrace -s +/* + * setuids.d - snoop setuid calls. This can examine user logins. + * Written in DTrace (Solaris 10 3/05). + * + * $Id: setuids.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: setuids.d + * + * FIELDS: + * UID user ID (from) + * SUID set user ID (to) + * PPID parent process ID + * PID process ID + * PCMD parent command + * CMD command (full arguments) + * + * SEE ALSO: BSM auditing + * + * COPYRIGHT: Copyright (c) 2005 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-May-2004 Brendan Gregg Created this. + * 08-May-2005 " " Used modern variable builtins. + * 28-Jul-2005 " " Last update. + */ + +#pragma D option quiet + +/* + * Print header + */ +dtrace:::BEGIN +{ + printf("%5s %5s %5s %5s %-12s %s\n", + "UID", "SUID", "PPID", "PID", "PCMD", "CMD"); +} + +/* + * Save values + */ +syscall::setuid:entry +{ + self->uid = uid; + self->suid = arg0; + self->ok = 1; +} + +/* + * Print output on success + */ +syscall::setuid:return +/arg0 == 0 && self->ok/ +{ + printf("%5d %5d %5d %5d %-12s %S\n", + self->uid, self->suid, ppid, pid, + curthread->t_procp->p_parent->p_user.u_comm, + curpsinfo->pr_psargs); +} + +/* + * Cleanup + */ +syscall::setuid:return +{ + self->uid = 0; + self->suid = 0; + self->ok = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Version b/cddl/contrib/dtracetoolkit/Version new file mode 100644 index 00000000000..261c8236190 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Version @@ -0,0 +1 @@ +DTraceToolkit version 0.99, 30-Sep-2007 diff --git a/cddl/contrib/dtracetoolkit/Zones/Readme b/cddl/contrib/dtracetoolkit/Zones/Readme new file mode 100644 index 00000000000..578e720c217 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Zones/Readme @@ -0,0 +1,3 @@ +Zones - Zones based analysis + + This would include activity by Zone. diff --git a/cddl/contrib/dtracetoolkit/Zones/zvmstat b/cddl/contrib/dtracetoolkit/Zones/zvmstat new file mode 100755 index 00000000000..e49f89c8ed5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Zones/zvmstat @@ -0,0 +1,277 @@ +#!/usr/bin/ksh +# +# zvmstat - print vmstat style info per Zone. +# This uses DTrace (Solaris 10 3/05). +# +# This program must be run from the global zone as root. +# +# $Id: zvmstat 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: zvmstat [-ht] [interval [count]] +# +# zvmstat # default output +# -t # print times +# eg, +# zvmstat 1 # print every 1 second +# zvmstat 10 5 # print 5 x 10 second samples +# zvmstat -t 5 # print every 5 seconds with time +# +# +# FIELDS: +# re page reclaims +# mf minor faults +# fr pages freed +# sr scan rate +# epi executable pages paged in +# epo executable pages paged out +# epf executable pages freed +# api anonymous pages paged in +# apo anonymous pages paged out +# apf anonymous pages freed +# fpi filesystem pages paged in +# fpo filesystem pages paged out +# fpf filesystem pages freed +# +# NOTES: +# - Zone status should really be provided by Kstat, which currently +# provides system wide values, per CPU and per processor set, but not per +# zone. DTrace can fill this role in the meantime until Kstat supports zones. +# - First output does not contain summary since boot. +# +# SEE ALSO: prstat -Z +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# BUGS: +# - First output may not contain all zones due to how loops are achieved. +# Check for newer versions. +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 11-May-2005 Brendan Gregg Created this. +# 26-Jul-2005 " " Improved code. +# 08-Jan-2006 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### default variables +opt_time=0; interval=1; counts=1 + +### process options +while getopts ht name +do + case $name in + t) opt_time=1 ;; + h|?) cat <<-END >&2 + USAGE: zvmstat [-ht] [interval [count]] + zvmstat # default output + -t # print times + eg, + zvmstat 1 # print every 1 second + zvmstat 10 5 # print 5 x 10 second samples + zvmstat -t 5 # print every 5 seconds with time + END + exit 1 + esac +done +shift $(( OPTIND - 1 )) + +### option logic +if (( "0$1" > 0 )); then + interval=$1; counts=-1; shift +fi +if (( "0$1" > 0 )); then + counts=$1; shift +fi + + +################################# +# --- Main Program, DTrace --- +# +dtrace -n ' + #pragma D option quiet + #pragma D option destructive + #pragma D option switchrate=10 + + /* + * Command line arguments + */ + inline int OPT_time = '$opt_time'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$counts'; + + /* + * Initialise variables + */ + dtrace:::BEGIN + { + secs = INTERVAL; + counts = COUNTER; + zonemax = 0; + listing = 1; + re[""] = 0; pi[""] = 0; po[""] = 0; + mf[""] = 0; sr[""] = 0; fr[""] = 0; + epi[""] = 0; epo[""] = 0; epf[""] = 0; + api[""] = 0; apo[""] = 0; apf[""] = 0; + fpi[""] = 0; fpo[""] = 0; fpf[""] = 0; + } + + /* + * Build zonelist array + * + * Here we want the output of a command to be saved into an array + * inside dtrace. This is done by running the command, sending the + * output to /dev/null, and by probing its write syscalls from dtrace. + * + * This is an example of a "scraper". + */ + + /* + * List zones + */ + dtrace:::BEGIN + { + /* run zoneadm */ + system("/usr/sbin/zoneadm list > /dev/null; echo END > /dev/null"); + } + + /* + * Scrape zone listing + */ + syscall::write:entry + /listing && (execname == "zoneadm") && + (curthread->t_procp->p_parent->p_ppid == $pid)/ + { + /* read zoneadm output */ + zonelist[zonemax] = stringof(copyin(arg1, arg2 - 1)); + + /* increment max number of zones */ + zonemax++; + } + + /* + * Finish scraping zones + */ + syscall::write:entry + /listing && (execname == "sh") && (ppid == $pid)/ + { + /* + * this end tag lets us know our zonelist has finished. + * thanks A. Packer. + */ + listing = stringof(copyin(arg1, arg2 - 1)) == "END" ? 0 : 1; + } + + /* + * Record vminfo counters + */ + vminfo:::pgrec { re[zonename] += arg0; } + vminfo:::as_fault { mf[zonename] += arg0; } + vminfo:::scan { sr[zonename] += arg0; } + vminfo:::execpgin { epi[zonename] += arg0; } + vminfo:::execpgout { epo[zonename] += arg0; } + vminfo:::execfree { epf[zonename] += arg0; fr[zonename] += arg0; } + vminfo:::anonpgin { api[zonename] += arg0; } + vminfo:::anonpgout { apo[zonename] += arg0; } + vminfo:::anonfree { apf[zonename] += arg0; fr[zonename] += arg0; } + vminfo:::fspgin { fpi[zonename] += arg0; } + vminfo:::fspgout { fpo[zonename] += arg0; } + vminfo:::fsfree { fpf[zonename] += arg0; fr[zonename] += arg0; } + + /* + * Timer + */ + profile:::tick-1sec + { + secs--; + } + + /* + * Check for exit + */ + profile:::tick-1sec + /counts == 0/ + { + exit(0); + } + + /* + * Print header line + */ + profile:::tick-1sec + /secs == 0/ + { + /* set counters */ + secs = INTERVAL; + counts--; + zonei = 0; + + /* print time */ + OPT_time ? printf("\n%Y,\n",walltimestamp) : 1; + + /* print output line */ + printf("%10s %4s %5s %4s %5s %4s %4s %4s %4s %4s %4s %4s %4s %4s\n", + "ZONE", "re", "mf", "fr", "sr", "epi", "epo", "epf", "api", "apo", + "apf", "fpi", "fpo", "fpf"); + + /* ensure zone writes are triggered */ + printf(" \b"); + } + + /* + * Print zone status line + * + * This is a fairly interesting function in that it loops over the keys in + * an associative array and prints out the values. DTrace cant really do + * loops, and generally doesnt need to. We "cheat" by generating writes + * in the above probe which in turn trigger the probe below which + * contains the contents of each loop. Dont do this at home! We are + * supposed to use aggreagations instead, wherever possible. + * + * This is an example of a "feedback loop". + */ + syscall::write:return + /pid == $pid && zonei < zonemax/ + { + /* fetch zonename */ + self->zone = zonelist[zonei]; + + /* print output */ + printf("%10s %4d %5d %4d %5d %4d %4d %4d %4d %4d %4d %4d %4d %4d\n", + self->zone, re[self->zone], mf[self->zone], fr[self->zone], + sr[self->zone], epi[self->zone], epo[self->zone], + epf[self->zone], api[self->zone], apo[self->zone], + apf[self->zone], fpi[self->zone], fpo[self->zone], + fpf[self->zone]); + + /* clear values */ + re[self->zone] = 0; mf[self->zone] = 0; fr[self->zone] = 0; + sr[self->zone] = 0; epi[self->zone] = 0; epo[self->zone] = 0; + epf[self->zone] = 0; api[self->zone] = 0; apo[self->zone] = 0; + apf[self->zone] = 0; fpi[self->zone] = 0; fpo[self->zone] = 0; + fpf[self->zone] = 0; + self->zone = 0; + + /* go to next zone */ + zonei++; + } +' + diff --git a/cddl/contrib/dtracetoolkit/dexplorer b/cddl/contrib/dtracetoolkit/dexplorer new file mode 100755 index 00000000000..002c8037635 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/dexplorer @@ -0,0 +1,547 @@ +#!/usr/bin/ksh +# +# dexplorer - DTrace system explorer, runs a collection of scripts. +# Written using DTrace (Solaris 10 3/05). +# +# This program automatically runs a collection of DTrace scripts to examine +# many areas of the system, and places the output in a meaningful directory +# structure that is tar'd and gzip'd. +# +# $Id: dexplorer 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: dexplorer [-yDT] [-d outputdir] [-i interval] +# +# -q # quiet mode +# -y # "yes", don't prompt for confirmation +# -D # don't delete output dir +# -T # don't create output tar.gz +# -d outputdir # output directory +# -i interval # interval for each sample +# eg, +# dexplorer # default is 5 second samples +# dexplorer -y -i30 # no prompting, with 30 second samples +# +# SEE ALSO: DTraceToolkit +# +# THANKS: David Visser, et all. for the idea and encouragement. +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# CODE: +# +# This is currently a monolithic script, and while it contains only +# a few dozen straigftforward DTrace scripts I think it's desirable to +# keep it that way. The scripts themselves have designed to be very +# generic (eg, switching on all sdt:::), and are aggregations to keep a +# limit on the size of the output. +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 23-Jun-2005 Brendan Gregg Created this. +# 28-Jun-2005 " " Last update. + +# +# Default variables +# +interval=5 # time of each sample +verbose=1 # print screen output +prompt=1 # prompt before run +tar=1 # create tar file +delete=1 # delete output dirs +dtrace=/usr/sbin/dtrace # path to dtrace +root=. # default output dir +PATH=/usr/bin:/usr/sbin # safe path +dir=de_`uname -n`_`date +%Y%m%d%H%M` # OUTPUT FILENAME +samples=20 # max number of tests +current=0 # current sample + +# +# Process options +# +while getopts d:hi:qyDT name +do + case $name in + d) root=$OPTARG ;; + i) interval=$OPTARG ;; + q) verbose=0 ;; + y) prompt=0 ;; + D) delete=0 ;; + T) tar=0 ;; + h|?) cat <<-END >&2 + USAGE: dexplorer [-qyDT] [-d outputdir] [-i interval] + + -q # quiet mode + -y # "yes", don't prompt for confirmation + -D # don't delete output dir + -T # don't create output tar.gz + -d outputdir # output directory + -i interval # interval for each sample + eg, + dexplorer # default is 5 second samples + dexplorer -y -i30 # no prompting, with 30 second samples + END + exit 1 + esac +done +shift $(( OPTIND - 1 )) + +# +# Confirm path +# +if [[ "$prompt" == "1" ]] ; then + if [[ "$root" == "." ]]; then + print "Output dir will be the current dir ($PWD)." + else + print "Output dir will be $root" + fi + print -n "Hit enter for yes, or type path: " + read ans junk + if [[ "$ans" == [yY] || "$ans" == [yY]es ]]; then + print "WARNING: I didn't ask for \"$ans\"!" + print "\tI was asking for the path or just enter." + print "\tignoring \"$ans\"..." + fi + if [[ "$ans" != "" ]]; then + root=$ans + print "Output is now $root." + fi +fi + +# +# Sanity checks +# +if [[ "$interval" == *[a-zA-Z]* ]]; then + print "ERROR2: Invalid interval $interval.\n" + print "Please use a number of seconds." + exit 2 +fi +if (( ${#interval} < 1 )); then + print "ERROR3: Length of interval $interval too short.\n" + print "Minimum 1 second." + exit 3 +fi +if [[ ! -d "$root" ]]; then + print "ERROR4: Output directory \"$root\" does not exist.\n" + print "Perhaps try a mkdir first?" + print "or use an existing dir, eg \"/tmp\"" + exit 4 +fi +if [[ ! -w "$root" ]]; then + print "ERROR5: Can't write to output directory \"$root\".\n" + print "Are you logged in as root?" + print "Perhaps try another directory, eg \"/tmp\"" + exit 5 +fi +if [[ `$dtrace -b1k -qn 'BEGIN { trace(pid); exit(0); }'` == "" ]]; then + print "ERROR6: Unable to run dtrace!\n" + print "Perhaps this is a permission problem? Try running as root." + exit 6 +fi + +# calculate total time +(( total = interval * samples )) +if (( total > 180 )); then + (( total = total / 60 )) + total="$total minutes" +else + total="$total seconds" +fi + +# +# Common Functions +# +function decho { + if (( verbose )); then print "$*"; fi +} +clean="sed /^\$/d" +header='dtrace:::BEGIN { + printf("%Y, ", walltimestamp); + printf("%s %s %s %s %s, ", `utsname.sysname, `utsname.nodename, + `utsname.release, `utsname.version, `utsname.machine); + printf("%d secs\n",'$interval'); + } + profile:::tick-'$interval'sec { exit(0); } + ' +function dstatus { + if (( verbose )); then + (( percent = current * 100 / samples )) + printf "%3d%% $*\n" $percent + (( current = current + 1 )) + fi +} + +######################################## +# START # +######################################## + +# +# Make dirs +# +err=0 +cd $root +(( err = err + $? )) +mkdir $dir +(( err = err + $? )) +cd $dir +(( err = err + $? )) +base1=${PWD##*/} +base2=${dir##*/} +if [[ "$base1" != "$base2" || "$err" != "0" ]]; then + print "ERROR7: tried to mkdir $dir from $root, but something failed.\n" + print "Check directories before rerunning." + exit 7 +fi +mkdir Cpu +mkdir Disk +mkdir Mem +mkdir Net +mkdir Proc +mkdir Info + +# +# Create Log +# +decho "Starting dexplorer ver 0.76." +decho "Sample interval is $interval seconds. Total run is > $total." +( print "dexplorer ver 0.76\n------------------" +print -n "System: " +uname -a +print -n "Start: " +date ) > log + +# +# Capture Standard Info +# +args='pid,ppid,uid,gid,projid,zoneid,pset,pri,nice,' +args=$args'class,vsz,rss,time,pcpu,pmem,args' +uname -a > Info/uname-a # System +psrinfo -v > Info/psrinfo-v # CPU +prtconf > Info/prtconf # Memory (+ devices) +df -k > Info/df-k # Disk +ifconfig -a > Info/ifconfig-a # Network +ps -eo $args > Info/ps-o # Processes +uptime > Info/uptime # Load + +# +# Cpu Tests, DTrace +# + +dstatus "Interrupts by CPU..." +$dtrace -qn "$header"' + sdt:::interrupt-start { @num[cpu] = count(); } + dtrace:::END + { + printf("%-16s %16s\n", "CPU", "INTERRUPTS"); + printa("%-16d %@16d\n", @num); + } +' | $clean > Cpu/interrupt_by_cpu + +dstatus "Interrupt times..." +$dtrace -qn "$header"' + sdt:::interrupt-start { self->ts = vtimestamp; } + sdt:::interrupt-complete + /self->ts && arg0 != 0/ + { + this->devi = (struct dev_info *)arg0; + self->name = this->devi != 0 ? + stringof(`devnamesp[this->devi->devi_major].dn_name) : "?"; + this->inst = this->devi != 0 ? this->devi->devi_instance : 0; + @num[self->name, this->inst] = sum(vtimestamp - self->ts); + self->name = 0; + } + sdt:::interrupt-complete { self->ts = 0; } + dtrace:::END + { + printf("%11s %16s\n", "DEVICE", "TIME (ns)"); + printa("%10s%-3d %@16d\n", @num); + } +' | $clean > Cpu/interrupt_time + +dstatus "Dispatcher queue length by CPU..." +$dtrace -qn "$header"' + profile:::profile-1000 + { + this->num = curthread->t_cpu->cpu_disp->disp_nrunnable; + @length[cpu] = lquantize(this->num, 0, 100, 1); + } + dtrace:::END { printa(" CPU %d%@d\n", @length); } +' | $clean > Cpu/dispqlen_by_cpu + +dstatus "Sdt counts..." +$dtrace -qn "$header"' + sdt:::{ @num[probefunc, probename] = count(); } + dtrace:::END + { + printf("%-32s %-32s %10s\n", "FUNC", "NAME", "COUNT"); + printa("%-32s %-32s %@10d\n", @num); + } +' | $clean > Cpu/sdt_count + +# +# Disk Tests, DTrace +# + +dstatus "Pages paged in by process..." +$dtrace -qn "$header"' + vminfo:::pgpgin { @pg[pid, execname] = sum(arg0); } + dtrace:::END + { + printf("%6s %-16s %16s\n", "PID", "CMD", "PAGES"); + printa("%6d %-16s %@16d\n", @pg); + } +' | $clean > Disk/pgpgin_by_process + +dstatus "Files opened successfully count..." +$dtrace -qn "$header"' + syscall::open*:entry { self->file = copyinstr(arg0); self->ok = 1; } + syscall::open*:return /self->ok && arg0 != -1/ + { + @num[self->file] = count(); + } + syscall::open*:return /self->ok/ { self->file = 0; self->ok = 0; } + dtrace:::END + { + printf("%-64s %8s\n", "FILE", "COUNT"); + printa("%-64s %@8d\n", @num); + } +' | $clean > Disk/fileopen_count + +dstatus "Disk I/O size distribution by process..." +$dtrace -qn "$header"' + io:::start { @size[pid, execname] = quantize(args[0]->b_bcount); } +' | $clean > Disk/sizedist_by_process + +# +# Mem Tests, DTrace +# + +dstatus "Minor faults by process..." +$dtrace -qn "$header"' + vminfo:::as_fault { @mem[pid, execname] = sum(arg0); } + dtrace:::END + { + printf("%6s %-16s %16s\n", "PID", "CMD", "MINFAULTS"); + printa("%6d %-16s %@16d\n", @mem); + } +' | $clean > Mem/minf_by_process + + +dstatus "Vminfo data by process..." +$dtrace -qn "$header"' + vminfo::: { @data[pid, execname, probename] = sum(arg0); } + dtrace:::END + { + printf("%6s %-16s %-16s %16s\n", + "PID", "CMD", "STATISTIC", "VALUE"); + printa("%6d %-16s %-16s %@16d\n", @data); + } +' | $clean > Mem/vminfo_by_process + +# +# Net Tests, DTrace +# + +dstatus "Mib data by mib statistic..." +$dtrace -qn "$header"' + mib::: { @data[probename] = sum(arg0); } + dtrace:::END + { + printf("%-32s %16s\n", "STATISTIC", "VALUE"); + printa("%-32s %@16d\n", @data); + } +' | $clean > Net/mib_data + +dstatus "TCP write bytes by process..." +$dtrace -qn "$header"' + fbt:ip:tcp_output:entry + { + this->size = msgdsize(args[1]); + @size[pid, execname] = sum(this->size); + } + dtrace:::END + { + printf("%6s %-16s %12s\n", "PID", "CMD", "BYTES"); + printa("%6d %-16s %@12d\n", @size); + } +' | $clean > Net/tcpw_by_process + +# +# Proc Tests, DTrace +# + +dstatus "Sample process @ 1000 Hz..." +$dtrace -qn "$header"' + profile:::profile-1000 + { + @num[pid, curpsinfo->pr_psargs] = count(); + } + dtrace:::END + { + printf("%6s %12s %s\n", "PID", "SAMPLES", "ARGS"); + printa("%6d %@12d %S\n", @num); + } +' | $clean > Proc/sample_process + +dstatus "Syscall count by process..." +$dtrace -qn "$header"' + syscall:::entry { @num[pid, execname, probefunc] = count(); } + dtrace:::END + { + printf("%6s %-24s %-24s %8s\n", + "PID", "CMD", "SYSCALL", "COUNT"); + printa("%6d %-24s %-24s %@8d\n", @num); + } +' | $clean > Proc/syscall_by_process + +dstatus "Syscall count by syscall..." +$dtrace -qn "$header"' + syscall:::entry { @num[probefunc] = count(); } + dtrace:::END + { + printf("%-32s %16s\n", "SYSCALL", "COUNT"); + printa("%-32s %@16d\n", @num); + } +' | $clean > Proc/syscall_count + +dstatus "Read bytes by process..." +$dtrace -qn "$header"' + sysinfo:::readch { @bytes[pid, execname] = sum(arg0); } + dtrace:::END + { + printf("%6s %-16s %16s\n", "PID", "CMD", "BYTES"); + printa("%6d %-16s %@16d\n", @bytes); + } +' | $clean > Proc/readb_by_process + +dstatus "Write bytes by process..." +$dtrace -qn "$header"' + sysinfo:::writech { @bytes[pid, execname] = sum(arg0); } + dtrace:::END + { + printf("%6s %-16s %16s\n", "PID", "CMD", "BYTES"); + printa("%6d %-16s %@16d\n", @bytes); + } +' | $clean > Proc/writeb_by_process + +dstatus "Sysinfo counts by process..." +$dtrace -qn "$header"' + sysinfo::: { @num[pid, execname, probename] = sum(arg0); } + dtrace:::END + { + printf("%6s %-16s %-16s %16s\n", + "PID", "CMD", "STATISTIC", "COUNT"); + printa("%6d %-16s %-16s %@16d\n", @num); + } +' | $clean > Proc/sysinfo_by_process + +dstatus "New process counts with arguments..." +$dtrace -qn "$header"' + proc:::exec-success + { + @num[pid, ppid, curpsinfo->pr_psargs] = count(); + } + dtrace:::END + { + printf("%6s %6s %8s %s\n", "PID", "PPID", "COUNT", "ARGS"); + printa("%6d %6d %@8d %S\n", @num); + } +' | $clean > Proc/newprocess_count + +dstatus "Signal counts..." +$dtrace -qn "$header"' + proc:::signal-send { + @num[execname,args[2],stringof(args[1]->pr_fname)] = count(); + } + dtrace:::END + { + printf("%-16s %-8s %-16s %8s\n", + "FROM", "SIG", "TO", "COUNT"); + printa("%-16s %-8d %-16s %@8d\n", @num); + } +' | $clean > Proc/signal_count + +dstatus "Syscall error counts..." +$dtrace -qn "$header"' + syscall:::return /(int)arg0 == -1/ + { + @num[pid, execname, probefunc, errno] = count(); + } + dtrace:::END + { + printf("%6s %-16s %-32s %-6s %8s\n", + "PID", "CMD", "SYSCALL", "ERRNO", "COUNT"); + printa("%6d %-16s %-32s %-6d %@8d\n", @num); + } +' | $clean > Proc/syscall_errors + + +########### +# Done +# +( print -n "End: " +date ) >> log +decho "100% Done." +if (( tar )); then + cd .. + tar cf $dir.tar $dir + gzip $dir.tar + decho "File is $dir.tar.gz" +fi +if (( delete && tar )); then + cd $dir + # this could be all an "rm -r $dir", but since it will be run + # as root on production servers - lets be analy cautious, + rm Cpu/interrupt_by_cpu + rm Cpu/interrupt_time + rm Cpu/dispqlen_by_cpu + rm Cpu/sdt_count + rm Disk/pgpgin_by_process + rm Disk/fileopen_count + rm Disk/sizedist_by_process + rm Mem/minf_by_process + rm Mem/vminfo_by_process + rm Net/mib_data + rm Net/tcpw_by_process + rm Proc/sample_process + rm Proc/syscall_by_process + rm Proc/syscall_count + rm Proc/readb_by_process + rm Proc/writeb_by_process + rm Proc/sysinfo_by_process + rm Proc/newprocess_count + rm Proc/signal_count + rm Proc/syscall_errors + rmdir Cpu + rmdir Disk + rmdir Mem + rmdir Net + rmdir Proc + rm Info/uname-a + rm Info/psrinfo-v + rm Info/prtconf + rm Info/df-k + rm Info/ifconfig-a + rm Info/ps-o + rm Info/uptime + rmdir Info + rm log + cd .. + rmdir $dir +else + decho "Directory is $dir" +fi + diff --git a/cddl/contrib/dtracetoolkit/dvmstat b/cddl/contrib/dtracetoolkit/dvmstat new file mode 100755 index 00000000000..41f40e39e78 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/dvmstat @@ -0,0 +1,250 @@ +#!/usr/bin/sh +# +# dvmstat - vmstat by PID/name/command. +# Written using DTrace (Solaris 10 3/05). +# +# This program provides vmstat like data for one particular PID, a +# process name, or when running a command. It prints statistics +# every second. +# +# $Id: dvmstat 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: dvmstat { -p PID | -n name | command } +# eg, +# dvmstat -p 1871 # examine PID 1871 +# dvmstat -n tar # examine processes called "tar" +# dvmstat df -h # run and examine "df -h" +# +# FIELDS: +# re page reclaims Kbytes +# maj major faults Kbytes +# mf minor faults Kbytes +# fr page frees Kbytes +# epi executable page ins Kbytes +# epo executable page out Kbytes +# api anonymous page ins Kbytes +# apo anonymous page outs Kbytes +# fpi filesystem page ins Kbytes +# fpo filesystem page outs Kbytes +# sy system calls number +# +# SEE ALSO: vmstat(1M) +# +# NOTES: +# +# When using dvmstat to run a command - if the command takes some time +# to execute, dvmstat will print output every second. If the command runs +# in less than a second, then the only one line of output will be printed. +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 12-Jun-2005 Brendan Gregg Created this. +# 08-Jan-2006 " " Last update. +# + +############################## +# --- Process Arguments --- +# + +### Default variables +opt_pid=0; opt_name=0; pid=0; pname="."; opt_command=0; command="" + +### Process options +while getopts hn:p: name +do + case $name in + p) opt_pid=1; pid=$OPTARG ;; + n) opt_name=1; pname=$OPTARG ;; + h|?) cat <<-END >&2 + USAGE: dvmstat [-h] { -p PID | -n name | command } + -p PID # examine this PID + -n name # examine this process name + eg, + dvmstat -p 1871 # examine PID 1871 + dvmstat -n tar # examine processes called "tar" + dvmstat df -h # run and examine "df -h" + END + exit 1 + esac +done +shift `expr $OPTIND - 1` + + +### Option logic +if [ $opt_pid -eq 0 -a $opt_name -eq 0 ]; then + opt_command=1 + if [ "$*" = "" ]; then + $0 -h + exit + fi + command="$*" +fi + + +################################# +# --- Main Program, DTrace --- +# +dtrace=' + #pragma D option quiet + + /* + * Command line arguments + */ + inline int OPT_pid = '$opt_pid'; + inline int OPT_name = '$opt_name'; + inline int OPT_command = '$opt_command'; + inline int PID = '$pid'; + inline string NAME = "'$pname'"; + inline string COMMAND = "'$command'"; + inline int SCREEN = 21; + + /* + * Initialise variables + */ + dtrace:::BEGIN + { + epi = 0; epo = 0; api = 0; apo = 0; fpi = 0; fpo = 0; + re = 0; mf = 0; maj = 0; fr = 0; sy = 0; + lines = SCREEN + 1; + header = 0; + } + + /* + * Print header + */ + dtrace:::BEGIN, + dtrace:::END, + profile:::tick-1sec + /(OPT_command && probename == "END") || + (!(OPT_command && probename == "BEGIN") && lines++ > SCREEN)/ + { + printf("%6s %5s %5s %4s %4s %4s %4s %4s %4s %4s %6s\n", + "re", "maj", "mf", "fr", "epi", "epo", "api", "apo", + "fpi", "fpo", "sy"); + lines = 0; + } + + /* + * Probe events + * + * this intentionally does not use an associative array for storing data, + * for reasons of performance. + */ + + vminfo:::execpgin + /(OPT_pid && pid == PID) || + (OPT_name && execname == NAME) || + (OPT_command && pid == $target)/ + { epi += arg0; } + + vminfo:::execpgout + /(OPT_pid && pid == PID) || + (OPT_name && execname == NAME) || + (OPT_command && pid == $target)/ + { epo += arg0; } + + vminfo:::anonpgin + /(OPT_pid && pid == PID) || + (OPT_name && execname == NAME) || + (OPT_command && pid == $target)/ + { api += arg0; } + + vminfo:::anonpgout + /(OPT_pid && pid == PID) || + (OPT_name && execname == NAME) || + (OPT_command && pid == $target)/ + { apo += arg0; } + + vminfo:::fspgin + /(OPT_pid && pid == PID) || + (OPT_name && execname == NAME) || + (OPT_command && pid == $target)/ + { fpi += arg0; } + + vminfo:::fspgout + /(OPT_pid && pid == PID) || + (OPT_name && execname == NAME) || + (OPT_command && pid == $target)/ + { fpo += arg0; } + + vminfo:::pgrec + /(OPT_pid && pid == PID) || + (OPT_name && execname == NAME) || + (OPT_command && pid == $target)/ + { re += arg0; } + + vminfo:::as_fault + /(OPT_pid && pid == PID) || + (OPT_name && execname == NAME) || + (OPT_command && pid == $target)/ + { mf += arg0; } + + vminfo:::maj_fault + /(OPT_pid && pid == PID) || + (OPT_name && execname == NAME) || + (OPT_command && pid == $target)/ + { maj += arg0; } + + vminfo:::dfree + /(OPT_pid && pid == PID) || + (OPT_name && execname == NAME) || + (OPT_command && pid == $target)/ + { fr += arg0; } + + syscall:::entry + /(OPT_pid && pid == PID) || + (OPT_name && execname == NAME) || + (OPT_command && pid == $target)/ + { sy++; } + + /* + * Print output line + */ + profile:::tick-1sec, + dtrace:::END + { + /* convert to Kbytes */ + re *= `_pagesize / 1024; + maj *= `_pagesize / 1024; + mf *= `_pagesize / 1024; + fr *= `_pagesize / 1024; + epi *= `_pagesize / 1024; + epo *= `_pagesize / 1024; + api *= `_pagesize / 1024; + apo *= `_pagesize / 1024; + fpi *= `_pagesize / 1024; + fpo *= `_pagesize / 1024; + + /* print line */ + printf("%6d %5d %5d %4d %4d %4d %4d %4d %4d %4d %6d\n", + re, maj, mf, fr, epi, epo, api, apo, fpi, fpo, sy); + + /* clear counters */ + epi = 0; epo = 0; api = 0; apo = 0; fpi = 0; fpo = 0; + re = 0; mf = 0; maj = 0; fr = 0; sy = 0; + } +' + +### Run DTrace +if [ $opt_command -eq 1 ]; then + /usr/sbin/dtrace -n "$dtrace" -x evaltime=exec -c "$command" >&2 +else + /usr/sbin/dtrace -n "$dtrace" >&2 +fi + diff --git a/cddl/contrib/dtracetoolkit/errinfo b/cddl/contrib/dtracetoolkit/errinfo new file mode 100755 index 00000000000..79160b18e57 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/errinfo @@ -0,0 +1,180 @@ +#!/usr/bin/perl +# +# errinfo - report on syscall failures and print errno error messages. +# Written using Perl and DTrace (Solaris 10 03/05) +# +# When system calls fail, an errno variable is set to convay a meaningful +# message to the end user - so long as the program does something with it +# (eg, "ls" printing "No such file or directory"). This program fetches +# and prints details for all syscall failures along with their message, +# whether the failing program is already printing this info or not. +# +# $Id: errinfo 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: errinfo [-ch] [-p PID] [-n name] +# +# -c # counts - aggregate style +# -p PID # examine this PID only +# -n name # examine processes with this name only +# eg, +# errinfo # default output - snoop event style +# errinfo -n ssh # examine "ssh" processes only +# errinfo -cn ssh # examine "ssh" using counts +# +# FIELDS: +# EXEC Program name (truncated) +# SYSCALL System call name +# ERR Value of errno +# DESC Description of errno message +# +# SEE ALSO: /usr/include/sys/errno.h +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 18-Apr-2005 Brendan Gregg Created this. +# 20-Apr-2006 " " Last update. +# + +use Getopt::Std; + +# +# Defaults +# +$FILTER = ""; +$COUNT = 0; + +# +# Command line arguments +# +&Usage() if $ARGV[0] eq "--help"; +getopts('ch:n:p:') || &Usage(); +&Usage() if $opt_h; +$COUNT = 1 if $opt_c; +$FILTER = "&& execname == \"$opt_n\"" if defined $opt_n; +$FILTER = "&& pid == $opt_p" if defined $opt_p; + +# +# Load errno descriptions +# +open(ERRNO,"/usr/include/sys/errno.h") || die "ERROR1: reading errno.h: $!\n"; +while (chomp($line = )) { + next unless $line =~ /^#define/; + ($errno,$desc) = $line =~ /^#define\s+\S+\s+(\d+)\s+\/\*(.*)\*\//; + $Errno{$errno} = $desc; +} +close ERRNO; + +# +# Declare DTrace script +# + if ($COUNT) { # aggregate style +$dtrace = <)) { + + ### Print count header + if ($COUNT && $header) { + printf("\n%16s %16s %4s %6s %s\n", + "EXEC","SYSCALL","ERR","COUNT","DESC"); + $header = 0; + } + + ### Split data + ($execname,$syscall,$errno,$counts) = split(' ',$line); + next if $errno eq ""; + + ### Fetch errno description + $desc = $Errno{$errno}; + + ### Print output line + if ($COUNT) { + printf("%16s %16s %4d %6d %s\n", + $execname,$syscall,$errno,$counts,$desc); + } else { + printf("%16s %16s %4d %s\n",$execname,$syscall,$errno,$desc); + } +} +close(DTRACE); + +# +# Triggered by signals +# +sub Cleanup_Signal { +} + +# +# Usage message +# +sub Usage { + print STDERR "USAGE: errinfo [-ch] [-p PID] [-n name]\n"; + print STDERR <&2 + USAGE: execsnoop [-a|-A|-ehjsvZ] [-c command] + execsnoop # default output + -a # print all data + -A # dump all data, space delimited + -e # safe output, parseable + -j # print project ID + -s # print start time, us + -v # print start time, string + -Z # print zonename + -c command # command name to snoop + eg, + execsnoop -v # human readable timestamps + execsnoop -Z # print zonename + execsnoop -c ls # snoop ls commands only + END + exit 1 + esac +done + +### option logic +if [ $opt_dump -eq 1 ]; then + opt_time=0; opt_timestr=0; opt_zone=0; opt_proj=0 +fi +if [ $opt_cmd -eq 1 ]; then + filter=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_dump = '$opt_dump'; + inline int OPT_cmd = '$opt_cmd'; + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_safe = '$opt_safe'; + inline int OPT_proj = '$opt_proj'; + inline int FILTER = '$filter'; + inline string COMMAND = "'$command'"; + + #pragma D option quiet + #pragma D option switchrate=10hz + + /* + * Print header + */ + dtrace:::BEGIN + { + /* print optional headers */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "STRTIME") : 1; + OPT_zone ? printf("%-10s ", "ZONE") : 1; + OPT_proj ? printf("%5s ", "PROJ") : 1; + + /* print main headers */ + OPT_dump ? printf("%s %s %s %s %s %s %s %s\n", + "TIME", "ZONE", "PROJ", "UID", "PID", "PPID", "COMM", "ARGS") : + printf("%5s %6s %6s %s\n", "UID", "PID", "PPID", "ARGS"); + } + + /* + * Print exec event + */ + syscall::execve:return + /(FILTER == 0) || (OPT_cmd == 1 && COMMAND == execname)/ + { + /* print optional fields */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%-10s ", zonename) : 1; + OPT_proj ? printf("%5d ", curpsinfo->pr_projid) : 1; + + /* print main data */ + OPT_dump ? printf("%d %s %d %d %d %d %s ", timestamp/1000, + zonename, curpsinfo->pr_projid, uid, pid, ppid, execname) : + printf("%5d %6d %6d ", uid, pid, ppid); + OPT_safe ? printf("%S\n", curpsinfo->pr_psargs) : + printf("%s\n", curpsinfo->pr_psargs); + } +' diff --git a/cddl/contrib/dtracetoolkit/hotkernel b/cddl/contrib/dtracetoolkit/hotkernel new file mode 100755 index 00000000000..84d3362ff07 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/hotkernel @@ -0,0 +1,125 @@ +#!/usr/bin/perl -w +# +# hotkernel - sample on-CPU kernel-level functions and modules. +# Written using Perl and DTrace (Solaris 10 03/05) +# +# This samples the on-CPU function at 1001 Hertz, for a simple yet +# effective kernel-level profiling tool for sampling exclusive function time. +# The output will identify which function is on the CPU the most - which is +# the hottest. See Notes/ALLexclusive_notes.txt for an explanation of +# exclusive time. +# +# $Id: hotkernel 65 2007-10-04 11:09:40Z brendan $ +# +# USAGE: hotkernel [-hm] +# +# -h # help +# -m # match modules, not functions +# eg, +# hotkernel # sample kernel functions +# hotkernel -m # sample kernel modules +# +# FIELDS: +# FUNCTION Function name +# MODULE Module name +# COUNT Number of samples +# PCNT Percentage of total samples +# +# COPYRIGHT: Copyright (c) 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 29-Jun-2006 Brendan Gregg Created this. +# 29-Jun-2006 " " Last update. +# + +use strict; +use Getopt::Std; + +# +# Command Line Arguments +# +my $args; +usage() if defined $ARGV[0] and $ARGV[0] eq "--help"; +getopts('hm') or usage(); +usage() if defined $main::opt_h and $main::opt_h; +my $mods = defined $main::opt_m and $main::opt_m ? 1 : 0; + +# +# Cleanup on signals +# +$SIG{INT} = \&cleanupsig; # Ctrl-C +$SIG{QUIT} = \&cleanupsig; # Ctrl-\ +$SIG{TERM} = \&cleanupsig; # TERM + +# +# Declare DTrace script +# +my $dtrace = <) { + next if $line =~ /^\s*$/; + my ($addr, $count) = split ' ', $line; + my ($name, $offset) = split /\+/, $addr; + next if $name eq "0x0"; + $name =~ s/\`.*// if $mods; + $Count{$name} += $count; + $total += $count; +} +close DTRACE; + +# +# Print final report +# +printf "\n%-52s %8s %6s\n", $mods ? "MODULE" : "FUNCTION", "COUNT", "PCNT"; +foreach my $name (sort { $Count{$a} <=> $Count{$b} } keys %Count) { + printf "%-52s %8d %5.1f%%\n", $name, $Count{$name}, + 100 * $Count{$name} / ($total ? $total : 1); +} + +# +# Subroutines +# +sub cleanupsig { +} +sub usage { + print STDERR "USAGE: hotkernel [-hm]\n"; + print STDERR " eg,\n"; + print STDERR " hotkernel # sample kernel functions\n"; + print STDERR " hotkernel -m # sample kernel modules\n"; + exit 1; +} diff --git a/cddl/contrib/dtracetoolkit/hotuser b/cddl/contrib/dtracetoolkit/hotuser new file mode 100755 index 00000000000..2377487c7f7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/hotuser @@ -0,0 +1,139 @@ +#!/usr/bin/perl -w +# +# hotuser - sample on-CPU user-level functions and libraries. +# Written using Perl and DTrace (Solaris 10 03/05) +# +# This samples the on-CPU function at 1001 Hertz, for a simple yet +# effective user-level profiling tool for sampling exclusive function time. +# The output will identify which function is on the CPU the most - which +# is the hottest. See Notes/ALLexclusive_notes.txt for an explanation of +# exclusive time. +# +# $Id: hotuser 65 2007-10-04 11:09:40Z brendan $ +# +# USAGE: hotuser [-hl] { -c command | -p PID } +# +# -h # help +# -l # match libraries, not functions +# -p PID # examine this PID +# -c command # run and examine this command +# eg, +# hotuser -p 81 # sample user functions from PID 81 +# hotuser -lp 81 # sample user libraries from PID 81 +# hotuser -p `pgrep -n Xorg` # sample Xorg +# +# FIELDS: +# FUNCTION Function name +# LIBRARY Library name +# COUNT Number of samples +# PCNT Percentage of total samples +# +# COPYRIGHT: Copyright (c) 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 29-Jun-2006 Brendan Gregg Created this. +# 29-Jun-2006 " " Last update. +# + +use strict; +use Getopt::Std; + +# +# Command Line Arguments +# +my $args; +usage() if defined $ARGV[0] and $ARGV[0] eq "--help"; +getopts('c:hlp:') or usage(); +usage() if defined $main::opt_h and $main::opt_h; +my $libs = defined $main::opt_l and $main::opt_l ? 1 : 0; +if (defined $main::opt_c) { + $args = "-c $main::opt_c"; +} +elsif (defined $main::opt_p) { + $args = "-p $main::opt_p"; +} +else { + usage(); +} + +# +# Cleanup on signals +# +$SIG{INT} = \&cleanupsig; # Ctrl-C +$SIG{QUIT} = \&cleanupsig; # Ctrl-\ +$SIG{TERM} = \&cleanupsig; # TERM + +# +# Declare DTrace script +# +my $dtrace = <) { + next if $line =~ /^\s*$/; + next if $line !~ /^OUT: /; + my ($tag, $addr, $count) = split ' ', $line; + my ($name, $offset) = split /\+/, $addr; + next if $name eq "0x0"; + $name =~ s/\`.*// if $libs; + $Count{$name} += $count; + $total += $count; +} +close DTRACE; + +# +# Print final report +# +printf "\n%-52s %8s %6s\n", $libs ? "LIBRARY" : "FUNCTION", "COUNT", "PCNT"; +foreach my $name (sort { $Count{$a} <=> $Count{$b} } keys %Count) { + printf "%-52s %8d %5.1f%%\n", $name, $Count{$name}, + 100 * $Count{$name} / ($total ? $total : 1); +} + +# +# Subroutines +# +sub cleanupsig { +} +sub usage { + print STDERR "USAGE: hotuser [-hl] { -c command | -p PID }\n"; + print STDERR " eg,\n"; + print STDERR " hotuser -p 81 # sample user funcs for PID 81\n"; + print STDERR " hotuser -lp 81 # sample user libs for PID 81\n"; + print STDERR " hotuser -p `pgrep -n Xorg` # sample Xorg\n"; + exit 1; +} diff --git a/cddl/contrib/dtracetoolkit/install b/cddl/contrib/dtracetoolkit/install new file mode 100755 index 00000000000..1962c46290e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/install @@ -0,0 +1,151 @@ +#!/usr/bin/ksh +# +# install - installer for the DTraceToolkit +# +# This is a fairly simple script, most of it is error checking. +# All the script does is copy the DTraceToolkit files to another directory, +# with various checks. The user could have copied the files themselves, this +# script doesn't do anything special to them. It's really here in case +# people extrace the toolkit and go looking for an installer. +# +# 15-May-2005 Brendan Gregg Created this. + +DEBUG=0 # print debug data +TEETH=1 # does this script have teeth +SLEEP=1 # pause on messages +PATH=/usr/bin + +### Ensure we know where we are, +dir=${0%/*} +cd $dir +(( DEBUG )) && print "DEBUG: dir $dir" + +### Print welcome, +print "DTraceToolkit Installation\n---------------------------" +cat Version +print "\nhit Ctrl-C any time you wish to quit.\n\n" + +### Fetch location, +print -n "Enter target directory for installation [/opt/DTT]: " +read loc junk +if [[ "$loc" == "" ]]; then loc="/opt/DTT"; fi +print "" +(( DEBUG )) && print "DEBUG: loc $loc" + +### Sanity check, +if print "$loc" | grep '^[./]*$' > /dev/null; then + print "ERROR1: Location \"$loc\" is ambiguous.\n." + (( SLEEP )) && sleep 1 + print ".\tTry a full path, like \"/opt/DTT\"\n." + print ".\tSorry!\n" + exit 1 +fi + +### Evilness check, +if print "$loc" | grep '[^a-zA-Z0-9_.-/]' > /dev/null; then + print "ERROR2: Sorry, location \"$loc\" contains bad characters.\n." + (( SLEEP )) && sleep 1 + print ".\tTry a path like \"/opt/DTT\"\n." + print ".\tSorry!\n" + exit 2 +fi + +### Process location, +basename=${loc%/*} +nodename=${loc##*/} +if [[ "$basename" == "" ]]; then basename="/"; fi +(( DEBUG )) && print "DEBUG: basename $basename" +(( DEBUG )) && print "DEBUG: nodename $nodename" + +### Check parent dir exists, +if [[ ! -d "$basename" ]]; then + print "ERROR3: Parent directory \"$basename\" does not exist!\n." + (( SLEEP )) && sleep 1 + print ".\tI'm not sure what you want me to do here, if you were" + print ".\tserious about the above parent directory - then run" + print ".\ta \"mkdir -p $basename\" first, then rerun this script.\n." + print ".\tSorry!\n" + exit 3 +fi + +### Check parent dir perms, +if [[ ! -w "$basename" ]]; then + print "ERROR4: Can't write to parent directory \"$basename\"!\n." + (( SLEEP )) && sleep 1 + print ".\tSince I can't write to this directory, I can't install the" + print ".\tDTraceToolkit. You are currently logged in as,\n." + id | sed 's/^/. /' + print ".\n.\tand the directory has permissions,\n." + ls -ld "$basename" | awk '{ print ".\t\t",$1,$2,$3,$4,"..." }' + owner=`ls -ld "$basename" | awk '{ print $3 }'` + print ".\n.\tMaybe you need to run \"su - $owner\" first?\n." + print ".\tSorry!\n" + exit 4 +fi + +### Check if toolkit is already installed, +if [[ -d "$loc" ]]; then + print "Warning: Possible old version of the DTraceToolkit found." + print "\tThis will DELETE the files in $loc, then install the toolkit." + (( SLEEP )) && sleep 1 + if [[ ! -f "$loc/Version" ]]; then + print "\nWARNING: $loc doesn't look like an old DTraceToolkit!" + (( SLEEP )) && sleep 1 + fi + print -n "\nContinue (will run \"rm -rf $loc\"). Are you sure (y/N)?: " + read ans junk + if [[ "$ans" != "y" ]]; then + print "\nExiting..." + exit 5 + fi + if (( TEETH )); then + rm -rf "$loc" + else + print COMMAND: rm -rf \"$loc\" + fi +fi + +### Make new toolkit dir, +print "\nMaking directory \"$loc\"...\n" +if (( TEETH )); then + mkdir -p "$loc" +else + print COMMAND: mkdir -p \"$loc\" +fi +if [[ ! -d "$loc" || ! -w "$loc" ]]; then + print "ERROR6: Creation of \"$loc\" failed.\n." + (( SLEEP )) && sleep 1 + print ".\tCheck directory location and try again.\n." + print ".\tSorry!\n" + exit 6 +fi + +### Copy files across, +print "\nCopying DTraceToolkit files...\n" +if (( TEETH )); then + tar cf - . | (cd "$loc"; tar xvf -) +else + print COMMAND: "tar cf - . | (cd \"$loc\"; tar xvf -)" +fi +error=$? +if [[ ! -f "$loc/install" ]]; then error=1; fi +if (( error )); then + print "ERROR7: Failure during copy.\n." + (( SLEEP )) && sleep 1 + print ".\tCheck source \"$dir\" and destination \"$loc\", then" + print ".\ttry again.\n." + print ".\tSorry!\n" + exit 7 +fi + +### Delete installer, +if (( TEETH )); then + rm "$loc/install" +else + print COMMAND: rm \"$loc/install\" +fi + +### Finished, +print "\nFinished.\n" +print "Installed to \"$loc\". See $loc/Guide for how to get started.\n" + diff --git a/cddl/contrib/dtracetoolkit/iopattern b/cddl/contrib/dtracetoolkit/iopattern new file mode 100755 index 00000000000..e825f9f77fb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/iopattern @@ -0,0 +1,277 @@ +#!/usr/bin/ksh +# +# iopattern - print disk I/O pattern. +# Written using DTrace (Solaris 10 3/05). +# +# This prints details on the I/O access pattern for the disks, such as +# percentage of events that were of a random or sequential nature. +# By default totals for all disks are printed. +# +# $Id: iopattern 65 2007-10-04 11:09:40Z brendan $ +# +# USAGE: iopattern [-v] [-d device] [-f filename] [-m mount_point] +# [interval [count]] +# +# -v # print timestamp, string +# -d device # instance name to snoop (eg, dad0) +# -f filename # full pathname of file to snoop +# -m mount_point # this FS only (will skip raw events) +# eg, +# iopattern # default output, 1 second intervals +# iopattern 10 # 10 second samples +# iopattern 5 12 # print 12 x 5 second samples +# iopattern -m / # snoop events on filesystem / only +# +# FIELDS: +# %RAN percentage of events of a random nature +# %SEQ percentage of events of a sequential nature +# COUNT number of I/O events +# MIN minimum I/O event size +# MAX maximum I/O event size +# AVG average I/O event size +# KR total kilobytes read during sample +# KW total kilobytes written during sample +# DEVICE device name +# MOUNT mount point +# FILE filename +# TIME timestamp, string +# +# NOTES: +# +# An event is considered random when the heads seek. This program prints +# the percentage of events that are random. The size of the seek is not +# measured - it's either random or not. +# +# SEE ALSO: iosnoop, iotop +# +# IDEA: Ryan Matteson +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 25-Jul-2005 Brendan Gregg Created this. +# 25-Jul-2005 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### default variables +opt_device=0; opt_file=0; opt_mount=0; opt_time=0 +filter=0; device=.; filename=.; mount=.; interval=1; count=-1 + +### process options +while getopts d:f:hm:v name +do + case $name in + d) opt_device=1; device=$OPTARG ;; + f) opt_file=1; filename=$OPTARG ;; + m) opt_mount=1; mount=$OPTARG ;; + v) opt_time=1 ;; + h|?) cat <<-END >&2 + USAGE: iopattern [-v] [-d device] [-f filename] [-m mount_point] + [interval [count]] + + -v # print timestamp + -d device # instance name to snoop + -f filename # snoop this file only + -m mount_point # this FS only + eg, + iopattern # default output, 1 second samples + iopattern 10 # 10 second samples + iopattern 5 12 # print 12 x 5 second samples + iopattern -m / # snoop events on filesystem / only + END + exit 1 + esac +done + +shift $(( $OPTIND - 1 )) + +### option logic +if [[ "$1" > 0 ]]; then + interval=$1; shift +fi +if [[ "$1" > 0 ]]; then + count=$1; shift +fi +if (( opt_device || opt_mount || opt_file )); then + filter=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_time = '$opt_time'; + inline int OPT_device = '$opt_device'; + inline int OPT_mount = '$opt_mount'; + inline int OPT_file = '$opt_file'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + inline int FILTER = '$filter'; + inline string DEVICE = "'$device'"; + inline string FILENAME = "'$filename'"; + inline string MOUNT = "'$mount'"; + + #pragma D option quiet + + int last_loc[string]; + + /* + * Program start + */ + dtrace:::BEGIN + { + /* starting values */ + diskcnt = 0; + diskmin = 0; + diskmax = 0; + diskran = 0; + diskr = 0; + diskw = 0; + counts = COUNTER; + secs = INTERVAL; + LINES = 20; + line = 0; + last_event[""] = 0; + } + + /* + * Print header + */ + profile:::tick-1sec + /line <= 0 / + { + /* print optional headers */ + OPT_time ? printf("%-20s ", "TIME") : 1; + OPT_device ? printf("%-9s ", "DEVICE") : 1; + OPT_mount ? printf("%-12s ", "MOUNT") : 1; + OPT_file ? printf("%-12s ", "FILE") : 1; + + /* print header */ + printf("%4s %4s %6s %6s %6s %6s %6s %6s\n", + "%RAN", "%SEQ", "COUNT", "MIN", "MAX", "AVG", "KR", "KW"); + + line = LINES; + } + + /* + * Check event is being traced + */ + io:genunix::done + { + /* default is to trace unless filtering */ + self->ok = FILTER ? 0 : 1; + + /* check each filter */ + (OPT_device == 1 && DEVICE == args[1]->dev_statname)? self->ok = 1 : 1; + (OPT_file == 1 && FILENAME == args[2]->fi_pathname) ? self->ok = 1 : 1; + (OPT_mount == 1 && MOUNT == args[2]->fi_mount) ? self->ok = 1 : 1; + } + + /* + * Process and Print completion + */ + io:genunix::done + /self->ok/ + { + /* + * Save details + */ + this->loc = args[0]->b_blkno * 512; + this->pre = last_loc[args[1]->dev_statname]; + diskr += args[0]->b_flags & B_READ ? args[0]->b_bcount : 0; + diskw += args[0]->b_flags & B_READ ? 0 : args[0]->b_bcount; + diskran += this->pre == this->loc ? 0 : 1; + diskcnt++; + diskmin = diskmin == 0 ? args[0]->b_bcount : + (diskmin > args[0]->b_bcount ? args[0]->b_bcount : diskmin); + diskmax = diskmax < args[0]->b_bcount ? args[0]->b_bcount : diskmax; + + /* save disk location */ + last_loc[args[1]->dev_statname] = this->loc + args[0]->b_bcount; + + /* cleanup */ + self->ok = 0; + } + + /* + * Timer + */ + profile:::tick-1sec + { + secs--; + } + + /* + * Print Output + */ + profile:::tick-1sec + /secs == 0/ + { + /* calculate diskavg */ + diskavg = diskcnt > 0 ? (diskr + diskw) / diskcnt : 0; + + /* convert counters to Kbytes */ + diskr /= 1024; + diskw /= 1024; + + /* convert to percentages */ + diskran = diskcnt == 0 ? 0 : (diskran * 100) / diskcnt; + diskseq = diskcnt == 0 ? 0 : 100 - diskran; + + /* print optional fields */ + OPT_time ? printf("%-20Y ", walltimestamp) : 1; + OPT_device ? printf("%-9s ", DEVICE) : 1; + OPT_mount ? printf("%-12s ", MOUNT) : 1; + OPT_file ? printf("%-12s ", FILENAME) : 1; + + /* print data */ + printf("%4d %4d %6d %6d %6d %6d %6d %6d\n", + diskran, diskseq, diskcnt, diskmin, diskmax, diskavg, + diskr, diskw); + + /* clear data */ + diskmin = 0; + diskmax = 0; + diskcnt = 0; + diskran = 0; + diskr = 0; + diskw = 0; + + secs = INTERVAL; + counts--; + line--; + } + + /* + * End of program + */ + profile:::tick-1sec + /counts == 0/ + { + exit(0); + } +' diff --git a/cddl/contrib/dtracetoolkit/iosnoop b/cddl/contrib/dtracetoolkit/iosnoop new file mode 100755 index 00000000000..00931d275e0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/iosnoop @@ -0,0 +1,367 @@ +#!/usr/bin/sh +# +# iosnoop - A program to print disk I/O events as they happen, with useful +# details such as UID, PID, filename, command, etc. +# Written using DTrace (Solaris 10 3/05). +# +# This is measuring disk events that have made it past system caches. +# +# $Id: iosnoop 8 2007-08-06 05:55:26Z brendan $ +# +# USAGE: iosnoop [-a|-A|-DeghiNostv] [-d device] [-f filename] +# [-m mount_point] [-n name] [-p PID] +# +# iosnoop # default output +# +# -a # print all data (mostly) +# -A # dump all data, space delimited +# -D # print time delta, us (elapsed) +# -e # print device name +# -g # print command arguments +# -i # print device instance +# -N # print major and minor numbers +# -o # print disk delta time, us +# -s # print start time, us +# -t # print completion time, us +# -v # print completion time, string +# -d device # instance name to snoop (eg, dad0) +# -f filename # full pathname of file to snoop +# -m mount_point # this FS only (will skip raw events) +# -n name # this process name only +# -p PID # this PID only +# eg, +# iosnoop -v # human readable timestamps +# iosnoop -N # print major and minor numbers +# iosnoop -m / # snoop events on the root filesystem only +# +# FIELDS: +# UID user ID +# PID process ID +# PPID parennt process ID +# COMM command name for the process +# ARGS argument listing for the process +# SIZE size of operation, bytes +# BLOCK disk block for the operation (location) +# STIME timestamp for the disk request, us +# TIME timestamp for the disk completion, us +# DELTA elapsed time from request to completion, us +# DTIME time for disk to complete request, us +# STRTIME timestamp for the disk completion, string +# DEVICE device name +# INS device instance number +# D direction, Read or Write +# MOUNT mount point +# FILE filename (basename) for io operation +# +# NOTE: +# - There are two different delta times reported. -D prints the +# elapsed time from the disk request (strategy) to the disk completion +# (iodone); -o prints the time for the disk to complete that event +# since it's last event (time between iodones), or, the time to the +# strategy if the disk had been idle. +# - When filtering on PID or process name, be aware that poor disk event +# times may be due to events that have been filtered away, for example +# another process that may be seeking the disk heads elsewhere. +# +# SEE ALSO: BigAdmin: DTrace, http://www.sun.com/bigadmin/content/dtrace +# Solaris Dynamic Tracing Guide, http://docs.sun.com +# DTrace Tools, http://www.brendangregg.com/dtrace.html +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 12-Mar-2004 Brendan Gregg Created this, build 51. +# 23-May-2004 " " Fixed mntpt bug. +# 10-Oct-2004 " " Rewritten to use the io provider, build 63. +# 04-Jan-2005 " " Wrapped in sh to provide options. +# 08-May-2005 " " Rewritten for perfromance. +# 15-Jul-2005 " " Improved DTIME calculation. +# 25-Jul-2005 " " Added -p, -n. Improved code. +# 17-Sep-2005 " " Increased switchrate. +# 17-Sep-2005 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### default variables +opt_dump=0; opt_device=0; opt_delta=0; opt_devname=0; opt_file=0; opt_args=0; +opt_mount=0; opt_start=0 opt_end=0; opt_endstr=0; opt_ins=0; opt_nums=0 +opt_dtime=0; filter=0; device=.; filename=.; mount=.; pname=.; pid=0 +opt_name=0; opt_pid=0 + +### process options +while getopts aAd:Def:ghim:Nn:op:stv name +do + case $name in + a) opt_devname=1; opt_args=1; opt_endstr=1; opt_nums=1 ;; + A) opt_dump=1 ;; + d) opt_device=1; device=$OPTARG ;; + D) opt_delta=1 ;; + e) opt_devname=1 ;; + f) opt_file=1; filename=$OPTARG ;; + g) opt_args=1 ;; + i) opt_ins=1 ;; + N) opt_nums=1 ;; + n) opt_name=1; pname=$OPTARG ;; + o) opt_dtime=1 ;; + p) opt_pid=1; pid=$OPTARG ;; + m) opt_mount=1; mount=$OPTARG ;; + s) opt_start=1 ;; + t) opt_end=1 ;; + v) opt_endstr=1 ;; + h|?) cat <<-END >&2 + USAGE: iosnoop [-a|-A|-DeghiNostv] [-d device] [-f filename] + [-m mount_point] [-n name] [-p PID] + iosnoop # default output + -a # print all data (mostly) + -A # dump all data, space delimited + -D # print time delta, us (elapsed) + -e # print device name + -g # print command arguments + -i # print device instance + -N # print major and minor numbers + -o # print disk delta time, us + -s # print start time, us + -t # print completion time, us + -v # print completion time, string + -d device # instance name to snoop + -f filename # snoop this file only + -m mount_point # this FS only + -n name # this process name only + -p PID # this PID only + eg, + iosnoop -v # human readable timestamps + iosnoop -N # print major and minor numbers + iosnoop -m / # snoop events on filesystem / only + END + exit 1 + esac +done + +### option logic +if [ $opt_dump -eq 1 ]; then + opt_delta=0; opt_devname=0; opt_args=2; opt_start=0; + opt_end=0; opt_endstr=0; opt_nums=0; opt_ins=0; opt_dtime=0 +fi +if [ $opt_device -eq 1 -o $opt_file -eq 1 -o $opt_mount -eq 1 -o \ + $opt_name -eq 1 -o $opt_pid -eq 1 ]; then + filter=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_dump = '$opt_dump'; + inline int OPT_device = '$opt_device'; + inline int OPT_delta = '$opt_delta'; + inline int OPT_devname = '$opt_devname'; + inline int OPT_file = '$opt_file'; + inline int OPT_args = '$opt_args'; + inline int OPT_ins = '$opt_ins'; + inline int OPT_nums = '$opt_nums'; + inline int OPT_dtime = '$opt_dtime'; + inline int OPT_mount = '$opt_mount'; + inline int OPT_start = '$opt_start'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_name = '$opt_name'; + inline int OPT_end = '$opt_end'; + inline int OPT_endstr = '$opt_endstr'; + inline int FILTER = '$filter'; + inline int PID = '$pid'; + inline string DEVICE = "'$device'"; + inline string FILENAME = "'$filename'"; + inline string MOUNT = "'$mount'"; + inline string NAME = "'$pname'"; + + #pragma D option quiet + #pragma D option switchrate=10hz + + /* + * Print header + */ + dtrace:::BEGIN + { + last_event[""] = 0; + + /* print optional headers */ + OPT_start ? printf("%-14s ","STIME") : 1; + OPT_end ? printf("%-14s ","TIME") : 1; + OPT_endstr ? printf("%-20s ","STRTIME") : 1; + OPT_devname ? printf("%-7s ","DEVICE") : 1; + OPT_ins ? printf("%-3s ","INS") : 1; + OPT_nums ? printf("%-3s %-3s ","MAJ","MIN") : 1; + OPT_delta ? printf("%-10s ","DELTA") : 1; + OPT_dtime ? printf("%-10s ","DTIME") : 1; + + /* print main headers */ + OPT_dump ? + printf("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\n", + "TIME", "STIME", "DELTA", "DEVICE", "INS", "MAJ", "MIN", "UID", + "PID", "PPID", "D", "BLOCK", "SIZE", "MOUNT", "FILE", "PATH", + "COMM","ARGS") : + printf("%5s %5s %1s %8s %6s ", "UID", "PID", "D", "BLOCK", "SIZE"); + OPT_args == 0 ? printf("%10s %s\n", "COMM", "PATHNAME") : 1; + OPT_args == 1 ? printf("%28s %s\n", "PATHNAME", "ARGS") : 1; + } + + /* + * Check event is being traced + */ + io:genunix::start + { + /* default is to trace unless filtering, */ + self->ok = FILTER ? 0 : 1; + + /* check each filter, */ + (OPT_device == 1 && DEVICE == args[1]->dev_statname)? self->ok = 1 : 1; + (OPT_file == 1 && FILENAME == args[2]->fi_pathname) ? self->ok = 1 : 1; + (OPT_mount == 1 && MOUNT == args[2]->fi_mount) ? self->ok = 1 : 1; + (OPT_name == 1 && NAME == execname) ? self->ok = 1 : 1; + (OPT_pid == 1 && PID == pid) ? self->ok = 1 : 1; + } + + /* + * Reset last_event for disk idle -> start + * this prevents idle time being counted as disk time. + */ + io:genunix::start + /! pending[args[1]->dev_statname]/ + { + /* save last disk event */ + last_event[args[1]->dev_statname] = timestamp; + } + + /* + * Store entry details + */ + io:genunix::start + /self->ok/ + { + /* these are used as a unique disk event key, */ + this->dev = args[0]->b_edev; + this->blk = args[0]->b_blkno; + + /* save disk event details, */ + start_uid[this->dev, this->blk] = uid; + start_pid[this->dev, this->blk] = pid; + start_ppid[this->dev, this->blk] = ppid; + start_args[this->dev, this->blk] = (char *)curpsinfo->pr_psargs; + start_comm[this->dev, this->blk] = execname; + start_time[this->dev, this->blk] = timestamp; + + /* increase disk event pending count */ + pending[args[1]->dev_statname]++; + + self->ok = 0; + } + + /* + * Process and Print completion + */ + io:genunix::done + /start_time[args[0]->b_edev, args[0]->b_blkno]/ + { + /* decrease disk event pending count */ + pending[args[1]->dev_statname]--; + + /* + * Process details + */ + + /* fetch entry values */ + this->dev = args[0]->b_edev; + this->blk = args[0]->b_blkno; + this->suid = start_uid[this->dev, this->blk]; + this->spid = start_pid[this->dev, this->blk]; + this->sppid = start_ppid[this->dev, this->blk]; + self->sargs = (int)start_args[this->dev, this->blk] == 0 ? + "" : start_args[this->dev, this->blk]; + self->scomm = start_comm[this->dev, this->blk]; + this->stime = start_time[this->dev, this->blk]; + this->etime = timestamp; /* endtime */ + this->delta = this->etime - this->stime; + this->dtime = last_event[args[1]->dev_statname] == 0 ? 0 : + timestamp - last_event[args[1]->dev_statname]; + + /* memory cleanup */ + start_uid[this->dev, this->blk] = 0; + start_pid[this->dev, this->blk] = 0; + start_ppid[this->dev, this->blk] = 0; + start_args[this->dev, this->blk] = 0; + start_time[this->dev, this->blk] = 0; + start_comm[this->dev, this->blk] = 0; + start_rw[this->dev, this->blk] = 0; + + /* + * Print details + */ + + /* print optional fields */ + OPT_start ? printf("%-14d ", this->stime/1000) : 1; + OPT_end ? printf("%-14d ", this->etime/1000) : 1; + OPT_endstr ? printf("%-20Y ", walltimestamp) : 1; + OPT_devname ? printf("%-7s ", args[1]->dev_statname) : 1; + OPT_ins ? printf("%3d ", args[1]->dev_instance) : 1; + OPT_nums ? printf("%3d %3d ", + args[1]->dev_major, args[1]->dev_minor) : 1; + OPT_delta ? printf("%-10d ", this->delta/1000) : 1; + OPT_dtime ? printf("%-10d ", this->dtime/1000) : 1; + + /* print main fields */ + OPT_dump ? + printf("%d %d %d %s %d %d %d %d %d %d %s %d %d %s %s %s %s %S\n", + this->etime/1000, this->stime/1000, this->delta/1000, + args[1]->dev_statname, args[1]->dev_instance, args[1]->dev_major, + args[1]->dev_minor, this->suid, this->spid, this->sppid, + args[0]->b_flags & B_READ ? "R" : "W", + args[0]->b_blkno, args[0]->b_bcount, args[2]->fi_mount, + args[2]->fi_name, args[2]->fi_pathname, self->scomm, self->sargs) : + printf("%5d %5d %1s %8d %6d ", + this->suid, this->spid, args[0]->b_flags & B_READ ? "R" : "W", + args[0]->b_blkno, args[0]->b_bcount); + OPT_args == 0 ? printf("%10s %s\n", self->scomm, args[2]->fi_pathname) + : 1; + OPT_args == 1 ? printf("%28s %S\n", + args[2]->fi_pathname, self->sargs) : 1; + + /* save last disk event */ + last_event[args[1]->dev_statname] = timestamp; + + /* cleanup */ + self->scomm = 0; + self->sargs = 0; + } + + /* + * Prevent pending from underflowing + * this can happen if this program is started during disk events. + */ + io:genunix::done + /pending[args[1]->dev_statname] < 0/ + { + pending[args[1]->dev_statname] = 0; + } +' diff --git a/cddl/contrib/dtracetoolkit/iotop b/cddl/contrib/dtracetoolkit/iotop new file mode 100755 index 00000000000..788c4928512 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/iotop @@ -0,0 +1,422 @@ +#!/usr/bin/ksh +# +# iotop - display top disk I/O events by process. +# Written using DTrace (Solaris 10 3/05). +# +# This is measuring disk events that have made it past system caches. +# +# $Id: iotop 8 2007-08-06 05:55:26Z brendan $ +# +# USAGE: iotop [-C] [-D|-o|-P] [-j|-Z] [-d device] [-f filename] +# [-m mount_point] [-t top] [interval [count]] +# +# iotop # default output, 5 second intervals +# +# -C # don't clear the screen +# -D # print delta times, elapsed, us +# -j # print project ID +# -o # print disk delta times, us +# -P # print %I/O (disk delta times) +# -Z # print zone ID +# -d device # instance name to snoop (eg, dad0) +# -f filename # full pathname of file to snoop +# -m mount_point # this FS only (will skip raw events) +# -t top # print top number only +# eg, +# iotop 1 # 1 second samples +# iotop -C # don't clear the screen +# iotop -P # print %I/O (time based) +# iotop -j # print project IDs +# iotop -Z # print zone IDs +# iotop -t 20 # print top 20 lines only +# iotop -C 5 12 # print 12 x 5 second samples +# +# FIELDS: +# UID user ID +# PID process ID +# PPID parent process ID +# PROJ project ID +# ZONE zone ID +# CMD process command name +# DEVICE device name +# MAJ device major number +# MIN device minor number +# D direction, Read or Write +# BYTES total size of operations, bytes +# ELAPSED total elapsed from request to completion, us +# DISKTIME total time for disk to complete request, us +# %I/O percent disk I/O, based on time (DISKTIME) +# load 1 min load average +# disk_r total disk read Kbytes for sample +# disk_w total disk write Kbytes for sample +# +# NOTE: +# * There are two different delta times reported. -D prints the +# elapsed time from the disk request (strategy) to the disk completion +# (iodone); -o prints the time for the disk to complete that event +# since it's last event (time between iodones), or, the time to the +# strategy if the disk had been idle. +# * The %I/O value can exceed 100%. It represents how busy a process is +# making the disks, in terms of a single disk. A value of 200% could +# mean 2 disks are busy at 100%, or 4 disks at 50%... +# +# SEE ALSO: iosnoop +# BigAdmin: DTrace, http://www.sun.com/bigadmin/content/dtrace +# Solaris Dynamic Tracing Guide, http://docs.sun.com +# DTrace Tools, http://www.brendangregg.com/dtrace.html +# +# INSPIRATION: top(1) by William LeFebvre +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# KNOWN BUGS: +# - This can print errors while running on servers with Veritas volumes. +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 15-Jul-2005 Brendan Gregg Created this. +# 20-Apr-2006 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### default variables +opt_device=0; opt_file=0; opt_mount=0; opt_clear=1; opt_proj=0; opt_zone=0 +opt_percent=0; opt_def=1; opt_bytes=1; filter=0; device=.; filename=.; mount=. +opt_top=0; opt_elapsed=0; opt_dtime=0; interval=5; count=-1; top=0 + +### process options +while getopts CDd:f:hjm:oPt:Z name +do + case $name in + C) opt_clear=0 ;; + D) opt_elapsed=1; opt_bytes=0 ;; + d) opt_device=1; device=$OPTARG ;; + f) opt_file=1; filename=$OPTARG ;; + j) opt_proj=1; opt_def=0 ;; + m) opt_mount=1; mount=$OPTARG ;; + o) opt_dtime=1; opt_bytes=0 ;; + P) opt_percent=1; opt_dtime=1; opt_bytes=0 ;; + t) opt_top=1; top=$OPTARG ;; + Z) opt_zone=1; opt_def=0 ;; + h|?) cat <<-END >&2 + USAGE: iotop [-C] [-D|-o|-P] [-j|-Z] [-d device] [-f filename] + [-m mount_point] [-t top] [interval [count]] + + -C # don't clear the screen + -D # print delta times, elapsed, us + -j # print project ID + -o # print disk delta times, us + -P # print %I/O (disk delta times) + -Z # print zone ID + -d device # instance name to snoop + -f filename # snoop this file only + -m mount_point # this FS only + -t top # print top number only + eg, + iotop # default output, 5 second samples + iotop 1 # 1 second samples + iotop -P # print %I/O (time based) + iotop -m / # snoop events on filesystem / only + iotop -t 20 # print top 20 lines only + iotop -C 5 12 # print 12 x 5 second samples + END + exit 1 + esac +done + +shift $(( $OPTIND - 1 )) + +### option logic +if [[ "$1" > 0 ]]; then + interval=$1; shift +fi +if [[ "$1" > 0 ]]; then + count=$1; shift +fi +if (( opt_proj && opt_zone )); then + opt_proj=0 +fi +if (( opt_elapsed && opt_dtime )); then + opt_elapsed=0 +fi +if (( opt_device || opt_mount || opt_file )); then + filter=1 +fi +if (( opt_clear )); then + clearstr=`clear` +else + clearstr=. +fi + + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_def = '$opt_def'; + inline int OPT_proj = '$opt_proj'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_clear = '$opt_clear'; + inline int OPT_bytes = '$opt_bytes'; + inline int OPT_elapsed = '$opt_elapsed'; + inline int OPT_dtime = '$opt_dtime'; + inline int OPT_percent = '$opt_percent'; + inline int OPT_device = '$opt_device'; + inline int OPT_mount = '$opt_mount'; + inline int OPT_file = '$opt_file'; + inline int OPT_top = '$opt_top'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + inline int FILTER = '$filter'; + inline int TOP = '$top'; + inline string DEVICE = "'$device'"; + inline string FILENAME = "'$filename'"; + inline string MOUNT = "'$mount'"; + inline string CLEAR = "'$clearstr'"; + + #pragma D option quiet + + /* boost the following if you get "dynamic variable drops" */ + #pragma D option dynvarsize=8m + + /* + * Print header + */ + dtrace:::BEGIN + { + last_event[""] = 0; + + /* starting values */ + counts = COUNTER; + secs = INTERVAL; + disk_r = 0; + disk_w = 0; + + printf("Tracing... Please wait.\n"); + } + + /* + * Check event is being traced + */ + io:genunix::start, + io:genunix::done + { + /* default is to trace unless filtering, */ + this->ok = FILTER ? 0 : 1; + + /* check each filter, */ + (OPT_device == 1 && DEVICE == args[1]->dev_statname)? this->ok = 1 : 1; + (OPT_file == 1 && FILENAME == args[2]->fi_pathname) ? this->ok = 1 : 1; + (OPT_mount == 1 && MOUNT == args[2]->fi_mount) ? this->ok = 1 : 1; + } + + /* + * Reset last_event for disk idle -> start + * this prevents idle time being counted as disk time. + */ + io:genunix::start + /! pending[args[1]->dev_statname]/ + { + /* save last disk event */ + last_event[args[1]->dev_statname] = timestamp; + } + + /* + * Store entry details + */ + io:genunix::start + /this->ok/ + { + /* these are used as a unique disk event key, */ + this->dev = args[0]->b_edev; + this->blk = args[0]->b_blkno; + + /* save disk event details, */ + start_uid[this->dev, this->blk] = uid; + start_pid[this->dev, this->blk] = pid; + start_ppid[this->dev, this->blk] = ppid; + start_comm[this->dev, this->blk] = execname; + start_time[this->dev, this->blk] = timestamp; + start_proj[this->dev, this->blk] = curpsinfo->pr_projid; + start_zone[this->dev, this->blk] = curpsinfo->pr_zoneid; + start_rw[this->dev, this->blk] = args[0]->b_flags & B_READ ? "R" : "W"; + disk_r += args[0]->b_flags & B_READ ? args[0]->b_bcount : 0; + disk_w += args[0]->b_flags & B_READ ? 0 : args[0]->b_bcount; + + /* increase disk event pending count */ + pending[args[1]->dev_statname]++; + } + + /* + * Process and Print completion + */ + io:genunix::done + /this->ok/ + { + /* decrease disk event pending count */ + pending[args[1]->dev_statname]--; + + /* + * Process details + */ + + /* fetch entry values */ + this->dev = args[0]->b_edev; + this->blk = args[0]->b_blkno; + this->suid = start_uid[this->dev, this->blk]; + this->spid = start_pid[this->dev, this->blk]; + this->sppid = start_ppid[this->dev, this->blk]; + this->sproj = start_proj[this->dev, this->blk]; + this->szone = start_zone[this->dev, this->blk]; + self->scomm = start_comm[this->dev, this->blk]; + this->stime = start_time[this->dev, this->blk]; + this->etime = timestamp; /* endtime */ + this->elapsed = this->etime - this->stime; + self->rw = start_rw[this->dev, this->blk]; + this->dtime = last_event[args[1]->dev_statname] == 0 ? 0 : + timestamp - last_event[args[1]->dev_statname]; + + /* memory cleanup */ + start_uid[this->dev, this->blk] = 0; + start_pid[this->dev, this->blk] = 0; + start_ppid[this->dev, this->blk] = 0; + start_time[this->dev, this->blk] = 0; + start_comm[this->dev, this->blk] = 0; + start_zone[this->dev, this->blk] = 0; + start_proj[this->dev, this->blk] = 0; + start_rw[this->dev, this->blk] = 0; + + /* + * Choose statistic to track + */ + OPT_bytes ? this->value = args[0]->b_bcount : 1; + OPT_elapsed ? this->value = this->elapsed / 1000 : 1; + OPT_dtime ? this->value = this->dtime / 1000 : 1; + + /* + * Save details + */ + OPT_def ? @out[this->suid, this->spid, this->sppid, self->scomm, + args[1]->dev_statname, args[1]->dev_major, args[1]->dev_minor, + self->rw] = sum(this->value) : 1; + OPT_proj ? @out[this->sproj, this->spid, this->sppid, self->scomm, + args[1]->dev_statname, args[1]->dev_major, args[1]->dev_minor, + self->rw] = sum(this->value) : 1; + OPT_zone ? @out[this->szone, this->spid, this->sppid, self->scomm, + args[1]->dev_statname, args[1]->dev_major, args[1]->dev_minor, + self->rw] = sum(this->value) : 1; + + /* save last disk event */ + last_event[args[1]->dev_statname] = timestamp; + + self->scomm = 0; + self->rw = 0; + } + + /* + * Prevent pending from underflowing + * this can happen if this program is started during disk events. + */ + io:genunix::done + /pending[args[1]->dev_statname] < 0/ + { + pending[args[1]->dev_statname] = 0; + } + + /* + * Timer + */ + profile:::tick-1sec + { + secs--; + } + + /* + * Print Report + */ + profile:::tick-1sec + /secs == 0/ + { + /* fetch 1 min load average */ + this->load1a = `hp_avenrun[0] / 65536; + this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; + + /* convert counters to Kbytes */ + disk_r /= 1024; + disk_w /= 1024; + + /* print status */ + OPT_clear ? printf("%s", CLEAR) : 1; + printf("%Y, load: %d.%02d, disk_r: %6d KB, disk_w: %6d KB\n\n", + walltimestamp, this->load1a, this->load1b, disk_r, disk_w); + + /* print headers */ + OPT_def ? printf(" UID ") : 1; + OPT_proj ? printf(" PROJ ") : 1; + OPT_zone ? printf(" ZONE ") : 1; + printf("%6s %6s %-16s %-7s %3s %3s %1s", + "PID", "PPID", "CMD", "DEVICE", "MAJ", "MIN", "D"); + OPT_bytes ? printf(" %16s\n", "BYTES") : 1; + OPT_elapsed ? printf(" %16s\n", "ELAPSED") : 1; + OPT_dtime && ! OPT_percent ? printf(" %16s\n", "DISKTIME") : 1; + OPT_dtime && OPT_percent ? printf(" %6s\n", "%I/O") : 1; + + /* truncate to top lines if needed */ + OPT_top ? trunc(@out, TOP) : 1; + + /* normalise to percentage if needed */ + OPT_percent ? normalize(@out, INTERVAL * 10000) : 1; + + /* print data */ + ! OPT_percent ? + printa("%5d %6d %6d %-16s %-7s %3d %3d %1s %16@d\n", @out) : + printa("%5d %6d %6d %-16s %-7s %3d %3d %1s %6@d\n", @out); + printf("\n"); + + /* clear data */ + trunc(@out); + disk_r = 0; + disk_w = 0; + secs = INTERVAL; + counts--; + } + + /* + * End of program + */ + profile:::tick-1sec + /counts == 0/ + { + exit(0); + } + + /* + * Cleanup for Ctrl-C + */ + dtrace:::END + { + trunc(@out); + } +' diff --git a/cddl/contrib/dtracetoolkit/opensnoop b/cddl/contrib/dtracetoolkit/opensnoop new file mode 100755 index 00000000000..b8fca3eaee6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/opensnoop @@ -0,0 +1,244 @@ +#!/bin/sh +# +# opensnoop - snoop file opens as they occur. +# Written using DTrace (Solaris 10 3/05). +# +# $Id: opensnoop 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: opensnoop [-a|-A|-ceghsvxZ] [-f pathname] [-n name] [-p PID] +# +# opensnoop # default output +# +# -a # print most data +# -A # dump all data, space delimited +# -c # print cwd of process +# -e # print errno value +# -g # print command arguments +# -s # print start time, us +# -v # print start time, string +# -x # only print failed opens +# -Z # print zonename +# -f pathname # file pathname to snoop +# -n name # command name to snoop +# -p PID # process ID to snoop +# eg, +# opensnoop -v # human readable timestamps +# opensnoop -e # see error codes +# opensnoop -f /etc/passwd # snoop this file only +# +# FIELDS: +# ZONE Zone name +# UID User ID +# PID Process ID +# PPID Parent Process ID +# FD file descriptor (-1 for error) +# ERR errno value (see /usr/include/sys/errno.h) +# CWD print current working directory of process +# PATH pathname for file open +# COMM command name for the process +# ARGS argument listing for the process +# TIME timestamp for the open event, us +# STRTIME timestamp for the open event, string +# +# SEE ALSO: truss, BSM auditing. +# +# COPYRIGHT: Copyright (c) 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 09-May-2004 Brendan Gregg Created this. +# 21-Jan-2005 " " Wrapped in sh to provide options. +# 08-May-2005 " " Rewritten for performance. +# 14-May-2005 " " Added errno. +# 28-Jun-2005 " " Added cwd, zonename. +# 17-Sep-2005 " " Increased switchrate, fixed page fault bug. +# 16-Jan-2006 " " Added -n, -p. +# 16-Jan-2006 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### Default variables +opt_dump=0; opt_file=0; opt_time=0; opt_timestr=0; opt_args=0 +opt_zone=0; opt_cwd=0; opt_failonly=0; opt_err=0; filter=0; pathname=. +opt_name=0; opt_pid=0; pname=.; pid=0 + +### Process options +while getopts aAcef:ghn:p:svxZ name +do + case $name in + a) opt_time=1; opt_timestr=1; opt_args=1; opt_err=1 ;; + A) opt_dump=1 ;; + c) opt_cwd=1 ;; + e) opt_err=1 ;; + g) opt_args=1 ;; + f) opt_file=1; pathname=$OPTARG ;; + n) opt_name=1; pname=$OPTARG ;; + p) opt_pid=1; pid=$OPTARG ;; + s) opt_time=1 ;; + v) opt_timestr=1 ;; + x) opt_failonly=1 ;; + Z) opt_zone=1 ;; + h|?) cat <<-END >&2 + USAGE: opensnoop [-a|-A|-ceghsvxZ] [-f pathname] + [-n name] [-p PID] + opensnoop # default output + -a # print most data + -A # dump all data, space delimited + -c # print cwd of process + -e # print errno value + -g # print command arguments + -s # print start time, us + -v # print start time, string + -x # only print failed opens + -Z # print zonename + -f pathname # pathname name to snoop + -n name # process name to snoop + -p PID # process ID to snoop + eg, + opensnoop -v # human readable timestamps + opensnoop -e # see error codes + opensnoop -f /etc/motd # snoop this file only + END + exit 1 + esac +done + +### Option logic +if [ $opt_dump -eq 1 ]; then + opt_zone=0; opt_cwd=0; opt_time=0; opt_timestr=0; opt_args=2 +fi +if [ $opt_name -eq 1 -o $opt_pid -eq 1 ]; then + filter=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_dump = '$opt_dump'; + inline int OPT_file = '$opt_file'; + inline int OPT_args = '$opt_args'; + inline int OPT_cwd = '$opt_cwd'; + inline int OPT_err = '$opt_err'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int OPT_failonly = '$opt_failonly'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_name = '$opt_name'; + inline int FILTER = '$filter'; + inline int PID = '$pid'; + inline string PATHNAME = "'$pathname'"; + inline string NAME = "'$pname'"; + + #pragma D option quiet + #pragma D option switchrate=10hz + + /* + * Print header + */ + dtrace:::BEGIN + { + /* + * ternary operators are used to improve performance. + * OPT_args is unusual in that it can have one of three values. + */ + + /* print optional headers */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "STRTIME") : 1; + OPT_zone ? printf("%-10s ", "ZONE") : 1; + + /* print dump headers */ + OPT_dump ? printf("%s %s %s %s %s %s %s %s %s %s %s", "ZONE", + "TIME", "UID", "PID", "PPID", "COMM", "FD", "ERR", "CWD", + "PATH", "ARGS") : printf("%5s %6s ","UID","PID"); + + /* print main headers */ + OPT_args == 0 ? printf("%-12s ", "COMM") : 1; + OPT_dump == 0 ? printf("%3s ", "FD") : 1; + OPT_err ? printf("%3s ", "ERR") : 1; + OPT_cwd ? printf("%-20s ", "CWD") : 1; + OPT_dump == 0 ? printf("%-20s ", "PATH") : 1; + OPT_args == 1 ? printf("%s", "ARGS") : 1; + printf("\n"); + } + + /* + * Print open event + */ + syscall::open:entry + { + /* save pathname */ + self->pathp = arg0; + + /* default is to trace unless filtering */ + self->ok = FILTER ? 0 : 1; + + /* check each filter */ + (OPT_name == 1 && NAME == execname) ? self->ok = 1 : 1; + (OPT_pid == 1 && PID == pid) ? self->ok = 1 : 1; + /* OPT_file is checked on return to ensure pathp is mapped */ + } + + syscall::open:return + /self->ok && (! OPT_failonly || (int)arg0 < 0) && + ((OPT_file == 0) || (OPT_file == 1 && PATHNAME == copyinstr(self->pathp)))/ + { + /* print optional fields */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%-10s ", zonename) : 1; + + /* print dump fields */ + OPT_dump ? printf("%s %d %d %d %d %s %d %d %s %s %S", zonename, + timestamp/1000, uid, pid, ppid, execname, (int)arg0, errno, + cwd, copyinstr(self->pathp), curpsinfo->pr_psargs) : + printf("%5d %6d ", uid, pid); + + /* print main fields */ + OPT_args == 0 ? printf("%-12s ", execname) : 1; + OPT_dump == 0 ? printf("%3d ", (int)arg0) : 1; + OPT_err ? printf("%3d ", errno) : 1; + OPT_cwd ? printf("%-20s ", cwd) : 1; + OPT_dump == 0 ? printf("%-20s ", copyinstr(self->pathp)) : 1; + OPT_args == 1 ? printf("%S", curpsinfo->pr_psargs) : 1; + printf("\n"); + + /* cleanup */ + self->pathp = 0; + self->ok = 0; + } + + /* + * Cleanup + */ + syscall::open:return + /self->ok/ + { + self->pathp = 0; + self->ok = 0; + } +' diff --git a/cddl/contrib/dtracetoolkit/procsystime b/cddl/contrib/dtracetoolkit/procsystime new file mode 100755 index 00000000000..3b4bae7b68a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/procsystime @@ -0,0 +1,233 @@ +#!/bin/sh +# +# procsystime - print process system call time details. +# Written using DTrace (Solaris 10 3/05). +# +# $Id: procsystime 4 2007-08-01 11:01:38Z brendan $ +# +# USAGE: procsystime [-acehoT] [ -p PID | -n name | command ] +# +# -p PID # examine this PID +# -n name # examine this process name +# -a # print all details +# -c # print syscall counts +# -e # print elapsed times +# -o # print CPU times +# -T # print totals +# eg, +# procsystime -p 1871 # examine PID 1871 +# procsystime -n tar # examine processes called "tar" +# procsystime -aTn bash # print all details for bash shells +# procsystime df -h # run and examine "df -h" +# +# The elapsed times are interesting, to help identify syscalls that take +# some time to complete (during which the process may have slept). CPU time +# helps us identify syscalls that are consuming CPU cycles to run. +# +# FIELDS: +# SYSCALL System call name +# TIME (ns) Total time, nanoseconds +# COUNT Number of occurrences +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 27-Apr-2005 Brendan Gregg Created this. +# 08-Jun-2005 " " Added command option. +# 22-Sep-2005 " " Allowed systemwide tracing. +# 22-Sep-2005 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### Default variables +opt_filter=0; opt_pid=0; opt_name=0; pid=0; pname="."; +opt_elapsed=0; opt_cpu=0; opt_counts=0; opt_totals=0 +opt_command=0; command=""; + +### Process options +while getopts acehn:op:T name +do + case $name in + p) opt_filter=1; opt_pid=1; pid=$OPTARG ;; + n) opt_filter=1; opt_name=1; pname=$OPTARG ;; + a) opt_totals=1; opt_elapsed=1; opt_cpu=1; opt_counts=1 ;; + e) opt_elapsed=1 ;; + c) opt_counts=1 ;; + o) opt_cpu=1 ;; + T) opt_totals=1 ;; + h|?) cat <<-END >&2 + USAGE: procsystime [-aceho] [ -p PID | -n name | command ] + -p PID # examine this PID + -n name # examine this process name + -a # print all details + -e # print elapsed times + -c # print syscall counts + -o # print CPU times + -T # print totals + eg, + procsystime -p 1871 # examine PID 1871 + procsystime -n tar # examine processes called "tar" + procsystime -aTn bash # print all details for bash + procsystime df -h # run and examine "df -h" + END + exit 1 + esac +done +shift `expr $OPTIND - 1` + +### Option logic +if [ $opt_pid -eq 0 -a $opt_name -eq 0 -a "$*" != "" ]; then + opt_filter=1 + opt_command=1 + command="$*" +fi +if [ $opt_elapsed -eq 0 -a $opt_cpu -eq 0 -a $opt_counts -eq 0 ]; then + opt_elapsed=1; +fi + + +################################# +# --- Main Program, DTrace --- +# +dtrace=' + #pragma D option quiet + + /* + * Command line arguments + */ + inline int OPT_elapsed = '$opt_elapsed'; + inline int OPT_cpu = '$opt_cpu'; + inline int OPT_counts = '$opt_counts'; + inline int OPT_filter = '$opt_filter'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_name = '$opt_name'; + inline int OPT_totals = '$opt_totals'; + inline int OPT_command = '$opt_command'; + inline int PID = '$pid'; + inline string NAME = "'$pname'"; + inline string COMMAND = "'$command'"; + + dtrace:::BEGIN + { + self->start = 0; + self->vstart = 0; + } + dtrace:::BEGIN + /! OPT_command/ + { + printf("Tracing... Hit Ctrl-C to end...\n"); + } + + /* + * Set start timestamp and counts + */ + syscall:::entry + /(! OPT_filter) || + (OPT_pid && pid == PID) || + (OPT_name && execname == NAME) || + (OPT_command && pid == $target)/ + { + self->ok = 1; + } + syscall:::entry + /self->ok/ + { + OPT_counts ? @Counts[probefunc] = count() : 1; + (OPT_counts && OPT_totals) ? @Counts["TOTAL:"] = count() : 1; + OPT_elapsed ? self->start = timestamp : 1; + OPT_cpu ? self->vstart = vtimestamp : 1; + self->ok = 0; + } + + /* + * Calculate time deltas + */ + syscall:::return + /self->start/ + { + this->elapsed = timestamp - self->start; + @Elapsed[probefunc] = sum(this->elapsed); + OPT_totals ? @Elapsed["TOTAL:"] = sum(this->elapsed) : 1; + self->start = 0; + } + syscall:::return + /self->vstart/ + { + this->cpu = vtimestamp - self->vstart; + @CPU[probefunc] = sum(this->cpu); + OPT_totals ? @CPU["TOTAL:"] = sum(this->cpu) : 1; + self->vstart = 0; + } + + /* + * Elapsed time report + */ + dtrace:::END + /OPT_elapsed/ + { + printf("\nElapsed Times for "); + OPT_pid ? printf("PID %d,\n\n",PID) : 1; + OPT_name ? printf("processes %s,\n\n",NAME) : 1; + OPT_command ? printf("command %s,\n\n",COMMAND) : 1; + (! OPT_filter) ? printf("all processes,\n\n") : 1; + printf("%16s %18s\n","SYSCALL","TIME (ns)"); + printa("%16s %@18d\n",@Elapsed); + } + + /* + * CPU time report + */ + dtrace:::END + /OPT_cpu/ + { + printf("\nCPU Times for "); + OPT_pid ? printf("PID %d,\n\n",PID) : 1; + OPT_name ? printf("processes %s,\n\n",NAME) : 1; + OPT_command ? printf("command %s,\n\n",COMMAND) : 1; + (! OPT_filter) ? printf("all processes,\n\n") : 1; + printf("%16s %18s\n","SYSCALL","TIME (ns)"); + printa("%16s %@18d\n",@CPU); + } + + /* + * Syscall count report + */ + dtrace:::END + /OPT_counts/ + { + printf("\nSyscall Counts for "); + OPT_pid ? printf("PID %d,\n\n",PID) : 1; + OPT_name ? printf("processes %s,\n\n",NAME) : 1; + OPT_command ? printf("command %s,\n\n",COMMAND) : 1; + (! OPT_filter) ? printf("all processes,\n\n") : 1; + printf("%16s %18s\n","SYSCALL","COUNT"); + OPT_counts ? printa("%16s %@18d\n",@Counts) : 1; + } +' + +### Run DTrace +if [ $opt_command -eq 1 ]; then + /usr/sbin/dtrace -n "$dtrace" -x evaltime=exec -c "$command" >&2 +else + /usr/sbin/dtrace -n "$dtrace" >&2 +fi + diff --git a/cddl/contrib/dtracetoolkit/rwsnoop b/cddl/contrib/dtracetoolkit/rwsnoop new file mode 100755 index 00000000000..9d4932487cc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/rwsnoop @@ -0,0 +1,234 @@ +#!/usr/bin/ksh +# +# rwsnoop - snoop read/write events. +# Written using DTrace (Solaris 10 3/05). +# +# This is measuring reads and writes at the application level. This matches +# the syscalls read, write, pread and pwrite. +# +# $Id: rwsnoop 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: rwsnoop [-jPtvZ] [-n name] [-p pid] +# +# rwsnoop # default output +# +# -j # print project ID +# -P # print parent process ID +# -t # print timestamp, us +# -v # print time, string +# -Z # print zone ID +# -n name # this process name only +# -p PID # this PID only +# eg, +# rwsnoop -Z # print zone ID +# rwsnoop -n bash # monitor processes named "bash" +# rwsnoop > out.txt # recommended +# +# NOTE: +# rwsnoop usually prints plenty of output, which itself will cause +# more output. It can be better to redirect the output of rwsnoop +# to a file to prevent this. +# +# FIELDS: +# TIME Timestamp, us +# TIMESTR Time, string +# ZONE Zone ID +# PROJ Project ID +# UID User ID +# PID Process ID +# PPID Parent Process ID +# CMD Process name +# D Direction, Read or Write +# BYTES Total bytes during sample, -1 for error +# FILE Filename, if file based +# +# Reads and writes that are not file based, for example with sockets, will +# print "" as the filename. +# +# SEE ALSO: rwtop +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# TODO: +# Track readv and writev. +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 24-Jul-2005 Brendan Gregg Created this. +# 17-Sep-2005 " " Increased switchrate. +# 17-Sep-2005 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### default variables +opt_name=0; opt_pid=0; opt_proj=0; opt_zone=0; opt_time=0; opt_timestr=0 +opt_bytes=1; filter=0; pname=.; pid=0; opt_ppid=0 + +### process options +while getopts n:Pp:jtvZ name +do + case $name in + n) opt_name=1; pname=$OPTARG ;; + p) opt_pid=1; pid=$OPTARG ;; + P) opt_ppid=1 ;; + j) opt_proj=1 ;; + t) opt_time=1 ;; + v) opt_timestr=1 ;; + Z) opt_zone=1 ;; + h|?) cat <<-END >&2 + USAGE: rwsnoop [-jPtvZ] [-n name] [-p pid] + + -j # print project ID + -P # print parent process ID + -t # print timestamp, us + -v # print time, string + -Z # print zone ID + -n name # this process name only + -p PID # this PID only + eg, + rwsnoop # default output + rwsnoop -Z # print zone ID + rwsnoop -n bash # monitor processes named "bash" + END + exit 1 + esac +done + +shift $(( $OPTIND - 1 )) + +### option logic +if (( opt_name || opt_pid )); then + filter=1 +fi + + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_proj = '$opt_proj'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_bytes = '$opt_bytes'; + inline int OPT_name = '$opt_name'; + inline int OPT_ppid = '$opt_ppid'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int FILTER = '$filter'; + inline int PID = '$pid'; + inline string NAME = "'$pname'"; + + #pragma D option quiet + #pragma D option switchrate=10hz + + /* + * Print header + */ + dtrace:::BEGIN + { + /* print header */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "TIMESTR") : 1; + OPT_proj ? printf("%5s ", "PROJ") : 1; + OPT_zone ? printf("%5s ", "ZONE") : 1; + OPT_ppid ? printf("%6s ", "PPID") : 1; + printf("%5s %6s %-12s %1s %7s %s\n", + "UID", "PID", "CMD", "D", "BYTES", "FILE"); + } + + /* + * Check event is being traced + */ + syscall::*read:entry, + syscall::*write:entry + /pid != $pid/ + { + /* default is to trace unless filtering, */ + self->ok = FILTER ? 0 : 1; + + /* check each filter, */ + (OPT_name == 1 && NAME == execname)? self->ok = 1 : 1; + (OPT_pid == 1 && PID == pid) ? self->ok = 1 : 1; + + /* save file descriptor */ + self->fd = self->ok ? arg0 : 0; + } + + /* + * Save read details + */ + syscall::*read:return + /self->ok/ + { + self->rw = "R"; + self->size = arg0; + } + + /* + * Save write details + */ + syscall::*write:entry + /self->ok/ + { + self->rw = "W"; + self->size = arg2; + } + + /* + * Process event + */ + syscall::*read:return, + syscall::*write:entry + /self->ok/ + { + /* + * Fetch filename + */ + this->filistp = curthread->t_procp->p_user.u_finfo.fi_list; + this->ufentryp = (uf_entry_t *)((uint64_t)this->filistp + + (uint64_t)self->fd * (uint64_t)sizeof(uf_entry_t)); + this->filep = this->ufentryp->uf_file; + this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0; + self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ? + cleanpath(this->vnodep->v_path) : "") : ""; + + /* + * Print details + */ + OPT_time ? printf("%-14d ", timestamp / 1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_proj ? printf("%5d ", curpsinfo->pr_projid) : 1; + OPT_zone ? printf("%5d ", curpsinfo->pr_zoneid) : 1; + OPT_ppid ? printf("%6d ", ppid) : 1; + printf("%5d %6d %-12.12s %1s %7d %s\n", + uid, pid, execname, self->rw, (int)self->size, self->vpath); + + self->ok = 0; + self->fd = 0; + self->rw = 0; + self->size = 0; + self->vpath = 0; + } +' diff --git a/cddl/contrib/dtracetoolkit/rwtop b/cddl/contrib/dtracetoolkit/rwtop new file mode 100755 index 00000000000..ed0a6faaa47 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/rwtop @@ -0,0 +1,292 @@ +#!/usr/bin/ksh +# +# rwtop - display top read/write bytes by process. +# Written using DTrace (Solaris 10 3/05). +# +# This is measuring reads and writes at the application level. This matches +# read and write system calls. +# +# $Id: rwtop 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: rwtop [-cC] [-j|-Z] [-n name] [-p pid] +# [-t top] [interval [count]] +# +# rwtop # default output, 5 second samples +# +# -C # don't clear the screen +# -c # print counts +# -j # print project ID +# -Z # print zone ID +# -n name # this process name only +# -p PID # this PID only +# -t top # print top number only +# eg, +# rwtop 1 # 1 second samples +# rwtop -t 10 # print top 10 only +# rwtop -n bash # monitor processes named "bash" +# rwtop -C 5 12 # print 12 x 5 second samples +# +# FIELDS: +# ZONE Zone ID +# PROJ Project ID +# UID User ID +# PID Process ID +# PPID Parent Process ID +# CMD Process name +# D Direction, Read or Write +# BYTES Total bytes during sample +# app_r total reads during sample, Kbytes +# app_w total writes during sample, Kbytes +# +# SEE ALSO: iotop +# +# INSPIRATION: top(1) by William LeFebvre +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 24-Jul-2005 Brendan Gregg Created this. +# 20-Apr-2006 " " Last update. + + +############################## +# --- Process Arguments --- +# + +### default variables +opt_name=0; opt_pid=0; opt_clear=1; opt_proj=0; opt_zone=0 +opt_def=1; opt_bytes=1; filter=0; pname=.; pid=0 +opt_top=0; opt_count=0; interval=5; count=-1; top=0 + +### process options +while getopts Cchn:p:jt:Z name +do + case $name in + C) opt_clear=0 ;; + c) opt_count=1; opt_bytes=0 ;; + n) opt_name=1; pname=$OPTARG ;; + p) opt_pid=1; pid=$OPTARG ;; + j) opt_proj=1; opt_def=0 ;; + t) opt_top=1; top=$OPTARG ;; + Z) opt_zone=1; opt_def=0 ;; + h|?) cat <<-END >&2 + USAGE: rwtop [-cC] [-j|-Z] [-n name] [-p pid] + [-t top] [interval [count]] + + -C # don't clear the screen + -c # print counts + -j # print project ID + -Z # print zone ID + -n name # this process name only + -p PID # this PID only + -t top # print top number only + eg, + rwtop # default output, 5 second samples + rwtop 1 # 1 second samples + rwtop -t 10 # print top 10 only + rwtop -n bash # monitor processes named "bash" + rwtop -C 5 12 # print 12 x 5 second samples + END + exit 1 + esac +done + +shift $(( $OPTIND - 1 )) + +### option logic +if [[ "$1" > 0 ]]; then + interval=$1; shift +fi +if [[ "$1" > 0 ]]; then + count=$1; shift +fi +if (( opt_proj && opt_zone )); then + opt_proj=0 +fi +if (( opt_name || opt_pid )); then + filter=1 +fi +if (( opt_clear )); then + clearstr=`clear` +else + clearstr=. +fi + + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_def = '$opt_def'; + inline int OPT_proj = '$opt_proj'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_clear = '$opt_clear'; + inline int OPT_bytes = '$opt_bytes'; + inline int OPT_count = '$opt_count'; + inline int OPT_name = '$opt_name'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_top = '$opt_top'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + inline int FILTER = '$filter'; + inline int TOP = '$top'; + inline int PID = '$pid'; + inline string NAME = "'$pname'"; + inline string CLEAR = "'$clearstr'"; + + #pragma D option quiet + + /* + * Print header + */ + dtrace:::BEGIN + { + /* starting values */ + counts = COUNTER; + secs = INTERVAL; + app_r = 0; + app_w = 0; + + printf("Tracing... Please wait.\n"); + } + + /* + * Check event is being traced + */ + sysinfo:::readch, + sysinfo:::writech + /pid != $pid/ + { + /* default is to trace unless filtering, */ + this->ok = FILTER ? 0 : 1; + + /* check each filter, */ + (OPT_name == 1 && NAME == execname)? this->ok = 1 : 1; + (OPT_pid == 1 && PID == pid) ? this->ok = 1 : 1; + } + + /* + * Increment tallys + */ + sysinfo:::readch + /this->ok/ + { + app_r += arg0; + } + sysinfo:::writech + /this->ok/ + { + app_w += arg0; + } + + /* + * Process event + */ + sysinfo:::readch, + sysinfo:::writech + /this->ok/ + { + /* choose statistic to track */ + this->value = OPT_bytes ? arg0 : 1; + + /* + * Save details + */ + OPT_def ? @out[uid, pid, ppid, execname, + probename == "readch" ? "R" : "W"] = sum(this->value) : 1; + OPT_proj ? @out[curpsinfo->pr_projid, pid, ppid, execname, + probename == "readch" ? "R" : "W"] = sum(this->value) : 1; + OPT_zone ? @out[curpsinfo->pr_zoneid, pid, ppid, execname, + probename == "readch" ? "R" : "W"] = sum(this->value) : 1; + + this->ok = 0; + } + + /* + * Timer + */ + profile:::tick-1sec + { + secs--; + } + + /* + * Print Report + */ + profile:::tick-1sec + /secs == 0/ + { + /* fetch 1 min load average */ + this->load1a = `hp_avenrun[0] / 65536; + this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; + + /* convert counters to Kbytes */ + app_r /= 1024; + app_w /= 1024; + + /* print status */ + OPT_clear ? printf("%s", CLEAR) : 1; + printf("%Y, load: %d.%02d, app_r: %6d KB, app_w: %6d KB\n\n", + walltimestamp, this->load1a, this->load1b, app_r, app_w); + + /* print headers */ + OPT_def ? printf(" UID ") : 1; + OPT_proj ? printf(" PROJ ") : 1; + OPT_zone ? printf(" ZONE ") : 1; + printf("%6s %6s %-16s %1s", + "PID", "PPID", "CMD", "D"); + OPT_bytes ? printf(" %16s\n", "BYTES") : 1; + OPT_count ? printf(" %16s\n", "COUNT") : 1; + + /* truncate to top lines if needed */ + OPT_top ? trunc(@out, TOP) : 1; + + /* print data */ + printa("%5d %6d %6d %-16s %1s %16@d\n", @out); + printf("\n"); + + /* clear data */ + trunc(@out); + app_r = 0; + app_w = 0; + secs = INTERVAL; + counts--; + } + + /* + * End of program + */ + profile:::tick-1sec + /counts == 0/ + { + exit(0); + } + + /* + * Cleanup for Ctrl-C + */ + dtrace:::END + { + trunc(@out); + } +' + diff --git a/cddl/contrib/dtracetoolkit/statsnoop b/cddl/contrib/dtracetoolkit/statsnoop new file mode 100755 index 00000000000..6284fb5060f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/statsnoop @@ -0,0 +1,286 @@ +#!/usr/bin/sh +# +# statsnoop - snoop file stats as they occur. +# Written using DTrace (Solaris 10 3/05). +# +# $Id: statsnoop 65 2007-10-04 11:09:40Z brendan $ +# +# USAGE: statsnoop [-a|-A|-ceghlsvxZ] [-f pathname] [-t syscall] +# [-n name] [-p PID] +# +# statsnoop # default output +# +# -a # print most data +# -A # dump all data, space delimited +# -c # print cwd of process +# -e # print errno value +# -g # print command arguments +# -l # print syscall type +# -s # print start time, us +# -v # print start time, string +# -x # only print failed stats +# -Z # print zonename +# -f pathname # file pathname to snoop +# -n name # command name to snoop +# -p PID # process ID to snoop +# -t syscall # stat syscall to trace +# eg, +# statsnoop -v # human readable timestamps +# statsnoop -S # syscall type +# statsnoop -e # see error codes +# statsnoop -f /etc/passwd # snoop this file only +# +# FIELDS: +# ZONE Zone name +# UID User ID +# PID Process ID +# PPID Parent Process ID +# FD file descriptor (-1 for error) +# ERR errno value (see /usr/include/sys/errno.h) +# TYPE syscall type +# CWD current working directory of process +# PATH pathname for file stat +# COMM command name for the process +# ARGS argument listing for the process +# TIME timestamp for the stat event, us +# STRTIME timestamp for the stat event, string +# +# SEE ALSO: truss, BSM auditing. +# +# COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 09-Sep-2007 Brendan Gregg Created this. +# + + +############################## +# --- Process Arguments --- +# + +### Default variables +opt_dump=0; opt_file=0; opt_time=0; opt_timestr=0; opt_args=0 +opt_zone=0; opt_cwd=0; opt_failonly=0; opt_err=0; filter=0; pathname=. +opt_name=0; opt_pid=0; opt_type=0; opt_trace=0; pname=.; pid=0; trace=. + +### Process options +while getopts aAcef:ghln:p:st:vxZ name +do + case $name in + a) opt_time=1; opt_timestr=1; opt_args=1; opt_err=1 ;; + A) opt_dump=1 ;; + c) opt_cwd=1 ;; + e) opt_err=1 ;; + g) opt_args=1 ;; + f) opt_file=1; pathname=$OPTARG ;; + l) opt_type=1 ;; + n) opt_name=1; pname=$OPTARG ;; + p) opt_pid=1; pid=$OPTARG ;; + s) opt_time=1 ;; + t) opt_trace=1; trace=$OPTARG ;; + v) opt_timestr=1 ;; + x) opt_failonly=1 ;; + Z) opt_zone=1 ;; + h|?) cat <<-END >&2 + USAGE: statsnoop [-a|-A|-ceghlsvxZ] [-f pathname] [-t syscall] + [-n execname] [-p PID] + statsnoop # default output + -a # print most data + -A # dump all data, space delimited + -c # print cwd of process + -e # print errno value + -g # print command arguments + -l # print syscall type + -s # print start time, us + -v # print start time, string + -x # only print failed stats + -Z # print zonename + -f pathname # pathname name to snoop + -n name # process name to snoop + -p PID # process ID to snoop + -t syscall # stat syscall to trace + eg, + statsnoop -v # human readable timestamps + statsnoop -e # see error codes + statsnoop -f /etc/motd # snoop this file only + END + exit 1 + esac +done + +### Option logic +if [ $opt_dump -eq 1 ]; then + opt_zone=0; opt_cwd=0; opt_time=0; opt_timestr=0; opt_type=0 + opt_args=2 +fi +if [ $opt_name -eq 1 -o $opt_pid -eq 1 -o $opt_trace -eq 1 ]; then + filter=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_dump = '$opt_dump'; + inline int OPT_file = '$opt_file'; + inline int OPT_args = '$opt_args'; + inline int OPT_cwd = '$opt_cwd'; + inline int OPT_err = '$opt_err'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int OPT_type = '$opt_type'; + inline int OPT_failonly = '$opt_failonly'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_name = '$opt_name'; + inline int OPT_trace = '$opt_trace'; + inline int FILTER = '$filter'; + inline int PID = '$pid'; + inline string PATHNAME = "'$pathname'"; + inline string NAME = "'$pname'"; + inline string TRACE = "'$trace'"; + + #pragma D option quiet + #pragma D option switchrate=10hz + + /* + * Print header + */ + dtrace:::BEGIN + { + /* print optional headers */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "STRTIME") : 1; + OPT_zone ? printf("%-10s ", "ZONE") : 1; + + /* print dump headers */ + OPT_dump ? printf("%s %s %s %s %s %s %s %s %s %s %s", "ZONE", + "TIME", "UID", "PID", "PPID", "COMM", "FD", "ERR", "CWD", + "PATH", "ARGS") : printf("%5s %6s ","UID","PID"); + + /* print main headers */ + OPT_args == 0 ? printf("%-12s ", "COMM") : 1; + OPT_dump == 0 ? printf("%3s ", "FD") : 1; + OPT_err ? printf("%3s ", "ERR") : 1; + OPT_cwd ? printf("%-20s ", "CWD") : 1; + OPT_type ? printf("%-8s ", "TYPE") : 1; + OPT_dump == 0 ? printf("%-20s ", "PATH") : 1; + OPT_args == 1 ? printf("%s", "ARGS") : 1; + printf("\n"); + } + + /* + * Print stat event + */ + syscall::stat:entry, syscall::stat64:entry, syscall::xstat:entry, + syscall::lstat:entry, syscall::lstat64:entry, syscall::lxstat:entry, + syscall::fstat:entry, syscall::fstat64:entry, syscall::fxstat:entry + { + /* default is to trace unless filtering */ + self->ok = FILTER ? 0 : 1; + + /* check each filter */ + (OPT_name == 1 && NAME == execname) ? self->ok = 1 : 1; + (OPT_pid == 1 && PID == pid) ? self->ok = 1 : 1; + (OPT_trace == 1 && TRACE == probefunc) ? self->ok = 1 : 1; + } + + syscall::stat:entry, syscall::stat64:entry, + syscall::lstat:entry, syscall::lstat64:entry, syscall::lxstat:entry + /self->ok/ + { + self->pathp = arg0; + } + + syscall::xstat:entry + /self->ok/ + { + self->pathp = arg1; + } + + syscall::stat:return, syscall::stat64:return, syscall::xstat:return, + syscall::lstat:return, syscall::lstat64:return, syscall::lxstat:return + /self->ok/ + { + self->path = copyinstr(self->pathp); + self->pathp = 0; + } + + syscall::fstat:return, syscall::fstat64:entry, syscall::fxstat:entry + /self->ok/ + { + self->filep = curthread->t_procp->p_user.u_finfo.fi_list[arg0].uf_file; + } + + syscall::fstat:return, syscall::fstat64:return, syscall::fxstat:return + /self->ok/ + { + this->vnodep = self->filep != 0 ? self->filep->f_vnode : 0; + self->path = this->vnodep ? (this->vnodep->v_path != 0 ? + cleanpath(this->vnodep->v_path) : "") : ""; + self->filep = 0; + } + + syscall::stat:return, syscall::stat64:return, syscall::xstat:return, + syscall::lstat:return, syscall::lstat64:return, syscall::lxstat:return, + syscall::fstat:return, syscall::fstat64:return, syscall::fxstat:return + /self->ok && (! OPT_failonly || (int)arg0 < 0) && + ((OPT_file == 0) || (OPT_file == 1 && PATHNAME == copyinstr(self->pathp)))/ + { + /* print optional fields */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%-10s ", zonename) : 1; + + /* print dump fields */ + OPT_dump ? printf("%s %d %d %d %d %s %d %d %s %s %S", zonename, + timestamp/1000, uid, pid, ppid, execname, (int)arg0, errno, + cwd, self->path, curpsinfo->pr_psargs) : + printf("%5d %6d ", uid, pid); + + /* print main fields */ + OPT_args == 0 ? printf("%-12.12s ", execname) : 1; + OPT_dump == 0 ? printf("%3d ", (int)arg0) : 1; + OPT_err ? printf("%3d ", errno) : 1; + OPT_cwd ? printf("%-20s ", cwd) : 1; + OPT_type ? printf("%-8s ", probefunc) : 1; + OPT_dump == 0 ? printf("%-20s ", self->path) : 1; + OPT_args == 1 ? printf("%S", curpsinfo->pr_psargs) : 1; + printf("\n"); + + /* cleanup */ + self->path = 0; + self->ok = 0; + } + + /* + * Cleanup + */ + syscall::stat:return, syscall::stat64:return, syscall::xstat:return, + syscall::lstat:return, syscall::lstat64:return, syscall::lxstat:return, + syscall::fstat:return, syscall::fstat64:return, syscall::fxstat:return + /self->ok/ + { + self->path = 0; + self->ok = 0; + } +' diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTOREVEN.nodivide.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTOREVEN.nodivide.d new file mode 100644 index 00000000000..b11d2828bb7 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTOREVEN.nodivide.d @@ -0,0 +1,29 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 10, 0, 10, 25); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTOREVEN.notfactor.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTOREVEN.notfactor.d new file mode 100644 index 00000000000..c8af7d920f3 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTOREVEN.notfactor.d @@ -0,0 +1,29 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 10, 0, 10, 30); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORMATCH.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORMATCH.d new file mode 100644 index 00000000000..0404b4ffbdc --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORMATCH.d @@ -0,0 +1,30 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 10, 0, 10, 10); + @ = llquantize(0, 3, 0, 10, 81); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORNSTEPS.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORNSTEPS.d new file mode 100644 index 00000000000..fd6b0e67f26 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORNSTEPS.d @@ -0,0 +1,29 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 10, 0, 10, 7); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORSMALL.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORSMALL.d new file mode 100644 index 00000000000..7074f5f6650 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORSMALL.d @@ -0,0 +1,29 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 1, 0, 10, 10); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORTYPE.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORTYPE.d new file mode 100644 index 00000000000..ea39c7e38ca --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORTYPE.d @@ -0,0 +1,30 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + this->doogle = 10; + @ = llquantize(0, this->doogle, 0, 10, 10); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORVAL.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORVAL.d new file mode 100644 index 00000000000..a1ad20f28a6 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_FACTORVAL.d @@ -0,0 +1,29 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 65537, 0, 10, 10); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_HIGHMATCH.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_HIGHMATCH.d new file mode 100644 index 00000000000..46bf0e6fc20 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_HIGHMATCH.d @@ -0,0 +1,30 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 10, 0, 10, 10); + @ = llquantize(0, 10, 0, 11, 10); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_HIGHTYPE.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_HIGHTYPE.d new file mode 100644 index 00000000000..fee786d39e0 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_HIGHTYPE.d @@ -0,0 +1,30 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + this->doogle = 10; + @ = llquantize(0, 10, 0, this->doogle, 10); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_HIGHVAL.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_HIGHVAL.d new file mode 100644 index 00000000000..531ab0b6641 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_HIGHVAL.d @@ -0,0 +1,29 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 10, 0, -1, 10); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_LOWMATCH.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_LOWMATCH.d new file mode 100644 index 00000000000..126429a2996 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_LOWMATCH.d @@ -0,0 +1,30 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 10, 0, 10, 10); + @ = llquantize(0, 10, 1, 10, 10); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_LOWTYPE.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_LOWTYPE.d new file mode 100644 index 00000000000..2a9b2efdc8d --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_LOWTYPE.d @@ -0,0 +1,30 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + this->doogle = 0; + @ = llquantize(0, 10, this->doogle, 10, 10); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_LOWVAL.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_LOWVAL.d new file mode 100644 index 00000000000..e1045d83bdc --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_LOWVAL.d @@ -0,0 +1,29 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 10, -1, 10, 10); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_MAGRANGE.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_MAGRANGE.d new file mode 100644 index 00000000000..9852c1ab953 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_MAGRANGE.d @@ -0,0 +1,29 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 10, 10, 0, 10); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_MAGTOOBIG.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_MAGTOOBIG.d new file mode 100644 index 00000000000..c7076308446 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_MAGTOOBIG.d @@ -0,0 +1,29 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 10, 0, 100, 10); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_NSTEPMATCH.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_NSTEPMATCH.d new file mode 100644 index 00000000000..77b4d8a84d2 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_NSTEPMATCH.d @@ -0,0 +1,30 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(0, 10, 0, 10, 10); + @ = llquantize(0, 10, 0, 10, 100); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_NSTEPTYPE.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_NSTEPTYPE.d new file mode 100644 index 00000000000..4eb9b2f06d0 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_NSTEPTYPE.d @@ -0,0 +1,30 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + this->doogle = 10; + @ = llquantize(0, 10, 0, 10, this->doogle); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_NSTEPVAL.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_NSTEPVAL.d new file mode 100644 index 00000000000..3855beb4adc --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/err.D_LLQUANT_NSTEPVAL.d @@ -0,0 +1,29 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +BEGIN +{ + @ = llquantize(123, 10, 0, 10, 123456); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.bases.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.bases.d new file mode 100644 index 00000000000..e3a6ff1a8cd --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.bases.d @@ -0,0 +1,46 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +#pragma D option quiet + +tick-1ms +/i++ <= 100/ +{ + @two = llquantize(i, 2, 0, 6, 2); + @three = llquantize(i, 3, 0, 1, 9); + @four = llquantize(i, 4, 0, 1, 4); + @five = llquantize(i, 5, 0, 1, 25); + @six = llquantize(i, 6, 0, 3, 12); + @seven = llquantize(i, 7, 0, 1, 7); + @eight = llquantize(i, 8, 0, 1, 16); + @nine = llquantize(i, 9, 0, 1, 9); + @ten = llquantize(i, 10, 0, 1, 10); +} + +tick-1ms +/i > 100/ +{ + exit(0); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.bases.d.out b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.bases.d.out new file mode 100644 index 00000000000..1b207bf6f29 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.bases.d.out @@ -0,0 +1,177 @@ + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 1 + 2 |@ 2 + 4 |@@ 4 + 8 |@@@ 8 + 16 |@@@@@@ 16 + 32 |@@@@@@@@@@@@@ 32 + 64 |@@@@@@@@@@@@@@@ 38 + >= 128 | 0 + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 1 + 2 | 1 + 3 | 1 + 4 | 1 + 5 | 1 + 6 | 1 + 7 | 1 + 8 | 1 + >= 9 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 93 + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 1 + 2 | 1 + 3 | 1 + 4 |@@ 4 + 8 |@@ 4 + 12 |@@ 4 + >= 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 86 + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 1 + 2 | 1 + 3 | 1 + 4 | 1 + 5 | 1 + 6 | 1 + 7 | 1 + 8 | 1 + 9 | 1 + 10 | 1 + 11 | 1 + 12 | 1 + 13 | 1 + 14 | 1 + 15 | 1 + 16 | 1 + 17 | 1 + 18 | 1 + 19 | 1 + 20 | 1 + 21 | 1 + 22 | 1 + 23 | 1 + 24 | 1 + >= 25 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 77 + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 1 + 2 | 1 + 3 | 1 + 4 | 1 + 5 | 1 + 6 |@ 3 + 9 |@ 3 + 12 |@ 3 + 15 |@ 3 + 18 |@ 3 + 21 |@ 3 + 24 |@ 3 + 27 |@ 3 + 30 |@ 3 + 33 |@ 3 + 36 |@@@@@@@ 18 + 54 |@@@@@@@ 18 + 72 |@@@@@@@ 18 + 90 |@@@@@ 12 + 108 | 0 + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 1 + 2 | 1 + 3 | 1 + 4 | 1 + 5 | 1 + 6 | 1 + 7 |@@@ 7 + 14 |@@@ 7 + 21 |@@@ 7 + 28 |@@@ 7 + 35 |@@@ 7 + 42 |@@@ 7 + >= 49 |@@@@@@@@@@@@@@@@@@@@@ 53 + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 1 + 2 | 1 + 3 | 1 + 4 | 1 + 5 | 1 + 6 | 1 + 7 | 1 + 8 |@@ 4 + 12 |@@ 4 + 16 |@@ 4 + 20 |@@ 4 + 24 |@@ 4 + 28 |@@ 4 + 32 |@@ 4 + 36 |@@ 4 + 40 |@@ 4 + 44 |@@ 4 + 48 |@@ 4 + 52 |@@ 4 + 56 |@@ 4 + 60 |@@ 4 + >= 64 |@@@@@@@@@@@@@@@ 38 + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 1 + 2 | 1 + 3 | 1 + 4 | 1 + 5 | 1 + 6 | 1 + 7 | 1 + 8 | 1 + 9 |@@@@ 9 + 18 |@@@@ 9 + 27 |@@@@ 9 + 36 |@@@@ 9 + 45 |@@@@ 9 + 54 |@@@@ 9 + 63 |@@@@ 9 + 72 |@@@@ 9 + >= 81 |@@@@@@@@ 21 + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 1 + 2 | 1 + 3 | 1 + 4 | 1 + 5 | 1 + 6 | 1 + 7 | 1 + 8 | 1 + 9 | 1 + 10 |@@@@ 10 + 20 |@@@@ 10 + 30 |@@@@ 10 + 40 |@@@@ 10 + 50 |@@@@ 10 + 60 |@@@@ 10 + 70 |@@@@ 10 + 80 |@@@@ 10 + 90 |@@@@ 10 + >= 100 |@ 2 + diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.basic.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.basic.d new file mode 100644 index 00000000000..57b6ed881b7 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.basic.d @@ -0,0 +1,38 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +#pragma D option quiet + +tick-1ms +/i++ <= 100/ +{ + @ = llquantize(i, 10, 0, 10, 10); +} + +tick-1ms +/i > 100/ +{ + exit(0); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.basic.d.out b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.basic.d.out new file mode 100644 index 00000000000..9a7b288966f --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.basic.d.out @@ -0,0 +1,25 @@ + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 1 + 2 | 1 + 3 | 1 + 4 | 1 + 5 | 1 + 6 | 1 + 7 | 1 + 8 | 1 + 9 | 1 + 10 |@@@@ 10 + 20 |@@@@ 10 + 30 |@@@@ 10 + 40 |@@@@ 10 + 50 |@@@@ 10 + 60 |@@@@ 10 + 70 |@@@@ 10 + 80 |@@@@ 10 + 90 |@@@@ 10 + 100 |@ 2 + 200 | 0 + diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.negorder.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.negorder.d new file mode 100644 index 00000000000..b18c688bc75 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.negorder.d @@ -0,0 +1,62 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +#pragma D option quiet + +BEGIN +{ + a = 7; + b = 13; + val = (-a * b) + a; +} + +tick-1ms +{ + incr = val % b; + val += a; +} + +tick-1ms +/val == 0/ +{ + val += a; +} + +tick-1ms +/incr != 0/ +{ + i++; + @llquanty[i] = llquantize(1, 10, 0, 10, 10, incr); +} + +tick-1ms +/incr == 0/ +{ + printf("Ordering of llquantize() with some negative weights:\n"); + printa(@llquanty); + printf("\n"); + + exit(0); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.negorder.d.out b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.negorder.d.out new file mode 100644 index 00000000000..ac0f3cb300e --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.negorder.d.out @@ -0,0 +1,148 @@ +Ordering of llquantize() with some negative weights: + + 2 + value ------------- Distribution ------------- count + < 1 | 0 + 1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -12 + 2 | 0 + + 4 + value ------------- Distribution ------------- count + < 1 | 0 + 1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -11 + 2 | 0 + + 6 + value ------------- Distribution ------------- count + < 1 | 0 + 1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -10 + 2 | 0 + + 8 + value ------------- Distribution ------------- count + < 1 | 0 + 1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -9 + 2 | 0 + + 10 + value ------------- Distribution ------------- count + < 1 | 0 + 1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -8 + 2 | 0 + + 12 + value ------------- Distribution ------------- count + < 1 | 0 + 1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -7 + 2 | 0 + + 1 + value ------------- Distribution ------------- count + < 1 | 0 + 1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -6 + 2 | 0 + + 3 + value ------------- Distribution ------------- count + < 1 | 0 + 1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -5 + 2 | 0 + + 5 + value ------------- Distribution ------------- count + < 1 | 0 + 1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -4 + 2 | 0 + + 7 + value ------------- Distribution ------------- count + < 1 | 0 + 1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -3 + 2 | 0 + + 9 + value ------------- Distribution ------------- count + < 1 | 0 + 1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -2 + 2 | 0 + + 11 + value ------------- Distribution ------------- count + < 1 | 0 + 1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -1 + 2 | 0 + + 14 + value ------------- Distribution ------------- count + < 1 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + 16 + value ------------- Distribution ------------- count + < 1 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 2 | 0 + + 18 + value ------------- Distribution ------------- count + < 1 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 2 | 0 + + 20 + value ------------- Distribution ------------- count + < 1 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 2 | 0 + + 22 + value ------------- Distribution ------------- count + < 1 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 2 | 0 + + 24 + value ------------- Distribution ------------- count + < 1 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 2 | 0 + + 13 + value ------------- Distribution ------------- count + < 1 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7 + 2 | 0 + + 15 + value ------------- Distribution ------------- count + < 1 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8 + 2 | 0 + + 17 + value ------------- Distribution ------------- count + < 1 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9 + 2 | 0 + + 19 + value ------------- Distribution ------------- count + < 1 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 2 | 0 + + 21 + value ------------- Distribution ------------- count + < 1 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 11 + 2 | 0 + + 23 + value ------------- Distribution ------------- count + < 1 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 12 + 2 | 0 + + + diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.negvalue.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.negvalue.d new file mode 100644 index 00000000000..c74d019cb18 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.negvalue.d @@ -0,0 +1,38 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +#pragma D option quiet + +tick-1ms +/i++ <= 100/ +{ + @ = llquantize(i, 10, 0, 10, 10, 50 - i); +} + +tick-1ms +/i > 100/ +{ + exit(0); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.negvalue.d.out b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.negvalue.d.out new file mode 100644 index 00000000000..04b0d5e1bde --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.negvalue.d.out @@ -0,0 +1,25 @@ + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 49 + 2 | 48 + 3 | 47 + 4 | 46 + 5 | 45 + 6 | 44 + 7 | 43 + 8 | 42 + 9 | 41 + 10 |@@@ 355 + 20 |@@ 255 + 30 |@ 155 + 40 | 55 + 50 | -45 + 60 @| -145 + 70 @@| -245 + 80 @@@| -345 + 90 @@@| -445 + 100 @| -101 + 200 | 0 + diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.normal.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.normal.d new file mode 100644 index 00000000000..7097ba7d33c --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.normal.d @@ -0,0 +1,40 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +#pragma D option quiet + +tick-1ms +/i++ <= 100/ +{ + @ = llquantize(i, 10, 0, 10, 10); +} + +tick-1ms +/i > 100/ +{ + normalize(@, 10); + printa(@); + exit(0); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.normal.d.out b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.normal.d.out new file mode 100644 index 00000000000..3b1f41b218f --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.normal.d.out @@ -0,0 +1,26 @@ + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 0 + 2 | 0 + 3 | 0 + 4 | 0 + 5 | 0 + 6 | 0 + 7 | 0 + 8 | 0 + 9 | 0 + 10 |@@@@ 1 + 20 |@@@@ 1 + 30 |@@@@ 1 + 40 |@@@@ 1 + 50 |@@@@ 1 + 60 |@@@@ 1 + 70 |@@@@ 1 + 80 |@@@@ 1 + 90 |@@@@ 1 + 100 |@ 0 + 200 | 0 + + diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.range.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.range.d new file mode 100644 index 00000000000..e2882b3f8e3 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.range.d @@ -0,0 +1,38 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +#pragma D option quiet + +BEGIN +{ + @["Screven"] = llquantize(0, 10, 1, 2, 20, 25); + @["Katz"] = llquantize(1, 10, 1, 2, 20, -100); + @["Kurian"] = llquantize(7, 10, 1, 2, 20, 15); + @["Rozwat"] = llquantize(49, 10, 1, 2, 20, 15); + @["Fowler"] = llquantize(343, 10, 1, 2, 20, 150); + + printa(@); + exit(0); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.range.d.out b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.range.d.out new file mode 100644 index 00000000000..c6736c6fc15 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.range.d.out @@ -0,0 +1,29 @@ + + Katz + value ------------- Distribution ------------- count + < 10 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -100 + 10 | 0 + + Kurian + value ------------- Distribution ------------- count + < 10 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 15 + 10 | 0 + + Screven + value ------------- Distribution ------------- count + < 10 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 25 + 10 | 0 + + Rozwat + value ------------- Distribution ------------- count + 40 | 0 + 45 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 15 + 50 | 0 + + Fowler + value ------------- Distribution ------------- count + 250 | 0 + 300 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 150 + 350 | 0 + + diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.steps.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.steps.d new file mode 100644 index 00000000000..f00659e5751 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.steps.d @@ -0,0 +1,52 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +#pragma D option quiet + +tick-1ms +/i++ <= 100/ +{ + @ = llquantize(i, 10, 0, 10, 20); + @hunid = llquantize(i * 10, 10, 0, 10, 100); + @large = llquantize(i * 100, 10, 0, 10, 1000); +} + +tick-1ms +/i > 100/ +{ + exit(0); +} + +END +{ + printf("20 steps:\n"); + printa(@); + + printf("100 steps:\n"); + printa(@hunid); + + printf("1000 steps:\n"); + printa(@large); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.steps.d.out b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.steps.d.out new file mode 100644 index 00000000000..08885515c00 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.steps.d.out @@ -0,0 +1,2033 @@ +20 steps: + + + value ------------- Distribution ------------- count + < 1 | 0 + 1 | 1 + 2 | 1 + 3 | 1 + 4 | 1 + 5 | 1 + 6 | 1 + 7 | 1 + 8 | 1 + 9 | 1 + 10 |@@ 5 + 15 |@@ 5 + 20 |@@ 5 + 25 |@@ 5 + 30 |@@ 5 + 35 |@@ 5 + 40 |@@ 5 + 45 |@@ 5 + 50 |@@ 5 + 55 |@@ 5 + 60 |@@ 5 + 65 |@@ 5 + 70 |@@ 5 + 75 |@@ 5 + 80 |@@ 5 + 85 |@@ 5 + 90 |@@ 5 + 95 |@@ 5 + 100 |@ 2 + 150 | 0 + +100 steps: + + + value ------------- Distribution ------------- count + 9 | 0 + 10 | 1 + 11 | 0 + 12 | 0 + 13 | 0 + 14 | 0 + 15 | 0 + 16 | 0 + 17 | 0 + 18 | 0 + 19 | 0 + 20 | 1 + 21 | 0 + 22 | 0 + 23 | 0 + 24 | 0 + 25 | 0 + 26 | 0 + 27 | 0 + 28 | 0 + 29 | 0 + 30 | 1 + 31 | 0 + 32 | 0 + 33 | 0 + 34 | 0 + 35 | 0 + 36 | 0 + 37 | 0 + 38 | 0 + 39 | 0 + 40 | 1 + 41 | 0 + 42 | 0 + 43 | 0 + 44 | 0 + 45 | 0 + 46 | 0 + 47 | 0 + 48 | 0 + 49 | 0 + 50 | 1 + 51 | 0 + 52 | 0 + 53 | 0 + 54 | 0 + 55 | 0 + 56 | 0 + 57 | 0 + 58 | 0 + 59 | 0 + 60 | 1 + 61 | 0 + 62 | 0 + 63 | 0 + 64 | 0 + 65 | 0 + 66 | 0 + 67 | 0 + 68 | 0 + 69 | 0 + 70 | 1 + 71 | 0 + 72 | 0 + 73 | 0 + 74 | 0 + 75 | 0 + 76 | 0 + 77 | 0 + 78 | 0 + 79 | 0 + 80 | 1 + 81 | 0 + 82 | 0 + 83 | 0 + 84 | 0 + 85 | 0 + 86 | 0 + 87 | 0 + 88 | 0 + 89 | 0 + 90 | 1 + 91 | 0 + 92 | 0 + 93 | 0 + 94 | 0 + 95 | 0 + 96 | 0 + 97 | 0 + 98 | 0 + 99 | 0 + 100 | 1 + 110 | 1 + 120 | 1 + 130 | 1 + 140 | 1 + 150 | 1 + 160 | 1 + 170 | 1 + 180 | 1 + 190 | 1 + 200 | 1 + 210 | 1 + 220 | 1 + 230 | 1 + 240 | 1 + 250 | 1 + 260 | 1 + 270 | 1 + 280 | 1 + 290 | 1 + 300 | 1 + 310 | 1 + 320 | 1 + 330 | 1 + 340 | 1 + 350 | 1 + 360 | 1 + 370 | 1 + 380 | 1 + 390 | 1 + 400 | 1 + 410 | 1 + 420 | 1 + 430 | 1 + 440 | 1 + 450 | 1 + 460 | 1 + 470 | 1 + 480 | 1 + 490 | 1 + 500 | 1 + 510 | 1 + 520 | 1 + 530 | 1 + 540 | 1 + 550 | 1 + 560 | 1 + 570 | 1 + 580 | 1 + 590 | 1 + 600 | 1 + 610 | 1 + 620 | 1 + 630 | 1 + 640 | 1 + 650 | 1 + 660 | 1 + 670 | 1 + 680 | 1 + 690 | 1 + 700 | 1 + 710 | 1 + 720 | 1 + 730 | 1 + 740 | 1 + 750 | 1 + 760 | 1 + 770 | 1 + 780 | 1 + 790 | 1 + 800 | 1 + 810 | 1 + 820 | 1 + 830 | 1 + 840 | 1 + 850 | 1 + 860 | 1 + 870 | 1 + 880 | 1 + 890 | 1 + 900 | 1 + 910 | 1 + 920 | 1 + 930 | 1 + 940 | 1 + 950 | 1 + 960 | 1 + 970 | 1 + 980 | 1 + 990 | 1 + 1000 |@ 2 + 1100 | 0 + +1000 steps: + + + value ------------- Distribution ------------- count + 99 | 0 + 100 | 1 + 101 | 0 + 102 | 0 + 103 | 0 + 104 | 0 + 105 | 0 + 106 | 0 + 107 | 0 + 108 | 0 + 109 | 0 + 110 | 0 + 111 | 0 + 112 | 0 + 113 | 0 + 114 | 0 + 115 | 0 + 116 | 0 + 117 | 0 + 118 | 0 + 119 | 0 + 120 | 0 + 121 | 0 + 122 | 0 + 123 | 0 + 124 | 0 + 125 | 0 + 126 | 0 + 127 | 0 + 128 | 0 + 129 | 0 + 130 | 0 + 131 | 0 + 132 | 0 + 133 | 0 + 134 | 0 + 135 | 0 + 136 | 0 + 137 | 0 + 138 | 0 + 139 | 0 + 140 | 0 + 141 | 0 + 142 | 0 + 143 | 0 + 144 | 0 + 145 | 0 + 146 | 0 + 147 | 0 + 148 | 0 + 149 | 0 + 150 | 0 + 151 | 0 + 152 | 0 + 153 | 0 + 154 | 0 + 155 | 0 + 156 | 0 + 157 | 0 + 158 | 0 + 159 | 0 + 160 | 0 + 161 | 0 + 162 | 0 + 163 | 0 + 164 | 0 + 165 | 0 + 166 | 0 + 167 | 0 + 168 | 0 + 169 | 0 + 170 | 0 + 171 | 0 + 172 | 0 + 173 | 0 + 174 | 0 + 175 | 0 + 176 | 0 + 177 | 0 + 178 | 0 + 179 | 0 + 180 | 0 + 181 | 0 + 182 | 0 + 183 | 0 + 184 | 0 + 185 | 0 + 186 | 0 + 187 | 0 + 188 | 0 + 189 | 0 + 190 | 0 + 191 | 0 + 192 | 0 + 193 | 0 + 194 | 0 + 195 | 0 + 196 | 0 + 197 | 0 + 198 | 0 + 199 | 0 + 200 | 1 + 201 | 0 + 202 | 0 + 203 | 0 + 204 | 0 + 205 | 0 + 206 | 0 + 207 | 0 + 208 | 0 + 209 | 0 + 210 | 0 + 211 | 0 + 212 | 0 + 213 | 0 + 214 | 0 + 215 | 0 + 216 | 0 + 217 | 0 + 218 | 0 + 219 | 0 + 220 | 0 + 221 | 0 + 222 | 0 + 223 | 0 + 224 | 0 + 225 | 0 + 226 | 0 + 227 | 0 + 228 | 0 + 229 | 0 + 230 | 0 + 231 | 0 + 232 | 0 + 233 | 0 + 234 | 0 + 235 | 0 + 236 | 0 + 237 | 0 + 238 | 0 + 239 | 0 + 240 | 0 + 241 | 0 + 242 | 0 + 243 | 0 + 244 | 0 + 245 | 0 + 246 | 0 + 247 | 0 + 248 | 0 + 249 | 0 + 250 | 0 + 251 | 0 + 252 | 0 + 253 | 0 + 254 | 0 + 255 | 0 + 256 | 0 + 257 | 0 + 258 | 0 + 259 | 0 + 260 | 0 + 261 | 0 + 262 | 0 + 263 | 0 + 264 | 0 + 265 | 0 + 266 | 0 + 267 | 0 + 268 | 0 + 269 | 0 + 270 | 0 + 271 | 0 + 272 | 0 + 273 | 0 + 274 | 0 + 275 | 0 + 276 | 0 + 277 | 0 + 278 | 0 + 279 | 0 + 280 | 0 + 281 | 0 + 282 | 0 + 283 | 0 + 284 | 0 + 285 | 0 + 286 | 0 + 287 | 0 + 288 | 0 + 289 | 0 + 290 | 0 + 291 | 0 + 292 | 0 + 293 | 0 + 294 | 0 + 295 | 0 + 296 | 0 + 297 | 0 + 298 | 0 + 299 | 0 + 300 | 1 + 301 | 0 + 302 | 0 + 303 | 0 + 304 | 0 + 305 | 0 + 306 | 0 + 307 | 0 + 308 | 0 + 309 | 0 + 310 | 0 + 311 | 0 + 312 | 0 + 313 | 0 + 314 | 0 + 315 | 0 + 316 | 0 + 317 | 0 + 318 | 0 + 319 | 0 + 320 | 0 + 321 | 0 + 322 | 0 + 323 | 0 + 324 | 0 + 325 | 0 + 326 | 0 + 327 | 0 + 328 | 0 + 329 | 0 + 330 | 0 + 331 | 0 + 332 | 0 + 333 | 0 + 334 | 0 + 335 | 0 + 336 | 0 + 337 | 0 + 338 | 0 + 339 | 0 + 340 | 0 + 341 | 0 + 342 | 0 + 343 | 0 + 344 | 0 + 345 | 0 + 346 | 0 + 347 | 0 + 348 | 0 + 349 | 0 + 350 | 0 + 351 | 0 + 352 | 0 + 353 | 0 + 354 | 0 + 355 | 0 + 356 | 0 + 357 | 0 + 358 | 0 + 359 | 0 + 360 | 0 + 361 | 0 + 362 | 0 + 363 | 0 + 364 | 0 + 365 | 0 + 366 | 0 + 367 | 0 + 368 | 0 + 369 | 0 + 370 | 0 + 371 | 0 + 372 | 0 + 373 | 0 + 374 | 0 + 375 | 0 + 376 | 0 + 377 | 0 + 378 | 0 + 379 | 0 + 380 | 0 + 381 | 0 + 382 | 0 + 383 | 0 + 384 | 0 + 385 | 0 + 386 | 0 + 387 | 0 + 388 | 0 + 389 | 0 + 390 | 0 + 391 | 0 + 392 | 0 + 393 | 0 + 394 | 0 + 395 | 0 + 396 | 0 + 397 | 0 + 398 | 0 + 399 | 0 + 400 | 1 + 401 | 0 + 402 | 0 + 403 | 0 + 404 | 0 + 405 | 0 + 406 | 0 + 407 | 0 + 408 | 0 + 409 | 0 + 410 | 0 + 411 | 0 + 412 | 0 + 413 | 0 + 414 | 0 + 415 | 0 + 416 | 0 + 417 | 0 + 418 | 0 + 419 | 0 + 420 | 0 + 421 | 0 + 422 | 0 + 423 | 0 + 424 | 0 + 425 | 0 + 426 | 0 + 427 | 0 + 428 | 0 + 429 | 0 + 430 | 0 + 431 | 0 + 432 | 0 + 433 | 0 + 434 | 0 + 435 | 0 + 436 | 0 + 437 | 0 + 438 | 0 + 439 | 0 + 440 | 0 + 441 | 0 + 442 | 0 + 443 | 0 + 444 | 0 + 445 | 0 + 446 | 0 + 447 | 0 + 448 | 0 + 449 | 0 + 450 | 0 + 451 | 0 + 452 | 0 + 453 | 0 + 454 | 0 + 455 | 0 + 456 | 0 + 457 | 0 + 458 | 0 + 459 | 0 + 460 | 0 + 461 | 0 + 462 | 0 + 463 | 0 + 464 | 0 + 465 | 0 + 466 | 0 + 467 | 0 + 468 | 0 + 469 | 0 + 470 | 0 + 471 | 0 + 472 | 0 + 473 | 0 + 474 | 0 + 475 | 0 + 476 | 0 + 477 | 0 + 478 | 0 + 479 | 0 + 480 | 0 + 481 | 0 + 482 | 0 + 483 | 0 + 484 | 0 + 485 | 0 + 486 | 0 + 487 | 0 + 488 | 0 + 489 | 0 + 490 | 0 + 491 | 0 + 492 | 0 + 493 | 0 + 494 | 0 + 495 | 0 + 496 | 0 + 497 | 0 + 498 | 0 + 499 | 0 + 500 | 1 + 501 | 0 + 502 | 0 + 503 | 0 + 504 | 0 + 505 | 0 + 506 | 0 + 507 | 0 + 508 | 0 + 509 | 0 + 510 | 0 + 511 | 0 + 512 | 0 + 513 | 0 + 514 | 0 + 515 | 0 + 516 | 0 + 517 | 0 + 518 | 0 + 519 | 0 + 520 | 0 + 521 | 0 + 522 | 0 + 523 | 0 + 524 | 0 + 525 | 0 + 526 | 0 + 527 | 0 + 528 | 0 + 529 | 0 + 530 | 0 + 531 | 0 + 532 | 0 + 533 | 0 + 534 | 0 + 535 | 0 + 536 | 0 + 537 | 0 + 538 | 0 + 539 | 0 + 540 | 0 + 541 | 0 + 542 | 0 + 543 | 0 + 544 | 0 + 545 | 0 + 546 | 0 + 547 | 0 + 548 | 0 + 549 | 0 + 550 | 0 + 551 | 0 + 552 | 0 + 553 | 0 + 554 | 0 + 555 | 0 + 556 | 0 + 557 | 0 + 558 | 0 + 559 | 0 + 560 | 0 + 561 | 0 + 562 | 0 + 563 | 0 + 564 | 0 + 565 | 0 + 566 | 0 + 567 | 0 + 568 | 0 + 569 | 0 + 570 | 0 + 571 | 0 + 572 | 0 + 573 | 0 + 574 | 0 + 575 | 0 + 576 | 0 + 577 | 0 + 578 | 0 + 579 | 0 + 580 | 0 + 581 | 0 + 582 | 0 + 583 | 0 + 584 | 0 + 585 | 0 + 586 | 0 + 587 | 0 + 588 | 0 + 589 | 0 + 590 | 0 + 591 | 0 + 592 | 0 + 593 | 0 + 594 | 0 + 595 | 0 + 596 | 0 + 597 | 0 + 598 | 0 + 599 | 0 + 600 | 1 + 601 | 0 + 602 | 0 + 603 | 0 + 604 | 0 + 605 | 0 + 606 | 0 + 607 | 0 + 608 | 0 + 609 | 0 + 610 | 0 + 611 | 0 + 612 | 0 + 613 | 0 + 614 | 0 + 615 | 0 + 616 | 0 + 617 | 0 + 618 | 0 + 619 | 0 + 620 | 0 + 621 | 0 + 622 | 0 + 623 | 0 + 624 | 0 + 625 | 0 + 626 | 0 + 627 | 0 + 628 | 0 + 629 | 0 + 630 | 0 + 631 | 0 + 632 | 0 + 633 | 0 + 634 | 0 + 635 | 0 + 636 | 0 + 637 | 0 + 638 | 0 + 639 | 0 + 640 | 0 + 641 | 0 + 642 | 0 + 643 | 0 + 644 | 0 + 645 | 0 + 646 | 0 + 647 | 0 + 648 | 0 + 649 | 0 + 650 | 0 + 651 | 0 + 652 | 0 + 653 | 0 + 654 | 0 + 655 | 0 + 656 | 0 + 657 | 0 + 658 | 0 + 659 | 0 + 660 | 0 + 661 | 0 + 662 | 0 + 663 | 0 + 664 | 0 + 665 | 0 + 666 | 0 + 667 | 0 + 668 | 0 + 669 | 0 + 670 | 0 + 671 | 0 + 672 | 0 + 673 | 0 + 674 | 0 + 675 | 0 + 676 | 0 + 677 | 0 + 678 | 0 + 679 | 0 + 680 | 0 + 681 | 0 + 682 | 0 + 683 | 0 + 684 | 0 + 685 | 0 + 686 | 0 + 687 | 0 + 688 | 0 + 689 | 0 + 690 | 0 + 691 | 0 + 692 | 0 + 693 | 0 + 694 | 0 + 695 | 0 + 696 | 0 + 697 | 0 + 698 | 0 + 699 | 0 + 700 | 1 + 701 | 0 + 702 | 0 + 703 | 0 + 704 | 0 + 705 | 0 + 706 | 0 + 707 | 0 + 708 | 0 + 709 | 0 + 710 | 0 + 711 | 0 + 712 | 0 + 713 | 0 + 714 | 0 + 715 | 0 + 716 | 0 + 717 | 0 + 718 | 0 + 719 | 0 + 720 | 0 + 721 | 0 + 722 | 0 + 723 | 0 + 724 | 0 + 725 | 0 + 726 | 0 + 727 | 0 + 728 | 0 + 729 | 0 + 730 | 0 + 731 | 0 + 732 | 0 + 733 | 0 + 734 | 0 + 735 | 0 + 736 | 0 + 737 | 0 + 738 | 0 + 739 | 0 + 740 | 0 + 741 | 0 + 742 | 0 + 743 | 0 + 744 | 0 + 745 | 0 + 746 | 0 + 747 | 0 + 748 | 0 + 749 | 0 + 750 | 0 + 751 | 0 + 752 | 0 + 753 | 0 + 754 | 0 + 755 | 0 + 756 | 0 + 757 | 0 + 758 | 0 + 759 | 0 + 760 | 0 + 761 | 0 + 762 | 0 + 763 | 0 + 764 | 0 + 765 | 0 + 766 | 0 + 767 | 0 + 768 | 0 + 769 | 0 + 770 | 0 + 771 | 0 + 772 | 0 + 773 | 0 + 774 | 0 + 775 | 0 + 776 | 0 + 777 | 0 + 778 | 0 + 779 | 0 + 780 | 0 + 781 | 0 + 782 | 0 + 783 | 0 + 784 | 0 + 785 | 0 + 786 | 0 + 787 | 0 + 788 | 0 + 789 | 0 + 790 | 0 + 791 | 0 + 792 | 0 + 793 | 0 + 794 | 0 + 795 | 0 + 796 | 0 + 797 | 0 + 798 | 0 + 799 | 0 + 800 | 1 + 801 | 0 + 802 | 0 + 803 | 0 + 804 | 0 + 805 | 0 + 806 | 0 + 807 | 0 + 808 | 0 + 809 | 0 + 810 | 0 + 811 | 0 + 812 | 0 + 813 | 0 + 814 | 0 + 815 | 0 + 816 | 0 + 817 | 0 + 818 | 0 + 819 | 0 + 820 | 0 + 821 | 0 + 822 | 0 + 823 | 0 + 824 | 0 + 825 | 0 + 826 | 0 + 827 | 0 + 828 | 0 + 829 | 0 + 830 | 0 + 831 | 0 + 832 | 0 + 833 | 0 + 834 | 0 + 835 | 0 + 836 | 0 + 837 | 0 + 838 | 0 + 839 | 0 + 840 | 0 + 841 | 0 + 842 | 0 + 843 | 0 + 844 | 0 + 845 | 0 + 846 | 0 + 847 | 0 + 848 | 0 + 849 | 0 + 850 | 0 + 851 | 0 + 852 | 0 + 853 | 0 + 854 | 0 + 855 | 0 + 856 | 0 + 857 | 0 + 858 | 0 + 859 | 0 + 860 | 0 + 861 | 0 + 862 | 0 + 863 | 0 + 864 | 0 + 865 | 0 + 866 | 0 + 867 | 0 + 868 | 0 + 869 | 0 + 870 | 0 + 871 | 0 + 872 | 0 + 873 | 0 + 874 | 0 + 875 | 0 + 876 | 0 + 877 | 0 + 878 | 0 + 879 | 0 + 880 | 0 + 881 | 0 + 882 | 0 + 883 | 0 + 884 | 0 + 885 | 0 + 886 | 0 + 887 | 0 + 888 | 0 + 889 | 0 + 890 | 0 + 891 | 0 + 892 | 0 + 893 | 0 + 894 | 0 + 895 | 0 + 896 | 0 + 897 | 0 + 898 | 0 + 899 | 0 + 900 | 1 + 901 | 0 + 902 | 0 + 903 | 0 + 904 | 0 + 905 | 0 + 906 | 0 + 907 | 0 + 908 | 0 + 909 | 0 + 910 | 0 + 911 | 0 + 912 | 0 + 913 | 0 + 914 | 0 + 915 | 0 + 916 | 0 + 917 | 0 + 918 | 0 + 919 | 0 + 920 | 0 + 921 | 0 + 922 | 0 + 923 | 0 + 924 | 0 + 925 | 0 + 926 | 0 + 927 | 0 + 928 | 0 + 929 | 0 + 930 | 0 + 931 | 0 + 932 | 0 + 933 | 0 + 934 | 0 + 935 | 0 + 936 | 0 + 937 | 0 + 938 | 0 + 939 | 0 + 940 | 0 + 941 | 0 + 942 | 0 + 943 | 0 + 944 | 0 + 945 | 0 + 946 | 0 + 947 | 0 + 948 | 0 + 949 | 0 + 950 | 0 + 951 | 0 + 952 | 0 + 953 | 0 + 954 | 0 + 955 | 0 + 956 | 0 + 957 | 0 + 958 | 0 + 959 | 0 + 960 | 0 + 961 | 0 + 962 | 0 + 963 | 0 + 964 | 0 + 965 | 0 + 966 | 0 + 967 | 0 + 968 | 0 + 969 | 0 + 970 | 0 + 971 | 0 + 972 | 0 + 973 | 0 + 974 | 0 + 975 | 0 + 976 | 0 + 977 | 0 + 978 | 0 + 979 | 0 + 980 | 0 + 981 | 0 + 982 | 0 + 983 | 0 + 984 | 0 + 985 | 0 + 986 | 0 + 987 | 0 + 988 | 0 + 989 | 0 + 990 | 0 + 991 | 0 + 992 | 0 + 993 | 0 + 994 | 0 + 995 | 0 + 996 | 0 + 997 | 0 + 998 | 0 + 999 | 0 + 1000 | 1 + 1010 | 0 + 1020 | 0 + 1030 | 0 + 1040 | 0 + 1050 | 0 + 1060 | 0 + 1070 | 0 + 1080 | 0 + 1090 | 0 + 1100 | 1 + 1110 | 0 + 1120 | 0 + 1130 | 0 + 1140 | 0 + 1150 | 0 + 1160 | 0 + 1170 | 0 + 1180 | 0 + 1190 | 0 + 1200 | 1 + 1210 | 0 + 1220 | 0 + 1230 | 0 + 1240 | 0 + 1250 | 0 + 1260 | 0 + 1270 | 0 + 1280 | 0 + 1290 | 0 + 1300 | 1 + 1310 | 0 + 1320 | 0 + 1330 | 0 + 1340 | 0 + 1350 | 0 + 1360 | 0 + 1370 | 0 + 1380 | 0 + 1390 | 0 + 1400 | 1 + 1410 | 0 + 1420 | 0 + 1430 | 0 + 1440 | 0 + 1450 | 0 + 1460 | 0 + 1470 | 0 + 1480 | 0 + 1490 | 0 + 1500 | 1 + 1510 | 0 + 1520 | 0 + 1530 | 0 + 1540 | 0 + 1550 | 0 + 1560 | 0 + 1570 | 0 + 1580 | 0 + 1590 | 0 + 1600 | 1 + 1610 | 0 + 1620 | 0 + 1630 | 0 + 1640 | 0 + 1650 | 0 + 1660 | 0 + 1670 | 0 + 1680 | 0 + 1690 | 0 + 1700 | 1 + 1710 | 0 + 1720 | 0 + 1730 | 0 + 1740 | 0 + 1750 | 0 + 1760 | 0 + 1770 | 0 + 1780 | 0 + 1790 | 0 + 1800 | 1 + 1810 | 0 + 1820 | 0 + 1830 | 0 + 1840 | 0 + 1850 | 0 + 1860 | 0 + 1870 | 0 + 1880 | 0 + 1890 | 0 + 1900 | 1 + 1910 | 0 + 1920 | 0 + 1930 | 0 + 1940 | 0 + 1950 | 0 + 1960 | 0 + 1970 | 0 + 1980 | 0 + 1990 | 0 + 2000 | 1 + 2010 | 0 + 2020 | 0 + 2030 | 0 + 2040 | 0 + 2050 | 0 + 2060 | 0 + 2070 | 0 + 2080 | 0 + 2090 | 0 + 2100 | 1 + 2110 | 0 + 2120 | 0 + 2130 | 0 + 2140 | 0 + 2150 | 0 + 2160 | 0 + 2170 | 0 + 2180 | 0 + 2190 | 0 + 2200 | 1 + 2210 | 0 + 2220 | 0 + 2230 | 0 + 2240 | 0 + 2250 | 0 + 2260 | 0 + 2270 | 0 + 2280 | 0 + 2290 | 0 + 2300 | 1 + 2310 | 0 + 2320 | 0 + 2330 | 0 + 2340 | 0 + 2350 | 0 + 2360 | 0 + 2370 | 0 + 2380 | 0 + 2390 | 0 + 2400 | 1 + 2410 | 0 + 2420 | 0 + 2430 | 0 + 2440 | 0 + 2450 | 0 + 2460 | 0 + 2470 | 0 + 2480 | 0 + 2490 | 0 + 2500 | 1 + 2510 | 0 + 2520 | 0 + 2530 | 0 + 2540 | 0 + 2550 | 0 + 2560 | 0 + 2570 | 0 + 2580 | 0 + 2590 | 0 + 2600 | 1 + 2610 | 0 + 2620 | 0 + 2630 | 0 + 2640 | 0 + 2650 | 0 + 2660 | 0 + 2670 | 0 + 2680 | 0 + 2690 | 0 + 2700 | 1 + 2710 | 0 + 2720 | 0 + 2730 | 0 + 2740 | 0 + 2750 | 0 + 2760 | 0 + 2770 | 0 + 2780 | 0 + 2790 | 0 + 2800 | 1 + 2810 | 0 + 2820 | 0 + 2830 | 0 + 2840 | 0 + 2850 | 0 + 2860 | 0 + 2870 | 0 + 2880 | 0 + 2890 | 0 + 2900 | 1 + 2910 | 0 + 2920 | 0 + 2930 | 0 + 2940 | 0 + 2950 | 0 + 2960 | 0 + 2970 | 0 + 2980 | 0 + 2990 | 0 + 3000 | 1 + 3010 | 0 + 3020 | 0 + 3030 | 0 + 3040 | 0 + 3050 | 0 + 3060 | 0 + 3070 | 0 + 3080 | 0 + 3090 | 0 + 3100 | 1 + 3110 | 0 + 3120 | 0 + 3130 | 0 + 3140 | 0 + 3150 | 0 + 3160 | 0 + 3170 | 0 + 3180 | 0 + 3190 | 0 + 3200 | 1 + 3210 | 0 + 3220 | 0 + 3230 | 0 + 3240 | 0 + 3250 | 0 + 3260 | 0 + 3270 | 0 + 3280 | 0 + 3290 | 0 + 3300 | 1 + 3310 | 0 + 3320 | 0 + 3330 | 0 + 3340 | 0 + 3350 | 0 + 3360 | 0 + 3370 | 0 + 3380 | 0 + 3390 | 0 + 3400 | 1 + 3410 | 0 + 3420 | 0 + 3430 | 0 + 3440 | 0 + 3450 | 0 + 3460 | 0 + 3470 | 0 + 3480 | 0 + 3490 | 0 + 3500 | 1 + 3510 | 0 + 3520 | 0 + 3530 | 0 + 3540 | 0 + 3550 | 0 + 3560 | 0 + 3570 | 0 + 3580 | 0 + 3590 | 0 + 3600 | 1 + 3610 | 0 + 3620 | 0 + 3630 | 0 + 3640 | 0 + 3650 | 0 + 3660 | 0 + 3670 | 0 + 3680 | 0 + 3690 | 0 + 3700 | 1 + 3710 | 0 + 3720 | 0 + 3730 | 0 + 3740 | 0 + 3750 | 0 + 3760 | 0 + 3770 | 0 + 3780 | 0 + 3790 | 0 + 3800 | 1 + 3810 | 0 + 3820 | 0 + 3830 | 0 + 3840 | 0 + 3850 | 0 + 3860 | 0 + 3870 | 0 + 3880 | 0 + 3890 | 0 + 3900 | 1 + 3910 | 0 + 3920 | 0 + 3930 | 0 + 3940 | 0 + 3950 | 0 + 3960 | 0 + 3970 | 0 + 3980 | 0 + 3990 | 0 + 4000 | 1 + 4010 | 0 + 4020 | 0 + 4030 | 0 + 4040 | 0 + 4050 | 0 + 4060 | 0 + 4070 | 0 + 4080 | 0 + 4090 | 0 + 4100 | 1 + 4110 | 0 + 4120 | 0 + 4130 | 0 + 4140 | 0 + 4150 | 0 + 4160 | 0 + 4170 | 0 + 4180 | 0 + 4190 | 0 + 4200 | 1 + 4210 | 0 + 4220 | 0 + 4230 | 0 + 4240 | 0 + 4250 | 0 + 4260 | 0 + 4270 | 0 + 4280 | 0 + 4290 | 0 + 4300 | 1 + 4310 | 0 + 4320 | 0 + 4330 | 0 + 4340 | 0 + 4350 | 0 + 4360 | 0 + 4370 | 0 + 4380 | 0 + 4390 | 0 + 4400 | 1 + 4410 | 0 + 4420 | 0 + 4430 | 0 + 4440 | 0 + 4450 | 0 + 4460 | 0 + 4470 | 0 + 4480 | 0 + 4490 | 0 + 4500 | 1 + 4510 | 0 + 4520 | 0 + 4530 | 0 + 4540 | 0 + 4550 | 0 + 4560 | 0 + 4570 | 0 + 4580 | 0 + 4590 | 0 + 4600 | 1 + 4610 | 0 + 4620 | 0 + 4630 | 0 + 4640 | 0 + 4650 | 0 + 4660 | 0 + 4670 | 0 + 4680 | 0 + 4690 | 0 + 4700 | 1 + 4710 | 0 + 4720 | 0 + 4730 | 0 + 4740 | 0 + 4750 | 0 + 4760 | 0 + 4770 | 0 + 4780 | 0 + 4790 | 0 + 4800 | 1 + 4810 | 0 + 4820 | 0 + 4830 | 0 + 4840 | 0 + 4850 | 0 + 4860 | 0 + 4870 | 0 + 4880 | 0 + 4890 | 0 + 4900 | 1 + 4910 | 0 + 4920 | 0 + 4930 | 0 + 4940 | 0 + 4950 | 0 + 4960 | 0 + 4970 | 0 + 4980 | 0 + 4990 | 0 + 5000 | 1 + 5010 | 0 + 5020 | 0 + 5030 | 0 + 5040 | 0 + 5050 | 0 + 5060 | 0 + 5070 | 0 + 5080 | 0 + 5090 | 0 + 5100 | 1 + 5110 | 0 + 5120 | 0 + 5130 | 0 + 5140 | 0 + 5150 | 0 + 5160 | 0 + 5170 | 0 + 5180 | 0 + 5190 | 0 + 5200 | 1 + 5210 | 0 + 5220 | 0 + 5230 | 0 + 5240 | 0 + 5250 | 0 + 5260 | 0 + 5270 | 0 + 5280 | 0 + 5290 | 0 + 5300 | 1 + 5310 | 0 + 5320 | 0 + 5330 | 0 + 5340 | 0 + 5350 | 0 + 5360 | 0 + 5370 | 0 + 5380 | 0 + 5390 | 0 + 5400 | 1 + 5410 | 0 + 5420 | 0 + 5430 | 0 + 5440 | 0 + 5450 | 0 + 5460 | 0 + 5470 | 0 + 5480 | 0 + 5490 | 0 + 5500 | 1 + 5510 | 0 + 5520 | 0 + 5530 | 0 + 5540 | 0 + 5550 | 0 + 5560 | 0 + 5570 | 0 + 5580 | 0 + 5590 | 0 + 5600 | 1 + 5610 | 0 + 5620 | 0 + 5630 | 0 + 5640 | 0 + 5650 | 0 + 5660 | 0 + 5670 | 0 + 5680 | 0 + 5690 | 0 + 5700 | 1 + 5710 | 0 + 5720 | 0 + 5730 | 0 + 5740 | 0 + 5750 | 0 + 5760 | 0 + 5770 | 0 + 5780 | 0 + 5790 | 0 + 5800 | 1 + 5810 | 0 + 5820 | 0 + 5830 | 0 + 5840 | 0 + 5850 | 0 + 5860 | 0 + 5870 | 0 + 5880 | 0 + 5890 | 0 + 5900 | 1 + 5910 | 0 + 5920 | 0 + 5930 | 0 + 5940 | 0 + 5950 | 0 + 5960 | 0 + 5970 | 0 + 5980 | 0 + 5990 | 0 + 6000 | 1 + 6010 | 0 + 6020 | 0 + 6030 | 0 + 6040 | 0 + 6050 | 0 + 6060 | 0 + 6070 | 0 + 6080 | 0 + 6090 | 0 + 6100 | 1 + 6110 | 0 + 6120 | 0 + 6130 | 0 + 6140 | 0 + 6150 | 0 + 6160 | 0 + 6170 | 0 + 6180 | 0 + 6190 | 0 + 6200 | 1 + 6210 | 0 + 6220 | 0 + 6230 | 0 + 6240 | 0 + 6250 | 0 + 6260 | 0 + 6270 | 0 + 6280 | 0 + 6290 | 0 + 6300 | 1 + 6310 | 0 + 6320 | 0 + 6330 | 0 + 6340 | 0 + 6350 | 0 + 6360 | 0 + 6370 | 0 + 6380 | 0 + 6390 | 0 + 6400 | 1 + 6410 | 0 + 6420 | 0 + 6430 | 0 + 6440 | 0 + 6450 | 0 + 6460 | 0 + 6470 | 0 + 6480 | 0 + 6490 | 0 + 6500 | 1 + 6510 | 0 + 6520 | 0 + 6530 | 0 + 6540 | 0 + 6550 | 0 + 6560 | 0 + 6570 | 0 + 6580 | 0 + 6590 | 0 + 6600 | 1 + 6610 | 0 + 6620 | 0 + 6630 | 0 + 6640 | 0 + 6650 | 0 + 6660 | 0 + 6670 | 0 + 6680 | 0 + 6690 | 0 + 6700 | 1 + 6710 | 0 + 6720 | 0 + 6730 | 0 + 6740 | 0 + 6750 | 0 + 6760 | 0 + 6770 | 0 + 6780 | 0 + 6790 | 0 + 6800 | 1 + 6810 | 0 + 6820 | 0 + 6830 | 0 + 6840 | 0 + 6850 | 0 + 6860 | 0 + 6870 | 0 + 6880 | 0 + 6890 | 0 + 6900 | 1 + 6910 | 0 + 6920 | 0 + 6930 | 0 + 6940 | 0 + 6950 | 0 + 6960 | 0 + 6970 | 0 + 6980 | 0 + 6990 | 0 + 7000 | 1 + 7010 | 0 + 7020 | 0 + 7030 | 0 + 7040 | 0 + 7050 | 0 + 7060 | 0 + 7070 | 0 + 7080 | 0 + 7090 | 0 + 7100 | 1 + 7110 | 0 + 7120 | 0 + 7130 | 0 + 7140 | 0 + 7150 | 0 + 7160 | 0 + 7170 | 0 + 7180 | 0 + 7190 | 0 + 7200 | 1 + 7210 | 0 + 7220 | 0 + 7230 | 0 + 7240 | 0 + 7250 | 0 + 7260 | 0 + 7270 | 0 + 7280 | 0 + 7290 | 0 + 7300 | 1 + 7310 | 0 + 7320 | 0 + 7330 | 0 + 7340 | 0 + 7350 | 0 + 7360 | 0 + 7370 | 0 + 7380 | 0 + 7390 | 0 + 7400 | 1 + 7410 | 0 + 7420 | 0 + 7430 | 0 + 7440 | 0 + 7450 | 0 + 7460 | 0 + 7470 | 0 + 7480 | 0 + 7490 | 0 + 7500 | 1 + 7510 | 0 + 7520 | 0 + 7530 | 0 + 7540 | 0 + 7550 | 0 + 7560 | 0 + 7570 | 0 + 7580 | 0 + 7590 | 0 + 7600 | 1 + 7610 | 0 + 7620 | 0 + 7630 | 0 + 7640 | 0 + 7650 | 0 + 7660 | 0 + 7670 | 0 + 7680 | 0 + 7690 | 0 + 7700 | 1 + 7710 | 0 + 7720 | 0 + 7730 | 0 + 7740 | 0 + 7750 | 0 + 7760 | 0 + 7770 | 0 + 7780 | 0 + 7790 | 0 + 7800 | 1 + 7810 | 0 + 7820 | 0 + 7830 | 0 + 7840 | 0 + 7850 | 0 + 7860 | 0 + 7870 | 0 + 7880 | 0 + 7890 | 0 + 7900 | 1 + 7910 | 0 + 7920 | 0 + 7930 | 0 + 7940 | 0 + 7950 | 0 + 7960 | 0 + 7970 | 0 + 7980 | 0 + 7990 | 0 + 8000 | 1 + 8010 | 0 + 8020 | 0 + 8030 | 0 + 8040 | 0 + 8050 | 0 + 8060 | 0 + 8070 | 0 + 8080 | 0 + 8090 | 0 + 8100 | 1 + 8110 | 0 + 8120 | 0 + 8130 | 0 + 8140 | 0 + 8150 | 0 + 8160 | 0 + 8170 | 0 + 8180 | 0 + 8190 | 0 + 8200 | 1 + 8210 | 0 + 8220 | 0 + 8230 | 0 + 8240 | 0 + 8250 | 0 + 8260 | 0 + 8270 | 0 + 8280 | 0 + 8290 | 0 + 8300 | 1 + 8310 | 0 + 8320 | 0 + 8330 | 0 + 8340 | 0 + 8350 | 0 + 8360 | 0 + 8370 | 0 + 8380 | 0 + 8390 | 0 + 8400 | 1 + 8410 | 0 + 8420 | 0 + 8430 | 0 + 8440 | 0 + 8450 | 0 + 8460 | 0 + 8470 | 0 + 8480 | 0 + 8490 | 0 + 8500 | 1 + 8510 | 0 + 8520 | 0 + 8530 | 0 + 8540 | 0 + 8550 | 0 + 8560 | 0 + 8570 | 0 + 8580 | 0 + 8590 | 0 + 8600 | 1 + 8610 | 0 + 8620 | 0 + 8630 | 0 + 8640 | 0 + 8650 | 0 + 8660 | 0 + 8670 | 0 + 8680 | 0 + 8690 | 0 + 8700 | 1 + 8710 | 0 + 8720 | 0 + 8730 | 0 + 8740 | 0 + 8750 | 0 + 8760 | 0 + 8770 | 0 + 8780 | 0 + 8790 | 0 + 8800 | 1 + 8810 | 0 + 8820 | 0 + 8830 | 0 + 8840 | 0 + 8850 | 0 + 8860 | 0 + 8870 | 0 + 8880 | 0 + 8890 | 0 + 8900 | 1 + 8910 | 0 + 8920 | 0 + 8930 | 0 + 8940 | 0 + 8950 | 0 + 8960 | 0 + 8970 | 0 + 8980 | 0 + 8990 | 0 + 9000 | 1 + 9010 | 0 + 9020 | 0 + 9030 | 0 + 9040 | 0 + 9050 | 0 + 9060 | 0 + 9070 | 0 + 9080 | 0 + 9090 | 0 + 9100 | 1 + 9110 | 0 + 9120 | 0 + 9130 | 0 + 9140 | 0 + 9150 | 0 + 9160 | 0 + 9170 | 0 + 9180 | 0 + 9190 | 0 + 9200 | 1 + 9210 | 0 + 9220 | 0 + 9230 | 0 + 9240 | 0 + 9250 | 0 + 9260 | 0 + 9270 | 0 + 9280 | 0 + 9290 | 0 + 9300 | 1 + 9310 | 0 + 9320 | 0 + 9330 | 0 + 9340 | 0 + 9350 | 0 + 9360 | 0 + 9370 | 0 + 9380 | 0 + 9390 | 0 + 9400 | 1 + 9410 | 0 + 9420 | 0 + 9430 | 0 + 9440 | 0 + 9450 | 0 + 9460 | 0 + 9470 | 0 + 9480 | 0 + 9490 | 0 + 9500 | 1 + 9510 | 0 + 9520 | 0 + 9530 | 0 + 9540 | 0 + 9550 | 0 + 9560 | 0 + 9570 | 0 + 9580 | 0 + 9590 | 0 + 9600 | 1 + 9610 | 0 + 9620 | 0 + 9630 | 0 + 9640 | 0 + 9650 | 0 + 9660 | 0 + 9670 | 0 + 9680 | 0 + 9690 | 0 + 9700 | 1 + 9710 | 0 + 9720 | 0 + 9730 | 0 + 9740 | 0 + 9750 | 0 + 9760 | 0 + 9770 | 0 + 9780 | 0 + 9790 | 0 + 9800 | 1 + 9810 | 0 + 9820 | 0 + 9830 | 0 + 9840 | 0 + 9850 | 0 + 9860 | 0 + 9870 | 0 + 9880 | 0 + 9890 | 0 + 9900 | 1 + 9910 | 0 + 9920 | 0 + 9930 | 0 + 9940 | 0 + 9950 | 0 + 9960 | 0 + 9970 | 0 + 9980 | 0 + 9990 | 0 + 10000 | 1 + 10100 | 1 + 10200 | 0 + + diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.trunc.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.trunc.d new file mode 100644 index 00000000000..e3db03002c4 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.trunc.d @@ -0,0 +1,49 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + +#pragma D option quiet + +int i; + +tick-10ms +/i < 100/ +{ + @[i] = llquantize(i, 10, 1, 2, 10, 150); + @[i] = llquantize(i + 1, 10, 1, 2, 10, 150); + @[i] = llquantize(i + 2, 10, 1, 2, 10, 150); + @[i] = llquantize(i + 3, 10, 1, 2, 10, 150); + i++; +} + +tick-10ms +/i == 100/ +{ + exit(0); +} + +END +{ + trunc(@, 5); +} diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.trunc.d.out b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.trunc.d.out new file mode 100644 index 00000000000..941c62679b0 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/llquantize/tst.trunc.d.out @@ -0,0 +1,34 @@ + + 95 + value ------------- Distribution ------------- count + 80 | 0 + 90 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 600 + 100 | 0 + + 96 + value ------------- Distribution ------------- count + 80 | 0 + 90 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 600 + 100 | 0 + + 97 + value ------------- Distribution ------------- count + 80 | 0 + 90 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 450 + 100 |@@@@@@@@@@ 150 + 200 | 0 + + 98 + value ------------- Distribution ------------- count + 80 | 0 + 90 |@@@@@@@@@@@@@@@@@@@@ 300 + 100 |@@@@@@@@@@@@@@@@@@@@ 300 + 200 | 0 + + 99 + value ------------- Distribution ------------- count + 80 | 0 + 90 |@@@@@@@@@@ 150 + 100 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 450 + 200 | 0 + diff --git a/cddl/contrib/opensolaris/cmd/zdb/zdb.8 b/cddl/contrib/opensolaris/cmd/zdb/zdb.8 index f84bf9acd92..9538012487c 100644 --- a/cddl/contrib/opensolaris/cmd/zdb/zdb.8 +++ b/cddl/contrib/opensolaris/cmd/zdb/zdb.8 @@ -1,61 +1,286 @@ '\" te -.\" Copyright (c) 2011, Martin Matuska . +.\" Copyright (c) 2012, Martin Matuska . .\" All Rights Reserved. .\" -.\" The contents of this file are subject to the terms of the -.\" Common Development and Distribution License (the "License"). -.\" You may not use this file except in compliance with the License. +.\" This file and its contents are supplied under the terms of the +.\" Common Development and Distribution License ("CDDL"), version 1.0. +.\" You may only use this file in accordance with the terms of version +.\" 1.0 of the CDDL. .\" -.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -.\" or http://www.opensolaris.org/os/licensing. -.\" See the License for the specific language governing permissions -.\" and limitations under the License. +.\" A full copy of the text of the CDDL should have accompanied this +.\" source. A copy of the CDDL is also available via the Internet at +.\" http://www.illumos.org/license/CDDL. .\" -.\" When distributing Covered Code, include this CDDL HEADER in each -.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE. -.\" If applicable, add the following below this CDDL HEADER, with the -.\" fields enclosed by brackets "[]" replaced with your own identifying -.\" information: Portions Copyright [yyyy] [name of copyright owner] .\" -.\" Copyright (c) 2004, Sun Microsystems, Inc. All Rights Reserved. +.\" Copyright 2012, Richard Lowe. +.\" Copyright (c) 2012, Marcelo Araujo . +.\" All Rights Reserved. .\" .\" $FreeBSD$ .\" -.Dd November 26, 2011 +.Dd May 10, 2012 .Dt ZDB 8 .Os .Sh NAME .Nm zdb -.Nd ZFS debugger +.Nd Display zpool debugging and consistency information .Sh SYNOPSIS .Nm -.Ar pool +.Op Fl CumdibcsDvhLXFPA +.Op Fl e Op Fl p Ar path... +.Op Fl t Ar txg +.Ar poolname +.Op Ar object ... +.Nm +.Op Fl divPA +.Op Fl e Op Fl p Ar path... +.Ar dataset +.Op Ar object ... +.Nm +.Fl m Op Fl LXFPA +.Op Fl t Ar txg +.Op Fl e Op Fl p Ar path... +.Ar poolname +.Nm +.Fl R Op Fl A +.Op Fl e Op Fl p Ar path... +.Ar poolname +.Ar vdev Ns : Ns Ar offset Ns : Ns Ar size Ns Op Ns : Ns Ar flags +.Nm +.Fl S +.Op Fl AP +.Op Fl e Op Fl p Ar path... +.Ar poolname +.Nm +.Fl l +.Op Fl uA +.Ar device +.Nm +.Fl C +.Op Fl A +.Op Fl U Ar cache .Sh DESCRIPTION The .Nm -command is used by support engineers to diagnose failures and -gather statistics. Since the -.Tn ZFS -file system is always consistent on disk and is self-repairing, -.Nm -should only be run under the direction by a support engineer. +utility displays information about a ZFS pool useful for debugging and +performs some amount of consistency checking. +It is a not a general purpose tool and options (and facilities) may change. +This is neither a +.Xr fsck 8 +nor a +.Xr fsdb 8 +utility. .Pp -If no arguments are specified, -.Nm -performs basic consistency checks on the pool and associated datasets, and -report any problems detected. -.Nm -Any options supported by this command are internal to Sun and subject to change -at any time. -.Sh EXIT STATUS -The following exit values are returned: -.Bl -tag -offset 2n -width 2n -.It 0 -The pool is consistent. -.It 1 -An error was detected. -.It 2 -Invalid command line options were specified. +The output of this command in general reflects the on-disk structure of a ZFS +pool, and is inherently unstable. +The precise output of most invocations is not documented, a knowledge of ZFS +internals is assumed. +.Pp +When operating on an imported and active pool it is possible, though unlikely, +that zdb may interpret inconsistent pool data and behave erratically. +.Sh OPTIONS +Display options: +.Bl -tag -width indent +.It Fl b +Display statistics regarding the number, size (logical, physical and +allocated) and deduplication of blocks. +.It Fl c +Verify the checksum of all metadata blocks while printing block statistics +(see +.Fl b Ns ). +.Pp +If specified multiple times, verify the checksums of all blocks. +.It Fl C +Display information about the configuration. If specified with no other +options, instead display information about the cache file +.Ns ( Pa /etc/zfs/zpool.cache Ns ). +To specify the cache file to display, see +.Fl U +.Pp +If specified multiple times, and a pool name is also specified display both +the cached configuration and the on-disk configuration. +If specified multiple times with +.FL e +also display the configuration that would be used were the pool to be +imported. +.It Fl d +Display information about datasets. Specified once, displays basic dataset +information: ID, create transaction, size, and object count. +.Pp +If specified multiple times provides greater and greater verbosity. +.Pp +If object IDs are specified, display information about those specific objects only. +.It Fl D +Display deduplication statistics, including the deduplication ratio (dedup), +compression ratio (compress), inflation due to the zfs copies property +(copies), and an overall effective ratio (dedup * compress / copies). +.Pp +If specified twice, display a histogram of deduplication statistics, showing +the allocated (physically present on disk) and referenced (logically +referenced in the pool) block counts and sizes by reference count. +.It Fl h +Display pool history similar to +.Cm zpool history , +but include internal changes, transaction, and dataset information. +.It Fl i +Display information about intent log (ZIL) entries relating to each +dataset. +If specified multiple times, display counts of each intent log transaction +type. +.It Fl l Ar device +Display the vdev labels from the specified device. +If the +.Fl u +option is also specified, also display the uberblocks on this device. +.It Fl L +Disable leak tracing and the loading of space maps. +By default, +.Nm +verifies that all non-free blocks are referenced, which can be very expensive. +.It Fl m +Display the offset, spacemap, and free space of each metaslab. +When specified twice, also display information about the maximum contiguous +free space and the percentage of free space in each space map. +When specified three times display every spacemap record. +.It Xo +.Fl R Ar poolname +.Ar vdev Ns : Ns Ar offset Ns : Ns Ar size Ns Op Ns : Ns Ar flags +.Xc +Read and display a block from the specified device. By default the block is +displayed as a hex dump, but see the description of the +.Fl r +flag, below. +.Pp +The block is specified in terms of a colon-separated tuple +.Ar vdev +(an integer vdev identifier) +.Ar offset +(the offset within the vdev) +.Ar size +(the size of the block to read) and, optionally, +.Ar flags +(a set of flags, described below). +.Bl -tag -width indent +.It Sy b offset +Print block pointer +.It Sy d +Decompress the block +.It Sy e +Byte swap the block +.It Sy g +Dump gang block header +.It Sy i +Dump indirect block +.It Sy r +Dump raw uninterpreted block data +.El +.It Fl s +Report statistics on +.Nm Ns 's +I/O. +Display operation counts, bandwidth, and error counts of I/O to the pool from +.Nm . +.It Fl S +Simulate the effects of deduplication, constructing a DDT and then display +that DDT as with \fB-DD\fR. +.It Fl u +Display the current uberblock. +.El +.Pp +Other options: +.Bl -tag -width indent +.It Fl A +Do not abort should any assertion fail. +.It Fl AA +Enable panic recovery, certain errors which would otherwise be fatal are +demoted to warnings. +.It Fl AAA +Do not abort if asserts fail and also enable panic recovery. +.It Fl e Op Fl p Ar path... +Operate on an exported pool, not present in +.Pa /etc/zfs/zpool.cache . +The +.Fl p +flag specifies the path under which devices are to be searched. +.It Fl F +Attempt to make an unreadable pool readable by trying progressively older +transactions. +.It Fl P +Print numbers in an unscaled form more amenable to parsing, eg. 1000000 rather +than 1M. +.It Fl t Ar transaction +Specify the highest transaction to use when searching for uberblocks. +See also the +.Fl u +and +.Fl l +options for a means to see the available uberblocks and their associated +transaction numbers. +.It Fl U Ar cachefile +Use a cache file other than +.Pa /etc/zfs/zpool.cache . +This option is only valid with +.Fl C +.It Fl v +Enable verbosity. +Specify multiple times for increased verbosity. +.It Fl X +Attempt +.Ql extreme +transaction rewind, that is attempt the same recovery as +.Fl F +but read transactions otherwise deemed too old. +.El +.Pp +Specifying a display option more than once enables verbosity for only that +option, with more occurrences enabling more verbosity. +.Pp +If no options are specified, all information about the named pool will be +displayed at default verbosity. +.Sh EXAMPLES +.Bl -tag -width 0n +.It Sy Example 1 Display the configuration of imported pool 'rpool' +.Bd -literal -offset 2n +.Li # Ic zdb -C rpool + +MOS Configuration: + version: 28 + name: 'rpool' + ... +.Ed +.It Sy Example 2 Display basic dataset information about 'rpool' +.Bd -literal -offset 2n +.Li # Ic zdb -d rpool +Dataset mos [META], ID 0, cr_txg 4, 26.9M, 1051 objects +Dataset rpool/swap [ZVOL], ID 59, cr_txg 356, 486M, 2 objects +... +.Ed +.It Xo Sy Example 3 Display basic information about object 0 in +.Sy 'rpool/export/home' +.Xc +.Bd -literal -offset 2n +.Li # Ic zdb -d rpool/export/home 0 +Dataset rpool/export/home [ZPL], ID 137, cr_txg 1546, 32K, 8 objects + + Object lvl iblk dblk dsize lsize %full type + 0 7 16K 16K 15.0K 16K 25.00 DMU dnode +.Ed +.It Xo Sy Example 4 Display the predicted effect of enabling deduplication on +.Sy 'rpool' +.Xc +.Bd -literal -offset 2n +.Li # Ic zdb -S rpool +Simulated DDT histogram: + +bucket allocated referenced +______ ______________________________ ______________________________ +refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE +------ ------ ----- ----- ----- ------ ----- ----- ----- + 1 694K 27.1G 15.0G 15.0G 694K 27.1G 15.0G 15.0G + 2 35.0K 1.33G 699M 699M 74.7K 2.79G 1.45G 1.45G + ... +dedup = 1.11, compress = 1.80, copies = 1.00, dedup * compress / copies = 2.00 +.Ed .El .Sh SEE ALSO .Xr zfs 8 , @@ -64,16 +289,18 @@ Invalid command line options were specified. This manual page is a .Xr mdoc 7 reimplementation of the -.Tn OpenSolaris +.Tn illumos manual page .Em zdb(1M) , modified and customized for .Fx and licensed under the -.Tn Common Development and Distribution License +Common Development and Distribution License .Pq Tn CDDL . .Pp The .Xr mdoc 7 implementation of this manual page was initially written by -.An Martin Matuska Aq mm@FreeBSD.org . +.An Martin Matuska Aq mm@FreeBSD.org +and +.An Marcelo Araujo Aq araujo@FreeBSD.org . diff --git a/cddl/contrib/opensolaris/cmd/zdb/zdb.c b/cddl/contrib/opensolaris/cmd/zdb/zdb.c index bf710009d53..2f8aa0e0497 100644 --- a/cddl/contrib/opensolaris/cmd/zdb/zdb.c +++ b/cddl/contrib/opensolaris/cmd/zdb/zdb.c @@ -18,8 +18,10 @@ * * CDDL HEADER END */ + /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -54,6 +56,7 @@ #include #include #include +#include #undef ZFS_MAXNAMELEN #undef verify #include @@ -63,7 +66,8 @@ #define ZDB_CHECKSUM_NAME(idx) ((idx) < ZIO_CHECKSUM_FUNCTIONS ? \ zio_checksum_table[(idx)].ci_name : "UNKNOWN") #define ZDB_OT_NAME(idx) ((idx) < DMU_OT_NUMTYPES ? \ - dmu_ot[(idx)].ot_name : "UNKNOWN") + dmu_ot[(idx)].ot_name : DMU_OT_IS_VALID(idx) ? \ + dmu_ot_byteswap[DMU_OT_BYTESWAP(idx)].ob_name : "UNKNOWN") #define ZDB_OT_TYPE(idx) ((idx) < DMU_OT_NUMTYPES ? (idx) : DMU_OT_NUMTYPES) #ifndef lint @@ -102,13 +106,16 @@ static void usage(void) { (void) fprintf(stderr, - "Usage: %s [-CumdibcsDvhL] poolname [object...]\n" - " %s [-div] dataset [object...]\n" - " %s -m [-L] poolname [vdev [metaslab...]]\n" - " %s -R poolname vdev:offset:size[:flags]\n" - " %s -S poolname\n" - " %s -l [-u] device\n" - " %s -C\n\n", + "Usage: %s [-CumdibcsDvhLXFPA] [-t txg] [-e [-p path...]]" + "poolname [object...]\n" + " %s [-divPA] [-e -p path...] dataset [object...]\n" + " %s -m [-LXFPA] [-t txg] [-e [-p path...]]" + "poolname [vdev [metaslab...]]\n" + " %s -R [-A] [-e [-p path...]] poolname " + "vdev:offset:size[:flags]\n" + " %s -S [-PA] [-e [-p path...]] poolname\n" + " %s -l [-uA] device\n" + " %s -C [-A] [-U config]\n\n", cmdname, cmdname, cmdname, cmdname, cmdname, cmdname, cmdname); (void) fprintf(stderr, " Dataset name must include at least one " @@ -150,7 +157,7 @@ usage(void) "has altroot/not in a cachefile\n"); (void) fprintf(stderr, " -p -- use one or more with " "-e to specify path to vdev dir\n"); - (void) fprintf(stderr, " -P print numbers parsable\n"); + (void) fprintf(stderr, " -P print numbers in parseable form\n"); (void) fprintf(stderr, " -t -- highest txg to use when " "searching for uberblocks\n"); (void) fprintf(stderr, "Specify an option more than once (e.g. -bb) " @@ -1085,7 +1092,7 @@ dump_dsl_dataset(objset_t *os, uint64_t object, void *data, size_t size) ASSERT(size == sizeof (*ds)); crtime = ds->ds_creation_time; - zdb_nicenum(ds->ds_used_bytes, used); + zdb_nicenum(ds->ds_referenced_bytes, used); zdb_nicenum(ds->ds_compressed_bytes, compressed); zdb_nicenum(ds->ds_uncompressed_bytes, uncompressed); zdb_nicenum(ds->ds_unique_bytes, unique); @@ -1127,6 +1134,44 @@ dump_dsl_dataset(objset_t *os, uint64_t object, void *data, size_t size) (void) printf("\t\tbp = %s\n", blkbuf); } +/* ARGSUSED */ +static int +dump_bptree_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx) +{ + char blkbuf[BP_SPRINTF_LEN]; + + if (bp->blk_birth != 0) { + sprintf_blkptr(blkbuf, bp); + (void) printf("\t%s\n", blkbuf); + } + return (0); +} + +static void +dump_bptree(objset_t *os, uint64_t obj, char *name) +{ + char bytes[32]; + bptree_phys_t *bt; + dmu_buf_t *db; + + if (dump_opt['d'] < 3) + return; + + VERIFY3U(0, ==, dmu_bonus_hold(os, obj, FTAG, &db)); + bt = db->db_data; + zdb_nicenum(bt->bt_bytes, bytes); + (void) printf("\n %s: %llu datasets, %s\n", + name, (unsigned long long)(bt->bt_end - bt->bt_begin), bytes); + dmu_buf_rele(db, FTAG); + + if (dump_opt['d'] < 5) + return; + + (void) printf("\n"); + + (void) bptree_iterate(os, obj, B_FALSE, dump_bptree_cb, NULL, NULL); +} + /* ARGSUSED */ static int dump_bpobj_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx) @@ -1880,11 +1925,13 @@ typedef struct zdb_blkstats { */ #define ZDB_OT_DEFERRED (DMU_OT_NUMTYPES + 0) #define ZDB_OT_DITTO (DMU_OT_NUMTYPES + 1) -#define ZDB_OT_TOTAL (DMU_OT_NUMTYPES + 2) +#define ZDB_OT_OTHER (DMU_OT_NUMTYPES + 2) +#define ZDB_OT_TOTAL (DMU_OT_NUMTYPES + 3) static char *zdb_ot_extname[] = { "deferred free", "dedup ditto", + "other", "Total", }; @@ -1965,9 +2012,10 @@ zdb_blkptr_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, arc_buf_t *pbuf, type = BP_GET_TYPE(bp); - zdb_count_block(zcb, zilog, bp, type); + zdb_count_block(zcb, zilog, bp, + (type & DMU_OT_NEWTYPE) ? ZDB_OT_OTHER : type); - is_metadata = (BP_GET_LEVEL(bp) != 0 || dmu_ot[type].ot_metadata); + is_metadata = (BP_GET_LEVEL(bp) != 0 || DMU_OT_IS_METADATA(type)); if (dump_opt['c'] > 1 || (dump_opt['c'] && is_metadata)) { int ioerr; @@ -2194,6 +2242,12 @@ dump_block_stats(spa_t *spa) (void) bpobj_iterate_nofree(&spa->spa_dsl_pool->dp_free_bpobj, count_block_cb, &zcb, NULL); } + if (spa_feature_is_active(spa, + &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY])) { + VERIFY3U(0, ==, bptree_iterate(spa->spa_meta_objset, + spa->spa_dsl_pool->dp_bptree_obj, B_FALSE, count_block_cb, + &zcb, NULL)); + } if (dump_opt['c'] > 1) flags |= TRAVERSE_PREFETCH_DATA; @@ -2370,7 +2424,7 @@ zdb_ddt_add_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, } if (BP_IS_HOLE(bp) || BP_GET_CHECKSUM(bp) == ZIO_CHECKSUM_OFF || - BP_GET_LEVEL(bp) > 0 || dmu_ot[BP_GET_TYPE(bp)].ot_metadata) + BP_GET_LEVEL(bp) > 0 || DMU_OT_IS_METADATA(BP_GET_TYPE(bp))) return (0); ddt_key_fill(&zdde_search.zdde_key, bp); @@ -2475,7 +2529,14 @@ dump_zpool(spa_t *spa) dump_bpobj(&spa->spa_deferred_bpobj, "Deferred frees"); if (spa_version(spa) >= SPA_VERSION_DEADLISTS) { dump_bpobj(&spa->spa_dsl_pool->dp_free_bpobj, - "Pool frees"); + "Pool snapshot frees"); + } + + if (spa_feature_is_active(spa, + &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY])) { + dump_bptree(spa->spa_meta_objset, + spa->spa_dsl_pool->dp_bptree_obj, + "Pool dataset frees"); } dump_dtl(spa->spa_root_vdev, 0); } diff --git a/cddl/contrib/opensolaris/cmd/zfs/zfs.8 b/cddl/contrib/opensolaris/cmd/zfs/zfs.8 index fdbae4ea06c..c11123a644d 100644 --- a/cddl/contrib/opensolaris/cmd/zfs/zfs.8 +++ b/cddl/contrib/opensolaris/cmd/zfs/zfs.8 @@ -18,8 +18,9 @@ .\" information: Portions Copyright [yyyy] [name of copyright owner] .\" .\" Copyright (c) 2010, Sun Microsystems, Inc. All Rights Reserved. -.\" Copyright (c) 2011 by Delphix. All rights reserved. +.\" Copyright (c) 2012 by Delphix. All rights reserved. .\" Copyright (c) 2012 Nexenta Systems, Inc. All Rights Reserved. +.\" Copyright (c) 2012, Joyent, Inc. All rights reserved. .\" Copyright (c) 2011, Pawel Jakub Dawidek .\" .\" $FreeBSD$ @@ -77,10 +78,12 @@ .Ar clone-filesystem .Nm .Cm rename +.Op Fl f .Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot .Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot .Nm .Cm rename +.Op Fl f .Fl p .Ar filesystem Ns | Ns Ar volume .Ar filesystem Ns | Ns Ar volume @@ -1646,12 +1649,14 @@ subcommand can be used to rename any conflicting snapshots. .It Xo .Nm .Cm rename +.Op Fl f .Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot .Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot .Xc .It Xo .Nm .Cm rename +.Op Fl f .Fl p .Ar filesystem Ns | Ns Ar volume .Ar filesystem Ns | Ns Ar volume @@ -1685,6 +1690,11 @@ property is set to or .Cm none , file system is not unmounted even if this option is not given. +.It Fl f +Force unmount any filesystems that need to be unmounted in the process. +This flag has no effect if used together with the +.Fl u +flag. .El .It Xo .Nm @@ -2271,6 +2281,7 @@ flags to determine what data will be sent. Print machine-parsable verbose information about the stream package generated. .It Fl v Print verbose information about the stream package generated. +This information includes a per-second report of how much data has been sent. .El .Pp The format of the stream is committed. You will be able to receive your streams diff --git a/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c b/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c index c322f085949..2f2b070b9d8 100644 --- a/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c +++ b/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c @@ -22,10 +22,12 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2012 Nexenta Systems, Inc. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright 2012 Milan Jurik. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. * Copyright (c) 2011-2012 Pawel Jakub Dawidek . * All rights reserved. - * Copyright (c) 2011 Martin Matuska . All rights reserved. + * Copyright (c) 2012 Martin Matuska . All rights reserved. */ #include @@ -256,9 +258,10 @@ get_usage(zfs_help_t idx) "snapshot>\n" "\treceive [-vnFu] [-d | -e] \n")); case HELP_RENAME: - return (gettext("\trename " + return (gettext("\trename [-f] " "\n" - "\trename -p \n" + "\trename [-f] -p " + "\n" "\trename -r \n" "\trename -u [-p] ")); case HELP_ROLLBACK: @@ -764,7 +767,6 @@ zfs_do_create(int argc, char **argv) (void) fprintf(stderr, gettext("missing size " "argument\n")); goto badusage; - break; case '?': (void) fprintf(stderr, gettext("invalid option '%c'\n"), optopt); @@ -3091,8 +3093,8 @@ zfs_do_list(int argc, char **argv) } /* - * zfs rename - * zfs rename -p + * zfs rename [-f] + * zfs rename [-f] -p * zfs rename -r * zfs rename -u [-p] * @@ -3112,7 +3114,7 @@ zfs_do_rename(int argc, char **argv) boolean_t parents = B_FALSE; /* check options */ - while ((c = getopt(argc, argv, "pru")) != -1) { + while ((c = getopt(argc, argv, "fpru")) != -1) { switch (c) { case 'p': parents = B_TRUE; @@ -3123,6 +3125,9 @@ zfs_do_rename(int argc, char **argv) case 'u': flags.nounmount = B_TRUE; break; + case 'f': + flags.forceunmount = B_TRUE; + break; case '?': default: (void) fprintf(stderr, gettext("invalid option '%c'\n"), @@ -3163,7 +3168,7 @@ zfs_do_rename(int argc, char **argv) } if (flags.nounmount && parents) { - (void) fprintf(stderr, gettext("-u and -r options are mutually " + (void) fprintf(stderr, gettext("-u and -p options are mutually " "exclusive\n")); usage(B_FALSE); } @@ -3586,6 +3591,7 @@ zfs_do_send(int argc, char **argv) if (flags.verbose) extraverbose = B_TRUE; flags.verbose = B_TRUE; + flags.progress = B_TRUE; break; case 'D': flags.dedup = B_TRUE; diff --git a/cddl/contrib/opensolaris/cmd/zhack/zhack.c b/cddl/contrib/opensolaris/cmd/zhack/zhack.c new file mode 100644 index 00000000000..2618cea32b4 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/zhack/zhack.c @@ -0,0 +1,533 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +/* + * zhack is a debugging tool that can write changes to ZFS pool using libzpool + * for testing purposes. Altering pools with zhack is unsupported and may + * result in corrupted pools. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#undef ZFS_MAXNAMELEN +#undef verify +#include + +extern boolean_t zfeature_checks_disable; + +const char cmdname[] = "zhack"; +libzfs_handle_t *g_zfs; +static importargs_t g_importargs; +static char *g_pool; +static boolean_t g_readonly; + +static void +usage(void) +{ + (void) fprintf(stderr, + "Usage: %s [-c cachefile] [-d dir] ...\n" + "where is one of the following:\n" + "\n", cmdname); + + (void) fprintf(stderr, + " feature stat \n" + " print information about enabled features\n" + " feature enable [-d desc] \n" + " add a new enabled feature to the pool\n" + " -d sets the feature's description\n" + " feature ref [-md] \n" + " change the refcount on the given feature\n" + " -d decrease instead of increase the refcount\n" + " -m add the feature to the label if increasing refcount\n" + "\n" + " : should be a feature guid\n"); + exit(1); +} + + +static void +fatal(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + (void) fprintf(stderr, "%s: ", cmdname); + (void) vfprintf(stderr, fmt, ap); + va_end(ap); + (void) fprintf(stderr, "\n"); + + exit(1); +} + +/* ARGSUSED */ +static int +space_delta_cb(dmu_object_type_t bonustype, void *data, + uint64_t *userp, uint64_t *groupp) +{ + /* + * Is it a valid type of object to track? + */ + if (bonustype != DMU_OT_ZNODE && bonustype != DMU_OT_SA) + return (ENOENT); + (void) fprintf(stderr, "modifying object that needs user accounting"); + abort(); + /* NOTREACHED */ +} + +/* + * Target is the dataset whose pool we want to open. + */ +static void +import_pool(const char *target, boolean_t readonly) +{ + nvlist_t *config; + nvlist_t *pools; + int error; + char *sepp; + spa_t *spa; + nvpair_t *elem; + nvlist_t *props; + const char *name; + + kernel_init(readonly ? FREAD : (FREAD | FWRITE)); + g_zfs = libzfs_init(); + ASSERT(g_zfs != NULL); + + dmu_objset_register_type(DMU_OST_ZFS, space_delta_cb); + + g_readonly = readonly; + + /* + * If we only want readonly access, it's OK if we find + * a potentially-active (ie, imported into the kernel) pool from the + * default cachefile. + */ + if (readonly && spa_open(target, &spa, FTAG) == 0) { + spa_close(spa, FTAG); + return; + } + + g_importargs.unique = B_TRUE; + g_importargs.can_be_active = readonly; + g_pool = strdup(target); + if ((sepp = strpbrk(g_pool, "/@")) != NULL) + *sepp = '\0'; + g_importargs.poolname = g_pool; + pools = zpool_search_import(g_zfs, &g_importargs); + + if (pools == NULL || nvlist_next_nvpair(pools, NULL) == NULL) { + if (!g_importargs.can_be_active) { + g_importargs.can_be_active = B_TRUE; + if (zpool_search_import(g_zfs, &g_importargs) != NULL || + spa_open(target, &spa, FTAG) == 0) { + fatal("cannot import '%s': pool is active; run " + "\"zpool export %s\" first\n", + g_pool, g_pool); + } + } + + fatal("cannot import '%s': no such pool available\n", g_pool); + } + + elem = nvlist_next_nvpair(pools, NULL); + name = nvpair_name(elem); + verify(nvpair_value_nvlist(elem, &config) == 0); + + props = NULL; + if (readonly) { + verify(nvlist_alloc(&props, NV_UNIQUE_NAME, 0) == 0); + verify(nvlist_add_uint64(props, + zpool_prop_to_name(ZPOOL_PROP_READONLY), 1) == 0); + } + + zfeature_checks_disable = B_TRUE; + error = spa_import(name, config, props, ZFS_IMPORT_NORMAL); + zfeature_checks_disable = B_FALSE; + if (error == EEXIST) + error = 0; + + if (error) + fatal("can't import '%s': %s", name, strerror(error)); +} + +static void +zhack_spa_open(const char *target, boolean_t readonly, void *tag, spa_t **spa) +{ + int err; + + import_pool(target, readonly); + + zfeature_checks_disable = B_TRUE; + err = spa_open(target, spa, tag); + zfeature_checks_disable = B_FALSE; + + if (err != 0) + fatal("cannot open '%s': %s", target, strerror(err)); + if (spa_version(*spa) < SPA_VERSION_FEATURES) { + fatal("'%s' has version %d, features not enabled", target, + (int)spa_version(*spa)); + } +} + +static void +dump_obj(objset_t *os, uint64_t obj, const char *name) +{ + zap_cursor_t zc; + zap_attribute_t za; + + (void) printf("%s_obj:\n", name); + + for (zap_cursor_init(&zc, os, obj); + zap_cursor_retrieve(&zc, &za) == 0; + zap_cursor_advance(&zc)) { + if (za.za_integer_length == 8) { + ASSERT(za.za_num_integers == 1); + (void) printf("\t%s = %llu\n", + za.za_name, (u_longlong_t)za.za_first_integer); + } else { + ASSERT(za.za_integer_length == 1); + char val[1024]; + VERIFY(zap_lookup(os, obj, za.za_name, + 1, sizeof (val), val) == 0); + (void) printf("\t%s = %s\n", za.za_name, val); + } + } + zap_cursor_fini(&zc); +} + +static void +dump_mos(spa_t *spa) +{ + nvlist_t *nv = spa->spa_label_features; + + (void) printf("label config:\n"); + for (nvpair_t *pair = nvlist_next_nvpair(nv, NULL); + pair != NULL; + pair = nvlist_next_nvpair(nv, pair)) { + (void) printf("\t%s\n", nvpair_name(pair)); + } +} + +static void +zhack_do_feature_stat(int argc, char **argv) +{ + spa_t *spa; + objset_t *os; + char *target; + + argc--; + argv++; + + if (argc < 1) { + (void) fprintf(stderr, "error: missing pool name\n"); + usage(); + } + target = argv[0]; + + zhack_spa_open(target, B_TRUE, FTAG, &spa); + os = spa->spa_meta_objset; + + dump_obj(os, spa->spa_feat_for_read_obj, "for_read"); + dump_obj(os, spa->spa_feat_for_write_obj, "for_write"); + dump_obj(os, spa->spa_feat_desc_obj, "descriptions"); + dump_mos(spa); + + spa_close(spa, FTAG); +} + +static void +feature_enable_sync(void *arg1, void *arg2, dmu_tx_t *tx) +{ + spa_t *spa = arg1; + zfeature_info_t *feature = arg2; + + spa_feature_enable(spa, feature, tx); +} + +static void +zhack_do_feature_enable(int argc, char **argv) +{ + char c; + char *desc, *target; + spa_t *spa; + objset_t *mos; + zfeature_info_t feature; + zfeature_info_t *nodeps[] = { NULL }; + + /* + * Features are not added to the pool's label until their refcounts + * are incremented, so fi_mos can just be left as false for now. + */ + desc = NULL; + feature.fi_uname = "zhack"; + feature.fi_mos = B_FALSE; + feature.fi_can_readonly = B_FALSE; + feature.fi_depends = nodeps; + + optind = 1; + while ((c = getopt(argc, argv, "rmd:")) != -1) { + switch (c) { + case 'r': + feature.fi_can_readonly = B_TRUE; + break; + case 'd': + desc = strdup(optarg); + break; + default: + usage(); + break; + } + } + + if (desc == NULL) + desc = strdup("zhack injected"); + feature.fi_desc = desc; + + argc -= optind; + argv += optind; + + if (argc < 2) { + (void) fprintf(stderr, "error: missing feature or pool name\n"); + usage(); + } + target = argv[0]; + feature.fi_guid = argv[1]; + + if (!zfeature_is_valid_guid(feature.fi_guid)) + fatal("invalid feature guid: %s", feature.fi_guid); + + zhack_spa_open(target, B_FALSE, FTAG, &spa); + mos = spa->spa_meta_objset; + + if (0 == zfeature_lookup_guid(feature.fi_guid, NULL)) + fatal("'%s' is a real feature, will not enable"); + if (0 == zap_contains(mos, spa->spa_feat_desc_obj, feature.fi_guid)) + fatal("feature already enabled: %s", feature.fi_guid); + + VERIFY3U(0, ==, dsl_sync_task_do(spa->spa_dsl_pool, NULL, + feature_enable_sync, spa, &feature, 5)); + + spa_close(spa, FTAG); + + free(desc); +} + +static void +feature_incr_sync(void *arg1, void *arg2, dmu_tx_t *tx) +{ + spa_t *spa = arg1; + zfeature_info_t *feature = arg2; + + spa_feature_incr(spa, feature, tx); +} + +static void +feature_decr_sync(void *arg1, void *arg2, dmu_tx_t *tx) +{ + spa_t *spa = arg1; + zfeature_info_t *feature = arg2; + + spa_feature_decr(spa, feature, tx); +} + +static void +zhack_do_feature_ref(int argc, char **argv) +{ + char c; + char *target; + boolean_t decr = B_FALSE; + spa_t *spa; + objset_t *mos; + zfeature_info_t feature; + zfeature_info_t *nodeps[] = { NULL }; + + /* + * fi_desc does not matter here because it was written to disk + * when the feature was enabled, but we need to properly set the + * feature for read or write based on the information we read off + * disk later. + */ + feature.fi_uname = "zhack"; + feature.fi_mos = B_FALSE; + feature.fi_desc = NULL; + feature.fi_depends = nodeps; + + optind = 1; + while ((c = getopt(argc, argv, "md")) != -1) { + switch (c) { + case 'm': + feature.fi_mos = B_TRUE; + break; + case 'd': + decr = B_TRUE; + break; + default: + usage(); + break; + } + } + argc -= optind; + argv += optind; + + if (argc < 2) { + (void) fprintf(stderr, "error: missing feature or pool name\n"); + usage(); + } + target = argv[0]; + feature.fi_guid = argv[1]; + + if (!zfeature_is_valid_guid(feature.fi_guid)) + fatal("invalid feature guid: %s", feature.fi_guid); + + zhack_spa_open(target, B_FALSE, FTAG, &spa); + mos = spa->spa_meta_objset; + + if (0 == zfeature_lookup_guid(feature.fi_guid, NULL)) + fatal("'%s' is a real feature, will not change refcount"); + + if (0 == zap_contains(mos, spa->spa_feat_for_read_obj, + feature.fi_guid)) { + feature.fi_can_readonly = B_FALSE; + } else if (0 == zap_contains(mos, spa->spa_feat_for_write_obj, + feature.fi_guid)) { + feature.fi_can_readonly = B_TRUE; + } else { + fatal("feature is not enabled: %s", feature.fi_guid); + } + + if (decr && !spa_feature_is_active(spa, &feature)) + fatal("feature refcount already 0: %s", feature.fi_guid); + + VERIFY3U(0, ==, dsl_sync_task_do(spa->spa_dsl_pool, NULL, + decr ? feature_decr_sync : feature_incr_sync, spa, &feature, 5)); + + spa_close(spa, FTAG); +} + +static int +zhack_do_feature(int argc, char **argv) +{ + char *subcommand; + + argc--; + argv++; + if (argc == 0) { + (void) fprintf(stderr, + "error: no feature operation specified\n"); + usage(); + } + + subcommand = argv[0]; + if (strcmp(subcommand, "stat") == 0) { + zhack_do_feature_stat(argc, argv); + } else if (strcmp(subcommand, "enable") == 0) { + zhack_do_feature_enable(argc, argv); + } else if (strcmp(subcommand, "ref") == 0) { + zhack_do_feature_ref(argc, argv); + } else { + (void) fprintf(stderr, "error: unknown subcommand: %s\n", + subcommand); + usage(); + } + + return (0); +} + +#define MAX_NUM_PATHS 1024 + +int +main(int argc, char **argv) +{ + extern void zfs_prop_init(void); + + char *path[MAX_NUM_PATHS]; + const char *subcommand; + int rv = 0; + char c; + + g_importargs.path = path; + + dprintf_setup(&argc, argv); + zfs_prop_init(); + + while ((c = getopt(argc, argv, "c:d:")) != -1) { + switch (c) { + case 'c': + g_importargs.cachefile = optarg; + break; + case 'd': + assert(g_importargs.paths < MAX_NUM_PATHS); + g_importargs.path[g_importargs.paths++] = optarg; + break; + default: + usage(); + break; + } + } + + argc -= optind; + argv += optind; + optind = 1; + + if (argc == 0) { + (void) fprintf(stderr, "error: no command specified\n"); + usage(); + } + + subcommand = argv[0]; + + if (strcmp(subcommand, "feature") == 0) { + rv = zhack_do_feature(argc, argv); + } else { + (void) fprintf(stderr, "error: unknown subcommand: %s\n", + subcommand); + usage(); + } + + if (!g_readonly && spa_export(g_pool, NULL, B_TRUE, B_TRUE) != 0) { + fatal("pool export failed; " + "changes may not be committed to disk\n"); + } + + libzfs_fini(g_zfs); + kernel_fini(); + + return (rv); +} diff --git a/cddl/contrib/opensolaris/cmd/zpool/zpool-features.5 b/cddl/contrib/opensolaris/cmd/zpool/zpool-features.5 new file mode 100644 index 00000000000..d590fdc9fe4 --- /dev/null +++ b/cddl/contrib/opensolaris/cmd/zpool/zpool-features.5 @@ -0,0 +1,174 @@ +'\" te +.\" Copyright (c) 2012, Martin Matuska . +.\" All Rights Reserved. +.\" +.\" The contents of this file are subject to the terms of the +.\" Common Development and Distribution License (the "License"). +.\" You may not use this file except in compliance with the License. +.\" +.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +.\" or http://www.opensolaris.org/os/licensing. +.\" See the License for the specific language governing permissions +.\" and limitations under the License. +.\" +.\" When distributing Covered Code, include this CDDL HEADER in each +.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE. +.\" If applicable, add the following below this CDDL HEADER, with the +.\" fields enclosed by brackets "[]" replaced with your own identifying +.\" information: Portions Copyright [yyyy] [name of copyright owner] +.\" +.\" Copyright (c) 2012 by Delphix. All rights reserved. +.\" +.\" $FreeBSD$ +.\" +.Dd May 28, 2012 +.Dt ZPOOL-FEATURES 8 +.Os +.Sh NAME +.Nm zpool-features +.Nd ZFS pool feature descriptions +.Sh DESCRIPTION +ZFS pool on\-disk format versions are specified via "features" which replace +the old on\-disk format numbers (the last supported on\-disk format number is +28). +To enable a feature on a pool use the +.Xr zpool 8 +command to set the +.Sy feature@feature_name +property to +.Ar enabled . +.Pp +The pool format does not affect file system version compatibility or the ability +to send file systems between pools. +.Pp +Since most features can be enabled independently of each other the on\-disk +format of the pool is specified by the set of all features marked as +.Sy active +on the pool. If the pool was created by another software version this set may +include unsupported features. +.Ss Identifying features +Every feature has a guid of the form +.Sy com.example:feature_name . +The reverse DNS name ensures that the feature's guid is unique across all ZFS +implementations. When unsupported features are encountered on a pool they will +be identified by their guids. +Refer to the documentation for the ZFS implementation that created the pool +for information about those features. +.Pp +Each supported feature also has a short name. +By convention a feature's short name is the portion of its guid which follows +the ':' (e.g. +.Sy com.example:feature_name +would have the short name +.Sy feature_name ), +however a feature's short name may differ across ZFS implementations if +following the convention would result in name conflicts. +.Ss Feature states +Features can be in one of three states: +.Bl -tag +.It Sy active +This feature's on\-disk format changes are in effect on the pool. +Support for this feature is required to import the pool in read\-write mode. +If this feature is not read-only compatible, support is also required to +import the pool in read\-only mode (see "Read\-only compatibility"). +.It Sy enabled +An administrator has marked this feature as enabled on the pool, but the +feature's on\-disk format changes have not been made yet. +The pool can still be imported by software that does not support this feature, +but changes may be made to the on\-disk format at any time which will move +the feature to the +.Sy active +state. +Some features may support returning to the +.Sy enabled +state after becoming +.Sy active . +See feature\-specific documentation for details. +.It Sy disabled +This feature's on\-disk format changes have not been made and will not be made +unless an administrator moves the feature to the +.Sy enabled +state. +Features cannot be disabled once they have been enabled. +.El +The state of supported features is exposed through pool properties of the form +.Sy feature@short_name . +.Ss Read\-only compatibility +Some features may make on\-disk format changes that do not interfere with other +software's ability to read from the pool. +These features are referred to as "read\-only compatible". +If all unsupported features on a pool are read\-only compatible, the pool can +be imported in read\-only mode by setting the +.Sy readonly +property during import (see +.Xr zpool 8 +for details on importing pools). +.Ss Unsupported features +For each unsupported feature enabled on an imported pool a pool property +named +.Sy unsupported@feature_guid +will indicate why the import was allowed despite the unsupported feature. +Possible values for this property are: +.Bl -tag +.It Sy inactive +The feature is in the +.Sy enabled +state and therefore the pool's on\-disk format is still compatible with +software that does not support this feature. +.It Sy readonly +The feature is read\-only compatible and the pool has been imported in +read\-only mode. +.El +.Ss Feature dependencies +Some features depend on other features being enabled in order to function +properly. +Enabling a feature will automatically enable any features it depends on. +.Sh FEATURES +The following features are supported on this system: +.Bl -tag +.It Sy async_destroy +.Bl -column "READ\-ONLY COMPATIBLE" "com.delphix:async_destroy" +.It GUID Ta com.delphix:async_destroy +.It READ\-ONLY COMPATIBLE Ta yes +.It DEPENDENCIES Ta none +.El +.Pp +Destroying a file system requires traversing all of its data in order to +return its used space to the pool. +Without +.Sy async_destroy +the file system is not fully removed until all space has been reclaimed. +If the destroy operation is interrupted by a reboot or power outage the next +attempt to open the pool will need to complete the destroy operation +synchronously. +.Pp +When +.Sy async_destroy +is enabled the file system's data will be reclaimed by a background process, +allowing the destroy operation to complete without traversing the entire file +system. +The background process is able to resume interrupted destroys after the pool +has been opened, eliminating the need to finish interrupted destroys as part +of the open operation. +The amount of space remaining to be reclaimed by the background process is +available through the +.Sy freeing +property. +.Sh SEE ALSO +.Xr zpool 8 +.Sh AUTHORS +This manual page is a +.Xr mdoc 7 +reimplementation of the +.Tn illumos +manual page +.Em zpool-features(5) , +modified and customized for +.Fx +and licensed under the Common Development and Distribution License +.Pq Tn CDDL . +.Pp +The +.Xr mdoc 7 +implementation of this manual page was initially written by +.An Martin Matuska Aq mm@FreeBSD.org . diff --git a/cddl/contrib/opensolaris/cmd/zpool/zpool.8 b/cddl/contrib/opensolaris/cmd/zpool/zpool.8 index ef3900eb9f1..ac51a4cd2dd 100644 --- a/cddl/contrib/opensolaris/cmd/zpool/zpool.8 +++ b/cddl/contrib/opensolaris/cmd/zpool/zpool.8 @@ -1,5 +1,5 @@ '\" te -.\" Copyright (c) 2011, Martin Matuska . +.\" Copyright (c) 2012, Martin Matuska . .\" All Rights Reserved. .\" .\" The contents of this file are subject to the terms of the @@ -20,6 +20,7 @@ .\" Copyright (c) 2010, Sun Microsystems, Inc. All Rights Reserved. .\" Copyright 2011, Nexenta Systems, Inc. All Rights Reserved. .\" Copyright (c) 2011, Justin T. Gibbs +.\" Copyright (c) 2012 by Delphix. All Rights Reserved. .\" .\" $FreeBSD$ .\" @@ -47,7 +48,7 @@ .Op Ar device .Nm .Cm create -.Op Fl fn +.Op Fl fnd .Op Fl o Ar property Ns = Ns Ar value .Ar ... .Op Fl O Ar file-system-property Ns = Ns Ar value @@ -189,7 +190,7 @@ for information on managing datasets. A .Qq virtual device .Pq No vdev -describes a single device or a collection of devices organized according to +describes a single device or a collection of devices organized according to certain performance and fault characteristics. The following virtual devices are supported: .Bl -tag @@ -237,7 +238,7 @@ A group can have single-, double- , or triple parity, meaning that the .No raidz group can sustain one, two, or three failures, respectively, without -losing any data. The +losing any data. The .Sy raidz1 No vdev type specifies a single-parity .No raidz @@ -287,7 +288,7 @@ writes are load-balanced between devices. Log devices can be mirrored. However, .No raidz .No vdev types are not supported for the intent log. For more information, -see the +see the .Qq Sx Intent Log section. .It Sy cache @@ -309,13 +310,13 @@ A pool can have any number of virtual devices at the top of the configuration (known as .Qq root .No vdev Ns s). -Data is dynamically distributed across all top-level devices to balance data +Data is dynamically distributed across all top-level devices to balance data among devices. As new virtual devices are added, .Tn ZFS automatically places data on the newly available devices. .Pp Virtual devices are specified one at a time on the command line, separated by -whitespace. The keywords +whitespace. The keywords .Qq mirror and .Qq raidz @@ -428,7 +429,7 @@ allows devices to be associated with pools as .Qq hot spares . These devices are not actively used in the pool, but when an active device fails, it is automatically replaced by a hot spare. To create a pool with hot -spares, specify a +spares, specify a .Qq spare .No vdev with any number of devices. For example, @@ -458,7 +459,7 @@ pools. .Pp Spares cannot replace log devices. .Ss Intent Log -The +The .Tn ZFS Intent Log .Pq Tn ZIL @@ -537,6 +538,18 @@ value of 1.76 indicates that 1.76 units of data were stored but only 1 unit of d for a description of the deduplication feature. .It Sy free Number of blocks within the pool that are not allocated. +.It Sy freeing +After a file system or snapshot is destroyed, the space it was using is +returned to the pool asynchronously. +.Sy freeing +is the amount of space remaining to be reclaimed. +Over time +.Sy freeing +will decrease while +.Sy free +increases. +.It Sy expandsize +This property has currently no value on FreeBSD. .It Sy guid A unique identifier for the pool. .It Sy health @@ -550,11 +563,16 @@ or .Qq Sy UNAVAIL . .It Sy size Total size of the storage pool. +.It Sy unsupported@ Ns Ar feature_guid +Information about unsupported features that are enabled on the pool. +See +.Xr zpool-features 5 +for details. .It Sy used Amount of storage space used within the pool. .El .Pp -These space usage properties report actual physical space available to the +The space usage properties report actual physical space available to the storage pool. The physical space can be different from the total amount of space that any contained datasets can actually use. The amount of space used in a @@ -580,7 +598,7 @@ the typical paths are not valid. .Sy altroot is not a persistent property. It is valid only while the system is up. Setting -.Sy altroot +.Sy altroot defaults to using .Cm cachefile=none , though this may be overridden using an explicit setting. @@ -625,9 +643,9 @@ This property can also be referred to by its shortened column name, .It Sy autoreplace Ns = Ns Cm on No | Cm off Controls automatic device replacement. If set to .Qq Cm off , -device replacement must be initiated by the administrator by using the +device replacement must be initiated by the administrator by using the .Qq Nm Cm replace -command. If set to +command. If set to .Qq Cm on , any new device, found in the same physical location as a device that previously belonged to the pool, is @@ -648,13 +666,18 @@ pool configuration in a different location that can later be imported with .Qq Nm Cm import Fl c . Setting it to the special value .Qq Cm none -creates a temporary pool that is never cached, and the special value +creates a temporary pool that is never cached, and the special value .Cm '' (empty string) uses the default location. +.It Sy comment Ns = Ns Ar text +A text string consisting of printable ASCII characters that will be stored +such that it is available even if the pool becomes faulted. +An administrator can provide additional information about a pool using this +property. .It Sy dedupditto Ns = Ns Ar number Threshold for the number of block ditto copies. If the reference count for a deduplicated block increases above this number, a new ditto copy of this block -is automatically stored. Deafult setting is +is automatically stored. Default setting is .Cm 0 . .It Sy delegation Ns = Ns Cm on No | Cm off Controls whether a non-privileged user is granted access based on the dataset @@ -684,6 +707,17 @@ requests that have yet to be committed to disk would be blocked. .It Sy panic Prints out a message to the console and generates a system crash dump. .El +.It Sy feature@ Ns Ar feature_name Ns = Ns Sy enabled +The value of this property is the current state of +.Ar feature_name . +The only valid value when setting this property is +.Sy enabled +which moves +.Ar feature_name +to the enabled state. +See +.Xr zpool-features 5 +for details on feature states. .It Sy listsnaps Ns = Ns Cm on No | Cm off Controls whether information about snapshots associated with this pool is output when @@ -697,9 +731,9 @@ The current on-disk version of the pool. This can be increased, but never decreased. The preferred method of updating pools is with the .Qq Nm Cm upgrade command, though this property can be used when a specific version is needed -for backwards compatibility. This property can be any number between 1 and the -current version reported by -.Qo Ic zpool upgrade -v Qc . +for backwards compatibility. +Once feature flags is enabled on a pool this property will no longer have a +value. .El .Sh SUBCOMMANDS All subcommands that modify state are logged persistently to the pool in their @@ -808,7 +842,7 @@ do not actually discard any transactions. .It Xo .Nm .Cm create -.Op Fl fn +.Op Fl fnd .Op Fl o Ar property Ns = Ns Ar value .Ar ... .Op Fl O Ar file-system-property Ns = Ns Ar value @@ -857,9 +891,13 @@ The mount point must not exist or must be empty, or else the root dataset cannot be mounted. This can be overridden with the .Fl m option. +.Pp +By default all supported features are enabled on the new pool unless the +.Fl d +option is specified. .Bl -tag -width indent .It Fl f -Forces use of +Forces use of .Ar vdev Ns s, even if they appear in use or specify a conflicting replication level. Not all devices can be overridden in this manner. @@ -867,6 +905,17 @@ Not all devices can be overridden in this manner. Displays the configuration that would be used without actually creating the pool. The actual pool creation can still fail due to insufficient privileges or device sharing. +.It Fl d +Do not enable any features on the new pool. +Individual features can be enabled by setting their corresponding properties +to +.Sy enabled +with the +.Fl o +option. +See +.Xr zpool-features 5 +for details about feature properties. .It Xo .Fl o Ar property Ns = Ns Ar value .Op Fl o Ar property Ns = Ns Ar value @@ -895,7 +944,7 @@ or .Qq Cm altroot Ns Pa /pool if .Sy altroot -is specified. The mount point must be an absolute path, +is specified. The mount point must be an absolute path, .Qq Cm legacy , or .Qq Cm none . @@ -1232,7 +1281,7 @@ seconds until .Sy Ctrl-C is pressed. If no .Ar pools -are specified, statistics for every pool in the system is shown. If +are specified, statistics for every pool in the system is shown. If .Ar count is specified, the command exits after .Ar count @@ -1275,7 +1324,7 @@ Treat exported or foreign devices as inactive. .It Xo .Nm .Cm list -.Op Fl H +.Op Fl Hv .Op Fl o Ar property Ns Op , Ns Ar ... .Op Fl T Cm d Ns | Ns Cm u .Op Ar pool @@ -1290,7 +1339,7 @@ When given an interval, the output is printed every .Ar interval seconds until .Sy Ctrl-C -is pressed. If +is pressed. If .Ar count is specified, the command exits after .Ar count @@ -1299,6 +1348,8 @@ reports are printed. .It Fl H Scripted mode. Do not display headers, and separate fields by a single tab instead of arbitrary space. +.It Fl v +Show more detailed information. .It Fl o Ar property Ns Op , Ns Ar ... Comma-separated list of properties to display. See the .Qq Sx Properties @@ -1394,7 +1445,7 @@ This is equivalent to attaching waiting for it to resilver, and then detaching .Ar old_device . .Pp -The size of +The size of .Ar new_device must be greater than or equal to the minimum size of all the devices in a mirror or @@ -1405,7 +1456,7 @@ configuration. is required if the pool is not redundant. If .Ar new_device is not specified, it defaults to -.Ar old_device . +.Ar old_device . This form of replacement is useful after an existing disk has failed and has been physically replaced. In this case, the new disk may have the same .Pa /dev @@ -1492,12 +1543,12 @@ unless overridden by a device specification on the command line. .Pp When using a .Ar device -argument, +argument, .Cm split -includes the specified device(s) in a new pool and, should any devices remain +includes the specified device(s) in a new pool and, should any devices remain unspecified, assigns the last device in each mirror .No vdev -to that pool, as it does normally. If you are uncertain about the outcome of a +to that pool, as it does normally. If you are uncertain about the outcome of a .Cm split command, use the .Fl n @@ -1550,7 +1601,7 @@ When given an interval, the output is printed every .Ar interval seconds until .Sy Ctrl-C -is pressed. If +is pressed. If .Ar count is specified, the command exits after .Ar count @@ -1871,6 +1922,7 @@ Invalid command line options were specified. .El .Sh SEE ALSO .Xr zfs 8 +.Xr zpool-features 5 .Sh AUTHORS This manual page is a .Xr mdoc 7 diff --git a/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c b/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c index fe76250f2f6..ffca56bef07 100644 --- a/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c +++ b/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c @@ -22,8 +22,9 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. - * Copyright (c) 2011 Martin Matuska . All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright (c) 2012 by Frederik Wessels. All rights reserved. + * Copyright (c) 2012 Martin Matuska . All rights reserved. */ #include @@ -45,6 +46,7 @@ #include #include #include +#include #include #include @@ -52,6 +54,7 @@ #include "zpool_util.h" #include "zfs_comutil.h" +#include "zfeature_common.h" #include "statcommon.h" @@ -69,6 +72,7 @@ static int zpool_do_status(int, char **); static int zpool_do_online(int, char **); static int zpool_do_offline(int, char **); static int zpool_do_clear(int, char **); +static int zpool_do_reopen(int, char **); static int zpool_do_reguid(int, char **); @@ -131,7 +135,8 @@ typedef enum { HELP_GET, HELP_SET, HELP_SPLIT, - HELP_REGUID + HELP_REGUID, + HELP_REOPEN } zpool_help_t; @@ -166,6 +171,7 @@ static zpool_command_t command_table[] = { { "online", zpool_do_online, HELP_ONLINE }, { "offline", zpool_do_offline, HELP_OFFLINE }, { "clear", zpool_do_clear, HELP_CLEAR }, + { "reopen", zpool_do_reopen, HELP_REOPEN }, { NULL }, { "attach", zpool_do_attach, HELP_ATTACH }, { "detach", zpool_do_detach, HELP_DETACH }, @@ -202,7 +208,7 @@ get_usage(zpool_help_t idx) { case HELP_CLEAR: return (gettext("\tclear [-nF] [device]\n")); case HELP_CREATE: - return (gettext("\tcreate [-fn] [-o property=value] ... \n" + return (gettext("\tcreate [-fnd] [-o property=value] ... \n" "\t [-O file-system-property=value] ... \n" "\t [-m mountpoint] [-R root] ...\n")); case HELP_DESTROY: @@ -229,7 +235,7 @@ get_usage(zpool_help_t idx) { case HELP_LABELCLEAR: return (gettext("\tlabelclear [-f] \n")); case HELP_LIST: - return (gettext("\tlist [-H] [-o property[,...]] " + return (gettext("\tlist [-Hv] [-o property[,...]] " "[-T d|u] [pool] ... [interval [count]]\n")); case HELP_OFFLINE: return (gettext("\toffline [-t] ...\n")); @@ -240,6 +246,8 @@ get_usage(zpool_help_t idx) { "[new-device]\n")); case HELP_REMOVE: return (gettext("\tremove ...\n")); + case HELP_REOPEN: + return (""); /* Undocumented command */ case HELP_SCRUB: return (gettext("\tscrub [-s] ...\n")); case HELP_STATUS: @@ -332,6 +340,12 @@ usage(boolean_t requested) /* Iterate over all properties */ (void) zprop_iter(print_prop_cb, fp, B_FALSE, B_TRUE, ZFS_TYPE_POOL); + + (void) fprintf(fp, "\t%-15s ", "feature@..."); + (void) fprintf(fp, "YES disabled | enabled | active\n"); + + (void) fprintf(fp, gettext("\nThe feature@ properties must be " + "appended with a feature name.\nSee zpool-features(5).\n")); } /* @@ -398,12 +412,16 @@ add_prop_list(const char *propname, char *propval, nvlist_t **props, proplist = *props; if (poolprop) { - if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL) { + if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL && + !zpool_prop_feature(propname)) { (void) fprintf(stderr, gettext("property '%s' is " "not a valid pool property\n"), propname); return (2); } - normnm = zpool_prop_to_name(prop); + if (zpool_prop_feature(propname)) + normnm = propname; + else + normnm = zpool_prop_to_name(prop); } else { if ((fprop = zfs_name_to_prop(propname)) != ZPROP_INVAL) { normnm = zfs_prop_to_name(fprop); @@ -694,7 +712,7 @@ errout: } /* - * zpool create [-fn] [-o property=value] ... + * zpool create [-fnd] [-o property=value] ... * [-O file-system-property=value] ... * [-R root] [-m mountpoint] ... * @@ -703,8 +721,10 @@ errout: * were to be created. * -R Create a pool under an alternate root * -m Set default mountpoint for the root dataset. By default it's - * '/' + * '/' * -o Set property=value. + * -d Don't automatically enable all supported pool features + * (individual features can be enabled with -o). * -O Set fsproperty=value in the pool's root file system * * Creates the named pool according to the given vdev specification. The @@ -717,6 +737,7 @@ zpool_do_create(int argc, char **argv) { boolean_t force = B_FALSE; boolean_t dryrun = B_FALSE; + boolean_t enable_all_pool_feat = B_TRUE; int c; nvlist_t *nvroot = NULL; char *poolname; @@ -728,7 +749,7 @@ zpool_do_create(int argc, char **argv) char *propval; /* check options */ - while ((c = getopt(argc, argv, ":fnR:m:o:O:")) != -1) { + while ((c = getopt(argc, argv, ":fndR:m:o:O:")) != -1) { switch (c) { case 'f': force = B_TRUE; @@ -736,6 +757,9 @@ zpool_do_create(int argc, char **argv) case 'n': dryrun = B_TRUE; break; + case 'd': + enable_all_pool_feat = B_FALSE; + break; case 'R': altroot = optarg; if (add_prop_list(zpool_prop_to_name( @@ -763,6 +787,21 @@ zpool_do_create(int argc, char **argv) if (add_prop_list(optarg, propval, &props, B_TRUE)) goto errout; + + /* + * If the user is creating a pool that doesn't support + * feature flags, don't enable any features. + */ + if (zpool_name_to_prop(optarg) == ZPOOL_PROP_VERSION) { + char *end; + u_longlong_t ver; + + ver = strtoull(propval, &end, 10); + if (*end == '\0' && + ver < SPA_VERSION_FEATURES) { + enable_all_pool_feat = B_FALSE; + } + } break; case 'O': if ((propval = strchr(optarg, '=')) == NULL) { @@ -828,7 +867,6 @@ zpool_do_create(int argc, char **argv) goto errout; } - if (altroot != NULL && altroot[0] != '/') { (void) fprintf(stderr, gettext("invalid alternate root '%s': " "must be an absolute path\n"), altroot); @@ -910,6 +948,27 @@ zpool_do_create(int argc, char **argv) /* * Hand off to libzfs. */ + if (enable_all_pool_feat) { + int i; + for (i = 0; i < SPA_FEATURES; i++) { + char propname[MAXPATHLEN]; + zfeature_info_t *feat = &spa_feature_table[i]; + + (void) snprintf(propname, sizeof (propname), + "feature@%s", feat->fi_uname); + + /* + * Skip feature if user specified it manually + * on the command line. + */ + if (nvlist_exists(props, propname)) + continue; + + if (add_prop_list(propname, ZFS_FEATURE_ENABLED, + &props, B_TRUE) != 0) + goto errout; + } + } if (zpool_create(g_zfs, poolname, nvroot, props, fsprops) == 0) { zfs_handle_t *pool = zfs_open(g_zfs, poolname, @@ -1242,6 +1301,10 @@ print_status_config(zpool_handle_t *zhp, const char *name, nvlist_t *nv, (void) printf(gettext("newer version")); break; + case VDEV_AUX_UNSUP_FEAT: + (void) printf(gettext("unsupported feature(s)")); + break; + case VDEV_AUX_SPARED: verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &cb.cb_guid) == 0); @@ -1359,6 +1422,10 @@ print_import_config(const char *name, nvlist_t *nv, int namewidth, int depth) (void) printf(gettext("newer version")); break; + case VDEV_AUX_UNSUP_FEAT: + (void) printf(gettext("unsupported feature(s)")); + break; + case VDEV_AUX_ERR_EXCEEDED: (void) printf(gettext("too many errors")); break; @@ -1525,6 +1592,20 @@ show_import(nvlist_t *config) "incompatible version.\n")); break; + case ZPOOL_STATUS_UNSUP_FEAT_READ: + (void) printf(gettext("status: The pool uses the following " + "feature(s) not supported on this sytem:\n")); + zpool_print_unsup_feat(config); + break; + + case ZPOOL_STATUS_UNSUP_FEAT_WRITE: + (void) printf(gettext("status: The pool can only be accessed " + "in read-only mode on this system. It\n\tcannot be " + "accessed in read-write mode because it uses the " + "following\n\tfeature(s) not supported on this system:\n")); + zpool_print_unsup_feat(config); + break; + case ZPOOL_STATUS_HOSTID_MISMATCH: (void) printf(gettext(" status: The pool was last accessed by " "another system.\n")); @@ -1582,6 +1663,20 @@ show_import(nvlist_t *config) "newer\n\tsoftware, or recreate the pool from " "backup.\n")); break; + case ZPOOL_STATUS_UNSUP_FEAT_READ: + (void) printf(gettext("action: The pool cannot be " + "imported. Access the pool on a system that " + "supports\n\tthe required feature(s), or recreate " + "the pool from backup.\n")); + break; + case ZPOOL_STATUS_UNSUP_FEAT_WRITE: + (void) printf(gettext("action: The pool cannot be " + "imported in read-write mode. Import the pool " + "with\n" + "\t\"-o readonly=on\", access the pool on a system " + "that supports the\n\trequired feature(s), or " + "recreate the pool from backup.\n")); + break; case ZPOOL_STATUS_MISSING_DEV_R: case ZPOOL_STATUS_MISSING_DEV_NR: case ZPOOL_STATUS_BAD_GUID_SUM: @@ -1616,7 +1711,7 @@ show_import(nvlist_t *config) } if (msgid != NULL) - (void) printf(gettext(" see: http://www.sun.com/msg/%s\n"), + (void) printf(gettext(" see: http://illumos.org/msg/%s\n"), msgid); (void) printf(gettext(" config:\n\n")); @@ -1657,9 +1752,9 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts, ZPOOL_CONFIG_POOL_STATE, &state) == 0); verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, &version) == 0); - if (version > SPA_VERSION) { + if (!SPA_VERSION_IS_SUPPORTED(version)) { (void) fprintf(stderr, gettext("cannot import '%s': pool " - "is formatted using a newer ZFS version\n"), name); + "is formatted using an unsupported ZFS version\n"), name); return (1); } else if (state != POOL_STATE_EXPORTED && !(flags & ZFS_IMPORT_ANY_HOST)) { @@ -1909,7 +2004,7 @@ zpool_do_import(int argc, char **argv) if (searchdirs == NULL) { searchdirs = safe_malloc(sizeof (char *)); - searchdirs[0] = "/dev/dsk"; + searchdirs[0] = "/dev"; nsearch = 1; } @@ -2108,10 +2203,10 @@ error: } typedef struct iostat_cbdata { - zpool_list_t *cb_list; - int cb_verbose; - int cb_iteration; + boolean_t cb_verbose; int cb_namewidth; + int cb_iteration; + zpool_list_t *cb_list; } iostat_cbdata_t; static void @@ -2351,7 +2446,8 @@ get_namewidth(zpool_handle_t *zhp, void *data) if (!cb->cb_verbose) cb->cb_namewidth = strlen(zpool_get_name(zhp)); else - cb->cb_namewidth = max_width(zhp, nvroot, 0, 0); + cb->cb_namewidth = max_width(zhp, nvroot, 0, + cb->cb_namewidth); } /* @@ -2580,8 +2676,9 @@ zpool_do_iostat(int argc, char **argv) } typedef struct list_cbdata { + boolean_t cb_verbose; + int cb_namewidth; boolean_t cb_scripted; - boolean_t cb_first; zprop_list_t *cb_proplist; } list_cbdata_t; @@ -2589,30 +2686,50 @@ typedef struct list_cbdata { * Given a list of columns to display, output appropriate headers for each one. */ static void -print_header(zprop_list_t *pl) +print_header(list_cbdata_t *cb) { + zprop_list_t *pl = cb->cb_proplist; + char headerbuf[ZPOOL_MAXPROPLEN]; const char *header; boolean_t first = B_TRUE; boolean_t right_justify; + size_t width = 0; for (; pl != NULL; pl = pl->pl_next) { - if (pl->pl_prop == ZPROP_INVAL) - continue; + width = pl->pl_width; + if (first && cb->cb_verbose) { + /* + * Reset the width to accommodate the verbose listing + * of devices. + */ + width = cb->cb_namewidth; + } if (!first) (void) printf(" "); else first = B_FALSE; - header = zpool_prop_column_name(pl->pl_prop); - right_justify = zpool_prop_align_right(pl->pl_prop); + right_justify = B_FALSE; + if (pl->pl_prop != ZPROP_INVAL) { + header = zpool_prop_column_name(pl->pl_prop); + right_justify = zpool_prop_align_right(pl->pl_prop); + } else { + int i; + + for (i = 0; pl->pl_user_prop[i] != '\0'; i++) + headerbuf[i] = toupper(pl->pl_user_prop[i]); + headerbuf[i] = '\0'; + header = headerbuf; + } if (pl->pl_next == NULL && !right_justify) (void) printf("%s", header); else if (right_justify) - (void) printf("%*s", pl->pl_width, header); + (void) printf("%*s", width, header); else - (void) printf("%-*s", pl->pl_width, header); + (void) printf("%-*s", width, header); + } (void) printf("\n"); @@ -2623,17 +2740,28 @@ print_header(zprop_list_t *pl) * to the described layout. */ static void -print_pool(zpool_handle_t *zhp, zprop_list_t *pl, int scripted) +print_pool(zpool_handle_t *zhp, list_cbdata_t *cb) { + zprop_list_t *pl = cb->cb_proplist; boolean_t first = B_TRUE; char property[ZPOOL_MAXPROPLEN]; char *propstr; boolean_t right_justify; - int width; + size_t width; for (; pl != NULL; pl = pl->pl_next) { + + width = pl->pl_width; + if (first && cb->cb_verbose) { + /* + * Reset the width to accommodate the verbose listing + * of devices. + */ + width = cb->cb_namewidth; + } + if (!first) { - if (scripted) + if (cb->cb_scripted) (void) printf("\t"); else (void) printf(" "); @@ -2643,25 +2771,32 @@ print_pool(zpool_handle_t *zhp, zprop_list_t *pl, int scripted) right_justify = B_FALSE; if (pl->pl_prop != ZPROP_INVAL) { - if (zpool_get_prop(zhp, pl->pl_prop, property, + if (pl->pl_prop == ZPOOL_PROP_EXPANDSZ && + zpool_get_prop_int(zhp, pl->pl_prop, NULL) == 0) + propstr = "-"; + else if (zpool_get_prop(zhp, pl->pl_prop, property, sizeof (property), NULL) != 0) propstr = "-"; else propstr = property; right_justify = zpool_prop_align_right(pl->pl_prop); + } else if ((zpool_prop_feature(pl->pl_user_prop) || + zpool_prop_unsupported(pl->pl_user_prop)) && + zpool_prop_get_feature(zhp, pl->pl_user_prop, property, + sizeof (property)) == 0) { + propstr = property; } else { propstr = "-"; } - width = pl->pl_width; /* * If this is being called in scripted mode, or if this is the * last column and it is left-justified, don't include a width * format specifier. */ - if (scripted || (pl->pl_next == NULL && !right_justify)) + if (cb->cb_scripted || (pl->pl_next == NULL && !right_justify)) (void) printf("%s", propstr); else if (right_justify) (void) printf("%*s", width, propstr); @@ -2672,6 +2807,101 @@ print_pool(zpool_handle_t *zhp, zprop_list_t *pl, int scripted) (void) printf("\n"); } +static void +print_one_column(zpool_prop_t prop, uint64_t value, boolean_t scripted) +{ + char propval[64]; + boolean_t fixed; + size_t width = zprop_width(prop, &fixed, ZFS_TYPE_POOL); + + zfs_nicenum(value, propval, sizeof (propval)); + + if (prop == ZPOOL_PROP_EXPANDSZ && value == 0) + (void) strlcpy(propval, "-", sizeof (propval)); + + if (scripted) + (void) printf("\t%s", propval); + else + (void) printf(" %*s", width, propval); +} + +void +print_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv, + list_cbdata_t *cb, int depth) +{ + nvlist_t **child; + vdev_stat_t *vs; + uint_t c, children; + char *vname; + boolean_t scripted = cb->cb_scripted; + + verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS, + (uint64_t **)&vs, &c) == 0); + + if (name != NULL) { + if (scripted) + (void) printf("\t%s", name); + else if (strlen(name) + depth > cb->cb_namewidth) + (void) printf("%*s%s", depth, "", name); + else + (void) printf("%*s%s%*s", depth, "", name, + (int)(cb->cb_namewidth - strlen(name) - depth), ""); + + /* only toplevel vdevs have capacity stats */ + if (vs->vs_space == 0) { + if (scripted) + (void) printf("\t-\t-\t-"); + else + (void) printf(" - - -"); + } else { + print_one_column(ZPOOL_PROP_SIZE, vs->vs_space, + scripted); + print_one_column(ZPOOL_PROP_CAPACITY, vs->vs_alloc, + scripted); + print_one_column(ZPOOL_PROP_FREE, + vs->vs_space - vs->vs_alloc, scripted); + } + print_one_column(ZPOOL_PROP_EXPANDSZ, vs->vs_esize, + scripted); + (void) printf("\n"); + } + + if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, + &child, &children) != 0) + return; + + for (c = 0; c < children; c++) { + uint64_t ishole = B_FALSE; + + if (nvlist_lookup_uint64(child[c], + ZPOOL_CONFIG_IS_HOLE, &ishole) == 0 && ishole) + continue; + + vname = zpool_vdev_name(g_zfs, zhp, child[c], B_FALSE); + print_list_stats(zhp, vname, child[c], cb, depth + 2); + free(vname); + } + + /* + * Include level 2 ARC devices in iostat output + */ + if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE, + &child, &children) != 0) + return; + + if (children > 0) { + (void) printf("%-*s - - - - - " + "-\n", cb->cb_namewidth, "cache"); + for (c = 0; c < children; c++) { + vname = zpool_vdev_name(g_zfs, zhp, child[c], + B_FALSE); + print_list_stats(zhp, vname, child[c], cb, depth + 2); + free(vname); + } + } +} + + /* * Generic callback function to list a pool. */ @@ -2679,14 +2909,18 @@ int list_callback(zpool_handle_t *zhp, void *data) { list_cbdata_t *cbp = data; + nvlist_t *config; + nvlist_t *nvroot; - if (cbp->cb_first) { - if (!cbp->cb_scripted) - print_header(cbp->cb_proplist); - cbp->cb_first = B_FALSE; - } + config = zpool_get_config(zhp, NULL); - print_pool(zhp, cbp->cb_proplist, cbp->cb_scripted); + print_pool(zhp, cbp); + if (!cbp->cb_verbose) + return (0); + + verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, + &nvroot) == 0); + print_list_stats(zhp, NULL, nvroot, cbp, 0); return (0); } @@ -2710,12 +2944,15 @@ zpool_do_list(int argc, char **argv) int ret; list_cbdata_t cb = { 0 }; static char default_props[] = - "name,size,allocated,free,capacity,dedupratio,health,altroot"; + "name,size,allocated,free,capacity,dedupratio," + "health,altroot"; char *props = default_props; unsigned long interval = 0, count = 0; + zpool_list_t *list; + boolean_t first = B_TRUE; /* check options */ - while ((c = getopt(argc, argv, ":Ho:T:")) != -1) { + while ((c = getopt(argc, argv, ":Ho:T:v")) != -1) { switch (c) { case 'H': cb.cb_scripted = B_TRUE; @@ -2726,6 +2963,9 @@ zpool_do_list(int argc, char **argv) case 'T': get_timestamp_arg(*optarg); break; + case 'v': + cb.cb_verbose = B_TRUE; + break; case ':': (void) fprintf(stderr, gettext("missing argument for " "'%c' option\n"), optopt); @@ -2746,21 +2986,32 @@ zpool_do_list(int argc, char **argv) if (zprop_get_list(g_zfs, props, &cb.cb_proplist, ZFS_TYPE_POOL) != 0) usage(B_FALSE); - cb.cb_first = B_TRUE; + if ((list = pool_list_get(argc, argv, &cb.cb_proplist, &ret)) == NULL) + return (1); + + if (argc == 0 && !cb.cb_scripted && pool_list_count(list) == 0) { + (void) printf(gettext("no pools available\n")); + zprop_free_list(cb.cb_proplist); + return (0); + } for (;;) { + pool_list_update(list); + + if (pool_list_count(list) == 0) + break; + + cb.cb_namewidth = 0; + (void) pool_list_iter(list, B_FALSE, get_namewidth, &cb); if (timestamp_fmt != NODATE) print_timestamp(timestamp_fmt); - ret = for_each_pool(argc, argv, B_TRUE, &cb.cb_proplist, - list_callback, &cb); - - if (argc == 0 && cb.cb_first && !cb.cb_scripted) { - (void) printf(gettext("no pools available\n")); - zprop_free_list(cb.cb_proplist); - return (0); + if (!cb.cb_scripted && (first || cb.cb_verbose)) { + print_header(&cb); + first = B_FALSE; } + ret = pool_list_iter(list, B_TRUE, list_callback, &cb); if (interval == 0) break; @@ -3380,6 +3631,36 @@ zpool_do_reguid(int argc, char **argv) } +/* + * zpool reopen + * + * Reopen the pool so that the kernel can update the sizes of all vdevs. + * + * NOTE: This command is currently undocumented. If the command is ever + * exposed then the appropriate usage() messages will need to be made. + */ +int +zpool_do_reopen(int argc, char **argv) +{ + int ret = 0; + zpool_handle_t *zhp; + char *pool; + + argc--; + argv++; + + if (argc != 1) + return (2); + + pool = argv[0]; + if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL) + return (1); + + ret = zpool_reopen(zhp); + zpool_close(zhp); + return (ret); +} + typedef struct scrub_cbdata { int cb_type; int cb_argc; @@ -3683,7 +3964,7 @@ print_dedup_stats(nvlist_t *config) * pool: tank * status: DEGRADED * reason: One or more devices ... - * see: http://www.sun.com/msg/ZFS-xxxx-01 + * see: http://illumos.org/msg/ZFS-xxxx-01 * config: * mirror DEGRADED * c1t0d0 OK @@ -3844,6 +4125,31 @@ status_callback(zpool_handle_t *zhp, void *data) "backup.\n")); break; + case ZPOOL_STATUS_UNSUP_FEAT_READ: + (void) printf(gettext("status: The pool cannot be accessed on " + "this system because it uses the\n\tfollowing feature(s) " + "not supported on this system:\n")); + zpool_print_unsup_feat(config); + (void) printf("\n"); + (void) printf(gettext("action: Access the pool from a system " + "that supports the required feature(s),\n\tor restore the " + "pool from backup.\n")); + break; + + case ZPOOL_STATUS_UNSUP_FEAT_WRITE: + (void) printf(gettext("status: The pool can only be accessed " + "in read-only mode on this system. It\n\tcannot be " + "accessed in read-write mode because it uses the " + "following\n\tfeature(s) not supported on this system:\n")); + zpool_print_unsup_feat(config); + (void) printf("\n"); + (void) printf(gettext("action: The pool cannot be accessed in " + "read-write mode. Import the pool with\n" + "\t\"-o readonly=on\", access the pool from a system that " + "supports the\n\trequired feature(s), or restore the " + "pool from backup.\n")); + break; + case ZPOOL_STATUS_FAULTED_DEV_R: (void) printf(gettext("status: One or more devices are " "faulted in response to persistent errors.\n\tSufficient " @@ -3891,7 +4197,7 @@ status_callback(zpool_handle_t *zhp, void *data) } if (msgid != NULL) - (void) printf(gettext(" see: http://www.sun.com/msg/%s\n"), + (void) printf(gettext(" see: http://illumos.org/msg/%s\n"), msgid); if (config != NULL) { @@ -4094,7 +4400,8 @@ upgrade_cb(zpool_handle_t *zhp, void *arg) verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, &version) == 0); - if (!cbp->cb_newer && version < SPA_VERSION) { + if (!cbp->cb_newer && SPA_VERSION_IS_SUPPORTED(version) && + version != SPA_VERSION) { if (!cbp->cb_all) { if (cbp->cb_first) { (void) printf(gettext("The following pools are " @@ -4123,13 +4430,14 @@ upgrade_cb(zpool_handle_t *zhp, void *arg) } } } - } else if (cbp->cb_newer && version > SPA_VERSION) { + } else if (cbp->cb_newer && !SPA_VERSION_IS_SUPPORTED(version)) { assert(!cbp->cb_all); if (cbp->cb_first) { (void) printf(gettext("The following pools are " - "formatted using a newer software version and\n" - "cannot be accessed on the current system.\n\n")); + "formatted using an unsupported software version " + "and\ncannot be accessed on the current " + "system.\n\n")); (void) printf(gettext("VER POOL\n")); (void) printf(gettext("--- ------------\n")); cbp->cb_first = B_FALSE; @@ -4217,8 +4525,8 @@ zpool_do_upgrade(int argc, char **argv) break; case 'V': cb.cb_version = strtoll(optarg, &end, 10); - if (*end != '\0' || cb.cb_version > SPA_VERSION || - cb.cb_version < SPA_VERSION_1) { + if (*end != '\0' || + !SPA_VERSION_IS_SUPPORTED(cb.cb_version)) { (void) fprintf(stderr, gettext("invalid version '%s'\n"), optarg); usage(B_FALSE); @@ -4263,8 +4571,8 @@ zpool_do_upgrade(int argc, char **argv) } } - (void) printf(gettext("This system is currently running " - "ZFS pool version %llu.\n\n"), SPA_VERSION); + (void) printf(gettext("This system supports ZFS pool feature " + "flags.\n\n")); cb.cb_first = B_TRUE; if (showversions) { (void) printf(gettext("The following versions are " @@ -4525,13 +4833,26 @@ get_callback(zpool_handle_t *zhp, void *data) pl == cbp->cb_proplist) continue; - if (zpool_get_prop(zhp, pl->pl_prop, - value, sizeof (value), &srctype) != 0) - continue; + if (pl->pl_prop == ZPROP_INVAL && + (zpool_prop_feature(pl->pl_user_prop) || + zpool_prop_unsupported(pl->pl_user_prop))) { + srctype = ZPROP_SRC_LOCAL; - zprop_print_one_property(zpool_get_name(zhp), cbp, - zpool_prop_to_name(pl->pl_prop), value, srctype, NULL, - NULL); + if (zpool_prop_get_feature(zhp, pl->pl_user_prop, + value, sizeof (value)) == 0) { + zprop_print_one_property(zpool_get_name(zhp), + cbp, pl->pl_user_prop, value, srctype, + NULL, NULL); + } + } else { + if (zpool_get_prop(zhp, pl->pl_prop, value, + sizeof (value), &srctype) != 0) + continue; + + zprop_print_one_property(zpool_get_name(zhp), cbp, + zpool_prop_to_name(pl->pl_prop), value, srctype, + NULL, NULL); + } } return (0); } @@ -4543,8 +4864,11 @@ zpool_do_get(int argc, char **argv) zprop_list_t fake_name = { 0 }; int ret; - if (argc < 3) + if (argc < 2) { + (void) fprintf(stderr, gettext("missing property " + "argument\n")); usage(B_FALSE); + } cb.cb_first = B_TRUE; cb.cb_sources = ZPROP_SRC_ALL; @@ -4554,7 +4878,7 @@ zpool_do_get(int argc, char **argv) cb.cb_columns[3] = GET_COL_SOURCE; cb.cb_type = ZFS_TYPE_POOL; - if (zprop_get_list(g_zfs, argv[1], &cb.cb_proplist, + if (zprop_get_list(g_zfs, argv[1], &cb.cb_proplist, ZFS_TYPE_POOL) != 0) usage(B_FALSE); diff --git a/cddl/contrib/opensolaris/cmd/zstreamdump/zstreamdump.1 b/cddl/contrib/opensolaris/cmd/zstreamdump/zstreamdump.1 index f800a0513b9..6f8ca6e6eb8 100644 --- a/cddl/contrib/opensolaris/cmd/zstreamdump/zstreamdump.1 +++ b/cddl/contrib/opensolaris/cmd/zstreamdump/zstreamdump.1 @@ -25,7 +25,7 @@ .Dt ZSTREAMDUMP 8 .Os .Sh NAME -.Nm zdb +.Nm zstreamdump .Nd filter data in zfs send stream .Sh SYNOPSIS .Nm diff --git a/cddl/contrib/opensolaris/cmd/ztest/ztest.c b/cddl/contrib/opensolaris/cmd/ztest/ztest.c index 3a6c35035fc..db373e1c7ec 100644 --- a/cddl/contrib/opensolaris/cmd/ztest/ztest.c +++ b/cddl/contrib/opensolaris/cmd/ztest/ztest.c @@ -20,8 +20,9 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. + * Copyright (c) 2012 Martin Matuska . All rights reserved. */ /* @@ -51,7 +52,9 @@ * At random times, the child self-immolates with a SIGKILL. * This is the software equivalent of pulling the power cord. * The parent then runs the test again, using the existing - * storage pool, as many times as desired. + * storage pool, as many times as desired. If backwards compatability + * testing is enabled ztest will sometimes run the "older" version + * of ztest after a SIGKILL. * * (6) To verify that we don't have future leaks or temporal incursions, * many of the functional tests record the transaction group number @@ -68,9 +71,15 @@ * You can ask more more vdevs [-v], datasets [-d], or threads [-t] * to increase the pool capacity, fanout, and overall stress level. * - * The -N(okill) option will suppress kills, so each child runs to completion. - * This can be useful when you're trying to distinguish temporal incursions - * from plain old race conditions. + * Use the -k option to set the desired frequency of kills. + * + * When ztest invokes itself it passes all relevant information through a + * temporary file which is mmap-ed in the child process. This allows shared + * memory to survive the exec syscall. The ztest_shared_hdr_t struct is always + * stored at offset 0 of this file and contains information on the size and + * number of shared structures in the file. The information stored in this file + * must remain backwards compatible with older versions of ztest so that + * ztest can invoke them during backwards compatibility testing (-B). */ #include @@ -98,6 +107,7 @@ #include #include #include +#include #include #include #include @@ -111,29 +121,82 @@ #include #include -static char cmdname[] = "ztest"; -static char *zopt_pool = cmdname; -static char *progname; +#define ZTEST_FD_DATA 3 +#define ZTEST_FD_RAND 4 -static uint64_t zopt_vdevs = 5; -static uint64_t zopt_vdevtime; -static int zopt_ashift = SPA_MINBLOCKSHIFT; -static int zopt_mirrors = 2; -static int zopt_raidz = 4; -static int zopt_raidz_parity = 1; -static size_t zopt_vdev_size = SPA_MINDEVSIZE; -static int zopt_datasets = 7; -static int zopt_threads = 23; -static uint64_t zopt_passtime = 60; /* 60 seconds */ -static uint64_t zopt_killrate = 70; /* 70% kill rate */ -static int zopt_verbose = 0; -static int zopt_init = 1; -static char *zopt_dir = "/tmp"; -static uint64_t zopt_time = 300; /* 5 minutes */ -static uint64_t zopt_maxloops = 50; /* max loops during spa_freeze() */ +typedef struct ztest_shared_hdr { + uint64_t zh_hdr_size; + uint64_t zh_opts_size; + uint64_t zh_size; + uint64_t zh_stats_size; + uint64_t zh_stats_count; + uint64_t zh_ds_size; + uint64_t zh_ds_count; +} ztest_shared_hdr_t; + +static ztest_shared_hdr_t *ztest_shared_hdr; + +typedef struct ztest_shared_opts { + char zo_pool[MAXNAMELEN]; + char zo_dir[MAXNAMELEN]; + char zo_alt_ztest[MAXNAMELEN]; + char zo_alt_libpath[MAXNAMELEN]; + uint64_t zo_vdevs; + uint64_t zo_vdevtime; + size_t zo_vdev_size; + int zo_ashift; + int zo_mirrors; + int zo_raidz; + int zo_raidz_parity; + int zo_datasets; + int zo_threads; + uint64_t zo_passtime; + uint64_t zo_killrate; + int zo_verbose; + int zo_init; + uint64_t zo_time; + uint64_t zo_maxloops; + uint64_t zo_metaslab_gang_bang; +} ztest_shared_opts_t; + +static const ztest_shared_opts_t ztest_opts_defaults = { + .zo_pool = { 'z', 't', 'e', 's', 't', '\0' }, + .zo_dir = { '/', 't', 'm', 'p', '\0' }, + .zo_alt_ztest = { '\0' }, + .zo_alt_libpath = { '\0' }, + .zo_vdevs = 5, + .zo_ashift = SPA_MINBLOCKSHIFT, + .zo_mirrors = 2, + .zo_raidz = 4, + .zo_raidz_parity = 1, + .zo_vdev_size = SPA_MINDEVSIZE, + .zo_datasets = 7, + .zo_threads = 23, + .zo_passtime = 60, /* 60 seconds */ + .zo_killrate = 70, /* 70% kill rate */ + .zo_verbose = 0, + .zo_init = 1, + .zo_time = 300, /* 5 minutes */ + .zo_maxloops = 50, /* max loops during spa_freeze() */ + .zo_metaslab_gang_bang = 32 << 10 +}; + +extern uint64_t metaslab_gang_bang; +extern uint64_t metaslab_df_alloc_threshold; + +static ztest_shared_opts_t *ztest_shared_opts; +static ztest_shared_opts_t ztest_opts; + +typedef struct ztest_shared_ds { + uint64_t zd_seq; +} ztest_shared_ds_t; + +static ztest_shared_ds_t *ztest_shared_ds; +#define ZTEST_GET_SHARED_DS(d) (&ztest_shared_ds[d]) #define BT_MAGIC 0x123456789abcdefULL -#define MAXFAULTS() (MAX(zs->zs_mirrors, 1) * (zopt_raidz_parity + 1) - 1) +#define MAXFAULTS() \ + (MAX(zs->zs_mirrors, 1) * (ztest_opts.zo_raidz_parity + 1) - 1) enum ztest_io_type { ZTEST_IO_WRITE_TAG, @@ -205,10 +268,10 @@ typedef struct ztest_od { * Per-dataset state. */ typedef struct ztest_ds { + ztest_shared_ds_t *zd_shared; objset_t *zd_os; rwlock_t zd_zilog_lock; zilog_t *zd_zilog; - uint64_t zd_seq; ztest_od_t *zd_od; /* debugging aid */ char zd_name[MAXNAMELEN]; mutex_t zd_dirobj_lock; @@ -225,11 +288,17 @@ typedef struct ztest_info { ztest_func_t *zi_func; /* test function */ uint64_t zi_iters; /* iterations per execution */ uint64_t *zi_interval; /* execute every seconds */ - uint64_t zi_call_count; /* per-pass count */ - uint64_t zi_call_time; /* per-pass time */ - uint64_t zi_call_next; /* next time to call this function */ } ztest_info_t; +typedef struct ztest_shared_callstate { + uint64_t zc_count; /* per-pass count */ + uint64_t zc_time; /* per-pass time */ + uint64_t zc_next; /* next time to call this function */ +} ztest_shared_callstate_t; + +static ztest_shared_callstate_t *ztest_shared_callstate; +#define ZTEST_GET_SHARED_CALLSTATE(c) (&ztest_shared_callstate[c]) + /* * Note: these aren't static because we want dladdr() to work. */ @@ -297,8 +366,10 @@ ztest_info_t ztest_info[] = { { ztest_dsl_dataset_promote_busy, 1, &zopt_rarely }, { ztest_vdev_attach_detach, 1, &zopt_rarely }, { ztest_vdev_LUN_growth, 1, &zopt_rarely }, - { ztest_vdev_add_remove, 1, &zopt_vdevtime }, - { ztest_vdev_aux_add_remove, 1, &zopt_vdevtime }, + { ztest_vdev_add_remove, 1, + &ztest_opts.zo_vdevtime }, + { ztest_vdev_aux_add_remove, 1, + &ztest_opts.zo_vdevtime }, }; #define ZTEST_FUNCS (sizeof (ztest_info) / sizeof (ztest_info_t)) @@ -316,8 +387,7 @@ typedef struct ztest_cb_list { * Stuff we need to share writably between parent and child. */ typedef struct ztest_shared { - char *zs_pool; - spa_t *zs_spa; + boolean_t zs_do_init; hrtime_t zs_proc_start; hrtime_t zs_proc_stop; hrtime_t zs_thread_start; @@ -328,13 +398,11 @@ typedef struct ztest_shared { uint64_t zs_vdev_aux; uint64_t zs_alloc; uint64_t zs_space; - uint64_t zs_guid; - mutex_t zs_vdev_lock; - rwlock_t zs_name_lock; - ztest_info_t zs_info[ZTEST_FUNCS]; uint64_t zs_splits; uint64_t zs_mirrors; - ztest_ds_t zs_zd[]; + uint64_t zs_metaslab_sz; + uint64_t zs_metaslab_df_alloc_threshold; + uint64_t zs_guid; } ztest_shared_t; #define ID_PARALLEL -1ULL @@ -342,20 +410,19 @@ typedef struct ztest_shared { static char ztest_dev_template[] = "%s/%s.%llua"; static char ztest_aux_template[] = "%s/%s.%s.%llu"; ztest_shared_t *ztest_shared; -uint64_t *ztest_seq; -static int ztest_random_fd; -static int ztest_dump_core = 1; +static spa_t *ztest_spa = NULL; +static ztest_ds_t *ztest_ds; +static mutex_t ztest_vdev_lock; +static rwlock_t ztest_name_lock; + +static boolean_t ztest_dump_core = B_TRUE; static boolean_t ztest_exiting; /* Global commit callback list */ static ztest_cb_list_t zcl; -extern uint64_t metaslab_gang_bang; -extern uint64_t metaslab_df_alloc_threshold; -static uint64_t metaslab_sz; - enum ztest_object { ZTEST_META_DNODE = 0, ZTEST_DIROBJ, @@ -468,12 +535,14 @@ nicenumtoull(const char *buf) static void usage(boolean_t requested) { + const ztest_shared_opts_t *zo = &ztest_opts_defaults; + char nice_vdev_size[10]; char nice_gang_bang[10]; FILE *fp = requested ? stdout : stderr; - nicenum(zopt_vdev_size, nice_vdev_size); - nicenum(metaslab_gang_bang, nice_gang_bang); + nicenum(zo->zo_vdev_size, nice_vdev_size); + nicenum(zo->zo_metaslab_gang_bang, nice_gang_bang); (void) fprintf(fp, "Usage: %s\n" "\t[-v vdevs (default: %llu)]\n" @@ -494,42 +563,43 @@ usage(boolean_t requested) "\t[-T time (default: %llu sec)] total run time\n" "\t[-F freezeloops (default: %llu)] max loops in spa_freeze()\n" "\t[-P passtime (default: %llu sec)] time per pass\n" + "\t[-B alt_ztest (default: )] alternate ztest path\n" "\t[-h] (print help)\n" "", - cmdname, - (u_longlong_t)zopt_vdevs, /* -v */ + zo->zo_pool, + (u_longlong_t)zo->zo_vdevs, /* -v */ nice_vdev_size, /* -s */ - zopt_ashift, /* -a */ - zopt_mirrors, /* -m */ - zopt_raidz, /* -r */ - zopt_raidz_parity, /* -R */ - zopt_datasets, /* -d */ - zopt_threads, /* -t */ + zo->zo_ashift, /* -a */ + zo->zo_mirrors, /* -m */ + zo->zo_raidz, /* -r */ + zo->zo_raidz_parity, /* -R */ + zo->zo_datasets, /* -d */ + zo->zo_threads, /* -t */ nice_gang_bang, /* -g */ - zopt_init, /* -i */ - (u_longlong_t)zopt_killrate, /* -k */ - zopt_pool, /* -p */ - zopt_dir, /* -f */ - (u_longlong_t)zopt_time, /* -T */ - (u_longlong_t)zopt_maxloops, /* -F */ - (u_longlong_t)zopt_passtime); /* -P */ + zo->zo_init, /* -i */ + (u_longlong_t)zo->zo_killrate, /* -k */ + zo->zo_pool, /* -p */ + zo->zo_dir, /* -f */ + (u_longlong_t)zo->zo_time, /* -T */ + (u_longlong_t)zo->zo_maxloops, /* -F */ + (u_longlong_t)zo->zo_passtime); exit(requested ? 0 : 1); } static void process_options(int argc, char **argv) { + char *path; + ztest_shared_opts_t *zo = &ztest_opts; + int opt; uint64_t value; + char altdir[MAXNAMELEN] = { 0 }; - /* Remember program name. */ - progname = argv[0]; - - /* By default, test gang blocks for blocks 32K and greater */ - metaslab_gang_bang = 32 << 10; + bcopy(&ztest_opts_defaults, zo, sizeof (*zo)); while ((opt = getopt(argc, argv, - "v:s:a:m:r:R:d:t:g:i:k:p:f:VET:P:hF:")) != EOF) { + "v:s:a:m:r:R:d:t:g:i:k:p:f:VET:P:hF:B:")) != EOF) { value = 0; switch (opt) { case 'v': @@ -550,58 +620,71 @@ process_options(int argc, char **argv) } switch (opt) { case 'v': - zopt_vdevs = value; + zo->zo_vdevs = value; break; case 's': - zopt_vdev_size = MAX(SPA_MINDEVSIZE, value); + zo->zo_vdev_size = MAX(SPA_MINDEVSIZE, value); break; case 'a': - zopt_ashift = value; + zo->zo_ashift = value; break; case 'm': - zopt_mirrors = value; + zo->zo_mirrors = value; break; case 'r': - zopt_raidz = MAX(1, value); + zo->zo_raidz = MAX(1, value); break; case 'R': - zopt_raidz_parity = MIN(MAX(value, 1), 3); + zo->zo_raidz_parity = MIN(MAX(value, 1), 3); break; case 'd': - zopt_datasets = MAX(1, value); + zo->zo_datasets = MAX(1, value); break; case 't': - zopt_threads = MAX(1, value); + zo->zo_threads = MAX(1, value); break; case 'g': - metaslab_gang_bang = MAX(SPA_MINBLOCKSIZE << 1, value); + zo->zo_metaslab_gang_bang = MAX(SPA_MINBLOCKSIZE << 1, + value); break; case 'i': - zopt_init = value; + zo->zo_init = value; break; case 'k': - zopt_killrate = value; + zo->zo_killrate = value; break; case 'p': - zopt_pool = strdup(optarg); + (void) strlcpy(zo->zo_pool, optarg, + sizeof (zo->zo_pool)); break; case 'f': - zopt_dir = strdup(optarg); + path = realpath(optarg, NULL); + if (path == NULL) { + (void) fprintf(stderr, "error: %s: %s\n", + optarg, strerror(errno)); + usage(B_FALSE); + } else { + (void) strlcpy(zo->zo_dir, path, + sizeof (zo->zo_dir)); + } break; case 'V': - zopt_verbose++; + zo->zo_verbose++; break; case 'E': - zopt_init = 0; + zo->zo_init = 0; break; case 'T': - zopt_time = value; + zo->zo_time = value; break; case 'P': - zopt_passtime = MAX(1, value); + zo->zo_passtime = MAX(1, value); break; case 'F': - zopt_maxloops = MAX(1, value); + zo->zo_maxloops = MAX(1, value); + break; + case 'B': + (void) strlcpy(altdir, optarg, sizeof (altdir)); break; case 'h': usage(B_TRUE); @@ -613,17 +696,59 @@ process_options(int argc, char **argv) } } - zopt_raidz_parity = MIN(zopt_raidz_parity, zopt_raidz - 1); + zo->zo_raidz_parity = MIN(zo->zo_raidz_parity, zo->zo_raidz - 1); - zopt_vdevtime = (zopt_vdevs > 0 ? zopt_time * NANOSEC / zopt_vdevs : + zo->zo_vdevtime = + (zo->zo_vdevs > 0 ? zo->zo_time * NANOSEC / zo->zo_vdevs : UINT64_MAX >> 2); + + if (strlen(altdir) > 0) { + char cmd[MAXNAMELEN]; + char realaltdir[MAXNAMELEN]; + char *bin; + char *ztest; + char *isa; + int isalen; + + (void) realpath(getexecname(), cmd); + if (0 != access(altdir, F_OK)) { + ztest_dump_core = B_FALSE; + fatal(B_TRUE, "invalid alternate ztest path: %s", + altdir); + } + VERIFY(NULL != realpath(altdir, realaltdir)); + + /* + * 'cmd' should be of the form "/usr/bin//ztest". + * We want to extract to determine if we should use + * 32 or 64 bit binaries. + */ + bin = strstr(cmd, "/usr/bin/"); + ztest = strstr(bin, "/ztest"); + isa = bin + 9; + isalen = ztest - isa; + (void) snprintf(zo->zo_alt_ztest, sizeof (zo->zo_alt_ztest), + "%s/usr/bin/%.*s/ztest", realaltdir, isalen, isa); + (void) snprintf(zo->zo_alt_libpath, sizeof (zo->zo_alt_libpath), + "%s/usr/lib/%.*s", realaltdir, isalen, isa); + + if (0 != access(zo->zo_alt_ztest, X_OK)) { + ztest_dump_core = B_FALSE; + fatal(B_TRUE, "invalid alternate ztest: %s", + zo->zo_alt_ztest); + } else if (0 != access(zo->zo_alt_libpath, X_OK)) { + ztest_dump_core = B_FALSE; + fatal(B_TRUE, "invalid alternate lib directory %s", + zo->zo_alt_libpath); + } + } } static void ztest_kill(ztest_shared_t *zs) { - zs->zs_alloc = metaslab_class_get_alloc(spa_normal_class(zs->zs_spa)); - zs->zs_space = metaslab_class_get_space(spa_normal_class(zs->zs_spa)); + zs->zs_alloc = metaslab_class_get_alloc(spa_normal_class(ztest_spa)); + zs->zs_space = metaslab_class_get_space(spa_normal_class(ztest_spa)); (void) kill(getpid(), SIGKILL); } @@ -635,7 +760,7 @@ ztest_random(uint64_t range) if (range == 0) return (0); - if (read(ztest_random_fd, &r, sizeof (r)) != sizeof (r)) + if (read(ZTEST_FD_RAND, &r, sizeof (r)) != sizeof (r)) fatal(1, "short read from /dev/urandom"); return (r % range); @@ -651,9 +776,9 @@ ztest_record_enospc(const char *s) static uint64_t ztest_get_ashift(void) { - if (zopt_ashift == 0) + if (ztest_opts.zo_ashift == 0) return (SPA_MINBLOCKSHIFT + ztest_random(3)); - return (zopt_ashift); + return (ztest_opts.zo_ashift); } static nvlist_t * @@ -671,12 +796,14 @@ make_vdev_file(char *path, char *aux, size_t size, uint64_t ashift) if (aux != NULL) { vdev = ztest_shared->zs_vdev_aux; - (void) sprintf(path, ztest_aux_template, - zopt_dir, zopt_pool, aux, vdev); + (void) snprintf(path, sizeof (pathbuf), + ztest_aux_template, ztest_opts.zo_dir, + ztest_opts.zo_pool, aux, vdev); } else { vdev = ztest_shared->zs_vdev_next_leaf++; - (void) sprintf(path, ztest_dev_template, - zopt_dir, zopt_pool, vdev); + (void) snprintf(path, sizeof (pathbuf), + ztest_dev_template, ztest_opts.zo_dir, + ztest_opts.zo_pool, vdev); } } @@ -714,7 +841,7 @@ make_vdev_raidz(char *path, char *aux, size_t size, uint64_t ashift, int r) VERIFY(nvlist_add_string(raidz, ZPOOL_CONFIG_TYPE, VDEV_TYPE_RAIDZ) == 0); VERIFY(nvlist_add_uint64(raidz, ZPOOL_CONFIG_NPARITY, - zopt_raidz_parity) == 0); + ztest_opts.zo_raidz_parity) == 0); VERIFY(nvlist_add_nvlist_array(raidz, ZPOOL_CONFIG_CHILDREN, child, r) == 0); @@ -852,7 +979,7 @@ ztest_dsl_prop_set_uint64(char *osname, zfs_prop_t prop, uint64_t value, VERIFY3U(dsl_prop_get(osname, propname, sizeof (curval), 1, &curval, setpoint), ==, 0); - if (zopt_verbose >= 6) { + if (ztest_opts.zo_verbose >= 6) { VERIFY(zfs_prop_index_to_string(prop, curval, &valname) == 0); (void) printf("%s %s = %s at '%s'\n", osname, propname, valname, setpoint); @@ -862,9 +989,9 @@ ztest_dsl_prop_set_uint64(char *osname, zfs_prop_t prop, uint64_t value, } static int -ztest_spa_prop_set_uint64(ztest_shared_t *zs, zpool_prop_t prop, uint64_t value) +ztest_spa_prop_set_uint64(zpool_prop_t prop, uint64_t value) { - spa_t *spa = zs->zs_spa; + spa_t *spa = ztest_spa; nvlist_t *props = NULL; int error; @@ -986,13 +1113,16 @@ ztest_range_unlock(rl_t *rl) } static void -ztest_zd_init(ztest_ds_t *zd, objset_t *os) +ztest_zd_init(ztest_ds_t *zd, ztest_shared_ds_t *szd, objset_t *os) { zd->zd_os = os; zd->zd_zilog = dmu_objset_zil(os); - zd->zd_seq = 0; + zd->zd_shared = szd; dmu_objset_name(os, zd->zd_name); + if (zd->zd_shared != NULL) + zd->zd_shared->zd_seq = 0; + VERIFY(rwlock_init(&zd->zd_zilog_lock, USYNC_THREAD, NULL) == 0); VERIFY(_mutex_init(&zd->zd_dirobj_lock, USYNC_THREAD, NULL) == 0); @@ -2076,8 +2206,9 @@ ztest_zil_commit(ztest_ds_t *zd, uint64_t id) * will verify that the log really does contain this record. */ mutex_enter(&zilog->zl_lock); - ASSERT(zd->zd_seq <= zilog->zl_commit_lr_seq); - zd->zd_seq = zilog->zl_commit_lr_seq; + ASSERT(zd->zd_shared != NULL); + ASSERT3U(zd->zd_shared->zd_seq, <=, zilog->zl_commit_lr_seq); + zd->zd_shared->zd_seq = zilog->zl_commit_lr_seq; mutex_exit(&zilog->zl_lock); (void) rw_unlock(&zd->zd_zilog_lock); @@ -2114,7 +2245,7 @@ ztest_zil_remount(ztest_ds_t *zd, uint64_t id) void ztest_spa_create_destroy(ztest_ds_t *zd, uint64_t id) { - ztest_shared_t *zs = ztest_shared; + ztest_shared_opts_t *zo = &ztest_opts; spa_t *spa; nvlist_t *nvroot; @@ -2138,15 +2269,15 @@ ztest_spa_create_destroy(ztest_ds_t *zd, uint64_t id) * Attempt to create an existing pool. It shouldn't matter * what's in the nvroot; we should fail with EEXIST. */ - (void) rw_rdlock(&zs->zs_name_lock); + (void) rw_rdlock(&ztest_name_lock); nvroot = make_vdev_root("/dev/bogus", NULL, 0, 0, 0, 0, 0, 1); - VERIFY3U(EEXIST, ==, spa_create(zs->zs_pool, nvroot, NULL, NULL, NULL)); + VERIFY3U(EEXIST, ==, spa_create(zo->zo_pool, nvroot, NULL, NULL, NULL)); nvlist_free(nvroot); - VERIFY3U(0, ==, spa_open(zs->zs_pool, &spa, FTAG)); - VERIFY3U(EBUSY, ==, spa_destroy(zs->zs_pool)); + VERIFY3U(0, ==, spa_open(zo->zo_pool, &spa, FTAG)); + VERIFY3U(EBUSY, ==, spa_destroy(zo->zo_pool)); spa_close(spa, FTAG); - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); } static vdev_t * @@ -2193,14 +2324,15 @@ void ztest_vdev_add_remove(ztest_ds_t *zd, uint64_t id) { ztest_shared_t *zs = ztest_shared; - spa_t *spa = zs->zs_spa; + spa_t *spa = ztest_spa; uint64_t leaves; uint64_t guid; nvlist_t *nvroot; int error; - VERIFY(mutex_lock(&zs->zs_vdev_lock) == 0); - leaves = MAX(zs->zs_mirrors + zs->zs_splits, 1) * zopt_raidz; + VERIFY(mutex_lock(&ztest_vdev_lock) == 0); + leaves = + MAX(zs->zs_mirrors + zs->zs_splits, 1) * ztest_opts.zo_raidz; spa_config_enter(spa, SCL_VDEV, FTAG, RW_READER); @@ -2225,9 +2357,9 @@ ztest_vdev_add_remove(ztest_ds_t *zd, uint64_t id) * dmu_objset_destroy() to fail with EBUSY thus * leaving the dataset in an inconsistent state. */ - VERIFY(rw_wrlock(&ztest_shared->zs_name_lock) == 0); + VERIFY(rw_wrlock(&ztest_name_lock) == 0); error = spa_vdev_remove(spa, guid, B_FALSE); - VERIFY(rw_unlock(&ztest_shared->zs_name_lock) == 0); + VERIFY(rw_unlock(&ztest_name_lock) == 0); if (error && error != EEXIST) fatal(0, "spa_vdev_remove() = %d", error); @@ -2237,8 +2369,10 @@ ztest_vdev_add_remove(ztest_ds_t *zd, uint64_t id) /* * Make 1/4 of the devices be log devices. */ - nvroot = make_vdev_root(NULL, NULL, zopt_vdev_size, 0, - ztest_random(4) == 0, zopt_raidz, zs->zs_mirrors, 1); + nvroot = make_vdev_root(NULL, NULL, + ztest_opts.zo_vdev_size, 0, + ztest_random(4) == 0, ztest_opts.zo_raidz, + zs->zs_mirrors, 1); error = spa_vdev_add(spa, nvroot); nvlist_free(nvroot); @@ -2249,7 +2383,7 @@ ztest_vdev_add_remove(ztest_ds_t *zd, uint64_t id) fatal(0, "spa_vdev_add() = %d", error); } - VERIFY(mutex_unlock(&ztest_shared->zs_vdev_lock) == 0); + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); } /* @@ -2260,7 +2394,7 @@ void ztest_vdev_aux_add_remove(ztest_ds_t *zd, uint64_t id) { ztest_shared_t *zs = ztest_shared; - spa_t *spa = zs->zs_spa; + spa_t *spa = ztest_spa; vdev_t *rvd = spa->spa_root_vdev; spa_aux_vdev_t *sav; char *aux; @@ -2275,7 +2409,7 @@ ztest_vdev_aux_add_remove(ztest_ds_t *zd, uint64_t id) aux = ZPOOL_CONFIG_L2CACHE; } - VERIFY(mutex_lock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_lock(&ztest_vdev_lock) == 0); spa_config_enter(spa, SCL_VDEV, FTAG, RW_READER); @@ -2292,8 +2426,9 @@ ztest_vdev_aux_add_remove(ztest_ds_t *zd, uint64_t id) for (;;) { char path[MAXPATHLEN]; int c; - (void) sprintf(path, ztest_aux_template, zopt_dir, - zopt_pool, aux, zs->zs_vdev_aux); + (void) snprintf(path, sizeof (path), ztest_aux_template, + ztest_opts.zo_dir, ztest_opts.zo_pool, aux, + zs->zs_vdev_aux); for (c = 0; c < sav->sav_count; c++) if (strcmp(sav->sav_vdevs[c]->vdev_path, path) == 0) @@ -2312,7 +2447,7 @@ ztest_vdev_aux_add_remove(ztest_ds_t *zd, uint64_t id) * Add a new device. */ nvlist_t *nvroot = make_vdev_root(NULL, aux, - (zopt_vdev_size * 5) / 4, 0, 0, 0, 0, 1); + (ztest_opts.zo_vdev_size * 5) / 4, 0, 0, 0, 0, 1); error = spa_vdev_add(spa, nvroot); if (error != 0) fatal(0, "spa_vdev_add(%p) = %d", nvroot, error); @@ -2331,7 +2466,7 @@ ztest_vdev_aux_add_remove(ztest_ds_t *zd, uint64_t id) fatal(0, "spa_vdev_remove(%llu) = %d", guid, error); } - VERIFY(mutex_unlock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); } /* @@ -2342,17 +2477,17 @@ void ztest_split_pool(ztest_ds_t *zd, uint64_t id) { ztest_shared_t *zs = ztest_shared; - spa_t *spa = zs->zs_spa; + spa_t *spa = ztest_spa; vdev_t *rvd = spa->spa_root_vdev; nvlist_t *tree, **child, *config, *split, **schild; uint_t c, children, schildren = 0, lastlogid = 0; int error = 0; - VERIFY(mutex_lock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_lock(&ztest_vdev_lock) == 0); /* ensure we have a useable config; mirrors of raidz aren't supported */ - if (zs->zs_mirrors < 3 || zopt_raidz > 1) { - VERIFY(mutex_unlock(&zs->zs_vdev_lock) == 0); + if (zs->zs_mirrors < 3 || ztest_opts.zo_raidz > 1) { + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); return; } @@ -2411,9 +2546,9 @@ ztest_split_pool(ztest_ds_t *zd, uint64_t id) spa_config_exit(spa, SCL_VDEV, FTAG); - (void) rw_wrlock(&zs->zs_name_lock); + (void) rw_wrlock(&ztest_name_lock); error = spa_vdev_split_mirror(spa, "splitp", config, NULL, B_FALSE); - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); nvlist_free(config); @@ -2426,7 +2561,7 @@ ztest_split_pool(ztest_ds_t *zd, uint64_t id) ++zs->zs_splits; --zs->zs_mirrors; } - VERIFY(mutex_unlock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); } @@ -2438,7 +2573,7 @@ void ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id) { ztest_shared_t *zs = ztest_shared; - spa_t *spa = zs->zs_spa; + spa_t *spa = ztest_spa; spa_aux_vdev_t *sav = &spa->spa_spares; vdev_t *rvd = spa->spa_root_vdev; vdev_t *oldvd, *newvd, *pvd; @@ -2455,8 +2590,8 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id) int oldvd_is_log; int error, expected_error; - VERIFY(mutex_lock(&zs->zs_vdev_lock) == 0); - leaves = MAX(zs->zs_mirrors, 1) * zopt_raidz; + VERIFY(mutex_lock(&ztest_vdev_lock) == 0); + leaves = MAX(zs->zs_mirrors, 1) * ztest_opts.zo_raidz; spa_config_enter(spa, SCL_VDEV, FTAG, RW_READER); @@ -2482,12 +2617,12 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id) if (zs->zs_mirrors >= 1) { ASSERT(oldvd->vdev_ops == &vdev_mirror_ops); ASSERT(oldvd->vdev_children >= zs->zs_mirrors); - oldvd = oldvd->vdev_child[leaf / zopt_raidz]; + oldvd = oldvd->vdev_child[leaf / ztest_opts.zo_raidz]; } - if (zopt_raidz > 1) { + if (ztest_opts.zo_raidz > 1) { ASSERT(oldvd->vdev_ops == &vdev_raidz_ops); - ASSERT(oldvd->vdev_children == zopt_raidz); - oldvd = oldvd->vdev_child[leaf % zopt_raidz]; + ASSERT(oldvd->vdev_children == ztest_opts.zo_raidz); + oldvd = oldvd->vdev_child[leaf % ztest_opts.zo_raidz]; } /* @@ -2516,7 +2651,7 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id) if (error != 0 && error != ENODEV && error != EBUSY && error != ENOTSUP) fatal(0, "detach (%s) returned %d", oldpath, error); - VERIFY(mutex_unlock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); return; } @@ -2530,7 +2665,8 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id) (void) strcpy(newpath, newvd->vdev_path); } else { (void) snprintf(newpath, sizeof (newpath), ztest_dev_template, - zopt_dir, zopt_pool, top * leaves + leaf); + ztest_opts.zo_dir, ztest_opts.zo_pool, + top * leaves + leaf); if (ztest_random(2) == 0) newpath[strlen(newpath) - 1] = 'b'; newvd = vdev_lookup_by_path(rvd, newpath); @@ -2609,7 +2745,7 @@ ztest_vdev_attach_detach(ztest_ds_t *zd, uint64_t id) (longlong_t)newsize, replacing, error, expected_error); } - VERIFY(mutex_unlock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); } /* @@ -2632,7 +2768,7 @@ grow_vdev(vdev_t *vd, void *arg) fsize = lseek(fd, 0, SEEK_END); (void) ftruncate(fd, *newsize); - if (zopt_verbose >= 6) { + if (ztest_opts.zo_verbose >= 6) { (void) printf("%s grew from %lu to %lu bytes\n", vd->vdev_path, (ulong_t)fsize, (ulong_t)*newsize); } @@ -2668,7 +2804,7 @@ online_vdev(vdev_t *vd, void *arg) * vdev_open fails is by checking the returned newstate. */ if (error || newstate != VDEV_STATE_HEALTHY) { - if (zopt_verbose >= 5) { + if (ztest_opts.zo_verbose >= 5) { (void) printf("Unable to expand vdev, state %llu, " "error %d\n", (u_longlong_t)newstate, error); } @@ -2683,7 +2819,7 @@ online_vdev(vdev_t *vd, void *arg) * trying to online it. */ if (generation != spa->spa_config_generation) { - if (zopt_verbose >= 5) { + if (ztest_opts.zo_verbose >= 5) { (void) printf("vdev configuration has changed, " "guid %llu, state %llu, expected gen %llu, " "got gen %llu\n", @@ -2729,8 +2865,7 @@ vdev_walk_tree(vdev_t *vd, vdev_t *(*func)(vdev_t *, void *), void *arg) void ztest_vdev_LUN_growth(ztest_ds_t *zd, uint64_t id) { - ztest_shared_t *zs = ztest_shared; - spa_t *spa = zs->zs_spa; + spa_t *spa = ztest_spa; vdev_t *vd, *tvd; metaslab_class_t *mc; metaslab_group_t *mg; @@ -2738,7 +2873,7 @@ ztest_vdev_LUN_growth(ztest_ds_t *zd, uint64_t id) uint64_t top; uint64_t old_class_space, new_class_space, old_ms_count, new_ms_count; - VERIFY(mutex_lock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_lock(&ztest_vdev_lock) == 0); spa_config_enter(spa, SCL_STATE, spa, RW_READER); top = ztest_random_vdev_top(spa, B_TRUE); @@ -2764,16 +2899,16 @@ ztest_vdev_LUN_growth(ztest_ds_t *zd, uint64_t id) * original size, and it has a valid psize. */ if (tvd->vdev_state != VDEV_STATE_HEALTHY || - psize == 0 || psize >= 4 * zopt_vdev_size) { + psize == 0 || psize >= 4 * ztest_opts.zo_vdev_size) { spa_config_exit(spa, SCL_STATE, spa); - VERIFY(mutex_unlock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); return; } ASSERT(psize > 0); newsize = psize + psize / 8; ASSERT3U(newsize, >, psize); - if (zopt_verbose >= 6) { + if (ztest_opts.zo_verbose >= 6) { (void) printf("Expanding LUN %s from %lu to %lu\n", vd->vdev_path, (ulong_t)psize, (ulong_t)newsize); } @@ -2786,12 +2921,12 @@ ztest_vdev_LUN_growth(ztest_ds_t *zd, uint64_t id) if (vdev_walk_tree(tvd, grow_vdev, &newsize) != NULL || vdev_walk_tree(tvd, online_vdev, NULL) != NULL || tvd->vdev_state != VDEV_STATE_HEALTHY) { - if (zopt_verbose >= 5) { + if (ztest_opts.zo_verbose >= 5) { (void) printf("Could not expand LUN because " "the vdev configuration changed.\n"); } spa_config_exit(spa, SCL_STATE, spa); - VERIFY(mutex_unlock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); return; } @@ -2820,12 +2955,12 @@ ztest_vdev_LUN_growth(ztest_ds_t *zd, uint64_t id) new_class_space = metaslab_class_get_space(mc); if (tvd->vdev_mg != mg || mg->mg_class != mc) { - if (zopt_verbose >= 5) { + if (ztest_opts.zo_verbose >= 5) { (void) printf("Could not verify LUN expansion due to " "intervening vdev offline or remove.\n"); } spa_config_exit(spa, SCL_STATE, spa); - VERIFY(mutex_unlock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); return; } @@ -2843,7 +2978,7 @@ ztest_vdev_LUN_growth(ztest_ds_t *zd, uint64_t id) fatal(0, "LUN expansion failed: class_space %llu <= %llu\n", old_class_space, new_class_space); - if (zopt_verbose >= 5) { + if (ztest_opts.zo_verbose >= 5) { char oldnumbuf[6], newnumbuf[6]; nicenum(old_class_space, oldnumbuf); @@ -2853,7 +2988,7 @@ ztest_vdev_LUN_growth(ztest_ds_t *zd, uint64_t id) } spa_config_exit(spa, SCL_STATE, spa); - VERIFY(mutex_unlock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); } /* @@ -2880,7 +3015,8 @@ ztest_dataset_create(char *dsname) if (err || zilset < 80) return (err); - (void) printf("Setting dataset %s to sync always\n", dsname); + if (ztest_opts.zo_verbose >= 6) + (void) printf("Setting dataset %s to sync always\n", dsname); return (ztest_dsl_prop_set_uint64(dsname, ZFS_PROP_SYNC, ZFS_SYNC_ALWAYS, B_FALSE)); } @@ -2952,7 +3088,6 @@ ztest_snapshot_destroy(char *osname, uint64_t id) void ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id) { - ztest_shared_t *zs = ztest_shared; ztest_ds_t zdtmp; int iters; int error; @@ -2960,10 +3095,10 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id) char name[MAXNAMELEN]; zilog_t *zilog; - (void) rw_rdlock(&zs->zs_name_lock); + (void) rw_rdlock(&ztest_name_lock); (void) snprintf(name, MAXNAMELEN, "%s/temp_%llu", - zs->zs_pool, (u_longlong_t)id); + ztest_opts.zo_pool, (u_longlong_t)id); /* * If this dataset exists from a previous run, process its replay log @@ -2972,7 +3107,7 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id) */ if (ztest_random(2) == 0 && dmu_objset_own(name, DMU_OST_OTHER, B_FALSE, FTAG, &os) == 0) { - ztest_zd_init(&zdtmp, os); + ztest_zd_init(&zdtmp, NULL, os); zil_replay(os, &zdtmp, ztest_replay_vector); ztest_zd_fini(&zdtmp); dmu_objset_disown(os, FTAG); @@ -2998,7 +3133,7 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id) if (error) { if (error == ENOSPC) { ztest_record_enospc(FTAG); - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); return; } fatal(0, "dmu_objset_create(%s) = %d", name, error); @@ -3007,7 +3142,7 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id) VERIFY3U(0, ==, dmu_objset_own(name, DMU_OST_OTHER, B_FALSE, FTAG, &os)); - ztest_zd_init(&zdtmp, os); + ztest_zd_init(&zdtmp, NULL, os); /* * Open the intent log for it. @@ -3047,7 +3182,7 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id) dmu_objset_disown(os, FTAG); ztest_zd_fini(&zdtmp); - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); } /* @@ -3056,12 +3191,10 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id) void ztest_dmu_snapshot_create_destroy(ztest_ds_t *zd, uint64_t id) { - ztest_shared_t *zs = ztest_shared; - - (void) rw_rdlock(&zs->zs_name_lock); + (void) rw_rdlock(&ztest_name_lock); (void) ztest_snapshot_destroy(zd->zd_name, id); (void) ztest_snapshot_create(zd->zd_name, id); - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); } /* @@ -3106,7 +3239,6 @@ ztest_dsl_dataset_cleanup(char *osname, uint64_t id) void ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id) { - ztest_shared_t *zs = ztest_shared; objset_t *clone; dsl_dataset_t *ds; char snap1name[MAXNAMELEN]; @@ -3117,7 +3249,7 @@ ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id) char *osname = zd->zd_name; int error; - (void) rw_rdlock(&zs->zs_name_lock); + (void) rw_rdlock(&ztest_name_lock); ztest_dsl_dataset_cleanup(osname, id); @@ -3197,7 +3329,7 @@ ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id) out: ztest_dsl_dataset_cleanup(osname, id); - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); } /* @@ -3396,7 +3528,7 @@ ztest_dmu_read_write(ztest_ds_t *zd, uint64_t id) dmu_write(os, packobj, packoff, packsize, packbuf, tx); if (freeit) { - if (zopt_verbose >= 7) { + if (ztest_opts.zo_verbose >= 7) { (void) printf("freeing offset %llx size %llx" " txg %llx\n", (u_longlong_t)bigoff, @@ -3405,7 +3537,7 @@ ztest_dmu_read_write(ztest_ds_t *zd, uint64_t id) } VERIFY(0 == dmu_free_range(os, bigobj, bigoff, bigsize, tx)); } else { - if (zopt_verbose >= 7) { + if (ztest_opts.zo_verbose >= 7) { (void) printf("writing offset %llx size %llx" " txg %llx\n", (u_longlong_t)bigoff, @@ -3643,7 +3775,7 @@ ztest_dmu_read_write_zcopy(ztest_ds_t *zd, uint64_t id) * Now write them out. */ dmu_write(os, packobj, packoff, packsize, packbuf, tx); - if (zopt_verbose >= 7) { + if (ztest_opts.zo_verbose >= 7) { (void) printf("writing offset %llx size %llx" " txg %llx\n", (u_longlong_t)bigoff, @@ -4284,37 +4416,35 @@ ztest_dsl_prop_get_set(ztest_ds_t *zd, uint64_t id) ZFS_PROP_COPIES, ZFS_PROP_DEDUP }; - ztest_shared_t *zs = ztest_shared; - (void) rw_rdlock(&zs->zs_name_lock); + (void) rw_rdlock(&ztest_name_lock); for (int p = 0; p < sizeof (proplist) / sizeof (proplist[0]); p++) (void) ztest_dsl_prop_set_uint64(zd->zd_name, proplist[p], ztest_random_dsl_prop(proplist[p]), (int)ztest_random(2)); - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); } /* ARGSUSED */ void ztest_spa_prop_get_set(ztest_ds_t *zd, uint64_t id) { - ztest_shared_t *zs = ztest_shared; nvlist_t *props = NULL; - (void) rw_rdlock(&zs->zs_name_lock); + (void) rw_rdlock(&ztest_name_lock); - (void) ztest_spa_prop_set_uint64(zs, ZPOOL_PROP_DEDUPDITTO, + (void) ztest_spa_prop_set_uint64(ZPOOL_PROP_DEDUPDITTO, ZIO_DEDUPDITTO_MIN + ztest_random(ZIO_DEDUPDITTO_MIN)); - VERIFY3U(spa_prop_get(zs->zs_spa, &props), ==, 0); + VERIFY3U(spa_prop_get(ztest_spa, &props), ==, 0); - if (zopt_verbose >= 6) + if (ztest_opts.zo_verbose >= 6) dump_nvlist(props, 4); nvlist_free(props); - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); } /* @@ -4332,7 +4462,7 @@ ztest_dmu_snapshot_hold(ztest_ds_t *zd, uint64_t id) char tag[100]; char osname[MAXNAMELEN]; - (void) rw_rdlock(&ztest_shared->zs_name_lock); + (void) rw_rdlock(&ztest_name_lock); dmu_objset_name(os, osname); @@ -4429,7 +4559,7 @@ ztest_dmu_snapshot_hold(ztest_ds_t *zd, uint64_t id) VERIFY(dmu_objset_hold(fullname, FTAG, &origin) == ENOENT); out: - (void) rw_unlock(&ztest_shared->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); } /* @@ -4440,7 +4570,7 @@ void ztest_fault_inject(ztest_ds_t *zd, uint64_t id) { ztest_shared_t *zs = ztest_shared; - spa_t *spa = zs->zs_spa; + spa_t *spa = ztest_spa; int fd; uint64_t offset; uint64_t leaves; @@ -4457,11 +4587,11 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id) uint64_t guid0 = 0; boolean_t islog = B_FALSE; - VERIFY(mutex_lock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_lock(&ztest_vdev_lock) == 0); maxfaults = MAXFAULTS(); - leaves = MAX(zs->zs_mirrors, 1) * zopt_raidz; + leaves = MAX(zs->zs_mirrors, 1) * ztest_opts.zo_raidz; mirror_save = zs->zs_mirrors; - VERIFY(mutex_unlock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); ASSERT(leaves >= 1); @@ -4484,9 +4614,11 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id) * and we'll write random garbage to the randomly chosen leaf. */ (void) snprintf(path0, sizeof (path0), ztest_dev_template, - zopt_dir, zopt_pool, top * leaves + zs->zs_splits); + ztest_opts.zo_dir, ztest_opts.zo_pool, + top * leaves + zs->zs_splits); (void) snprintf(pathrand, sizeof (pathrand), ztest_dev_template, - zopt_dir, zopt_pool, top * leaves + leaf); + ztest_opts.zo_dir, ztest_opts.zo_pool, + top * leaves + leaf); vd0 = vdev_lookup_by_path(spa->spa_root_vdev, path0); if (vd0 != NULL && vd0->vdev_top->vdev_islog) @@ -4555,12 +4687,12 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id) * leaving the dataset in an inconsistent state. */ if (islog) - (void) rw_wrlock(&ztest_shared->zs_name_lock); + (void) rw_wrlock(&ztest_name_lock); VERIFY(vdev_offline(spa, guid0, flags) != EBUSY); if (islog) - (void) rw_unlock(&ztest_shared->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); } else { (void) vdev_online(spa, guid0, 0, NULL); } @@ -4587,9 +4719,9 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id) if (offset >= fsize) continue; - VERIFY(mutex_lock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_lock(&ztest_vdev_lock) == 0); if (mirror_save != zs->zs_mirrors) { - VERIFY(mutex_unlock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); (void) close(fd); return; } @@ -4598,9 +4730,9 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id) fatal(1, "can't inject bad word at 0x%llx in %s", offset, pathrand); - VERIFY(mutex_unlock(&zs->zs_vdev_lock) == 0); + VERIFY(mutex_unlock(&ztest_vdev_lock) == 0); - if (zopt_verbose >= 7) + if (ztest_opts.zo_verbose >= 7) (void) printf("injected bad word into %s," " offset 0x%llx\n", pathrand, (u_longlong_t)offset); } @@ -4615,7 +4747,7 @@ void ztest_ddt_repair(ztest_ds_t *zd, uint64_t id) { ztest_shared_t *zs = ztest_shared; - spa_t *spa = zs->zs_spa; + spa_t *spa = ztest_spa; objset_t *os = zd->zd_os; ztest_od_t od[1]; uint64_t object, blocksize, txg, pattern, psize; @@ -4638,13 +4770,13 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id) * Take the name lock as writer to prevent anyone else from changing * the pool and dataset properies we need to maintain during this test. */ - (void) rw_wrlock(&zs->zs_name_lock); + (void) rw_wrlock(&ztest_name_lock); if (ztest_dsl_prop_set_uint64(zd->zd_name, ZFS_PROP_DEDUP, checksum, B_FALSE) != 0 || ztest_dsl_prop_set_uint64(zd->zd_name, ZFS_PROP_COPIES, 1, B_FALSE) != 0) { - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); return; } @@ -4658,7 +4790,7 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id) dmu_tx_hold_write(tx, object, 0, copies * blocksize); txg = ztest_tx_assign(tx, TXG_WAIT, FTAG); if (txg == 0) { - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); return; } @@ -4702,7 +4834,7 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id) zio_buf_free(buf, psize); - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); } /* @@ -4712,8 +4844,7 @@ ztest_ddt_repair(ztest_ds_t *zd, uint64_t id) void ztest_scrub(ztest_ds_t *zd, uint64_t id) { - ztest_shared_t *zs = ztest_shared; - spa_t *spa = zs->zs_spa; + spa_t *spa = ztest_spa; (void) spa_scan(spa, POOL_SCAN_SCRUB); (void) poll(NULL, 0, 100); /* wait a moment, then force a restart */ @@ -4727,8 +4858,7 @@ ztest_scrub(ztest_ds_t *zd, uint64_t id) void ztest_reguid(ztest_ds_t *zd, uint64_t id) { - ztest_shared_t *zs = ztest_shared; - spa_t *spa = zs->zs_spa; + spa_t *spa = ztest_spa; uint64_t orig, load; orig = spa_guid(spa); @@ -4736,7 +4866,7 @@ ztest_reguid(ztest_ds_t *zd, uint64_t id) if (spa_change_guid(spa) != 0) return; - if (zopt_verbose >= 3) { + if (ztest_opts.zo_verbose >= 3) { (void) printf("Changed guid old %llu -> %llu\n", (u_longlong_t)orig, (u_longlong_t)spa_guid(spa)); } @@ -4752,13 +4882,12 @@ ztest_reguid(ztest_ds_t *zd, uint64_t id) void ztest_spa_rename(ztest_ds_t *zd, uint64_t id) { - ztest_shared_t *zs = ztest_shared; char *oldname, *newname; spa_t *spa; - (void) rw_wrlock(&zs->zs_name_lock); + (void) rw_wrlock(&ztest_name_lock); - oldname = zs->zs_pool; + oldname = ztest_opts.zo_pool; newname = umem_alloc(strlen(oldname) + 5, UMEM_NOFAIL); (void) strcpy(newname, oldname); (void) strcat(newname, "_tmp"); @@ -4778,7 +4907,7 @@ ztest_spa_rename(ztest_ds_t *zd, uint64_t id) */ VERIFY3U(0, ==, spa_open(newname, &spa, FTAG)); - ASSERT(spa == zs->zs_spa); + ASSERT(spa == ztest_spa); spa_close(spa, FTAG); /* @@ -4791,12 +4920,12 @@ ztest_spa_rename(ztest_ds_t *zd, uint64_t id) */ VERIFY3U(0, ==, spa_open(oldname, &spa, FTAG)); - ASSERT(spa == zs->zs_spa); + ASSERT(spa == ztest_spa); spa_close(spa, FTAG); umem_free(newname, strlen(newname) + 1); - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); } /* @@ -4827,20 +4956,20 @@ ztest_run_zdb(char *pool) "/usr/sbin%.*s/zdb -bcc%s%s -U %s %s", isalen, isa, - zopt_verbose >= 3 ? "s" : "", - zopt_verbose >= 4 ? "v" : "", + ztest_opts.zo_verbose >= 3 ? "s" : "", + ztest_opts.zo_verbose >= 4 ? "v" : "", spa_config_path, pool); free(isa); - if (zopt_verbose >= 5) + if (ztest_opts.zo_verbose >= 5) (void) printf("Executing %s\n", strstr(zdb, "zdb ")); fp = popen(zdb, "r"); assert(fp != NULL); while (fgets(zbuf, sizeof (zbuf), fp) != NULL) - if (zopt_verbose >= 3) + if (ztest_opts.zo_verbose >= 3) (void) printf("%s", zbuf); status = pclose(fp); @@ -4860,12 +4989,12 @@ ztest_walk_pool_directory(char *header) { spa_t *spa = NULL; - if (zopt_verbose >= 6) + if (ztest_opts.zo_verbose >= 6) (void) printf("%s\n", header); mutex_enter(&spa_namespace_lock); while ((spa = spa_next(spa)) != NULL) - if (zopt_verbose >= 6) + if (ztest_opts.zo_verbose >= 6) (void) printf("\t%s\n", spa_name(spa)); mutex_exit(&spa_namespace_lock); } @@ -4877,7 +5006,7 @@ ztest_spa_import_export(char *oldname, char *newname) uint64_t pool_guid; spa_t *spa; - if (zopt_verbose >= 4) { + if (ztest_opts.zo_verbose >= 4) { (void) printf("import/export: old = %s, new = %s\n", oldname, newname); } @@ -4952,7 +5081,7 @@ ztest_spa_import_export(char *oldname, char *newname) static void ztest_resume(spa_t *spa) { - if (spa_suspended(spa) && zopt_verbose >= 6) + if (spa_suspended(spa) && ztest_opts.zo_verbose >= 6) (void) printf("resuming from suspended state\n"); spa_vdev_state_enter(spa, SCL_NONE); vdev_clear(spa, NULL); @@ -4990,10 +5119,10 @@ ztest_deadman_thread(void *arg) } static void -ztest_execute(ztest_info_t *zi, uint64_t id) +ztest_execute(int test, ztest_info_t *zi, uint64_t id) { - ztest_shared_t *zs = ztest_shared; - ztest_ds_t *zd = &zs->zs_zd[id % zopt_datasets]; + ztest_ds_t *zd = &ztest_ds[id % ztest_opts.zo_datasets]; + ztest_shared_callstate_t *zc = ZTEST_GET_SHARED_CALLSTATE(test); hrtime_t functime = gethrtime(); for (int i = 0; i < zi->zi_iters; i++) @@ -5001,10 +5130,10 @@ ztest_execute(ztest_info_t *zi, uint64_t id) functime = gethrtime() - functime; - atomic_add_64(&zi->zi_call_count, 1); - atomic_add_64(&zi->zi_call_time, functime); + atomic_add_64(&zc->zc_count, 1); + atomic_add_64(&zc->zc_time, functime); - if (zopt_verbose >= 4) { + if (ztest_opts.zo_verbose >= 4) { Dl_info dli; (void) dladdr((void *)zi->zi_func, &dli); (void) printf("%6.2f sec in %s\n", @@ -5015,11 +5144,13 @@ ztest_execute(ztest_info_t *zi, uint64_t id) static void * ztest_thread(void *arg) { + int rand; uint64_t id = (uintptr_t)arg; ztest_shared_t *zs = ztest_shared; uint64_t call_next; hrtime_t now; ztest_info_t *zi; + ztest_shared_callstate_t *zc; while ((now = gethrtime()) < zs->zs_thread_stop) { /* @@ -5037,13 +5168,16 @@ ztest_thread(void *arg) /* * Pick a random function to execute. */ - zi = &zs->zs_info[ztest_random(ZTEST_FUNCS)]; - call_next = zi->zi_call_next; + rand = ztest_random(ZTEST_FUNCS); + zi = &ztest_info[rand]; + zc = ZTEST_GET_SHARED_CALLSTATE(rand); + call_next = zc->zc_next; if (now >= call_next && - atomic_cas_64(&zi->zi_call_next, call_next, call_next + - ztest_random(2 * zi->zi_interval[0] + 1)) == call_next) - ztest_execute(zi, id); + atomic_cas_64(&zc->zc_next, call_next, call_next + + ztest_random(2 * zi->zi_interval[0] + 1)) == call_next) { + ztest_execute(rand, zi, id); + } } return (NULL); @@ -5056,13 +5190,13 @@ ztest_dataset_name(char *dsname, char *pool, int d) } static void -ztest_dataset_destroy(ztest_shared_t *zs, int d) +ztest_dataset_destroy(int d) { char name[MAXNAMELEN]; - ztest_dataset_name(name, zs->zs_pool, d); + ztest_dataset_name(name, ztest_opts.zo_pool, d); - if (zopt_verbose >= 3) + if (ztest_opts.zo_verbose >= 3) (void) printf("Destroying %s to free up space\n", name); /* @@ -5070,8 +5204,10 @@ ztest_dataset_destroy(ztest_shared_t *zs, int d) * ztest thread t operates on dataset (t % zopt_datasets), * so there may be more than one thing to clean up. */ - for (int t = d; t < zopt_threads; t += zopt_datasets) + for (int t = d; t < ztest_opts.zo_threads; + t += ztest_opts.zo_datasets) { ztest_dsl_dataset_cleanup(name, t); + } (void) dmu_objset_find(name, ztest_objset_destroy_cb, NULL, DS_FIND_SNAPSHOTS | DS_FIND_CHILDREN); @@ -5099,31 +5235,31 @@ ztest_dataset_dirobj_verify(ztest_ds_t *zd) } static int -ztest_dataset_open(ztest_shared_t *zs, int d) +ztest_dataset_open(int d) { - ztest_ds_t *zd = &zs->zs_zd[d]; - uint64_t committed_seq = zd->zd_seq; + ztest_ds_t *zd = &ztest_ds[d]; + uint64_t committed_seq = ZTEST_GET_SHARED_DS(d)->zd_seq; objset_t *os; zilog_t *zilog; char name[MAXNAMELEN]; int error; - ztest_dataset_name(name, zs->zs_pool, d); + ztest_dataset_name(name, ztest_opts.zo_pool, d); - (void) rw_rdlock(&zs->zs_name_lock); + (void) rw_rdlock(&ztest_name_lock); error = ztest_dataset_create(name); if (error == ENOSPC) { - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); ztest_record_enospc(FTAG); return (error); } ASSERT(error == 0 || error == EEXIST); VERIFY3U(dmu_objset_hold(name, zd, &os), ==, 0); - (void) rw_unlock(&zs->zs_name_lock); + (void) rw_unlock(&ztest_name_lock); - ztest_zd_init(zd, os); + ztest_zd_init(zd, ZTEST_GET_SHARED_DS(d), os); zilog = zd->zd_zilog; @@ -5138,7 +5274,7 @@ ztest_dataset_open(ztest_shared_t *zs, int d) ztest_dataset_dirobj_verify(zd); - if (zopt_verbose >= 6) + if (ztest_opts.zo_verbose >= 6) (void) printf("%s replay %llu blocks, %llu records, seq %llu\n", zd->zd_name, (u_longlong_t)zilog->zl_parse_blk_count, @@ -5156,9 +5292,9 @@ ztest_dataset_open(ztest_shared_t *zs, int d) } static void -ztest_dataset_close(ztest_shared_t *zs, int d) +ztest_dataset_close(int d) { - ztest_ds_t *zd = &zs->zs_zd[d]; + ztest_ds_t *zd = &ztest_ds[d]; zil_close(zd->zd_zilog); dmu_objset_rele(zd->zd_os, zd); @@ -5183,15 +5319,18 @@ ztest_run(ztest_shared_t *zs) /* * Initialize parent/child shared state. */ - VERIFY(_mutex_init(&zs->zs_vdev_lock, USYNC_THREAD, NULL) == 0); - VERIFY(rwlock_init(&zs->zs_name_lock, USYNC_THREAD, NULL) == 0); + VERIFY(_mutex_init(&ztest_vdev_lock, USYNC_THREAD, NULL) == 0); + VERIFY(rwlock_init(&ztest_name_lock, USYNC_THREAD, NULL) == 0); zs->zs_thread_start = gethrtime(); - zs->zs_thread_stop = zs->zs_thread_start + zopt_passtime * NANOSEC; + zs->zs_thread_stop = + zs->zs_thread_start + ztest_opts.zo_passtime * NANOSEC; zs->zs_thread_stop = MIN(zs->zs_thread_stop, zs->zs_proc_stop); zs->zs_thread_kill = zs->zs_thread_stop; - if (ztest_random(100) < zopt_killrate) - zs->zs_thread_kill -= ztest_random(zopt_passtime * NANOSEC); + if (ztest_random(100) < ztest_opts.zo_killrate) { + zs->zs_thread_kill -= + ztest_random(ztest_opts.zo_passtime * NANOSEC); + } (void) _mutex_init(&zcl.zcl_callbacks_lock, USYNC_THREAD, NULL); @@ -5202,11 +5341,11 @@ ztest_run(ztest_shared_t *zs) * Open our pool. */ kernel_init(FREAD | FWRITE); - VERIFY(spa_open(zs->zs_pool, &spa, FTAG) == 0); + VERIFY(spa_open(ztest_opts.zo_pool, &spa, FTAG) == 0); spa->spa_debug = B_TRUE; - zs->zs_spa = spa; + ztest_spa = spa; - VERIFY3U(0, ==, dmu_objset_hold(zs->zs_pool, FTAG, &os)); + VERIFY3U(0, ==, dmu_objset_hold(ztest_opts.zo_pool, FTAG, &os)); zs->zs_guid = dmu_objset_fsid_guid(os); dmu_objset_rele(os, FTAG); @@ -5253,21 +5392,23 @@ ztest_run(ztest_shared_t *zs) * If we got any ENOSPC errors on the previous run, destroy something. */ if (zs->zs_enospc_count != 0) { - int d = ztest_random(zopt_datasets); - ztest_dataset_destroy(zs, d); + int d = ztest_random(ztest_opts.zo_datasets); + ztest_dataset_destroy(d); } zs->zs_enospc_count = 0; - tid = umem_zalloc(zopt_threads * sizeof (thread_t), UMEM_NOFAIL); + tid = umem_zalloc(ztest_opts.zo_threads * sizeof (thread_t), + UMEM_NOFAIL); - if (zopt_verbose >= 4) + if (ztest_opts.zo_verbose >= 4) (void) printf("starting main threads...\n"); /* * Kick off all the tests that run in parallel. */ - for (int t = 0; t < zopt_threads; t++) { - if (t < zopt_datasets && ztest_dataset_open(zs, t) != 0) + for (int t = 0; t < ztest_opts.zo_threads; t++) { + if (t < ztest_opts.zo_datasets && + ztest_dataset_open(t) != 0) return; VERIFY(thr_create(0, 0, ztest_thread, (void *)(uintptr_t)t, THR_BOUND, &tid[t]) == 0); @@ -5277,10 +5418,10 @@ ztest_run(ztest_shared_t *zs) * Wait for all of the tests to complete. We go in reverse order * so we don't close datasets while threads are still using them. */ - for (int t = zopt_threads - 1; t >= 0; t--) { + for (int t = ztest_opts.zo_threads - 1; t >= 0; t--) { VERIFY(thr_join(tid[t], NULL, NULL) == 0); - if (t < zopt_datasets) - ztest_dataset_close(zs, t); + if (t < ztest_opts.zo_datasets) + ztest_dataset_close(t); } txg_wait_synced(spa_get_dsl(spa), 0); @@ -5288,7 +5429,7 @@ ztest_run(ztest_shared_t *zs) zs->zs_alloc = metaslab_class_get_alloc(spa_normal_class(spa)); zs->zs_space = metaslab_class_get_space(spa_normal_class(spa)); - umem_free(tid, zopt_threads * sizeof (thread_t)); + umem_free(tid, ztest_opts.zo_threads * sizeof (thread_t)); /* Kill the resume thread */ ztest_exiting = B_TRUE; @@ -5309,7 +5450,7 @@ ztest_run(ztest_shared_t *zs) */ mutex_enter(&spa_namespace_lock); for (spa = spa_next(NULL); spa != NULL; spa = spa_next(spa)) - if (zopt_verbose > 3) + if (ztest_opts.zo_verbose > 3) (void) printf("spa_next: found %s\n", spa_name(spa)); mutex_exit(&spa_namespace_lock); @@ -5319,9 +5460,10 @@ ztest_run(ztest_shared_t *zs) */ if (ztest_random(2) == 0) { char name[MAXNAMELEN]; - (void) snprintf(name, MAXNAMELEN, "%s_import", zs->zs_pool); - ztest_spa_import_export(zs->zs_pool, name); - ztest_spa_import_export(name, zs->zs_pool); + (void) snprintf(name, MAXNAMELEN, "%s_import", + ztest_opts.zo_pool); + ztest_spa_import_export(ztest_opts.zo_pool, name); + ztest_spa_import_export(name, ztest_opts.zo_pool); } kernel_fini(); @@ -5330,23 +5472,23 @@ ztest_run(ztest_shared_t *zs) (void) _mutex_destroy(&zcl.zcl_callbacks_lock); - (void) rwlock_destroy(&zs->zs_name_lock); - (void) _mutex_destroy(&zs->zs_vdev_lock); + (void) rwlock_destroy(&ztest_name_lock); + (void) _mutex_destroy(&ztest_vdev_lock); } static void -ztest_freeze(ztest_shared_t *zs) +ztest_freeze(void) { - ztest_ds_t *zd = &zs->zs_zd[0]; + ztest_ds_t *zd = &ztest_ds[0]; spa_t *spa; int numloops = 0; - if (zopt_verbose >= 3) + if (ztest_opts.zo_verbose >= 3) (void) printf("testing spa_freeze()...\n"); kernel_init(FREAD | FWRITE); - VERIFY3U(0, ==, spa_open(zs->zs_pool, &spa, FTAG)); - VERIFY3U(0, ==, ztest_dataset_open(zs, 0)); + VERIFY3U(0, ==, spa_open(ztest_opts.zo_pool, &spa, FTAG)); + VERIFY3U(0, ==, ztest_dataset_open(0)); /* * Force the first log block to be transactionally allocated. @@ -5373,7 +5515,8 @@ ztest_freeze(ztest_shared_t *zs) * to increase well beyond the last synced value in the uberblock. * The ZIL should be OK with that. */ - while (ztest_random(10) != 0 && numloops++ < zopt_maxloops) { + while (ztest_random(10) != 0 && + numloops++ < ztest_opts.zo_maxloops) { ztest_dmu_write_parallel(zd, 0); ztest_dmu_object_alloc_free(zd, 0); txg_wait_synced(spa_get_dsl(spa), 0); @@ -5388,7 +5531,7 @@ ztest_freeze(ztest_shared_t *zs) /* * Close our dataset and close the pool. */ - ztest_dataset_close(zs, 0); + ztest_dataset_close(0); spa_close(spa, FTAG); kernel_fini(); @@ -5396,9 +5539,9 @@ ztest_freeze(ztest_shared_t *zs) * Open and close the pool and dataset to induce log replay. */ kernel_init(FREAD | FWRITE); - VERIFY3U(0, ==, spa_open(zs->zs_pool, &spa, FTAG)); - VERIFY3U(0, ==, ztest_dataset_open(zs, 0)); - ztest_dataset_close(zs, 0); + VERIFY3U(0, ==, spa_open(ztest_opts.zo_pool, &spa, FTAG)); + VERIFY3U(0, ==, ztest_dataset_open(0)); + ztest_dataset_close(0); spa_close(spa, FTAG); kernel_fini(); } @@ -5433,15 +5576,11 @@ make_random_props() { nvlist_t *props; - if (ztest_random(2) == 0) - return (NULL); - VERIFY(nvlist_alloc(&props, NV_UNIQUE_NAME, 0) == 0); + if (ztest_random(2) == 0) + return (props); VERIFY(nvlist_add_uint64(props, "autoreplace", 1) == 0); - (void) printf("props:\n"); - dump_nvlist(props, 4); - return (props); } @@ -5455,38 +5594,229 @@ ztest_init(ztest_shared_t *zs) spa_t *spa; nvlist_t *nvroot, *props; - VERIFY(_mutex_init(&zs->zs_vdev_lock, USYNC_THREAD, NULL) == 0); - VERIFY(rwlock_init(&zs->zs_name_lock, USYNC_THREAD, NULL) == 0); + VERIFY(_mutex_init(&ztest_vdev_lock, USYNC_THREAD, NULL) == 0); + VERIFY(rwlock_init(&ztest_name_lock, USYNC_THREAD, NULL) == 0); kernel_init(FREAD | FWRITE); /* * Create the storage pool. */ - (void) spa_destroy(zs->zs_pool); + (void) spa_destroy(ztest_opts.zo_pool); ztest_shared->zs_vdev_next_leaf = 0; zs->zs_splits = 0; - zs->zs_mirrors = zopt_mirrors; - nvroot = make_vdev_root(NULL, NULL, zopt_vdev_size, 0, - 0, zopt_raidz, zs->zs_mirrors, 1); + zs->zs_mirrors = ztest_opts.zo_mirrors; + nvroot = make_vdev_root(NULL, NULL, ztest_opts.zo_vdev_size, 0, + 0, ztest_opts.zo_raidz, zs->zs_mirrors, 1); props = make_random_props(); - VERIFY3U(0, ==, spa_create(zs->zs_pool, nvroot, props, NULL, NULL)); + for (int i = 0; i < SPA_FEATURES; i++) { + char buf[1024]; + (void) snprintf(buf, sizeof (buf), "feature@%s", + spa_feature_table[i].fi_uname); + VERIFY3U(0, ==, nvlist_add_uint64(props, buf, 0)); + } + VERIFY3U(0, ==, spa_create(ztest_opts.zo_pool, nvroot, props, + NULL, NULL)); nvlist_free(nvroot); - VERIFY3U(0, ==, spa_open(zs->zs_pool, &spa, FTAG)); - metaslab_sz = 1ULL << spa->spa_root_vdev->vdev_child[0]->vdev_ms_shift; + VERIFY3U(0, ==, spa_open(ztest_opts.zo_pool, &spa, FTAG)); + zs->zs_metaslab_sz = + 1ULL << spa->spa_root_vdev->vdev_child[0]->vdev_ms_shift; + spa_close(spa, FTAG); kernel_fini(); - ztest_run_zdb(zs->zs_pool); + ztest_run_zdb(ztest_opts.zo_pool); - ztest_freeze(zs); + ztest_freeze(); - ztest_run_zdb(zs->zs_pool); + ztest_run_zdb(ztest_opts.zo_pool); - (void) rwlock_destroy(&zs->zs_name_lock); - (void) _mutex_destroy(&zs->zs_vdev_lock); + (void) rwlock_destroy(&ztest_name_lock); + (void) _mutex_destroy(&ztest_vdev_lock); +} + +static void +setup_fds(void) +{ + int fd; +#ifdef illumos + + char *tmp = tempnam(NULL, NULL); + fd = open(tmp, O_RDWR | O_CREAT, 0700); + ASSERT3U(fd, ==, ZTEST_FD_DATA); + (void) unlink(tmp); + free(tmp); +#else + char tmp[MAXPATHLEN]; + + strlcpy(tmp, ztest_opts.zo_dir, MAXPATHLEN); + strlcat(tmp, "/ztest.XXXXXX", MAXPATHLEN); + fd = mkstemp(tmp); + ASSERT3U(fd, ==, ZTEST_FD_DATA); +#endif + + fd = open("/dev/urandom", O_RDONLY); + ASSERT3U(fd, ==, ZTEST_FD_RAND); +} + +static int +shared_data_size(ztest_shared_hdr_t *hdr) +{ + int size; + + size = hdr->zh_hdr_size; + size += hdr->zh_opts_size; + size += hdr->zh_size; + size += hdr->zh_stats_size * hdr->zh_stats_count; + size += hdr->zh_ds_size * hdr->zh_ds_count; + + return (size); +} + +static void +setup_hdr(void) +{ + int size; + ztest_shared_hdr_t *hdr; + +#ifndef illumos + pwrite(ZTEST_FD_DATA, "", 1, 0); +#endif + + hdr = (void *)mmap(0, P2ROUNDUP(sizeof (*hdr), getpagesize()), + PROT_READ | PROT_WRITE, MAP_SHARED, ZTEST_FD_DATA, 0); + ASSERT(hdr != MAP_FAILED); + + VERIFY3U(0, ==, ftruncate(ZTEST_FD_DATA, sizeof (ztest_shared_hdr_t))); + + hdr->zh_hdr_size = sizeof (ztest_shared_hdr_t); + hdr->zh_opts_size = sizeof (ztest_shared_opts_t); + hdr->zh_size = sizeof (ztest_shared_t); + hdr->zh_stats_size = sizeof (ztest_shared_callstate_t); + hdr->zh_stats_count = ZTEST_FUNCS; + hdr->zh_ds_size = sizeof (ztest_shared_ds_t); + hdr->zh_ds_count = ztest_opts.zo_datasets; + + size = shared_data_size(hdr); + VERIFY3U(0, ==, ftruncate(ZTEST_FD_DATA, size)); + + (void) munmap((caddr_t)hdr, P2ROUNDUP(sizeof (*hdr), getpagesize())); +} + +static void +setup_data(void) +{ + int size, offset; + ztest_shared_hdr_t *hdr; + uint8_t *buf; + + hdr = (void *)mmap(0, P2ROUNDUP(sizeof (*hdr), getpagesize()), + PROT_READ, MAP_SHARED, ZTEST_FD_DATA, 0); + ASSERT(hdr != MAP_FAILED); + + size = shared_data_size(hdr); + + (void) munmap((caddr_t)hdr, P2ROUNDUP(sizeof (*hdr), getpagesize())); + hdr = ztest_shared_hdr = (void *)mmap(0, P2ROUNDUP(size, getpagesize()), + PROT_READ | PROT_WRITE, MAP_SHARED, ZTEST_FD_DATA, 0); + ASSERT(hdr != MAP_FAILED); + buf = (uint8_t *)hdr; + + offset = hdr->zh_hdr_size; + ztest_shared_opts = (void *)&buf[offset]; + offset += hdr->zh_opts_size; + ztest_shared = (void *)&buf[offset]; + offset += hdr->zh_size; + ztest_shared_callstate = (void *)&buf[offset]; + offset += hdr->zh_stats_size * hdr->zh_stats_count; + ztest_shared_ds = (void *)&buf[offset]; +} + +static boolean_t +exec_child(char *cmd, char *libpath, boolean_t ignorekill, int *statusp) +{ + pid_t pid; + int status; + char cmdbuf[MAXPATHLEN]; + + pid = fork(); + + if (cmd == NULL) { + (void) strlcpy(cmdbuf, getexecname(), sizeof (cmdbuf)); + cmd = cmdbuf; + } + + if (pid == -1) + fatal(1, "fork failed"); + + if (pid == 0) { /* child */ + char *emptyargv[2] = { cmd, NULL }; + + struct rlimit rl = { 1024, 1024 }; + (void) setrlimit(RLIMIT_NOFILE, &rl); + (void) enable_extended_FILE_stdio(-1, -1); + if (libpath != NULL) + VERIFY(0 == setenv("LD_LIBRARY_PATH", libpath, 1)); +#ifdef illumos + (void) execv(cmd, emptyargv); +#else + (void) execvp(cmd, emptyargv); +#endif + ztest_dump_core = B_FALSE; + fatal(B_TRUE, "exec failed: %s", cmd); + } + + while (waitpid(pid, &status, 0) != pid) + continue; + if (statusp != NULL) + *statusp = status; + + if (WIFEXITED(status)) { + if (WEXITSTATUS(status) != 0) { + (void) fprintf(stderr, "child exited with code %d\n", + WEXITSTATUS(status)); + exit(2); + } + return (B_FALSE); + } else if (WIFSIGNALED(status)) { + if (!ignorekill || WTERMSIG(status) != SIGKILL) { + (void) fprintf(stderr, "child died with signal %d\n", + WTERMSIG(status)); + exit(3); + } + return (B_TRUE); + } else { + (void) fprintf(stderr, "something strange happened to child\n"); + exit(4); + /* NOTREACHED */ + } +} + +static void +ztest_run_init(void) +{ + ztest_shared_t *zs = ztest_shared; + + ASSERT(ztest_opts.zo_init != 0); + + /* + * Blow away any existing copy of zpool.cache + */ + (void) remove(spa_config_path); + + /* + * Create and initialize our storage pool. + */ + for (int i = 1; i <= ztest_opts.zo_init; i++) { + bzero(zs, sizeof (ztest_shared_t)); + if (ztest_opts.zo_verbose >= 3 && + ztest_opts.zo_init != 1) { + (void) printf("ztest_init(), pass %d\n", i); + } + ztest_init(zs); + } } int @@ -5494,63 +5824,92 @@ main(int argc, char **argv) { int kills = 0; int iters = 0; + int older = 0; + int newer = 0; ztest_shared_t *zs; - size_t shared_size; ztest_info_t *zi; + ztest_shared_callstate_t *zc; char timebuf[100]; char numbuf[6]; spa_t *spa; + char cmd[MAXNAMELEN]; + boolean_t hasalt; + + boolean_t ischild = (0 == lseek(ZTEST_FD_DATA, 0, SEEK_CUR)); + ASSERT(ischild || errno == EBADF); (void) setvbuf(stdout, NULL, _IOLBF, 0); - ztest_random_fd = open("/dev/urandom", O_RDONLY); + if (!ischild) { + process_options(argc, argv); - process_options(argc, argv); + setup_fds(); + setup_hdr(); + setup_data(); + bcopy(&ztest_opts, ztest_shared_opts, + sizeof (*ztest_shared_opts)); + } else { + setup_data(); + bcopy(ztest_shared_opts, &ztest_opts, sizeof (ztest_opts)); + } + ASSERT3U(ztest_opts.zo_datasets, ==, ztest_shared_hdr->zh_ds_count); /* Override location of zpool.cache */ - (void) asprintf((char **)&spa_config_path, "%s/zpool.cache", zopt_dir); + (void) asprintf((char **)&spa_config_path, "%s/zpool.cache", + ztest_opts.zo_dir); - /* - * Blow away any existing copy of zpool.cache - */ - if (zopt_init != 0) - (void) remove(spa_config_path); + ztest_ds = umem_alloc(ztest_opts.zo_datasets * sizeof (ztest_ds_t), + UMEM_NOFAIL); + zs = ztest_shared; - shared_size = sizeof (*zs) + zopt_datasets * sizeof (ztest_ds_t); + if (ischild) { + metaslab_gang_bang = ztest_opts.zo_metaslab_gang_bang; + metaslab_df_alloc_threshold = + zs->zs_metaslab_df_alloc_threshold; - zs = ztest_shared = (void *)mmap(0, - P2ROUNDUP(shared_size, getpagesize()), - PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); + if (zs->zs_do_init) + ztest_run_init(); + else + ztest_run(zs); + exit(0); + } - if (zopt_verbose >= 1) { + hasalt = (strlen(ztest_opts.zo_alt_ztest) != 0); + + if (ztest_opts.zo_verbose >= 1) { (void) printf("%llu vdevs, %d datasets, %d threads," " %llu seconds...\n", - (u_longlong_t)zopt_vdevs, zopt_datasets, zopt_threads, - (u_longlong_t)zopt_time); + (u_longlong_t)ztest_opts.zo_vdevs, + ztest_opts.zo_datasets, + ztest_opts.zo_threads, + (u_longlong_t)ztest_opts.zo_time); } - /* - * Create and initialize our storage pool. - */ - for (int i = 1; i <= zopt_init; i++) { - bzero(zs, sizeof (ztest_shared_t)); - if (zopt_verbose >= 3 && zopt_init != 1) - (void) printf("ztest_init(), pass %d\n", i); - zs->zs_pool = zopt_pool; - ztest_init(zs); - } + (void) strlcpy(cmd, getexecname(), sizeof (cmd)); + + zs->zs_do_init = B_TRUE; + if (strlen(ztest_opts.zo_alt_ztest) != 0) { + if (ztest_opts.zo_verbose >= 1) { + (void) printf("Executing older ztest for " + "initialization: %s\n", ztest_opts.zo_alt_ztest); + } + VERIFY(!exec_child(ztest_opts.zo_alt_ztest, + ztest_opts.zo_alt_libpath, B_FALSE, NULL)); + } else { + VERIFY(!exec_child(NULL, NULL, B_FALSE, NULL)); + } + zs->zs_do_init = B_FALSE; - zs->zs_pool = zopt_pool; zs->zs_proc_start = gethrtime(); - zs->zs_proc_stop = zs->zs_proc_start + zopt_time * NANOSEC; + zs->zs_proc_stop = zs->zs_proc_start + ztest_opts.zo_time * NANOSEC; for (int f = 0; f < ZTEST_FUNCS; f++) { - zi = &zs->zs_info[f]; - *zi = ztest_info[f]; + zi = &ztest_info[f]; + zc = ZTEST_GET_SHARED_CALLSTATE(f); if (zs->zs_proc_start + zi->zi_interval[0] > zs->zs_proc_stop) - zi->zi_call_next = UINT64_MAX; + zc->zc_next = UINT64_MAX; else - zi->zi_call_next = zs->zs_proc_start + + zc->zc_next = zs->zs_proc_start + ztest_random(2 * zi->zi_interval[0] + 1); } @@ -5561,60 +5920,43 @@ main(int argc, char **argv) */ while (gethrtime() < zs->zs_proc_stop) { int status; - pid_t pid; + boolean_t killed; /* * Initialize the workload counters for each function. */ for (int f = 0; f < ZTEST_FUNCS; f++) { - zi = &zs->zs_info[f]; - zi->zi_call_count = 0; - zi->zi_call_time = 0; + zc = ZTEST_GET_SHARED_CALLSTATE(f); + zc->zc_count = 0; + zc->zc_time = 0; } /* Set the allocation switch size */ - metaslab_df_alloc_threshold = ztest_random(metaslab_sz / 4) + 1; + zs->zs_metaslab_df_alloc_threshold = + ztest_random(zs->zs_metaslab_sz / 4) + 1; - pid = fork(); - - if (pid == -1) - fatal(1, "fork failed"); - - if (pid == 0) { /* child */ - struct rlimit rl = { 1024, 1024 }; - (void) setrlimit(RLIMIT_NOFILE, &rl); - (void) enable_extended_FILE_stdio(-1, -1); - ztest_run(zs); - exit(0); - } - - while (waitpid(pid, &status, 0) != pid) - continue; - - if (WIFEXITED(status)) { - if (WEXITSTATUS(status) != 0) { - (void) fprintf(stderr, - "child exited with code %d\n", - WEXITSTATUS(status)); - exit(2); + if (!hasalt || ztest_random(2) == 0) { + if (hasalt && ztest_opts.zo_verbose >= 1) { + (void) printf("Executing newer ztest: %s\n", + cmd); } - } else if (WIFSIGNALED(status)) { - if (WTERMSIG(status) != SIGKILL) { - (void) fprintf(stderr, - "child died with signal %d\n", - WTERMSIG(status)); - exit(3); - } - kills++; + newer++; + killed = exec_child(cmd, NULL, B_TRUE, &status); } else { - (void) fprintf(stderr, "something strange happened " - "to child\n"); - exit(4); + if (hasalt && ztest_opts.zo_verbose >= 1) { + (void) printf("Executing older ztest: %s\n", + ztest_opts.zo_alt_ztest); + } + older++; + killed = exec_child(ztest_opts.zo_alt_ztest, + ztest_opts.zo_alt_libpath, B_TRUE, &status); } + if (killed) + kills++; iters++; - if (zopt_verbose >= 1) { + if (ztest_opts.zo_verbose >= 1) { hrtime_t now = gethrtime(); now = MIN(now, zs->zs_proc_stop); @@ -5629,10 +5971,10 @@ main(int argc, char **argv) 100.0 * zs->zs_alloc / zs->zs_space, numbuf, 100.0 * (now - zs->zs_proc_start) / - (zopt_time * NANOSEC), timebuf); + (ztest_opts.zo_time * NANOSEC), timebuf); } - if (zopt_verbose >= 2) { + if (ztest_opts.zo_verbose >= 2) { (void) printf("\nWorkload summary:\n\n"); (void) printf("%7s %9s %s\n", "Calls", "Time", "Function"); @@ -5641,11 +5983,12 @@ main(int argc, char **argv) for (int f = 0; f < ZTEST_FUNCS; f++) { Dl_info dli; - zi = &zs->zs_info[f]; - print_time(zi->zi_call_time, timebuf); + zi = &ztest_info[f]; + zc = ZTEST_GET_SHARED_CALLSTATE(f); + print_time(zc->zc_time, timebuf); (void) dladdr((void *)zi->zi_func, &dli); (void) printf("%7llu %9s %s\n", - (u_longlong_t)zi->zi_call_count, timebuf, + (u_longlong_t)zc->zc_count, timebuf, dli.dli_sname); } (void) printf("\n"); @@ -5657,22 +6000,28 @@ main(int argc, char **argv) * instead of 'ztest'. Do a blind rename in case this happened. */ kernel_init(FREAD); - if (spa_open(zopt_pool, &spa, FTAG) == 0) { + if (spa_open(ztest_opts.zo_pool, &spa, FTAG) == 0) { spa_close(spa, FTAG); } else { char tmpname[MAXNAMELEN]; kernel_fini(); kernel_init(FREAD | FWRITE); (void) snprintf(tmpname, sizeof (tmpname), "%s_tmp", - zopt_pool); - (void) spa_rename(tmpname, zopt_pool); + ztest_opts.zo_pool); + (void) spa_rename(tmpname, ztest_opts.zo_pool); } kernel_fini(); - ztest_run_zdb(zopt_pool); + ztest_run_zdb(ztest_opts.zo_pool); } - if (zopt_verbose >= 1) { + if (ztest_opts.zo_verbose >= 1) { + if (hasalt) { + (void) printf("%d runs of older ztest: %s\n", older, + ztest_opts.zo_alt_ztest); + (void) printf("%d runs of newer ztest: %s\n", newer, + cmd); + } (void) printf("%d killed, %d completed, %.0f%% kill rate\n", kills, iters - kills, (100.0 * kills) / MAX(1, iters)); } diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c index f6c9622c6c8..42b66458d47 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c @@ -24,7 +24,9 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ #include #include @@ -209,6 +211,83 @@ dt_aggregate_lquantizedcmp(int64_t *lhs, int64_t *rhs) return (0); } +static void +dt_aggregate_llquantize(int64_t *existing, int64_t *new, size_t size) +{ + int i; + + for (i = 1; i < size / sizeof (int64_t); i++) + existing[i] = existing[i] + new[i]; +} + +static long double +dt_aggregate_llquantizedsum(int64_t *llquanta) +{ + int64_t arg = *llquanta++; + uint16_t factor = DTRACE_LLQUANTIZE_FACTOR(arg); + uint16_t low = DTRACE_LLQUANTIZE_LOW(arg); + uint16_t high = DTRACE_LLQUANTIZE_HIGH(arg); + uint16_t nsteps = DTRACE_LLQUANTIZE_NSTEP(arg); + int bin = 0, order; + int64_t value = 1, next, step; + long double total; + + assert(nsteps >= factor); + assert(nsteps % factor == 0); + + for (order = 0; order < low; order++) + value *= factor; + + total = (long double)llquanta[bin++] * (long double)(value - 1); + + next = value * factor; + step = next > nsteps ? next / nsteps : 1; + + while (order <= high) { + assert(value < next); + total += (long double)llquanta[bin++] * (long double)(value); + + if ((value += step) != next) + continue; + + next = value * factor; + step = next > nsteps ? next / nsteps : 1; + order++; + } + + return (total + (long double)llquanta[bin] * (long double)value); +} + +static int +dt_aggregate_llquantizedcmp(int64_t *lhs, int64_t *rhs) +{ + long double lsum = dt_aggregate_llquantizedsum(lhs); + long double rsum = dt_aggregate_llquantizedsum(rhs); + int64_t lzero, rzero; + + if (lsum < rsum) + return (DT_LESSTHAN); + + if (lsum > rsum) + return (DT_GREATERTHAN); + + /* + * If they're both equal, then we will compare based on the weights at + * zero. If the weights at zero are equal, then this will be judged a + * tie and will be resolved based on the key comparison. + */ + lzero = lhs[1]; + rzero = rhs[1]; + + if (lzero < rzero) + return (DT_LESSTHAN); + + if (lzero > rzero) + return (DT_GREATERTHAN); + + return (0); +} + static int dt_aggregate_quantizedcmp(int64_t *lhs, int64_t *rhs) { @@ -592,6 +671,10 @@ hashnext: h->dtahe_aggregate = dt_aggregate_lquantize; break; + case DTRACEAGG_LLQUANTIZE: + h->dtahe_aggregate = dt_aggregate_llquantize; + break; + case DTRACEAGG_COUNT: case DTRACEAGG_SUM: case DTRACEAGG_AVG: @@ -859,6 +942,10 @@ dt_aggregate_valcmp(const void *lhs, const void *rhs) rval = dt_aggregate_lquantizedcmp(laddr, raddr); break; + case DTRACEAGG_LLQUANTIZE: + rval = dt_aggregate_llquantizedcmp(laddr, raddr); + break; + case DTRACEAGG_COUNT: case DTRACEAGG_SUM: case DTRACEAGG_MIN: diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_cc.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_cc.c index 5250641b5a2..6714757060c 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_cc.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_cc.c @@ -82,6 +82,7 @@ #include #include +#include #include #include @@ -1369,6 +1370,146 @@ dt_compile_agg(dtrace_hdl_t *dtp, dt_node_t *dnp, dtrace_stmtdesc_t *sdp) argmax = 5; } + if (fid->di_id == DTRACEAGG_LLQUANTIZE) { + /* + * For log/linear quantizations, we have between one and five + * arguments in addition to the expression: + * + * arg1 => Factor + * arg2 => Low magnitude + * arg3 => High magnitude + * arg4 => Number of steps per magnitude + * arg5 => Quantization increment value (defaults to 1) + */ + dt_node_t *llarg = dnp->dn_aggfun->dn_args->dn_list; + uint64_t oarg, order, v; + dt_idsig_t *isp; + int i; + + struct { + char *str; /* string identifier */ + int badtype; /* error on bad type */ + int badval; /* error on bad value */ + int mismatch; /* error on bad match */ + int shift; /* shift value */ + uint16_t value; /* value itself */ + } args[] = { + { "factor", D_LLQUANT_FACTORTYPE, + D_LLQUANT_FACTORVAL, D_LLQUANT_FACTORMATCH, + DTRACE_LLQUANTIZE_FACTORSHIFT }, + { "low magnitude", D_LLQUANT_LOWTYPE, + D_LLQUANT_LOWVAL, D_LLQUANT_LOWMATCH, + DTRACE_LLQUANTIZE_LOWSHIFT }, + { "high magnitude", D_LLQUANT_HIGHTYPE, + D_LLQUANT_HIGHVAL, D_LLQUANT_HIGHMATCH, + DTRACE_LLQUANTIZE_HIGHSHIFT }, + { "linear steps per magnitude", D_LLQUANT_NSTEPTYPE, + D_LLQUANT_NSTEPVAL, D_LLQUANT_NSTEPMATCH, + DTRACE_LLQUANTIZE_NSTEPSHIFT }, + { NULL } + }; + + assert(arg == 0); + + for (i = 0; args[i].str != NULL; i++) { + if (llarg->dn_kind != DT_NODE_INT) { + dnerror(llarg, args[i].badtype, "llquantize( ) " + "argument #%d (%s) must be an " + "integer constant\n", i + 1, args[i].str); + } + + if ((uint64_t)llarg->dn_value > UINT16_MAX) { + dnerror(llarg, args[i].badval, "llquantize( ) " + "argument #%d (%s) must be an unsigned " + "16-bit quantity\n", i + 1, args[i].str); + } + + args[i].value = (uint16_t)llarg->dn_value; + + assert(!(arg & ((uint64_t)UINT16_MAX << + args[i].shift))); + arg |= ((uint64_t)args[i].value << args[i].shift); + llarg = llarg->dn_list; + } + + assert(arg != 0); + + if (args[0].value < 2) { + dnerror(dnp, D_LLQUANT_FACTORSMALL, "llquantize( ) " + "factor (argument #1) must be two or more\n"); + } + + if (args[1].value >= args[2].value) { + dnerror(dnp, D_LLQUANT_MAGRANGE, "llquantize( ) " + "high magnitude (argument #3) must be greater " + "than low magnitude (argument #2)\n"); + } + + if (args[3].value < args[0].value) { + dnerror(dnp, D_LLQUANT_FACTORNSTEPS, "llquantize( ) " + "factor (argument #1) must be less than or " + "equal to the number of linear steps per " + "magnitude (argument #4)\n"); + } + + for (v = args[0].value; v < args[3].value; v *= args[0].value) + continue; + + if ((args[3].value % args[0].value) || (v % args[3].value)) { + dnerror(dnp, D_LLQUANT_FACTOREVEN, "llquantize( ) " + "factor (argument #1) must evenly divide the " + "number of steps per magnitude (argument #4), " + "and the number of steps per magnitude must evenly " + "divide a power of the factor\n"); + } + + for (i = 0, order = 1; i < args[2].value; i++) { + if (order * args[0].value > order) { + order *= args[0].value; + continue; + } + + dnerror(dnp, D_LLQUANT_MAGTOOBIG, "llquantize( ) " + "factor (%d) raised to power of high magnitude " + "(%d) overflows 64-bits\n", args[0].value, + args[2].value); + } + + isp = (dt_idsig_t *)aid->di_data; + + if (isp->dis_auxinfo == 0) { + /* + * This is the first time we've seen an llquantize() + * for this aggregation; we'll store our argument + * as the auxiliary signature information. + */ + isp->dis_auxinfo = arg; + } else if ((oarg = isp->dis_auxinfo) != arg) { + /* + * If we have seen this llquantize() before and the + * argument doesn't match the original argument, pick + * the original argument apart to concisely report the + * mismatch. + */ + int expected = 0, found = 0; + + for (i = 0; expected == found; i++) { + assert(args[i].str != NULL); + + expected = (oarg >> args[i].shift) & UINT16_MAX; + found = (arg >> args[i].shift) & UINT16_MAX; + } + + dnerror(dnp, args[i - 1].mismatch, "llquantize( ) " + "%s (argument #%d) doesn't match previous " + "declaration: expected %d, found %d\n", + args[i - 1].str, i, expected, found); + } + + incr = llarg; + argmax = 6; + } + if (fid->di_id == DTRACEAGG_QUANTIZE) { incr = dnp->dn_aggfun->dn_args->dn_list; argmax = 2; diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c index af4af8a38e4..a4f2de8b379 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c @@ -23,6 +23,10 @@ * Use is subject to license terms. */ +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + #include #include #include @@ -686,6 +690,121 @@ dt_print_lquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr, return (0); } +int +dt_print_llquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr, + size_t size, uint64_t normal) +{ + int i, first_bin, last_bin, bin = 1, order, levels; + uint16_t factor, low, high, nsteps; + const int64_t *data = addr; + int64_t value = 1, next, step; + char positives = 0, negatives = 0; + long double total = 0; + uint64_t arg; + char c[32]; + + if (size < sizeof (uint64_t)) + return (dt_set_errno(dtp, EDT_DMISMATCH)); + + arg = *data++; + size -= sizeof (uint64_t); + + factor = DTRACE_LLQUANTIZE_FACTOR(arg); + low = DTRACE_LLQUANTIZE_LOW(arg); + high = DTRACE_LLQUANTIZE_HIGH(arg); + nsteps = DTRACE_LLQUANTIZE_NSTEP(arg); + + /* + * We don't expect to be handed invalid llquantize() parameters here, + * but sanity check them (to a degree) nonetheless. + */ + if (size > INT32_MAX || factor < 2 || low >= high || + nsteps == 0 || factor > nsteps) + return (dt_set_errno(dtp, EDT_DMISMATCH)); + + levels = (int)size / sizeof (uint64_t); + + first_bin = 0; + last_bin = levels - 1; + + while (first_bin < levels && data[first_bin] == 0) + first_bin++; + + if (first_bin == levels) { + first_bin = 0; + last_bin = 1; + } else { + if (first_bin > 0) + first_bin--; + + while (last_bin > 0 && data[last_bin] == 0) + last_bin--; + + if (last_bin < levels - 1) + last_bin++; + } + + for (i = first_bin; i <= last_bin; i++) { + positives |= (data[i] > 0); + negatives |= (data[i] < 0); + total += dt_fabsl((long double)data[i]); + } + + if (dt_printf(dtp, fp, "\n%16s %41s %-9s\n", "value", + "------------- Distribution -------------", "count") < 0) + return (-1); + + for (order = 0; order < low; order++) + value *= factor; + + next = value * factor; + step = next > nsteps ? next / nsteps : 1; + + if (first_bin == 0) { + (void) snprintf(c, sizeof (c), "< %lld", (long long)value); + + if (dt_printf(dtp, fp, "%16s ", c) < 0) + return (-1); + + if (dt_print_quantline(dtp, fp, data[0], normal, + total, positives, negatives) < 0) + return (-1); + } + + while (order <= high) { + if (bin >= first_bin && bin <= last_bin) { + if (dt_printf(dtp, fp, "%16lld ", (long long)value) < 0) + return (-1); + + if (dt_print_quantline(dtp, fp, data[bin], + normal, total, positives, negatives) < 0) + return (-1); + } + + assert(value < next); + bin++; + + if ((value += step) != next) + continue; + + next = value * factor; + step = next > nsteps ? next / nsteps : 1; + order++; + } + + if (last_bin < bin) + return (0); + + assert(last_bin == bin); + (void) snprintf(c, sizeof (c), ">= %lld", (long long)value); + + if (dt_printf(dtp, fp, "%16s ", c) < 0) + return (-1); + + return (dt_print_quantline(dtp, fp, data[bin], normal, + total, positives, negatives)); +} + /*ARGSUSED*/ static int dt_print_average(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr, @@ -1711,6 +1830,9 @@ dt_print_datum(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec, case DTRACEAGG_LQUANTIZE: return (dt_print_lquantize(dtp, fp, addr, size, normal)); + case DTRACEAGG_LLQUANTIZE: + return (dt_print_llquantize(dtp, fp, addr, size, normal)); + case DTRACEAGG_AVG: return (dt_print_average(dtp, fp, addr, size, normal)); diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_errtags.h b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_errtags.h index 62f95550571..8495f158411 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_errtags.h +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_errtags.h @@ -236,6 +236,23 @@ typedef enum { D_LQUANT_MATCHBASE, /* lquantize() mismatch on base */ D_LQUANT_MATCHLIM, /* lquantize() mismatch on limit */ D_LQUANT_MATCHSTEP, /* lquantize() mismatch on step */ + D_LLQUANT_FACTORTYPE, /* llquantize() bad magnitude type */ + D_LLQUANT_FACTORVAL, /* llquantize() bad magnitude value */ + D_LLQUANT_FACTORMATCH, /* llquantize() mismatch on magnitude */ + D_LLQUANT_LOWTYPE, /* llquantize() bad low mag type */ + D_LLQUANT_LOWVAL, /* llquantize() bad low mag value */ + D_LLQUANT_LOWMATCH, /* llquantize() mismatch on low mag */ + D_LLQUANT_HIGHTYPE, /* llquantize() bad high mag type */ + D_LLQUANT_HIGHVAL, /* llquantize() bad high mag value */ + D_LLQUANT_HIGHMATCH, /* llquantize() mismatch on high mag */ + D_LLQUANT_NSTEPTYPE, /* llquantize() bad # steps type */ + D_LLQUANT_NSTEPVAL, /* llquantize() bad # steps value */ + D_LLQUANT_NSTEPMATCH, /* llquantize() mismatch on # steps */ + D_LLQUANT_MAGRANGE, /* llquantize() bad magnitude range */ + D_LLQUANT_FACTORNSTEPS, /* llquantize() # steps < factor */ + D_LLQUANT_FACTOREVEN, /* llquantize() bad # steps/factor */ + D_LLQUANT_FACTORSMALL, /* llquantize() magnitude too small */ + D_LLQUANT_MAGTOOBIG, /* llquantize() high mag too large */ D_PRINTM_ADDR, /* printm() memref bad type */ D_PRINTM_SIZE, /* printm() size bad type */ D_PRINTT_ADDR, /* printt() typeref bad type */ diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h index bfdaecd0b67..99498d9fd47 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h @@ -24,6 +24,10 @@ * Use is subject to license terms. */ +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + #ifndef _DT_IMPL_H #define _DT_IMPL_H @@ -641,6 +645,8 @@ extern int dt_print_quantize(dtrace_hdl_t *, FILE *, const void *, size_t, uint64_t); extern int dt_print_lquantize(dtrace_hdl_t *, FILE *, const void *, size_t, uint64_t); +extern int dt_print_llquantize(dtrace_hdl_t *, FILE *, + const void *, size_t, uint64_t); extern int dt_print_agg(const dtrace_aggdata_t *, void *); extern int dt_handle(dtrace_hdl_t *, dtrace_probedata_t *); diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c index e77952d4d7e..c2d817a79e6 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c @@ -21,6 +21,7 @@ /* * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, Joyent, Inc. All rights reserved. */ #include @@ -114,8 +115,9 @@ #define DT_VERS_1_6_1 DT_VERSION_NUMBER(1, 6, 1) #define DT_VERS_1_6_2 DT_VERSION_NUMBER(1, 6, 2) #define DT_VERS_1_6_3 DT_VERSION_NUMBER(1, 6, 3) -#define DT_VERS_LATEST DT_VERS_1_6_3 -#define DT_VERS_STRING "Sun D 1.6.3" +#define DT_VERS_1_7 DT_VERSION_NUMBER(1, 7, 0) +#define DT_VERS_LATEST DT_VERS_1_7 +#define DT_VERS_STRING "Sun D 1.7" const dt_version_t _dtrace_versions[] = { DT_VERS_1_0, /* D API 1.0.0 (PSARC 2001/466) Solaris 10 FCS */ @@ -131,6 +133,7 @@ const dt_version_t _dtrace_versions[] = { DT_VERS_1_6_1, /* D API 1.6.1 */ DT_VERS_1_6_2, /* D API 1.6.2 */ DT_VERS_1_6_3, /* D API 1.6.3 */ + DT_VERS_1_7, /* D API 1.7 */ 0 }; @@ -287,6 +290,9 @@ static const dt_ident_t _dtrace_globals[] = { &dt_idops_func, "stack(...)" }, { "lltostr", DT_IDENT_FUNC, 0, DIF_SUBR_LLTOSTR, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_func, "string(int64_t)" }, +{ "llquantize", DT_IDENT_AGGFUNC, 0, DTRACEAGG_LLQUANTIZE, DT_ATTR_STABCMN, + DT_VERS_1_7, &dt_idops_func, + "void(@, int32_t, int32_t, int32_t, int32_t, ...)" }, { "lquantize", DT_IDENT_AGGFUNC, 0, DTRACEAGG_LQUANTIZE, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_func, "void(@, int32_t, int32_t, ...)" }, diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_printf.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_printf.c index 2619818b50b..51f87b03ffd 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_printf.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_printf.c @@ -21,6 +21,7 @@ /* * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, Joyent, Inc. All rights reserved. */ #if defined(sun) @@ -1322,6 +1323,14 @@ pfprint_lquantize(dtrace_hdl_t *dtp, FILE *fp, const char *format, return (dt_print_lquantize(dtp, fp, addr, size, normal)); } +/*ARGSUSED*/ +static int +pfprint_llquantize(dtrace_hdl_t *dtp, FILE *fp, const char *format, + const dt_pfargd_t *pfd, const void *addr, size_t size, uint64_t normal) +{ + return (dt_print_llquantize(dtp, fp, addr, size, normal)); +} + static int dt_printf_format(dtrace_hdl_t *dtp, FILE *fp, const dt_pfargv_t *pfv, const dtrace_recdesc_t *recs, uint_t nrecs, const void *buf, @@ -1507,6 +1516,9 @@ dt_printf_format(dtrace_hdl_t *dtp, FILE *fp, const dt_pfargv_t *pfv, case DTRACEAGG_LQUANTIZE: func = pfprint_lquantize; break; + case DTRACEAGG_LLQUANTIZE: + func = pfprint_llquantize; + break; case DTRACEACT_MOD: func = pfprint_mod; break; diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dtrace.h b/cddl/contrib/opensolaris/lib/libdtrace/common/dtrace.h index 13c27765bd4..eb5ab43b189 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dtrace.h +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dtrace.h @@ -24,11 +24,13 @@ * Use is subject to license terms. */ +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + #ifndef _DTRACE_H #define _DTRACE_H -#pragma ident "%Z%%M% %I% %E% SMI" - #include #include #include diff --git a/cddl/contrib/opensolaris/lib/libnvpair/libnvpair.c b/cddl/contrib/opensolaris/lib/libnvpair/libnvpair.c index 14257487361..3302ac798fd 100644 --- a/cddl/contrib/opensolaris/lib/libnvpair/libnvpair.c +++ b/cddl/contrib/opensolaris/lib/libnvpair/libnvpair.c @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -802,6 +803,10 @@ dump_nvlist(nvlist_t *list, int indent) while ((elem = nvlist_next_nvpair(list, elem)) != NULL) { switch (nvpair_type(elem)) { + case DATA_TYPE_BOOLEAN: + (void) printf("%*s%s\n", indent, "", nvpair_name(elem)); + break; + case DATA_TYPE_BOOLEAN_VALUE: (void) nvpair_value_boolean_value(elem, &bool_value); (void) printf("%*s%s: %s\n", indent, "", diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h index b11356dbff0..a652a9d05ce 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h @@ -24,8 +24,9 @@ * Copyright 2011 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2011 Pawel Jakub Dawidek . * All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. - * All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. + * Copyright (c) 2012 Martin Matuska . All rights reserved. */ #ifndef _LIBZFS_H @@ -236,6 +237,7 @@ typedef struct splitflags { extern int zpool_scan(zpool_handle_t *, pool_scan_func_t); extern int zpool_clear(zpool_handle_t *, const char *, nvlist_t *); extern int zpool_reguid(zpool_handle_t *); +extern int zpool_reopen(zpool_handle_t *); extern int zpool_vdev_online(zpool_handle_t *, const char *, int, vdev_state_t *); @@ -292,6 +294,15 @@ typedef enum { ZPOOL_STATUS_IO_FAILURE_CONTINUE, /* failed I/O, failmode 'continue' */ ZPOOL_STATUS_BAD_LOG, /* cannot read log chain(s) */ + /* + * If the pool has unsupported features but can still be opened in + * read-only mode, its status is ZPOOL_STATUS_UNSUP_FEAT_WRITE. If the + * pool has unsupported features but cannot be opened at all, its + * status is ZPOOL_STATUS_UNSUP_FEAT_READ. + */ + ZPOOL_STATUS_UNSUP_FEAT_READ, /* unsupported features for read */ + ZPOOL_STATUS_UNSUP_FEAT_WRITE, /* unsupported features for write */ + /* * These faults have no corresponding message ID. At the time we are * checking the status, the original reason for the FMA fault (I/O or @@ -324,6 +335,7 @@ extern void zpool_dump_ddt(const ddt_stat_t *dds, const ddt_histogram_t *ddh); * Statistics and configuration functions. */ extern nvlist_t *zpool_get_config(zpool_handle_t *, nvlist_t **); +extern nvlist_t *zpool_get_features(zpool_handle_t *); extern int zpool_refresh_stats(zpool_handle_t *, boolean_t *); extern int zpool_get_errlog(zpool_handle_t *, nvlist_t **); @@ -336,6 +348,7 @@ extern int zpool_import(libzfs_handle_t *, nvlist_t *, const char *, char *altroot); extern int zpool_import_props(libzfs_handle_t *, nvlist_t *, const char *, nvlist_t *, int); +extern void zpool_print_unsup_feat(nvlist_t *config); /* * Search for pools to import @@ -425,6 +438,8 @@ extern int zfs_prop_get_written_int(zfs_handle_t *zhp, const char *propname, uint64_t *propvalue); extern int zfs_prop_get_written(zfs_handle_t *zhp, const char *propname, char *propbuf, int proplen, boolean_t literal); +extern int zfs_prop_get_feature(zfs_handle_t *zhp, const char *propname, + char *buf, size_t len); extern int zfs_get_snapused_int(zfs_handle_t *firstsnap, zfs_handle_t *lastsnap, uint64_t *usedp); extern uint64_t zfs_prop_get_int(zfs_handle_t *, zfs_prop_t); @@ -452,10 +467,19 @@ extern void zfs_prune_proplist(zfs_handle_t *, uint8_t *); #define ZFS_MOUNTPOINT_NONE "none" #define ZFS_MOUNTPOINT_LEGACY "legacy" +#define ZFS_FEATURE_DISABLED "disabled" +#define ZFS_FEATURE_ENABLED "enabled" +#define ZFS_FEATURE_ACTIVE "active" + +#define ZFS_UNSUPPORTED_INACTIVE "inactive" +#define ZFS_UNSUPPORTED_READONLY "readonly" + /* * zpool property management */ extern int zpool_expand_proplist(zpool_handle_t *, zprop_list_t **); +extern int zpool_prop_get_feature(zpool_handle_t *, const char *, char *, + size_t); extern const char *zpool_prop_default_string(zpool_prop_t); extern uint64_t zpool_prop_default_numeric(zpool_prop_t); extern const char *zpool_prop_column_name(zpool_prop_t); @@ -541,6 +565,9 @@ typedef struct renameflags { /* don't unmount file systems */ int nounmount : 1; + + /* force unmount file systems */ + int forceunmount : 1; } renameflags_t; extern int zfs_rename(zfs_handle_t *, const char *, renameflags_t flags); @@ -569,6 +596,9 @@ typedef struct sendflags { /* parsable verbose output (ie. -P) */ boolean_t parsable; + + /* show progress (ie. -v) */ + boolean_t progress; } sendflags_t; typedef boolean_t (snapfilter_cb_t)(zfs_handle_t *, void *); diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c index dc27238c9cf..f756da262d8 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c @@ -18,11 +18,16 @@ * * CDDL HEADER END */ + /* * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + /* * The pool configuration repository is stored in /etc/zfs/zpool.cache as a * single packed nvlist. While it would be nice to just read in this @@ -217,6 +222,36 @@ zpool_get_config(zpool_handle_t *zhp, nvlist_t **oldconfig) return (zhp->zpool_config); } +/* + * Retrieves a list of enabled features and their refcounts and caches it in + * the pool handle. + */ +nvlist_t * +zpool_get_features(zpool_handle_t *zhp) +{ + nvlist_t *config, *features; + + config = zpool_get_config(zhp, NULL); + + if (config == NULL || !nvlist_exists(config, + ZPOOL_CONFIG_FEATURE_STATS)) { + int error; + boolean_t missing = B_FALSE; + + error = zpool_refresh_stats(zhp, &missing); + + if (error != 0 || missing) + return (NULL); + + config = zpool_get_config(zhp, NULL); + } + + verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_FEATURE_STATS, + &features) == 0); + + return (features); +} + /* * Refresh the vdev statistics associated with the given pool. This is used in * iostat to show configuration changes and determine the delta from the last diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c index dba47efedee..1d81f91f5a3 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c @@ -23,8 +23,10 @@ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2010 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 DEY Storage Systems, Inc. All rights reserved. * Copyright (c) 2011-2012 Pawel Jakub Dawidek . * All rights reserved. + * Copyright (c) 2012 Martin Matuska . All rights reserved. */ #include @@ -1483,11 +1485,13 @@ zfs_prop_set(zfs_handle_t *zhp, const char *propname, const char *propval) /* * If the dataset's canmount property is being set to noauto, + * or being set to on and the dataset is already mounted, * then we want to prevent unmounting & remounting it. */ do_prefix = !((prop == ZFS_PROP_CANMOUNT) && (zprop_string_to_index(prop, propval, &idx, - ZFS_TYPE_DATASET) == 0) && (idx == ZFS_CANMOUNT_NOAUTO)); + ZFS_TYPE_DATASET) == 0) && (idx == ZFS_CANMOUNT_NOAUTO || + (idx == ZFS_CANMOUNT_ON && zfs_is_mounted(zhp, NULL)))); if (do_prefix && (ret = changelist_prefix(cl)) != 0) goto error; @@ -2320,6 +2324,17 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen, } break; + case ZFS_PROP_GUID: + /* + * GUIDs are stored as numbers, but they are identifiers. + * We don't want them to be pretty printed, because pretty + * printing mangles the ID into a truncated and useless value. + */ + if (get_numeric_property(zhp, prop, src, &source, &val) != 0) + return (-1); + (void) snprintf(propbuf, proplen, "%llu", (u_longlong_t)val); + break; + default: switch (zfs_prop_get_type(prop)) { case PROP_TYPE_NUMBER: @@ -3721,7 +3736,8 @@ zfs_rename(zfs_handle_t *zhp, const char *target, renameflags_t flags) } else { if ((cl = changelist_gather(zhp, ZFS_PROP_NAME, - flags.nounmount ? CL_GATHER_DONT_UNMOUNT : 0, 0)) == NULL) { + flags.nounmount ? CL_GATHER_DONT_UNMOUNT : 0, + flags.forceunmount ? MS_FORCE : 0)) == NULL) { return (-1); } diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c index 6f579c5ab12..7e73d0f9b68 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c @@ -1145,7 +1145,7 @@ zpool_find_import_impl(libzfs_handle_t *hdl, importargs_t *iarg) char *end, **dir = iarg->path; size_t pathleft; nvlist_t *ret = NULL; - static char *default_dir = "/dev/dsk"; + static char *default_dir = "/dev"; pool_list_t pools = { 0 }; pool_entry_t *pe, *penext; vdev_entry_t *ve, *venext; diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c index 2605768b2ac..03bc3e6586d 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c @@ -22,7 +22,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -43,6 +43,7 @@ #include "zfs_prop.h" #include "libzfs_impl.h" #include "zfs_comutil.h" +#include "zfeature_common.h" static int read_efi_label(nvlist_t *config, diskaddr_t *sb); @@ -301,6 +302,8 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, size_t len, case ZPOOL_PROP_SIZE: case ZPOOL_PROP_ALLOCATED: case ZPOOL_PROP_FREE: + case ZPOOL_PROP_FREEING: + case ZPOOL_PROP_EXPANDSZ: (void) zfs_nicenum(intval, buf, len); break; @@ -325,6 +328,12 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, size_t len, (void) strlcpy(buf, zpool_state_to_name(intval, vs->vs_aux), len); break; + case ZPOOL_PROP_VERSION: + if (intval >= SPA_VERSION_FEATURES) { + (void) snprintf(buf, len, "-"); + break; + } + /* FALLTHROUGH */ default: (void) snprintf(buf, len, "%llu", intval); } @@ -390,8 +399,8 @@ pool_uses_efi(nvlist_t *config) return (B_FALSE); } -static boolean_t -pool_is_bootable(zpool_handle_t *zhp) +boolean_t +zpool_is_bootable(zpool_handle_t *zhp) { char bootfs[ZPOOL_MAXNAMELEN]; @@ -429,10 +438,48 @@ zpool_valid_proplist(libzfs_handle_t *hdl, const char *poolname, while ((elem = nvlist_next_nvpair(props, elem)) != NULL) { const char *propname = nvpair_name(elem); + prop = zpool_name_to_prop(propname); + if (prop == ZPROP_INVAL && zpool_prop_feature(propname)) { + int err; + zfeature_info_t *feature; + char *fname = strchr(propname, '@') + 1; + + err = zfeature_lookup_name(fname, &feature); + if (err != 0) { + ASSERT3U(err, ==, ENOENT); + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "invalid feature '%s'"), fname); + (void) zfs_error(hdl, EZFS_BADPROP, errbuf); + goto error; + } + + if (nvpair_type(elem) != DATA_TYPE_STRING) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "'%s' must be a string"), propname); + (void) zfs_error(hdl, EZFS_BADPROP, errbuf); + goto error; + } + + (void) nvpair_value_string(elem, &strval); + if (strcmp(strval, ZFS_FEATURE_ENABLED) != 0) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "property '%s' can only be set to " + "'enabled'"), propname); + (void) zfs_error(hdl, EZFS_BADPROP, errbuf); + goto error; + } + + if (nvlist_add_uint64(retprops, propname, 0) != 0) { + (void) no_memory(hdl); + goto error; + } + continue; + } + /* * Make sure this property is valid and applies to this type. */ - if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL) { + if (prop == ZPROP_INVAL) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "invalid property '%s'"), propname); (void) zfs_error(hdl, EZFS_BADPROP, errbuf); @@ -455,7 +502,8 @@ zpool_valid_proplist(libzfs_handle_t *hdl, const char *poolname, */ switch (prop) { case ZPOOL_PROP_VERSION: - if (intval < version || intval > SPA_VERSION) { + if (intval < version || + !SPA_VERSION_IS_SUPPORTED(intval)) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "property '%s' number %d is invalid."), propname, intval); @@ -679,10 +727,77 @@ zpool_expand_proplist(zpool_handle_t *zhp, zprop_list_t **plp) libzfs_handle_t *hdl = zhp->zpool_hdl; zprop_list_t *entry; char buf[ZFS_MAXPROPLEN]; + nvlist_t *features = NULL; + zprop_list_t **last; + boolean_t firstexpand = (NULL == *plp); if (zprop_expand_list(hdl, plp, ZFS_TYPE_POOL) != 0) return (-1); + last = plp; + while (*last != NULL) + last = &(*last)->pl_next; + + if ((*plp)->pl_all) + features = zpool_get_features(zhp); + + if ((*plp)->pl_all && firstexpand) { + for (int i = 0; i < SPA_FEATURES; i++) { + zprop_list_t *entry = zfs_alloc(hdl, + sizeof (zprop_list_t)); + entry->pl_prop = ZPROP_INVAL; + entry->pl_user_prop = zfs_asprintf(hdl, "feature@%s", + spa_feature_table[i].fi_uname); + entry->pl_width = strlen(entry->pl_user_prop); + entry->pl_all = B_TRUE; + + *last = entry; + last = &entry->pl_next; + } + } + + /* add any unsupported features */ + for (nvpair_t *nvp = nvlist_next_nvpair(features, NULL); + nvp != NULL; nvp = nvlist_next_nvpair(features, nvp)) { + char *propname; + boolean_t found; + zprop_list_t *entry; + + if (zfeature_is_supported(nvpair_name(nvp))) + continue; + + propname = zfs_asprintf(hdl, "unsupported@%s", + nvpair_name(nvp)); + + /* + * Before adding the property to the list make sure that no + * other pool already added the same property. + */ + found = B_FALSE; + entry = *plp; + while (entry != NULL) { + if (entry->pl_user_prop != NULL && + strcmp(propname, entry->pl_user_prop) == 0) { + found = B_TRUE; + break; + } + entry = entry->pl_next; + } + if (found) { + free(propname); + continue; + } + + entry = zfs_alloc(hdl, sizeof (zprop_list_t)); + entry->pl_prop = ZPROP_INVAL; + entry->pl_user_prop = propname; + entry->pl_width = strlen(entry->pl_user_prop); + entry->pl_all = B_TRUE; + + *last = entry; + last = &entry->pl_next; + } + for (entry = *plp; entry != NULL; entry = entry->pl_next) { if (entry->pl_fixed) @@ -699,6 +814,66 @@ zpool_expand_proplist(zpool_handle_t *zhp, zprop_list_t **plp) return (0); } +/* + * Get the state for the given feature on the given ZFS pool. + */ +int +zpool_prop_get_feature(zpool_handle_t *zhp, const char *propname, char *buf, + size_t len) +{ + uint64_t refcount; + boolean_t found = B_FALSE; + nvlist_t *features = zpool_get_features(zhp); + boolean_t supported; + const char *feature = strchr(propname, '@') + 1; + + supported = zpool_prop_feature(propname); + ASSERT(supported || zpool_prop_unsupported(propname)); + + /* + * Convert from feature name to feature guid. This conversion is + * unecessary for unsupported@... properties because they already + * use guids. + */ + if (supported) { + int ret; + zfeature_info_t *fi; + + ret = zfeature_lookup_name(feature, &fi); + if (ret != 0) { + (void) strlcpy(buf, "-", len); + return (ENOTSUP); + } + feature = fi->fi_guid; + } + + if (nvlist_lookup_uint64(features, feature, &refcount) == 0) + found = B_TRUE; + + if (supported) { + if (!found) { + (void) strlcpy(buf, ZFS_FEATURE_DISABLED, len); + } else { + if (refcount == 0) + (void) strlcpy(buf, ZFS_FEATURE_ENABLED, len); + else + (void) strlcpy(buf, ZFS_FEATURE_ACTIVE, len); + } + } else { + if (found) { + if (refcount == 0) { + (void) strcpy(buf, ZFS_UNSUPPORTED_INACTIVE); + } else { + (void) strcpy(buf, ZFS_UNSUPPORTED_READONLY); + } + } else { + (void) strlcpy(buf, "-", len); + return (ENOTSUP); + } + } + + return (0); +} /* * Don't start the slice at the default block of 34; many storage @@ -1126,7 +1301,7 @@ zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot) return (zfs_error(hdl, EZFS_BADVERSION, msg)); } - if (pool_is_bootable(zhp) && nvlist_lookup_nvlist_array(nvroot, + if (zpool_is_bootable(zhp) && nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0) { uint64_t s; @@ -1285,8 +1460,10 @@ zpool_rewind_exclaim(libzfs_handle_t *hdl, const char *name, boolean_t dryrun, if (!hdl->libzfs_printerr || config == NULL) return; - if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_LOAD_INFO, &nv) != 0) + if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_LOAD_INFO, &nv) != 0 || + nvlist_lookup_nvlist(nv, ZPOOL_CONFIG_REWIND_INFO, &nv) != 0) { return; + } if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_LOAD_TIME, &rewindto) != 0) return; @@ -1342,6 +1519,7 @@ zpool_explain_recover(libzfs_handle_t *hdl, const char *name, int reason, /* All attempted rewinds failed if ZPOOL_CONFIG_LOAD_TIME missing */ if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_LOAD_INFO, &nv) != 0 || + nvlist_lookup_nvlist(nv, ZPOOL_CONFIG_REWIND_INFO, &nv) != 0 || nvlist_lookup_uint64(nv, ZPOOL_CONFIG_LOAD_TIME, &rewindto) != 0) goto no_info; @@ -1464,6 +1642,30 @@ print_vdev_tree(libzfs_handle_t *hdl, const char *name, nvlist_t *nv, } } +void +zpool_print_unsup_feat(nvlist_t *config) +{ + nvlist_t *nvinfo, *unsup_feat; + + verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_LOAD_INFO, &nvinfo) == + 0); + verify(nvlist_lookup_nvlist(nvinfo, ZPOOL_CONFIG_UNSUP_FEAT, + &unsup_feat) == 0); + + for (nvpair_t *nvp = nvlist_next_nvpair(unsup_feat, NULL); nvp != NULL; + nvp = nvlist_next_nvpair(unsup_feat, nvp)) { + char *desc; + + verify(nvpair_type(nvp) == DATA_TYPE_STRING); + verify(nvpair_value_string(nvp, &desc) == 0); + + if (strlen(desc) > 0) + (void) printf("\t%s (%s)\n", nvpair_name(nvp), desc); + else + (void) printf("\t%s\n", nvpair_name(nvp)); + } +} + /* * Import the given pool using the known configuration and a list of * properties to be set. The configuration should have come from @@ -1570,6 +1772,22 @@ zpool_import_props(libzfs_handle_t *hdl, nvlist_t *config, const char *newname, switch (error) { case ENOTSUP: + if (nv != NULL && nvlist_lookup_nvlist(nv, + ZPOOL_CONFIG_LOAD_INFO, &nvinfo) == 0 && + nvlist_exists(nvinfo, ZPOOL_CONFIG_UNSUP_FEAT)) { + (void) printf(dgettext(TEXT_DOMAIN, "This " + "pool uses the following feature(s) not " + "supported by this system:\n")); + zpool_print_unsup_feat(nv); + if (nvlist_exists(nvinfo, + ZPOOL_CONFIG_CAN_RDONLY)) { + (void) printf(dgettext(TEXT_DOMAIN, + "All unsupported features are only " + "required for writing to the pool." + "\nThe pool can be imported using " + "'-o readonly=on'.\n")); + } + } /* * Unsupported version. */ @@ -2412,7 +2630,7 @@ zpool_vdev_attach(zpool_handle_t *zhp, uint_t children; nvlist_t *config_root; libzfs_handle_t *hdl = zhp->zpool_hdl; - boolean_t rootpool = pool_is_bootable(zhp); + boolean_t rootpool = zpool_is_bootable(zhp); if (replacing) (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, @@ -3053,6 +3271,26 @@ zpool_reguid(zpool_handle_t *zhp) return (zpool_standard_error(hdl, errno, msg)); } +/* + * Reopen the pool. + */ +int +zpool_reopen(zpool_handle_t *zhp) +{ + zfs_cmd_t zc = { 0 }; + char msg[1024]; + libzfs_handle_t *hdl = zhp->zpool_hdl; + + (void) snprintf(msg, sizeof (msg), + dgettext(TEXT_DOMAIN, "cannot reopen '%s'"), + zhp->zpool_name); + + (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); + if (zfs_ioctl(hdl, ZFS_IOC_POOL_REOPEN, &zc) == 0) + return (0); + return (zpool_standard_error(hdl, errno, msg)); +} + /* * Convert from a devid string to a path. */ @@ -3703,7 +3941,7 @@ zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, const char *name) if (zhp) { nvlist_t *nvroot; - if (pool_is_bootable(zhp)) { + if (zpool_is_bootable(zhp)) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "EFI labeled devices are not supported on root " "pools.")); diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c index 1a305fd7dbc..7a6418b3754 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c @@ -22,6 +22,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. * Copyright (c) 2012 Pawel Jakub Dawidek . * All rights reserved. */ @@ -40,6 +41,7 @@ #include #include #include +#include #include @@ -67,6 +69,12 @@ typedef struct dedup_arg { libzfs_handle_t *dedup_hdl; } dedup_arg_t; +typedef struct progress_arg { + zfs_handle_t *pa_zhp; + int pa_fd; + boolean_t pa_parsable; +} progress_arg_t; + typedef struct dataref { uint64_t ref_guid; uint64_t ref_object; @@ -786,7 +794,7 @@ typedef struct send_dump_data { char prevsnap[ZFS_MAXNAMELEN]; uint64_t prevsnap_obj; boolean_t seenfrom, seento, replicate, doall, fromorigin; - boolean_t verbose, dryrun, parsable; + boolean_t verbose, dryrun, parsable, progress; int outfd; boolean_t err; nvlist_t *fss; @@ -979,10 +987,60 @@ hold_for_send(zfs_handle_t *zhp, send_dump_data_t *sdd) return (error); } +static void * +send_progress_thread(void *arg) +{ + progress_arg_t *pa = arg; + + zfs_cmd_t zc = { 0 }; + zfs_handle_t *zhp = pa->pa_zhp; + libzfs_handle_t *hdl = zhp->zfs_hdl; + unsigned long long bytes; + char buf[16]; + + time_t t; + struct tm *tm; + + assert(zhp->zfs_type == ZFS_TYPE_SNAPSHOT); + (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); + + if (!pa->pa_parsable) + (void) fprintf(stderr, "TIME SENT SNAPSHOT\n"); + + /* + * Print the progress from ZFS_IOC_SEND_PROGRESS every second. + */ + for (;;) { + (void) sleep(1); + + zc.zc_cookie = pa->pa_fd; + if (zfs_ioctl(hdl, ZFS_IOC_SEND_PROGRESS, &zc) != 0) + return ((void *)-1); + + (void) time(&t); + tm = localtime(&t); + bytes = zc.zc_cookie; + + if (pa->pa_parsable) { + (void) fprintf(stderr, "%02d:%02d:%02d\t%llu\t%s\n", + tm->tm_hour, tm->tm_min, tm->tm_sec, + bytes, zhp->zfs_name); + } else { + zfs_nicenum(bytes, buf, sizeof (buf)); + (void) fprintf(stderr, "%02d:%02d:%02d %5s %s\n", + tm->tm_hour, tm->tm_min, tm->tm_sec, + buf, zhp->zfs_name); + } + } +} + static int dump_snapshot(zfs_handle_t *zhp, void *arg) { send_dump_data_t *sdd = arg; + progress_arg_t pa = { 0 }; + pthread_t tid; + char *thissnap; int err; boolean_t isfromsnap, istosnap, fromorigin; @@ -1100,8 +1158,29 @@ dump_snapshot(zfs_handle_t *zhp, void *arg) } if (!sdd->dryrun) { + /* + * If progress reporting is requested, spawn a new thread to + * poll ZFS_IOC_SEND_PROGRESS at a regular interval. + */ + if (sdd->progress) { + pa.pa_zhp = zhp; + pa.pa_fd = sdd->outfd; + pa.pa_parsable = sdd->parsable; + + if (err = pthread_create(&tid, NULL, + send_progress_thread, &pa)) { + zfs_close(zhp); + return (err); + } + } + err = dump_ioctl(zhp, sdd->prevsnap, sdd->prevsnap_obj, fromorigin, sdd->outfd, sdd->debugnv); + + if (sdd->progress) { + (void) pthread_cancel(tid); + (void) pthread_join(tid, NULL); + } } (void) strcpy(sdd->prevsnap, thissnap); @@ -1451,12 +1530,13 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap, sdd.fsavl = fsavl; sdd.verbose = flags->verbose; sdd.parsable = flags->parsable; + sdd.progress = flags->progress; sdd.dryrun = flags->dryrun; sdd.filter_cb = filter_func; sdd.filter_cb_arg = cb_arg; if (debugnvp) sdd.debugnv = *debugnvp; - if (holdsnaps) { + if (holdsnaps || flags->progress) { ++holdseq; (void) snprintf(sdd.holdtag, sizeof (sdd.holdtag), ".send-%d-%llu", getpid(), (u_longlong_t)holdseq); diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_status.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_status.c index 24725ec044e..af0707a6205 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_status.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_status.c @@ -18,8 +18,10 @@ * * CDDL HEADER END */ + /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ /* @@ -213,6 +215,20 @@ check_status(nvlist_t *config, boolean_t isimport) vs->vs_aux == VDEV_AUX_VERSION_NEWER) return (ZPOOL_STATUS_VERSION_NEWER); + /* + * Unsupported feature(s). + */ + if (vs->vs_state == VDEV_STATE_CANT_OPEN && + vs->vs_aux == VDEV_AUX_UNSUP_FEAT) { + nvlist_t *nvinfo; + + verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_LOAD_INFO, + &nvinfo) == 0); + if (nvlist_exists(nvinfo, ZPOOL_CONFIG_CAN_RDONLY)) + return (ZPOOL_STATUS_UNSUP_FEAT_WRITE); + return (ZPOOL_STATUS_UNSUP_FEAT_READ); + } + /* * Check that the config is complete. */ @@ -300,7 +316,7 @@ check_status(nvlist_t *config, boolean_t isimport) /* * Outdated, but usable, version */ - if (version < SPA_VERSION) + if (SPA_VERSION_IS_SUPPORTED(version) && version != SPA_VERSION) return (ZPOOL_STATUS_VERSION_OLDER); return (ZPOOL_STATUS_OK); diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_util.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_util.c index c903696fe7d..0db2dfd1b53 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_util.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_util.c @@ -18,9 +18,10 @@ * * CDDL HEADER END */ + /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ /* @@ -50,6 +51,7 @@ #include "libzfs_impl.h" #include "zfs_prop.h" +#include "zfeature_common.h" int aok; @@ -119,7 +121,8 @@ libzfs_error_description(libzfs_handle_t *hdl) case EZFS_RESILVERING: return (dgettext(TEXT_DOMAIN, "currently resilvering")); case EZFS_BADVERSION: - return (dgettext(TEXT_DOMAIN, "unsupported version")); + return (dgettext(TEXT_DOMAIN, "unsupported version or " + "feature")); case EZFS_POOLUNAVAIL: return (dgettext(TEXT_DOMAIN, "pool is unavailable")); case EZFS_DEVOVERFLOW: @@ -656,6 +659,7 @@ libzfs_init(void) zfs_prop_init(); zpool_prop_init(); + zpool_feature_init(); libzfs_mnttab_init(hdl); return (hdl); @@ -1325,9 +1329,11 @@ addlist(libzfs_handle_t *hdl, char *propname, zprop_list_t **listp, * this is a pool property or if this isn't a user-defined * dataset property, */ - if (prop == ZPROP_INVAL && (type == ZFS_TYPE_POOL || - (!zfs_prop_user(propname) && !zfs_prop_userquota(propname) && - !zfs_prop_written(propname)))) { + if (prop == ZPROP_INVAL && ((type == ZFS_TYPE_POOL && + !zpool_prop_feature(propname) && + !zpool_prop_unsupported(propname)) || + (type == ZFS_TYPE_DATASET && !zfs_prop_user(propname) && + !zfs_prop_userquota(propname) && !zfs_prop_written(propname)))) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "invalid property '%s'"), propname); return (zfs_error(hdl, EZFS_BADPROP, @@ -1339,7 +1345,8 @@ addlist(libzfs_handle_t *hdl, char *propname, zprop_list_t **listp, entry->pl_prop = prop; if (prop == ZPROP_INVAL) { - if ((entry->pl_user_prop = zfs_strdup(hdl, propname)) == NULL) { + if ((entry->pl_user_prop = zfs_strdup(hdl, propname)) == + NULL) { free(entry); return (-1); } diff --git a/cddl/contrib/opensolaris/lib/libzpool/common/kernel.c b/cddl/contrib/opensolaris/lib/libzpool/common/kernel.c index 2c077877765..56bf7181d8b 100644 --- a/cddl/contrib/opensolaris/lib/libzpool/common/kernel.c +++ b/cddl/contrib/opensolaris/lib/libzpool/common/kernel.c @@ -474,7 +474,9 @@ vn_rdwr(int uio, vnode_t *vp, void *addr, ssize_t len, offset_t offset, * To simulate partial disk writes, we split writes into two * system calls so that the process can be killed in between. */ - split = (len > 0 ? rand() % len : 0); + int sectors = len >> SPA_MINBLOCKSHIFT; + split = (sectors > 0 ? rand() % sectors : 0) << + SPA_MINBLOCKSHIFT; iolen = pwrite64(vp->v_fd, addr, split, offset); iolen += pwrite64(vp->v_fd, (char *)addr + split, len - split, offset + split); diff --git a/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h b/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h index fa749d5b18e..558de2e6a7a 100644 --- a/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h +++ b/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. */ #ifndef _SYS_ZFS_CONTEXT_H @@ -228,6 +229,7 @@ struct proc { }; extern struct proc p0; +#define curproc (&p0) #define PS_NONE -1 diff --git a/cddl/lib/libdtrace/Makefile b/cddl/lib/libdtrace/Makefile index 81396ff609c..bdd8acce956 100644 --- a/cddl/lib/libdtrace/Makefile +++ b/cddl/lib/libdtrace/Makefile @@ -45,6 +45,7 @@ SRCS= dt_aggregate.c \ gmatch.c DSRCS= errno.d \ + io.d \ psinfo.d \ signal.d \ unistd.d diff --git a/cddl/lib/libdtrace/io.d b/cddl/lib/libdtrace/io.d new file mode 100644 index 00000000000..18a54afdb93 --- /dev/null +++ b/cddl/lib/libdtrace/io.d @@ -0,0 +1,110 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * $FreeBSD$ + */ +/* + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#pragma D depends_on provider io + +typedef struct devinfo { + int dev_major; /* major number */ + int dev_minor; /* minor number */ + int dev_instance; /* instance number */ + string dev_name; /* name of device */ + string dev_statname; /* name of device + instance/minor */ + string dev_pathname; /* pathname of device */ +} devinfo_t; + +#pragma D binding "1.0" translator +translator devinfo_t < struct devstat *D > { + dev_major = D->device_number; + dev_minor = D->unit_number; + dev_instance = 0; + dev_name = stringof(D->device_name); + dev_statname = stringof(D->device_name); + dev_pathname = stringof(D->device_name); +}; + +typedef struct bufinfo { + int b_flags; /* flags */ + long b_bcount; /* number of bytes */ + caddr_t b_addr; /* buffer address */ + uint64_t b_blkno; /* expanded block # on device */ + uint64_t b_lblkno; /* block # on device */ + size_t b_resid; /* # of bytes not transferred */ + size_t b_bufsize; /* size of allocated buffer */ +/* caddr_t b_iodone; I/O completion routine */ + int b_error; /* expanded error field */ +/* dev_t b_edev; extended device */ +} bufinfo_t; + +#pragma D binding "1.0" translator +translator bufinfo_t < struct bio *B > { + b_flags = B->bio_flags; + b_bcount = B->bio_bcount; + b_addr = B->bio_data; + b_blkno = 0; + b_lblkno = 0; + b_resid = B->bio_resid; + b_bufsize = 0; /* XXX gnn */ + b_error = B->bio_error; +}; + +/* + * The following inline constants can be used to examine fi_oflags when using + * the fds[] array or a translated fileinfo_t. Note that the various open + * flags behave as a bit-field *except* for O_RDONLY, O_WRONLY, and O_RDWR. + * To test the open mode, you write code similar to that used with the fcntl(2) + * F_GET[X]FL command, such as: if ((fi_oflags & O_ACCMODE) == O_WRONLY). + */ +inline int O_ACCMODE = 0x0003; +#pragma D binding "1.1" O_ACCMODE + +inline int O_RDONLY = 0x0000; +#pragma D binding "1.1" O_RDONLY +inline int O_WRONLY = 0x0001; +#pragma D binding "1.1" O_WRONLY +inline int O_RDWR = 0x0002; +#pragma D binding "1.1" O_RDWR + +inline int O_APPEND = 0x0008; +#pragma D binding "1.1" O_APPEND +inline int O_CREAT = 0x0200; +#pragma D binding "1.1" O_CREAT +inline int O_EXCL = 0x0800; +#pragma D binding "1.1" O_EXCL +inline int O_NOCTTY = 0x8000; +#pragma D binding "1.1" O_NOCTTY +inline int O_NONBLOCK = 0x0004; +#pragma D binding "1.1" O_NONBLOCK +inline int O_NDELAY = 0x0004; +#pragma D binding "1.1" O_NDELAY +inline int O_SYNC = 0x0080; +#pragma D binding "1.1" O_SYNC +inline int O_TRUNC = 0x0400; +#pragma D binding "1.1" O_TRUNC + + diff --git a/cddl/lib/libnvpair/Makefile b/cddl/lib/libnvpair/Makefile index da0c7f3c299..bd159fc856a 100644 --- a/cddl/lib/libnvpair/Makefile +++ b/cddl/lib/libnvpair/Makefile @@ -8,12 +8,17 @@ LIB= nvpair SRCS= libnvpair.c \ nvpair_alloc_system.c \ nvpair_alloc_fixed.c \ - nvpair.c + nvpair.c \ + fnvpair.c WARNS?= 0 CFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris/include +CFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libzpool/common CFLAGS+= -I${.CURDIR}/../../../sys/cddl/compat/opensolaris CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common +CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common/fs/zfs CFLAGS+= -I${.CURDIR}/../../../sys +CFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/head +CFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris/lib/libumem .include diff --git a/cddl/lib/libzfs/Makefile b/cddl/lib/libzfs/Makefile index c1dac5004b8..369020364bb 100644 --- a/cddl/lib/libzfs/Makefile +++ b/cddl/lib/libzfs/Makefile @@ -27,6 +27,7 @@ SRCS+= libzfs_changelist.c \ libzfs_sendrecv.c \ libzfs_status.c \ libzfs_util.c \ + zfeature_common.c \ zfs_comutil.c \ zfs_deleg.c \ zfs_fletcher.c \ diff --git a/cddl/sbin/zpool/Makefile b/cddl/sbin/zpool/Makefile index fba9ebfee60..327f6dc82e6 100644 --- a/cddl/sbin/zpool/Makefile +++ b/cddl/sbin/zpool/Makefile @@ -5,7 +5,7 @@ .PATH: ${.CURDIR}/../../../sys/cddl/contrib/opensolaris/common/zfs PROG= zpool -MAN= zpool.8 +MAN= zpool.8 zpool-features.5 SRCS= zpool_main.c zpool_vdev.c zpool_iter.c zpool_util.c zfs_comutil.c SRCS+= timestamp.c diff --git a/cddl/usr.bin/ztest/Makefile b/cddl/usr.bin/ztest/Makefile index 7988fcea05a..d1ae4bbaaa8 100644 --- a/cddl/usr.bin/ztest/Makefile +++ b/cddl/usr.bin/ztest/Makefile @@ -11,15 +11,16 @@ CFLAGS+= -I${.CURDIR}/../../compat/opensolaris/include CFLAGS+= -I${.CURDIR}/../../compat/opensolaris/lib/libumem CFLAGS+= -I${.CURDIR}/../../contrib/opensolaris/lib/libzpool/common CFLAGS+= -I${.CURDIR}/../../contrib/opensolaris/lib/libnvpair +CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/common/zfs CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common/fs/zfs CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common/sys CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common CFLAGS+= -I${.CURDIR}/../../contrib/opensolaris/head CFLAGS+= -I${.CURDIR}/../../lib/libumem -DPADD= ${LIBM} ${LIBNVPAIR} ${LIBUMEM} ${LIBZPOOL} \ - ${LIBPTHREAD} ${LIBAVL} -LDADD= -lm -lnvpair -lumem -lzpool -lpthread -lavl +DPADD= ${LIBGEOM} ${LIBM} ${LIBNVPAIR} ${LIBUMEM} ${LIBZPOOL} \ + ${LIBPTHREAD} ${LIBAVL} ${LIBZFS} ${LIBUUTIL} +LDADD= -lgeom -lm -lnvpair -lumem -lzpool -lpthread -lavl -lzfs -luutil CSTD= c99 diff --git a/cddl/usr.sbin/Makefile b/cddl/usr.sbin/Makefile index a84715b6998..42d124f9004 100644 --- a/cddl/usr.sbin/Makefile +++ b/cddl/usr.sbin/Makefile @@ -5,11 +5,13 @@ SUBDIR= ${_dtrace} \ ${_dtruss} \ ${_lockstat} \ - ${_zdb} + ${_zdb} \ + ${_zhack} .if ${MK_ZFS} != "no" .if ${MK_LIBTHR} != "no" _zdb= zdb +_zhack= zhack .endif .endif diff --git a/cddl/usr.sbin/zhack/Makefile b/cddl/usr.sbin/zhack/Makefile new file mode 100644 index 00000000000..53d431e07a3 --- /dev/null +++ b/cddl/usr.sbin/zhack/Makefile @@ -0,0 +1,29 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../../cddl/contrib/opensolaris/cmd/zhack + +PROG= zhack +NO_MAN= + +WARNS?= 0 +CSTD= c99 + +CFLAGS+= -I${.CURDIR}/../../../sys/cddl/compat/opensolaris +CFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris/include +CFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris/lib/libumem +CFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libnvpair +CFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libuutil/common +CFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libzfs/common +CFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libzpool/common +CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common/fs/zfs +CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common +CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common/sys +CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/common/zfs +CFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/head +CFLAGS+= -I${.CURDIR}/../../lib/libumem + +DPADD= ${LIBGEOM} ${LIBM} ${LIBNVPAIR} ${LIBPTHREAD} ${LIBUMEM} \ + ${LIBUUTIL} ${LIBZFS} ${LIBZPOOL} +LDADD= -lgeom -lm -lnvpair -lpthread -lumem -luutil -lzfs -lzpool + +.include diff --git a/contrib/bind9/CHANGES b/contrib/bind9/CHANGES index 19f8e51615a..0b0d7c052fc 100644 --- a/contrib/bind9/CHANGES +++ b/contrib/bind9/CHANGES @@ -1,3 +1,61 @@ + --- 9.8.3-P1 released --- + +3331. [security] dns_rdataslab_fromrdataset could produce bad + rdataslabs. [RT #29644] + + --- 9.8.3 released --- + +3318. [tuning] Reduce the amount of work performed while holding a + bucket lock when finshed with a fetch context. + [RT #29239] + +3314. [bug] The masters list could be updated while refesh_callback + and stub_callback were using it. [RT #26732] + +3313. [protocol] Add TLSA record type. [RT #28989] + +3312. [bug] named-checkconf didn't detect a bad dns64 clients acl. + [RT #27631] + +3311. [bug] Abort the zone dump if zone->db is NULL in + zone.c:zone_gotwritehandle. [RT #29028] + +3310. [test] Increase table size for mutex profiling. [RT #28809] + +3309. [bug] resolver.c:fctx_finddone() was not threadsafe. + [RT #27995] + +3307. [bug] Add missing ISC_LANG_BEGINDECLS and ISC_LANG_ENDDECLS. + [RT #28956] + +3306. [bug] Improve DNS64 reverse zone performance. [RT #28563] + +3305. [func] Add wire format lookup method to sdb. [RT #28563] + +3304. [bug] Use hmctx, not mctx when freeing rbtdb->heaps. + [RT #28571] + +3302. [bug] dns_dnssec_findmatchingkeys could fail to find + keys if the zone name contained character that + required special mappings. [RT #28600] + +3301. [contrib] Update queryperf to build on darwin. Add -R flag + for non-recursive queries. [RT #28565] + +3300. [bug] Named could die if gssapi was enabled in named.conf + but was not compiled in. [RT #28338] + +3299. [bug] Make SDB handle errors from database drivers better. + [RT #28534] + +3232. [bug] Zero zone->curmaster before return in + dns_zone_setmasterswithkeys(). [RT #26732] + +3183. [bug] Added RTLD_GLOBAL flag to dlopen call. [RT #26301] + +3197. [bug] Don't try to log the filename and line number when + the config parser can't open a file. [RT #22263] + --- 9.8.2 released --- 3298. [bug] Named could dereference a NULL pointer in @@ -58,9 +116,9 @@ 3274. [bug] Log when a zone is not reusable. Only set loadtime on successful loads. [RT #27650] -3273. [bug] AAAA responses could be returned in the additional - section even when filter-aaaa-on-v4 was in use. - [RT #27292] +3273. [bug] AAAA responses could be returned in the additional + section even when filter-aaaa-on-v4 was in use. + [RT #27292] 3271. [port] darwin: mksymtbl is not always stable, loop several times before giving up. mksymtbl was using non diff --git a/contrib/bind9/README b/contrib/bind9/README index d78fb859d19..ee56344c5e0 100644 --- a/contrib/bind9/README +++ b/contrib/bind9/README @@ -51,6 +51,10 @@ BIND 9 For up-to-date release notes and errata, see http://www.isc.org/software/bind9/releasenotes +BIND 9.8.3 + + BIND 9.8.3 is a maintenance release. + BIND 9.8.2 BIND 9.8.2 includes a number of bug fixes and prevents a security diff --git a/contrib/bind9/bin/named/builtin.c b/contrib/bind9/bin/named/builtin.c index 86afa5a0370..754e73d3250 100644 --- a/contrib/bind9/bin/named/builtin.c +++ b/contrib/bind9/bin/named/builtin.c @@ -69,35 +69,79 @@ static builtin_t empty_builtin = { do_empty_lookup, NULL, NULL }; static builtin_t dns64_builtin = { do_dns64_lookup, NULL, NULL }; static dns_sdbimplementation_t *builtin_impl; +static dns_sdbimplementation_t *dns64_impl; -static const char hex[] = "0123456789abcdef"; -static const char HEX[] = "0123456789ABCDEF"; +/* + * Pre computed HEX * 16 or 1 table. + */ +static const unsigned char hex16[256] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*00*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*10*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*20*/ + 0, 16, 32, 48, 64, 80, 96,112,128,144, 1, 1, 1, 1, 1, 1, /*30*/ + 1,160,176,192,208,224,240, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*40*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*50*/ + 1,160,176,192,208,224,240, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*60*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*70*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*80*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*90*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*A0*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*B0*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*C0*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*D0*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*E0*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 /*F0*/ +}; + +const unsigned char decimal[] = "0123456789"; + +static size_t +dns64_rdata(unsigned char *v, size_t start, unsigned char *rdata) { + size_t i, j = 0; + + for (i = 0; i < 4; i++) { + unsigned char c = v[start++]; + if (start == 7) + start++; + if (c > 99) { + rdata[j++] = 3; + rdata[j++] = decimal[c/100]; c = c % 100; + rdata[j++] = decimal[c/10]; c = c % 10; + rdata[j++] = decimal[c]; + } else if (c > 9) { + rdata[j++] = 2; + rdata[j++] = decimal[c/10]; c = c % 10; + rdata[j++] = decimal[c]; + } else { + rdata[j++] = 1; + rdata[j++] = decimal[c]; + } + } + memcpy(&rdata[j], "\07in-addr\04arpa", 14); + return (j + 14); +} static isc_result_t -dns64_cname(const char *zone, const char *name, dns_sdblookup_t *lookup) { - size_t zlen, nlen, j; - const char *s; - unsigned char v[16]; +dns64_cname(const dns_name_t *zone, const dns_name_t *name, + dns_sdblookup_t *lookup) +{ + size_t zlen, nlen, j, len; + unsigned char v[16], n; unsigned int i; - char reverse[sizeof("123.123.123.123.in-addr.arpa.")]; + unsigned char rdata[sizeof("123.123.123.123.in-addr.arpa.")]; + unsigned char *ndata; /* - * The sum the length of the relative name and the length of the zone - * name for a IPv6 reverse lookup comes to 71. + * The combined length of the zone and name is 74. * - * The reverse of 2001::10.0.0.1 (dns64 2001::/96) has a zone of - * "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.2.ip6.arpa" - * and a name of "1.0.0.0.0.0.a.0". The sum of the lengths of these - * two strings is 71. + * The minimum zone length is 10 ((3)ip6(4)arpa(0)). * - * The minimum length for a ip6.arpa zone name is 8. - * - * The length of name should always be odd as we are expecting + * The length of name should always be even as we are expecting * a series of nibbles. */ - zlen = strlen(zone); - nlen = strlen(name); - if ((zlen + nlen) > 71U || zlen < 8U || (nlen % 2) != 1U) + zlen = zone->length; + nlen = name->length; + if ((zlen + nlen) > 74U || zlen < 10U || (nlen % 2) != 0U) return (ISC_R_NOTFOUND); /* @@ -116,25 +160,20 @@ dns64_cname(const char *zone, const char *name, dns_sdblookup_t *lookup) { * are byte aligned and we correctly return ISC_R_NOTFOUND or * ISC_R_SUCCESS. We will not generate a CNAME in this case. */ - i = (nlen % 4) == 1U ? 1 : 0; + ndata = name->ndata; + i = (nlen % 4) == 2U ? 1 : 0; j = nlen; memset(v, 0, sizeof(v)); - while (j >= 1U) { + while (j != 0) { INSIST((i/2) < sizeof(v)); - if (j > 1U && name[1] != '.') + if (ndata[0] != 1) return (ISC_R_NOTFOUND); - v[i/2] >>= 4; - if ((s = strchr(hex, name[0])) != NULL) - v[i/2] |= (s - hex) << 4; - else if ((s = strchr(HEX, name[0])) != NULL) - v[i/2] |= (s - HEX) << 4; - else + n = hex16[ndata[1]&0xff]; + if (n == 1) return (ISC_R_NOTFOUND); - if (j > 1U) - j -= 2; - else - j -= 1; - name += 2; + v[i/2] = n | (v[i/2]>>4); + j -= 2; + ndata += 2; i++; } @@ -144,90 +183,91 @@ dns64_cname(const char *zone, const char *name, dns_sdblookup_t *lookup) { * it corresponds to a empty node in the zone or there should be * a CNAME. */ +#define ZLEN(x) (10 + (x)/2) switch (zlen) { - case 24: /* prefix len 32 */ - /* - * If the total length is not 71 then this is a empty node - * so return success. - */ - if (nlen + zlen != 71U) - return (ISC_R_SUCCESS); - snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.", - v[8], v[9], v[10], v[11]); - break; - case 28: /* prefix len 40 */ + case ZLEN(32): /* prefix len 32 */ /* * The nibbles that map to this byte must be zero for 'name' * to exist in the zone. */ - if (nlen > 11U && v[nlen/4 - 3] != 0) + if (nlen > 16U && v[(nlen-1)/4 - 4] != 0) return (ISC_R_NOTFOUND); /* - * If the total length is not 71 then this is a empty node + * If the total length is not 74 then this is a empty node * so return success. */ - if (nlen + zlen != 71U) + if (nlen + zlen != 74U) return (ISC_R_SUCCESS); - snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.", - v[6], v[8], v[9], v[10]); + len = dns64_rdata(v, 8, rdata); break; - case 32: /* prefix len 48 */ + case ZLEN(40): /* prefix len 40 */ /* * The nibbles that map to this byte must be zero for 'name' * to exist in the zone. */ - if (nlen > 7U && v[nlen/4 - 2] != 0) + if (nlen > 12U && v[(nlen-1)/4 - 3] != 0) return (ISC_R_NOTFOUND); /* - * If the total length is not 71 then this is a empty node + * If the total length is not 74 then this is a empty node * so return success. */ - if (nlen + zlen != 71U) + if (nlen + zlen != 74U) return (ISC_R_SUCCESS); - snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.", - v[5], v[6], v[8], v[9]); + len = dns64_rdata(v, 6, rdata); break; - case 36: /* prefix len 56 */ + case ZLEN(48): /* prefix len 48 */ /* * The nibbles that map to this byte must be zero for 'name' * to exist in the zone. */ - if (nlen > 3U && v[nlen/4 - 1] != 0) + if (nlen > 8U && v[(nlen-1)/4 - 2] != 0) return (ISC_R_NOTFOUND); /* - * If the total length is not 71 then this is a empty node + * If the total length is not 74 then this is a empty node * so return success. */ - if (nlen + zlen != 71U) + if (nlen + zlen != 74U) return (ISC_R_SUCCESS); - snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.", - v[4], v[5], v[6], v[8]); + len = dns64_rdata(v, 5, rdata); break; - case 40: /* prefix len 64 */ + case ZLEN(56): /* prefix len 56 */ /* * The nibbles that map to this byte must be zero for 'name' * to exist in the zone. */ - if (v[nlen/4] != 0) + if (nlen > 4U && v[(nlen-1)/4 - 1] != 0) return (ISC_R_NOTFOUND); /* - * If the total length is not 71 then this is a empty node + * If the total length is not 74 then this is a empty node * so return success. */ - if (nlen + zlen != 71U) + if (nlen + zlen != 74U) return (ISC_R_SUCCESS); - snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.", - v[3], v[4], v[5], v[6]); + len = dns64_rdata(v, 4, rdata); break; - case 56: /* prefix len 96 */ + case ZLEN(64): /* prefix len 64 */ /* - * If the total length is not 71 then this is a empty node + * The nibbles that map to this byte must be zero for 'name' + * to exist in the zone. + */ + if (v[(nlen-1)/4] != 0) + return (ISC_R_NOTFOUND); + /* + * If the total length is not 74 then this is a empty node * so return success. */ - if (nlen + zlen != 71U) + if (nlen + zlen != 74U) return (ISC_R_SUCCESS); - snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.", - v[0], v[1], v[2], v[3]); + len = dns64_rdata(v, 3, rdata); + break; + case ZLEN(96): /* prefix len 96 */ + /* + * If the total length is not 74 then this is a empty node + * so return success. + */ + if (nlen + zlen != 74U) + return (ISC_R_SUCCESS); + len = dns64_rdata(v, 0, rdata); break; default: /* @@ -236,7 +276,7 @@ dns64_cname(const char *zone, const char *name, dns_sdblookup_t *lookup) { */ return (ISC_R_NOTFOUND); } - return (dns_sdb_putrr(lookup, "CNAME", 600, reverse)); + return (dns_sdb_putrdata(lookup, dns_rdatatype_cname, 600, rdata, len)); } static isc_result_t @@ -249,12 +289,22 @@ builtin_lookup(const char *zone, const char *name, void *dbdata, if (strcmp(name, "@") == 0) return (b->do_lookup(lookup)); - else if (b->do_lookup == do_dns64_lookup) - return (dns64_cname(zone, name, lookup)); else return (ISC_R_NOTFOUND); } +static isc_result_t +dns64_lookup(const dns_name_t *zone, const dns_name_t *name, void *dbdata, + dns_sdblookup_t *lookup) +{ + builtin_t *b = (builtin_t *) dbdata; + + if (name->labels == 0 && name->length == 0) + return (b->do_lookup(lookup)); + else + return (dns64_cname(zone, name, lookup)); +} + static isc_result_t put_txt(dns_sdblookup_t *lookup, const char *text) { unsigned char buf[256]; @@ -481,7 +531,17 @@ static dns_sdbmethods_t builtin_methods = { builtin_authority, NULL, /* allnodes */ builtin_create, - builtin_destroy + builtin_destroy, + NULL +}; + +static dns_sdbmethods_t dns64_methods = { + NULL, + builtin_authority, + NULL, /* allnodes */ + builtin_create, + builtin_destroy, + dns64_lookup, }; isc_result_t @@ -491,11 +551,17 @@ ns_builtin_init(void) { DNS_SDBFLAG_RELATIVERDATA, ns_g_mctx, &builtin_impl) == ISC_R_SUCCESS); + RUNTIME_CHECK(dns_sdb_register("_dns64", &dns64_methods, NULL, + DNS_SDBFLAG_RELATIVEOWNER | + DNS_SDBFLAG_RELATIVERDATA | + DNS_SDBFLAG_DNS64, + ns_g_mctx, &dns64_impl) + == ISC_R_SUCCESS); return (ISC_R_SUCCESS); } void ns_builtin_deinit(void) { dns_sdb_unregister(&builtin_impl); + dns_sdb_unregister(&dns64_impl); } - diff --git a/contrib/bind9/bin/named/query.c b/contrib/bind9/bin/named/query.c index 6d2ee445b8b..9464a828ca5 100644 --- a/contrib/bind9/bin/named/query.c +++ b/contrib/bind9/bin/named/query.c @@ -3354,6 +3354,11 @@ query_addwildcardproof(ns_client_t *client, dns_db_t *db, dns_name_copy(name, cname, NULL); while (result == DNS_R_NXDOMAIN) { labels = dns_name_countlabels(cname) - 1; + /* + * Sanity check. + */ + if (labels == 0U) + goto cleanup; dns_name_split(cname, labels, NULL, cname); result = dns_db_find(db, cname, version, dns_rdatatype_nsec, diff --git a/contrib/bind9/bin/named/server.c b/contrib/bind9/bin/named/server.c index 46f26c4f053..666d8541aee 100644 --- a/contrib/bind9/bin/named/server.c +++ b/contrib/bind9/bin/named/server.c @@ -1358,7 +1358,7 @@ dns64_reverse(dns_view_t *view, isc_mem_t *mctx, isc_netaddr_t *na, { char *cp; char reverse[48+sizeof("ip6.arpa.")]; - const char *dns64_dbtype[4] = { "_builtin", "dns64", ".", "." }; + const char *dns64_dbtype[4] = { "_dns64", "dns64", ".", "." }; const char *sep = ": view "; const char *viewname = view->name; const unsigned char *s6; diff --git a/contrib/bind9/bin/named/unix/dlz_dlopen_driver.c b/contrib/bind9/bin/named/unix/dlz_dlopen_driver.c index ca4b1fdfcda..edd394656d2 100644 --- a/contrib/bind9/bin/named/unix/dlz_dlopen_driver.c +++ b/contrib/bind9/bin/named/unix/dlz_dlopen_driver.c @@ -250,7 +250,7 @@ dlopen_dlz_create(const char *dlzname, unsigned int argc, char *argv[], isc_mutex_init(&cd->lock); /* Open the library */ - dlopen_flags = RTLD_NOW; + dlopen_flags = RTLD_NOW|RTLD_GLOBAL; #ifdef RTLD_DEEPBIND /* diff --git a/contrib/bind9/lib/bind9/api b/contrib/bind9/lib/bind9/api index 74bc3386880..089e7828a71 100644 --- a/contrib/bind9/lib/bind9/api +++ b/contrib/bind9/lib/bind9/api @@ -4,5 +4,5 @@ # 9.8: 80-89 # 9.9: 90-109 LIBINTERFACE = 80 -LIBREVISION = 4 +LIBREVISION = 5 LIBAGE = 0 diff --git a/contrib/bind9/lib/bind9/check.c b/contrib/bind9/lib/bind9/check.c index 695a2301d31..26eaa1aaf97 100644 --- a/contrib/bind9/lib/bind9/check.c +++ b/contrib/bind9/lib/bind9/check.c @@ -434,7 +434,7 @@ check_dns64(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions, int nbytes; int i; - static const char *acls[] = { "client", "exclude", "mapped", NULL}; + static const char *acls[] = { "clients", "exclude", "mapped", NULL}; if (voptions != NULL) cfg_map_get(voptions, "dns64", &dns64); diff --git a/contrib/bind9/lib/dns/api b/contrib/bind9/lib/dns/api index 69ec5c4e468..9e783a5431c 100644 --- a/contrib/bind9/lib/dns/api +++ b/contrib/bind9/lib/dns/api @@ -4,5 +4,5 @@ # 9.8: 80-89 # 9.9: 90-109 LIBINTERFACE = 87 -LIBREVISION = 0 +LIBREVISION = 1 LIBAGE = 6 diff --git a/contrib/bind9/lib/dns/dnssec.c b/contrib/bind9/lib/dns/dnssec.c index 34dd46477a1..b72e82daf7f 100644 --- a/contrib/bind9/lib/dns/dnssec.c +++ b/contrib/bind9/lib/dns/dnssec.c @@ -1246,7 +1246,7 @@ dns_dnssec_findmatchingkeys(dns_name_t *origin, const char *directory, isc_dir_init(&dir); isc_buffer_init(&b, namebuf, sizeof(namebuf) - 1); - RETERR(dns_name_totext(origin, ISC_FALSE, &b)); + RETERR(dns_name_tofilenametext(origin, ISC_FALSE, &b)); len = isc_buffer_usedlength(&b); namebuf[len] = '\0'; diff --git a/contrib/bind9/lib/dns/include/dns/ecdb.h b/contrib/bind9/lib/dns/include/dns/ecdb.h index 5c735b53cc5..246cc30a382 100644 --- a/contrib/bind9/lib/dns/include/dns/ecdb.h +++ b/contrib/bind9/lib/dns/include/dns/ecdb.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2009, 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -39,6 +39,8 @@ *** Functions ***/ +ISC_LANG_BEGINDECLS + /* TBD: describe those */ isc_result_t diff --git a/contrib/bind9/lib/dns/include/dns/rpz.h b/contrib/bind9/lib/dns/include/dns/rpz.h index fbbe5395dd7..59d4f875f27 100644 --- a/contrib/bind9/lib/dns/include/dns/rpz.h +++ b/contrib/bind9/lib/dns/include/dns/rpz.h @@ -194,5 +194,7 @@ dns_rpz_cidr_find(dns_rpz_cidr_t *cidr, const isc_netaddr_t *netaddr, dns_rpz_policy_t dns_rpz_decode_cname(dns_rdataset_t *, dns_name_t *selfname); +ISC_LANG_ENDDECLS + #endif /* DNS_RPZ_H */ diff --git a/contrib/bind9/lib/dns/include/dns/sdb.h b/contrib/bind9/lib/dns/include/dns/sdb.h index 4b3ab480d55..c57c4a1d038 100644 --- a/contrib/bind9/lib/dns/include/dns/sdb.h +++ b/contrib/bind9/lib/dns/include/dns/sdb.h @@ -59,6 +59,9 @@ typedef struct dns_sdballnodes dns_sdballnodes_t; typedef isc_result_t (*dns_sdblookupfunc_t)(const char *zone, const char *name, void *dbdata, dns_sdblookup_t *); +typedef isc_result_t +(*dns_sdblookup2func_t)(const dns_name_t *zone, const dns_name_t *name, + void *dbdata, dns_sdblookup_t *lookup); typedef isc_result_t (*dns_sdbauthorityfunc_t)(const char *zone, void *dbdata, dns_sdblookup_t *); @@ -81,6 +84,7 @@ typedef struct dns_sdbmethods { dns_sdballnodesfunc_t allnodes; dns_sdbcreatefunc_t create; dns_sdbdestroyfunc_t destroy; + dns_sdblookup2func_t lookup2; } dns_sdbmethods_t; /*** @@ -92,6 +96,7 @@ ISC_LANG_BEGINDECLS #define DNS_SDBFLAG_RELATIVEOWNER 0x00000001U #define DNS_SDBFLAG_RELATIVERDATA 0x00000002U #define DNS_SDBFLAG_THREADSAFE 0x00000004U +#define DNS_SDBFLAG_DNS64 0x00000008U isc_result_t dns_sdb_register(const char *drivername, const dns_sdbmethods_t *methods, diff --git a/contrib/bind9/lib/dns/include/dns/stats.h b/contrib/bind9/lib/dns/include/dns/stats.h index b8dc17eba5e..bc77d1e9c5a 100644 --- a/contrib/bind9/lib/dns/include/dns/stats.h +++ b/contrib/bind9/lib/dns/include/dns/stats.h @@ -147,6 +147,8 @@ typedef void (*dns_rdatatypestats_dumper_t)(dns_rdatastatstype_t, isc_uint64_t, void *); typedef void (*dns_opcodestats_dumper_t)(dns_opcode_t, isc_uint64_t, void *); +ISC_LANG_BEGINDECLS + isc_result_t dns_generalstats_create(isc_mem_t *mctx, dns_stats_t **statsp, int ncounters); /*%< diff --git a/contrib/bind9/lib/dns/include/dns/tsec.h b/contrib/bind9/lib/dns/include/dns/tsec.h index a9d60c21c6c..4f31c3e2949 100644 --- a/contrib/bind9/lib/dns/include/dns/tsec.h +++ b/contrib/bind9/lib/dns/include/dns/tsec.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2009, 2010, 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -132,4 +132,6 @@ dns_tsec_getkey(dns_tsec_t *tsec, void *keyp); *\li *tsecp points to a valid key structure depending on the TSEC type. */ +ISC_LANG_ENDDECLS + #endif /* DNS_TSEC_H */ diff --git a/contrib/bind9/lib/dns/include/dns/view.h b/contrib/bind9/lib/dns/include/dns/view.h index 6f7140c0184..7db600bdd81 100644 --- a/contrib/bind9/lib/dns/include/dns/view.h +++ b/contrib/bind9/lib/dns/include/dns/view.h @@ -1075,4 +1075,6 @@ dns_view_setnewzones(dns_view_t *view, isc_boolean_t allow, void *cfgctx, void dns_view_restorekeyring(dns_view_t *view); +ISC_LANG_ENDDECLS + #endif /* DNS_VIEW_H */ diff --git a/contrib/bind9/lib/dns/rbtdb.c b/contrib/bind9/lib/dns/rbtdb.c index 1550221ab25..a2523ba4c7d 100644 --- a/contrib/bind9/lib/dns/rbtdb.c +++ b/contrib/bind9/lib/dns/rbtdb.c @@ -7814,7 +7814,7 @@ dns_rbtdb_create for (i = 0 ; i < (int)rbtdb->node_lock_count ; i++) if (rbtdb->heaps[i] != NULL) isc_heap_destroy(&rbtdb->heaps[i]); - isc_mem_put(mctx, rbtdb->heaps, + isc_mem_put(hmctx, rbtdb->heaps, rbtdb->node_lock_count * sizeof(isc_heap_t *)); } diff --git a/contrib/bind9/lib/dns/rdata.c b/contrib/bind9/lib/dns/rdata.c index 8773145ed6f..f6807d1a400 100644 --- a/contrib/bind9/lib/dns/rdata.c +++ b/contrib/bind9/lib/dns/rdata.c @@ -329,8 +329,8 @@ dns_rdata_compare(const dns_rdata_t *rdata1, const dns_rdata_t *rdata2) { REQUIRE(rdata1 != NULL); REQUIRE(rdata2 != NULL); - REQUIRE(rdata1->data != NULL); - REQUIRE(rdata2->data != NULL); + REQUIRE(rdata1->length == 0 || rdata1->data != NULL); + REQUIRE(rdata2->length == 0 || rdata2->data != NULL); REQUIRE(DNS_RDATA_VALIDFLAGS(rdata1)); REQUIRE(DNS_RDATA_VALIDFLAGS(rdata2)); @@ -360,8 +360,8 @@ dns_rdata_casecompare(const dns_rdata_t *rdata1, const dns_rdata_t *rdata2) { REQUIRE(rdata1 != NULL); REQUIRE(rdata2 != NULL); - REQUIRE(rdata1->data != NULL); - REQUIRE(rdata2->data != NULL); + REQUIRE(rdata1->length == 0 || rdata1->data != NULL); + REQUIRE(rdata2->length == 0 || rdata2->data != NULL); REQUIRE(DNS_RDATA_VALIDFLAGS(rdata1)); REQUIRE(DNS_RDATA_VALIDFLAGS(rdata2)); diff --git a/contrib/bind9/lib/dns/rdata/generic/tlsa_52.c b/contrib/bind9/lib/dns/rdata/generic/tlsa_52.c new file mode 100644 index 00000000000..11c6d7528f9 --- /dev/null +++ b/contrib/bind9/lib/dns/rdata/generic/tlsa_52.c @@ -0,0 +1,290 @@ +/* + * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id$ */ + +/* draft-ietf-dane-protocol-19.txt */ + +#ifndef RDATA_GENERIC_TLSA_52_C +#define RDATA_GENERIC_TLSA_52_C + +#define RRTYPE_TLSA_ATTRIBUTES 0 + +static inline isc_result_t +fromtext_tlsa(ARGS_FROMTEXT) { + isc_token_t token; + + REQUIRE(type == 52); + + UNUSED(type); + UNUSED(rdclass); + UNUSED(origin); + UNUSED(options); + UNUSED(callbacks); + + /* + * Certificate Usage. + */ + RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number, + ISC_FALSE)); + if (token.value.as_ulong > 0xffU) + RETTOK(ISC_R_RANGE); + RETERR(uint8_tobuffer(token.value.as_ulong, target)); + + /* + * Selector. + */ + RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number, + ISC_FALSE)); + if (token.value.as_ulong > 0xffU) + RETTOK(ISC_R_RANGE); + RETERR(uint8_tobuffer(token.value.as_ulong, target)); + + /* + * Matching type. + */ + RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number, + ISC_FALSE)); + if (token.value.as_ulong > 0xffU) + RETTOK(ISC_R_RANGE); + RETERR(uint8_tobuffer(token.value.as_ulong, target)); + + /* + * Certificate Association Data. + */ + return (isc_hex_tobuffer(lexer, target, -1)); +} + +static inline isc_result_t +totext_tlsa(ARGS_TOTEXT) { + isc_region_t sr; + char buf[sizeof("64000 ")]; + unsigned int n; + + REQUIRE(rdata->type == 52); + REQUIRE(rdata->length != 0); + + UNUSED(tctx); + + dns_rdata_toregion(rdata, &sr); + + /* + * Certificate Usage. + */ + n = uint8_fromregion(&sr); + isc_region_consume(&sr, 1); + sprintf(buf, "%u ", n); + RETERR(str_totext(buf, target)); + + /* + * Selector. + */ + n = uint8_fromregion(&sr); + isc_region_consume(&sr, 1); + sprintf(buf, "%u ", n); + RETERR(str_totext(buf, target)); + + /* + * Matching type. + */ + n = uint8_fromregion(&sr); + isc_region_consume(&sr, 1); + sprintf(buf, "%u", n); + RETERR(str_totext(buf, target)); + + /* + * Certificate Association Data. + */ + if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0) + RETERR(str_totext(" (", target)); + RETERR(str_totext(tctx->linebreak, target)); + if (tctx->width == 0) /* No splitting */ + RETERR(isc_hex_totext(&sr, 0, "", target)); + else + RETERR(isc_hex_totext(&sr, tctx->width - 2, + tctx->linebreak, target)); + if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0) + RETERR(str_totext(" )", target)); + return (ISC_R_SUCCESS); +} + +static inline isc_result_t +fromwire_tlsa(ARGS_FROMWIRE) { + isc_region_t sr; + + REQUIRE(type == 52); + + UNUSED(type); + UNUSED(rdclass); + UNUSED(dctx); + UNUSED(options); + + isc_buffer_activeregion(source, &sr); + + if (sr.length < 3) + return (ISC_R_UNEXPECTEDEND); + + isc_buffer_forward(source, sr.length); + return (mem_tobuffer(target, sr.base, sr.length)); +} + +static inline isc_result_t +towire_tlsa(ARGS_TOWIRE) { + isc_region_t sr; + + REQUIRE(rdata->type == 52); + REQUIRE(rdata->length != 0); + + UNUSED(cctx); + + dns_rdata_toregion(rdata, &sr); + return (mem_tobuffer(target, sr.base, sr.length)); +} + +static inline int +compare_tlsa(ARGS_COMPARE) { + isc_region_t r1; + isc_region_t r2; + + REQUIRE(rdata1->type == rdata2->type); + REQUIRE(rdata1->rdclass == rdata2->rdclass); + REQUIRE(rdata1->type == 52); + REQUIRE(rdata1->length != 0); + REQUIRE(rdata2->length != 0); + + dns_rdata_toregion(rdata1, &r1); + dns_rdata_toregion(rdata2, &r2); + return (isc_region_compare(&r1, &r2)); +} + +static inline isc_result_t +fromstruct_tlsa(ARGS_FROMSTRUCT) { + dns_rdata_tlsa_t *tlsa = source; + + REQUIRE(type == 52); + REQUIRE(source != NULL); + REQUIRE(tlsa->common.rdtype == type); + REQUIRE(tlsa->common.rdclass == rdclass); + + UNUSED(type); + UNUSED(rdclass); + + RETERR(uint8_tobuffer(tlsa->usage, target)); + RETERR(uint8_tobuffer(tlsa->selector, target)); + RETERR(uint8_tobuffer(tlsa->match, target)); + + return (mem_tobuffer(target, tlsa->data, tlsa->length)); +} + +static inline isc_result_t +tostruct_tlsa(ARGS_TOSTRUCT) { + dns_rdata_tlsa_t *tlsa = target; + isc_region_t region; + + REQUIRE(rdata->type == 52); + REQUIRE(target != NULL); + REQUIRE(rdata->length != 0); + + tlsa->common.rdclass = rdata->rdclass; + tlsa->common.rdtype = rdata->type; + ISC_LINK_INIT(&tlsa->common, link); + + dns_rdata_toregion(rdata, ®ion); + + tlsa->usage = uint8_fromregion(®ion); + isc_region_consume(®ion, 1); + tlsa->selector = uint8_fromregion(®ion); + isc_region_consume(®ion, 1); + tlsa->match = uint8_fromregion(®ion); + isc_region_consume(®ion, 1); + tlsa->length = region.length; + + tlsa->data = mem_maybedup(mctx, region.base, region.length); + if (tlsa->data == NULL) + return (ISC_R_NOMEMORY); + + tlsa->mctx = mctx; + return (ISC_R_SUCCESS); +} + +static inline void +freestruct_tlsa(ARGS_FREESTRUCT) { + dns_rdata_tlsa_t *tlsa = source; + + REQUIRE(tlsa != NULL); + REQUIRE(tlsa->common.rdtype == 52); + + if (tlsa->mctx == NULL) + return; + + if (tlsa->data != NULL) + isc_mem_free(tlsa->mctx, tlsa->data); + tlsa->mctx = NULL; +} + +static inline isc_result_t +additionaldata_tlsa(ARGS_ADDLDATA) { + REQUIRE(rdata->type == 52); + + UNUSED(rdata); + UNUSED(add); + UNUSED(arg); + + return (ISC_R_SUCCESS); +} + +static inline isc_result_t +digest_tlsa(ARGS_DIGEST) { + isc_region_t r; + + REQUIRE(rdata->type == 52); + + dns_rdata_toregion(rdata, &r); + + return ((digest)(arg, &r)); +} + +static inline isc_boolean_t +checkowner_tlsa(ARGS_CHECKOWNER) { + + REQUIRE(type == 52); + + UNUSED(name); + UNUSED(type); + UNUSED(rdclass); + UNUSED(wildcard); + + return (ISC_TRUE); +} + +static inline isc_boolean_t +checknames_tlsa(ARGS_CHECKNAMES) { + + REQUIRE(rdata->type == 52); + + UNUSED(rdata); + UNUSED(owner); + UNUSED(bad); + + return (ISC_TRUE); +} + +static inline int +casecompare_tlsa(ARGS_COMPARE) { + return (compare_tlsa(rdata1, rdata2)); +} + +#endif /* RDATA_GENERIC_TLSA_52_C */ diff --git a/contrib/bind9/lib/dns/rdata/generic/tlsa_52.h b/contrib/bind9/lib/dns/rdata/generic/tlsa_52.h new file mode 100644 index 00000000000..83ce9529976 --- /dev/null +++ b/contrib/bind9/lib/dns/rdata/generic/tlsa_52.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id$ */ + +#ifndef GENERIC_TLSA_52_H +#define GENERIC_TLSA_52_H 1 + +/*! + * \brief per draft-ietf-dane-protocol-19.txt + */ +typedef struct dns_rdata_tlsa { + dns_rdatacommon_t common; + isc_mem_t *mctx; + isc_uint8_t usage; + isc_uint8_t selector; + isc_uint8_t match; + isc_uint16_t length; + unsigned char *data; +} dns_rdata_tlsa_t; + +#endif /* GENERIC_TLSA_52_H */ diff --git a/contrib/bind9/lib/dns/rdataslab.c b/contrib/bind9/lib/dns/rdataslab.c index 150d9b8d4c8..6fbfdd715c9 100644 --- a/contrib/bind9/lib/dns/rdataslab.c +++ b/contrib/bind9/lib/dns/rdataslab.c @@ -126,6 +126,11 @@ isc_result_t dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region, unsigned int reservelen) { + /* + * Use &removed as a sentinal pointer for duplicate + * rdata as rdata.data == NULL is valid. + */ + static unsigned char removed; struct xrdata *x; unsigned char *rawbuf; #if DNS_RDATASET_FIXED @@ -169,6 +174,7 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx, INSIST(result == ISC_R_SUCCESS); dns_rdata_init(&x[i].rdata); dns_rdataset_current(rdataset, &x[i].rdata); + INSIST(x[i].rdata.data != &removed); #if DNS_RDATASET_FIXED x[i].order = i; #endif @@ -201,8 +207,7 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx, */ for (i = 1; i < nalloc; i++) { if (compare_rdata(&x[i-1].rdata, &x[i].rdata) == 0) { - x[i-1].rdata.data = NULL; - x[i-1].rdata.length = 0; + x[i-1].rdata.data = &removed; #if DNS_RDATASET_FIXED /* * Preserve the least order so A, B, A -> A, B @@ -292,7 +297,7 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx, #endif for (i = 0; i < nalloc; i++) { - if (x[i].rdata.data == NULL) + if (x[i].rdata.data == &removed) continue; #if DNS_RDATASET_FIXED offsettable[x[i].order] = rawbuf - offsetbase; diff --git a/contrib/bind9/lib/dns/resolver.c b/contrib/bind9/lib/dns/resolver.c index 3084dd8a1c9..1ae2f16bea3 100644 --- a/contrib/bind9/lib/dns/resolver.c +++ b/contrib/bind9/lib/dns/resolver.c @@ -180,7 +180,9 @@ struct fetchctx { dns_rdatatype_t type; unsigned int options; unsigned int bucketnum; - char * info; + char * info; + isc_mem_t * mctx; + /*% Locked by appropriate bucket lock. */ fetchstate state; isc_boolean_t want_shutdown; @@ -446,7 +448,8 @@ static void resquery_response(isc_task_t *task, isc_event_t *event); static void resquery_connected(isc_task_t *task, isc_event_t *event); static void fctx_try(fetchctx_t *fctx, isc_boolean_t retrying, isc_boolean_t badcache); -static isc_boolean_t fctx_destroy(fetchctx_t *fctx); +static void fctx_destroy(fetchctx_t *fctx); +static isc_boolean_t fctx_unlink(fetchctx_t *fctx); static isc_result_t ncache_adderesult(dns_message_t *message, dns_db_t *cache, dns_dbnode_t *node, dns_rdatatype_t covers, @@ -478,8 +481,7 @@ valcreate(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, dns_name_t *name, dns_valarg_t *valarg; isc_result_t result; - valarg = isc_mem_get(fctx->res->buckets[fctx->bucketnum].mctx, - sizeof(*valarg)); + valarg = isc_mem_get(fctx->mctx, sizeof(*valarg)); if (valarg == NULL) return (ISC_R_NOMEMORY); @@ -501,8 +503,7 @@ valcreate(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, dns_name_t *name, } ISC_LIST_APPEND(fctx->validators, validator, link); } else - isc_mem_put(fctx->res->buckets[fctx->bucketnum].mctx, - valarg, sizeof(*valarg)); + isc_mem_put(fctx->mctx, valarg, sizeof(*valarg)); return (result); } @@ -1386,13 +1387,12 @@ fctx_query(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, dns_message_reset(fctx->rmessage, DNS_MESSAGE_INTENTPARSE); - query = isc_mem_get(res->buckets[fctx->bucketnum].mctx, - sizeof(*query)); + query = isc_mem_get(fctx->mctx, sizeof(*query)); if (query == NULL) { result = ISC_R_NOMEMORY; goto stop_idle_timer; } - query->mctx = res->buckets[fctx->bucketnum].mctx; + query->mctx = fctx->mctx; query->options = options; query->attributes = 0; query->sends = 0; @@ -1569,8 +1569,7 @@ fctx_query(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, cleanup_query: if (query->connects == 0) { query->magic = 0; - isc_mem_put(res->buckets[fctx->bucketnum].mctx, - query, sizeof(*query)); + isc_mem_put(fctx->mctx, query, sizeof(*query)); } stop_idle_timer: @@ -1600,8 +1599,7 @@ add_bad_edns(fetchctx_t *fctx, isc_sockaddr_t *address) { if (bad_edns(fctx, address)) return; - sa = isc_mem_get(fctx->res->buckets[fctx->bucketnum].mctx, - sizeof(*sa)); + sa = isc_mem_get(fctx->mctx, sizeof(*sa)); if (sa == NULL) return; @@ -1630,8 +1628,7 @@ add_triededns(fetchctx_t *fctx, isc_sockaddr_t *address) { if (triededns(fctx, address)) return; - sa = isc_mem_get(fctx->res->buckets[fctx->bucketnum].mctx, - sizeof(*sa)); + sa = isc_mem_get(fctx->mctx, sizeof(*sa)); if (sa == NULL) return; @@ -1660,8 +1657,7 @@ add_triededns512(fetchctx_t *fctx, isc_sockaddr_t *address) { if (triededns512(fctx, address)) return; - sa = isc_mem_get(fctx->res->buckets[fctx->bucketnum].mctx, - sizeof(*sa)); + sa = isc_mem_get(fctx->mctx, sizeof(*sa)); if (sa == NULL) return; @@ -2166,8 +2162,8 @@ fctx_finddone(isc_task_t *task, isc_event_t *event) { isc_boolean_t want_try = ISC_FALSE; isc_boolean_t want_done = ISC_FALSE; isc_boolean_t bucket_empty = ISC_FALSE; - isc_boolean_t destroy = ISC_FALSE; unsigned int bucketnum; + isc_boolean_t destroy = ISC_FALSE; find = event->ev_sender; fctx = event->ev_arg; @@ -2205,17 +2201,14 @@ fctx_finddone(isc_task_t *task, isc_event_t *event) { } } else if (SHUTTINGDOWN(fctx) && fctx->pending == 0 && fctx->nqueries == 0 && ISC_LIST_EMPTY(fctx->validators)) { - /* - * Note that we had to wait until we had the lock before - * looking at fctx->references. - */ - if (fctx->references == 0) + + if (fctx->references == 0) { + bucket_empty = fctx_unlink(fctx); destroy = ISC_TRUE; + } } UNLOCK(&res->buckets[bucketnum].lock); - if (destroy) - bucket_empty = fctx_destroy(fctx); isc_event_free(&event); dns_adb_destroyfind(&find); @@ -2223,8 +2216,11 @@ fctx_finddone(isc_task_t *task, isc_event_t *event) { fctx_try(fctx, ISC_TRUE, ISC_FALSE); else if (want_done) fctx_done(fctx, ISC_R_FAILURE, __LINE__); - else if (bucket_empty) - empty_bucket(res); + else if (destroy) { + fctx_destroy(fctx); + if (bucket_empty) + empty_bucket(res); + } } @@ -2347,8 +2343,7 @@ add_bad(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, isc_result_t reason, FCTXTRACE("add_bad"); - sa = isc_mem_get(fctx->res->buckets[fctx->bucketnum].mctx, - sizeof(*sa)); + sa = isc_mem_get(fctx->mctx, sizeof(*sa)); if (sa == NULL) return; *sa = *address; @@ -2631,12 +2626,9 @@ fctx_getaddresses(fetchctx_t *fctx, isc_boolean_t badcache) { fctx->fwdpolicy = forwarders->fwdpolicy; if (fctx->fwdpolicy == dns_fwdpolicy_only && isstrictsubdomain(domain, &fctx->domain)) { - isc_mem_t *mctx; - - mctx = res->buckets[fctx->bucketnum].mctx; - dns_name_free(&fctx->domain, mctx); + dns_name_free(&fctx->domain, fctx->mctx); dns_name_init(&fctx->domain, NULL); - result = dns_name_dup(domain, mctx, + result = dns_name_dup(domain, fctx->mctx, &fctx->domain); if (result != ISC_R_SUCCESS) return (result); @@ -3075,10 +3067,9 @@ fctx_try(fetchctx_t *fctx, isc_boolean_t retrying, isc_boolean_t badcache) { } static isc_boolean_t -fctx_destroy(fetchctx_t *fctx) { +fctx_unlink(fetchctx_t *fctx) { dns_resolver_t *res; unsigned int bucketnum; - isc_sockaddr_t *sa, *next_sa; /* * Caller must be holding the bucket lock. @@ -3095,61 +3086,13 @@ fctx_destroy(fetchctx_t *fctx) { REQUIRE(fctx->references == 0); REQUIRE(ISC_LIST_EMPTY(fctx->validators)); - FCTXTRACE("destroy"); + FCTXTRACE("unlink"); res = fctx->res; bucketnum = fctx->bucketnum; ISC_LIST_UNLINK(res->buckets[bucketnum].fctxs, fctx, link); - /* - * Free bad. - */ - for (sa = ISC_LIST_HEAD(fctx->bad); - sa != NULL; - sa = next_sa) { - next_sa = ISC_LIST_NEXT(sa, link); - ISC_LIST_UNLINK(fctx->bad, sa, link); - isc_mem_put(res->buckets[bucketnum].mctx, sa, sizeof(*sa)); - } - - for (sa = ISC_LIST_HEAD(fctx->edns); - sa != NULL; - sa = next_sa) { - next_sa = ISC_LIST_NEXT(sa, link); - ISC_LIST_UNLINK(fctx->edns, sa, link); - isc_mem_put(res->buckets[bucketnum].mctx, sa, sizeof(*sa)); - } - - for (sa = ISC_LIST_HEAD(fctx->edns512); - sa != NULL; - sa = next_sa) { - next_sa = ISC_LIST_NEXT(sa, link); - ISC_LIST_UNLINK(fctx->edns512, sa, link); - isc_mem_put(res->buckets[bucketnum].mctx, sa, sizeof(*sa)); - } - - for (sa = ISC_LIST_HEAD(fctx->bad_edns); - sa != NULL; - sa = next_sa) { - next_sa = ISC_LIST_NEXT(sa, link); - ISC_LIST_UNLINK(fctx->bad_edns, sa, link); - isc_mem_put(res->buckets[bucketnum].mctx, sa, sizeof(*sa)); - } - - isc_timer_detach(&fctx->timer); - dns_message_destroy(&fctx->rmessage); - dns_message_destroy(&fctx->qmessage); - if (dns_name_countlabels(&fctx->domain) > 0) - dns_name_free(&fctx->domain, res->buckets[bucketnum].mctx); - if (dns_rdataset_isassociated(&fctx->nameservers)) - dns_rdataset_disassociate(&fctx->nameservers); - dns_name_free(&fctx->name, res->buckets[bucketnum].mctx); - dns_db_detach(&fctx->cache); - dns_adb_detach(&fctx->adb); - isc_mem_free(res->buckets[bucketnum].mctx, fctx->info); - isc_mem_put(res->buckets[bucketnum].mctx, fctx, sizeof(*fctx)); - LOCK(&res->nlock); res->nfctx--; UNLOCK(&res->nlock); @@ -3161,6 +3104,73 @@ fctx_destroy(fetchctx_t *fctx) { return (ISC_FALSE); } +static void +fctx_destroy(fetchctx_t *fctx) { + isc_sockaddr_t *sa, *next_sa; + + REQUIRE(VALID_FCTX(fctx)); + REQUIRE(fctx->state == fetchstate_done || + fctx->state == fetchstate_init); + REQUIRE(ISC_LIST_EMPTY(fctx->events)); + REQUIRE(ISC_LIST_EMPTY(fctx->queries)); + REQUIRE(ISC_LIST_EMPTY(fctx->finds)); + REQUIRE(ISC_LIST_EMPTY(fctx->altfinds)); + REQUIRE(fctx->pending == 0); + REQUIRE(fctx->references == 0); + REQUIRE(ISC_LIST_EMPTY(fctx->validators)); + REQUIRE(!ISC_LINK_LINKED(fctx, link)); + + FCTXTRACE("destroy"); + + /* + * Free bad. + */ + for (sa = ISC_LIST_HEAD(fctx->bad); + sa != NULL; + sa = next_sa) { + next_sa = ISC_LIST_NEXT(sa, link); + ISC_LIST_UNLINK(fctx->bad, sa, link); + isc_mem_put(fctx->mctx, sa, sizeof(*sa)); + } + + for (sa = ISC_LIST_HEAD(fctx->edns); + sa != NULL; + sa = next_sa) { + next_sa = ISC_LIST_NEXT(sa, link); + ISC_LIST_UNLINK(fctx->edns, sa, link); + isc_mem_put(fctx->mctx, sa, sizeof(*sa)); + } + + for (sa = ISC_LIST_HEAD(fctx->edns512); + sa != NULL; + sa = next_sa) { + next_sa = ISC_LIST_NEXT(sa, link); + ISC_LIST_UNLINK(fctx->edns512, sa, link); + isc_mem_put(fctx->mctx, sa, sizeof(*sa)); + } + + for (sa = ISC_LIST_HEAD(fctx->bad_edns); + sa != NULL; + sa = next_sa) { + next_sa = ISC_LIST_NEXT(sa, link); + ISC_LIST_UNLINK(fctx->bad_edns, sa, link); + isc_mem_put(fctx->mctx, sa, sizeof(*sa)); + } + + isc_timer_detach(&fctx->timer); + dns_message_destroy(&fctx->rmessage); + dns_message_destroy(&fctx->qmessage); + if (dns_name_countlabels(&fctx->domain) > 0) + dns_name_free(&fctx->domain, fctx->mctx); + if (dns_rdataset_isassociated(&fctx->nameservers)) + dns_rdataset_disassociate(&fctx->nameservers); + dns_name_free(&fctx->name, fctx->mctx); + dns_db_detach(&fctx->cache); + dns_adb_detach(&fctx->adb); + isc_mem_free(fctx->mctx, fctx->info); + isc_mem_putanddetach(&fctx->mctx, fctx, sizeof(*fctx)); +} + /* * Fetch event handlers. */ @@ -3258,6 +3268,7 @@ fctx_doshutdown(isc_task_t *task, isc_event_t *event) { dns_resolver_t *res; unsigned int bucketnum; dns_validator_t *validator; + isc_boolean_t destroy = ISC_FALSE; REQUIRE(VALID_FCTX(fctx)); @@ -3307,13 +3318,18 @@ fctx_doshutdown(isc_task_t *task, isc_event_t *event) { } if (fctx->references == 0 && fctx->pending == 0 && - fctx->nqueries == 0 && ISC_LIST_EMPTY(fctx->validators)) - bucket_empty = fctx_destroy(fctx); + fctx->nqueries == 0 && ISC_LIST_EMPTY(fctx->validators)) { + bucket_empty = fctx_unlink(fctx); + destroy = ISC_TRUE; + } UNLOCK(&res->buckets[bucketnum].lock); - if (bucket_empty) - empty_bucket(res); + if (destroy) { + fctx_destroy(fctx); + if (bucket_empty) + empty_bucket(res); + } } static void @@ -3322,6 +3338,7 @@ fctx_start(isc_task_t *task, isc_event_t *event) { isc_boolean_t done = ISC_FALSE, bucket_empty = ISC_FALSE; dns_resolver_t *res; unsigned int bucketnum; + isc_boolean_t destroy = ISC_FALSE; REQUIRE(VALID_FCTX(fctx)); @@ -3354,7 +3371,8 @@ fctx_start(isc_task_t *task, isc_event_t *event) { /* * It's now safe to destroy this fctx. */ - bucket_empty = fctx_destroy(fctx); + bucket_empty = fctx_unlink(fctx); + destroy = ISC_TRUE; } done = ISC_TRUE; } else { @@ -3376,6 +3394,8 @@ fctx_start(isc_task_t *task, isc_event_t *event) { if (!done) { isc_result_t result; + INSIST(!destroy); + /* * All is well. Start working on the fetch. */ @@ -3384,8 +3404,11 @@ fctx_start(isc_task_t *task, isc_event_t *event) { fctx_done(fctx, result, __LINE__); else fctx_try(fctx, ISC_FALSE, ISC_FALSE); - } else if (bucket_empty) - empty_bucket(res); + } else if (destroy) { + fctx_destroy(fctx); + if (bucket_empty) + empty_bucket(res); + } } /* @@ -3473,27 +3496,29 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type, char buf[DNS_NAME_FORMATSIZE + DNS_RDATATYPE_FORMATSIZE]; char typebuf[DNS_RDATATYPE_FORMATSIZE]; dns_name_t suffix; + isc_mem_t *mctx; /* * Caller must be holding the lock for bucket number 'bucketnum'. */ REQUIRE(fctxp != NULL && *fctxp == NULL); - fctx = isc_mem_get(res->buckets[bucketnum].mctx, sizeof(*fctx)); + mctx = res->buckets[bucketnum].mctx; + fctx = isc_mem_get(mctx, sizeof(*fctx)); if (fctx == NULL) return (ISC_R_NOMEMORY); dns_name_format(name, buf, sizeof(buf)); dns_rdatatype_format(type, typebuf, sizeof(typebuf)); strcat(buf, "/"); /* checked */ strcat(buf, typebuf); /* checked */ - fctx->info = isc_mem_strdup(res->buckets[bucketnum].mctx, buf); + fctx->info = isc_mem_strdup(mctx, buf); if (fctx->info == NULL) { result = ISC_R_NOMEMORY; goto cleanup_fetch; } FCTXTRACE("create"); dns_name_init(&fctx->name, NULL); - result = dns_name_dup(name, res->buckets[bucketnum].mctx, &fctx->name); + result = dns_name_dup(name, mctx, &fctx->name); if (result != ISC_R_SUCCESS) goto cleanup_info; dns_name_init(&fctx->domain, NULL); @@ -3596,9 +3621,7 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type, NULL); if (result != ISC_R_SUCCESS) goto cleanup_name; - result = dns_name_dup(domain, - res->buckets[bucketnum].mctx, - &fctx->domain); + result = dns_name_dup(domain, mctx, &fctx->domain); if (result != ISC_R_SUCCESS) { dns_rdataset_disassociate(&fctx->nameservers); goto cleanup_name; @@ -3609,16 +3632,12 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type, /* * We're in forward-only mode. Set the query domain. */ - result = dns_name_dup(domain, - res->buckets[bucketnum].mctx, - &fctx->domain); + result = dns_name_dup(domain, mctx, &fctx->domain); if (result != ISC_R_SUCCESS) goto cleanup_name; } } else { - result = dns_name_dup(domain, - res->buckets[bucketnum].mctx, - &fctx->domain); + result = dns_name_dup(domain, mctx, &fctx->domain); if (result != ISC_R_SUCCESS) goto cleanup_name; dns_rdataset_clone(nameservers, &fctx->nameservers); @@ -3631,16 +3650,14 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type, INSIST(dns_name_issubdomain(&fctx->name, &fctx->domain)); fctx->qmessage = NULL; - result = dns_message_create(res->buckets[bucketnum].mctx, - DNS_MESSAGE_INTENTRENDER, + result = dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, &fctx->qmessage); if (result != ISC_R_SUCCESS) goto cleanup_domain; fctx->rmessage = NULL; - result = dns_message_create(res->buckets[bucketnum].mctx, - DNS_MESSAGE_INTENTPARSE, + result = dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &fctx->rmessage); if (result != ISC_R_SUCCESS) @@ -3690,6 +3707,8 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type, dns_db_attach(res->view->cachedb, &fctx->cache); fctx->adb = NULL; dns_adb_attach(res->view->adb, &fctx->adb); + fctx->mctx = NULL; + isc_mem_attach(mctx, &fctx->mctx); ISC_LIST_INIT(fctx->events); ISC_LINK_INIT(fctx, link); @@ -3713,18 +3732,18 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type, cleanup_domain: if (dns_name_countlabels(&fctx->domain) > 0) - dns_name_free(&fctx->domain, res->buckets[bucketnum].mctx); + dns_name_free(&fctx->domain, mctx); if (dns_rdataset_isassociated(&fctx->nameservers)) dns_rdataset_disassociate(&fctx->nameservers); cleanup_name: - dns_name_free(&fctx->name, res->buckets[bucketnum].mctx); + dns_name_free(&fctx->name, mctx); cleanup_info: - isc_mem_free(res->buckets[bucketnum].mctx, fctx->info); + isc_mem_free(mctx, fctx->info); cleanup_fetch: - isc_mem_put(res->buckets[bucketnum].mctx, fctx, sizeof(*fctx)); + isc_mem_put(mctx, fctx, sizeof(*fctx)); return (result); } @@ -3934,6 +3953,7 @@ maybe_destroy(fetchctx_t *fctx, isc_boolean_t locked) { isc_boolean_t bucket_empty = ISC_FALSE; dns_resolver_t *res = fctx->res; dns_validator_t *validator, *next_validator; + isc_boolean_t destroy = ISC_FALSE; REQUIRE(SHUTTINGDOWN(fctx)); @@ -3949,11 +3969,15 @@ maybe_destroy(fetchctx_t *fctx, isc_boolean_t locked) { dns_validator_cancel(validator); } - if (fctx->references == 0 && ISC_LIST_EMPTY(fctx->validators)) - bucket_empty = fctx_destroy(fctx); + if (fctx->references == 0 && ISC_LIST_EMPTY(fctx->validators)) { + bucket_empty = fctx_unlink(fctx); + destroy = ISC_TRUE; + } unlock: if (!locked) UNLOCK(&res->buckets[bucketnum].lock); + if (destroy) + fctx_destroy(fctx); return (bucket_empty); } @@ -4008,8 +4032,7 @@ validated(isc_task_t *task, isc_event_t *event) { * destroy the fctx if necessary. */ dns_validator_destroy(&vevent->validator); - isc_mem_put(res->buckets[fctx->bucketnum].mctx, - valarg, sizeof(*valarg)); + isc_mem_put(fctx->mctx, valarg, sizeof(*valarg)); negative = ISC_TF(vevent->rdataset == NULL); @@ -5723,14 +5746,11 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname, * if so we should bail out. */ INSIST(dns_name_countlabels(&fctx->domain) > 0); - dns_name_free(&fctx->domain, - fctx->res->buckets[fctx->bucketnum].mctx); + dns_name_free(&fctx->domain, fctx->mctx); if (dns_rdataset_isassociated(&fctx->nameservers)) dns_rdataset_disassociate(&fctx->nameservers); dns_name_init(&fctx->domain, NULL); - result = dns_name_dup(ns_name, - fctx->res->buckets[fctx->bucketnum].mctx, - &fctx->domain); + result = dns_name_dup(ns_name, fctx->mctx, &fctx->domain); if (result != ISC_R_SUCCESS) return (result); fctx->attributes |= FCTX_ATTR_WANTCACHE; @@ -6232,7 +6252,8 @@ fctx_decreference(fetchctx_t *fctx) { * This fctx is already shutdown; we were just * waiting for the last reference to go away. */ - bucket_empty = fctx_destroy(fctx); + bucket_empty = fctx_unlink(fctx); + fctx_destroy(fctx); } else { /* * Initiate shutdown. @@ -6287,12 +6308,9 @@ resume_dslookup(isc_task_t *task, isc_event_t *event) { fctx->ns_ttl = fctx->nameservers.ttl; fctx->ns_ttl_ok = ISC_TRUE; log_ns_ttl(fctx, "resume_dslookup"); - dns_name_free(&fctx->domain, - fctx->res->buckets[bucketnum].mctx); + dns_name_free(&fctx->domain, fctx->mctx); dns_name_init(&fctx->domain, NULL); - result = dns_name_dup(&fctx->nsname, - fctx->res->buckets[bucketnum].mctx, - &fctx->domain); + result = dns_name_dup(&fctx->nsname, fctx->mctx, &fctx->domain); if (result != ISC_R_SUCCESS) { fctx_done(fctx, DNS_R_SERVFAIL, __LINE__); goto cleanup; @@ -7210,12 +7228,9 @@ resquery_response(isc_task_t *task, isc_event_t *event) { fctx_done(fctx, DNS_R_SERVFAIL, __LINE__); return; } - dns_name_free(&fctx->domain, - fctx->res->buckets[fctx->bucketnum].mctx); + dns_name_free(&fctx->domain, fctx->mctx); dns_name_init(&fctx->domain, NULL); - result = dns_name_dup(fname, - fctx->res->buckets[fctx->bucketnum].mctx, - &fctx->domain); + result = dns_name_dup(fname, fctx->mctx, &fctx->domain); if (result != ISC_R_SUCCESS) { fctx_done(fctx, DNS_R_SERVFAIL, __LINE__); return; @@ -7955,6 +7970,7 @@ dns_resolver_createfetch2(dns_resolver_t *res, dns_name_t *name, unsigned int count = 0; unsigned int spillat; unsigned int spillatmin; + isc_boolean_t destroy = ISC_FALSE; UNUSED(forwarders); @@ -8052,16 +8068,20 @@ dns_resolver_createfetch2(dns_resolver_t *res, dns_name_t *name, isc_task_send(res->buckets[bucketnum].task, &event); } else { /* - * We don't care about the result of fctx_destroy() + * We don't care about the result of fctx_unlink() * since we know we're not exiting. */ - (void)fctx_destroy(fctx); + (void)fctx_unlink(fctx); + destroy = ISC_TRUE; } } unlock: UNLOCK(&res->buckets[bucketnum].lock); + if (destroy) + fctx_destroy(fctx); + if (result == ISC_R_SUCCESS) { FTRACE("created"); *fetchp = fetch; diff --git a/contrib/bind9/lib/dns/sdb.c b/contrib/bind9/lib/dns/sdb.c index 01ab17cc979..8092c5a551c 100644 --- a/contrib/bind9/lib/dns/sdb.c +++ b/contrib/bind9/lib/dns/sdb.c @@ -216,12 +216,13 @@ dns_sdb_register(const char *drivername, const dns_sdbmethods_t *methods, REQUIRE(drivername != NULL); REQUIRE(methods != NULL); - REQUIRE(methods->lookup != NULL); + REQUIRE(methods->lookup != NULL || methods->lookup2 != NULL); REQUIRE(mctx != NULL); REQUIRE(sdbimp != NULL && *sdbimp == NULL); REQUIRE((flags & ~(DNS_SDBFLAG_RELATIVEOWNER | DNS_SDBFLAG_RELATIVERDATA | - DNS_SDBFLAG_THREADSAFE)) == 0); + DNS_SDBFLAG_THREADSAFE| + DNS_SDBFLAG_DNS64)) == 0); imp = isc_mem_get(mctx, sizeof(dns_sdbimplementation_t)); if (imp == NULL) @@ -280,8 +281,9 @@ initial_size(unsigned int len) { } isc_result_t -dns_sdb_putrdata(dns_sdblookup_t *lookup, dns_rdatatype_t typeval, dns_ttl_t ttl, - const unsigned char *rdatap, unsigned int rdlen) +dns_sdb_putrdata(dns_sdblookup_t *lookup, dns_rdatatype_t typeval, + dns_ttl_t ttl, const unsigned char *rdatap, + unsigned int rdlen) { dns_rdatalist_t *rdatalist; dns_rdata_t *rdata; @@ -338,7 +340,6 @@ dns_sdb_putrdata(dns_sdblookup_t *lookup, dns_rdatatype_t typeval, dns_ttl_t ttl return (result); } - isc_result_t dns_sdb_putrr(dns_sdblookup_t *lookup, const char *type, dns_ttl_t ttl, const char *data) @@ -737,6 +738,8 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create, char namestr[DNS_NAME_MAXTEXT + 1]; isc_boolean_t isorigin; dns_sdbimplementation_t *imp; + dns_name_t relname; + unsigned int labels; REQUIRE(VALID_SDB(sdb)); REQUIRE(create == ISC_FALSE); @@ -747,33 +750,46 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create, imp = sdb->implementation; - isc_buffer_init(&b, namestr, sizeof(namestr)); - if ((imp->flags & DNS_SDBFLAG_RELATIVEOWNER) != 0) { - dns_name_t relname; - unsigned int labels; + isorigin = dns_name_equal(name, &sdb->common.origin); - labels = dns_name_countlabels(name) - - dns_name_countlabels(&db->origin); - dns_name_init(&relname, NULL); - dns_name_getlabelsequence(name, 0, labels, &relname); - result = dns_name_totext(&relname, ISC_TRUE, &b); - if (result != ISC_R_SUCCESS) - return (result); + if (imp->methods->lookup2 != NULL) { + if ((imp->flags & DNS_SDBFLAG_RELATIVEOWNER) != 0) { + labels = dns_name_countlabels(name) - + dns_name_countlabels(&db->origin); + dns_name_init(&relname, NULL); + dns_name_getlabelsequence(name, 0, labels, &relname); + name = &relname; + } } else { - result = dns_name_totext(name, ISC_TRUE, &b); - if (result != ISC_R_SUCCESS) - return (result); + isc_buffer_init(&b, namestr, sizeof(namestr)); + if ((imp->flags & DNS_SDBFLAG_RELATIVEOWNER) != 0) { + + labels = dns_name_countlabels(name) - + dns_name_countlabels(&db->origin); + dns_name_init(&relname, NULL); + dns_name_getlabelsequence(name, 0, labels, &relname); + result = dns_name_totext(&relname, ISC_TRUE, &b); + if (result != ISC_R_SUCCESS) + return (result); + } else { + result = dns_name_totext(name, ISC_TRUE, &b); + if (result != ISC_R_SUCCESS) + return (result); + } + isc_buffer_putuint8(&b, 0); } - isc_buffer_putuint8(&b, 0); result = createnode(sdb, &node); if (result != ISC_R_SUCCESS) return (result); - isorigin = dns_name_equal(name, &sdb->common.origin); - MAYBE_LOCK(sdb); - result = imp->methods->lookup(sdb->zone, namestr, sdb->dbdata, node); + if (imp->methods->lookup2 != NULL) + result = imp->methods->lookup2(&sdb->common.origin, name, + sdb->dbdata, node); + else + result = imp->methods->lookup(sdb->zone, namestr, sdb->dbdata, + node); MAYBE_UNLOCK(sdb); if (result != ISC_R_SUCCESS && !(result == ISC_R_NOTFOUND && @@ -811,13 +827,13 @@ find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, unsigned int nlabels, olabels; isc_result_t result; unsigned int i; + unsigned int flags; REQUIRE(VALID_SDB(sdb)); REQUIRE(nodep == NULL || *nodep == NULL); REQUIRE(version == NULL || version == (void *) &dummy); UNUSED(options); - UNUSED(sdb); if (!dns_name_issubdomain(name, &db->origin)) return (DNS_R_NXDOMAIN); @@ -834,17 +850,37 @@ find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, } result = DNS_R_NXDOMAIN; - - for (i = olabels; i <= nlabels; i++) { + flags = sdb->implementation->flags; + i = (flags & DNS_SDBFLAG_DNS64) != 0 ? nlabels : olabels; + for (; i <= nlabels; i++) { /* * Look up the next label. */ dns_name_getlabelsequence(name, nlabels - i, i, xname); result = findnode(db, xname, ISC_FALSE, &node); - if (result != ISC_R_SUCCESS) { + if (result == ISC_R_NOTFOUND) { + /* + * No data at zone apex? + */ + if (i == olabels) + return (DNS_R_BADDB); result = DNS_R_NXDOMAIN; continue; } + if (result != ISC_R_SUCCESS) + return (result); + + /* + * DNS64 zone's don't have DNAME or NS records. + */ + if ((flags & DNS_SDBFLAG_DNS64) != 0) + goto skip; + + /* + * DNS64 zone's don't have DNAME or NS records. + */ + if ((flags & DNS_SDBFLAG_DNS64) != 0) + goto skip; /* * Look for a DNAME at the current label, unless this is @@ -895,6 +931,7 @@ find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, continue; } + skip: /* * If we're looking for ANY, we're done. */ diff --git a/contrib/bind9/lib/dns/tkey.c b/contrib/bind9/lib/dns/tkey.c index bfc8e8b2576..0112f7ec760 100644 --- a/contrib/bind9/lib/dns/tkey.c +++ b/contrib/bind9/lib/dns/tkey.c @@ -485,9 +485,9 @@ process_gsstkey(dns_name_t *name, dns_rdata_tkey_t *tkeyin, tkeyout->error = dns_tsigerror_badkey; tkey_log("process_gsstkey(): dns_tsigerror_badkey"); /* XXXSRA */ return (ISC_R_SUCCESS); - } else if (result == ISC_R_FAILURE) + } + if (result != DNS_R_CONTINUE && result != ISC_R_SUCCESS) goto failure; - ENSURE(result == DNS_R_CONTINUE || result == ISC_R_SUCCESS); /* * XXXDCL Section 4.1.3: Limit GSS_S_CONTINUE_NEEDED to 10 times. */ diff --git a/contrib/bind9/lib/dns/zone.c b/contrib/bind9/lib/dns/zone.c index 61a81707973..22870dc47b6 100644 --- a/contrib/bind9/lib/dns/zone.c +++ b/contrib/bind9/lib/dns/zone.c @@ -429,6 +429,7 @@ struct dns_zonemgr { isc_ratelimiter_t * rl; isc_rwlock_t rwlock; isc_mutex_t iolock; + isc_rwlock_t urlock; /* Locked by rwlock. */ dns_zonelist_t zones; @@ -446,7 +447,7 @@ struct dns_zonemgr { dns_iolist_t high; dns_iolist_t low; - /* Locked by rwlock. */ + /* Locked by urlock. */ /* LRU cache */ struct dns_unreachable unreachable[UNREACH_CHACHE_SIZE]; }; @@ -1676,12 +1677,16 @@ zone_gotwritehandle(isc_task_t *task, isc_event_t *event) { LOCK_ZONE(zone); ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read); - dns_db_currentversion(zone->db, &version); - result = dns_master_dumpinc2(zone->mctx, zone->db, version, - &dns_master_style_default, - zone->masterfile, zone->task, dump_done, - zone, &zone->dctx, zone->masterformat); - dns_db_closeversion(zone->db, &version, ISC_FALSE); + if (zone->db != NULL) { + dns_db_currentversion(zone->db, &version); + result = dns_master_dumpinc2(zone->mctx, zone->db, version, + &dns_master_style_default, + zone->masterfile, zone->task, + dump_done, zone, &zone->dctx, + zone->masterformat); + dns_db_closeversion(zone->db, &version, ISC_FALSE); + } else + result = ISC_R_CANCELED; ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_read); UNLOCK_ZONE(zone); if (result != DNS_R_CONTINUE) @@ -2695,7 +2700,8 @@ check_nsec3param(dns_zone_t *zone, dns_db_t *db) { */ static void set_refreshkeytimer(dns_zone_t *zone, dns_rdata_keydata_t *key, - isc_stdtime_t now) { + isc_stdtime_t now) +{ const char me[] = "set_refreshkeytimer"; isc_stdtime_t then; isc_time_t timenow, timethen; @@ -4443,6 +4449,7 @@ dns_zone_setmasterswithkeys(dns_zone_t *zone, /* * Everything is ok so attach to the zone. */ + zone->curmaster = 0; zone->masters = new; zone->mastersok = newok; zone->masterkeynames = newname; @@ -8531,6 +8538,14 @@ zone_unload(dns_zone_t *zone) { REQUIRE(LOCKED_ZONE(zone)); + if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_FLUSH) || + !DNS_ZONE_FLAG(zone, DNS_ZONEFLG_DUMPING)) { + if (zone->writeio != NULL) + zonemgr_cancelio(zone->writeio); + + if (zone->dctx != NULL) + dns_dumpctx_cancel(zone->dctx); + } ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_write); zone_detachdb(zone); ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_write); @@ -9245,6 +9260,8 @@ stub_callback(isc_task_t *task, isc_event_t *event) { TIME_NOW(&now); + LOCK_ZONE(zone); + if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_EXITING)) { zone_debuglog(zone, me, 1, "exiting"); exiting = ISC_TRUE; @@ -9257,9 +9274,7 @@ stub_callback(isc_task_t *task, isc_event_t *event) { if (revent->result != ISC_R_SUCCESS) { if (revent->result == ISC_R_TIMEDOUT && !DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NOEDNS)) { - LOCK_ZONE(zone); DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NOEDNS); - UNLOCK_ZONE(zone); dns_zone_log(zone, ISC_LOG_DEBUG(1), "refreshing stub: timeout retrying " " without EDNS master %s (source %s)", @@ -9301,9 +9316,7 @@ stub_callback(isc_task_t *task, isc_event_t *event) { "refreshing stub: rcode (%.*s) retrying " "without EDNS master %s (source %s)", (int)rb.used, rcode, master, source); - LOCK_ZONE(zone); DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NOEDNS); - UNLOCK_ZONE(zone); goto same_master; } @@ -9325,9 +9338,7 @@ stub_callback(isc_task_t *task, isc_event_t *event) { master, source); goto next_master; } - LOCK_ZONE(zone); DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_USEVC); - UNLOCK_ZONE(zone); goto same_master; } @@ -9382,21 +9393,17 @@ stub_callback(isc_task_t *task, isc_event_t *event) { ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_write); dns_db_detach(&stub->db); - if (zone->masterfile != NULL) { - dns_zone_dump(zone); - TIME_NOW(&zone->loadtime); - } + if (zone->masterfile != NULL) + zone_needdump(zone, 0); dns_message_destroy(&msg); isc_event_free(&event); - LOCK_ZONE(zone); dns_request_destroy(&zone->request); DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESH); DNS_ZONE_JITTER_ADD(&now, zone->refresh, &zone->refreshtime); isc_interval_set(&i, zone->expire, 0); DNS_ZONE_TIME_ADD(&now, zone->expire, &zone->expiretime); zone_settimer(zone, &now); - UNLOCK_ZONE(zone); goto free_stub; next_master: @@ -9407,7 +9414,6 @@ stub_callback(isc_task_t *task, isc_event_t *event) { if (msg != NULL) dns_message_destroy(&msg); isc_event_free(&event); - LOCK_ZONE(zone); dns_request_destroy(&zone->request); /* * Skip to next failed / untried master. @@ -9445,25 +9451,23 @@ stub_callback(isc_task_t *task, isc_event_t *event) { DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESH); zone_settimer(zone, &now); - UNLOCK_ZONE(zone); goto free_stub; } } queue_soa_query(zone); - UNLOCK_ZONE(zone); goto free_stub; same_master: if (msg != NULL) dns_message_destroy(&msg); isc_event_free(&event); - LOCK_ZONE(zone); dns_request_destroy(&zone->request); - UNLOCK_ZONE(zone); ns_query(zone, NULL, stub); + UNLOCK_ZONE(zone); goto done; free_stub: + UNLOCK_ZONE(zone); stub->magic = 0; dns_zone_idetach(&stub->zone); INSIST(stub->db == NULL); @@ -9494,6 +9498,7 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { isc_result_t result; isc_uint32_t serial, oldserial = 0; unsigned int j; + isc_boolean_t do_queue_xfrin = ISC_FALSE; zone = revent->ev_arg; INSIST(DNS_ZONE_VALID(zone)); @@ -9502,6 +9507,10 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { ENTER; + TIME_NOW(&now); + + LOCK_ZONE(zone); + /* * if timeout log and next master; */ @@ -9509,14 +9518,10 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { isc_sockaddr_format(&zone->masteraddr, master, sizeof(master)); isc_sockaddr_format(&zone->sourceaddr, source, sizeof(source)); - TIME_NOW(&now); - if (revent->result != ISC_R_SUCCESS) { if (revent->result == ISC_R_TIMEDOUT && !DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NOEDNS)) { - LOCK_ZONE(zone); DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NOEDNS); - UNLOCK_ZONE(zone); dns_zone_log(zone, ISC_LOG_DEBUG(1), "refresh: timeout retrying without EDNS " "master %s (source %s)", master, source); @@ -9536,10 +9541,8 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { &zone->sourceaddr, &now)) { - LOCK_ZONE(zone); DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_SOABEFOREAXFR); - UNLOCK_ZONE(zone); goto tcp_transfer; } dns_zone_log(zone, ISC_LOG_DEBUG(1), @@ -9586,9 +9589,7 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { "refresh: rcode (%.*s) retrying without " "EDNS master %s (source %s)", (int)rb.used, rcode, master, source); - LOCK_ZONE(zone); DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NOEDNS); - UNLOCK_ZONE(zone); goto same_master; } dns_zone_log(zone, ISC_LOG_INFO, @@ -9614,9 +9615,7 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { "initiating TCP zone xfer " "for master %s (source %s)", master, source); - LOCK_ZONE(zone); DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_SOABEFOREAXFR); - UNLOCK_ZONE(zone); goto tcp_transfer; } else { INSIST(zone->type == dns_zone_stub); @@ -9627,9 +9626,7 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { master, source); goto next_master; } - LOCK_ZONE(zone); DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_USEVC); - UNLOCK_ZONE(zone); goto same_master; } } @@ -9690,6 +9687,7 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { soacnt, master, source); goto next_master; } + /* * Extract serial */ @@ -9717,7 +9715,9 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { serial = soa.serial; if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED)) { - result = dns_zone_getserial2(zone, &oldserial); + result = zone_get_from_db(zone, zone->db, NULL, NULL, + &oldserial, NULL, NULL, NULL, NULL, + NULL); RUNTIME_CHECK(result == ISC_R_SUCCESS); zone_debuglog(zone, me, 1, "serial: new %u, old %u", serial, oldserial); @@ -9741,11 +9741,9 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { } tcp_transfer: isc_event_free(&event); - LOCK_ZONE(zone); dns_request_destroy(&zone->request); - UNLOCK_ZONE(zone); if (zone->type == dns_zone_slave) { - queue_xfrin(zone); + do_queue_xfrin = ISC_TRUE; } else { INSIST(zone->type == dns_zone_stub); ns_query(zone, rdataset, NULL); @@ -9767,9 +9765,7 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { &now); /* Someone removed the file from underneath us! */ if (result == ISC_R_FILENOTFOUND) { - LOCK_ZONE(zone); zone_needdump(zone, DNS_DUMP_DELAY); - UNLOCK_ZONE(zone); } else if (result != ISC_R_SUCCESS) dns_zone_log(zone, ISC_LOG_ERROR, "refresh: could not set file " @@ -9799,7 +9795,6 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { if (msg != NULL) dns_message_destroy(&msg); isc_event_free(&event); - LOCK_ZONE(zone); dns_request_destroy(&zone->request); /* * Skip to next failed / untried master. @@ -9841,25 +9836,24 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { } DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_USEALTXFRSRC); zone_settimer(zone, &now); - UNLOCK_ZONE(zone); goto detach; } requeue: queue_soa_query(zone); - UNLOCK_ZONE(zone); goto detach; same_master: if (msg != NULL) dns_message_destroy(&msg); isc_event_free(&event); - LOCK_ZONE(zone); dns_request_destroy(&zone->request); queue_soa_query(zone); - UNLOCK_ZONE(zone); detach: + UNLOCK_ZONE(zone); + if (do_queue_xfrin) + queue_xfrin(zone); dns_zone_idetach(&zone); return; } @@ -10217,13 +10211,13 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) { isc_uint16_t udpsize = SEND_BUFFER_SIZE; REQUIRE(DNS_ZONE_VALID(zone)); + REQUIRE(LOCKED_ZONE(zone)); REQUIRE((soardataset != NULL && stub == NULL) || (soardataset == NULL && stub != NULL)); REQUIRE(stub == NULL || DNS_STUB_VALID(stub)); ENTER; - LOCK_ZONE(zone); if (stub == NULL) { stub = isc_mem_get(zone->mctx, sizeof(*stub)); if (stub == NULL) @@ -10414,10 +10408,9 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) { } if (message != NULL) dns_message_destroy(&message); - unlock: + unlock: if (key != NULL) dns_tsigkey_detach(&key); - UNLOCK_ZONE(zone); return; } @@ -12597,15 +12590,22 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, zmgr->transfersin = 10; zmgr->transfersperns = 2; + /* Unreachable lock. */ + result = isc_rwlock_init(&zmgr->urlock, 0, 0); + if (result != ISC_R_SUCCESS) + goto free_rwlock; + /* Create a single task for queueing of SOA queries. */ result = isc_task_create(taskmgr, 1, &zmgr->task); if (result != ISC_R_SUCCESS) - goto free_rwlock; + goto free_urlock; + isc_task_setname(zmgr->task, "zmgr", zmgr); result = isc_ratelimiter_create(mctx, timermgr, zmgr->task, &zmgr->rl); if (result != ISC_R_SUCCESS) goto free_task; + /* default to 20 refresh queries / notifies per second. */ isc_interval_set(&interval, 0, 1000000000/2); result = isc_ratelimiter_setinterval(zmgr->rl, &interval); @@ -12634,6 +12634,8 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, isc_ratelimiter_detach(&zmgr->rl); free_task: isc_task_detach(&zmgr->task); + free_urlock: + isc_rwlock_destroy(&zmgr->urlock); free_rwlock: isc_rwlock_destroy(&zmgr->rwlock); free_mem: @@ -12814,7 +12816,6 @@ dns_zonemgr_shutdown(dns_zonemgr_t *zmgr) { UNLOCK_ZONE(zone); } RWUNLOCK(&zmgr->rwlock, isc_rwlocktype_read); - } isc_result_t @@ -12858,6 +12859,7 @@ zonemgr_free(dns_zonemgr_t *zmgr) { DESTROYLOCK(&zmgr->iolock); isc_ratelimiter_detach(&zmgr->rl); + isc_rwlock_destroy(&zmgr->urlock); isc_rwlock_destroy(&zmgr->rwlock); mctx = zmgr->mctx; isc_mem_put(zmgr->mctx, zmgr, sizeof(*zmgr)); @@ -13270,12 +13272,12 @@ dns_zonemgr_unreachable(dns_zonemgr_t *zmgr, isc_sockaddr_t *remote, REQUIRE(DNS_ZONEMGR_VALID(zmgr)); locktype = isc_rwlocktype_read; - RWLOCK(&zmgr->rwlock, locktype); + RWLOCK(&zmgr->urlock, locktype); for (i = 0; i < UNREACH_CHACHE_SIZE; i++) { if (zmgr->unreachable[i].expire >= seconds && isc_sockaddr_equal(&zmgr->unreachable[i].remote, remote) && isc_sockaddr_equal(&zmgr->unreachable[i].local, local)) { - result = isc_rwlock_tryupgrade(&zmgr->rwlock); + result = isc_rwlock_tryupgrade(&zmgr->urlock); if (result == ISC_R_SUCCESS) { locktype = isc_rwlocktype_write; zmgr->unreachable[i].last = seconds; @@ -13283,7 +13285,7 @@ dns_zonemgr_unreachable(dns_zonemgr_t *zmgr, isc_sockaddr_t *remote, break; } } - RWUNLOCK(&zmgr->rwlock, locktype); + RWUNLOCK(&zmgr->urlock, locktype); return (ISC_TF(i < UNREACH_CHACHE_SIZE)); } @@ -13304,11 +13306,11 @@ dns_zonemgr_unreachabledel(dns_zonemgr_t *zmgr, isc_sockaddr_t *remote, REQUIRE(DNS_ZONEMGR_VALID(zmgr)); locktype = isc_rwlocktype_read; - RWLOCK(&zmgr->rwlock, locktype); + RWLOCK(&zmgr->urlock, locktype); for (i = 0; i < UNREACH_CHACHE_SIZE; i++) { if (isc_sockaddr_equal(&zmgr->unreachable[i].remote, remote) && isc_sockaddr_equal(&zmgr->unreachable[i].local, local)) { - result = isc_rwlock_tryupgrade(&zmgr->rwlock); + result = isc_rwlock_tryupgrade(&zmgr->urlock); if (result == ISC_R_SUCCESS) { locktype = isc_rwlocktype_write; zmgr->unreachable[i].expire = 0; @@ -13321,7 +13323,7 @@ dns_zonemgr_unreachabledel(dns_zonemgr_t *zmgr, isc_sockaddr_t *remote, break; } } - RWUNLOCK(&zmgr->rwlock, locktype); + RWUNLOCK(&zmgr->urlock, locktype); } void @@ -13334,7 +13336,7 @@ dns_zonemgr_unreachableadd(dns_zonemgr_t *zmgr, isc_sockaddr_t *remote, REQUIRE(DNS_ZONEMGR_VALID(zmgr)); - RWLOCK(&zmgr->rwlock, isc_rwlocktype_write); + RWLOCK(&zmgr->urlock, isc_rwlocktype_write); for (i = 0; i < UNREACH_CHACHE_SIZE; i++) { /* Existing entry? */ if (isc_sockaddr_equal(&zmgr->unreachable[i].remote, remote) && @@ -13373,7 +13375,7 @@ dns_zonemgr_unreachableadd(dns_zonemgr_t *zmgr, isc_sockaddr_t *remote, zmgr->unreachable[oldest].remote = *remote; zmgr->unreachable[oldest].local = *local; } - RWUNLOCK(&zmgr->rwlock, isc_rwlocktype_write); + RWUNLOCK(&zmgr->urlock, isc_rwlocktype_write); } void diff --git a/contrib/bind9/lib/isc/pthreads/mutex.c b/contrib/bind9/lib/isc/pthreads/mutex.c index ba04f1671e2..c7e5795b680 100644 --- a/contrib/bind9/lib/isc/pthreads/mutex.c +++ b/contrib/bind9/lib/isc/pthreads/mutex.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2008, 2011 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2008, 2011, 2012 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -78,7 +78,7 @@ struct isc_mutexstats { }; #ifndef ISC_MUTEX_PROFTABLESIZE -#define ISC_MUTEX_PROFTABLESIZE (16 * 1024) +#define ISC_MUTEX_PROFTABLESIZE (1024 * 1024) #endif static isc_mutexstats_t stats[ISC_MUTEX_PROFTABLESIZE]; static int stats_next = 0; @@ -200,24 +200,24 @@ isc_mutex_statsprofile(FILE *fp) { fprintf(fp, "Mutex stats (in us)\n"); for (i = 0; i < stats_next; i++) { - fprintf(fp, "%-12s %4d: %10u %lu.%06lu %lu.%06lu\n", + fprintf(fp, "%-12s %4d: %10u %lu.%06lu %lu.%06lu %5d\n", stats[i].file, stats[i].line, stats[i].count, stats[i].locked_total.tv_sec, stats[i].locked_total.tv_usec, stats[i].wait_total.tv_sec, - stats[i].wait_total.tv_usec - ); + stats[i].wait_total.tv_usec, + i); for (j = 0; j < ISC_MUTEX_MAX_LOCKERS; j++) { locker = &stats[i].lockers[j]; if (locker->file == NULL) continue; - fprintf(fp, " %-11s %4d: %10u %lu.%06lu %lu.%06lu\n", + fprintf(fp, " %-11s %4d: %10u %lu.%06lu %lu.%06lu %5d\n", locker->file, locker->line, locker->count, locker->locked_total.tv_sec, locker->locked_total.tv_usec, locker->wait_total.tv_sec, - locker->wait_total.tv_usec - ); + locker->wait_total.tv_usec, + i); } } } diff --git a/contrib/bind9/lib/isccfg/api b/contrib/bind9/lib/isccfg/api index 2b2a12dafd2..9f3d38cd460 100644 --- a/contrib/bind9/lib/isccfg/api +++ b/contrib/bind9/lib/isccfg/api @@ -4,5 +4,5 @@ # 9.8: 80-89 # 9.9: 90-109 LIBINTERFACE = 82 -LIBREVISION = 1 +LIBREVISION = 2 LIBAGE = 0 diff --git a/contrib/bind9/lib/isccfg/parser.c b/contrib/bind9/lib/isccfg/parser.c index 1d1f08e0d2c..ef20184f397 100644 --- a/contrib/bind9/lib/isccfg/parser.c +++ b/contrib/bind9/lib/isccfg/parser.c @@ -2232,16 +2232,30 @@ cfg_parser_warning(cfg_parser_t *pctx, unsigned int flags, const char *fmt, ...) #define MAX_LOG_TOKEN 30 /* How much of a token to quote in log messages. */ +static isc_boolean_t +have_current_file(cfg_parser_t *pctx) { + cfg_listelt_t *elt; + if (pctx->open_files == NULL) + return (ISC_FALSE); + + elt = ISC_LIST_TAIL(pctx->open_files->value.list); + if (elt == NULL) + return (ISC_FALSE); + + return (ISC_TRUE); +} + static char * current_file(cfg_parser_t *pctx) { static char none[] = "none"; cfg_listelt_t *elt; cfg_obj_t *fileobj; - if (pctx->open_files == NULL) + if (!have_current_file(pctx)) return (none); + elt = ISC_LIST_TAIL(pctx->open_files->value.list); - if (elt == NULL) + if (elt == NULL) /* shouldn't be possible, but... */ return (none); fileobj = elt->obj; @@ -2264,8 +2278,10 @@ parser_complain(cfg_parser_t *pctx, isc_boolean_t is_warning, if (is_warning) level = ISC_LOG_WARNING; - snprintf(where, sizeof(where), "%s:%u: ", - current_file(pctx), pctx->line); + where[0] = '\0'; + if (have_current_file(pctx)) + snprintf(where, sizeof(where), "%s:%u: ", + current_file(pctx), pctx->line); len = vsnprintf(message, sizeof(message), format, args); if (len >= sizeof(message)) diff --git a/contrib/bind9/version b/contrib/bind9/version index aa5d40c5a32..63b02cfe499 100644 --- a/contrib/bind9/version +++ b/contrib/bind9/version @@ -5,6 +5,6 @@ # MAJORVER=9 MINORVER=8 -PATCHVER=2 -RELEASETYPE= -RELEASEVER= +PATCHVER=3 +RELEASETYPE=-P +RELEASEVER=1 diff --git a/contrib/binutils/gas/config/tc-i386.c b/contrib/binutils/gas/config/tc-i386.c index 296fdcdde41..9af47c56e9d 100644 --- a/contrib/binutils/gas/config/tc-i386.c +++ b/contrib/binutils/gas/config/tc-i386.c @@ -517,7 +517,9 @@ static const arch_entry cpu_arch[] = {".sse4a", PROCESSOR_UNKNOWN, CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a}, {".abm", PROCESSOR_UNKNOWN, - CpuABM} + CpuABM}, + {".xsave", PROCESSOR_UNKNOWN, + CpuXSAVE} }; const pseudo_typeS md_pseudo_table[] = @@ -3988,6 +3990,16 @@ output_insn (void) goto check_prefix; } } + else if (i.tm.base_opcode == 0x660f3880 || i.tm.base_opcode == 0x660f3881) + { + /* invept and invvpid are 3 byte instructions with a + mandatory prefix. */ + if (i.tm.base_opcode & 0xff000000) + { + prefix = (i.tm.base_opcode >> 24) & 0xff; + add_prefix (prefix); + } + } else if ((i.tm.base_opcode & 0xff0000) != 0) { prefix = (i.tm.base_opcode >> 16) & 0xff; @@ -4027,6 +4039,12 @@ output_insn (void) p = frag_more (3); *p++ = (i.tm.base_opcode >> 16) & 0xff; } + else if (i.tm.base_opcode == 0x660f3880 || + i.tm.base_opcode == 0x660f3881) + { + p = frag_more (3); + *p++ = (i.tm.base_opcode >> 16) & 0xff; + } else p = frag_more (2); diff --git a/contrib/binutils/ld/emultempl/ppc32elf.em b/contrib/binutils/ld/emultempl/ppc32elf.em index b0239e0b76a..49a8eff58a8 100644 --- a/contrib/binutils/ld/emultempl/ppc32elf.em +++ b/contrib/binutils/ld/emultempl/ppc32elf.em @@ -119,7 +119,40 @@ ppc_before_allocation (void) } } } + gld${EMULATION_NAME}_before_allocation (); + + /* Turn on relaxation if executable sections have addresses that + might make branches overflow. */ + if (!command_line.relax) + { + bfd_vma low = (bfd_vma) -1; + bfd_vma high = 0; + asection *o; + + /* Run lang_size_sections (if not already done). */ + if (expld.phase != lang_mark_phase_enum) + { + expld.phase = lang_mark_phase_enum; + expld.dataseg.phase = exp_dataseg_none; + one_lang_size_sections_pass (NULL, FALSE); + lang_reset_memory_regions (); + } + + for (o = output_bfd->sections; o != NULL; o = o->next) + { + if ((o->flags & (SEC_ALLOC | SEC_CODE)) != (SEC_ALLOC | SEC_CODE)) + continue; + if (o->rawsize == 0) + continue; + if (low > o->vma) + low = o->vma; + if (high < o->vma + o->rawsize - 1) + high = o->vma + o->rawsize - 1; + } + if (high > low && high - low > (1 << 25) - 1) + command_line.relax = TRUE; + } } EOF diff --git a/contrib/binutils/opcodes/i386-dis.c b/contrib/binutils/opcodes/i386-dis.c index 10de45bcbc9..62581b5e6a2 100644 --- a/contrib/binutils/opcodes/i386-dis.c +++ b/contrib/binutils/opcodes/i386-dis.c @@ -93,6 +93,7 @@ static void OP_3DNowSuffix (int, int); static void OP_SIMD_Suffix (int, int); static void SIMD_Fixup (int, int); static void PNI_Fixup (int, int); +static void XCR_Fixup (int, int); static void SVME_Fixup (int, int); static void INVLPG_Fixup (int, int); static void BadOp (void); @@ -212,6 +213,7 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr) #define Ew { OP_E, w_mode } #define M { OP_M, 0 } /* lea, lgdt, etc. */ #define Ma { OP_M, v_mode } +#define Mo { OP_M, o_mode } #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */ #define Mq { OP_M, q_mode } #define Gb { OP_G, b_mode } @@ -539,6 +541,8 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr) #define PREGRP95 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 95 } } #define PREGRP96 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 96 } } #define PREGRP97 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 97 } } +#define PREGRP98 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 98 } } +#define PREGRP99 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 99 } } #define X86_64_0 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 0 } } @@ -1693,7 +1697,7 @@ static const struct dis386 grps[][8] = { { { "sgdt{Q|IQ||}", { { VMX_Fixup, 0 } } }, { "sidt{Q|IQ||}", { { PNI_Fixup, 0 } } }, - { "lgdt{Q|Q||}", { M } }, + { "lgdt{Q|Q||}", { { XCR_Fixup, 0 } } }, { "lidt{Q|Q||}", { { SVME_Fixup, 0 } } }, { "smswD", { Sv } }, { "(bad)", { XX } }, @@ -1783,9 +1787,9 @@ static const struct dis386 grps[][8] = { { "fxrstor", { Ev } }, { "ldmxcsr", { Ev } }, { "stmxcsr", { Ev } }, - { "(bad)", { XX } }, - { "lfence", { { OP_0fae, 0 } } }, - { "mfence", { { OP_0fae, 0 } } }, + { "xsave", { Ev } }, + { "xrstor", { { OP_0fae, v_mode } } }, + { "xsaveopt", { { OP_0fae, v_mode } } }, { "clflush", { { OP_0fae, 0 } } }, }, /* GRP16 */ @@ -2585,6 +2589,22 @@ static const struct dis386 prefix_user_table[][4] = { { "punpckldq",{ MX, EMq } }, { "(bad)", { XX } }, }, + + /* PREGRP98 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "invept", { Gm, Mo } }, + { "(bad)", { XX } }, + }, + + /* PREGRP99 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "invvpid",{ Gm, Mo } }, + { "(bad)", { XX } }, + }, }; static const struct dis386 x86_64_table[][2] = { @@ -2754,8 +2774,8 @@ static const struct dis386 three_byte_table[][256] = { { "(bad)", { XX } }, { "(bad)", { XX } }, /* 80 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { PREGRP98 }, + { PREGRP99 }, { "(bad)", { XX } }, { "(bad)", { XX } }, { "(bad)", { XX } }, @@ -5883,7 +5903,7 @@ static void OP_M (int bytemode, int sizeflag) { if (modrm.mod == 3) - /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */ + /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst,invept,invvpid modrm */ BadOp (); else OP_E (bytemode, sizeflag); @@ -5905,17 +5925,17 @@ OP_0fae (int bytemode, int sizeflag) { if (modrm.reg == 7) strcpy (obuf + strlen (obuf) - sizeof ("clflush") + 1, "sfence"); + else if (modrm.reg == 6) + strcpy (obuf + strlen (obuf) - sizeof ("xsaveopt") + 1, "mfence"); + else if (modrm.reg == 5) + strcpy (obuf + strlen (obuf) - sizeof ("xrstor") + 1, "lfence"); if (modrm.reg < 5 || modrm.rm != 0) { BadOp (); /* bad sfence, mfence, or lfence */ return; } - } - else if (modrm.reg != 7) - { - BadOp (); /* bad clflush */ - return; + bytemode = 0; } OP_E (bytemode, sizeflag); @@ -6169,6 +6189,43 @@ PNI_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag) OP_M (0, sizeflag); } +static void +XCR_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag) +{ + if (modrm.mod == 3 && modrm.reg == 2 && modrm.rm <= 1) + { + /* Override "lgdt". */ + size_t olen = strlen (obuf); + char *p = obuf + olen - 4; + + /* We might have a suffix when disassembling with -Msuffix. */ + if (*p == 'i') + --p; + + /* Remove "addr16/addr32" if we aren't in Intel mode. */ + if (!intel_syntax + && (prefixes & PREFIX_ADDR) + && olen >= (4 + 7) + && *(p - 1) == ' ' + && CONST_STRNEQ (p - 7, "addr") + && (CONST_STRNEQ (p - 3, "16") + || CONST_STRNEQ (p - 3, "32"))) + p -= 7; + + if (modrm.rm) + { + strcpy (p, "xsetbv"); + } + else + { + strcpy (p, "xgetbv"); + } + + codep++; + } + else + OP_M (0, sizeflag); +} static void SVME_Fixup (int bytemode, int sizeflag) { diff --git a/contrib/binutils/opcodes/i386-opc.h b/contrib/binutils/opcodes/i386-opc.h index 5372d4a65aa..7605b521f8a 100644 --- a/contrib/binutils/opcodes/i386-opc.h +++ b/contrib/binutils/opcodes/i386-opc.h @@ -71,6 +71,7 @@ typedef struct template #define CpuABM 0x200000 /* ABM New Instructions required */ #define CpuSSE4_1 0x400000 /* SSE4.1 Instructions required */ #define CpuSSE4_2 0x800000 /* SSE4.2 Instructions required */ +#define CpuXSAVE 0x1000000 /* XSAVE Instructions required */ /* SSE4.1/4.2 Instructions required */ #define CpuSSE4 (CpuSSE4_1|CpuSSE4_2) @@ -83,7 +84,7 @@ typedef struct template #define CpuUnknownFlags (Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686 \ |CpuP4|CpuSledgehammer|CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuSSE3|CpuVMX \ |Cpu3dnow|Cpu3dnowA|CpuK6|CpuPadLock|CpuSVME|CpuSSSE3|CpuSSE4_1 \ - |CpuSSE4_2|CpuABM|CpuSSE4a) + |CpuSSE4_2|CpuABM|CpuSSE4a|CpuXSAVE) /* the bits in opcode_modifier are used to generate the final opcode from the base_opcode. These bits also are used to detect alternate forms of diff --git a/contrib/binutils/opcodes/i386-opc.tbl b/contrib/binutils/opcodes/i386-opc.tbl index 5465608ebee..f1f5ae5fb36 100644 --- a/contrib/binutils/opcodes/i386-opc.tbl +++ b/contrib/binutils/opcodes/i386-opc.tbl @@ -1289,6 +1289,10 @@ mwait, 2, 0xf01, 0xc9, CpuSSE3|CpuNo64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf| mwait, 2, 0xf01, 0xc9, CpuSSE3|Cpu64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt|NoRex64, { Reg64, Reg64 } // VMX instructions. +invept, 2, 0x660f3880, None, CpuVMX|CpuNo64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg32 } +invept, 2, 0x660f3880, None, CpuVMX|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg64 } +invvpid, 2, 0x660f3881, None, CpuVMX|CpuNo64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg32 } +invvpid, 2, 0x660f3881, None, CpuVMX|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg64 } vmcall, 0, 0xf01, 0xc1, CpuVMX, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0 } vmclear, 1, 0x660fc7, 0x6, CpuVMX, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S } vmlaunch, 0, 0xf01, 0xc2, CpuVMX, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0 } @@ -1487,3 +1491,10 @@ xcryptcfb, 0, 0xf30fa7, 0xe0, Cpu686|CpuPadLock, No_bSuf|No_wSuf|No_lSuf|No_sSuf xcryptofb, 0, 0xf30fa7, 0xe8, Cpu686|CpuPadLock, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|IsString|ImmExt, { 0 } // Alias for xstore-rng. xstore, 0, 0xfa7, 0xc0, Cpu686|CpuPadLock, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|IsString|ImmExt, { 0 } + +// XSAVE/XRSTOR related instructions +xgetbv, 0, 0xf01, 0xd0, CpuXSAVE, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0 } +xsetbv, 0, 0xf01, 0xd1, CpuXSAVE, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0 } +xsave, 1, 0xfae, 0x4, CpuXSAVE, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_xSuf, { BaseIndex|Disp8|Disp16|Disp32|Disp32S } +xsaveopt, 1, 0xfae, 0x6, CpuXSAVE, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_xSuf, { BaseIndex|Disp8|Disp16|Disp32|Disp32S } +xrstor, 1, 0xfae, 0x5, CpuXSAVE, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_xSuf, { BaseIndex|Disp8|Disp16|Disp32|Disp32S } diff --git a/contrib/binutils/opcodes/i386-tbl.h b/contrib/binutils/opcodes/i386-tbl.h index fa843b33473..453cb2daef8 100644 --- a/contrib/binutils/opcodes/i386-tbl.h +++ b/contrib/binutils/opcodes/i386-tbl.h @@ -3625,6 +3625,22 @@ const template i386_optab[] = No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt|NoRex64, { Reg64, Reg64 } }, + { "invept", 2, 0x660f3880, None, CpuVMX|CpuNo64, + Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, + { BaseIndex|Disp8|Disp16|Disp32|Disp32S, + Reg32 } }, + { "invept", 2, 0x660f3880, None, CpuVMX|Cpu64, + Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, + { BaseIndex|Disp8|Disp16|Disp32|Disp32S, + Reg64 } }, + { "invvpid", 2, 0x660f3881, None, CpuVMX|CpuNo64, + Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, + { BaseIndex|Disp8|Disp16|Disp32|Disp32S, + Reg32 } }, + { "invvpid", 2, 0x660f3881, None, CpuVMX|Cpu64, + Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, + { BaseIndex|Disp8|Disp16|Disp32|Disp32S, + Reg64 } }, { "vmcall", 0, 0xf01, 0xc1, CpuVMX, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0 } }, @@ -4288,6 +4304,21 @@ const template i386_optab[] = { "xstore", 0, 0xfa7, 0xc0, Cpu686|CpuPadLock, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|IsString|ImmExt, { 0 } }, + { "xgetbv", 0, 0xf01, 0xd0, CpuXSAVE, + No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, + { 0 } }, + { "xsetbv", 0, 0xf01, 0xd1, CpuXSAVE, + No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, + { 0 } }, + { "xsave", 1, 0xfae, 0x4, CpuXSAVE, + Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_xSuf, + { BaseIndex|Disp8|Disp16|Disp32|Disp32S } }, + { "xsaveopt", 1, 0xfae, 0x6, CpuXSAVE, + Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_xSuf, + { BaseIndex|Disp8|Disp16|Disp32|Disp32S } }, + { "xrstor", 1, 0xfae, 0x5, CpuXSAVE, + Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_xSuf, + { BaseIndex|Disp8|Disp16|Disp32|Disp32S } }, { NULL, 0, 0, 0, 0, 0, { 0 } } }; diff --git a/contrib/bsnmp/lib/bsnmpclient.3 b/contrib/bsnmp/lib/bsnmpclient.3 index 5fe9a9adcd4..d4af60ef560 100644 --- a/contrib/bsnmp/lib/bsnmpclient.3 +++ b/contrib/bsnmp/lib/bsnmpclient.3 @@ -368,7 +368,7 @@ This format expects an argument of type and appends the length of the string (as computed by .Xr strlen 3 ) and each of the characters in the string to the OID. -.It Li ( Va N Ns Li ) +.It ( Va N Ns ) This format expects no argument. .Va N must be a decimal number and is stored into an internal variable diff --git a/contrib/bsnmp/lib/bsnmplib.3 b/contrib/bsnmp/lib/bsnmplib.3 index fbb956d727c..12d676abee2 100644 --- a/contrib/bsnmp/lib/bsnmplib.3 +++ b/contrib/bsnmp/lib/bsnmplib.3 @@ -161,7 +161,6 @@ is not zero, .Fa v.octetstring.octets points to a string allocated by .Xr malloc 3 . -.Pp .Bd -literal -offset indent #define SNMP_ENGINE_ID_SIZ 32 @@ -176,7 +175,6 @@ struct snmp_engine { .Pp This structure represents an SNMP engine as specified by the SNMP Management Architecture described in RFC 3411. -.Pp .Bd -literal -offset indent #define SNMP_ADM_STR32_SIZ (32 + 1) #define SNMP_AUTH_KEY_SIZ 40 @@ -225,7 +223,6 @@ enum snmp_privacy { and .Fa priv_key contain the authentication and privacy keys for the user. -.Pp .Bd -literal -offset indent #define SNMP_COMMUNITY_MAXLEN 128 #define SNMP_MAX_BINDINGS 100 @@ -389,7 +386,7 @@ If successfull, a plain text scoped PDU is stored in the buffer. The function .Fn snmp_pdu_init_secparams calculates the initialization vector for the privacy protocol in use before -the PDU pointed to by +the PDU pointed to by .Fa pdu may be encrypted or decrypted. .Pp @@ -504,7 +501,7 @@ the cryptographic functions from The library may optionally be built without references to the .Xr crypto 3 library. In such case only plain text SNMPv3 PDUs without message digests -may be proccessed correctly. +may be proccessed correctly. .Sh STANDARDS This implementation conforms to the applicable IETF RFCs and ITU-T recommendations. diff --git a/contrib/bsnmp/snmp_mibII/mibII_tcp.c b/contrib/bsnmp/snmp_mibII/mibII_tcp.c index 561216f0a5d..a61052d2eb9 100644 --- a/contrib/bsnmp/snmp_mibII/mibII_tcp.c +++ b/contrib/bsnmp/snmp_mibII/mibII_tcp.c @@ -109,10 +109,12 @@ fetch_tcp(void) ptr = (struct xinpgen *)(void *)((char *)ptr + ptr->xig_len)) { tp = (struct xtcpcb *)ptr; if (tp->xt_inp.inp_gencnt > xinpgen->xig_gen || - (tp->xt_inp.inp_vflag & INP_IPV4) == 0) + (tp->xt_inp.inp_vflag & (INP_IPV4|INP_IPV6)) == 0) continue; - tcp_total++; + if (tp->xt_inp.inp_vflag & INP_IPV4) + tcp_total++; + if (tp->xt_tp.t_state == TCPS_ESTABLISHED || tp->xt_tp.t_state == TCPS_CLOSE_WAIT) tcp_count++; diff --git a/contrib/bsnmp/snmp_target/snmp_target.3 b/contrib/bsnmp/snmp_target/snmp_target.3 index 03071b508bc..626bb78088e 100755 --- a/contrib/bsnmp/snmp_target/snmp_target.3 +++ b/contrib/bsnmp/snmp_target/snmp_target.3 @@ -33,7 +33,7 @@ .Os .Sh NAME .Nm snmp_target -.Nd "Target addresses and notifications module for +.Nd "Target addresses and notifications module for" .Xr bsnmpd 1 .Sh LIBRARY .Pq begemotSnmpdModulePath."target" = "/usr/lib/snmp_target.so" diff --git a/contrib/bsnmp/snmp_usm/snmp_usm.3 b/contrib/bsnmp/snmp_usm/snmp_usm.3 index 9927f6e7f65..ceb62e4b200 100755 --- a/contrib/bsnmp/snmp_usm/snmp_usm.3 +++ b/contrib/bsnmp/snmp_usm/snmp_usm.3 @@ -33,7 +33,7 @@ .Os .Sh NAME .Nm snmp_usm -.Nd "user-based security module for +.Nd "user-based security module for" .Xr bsnmpd 1 .Sh LIBRARY .Pq begemotSnmpdModulePath."usm" = "/usr/lib/snmp_usm.so" @@ -57,7 +57,7 @@ An advisory lock used to coordinate several Command Generator Applications when altering the SNMP USM users. .It Va usmUserTable The table contains all SNMP USM users configured in -.Nm bsnmpd. +.Nm bsnmpd . The table contains the following objects .Bl -tag -width ".It Va usmUserEngineID" .It Va usmUserEngineID @@ -79,7 +79,7 @@ supported. .It Va usmUserAuthProtocol The value of this column contains the OID corresponding to the authentication protocol used by the USM user. The following protocols and their OIDs are known to -.Nm +.Nm module .Bl -tag -width ".It Va NoAuthProtocol" .It NoAuthProtocol 1.3.6.1.6.3.10.1.1.1 @@ -91,7 +91,7 @@ These columns may be used to change the user's authentication key. .It Va usmUserPrivProtocol The value of this column contains the OID corresponding to the privacy protocol used by the USM user. The following protocols and their OIDs are known to -.Nm +.Nm module .Bl -tag -width ".It Va NoPrivProtocol" .It NoPrivProtocol 1.3.6.1.6.3.10.1.2.1 @@ -102,7 +102,7 @@ module These columns may be used to change the user's privacy key. .It Va usmUserPublic An arbitrary octet string that may be modified to confirm a SET operation on any -of the columns was successfull. +of the columns was successful. .It Va usmUserStorageType This column always has either of two values. Entries created via .Nm bsnmpd's diff --git a/contrib/bsnmp/snmp_vacm/snmp_vacm.3 b/contrib/bsnmp/snmp_vacm/snmp_vacm.3 index 9ad25be6f8d..dd57f7fff67 100755 --- a/contrib/bsnmp/snmp_vacm/snmp_vacm.3 +++ b/contrib/bsnmp/snmp_vacm/snmp_vacm.3 @@ -33,7 +33,7 @@ .Os .Sh NAME .Nm snmp_vacm -.Nd "View-based Access Control module for +.Nd "View-based Access Control module for" .Xr bsnmpd 1 .Sh LIBRARY .Pq begemotSnmpdModulePath."vacm" = "/usr/lib/snmp_vacm.so" @@ -76,7 +76,7 @@ objects under the subtree in the relevant view. .It Va vacmViewTreeFamilyTable The table contains a list of SNMP views, i.e. entries specifying the OID of a MIB subtree and whether access to the objects under this subtree is to be -allowed or forbiden. +allowed or forbidden. .El .Sh FILES .Bl -tag -width "XXXXXXXXX" diff --git a/usr.bin/yacc/ACKNOWLEDGEMENTS b/contrib/byacc/ACKNOWLEDGEMENTS similarity index 100% rename from usr.bin/yacc/ACKNOWLEDGEMENTS rename to contrib/byacc/ACKNOWLEDGEMENTS diff --git a/contrib/byacc/AUTHORS b/contrib/byacc/AUTHORS new file mode 100644 index 00000000000..6d75337909a --- /dev/null +++ b/contrib/byacc/AUTHORS @@ -0,0 +1,7 @@ +-- $Id: AUTHORS,v 1.1 2010/06/06 20:31:51 tom Exp $ +-- vile:txtmode +-- This file is used by a script that collects contributor information and +-- resolves nicknames vs fullnames. +dickey Thomas Dickey +schmitz Sylvain Schmitz +unknown Robert Corbett diff --git a/contrib/byacc/CHANGES b/contrib/byacc/CHANGES new file mode 100644 index 00000000000..66c5da07fdc --- /dev/null +++ b/contrib/byacc/CHANGES @@ -0,0 +1,1156 @@ +2012-01-15 Thomas E. Dickey + + * package/debian/copyright: bump + + * test/run_make.sh: workaround for breakage due to GNU make 3.82 + + * test/run_make.sh: + tested with Solaris 10 (bison 1.875) and added scripting to exercise + the /usr/ccs/bin/yacc executable + + * test/grammar.tab.c: regen + + * test/grammar.y: modify to also build with Solaris yacc + + * VERSION, package/debian/changelog, package/byacc.spec: bump + + * test/calc1.output, test/calc1.tab.c: regen + + * test/calc1.y: + undo the change made to appease bison, since it was only a warning. + + * test/pure_calc.tab.c, test/pure_error.tab.c: regen + + * test/run_make.sh: another fix for running from top-level directory + + * makefile.in: + ensure that check_make rule depends on having byacc built. + + * test/run_make.sh: fixes for building from parent directory + + * test/pure_error.y, test/pure_calc.y: bison-fixes + + * test/calc2.tab.c, test/calc3.tab.c, test/code_error.code.c, test/ftp.tab.c, test/pure_calc.tab.c, test/pure_error.tab.c: + regen + + * test/calc2.y, test/calc3.y, test/code_error.y, test/ftp.y: + byacc already declares yyerror + + * test/pure_error.y, test/pure_calc.y: + modified to help make the files build with bison + + * test/run_make.sh: + supply a "%pure-parser" directive when bison needs it. + + * test/code_calc.code.c: regen + + * test/code_calc.y: modified to help make the files build with bison + + * yacc.1: + in testing, found that %expect did not work as documented for bison. + do not recommend it for portable code. + + * test/run_make.sh: workaround breakage in bison's %expect directive + + * test/grammar.y: modified to help make the files build with bison + + * test/calc1.output, test/calc1.tab.c, test/grammar.tab.c: regen + + * test/calc1.y: quiet a spurious warning from bison 2.3 + + * test/calc1.tab.c: regen + + * test/calc1.y: modified to help make the files build with bison + + * yacc.1: comment on "-y" and "-P" options. + + * yacc.1: comment on portability + + * test/ftp.tab.c, test/quote_calc-s.tab.c, test/quote_calc.tab.c, test/quote_calc2-s.tab.c, test/quote_calc3-s.tab.c: + regen + + * test/ftp.y: modified to help make the files build with bison + (bison's "-y" option is of no use in providing "yacc" compatibility) + + * test/quote_calc2.tab.c, test/quote_calc3.tab.c, test/quote_calc4-s.tab.c, test/quote_calc4.tab.c: + regen + + * test/code_calc.y, test/quote_calc2.y, test/quote_calc.y, test/quote_calc4.y, test/quote_calc3.y: + modified to help make the files build with bison + + * test/calc.tab.c: regen + + * test/calc.y: modified to help make the files build with bison + + * test/error.tab.c: regen + + * test/error.y: modified to help make the files build with bison + + * test/calc2.tab.c, test/calc3.tab.c, test/code_error.code.c: regen + + * test/run_make.sh: + check for older bisons which (2.3 for instance) do not support pure parsers + + * test/code_error.y, test/calc3.y, test/calc2.y: + modified to help make the files build with bison + + * test/run_test.sh: use $opt2 in filenames of the generated files + + * test/quote_calc2-s.tab.c, test/quote_calc3-s.tab.c, test/quote_calc4-s.tab.c, test/quote_calc-s.tab.c, test/quote_calc.tab.c, test/quote_calc2.tab.c, test/quote_calc3.tab.c, test/quote_calc4.tab.c: + regen + +2012-01-14 Thomas E. Dickey + + * test/calc2.tab.c, test/code_calc.code.c, test/code_error.code.c, test/error.tab.c, test/ftp.tab.c, test/grammar.tab.c, test/calc.tab.c, test/calc1.tab.c: + regen + + * output.c: Several changes: + a) add YYLEX_PARAM_TYPE, like YYPARSE_PARAM_TYPE, but for yylex. + b) modify definitions for YYLEX_DECL to be more like YYPARSE_DECL, + using YYLEX_PARAM_TYPE and YYLEX_PARAM. + c) add ifdef's around #define's for YYERROR_DECL and YYERROR_CALL, + to help with redefinitions. + + * test/pure_calc.tab.c: + modified to help make the files build with bison + + * test/run_make.sh: + start work on followup, to check if the generated files build with bison. + + * test/pure_calc.y, test/pure_error.tab.c: + modified to help make the files build with bison + + * test/calc3.tab.c: regen + + * test/quote_calc-s.output, test/quote_calc-s.tab.c, test/quote_calc-s.tab.h, test/quote_calc2-s.output, test/quote_calc2-s.tab.c, test/quote_calc2-s.tab.h, test/quote_calc3-s.output, test/quote_calc3-s.tab.c, test/quote_calc3-s.tab.h, test/quote_calc4-s.output, test/quote_calc4-s.tab.c, test/quote_calc4-s.tab.h: + RCS_BASE + + * test/run_test.sh: generate/test with "-s" option applied. + +2012-01-13 Thomas E. Dickey + + * package/debian/changelog, package/byacc.spec, VERSION: bump + + * yacc.1: improve documentation of -s option + + * yacc.1: note that yacc ignores -y + + * main.c: add -s option to usage message. + + * test/quote_calc3.output, test/quote_calc3.tab.c, test/quote_calc4.output, test/quote_calc4.tab.c, test/quote_calc4.tab.h, test/quote_calc3.y, test/quote_calc.tab.h, test/quote_calc.output, test/quote_calc.tab.c, test/quote_calc2.output, test/quote_calc2.tab.c, test/quote_calc2.tab.h, test/quote_calc3.tab.h, test/quote_calc4.y, test/quote_calc.y, test/quote_calc2.y: + RCS_BASE + + * configure: regen + + * aclocal.m4: resync with my-autoconf, i.e., fixes for CF_XOPEN_SOURCE + +2011-12-19 Thomas E. Dickey + + * package/debian/changelog, package/byacc.spec, VERSION: bump + + * yacc.1, output.c, main.c, defs.h: + add "-s" option to suppress generating #define's based on string contents + in a %token statement. For instance + %token EQLS "Equals" + would generate + #define EQLS 256 + #define Equals 257 + Simply suppressing the second #define makes the behavior closer to yacc. + (report by Paulo Andrade). + +2011-09-08 Thomas E. Dickey + + * package/debian/changelog, package/byacc.spec, VERSION: bump + + * output.c: + fix some more interaction between -i and -d flags to ensure YYERRCODE + and YYSTYPE are declared, tested with cproto. + +2011-09-07 Thomas E. Dickey + + * yacc.1: document "-i" option. + + * package/debian/changelog, package/byacc.spec, VERSION: bump + + * output.c: fix an interaction between -i and -d + + * test/code_error.code.c, test/error.tab.c, test/ftp.tab.c, test/grammar.tab.c, test/pure_calc.tab.c, test/pure_error.tab.c, test/calc.tab.c, test/calc1.tab.c, test/calc2.tab.c, test/calc3.tab.c, test/code_calc.code.c: + regen - changes for "-i" option move the global/impure variables near the + macros that may add a prefix, etc. + + * skeleton.c, output.c, defs.h: changes to support "-i" option. + +2011-09-06 Thomas E. Dickey + + * reader.c: pass explicit file-pointer to write_section() + + * main.c: + add "-i" option, to generate interface-file (suggested by Denis M. Wilson) + +2011-09-05 Thomas E. Dickey + + * configure: regen + + * aclocal.m4: + resync with my-autoconf: CF_ANSI_CC_CHECK (check for $CFLAGS in $CC) + and CF_XOPEN_SOURCE (update aix, cygwin and netbsd checks) + + * defs.h, error.c, reader.c: + add check for missing "}" on %parse-param and %lex-param lines (report by Denis M Wilson) + +2011-04-01 Thomas E. Dickey + + * config.sub: 2011-04-01 + +2011-02-02 Thomas E. Dickey + + * config.guess: 2011-01-01 + +2010-12-29 Thomas E. Dickey + + * defs.h, skeleton.c: + add const qualifier to skeleton data, per NetBSD changes (report by Christos Zoulas) + + * defs.h: + mark all of the error-functions as non-returning (report by Christos Zoulas) + + * test/grammar.tab.c, test/pure_calc.tab.c, test/pure_error.tab.c, test/calc.tab.c, test/calc1.tab.c, test/calc2.tab.c, test/calc3.tab.c, test/code_calc.code.c, test/code_error.code.c, test/error.tab.c, test/ftp.tab.c: + regen + + * skeleton.c: + use only realloc() rather than realloc+malloc, agree that systems needing this + are very rare (prompted by NetBSD change). + + * test/ftp.tab.c: regen + +2010-12-29 Christos.Zoulas + + * test/ftp.y: + improve example, which was stuck in 19XX and assumed file sizes were longs. + +2010-12-29 Thomas E. Dickey + + * test/ftp.tab.c, test/grammar.tab.c, test/pure_calc.tab.c, test/pure_error.tab.c, test/calc.tab.c, test/calc1.tab.c, test/calc2.tab.c, test/calc3.tab.c, test/code_calc.code.c, test/code_error.code.c, test/error.tab.c: + regen + + * test/pure_error.y, test/pure_calc.y, test/ftp.y, test/error.y, test/code_error.y, test/code_calc.y, test/calc.y, test/calc3.y, test/calc2.y, test/calc1.y: + use byacc's YYLEX_DECL/YYERROR_DECL symbols to prototype yylex/yyerror + + * skeleton.c: + remove explicit prototype for yylex() via YYLEX_DECL() macro, since that + would prevent declaring yylex() static (request by Christos Zoulas). + + * test/calc2.tab.c, test/calc3.tab.c: regen + +2010-12-29 Christos.Zoulas + + * output.c: correct definition for YYERROR_DECL() + +2010-12-29 Thomas E. Dickey + + * package/debian/changelog, package/byacc.spec, VERSION: bump + +2010-12-26 Thomas E. Dickey + + * defs.h, main.c: + change return-type of allocate() to avoid warnings of alignment problems + + * main.c: Solaris declares chmod() in + + * configure: regen + + * main.c: ifdef'd use of fcntl.h + + * configure.in: add configure checks for fcntl.h, atexit and mkstemp + + * main.c: for cases where mkstemp() is not available, use tempnam/open + + * aclocal.m4: add CF_MKSTEMP + + * aclocal.m4: + improve quoting, deprecate ${name-value} in favor of standard ${name:-value} + +2010-12-25 Thomas E. Dickey + + * main.c: + start revising use of tmpfile(), to make this work with MinGW. Start by + implementing a mkstemp() alternative - noting that mkstemp() also is broken + for MinGW. + + * package/debian/changelog, package/byacc.spec, VERSION: bump + +2010-11-27 Thomas E. Dickey + + * package/byacc.spec, package/debian/changelog, VERSION: bump + + * test/calc2.tab.c, test/calc3.tab.c: regen + + * output.c: + corrected use of %parse-param value in yyerror(); it doesn't use &yylval + (report by Clifford Yapp) + +2010-11-26 Thomas E. Dickey + + * skeleton.c: typo + + * output.c: + correct line-numbering when "-r" option is used; the 'outline' variable + should only be incremented when writing to the code-file. + + * test/code_calc.code.c, test/code_error.code.c: regen + + * yacc.1: bump date + + * yacc.1: comment on -b option vs -r + + * test/calc2.tab.c, test/calc2.y, test/calc3.tab.c, test/calc3.y, test/ftp.tab.c, test/grammar.tab.c, test/pure_calc.tab.c, test/pure_error.tab.c, test/calc.tab.c, test/calc1.tab.c, test/code_calc.code.c, test/code_error.code.c, test/error.tab.c: + regen + + * output.c: + improve on YYERROR_DECL(), adding dummy params which can be used for the + actual function declaration. Also add YYERROR_CALL(). The two macros + simplify maintaining sets of grammars which may/may not be pure. + + * test/calc1.y, test/ftp.tab.c, test/grammar.tab.c, test/pure_calc.tab.c, test/pure_error.tab.c, test/calc.tab.c, test/calc1.tab.c, test/calc2.tab.c, test/calc3.tab.c, test/code_calc.code.c, test/code_error.code.c, test/error.tab.c: + regen + + * output.c: generate yyerror() calls in output.c + This is for compatibility with bison, which passes the yylval to yyerror + when the %parse-param feature is used. + + * skeleton.c, defs.h: generate yyerror() calls in output.c + + * output.c: simplified a little, using putc_code() and putl_code() + + * test/calc1.tab.h: regen + + * reader.c: + improve ifdef for YYSTYPE union declaration (report by Clifford Yapp) + + * reader.c: + accept underscore as a replacement for dash in command names, e.g., + "%pure_parser" vs "%pure-parser". + + * test/calc1.tab.c: regen + + * output.c, reader.c: + also ifdef YYSTYPE declaration in the generated code (report by Clifford Yapp) + + * package/debian/changelog, package/byacc.spec, VERSION: bump + +2010-11-24 Thomas E. Dickey + + * main.c, defs.h, symtab.c, error.c: reduce global variables + + * package/debian/changelog, package/byacc.spec, VERSION: bump + + * reader.c: + amend fix for Redhat #112617 to still call default_action_warning() for + empty rules (report by Bruce Cran). + +2010-11-22 Thomas E. Dickey + + * output.c: + add ifdef to guard against redefinition of YYSTYPE union (request by Clifford Yapp). + + * test/calc1.tab.c: regen + + * test/calc1.y: cleanup compiler warnings + + * test/grammar.y: add "%expect" + + * test/calc1.tab.h: regen + + * test/calc1.output, test/calc1.tab.c, test/calc1.tab.h: RCS_BASE + + * test/calc2.tab.c, test/calc3.tab.c: regen + + * test/calc1.y: + advanced example from Steve Johnson's paper, uses unions + + * test/calc3.y, test/calc2.y: init 'base', so examples can run + + * test/ftp.tab.c, test/ftp.y: tweaks to compile with g++ + + * output.c: compensate for fix in reader.c + + * reader.c: + add/use putc_both() and puts_both(), incidentally fixing a place where + a union copied to the union_file may be missing the end of the last line. + + * package/debian/changelog, package/byacc.spec, VERSION: bump + +2010-09-28 Thomas E. Dickey + + * config.guess: 2010-09-24 + +2010-09-10 Thomas E. Dickey + + * config.sub: 2010-09-11 + +2010-06-10 Thomas E. Dickey + + * yacc.1, package/debian/changelog, package/byacc.spec, VERSION: + bump to 2010/06/10 + +2010-06-09 Thomas E. Dickey + + * reader.c: free declarations in leak-testing code. + + * main.c: close code_file if -r option used, for leak-testing + + * defs.h, reader.c: + improve %lex-param / %parse-param implementation by allowing for arrays to + be passed as parameters, e.g., "int regs[26]". + + * test/calc3.tab.c, test/calc3.y, test/calc3.output, test/calc3.tab.h, test/calc2.tab.c, test/calc2.y, test/calc2.tab.h, test/calc2.output: + RCS_BASE + + * output.c: + improve %lex-param / %parse-param implementation by allowing for arrays to + be passed as parameters, e.g., "int regs[26]". + + * test/calc.tab.c, test/calc.y: + test-cases and reference files for %lex-param / %parse-param + + * makefile.in: add docs-rule, for html/pdf/txt form of manpage + + * configure: regen + + * aclocal.m4: add CF_XOPEN_SOURCE, etc. + + * configure.in: + use CF_XOPEN_SOURCE check to ensure that strdup is in scope, e.g., for c89 + + * test/ftp.tab.c, test/ftp.y, reader.c, symtab.c, verbose.c, lr0.c, main.c, mkpar.c, output.c, defs.h, closure.c: + fix warnings from clang --analyze + +2010-06-08 Thomas E. Dickey + + * output.c: fix to build with c89, etc. + + * reader.c: gcc warning + + * test/ftp.tab.c, test/ftp.y, test/calc.tab.c, test/code_calc.code.c, test/code_error.code.c, test/code_error.y, test/code_calc.y, test/calc.y, test/pure_error.tab.c, test/error.tab.c, test/error.y, test/pure_error.y, test/pure_calc.tab.c, test/pure_calc.y: + modified test-cases to allow them to compile, to validate pure-parser changes. + updated reference files to match. + + * output.c: + move call for output_stype() earlier since it is used in pure-parser declarations + + * test/grammar.tab.c, test/grammar.y: + modified test-cases to allow them to compile, to validate pure-parser changes. + updated reference files to match. + + * test/calc.tab.c, test/error.tab.c, test/ftp.tab.c, test/grammar.tab.c: + regen + + * yacc.1: document %lex-param and %parse-param + + * test/run_lint.sh, test/run_make.sh: RCS_BASE + + * test/run_test.sh: + further modify to allow build-directory to be in a different location by + passing this directory's location as a parameter to the script. + + * makefile.in: + add check_make and check_lint rules to help validate the generated files + in the test-directory + +2010-06-07 Thomas E. Dickey + + * test/pure_calc.tab.c, test/pure_error.tab.c: RCS_BASE + + * test/run_test.sh: + provide for testing -r and -P options by checking if the ".y" filename + begins with "code_" or "pure_", respectively. + + * test/code_error.code.c, test/code_error.tab.c, test/code_error.tab.h, test/code_calc.code.c, test/code_calc.tab.c, test/code_calc.tab.h, test/pure_calc.output, test/pure_calc.tab.h, test/pure_error.output, test/pure_error.tab.h, test/code_calc.output, test/code_error.output: + RCS_BASE + + * test/error.tab.c, test/ftp.tab.c, test/grammar.tab.c: regen + + * test/run_test.sh: + changes to support running "make check" in a separate build-tree + + * main.c: add "-P" to usage message + + * reader.c: use UCH() macro to hide casts. + +2010-06-07 Andres.Mejia + + * main.c, output.c, reader.c, defs.h, skeleton.c: + Fix the output order of the generated parse code file. This allows for + the use of YYPARSE_PARAM, by having the output that checks for + YYPARSE_PARAM to be defined come after the C code block in the + definitions section of a yacc file. + + Implement support for YYLEX_PARAM, similar to bison. This is useful for + support for building reentrant lexers with flex. + + Fix a compatibility issue with bison's pure-parser option. Bison + defines yylex as sending at least one parameter, &yylval, as the first + parameter and doesn't seem to have an easy way to remove that parameter. + This on the other hand is rather convenient to support saving to yylval + from flex when building reentrant lexers and parsers. + + Add support for the %parse-param and %lex-param directives used in + bison. This change bears some similarity to NetBSD's changes to byacc + at http://www.mail-archive.com/source-changes-full@netbsd.org/msg08143.html + + Bison allows for POSIX yacc emulation via a yacc directive in the yacc + file, and also via a command line switch. Implement this feature as a + no-op for byacc, since byacc is designed to be POSIX yacc compatible + anyway. This allows for better compatibility with yacc sources written + for bison. + +2010-06-07 Thomas E. Dickey + + * VERSION: bump to 2010/06/07 + +2010-06-06 Thomas E. Dickey + + * test/calc.tab.c, configure: regen + + * skeleton.c: + move #include's down into the generated code, to allow user-defined code + to override feature definitions, particularly with stdlib.h (request by + Marcus Kool). + + * lr0.c, error.c, reader.c, defs.h: + strict gcc 3.4.6 warnings on 64-bit platform + + * aclocal.m4, configure.in: add check for lint + + * makefile.in: add lint rule + + * defs.h, closure.c, lr0.c, warshall.c, main.c: + fix gcc warnings, mostly for 64-bit platform + + * aclocal.m4: + add macros for checking ctags/etags, e.g., to work with NetBSD pkgsrc + + * makefile.in: add etags/TAGS if available + + * configure.in: add configure check for actual ctags and etags programs + + * package/debian/copyright: add copyright notices for non-PD files + + * package/debian/changelog: + incorporated scripts in upstream to use for test-builds + + * makefile.in: drop mkdirs.sh, just use "mkdir -p" + + * AUTHORS: nicknames for some contributors (see CHANGES for details) + + * package/byacc.spec: RPM file for byacc + + * VERSION: bump to 2010/06/06 + + * aclocal.m4: add copyright notice, from "my-autoconf" macros + http://invisible-island.net/autoconf/autoconf.html + + * package/RCS, package/debian/RCS, package/debian/source/RCS, package/pkgsrc/RCS: + PERMIT FILE + + * aclocal.m4: resync with my-autoconf. summary of changes: + a) CF_ADD_CFLAGS, etc., improve quoting of ifelse() parameter + b) CF_DISABLE_ECHO, change indent-convention for substituted makefile + c) CF_GCC_VERSION, ignore stderr + d) CF_GCC_WARNINGS, adjust options to work with c89 wrapper of gcc + +2010-04-20 Thomas E. Dickey + + * package/debian/changelog, package/debian/compat, package/debian/control, package/debian/copyright, package/debian/docs, package/debian/postinst, package/debian/prerm, package/debian/rules, package/debian/watch: + scripts from Debian package + +2010-02-16 Thomas E. Dickey + + * yacc.1: document -P and bison-extensions + + * test/ftp.tab.c, test/grammar.tab.c, test/calc.tab.c, test/error.tab.c: + regen + + * output.c: implement %pure-parser + + * skeleton.c: + implement %pure-parser, like bison. To help with this, changed the stack + variables, putting them into a struct. + + * reader.c: implement %pure-parser + + * defs.h: modified skeleton to support %pure-parser feature + + * main.c: add -P option to set %pure-parser + + * output.c: + make -r and -p options work together. The -r option splits the generated + parser into code/table files; for this case we cannot use static data. + Also, we have to repeat the #define's used for prefix (-p) as well as the + redeclaration of yyparse(). Finally, allow any of the prefixed names to + be overridden, e.g., by passing a -D option to the compiler. Make that + a little more readable by putting a blank line before each chunk. + + * defs.h: add definitions for %pure-parser + + * skeleton.c: + put blank line before/after the redeclaration of yyparse() + + * output.c: allow for other program redefining yylex() + + * skeleton.c: + split-off xdecls[] array, to move declaration of yyparse() after #define's + + * defs.h: split-out xdecls[] + + * VERSION: bump + + * configure: regen + + * aclocal.m4: add CF_REMOVE_DEFINE, needed by CF_ADD_CFLAGS + + * aclocal.m4: + resync with my-autoconf CF_ADD_CFLAGS and CF_DISABLE_ECHO changes. + +2010-02-16 Ostap.Cherkashi + + * skeleton.c: fix a memory leak in the generated skeleton + +2010-01-01 Thomas E. Dickey + + * package/debian/source/format: scripts from Debian package + +2009-12-31 Thomas E. Dickey + + * config.guess: 2009-12-30 + + * config.sub: 2009-12-31 + +2009-10-27 Thomas E. Dickey + + * VERSION: 20091027 + + * output.c, mkpar.c, defs.h, lalr.c, closure.c, graph.c, lr0.c, verbose.c, main.c, reader.c: + strict compiler warnings + +2009-10-26 Thomas E. Dickey + + * test/ftp.tab.c, test/grammar.tab.c, test/calc.tab.c, test/error.tab.c: + resync + + * main.c, defs.h: introduce some typedefs for portability, etc. + + * makefile.in: + don't remove "*.log" in mostlyclean rule since it interferes with regression + script. + + * configure: regen + + * aclocal.m4: resync with my-autoconf + +2009-08-25 Thomas E. Dickey + + * config.guess, config.sub: 2009-08-19 + +2009-02-21 Thomas E. Dickey + + * VERSION: bump + + * output.c: restore "yylval" symbol, omitted in cleanup on 2008/8/25 + +2008-12-26 Thomas E. Dickey + + * configure: regen with autoconf-2.52 (patched) + +2008-12-25 Thomas E. Dickey + + * test/error.tab.c, test/ftp.tab.c, test/grammar.tab.c, test/calc.tab.c: + regenerated + +2008-12-24 Thomas E. Dickey + + * VERSION: bump + + * skeleton.c: + remove ifdef-lint from goto yyerrlab, to quiet gcc warning + +2008-11-26 Thomas E. Dickey + + * verbose.c, main.c, defs.h, mkpar.c, reader.c: + completed implementation of "%expect" (report by Perry E. Metzger). + add "%expect-rr", which is (unlike bison) allowable in LALR parsers. + +2008-11-24 Thomas E. Dickey + + * closure.c, defs.h, error.c, graph.c, lalr.c, lr0.c, main.c, mkpar.c, output.c, reader.c, skeleton.c, symtab.c, verbose.c, warshall.c: + change indent-style (request by Perry E. Metzger) + +2008-08-27 Thomas E. Dickey + + * test/calc.tab.c, test/error.tab.c, test/ftp.tab.c, test/grammar.tab.c: + better implementation of YYPARSE_PARAM, using YYPARSE_DECL() macro + + * VERSION: bump + + * skeleton.c: + better implementation of YYPARSE_PARAM, using YYPARSE_DECL() macro + + * test/calc.tab.c, test/error.tab.c, test/ftp.tab.c, test/grammar.tab.c, skeleton.c: + change YYRECOVERING to YYRECOVERING(), for compatibility with other yacc's. + + * configure: regen'd + + * configure.in: add -Wwrite-strings to warnings + + * test/ftp.tab.c, test/grammar.tab.c, test/calc.tab.c, test/error.tab.c: + add YYPARSE_PARAM and YYPARSE_PARAM_TYPE + + * skeleton.c: + add YYPARSE_PARAM (bison) and YYPARSE_PARAM_TYPE (FreeBSD) features. + + * main.c, defs.h, output.c, skeleton.c, symtab.c, error.c, reader.c: + fixes for gcc -Wwrite-strings + + * test/calc.tab.c, test/error.tab.c, test/ftp.tab.c, test/grammar.tab.c: + generate the tables as static-const (this is an interface change) + + * output.c: realign columns in start_table() + + * output.c: + generate the tables as static-const (this is an interface change) + + * output.c: reorder functions to eliminate forward-references + + * test/calc.tab.c, test/error.tab.c, test/ftp.tab.c, test/grammar.tab.c: + remove 'register' keywords + +2008-08-26 Thomas E. Dickey + + * warshall.c, verbose.c, symtab.c, skeleton.c, reader.c, output.c, mkpar.c, main.c, lr0.c, lalr.c, graph.c, error.c, closure.c: + remove 'register' keywords + +2008-08-25 Thomas E. Dickey + + * test/ftp.tab.c: regen'd + + * reader.c: + improve the left-curly fix by testing after blanks, to avoid having a + " {" at the beginning of a line. + + * test/error.tab.c, test/grammar.tab.c: regen'd + + * output.c: + move the remaining newline-counting into write_XXX functions. + + * test/calc.tab.c: regen'd + + * output.c: + simplify part of the output_file formatting using new functions, e.g., + start_int_table(), output_newline(). + + * reader.c: + modify copy_action() to indent the first character, it if is is left-curly + brace. That makes the output look more like the original, as well as makes + it simpler to edit (not confuse editors which look for a left-curly in the + first column as if it were the beginning of a function). + + * skeleton.c: minor fixes to avoid gcc -Wconversion warnings + + * output.c: align the #define's produced for "-p" option + + * test/run_test.sh: use the "-p" option for better coverage. + + * output.c: simplify output_prefix() with new define_prefixed() + + * skeleton.c: include string.h, for memset() + change stack size to unsigned to fix gcc -Wconversion warnings. + + * VERSION: bump to 2008/8/25 + + * makefile.in: add dependency on VERSION file. + +2008-08-24 Thomas E. Dickey + + * VERSION: bump + + * lalr.c: improved memory-leak checking by freeing data in includes[] + + * test/error.tab.c, test/ftp.tab.c, test/grammar.tab.c, test/calc.tab.c: + update to match skeleton-change + + * configure: regen'd + + * skeleton.c: Add fix for stack discussed + http://undeadly.org/cgi?action=article&sid=20080708155228 + and applied + http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/yacc/skeleton.c.diff?r1=1.28&r2=1.29 + + * aclocal.m4: resync with my-autoconf (no major changes) + +2008-07-24 Thomas E. Dickey + + * package/pkgsrc/Makefile, package/pkgsrc/distinfo: + scripts from NetBSD pkgsrc, for test-builds + +2008-03-14 Thomas E. Dickey + + * config.sub: update to 2008-03-08 + + * config.guess: update to 2008-03-12 + +2007-05-09 Thomas E. Dickey + + * main.c: close graph, verbose files if opened, on exit. + + * main.c: + audit memory leaks - valgrind reported some memory still in use on exit. + + * lalr.c, output.c, reader.c, mkpar.c, lr0.c: + add hook for auditing memory leaks + + * defs.h: add hooks for auditing memory leaks + + * configure: regen'd + + * configure.in: + use CF_DISABLE_LEAKS, which combines --disable-leaks, --with-valgrind, + --with-dbmalloc and --with-dmalloc + + * aclocal.m4: add CF_DISABLE_LEAKS and CF_WITH_VALGRIND + + * aclocal.m4: improve version-checking in CF_GCC_VERSION + rework dbmalloc/dmalloc options using CF_NO_LEAKS_OPTION macro + + * VERSION: 2007/5/9 + + * main.c: file_prefix did not always have a trailing null. + +2007-03-25 Thomas E. Dickey + + * mkdirs.sh: improved version for "make -j" + +2006-12-22 Thomas E. Dickey + + * config.guess: 2006/12/22 + +2006-12-08 Thomas E. Dickey + + * config.sub: 2006/12/08 + +2005-08-13 Thomas E. Dickey + + * main.c: add -V to usage message + + * makefile.in: remove -t option from ctags + + * VERSION: 2005/8/13 + +2005-08-13 schmitz + + * main.c: Sylvain Schmitz: + modify the '-o' option to work like bison's, which sets the file-prefix. + +2005-08-13 Matt.Kraai + + * output.c: + Debian #322858 (don't close union_file, which contained data). + This feature is used in groff. + +2005-08-13 Thomas E. Dickey + + * configure: regenerated + + * aclocal.m4: improve checks for Intel compiler warnings + +2005-06-25 Thomas E. Dickey + + * config.sub: 2005/6/2 + + * config.guess: 2005/5/27 + +2005-05-05 Thomas E. Dickey + + * defs.h: add a fallback for GCC_UNUSED + +2005-05-04 Thomas E. Dickey + + * makefile.in: add "." to include-path to pickup config.h + + * reader.c: + apply fix suggested by Steve Dum for end_rule() in Redhat Bugzilla #112617. + + * output.c: + correct a limit check in pack_vector() - report/analysis by William Evans + + * main.c: + exit after printing version. Otherwise "yacc -V" will exit with an erro + after printing the usage message. + + * test/calc.tab.c, test/error.tab.c, test/ftp.tab.c, test/grammar.tab.c: + regenerated after skeleton-changes + + * skeleton.c: replace a few -1's with YYEMPTY + + * skeleton.c: + delete yynewerror (no one uses it any more, and it just makes compiler warnings) + + * skeleton.c: adapt yygrowstack() and related definitions from FreeBSD + + * test/run_test.sh: + filter out lines with YYPATCH, since that will change with each update + + * yacc.1: add -V option + + * main.c: add -V option to print the version. + simplify option-parsing by moving the duplicate logic for setting flags into + new function setflag(). + + * skeleton.c: + move the actual definition of YYMAJOR and YYMINOR to defs.h (as numbers). + add YYPATCH here so it can be tested by applications. + + * defs.h: + add macros to define VERSION in terms of the (numeric) YYMAJOR, YYMINOR and + YYPATCH symbols. + + * lalr.c, lr0.c, mkpar.c, defs.h, closure.c, warshall.c, output.c, verbose.c, graph.c, reader.c, main.c, symtab.c: + reduce externs by making static the procedures that are not referenced outside + the module in which they are defined. + + * makefile.in: + the VERSION file holds the patch-date. Define YYPATCH, so this will be + compiled into the skeleton. + + * VERSION: patch-level for byacc + + * main.c: + add "-o" to usage message. It is too long for a single line; rewrite usage() + to show one option per line. + +2005-05-03 Thomas E. Dickey + + * main.c: add -o option, to work with scripts that assume bison. + simplify create_file_names() with a macro. + simplify done() with a macro. + adapt fix from FreeBSD for signal race, e.g., if done() is interrupted by + onintr(), do not flush output via exit(), but use _exit() instead. + + * defs.h: remove unnecessary externs for main.c + + * yacc.1: add -o option + + * graph.c: remove unused parameter + + * mkpar.c, defs.h, reader.c: + add support for "%expect", a bison feature from FreeBSD sources + + * lr0.c, reader.c, main.c, skeleton.c, graph.c, symtab.c, closure.c, mkpar.c, lalr.c, error.c, warshall.c, verbose.c, output.c: + indent'd + + * configure: regenerated for 2005/5/5 + + * aclocal.m4: miscellaneous updates (adds CF_INTEL_COMPILER) + +2005-04-27 schmitz + + * defs.h, graph.c, lr0.c, main.c, makefile.in, reader.c, yacc.1: + Sylvain Schmitz : + add graphical output of the LALR(1) automaton for graphviz, + associated with command-line option `-g' + +2005-04-16 Thomas E. Dickey + + * config.sub: 2005/2/10 + + * config.guess: 2005/3/24 + +2005-04-13 Thomas E. Dickey + + * package/pkgsrc/PLIST: scripts from NetBSD pkgsrc, for test-builds + +2005-03-21 Thomas E. Dickey + + * package/pkgsrc/DESCR: scripts from NetBSD pkgsrc, for test-builds + +2004-03-28 Thomas E. Dickey + + * test/calc.tab.c, test/error.tab.c, test/ftp.tab.c, test/grammar.tab.c: + updates due to adding yyparse() prototype + + * configure: RCS_BASE + + * configure.in: + add AC_ARG_PROGRAM to make --program-prefix, etc., work. + + * makefile.in: first cut of script to support --program-prefix + + * configure.in: + reorder AC_INIT/AC_CONFIG_HEADER to make this "work" with autoconf 2.52 + + * makefile.in: modify so DESTDIR works + + * makefile.in: use EXEEXT and OBJEXT + + * configure.in: use CF_PROG_EXT + generate a config.h + + * defs.h: make this use the generated config.h + + * skeleton.c: add a forward-reference for yyparse() + + * aclocal.m4: add CF_CHECK_CACHE, needed for CF_PROG_EXT + + * yacc.1: remove the discussion of TMPDIR since it is obsolete + + * skeleton.c: fix a couple of minor compiler-warnings in the skeleton + + * defs.h: remove action_file_name, etc., since we use tmpfile() now. + + * main.c: + use tmpfile() for opening the working files. This quiets a warning + advising the use of mkstemp(). + + * output.c: + Do not close temporary-files here, since they are opened with tmpfile(). + Just rewind them, and they're ready to read back the data stored in them. + + * test/grammar.output, test/grammar.tab.c, test/grammar.tab.h: RCS_BASE + + * makefile.in: turn on "make check" rule + + * test/calc.output, test/run_test.sh, test/calc.tab.h: RCS_BASE + + * test/ftp.tab.c: yyparse() is now yyparse(void) + + * test/calc.tab.c: RCS_BASE + + * test/error.tab.c: yyparse() is now yyparse(void) + + * test/README: RCS_BASE + + * yacc.1: various typography fixes prompted by Debian #100947 + + * aclocal.m4, makefile.in, configure.in: RCS_BASE + + * README: updated to note that this is not the original + +2004-03-24 Thomas E. Dickey + + * test/grammar.y: RCS_BASE + +2004-02-23 Thomas E. Dickey + + * config.sub: RCS_BASE + +2004-02-17 Thomas E. Dickey + + * config.guess: RCS_BASE + +2003-11-29 Thomas E. Dickey + + * install-sh: improved quoting + +2002-06-29 Thomas E. Dickey + + * mkdirs.sh: + don't use character range, since some locales don't work as expected + +2001-06-22 Thomas E. Dickey + + * install-sh: RCS_BASE + +2000-11-20 Thomas E. Dickey + + * test/calc.y: RCS_BASE + + * test/code_calc.y, test/pure_calc.y: copy of calc.y + + * vmsbuild.com: original version + +2000-02-23 Thomas E. Dickey + + * test/RCS, RCS: PERMIT FILE + +2000-02-14 Thomas E. Dickey + + * main.c: fix for VMS port - making pathname for temp-file + + * descrip.mms: original version + +2000-02-13 Thomas E. Dickey + + * defs.h, verbose.c, reader.c, main.c, skeleton.c, warshall.c, symtab.c, closure.c, mkpar.c, lalr.c, lr0.c, output.c, error.c: + ansify + +1999-11-30 Thomas E. Dickey + + * mkdirs.sh: RCS_BASE + +1995-01-01 Thomas E. Dickey + + * config_h.in: RCS_BASE + +1993-12-23 unknown + + * README.DOS, main.c: MSDOS-port + +1993-12-22 unknown + + * reader.c, defs.h: MSDOS-port + +1993-03-02 unknown + + * README: original version + +1993-02-22 unknown + + * test/ftp.output, test/ftp.tab.c, test/ftp.tab.h, test/error.output, test/error.tab.c, test/error.tab.h: + RCS_BASE + + * skeleton.c, warshall.c, main.c, output.c, reader.c, closure.c, NOTES: + original version + +1992-10-12 unknown + + * yacc.1: original version + +1992-10-11 unknown + + * defs.h: original version + +1991-01-20 unknown + + * mkpar.c, verbose.c: original version + +1991-01-14 unknown + + * lr0.c, Makefile, Makefile.old: original version + +1990-07-16 unknown + + * NEW_FEATURES: original version + +1990-06-03 unknown + + * ACKNOWLEDGEMENTS: original version + +1990-02-05 unknown + + * symtab.c, lalr.c, error.c: original version + +1990-01-16 Thomas E. Dickey + + * test/code_error.y, test/pure_error.y: RCS_BASE + +1990-01-16 unknown + + * test/error.y: RCS_BASE + +1989-11-22 unknown + + * NO_WARRANTY: original version + +1989-09-23 unknown + + * test/ftp.y: RCS_BASE + diff --git a/contrib/byacc/Makefile.old b/contrib/byacc/Makefile.old new file mode 100644 index 00000000000..4bab4c9bf02 --- /dev/null +++ b/contrib/byacc/Makefile.old @@ -0,0 +1,84 @@ +DEST = . + +HDRS = defs.h + +CFLAGS = -O -DNDEBUG + +LDFLAGS = + +LIBS = + +LINKER = cc + +MAKEFILE = Makefile + +OBJS = closure.o \ + error.o \ + lalr.o \ + lr0.o \ + main.o \ + mkpar.o \ + output.o \ + reader.o \ + skeleton.o \ + symtab.o \ + verbose.o \ + warshall.o + +PRINT = pr -f -l88 + +PROGRAM = yacc + +SRCS = closure.c \ + error.c \ + lalr.c \ + lr0.c \ + main.c \ + mkpar.c \ + output.c \ + reader.c \ + skeleton.c \ + symtab.c \ + verbose.c \ + warshall.c + +all: $(PROGRAM) + +$(PROGRAM): $(OBJS) $(LIBS) + @echo -n "Loading $(PROGRAM) ... " + @$(LINKER) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS) + @echo "done" + +clean:; @rm -f $(OBJS) + +clobber:; @rm -f $(OBJS) $(PROGRAM) + +depend:; @mkmf -f $(MAKEFILE) PROGRAM=$(PROGRAM) DEST=$(DEST) + +index:; @ctags -wx $(HDRS) $(SRCS) + +install: $(PROGRAM) + @echo Installing $(PROGRAM) in $(DEST) + @install -s $(PROGRAM) $(DEST) + +listing:; @$(PRINT) Makefile $(HDRS) $(SRCS) | lpr + +lint:; @lint $(SRCS) + +program: $(PROGRAM) + +tags: $(HDRS) $(SRCS); @ctags $(HDRS) $(SRCS) + +### +closure.o: defs.h +error.o: defs.h +lalr.o: defs.h +lr0.o: defs.h +main.o: defs.h +mkpar.o: defs.h +output.o: defs.h +reader.o: defs.h +skeleton.o: defs.h +symtab.o: defs.h +verbose.o: defs.h +warshall.o: defs.h diff --git a/usr.bin/yacc/NEW_FEATURES b/contrib/byacc/NEW_FEATURES similarity index 96% rename from usr.bin/yacc/NEW_FEATURES rename to contrib/byacc/NEW_FEATURES index baab2ee9ba2..b030c625b00 100644 --- a/usr.bin/yacc/NEW_FEATURES +++ b/contrib/byacc/NEW_FEATURES @@ -1,5 +1,3 @@ -$FreeBSD$ - The -r option has been implemented. The -r option tells Yacc to put the read-only tables in y.tab.c and the code and variables in y.code.c. Keith Bostic asked for this option so that :yyfix could be @@ -37,7 +35,7 @@ is %ident string -where string is a sequence of characters beginning with a double quote +where string is a sequence of characters begining with a double quote and ending with either a double quote or the next end-of-line, whichever comes first. The declaration will cause a #ident directive to be written near the start of the output file. diff --git a/usr.bin/yacc/NOTES b/contrib/byacc/NOTES similarity index 100% rename from usr.bin/yacc/NOTES rename to contrib/byacc/NOTES diff --git a/contrib/byacc/NO_WARRANTY b/contrib/byacc/NO_WARRANTY new file mode 100644 index 00000000000..06e8d93a2c5 --- /dev/null +++ b/contrib/byacc/NO_WARRANTY @@ -0,0 +1,3 @@ + Berkeley Yacc is distributed with no warranty whatever. The author +and any other contributors take no responsibility for the consequences of +its use. diff --git a/usr.bin/yacc/README b/contrib/byacc/README similarity index 82% rename from usr.bin/yacc/README rename to contrib/byacc/README index 091f2334361..391c43bd70a 100644 --- a/usr.bin/yacc/README +++ b/contrib/byacc/README @@ -1,3 +1,9 @@ +-- $Id: README,v 1.2 2004/03/28 17:24:53 tom Exp $ + +The original README is below. I've updated this version of Berkeley Yacc +to make it ANSI C compliant - Thomas Dickey + +------------------------------------------------------------------------------- Berkeley Yacc is an LALR(1) parser generator. Berkeley Yacc has been made as compatible as possible with AT&T Yacc. Berkeley Yacc can accept any input specification that conforms to the AT&T Yacc documentation. Specifications diff --git a/contrib/byacc/VERSION b/contrib/byacc/VERSION new file mode 100644 index 00000000000..b15d73f3090 --- /dev/null +++ b/contrib/byacc/VERSION @@ -0,0 +1 @@ +20120115 diff --git a/contrib/byacc/aclocal.m4 b/contrib/byacc/aclocal.m4 new file mode 100644 index 00000000000..c70dd4b4514 --- /dev/null +++ b/contrib/byacc/aclocal.m4 @@ -0,0 +1,1144 @@ +dnl $Id: aclocal.m4,v 1.19 2012/01/13 14:10:56 tom Exp $ +dnl Macros for byacc configure script (Thomas E. Dickey) +dnl --------------------------------------------------------------------------- +dnl Copyright 2004-2011,2012 Thomas E. Dickey +dnl +dnl Permission is hereby granted, free of charge, to any person obtaining a +dnl copy of this software and associated documentation files (the +dnl "Software"), to deal in the Software without restriction, including +dnl without limitation the rights to use, copy, modify, merge, publish, +dnl distribute, distribute with modifications, sublicense, and/or sell +dnl copies of the Software, and to permit persons to whom the Software is +dnl furnished to do so, subject to the following conditions: +dnl +dnl The above copyright notice and this permission notice shall be included +dnl in all copies or portions of the Software. +dnl +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR +dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE. +dnl +dnl Except as contained in this notice, the name(s) of the above copyright +dnl holders shall not be used in advertising or otherwise to promote the +dnl sale, use or other dealings in this Software without prior written +dnl authorization. +dnl --------------------------------------------------------------------------- +dnl --------------------------------------------------------------------------- +dnl CF_ADD_CFLAGS version: 10 updated: 2010/05/26 05:38:42 +dnl ------------- +dnl Copy non-preprocessor flags to $CFLAGS, preprocessor flags to $CPPFLAGS +dnl The second parameter if given makes this macro verbose. +dnl +dnl Put any preprocessor definitions that use quoted strings in $EXTRA_CPPFLAGS, +dnl to simplify use of $CPPFLAGS in compiler checks, etc., that are easily +dnl confused by the quotes (which require backslashes to keep them usable). +AC_DEFUN([CF_ADD_CFLAGS], +[ +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $1 +do +case $cf_fix_cppflags in +no) + case $cf_add_cflags in #(vi + -undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi + case $cf_add_cflags in + -D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[[^=]]*='\''\"[[^"]]*//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + fi + ;; + esac + case "$CPPFLAGS" in + *$cf_add_cflags) #(vi + ;; + *) #(vi + case $cf_add_cflags in #(vi + -D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,$cf_tst_cppflags) + ;; + esac + cf_new_cppflags="$cf_new_cppflags $cf_add_cflags" + ;; + esac + ;; + *) + cf_new_cflags="$cf_new_cflags $cf_add_cflags" + ;; + esac + ;; +yes) + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[[^"]]*"'\''//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$CFLAGS $cf_new_cflags)]) + CFLAGS="$CFLAGS $cf_new_cflags" +fi + +if test -n "$cf_new_cppflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$CPPFLAGS $cf_new_cppflags)]) + CPPFLAGS="$CPPFLAGS $cf_new_cppflags" +fi + +if test -n "$cf_new_extra_cppflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags)]) + EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS" +fi + +AC_SUBST(EXTRA_CPPFLAGS) + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ANSI_CC_CHECK version: 11 updated: 2011/07/01 19:47:45 +dnl ---------------- +dnl This was originally adapted from the macros 'fp_PROG_CC_STDC' and +dnl 'fp_C_PROTOTYPES' in the sharutils 4.2 distribution. +AC_DEFUN([CF_ANSI_CC_CHECK], +[ +# This should have been defined by AC_PROG_CC +: ${CC:=cc} + +# Check for user's environment-breakage by stuffing CFLAGS/CPPFLAGS content +# into CC. This will not help with broken scripts that wrap the compiler with +# options, but eliminates a more common category of user confusion. +AC_MSG_CHECKING(\$CC variable) +case "$CC" in #(vi +*[[\ \ ]]-[[IUD]]*) + AC_MSG_RESULT(broken) + AC_MSG_WARN(your environment misuses the CC variable to hold CFLAGS/CPPFLAGS options) + # humor him... + cf_flags=`echo "$CC" | sed -e 's/^[[^ ]]*[[ ]]//'` + CC=`echo "$CC" | sed -e 's/[[ ]].*//'` + CF_ADD_CFLAGS($cf_flags) + ;; +*) + AC_MSG_RESULT(ok) + ;; +esac + +AC_CACHE_CHECK(for ${CC:-cc} option to accept ANSI C, cf_cv_ansi_cc,[ +cf_cv_ansi_cc=no +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX -Aa -D_HPUX_SOURCE +# SVR4 -Xc +# UnixWare 1.2 (cannot use -Xc, since ANSI/POSIX clashes) +for cf_arg in "-DCC_HAS_PROTOS" \ + "" \ + -qlanglvl=ansi \ + -std1 \ + -Ae \ + "-Aa -D_HPUX_SOURCE" \ + -Xc +do + CF_ADD_CFLAGS($cf_arg) + AC_TRY_COMPILE( +[ +#ifndef CC_HAS_PROTOS +#if !defined(__STDC__) || (__STDC__ != 1) +choke me +#endif +#endif +],[ + int test (int i, double x); + struct s1 {int (*f) (int a);}; + struct s2 {int (*f) (double a);};], + [cf_cv_ansi_cc="$cf_arg"; break]) +done +CFLAGS="$cf_save_CFLAGS" +CPPFLAGS="$cf_save_CPPFLAGS" +]) + +if test "$cf_cv_ansi_cc" != "no"; then +if test ".$cf_cv_ansi_cc" != ".-DCC_HAS_PROTOS"; then + CF_ADD_CFLAGS($cf_cv_ansi_cc) +else + AC_DEFINE(CC_HAS_PROTOS) +fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ANSI_CC_REQD version: 4 updated: 2008/03/23 14:48:54 +dnl --------------- +dnl For programs that must use an ANSI compiler, obtain compiler options that +dnl will make it recognize prototypes. We'll do preprocessor checks in other +dnl macros, since tools such as unproto can fake prototypes, but only part of +dnl the preprocessor. +AC_DEFUN([CF_ANSI_CC_REQD], +[AC_REQUIRE([CF_ANSI_CC_CHECK]) +if test "$cf_cv_ansi_cc" = "no"; then + AC_MSG_ERROR( +[Your compiler does not appear to recognize prototypes. +You have the following choices: + a. adjust your compiler options + b. get an up-to-date compiler + c. use a wrapper such as unproto]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_DISABLE version: 3 updated: 1999/03/30 17:24:31 +dnl -------------- +dnl Allow user to disable a normally-on option. +AC_DEFUN([CF_ARG_DISABLE], +[CF_ARG_OPTION($1,[$2],[$3],[$4],yes)])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_OPTION version: 4 updated: 2010/05/26 05:38:42 +dnl ------------- +dnl Restricted form of AC_ARG_ENABLE that ensures user doesn't give bogus +dnl values. +dnl +dnl Parameters: +dnl $1 = option name +dnl $2 = help-string +dnl $3 = action to perform if option is not default +dnl $4 = action if perform if option is default +dnl $5 = default option value (either 'yes' or 'no') +AC_DEFUN([CF_ARG_OPTION], +[AC_ARG_ENABLE([$1],[$2],[test "$enableval" != ifelse([$5],no,yes,no) && enableval=ifelse([$5],no,no,yes) + if test "$enableval" != "$5" ; then +ifelse([$3],,[ :]dnl +,[ $3]) ifelse([$4],,,[ + else + $4]) + fi],[enableval=$5 ifelse([$4],,,[ + $4 +])dnl + ])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_CACHE version: 11 updated: 2008/03/23 14:45:59 +dnl -------------- +dnl Check if we're accidentally using a cache from a different machine. +dnl Derive the system name, as a check for reusing the autoconf cache. +dnl +dnl If we've packaged config.guess and config.sub, run that (since it does a +dnl better job than uname). Normally we'll use AC_CANONICAL_HOST, but allow +dnl an extra parameter that we may override, e.g., for AC_CANONICAL_SYSTEM +dnl which is useful in cross-compiles. +dnl +dnl Note: we would use $ac_config_sub, but that is one of the places where +dnl autoconf 2.5x broke compatibility with autoconf 2.13 +AC_DEFUN([CF_CHECK_CACHE], +[ +if test -f $srcdir/config.guess || test -f $ac_aux_dir/config.guess ; then + ifelse([$1],,[AC_CANONICAL_HOST],[$1]) + system_name="$host_os" +else + system_name="`(uname -s -r) 2>/dev/null`" + if test -z "$system_name" ; then + system_name="`(hostname) 2>/dev/null`" + fi +fi +test -n "$system_name" && AC_DEFINE_UNQUOTED(SYSTEM_NAME,"$system_name") +AC_CACHE_VAL(cf_cv_system_name,[cf_cv_system_name="$system_name"]) + +test -z "$system_name" && system_name="$cf_cv_system_name" +test -n "$cf_cv_system_name" && AC_MSG_RESULT(Configuring for $cf_cv_system_name) + +if test ".$system_name" != ".$cf_cv_system_name" ; then + AC_MSG_RESULT(Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)) + AC_MSG_ERROR("Please remove config.cache and try again.") +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_ECHO version: 11 updated: 2009/12/13 13:16:57 +dnl --------------- +dnl You can always use "make -n" to see the actual options, but it's hard to +dnl pick out/analyze warning messages when the compile-line is long. +dnl +dnl Sets: +dnl ECHO_LT - symbol to control if libtool is verbose +dnl ECHO_LD - symbol to prefix "cc -o" lines +dnl RULE_CC - symbol to put before implicit "cc -c" lines (e.g., .c.o) +dnl SHOW_CC - symbol to put before explicit "cc -c" lines +dnl ECHO_CC - symbol to put before any "cc" line +dnl +AC_DEFUN([CF_DISABLE_ECHO],[ +AC_MSG_CHECKING(if you want to see long compiling messages) +CF_ARG_DISABLE(echo, + [ --disable-echo display "compiling" commands], + [ + ECHO_LT='--silent' + ECHO_LD='@echo linking [$]@;' + RULE_CC='@echo compiling [$]<' + SHOW_CC='@echo compiling [$]@' + ECHO_CC='@' +],[ + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' +]) +AC_MSG_RESULT($enableval) +AC_SUBST(ECHO_LT) +AC_SUBST(ECHO_LD) +AC_SUBST(RULE_CC) +AC_SUBST(SHOW_CC) +AC_SUBST(ECHO_CC) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_LEAKS version: 6 updated: 2010/07/23 04:14:32 +dnl ---------------- +dnl Combine no-leak checks with the libraries or tools that are used for the +dnl checks. +AC_DEFUN([CF_DISABLE_LEAKS],[ + +AC_REQUIRE([CF_WITH_DMALLOC]) +AC_REQUIRE([CF_WITH_DBMALLOC]) +AC_REQUIRE([CF_WITH_VALGRIND]) + +AC_MSG_CHECKING(if you want to perform memory-leak testing) +AC_ARG_ENABLE(leaks, + [ --disable-leaks test: free permanent memory, analyze leaks], + [if test "x$enableval" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi], + : ${with_no_leaks:=no}) +AC_MSG_RESULT($with_no_leaks) + +if test "$with_no_leaks" = yes ; then + AC_DEFINE(NO_LEAKS) + AC_DEFINE(YY_NO_LEAKS) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_ATTRIBUTES version: 14 updated: 2010/10/23 15:52:32 +dnl ----------------- +dnl Test for availability of useful gcc __attribute__ directives to quiet +dnl compiler warnings. Though useful, not all are supported -- and contrary +dnl to documentation, unrecognized directives cause older compilers to barf. +AC_DEFUN([CF_GCC_ATTRIBUTES], +[ +if test "$GCC" = yes +then +cat > conftest.i < conftest.$ac_ext <&AC_FD_CC + + case $cf_attribute in #(vi + printf) #(vi + cf_printf_attribute=yes + cat >conftest.h <conftest.h <conftest.h <>confdefs.h + case $cf_attribute in #(vi + printf) #(vi + if test "$cf_printf_attribute" = no ; then + cat >>confdefs.h <>confdefs.h <>confdefs.h <>confdefs.h <>confdefs.h +fi +rm -rf conftest* +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_VERSION version: 5 updated: 2010/04/24 11:02:31 +dnl -------------- +dnl Find version of gcc +AC_DEFUN([CF_GCC_VERSION],[ +AC_REQUIRE([AC_PROG_CC]) +GCC_VERSION=none +if test "$GCC" = yes ; then + AC_MSG_CHECKING(version of $CC) + GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`" + test -z "$GCC_VERSION" && GCC_VERSION=unknown + AC_MSG_RESULT($GCC_VERSION) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_WARNINGS version: 27 updated: 2010/10/23 15:52:32 +dnl --------------- +dnl Check if the compiler supports useful warning options. There's a few that +dnl we don't use, simply because they're too noisy: +dnl +dnl -Wconversion (useful in older versions of gcc, but not in gcc 2.7.x) +dnl -Wredundant-decls (system headers make this too noisy) +dnl -Wtraditional (combines too many unrelated messages, only a few useful) +dnl -Wwrite-strings (too noisy, but should review occasionally). This +dnl is enabled for ncurses using "--enable-const". +dnl -pedantic +dnl +dnl Parameter: +dnl $1 is an optional list of gcc warning flags that a particular +dnl application might want to use, e.g., "no-unused" for +dnl -Wno-unused +dnl Special: +dnl If $with_ext_const is "yes", add a check for -Wwrite-strings +dnl +AC_DEFUN([CF_GCC_WARNINGS], +[ +AC_REQUIRE([CF_GCC_VERSION]) +CF_INTEL_COMPILER(GCC,INTEL_COMPILER,CFLAGS) + +cat > conftest.$ac_ext <],[ +#ifndef _XOPEN_SOURCE +make an error +#endif], + [cf_cv_gnu_source=no], + [cf_save="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" + AC_TRY_COMPILE([#include ],[ +#ifdef _XOPEN_SOURCE +make an error +#endif], + [cf_cv_gnu_source=no], + [cf_cv_gnu_source=yes]) + CPPFLAGS="$cf_save" + ]) +]) +test "$cf_cv_gnu_source" = yes && CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INTEL_COMPILER version: 4 updated: 2010/05/26 05:38:42 +dnl ----------------- +dnl Check if the given compiler is really the Intel compiler for Linux. It +dnl tries to imitate gcc, but does not return an error when it finds a mismatch +dnl between prototypes, e.g., as exercised by CF_MISSING_CHECK. +dnl +dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to +dnl ensure that it is not mistaken for gcc/g++. It is normally invoked from +dnl the wrappers for gcc and g++ warnings. +dnl +dnl $1 = GCC (default) or GXX +dnl $2 = INTEL_COMPILER (default) or INTEL_CPLUSPLUS +dnl $3 = CFLAGS (default) or CXXFLAGS +AC_DEFUN([CF_INTEL_COMPILER],[ +ifelse([$2],,INTEL_COMPILER,[$2])=no + +if test "$ifelse([$1],,[$1],GCC)" = yes ; then + case $host_os in + linux*|gnu*) + AC_MSG_CHECKING(if this is really Intel ifelse([$1],GXX,C++,C) compiler) + cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])" + ifelse([$3],,CFLAGS,[$3])="$ifelse([$3],,CFLAGS,[$3]) -no-gcc" + AC_TRY_COMPILE([],[ +#ifdef __INTEL_COMPILER +#else +make an error +#endif +],[ifelse([$2],,INTEL_COMPILER,[$2])=yes +cf_save_CFLAGS="$cf_save_CFLAGS -we147 -no-gcc" +],[]) + ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS" + AC_MSG_RESULT($ifelse([$2],,INTEL_COMPILER,[$2])) + ;; + esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MAKE_TAGS version: 6 updated: 2010/10/23 15:52:32 +dnl ------------ +dnl Generate tags/TAGS targets for makefiles. Do not generate TAGS if we have +dnl a monocase filesystem. +AC_DEFUN([CF_MAKE_TAGS],[ +AC_REQUIRE([CF_MIXEDCASE_FILENAMES]) + +AC_CHECK_PROGS(CTAGS, exctags ctags) +AC_CHECK_PROGS(ETAGS, exetags etags) + +AC_CHECK_PROG(MAKE_LOWER_TAGS, ${CTAGS:-ctags}, yes, no) + +if test "$cf_cv_mixedcase" = yes ; then + AC_CHECK_PROG(MAKE_UPPER_TAGS, ${ETAGS:-etags}, yes, no) +else + MAKE_UPPER_TAGS=no +fi + +if test "$MAKE_UPPER_TAGS" = yes ; then + MAKE_UPPER_TAGS= +else + MAKE_UPPER_TAGS="#" +fi + +if test "$MAKE_LOWER_TAGS" = yes ; then + MAKE_LOWER_TAGS= +else + MAKE_LOWER_TAGS="#" +fi + +AC_SUBST(CTAGS) +AC_SUBST(ETAGS) + +AC_SUBST(MAKE_UPPER_TAGS) +AC_SUBST(MAKE_LOWER_TAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MIXEDCASE_FILENAMES version: 3 updated: 2003/09/20 17:07:55 +dnl ---------------------- +dnl Check if the file-system supports mixed-case filenames. If we're able to +dnl create a lowercase name and see it as uppercase, it doesn't support that. +AC_DEFUN([CF_MIXEDCASE_FILENAMES], +[ +AC_CACHE_CHECK(if filesystem supports mixed-case filenames,cf_cv_mixedcase,[ +if test "$cross_compiling" = yes ; then + case $target_alias in #(vi + *-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-mingw32*|*-uwin*) #(vi + cf_cv_mixedcase=no + ;; + *) + cf_cv_mixedcase=yes + ;; + esac +else + rm -f conftest CONFTEST + echo test >conftest + if test -f CONFTEST ; then + cf_cv_mixedcase=no + else + cf_cv_mixedcase=yes + fi + rm -f conftest CONFTEST +fi +]) +test "$cf_cv_mixedcase" = yes && AC_DEFINE(MIXEDCASE_FILENAMES) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MKSTEMP version: 7 updated: 2010/08/14 18:25:37 +dnl ---------- +dnl Check for a working mkstemp. This creates two files, checks that they are +dnl successfully created and distinct (AmigaOS apparently fails on the last). +AC_DEFUN([CF_MKSTEMP],[ +AC_CACHE_CHECK(for working mkstemp, cf_cv_func_mkstemp,[ +rm -rf conftest* +AC_TRY_RUN([ +#include +#include +#include +#include +#include +int main() +{ + char *tmpl = "conftestXXXXXX"; + char name[2][80]; + int n; + int result = 0; + int fd; + struct stat sb; + + umask(077); + for (n = 0; n < 2; ++n) { + strcpy(name[n], tmpl); + if ((fd = mkstemp(name[n])) >= 0) { + if (!strcmp(name[n], tmpl) + || stat(name[n], &sb) != 0 + || (sb.st_mode & S_IFMT) != S_IFREG + || (sb.st_mode & 077) != 0) { + result = 1; + } + close(fd); + } + } + if (result == 0 + && !strcmp(name[0], name[1])) + result = 1; + ${cf_cv_main_return:-return}(result); +} +],[cf_cv_func_mkstemp=yes +],[cf_cv_func_mkstemp=no +],[AC_CHECK_FUNC(mkstemp) +]) +]) +if test "x$cf_cv_func_mkstemp" = xyes || test "x$ac_cv_func_mkstemp" = xyes ; then + AC_DEFINE(HAVE_MKSTEMP) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MSG_LOG version: 5 updated: 2010/10/23 15:52:32 +dnl ---------- +dnl Write a debug message to config.log, along with the line number in the +dnl configure script. +AC_DEFUN([CF_MSG_LOG],[ +echo "${as_me:-configure}:__oline__: testing $* ..." 1>&AC_FD_CC +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NO_LEAKS_OPTION version: 4 updated: 2006/12/16 14:24:05 +dnl ------------------ +dnl see CF_WITH_NO_LEAKS +AC_DEFUN([CF_NO_LEAKS_OPTION],[ +AC_MSG_CHECKING(if you want to use $1 for testing) +AC_ARG_WITH($1, + [$2], + [AC_DEFINE($3)ifelse([$4],,[ + $4 +]) + : ${with_cflags:=-g} + : ${with_no_leaks:=yes} + with_$1=yes], + [with_$1=]) +AC_MSG_RESULT(${with_$1:-no}) + +case .$with_cflags in #(vi +.*-g*) + case .$CFLAGS in #(vi + .*-g*) #(vi + ;; + *) + CF_ADD_CFLAGS([-g]) + ;; + esac + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_POSIX_C_SOURCE version: 8 updated: 2010/05/26 05:38:42 +dnl ----------------- +dnl Define _POSIX_C_SOURCE to the given level, and _POSIX_SOURCE if needed. +dnl +dnl POSIX.1-1990 _POSIX_SOURCE +dnl POSIX.1-1990 and _POSIX_SOURCE and +dnl POSIX.2-1992 C-Language _POSIX_C_SOURCE=2 +dnl Bindings Option +dnl POSIX.1b-1993 _POSIX_C_SOURCE=199309L +dnl POSIX.1c-1996 _POSIX_C_SOURCE=199506L +dnl X/Open 2000 _POSIX_C_SOURCE=200112L +dnl +dnl Parameters: +dnl $1 is the nominal value for _POSIX_C_SOURCE +AC_DEFUN([CF_POSIX_C_SOURCE], +[ +cf_POSIX_C_SOURCE=ifelse([$1],,199506L,[$1]) + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +CF_REMOVE_DEFINE(cf_trim_CFLAGS,$cf_save_CFLAGS,_POSIX_C_SOURCE) +CF_REMOVE_DEFINE(cf_trim_CPPFLAGS,$cf_save_CPPFLAGS,_POSIX_C_SOURCE) + +AC_CACHE_CHECK(if we should define _POSIX_C_SOURCE,cf_cv_posix_c_source,[ + CF_MSG_LOG(if the symbol is already defined go no further) + AC_TRY_COMPILE([#include ],[ +#ifndef _POSIX_C_SOURCE +make an error +#endif], + [cf_cv_posix_c_source=no], + [cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in #(vi + .[[12]]??*) #(vi + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + .2) #(vi + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + .*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + AC_TRY_COMPILE([#include ],[ +#ifdef _POSIX_SOURCE +make an error +#endif],[], + cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE") + fi + CF_MSG_LOG(ifdef from value $cf_POSIX_C_SOURCE) + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS $cf_cv_posix_c_source" + CF_MSG_LOG(if the second compile does not leave our definition intact error) + AC_TRY_COMPILE([#include ],[ +#ifndef _POSIX_C_SOURCE +make an error +#endif],, + [cf_cv_posix_c_source=no]) + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + ]) +]) + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + CF_ADD_CFLAGS($cf_cv_posix_c_source) +fi + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_EXT version: 10 updated: 2004/01/03 19:28:18 +dnl ----------- +dnl Compute $PROG_EXT, used for non-Unix ports, such as OS/2 EMX. +AC_DEFUN([CF_PROG_EXT], +[ +AC_REQUIRE([CF_CHECK_CACHE]) +case $cf_cv_system_name in +os2*) + CFLAGS="$CFLAGS -Zmt" + CPPFLAGS="$CPPFLAGS -D__ST_MT_ERRNO__" + CXXFLAGS="$CXXFLAGS -Zmt" + # autoconf's macro sets -Zexe and suffix both, which conflict:w + LDFLAGS="$LDFLAGS -Zmt -Zcrtdll" + ac_cv_exeext=.exe + ;; +esac + +AC_EXEEXT +AC_OBJEXT + +PROG_EXT="$EXEEXT" +AC_SUBST(PROG_EXT) +test -n "$PROG_EXT" && AC_DEFINE_UNQUOTED(PROG_EXT,"$PROG_EXT") +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_LINT version: 2 updated: 2009/08/12 04:43:14 +dnl ------------ +AC_DEFUN([CF_PROG_LINT], +[ +AC_CHECK_PROGS(LINT, tdlint lint alint splint lclint) +AC_SUBST(LINT_OPTS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_REMOVE_DEFINE version: 3 updated: 2010/01/09 11:05:50 +dnl ---------------- +dnl Remove all -U and -D options that refer to the given symbol from a list +dnl of C compiler options. This works around the problem that not all +dnl compilers process -U and -D options from left-to-right, so a -U option +dnl cannot be used to cancel the effect of a preceding -D option. +dnl +dnl $1 = target (which could be the same as the source variable) +dnl $2 = source (including '$') +dnl $3 = symbol to remove +define([CF_REMOVE_DEFINE], +[ +$1=`echo "$2" | \ + sed -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[[ ]]/ /g' \ + -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[$]//g'` +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TRY_XOPEN_SOURCE version: 1 updated: 2011/10/30 17:09:50 +dnl ------------------- +dnl If _XOPEN_SOURCE is not defined in the compile environment, check if we +dnl can define it successfully. +AC_DEFUN([CF_TRY_XOPEN_SOURCE],[ +AC_CACHE_CHECK(if we should define _XOPEN_SOURCE,cf_cv_xopen_source,[ + AC_TRY_COMPILE([ +#include +#include +#include +],[ +#ifndef _XOPEN_SOURCE +make an error +#endif], + [cf_cv_xopen_source=no], + [cf_save="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + AC_TRY_COMPILE([ +#include +#include +#include +],[ +#ifdef _XOPEN_SOURCE +make an error +#endif], + [cf_cv_xopen_source=no], + [cf_cv_xopen_source=$cf_XOPEN_SOURCE]) + CPPFLAGS="$cf_save" + ]) +]) + +if test "$cf_cv_xopen_source" != no ; then + CF_REMOVE_DEFINE(CFLAGS,$CFLAGS,_XOPEN_SOURCE) + CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,_XOPEN_SOURCE) + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + CF_ADD_CFLAGS($cf_temp_xopen_source) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_UPPER version: 5 updated: 2001/01/29 23:40:59 +dnl -------- +dnl Make an uppercase version of a variable +dnl $1=uppercase($2) +AC_DEFUN([CF_UPPER], +[ +$1=`echo "$2" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_VERBOSE version: 3 updated: 2007/07/29 09:55:12 +dnl ---------- +dnl Use AC_VERBOSE w/o the warnings +AC_DEFUN([CF_VERBOSE], +[test -n "$verbose" && echo " $1" 1>&AC_FD_MSG +CF_MSG_LOG([$1]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_DBMALLOC version: 7 updated: 2010/06/21 17:26:47 +dnl ---------------- +dnl Configure-option for dbmalloc. The optional parameter is used to override +dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests. +AC_DEFUN([CF_WITH_DBMALLOC],[ +CF_NO_LEAKS_OPTION(dbmalloc, + [ --with-dbmalloc test: use Conor Cahill's dbmalloc library], + [USE_DBMALLOC]) + +if test "$with_dbmalloc" = yes ; then + AC_CHECK_HEADER(dbmalloc.h, + [AC_CHECK_LIB(dbmalloc,[debug_malloc]ifelse([$1],,[],[,$1]))]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_DMALLOC version: 7 updated: 2010/06/21 17:26:47 +dnl --------------- +dnl Configure-option for dmalloc. The optional parameter is used to override +dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests. +AC_DEFUN([CF_WITH_DMALLOC],[ +CF_NO_LEAKS_OPTION(dmalloc, + [ --with-dmalloc test: use Gray Watson's dmalloc library], + [USE_DMALLOC]) + +if test "$with_dmalloc" = yes ; then + AC_CHECK_HEADER(dmalloc.h, + [AC_CHECK_LIB(dmalloc,[dmalloc_debug]ifelse([$1],,[],[,$1]))]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_VALGRIND version: 1 updated: 2006/12/14 18:00:21 +dnl ---------------- +AC_DEFUN([CF_WITH_VALGRIND],[ +CF_NO_LEAKS_OPTION(valgrind, + [ --with-valgrind test: use valgrind], + [USE_VALGRIND]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_WARNINGS version: 5 updated: 2004/07/23 14:40:34 +dnl ---------------- +dnl Combine the checks for gcc features into a configure-script option +dnl +dnl Parameters: +dnl $1 - see CF_GCC_WARNINGS +AC_DEFUN([CF_WITH_WARNINGS], +[ +if ( test "$GCC" = yes || test "$GXX" = yes ) +then +AC_MSG_CHECKING(if you want to check for gcc warnings) +AC_ARG_WITH(warnings, + [ --with-warnings test: turn on gcc warnings], + [cf_opt_with_warnings=$withval], + [cf_opt_with_warnings=no]) +AC_MSG_RESULT($cf_opt_with_warnings) +if test "$cf_opt_with_warnings" != no ; then + CF_GCC_ATTRIBUTES + CF_GCC_WARNINGS([$1]) +fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_XOPEN_SOURCE version: 42 updated: 2012/01/07 08:26:49 +dnl --------------- +dnl Try to get _XOPEN_SOURCE defined properly that we can use POSIX functions, +dnl or adapt to the vendor's definitions to get equivalent functionality, +dnl without losing the common non-POSIX features. +dnl +dnl Parameters: +dnl $1 is the nominal value for _XOPEN_SOURCE +dnl $2 is the nominal value for _POSIX_C_SOURCE +AC_DEFUN([CF_XOPEN_SOURCE],[ + +cf_XOPEN_SOURCE=ifelse([$1],,500,[$1]) +cf_POSIX_C_SOURCE=ifelse([$2],,199506L,[$2]) +cf_xopen_source= + +case $host_os in #(vi +aix[[4-7]]*) #(vi + cf_xopen_source="-D_ALL_SOURCE" + ;; +cygwin) #(vi + cf_XOPEN_SOURCE=600 + ;; +darwin[[0-8]].*) #(vi + cf_xopen_source="-D_APPLE_C_SOURCE" + ;; +darwin*) #(vi + cf_xopen_source="-D_DARWIN_C_SOURCE" + cf_XOPEN_SOURCE= + ;; +freebsd*|dragonfly*) #(vi + # 5.x headers associate + # _XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L + # _XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L + cf_POSIX_C_SOURCE=200112L + cf_XOPEN_SOURCE=600 + cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + ;; +hpux11*) #(vi + cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500" + ;; +hpux*) #(vi + cf_xopen_source="-D_HPUX_SOURCE" + ;; +irix[[56]].*) #(vi + cf_xopen_source="-D_SGI_SOURCE" + cf_XOPEN_SOURCE= + ;; +linux*|gnu*|mint*|k*bsd*-gnu) #(vi + CF_GNU_SOURCE + ;; +mirbsd*) #(vi + # setting _XOPEN_SOURCE or _POSIX_SOURCE breaks and other headers which use u_int / u_short types + cf_XOPEN_SOURCE= + CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE) + ;; +netbsd*) #(vi + cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw + ;; +openbsd[[4-9]]*) #(vi + # setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=600 + ;; +openbsd*) #(vi + # setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw + ;; +osf[[45]]*) #(vi + cf_xopen_source="-D_OSF_SOURCE" + ;; +nto-qnx*) #(vi + cf_xopen_source="-D_QNX_SOURCE" + ;; +sco*) #(vi + # setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer + ;; +solaris2.*) #(vi + cf_xopen_source="-D__EXTENSIONS__" + ;; +*) + CF_TRY_XOPEN_SOURCE + CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE) + ;; +esac + +if test -n "$cf_xopen_source" ; then + CF_ADD_CFLAGS($cf_xopen_source) +fi + +dnl In anything but the default case, we may have system-specific setting +dnl which is still not guaranteed to provide all of the entrypoints that +dnl _XOPEN_SOURCE would yield. +if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then + AC_MSG_CHECKING(if _XOPEN_SOURCE really is set) + AC_TRY_COMPILE([#include ],[ +#ifndef _XOPEN_SOURCE +make an error +#endif], + [cf_XOPEN_SOURCE_set=yes], + [cf_XOPEN_SOURCE_set=no]) + AC_MSG_RESULT($cf_XOPEN_SOURCE_set) + if test $cf_XOPEN_SOURCE_set = yes + then + AC_TRY_COMPILE([#include ],[ +#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +make an error +#endif], + [cf_XOPEN_SOURCE_set_ok=yes], + [cf_XOPEN_SOURCE_set_ok=no]) + if test $cf_XOPEN_SOURCE_set_ok = no + then + AC_MSG_WARN(_XOPEN_SOURCE is lower than requested) + fi + else + CF_TRY_XOPEN_SOURCE + fi +fi +]) diff --git a/usr.bin/yacc/closure.c b/contrib/byacc/closure.c similarity index 57% rename from usr.bin/yacc/closure.c rename to contrib/byacc/closure.c index a39d40244c4..7573ff5bbd3 100644 --- a/usr.bin/yacc/closure.c +++ b/contrib/byacc/closure.c @@ -1,62 +1,14 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ +/* $Id: closure.c,v 1.9 2010/06/09 08:21:47 tom Exp $ */ -#if 0 -#ifndef lint -static char sccsid[] = "@(#)closure.c 5.3 (Berkeley) 5/24/93"; -#endif -#endif - -#include -__FBSDID("$FreeBSD$"); - -#include #include "defs.h" -short *itemset; -short *itemsetend; +Value_t *itemset; +Value_t *itemsetend; unsigned *ruleset; -static void set_EFF(void); -#ifdef DEBUG -static void print_closure(int); -static void print_EFF(); -static void print_first_derives(); -#endif - static unsigned *first_derives; static unsigned *EFF; - static void set_EFF(void) { @@ -93,7 +45,6 @@ set_EFF(void) #endif } - void set_first_derives(void) { @@ -128,7 +79,7 @@ set_first_derives(void) k = 0; } - if (cword & (1 << k)) + if (cword & (unsigned)(1 << k)) { rp = derives[j]; while ((rule = *rp++) >= 0) @@ -145,25 +96,24 @@ set_first_derives(void) print_first_derives(); #endif - free(EFF); + FREE(EFF); } - void closure(short *nucleus, int n) { - int ruleno; + unsigned ruleno; unsigned word; unsigned i; - short *csp; + Value_t *csp; unsigned *dsp; unsigned *rsp; int rulesetsize; - short *csend; + Value_t *csend; unsigned *rsend; int symbol; - int itemno; + Value_t itemno; rulesetsize = WORDSIZE(nrules); rsend = ruleset + rulesetsize; @@ -193,9 +143,9 @@ closure(short *nucleus, int n) { for (i = 0; i < BITS_PER_WORD; ++i) { - if (word & (1 << i)) + if (word & (unsigned)(1 << i)) { - itemno = rrhs[ruleno+i]; + itemno = rrhs[ruleno + i]; while (csp < csend && *csp < itemno) *itemsetend++ = *csp++; *itemsetend++ = itemno; @@ -211,35 +161,31 @@ closure(short *nucleus, int n) *itemsetend++ = *csp++; #ifdef DEBUG - print_closure(n); + print_closure(n); #endif } - - void finalize_closure(void) { - free(itemset); - free(ruleset); - free(first_derives + ntokens * WORDSIZE(nrules)); + FREE(itemset); + FREE(ruleset); + FREE(first_derives + ntokens * WORDSIZE(nrules)); } - #ifdef DEBUG -static void +void print_closure(int n) { - short *isp; + short *isp; - printf("\n\nn = %d\n\n", n); - for (isp = itemset; isp < itemsetend; isp++) - printf(" %d\n", *isp); + printf("\n\nn = %d\n\n", n); + for (isp = itemset; isp < itemsetend; isp++) + printf(" %d\n", *isp); } - -static void +void print_EFF(void) { int i, j; @@ -270,14 +216,13 @@ print_EFF(void) } } - -static void +void print_first_derives(void) { int i; int j; unsigned *rp; - unsigned cword; + unsigned cword = 0; unsigned k; printf("\n\n\nFirst Derives\n"); @@ -288,19 +233,19 @@ print_first_derives(void) rp = first_derives + i * WORDSIZE(nrules); k = BITS_PER_WORD; for (j = 0; j <= nrules; k++, j++) - { - if (k >= BITS_PER_WORD) - { - cword = *rp++; - k = 0; - } + { + if (k >= BITS_PER_WORD) + { + cword = *rp++; + k = 0; + } - if (cword & (1 << k)) - printf(" %d\n", j); + if (cword & (1 << k)) + printf(" %d\n", j); } } - fflush(stdout); + fflush(stdout); } #endif diff --git a/contrib/byacc/config.guess b/contrib/byacc/config.guess new file mode 100755 index 00000000000..e4b69669fd2 --- /dev/null +++ b/contrib/byacc/config.guess @@ -0,0 +1,1511 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2911 Free Software Foundation, Inc. + +timestamp='2011-01-01' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null | \ + grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-tilera-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/contrib/byacc/config.sub b/contrib/byacc/config.sub new file mode 100755 index 00000000000..7c62c346acf --- /dev/null +++ b/contrib/byacc/config.sub @@ -0,0 +1,1760 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +# 2011 Free Software Foundation, Inc. + +timestamp='2011-04-01' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 \ + | ns16k | ns32k \ + | open8 \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + xscaleel) + basic_machine=armel-unknown + ;; + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile-* | tilegx-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next) + basic_machine=m68k-next + case $os in + -nextstep*) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) + basic_machine=power-ibm + ;; + ppc | ppcbe) + basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) + basic_machine=powerpc64-unknown + ;; + ppc64-*) + basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + # This must be matched before tile*. + tilegx*) + basic_machine=tilegx-unknown + os=-linux-gnu + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/contrib/byacc/config_h.in b/contrib/byacc/config_h.in new file mode 100644 index 00000000000..42af7671f7c --- /dev/null +++ b/contrib/byacc/config_h.in @@ -0,0 +1,3 @@ +/* @configure_input@ */ +/* $Id: config_h.in,v 1.1 1995/01/01 19:34:59 tom Exp $ */ +@DEFS@ diff --git a/contrib/byacc/configure b/contrib/byacc/configure new file mode 100755 index 00000000000..e4ecd942a0a --- /dev/null +++ b/contrib/byacc/configure @@ -0,0 +1,5973 @@ +#! /bin/sh +# From configure.in Revision: 1.10 . +# Guess values for system-dependent variables and create Makefiles. +# Generated by Autoconf 2.52.20101002. +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Name of the executable. +as_me=`echo "$0" |sed 's,.*[\\/],,'` + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +# NLS nuisances. +$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } +$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } +$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } +$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } +$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } +$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } +$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } +$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +cross_compiling=no +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +ac_unique_file="main.c" + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +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' + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +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 + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # 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_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$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 ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) 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 | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$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_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + 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 "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: should be removed in autoconf 3.0. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + +# 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 "$as_me: error: cannot find sources in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # 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 < if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +EOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue + cd $ac_subdir + # A "../" for each directory in /$ac_subdir. + ac_dots=`echo $ac_subdir | + sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'` + + case $srcdir in + .) # No --srcdir option. We are building in place. + ac_sub_srcdir=$srcdir ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_sub_srcdir=$srcdir/$ac_subdir ;; + *) # Relative path. + ac_sub_srcdir=$ac_dots$srcdir/$ac_subdir ;; + esac + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_sub_srcdir/configure.gnu; then + echo + $SHELL $ac_sub_srcdir/configure.gnu --help=recursive + elif test -f $ac_sub_srcdir/configure; then + echo + $SHELL $ac_sub_srcdir/configure --help=recursive + elif test -f $ac_sub_srcdir/configure.ac || + test -f $ac_sub_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\EOF + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +EOF + exit 0 +fi +exec 5>config.log +cat >&5 </dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +PATH = $PATH + +_ASUNAME +} >&5 + +cat >&5 <\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + ac_sep=" " ;; + *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg" + ac_sep=" " ;; + esac + # Get rid of the leading space. +done + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + echo >&5 + echo "## ----------------- ##" >&5 + echo "## Cache variables. ##" >&5 + echo "## ----------------- ##" >&5 + echo >&5 + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} >&5 + sed "/^$/d" confdefs.h >conftest.log + if test -s conftest.log; then + echo >&5 + echo "## ------------ ##" >&5 + echo "## confdefs.h. ##" >&5 + echo "## ------------ ##" >&5 + echo >&5 + cat conftest.log >&5 + fi + (echo; echo) >&5 + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" >&5 + echo "$as_me: exit $exit_status" >&5 + rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# 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 + +# Let the site file select an alternate cache file if it wants to. +# 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 "$as_me:845: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + cat "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:856: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:864: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:880: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:884: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:890: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:892: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:894: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. It doesn't matter if + # we pass some twice (in addition to the command line arguments). + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val" + ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:913: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:915: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return=return + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac +echo "#! $SHELL" >conftest.sh +echo "exit 0" >>conftest.sh +chmod +x conftest.sh +if { (echo "$as_me:936: PATH=\".;.\"; conftest.sh") >&5 + (PATH=".;."; conftest.sh) 2>&5 + ac_status=$? + echo "$as_me:939: \$? = $ac_status" >&5 + (exit $ac_status); }; then + ac_path_separator=';' +else + ac_path_separator=: +fi +PATH_SEPARATOR="$ac_path_separator" +rm -f conftest.sh + +ac_config_headers="$ac_config_headers config.h:config_h.in" + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:967: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:977: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:981: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:990: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:994: error: $ac_config_sub $ac_cv_build_alias failed." >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:999: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +echo "$as_me:1006: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:1015: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1020: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +if test -f $srcdir/config.guess || test -f $ac_aux_dir/config.guess ; then + echo "$as_me:1028: checking target system type" >&5 +echo $ECHO_N "checking target system type... $ECHO_C" >&6 +if test "${ac_cv_target+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_target_alias=$target_alias +test "x$ac_cv_target_alias" = "x" && + ac_cv_target_alias=$ac_cv_host_alias +ac_cv_target=`$ac_config_sub $ac_cv_target_alias` || + { { echo "$as_me:1037: error: $ac_config_sub $ac_cv_target_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1042: result: $ac_cv_target" >&5 +echo "${ECHO_T}$ac_cv_target" >&6 +target=$ac_cv_target +target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + system_name="$host_os" +else + system_name="`(uname -s -r) 2>/dev/null`" + if test -z "$system_name" ; then + system_name="`(hostname) 2>/dev/null`" + fi +fi +test -n "$system_name" && cat >>confdefs.h <&6 +else + cf_cv_system_name="$system_name" +fi + +test -z "$system_name" && system_name="$cf_cv_system_name" +test -n "$cf_cv_system_name" && echo "$as_me:1073: result: Configuring for $cf_cv_system_name" >&5 +echo "${ECHO_T}Configuring for $cf_cv_system_name" >&6 + +if test ".$system_name" != ".$cf_cv_system_name" ; then + echo "$as_me:1077: result: Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&5 +echo "${ECHO_T}Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&6 + { { echo "$as_me:1079: error: \"Please remove config.cache and try again.\"" >&5 +echo "$as_me: error: \"Please remove config.cache and try again.\"" >&2;} + { (exit 1); exit 1; }; } +fi + +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return=return +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:1106: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CC="${ac_tool_prefix}gcc" +echo "$as_me:1121: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1129: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1132: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:1141: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_CC="gcc" +echo "$as_me:1156: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:1164: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:1167: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:1180: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CC="${ac_tool_prefix}cc" +echo "$as_me:1195: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1203: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1206: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:1215: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_CC="cc" +echo "$as_me:1230: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:1238: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:1241: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +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 "$as_me:1254: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue +fi +ac_cv_prog_CC="cc" +echo "$as_me:1274: found $ac_dir/$ac_word" >&5 +break +done + +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 $# != 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" ${1+"$@"} + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1296: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1299: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:1310: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CC="$ac_tool_prefix$ac_prog" +echo "$as_me:1325: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1333: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1336: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:1349: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_CC="$ac_prog" +echo "$as_me:1364: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:1372: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:1375: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + +test -z "$CC" && { { echo "$as_me:1387: error: no acceptable cc found in \$PATH" >&5 +echo "$as_me: error: no acceptable cc found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:1392:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:1395: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:1398: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:1400: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:1403: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:1405: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:1408: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +#line 1412 "configure" +#include "confdefs.h" + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:1428: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:1431: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:1434: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. +for ac_file in `ls a.exe conftest.exe 2>/dev/null; + ls a.out conftest 2>/dev/null; + ls a.* conftest.* 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + a.out ) # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool --akim. + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +{ { echo "$as_me:1457: error: C compiler cannot create executables" >&5 +echo "$as_me: error: C compiler cannot create executables" >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:1463: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:1468: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:1474: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1477: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:1484: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:1492: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:1499: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:1501: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:1504: checking for executable suffix" >&5 +echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6 +if { (eval echo "$as_me:1506: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:1509: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:1525: error: cannot compute EXEEXT: cannot compile and link" >&5 +echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:1531: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:1537: checking for object suffix" >&5 +echo $ECHO_N "checking for object suffix... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 1543 "configure" +#include "confdefs.h" + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:1555: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1558: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.map | *.inf ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +{ { echo "$as_me:1570: error: cannot compute OBJEXT: cannot compile" >&5 +echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:1577: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:1581: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 1587 "configure" +#include "confdefs.h" + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:1602: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1605: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1608: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1611: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_compiler_gnu=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:1623: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:1629: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 1635 "configure" +#include "confdefs.h" + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:1647: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1650: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1653: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1656: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_prog_cc_g=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:1666: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&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 +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:1693: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1696: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1699: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1702: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +#line 1714 "configure" +#include "confdefs.h" +#include +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:1727: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1730: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1733: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1736: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +continue +fi +rm -f conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line 1746 "configure" +#include "confdefs.h" +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:1758: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1761: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1764: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1767: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +rm -rf conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return=return + +echo "$as_me:1795: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +#line 1803 "configure" +#include "confdefs.h" +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:1852: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1855: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1858: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1861: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:1878: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:1881: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +echo "$as_me:1886: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 1892 "configure" +#include "confdefs.h" + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + } +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:1950: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1953: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1956: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1959: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_c_const=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:1969: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6 +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\EOF +#define const +EOF + +fi + +echo "$as_me:1979: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:1999: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:2003: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:2020: checking for a BSD compatible install" >&5 +echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_IFS=$IFS; IFS=$ac_path_separator + for ac_dir in $PATH; do + IFS=$ac_save_IFS + # Account for people who put trailing slashes in PATH elements. + case $ac_dir/ in + / | ./ | .// | /cC/* \ + | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \ + | /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if $as_executable_p "$ac_dir/$ac_prog"; then + if test $ac_prog = install && + grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:2069: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:2080: checking if filesystem supports mixed-case filenames" >&5 +echo $ECHO_N "checking if filesystem supports mixed-case filenames... $ECHO_C" >&6 +if test "${cf_cv_mixedcase+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +if test "$cross_compiling" = yes ; then + case $target_alias in #(vi + *-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-mingw32*|*-uwin*) #(vi + cf_cv_mixedcase=no + ;; + *) + cf_cv_mixedcase=yes + ;; + esac +else + rm -f conftest CONFTEST + echo test >conftest + if test -f CONFTEST ; then + cf_cv_mixedcase=no + else + cf_cv_mixedcase=yes + fi + rm -f conftest CONFTEST +fi + +fi +echo "$as_me:2107: result: $cf_cv_mixedcase" >&5 +echo "${ECHO_T}$cf_cv_mixedcase" >&6 +test "$cf_cv_mixedcase" = yes && cat >>confdefs.h <<\EOF +#define MIXEDCASE_FILENAMES 1 +EOF + +for ac_prog in exctags ctags +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:2117: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CTAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CTAGS"; then + ac_cv_prog_CTAGS="$CTAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CTAGS="$ac_prog" +echo "$as_me:2132: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CTAGS=$ac_cv_prog_CTAGS +if test -n "$CTAGS"; then + echo "$as_me:2140: result: $CTAGS" >&5 +echo "${ECHO_T}$CTAGS" >&6 +else + echo "$as_me:2143: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CTAGS" && break +done + +for ac_prog in exetags etags +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:2154: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ETAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ETAGS"; then + ac_cv_prog_ETAGS="$ETAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ETAGS="$ac_prog" +echo "$as_me:2169: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ETAGS=$ac_cv_prog_ETAGS +if test -n "$ETAGS"; then + echo "$as_me:2177: result: $ETAGS" >&5 +echo "${ECHO_T}$ETAGS" >&6 +else + echo "$as_me:2180: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ETAGS" && break +done + +# Extract the first word of "${CTAGS:-ctags}", so it can be a program name with args. +set dummy ${CTAGS:-ctags}; ac_word=$2 +echo "$as_me:2189: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_MAKE_LOWER_TAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$MAKE_LOWER_TAGS"; then + ac_cv_prog_MAKE_LOWER_TAGS="$MAKE_LOWER_TAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_MAKE_LOWER_TAGS="yes" +echo "$as_me:2204: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_MAKE_LOWER_TAGS" && ac_cv_prog_MAKE_LOWER_TAGS="no" +fi +fi +MAKE_LOWER_TAGS=$ac_cv_prog_MAKE_LOWER_TAGS +if test -n "$MAKE_LOWER_TAGS"; then + echo "$as_me:2213: result: $MAKE_LOWER_TAGS" >&5 +echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6 +else + echo "$as_me:2216: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test "$cf_cv_mixedcase" = yes ; then + # Extract the first word of "${ETAGS:-etags}", so it can be a program name with args. +set dummy ${ETAGS:-etags}; ac_word=$2 +echo "$as_me:2223: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_MAKE_UPPER_TAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$MAKE_UPPER_TAGS"; then + ac_cv_prog_MAKE_UPPER_TAGS="$MAKE_UPPER_TAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_MAKE_UPPER_TAGS="yes" +echo "$as_me:2238: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_MAKE_UPPER_TAGS" && ac_cv_prog_MAKE_UPPER_TAGS="no" +fi +fi +MAKE_UPPER_TAGS=$ac_cv_prog_MAKE_UPPER_TAGS +if test -n "$MAKE_UPPER_TAGS"; then + echo "$as_me:2247: result: $MAKE_UPPER_TAGS" >&5 +echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6 +else + echo "$as_me:2250: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +else + MAKE_UPPER_TAGS=no +fi + +if test "$MAKE_UPPER_TAGS" = yes ; then + MAKE_UPPER_TAGS= +else + MAKE_UPPER_TAGS="#" +fi + +if test "$MAKE_LOWER_TAGS" = yes ; then + MAKE_LOWER_TAGS= +else + MAKE_LOWER_TAGS="#" +fi + +for ac_prog in tdlint lint alint splint lclint +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:2274: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LINT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LINT"; then + ac_cv_prog_LINT="$LINT" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_LINT="$ac_prog" +echo "$as_me:2289: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +LINT=$ac_cv_prog_LINT +if test -n "$LINT"; then + echo "$as_me:2297: result: $LINT" >&5 +echo "${ECHO_T}$LINT" >&6 +else + echo "$as_me:2300: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LINT" && break +done + +# This should have been defined by AC_PROG_CC +: ${CC:=cc} + +# Check for user's environment-breakage by stuffing CFLAGS/CPPFLAGS content +# into CC. This will not help with broken scripts that wrap the compiler with +# options, but eliminates a more common category of user confusion. +echo "$as_me:2313: checking \$CC variable" >&5 +echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6 +case "$CC" in #(vi +*[\ \ ]-[IUD]*) + echo "$as_me:2317: result: broken" >&5 +echo "${ECHO_T}broken" >&6 + { echo "$as_me:2319: WARNING: your environment misuses the CC variable to hold CFLAGS/CPPFLAGS options" >&5 +echo "$as_me: WARNING: your environment misuses the CC variable to hold CFLAGS/CPPFLAGS options" >&2;} + # humor him... + cf_flags=`echo "$CC" | sed -e 's/^[^ ]*[ ]//'` + CC=`echo "$CC" | sed -e 's/[ ].*//'` + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_flags +do +case $cf_fix_cppflags in +no) + case $cf_add_cflags in #(vi + -undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi + case $cf_add_cflags in + -D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + fi + ;; + esac + case "$CPPFLAGS" in + *$cf_add_cflags) #(vi + ;; + *) #(vi + case $cf_add_cflags in #(vi + -D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + cf_new_cppflags="$cf_new_cppflags $cf_add_cflags" + ;; + esac + ;; + *) + cf_new_cflags="$cf_new_cflags $cf_add_cflags" + ;; + esac + ;; +yes) + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + CFLAGS="$CFLAGS $cf_new_cflags" +fi + +if test -n "$cf_new_cppflags" ; then + + CPPFLAGS="$CPPFLAGS $cf_new_cppflags" +fi + +if test -n "$cf_new_extra_cppflags" ; then + + EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS" +fi + + ;; +*) + echo "$as_me:2405: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + ;; +esac + +echo "$as_me:2410: checking for ${CC:-cc} option to accept ANSI C" >&5 +echo $ECHO_N "checking for ${CC:-cc} option to accept ANSI C... $ECHO_C" >&6 +if test "${cf_cv_ansi_cc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_ansi_cc=no +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX -Aa -D_HPUX_SOURCE +# SVR4 -Xc +# UnixWare 1.2 (cannot use -Xc, since ANSI/POSIX clashes) +for cf_arg in "-DCC_HAS_PROTOS" \ + "" \ + -qlanglvl=ansi \ + -std1 \ + -Ae \ + "-Aa -D_HPUX_SOURCE" \ + -Xc +do + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_arg +do +case $cf_fix_cppflags in +no) + case $cf_add_cflags in #(vi + -undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi + case $cf_add_cflags in + -D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + fi + ;; + esac + case "$CPPFLAGS" in + *$cf_add_cflags) #(vi + ;; + *) #(vi + case $cf_add_cflags in #(vi + -D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + cf_new_cppflags="$cf_new_cppflags $cf_add_cflags" + ;; + esac + ;; + *) + cf_new_cflags="$cf_new_cflags $cf_add_cflags" + ;; + esac + ;; +yes) + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + CFLAGS="$CFLAGS $cf_new_cflags" +fi + +if test -n "$cf_new_cppflags" ; then + + CPPFLAGS="$CPPFLAGS $cf_new_cppflags" +fi + +if test -n "$cf_new_extra_cppflags" ; then + + EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS" +fi + + cat >conftest.$ac_ext <<_ACEOF +#line 2514 "configure" +#include "confdefs.h" + +#ifndef CC_HAS_PROTOS +#if !defined(__STDC__) || (__STDC__ != 1) +choke me +#endif +#endif + +int +main () +{ + + int test (int i, double x); + struct s1 {int (*f) (int a);}; + struct s2 {int (*f) (double a);}; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:2535: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2538: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:2541: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2544: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_ansi_cc="$cf_arg"; break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +CFLAGS="$cf_save_CFLAGS" +CPPFLAGS="$cf_save_CPPFLAGS" + +fi +echo "$as_me:2557: result: $cf_cv_ansi_cc" >&5 +echo "${ECHO_T}$cf_cv_ansi_cc" >&6 + +if test "$cf_cv_ansi_cc" != "no"; then +if test ".$cf_cv_ansi_cc" != ".-DCC_HAS_PROTOS"; then + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_cv_ansi_cc +do +case $cf_fix_cppflags in +no) + case $cf_add_cflags in #(vi + -undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi + case $cf_add_cflags in + -D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + fi + ;; + esac + case "$CPPFLAGS" in + *$cf_add_cflags) #(vi + ;; + *) #(vi + case $cf_add_cflags in #(vi + -D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + cf_new_cppflags="$cf_new_cppflags $cf_add_cflags" + ;; + esac + ;; + *) + cf_new_cflags="$cf_new_cflags $cf_add_cflags" + ;; + esac + ;; +yes) + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + CFLAGS="$CFLAGS $cf_new_cflags" +fi + +if test -n "$cf_new_cppflags" ; then + + CPPFLAGS="$CPPFLAGS $cf_new_cppflags" +fi + +if test -n "$cf_new_extra_cppflags" ; then + + EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS" +fi + +else + cat >>confdefs.h <<\EOF +#define CC_HAS_PROTOS 1 +EOF + +fi +fi + +if test "$cf_cv_ansi_cc" = "no"; then + { { echo "$as_me:2650: error: Your compiler does not appear to recognize prototypes. +You have the following choices: + a. adjust your compiler options + b. get an up-to-date compiler + c. use a wrapper such as unproto" >&5 +echo "$as_me: error: Your compiler does not appear to recognize prototypes. +You have the following choices: + a. adjust your compiler options + b. get an up-to-date compiler + c. use a wrapper such as unproto" >&2;} + { (exit 1); exit 1; }; } +fi + +cf_XOPEN_SOURCE=500 +cf_POSIX_C_SOURCE=199506L +cf_xopen_source= + +case $host_os in #(vi +aix[4-7]*) #(vi + cf_xopen_source="-D_ALL_SOURCE" + ;; +cygwin) #(vi + cf_XOPEN_SOURCE=600 + ;; +darwin[0-8].*) #(vi + cf_xopen_source="-D_APPLE_C_SOURCE" + ;; +darwin*) #(vi + cf_xopen_source="-D_DARWIN_C_SOURCE" + cf_XOPEN_SOURCE= + ;; +freebsd*|dragonfly*) #(vi + # 5.x headers associate + # _XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L + # _XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L + cf_POSIX_C_SOURCE=200112L + cf_XOPEN_SOURCE=600 + cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + ;; +hpux11*) #(vi + cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500" + ;; +hpux*) #(vi + cf_xopen_source="-D_HPUX_SOURCE" + ;; +irix[56].*) #(vi + cf_xopen_source="-D_SGI_SOURCE" + cf_XOPEN_SOURCE= + ;; +linux*|gnu*|mint*|k*bsd*-gnu) #(vi + +echo "$as_me:2701: checking if we must define _GNU_SOURCE" >&5 +echo $ECHO_N "checking if we must define _GNU_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_gnu_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 2708 "configure" +#include "confdefs.h" +#include +int +main () +{ + +#ifndef _XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:2723: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2726: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:2729: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2732: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_gnu_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_save="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" + cat >conftest.$ac_ext <<_ACEOF +#line 2741 "configure" +#include "confdefs.h" +#include +int +main () +{ + +#ifdef _XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:2756: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2759: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:2762: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2765: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_gnu_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_gnu_source=yes +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$cf_save" + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:2780: result: $cf_cv_gnu_source" >&5 +echo "${ECHO_T}$cf_cv_gnu_source" >&6 +test "$cf_cv_gnu_source" = yes && CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" + + ;; +mirbsd*) #(vi + # setting _XOPEN_SOURCE or _POSIX_SOURCE breaks and other headers which use u_int / u_short types + cf_XOPEN_SOURCE= + +cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +echo "$as_me:2802: checking if we should define _POSIX_C_SOURCE" >&5 +echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_posix_c_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +echo "${as_me:-configure}:2808: testing if the symbol is already defined go no further ..." 1>&5 + + cat >conftest.$ac_ext <<_ACEOF +#line 2811 "configure" +#include "confdefs.h" +#include +int +main () +{ + +#ifndef _POSIX_C_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:2826: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2829: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:2832: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2835: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_posix_c_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in #(vi + .[12]??*) #(vi + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + .2) #(vi + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + .*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + cat >conftest.$ac_ext <<_ACEOF +#line 2856 "configure" +#include "confdefs.h" +#include +int +main () +{ + +#ifdef _POSIX_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:2871: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2874: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:2877: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2880: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE" +fi +rm -f conftest.$ac_objext conftest.$ac_ext + fi + +echo "${as_me:-configure}:2891: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5 + + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS $cf_cv_posix_c_source" + +echo "${as_me:-configure}:2896: testing if the second compile does not leave our definition intact error ..." 1>&5 + + cat >conftest.$ac_ext <<_ACEOF +#line 2899 "configure" +#include "confdefs.h" +#include +int +main () +{ + +#ifndef _POSIX_C_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:2914: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2917: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:2920: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2923: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_posix_c_source=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:2939: result: $cf_cv_posix_c_source" >&5 +echo "${ECHO_T}$cf_cv_posix_c_source" >&6 + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_cv_posix_c_source +do +case $cf_fix_cppflags in +no) + case $cf_add_cflags in #(vi + -undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi + case $cf_add_cflags in + -D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + fi + ;; + esac + case "$CPPFLAGS" in + *$cf_add_cflags) #(vi + ;; + *) #(vi + case $cf_add_cflags in #(vi + -D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + cf_new_cppflags="$cf_new_cppflags $cf_add_cflags" + ;; + esac + ;; + *) + cf_new_cflags="$cf_new_cflags $cf_add_cflags" + ;; + esac + ;; +yes) + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + CFLAGS="$CFLAGS $cf_new_cflags" +fi + +if test -n "$cf_new_cppflags" ; then + + CPPFLAGS="$CPPFLAGS $cf_new_cppflags" +fi + +if test -n "$cf_new_extra_cppflags" ; then + + EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS" +fi + +fi + + ;; +netbsd*) #(vi + cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw + ;; +openbsd[4-9]*) #(vi + # setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=600 + ;; +openbsd*) #(vi + # setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw + ;; +osf[45]*) #(vi + cf_xopen_source="-D_OSF_SOURCE" + ;; +nto-qnx*) #(vi + cf_xopen_source="-D_QNX_SOURCE" + ;; +sco*) #(vi + # setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer + ;; +solaris2.*) #(vi + cf_xopen_source="-D__EXTENSIONS__" + ;; +*) + +echo "$as_me:3052: checking if we should define _XOPEN_SOURCE" >&5 +echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_xopen_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 3059 "configure" +#include "confdefs.h" + +#include +#include +#include + +int +main () +{ + +#ifndef _XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3078: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3081: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3084: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3087: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_save="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + cat >conftest.$ac_ext <<_ACEOF +#line 3096 "configure" +#include "confdefs.h" + +#include +#include +#include + +int +main () +{ + +#ifdef _XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3115: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3118: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3121: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3124: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_xopen_source=$cf_XOPEN_SOURCE +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$cf_save" + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:3139: result: $cf_cv_xopen_source" >&5 +echo "${ECHO_T}$cf_cv_xopen_source" >&6 + +if test "$cf_cv_xopen_source" != no ; then + +CFLAGS=`echo "$CFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_temp_xopen_source +do +case $cf_fix_cppflags in +no) + case $cf_add_cflags in #(vi + -undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi + case $cf_add_cflags in + -D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + fi + ;; + esac + case "$CPPFLAGS" in + *$cf_add_cflags) #(vi + ;; + *) #(vi + case $cf_add_cflags in #(vi + -D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + cf_new_cppflags="$cf_new_cppflags $cf_add_cflags" + ;; + esac + ;; + *) + cf_new_cflags="$cf_new_cflags $cf_add_cflags" + ;; + esac + ;; +yes) + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + CFLAGS="$CFLAGS $cf_new_cflags" +fi + +if test -n "$cf_new_cppflags" ; then + + CPPFLAGS="$CPPFLAGS $cf_new_cppflags" +fi + +if test -n "$cf_new_extra_cppflags" ; then + + EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS" +fi + +fi + +cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +echo "$as_me:3247: checking if we should define _POSIX_C_SOURCE" >&5 +echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_posix_c_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +echo "${as_me:-configure}:3253: testing if the symbol is already defined go no further ..." 1>&5 + + cat >conftest.$ac_ext <<_ACEOF +#line 3256 "configure" +#include "confdefs.h" +#include +int +main () +{ + +#ifndef _POSIX_C_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3271: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3274: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3277: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3280: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_posix_c_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in #(vi + .[12]??*) #(vi + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + .2) #(vi + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + .*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + cat >conftest.$ac_ext <<_ACEOF +#line 3301 "configure" +#include "confdefs.h" +#include +int +main () +{ + +#ifdef _POSIX_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3316: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3319: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3322: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3325: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE" +fi +rm -f conftest.$ac_objext conftest.$ac_ext + fi + +echo "${as_me:-configure}:3336: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5 + + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS $cf_cv_posix_c_source" + +echo "${as_me:-configure}:3341: testing if the second compile does not leave our definition intact error ..." 1>&5 + + cat >conftest.$ac_ext <<_ACEOF +#line 3344 "configure" +#include "confdefs.h" +#include +int +main () +{ + +#ifndef _POSIX_C_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3359: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3362: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3365: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3368: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_posix_c_source=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:3384: result: $cf_cv_posix_c_source" >&5 +echo "${ECHO_T}$cf_cv_posix_c_source" >&6 + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_cv_posix_c_source +do +case $cf_fix_cppflags in +no) + case $cf_add_cflags in #(vi + -undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi + case $cf_add_cflags in + -D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + fi + ;; + esac + case "$CPPFLAGS" in + *$cf_add_cflags) #(vi + ;; + *) #(vi + case $cf_add_cflags in #(vi + -D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + cf_new_cppflags="$cf_new_cppflags $cf_add_cflags" + ;; + esac + ;; + *) + cf_new_cflags="$cf_new_cflags $cf_add_cflags" + ;; + esac + ;; +yes) + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + CFLAGS="$CFLAGS $cf_new_cflags" +fi + +if test -n "$cf_new_cppflags" ; then + + CPPFLAGS="$CPPFLAGS $cf_new_cppflags" +fi + +if test -n "$cf_new_extra_cppflags" ; then + + EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS" +fi + +fi + + ;; +esac + +if test -n "$cf_xopen_source" ; then + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_xopen_source +do +case $cf_fix_cppflags in +no) + case $cf_add_cflags in #(vi + -undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi + case $cf_add_cflags in + -D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + fi + ;; + esac + case "$CPPFLAGS" in + *$cf_add_cflags) #(vi + ;; + *) #(vi + case $cf_add_cflags in #(vi + -D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + cf_new_cppflags="$cf_new_cppflags $cf_add_cflags" + ;; + esac + ;; + *) + cf_new_cflags="$cf_new_cflags $cf_add_cflags" + ;; + esac + ;; +yes) + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + CFLAGS="$CFLAGS $cf_new_cflags" +fi + +if test -n "$cf_new_cppflags" ; then + + CPPFLAGS="$CPPFLAGS $cf_new_cppflags" +fi + +if test -n "$cf_new_extra_cppflags" ; then + + EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS" +fi + +fi + +if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then + echo "$as_me:3557: checking if _XOPEN_SOURCE really is set" >&5 +echo $ECHO_N "checking if _XOPEN_SOURCE really is set... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +#line 3560 "configure" +#include "confdefs.h" +#include +int +main () +{ + +#ifndef _XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3575: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3578: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3581: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3584: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_XOPEN_SOURCE_set=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_XOPEN_SOURCE_set=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + echo "$as_me:3593: result: $cf_XOPEN_SOURCE_set" >&5 +echo "${ECHO_T}$cf_XOPEN_SOURCE_set" >&6 + if test $cf_XOPEN_SOURCE_set = yes + then + cat >conftest.$ac_ext <<_ACEOF +#line 3598 "configure" +#include "confdefs.h" +#include +int +main () +{ + +#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3613: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3616: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3619: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3622: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_XOPEN_SOURCE_set_ok=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_XOPEN_SOURCE_set_ok=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + if test $cf_XOPEN_SOURCE_set_ok = no + then + { echo "$as_me:3633: WARNING: _XOPEN_SOURCE is lower than requested" >&5 +echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;} + fi + else + +echo "$as_me:3638: checking if we should define _XOPEN_SOURCE" >&5 +echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_xopen_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 3645 "configure" +#include "confdefs.h" + +#include +#include +#include + +int +main () +{ + +#ifndef _XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3664: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3667: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3670: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3673: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_save="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + cat >conftest.$ac_ext <<_ACEOF +#line 3682 "configure" +#include "confdefs.h" + +#include +#include +#include + +int +main () +{ + +#ifdef _XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3701: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3704: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3707: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3710: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_xopen_source=$cf_XOPEN_SOURCE +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$cf_save" + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:3725: result: $cf_cv_xopen_source" >&5 +echo "${ECHO_T}$cf_cv_xopen_source" >&6 + +if test "$cf_cv_xopen_source" != no ; then + +CFLAGS=`echo "$CFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_temp_xopen_source +do +case $cf_fix_cppflags in +no) + case $cf_add_cflags in #(vi + -undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi + case $cf_add_cflags in + -D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + fi + ;; + esac + case "$CPPFLAGS" in + *$cf_add_cflags) #(vi + ;; + *) #(vi + case $cf_add_cflags in #(vi + -D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + cf_new_cppflags="$cf_new_cppflags $cf_add_cflags" + ;; + esac + ;; + *) + cf_new_cflags="$cf_new_cflags $cf_add_cflags" + ;; + esac + ;; +yes) + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + CFLAGS="$CFLAGS $cf_new_cflags" +fi + +if test -n "$cf_new_cppflags" ; then + + CPPFLAGS="$CPPFLAGS $cf_new_cppflags" +fi + +if test -n "$cf_new_extra_cppflags" ; then + + EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS" +fi + +fi + + fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return=return +echo "$as_me:3829: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +#line 3850 "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:3855: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:3861: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line 3884 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:3888: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:3894: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:3931: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +#line 3941 "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:3946: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:3952: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line 3975 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:3979: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:3985: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:4013: error: C preprocessor \"$CPP\" fails sanity check" >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return=return + +for ac_header in fcntl.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:4028: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 4034 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:4038: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:4044: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:4063: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 4082 "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +char (*f) (); + +int +main () +{ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +f = $ac_func; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:4113: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:4116: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:4119: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4122: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:4132: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for working mkstemp... $ECHO_C" >&6 +if test "${cf_cv_func_mkstemp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +rm -rf conftest* +if test "$cross_compiling" = yes; then + echo "$as_me:4150: checking for mkstemp" >&5 +echo $ECHO_N "checking for mkstemp... $ECHO_C" >&6 +if test "${ac_cv_func_mkstemp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 4156 "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char mkstemp (); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char mkstemp (); +char (*f) (); + +int +main () +{ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_mkstemp) || defined (__stub___mkstemp) +choke me +#else +f = mkstemp; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:4187: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:4190: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:4193: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4196: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_mkstemp=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_mkstemp=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:4206: result: $ac_cv_func_mkstemp" >&5 +echo "${ECHO_T}$ac_cv_func_mkstemp" >&6 + +else + cat >conftest.$ac_ext <<_ACEOF +#line 4211 "configure" +#include "confdefs.h" + +#include +#include +#include +#include +#include +int main() +{ + char *tmpl = "conftestXXXXXX"; + char name[2][80]; + int n; + int result = 0; + int fd; + struct stat sb; + + umask(077); + for (n = 0; n < 2; ++n) { + strcpy(name[n], tmpl); + if ((fd = mkstemp(name[n])) >= 0) { + if (!strcmp(name[n], tmpl) + || stat(name[n], &sb) != 0 + || (sb.st_mode & S_IFMT) != S_IFREG + || (sb.st_mode & 077) != 0) { + result = 1; + } + close(fd); + } + } + if (result == 0 + && !strcmp(name[0], name[1])) + result = 1; + ${cf_cv_main_return:-return}(result); +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:4249: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:4252: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:4254: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4257: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_func_mkstemp=yes + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_func_mkstemp=no + +fi +rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + +fi +echo "$as_me:4272: result: $cf_cv_func_mkstemp" >&5 +echo "${ECHO_T}$cf_cv_func_mkstemp" >&6 +if test "x$cf_cv_func_mkstemp" = xyes || test "x$ac_cv_func_mkstemp" = xyes ; then + cat >>confdefs.h <<\EOF +#define HAVE_MKSTEMP 1 +EOF + +fi + +GCC_VERSION=none +if test "$GCC" = yes ; then + echo "$as_me:4283: checking version of $CC" >&5 +echo $ECHO_N "checking version of $CC... $ECHO_C" >&6 + GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`" + test -z "$GCC_VERSION" && GCC_VERSION=unknown + echo "$as_me:4287: result: $GCC_VERSION" >&5 +echo "${ECHO_T}$GCC_VERSION" >&6 +fi + +if ( test "$GCC" = yes || test "$GXX" = yes ) +then +echo "$as_me:4293: checking if you want to check for gcc warnings" >&5 +echo $ECHO_N "checking if you want to check for gcc warnings... $ECHO_C" >&6 + +# Check whether --with-warnings or --without-warnings was given. +if test "${with_warnings+set}" = set; then + withval="$with_warnings" + cf_opt_with_warnings=$withval +else + cf_opt_with_warnings=no +fi; +echo "$as_me:4303: result: $cf_opt_with_warnings" >&5 +echo "${ECHO_T}$cf_opt_with_warnings" >&6 +if test "$cf_opt_with_warnings" != no ; then + +if test "$GCC" = yes +then +cat > conftest.i <&5 +echo "$as_me: checking for $CC __attribute__ directives..." >&6;} +cat > conftest.$ac_ext <&5 + + case $cf_attribute in #(vi + printf) #(vi + cf_printf_attribute=yes + cat >conftest.h <conftest.h <conftest.h <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4380: \$? = $ac_status" >&5 + (exit $ac_status); }; then + test -n "$verbose" && echo "$as_me:4382: result: ... $cf_attribute" >&5 +echo "${ECHO_T}... $cf_attribute" >&6 + cat conftest.h >>confdefs.h + case $cf_attribute in #(vi + printf) #(vi + if test "$cf_printf_attribute" = no ; then + cat >>confdefs.h <>confdefs.h <>confdefs.h <>confdefs.h <>confdefs.h +fi +rm -rf conftest* +fi + +INTEL_COMPILER=no + +if test "$GCC" = yes ; then + case $host_os in + linux*|gnu*) + echo "$as_me:4422: checking if this is really Intel C compiler" >&5 +echo $ECHO_N "checking if this is really Intel C compiler... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -no-gcc" + cat >conftest.$ac_ext <<_ACEOF +#line 4427 "configure" +#include "confdefs.h" + +int +main () +{ + +#ifdef __INTEL_COMPILER +#else +make an error +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:4444: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4447: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:4450: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4453: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + INTEL_COMPILER=yes +cf_save_CFLAGS="$cf_save_CFLAGS -we147 -no-gcc" + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$cf_save_CFLAGS" + echo "$as_me:4464: result: $INTEL_COMPILER" >&5 +echo "${ECHO_T}$INTEL_COMPILER" >&6 + ;; + esac +fi + +cat > conftest.$ac_ext <&5 +echo "$as_me: checking for $CC warning options..." >&6;} + cf_save_CFLAGS="$CFLAGS" + EXTRA_CFLAGS="-Wall" + for cf_opt in \ + wd1419 \ + wd1683 \ + wd1684 \ + wd193 \ + wd593 \ + wd279 \ + wd810 \ + wd869 \ + wd981 + do + CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt" + if { (eval echo "$as_me:4504: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4507: \$? = $ac_status" >&5 + (exit $ac_status); }; then + test -n "$verbose" && echo "$as_me:4509: result: ... -$cf_opt" >&5 +echo "${ECHO_T}... -$cf_opt" >&6 + EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt" + fi + done + CFLAGS="$cf_save_CFLAGS" + +elif test "$GCC" = yes +then + { echo "$as_me:4518: checking for $CC warning options..." >&5 +echo "$as_me: checking for $CC warning options..." >&6;} + cf_save_CFLAGS="$CFLAGS" + EXTRA_CFLAGS= + cf_warn_CONST="" + test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings" + for cf_opt in W Wall \ + Wbad-function-cast \ + Wcast-align \ + Wcast-qual \ + Winline \ + Wmissing-declarations \ + Wmissing-prototypes \ + Wnested-externs \ + Wpointer-arith \ + Wshadow \ + Wstrict-prototypes \ + Wundef $cf_warn_CONST Wwrite-strings + do + CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt" + if { (eval echo "$as_me:4538: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4541: \$? = $ac_status" >&5 + (exit $ac_status); }; then + test -n "$verbose" && echo "$as_me:4543: result: ... -$cf_opt" >&5 +echo "${ECHO_T}... -$cf_opt" >&6 + case $cf_opt in #(vi + Wcast-qual) #(vi + CPPFLAGS="$CPPFLAGS -DXTSTRINGDEFINES" + ;; + Winline) #(vi + case $GCC_VERSION in + [34].*) + test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6 + +echo "${as_me:-configure}:4554: testing feature is broken in gcc $GCC_VERSION ..." 1>&5 + + continue;; + esac + ;; + esac + EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt" + fi + done + CFLAGS="$cf_save_CFLAGS" +fi +rm -rf conftest* + +fi +fi + +echo "$as_me:4570: checking if you want to see long compiling messages" >&5 +echo $ECHO_N "checking if you want to see long compiling messages... $ECHO_C" >&6 + +# Check whether --enable-echo or --disable-echo was given. +if test "${enable_echo+set}" = set; then + enableval="$enable_echo" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + + ECHO_LT='--silent' + ECHO_LD='@echo linking $@;' + RULE_CC='@echo compiling $<' + SHOW_CC='@echo compiling $@' + ECHO_CC='@' + + else + + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' + + fi +else + enableval=yes + + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' + +fi; +echo "$as_me:4604: result: $enableval" >&5 +echo "${ECHO_T}$enableval" >&6 + +case $cf_cv_system_name in +os2*) + CFLAGS="$CFLAGS -Zmt" + CPPFLAGS="$CPPFLAGS -D__ST_MT_ERRNO__" + CXXFLAGS="$CXXFLAGS -Zmt" + # autoconf's macro sets -Zexe and suffix both, which conflict:w + LDFLAGS="$LDFLAGS -Zmt -Zcrtdll" + ac_cv_exeext=.exe + ;; +esac + +PROG_EXT="$EXEEXT" + +test -n "$PROG_EXT" && cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to use dmalloc for testing... $ECHO_C" >&6 + +# Check whether --with-dmalloc or --without-dmalloc was given. +if test "${with_dmalloc+set}" = set; then + withval="$with_dmalloc" + cat >>confdefs.h <<\EOF +#define USE_DMALLOC 1 +EOF + + : ${with_cflags:=-g} + : ${with_no_leaks:=yes} + with_dmalloc=yes +else + with_dmalloc= +fi; +echo "$as_me:4640: result: ${with_dmalloc:-no}" >&5 +echo "${ECHO_T}${with_dmalloc:-no}" >&6 + +case .$with_cflags in #(vi +.*-g*) + case .$CFLAGS in #(vi + .*-g*) #(vi + ;; + *) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -g +do +case $cf_fix_cppflags in +no) + case $cf_add_cflags in #(vi + -undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi + case $cf_add_cflags in + -D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + fi + ;; + esac + case "$CPPFLAGS" in + *$cf_add_cflags) #(vi + ;; + *) #(vi + case $cf_add_cflags in #(vi + -D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + cf_new_cppflags="$cf_new_cppflags $cf_add_cflags" + ;; + esac + ;; + *) + cf_new_cflags="$cf_new_cflags $cf_add_cflags" + ;; + esac + ;; +yes) + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + CFLAGS="$CFLAGS $cf_new_cflags" +fi + +if test -n "$cf_new_cppflags" ; then + + CPPFLAGS="$CPPFLAGS $cf_new_cppflags" +fi + +if test -n "$cf_new_extra_cppflags" ; then + + EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS" +fi + + ;; + esac + ;; +esac + +if test "$with_dmalloc" = yes ; then + echo "$as_me:4734: checking for dmalloc.h" >&5 +echo $ECHO_N "checking for dmalloc.h... $ECHO_C" >&6 +if test "${ac_cv_header_dmalloc_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 4740 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:4744: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:4750: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_dmalloc_h=yes +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_header_dmalloc_h=no +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:4769: result: $ac_cv_header_dmalloc_h" >&5 +echo "${ECHO_T}$ac_cv_header_dmalloc_h" >&6 +if test $ac_cv_header_dmalloc_h = yes; then + +echo "$as_me:4773: checking for dmalloc_debug in -ldmalloc" >&5 +echo $ECHO_N "checking for dmalloc_debug in -ldmalloc... $ECHO_C" >&6 +if test "${ac_cv_lib_dmalloc_dmalloc_debug+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldmalloc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 4781 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dmalloc_debug (); +int +main () +{ +dmalloc_debug (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:4800: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:4803: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:4806: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4809: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dmalloc_dmalloc_debug=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_dmalloc_dmalloc_debug=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:4820: result: $ac_cv_lib_dmalloc_dmalloc_debug" >&5 +echo "${ECHO_T}$ac_cv_lib_dmalloc_dmalloc_debug" >&6 +if test $ac_cv_lib_dmalloc_dmalloc_debug = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to use dbmalloc for testing... $ECHO_C" >&6 + +# Check whether --with-dbmalloc or --without-dbmalloc was given. +if test "${with_dbmalloc+set}" = set; then + withval="$with_dbmalloc" + cat >>confdefs.h <<\EOF +#define USE_DBMALLOC 1 +EOF + + : ${with_cflags:=-g} + : ${with_no_leaks:=yes} + with_dbmalloc=yes +else + with_dbmalloc= +fi; +echo "$as_me:4851: result: ${with_dbmalloc:-no}" >&5 +echo "${ECHO_T}${with_dbmalloc:-no}" >&6 + +case .$with_cflags in #(vi +.*-g*) + case .$CFLAGS in #(vi + .*-g*) #(vi + ;; + *) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -g +do +case $cf_fix_cppflags in +no) + case $cf_add_cflags in #(vi + -undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi + case $cf_add_cflags in + -D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + fi + ;; + esac + case "$CPPFLAGS" in + *$cf_add_cflags) #(vi + ;; + *) #(vi + case $cf_add_cflags in #(vi + -D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + cf_new_cppflags="$cf_new_cppflags $cf_add_cflags" + ;; + esac + ;; + *) + cf_new_cflags="$cf_new_cflags $cf_add_cflags" + ;; + esac + ;; +yes) + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + CFLAGS="$CFLAGS $cf_new_cflags" +fi + +if test -n "$cf_new_cppflags" ; then + + CPPFLAGS="$CPPFLAGS $cf_new_cppflags" +fi + +if test -n "$cf_new_extra_cppflags" ; then + + EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS" +fi + + ;; + esac + ;; +esac + +if test "$with_dbmalloc" = yes ; then + echo "$as_me:4945: checking for dbmalloc.h" >&5 +echo $ECHO_N "checking for dbmalloc.h... $ECHO_C" >&6 +if test "${ac_cv_header_dbmalloc_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 4951 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:4955: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:4961: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_dbmalloc_h=yes +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_header_dbmalloc_h=no +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:4980: result: $ac_cv_header_dbmalloc_h" >&5 +echo "${ECHO_T}$ac_cv_header_dbmalloc_h" >&6 +if test $ac_cv_header_dbmalloc_h = yes; then + +echo "$as_me:4984: checking for debug_malloc in -ldbmalloc" >&5 +echo $ECHO_N "checking for debug_malloc in -ldbmalloc... $ECHO_C" >&6 +if test "${ac_cv_lib_dbmalloc_debug_malloc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldbmalloc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 4992 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char debug_malloc (); +int +main () +{ +debug_malloc (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:5011: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:5014: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:5017: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5020: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dbmalloc_debug_malloc=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_dbmalloc_debug_malloc=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:5031: result: $ac_cv_lib_dbmalloc_debug_malloc" >&5 +echo "${ECHO_T}$ac_cv_lib_dbmalloc_debug_malloc" >&6 +if test $ac_cv_lib_dbmalloc_debug_malloc = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to use valgrind for testing... $ECHO_C" >&6 + +# Check whether --with-valgrind or --without-valgrind was given. +if test "${with_valgrind+set}" = set; then + withval="$with_valgrind" + cat >>confdefs.h <<\EOF +#define USE_VALGRIND 1 +EOF + + : ${with_cflags:=-g} + : ${with_no_leaks:=yes} + with_valgrind=yes +else + with_valgrind= +fi; +echo "$as_me:5062: result: ${with_valgrind:-no}" >&5 +echo "${ECHO_T}${with_valgrind:-no}" >&6 + +case .$with_cflags in #(vi +.*-g*) + case .$CFLAGS in #(vi + .*-g*) #(vi + ;; + *) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -g +do +case $cf_fix_cppflags in +no) + case $cf_add_cflags in #(vi + -undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi + case $cf_add_cflags in + -D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + continue + fi + ;; + esac + case "$CPPFLAGS" in + *$cf_add_cflags) #(vi + ;; + *) #(vi + case $cf_add_cflags in #(vi + -D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + cf_new_cppflags="$cf_new_cppflags $cf_add_cflags" + ;; + esac + ;; + *) + cf_new_cflags="$cf_new_cflags $cf_add_cflags" + ;; + esac + ;; +yes) + cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "${cf_add_cflags}" != "${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + CFLAGS="$CFLAGS $cf_new_cflags" +fi + +if test -n "$cf_new_cppflags" ; then + + CPPFLAGS="$CPPFLAGS $cf_new_cppflags" +fi + +if test -n "$cf_new_extra_cppflags" ; then + + EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS" +fi + + ;; + esac + ;; +esac + +echo "$as_me:5155: checking if you want to perform memory-leak testing" >&5 +echo $ECHO_N "checking if you want to perform memory-leak testing... $ECHO_C" >&6 + +# Check whether --enable-leaks or --disable-leaks was given. +if test "${enable_leaks+set}" = set; then + enableval="$enable_leaks" + if test "x$enableval" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi +else + : ${with_no_leaks:=no} +fi; +echo "$as_me:5165: result: $with_no_leaks" >&5 +echo "${ECHO_T}$with_no_leaks" >&6 + +if test "$with_no_leaks" = yes ; then + cat >>confdefs.h <<\EOF +#define NO_LEAKS 1 +EOF + + cat >>confdefs.h <<\EOF +#define YY_NO_LEAKS 1 +EOF + +fi + +### output makefile +ac_config_files="$ac_config_files makefile" +ac_config_commands="$ac_config_commands default" +cat >confcache <<\_ACEOF +# 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, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overriden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# 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 \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if cmp -s $cache_file confcache; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:5261: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +SHELL=\${CONFIG_SHELL-$SHELL} +ac_cs_invocation="\$0 \$@" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Name of the executable. +as_me=`echo "$0" |sed 's,.*[\\/],,'` + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +# NLS nuisances. +$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } +$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } +$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } +$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } +$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } +$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } +$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } +$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } + +exec 6>&1 + +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\EOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." +EOF + +cat >>$CONFIG_STATUS <>$CONFIG_STATUS <<\EOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + shift + set dummy "$ac_option" "$ac_optarg" ${1+"$@"} + shift + ;; + -*);; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_need_defaults=false;; + esac + + case $1 in + # Handling of the options. +EOF +cat >>$CONFIG_STATUS <>$CONFIG_STATUS <<\EOF + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:5437: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + shift + CONFIG_FILES="$CONFIG_FILES $1" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + shift + CONFIG_HEADERS="$CONFIG_HEADERS $1" + ac_need_defaults=false;; + + # This is an error. + -*) { { echo "$as_me:5456: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +exec 5>>config.log +cat >&5 << _ACEOF + +## ----------------------- ## +## Running config.status. ## +## ----------------------- ## + +This file was extended by $as_me 2.52.20101002, executed with + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + > $ac_cs_invocation +on `(hostname || uname -n) 2>/dev/null | sed 1q` + +_ACEOF +EOF + +cat >>$CONFIG_STATUS <<\EOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "makefile" ) CONFIG_FILES="$CONFIG_FILES makefile" ;; + "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:config_h.in" ;; + *) { { echo "$as_me:5494: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/cs$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + +EOF + +cat >>$CONFIG_STATUS <\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@DEFS@,$DEFS,;t t +s,@LIBS@,$LIBS,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@target@,$target,;t t +s,@target_cpu@,$target_cpu,;t t +s,@target_vendor@,$target_vendor,;t t +s,@target_os@,$target_os,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@CTAGS@,$CTAGS,;t t +s,@ETAGS@,$ETAGS,;t t +s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t +s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t +s,@LINT@,$LINT,;t t +s,@LINT_OPTS@,$LINT_OPTS,;t t +s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t +s,@CPP@,$CPP,;t t +s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t +s,@ECHO_LT@,$ECHO_LT,;t t +s,@ECHO_LD@,$ECHO_LD,;t t +s,@RULE_CC@,$RULE_CC,;t t +s,@SHOW_CC@,$SHOW_CC,;t t +s,@ECHO_CC@,$ECHO_CC,;t t +s,@PROG_EXT@,$PROG_EXT,;t t +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_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # 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" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +EOF +cat >>$CONFIG_STATUS <<\EOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || mkdir "$as_incr_dir" + ;; + esac +done; } + + 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 $srcdir in + .) ac_srcdir=. + if test -z "$ac_dots"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_dots | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_dots$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_dots$srcdir ;; + esac + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_dots$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:5728: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated automatically by config.status. */ + configure_input="Generated automatically from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:5746: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:5759: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +EOF +cat >>$CONFIG_STATUS <>$CONFIG_STATUS <<\EOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +EOF +cat >>$CONFIG_STATUS <<\EOF + +# +# CONFIG_HEADER section. +# + +# 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=' ' +ac_dD=',;t' +# ac_i turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_iA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_iB='\([ ]\),\1#\2define\3' +ac_iC=' ' +ac_iD='\4,;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:5825: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:5836: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:5849: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + +EOF + +# Transform confdefs.h into a list of #define's. We won't use it as a sed +# script, but as data to insert where we see @DEFS@. We expect AC_SAVE_DEFS to +# be either 'cat' or 'sort'. +cat confdefs.h | uniq >conftest.vals + +# 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 +echo ' rm -f conftest.frag' >> $CONFIG_STATUS +while grep . conftest.vals >/dev/null +do + # Write chunks of a limited-size here document to conftest.frag. + echo ' cat >> conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals | sed -e 's/#ifdef.*/#if 0/' >> $CONFIG_STATUS + echo 'CEOF' >> $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 + +# Run sed to substitute the contents of conftest.frag into $tmp/in at the +# marker @DEFS@. +echo ' cat >> conftest.edit < $tmp/out +rm -f $tmp/in +mv $tmp/out $tmp/in +rm -f conftest.edit conftest.frag +' >> $CONFIG_STATUS + +cat >>$CONFIG_STATUS <<\EOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated automatically by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated automatically by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated automatically by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if cmp -s $ac_file $tmp/config.h 2>/dev/null; then + { echo "$as_me:5907: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || mkdir "$as_incr_dir" + ;; + esac +done; } + + fi + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi +done +EOF + +cat >>$CONFIG_STATUS <<\EOF + +{ (exit 0); exit 0; } +EOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + exec 5>/dev/null + $SHELL $CONFIG_STATUS || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/contrib/byacc/configure.in b/contrib/byacc/configure.in new file mode 100644 index 00000000000..b251c93adb3 --- /dev/null +++ b/contrib/byacc/configure.in @@ -0,0 +1,30 @@ +dnl Process this file with 'autoconf' to produce a 'configure' script +dnl $Id: configure.in,v 1.10 2010/12/26 19:10:21 tom Exp $ +AC_PREREQ(2.13.20020210) +AC_REVISION($Revision: 1.10 $) +AC_INIT(main.c) +AC_CONFIG_HEADER(config.h:config_h.in) + +CF_CHECK_CACHE([AC_CANONICAL_SYSTEM]) + +AC_ARG_PROGRAM +AC_PROG_CC +AC_CONST +AC_PROG_MAKE_SET +AC_PROG_INSTALL +CF_MAKE_TAGS +CF_PROG_LINT + +CF_ANSI_CC_REQD +CF_XOPEN_SOURCE +AC_CHECK_HEADERS(fcntl.h) +AC_CHECK_FUNCS(atexit) +CF_MKSTEMP + +CF_WITH_WARNINGS(Wwrite-strings) +CF_DISABLE_ECHO +CF_PROG_EXT +CF_DISABLE_LEAKS + +### output makefile +AC_OUTPUT(makefile,,,cat) diff --git a/contrib/byacc/defs.h b/contrib/byacc/defs.h new file mode 100644 index 00000000000..7be5748644a --- /dev/null +++ b/contrib/byacc/defs.h @@ -0,0 +1,438 @@ +/* $Id: defs.h,v 1.36 2011/12/20 01:31:16 tom Exp $ */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +#define YYMAJOR 1 +#define YYMINOR 9 + +#define CONCAT(first,second) first #second +#define CONCAT1(string,number) CONCAT(string, number) +#define CONCAT2(first,second) #first "." #second + +#ifdef YYPATCH +#define VSTRING(a,b) CONCAT2(a,b) CONCAT1(" ",YYPATCH) +#else +#define VSTRING(a,b) CONCAT2(a,b) +#endif + +#define VERSION VSTRING(YYMAJOR, YYMINOR) + +/* machine-dependent definitions */ +/* the following definitions are for the Tahoe */ +/* they might have to be changed for other machines */ + +/* MAXCHAR is the largest unsigned character value */ +/* MAXSHORT is the largest value of a C short */ +/* MINSHORT is the most negative value of a C short */ +/* MAXTABLE is the maximum table size */ +/* BITS_PER_WORD is the number of bits in a C unsigned */ +/* WORDSIZE computes the number of words needed to */ +/* store n bits */ +/* BIT returns the value of the n-th bit starting */ +/* from r (0-indexed) */ +/* SETBIT sets the n-th bit starting from r */ + +#define MAXCHAR 255 +#define MAXSHORT 32767 +#define MINSHORT -32768 +#define MAXTABLE 32500 +#define BITS_PER_WORD 32 +#define WORDSIZE(n) (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD) +#define BIT(r, n) ((((r)[(n)>>5])>>((n)&31))&1) +#define SETBIT(r, n) ((r)[(n)>>5]|=((unsigned)1<<((n)&31))) + +/* character names */ + +#define NUL '\0' /* the null character */ +#define NEWLINE '\n' /* line feed */ +#define SP ' ' /* space */ +#define BS '\b' /* backspace */ +#define HT '\t' /* horizontal tab */ +#define VT '\013' /* vertical tab */ +#define CR '\r' /* carriage return */ +#define FF '\f' /* form feed */ +#define QUOTE '\'' /* single quote */ +#define DOUBLE_QUOTE '\"' /* double quote */ +#define BACKSLASH '\\' /* backslash */ + +#define UCH(c) (unsigned char)(c) + +/* defines for constructing filenames */ + +#if defined(VMS) +#define CODE_SUFFIX "_code.c" +#define DEFINES_SUFFIX "_tab.h" +#define EXTERNS_SUFFIX "_tab.i" +#define OUTPUT_SUFFIX "_tab.c" +#else +#define CODE_SUFFIX ".code.c" +#define DEFINES_SUFFIX ".tab.h" +#define EXTERNS_SUFFIX ".tab.i" +#define OUTPUT_SUFFIX ".tab.c" +#endif +#define VERBOSE_SUFFIX ".output" +#define GRAPH_SUFFIX ".dot" + +/* keyword codes */ + +#define TOKEN 0 +#define LEFT 1 +#define RIGHT 2 +#define NONASSOC 3 +#define MARK 4 +#define TEXT 5 +#define TYPE 6 +#define START 7 +#define UNION 8 +#define IDENT 9 +#define EXPECT 10 +#define EXPECT_RR 11 +#define PURE_PARSER 12 +#define PARSE_PARAM 13 +#define LEX_PARAM 14 +#define POSIX_YACC 15 + +/* symbol classes */ + +#define UNKNOWN 0 +#define TERM 1 +#define NONTERM 2 + +/* the undefined value */ + +#define UNDEFINED (-1) + +/* action codes */ + +#define SHIFT 1 +#define REDUCE 2 + +/* character macros */ + +#define IS_IDENT(c) (isalnum(c) || (c) == '_' || (c) == '.' || (c) == '$') +#define IS_OCTAL(c) ((c) >= '0' && (c) <= '7') +#define NUMERIC_VALUE(c) ((c) - '0') + +/* symbol macros */ + +#define ISTOKEN(s) ((s) < start_symbol) +#define ISVAR(s) ((s) >= start_symbol) + +/* storage allocation macros */ + +#define CALLOC(k,n) (calloc((size_t)(k),(size_t)(n))) +#define FREE(x) (free((char*)(x))) +#define MALLOC(n) (malloc((size_t)(n))) +#define NEW(t) ((t*)allocate(sizeof(t))) +#define NEW2(n,t) ((t*)allocate(((size_t)(n)*sizeof(t)))) +#define REALLOC(p,n) (realloc((char*)(p),(size_t)(n))) + +#define DO_FREE(x) if (x) { FREE(x); x = 0; } + +#define NO_SPACE(p) if (p == 0) no_space(); assert(p != 0) + +/* messages */ +#define PLURAL(n) ((n) > 1 ? "s" : "") + +typedef char Assoc_t; +typedef char Class_t; +typedef short Index_t; +typedef short Value_t; + +/* the structure of a symbol table entry */ + +typedef struct bucket bucket; +struct bucket +{ + struct bucket *link; + struct bucket *next; + char *name; + char *tag; + Value_t value; + Index_t index; + Value_t prec; + Class_t class; + Assoc_t assoc; +}; + +/* the structure of the LR(0) state machine */ + +typedef struct core core; +struct core +{ + struct core *next; + struct core *link; + Value_t number; + Value_t accessing_symbol; + Value_t nitems; + Value_t items[1]; +}; + +/* the structure used to record shifts */ + +typedef struct shifts shifts; +struct shifts +{ + struct shifts *next; + Value_t number; + Value_t nshifts; + Value_t shift[1]; +}; + +/* the structure used to store reductions */ + +typedef struct reductions reductions; +struct reductions +{ + struct reductions *next; + Value_t number; + Value_t nreds; + Value_t rules[1]; +}; + +/* the structure used to represent parser actions */ + +typedef struct action action; +struct action +{ + struct action *next; + Value_t symbol; + Value_t number; + Value_t prec; + char action_code; + Assoc_t assoc; + char suppressed; +}; + +/* the structure used to store parse/lex parameters */ +typedef struct param param; +struct param +{ + struct param *next; + char *name; /* parameter name */ + char *type; /* everything before parameter name */ + char *type2; /* everything after parameter name */ +}; + +/* global variables */ + +extern char dflag; +extern char gflag; +extern char iflag; +extern char lflag; +extern char rflag; +extern char sflag; +extern char tflag; +extern char vflag; +extern const char *symbol_prefix; + +extern const char *myname; +extern char *cptr; +extern char *line; +extern int lineno; +extern int outline; +extern int exit_code; + +extern const char *const banner[]; +extern const char *const xdecls[]; +extern const char *const tables[]; +extern const char *const global_vars[]; +extern const char *const impure_vars[]; +extern const char *const hdr_defs[]; +extern const char *const hdr_vars[]; +extern const char *const body_1[]; +extern const char *const body_vars[]; +extern const char *const body_2[]; +extern const char *const body_3[]; +extern const char *const trailer[]; +extern const char *const trailer_2[]; + +extern char *code_file_name; +extern char *input_file_name; +extern char *defines_file_name; +extern char *externs_file_name; + +extern FILE *action_file; +extern FILE *code_file; +extern FILE *defines_file; +extern FILE *externs_file; +extern FILE *input_file; +extern FILE *output_file; +extern FILE *text_file; +extern FILE *union_file; +extern FILE *verbose_file; +extern FILE *graph_file; + +extern int nitems; +extern int nrules; +extern int nsyms; +extern int ntokens; +extern int nvars; +extern int ntags; + +extern char unionized; +extern char line_format[]; + +extern Value_t start_symbol; +extern char **symbol_name; +extern char **symbol_pname; +extern Value_t *symbol_value; +extern Value_t *symbol_prec; +extern char *symbol_assoc; + +extern Value_t *ritem; +extern Value_t *rlhs; +extern Value_t *rrhs; +extern Value_t *rprec; +extern Assoc_t *rassoc; + +extern Value_t **derives; +extern char *nullable; + +extern bucket *first_symbol; +extern bucket *last_symbol; + +extern int pure_parser; +extern int nstates; +extern core *first_state; +extern shifts *first_shift; +extern reductions *first_reduction; +extern Value_t *accessing_symbol; +extern core **state_table; +extern shifts **shift_table; +extern reductions **reduction_table; +extern unsigned *LA; +extern Value_t *LAruleno; +extern Value_t *lookaheads; +extern Value_t *goto_map; +extern Value_t *from_state; +extern Value_t *to_state; + +extern action **parser; +extern int SRexpect; +extern int RRexpect; +extern int SRtotal; +extern int RRtotal; +extern Value_t *SRconflicts; +extern Value_t *RRconflicts; +extern Value_t *defred; +extern Value_t *rules_used; +extern Value_t nunused; +extern Value_t final_state; + +extern Value_t *itemset; +extern Value_t *itemsetend; +extern unsigned *ruleset; + +extern param *lex_param; +extern param *parse_param; + +/* global functions */ + +extern bucket *lookup(const char *); +extern bucket *make_bucket(const char *); + +#ifndef GCC_NORETURN +#define GCC_NORETURN /* nothing */ +#endif + +#ifndef GCC_UNUSED +#define GCC_UNUSED /* nothing */ +#endif + +/* closure.c */ +extern void closure(Value_t * nucleus, int n); +extern void finalize_closure(void); +extern void set_first_derives(void); + +/* error.c */ +extern void default_action_warning(void); +extern void dollar_error(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; +extern void dollar_warning(int a_lineno, int i); +extern void fatal(const char *msg) GCC_NORETURN; +extern void illegal_character(char *c_cptr) GCC_NORETURN; +extern void illegal_tag(int t_lineno, char *t_line, char *t_cptr) GCC_NORETURN; +extern void missing_brace(void) GCC_NORETURN; +extern void no_grammar(void) GCC_NORETURN; +extern void no_space(void) GCC_NORETURN; +extern void open_error(const char *filename) GCC_NORETURN; +extern void over_unionized(char *u_cptr) GCC_NORETURN; +extern void prec_redeclared(void); +extern void reprec_warning(char *s); +extern void restarted_warning(void); +extern void retyped_warning(char *s); +extern void revalued_warning(char *s); +extern void syntax_error(int st_lineno, char *st_line, char *st_cptr) GCC_NORETURN; +extern void terminal_lhs(int s_lineno) GCC_NORETURN; +extern void terminal_start(char *s) GCC_NORETURN; +extern void tokenized_start(char *s) GCC_NORETURN; +extern void undefined_goal(char *s) GCC_NORETURN; +extern void undefined_symbol_warning(char *s); +extern void unexpected_EOF(void) GCC_NORETURN; +extern void unknown_rhs(int i) GCC_NORETURN; +extern void unterminated_action(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; +extern void unterminated_comment(int c_lineno, char *c_line, char *c_cptr) GCC_NORETURN; +extern void unterminated_string(int s_lineno, char *s_line, char *s_cptr) GCC_NORETURN; +extern void unterminated_text(int t_lineno, char *t_line, char *t_cptr) GCC_NORETURN; +extern void unterminated_union(int u_lineno, char *u_line, char *u_cptr) GCC_NORETURN; +extern void untyped_lhs(void) GCC_NORETURN; +extern void untyped_rhs(int i, char *s) GCC_NORETURN; +extern void used_reserved(char *s) GCC_NORETURN; + +/* graph.c */ +extern void graph(void); + +/* lalr.c */ +extern void create_symbol_table(void); +extern void free_symbol_table(void); +extern void free_symbols(void); + +/* lalr.c */ +extern void lalr(void); + +/* lr0.c */ +extern void lr0(void); +extern void show_cores(void); +extern void show_ritems(void); +extern void show_rrhs(void); +extern void show_shifts(void); + +/* main.c */ +extern void *allocate(size_t n); +extern void done(int k) GCC_NORETURN; + +/* mkpar.c */ +extern void free_parser(void); +extern void make_parser(void); + +/* output.c */ +extern void output(void); + +/* reader.c */ +extern void reader(void); + +/* skeleton.c */ +extern void write_section(FILE *fp, const char *const section[]); + +/* verbose.c */ +extern void verbose(void); + +/* warshall.c */ +extern void reflexive_transitive_closure(unsigned *R, int n); + +#ifdef NO_LEAKS +extern void lr0_leaks(void); +extern void lalr_leaks(void); +extern void mkpar_leaks(void); +extern void output_leaks(void); +extern void reader_leaks(void); +#endif diff --git a/contrib/byacc/descrip.mms b/contrib/byacc/descrip.mms new file mode 100644 index 00000000000..0dcb70fbbea --- /dev/null +++ b/contrib/byacc/descrip.mms @@ -0,0 +1,37 @@ +CFLAGS = /decc $(CC_OPTIONS)/Diagnostics /Define=(NDEBUG) /Object=$@ /Include=([]) + +LINKFLAGS = /map=$(MMS$TARGET_NAME)/cross_reference/exec=$(MMS$TARGET_NAME).exe + +LINKER = cc + +OBJS = closure.obj, \ + error.obj, \ + lalr.obj, \ + lr0.obj, \ + main.obj, \ + mkpar.obj, \ + output.obj, \ + reader.obj, \ + skeleton.obj, \ + symtab.obj, \ + verbose.obj, \ + warshall.obj + +PROGRAM = yacc.exe + +all : $(PROGRAM) + +$(PROGRAM) : $(OBJS) + @ write sys$output "Loading $(PROGRAM) ... " + @ $(LINK) $(LINKFLAGS) $(OBJS) + @ write sys$output "done" + +clean : + @- if f$search("*.obj") .nes. "" then delete *.obj;* + @- if f$search("*.lis") .nes. "" then delete *.lis;* + @- if f$search("*.log") .nes. "" then delete *.log;* + +clobber : clean + @- if f$search("*.exe") .nes. "" then delete *.exe;* + +$(OBJS) : defs.h diff --git a/contrib/byacc/error.c b/contrib/byacc/error.c new file mode 100644 index 00000000000..3bab31b8add --- /dev/null +++ b/contrib/byacc/error.c @@ -0,0 +1,288 @@ +/* $Id: error.c,v 1.9 2011/09/05 23:27:43 tom Exp $ */ + +/* routines for printing error messages */ + +#include "defs.h" + +void +fatal(const char *msg) +{ + fprintf(stderr, "%s: f - %s\n", myname, msg); + done(2); +} + +void +no_space(void) +{ + fprintf(stderr, "%s: f - out of space\n", myname); + done(2); +} + +void +open_error(const char *filename) +{ + fprintf(stderr, "%s: f - cannot open \"%s\"\n", myname, filename); + done(2); +} + +void +missing_brace(void) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", missing '}'\n", + myname, lineno, input_file_name); + done(1); +} + +void +unexpected_EOF(void) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", unexpected end-of-file\n", + myname, lineno, input_file_name); + done(1); +} + +static void +print_pos(char *st_line, char *st_cptr) +{ + char *s; + + if (st_line == 0) + return; + for (s = st_line; *s != '\n'; ++s) + { + if (isprint(UCH(*s)) || *s == '\t') + putc(*s, stderr); + else + putc('?', stderr); + } + putc('\n', stderr); + for (s = st_line; s < st_cptr; ++s) + { + if (*s == '\t') + putc('\t', stderr); + else + putc(' ', stderr); + } + putc('^', stderr); + putc('\n', stderr); +} + +void +syntax_error(int st_lineno, char *st_line, char *st_cptr) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", syntax error\n", + myname, st_lineno, input_file_name); + print_pos(st_line, st_cptr); + done(1); +} + +void +unterminated_comment(int c_lineno, char *c_line, char *c_cptr) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", unmatched /*\n", + myname, c_lineno, input_file_name); + print_pos(c_line, c_cptr); + done(1); +} + +void +unterminated_string(int s_lineno, char *s_line, char *s_cptr) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", unterminated string\n", + myname, s_lineno, input_file_name); + print_pos(s_line, s_cptr); + done(1); +} + +void +unterminated_text(int t_lineno, char *t_line, char *t_cptr) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", unmatched %%{\n", + myname, t_lineno, input_file_name); + print_pos(t_line, t_cptr); + done(1); +} + +void +unterminated_union(int u_lineno, char *u_line, char *u_cptr) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", unterminated %%union \ +declaration\n", myname, u_lineno, input_file_name); + print_pos(u_line, u_cptr); + done(1); +} + +void +over_unionized(char *u_cptr) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", too many %%union \ +declarations\n", myname, lineno, input_file_name); + print_pos(line, u_cptr); + done(1); +} + +void +illegal_tag(int t_lineno, char *t_line, char *t_cptr) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", illegal tag\n", + myname, t_lineno, input_file_name); + print_pos(t_line, t_cptr); + done(1); +} + +void +illegal_character(char *c_cptr) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", illegal character\n", + myname, lineno, input_file_name); + print_pos(line, c_cptr); + done(1); +} + +void +used_reserved(char *s) +{ + fprintf(stderr, + "%s: e - line %d of \"%s\", illegal use of reserved symbol \ +%s\n", myname, lineno, input_file_name, s); + done(1); +} + +void +tokenized_start(char *s) +{ + fprintf(stderr, + "%s: e - line %d of \"%s\", the start symbol %s cannot be \ +declared to be a token\n", myname, lineno, input_file_name, s); + done(1); +} + +void +retyped_warning(char *s) +{ + fprintf(stderr, "%s: w - line %d of \"%s\", the type of %s has been \ +redeclared\n", myname, lineno, input_file_name, s); +} + +void +reprec_warning(char *s) +{ + fprintf(stderr, + "%s: w - line %d of \"%s\", the precedence of %s has been \ +redeclared\n", myname, lineno, input_file_name, s); +} + +void +revalued_warning(char *s) +{ + fprintf(stderr, "%s: w - line %d of \"%s\", the value of %s has been \ +redeclared\n", myname, lineno, input_file_name, s); +} + +void +terminal_start(char *s) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", the start symbol %s is a \ +token\n", myname, lineno, input_file_name, s); + done(1); +} + +void +restarted_warning(void) +{ + fprintf(stderr, "%s: w - line %d of \"%s\", the start symbol has been \ +redeclared\n", myname, lineno, input_file_name); +} + +void +no_grammar(void) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", no grammar has been \ +specified\n", myname, lineno, input_file_name); + done(1); +} + +void +terminal_lhs(int s_lineno) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", a token appears on the lhs \ +of a production\n", myname, s_lineno, input_file_name); + done(1); +} + +void +prec_redeclared(void) +{ + fprintf(stderr, "%s: w - line %d of \"%s\", conflicting %%prec \ +specifiers\n", myname, lineno, input_file_name); +} + +void +unterminated_action(int a_lineno, char *a_line, char *a_cptr) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", unterminated action\n", + myname, a_lineno, input_file_name); + print_pos(a_line, a_cptr); + done(1); +} + +void +dollar_warning(int a_lineno, int i) +{ + fprintf(stderr, "%s: w - line %d of \"%s\", $%d references beyond the \ +end of the current rule\n", myname, a_lineno, input_file_name, i); +} + +void +dollar_error(int a_lineno, char *a_line, char *a_cptr) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", illegal $-name\n", + myname, a_lineno, input_file_name); + print_pos(a_line, a_cptr); + done(1); +} + +void +untyped_lhs(void) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", $$ is untyped\n", + myname, lineno, input_file_name); + done(1); +} + +void +untyped_rhs(int i, char *s) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", $%d (%s) is untyped\n", + myname, lineno, input_file_name, i, s); + done(1); +} + +void +unknown_rhs(int i) +{ + fprintf(stderr, "%s: e - line %d of \"%s\", $%d is untyped\n", + myname, lineno, input_file_name, i); + done(1); +} + +void +default_action_warning(void) +{ + fprintf(stderr, + "%s: w - line %d of \"%s\", the default action assigns an \ +undefined value to $$\n", myname, lineno, input_file_name); +} + +void +undefined_goal(char *s) +{ + fprintf(stderr, "%s: e - the start symbol %s is undefined\n", myname, s); + done(1); +} + +void +undefined_symbol_warning(char *s) +{ + fprintf(stderr, "%s: w - the symbol %s is undefined\n", myname, s); +} diff --git a/contrib/byacc/graph.c b/contrib/byacc/graph.c new file mode 100644 index 00000000000..2e312314d7a --- /dev/null +++ b/contrib/byacc/graph.c @@ -0,0 +1,112 @@ +/* $Id: graph.c,v 1.7 2009/10/27 09:25:20 tom Exp $ */ + +#include "defs.h" + +static void graph_state(int stateno); +static void graph_LA(int ruleno); + +static unsigned int larno; + +void +graph(void) +{ + int i; + int j; + shifts *sp; + int sn; + int as; + + if (!gflag) + return; + + for (i = 0; i < nstates; ++i) + { + closure(state_table[i]->items, state_table[i]->nitems); + graph_state(i); + } + + fprintf(graph_file, "\n\n"); + for (i = 0; i < nstates; ++i) + { + + sp = shift_table[i]; + if (sp) + for (j = 0; j < sp->nshifts; ++j) + { + sn = sp->shift[j]; + as = accessing_symbol[sn]; + fprintf(graph_file, + "\tq%d -> q%d [label=\"%s\"];\n", + i, sn, symbol_pname[as]); + } + } + + fprintf(graph_file, "}\n"); + + for (i = 0; i < nsyms; ++i) + FREE(symbol_pname[i]); + FREE(symbol_pname); +} + +static void +graph_state(int stateno) +{ + short *isp; + int rule; + short *sp; + short *sp1; + + larno = (unsigned)lookaheads[stateno]; + fprintf(graph_file, "\n\tq%d [label=\"%d:\\l", stateno, stateno); + + for (isp = itemset; isp < itemsetend; isp++) + { + sp1 = sp = ritem + *isp; + + while (*sp >= 0) + ++sp; + rule = -(*sp); + fprintf(graph_file, " %s -> ", symbol_pname[rlhs[rule]]); + + for (sp = ritem + rrhs[rule]; sp < sp1; sp++) + fprintf(graph_file, "%s ", symbol_pname[*sp]); + + putc('.', graph_file); + + while (*sp >= 0) + { + fprintf(graph_file, " %s", symbol_pname[*sp]); + sp++; + } + + if (*sp1 < 0) + graph_LA(-*sp1); + + fprintf(graph_file, "\\l"); + } + fprintf(graph_file, "\"];"); +} + +static void +graph_LA(int ruleno) +{ + int i; + unsigned tokensetsize; + unsigned *rowp; + + tokensetsize = (unsigned)WORDSIZE(ntokens); + + if (ruleno == LAruleno[larno]) + { + rowp = LA + larno * tokensetsize; + + fprintf(graph_file, " { "); + for (i = ntokens - 1; i >= 0; i--) + { + if (BIT(rowp, i)) + fprintf(graph_file, "%s ", symbol_pname[i]); + } + fprintf(graph_file, "}"); + ++larno; + } +} diff --git a/contrib/byacc/install-sh b/contrib/byacc/install-sh new file mode 100755 index 00000000000..462fa9c3d57 --- /dev/null +++ b/contrib/byacc/install-sh @@ -0,0 +1,294 @@ +#! /bin/sh +# +# install - install a program, script, or datafile +# +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd=$cpprog + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "$0: no input file specified" >&2 + exit 1 +else + : +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d "$dst" ]; then + instcmd=: + chmodcmd="" + else + instcmd=$mkdirprog + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f "$src" ] || [ -d "$src" ] + then + : + else + echo "$0: $src does not exist" >&2 + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "$0: no destination specified" >&2 + exit 1 + else + : + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d "$dst" ] + then + dst=$dst/`basename "$src"` + else + : + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' + ' +IFS="${IFS-$defaultIFS}" + +oIFS=$IFS +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS=$oIFS + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp=$pathcomp$1 + shift + + if [ ! -d "$pathcomp" ] ; + then + $mkdirprog "$pathcomp" + else + : + fi + + pathcomp=$pathcomp/ +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd "$dst" && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename "$dst"` + else + dstfile=`basename "$dst" $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename "$dst"` + else + : + fi + +# Make a couple of temp file names in the proper directory. + + dsttmp=$dstdir/#inst.$$# + rmtmp=$dstdir/#rm.$$# + +# Trap to clean up temp files at exit. + + trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 + trap '(exit $?); exit' 1 2 13 15 + +# Move or copy the file name to the temp name + + $doit $instcmd "$src" "$dsttmp" && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && + +# Now remove or move aside any old file at destination location. We try this +# two ways since rm can't unlink itself on some systems and the destination +# file might be busy for other reasons. In this case, the final cleanup +# might fail but the new file should still install successfully. + +{ + if [ -f "$dstdir/$dstfile" ] + then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null || + $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null || + { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + (exit 1); exit + } + else + : + fi +} && + +# Now rename the file to the real destination. + + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + +fi && + +# The final little trick to "correctly" pass the exit status to the exit trap. + +{ + (exit 0); exit +} diff --git a/contrib/byacc/lalr.c b/contrib/byacc/lalr.c new file mode 100644 index 00000000000..eb5e309b008 --- /dev/null +++ b/contrib/byacc/lalr.c @@ -0,0 +1,655 @@ +/* $Id: lalr.c,v 1.9 2009/10/27 09:49:27 tom Exp $ */ + +#include "defs.h" + +typedef struct shorts +{ + struct shorts *next; + Value_t value; +} +shorts; + +static Value_t map_goto(int state, int symbol); +static Value_t **transpose(Value_t ** R, int n); +static void add_lookback_edge(int stateno, int ruleno, int gotono); +static void build_relations(void); +static void compute_FOLLOWS(void); +static void compute_lookaheads(void); +static void digraph(Value_t ** relation); +static void initialize_F(void); +static void initialize_LA(void); +static void set_accessing_symbol(void); +static void set_goto_map(void); +static void set_maxrhs(void); +static void set_reduction_table(void); +static void set_shift_table(void); +static void set_state_table(void); +static void traverse(int i); + +static int tokensetsize; +Value_t *lookaheads; +Value_t *LAruleno; +unsigned *LA; +Value_t *accessing_symbol; +core **state_table; +shifts **shift_table; +reductions **reduction_table; +Value_t *goto_map; +Value_t *from_state; +Value_t *to_state; + +static Value_t infinity; +static int maxrhs; +static int ngotos; +static unsigned *F; +static Value_t **includes; +static shorts **lookback; +static Value_t **R; +static Value_t *INDEX; +static Value_t *VERTICES; +static Value_t top; + +void +lalr(void) +{ + tokensetsize = WORDSIZE(ntokens); + + set_state_table(); + set_accessing_symbol(); + set_shift_table(); + set_reduction_table(); + set_maxrhs(); + initialize_LA(); + set_goto_map(); + initialize_F(); + build_relations(); + compute_FOLLOWS(); + compute_lookaheads(); +} + +static void +set_state_table(void) +{ + core *sp; + + state_table = NEW2(nstates, core *); + for (sp = first_state; sp; sp = sp->next) + state_table[sp->number] = sp; +} + +static void +set_accessing_symbol(void) +{ + core *sp; + + accessing_symbol = NEW2(nstates, Value_t); + for (sp = first_state; sp; sp = sp->next) + accessing_symbol[sp->number] = sp->accessing_symbol; +} + +static void +set_shift_table(void) +{ + shifts *sp; + + shift_table = NEW2(nstates, shifts *); + for (sp = first_shift; sp; sp = sp->next) + shift_table[sp->number] = sp; +} + +static void +set_reduction_table(void) +{ + reductions *rp; + + reduction_table = NEW2(nstates, reductions *); + for (rp = first_reduction; rp; rp = rp->next) + reduction_table[rp->number] = rp; +} + +static void +set_maxrhs(void) +{ + Value_t *itemp; + Value_t *item_end; + int length; + int max; + + length = 0; + max = 0; + item_end = ritem + nitems; + for (itemp = ritem; itemp < item_end; itemp++) + { + if (*itemp >= 0) + { + length++; + } + else + { + if (length > max) + max = length; + length = 0; + } + } + + maxrhs = max; +} + +static void +initialize_LA(void) +{ + int i, j, k; + reductions *rp; + + lookaheads = NEW2(nstates + 1, Value_t); + + k = 0; + for (i = 0; i < nstates; i++) + { + lookaheads[i] = (Value_t) k; + rp = reduction_table[i]; + if (rp) + k += rp->nreds; + } + lookaheads[nstates] = (Value_t) k; + + LA = NEW2(k * tokensetsize, unsigned); + LAruleno = NEW2(k, Value_t); + lookback = NEW2(k, shorts *); + + k = 0; + for (i = 0; i < nstates; i++) + { + rp = reduction_table[i]; + if (rp) + { + for (j = 0; j < rp->nreds; j++) + { + LAruleno[k] = rp->rules[j]; + k++; + } + } + } +} + +static void +set_goto_map(void) +{ + shifts *sp; + int i; + int symbol; + int k; + Value_t *temp_map; + Value_t state2; + Value_t state1; + + goto_map = NEW2(nvars + 1, Value_t) - ntokens; + temp_map = NEW2(nvars + 1, Value_t) - ntokens; + + ngotos = 0; + for (sp = first_shift; sp; sp = sp->next) + { + for (i = sp->nshifts - 1; i >= 0; i--) + { + symbol = accessing_symbol[sp->shift[i]]; + + if (ISTOKEN(symbol)) + break; + + if (ngotos == MAXSHORT) + fatal("too many gotos"); + + ngotos++; + goto_map[symbol]++; + } + } + + k = 0; + for (i = ntokens; i < nsyms; i++) + { + temp_map[i] = (Value_t) k; + k += goto_map[i]; + } + + for (i = ntokens; i < nsyms; i++) + goto_map[i] = temp_map[i]; + + goto_map[nsyms] = (Value_t) ngotos; + temp_map[nsyms] = (Value_t) ngotos; + + from_state = NEW2(ngotos, Value_t); + to_state = NEW2(ngotos, Value_t); + + for (sp = first_shift; sp; sp = sp->next) + { + state1 = sp->number; + for (i = sp->nshifts - 1; i >= 0; i--) + { + state2 = sp->shift[i]; + symbol = accessing_symbol[state2]; + + if (ISTOKEN(symbol)) + break; + + k = temp_map[symbol]++; + from_state[k] = state1; + to_state[k] = state2; + } + } + + FREE(temp_map + ntokens); +} + +/* Map_goto maps a state/symbol pair into its numeric representation. */ + +static Value_t +map_goto(int state, int symbol) +{ + int high; + int low; + int middle; + int s; + + low = goto_map[symbol]; + high = goto_map[symbol + 1]; + + for (;;) + { + assert(low <= high); + middle = (low + high) >> 1; + s = from_state[middle]; + if (s == state) + return (Value_t) (middle); + else if (s < state) + low = middle + 1; + else + high = middle - 1; + } +} + +static void +initialize_F(void) +{ + int i; + int j; + int k; + shifts *sp; + Value_t *edge; + unsigned *rowp; + Value_t *rp; + Value_t **reads; + int nedges; + int stateno; + int symbol; + int nwords; + + nwords = ngotos * tokensetsize; + F = NEW2(nwords, unsigned); + + reads = NEW2(ngotos, Value_t *); + edge = NEW2(ngotos + 1, Value_t); + nedges = 0; + + rowp = F; + for (i = 0; i < ngotos; i++) + { + stateno = to_state[i]; + sp = shift_table[stateno]; + + if (sp) + { + k = sp->nshifts; + + for (j = 0; j < k; j++) + { + symbol = accessing_symbol[sp->shift[j]]; + if (ISVAR(symbol)) + break; + SETBIT(rowp, symbol); + } + + for (; j < k; j++) + { + symbol = accessing_symbol[sp->shift[j]]; + if (nullable[symbol]) + edge[nedges++] = map_goto(stateno, symbol); + } + + if (nedges) + { + reads[i] = rp = NEW2(nedges + 1, Value_t); + + for (j = 0; j < nedges; j++) + rp[j] = edge[j]; + + rp[nedges] = -1; + nedges = 0; + } + } + + rowp += tokensetsize; + } + + SETBIT(F, 0); + digraph(reads); + + for (i = 0; i < ngotos; i++) + { + if (reads[i]) + FREE(reads[i]); + } + + FREE(reads); + FREE(edge); +} + +static void +build_relations(void) +{ + int i; + int j; + int k; + Value_t *rulep; + Value_t *rp; + shifts *sp; + int length; + int nedges; + int done_flag; + Value_t state1; + Value_t stateno; + int symbol1; + int symbol2; + Value_t *shortp; + Value_t *edge; + Value_t *states; + Value_t **new_includes; + + includes = NEW2(ngotos, Value_t *); + edge = NEW2(ngotos + 1, Value_t); + states = NEW2(maxrhs + 1, Value_t); + + for (i = 0; i < ngotos; i++) + { + nedges = 0; + state1 = from_state[i]; + symbol1 = accessing_symbol[to_state[i]]; + + for (rulep = derives[symbol1]; *rulep >= 0; rulep++) + { + length = 1; + states[0] = state1; + stateno = state1; + + for (rp = ritem + rrhs[*rulep]; *rp >= 0; rp++) + { + symbol2 = *rp; + sp = shift_table[stateno]; + k = sp->nshifts; + + for (j = 0; j < k; j++) + { + stateno = sp->shift[j]; + if (accessing_symbol[stateno] == symbol2) + break; + } + + states[length++] = stateno; + } + + add_lookback_edge(stateno, *rulep, i); + + length--; + done_flag = 0; + while (!done_flag) + { + done_flag = 1; + rp--; + if (ISVAR(*rp)) + { + stateno = states[--length]; + edge[nedges++] = map_goto(stateno, *rp); + if (nullable[*rp] && length > 0) + done_flag = 0; + } + } + } + + if (nedges) + { + includes[i] = shortp = NEW2(nedges + 1, Value_t); + for (j = 0; j < nedges; j++) + shortp[j] = edge[j]; + shortp[nedges] = -1; + } + } + + new_includes = transpose(includes, ngotos); + + for (i = 0; i < ngotos; i++) + if (includes[i]) + FREE(includes[i]); + + FREE(includes); + + includes = new_includes; + + FREE(edge); + FREE(states); +} + +static void +add_lookback_edge(int stateno, int ruleno, int gotono) +{ + int i, k; + int found; + shorts *sp; + + i = lookaheads[stateno]; + k = lookaheads[stateno + 1]; + found = 0; + while (!found && i < k) + { + if (LAruleno[i] == ruleno) + found = 1; + else + ++i; + } + assert(found); + + sp = NEW(shorts); + sp->next = lookback[i]; + sp->value = (Value_t) gotono; + lookback[i] = sp; +} + +static Value_t ** +transpose(Value_t ** R2, int n) +{ + Value_t **new_R; + Value_t **temp_R; + Value_t *nedges; + Value_t *sp; + int i; + int k; + + nedges = NEW2(n, Value_t); + + for (i = 0; i < n; i++) + { + sp = R2[i]; + if (sp) + { + while (*sp >= 0) + nedges[*sp++]++; + } + } + + new_R = NEW2(n, Value_t *); + temp_R = NEW2(n, Value_t *); + + for (i = 0; i < n; i++) + { + k = nedges[i]; + if (k > 0) + { + sp = NEW2(k + 1, Value_t); + new_R[i] = sp; + temp_R[i] = sp; + sp[k] = -1; + } + } + + FREE(nedges); + + for (i = 0; i < n; i++) + { + sp = R2[i]; + if (sp) + { + while (*sp >= 0) + *temp_R[*sp++]++ = (Value_t) i; + } + } + + FREE(temp_R); + + return (new_R); +} + +static void +compute_FOLLOWS(void) +{ + digraph(includes); +} + +static void +compute_lookaheads(void) +{ + int i, n; + unsigned *fp1, *fp2, *fp3; + shorts *sp, *next; + unsigned *rowp; + + rowp = LA; + n = lookaheads[nstates]; + for (i = 0; i < n; i++) + { + fp3 = rowp + tokensetsize; + for (sp = lookback[i]; sp; sp = sp->next) + { + fp1 = rowp; + fp2 = F + tokensetsize * sp->value; + while (fp1 < fp3) + *fp1++ |= *fp2++; + } + rowp = fp3; + } + + for (i = 0; i < n; i++) + for (sp = lookback[i]; sp; sp = next) + { + next = sp->next; + FREE(sp); + } + + FREE(lookback); + FREE(F); +} + +static void +digraph(Value_t ** relation) +{ + int i; + + infinity = (Value_t) (ngotos + 2); + INDEX = NEW2(ngotos + 1, Value_t); + VERTICES = NEW2(ngotos + 1, Value_t); + top = 0; + + R = relation; + + for (i = 0; i < ngotos; i++) + INDEX[i] = 0; + + for (i = 0; i < ngotos; i++) + { + if (INDEX[i] == 0 && R[i]) + traverse(i); + } + + FREE(INDEX); + FREE(VERTICES); +} + +static void +traverse(int i) +{ + unsigned *fp1; + unsigned *fp2; + unsigned *fp3; + int j; + Value_t *rp; + + Value_t height; + unsigned *base; + + VERTICES[++top] = (Value_t) i; + INDEX[i] = height = top; + + base = F + i * tokensetsize; + fp3 = base + tokensetsize; + + rp = R[i]; + if (rp) + { + while ((j = *rp++) >= 0) + { + if (INDEX[j] == 0) + traverse(j); + + if (INDEX[i] > INDEX[j]) + INDEX[i] = INDEX[j]; + + fp1 = base; + fp2 = F + j * tokensetsize; + + while (fp1 < fp3) + *fp1++ |= *fp2++; + } + } + + if (INDEX[i] == height) + { + for (;;) + { + j = VERTICES[top--]; + INDEX[j] = infinity; + + if (i == j) + break; + + fp1 = base; + fp2 = F + j * tokensetsize; + + while (fp1 < fp3) + *fp2++ = *fp1++; + } + } +} + +#ifdef NO_LEAKS +void +lalr_leaks(void) +{ + int i; + + if (includes != 0) + { + for (i = 0; i < ngotos; i++) + { + free(includes[i]); + } + DO_FREE(includes); + } +} +#endif diff --git a/usr.bin/yacc/lr0.c b/contrib/byacc/lr0.c similarity index 69% rename from usr.bin/yacc/lr0.c rename to contrib/byacc/lr0.c index 9d154e83e47..07599734b35 100644 --- a/usr.bin/yacc/lr0.c +++ b/contrib/byacc/lr0.c @@ -1,74 +1,26 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ +/* $Id: lr0.c,v 1.12 2010/06/09 08:53:17 tom Exp $ */ -#if 0 -#ifndef lint -static char sccsid[] = "@(#)lr0.c 5.3 (Berkeley) 1/20/91"; -#endif -#endif - -#include -__FBSDID("$FreeBSD$"); - -#include -#include #include "defs.h" -extern short *itemset; -extern short *itemsetend; -extern unsigned *ruleset; - -int nstates; -core *first_state; -shifts *first_shift; -reductions *first_reduction; - +static core *new_state(int symbol); +static Value_t get_state(int symbol); static void allocate_itemsets(void); static void allocate_storage(void); static void append_states(void); static void free_storage(void); static void generate_states(void); -static int get_state(int); static void initialize_states(void); static void new_itemsets(void); -static core *new_state(int); -#ifdef DEBUG -static void print_derives(void); -#endif static void save_reductions(void); static void save_shifts(void); static void set_derives(void); static void set_nullable(void); +int nstates; +core *first_state; +shifts *first_shift; +reductions *first_reduction; + static core **state_set; static core *this_state; static core *last_state; @@ -78,13 +30,12 @@ static reductions *last_reduction; static int nshifts; static short *shift_symbol; -static short *redset; -static short *shiftset; - -static short **kernel_base; -static short **kernel_end; -static short *kernel_items; +static Value_t *redset; +static Value_t *shiftset; +static Value_t **kernel_base; +static Value_t **kernel_end; +static Value_t *kernel_items; static void allocate_itemsets(void) @@ -128,7 +79,6 @@ allocate_itemsets(void) kernel_end = NEW2(nsyms, short *); } - static void allocate_storage(void) { @@ -138,13 +88,12 @@ allocate_storage(void) state_set = NEW2(nitems, core *); } - static void append_states(void) { int i; int j; - int symbol; + Value_t symbol; #ifdef TRACE fprintf(stderr, "Entering append_states()\n"); @@ -168,21 +117,18 @@ append_states(void) } } - static void free_storage(void) { - free(shift_symbol); - free(redset); - free(shiftset); - free(kernel_base); - free(kernel_end); - free(kernel_items); - free(state_set); + FREE(shift_symbol); + FREE(redset); + FREE(shiftset); + FREE(kernel_base); + FREE(kernel_end); + FREE(kernel_items); + FREE(state_set); } - - static void generate_states(void) { @@ -205,13 +151,10 @@ generate_states(void) this_state = this_state->next; } - finalize_closure(); free_storage(); } - - -static int +static Value_t get_state(int symbol) { int key; @@ -228,7 +171,7 @@ get_state(int symbol) isp1 = kernel_base[symbol]; iend = kernel_end[symbol]; - n = iend - isp1; + n = (int)(iend - isp1); key = *isp1; assert(0 <= key && key < nitems); @@ -273,12 +216,10 @@ get_state(int symbol) return (sp->number); } - - static void initialize_states(void) { - int i; + unsigned i; short *start_derives; core *p; @@ -286,31 +227,30 @@ initialize_states(void) for (i = 0; start_derives[i] >= 0; ++i) continue; - p = malloc(sizeof(core) + i*sizeof(short)); - if (p == 0) no_space(); + p = (core *)MALLOC(sizeof(core) + i * sizeof(short)); + NO_SPACE(p); p->next = 0; p->link = 0; p->number = 0; p->accessing_symbol = 0; - p->nitems = i; + p->nitems = (Value_t) i; - for (i = 0; start_derives[i] >= 0; ++i) + for (i = 0; start_derives[i] >= 0; ++i) p->items[i] = rrhs[start_derives[i]]; first_state = last_state = this_state = p; nstates = 1; } - static void new_itemsets(void) { - int i; + Value_t i; int shiftcount; short *isp; short *ksp; - int symbol; + Value_t symbol; for (i = 0; i < nsyms; i++) kernel_end[i] = 0; @@ -330,7 +270,7 @@ new_itemsets(void) ksp = kernel_base[symbol]; } - *ksp++ = i + 1; + *ksp++ = (Value_t) (i + 1); kernel_end[symbol] = ksp; } } @@ -338,12 +278,10 @@ new_itemsets(void) nshifts = shiftcount; } - - static core * new_state(int symbol) { - int n; + unsigned n; core *p; short *isp1; short *isp2; @@ -353,17 +291,17 @@ new_state(int symbol) fprintf(stderr, "Entering new_state(%d)\n", symbol); #endif - if (nstates >= SHRT_MAX) + if (nstates >= MAXSHORT) fatal("too many states"); isp1 = kernel_base[symbol]; iend = kernel_end[symbol]; - n = iend - isp1; + n = (unsigned)(iend - isp1); - p = (core *) allocate((unsigned) (sizeof(core) + (n - 1) * sizeof(short))); - p->accessing_symbol = symbol; - p->number = nstates; - p->nitems = n; + p = (core *)allocate((sizeof(core) + (n - 1) * sizeof(short))); + p->accessing_symbol = (Value_t) symbol; + p->number = (Value_t) nstates; + p->nitems = (Value_t) n; isp2 = p->items; while (isp1 < iend) @@ -377,10 +315,9 @@ new_state(int symbol) return (p); } - -#if 0 /* show_cores is used for debugging */ +void show_cores(void) { core *p; @@ -390,16 +327,18 @@ show_cores(void) k = 0; for (p = first_state; p; ++k, p = p->next) { - if (k) printf("\n"); + if (k) + printf("\n"); printf("state %d, number = %d, accessing symbol = %s\n", - k, p->number, symbol_name[p->accessing_symbol]); + k, p->number, symbol_name[p->accessing_symbol]); n = p->nitems; for (i = 0; i < n; ++i) { itemno = p->items[i]; printf("%4d ", itemno); j = itemno; - while (ritem[j] >= 0) ++j; + while (ritem[j] >= 0) + ++j; printf("%s :", symbol_name[rlhs[-ritem[j]]]); j = rrhs[-ritem[j]]; while (j < itemno) @@ -413,9 +352,9 @@ show_cores(void) } } - /* show_ritems is used for debugging */ +void show_ritems(void) { int i; @@ -424,8 +363,8 @@ show_ritems(void) printf("ritem[%d] = %d\n", i, ritem[i]); } - /* show_rrhs is used for debugging */ +void show_rrhs(void) { int i; @@ -434,9 +373,9 @@ show_rrhs(void) printf("rrhs[%d] = %d\n", i, rrhs[i]); } - /* show_shifts is used for debugging */ +void show_shifts(void) { shifts *p; @@ -445,16 +384,15 @@ show_shifts(void) k = 0; for (p = first_shift; p; ++k, p = p->next) { - if (k) printf("\n"); + if (k) + printf("\n"); printf("shift %d, number = %d, nshifts = %d\n", k, p->number, - p->nshifts); + p->nshifts); j = p->nshifts; for (i = 0; i < j; ++i) printf("\t%d\n", p->shift[i]); } } -#endif - static void save_shifts(void) @@ -464,11 +402,11 @@ save_shifts(void) short *sp2; short *send; - p = (shifts *) allocate((unsigned) (sizeof(shifts) + - (nshifts - 1) * sizeof(short))); + p = (shifts *)allocate((sizeof(shifts) + + (unsigned)(nshifts - 1) * sizeof(short))); p->number = this_state->number; - p->nshifts = nshifts; + p->nshifts = (Value_t) nshifts; sp1 = shiftset; sp2 = p->shift; @@ -489,8 +427,6 @@ save_shifts(void) } } - - static void save_reductions(void) { @@ -498,7 +434,7 @@ save_reductions(void) short *rp1; short *rp2; int item; - int count; + Value_t count; reductions *p; short *rend; @@ -508,14 +444,15 @@ save_reductions(void) item = ritem[*isp]; if (item < 0) { - redset[count++] = -item; + redset[count++] = (Value_t) - item; } } if (count) { - p = (reductions *) allocate((unsigned) (sizeof(reductions) + - (count - 1) * sizeof(short))); + p = (reductions *)allocate((sizeof(reductions) + + (unsigned)(count - 1) * + sizeof(short))); p->number = this_state->number; p->nreds = count; @@ -540,11 +477,10 @@ save_reductions(void) } } - static void set_derives(void) { - int i, k; + Value_t i, k; int lhs; short *rules; @@ -572,16 +508,8 @@ set_derives(void) #endif } -#if 0 -free_derives() -{ - free(derives[start_symbol]); - free(derives); -} -#endif - #ifdef DEBUG -static void +void print_derives(void) { int i; @@ -603,24 +531,23 @@ print_derives(void) } #endif - static void set_nullable(void) { int i, j; int empty; - int done1; + int done_flag; - nullable = malloc(nsyms); - if (nullable == 0) no_space(); + nullable = MALLOC(nsyms); + NO_SPACE(nullable); for (i = 0; i < nsyms; ++i) nullable[i] = 0; - done1 = 0; - while (!done1) + done_flag = 0; + while (!done_flag) { - done1 = 1; + done_flag = 1; for (i = 1; i < nitems; i++) { empty = 1; @@ -636,7 +563,7 @@ set_nullable(void) if (!nullable[j]) { nullable[j] = 1; - done1 = 0; + done_flag = 0; } } } @@ -653,15 +580,6 @@ set_nullable(void) #endif } - -#if 0 -free_nullable(void) -{ - free(nullable); -} -#endif - - void lr0(void) { @@ -669,3 +587,13 @@ lr0(void) set_nullable(); generate_states(); } + +#ifdef NO_LEAKS +void +lr0_leaks(void) +{ + DO_FREE(derives[start_symbol]); + DO_FREE(derives); + DO_FREE(nullable); +} +#endif diff --git a/contrib/byacc/main.c b/contrib/byacc/main.c new file mode 100644 index 00000000000..0405a99b4bf --- /dev/null +++ b/contrib/byacc/main.c @@ -0,0 +1,664 @@ +/* $Id: main.c,v 1.38 2012/01/14 01:01:15 tom Exp $ */ + +#include +#include /* for _exit() */ + +#include "defs.h" + +#if defined(HAVE_ATEXIT) +# ifdef HAVE_MKSTEMP +# define USE_MKSTEMP 1 +# elif defined(HAVE_FCNTL_H) +# define USE_MKSTEMP 1 +# include /* for open(), O_EXCL, etc. */ +# else +# define USE_MKSTEMP 0 +# endif +#else +# define USE_MKSTEMP 0 +#endif + +#if USE_MKSTEMP +#include +#include + +typedef struct _my_tmpfiles +{ + struct _my_tmpfiles *next; + char *name; +} +MY_TMPFILES; + +static MY_TMPFILES *my_tmpfiles; +#endif /* USE_MKSTEMP */ + +char dflag; +char gflag; +char iflag; +char lflag; +static char oflag; +char rflag; +char sflag; +char tflag; +char vflag; + +const char *symbol_prefix; +const char *myname = "yacc"; + +int lineno; +int outline; + +static char empty_string[] = ""; +static char default_file_prefix[] = "y"; + +static char *file_prefix = default_file_prefix; + +char *code_file_name; +char *input_file_name = empty_string; +char *defines_file_name; +char *externs_file_name; + +static char *graph_file_name; +static char *output_file_name; +static char *verbose_file_name; + +FILE *action_file; /* a temp file, used to save actions associated */ + /* with rules until the parser is written */ +FILE *code_file; /* y.code.c (used when the -r option is specified) */ +FILE *defines_file; /* y.tab.h */ +FILE *externs_file; /* y.tab.i */ +FILE *input_file; /* the input file */ +FILE *output_file; /* y.tab.c */ +FILE *text_file; /* a temp file, used to save text until all */ + /* symbols have been defined */ +FILE *union_file; /* a temp file, used to save the union */ + /* definition until all symbol have been */ + /* defined */ +FILE *verbose_file; /* y.output */ +FILE *graph_file; /* y.dot */ + +int nitems; +int nrules; +int nsyms; +int ntokens; +int nvars; + +Value_t start_symbol; +char **symbol_name; +char **symbol_pname; +Value_t *symbol_value; +short *symbol_prec; +char *symbol_assoc; + +int pure_parser; +int exit_code; + +Value_t *ritem; +Value_t *rlhs; +Value_t *rrhs; +Value_t *rprec; +Assoc_t *rassoc; +Value_t **derives; +char *nullable; + +/* + * Since fclose() is called via the signal handler, it might die. Don't loop + * if there is a problem closing a file. + */ +#define DO_CLOSE(fp) \ + if (fp != 0) { \ + FILE *use = fp; \ + fp = 0; \ + fclose(use); \ + } + +static int got_intr = 0; + +void +done(int k) +{ + DO_CLOSE(input_file); + DO_CLOSE(output_file); + + DO_CLOSE(action_file); + DO_CLOSE(defines_file); + DO_CLOSE(graph_file); + DO_CLOSE(text_file); + DO_CLOSE(union_file); + DO_CLOSE(verbose_file); + + if (got_intr) + _exit(EXIT_FAILURE); + +#ifdef NO_LEAKS + if (rflag) + DO_FREE(code_file_name); + + if (dflag) + DO_FREE(defines_file_name); + + if (iflag) + DO_FREE(externs_file_name); + + if (oflag) + DO_FREE(output_file_name); + + if (vflag) + DO_FREE(verbose_file_name); + + if (gflag) + DO_FREE(graph_file_name); + + lr0_leaks(); + lalr_leaks(); + mkpar_leaks(); + output_leaks(); + reader_leaks(); +#endif + + if (rflag) + DO_CLOSE(code_file); + + exit(k); +} + +static void +onintr(__unused int sig) +{ + got_intr = 1; + done(EXIT_FAILURE); +} + +static void +set_signals(void) +{ +#ifdef SIGINT + if (signal(SIGINT, SIG_IGN) != SIG_IGN) + signal(SIGINT, onintr); +#endif +#ifdef SIGTERM + if (signal(SIGTERM, SIG_IGN) != SIG_IGN) + signal(SIGTERM, onintr); +#endif +#ifdef SIGHUP + if (signal(SIGHUP, SIG_IGN) != SIG_IGN) + signal(SIGHUP, onintr); +#endif +} + +static void +usage(void) +{ + static const char *msg[] = + { + "" + ,"Options:" + ," -b file_prefix set filename prefix (default \"y.\")" + ," -d write definitions (y.tab.h)" + ," -i write interface (y.tab.i)" + ," -g write a graphical description" + ," -l suppress #line directives" + ," -o output_file (default \"y.tab.c\")" + ," -p symbol_prefix set symbol prefix (default \"yy\")" + ," -P create a reentrant parser, e.g., \"%pure-parser\"" + ," -r produce separate code and table files (y.code.c)" + ," -s suppress #define's for quoted names in %token lines" + ," -t add debugging support" + ," -v write description (y.output)" + ," -V show version information and exit" + }; + unsigned n; + + fflush(stdout); + fprintf(stderr, "Usage: %s [options] filename\n", myname); + for (n = 0; n < sizeof(msg) / sizeof(msg[0]); ++n) + fprintf(stderr, "%s\n", msg[n]); + + exit(1); +} + +static void +setflag(int ch) +{ + switch (ch) + { + case 'd': + dflag = 1; + break; + + case 'g': + gflag = 1; + break; + + case 'i': + iflag = 1; + break; + + case 'l': + lflag = 1; + break; + + case 'P': + pure_parser = 1; + break; + + case 'r': + rflag = 1; + break; + + case 's': + sflag = 1; + break; + + case 't': + tflag = 1; + break; + + case 'v': + vflag = 1; + break; + + case 'V': + printf("%s - %s\n", myname, VERSION); + exit(EXIT_SUCCESS); + + case 'y': + /* noop for bison compatibility. byacc is already designed to be posix + * yacc compatible. */ + break; + + default: + usage(); + } +} + +static void +getargs(int argc, char *argv[]) +{ + int i; + char *s; + int ch; + + if (argc > 0) + myname = argv[0]; + + for (i = 1; i < argc; ++i) + { + s = argv[i]; + if (*s != '-') + break; + switch (ch = *++s) + { + case '\0': + input_file = stdin; + if (i + 1 < argc) + usage(); + return; + + case '-': + ++i; + goto no_more_options; + + case 'b': + if (*++s) + file_prefix = s; + else if (++i < argc) + file_prefix = argv[i]; + else + usage(); + continue; + + case 'o': + if (*++s) + output_file_name = s; + else if (++i < argc) + output_file_name = argv[i]; + else + usage(); + continue; + + case 'p': + if (*++s) + symbol_prefix = s; + else if (++i < argc) + symbol_prefix = argv[i]; + else + usage(); + continue; + + default: + setflag(ch); + break; + } + + for (;;) + { + switch (ch = *++s) + { + case '\0': + goto end_of_option; + + default: + setflag(ch); + break; + } + } + end_of_option:; + } + + no_more_options:; + if (i + 1 != argc) + usage(); + input_file_name = argv[i]; +} + +void * +allocate(size_t n) +{ + void *p; + + p = NULL; + if (n) + { + p = CALLOC(1, n); + NO_SPACE(p); + } + return (p); +} + +#define CREATE_FILE_NAME(dest, suffix) \ + dest = MALLOC(len + strlen(suffix) + 1); \ + NO_SPACE(dest); \ + strcpy(dest, file_prefix); \ + strcpy(dest + len, suffix) + +static void +create_file_names(void) +{ + size_t len; + const char *defines_suffix; + const char *externs_suffix; + char *prefix; + + prefix = NULL; + defines_suffix = DEFINES_SUFFIX; + externs_suffix = EXTERNS_SUFFIX; + + /* compute the file_prefix from the user provided output_file_name */ + if (output_file_name != 0) + { + if (!(prefix = strstr(output_file_name, ".tab.c")) + && (prefix = strstr(output_file_name, ".c"))) + { + defines_suffix = ".h"; + externs_suffix = ".i"; + } + } + + if (prefix != NULL) + { + len = (size_t) (prefix - output_file_name); + file_prefix = (char *)MALLOC(len + 1); + NO_SPACE(file_prefix); + strncpy(file_prefix, output_file_name, len)[len] = 0; + } + else + len = strlen(file_prefix); + + /* if "-o filename" was not given */ + if (output_file_name == 0) + { + oflag = 1; + CREATE_FILE_NAME(output_file_name, OUTPUT_SUFFIX); + } + + if (rflag) + { + CREATE_FILE_NAME(code_file_name, CODE_SUFFIX); + } + else + code_file_name = output_file_name; + + if (dflag) + { + CREATE_FILE_NAME(defines_file_name, defines_suffix); + } + + if (iflag) + { + CREATE_FILE_NAME(externs_file_name, externs_suffix); + } + + if (vflag) + { + CREATE_FILE_NAME(verbose_file_name, VERBOSE_SUFFIX); + } + + if (gflag) + { + CREATE_FILE_NAME(graph_file_name, GRAPH_SUFFIX); + } + + if (prefix != NULL) + { + FREE(file_prefix); + } +} + +#if USE_MKSTEMP +static void +close_tmpfiles(void) +{ + while (my_tmpfiles != 0) + { + MY_TMPFILES *next = my_tmpfiles->next; + + chmod(my_tmpfiles->name, 0644); + unlink(my_tmpfiles->name); + + free(my_tmpfiles->name); + free(my_tmpfiles); + + my_tmpfiles = next; + } +} + +#ifndef HAVE_MKSTEMP +static int +my_mkstemp(char *temp) +{ + int fd; + char *dname; + char *fname; + char *name; + + /* + * Split-up to use tempnam, rather than tmpnam; the latter (like + * mkstemp) is unusable on Windows. + */ + if ((fname = strrchr(temp, '/')) != 0) + { + dname = strdup(temp); + dname[++fname - temp] = '\0'; + } + else + { + dname = 0; + fname = temp; + } + if ((name = tempnam(dname, fname)) != 0) + { + fd = open(name, O_CREAT | O_EXCL | O_RDWR); + strcpy(temp, name); + } + else + { + fd = -1; + } + + if (dname != 0) + free(dname); + + return fd; +} +#define mkstemp(s) my_mkstemp(s) +#endif + +#endif + +/* + * tmpfile() should be adequate, except that it may require special privileges + * to use, e.g., MinGW and Windows 7 where it tries to use the root directory. + */ +static FILE * +open_tmpfile(const char *label) +{ + FILE *result; +#if USE_MKSTEMP + int fd; + const char *tmpdir; + char *name; + const char *mark; + + if ((tmpdir = getenv("TMPDIR")) == 0 || access(tmpdir, W_OK) != 0) + { +#ifdef P_tmpdir + tmpdir = P_tmpdir; +#else + tmpdir = "/tmp"; +#endif + if (access(tmpdir, W_OK) != 0) + tmpdir = "."; + } + + name = malloc(strlen(tmpdir) + 10 + strlen(label)); + + result = 0; + if (name != 0) + { + if ((mark = strrchr(label, '_')) == 0) + mark = label + strlen(label); + + sprintf(name, "%s/%.*sXXXXXX", tmpdir, (int)(mark - label), label); + fd = mkstemp(name); + if (fd >= 0) + { + result = fdopen(fd, "w+"); + if (result != 0) + { + MY_TMPFILES *item; + + if (my_tmpfiles == 0) + { + atexit(close_tmpfiles); + } + + item = NEW(MY_TMPFILES); + NO_SPACE(item); + + item->name = name; + NO_SPACE(item->name); + + item->next = my_tmpfiles; + my_tmpfiles = item; + } + } + } +#else + result = tmpfile(); +#endif + + if (result == 0) + open_error(label); + return result; +} + +static void +open_files(void) +{ + create_file_names(); + + if (input_file == 0) + { + input_file = fopen(input_file_name, "r"); + if (input_file == 0) + open_error(input_file_name); + } + + action_file = open_tmpfile("action_file"); + text_file = open_tmpfile("text_file"); + + if (vflag) + { + verbose_file = fopen(verbose_file_name, "w"); + if (verbose_file == 0) + open_error(verbose_file_name); + } + + if (gflag) + { + graph_file = fopen(graph_file_name, "w"); + if (graph_file == 0) + open_error(graph_file_name); + fprintf(graph_file, "digraph %s {\n", file_prefix); + fprintf(graph_file, "\tedge [fontsize=10];\n"); + fprintf(graph_file, "\tnode [shape=box,fontsize=10];\n"); + fprintf(graph_file, "\torientation=landscape;\n"); + fprintf(graph_file, "\trankdir=LR;\n"); + fprintf(graph_file, "\t/*\n"); + fprintf(graph_file, "\tmargin=0.2;\n"); + fprintf(graph_file, "\tpage=\"8.27,11.69\"; // for A4 printing\n"); + fprintf(graph_file, "\tratio=auto;\n"); + fprintf(graph_file, "\t*/\n"); + } + + if (dflag) + { + defines_file = fopen(defines_file_name, "w"); + if (defines_file == 0) + open_error(defines_file_name); + union_file = open_tmpfile("union_file"); + } + + if (iflag) + { + externs_file = fopen(externs_file_name, "w"); + if (externs_file == 0) + open_error(externs_file_name); + } + + output_file = fopen(output_file_name, "w"); + if (output_file == 0) + open_error(output_file_name); + + if (rflag) + { + code_file = fopen(code_file_name, "w"); + if (code_file == 0) + open_error(code_file_name); + } + else + code_file = output_file; +} + +int +main(int argc, char *argv[]) +{ + SRexpect = -1; + RRexpect = -1; + exit_code = EXIT_SUCCESS; + + set_signals(); + getargs(argc, argv); + open_files(); + reader(); + lr0(); + lalr(); + make_parser(); + graph(); + finalize_closure(); + verbose(); + output(); + done(exit_code); + /*NOTREACHED */ +} diff --git a/contrib/byacc/makefile.in b/contrib/byacc/makefile.in new file mode 100644 index 00000000000..87395485767 --- /dev/null +++ b/contrib/byacc/makefile.in @@ -0,0 +1,182 @@ +# $Id: makefile.in,v 1.17 2012/01/15 19:11:21 tom Exp $ +# +# UNIX template-makefile for Berkeley Yacc + +THIS = yacc + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +VPATH = @srcdir@ + +CC = @CC@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +transform = @program_transform_name@ + +DEFINES = +EXTRA_CFLAGS = @EXTRA_CFLAGS@ +CPPFLAGS = -I. -I$(srcdir) $(DEFINES) -DHAVE_CONFIG_H -DYYPATCH=`cat $(srcdir)/VERSION` @CPPFLAGS@ +CFLAGS = @CFLAGS@ $(CPPFLAGS) $(EXTRA_CFLAGS) + +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ + +CTAGS = @CTAGS@ +ETAGS = @ETAGS@ +LINT = @LINT@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = $(DESTDIR)@bindir@ +mandir = $(DESTDIR)@mandir@/man1 +manext = 1 + +testdir = $(srcdir)/test + +x = @EXEEXT@ +o = .@OBJEXT@ + +#### End of system configuration section. #### + +SHELL = /bin/sh +@SET_MAKE@ + +H_FILES = \ + defs.h + +C_FILES = \ + closure.c \ + error.c \ + graph.c \ + lalr.c \ + lr0.c \ + main.c \ + mkpar.c \ + output.c \ + reader.c \ + skeleton.c \ + symtab.c \ + verbose.c \ + warshall.c + +OBJS = \ + closure$o \ + error$o \ + graph$o \ + lalr$o \ + lr0$o \ + main$o \ + mkpar$o \ + output$o \ + reader$o \ + skeleton$o \ + symtab$o \ + verbose$o \ + warshall$o + +TRANSFORM_BIN = sed 's/$x$$//' |sed '$(transform)'|sed 's/$$/$x/' +TRANSFORM_MAN = sed 's/$(manext)$$//'|sed '$(transform)'|sed 's/$$/$(manext)/' + +actual_bin = `echo $(THIS)$x | $(TRANSFORM_BIN)` +actual_man = `echo $(THIS).$(manext)| $(TRANSFORM_MAN)` + +all : $(THIS)$x + +install: all installdirs + $(INSTALL_PROGRAM) $(THIS)$x $(bindir)/$(actual_bin) + - $(INSTALL_DATA) $(srcdir)/$(THIS).1 $(mandir)/$(actual_man) + +installdirs: + mkdir -p $(bindir) + - mkdir -p $(mandir) + +uninstall: + - rm -f $(bindir)/$(actual_bin) + - rm -f $(mandir)/$(actual_man) + +################################################################################ +.SUFFIXES : $o .i .html .$(manext) .cat .ps .pdf .txt + +.c$o: + @RULE_CC@ + @ECHO_CC@$(CC) -c $(CFLAGS) $< + +.c.i : + @RULE_CC@ + @ECHO_CC@$(CPP) -C $(CPPFLAGS) $*.c >$@ + +.$(manext).cat : + - nroff -man $(srcdir)/$(THIS).$(manext) >$@ + +.$(manext).html : + GROFF_NO_SGR=stupid $(SHELL) -c "tbl $*.$(manext) | groff -Thtml -man" >$@ + +.$(manext).ps : + $(SHELL) -c "tbl $*.$(manext) | groff -man" >$@ + +.$(manext).txt : + GROFF_NO_SGR=stupid $(SHELL) -c "tbl $*.$(manext) | nroff -Tascii -man | col -bx" >$@ + +.ps.pdf : + ps2pdf $*.ps + +################################################################################ + +$(THIS)$x : $(OBJS) + @ECHO_LD@$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(OBJS) $(LIBS) + +mostlyclean : + - rm -f core .nfs* *$o *.bak *.BAK *.out + +clean : mostlyclean + - rm -f $(THIS)$x + +distclean : clean + - rm -f config.log config.cache config.status config.h makefile + - rm -f *.html *.cat *.pdf *.ps *.txt + - cd test && rm -f test-* + +realclean: distclean + - rm -f tags TAGS + +################################################################################ +docs :: $(THIS).html \ + $(THIS).pdf \ + $(THIS).ps \ + $(THIS).txt +$(THIS).html : $(THIS).$(manext) +$(THIS).pdf : $(THIS).ps +$(THIS).ps : $(THIS).$(manext) +$(THIS).txt : $(THIS).$(manext) +################################################################################ +check: $(THIS)$x + $(SHELL) $(testdir)/run_test.sh $(testdir) + +check_make: $(THIS)$x + $(SHELL) $(testdir)/run_make.sh $(testdir) + +check_lint: + $(SHELL) $(testdir)/run_lint.sh $(testdir) +################################################################################ +tags: $(H_FILES) $(C_FILES) + $(CTAGS) $(C_FILES) $(H_FILES) + +lint: $(C_FILES) + $(LINT) $(CPPFLAGS) $(C_FILES) + +@MAKE_UPPER_TAGS@TAGS: $(H_FILES) $(C_FILES) +@MAKE_UPPER_TAGS@ $(ETAGS) $(C_FILES) $(H_FILES) + +depend: + makedepend -- $(CPPFLAGS) -- $(C_FILES) + +$(OBJS) : defs.h + +main$o \ +skeleton$o : makefile VERSION + +# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/usr.bin/yacc/mkpar.c b/contrib/byacc/mkpar.c similarity index 55% rename from usr.bin/yacc/mkpar.c rename to contrib/byacc/mkpar.c index e610310bf25..f9f2b5c2e85 100644 --- a/usr.bin/yacc/mkpar.c +++ b/contrib/byacc/mkpar.c @@ -1,72 +1,36 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ +/* $Id: mkpar.c,v 1.11 2010/06/09 08:53:17 tom Exp $ */ -#if 0 -#ifndef lint -static char sccsid[] = "@(#)mkpar.c 5.3 (Berkeley) 1/20/91"; -#endif -#endif -#include -__FBSDID("$FreeBSD$"); - -#include #include "defs.h" -action **parser; -int SRexpect; -int SRtotal; -int RRtotal; -short *SRconflicts; -short *RRconflicts; -short *defred; -short *rules_used; -short nunused; -short final_state; - -static int SRcount; -static int RRcount; - -static action *add_reduce(action *, int, int); -static action *add_reductions(int, action *); +static action *add_reduce(action *actions, int ruleno, int symbol); +static action *add_reductions(int stateno, action *actions); +static action *get_shifts(int stateno); +static action *parse_actions(int stateno); +static int sole_reduction(int stateno); static void defreds(void); static void find_final_state(void); -static void free_action_row(action *); -static action *get_shifts(int); -static action *parse_actions(int); +static void free_action_row(action *p); static void remove_conflicts(void); -static int sole_reduction(int); static void total_conflicts(void); static void unused_rules(void); +action **parser; + +int SRexpect; +int RRexpect; + +int SRtotal; +int RRtotal; + +Value_t *SRconflicts; +Value_t *RRconflicts; +Value_t *defred; +Value_t *rules_used; +Value_t nunused; +Value_t final_state; + +static Value_t SRcount; +static Value_t RRcount; void make_parser(void) @@ -80,11 +44,11 @@ make_parser(void) find_final_state(); remove_conflicts(); unused_rules(); - if (SRtotal + RRtotal > 0) total_conflicts(); + if (SRtotal + RRtotal > 0) + total_conflicts(); defreds(); } - static action * parse_actions(int stateno) { @@ -95,24 +59,23 @@ parse_actions(int stateno) return (actions); } - static action * get_shifts(int stateno) { action *actions, *temp; shifts *sp; - short *tostate; - int i, k; - int symbol; + Value_t *to_state2; + Value_t i, k; + Value_t symbol; actions = 0; sp = shift_table[stateno]; if (sp) { - tostate = sp->shift; - for (i = sp->nshifts - 1; i >= 0; i--) + to_state2 = sp->shift; + for (i = (Value_t) (sp->nshifts - 1); i >= 0; i--) { - k = tostate[i]; + k = to_state2[i]; symbol = accessing_symbol[k]; if (ISTOKEN(symbol)) { @@ -153,9 +116,10 @@ add_reductions(int stateno, action *actions) return (actions); } - static action * -add_reduce(action *actions, int ruleno, int symbol) +add_reduce(action *actions, + int ruleno, + int symbol) { action *temp, *prev, *next; @@ -170,7 +134,7 @@ add_reduce(action *actions, int ruleno, int symbol) } while (next && next->symbol == symbol && - next->action_code == REDUCE && next->number < ruleno) + next->action_code == REDUCE && next->number < ruleno) { prev = next; next = next->next; @@ -178,8 +142,8 @@ add_reduce(action *actions, int ruleno, int symbol) temp = NEW(action); temp->next = next; - temp->symbol = symbol; - temp->number = ruleno; + temp->symbol = (Value_t) symbol; + temp->number = (Value_t) ruleno; temp->prec = rprec[ruleno]; temp->action_code = REDUCE; temp->assoc = rassoc[ruleno]; @@ -192,33 +156,32 @@ add_reduce(action *actions, int ruleno, int symbol) return (actions); } - static void find_final_state(void) { int goal, i; - short *tostate; + Value_t *to_state2; shifts *p; p = shift_table[0]; - tostate = p->shift; + to_state2 = p->shift; goal = ritem[1]; for (i = p->nshifts - 1; i >= 0; --i) { - final_state = tostate[i]; - if (accessing_symbol[final_state] == goal) break; + final_state = to_state2[i]; + if (accessing_symbol[final_state] == goal) + break; } } - static void unused_rules(void) { int i; action *p; - rules_used = malloc(nrules*sizeof(short)); - if (rules_used == 0) no_space(); + rules_used = (Value_t *) MALLOC((unsigned)nrules * sizeof(Value_t)); + NO_SPACE(rules_used); for (i = 0; i < nrules; ++i) rules_used[i] = 0; @@ -234,29 +197,29 @@ unused_rules(void) nunused = 0; for (i = 3; i < nrules; ++i) - if (!rules_used[i]) ++nunused; + if (!rules_used[i]) + ++nunused; - if (nunused) { + if (nunused) + { if (nunused == 1) - warnx("1 rule never reduced"); + fprintf(stderr, "%s: 1 rule never reduced\n", myname); else - warnx("%d rules never reduced", nunused); + fprintf(stderr, "%s: %d rules never reduced\n", myname, nunused); } } - static void remove_conflicts(void) { int i; int symbol; - action *p, *pref; + action *p, *pref = 0; - pref = NULL; SRtotal = 0; RRtotal = 0; - SRconflicts = NEW2(nstates, short); - RRconflicts = NEW2(nstates, short); + SRconflicts = NEW2(nstates, Value_t); + RRconflicts = NEW2(nstates, Value_t); for (i = 0; i < nstates; i++) { SRcount = 0; @@ -274,7 +237,7 @@ remove_conflicts(void) SRcount++; p->suppressed = 1; } - else if (pref->action_code == SHIFT) + else if (pref != 0 && pref->action_code == SHIFT) { if (pref->prec > 0 && p->prec > 0) { @@ -321,25 +284,40 @@ remove_conflicts(void) } } - static void total_conflicts(void) { - /* Warn if s/r != expect or if any r/r */ - if ((SRtotal != SRexpect) || RRtotal) - { - if (SRtotal == 1) - warnx("1 shift/reduce conflict"); - else if (SRtotal > 1) - warnx("%d shift/reduce conflicts", SRtotal); - } + fprintf(stderr, "%s: ", myname); + if (SRtotal == 1) + fprintf(stderr, "1 shift/reduce conflict"); + else if (SRtotal > 1) + fprintf(stderr, "%d shift/reduce conflicts", SRtotal); + + if (SRtotal && RRtotal) + fprintf(stderr, ", "); if (RRtotal == 1) - warnx("1 reduce/reduce conflict"); + fprintf(stderr, "1 reduce/reduce conflict"); else if (RRtotal > 1) - warnx("%d reduce/reduce conflicts", RRtotal); -} + fprintf(stderr, "%d reduce/reduce conflicts", RRtotal); + fprintf(stderr, ".\n"); + + if (SRexpect >= 0 && SRtotal != SRexpect) + { + fprintf(stderr, "%s: ", myname); + fprintf(stderr, "expected %d shift/reduce conflict%s.\n", + SRexpect, PLURAL(SRexpect)); + exit_code = EXIT_FAILURE; + } + if (RRexpect >= 0 && RRtotal != RRexpect) + { + fprintf(stderr, "%s: ", myname); + fprintf(stderr, "expected %d reduce/reduce conflict%s.\n", + RRexpect, PLURAL(RRexpect)); + exit_code = EXIT_FAILURE; + } +} static int sole_reduction(int stateno) @@ -368,37 +346,47 @@ sole_reduction(int stateno) return (ruleno); } - static void defreds(void) { int i; - defred = NEW2(nstates, short); + defred = NEW2(nstates, Value_t); for (i = 0; i < nstates; i++) - defred[i] = sole_reduction(i); + defred[i] = (Value_t) sole_reduction(i); } static void free_action_row(action *p) { - action *q; + action *q; - while (p) + while (p) { - q = p->next; - free(p); - p = q; + q = p->next; + FREE(p); + p = q; } } void free_parser(void) { - int i; + int i; - for (i = 0; i < nstates; i++) - free_action_row(parser[i]); + for (i = 0; i < nstates; i++) + free_action_row(parser[i]); - free(parser); + FREE(parser); } + +#ifdef NO_LEAKS +void +mkpar_leaks(void) +{ + DO_FREE(defred); + DO_FREE(rules_used); + DO_FREE(SRconflicts); + DO_FREE(RRconflicts); +} +#endif diff --git a/contrib/byacc/output.c b/contrib/byacc/output.c new file mode 100644 index 00000000000..33b10c6c5df --- /dev/null +++ b/contrib/byacc/output.c @@ -0,0 +1,1507 @@ +/* $Id: output.c,v 1.43 2012/01/14 17:03:52 tom Exp $ */ + +#include "defs.h" + +#define StaticOrR (rflag ? "" : "static ") +#define CountLine(fp) (!rflag || ((fp) == code_file)) + +static int nvectors; +static int nentries; +static Value_t **froms; +static Value_t **tos; +static Value_t *tally; +static Value_t *width; +static Value_t *state_count; +static Value_t *order; +static Value_t *base; +static Value_t *pos; +static int maxtable; +static Value_t *table; +static Value_t *check; +static int lowzero; +static int high; + +static void +putc_code(FILE * fp, int c) +{ + if ((c == '\n') && (fp == code_file)) + ++outline; + putc(c, fp); +} + +static void +putl_code(FILE * fp, const char *s) +{ + if (fp == code_file) + ++outline; + fputs(s, fp); +} + +static void +puts_code(FILE * fp, const char *s) +{ + fputs(s, fp); +} + +static void +write_code_lineno(FILE * fp) +{ + if (!lflag && (fp == code_file)) + { + ++outline; + fprintf(fp, line_format, outline, code_file_name); + } +} + +static void +write_input_lineno(void) +{ + if (!lflag) + { + ++outline; + fprintf(code_file, line_format, lineno, input_file_name); + } +} + +static void +define_prefixed(FILE * fp, const char *name) +{ + int bump_line = CountLine(fp); + if (bump_line) + ++outline; + fprintf(fp, "\n"); + + if (bump_line) + ++outline; + fprintf(fp, "#ifndef %s\n", name); + + if (bump_line) + ++outline; + fprintf(fp, "#define %-10s %s%s\n", name, symbol_prefix, name + 2); + + if (bump_line) + ++outline; + fprintf(fp, "#endif /* %s */\n", name); +} + +static void +output_prefix(FILE * fp) +{ + if (symbol_prefix == NULL) + { + symbol_prefix = "yy"; + } + else + { + define_prefixed(fp, "yyparse"); + define_prefixed(fp, "yylex"); + define_prefixed(fp, "yyerror"); + define_prefixed(fp, "yychar"); + define_prefixed(fp, "yyval"); + define_prefixed(fp, "yylval"); + define_prefixed(fp, "yydebug"); + define_prefixed(fp, "yynerrs"); + define_prefixed(fp, "yyerrflag"); + define_prefixed(fp, "yylhs"); + define_prefixed(fp, "yylen"); + define_prefixed(fp, "yydefred"); + define_prefixed(fp, "yydgoto"); + define_prefixed(fp, "yysindex"); + define_prefixed(fp, "yyrindex"); + define_prefixed(fp, "yygindex"); + define_prefixed(fp, "yytable"); + define_prefixed(fp, "yycheck"); + define_prefixed(fp, "yyname"); + define_prefixed(fp, "yyrule"); + } + if (CountLine(fp)) + ++outline; + fprintf(fp, "#define YYPREFIX \"%s\"\n", symbol_prefix); +} + +static void +output_newline(void) +{ + if (!rflag) + ++outline; + putc('\n', output_file); +} + +static void +output_line(const char *value) +{ + fputs(value, output_file); + output_newline(); +} + +static void +output_int(int value) +{ + fprintf(output_file, "%5d,", value); +} + +static void +start_int_table(const char *name, int value) +{ + int need = 34 - (int)(strlen(symbol_prefix) + strlen(name)); + + if (need < 6) + need = 6; + fprintf(output_file, + "%sconst short %s%s[] = {%*d,", + StaticOrR, symbol_prefix, name, need, value); +} + +static void +start_str_table(const char *name) +{ + fprintf(output_file, + "%sconst char *%s%s[] = {", + StaticOrR, "yy", name); + output_newline(); +} + +static void +end_table(void) +{ + output_newline(); + output_line("};"); +} + +static void +output_rule_data(void) +{ + int i; + int j; + + start_int_table("lhs", symbol_value[start_symbol]); + + j = 10; + for (i = 3; i < nrules; i++) + { + if (j >= 10) + { + output_newline(); + j = 1; + } + else + ++j; + + output_int(symbol_value[rlhs[i]]); + } + end_table(); + + start_int_table("len", 2); + + j = 10; + for (i = 3; i < nrules; i++) + { + if (j >= 10) + { + output_newline(); + j = 1; + } + else + j++; + + output_int(rrhs[i + 1] - rrhs[i] - 1); + } + end_table(); +} + +static void +output_yydefred(void) +{ + int i, j; + + start_int_table("defred", (defred[0] ? defred[0] - 2 : 0)); + + j = 10; + for (i = 1; i < nstates; i++) + { + if (j < 10) + ++j; + else + { + output_newline(); + j = 1; + } + + output_int((defred[i] ? defred[i] - 2 : 0)); + } + + end_table(); +} + +static void +token_actions(void) +{ + int i, j; + Value_t shiftcount, reducecount; + int max, min; + Value_t *actionrow, *r, *s; + action *p; + + actionrow = NEW2(2 * ntokens, Value_t); + for (i = 0; i < nstates; ++i) + { + if (parser[i]) + { + for (j = 0; j < 2 * ntokens; ++j) + actionrow[j] = 0; + + shiftcount = 0; + reducecount = 0; + for (p = parser[i]; p; p = p->next) + { + if (p->suppressed == 0) + { + if (p->action_code == SHIFT) + { + ++shiftcount; + actionrow[p->symbol] = p->number; + } + else if (p->action_code == REDUCE && p->number != defred[i]) + { + ++reducecount; + actionrow[p->symbol + ntokens] = p->number; + } + } + } + + tally[i] = shiftcount; + tally[nstates + i] = reducecount; + width[i] = 0; + width[nstates + i] = 0; + if (shiftcount > 0) + { + froms[i] = r = NEW2(shiftcount, Value_t); + tos[i] = s = NEW2(shiftcount, Value_t); + min = MAXSHORT; + max = 0; + for (j = 0; j < ntokens; ++j) + { + if (actionrow[j]) + { + if (min > symbol_value[j]) + min = symbol_value[j]; + if (max < symbol_value[j]) + max = symbol_value[j]; + *r++ = symbol_value[j]; + *s++ = actionrow[j]; + } + } + width[i] = (Value_t) (max - min + 1); + } + if (reducecount > 0) + { + froms[nstates + i] = r = NEW2(reducecount, Value_t); + tos[nstates + i] = s = NEW2(reducecount, Value_t); + min = MAXSHORT; + max = 0; + for (j = 0; j < ntokens; ++j) + { + if (actionrow[ntokens + j]) + { + if (min > symbol_value[j]) + min = symbol_value[j]; + if (max < symbol_value[j]) + max = symbol_value[j]; + *r++ = symbol_value[j]; + *s++ = (Value_t) (actionrow[ntokens + j] - 2); + } + } + width[nstates + i] = (Value_t) (max - min + 1); + } + } + } + FREE(actionrow); +} + +static int +default_goto(int symbol) +{ + int i; + int m; + int n; + int default_state; + int max; + + m = goto_map[symbol]; + n = goto_map[symbol + 1]; + + if (m == n) + return (0); + + for (i = 0; i < nstates; i++) + state_count[i] = 0; + + for (i = m; i < n; i++) + state_count[to_state[i]]++; + + max = 0; + default_state = 0; + for (i = 0; i < nstates; i++) + { + if (state_count[i] > max) + { + max = state_count[i]; + default_state = i; + } + } + + return (default_state); +} + +static void +save_column(int symbol, int default_state) +{ + int i; + int m; + int n; + Value_t *sp; + Value_t *sp1; + Value_t *sp2; + Value_t count; + int symno; + + m = goto_map[symbol]; + n = goto_map[symbol + 1]; + + count = 0; + for (i = m; i < n; i++) + { + if (to_state[i] != default_state) + ++count; + } + if (count == 0) + return; + + symno = symbol_value[symbol] + 2 * nstates; + + froms[symno] = sp1 = sp = NEW2(count, Value_t); + tos[symno] = sp2 = NEW2(count, Value_t); + + for (i = m; i < n; i++) + { + if (to_state[i] != default_state) + { + *sp1++ = from_state[i]; + *sp2++ = to_state[i]; + } + } + + tally[symno] = count; + width[symno] = (Value_t) (sp1[-1] - sp[0] + 1); +} + +static void +goto_actions(void) +{ + int i, j, k; + + state_count = NEW2(nstates, Value_t); + + k = default_goto(start_symbol + 1); + start_int_table("dgoto", k); + save_column(start_symbol + 1, k); + + j = 10; + for (i = start_symbol + 2; i < nsyms; i++) + { + if (j >= 10) + { + output_newline(); + j = 1; + } + else + ++j; + + k = default_goto(i); + output_int(k); + save_column(i, k); + } + + end_table(); + FREE(state_count); +} + +static void +sort_actions(void) +{ + Value_t i; + int j; + int k; + int t; + int w; + + order = NEW2(nvectors, Value_t); + nentries = 0; + + for (i = 0; i < nvectors; i++) + { + if (tally[i] > 0) + { + t = tally[i]; + w = width[i]; + j = nentries - 1; + + while (j >= 0 && (width[order[j]] < w)) + j--; + + while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t)) + j--; + + for (k = nentries - 1; k > j; k--) + order[k + 1] = order[k]; + + order[j + 1] = i; + nentries++; + } + } +} + +/* The function matching_vector determines if the vector specified by */ +/* the input parameter matches a previously considered vector. The */ +/* test at the start of the function checks if the vector represents */ +/* a row of shifts over terminal symbols or a row of reductions, or a */ +/* column of shifts over a nonterminal symbol. Berkeley Yacc does not */ +/* check if a column of shifts over a nonterminal symbols matches a */ +/* previously considered vector. Because of the nature of LR parsing */ +/* tables, no two columns can match. Therefore, the only possible */ +/* match would be between a row and a column. Such matches are */ +/* unlikely. Therefore, to save time, no attempt is made to see if a */ +/* column matches a previously considered vector. */ +/* */ +/* Matching_vector is poorly designed. The test could easily be made */ +/* faster. Also, it depends on the vectors being in a specific */ +/* order. */ + +static int +matching_vector(int vector) +{ + int i; + int j; + int k; + int t; + int w; + int match; + int prev; + + i = order[vector]; + if (i >= 2 * nstates) + return (-1); + + t = tally[i]; + w = width[i]; + + for (prev = vector - 1; prev >= 0; prev--) + { + j = order[prev]; + if (width[j] != w || tally[j] != t) + return (-1); + + match = 1; + for (k = 0; match && k < t; k++) + { + if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k]) + match = 0; + } + + if (match) + return (j); + } + + return (-1); +} + +static int +pack_vector(int vector) +{ + int i, j, k, l; + int t; + int loc; + int ok; + Value_t *from; + Value_t *to; + int newmax; + + i = order[vector]; + t = tally[i]; + assert(t); + + from = froms[i]; + to = tos[i]; + + j = lowzero - from[0]; + for (k = 1; k < t; ++k) + if (lowzero - from[k] > j) + j = lowzero - from[k]; + for (;; ++j) + { + if (j == 0) + continue; + ok = 1; + for (k = 0; ok && k < t; k++) + { + loc = j + from[k]; + if (loc >= maxtable - 1) + { + if (loc >= MAXTABLE - 1) + fatal("maximum table size exceeded"); + + newmax = maxtable; + do + { + newmax += 200; + } + while (newmax <= loc); + + table = (Value_t *) REALLOC(table, (unsigned)newmax * sizeof(Value_t)); + NO_SPACE(table); + + check = (Value_t *) REALLOC(check, (unsigned)newmax * sizeof(Value_t)); + NO_SPACE(check); + + for (l = maxtable; l < newmax; ++l) + { + table[l] = 0; + check[l] = -1; + } + maxtable = newmax; + } + + if (check[loc] != -1) + ok = 0; + } + for (k = 0; ok && k < vector; k++) + { + if (pos[k] == j) + ok = 0; + } + if (ok) + { + for (k = 0; k < t; k++) + { + loc = j + from[k]; + table[loc] = to[k]; + check[loc] = from[k]; + if (loc > high) + high = loc; + } + + while (check[lowzero] != -1) + ++lowzero; + + return (j); + } + } +} + +static void +pack_table(void) +{ + int i; + Value_t place; + int state; + + base = NEW2(nvectors, Value_t); + pos = NEW2(nentries, Value_t); + + maxtable = 1000; + table = NEW2(maxtable, Value_t); + check = NEW2(maxtable, Value_t); + + lowzero = 0; + high = 0; + + for (i = 0; i < maxtable; i++) + check[i] = -1; + + for (i = 0; i < nentries; i++) + { + state = matching_vector(i); + + if (state < 0) + place = (Value_t) pack_vector(i); + else + place = base[state]; + + pos[i] = place; + base[order[i]] = place; + } + + for (i = 0; i < nvectors; i++) + { + if (froms[i]) + FREE(froms[i]); + if (tos[i]) + FREE(tos[i]); + } + + FREE(froms); + FREE(tos); + FREE(pos); +} + +static void +output_base(void) +{ + int i, j; + + start_int_table("sindex", base[0]); + + j = 10; + for (i = 1; i < nstates; i++) + { + if (j >= 10) + { + output_newline(); + j = 1; + } + else + ++j; + + output_int(base[i]); + } + + end_table(); + + start_int_table("rindex", base[nstates]); + + j = 10; + for (i = nstates + 1; i < 2 * nstates; i++) + { + if (j >= 10) + { + output_newline(); + j = 1; + } + else + ++j; + + output_int(base[i]); + } + + end_table(); + + start_int_table("gindex", base[2 * nstates]); + + j = 10; + for (i = 2 * nstates + 1; i < nvectors - 1; i++) + { + if (j >= 10) + { + output_newline(); + j = 1; + } + else + ++j; + + output_int(base[i]); + } + + end_table(); + FREE(base); +} + +static void +output_table(void) +{ + int i; + int j; + + ++outline; + fprintf(code_file, "#define YYTABLESIZE %d\n", high); + start_int_table("table", table[0]); + + j = 10; + for (i = 1; i <= high; i++) + { + if (j >= 10) + { + output_newline(); + j = 1; + } + else + ++j; + + output_int(table[i]); + } + + end_table(); + FREE(table); +} + +static void +output_check(void) +{ + int i; + int j; + + start_int_table("check", check[0]); + + j = 10; + for (i = 1; i <= high; i++) + { + if (j >= 10) + { + output_newline(); + j = 1; + } + else + ++j; + + output_int(check[i]); + } + + end_table(); + FREE(check); +} + +static void +output_actions(void) +{ + nvectors = 2 * nstates + nvars; + + froms = NEW2(nvectors, Value_t *); + tos = NEW2(nvectors, Value_t *); + tally = NEW2(nvectors, Value_t); + width = NEW2(nvectors, Value_t); + + token_actions(); + FREE(lookaheads); + FREE(LA); + FREE(LAruleno); + FREE(accessing_symbol); + + goto_actions(); + FREE(goto_map + ntokens); + FREE(from_state); + FREE(to_state); + + sort_actions(); + pack_table(); + output_base(); + output_table(); + output_check(); +} + +static int +is_C_identifier(char *name) +{ + char *s; + int c; + + s = name; + c = *s; + if (c == '"') + { + c = *++s; + if (!isalpha(c) && c != '_' && c != '$') + return (0); + while ((c = *++s) != '"') + { + if (!isalnum(c) && c != '_' && c != '$') + return (0); + } + return (1); + } + + if (!isalpha(c) && c != '_' && c != '$') + return (0); + while ((c = *++s) != 0) + { + if (!isalnum(c) && c != '_' && c != '$') + return (0); + } + return (1); +} + +static void +output_defines(FILE * fp) +{ + int c, i; + char *s; + + for (i = 2; i < ntokens; ++i) + { + s = symbol_name[i]; + if (is_C_identifier(s) && (!sflag || *s != '"')) + { + fprintf(fp, "#define "); + c = *s; + if (c == '"') + { + while ((c = *++s) != '"') + { + putc(c, fp); + } + } + else + { + do + { + putc(c, fp); + } + while ((c = *++s) != 0); + } + if (fp == code_file) + ++outline; + fprintf(fp, " %d\n", symbol_value[i]); + } + } + + if (fp == code_file) + ++outline; + if (fp != defines_file || iflag) + fprintf(fp, "#define YYERRCODE %d\n", symbol_value[1]); + + if (fp == defines_file || (iflag && !dflag)) + { + if (unionized) + { + rewind(union_file); + while ((c = getc(union_file)) != EOF) + putc(c, fp); + fprintf(fp, "extern YYSTYPE %slval;\n", symbol_prefix); + } + } +} + +static void +output_stored_text(FILE * fp) +{ + int c; + FILE *in; + + rewind(text_file); + if (text_file == NULL) + open_error("text_file"); + in = text_file; + if ((c = getc(in)) == EOF) + return; + putc_code(fp, c); + while ((c = getc(in)) != EOF) + { + putc_code(fp, c); + } + write_code_lineno(fp); +} + +static void +output_debug(void) +{ + int i, j, k, max; + const char **symnam; + const char *s; + + ++outline; + fprintf(code_file, "#define YYFINAL %d\n", final_state); + + putl_code(code_file, "#ifndef YYDEBUG\n"); + ++outline; + fprintf(code_file, "#define YYDEBUG %d\n", tflag); + putl_code(code_file, "#endif\n"); + + if (rflag) + { + fprintf(output_file, "#ifndef YYDEBUG\n"); + fprintf(output_file, "#define YYDEBUG %d\n", tflag); + fprintf(output_file, "#endif\n"); + } + + max = 0; + for (i = 2; i < ntokens; ++i) + if (symbol_value[i] > max) + max = symbol_value[i]; + + ++outline; + fprintf(code_file, "#define YYMAXTOKEN %d\n", max); + + symnam = (const char **)MALLOC((unsigned)(max + 1) * sizeof(char *)); + NO_SPACE(symnam); + + /* Note that it is not necessary to initialize the element */ + /* symnam[max]. */ + for (i = 0; i < max; ++i) + symnam[i] = 0; + for (i = ntokens - 1; i >= 2; --i) + symnam[symbol_value[i]] = symbol_name[i]; + symnam[0] = "end-of-file"; + + output_line("#if YYDEBUG"); + + start_str_table("name"); + j = 80; + for (i = 0; i <= max; ++i) + { + if ((s = symnam[i]) != 0) + { + if (s[0] == '"') + { + k = 7; + while (*++s != '"') + { + ++k; + if (*s == '\\') + { + k += 2; + if (*++s == '\\') + ++k; + } + } + j += k; + if (j > 80) + { + output_newline(); + j = k; + } + fprintf(output_file, "\"\\\""); + s = symnam[i]; + while (*++s != '"') + { + if (*s == '\\') + { + fprintf(output_file, "\\\\"); + if (*++s == '\\') + fprintf(output_file, "\\\\"); + else + putc(*s, output_file); + } + else + putc(*s, output_file); + } + fprintf(output_file, "\\\"\","); + } + else if (s[0] == '\'') + { + if (s[1] == '"') + { + j += 7; + if (j > 80) + { + output_newline(); + j = 7; + } + fprintf(output_file, "\"'\\\"'\","); + } + else + { + k = 5; + while (*++s != '\'') + { + ++k; + if (*s == '\\') + { + k += 2; + if (*++s == '\\') + ++k; + } + } + j += k; + if (j > 80) + { + output_newline(); + j = k; + } + fprintf(output_file, "\"'"); + s = symnam[i]; + while (*++s != '\'') + { + if (*s == '\\') + { + fprintf(output_file, "\\\\"); + if (*++s == '\\') + fprintf(output_file, "\\\\"); + else + putc(*s, output_file); + } + else + putc(*s, output_file); + } + fprintf(output_file, "'\","); + } + } + else + { + k = (int)strlen(s) + 3; + j += k; + if (j > 80) + { + output_newline(); + j = k; + } + putc('"', output_file); + do + { + putc(*s, output_file); + } + while (*++s); + fprintf(output_file, "\","); + } + } + else + { + j += 2; + if (j > 80) + { + output_newline(); + j = 2; + } + fprintf(output_file, "0,"); + } + } + end_table(); + FREE(symnam); + + start_str_table("rule"); + for (i = 2; i < nrules; ++i) + { + fprintf(output_file, "\"%s :", symbol_name[rlhs[i]]); + for (j = rrhs[i]; ritem[j] > 0; ++j) + { + s = symbol_name[ritem[j]]; + if (s[0] == '"') + { + fprintf(output_file, " \\\""); + while (*++s != '"') + { + if (*s == '\\') + { + if (s[1] == '\\') + fprintf(output_file, "\\\\\\\\"); + else + fprintf(output_file, "\\\\%c", s[1]); + ++s; + } + else + putc(*s, output_file); + } + fprintf(output_file, "\\\""); + } + else if (s[0] == '\'') + { + if (s[1] == '"') + fprintf(output_file, " '\\\"'"); + else if (s[1] == '\\') + { + if (s[2] == '\\') + fprintf(output_file, " '\\\\\\\\"); + else + fprintf(output_file, " '\\\\%c", s[2]); + s += 2; + while (*++s != '\'') + putc(*s, output_file); + putc('\'', output_file); + } + else + fprintf(output_file, " '%c'", s[1]); + } + else + fprintf(output_file, " %s", s); + } + fprintf(output_file, "\","); + output_newline(); + } + + end_table(); + output_line("#endif"); +} + +static void +output_pure_parser(FILE * fp) +{ + putc_code(fp, '\n'); + + if (fp == code_file) + outline += 1; + fprintf(fp, "#define YYPURE %d\n", pure_parser); + putc_code(fp, '\n'); +} + +static void +output_stype(FILE * fp) +{ + if (!unionized && ntags == 0) + { + putc_code(fp, '\n'); + putl_code(fp, "#ifndef YYSTYPE\n"); + putl_code(fp, "typedef int YYSTYPE;\n"); + putl_code(fp, "#endif\n"); + } +} + +static void +output_trailing_text(void) +{ + int c, last; + FILE *in; + + if (line == 0) + return; + + in = input_file; + c = *cptr; + if (c == '\n') + { + ++lineno; + if ((c = getc(in)) == EOF) + return; + write_input_lineno(); + putc_code(code_file, c); + last = c; + } + else + { + write_input_lineno(); + do + { + putc_code(code_file, c); + } + while ((c = *++cptr) != '\n'); + putc_code(code_file, c); + last = '\n'; + } + + while ((c = getc(in)) != EOF) + { + putc_code(code_file, c); + last = c; + } + + if (last != '\n') + { + putc_code(code_file, '\n'); + } + write_code_lineno(code_file); +} + +static void +output_semantic_actions(void) +{ + int c, last; + + rewind(action_file); + if ((c = getc(action_file)) == EOF) + return; + + last = c; + putc_code(code_file, c); + while ((c = getc(action_file)) != EOF) + { + putc_code(code_file, c); + last = c; + } + + if (last != '\n') + { + putc_code(code_file, '\n'); + } + + write_code_lineno(code_file); +} + +static void +output_parse_decl(FILE * fp) +{ + putl_code(fp, "\n"); + putl_code(fp, "/* compatibility with bison */\n"); + putl_code(fp, "#ifdef YYPARSE_PARAM\n"); + putl_code(fp, "/* compatibility with FreeBSD */\n"); + putl_code(fp, "# ifdef YYPARSE_PARAM_TYPE\n"); + putl_code(fp, + "# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)\n"); + putl_code(fp, "# else\n"); + putl_code(fp, "# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)\n"); + putl_code(fp, "# endif\n"); + putl_code(fp, "#else\n"); + + puts_code(fp, "# define YYPARSE_DECL() yyparse("); + if (!parse_param) + puts_code(fp, "void"); + else + { + param *p; + for (p = parse_param; p; p = p->next) + fprintf(fp, "%s %s%s%s", p->type, p->name, p->type2, + p->next ? ", " : ""); + } + putl_code(fp, ")\n"); + + putl_code(fp, "#endif\n"); +} + +static void +output_lex_decl(FILE * fp) +{ + putl_code(fp, "\n"); + putl_code(fp, "/* Parameters sent to lex. */\n"); + putl_code(fp, "#ifdef YYLEX_PARAM\n"); + if (pure_parser) + { + putl_code(fp, "# ifdef YYLEX_PARAM_TYPE\n"); + putl_code(fp, "# define YYLEX_DECL() yylex(YYSTYPE *yylval," + " YYLEX_PARAM_TYPE YYLEX_PARAM)\n"); + putl_code(fp, "# else\n"); + putl_code(fp, "# define YYLEX_DECL() yylex(YYSTYPE *yylval," + " void * YYLEX_PARAM)\n"); + putl_code(fp, "# endif\n"); + putl_code(fp, "# define YYLEX yylex(&yylval, YYLEX_PARAM)\n"); + } + else + { + putl_code(fp, "# define YYLEX_DECL() yylex(void *YYLEX_PARAM)\n"); + putl_code(fp, "# define YYLEX yylex(YYLEX_PARAM)\n"); + } + putl_code(fp, "#else\n"); + if (pure_parser && lex_param) + { + param *p; + puts_code(fp, "# define YYLEX_DECL() yylex(YYSTYPE *yylval, "); + for (p = lex_param; p; p = p->next) + fprintf(fp, "%s %s%s%s", p->type, p->name, p->type2, + p->next ? ", " : ""); + putl_code(fp, ")\n"); + + puts_code(fp, "# define YYLEX yylex(&yylval, "); + for (p = lex_param; p; p = p->next) + fprintf(fp, "%s%s", p->name, p->next ? ", " : ""); + putl_code(fp, ")\n"); + } + else if (pure_parser) + { + putl_code(fp, "# define YYLEX_DECL() yylex(YYSTYPE *yylval)\n"); + putl_code(fp, "# define YYLEX yylex(&yylval)\n"); + } + else if (lex_param) + { + param *p; + puts_code(fp, "# define YYLEX_DECL() yylex("); + for (p = lex_param; p; p = p->next) + fprintf(fp, "%s %s%s%s", p->type, p->name, p->type2, + p->next ? ", " : ""); + putl_code(fp, ")\n"); + + puts_code(fp, "# define YYLEX yylex("); + for (p = lex_param; p; p = p->next) + fprintf(fp, "%s%s", p->name, p->next ? ", " : ""); + putl_code(fp, ")\n"); + } + else + { + putl_code(fp, "# define YYLEX_DECL() yylex(void)\n"); + putl_code(fp, "# define YYLEX yylex()\n"); + } + putl_code(fp, "#endif\n"); +} + +static void +output_error_decl(FILE * fp) +{ + putl_code(fp, "\n"); + putl_code(fp, "/* Parameters sent to yyerror. */\n"); + if (parse_param) + { + param *p; + + putl_code(fp, "#ifndef YYERROR_DECL\n"); + fprintf(fp, "#define YYERROR_DECL() yyerror("); + for (p = parse_param; p; p = p->next) + fprintf(fp, "%s %s%s, ", p->type, p->name, p->type2); + putl_code(fp, "const char *s)\n"); + putl_code(fp, "#endif\n"); + + putl_code(fp, "#ifndef YYERROR_CALL\n"); + puts_code(fp, "#define YYERROR_CALL(msg) yyerror("); + + for (p = parse_param; p; p = p->next) + fprintf(fp, "%s, ", p->name); + + putl_code(fp, "msg)\n"); + putl_code(fp, "#endif\n"); + } + else + { + putl_code(fp, "#ifndef YYERROR_DECL\n"); + putl_code(fp, "#define YYERROR_DECL() yyerror(const char *s)\n"); + putl_code(fp, "#endif\n"); + putl_code(fp, "#ifndef YYERROR_CALL\n"); + putl_code(fp, "#define YYERROR_CALL(msg) yyerror(msg)\n"); + putl_code(fp, "#endif\n"); + } +} + +static void +free_itemsets(void) +{ + core *cp, *next; + + FREE(state_table); + for (cp = first_state; cp; cp = next) + { + next = cp->next; + FREE(cp); + } +} + +static void +free_shifts(void) +{ + shifts *sp, *next; + + FREE(shift_table); + for (sp = first_shift; sp; sp = next) + { + next = sp->next; + FREE(sp); + } +} + +static void +free_reductions(void) +{ + reductions *rp, *next; + + FREE(reduction_table); + for (rp = first_reduction; rp; rp = next) + { + next = rp->next; + FREE(rp); + } +} + +static void +output_yyerror_call(const char *msg) +{ + FILE *fp = code_file; + + puts_code(fp, " yyerror("); + if (parse_param) + { + param *p; + for (p = parse_param; p; p = p->next) + fprintf(fp, "%s, ", p->name); + } + puts_code(fp, "\""); + puts_code(fp, msg); + putl_code(fp, "\");\n"); +} + +static void +output_externs(FILE * fp, const char *const section[]) +{ + int c; + int i; + const char *s; + + for (i = 0; (s = section[i]) != 0; ++i) + { + if (*s && *s != '#') + fputs("extern\t", fp); + while ((c = *s) != 0) + { + putc(c, fp); + ++s; + } + if (fp == code_file) + ++outline; + putc('\n', fp); + } +} + +void +output(void) +{ + FILE *fp; + + free_itemsets(); + free_shifts(); + free_reductions(); + + if (iflag) + { + ++outline; + fprintf(code_file, "#include \"%s\"\n", externs_file_name); + fp = externs_file; + } + else + fp = code_file; + + output_prefix(iflag ? externs_file : output_file); + output_pure_parser(fp); + output_stored_text(fp); + output_stype(fp); + output_parse_decl(fp); + output_lex_decl(fp); + output_error_decl(fp); + write_section(fp, xdecls); + + if (iflag) + { + output_externs(externs_file, global_vars); + if (!pure_parser) + output_externs(externs_file, impure_vars); + } + + if (iflag) + { + ++outline; + fprintf(code_file, "#include \"%s\"\n", defines_file_name); + if (!dflag) + output_defines(externs_file); + } + else + { + putc_code(code_file, '\n'); + output_defines(code_file); + } + + if (dflag) + output_defines(defines_file); + + output_rule_data(); + output_yydefred(); + output_actions(); + free_parser(); + output_debug(); + if (rflag) + { + output_prefix(code_file); + write_section(code_file, xdecls); + write_section(code_file, tables); + } + write_section(code_file, global_vars); + if (!pure_parser) + { + write_section(code_file, impure_vars); + } + write_section(code_file, hdr_defs); + if (!pure_parser) + { + write_section(code_file, hdr_vars); + } + output_trailing_text(); + write_section(code_file, body_1); + if (pure_parser) + { + write_section(code_file, body_vars); + } + write_section(code_file, body_2); + output_yyerror_call("syntax error"); + write_section(code_file, body_3); + output_semantic_actions(); + write_section(code_file, trailer); + output_yyerror_call("yacc stack overflow"); + write_section(code_file, trailer_2); +} + +#ifdef NO_LEAKS +void +output_leaks(void) +{ + DO_FREE(tally); + DO_FREE(width); + DO_FREE(order); +} +#endif diff --git a/contrib/byacc/package/byacc.spec b/contrib/byacc/package/byacc.spec new file mode 100644 index 00000000000..8f1fbb55bd5 --- /dev/null +++ b/contrib/byacc/package/byacc.spec @@ -0,0 +1,60 @@ +Summary: byacc - public domain Berkeley LALR Yacc parser generator +%define AppProgram byacc +%define AppVersion 20120115 +%define UseProgram yacc +# $XTermId: byacc.spec,v 1.13 2012/01/15 19:30:29 tom Exp $ +Name: %{AppProgram} +Version: %{AppVersion} +Release: 1 +License: Public Domain, MIT +Group: Applications/Development +URL: ftp://invisible-island.net/%{AppProgram} +Source0: %{AppProgram}-%{AppVersion}.tgz +Packager: Thomas Dickey + +%description +This package provides a parser generator utility that reads a grammar +specification from a file and generates an LR(1) parser for it. The +parsers consist of a set of LALR(1) parsing tables and a driver +routine written in the C programming language. It has a public domain +license which includes the generated C. + +%prep + +%setup -q -n %{AppProgram}-%{AppVersion} + +%build + +INSTALL_PROGRAM='${INSTALL}' \ + ./configure \ + --program-prefix=b \ + --target %{_target_platform} \ + --prefix=%{_prefix} \ + --bindir=%{_bindir} \ + --libdir=%{_libdir} \ + --mandir=%{_mandir} + +make + +%install +[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT + +make install DESTDIR=$RPM_BUILD_ROOT +( cd $RPM_BUILD_ROOT%{_bindir} && ln -s %{AppProgram} %{UseProgram} ) + +strip $RPM_BUILD_ROOT%{_bindir}/%{AppProgram} + +%clean +[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root) +%{_prefix}/bin/%{AppProgram} +%{_prefix}/bin/%{UseProgram} +%{_mandir}/man1/%{AppProgram}.* + +%changelog +# each patch should add its ChangeLog entries here + +* Sun Jun 06 2010 Thomas Dickey +- initial version diff --git a/contrib/byacc/package/debian/changelog b/contrib/byacc/package/debian/changelog new file mode 100644 index 00000000000..98c08e28ee5 --- /dev/null +++ b/contrib/byacc/package/debian/changelog @@ -0,0 +1,223 @@ +byacc (20120115) unstable; urgency=low + + * add testcases, improve documentation for "-s" option. + + -- Thomas E. Dickey Fri, 13 Jan 2012 20:44:34 -0500 + +byacc (20111219) unstable; urgency=low + + * add "-s" option. + + -- Thomas E. Dickey Mon, 19 Dec 2011 20:54:09 -0500 + +byacc (20110908) unstable; urgency=low + + * add "-i" option. + * add error-check in reader.c + + -- Thomas E. Dickey Mon, 05 Sep 2011 20:05:51 -0400 + +byacc (20101229) unstable; urgency=low + + * fixes from Christos Zoulos + + -- Thomas E. Dickey Wed, 29 Dec 2010 13:03:50 -0500 + +byacc (20101226) unstable; urgency=low + + * portability fix for MinGW + + -- Thomas E. Dickey Sat, 25 Dec 2010 19:37:54 -0500 + +byacc (20101127) unstable; urgency=low + + * corrected yyerror use of %parse-param data + + -- Thomas E. Dickey Sat, 27 Nov 2010 12:32:00 -0500 + +byacc (20101126) unstable; urgency=low + + * additional fix to generated code to avoid symbol conflict + + -- Thomas E. Dickey Fri, 26 Nov 2010 04:23:08 -0500 + +byacc (20101124) unstable; urgency=low + + * amend fix for Red Hat #112617 to restore warning message. + + -- Thomas E. Dickey Mon, 22 Nov 2010 08:21:23 -0500 + +byacc (20101122) unstable; urgency=low + + * fix for generated header to avoid symbol conflict + + -- Thomas E. Dickey Mon, 22 Nov 2010 08:21:23 -0500 + +byacc (20100610) unstable; urgency=low + + * Add package scripts to upstream source, for test-builds. + + -- Thomas E. Dickey Thu, 10 Jun 2010 08:59:11 -0400 + +byacc (20100216-1) unstable; urgency=low + + * New upstream release + * debian/source/format: Added using format "3.0 (quilt)" + + -- Dave Beckett Tue, 20 Apr 2010 12:56:11 -0700 + +byacc (20091027-1) unstable; urgency=low + + * New upstream release + * debian/control: + - Updated to policy 3.8.4 + - Add ${misc:Depends} + + -- Dave Beckett Tue, 02 Feb 2010 21:36:34 -0800 + +byacc (20090221-1) unstable; urgency=low + + * New upstream release + + -- Dave Beckett Thu, 26 Feb 2009 21:06:20 -0800 + +byacc (20080826-1) unstable; urgency=high + + * New upstream release + * debian/patches/02-skeleton.patch: Removed - merged upstream + * debian/control: Updated to policy 3.8.0 + * debian/preinst, debian/postrm: removed - empty (lintian) + * debian/watch: version 3 and make FTP passive + * Acknowledge NMU - thanks. + + -- Dave Beckett Wed, 11 Sep 2008 23:58:00 -0700 + +byacc (20070509-1.1) unstable; urgency=high + + * Non-maintainer upload. + * Fix stack overflow in skeleton.c with upstream patch. + Closes: #491182 aka CVE-2008-3196 + + -- Thomas Viehmann Sun, 24 Aug 2008 23:13:07 +0200 + +byacc (20070509-1) unstable; urgency=low + + * New upstream release + * debian/watch: Fix to use passive FTP + * debian/compat: added instead of use of DH_COMPAT in debian/rules + + -- Dave Beckett Tue, 26 Jun 2007 22:39:45 -0700 + +byacc (20050813-1) unstable; urgency=low + + * New upstream release: + - Do not close union_file for -d option (Closes: #322858) + + -- Dave Beckett Sun, 14 Aug 2005 10:14:12 +0100 + +byacc (20050505-1) unstable; urgency=low + + * New maintainer (Closes: #321377) + * Switch to new upstream and new source (Closes: #240662) + * debian/copyright: Update to new upstream and add source information + (Closes: #166300) + * Acknowledge fix in NMUs (Closes: #283174) + * New manual page does not have the formatting problem (Closes: #100947) + * Added debian/watch file. + + -- Dave Beckett Fri, 5 Aug 2005 22:50:20 +0100 + +byacc (1.9.1-1.1) unstable; urgency=low + + * Remove alternative in prerm. Closes: #283174 + + -- LaMont Jones Fri, 26 Nov 2004 18:49:09 -0700 + +byacc (1.9.1-1) unstable; urgency=low + + * Maintainer upload. + * Fixed alternatives entry, closes: Bug#146195; + * Changed priority to "extra" at behest of Daniel Bungert, + closes: Bug#142271. + * Fixed awful packaging error which meant the test/ directory was excluded + from the orig.tar.gz. + + -- Jason Henry Parker Fri, 27 Sep 2002 16:25:27 -0400 + +byacc (1.9-13.1) unstable; urgency=low + + * Non-maintainer upload + * Removed erraneous escapes in manpage - some data wasn't visable, + closes: Bug#100947 + * Alternatives entry added, closes: Bug#113168 + * Standards-version: 3.5.6 + * Maintainer script cleaning + + -- Daniel Bungert Fri, 29 Mar 2002 16:58:30 -0500 + +byacc (1.9-13) unstable; urgency=low + + * Applied patch from "Randolph Chung" to fix build problems + on ia64, closes: Bug#91966 + + -- Jason Henry Parker Thu, 29 Mar 2001 21:41:19 +1000 + +byacc (1.9-12) unstable; urgency=low + + * Updated to latest version of debhelper, and Standards-Version: 3.2.1.0, closes: Bug#81444 + * Added Build-Depends: debhelper, closes: Bug#70207 + * Removed mktemp() calls in main.c + + -- Jason Henry Parker Mon, 18 Dec 2000 08:02:54 +1000 + +byacc (1.9-11.7) unstable; urgency=low + + * New maintainer. + * Updated to dh_make and standards version 2.4.0.0, no lintian errors + or warnings. + * Added several more files from the upstream distribution to + /usr/doc/byacc. + + -- Jason Henry Parker Sat, 2 Jan 1999 03:04:17 +1000 + +byacc (1.9-11.6) unstable; urgency=low + + * Patch by to remove some + superfluous files that can interfere with the build process on other + architectures. (Bug #21607). + + -- Vincent Renardias Fri, 24 Apr 1998 19:56:58 +0200 + +byacc (1.9-11.5) unstable; urgency=low + + * Added 'binary-arch' target in debian/rules (Bug #12742). + + -- Vincent Renardias Sun, 9 Nov 1997 23:37:31 +0100 + +byacc (1.9-11.4) unstable; urgency=low + + * Cosmetic change (Fix bug #9623). + + -- Vincent Renardias Fri, 9 May 1997 16:30:24 +0200 + +byacc (1.9-11.3) unstable; urgency=low + + * Rebuilt with libc6. + + -- Debian QA Group Thu, 1 May 1997 22:02:04 +0200 + +byacc (1.9-11.2) unstable; urgency=low + + * Orphaned the package at his maintainer's request (dgregor@coil.com). + + -- Debian QA Group Sun, 20 Apr 1997 20:03:03 +0200 + +byacc (1.9-11.1) unstable; urgency=low + + * Converted to new source format (Fixes #8085). + * Compressed manpage. + * Fixed to allow compilation on non-i386 (Fixes #3361). + * Added extended description (Fixes #3567). + * Added diversion to avoid conflict with bison (Fixes #8086). + + -- Vincent Renardias Sun, 20 Apr 1997 15:59:28 +0200 diff --git a/contrib/byacc/package/debian/compat b/contrib/byacc/package/debian/compat new file mode 100644 index 00000000000..7ed6ff82de6 --- /dev/null +++ b/contrib/byacc/package/debian/compat @@ -0,0 +1 @@ +5 diff --git a/contrib/byacc/package/debian/control b/contrib/byacc/package/debian/control new file mode 100644 index 00000000000..720aadab6fe --- /dev/null +++ b/contrib/byacc/package/debian/control @@ -0,0 +1,17 @@ +Source: byacc +Maintainer: Dave Beckett +Section: devel +Priority: extra +Standards-Version: 3.8.4 +Build-Depends: debhelper (>= 5) +Homepage: http://invisible-island.net/byacc/ + +Package: byacc +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: public domain Berkeley LALR Yacc parser generator + This package provides a parser generator utility that reads a grammar + specification from a file and generates an LR(1) parser for it. The + parsers consist of a set of LALR(1) parsing tables and a driver + routine written in the C programming language. It has a public domain + license which includes the generated C. diff --git a/contrib/byacc/package/debian/copyright b/contrib/byacc/package/debian/copyright new file mode 100644 index 00000000000..ea6c6a58579 --- /dev/null +++ b/contrib/byacc/package/debian/copyright @@ -0,0 +1,120 @@ +Upstream source http://dickey.his.com/byacc/byacc.html + +Berkeley Yacc is in the public domain; changes made to it by the current +maintainer are likewise unrestricted. That applies to most of the files. +A few files (currently those related to autoconf scripting) have other +licenses as noted here. + +Current byacc upstream maintainer: Thomas Dickey + +Public domain notice and no warranty: +------------------------------------------------------------------------------- + Berkeley Yacc is an LALR(1) parser generator. Berkeley Yacc has been made +as compatible as possible with AT&T Yacc. Berkeley Yacc can accept any input +specification that conforms to the AT&T Yacc documentation. Specifications +that take advantage of undocumented features of AT&T Yacc will probably be +rejected. + + Berkeley Yacc is distributed with no warranty whatever. The code +is certain to contain errors. Neither the author nor any contributor +takes responsibility for any consequences of its use. + + Berkeley Yacc is in the public domain. The data structures and algorithms +used in Berkeley Yacc are all either taken from documents available to the +general public or are inventions of the author. Anyone may freely distribute +source or binary forms of Berkeley Yacc whether unchanged or modified. +Distributers may charge whatever fees they can obtain for Berkeley Yacc. +Programs generated by Berkeley Yacc may be distributed freely. + + Please report bugs to + + robert.corbett@eng.Sun.COM + +Include a small example if possible. Please include the banner string from +skeleton.c with the bug report. Do not expect rapid responses. +------------------------------------------------------------------------------- + +Files: aclocal.m4 +Licence: other-BSD +Copyright: 2004-2011,2012 by Thomas E. Dickey + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, distribute with modifications, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above copyright + holders shall not be used in advertising or otherwise to promote the + sale, use or other dealings in this Software without prior written + authorization. + +Files: install-sh +Copyright: 1994 X Consortium +Licence: other-BSD + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- + TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of the X Consortium shall not + be used in advertising or otherwise to promote the sale, use or other deal- + ings in this Software without prior written authorization from the X Consor- + tium. + + FSF changes to this file are in the public domain. + + Calling this script install-sh is preferred over install.sh, to prevent + `make' implicit rules from creating a file called install from it + when there is no Makefile. + + This script is compatible with the BSD install script, but was written + from scratch. It can only install one file at a time, a restriction + shared with many OS's install programs. + +Files: debian/* +Copyright: 2012 Thomas E. Dickey +Licence: other-BSD + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose and without fee is hereby granted, + provided that the above copyright notice appear in all copies and that + both that copyright notice and this permission notice appear in + supporting documentation, and that the name of the above listed + copyright holder(s) not be used in advertising or publicity pertaining + to distribution of the software without specific, written prior + permission. + + THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD + TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE + LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +On Debian systems, the complete text of the GNU General +Public License can be found in '/usr/share/common-licenses/GPL-2' diff --git a/contrib/byacc/package/debian/docs b/contrib/byacc/package/debian/docs new file mode 100644 index 00000000000..cbda209a3c1 --- /dev/null +++ b/contrib/byacc/package/debian/docs @@ -0,0 +1,4 @@ +README +ACKNOWLEDGEMENTS +NEW_FEATURES +NOTES diff --git a/contrib/byacc/package/debian/postinst b/contrib/byacc/package/debian/postinst new file mode 100644 index 00000000000..ca6276de7ae --- /dev/null +++ b/contrib/byacc/package/debian/postinst @@ -0,0 +1,15 @@ +#! /bin/sh +# postinst script for byacc + +set -e + +if [ $1 != "upgrade" ] ; then + update-alternatives \ + --install /usr/bin/yacc yacc /usr/bin/byacc 80 \ + --slave /usr/share/man/man1/yacc.1.gz yaccman \ + /usr/share/man/man1/byacc.1.gz +fi + +#DEBHELPER# + +exit 0 diff --git a/contrib/byacc/package/debian/prerm b/contrib/byacc/package/debian/prerm new file mode 100644 index 00000000000..f3889d73a59 --- /dev/null +++ b/contrib/byacc/package/debian/prerm @@ -0,0 +1,12 @@ +#! /bin/sh +# prerm script for byacc + +set -e + +if [ $1 != "upgrade" ]; then + update-alternatives --remove yacc /usr/bin/byacc +fi + +#DEBHELPER# + +exit 0 diff --git a/contrib/byacc/package/debian/rules b/contrib/byacc/package/debian/rules new file mode 100755 index 00000000000..f9424ac909f --- /dev/null +++ b/contrib/byacc/package/debian/rules @@ -0,0 +1,93 @@ +#!/usr/bin/make -f +# MAde with the aid of dh_make, by Craig Small +# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. +# Some lines taken from debmake, by Cristoph Lameter. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +CFLAGS = + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + + +configure: configure-stamp +configure-stamp: + dh_testdir + + CFLAGS="$(CFLAGS)" ./configure \ + --host=$(DEB_HOST_GNU_TYPE) \ + --build=$(DEB_BUILD_GNU_TYPE) \ + --prefix=/usr \ + --mandir=\$${prefix}/share/man \ + --sysconfdir=/etc \ + --program-transform-name='s,^,b,' + + touch configure-stamp + +build: build-stamp +build-stamp: configure-stamp + dh_testdir + + $(MAKE) + + touch build-stamp + +clean: + dh_testdir + dh_testroot + + [ ! -f Makefile ] || $(MAKE) clean + + rm -f configure-stamp build-stamp install-stamp \ + config.cache config.h config.status config.log makefile + + rm -f *.o yacc + + dh_clean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + $(MAKE) install DESTDIR=$(CURDIR)/debian/byacc + + touch install-stamp + +# Build architecture-independent files here. +binary-indep: build install +# No binary-indep target. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installdocs + dh_installexamples + dh_installchangelogs CHANGES + dh_strip + dh_compress + dh_fixperms + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install install-stamp diff --git a/contrib/byacc/package/debian/source/format b/contrib/byacc/package/debian/source/format new file mode 100644 index 00000000000..163aaf8d82b --- /dev/null +++ b/contrib/byacc/package/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/contrib/byacc/package/debian/watch b/contrib/byacc/package/debian/watch new file mode 100644 index 00000000000..de083b06a19 --- /dev/null +++ b/contrib/byacc/package/debian/watch @@ -0,0 +1,4 @@ +version=3 + +opts=passive ftp://invisible-island.net/byacc/byacc-(\d+)\.tgz \ + debian uupdate diff --git a/contrib/byacc/package/pkgsrc/DESCR b/contrib/byacc/package/pkgsrc/DESCR new file mode 100644 index 00000000000..fe018659e9a --- /dev/null +++ b/contrib/byacc/package/pkgsrc/DESCR @@ -0,0 +1,6 @@ +Berkeley Yacc (byacc) is a LALR(1) parser generator. Berkeley Yacc +has been made as compatible as possible with AT&T Yacc. Berkeley +Yacc can accept any input specification that conforms to the AT&T +Yacc documentation. + +Some programs depend on a byacc (instead of bison). diff --git a/contrib/byacc/package/pkgsrc/Makefile b/contrib/byacc/package/pkgsrc/Makefile new file mode 100644 index 00000000000..416ea851c45 --- /dev/null +++ b/contrib/byacc/package/pkgsrc/Makefile @@ -0,0 +1,19 @@ +# $NetBSD: Makefile,v 1.9 2008/07/24 17:13:00 tonnerre Exp $ +# + +DISTNAME= byacc-20050813 +PKGREVISION= 1 +CATEGORIES= devel +MASTER_SITES= ftp://invisible-island.net/byacc/ +EXTRACT_SUFX= .tgz + +MAINTAINER= pkgsrc-users@NetBSD.org +HOMEPAGE= http://dickey.his.com/byacc/byacc.html +COMMENT= Berkeley Yacc + +PKG_DESTDIR_SUPPORT= user-destdir + +GNU_CONFIGURE= YES +MAKE_FILE= makefile + +.include "../../mk/bsd.pkg.mk" diff --git a/contrib/byacc/package/pkgsrc/PLIST b/contrib/byacc/package/pkgsrc/PLIST new file mode 100644 index 00000000000..5bcfece36ca --- /dev/null +++ b/contrib/byacc/package/pkgsrc/PLIST @@ -0,0 +1,3 @@ +@comment $NetBSD: PLIST,v 1.2 2005/04/13 14:11:54 wiz Exp $ +bin/yacc +man/man1/yacc.1 diff --git a/contrib/byacc/package/pkgsrc/distinfo b/contrib/byacc/package/pkgsrc/distinfo new file mode 100644 index 00000000000..99252a68675 --- /dev/null +++ b/contrib/byacc/package/pkgsrc/distinfo @@ -0,0 +1,6 @@ +$NetBSD: distinfo,v 1.4 2008/07/24 17:13:00 tonnerre Exp $ + +SHA1 (byacc-20050813.tgz) = 3258494f3422eb3150944c1823af1c9c2c386062 +RMD160 (byacc-20050813.tgz) = 3ee159857a79025a83e2b0807577925fe460f816 +Size (byacc-20050813.tgz) = 138684 bytes +SHA1 (patch-aa) = decae78775a5e0f1e1f7aaaa258da53903aa1f7a diff --git a/usr.bin/yacc/reader.c b/contrib/byacc/reader.c similarity index 60% rename from usr.bin/yacc/reader.c rename to contrib/byacc/reader.c index f81f1730523..d41e92a5206 100644 --- a/usr.bin/yacc/reader.c +++ b/contrib/byacc/reader.c @@ -1,119 +1,49 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ +/* $Id: reader.c,v 1.33 2011/09/06 22:56:53 tom Exp $ */ -#if 0 -#ifndef lint -static char sccsid[] = "@(#)reader.c 5.7 (Berkeley) 1/20/91"; -#endif -#endif - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include #include "defs.h" /* The line size must be a positive integer. One hundred was chosen */ /* because few lines in Yacc input grammars exceed 100 characters. */ /* Note that if a line exceeds LINESIZE characters, the line buffer */ -/* will be expanded to accommodate it. */ +/* will be expanded to accomodate it. */ #define LINESIZE 100 -char *cache; -int cinc, cache_size; +#define L_CURL '{' +#define R_CURL '}' -int ntags, tagmax; -char **tag_table; +static void start_rule(bucket *bp, int s_lineno); -char saw_eof, unionized; +static char *cache; +static int cinc, cache_size; + +int ntags; +static int tagmax; +static char **tag_table; + +static char saw_eof; +char unionized; char *cptr, *line; -int linesize; +static int linesize; -bucket *goal; -int prec; -int gensym; -char last_was_action; +static bucket *goal; +static Value_t prec; +static int gensym; +static char last_was_action; -int maxitems; -bucket **pitem; +static int maxitems; +static bucket **pitem; -int maxrules; -bucket **plhs; +static int maxrules; +static bucket **plhs; -int name_pool_size; -char *name_pool; +static size_t name_pool_size; +static char *name_pool; -static const char line_format[] = "#line %d \"%s\"\n"; +char line_format[] = "#line %d \"%s\"\n"; -static void add_symbol(void); -static void advance_to_start(void); -static void cachec(int); -static void check_symbols(void); -static void copy_action(void); -static void copy_ident(void); -static void copy_text(void); -static void copy_union(void); -static void declare_expect(int); -static void declare_start(void); -static void declare_tokens(int); -static void declare_types(void); -static char *dup_line(void); -static void end_rule(void); -static void expand_items(void); -static void expand_rules(void); -static void free_tags(void); -static void get_line(void); -static bucket *get_literal(void); -static bucket *get_name(void); -static int get_number(void); -static char *get_tag(void); -static int hexval(int); -static void initialize_grammar(void); -static void insert_empty_rule(void); -static int is_reserved(char *); -static int keyword(void); -static int mark_symbol(void); -static int nextc(void); -static void pack_grammar(void); -static void pack_names(void); -static void pack_symbols(void); -static void print_grammar(void); -static void read_declarations(void); -static void read_grammar(void); -static void skip_comment(void); -static void start_rule(bucket *, int); +param *lex_param; +param *parse_param; static void cachec(int c) @@ -122,14 +52,13 @@ cachec(int c) if (cinc >= cache_size) { cache_size += 256; - cache = realloc(cache, cache_size); - if (cache == 0) no_space(); + cache = REALLOC(cache, cache_size); + NO_SPACE(cache); } - cache[cinc] = c; + cache[cinc] = (char)c; ++cinc; } - static void get_line(void) { @@ -139,7 +68,11 @@ get_line(void) if (saw_eof || (c = getc(f)) == EOF) { - if (line) { free(line); line = 0; } + if (line) + { + FREE(line); + line = 0; + } cptr = 0; saw_eof = 1; return; @@ -147,26 +80,31 @@ get_line(void) if (line == 0 || linesize != (LINESIZE + 1)) { - if (line) free(line); + if (line) + FREE(line); linesize = LINESIZE + 1; - line = malloc(linesize); - if (line == 0) no_space(); + line = MALLOC(linesize); + NO_SPACE(line); } i = 0; ++lineno; for (;;) { - line[i] = c; - if (c == '\n') { cptr = line; return; } + line[i] = (char)c; + if (c == '\n') + { + cptr = line; + return; + } if (++i >= linesize) { linesize += LINESIZE; - line = realloc(line, linesize); - if (line == 0) no_space(); + line = REALLOC(line, linesize); + NO_SPACE(line); } c = getc(f); - if (c == EOF) + if (c == EOF) { line[i] = '\n'; saw_eof = 1; @@ -176,25 +114,26 @@ get_line(void) } } - static char * dup_line(void) { char *p, *s, *t; - if (line == 0) return (0); + if (line == 0) + return (0); s = line; - while (*s != '\n') ++s; - p = malloc(s - line + 1); - if (p == 0) no_space(); + while (*s != '\n') + ++s; + p = MALLOC(s - line + 1); + NO_SPACE(p); s = line; t = p; - while ((*t++ = *s++) != '\n') continue; + while ((*t++ = *s++) != '\n') + continue; return (p); } - static void skip_comment(void) { @@ -210,7 +149,7 @@ skip_comment(void) if (*s == '*' && s[1] == '/') { cptr = s + 2; - free(st_line); + FREE(st_line); return; } if (*s == '\n') @@ -225,7 +164,6 @@ skip_comment(void) } } - static int nextc(void) { @@ -245,7 +183,8 @@ nextc(void) { case '\n': get_line(); - if (line == 0) return (EOF); + if (line == 0) + return (EOF); s = cptr; break; @@ -274,11 +213,12 @@ nextc(void) else if (s[1] == '/') { get_line(); - if (line == 0) return (EOF); + if (line == 0) + return (EOF); s = cptr; break; } - /* FALLTHROUGH */ + /* FALLTHRU */ default: cptr = s; @@ -287,6 +227,35 @@ nextc(void) } } +/* + * Compare keyword to cached token, treating '_' and '-' the same. Some + * grammars rely upon this misfeature. + */ +static int +matchec(const char *name) +{ + const char *p = cache; + const char *q = name; + int code = 0; /* assume mismatch */ + + while (*p != '\0' && *q != '\0') + { + char a = *p++; + char b = *q++; + if (a == '_') + a = '-'; + if (b == '_') + b = '-'; + if (a != b) + break; + if (*p == '\0' && *q == '\0') + { + code = 1; + break; + } + } + return code; +} static int keyword(void) @@ -302,40 +271,59 @@ keyword(void) { if (isalpha(c)) { - if (isupper(c)) c = tolower(c); + if (isupper(c)) + c = tolower(c); cachec(c); } - else if (isdigit(c) || c == '_' || c == '.' || c == '$') + else if (isdigit(c) + || c == '-' + || c == '_' + || c == '.' + || c == '$') + { cachec(c); + } else + { break; + } c = *++cptr; } cachec(NUL); - if (strcmp(cache, "token") == 0 || strcmp(cache, "term") == 0) + if (matchec("token") || matchec("term")) return (TOKEN); - if (strcmp(cache, "type") == 0) + if (matchec("type")) return (TYPE); - if (strcmp(cache, "left") == 0) + if (matchec("left")) return (LEFT); - if (strcmp(cache, "right") == 0) + if (matchec("right")) return (RIGHT); - if (strcmp(cache, "nonassoc") == 0 || strcmp(cache, "binary") == 0) + if (matchec("nonassoc") || matchec("binary")) return (NONASSOC); - if (strcmp(cache, "start") == 0) + if (matchec("start")) return (START); - if (strcmp(cache, "union") == 0) + if (matchec("union")) return (UNION); - if (strcmp(cache, "ident") == 0) + if (matchec("ident")) return (IDENT); - if (strcmp(cache, "expect") == 0) + if (matchec("expect")) return (EXPECT); + if (matchec("expect-rr")) + return (EXPECT_RR); + if (matchec("pure-parser")) + return (PURE_PARSER); + if (matchec("parse-param")) + return (PARSE_PARAM); + if (matchec("lex-param")) + return (LEX_PARAM); + if (matchec("yacc")) + return (POSIX_YACC); } else { ++cptr; - if (c == '{') + if (c == L_CURL) return (TEXT); if (c == '%' || c == '\\') return (MARK); @@ -349,11 +337,10 @@ keyword(void) return (NONASSOC); } syntax_error(lineno, line, t_cptr); - /*NOTREACHED*/ - return (0); + /*NOTREACHED */ + return (-1); } - static void copy_ident(void) { @@ -361,8 +348,10 @@ copy_ident(void) FILE *f = output_file; c = nextc(); - if (c == EOF) unexpected_EOF(); - if (c != '"') syntax_error(lineno, line, cptr); + if (c == EOF) + unexpected_EOF(); + if (c != '"') + syntax_error(lineno, line, cptr); ++outline; fprintf(f, "#ident \""); for (;;) @@ -383,7 +372,6 @@ copy_ident(void) } } - static void copy_text(void) { @@ -401,18 +389,20 @@ copy_text(void) if (line == 0) unterminated_text(t_lineno, t_line, t_cptr); } - if (!lflag) fprintf(f, line_format, lineno, input_file_name); + if (!lflag) + fprintf(f, line_format, lineno, input_file_name); -loop: + loop: c = *cptr++; switch (c) { case '\n': - next_line: + next_line: putc('\n', f); need_newline = 0; get_line(); - if (line) goto loop; + if (line) + goto loop; unterminated_text(t_lineno, t_line, t_cptr); case '\'': @@ -431,7 +421,7 @@ loop: if (c == quote) { need_newline = 1; - free(s_line); + FREE(s_line); goto loop; } if (c == '\n') @@ -483,7 +473,7 @@ loop: { putc('/', f); ++cptr; - free(c_line); + FREE(c_line); goto loop; } if (c == '\n') @@ -499,14 +489,15 @@ loop: case '%': case '\\': - if (*cptr == '}') + if (*cptr == R_CURL) { - if (need_newline) putc('\n', f); + if (need_newline) + putc('\n', f); ++cptr; - free(t_line); + FREE(t_line); return; } - /* FALLTHROUGH */ + /* FALLTHRU */ default: putc(c, f); @@ -515,6 +506,21 @@ loop: } } +static void +puts_both(const char *s) +{ + fputs(s, text_file); + if (dflag) + fputs(s, union_file); +} + +static void +putc_both(int c) +{ + putc(c, text_file); + if (dflag) + putc(c, union_file); +} static void copy_union(void) @@ -526,37 +532,44 @@ copy_union(void) char *u_line = dup_line(); char *u_cptr = u_line + (cptr - line - 6); - if (unionized) over_unionized(cptr - 6); + if (unionized) + over_unionized(cptr - 6); unionized = 1; if (!lflag) fprintf(text_file, line_format, lineno, input_file_name); - fprintf(text_file, "typedef union"); - if (dflag) fprintf(union_file, "typedef union"); + puts_both("#ifdef YYSTYPE\n"); + puts_both("#undef YYSTYPE_IS_DECLARED\n"); + puts_both("#define YYSTYPE_IS_DECLARED 1\n"); + puts_both("#endif\n"); + puts_both("#ifndef YYSTYPE_IS_DECLARED\n"); + puts_both("#define YYSTYPE_IS_DECLARED 1\n"); + puts_both("typedef union"); depth = 0; -loop: + loop: c = *cptr++; - putc(c, text_file); - if (dflag) putc(c, union_file); + putc_both(c); switch (c) { case '\n': - next_line: + next_line: get_line(); - if (line == 0) unterminated_union(u_lineno, u_line, u_cptr); + if (line == 0) + unterminated_union(u_lineno, u_line, u_cptr); goto loop; - case '{': + case L_CURL: ++depth; goto loop; - case '}': + case R_CURL: if (--depth == 0) { - fprintf(text_file, " YYSTYPE;\n"); - free(u_line); + puts_both(" YYSTYPE;\n"); + puts_both("#endif /* !YYSTYPE_IS_DECLARED */\n"); + FREE(u_line); return; } goto loop; @@ -572,11 +585,10 @@ loop: for (;;) { c = *cptr++; - putc(c, text_file); - if (dflag) putc(c, union_file); + putc_both(c); if (c == quote) { - free(s_line); + FREE(s_line); goto loop; } if (c == '\n') @@ -584,8 +596,7 @@ loop: if (c == '\\') { c = *cptr++; - putc(c, text_file); - if (dflag) putc(c, union_file); + putc_both(c); if (c == '\n') { get_line(); @@ -600,23 +611,19 @@ loop: c = *cptr; if (c == '/') { - putc('*', text_file); - if (dflag) putc('*', union_file); + putc_both('*'); while ((c = *++cptr) != '\n') { if (c == '*' && cptr[1] == '/') { - fprintf(text_file, "* "); - if (dflag) fprintf(union_file, "* "); + puts_both("* "); } else { - putc(c, text_file); - if (dflag) putc(c, union_file); + putc_both(c); } } - fprintf(text_file, "*/\n"); - if (dflag) fprintf(union_file, "*/\n"); + puts_both("*/\n"); goto next_line; } if (c == '*') @@ -625,20 +632,17 @@ loop: char *c_line = dup_line(); char *c_cptr = c_line + (cptr - line - 1); - putc('*', text_file); - if (dflag) putc('*', union_file); + putc_both('*'); ++cptr; for (;;) { c = *cptr++; - putc(c, text_file); - if (dflag) putc(c, union_file); + putc_both(c); if (c == '*' && *cptr == '/') { - putc('/', text_file); - if (dflag) putc('/', union_file); + putc_both('/'); ++cptr; - free(c_line); + FREE(c_line); goto loop; } if (c == '\n') @@ -656,6 +660,117 @@ loop: } } +/* + * Keep a linked list of parameters + */ +static void +copy_param(int k) +{ + char *buf; + int c; + param *head, *p; + int i; + int name, type2; + + c = nextc(); + if (c == EOF) + unexpected_EOF(); + if (c != '{') + goto out; + cptr++; + + c = nextc(); + if (c == EOF) + unexpected_EOF(); + if (c == '}') + goto out; + + buf = MALLOC(linesize); + NO_SPACE(buf); + + for (i = 0; (c = *cptr++) != '}'; i++) + { + if (c == '\0') + missing_brace(); + if (c == EOF) + unexpected_EOF(); + buf[i] = (char)c; + } + + if (i == 0) + goto out; + + buf[i--] = '\0'; + while (i >= 0 && isspace(UCH(buf[i]))) + buf[i--] = '\0'; + + if (buf[i] == ']') + { + int level = 1; + while (i >= 0 && level > 0 && buf[i] != '[') + { + if (buf[i] == ']') + ++level; + else if (buf[i] == '[') + --level; + i--; + } + if (i <= 0) + unexpected_EOF(); + type2 = i--; + } + else + { + type2 = i + 1; + } + + while (i >= 0 && (isalnum(UCH(buf[i])) || + UCH(buf[i]) == '_')) + i--; + + if (!isspace(UCH(buf[i])) && buf[i] != '*') + goto out; + + name = i + 1; + + p = MALLOC(sizeof(*p)); + NO_SPACE(p); + + p->type2 = strdup(buf + type2); + NO_SPACE(p->type2); + + buf[type2] = '\0'; + + p->name = strdup(buf + name); + NO_SPACE(p->name); + + buf[name] = '\0'; + p->type = buf; + + if (k == LEX_PARAM) + head = lex_param; + else + head = parse_param; + + if (head != NULL) + { + while (head->next) + head = head->next; + head->next = p; + } + else + { + if (k == LEX_PARAM) + lex_param = p; + else + parse_param = p; + } + p->next = NULL; + return; + + out: + syntax_error(lineno, line, cptr); +} static int hexval(int c) @@ -669,7 +784,6 @@ hexval(int c) return (-1); } - static bucket * get_literal(void) { @@ -687,8 +801,10 @@ get_literal(void) for (;;) { c = *cptr++; - if (c == quote) break; - if (c == '\n') unterminated_string(s_lineno, s_line, s_cptr); + if (c == quote) + break; + if (c == '\n') + unterminated_string(s_lineno, s_line, s_cptr); if (c == '\\') { char *c_cptr = cptr - 1; @@ -698,11 +814,18 @@ get_literal(void) { case '\n': get_line(); - if (line == 0) unterminated_string(s_lineno, s_line, s_cptr); + if (line == 0) + unterminated_string(s_lineno, s_line, s_cptr); continue; - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': n = c - '0'; c = *cptr; if (IS_OCTAL(c)) @@ -715,9 +838,10 @@ get_literal(void) ++cptr; } } - if (n > (int)UCHAR_MAX) illegal_character(c_cptr); + if (n > MAXCHAR) + illegal_character(c_cptr); c = n; - break; + break; case 'x': c = *cptr++; @@ -728,30 +852,46 @@ get_literal(void) { c = *cptr; i = hexval(c); - if (i < 0 || i >= 16) break; + if (i < 0 || i >= 16) + break; ++cptr; n = (n << 4) + i; - if (n > (int)UCHAR_MAX) illegal_character(c_cptr); + if (n > MAXCHAR) + illegal_character(c_cptr); } c = n; break; - case 'a': c = 7; break; - case 'b': c = '\b'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - case 'v': c = '\v'; break; + case 'a': + c = 7; + break; + case 'b': + c = '\b'; + break; + case 'f': + c = '\f'; + break; + case 'n': + c = '\n'; + break; + case 'r': + c = '\r'; + break; + case 't': + c = '\t'; + break; + case 'v': + c = '\v'; + break; } } cachec(c); } - free(s_line); + FREE(s_line); n = cinc; - s = malloc(n); - if (s == 0) no_space(); + s = MALLOC(n); + NO_SPACE(s); for (i = 0; i < n; ++i) s[i] = cache[i]; @@ -764,7 +904,7 @@ get_literal(void) for (i = 0; i < n; ++i) { - c = ((unsigned char *)s)[i]; + c = UCH(s[i]); if (c == '\\' || c == cache[0]) { cachec('\\'); @@ -777,13 +917,27 @@ get_literal(void) cachec('\\'); switch (c) { - case 7: cachec('a'); break; - case '\b': cachec('b'); break; - case '\f': cachec('f'); break; - case '\n': cachec('n'); break; - case '\r': cachec('r'); break; - case '\t': cachec('t'); break; - case '\v': cachec('v'); break; + case 7: + cachec('a'); + break; + case '\b': + cachec('b'); + break; + case '\f': + cachec('f'); + break; + case '\n': + cachec('n'); + break; + case '\r': + cachec('r'); + break; + case '\t': + cachec('t'); + break; + case '\v': + cachec('v'); + break; default: cachec(((c >> 6) & 7) + '0'); cachec(((c >> 3) & 7) + '0'); @@ -802,34 +956,34 @@ get_literal(void) bp = lookup(cache); bp->class = TERM; if (n == 1 && bp->value == UNDEFINED) - bp->value = *(unsigned char *)s; - free(s); + bp->value = UCH(*s); + FREE(s); return (bp); } - static int is_reserved(char *name) { char *s; if (strcmp(name, ".") == 0 || - strcmp(name, "$accept") == 0 || - strcmp(name, "$end") == 0) + strcmp(name, "$accept") == 0 || + strcmp(name, "$end") == 0) return (1); - if (name[0] == '$' && name[1] == '$' && isdigit(name[2])) + if (name[0] == '$' && name[1] == '$' && isdigit(UCH(name[2]))) { s = name + 3; - while (isdigit(*s)) ++s; - if (*s == NUL) return (1); + while (isdigit(UCH(*s))) + ++s; + if (*s == NUL) + return (1); } return (0); } - static bucket * get_name(void) { @@ -840,26 +994,25 @@ get_name(void) cachec(c); cachec(NUL); - if (is_reserved(cache)) used_reserved(cache); + if (is_reserved(cache)) + used_reserved(cache); return (lookup(cache)); } - -static int +static Value_t get_number(void) { int c; - int n; + Value_t n; n = 0; for (c = *cptr; isdigit(c); c = *++cptr) - n = 10*n + (c - '0'); + n = (Value_t) (10 * n + (c - '0')); return (n); } - static char * get_tag(void) { @@ -872,16 +1025,23 @@ get_tag(void) ++cptr; c = nextc(); - if (c == EOF) unexpected_EOF(); + if (c == EOF) + unexpected_EOF(); if (!isalpha(c) && c != '_' && c != '$') illegal_tag(t_lineno, t_line, t_cptr); cinc = 0; - do { cachec(c); c = *++cptr; } while (IS_IDENT(c)); + do + { + cachec(c); + c = *++cptr; + } + while (IS_IDENT(c)); cachec(NUL); c = nextc(); - if (c == EOF) unexpected_EOF(); + if (c == EOF) + unexpected_EOF(); if (c != '>') illegal_tag(t_lineno, t_line, t_cptr); ++cptr; @@ -889,45 +1049,52 @@ get_tag(void) for (i = 0; i < ntags; ++i) { if (strcmp(cache, tag_table[i]) == 0) + { + FREE(t_line); return (tag_table[i]); + } } if (ntags >= tagmax) { tagmax += 16; tag_table = (char **) - (tag_table ? realloc(tag_table, tagmax*sizeof(char *)) - : malloc(tagmax*sizeof(char *))); - if (tag_table == 0) no_space(); + (tag_table + ? REALLOC(tag_table, (unsigned)tagmax * sizeof(char *)) + : MALLOC((unsigned)tagmax * sizeof(char *))); + NO_SPACE(tag_table); } - s = malloc(cinc); - if (s == 0) no_space(); + s = MALLOC(cinc); + NO_SPACE(s); + strcpy(s, cache); tag_table[ntags] = s; ++ntags; - free(t_line); + FREE(t_line); return (s); } - static void declare_tokens(int assoc) { int c; bucket *bp; - int value; + Value_t value; char *tag = 0; - if (assoc != TOKEN) ++prec; + if (assoc != TOKEN) + ++prec; c = nextc(); - if (c == EOF) unexpected_EOF(); + if (c == EOF) + unexpected_EOF(); if (c == '<') { tag = get_tag(); c = nextc(); - if (c == EOF) unexpected_EOF(); + if (c == EOF) + unexpected_EOF(); } for (;;) @@ -939,7 +1106,8 @@ declare_tokens(int assoc) else return; - if (bp == goal) tokenized_start(bp->name); + if (bp == goal) + tokenized_start(bp->name); bp->class = TERM; if (tag) @@ -953,13 +1121,14 @@ declare_tokens(int assoc) { if (bp->prec && prec != bp->prec) reprec_warning(bp->name); - bp->assoc = assoc; + bp->assoc = (Assoc_t) assoc; bp->prec = prec; } c = nextc(); - if (c == EOF) unexpected_EOF(); - value = UNDEFINED; + if (c == EOF) + unexpected_EOF(); + if (isdigit(c)) { value = get_number(); @@ -967,12 +1136,12 @@ declare_tokens(int assoc) revalued_warning(bp->name); bp->value = value; c = nextc(); - if (c == EOF) unexpected_EOF(); + if (c == EOF) + unexpected_EOF(); } } } - /* * %expect requires special handling * as it really isn't part of the yacc @@ -983,20 +1152,25 @@ declare_expect(int assoc) { int c; - if (assoc != EXPECT) ++prec; + if (assoc != EXPECT && assoc != EXPECT_RR) + ++prec; /* * Stay away from nextc - doesn't * detect EOL and will read to EOF. */ c = *++cptr; - if (c == EOF) unexpected_EOF(); + if (c == EOF) + unexpected_EOF(); - for(;;) + for (;;) { if (isdigit(c)) { - SRexpect = get_number(); + if (assoc == EXPECT) + SRexpect = get_number(); + else + RRexpect = get_number(); break; } /* @@ -1011,12 +1185,12 @@ declare_expect(int assoc) else { c = *++cptr; - if (c == EOF) unexpected_EOF(); + if (c == EOF) + unexpected_EOF(); } } } - static void declare_types(void) { @@ -1025,8 +1199,10 @@ declare_types(void) char *tag; c = nextc(); - if (c == EOF) unexpected_EOF(); - if (c != '<') syntax_error(lineno, line, cptr); + if (c == EOF) + unexpected_EOF(); + if (c != '<') + syntax_error(lineno, line, cptr); tag = get_tag(); for (;;) @@ -1045,7 +1221,6 @@ declare_types(void) } } - static void declare_start(void) { @@ -1053,7 +1228,8 @@ declare_start(void) bucket *bp; c = nextc(); - if (c == EOF) unexpected_EOF(); + if (c == EOF) + unexpected_EOF(); if (!isalpha(c) && c != '_' && c != '.' && c != '$') syntax_error(lineno, line, cptr); bp = get_name(); @@ -1064,21 +1240,22 @@ declare_start(void) goal = bp; } - static void read_declarations(void) { int c, k; cache_size = 256; - cache = malloc(cache_size); - if (cache == 0) no_space(); + cache = MALLOC(cache_size); + NO_SPACE(cache); for (;;) { c = nextc(); - if (c == EOF) unexpected_EOF(); - if (c != '%') syntax_error(lineno, line, cptr); + if (c == EOF) + unexpected_EOF(); + if (c != '%') + syntax_error(lineno, line, cptr); switch (k = keyword()) { case MARK: @@ -1104,6 +1281,7 @@ read_declarations(void) break; case EXPECT: + case EXPECT_RR: declare_expect(k); break; @@ -1114,18 +1292,33 @@ read_declarations(void) case START: declare_start(); break; + + case PURE_PARSER: + pure_parser = 1; + break; + + case PARSE_PARAM: + case LEX_PARAM: + copy_param(k); + break; + + case POSIX_YACC: + /* noop for bison compatibility. byacc is already designed to be posix + * yacc compatible. */ + break; } } } - static void initialize_grammar(void) { nitems = 4; maxitems = 300; - pitem = malloc(maxitems*sizeof(bucket *)); - if (pitem == 0) no_space(); + + pitem = (bucket **)MALLOC((unsigned)maxitems * sizeof(bucket *)); + NO_SPACE(pitem); + pitem[0] = 0; pitem[1] = 0; pitem[2] = 0; @@ -1133,45 +1326,51 @@ initialize_grammar(void) nrules = 3; maxrules = 100; - plhs = malloc(maxrules*sizeof(bucket *)); - if (plhs == 0) no_space(); + + plhs = (bucket **)MALLOC((unsigned)maxrules * sizeof(bucket *)); + NO_SPACE(plhs); + plhs[0] = 0; plhs[1] = 0; plhs[2] = 0; - rprec = malloc(maxrules*sizeof(short)); - if (rprec == 0) no_space(); + + rprec = (short *)MALLOC((unsigned)maxrules * sizeof(short)); + NO_SPACE(rprec); + rprec[0] = 0; rprec[1] = 0; rprec[2] = 0; - rassoc = malloc(maxrules*sizeof(char)); - if (rassoc == 0) no_space(); + + rassoc = (char *)MALLOC((unsigned)maxrules * sizeof(char)); + NO_SPACE(rassoc); + rassoc[0] = TOKEN; rassoc[1] = TOKEN; rassoc[2] = TOKEN; } - static void expand_items(void) { maxitems += 300; - pitem = realloc(pitem, maxitems*sizeof(bucket *)); - if (pitem == 0) no_space(); + pitem = (bucket **)REALLOC(pitem, (unsigned)maxitems * sizeof(bucket *)); + NO_SPACE(pitem); } - static void expand_rules(void) { maxrules += 100; - plhs = realloc(plhs, maxrules*sizeof(bucket *)); - if (plhs == 0) no_space(); - rprec = realloc(rprec, maxrules*sizeof(short)); - if (rprec == 0) no_space(); - rassoc = realloc(rassoc, maxrules*sizeof(char)); - if (rassoc == 0) no_space(); -} + plhs = (bucket **)REALLOC(plhs, (unsigned)maxrules * sizeof(bucket *)); + NO_SPACE(plhs); + + rprec = (short *)REALLOC(rprec, (unsigned)maxrules * sizeof(short)); + NO_SPACE(rprec); + + rassoc = (char *)REALLOC(rassoc, (unsigned)maxrules * sizeof(char)); + NO_SPACE(rassoc); +} static void advance_to_start(void) @@ -1184,7 +1383,8 @@ advance_to_start(void) for (;;) { c = nextc(); - if (c != '%') break; + if (c != '%') + break; s_cptr = cptr; switch (keyword()) { @@ -1217,13 +1417,14 @@ advance_to_start(void) s_lineno = lineno; c = nextc(); - if (c == EOF) unexpected_EOF(); - if (c != ':') syntax_error(lineno, line, cptr); + if (c == EOF) + unexpected_EOF(); + if (c != ':') + syntax_error(lineno, line, cptr); start_rule(bp, s_lineno); ++cptr; } - static void start_rule(bucket *bp, int s_lineno) { @@ -1237,7 +1438,6 @@ start_rule(bucket *bp, int s_lineno) rassoc[nrules] = TOKEN; } - static void end_rule(void) { @@ -1245,19 +1445,27 @@ end_rule(void) if (!last_was_action && plhs[nrules]->tag) { - for (i = nitems - 1; pitem[i]; --i) continue; - if (pitem[i+1] == 0 || pitem[i+1]->tag != plhs[nrules]->tag) + if (pitem[nitems - 1]) + { + for (i = nitems - 1; (i > 0) && pitem[i]; --i) + continue; + if (pitem[i + 1] == 0 || pitem[i + 1]->tag != plhs[nrules]->tag) + default_action_warning(); + } + else + { default_action_warning(); + } } last_was_action = 0; - if (nitems >= maxitems) expand_items(); + if (nitems >= maxitems) + expand_items(); pitem[nitems] = 0; ++nitems; ++nrules; } - static void insert_empty_rule(void) { @@ -1275,19 +1483,19 @@ insert_empty_rule(void) expand_items(); bpp = pitem + nitems - 1; *bpp-- = bp; - while ((bpp[0] = bpp[-1])) --bpp; + while ((bpp[0] = bpp[-1]) != 0) + --bpp; if (++nrules >= maxrules) expand_rules(); - plhs[nrules] = plhs[nrules-1]; - plhs[nrules-1] = bp; - rprec[nrules] = rprec[nrules-1]; - rprec[nrules-1] = 0; - rassoc[nrules] = rassoc[nrules-1]; - rassoc[nrules-1] = TOKEN; + plhs[nrules] = plhs[nrules - 1]; + plhs[nrules - 1] = bp; + rprec[nrules] = rprec[nrules - 1]; + rprec[nrules - 1] = 0; + rassoc[nrules] = rassoc[nrules - 1]; + rassoc[nrules - 1] = TOKEN; } - static void add_symbol(void) { @@ -1316,9 +1524,16 @@ add_symbol(void) if (++nitems > maxitems) expand_items(); - pitem[nitems-1] = bp; + pitem[nitems - 1] = bp; } +static char * +after_blanks(char *s) +{ + while (*s != '\0' && isspace(UCH(*s))) + ++s; + return s; +} static void copy_action(void) @@ -1340,13 +1555,22 @@ copy_action(void) fprintf(f, "case %d:\n", nrules - 2); if (!lflag) fprintf(f, line_format, lineno, input_file_name); - if (*cptr == '=') ++cptr; + if (*cptr == '=') + ++cptr; + + /* avoid putting curly-braces in first column, to ease editing */ + if (*after_blanks(cptr) == L_CURL) + { + putc('\t', f); + cptr = after_blanks(cptr); + } n = 0; - for (i = nitems - 1; pitem[i]; --i) ++n; + for (i = nitems - 1; pitem[i]; --i) + ++n; depth = 0; -loop: + loop: c = *cptr; if (c == '$') { @@ -1363,23 +1587,24 @@ loop: { fprintf(f, "yyval.%s", tag); ++cptr; - free(d_line); + FREE(d_line); goto loop; } else if (isdigit(c)) { i = get_number(); - if (i > n) dollar_warning(d_lineno, i); - fprintf(f, "yyvsp[%d].%s", i - n, tag); - free(d_line); + if (i > n) + dollar_warning(d_lineno, i); + fprintf(f, "yystack.l_mark[%d].%s", i - n, tag); + FREE(d_line); goto loop; } - else if (c == '-' && isdigit(cptr[1])) + else if (c == '-' && isdigit(UCH(cptr[1]))) { ++cptr; i = -get_number() - n; - fprintf(f, "yyvsp[%d].%s", i, tag); - free(d_line); + fprintf(f, "yystack.l_mark[%d].%s", i, tag); + FREE(d_line); goto loop; } else @@ -1390,7 +1615,8 @@ loop: if (ntags) { tag = plhs[nrules]->tag; - if (tag == 0) untyped_lhs(); + if (tag == 0) + untyped_lhs(); fprintf(f, "yyval.%s", tag); } else @@ -1398,7 +1624,7 @@ loop: cptr += 2; goto loop; } - else if (isdigit(cptr[1])) + else if (isdigit(UCH(cptr[1]))) { ++cptr; i = get_number(); @@ -1407,14 +1633,15 @@ loop: if (i <= 0 || i > n) unknown_rhs(i); tag = pitem[nitems + i - n - 1]->tag; - if (tag == 0) untyped_rhs(i, pitem[nitems + i - n - 1]->name); - fprintf(f, "yyvsp[%d].%s", i - n, tag); + if (tag == 0) + untyped_rhs(i, pitem[nitems + i - n - 1]->name); + fprintf(f, "yystack.l_mark[%d].%s", i - n, tag); } else { if (i > n) dollar_warning(lineno, i); - fprintf(f, "yyvsp[%d]", i - n); + fprintf(f, "yystack.l_mark[%d]", i - n); } goto loop; } @@ -1424,7 +1651,7 @@ loop: i = get_number(); if (ntags) unknown_rhs(-i); - fprintf(f, "yyvsp[%d]", -i - n); + fprintf(f, "yystack.l_mark[%d]", -i - n); goto loop; } } @@ -1434,7 +1661,8 @@ loop: { putc(c, f); c = *++cptr; - } while (isalnum(c) || c == '_' || c == '$'); + } + while (isalnum(c) || c == '_' || c == '$'); goto loop; } putc(c, f); @@ -1442,23 +1670,28 @@ loop: switch (c) { case '\n': - next_line: + next_line: get_line(); - if (line) goto loop; + if (line) + goto loop; unterminated_action(a_lineno, a_line, a_cptr); case ';': - if (depth > 0) goto loop; + if (depth > 0) + goto loop; fprintf(f, "\nbreak;\n"); + free(a_line); return; - case '{': + case L_CURL: ++depth; goto loop; - case '}': - if (--depth > 0) goto loop; + case R_CURL: + if (--depth > 0) + goto loop; fprintf(f, "\nbreak;\n"); + free(a_line); return; case '\'': @@ -1475,7 +1708,7 @@ loop: putc(c, f); if (c == quote) { - free(s_line); + FREE(s_line); goto loop; } if (c == '\n') @@ -1525,7 +1758,7 @@ loop: { putc('/', f); ++cptr; - free(c_line); + FREE(c_line); goto loop; } if (c == '\n') @@ -1543,12 +1776,13 @@ loop: } } - static int mark_symbol(void) { int c; - bucket *bp = NULL; + bucket *bp; + + bp = NULL; c = cptr[1]; if (c == '%' || c == '\\') @@ -1576,7 +1810,7 @@ mark_symbol(void) else { syntax_error(lineno, line, cptr); - /*NOTREACHED*/ + /*NOTREACHED */ } if (rprec[nrules] != UNDEFINED && bp->prec != rprec[nrules]) @@ -1587,7 +1821,6 @@ mark_symbol(void) return (0); } - static void read_grammar(void) { @@ -1599,21 +1832,27 @@ read_grammar(void) for (;;) { c = nextc(); - if (c == EOF) break; - if (isalpha(c) || c == '_' || c == '.' || c == '$' || c == '\'' || - c == '"') + if (c == EOF) + break; + if (isalpha(c) + || c == '_' + || c == '.' + || c == '$' + || c == '\'' + || c == '"') add_symbol(); - else if (c == '{' || c == '=') + else if (c == L_CURL || c == '=') copy_action(); else if (c == '|') { end_rule(); - start_rule(plhs[nrules-1], 0); + start_rule(plhs[nrules - 1], 0); ++cptr; } else if (c == '%') { - if (mark_symbol()) break; + if (mark_symbol()) + break; } else syntax_error(lineno, line, cptr); @@ -1621,49 +1860,49 @@ read_grammar(void) end_rule(); } - static void free_tags(void) { int i; - if (tag_table == 0) return; + if (tag_table == 0) + return; for (i = 0; i < ntags; ++i) { assert(tag_table[i]); - free(tag_table[i]); + FREE(tag_table[i]); } - free(tag_table); + FREE(tag_table); } - static void pack_names(void) { bucket *bp; char *p, *s, *t; - name_pool_size = 13; /* 13 == sizeof("$end") + sizeof("$accept") */ + name_pool_size = 13; /* 13 == sizeof("$end") + sizeof("$accept") */ for (bp = first_symbol; bp; bp = bp->next) name_pool_size += strlen(bp->name) + 1; - name_pool = malloc(name_pool_size); - if (name_pool == 0) no_space(); + + name_pool = MALLOC(name_pool_size); + NO_SPACE(name_pool); strcpy(name_pool, "$accept"); - strcpy(name_pool+8, "$end"); + strcpy(name_pool + 8, "$end"); t = name_pool + 13; for (bp = first_symbol; bp; bp = bp->next) { p = t; s = bp->name; - while ((*t++ = *s++)) continue; - free(bp->name); + while ((*t++ = *s++) != 0) + continue; + FREE(bp->name); bp->name = p; } } - static void check_symbols(void) { @@ -1682,41 +1921,78 @@ check_symbols(void) } } +static void +protect_string(char *src, char **des) +{ + unsigned len; + char *s; + char *d; + + *des = src; + if (src) + { + len = 1; + s = src; + while (*s) + { + if ('\\' == *s || '"' == *s) + len++; + s++; + len++; + } + + *des = d = (char *)MALLOC(len); + NO_SPACE(d); + + s = src; + while (*s) + { + if ('\\' == *s || '"' == *s) + *d++ = '\\'; + *d++ = *s++; + } + *d = '\0'; + } +} static void pack_symbols(void) { bucket *bp; bucket **v; - int i, j, k, n; + Value_t i, j, k, n; nsyms = 2; ntokens = 1; for (bp = first_symbol; bp; bp = bp->next) { ++nsyms; - if (bp->class == TERM) ++ntokens; + if (bp->class == TERM) + ++ntokens; } - start_symbol = ntokens; + start_symbol = (Value_t) ntokens; nvars = nsyms - ntokens; - symbol_name = malloc(nsyms*sizeof(char *)); - if (symbol_name == 0) no_space(); - symbol_value = malloc(nsyms*sizeof(short)); - if (symbol_value == 0) no_space(); - symbol_prec = malloc(nsyms*sizeof(short)); - if (symbol_prec == 0) no_space(); - symbol_assoc = malloc(nsyms); - if (symbol_assoc == 0) no_space(); + symbol_name = (char **)MALLOC((unsigned)nsyms * sizeof(char *)); + NO_SPACE(symbol_name); - v = malloc(nsyms*sizeof(bucket *)); - if (v == 0) no_space(); + symbol_value = (short *)MALLOC((unsigned)nsyms * sizeof(short)); + NO_SPACE(symbol_value); + + symbol_prec = (short *)MALLOC((unsigned)nsyms * sizeof(short)); + NO_SPACE(symbol_prec); + + symbol_assoc = MALLOC(nsyms); + NO_SPACE(symbol_assoc); + + v = (bucket **)MALLOC((unsigned)nsyms * sizeof(bucket *)); + NO_SPACE(v); v[0] = 0; v[start_symbol] = 0; i = 1; - j = start_symbol + 1; + j = (Value_t) (start_symbol + 1); for (bp = first_symbol; bp; bp = bp->next) { if (bp->class == TERM) @@ -1729,8 +2005,8 @@ pack_symbols(void) for (i = 1; i < ntokens; ++i) v[i]->index = i; - goal->index = start_symbol + 1; - k = start_symbol + 2; + goal->index = (Index_t) (start_symbol + 1); + k = (Value_t) (start_symbol + 2); while (++i < nsyms) if (v[i] != goal) { @@ -1740,7 +2016,7 @@ pack_symbols(void) goal->value = 0; k = 1; - for (i = start_symbol + 1; i < nsyms; ++i) + for (i = (Value_t) (start_symbol + 1); i < nsyms; ++i) { if (v[i] != goal) { @@ -1755,12 +2031,14 @@ pack_symbols(void) n = v[i]->value; if (n > 256) { - for (j = k++; j > 0 && symbol_value[j-1] > n; --j) - symbol_value[j] = symbol_value[j-1]; + for (j = k++; j > 0 && symbol_value[j - 1] > n; --j) + symbol_value[j] = symbol_value[j - 1]; symbol_value[j] = n; } } + assert(v[1] != 0); + if (v[1]->value == UNDEFINED) v[1]->value = 256; @@ -1772,7 +2050,8 @@ pack_symbols(void) { while (j < k && n == symbol_value[j]) { - while (++j < k && n == symbol_value[j]) continue; + while (++j < k && n == symbol_value[j]) + continue; ++n; } v[i]->value = n; @@ -1804,26 +2083,40 @@ pack_symbols(void) symbol_assoc[k] = v[i]->assoc; } - free(v); -} + if (gflag) + { + symbol_pname = (char **)MALLOC((unsigned)nsyms * sizeof(char *)); + NO_SPACE(symbol_pname); + for (i = 0; i < nsyms; ++i) + protect_string(symbol_name[i], &(symbol_pname[i])); + } + + FREE(v); +} static void pack_grammar(void) { - int i, j; - int assoc, preced; + int i; + Value_t j; + Assoc_t assoc; + Value_t prec2; - ritem = malloc(nitems*sizeof(short)); - if (ritem == 0) no_space(); - rlhs = malloc(nrules*sizeof(short)); - if (rlhs == 0) no_space(); - rrhs = malloc((nrules+1)*sizeof(short)); - if (rrhs == 0) no_space(); - rprec = realloc(rprec, nrules*sizeof(short)); - if (rprec == 0) no_space(); - rassoc = realloc(rassoc, nrules); - if (rassoc == 0) no_space(); + ritem = (short *)MALLOC((unsigned)nitems * sizeof(short)); + NO_SPACE(ritem); + + rlhs = (short *)MALLOC((unsigned)nrules * sizeof(short)); + NO_SPACE(rlhs); + + rrhs = (short *)MALLOC((unsigned)(nrules + 1) * sizeof(short)); + NO_SPACE(rrhs); + + rprec = (short *)REALLOC(rprec, (unsigned)nrules * sizeof(short)); + NO_SPACE(rprec); + + rassoc = REALLOC(rassoc, nrules); + NO_SPACE(rassoc); ritem[0] = -1; ritem[1] = goal->index; @@ -1842,48 +2135,48 @@ pack_grammar(void) rlhs[i] = plhs[i]->index; rrhs[i] = j; assoc = TOKEN; - preced = 0; + prec2 = 0; while (pitem[j]) { ritem[j] = pitem[j]->index; if (pitem[j]->class == TERM) { - preced = pitem[j]->prec; + prec2 = pitem[j]->prec; assoc = pitem[j]->assoc; } ++j; } - ritem[j] = -i; + ritem[j] = (Value_t) - i; ++j; if (rprec[i] == UNDEFINED) { - rprec[i] = preced; + rprec[i] = prec2; rassoc[i] = assoc; } } rrhs[i] = j; - free(plhs); - free(pitem); + FREE(plhs); + FREE(pitem); } - static void print_grammar(void) { - int i, j, k; - int spacing; + int i, k; + size_t j, spacing = 0; FILE *f = verbose_file; - if (!vflag) return; + if (!vflag) + return; k = 1; - spacing = 0; for (i = 2; i < nrules; ++i) { - if (rlhs[i] != rlhs[i-1]) + if (rlhs[i] != rlhs[i - 1]) { - if (i != 2) fprintf(f, "\n"); + if (i != 2) + fprintf(f, "\n"); fprintf(f, "%4d %s :", i - 2, symbol_name[rlhs[i]]); spacing = strlen(symbol_name[rlhs[i]]) + 1; } @@ -1891,7 +2184,8 @@ print_grammar(void) { fprintf(f, "%4d ", i - 2); j = spacing; - while (--j >= 0) putc(' ', f); + while (j-- != 0) + putc(' ', f); putc('|', f); } @@ -1905,11 +2199,10 @@ print_grammar(void) } } - void reader(void) { - write_section(banner); + write_section(code_file, banner); create_symbol_table(); read_declarations(); read_grammar(); @@ -1922,3 +2215,40 @@ reader(void) free_symbols(); print_grammar(); } + +#ifdef NO_LEAKS +static param * +free_declarations(param * list) +{ + while (list != 0) + { + param *next = list->next; + free(list->type); + free(list->name); + free(list->type2); + free(list); + list = next; + } + return list; +} + +void +reader_leaks(void) +{ + lex_param = free_declarations(lex_param); + parse_param = free_declarations(parse_param); + + DO_FREE(line); + DO_FREE(rrhs); + DO_FREE(rlhs); + DO_FREE(rprec); + DO_FREE(ritem); + DO_FREE(rassoc); + DO_FREE(cache); + DO_FREE(name_pool); + DO_FREE(symbol_name); + DO_FREE(symbol_prec); + DO_FREE(symbol_assoc); + DO_FREE(symbol_value); +} +#endif diff --git a/contrib/byacc/skeleton.c b/contrib/byacc/skeleton.c new file mode 100644 index 00000000000..48ae6949aa9 --- /dev/null +++ b/contrib/byacc/skeleton.c @@ -0,0 +1,439 @@ +/* $Id: skeleton.c,v 1.31 2011/09/07 09:37:59 tom Exp $ */ + +#include "defs.h" + +/* The definition of yysccsid in the banner should be replaced with */ +/* a #pragma ident directive if the target C compiler supports */ +/* #pragma ident directives. */ +/* */ +/* If the skeleton is changed, the banner should be changed so that */ +/* the altered version can be easily distinguished from the original. */ +/* */ +/* The #defines included with the banner are there because they are */ +/* useful in subsequent code. The macros #defined in the header or */ +/* the body either are not useful outside of semantic actions or */ +/* are conditional. */ + +const char *const banner[] = +{ + "#ifndef lint", + "static const char yysccsid[] = \"@(#)yaccpar 1.9 (Berkeley) 02/21/93\";", + "#endif", + "", + "#define YYBYACC 1", + CONCAT1("#define YYMAJOR ", YYMAJOR), + CONCAT1("#define YYMINOR ", YYMINOR), +#ifdef YYPATCH + CONCAT1("#define YYPATCH ", YYPATCH), +#endif + "", + "#define YYEMPTY (-1)", + "#define yyclearin (yychar = YYEMPTY)", + "#define yyerrok (yyerrflag = 0)", + "#define YYRECOVERING() (yyerrflag != 0)", + "", + 0 +}; + +const char *const xdecls[] = +{ + "", + "extern int YYPARSE_DECL();", + 0 +}; + +const char *const tables[] = +{ + "extern short yylhs[];", + "extern short yylen[];", + "extern short yydefred[];", + "extern short yydgoto[];", + "extern short yysindex[];", + "extern short yyrindex[];", + "extern short yygindex[];", + "extern short yytable[];", + "extern short yycheck[];", + "", + "#if YYDEBUG", + "extern char *yyname[];", + "extern char *yyrule[];", + "#endif", + 0 +}; + +const char *const global_vars[] = +{ + "", + "int yydebug;", + "int yynerrs;", + 0 +}; + +const char *const impure_vars[] = +{ + "", + "int yyerrflag;", + "int yychar;", + "YYSTYPE yyval;", + "YYSTYPE yylval;", + 0 +}; + +const char *const hdr_defs[] = +{ + "", + "/* define the initial stack-sizes */", + "#ifdef YYSTACKSIZE", + "#undef YYMAXDEPTH", + "#define YYMAXDEPTH YYSTACKSIZE", + "#else", + "#ifdef YYMAXDEPTH", + "#define YYSTACKSIZE YYMAXDEPTH", + "#else", + "#define YYSTACKSIZE 500", + "#define YYMAXDEPTH 500", + "#endif", + "#endif", + "", + "#define YYINITSTACKSIZE 500", + "", + "typedef struct {", + " unsigned stacksize;", + " short *s_base;", + " short *s_mark;", + " short *s_last;", + " YYSTYPE *l_base;", + " YYSTYPE *l_mark;", + "} YYSTACKDATA;", + 0 +}; + +const char *const hdr_vars[] = +{ + "/* variables for the parser stack */", + "static YYSTACKDATA yystack;", + 0 +}; + +const char *const body_vars[] = +{ + " int yyerrflag;", + " int yychar;", + " YYSTYPE yyval;", + " YYSTYPE yylval;", + "", + " /* variables for the parser stack */", + " YYSTACKDATA yystack;", + 0 +}; + +const char *const body_1[] = +{ + "", + "#if YYDEBUG", + "#include /* needed for printf */", + "#endif", + "", + "#include /* needed for malloc, etc */", + "#include /* needed for memset */", + "", + "/* allocate initial stack or double stack size, up to YYMAXDEPTH */", + "static int yygrowstack(YYSTACKDATA *data)", + "{", + " int i;", + " unsigned newsize;", + " short *newss;", + " YYSTYPE *newvs;", + "", + " if ((newsize = data->stacksize) == 0)", + " newsize = YYINITSTACKSIZE;", + " else if (newsize >= YYMAXDEPTH)", + " return -1;", + " else if ((newsize *= 2) > YYMAXDEPTH)", + " newsize = YYMAXDEPTH;", + "", + " i = data->s_mark - data->s_base;", + " newss = (short *)realloc(data->s_base, newsize * sizeof(*newss));", + " if (newss == 0)", + " return -1;", + "", + " data->s_base = newss;", + " data->s_mark = newss + i;", + "", + " newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));", + " if (newvs == 0)", + " return -1;", + "", + " data->l_base = newvs;", + " data->l_mark = newvs + i;", + "", + " data->stacksize = newsize;", + " data->s_last = data->s_base + newsize - 1;", + " return 0;", + "}", + "", + "#if YYPURE || defined(YY_NO_LEAKS)", + "static void yyfreestack(YYSTACKDATA *data)", + "{", + " free(data->s_base);", + " free(data->l_base);", + " memset(data, 0, sizeof(*data));", + "}", + "#else", + "#define yyfreestack(data) /* nothing */", + "#endif", + "", + "#define YYABORT goto yyabort", + "#define YYREJECT goto yyabort", + "#define YYACCEPT goto yyaccept", + "#define YYERROR goto yyerrlab", + "", + "int", + "YYPARSE_DECL()", + "{", + 0 +}; + +const char *const body_2[] = +{ + " int yym, yyn, yystate;", + "#if YYDEBUG", + " const char *yys;", + "", + " if ((yys = getenv(\"YYDEBUG\")) != 0)", + " {", + " yyn = *yys;", + " if (yyn >= '0' && yyn <= '9')", + " yydebug = yyn - '0';", + " }", + "#endif", + "", + " yynerrs = 0;", + " yyerrflag = 0;", + " yychar = YYEMPTY;", + " yystate = 0;", + "", + "#if YYPURE", + " memset(&yystack, 0, sizeof(yystack));", + "#endif", + "", + " if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow;", + " yystack.s_mark = yystack.s_base;", + " yystack.l_mark = yystack.l_base;", + " yystate = 0;", + " *yystack.s_mark = 0;", + "", + "yyloop:", + " if ((yyn = yydefred[yystate]) != 0) goto yyreduce;", + " if (yychar < 0)", + " {", + " if ((yychar = YYLEX) < 0) yychar = 0;", + "#if YYDEBUG", + " if (yydebug)", + " {", + " yys = 0;", + " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", + " if (!yys) yys = \"illegal-symbol\";", + " printf(\"%sdebug: state %d, reading %d (%s)\\n\",", + " YYPREFIX, yystate, yychar, yys);", + " }", + "#endif", + " }", + " if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&", + " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)", + " {", + "#if YYDEBUG", + " if (yydebug)", + " printf(\"%sdebug: state %d, shifting to state %d\\n\",", + " YYPREFIX, yystate, yytable[yyn]);", + "#endif", + " if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))", + " {", + " goto yyoverflow;", + " }", + " yystate = yytable[yyn];", + " *++yystack.s_mark = yytable[yyn];", + " *++yystack.l_mark = yylval;", + " yychar = YYEMPTY;", + " if (yyerrflag > 0) --yyerrflag;", + " goto yyloop;", + " }", + " if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&", + " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)", + " {", + " yyn = yytable[yyn];", + " goto yyreduce;", + " }", + " if (yyerrflag) goto yyinrecovery;", + "", + 0 +}; + +const char *const body_3[] = +{ + "", + " goto yyerrlab;", + "", + "yyerrlab:", + " ++yynerrs;", + "", + "yyinrecovery:", + " if (yyerrflag < 3)", + " {", + " yyerrflag = 3;", + " for (;;)", + " {", + " if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&", + " yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)", + " {", + "#if YYDEBUG", + " if (yydebug)", + " printf(\"%sdebug: state %d, error recovery shifting\\", + " to state %d\\n\", YYPREFIX, *yystack.s_mark, yytable[yyn]);", + "#endif", + " if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))", + " {", + " goto yyoverflow;", + " }", + " yystate = yytable[yyn];", + " *++yystack.s_mark = yytable[yyn];", + " *++yystack.l_mark = yylval;", + " goto yyloop;", + " }", + " else", + " {", + "#if YYDEBUG", + " if (yydebug)", + " printf(\"%sdebug: error recovery discarding state %d\ +\\n\",", + " YYPREFIX, *yystack.s_mark);", + "#endif", + " if (yystack.s_mark <= yystack.s_base) goto yyabort;", + " --yystack.s_mark;", + " --yystack.l_mark;", + " }", + " }", + " }", + " else", + " {", + " if (yychar == 0) goto yyabort;", + "#if YYDEBUG", + " if (yydebug)", + " {", + " yys = 0;", + " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", + " if (!yys) yys = \"illegal-symbol\";", + " printf(\"%sdebug: state %d, error recovery discards token %d\ + (%s)\\n\",", + " YYPREFIX, yystate, yychar, yys);", + " }", + "#endif", + " yychar = YYEMPTY;", + " goto yyloop;", + " }", + "", + "yyreduce:", + "#if YYDEBUG", + " if (yydebug)", + " printf(\"%sdebug: state %d, reducing by rule %d (%s)\\n\",", + " YYPREFIX, yystate, yyn, yyrule[yyn]);", + "#endif", + " yym = yylen[yyn];", + " if (yym)", + " yyval = yystack.l_mark[1-yym];", + " else", + " memset(&yyval, 0, sizeof yyval);", + " switch (yyn)", + " {", + 0 +}; + +const char *const trailer[] = +{ + " }", + " yystack.s_mark -= yym;", + " yystate = *yystack.s_mark;", + " yystack.l_mark -= yym;", + " yym = yylhs[yyn];", + " if (yystate == 0 && yym == 0)", + " {", + "#if YYDEBUG", + " if (yydebug)", + " printf(\"%sdebug: after reduction, shifting from state 0 to\\", + " state %d\\n\", YYPREFIX, YYFINAL);", + "#endif", + " yystate = YYFINAL;", + " *++yystack.s_mark = YYFINAL;", + " *++yystack.l_mark = yyval;", + " if (yychar < 0)", + " {", + " if ((yychar = YYLEX) < 0) yychar = 0;", + "#if YYDEBUG", + " if (yydebug)", + " {", + " yys = 0;", + " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", + " if (!yys) yys = \"illegal-symbol\";", + " printf(\"%sdebug: state %d, reading %d (%s)\\n\",", + " YYPREFIX, YYFINAL, yychar, yys);", + " }", + "#endif", + " }", + " if (yychar == 0) goto yyaccept;", + " goto yyloop;", + " }", + " if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&", + " yyn <= YYTABLESIZE && yycheck[yyn] == yystate)", + " yystate = yytable[yyn];", + " else", + " yystate = yydgoto[yym];", + "#if YYDEBUG", + " if (yydebug)", + " printf(\"%sdebug: after reduction, shifting from state %d \\", + "to state %d\\n\", YYPREFIX, *yystack.s_mark, yystate);", + "#endif", + " if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))", + " {", + " goto yyoverflow;", + " }", + " *++yystack.s_mark = (short) yystate;", + " *++yystack.l_mark = yyval;", + " goto yyloop;", + "", + "yyoverflow:", + 0 +}; + +const char *const trailer_2[] = +{ + "", + "yyabort:", + " yyfreestack(&yystack);", + " return (1);", + "", + "yyaccept:", + " yyfreestack(&yystack);", + " return (0);", + "}", + 0 +}; + +void +write_section(FILE * fp, const char *const section[]) +{ + int c; + int i; + const char *s; + + for (i = 0; (s = section[i]) != 0; ++i) + { + while ((c = *s) != 0) + { + putc(c, fp); + ++s; + } + if (fp == code_file) + ++outline; + putc('\n', fp); + } +} diff --git a/contrib/byacc/symtab.c b/contrib/byacc/symtab.c new file mode 100644 index 00000000000..1327eaffc33 --- /dev/null +++ b/contrib/byacc/symtab.c @@ -0,0 +1,117 @@ +/* $Id: symtab.c,v 1.9 2010/11/24 15:12:29 tom Exp $ */ + +#include "defs.h" + +/* TABLE_SIZE is the number of entries in the symbol table. */ +/* TABLE_SIZE must be a power of two. */ + +#define TABLE_SIZE 1024 + +static bucket **symbol_table = 0; +bucket *first_symbol; +bucket *last_symbol; + +static int +hash(const char *name) +{ + const char *s; + int c, k; + + assert(name && *name); + s = name; + k = *s; + while ((c = *++s) != 0) + k = (31 * k + c) & (TABLE_SIZE - 1); + + return (k); +} + +bucket * +make_bucket(const char *name) +{ + bucket *bp; + + assert(name != 0); + + bp = (bucket *)MALLOC(sizeof(bucket)); + NO_SPACE(bp); + + bp->link = 0; + bp->next = 0; + + bp->name = MALLOC(strlen(name) + 1); + NO_SPACE(bp->name); + + bp->tag = 0; + bp->value = UNDEFINED; + bp->index = 0; + bp->prec = 0; + bp->class = UNKNOWN; + bp->assoc = TOKEN; + strcpy(bp->name, name); + + return (bp); +} + +bucket * +lookup(const char *name) +{ + bucket *bp, **bpp; + + bpp = symbol_table + hash(name); + bp = *bpp; + + while (bp) + { + if (strcmp(name, bp->name) == 0) + return (bp); + bpp = &bp->link; + bp = *bpp; + } + + *bpp = bp = make_bucket(name); + last_symbol->next = bp; + last_symbol = bp; + + return (bp); +} + +void +create_symbol_table(void) +{ + int i; + bucket *bp; + + symbol_table = (bucket **)MALLOC(TABLE_SIZE * sizeof(bucket *)); + NO_SPACE(symbol_table); + + for (i = 0; i < TABLE_SIZE; i++) + symbol_table[i] = 0; + + bp = make_bucket("error"); + bp->index = 1; + bp->class = TERM; + + first_symbol = bp; + last_symbol = bp; + symbol_table[hash("error")] = bp; +} + +void +free_symbol_table(void) +{ + FREE(symbol_table); + symbol_table = 0; +} + +void +free_symbols(void) +{ + bucket *p, *q; + + for (p = first_symbol; p; p = q) + { + q = p->next; + FREE(p); + } +} diff --git a/contrib/byacc/test/README b/contrib/byacc/test/README new file mode 100644 index 00000000000..c9133c5bc87 --- /dev/null +++ b/contrib/byacc/test/README @@ -0,0 +1,4 @@ +-- $Id: README,v 1.1 2004/03/28 19:10:48 tom Exp $ + +The files in this directory are input (.y) and output (.output, .tab.c, .tab.h) +examples. diff --git a/contrib/byacc/test/calc.output b/contrib/byacc/test/calc.output new file mode 100644 index 00000000000..3aed47511c9 --- /dev/null +++ b/contrib/byacc/test/calc.output @@ -0,0 +1,461 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr '+' expr + 8 | expr '-' expr + 9 | expr '*' expr + 10 | expr '/' expr + 11 | expr '%' expr + 12 | expr '&' expr + 13 | expr '|' expr + 14 | '-' expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + DIGIT shift 3 + LETTER shift 4 + '-' shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + number : DIGIT . (17) + + . reduce 17 + + +state 4 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 11 + '|' reduce 15 + '&' reduce 15 + '+' reduce 15 + '-' reduce 15 + '*' reduce 15 + '/' reduce 15 + '%' reduce 15 + '\n' reduce 15 + + +state 5 + expr : '-' . expr (14) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 13 + number goto 9 + + +state 6 + expr : '(' . expr ')' (6) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + '|' reduce 16 + '&' reduce 16 + '+' reduce 16 + '-' reduce 16 + '*' reduce 16 + '/' reduce 16 + '%' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + stat : LETTER '=' . expr (5) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 12 + expr : LETTER . (15) + + . reduce 15 + + +state 13 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + expr : '-' expr . (14) + + . reduce 14 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr '|' . expr (13) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr '&' . expr (12) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr '+' . expr (7) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr '-' . expr (8) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr '*' . expr (9) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr '/' . expr (10) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '%' . expr (11) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +state 26 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +state 27 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr '&' expr . (12) + expr : expr . '|' expr (13) + + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 12 + '&' reduce 12 + '\n' reduce 12 + ')' reduce 12 + + +state 28 + expr : expr . '+' expr (7) + expr : expr '+' expr . (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 7 + '&' reduce 7 + '+' reduce 7 + '-' reduce 7 + '\n' reduce 7 + ')' reduce 7 + + +state 29 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr '-' expr . (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 8 + '&' reduce 8 + '+' reduce 8 + '-' reduce 8 + '\n' reduce 8 + ')' reduce 8 + + +state 30 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr '*' expr . (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 9 + + +state 31 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr '/' expr . (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 10 + + +state 32 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr '%' expr . (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 11 + + +16 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/calc.tab.c b/contrib/byacc/test/calc.tab.c new file mode 100644 index 00000000000..de039ec8f26 --- /dev/null +++ b/contrib/byacc/test/calc.tab.c @@ -0,0 +1,673 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse calc_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex calc_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror calc_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar calc_char +#endif /* yychar */ + +#ifndef yyval +#define yyval calc_val +#endif /* yyval */ + +#ifndef yylval +#define yylval calc_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug calc_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs calc_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag calc_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs calc_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen calc_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred calc_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto calc_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex calc_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex calc_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex calc_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable calc_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck calc_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname calc_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule calc_rule +#endif /* yyrule */ +#define YYPREFIX "calc_" + +#define YYPURE 0 + +#line 2 "calc.y" +# include +# include + +int regs[26]; +int base; + +extern int yylex(void); +static void yyerror(const char *s); + +#line 109 "calc.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 +#define YYERRCODE 256 +static const short calc_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short calc_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short calc_defred[] = { 1, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 3, + 0, 15, 14, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 9, + 10, 11, +}; +static const short calc_dgoto[] = { 1, + 7, 8, 9, +}; +static const short calc_sindex[] = { 0, + -40, -7, 0, -55, -38, -38, 1, -29, -247, 0, + -38, 0, 0, 22, 0, -38, -38, -38, -38, -38, + -38, -38, 0, -29, 0, 51, 60, -20, -20, 0, + 0, 0, +}; +static const short calc_rindex[] = { 0, + 0, 0, 0, 2, 0, 0, 0, 9, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, -6, 14, 5, 13, 0, + 0, 0, +}; +static const short calc_gindex[] = { 0, + 0, 65, 0, +}; +#define YYTABLESIZE 220 +static const short calc_table[] = { 6, + 16, 6, 10, 13, 5, 11, 5, 22, 17, 23, + 15, 15, 20, 18, 7, 19, 22, 21, 4, 5, + 0, 20, 8, 12, 0, 0, 21, 16, 16, 0, + 0, 16, 16, 16, 13, 16, 0, 16, 15, 15, + 0, 0, 7, 15, 15, 7, 15, 7, 15, 7, + 8, 12, 0, 8, 12, 8, 0, 8, 22, 17, + 0, 0, 25, 20, 18, 0, 19, 0, 21, 13, + 14, 0, 0, 0, 0, 24, 0, 0, 0, 0, + 26, 27, 28, 29, 30, 31, 32, 22, 17, 0, + 0, 0, 20, 18, 16, 19, 22, 21, 0, 0, + 0, 20, 18, 0, 19, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 8, 12, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 3, 12, +}; +static const short calc_check[] = { 40, + 10, 40, 10, 10, 45, 61, 45, 37, 38, 257, + 10, 10, 42, 43, 10, 45, 37, 47, 10, 10, + -1, 42, 10, 10, -1, -1, 47, 37, 38, -1, + -1, 41, 42, 43, 41, 45, -1, 47, 37, 38, + -1, -1, 38, 42, 43, 41, 45, 43, 47, 45, + 38, 38, -1, 41, 41, 43, -1, 45, 37, 38, + -1, -1, 41, 42, 43, -1, 45, -1, 47, 5, + 6, -1, -1, -1, -1, 11, -1, -1, -1, -1, + 16, 17, 18, 19, 20, 21, 22, 37, 38, -1, + -1, -1, 42, 43, 124, 45, 37, 47, -1, -1, + -1, 42, 43, -1, 45, -1, 47, -1, -1, -1, + -1, -1, -1, -1, 124, -1, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 124, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 256, 257, 258, 257, 258, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 259 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr '+' expr", +"expr : expr '-' expr", +"expr : expr '*' expr", +"expr : expr '/' expr", +"expr : expr '%' expr", +"expr : expr '&' expr", +"expr : expr '|' expr", +"expr : '-' expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 66 "calc.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 347 "calc.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 28 "calc.y" + { yyerrok ; } +break; +case 4: +#line 32 "calc.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 34 "calc.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 38 "calc.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 40 "calc.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 42 "calc.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 44 "calc.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 46 "calc.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 48 "calc.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 50 "calc.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 52 "calc.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 54 "calc.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 56 "calc.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 61 "calc.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 63 "calc.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 613 "calc.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/calc.tab.h b/contrib/byacc/test/calc.tab.h new file mode 100644 index 00000000000..19211182d6b --- /dev/null +++ b/contrib/byacc/test/calc.tab.h @@ -0,0 +1,3 @@ +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 diff --git a/contrib/byacc/test/calc.y b/contrib/byacc/test/calc.y new file mode 100644 index 00000000000..c2e5a898c93 --- /dev/null +++ b/contrib/byacc/test/calc.y @@ -0,0 +1,106 @@ +%{ +# include +# include + +int regs[26]; +int base; + +extern int yylex(void); +static void yyerror(const char *s); + +%} + +%start list + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr '+' expr + { $$ = $1 + $3; } + | expr '-' expr + { $$ = $1 - $3; } + | expr '*' expr + { $$ = $1 * $3; } + | expr '/' expr + { $$ = $1 / $3; } + | expr '%' expr + { $$ = $1 % $3; } + | expr '&' expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | '-' expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/contrib/byacc/test/calc1.output b/contrib/byacc/test/calc1.output new file mode 100644 index 00000000000..2b628d47ddb --- /dev/null +++ b/contrib/byacc/test/calc1.output @@ -0,0 +1,877 @@ + 0 $accept : line $end + + 1 lines : + 2 | lines line + + 3 line : dexp '\n' + 4 | vexp '\n' + 5 | DREG '=' dexp '\n' + 6 | VREG '=' vexp '\n' + 7 | error '\n' + + 8 dexp : CONST + 9 | DREG + 10 | dexp '+' dexp + 11 | dexp '-' dexp + 12 | dexp '*' dexp + 13 | dexp '/' dexp + 14 | '-' dexp + 15 | '(' dexp ')' + + 16 vexp : dexp + 17 | '(' dexp ',' dexp ')' + 18 | VREG + 19 | vexp '+' vexp + 20 | dexp '+' vexp + 21 | vexp '-' vexp + 22 | dexp '-' vexp + 23 | vexp '*' vexp + 24 | dexp '*' vexp + 25 | vexp '/' vexp + 26 | dexp '/' vexp + 27 | '-' vexp + 28 | '(' vexp ')' + +state 0 + $accept : . line $end (0) + + error shift 1 + DREG shift 2 + VREG shift 3 + CONST shift 4 + '-' shift 5 + '(' shift 6 + . error + + line goto 7 + dexp goto 8 + vexp goto 9 + + +state 1 + line : error . '\n' (7) + + '\n' shift 10 + . error + + +state 2 + line : DREG . '=' dexp '\n' (5) + dexp : DREG . (9) + + '=' shift 11 + '+' reduce 9 + '-' reduce 9 + '*' reduce 9 + '/' reduce 9 + '\n' reduce 9 + + +state 3 + line : VREG . '=' vexp '\n' (6) + vexp : VREG . (18) + + '=' shift 12 + '+' reduce 18 + '-' reduce 18 + '*' reduce 18 + '/' reduce 18 + '\n' reduce 18 + + +state 4 + dexp : CONST . (8) + + . reduce 8 + + +state 5 + dexp : '-' . dexp (14) + vexp : '-' . vexp (27) + + DREG shift 13 + VREG shift 14 + CONST shift 4 + '-' shift 5 + '(' shift 6 + . error + + dexp goto 15 + vexp goto 16 + + +state 6 + dexp : '(' . dexp ')' (15) + vexp : '(' . dexp ',' dexp ')' (17) + vexp : '(' . vexp ')' (28) + + DREG shift 13 + VREG shift 14 + CONST shift 4 + '-' shift 5 + '(' shift 6 + . error + + dexp goto 17 + vexp goto 18 + + +state 7 + $accept : line . $end (0) + + $end accept + + +8: shift/reduce conflict (shift 19, reduce 16) on '+' +8: shift/reduce conflict (shift 20, reduce 16) on '-' +8: shift/reduce conflict (shift 21, reduce 16) on '*' +8: shift/reduce conflict (shift 22, reduce 16) on '/' +8: shift/reduce conflict (shift 23, reduce 16) on '\n' +state 8 + line : dexp . '\n' (3) + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + vexp : dexp . (16) + vexp : dexp . '+' vexp (20) + vexp : dexp . '-' vexp (22) + vexp : dexp . '*' vexp (24) + vexp : dexp . '/' vexp (26) + + '+' shift 19 + '-' shift 20 + '*' shift 21 + '/' shift 22 + '\n' shift 23 + + +state 9 + line : vexp . '\n' (4) + vexp : vexp . '+' vexp (19) + vexp : vexp . '-' vexp (21) + vexp : vexp . '*' vexp (23) + vexp : vexp . '/' vexp (25) + + '+' shift 24 + '-' shift 25 + '*' shift 26 + '/' shift 27 + '\n' shift 28 + . error + + +state 10 + line : error '\n' . (7) + + . reduce 7 + + +state 11 + line : DREG '=' . dexp '\n' (5) + + DREG shift 13 + CONST shift 4 + '-' shift 29 + '(' shift 30 + . error + + dexp goto 31 + + +state 12 + line : VREG '=' . vexp '\n' (6) + + DREG shift 13 + VREG shift 14 + CONST shift 4 + '-' shift 5 + '(' shift 6 + . error + + dexp goto 32 + vexp goto 33 + + +state 13 + dexp : DREG . (9) + + . reduce 9 + + +state 14 + vexp : VREG . (18) + + . reduce 18 + + +15: reduce/reduce conflict (reduce 14, reduce 16) on '+' +15: reduce/reduce conflict (reduce 14, reduce 16) on '-' +15: reduce/reduce conflict (reduce 14, reduce 16) on '*' +15: reduce/reduce conflict (reduce 14, reduce 16) on '/' +15: reduce/reduce conflict (reduce 14, reduce 16) on '\n' +15: reduce/reduce conflict (reduce 14, reduce 16) on ')' +state 15 + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + dexp : '-' dexp . (14) + vexp : dexp . (16) + vexp : dexp . '+' vexp (20) + vexp : dexp . '-' vexp (22) + vexp : dexp . '*' vexp (24) + vexp : dexp . '/' vexp (26) + + . reduce 14 + + +state 16 + vexp : vexp . '+' vexp (19) + vexp : vexp . '-' vexp (21) + vexp : vexp . '*' vexp (23) + vexp : vexp . '/' vexp (25) + vexp : '-' vexp . (27) + + . reduce 27 + + +17: shift/reduce conflict (shift 19, reduce 16) on '+' +17: shift/reduce conflict (shift 20, reduce 16) on '-' +17: shift/reduce conflict (shift 21, reduce 16) on '*' +17: shift/reduce conflict (shift 22, reduce 16) on '/' +17: shift/reduce conflict (shift 34, reduce 16) on ')' +state 17 + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + dexp : '(' dexp . ')' (15) + vexp : dexp . (16) + vexp : '(' dexp . ',' dexp ')' (17) + vexp : dexp . '+' vexp (20) + vexp : dexp . '-' vexp (22) + vexp : dexp . '*' vexp (24) + vexp : dexp . '/' vexp (26) + + '+' shift 19 + '-' shift 20 + '*' shift 21 + '/' shift 22 + ')' shift 34 + ',' shift 35 + + +state 18 + vexp : vexp . '+' vexp (19) + vexp : vexp . '-' vexp (21) + vexp : vexp . '*' vexp (23) + vexp : vexp . '/' vexp (25) + vexp : '(' vexp . ')' (28) + + '+' shift 24 + '-' shift 25 + '*' shift 26 + '/' shift 27 + ')' shift 36 + . error + + +state 19 + dexp : dexp '+' . dexp (10) + vexp : dexp '+' . vexp (20) + + DREG shift 13 + VREG shift 14 + CONST shift 4 + '-' shift 5 + '(' shift 6 + . error + + dexp goto 37 + vexp goto 38 + + +state 20 + dexp : dexp '-' . dexp (11) + vexp : dexp '-' . vexp (22) + + DREG shift 13 + VREG shift 14 + CONST shift 4 + '-' shift 5 + '(' shift 6 + . error + + dexp goto 39 + vexp goto 40 + + +state 21 + dexp : dexp '*' . dexp (12) + vexp : dexp '*' . vexp (24) + + DREG shift 13 + VREG shift 14 + CONST shift 4 + '-' shift 5 + '(' shift 6 + . error + + dexp goto 41 + vexp goto 42 + + +state 22 + dexp : dexp '/' . dexp (13) + vexp : dexp '/' . vexp (26) + + DREG shift 13 + VREG shift 14 + CONST shift 4 + '-' shift 5 + '(' shift 6 + . error + + dexp goto 43 + vexp goto 44 + + +state 23 + line : dexp '\n' . (3) + + . reduce 3 + + +state 24 + vexp : vexp '+' . vexp (19) + + DREG shift 13 + VREG shift 14 + CONST shift 4 + '-' shift 5 + '(' shift 6 + . error + + dexp goto 32 + vexp goto 45 + + +state 25 + vexp : vexp '-' . vexp (21) + + DREG shift 13 + VREG shift 14 + CONST shift 4 + '-' shift 5 + '(' shift 6 + . error + + dexp goto 32 + vexp goto 46 + + +state 26 + vexp : vexp '*' . vexp (23) + + DREG shift 13 + VREG shift 14 + CONST shift 4 + '-' shift 5 + '(' shift 6 + . error + + dexp goto 32 + vexp goto 47 + + +state 27 + vexp : vexp '/' . vexp (25) + + DREG shift 13 + VREG shift 14 + CONST shift 4 + '-' shift 5 + '(' shift 6 + . error + + dexp goto 32 + vexp goto 48 + + +state 28 + line : vexp '\n' . (4) + + . reduce 4 + + +state 29 + dexp : '-' . dexp (14) + + DREG shift 13 + CONST shift 4 + '-' shift 29 + '(' shift 30 + . error + + dexp goto 49 + + +state 30 + dexp : '(' . dexp ')' (15) + + DREG shift 13 + CONST shift 4 + '-' shift 29 + '(' shift 30 + . error + + dexp goto 50 + + +state 31 + line : DREG '=' dexp . '\n' (5) + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + + '+' shift 51 + '-' shift 52 + '*' shift 53 + '/' shift 54 + '\n' shift 55 + . error + + +32: shift/reduce conflict (shift 19, reduce 16) on '+' +32: shift/reduce conflict (shift 20, reduce 16) on '-' +32: shift/reduce conflict (shift 21, reduce 16) on '*' +32: shift/reduce conflict (shift 22, reduce 16) on '/' +state 32 + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + vexp : dexp . (16) + vexp : dexp . '+' vexp (20) + vexp : dexp . '-' vexp (22) + vexp : dexp . '*' vexp (24) + vexp : dexp . '/' vexp (26) + + '+' shift 19 + '-' shift 20 + '*' shift 21 + '/' shift 22 + '\n' reduce 16 + ')' reduce 16 + + +state 33 + line : VREG '=' vexp . '\n' (6) + vexp : vexp . '+' vexp (19) + vexp : vexp . '-' vexp (21) + vexp : vexp . '*' vexp (23) + vexp : vexp . '/' vexp (25) + + '+' shift 24 + '-' shift 25 + '*' shift 26 + '/' shift 27 + '\n' shift 56 + . error + + +state 34 + dexp : '(' dexp ')' . (15) + + . reduce 15 + + +state 35 + vexp : '(' dexp ',' . dexp ')' (17) + + DREG shift 13 + CONST shift 4 + '-' shift 29 + '(' shift 30 + . error + + dexp goto 57 + + +state 36 + vexp : '(' vexp ')' . (28) + + . reduce 28 + + +37: reduce/reduce conflict (reduce 10, reduce 16) on '+' +37: reduce/reduce conflict (reduce 10, reduce 16) on '-' +37: shift/reduce conflict (shift 21, reduce 16) on '*' +37: shift/reduce conflict (shift 22, reduce 16) on '/' +37: reduce/reduce conflict (reduce 10, reduce 16) on '\n' +37: reduce/reduce conflict (reduce 10, reduce 16) on ')' +state 37 + dexp : dexp . '+' dexp (10) + dexp : dexp '+' dexp . (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + vexp : dexp . (16) + vexp : dexp . '+' vexp (20) + vexp : dexp . '-' vexp (22) + vexp : dexp . '*' vexp (24) + vexp : dexp . '/' vexp (26) + + '*' shift 21 + '/' shift 22 + '+' reduce 10 + '-' reduce 10 + '\n' reduce 10 + ')' reduce 10 + ',' reduce 10 + + +state 38 + vexp : vexp . '+' vexp (19) + vexp : dexp '+' vexp . (20) + vexp : vexp . '-' vexp (21) + vexp : vexp . '*' vexp (23) + vexp : vexp . '/' vexp (25) + + '*' shift 26 + '/' shift 27 + '+' reduce 20 + '-' reduce 20 + '\n' reduce 20 + ')' reduce 20 + + +39: reduce/reduce conflict (reduce 11, reduce 16) on '+' +39: reduce/reduce conflict (reduce 11, reduce 16) on '-' +39: shift/reduce conflict (shift 21, reduce 16) on '*' +39: shift/reduce conflict (shift 22, reduce 16) on '/' +39: reduce/reduce conflict (reduce 11, reduce 16) on '\n' +39: reduce/reduce conflict (reduce 11, reduce 16) on ')' +state 39 + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp '-' dexp . (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + vexp : dexp . (16) + vexp : dexp . '+' vexp (20) + vexp : dexp . '-' vexp (22) + vexp : dexp . '*' vexp (24) + vexp : dexp . '/' vexp (26) + + '*' shift 21 + '/' shift 22 + '+' reduce 11 + '-' reduce 11 + '\n' reduce 11 + ')' reduce 11 + ',' reduce 11 + + +state 40 + vexp : vexp . '+' vexp (19) + vexp : vexp . '-' vexp (21) + vexp : dexp '-' vexp . (22) + vexp : vexp . '*' vexp (23) + vexp : vexp . '/' vexp (25) + + '*' shift 26 + '/' shift 27 + '+' reduce 22 + '-' reduce 22 + '\n' reduce 22 + ')' reduce 22 + + +41: reduce/reduce conflict (reduce 12, reduce 16) on '+' +41: reduce/reduce conflict (reduce 12, reduce 16) on '-' +41: reduce/reduce conflict (reduce 12, reduce 16) on '*' +41: reduce/reduce conflict (reduce 12, reduce 16) on '/' +41: reduce/reduce conflict (reduce 12, reduce 16) on '\n' +41: reduce/reduce conflict (reduce 12, reduce 16) on ')' +state 41 + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp '*' dexp . (12) + dexp : dexp . '/' dexp (13) + vexp : dexp . (16) + vexp : dexp . '+' vexp (20) + vexp : dexp . '-' vexp (22) + vexp : dexp . '*' vexp (24) + vexp : dexp . '/' vexp (26) + + . reduce 12 + + +state 42 + vexp : vexp . '+' vexp (19) + vexp : vexp . '-' vexp (21) + vexp : vexp . '*' vexp (23) + vexp : dexp '*' vexp . (24) + vexp : vexp . '/' vexp (25) + + . reduce 24 + + +43: reduce/reduce conflict (reduce 13, reduce 16) on '+' +43: reduce/reduce conflict (reduce 13, reduce 16) on '-' +43: reduce/reduce conflict (reduce 13, reduce 16) on '*' +43: reduce/reduce conflict (reduce 13, reduce 16) on '/' +43: reduce/reduce conflict (reduce 13, reduce 16) on '\n' +43: reduce/reduce conflict (reduce 13, reduce 16) on ')' +state 43 + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + dexp : dexp '/' dexp . (13) + vexp : dexp . (16) + vexp : dexp . '+' vexp (20) + vexp : dexp . '-' vexp (22) + vexp : dexp . '*' vexp (24) + vexp : dexp . '/' vexp (26) + + . reduce 13 + + +state 44 + vexp : vexp . '+' vexp (19) + vexp : vexp . '-' vexp (21) + vexp : vexp . '*' vexp (23) + vexp : vexp . '/' vexp (25) + vexp : dexp '/' vexp . (26) + + . reduce 26 + + +state 45 + vexp : vexp . '+' vexp (19) + vexp : vexp '+' vexp . (19) + vexp : vexp . '-' vexp (21) + vexp : vexp . '*' vexp (23) + vexp : vexp . '/' vexp (25) + + '*' shift 26 + '/' shift 27 + '+' reduce 19 + '-' reduce 19 + '\n' reduce 19 + ')' reduce 19 + + +state 46 + vexp : vexp . '+' vexp (19) + vexp : vexp . '-' vexp (21) + vexp : vexp '-' vexp . (21) + vexp : vexp . '*' vexp (23) + vexp : vexp . '/' vexp (25) + + '*' shift 26 + '/' shift 27 + '+' reduce 21 + '-' reduce 21 + '\n' reduce 21 + ')' reduce 21 + + +state 47 + vexp : vexp . '+' vexp (19) + vexp : vexp . '-' vexp (21) + vexp : vexp . '*' vexp (23) + vexp : vexp '*' vexp . (23) + vexp : vexp . '/' vexp (25) + + . reduce 23 + + +state 48 + vexp : vexp . '+' vexp (19) + vexp : vexp . '-' vexp (21) + vexp : vexp . '*' vexp (23) + vexp : vexp . '/' vexp (25) + vexp : vexp '/' vexp . (25) + + . reduce 25 + + +state 49 + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + dexp : '-' dexp . (14) + + . reduce 14 + + +state 50 + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + dexp : '(' dexp . ')' (15) + + '+' shift 51 + '-' shift 52 + '*' shift 53 + '/' shift 54 + ')' shift 34 + . error + + +state 51 + dexp : dexp '+' . dexp (10) + + DREG shift 13 + CONST shift 4 + '-' shift 29 + '(' shift 30 + . error + + dexp goto 58 + + +state 52 + dexp : dexp '-' . dexp (11) + + DREG shift 13 + CONST shift 4 + '-' shift 29 + '(' shift 30 + . error + + dexp goto 59 + + +state 53 + dexp : dexp '*' . dexp (12) + + DREG shift 13 + CONST shift 4 + '-' shift 29 + '(' shift 30 + . error + + dexp goto 60 + + +state 54 + dexp : dexp '/' . dexp (13) + + DREG shift 13 + CONST shift 4 + '-' shift 29 + '(' shift 30 + . error + + dexp goto 61 + + +state 55 + line : DREG '=' dexp '\n' . (5) + + . reduce 5 + + +state 56 + line : VREG '=' vexp '\n' . (6) + + . reduce 6 + + +state 57 + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + vexp : '(' dexp ',' dexp . ')' (17) + + '+' shift 51 + '-' shift 52 + '*' shift 53 + '/' shift 54 + ')' shift 62 + . error + + +state 58 + dexp : dexp . '+' dexp (10) + dexp : dexp '+' dexp . (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + + '*' shift 53 + '/' shift 54 + '+' reduce 10 + '-' reduce 10 + '\n' reduce 10 + ')' reduce 10 + + +state 59 + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp '-' dexp . (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + + '*' shift 53 + '/' shift 54 + '+' reduce 11 + '-' reduce 11 + '\n' reduce 11 + ')' reduce 11 + + +state 60 + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp '*' dexp . (12) + dexp : dexp . '/' dexp (13) + + . reduce 12 + + +state 61 + dexp : dexp . '+' dexp (10) + dexp : dexp . '-' dexp (11) + dexp : dexp . '*' dexp (12) + dexp : dexp . '/' dexp (13) + dexp : dexp '/' dexp . (13) + + . reduce 13 + + +state 62 + vexp : '(' dexp ',' dexp ')' . (17) + + . reduce 17 + + +Rules never reduced: + lines : (1) + lines : lines line (2) + + +State 8 contains 5 shift/reduce conflicts. +State 15 contains 6 reduce/reduce conflicts. +State 17 contains 5 shift/reduce conflicts. +State 32 contains 4 shift/reduce conflicts. +State 37 contains 2 shift/reduce conflicts, 4 reduce/reduce conflicts. +State 39 contains 2 shift/reduce conflicts, 4 reduce/reduce conflicts. +State 41 contains 6 reduce/reduce conflicts. +State 43 contains 6 reduce/reduce conflicts. + + +15 terminals, 5 nonterminals +29 grammar rules, 63 states diff --git a/contrib/byacc/test/calc1.tab.c b/contrib/byacc/test/calc1.tab.c new file mode 100644 index 00000000000..65551e8ecbc --- /dev/null +++ b/contrib/byacc/test/calc1.tab.c @@ -0,0 +1,915 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse calc1_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex calc1_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror calc1_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar calc1_char +#endif /* yychar */ + +#ifndef yyval +#define yyval calc1_val +#endif /* yyval */ + +#ifndef yylval +#define yylval calc1_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug calc1_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs calc1_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag calc1_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs calc1_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen calc1_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred calc1_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto calc1_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex calc1_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex calc1_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex calc1_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable calc1_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck calc1_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname calc1_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule calc1_rule +#endif /* yyrule */ +#define YYPREFIX "calc1_" + +#define YYPURE 0 + +#line 2 "calc1.y" + +/* http://dinosaur.compilertools.net/yacc/index.html */ + +#include +#include +#include +#include + +typedef struct interval +{ + double lo, hi; +} +INTERVAL; + +INTERVAL vmul(double, double, INTERVAL); +INTERVAL vdiv(double, double, INTERVAL); + +extern int yylex(void); +static void yyerror(const char *s); + +int dcheck(INTERVAL); + +double dreg[26]; +INTERVAL vreg[26]; + +#line 31 "calc1.y" +#ifdef YYSTYPE +#undef YYSTYPE_IS_DECLARED +#define YYSTYPE_IS_DECLARED 1 +#endif +#ifndef YYSTYPE_IS_DECLARED +#define YYSTYPE_IS_DECLARED 1 +typedef union +{ + int ival; + double dval; + INTERVAL vval; +} YYSTYPE; +#endif /* !YYSTYPE_IS_DECLARED */ +#line 139 "calc1.tab.c" + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define DREG 257 +#define VREG 258 +#define CONST 259 +#define UMINUS 260 +#define YYERRCODE 256 +static const short calc1_lhs[] = { -1, + 3, 3, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, +}; +static const short calc1_len[] = { 2, + 0, 2, 2, 2, 4, 4, 2, 1, 1, 3, + 3, 3, 3, 2, 3, 1, 5, 1, 3, 3, + 3, 3, 3, 3, 3, 3, 2, 3, +}; +static const short calc1_defred[] = { 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 7, + 0, 0, 9, 18, 14, 27, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 15, 0, 28, 0, 0, 0, 0, + 12, 24, 13, 26, 0, 0, 23, 25, 14, 0, + 0, 0, 0, 0, 5, 6, 0, 0, 0, 12, + 13, 17, +}; +static const short calc1_dgoto[] = { 7, + 32, 9, 0, +}; +static const short calc1_sindex[] = { -40, + -8, -48, -47, 0, -37, -37, 0, 2, 17, 0, + -34, -37, 0, 0, 0, 0, -25, 90, -37, -37, + -37, -37, 0, -37, -37, -37, -37, 0, -34, -34, + 25, 125, 31, 0, -34, 0, -11, 37, -11, 37, + 0, 0, 0, 0, 37, 37, 0, 0, 0, 111, + -34, -34, -34, -34, 0, 0, 118, 69, 69, 0, + 0, 0, +}; +static const short calc1_rindex[] = { 0, + 0, 38, 44, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, 0, 0, 0, 51, -3, 56, 61, + 0, 0, 0, 0, 67, 72, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 78, 83, 0, + 0, 0, +}; +static const short calc1_gindex[] = { 0, + 4, 124, 0, +}; +#define YYTABLESIZE 225 +static const short calc1_table[] = { 6, + 16, 10, 6, 8, 5, 30, 20, 5, 15, 17, + 29, 23, 11, 12, 31, 34, 21, 19, 35, 20, + 0, 22, 37, 39, 41, 43, 28, 0, 0, 0, + 21, 16, 49, 50, 55, 22, 0, 20, 57, 20, + 56, 20, 0, 21, 19, 0, 20, 9, 22, 0, + 0, 0, 0, 18, 58, 59, 60, 61, 26, 24, + 10, 25, 0, 27, 0, 11, 53, 51, 0, 52, + 22, 54, 26, 24, 0, 25, 19, 27, 26, 9, + 9, 21, 9, 27, 9, 18, 18, 10, 18, 0, + 18, 10, 11, 10, 10, 10, 11, 0, 11, 11, + 11, 22, 0, 22, 0, 22, 0, 19, 0, 19, + 53, 19, 21, 0, 21, 54, 21, 0, 10, 0, + 10, 0, 10, 11, 0, 11, 0, 11, 16, 18, + 36, 26, 24, 0, 25, 33, 27, 0, 0, 0, + 0, 0, 38, 40, 42, 44, 0, 45, 46, 47, + 48, 34, 53, 51, 0, 52, 0, 54, 62, 53, + 51, 0, 52, 0, 54, 0, 21, 19, 0, 20, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 4, 13, + 14, 4, 13, 0, 4, +}; +static const short calc1_check[] = { 40, + 10, 10, 40, 0, 45, 40, 10, 45, 5, 6, + 45, 10, 61, 61, 11, 41, 42, 43, 44, 45, + -1, 47, 19, 20, 21, 22, 10, -1, -1, -1, + 42, 41, 29, 30, 10, 47, -1, 41, 35, 43, + 10, 45, -1, 42, 43, -1, 45, 10, 47, -1, + -1, -1, -1, 10, 51, 52, 53, 54, 42, 43, + 10, 45, -1, 47, -1, 10, 42, 43, -1, 45, + 10, 47, 42, 43, -1, 45, 10, 47, 42, 42, + 43, 10, 45, 47, 47, 42, 43, 10, 45, -1, + 47, 41, 10, 43, 44, 45, 41, -1, 43, 44, + 45, 41, -1, 43, -1, 45, -1, 41, -1, 43, + 42, 45, 41, -1, 43, 47, 45, -1, 41, -1, + 43, -1, 45, 41, -1, 43, -1, 45, 5, 6, + 41, 42, 43, -1, 45, 12, 47, -1, -1, -1, + -1, -1, 19, 20, 21, 22, -1, 24, 25, 26, + 27, 41, 42, 43, -1, 45, -1, 47, 41, 42, + 43, -1, 45, -1, 47, -1, 42, 43, -1, 45, + -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 256, 257, 258, 259, 257, + 258, 259, 257, -1, 259, +}; +#define YYFINAL 7 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 260 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,"'('","')'","'*'","'+'","','","'-'",0,"'/'",0,0,0,0,0,0,0,0,0, +0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,"DREG","VREG","CONST","UMINUS", +}; +static const char *yyrule[] = { +"$accept : line", +"lines :", +"lines : lines line", +"line : dexp '\\n'", +"line : vexp '\\n'", +"line : DREG '=' dexp '\\n'", +"line : VREG '=' vexp '\\n'", +"line : error '\\n'", +"dexp : CONST", +"dexp : DREG", +"dexp : dexp '+' dexp", +"dexp : dexp '-' dexp", +"dexp : dexp '*' dexp", +"dexp : dexp '/' dexp", +"dexp : '-' dexp", +"dexp : '(' dexp ')'", +"vexp : dexp", +"vexp : '(' dexp ',' dexp ')'", +"vexp : VREG", +"vexp : vexp '+' vexp", +"vexp : dexp '+' vexp", +"vexp : vexp '-' vexp", +"vexp : dexp '-' vexp", +"vexp : vexp '*' vexp", +"vexp : dexp '*' vexp", +"vexp : vexp '/' vexp", +"vexp : dexp '/' vexp", +"vexp : '-' vexp", +"vexp : '(' vexp ')'", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 176 "calc1.y" + /* beginning of subroutines section */ + +#define BSZ 50 /* buffer size for floating point numbers */ + + /* lexical analysis */ + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) +{ + int c; + + while ((c = getchar()) == ' ') + { /* skip over blanks */ + } + + if (isupper(c)) + { + yylval.ival = c - 'A'; + return (VREG); + } + if (islower(c)) + { + yylval.ival = c - 'a'; + return (DREG); + } + + if (isdigit(c) || c == '.') + { + /* gobble up digits, points, exponents */ + char buf[BSZ + 1], *cp = buf; + int dot = 0, expr = 0; + + for (; (cp - buf) < BSZ; ++cp, c = getchar()) + { + + *cp = c; + if (isdigit(c)) + continue; + if (c == '.') + { + if (dot++ || expr) + return ('.'); /* will cause syntax error */ + continue; + } + + if (c == 'e') + { + if (expr++) + return ('e'); /* will cause syntax error */ + continue; + } + + /* end of number */ + break; + } + *cp = '\0'; + + if ((cp - buf) >= BSZ) + printf("constant too long: truncated\n"); + else + ungetc(c, stdin); /* push back last char read */ + yylval.dval = atof(buf); + return (CONST); + } + return (c); +} + +static INTERVAL +hilo(double a, double b, double c, double d) +{ + /* returns the smallest interval containing a, b, c, and d */ + /* used by *, / routines */ + INTERVAL v; + + if (a > b) + { + v.hi = a; + v.lo = b; + } + else + { + v.hi = b; + v.lo = a; + } + + if (c > d) + { + if (c > v.hi) + v.hi = c; + if (d < v.lo) + v.lo = d; + } + else + { + if (d > v.hi) + v.hi = d; + if (c < v.lo) + v.lo = c; + } + return (v); +} + +INTERVAL +vmul(double a, double b, INTERVAL v) +{ + return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo)); +} + +int +dcheck(INTERVAL v) +{ + if (v.hi >= 0. && v.lo <= 0.) + { + printf("divisor interval contains 0.\n"); + return (1); + } + return (0); +} + +INTERVAL +vdiv(double a, double b, INTERVAL v) +{ + return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo)); +} +#line 486 "calc1.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 57 "calc1.y" + { + (void) printf("%15.8f\n", yystack.l_mark[-1].dval); + } +break; +case 4: +#line 61 "calc1.y" + { + (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi); + } +break; +case 5: +#line 65 "calc1.y" + { + dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval; + } +break; +case 6: +#line 69 "calc1.y" + { + vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval; + } +break; +case 7: +#line 73 "calc1.y" + { + yyerrok; + } +break; +case 9: +#line 80 "calc1.y" + { + yyval.dval = dreg[yystack.l_mark[0].ival]; + } +break; +case 10: +#line 84 "calc1.y" + { + yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval; + } +break; +case 11: +#line 88 "calc1.y" + { + yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval; + } +break; +case 12: +#line 92 "calc1.y" + { + yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval; + } +break; +case 13: +#line 96 "calc1.y" + { + yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval; + } +break; +case 14: +#line 100 "calc1.y" + { + yyval.dval = -yystack.l_mark[0].dval; + } +break; +case 15: +#line 104 "calc1.y" + { + yyval.dval = yystack.l_mark[-1].dval; + } +break; +case 16: +#line 110 "calc1.y" + { + yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval; + } +break; +case 17: +#line 114 "calc1.y" + { + yyval.vval.lo = yystack.l_mark[-3].dval; + yyval.vval.hi = yystack.l_mark[-1].dval; + if ( yyval.vval.lo > yyval.vval.hi ) + { + (void) printf("interval out of order\n"); + YYERROR; + } + } +break; +case 18: +#line 124 "calc1.y" + { + yyval.vval = vreg[yystack.l_mark[0].ival]; + } +break; +case 19: +#line 128 "calc1.y" + { + yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi; + yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo; + } +break; +case 20: +#line 133 "calc1.y" + { + yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi; + yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo; + } +break; +case 21: +#line 138 "calc1.y" + { + yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo; + yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi; + } +break; +case 22: +#line 143 "calc1.y" + { + yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo; + yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi; + } +break; +case 23: +#line 148 "calc1.y" + { + yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval ); + } +break; +case 24: +#line 152 "calc1.y" + { + yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval ); + } +break; +case 25: +#line 156 "calc1.y" + { + if (dcheck(yystack.l_mark[0].vval)) YYERROR; + yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval ); + } +break; +case 26: +#line 161 "calc1.y" + { + if (dcheck ( yystack.l_mark[0].vval )) YYERROR; + yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval ); + } +break; +case 27: +#line 166 "calc1.y" + { + yyval.vval.hi = -yystack.l_mark[0].vval.lo; + yyval.vval.lo = -yystack.l_mark[0].vval.hi; + } +break; +case 28: +#line 171 "calc1.y" + { + yyval.vval = yystack.l_mark[-1].vval; + } +break; +#line 855 "calc1.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/calc1.tab.h b/contrib/byacc/test/calc1.tab.h new file mode 100644 index 00000000000..c0633e37dfa --- /dev/null +++ b/contrib/byacc/test/calc1.tab.h @@ -0,0 +1,18 @@ +#define DREG 257 +#define VREG 258 +#define CONST 259 +#define UMINUS 260 +#ifdef YYSTYPE +#undef YYSTYPE_IS_DECLARED +#define YYSTYPE_IS_DECLARED 1 +#endif +#ifndef YYSTYPE_IS_DECLARED +#define YYSTYPE_IS_DECLARED 1 +typedef union +{ + int ival; + double dval; + INTERVAL vval; +} YYSTYPE; +#endif /* !YYSTYPE_IS_DECLARED */ +extern YYSTYPE calc1_lval; diff --git a/contrib/byacc/test/calc1.y b/contrib/byacc/test/calc1.y new file mode 100644 index 00000000000..ec89736f47a --- /dev/null +++ b/contrib/byacc/test/calc1.y @@ -0,0 +1,305 @@ +%{ + +/* http://dinosaur.compilertools.net/yacc/index.html */ + +#include +#include +#include +#include + +typedef struct interval +{ + double lo, hi; +} +INTERVAL; + +INTERVAL vmul(double, double, INTERVAL); +INTERVAL vdiv(double, double, INTERVAL); + +extern int yylex(void); +static void yyerror(const char *s); + +int dcheck(INTERVAL); + +double dreg[26]; +INTERVAL vreg[26]; + +%} +%expect 18 + +%start line +%union +{ + int ival; + double dval; + INTERVAL vval; +} + +%token DREG VREG /* indices into dreg, vreg arrays */ +%token CONST /* floating point constant */ + +%type dexp /* expression */ +%type vexp /* interval expression */ + + /* precedence information about the operators */ + +%left '+' '-' +%left '*' '/' +%left UMINUS /* precedence for unary minus */ + +%% /* beginning of rules section */ + +lines : /* empty */ + | lines line + ; + +line : dexp '\n' + { + (void) printf("%15.8f\n", $1); + } + | vexp '\n' + { + (void) printf("(%15.8f, %15.8f)\n", $1.lo, $1.hi); + } + | DREG '=' dexp '\n' + { + dreg[$1] = $3; + } + | VREG '=' vexp '\n' + { + vreg[$1] = $3; + } + | error '\n' + { + yyerrok; + } + ; + +dexp : CONST + | DREG + { + $$ = dreg[$1]; + } + | dexp '+' dexp + { + $$ = $1 + $3; + } + | dexp '-' dexp + { + $$ = $1 - $3; + } + | dexp '*' dexp + { + $$ = $1 * $3; + } + | dexp '/' dexp + { + $$ = $1 / $3; + } + | '-' dexp %prec UMINUS + { + $$ = -$2; + } + | '(' dexp ')' + { + $$ = $2; + } + ; + +vexp : dexp + { + $$.hi = $$.lo = $1; + } + | '(' dexp ',' dexp ')' + { + $$.lo = $2; + $$.hi = $4; + if ( $$.lo > $$.hi ) + { + (void) printf("interval out of order\n"); + YYERROR; + } + } + | VREG + { + $$ = vreg[$1]; + } + | vexp '+' vexp + { + $$.hi = $1.hi + $3.hi; + $$.lo = $1.lo + $3.lo; + } + | dexp '+' vexp + { + $$.hi = $1 + $3.hi; + $$.lo = $1 + $3.lo; + } + | vexp '-' vexp + { + $$.hi = $1.hi - $3.lo; + $$.lo = $1.lo - $3.hi; + } + | dexp '-' vexp + { + $$.hi = $1 - $3.lo; + $$.lo = $1 - $3.hi; + } + | vexp '*' vexp + { + $$ = vmul( $1.lo, $1.hi, $3 ); + } + | dexp '*' vexp + { + $$ = vmul ($1, $1, $3 ); + } + | vexp '/' vexp + { + if (dcheck($3)) YYERROR; + $$ = vdiv ( $1.lo, $1.hi, $3 ); + } + | dexp '/' vexp + { + if (dcheck ( $3 )) YYERROR; + $$ = vdiv ($1, $1, $3 ); + } + | '-' vexp %prec UMINUS + { + $$.hi = -$2.lo; + $$.lo = -$2.hi; + } + | '(' vexp ')' + { + $$ = $2; + } + ; + +%% /* beginning of subroutines section */ + +#define BSZ 50 /* buffer size for floating point numbers */ + + /* lexical analysis */ + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) +{ + int c; + + while ((c = getchar()) == ' ') + { /* skip over blanks */ + } + + if (isupper(c)) + { + yylval.ival = c - 'A'; + return (VREG); + } + if (islower(c)) + { + yylval.ival = c - 'a'; + return (DREG); + } + + if (isdigit(c) || c == '.') + { + /* gobble up digits, points, exponents */ + char buf[BSZ + 1], *cp = buf; + int dot = 0, expr = 0; + + for (; (cp - buf) < BSZ; ++cp, c = getchar()) + { + + *cp = c; + if (isdigit(c)) + continue; + if (c == '.') + { + if (dot++ || expr) + return ('.'); /* will cause syntax error */ + continue; + } + + if (c == 'e') + { + if (expr++) + return ('e'); /* will cause syntax error */ + continue; + } + + /* end of number */ + break; + } + *cp = '\0'; + + if ((cp - buf) >= BSZ) + printf("constant too long: truncated\n"); + else + ungetc(c, stdin); /* push back last char read */ + yylval.dval = atof(buf); + return (CONST); + } + return (c); +} + +static INTERVAL +hilo(double a, double b, double c, double d) +{ + /* returns the smallest interval containing a, b, c, and d */ + /* used by *, / routines */ + INTERVAL v; + + if (a > b) + { + v.hi = a; + v.lo = b; + } + else + { + v.hi = b; + v.lo = a; + } + + if (c > d) + { + if (c > v.hi) + v.hi = c; + if (d < v.lo) + v.lo = d; + } + else + { + if (d > v.hi) + v.hi = d; + if (c < v.lo) + v.lo = c; + } + return (v); +} + +INTERVAL +vmul(double a, double b, INTERVAL v) +{ + return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo)); +} + +int +dcheck(INTERVAL v) +{ + if (v.hi >= 0. && v.lo <= 0.) + { + printf("divisor interval contains 0.\n"); + return (1); + } + return (0); +} + +INTERVAL +vdiv(double a, double b, INTERVAL v) +{ + return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo)); +} diff --git a/contrib/byacc/test/calc2.output b/contrib/byacc/test/calc2.output new file mode 100644 index 00000000000..3aed47511c9 --- /dev/null +++ b/contrib/byacc/test/calc2.output @@ -0,0 +1,461 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr '+' expr + 8 | expr '-' expr + 9 | expr '*' expr + 10 | expr '/' expr + 11 | expr '%' expr + 12 | expr '&' expr + 13 | expr '|' expr + 14 | '-' expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + DIGIT shift 3 + LETTER shift 4 + '-' shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + number : DIGIT . (17) + + . reduce 17 + + +state 4 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 11 + '|' reduce 15 + '&' reduce 15 + '+' reduce 15 + '-' reduce 15 + '*' reduce 15 + '/' reduce 15 + '%' reduce 15 + '\n' reduce 15 + + +state 5 + expr : '-' . expr (14) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 13 + number goto 9 + + +state 6 + expr : '(' . expr ')' (6) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + '|' reduce 16 + '&' reduce 16 + '+' reduce 16 + '-' reduce 16 + '*' reduce 16 + '/' reduce 16 + '%' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + stat : LETTER '=' . expr (5) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 12 + expr : LETTER . (15) + + . reduce 15 + + +state 13 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + expr : '-' expr . (14) + + . reduce 14 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr '|' . expr (13) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr '&' . expr (12) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr '+' . expr (7) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr '-' . expr (8) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr '*' . expr (9) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr '/' . expr (10) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '%' . expr (11) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +state 26 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +state 27 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr '&' expr . (12) + expr : expr . '|' expr (13) + + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 12 + '&' reduce 12 + '\n' reduce 12 + ')' reduce 12 + + +state 28 + expr : expr . '+' expr (7) + expr : expr '+' expr . (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 7 + '&' reduce 7 + '+' reduce 7 + '-' reduce 7 + '\n' reduce 7 + ')' reduce 7 + + +state 29 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr '-' expr . (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 8 + '&' reduce 8 + '+' reduce 8 + '-' reduce 8 + '\n' reduce 8 + ')' reduce 8 + + +state 30 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr '*' expr . (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 9 + + +state 31 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr '/' expr . (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 10 + + +state 32 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr '%' expr . (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 11 + + +16 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/calc2.tab.c b/contrib/byacc/test/calc2.tab.c new file mode 100644 index 00000000000..1eb9548a697 --- /dev/null +++ b/contrib/byacc/test/calc2.tab.c @@ -0,0 +1,682 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse calc2_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex calc2_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror calc2_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar calc2_char +#endif /* yychar */ + +#ifndef yyval +#define yyval calc2_val +#endif /* yyval */ + +#ifndef yylval +#define yylval calc2_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug calc2_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs calc2_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag calc2_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs calc2_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen calc2_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred calc2_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto calc2_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex calc2_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex calc2_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex calc2_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable calc2_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck calc2_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname calc2_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule calc2_rule +#endif /* yyrule */ +#define YYPREFIX "calc2_" + +#define YYPURE 0 + +#line 7 "calc2.y" +# include +# include + +#ifdef YYBISON +#define YYLEX_PARAM base +#define YYLEX_DECL() yylex(int *YYLEX_PARAM) +#define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +#line 111 "calc2.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(int regs[26], int * base) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(int * base) +# define YYLEX yylex(base) +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(int regs[26], int * base, const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(regs, base, msg) +#endif + +extern int YYPARSE_DECL(); + +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 +#define YYERRCODE 256 +static const short calc2_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short calc2_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short calc2_defred[] = { 1, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 3, + 0, 15, 14, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 9, + 10, 11, +}; +static const short calc2_dgoto[] = { 1, + 7, 8, 9, +}; +static const short calc2_sindex[] = { 0, + -40, -7, 0, -55, -38, -38, 1, -29, -247, 0, + -38, 0, 0, 22, 0, -38, -38, -38, -38, -38, + -38, -38, 0, -29, 0, 51, 60, -20, -20, 0, + 0, 0, +}; +static const short calc2_rindex[] = { 0, + 0, 0, 0, 2, 0, 0, 0, 9, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, -6, 14, 5, 13, 0, + 0, 0, +}; +static const short calc2_gindex[] = { 0, + 0, 65, 0, +}; +#define YYTABLESIZE 220 +static const short calc2_table[] = { 6, + 16, 6, 10, 13, 5, 11, 5, 22, 17, 23, + 15, 15, 20, 18, 7, 19, 22, 21, 4, 5, + 0, 20, 8, 12, 0, 0, 21, 16, 16, 0, + 0, 16, 16, 16, 13, 16, 0, 16, 15, 15, + 0, 0, 7, 15, 15, 7, 15, 7, 15, 7, + 8, 12, 0, 8, 12, 8, 0, 8, 22, 17, + 0, 0, 25, 20, 18, 0, 19, 0, 21, 13, + 14, 0, 0, 0, 0, 24, 0, 0, 0, 0, + 26, 27, 28, 29, 30, 31, 32, 22, 17, 0, + 0, 0, 20, 18, 16, 19, 22, 21, 0, 0, + 0, 20, 18, 0, 19, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 8, 12, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 3, 12, +}; +static const short calc2_check[] = { 40, + 10, 40, 10, 10, 45, 61, 45, 37, 38, 257, + 10, 10, 42, 43, 10, 45, 37, 47, 10, 10, + -1, 42, 10, 10, -1, -1, 47, 37, 38, -1, + -1, 41, 42, 43, 41, 45, -1, 47, 37, 38, + -1, -1, 38, 42, 43, 41, 45, 43, 47, 45, + 38, 38, -1, 41, 41, 43, -1, 45, 37, 38, + -1, -1, 41, 42, 43, -1, 45, -1, 47, 5, + 6, -1, -1, -1, -1, 11, -1, -1, -1, -1, + 16, 17, 18, 19, 20, 21, 22, 37, 38, -1, + -1, -1, 42, 43, 124, 45, 37, 47, -1, -1, + -1, 42, 43, -1, 45, -1, 47, -1, -1, -1, + -1, -1, -1, -1, 124, -1, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 124, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 256, 257, 258, 257, 258, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 259 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr '+' expr", +"expr : expr '-' expr", +"expr : expr '*' expr", +"expr : expr '/' expr", +"expr : expr '%' expr", +"expr : expr '&' expr", +"expr : expr '|' expr", +"expr : '-' expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "calc2.y" + /* start of programs */ + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main (void) +{ + int regs[26]; + int base = 10; + + while(!feof(stdin)) { + yyparse(regs, &base); + } + return 0; +} + +static void +YYERROR_DECL() +{ + fprintf(stderr, "%s\n", s); +} + +int +YYLEX_DECL() +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = (c - '0') % (*base); + return ( DIGIT ); + } + return( c ); +} +#line 356 "calc2.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror(regs, base, "syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "calc2.y" + { yyerrok ; } +break; +case 4: +#line 39 "calc2.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "calc2.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "calc2.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "calc2.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "calc2.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "calc2.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "calc2.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "calc2.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "calc2.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "calc2.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "calc2.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "calc2.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "calc2.y" + { yyval = yystack.l_mark[0]; (*base) = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "calc2.y" + { yyval = (*base) * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 622 "calc2.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror(regs, base, "yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/calc2.tab.h b/contrib/byacc/test/calc2.tab.h new file mode 100644 index 00000000000..19211182d6b --- /dev/null +++ b/contrib/byacc/test/calc2.tab.h @@ -0,0 +1,3 @@ +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 diff --git a/contrib/byacc/test/calc2.y b/contrib/byacc/test/calc2.y new file mode 100644 index 00000000000..e742ff34c21 --- /dev/null +++ b/contrib/byacc/test/calc2.y @@ -0,0 +1,120 @@ +%parse-param { int regs[26] } +%parse-param { int *base } + +%lex-param { int *base } + +%{ +# include +# include + +#ifdef YYBISON +#define YYLEX_PARAM base +#define YYLEX_DECL() yylex(int *YYLEX_PARAM) +#define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +%} + +%start list + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr '+' expr + { $$ = $1 + $3; } + | expr '-' expr + { $$ = $1 - $3; } + | expr '*' expr + { $$ = $1 * $3; } + | expr '/' expr + { $$ = $1 / $3; } + | expr '%' expr + { $$ = $1 % $3; } + | expr '&' expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | '-' expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; (*base) = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = (*base) * $1 + $2; } + ; + +%% /* start of programs */ + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main (void) +{ + int regs[26]; + int base = 10; + + while(!feof(stdin)) { + yyparse(regs, &base); + } + return 0; +} + +static void +YYERROR_DECL() +{ + fprintf(stderr, "%s\n", s); +} + +int +YYLEX_DECL() +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = (c - '0') % (*base); + return ( DIGIT ); + } + return( c ); +} diff --git a/contrib/byacc/test/calc3.output b/contrib/byacc/test/calc3.output new file mode 100644 index 00000000000..3aed47511c9 --- /dev/null +++ b/contrib/byacc/test/calc3.output @@ -0,0 +1,461 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr '+' expr + 8 | expr '-' expr + 9 | expr '*' expr + 10 | expr '/' expr + 11 | expr '%' expr + 12 | expr '&' expr + 13 | expr '|' expr + 14 | '-' expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + DIGIT shift 3 + LETTER shift 4 + '-' shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + number : DIGIT . (17) + + . reduce 17 + + +state 4 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 11 + '|' reduce 15 + '&' reduce 15 + '+' reduce 15 + '-' reduce 15 + '*' reduce 15 + '/' reduce 15 + '%' reduce 15 + '\n' reduce 15 + + +state 5 + expr : '-' . expr (14) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 13 + number goto 9 + + +state 6 + expr : '(' . expr ')' (6) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + '|' reduce 16 + '&' reduce 16 + '+' reduce 16 + '-' reduce 16 + '*' reduce 16 + '/' reduce 16 + '%' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + stat : LETTER '=' . expr (5) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 12 + expr : LETTER . (15) + + . reduce 15 + + +state 13 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + expr : '-' expr . (14) + + . reduce 14 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr '|' . expr (13) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr '&' . expr (12) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr '+' . expr (7) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr '-' . expr (8) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr '*' . expr (9) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr '/' . expr (10) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '%' . expr (11) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +state 26 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +state 27 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr '&' expr . (12) + expr : expr . '|' expr (13) + + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 12 + '&' reduce 12 + '\n' reduce 12 + ')' reduce 12 + + +state 28 + expr : expr . '+' expr (7) + expr : expr '+' expr . (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 7 + '&' reduce 7 + '+' reduce 7 + '-' reduce 7 + '\n' reduce 7 + ')' reduce 7 + + +state 29 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr '-' expr . (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 8 + '&' reduce 8 + '+' reduce 8 + '-' reduce 8 + '\n' reduce 8 + ')' reduce 8 + + +state 30 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr '*' expr . (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 9 + + +state 31 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr '/' expr . (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 10 + + +state 32 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr '%' expr . (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 11 + + +16 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/calc3.tab.c b/contrib/byacc/test/calc3.tab.c new file mode 100644 index 00000000000..9c38899beba --- /dev/null +++ b/contrib/byacc/test/calc3.tab.c @@ -0,0 +1,687 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse calc3_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex calc3_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror calc3_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar calc3_char +#endif /* yychar */ + +#ifndef yyval +#define yyval calc3_val +#endif /* yyval */ + +#ifndef yylval +#define yylval calc3_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug calc3_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs calc3_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag calc3_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs calc3_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen calc3_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred calc3_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto calc3_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex calc3_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex calc3_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex calc3_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable calc3_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck calc3_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname calc3_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule calc3_rule +#endif /* yyrule */ +#define YYPREFIX "calc3_" + +#define YYPURE 1 + +#line 9 "calc3.y" +# include +# include + +#ifdef YYBISON +#define YYSTYPE int +#define YYLEX_PARAM base +#define YYLEX_DECL() yylex(YYSTYPE *yylval, int *YYLEX_PARAM) +#define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +#line 112 "calc3.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(int regs[26], int * base) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# ifdef YYLEX_PARAM_TYPE +# define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLEX_PARAM_TYPE YYLEX_PARAM) +# else +# define YYLEX_DECL() yylex(YYSTYPE *yylval, void * YYLEX_PARAM) +# endif +# define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(YYSTYPE *yylval, int * base) +# define YYLEX yylex(&yylval, base) +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(int regs[26], int * base, const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(regs, base, msg) +#endif + +extern int YYPARSE_DECL(); + +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 +#define YYERRCODE 256 +static const short calc3_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short calc3_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short calc3_defred[] = { 1, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 3, + 0, 15, 14, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 9, + 10, 11, +}; +static const short calc3_dgoto[] = { 1, + 7, 8, 9, +}; +static const short calc3_sindex[] = { 0, + -40, -7, 0, -55, -38, -38, 1, -29, -247, 0, + -38, 0, 0, 22, 0, -38, -38, -38, -38, -38, + -38, -38, 0, -29, 0, 51, 60, -20, -20, 0, + 0, 0, +}; +static const short calc3_rindex[] = { 0, + 0, 0, 0, 2, 0, 0, 0, 9, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, -6, 14, 5, 13, 0, + 0, 0, +}; +static const short calc3_gindex[] = { 0, + 0, 65, 0, +}; +#define YYTABLESIZE 220 +static const short calc3_table[] = { 6, + 16, 6, 10, 13, 5, 11, 5, 22, 17, 23, + 15, 15, 20, 18, 7, 19, 22, 21, 4, 5, + 0, 20, 8, 12, 0, 0, 21, 16, 16, 0, + 0, 16, 16, 16, 13, 16, 0, 16, 15, 15, + 0, 0, 7, 15, 15, 7, 15, 7, 15, 7, + 8, 12, 0, 8, 12, 8, 0, 8, 22, 17, + 0, 0, 25, 20, 18, 0, 19, 0, 21, 13, + 14, 0, 0, 0, 0, 24, 0, 0, 0, 0, + 26, 27, 28, 29, 30, 31, 32, 22, 17, 0, + 0, 0, 20, 18, 16, 19, 22, 21, 0, 0, + 0, 20, 18, 0, 19, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 8, 12, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 3, 12, +}; +static const short calc3_check[] = { 40, + 10, 40, 10, 10, 45, 61, 45, 37, 38, 257, + 10, 10, 42, 43, 10, 45, 37, 47, 10, 10, + -1, 42, 10, 10, -1, -1, 47, 37, 38, -1, + -1, 41, 42, 43, 41, 45, -1, 47, 37, 38, + -1, -1, 38, 42, 43, 41, 45, 43, 47, 45, + 38, 38, -1, 41, 41, 43, -1, 45, 37, 38, + -1, -1, 41, 42, 43, -1, 45, -1, 47, 5, + 6, -1, -1, -1, -1, 11, -1, -1, -1, -1, + 16, 17, 18, 19, 20, 21, 22, 37, 38, -1, + -1, -1, 42, 43, 124, 45, 37, 47, -1, -1, + -1, 42, 43, -1, 45, -1, 47, -1, -1, -1, + -1, -1, -1, -1, 124, -1, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 124, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 256, 257, 258, 257, 258, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 259 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr '+' expr", +"expr : expr '-' expr", +"expr : expr '*' expr", +"expr : expr '/' expr", +"expr : expr '%' expr", +"expr : expr '&' expr", +"expr : expr '|' expr", +"expr : '-' expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +#line 76 "calc3.y" + /* start of programs */ + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main (void) +{ + int regs[26]; + int base = 10; + + while(!feof(stdin)) { + yyparse(regs, &base); + } + return 0; +} + +static void +YYERROR_DECL() +{ + fprintf(stderr, "%s\n", s); +} + +int +YYLEX_DECL() +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + *yylval = (c - 'a'); + return ( LETTER ); + } + if( isdigit( c )) { + *yylval = (c - '0') % (*base); + return ( DIGIT ); + } + return( c ); +} +#line 354 "calc3.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yyerrflag; + int yychar; + YYSTYPE yyval; + YYSTYPE yylval; + + /* variables for the parser stack */ + YYSTACKDATA yystack; + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror(regs, base, "syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 38 "calc3.y" + { yyerrok ; } +break; +case 4: +#line 42 "calc3.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 44 "calc3.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 48 "calc3.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 50 "calc3.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 52 "calc3.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 54 "calc3.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 56 "calc3.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 58 "calc3.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 60 "calc3.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 62 "calc3.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 64 "calc3.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 66 "calc3.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 71 "calc3.y" + { yyval = yystack.l_mark[0]; (*base) = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 73 "calc3.y" + { yyval = (*base) * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 627 "calc3.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror(regs, base, "yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/calc3.tab.h b/contrib/byacc/test/calc3.tab.h new file mode 100644 index 00000000000..19211182d6b --- /dev/null +++ b/contrib/byacc/test/calc3.tab.h @@ -0,0 +1,3 @@ +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 diff --git a/contrib/byacc/test/calc3.y b/contrib/byacc/test/calc3.y new file mode 100644 index 00000000000..252faa961f4 --- /dev/null +++ b/contrib/byacc/test/calc3.y @@ -0,0 +1,123 @@ +%pure-parser + +%parse-param { int regs[26] } +%parse-param { int *base } + +%lex-param { int *base } + +%{ +# include +# include + +#ifdef YYBISON +#define YYSTYPE int +#define YYLEX_PARAM base +#define YYLEX_DECL() yylex(YYSTYPE *yylval, int *YYLEX_PARAM) +#define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +%} + +%start list + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr '+' expr + { $$ = $1 + $3; } + | expr '-' expr + { $$ = $1 - $3; } + | expr '*' expr + { $$ = $1 * $3; } + | expr '/' expr + { $$ = $1 / $3; } + | expr '%' expr + { $$ = $1 % $3; } + | expr '&' expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | '-' expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; (*base) = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = (*base) * $1 + $2; } + ; + +%% /* start of programs */ + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main (void) +{ + int regs[26]; + int base = 10; + + while(!feof(stdin)) { + yyparse(regs, &base); + } + return 0; +} + +static void +YYERROR_DECL() +{ + fprintf(stderr, "%s\n", s); +} + +int +YYLEX_DECL() +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + *yylval = (c - 'a'); + return ( LETTER ); + } + if( isdigit( c )) { + *yylval = (c - '0') % (*base); + return ( DIGIT ); + } + return( c ); +} diff --git a/contrib/byacc/test/code_calc.code.c b/contrib/byacc/test/code_calc.code.c new file mode 100644 index 00000000000..a3cf368a07a --- /dev/null +++ b/contrib/byacc/test/code_calc.code.c @@ -0,0 +1,580 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#define YYPURE 0 + +#line 2 "code_calc.y" +# include +# include + +int regs[26]; +int base; + +#ifdef YYBISON +int yylex(void); +static void yyerror(const char *s); +#endif + +#line 30 "code_calc.code.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 +#define YYERRCODE 256 +#define YYTABLESIZE 220 +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 259 + +#ifndef yyparse +#define yyparse calc_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex calc_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror calc_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar calc_char +#endif /* yychar */ + +#ifndef yyval +#define yyval calc_val +#endif /* yyval */ + +#ifndef yylval +#define yylval calc_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug calc_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs calc_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag calc_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs calc_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen calc_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred calc_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto calc_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex calc_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex calc_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex calc_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable calc_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck calc_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname calc_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule calc_rule +#endif /* yyrule */ +#define YYPREFIX "calc_" + +extern int YYPARSE_DECL(); +extern short yylhs[]; +extern short yylen[]; +extern short yydefred[]; +extern short yydgoto[]; +extern short yysindex[]; +extern short yyrindex[]; +extern short yygindex[]; +extern short yytable[]; +extern short yycheck[]; + +#if YYDEBUG +extern char *yyname[]; +extern char *yyrule[]; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 68 "code_calc.y" + /* start of programs */ + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 254 "code_calc.code.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 30 "code_calc.y" + { yyerrok ; } +break; +case 4: +#line 34 "code_calc.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 36 "code_calc.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 40 "code_calc.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 42 "code_calc.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 44 "code_calc.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 46 "code_calc.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 48 "code_calc.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 50 "code_calc.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 52 "code_calc.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 54 "code_calc.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 56 "code_calc.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 58 "code_calc.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 63 "code_calc.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 65 "code_calc.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 520 "code_calc.code.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/code_calc.output b/contrib/byacc/test/code_calc.output new file mode 100644 index 00000000000..3aed47511c9 --- /dev/null +++ b/contrib/byacc/test/code_calc.output @@ -0,0 +1,461 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr '+' expr + 8 | expr '-' expr + 9 | expr '*' expr + 10 | expr '/' expr + 11 | expr '%' expr + 12 | expr '&' expr + 13 | expr '|' expr + 14 | '-' expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + DIGIT shift 3 + LETTER shift 4 + '-' shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + number : DIGIT . (17) + + . reduce 17 + + +state 4 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 11 + '|' reduce 15 + '&' reduce 15 + '+' reduce 15 + '-' reduce 15 + '*' reduce 15 + '/' reduce 15 + '%' reduce 15 + '\n' reduce 15 + + +state 5 + expr : '-' . expr (14) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 13 + number goto 9 + + +state 6 + expr : '(' . expr ')' (6) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + '|' reduce 16 + '&' reduce 16 + '+' reduce 16 + '-' reduce 16 + '*' reduce 16 + '/' reduce 16 + '%' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + stat : LETTER '=' . expr (5) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 12 + expr : LETTER . (15) + + . reduce 15 + + +state 13 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + expr : '-' expr . (14) + + . reduce 14 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr '|' . expr (13) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr '&' . expr (12) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr '+' . expr (7) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr '-' . expr (8) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr '*' . expr (9) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr '/' . expr (10) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '%' . expr (11) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +state 26 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +state 27 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr '&' expr . (12) + expr : expr . '|' expr (13) + + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 12 + '&' reduce 12 + '\n' reduce 12 + ')' reduce 12 + + +state 28 + expr : expr . '+' expr (7) + expr : expr '+' expr . (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 7 + '&' reduce 7 + '+' reduce 7 + '-' reduce 7 + '\n' reduce 7 + ')' reduce 7 + + +state 29 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr '-' expr . (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 8 + '&' reduce 8 + '+' reduce 8 + '-' reduce 8 + '\n' reduce 8 + ')' reduce 8 + + +state 30 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr '*' expr . (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 9 + + +state 31 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr '/' expr . (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 10 + + +state 32 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr '%' expr . (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 11 + + +16 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/code_calc.tab.c b/contrib/byacc/test/code_calc.tab.c new file mode 100644 index 00000000000..37a17ef4f81 --- /dev/null +++ b/contrib/byacc/test/code_calc.tab.c @@ -0,0 +1,199 @@ + +#ifndef yyparse +#define yyparse calc_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex calc_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror calc_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar calc_char +#endif /* yychar */ + +#ifndef yyval +#define yyval calc_val +#endif /* yyval */ + +#ifndef yylval +#define yylval calc_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug calc_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs calc_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag calc_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs calc_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen calc_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred calc_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto calc_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex calc_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex calc_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex calc_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable calc_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck calc_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname calc_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule calc_rule +#endif /* yyrule */ +#define YYPREFIX "calc_" +const short calc_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +const short calc_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +const short calc_defred[] = { 1, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 3, + 0, 15, 14, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 9, + 10, 11, +}; +const short calc_dgoto[] = { 1, + 7, 8, 9, +}; +const short calc_sindex[] = { 0, + -40, -7, 0, -55, -38, -38, 1, -29, -247, 0, + -38, 0, 0, 22, 0, -38, -38, -38, -38, -38, + -38, -38, 0, -29, 0, 51, 60, -20, -20, 0, + 0, 0, +}; +const short calc_rindex[] = { 0, + 0, 0, 0, 2, 0, 0, 0, 9, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, -6, 14, 5, 13, 0, + 0, 0, +}; +const short calc_gindex[] = { 0, + 0, 65, 0, +}; +const short calc_table[] = { 6, + 16, 6, 10, 13, 5, 11, 5, 22, 17, 23, + 15, 15, 20, 18, 7, 19, 22, 21, 4, 5, + 0, 20, 8, 12, 0, 0, 21, 16, 16, 0, + 0, 16, 16, 16, 13, 16, 0, 16, 15, 15, + 0, 0, 7, 15, 15, 7, 15, 7, 15, 7, + 8, 12, 0, 8, 12, 8, 0, 8, 22, 17, + 0, 0, 25, 20, 18, 0, 19, 0, 21, 13, + 14, 0, 0, 0, 0, 24, 0, 0, 0, 0, + 26, 27, 28, 29, 30, 31, 32, 22, 17, 0, + 0, 0, 20, 18, 16, 19, 22, 21, 0, 0, + 0, 20, 18, 0, 19, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 8, 12, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 3, 12, +}; +const short calc_check[] = { 40, + 10, 40, 10, 10, 45, 61, 45, 37, 38, 257, + 10, 10, 42, 43, 10, 45, 37, 47, 10, 10, + -1, 42, 10, 10, -1, -1, 47, 37, 38, -1, + -1, 41, 42, 43, 41, 45, -1, 47, 37, 38, + -1, -1, 38, 42, 43, 41, 45, 43, 47, 45, + 38, 38, -1, 41, 41, 43, -1, 45, 37, 38, + -1, -1, 41, 42, 43, -1, 45, -1, 47, 5, + 6, -1, -1, -1, -1, 11, -1, -1, -1, -1, + 16, 17, 18, 19, 20, 21, 22, 37, 38, -1, + -1, -1, 42, 43, 124, 45, 37, 47, -1, -1, + -1, 42, 43, -1, 45, -1, 47, -1, -1, -1, + -1, -1, -1, -1, 124, -1, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 124, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 256, 257, 258, 257, 258, +}; +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#if YYDEBUG +const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"DIGIT","LETTER","UMINUS", +}; +const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr '+' expr", +"expr : expr '-' expr", +"expr : expr '*' expr", +"expr : expr '/' expr", +"expr : expr '%' expr", +"expr : expr '&' expr", +"expr : expr '|' expr", +"expr : '-' expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif diff --git a/contrib/byacc/test/code_calc.tab.h b/contrib/byacc/test/code_calc.tab.h new file mode 100644 index 00000000000..19211182d6b --- /dev/null +++ b/contrib/byacc/test/code_calc.tab.h @@ -0,0 +1,3 @@ +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 diff --git a/contrib/byacc/test/code_calc.y b/contrib/byacc/test/code_calc.y new file mode 100644 index 00000000000..0a99456e7f8 --- /dev/null +++ b/contrib/byacc/test/code_calc.y @@ -0,0 +1,112 @@ +%{ +# include +# include + +int regs[26]; +int base; + +#ifdef YYBISON +int yylex(void); +static void yyerror(const char *s); +#endif + +%} + +%start list + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr '+' expr + { $$ = $1 + $3; } + | expr '-' expr + { $$ = $1 - $3; } + | expr '*' expr + { $$ = $1 * $3; } + | expr '/' expr + { $$ = $1 / $3; } + | expr '%' expr + { $$ = $1 % $3; } + | expr '&' expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | '-' expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/contrib/byacc/test/code_error.code.c b/contrib/byacc/test/code_error.code.c new file mode 100644 index 00000000000..db50bbcf60d --- /dev/null +++ b/contrib/byacc/test/code_error.code.c @@ -0,0 +1,491 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#define YYPURE 0 + +#line 2 "code_error.y" + +#ifdef YYBISON +int yylex(void); +static void yyerror(const char *); +#endif + +#line 25 "code_error.code.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define YYERRCODE 256 +#define YYTABLESIZE 0 +#define YYFINAL 2 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 0 + +#ifndef yyparse +#define yyparse error_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex error_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror error_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar error_char +#endif /* yychar */ + +#ifndef yyval +#define yyval error_val +#endif /* yyval */ + +#ifndef yylval +#define yylval error_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug error_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs error_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag error_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs error_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen error_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred error_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto error_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex error_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex error_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex error_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable error_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck error_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname error_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule error_rule +#endif /* yyrule */ +#define YYPREFIX "error_" + +extern int YYPARSE_DECL(); +extern short yylhs[]; +extern short yylen[]; +extern short yydefred[]; +extern short yydgoto[]; +extern short yysindex[]; +extern short yyrindex[]; +extern short yygindex[]; +extern short yytable[]; +extern short yycheck[]; + +#if YYDEBUG +extern char *yyname[]; +extern char *yyrule[]; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 12 "code_error.y" + +#include + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main(void) +{ + printf("yyparse() = %d\n", yyparse()); + return 0; +} + +int +yylex(void) +{ + return -1; +} + +static void +yyerror(const char* s) +{ + printf("%s\n", s); +} +#line 226 "code_error.code.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/usr.bin/yacc/test/error.output b/contrib/byacc/test/code_error.output similarity index 100% rename from usr.bin/yacc/test/error.output rename to contrib/byacc/test/code_error.output diff --git a/contrib/byacc/test/code_error.tab.c b/contrib/byacc/test/code_error.tab.c new file mode 100644 index 00000000000..eb4db127835 --- /dev/null +++ b/contrib/byacc/test/code_error.tab.c @@ -0,0 +1,118 @@ + +#ifndef yyparse +#define yyparse error_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex error_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror error_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar error_char +#endif /* yychar */ + +#ifndef yyval +#define yyval error_val +#endif /* yyval */ + +#ifndef yylval +#define yylval error_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug error_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs error_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag error_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs error_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen error_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred error_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto error_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex error_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex error_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex error_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable error_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck error_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname error_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule error_rule +#endif /* yyrule */ +#define YYPREFIX "error_" +const short error_lhs[] = { -1, + 0, +}; +const short error_len[] = { 2, + 1, +}; +const short error_defred[] = { 0, + 1, 0, +}; +const short error_dgoto[] = { 2, +}; +const short error_sindex[] = { -256, + 0, 0, +}; +const short error_rindex[] = { 0, + 0, 0, +}; +const short error_gindex[] = { 0, +}; +const short error_table[] = { 1, +}; +const short error_check[] = { 256, +}; +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#if YYDEBUG +const char *yyname[] = { + +"end-of-file", +}; +const char *yyrule[] = { +"$accept : S", +"S : error", + +}; +#endif diff --git a/usr.bin/yacc/test/error.tab.h b/contrib/byacc/test/code_error.tab.h similarity index 100% rename from usr.bin/yacc/test/error.tab.h rename to contrib/byacc/test/code_error.tab.h diff --git a/contrib/byacc/test/code_error.y b/contrib/byacc/test/code_error.y new file mode 100644 index 00000000000..bb771567606 --- /dev/null +++ b/contrib/byacc/test/code_error.y @@ -0,0 +1,36 @@ +%{ + +#ifdef YYBISON +int yylex(void); +static void yyerror(const char *); +#endif + +%} +%% +S: error +%% + +#include + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main(void) +{ + printf("yyparse() = %d\n", yyparse()); + return 0; +} + +int +yylex(void) +{ + return -1; +} + +static void +yyerror(const char* s) +{ + printf("%s\n", s); +} diff --git a/contrib/byacc/test/error.output b/contrib/byacc/test/error.output new file mode 100644 index 00000000000..0c4db6225e2 --- /dev/null +++ b/contrib/byacc/test/error.output @@ -0,0 +1,27 @@ + 0 $accept : S $end + + 1 S : error + +state 0 + $accept : . S $end (0) + + error shift 1 + . error + + S goto 2 + + +state 1 + S : error . (1) + + . reduce 1 + + +state 2 + $accept : S . $end (0) + + $end accept + + +2 terminals, 2 nonterminals +2 grammar rules, 3 states diff --git a/contrib/byacc/test/error.tab.c b/contrib/byacc/test/error.tab.c new file mode 100644 index 00000000000..91136291aea --- /dev/null +++ b/contrib/byacc/test/error.tab.c @@ -0,0 +1,501 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse error_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex error_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror error_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar error_char +#endif /* yychar */ + +#ifndef yyval +#define yyval error_val +#endif /* yyval */ + +#ifndef yylval +#define yylval error_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug error_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs error_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag error_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs error_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen error_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred error_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto error_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex error_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex error_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex error_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable error_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck error_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname error_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule error_rule +#endif /* yyrule */ +#define YYPREFIX "error_" + +#define YYPURE 0 + +#line 2 "error.y" +int yylex(void); +static void yyerror(const char *); +#line 102 "error.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define YYERRCODE 256 +static const short error_lhs[] = { -1, + 0, +}; +static const short error_len[] = { 2, + 1, +}; +static const short error_defred[] = { 0, + 1, 0, +}; +static const short error_dgoto[] = { 2, +}; +static const short error_sindex[] = { -256, + 0, 0, +}; +static const short error_rindex[] = { 0, + 0, 0, +}; +static const short error_gindex[] = { 0, +}; +#define YYTABLESIZE 0 +static const short error_table[] = { 1, +}; +static const short error_check[] = { 256, +}; +#define YYFINAL 2 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 0 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file", +}; +static const char *yyrule[] = { +"$accept : S", +"S : error", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 8 "error.y" + +#include + +int +main(void) +{ + printf("yyparse() = %d\n", yyparse()); + return 0; +} + +int +yylex(void) +{ + return -1; +} + +static void +yyerror(const char* s) +{ + printf("%s\n", s); +} +#line 236 "error.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/error.tab.h b/contrib/byacc/test/error.tab.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/contrib/byacc/test/error.y b/contrib/byacc/test/error.y new file mode 100644 index 00000000000..673c68d68e9 --- /dev/null +++ b/contrib/byacc/test/error.y @@ -0,0 +1,28 @@ +%{ +int yylex(void); +static void yyerror(const char *); +%} +%% +S: error +%% + +#include + +int +main(void) +{ + printf("yyparse() = %d\n", yyparse()); + return 0; +} + +int +yylex(void) +{ + return -1; +} + +static void +yyerror(const char* s) +{ + printf("%s\n", s); +} diff --git a/usr.bin/yacc/test/ftp.output b/contrib/byacc/test/ftp.output similarity index 100% rename from usr.bin/yacc/test/ftp.output rename to contrib/byacc/test/ftp.output diff --git a/contrib/byacc/test/ftp.tab.c b/contrib/byacc/test/ftp.tab.c new file mode 100644 index 00000000000..c450766e74b --- /dev/null +++ b/contrib/byacc/test/ftp.tab.c @@ -0,0 +1,1995 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse ftp_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex ftp_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror ftp_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar ftp_char +#endif /* yychar */ + +#ifndef yyval +#define yyval ftp_val +#endif /* yyval */ + +#ifndef yylval +#define yylval ftp_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug ftp_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs ftp_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag ftp_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs ftp_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen ftp_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred ftp_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto ftp_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex ftp_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex ftp_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex ftp_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable ftp_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck ftp_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname ftp_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule ftp_rule +#endif /* yyrule */ +#define YYPREFIX "ftp_" + +#define YYPURE 0 + +#line 26 "ftp.y" + +/* sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89"; */ + +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef YYBISON +int yylex(void); +static void yyerror(const char *); +#endif + +extern struct sockaddr_in data_dest; +extern int logged_in; +extern struct passwd *pw; +extern int guest; +extern int logging; +extern int type; +extern int form; +extern int debug; +extern int timeout; +extern int maxtimeout; +extern int pdata; +extern char hostname[], remotehost[]; +extern char proctitle[]; +extern char *globerr; +extern int usedefault; +extern int transflag; +extern char tmpline[]; + +extern char **glob(char *); +extern char *renamefrom(char *); +extern void cwd(const char *); + +extern void dologout(int); +extern void fatal(const char *); +extern void makedir(const char *); +extern void nack(const char *); +extern void pass(const char *); +extern void passive(void); +extern void pwd(void); +extern void removedir(char *); +extern void renamecmd(char *, char *); +extern void retrieve(const char *, const char *); +extern void send_file_list(const char *); +extern void statcmd(void); +extern void statfilecmd(const char *); +extern void store(char *, const char *, int); +extern void user(const char *); + +extern void perror_reply(int, const char *, ...); +extern void reply(int, const char *, ...); +extern void lreply(int, const char *, ...); + +static int cmd_type; +static int cmd_form; +static int cmd_bytesz; +char cbuf[512]; +char *fromname; + +struct tab { + const char *name; + short token; + short state; + short implemented; /* 1 if command is implemented */ + const char *help; +}; + +static char * copy(const char *); + +#ifdef YYBISON +static void sizecmd(char *filename); +static void help(struct tab *ctab, char *s); +struct tab cmdtab[]; +struct tab sitetab[]; +#endif + +static void +yyerror(const char *msg) +{ + perror(msg); +} +#line 198 "ftp.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define A 257 +#define B 258 +#define C 259 +#define E 260 +#define F 261 +#define I 262 +#define L 263 +#define N 264 +#define P 265 +#define R 266 +#define S 267 +#define T 268 +#define SP 269 +#define CRLF 270 +#define COMMA 271 +#define STRING 272 +#define NUMBER 273 +#define USER 274 +#define PASS 275 +#define ACCT 276 +#define REIN 277 +#define QUIT 278 +#define PORT 279 +#define PASV 280 +#define TYPE 281 +#define STRU 282 +#define MODE 283 +#define RETR 284 +#define STOR 285 +#define APPE 286 +#define MLFL 287 +#define MAIL 288 +#define MSND 289 +#define MSOM 290 +#define MSAM 291 +#define MRSQ 292 +#define MRCP 293 +#define ALLO 294 +#define REST 295 +#define RNFR 296 +#define RNTO 297 +#define ABOR 298 +#define DELE 299 +#define CWD 300 +#define LIST 301 +#define NLST 302 +#define SITE 303 +#define STAT 304 +#define HELP 305 +#define NOOP 306 +#define MKD 307 +#define RMD 308 +#define PWD 309 +#define CDUP 310 +#define STOU 311 +#define SMNT 312 +#define SYST 313 +#define SIZE 314 +#define MDTM 315 +#define UMASK 316 +#define IDLE 317 +#define CHMOD 318 +#define LEXERR 319 +#define YYERRCODE 256 +static const short ftp_lhs[] = { -1, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 3, 4, 4, + 12, 5, 13, 13, 13, 6, 6, 6, 6, 6, + 6, 6, 6, 7, 7, 7, 8, 8, 8, 10, + 14, 11, 9, +}; +static const short ftp_len[] = { 2, + 0, 2, 2, 4, 4, 4, 2, 4, 4, 4, + 4, 8, 5, 5, 5, 3, 5, 3, 5, 5, + 2, 5, 4, 2, 3, 5, 2, 4, 2, 5, + 5, 3, 3, 4, 6, 5, 7, 9, 4, 6, + 5, 2, 5, 5, 2, 2, 5, 1, 0, 1, + 1, 11, 1, 1, 1, 1, 3, 1, 3, 1, + 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, +}; +static const short ftp_defred[] = { 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 73, 73, 73, 0, 73, 0, 0, 73, 73, 73, + 73, 0, 0, 0, 0, 73, 73, 73, 73, 73, + 0, 73, 73, 2, 3, 46, 0, 0, 45, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 0, 0, 21, 0, 0, 27, + 29, 0, 0, 0, 0, 0, 42, 0, 0, 48, + 0, 50, 0, 0, 0, 0, 0, 60, 0, 0, + 64, 66, 65, 0, 68, 69, 67, 0, 0, 0, + 0, 0, 0, 71, 0, 70, 0, 0, 25, 0, + 18, 0, 16, 0, 73, 0, 73, 0, 0, 0, + 0, 32, 33, 0, 0, 0, 4, 5, 0, 6, + 0, 0, 0, 51, 63, 8, 9, 10, 0, 0, + 0, 0, 11, 0, 23, 0, 0, 0, 0, 0, + 34, 0, 0, 39, 0, 0, 28, 0, 0, 0, + 0, 0, 0, 55, 53, 54, 57, 59, 62, 13, + 14, 15, 0, 47, 22, 26, 19, 17, 0, 0, + 36, 0, 0, 20, 30, 31, 41, 43, 44, 0, + 0, 35, 72, 0, 40, 0, 0, 0, 37, 0, + 0, 12, 0, 0, 38, 0, 0, 0, 52, +}; +static const short ftp_dgoto[] = { 1, + 34, 35, 71, 73, 75, 80, 84, 88, 45, 95, + 184, 125, 157, 96, +}; +static const short ftp_sindex[] = { 0, + -224, -247, -239, -236, -232, -222, -204, -200, -181, -177, + 0, 0, 0, -166, 0, -161, -199, 0, 0, 0, + 0, -160, -159, -264, -158, 0, 0, 0, 0, 0, + -157, 0, 0, 0, 0, 0, -167, -162, 0, -156, + 0, -250, -198, -165, -155, -154, -153, -151, -150, -152, + 0, -145, -252, -229, -217, -302, 0, -144, -146, 0, + 0, -142, -141, -140, -139, -137, 0, -136, -135, 0, + -134, 0, -133, -132, -130, -131, -128, 0, -249, -127, + 0, 0, 0, -126, 0, 0, 0, -125, -152, -152, + -152, -205, -152, 0, -124, 0, -152, -152, 0, -152, + 0, -143, 0, -173, 0, -171, 0, -152, -123, -152, + -152, 0, 0, -152, -152, -152, 0, 0, -138, 0, + -164, -164, -122, 0, 0, 0, 0, 0, -121, -120, + -118, -148, 0, -117, 0, -116, -115, -114, -113, -112, + 0, -163, -111, 0, -110, -109, 0, -107, -106, -105, + -104, -103, -129, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -101, 0, 0, 0, 0, 0, -100, -102, + 0, -98, -102, 0, 0, 0, 0, 0, 0, -99, + -97, 0, 0, -95, 0, -96, -94, -92, 0, -152, + -93, 0, -91, -90, 0, -88, -87, -86, 0, +}; +static const short ftp_rindex[] = { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -82, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -81, -80, 0, -158, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +static const short ftp_gindex[] = { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 16, -89, + -25, 35, 47, 0, +}; +#define YYTABLESIZE 190 +static const short ftp_table[] = { 129, + 130, 131, 104, 134, 59, 60, 76, 136, 137, 77, + 138, 78, 79, 105, 106, 107, 98, 99, 146, 123, + 148, 149, 36, 124, 150, 151, 152, 46, 47, 37, + 49, 2, 38, 52, 53, 54, 55, 39, 58, 100, + 101, 62, 63, 64, 65, 66, 40, 68, 69, 3, + 4, 102, 103, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 81, 132, 133, 41, 82, 83, 42, 14, + 51, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 43, 31, 32, + 33, 44, 85, 86, 154, 140, 141, 143, 144, 155, + 193, 87, 48, 156, 70, 170, 171, 50, 56, 72, + 57, 61, 67, 89, 90, 91, 74, 163, 93, 94, + 142, 92, 145, 97, 108, 109, 110, 111, 139, 112, + 113, 114, 115, 116, 153, 117, 118, 121, 119, 120, + 122, 180, 126, 127, 128, 135, 147, 186, 160, 161, + 124, 162, 164, 165, 166, 167, 168, 159, 173, 169, + 174, 172, 175, 176, 177, 178, 179, 181, 158, 182, + 183, 185, 190, 187, 189, 188, 191, 192, 195, 194, + 196, 0, 0, 198, 197, 73, 199, 49, 56, 58, +}; +static const short ftp_check[] = { 89, + 90, 91, 305, 93, 269, 270, 257, 97, 98, 260, + 100, 262, 263, 316, 317, 318, 269, 270, 108, 269, + 110, 111, 270, 273, 114, 115, 116, 12, 13, 269, + 15, 256, 269, 18, 19, 20, 21, 270, 23, 269, + 270, 26, 27, 28, 29, 30, 269, 32, 33, 274, + 275, 269, 270, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 261, 269, 270, 270, 265, 266, 269, 294, + 270, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 269, 313, 314, + 315, 269, 258, 259, 259, 269, 270, 269, 270, 264, + 190, 267, 269, 268, 272, 269, 270, 269, 269, 272, + 270, 270, 270, 269, 269, 269, 273, 266, 269, 272, + 105, 273, 107, 269, 269, 272, 269, 269, 272, 270, + 270, 269, 269, 269, 273, 270, 270, 269, 271, 270, + 269, 271, 270, 270, 270, 270, 270, 173, 270, 270, + 273, 270, 270, 270, 270, 270, 270, 123, 269, 272, + 270, 273, 270, 270, 270, 270, 270, 269, 122, 270, + 273, 270, 269, 273, 270, 273, 271, 270, 270, 273, + 271, -1, -1, 271, 273, 269, 273, 270, 270, 270, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 319 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A","B","C","E","F","I","L","N", +"P","R","S","T","SP","CRLF","COMMA","STRING","NUMBER","USER","PASS","ACCT", +"REIN","QUIT","PORT","PASV","TYPE","STRU","MODE","RETR","STOR","APPE","MLFL", +"MAIL","MSND","MSOM","MSAM","MRSQ","MRCP","ALLO","REST","RNFR","RNTO","ABOR", +"DELE","CWD","LIST","NLST","SITE","STAT","HELP","NOOP","MKD","RMD","PWD","CDUP", +"STOU","SMNT","SYST","SIZE","MDTM","UMASK","IDLE","CHMOD","LEXERR", +}; +static const char *yyrule[] = { +"$accept : cmd_list", +"cmd_list :", +"cmd_list : cmd_list cmd", +"cmd_list : cmd_list rcmd", +"cmd : USER SP username CRLF", +"cmd : PASS SP password CRLF", +"cmd : PORT SP host_port CRLF", +"cmd : PASV CRLF", +"cmd : TYPE SP type_code CRLF", +"cmd : STRU SP struct_code CRLF", +"cmd : MODE SP mode_code CRLF", +"cmd : ALLO SP NUMBER CRLF", +"cmd : ALLO SP NUMBER SP R SP NUMBER CRLF", +"cmd : RETR check_login SP pathname CRLF", +"cmd : STOR check_login SP pathname CRLF", +"cmd : APPE check_login SP pathname CRLF", +"cmd : NLST check_login CRLF", +"cmd : NLST check_login SP STRING CRLF", +"cmd : LIST check_login CRLF", +"cmd : LIST check_login SP pathname CRLF", +"cmd : STAT check_login SP pathname CRLF", +"cmd : STAT CRLF", +"cmd : DELE check_login SP pathname CRLF", +"cmd : RNTO SP pathname CRLF", +"cmd : ABOR CRLF", +"cmd : CWD check_login CRLF", +"cmd : CWD check_login SP pathname CRLF", +"cmd : HELP CRLF", +"cmd : HELP SP STRING CRLF", +"cmd : NOOP CRLF", +"cmd : MKD check_login SP pathname CRLF", +"cmd : RMD check_login SP pathname CRLF", +"cmd : PWD check_login CRLF", +"cmd : CDUP check_login CRLF", +"cmd : SITE SP HELP CRLF", +"cmd : SITE SP HELP SP STRING CRLF", +"cmd : SITE SP UMASK check_login CRLF", +"cmd : SITE SP UMASK check_login SP octal_number CRLF", +"cmd : SITE SP CHMOD check_login SP octal_number SP pathname CRLF", +"cmd : SITE SP IDLE CRLF", +"cmd : SITE SP IDLE SP NUMBER CRLF", +"cmd : STOU check_login SP pathname CRLF", +"cmd : SYST CRLF", +"cmd : SIZE check_login SP pathname CRLF", +"cmd : MDTM check_login SP pathname CRLF", +"cmd : QUIT CRLF", +"cmd : error CRLF", +"rcmd : RNFR check_login SP pathname CRLF", +"username : STRING", +"password :", +"password : STRING", +"byte_size : NUMBER", +"host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER", +"form_code : N", +"form_code : T", +"form_code : C", +"type_code : A", +"type_code : A SP form_code", +"type_code : E", +"type_code : E SP form_code", +"type_code : I", +"type_code : L", +"type_code : L SP byte_size", +"type_code : L byte_size", +"struct_code : F", +"struct_code : R", +"struct_code : P", +"mode_code : S", +"mode_code : B", +"mode_code : C", +"pathname : pathstring", +"pathstring : STRING", +"octal_number : NUMBER", +"check_login :", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 707 "ftp.y" + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +extern jmp_buf errcatch; + +static void upper(char *); + +#define CMD 0 /* beginning of command */ +#define ARGS 1 /* expect miscellaneous arguments */ +#define STR1 2 /* expect SP followed by STRING */ +#define STR2 3 /* expect STRING */ +#define OSTR 4 /* optional SP then STRING */ +#define ZSTR1 5 /* SP then optional STRING */ +#define ZSTR2 6 /* optional STRING after SP */ +#define SITECMD 7 /* SITE command */ +#define NSTR 8 /* Number followed by a string */ + +struct tab cmdtab[] = { /* In order defined in RFC 765 */ + { "USER", USER, STR1, 1, " username" }, + { "PASS", PASS, ZSTR1, 1, " password" }, + { "ACCT", ACCT, STR1, 0, "(specify account)" }, + { "SMNT", SMNT, ARGS, 0, "(structure mount)" }, + { "REIN", REIN, ARGS, 0, "(reinitialize server state)" }, + { "QUIT", QUIT, ARGS, 1, "(terminate service)", }, + { "PORT", PORT, ARGS, 1, " b0, b1, b2, b3, b4" }, + { "PASV", PASV, ARGS, 1, "(set server in passive mode)" }, + { "TYPE", TYPE, ARGS, 1, " [ A | E | I | L ]" }, + { "STRU", STRU, ARGS, 1, "(specify file structure)" }, + { "MODE", MODE, ARGS, 1, "(specify transfer mode)" }, + { "RETR", RETR, STR1, 1, " file-name" }, + { "STOR", STOR, STR1, 1, " file-name" }, + { "APPE", APPE, STR1, 1, " file-name" }, + { "MLFL", MLFL, OSTR, 0, "(mail file)" }, + { "MAIL", MAIL, OSTR, 0, "(mail to user)" }, + { "MSND", MSND, OSTR, 0, "(mail send to terminal)" }, + { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" }, + { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" }, + { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" }, + { "MRCP", MRCP, STR1, 0, "(mail recipient)" }, + { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" }, + { "REST", REST, ARGS, 0, "(restart command)" }, + { "RNFR", RNFR, STR1, 1, " file-name" }, + { "RNTO", RNTO, STR1, 1, " file-name" }, + { "ABOR", ABOR, ARGS, 1, "(abort operation)" }, + { "DELE", DELE, STR1, 1, " file-name" }, + { "CWD", CWD, OSTR, 1, "[ directory-name ]" }, + { "XCWD", CWD, OSTR, 1, "[ directory-name ]" }, + { "LIST", LIST, OSTR, 1, "[ path-name ]" }, + { "NLST", NLST, OSTR, 1, "[ path-name ]" }, + { "SITE", SITE, SITECMD, 1, "site-cmd [ arguments ]" }, + { "SYST", SYST, ARGS, 1, "(get type of operating system)" }, + { "STAT", STAT, OSTR, 1, "[ path-name ]" }, + { "HELP", HELP, OSTR, 1, "[ ]" }, + { "NOOP", NOOP, ARGS, 1, "" }, + { "MKD", MKD, STR1, 1, " path-name" }, + { "XMKD", MKD, STR1, 1, " path-name" }, + { "RMD", RMD, STR1, 1, " path-name" }, + { "XRMD", RMD, STR1, 1, " path-name" }, + { "PWD", PWD, ARGS, 1, "(return current directory)" }, + { "XPWD", PWD, ARGS, 1, "(return current directory)" }, + { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" }, + { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" }, + { "STOU", STOU, STR1, 1, " file-name" }, + { "SIZE", SIZE, OSTR, 1, " path-name" }, + { "MDTM", MDTM, OSTR, 1, " path-name" }, + { 0, 0, 0, 0, 0 } +}; + +struct tab sitetab[] = { + { "UMASK", UMASK, ARGS, 1, "[ umask ]" }, + { "IDLE", IDLE, ARGS, 1, "[ maximum-idle-time ]" }, + { "CHMOD", CHMOD, NSTR, 1, " mode file-name" }, + { "HELP", HELP, OSTR, 1, "[ ]" }, + { 0, 0, 0, 0, 0 } +}; + +static struct tab * +lookup(struct tab *p, char *cmd) +{ + + for (; p->name != 0; p++) + if (strcmp(cmd, p->name) == 0) + return (p); + return (0); +} + +#include + +/* + * get_line - a hacked up version of fgets to ignore TELNET escape codes. + */ +static char * +get_line(char *s, int n, FILE *iop) +{ + register int c; + register char *cs; + + cs = s; +/* tmpline may contain saved command from urgent mode interruption */ + for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) { + *cs++ = tmpline[c]; + if (tmpline[c] == '\n') { + *cs = '\0'; + if (debug) + syslog(LOG_DEBUG, "command: %s", s); + tmpline[0] = '\0'; + return(s); + } + if (c == 0) + tmpline[0] = '\0'; + } + while ((c = getc(iop)) != EOF) { + c &= 0377; + if (c == IAC) { + if ((c = getc(iop)) != EOF) { + c &= 0377; + switch (c) { + case WILL: + case WONT: + c = getc(iop); + printf("%c%c%c", IAC, DONT, 0377&c); + (void) fflush(stdout); + continue; + case DO: + case DONT: + c = getc(iop); + printf("%c%c%c", IAC, WONT, 0377&c); + (void) fflush(stdout); + continue; + case IAC: + break; + default: + continue; /* ignore command */ + } + } + } + *cs++ = c; + if (--n <= 0 || c == '\n') + break; + } + if (c == EOF && cs == s) + return (0); + *cs = '\0'; + if (debug) + syslog(LOG_DEBUG, "command: %s", s); + return (s); +} + +static void +toolong(int sig) +{ + time_t now; + + (void) sig; + reply(421, + "Timeout (%d seconds): closing control connection.", timeout); + (void) time(&now); + if (logging) { + syslog(LOG_INFO, + "User %s timed out after %d seconds at %s", + (pw ? pw -> pw_name : "unknown"), timeout, ctime(&now)); + } + dologout(1); +} + +int +yylex(void) +{ + static int cpos, state; + register char *cp, *cp2; + register struct tab *p; + int n; + char c; + + for (;;) { + switch (state) { + + case CMD: + (void) signal(SIGALRM, toolong); + (void) alarm((unsigned) timeout); + if (get_line(cbuf, sizeof(cbuf)-1, stdin) == 0) { + reply(221, "You could at least say goodbye."); + dologout(0); + } + (void) alarm(0); +#ifdef SETPROCTITLE + if (strncasecmp(cbuf, "PASS", 4) != 0) + setproctitle("%s: %s", proctitle, cbuf); +#endif /* SETPROCTITLE */ + if ((cp = strchr(cbuf, '\r'))) { + *cp++ = '\n'; + *cp = '\0'; + } + if ((cp = strpbrk(cbuf, " \n"))) + cpos = cp - cbuf; + if (cpos == 0) + cpos = 4; + c = cbuf[cpos]; + cbuf[cpos] = '\0'; + upper(cbuf); + p = lookup(cmdtab, cbuf); + cbuf[cpos] = c; + if (p != 0) { + if (p->implemented == 0) { + nack(p->name); + longjmp(errcatch,0); + /* NOTREACHED */ + } + state = p->state; + *(const char **)(&yylval) = p->name; + return (p->token); + } + break; + + case SITECMD: + if (cbuf[cpos] == ' ') { + cpos++; + return (SP); + } + cp = &cbuf[cpos]; + if ((cp2 = strpbrk(cp, " \n"))) + cpos = cp2 - cbuf; + c = cbuf[cpos]; + cbuf[cpos] = '\0'; + upper(cp); + p = lookup(sitetab, cp); + cbuf[cpos] = c; + if (p != 0) { + if (p->implemented == 0) { + state = CMD; + nack(p->name); + longjmp(errcatch,0); + /* NOTREACHED */ + } + state = p->state; + *(const char **)(&yylval) = p->name; + return (p->token); + } + state = CMD; + break; + + case OSTR: + if (cbuf[cpos] == '\n') { + state = CMD; + return (CRLF); + } + /* FALLTHROUGH */ + + case STR1: + case ZSTR1: + dostr1: + if (cbuf[cpos] == ' ') { + cpos++; + if (state == OSTR) + state = STR2; + else + ++state; + return (SP); + } + break; + + case ZSTR2: + if (cbuf[cpos] == '\n') { + state = CMD; + return (CRLF); + } + /* FALLTHROUGH */ + + case STR2: + cp = &cbuf[cpos]; + n = strlen(cp); + cpos += n - 1; + /* + * Make sure the string is nonempty and \n terminated. + */ + if (n > 1 && cbuf[cpos] == '\n') { + cbuf[cpos] = '\0'; + *(char **)&yylval = copy(cp); + cbuf[cpos] = '\n'; + state = ARGS; + return (STRING); + } + break; + + case NSTR: + if (cbuf[cpos] == ' ') { + cpos++; + return (SP); + } + if (isdigit(cbuf[cpos])) { + cp = &cbuf[cpos]; + while (isdigit(cbuf[++cpos])) + ; + c = cbuf[cpos]; + cbuf[cpos] = '\0'; + yylval = atoi(cp); + cbuf[cpos] = c; + state = STR1; + return (NUMBER); + } + state = STR1; + goto dostr1; + + case ARGS: + if (isdigit(cbuf[cpos])) { + cp = &cbuf[cpos]; + while (isdigit(cbuf[++cpos])) + ; + c = cbuf[cpos]; + cbuf[cpos] = '\0'; + yylval = atoi(cp); + cbuf[cpos] = c; + return (NUMBER); + } + switch (cbuf[cpos++]) { + + case '\n': + state = CMD; + return (CRLF); + + case ' ': + return (SP); + + case ',': + return (COMMA); + + case 'A': + case 'a': + return (A); + + case 'B': + case 'b': + return (B); + + case 'C': + case 'c': + return (C); + + case 'E': + case 'e': + return (E); + + case 'F': + case 'f': + return (F); + + case 'I': + case 'i': + return (I); + + case 'L': + case 'l': + return (L); + + case 'N': + case 'n': + return (N); + + case 'P': + case 'p': + return (P); + + case 'R': + case 'r': + return (R); + + case 'S': + case 's': + return (S); + + case 'T': + case 't': + return (T); + + } + break; + + default: + fatal("Unknown state in scanner."); + } + yyerror((char *) 0); + state = CMD; + longjmp(errcatch,0); + } +} + +static void +upper(char *s) +{ + while (*s != '\0') { + if (islower(*s)) + *s = toupper(*s); + s++; + } +} + +static char * +copy(const char *s) +{ + char *p; + + p = (char * )malloc(strlen(s) + 1); + if (p == 0) + fatal("Ran out of memory."); + else + (void) strcpy(p, s); + return (p); +} + +static void +help(struct tab *ctab, char *s) +{ + register struct tab *c; + register int width, NCMDS; + const char *help_type; + + if (ctab == sitetab) + help_type = "SITE "; + else + help_type = ""; + width = 0, NCMDS = 0; + for (c = ctab; c->name != 0; c++) { + int len = strlen(c->name); + + if (len > width) + width = len; + NCMDS++; + } + width = (width + 8) &~ 7; + if (s == 0) { + register int i, j, w; + int columns, lines; + + lreply(214, "The following %scommands are recognized %s.", + help_type, "(* =>'s unimplemented)"); + columns = 76 / width; + if (columns == 0) + columns = 1; + lines = (NCMDS + columns - 1) / columns; + for (i = 0; i < lines; i++) { + printf(" "); + for (j = 0; j < columns; j++) { + c = ctab + j * lines + i; + assert(c->name != 0); + printf("%s%c", c->name, + c->implemented ? ' ' : '*'); + if (c + lines >= &ctab[NCMDS]) + break; + w = strlen(c->name) + 1; + while (w < width) { + putchar(' '); + w++; + } + } + printf("\r\n"); + } + (void) fflush(stdout); + reply(214, "Direct comments to ftp-bugs@%s.", hostname); + return; + } + upper(s); + c = lookup(ctab, s); + if (c == (struct tab *)0) { + reply(502, "Unknown command %s.", s); + return; + } + if (c->implemented) + reply(214, "Syntax: %s%s %s", help_type, c->name, c->help); + else + reply(214, "%s%-*s\t%s; unimplemented.", help_type, width, + c->name, c->help); +} + +static void +sizecmd(char *filename) +{ + switch (type) { + case TYPE_L: + case TYPE_I: { + struct stat stbuf; + if (stat(filename, &stbuf) < 0 || + (stbuf.st_mode&S_IFMT) != S_IFREG) + reply(550, "%s: not a plain file.", filename); + else +#ifdef HAVE_LONG_LONG + reply(213, "%llu", (long long) stbuf.st_size); +#else + reply(213, "%lu", stbuf.st_size); +#endif + break;} + case TYPE_A: { + FILE *fin; + register int c, count; + struct stat stbuf; + fin = fopen(filename, "r"); + if (fin == 0) { + perror_reply(550, filename); + return; + } + if (fstat(fileno(fin), &stbuf) < 0 || + (stbuf.st_mode&S_IFMT) != S_IFREG) { + reply(550, "%s: not a plain file.", filename); + (void) fclose(fin); + return; + } + + count = 0; + while((c=getc(fin)) != EOF) { + if (c == '\n') /* will get expanded to \r\n */ + count++; + count++; + } + (void) fclose(fin); + + reply(213, "%ld", count); + break;} + default: + reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]); + } +} +#line 1092 "ftp.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 2: +#line 150 "ftp.y" + { + fromname = (char *) 0; + } +break; +case 4: +#line 157 "ftp.y" + { + user((char *) yystack.l_mark[-1]); + free((char *) yystack.l_mark[-1]); + } +break; +case 5: +#line 162 "ftp.y" + { + pass((char *) yystack.l_mark[-1]); + free((char *) yystack.l_mark[-1]); + } +break; +case 6: +#line 167 "ftp.y" + { + usedefault = 0; + if (pdata >= 0) { + (void) close(pdata); + pdata = -1; + } + reply(200, "PORT command successful."); + } +break; +case 7: +#line 176 "ftp.y" + { + passive(); + } +break; +case 8: +#line 180 "ftp.y" + { + switch (cmd_type) { + + case TYPE_A: + if (cmd_form == FORM_N) { + reply(200, "Type set to A."); + type = cmd_type; + form = cmd_form; + } else + reply(504, "Form must be N."); + break; + + case TYPE_E: + reply(504, "Type E not implemented."); + break; + + case TYPE_I: + reply(200, "Type set to I."); + type = cmd_type; + break; + + case TYPE_L: +#if NBBY == 8 + if (cmd_bytesz == 8) { + reply(200, + "Type set to L (byte size 8)."); + type = cmd_type; + } else + reply(504, "Byte size must be 8."); +#else /* NBBY == 8 */ + UNIMPLEMENTED for NBBY != 8 +#endif /* NBBY == 8 */ + } + } +break; +case 9: +#line 215 "ftp.y" + { + switch (yystack.l_mark[-1]) { + + case STRU_F: + reply(200, "STRU F ok."); + break; + + default: + reply(504, "Unimplemented STRU type."); + } + } +break; +case 10: +#line 227 "ftp.y" + { + switch (yystack.l_mark[-1]) { + + case MODE_S: + reply(200, "MODE S ok."); + break; + + default: + reply(502, "Unimplemented MODE type."); + } + } +break; +case 11: +#line 239 "ftp.y" + { + reply(202, "ALLO command ignored."); + } +break; +case 12: +#line 243 "ftp.y" + { + reply(202, "ALLO command ignored."); + } +break; +case 13: +#line 247 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + retrieve((char *) 0, (char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 14: +#line 254 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + store((char *) yystack.l_mark[-1], "w", 0); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 15: +#line 261 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + store((char *) yystack.l_mark[-1], "a", 0); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 16: +#line 268 "ftp.y" + { + if (yystack.l_mark[-1]) + send_file_list("."); + } +break; +case 17: +#line 273 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + send_file_list((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 18: +#line 280 "ftp.y" + { + if (yystack.l_mark[-1]) + retrieve("/bin/ls -lgA", ""); + } +break; +case 19: +#line 285 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + retrieve("/bin/ls -lgA %s", (char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 20: +#line 292 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + statfilecmd((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 21: +#line 299 "ftp.y" + { + statcmd(); + } +break; +case 22: +#line 303 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + remove((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 23: +#line 310 "ftp.y" + { + if (fromname) { + renamecmd(fromname, (char *) yystack.l_mark[-1]); + free(fromname); + fromname = (char *) 0; + } else { + reply(503, "Bad sequence of commands."); + } + free((char *) yystack.l_mark[-1]); + } +break; +case 24: +#line 321 "ftp.y" + { + reply(225, "ABOR command successful."); + } +break; +case 25: +#line 325 "ftp.y" + { + if (yystack.l_mark[-1]) + cwd(pw->pw_dir); + } +break; +case 26: +#line 330 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + cwd((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 27: +#line 337 "ftp.y" + { + help(cmdtab, (char *) 0); + } +break; +case 28: +#line 341 "ftp.y" + { + register char *cp = (char *)yystack.l_mark[-1]; + + if (strncasecmp(cp, "SITE", 4) == 0) { + cp = (char *)yystack.l_mark[-1] + 4; + if (*cp == ' ') + cp++; + if (*cp) + help(sitetab, cp); + else + help(sitetab, (char *) 0); + } else + help(cmdtab, (char *) yystack.l_mark[-1]); + } +break; +case 29: +#line 356 "ftp.y" + { + reply(200, "NOOP command successful."); + } +break; +case 30: +#line 360 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + makedir((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 31: +#line 367 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + removedir((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 32: +#line 374 "ftp.y" + { + if (yystack.l_mark[-1]) + pwd(); + } +break; +case 33: +#line 379 "ftp.y" + { + if (yystack.l_mark[-1]) + cwd(".."); + } +break; +case 34: +#line 384 "ftp.y" + { + help(sitetab, (char *) 0); + } +break; +case 35: +#line 388 "ftp.y" + { + help(sitetab, (char *) yystack.l_mark[-1]); + } +break; +case 36: +#line 392 "ftp.y" + { + int oldmask; + + if (yystack.l_mark[-1]) { + oldmask = umask(0); + (void) umask(oldmask); + reply(200, "Current UMASK is %03o", oldmask); + } + } +break; +case 37: +#line 402 "ftp.y" + { + int oldmask; + + if (yystack.l_mark[-3]) { + if ((yystack.l_mark[-1] == -1) || (yystack.l_mark[-1] > 0777)) { + reply(501, "Bad UMASK value"); + } else { + oldmask = umask(yystack.l_mark[-1]); + reply(200, + "UMASK set to %03o (was %03o)", + yystack.l_mark[-1], oldmask); + } + } + } +break; +case 38: +#line 417 "ftp.y" + { + if (yystack.l_mark[-5] && (yystack.l_mark[-1] != 0)) { + if (yystack.l_mark[-3] > 0777) + reply(501, + "CHMOD: Mode value must be between 0 and 0777"); + else if (chmod((char *) yystack.l_mark[-1], yystack.l_mark[-3]) < 0) + perror_reply(550, (char *) yystack.l_mark[-1]); + else + reply(200, "CHMOD command successful."); + } + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 39: +#line 431 "ftp.y" + { + reply(200, + "Current IDLE time limit is %d seconds; max %d", + timeout, maxtimeout); + } +break; +case 40: +#line 437 "ftp.y" + { + if (yystack.l_mark[-1] < 30 || yystack.l_mark[-1] > maxtimeout) { + reply(501, + "Maximum IDLE time must be between 30 and %d seconds", + maxtimeout); + } else { + timeout = yystack.l_mark[-1]; + (void) alarm((unsigned) timeout); + reply(200, + "Maximum IDLE time set to %d seconds", + timeout); + } + } +break; +case 41: +#line 451 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + store((char *) yystack.l_mark[-1], "w", 1); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 42: +#line 458 "ftp.y" + { +#ifdef unix +#ifdef BSD + reply(215, "UNIX Type: L%d Version: BSD-%d", + NBBY, BSD); +#else /* BSD */ + reply(215, "UNIX Type: L%d", NBBY); +#endif /* BSD */ +#else /* unix */ + reply(215, "UNKNOWN Type: L%d", NBBY); +#endif /* unix */ + } +break; +case 43: +#line 479 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + sizecmd((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 44: +#line 496 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) { + struct stat stbuf; + if (stat((char *) yystack.l_mark[-1], &stbuf) < 0) + perror_reply(550, "%s", (char *) yystack.l_mark[-1]); + else if ((stbuf.st_mode&S_IFMT) != S_IFREG) { + reply(550, "%s: not a plain file.", + (char *) yystack.l_mark[-1]); + } else { + register struct tm *t; + t = gmtime(&stbuf.st_mtime); + reply(213, + "%04d%02d%02d%02d%02d%02d", + 1900 + t->tm_year, + t->tm_mon+1, t->tm_mday, + t->tm_hour, t->tm_min, t->tm_sec); + } + } + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); + } +break; +case 45: +#line 518 "ftp.y" + { + reply(221, "Goodbye."); + dologout(0); + } +break; +case 46: +#line 523 "ftp.y" + { + yyerrok; + } +break; +case 47: +#line 528 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1]) { + fromname = renamefrom((char *) yystack.l_mark[-1]); + if (fromname == (char *) 0 && yystack.l_mark[-1]) { + free((char *) yystack.l_mark[-1]); + } + } + } +break; +case 49: +#line 542 "ftp.y" + { + *(const char **)(&(yyval)) = ""; + } +break; +case 52: +#line 553 "ftp.y" + { + register char *a, *p; + + a = (char *)&data_dest.sin_addr; + a[0] = yystack.l_mark[-10]; a[1] = yystack.l_mark[-8]; a[2] = yystack.l_mark[-6]; a[3] = yystack.l_mark[-4]; + p = (char *)&data_dest.sin_port; + p[0] = yystack.l_mark[-2]; p[1] = yystack.l_mark[0]; + data_dest.sin_family = AF_INET; + } +break; +case 53: +#line 565 "ftp.y" + { + yyval = FORM_N; + } +break; +case 54: +#line 569 "ftp.y" + { + yyval = FORM_T; + } +break; +case 55: +#line 573 "ftp.y" + { + yyval = FORM_C; + } +break; +case 56: +#line 579 "ftp.y" + { + cmd_type = TYPE_A; + cmd_form = FORM_N; + } +break; +case 57: +#line 584 "ftp.y" + { + cmd_type = TYPE_A; + cmd_form = yystack.l_mark[0]; + } +break; +case 58: +#line 589 "ftp.y" + { + cmd_type = TYPE_E; + cmd_form = FORM_N; + } +break; +case 59: +#line 594 "ftp.y" + { + cmd_type = TYPE_E; + cmd_form = yystack.l_mark[0]; + } +break; +case 60: +#line 599 "ftp.y" + { + cmd_type = TYPE_I; + } +break; +case 61: +#line 603 "ftp.y" + { + cmd_type = TYPE_L; + cmd_bytesz = NBBY; + } +break; +case 62: +#line 608 "ftp.y" + { + cmd_type = TYPE_L; + cmd_bytesz = yystack.l_mark[0]; + } +break; +case 63: +#line 614 "ftp.y" + { + cmd_type = TYPE_L; + cmd_bytesz = yystack.l_mark[0]; + } +break; +case 64: +#line 621 "ftp.y" + { + yyval = STRU_F; + } +break; +case 65: +#line 625 "ftp.y" + { + yyval = STRU_R; + } +break; +case 66: +#line 629 "ftp.y" + { + yyval = STRU_P; + } +break; +case 67: +#line 635 "ftp.y" + { + yyval = MODE_S; + } +break; +case 68: +#line 639 "ftp.y" + { + yyval = MODE_B; + } +break; +case 69: +#line 643 "ftp.y" + { + yyval = MODE_C; + } +break; +case 70: +#line 649 "ftp.y" + { + /* + * Problem: this production is used for all pathname + * processing, but only gives a 550 error reply. + * This is a valid reply in some cases but not in others. + */ + if (logged_in && yystack.l_mark[0] && strncmp((char *) yystack.l_mark[0], "~", 1) == 0) { + *(char **)&(yyval) = *glob((char *) yystack.l_mark[0]); + if (globerr != 0) { + reply(550, globerr); + yyval = 0; + } + free((char *) yystack.l_mark[0]); + } else + yyval = yystack.l_mark[0]; + } +break; +case 72: +#line 671 "ftp.y" + { + register int ret, dec, multby, digit; + + /* + * Convert a number that was read as decimal number + * to what it would be if it had been read as octal. + */ + dec = yystack.l_mark[0]; + multby = 1; + ret = 0; + while (dec) { + digit = dec%10; + if (digit > 7) { + ret = -1; + break; + } + ret += digit * multby; + multby *= 8; + dec /= 10; + } + yyval = ret; + } +break; +case 73: +#line 696 "ftp.y" + { + if (logged_in) + yyval = 1; + else { + reply(530, "Please login with USER and PASS."); + yyval = 0; + } + } +break; +#line 1935 "ftp.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/usr.bin/yacc/test/ftp.tab.h b/contrib/byacc/test/ftp.tab.h similarity index 100% rename from usr.bin/yacc/test/ftp.tab.h rename to contrib/byacc/test/ftp.tab.h diff --git a/usr.bin/yacc/test/ftp.y b/contrib/byacc/test/ftp.y similarity index 84% rename from usr.bin/yacc/test/ftp.y rename to contrib/byacc/test/ftp.y index 9a1e525bdb4..42c210bf4ef 100644 --- a/usr.bin/yacc/test/ftp.y +++ b/contrib/byacc/test/ftp.y @@ -24,9 +24,7 @@ %{ -#ifndef lint -static char sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89"; -#endif /* not lint */ +/* sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89"; */ #include #include @@ -35,6 +33,8 @@ static char sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89"; #include +#include +#include #include #include #include @@ -42,7 +42,14 @@ static char sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89"; #include #include #include +#include #include +#include + +#ifdef YYBISON +int yylex(void); +static void yyerror(const char *); +#endif extern struct sockaddr_in data_dest; extern int logged_in; @@ -61,7 +68,30 @@ extern char *globerr; extern int usedefault; extern int transflag; extern char tmpline[]; -char **glob(); + +extern char **glob(char *); +extern char *renamefrom(char *); +extern void cwd(const char *); + +extern void dologout(int); +extern void fatal(const char *); +extern void makedir(const char *); +extern void nack(const char *); +extern void pass(const char *); +extern void passive(void); +extern void pwd(void); +extern void removedir(char *); +extern void renamecmd(char *, char *); +extern void retrieve(const char *, const char *); +extern void send_file_list(const char *); +extern void statcmd(void); +extern void statfilecmd(const char *); +extern void store(char *, const char *, int); +extern void user(const char *); + +extern void perror_reply(int, const char *, ...); +extern void reply(int, const char *, ...); +extern void lreply(int, const char *, ...); static int cmd_type; static int cmd_form; @@ -69,7 +99,28 @@ static int cmd_bytesz; char cbuf[512]; char *fromname; -char *index(); +struct tab { + const char *name; + short token; + short state; + short implemented; /* 1 if command is implemented */ + const char *help; +}; + +static char * copy(const char *); + +#ifdef YYBISON +static void sizecmd(char *filename); +static void help(struct tab *ctab, char *s); +struct tab cmdtab[]; +struct tab sitetab[]; +#endif + +static void +yyerror(const char *msg) +{ + perror(msg); +} %} %token @@ -96,24 +147,24 @@ char *index(); cmd_list: /* empty */ | cmd_list cmd - = { + { fromname = (char *) 0; } | cmd_list rcmd ; cmd: USER SP username CRLF - = { + { user((char *) $3); free((char *) $3); } | PASS SP password CRLF - = { + { pass((char *) $3); free((char *) $3); } | PORT SP host_port CRLF - = { + { usedefault = 0; if (pdata >= 0) { (void) close(pdata); @@ -122,11 +173,11 @@ cmd: USER SP username CRLF reply(200, "PORT command successful."); } | PASV CRLF - = { + { passive(); } | TYPE SP type_code CRLF - = { + { switch (cmd_type) { case TYPE_A: @@ -161,7 +212,7 @@ cmd: USER SP username CRLF } } | STRU SP struct_code CRLF - = { + { switch ($3) { case STRU_F: @@ -173,7 +224,7 @@ cmd: USER SP username CRLF } } | MODE SP mode_code CRLF - = { + { switch ($3) { case MODE_S: @@ -185,78 +236,78 @@ cmd: USER SP username CRLF } } | ALLO SP NUMBER CRLF - = { + { reply(202, "ALLO command ignored."); } | ALLO SP NUMBER SP R SP NUMBER CRLF - = { + { reply(202, "ALLO command ignored."); } | RETR check_login SP pathname CRLF - = { - if ($2 && $4 != NULL) + { + if ($2 && $4 != 0) retrieve((char *) 0, (char *) $4); - if ($4 != NULL) + if ($4 != 0) free((char *) $4); } | STOR check_login SP pathname CRLF - = { - if ($2 && $4 != NULL) + { + if ($2 && $4 != 0) store((char *) $4, "w", 0); - if ($4 != NULL) + if ($4 != 0) free((char *) $4); } | APPE check_login SP pathname CRLF - = { - if ($2 && $4 != NULL) + { + if ($2 && $4 != 0) store((char *) $4, "a", 0); - if ($4 != NULL) + if ($4 != 0) free((char *) $4); } | NLST check_login CRLF - = { + { if ($2) send_file_list("."); } | NLST check_login SP STRING CRLF - = { - if ($2 && $4 != NULL) + { + if ($2 && $4 != 0) send_file_list((char *) $4); - if ($4 != NULL) + if ($4 != 0) free((char *) $4); } | LIST check_login CRLF - = { + { if ($2) retrieve("/bin/ls -lgA", ""); } | LIST check_login SP pathname CRLF - = { - if ($2 && $4 != NULL) + { + if ($2 && $4 != 0) retrieve("/bin/ls -lgA %s", (char *) $4); - if ($4 != NULL) + if ($4 != 0) free((char *) $4); } | STAT check_login SP pathname CRLF - = { - if ($2 && $4 != NULL) + { + if ($2 && $4 != 0) statfilecmd((char *) $4); - if ($4 != NULL) + if ($4 != 0) free((char *) $4); } | STAT CRLF - = { + { statcmd(); } | DELE check_login SP pathname CRLF - = { - if ($2 && $4 != NULL) - delete((char *) $4); - if ($4 != NULL) + { + if ($2 && $4 != 0) + remove((char *) $4); + if ($4 != 0) free((char *) $4); } | RNTO SP pathname CRLF - = { + { if (fromname) { renamecmd(fromname, (char *) $3); free(fromname); @@ -267,27 +318,27 @@ cmd: USER SP username CRLF free((char *) $3); } | ABOR CRLF - = { + { reply(225, "ABOR command successful."); } | CWD check_login CRLF - = { + { if ($2) cwd(pw->pw_dir); } | CWD check_login SP pathname CRLF - = { - if ($2 && $4 != NULL) + { + if ($2 && $4 != 0) cwd((char *) $4); - if ($4 != NULL) + if ($4 != 0) free((char *) $4); } | HELP CRLF - = { + { help(cmdtab, (char *) 0); } | HELP SP STRING CRLF - = { + { register char *cp = (char *)$3; if (strncasecmp(cp, "SITE", 4) == 0) { @@ -302,43 +353,43 @@ cmd: USER SP username CRLF help(cmdtab, (char *) $3); } | NOOP CRLF - = { + { reply(200, "NOOP command successful."); } | MKD check_login SP pathname CRLF - = { - if ($2 && $4 != NULL) + { + if ($2 && $4 != 0) makedir((char *) $4); - if ($4 != NULL) + if ($4 != 0) free((char *) $4); } | RMD check_login SP pathname CRLF - = { - if ($2 && $4 != NULL) + { + if ($2 && $4 != 0) removedir((char *) $4); - if ($4 != NULL) + if ($4 != 0) free((char *) $4); } | PWD check_login CRLF - = { + { if ($2) pwd(); } | CDUP check_login CRLF - = { + { if ($2) cwd(".."); } | SITE SP HELP CRLF - = { + { help(sitetab, (char *) 0); } | SITE SP HELP SP STRING CRLF - = { + { help(sitetab, (char *) $5); } | SITE SP UMASK check_login CRLF - = { + { int oldmask; if ($4) { @@ -348,7 +399,7 @@ cmd: USER SP username CRLF } } | SITE SP UMASK check_login SP octal_number CRLF - = { + { int oldmask; if ($4) { @@ -363,8 +414,8 @@ cmd: USER SP username CRLF } } | SITE SP CHMOD check_login SP octal_number SP pathname CRLF - = { - if ($4 && ($8 != NULL)) { + { + if ($4 && ($8 != 0)) { if ($6 > 0777) reply(501, "CHMOD: Mode value must be between 0 and 0777"); @@ -373,17 +424,17 @@ cmd: USER SP username CRLF else reply(200, "CHMOD command successful."); } - if ($8 != NULL) + if ($8 != 0) free((char *) $8); } | SITE SP IDLE CRLF - = { + { reply(200, "Current IDLE time limit is %d seconds; max %d", timeout, maxtimeout); } | SITE SP IDLE SP NUMBER CRLF - = { + { if ($5 < 30 || $5 > maxtimeout) { reply(501, "Maximum IDLE time must be between 30 and %d seconds", @@ -397,14 +448,14 @@ cmd: USER SP username CRLF } } | STOU check_login SP pathname CRLF - = { - if ($2 && $4 != NULL) + { + if ($2 && $4 != 0) store((char *) $4, "w", 1); - if ($4 != NULL) + if ($4 != 0) free((char *) $4); } | SYST CRLF - = { + { #ifdef unix #ifdef BSD reply(215, "UNIX Type: L%d Version: BSD-%d", @@ -425,10 +476,10 @@ cmd: USER SP username CRLF * using with RESTART (we just count bytes). */ | SIZE check_login SP pathname CRLF - = { - if ($2 && $4 != NULL) + { + if ($2 && $4 != 0) sizecmd((char *) $4); - if ($4 != NULL) + if ($4 != 0) free((char *) $4); } @@ -442,8 +493,8 @@ cmd: USER SP username CRLF * not necessarily 3 digits) */ | MDTM check_login SP pathname CRLF - = { - if ($2 && $4 != NULL) { + { + if ($2 && $4 != 0) { struct stat stbuf; if (stat((char *) $4, &stbuf) < 0) perror_reply(550, "%s", (char *) $4); @@ -452,31 +503,29 @@ cmd: USER SP username CRLF (char *) $4); } else { register struct tm *t; - struct tm *gmtime(); t = gmtime(&stbuf.st_mtime); reply(213, - "%d%02d%02d%02d%02d%02d", - t->tm_year+1900, t->tm_mon+1, t->tm_mday, + "%04d%02d%02d%02d%02d%02d", + 1900 + t->tm_year, + t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); } } - if ($4 != NULL) + if ($4 != 0) free((char *) $4); } | QUIT CRLF - = { + { reply(221, "Goodbye."); dologout(0); } | error CRLF - = { + { yyerrok; } ; rcmd: RNFR check_login SP pathname CRLF - = { - char *renamefrom(); - + { if ($2 && $4) { fromname = renamefrom((char *) $4); if (fromname == (char *) 0 && $4) { @@ -485,13 +534,13 @@ rcmd: RNFR check_login SP pathname CRLF } } ; - + username: STRING ; password: /* empty */ - = { - *(char **)&($$) = ""; + { + *(const char **)(&($$)) = ""; } | STRING ; @@ -499,9 +548,9 @@ password: /* empty */ byte_size: NUMBER ; -host_port: NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA +host_port: NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER - = { + { register char *a, *p; a = (char *)&data_dest.sin_addr; @@ -513,91 +562,91 @@ host_port: NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA ; form_code: N - = { + { $$ = FORM_N; } | T - = { + { $$ = FORM_T; } | C - = { + { $$ = FORM_C; } ; type_code: A - = { + { cmd_type = TYPE_A; cmd_form = FORM_N; } | A SP form_code - = { + { cmd_type = TYPE_A; cmd_form = $3; } | E - = { + { cmd_type = TYPE_E; cmd_form = FORM_N; } | E SP form_code - = { + { cmd_type = TYPE_E; cmd_form = $3; } | I - = { + { cmd_type = TYPE_I; } | L - = { + { cmd_type = TYPE_L; cmd_bytesz = NBBY; } | L SP byte_size - = { + { cmd_type = TYPE_L; cmd_bytesz = $3; } /* this is for a bug in the BBN ftp */ | L byte_size - = { + { cmd_type = TYPE_L; cmd_bytesz = $2; } ; struct_code: F - = { + { $$ = STRU_F; } | R - = { + { $$ = STRU_R; } | P - = { + { $$ = STRU_P; } ; mode_code: S - = { + { $$ = MODE_S; } | B - = { + { $$ = MODE_B; } | C - = { + { $$ = MODE_C; } ; pathname: pathstring - = { + { /* * Problem: this production is used for all pathname * processing, but only gives a 550 error reply. @@ -605,9 +654,9 @@ pathname: pathstring */ if (logged_in && $1 && strncmp((char *) $1, "~", 1) == 0) { *(char **)&($$) = *glob((char *) $1); - if (globerr != NULL) { + if (globerr != 0) { reply(550, globerr); - $$ = NULL; + $$ = 0; } free((char *) $1); } else @@ -619,7 +668,7 @@ pathstring: STRING ; octal_number: NUMBER - = { + { register int ret, dec, multby, digit; /* @@ -644,7 +693,7 @@ octal_number: NUMBER ; check_login: /* empty */ - = { + { if (logged_in) $$ = 1; else { @@ -656,8 +705,14 @@ check_login: /* empty */ %% +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + extern jmp_buf errcatch; +static void upper(char *); + #define CMD 0 /* beginning of command */ #define ARGS 1 /* expect miscellaneous arguments */ #define STR1 2 /* expect SP followed by STRING */ @@ -668,14 +723,6 @@ extern jmp_buf errcatch; #define SITECMD 7 /* SITE command */ #define NSTR 8 /* Number followed by a string */ -struct tab { - char *name; - short token; - short state; - short implemented; /* 1 if command is implemented */ - char *help; -}; - struct tab cmdtab[] = { /* In order defined in RFC 765 */ { "USER", USER, STR1, 1, " username" }, { "PASS", PASS, ZSTR1, 1, " password" }, @@ -724,7 +771,7 @@ struct tab cmdtab[] = { /* In order defined in RFC 765 */ { "STOU", STOU, STR1, 1, " file-name" }, { "SIZE", SIZE, OSTR, 1, " path-name" }, { "MDTM", MDTM, OSTR, 1, " path-name" }, - { NULL, 0, 0, 0, 0 } + { 0, 0, 0, 0, 0 } }; struct tab sitetab[] = { @@ -732,16 +779,14 @@ struct tab sitetab[] = { { "IDLE", IDLE, ARGS, 1, "[ maximum-idle-time ]" }, { "CHMOD", CHMOD, NSTR, 1, " mode file-name" }, { "HELP", HELP, OSTR, 1, "[ ]" }, - { NULL, 0, 0, 0, 0 } + { 0, 0, 0, 0, 0 } }; -struct tab * -lookup(p, cmd) - register struct tab *p; - char *cmd; +static struct tab * +lookup(struct tab *p, char *cmd) { - for (; p->name != NULL; p++) + for (; p->name != 0; p++) if (strcmp(cmd, p->name) == 0) return (p); return (0); @@ -750,14 +795,12 @@ lookup(p, cmd) #include /* - * getline - a hacked up version of fgets to ignore TELNET escape codes. + * get_line - a hacked up version of fgets to ignore TELNET escape codes. */ -char * -getline(s, n, iop) - char *s; - register FILE *iop; +static char * +get_line(char *s, int n, FILE *iop) { - register c; + register int c; register char *cs; cs = s; @@ -765,7 +808,7 @@ getline(s, n, iop) for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) { *cs++ = tmpline[c]; if (tmpline[c] == '\n') { - *cs++ = '\0'; + *cs = '\0'; if (debug) syslog(LOG_DEBUG, "command: %s", s); tmpline[0] = '\0'; @@ -804,20 +847,19 @@ getline(s, n, iop) break; } if (c == EOF && cs == s) - return (NULL); - *cs++ = '\0'; + return (0); + *cs = '\0'; if (debug) syslog(LOG_DEBUG, "command: %s", s); return (s); } -static int -toolong() +static void +toolong(int sig) { time_t now; - extern char *ctime(); - extern time_t time(); + (void) sig; reply(421, "Timeout (%d seconds): closing control connection.", timeout); (void) time(&now); @@ -829,14 +871,14 @@ toolong() dologout(1); } -yylex() +int +yylex(void) { static int cpos, state; register char *cp, *cp2; register struct tab *p; int n; - char c, *strpbrk(); - char *copy(); + char c; for (;;) { switch (state) { @@ -844,16 +886,16 @@ yylex() case CMD: (void) signal(SIGALRM, toolong); (void) alarm((unsigned) timeout); - if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) { + if (get_line(cbuf, sizeof(cbuf)-1, stdin) == 0) { reply(221, "You could at least say goodbye."); dologout(0); } (void) alarm(0); #ifdef SETPROCTITLE - if (strncasecmp(cbuf, "PASS", 4) != NULL) + if (strncasecmp(cbuf, "PASS", 4) != 0) setproctitle("%s: %s", proctitle, cbuf); #endif /* SETPROCTITLE */ - if ((cp = index(cbuf, '\r'))) { + if ((cp = strchr(cbuf, '\r'))) { *cp++ = '\n'; *cp = '\0'; } @@ -873,7 +915,7 @@ yylex() /* NOTREACHED */ } state = p->state; - *(char **)&yylval = p->name; + *(const char **)(&yylval) = p->name; return (p->token); } break; @@ -899,7 +941,7 @@ yylex() /* NOTREACHED */ } state = p->state; - *(char **)&yylval = p->name; + *(const char **)(&yylval) = p->name; return (p->token); } state = CMD; @@ -917,7 +959,10 @@ yylex() dostr1: if (cbuf[cpos] == ' ') { cpos++; - state = state == OSTR ? STR2 : ++state; + if (state == OSTR) + state = STR2; + else + ++state; return (SP); } break; @@ -1047,8 +1092,8 @@ yylex() } } -upper(s) - register char *s; +static void +upper(char *s) { while (*s != '\0') { if (islower(*s)) @@ -1057,34 +1102,32 @@ upper(s) } } -char * -copy(s) - char *s; +static char * +copy(const char *s) { char *p; - extern char *malloc(), *strcpy(); - p = malloc((unsigned) strlen(s) + 1); - if (p == NULL) + p = (char * )malloc(strlen(s) + 1); + if (p == 0) fatal("Ran out of memory."); - (void) strcpy(p, s); + else + (void) strcpy(p, s); return (p); } -help(ctab, s) - struct tab *ctab; - char *s; +static void +help(struct tab *ctab, char *s) { register struct tab *c; register int width, NCMDS; - char *type; + const char *help_type; if (ctab == sitetab) - type = "SITE "; + help_type = "SITE "; else - type = ""; + help_type = ""; width = 0, NCMDS = 0; - for (c = ctab; c->name != NULL; c++) { + for (c = ctab; c->name != 0; c++) { int len = strlen(c->name); if (len > width) @@ -1097,7 +1140,7 @@ help(ctab, s) int columns, lines; lreply(214, "The following %scommands are recognized %s.", - type, "(* =>'s unimplemented)"); + help_type, "(* =>'s unimplemented)"); columns = 76 / width; if (columns == 0) columns = 1; @@ -1106,6 +1149,7 @@ help(ctab, s) printf(" "); for (j = 0; j < columns; j++) { c = ctab + j * lines + i; + assert(c->name != 0); printf("%s%c", c->name, c->implemented ? ' ' : '*'); if (c + lines >= &ctab[NCMDS]) @@ -1129,14 +1173,14 @@ help(ctab, s) return; } if (c->implemented) - reply(214, "Syntax: %s%s %s", type, c->name, c->help); + reply(214, "Syntax: %s%s %s", help_type, c->name, c->help); else - reply(214, "%s%-*s\t%s; unimplemented.", type, width, + reply(214, "%s%-*s\t%s; unimplemented.", help_type, width, c->name, c->help); } -sizecmd(filename) -char *filename; +static void +sizecmd(char *filename) { switch (type) { case TYPE_L: @@ -1146,14 +1190,18 @@ char *filename; (stbuf.st_mode&S_IFMT) != S_IFREG) reply(550, "%s: not a plain file.", filename); else +#ifdef HAVE_LONG_LONG + reply(213, "%llu", (long long) stbuf.st_size); +#else reply(213, "%lu", stbuf.st_size); +#endif break;} case TYPE_A: { FILE *fin; register int c, count; struct stat stbuf; fin = fopen(filename, "r"); - if (fin == NULL) { + if (fin == 0) { perror_reply(550, filename); return; } diff --git a/contrib/byacc/test/grammar.output b/contrib/byacc/test/grammar.output new file mode 100644 index 00000000000..6351322345b --- /dev/null +++ b/contrib/byacc/test/grammar.output @@ -0,0 +1,2214 @@ + 0 $accept : program $end + + 1 program : + 2 | translation_unit + + 3 translation_unit : external_declaration + 4 | translation_unit external_declaration + + 5 external_declaration : declaration + 6 | function_definition + 7 | ';' + 8 | linkage_specification + 9 | T_ASM T_ASMARG ';' + 10 | error T_MATCHRBRACE + 11 | error ';' + + 12 braces : T_LBRACE T_MATCHRBRACE + + 13 linkage_specification : T_EXTERN T_STRING_LITERAL braces + 14 | T_EXTERN T_STRING_LITERAL declaration + + 15 declaration : decl_specifiers ';' + 16 | decl_specifiers init_declarator_list ';' + + 17 $$1 : + + 18 declaration : any_typedef decl_specifiers $$1 opt_declarator_list ';' + + 19 any_typedef : T_EXTENSION T_TYPEDEF + 20 | T_TYPEDEF + + 21 opt_declarator_list : + 22 | declarator_list + + 23 declarator_list : declarator + 24 | declarator_list ',' declarator + + 25 $$2 : + + 26 $$3 : + + 27 function_definition : decl_specifiers declarator $$2 opt_declaration_list T_LBRACE $$3 T_MATCHRBRACE + + 28 $$4 : + + 29 function_definition : declarator $$4 opt_declaration_list T_LBRACE T_MATCHRBRACE + + 30 opt_declaration_list : + 31 | T_VA_DCL + 32 | declaration_list + + 33 declaration_list : declaration + 34 | declaration_list declaration + + 35 decl_specifiers : decl_specifier + 36 | decl_specifiers decl_specifier + + 37 decl_specifier : storage_class + 38 | type_specifier + 39 | type_qualifier + + 40 storage_class : T_AUTO + 41 | T_EXTERN + 42 | T_REGISTER + 43 | T_STATIC + 44 | T_INLINE + 45 | T_EXTENSION + + 46 type_specifier : T_CHAR + 47 | T_DOUBLE + 48 | T_FLOAT + 49 | T_INT + 50 | T_LONG + 51 | T_SHORT + 52 | T_SIGNED + 53 | T_UNSIGNED + 54 | T_VOID + 55 | T_Bool + 56 | T_Complex + 57 | T_Imaginary + 58 | T_TYPEDEF_NAME + 59 | struct_or_union_specifier + 60 | enum_specifier + + 61 type_qualifier : T_TYPE_QUALIFIER + 62 | T_DEFINE_NAME + + 63 struct_or_union_specifier : struct_or_union any_id braces + 64 | struct_or_union braces + 65 | struct_or_union any_id + + 66 struct_or_union : T_STRUCT + 67 | T_UNION + + 68 init_declarator_list : init_declarator + 69 | init_declarator_list ',' init_declarator + + 70 init_declarator : declarator + + 71 $$5 : + + 72 init_declarator : declarator '=' $$5 T_INITIALIZER + + 73 enum_specifier : enumeration any_id braces + 74 | enumeration braces + 75 | enumeration any_id + + 76 enumeration : T_ENUM + + 77 any_id : T_IDENTIFIER + 78 | T_TYPEDEF_NAME + + 79 declarator : pointer direct_declarator + 80 | direct_declarator + + 81 direct_declarator : identifier_or_ref + 82 | '(' declarator ')' + 83 | direct_declarator T_BRACKETS + 84 | direct_declarator '(' parameter_type_list ')' + 85 | direct_declarator '(' opt_identifier_list ')' + + 86 pointer : '*' opt_type_qualifiers + 87 | '*' opt_type_qualifiers pointer + + 88 opt_type_qualifiers : + 89 | type_qualifier_list + + 90 type_qualifier_list : type_qualifier + 91 | type_qualifier_list type_qualifier + + 92 parameter_type_list : parameter_list + 93 | parameter_list ',' T_ELLIPSIS + + 94 parameter_list : parameter_declaration + 95 | parameter_list ',' parameter_declaration + + 96 parameter_declaration : decl_specifiers declarator + 97 | decl_specifiers abs_declarator + 98 | decl_specifiers + + 99 opt_identifier_list : + 100 | identifier_list + + 101 identifier_list : any_id + 102 | identifier_list ',' any_id + + 103 identifier_or_ref : any_id + 104 | '&' any_id + + 105 abs_declarator : pointer + 106 | pointer direct_abs_declarator + 107 | direct_abs_declarator + + 108 direct_abs_declarator : '(' abs_declarator ')' + 109 | direct_abs_declarator T_BRACKETS + 110 | T_BRACKETS + 111 | direct_abs_declarator '(' parameter_type_list ')' + 112 | direct_abs_declarator '(' ')' + 113 | '(' parameter_type_list ')' + 114 | '(' ')' + +state 0 + $accept : . program $end (0) + program : . (1) + + error shift 1 + '(' shift 2 + '*' shift 3 + '&' shift 4 + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 6 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 9 + T_REGISTER shift 10 + T_STATIC shift 11 + T_TYPEDEF shift 12 + T_INLINE shift 13 + T_EXTENSION shift 14 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + T_ASM shift 31 + ';' shift 32 + $end reduce 1 + + program goto 33 + decl_specifiers goto 34 + decl_specifier goto 35 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + declarator goto 41 + direct_declarator goto 42 + struct_or_union goto 43 + pointer goto 44 + any_id goto 45 + identifier_or_ref goto 46 + enumeration goto 47 + translation_unit goto 48 + external_declaration goto 49 + declaration goto 50 + function_definition goto 51 + linkage_specification goto 52 + any_typedef goto 53 + + +state 1 + external_declaration : error . T_MATCHRBRACE (10) + external_declaration : error . ';' (11) + + T_MATCHRBRACE shift 54 + ';' shift 55 + . error + + +state 2 + direct_declarator : '(' . declarator ')' (82) + + '(' shift 2 + '*' shift 3 + '&' shift 4 + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 56 + . error + + declarator goto 57 + direct_declarator goto 42 + pointer goto 44 + any_id goto 45 + identifier_or_ref goto 46 + + +state 3 + pointer : '*' . opt_type_qualifiers (86) + pointer : '*' . opt_type_qualifiers pointer (87) + opt_type_qualifiers : . (88) + + T_DEFINE_NAME shift 7 + T_TYPE_QUALIFIER shift 30 + '(' reduce 88 + '*' reduce 88 + '&' reduce 88 + T_IDENTIFIER reduce 88 + T_TYPEDEF_NAME reduce 88 + T_BRACKETS reduce 88 + ',' reduce 88 + ')' reduce 88 + + type_qualifier goto 58 + opt_type_qualifiers goto 59 + type_qualifier_list goto 60 + + +state 4 + identifier_or_ref : '&' . any_id (104) + + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 56 + . error + + any_id goto 61 + + +state 5 + any_id : T_IDENTIFIER . (77) + + . reduce 77 + + +6: reduce/reduce conflict (reduce 58, reduce 78) on '(' +6: reduce/reduce conflict (reduce 58, reduce 78) on T_TYPEDEF_NAME +6: reduce/reduce conflict (reduce 58, reduce 78) on T_DEFINE_NAME +6: reduce/reduce conflict (reduce 58, reduce 78) on T_AUTO +6: reduce/reduce conflict (reduce 58, reduce 78) on T_EXTERN +6: reduce/reduce conflict (reduce 58, reduce 78) on T_REGISTER +6: reduce/reduce conflict (reduce 58, reduce 78) on T_STATIC +6: reduce/reduce conflict (reduce 58, reduce 78) on T_INLINE +6: reduce/reduce conflict (reduce 58, reduce 78) on T_EXTENSION +6: reduce/reduce conflict (reduce 58, reduce 78) on T_CHAR +6: reduce/reduce conflict (reduce 58, reduce 78) on T_DOUBLE +6: reduce/reduce conflict (reduce 58, reduce 78) on T_FLOAT +6: reduce/reduce conflict (reduce 58, reduce 78) on T_INT +6: reduce/reduce conflict (reduce 58, reduce 78) on T_VOID +6: reduce/reduce conflict (reduce 58, reduce 78) on T_LONG +6: reduce/reduce conflict (reduce 58, reduce 78) on T_SHORT +6: reduce/reduce conflict (reduce 58, reduce 78) on T_SIGNED +6: reduce/reduce conflict (reduce 58, reduce 78) on T_UNSIGNED +6: reduce/reduce conflict (reduce 58, reduce 78) on T_ENUM +6: reduce/reduce conflict (reduce 58, reduce 78) on T_STRUCT +6: reduce/reduce conflict (reduce 58, reduce 78) on T_UNION +6: reduce/reduce conflict (reduce 58, reduce 78) on T_Bool +6: reduce/reduce conflict (reduce 58, reduce 78) on T_Complex +6: reduce/reduce conflict (reduce 58, reduce 78) on T_Imaginary +6: reduce/reduce conflict (reduce 58, reduce 78) on T_TYPE_QUALIFIER +6: reduce/reduce conflict (reduce 58, reduce 78) on T_BRACKETS +6: reduce/reduce conflict (reduce 58, reduce 78) on ';' +6: reduce/reduce conflict (reduce 58, reduce 78) on ',' +6: reduce/reduce conflict (reduce 58, reduce 78) on ')' +state 6 + type_specifier : T_TYPEDEF_NAME . (58) + any_id : T_TYPEDEF_NAME . (78) + + '(' reduce 58 + '*' reduce 58 + '&' reduce 58 + T_IDENTIFIER reduce 58 + T_TYPEDEF_NAME reduce 58 + T_DEFINE_NAME reduce 58 + T_AUTO reduce 58 + T_EXTERN reduce 58 + T_REGISTER reduce 58 + T_STATIC reduce 58 + T_TYPEDEF reduce 78 + T_INLINE reduce 58 + T_EXTENSION reduce 58 + T_CHAR reduce 58 + T_DOUBLE reduce 58 + T_FLOAT reduce 58 + T_INT reduce 58 + T_VOID reduce 58 + T_LONG reduce 58 + T_SHORT reduce 58 + T_SIGNED reduce 58 + T_UNSIGNED reduce 58 + T_ENUM reduce 58 + T_STRUCT reduce 58 + T_UNION reduce 58 + T_Bool reduce 58 + T_Complex reduce 58 + T_Imaginary reduce 58 + T_TYPE_QUALIFIER reduce 58 + T_BRACKETS reduce 58 + T_LBRACE reduce 78 + T_VA_DCL reduce 78 + ';' reduce 58 + ',' reduce 58 + '=' reduce 78 + ')' reduce 58 + + +state 7 + type_qualifier : T_DEFINE_NAME . (62) + + . reduce 62 + + +state 8 + storage_class : T_AUTO . (40) + + . reduce 40 + + +state 9 + linkage_specification : T_EXTERN . T_STRING_LITERAL braces (13) + linkage_specification : T_EXTERN . T_STRING_LITERAL declaration (14) + storage_class : T_EXTERN . (41) + + T_STRING_LITERAL shift 62 + '(' reduce 41 + '*' reduce 41 + '&' reduce 41 + T_IDENTIFIER reduce 41 + T_TYPEDEF_NAME reduce 41 + T_DEFINE_NAME reduce 41 + T_AUTO reduce 41 + T_EXTERN reduce 41 + T_REGISTER reduce 41 + T_STATIC reduce 41 + T_INLINE reduce 41 + T_EXTENSION reduce 41 + T_CHAR reduce 41 + T_DOUBLE reduce 41 + T_FLOAT reduce 41 + T_INT reduce 41 + T_VOID reduce 41 + T_LONG reduce 41 + T_SHORT reduce 41 + T_SIGNED reduce 41 + T_UNSIGNED reduce 41 + T_ENUM reduce 41 + T_STRUCT reduce 41 + T_UNION reduce 41 + T_Bool reduce 41 + T_Complex reduce 41 + T_Imaginary reduce 41 + T_TYPE_QUALIFIER reduce 41 + ';' reduce 41 + + +state 10 + storage_class : T_REGISTER . (42) + + . reduce 42 + + +state 11 + storage_class : T_STATIC . (43) + + . reduce 43 + + +state 12 + any_typedef : T_TYPEDEF . (20) + + . reduce 20 + + +state 13 + storage_class : T_INLINE . (44) + + . reduce 44 + + +state 14 + any_typedef : T_EXTENSION . T_TYPEDEF (19) + storage_class : T_EXTENSION . (45) + + T_TYPEDEF shift 63 + '(' reduce 45 + '*' reduce 45 + '&' reduce 45 + T_IDENTIFIER reduce 45 + T_TYPEDEF_NAME reduce 45 + T_DEFINE_NAME reduce 45 + T_AUTO reduce 45 + T_EXTERN reduce 45 + T_REGISTER reduce 45 + T_STATIC reduce 45 + T_INLINE reduce 45 + T_EXTENSION reduce 45 + T_CHAR reduce 45 + T_DOUBLE reduce 45 + T_FLOAT reduce 45 + T_INT reduce 45 + T_VOID reduce 45 + T_LONG reduce 45 + T_SHORT reduce 45 + T_SIGNED reduce 45 + T_UNSIGNED reduce 45 + T_ENUM reduce 45 + T_STRUCT reduce 45 + T_UNION reduce 45 + T_Bool reduce 45 + T_Complex reduce 45 + T_Imaginary reduce 45 + T_TYPE_QUALIFIER reduce 45 + ';' reduce 45 + + +state 15 + type_specifier : T_CHAR . (46) + + . reduce 46 + + +state 16 + type_specifier : T_DOUBLE . (47) + + . reduce 47 + + +state 17 + type_specifier : T_FLOAT . (48) + + . reduce 48 + + +state 18 + type_specifier : T_INT . (49) + + . reduce 49 + + +state 19 + type_specifier : T_VOID . (54) + + . reduce 54 + + +state 20 + type_specifier : T_LONG . (50) + + . reduce 50 + + +state 21 + type_specifier : T_SHORT . (51) + + . reduce 51 + + +state 22 + type_specifier : T_SIGNED . (52) + + . reduce 52 + + +state 23 + type_specifier : T_UNSIGNED . (53) + + . reduce 53 + + +state 24 + enumeration : T_ENUM . (76) + + . reduce 76 + + +state 25 + struct_or_union : T_STRUCT . (66) + + . reduce 66 + + +state 26 + struct_or_union : T_UNION . (67) + + . reduce 67 + + +state 27 + type_specifier : T_Bool . (55) + + . reduce 55 + + +state 28 + type_specifier : T_Complex . (56) + + . reduce 56 + + +state 29 + type_specifier : T_Imaginary . (57) + + . reduce 57 + + +state 30 + type_qualifier : T_TYPE_QUALIFIER . (61) + + . reduce 61 + + +state 31 + external_declaration : T_ASM . T_ASMARG ';' (9) + + T_ASMARG shift 64 + . error + + +state 32 + external_declaration : ';' . (7) + + . reduce 7 + + +state 33 + $accept : program . $end (0) + + $end accept + + +state 34 + declaration : decl_specifiers . ';' (15) + declaration : decl_specifiers . init_declarator_list ';' (16) + function_definition : decl_specifiers . declarator $$2 opt_declaration_list T_LBRACE $$3 T_MATCHRBRACE (27) + decl_specifiers : decl_specifiers . decl_specifier (36) + + '(' shift 2 + '*' shift 3 + '&' shift 4 + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 6 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_INLINE shift 13 + T_EXTENSION shift 66 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + ';' shift 67 + . error + + decl_specifier goto 68 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + init_declarator_list goto 69 + init_declarator goto 70 + declarator goto 71 + direct_declarator goto 42 + struct_or_union goto 43 + pointer goto 44 + any_id goto 45 + identifier_or_ref goto 46 + enumeration goto 47 + + +state 35 + decl_specifiers : decl_specifier . (35) + + . reduce 35 + + +state 36 + decl_specifier : storage_class . (37) + + . reduce 37 + + +state 37 + decl_specifier : type_specifier . (38) + + . reduce 38 + + +state 38 + decl_specifier : type_qualifier . (39) + + . reduce 39 + + +state 39 + type_specifier : struct_or_union_specifier . (59) + + . reduce 59 + + +state 40 + type_specifier : enum_specifier . (60) + + . reduce 60 + + +state 41 + function_definition : declarator . $$4 opt_declaration_list T_LBRACE T_MATCHRBRACE (29) + $$4 : . (28) + + . reduce 28 + + $$4 goto 72 + + +state 42 + declarator : direct_declarator . (80) + direct_declarator : direct_declarator . T_BRACKETS (83) + direct_declarator : direct_declarator . '(' parameter_type_list ')' (84) + direct_declarator : direct_declarator . '(' opt_identifier_list ')' (85) + + '(' shift 73 + T_BRACKETS shift 74 + T_TYPEDEF_NAME reduce 80 + T_DEFINE_NAME reduce 80 + T_AUTO reduce 80 + T_EXTERN reduce 80 + T_REGISTER reduce 80 + T_STATIC reduce 80 + T_TYPEDEF reduce 80 + T_INLINE reduce 80 + T_EXTENSION reduce 80 + T_CHAR reduce 80 + T_DOUBLE reduce 80 + T_FLOAT reduce 80 + T_INT reduce 80 + T_VOID reduce 80 + T_LONG reduce 80 + T_SHORT reduce 80 + T_SIGNED reduce 80 + T_UNSIGNED reduce 80 + T_ENUM reduce 80 + T_STRUCT reduce 80 + T_UNION reduce 80 + T_Bool reduce 80 + T_Complex reduce 80 + T_Imaginary reduce 80 + T_TYPE_QUALIFIER reduce 80 + T_LBRACE reduce 80 + T_VA_DCL reduce 80 + ';' reduce 80 + ',' reduce 80 + '=' reduce 80 + ')' reduce 80 + + +state 43 + struct_or_union_specifier : struct_or_union . any_id braces (63) + struct_or_union_specifier : struct_or_union . braces (64) + struct_or_union_specifier : struct_or_union . any_id (65) + + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 56 + T_LBRACE shift 75 + . error + + any_id goto 76 + braces goto 77 + + +state 44 + declarator : pointer . direct_declarator (79) + + '(' shift 2 + '&' shift 4 + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 56 + . error + + direct_declarator goto 78 + any_id goto 45 + identifier_or_ref goto 46 + + +state 45 + identifier_or_ref : any_id . (103) + + . reduce 103 + + +state 46 + direct_declarator : identifier_or_ref . (81) + + . reduce 81 + + +state 47 + enum_specifier : enumeration . any_id braces (73) + enum_specifier : enumeration . braces (74) + enum_specifier : enumeration . any_id (75) + + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 56 + T_LBRACE shift 75 + . error + + any_id goto 79 + braces goto 80 + + +state 48 + program : translation_unit . (2) + translation_unit : translation_unit . external_declaration (4) + + error shift 1 + '(' shift 2 + '*' shift 3 + '&' shift 4 + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 6 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 9 + T_REGISTER shift 10 + T_STATIC shift 11 + T_TYPEDEF shift 12 + T_INLINE shift 13 + T_EXTENSION shift 14 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + T_ASM shift 31 + ';' shift 32 + $end reduce 2 + + decl_specifiers goto 34 + decl_specifier goto 35 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + declarator goto 41 + direct_declarator goto 42 + struct_or_union goto 43 + pointer goto 44 + any_id goto 45 + identifier_or_ref goto 46 + enumeration goto 47 + external_declaration goto 81 + declaration goto 50 + function_definition goto 51 + linkage_specification goto 52 + any_typedef goto 53 + + +state 49 + translation_unit : external_declaration . (3) + + . reduce 3 + + +state 50 + external_declaration : declaration . (5) + + . reduce 5 + + +state 51 + external_declaration : function_definition . (6) + + . reduce 6 + + +state 52 + external_declaration : linkage_specification . (8) + + . reduce 8 + + +state 53 + declaration : any_typedef . decl_specifiers $$1 opt_declarator_list ';' (18) + + T_TYPEDEF_NAME shift 82 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_INLINE shift 13 + T_EXTENSION shift 66 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + . error + + decl_specifiers goto 83 + decl_specifier goto 35 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + struct_or_union goto 43 + enumeration goto 47 + + +state 54 + external_declaration : error T_MATCHRBRACE . (10) + + . reduce 10 + + +state 55 + external_declaration : error ';' . (11) + + . reduce 11 + + +state 56 + any_id : T_TYPEDEF_NAME . (78) + + . reduce 78 + + +state 57 + direct_declarator : '(' declarator . ')' (82) + + ')' shift 84 + . error + + +state 58 + type_qualifier_list : type_qualifier . (90) + + . reduce 90 + + +state 59 + pointer : '*' opt_type_qualifiers . (86) + pointer : '*' opt_type_qualifiers . pointer (87) + + '*' shift 3 + '(' reduce 86 + '&' reduce 86 + T_IDENTIFIER reduce 86 + T_TYPEDEF_NAME reduce 86 + T_BRACKETS reduce 86 + ',' reduce 86 + ')' reduce 86 + + pointer goto 85 + + +state 60 + opt_type_qualifiers : type_qualifier_list . (89) + type_qualifier_list : type_qualifier_list . type_qualifier (91) + + T_DEFINE_NAME shift 7 + T_TYPE_QUALIFIER shift 30 + '(' reduce 89 + '*' reduce 89 + '&' reduce 89 + T_IDENTIFIER reduce 89 + T_TYPEDEF_NAME reduce 89 + T_BRACKETS reduce 89 + ',' reduce 89 + ')' reduce 89 + + type_qualifier goto 86 + + +state 61 + identifier_or_ref : '&' any_id . (104) + + . reduce 104 + + +state 62 + linkage_specification : T_EXTERN T_STRING_LITERAL . braces (13) + linkage_specification : T_EXTERN T_STRING_LITERAL . declaration (14) + + T_TYPEDEF_NAME shift 82 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_TYPEDEF shift 12 + T_INLINE shift 13 + T_EXTENSION shift 14 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + T_LBRACE shift 75 + . error + + decl_specifiers goto 87 + decl_specifier goto 35 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + struct_or_union goto 43 + enumeration goto 47 + declaration goto 88 + braces goto 89 + any_typedef goto 53 + + +state 63 + any_typedef : T_EXTENSION T_TYPEDEF . (19) + + . reduce 19 + + +state 64 + external_declaration : T_ASM T_ASMARG . ';' (9) + + ';' shift 90 + . error + + +state 65 + storage_class : T_EXTERN . (41) + + . reduce 41 + + +state 66 + storage_class : T_EXTENSION . (45) + + . reduce 45 + + +state 67 + declaration : decl_specifiers ';' . (15) + + . reduce 15 + + +state 68 + decl_specifiers : decl_specifiers decl_specifier . (36) + + . reduce 36 + + +state 69 + declaration : decl_specifiers init_declarator_list . ';' (16) + init_declarator_list : init_declarator_list . ',' init_declarator (69) + + ';' shift 91 + ',' shift 92 + . error + + +state 70 + init_declarator_list : init_declarator . (68) + + . reduce 68 + + +state 71 + function_definition : decl_specifiers declarator . $$2 opt_declaration_list T_LBRACE $$3 T_MATCHRBRACE (27) + init_declarator : declarator . (70) + init_declarator : declarator . '=' $$5 T_INITIALIZER (72) + $$2 : . (25) + + '=' shift 93 + T_TYPEDEF_NAME reduce 25 + T_DEFINE_NAME reduce 25 + T_AUTO reduce 25 + T_EXTERN reduce 25 + T_REGISTER reduce 25 + T_STATIC reduce 25 + T_TYPEDEF reduce 25 + T_INLINE reduce 25 + T_EXTENSION reduce 25 + T_CHAR reduce 25 + T_DOUBLE reduce 25 + T_FLOAT reduce 25 + T_INT reduce 25 + T_VOID reduce 25 + T_LONG reduce 25 + T_SHORT reduce 25 + T_SIGNED reduce 25 + T_UNSIGNED reduce 25 + T_ENUM reduce 25 + T_STRUCT reduce 25 + T_UNION reduce 25 + T_Bool reduce 25 + T_Complex reduce 25 + T_Imaginary reduce 25 + T_TYPE_QUALIFIER reduce 25 + T_LBRACE reduce 25 + T_VA_DCL reduce 25 + ';' reduce 70 + ',' reduce 70 + + $$2 goto 94 + + +state 72 + function_definition : declarator $$4 . opt_declaration_list T_LBRACE T_MATCHRBRACE (29) + opt_declaration_list : . (30) + + T_TYPEDEF_NAME shift 82 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_TYPEDEF shift 12 + T_INLINE shift 13 + T_EXTENSION shift 14 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + T_VA_DCL shift 95 + T_LBRACE reduce 30 + + decl_specifiers goto 87 + decl_specifier goto 35 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + struct_or_union goto 43 + enumeration goto 47 + declaration goto 96 + any_typedef goto 53 + opt_declaration_list goto 97 + declaration_list goto 98 + + +state 73 + direct_declarator : direct_declarator '(' . parameter_type_list ')' (84) + direct_declarator : direct_declarator '(' . opt_identifier_list ')' (85) + opt_identifier_list : . (99) + + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 6 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_INLINE shift 13 + T_EXTENSION shift 66 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + ')' reduce 99 + + decl_specifiers goto 99 + decl_specifier goto 35 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + parameter_type_list goto 100 + parameter_list goto 101 + parameter_declaration goto 102 + opt_identifier_list goto 103 + identifier_list goto 104 + struct_or_union goto 43 + any_id goto 105 + enumeration goto 47 + + +state 74 + direct_declarator : direct_declarator T_BRACKETS . (83) + + . reduce 83 + + +state 75 + braces : T_LBRACE . T_MATCHRBRACE (12) + + T_MATCHRBRACE shift 106 + . error + + +state 76 + struct_or_union_specifier : struct_or_union any_id . braces (63) + struct_or_union_specifier : struct_or_union any_id . (65) + + T_LBRACE shift 75 + '(' reduce 65 + '*' reduce 65 + '&' reduce 65 + T_IDENTIFIER reduce 65 + T_TYPEDEF_NAME reduce 65 + T_DEFINE_NAME reduce 65 + T_AUTO reduce 65 + T_EXTERN reduce 65 + T_REGISTER reduce 65 + T_STATIC reduce 65 + T_INLINE reduce 65 + T_EXTENSION reduce 65 + T_CHAR reduce 65 + T_DOUBLE reduce 65 + T_FLOAT reduce 65 + T_INT reduce 65 + T_VOID reduce 65 + T_LONG reduce 65 + T_SHORT reduce 65 + T_SIGNED reduce 65 + T_UNSIGNED reduce 65 + T_ENUM reduce 65 + T_STRUCT reduce 65 + T_UNION reduce 65 + T_Bool reduce 65 + T_Complex reduce 65 + T_Imaginary reduce 65 + T_TYPE_QUALIFIER reduce 65 + T_BRACKETS reduce 65 + ';' reduce 65 + ',' reduce 65 + ')' reduce 65 + + braces goto 107 + + +state 77 + struct_or_union_specifier : struct_or_union braces . (64) + + . reduce 64 + + +state 78 + declarator : pointer direct_declarator . (79) + direct_declarator : direct_declarator . T_BRACKETS (83) + direct_declarator : direct_declarator . '(' parameter_type_list ')' (84) + direct_declarator : direct_declarator . '(' opt_identifier_list ')' (85) + + '(' shift 73 + T_BRACKETS shift 74 + T_TYPEDEF_NAME reduce 79 + T_DEFINE_NAME reduce 79 + T_AUTO reduce 79 + T_EXTERN reduce 79 + T_REGISTER reduce 79 + T_STATIC reduce 79 + T_TYPEDEF reduce 79 + T_INLINE reduce 79 + T_EXTENSION reduce 79 + T_CHAR reduce 79 + T_DOUBLE reduce 79 + T_FLOAT reduce 79 + T_INT reduce 79 + T_VOID reduce 79 + T_LONG reduce 79 + T_SHORT reduce 79 + T_SIGNED reduce 79 + T_UNSIGNED reduce 79 + T_ENUM reduce 79 + T_STRUCT reduce 79 + T_UNION reduce 79 + T_Bool reduce 79 + T_Complex reduce 79 + T_Imaginary reduce 79 + T_TYPE_QUALIFIER reduce 79 + T_LBRACE reduce 79 + T_VA_DCL reduce 79 + ';' reduce 79 + ',' reduce 79 + '=' reduce 79 + ')' reduce 79 + + +state 79 + enum_specifier : enumeration any_id . braces (73) + enum_specifier : enumeration any_id . (75) + + T_LBRACE shift 75 + '(' reduce 75 + '*' reduce 75 + '&' reduce 75 + T_IDENTIFIER reduce 75 + T_TYPEDEF_NAME reduce 75 + T_DEFINE_NAME reduce 75 + T_AUTO reduce 75 + T_EXTERN reduce 75 + T_REGISTER reduce 75 + T_STATIC reduce 75 + T_INLINE reduce 75 + T_EXTENSION reduce 75 + T_CHAR reduce 75 + T_DOUBLE reduce 75 + T_FLOAT reduce 75 + T_INT reduce 75 + T_VOID reduce 75 + T_LONG reduce 75 + T_SHORT reduce 75 + T_SIGNED reduce 75 + T_UNSIGNED reduce 75 + T_ENUM reduce 75 + T_STRUCT reduce 75 + T_UNION reduce 75 + T_Bool reduce 75 + T_Complex reduce 75 + T_Imaginary reduce 75 + T_TYPE_QUALIFIER reduce 75 + T_BRACKETS reduce 75 + ';' reduce 75 + ',' reduce 75 + ')' reduce 75 + + braces goto 108 + + +state 80 + enum_specifier : enumeration braces . (74) + + . reduce 74 + + +state 81 + translation_unit : translation_unit external_declaration . (4) + + . reduce 4 + + +state 82 + type_specifier : T_TYPEDEF_NAME . (58) + + . reduce 58 + + +83: shift/reduce conflict (shift 82, reduce 17) on T_TYPEDEF_NAME +state 83 + declaration : any_typedef decl_specifiers . $$1 opt_declarator_list ';' (18) + decl_specifiers : decl_specifiers . decl_specifier (36) + $$1 : . (17) + + T_TYPEDEF_NAME shift 82 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_INLINE shift 13 + T_EXTENSION shift 66 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + '(' reduce 17 + '*' reduce 17 + '&' reduce 17 + T_IDENTIFIER reduce 17 + ';' reduce 17 + + decl_specifier goto 68 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + struct_or_union goto 43 + enumeration goto 47 + $$1 goto 109 + + +state 84 + direct_declarator : '(' declarator ')' . (82) + + . reduce 82 + + +state 85 + pointer : '*' opt_type_qualifiers pointer . (87) + + . reduce 87 + + +state 86 + type_qualifier_list : type_qualifier_list type_qualifier . (91) + + . reduce 91 + + +state 87 + declaration : decl_specifiers . ';' (15) + declaration : decl_specifiers . init_declarator_list ';' (16) + decl_specifiers : decl_specifiers . decl_specifier (36) + + '(' shift 2 + '*' shift 3 + '&' shift 4 + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 6 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_INLINE shift 13 + T_EXTENSION shift 66 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + ';' shift 67 + . error + + decl_specifier goto 68 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + init_declarator_list goto 69 + init_declarator goto 70 + declarator goto 110 + direct_declarator goto 42 + struct_or_union goto 43 + pointer goto 44 + any_id goto 45 + identifier_or_ref goto 46 + enumeration goto 47 + + +state 88 + linkage_specification : T_EXTERN T_STRING_LITERAL declaration . (14) + + . reduce 14 + + +state 89 + linkage_specification : T_EXTERN T_STRING_LITERAL braces . (13) + + . reduce 13 + + +state 90 + external_declaration : T_ASM T_ASMARG ';' . (9) + + . reduce 9 + + +state 91 + declaration : decl_specifiers init_declarator_list ';' . (16) + + . reduce 16 + + +state 92 + init_declarator_list : init_declarator_list ',' . init_declarator (69) + + '(' shift 2 + '*' shift 3 + '&' shift 4 + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 56 + . error + + init_declarator goto 111 + declarator goto 110 + direct_declarator goto 42 + pointer goto 44 + any_id goto 45 + identifier_or_ref goto 46 + + +state 93 + init_declarator : declarator '=' . $$5 T_INITIALIZER (72) + $$5 : . (71) + + . reduce 71 + + $$5 goto 112 + + +state 94 + function_definition : decl_specifiers declarator $$2 . opt_declaration_list T_LBRACE $$3 T_MATCHRBRACE (27) + opt_declaration_list : . (30) + + T_TYPEDEF_NAME shift 82 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_TYPEDEF shift 12 + T_INLINE shift 13 + T_EXTENSION shift 14 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + T_VA_DCL shift 95 + T_LBRACE reduce 30 + + decl_specifiers goto 87 + decl_specifier goto 35 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + struct_or_union goto 43 + enumeration goto 47 + declaration goto 96 + any_typedef goto 53 + opt_declaration_list goto 113 + declaration_list goto 98 + + +state 95 + opt_declaration_list : T_VA_DCL . (31) + + . reduce 31 + + +state 96 + declaration_list : declaration . (33) + + . reduce 33 + + +state 97 + function_definition : declarator $$4 opt_declaration_list . T_LBRACE T_MATCHRBRACE (29) + + T_LBRACE shift 114 + . error + + +state 98 + opt_declaration_list : declaration_list . (32) + declaration_list : declaration_list . declaration (34) + + T_TYPEDEF_NAME shift 82 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_TYPEDEF shift 12 + T_INLINE shift 13 + T_EXTENSION shift 14 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + T_LBRACE reduce 32 + + decl_specifiers goto 87 + decl_specifier goto 35 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + struct_or_union goto 43 + enumeration goto 47 + declaration goto 115 + any_typedef goto 53 + + +state 99 + decl_specifiers : decl_specifiers . decl_specifier (36) + parameter_declaration : decl_specifiers . declarator (96) + parameter_declaration : decl_specifiers . abs_declarator (97) + parameter_declaration : decl_specifiers . (98) + + '(' shift 116 + '*' shift 3 + '&' shift 4 + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 6 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_INLINE shift 13 + T_EXTENSION shift 66 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + T_BRACKETS shift 117 + ',' reduce 98 + ')' reduce 98 + + decl_specifier goto 68 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + declarator goto 118 + direct_declarator goto 42 + abs_declarator goto 119 + direct_abs_declarator goto 120 + struct_or_union goto 43 + pointer goto 121 + any_id goto 45 + identifier_or_ref goto 46 + enumeration goto 47 + + +state 100 + direct_declarator : direct_declarator '(' parameter_type_list . ')' (84) + + ')' shift 122 + . error + + +state 101 + parameter_type_list : parameter_list . (92) + parameter_type_list : parameter_list . ',' T_ELLIPSIS (93) + parameter_list : parameter_list . ',' parameter_declaration (95) + + ',' shift 123 + ')' reduce 92 + + +state 102 + parameter_list : parameter_declaration . (94) + + . reduce 94 + + +state 103 + direct_declarator : direct_declarator '(' opt_identifier_list . ')' (85) + + ')' shift 124 + . error + + +state 104 + opt_identifier_list : identifier_list . (100) + identifier_list : identifier_list . ',' any_id (102) + + ',' shift 125 + ')' reduce 100 + + +state 105 + identifier_list : any_id . (101) + + . reduce 101 + + +state 106 + braces : T_LBRACE T_MATCHRBRACE . (12) + + . reduce 12 + + +state 107 + struct_or_union_specifier : struct_or_union any_id braces . (63) + + . reduce 63 + + +state 108 + enum_specifier : enumeration any_id braces . (73) + + . reduce 73 + + +state 109 + declaration : any_typedef decl_specifiers $$1 . opt_declarator_list ';' (18) + opt_declarator_list : . (21) + + '(' shift 2 + '*' shift 3 + '&' shift 4 + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 56 + ';' reduce 21 + + declarator goto 126 + direct_declarator goto 42 + pointer goto 44 + any_id goto 45 + identifier_or_ref goto 46 + opt_declarator_list goto 127 + declarator_list goto 128 + + +state 110 + init_declarator : declarator . (70) + init_declarator : declarator . '=' $$5 T_INITIALIZER (72) + + '=' shift 93 + ';' reduce 70 + ',' reduce 70 + + +state 111 + init_declarator_list : init_declarator_list ',' init_declarator . (69) + + . reduce 69 + + +state 112 + init_declarator : declarator '=' $$5 . T_INITIALIZER (72) + + T_INITIALIZER shift 129 + . error + + +state 113 + function_definition : decl_specifiers declarator $$2 opt_declaration_list . T_LBRACE $$3 T_MATCHRBRACE (27) + + T_LBRACE shift 130 + . error + + +state 114 + function_definition : declarator $$4 opt_declaration_list T_LBRACE . T_MATCHRBRACE (29) + + T_MATCHRBRACE shift 131 + . error + + +state 115 + declaration_list : declaration_list declaration . (34) + + . reduce 34 + + +state 116 + direct_declarator : '(' . declarator ')' (82) + direct_abs_declarator : '(' . abs_declarator ')' (108) + direct_abs_declarator : '(' . parameter_type_list ')' (113) + direct_abs_declarator : '(' . ')' (114) + + '(' shift 116 + '*' shift 3 + '&' shift 4 + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 6 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_INLINE shift 13 + T_EXTENSION shift 66 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + T_BRACKETS shift 117 + ')' shift 132 + . error + + decl_specifiers goto 99 + decl_specifier goto 35 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + declarator goto 57 + direct_declarator goto 42 + abs_declarator goto 133 + direct_abs_declarator goto 120 + parameter_type_list goto 134 + parameter_list goto 101 + parameter_declaration goto 102 + struct_or_union goto 43 + pointer goto 121 + any_id goto 45 + identifier_or_ref goto 46 + enumeration goto 47 + + +state 117 + direct_abs_declarator : T_BRACKETS . (110) + + . reduce 110 + + +state 118 + parameter_declaration : decl_specifiers declarator . (96) + + . reduce 96 + + +state 119 + parameter_declaration : decl_specifiers abs_declarator . (97) + + . reduce 97 + + +state 120 + abs_declarator : direct_abs_declarator . (107) + direct_abs_declarator : direct_abs_declarator . T_BRACKETS (109) + direct_abs_declarator : direct_abs_declarator . '(' parameter_type_list ')' (111) + direct_abs_declarator : direct_abs_declarator . '(' ')' (112) + + '(' shift 135 + T_BRACKETS shift 136 + ',' reduce 107 + ')' reduce 107 + + +state 121 + declarator : pointer . direct_declarator (79) + abs_declarator : pointer . (105) + abs_declarator : pointer . direct_abs_declarator (106) + + '(' shift 116 + '&' shift 4 + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 56 + T_BRACKETS shift 117 + ',' reduce 105 + ')' reduce 105 + + direct_declarator goto 78 + direct_abs_declarator goto 137 + any_id goto 45 + identifier_or_ref goto 46 + + +state 122 + direct_declarator : direct_declarator '(' parameter_type_list ')' . (84) + + . reduce 84 + + +state 123 + parameter_type_list : parameter_list ',' . T_ELLIPSIS (93) + parameter_list : parameter_list ',' . parameter_declaration (95) + + T_TYPEDEF_NAME shift 82 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_INLINE shift 13 + T_EXTENSION shift 66 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + T_ELLIPSIS shift 138 + . error + + decl_specifiers goto 99 + decl_specifier goto 35 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + parameter_declaration goto 139 + struct_or_union goto 43 + enumeration goto 47 + + +state 124 + direct_declarator : direct_declarator '(' opt_identifier_list ')' . (85) + + . reduce 85 + + +state 125 + identifier_list : identifier_list ',' . any_id (102) + + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 56 + . error + + any_id goto 140 + + +state 126 + declarator_list : declarator . (23) + + . reduce 23 + + +state 127 + declaration : any_typedef decl_specifiers $$1 opt_declarator_list . ';' (18) + + ';' shift 141 + . error + + +state 128 + opt_declarator_list : declarator_list . (22) + declarator_list : declarator_list . ',' declarator (24) + + ',' shift 142 + ';' reduce 22 + + +state 129 + init_declarator : declarator '=' $$5 T_INITIALIZER . (72) + + . reduce 72 + + +state 130 + function_definition : decl_specifiers declarator $$2 opt_declaration_list T_LBRACE . $$3 T_MATCHRBRACE (27) + $$3 : . (26) + + . reduce 26 + + $$3 goto 143 + + +state 131 + function_definition : declarator $$4 opt_declaration_list T_LBRACE T_MATCHRBRACE . (29) + + . reduce 29 + + +state 132 + direct_abs_declarator : '(' ')' . (114) + + . reduce 114 + + +state 133 + direct_abs_declarator : '(' abs_declarator . ')' (108) + + ')' shift 144 + . error + + +state 134 + direct_abs_declarator : '(' parameter_type_list . ')' (113) + + ')' shift 145 + . error + + +state 135 + direct_abs_declarator : direct_abs_declarator '(' . parameter_type_list ')' (111) + direct_abs_declarator : direct_abs_declarator '(' . ')' (112) + + T_TYPEDEF_NAME shift 82 + T_DEFINE_NAME shift 7 + T_AUTO shift 8 + T_EXTERN shift 65 + T_REGISTER shift 10 + T_STATIC shift 11 + T_INLINE shift 13 + T_EXTENSION shift 66 + T_CHAR shift 15 + T_DOUBLE shift 16 + T_FLOAT shift 17 + T_INT shift 18 + T_VOID shift 19 + T_LONG shift 20 + T_SHORT shift 21 + T_SIGNED shift 22 + T_UNSIGNED shift 23 + T_ENUM shift 24 + T_STRUCT shift 25 + T_UNION shift 26 + T_Bool shift 27 + T_Complex shift 28 + T_Imaginary shift 29 + T_TYPE_QUALIFIER shift 30 + ')' shift 146 + . error + + decl_specifiers goto 99 + decl_specifier goto 35 + storage_class goto 36 + type_specifier goto 37 + type_qualifier goto 38 + struct_or_union_specifier goto 39 + enum_specifier goto 40 + parameter_type_list goto 147 + parameter_list goto 101 + parameter_declaration goto 102 + struct_or_union goto 43 + enumeration goto 47 + + +state 136 + direct_abs_declarator : direct_abs_declarator T_BRACKETS . (109) + + . reduce 109 + + +state 137 + abs_declarator : pointer direct_abs_declarator . (106) + direct_abs_declarator : direct_abs_declarator . T_BRACKETS (109) + direct_abs_declarator : direct_abs_declarator . '(' parameter_type_list ')' (111) + direct_abs_declarator : direct_abs_declarator . '(' ')' (112) + + '(' shift 135 + T_BRACKETS shift 136 + ',' reduce 106 + ')' reduce 106 + + +state 138 + parameter_type_list : parameter_list ',' T_ELLIPSIS . (93) + + . reduce 93 + + +state 139 + parameter_list : parameter_list ',' parameter_declaration . (95) + + . reduce 95 + + +state 140 + identifier_list : identifier_list ',' any_id . (102) + + . reduce 102 + + +state 141 + declaration : any_typedef decl_specifiers $$1 opt_declarator_list ';' . (18) + + . reduce 18 + + +state 142 + declarator_list : declarator_list ',' . declarator (24) + + '(' shift 2 + '*' shift 3 + '&' shift 4 + T_IDENTIFIER shift 5 + T_TYPEDEF_NAME shift 56 + . error + + declarator goto 148 + direct_declarator goto 42 + pointer goto 44 + any_id goto 45 + identifier_or_ref goto 46 + + +state 143 + function_definition : decl_specifiers declarator $$2 opt_declaration_list T_LBRACE $$3 . T_MATCHRBRACE (27) + + T_MATCHRBRACE shift 149 + . error + + +state 144 + direct_abs_declarator : '(' abs_declarator ')' . (108) + + . reduce 108 + + +state 145 + direct_abs_declarator : '(' parameter_type_list ')' . (113) + + . reduce 113 + + +state 146 + direct_abs_declarator : direct_abs_declarator '(' ')' . (112) + + . reduce 112 + + +state 147 + direct_abs_declarator : direct_abs_declarator '(' parameter_type_list . ')' (111) + + ')' shift 150 + . error + + +state 148 + declarator_list : declarator_list ',' declarator . (24) + + . reduce 24 + + +state 149 + function_definition : decl_specifiers declarator $$2 opt_declaration_list T_LBRACE $$3 T_MATCHRBRACE . (27) + + . reduce 27 + + +state 150 + direct_abs_declarator : direct_abs_declarator '(' parameter_type_list ')' . (111) + + . reduce 111 + + +State 6 contains 29 reduce/reduce conflicts. +State 83 contains 1 shift/reduce conflict. + + +44 terminals, 43 nonterminals +115 grammar rules, 151 states diff --git a/contrib/byacc/test/grammar.tab.c b/contrib/byacc/test/grammar.tab.c new file mode 100644 index 00000000000..64ffe1eae5a --- /dev/null +++ b/contrib/byacc/test/grammar.tab.c @@ -0,0 +1,2025 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse grammar_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex grammar_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror grammar_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar grammar_char +#endif /* yychar */ + +#ifndef yyval +#define yyval grammar_val +#endif /* yyval */ + +#ifndef yylval +#define yylval grammar_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug grammar_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs grammar_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag grammar_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs grammar_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen grammar_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred grammar_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto grammar_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex grammar_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex grammar_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex grammar_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable grammar_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck grammar_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname grammar_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule grammar_rule +#endif /* yyrule */ +#define YYPREFIX "grammar_" + +#define YYPURE 0 + +#line 9 "grammar.y" +#ifdef YYBISON +#include +#define YYSTYPE_IS_DECLARED +#define yyerror yaccError +#endif + +#if defined(YYBISON) || !defined(YYBYACC) +static void yyerror(const char *s); +#endif +#line 81 "grammar.y" +#include +#include +#include + +#define OPT_LINTLIBRARY 1 + +#ifndef TRUE +#define TRUE (1) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +/* #include "cproto.h" */ +#define MAX_TEXT_SIZE 1024 + +/* Prototype styles */ +#if OPT_LINTLIBRARY +#define PROTO_ANSI_LLIB -2 /* form ANSI lint-library source */ +#define PROTO_LINTLIBRARY -1 /* form lint-library source */ +#endif +#define PROTO_NONE 0 /* do not output any prototypes */ +#define PROTO_TRADITIONAL 1 /* comment out parameters */ +#define PROTO_ABSTRACT 2 /* comment out parameter names */ +#define PROTO_ANSI 3 /* ANSI C prototype */ + +typedef int PrototypeStyle; + +typedef char boolean; + +extern boolean types_out; +extern PrototypeStyle proto_style; + +#define ansiLintLibrary() (proto_style == PROTO_ANSI_LLIB) +#define knrLintLibrary() (proto_style == PROTO_LINTLIBRARY) +#define lintLibrary() (knrLintLibrary() || ansiLintLibrary()) + +#if OPT_LINTLIBRARY +#define FUNC_UNKNOWN -1 /* unspecified */ +#else +#define FUNC_UNKNOWN 0 /* unspecified (same as FUNC_NONE) */ +#endif +#define FUNC_NONE 0 /* not a function definition */ +#define FUNC_TRADITIONAL 1 /* traditional style */ +#define FUNC_ANSI 2 /* ANSI style */ +#define FUNC_BOTH 3 /* both styles */ + +typedef int FuncDefStyle; + +/* Source file text */ +typedef struct text { + char text[MAX_TEXT_SIZE]; /* source text */ + long begin; /* offset in temporary file */ +} Text; + +/* Declaration specifier flags */ +#define DS_NONE 0 /* default */ +#define DS_EXTERN 1 /* contains "extern" specifier */ +#define DS_STATIC 2 /* contains "static" specifier */ +#define DS_CHAR 4 /* contains "char" type specifier */ +#define DS_SHORT 8 /* contains "short" type specifier */ +#define DS_FLOAT 16 /* contains "float" type specifier */ +#define DS_INLINE 32 /* contains "inline" specifier */ +#define DS_JUNK 64 /* we're not interested in this declaration */ + +/* This structure stores information about a declaration specifier. */ +typedef struct decl_spec { + unsigned short flags; /* flags defined above */ + char *text; /* source text */ + long begin; /* offset in temporary file */ +} DeclSpec; + +/* This is a list of function parameters. */ +typedef struct _ParameterList { + struct parameter *first; /* pointer to first parameter in list */ + struct parameter *last; /* pointer to last parameter in list */ + long begin_comment; /* begin offset of comment */ + long end_comment; /* end offset of comment */ + char *comment; /* comment at start of parameter list */ +} ParameterList; + +/* This structure stores information about a declarator. */ +typedef struct _Declarator { + char *name; /* name of variable or function */ + char *text; /* source text */ + long begin; /* offset in temporary file */ + long begin_comment; /* begin offset of comment */ + long end_comment; /* end offset of comment */ + FuncDefStyle func_def; /* style of function definition */ + ParameterList params; /* function parameters */ + boolean pointer; /* TRUE if it declares a pointer */ + struct _Declarator *head; /* head function declarator */ + struct _Declarator *func_stack; /* stack of function declarators */ + struct _Declarator *next; /* next declarator in list */ +} Declarator; + +/* This structure stores information about a function parameter. */ +typedef struct parameter { + struct parameter *next; /* next parameter in list */ + DeclSpec decl_spec; + Declarator *declarator; + char *comment; /* comment following the parameter */ +} Parameter; + +/* This is a list of declarators. */ +typedef struct declarator_list { + Declarator *first; /* pointer to first declarator in list */ + Declarator *last; /* pointer to last declarator in list */ +} DeclaratorList; + +/* #include "symbol.h" */ +typedef struct symbol { + struct symbol *next; /* next symbol in list */ + char *name; /* name of symbol */ + char *value; /* value of symbol (for defines) */ + short flags; /* symbol attributes */ +} Symbol; + +/* parser stack entry type */ +typedef union { + Text text; + DeclSpec decl_spec; + Parameter *parameter; + ParameterList param_list; + Declarator *declarator; + DeclaratorList decl_list; +} YYSTYPE; + +/* The hash table length should be a prime number. */ +#define SYM_MAX_HASH 251 + +typedef struct symbol_table { + Symbol *bucket[SYM_MAX_HASH]; /* hash buckets */ +} SymbolTable; + +extern SymbolTable *new_symbol_table /* Create symbol table */ + (void); +extern void free_symbol_table /* Destroy symbol table */ + (SymbolTable *s); +extern Symbol *find_symbol /* Lookup symbol name */ + (SymbolTable *s, const char *n); +extern Symbol *new_symbol /* Define new symbol */ + (SymbolTable *s, const char *n, const char *v, int f); + +/* #include "semantic.h" */ +extern void new_decl_spec (DeclSpec *, const char *, long, int); +extern void free_decl_spec (DeclSpec *); +extern void join_decl_specs (DeclSpec *, DeclSpec *, DeclSpec *); +extern void check_untagged (DeclSpec *); +extern Declarator *new_declarator (const char *, const char *, long); +extern void free_declarator (Declarator *); +extern void new_decl_list (DeclaratorList *, Declarator *); +extern void free_decl_list (DeclaratorList *); +extern void add_decl_list (DeclaratorList *, DeclaratorList *, Declarator *); +extern Parameter *new_parameter (DeclSpec *, Declarator *); +extern void free_parameter (Parameter *); +extern void new_param_list (ParameterList *, Parameter *); +extern void free_param_list (ParameterList *); +extern void add_param_list (ParameterList *, ParameterList *, Parameter *); +extern void new_ident_list (ParameterList *); +extern void add_ident_list (ParameterList *, ParameterList *, const char *); +extern void set_param_types (ParameterList *, DeclSpec *, DeclaratorList *); +extern void gen_declarations (DeclSpec *, DeclaratorList *); +extern void gen_prototype (DeclSpec *, Declarator *); +extern void gen_func_declarator (Declarator *); +extern void gen_func_definition (DeclSpec *, Declarator *); + +extern void init_parser (void); +extern void process_file (FILE *infile, char *name); +extern char *cur_text (void); +extern char *cur_file_name (void); +extern char *implied_typedef (void); +extern void include_file (char *name, int convert); +extern char *supply_parm (int count); +extern char *xstrdup (const char *); +extern int already_declared (char *name); +extern int is_actual_func (Declarator *d); +extern int lint_ellipsis (Parameter *p); +extern int want_typedef (void); +extern void begin_tracking (void); +extern void begin_typedef (void); +extern void copy_typedef (char *s); +extern void ellipsis_varargs (Declarator *d); +extern void end_typedef (void); +extern void flush_varargs (void); +extern void fmt_library (int code); +extern void imply_typedef (const char *s); +extern void indent (FILE *outf); +extern void put_blankline (FILE *outf); +extern void put_body (FILE *outf, DeclSpec *decl_spec, Declarator *declarator); +extern void put_char (FILE *outf, int c); +extern void put_error (void); +extern void put_newline (FILE *outf); +extern void put_padded (FILE *outf, const char *s); +extern void put_string (FILE *outf, const char *s); +extern void track_in (void); + +extern boolean file_comments; +extern FuncDefStyle func_style; +extern char base_file[]; + +extern int yylex (void); + +/* declaration specifier attributes for the typedef statement currently being + * scanned + */ +static int cur_decl_spec_flags; + +/* pointer to parameter list for the current function definition */ +static ParameterList *func_params; + +/* A parser semantic action sets this pointer to the current declarator in + * a function parameter declaration in order to catch any comments following + * the parameter declaration on the same line. If the lexer scans a comment + * and is not NULL, then the comment is attached to the + * declarator. To ignore subsequent comments, the lexer sets this to NULL + * after scanning a comment or end of line. + */ +static Declarator *cur_declarator; + +/* temporary string buffer */ +static char buf[MAX_TEXT_SIZE]; + +/* table of typedef names */ +static SymbolTable *typedef_names; + +/* table of define names */ +static SymbolTable *define_names; + +/* table of type qualifiers */ +static SymbolTable *type_qualifiers; + +/* information about the current input file */ +typedef struct { + char *base_name; /* base input file name */ + char *file_name; /* current file name */ + FILE *file; /* input file */ + unsigned line_num; /* current line number in input file */ + FILE *tmp_file; /* temporary file */ + long begin_comment; /* tmp file offset after last written ) or ; */ + long end_comment; /* tmp file offset after last comment */ + boolean convert; /* if TRUE, convert function definitions */ + boolean changed; /* TRUE if conversion done in this file */ +} IncludeStack; + +static IncludeStack *cur_file; /* current input file */ + +/* #include "yyerror.c" */ + +static int haveAnsiParam (void); + + +/* Flags to enable us to find if a procedure returns a value. + */ +static int return_val; /* nonzero on BRACES iff return-expression found */ + +static const char * +dft_decl_spec (void) +{ + return (lintLibrary() && !return_val) ? "void" : "int"; +} + +static int +haveAnsiParam (void) +{ + Parameter *p; + if (func_params != 0) { + for (p = func_params->first; p != 0; p = p->next) { + if (p->declarator->func_def == FUNC_ANSI) { + return TRUE; + } + } + } + return FALSE; +} +#line 386 "grammar.tab.c" + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define T_IDENTIFIER 257 +#define T_TYPEDEF_NAME 258 +#define T_DEFINE_NAME 259 +#define T_AUTO 260 +#define T_EXTERN 261 +#define T_REGISTER 262 +#define T_STATIC 263 +#define T_TYPEDEF 264 +#define T_INLINE 265 +#define T_EXTENSION 266 +#define T_CHAR 267 +#define T_DOUBLE 268 +#define T_FLOAT 269 +#define T_INT 270 +#define T_VOID 271 +#define T_LONG 272 +#define T_SHORT 273 +#define T_SIGNED 274 +#define T_UNSIGNED 275 +#define T_ENUM 276 +#define T_STRUCT 277 +#define T_UNION 278 +#define T_Bool 279 +#define T_Complex 280 +#define T_Imaginary 281 +#define T_TYPE_QUALIFIER 282 +#define T_BRACKETS 283 +#define T_LBRACE 284 +#define T_MATCHRBRACE 285 +#define T_ELLIPSIS 286 +#define T_INITIALIZER 287 +#define T_STRING_LITERAL 288 +#define T_ASM 289 +#define T_ASMARG 290 +#define T_VA_DCL 291 +#define YYERRCODE 256 +static const short grammar_lhs[] = { -1, + 0, 0, 26, 26, 27, 27, 27, 27, 27, 27, + 27, 31, 30, 30, 28, 28, 34, 28, 32, 32, + 33, 33, 35, 35, 37, 38, 29, 39, 29, 36, + 36, 36, 40, 40, 1, 1, 2, 2, 2, 3, + 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 6, 6, 6, 19, 19, 8, 8, 9, + 41, 9, 7, 7, 7, 25, 23, 23, 10, 10, + 11, 11, 11, 11, 11, 20, 20, 21, 21, 22, + 22, 14, 14, 15, 15, 16, 16, 16, 17, 17, + 18, 18, 24, 24, 12, 12, 12, 13, 13, 13, + 13, 13, 13, 13, +}; +static const short grammar_len[] = { 2, + 0, 1, 1, 2, 1, 1, 1, 1, 3, 2, + 2, 2, 3, 3, 2, 3, 0, 5, 2, 1, + 0, 1, 1, 3, 0, 0, 7, 0, 5, 0, + 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 2, 2, 1, 1, 1, 3, 1, + 0, 4, 3, 2, 2, 1, 1, 1, 2, 1, + 1, 3, 2, 4, 4, 2, 3, 0, 1, 1, + 2, 1, 3, 1, 3, 2, 2, 1, 0, 1, + 1, 3, 1, 2, 1, 2, 1, 3, 2, 1, + 4, 3, 3, 2, +}; +static const short grammar_defred[] = { 0, + 0, 0, 0, 0, 77, 0, 62, 40, 0, 42, + 43, 20, 44, 0, 46, 47, 48, 49, 54, 50, + 51, 52, 53, 76, 66, 67, 55, 56, 57, 61, + 0, 7, 0, 0, 35, 37, 38, 39, 59, 60, + 28, 0, 0, 0, 103, 81, 0, 0, 3, 5, + 6, 8, 0, 10, 11, 78, 0, 90, 0, 0, + 104, 0, 19, 0, 41, 45, 15, 36, 0, 68, + 0, 0, 0, 83, 0, 0, 64, 0, 0, 74, + 4, 58, 0, 82, 87, 91, 0, 14, 13, 9, + 16, 0, 71, 0, 31, 33, 0, 0, 0, 0, + 0, 94, 0, 0, 101, 12, 63, 73, 0, 0, + 69, 0, 0, 0, 34, 0, 110, 96, 97, 0, + 0, 84, 0, 85, 0, 23, 0, 0, 72, 26, + 29, 114, 0, 0, 0, 109, 0, 93, 95, 102, + 18, 0, 0, 108, 113, 112, 0, 24, 27, 111, +}; +static const short grammar_dgoto[] = { 33, + 87, 35, 36, 37, 38, 39, 40, 69, 70, 41, + 42, 119, 120, 100, 101, 102, 103, 104, 43, 44, + 59, 60, 45, 46, 47, 48, 49, 50, 51, 52, + 77, 53, 127, 109, 128, 97, 94, 143, 72, 98, + 112, +}; +static const short grammar_sindex[] = { -2, + -3, 27, -239, -177, 0, 0, 0, 0, -274, 0, + 0, 0, 0, -246, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -266, 0, 0, 455, 0, 0, 0, 0, 0, 0, + 0, -35, -245, 128, 0, 0, -245, -2, 0, 0, + 0, 0, 642, 0, 0, 0, -15, 0, -12, -239, + 0, 590, 0, -27, 0, 0, 0, 0, -10, 0, + -11, 534, -72, 0, -237, -232, 0, -35, -232, 0, + 0, 0, 642, 0, 0, 0, 455, 0, 0, 0, + 0, 27, 0, 534, 0, 0, -222, 617, 209, 34, + 39, 0, 44, 42, 0, 0, 0, 0, 27, -11, + 0, -200, -196, -195, 0, 174, 0, 0, 0, -33, + 243, 0, 561, 0, -177, 0, 33, 49, 0, 0, + 0, 0, 53, 55, 417, 0, -33, 0, 0, 0, + 0, 27, -188, 0, 0, 0, 57, 0, 0, 0, +}; +static const short grammar_rindex[] = { 99, + 0, 0, 275, 0, 0, -38, 0, 0, 481, 0, + 0, 0, 0, 509, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 30, 0, 0, 0, 0, 0, 101, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 343, 309, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 98, -182, 62, 0, 0, 133, 0, 64, 379, 0, + 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -182, 0, 0, 0, -180, -19, 0, + 65, 0, 0, 68, 0, 0, 0, 0, 51, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -13, + 19, 0, 0, 0, 0, 0, 0, 52, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +static const short grammar_gindex[] = { 0, + 11, -17, 0, 0, 13, 0, 0, 0, 20, 8, + -43, -1, -8, -89, 0, -9, 0, 0, 0, -44, + 0, 0, 4, 0, 0, 0, 70, -53, 0, 0, + -18, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, +}; +#define YYTABLESIZE 924 +static const short grammar_table[] = { 58, + 78, 58, 58, 58, 73, 58, 135, 61, 88, 57, + 34, 5, 56, 62, 85, 58, 68, 63, 96, 7, + 58, 98, 78, 64, 98, 84, 134, 107, 80, 3, + 107, 90, 17, 92, 17, 4, 17, 2, 75, 3, + 96, 71, 30, 89, 115, 147, 76, 106, 91, 93, + 79, 75, 70, 17, 121, 55, 32, 107, 34, 105, + 108, 114, 105, 83, 4, 68, 2, 70, 3, 68, + 80, 121, 86, 80, 122, 106, 105, 78, 106, 5, + 56, 68, 123, 99, 124, 125, 129, 130, 80, 131, + 80, 141, 142, 144, 110, 145, 149, 150, 1, 110, + 2, 30, 99, 32, 79, 92, 118, 79, 100, 21, + 22, 111, 137, 139, 133, 113, 126, 81, 0, 0, + 0, 0, 79, 57, 79, 0, 99, 0, 140, 0, + 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, + 0, 70, 0, 0, 0, 99, 0, 0, 0, 148, + 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, + 65, 0, 65, 65, 65, 0, 65, 0, 0, 0, + 0, 0, 0, 0, 5, 6, 7, 8, 65, 10, + 11, 65, 13, 66, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 0, 4, 0, 116, 132, 3, 0, 0, 58, 58, + 58, 58, 58, 58, 58, 78, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 78, 4, 74, 116, 136, + 3, 17, 78, 1, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 4, 54, 116, 5, 56, 0, 31, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 88, 80, 88, 88, 88, 0, 88, 0, + 80, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 89, 79, 89, 89, + 89, 0, 89, 0, 79, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 86, 25, 86, 86, 5, 56, 86, 0, 25, 65, + 65, 65, 65, 65, 65, 65, 0, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 75, 0, 75, 75, + 75, 0, 75, 0, 0, 0, 0, 0, 0, 0, + 5, 6, 7, 8, 65, 10, 11, 75, 13, 66, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 117, 146, 0, 0, + 0, 0, 0, 0, 0, 5, 6, 7, 8, 65, + 10, 11, 0, 13, 66, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 117, 4, 0, 2, 0, 3, 0, 0, 5, + 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 67, 0, 0, 0, 0, 41, 0, + 41, 0, 41, 0, 0, 117, 0, 0, 0, 0, + 0, 88, 88, 0, 0, 0, 0, 0, 0, 41, + 0, 0, 0, 0, 0, 0, 45, 0, 45, 0, + 45, 0, 0, 0, 0, 0, 0, 88, 0, 0, + 0, 0, 0, 0, 0, 89, 89, 45, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 89, 0, 0, 0, 0, 0, 0, 0, 86, + 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 75, 75, 75, 75, 75, + 75, 75, 0, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 7, 8, 65, 10, 11, + 0, 13, 66, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 6, 7, 8, 65, 10, 11, 0, 13, + 66, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 41, 41, 41, + 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 0, 0, 45, 45, 45, 45, 45, + 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 82, 7, 8, 65, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 0, 0, 82, 7, + 8, 65, 10, 11, 95, 13, 66, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 0, 0, 0, 138, 82, 7, 8, + 65, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 0, 75, 82, 7, 8, 65, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 82, + 7, 8, 65, 10, 11, 0, 13, 66, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, +}; +static const short grammar_check[] = { 38, + 44, 40, 41, 42, 40, 44, 40, 4, 62, 2, + 0, 257, 258, 288, 59, 3, 34, 264, 72, 259, + 59, 41, 61, 290, 44, 41, 116, 41, 47, 42, + 44, 59, 38, 44, 40, 38, 42, 40, 284, 42, + 94, 34, 282, 62, 98, 135, 43, 285, 59, 61, + 47, 284, 44, 59, 99, 59, 59, 76, 48, 41, + 79, 284, 44, 53, 38, 83, 40, 59, 42, 87, + 41, 116, 60, 44, 41, 41, 73, 121, 44, 257, + 258, 99, 44, 73, 41, 44, 287, 284, 59, 285, + 61, 59, 44, 41, 87, 41, 285, 41, 0, 92, + 0, 284, 41, 284, 41, 41, 99, 44, 41, 59, + 59, 92, 121, 123, 116, 94, 109, 48, -1, -1, + -1, -1, 59, 116, 61, -1, 116, -1, 125, -1, + -1, -1, -1, 123, -1, -1, -1, -1, -1, -1, + -1, 44, -1, -1, -1, 135, -1, -1, -1, 142, + -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, + -1, -1, -1, -1, -1, 38, -1, 40, -1, -1, + 38, -1, 40, 41, 42, -1, 44, -1, -1, -1, + -1, -1, -1, -1, 257, 258, 259, 260, 261, 262, + 263, 59, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + -1, 38, -1, 40, 41, 42, -1, -1, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 38, 283, 40, 283, + 42, 257, 291, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 38, 285, 40, 257, 258, -1, 289, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 38, 284, 40, 41, 42, -1, 44, -1, + 291, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 38, 284, 40, 41, + 42, -1, 44, -1, 291, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 38, 284, 40, 41, 257, 258, 44, -1, 291, 257, + 258, 259, 260, 261, 262, 263, -1, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 38, -1, 40, 41, + 42, -1, 44, -1, -1, -1, -1, -1, -1, -1, + 257, 258, 259, 260, 261, 262, 263, 59, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 41, -1, -1, + -1, -1, -1, -1, -1, 257, 258, 259, 260, 261, + 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 38, -1, 40, -1, 42, -1, -1, 257, + 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 59, -1, -1, -1, -1, 38, -1, + 40, -1, 42, -1, -1, 283, -1, -1, -1, -1, + -1, 257, 258, -1, -1, -1, -1, -1, -1, 59, + -1, -1, -1, -1, -1, -1, 38, -1, 40, -1, + 42, -1, -1, -1, -1, -1, -1, 283, -1, -1, + -1, -1, -1, -1, -1, 257, 258, 59, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 283, -1, -1, -1, -1, -1, -1, -1, 257, + 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 283, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, 258, 259, 260, 261, + 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 258, 259, 260, 261, 262, 263, + -1, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 257, 258, 259, 260, 261, 262, 263, -1, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 257, 258, 259, + 260, 261, 262, 263, -1, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, -1, -1, 257, 258, 259, 260, 261, + 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, -1, -1, 258, 259, + 260, 261, 262, 263, 291, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, -1, -1, -1, 286, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, -1, 284, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 258, + 259, 260, 261, 262, 263, -1, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, +}; +#define YYFINAL 33 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 291 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,"'&'",0,"'('","')'","'*'",0,"','",0,0,0,0,0,0,0,0,0,0,0,0,0,0,"';'",0, +"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +"T_IDENTIFIER","T_TYPEDEF_NAME","T_DEFINE_NAME","T_AUTO","T_EXTERN", +"T_REGISTER","T_STATIC","T_TYPEDEF","T_INLINE","T_EXTENSION","T_CHAR", +"T_DOUBLE","T_FLOAT","T_INT","T_VOID","T_LONG","T_SHORT","T_SIGNED", +"T_UNSIGNED","T_ENUM","T_STRUCT","T_UNION","T_Bool","T_Complex","T_Imaginary", +"T_TYPE_QUALIFIER","T_BRACKETS","T_LBRACE","T_MATCHRBRACE","T_ELLIPSIS", +"T_INITIALIZER","T_STRING_LITERAL","T_ASM","T_ASMARG","T_VA_DCL", +}; +static const char *yyrule[] = { +"$accept : program", +"program :", +"program : translation_unit", +"translation_unit : external_declaration", +"translation_unit : translation_unit external_declaration", +"external_declaration : declaration", +"external_declaration : function_definition", +"external_declaration : ';'", +"external_declaration : linkage_specification", +"external_declaration : T_ASM T_ASMARG ';'", +"external_declaration : error T_MATCHRBRACE", +"external_declaration : error ';'", +"braces : T_LBRACE T_MATCHRBRACE", +"linkage_specification : T_EXTERN T_STRING_LITERAL braces", +"linkage_specification : T_EXTERN T_STRING_LITERAL declaration", +"declaration : decl_specifiers ';'", +"declaration : decl_specifiers init_declarator_list ';'", +"$$1 :", +"declaration : any_typedef decl_specifiers $$1 opt_declarator_list ';'", +"any_typedef : T_EXTENSION T_TYPEDEF", +"any_typedef : T_TYPEDEF", +"opt_declarator_list :", +"opt_declarator_list : declarator_list", +"declarator_list : declarator", +"declarator_list : declarator_list ',' declarator", +"$$2 :", +"$$3 :", +"function_definition : decl_specifiers declarator $$2 opt_declaration_list T_LBRACE $$3 T_MATCHRBRACE", +"$$4 :", +"function_definition : declarator $$4 opt_declaration_list T_LBRACE T_MATCHRBRACE", +"opt_declaration_list :", +"opt_declaration_list : T_VA_DCL", +"opt_declaration_list : declaration_list", +"declaration_list : declaration", +"declaration_list : declaration_list declaration", +"decl_specifiers : decl_specifier", +"decl_specifiers : decl_specifiers decl_specifier", +"decl_specifier : storage_class", +"decl_specifier : type_specifier", +"decl_specifier : type_qualifier", +"storage_class : T_AUTO", +"storage_class : T_EXTERN", +"storage_class : T_REGISTER", +"storage_class : T_STATIC", +"storage_class : T_INLINE", +"storage_class : T_EXTENSION", +"type_specifier : T_CHAR", +"type_specifier : T_DOUBLE", +"type_specifier : T_FLOAT", +"type_specifier : T_INT", +"type_specifier : T_LONG", +"type_specifier : T_SHORT", +"type_specifier : T_SIGNED", +"type_specifier : T_UNSIGNED", +"type_specifier : T_VOID", +"type_specifier : T_Bool", +"type_specifier : T_Complex", +"type_specifier : T_Imaginary", +"type_specifier : T_TYPEDEF_NAME", +"type_specifier : struct_or_union_specifier", +"type_specifier : enum_specifier", +"type_qualifier : T_TYPE_QUALIFIER", +"type_qualifier : T_DEFINE_NAME", +"struct_or_union_specifier : struct_or_union any_id braces", +"struct_or_union_specifier : struct_or_union braces", +"struct_or_union_specifier : struct_or_union any_id", +"struct_or_union : T_STRUCT", +"struct_or_union : T_UNION", +"init_declarator_list : init_declarator", +"init_declarator_list : init_declarator_list ',' init_declarator", +"init_declarator : declarator", +"$$5 :", +"init_declarator : declarator '=' $$5 T_INITIALIZER", +"enum_specifier : enumeration any_id braces", +"enum_specifier : enumeration braces", +"enum_specifier : enumeration any_id", +"enumeration : T_ENUM", +"any_id : T_IDENTIFIER", +"any_id : T_TYPEDEF_NAME", +"declarator : pointer direct_declarator", +"declarator : direct_declarator", +"direct_declarator : identifier_or_ref", +"direct_declarator : '(' declarator ')'", +"direct_declarator : direct_declarator T_BRACKETS", +"direct_declarator : direct_declarator '(' parameter_type_list ')'", +"direct_declarator : direct_declarator '(' opt_identifier_list ')'", +"pointer : '*' opt_type_qualifiers", +"pointer : '*' opt_type_qualifiers pointer", +"opt_type_qualifiers :", +"opt_type_qualifiers : type_qualifier_list", +"type_qualifier_list : type_qualifier", +"type_qualifier_list : type_qualifier_list type_qualifier", +"parameter_type_list : parameter_list", +"parameter_type_list : parameter_list ',' T_ELLIPSIS", +"parameter_list : parameter_declaration", +"parameter_list : parameter_list ',' parameter_declaration", +"parameter_declaration : decl_specifiers declarator", +"parameter_declaration : decl_specifiers abs_declarator", +"parameter_declaration : decl_specifiers", +"opt_identifier_list :", +"opt_identifier_list : identifier_list", +"identifier_list : any_id", +"identifier_list : identifier_list ',' any_id", +"identifier_or_ref : any_id", +"identifier_or_ref : '&' any_id", +"abs_declarator : pointer", +"abs_declarator : pointer direct_abs_declarator", +"abs_declarator : direct_abs_declarator", +"direct_abs_declarator : '(' abs_declarator ')'", +"direct_abs_declarator : direct_abs_declarator T_BRACKETS", +"direct_abs_declarator : T_BRACKETS", +"direct_abs_declarator : direct_abs_declarator '(' parameter_type_list ')'", +"direct_abs_declarator : direct_abs_declarator '(' ')'", +"direct_abs_declarator : '(' parameter_type_list ')'", +"direct_abs_declarator : '(' ')'", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 1014 "grammar.y" + +/* lex.yy.c */ +#define BEGIN yy_start = 1 + 2 * + +#define CPP1 1 +#define INIT1 2 +#define INIT2 3 +#define CURLY 4 +#define LEXYACC 5 +#define ASM 6 +#define CPP_INLINE 7 + +extern char *yytext; +extern FILE *yyin, *yyout; + +static int curly; /* number of curly brace nesting levels */ +static int ly_count; /* number of occurances of %% */ +static int inc_depth; /* include nesting level */ +static SymbolTable *included_files; /* files already included */ +static int yy_start = 0; /* start state number */ + +#define grammar_error(s) yaccError(s) + +static void +yaccError (const char *msg) +{ + func_params = NULL; + put_error(); /* tell what line we're on, and what file */ + fprintf(stderr, "%s at token '%s'\n", msg, yytext); +} + +/* Initialize the table of type qualifier keywords recognized by the lexical + * analyzer. + */ +void +init_parser (void) +{ + static const char *keywords[] = { + "const", + "restrict", + "volatile", + "interrupt", +#ifdef vms + "noshare", + "readonly", +#endif +#if defined(MSDOS) || defined(OS2) + "__cdecl", + "__export", + "__far", + "__fastcall", + "__fortran", + "__huge", + "__inline", + "__interrupt", + "__loadds", + "__near", + "__pascal", + "__saveregs", + "__segment", + "__stdcall", + "__syscall", + "_cdecl", + "_cs", + "_ds", + "_es", + "_export", + "_far", + "_fastcall", + "_fortran", + "_huge", + "_interrupt", + "_loadds", + "_near", + "_pascal", + "_saveregs", + "_seg", + "_segment", + "_ss", + "cdecl", + "far", + "huge", + "near", + "pascal", +#ifdef OS2 + "__far16", +#endif +#endif +#ifdef __GNUC__ + /* gcc aliases */ + "__builtin_va_arg", + "__builtin_va_list", + "__const", + "__const__", + "__inline", + "__inline__", + "__restrict", + "__restrict__", + "__volatile", + "__volatile__", +#endif + }; + unsigned i; + + /* Initialize type qualifier table. */ + type_qualifiers = new_symbol_table(); + for (i = 0; i < sizeof(keywords)/sizeof(keywords[0]); ++i) { + new_symbol(type_qualifiers, keywords[i], NULL, DS_NONE); + } +} + +/* Process the C source file. Write function prototypes to the standard + * output. Convert function definitions and write the converted source + * code to a temporary file. + */ +void +process_file (FILE *infile, char *name) +{ + char *s; + + if (strlen(name) > 2) { + s = name + strlen(name) - 2; + if (*s == '.') { + ++s; + if (*s == 'l' || *s == 'y') + BEGIN LEXYACC; +#if defined(MSDOS) || defined(OS2) + if (*s == 'L' || *s == 'Y') + BEGIN LEXYACC; +#endif + } + } + + included_files = new_symbol_table(); + typedef_names = new_symbol_table(); + define_names = new_symbol_table(); + inc_depth = -1; + curly = 0; + ly_count = 0; + func_params = NULL; + yyin = infile; + include_file(strcpy(base_file, name), func_style != FUNC_NONE); + if (file_comments) { +#if OPT_LINTLIBRARY + if (lintLibrary()) { + put_blankline(stdout); + begin_tracking(); + } +#endif + put_string(stdout, "/* "); + put_string(stdout, cur_file_name()); + put_string(stdout, " */\n"); + } + yyparse(); + free_symbol_table(define_names); + free_symbol_table(typedef_names); + free_symbol_table(included_files); +} + +#ifdef NO_LEAKS +void +free_parser(void) +{ + free_symbol_table (type_qualifiers); +#ifdef FLEX_SCANNER + if (yy_current_buffer != 0) + yy_delete_buffer(yy_current_buffer); +#endif +} +#endif +#line 1085 "grammar.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 10: +#line 377 "grammar.y" + { + yyerrok; + } +break; +case 11: +#line 381 "grammar.y" + { + yyerrok; + } +break; +case 13: +#line 392 "grammar.y" + { + /* Provide an empty action here so bison will not complain about + * incompatible types in the default action it normally would + * have generated. + */ + } +break; +case 14: +#line 399 "grammar.y" + { + /* empty */ + } +break; +case 15: +#line 406 "grammar.y" + { +#if OPT_LINTLIBRARY + if (types_out && want_typedef()) { + gen_declarations(&yystack.l_mark[-1].decl_spec, (DeclaratorList *)0); + flush_varargs(); + } +#endif + free_decl_spec(&yystack.l_mark[-1].decl_spec); + end_typedef(); + } +break; +case 16: +#line 417 "grammar.y" + { + if (func_params != NULL) { + set_param_types(func_params, &yystack.l_mark[-2].decl_spec, &yystack.l_mark[-1].decl_list); + } else { + gen_declarations(&yystack.l_mark[-2].decl_spec, &yystack.l_mark[-1].decl_list); +#if OPT_LINTLIBRARY + flush_varargs(); +#endif + free_decl_list(&yystack.l_mark[-1].decl_list); + } + free_decl_spec(&yystack.l_mark[-2].decl_spec); + end_typedef(); + } +break; +case 17: +#line 431 "grammar.y" + { + cur_decl_spec_flags = yystack.l_mark[0].decl_spec.flags; + free_decl_spec(&yystack.l_mark[0].decl_spec); + } +break; +case 18: +#line 436 "grammar.y" + { + end_typedef(); + } +break; +case 19: +#line 443 "grammar.y" + { + begin_typedef(); + } +break; +case 20: +#line 447 "grammar.y" + { + begin_typedef(); + } +break; +case 23: +#line 459 "grammar.y" + { + int flags = cur_decl_spec_flags; + + /* If the typedef is a pointer type, then reset the short type + * flags so it does not get promoted. + */ + if (strcmp(yystack.l_mark[0].declarator->text, yystack.l_mark[0].declarator->name) != 0) + flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT); + new_symbol(typedef_names, yystack.l_mark[0].declarator->name, NULL, flags); + free_declarator(yystack.l_mark[0].declarator); + } +break; +case 24: +#line 471 "grammar.y" + { + int flags = cur_decl_spec_flags; + + if (strcmp(yystack.l_mark[0].declarator->text, yystack.l_mark[0].declarator->name) != 0) + flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT); + new_symbol(typedef_names, yystack.l_mark[0].declarator->name, NULL, flags); + free_declarator(yystack.l_mark[0].declarator); + } +break; +case 25: +#line 483 "grammar.y" + { + check_untagged(&yystack.l_mark[-1].decl_spec); + if (yystack.l_mark[0].declarator->func_def == FUNC_NONE) { + yyerror("syntax error"); + YYERROR; + } + func_params = &(yystack.l_mark[0].declarator->head->params); + func_params->begin_comment = cur_file->begin_comment; + func_params->end_comment = cur_file->end_comment; + } +break; +case 26: +#line 494 "grammar.y" + { + /* If we're converting to K&R and we've got a nominally K&R + * function which has a parameter which is ANSI (i.e., a prototyped + * function pointer), then we must override the deciphered value of + * 'func_def' so that the parameter will be converted. + */ + if (func_style == FUNC_TRADITIONAL + && haveAnsiParam() + && yystack.l_mark[-3].declarator->head->func_def == func_style) { + yystack.l_mark[-3].declarator->head->func_def = FUNC_BOTH; + } + + func_params = NULL; + + if (cur_file->convert) + gen_func_definition(&yystack.l_mark[-4].decl_spec, yystack.l_mark[-3].declarator); + gen_prototype(&yystack.l_mark[-4].decl_spec, yystack.l_mark[-3].declarator); +#if OPT_LINTLIBRARY + flush_varargs(); +#endif + free_decl_spec(&yystack.l_mark[-4].decl_spec); + free_declarator(yystack.l_mark[-3].declarator); + } +break; +case 28: +#line 519 "grammar.y" + { + if (yystack.l_mark[0].declarator->func_def == FUNC_NONE) { + yyerror("syntax error"); + YYERROR; + } + func_params = &(yystack.l_mark[0].declarator->head->params); + func_params->begin_comment = cur_file->begin_comment; + func_params->end_comment = cur_file->end_comment; + } +break; +case 29: +#line 529 "grammar.y" + { + DeclSpec decl_spec; + + func_params = NULL; + + new_decl_spec(&decl_spec, dft_decl_spec(), yystack.l_mark[-4].declarator->begin, DS_NONE); + if (cur_file->convert) + gen_func_definition(&decl_spec, yystack.l_mark[-4].declarator); + gen_prototype(&decl_spec, yystack.l_mark[-4].declarator); +#if OPT_LINTLIBRARY + flush_varargs(); +#endif + free_decl_spec(&decl_spec); + free_declarator(yystack.l_mark[-4].declarator); + } +break; +case 36: +#line 560 "grammar.y" + { + join_decl_specs(&yyval.decl_spec, &yystack.l_mark[-1].decl_spec, &yystack.l_mark[0].decl_spec); + free(yystack.l_mark[-1].decl_spec.text); + free(yystack.l_mark[0].decl_spec.text); + } +break; +case 40: +#line 575 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 41: +#line 579 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_EXTERN); + } +break; +case 42: +#line 583 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 43: +#line 587 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_STATIC); + } +break; +case 44: +#line 591 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_INLINE); + } +break; +case 45: +#line 595 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_JUNK); + } +break; +case 46: +#line 602 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_CHAR); + } +break; +case 47: +#line 606 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 48: +#line 610 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_FLOAT); + } +break; +case 49: +#line 614 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 50: +#line 618 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 51: +#line 622 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_SHORT); + } +break; +case 52: +#line 626 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 53: +#line 630 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 54: +#line 634 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 55: +#line 638 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_CHAR); + } +break; +case 56: +#line 642 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 57: +#line 646 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 58: +#line 650 "grammar.y" + { + Symbol *s; + s = find_symbol(typedef_names, yystack.l_mark[0].text.text); + if (s != NULL) + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, s->flags); + } +break; +case 61: +#line 662 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 62: +#line 666 "grammar.y" + { + /* This rule allows the nonterminal to scan #define + * names as if they were type modifiers. + */ + Symbol *s; + s = find_symbol(define_names, yystack.l_mark[0].text.text); + if (s != NULL) + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, s->flags); + } +break; +case 63: +#line 679 "grammar.y" + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "%s %s", yystack.l_mark[-2].text.text, yystack.l_mark[-1].text.text); + new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-2].text.begin, DS_NONE); + } +break; +case 64: +#line 686 "grammar.y" + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "%s {}", yystack.l_mark[-1].text.text); + new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-1].text.begin, DS_NONE); + } +break; +case 65: +#line 693 "grammar.y" + { + (void)sprintf(buf, "%s %s", yystack.l_mark[-1].text.text, yystack.l_mark[0].text.text); + new_decl_spec(&yyval.decl_spec, buf, yystack.l_mark[-1].text.begin, DS_NONE); + } +break; +case 66: +#line 701 "grammar.y" + { + imply_typedef(yyval.text.text); + } +break; +case 67: +#line 705 "grammar.y" + { + imply_typedef(yyval.text.text); + } +break; +case 68: +#line 712 "grammar.y" + { + new_decl_list(&yyval.decl_list, yystack.l_mark[0].declarator); + } +break; +case 69: +#line 716 "grammar.y" + { + add_decl_list(&yyval.decl_list, &yystack.l_mark[-2].decl_list, yystack.l_mark[0].declarator); + } +break; +case 70: +#line 723 "grammar.y" + { + if (yystack.l_mark[0].declarator->func_def != FUNC_NONE && func_params == NULL && + func_style == FUNC_TRADITIONAL && cur_file->convert) { + gen_func_declarator(yystack.l_mark[0].declarator); + fputs(cur_text(), cur_file->tmp_file); + } + cur_declarator = yyval.declarator; + } +break; +case 71: +#line 732 "grammar.y" + { + if (yystack.l_mark[-1].declarator->func_def != FUNC_NONE && func_params == NULL && + func_style == FUNC_TRADITIONAL && cur_file->convert) { + gen_func_declarator(yystack.l_mark[-1].declarator); + fputs(" =", cur_file->tmp_file); + } + } +break; +case 73: +#line 744 "grammar.y" + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "enum %s", yystack.l_mark[-1].text.text); + new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-2].text.begin, DS_NONE); + } +break; +case 74: +#line 751 "grammar.y" + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "%s {}", yystack.l_mark[-1].text.text); + new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-1].text.begin, DS_NONE); + } +break; +case 75: +#line 758 "grammar.y" + { + (void)sprintf(buf, "enum %s", yystack.l_mark[0].text.text); + new_decl_spec(&yyval.decl_spec, buf, yystack.l_mark[-1].text.begin, DS_NONE); + } +break; +case 76: +#line 766 "grammar.y" + { + imply_typedef("enum"); + yyval.text = yystack.l_mark[0].text; + } +break; +case 79: +#line 779 "grammar.y" + { + yyval.declarator = yystack.l_mark[0].declarator; + (void)sprintf(buf, "%s%s", yystack.l_mark[-1].text.text, yyval.declarator->text); + free(yyval.declarator->text); + yyval.declarator->text = xstrdup(buf); + yyval.declarator->begin = yystack.l_mark[-1].text.begin; + yyval.declarator->pointer = TRUE; + } +break; +case 81: +#line 792 "grammar.y" + { + yyval.declarator = new_declarator(yystack.l_mark[0].text.text, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin); + } +break; +case 82: +#line 796 "grammar.y" + { + yyval.declarator = yystack.l_mark[-1].declarator; + (void)sprintf(buf, "(%s)", yyval.declarator->text); + free(yyval.declarator->text); + yyval.declarator->text = xstrdup(buf); + yyval.declarator->begin = yystack.l_mark[-2].text.begin; + } +break; +case 83: +#line 804 "grammar.y" + { + yyval.declarator = yystack.l_mark[-1].declarator; + (void)sprintf(buf, "%s%s", yyval.declarator->text, yystack.l_mark[0].text.text); + free(yyval.declarator->text); + yyval.declarator->text = xstrdup(buf); + } +break; +case 84: +#line 811 "grammar.y" + { + yyval.declarator = new_declarator("%s()", yystack.l_mark[-3].declarator->name, yystack.l_mark[-3].declarator->begin); + yyval.declarator->params = yystack.l_mark[-1].param_list; + yyval.declarator->func_stack = yystack.l_mark[-3].declarator; + yyval.declarator->head = (yystack.l_mark[-3].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-3].declarator->head; + yyval.declarator->func_def = FUNC_ANSI; + } +break; +case 85: +#line 819 "grammar.y" + { + yyval.declarator = new_declarator("%s()", yystack.l_mark[-3].declarator->name, yystack.l_mark[-3].declarator->begin); + yyval.declarator->params = yystack.l_mark[-1].param_list; + yyval.declarator->func_stack = yystack.l_mark[-3].declarator; + yyval.declarator->head = (yystack.l_mark[-3].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-3].declarator->head; + yyval.declarator->func_def = FUNC_TRADITIONAL; + } +break; +case 86: +#line 830 "grammar.y" + { + (void)sprintf(yyval.text.text, "*%s", yystack.l_mark[0].text.text); + yyval.text.begin = yystack.l_mark[-1].text.begin; + } +break; +case 87: +#line 835 "grammar.y" + { + (void)sprintf(yyval.text.text, "*%s%s", yystack.l_mark[-1].text.text, yystack.l_mark[0].text.text); + yyval.text.begin = yystack.l_mark[-2].text.begin; + } +break; +case 88: +#line 843 "grammar.y" + { + strcpy(yyval.text.text, ""); + yyval.text.begin = 0L; + } +break; +case 90: +#line 852 "grammar.y" + { + (void)sprintf(yyval.text.text, "%s ", yystack.l_mark[0].decl_spec.text); + yyval.text.begin = yystack.l_mark[0].decl_spec.begin; + free(yystack.l_mark[0].decl_spec.text); + } +break; +case 91: +#line 858 "grammar.y" + { + (void)sprintf(yyval.text.text, "%s%s ", yystack.l_mark[-1].text.text, yystack.l_mark[0].decl_spec.text); + yyval.text.begin = yystack.l_mark[-1].text.begin; + free(yystack.l_mark[0].decl_spec.text); + } +break; +case 93: +#line 868 "grammar.y" + { + add_ident_list(&yyval.param_list, &yystack.l_mark[-2].param_list, "..."); + } +break; +case 94: +#line 875 "grammar.y" + { + new_param_list(&yyval.param_list, yystack.l_mark[0].parameter); + } +break; +case 95: +#line 879 "grammar.y" + { + add_param_list(&yyval.param_list, &yystack.l_mark[-2].param_list, yystack.l_mark[0].parameter); + } +break; +case 96: +#line 886 "grammar.y" + { + check_untagged(&yystack.l_mark[-1].decl_spec); + yyval.parameter = new_parameter(&yystack.l_mark[-1].decl_spec, yystack.l_mark[0].declarator); + } +break; +case 97: +#line 891 "grammar.y" + { + check_untagged(&yystack.l_mark[-1].decl_spec); + yyval.parameter = new_parameter(&yystack.l_mark[-1].decl_spec, yystack.l_mark[0].declarator); + } +break; +case 98: +#line 896 "grammar.y" + { + check_untagged(&yystack.l_mark[0].decl_spec); + yyval.parameter = new_parameter(&yystack.l_mark[0].decl_spec, (Declarator *)0); + } +break; +case 99: +#line 904 "grammar.y" + { + new_ident_list(&yyval.param_list); + } +break; +case 101: +#line 912 "grammar.y" + { + new_ident_list(&yyval.param_list); + add_ident_list(&yyval.param_list, &yyval.param_list, yystack.l_mark[0].text.text); + } +break; +case 102: +#line 917 "grammar.y" + { + add_ident_list(&yyval.param_list, &yystack.l_mark[-2].param_list, yystack.l_mark[0].text.text); + } +break; +case 103: +#line 924 "grammar.y" + { + yyval.text = yystack.l_mark[0].text; + } +break; +case 104: +#line 928 "grammar.y" + { +#if OPT_LINTLIBRARY + if (lintLibrary()) { /* Lint doesn't grok C++ ref variables */ + yyval.text = yystack.l_mark[0].text; + } else +#endif + (void)sprintf(yyval.text.text, "&%s", yystack.l_mark[0].text.text); + yyval.text.begin = yystack.l_mark[-1].text.begin; + } +break; +case 105: +#line 941 "grammar.y" + { + yyval.declarator = new_declarator(yystack.l_mark[0].text.text, "", yystack.l_mark[0].text.begin); + } +break; +case 106: +#line 945 "grammar.y" + { + yyval.declarator = yystack.l_mark[0].declarator; + (void)sprintf(buf, "%s%s", yystack.l_mark[-1].text.text, yyval.declarator->text); + free(yyval.declarator->text); + yyval.declarator->text = xstrdup(buf); + yyval.declarator->begin = yystack.l_mark[-1].text.begin; + } +break; +case 108: +#line 957 "grammar.y" + { + yyval.declarator = yystack.l_mark[-1].declarator; + (void)sprintf(buf, "(%s)", yyval.declarator->text); + free(yyval.declarator->text); + yyval.declarator->text = xstrdup(buf); + yyval.declarator->begin = yystack.l_mark[-2].text.begin; + } +break; +case 109: +#line 965 "grammar.y" + { + yyval.declarator = yystack.l_mark[-1].declarator; + (void)sprintf(buf, "%s%s", yyval.declarator->text, yystack.l_mark[0].text.text); + free(yyval.declarator->text); + yyval.declarator->text = xstrdup(buf); + } +break; +case 110: +#line 972 "grammar.y" + { + yyval.declarator = new_declarator(yystack.l_mark[0].text.text, "", yystack.l_mark[0].text.begin); + } +break; +case 111: +#line 976 "grammar.y" + { + yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-3].declarator->begin); + yyval.declarator->params = yystack.l_mark[-1].param_list; + yyval.declarator->func_stack = yystack.l_mark[-3].declarator; + yyval.declarator->head = (yystack.l_mark[-3].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-3].declarator->head; + yyval.declarator->func_def = FUNC_ANSI; + } +break; +case 112: +#line 984 "grammar.y" + { + yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-2].declarator->begin); + yyval.declarator->func_stack = yystack.l_mark[-2].declarator; + yyval.declarator->head = (yystack.l_mark[-2].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-2].declarator->head; + yyval.declarator->func_def = FUNC_ANSI; + } +break; +case 113: +#line 991 "grammar.y" + { + Declarator *d; + + d = new_declarator("", "", yystack.l_mark[-2].text.begin); + yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-2].text.begin); + yyval.declarator->params = yystack.l_mark[-1].param_list; + yyval.declarator->func_stack = d; + yyval.declarator->head = yyval.declarator; + yyval.declarator->func_def = FUNC_ANSI; + } +break; +case 114: +#line 1002 "grammar.y" + { + Declarator *d; + + d = new_declarator("", "", yystack.l_mark[-1].text.begin); + yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-1].text.begin); + yyval.declarator->func_stack = d; + yyval.declarator->head = yyval.declarator; + yyval.declarator->func_def = FUNC_ANSI; + } +break; +#line 1965 "grammar.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/grammar.tab.h b/contrib/byacc/test/grammar.tab.h new file mode 100644 index 00000000000..531dd2e849b --- /dev/null +++ b/contrib/byacc/test/grammar.tab.h @@ -0,0 +1,35 @@ +#define T_IDENTIFIER 257 +#define T_TYPEDEF_NAME 258 +#define T_DEFINE_NAME 259 +#define T_AUTO 260 +#define T_EXTERN 261 +#define T_REGISTER 262 +#define T_STATIC 263 +#define T_TYPEDEF 264 +#define T_INLINE 265 +#define T_EXTENSION 266 +#define T_CHAR 267 +#define T_DOUBLE 268 +#define T_FLOAT 269 +#define T_INT 270 +#define T_VOID 271 +#define T_LONG 272 +#define T_SHORT 273 +#define T_SIGNED 274 +#define T_UNSIGNED 275 +#define T_ENUM 276 +#define T_STRUCT 277 +#define T_UNION 278 +#define T_Bool 279 +#define T_Complex 280 +#define T_Imaginary 281 +#define T_TYPE_QUALIFIER 282 +#define T_BRACKETS 283 +#define T_LBRACE 284 +#define T_MATCHRBRACE 285 +#define T_ELLIPSIS 286 +#define T_INITIALIZER 287 +#define T_STRING_LITERAL 288 +#define T_ASM 289 +#define T_ASMARG 290 +#define T_VA_DCL 291 diff --git a/contrib/byacc/test/grammar.y b/contrib/byacc/test/grammar.y new file mode 100644 index 00000000000..67555226837 --- /dev/null +++ b/contrib/byacc/test/grammar.y @@ -0,0 +1,1183 @@ +/* $Id: grammar.y,v 1.5 2012/01/15 20:00:59 tom Exp $ + * + * yacc grammar for C function prototype generator + * This was derived from the grammar in Appendix A of + * "The C Programming Language" by Kernighan and Ritchie. + */ +%expect 1 +%{ +#ifdef YYBISON +#include +#define YYSTYPE_IS_DECLARED +#define yyerror yaccError +#endif + +#if defined(YYBISON) || !defined(YYBYACC) +static void yyerror(const char *s); +#endif +%} + +%token '(' '*' '&' + /* identifiers that are not reserved words */ + T_IDENTIFIER T_TYPEDEF_NAME T_DEFINE_NAME + + /* storage class */ + T_AUTO T_EXTERN T_REGISTER T_STATIC T_TYPEDEF + /* This keyword included for compatibility with C++. */ + T_INLINE + /* This keyword included for compatibility with GCC */ + T_EXTENSION + + /* type specifiers */ + T_CHAR T_DOUBLE T_FLOAT T_INT T_VOID + T_LONG T_SHORT T_SIGNED T_UNSIGNED + T_ENUM T_STRUCT T_UNION + /* C9X new types */ + T_Bool T_Complex T_Imaginary + + /* type qualifiers */ + T_TYPE_QUALIFIER + + /* paired square brackets and everything between them: [ ... ] */ + T_BRACKETS + +%token + /* left brace */ + T_LBRACE + /* all input to the matching right brace */ + T_MATCHRBRACE + + /* three periods */ + T_ELLIPSIS + + /* constant expression or paired braces following an equal sign */ + T_INITIALIZER + + /* string literal */ + T_STRING_LITERAL + + /* asm */ + T_ASM + /* ( "string literal" ) following asm keyword */ + T_ASMARG + + /* va_dcl from */ + T_VA_DCL + +%type decl_specifiers decl_specifier +%type storage_class type_specifier type_qualifier +%type struct_or_union_specifier enum_specifier +%type init_declarator_list +%type init_declarator declarator direct_declarator +%type abs_declarator direct_abs_declarator +%type parameter_type_list parameter_list +%type parameter_declaration +%type opt_identifier_list identifier_list +%type struct_or_union pointer opt_type_qualifiers type_qualifier_list + any_id identifier_or_ref +%type enumeration + +%{ +#include +#include +#include + +#define OPT_LINTLIBRARY 1 + +#ifndef TRUE +#define TRUE (1) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +/* #include "cproto.h" */ +#define MAX_TEXT_SIZE 1024 + +/* Prototype styles */ +#if OPT_LINTLIBRARY +#define PROTO_ANSI_LLIB -2 /* form ANSI lint-library source */ +#define PROTO_LINTLIBRARY -1 /* form lint-library source */ +#endif +#define PROTO_NONE 0 /* do not output any prototypes */ +#define PROTO_TRADITIONAL 1 /* comment out parameters */ +#define PROTO_ABSTRACT 2 /* comment out parameter names */ +#define PROTO_ANSI 3 /* ANSI C prototype */ + +typedef int PrototypeStyle; + +typedef char boolean; + +extern boolean types_out; +extern PrototypeStyle proto_style; + +#define ansiLintLibrary() (proto_style == PROTO_ANSI_LLIB) +#define knrLintLibrary() (proto_style == PROTO_LINTLIBRARY) +#define lintLibrary() (knrLintLibrary() || ansiLintLibrary()) + +#if OPT_LINTLIBRARY +#define FUNC_UNKNOWN -1 /* unspecified */ +#else +#define FUNC_UNKNOWN 0 /* unspecified (same as FUNC_NONE) */ +#endif +#define FUNC_NONE 0 /* not a function definition */ +#define FUNC_TRADITIONAL 1 /* traditional style */ +#define FUNC_ANSI 2 /* ANSI style */ +#define FUNC_BOTH 3 /* both styles */ + +typedef int FuncDefStyle; + +/* Source file text */ +typedef struct text { + char text[MAX_TEXT_SIZE]; /* source text */ + long begin; /* offset in temporary file */ +} Text; + +/* Declaration specifier flags */ +#define DS_NONE 0 /* default */ +#define DS_EXTERN 1 /* contains "extern" specifier */ +#define DS_STATIC 2 /* contains "static" specifier */ +#define DS_CHAR 4 /* contains "char" type specifier */ +#define DS_SHORT 8 /* contains "short" type specifier */ +#define DS_FLOAT 16 /* contains "float" type specifier */ +#define DS_INLINE 32 /* contains "inline" specifier */ +#define DS_JUNK 64 /* we're not interested in this declaration */ + +/* This structure stores information about a declaration specifier. */ +typedef struct decl_spec { + unsigned short flags; /* flags defined above */ + char *text; /* source text */ + long begin; /* offset in temporary file */ +} DeclSpec; + +/* This is a list of function parameters. */ +typedef struct _ParameterList { + struct parameter *first; /* pointer to first parameter in list */ + struct parameter *last; /* pointer to last parameter in list */ + long begin_comment; /* begin offset of comment */ + long end_comment; /* end offset of comment */ + char *comment; /* comment at start of parameter list */ +} ParameterList; + +/* This structure stores information about a declarator. */ +typedef struct _Declarator { + char *name; /* name of variable or function */ + char *text; /* source text */ + long begin; /* offset in temporary file */ + long begin_comment; /* begin offset of comment */ + long end_comment; /* end offset of comment */ + FuncDefStyle func_def; /* style of function definition */ + ParameterList params; /* function parameters */ + boolean pointer; /* TRUE if it declares a pointer */ + struct _Declarator *head; /* head function declarator */ + struct _Declarator *func_stack; /* stack of function declarators */ + struct _Declarator *next; /* next declarator in list */ +} Declarator; + +/* This structure stores information about a function parameter. */ +typedef struct parameter { + struct parameter *next; /* next parameter in list */ + DeclSpec decl_spec; + Declarator *declarator; + char *comment; /* comment following the parameter */ +} Parameter; + +/* This is a list of declarators. */ +typedef struct declarator_list { + Declarator *first; /* pointer to first declarator in list */ + Declarator *last; /* pointer to last declarator in list */ +} DeclaratorList; + +/* #include "symbol.h" */ +typedef struct symbol { + struct symbol *next; /* next symbol in list */ + char *name; /* name of symbol */ + char *value; /* value of symbol (for defines) */ + short flags; /* symbol attributes */ +} Symbol; + +/* parser stack entry type */ +typedef union { + Text text; + DeclSpec decl_spec; + Parameter *parameter; + ParameterList param_list; + Declarator *declarator; + DeclaratorList decl_list; +} YYSTYPE; + +/* The hash table length should be a prime number. */ +#define SYM_MAX_HASH 251 + +typedef struct symbol_table { + Symbol *bucket[SYM_MAX_HASH]; /* hash buckets */ +} SymbolTable; + +extern SymbolTable *new_symbol_table /* Create symbol table */ + (void); +extern void free_symbol_table /* Destroy symbol table */ + (SymbolTable *s); +extern Symbol *find_symbol /* Lookup symbol name */ + (SymbolTable *s, const char *n); +extern Symbol *new_symbol /* Define new symbol */ + (SymbolTable *s, const char *n, const char *v, int f); + +/* #include "semantic.h" */ +extern void new_decl_spec (DeclSpec *, const char *, long, int); +extern void free_decl_spec (DeclSpec *); +extern void join_decl_specs (DeclSpec *, DeclSpec *, DeclSpec *); +extern void check_untagged (DeclSpec *); +extern Declarator *new_declarator (const char *, const char *, long); +extern void free_declarator (Declarator *); +extern void new_decl_list (DeclaratorList *, Declarator *); +extern void free_decl_list (DeclaratorList *); +extern void add_decl_list (DeclaratorList *, DeclaratorList *, Declarator *); +extern Parameter *new_parameter (DeclSpec *, Declarator *); +extern void free_parameter (Parameter *); +extern void new_param_list (ParameterList *, Parameter *); +extern void free_param_list (ParameterList *); +extern void add_param_list (ParameterList *, ParameterList *, Parameter *); +extern void new_ident_list (ParameterList *); +extern void add_ident_list (ParameterList *, ParameterList *, const char *); +extern void set_param_types (ParameterList *, DeclSpec *, DeclaratorList *); +extern void gen_declarations (DeclSpec *, DeclaratorList *); +extern void gen_prototype (DeclSpec *, Declarator *); +extern void gen_func_declarator (Declarator *); +extern void gen_func_definition (DeclSpec *, Declarator *); + +extern void init_parser (void); +extern void process_file (FILE *infile, char *name); +extern char *cur_text (void); +extern char *cur_file_name (void); +extern char *implied_typedef (void); +extern void include_file (char *name, int convert); +extern char *supply_parm (int count); +extern char *xstrdup (const char *); +extern int already_declared (char *name); +extern int is_actual_func (Declarator *d); +extern int lint_ellipsis (Parameter *p); +extern int want_typedef (void); +extern void begin_tracking (void); +extern void begin_typedef (void); +extern void copy_typedef (char *s); +extern void ellipsis_varargs (Declarator *d); +extern void end_typedef (void); +extern void flush_varargs (void); +extern void fmt_library (int code); +extern void imply_typedef (const char *s); +extern void indent (FILE *outf); +extern void put_blankline (FILE *outf); +extern void put_body (FILE *outf, DeclSpec *decl_spec, Declarator *declarator); +extern void put_char (FILE *outf, int c); +extern void put_error (void); +extern void put_newline (FILE *outf); +extern void put_padded (FILE *outf, const char *s); +extern void put_string (FILE *outf, const char *s); +extern void track_in (void); + +extern boolean file_comments; +extern FuncDefStyle func_style; +extern char base_file[]; + +extern int yylex (void); + +/* declaration specifier attributes for the typedef statement currently being + * scanned + */ +static int cur_decl_spec_flags; + +/* pointer to parameter list for the current function definition */ +static ParameterList *func_params; + +/* A parser semantic action sets this pointer to the current declarator in + * a function parameter declaration in order to catch any comments following + * the parameter declaration on the same line. If the lexer scans a comment + * and is not NULL, then the comment is attached to the + * declarator. To ignore subsequent comments, the lexer sets this to NULL + * after scanning a comment or end of line. + */ +static Declarator *cur_declarator; + +/* temporary string buffer */ +static char buf[MAX_TEXT_SIZE]; + +/* table of typedef names */ +static SymbolTable *typedef_names; + +/* table of define names */ +static SymbolTable *define_names; + +/* table of type qualifiers */ +static SymbolTable *type_qualifiers; + +/* information about the current input file */ +typedef struct { + char *base_name; /* base input file name */ + char *file_name; /* current file name */ + FILE *file; /* input file */ + unsigned line_num; /* current line number in input file */ + FILE *tmp_file; /* temporary file */ + long begin_comment; /* tmp file offset after last written ) or ; */ + long end_comment; /* tmp file offset after last comment */ + boolean convert; /* if TRUE, convert function definitions */ + boolean changed; /* TRUE if conversion done in this file */ +} IncludeStack; + +static IncludeStack *cur_file; /* current input file */ + +/* #include "yyerror.c" */ + +static int haveAnsiParam (void); + + +/* Flags to enable us to find if a procedure returns a value. + */ +static int return_val; /* nonzero on BRACES iff return-expression found */ + +static const char * +dft_decl_spec (void) +{ + return (lintLibrary() && !return_val) ? "void" : "int"; +} + +static int +haveAnsiParam (void) +{ + Parameter *p; + if (func_params != 0) { + for (p = func_params->first; p != 0; p = p->next) { + if (p->declarator->func_def == FUNC_ANSI) { + return TRUE; + } + } + } + return FALSE; +} +%} +%% + +program + : /* empty */ + | translation_unit + ; + +translation_unit + : external_declaration + | translation_unit external_declaration + ; + +external_declaration + : declaration + | function_definition + | ';' + | linkage_specification + | T_ASM T_ASMARG ';' + | error T_MATCHRBRACE + { + yyerrok; + } + | error ';' + { + yyerrok; + } + ; + +braces + : T_LBRACE T_MATCHRBRACE + ; + +linkage_specification + : T_EXTERN T_STRING_LITERAL braces + { + /* Provide an empty action here so bison will not complain about + * incompatible types in the default action it normally would + * have generated. + */ + } + | T_EXTERN T_STRING_LITERAL declaration + { + /* empty */ + } + ; + +declaration + : decl_specifiers ';' + { +#if OPT_LINTLIBRARY + if (types_out && want_typedef()) { + gen_declarations(&$1, (DeclaratorList *)0); + flush_varargs(); + } +#endif + free_decl_spec(&$1); + end_typedef(); + } + | decl_specifiers init_declarator_list ';' + { + if (func_params != NULL) { + set_param_types(func_params, &$1, &$2); + } else { + gen_declarations(&$1, &$2); +#if OPT_LINTLIBRARY + flush_varargs(); +#endif + free_decl_list(&$2); + } + free_decl_spec(&$1); + end_typedef(); + } + | any_typedef decl_specifiers + { + cur_decl_spec_flags = $2.flags; + free_decl_spec(&$2); + } + opt_declarator_list ';' + { + end_typedef(); + } + ; + +any_typedef + : T_EXTENSION T_TYPEDEF + { + begin_typedef(); + } + | T_TYPEDEF + { + begin_typedef(); + } + ; + +opt_declarator_list + : /* empty */ + | declarator_list + ; + +declarator_list + : declarator + { + int flags = cur_decl_spec_flags; + + /* If the typedef is a pointer type, then reset the short type + * flags so it does not get promoted. + */ + if (strcmp($1->text, $1->name) != 0) + flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT); + new_symbol(typedef_names, $1->name, NULL, flags); + free_declarator($1); + } + | declarator_list ',' declarator + { + int flags = cur_decl_spec_flags; + + if (strcmp($3->text, $3->name) != 0) + flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT); + new_symbol(typedef_names, $3->name, NULL, flags); + free_declarator($3); + } + ; + +function_definition + : decl_specifiers declarator + { + check_untagged(&$1); + if ($2->func_def == FUNC_NONE) { + yyerror("syntax error"); + YYERROR; + } + func_params = &($2->head->params); + func_params->begin_comment = cur_file->begin_comment; + func_params->end_comment = cur_file->end_comment; + } + opt_declaration_list T_LBRACE + { + /* If we're converting to K&R and we've got a nominally K&R + * function which has a parameter which is ANSI (i.e., a prototyped + * function pointer), then we must override the deciphered value of + * 'func_def' so that the parameter will be converted. + */ + if (func_style == FUNC_TRADITIONAL + && haveAnsiParam() + && $2->head->func_def == func_style) { + $2->head->func_def = FUNC_BOTH; + } + + func_params = NULL; + + if (cur_file->convert) + gen_func_definition(&$1, $2); + gen_prototype(&$1, $2); +#if OPT_LINTLIBRARY + flush_varargs(); +#endif + free_decl_spec(&$1); + free_declarator($2); + } + T_MATCHRBRACE + | declarator + { + if ($1->func_def == FUNC_NONE) { + yyerror("syntax error"); + YYERROR; + } + func_params = &($1->head->params); + func_params->begin_comment = cur_file->begin_comment; + func_params->end_comment = cur_file->end_comment; + } + opt_declaration_list T_LBRACE T_MATCHRBRACE + { + DeclSpec decl_spec; + + func_params = NULL; + + new_decl_spec(&decl_spec, dft_decl_spec(), $1->begin, DS_NONE); + if (cur_file->convert) + gen_func_definition(&decl_spec, $1); + gen_prototype(&decl_spec, $1); +#if OPT_LINTLIBRARY + flush_varargs(); +#endif + free_decl_spec(&decl_spec); + free_declarator($1); + } + ; + +opt_declaration_list + : /* empty */ + | T_VA_DCL + | declaration_list + ; + +declaration_list + : declaration + | declaration_list declaration + ; + +decl_specifiers + : decl_specifier + | decl_specifiers decl_specifier + { + join_decl_specs(&$$, &$1, &$2); + free($1.text); + free($2.text); + } + ; + +decl_specifier + : storage_class + | type_specifier + | type_qualifier + ; + +storage_class + : T_AUTO + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_EXTERN + { + new_decl_spec(&$$, $1.text, $1.begin, DS_EXTERN); + } + | T_REGISTER + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_STATIC + { + new_decl_spec(&$$, $1.text, $1.begin, DS_STATIC); + } + | T_INLINE + { + new_decl_spec(&$$, $1.text, $1.begin, DS_INLINE); + } + | T_EXTENSION + { + new_decl_spec(&$$, $1.text, $1.begin, DS_JUNK); + } + ; + +type_specifier + : T_CHAR + { + new_decl_spec(&$$, $1.text, $1.begin, DS_CHAR); + } + | T_DOUBLE + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_FLOAT + { + new_decl_spec(&$$, $1.text, $1.begin, DS_FLOAT); + } + | T_INT + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_LONG + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_SHORT + { + new_decl_spec(&$$, $1.text, $1.begin, DS_SHORT); + } + | T_SIGNED + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_UNSIGNED + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_VOID + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_Bool + { + new_decl_spec(&$$, $1.text, $1.begin, DS_CHAR); + } + | T_Complex + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_Imaginary + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_TYPEDEF_NAME + { + Symbol *s; + s = find_symbol(typedef_names, $1.text); + if (s != NULL) + new_decl_spec(&$$, $1.text, $1.begin, s->flags); + } + | struct_or_union_specifier + | enum_specifier + ; + +type_qualifier + : T_TYPE_QUALIFIER + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_DEFINE_NAME + { + /* This rule allows the nonterminal to scan #define + * names as if they were type modifiers. + */ + Symbol *s; + s = find_symbol(define_names, $1.text); + if (s != NULL) + new_decl_spec(&$$, $1.text, $1.begin, s->flags); + } + ; + +struct_or_union_specifier + : struct_or_union any_id braces + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "%s %s", $1.text, $2.text); + new_decl_spec(&$$, s, $1.begin, DS_NONE); + } + | struct_or_union braces + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "%s {}", $1.text); + new_decl_spec(&$$, s, $1.begin, DS_NONE); + } + | struct_or_union any_id + { + (void)sprintf(buf, "%s %s", $1.text, $2.text); + new_decl_spec(&$$, buf, $1.begin, DS_NONE); + } + ; + +struct_or_union + : T_STRUCT + { + imply_typedef($$.text); + } + | T_UNION + { + imply_typedef($$.text); + } + ; + +init_declarator_list + : init_declarator + { + new_decl_list(&$$, $1); + } + | init_declarator_list ',' init_declarator + { + add_decl_list(&$$, &$1, $3); + } + ; + +init_declarator + : declarator + { + if ($1->func_def != FUNC_NONE && func_params == NULL && + func_style == FUNC_TRADITIONAL && cur_file->convert) { + gen_func_declarator($1); + fputs(cur_text(), cur_file->tmp_file); + } + cur_declarator = $$; + } + | declarator '=' + { + if ($1->func_def != FUNC_NONE && func_params == NULL && + func_style == FUNC_TRADITIONAL && cur_file->convert) { + gen_func_declarator($1); + fputs(" =", cur_file->tmp_file); + } + } + T_INITIALIZER + ; + +enum_specifier + : enumeration any_id braces + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "enum %s", $2.text); + new_decl_spec(&$$, s, $1.begin, DS_NONE); + } + | enumeration braces + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "%s {}", $1.text); + new_decl_spec(&$$, s, $1.begin, DS_NONE); + } + | enumeration any_id + { + (void)sprintf(buf, "enum %s", $2.text); + new_decl_spec(&$$, buf, $1.begin, DS_NONE); + } + ; + +enumeration + : T_ENUM + { + imply_typedef("enum"); + $$ = $1; + } + ; + +any_id + : T_IDENTIFIER + | T_TYPEDEF_NAME + ; + +declarator + : pointer direct_declarator + { + $$ = $2; + (void)sprintf(buf, "%s%s", $1.text, $$->text); + free($$->text); + $$->text = xstrdup(buf); + $$->begin = $1.begin; + $$->pointer = TRUE; + } + | direct_declarator + ; + +direct_declarator + : identifier_or_ref + { + $$ = new_declarator($1.text, $1.text, $1.begin); + } + | '(' declarator ')' + { + $$ = $2; + (void)sprintf(buf, "(%s)", $$->text); + free($$->text); + $$->text = xstrdup(buf); + $$->begin = $1.begin; + } + | direct_declarator T_BRACKETS + { + $$ = $1; + (void)sprintf(buf, "%s%s", $$->text, $2.text); + free($$->text); + $$->text = xstrdup(buf); + } + | direct_declarator '(' parameter_type_list ')' + { + $$ = new_declarator("%s()", $1->name, $1->begin); + $$->params = $3; + $$->func_stack = $1; + $$->head = ($1->func_stack == NULL) ? $$ : $1->head; + $$->func_def = FUNC_ANSI; + } + | direct_declarator '(' opt_identifier_list ')' + { + $$ = new_declarator("%s()", $1->name, $1->begin); + $$->params = $3; + $$->func_stack = $1; + $$->head = ($1->func_stack == NULL) ? $$ : $1->head; + $$->func_def = FUNC_TRADITIONAL; + } + ; + +pointer + : '*' opt_type_qualifiers + { + (void)sprintf($$.text, "*%s", $2.text); + $$.begin = $1.begin; + } + | '*' opt_type_qualifiers pointer + { + (void)sprintf($$.text, "*%s%s", $2.text, $3.text); + $$.begin = $1.begin; + } + ; + +opt_type_qualifiers + : /* empty */ + { + strcpy($$.text, ""); + $$.begin = 0L; + } + | type_qualifier_list + ; + +type_qualifier_list + : type_qualifier + { + (void)sprintf($$.text, "%s ", $1.text); + $$.begin = $1.begin; + free($1.text); + } + | type_qualifier_list type_qualifier + { + (void)sprintf($$.text, "%s%s ", $1.text, $2.text); + $$.begin = $1.begin; + free($2.text); + } + ; + +parameter_type_list + : parameter_list + | parameter_list ',' T_ELLIPSIS + { + add_ident_list(&$$, &$1, "..."); + } + ; + +parameter_list + : parameter_declaration + { + new_param_list(&$$, $1); + } + | parameter_list ',' parameter_declaration + { + add_param_list(&$$, &$1, $3); + } + ; + +parameter_declaration + : decl_specifiers declarator + { + check_untagged(&$1); + $$ = new_parameter(&$1, $2); + } + | decl_specifiers abs_declarator + { + check_untagged(&$1); + $$ = new_parameter(&$1, $2); + } + | decl_specifiers + { + check_untagged(&$1); + $$ = new_parameter(&$1, (Declarator *)0); + } + ; + +opt_identifier_list + : /* empty */ + { + new_ident_list(&$$); + } + | identifier_list + ; + +identifier_list + : any_id + { + new_ident_list(&$$); + add_ident_list(&$$, &$$, $1.text); + } + | identifier_list ',' any_id + { + add_ident_list(&$$, &$1, $3.text); + } + ; + +identifier_or_ref + : any_id + { + $$ = $1; + } + | '&' any_id + { +#if OPT_LINTLIBRARY + if (lintLibrary()) { /* Lint doesn't grok C++ ref variables */ + $$ = $2; + } else +#endif + (void)sprintf($$.text, "&%s", $2.text); + $$.begin = $1.begin; + } + ; + +abs_declarator + : pointer + { + $$ = new_declarator($1.text, "", $1.begin); + } + | pointer direct_abs_declarator + { + $$ = $2; + (void)sprintf(buf, "%s%s", $1.text, $$->text); + free($$->text); + $$->text = xstrdup(buf); + $$->begin = $1.begin; + } + | direct_abs_declarator + ; + +direct_abs_declarator + : '(' abs_declarator ')' + { + $$ = $2; + (void)sprintf(buf, "(%s)", $$->text); + free($$->text); + $$->text = xstrdup(buf); + $$->begin = $1.begin; + } + | direct_abs_declarator T_BRACKETS + { + $$ = $1; + (void)sprintf(buf, "%s%s", $$->text, $2.text); + free($$->text); + $$->text = xstrdup(buf); + } + | T_BRACKETS + { + $$ = new_declarator($1.text, "", $1.begin); + } + | direct_abs_declarator '(' parameter_type_list ')' + { + $$ = new_declarator("%s()", "", $1->begin); + $$->params = $3; + $$->func_stack = $1; + $$->head = ($1->func_stack == NULL) ? $$ : $1->head; + $$->func_def = FUNC_ANSI; + } + | direct_abs_declarator '(' ')' + { + $$ = new_declarator("%s()", "", $1->begin); + $$->func_stack = $1; + $$->head = ($1->func_stack == NULL) ? $$ : $1->head; + $$->func_def = FUNC_ANSI; + } + | '(' parameter_type_list ')' + { + Declarator *d; + + d = new_declarator("", "", $1.begin); + $$ = new_declarator("%s()", "", $1.begin); + $$->params = $2; + $$->func_stack = d; + $$->head = $$; + $$->func_def = FUNC_ANSI; + } + | '(' ')' + { + Declarator *d; + + d = new_declarator("", "", $1.begin); + $$ = new_declarator("%s()", "", $1.begin); + $$->func_stack = d; + $$->head = $$; + $$->func_def = FUNC_ANSI; + } + ; + +%% + +/* lex.yy.c */ +#define BEGIN yy_start = 1 + 2 * + +#define CPP1 1 +#define INIT1 2 +#define INIT2 3 +#define CURLY 4 +#define LEXYACC 5 +#define ASM 6 +#define CPP_INLINE 7 + +extern char *yytext; +extern FILE *yyin, *yyout; + +static int curly; /* number of curly brace nesting levels */ +static int ly_count; /* number of occurances of %% */ +static int inc_depth; /* include nesting level */ +static SymbolTable *included_files; /* files already included */ +static int yy_start = 0; /* start state number */ + +#define grammar_error(s) yaccError(s) + +static void +yaccError (const char *msg) +{ + func_params = NULL; + put_error(); /* tell what line we're on, and what file */ + fprintf(stderr, "%s at token '%s'\n", msg, yytext); +} + +/* Initialize the table of type qualifier keywords recognized by the lexical + * analyzer. + */ +void +init_parser (void) +{ + static const char *keywords[] = { + "const", + "restrict", + "volatile", + "interrupt", +#ifdef vms + "noshare", + "readonly", +#endif +#if defined(MSDOS) || defined(OS2) + "__cdecl", + "__export", + "__far", + "__fastcall", + "__fortran", + "__huge", + "__inline", + "__interrupt", + "__loadds", + "__near", + "__pascal", + "__saveregs", + "__segment", + "__stdcall", + "__syscall", + "_cdecl", + "_cs", + "_ds", + "_es", + "_export", + "_far", + "_fastcall", + "_fortran", + "_huge", + "_interrupt", + "_loadds", + "_near", + "_pascal", + "_saveregs", + "_seg", + "_segment", + "_ss", + "cdecl", + "far", + "huge", + "near", + "pascal", +#ifdef OS2 + "__far16", +#endif +#endif +#ifdef __GNUC__ + /* gcc aliases */ + "__builtin_va_arg", + "__builtin_va_list", + "__const", + "__const__", + "__inline", + "__inline__", + "__restrict", + "__restrict__", + "__volatile", + "__volatile__", +#endif + }; + unsigned i; + + /* Initialize type qualifier table. */ + type_qualifiers = new_symbol_table(); + for (i = 0; i < sizeof(keywords)/sizeof(keywords[0]); ++i) { + new_symbol(type_qualifiers, keywords[i], NULL, DS_NONE); + } +} + +/* Process the C source file. Write function prototypes to the standard + * output. Convert function definitions and write the converted source + * code to a temporary file. + */ +void +process_file (FILE *infile, char *name) +{ + char *s; + + if (strlen(name) > 2) { + s = name + strlen(name) - 2; + if (*s == '.') { + ++s; + if (*s == 'l' || *s == 'y') + BEGIN LEXYACC; +#if defined(MSDOS) || defined(OS2) + if (*s == 'L' || *s == 'Y') + BEGIN LEXYACC; +#endif + } + } + + included_files = new_symbol_table(); + typedef_names = new_symbol_table(); + define_names = new_symbol_table(); + inc_depth = -1; + curly = 0; + ly_count = 0; + func_params = NULL; + yyin = infile; + include_file(strcpy(base_file, name), func_style != FUNC_NONE); + if (file_comments) { +#if OPT_LINTLIBRARY + if (lintLibrary()) { + put_blankline(stdout); + begin_tracking(); + } +#endif + put_string(stdout, "/* "); + put_string(stdout, cur_file_name()); + put_string(stdout, " */\n"); + } + yyparse(); + free_symbol_table(define_names); + free_symbol_table(typedef_names); + free_symbol_table(included_files); +} + +#ifdef NO_LEAKS +void +free_parser(void) +{ + free_symbol_table (type_qualifiers); +#ifdef FLEX_SCANNER + if (yy_current_buffer != 0) + yy_delete_buffer(yy_current_buffer); +#endif +} +#endif diff --git a/contrib/byacc/test/pure_calc.output b/contrib/byacc/test/pure_calc.output new file mode 100644 index 00000000000..3aed47511c9 --- /dev/null +++ b/contrib/byacc/test/pure_calc.output @@ -0,0 +1,461 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr '+' expr + 8 | expr '-' expr + 9 | expr '*' expr + 10 | expr '/' expr + 11 | expr '%' expr + 12 | expr '&' expr + 13 | expr '|' expr + 14 | '-' expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + DIGIT shift 3 + LETTER shift 4 + '-' shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + number : DIGIT . (17) + + . reduce 17 + + +state 4 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 11 + '|' reduce 15 + '&' reduce 15 + '+' reduce 15 + '-' reduce 15 + '*' reduce 15 + '/' reduce 15 + '%' reduce 15 + '\n' reduce 15 + + +state 5 + expr : '-' . expr (14) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 13 + number goto 9 + + +state 6 + expr : '(' . expr ')' (6) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + '|' reduce 16 + '&' reduce 16 + '+' reduce 16 + '-' reduce 16 + '*' reduce 16 + '/' reduce 16 + '%' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + stat : LETTER '=' . expr (5) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 12 + expr : LETTER . (15) + + . reduce 15 + + +state 13 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + expr : '-' expr . (14) + + . reduce 14 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr '|' . expr (13) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr '&' . expr (12) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr '+' . expr (7) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr '-' . expr (8) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr '*' . expr (9) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr '/' . expr (10) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '%' . expr (11) + + DIGIT shift 3 + LETTER shift 12 + '-' shift 5 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '|' shift 16 + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +state 26 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + '&' shift 17 + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +state 27 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr '&' expr . (12) + expr : expr . '|' expr (13) + + '+' shift 18 + '-' shift 19 + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 12 + '&' reduce 12 + '\n' reduce 12 + ')' reduce 12 + + +state 28 + expr : expr . '+' expr (7) + expr : expr '+' expr . (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 7 + '&' reduce 7 + '+' reduce 7 + '-' reduce 7 + '\n' reduce 7 + ')' reduce 7 + + +state 29 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr '-' expr . (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + '*' shift 20 + '/' shift 21 + '%' shift 22 + '|' reduce 8 + '&' reduce 8 + '+' reduce 8 + '-' reduce 8 + '\n' reduce 8 + ')' reduce 8 + + +state 30 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr '*' expr . (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 9 + + +state 31 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr '/' expr . (10) + expr : expr . '%' expr (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 10 + + +state 32 + expr : expr . '+' expr (7) + expr : expr . '-' expr (8) + expr : expr . '*' expr (9) + expr : expr . '/' expr (10) + expr : expr . '%' expr (11) + expr : expr '%' expr . (11) + expr : expr . '&' expr (12) + expr : expr . '|' expr (13) + + . reduce 11 + + +16 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/pure_calc.tab.c b/contrib/byacc/test/pure_calc.tab.c new file mode 100644 index 00000000000..eb8c189b508 --- /dev/null +++ b/contrib/byacc/test/pure_calc.tab.c @@ -0,0 +1,687 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse calc_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex calc_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror calc_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar calc_char +#endif /* yychar */ + +#ifndef yyval +#define yyval calc_val +#endif /* yyval */ + +#ifndef yylval +#define yylval calc_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug calc_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs calc_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag calc_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs calc_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen calc_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred calc_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto calc_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex calc_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex calc_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex calc_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable calc_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck calc_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname calc_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule calc_rule +#endif /* yyrule */ +#define YYPREFIX "calc_" + +#define YYPURE 1 + +#line 2 "pure_calc.y" +# include +# include + +int regs[26]; +int base; + +#ifdef YYBISON +#define YYSTYPE int +#define YYLEX_PARAM &yylval +#define YYLEX_DECL() yylex(YYSTYPE *yylval) +#define YYERROR_DECL() yyerror(const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +#line 115 "pure_calc.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# ifdef YYLEX_PARAM_TYPE +# define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLEX_PARAM_TYPE YYLEX_PARAM) +# else +# define YYLEX_DECL() yylex(YYSTYPE *yylval, void * YYLEX_PARAM) +# endif +# define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(YYSTYPE *yylval) +# define YYLEX yylex(&yylval) +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 +#define YYERRCODE 256 +static const short calc_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short calc_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short calc_defred[] = { 1, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 3, + 0, 15, 14, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 9, + 10, 11, +}; +static const short calc_dgoto[] = { 1, + 7, 8, 9, +}; +static const short calc_sindex[] = { 0, + -40, -7, 0, -55, -38, -38, 1, -29, -247, 0, + -38, 0, 0, 22, 0, -38, -38, -38, -38, -38, + -38, -38, 0, -29, 0, 51, 60, -20, -20, 0, + 0, 0, +}; +static const short calc_rindex[] = { 0, + 0, 0, 0, 2, 0, 0, 0, 9, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, -6, 14, 5, 13, 0, + 0, 0, +}; +static const short calc_gindex[] = { 0, + 0, 65, 0, +}; +#define YYTABLESIZE 220 +static const short calc_table[] = { 6, + 16, 6, 10, 13, 5, 11, 5, 22, 17, 23, + 15, 15, 20, 18, 7, 19, 22, 21, 4, 5, + 0, 20, 8, 12, 0, 0, 21, 16, 16, 0, + 0, 16, 16, 16, 13, 16, 0, 16, 15, 15, + 0, 0, 7, 15, 15, 7, 15, 7, 15, 7, + 8, 12, 0, 8, 12, 8, 0, 8, 22, 17, + 0, 0, 25, 20, 18, 0, 19, 0, 21, 13, + 14, 0, 0, 0, 0, 24, 0, 0, 0, 0, + 26, 27, 28, 29, 30, 31, 32, 22, 17, 0, + 0, 0, 20, 18, 16, 19, 22, 21, 0, 0, + 0, 20, 18, 0, 19, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 8, 12, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 3, 12, +}; +static const short calc_check[] = { 40, + 10, 40, 10, 10, 45, 61, 45, 37, 38, 257, + 10, 10, 42, 43, 10, 45, 37, 47, 10, 10, + -1, 42, 10, 10, -1, -1, 47, 37, 38, -1, + -1, 41, 42, 43, 41, 45, -1, 47, 37, 38, + -1, -1, 38, 42, 43, 41, 45, 43, 47, 45, + 38, 38, -1, 41, 41, 43, -1, 45, 37, 38, + -1, -1, 41, 42, 43, -1, 45, -1, 47, 5, + 6, -1, -1, -1, -1, 11, -1, -1, -1, -1, + 16, 17, 18, 19, 20, 21, 22, 37, 38, -1, + -1, -1, 42, 43, 124, 45, 37, 47, -1, -1, + -1, 42, 43, -1, 45, -1, 47, -1, -1, -1, + -1, -1, -1, -1, 124, -1, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 124, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 256, 257, 258, 257, 258, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 259 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr '+' expr", +"expr : expr '-' expr", +"expr : expr '*' expr", +"expr : expr '/' expr", +"expr : expr '%' expr", +"expr : expr '&' expr", +"expr : expr '|' expr", +"expr : '-' expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +#line 72 "pure_calc.y" + /* start of programs */ + +#ifdef YYBYACC +static int YYLEX_DECL(); +#endif + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +YYERROR_DECL() +{ + fprintf(stderr, "%s\n", s); +} + +int +YYLEX_DECL() +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + *yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + *yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 354 "pure_calc.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yyerrflag; + int yychar; + YYSTYPE yyval; + YYSTYPE yylval; + + /* variables for the parser stack */ + YYSTACKDATA yystack; + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 34 "pure_calc.y" + { yyerrok ; } +break; +case 4: +#line 38 "pure_calc.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 40 "pure_calc.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 44 "pure_calc.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 46 "pure_calc.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 48 "pure_calc.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 50 "pure_calc.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 52 "pure_calc.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 54 "pure_calc.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 56 "pure_calc.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 58 "pure_calc.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 60 "pure_calc.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 62 "pure_calc.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 67 "pure_calc.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 69 "pure_calc.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 627 "pure_calc.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/pure_calc.tab.h b/contrib/byacc/test/pure_calc.tab.h new file mode 100644 index 00000000000..19211182d6b --- /dev/null +++ b/contrib/byacc/test/pure_calc.tab.h @@ -0,0 +1,3 @@ +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 diff --git a/contrib/byacc/test/pure_calc.y b/contrib/byacc/test/pure_calc.y new file mode 100644 index 00000000000..3cd04332dcd --- /dev/null +++ b/contrib/byacc/test/pure_calc.y @@ -0,0 +1,116 @@ +%{ +# include +# include + +int regs[26]; +int base; + +#ifdef YYBISON +#define YYSTYPE int +#define YYLEX_PARAM &yylval +#define YYLEX_DECL() yylex(YYSTYPE *yylval) +#define YYERROR_DECL() yyerror(const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +%} + +%start list + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr '+' expr + { $$ = $1 + $3; } + | expr '-' expr + { $$ = $1 - $3; } + | expr '*' expr + { $$ = $1 * $3; } + | expr '/' expr + { $$ = $1 / $3; } + | expr '%' expr + { $$ = $1 % $3; } + | expr '&' expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | '-' expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +#ifdef YYBYACC +static int YYLEX_DECL(); +#endif + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +YYERROR_DECL() +{ + fprintf(stderr, "%s\n", s); +} + +int +YYLEX_DECL() +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + *yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + *yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/contrib/byacc/test/pure_error.output b/contrib/byacc/test/pure_error.output new file mode 100644 index 00000000000..0c4db6225e2 --- /dev/null +++ b/contrib/byacc/test/pure_error.output @@ -0,0 +1,27 @@ + 0 $accept : S $end + + 1 S : error + +state 0 + $accept : . S $end (0) + + error shift 1 + . error + + S goto 2 + + +state 1 + S : error . (1) + + . reduce 1 + + +state 2 + $accept : S . $end (0) + + $end accept + + +2 terminals, 2 nonterminals +2 grammar rules, 3 states diff --git a/contrib/byacc/test/pure_error.tab.c b/contrib/byacc/test/pure_error.tab.c new file mode 100644 index 00000000000..98de3d8299b --- /dev/null +++ b/contrib/byacc/test/pure_error.tab.c @@ -0,0 +1,517 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse error_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex error_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror error_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar error_char +#endif /* yychar */ + +#ifndef yyval +#define yyval error_val +#endif /* yyval */ + +#ifndef yylval +#define yylval error_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug error_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs error_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag error_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs error_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen error_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred error_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto error_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex error_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex error_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex error_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable error_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck error_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname error_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule error_rule +#endif /* yyrule */ +#define YYPREFIX "error_" + +#define YYPURE 1 + +#line 2 "pure_error.y" + +#ifdef YYBISON +#define YYSTYPE int +#define YYLEX_PARAM &yylval +#define YYLEX_DECL() yylex(YYSTYPE *yylval) +#define YYERROR_DECL() yyerror(const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +#line 110 "pure_error.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# ifdef YYLEX_PARAM_TYPE +# define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLEX_PARAM_TYPE YYLEX_PARAM) +# else +# define YYLEX_DECL() yylex(YYSTYPE *yylval, void * YYLEX_PARAM) +# endif +# define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(YYSTYPE *yylval) +# define YYLEX yylex(&yylval) +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define YYERRCODE 256 +static const short error_lhs[] = { -1, + 0, +}; +static const short error_len[] = { 2, + 1, +}; +static const short error_defred[] = { 0, + 1, 0, +}; +static const short error_dgoto[] = { 2, +}; +static const short error_sindex[] = { -256, + 0, 0, +}; +static const short error_rindex[] = { 0, + 0, 0, +}; +static const short error_gindex[] = { 0, +}; +#define YYTABLESIZE 0 +static const short error_table[] = { 1, +}; +static const short error_check[] = { 256, +}; +#define YYFINAL 2 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 0 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file", +}; +static const char *yyrule[] = { +"$accept : S", +"S : error", + +}; +#endif + +int yydebug; +int yynerrs; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +#line 17 "pure_error.y" + +#include + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main(void) +{ + printf("yyparse() = %d\n", yyparse()); + return 0; +} + +int +yylex(YYSTYPE *value) +{ + return value ? 0 : -1; +} + +static void +yyerror(const char* s) +{ + printf("%s\n", s); +} +#line 245 "pure_error.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yyerrflag; + int yychar; + YYSTYPE yyval; + YYSTYPE yylval; + + /* variables for the parser stack */ + YYSTACKDATA yystack; + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/pure_error.tab.h b/contrib/byacc/test/pure_error.tab.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/contrib/byacc/test/pure_error.y b/contrib/byacc/test/pure_error.y new file mode 100644 index 00000000000..fe7a3c3094f --- /dev/null +++ b/contrib/byacc/test/pure_error.y @@ -0,0 +1,41 @@ +%{ + +#ifdef YYBISON +#define YYSTYPE int +#define YYLEX_PARAM &yylval +#define YYLEX_DECL() yylex(YYSTYPE *yylval) +#define YYERROR_DECL() yyerror(const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +%} + +%% +S: error +%% + +#include + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main(void) +{ + printf("yyparse() = %d\n", yyparse()); + return 0; +} + +int +yylex(YYSTYPE *value) +{ + return value ? 0 : -1; +} + +static void +yyerror(const char* s) +{ + printf("%s\n", s); +} diff --git a/contrib/byacc/test/quote_calc-s.output b/contrib/byacc/test/quote_calc-s.output new file mode 100644 index 00000000000..0306652bfaa --- /dev/null +++ b/contrib/byacc/test/quote_calc-s.output @@ -0,0 +1,557 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr OP_ADD expr + 8 | expr OP_SUB expr + 9 | expr OP_MUL expr + 10 | expr OP_DIV expr + 11 | expr OP_MOD expr + 12 | expr OP_AND expr + 13 | expr '|' expr + 14 | OP_SUB expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + expr : OP_SUB . expr (14) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 12 + number goto 9 + + +state 4 + number : DIGIT . (17) + + . reduce 17 + + +state 5 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 13 + OP_ADD reduce 15 + OP_SUB reduce 15 + OP_MUL reduce 15 + OP_DIV reduce 15 + OP_MOD reduce 15 + OP_AND reduce 15 + '|' reduce 15 + '\n' reduce 15 + + +state 6 + expr : '(' . expr ')' (6) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + OP_ADD reduce 16 + OP_SUB reduce 16 + OP_MUL reduce 16 + OP_DIV reduce 16 + OP_MOD reduce 16 + OP_AND reduce 16 + '|' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + expr : LETTER . (15) + + . reduce 15 + + +12: shift/reduce conflict (shift 16, reduce 14) on OP_ADD +12: shift/reduce conflict (shift 17, reduce 14) on OP_SUB +12: shift/reduce conflict (shift 18, reduce 14) on OP_MUL +12: shift/reduce conflict (shift 19, reduce 14) on OP_DIV +12: shift/reduce conflict (shift 20, reduce 14) on OP_MOD +12: shift/reduce conflict (shift 21, reduce 14) on OP_AND +state 12 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + expr : OP_SUB expr . (14) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' reduce 14 + '\n' reduce 14 + ')' reduce 14 + + +state 13 + stat : LETTER '=' . expr (5) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr OP_ADD . expr (7) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr OP_SUB . expr (8) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr OP_MUL . expr (9) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr OP_DIV . expr (10) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr OP_MOD . expr (11) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr OP_AND . expr (12) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '|' . expr (13) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +26: shift/reduce conflict (shift 16, reduce 7) on OP_ADD +26: shift/reduce conflict (shift 17, reduce 7) on OP_SUB +26: shift/reduce conflict (shift 18, reduce 7) on OP_MUL +26: shift/reduce conflict (shift 19, reduce 7) on OP_DIV +26: shift/reduce conflict (shift 20, reduce 7) on OP_MOD +26: shift/reduce conflict (shift 21, reduce 7) on OP_AND +26: shift/reduce conflict (shift 22, reduce 7) on '|' +state 26 + expr : expr . OP_ADD expr (7) + expr : expr OP_ADD expr . (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 7 + ')' reduce 7 + + +27: shift/reduce conflict (shift 16, reduce 8) on OP_ADD +27: shift/reduce conflict (shift 17, reduce 8) on OP_SUB +27: shift/reduce conflict (shift 18, reduce 8) on OP_MUL +27: shift/reduce conflict (shift 19, reduce 8) on OP_DIV +27: shift/reduce conflict (shift 20, reduce 8) on OP_MOD +27: shift/reduce conflict (shift 21, reduce 8) on OP_AND +27: shift/reduce conflict (shift 22, reduce 8) on '|' +state 27 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr OP_SUB expr . (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 8 + ')' reduce 8 + + +28: shift/reduce conflict (shift 16, reduce 9) on OP_ADD +28: shift/reduce conflict (shift 17, reduce 9) on OP_SUB +28: shift/reduce conflict (shift 18, reduce 9) on OP_MUL +28: shift/reduce conflict (shift 19, reduce 9) on OP_DIV +28: shift/reduce conflict (shift 20, reduce 9) on OP_MOD +28: shift/reduce conflict (shift 21, reduce 9) on OP_AND +28: shift/reduce conflict (shift 22, reduce 9) on '|' +state 28 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr OP_MUL expr . (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 9 + ')' reduce 9 + + +29: shift/reduce conflict (shift 16, reduce 10) on OP_ADD +29: shift/reduce conflict (shift 17, reduce 10) on OP_SUB +29: shift/reduce conflict (shift 18, reduce 10) on OP_MUL +29: shift/reduce conflict (shift 19, reduce 10) on OP_DIV +29: shift/reduce conflict (shift 20, reduce 10) on OP_MOD +29: shift/reduce conflict (shift 21, reduce 10) on OP_AND +29: shift/reduce conflict (shift 22, reduce 10) on '|' +state 29 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr OP_DIV expr . (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 10 + ')' reduce 10 + + +30: shift/reduce conflict (shift 16, reduce 11) on OP_ADD +30: shift/reduce conflict (shift 17, reduce 11) on OP_SUB +30: shift/reduce conflict (shift 18, reduce 11) on OP_MUL +30: shift/reduce conflict (shift 19, reduce 11) on OP_DIV +30: shift/reduce conflict (shift 20, reduce 11) on OP_MOD +30: shift/reduce conflict (shift 21, reduce 11) on OP_AND +30: shift/reduce conflict (shift 22, reduce 11) on '|' +state 30 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr OP_MOD expr . (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 11 + ')' reduce 11 + + +31: shift/reduce conflict (shift 16, reduce 12) on OP_ADD +31: shift/reduce conflict (shift 17, reduce 12) on OP_SUB +31: shift/reduce conflict (shift 18, reduce 12) on OP_MUL +31: shift/reduce conflict (shift 19, reduce 12) on OP_DIV +31: shift/reduce conflict (shift 20, reduce 12) on OP_MOD +31: shift/reduce conflict (shift 21, reduce 12) on OP_AND +31: shift/reduce conflict (shift 22, reduce 12) on '|' +state 31 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr OP_AND expr . (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 12 + ')' reduce 12 + + +32: shift/reduce conflict (shift 16, reduce 13) on OP_ADD +32: shift/reduce conflict (shift 17, reduce 13) on OP_SUB +32: shift/reduce conflict (shift 18, reduce 13) on OP_MUL +32: shift/reduce conflict (shift 19, reduce 13) on OP_DIV +32: shift/reduce conflict (shift 20, reduce 13) on OP_MOD +32: shift/reduce conflict (shift 21, reduce 13) on OP_AND +state 32 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +State 12 contains 6 shift/reduce conflicts. +State 26 contains 7 shift/reduce conflicts. +State 27 contains 7 shift/reduce conflicts. +State 28 contains 7 shift/reduce conflicts. +State 29 contains 7 shift/reduce conflicts. +State 30 contains 7 shift/reduce conflicts. +State 31 contains 7 shift/reduce conflicts. +State 32 contains 6 shift/reduce conflicts. + + +28 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/quote_calc-s.tab.c b/contrib/byacc/test/quote_calc-s.tab.c new file mode 100644 index 00000000000..15346fdcfaf --- /dev/null +++ b/contrib/byacc/test/quote_calc-s.tab.c @@ -0,0 +1,687 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse quote_calc_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex quote_calc_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror quote_calc_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar quote_calc_char +#endif /* yychar */ + +#ifndef yyval +#define yyval quote_calc_val +#endif /* yyval */ + +#ifndef yylval +#define yylval quote_calc_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug quote_calc_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs quote_calc_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag quote_calc_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs quote_calc_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen quote_calc_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred quote_calc_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto quote_calc_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex quote_calc_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex quote_calc_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex quote_calc_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable quote_calc_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck quote_calc_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname quote_calc_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule quote_calc_rule +#endif /* yyrule */ +#define YYPREFIX "quote_calc_" + +#define YYPURE 0 + +#line 2 "quote_calc.y" +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +#line 109 "quote_calc-s.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 +#define YYERRCODE 256 +static const short quote_calc_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short quote_calc_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short quote_calc_defred[] = { 1, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 3, + 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 0, + 0, 0, +}; +static const short quote_calc_dgoto[] = { 1, + 7, 8, 9, +}; +static const short quote_calc_sindex[] = { 0, + -38, 5, -36, 0, -51, -36, 7, -121, -248, 0, + 0, -243, -36, -22, 0, -36, -36, -36, -36, -36, + -36, -36, 0, -121, 0, -121, -121, -121, -121, -121, + -121, -243, +}; +static const short quote_calc_rindex[] = { 0, + 0, 0, 0, 0, -9, 0, 0, 13, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 0, -3, -2, -1, 1, 2, + 3, -4, +}; +static const short quote_calc_gindex[] = { 0, + 0, 42, 0, +}; +#define YYTABLESIZE 258 +static const short quote_calc_table[] = { 16, + 15, 6, 22, 6, 14, 13, 7, 8, 9, 13, + 10, 11, 12, 16, 10, 17, 15, 18, 25, 19, + 23, 20, 4, 21, 5, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 14, 13, 7, 8, 9, + 0, 10, 11, 12, 12, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 15, 0, 0, 0, 14, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 17, 0, 18, + 0, 19, 0, 20, 0, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 4, 5, 4, 11, 16, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 21, 0, 16, 15, 16, 15, + 16, 15, 16, 15, 16, 15, 16, 15, +}; +static const short quote_calc_check[] = { 10, + 10, 40, 124, 40, 10, 10, 10, 10, 10, 61, + 10, 10, 10, 257, 10, 259, 10, 261, 41, 263, + 269, 265, 10, 267, 10, -1, -1, -1, -1, -1, + 41, -1, -1, -1, -1, 41, 41, 41, 41, 41, + -1, 41, 41, 41, 3, -1, -1, 6, -1, -1, + -1, -1, -1, -1, 13, -1, -1, 16, 17, 18, + 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 124, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 124, 124, -1, -1, -1, 124, 124, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, -1, 259, -1, 261, + -1, 263, -1, 265, -1, 267, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + 259, -1, 259, -1, -1, -1, -1, -1, -1, -1, + 269, 270, 269, 270, 257, -1, 259, -1, 261, -1, + 263, -1, 265, -1, 267, -1, 257, 257, 259, 259, + 261, 261, 263, 263, 265, 265, 267, 267, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 271 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"OP_ADD","\"ADD\"","OP_SUB","\"SUB\"","OP_MUL","\"MUL\"","OP_DIV", +"\"DIV\"","OP_MOD","\"MOD\"","OP_AND","\"AND\"","DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr OP_ADD expr", +"expr : expr OP_SUB expr", +"expr : expr OP_MUL expr", +"expr : expr OP_DIV expr", +"expr : expr OP_MOD expr", +"expr : expr OP_AND expr", +"expr : expr '|' expr", +"expr : OP_SUB expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "quote_calc.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 361 "quote_calc-s.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "quote_calc.y" + { yyerrok ; } +break; +case 4: +#line 39 "quote_calc.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "quote_calc.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "quote_calc.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "quote_calc.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "quote_calc.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "quote_calc.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "quote_calc.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "quote_calc.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "quote_calc.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "quote_calc.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "quote_calc.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "quote_calc.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "quote_calc.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "quote_calc.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 627 "quote_calc-s.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/quote_calc-s.tab.h b/contrib/byacc/test/quote_calc-s.tab.h new file mode 100644 index 00000000000..1a465790341 --- /dev/null +++ b/contrib/byacc/test/quote_calc-s.tab.h @@ -0,0 +1,9 @@ +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 diff --git a/contrib/byacc/test/quote_calc.output b/contrib/byacc/test/quote_calc.output new file mode 100644 index 00000000000..0306652bfaa --- /dev/null +++ b/contrib/byacc/test/quote_calc.output @@ -0,0 +1,557 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr OP_ADD expr + 8 | expr OP_SUB expr + 9 | expr OP_MUL expr + 10 | expr OP_DIV expr + 11 | expr OP_MOD expr + 12 | expr OP_AND expr + 13 | expr '|' expr + 14 | OP_SUB expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + expr : OP_SUB . expr (14) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 12 + number goto 9 + + +state 4 + number : DIGIT . (17) + + . reduce 17 + + +state 5 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 13 + OP_ADD reduce 15 + OP_SUB reduce 15 + OP_MUL reduce 15 + OP_DIV reduce 15 + OP_MOD reduce 15 + OP_AND reduce 15 + '|' reduce 15 + '\n' reduce 15 + + +state 6 + expr : '(' . expr ')' (6) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + OP_ADD reduce 16 + OP_SUB reduce 16 + OP_MUL reduce 16 + OP_DIV reduce 16 + OP_MOD reduce 16 + OP_AND reduce 16 + '|' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + expr : LETTER . (15) + + . reduce 15 + + +12: shift/reduce conflict (shift 16, reduce 14) on OP_ADD +12: shift/reduce conflict (shift 17, reduce 14) on OP_SUB +12: shift/reduce conflict (shift 18, reduce 14) on OP_MUL +12: shift/reduce conflict (shift 19, reduce 14) on OP_DIV +12: shift/reduce conflict (shift 20, reduce 14) on OP_MOD +12: shift/reduce conflict (shift 21, reduce 14) on OP_AND +state 12 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + expr : OP_SUB expr . (14) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' reduce 14 + '\n' reduce 14 + ')' reduce 14 + + +state 13 + stat : LETTER '=' . expr (5) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr OP_ADD . expr (7) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr OP_SUB . expr (8) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr OP_MUL . expr (9) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr OP_DIV . expr (10) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr OP_MOD . expr (11) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr OP_AND . expr (12) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '|' . expr (13) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +26: shift/reduce conflict (shift 16, reduce 7) on OP_ADD +26: shift/reduce conflict (shift 17, reduce 7) on OP_SUB +26: shift/reduce conflict (shift 18, reduce 7) on OP_MUL +26: shift/reduce conflict (shift 19, reduce 7) on OP_DIV +26: shift/reduce conflict (shift 20, reduce 7) on OP_MOD +26: shift/reduce conflict (shift 21, reduce 7) on OP_AND +26: shift/reduce conflict (shift 22, reduce 7) on '|' +state 26 + expr : expr . OP_ADD expr (7) + expr : expr OP_ADD expr . (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 7 + ')' reduce 7 + + +27: shift/reduce conflict (shift 16, reduce 8) on OP_ADD +27: shift/reduce conflict (shift 17, reduce 8) on OP_SUB +27: shift/reduce conflict (shift 18, reduce 8) on OP_MUL +27: shift/reduce conflict (shift 19, reduce 8) on OP_DIV +27: shift/reduce conflict (shift 20, reduce 8) on OP_MOD +27: shift/reduce conflict (shift 21, reduce 8) on OP_AND +27: shift/reduce conflict (shift 22, reduce 8) on '|' +state 27 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr OP_SUB expr . (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 8 + ')' reduce 8 + + +28: shift/reduce conflict (shift 16, reduce 9) on OP_ADD +28: shift/reduce conflict (shift 17, reduce 9) on OP_SUB +28: shift/reduce conflict (shift 18, reduce 9) on OP_MUL +28: shift/reduce conflict (shift 19, reduce 9) on OP_DIV +28: shift/reduce conflict (shift 20, reduce 9) on OP_MOD +28: shift/reduce conflict (shift 21, reduce 9) on OP_AND +28: shift/reduce conflict (shift 22, reduce 9) on '|' +state 28 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr OP_MUL expr . (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 9 + ')' reduce 9 + + +29: shift/reduce conflict (shift 16, reduce 10) on OP_ADD +29: shift/reduce conflict (shift 17, reduce 10) on OP_SUB +29: shift/reduce conflict (shift 18, reduce 10) on OP_MUL +29: shift/reduce conflict (shift 19, reduce 10) on OP_DIV +29: shift/reduce conflict (shift 20, reduce 10) on OP_MOD +29: shift/reduce conflict (shift 21, reduce 10) on OP_AND +29: shift/reduce conflict (shift 22, reduce 10) on '|' +state 29 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr OP_DIV expr . (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 10 + ')' reduce 10 + + +30: shift/reduce conflict (shift 16, reduce 11) on OP_ADD +30: shift/reduce conflict (shift 17, reduce 11) on OP_SUB +30: shift/reduce conflict (shift 18, reduce 11) on OP_MUL +30: shift/reduce conflict (shift 19, reduce 11) on OP_DIV +30: shift/reduce conflict (shift 20, reduce 11) on OP_MOD +30: shift/reduce conflict (shift 21, reduce 11) on OP_AND +30: shift/reduce conflict (shift 22, reduce 11) on '|' +state 30 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr OP_MOD expr . (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 11 + ')' reduce 11 + + +31: shift/reduce conflict (shift 16, reduce 12) on OP_ADD +31: shift/reduce conflict (shift 17, reduce 12) on OP_SUB +31: shift/reduce conflict (shift 18, reduce 12) on OP_MUL +31: shift/reduce conflict (shift 19, reduce 12) on OP_DIV +31: shift/reduce conflict (shift 20, reduce 12) on OP_MOD +31: shift/reduce conflict (shift 21, reduce 12) on OP_AND +31: shift/reduce conflict (shift 22, reduce 12) on '|' +state 31 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr OP_AND expr . (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 12 + ')' reduce 12 + + +32: shift/reduce conflict (shift 16, reduce 13) on OP_ADD +32: shift/reduce conflict (shift 17, reduce 13) on OP_SUB +32: shift/reduce conflict (shift 18, reduce 13) on OP_MUL +32: shift/reduce conflict (shift 19, reduce 13) on OP_DIV +32: shift/reduce conflict (shift 20, reduce 13) on OP_MOD +32: shift/reduce conflict (shift 21, reduce 13) on OP_AND +state 32 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +State 12 contains 6 shift/reduce conflicts. +State 26 contains 7 shift/reduce conflicts. +State 27 contains 7 shift/reduce conflicts. +State 28 contains 7 shift/reduce conflicts. +State 29 contains 7 shift/reduce conflicts. +State 30 contains 7 shift/reduce conflicts. +State 31 contains 7 shift/reduce conflicts. +State 32 contains 6 shift/reduce conflicts. + + +28 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/quote_calc.tab.c b/contrib/byacc/test/quote_calc.tab.c new file mode 100644 index 00000000000..9a45472a037 --- /dev/null +++ b/contrib/byacc/test/quote_calc.tab.c @@ -0,0 +1,693 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse quote_calc_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex quote_calc_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror quote_calc_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar quote_calc_char +#endif /* yychar */ + +#ifndef yyval +#define yyval quote_calc_val +#endif /* yyval */ + +#ifndef yylval +#define yylval quote_calc_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug quote_calc_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs quote_calc_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag quote_calc_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs quote_calc_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen quote_calc_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred quote_calc_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto quote_calc_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex quote_calc_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex quote_calc_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex quote_calc_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable quote_calc_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck quote_calc_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname quote_calc_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule quote_calc_rule +#endif /* yyrule */ +#define YYPREFIX "quote_calc_" + +#define YYPURE 0 + +#line 2 "quote_calc.y" +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +#line 109 "quote_calc.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define OP_ADD 257 +#define ADD 258 +#define OP_SUB 259 +#define SUB 260 +#define OP_MUL 261 +#define MUL 262 +#define OP_DIV 263 +#define DIV 264 +#define OP_MOD 265 +#define MOD 266 +#define OP_AND 267 +#define AND 268 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 +#define YYERRCODE 256 +static const short quote_calc_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short quote_calc_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short quote_calc_defred[] = { 1, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 3, + 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 0, + 0, 0, +}; +static const short quote_calc_dgoto[] = { 1, + 7, 8, 9, +}; +static const short quote_calc_sindex[] = { 0, + -38, 5, -36, 0, -51, -36, 7, -121, -248, 0, + 0, -243, -36, -22, 0, -36, -36, -36, -36, -36, + -36, -36, 0, -121, 0, -121, -121, -121, -121, -121, + -121, -243, +}; +static const short quote_calc_rindex[] = { 0, + 0, 0, 0, 0, -9, 0, 0, 13, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 0, -3, -2, -1, 1, 2, + 3, -4, +}; +static const short quote_calc_gindex[] = { 0, + 0, 42, 0, +}; +#define YYTABLESIZE 258 +static const short quote_calc_table[] = { 16, + 15, 6, 22, 6, 14, 13, 7, 8, 9, 13, + 10, 11, 12, 16, 10, 17, 15, 18, 25, 19, + 23, 20, 4, 21, 5, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 14, 13, 7, 8, 9, + 0, 10, 11, 12, 12, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 15, 0, 0, 0, 14, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 17, 0, 18, + 0, 19, 0, 20, 0, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 4, 5, 4, 11, 16, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 21, 0, 16, 15, 16, 15, + 16, 15, 16, 15, 16, 15, 16, 15, +}; +static const short quote_calc_check[] = { 10, + 10, 40, 124, 40, 10, 10, 10, 10, 10, 61, + 10, 10, 10, 257, 10, 259, 10, 261, 41, 263, + 269, 265, 10, 267, 10, -1, -1, -1, -1, -1, + 41, -1, -1, -1, -1, 41, 41, 41, 41, 41, + -1, 41, 41, 41, 3, -1, -1, 6, -1, -1, + -1, -1, -1, -1, 13, -1, -1, 16, 17, 18, + 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 124, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 124, 124, -1, -1, -1, 124, 124, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, -1, 259, -1, 261, + -1, 263, -1, 265, -1, 267, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + 259, -1, 259, -1, -1, -1, -1, -1, -1, -1, + 269, 270, 269, 270, 257, -1, 259, -1, 261, -1, + 263, -1, 265, -1, 267, -1, 257, 257, 259, 259, + 261, 261, 263, 263, 265, 265, 267, 267, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 271 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"OP_ADD","\"ADD\"","OP_SUB","\"SUB\"","OP_MUL","\"MUL\"","OP_DIV", +"\"DIV\"","OP_MOD","\"MOD\"","OP_AND","\"AND\"","DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr OP_ADD expr", +"expr : expr OP_SUB expr", +"expr : expr OP_MUL expr", +"expr : expr OP_DIV expr", +"expr : expr OP_MOD expr", +"expr : expr OP_AND expr", +"expr : expr '|' expr", +"expr : OP_SUB expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "quote_calc.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 367 "quote_calc.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "quote_calc.y" + { yyerrok ; } +break; +case 4: +#line 39 "quote_calc.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "quote_calc.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "quote_calc.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "quote_calc.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "quote_calc.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "quote_calc.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "quote_calc.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "quote_calc.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "quote_calc.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "quote_calc.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "quote_calc.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "quote_calc.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "quote_calc.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "quote_calc.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 633 "quote_calc.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/quote_calc.tab.h b/contrib/byacc/test/quote_calc.tab.h new file mode 100644 index 00000000000..498eff210db --- /dev/null +++ b/contrib/byacc/test/quote_calc.tab.h @@ -0,0 +1,15 @@ +#define OP_ADD 257 +#define ADD 258 +#define OP_SUB 259 +#define SUB 260 +#define OP_MUL 261 +#define MUL 262 +#define OP_DIV 263 +#define DIV 264 +#define OP_MOD 265 +#define MOD 266 +#define OP_AND 267 +#define AND 268 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 diff --git a/contrib/byacc/test/quote_calc.y b/contrib/byacc/test/quote_calc.y new file mode 100644 index 00000000000..9304dd8a700 --- /dev/null +++ b/contrib/byacc/test/quote_calc.y @@ -0,0 +1,112 @@ +%{ +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +%} + +%start list + +%token OP_ADD "ADD" +%token OP_SUB "SUB" +%token OP_MUL "MUL" +%token OP_DIV "DIV" +%token OP_MOD "MOD" +%token OP_AND "AND" + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr OP_ADD expr + { $$ = $1 + $3; } + | expr OP_SUB expr + { $$ = $1 - $3; } + | expr OP_MUL expr + { $$ = $1 * $3; } + | expr OP_DIV expr + { $$ = $1 / $3; } + | expr OP_MOD expr + { $$ = $1 % $3; } + | expr OP_AND expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | OP_SUB expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/contrib/byacc/test/quote_calc2-s.output b/contrib/byacc/test/quote_calc2-s.output new file mode 100644 index 00000000000..ed28ae2f21c --- /dev/null +++ b/contrib/byacc/test/quote_calc2-s.output @@ -0,0 +1,557 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr "ADD" expr + 8 | expr "SUB" expr + 9 | expr "MUL" expr + 10 | expr "DIV" expr + 11 | expr "MOD" expr + 12 | expr "AND" expr + 13 | expr '|' expr + 14 | "SUB" expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + expr : "SUB" . expr (14) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 12 + number goto 9 + + +state 4 + number : DIGIT . (17) + + . reduce 17 + + +state 5 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 13 + "ADD" reduce 15 + "SUB" reduce 15 + "MUL" reduce 15 + "DIV" reduce 15 + "MOD" reduce 15 + "AND" reduce 15 + '|' reduce 15 + '\n' reduce 15 + + +state 6 + expr : '(' . expr ')' (6) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + "ADD" reduce 16 + "SUB" reduce 16 + "MUL" reduce 16 + "DIV" reduce 16 + "MOD" reduce 16 + "AND" reduce 16 + '|' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + expr : LETTER . (15) + + . reduce 15 + + +12: shift/reduce conflict (shift 16, reduce 14) on "ADD" +12: shift/reduce conflict (shift 17, reduce 14) on "SUB" +12: shift/reduce conflict (shift 18, reduce 14) on "MUL" +12: shift/reduce conflict (shift 19, reduce 14) on "DIV" +12: shift/reduce conflict (shift 20, reduce 14) on "MOD" +12: shift/reduce conflict (shift 21, reduce 14) on "AND" +state 12 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + expr : "SUB" expr . (14) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' reduce 14 + '\n' reduce 14 + ')' reduce 14 + + +state 13 + stat : LETTER '=' . expr (5) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr "ADD" . expr (7) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr "SUB" . expr (8) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr "MUL" . expr (9) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr "DIV" . expr (10) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr "MOD" . expr (11) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr "AND" . expr (12) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '|' . expr (13) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +26: shift/reduce conflict (shift 16, reduce 7) on "ADD" +26: shift/reduce conflict (shift 17, reduce 7) on "SUB" +26: shift/reduce conflict (shift 18, reduce 7) on "MUL" +26: shift/reduce conflict (shift 19, reduce 7) on "DIV" +26: shift/reduce conflict (shift 20, reduce 7) on "MOD" +26: shift/reduce conflict (shift 21, reduce 7) on "AND" +26: shift/reduce conflict (shift 22, reduce 7) on '|' +state 26 + expr : expr . "ADD" expr (7) + expr : expr "ADD" expr . (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 7 + ')' reduce 7 + + +27: shift/reduce conflict (shift 16, reduce 8) on "ADD" +27: shift/reduce conflict (shift 17, reduce 8) on "SUB" +27: shift/reduce conflict (shift 18, reduce 8) on "MUL" +27: shift/reduce conflict (shift 19, reduce 8) on "DIV" +27: shift/reduce conflict (shift 20, reduce 8) on "MOD" +27: shift/reduce conflict (shift 21, reduce 8) on "AND" +27: shift/reduce conflict (shift 22, reduce 8) on '|' +state 27 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr "SUB" expr . (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 8 + ')' reduce 8 + + +28: shift/reduce conflict (shift 16, reduce 9) on "ADD" +28: shift/reduce conflict (shift 17, reduce 9) on "SUB" +28: shift/reduce conflict (shift 18, reduce 9) on "MUL" +28: shift/reduce conflict (shift 19, reduce 9) on "DIV" +28: shift/reduce conflict (shift 20, reduce 9) on "MOD" +28: shift/reduce conflict (shift 21, reduce 9) on "AND" +28: shift/reduce conflict (shift 22, reduce 9) on '|' +state 28 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr "MUL" expr . (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 9 + ')' reduce 9 + + +29: shift/reduce conflict (shift 16, reduce 10) on "ADD" +29: shift/reduce conflict (shift 17, reduce 10) on "SUB" +29: shift/reduce conflict (shift 18, reduce 10) on "MUL" +29: shift/reduce conflict (shift 19, reduce 10) on "DIV" +29: shift/reduce conflict (shift 20, reduce 10) on "MOD" +29: shift/reduce conflict (shift 21, reduce 10) on "AND" +29: shift/reduce conflict (shift 22, reduce 10) on '|' +state 29 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr "DIV" expr . (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 10 + ')' reduce 10 + + +30: shift/reduce conflict (shift 16, reduce 11) on "ADD" +30: shift/reduce conflict (shift 17, reduce 11) on "SUB" +30: shift/reduce conflict (shift 18, reduce 11) on "MUL" +30: shift/reduce conflict (shift 19, reduce 11) on "DIV" +30: shift/reduce conflict (shift 20, reduce 11) on "MOD" +30: shift/reduce conflict (shift 21, reduce 11) on "AND" +30: shift/reduce conflict (shift 22, reduce 11) on '|' +state 30 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr "MOD" expr . (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 11 + ')' reduce 11 + + +31: shift/reduce conflict (shift 16, reduce 12) on "ADD" +31: shift/reduce conflict (shift 17, reduce 12) on "SUB" +31: shift/reduce conflict (shift 18, reduce 12) on "MUL" +31: shift/reduce conflict (shift 19, reduce 12) on "DIV" +31: shift/reduce conflict (shift 20, reduce 12) on "MOD" +31: shift/reduce conflict (shift 21, reduce 12) on "AND" +31: shift/reduce conflict (shift 22, reduce 12) on '|' +state 31 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr "AND" expr . (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 12 + ')' reduce 12 + + +32: shift/reduce conflict (shift 16, reduce 13) on "ADD" +32: shift/reduce conflict (shift 17, reduce 13) on "SUB" +32: shift/reduce conflict (shift 18, reduce 13) on "MUL" +32: shift/reduce conflict (shift 19, reduce 13) on "DIV" +32: shift/reduce conflict (shift 20, reduce 13) on "MOD" +32: shift/reduce conflict (shift 21, reduce 13) on "AND" +state 32 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +State 12 contains 6 shift/reduce conflicts. +State 26 contains 7 shift/reduce conflicts. +State 27 contains 7 shift/reduce conflicts. +State 28 contains 7 shift/reduce conflicts. +State 29 contains 7 shift/reduce conflicts. +State 30 contains 7 shift/reduce conflicts. +State 31 contains 7 shift/reduce conflicts. +State 32 contains 6 shift/reduce conflicts. + + +28 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/quote_calc2-s.tab.c b/contrib/byacc/test/quote_calc2-s.tab.c new file mode 100644 index 00000000000..06c574ba9c8 --- /dev/null +++ b/contrib/byacc/test/quote_calc2-s.tab.c @@ -0,0 +1,687 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse quote_calc2_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex quote_calc2_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror quote_calc2_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar quote_calc2_char +#endif /* yychar */ + +#ifndef yyval +#define yyval quote_calc2_val +#endif /* yyval */ + +#ifndef yylval +#define yylval quote_calc2_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug quote_calc2_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs quote_calc2_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag quote_calc2_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs quote_calc2_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen quote_calc2_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred quote_calc2_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto quote_calc2_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex quote_calc2_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex quote_calc2_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex quote_calc2_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable quote_calc2_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck quote_calc2_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname quote_calc2_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule quote_calc2_rule +#endif /* yyrule */ +#define YYPREFIX "quote_calc2_" + +#define YYPURE 0 + +#line 2 "quote_calc2.y" +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +#line 109 "quote_calc2-s.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 +#define YYERRCODE 256 +static const short quote_calc2_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short quote_calc2_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short quote_calc2_defred[] = { 1, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 3, + 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 0, + 0, 0, +}; +static const short quote_calc2_dgoto[] = { 1, + 7, 8, 9, +}; +static const short quote_calc2_sindex[] = { 0, + -38, 4, -36, 0, -51, -36, 6, -121, -249, 0, + 0, -243, -36, -23, 0, -36, -36, -36, -36, -36, + -36, -36, 0, -121, 0, -121, -121, -121, -121, -121, + -121, -243, +}; +static const short quote_calc2_rindex[] = { 0, + 0, 0, 0, 0, -9, 0, 0, 12, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 0, -3, -2, -1, 1, 2, + 3, -4, +}; +static const short quote_calc2_gindex[] = { 0, + 0, 42, 0, +}; +#define YYTABLESIZE 259 +static const short quote_calc2_table[] = { 16, + 15, 6, 22, 6, 14, 13, 7, 8, 9, 13, + 10, 11, 12, 10, 16, 15, 17, 25, 18, 23, + 19, 4, 20, 5, 21, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 14, 13, 7, 8, 9, + 0, 10, 11, 12, 12, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 15, 0, 0, 0, 14, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 17, 0, + 18, 0, 19, 0, 20, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, + 4, 5, 4, 11, 16, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 21, 0, 0, 16, 15, 16, + 15, 16, 15, 16, 15, 16, 15, 16, 15, +}; +static const short quote_calc2_check[] = { 10, + 10, 40, 124, 40, 10, 10, 10, 10, 10, 61, + 10, 10, 10, 10, 258, 10, 260, 41, 262, 269, + 264, 10, 266, 10, 268, -1, -1, -1, -1, -1, + 41, -1, -1, -1, -1, 41, 41, 41, 41, 41, + -1, 41, 41, 41, 3, -1, -1, 6, -1, -1, + -1, -1, -1, -1, 13, -1, -1, 16, 17, 18, + 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 124, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 124, 124, -1, -1, -1, 124, 124, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 258, -1, 260, -1, + 262, -1, 264, -1, 266, -1, 268, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + -1, 260, -1, 260, -1, -1, -1, -1, -1, -1, + 269, 270, 269, 270, 258, -1, 260, -1, 262, -1, + 264, -1, 266, -1, 268, -1, -1, 258, 258, 260, + 260, 262, 262, 264, 264, 266, 266, 268, 268, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 271 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"OP_ADD","\"ADD\"","OP_SUB","\"SUB\"","OP_MUL","\"MUL\"","OP_DIV", +"\"DIV\"","OP_MOD","\"MOD\"","OP_AND","\"AND\"","DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr \"ADD\" expr", +"expr : expr \"SUB\" expr", +"expr : expr \"MUL\" expr", +"expr : expr \"DIV\" expr", +"expr : expr \"MOD\" expr", +"expr : expr \"AND\" expr", +"expr : expr '|' expr", +"expr : \"SUB\" expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "quote_calc2.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 361 "quote_calc2-s.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "quote_calc2.y" + { yyerrok ; } +break; +case 4: +#line 39 "quote_calc2.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "quote_calc2.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "quote_calc2.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "quote_calc2.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "quote_calc2.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "quote_calc2.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "quote_calc2.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "quote_calc2.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "quote_calc2.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "quote_calc2.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "quote_calc2.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "quote_calc2.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "quote_calc2.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "quote_calc2.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 627 "quote_calc2-s.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/quote_calc2-s.tab.h b/contrib/byacc/test/quote_calc2-s.tab.h new file mode 100644 index 00000000000..1a465790341 --- /dev/null +++ b/contrib/byacc/test/quote_calc2-s.tab.h @@ -0,0 +1,9 @@ +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 diff --git a/contrib/byacc/test/quote_calc2.output b/contrib/byacc/test/quote_calc2.output new file mode 100644 index 00000000000..ed28ae2f21c --- /dev/null +++ b/contrib/byacc/test/quote_calc2.output @@ -0,0 +1,557 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr "ADD" expr + 8 | expr "SUB" expr + 9 | expr "MUL" expr + 10 | expr "DIV" expr + 11 | expr "MOD" expr + 12 | expr "AND" expr + 13 | expr '|' expr + 14 | "SUB" expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + expr : "SUB" . expr (14) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 12 + number goto 9 + + +state 4 + number : DIGIT . (17) + + . reduce 17 + + +state 5 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 13 + "ADD" reduce 15 + "SUB" reduce 15 + "MUL" reduce 15 + "DIV" reduce 15 + "MOD" reduce 15 + "AND" reduce 15 + '|' reduce 15 + '\n' reduce 15 + + +state 6 + expr : '(' . expr ')' (6) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + "ADD" reduce 16 + "SUB" reduce 16 + "MUL" reduce 16 + "DIV" reduce 16 + "MOD" reduce 16 + "AND" reduce 16 + '|' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + expr : LETTER . (15) + + . reduce 15 + + +12: shift/reduce conflict (shift 16, reduce 14) on "ADD" +12: shift/reduce conflict (shift 17, reduce 14) on "SUB" +12: shift/reduce conflict (shift 18, reduce 14) on "MUL" +12: shift/reduce conflict (shift 19, reduce 14) on "DIV" +12: shift/reduce conflict (shift 20, reduce 14) on "MOD" +12: shift/reduce conflict (shift 21, reduce 14) on "AND" +state 12 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + expr : "SUB" expr . (14) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' reduce 14 + '\n' reduce 14 + ')' reduce 14 + + +state 13 + stat : LETTER '=' . expr (5) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr "ADD" . expr (7) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr "SUB" . expr (8) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr "MUL" . expr (9) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr "DIV" . expr (10) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr "MOD" . expr (11) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr "AND" . expr (12) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '|' . expr (13) + + "SUB" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +26: shift/reduce conflict (shift 16, reduce 7) on "ADD" +26: shift/reduce conflict (shift 17, reduce 7) on "SUB" +26: shift/reduce conflict (shift 18, reduce 7) on "MUL" +26: shift/reduce conflict (shift 19, reduce 7) on "DIV" +26: shift/reduce conflict (shift 20, reduce 7) on "MOD" +26: shift/reduce conflict (shift 21, reduce 7) on "AND" +26: shift/reduce conflict (shift 22, reduce 7) on '|' +state 26 + expr : expr . "ADD" expr (7) + expr : expr "ADD" expr . (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 7 + ')' reduce 7 + + +27: shift/reduce conflict (shift 16, reduce 8) on "ADD" +27: shift/reduce conflict (shift 17, reduce 8) on "SUB" +27: shift/reduce conflict (shift 18, reduce 8) on "MUL" +27: shift/reduce conflict (shift 19, reduce 8) on "DIV" +27: shift/reduce conflict (shift 20, reduce 8) on "MOD" +27: shift/reduce conflict (shift 21, reduce 8) on "AND" +27: shift/reduce conflict (shift 22, reduce 8) on '|' +state 27 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr "SUB" expr . (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 8 + ')' reduce 8 + + +28: shift/reduce conflict (shift 16, reduce 9) on "ADD" +28: shift/reduce conflict (shift 17, reduce 9) on "SUB" +28: shift/reduce conflict (shift 18, reduce 9) on "MUL" +28: shift/reduce conflict (shift 19, reduce 9) on "DIV" +28: shift/reduce conflict (shift 20, reduce 9) on "MOD" +28: shift/reduce conflict (shift 21, reduce 9) on "AND" +28: shift/reduce conflict (shift 22, reduce 9) on '|' +state 28 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr "MUL" expr . (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 9 + ')' reduce 9 + + +29: shift/reduce conflict (shift 16, reduce 10) on "ADD" +29: shift/reduce conflict (shift 17, reduce 10) on "SUB" +29: shift/reduce conflict (shift 18, reduce 10) on "MUL" +29: shift/reduce conflict (shift 19, reduce 10) on "DIV" +29: shift/reduce conflict (shift 20, reduce 10) on "MOD" +29: shift/reduce conflict (shift 21, reduce 10) on "AND" +29: shift/reduce conflict (shift 22, reduce 10) on '|' +state 29 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr "DIV" expr . (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 10 + ')' reduce 10 + + +30: shift/reduce conflict (shift 16, reduce 11) on "ADD" +30: shift/reduce conflict (shift 17, reduce 11) on "SUB" +30: shift/reduce conflict (shift 18, reduce 11) on "MUL" +30: shift/reduce conflict (shift 19, reduce 11) on "DIV" +30: shift/reduce conflict (shift 20, reduce 11) on "MOD" +30: shift/reduce conflict (shift 21, reduce 11) on "AND" +30: shift/reduce conflict (shift 22, reduce 11) on '|' +state 30 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr "MOD" expr . (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 11 + ')' reduce 11 + + +31: shift/reduce conflict (shift 16, reduce 12) on "ADD" +31: shift/reduce conflict (shift 17, reduce 12) on "SUB" +31: shift/reduce conflict (shift 18, reduce 12) on "MUL" +31: shift/reduce conflict (shift 19, reduce 12) on "DIV" +31: shift/reduce conflict (shift 20, reduce 12) on "MOD" +31: shift/reduce conflict (shift 21, reduce 12) on "AND" +31: shift/reduce conflict (shift 22, reduce 12) on '|' +state 31 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr "AND" expr . (12) + expr : expr . '|' expr (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' shift 22 + '\n' reduce 12 + ')' reduce 12 + + +32: shift/reduce conflict (shift 16, reduce 13) on "ADD" +32: shift/reduce conflict (shift 17, reduce 13) on "SUB" +32: shift/reduce conflict (shift 18, reduce 13) on "MUL" +32: shift/reduce conflict (shift 19, reduce 13) on "DIV" +32: shift/reduce conflict (shift 20, reduce 13) on "MOD" +32: shift/reduce conflict (shift 21, reduce 13) on "AND" +state 32 + expr : expr . "ADD" expr (7) + expr : expr . "SUB" expr (8) + expr : expr . "MUL" expr (9) + expr : expr . "DIV" expr (10) + expr : expr . "MOD" expr (11) + expr : expr . "AND" expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + "ADD" shift 16 + "SUB" shift 17 + "MUL" shift 18 + "DIV" shift 19 + "MOD" shift 20 + "AND" shift 21 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +State 12 contains 6 shift/reduce conflicts. +State 26 contains 7 shift/reduce conflicts. +State 27 contains 7 shift/reduce conflicts. +State 28 contains 7 shift/reduce conflicts. +State 29 contains 7 shift/reduce conflicts. +State 30 contains 7 shift/reduce conflicts. +State 31 contains 7 shift/reduce conflicts. +State 32 contains 6 shift/reduce conflicts. + + +28 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/quote_calc2.tab.c b/contrib/byacc/test/quote_calc2.tab.c new file mode 100644 index 00000000000..958a736fb23 --- /dev/null +++ b/contrib/byacc/test/quote_calc2.tab.c @@ -0,0 +1,693 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse quote_calc2_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex quote_calc2_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror quote_calc2_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar quote_calc2_char +#endif /* yychar */ + +#ifndef yyval +#define yyval quote_calc2_val +#endif /* yyval */ + +#ifndef yylval +#define yylval quote_calc2_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug quote_calc2_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs quote_calc2_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag quote_calc2_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs quote_calc2_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen quote_calc2_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred quote_calc2_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto quote_calc2_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex quote_calc2_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex quote_calc2_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex quote_calc2_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable quote_calc2_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck quote_calc2_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname quote_calc2_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule quote_calc2_rule +#endif /* yyrule */ +#define YYPREFIX "quote_calc2_" + +#define YYPURE 0 + +#line 2 "quote_calc2.y" +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +#line 109 "quote_calc2.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define OP_ADD 257 +#define ADD 258 +#define OP_SUB 259 +#define SUB 260 +#define OP_MUL 261 +#define MUL 262 +#define OP_DIV 263 +#define DIV 264 +#define OP_MOD 265 +#define MOD 266 +#define OP_AND 267 +#define AND 268 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 +#define YYERRCODE 256 +static const short quote_calc2_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short quote_calc2_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short quote_calc2_defred[] = { 1, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 3, + 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 0, + 0, 0, +}; +static const short quote_calc2_dgoto[] = { 1, + 7, 8, 9, +}; +static const short quote_calc2_sindex[] = { 0, + -38, 4, -36, 0, -51, -36, 6, -121, -249, 0, + 0, -243, -36, -23, 0, -36, -36, -36, -36, -36, + -36, -36, 0, -121, 0, -121, -121, -121, -121, -121, + -121, -243, +}; +static const short quote_calc2_rindex[] = { 0, + 0, 0, 0, 0, -9, 0, 0, 12, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 0, -3, -2, -1, 1, 2, + 3, -4, +}; +static const short quote_calc2_gindex[] = { 0, + 0, 42, 0, +}; +#define YYTABLESIZE 259 +static const short quote_calc2_table[] = { 16, + 15, 6, 22, 6, 14, 13, 7, 8, 9, 13, + 10, 11, 12, 10, 16, 15, 17, 25, 18, 23, + 19, 4, 20, 5, 21, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 14, 13, 7, 8, 9, + 0, 10, 11, 12, 12, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 15, 0, 0, 0, 14, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 17, 0, + 18, 0, 19, 0, 20, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, + 4, 5, 4, 11, 16, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 21, 0, 0, 16, 15, 16, + 15, 16, 15, 16, 15, 16, 15, 16, 15, +}; +static const short quote_calc2_check[] = { 10, + 10, 40, 124, 40, 10, 10, 10, 10, 10, 61, + 10, 10, 10, 10, 258, 10, 260, 41, 262, 269, + 264, 10, 266, 10, 268, -1, -1, -1, -1, -1, + 41, -1, -1, -1, -1, 41, 41, 41, 41, 41, + -1, 41, 41, 41, 3, -1, -1, 6, -1, -1, + -1, -1, -1, -1, 13, -1, -1, 16, 17, 18, + 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 124, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 124, 124, -1, -1, -1, 124, 124, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 258, -1, 260, -1, + 262, -1, 264, -1, 266, -1, 268, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + -1, 260, -1, 260, -1, -1, -1, -1, -1, -1, + 269, 270, 269, 270, 258, -1, 260, -1, 262, -1, + 264, -1, 266, -1, 268, -1, -1, 258, 258, 260, + 260, 262, 262, 264, 264, 266, 266, 268, 268, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 271 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"OP_ADD","\"ADD\"","OP_SUB","\"SUB\"","OP_MUL","\"MUL\"","OP_DIV", +"\"DIV\"","OP_MOD","\"MOD\"","OP_AND","\"AND\"","DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr \"ADD\" expr", +"expr : expr \"SUB\" expr", +"expr : expr \"MUL\" expr", +"expr : expr \"DIV\" expr", +"expr : expr \"MOD\" expr", +"expr : expr \"AND\" expr", +"expr : expr '|' expr", +"expr : \"SUB\" expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "quote_calc2.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 367 "quote_calc2.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "quote_calc2.y" + { yyerrok ; } +break; +case 4: +#line 39 "quote_calc2.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "quote_calc2.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "quote_calc2.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "quote_calc2.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "quote_calc2.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "quote_calc2.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "quote_calc2.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "quote_calc2.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "quote_calc2.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "quote_calc2.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "quote_calc2.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "quote_calc2.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "quote_calc2.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "quote_calc2.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 633 "quote_calc2.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/quote_calc2.tab.h b/contrib/byacc/test/quote_calc2.tab.h new file mode 100644 index 00000000000..498eff210db --- /dev/null +++ b/contrib/byacc/test/quote_calc2.tab.h @@ -0,0 +1,15 @@ +#define OP_ADD 257 +#define ADD 258 +#define OP_SUB 259 +#define SUB 260 +#define OP_MUL 261 +#define MUL 262 +#define OP_DIV 263 +#define DIV 264 +#define OP_MOD 265 +#define MOD 266 +#define OP_AND 267 +#define AND 268 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 diff --git a/contrib/byacc/test/quote_calc2.y b/contrib/byacc/test/quote_calc2.y new file mode 100644 index 00000000000..ab72a285fcb --- /dev/null +++ b/contrib/byacc/test/quote_calc2.y @@ -0,0 +1,112 @@ +%{ +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +%} + +%start list + +%token OP_ADD "ADD" +%token OP_SUB "SUB" +%token OP_MUL "MUL" +%token OP_DIV "DIV" +%token OP_MOD "MOD" +%token OP_AND "AND" + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr "ADD" expr + { $$ = $1 + $3; } + | expr "SUB" expr + { $$ = $1 - $3; } + | expr "MUL" expr + { $$ = $1 * $3; } + | expr "DIV" expr + { $$ = $1 / $3; } + | expr "MOD" expr + { $$ = $1 % $3; } + | expr "AND" expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | "SUB" expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/contrib/byacc/test/quote_calc3-s.output b/contrib/byacc/test/quote_calc3-s.output new file mode 100644 index 00000000000..0306652bfaa --- /dev/null +++ b/contrib/byacc/test/quote_calc3-s.output @@ -0,0 +1,557 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr OP_ADD expr + 8 | expr OP_SUB expr + 9 | expr OP_MUL expr + 10 | expr OP_DIV expr + 11 | expr OP_MOD expr + 12 | expr OP_AND expr + 13 | expr '|' expr + 14 | OP_SUB expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + expr : OP_SUB . expr (14) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 12 + number goto 9 + + +state 4 + number : DIGIT . (17) + + . reduce 17 + + +state 5 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 13 + OP_ADD reduce 15 + OP_SUB reduce 15 + OP_MUL reduce 15 + OP_DIV reduce 15 + OP_MOD reduce 15 + OP_AND reduce 15 + '|' reduce 15 + '\n' reduce 15 + + +state 6 + expr : '(' . expr ')' (6) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + OP_ADD reduce 16 + OP_SUB reduce 16 + OP_MUL reduce 16 + OP_DIV reduce 16 + OP_MOD reduce 16 + OP_AND reduce 16 + '|' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + expr : LETTER . (15) + + . reduce 15 + + +12: shift/reduce conflict (shift 16, reduce 14) on OP_ADD +12: shift/reduce conflict (shift 17, reduce 14) on OP_SUB +12: shift/reduce conflict (shift 18, reduce 14) on OP_MUL +12: shift/reduce conflict (shift 19, reduce 14) on OP_DIV +12: shift/reduce conflict (shift 20, reduce 14) on OP_MOD +12: shift/reduce conflict (shift 21, reduce 14) on OP_AND +state 12 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + expr : OP_SUB expr . (14) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' reduce 14 + '\n' reduce 14 + ')' reduce 14 + + +state 13 + stat : LETTER '=' . expr (5) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr OP_ADD . expr (7) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr OP_SUB . expr (8) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr OP_MUL . expr (9) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr OP_DIV . expr (10) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr OP_MOD . expr (11) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr OP_AND . expr (12) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '|' . expr (13) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +26: shift/reduce conflict (shift 16, reduce 7) on OP_ADD +26: shift/reduce conflict (shift 17, reduce 7) on OP_SUB +26: shift/reduce conflict (shift 18, reduce 7) on OP_MUL +26: shift/reduce conflict (shift 19, reduce 7) on OP_DIV +26: shift/reduce conflict (shift 20, reduce 7) on OP_MOD +26: shift/reduce conflict (shift 21, reduce 7) on OP_AND +26: shift/reduce conflict (shift 22, reduce 7) on '|' +state 26 + expr : expr . OP_ADD expr (7) + expr : expr OP_ADD expr . (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 7 + ')' reduce 7 + + +27: shift/reduce conflict (shift 16, reduce 8) on OP_ADD +27: shift/reduce conflict (shift 17, reduce 8) on OP_SUB +27: shift/reduce conflict (shift 18, reduce 8) on OP_MUL +27: shift/reduce conflict (shift 19, reduce 8) on OP_DIV +27: shift/reduce conflict (shift 20, reduce 8) on OP_MOD +27: shift/reduce conflict (shift 21, reduce 8) on OP_AND +27: shift/reduce conflict (shift 22, reduce 8) on '|' +state 27 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr OP_SUB expr . (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 8 + ')' reduce 8 + + +28: shift/reduce conflict (shift 16, reduce 9) on OP_ADD +28: shift/reduce conflict (shift 17, reduce 9) on OP_SUB +28: shift/reduce conflict (shift 18, reduce 9) on OP_MUL +28: shift/reduce conflict (shift 19, reduce 9) on OP_DIV +28: shift/reduce conflict (shift 20, reduce 9) on OP_MOD +28: shift/reduce conflict (shift 21, reduce 9) on OP_AND +28: shift/reduce conflict (shift 22, reduce 9) on '|' +state 28 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr OP_MUL expr . (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 9 + ')' reduce 9 + + +29: shift/reduce conflict (shift 16, reduce 10) on OP_ADD +29: shift/reduce conflict (shift 17, reduce 10) on OP_SUB +29: shift/reduce conflict (shift 18, reduce 10) on OP_MUL +29: shift/reduce conflict (shift 19, reduce 10) on OP_DIV +29: shift/reduce conflict (shift 20, reduce 10) on OP_MOD +29: shift/reduce conflict (shift 21, reduce 10) on OP_AND +29: shift/reduce conflict (shift 22, reduce 10) on '|' +state 29 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr OP_DIV expr . (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 10 + ')' reduce 10 + + +30: shift/reduce conflict (shift 16, reduce 11) on OP_ADD +30: shift/reduce conflict (shift 17, reduce 11) on OP_SUB +30: shift/reduce conflict (shift 18, reduce 11) on OP_MUL +30: shift/reduce conflict (shift 19, reduce 11) on OP_DIV +30: shift/reduce conflict (shift 20, reduce 11) on OP_MOD +30: shift/reduce conflict (shift 21, reduce 11) on OP_AND +30: shift/reduce conflict (shift 22, reduce 11) on '|' +state 30 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr OP_MOD expr . (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 11 + ')' reduce 11 + + +31: shift/reduce conflict (shift 16, reduce 12) on OP_ADD +31: shift/reduce conflict (shift 17, reduce 12) on OP_SUB +31: shift/reduce conflict (shift 18, reduce 12) on OP_MUL +31: shift/reduce conflict (shift 19, reduce 12) on OP_DIV +31: shift/reduce conflict (shift 20, reduce 12) on OP_MOD +31: shift/reduce conflict (shift 21, reduce 12) on OP_AND +31: shift/reduce conflict (shift 22, reduce 12) on '|' +state 31 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr OP_AND expr . (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 12 + ')' reduce 12 + + +32: shift/reduce conflict (shift 16, reduce 13) on OP_ADD +32: shift/reduce conflict (shift 17, reduce 13) on OP_SUB +32: shift/reduce conflict (shift 18, reduce 13) on OP_MUL +32: shift/reduce conflict (shift 19, reduce 13) on OP_DIV +32: shift/reduce conflict (shift 20, reduce 13) on OP_MOD +32: shift/reduce conflict (shift 21, reduce 13) on OP_AND +state 32 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +State 12 contains 6 shift/reduce conflicts. +State 26 contains 7 shift/reduce conflicts. +State 27 contains 7 shift/reduce conflicts. +State 28 contains 7 shift/reduce conflicts. +State 29 contains 7 shift/reduce conflicts. +State 30 contains 7 shift/reduce conflicts. +State 31 contains 7 shift/reduce conflicts. +State 32 contains 6 shift/reduce conflicts. + + +28 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/quote_calc3-s.tab.c b/contrib/byacc/test/quote_calc3-s.tab.c new file mode 100644 index 00000000000..0953fbb623c --- /dev/null +++ b/contrib/byacc/test/quote_calc3-s.tab.c @@ -0,0 +1,688 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse quote_calc3_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex quote_calc3_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror quote_calc3_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar quote_calc3_char +#endif /* yychar */ + +#ifndef yyval +#define yyval quote_calc3_val +#endif /* yyval */ + +#ifndef yylval +#define yylval quote_calc3_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug quote_calc3_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs quote_calc3_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag quote_calc3_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs quote_calc3_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen quote_calc3_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred quote_calc3_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto quote_calc3_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex quote_calc3_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex quote_calc3_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex quote_calc3_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable quote_calc3_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck quote_calc3_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname quote_calc3_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule quote_calc3_rule +#endif /* yyrule */ +#define YYPREFIX "quote_calc3_" + +#define YYPURE 0 + +#line 2 "quote_calc3.y" +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +#line 109 "quote_calc3-s.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 +#define YYERRCODE 256 +static const short quote_calc3_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short quote_calc3_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short quote_calc3_defred[] = { 1, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 3, + 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 0, + 0, 0, +}; +static const short quote_calc3_dgoto[] = { 1, + 7, 8, 9, +}; +static const short quote_calc3_sindex[] = { 0, + -38, 5, -36, 0, -51, -36, 7, -121, -248, 0, + 0, -243, -36, -22, 0, -36, -36, -36, -36, -36, + -36, -36, 0, -121, 0, -121, -121, -121, -121, -121, + -121, -243, +}; +static const short quote_calc3_rindex[] = { 0, + 0, 0, 0, 0, -9, 0, 0, 13, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 0, -3, -2, -1, 1, 2, + 3, -4, +}; +static const short quote_calc3_gindex[] = { 0, + 0, 42, 0, +}; +#define YYTABLESIZE 258 +static const short quote_calc3_table[] = { 16, + 15, 6, 22, 6, 14, 13, 7, 8, 9, 13, + 10, 11, 12, 16, 10, 17, 15, 18, 25, 19, + 23, 20, 4, 21, 5, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 14, 13, 7, 8, 9, + 0, 10, 11, 12, 12, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 15, 0, 0, 0, 14, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 17, 0, 18, + 0, 19, 0, 20, 0, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 4, 5, 4, 11, 16, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 21, 0, 16, 15, 16, 15, + 16, 15, 16, 15, 16, 15, 16, 15, +}; +static const short quote_calc3_check[] = { 10, + 10, 40, 124, 40, 10, 10, 10, 10, 10, 61, + 10, 10, 10, 257, 10, 259, 10, 261, 41, 263, + 269, 265, 10, 267, 10, -1, -1, -1, -1, -1, + 41, -1, -1, -1, -1, 41, 41, 41, 41, 41, + -1, 41, 41, 41, 3, -1, -1, 6, -1, -1, + -1, -1, -1, -1, 13, -1, -1, 16, 17, 18, + 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 124, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 124, 124, -1, -1, -1, 124, 124, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, -1, 259, -1, 261, + -1, 263, -1, 265, -1, 267, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + 259, -1, 259, -1, -1, -1, -1, -1, -1, -1, + 269, 270, 269, 270, 257, -1, 259, -1, 261, -1, + 263, -1, 265, -1, 267, -1, 257, 257, 259, 259, + 261, 261, 263, 263, 265, 265, 267, 267, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 271 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"OP_ADD","\"ADD-operator\"","OP_SUB","\"SUB-operator\"","OP_MUL", +"\"MUL-operator\"","OP_DIV","\"DIV-operator\"","OP_MOD","\"MOD-operator\"", +"OP_AND","\"AND-operator\"","DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr OP_ADD expr", +"expr : expr OP_SUB expr", +"expr : expr OP_MUL expr", +"expr : expr OP_DIV expr", +"expr : expr OP_MOD expr", +"expr : expr OP_AND expr", +"expr : expr '|' expr", +"expr : OP_SUB expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "quote_calc3.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 362 "quote_calc3-s.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "quote_calc3.y" + { yyerrok ; } +break; +case 4: +#line 39 "quote_calc3.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "quote_calc3.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "quote_calc3.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "quote_calc3.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "quote_calc3.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "quote_calc3.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "quote_calc3.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "quote_calc3.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "quote_calc3.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "quote_calc3.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "quote_calc3.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "quote_calc3.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "quote_calc3.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "quote_calc3.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 628 "quote_calc3-s.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/quote_calc3-s.tab.h b/contrib/byacc/test/quote_calc3-s.tab.h new file mode 100644 index 00000000000..1a465790341 --- /dev/null +++ b/contrib/byacc/test/quote_calc3-s.tab.h @@ -0,0 +1,9 @@ +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 diff --git a/contrib/byacc/test/quote_calc3.output b/contrib/byacc/test/quote_calc3.output new file mode 100644 index 00000000000..0306652bfaa --- /dev/null +++ b/contrib/byacc/test/quote_calc3.output @@ -0,0 +1,557 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr OP_ADD expr + 8 | expr OP_SUB expr + 9 | expr OP_MUL expr + 10 | expr OP_DIV expr + 11 | expr OP_MOD expr + 12 | expr OP_AND expr + 13 | expr '|' expr + 14 | OP_SUB expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + expr : OP_SUB . expr (14) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 12 + number goto 9 + + +state 4 + number : DIGIT . (17) + + . reduce 17 + + +state 5 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 13 + OP_ADD reduce 15 + OP_SUB reduce 15 + OP_MUL reduce 15 + OP_DIV reduce 15 + OP_MOD reduce 15 + OP_AND reduce 15 + '|' reduce 15 + '\n' reduce 15 + + +state 6 + expr : '(' . expr ')' (6) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + OP_ADD reduce 16 + OP_SUB reduce 16 + OP_MUL reduce 16 + OP_DIV reduce 16 + OP_MOD reduce 16 + OP_AND reduce 16 + '|' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + expr : LETTER . (15) + + . reduce 15 + + +12: shift/reduce conflict (shift 16, reduce 14) on OP_ADD +12: shift/reduce conflict (shift 17, reduce 14) on OP_SUB +12: shift/reduce conflict (shift 18, reduce 14) on OP_MUL +12: shift/reduce conflict (shift 19, reduce 14) on OP_DIV +12: shift/reduce conflict (shift 20, reduce 14) on OP_MOD +12: shift/reduce conflict (shift 21, reduce 14) on OP_AND +state 12 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + expr : OP_SUB expr . (14) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' reduce 14 + '\n' reduce 14 + ')' reduce 14 + + +state 13 + stat : LETTER '=' . expr (5) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr OP_ADD . expr (7) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr OP_SUB . expr (8) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr OP_MUL . expr (9) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr OP_DIV . expr (10) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr OP_MOD . expr (11) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr OP_AND . expr (12) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '|' . expr (13) + + OP_SUB shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +26: shift/reduce conflict (shift 16, reduce 7) on OP_ADD +26: shift/reduce conflict (shift 17, reduce 7) on OP_SUB +26: shift/reduce conflict (shift 18, reduce 7) on OP_MUL +26: shift/reduce conflict (shift 19, reduce 7) on OP_DIV +26: shift/reduce conflict (shift 20, reduce 7) on OP_MOD +26: shift/reduce conflict (shift 21, reduce 7) on OP_AND +26: shift/reduce conflict (shift 22, reduce 7) on '|' +state 26 + expr : expr . OP_ADD expr (7) + expr : expr OP_ADD expr . (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 7 + ')' reduce 7 + + +27: shift/reduce conflict (shift 16, reduce 8) on OP_ADD +27: shift/reduce conflict (shift 17, reduce 8) on OP_SUB +27: shift/reduce conflict (shift 18, reduce 8) on OP_MUL +27: shift/reduce conflict (shift 19, reduce 8) on OP_DIV +27: shift/reduce conflict (shift 20, reduce 8) on OP_MOD +27: shift/reduce conflict (shift 21, reduce 8) on OP_AND +27: shift/reduce conflict (shift 22, reduce 8) on '|' +state 27 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr OP_SUB expr . (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 8 + ')' reduce 8 + + +28: shift/reduce conflict (shift 16, reduce 9) on OP_ADD +28: shift/reduce conflict (shift 17, reduce 9) on OP_SUB +28: shift/reduce conflict (shift 18, reduce 9) on OP_MUL +28: shift/reduce conflict (shift 19, reduce 9) on OP_DIV +28: shift/reduce conflict (shift 20, reduce 9) on OP_MOD +28: shift/reduce conflict (shift 21, reduce 9) on OP_AND +28: shift/reduce conflict (shift 22, reduce 9) on '|' +state 28 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr OP_MUL expr . (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 9 + ')' reduce 9 + + +29: shift/reduce conflict (shift 16, reduce 10) on OP_ADD +29: shift/reduce conflict (shift 17, reduce 10) on OP_SUB +29: shift/reduce conflict (shift 18, reduce 10) on OP_MUL +29: shift/reduce conflict (shift 19, reduce 10) on OP_DIV +29: shift/reduce conflict (shift 20, reduce 10) on OP_MOD +29: shift/reduce conflict (shift 21, reduce 10) on OP_AND +29: shift/reduce conflict (shift 22, reduce 10) on '|' +state 29 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr OP_DIV expr . (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 10 + ')' reduce 10 + + +30: shift/reduce conflict (shift 16, reduce 11) on OP_ADD +30: shift/reduce conflict (shift 17, reduce 11) on OP_SUB +30: shift/reduce conflict (shift 18, reduce 11) on OP_MUL +30: shift/reduce conflict (shift 19, reduce 11) on OP_DIV +30: shift/reduce conflict (shift 20, reduce 11) on OP_MOD +30: shift/reduce conflict (shift 21, reduce 11) on OP_AND +30: shift/reduce conflict (shift 22, reduce 11) on '|' +state 30 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr OP_MOD expr . (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 11 + ')' reduce 11 + + +31: shift/reduce conflict (shift 16, reduce 12) on OP_ADD +31: shift/reduce conflict (shift 17, reduce 12) on OP_SUB +31: shift/reduce conflict (shift 18, reduce 12) on OP_MUL +31: shift/reduce conflict (shift 19, reduce 12) on OP_DIV +31: shift/reduce conflict (shift 20, reduce 12) on OP_MOD +31: shift/reduce conflict (shift 21, reduce 12) on OP_AND +31: shift/reduce conflict (shift 22, reduce 12) on '|' +state 31 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr OP_AND expr . (12) + expr : expr . '|' expr (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' shift 22 + '\n' reduce 12 + ')' reduce 12 + + +32: shift/reduce conflict (shift 16, reduce 13) on OP_ADD +32: shift/reduce conflict (shift 17, reduce 13) on OP_SUB +32: shift/reduce conflict (shift 18, reduce 13) on OP_MUL +32: shift/reduce conflict (shift 19, reduce 13) on OP_DIV +32: shift/reduce conflict (shift 20, reduce 13) on OP_MOD +32: shift/reduce conflict (shift 21, reduce 13) on OP_AND +state 32 + expr : expr . OP_ADD expr (7) + expr : expr . OP_SUB expr (8) + expr : expr . OP_MUL expr (9) + expr : expr . OP_DIV expr (10) + expr : expr . OP_MOD expr (11) + expr : expr . OP_AND expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + OP_ADD shift 16 + OP_SUB shift 17 + OP_MUL shift 18 + OP_DIV shift 19 + OP_MOD shift 20 + OP_AND shift 21 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +State 12 contains 6 shift/reduce conflicts. +State 26 contains 7 shift/reduce conflicts. +State 27 contains 7 shift/reduce conflicts. +State 28 contains 7 shift/reduce conflicts. +State 29 contains 7 shift/reduce conflicts. +State 30 contains 7 shift/reduce conflicts. +State 31 contains 7 shift/reduce conflicts. +State 32 contains 6 shift/reduce conflicts. + + +28 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/quote_calc3.tab.c b/contrib/byacc/test/quote_calc3.tab.c new file mode 100644 index 00000000000..731b4ab24b6 --- /dev/null +++ b/contrib/byacc/test/quote_calc3.tab.c @@ -0,0 +1,688 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse quote_calc3_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex quote_calc3_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror quote_calc3_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar quote_calc3_char +#endif /* yychar */ + +#ifndef yyval +#define yyval quote_calc3_val +#endif /* yyval */ + +#ifndef yylval +#define yylval quote_calc3_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug quote_calc3_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs quote_calc3_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag quote_calc3_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs quote_calc3_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen quote_calc3_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred quote_calc3_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto quote_calc3_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex quote_calc3_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex quote_calc3_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex quote_calc3_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable quote_calc3_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck quote_calc3_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname quote_calc3_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule quote_calc3_rule +#endif /* yyrule */ +#define YYPREFIX "quote_calc3_" + +#define YYPURE 0 + +#line 2 "quote_calc3.y" +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +#line 109 "quote_calc3.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 +#define YYERRCODE 256 +static const short quote_calc3_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short quote_calc3_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short quote_calc3_defred[] = { 1, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 3, + 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 0, + 0, 0, +}; +static const short quote_calc3_dgoto[] = { 1, + 7, 8, 9, +}; +static const short quote_calc3_sindex[] = { 0, + -38, 5, -36, 0, -51, -36, 7, -121, -248, 0, + 0, -243, -36, -22, 0, -36, -36, -36, -36, -36, + -36, -36, 0, -121, 0, -121, -121, -121, -121, -121, + -121, -243, +}; +static const short quote_calc3_rindex[] = { 0, + 0, 0, 0, 0, -9, 0, 0, 13, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 0, -3, -2, -1, 1, 2, + 3, -4, +}; +static const short quote_calc3_gindex[] = { 0, + 0, 42, 0, +}; +#define YYTABLESIZE 258 +static const short quote_calc3_table[] = { 16, + 15, 6, 22, 6, 14, 13, 7, 8, 9, 13, + 10, 11, 12, 16, 10, 17, 15, 18, 25, 19, + 23, 20, 4, 21, 5, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 14, 13, 7, 8, 9, + 0, 10, 11, 12, 12, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 15, 0, 0, 0, 14, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 17, 0, 18, + 0, 19, 0, 20, 0, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 4, 5, 4, 11, 16, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 21, 0, 16, 15, 16, 15, + 16, 15, 16, 15, 16, 15, 16, 15, +}; +static const short quote_calc3_check[] = { 10, + 10, 40, 124, 40, 10, 10, 10, 10, 10, 61, + 10, 10, 10, 257, 10, 259, 10, 261, 41, 263, + 269, 265, 10, 267, 10, -1, -1, -1, -1, -1, + 41, -1, -1, -1, -1, 41, 41, 41, 41, 41, + -1, 41, 41, 41, 3, -1, -1, 6, -1, -1, + -1, -1, -1, -1, 13, -1, -1, 16, 17, 18, + 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 124, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 124, 124, -1, -1, -1, 124, 124, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, -1, 259, -1, 261, + -1, 263, -1, 265, -1, 267, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + 259, -1, 259, -1, -1, -1, -1, -1, -1, -1, + 269, 270, 269, 270, 257, -1, 259, -1, 261, -1, + 263, -1, 265, -1, 267, -1, 257, 257, 259, 259, + 261, 261, 263, 263, 265, 265, 267, 267, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 271 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"OP_ADD","\"ADD-operator\"","OP_SUB","\"SUB-operator\"","OP_MUL", +"\"MUL-operator\"","OP_DIV","\"DIV-operator\"","OP_MOD","\"MOD-operator\"", +"OP_AND","\"AND-operator\"","DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr OP_ADD expr", +"expr : expr OP_SUB expr", +"expr : expr OP_MUL expr", +"expr : expr OP_DIV expr", +"expr : expr OP_MOD expr", +"expr : expr OP_AND expr", +"expr : expr '|' expr", +"expr : OP_SUB expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "quote_calc3.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 362 "quote_calc3.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "quote_calc3.y" + { yyerrok ; } +break; +case 4: +#line 39 "quote_calc3.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "quote_calc3.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "quote_calc3.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "quote_calc3.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "quote_calc3.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "quote_calc3.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "quote_calc3.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "quote_calc3.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "quote_calc3.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "quote_calc3.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "quote_calc3.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "quote_calc3.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "quote_calc3.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "quote_calc3.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 628 "quote_calc3.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/quote_calc3.tab.h b/contrib/byacc/test/quote_calc3.tab.h new file mode 100644 index 00000000000..1a465790341 --- /dev/null +++ b/contrib/byacc/test/quote_calc3.tab.h @@ -0,0 +1,9 @@ +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 diff --git a/contrib/byacc/test/quote_calc3.y b/contrib/byacc/test/quote_calc3.y new file mode 100644 index 00000000000..5feeb4a03ed --- /dev/null +++ b/contrib/byacc/test/quote_calc3.y @@ -0,0 +1,112 @@ +%{ +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +%} + +%start list + +%token OP_ADD "ADD-operator" +%token OP_SUB "SUB-operator" +%token OP_MUL "MUL-operator" +%token OP_DIV "DIV-operator" +%token OP_MOD "MOD-operator" +%token OP_AND "AND-operator" + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr OP_ADD expr + { $$ = $1 + $3; } + | expr OP_SUB expr + { $$ = $1 - $3; } + | expr OP_MUL expr + { $$ = $1 * $3; } + | expr OP_DIV expr + { $$ = $1 / $3; } + | expr OP_MOD expr + { $$ = $1 % $3; } + | expr OP_AND expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | OP_SUB expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/contrib/byacc/test/quote_calc4-s.output b/contrib/byacc/test/quote_calc4-s.output new file mode 100644 index 00000000000..a1d5afc9579 --- /dev/null +++ b/contrib/byacc/test/quote_calc4-s.output @@ -0,0 +1,557 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr "ADD-operator" expr + 8 | expr "SUB-operator" expr + 9 | expr "MUL-operator" expr + 10 | expr "DIV-operator" expr + 11 | expr "MOD-operator" expr + 12 | expr "AND-operator" expr + 13 | expr '|' expr + 14 | "SUB-operator" expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + expr : "SUB-operator" . expr (14) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 12 + number goto 9 + + +state 4 + number : DIGIT . (17) + + . reduce 17 + + +state 5 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 13 + "ADD-operator" reduce 15 + "SUB-operator" reduce 15 + "MUL-operator" reduce 15 + "DIV-operator" reduce 15 + "MOD-operator" reduce 15 + "AND-operator" reduce 15 + '|' reduce 15 + '\n' reduce 15 + + +state 6 + expr : '(' . expr ')' (6) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + "ADD-operator" reduce 16 + "SUB-operator" reduce 16 + "MUL-operator" reduce 16 + "DIV-operator" reduce 16 + "MOD-operator" reduce 16 + "AND-operator" reduce 16 + '|' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + expr : LETTER . (15) + + . reduce 15 + + +12: shift/reduce conflict (shift 16, reduce 14) on "ADD-operator" +12: shift/reduce conflict (shift 17, reduce 14) on "SUB-operator" +12: shift/reduce conflict (shift 18, reduce 14) on "MUL-operator" +12: shift/reduce conflict (shift 19, reduce 14) on "DIV-operator" +12: shift/reduce conflict (shift 20, reduce 14) on "MOD-operator" +12: shift/reduce conflict (shift 21, reduce 14) on "AND-operator" +state 12 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + expr : "SUB-operator" expr . (14) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' reduce 14 + '\n' reduce 14 + ')' reduce 14 + + +state 13 + stat : LETTER '=' . expr (5) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr "ADD-operator" . expr (7) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr "SUB-operator" . expr (8) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr "MUL-operator" . expr (9) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr "DIV-operator" . expr (10) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr "MOD-operator" . expr (11) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr "AND-operator" . expr (12) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '|' . expr (13) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +26: shift/reduce conflict (shift 16, reduce 7) on "ADD-operator" +26: shift/reduce conflict (shift 17, reduce 7) on "SUB-operator" +26: shift/reduce conflict (shift 18, reduce 7) on "MUL-operator" +26: shift/reduce conflict (shift 19, reduce 7) on "DIV-operator" +26: shift/reduce conflict (shift 20, reduce 7) on "MOD-operator" +26: shift/reduce conflict (shift 21, reduce 7) on "AND-operator" +26: shift/reduce conflict (shift 22, reduce 7) on '|' +state 26 + expr : expr . "ADD-operator" expr (7) + expr : expr "ADD-operator" expr . (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 7 + ')' reduce 7 + + +27: shift/reduce conflict (shift 16, reduce 8) on "ADD-operator" +27: shift/reduce conflict (shift 17, reduce 8) on "SUB-operator" +27: shift/reduce conflict (shift 18, reduce 8) on "MUL-operator" +27: shift/reduce conflict (shift 19, reduce 8) on "DIV-operator" +27: shift/reduce conflict (shift 20, reduce 8) on "MOD-operator" +27: shift/reduce conflict (shift 21, reduce 8) on "AND-operator" +27: shift/reduce conflict (shift 22, reduce 8) on '|' +state 27 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr "SUB-operator" expr . (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 8 + ')' reduce 8 + + +28: shift/reduce conflict (shift 16, reduce 9) on "ADD-operator" +28: shift/reduce conflict (shift 17, reduce 9) on "SUB-operator" +28: shift/reduce conflict (shift 18, reduce 9) on "MUL-operator" +28: shift/reduce conflict (shift 19, reduce 9) on "DIV-operator" +28: shift/reduce conflict (shift 20, reduce 9) on "MOD-operator" +28: shift/reduce conflict (shift 21, reduce 9) on "AND-operator" +28: shift/reduce conflict (shift 22, reduce 9) on '|' +state 28 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr "MUL-operator" expr . (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 9 + ')' reduce 9 + + +29: shift/reduce conflict (shift 16, reduce 10) on "ADD-operator" +29: shift/reduce conflict (shift 17, reduce 10) on "SUB-operator" +29: shift/reduce conflict (shift 18, reduce 10) on "MUL-operator" +29: shift/reduce conflict (shift 19, reduce 10) on "DIV-operator" +29: shift/reduce conflict (shift 20, reduce 10) on "MOD-operator" +29: shift/reduce conflict (shift 21, reduce 10) on "AND-operator" +29: shift/reduce conflict (shift 22, reduce 10) on '|' +state 29 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr "DIV-operator" expr . (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 10 + ')' reduce 10 + + +30: shift/reduce conflict (shift 16, reduce 11) on "ADD-operator" +30: shift/reduce conflict (shift 17, reduce 11) on "SUB-operator" +30: shift/reduce conflict (shift 18, reduce 11) on "MUL-operator" +30: shift/reduce conflict (shift 19, reduce 11) on "DIV-operator" +30: shift/reduce conflict (shift 20, reduce 11) on "MOD-operator" +30: shift/reduce conflict (shift 21, reduce 11) on "AND-operator" +30: shift/reduce conflict (shift 22, reduce 11) on '|' +state 30 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr "MOD-operator" expr . (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 11 + ')' reduce 11 + + +31: shift/reduce conflict (shift 16, reduce 12) on "ADD-operator" +31: shift/reduce conflict (shift 17, reduce 12) on "SUB-operator" +31: shift/reduce conflict (shift 18, reduce 12) on "MUL-operator" +31: shift/reduce conflict (shift 19, reduce 12) on "DIV-operator" +31: shift/reduce conflict (shift 20, reduce 12) on "MOD-operator" +31: shift/reduce conflict (shift 21, reduce 12) on "AND-operator" +31: shift/reduce conflict (shift 22, reduce 12) on '|' +state 31 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr "AND-operator" expr . (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 12 + ')' reduce 12 + + +32: shift/reduce conflict (shift 16, reduce 13) on "ADD-operator" +32: shift/reduce conflict (shift 17, reduce 13) on "SUB-operator" +32: shift/reduce conflict (shift 18, reduce 13) on "MUL-operator" +32: shift/reduce conflict (shift 19, reduce 13) on "DIV-operator" +32: shift/reduce conflict (shift 20, reduce 13) on "MOD-operator" +32: shift/reduce conflict (shift 21, reduce 13) on "AND-operator" +state 32 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +State 12 contains 6 shift/reduce conflicts. +State 26 contains 7 shift/reduce conflicts. +State 27 contains 7 shift/reduce conflicts. +State 28 contains 7 shift/reduce conflicts. +State 29 contains 7 shift/reduce conflicts. +State 30 contains 7 shift/reduce conflicts. +State 31 contains 7 shift/reduce conflicts. +State 32 contains 6 shift/reduce conflicts. + + +28 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/quote_calc4-s.tab.c b/contrib/byacc/test/quote_calc4-s.tab.c new file mode 100644 index 00000000000..29e176a61ac --- /dev/null +++ b/contrib/byacc/test/quote_calc4-s.tab.c @@ -0,0 +1,688 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse quote_calc4_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex quote_calc4_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror quote_calc4_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar quote_calc4_char +#endif /* yychar */ + +#ifndef yyval +#define yyval quote_calc4_val +#endif /* yyval */ + +#ifndef yylval +#define yylval quote_calc4_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug quote_calc4_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs quote_calc4_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag quote_calc4_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs quote_calc4_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen quote_calc4_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred quote_calc4_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto quote_calc4_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex quote_calc4_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex quote_calc4_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex quote_calc4_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable quote_calc4_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck quote_calc4_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname quote_calc4_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule quote_calc4_rule +#endif /* yyrule */ +#define YYPREFIX "quote_calc4_" + +#define YYPURE 0 + +#line 2 "quote_calc4.y" +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +#line 109 "quote_calc4-s.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 +#define YYERRCODE 256 +static const short quote_calc4_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short quote_calc4_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short quote_calc4_defred[] = { 1, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 3, + 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 0, + 0, 0, +}; +static const short quote_calc4_dgoto[] = { 1, + 7, 8, 9, +}; +static const short quote_calc4_sindex[] = { 0, + -38, 4, -36, 0, -51, -36, 6, -121, -249, 0, + 0, -243, -36, -23, 0, -36, -36, -36, -36, -36, + -36, -36, 0, -121, 0, -121, -121, -121, -121, -121, + -121, -243, +}; +static const short quote_calc4_rindex[] = { 0, + 0, 0, 0, 0, -9, 0, 0, 12, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 0, -3, -2, -1, 1, 2, + 3, -4, +}; +static const short quote_calc4_gindex[] = { 0, + 0, 42, 0, +}; +#define YYTABLESIZE 259 +static const short quote_calc4_table[] = { 16, + 15, 6, 22, 6, 14, 13, 7, 8, 9, 13, + 10, 11, 12, 10, 16, 15, 17, 25, 18, 23, + 19, 4, 20, 5, 21, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 14, 13, 7, 8, 9, + 0, 10, 11, 12, 12, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 15, 0, 0, 0, 14, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 17, 0, + 18, 0, 19, 0, 20, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, + 4, 5, 4, 11, 16, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 21, 0, 0, 16, 15, 16, + 15, 16, 15, 16, 15, 16, 15, 16, 15, +}; +static const short quote_calc4_check[] = { 10, + 10, 40, 124, 40, 10, 10, 10, 10, 10, 61, + 10, 10, 10, 10, 258, 10, 260, 41, 262, 269, + 264, 10, 266, 10, 268, -1, -1, -1, -1, -1, + 41, -1, -1, -1, -1, 41, 41, 41, 41, 41, + -1, 41, 41, 41, 3, -1, -1, 6, -1, -1, + -1, -1, -1, -1, 13, -1, -1, 16, 17, 18, + 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 124, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 124, 124, -1, -1, -1, 124, 124, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 258, -1, 260, -1, + 262, -1, 264, -1, 266, -1, 268, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + -1, 260, -1, 260, -1, -1, -1, -1, -1, -1, + 269, 270, 269, 270, 258, -1, 260, -1, 262, -1, + 264, -1, 266, -1, 268, -1, -1, 258, 258, 260, + 260, 262, 262, 264, 264, 266, 266, 268, 268, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 271 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"OP_ADD","\"ADD-operator\"","OP_SUB","\"SUB-operator\"","OP_MUL", +"\"MUL-operator\"","OP_DIV","\"DIV-operator\"","OP_MOD","\"MOD-operator\"", +"OP_AND","\"AND-operator\"","DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr \"ADD-operator\" expr", +"expr : expr \"SUB-operator\" expr", +"expr : expr \"MUL-operator\" expr", +"expr : expr \"DIV-operator\" expr", +"expr : expr \"MOD-operator\" expr", +"expr : expr \"AND-operator\" expr", +"expr : expr '|' expr", +"expr : \"SUB-operator\" expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "quote_calc4.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 362 "quote_calc4-s.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "quote_calc4.y" + { yyerrok ; } +break; +case 4: +#line 39 "quote_calc4.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "quote_calc4.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "quote_calc4.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "quote_calc4.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "quote_calc4.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "quote_calc4.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "quote_calc4.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "quote_calc4.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "quote_calc4.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "quote_calc4.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "quote_calc4.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "quote_calc4.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "quote_calc4.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "quote_calc4.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 628 "quote_calc4-s.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/quote_calc4-s.tab.h b/contrib/byacc/test/quote_calc4-s.tab.h new file mode 100644 index 00000000000..1a465790341 --- /dev/null +++ b/contrib/byacc/test/quote_calc4-s.tab.h @@ -0,0 +1,9 @@ +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 diff --git a/contrib/byacc/test/quote_calc4.output b/contrib/byacc/test/quote_calc4.output new file mode 100644 index 00000000000..a1d5afc9579 --- /dev/null +++ b/contrib/byacc/test/quote_calc4.output @@ -0,0 +1,557 @@ + 0 $accept : list $end + + 1 list : + 2 | list stat '\n' + 3 | list error '\n' + + 4 stat : expr + 5 | LETTER '=' expr + + 6 expr : '(' expr ')' + 7 | expr "ADD-operator" expr + 8 | expr "SUB-operator" expr + 9 | expr "MUL-operator" expr + 10 | expr "DIV-operator" expr + 11 | expr "MOD-operator" expr + 12 | expr "AND-operator" expr + 13 | expr '|' expr + 14 | "SUB-operator" expr + 15 | LETTER + 16 | number + + 17 number : DIGIT + 18 | number DIGIT + +state 0 + $accept : . list $end (0) + list : . (1) + + . reduce 1 + + list goto 1 + + +state 1 + $accept : list . $end (0) + list : list . stat '\n' (2) + list : list . error '\n' (3) + + $end accept + error shift 2 + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 5 + '(' shift 6 + . error + + stat goto 7 + expr goto 8 + number goto 9 + + +state 2 + list : list error . '\n' (3) + + '\n' shift 10 + . error + + +state 3 + expr : "SUB-operator" . expr (14) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 12 + number goto 9 + + +state 4 + number : DIGIT . (17) + + . reduce 17 + + +state 5 + stat : LETTER . '=' expr (5) + expr : LETTER . (15) + + '=' shift 13 + "ADD-operator" reduce 15 + "SUB-operator" reduce 15 + "MUL-operator" reduce 15 + "DIV-operator" reduce 15 + "MOD-operator" reduce 15 + "AND-operator" reduce 15 + '|' reduce 15 + '\n' reduce 15 + + +state 6 + expr : '(' . expr ')' (6) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 14 + number goto 9 + + +state 7 + list : list stat . '\n' (2) + + '\n' shift 15 + . error + + +state 8 + stat : expr . (4) + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 4 + + +state 9 + expr : number . (16) + number : number . DIGIT (18) + + DIGIT shift 23 + "ADD-operator" reduce 16 + "SUB-operator" reduce 16 + "MUL-operator" reduce 16 + "DIV-operator" reduce 16 + "MOD-operator" reduce 16 + "AND-operator" reduce 16 + '|' reduce 16 + '\n' reduce 16 + ')' reduce 16 + + +state 10 + list : list error '\n' . (3) + + . reduce 3 + + +state 11 + expr : LETTER . (15) + + . reduce 15 + + +12: shift/reduce conflict (shift 16, reduce 14) on "ADD-operator" +12: shift/reduce conflict (shift 17, reduce 14) on "SUB-operator" +12: shift/reduce conflict (shift 18, reduce 14) on "MUL-operator" +12: shift/reduce conflict (shift 19, reduce 14) on "DIV-operator" +12: shift/reduce conflict (shift 20, reduce 14) on "MOD-operator" +12: shift/reduce conflict (shift 21, reduce 14) on "AND-operator" +state 12 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + expr : "SUB-operator" expr . (14) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' reduce 14 + '\n' reduce 14 + ')' reduce 14 + + +state 13 + stat : LETTER '=' . expr (5) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 24 + number goto 9 + + +state 14 + expr : '(' expr . ')' (6) + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + ')' shift 25 + . error + + +state 15 + list : list stat '\n' . (2) + + . reduce 2 + + +state 16 + expr : expr "ADD-operator" . expr (7) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 26 + number goto 9 + + +state 17 + expr : expr "SUB-operator" . expr (8) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 27 + number goto 9 + + +state 18 + expr : expr "MUL-operator" . expr (9) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 28 + number goto 9 + + +state 19 + expr : expr "DIV-operator" . expr (10) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 29 + number goto 9 + + +state 20 + expr : expr "MOD-operator" . expr (11) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 30 + number goto 9 + + +state 21 + expr : expr "AND-operator" . expr (12) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 31 + number goto 9 + + +state 22 + expr : expr '|' . expr (13) + + "SUB-operator" shift 3 + DIGIT shift 4 + LETTER shift 11 + '(' shift 6 + . error + + expr goto 32 + number goto 9 + + +state 23 + number : number DIGIT . (18) + + . reduce 18 + + +state 24 + stat : LETTER '=' expr . (5) + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 5 + + +state 25 + expr : '(' expr ')' . (6) + + . reduce 6 + + +26: shift/reduce conflict (shift 16, reduce 7) on "ADD-operator" +26: shift/reduce conflict (shift 17, reduce 7) on "SUB-operator" +26: shift/reduce conflict (shift 18, reduce 7) on "MUL-operator" +26: shift/reduce conflict (shift 19, reduce 7) on "DIV-operator" +26: shift/reduce conflict (shift 20, reduce 7) on "MOD-operator" +26: shift/reduce conflict (shift 21, reduce 7) on "AND-operator" +26: shift/reduce conflict (shift 22, reduce 7) on '|' +state 26 + expr : expr . "ADD-operator" expr (7) + expr : expr "ADD-operator" expr . (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 7 + ')' reduce 7 + + +27: shift/reduce conflict (shift 16, reduce 8) on "ADD-operator" +27: shift/reduce conflict (shift 17, reduce 8) on "SUB-operator" +27: shift/reduce conflict (shift 18, reduce 8) on "MUL-operator" +27: shift/reduce conflict (shift 19, reduce 8) on "DIV-operator" +27: shift/reduce conflict (shift 20, reduce 8) on "MOD-operator" +27: shift/reduce conflict (shift 21, reduce 8) on "AND-operator" +27: shift/reduce conflict (shift 22, reduce 8) on '|' +state 27 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr "SUB-operator" expr . (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 8 + ')' reduce 8 + + +28: shift/reduce conflict (shift 16, reduce 9) on "ADD-operator" +28: shift/reduce conflict (shift 17, reduce 9) on "SUB-operator" +28: shift/reduce conflict (shift 18, reduce 9) on "MUL-operator" +28: shift/reduce conflict (shift 19, reduce 9) on "DIV-operator" +28: shift/reduce conflict (shift 20, reduce 9) on "MOD-operator" +28: shift/reduce conflict (shift 21, reduce 9) on "AND-operator" +28: shift/reduce conflict (shift 22, reduce 9) on '|' +state 28 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr "MUL-operator" expr . (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 9 + ')' reduce 9 + + +29: shift/reduce conflict (shift 16, reduce 10) on "ADD-operator" +29: shift/reduce conflict (shift 17, reduce 10) on "SUB-operator" +29: shift/reduce conflict (shift 18, reduce 10) on "MUL-operator" +29: shift/reduce conflict (shift 19, reduce 10) on "DIV-operator" +29: shift/reduce conflict (shift 20, reduce 10) on "MOD-operator" +29: shift/reduce conflict (shift 21, reduce 10) on "AND-operator" +29: shift/reduce conflict (shift 22, reduce 10) on '|' +state 29 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr "DIV-operator" expr . (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 10 + ')' reduce 10 + + +30: shift/reduce conflict (shift 16, reduce 11) on "ADD-operator" +30: shift/reduce conflict (shift 17, reduce 11) on "SUB-operator" +30: shift/reduce conflict (shift 18, reduce 11) on "MUL-operator" +30: shift/reduce conflict (shift 19, reduce 11) on "DIV-operator" +30: shift/reduce conflict (shift 20, reduce 11) on "MOD-operator" +30: shift/reduce conflict (shift 21, reduce 11) on "AND-operator" +30: shift/reduce conflict (shift 22, reduce 11) on '|' +state 30 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr "MOD-operator" expr . (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 11 + ')' reduce 11 + + +31: shift/reduce conflict (shift 16, reduce 12) on "ADD-operator" +31: shift/reduce conflict (shift 17, reduce 12) on "SUB-operator" +31: shift/reduce conflict (shift 18, reduce 12) on "MUL-operator" +31: shift/reduce conflict (shift 19, reduce 12) on "DIV-operator" +31: shift/reduce conflict (shift 20, reduce 12) on "MOD-operator" +31: shift/reduce conflict (shift 21, reduce 12) on "AND-operator" +31: shift/reduce conflict (shift 22, reduce 12) on '|' +state 31 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr "AND-operator" expr . (12) + expr : expr . '|' expr (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' shift 22 + '\n' reduce 12 + ')' reduce 12 + + +32: shift/reduce conflict (shift 16, reduce 13) on "ADD-operator" +32: shift/reduce conflict (shift 17, reduce 13) on "SUB-operator" +32: shift/reduce conflict (shift 18, reduce 13) on "MUL-operator" +32: shift/reduce conflict (shift 19, reduce 13) on "DIV-operator" +32: shift/reduce conflict (shift 20, reduce 13) on "MOD-operator" +32: shift/reduce conflict (shift 21, reduce 13) on "AND-operator" +state 32 + expr : expr . "ADD-operator" expr (7) + expr : expr . "SUB-operator" expr (8) + expr : expr . "MUL-operator" expr (9) + expr : expr . "DIV-operator" expr (10) + expr : expr . "MOD-operator" expr (11) + expr : expr . "AND-operator" expr (12) + expr : expr . '|' expr (13) + expr : expr '|' expr . (13) + + "ADD-operator" shift 16 + "SUB-operator" shift 17 + "MUL-operator" shift 18 + "DIV-operator" shift 19 + "MOD-operator" shift 20 + "AND-operator" shift 21 + '|' reduce 13 + '\n' reduce 13 + ')' reduce 13 + + +State 12 contains 6 shift/reduce conflicts. +State 26 contains 7 shift/reduce conflicts. +State 27 contains 7 shift/reduce conflicts. +State 28 contains 7 shift/reduce conflicts. +State 29 contains 7 shift/reduce conflicts. +State 30 contains 7 shift/reduce conflicts. +State 31 contains 7 shift/reduce conflicts. +State 32 contains 6 shift/reduce conflicts. + + +28 terminals, 5 nonterminals +19 grammar rules, 33 states diff --git a/contrib/byacc/test/quote_calc4.tab.c b/contrib/byacc/test/quote_calc4.tab.c new file mode 100644 index 00000000000..da2f25e800a --- /dev/null +++ b/contrib/byacc/test/quote_calc4.tab.c @@ -0,0 +1,688 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + + +#ifndef yyparse +#define yyparse quote_calc4_parse +#endif /* yyparse */ + +#ifndef yylex +#define yylex quote_calc4_lex +#endif /* yylex */ + +#ifndef yyerror +#define yyerror quote_calc4_error +#endif /* yyerror */ + +#ifndef yychar +#define yychar quote_calc4_char +#endif /* yychar */ + +#ifndef yyval +#define yyval quote_calc4_val +#endif /* yyval */ + +#ifndef yylval +#define yylval quote_calc4_lval +#endif /* yylval */ + +#ifndef yydebug +#define yydebug quote_calc4_debug +#endif /* yydebug */ + +#ifndef yynerrs +#define yynerrs quote_calc4_nerrs +#endif /* yynerrs */ + +#ifndef yyerrflag +#define yyerrflag quote_calc4_errflag +#endif /* yyerrflag */ + +#ifndef yylhs +#define yylhs quote_calc4_lhs +#endif /* yylhs */ + +#ifndef yylen +#define yylen quote_calc4_len +#endif /* yylen */ + +#ifndef yydefred +#define yydefred quote_calc4_defred +#endif /* yydefred */ + +#ifndef yydgoto +#define yydgoto quote_calc4_dgoto +#endif /* yydgoto */ + +#ifndef yysindex +#define yysindex quote_calc4_sindex +#endif /* yysindex */ + +#ifndef yyrindex +#define yyrindex quote_calc4_rindex +#endif /* yyrindex */ + +#ifndef yygindex +#define yygindex quote_calc4_gindex +#endif /* yygindex */ + +#ifndef yytable +#define yytable quote_calc4_table +#endif /* yytable */ + +#ifndef yycheck +#define yycheck quote_calc4_check +#endif /* yycheck */ + +#ifndef yyname +#define yyname quote_calc4_name +#endif /* yyname */ + +#ifndef yyrule +#define yyrule quote_calc4_rule +#endif /* yyrule */ +#define YYPREFIX "quote_calc4_" + +#define YYPURE 0 + +#line 2 "quote_calc4.y" +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +#line 109 "quote_calc4.tab.c" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 +#define YYERRCODE 256 +static const short quote_calc4_lhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short quote_calc4_len[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short quote_calc4_defred[] = { 1, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 3, + 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 0, + 0, 0, +}; +static const short quote_calc4_dgoto[] = { 1, + 7, 8, 9, +}; +static const short quote_calc4_sindex[] = { 0, + -38, 4, -36, 0, -51, -36, 6, -121, -249, 0, + 0, -243, -36, -23, 0, -36, -36, -36, -36, -36, + -36, -36, 0, -121, 0, -121, -121, -121, -121, -121, + -121, -243, +}; +static const short quote_calc4_rindex[] = { 0, + 0, 0, 0, 0, -9, 0, 0, 12, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 0, -3, -2, -1, 1, 2, + 3, -4, +}; +static const short quote_calc4_gindex[] = { 0, + 0, 42, 0, +}; +#define YYTABLESIZE 259 +static const short quote_calc4_table[] = { 16, + 15, 6, 22, 6, 14, 13, 7, 8, 9, 13, + 10, 11, 12, 10, 16, 15, 17, 25, 18, 23, + 19, 4, 20, 5, 21, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 14, 13, 7, 8, 9, + 0, 10, 11, 12, 12, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 15, 0, 0, 0, 14, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 17, 0, + 18, 0, 19, 0, 20, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, + 4, 5, 4, 11, 16, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 21, 0, 0, 16, 15, 16, + 15, 16, 15, 16, 15, 16, 15, 16, 15, +}; +static const short quote_calc4_check[] = { 10, + 10, 40, 124, 40, 10, 10, 10, 10, 10, 61, + 10, 10, 10, 10, 258, 10, 260, 41, 262, 269, + 264, 10, 266, 10, 268, -1, -1, -1, -1, -1, + 41, -1, -1, -1, -1, 41, 41, 41, 41, 41, + -1, 41, 41, 41, 3, -1, -1, 6, -1, -1, + -1, -1, -1, -1, 13, -1, -1, 16, 17, 18, + 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 124, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 124, 124, -1, -1, -1, 124, 124, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 258, -1, 260, -1, + 262, -1, 264, -1, 266, -1, 268, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + -1, 260, -1, 260, -1, -1, -1, -1, -1, -1, + 269, 270, 269, 270, 258, -1, 260, -1, 262, -1, + 264, -1, 266, -1, 268, -1, -1, 258, 258, 260, + 260, 262, 262, 264, 264, 266, 266, 268, 268, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 271 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"OP_ADD","\"ADD-operator\"","OP_SUB","\"SUB-operator\"","OP_MUL", +"\"MUL-operator\"","OP_DIV","\"DIV-operator\"","OP_MOD","\"MOD-operator\"", +"OP_AND","\"AND-operator\"","DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr \"ADD-operator\" expr", +"expr : expr \"SUB-operator\" expr", +"expr : expr \"MUL-operator\" expr", +"expr : expr \"DIV-operator\" expr", +"expr : expr \"MOD-operator\" expr", +"expr : expr \"AND-operator\" expr", +"expr : expr '|' expr", +"expr : \"SUB-operator\" expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "quote_calc4.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 362 "quote_calc4.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "quote_calc4.y" + { yyerrok ; } +break; +case 4: +#line 39 "quote_calc4.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "quote_calc4.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "quote_calc4.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "quote_calc4.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "quote_calc4.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "quote_calc4.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "quote_calc4.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "quote_calc4.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "quote_calc4.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "quote_calc4.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "quote_calc4.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "quote_calc4.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "quote_calc4.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "quote_calc4.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 628 "quote_calc4.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/contrib/byacc/test/quote_calc4.tab.h b/contrib/byacc/test/quote_calc4.tab.h new file mode 100644 index 00000000000..1a465790341 --- /dev/null +++ b/contrib/byacc/test/quote_calc4.tab.h @@ -0,0 +1,9 @@ +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 diff --git a/contrib/byacc/test/quote_calc4.y b/contrib/byacc/test/quote_calc4.y new file mode 100644 index 00000000000..34b790e67f1 --- /dev/null +++ b/contrib/byacc/test/quote_calc4.y @@ -0,0 +1,112 @@ +%{ +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +%} + +%start list + +%token OP_ADD "ADD-operator" +%token OP_SUB "SUB-operator" +%token OP_MUL "MUL-operator" +%token OP_DIV "DIV-operator" +%token OP_MOD "MOD-operator" +%token OP_AND "AND-operator" + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr "ADD-operator" expr + { $$ = $1 + $3; } + | expr "SUB-operator" expr + { $$ = $1 - $3; } + | expr "MUL-operator" expr + { $$ = $1 * $3; } + | expr "DIV-operator" expr + { $$ = $1 / $3; } + | expr "MOD-operator" expr + { $$ = $1 % $3; } + | expr "AND-operator" expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | "SUB-operator" expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/contrib/byacc/test/run_lint.sh b/contrib/byacc/test/run_lint.sh new file mode 100755 index 00000000000..3230551045c --- /dev/null +++ b/contrib/byacc/test/run_lint.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# $Id: run_lint.sh,v 1.1 2010/06/08 09:00:58 tom Exp $ +# vi:ts=4 sw=4: + +# run lint on each of the ".c" files in the test directory + +if test $# = 1 +then + PROG_DIR=`pwd` + TEST_DIR=$1 +else + PROG_DIR=.. + TEST_DIR=. +fi + +echo '** '`date` +for i in ${TEST_DIR}/*.c +do + make -f $PROG_DIR/makefile lint C_FILES=$i srcdir=$PROG_DIR +done diff --git a/contrib/byacc/test/run_make.sh b/contrib/byacc/test/run_make.sh new file mode 100755 index 00000000000..2bbe95d1841 --- /dev/null +++ b/contrib/byacc/test/run_make.sh @@ -0,0 +1,139 @@ +#!/bin/sh +# $Id: run_make.sh,v 1.9 2012/01/15 22:35:01 tom Exp $ +# vi:ts=4 sw=4: + +# do a test-compile on each of the ".c" files in the test-directory + +BISON=`bison --version 2>/dev/null | head -n 1 | sed -e 's/^[^0-9.]*//' -e 's/[^0-9.]*$//'` + +if test $# = 1 +then + PROG_DIR=`pwd` + TEST_DIR=$1 +else + PROG_DIR=.. + TEST_DIR=. +fi + +MY_MAKE="make -f $PROG_DIR/makefile srcdir=$PROG_DIR VPATH=$TEST_DIR" + +echo '** '`date` +for input in ${TEST_DIR}/*.c +do + test -f "$input" || continue + + obj=`basename "$input" .c`.o + + $MY_MAKE $obj C_FILES=$input + test -f $obj && rm $obj + + DEFS= + case $input in #(vi + ${TEST_DIR}/pure_*) + # DEFS="-DYYLEX_PARAM=flag -DYYLEX_PARAM_TYPE=int" + ;; + esac + + if test "x$DEFS" != "x" + then + $MY_MAKE $obj C_FILES=$input DEFINES="$DEFS" + test -f $obj && rm -f $obj + fi +done + +if test -n "$BISON" +then + echo "** compare with bison $BISON" + for input in ${TEST_DIR}/*.y + do + test -f "$input" || continue + + # Bison does not support pure-parser from command-line. + # Also, its support for %expect is generally broken. + # Work around these issues using a temporary file. + + echo "... testing $input" + rm -f run_make.[coy] + + case $input in + pure_*) + if test -z `fgrep -l '%pure-parser' $input` + then + echo "%pure-parser" >>run_make.y + fi + ;; + esac + + sed -e '/^%expect/s,%expect.*,,' $input >>run_make.y + + bison -y run_make.y + sed -e '/^#line/s,"run_make.y","'$input'",' y.tab.c >run_make.c + + rm -f y.tab.c + + input=run_make.c + object=run_make.o + if test -f $input + then + $MY_MAKE $object DEFINES='-DYYENABLE_NLS=0 -DYYLTYPE_IS_TRIVIAL=1 -DYYSTACK_USE_ALLOCA=0 -DYYMAXDEPTH=0' + else + echo "?? $input not found" + fi + rm -f run_make.[coy] + done +fi + +YACC= +for name in /usr/ccs/bin/yacc +do + if test -f $name + then + YACC=$name + fi +done + +if test -n "$YACC" +then + echo "** compare with $YACC" + for input in ${TEST_DIR}/*.y + do + test -f "$input" || continue + + echo "... testing $input" + rm -f run_make.[coy] + + case $input in + pure_*) + echo "... skipping $input" + continue; + ;; + *) + if fgrep '%pure-parser' $input >/dev/null || + fgrep '%parse-param' $input >/dev/null || + fgrep '%lex-param' $input >/dev/null || + fgrep 'YYLEX_PARAM' $input >/dev/null + then + echo "... skipping $input" + continue; + fi + ;; + esac + + sed -e '/^%expect/s,%expect.*,,' $input >>run_make.y + + $YACC run_make.y + sed -e '/^#line/s,"run_make.y","'$input'",' y.tab.c >run_make.c + + rm -f y.tab.c + + input=run_make.c + object=run_make.o + if test -f $input + then + $MY_MAKE $object + else + echo "?? $input not found" + fi + rm -f run_make.[coy] + done +fi diff --git a/contrib/byacc/test/run_test.sh b/contrib/byacc/test/run_test.sh new file mode 100755 index 00000000000..ae8591b8c68 --- /dev/null +++ b/contrib/byacc/test/run_test.sh @@ -0,0 +1,82 @@ +#!/bin/sh +# $Id: run_test.sh,v 1.8 2012/01/15 11:50:35 tom Exp $ +# vi:ts=4 sw=4: + +if test $# = 1 +then + PROG_DIR=`pwd` + TEST_DIR=$1 +else + PROG_DIR=.. + TEST_DIR=. +fi + +YACC=$PROG_DIR/yacc + +tmpfile=temp$$ +rm -f test-* + +echo '** '`date` +for input in ${TEST_DIR}/*.y +do + case $input in + test*) + echo "?? ignored $input" + ;; + *) + root=`basename $input .y` + ROOT="test-$root" + prefix=${root}_ + + OPTS= + OPT2= + TYPE=".output .tab.c .tab.h" + case $input in + ${TEST_DIR}/code_*) + OPTS="$OPTS -r" + TYPE="$TYPE .code.c" + prefix=`echo "$prefix" | sed -e 's/^code_//'` + ;; + ${TEST_DIR}/pure_*) + OPTS="$OPTS -P" + prefix=`echo "$prefix" | sed -e 's/^pure_//'` + ;; + ${TEST_DIR}/quote_*) + OPT2="-s" + ;; + esac + + for opt2 in "" $OPT2 + do + $YACC $OPTS $opt2 -v -d -p $prefix -b $ROOT${opt2} $input + for type in $TYPE + do + REF=${TEST_DIR}/${root}${opt2}${type} + CMP=${ROOT}${opt2}${type} + if test ! -f $CMP + then + echo "...not found $CMP" + else + sed -e s,$CMP,$REF, \ + -e /YYPATCH/d \ + -e 's,#line \([1-9][0-9]*\) "'$TEST_DIR'/,#line \1 ",' \ + < $CMP >$tmpfile \ + && mv $tmpfile $CMP + if test ! -f $REF + then + mv $CMP $REF + echo "...saved $REF" + elif ( cmp -s $REF $CMP ) + then + echo "...ok $REF" + rm -f $CMP + else + echo "...diff $REF" + diff -u $REF $CMP + fi + fi + done + done + ;; + esac +done diff --git a/usr.bin/yacc/verbose.c b/contrib/byacc/verbose.c similarity index 60% rename from usr.bin/yacc/verbose.c rename to contrib/byacc/verbose.c index 27fd4947439..118f8b40279 100644 --- a/usr.bin/yacc/verbose.c +++ b/contrib/byacc/verbose.c @@ -1,73 +1,35 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ +/* $Id: verbose.c,v 1.9 2010/06/09 08:58:29 tom Exp $ */ -#if 0 -#ifndef lint -static char sccsid[] = "@(#)verbose.c 5.3 (Berkeley) 1/20/91"; -#endif -#endif - -#include -__FBSDID("$FreeBSD$"); - -#include #include "defs.h" -static short *null_rules; - -static void log_unused(void); static void log_conflicts(void); -static void print_actions(int); -static void print_conflicts(int); -static void print_core(int); -static void print_gotos(int); -static void print_nulls(int); -static void print_reductions(action *, register int); -static void print_shifts(action *); -static void print_state(int); +static void log_unused(void); +static void print_actions(int stateno); +static void print_conflicts(int state); +static void print_core(int state); +static void print_gotos(int stateno); +static void print_nulls(int state); +static void print_shifts(action *p); +static void print_state(int state); +static void print_reductions(action *p, int defred2); + +static short *null_rules; void verbose(void) { int i; - if (!vflag) return; + if (!vflag) + return; + + null_rules = (short *)MALLOC((unsigned)nrules * sizeof(short)); + NO_SPACE(null_rules); - null_rules = malloc(nrules*sizeof(short)); - if (null_rules == 0) no_space(); fprintf(verbose_file, "\f\n"); for (i = 0; i < nstates; i++) print_state(i); - free(null_rules); + FREE(null_rules); if (nunused) log_unused(); @@ -79,7 +41,6 @@ verbose(void) fprintf(verbose_file, "%d grammar rules, %d states\n", nrules - 2, nstates); } - static void log_unused(void) { @@ -99,7 +60,6 @@ log_unused(void) } } - static void log_conflicts(void) { @@ -111,24 +71,21 @@ log_conflicts(void) if (SRconflicts[i] || RRconflicts[i]) { fprintf(verbose_file, "State %d contains ", i); - if (SRconflicts[i] == 1) - fprintf(verbose_file, "1 shift/reduce conflict"); - else if (SRconflicts[i] > 1) - fprintf(verbose_file, "%d shift/reduce conflicts", - SRconflicts[i]); + if (SRconflicts[i] > 0) + fprintf(verbose_file, "%d shift/reduce conflict%s", + SRconflicts[i], + PLURAL(SRconflicts[i])); if (SRconflicts[i] && RRconflicts[i]) fprintf(verbose_file, ", "); - if (RRconflicts[i] == 1) - fprintf(verbose_file, "1 reduce/reduce conflict"); - else if (RRconflicts[i] > 1) - fprintf(verbose_file, "%d reduce/reduce conflicts", - RRconflicts[i]); + if (RRconflicts[i] > 0) + fprintf(verbose_file, "%d reduce/reduce conflict%s", + RRconflicts[i], + PLURAL(RRconflicts[i])); fprintf(verbose_file, ".\n"); } } } - static void print_state(int state) { @@ -142,13 +99,14 @@ print_state(int state) print_actions(state); } - static void print_conflicts(int state) { - int symbol, act = 0, number = 0; + int symbol, act, number; action *p; + act = 0; /* not shift/reduce... */ + number = -1; symbol = -1; for (p = parser[state]; p; p = p->next) { @@ -190,7 +148,6 @@ print_conflicts(int state) } } - static void print_core(int state) { @@ -208,11 +165,12 @@ print_core(int state) { sp1 = sp = ritem + statep->items[i]; - while (*sp >= 0) ++sp; + while (*sp >= 0) + ++sp; rule = -(*sp); fprintf(verbose_file, "\t%s : ", symbol_name[rlhs[rule]]); - for (sp = ritem + rrhs[rule]; sp < sp1; sp++) + for (sp = ritem + rrhs[rule]; sp < sp1; sp++) fprintf(verbose_file, "%s ", symbol_name[*sp]); putc('.', verbose_file); @@ -226,21 +184,20 @@ print_core(int state) } } - static void print_nulls(int state) { action *p; - int i, j, k, nnulls; + Value_t i, j, k, nnulls; nnulls = 0; for (p = parser[state]; p; p = p->next) { if (p->action_code == REDUCE && - (p->suppressed == 0 || p->suppressed == 1)) + (p->suppressed == 0 || p->suppressed == 1)) { i = p->number; - if (rrhs[i] + 1 == rrhs[i+1]) + if (rrhs[i] + 1 == rrhs[i + 1]) { for (j = 0; j < nnulls && i > null_rules[j]; ++j) continue; @@ -253,8 +210,8 @@ print_nulls(int state) else if (i != null_rules[j]) { ++nnulls; - for (k = nnulls - 1; k > j; --k) - null_rules[k] = null_rules[k-1]; + for (k = (Value_t) (nnulls - 1); k > j; --k) + null_rules[k] = null_rules[k - 1]; null_rules[j] = i; } } @@ -270,7 +227,6 @@ print_nulls(int state) fprintf(verbose_file, "\n"); } - static void print_actions(int stateno) { @@ -297,7 +253,6 @@ print_actions(int stateno) } } - static void print_shifts(action *p) { @@ -317,20 +272,19 @@ print_shifts(action *p) { if (p->action_code == SHIFT && p->suppressed == 0) fprintf(verbose_file, "\t%s shift %d\n", - symbol_name[p->symbol], p->number); + symbol_name[p->symbol], p->number); } } } - static void -print_reductions(action *p, int defreduct) +print_reductions(action *p, int defred2) { int k, anyreds; action *q; anyreds = 0; - for (q = p; q ; q = q->next) + for (q = p; q; q = q->next) { if (q->action_code == REDUCE && q->suppressed < 2) { @@ -345,7 +299,7 @@ print_reductions(action *p, int defreduct) { for (; p; p = p->next) { - if (p->action_code == REDUCE && p->number != defreduct) + if (p->action_code == REDUCE && p->number != defred2) { k = p->number - 2; if (p->suppressed == 0) @@ -354,26 +308,25 @@ print_reductions(action *p, int defreduct) } } - if (defreduct > 0) - fprintf(verbose_file, "\t. reduce %d\n", defreduct - 2); + if (defred2 > 0) + fprintf(verbose_file, "\t. reduce %d\n", defred2 - 2); } } - static void print_gotos(int stateno) { int i, k; int as; - short *tostate; + short *to_state2; shifts *sp; putc('\n', verbose_file); sp = shift_table[stateno]; - tostate = sp->shift; + to_state2 = sp->shift; for (i = 0; i < sp->nshifts; ++i) { - k = tostate[i]; + k = to_state2[i]; as = accessing_symbol[k]; if (ISVAR(as)) fprintf(verbose_file, "\t%s goto %d\n", symbol_name[as], k); diff --git a/contrib/byacc/vmsbuild.com b/contrib/byacc/vmsbuild.com new file mode 100644 index 00000000000..94b02c68846 --- /dev/null +++ b/contrib/byacc/vmsbuild.com @@ -0,0 +1,210 @@ +$! $Id: vmsbuild.com,v 1.1 2000/11/21 00:38:46 tom Exp $ +$! VMS build-script for BYACC. Requires installed C compiler +$! +$! Screen Configurations +$! --------------------- +$! To build BYACC, type: +$! $ @vmsbuild [BYACC [ [bld_target]]] +$! +$! where: +$! :== { decc | vaxc } +$! +$! The default compiler on VAX hosts is vaxc, else decc (Alpha hosts). +$! +$! ----------------------------------------------------------- +$ hlp = f$edit("''p1'", "UPCASE") +$ if "''hlp'" .eqs. "HELP" .or. - + "''hlp'" .eqs. "-H" .or. - + "''hlp'" .eqs. "-?" .or. - + "''hlp'" .eqs. "?" then gosub usage +$ goto start +$! +$ vaxc_config: +$ comp = "__vaxc__=1" +$ CFLAGS = "/VAXC" +$ DEFS = ",HAVE_STRERROR" +$ using_vaxc = 1 +$ return +$! +$ decc_config: +$ comp = "__decc__=1" +$ CFLAGS = "/DECC/prefix=all" +$ DEFS = ",HAVE_ALARM,HAVE_STRERROR" +$ return +$! +$ usage: +$ write sys$output "usage: " +$ write sys$output " $ @vmsbuild [BYACC [{decc | vaxc} []]]" +$ exit 2 +$! +$ start: +$! ----------------------------------------------------------- +$! pickup user's compiler choice, if any +$! ----------------------------------------------------------- +$! +$ comp = "" +$ using_vaxc = 0 +$ if "''p2'" .nes. "" +$ then +$ comp = f$edit(p2, "UPCASE") +$ if "''comp'" .eqs. "VAXC" +$ then +$ gosub vaxc_config +$ else +$ if "''comp'" .eqs. "DECC" +$ then +$ gosub decc_config +$ else +$ gosub usage +$ endif +$ endif +$ endif +$! ----------------------------------------------------------- +$! Build the option-file +$! +$ open/write optf vms_link.opt +$ write optf "closure.obj" +$ write optf "error.obj" +$ write optf "lalr.obj" +$ write optf "lr0.obj" +$ write optf "mkpar.obj" +$ write optf "output.obj" +$ write optf "reader.obj" +$ write optf "skeleton.obj" +$ write optf "symtab.obj" +$ write optf "verbose.obj" +$ write optf "warshall.obj" +$! ---------------------------------- +$! Look for the compiler used and specify architecture. +$! +$ CC = "CC" +$ if f$getsyi("HW_MODEL").ge.1024 +$ then +$ arch = "__alpha__=1" +$ if "''comp'" .eqs. "" then gosub decc_config +$ else +$ arch = "__vax__=1" +$ if "''comp'" .nes. "" then goto screen_config +$ if f$search("SYS$SYSTEM:VAXC.EXE").nes."" +$ then +$ gosub vaxc_config +$ else +$ if f$search("SYS$SYSTEM:DECC$COMPILER.EXE").nes."" +$ then +$ gosub decc_config +$ else +$ DEFS = ",HAVE_STRERROR" +$ if f$trnlnm("GNU_CC").eqs."" +$ then +$ write sys$output "C compiler required to rebuild BYACC" +$ close optf +$ exit +$ else +$ write optf "gnu_cc:[000000]gcclib.olb/lib" +$ comp = "__gcc__=1" +$ CC = "GCC" +$ endif +$ endif +$ endif +$ endif +$! +$ screen_config: +$! +$ if using_vaxc .eq. 1 then write optf "sys$library:vaxcrtl.exe/share" +$ close optf +$! -------------- vms_link.opt is created ------------- +$ if f$edit("''p1'", "UPCASE") .eqs. "VMS_LINK.OPT" +$ then +$! mms called this script to build vms_link.opt. all done +$ exit +$ endif +$! +$ if f$search("SYS$SYSTEM:MMS.EXE").eqs."" +$ then +$! can also use /Debug /Listing, /Show=All +$ +$ CFLAGS := 'CFLAGS/Diagnostics /Define=("''DEFS'") /Include=([]) +$ +$ if "''p3'" .nes. "" then goto 'p3 +$! +$! +$ all : +$! +$ call make closure +$ call make error +$ call make lalr +$ call make lr0 +$ call make main +$ call make mkpar +$ call make output +$ call make reader +$ call make skeleton +$ call make symtab +$ call make verbose +$ call make warshall +$! +$ link /exec='target/map/cross main.obj, vms_link/opt +$ goto build_last +$! +$ install : +$ WRITE SYS$ERROR "** no rule for install" +$ goto build_last +$! +$ clobber : +$ if f$search("BYACC.com") .nes. "" then delete BYACC.com;* +$ if f$search("*.exe") .nes. "" then delete *.exe;* +$! fallthru +$! +$ clean : +$ if f$search("*.obj") .nes. "" then delete *.obj;* +$ if f$search("*.bak") .nes. "" then delete *.bak;* +$ if f$search("*.lis") .nes. "" then delete *.lis;* +$ if f$search("*.log") .nes. "" then delete *.log;* +$ if f$search("*.map") .nes. "" then delete *.map;* +$ if f$search("*.opt") .nes. "" then delete *.opt;* +$! fallthru +$! +$ build_last : +$ if f$search("*.dia") .nes. "" then delete *.dia;* +$ if f$search("*.lis") .nes. "" then purge *.lis +$ if f$search("*.obj") .nes. "" then purge *.obj +$ if f$search("*.map") .nes. "" then purge *.map +$ if f$search("*.opt") .nes. "" then purge *.opt +$ if f$search("*.exe") .nes. "" then purge *.exe +$ if f$search("*.log") .nes. "" then purge *.log +$! fallthru +$! +$ vms_link_opt : +$ exit 1 +$! +$! Runs BYACC from the current directory (used for testing) +$ byacc_com : +$ if "''f$search("BYACC.com")'" .nes. "" then delete BYACC.com;* +$ copy nl: BYACC.com +$ open/append test_script BYACC.com +$ write test_script "$ temp = f$environment(""procedure"")" +$ write test_script "$ temp = temp -" +$ write test_script " - f$parse(temp,,,""version"",""syntax_only"") -" +$ write test_script " - f$parse(temp,,,""type"",""syntax_only"")" +$ write test_script "$ BYACC :== $ 'temp'.exe" +$ write test_script "$ define/user_mode sys$input sys$command" +$ write test_script "$ define/user_mode sys$output sys$command" +$ write test_script "$ BYACC 'p1 'p2 'p3 'p4 'p5 'p6 'p7 'p8" +$ close test_script +$ write sys$output "** made BYACC.com" +$ exit +$! +$ else +$ mms/ignore=warning/macro=('comp','mmstar','arch') 'p3 +$ endif +$ exit +$ make: subroutine +$ if f$search("''p1'.obj") .eqs. "" +$ then +$ write sys$output "compiling ''p1'" +$ 'CC 'CFLAGS 'p1.c +$ if f$search("''p1'.dia") .nes. "" then delete 'p1.dia;* +$ endif +$exit +$ return +$ endsubroutine diff --git a/contrib/byacc/warshall.c b/contrib/byacc/warshall.c new file mode 100644 index 00000000000..efb7cf44797 --- /dev/null +++ b/contrib/byacc/warshall.c @@ -0,0 +1,82 @@ +/* $Id: warshall.c,v 1.7 2010/06/06 22:48:51 tom Exp $ */ + +#include "defs.h" + +static void +transitive_closure(unsigned *R, int n) +{ + int rowsize; + unsigned i; + unsigned *rowj; + unsigned *rp; + unsigned *rend; + unsigned *ccol; + unsigned *relend; + unsigned *cword; + unsigned *rowi; + + rowsize = WORDSIZE(n); + relend = R + n * rowsize; + + cword = R; + i = 0; + rowi = R; + while (rowi < relend) + { + ccol = cword; + rowj = R; + + while (rowj < relend) + { + if (*ccol & (unsigned)(1 << i)) + { + rp = rowi; + rend = rowj + rowsize; + while (rowj < rend) + *rowj++ |= *rp++; + } + else + { + rowj += rowsize; + } + + ccol += rowsize; + } + + if (++i >= BITS_PER_WORD) + { + i = 0; + cword++; + } + + rowi += rowsize; + } +} + +void +reflexive_transitive_closure(unsigned *R, int n) +{ + int rowsize; + unsigned i; + unsigned *rp; + unsigned *relend; + + transitive_closure(R, n); + + rowsize = WORDSIZE(n); + relend = R + n * rowsize; + + i = 0; + rp = R; + while (rp < relend) + { + *rp |= (unsigned)(1 << i); + if (++i >= BITS_PER_WORD) + { + i = 0; + rp++; + } + + rp += rowsize; + } +} diff --git a/contrib/byacc/yacc.1 b/contrib/byacc/yacc.1 new file mode 100644 index 00000000000..239380a360b --- /dev/null +++ b/contrib/byacc/yacc.1 @@ -0,0 +1,242 @@ +.\" $Id: yacc.1,v 1.18 2012/01/15 18:12:28 tom Exp $ +.\" +.\" .TH YACC 1 "July\ 15,\ 1990" +.\" .UC 6 +.de ES +.ne 8 +.nf +.sp +.in +4 +.. +.de EE +.in -4 +.fi +.. +.\" Bulleted paragraph +.de bP +.IP \(bu 4 +.. +.TH YACC 1 "September 7, 2011" "Berkeley Yacc" "User Commands" +.SH NAME +Yacc \- an LALR(1) parser generator +.SH SYNOPSIS +.B yacc [ -dgilrtv ] [ \-b +.I file_prefix +.B ] [ \-p +.I symbol_prefix +.B ] +.I filename +.SH DESCRIPTION +.B Yacc +reads the grammar specification in the file +.I filename +and generates an LALR(1) parser for it. +The parsers consist of a set of LALR(1) parsing tables and a driver routine +written in the C programming language. +.B Yacc +normally writes the parse tables and the driver routine to the file +.IR y.tab.c. +.PP +The following options are available: +.TP 5 +\fB\-b \fP\fIfile_prefix\fR +The +.B \-b +option changes the prefix prepended to the output file names to +the string denoted by +.IR file_prefix. +The default prefix is the character +.IR y. +.TP +.B \-d +The \fB-d\fR option causes the header file +.BR y.tab.h +to be written. +It contains #define's for the token identifiers. +.TP +.B \-g +The +.B \-g +option causes a graphical description of the generated LALR(1) parser to +be written to the file +.BR y.dot +in graphviz format, ready to be processed by dot(1). +.TP +.B \-i +The \fB-i\fR option causes a supplementary header file +.BR y.tab.i +to be written. +It contains extern declarations +and supplementary #define's as needed to map the conventional \fIyacc\fP +\fByy\fP-prefixed names to whatever the \fB-p\fP option may specify. +The code file, e.g., \fBy.tab.c\fP is modified to #include this file +as well as the \fBy.tab.h\fP file, enforcing consistent usage of the +symbols defined in those files. +.IP +The supplementary header file makes it simpler to separate compilation +of lex- and yacc-files. +.TP +.B \-l +If the +.B \-l +option is not specified, +.B yacc +will insert \fI#line\fP directives in the generated code. +The \fI#line\fP directives let the C compiler relate errors in the +generated code to the user's original code. +If the \fB-l\fR option is specified, +.B yacc +will not insert the \fI#line\fP directives. +\&\fI#line\fP directives specified by the user will be retained. +.TP +\fB\-o \fP\fIoutput_file\fR +specify the filename for the parser file. +If this option is not given, the output filename is +the file prefix concatenated with the file suffix, e.g., \fBy.tab.c\fP. +This overrides the \fB-p\fP option. +.TP +\fB\-p \fP\fIsymbol_prefix\fR +The +.B \-p +option changes the prefix prepended to yacc-generated symbols to +the string denoted by +.IR symbol_prefix. +The default prefix is the string +.BR yy. +.TP +.B \-P +create a reentrant parser, e.g., "%pure-parser". +.TP +.B \-r +The +.B \-r +option causes +.B yacc +to produce separate files for code and tables. The code file +is named +.IR y.code.c, +and the tables file is named +.IR y.tab.c. +The prefix "\fIy.\fP" can be overridden using the \fB\-b\fP option. +.TP +.B \-s +suppress "\fB#define\fP" statements generated for string literals in +a "\fB%token\fP" statement, to more closely match original \fByacc\fP behavior. +.IP +Normally when \fByacc\fP sees a line such as +.ES +%token OP_ADD "ADD" +.EE +.IP +it notices that the quoted "ADD" is a valid C identifier, +and generates a #define not only for OP_ADD, +but for ADD as well, +e.g., +.ES +#define OP_ADD 257 +.br +#define ADD 258 +.EE +.IP +The original \fByacc\fP does not generate the second "\fB#define\fP". +The \fB\-s\fP option suppresses this "\fB#define\fP". +.IP +POSIX (IEEE 1003.1 2004) documents only names and numbers for "\fB%token\fP", +though original \fByacc\fP and bison also accept string literals. +.TP +.B \-t +The +.B \-t +option changes the preprocessor directives generated by +.B yacc +so that debugging statements will be incorporated in the compiled code. +.TP +.B \-v +The +.B \-v +option causes a human-readable description of the generated parser to +be written to the file +.IR y.output. +.TP +.B \-V +print the version number to the standard output. +.TP +.B \-y +\fByacc\fP ignores this option, +which bison supports for ostensible POSIX compatibility. +.SH EXTENSIONS +.B yacc +provides some extensions for compatibility with bison and other implementations +of yacc: +.TP +\fB %expect\fP \fInumber\fP +tell \fByacc\fP the expected number of shift/reduce conflicts. +That makes it only report the number if it differs. +.TP +\fB %expect-rr\fP \fInumber\fP +tell \fByacc\fP the expected number of reduce/reduce conflicts. +That makes it only report the number if it differs. +This is (unlike bison) allowable in LALR parsers. +.TP +\fB %lex-param\fP { \fIargument-declaration\fP } +By default, the lexer accepts no parameters, e.g., \fByylex()\fP. +Use this directive to add parameter declarations for your customized lexer. +.TP +\fB %parse-param\fP { \fIargument-declaration\fP } +By default, the parser accepts no parameters, e.g., \fByyparse()\fP. +Use this directive to add parameter declarations for your customized parser. +.TP +\fB %pure-parser\fP +Most variables (other than \fByydebug\fP and \fByynerrs\fP) are +allocated on the stack within \fByyparse\fP, making the parser reasonably +reentrant. +.SH PORTABILITY +According to Robert Corbett, +.ES + Berkeley Yacc is an LALR(1) parser generator. Berkeley Yacc has been made +as compatible as possible with AT&T Yacc. Berkeley Yacc can accept any input +specification that conforms to the AT&T Yacc documentation. Specifications +that take advantage of undocumented features of AT&T Yacc will probably be +rejected. +.EE +.PP +The rationale in +.ES +http://pubs.opengroup.org/onlinepubs/9699919799/utilities/yacc.html +.EE +.PP +documents some features of AT&T yacc which are no longer required for POSIX +compliance. +.PP +That said, you may be interested in reusing grammary files with some +other implementation which is not strictly compatible with AT&T yacc. +For instance, there is bison. +Here are a few differences: +.bP +\fBYacc\fP accepts an equals mark preceding the left curly brace +of an action (as in the original grammar file \fBftp.y\fP): +.ES + | STAT CRLF + = { + statcmd(); + } +.EE +.bP +\fBYacc\fP and bison emit code in different order, and in particular bison +makes forward reference to common functions such as yylex, yyparse and +yyerror without providing prototypes. +.bP +Bison's support for "%expect" is broken in more than one release. +For best results using bison, delete that directive. +.bP +Bison has no equivalent for some of \fByacc\fP's commmand-line options, +relying on directives embedded in the grammar file. +.bP +Bison's "\fB\-y\fP" option does not affect bison's lack of support for +features of AT&T yacc which were deemed obsolescent. +. +.SH DIAGNOSTICS +If there are rules that are never reduced, the number of such rules is +reported on standard error. +If there are any LALR(1) conflicts, the number of conflicts is reported +on standard error. diff --git a/contrib/com_err/com_err.3 b/contrib/com_err/com_err.3 index b71203aa11b..0cee34aa0ef 100644 --- a/contrib/com_err/com_err.3 +++ b/contrib/com_err/com_err.3 @@ -54,7 +54,7 @@ Common Error Library (libcom_err, -lcom_err) .Sh SYNOPSIS .Fd #include .Fd #include -.Fd #include +.Fd #include .Fd #include \&"XXX_err.h\&" .Pp typedef void (*errf)(const char *, long, const char *, ...); diff --git a/contrib/compiler-rt/lib/sparc64/divmod.m4 b/contrib/compiler-rt/lib/sparc64/divmod.m4 index 63381995fa3..9150a2ed826 100644 --- a/contrib/compiler-rt/lib/sparc64/divmod.m4 +++ b/contrib/compiler-rt/lib/sparc64/divmod.m4 @@ -59,9 +59,6 @@ define(SC,`%g2') #include "../assembly.h" -.text - .align 4 - define(DEVELOP_QUOTIENT_BITS, ` !depth $1, accumulated bits $2 bl L.$1.eval(TWOSUPN+$2) @@ -84,12 +81,14 @@ L.$1.eval(TWOSUPN+$2): ifelse( $1, 1, `9:') ') ifelse( ANSWER, `quotient', ` +.text + .align 32 DEFINE_COMPILERRT_FUNCTION(__udivsi3) - save %sp,-64,%sp ! do this for debugging b divide mov 0,SIGN ! result always nonnegative +.text + .align 32 DEFINE_COMPILERRT_FUNCTION(__divsi3) - save %sp,-64,%sp ! do this for debugging orcc divisor,dividend,%g0 ! are either dividend or divisor negative bge divide ! if not, skip this junk xor divisor,dividend,SIGN ! record sign of result in sign of SIGN @@ -104,12 +103,14 @@ DEFINE_COMPILERRT_FUNCTION(__divsi3) neg dividend ! FALL THROUGH ',` +.text + .align 32 DEFINE_COMPILERRT_FUNCTION(__umodsi3) - save %sp,-64,%sp ! do this for debugging b divide mov 0,SIGN ! result always nonnegative +.text + .align 32 DEFINE_COMPILERRT_FUNCTION(__modsi3) - save %sp,-64,%sp ! do this for debugging orcc divisor,dividend,%g0 ! are either dividend or divisor negative bge divide ! if not, skip this junk mov dividend,SIGN ! record sign of result in sign of SIGN @@ -184,8 +185,8 @@ do_single_div: nop sub R,V,R mov 1,Q - b end_single_divloop - nop + b,a end_single_divloop + ! EMPTY single_divloop: sll Q,1,Q bl 1f @@ -202,8 +203,8 @@ single_divloop: deccc SC bge single_divloop tst R - b end_regular_divide - nop + b,a end_regular_divide + ! EMPTY not_really_big: 1: @@ -224,9 +225,8 @@ end_regular_divide: deccc ITER bge divloop tst R - bge got_result - nop - ! non-restoring fixup here + bl,a got_result + ! non-restoring fixup if remainder < 0, otherwise annulled ifelse( ANSWER, `quotient', ` dec Q ',` add R,divisor,R @@ -234,13 +234,11 @@ ifelse( ANSWER, `quotient', got_result: tst SIGN - bge 1f - restore - ! answer < 0 - retl ! leaf-routine return + bl,a 1f + ! negate for answer < 0, otherwise annulled ifelse( ANSWER, `quotient', -` neg %o2,%o0 ! quotient <- -Q -',` neg %o3,%o0 ! remainder <- -R +` neg %o2,%o2 ! Q <- -Q +',` neg %o3,%o3 ! R <- -R ') 1: retl ! leaf-routine return diff --git a/contrib/compiler-rt/lib/sparc64/divsi3.S b/contrib/compiler-rt/lib/sparc64/divsi3.S index 52133f77771..70fc1f407f4 100644 --- a/contrib/compiler-rt/lib/sparc64/divsi3.S +++ b/contrib/compiler-rt/lib/sparc64/divsi3.S @@ -47,13 +47,13 @@ */ #include "../assembly.h" .text - .align 4 + .align 32 DEFINE_COMPILERRT_FUNCTION(__udivsi3) - save %sp,-64,%sp ! do this for debugging b divide mov 0,%g3 ! result always nonnegative +.text + .align 32 DEFINE_COMPILERRT_FUNCTION(__divsi3) - save %sp,-64,%sp ! do this for debugging orcc %o1,%o0,%g0 ! are either %o0 or %o1 negative bge divide ! if not, skip this junk xor %o1,%o0,%g3 ! record sign of result in sign of %g3 @@ -126,8 +126,8 @@ do_single_div: nop sub %o3,%o5,%o3 mov 1,%o2 - b end_single_divloop - nop + b,a end_single_divloop + ! EMPTY single_divloop: sll %o2,1,%o2 bl 1f @@ -144,8 +144,8 @@ single_divloop: deccc %g2 bge single_divloop tst %o3 - b end_regular_divide - nop + b,a end_regular_divide + ! EMPTY not_really_big: 1: sll %o5,4,%o5 @@ -317,17 +317,14 @@ end_regular_divide: deccc %o4 bge divloop tst %o3 - bge got_result - nop - ! non-restoring fixup here + bl,a got_result + ! non-restoring fixup if remainder < 0, otherwise annulled dec %o2 got_result: tst %g3 - bge 1f - restore - ! answer < 0 - retl ! leaf-routine return - neg %o2,%o0 ! quotient <- -%o2 + bl,a 1f + ! negate for answer < 0, otherwise annulled + neg %o2,%o2 ! %o2 <- -%o2 1: retl ! leaf-routine return mov %o2,%o0 ! quotient <- %o2 diff --git a/contrib/compiler-rt/lib/sparc64/modsi3.S b/contrib/compiler-rt/lib/sparc64/modsi3.S index 98deb9d2913..e126e3d3d45 100644 --- a/contrib/compiler-rt/lib/sparc64/modsi3.S +++ b/contrib/compiler-rt/lib/sparc64/modsi3.S @@ -47,13 +47,13 @@ */ #include "../assembly.h" .text - .align 4 + .align 32 DEFINE_COMPILERRT_FUNCTION(__umodsi3) - save %sp,-64,%sp ! do this for debugging b divide mov 0,%g3 ! result always nonnegative +.text + .align 32 DEFINE_COMPILERRT_FUNCTION(__modsi3) - save %sp,-64,%sp ! do this for debugging orcc %o1,%o0,%g0 ! are either %o0 or %o1 negative bge divide ! if not, skip this junk mov %o0,%g3 ! record sign of result in sign of %g3 @@ -126,8 +126,8 @@ do_single_div: nop sub %o3,%o5,%o3 mov 1,%o2 - b end_single_divloop - nop + b,a end_single_divloop + ! EMPTY single_divloop: sll %o2,1,%o2 bl 1f @@ -144,8 +144,8 @@ single_divloop: deccc %g2 bge single_divloop tst %o3 - b end_regular_divide - nop + b,a end_regular_divide + ! EMPTY not_really_big: 1: sll %o5,4,%o5 @@ -317,17 +317,14 @@ end_regular_divide: deccc %o4 bge divloop tst %o3 - bge got_result - nop - ! non-restoring fixup here + bl,a got_result + ! non-restoring fixup if remainder < 0, otherwise annulled add %o3,%o1,%o3 got_result: tst %g3 - bge 1f - restore - ! answer < 0 - retl ! leaf-routine return - neg %o3,%o0 ! remainder <- -%o3 + bl,a 1f + ! negate for answer < 0, otherwise annulled + neg %o3,%o3 ! %o3 <- -%o3 1: retl ! leaf-routine return mov %o3,%o0 ! remainder <- %o3 diff --git a/contrib/gcc/ChangeLog.gcc43 b/contrib/gcc/ChangeLog.gcc43 index 23b3a392eff..22ed9e85e7b 100644 --- a/contrib/gcc/ChangeLog.gcc43 +++ b/contrib/gcc/ChangeLog.gcc43 @@ -5,6 +5,18 @@ with SSE3 instruction set support. * doc/invoke.texi: Likewise. +2007-04-12 Richard Guenther (r123736) + + PR tree-optimization/24689 + PR tree-optimization/31307 + * fold-const.c (operand_equal_p): Compare INTEGER_CST array + indices by value. + * gimplify.c (canonicalize_addr_expr): To be consistent with + gimplify_compound_lval only set operands two and three of + ARRAY_REFs if they are not gimple_min_invariant. This makes + it never at this place. + * tree-ssa-ccp.c (maybe_fold_offset_to_array_ref): Likewise. + 2007-04-07 H.J. Lu (r123639) * config/i386/i386.c (ix86_handle_option): Handle SSSE3. @@ -96,7 +108,7 @@ * doc/invoke.texi: Add entry about geode processor. -2006-10-24 Richard Guenther +2006-10-24 Richard Guenther (r118001) PR middle-end/28796 * builtins.c (fold_builtin_classify): Use HONOR_INFINITIES @@ -170,7 +182,13 @@ * doc/invoke.texi: Document -mssse3/-mno-ssse3 switches. -2006-10-21 Richard Guenther +2006-10-21 Richard Guenther (r117932) + + PR tree-optimization/3511 + * tree-ssa-pre.c (phi_translate): Fold CALL_EXPRs that + got new invariant arguments during PHI translation. + +2006-10-21 Richard Guenther (r117929) * builtins.c (fold_builtin_classify): Fix typo. diff --git a/contrib/gcc/config/arm/freebsd.h b/contrib/gcc/config/arm/freebsd.h index 7106e6f3ac3..c4bc7e1c5c0 100644 --- a/contrib/gcc/config/arm/freebsd.h +++ b/contrib/gcc/config/arm/freebsd.h @@ -50,6 +50,7 @@ %{rdynamic:-export-dynamic} \ %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \ %{static:-Bstatic}} \ + %{!static:--hash-style=both} \ %{symbolic:-Bsymbolic} \ -X %{mbig-endian:-EB} %{mlittle-endian:-EL}" diff --git a/contrib/gcc/config/i386/freebsd.h b/contrib/gcc/config/i386/freebsd.h index a69a8c67eb3..3faa4f22fed 100644 --- a/contrib/gcc/config/i386/freebsd.h +++ b/contrib/gcc/config/i386/freebsd.h @@ -49,6 +49,7 @@ Boston, MA 02110-1301, USA. */ %{rdynamic: -export-dynamic} \ %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \ %{static:-Bstatic}} \ + %{!static:--hash-style=both} \ %{symbolic:-Bsymbolic}" /* Reset our STARTFILE_SPEC which was properly set in config/freebsd.h diff --git a/contrib/gcc/config/i386/freebsd64.h b/contrib/gcc/config/i386/freebsd64.h index b9e7386c839..297af7c0ac3 100644 --- a/contrib/gcc/config/i386/freebsd64.h +++ b/contrib/gcc/config/i386/freebsd64.h @@ -54,4 +54,5 @@ Boston, MA 02110-1301, USA. */ %{rdynamic:-export-dynamic} \ %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \ %{static:-Bstatic}} \ + %{!static:--hash-style=both} \ %{symbolic:-Bsymbolic}" diff --git a/contrib/gcc/config/mips/mips.c b/contrib/gcc/config/mips/mips.c index e9f7c9791ab..faa4e463907 100644 --- a/contrib/gcc/config/mips/mips.c +++ b/contrib/gcc/config/mips/mips.c @@ -1297,6 +1297,20 @@ mips_split_const (rtx x, rtx *base, HOST_WIDE_INT *offset) *base = x; } +/* Classify symbolic expression X, given that it appears in context + CONTEXT. */ + +static enum mips_symbol_type +mips_classify_symbolic_expression (rtx x) +{ + HOST_WIDE_INT offset; + + mips_split_const (x, &x, &offset); + if (UNSPEC_ADDRESS_P (x)) + return UNSPEC_ADDRESS_TYPE (x); + + return mips_classify_symbol (x); +} /* Return true if SYMBOL is a SYMBOL_REF and OFFSET + SYMBOL points to the same object as SYMBOL, or to the same object_block. */ @@ -1534,8 +1548,17 @@ mips_classify_address (struct mips_address_info *info, rtx x, info->type = ADDRESS_LO_SUM; info->reg = XEXP (x, 0); info->offset = XEXP (x, 1); + /* We have to trust the creator of the LO_SUM to do something vaguely + sane. Target-independent code that creates a LO_SUM should also + create and verify the matching HIGH. Target-independent code that + adds an offset to a LO_SUM must prove that the offset will not + induce a carry. Failure to do either of these things would be + a bug, and we are not required to check for it here. The MIPS + backend itself should only create LO_SUMs for valid symbolic + constants, with the high part being either a HIGH or a copy + of _gp. */ + info->symbol_type = mips_classify_symbolic_expression (info->offset); return (mips_valid_base_register_p (info->reg, mode, strict) - && mips_symbolic_constant_p (info->offset, &info->symbol_type) && mips_symbolic_address_p (info->symbol_type, mode) && mips_lo_relocs[info->symbol_type] != 0); @@ -5671,7 +5694,8 @@ print_operand_reloc (FILE *file, rtx op, const char **relocs) rtx base; HOST_WIDE_INT offset; - if (!mips_symbolic_constant_p (op, &symbol_type) || relocs[symbol_type] == 0) + symbol_type = mips_classify_symbolic_expression (op); + if (relocs[symbol_type] == 0) fatal_insn ("PRINT_OPERAND, invalid operand for relocation", op); /* If OP uses an UNSPEC address, we want to print the inner symbol. */ diff --git a/contrib/gcc/config/rs6000/rs6000.md b/contrib/gcc/config/rs6000/rs6000.md index 21cc2079ec1..2b42f70af46 100644 --- a/contrib/gcc/config/rs6000/rs6000.md +++ b/contrib/gcc/config/rs6000/rs6000.md @@ -10075,6 +10075,7 @@ "" " { + operands[1] = force_reg (Pmode, operands[1]); operands[2] = gen_reg_rtx (Pmode); operands[3] = gen_frame_mem (Pmode, operands[0]); operands[4] = gen_frame_mem (Pmode, operands[1]); diff --git a/contrib/gcc/config/sparc/freebsd.h b/contrib/gcc/config/sparc/freebsd.h index 31bfd36b5f6..305840f1ff2 100644 --- a/contrib/gcc/config/sparc/freebsd.h +++ b/contrib/gcc/config/sparc/freebsd.h @@ -45,14 +45,16 @@ Boston, MA 02110-1301, USA. */ #define LINK_SPEC "%(link_arch) \ %{!mno-relax:%{!r:-relax}} \ %{p:%nconsider using `-pg' instead of `-p' with gprof(1)} \ + %{v:-V} \ %{assert*} %{R*} %{rpath*} %{defsym*} \ %{shared:-Bshareable %{h*} %{soname*}} \ - %{symbolic:-Bsymbolic} \ %{!shared: \ %{!static: \ %{rdynamic:-export-dynamic} \ %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \ - %{static:-Bstatic}}" + %{static:-Bstatic}} \ + %{!static:--hash-style=both} \ + %{symbolic:-Bsymbolic}" /************************[ Target stuff ]***********************************/ diff --git a/contrib/gcc/config/sparc/sparc.md b/contrib/gcc/config/sparc/sparc.md index ed68f1e8a1e..3ee30ea25ee 100644 --- a/contrib/gcc/config/sparc/sparc.md +++ b/contrib/gcc/config/sparc/sparc.md @@ -5071,14 +5071,11 @@ [(set_attr "type" "multi") (set_attr "length" "2")]) -;; The V8 architecture specifies that there must be 3 instructions between -;; a Y register write and a use of it for correct results. - (define_expand "divsi3" - [(parallel [(set (match_operand:SI 0 "register_operand" "=r,r") - (div:SI (match_operand:SI 1 "register_operand" "r,r") - (match_operand:SI 2 "input_operand" "rI,m"))) - (clobber (match_scratch:SI 3 "=&r,&r"))])] + [(parallel [(set (match_operand:SI 0 "register_operand" "") + (div:SI (match_operand:SI 1 "register_operand" "") + (match_operand:SI 2 "input_operand" ""))) + (clobber (match_scratch:SI 3 ""))])] "TARGET_V8 || TARGET_DEPRECATED_V8_INSNS" { if (TARGET_ARCH64) @@ -5091,24 +5088,40 @@ } }) +;; The V8 architecture specifies that there must be at least 3 instructions +;; between a write to the Y register and a use of it for correct results. +;; We try to fill one of them with a simple constant or a memory load. + (define_insn "divsi3_sp32" - [(set (match_operand:SI 0 "register_operand" "=r,r") - (div:SI (match_operand:SI 1 "register_operand" "r,r") - (match_operand:SI 2 "input_operand" "rI,m"))) - (clobber (match_scratch:SI 3 "=&r,&r"))] - "(TARGET_V8 || TARGET_DEPRECATED_V8_INSNS) - && TARGET_ARCH32" + [(set (match_operand:SI 0 "register_operand" "=r,r,r") + (div:SI (match_operand:SI 1 "register_operand" "r,r,r") + (match_operand:SI 2 "input_operand" "rI,K,m"))) + (clobber (match_scratch:SI 3 "=&r,&r,&r"))] + "(TARGET_V8 || TARGET_DEPRECATED_V8_INSNS) && TARGET_ARCH32" { - if (which_alternative == 0) - if (TARGET_V9) - return "sra\t%1, 31, %3\n\twr\t%3, 0, %%y\n\tsdiv\t%1, %2, %0"; - else - return "sra\t%1, 31, %3\n\twr\t%3, 0, %%y\n\tnop\n\tnop\n\tnop\n\tsdiv\t%1, %2, %0"; - else - if (TARGET_V9) - return "sra\t%1, 31, %3\n\twr\t%3, 0, %%y\n\tld\t%2, %3\n\tsdiv\t%1, %3, %0"; - else - return "sra\t%1, 31, %3\n\twr\t%3, 0, %%y\n\tld\t%2, %3\n\tnop\n\tnop\n\tsdiv\t%1, %3, %0"; + output_asm_insn ("sra\t%1, 31, %3", operands); + output_asm_insn ("wr\t%3, 0, %%y", operands); + + switch (which_alternative) + { + case 0: + if (TARGET_V9) + return "sdiv\t%1, %2, %0"; + else + return "nop\n\tnop\n\tnop\n\tsdiv\t%1, %2, %0"; + case 1: + if (TARGET_V9) + return "sethi\t%%hi(%a2), %3\n\tsdiv\t%1, %3, %0"; + else + return "sethi\t%%hi(%a2), %3\n\tnop\n\tnop\n\tsdiv\t%1, %3, %0"; + case 2: + if (TARGET_V9) + return "ld\t%2, %3\n\tsdiv\t%1, %3, %0"; + else + return "ld\t%2, %3\n\tnop\n\tnop\n\tsdiv\t%1, %3, %0"; + default: + gcc_unreachable (); + } } [(set_attr "type" "multi") (set (attr "length") @@ -5143,10 +5156,13 @@ (clobber (match_scratch:SI 3 "=&r"))] "TARGET_V8 || TARGET_DEPRECATED_V8_INSNS" { + output_asm_insn ("sra\t%1, 31, %3", operands); + output_asm_insn ("wr\t%3, 0, %%y", operands); + if (TARGET_V9) - return "sra\t%1, 31, %3\n\twr\t%3, 0, %%y\n\tsdivcc\t%1, %2, %0"; + return "sdivcc\t%1, %2, %0"; else - return "sra\t%1, 31, %3\n\twr\t%3, 0, %%y\n\tnop\n\tnop\n\tnop\n\tsdivcc\t%1, %2, %0"; + return "nop\n\tnop\n\tnop\n\tsdivcc\t%1, %2, %0"; } [(set_attr "type" "multi") (set (attr "length") @@ -5161,29 +5177,48 @@ "TARGET_V8 || TARGET_DEPRECATED_V8_INSNS" "") -;; The V8 architecture specifies that there must be 3 instructions between -;; a Y register write and a use of it for correct results. +;; The V8 architecture specifies that there must be at least 3 instructions +;; between a write to the Y register and a use of it for correct results. +;; We try to fill one of them with a simple constant or a memory load. (define_insn "udivsi3_sp32" - [(set (match_operand:SI 0 "register_operand" "=r,&r,&r") - (udiv:SI (match_operand:SI 1 "nonimmediate_operand" "r,r,m") - (match_operand:SI 2 "input_operand" "rI,m,r")))] - "(TARGET_V8 || TARGET_DEPRECATED_V8_INSNS) - && TARGET_ARCH32" + [(set (match_operand:SI 0 "register_operand" "=r,&r,&r,&r") + (udiv:SI (match_operand:SI 1 "nonimmediate_operand" "r,r,r,m") + (match_operand:SI 2 "input_operand" "rI,K,m,r")))] + "(TARGET_V8 || TARGET_DEPRECATED_V8_INSNS) && TARGET_ARCH32" { - output_asm_insn ("wr\t%%g0, %%g0, %%y", operands); + output_asm_insn ("wr\t%%g0, 0, %%y", operands); + switch (which_alternative) { - default: - return "nop\n\tnop\n\tnop\n\tudiv\t%1, %2, %0"; + case 0: + if (TARGET_V9) + return "udiv\t%1, %2, %0"; + else + return "nop\n\tnop\n\tnop\n\tudiv\t%1, %2, %0"; case 1: - return "ld\t%2, %0\n\tnop\n\tnop\n\tudiv\t%1, %0, %0"; + if (TARGET_V9) + return "sethi\t%%hi(%a2), %0\n\tudiv\t%1, %0, %0"; + else + return "sethi\t%%hi(%a2), %0\n\tnop\n\tnop\n\tudiv\t%1, %0, %0"; case 2: - return "ld\t%1, %0\n\tnop\n\tnop\n\tudiv\t%0, %2, %0"; + if (TARGET_V9) + return "ld\t%2, %0\n\tudiv\t%1, %0, %0"; + else + return "ld\t%2, %0\n\tnop\n\tnop\n\tudiv\t%1, %0, %0"; + case 3: + if (TARGET_V9) + return "ld\t%1, %0\n\tudiv\t%0, %2, %0"; + else + return "ld\t%1, %0\n\tnop\n\tnop\n\tudiv\t%0, %2, %0"; + default: + gcc_unreachable (); } } [(set_attr "type" "multi") - (set_attr "length" "5")]) + (set (attr "length") + (if_then_else (eq_attr "isa" "v9") + (const_int 3) (const_int 5)))]) (define_insn "udivsi3_sp64" [(set (match_operand:SI 0 "register_operand" "=r") @@ -5209,13 +5244,14 @@ (const_int 0))) (set (match_operand:SI 0 "register_operand" "=r") (udiv:SI (match_dup 1) (match_dup 2)))] - "TARGET_V8 - || TARGET_DEPRECATED_V8_INSNS" + "TARGET_V8 || TARGET_DEPRECATED_V8_INSNS" { + output_asm_insn ("wr\t%%g0, 0, %%y", operands); + if (TARGET_V9) - return "wr\t%%g0, %%g0, %%y\n\tudivcc\t%1, %2, %0"; + return "udivcc\t%1, %2, %0"; else - return "wr\t%%g0, %%g0, %%y\n\tnop\n\tnop\n\tnop\n\tudivcc\t%1, %2, %0"; + return "nop\n\tnop\n\tnop\n\tudivcc\t%1, %2, %0"; } [(set_attr "type" "multi") (set (attr "length") diff --git a/contrib/gcc/cse.c b/contrib/gcc/cse.c index 5ce49ea86d0..cac4f0af030 100644 --- a/contrib/gcc/cse.c +++ b/contrib/gcc/cse.c @@ -583,7 +583,8 @@ static void delete_reg_equiv (unsigned int); static int mention_regs (rtx); static int insert_regs (rtx, struct table_elt *, int); static void remove_from_table (struct table_elt *, unsigned); -static struct table_elt *lookup (rtx, unsigned, enum machine_mode); +static void remove_pseudo_from_table (rtx, unsigned); +static struct table_elt *lookup (rtx, unsigned, enum machine_mode); static struct table_elt *lookup_for_remove (rtx, unsigned, enum machine_mode); static rtx lookup_as_function (rtx, enum rtx_code); static struct table_elt *insert (rtx, struct table_elt *, unsigned, @@ -1381,6 +1382,19 @@ remove_from_table (struct table_elt *elt, unsigned int hash) table_size--; } +/* Same as above, but X is a pseudo-register. */ + +static void +remove_pseudo_from_table (rtx x, unsigned int hash) +{ + struct table_elt *elt; + + /* Because a pseudo-register can be referenced in more than one + mode, we might have to remove more than one table entry. */ + while ((elt = lookup_for_remove (x, hash, VOIDmode))) + remove_from_table (elt, hash); +} + /* Look up X in the hash table and return its table element, or 0 if X is not in the table. @@ -1707,7 +1721,10 @@ merge_equiv_classes (struct table_elt *class1, struct table_elt *class2) delete_reg_equiv (REGNO (exp)); } - remove_from_table (elt, hash); + if (REG_P (exp) && REGNO (exp) >= FIRST_PSEUDO_REGISTER) + remove_pseudo_from_table (exp, hash); + else + remove_from_table (elt, hash); if (insert_regs (exp, class1, 0) || need_rehash) { @@ -1803,14 +1820,7 @@ invalidate (rtx x, enum machine_mode full_mode) SUBREG_TICKED (regno) = -1; if (regno >= FIRST_PSEUDO_REGISTER) - { - /* Because a register can be referenced in more than one mode, - we might have to remove more than one table entry. */ - struct table_elt *elt; - - while ((elt = lookup_for_remove (x, hash, GET_MODE (x)))) - remove_from_table (elt, hash); - } + remove_pseudo_from_table (x, hash); else { HOST_WIDE_INT in_table diff --git a/contrib/gcc/expr.c b/contrib/gcc/expr.c index 1773fa179a8..3655eb0aa04 100644 --- a/contrib/gcc/expr.c +++ b/contrib/gcc/expr.c @@ -4750,14 +4750,7 @@ count_type_elements (tree type, bool allow_flexarr) case UNION_TYPE: case QUAL_UNION_TYPE: - { - /* Ho hum. How in the world do we guess here? Clearly it isn't - right to count the fields. Guess based on the number of words. */ - HOST_WIDE_INT n = int_size_in_bytes (type); - if (n < 0) - return -1; - return n / UNITS_PER_WORD; - } + return -1; case COMPLEX_TYPE: return 2; diff --git a/contrib/gcc/fold-const.c b/contrib/gcc/fold-const.c index 0753caa1536..1aadd300a9b 100644 --- a/contrib/gcc/fold-const.c +++ b/contrib/gcc/fold-const.c @@ -2802,9 +2802,13 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags) case ARRAY_REF: case ARRAY_RANGE_REF: - /* Operands 2 and 3 may be null. */ + /* Operands 2 and 3 may be null. + Compare the array index by value if it is constant first as we + may have different types but same value here. */ return (OP_SAME (0) - && OP_SAME (1) + && (tree_int_cst_equal (TREE_OPERAND (arg0, 1), + TREE_OPERAND (arg1, 1)) + || OP_SAME (1)) && OP_SAME_WITH_NULL (2) && OP_SAME_WITH_NULL (3)); @@ -6657,12 +6661,14 @@ fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1) if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type)) return NULL_TREE; - arg1_unw = get_unwidened (arg1, shorter_type); + arg1_unw = get_unwidened (arg1, NULL_TREE); /* If possible, express the comparison in the shorter mode. */ if ((code == EQ_EXPR || code == NE_EXPR || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type)) && (TREE_TYPE (arg1_unw) == shorter_type + || (TYPE_PRECISION (shorter_type) + >= TYPE_PRECISION (TREE_TYPE (arg1_unw))) || (TREE_CODE (arg1_unw) == INTEGER_CST && (TREE_CODE (shorter_type) == INTEGER_TYPE || TREE_CODE (shorter_type) == BOOLEAN_TYPE) @@ -10647,24 +10653,24 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) tree arg01 = TREE_OPERAND (arg0, 1); if (TREE_CODE (arg00) == LSHIFT_EXPR && integer_onep (TREE_OPERAND (arg00, 0))) - return - fold_build2 (code, type, - build2 (BIT_AND_EXPR, TREE_TYPE (arg0), - build2 (RSHIFT_EXPR, TREE_TYPE (arg00), - arg01, TREE_OPERAND (arg00, 1)), - fold_convert (TREE_TYPE (arg0), - integer_one_node)), - arg1); - else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR - && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0))) - return - fold_build2 (code, type, - build2 (BIT_AND_EXPR, TREE_TYPE (arg0), - build2 (RSHIFT_EXPR, TREE_TYPE (arg01), - arg00, TREE_OPERAND (arg01, 1)), - fold_convert (TREE_TYPE (arg0), - integer_one_node)), - arg1); + { + tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg00), + arg01, TREE_OPERAND (arg00, 1)); + tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem, + build_int_cst (TREE_TYPE (arg0), 1)); + return fold_build2 (code, type, + fold_convert (TREE_TYPE (arg1), tem), arg1); + } + else if (TREE_CODE (arg01) == LSHIFT_EXPR + && integer_onep (TREE_OPERAND (arg01, 0))) + { + tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg01), + arg00, TREE_OPERAND (arg01, 1)); + tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem, + build_int_cst (TREE_TYPE (arg0), 1)); + return fold_build2 (code, type, + fold_convert (TREE_TYPE (arg1), tem), arg1); + } } /* If this is an NE or EQ comparison of zero against the result of a diff --git a/contrib/gcc/gimplify.c b/contrib/gcc/gimplify.c index 80dcd1ac5f2..7efae388c92 100644 --- a/contrib/gcc/gimplify.c +++ b/contrib/gcc/gimplify.c @@ -1600,9 +1600,7 @@ canonicalize_addr_expr (tree *expr_p) /* All checks succeeded. Build a new node to merge the cast. */ *expr_p = build4 (ARRAY_REF, dctype, obj_expr, TYPE_MIN_VALUE (TYPE_DOMAIN (datype)), - TYPE_MIN_VALUE (TYPE_DOMAIN (datype)), - size_binop (EXACT_DIV_EXPR, TYPE_SIZE_UNIT (dctype), - size_int (TYPE_ALIGN_UNIT (dctype)))); + NULL_TREE, NULL_TREE); *expr_p = build1 (ADDR_EXPR, ctype, *expr_p); } diff --git a/contrib/gcc/ipa-pure-const.c b/contrib/gcc/ipa-pure-const.c index fdaff50d573..c795bba419c 100644 --- a/contrib/gcc/ipa-pure-const.c +++ b/contrib/gcc/ipa-pure-const.c @@ -639,6 +639,7 @@ static_execute (void) for (i = 0; i < order_pos; i++ ) { enum pure_const_state_e pure_const_state = IPA_CONST; + int count = 0; node = order[i]; /* Find the worst state for any node in the cycle. */ @@ -655,11 +656,40 @@ static_execute (void) if (!w_l->state_set_in_source) { struct cgraph_edge *e; + count++; + + /* FIXME!!! Because of pr33826, we cannot have either + immediate or transitive recursive functions marked as + pure or const because dce can delete a function that + is in reality an infinite loop. A better solution + than just outlawing them is to add another bit the + functions to distinguish recursive from non recursive + pure and const function. This would allow the + recursive ones to be cse'd but not dce'd. In this + same vein, we could allow functions with loops to + also be cse'd but not dce'd. + + Unfortunately we are late in stage 3, and the fix + described above is is not appropriate. */ + if (count > 1) + { + pure_const_state = IPA_NEITHER; + break; + } + for (e = w->callees; e; e = e->next_callee) { struct cgraph_node *y = e->callee; /* Only look at the master nodes and skip external nodes. */ y = cgraph_master_clone (y); + + /* Check for immediate recursive functions. See the + FIXME above. */ + if (w == y) + { + pure_const_state = IPA_NEITHER; + break; + } if (y) { funct_state y_l = get_function_state (y); diff --git a/contrib/gcc/ipa-utils.c b/contrib/gcc/ipa-utils.c index f0025c7559f..87e65b598fd 100644 --- a/contrib/gcc/ipa-utils.c +++ b/contrib/gcc/ipa-utils.c @@ -78,7 +78,7 @@ struct searchc_env { has been customized for cgraph_nodes. The env parameter is because it is recursive and there are no nested functions here. This function should only be called from itself or - cgraph_reduced_inorder. ENV is a stack env and would be + ipa_utils_reduced_inorder. ENV is a stack env and would be unnecessary if C had nested functions. V is the node to start searching from. */ diff --git a/contrib/gcc/rtl.h b/contrib/gcc/rtl.h index d4af682f4db..57de5165f26 100644 --- a/contrib/gcc/rtl.h +++ b/contrib/gcc/rtl.h @@ -1189,8 +1189,8 @@ do { \ refer to part of a DECL. */ #define REG_EXPR(RTX) (REG_ATTRS (RTX) == 0 ? 0 : REG_ATTRS (RTX)->decl) -/* For a MEM rtx, the offset from the start of MEM_DECL, if known, as a - RTX that is always a CONST_INT. */ +/* For a REG rtx, the offset from the start of REG_EXPR, if known, as an + HOST_WIDE_INT. */ #define REG_OFFSET(RTX) (REG_ATTRS (RTX) == 0 ? 0 : REG_ATTRS (RTX)->offset) /* Copy the attributes that apply to memory locations from RHS to LHS. */ diff --git a/contrib/gcc/tree-ssa-ccp.c b/contrib/gcc/tree-ssa-ccp.c index 6e74f35f2bd..e64d80beb78 100644 --- a/contrib/gcc/tree-ssa-ccp.c +++ b/contrib/gcc/tree-ssa-ccp.c @@ -1621,9 +1621,7 @@ maybe_fold_offset_to_array_ref (tree base, tree offset, tree orig_type) if (!integer_zerop (elt_offset)) idx = int_const_binop (PLUS_EXPR, idx, elt_offset, 0); - return build4 (ARRAY_REF, orig_type, base, idx, min_idx, - size_int (tree_low_cst (elt_size, 1) - / (TYPE_ALIGN_UNIT (elt_type)))); + return build4 (ARRAY_REF, orig_type, base, idx, NULL_TREE, NULL_TREE); } diff --git a/contrib/gcc/tree-ssa-pre.c b/contrib/gcc/tree-ssa-pre.c index 9c7b89faaf3..ba32b3cfed4 100644 --- a/contrib/gcc/tree-ssa-pre.c +++ b/contrib/gcc/tree-ssa-pre.c @@ -1076,6 +1076,7 @@ phi_translate (tree expr, value_set_t set, basic_block pred, tree newexpr; tree vh = get_value_handle (expr); bool listchanged = false; + bool invariantarg = false; VEC (tree, gc) *vuses = VALUE_HANDLE_VUSES (vh); VEC (tree, gc) *tvuses; @@ -1134,10 +1135,26 @@ phi_translate (tree expr, value_set_t set, basic_block pred, if (newval != oldval) { listchanged = true; + invariantarg |= is_gimple_min_invariant (newval); TREE_VALUE (newwalker) = get_value_handle (newval); } } } + + /* In case of new invariant args we might try to fold the call + again. */ + if (invariantarg) + { + tree tmp = fold_ternary (CALL_EXPR, TREE_TYPE (expr), + newop0, newarglist, newop2); + if (tmp) + { + STRIP_TYPE_NOPS (tmp); + if (is_gimple_min_invariant (tmp)) + return tmp; + } + } + if (listchanged) vn_lookup_or_add (newarglist, NULL); diff --git a/contrib/gcc/var-tracking.c b/contrib/gcc/var-tracking.c index d9f21b5aa21..c392b2ed799 100644 --- a/contrib/gcc/var-tracking.c +++ b/contrib/gcc/var-tracking.c @@ -259,6 +259,9 @@ typedef struct variable_def /* Pointer to the BB's information specific to variable tracking pass. */ #define VTI(BB) ((variable_tracking_info) (BB)->aux) +/* Macro to access MEM_OFFSET as an HOST_WIDE_INT. Evaluates MEM twice. */ +#define INT_MEM_OFFSET(mem) (MEM_OFFSET (mem) ? INTVAL (MEM_OFFSET (mem)) : 0) + /* Alloc pool for struct attrs_def. */ static alloc_pool attrs_pool; @@ -927,7 +930,7 @@ static void var_mem_set (dataflow_set *set, rtx loc) { tree decl = MEM_EXPR (loc); - HOST_WIDE_INT offset = MEM_OFFSET (loc) ? INTVAL (MEM_OFFSET (loc)) : 0; + HOST_WIDE_INT offset = INT_MEM_OFFSET (loc); decl = var_debug_decl (decl); @@ -945,7 +948,7 @@ static void var_mem_delete_and_set (dataflow_set *set, rtx loc, bool modify) { tree decl = MEM_EXPR (loc); - HOST_WIDE_INT offset = MEM_OFFSET (loc) ? INTVAL (MEM_OFFSET (loc)) : 0; + HOST_WIDE_INT offset = INT_MEM_OFFSET (loc); decl = var_debug_decl (decl); @@ -962,7 +965,7 @@ static void var_mem_delete (dataflow_set *set, rtx loc, bool clobber) { tree decl = MEM_EXPR (loc); - HOST_WIDE_INT offset = MEM_OFFSET (loc) ? INTVAL (MEM_OFFSET (loc)) : 0; + HOST_WIDE_INT offset = INT_MEM_OFFSET (loc); decl = var_debug_decl (decl); if (clobber) @@ -1540,6 +1543,18 @@ track_expr_p (tree expr) return 1; } +/* Return true if OFFSET is a valid offset for a register or memory + access we want to track. This is used to reject out-of-bounds + accesses that can cause assertions to fail later. Note that we + don't reject negative offsets because they can be generated for + paradoxical subregs on big-endian architectures. */ + +static inline bool +offset_valid_for_tracked_p (HOST_WIDE_INT offset) +{ + return (-MAX_VAR_PARTS < offset) && (offset < MAX_VAR_PARTS); +} + /* Determine whether a given LOC refers to the same variable part as EXPR+OFFSET. */ @@ -1560,7 +1575,7 @@ same_variable_part_p (rtx loc, tree expr, HOST_WIDE_INT offset) else if (MEM_P (loc)) { expr2 = MEM_EXPR (loc); - offset2 = MEM_OFFSET (loc) ? INTVAL (MEM_OFFSET (loc)) : 0; + offset2 = INT_MEM_OFFSET (loc); } else return false; @@ -1590,7 +1605,8 @@ count_uses (rtx *loc, void *insn) } else if (MEM_P (*loc) && MEM_EXPR (*loc) - && track_expr_p (MEM_EXPR (*loc))) + && track_expr_p (MEM_EXPR (*loc)) + && offset_valid_for_tracked_p (INT_MEM_OFFSET (*loc))) { VTI (bb)->n_mos++; } @@ -1626,14 +1642,19 @@ add_uses (rtx *loc, void *insn) basic_block bb = BLOCK_FOR_INSN ((rtx) insn); micro_operation *mo = VTI (bb)->mos + VTI (bb)->n_mos++; - mo->type = ((REG_EXPR (*loc) && track_expr_p (REG_EXPR (*loc))) - ? MO_USE : MO_USE_NO_VAR); + if (REG_EXPR (*loc) + && track_expr_p (REG_EXPR (*loc)) + && offset_valid_for_tracked_p (REG_OFFSET (*loc))) + mo->type = MO_USE; + else + mo->type = MO_USE_NO_VAR; mo->u.loc = *loc; mo->insn = (rtx) insn; } else if (MEM_P (*loc) && MEM_EXPR (*loc) - && track_expr_p (MEM_EXPR (*loc))) + && track_expr_p (MEM_EXPR (*loc)) + && offset_valid_for_tracked_p (INT_MEM_OFFSET (*loc))) { basic_block bb = BLOCK_FOR_INSN ((rtx) insn); micro_operation *mo = VTI (bb)->mos + VTI (bb)->n_mos++; @@ -1667,8 +1688,9 @@ add_stores (rtx loc, rtx expr, void *insn) micro_operation *mo = VTI (bb)->mos + VTI (bb)->n_mos++; if (GET_CODE (expr) == CLOBBER - || ! REG_EXPR (loc) - || ! track_expr_p (REG_EXPR (loc))) + || !(REG_EXPR (loc) + && track_expr_p (REG_EXPR (loc)) + && offset_valid_for_tracked_p (REG_OFFSET (loc)))) mo->type = MO_CLOBBER; else if (GET_CODE (expr) == SET && SET_DEST (expr) == loc @@ -1683,7 +1705,8 @@ add_stores (rtx loc, rtx expr, void *insn) } else if (MEM_P (loc) && MEM_EXPR (loc) - && track_expr_p (MEM_EXPR (loc))) + && track_expr_p (MEM_EXPR (loc)) + && offset_valid_for_tracked_p (INT_MEM_OFFSET (loc))) { basic_block bb = BLOCK_FOR_INSN ((rtx) insn); micro_operation *mo = VTI (bb)->mos + VTI (bb)->n_mos++; @@ -1694,8 +1717,7 @@ add_stores (rtx loc, rtx expr, void *insn) && SET_DEST (expr) == loc && same_variable_part_p (SET_SRC (expr), MEM_EXPR (loc), - MEM_OFFSET (loc) - ? INTVAL (MEM_OFFSET (loc)) : 0)) + INT_MEM_OFFSET (loc))) mo->type = MO_COPY; else mo->type = MO_SET; @@ -2726,7 +2748,7 @@ vt_get_decl_and_offset (rtx rtl, tree *declp, HOST_WIDE_INT *offsetp) if (MEM_ATTRS (rtl)) { *declp = MEM_EXPR (rtl); - *offsetp = MEM_OFFSET (rtl) ? INTVAL (MEM_OFFSET (rtl)) : 0; + *offsetp = INT_MEM_OFFSET (rtl); return true; } } diff --git a/contrib/gcc/varasm.c b/contrib/gcc/varasm.c index d17207121fe..21b690417b7 100644 --- a/contrib/gcc/varasm.c +++ b/contrib/gcc/varasm.c @@ -5876,9 +5876,10 @@ default_binds_local_p_1 (tree exp, int shlib) else if (DECL_WEAK (exp)) local_p = false; /* If PIC, then assume that any global name can be overridden by - symbols resolved from other modules. */ + symbols resolved from other modules, unless we are compiling with + -fwhole-program, which assumes that names are local. */ else if (shlib) - local_p = false; + local_p = flag_whole_program; /* Uninitialized COMMON variable may be unified with symbols resolved from other modules. */ else if (DECL_COMMON (exp) diff --git a/contrib/groff/tmac/doc-common b/contrib/groff/tmac/doc-common index 6372a23990b..5559c23fc49 100644 --- a/contrib/groff/tmac/doc-common +++ b/contrib/groff/tmac/doc-common @@ -574,7 +574,10 @@ .ds doc-operating-system-FreeBSD-8.0 8.0 .ds doc-operating-system-FreeBSD-8.1 8.1 .ds doc-operating-system-FreeBSD-8.2 8.2 +.ds doc-operating-system-FreeBSD-8.3 8.3 .ds doc-operating-system-FreeBSD-9.0 9.0 +.ds doc-operating-system-FreeBSD-9.1 9.1 +.ds doc-operating-system-FreeBSD-10.0 10.0 . .ds doc-operating-system-Darwin-8.0.0 8.0.0 .ds doc-operating-system-Darwin-8.1.0 8.1.0 diff --git a/contrib/jemalloc/ChangeLog b/contrib/jemalloc/ChangeLog index b71fa165b60..231dd6da730 100644 --- a/contrib/jemalloc/ChangeLog +++ b/contrib/jemalloc/ChangeLog @@ -6,7 +6,7 @@ found in the git revision history: http://www.canonware.com/cgi-bin/gitweb.cgi?p=jemalloc.git git://canonware.com/jemalloc.git -* 3.0.0 (XXX not yet released) +* 3.0.0 (May 11, 2012) Although this version adds some major new features, the primary focus is on internal code cleanup that facilitates maintainability and portability, most @@ -19,9 +19,11 @@ found in the git revision history: New features: - Implement Valgrind support, redzones, and quarantine. - - Add support for additional operating systems: + - Add support for additional platforms: + FreeBSD + Mac OS X Lion + + MinGW + + Windows (no support yet for replacing the system malloc) - Add support for additional architectures: + MIPS + SH4 @@ -30,12 +32,13 @@ found in the git revision history: - Add nallocm(), which rounds a request size up to the nearest size class without actually allocating. - Implement aligned_alloc() (blame C11). - - Add the --disable-munmap option, and make it the default on Linux. - - Add the --with-mangling option. - - Add the --disable-experimental option. - Add the "thread.tcache.enabled" mallctl. - Add the "opt.prof_final" mallctl. - Update pprof (from gperftools 2.0). + - Add the --with-mangling option. + - Add the --disable-experimental option. + - Add the --disable-munmap option, and make it the default on Linux. + - Add the --enable-mremap option, which disables use of mremap(2) by default. Incompatible changes: - Enable stats by default. @@ -64,18 +67,25 @@ found in the git revision history: - Remove the --enable-sysv configure option. Bug fixes: - - Fix fork-related bugs that could cause deadlock in children between fork - and exec. - Fix a statistics-related bug in the "thread.arena" mallctl that could cause invalid statistics and crashes. - - Work around TLS dallocation via free() on Linux. This bug could cause + - Work around TLS deallocation via free() on Linux. This bug could cause write-after-free memory corruption. + - Fix a potential deadlock that could occur during interval- and + growth-triggered heap profile dumps. + - Fix large calloc() zeroing bugs due to dropping chunk map unzeroed flags. - Fix chunk_alloc_dss() to stop claiming memory is zeroed. This bug could cause memory corruption and crashes with --enable-dss specified. + - Fix fork-related bugs that could cause deadlock in children between fork + and exec. - Fix malloc_stats_print() to honor 'b' and 'l' in the opts parameter. - Fix realloc(p, 0) to act like free(p). - Do not enforce minimum alignment in memalign(). - Check for NULL pointer in malloc_usable_size(). + - Fix an off-by-one heap profile statistics bug that could be observed in + interval- and growth-triggered heap profiles. + - Fix the "epoch" mallctl to update cached stats even if the passed in epoch + is 0. - Fix bin->runcur management to fix a layout policy bug. This bug did not affect correctness. - Fix a bug in choose_arena_hard() that potentially caused more arenas to be diff --git a/contrib/jemalloc/FREEBSD-Xlist b/contrib/jemalloc/FREEBSD-Xlist index f3945de46f8..cd0f8add7b6 100644 --- a/contrib/jemalloc/FREEBSD-Xlist +++ b/contrib/jemalloc/FREEBSD-Xlist @@ -18,6 +18,7 @@ include/jemalloc/internal/jemalloc_internal.h.in include/jemalloc/internal/size_classes.sh include/jemalloc/jemalloc.h.in include/jemalloc/jemalloc_defs.h.in +include/msvc_compat/ install-sh src/zone.c test/ diff --git a/contrib/jemalloc/FREEBSD-diffs b/contrib/jemalloc/FREEBSD-diffs index 76e0a87c8c6..e38ff91c45d 100644 --- a/contrib/jemalloc/FREEBSD-diffs +++ b/contrib/jemalloc/FREEBSD-diffs @@ -1,5 +1,5 @@ diff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in -index e8a5722..cec85b5 100644 +index 877c500..7d659a7 100644 --- a/doc/jemalloc.xml.in +++ b/doc/jemalloc.xml.in @@ -51,12 +51,23 @@ @@ -27,7 +27,7 @@ index e8a5722..cec85b5 100644 Standard API -@@ -2091,4 +2102,16 @@ malloc_conf = "lg_chunk:24";]]> +@@ -2101,4 +2112,16 @@ malloc_conf = "lg_chunk:24";]]> The posix_memalign function conforms to IEEE Std 1003.1-2001 (“POSIX.1”). @@ -45,7 +45,7 @@ index e8a5722..cec85b5 100644 + diff --git a/include/jemalloc/internal/jemalloc_internal.h.in b/include/jemalloc/internal/jemalloc_internal.h.in -index b61abe8..edbb437 100644 +index 268cd14..2acd2eb 100644 --- a/include/jemalloc/internal/jemalloc_internal.h.in +++ b/include/jemalloc/internal/jemalloc_internal.h.in @@ -1,5 +1,8 @@ @@ -54,12 +54,12 @@ index b61abe8..edbb437 100644 +#include "libc_private.h" +#include "namespace.h" + - #include - #include - #include -@@ -35,6 +38,9 @@ - #include #include + #ifdef _WIN32 + # include +@@ -54,6 +57,9 @@ typedef intptr_t ssize_t; + #endif + #include +#include "un-namespace.h" +#include "libc_private.h" @@ -67,11 +67,26 @@ index b61abe8..edbb437 100644 #define JEMALLOC_NO_DEMANGLE #include "../jemalloc@install_suffix@.h" +@@ -95,13 +101,7 @@ static const bool config_fill = + false + #endif + ; +-static const bool config_lazy_lock = +-#ifdef JEMALLOC_LAZY_LOCK +- true +-#else +- false +-#endif +- ; ++static const bool config_lazy_lock = true; + static const bool config_prof = + #ifdef JEMALLOC_PROF + true diff --git a/include/jemalloc/internal/mutex.h b/include/jemalloc/internal/mutex.h -index 8837ef5..d7133f4 100644 +index de44e14..564d604 100644 --- a/include/jemalloc/internal/mutex.h +++ b/include/jemalloc/internal/mutex.h -@@ -39,9 +39,6 @@ struct malloc_mutex_s { +@@ -43,9 +43,6 @@ struct malloc_mutex_s { #ifdef JEMALLOC_LAZY_LOCK extern bool isthreaded; @@ -82,10 +97,10 @@ index 8837ef5..d7133f4 100644 bool malloc_mutex_init(malloc_mutex_t *mutex); diff --git a/include/jemalloc/internal/private_namespace.h b/include/jemalloc/internal/private_namespace.h -index bb1b63e..00eb169 100644 +index b816647..b8ce6b1 100644 --- a/include/jemalloc/internal/private_namespace.h +++ b/include/jemalloc/internal/private_namespace.h -@@ -165,7 +165,6 @@ +@@ -186,7 +186,6 @@ #define iqalloc JEMALLOC_N(iqalloc) #define iralloc JEMALLOC_N(iralloc) #define isalloc JEMALLOC_N(isalloc) @@ -94,7 +109,7 @@ index bb1b63e..00eb169 100644 #define jemalloc_postfork_child JEMALLOC_N(jemalloc_postfork_child) #define jemalloc_postfork_parent JEMALLOC_N(jemalloc_postfork_parent) diff --git a/include/jemalloc/jemalloc.h.in b/include/jemalloc/jemalloc.h.in -index f0581db..f26d8bc 100644 +index ad06948..505dd38 100644 --- a/include/jemalloc/jemalloc.h.in +++ b/include/jemalloc/jemalloc.h.in @@ -15,6 +15,7 @@ extern "C" { @@ -107,10 +122,10 @@ index f0581db..f26d8bc 100644 #define ALLOCM_LG_ALIGN(la) (la) diff --git a/include/jemalloc/jemalloc_FreeBSD.h b/include/jemalloc/jemalloc_FreeBSD.h new file mode 100644 -index 0000000..2c5797f +index 0000000..9efab93 --- /dev/null +++ b/include/jemalloc/jemalloc_FreeBSD.h -@@ -0,0 +1,76 @@ +@@ -0,0 +1,80 @@ +/* + * Override settings that were generated in jemalloc_defs.h as necessary. + */ @@ -154,8 +169,12 @@ index 0000000..2c5797f +# define LG_SIZEOF_PTR 2 +#endif +#ifdef __mips__ ++#ifdef __mips_n64 ++# define LG_SIZEOF_PTR 3 ++#else +# define LG_SIZEOF_PTR 2 +#endif ++#endif +#ifdef __powerpc64__ +# define LG_SIZEOF_PTR 3 +#elif defined(__powerpc__) @@ -188,20 +207,21 @@ index 0000000..2c5797f +#define pthread_mutex_lock _pthread_mutex_lock +#define pthread_mutex_unlock _pthread_mutex_unlock diff --git a/src/jemalloc.c b/src/jemalloc.c -index f9c8916..8e24a5a 100644 +index bc54cd7..fa9fcf0 100644 --- a/src/jemalloc.c +++ b/src/jemalloc.c -@@ -8,6 +8,9 @@ malloc_tsd_data(, arenas, arena_t *, NULL) +@@ -8,6 +8,10 @@ malloc_tsd_data(, arenas, arena_t *, NULL) malloc_tsd_data(, thread_allocated, thread_allocated_t, THREAD_ALLOCATED_INITIALIZER) -+const char *__malloc_options_1_0; ++/* Work around : */ ++const char *__malloc_options_1_0 = NULL; +__sym_compat(_malloc_options, __malloc_options_1_0, FBSD_1.0); + /* Runtime configuration options. */ - const char *je_malloc_conf JEMALLOC_ATTR(visibility("default")); + const char *je_malloc_conf; #ifdef JEMALLOC_DEBUG -@@ -401,7 +404,8 @@ malloc_conf_init(void) +@@ -429,7 +433,8 @@ malloc_conf_init(void) #endif ; @@ -212,10 +232,10 @@ index f9c8916..8e24a5a 100644 * Do nothing; opts is already initialized to * the value of the MALLOC_CONF environment diff --git a/src/mutex.c b/src/mutex.c -index 4b8ce57..7be5fc9 100644 +index 37a843e..4a90a05 100644 --- a/src/mutex.c +++ b/src/mutex.c -@@ -63,6 +63,17 @@ pthread_create(pthread_t *__restrict thread, +@@ -66,6 +66,17 @@ pthread_create(pthread_t *__restrict thread, #ifdef JEMALLOC_MUTEX_INIT_CB int _pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex, void *(calloc_cb)(size_t, size_t)); @@ -234,14 +254,14 @@ index 4b8ce57..7be5fc9 100644 bool diff --git a/src/util.c b/src/util.c -index 99ae26d..b80676c 100644 +index 9b73c3e..f94799f 100644 --- a/src/util.c +++ b/src/util.c -@@ -60,6 +60,22 @@ wrtmessage(void *cbopaque, const char *s) - void (*je_malloc_message)(void *, const char *s) - JEMALLOC_ATTR(visibility("default")) = wrtmessage; +@@ -58,6 +58,22 @@ wrtmessage(void *cbopaque, const char *s) -+JEMALLOC_CATTR(visibility("hidden"), static) + JEMALLOC_EXPORT void (*je_malloc_message)(void *, const char *s); + ++JEMALLOC_ATTR(visibility("hidden")) +void +wrtmessage_1_0(const char *s1, const char *s2, const char *s3, + const char *s4) @@ -258,5 +278,5 @@ index 99ae26d..b80676c 100644 +__sym_compat(_malloc_message, __malloc_message_1_0, FBSD_1.0); + /* - * glibc provides a non-standard strerror_r() when _GNU_SOURCE is defined, so - * provide a wrapper. + * Wrapper around malloc_message() that avoids the need for + * je_malloc_message(...) throughout the code. diff --git a/contrib/jemalloc/VERSION b/contrib/jemalloc/VERSION index 629165c7f2d..c0f4e740940 100644 --- a/contrib/jemalloc/VERSION +++ b/contrib/jemalloc/VERSION @@ -1 +1 @@ -1.0.0-286-ga8f8d7540d66ddee7337db80c92890916e1063ca +3.0.0-0-gfc9b1dbf69f59d7ecfc4ac68da9847e017e1d046 diff --git a/contrib/jemalloc/doc/jemalloc.3 b/contrib/jemalloc/doc/jemalloc.3 index 209b1331219..f4a92820837 100644 --- a/contrib/jemalloc/doc/jemalloc.3 +++ b/contrib/jemalloc/doc/jemalloc.3 @@ -2,12 +2,12 @@ .\" Title: JEMALLOC .\" Author: Jason Evans .\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 04/21/2012 +.\" Date: 05/12/2012 .\" Manual: User Manual -.\" Source: jemalloc 1.0.0-286-ga8f8d7540d66ddee7337db80c92890916e1063ca +.\" Source: jemalloc 3.0.0-0-gfc9b1dbf69f59d7ecfc4ac68da9847e017e1d046 .\" Language: English .\" -.TH "JEMALLOC" "3" "04/21/2012" "jemalloc 1.0.0-286-ga8f8d7540d" "User Manual" +.TH "JEMALLOC" "3" "05/12/2012" "jemalloc 3.0.0-0-gfc9b1dbf69f5" "User Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -31,7 +31,7 @@ jemalloc \- general purpose memory allocation functions .SH "LIBRARY" .PP -This manual describes jemalloc 1\&.0\&.0\-286\-ga8f8d7540d66ddee7337db80c92890916e1063ca\&. More information can be found at the +This manual describes jemalloc 3\&.0\&.0\-0\-gfc9b1dbf69f59d7ecfc4ac68da9847e017e1d046\&. More information can be found at the \m[blue]\fBjemalloc website\fR\m[]\&\s-2\u[1]\d\s+2\&. .PP The following configuration options are enabled in libc\*(Aqs built\-in jemalloc: @@ -567,6 +567,12 @@ was specified during build configuration\&. was specified during build configuration\&. .RE .PP +"config\&.mremap" (\fBbool\fR) r\- +.RS 4 +\fB\-\-enable\-mremap\fR +was specified during build configuration\&. +.RE +.PP "config\&.munmap" (\fBbool\fR) r\- .RS 4 \fB\-\-enable\-munmap\fR @@ -997,12 +1003,12 @@ Total number of bytes in active pages allocated by the application\&. This is a "stats\&.mapped" (\fBsize_t\fR) r\- [\fB\-\-enable\-stats\fR] .RS 4 Total number of bytes in chunks mapped on behalf of the application\&. This is a multiple of the chunk size, and is at least as large as -"stats\&.active"\&. This does not include inactive chunks embedded in the DSS\&. +"stats\&.active"\&. This does not include inactive chunks\&. .RE .PP "stats\&.chunks\&.current" (\fBsize_t\fR) r\- [\fB\-\-enable\-stats\fR] .RS 4 -Total number of chunks actively mapped on behalf of the application\&. This does not include inactive chunks embedded in the DSS\&. +Total number of chunks actively mapped on behalf of the application\&. This does not include inactive chunks\&. .RE .PP "stats\&.chunks\&.total" (\fBuint64_t\fR) r\- [\fB\-\-enable\-stats\fR] @@ -1462,7 +1468,7 @@ jemalloc website .IP " 2." 4 Valgrind .RS 4 -\%http://http://valgrind.org/ +\%http://valgrind.org/ .RE .IP " 3." 4 gperftools package diff --git a/contrib/jemalloc/include/jemalloc/internal/arena.h b/contrib/jemalloc/include/jemalloc/internal/arena.h index 2eb41cd97e5..0b0f640a459 100644 --- a/contrib/jemalloc/include/jemalloc/internal/arena.h +++ b/contrib/jemalloc/include/jemalloc/internal/arena.h @@ -93,13 +93,13 @@ struct arena_chunk_map_s { * Run address (or size) and various flags are stored together. The bit * layout looks like (assuming 32-bit system): * - * ???????? ???????? ????---- ----dula + * ???????? ???????? ????nnnn nnnndula * * ? : Unallocated: Run address for first/last pages, unset for internal * pages. * Small: Run page offset. * Large: Run size for first page, unset for trailing pages. - * - : Unused. + * n : binind for small size class, BININD_INVALID for large size class. * d : dirty? * u : unzeroed? * l : large? @@ -109,7 +109,8 @@ struct arena_chunk_map_s { * * p : run page offset * s : run size - * c : (binind+1) for size class (used only if prof_promote is true) + * n : binind for size class; large objects set these to BININD_INVALID + * except for promoted allocations (see prof_promote) * x : don't care * - : 0 * + : 1 @@ -117,35 +118,38 @@ struct arena_chunk_map_s { * [dula] : bit unset * * Unallocated (clean): - * ssssssss ssssssss ssss---- ----du-a - * xxxxxxxx xxxxxxxx xxxx---- -----Uxx - * ssssssss ssssssss ssss---- ----dU-a + * ssssssss ssssssss ssss++++ ++++du-a + * xxxxxxxx xxxxxxxx xxxxxxxx xxxx-Uxx + * ssssssss ssssssss ssss++++ ++++dU-a * * Unallocated (dirty): - * ssssssss ssssssss ssss---- ----D--a - * xxxxxxxx xxxxxxxx xxxx---- ----xxxx - * ssssssss ssssssss ssss---- ----D--a + * ssssssss ssssssss ssss++++ ++++D--a + * xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx + * ssssssss ssssssss ssss++++ ++++D--a * * Small: - * pppppppp pppppppp pppp---- ----d--A - * pppppppp pppppppp pppp---- -------A - * pppppppp pppppppp pppp---- ----d--A + * pppppppp pppppppp ppppnnnn nnnnd--A + * pppppppp pppppppp ppppnnnn nnnn---A + * pppppppp pppppppp ppppnnnn nnnnd--A * * Large: - * ssssssss ssssssss ssss---- ----D-LA - * xxxxxxxx xxxxxxxx xxxx---- ----xxxx - * -------- -------- -------- ----D-LA + * ssssssss ssssssss ssss++++ ++++D-LA + * xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx + * -------- -------- ----++++ ++++D-LA * * Large (sampled, size <= PAGE): - * ssssssss ssssssss sssscccc ccccD-LA + * ssssssss ssssssss ssssnnnn nnnnD-LA * * Large (not sampled, size == PAGE): - * ssssssss ssssssss ssss---- ----D-LA + * ssssssss ssssssss ssss++++ ++++D-LA */ size_t bits; -#define CHUNK_MAP_CLASS_SHIFT 4 -#define CHUNK_MAP_CLASS_MASK ((size_t)0xff0U) -#define CHUNK_MAP_FLAGS_MASK ((size_t)0xfU) +#define CHUNK_MAP_BININD_SHIFT 4 +#define BININD_INVALID ((size_t)0xffU) +/* CHUNK_MAP_BININD_MASK == (BININD_INVALID << CHUNK_MAP_BININD_SHIFT) */ +#define CHUNK_MAP_BININD_MASK ((size_t)0xff0U) +#define CHUNK_MAP_BININD_INVALID CHUNK_MAP_BININD_MASK +#define CHUNK_MAP_FLAGS_MASK ((size_t)0xcU) #define CHUNK_MAP_DIRTY ((size_t)0x8U) #define CHUNK_MAP_UNZEROED ((size_t)0x4U) #define CHUNK_MAP_LARGE ((size_t)0x2U) @@ -409,8 +413,14 @@ void *arena_malloc_small(arena_t *arena, size_t size, bool zero); void *arena_malloc_large(arena_t *arena, size_t size, bool zero); void *arena_palloc(arena_t *arena, size_t size, size_t alignment, bool zero); void arena_prof_promoted(const void *ptr, size_t size); -void arena_dalloc_bin(arena_t *arena, arena_chunk_t *chunk, void *ptr, +void arena_dalloc_bin_locked(arena_t *arena, arena_chunk_t *chunk, void *ptr, arena_chunk_map_t *mapelm); +void arena_dalloc_bin(arena_t *arena, arena_chunk_t *chunk, void *ptr, + size_t pageind, arena_chunk_map_t *mapelm); +void arena_dalloc_small(arena_t *arena, arena_chunk_t *chunk, void *ptr, + size_t pageind); +void arena_dalloc_large_locked(arena_t *arena, arena_chunk_t *chunk, + void *ptr); void arena_dalloc_large(arena_t *arena, arena_chunk_t *chunk, void *ptr); void arena_stats_merge(arena_t *arena, size_t *nactive, size_t *ndirty, arena_stats_t *astats, malloc_bin_stats_t *bstats, @@ -430,6 +440,31 @@ void arena_postfork_child(arena_t *arena); #ifdef JEMALLOC_H_INLINES #ifndef JEMALLOC_ENABLE_INLINE +arena_chunk_map_t *arena_mapp_get(arena_chunk_t *chunk, size_t pageind); +size_t *arena_mapbitsp_get(arena_chunk_t *chunk, size_t pageind); +size_t arena_mapbits_get(arena_chunk_t *chunk, size_t pageind); +size_t arena_mapbits_unallocated_size_get(arena_chunk_t *chunk, + size_t pageind); +size_t arena_mapbits_large_size_get(arena_chunk_t *chunk, size_t pageind); +size_t arena_mapbits_small_runind_get(arena_chunk_t *chunk, size_t pageind); +size_t arena_mapbits_binind_get(arena_chunk_t *chunk, size_t pageind); +size_t arena_mapbits_dirty_get(arena_chunk_t *chunk, size_t pageind); +size_t arena_mapbits_unzeroed_get(arena_chunk_t *chunk, size_t pageind); +size_t arena_mapbits_large_get(arena_chunk_t *chunk, size_t pageind); +size_t arena_mapbits_allocated_get(arena_chunk_t *chunk, size_t pageind); +void arena_mapbits_unallocated_set(arena_chunk_t *chunk, size_t pageind, + size_t size, size_t flags); +void arena_mapbits_unallocated_size_set(arena_chunk_t *chunk, size_t pageind, + size_t size); +void arena_mapbits_large_set(arena_chunk_t *chunk, size_t pageind, + size_t size, size_t flags); +void arena_mapbits_large_binind_set(arena_chunk_t *chunk, size_t pageind, + size_t binind); +void arena_mapbits_small_set(arena_chunk_t *chunk, size_t pageind, + size_t runind, size_t binind, size_t flags); +void arena_mapbits_unzeroed_set(arena_chunk_t *chunk, size_t pageind, + size_t unzeroed); +size_t arena_ptr_small_binind_get(const void *ptr, size_t mapbits); size_t arena_bin_index(arena_t *arena, arena_bin_t *bin); unsigned arena_run_regind(arena_run_t *run, arena_bin_info_t *bin_info, const void *ptr); @@ -442,6 +477,232 @@ void arena_dalloc(arena_t *arena, arena_chunk_t *chunk, void *ptr, #endif #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_ARENA_C_)) +# ifdef JEMALLOC_ARENA_INLINE_A +JEMALLOC_INLINE arena_chunk_map_t * +arena_mapp_get(arena_chunk_t *chunk, size_t pageind) +{ + + assert(pageind >= map_bias); + assert(pageind < chunk_npages); + + return (&chunk->map[pageind-map_bias]); +} + +JEMALLOC_INLINE size_t * +arena_mapbitsp_get(arena_chunk_t *chunk, size_t pageind) +{ + + return (&arena_mapp_get(chunk, pageind)->bits); +} + +JEMALLOC_INLINE size_t +arena_mapbits_get(arena_chunk_t *chunk, size_t pageind) +{ + + return (*arena_mapbitsp_get(chunk, pageind)); +} + +JEMALLOC_INLINE size_t +arena_mapbits_unallocated_size_get(arena_chunk_t *chunk, size_t pageind) +{ + size_t mapbits; + + mapbits = arena_mapbits_get(chunk, pageind); + assert((mapbits & (CHUNK_MAP_LARGE|CHUNK_MAP_ALLOCATED)) == 0); + return (mapbits & ~PAGE_MASK); +} + +JEMALLOC_INLINE size_t +arena_mapbits_large_size_get(arena_chunk_t *chunk, size_t pageind) +{ + size_t mapbits; + + mapbits = arena_mapbits_get(chunk, pageind); + assert((mapbits & (CHUNK_MAP_LARGE|CHUNK_MAP_ALLOCATED)) == + (CHUNK_MAP_LARGE|CHUNK_MAP_ALLOCATED)); + return (mapbits & ~PAGE_MASK); +} + +JEMALLOC_INLINE size_t +arena_mapbits_small_runind_get(arena_chunk_t *chunk, size_t pageind) +{ + size_t mapbits; + + mapbits = arena_mapbits_get(chunk, pageind); + assert((mapbits & (CHUNK_MAP_LARGE|CHUNK_MAP_ALLOCATED)) == + CHUNK_MAP_ALLOCATED); + return (mapbits >> LG_PAGE); +} + +JEMALLOC_INLINE size_t +arena_mapbits_binind_get(arena_chunk_t *chunk, size_t pageind) +{ + size_t mapbits; + size_t binind; + + mapbits = arena_mapbits_get(chunk, pageind); + binind = (mapbits & CHUNK_MAP_BININD_MASK) >> CHUNK_MAP_BININD_SHIFT; + assert(binind < NBINS || binind == BININD_INVALID); + return (binind); +} + +JEMALLOC_INLINE size_t +arena_mapbits_dirty_get(arena_chunk_t *chunk, size_t pageind) +{ + size_t mapbits; + + mapbits = arena_mapbits_get(chunk, pageind); + return (mapbits & CHUNK_MAP_DIRTY); +} + +JEMALLOC_INLINE size_t +arena_mapbits_unzeroed_get(arena_chunk_t *chunk, size_t pageind) +{ + size_t mapbits; + + mapbits = arena_mapbits_get(chunk, pageind); + return (mapbits & CHUNK_MAP_UNZEROED); +} + +JEMALLOC_INLINE size_t +arena_mapbits_large_get(arena_chunk_t *chunk, size_t pageind) +{ + size_t mapbits; + + mapbits = arena_mapbits_get(chunk, pageind); + return (mapbits & CHUNK_MAP_LARGE); +} + +JEMALLOC_INLINE size_t +arena_mapbits_allocated_get(arena_chunk_t *chunk, size_t pageind) +{ + size_t mapbits; + + mapbits = arena_mapbits_get(chunk, pageind); + return (mapbits & CHUNK_MAP_ALLOCATED); +} + +JEMALLOC_INLINE void +arena_mapbits_unallocated_set(arena_chunk_t *chunk, size_t pageind, size_t size, + size_t flags) +{ + size_t *mapbitsp; + + mapbitsp = arena_mapbitsp_get(chunk, pageind); + assert((size & PAGE_MASK) == 0); + assert((flags & ~CHUNK_MAP_FLAGS_MASK) == 0); + assert((flags & (CHUNK_MAP_DIRTY|CHUNK_MAP_UNZEROED)) == flags); + *mapbitsp = size | CHUNK_MAP_BININD_INVALID | flags; +} + +JEMALLOC_INLINE void +arena_mapbits_unallocated_size_set(arena_chunk_t *chunk, size_t pageind, + size_t size) +{ + size_t *mapbitsp; + + mapbitsp = arena_mapbitsp_get(chunk, pageind); + assert((size & PAGE_MASK) == 0); + assert((*mapbitsp & (CHUNK_MAP_LARGE|CHUNK_MAP_ALLOCATED)) == 0); + *mapbitsp = size | (*mapbitsp & PAGE_MASK); +} + +JEMALLOC_INLINE void +arena_mapbits_large_set(arena_chunk_t *chunk, size_t pageind, size_t size, + size_t flags) +{ + size_t *mapbitsp; + size_t unzeroed; + + mapbitsp = arena_mapbitsp_get(chunk, pageind); + assert((size & PAGE_MASK) == 0); + assert((flags & CHUNK_MAP_DIRTY) == flags); + unzeroed = *mapbitsp & CHUNK_MAP_UNZEROED; /* Preserve unzeroed. */ + *mapbitsp = size | CHUNK_MAP_BININD_INVALID | flags | unzeroed | + CHUNK_MAP_LARGE | CHUNK_MAP_ALLOCATED; +} + +JEMALLOC_INLINE void +arena_mapbits_large_binind_set(arena_chunk_t *chunk, size_t pageind, + size_t binind) +{ + size_t *mapbitsp; + + assert(binind <= BININD_INVALID); + mapbitsp = arena_mapbitsp_get(chunk, pageind); + assert(arena_mapbits_large_size_get(chunk, pageind) == PAGE); + *mapbitsp = (*mapbitsp & ~CHUNK_MAP_BININD_MASK) | (binind << + CHUNK_MAP_BININD_SHIFT); +} + +JEMALLOC_INLINE void +arena_mapbits_small_set(arena_chunk_t *chunk, size_t pageind, size_t runind, + size_t binind, size_t flags) +{ + size_t *mapbitsp; + size_t unzeroed; + + assert(binind < BININD_INVALID); + mapbitsp = arena_mapbitsp_get(chunk, pageind); + assert(pageind - runind >= map_bias); + assert((flags & CHUNK_MAP_DIRTY) == flags); + unzeroed = *mapbitsp & CHUNK_MAP_UNZEROED; /* Preserve unzeroed. */ + *mapbitsp = (runind << LG_PAGE) | (binind << CHUNK_MAP_BININD_SHIFT) | + flags | unzeroed | CHUNK_MAP_ALLOCATED; +} + +JEMALLOC_INLINE void +arena_mapbits_unzeroed_set(arena_chunk_t *chunk, size_t pageind, + size_t unzeroed) +{ + size_t *mapbitsp; + + mapbitsp = arena_mapbitsp_get(chunk, pageind); + *mapbitsp = (*mapbitsp & ~CHUNK_MAP_UNZEROED) | unzeroed; +} + +JEMALLOC_INLINE size_t +arena_ptr_small_binind_get(const void *ptr, size_t mapbits) +{ + size_t binind; + + binind = (mapbits & CHUNK_MAP_BININD_MASK) >> CHUNK_MAP_BININD_SHIFT; + + if (config_debug) { + arena_chunk_t *chunk; + arena_t *arena; + size_t pageind; + size_t actual_mapbits; + arena_run_t *run; + arena_bin_t *bin; + size_t actual_binind; + arena_bin_info_t *bin_info; + + assert(binind != BININD_INVALID); + assert(binind < NBINS); + chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr); + arena = chunk->arena; + pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE; + actual_mapbits = arena_mapbits_get(chunk, pageind); + assert(mapbits == actual_mapbits); + assert(arena_mapbits_large_get(chunk, pageind) == 0); + assert(arena_mapbits_allocated_get(chunk, pageind) != 0); + run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind - + (actual_mapbits >> LG_PAGE)) << LG_PAGE)); + bin = run->bin; + actual_binind = bin - arena->bins; + assert(binind == actual_binind); + bin_info = &arena_bin_info[actual_binind]; + assert(((uintptr_t)ptr - ((uintptr_t)run + + (uintptr_t)bin_info->reg0_offset)) % bin_info->reg_interval + == 0); + } + + return (binind); +} +# endif /* JEMALLOC_ARENA_INLINE_A */ + +# ifdef JEMALLOC_ARENA_INLINE_B JEMALLOC_INLINE size_t arena_bin_index(arena_t *arena, arena_bin_t *bin) { @@ -535,7 +796,7 @@ arena_prof_ctx_get(const void *ptr) chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr); pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE; - mapbits = chunk->map[pageind-map_bias].bits; + mapbits = arena_mapbits_get(chunk, pageind); assert((mapbits & CHUNK_MAP_ALLOCATED) != 0); if ((mapbits & CHUNK_MAP_LARGE) == 0) { if (prof_promote) @@ -544,7 +805,8 @@ arena_prof_ctx_get(const void *ptr) arena_run_t *run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind - (mapbits >> LG_PAGE)) << LG_PAGE)); - size_t binind = arena_bin_index(chunk->arena, run->bin); + size_t binind = arena_ptr_small_binind_get(ptr, + mapbits); arena_bin_info_t *bin_info = &arena_bin_info[binind]; unsigned regind; @@ -554,7 +816,7 @@ arena_prof_ctx_get(const void *ptr) sizeof(prof_ctx_t *))); } } else - ret = chunk->map[pageind-map_bias].prof_ctx; + ret = arena_mapp_get(chunk, pageind)->prof_ctx; return (ret); } @@ -571,19 +833,18 @@ arena_prof_ctx_set(const void *ptr, prof_ctx_t *ctx) chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr); pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE; - mapbits = chunk->map[pageind-map_bias].bits; + mapbits = arena_mapbits_get(chunk, pageind); assert((mapbits & CHUNK_MAP_ALLOCATED) != 0); if ((mapbits & CHUNK_MAP_LARGE) == 0) { if (prof_promote == false) { arena_run_t *run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind - (mapbits >> LG_PAGE)) << LG_PAGE)); - arena_bin_t *bin = run->bin; size_t binind; arena_bin_info_t *bin_info; unsigned regind; - binind = arena_bin_index(chunk->arena, bin); + binind = arena_ptr_small_binind_get(ptr, mapbits); bin_info = &arena_bin_info[binind]; regind = arena_run_regind(run, bin_info, ptr); @@ -592,7 +853,7 @@ arena_prof_ctx_set(const void *ptr, prof_ctx_t *ctx) } else assert((uintptr_t)ctx == (uintptr_t)1U); } else - chunk->map[pageind-map_bias].prof_ctx = ctx; + arena_mapp_get(chunk, pageind)->prof_ctx = ctx; } JEMALLOC_INLINE void * @@ -631,35 +892,42 @@ arena_salloc(const void *ptr, bool demote) { size_t ret; arena_chunk_t *chunk; - size_t pageind, mapbits; + size_t pageind, binind; assert(ptr != NULL); assert(CHUNK_ADDR2BASE(ptr) != ptr); chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr); pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE; - mapbits = chunk->map[pageind-map_bias].bits; - assert((mapbits & CHUNK_MAP_ALLOCATED) != 0); - if ((mapbits & CHUNK_MAP_LARGE) == 0) { - arena_run_t *run = (arena_run_t *)((uintptr_t)chunk + - (uintptr_t)((pageind - (mapbits >> LG_PAGE)) << LG_PAGE)); - size_t binind = arena_bin_index(chunk->arena, run->bin); - arena_bin_info_t *bin_info = &arena_bin_info[binind]; - assert(((uintptr_t)ptr - ((uintptr_t)run + - (uintptr_t)bin_info->reg0_offset)) % bin_info->reg_interval - == 0); - ret = bin_info->reg_size; - } else { + assert(arena_mapbits_allocated_get(chunk, pageind) != 0); + binind = arena_mapbits_binind_get(chunk, pageind); + if (binind == BININD_INVALID || (config_prof && demote == false && + prof_promote && arena_mapbits_large_get(chunk, pageind) != 0)) { + /* + * Large allocation. In the common case (demote == true), and + * as this is an inline function, most callers will only end up + * looking at binind to determine that ptr is a small + * allocation. + */ assert(((uintptr_t)ptr & PAGE_MASK) == 0); - ret = mapbits & ~PAGE_MASK; - if (config_prof && demote && prof_promote && ret == PAGE && - (mapbits & CHUNK_MAP_CLASS_MASK) != 0) { - size_t binind = ((mapbits & CHUNK_MAP_CLASS_MASK) >> - CHUNK_MAP_CLASS_SHIFT) - 1; - assert(binind < NBINS); - ret = arena_bin_info[binind].reg_size; - } + ret = arena_mapbits_large_size_get(chunk, pageind); assert(ret != 0); + assert(pageind + (ret>>LG_PAGE) <= chunk_npages); + assert(ret == PAGE || arena_mapbits_large_size_get(chunk, + pageind+(ret>>LG_PAGE)-1) == 0); + assert(binind == arena_mapbits_binind_get(chunk, + pageind+(ret>>LG_PAGE)-1)); + assert(arena_mapbits_dirty_get(chunk, pageind) == + arena_mapbits_dirty_get(chunk, pageind+(ret>>LG_PAGE)-1)); + } else { + /* + * Small allocation (possibly promoted to a large object due to + * prof_promote). + */ + assert(arena_mapbits_large_get(chunk, pageind) != 0 || + arena_ptr_small_binind_get(ptr, arena_mapbits_get(chunk, + pageind)) == binind); + ret = arena_bin_info[binind].reg_size; } return (ret); @@ -668,8 +936,7 @@ arena_salloc(const void *ptr, bool demote) JEMALLOC_INLINE void arena_dalloc(arena_t *arena, arena_chunk_t *chunk, void *ptr, bool try_tcache) { - size_t pageind; - arena_chunk_map_t *mapelm; + size_t pageind, mapbits; tcache_t *tcache; assert(arena != NULL); @@ -678,47 +945,30 @@ arena_dalloc(arena_t *arena, arena_chunk_t *chunk, void *ptr, bool try_tcache) assert(CHUNK_ADDR2BASE(ptr) != ptr); pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE; - mapelm = &chunk->map[pageind-map_bias]; - assert((mapelm->bits & CHUNK_MAP_ALLOCATED) != 0); - if ((mapelm->bits & CHUNK_MAP_LARGE) == 0) { + mapbits = arena_mapbits_get(chunk, pageind); + assert(arena_mapbits_allocated_get(chunk, pageind) != 0); + if ((mapbits & CHUNK_MAP_LARGE) == 0) { /* Small allocation. */ - if (try_tcache && (tcache = tcache_get(false)) != NULL) - tcache_dalloc_small(tcache, ptr); - else { - arena_run_t *run; - arena_bin_t *bin; + if (try_tcache && (tcache = tcache_get(false)) != NULL) { + size_t binind; - run = (arena_run_t *)((uintptr_t)chunk + - (uintptr_t)((pageind - (mapelm->bits >> LG_PAGE)) << - LG_PAGE)); - bin = run->bin; - if (config_debug) { - size_t binind = arena_bin_index(arena, bin); - UNUSED arena_bin_info_t *bin_info = - &arena_bin_info[binind]; - assert(((uintptr_t)ptr - ((uintptr_t)run + - (uintptr_t)bin_info->reg0_offset)) % - bin_info->reg_interval == 0); - } - malloc_mutex_lock(&bin->lock); - arena_dalloc_bin(arena, chunk, ptr, mapelm); - malloc_mutex_unlock(&bin->lock); - } + binind = arena_ptr_small_binind_get(ptr, mapbits); + tcache_dalloc_small(tcache, ptr, binind); + } else + arena_dalloc_small(arena, chunk, ptr, pageind); } else { - size_t size = mapelm->bits & ~PAGE_MASK; + size_t size = arena_mapbits_large_size_get(chunk, pageind); assert(((uintptr_t)ptr & PAGE_MASK) == 0); if (try_tcache && size <= tcache_maxclass && (tcache = tcache_get(false)) != NULL) { tcache_dalloc_large(tcache, ptr, size); - } else { - malloc_mutex_lock(&arena->lock); + } else arena_dalloc_large(arena, chunk, ptr); - malloc_mutex_unlock(&arena->lock); - } } } +# endif /* JEMALLOC_ARENA_INLINE_B */ #endif #endif /* JEMALLOC_H_INLINES */ diff --git a/contrib/jemalloc/include/jemalloc/internal/atomic.h b/contrib/jemalloc/include/jemalloc/internal/atomic.h index 016c472aba9..11a7b47fe0f 100644 --- a/contrib/jemalloc/include/jemalloc/internal/atomic.h +++ b/contrib/jemalloc/include/jemalloc/internal/atomic.h @@ -47,6 +47,20 @@ atomic_sub_uint64(uint64_t *p, uint64_t x) return (__sync_sub_and_fetch(p, x)); } +#elif (defined(_MSC_VER)) +JEMALLOC_INLINE uint64_t +atomic_add_uint64(uint64_t *p, uint64_t x) +{ + + return (InterlockedExchangeAdd64(p, x)); +} + +JEMALLOC_INLINE uint64_t +atomic_sub_uint64(uint64_t *p, uint64_t x) +{ + + return (InterlockedExchangeAdd64(p, -((int64_t)x))); +} #elif (defined(JEMALLOC_OSATOMIC)) JEMALLOC_INLINE uint64_t atomic_add_uint64(uint64_t *p, uint64_t x) @@ -145,6 +159,20 @@ atomic_sub_uint32(uint32_t *p, uint32_t x) return (__sync_sub_and_fetch(p, x)); } +#elif (defined(_MSC_VER)) +JEMALLOC_INLINE uint32_t +atomic_add_uint32(uint32_t *p, uint32_t x) +{ + + return (InterlockedExchangeAdd(p, x)); +} + +JEMALLOC_INLINE uint32_t +atomic_sub_uint32(uint32_t *p, uint32_t x) +{ + + return (InterlockedExchangeAdd(p, -((int32_t)x))); +} #elif (defined(JEMALLOC_OSATOMIC)) JEMALLOC_INLINE uint32_t atomic_add_uint32(uint32_t *p, uint32_t x) diff --git a/contrib/jemalloc/include/jemalloc/internal/ctl.h b/contrib/jemalloc/include/jemalloc/internal/ctl.h index a48d09fe792..adf3827f094 100644 --- a/contrib/jemalloc/include/jemalloc/internal/ctl.h +++ b/contrib/jemalloc/include/jemalloc/internal/ctl.h @@ -2,6 +2,8 @@ #ifdef JEMALLOC_H_TYPES typedef struct ctl_node_s ctl_node_t; +typedef struct ctl_named_node_s ctl_named_node_t; +typedef struct ctl_indexed_node_s ctl_indexed_node_t; typedef struct ctl_arena_stats_s ctl_arena_stats_t; typedef struct ctl_stats_s ctl_stats_t; @@ -11,20 +13,21 @@ typedef struct ctl_stats_s ctl_stats_t; struct ctl_node_s { bool named; - union { - struct { - const char *name; - /* If (nchildren == 0), this is a terminal node. */ - unsigned nchildren; - const ctl_node_t *children; - } named; - struct { - const ctl_node_t *(*index)(const size_t *, size_t, - size_t); - } indexed; - } u; - int (*ctl)(const size_t *, size_t, void *, size_t *, void *, - size_t); +}; + +struct ctl_named_node_s { + struct ctl_node_s node; + const char *name; + /* If (nchildren == 0), this is a terminal node. */ + unsigned nchildren; + const ctl_node_t *children; + int (*ctl)(const size_t *, size_t, void *, size_t *, + void *, size_t); +}; + +struct ctl_indexed_node_s { + struct ctl_node_s node; + const ctl_named_node_t *(*index)(const size_t *, size_t, size_t); }; struct ctl_arena_stats_s { diff --git a/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal.h b/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal.h index 1f38d1ad475..32cdc6f3142 100644 --- a/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal.h +++ b/contrib/jemalloc/include/jemalloc/internal/jemalloc_internal.h @@ -3,23 +3,34 @@ #include "libc_private.h" #include "namespace.h" -#include -#include -#include -#if !defined(SYS_write) && defined(__NR_write) -#define SYS_write __NR_write +#include +#ifdef _WIN32 +# include +# define ENOENT ERROR_PATH_NOT_FOUND +# define EINVAL ERROR_BAD_ARGUMENTS +# define EAGAIN ERROR_OUTOFMEMORY +# define EPERM ERROR_WRITE_FAULT +# define EFAULT ERROR_INVALID_ADDRESS +# define ENOMEM ERROR_NOT_ENOUGH_MEMORY +# undef ERANGE +# define ERANGE ERROR_INVALID_DATA +#else +# include +# include +# include +# if !defined(SYS_write) && defined(__NR_write) +# define SYS_write __NR_write +# endif +# include +# include +# include #endif -#include #include -#include -#include #include #ifndef SIZE_T_MAX # define SIZE_T_MAX SIZE_MAX #endif -#include -#include #include #include #include @@ -33,10 +44,18 @@ #include #include #include -#include +#ifdef _MSC_VER +# include +typedef intptr_t ssize_t; +# define PATH_MAX 1024 +# define STDERR_FILENO 2 +# define __func__ __FUNCTION__ +/* Disable warnings about deprecated system functions */ +# pragma warning(disable: 4996) +#else +# include +#endif #include -#include -#include #include "un-namespace.h" #include "libc_private.h" @@ -82,13 +101,7 @@ static const bool config_fill = false #endif ; -static const bool config_lazy_lock = -#ifdef JEMALLOC_LAZY_LOCK - true -#else - false -#endif - ; +static const bool config_lazy_lock = true; static const bool config_prof = #ifdef JEMALLOC_PROF true @@ -110,6 +123,13 @@ static const bool config_prof_libunwind = false #endif ; +static const bool config_mremap = +#ifdef JEMALLOC_MREMAP + true +#else + false +#endif + ; static const bool config_munmap = #ifdef JEMALLOC_MUNMAP true @@ -218,6 +238,9 @@ static const bool config_ivsalloc = #else # define JEMALLOC_ENABLE_INLINE # define JEMALLOC_INLINE static inline +# ifdef _MSC_VER +# define inline _inline +# endif #endif /* Smallest size class to support. */ @@ -229,7 +252,7 @@ static const bool config_ivsalloc = * classes). */ #ifndef LG_QUANTUM -# ifdef __i386__ +# if (defined(__i386__) || defined(_M_IX86)) # define LG_QUANTUM 4 # endif # ifdef __ia64__ @@ -241,7 +264,7 @@ static const bool config_ivsalloc = # ifdef __sparc64__ # define LG_QUANTUM 4 # endif -# if (defined(__amd64__) || defined(__x86_64__)) +# if (defined(__amd64__) || defined(__x86_64__) || defined(_M_X64)) # define LG_QUANTUM 4 # endif # ifdef __arm__ @@ -291,9 +314,12 @@ static const bool config_ivsalloc = /* * Maximum size of L1 cache line. This is used to avoid cache line aliasing. * In addition, this controls the spacing of cacheline-spaced size classes. + * + * CACHELINE cannot be based on LG_CACHELINE because __declspec(align()) can + * only handle raw constants. */ #define LG_CACHELINE 6 -#define CACHELINE ((size_t)(1U << LG_CACHELINE)) +#define CACHELINE 64 #define CACHELINE_MASK (CACHELINE - 1) /* Return the smallest cacheline multiple that is >= s. */ @@ -324,6 +350,20 @@ static const bool config_ivsalloc = #define ALIGNMENT_CEILING(s, alignment) \ (((s) + (alignment - 1)) & (-(alignment))) +/* Declare a variable length array */ +#if __STDC_VERSION__ < 199901L +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# include +# endif +# define VARIABLE_ARRAY(type, name, count) \ + type *name = alloca(sizeof(type) * count) +#else +# define VARIABLE_ARRAY(type, name, count) type name[count] +#endif + #ifdef JEMALLOC_VALGRIND /* * The JEMALLOC_VALGRIND_*() macros must be macros rather than functions @@ -655,8 +695,17 @@ choose_arena(arena_t *arena) #include "jemalloc/internal/bitmap.h" #include "jemalloc/internal/rtree.h" -#include "jemalloc/internal/tcache.h" +/* + * Include arena.h twice in order to resolve circular dependencies with + * tcache.h. + */ +#define JEMALLOC_ARENA_INLINE_A #include "jemalloc/internal/arena.h" +#undef JEMALLOC_ARENA_INLINE_A +#include "jemalloc/internal/tcache.h" +#define JEMALLOC_ARENA_INLINE_B +#include "jemalloc/internal/arena.h" +#undef JEMALLOC_ARENA_INLINE_B #include "jemalloc/internal/hash.h" #include "jemalloc/internal/quarantine.h" diff --git a/contrib/jemalloc/include/jemalloc/internal/mutex.h b/contrib/jemalloc/include/jemalloc/internal/mutex.h index d7133f4d29c..564d6046b42 100644 --- a/contrib/jemalloc/include/jemalloc/internal/mutex.h +++ b/contrib/jemalloc/include/jemalloc/internal/mutex.h @@ -3,10 +3,12 @@ typedef struct malloc_mutex_s malloc_mutex_t; -#ifdef JEMALLOC_OSSPIN -#define MALLOC_MUTEX_INITIALIZER {0} +#ifdef _WIN32 +# define MALLOC_MUTEX_INITIALIZER +#elif (defined(JEMALLOC_OSSPIN)) +# define MALLOC_MUTEX_INITIALIZER {0} #elif (defined(JEMALLOC_MUTEX_INIT_CB)) -#define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER, NULL} +# define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER, NULL} #else # if (defined(PTHREAD_MUTEX_ADAPTIVE_NP) && \ defined(PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP)) @@ -23,7 +25,9 @@ typedef struct malloc_mutex_s malloc_mutex_t; #ifdef JEMALLOC_H_STRUCTS struct malloc_mutex_s { -#ifdef JEMALLOC_OSSPIN +#ifdef _WIN32 + CRITICAL_SECTION lock; +#elif (defined(JEMALLOC_OSSPIN)) OSSpinLock lock; #elif (defined(JEMALLOC_MUTEX_INIT_CB)) pthread_mutex_t lock; @@ -62,7 +66,9 @@ malloc_mutex_lock(malloc_mutex_t *mutex) { if (isthreaded) { -#ifdef JEMALLOC_OSSPIN +#ifdef _WIN32 + EnterCriticalSection(&mutex->lock); +#elif (defined(JEMALLOC_OSSPIN)) OSSpinLockLock(&mutex->lock); #else pthread_mutex_lock(&mutex->lock); @@ -75,7 +81,9 @@ malloc_mutex_unlock(malloc_mutex_t *mutex) { if (isthreaded) { -#ifdef JEMALLOC_OSSPIN +#ifdef _WIN32 + LeaveCriticalSection(&mutex->lock); +#elif (defined(JEMALLOC_OSSPIN)) OSSpinLockUnlock(&mutex->lock); #else pthread_mutex_unlock(&mutex->lock); diff --git a/contrib/jemalloc/include/jemalloc/internal/private_namespace.h b/contrib/jemalloc/include/jemalloc/internal/private_namespace.h index 00eb169cfd2..b8ce6b16125 100644 --- a/contrib/jemalloc/include/jemalloc/internal/private_namespace.h +++ b/contrib/jemalloc/include/jemalloc/internal/private_namespace.h @@ -7,11 +7,31 @@ #define arena_boot JEMALLOC_N(arena_boot) #define arena_dalloc JEMALLOC_N(arena_dalloc) #define arena_dalloc_bin JEMALLOC_N(arena_dalloc_bin) +#define arena_dalloc_bin_locked JEMALLOC_N(arena_dalloc_bin_locked) #define arena_dalloc_junk_small JEMALLOC_N(arena_dalloc_junk_small) #define arena_dalloc_large JEMALLOC_N(arena_dalloc_large) +#define arena_dalloc_large_locked JEMALLOC_N(arena_dalloc_large_locked) +#define arena_dalloc_small JEMALLOC_N(arena_dalloc_small) #define arena_malloc JEMALLOC_N(arena_malloc) #define arena_malloc_large JEMALLOC_N(arena_malloc_large) #define arena_malloc_small JEMALLOC_N(arena_malloc_small) +#define arena_mapbits_allocated_get JEMALLOC_N(arena_mapbits_allocated_get) +#define arena_mapbits_binind_get JEMALLOC_N(arena_mapbits_binind_get) +#define arena_mapbits_dirty_get JEMALLOC_N(arena_mapbits_dirty_get) +#define arena_mapbits_get JEMALLOC_N(arena_mapbits_get) +#define arena_mapbits_large_binind_set JEMALLOC_N(arena_mapbits_large_binind_set) +#define arena_mapbits_large_get JEMALLOC_N(arena_mapbits_large_get) +#define arena_mapbits_large_set JEMALLOC_N(arena_mapbits_large_set) +#define arena_mapbits_large_size_get JEMALLOC_N(arena_mapbits_large_size_get) +#define arena_mapbits_small_runind_get JEMALLOC_N(arena_mapbits_small_runind_get) +#define arena_mapbits_small_set JEMALLOC_N(arena_mapbits_small_set) +#define arena_mapbits_unallocated_set JEMALLOC_N(arena_mapbits_unallocated_set) +#define arena_mapbits_unallocated_size_get JEMALLOC_N(arena_mapbits_unallocated_size_get) +#define arena_mapbits_unallocated_size_set JEMALLOC_N(arena_mapbits_unallocated_size_set) +#define arena_mapbits_unzeroed_get JEMALLOC_N(arena_mapbits_unzeroed_get) +#define arena_mapbits_unzeroed_set JEMALLOC_N(arena_mapbits_unzeroed_set) +#define arena_mapbitsp_get JEMALLOC_N(arena_mapbitsp_get) +#define arena_mapp_get JEMALLOC_N(arena_mapp_get) #define arena_maxclass JEMALLOC_N(arena_maxclass) #define arena_new JEMALLOC_N(arena_new) #define arena_palloc JEMALLOC_N(arena_palloc) @@ -22,6 +42,7 @@ #define arena_prof_ctx_get JEMALLOC_N(arena_prof_ctx_get) #define arena_prof_ctx_set JEMALLOC_N(arena_prof_ctx_set) #define arena_prof_promoted JEMALLOC_N(arena_prof_promoted) +#define arena_ptr_small_binind_get JEMALLOC_N(arena_ptr_small_binind_get) #define arena_purge_all JEMALLOC_N(arena_purge_all) #define arena_ralloc JEMALLOC_N(arena_ralloc) #define arena_ralloc_no_move JEMALLOC_N(arena_ralloc_no_move) @@ -232,13 +253,13 @@ #define prof_lookup JEMALLOC_N(prof_lookup) #define prof_malloc JEMALLOC_N(prof_malloc) #define prof_mdump JEMALLOC_N(prof_mdump) -#define prof_lookup JEMALLOC_N(prof_lookup) #define prof_promote JEMALLOC_N(prof_promote) #define prof_realloc JEMALLOC_N(prof_realloc) #define prof_sample_accum_update JEMALLOC_N(prof_sample_accum_update) #define prof_sample_threshold_update JEMALLOC_N(prof_sample_threshold_update) #define prof_tdata_booted JEMALLOC_N(prof_tdata_booted) #define prof_tdata_cleanup JEMALLOC_N(prof_tdata_cleanup) +#define prof_tdata_get JEMALLOC_N(prof_tdata_get) #define prof_tdata_init JEMALLOC_N(prof_tdata_init) #define prof_tdata_initialized JEMALLOC_N(prof_tdata_initialized) #define prof_tdata_tls JEMALLOC_N(prof_tdata_tls) @@ -294,12 +315,13 @@ #define tcache_enabled_tsd_get JEMALLOC_N(tcache_enabled_tsd_get) #define tcache_enabled_tsd_set JEMALLOC_N(tcache_enabled_tsd_set) #define tcache_event JEMALLOC_N(tcache_event) -#define tcache_initialized JEMALLOC_N(tcache_initialized) +#define tcache_event_hard JEMALLOC_N(tcache_event_hard) #define tcache_flush JEMALLOC_N(tcache_flush) #define tcache_get JEMALLOC_N(tcache_get) +#define tcache_initialized JEMALLOC_N(tcache_initialized) #define tcache_maxclass JEMALLOC_N(tcache_maxclass) -#define tcache_stats_merge JEMALLOC_N(tcache_stats_merge) #define tcache_salloc JEMALLOC_N(tcache_salloc) +#define tcache_stats_merge JEMALLOC_N(tcache_stats_merge) #define tcache_thread_cleanup JEMALLOC_N(tcache_thread_cleanup) #define tcache_tls JEMALLOC_N(tcache_tls) #define tcache_tsd_boot JEMALLOC_N(tcache_tsd_boot) diff --git a/contrib/jemalloc/include/jemalloc/internal/prof.h b/contrib/jemalloc/include/jemalloc/internal/prof.h index a4c563cc63d..c3e3f9e4bcd 100644 --- a/contrib/jemalloc/include/jemalloc/internal/prof.h +++ b/contrib/jemalloc/include/jemalloc/internal/prof.h @@ -37,6 +37,14 @@ typedef struct prof_tdata_s prof_tdata_t; */ #define PROF_NCTX_LOCKS 1024 +/* + * prof_tdata pointers close to NULL are used to encode state information that + * is used for cleaning up during thread shutdown. + */ +#define PROF_TDATA_STATE_REINCARNATED ((prof_tdata_t *)(uintptr_t)1) +#define PROF_TDATA_STATE_PURGATORY ((prof_tdata_t *)(uintptr_t)2) +#define PROF_TDATA_STATE_MAX PROF_TDATA_STATE_PURGATORY + #endif /* JEMALLOC_H_TYPES */ /******************************************************************************/ #ifdef JEMALLOC_H_STRUCTS @@ -113,9 +121,19 @@ struct prof_ctx_s { /* Associated backtrace. */ prof_bt_t *bt; - /* Protects cnt_merged and cnts_ql. */ + /* Protects nlimbo, cnt_merged, and cnts_ql. */ malloc_mutex_t *lock; + /* + * Number of threads that currently cause this ctx to be in a state of + * limbo due to one of: + * - Initializing per thread counters associated with this ctx. + * - Preparing to destroy this ctx. + * nlimbo must be 1 (single destroyer) in order to safely destroy the + * ctx. + */ + unsigned nlimbo; + /* Temporary storage for summation during dump. */ prof_cnt_t cnt_summed; @@ -152,6 +170,11 @@ struct prof_tdata_s { uint64_t prng_state; uint64_t threshold; uint64_t accum; + + /* State used to avoid dumping while operating on prof internals. */ + bool enq; + bool enq_idump; + bool enq_gdump; }; #endif /* JEMALLOC_H_STRUCTS */ @@ -211,13 +234,13 @@ bool prof_boot2(void); \ assert(size == s2u(size)); \ \ - prof_tdata = *prof_tdata_tsd_get(); \ - if (prof_tdata == NULL) { \ - prof_tdata = prof_tdata_init(); \ - if (prof_tdata == NULL) { \ + prof_tdata = prof_tdata_get(); \ + if ((uintptr_t)prof_tdata <= (uintptr_t)PROF_TDATA_STATE_MAX) { \ + if (prof_tdata != NULL) \ + ret = (prof_thr_cnt_t *)(uintptr_t)1U; \ + else \ ret = NULL; \ - break; \ - } \ + break; \ } \ \ if (opt_prof_active == false) { \ @@ -260,6 +283,7 @@ bool prof_boot2(void); #ifndef JEMALLOC_ENABLE_INLINE malloc_tsd_protos(JEMALLOC_ATTR(unused), prof_tdata, prof_tdata_t *) +prof_tdata_t *prof_tdata_get(void); void prof_sample_threshold_update(prof_tdata_t *prof_tdata); prof_ctx_t *prof_ctx_get(const void *ptr); void prof_ctx_set(const void *ptr, prof_ctx_t *ctx); @@ -276,6 +300,22 @@ malloc_tsd_externs(prof_tdata, prof_tdata_t *) malloc_tsd_funcs(JEMALLOC_INLINE, prof_tdata, prof_tdata_t *, NULL, prof_tdata_cleanup) +JEMALLOC_INLINE prof_tdata_t * +prof_tdata_get(void) +{ + prof_tdata_t *prof_tdata; + + cassert(config_prof); + + prof_tdata = *prof_tdata_tsd_get(); + if ((uintptr_t)prof_tdata <= (uintptr_t)PROF_TDATA_STATE_MAX) { + if (prof_tdata == NULL) + prof_tdata = prof_tdata_init(); + } + + return (prof_tdata); +} + JEMALLOC_INLINE void prof_sample_threshold_update(prof_tdata_t *prof_tdata) { @@ -355,7 +395,8 @@ prof_sample_accum_update(size_t size) assert(opt_lg_prof_sample != 0); prof_tdata = *prof_tdata_tsd_get(); - assert(prof_tdata != NULL); + if ((uintptr_t)prof_tdata <= (uintptr_t)PROF_TDATA_STATE_MAX) + return (true); /* Take care to avoid integer overflow. */ if (size >= prof_tdata->threshold - prof_tdata->accum) { @@ -501,8 +542,9 @@ prof_free(const void *ptr, size_t size) cassert(config_prof); if ((uintptr_t)ctx > (uintptr_t)1) { + prof_thr_cnt_t *tcnt; assert(size == isalloc(ptr, true)); - prof_thr_cnt_t *tcnt = prof_lookup(ctx->bt); + tcnt = prof_lookup(ctx->bt); if (tcnt != NULL) { tcnt->epoch++; diff --git a/contrib/jemalloc/include/jemalloc/internal/tcache.h b/contrib/jemalloc/include/jemalloc/internal/tcache.h index cfb17c28d1b..38d735c86c8 100644 --- a/contrib/jemalloc/include/jemalloc/internal/tcache.h +++ b/contrib/jemalloc/include/jemalloc/internal/tcache.h @@ -101,6 +101,7 @@ extern size_t nhbins; extern size_t tcache_maxclass; size_t tcache_salloc(const void *ptr); +void tcache_event_hard(tcache_t *tcache); void *tcache_alloc_small_hard(tcache_t *tcache, tcache_bin_t *tbin, size_t binind); void tcache_bin_flush_small(tcache_bin_t *tbin, size_t binind, unsigned rem, @@ -132,7 +133,7 @@ void tcache_enabled_set(bool enabled); void *tcache_alloc_easy(tcache_bin_t *tbin); void *tcache_alloc_small(tcache_t *tcache, size_t size, bool zero); void *tcache_alloc_large(tcache_t *tcache, size_t size, bool zero); -void tcache_dalloc_small(tcache_t *tcache, void *ptr); +void tcache_dalloc_small(tcache_t *tcache, void *ptr, size_t binind); void tcache_dalloc_large(tcache_t *tcache, void *ptr, size_t size); #endif @@ -266,47 +267,8 @@ tcache_event(tcache_t *tcache) tcache->ev_cnt++; assert(tcache->ev_cnt <= TCACHE_GC_INCR); - if (tcache->ev_cnt == TCACHE_GC_INCR) { - size_t binind = tcache->next_gc_bin; - tcache_bin_t *tbin = &tcache->tbins[binind]; - tcache_bin_info_t *tbin_info = &tcache_bin_info[binind]; - - if (tbin->low_water > 0) { - /* - * Flush (ceiling) 3/4 of the objects below the low - * water mark. - */ - if (binind < NBINS) { - tcache_bin_flush_small(tbin, binind, - tbin->ncached - tbin->low_water + - (tbin->low_water >> 2), tcache); - } else { - tcache_bin_flush_large(tbin, binind, - tbin->ncached - tbin->low_water + - (tbin->low_water >> 2), tcache); - } - /* - * Reduce fill count by 2X. Limit lg_fill_div such that - * the fill count is always at least 1. - */ - if ((tbin_info->ncached_max >> (tbin->lg_fill_div+1)) - >= 1) - tbin->lg_fill_div++; - } else if (tbin->low_water < 0) { - /* - * Increase fill count by 2X. Make sure lg_fill_div - * stays greater than 0. - */ - if (tbin->lg_fill_div > 1) - tbin->lg_fill_div--; - } - tbin->low_water = tbin->ncached; - - tcache->next_gc_bin++; - if (tcache->next_gc_bin == nhbins) - tcache->next_gc_bin = 0; - tcache->ev_cnt = 0; - } + if (tcache->ev_cnt == TCACHE_GC_INCR) + tcache_event_hard(tcache); } JEMALLOC_INLINE void * @@ -390,13 +352,13 @@ tcache_alloc_large(tcache_t *tcache, size_t size, bool zero) if (ret == NULL) return (NULL); } else { - if (config_prof) { + if (config_prof && prof_promote && size == PAGE) { arena_chunk_t *chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ret); size_t pageind = (((uintptr_t)ret - (uintptr_t)chunk) >> LG_PAGE); - chunk->map[pageind-map_bias].bits &= - ~CHUNK_MAP_CLASS_MASK; + arena_mapbits_large_binind_set(chunk, pageind, + BININD_INVALID); } if (zero == false) { if (config_fill) { @@ -421,30 +383,13 @@ tcache_alloc_large(tcache_t *tcache, size_t size, bool zero) } JEMALLOC_INLINE void -tcache_dalloc_small(tcache_t *tcache, void *ptr) +tcache_dalloc_small(tcache_t *tcache, void *ptr, size_t binind) { - arena_t *arena; - arena_chunk_t *chunk; - arena_run_t *run; - arena_bin_t *bin; tcache_bin_t *tbin; tcache_bin_info_t *tbin_info; - size_t pageind, binind; - arena_chunk_map_t *mapelm; assert(tcache_salloc(ptr) <= SMALL_MAXCLASS); - chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr); - arena = chunk->arena; - pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE; - mapelm = &chunk->map[pageind-map_bias]; - run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind - - (mapelm->bits >> LG_PAGE)) << LG_PAGE)); - bin = run->bin; - binind = ((uintptr_t)bin - (uintptr_t)&arena->bins) / - sizeof(arena_bin_t); - assert(binind < NBINS); - if (config_fill && opt_junk) arena_dalloc_junk_small(ptr, &arena_bin_info[binind]); diff --git a/contrib/jemalloc/include/jemalloc/internal/tsd.h b/contrib/jemalloc/include/jemalloc/internal/tsd.h index 20491c88528..0037cf35e70 100644 --- a/contrib/jemalloc/include/jemalloc/internal/tsd.h +++ b/contrib/jemalloc/include/jemalloc/internal/tsd.h @@ -74,6 +74,10 @@ extern bool a_name##_booted; extern __thread a_type a_name##_tls; \ extern pthread_key_t a_name##_tsd; \ extern bool a_name##_booted; +#elif (defined(_WIN32)) +#define malloc_tsd_externs(a_name, a_type) \ +extern DWORD a_name##_tsd; \ +extern bool a_name##_booted; #else #define malloc_tsd_externs(a_name, a_type) \ extern pthread_key_t a_name##_tsd; \ @@ -94,6 +98,10 @@ a_attr __thread a_type JEMALLOC_TLS_MODEL \ a_name##_tls = a_initializer; \ a_attr pthread_key_t a_name##_tsd; \ a_attr bool a_name##_booted = false; +#elif (defined(_WIN32)) +#define malloc_tsd_data(a_attr, a_name, a_type, a_initializer) \ +a_attr DWORD a_name##_tsd; \ +a_attr bool a_name##_booted = false; #else #define malloc_tsd_data(a_attr, a_name, a_type, a_initializer) \ a_attr pthread_key_t a_name##_tsd; \ @@ -182,6 +190,99 @@ a_name##_tsd_set(a_type *val) \ } \ } \ } +#elif (defined(_WIN32)) +#define malloc_tsd_funcs(a_attr, a_name, a_type, a_initializer, \ + a_cleanup) \ +/* Data structure. */ \ +typedef struct { \ + bool initialized; \ + a_type val; \ +} a_name##_tsd_wrapper_t; \ +/* Initialization/cleanup. */ \ +a_attr bool \ +a_name##_tsd_cleanup_wrapper(void) \ +{ \ + a_name##_tsd_wrapper_t *wrapper; \ + \ + wrapper = (a_name##_tsd_wrapper_t *) TlsGetValue(a_name##_tsd); \ + if (wrapper == NULL) \ + return (false); \ + if (a_cleanup != malloc_tsd_no_cleanup && \ + wrapper->initialized) { \ + a_type val = wrapper->val; \ + a_type tsd_static_data = a_initializer; \ + wrapper->initialized = false; \ + wrapper->val = tsd_static_data; \ + a_cleanup(&val); \ + if (wrapper->initialized) { \ + /* Trigger another cleanup round. */ \ + return (true); \ + } \ + } \ + malloc_tsd_dalloc(wrapper); \ + return (false); \ +} \ +a_attr bool \ +a_name##_tsd_boot(void) \ +{ \ + \ + a_name##_tsd = TlsAlloc(); \ + if (a_name##_tsd == TLS_OUT_OF_INDEXES) \ + return (true); \ + if (a_cleanup != malloc_tsd_no_cleanup) { \ + malloc_tsd_cleanup_register( \ + &a_name##_tsd_cleanup_wrapper); \ + } \ + a_name##_booted = true; \ + return (false); \ +} \ +/* Get/set. */ \ +a_attr a_name##_tsd_wrapper_t * \ +a_name##_tsd_get_wrapper(void) \ +{ \ + a_name##_tsd_wrapper_t *wrapper = (a_name##_tsd_wrapper_t *) \ + TlsGetValue(a_name##_tsd); \ + \ + if (wrapper == NULL) { \ + wrapper = (a_name##_tsd_wrapper_t *) \ + malloc_tsd_malloc(sizeof(a_name##_tsd_wrapper_t)); \ + if (wrapper == NULL) { \ + malloc_write(": Error allocating" \ + " TSD for "#a_name"\n"); \ + abort(); \ + } else { \ + static a_type tsd_static_data = a_initializer; \ + wrapper->initialized = false; \ + wrapper->val = tsd_static_data; \ + } \ + if (!TlsSetValue(a_name##_tsd, (void *)wrapper)) { \ + malloc_write(": Error setting" \ + " TSD for "#a_name"\n"); \ + abort(); \ + } \ + } \ + return (wrapper); \ +} \ +a_attr a_type * \ +a_name##_tsd_get(void) \ +{ \ + a_name##_tsd_wrapper_t *wrapper; \ + \ + assert(a_name##_booted); \ + wrapper = a_name##_tsd_get_wrapper(); \ + return (&wrapper->val); \ +} \ +a_attr void \ +a_name##_tsd_set(a_type *val) \ +{ \ + a_name##_tsd_wrapper_t *wrapper; \ + \ + assert(a_name##_booted); \ + wrapper = a_name##_tsd_get_wrapper(); \ + wrapper->val = *(val); \ + if (a_cleanup != malloc_tsd_no_cleanup) \ + wrapper->initialized = true; \ +} #else #define malloc_tsd_funcs(a_attr, a_name, a_type, a_initializer, \ a_cleanup) \ diff --git a/contrib/jemalloc/include/jemalloc/internal/util.h b/contrib/jemalloc/include/jemalloc/internal/util.h index d360ae3f5a8..8479693631a 100644 --- a/contrib/jemalloc/include/jemalloc/internal/util.h +++ b/contrib/jemalloc/include/jemalloc/internal/util.h @@ -82,10 +82,9 @@ /******************************************************************************/ #ifdef JEMALLOC_H_EXTERNS -extern void (*je_malloc_message)(void *wcbopaque, const char *s); - -int buferror(int errnum, char *buf, size_t buflen); +int buferror(char *buf, size_t buflen); uintmax_t malloc_strtoumax(const char *nptr, char **endptr, int base); +void malloc_write(const char *s); /* * malloc_vsnprintf() supports a subset of snprintf(3) that avoids floating @@ -109,6 +108,8 @@ void malloc_printf(const char *format, ...) #ifndef JEMALLOC_ENABLE_INLINE size_t pow2_ceil(size_t x); void malloc_write(const char *s); +void set_errno(int errnum); +int get_errno(void); #endif #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_UTIL_C_)) @@ -130,15 +131,28 @@ pow2_ceil(size_t x) return (x); } -/* - * Wrapper around malloc_message() that avoids the need for - * je_malloc_message(...) throughout the code. - */ +/* Sets error code */ JEMALLOC_INLINE void -malloc_write(const char *s) +set_errno(int errnum) { - je_malloc_message(NULL, s); +#ifdef _WIN32 + SetLastError(errnum); +#else + errno = errnum; +#endif +} + +/* Get last error code */ +JEMALLOC_INLINE int +get_errno(void) +{ + +#ifdef _WIN32 + return (GetLastError()); +#else + return (errno); +#endif } #endif diff --git a/contrib/jemalloc/include/jemalloc/jemalloc.h b/contrib/jemalloc/include/jemalloc/jemalloc.h index 6322d9773c1..65440b36bb3 100644 --- a/contrib/jemalloc/include/jemalloc/jemalloc.h +++ b/contrib/jemalloc/include/jemalloc/jemalloc.h @@ -7,12 +7,12 @@ extern "C" { #include #include -#define JEMALLOC_VERSION "1.0.0-286-ga8f8d7540d66ddee7337db80c92890916e1063ca" -#define JEMALLOC_VERSION_MAJOR 1 +#define JEMALLOC_VERSION "3.0.0-0-gfc9b1dbf69f59d7ecfc4ac68da9847e017e1d046" +#define JEMALLOC_VERSION_MAJOR 3 #define JEMALLOC_VERSION_MINOR 0 #define JEMALLOC_VERSION_BUGFIX 0 -#define JEMALLOC_VERSION_NREV 286 -#define JEMALLOC_VERSION_GID "a8f8d7540d66ddee7337db80c92890916e1063ca" +#define JEMALLOC_VERSION_NREV 0 +#define JEMALLOC_VERSION_GID "fc9b1dbf69f59d7ecfc4ac68da9847e017e1d046" #include "jemalloc_defs.h" #include "jemalloc_FreeBSD.h" @@ -37,35 +37,49 @@ extern "C" { * namespace management, and should be omitted in application code unless * JEMALLOC_NO_DEMANGLE is defined (see below). */ -extern const char *je_malloc_conf; -extern void (*je_malloc_message)(void *, const char *); +extern JEMALLOC_EXPORT const char *je_malloc_conf; +extern JEMALLOC_EXPORT void (*je_malloc_message)(void *cbopaque, + const char *s); -void *je_malloc(size_t size) JEMALLOC_ATTR(malloc); -void *je_calloc(size_t num, size_t size) JEMALLOC_ATTR(malloc); -int je_posix_memalign(void **memptr, size_t alignment, size_t size) - JEMALLOC_ATTR(nonnull(1)); -void *je_aligned_alloc(size_t alignment, size_t size) JEMALLOC_ATTR(malloc); -void *je_realloc(void *ptr, size_t size); -void je_free(void *ptr); +JEMALLOC_EXPORT void *je_malloc(size_t size) JEMALLOC_ATTR(malloc); +JEMALLOC_EXPORT void *je_calloc(size_t num, size_t size) + JEMALLOC_ATTR(malloc); +JEMALLOC_EXPORT int je_posix_memalign(void **memptr, size_t alignment, + size_t size) JEMALLOC_ATTR(nonnull(1)); +JEMALLOC_EXPORT void *je_aligned_alloc(size_t alignment, size_t size) + JEMALLOC_ATTR(malloc); +JEMALLOC_EXPORT void *je_realloc(void *ptr, size_t size); +JEMALLOC_EXPORT void je_free(void *ptr); -size_t je_malloc_usable_size(const void *ptr); -void je_malloc_stats_print(void (*write_cb)(void *, const char *), - void *je_cbopaque, const char *opts); -int je_mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, - size_t newlen); -int je_mallctlnametomib(const char *name, size_t *mibp, size_t *miblenp); -int je_mallctlbymib(const size_t *mib, size_t miblen, void *oldp, +#ifdef JEMALLOC_OVERRIDE_MEMALIGN +JEMALLOC_EXPORT void * je_memalign(size_t alignment, size_t size) + JEMALLOC_ATTR(malloc); +#endif + +#ifdef JEMALLOC_OVERRIDE_VALLOC +JEMALLOC_EXPORT void * je_valloc(size_t size) JEMALLOC_ATTR(malloc); +#endif + +JEMALLOC_EXPORT size_t je_malloc_usable_size(const void *ptr); +JEMALLOC_EXPORT void je_malloc_stats_print(void (*write_cb)(void *, + const char *), void *je_cbopaque, const char *opts); +JEMALLOC_EXPORT int je_mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen); +JEMALLOC_EXPORT int je_mallctlnametomib(const char *name, size_t *mibp, + size_t *miblenp); +JEMALLOC_EXPORT int je_mallctlbymib(const size_t *mib, size_t miblen, + void *oldp, size_t *oldlenp, void *newp, size_t newlen); #ifdef JEMALLOC_EXPERIMENTAL -int je_allocm(void **ptr, size_t *rsize, size_t size, int flags) - JEMALLOC_ATTR(nonnull(1)); -int je_rallocm(void **ptr, size_t *rsize, size_t size, size_t extra, +JEMALLOC_EXPORT int je_allocm(void **ptr, size_t *rsize, size_t size, int flags) JEMALLOC_ATTR(nonnull(1)); -int je_sallocm(const void *ptr, size_t *rsize, int flags) +JEMALLOC_EXPORT int je_rallocm(void **ptr, size_t *rsize, size_t size, + size_t extra, int flags) JEMALLOC_ATTR(nonnull(1)); +JEMALLOC_EXPORT int je_sallocm(const void *ptr, size_t *rsize, int flags) JEMALLOC_ATTR(nonnull(1)); -int je_dallocm(void *ptr, int flags) JEMALLOC_ATTR(nonnull(1)); -int je_nallocm(size_t *rsize, size_t size, int flags); +JEMALLOC_EXPORT int je_dallocm(void *ptr, int flags) + JEMALLOC_ATTR(nonnull(1)); +JEMALLOC_EXPORT int je_nallocm(size_t *rsize, size_t size, int flags); #endif /* diff --git a/contrib/jemalloc/include/jemalloc/jemalloc_defs.h b/contrib/jemalloc/include/jemalloc/jemalloc_defs.h index 7ef7dcfbed2..85571b9a659 100644 --- a/contrib/jemalloc/include/jemalloc/jemalloc_defs.h +++ b/contrib/jemalloc/include/jemalloc/jemalloc_defs.h @@ -105,11 +105,27 @@ /* Defined if __attribute__((...)) syntax is supported. */ #define JEMALLOC_HAVE_ATTR #ifdef JEMALLOC_HAVE_ATTR -# define JEMALLOC_CATTR(s, a) __attribute__((s)) -# define JEMALLOC_ATTR(s) JEMALLOC_CATTR(s,) +# define JEMALLOC_ATTR(s) __attribute__((s)) +# define JEMALLOC_EXPORT JEMALLOC_ATTR(visibility("default")) +# define JEMALLOC_ALIGNED(s) JEMALLOC_ATTR(aligned(s)) +# define JEMALLOC_SECTION(s) JEMALLOC_ATTR(section(s)) +# define JEMALLOC_NOINLINE JEMALLOC_ATTR(noinline) +#elif _MSC_VER +# define JEMALLOC_ATTR(s) +# ifdef DLLEXPORT +# define JEMALLOC_EXPORT __declspec(dllexport) +# else +# define JEMALLOC_EXPORT __declspec(dllimport) +# endif +# define JEMALLOC_ALIGNED(s) __declspec(align(s)) +# define JEMALLOC_SECTION(s) __declspec(allocate(s)) +# define JEMALLOC_NOINLINE __declspec(noinline) #else -# define JEMALLOC_CATTR(s, a) a -# define JEMALLOC_ATTR(s) JEMALLOC_CATTR(s,) +# define JEMALLOC_ATTR(s) +# define JEMALLOC_EXPORT +# define JEMALLOC_ALIGNED(s) +# define JEMALLOC_SECTION(s) +# define JEMALLOC_NOINLINE #endif /* Defined if sbrk() is supported. */ @@ -178,12 +194,18 @@ /* * If defined, use munmap() to unmap freed chunks, rather than storing them for - * later reuse. This is automatically disabled if configuration determines - * that common sequences of mmap()/munmap() calls will cause virtual memory map - * holes. + * later reuse. This is disabled by default on Linux because common sequences + * of mmap()/munmap() calls will cause virtual memory map holes. */ #define JEMALLOC_MUNMAP +/* + * If defined, use mremap(...MREMAP_FIXED...) for huge realloc(). This is + * disabled by default because it is Linux-specific and it will cause virtual + * memory map holes, much like munmap(2) does. + */ +/* #undef JEMALLOC_MREMAP */ + /* TLS is used to map arenas and magazine caches to threads. */ #define JEMALLOC_TLS @@ -206,9 +228,6 @@ /* #undef JEMALLOC_ZONE */ /* #undef JEMALLOC_ZONE_VERSION */ -/* If defined, use mremap(...MREMAP_FIXED...) for huge realloc(). */ -/* #undef JEMALLOC_MREMAP_FIXED */ - /* * Methods for purging unused pages differ between operating systems. * diff --git a/contrib/jemalloc/src/arena.c b/contrib/jemalloc/src/arena.c index 6f28abe94d4..2a6150f3e8d 100644 --- a/contrib/jemalloc/src/arena.c +++ b/contrib/jemalloc/src/arena.c @@ -7,7 +7,7 @@ ssize_t opt_lg_dirty_mult = LG_DIRTY_MULT_DEFAULT; arena_bin_info_t arena_bin_info[NBINS]; -JEMALLOC_ATTR(aligned(CACHELINE)) +JEMALLOC_ALIGNED(CACHELINE) const uint8_t small_size2bin[] = { #define S2B_8(i) i, #define S2B_16(i) S2B_8(i) S2B_8(i) @@ -41,11 +41,13 @@ const uint8_t small_size2bin[] = { /* Function prototypes for non-inline static functions. */ static void arena_run_split(arena_t *arena, arena_run_t *run, size_t size, - bool large, bool zero); + bool large, size_t binind, bool zero); static arena_chunk_t *arena_chunk_alloc(arena_t *arena); static void arena_chunk_dealloc(arena_t *arena, arena_chunk_t *chunk); +static arena_run_t *arena_run_alloc_helper(arena_t *arena, size_t size, + bool large, size_t binind, bool zero); static arena_run_t *arena_run_alloc(arena_t *arena, size_t size, bool large, - bool zero); + size_t binind, bool zero); static void arena_purge(arena_t *arena, bool all); static void arena_run_dalloc(arena_t *arena, arena_run_t *run, bool dirty); static void arena_run_trim_head(arena_t *arena, arena_chunk_t *chunk, @@ -152,7 +154,9 @@ static inline void arena_run_reg_dalloc(arena_run_t *run, void *ptr) { arena_chunk_t *chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(run); - size_t binind = arena_bin_index(chunk->arena, run->bin); + size_t pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE; + size_t mapbits = arena_mapbits_get(chunk, pageind); + size_t binind = arena_ptr_small_binind_get(ptr, mapbits); arena_bin_info_t *bin_info = &arena_bin_info[binind]; unsigned regind = arena_run_regind(run, bin_info, ptr); bitmap_t *bitmap = (bitmap_t *)((uintptr_t)run + @@ -184,28 +188,31 @@ arena_chunk_validate_zeroed(arena_chunk_t *chunk, size_t run_ind) static void arena_run_split(arena_t *arena, arena_run_t *run, size_t size, bool large, - bool zero) + size_t binind, bool zero) { arena_chunk_t *chunk; size_t run_ind, total_pages, need_pages, rem_pages, i; size_t flag_dirty; arena_avail_tree_t *runs_avail; + assert((large && binind == BININD_INVALID) || (large == false && binind + != BININD_INVALID)); + chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(run); run_ind = (unsigned)(((uintptr_t)run - (uintptr_t)chunk) >> LG_PAGE); - flag_dirty = chunk->map[run_ind-map_bias].bits & CHUNK_MAP_DIRTY; + flag_dirty = arena_mapbits_dirty_get(chunk, run_ind); runs_avail = (flag_dirty != 0) ? &arena->runs_avail_dirty : &arena->runs_avail_clean; - total_pages = (chunk->map[run_ind-map_bias].bits & ~PAGE_MASK) >> + total_pages = arena_mapbits_unallocated_size_get(chunk, run_ind) >> LG_PAGE; - assert((chunk->map[run_ind+total_pages-1-map_bias].bits & - CHUNK_MAP_DIRTY) == flag_dirty); + assert(arena_mapbits_dirty_get(chunk, run_ind+total_pages-1) == + flag_dirty); need_pages = (size >> LG_PAGE); assert(need_pages > 0); assert(need_pages <= total_pages); rem_pages = total_pages - need_pages; - arena_avail_tree_remove(runs_avail, &chunk->map[run_ind-map_bias]); + arena_avail_tree_remove(runs_avail, arena_mapp_get(chunk, run_ind)); if (config_stats) { /* * Update stats_cactive if nactive is crossing a chunk @@ -222,22 +229,23 @@ arena_run_split(arena_t *arena, arena_run_t *run, size_t size, bool large, /* Keep track of trailing unused pages for later use. */ if (rem_pages > 0) { if (flag_dirty != 0) { - chunk->map[run_ind+need_pages-map_bias].bits = - (rem_pages << LG_PAGE) | CHUNK_MAP_DIRTY; - chunk->map[run_ind+total_pages-1-map_bias].bits = - (rem_pages << LG_PAGE) | CHUNK_MAP_DIRTY; + arena_mapbits_unallocated_set(chunk, run_ind+need_pages, + (rem_pages << LG_PAGE), CHUNK_MAP_DIRTY); + arena_mapbits_unallocated_set(chunk, + run_ind+total_pages-1, (rem_pages << LG_PAGE), + CHUNK_MAP_DIRTY); } else { - chunk->map[run_ind+need_pages-map_bias].bits = - (rem_pages << LG_PAGE) | - (chunk->map[run_ind+need_pages-map_bias].bits & - CHUNK_MAP_UNZEROED); - chunk->map[run_ind+total_pages-1-map_bias].bits = - (rem_pages << LG_PAGE) | - (chunk->map[run_ind+total_pages-1-map_bias].bits & - CHUNK_MAP_UNZEROED); + arena_mapbits_unallocated_set(chunk, run_ind+need_pages, + (rem_pages << LG_PAGE), + arena_mapbits_unzeroed_get(chunk, + run_ind+need_pages)); + arena_mapbits_unallocated_set(chunk, + run_ind+total_pages-1, (rem_pages << LG_PAGE), + arena_mapbits_unzeroed_get(chunk, + run_ind+total_pages-1)); } - arena_avail_tree_insert(runs_avail, - &chunk->map[run_ind+need_pages-map_bias]); + arena_avail_tree_insert(runs_avail, arena_mapp_get(chunk, + run_ind+need_pages)); } /* Update dirty page accounting. */ @@ -258,8 +266,8 @@ arena_run_split(arena_t *arena, arena_run_t *run, size_t size, bool large, * zeroed (i.e. never before touched). */ for (i = 0; i < need_pages; i++) { - if ((chunk->map[run_ind+i-map_bias].bits - & CHUNK_MAP_UNZEROED) != 0) { + if (arena_mapbits_unzeroed_get(chunk, + run_ind+i) != 0) { VALGRIND_MAKE_MEM_UNDEFINED( (void *)((uintptr_t) chunk + ((run_ind+i) << @@ -293,10 +301,9 @@ arena_run_split(arena_t *arena, arena_run_t *run, size_t size, bool large, * Set the last element first, in case the run only contains one * page (i.e. both statements set the same element). */ - chunk->map[run_ind+need_pages-1-map_bias].bits = - CHUNK_MAP_LARGE | CHUNK_MAP_ALLOCATED | flag_dirty; - chunk->map[run_ind-map_bias].bits = size | flag_dirty | - CHUNK_MAP_LARGE | CHUNK_MAP_ALLOCATED; + arena_mapbits_large_set(chunk, run_ind+need_pages-1, 0, + flag_dirty); + arena_mapbits_large_set(chunk, run_ind, size, flag_dirty); } else { assert(zero == false); /* @@ -304,34 +311,26 @@ arena_run_split(arena_t *arena, arena_run_t *run, size_t size, bool large, * small run, so that arena_dalloc_bin_run() has the ability to * conditionally trim clean pages. */ - chunk->map[run_ind-map_bias].bits = - (chunk->map[run_ind-map_bias].bits & CHUNK_MAP_UNZEROED) | - CHUNK_MAP_ALLOCATED | flag_dirty; + arena_mapbits_small_set(chunk, run_ind, 0, binind, flag_dirty); /* * The first page will always be dirtied during small run * initialization, so a validation failure here would not * actually cause an observable failure. */ if (config_debug && flag_dirty == 0 && - (chunk->map[run_ind-map_bias].bits & CHUNK_MAP_UNZEROED) - == 0) + arena_mapbits_unzeroed_get(chunk, run_ind) == 0) arena_chunk_validate_zeroed(chunk, run_ind); for (i = 1; i < need_pages - 1; i++) { - chunk->map[run_ind+i-map_bias].bits = (i << LG_PAGE) - | (chunk->map[run_ind+i-map_bias].bits & - CHUNK_MAP_UNZEROED) | CHUNK_MAP_ALLOCATED; + arena_mapbits_small_set(chunk, run_ind+i, i, binind, 0); if (config_debug && flag_dirty == 0 && - (chunk->map[run_ind+i-map_bias].bits & - CHUNK_MAP_UNZEROED) == 0) + arena_mapbits_unzeroed_get(chunk, run_ind+i) == 0) arena_chunk_validate_zeroed(chunk, run_ind+i); } - chunk->map[run_ind+need_pages-1-map_bias].bits = ((need_pages - - 1) << LG_PAGE) | - (chunk->map[run_ind+need_pages-1-map_bias].bits & - CHUNK_MAP_UNZEROED) | CHUNK_MAP_ALLOCATED | flag_dirty; + arena_mapbits_small_set(chunk, run_ind+need_pages-1, + need_pages-1, binind, flag_dirty); if (config_debug && flag_dirty == 0 && - (chunk->map[run_ind+need_pages-1-map_bias].bits & - CHUNK_MAP_UNZEROED) == 0) { + arena_mapbits_unzeroed_get(chunk, run_ind+need_pages-1) == + 0) { arena_chunk_validate_zeroed(chunk, run_ind+need_pages-1); } @@ -350,18 +349,22 @@ arena_chunk_alloc(arena_t *arena) chunk = arena->spare; arena->spare = NULL; + assert(arena_mapbits_allocated_get(chunk, map_bias) == 0); + assert(arena_mapbits_allocated_get(chunk, chunk_npages-1) == 0); + assert(arena_mapbits_unallocated_size_get(chunk, map_bias) == + arena_maxclass); + assert(arena_mapbits_unallocated_size_get(chunk, + chunk_npages-1) == arena_maxclass); + assert(arena_mapbits_dirty_get(chunk, map_bias) == + arena_mapbits_dirty_get(chunk, chunk_npages-1)); + /* Insert the run into the appropriate runs_avail_* tree. */ - if ((chunk->map[0].bits & CHUNK_MAP_DIRTY) == 0) + if (arena_mapbits_dirty_get(chunk, map_bias) == 0) runs_avail = &arena->runs_avail_clean; else runs_avail = &arena->runs_avail_dirty; - assert((chunk->map[0].bits & ~PAGE_MASK) == arena_maxclass); - assert((chunk->map[chunk_npages-1-map_bias].bits & ~PAGE_MASK) - == arena_maxclass); - assert((chunk->map[0].bits & CHUNK_MAP_DIRTY) == - (chunk->map[chunk_npages-1-map_bias].bits & - CHUNK_MAP_DIRTY)); - arena_avail_tree_insert(runs_avail, &chunk->map[0]); + arena_avail_tree_insert(runs_avail, arena_mapp_get(chunk, + map_bias)); } else { bool zero; size_t unzeroed; @@ -392,24 +395,27 @@ arena_chunk_alloc(arena_t *arena) * chunk. */ unzeroed = zero ? 0 : CHUNK_MAP_UNZEROED; - chunk->map[0].bits = arena_maxclass | unzeroed; + arena_mapbits_unallocated_set(chunk, map_bias, arena_maxclass, + unzeroed); /* * There is no need to initialize the internal page map entries * unless the chunk is not zeroed. */ if (zero == false) { for (i = map_bias+1; i < chunk_npages-1; i++) - chunk->map[i-map_bias].bits = unzeroed; + arena_mapbits_unzeroed_set(chunk, i, unzeroed); } else if (config_debug) { - for (i = map_bias+1; i < chunk_npages-1; i++) - assert(chunk->map[i-map_bias].bits == unzeroed); + for (i = map_bias+1; i < chunk_npages-1; i++) { + assert(arena_mapbits_unzeroed_get(chunk, i) == + unzeroed); + } } - chunk->map[chunk_npages-1-map_bias].bits = arena_maxclass | - unzeroed; + arena_mapbits_unallocated_set(chunk, chunk_npages-1, + arena_maxclass, unzeroed); /* Insert the run into the runs_avail_clean tree. */ arena_avail_tree_insert(&arena->runs_avail_clean, - &chunk->map[0]); + arena_mapp_get(chunk, map_bias)); } return (chunk); @@ -420,15 +426,24 @@ arena_chunk_dealloc(arena_t *arena, arena_chunk_t *chunk) { arena_avail_tree_t *runs_avail; + assert(arena_mapbits_allocated_get(chunk, map_bias) == 0); + assert(arena_mapbits_allocated_get(chunk, chunk_npages-1) == 0); + assert(arena_mapbits_unallocated_size_get(chunk, map_bias) == + arena_maxclass); + assert(arena_mapbits_unallocated_size_get(chunk, chunk_npages-1) == + arena_maxclass); + assert(arena_mapbits_dirty_get(chunk, map_bias) == + arena_mapbits_dirty_get(chunk, chunk_npages-1)); + /* * Remove run from the appropriate runs_avail_* tree, so that the arena * does not use it. */ - if ((chunk->map[0].bits & CHUNK_MAP_DIRTY) == 0) + if (arena_mapbits_dirty_get(chunk, map_bias) == 0) runs_avail = &arena->runs_avail_clean; else runs_avail = &arena->runs_avail_dirty; - arena_avail_tree_remove(runs_avail, &chunk->map[0]); + arena_avail_tree_remove(runs_avail, arena_mapp_get(chunk, map_bias)); if (arena->spare != NULL) { arena_chunk_t *spare = arena->spare; @@ -449,16 +464,12 @@ arena_chunk_dealloc(arena_t *arena, arena_chunk_t *chunk) } static arena_run_t * -arena_run_alloc(arena_t *arena, size_t size, bool large, bool zero) +arena_run_alloc_helper(arena_t *arena, size_t size, bool large, size_t binind, + bool zero) { - arena_chunk_t *chunk; arena_run_t *run; arena_chunk_map_t *mapelm, key; - assert(size <= arena_maxclass); - assert((size & PAGE_MASK) == 0); - - /* Search the arena's chunks for the lowest best fit. */ key.bits = size | CHUNK_MAP_KEY; mapelm = arena_avail_tree_nsearch(&arena->runs_avail_dirty, &key); if (mapelm != NULL) { @@ -469,7 +480,7 @@ arena_run_alloc(arena_t *arena, size_t size, bool large, bool zero) run = (arena_run_t *)((uintptr_t)run_chunk + (pageind << LG_PAGE)); - arena_run_split(arena, run, size, large, zero); + arena_run_split(arena, run, size, large, binind, zero); return (run); } mapelm = arena_avail_tree_nsearch(&arena->runs_avail_clean, &key); @@ -481,17 +492,37 @@ arena_run_alloc(arena_t *arena, size_t size, bool large, bool zero) run = (arena_run_t *)((uintptr_t)run_chunk + (pageind << LG_PAGE)); - arena_run_split(arena, run, size, large, zero); + arena_run_split(arena, run, size, large, binind, zero); return (run); } + return (NULL); +} + +static arena_run_t * +arena_run_alloc(arena_t *arena, size_t size, bool large, size_t binind, + bool zero) +{ + arena_chunk_t *chunk; + arena_run_t *run; + + assert(size <= arena_maxclass); + assert((size & PAGE_MASK) == 0); + assert((large && binind == BININD_INVALID) || (large == false && binind + != BININD_INVALID)); + + /* Search the arena's chunks for the lowest best fit. */ + run = arena_run_alloc_helper(arena, size, large, binind, zero); + if (run != NULL) + return (run); + /* * No usable runs. Create a new chunk from which to allocate the run. */ chunk = arena_chunk_alloc(arena); if (chunk != NULL) { run = (arena_run_t *)((uintptr_t)chunk + (map_bias << LG_PAGE)); - arena_run_split(arena, run, size, large, zero); + arena_run_split(arena, run, size, large, binind, zero); return (run); } @@ -500,32 +531,7 @@ arena_run_alloc(arena_t *arena, size_t size, bool large, bool zero) * sufficient memory available while this one dropped arena->lock in * arena_chunk_alloc(), so search one more time. */ - mapelm = arena_avail_tree_nsearch(&arena->runs_avail_dirty, &key); - if (mapelm != NULL) { - arena_chunk_t *run_chunk = CHUNK_ADDR2BASE(mapelm); - size_t pageind = (((uintptr_t)mapelm - - (uintptr_t)run_chunk->map) / sizeof(arena_chunk_map_t)) - + map_bias; - - run = (arena_run_t *)((uintptr_t)run_chunk + (pageind << - LG_PAGE)); - arena_run_split(arena, run, size, large, zero); - return (run); - } - mapelm = arena_avail_tree_nsearch(&arena->runs_avail_clean, &key); - if (mapelm != NULL) { - arena_chunk_t *run_chunk = CHUNK_ADDR2BASE(mapelm); - size_t pageind = (((uintptr_t)mapelm - - (uintptr_t)run_chunk->map) / sizeof(arena_chunk_map_t)) - + map_bias; - - run = (arena_run_t *)((uintptr_t)run_chunk + (pageind << - LG_PAGE)); - arena_run_split(arena, run, size, large, zero); - return (run); - } - - return (NULL); + return (arena_run_alloc_helper(arena, size, large, binind, zero)); } static inline void @@ -579,40 +585,46 @@ arena_chunk_purge(arena_t *arena, arena_chunk_t *chunk) * run. */ if (chunk == arena->spare) { - assert((chunk->map[0].bits & CHUNK_MAP_DIRTY) != 0); + assert(arena_mapbits_dirty_get(chunk, map_bias) != 0); + assert(arena_mapbits_dirty_get(chunk, chunk_npages-1) != 0); + arena_chunk_alloc(arena); } /* Temporarily allocate all free dirty runs within chunk. */ for (pageind = map_bias; pageind < chunk_npages;) { - mapelm = &chunk->map[pageind-map_bias]; - if ((mapelm->bits & CHUNK_MAP_ALLOCATED) == 0) { + mapelm = arena_mapp_get(chunk, pageind); + if (arena_mapbits_allocated_get(chunk, pageind) == 0) { size_t npages; - npages = mapelm->bits >> LG_PAGE; + npages = arena_mapbits_unallocated_size_get(chunk, + pageind) >> LG_PAGE; assert(pageind + npages <= chunk_npages); - if (mapelm->bits & CHUNK_MAP_DIRTY) { + assert(arena_mapbits_dirty_get(chunk, pageind) == + arena_mapbits_dirty_get(chunk, pageind+npages-1)); + if (arena_mapbits_dirty_get(chunk, pageind) != 0) { size_t i; arena_avail_tree_remove( &arena->runs_avail_dirty, mapelm); - mapelm->bits = (npages << LG_PAGE) | - flag_unzeroed | CHUNK_MAP_LARGE | - CHUNK_MAP_ALLOCATED; + arena_mapbits_unzeroed_set(chunk, pageind, + flag_unzeroed); + arena_mapbits_large_set(chunk, pageind, + (npages << LG_PAGE), 0); /* * Update internal elements in the page map, so * that CHUNK_MAP_UNZEROED is properly set. */ for (i = 1; i < npages - 1; i++) { - chunk->map[pageind+i-map_bias].bits = - flag_unzeroed; + arena_mapbits_unzeroed_set(chunk, + pageind+i, flag_unzeroed); } if (npages > 1) { - chunk->map[ - pageind+npages-1-map_bias].bits = - flag_unzeroed | CHUNK_MAP_LARGE | - CHUNK_MAP_ALLOCATED; + arena_mapbits_unzeroed_set(chunk, + pageind+npages-1, flag_unzeroed); + arena_mapbits_large_set(chunk, + pageind+npages-1, 0, 0); } if (config_stats) { @@ -637,17 +649,19 @@ arena_chunk_purge(arena_t *arena, arena_chunk_t *chunk) pageind += npages; } else { /* Skip allocated run. */ - if (mapelm->bits & CHUNK_MAP_LARGE) - pageind += mapelm->bits >> LG_PAGE; + if (arena_mapbits_large_get(chunk, pageind)) + pageind += arena_mapbits_large_size_get(chunk, + pageind) >> LG_PAGE; else { + size_t binind; + arena_bin_info_t *bin_info; arena_run_t *run = (arena_run_t *)((uintptr_t) chunk + (uintptr_t)(pageind << LG_PAGE)); - assert((mapelm->bits >> LG_PAGE) == 0); - size_t binind = arena_bin_index(arena, - run->bin); - arena_bin_info_t *bin_info = - &arena_bin_info[binind]; + assert(arena_mapbits_small_runind_get(chunk, + pageind) == 0); + binind = arena_bin_index(arena, run->bin); + bin_info = &arena_bin_info[binind]; pageind += bin_info->run_size >> LG_PAGE; } } @@ -669,7 +683,8 @@ arena_chunk_purge(arena_t *arena, arena_chunk_t *chunk) ql_foreach(mapelm, &mapelms, u.ql_link) { size_t pageind = (((uintptr_t)mapelm - (uintptr_t)chunk->map) / sizeof(arena_chunk_map_t)) + map_bias; - size_t npages = mapelm->bits >> LG_PAGE; + size_t npages = arena_mapbits_large_size_get(chunk, pageind) >> + LG_PAGE; assert(pageind + npages <= chunk_npages); assert(ndirty >= npages); @@ -806,15 +821,11 @@ arena_run_dalloc(arena_t *arena, arena_run_t *run, bool dirty) run_ind = (size_t)(((uintptr_t)run - (uintptr_t)chunk) >> LG_PAGE); assert(run_ind >= map_bias); assert(run_ind < chunk_npages); - if ((chunk->map[run_ind-map_bias].bits & CHUNK_MAP_LARGE) != 0) { - size = chunk->map[run_ind-map_bias].bits & ~PAGE_MASK; + if (arena_mapbits_large_get(chunk, run_ind) != 0) { + size = arena_mapbits_large_size_get(chunk, run_ind); assert(size == PAGE || - (chunk->map[run_ind+(size>>LG_PAGE)-1-map_bias].bits & - ~PAGE_MASK) == 0); - assert((chunk->map[run_ind+(size>>LG_PAGE)-1-map_bias].bits & - CHUNK_MAP_LARGE) != 0); - assert((chunk->map[run_ind+(size>>LG_PAGE)-1-map_bias].bits & - CHUNK_MAP_ALLOCATED) != 0); + arena_mapbits_large_size_get(chunk, + run_ind+(size>>LG_PAGE)-1) == 0); } else { size_t binind = arena_bin_index(arena, run->bin); arena_bin_info_t *bin_info = &arena_bin_info[binind]; @@ -837,7 +848,9 @@ arena_run_dalloc(arena_t *arena, arena_run_t *run, bool dirty) * The run is dirty if the caller claims to have dirtied it, as well as * if it was already dirty before being allocated. */ - if ((chunk->map[run_ind-map_bias].bits & CHUNK_MAP_DIRTY) != 0) + assert(arena_mapbits_dirty_get(chunk, run_ind) == + arena_mapbits_dirty_get(chunk, run_ind+run_pages-1)); + if (arena_mapbits_dirty_get(chunk, run_ind) != 0) dirty = true; flag_dirty = dirty ? CHUNK_MAP_DIRTY : 0; runs_avail = dirty ? &arena->runs_avail_dirty : @@ -845,58 +858,52 @@ arena_run_dalloc(arena_t *arena, arena_run_t *run, bool dirty) /* Mark pages as unallocated in the chunk map. */ if (dirty) { - chunk->map[run_ind-map_bias].bits = size | CHUNK_MAP_DIRTY; - chunk->map[run_ind+run_pages-1-map_bias].bits = size | - CHUNK_MAP_DIRTY; + arena_mapbits_unallocated_set(chunk, run_ind, size, + CHUNK_MAP_DIRTY); + arena_mapbits_unallocated_set(chunk, run_ind+run_pages-1, size, + CHUNK_MAP_DIRTY); chunk->ndirty += run_pages; arena->ndirty += run_pages; } else { - chunk->map[run_ind-map_bias].bits = size | - (chunk->map[run_ind-map_bias].bits & CHUNK_MAP_UNZEROED); - chunk->map[run_ind+run_pages-1-map_bias].bits = size | - (chunk->map[run_ind+run_pages-1-map_bias].bits & - CHUNK_MAP_UNZEROED); + arena_mapbits_unallocated_set(chunk, run_ind, size, + arena_mapbits_unzeroed_get(chunk, run_ind)); + arena_mapbits_unallocated_set(chunk, run_ind+run_pages-1, size, + arena_mapbits_unzeroed_get(chunk, run_ind+run_pages-1)); } /* Try to coalesce forward. */ if (run_ind + run_pages < chunk_npages && - (chunk->map[run_ind+run_pages-map_bias].bits & CHUNK_MAP_ALLOCATED) - == 0 && (chunk->map[run_ind+run_pages-map_bias].bits & - CHUNK_MAP_DIRTY) == flag_dirty) { - size_t nrun_size = chunk->map[run_ind+run_pages-map_bias].bits & - ~PAGE_MASK; + arena_mapbits_allocated_get(chunk, run_ind+run_pages) == 0 && + arena_mapbits_dirty_get(chunk, run_ind+run_pages) == flag_dirty) { + size_t nrun_size = arena_mapbits_unallocated_size_get(chunk, + run_ind+run_pages); size_t nrun_pages = nrun_size >> LG_PAGE; /* * Remove successor from runs_avail; the coalesced run is * inserted later. */ - assert((chunk->map[run_ind+run_pages+nrun_pages-1-map_bias].bits - & ~PAGE_MASK) == nrun_size); - assert((chunk->map[run_ind+run_pages+nrun_pages-1-map_bias].bits - & CHUNK_MAP_ALLOCATED) == 0); - assert((chunk->map[run_ind+run_pages+nrun_pages-1-map_bias].bits - & CHUNK_MAP_DIRTY) == flag_dirty); + assert(arena_mapbits_unallocated_size_get(chunk, + run_ind+run_pages+nrun_pages-1) == nrun_size); + assert(arena_mapbits_dirty_get(chunk, + run_ind+run_pages+nrun_pages-1) == flag_dirty); arena_avail_tree_remove(runs_avail, - &chunk->map[run_ind+run_pages-map_bias]); + arena_mapp_get(chunk, run_ind+run_pages)); size += nrun_size; run_pages += nrun_pages; - chunk->map[run_ind-map_bias].bits = size | - (chunk->map[run_ind-map_bias].bits & CHUNK_MAP_FLAGS_MASK); - chunk->map[run_ind+run_pages-1-map_bias].bits = size | - (chunk->map[run_ind+run_pages-1-map_bias].bits & - CHUNK_MAP_FLAGS_MASK); + arena_mapbits_unallocated_size_set(chunk, run_ind, size); + arena_mapbits_unallocated_size_set(chunk, run_ind+run_pages-1, + size); } /* Try to coalesce backward. */ - if (run_ind > map_bias && (chunk->map[run_ind-1-map_bias].bits & - CHUNK_MAP_ALLOCATED) == 0 && (chunk->map[run_ind-1-map_bias].bits & - CHUNK_MAP_DIRTY) == flag_dirty) { - size_t prun_size = chunk->map[run_ind-1-map_bias].bits & - ~PAGE_MASK; + if (run_ind > map_bias && arena_mapbits_allocated_get(chunk, run_ind-1) + == 0 && arena_mapbits_dirty_get(chunk, run_ind-1) == flag_dirty) { + size_t prun_size = arena_mapbits_unallocated_size_get(chunk, + run_ind-1); size_t prun_pages = prun_size >> LG_PAGE; run_ind -= prun_pages; @@ -905,31 +912,26 @@ arena_run_dalloc(arena_t *arena, arena_run_t *run, bool dirty) * Remove predecessor from runs_avail; the coalesced run is * inserted later. */ - assert((chunk->map[run_ind-map_bias].bits & ~PAGE_MASK) - == prun_size); - assert((chunk->map[run_ind-map_bias].bits & CHUNK_MAP_ALLOCATED) - == 0); - assert((chunk->map[run_ind-map_bias].bits & CHUNK_MAP_DIRTY) - == flag_dirty); - arena_avail_tree_remove(runs_avail, - &chunk->map[run_ind-map_bias]); + assert(arena_mapbits_unallocated_size_get(chunk, run_ind) == + prun_size); + assert(arena_mapbits_dirty_get(chunk, run_ind) == flag_dirty); + arena_avail_tree_remove(runs_avail, arena_mapp_get(chunk, + run_ind)); size += prun_size; run_pages += prun_pages; - chunk->map[run_ind-map_bias].bits = size | - (chunk->map[run_ind-map_bias].bits & CHUNK_MAP_FLAGS_MASK); - chunk->map[run_ind+run_pages-1-map_bias].bits = size | - (chunk->map[run_ind+run_pages-1-map_bias].bits & - CHUNK_MAP_FLAGS_MASK); + arena_mapbits_unallocated_size_set(chunk, run_ind, size); + arena_mapbits_unallocated_size_set(chunk, run_ind+run_pages-1, + size); } /* Insert into runs_avail, now that coalescing is complete. */ - assert((chunk->map[run_ind-map_bias].bits & ~PAGE_MASK) == - (chunk->map[run_ind+run_pages-1-map_bias].bits & ~PAGE_MASK)); - assert((chunk->map[run_ind-map_bias].bits & CHUNK_MAP_DIRTY) == - (chunk->map[run_ind+run_pages-1-map_bias].bits & CHUNK_MAP_DIRTY)); - arena_avail_tree_insert(runs_avail, &chunk->map[run_ind-map_bias]); + assert(arena_mapbits_unallocated_size_get(chunk, run_ind) == + arena_mapbits_unallocated_size_get(chunk, run_ind+run_pages-1)); + assert(arena_mapbits_dirty_get(chunk, run_ind) == + arena_mapbits_dirty_get(chunk, run_ind+run_pages-1)); + arena_avail_tree_insert(runs_avail, arena_mapp_get(chunk, run_ind)); if (dirty) { /* @@ -943,14 +945,12 @@ arena_run_dalloc(arena_t *arena, arena_run_t *run, bool dirty) } } - /* - * Deallocate chunk if it is now completely unused. The bit - * manipulation checks whether the first run is unallocated and extends - * to the end of the chunk. - */ - if ((chunk->map[0].bits & (~PAGE_MASK | CHUNK_MAP_ALLOCATED)) == - arena_maxclass) + /* Deallocate chunk if it is now completely unused. */ + if (size == arena_maxclass) { + assert(run_ind == map_bias); + assert(run_pages == (arena_maxclass >> LG_PAGE)); arena_chunk_dealloc(arena, chunk); + } /* * It is okay to do dirty page processing here even if the chunk was @@ -969,7 +969,7 @@ arena_run_trim_head(arena_t *arena, arena_chunk_t *chunk, arena_run_t *run, { size_t pageind = ((uintptr_t)run - (uintptr_t)chunk) >> LG_PAGE; size_t head_npages = (oldsize - newsize) >> LG_PAGE; - size_t flag_dirty = chunk->map[pageind-map_bias].bits & CHUNK_MAP_DIRTY; + size_t flag_dirty = arena_mapbits_dirty_get(chunk, pageind); assert(oldsize > newsize); @@ -978,29 +978,19 @@ arena_run_trim_head(arena_t *arena, arena_chunk_t *chunk, arena_run_t *run, * leading run as separately allocated. Set the last element of each * run first, in case of single-page runs. */ - assert((chunk->map[pageind-map_bias].bits & CHUNK_MAP_LARGE) != 0); - assert((chunk->map[pageind-map_bias].bits & CHUNK_MAP_ALLOCATED) != 0); - chunk->map[pageind+head_npages-1-map_bias].bits = flag_dirty | - (chunk->map[pageind+head_npages-1-map_bias].bits & - CHUNK_MAP_UNZEROED) | CHUNK_MAP_LARGE | CHUNK_MAP_ALLOCATED; - chunk->map[pageind-map_bias].bits = (oldsize - newsize) - | flag_dirty | (chunk->map[pageind-map_bias].bits & - CHUNK_MAP_UNZEROED) | CHUNK_MAP_LARGE | CHUNK_MAP_ALLOCATED; + assert(arena_mapbits_large_size_get(chunk, pageind) == oldsize); + arena_mapbits_large_set(chunk, pageind+head_npages-1, 0, flag_dirty); + arena_mapbits_large_set(chunk, pageind, oldsize-newsize, flag_dirty); if (config_debug) { UNUSED size_t tail_npages = newsize >> LG_PAGE; - assert((chunk->map[pageind+head_npages+tail_npages-1-map_bias] - .bits & ~PAGE_MASK) == 0); - assert((chunk->map[pageind+head_npages+tail_npages-1-map_bias] - .bits & CHUNK_MAP_DIRTY) == flag_dirty); - assert((chunk->map[pageind+head_npages+tail_npages-1-map_bias] - .bits & CHUNK_MAP_LARGE) != 0); - assert((chunk->map[pageind+head_npages+tail_npages-1-map_bias] - .bits & CHUNK_MAP_ALLOCATED) != 0); + assert(arena_mapbits_large_size_get(chunk, + pageind+head_npages+tail_npages-1) == 0); + assert(arena_mapbits_dirty_get(chunk, + pageind+head_npages+tail_npages-1) == flag_dirty); } - chunk->map[pageind+head_npages-map_bias].bits = newsize | flag_dirty | - (chunk->map[pageind+head_npages-map_bias].bits & - CHUNK_MAP_FLAGS_MASK) | CHUNK_MAP_LARGE | CHUNK_MAP_ALLOCATED; + arena_mapbits_large_set(chunk, pageind+head_npages, newsize, + flag_dirty); arena_run_dalloc(arena, run, false); } @@ -1011,9 +1001,7 @@ arena_run_trim_tail(arena_t *arena, arena_chunk_t *chunk, arena_run_t *run, { size_t pageind = ((uintptr_t)run - (uintptr_t)chunk) >> LG_PAGE; size_t head_npages = newsize >> LG_PAGE; - size_t tail_npages = (oldsize - newsize) >> LG_PAGE; - size_t flag_dirty = chunk->map[pageind-map_bias].bits & - CHUNK_MAP_DIRTY; + size_t flag_dirty = arena_mapbits_dirty_get(chunk, pageind); assert(oldsize > newsize); @@ -1022,28 +1010,19 @@ arena_run_trim_tail(arena_t *arena, arena_chunk_t *chunk, arena_run_t *run, * trailing run as separately allocated. Set the last element of each * run first, in case of single-page runs. */ - assert((chunk->map[pageind-map_bias].bits & CHUNK_MAP_LARGE) != 0); - assert((chunk->map[pageind-map_bias].bits & CHUNK_MAP_ALLOCATED) != 0); - chunk->map[pageind+head_npages-1-map_bias].bits = flag_dirty | - (chunk->map[pageind+head_npages-1-map_bias].bits & - CHUNK_MAP_UNZEROED) | CHUNK_MAP_LARGE | CHUNK_MAP_ALLOCATED; - chunk->map[pageind-map_bias].bits = newsize | flag_dirty | - (chunk->map[pageind-map_bias].bits & CHUNK_MAP_UNZEROED) | - CHUNK_MAP_LARGE | CHUNK_MAP_ALLOCATED; + assert(arena_mapbits_large_size_get(chunk, pageind) == oldsize); + arena_mapbits_large_set(chunk, pageind+head_npages-1, 0, flag_dirty); + arena_mapbits_large_set(chunk, pageind, newsize, flag_dirty); - assert((chunk->map[pageind+head_npages+tail_npages-1-map_bias].bits & - ~PAGE_MASK) == 0); - assert((chunk->map[pageind+head_npages+tail_npages-1-map_bias].bits & - CHUNK_MAP_LARGE) != 0); - assert((chunk->map[pageind+head_npages+tail_npages-1-map_bias].bits & - CHUNK_MAP_ALLOCATED) != 0); - chunk->map[pageind+head_npages+tail_npages-1-map_bias].bits = - flag_dirty | - (chunk->map[pageind+head_npages+tail_npages-1-map_bias].bits & - CHUNK_MAP_UNZEROED) | CHUNK_MAP_LARGE | CHUNK_MAP_ALLOCATED; - chunk->map[pageind+head_npages-map_bias].bits = (oldsize - newsize) | - flag_dirty | (chunk->map[pageind+head_npages-map_bias].bits & - CHUNK_MAP_UNZEROED) | CHUNK_MAP_LARGE | CHUNK_MAP_ALLOCATED; + if (config_debug) { + UNUSED size_t tail_npages = (oldsize - newsize) >> LG_PAGE; + assert(arena_mapbits_large_size_get(chunk, + pageind+head_npages+tail_npages-1) == 0); + assert(arena_mapbits_dirty_get(chunk, + pageind+head_npages+tail_npages-1) == flag_dirty); + } + arena_mapbits_large_set(chunk, pageind+head_npages, oldsize-newsize, + flag_dirty); arena_run_dalloc(arena, (arena_run_t *)((uintptr_t)run + newsize), dirty); @@ -1056,12 +1035,13 @@ arena_bin_runs_first(arena_bin_t *bin) if (mapelm != NULL) { arena_chunk_t *chunk; size_t pageind; + arena_run_t *run; chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(mapelm); pageind = ((((uintptr_t)mapelm - (uintptr_t)chunk->map) / sizeof(arena_chunk_map_t))) + map_bias; - arena_run_t *run = (arena_run_t *)((uintptr_t)chunk + - (uintptr_t)((pageind - (mapelm->bits >> LG_PAGE)) << + run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind - + arena_mapbits_small_runind_get(chunk, pageind)) << LG_PAGE)); return (run); } @@ -1074,7 +1054,7 @@ arena_bin_runs_insert(arena_bin_t *bin, arena_run_t *run) { arena_chunk_t *chunk = CHUNK_ADDR2BASE(run); size_t pageind = ((uintptr_t)run - (uintptr_t)chunk) >> LG_PAGE; - arena_chunk_map_t *mapelm = &chunk->map[pageind-map_bias]; + arena_chunk_map_t *mapelm = arena_mapp_get(chunk, pageind); assert(arena_run_tree_search(&bin->runs, mapelm) == NULL); @@ -1086,7 +1066,7 @@ arena_bin_runs_remove(arena_bin_t *bin, arena_run_t *run) { arena_chunk_t *chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(run); size_t pageind = ((uintptr_t)run - (uintptr_t)chunk) >> LG_PAGE; - arena_chunk_map_t *mapelm = &chunk->map[pageind-map_bias]; + arena_chunk_map_t *mapelm = arena_mapp_get(chunk, pageind); assert(arena_run_tree_search(&bin->runs, mapelm) != NULL); @@ -1125,12 +1105,14 @@ arena_bin_nonfull_run_get(arena_t *arena, arena_bin_t *bin) malloc_mutex_unlock(&bin->lock); /******************************/ malloc_mutex_lock(&arena->lock); - run = arena_run_alloc(arena, bin_info->run_size, false, false); + run = arena_run_alloc(arena, bin_info->run_size, false, binind, false); if (run != NULL) { bitmap_t *bitmap = (bitmap_t *)((uintptr_t)run + (uintptr_t)bin_info->bitmap_offset); /* Initialize run internals. */ + VALGRIND_MAKE_MEM_UNDEFINED(run, bin_info->reg0_offset - + bin_info->redzone_size); run->bin = bin; run->nextind = 0; run->nfree = bin_info->nregs; @@ -1381,7 +1363,7 @@ arena_malloc_large(arena_t *arena, size_t size, bool zero) /* Large allocation. */ size = PAGE_CEILING(size); malloc_mutex_lock(&arena->lock); - ret = (void *)arena_run_alloc(arena, size, true, zero); + ret = (void *)arena_run_alloc(arena, size, true, BININD_INVALID, zero); if (ret == NULL) { malloc_mutex_unlock(&arena->lock); return (NULL); @@ -1425,7 +1407,7 @@ arena_palloc(arena_t *arena, size_t size, size_t alignment, bool zero) alloc_size = size + alignment - PAGE; malloc_mutex_lock(&arena->lock); - run = arena_run_alloc(arena, alloc_size, true, zero); + run = arena_run_alloc(arena, alloc_size, true, BININD_INVALID, zero); if (run == NULL) { malloc_mutex_unlock(&arena->lock); return (NULL); @@ -1482,8 +1464,7 @@ arena_prof_promoted(const void *ptr, size_t size) pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE; binind = SMALL_SIZE2BIN(size); assert(binind < NBINS); - chunk->map[pageind-map_bias].bits = (chunk->map[pageind-map_bias].bits & - ~CHUNK_MAP_CLASS_MASK) | ((binind+1) << CHUNK_MAP_CLASS_SHIFT); + arena_mapbits_large_binind_set(chunk, pageind, binind); assert(isalloc(ptr, false) == PAGE); assert(isalloc(ptr, true) == size); @@ -1521,8 +1502,9 @@ arena_dalloc_bin_run(arena_t *arena, arena_chunk_t *chunk, arena_run_t *run, size_t npages, run_ind, past; assert(run != bin->runcur); - assert(arena_run_tree_search(&bin->runs, &chunk->map[ - (((uintptr_t)run-(uintptr_t)chunk)>>LG_PAGE)-map_bias]) == NULL); + assert(arena_run_tree_search(&bin->runs, + arena_mapp_get(chunk, ((uintptr_t)run-(uintptr_t)chunk)>>LG_PAGE)) + == NULL); binind = arena_bin_index(chunk->arena, run->bin); bin_info = &arena_bin_info[binind]; @@ -1542,18 +1524,14 @@ arena_dalloc_bin_run(arena_t *arena, arena_chunk_t *chunk, arena_run_t *run, * trim the clean pages before deallocating the dirty portion of the * run. */ - if ((chunk->map[run_ind-map_bias].bits & CHUNK_MAP_DIRTY) == 0 && past - - run_ind < npages) { - /* - * Trim clean pages. Convert to large run beforehand. Set the - * last map element first, in case this is a one-page run. - */ - chunk->map[run_ind+npages-1-map_bias].bits = CHUNK_MAP_LARGE | - (chunk->map[run_ind+npages-1-map_bias].bits & - CHUNK_MAP_FLAGS_MASK); - chunk->map[run_ind-map_bias].bits = bin_info->run_size | - CHUNK_MAP_LARGE | (chunk->map[run_ind-map_bias].bits & - CHUNK_MAP_FLAGS_MASK); + assert(arena_mapbits_dirty_get(chunk, run_ind) == + arena_mapbits_dirty_get(chunk, run_ind+npages-1)); + if (arena_mapbits_dirty_get(chunk, run_ind) == 0 && past - run_ind < + npages) { + /* Trim clean pages. Convert to large run beforehand. */ + assert(npages > 0); + arena_mapbits_large_set(chunk, run_ind, bin_info->run_size, 0); + arena_mapbits_large_set(chunk, run_ind+npages-1, 0, 0); arena_run_trim_tail(arena, chunk, run, (npages << LG_PAGE), ((past - run_ind) << LG_PAGE), false); /* npages = past - run_ind; */ @@ -1588,20 +1566,21 @@ arena_bin_lower_run(arena_t *arena, arena_chunk_t *chunk, arena_run_t *run, } void -arena_dalloc_bin(arena_t *arena, arena_chunk_t *chunk, void *ptr, +arena_dalloc_bin_locked(arena_t *arena, arena_chunk_t *chunk, void *ptr, arena_chunk_map_t *mapelm) { size_t pageind; arena_run_t *run; arena_bin_t *bin; - size_t size; + arena_bin_info_t *bin_info; + size_t size, binind; pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE; run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind - - (mapelm->bits >> LG_PAGE)) << LG_PAGE)); + arena_mapbits_small_runind_get(chunk, pageind)) << LG_PAGE)); bin = run->bin; - size_t binind = arena_bin_index(arena, bin); - arena_bin_info_t *bin_info = &arena_bin_info[binind]; + binind = arena_ptr_small_binind_get(ptr, mapelm->bits); + bin_info = &arena_bin_info[binind]; if (config_fill || config_stats) size = bin_info->reg_size; @@ -1621,6 +1600,35 @@ arena_dalloc_bin(arena_t *arena, arena_chunk_t *chunk, void *ptr, } } +void +arena_dalloc_bin(arena_t *arena, arena_chunk_t *chunk, void *ptr, + size_t pageind, arena_chunk_map_t *mapelm) +{ + arena_run_t *run; + arena_bin_t *bin; + + run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind - + arena_mapbits_small_runind_get(chunk, pageind)) << LG_PAGE)); + bin = run->bin; + malloc_mutex_lock(&bin->lock); + arena_dalloc_bin_locked(arena, chunk, ptr, mapelm); + malloc_mutex_unlock(&bin->lock); +} + +void +arena_dalloc_small(arena_t *arena, arena_chunk_t *chunk, void *ptr, + size_t pageind) +{ + arena_chunk_map_t *mapelm; + + if (config_debug) { + /* arena_ptr_small_binind_get() does extra sanity checking. */ + assert(arena_ptr_small_binind_get(ptr, arena_mapbits_get(chunk, + pageind)) != BININD_INVALID); + } + mapelm = arena_mapp_get(chunk, pageind); + arena_dalloc_bin(arena, chunk, ptr, pageind, mapelm); +} void arena_stats_merge(arena_t *arena, size_t *nactive, size_t *ndirty, arena_stats_t *astats, malloc_bin_stats_t *bstats, @@ -1669,12 +1677,12 @@ arena_stats_merge(arena_t *arena, size_t *nactive, size_t *ndirty, } void -arena_dalloc_large(arena_t *arena, arena_chunk_t *chunk, void *ptr) +arena_dalloc_large_locked(arena_t *arena, arena_chunk_t *chunk, void *ptr) { if (config_fill || config_stats) { size_t pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE; - size_t size = chunk->map[pageind-map_bias].bits & ~PAGE_MASK; + size_t size = arena_mapbits_large_size_get(chunk, pageind); if (config_fill && config_stats && opt_junk) memset(ptr, 0x5a, size); @@ -1689,6 +1697,15 @@ arena_dalloc_large(arena_t *arena, arena_chunk_t *chunk, void *ptr) arena_run_dalloc(arena, (arena_run_t *)ptr, true); } +void +arena_dalloc_large(arena_t *arena, arena_chunk_t *chunk, void *ptr) +{ + + malloc_mutex_lock(&arena->lock); + arena_dalloc_large_locked(arena, chunk, ptr); + malloc_mutex_unlock(&arena->lock); +} + static void arena_ralloc_large_shrink(arena_t *arena, arena_chunk_t *chunk, void *ptr, size_t oldsize, size_t size) @@ -1727,16 +1744,15 @@ arena_ralloc_large_grow(arena_t *arena, arena_chunk_t *chunk, void *ptr, size_t npages = oldsize >> LG_PAGE; size_t followsize; - assert(oldsize == (chunk->map[pageind-map_bias].bits & ~PAGE_MASK)); + assert(oldsize == arena_mapbits_large_size_get(chunk, pageind)); /* Try to extend the run. */ assert(size + extra > oldsize); malloc_mutex_lock(&arena->lock); if (pageind + npages < chunk_npages && - (chunk->map[pageind+npages-map_bias].bits - & CHUNK_MAP_ALLOCATED) == 0 && (followsize = - chunk->map[pageind+npages-map_bias].bits & ~PAGE_MASK) >= size - - oldsize) { + arena_mapbits_allocated_get(chunk, pageind+npages) == 0 && + (followsize = arena_mapbits_unallocated_size_get(chunk, + pageind+npages)) >= size - oldsize) { /* * The next run is available and sufficiently large. Split the * following run, then merge the first part with the existing @@ -1746,7 +1762,8 @@ arena_ralloc_large_grow(arena_t *arena, arena_chunk_t *chunk, void *ptr, size_t splitsize = (oldsize + followsize <= size + extra) ? followsize : size + extra - oldsize; arena_run_split(arena, (arena_run_t *)((uintptr_t)chunk + - ((pageind+npages) << LG_PAGE)), splitsize, true, zero); + ((pageind+npages) << LG_PAGE)), splitsize, true, + BININD_INVALID, zero); size = oldsize + splitsize; npages = size >> LG_PAGE; @@ -1759,29 +1776,22 @@ arena_ralloc_large_grow(arena_t *arena, arena_chunk_t *chunk, void *ptr, * arena_run_dalloc() with the dirty argument set to false * (which is when dirty flag consistency would really matter). */ - flag_dirty = (chunk->map[pageind-map_bias].bits & - CHUNK_MAP_DIRTY) | - (chunk->map[pageind+npages-1-map_bias].bits & - CHUNK_MAP_DIRTY); - chunk->map[pageind-map_bias].bits = size | flag_dirty - | CHUNK_MAP_LARGE | CHUNK_MAP_ALLOCATED; - chunk->map[pageind+npages-1-map_bias].bits = flag_dirty | - CHUNK_MAP_LARGE | CHUNK_MAP_ALLOCATED; + flag_dirty = arena_mapbits_dirty_get(chunk, pageind) | + arena_mapbits_dirty_get(chunk, pageind+npages-1); + arena_mapbits_large_set(chunk, pageind, size, flag_dirty); + arena_mapbits_large_set(chunk, pageind+npages-1, 0, flag_dirty); if (config_stats) { arena->stats.ndalloc_large++; arena->stats.allocated_large -= oldsize; - arena->stats.lstats[(oldsize >> LG_PAGE) - - 1].ndalloc++; - arena->stats.lstats[(oldsize >> LG_PAGE) - - 1].curruns--; + arena->stats.lstats[(oldsize >> LG_PAGE) - 1].ndalloc++; + arena->stats.lstats[(oldsize >> LG_PAGE) - 1].curruns--; arena->stats.nmalloc_large++; arena->stats.nrequests_large++; arena->stats.allocated_large += size; arena->stats.lstats[(size >> LG_PAGE) - 1].nmalloc++; - arena->stats.lstats[(size >> LG_PAGE) - - 1].nrequests++; + arena->stats.lstats[(size >> LG_PAGE) - 1].nrequests++; arena->stats.lstats[(size >> LG_PAGE) - 1].curruns++; } malloc_mutex_unlock(&arena->lock); @@ -1924,6 +1934,7 @@ arena_ralloc(void *ptr, size_t oldsize, size_t size, size_t extra, * expectation that the extra bytes will be reliably preserved. */ copysize = (size < oldsize) ? size : oldsize; + VALGRIND_MAKE_MEM_UNDEFINED(ret, copysize); memcpy(ret, ptr, copysize); iqalloc(ptr); return (ret); diff --git a/contrib/jemalloc/src/chunk.c b/contrib/jemalloc/src/chunk.c index 5426b0275c7..6bc24544797 100644 --- a/contrib/jemalloc/src/chunk.c +++ b/contrib/jemalloc/src/chunk.c @@ -30,19 +30,30 @@ size_t arena_maxclass; /* Max size class for arenas. */ /******************************************************************************/ /* Function prototypes for non-inline static functions. */ -static void *chunk_recycle(size_t size, size_t alignment, bool *zero); +static void *chunk_recycle(size_t size, size_t alignment, bool base, + bool *zero); static void chunk_record(void *chunk, size_t size); /******************************************************************************/ static void * -chunk_recycle(size_t size, size_t alignment, bool *zero) +chunk_recycle(size_t size, size_t alignment, bool base, bool *zero) { void *ret; extent_node_t *node; extent_node_t key; size_t alloc_size, leadsize, trailsize; + if (base) { + /* + * This function may need to call base_node_{,de}alloc(), but + * the current chunk allocation request is on behalf of the + * base allocator. Avoid deadlock (and if that weren't an + * issue, potential for infinite recursion) by returning NULL. + */ + return (NULL); + } + alloc_size = size + alignment - chunksize; /* Beware size_t wrap-around. */ if (alloc_size < size) @@ -57,8 +68,8 @@ chunk_recycle(size_t size, size_t alignment, bool *zero) } leadsize = ALIGNMENT_CEILING((uintptr_t)node->addr, alignment) - (uintptr_t)node->addr; - assert(alloc_size >= leadsize + size); - trailsize = alloc_size - leadsize - size; + assert(node->size >= leadsize + size); + trailsize = node->size - leadsize - size; ret = (void *)((uintptr_t)node->addr + leadsize); /* Remove node from the tree. */ extent_tree_szad_remove(&chunks_szad, node); @@ -123,9 +134,10 @@ chunk_alloc(size_t size, size_t alignment, bool base, bool *zero) assert(size != 0); assert((size & chunksize_mask) == 0); + assert(alignment != 0); assert((alignment & chunksize_mask) == 0); - ret = chunk_recycle(size, alignment, zero); + ret = chunk_recycle(size, alignment, base, zero); if (ret != NULL) goto label_return; @@ -168,6 +180,7 @@ label_return: size_t i; size_t *p = (size_t *)(uintptr_t)ret; + VALGRIND_MAKE_MEM_DEFINED(ret, size); for (i = 0; i < size / sizeof(size_t); i++) assert(p[i] == 0); } @@ -182,50 +195,48 @@ chunk_record(void *chunk, size_t size) pages_purge(chunk, size); - xnode = NULL; + /* + * Allocate a node before acquiring chunks_mtx even though it might not + * be needed, because base_node_alloc() may cause a new base chunk to + * be allocated, which could cause deadlock if chunks_mtx were already + * held. + */ + xnode = base_node_alloc(); + malloc_mutex_lock(&chunks_mtx); - while (true) { - key.addr = (void *)((uintptr_t)chunk + size); - node = extent_tree_ad_nsearch(&chunks_ad, &key); - /* Try to coalesce forward. */ - if (node != NULL && node->addr == key.addr) { + key.addr = (void *)((uintptr_t)chunk + size); + node = extent_tree_ad_nsearch(&chunks_ad, &key); + /* Try to coalesce forward. */ + if (node != NULL && node->addr == key.addr) { + /* + * Coalesce chunk with the following address range. This does + * not change the position within chunks_ad, so only + * remove/insert from/into chunks_szad. + */ + extent_tree_szad_remove(&chunks_szad, node); + node->addr = chunk; + node->size += size; + extent_tree_szad_insert(&chunks_szad, node); + if (xnode != NULL) + base_node_dealloc(xnode); + } else { + /* Coalescing forward failed, so insert a new node. */ + if (xnode == NULL) { /* - * Coalesce chunk with the following address range. - * This does not change the position within chunks_ad, - * so only remove/insert from/into chunks_szad. - */ - extent_tree_szad_remove(&chunks_szad, node); - node->addr = chunk; - node->size += size; - extent_tree_szad_insert(&chunks_szad, node); - break; - } else if (xnode == NULL) { - /* - * It is possible that base_node_alloc() will cause a - * new base chunk to be allocated, so take care not to - * deadlock on chunks_mtx, and recover if another thread - * deallocates an adjacent chunk while this one is busy - * allocating xnode. + * base_node_alloc() failed, which is an exceedingly + * unlikely failure. Leak chunk; its pages have + * already been purged, so this is only a virtual + * memory leak. */ malloc_mutex_unlock(&chunks_mtx); - xnode = base_node_alloc(); - if (xnode == NULL) - return; - malloc_mutex_lock(&chunks_mtx); - } else { - /* Coalescing forward failed, so insert a new node. */ - node = xnode; - xnode = NULL; - node->addr = chunk; - node->size = size; - extent_tree_ad_insert(&chunks_ad, node); - extent_tree_szad_insert(&chunks_szad, node); - break; + return; } + node = xnode; + node->addr = chunk; + node->size = size; + extent_tree_ad_insert(&chunks_ad, node); + extent_tree_szad_insert(&chunks_szad, node); } - /* Discard xnode if it ended up unused due to a race. */ - if (xnode != NULL) - base_node_dealloc(xnode); /* Try to coalesce backward. */ prev = extent_tree_ad_prev(&chunks_ad, node); diff --git a/contrib/jemalloc/src/chunk_mmap.c b/contrib/jemalloc/src/chunk_mmap.c index 9ff7480a06f..c8da6556b09 100644 --- a/contrib/jemalloc/src/chunk_mmap.c +++ b/contrib/jemalloc/src/chunk_mmap.c @@ -7,7 +7,7 @@ static void *pages_map(void *addr, size_t size); static void pages_unmap(void *addr, size_t size); static void *chunk_alloc_mmap_slow(size_t size, size_t alignment, - bool unaligned, bool *zero); + bool *zero); /******************************************************************************/ @@ -16,6 +16,16 @@ pages_map(void *addr, size_t size) { void *ret; + assert(size != 0); + +#ifdef _WIN32 + /* + * If VirtualAlloc can't allocate at the given address when one is + * given, it fails and returns NULL. + */ + ret = VirtualAlloc(addr, size, MEM_COMMIT | MEM_RESERVE, + PAGE_READWRITE); +#else /* * We don't use MAP_FIXED here, because it can cause the *replacement* * of existing mappings, and we only want to create new mappings. @@ -33,7 +43,7 @@ pages_map(void *addr, size_t size) if (munmap(ret, size) == -1) { char buf[BUFERROR_BUF]; - buferror(errno, buf, sizeof(buf)); + buferror(buf, sizeof(buf)); malloc_printf(": Error in munmap(): %s\n", buf); + buferror(buf, sizeof(buf)); + malloc_printf(": Error in " +#ifdef _WIN32 + "VirtualFree" +#else + "munmap" +#endif + "(): %s\n", buf); if (opt_abort) abort(); } } +static void * +pages_trim(void *addr, size_t alloc_size, size_t leadsize, size_t size) +{ + void *ret = (void *)((uintptr_t)addr + leadsize); + + assert(alloc_size >= leadsize + size); +#ifdef _WIN32 + { + void *new_addr; + + pages_unmap(addr, alloc_size); + new_addr = pages_map(ret, size); + if (new_addr == ret) + return (ret); + if (new_addr) + pages_unmap(new_addr, size); + return (NULL); + } +#else + { + size_t trailsize = alloc_size - leadsize - size; + + if (leadsize != 0) + pages_unmap(addr, leadsize); + if (trailsize != 0) + pages_unmap((void *)((uintptr_t)ret + size), trailsize); + return (ret); + } +#endif +} + void pages_purge(void *addr, size_t length) { -#ifdef JEMALLOC_PURGE_MADVISE_DONTNEED -# define JEMALLOC_MADV_PURGE MADV_DONTNEED -#elif defined(JEMALLOC_PURGE_MADVISE_FREE) -# define JEMALLOC_MADV_PURGE MADV_FREE +#ifdef _WIN32 + VirtualAlloc(addr, length, MEM_RESET, PAGE_READWRITE); #else -# error "No method defined for purging unused dirty pages." -#endif +# ifdef JEMALLOC_PURGE_MADVISE_DONTNEED +# define JEMALLOC_MADV_PURGE MADV_DONTNEED +# elif defined(JEMALLOC_PURGE_MADVISE_FREE) +# define JEMALLOC_MADV_PURGE MADV_FREE +# else +# error "No method defined for purging unused dirty pages." +# endif madvise(addr, length, JEMALLOC_MADV_PURGE); +#endif } static void * -chunk_alloc_mmap_slow(size_t size, size_t alignment, bool unaligned, bool *zero) +chunk_alloc_mmap_slow(size_t size, size_t alignment, bool *zero) { void *ret, *pages; - size_t alloc_size, leadsize, trailsize; + size_t alloc_size, leadsize; alloc_size = size + alignment - PAGE; /* Beware size_t wrap-around. */ if (alloc_size < size) return (NULL); - pages = pages_map(NULL, alloc_size); - if (pages == NULL) - return (NULL); - leadsize = ALIGNMENT_CEILING((uintptr_t)pages, alignment) - - (uintptr_t)pages; - assert(alloc_size >= leadsize + size); - trailsize = alloc_size - leadsize - size; - ret = (void *)((uintptr_t)pages + leadsize); - if (leadsize != 0) { - /* Note that mmap() returned an unaligned mapping. */ - unaligned = true; - pages_unmap(pages, leadsize); - } - if (trailsize != 0) - pages_unmap((void *)((uintptr_t)ret + size), trailsize); + do { + pages = pages_map(NULL, alloc_size); + if (pages == NULL) + return (NULL); + leadsize = ALIGNMENT_CEILING((uintptr_t)pages, alignment) - + (uintptr_t)pages; + ret = pages_trim(pages, alloc_size, leadsize, size); + } while (ret == NULL); assert(ret != NULL); *zero = true; @@ -117,48 +166,24 @@ chunk_alloc_mmap(size_t size, size_t alignment, bool *zero) * NetBSD has), but in the absence of such a feature, we have to work * hard to efficiently create aligned mappings. The reliable, but * slow method is to create a mapping that is over-sized, then trim the - * excess. However, that always results in at least one call to + * excess. However, that always results in one or two calls to * pages_unmap(). * - * A more optimistic approach is to try mapping precisely the right - * amount, then try to append another mapping if alignment is off. In - * practice, this works out well as long as the application is not - * interleaving mappings via direct mmap() calls. If we do run into a - * situation where there is an interleaved mapping and we are unable to - * extend an unaligned mapping, our best option is to switch to the - * slow method until mmap() returns another aligned mapping. This will - * tend to leave a gap in the memory map that is too small to cause - * later problems for the optimistic method. - * - * Another possible confounding factor is address space layout - * randomization (ASLR), which causes mmap(2) to disregard the - * requested address. As such, repeatedly trying to extend unaligned - * mappings could result in an infinite loop, so if extension fails, - * immediately fall back to the reliable method of over-allocation - * followed by trimming. + * Optimistically try mapping precisely the right amount before falling + * back to the slow method, with the expectation that the optimistic + * approach works most of the time. */ + assert(alignment != 0); + assert((alignment & chunksize_mask) == 0); + ret = pages_map(NULL, size); if (ret == NULL) return (NULL); - offset = ALIGNMENT_ADDR2OFFSET(ret, alignment); if (offset != 0) { - /* Try to extend chunk boundary. */ - if (pages_map((void *)((uintptr_t)ret + size), chunksize - - offset) == NULL) { - /* - * Extension failed. Clean up, then fall back to the - * reliable-but-expensive method. - */ - pages_unmap(ret, size); - return (chunk_alloc_mmap_slow(size, alignment, true, - zero)); - } else { - /* Clean up unneeded leading space. */ - pages_unmap(ret, chunksize - offset); - ret = (void *)((uintptr_t)ret + (chunksize - offset)); - } + pages_unmap(ret, size); + return (chunk_alloc_mmap_slow(size, alignment, zero)); } assert(ret != NULL); diff --git a/contrib/jemalloc/src/ctl.c b/contrib/jemalloc/src/ctl.c index 98ea3d1c5b1..55e766777fd 100644 --- a/contrib/jemalloc/src/ctl.c +++ b/contrib/jemalloc/src/ctl.c @@ -14,6 +14,32 @@ static bool ctl_initialized; static uint64_t ctl_epoch; static ctl_stats_t ctl_stats; +/******************************************************************************/ +/* Helpers for named and indexed nodes. */ + +static inline const ctl_named_node_t * +ctl_named_node(const ctl_node_t *node) +{ + + return ((node->named) ? (const ctl_named_node_t *)node : NULL); +} + +static inline const ctl_named_node_t * +ctl_named_children(const ctl_named_node_t *node, int index) +{ + const ctl_named_node_t *children = ctl_named_node(node->children); + + return (children ? &children[index] : NULL); +} + +static inline const ctl_indexed_node_t * +ctl_indexed_node(const ctl_node_t *node) +{ + + return ((node->named == false) ? (const ctl_indexed_node_t *)node : + NULL); +} + /******************************************************************************/ /* Function prototypes for non-inline static functions. */ @@ -22,7 +48,7 @@ static int n##_ctl(const size_t *mib, size_t miblen, void *oldp, \ size_t *oldlenp, void *newp, size_t newlen); #define INDEX_PROTO(n) \ -const ctl_node_t *n##_index(const size_t *mib, size_t miblen, \ +const ctl_named_node_t *n##_index(const size_t *mib, size_t miblen, \ size_t i); static bool ctl_arena_init(ctl_arena_stats_t *astats); @@ -50,6 +76,7 @@ CTL_PROTO(config_debug) CTL_PROTO(config_dss) CTL_PROTO(config_fill) CTL_PROTO(config_lazy_lock) +CTL_PROTO(config_mremap) CTL_PROTO(config_munmap) CTL_PROTO(config_prof) CTL_PROTO(config_prof_libgcc) @@ -149,35 +176,39 @@ CTL_PROTO(stats_mapped) /* Maximum tree depth. */ #define CTL_MAX_DEPTH 6 -#define NAME(n) true, {.named = {n -#define CHILD(c) sizeof(c##_node) / sizeof(ctl_node_t), c##_node}}, NULL -#define CTL(c) 0, NULL}}, c##_ctl +#define NAME(n) {true}, n +#define CHILD(t, c) \ + sizeof(c##_node) / sizeof(ctl_##t##_node_t), \ + (ctl_node_t *)c##_node, \ + NULL +#define CTL(c) 0, NULL, c##_ctl /* * Only handles internal indexed nodes, since there are currently no external * ones. */ -#define INDEX(i) false, {.indexed = {i##_index}}, NULL +#define INDEX(i) {false}, i##_index -static const ctl_node_t tcache_node[] = { +static const ctl_named_node_t tcache_node[] = { {NAME("enabled"), CTL(thread_tcache_enabled)}, {NAME("flush"), CTL(thread_tcache_flush)} }; -static const ctl_node_t thread_node[] = { +static const ctl_named_node_t thread_node[] = { {NAME("arena"), CTL(thread_arena)}, {NAME("allocated"), CTL(thread_allocated)}, {NAME("allocatedp"), CTL(thread_allocatedp)}, {NAME("deallocated"), CTL(thread_deallocated)}, {NAME("deallocatedp"), CTL(thread_deallocatedp)}, - {NAME("tcache"), CHILD(tcache)} + {NAME("tcache"), CHILD(named, tcache)} }; -static const ctl_node_t config_node[] = { +static const ctl_named_node_t config_node[] = { {NAME("debug"), CTL(config_debug)}, {NAME("dss"), CTL(config_dss)}, {NAME("fill"), CTL(config_fill)}, {NAME("lazy_lock"), CTL(config_lazy_lock)}, + {NAME("mremap"), CTL(config_mremap)}, {NAME("munmap"), CTL(config_munmap)}, {NAME("prof"), CTL(config_prof)}, {NAME("prof_libgcc"), CTL(config_prof_libgcc)}, @@ -190,7 +221,7 @@ static const ctl_node_t config_node[] = { {NAME("xmalloc"), CTL(config_xmalloc)} }; -static const ctl_node_t opt_node[] = { +static const ctl_named_node_t opt_node[] = { {NAME("abort"), CTL(opt_abort)}, {NAME("lg_chunk"), CTL(opt_lg_chunk)}, {NAME("narenas"), CTL(opt_narenas)}, @@ -216,31 +247,31 @@ static const ctl_node_t opt_node[] = { {NAME("prof_accum"), CTL(opt_prof_accum)} }; -static const ctl_node_t arenas_bin_i_node[] = { +static const ctl_named_node_t arenas_bin_i_node[] = { {NAME("size"), CTL(arenas_bin_i_size)}, {NAME("nregs"), CTL(arenas_bin_i_nregs)}, {NAME("run_size"), CTL(arenas_bin_i_run_size)} }; -static const ctl_node_t super_arenas_bin_i_node[] = { - {NAME(""), CHILD(arenas_bin_i)} +static const ctl_named_node_t super_arenas_bin_i_node[] = { + {NAME(""), CHILD(named, arenas_bin_i)} }; -static const ctl_node_t arenas_bin_node[] = { +static const ctl_indexed_node_t arenas_bin_node[] = { {INDEX(arenas_bin_i)} }; -static const ctl_node_t arenas_lrun_i_node[] = { +static const ctl_named_node_t arenas_lrun_i_node[] = { {NAME("size"), CTL(arenas_lrun_i_size)} }; -static const ctl_node_t super_arenas_lrun_i_node[] = { - {NAME(""), CHILD(arenas_lrun_i)} +static const ctl_named_node_t super_arenas_lrun_i_node[] = { + {NAME(""), CHILD(named, arenas_lrun_i)} }; -static const ctl_node_t arenas_lrun_node[] = { +static const ctl_indexed_node_t arenas_lrun_node[] = { {INDEX(arenas_lrun_i)} }; -static const ctl_node_t arenas_node[] = { +static const ctl_named_node_t arenas_node[] = { {NAME("narenas"), CTL(arenas_narenas)}, {NAME("initialized"), CTL(arenas_initialized)}, {NAME("quantum"), CTL(arenas_quantum)}, @@ -248,45 +279,45 @@ static const ctl_node_t arenas_node[] = { {NAME("tcache_max"), CTL(arenas_tcache_max)}, {NAME("nbins"), CTL(arenas_nbins)}, {NAME("nhbins"), CTL(arenas_nhbins)}, - {NAME("bin"), CHILD(arenas_bin)}, + {NAME("bin"), CHILD(indexed, arenas_bin)}, {NAME("nlruns"), CTL(arenas_nlruns)}, - {NAME("lrun"), CHILD(arenas_lrun)}, + {NAME("lrun"), CHILD(indexed, arenas_lrun)}, {NAME("purge"), CTL(arenas_purge)} }; -static const ctl_node_t prof_node[] = { +static const ctl_named_node_t prof_node[] = { {NAME("active"), CTL(prof_active)}, {NAME("dump"), CTL(prof_dump)}, {NAME("interval"), CTL(prof_interval)} }; -static const ctl_node_t stats_chunks_node[] = { +static const ctl_named_node_t stats_chunks_node[] = { {NAME("current"), CTL(stats_chunks_current)}, {NAME("total"), CTL(stats_chunks_total)}, {NAME("high"), CTL(stats_chunks_high)} }; -static const ctl_node_t stats_huge_node[] = { +static const ctl_named_node_t stats_huge_node[] = { {NAME("allocated"), CTL(stats_huge_allocated)}, {NAME("nmalloc"), CTL(stats_huge_nmalloc)}, {NAME("ndalloc"), CTL(stats_huge_ndalloc)} }; -static const ctl_node_t stats_arenas_i_small_node[] = { +static const ctl_named_node_t stats_arenas_i_small_node[] = { {NAME("allocated"), CTL(stats_arenas_i_small_allocated)}, {NAME("nmalloc"), CTL(stats_arenas_i_small_nmalloc)}, {NAME("ndalloc"), CTL(stats_arenas_i_small_ndalloc)}, {NAME("nrequests"), CTL(stats_arenas_i_small_nrequests)} }; -static const ctl_node_t stats_arenas_i_large_node[] = { +static const ctl_named_node_t stats_arenas_i_large_node[] = { {NAME("allocated"), CTL(stats_arenas_i_large_allocated)}, {NAME("nmalloc"), CTL(stats_arenas_i_large_nmalloc)}, {NAME("ndalloc"), CTL(stats_arenas_i_large_ndalloc)}, {NAME("nrequests"), CTL(stats_arenas_i_large_nrequests)} }; -static const ctl_node_t stats_arenas_i_bins_j_node[] = { +static const ctl_named_node_t stats_arenas_i_bins_j_node[] = { {NAME("allocated"), CTL(stats_arenas_i_bins_j_allocated)}, {NAME("nmalloc"), CTL(stats_arenas_i_bins_j_nmalloc)}, {NAME("ndalloc"), CTL(stats_arenas_i_bins_j_ndalloc)}, @@ -297,29 +328,29 @@ static const ctl_node_t stats_arenas_i_bins_j_node[] = { {NAME("nreruns"), CTL(stats_arenas_i_bins_j_nreruns)}, {NAME("curruns"), CTL(stats_arenas_i_bins_j_curruns)} }; -static const ctl_node_t super_stats_arenas_i_bins_j_node[] = { - {NAME(""), CHILD(stats_arenas_i_bins_j)} +static const ctl_named_node_t super_stats_arenas_i_bins_j_node[] = { + {NAME(""), CHILD(named, stats_arenas_i_bins_j)} }; -static const ctl_node_t stats_arenas_i_bins_node[] = { +static const ctl_indexed_node_t stats_arenas_i_bins_node[] = { {INDEX(stats_arenas_i_bins_j)} }; -static const ctl_node_t stats_arenas_i_lruns_j_node[] = { +static const ctl_named_node_t stats_arenas_i_lruns_j_node[] = { {NAME("nmalloc"), CTL(stats_arenas_i_lruns_j_nmalloc)}, {NAME("ndalloc"), CTL(stats_arenas_i_lruns_j_ndalloc)}, {NAME("nrequests"), CTL(stats_arenas_i_lruns_j_nrequests)}, {NAME("curruns"), CTL(stats_arenas_i_lruns_j_curruns)} }; -static const ctl_node_t super_stats_arenas_i_lruns_j_node[] = { - {NAME(""), CHILD(stats_arenas_i_lruns_j)} +static const ctl_named_node_t super_stats_arenas_i_lruns_j_node[] = { + {NAME(""), CHILD(named, stats_arenas_i_lruns_j)} }; -static const ctl_node_t stats_arenas_i_lruns_node[] = { +static const ctl_indexed_node_t stats_arenas_i_lruns_node[] = { {INDEX(stats_arenas_i_lruns_j)} }; -static const ctl_node_t stats_arenas_i_node[] = { +static const ctl_named_node_t stats_arenas_i_node[] = { {NAME("nthreads"), CTL(stats_arenas_i_nthreads)}, {NAME("pactive"), CTL(stats_arenas_i_pactive)}, {NAME("pdirty"), CTL(stats_arenas_i_pdirty)}, @@ -327,41 +358,41 @@ static const ctl_node_t stats_arenas_i_node[] = { {NAME("npurge"), CTL(stats_arenas_i_npurge)}, {NAME("nmadvise"), CTL(stats_arenas_i_nmadvise)}, {NAME("purged"), CTL(stats_arenas_i_purged)}, - {NAME("small"), CHILD(stats_arenas_i_small)}, - {NAME("large"), CHILD(stats_arenas_i_large)}, - {NAME("bins"), CHILD(stats_arenas_i_bins)}, - {NAME("lruns"), CHILD(stats_arenas_i_lruns)} + {NAME("small"), CHILD(named, stats_arenas_i_small)}, + {NAME("large"), CHILD(named, stats_arenas_i_large)}, + {NAME("bins"), CHILD(indexed, stats_arenas_i_bins)}, + {NAME("lruns"), CHILD(indexed, stats_arenas_i_lruns)} }; -static const ctl_node_t super_stats_arenas_i_node[] = { - {NAME(""), CHILD(stats_arenas_i)} +static const ctl_named_node_t super_stats_arenas_i_node[] = { + {NAME(""), CHILD(named, stats_arenas_i)} }; -static const ctl_node_t stats_arenas_node[] = { +static const ctl_indexed_node_t stats_arenas_node[] = { {INDEX(stats_arenas_i)} }; -static const ctl_node_t stats_node[] = { +static const ctl_named_node_t stats_node[] = { {NAME("cactive"), CTL(stats_cactive)}, {NAME("allocated"), CTL(stats_allocated)}, {NAME("active"), CTL(stats_active)}, {NAME("mapped"), CTL(stats_mapped)}, - {NAME("chunks"), CHILD(stats_chunks)}, - {NAME("huge"), CHILD(stats_huge)}, - {NAME("arenas"), CHILD(stats_arenas)} + {NAME("chunks"), CHILD(named, stats_chunks)}, + {NAME("huge"), CHILD(named, stats_huge)}, + {NAME("arenas"), CHILD(indexed, stats_arenas)} }; -static const ctl_node_t root_node[] = { +static const ctl_named_node_t root_node[] = { {NAME("version"), CTL(version)}, {NAME("epoch"), CTL(epoch)}, - {NAME("thread"), CHILD(thread)}, - {NAME("config"), CHILD(config)}, - {NAME("opt"), CHILD(opt)}, - {NAME("arenas"), CHILD(arenas)}, - {NAME("prof"), CHILD(prof)}, - {NAME("stats"), CHILD(stats)} + {NAME("thread"), CHILD(named, thread)}, + {NAME("config"), CHILD(named, config)}, + {NAME("opt"), CHILD(named, opt)}, + {NAME("arenas"), CHILD(named, arenas)}, + {NAME("prof"), CHILD(named, prof)}, + {NAME("stats"), CHILD(named, stats)} }; -static const ctl_node_t super_root_node[] = { - {NAME(""), CHILD(root)} +static const ctl_named_node_t super_root_node[] = { + {NAME(""), CHILD(named, root)} }; #undef NAME @@ -491,7 +522,7 @@ static void ctl_refresh(void) { unsigned i; - arena_t *tarenas[narenas]; + VARIABLE_ARRAY(arena_t *, tarenas, narenas); if (config_stats) { malloc_mutex_lock(&chunks_mtx); @@ -597,7 +628,7 @@ ctl_lookup(const char *name, ctl_node_t const **nodesp, size_t *mibp, int ret; const char *elm, *tdot, *dot; size_t elen, i, j; - const ctl_node_t *node; + const ctl_named_node_t *node; elm = name; /* Equivalent to strchrnul(). */ @@ -609,21 +640,21 @@ ctl_lookup(const char *name, ctl_node_t const **nodesp, size_t *mibp, } node = super_root_node; for (i = 0; i < *depthp; i++) { - assert(node->named); - assert(node->u.named.nchildren > 0); - if (node->u.named.children[0].named) { - const ctl_node_t *pnode = node; + assert(node); + assert(node->nchildren > 0); + if (ctl_named_node(node->children) != NULL) { + const ctl_named_node_t *pnode = node; /* Children are named. */ - for (j = 0; j < node->u.named.nchildren; j++) { - const ctl_node_t *child = - &node->u.named.children[j]; - if (strlen(child->u.named.name) == elen - && strncmp(elm, child->u.named.name, - elen) == 0) { + for (j = 0; j < node->nchildren; j++) { + const ctl_named_node_t *child = + ctl_named_children(node, j); + if (strlen(child->name) == elen && + strncmp(elm, child->name, elen) == 0) { node = child; if (nodesp != NULL) - nodesp[i] = node; + nodesp[i] = + (const ctl_node_t *)node; mibp[i] = j; break; } @@ -634,7 +665,7 @@ ctl_lookup(const char *name, ctl_node_t const **nodesp, size_t *mibp, } } else { uintmax_t index; - const ctl_node_t *inode; + const ctl_indexed_node_t *inode; /* Children are indexed. */ index = malloc_strtoumax(elm, NULL, 10); @@ -643,16 +674,15 @@ ctl_lookup(const char *name, ctl_node_t const **nodesp, size_t *mibp, goto label_return; } - inode = &node->u.named.children[0]; - node = inode->u.indexed.index(mibp, *depthp, - (size_t)index); + inode = ctl_indexed_node(node->children); + node = inode->index(mibp, *depthp, (size_t)index); if (node == NULL) { ret = ENOENT; goto label_return; } if (nodesp != NULL) - nodesp[i] = node; + nodesp[i] = (const ctl_node_t *)node; mibp[i] = (size_t)index; } @@ -696,6 +726,7 @@ ctl_byname(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t depth; ctl_node_t const *nodes[CTL_MAX_DEPTH]; size_t mib[CTL_MAX_DEPTH]; + const ctl_named_node_t *node; if (ctl_initialized == false && ctl_init()) { ret = EAGAIN; @@ -707,13 +738,14 @@ ctl_byname(const char *name, void *oldp, size_t *oldlenp, void *newp, if (ret != 0) goto label_return; - if (nodes[depth-1]->ctl == NULL) { + node = ctl_named_node(nodes[depth-1]); + if (node != NULL && node->ctl) + ret = node->ctl(mib, depth, oldp, oldlenp, newp, newlen); + else { /* The name refers to a partial path through the ctl tree. */ ret = ENOENT; - goto label_return; } - ret = nodes[depth-1]->ctl(mib, depth, oldp, oldlenp, newp, newlen); label_return: return(ret); } @@ -738,7 +770,7 @@ ctl_bymib(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) { int ret; - const ctl_node_t *node; + const ctl_named_node_t *node; size_t i; if (ctl_initialized == false && ctl_init()) { @@ -749,19 +781,21 @@ ctl_bymib(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, /* Iterate down the tree. */ node = super_root_node; for (i = 0; i < miblen; i++) { - if (node->u.named.children[0].named) { + assert(node); + assert(node->nchildren > 0); + if (ctl_named_node(node->children) != NULL) { /* Children are named. */ - if (node->u.named.nchildren <= mib[i]) { + if (node->nchildren <= mib[i]) { ret = ENOENT; goto label_return; } - node = &node->u.named.children[mib[i]]; + node = ctl_named_children(node, mib[i]); } else { - const ctl_node_t *inode; + const ctl_indexed_node_t *inode; /* Indexed element. */ - inode = &node->u.named.children[0]; - node = inode->u.indexed.index(mib, miblen, mib[i]); + inode = ctl_indexed_node(node->children); + node = inode->index(mib, miblen, mib[i]); if (node == NULL) { ret = ENOENT; goto label_return; @@ -770,12 +804,12 @@ ctl_bymib(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, } /* Call the ctl function. */ - if (node->ctl == NULL) { + if (node && node->ctl) + ret = node->ctl(mib, miblen, oldp, oldlenp, newp, newlen); + else { /* Partial MIB. */ ret = ENOENT; - goto label_return; } - ret = node->ctl(mib, miblen, oldp, oldlenp, newp, newlen); label_return: return(ret); @@ -799,22 +833,17 @@ ctl_boot(void) #define READONLY() do { \ if (newp != NULL || newlen != 0) { \ ret = EPERM; \ - goto label_return; \ + goto label_return; \ } \ } while (0) #define WRITEONLY() do { \ if (oldp != NULL || oldlenp != NULL) { \ ret = EPERM; \ - goto label_return; \ + goto label_return; \ } \ } while (0) -#define VOID() do { \ - READONLY(); \ - WRITEONLY(); \ -} while (0) - #define READ(v, t) do { \ if (oldp != NULL && oldlenp != NULL) { \ if (*oldlenp != sizeof(t)) { \ @@ -822,7 +851,7 @@ ctl_boot(void) ? sizeof(t) : *oldlenp; \ memcpy(oldp, (void *)&v, copylen); \ ret = EINVAL; \ - goto label_return; \ + goto label_return; \ } else \ *(t *)oldp = v; \ } \ @@ -832,7 +861,7 @@ ctl_boot(void) if (newp != NULL) { \ if (newlen != sizeof(t)) { \ ret = EINVAL; \ - goto label_return; \ + goto label_return; \ } \ v = *(t *)newp; \ } \ @@ -859,7 +888,7 @@ n##_ctl(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, \ READ(oldval, t); \ \ ret = 0; \ -label_return: \ +label_return: \ if (l) \ malloc_mutex_unlock(&ctl_mtx); \ return (ret); \ @@ -881,7 +910,7 @@ n##_ctl(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, \ READ(oldval, t); \ \ ret = 0; \ -label_return: \ +label_return: \ malloc_mutex_unlock(&ctl_mtx); \ return (ret); \ } @@ -900,7 +929,7 @@ n##_ctl(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, \ READ(oldval, t); \ \ ret = 0; \ -label_return: \ +label_return: \ malloc_mutex_unlock(&ctl_mtx); \ return (ret); \ } @@ -924,7 +953,7 @@ n##_ctl(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, \ READ(oldval, t); \ \ ret = 0; \ -label_return: \ +label_return: \ return (ret); \ } @@ -941,7 +970,7 @@ n##_ctl(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, \ READ(oldval, t); \ \ ret = 0; \ -label_return: \ +label_return: \ return (ret); \ } @@ -958,7 +987,7 @@ n##_ctl(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, \ READ(oldval, bool); \ \ ret = 0; \ -label_return: \ +label_return: \ return (ret); \ } @@ -972,9 +1001,8 @@ epoch_ctl(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, uint64_t newval; malloc_mutex_lock(&ctl_mtx); - newval = 0; WRITE(newval, uint64_t); - if (newval != 0) + if (newp != NULL) ctl_refresh(); READ(ctl_epoch, uint64_t); @@ -1018,7 +1046,8 @@ thread_tcache_flush_ctl(const size_t *mib, size_t miblen, void *oldp, if (config_tcache == false) return (ENOENT); - VOID(); + READONLY(); + WRITEONLY(); tcache_flush(); @@ -1091,6 +1120,7 @@ CTL_RO_BOOL_CONFIG_GEN(config_debug) CTL_RO_BOOL_CONFIG_GEN(config_dss) CTL_RO_BOOL_CONFIG_GEN(config_fill) CTL_RO_BOOL_CONFIG_GEN(config_lazy_lock) +CTL_RO_BOOL_CONFIG_GEN(config_mremap) CTL_RO_BOOL_CONFIG_GEN(config_munmap) CTL_RO_BOOL_CONFIG_GEN(config_prof) CTL_RO_BOOL_CONFIG_GEN(config_prof_libgcc) @@ -1133,7 +1163,7 @@ CTL_RO_NL_CGEN(config_prof, opt_prof_accum, opt_prof_accum, bool) CTL_RO_NL_GEN(arenas_bin_i_size, arena_bin_info[mib[2]].reg_size, size_t) CTL_RO_NL_GEN(arenas_bin_i_nregs, arena_bin_info[mib[2]].nregs, uint32_t) CTL_RO_NL_GEN(arenas_bin_i_run_size, arena_bin_info[mib[2]].run_size, size_t) -const ctl_node_t * +const ctl_named_node_t * arenas_bin_i_index(const size_t *mib, size_t miblen, size_t i) { @@ -1143,7 +1173,7 @@ arenas_bin_i_index(const size_t *mib, size_t miblen, size_t i) } CTL_RO_NL_GEN(arenas_lrun_i_size, ((mib[2]+1) << LG_PAGE), size_t) -const ctl_node_t * +const ctl_named_node_t * arenas_lrun_i_index(const size_t *mib, size_t miblen, size_t i) { @@ -1201,7 +1231,7 @@ arenas_purge_ctl(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, ret = EFAULT; goto label_return; } else { - arena_t *tarenas[narenas]; + VARIABLE_ARRAY(arena_t *, tarenas, narenas); malloc_mutex_lock(&arenas_lock); memcpy(tarenas, arenas, sizeof(arena_t *) * narenas); @@ -1326,7 +1356,7 @@ CTL_RO_CGEN(config_stats, stats_arenas_i_bins_j_nreruns, CTL_RO_CGEN(config_stats, stats_arenas_i_bins_j_curruns, ctl_stats.arenas[mib[2]].bstats[mib[4]].curruns, size_t) -const ctl_node_t * +const ctl_named_node_t * stats_arenas_i_bins_j_index(const size_t *mib, size_t miblen, size_t j) { @@ -1344,7 +1374,7 @@ CTL_RO_CGEN(config_stats, stats_arenas_i_lruns_j_nrequests, CTL_RO_CGEN(config_stats, stats_arenas_i_lruns_j_curruns, ctl_stats.arenas[mib[2]].lstats[mib[4]].curruns, size_t) -const ctl_node_t * +const ctl_named_node_t * stats_arenas_i_lruns_j_index(const size_t *mib, size_t miblen, size_t j) { @@ -1365,10 +1395,10 @@ CTL_RO_CGEN(config_stats, stats_arenas_i_nmadvise, CTL_RO_CGEN(config_stats, stats_arenas_i_purged, ctl_stats.arenas[mib[2]].astats.purged, uint64_t) -const ctl_node_t * +const ctl_named_node_t * stats_arenas_i_index(const size_t *mib, size_t miblen, size_t i) { - const ctl_node_t * ret; + const ctl_named_node_t * ret; malloc_mutex_lock(&ctl_mtx); if (ctl_stats.arenas[i].initialized == false) { diff --git a/contrib/jemalloc/src/huge.c b/contrib/jemalloc/src/huge.c index 23eb074ac53..8a4ec942410 100644 --- a/contrib/jemalloc/src/huge.c +++ b/contrib/jemalloc/src/huge.c @@ -140,11 +140,11 @@ huge_ralloc(void *ptr, size_t oldsize, size_t size, size_t extra, */ copysize = (size < oldsize) ? size : oldsize; +#ifdef JEMALLOC_MREMAP /* * Use mremap(2) if this is a huge-->huge reallocation, and neither the * source nor the destination are in dss. */ -#ifdef JEMALLOC_MREMAP_FIXED if (oldsize >= chunksize && (config_dss == false || (chunk_in_dss(ptr) == false && chunk_in_dss(ret) == false))) { size_t newsize = huge_salloc(ret); @@ -168,7 +168,7 @@ huge_ralloc(void *ptr, size_t oldsize, size_t size, size_t extra, */ char buf[BUFERROR_BUF]; - buferror(errno, buf, sizeof(buf)); + buferror(buf, sizeof(buf)); malloc_printf(": Error in mremap(): %s\n", buf); if (opt_abort) diff --git a/contrib/jemalloc/src/jemalloc.c b/contrib/jemalloc/src/jemalloc.c index 9292d26f6fb..fa9fcf0fbd3 100644 --- a/contrib/jemalloc/src/jemalloc.c +++ b/contrib/jemalloc/src/jemalloc.c @@ -13,7 +13,7 @@ const char *__malloc_options_1_0 = NULL; __sym_compat(_malloc_options, __malloc_options_1_0, FBSD_1.0); /* Runtime configuration options. */ -const char *je_malloc_conf JEMALLOC_ATTR(visibility("default")); +const char *je_malloc_conf; #ifdef JEMALLOC_DEBUG bool opt_abort = true; # ifdef JEMALLOC_FILL @@ -56,7 +56,26 @@ static bool malloc_initializer = NO_INITIALIZER; #endif /* Used to avoid initialization races. */ +#ifdef _WIN32 +static malloc_mutex_t init_lock; + +JEMALLOC_ATTR(constructor) +static void WINAPI +_init_init_lock(void) +{ + + malloc_mutex_init(&init_lock); +} + +#ifdef _MSC_VER +# pragma section(".CRT$XCU", read) +JEMALLOC_SECTION(".CRT$XCU") JEMALLOC_ATTR(used) +static const void (WINAPI *init_init_lock)(void) = _init_init_lock; +#endif + +#else static malloc_mutex_t init_lock = MALLOC_MUTEX_INITIALIZER; +#endif typedef struct { void *p; /* Input pointer (as in realloc(p, s)). */ @@ -233,11 +252,17 @@ malloc_ncpus(void) unsigned ret; long result; +#ifdef _WIN32 + SYSTEM_INFO si; + GetSystemInfo(&si); + result = si.dwNumberOfProcessors; +#else result = sysconf(_SC_NPROCESSORS_ONLN); if (result == -1) { /* Error. */ ret = 1; } +#endif ret = (unsigned)result; return (ret); @@ -373,13 +398,14 @@ malloc_conf_init(void) } break; case 1: { +#ifndef _WIN32 int linklen; const char *linkname = -#ifdef JEMALLOC_PREFIX +# ifdef JEMALLOC_PREFIX "/etc/"JEMALLOC_PREFIX"malloc.conf" -#else +# else "/etc/malloc.conf" -#endif +# endif ; if ((linklen = readlink(linkname, buf, @@ -390,7 +416,9 @@ malloc_conf_init(void) */ buf[linklen] = '\0'; opts = buf; - } else { + } else +#endif + { /* No configuration specified. */ buf[0] = '\0'; opts = buf; @@ -456,9 +484,9 @@ malloc_conf_init(void) uintmax_t um; \ char *end; \ \ - errno = 0; \ + set_errno(0); \ um = malloc_strtoumax(v, &end, 0); \ - if (errno != 0 || (uintptr_t)end - \ + if (get_errno() != 0 || (uintptr_t)end -\ (uintptr_t)v != vlen) { \ malloc_conf_error( \ "Invalid conf value", \ @@ -477,9 +505,9 @@ malloc_conf_init(void) long l; \ char *end; \ \ - errno = 0; \ + set_errno(0); \ l = strtol(v, &end, 0); \ - if (errno != 0 || (uintptr_t)end - \ + if (get_errno() != 0 || (uintptr_t)end -\ (uintptr_t)v != vlen) { \ malloc_conf_error( \ "Invalid conf value", \ @@ -615,7 +643,8 @@ malloc_init_hard(void) malloc_conf_init(); -#if (!defined(JEMALLOC_MUTEX_INIT_CB) && !defined(JEMALLOC_ZONE)) +#if (!defined(JEMALLOC_MUTEX_INIT_CB) && !defined(JEMALLOC_ZONE) \ + && !defined(_WIN32)) /* Register fork handlers. */ if (pthread_atfork(jemalloc_prefork, jemalloc_postfork_parent, jemalloc_postfork_child) != 0) { @@ -770,13 +799,11 @@ malloc_init_hard(void) * Begin malloc(3)-compatible functions. */ -JEMALLOC_ATTR(malloc) -JEMALLOC_ATTR(visibility("default")) void * je_malloc(size_t size) { void *ret; - size_t usize; + size_t usize JEMALLOC_CC_SILENCE_INIT(0); prof_thr_cnt_t *cnt JEMALLOC_CC_SILENCE_INIT(NULL); if (malloc_init()) { @@ -814,7 +841,7 @@ label_oom: "out of memory\n"); abort(); } - errno = ENOMEM; + set_errno(ENOMEM); } if (config_prof && opt_prof && ret != NULL) prof_malloc(ret, usize, cnt); @@ -921,8 +948,6 @@ label_return: return (ret); } -JEMALLOC_ATTR(nonnull(1)) -JEMALLOC_ATTR(visibility("default")) int je_posix_memalign(void **memptr, size_t alignment, size_t size) { @@ -932,8 +957,6 @@ je_posix_memalign(void **memptr, size_t alignment, size_t size) return (ret); } -JEMALLOC_ATTR(malloc) -JEMALLOC_ATTR(visibility("default")) void * je_aligned_alloc(size_t alignment, size_t size) { @@ -942,21 +965,19 @@ je_aligned_alloc(size_t alignment, size_t size) if ((err = imemalign(&ret, alignment, size, 1)) != 0) { ret = NULL; - errno = err; + set_errno(err); } JEMALLOC_VALGRIND_MALLOC(err == 0, ret, isalloc(ret, config_prof), false); return (ret); } -JEMALLOC_ATTR(malloc) -JEMALLOC_ATTR(visibility("default")) void * je_calloc(size_t num, size_t size) { void *ret; size_t num_size; - size_t usize; + size_t usize JEMALLOC_CC_SILENCE_INIT(0); prof_thr_cnt_t *cnt JEMALLOC_CC_SILENCE_INIT(NULL); if (malloc_init()) { @@ -1012,7 +1033,7 @@ label_return: "memory\n"); abort(); } - errno = ENOMEM; + set_errno(ENOMEM); } if (config_prof && opt_prof && ret != NULL) @@ -1026,12 +1047,11 @@ label_return: return (ret); } -JEMALLOC_ATTR(visibility("default")) void * je_realloc(void *ptr, size_t size) { void *ret; - size_t usize; + size_t usize JEMALLOC_CC_SILENCE_INIT(0); size_t old_size = 0; size_t old_rzsize JEMALLOC_CC_SILENCE_INIT(0); prof_thr_cnt_t *cnt JEMALLOC_CC_SILENCE_INIT(NULL); @@ -1113,7 +1133,7 @@ label_oom: "out of memory\n"); abort(); } - errno = ENOMEM; + set_errno(ENOMEM); } } else { /* realloc(NULL, size) is equivalent to malloc(size). */ @@ -1155,7 +1175,7 @@ label_oom: "out of memory\n"); abort(); } - errno = ENOMEM; + set_errno(ENOMEM); } } @@ -1174,7 +1194,6 @@ label_return: return (ret); } -JEMALLOC_ATTR(visibility("default")) void je_free(void *ptr) { @@ -1209,8 +1228,6 @@ je_free(void *ptr) */ #ifdef JEMALLOC_OVERRIDE_MEMALIGN -JEMALLOC_ATTR(malloc) -JEMALLOC_ATTR(visibility("default")) void * je_memalign(size_t alignment, size_t size) { @@ -1222,8 +1239,6 @@ je_memalign(size_t alignment, size_t size) #endif #ifdef JEMALLOC_OVERRIDE_VALLOC -JEMALLOC_ATTR(malloc) -JEMALLOC_ATTR(visibility("default")) void * je_valloc(size_t size) { @@ -1252,17 +1267,12 @@ je_valloc(size_t size) * passed an extra argument for the caller return address, which will be * ignored. */ -JEMALLOC_ATTR(visibility("default")) -void (* const __free_hook)(void *ptr) = je_free; - -JEMALLOC_ATTR(visibility("default")) -void *(* const __malloc_hook)(size_t size) = je_malloc; - -JEMALLOC_ATTR(visibility("default")) -void *(* const __realloc_hook)(void *ptr, size_t size) = je_realloc; - -JEMALLOC_ATTR(visibility("default")) -void *(* const __memalign_hook)(size_t alignment, size_t size) = je_memalign; +JEMALLOC_EXPORT void (* const __free_hook)(void *ptr) = je_free; +JEMALLOC_EXPORT void *(* const __malloc_hook)(size_t size) = je_malloc; +JEMALLOC_EXPORT void *(* const __realloc_hook)(void *ptr, size_t size) = + je_realloc; +JEMALLOC_EXPORT void *(* const __memalign_hook)(size_t alignment, size_t size) = + je_memalign; #endif /* @@ -1273,7 +1283,6 @@ void *(* const __memalign_hook)(size_t alignment, size_t size) = je_memalign; * Begin non-standard functions. */ -JEMALLOC_ATTR(visibility("default")) size_t je_malloc_usable_size(const void *ptr) { @@ -1289,7 +1298,6 @@ je_malloc_usable_size(const void *ptr) return (ret); } -JEMALLOC_ATTR(visibility("default")) void je_malloc_stats_print(void (*write_cb)(void *, const char *), void *cbopaque, const char *opts) @@ -1298,7 +1306,6 @@ je_malloc_stats_print(void (*write_cb)(void *, const char *), void *cbopaque, stats_print(write_cb, cbopaque, opts); } -JEMALLOC_ATTR(visibility("default")) int je_mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen) @@ -1310,7 +1317,6 @@ je_mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, return (ctl_byname(name, oldp, oldlenp, newp, newlen)); } -JEMALLOC_ATTR(visibility("default")) int je_mallctlnametomib(const char *name, size_t *mibp, size_t *miblenp) { @@ -1321,7 +1327,6 @@ je_mallctlnametomib(const char *name, size_t *mibp, size_t *miblenp) return (ctl_nametomib(name, mibp, miblenp)); } -JEMALLOC_ATTR(visibility("default")) int je_mallctlbymib(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) @@ -1357,8 +1362,6 @@ iallocm(size_t usize, size_t alignment, bool zero) return (imalloc(usize)); } -JEMALLOC_ATTR(nonnull(1)) -JEMALLOC_ATTR(visibility("default")) int je_allocm(void **ptr, size_t *rsize, size_t size, int flags) { @@ -1367,7 +1370,6 @@ je_allocm(void **ptr, size_t *rsize, size_t size, int flags) size_t alignment = (ZU(1) << (flags & ALLOCM_LG_ALIGN_MASK) & (SIZE_T_MAX-1)); bool zero = flags & ALLOCM_ZERO; - prof_thr_cnt_t *cnt; assert(ptr != NULL); assert(size != 0); @@ -1380,6 +1382,8 @@ je_allocm(void **ptr, size_t *rsize, size_t size, int flags) goto label_oom; if (config_prof && opt_prof) { + prof_thr_cnt_t *cnt; + PROF_ALLOC_PREP(1, usize, cnt); if (cnt == NULL) goto label_oom; @@ -1426,8 +1430,6 @@ label_oom: return (ALLOCM_ERR_OOM); } -JEMALLOC_ATTR(nonnull(1)) -JEMALLOC_ATTR(visibility("default")) int je_rallocm(void **ptr, size_t *rsize, size_t size, size_t extra, int flags) { @@ -1439,7 +1441,6 @@ je_rallocm(void **ptr, size_t *rsize, size_t size, size_t extra, int flags) & (SIZE_T_MAX-1)); bool zero = flags & ALLOCM_ZERO; bool no_move = flags & ALLOCM_NO_MOVE; - prof_thr_cnt_t *cnt; assert(ptr != NULL); assert(*ptr != NULL); @@ -1449,6 +1450,8 @@ je_rallocm(void **ptr, size_t *rsize, size_t size, size_t extra, int flags) p = *ptr; if (config_prof && opt_prof) { + prof_thr_cnt_t *cnt; + /* * usize isn't knowable before iralloc() returns when extra is * non-zero. Therefore, compute its maximum possible value and @@ -1536,8 +1539,6 @@ label_oom: return (ALLOCM_ERR_OOM); } -JEMALLOC_ATTR(nonnull(1)) -JEMALLOC_ATTR(visibility("default")) int je_sallocm(const void *ptr, size_t *rsize, int flags) { @@ -1557,8 +1558,6 @@ je_sallocm(const void *ptr, size_t *rsize, int flags) return (ALLOCM_SUCCESS); } -JEMALLOC_ATTR(nonnull(1)) -JEMALLOC_ATTR(visibility("default")) int je_dallocm(void *ptr, int flags) { @@ -1586,7 +1585,6 @@ je_dallocm(void *ptr, int flags) return (ALLOCM_SUCCESS); } -JEMALLOC_ATTR(visibility("default")) int je_nallocm(size_t *rsize, size_t size, int flags) { @@ -1622,13 +1620,18 @@ je_nallocm(size_t *rsize, size_t size, int flags) void jemalloc_prefork(void) #else -JEMALLOC_ATTR(visibility("default")) -void +JEMALLOC_EXPORT void _malloc_prefork(void) #endif { unsigned i; +#ifdef JEMALLOC_MUTEX_INIT_CB + if (malloc_initialized == false) + return; +#endif + assert(malloc_initialized); + /* Acquire all mutexes in a safe order. */ malloc_mutex_prefork(&arenas_lock); for (i = 0; i < narenas; i++) { @@ -1644,13 +1647,18 @@ _malloc_prefork(void) void jemalloc_postfork_parent(void) #else -JEMALLOC_ATTR(visibility("default")) -void +JEMALLOC_EXPORT void _malloc_postfork(void) #endif { unsigned i; +#ifdef JEMALLOC_MUTEX_INIT_CB + if (malloc_initialized == false) + return; +#endif + assert(malloc_initialized); + /* Release all mutexes, now that fork() has completed. */ chunk_dss_postfork_parent(); huge_postfork_parent(); @@ -1667,6 +1675,8 @@ jemalloc_postfork_child(void) { unsigned i; + assert(malloc_initialized); + /* Release all mutexes, now that fork() has completed. */ chunk_dss_postfork_child(); huge_postfork_child(); diff --git a/contrib/jemalloc/src/mutex.c b/contrib/jemalloc/src/mutex.c index 7be5fc9ef10..4a90a05e984 100644 --- a/contrib/jemalloc/src/mutex.c +++ b/contrib/jemalloc/src/mutex.c @@ -1,10 +1,14 @@ #define JEMALLOC_MUTEX_C_ #include "jemalloc/internal/jemalloc_internal.h" -#ifdef JEMALLOC_LAZY_LOCK +#if defined(JEMALLOC_LAZY_LOCK) && !defined(_WIN32) #include #endif +#ifndef _CRT_SPINCOUNT +#define _CRT_SPINCOUNT 4000 +#endif + /******************************************************************************/ /* Data. */ @@ -16,7 +20,7 @@ static bool postpone_init = true; static malloc_mutex_t *postponed_mutexes = NULL; #endif -#ifdef JEMALLOC_LAZY_LOCK +#if defined(JEMALLOC_LAZY_LOCK) && !defined(_WIN32) static void pthread_create_once(void); #endif @@ -26,7 +30,7 @@ static void pthread_create_once(void); * process goes multi-threaded. */ -#ifdef JEMALLOC_LAZY_LOCK +#if defined(JEMALLOC_LAZY_LOCK) && !defined(_WIN32) static int (*pthread_create_fptr)(pthread_t *__restrict, const pthread_attr_t *, void *(*)(void *), void *__restrict); @@ -44,8 +48,7 @@ pthread_create_once(void) isthreaded = true; } -JEMALLOC_ATTR(visibility("default")) -int +JEMALLOC_EXPORT int pthread_create(pthread_t *__restrict thread, const pthread_attr_t *__restrict attr, void *(*start_routine)(void *), void *__restrict arg) @@ -79,7 +82,12 @@ _pthread_mutex_init_calloc_cb_stub(pthread_mutex_t *mutex, bool malloc_mutex_init(malloc_mutex_t *mutex) { -#ifdef JEMALLOC_OSSPIN + +#ifdef _WIN32 + if (!InitializeCriticalSectionAndSpinCount(&mutex->lock, + _CRT_SPINCOUNT)) + return (true); +#elif (defined(JEMALLOC_OSSPIN)) mutex->lock = 0; #elif (defined(JEMALLOC_MUTEX_INIT_CB)) if (postpone_init) { @@ -101,7 +109,6 @@ malloc_mutex_init(malloc_mutex_t *mutex) return (true); } pthread_mutexattr_destroy(&attr); - #endif return (false); } diff --git a/contrib/jemalloc/src/prof.c b/contrib/jemalloc/src/prof.c index 227560b8fce..de1d392993e 100644 --- a/contrib/jemalloc/src/prof.c +++ b/contrib/jemalloc/src/prof.c @@ -64,11 +64,6 @@ static int prof_dump_fd; /* Do not dump any profiles until bootstrapping is complete. */ static bool prof_booted = false; -static malloc_mutex_t enq_mtx; -static bool enq; -static bool enq_idump; -static bool enq_gdump; - /******************************************************************************/ /* Function prototypes for non-inline static functions. */ @@ -148,20 +143,19 @@ bt_dup(prof_bt_t *bt) } static inline void -prof_enter(void) +prof_enter(prof_tdata_t *prof_tdata) { cassert(config_prof); - malloc_mutex_lock(&enq_mtx); - enq = true; - malloc_mutex_unlock(&enq_mtx); + assert(prof_tdata->enq == false); + prof_tdata->enq = true; malloc_mutex_lock(&bt2ctx_mtx); } static inline void -prof_leave(void) +prof_leave(prof_tdata_t *prof_tdata) { bool idump, gdump; @@ -169,13 +163,12 @@ prof_leave(void) malloc_mutex_unlock(&bt2ctx_mtx); - malloc_mutex_lock(&enq_mtx); - enq = false; - idump = enq_idump; - enq_idump = false; - gdump = enq_gdump; - enq_gdump = false; - malloc_mutex_unlock(&enq_mtx); + assert(prof_tdata->enq); + prof_tdata->enq = false; + idump = prof_tdata->enq_idump; + prof_tdata->enq_idump = false; + gdump = prof_tdata->enq_gdump; + prof_tdata->enq_gdump = false; if (idump) prof_idump(); @@ -446,12 +439,9 @@ prof_lookup(prof_bt_t *bt) cassert(config_prof); - prof_tdata = *prof_tdata_tsd_get(); - if (prof_tdata == NULL) { - prof_tdata = prof_tdata_init(); - if (prof_tdata == NULL) - return (NULL); - } + prof_tdata = prof_tdata_get(); + if ((uintptr_t)prof_tdata <= (uintptr_t)PROF_TDATA_STATE_MAX) + return (NULL); if (ckh_search(&prof_tdata->bt2cnt, bt, NULL, &ret.v)) { union { @@ -468,52 +458,48 @@ prof_lookup(prof_bt_t *bt) * This thread's cache lacks bt. Look for it in the global * cache. */ - prof_enter(); + prof_enter(prof_tdata); if (ckh_search(&bt2ctx, bt, &btkey.v, &ctx.v)) { /* bt has never been seen before. Insert it. */ ctx.v = imalloc(sizeof(prof_ctx_t)); if (ctx.v == NULL) { - prof_leave(); + prof_leave(prof_tdata); return (NULL); } btkey.p = bt_dup(bt); if (btkey.v == NULL) { - prof_leave(); + prof_leave(prof_tdata); idalloc(ctx.v); return (NULL); } ctx.p->bt = btkey.p; ctx.p->lock = prof_ctx_mutex_choose(); + /* + * Set nlimbo to 1, in order to avoid a race condition + * with prof_ctx_merge()/prof_ctx_destroy(). + */ + ctx.p->nlimbo = 1; memset(&ctx.p->cnt_merged, 0, sizeof(prof_cnt_t)); ql_new(&ctx.p->cnts_ql); if (ckh_insert(&bt2ctx, btkey.v, ctx.v)) { /* OOM. */ - prof_leave(); + prof_leave(prof_tdata); idalloc(btkey.v); idalloc(ctx.v); return (NULL); } - /* - * Artificially raise curobjs, in order to avoid a race - * condition with prof_ctx_merge()/prof_ctx_destroy(). - * - * No locking is necessary for ctx here because no other - * threads have had the opportunity to fetch it from - * bt2ctx yet. - */ - ctx.p->cnt_merged.curobjs++; new_ctx = true; } else { /* - * Artificially raise curobjs, in order to avoid a race - * condition with prof_ctx_merge()/prof_ctx_destroy(). + * Increment nlimbo, in order to avoid a race condition + * with prof_ctx_merge()/prof_ctx_destroy(). */ malloc_mutex_lock(ctx.p->lock); - ctx.p->cnt_merged.curobjs++; + ctx.p->nlimbo++; malloc_mutex_unlock(ctx.p->lock); new_ctx = false; } - prof_leave(); + prof_leave(prof_tdata); /* Link a prof_thd_cnt_t into ctx for this thread. */ if (ckh_count(&prof_tdata->bt2cnt) == PROF_TCMAX) { @@ -555,7 +541,7 @@ prof_lookup(prof_bt_t *bt) ql_head_insert(&prof_tdata->lru_ql, ret.p, lru_link); malloc_mutex_lock(ctx.p->lock); ql_tail_insert(&ctx.p->cnts_ql, ret.p, cnts_link); - ctx.p->cnt_merged.curobjs--; + ctx.p->nlimbo--; malloc_mutex_unlock(ctx.p->lock); } else { /* Move ret to the front of the LRU. */ @@ -688,26 +674,30 @@ prof_ctx_sum(prof_ctx_t *ctx, prof_cnt_t *cnt_all, size_t *leak_nctx) static void prof_ctx_destroy(prof_ctx_t *ctx) { + prof_tdata_t *prof_tdata; cassert(config_prof); /* * Check that ctx is still unused by any thread cache before destroying - * it. prof_lookup() artificially raises ctx->cnt_merge.curobjs in - * order to avoid a race condition with this function, as does - * prof_ctx_merge() in order to avoid a race between the main body of - * prof_ctx_merge() and entry into this function. + * it. prof_lookup() increments ctx->nlimbo in order to avoid a race + * condition with this function, as does prof_ctx_merge() in order to + * avoid a race between the main body of prof_ctx_merge() and entry + * into this function. */ - prof_enter(); + prof_tdata = *prof_tdata_tsd_get(); + assert((uintptr_t)prof_tdata > (uintptr_t)PROF_TDATA_STATE_MAX); + prof_enter(prof_tdata); malloc_mutex_lock(ctx->lock); - if (ql_first(&ctx->cnts_ql) == NULL && ctx->cnt_merged.curobjs == 1) { + if (ql_first(&ctx->cnts_ql) == NULL && ctx->cnt_merged.curobjs == 0 && + ctx->nlimbo == 1) { assert(ctx->cnt_merged.curbytes == 0); assert(ctx->cnt_merged.accumobjs == 0); assert(ctx->cnt_merged.accumbytes == 0); /* Remove ctx from bt2ctx. */ if (ckh_remove(&bt2ctx, ctx->bt, NULL, NULL)) assert(false); - prof_leave(); + prof_leave(prof_tdata); /* Destroy ctx. */ malloc_mutex_unlock(ctx->lock); bt_destroy(ctx->bt); @@ -717,9 +707,9 @@ prof_ctx_destroy(prof_ctx_t *ctx) * Compensate for increment in prof_ctx_merge() or * prof_lookup(). */ - ctx->cnt_merged.curobjs--; + ctx->nlimbo--; malloc_mutex_unlock(ctx->lock); - prof_leave(); + prof_leave(prof_tdata); } } @@ -738,12 +728,12 @@ prof_ctx_merge(prof_ctx_t *ctx, prof_thr_cnt_t *cnt) ctx->cnt_merged.accumbytes += cnt->cnts.accumbytes; ql_remove(&ctx->cnts_ql, cnt, cnts_link); if (opt_prof_accum == false && ql_first(&ctx->cnts_ql) == NULL && - ctx->cnt_merged.curobjs == 0) { + ctx->cnt_merged.curobjs == 0 && ctx->nlimbo == 0) { /* - * Artificially raise ctx->cnt_merged.curobjs in order to keep - * another thread from winning the race to destroy ctx while - * this one has ctx->lock dropped. Without this, it would be - * possible for another thread to: + * Increment ctx->nlimbo in order to keep another thread from + * winning the race to destroy ctx while this one has ctx->lock + * dropped. Without this, it would be possible for another + * thread to: * * 1) Sample an allocation associated with ctx. * 2) Deallocate the sampled object. @@ -752,7 +742,7 @@ prof_ctx_merge(prof_ctx_t *ctx, prof_thr_cnt_t *cnt) * The result would be that ctx no longer exists by the time * this thread accesses it in prof_ctx_destroy(). */ - ctx->cnt_merged.curobjs++; + ctx->nlimbo++; destroy = true; } else destroy = false; @@ -768,7 +758,16 @@ prof_dump_ctx(bool propagate_err, prof_ctx_t *ctx, prof_bt_t *bt) cassert(config_prof); - if (opt_prof_accum == false && ctx->cnt_summed.curobjs == 0) { + /* + * Current statistics can sum to 0 as a result of unmerged per thread + * statistics. Additionally, interval- and growth-triggered dumps can + * occur between the time a ctx is created and when its statistics are + * filled in. Avoid dumping any ctx that is an artifact of either + * implementation detail. + */ + if ((opt_prof_accum == false && ctx->cnt_summed.curobjs == 0) || + (opt_prof_accum && ctx->cnt_summed.accumobjs == 0)) { + assert(ctx->cnt_summed.curobjs == 0); assert(ctx->cnt_summed.curbytes == 0); assert(ctx->cnt_summed.accumobjs == 0); assert(ctx->cnt_summed.accumbytes == 0); @@ -831,6 +830,7 @@ prof_dump_maps(bool propagate_err) static bool prof_dump(bool propagate_err, const char *filename, bool leakcheck) { + prof_tdata_t *prof_tdata; prof_cnt_t cnt_all; size_t tabind; union { @@ -845,7 +845,10 @@ prof_dump(bool propagate_err, const char *filename, bool leakcheck) cassert(config_prof); - prof_enter(); + prof_tdata = prof_tdata_get(); + if ((uintptr_t)prof_tdata <= (uintptr_t)PROF_TDATA_STATE_MAX) + return (true); + prof_enter(prof_tdata); prof_dump_fd = creat(filename, 0644); if (prof_dump_fd == -1) { if (propagate_err == false) { @@ -896,7 +899,7 @@ prof_dump(bool propagate_err, const char *filename, bool leakcheck) if (prof_flush(propagate_err)) goto label_error; close(prof_dump_fd); - prof_leave(); + prof_leave(prof_tdata); if (leakcheck && cnt_all.curbytes != 0) { malloc_printf(": Leak summary: %"PRId64" byte%s, %" @@ -911,7 +914,7 @@ prof_dump(bool propagate_err, const char *filename, bool leakcheck) return (false); label_error: - prof_leave(); + prof_leave(prof_tdata); return (true); } @@ -933,6 +936,7 @@ prof_dump_filename(char *filename, char v, int64_t vseq) "%s.%d.%"PRIu64".%c.heap", opt_prof_prefix, (int)getpid(), prof_dump_seq, v); } + prof_dump_seq++; } static void @@ -956,19 +960,24 @@ prof_fdump(void) void prof_idump(void) { + prof_tdata_t *prof_tdata; char filename[PATH_MAX + 1]; cassert(config_prof); if (prof_booted == false) return; - malloc_mutex_lock(&enq_mtx); - if (enq) { - enq_idump = true; - malloc_mutex_unlock(&enq_mtx); + /* + * Don't call prof_tdata_get() here, because it could cause recursive + * allocation. + */ + prof_tdata = *prof_tdata_tsd_get(); + if ((uintptr_t)prof_tdata <= (uintptr_t)PROF_TDATA_STATE_MAX) + return; + if (prof_tdata->enq) { + prof_tdata->enq_idump = true; return; } - malloc_mutex_unlock(&enq_mtx); if (opt_prof_prefix[0] != '\0') { malloc_mutex_lock(&prof_dump_seq_mtx); @@ -1005,19 +1014,24 @@ prof_mdump(const char *filename) void prof_gdump(void) { + prof_tdata_t *prof_tdata; char filename[DUMP_FILENAME_BUFSIZE]; cassert(config_prof); if (prof_booted == false) return; - malloc_mutex_lock(&enq_mtx); - if (enq) { - enq_gdump = true; - malloc_mutex_unlock(&enq_mtx); + /* + * Don't call prof_tdata_get() here, because it could cause recursive + * allocation. + */ + prof_tdata = *prof_tdata_tsd_get(); + if ((uintptr_t)prof_tdata <= (uintptr_t)PROF_TDATA_STATE_MAX) + return; + if (prof_tdata->enq) { + prof_tdata->enq_gdump = true; return; } - malloc_mutex_unlock(&enq_mtx); if (opt_prof_prefix[0] != '\0') { malloc_mutex_lock(&prof_dump_seq_mtx); @@ -1110,6 +1124,10 @@ prof_tdata_init(void) prof_tdata->threshold = 0; prof_tdata->accum = 0; + prof_tdata->enq = false; + prof_tdata->enq_idump = false; + prof_tdata->enq_gdump = false; + prof_tdata_tsd_set(&prof_tdata); return (prof_tdata); @@ -1123,24 +1141,41 @@ prof_tdata_cleanup(void *arg) cassert(config_prof); - /* - * Delete the hash table. All of its contents can still be iterated - * over via the LRU. - */ - ckh_delete(&prof_tdata->bt2cnt); - - /* Iteratively merge cnt's into the global stats and delete them. */ - while ((cnt = ql_last(&prof_tdata->lru_ql, lru_link)) != NULL) { - ql_remove(&prof_tdata->lru_ql, cnt, lru_link); - prof_ctx_merge(cnt->ctx, cnt); - idalloc(cnt); + if (prof_tdata == PROF_TDATA_STATE_REINCARNATED) { + /* + * Another destructor deallocated memory after this destructor + * was called. Reset prof_tdata to PROF_TDATA_STATE_PURGATORY + * in order to receive another callback. + */ + prof_tdata = PROF_TDATA_STATE_PURGATORY; + prof_tdata_tsd_set(&prof_tdata); + } else if (prof_tdata == PROF_TDATA_STATE_PURGATORY) { + /* + * The previous time this destructor was called, we set the key + * to PROF_TDATA_STATE_PURGATORY so that other destructors + * wouldn't cause re-creation of the prof_tdata. This time, do + * nothing, so that the destructor will not be called again. + */ + } else if (prof_tdata != NULL) { + /* + * Delete the hash table. All of its contents can still be + * iterated over via the LRU. + */ + ckh_delete(&prof_tdata->bt2cnt); + /* + * Iteratively merge cnt's into the global stats and delete + * them. + */ + while ((cnt = ql_last(&prof_tdata->lru_ql, lru_link)) != NULL) { + ql_remove(&prof_tdata->lru_ql, cnt, lru_link); + prof_ctx_merge(cnt->ctx, cnt); + idalloc(cnt); + } + idalloc(prof_tdata->vec); + idalloc(prof_tdata); + prof_tdata = PROF_TDATA_STATE_PURGATORY; + prof_tdata_tsd_set(&prof_tdata); } - - idalloc(prof_tdata->vec); - - idalloc(prof_tdata); - prof_tdata = NULL; - prof_tdata_tsd_set(&prof_tdata); } void @@ -1206,12 +1241,6 @@ prof_boot2(void) if (malloc_mutex_init(&prof_dump_seq_mtx)) return (true); - if (malloc_mutex_init(&enq_mtx)) - return (true); - enq = false; - enq_idump = false; - enq_gdump = false; - if (atexit(prof_fdump) != 0) { malloc_write(": Error in atexit()\n"); if (opt_abort) diff --git a/contrib/jemalloc/src/quarantine.c b/contrib/jemalloc/src/quarantine.c index 5fb6c390c41..9005ab3ba06 100644 --- a/contrib/jemalloc/src/quarantine.c +++ b/contrib/jemalloc/src/quarantine.c @@ -1,17 +1,31 @@ #include "jemalloc/internal/jemalloc_internal.h" +/* + * quarantine pointers close to NULL are used to encode state information that + * is used for cleaning up during thread shutdown. + */ +#define QUARANTINE_STATE_REINCARNATED ((quarantine_t *)(uintptr_t)1) +#define QUARANTINE_STATE_PURGATORY ((quarantine_t *)(uintptr_t)2) +#define QUARANTINE_STATE_MAX QUARANTINE_STATE_PURGATORY + /******************************************************************************/ /* Data. */ +typedef struct quarantine_obj_s quarantine_obj_t; typedef struct quarantine_s quarantine_t; +struct quarantine_obj_s { + void *ptr; + size_t usize; +}; + struct quarantine_s { - size_t curbytes; - size_t curobjs; - size_t first; + size_t curbytes; + size_t curobjs; + size_t first; #define LG_MAXOBJS_INIT 10 - size_t lg_maxobjs; - void *objs[1]; /* Dynamically sized ring buffer. */ + size_t lg_maxobjs; + quarantine_obj_t objs[1]; /* Dynamically sized ring buffer. */ }; static void quarantine_cleanup(void *arg); @@ -35,7 +49,7 @@ quarantine_init(size_t lg_maxobjs) quarantine_t *quarantine; quarantine = (quarantine_t *)imalloc(offsetof(quarantine_t, objs) + - ((ZU(1) << lg_maxobjs) * sizeof(void *))); + ((ZU(1) << lg_maxobjs) * sizeof(quarantine_obj_t))); if (quarantine == NULL) return (NULL); quarantine->curbytes = 0; @@ -58,23 +72,22 @@ quarantine_grow(quarantine_t *quarantine) return (quarantine); ret->curbytes = quarantine->curbytes; - if (quarantine->first + quarantine->curobjs < (ZU(1) << + ret->curobjs = quarantine->curobjs; + if (quarantine->first + quarantine->curobjs <= (ZU(1) << quarantine->lg_maxobjs)) { /* objs ring buffer data are contiguous. */ memcpy(ret->objs, &quarantine->objs[quarantine->first], - quarantine->curobjs * sizeof(void *)); - ret->curobjs = quarantine->curobjs; + quarantine->curobjs * sizeof(quarantine_obj_t)); } else { /* objs ring buffer data wrap around. */ - size_t ncopy = (ZU(1) << quarantine->lg_maxobjs) - + size_t ncopy_a = (ZU(1) << quarantine->lg_maxobjs) - quarantine->first; - memcpy(ret->objs, &quarantine->objs[quarantine->first], ncopy * - sizeof(void *)); - ret->curobjs = ncopy; - if (quarantine->curobjs != 0) { - memcpy(&ret->objs[ret->curobjs], quarantine->objs, - quarantine->curobjs - ncopy); - } + size_t ncopy_b = quarantine->curobjs - ncopy_a; + + memcpy(ret->objs, &quarantine->objs[quarantine->first], ncopy_a + * sizeof(quarantine_obj_t)); + memcpy(&ret->objs[ncopy_a], quarantine->objs, ncopy_b * + sizeof(quarantine_obj_t)); } return (ret); @@ -85,10 +98,10 @@ quarantine_drain(quarantine_t *quarantine, size_t upper_bound) { while (quarantine->curbytes > upper_bound && quarantine->curobjs > 0) { - void *ptr = quarantine->objs[quarantine->first]; - size_t usize = isalloc(ptr, config_prof); - idalloc(ptr); - quarantine->curbytes -= usize; + quarantine_obj_t *obj = &quarantine->objs[quarantine->first]; + assert(obj->usize == isalloc(obj->ptr, config_prof)); + idalloc(obj->ptr); + quarantine->curbytes -= obj->usize; quarantine->curobjs--; quarantine->first = (quarantine->first + 1) & ((ZU(1) << quarantine->lg_maxobjs) - 1); @@ -105,10 +118,25 @@ quarantine(void *ptr) assert(opt_quarantine); quarantine = *quarantine_tsd_get(); - if (quarantine == NULL && (quarantine = - quarantine_init(LG_MAXOBJS_INIT)) == NULL) { - idalloc(ptr); - return; + if ((uintptr_t)quarantine <= (uintptr_t)QUARANTINE_STATE_MAX) { + if (quarantine == NULL) { + if ((quarantine = quarantine_init(LG_MAXOBJS_INIT)) == + NULL) { + idalloc(ptr); + return; + } + } else { + if (quarantine == QUARANTINE_STATE_PURGATORY) { + /* + * Make a note that quarantine() was called + * after quarantine_cleanup() was called. + */ + quarantine = QUARANTINE_STATE_REINCARNATED; + quarantine_tsd_set(&quarantine); + } + idalloc(ptr); + return; + } } /* * Drain one or more objects if the quarantine size limit would be @@ -128,7 +156,9 @@ quarantine(void *ptr) if (quarantine->curbytes + usize <= opt_quarantine) { size_t offset = (quarantine->first + quarantine->curobjs) & ((ZU(1) << quarantine->lg_maxobjs) - 1); - quarantine->objs[offset] = ptr; + quarantine_obj_t *obj = &quarantine->objs[offset]; + obj->ptr = ptr; + obj->usize = usize; quarantine->curbytes += usize; quarantine->curobjs++; if (opt_junk) @@ -144,9 +174,26 @@ quarantine_cleanup(void *arg) { quarantine_t *quarantine = *(quarantine_t **)arg; - if (quarantine != NULL) { + if (quarantine == QUARANTINE_STATE_REINCARNATED) { + /* + * Another destructor deallocated memory after this destructor + * was called. Reset quarantine to QUARANTINE_STATE_PURGATORY + * in order to receive another callback. + */ + quarantine = QUARANTINE_STATE_PURGATORY; + quarantine_tsd_set(&quarantine); + } else if (quarantine == QUARANTINE_STATE_PURGATORY) { + /* + * The previous time this destructor was called, we set the key + * to QUARANTINE_STATE_PURGATORY so that other destructors + * wouldn't cause re-creation of the quarantine. This time, do + * nothing, so that the destructor will not be called again. + */ + } else if (quarantine != NULL) { quarantine_drain(quarantine, 0); idalloc(quarantine); + quarantine = QUARANTINE_STATE_PURGATORY; + quarantine_tsd_set(&quarantine); } } diff --git a/contrib/jemalloc/src/stats.c b/contrib/jemalloc/src/stats.c index 08f7098caad..433b80d128d 100644 --- a/contrib/jemalloc/src/stats.c +++ b/contrib/jemalloc/src/stats.c @@ -295,16 +295,6 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque, abort(); } - if (write_cb == NULL) { - /* - * The caller did not provide an alternate write_cb callback - * function, so use the default one. malloc_write() is an - * inline function, so use malloc_message() directly here. - */ - write_cb = je_malloc_message; - cbopaque = NULL; - } - if (opts != NULL) { unsigned i; @@ -330,7 +320,8 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque, } } - write_cb(cbopaque, "___ Begin jemalloc statistics ___\n"); + malloc_cprintf(write_cb, cbopaque, + "___ Begin jemalloc statistics ___\n"); if (general) { int err; const char *cpv; @@ -375,7 +366,8 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque, " opt."#n": \"%s\"\n", cpv); \ } - write_cb(cbopaque, "Run-time option settings:\n"); + malloc_cprintf(write_cb, cbopaque, + "Run-time option settings:\n"); OPT_WRITE_BOOL(abort) OPT_WRITE_SIZE_T(lg_chunk) OPT_WRITE_SIZE_T(narenas) @@ -425,7 +417,7 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque, "Min active:dirty page ratio per arena: %u:1\n", (1U << ssv)); } else { - write_cb(cbopaque, + malloc_cprintf(write_cb, cbopaque, "Min active:dirty page ratio per arena: N/A\n"); } if ((err = je_mallctl("arenas.tcache_max", &sv, &ssz, NULL, 0)) @@ -447,7 +439,7 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque, " (2^%zd)\n", (((uint64_t)1U) << ssv), ssv); } else { - write_cb(cbopaque, + malloc_cprintf(write_cb, cbopaque, "Average profile dump interval: N/A\n"); } } @@ -498,11 +490,11 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque, CTL_GET("arenas.narenas", &narenas, unsigned); { - bool initialized[narenas]; + VARIABLE_ARRAY(bool, initialized, narenas); size_t isz; unsigned i, ninitialized; - isz = sizeof(initialized); + isz = sizeof(bool) * narenas; xmallctl("arenas.initialized", initialized, &isz, NULL, 0); for (i = ninitialized = 0; i < narenas; i++) { @@ -527,11 +519,11 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque, CTL_GET("arenas.narenas", &narenas, unsigned); { - bool initialized[narenas]; + VARIABLE_ARRAY(bool, initialized, narenas); size_t isz; unsigned i; - isz = sizeof(initialized); + isz = sizeof(bool) * narenas; xmallctl("arenas.initialized", initialized, &isz, NULL, 0); @@ -547,5 +539,5 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque, } } } - write_cb(cbopaque, "--- End jemalloc statistics ---\n"); + malloc_cprintf(write_cb, cbopaque, "--- End jemalloc statistics ---\n"); } diff --git a/contrib/jemalloc/src/tcache.c b/contrib/jemalloc/src/tcache.c index 9c4970c5238..60244c45f8b 100644 --- a/contrib/jemalloc/src/tcache.c +++ b/contrib/jemalloc/src/tcache.c @@ -24,6 +24,46 @@ size_t tcache_salloc(const void *ptr) return (arena_salloc(ptr, false)); } +void +tcache_event_hard(tcache_t *tcache) +{ + size_t binind = tcache->next_gc_bin; + tcache_bin_t *tbin = &tcache->tbins[binind]; + tcache_bin_info_t *tbin_info = &tcache_bin_info[binind]; + + if (tbin->low_water > 0) { + /* + * Flush (ceiling) 3/4 of the objects below the low water mark. + */ + if (binind < NBINS) { + tcache_bin_flush_small(tbin, binind, tbin->ncached - + tbin->low_water + (tbin->low_water >> 2), tcache); + } else { + tcache_bin_flush_large(tbin, binind, tbin->ncached - + tbin->low_water + (tbin->low_water >> 2), tcache); + } + /* + * Reduce fill count by 2X. Limit lg_fill_div such that the + * fill count is always at least 1. + */ + if ((tbin_info->ncached_max >> (tbin->lg_fill_div+1)) >= 1) + tbin->lg_fill_div++; + } else if (tbin->low_water < 0) { + /* + * Increase fill count by 2X. Make sure lg_fill_div stays + * greater than 0. + */ + if (tbin->lg_fill_div > 1) + tbin->lg_fill_div--; + } + tbin->low_water = tbin->ncached; + + tcache->next_gc_bin++; + if (tcache->next_gc_bin == nhbins) + tcache->next_gc_bin = 0; + tcache->ev_cnt = 0; +} + void * tcache_alloc_small_hard(tcache_t *tcache, tcache_bin_t *tbin, size_t binind) { @@ -80,12 +120,13 @@ tcache_bin_flush_small(tcache_bin_t *tbin, size_t binind, unsigned rem, size_t pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE; arena_chunk_map_t *mapelm = - &chunk->map[pageind-map_bias]; + arena_mapp_get(chunk, pageind); if (config_fill && opt_junk) { arena_alloc_junk_small(ptr, &arena_bin_info[binind], true); } - arena_dalloc_bin(arena, chunk, ptr, mapelm); + arena_dalloc_bin_locked(arena, chunk, ptr, + mapelm); } else { /* * This object was allocated via a different @@ -158,7 +199,7 @@ tcache_bin_flush_large(tcache_bin_t *tbin, size_t binind, unsigned rem, assert(ptr != NULL); chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr); if (chunk->arena == arena) - arena_dalloc_large(arena, chunk, ptr); + arena_dalloc_large_locked(arena, chunk, ptr); else { /* * This object was allocated via a different @@ -314,22 +355,14 @@ tcache_destroy(tcache_t *tcache) arena_t *arena = chunk->arena; size_t pageind = ((uintptr_t)tcache - (uintptr_t)chunk) >> LG_PAGE; - arena_chunk_map_t *mapelm = &chunk->map[pageind-map_bias]; - arena_run_t *run = (arena_run_t *)((uintptr_t)chunk + - (uintptr_t)((pageind - (mapelm->bits >> LG_PAGE)) << - LG_PAGE)); - arena_bin_t *bin = run->bin; + arena_chunk_map_t *mapelm = arena_mapp_get(chunk, pageind); - malloc_mutex_lock(&bin->lock); - arena_dalloc_bin(arena, chunk, tcache, mapelm); - malloc_mutex_unlock(&bin->lock); + arena_dalloc_bin(arena, chunk, tcache, pageind, mapelm); } else if (tcache_size <= tcache_maxclass) { arena_chunk_t *chunk = CHUNK_ADDR2BASE(tcache); arena_t *arena = chunk->arena; - malloc_mutex_lock(&arena->lock); arena_dalloc_large(arena, chunk, tcache); - malloc_mutex_unlock(&arena->lock); } else idalloc(tcache); } diff --git a/contrib/jemalloc/src/tsd.c b/contrib/jemalloc/src/tsd.c index 281a2e9be70..961a546329c 100644 --- a/contrib/jemalloc/src/tsd.c +++ b/contrib/jemalloc/src/tsd.c @@ -14,7 +14,7 @@ malloc_tsd_malloc(size_t size) { /* Avoid choose_arena() in order to dodge bootstrapping issues. */ - return arena_malloc(arenas[0], size, false, false); + return (arena_malloc(arenas[0], size, false, false)); } void @@ -31,12 +31,14 @@ malloc_tsd_no_cleanup(void *arg) not_reached(); } -#ifdef JEMALLOC_MALLOC_THREAD_CLEANUP -JEMALLOC_ATTR(visibility("default")) +#if defined(JEMALLOC_MALLOC_THREAD_CLEANUP) || defined(_WIN32) +#ifndef _WIN32 +JEMALLOC_EXPORT +#endif void _malloc_thread_cleanup(void) { - bool pending[ncleanups], again; + bool pending[MALLOC_TSD_CLEANUPS_MAX], again; unsigned i; for (i = 0; i < ncleanups; i++) @@ -70,3 +72,36 @@ malloc_tsd_boot(void) ncleanups = 0; } + +#ifdef _WIN32 +static BOOL WINAPI +_tls_callback(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + + switch (fdwReason) { +#ifdef JEMALLOC_LAZY_LOCK + case DLL_THREAD_ATTACH: + isthreaded = true; + break; +#endif + case DLL_THREAD_DETACH: + _malloc_thread_cleanup(); + break; + default: + break; + } + return (true); +} + +#ifdef _MSC_VER +# ifdef _M_IX86 +# pragma comment(linker, "/INCLUDE:__tls_used") +# else +# pragma comment(linker, "/INCLUDE:_tls_used") +# endif +# pragma section(".CRT$XLY",long,read) +#endif +JEMALLOC_SECTION(".CRT$XLY") JEMALLOC_ATTR(used) +static const BOOL (WINAPI *tls_callback)(HINSTANCE hinstDLL, + DWORD fdwReason, LPVOID lpvReserved) = _tls_callback; +#endif diff --git a/contrib/jemalloc/src/util.c b/contrib/jemalloc/src/util.c index b80676c3c40..f94799f380b 100644 --- a/contrib/jemalloc/src/util.c +++ b/contrib/jemalloc/src/util.c @@ -40,8 +40,7 @@ static char *x2s(uintmax_t x, bool alt_form, bool uppercase, char *s, /******************************************************************************/ /* malloc_message() setup. */ -JEMALLOC_CATTR(visibility("hidden"), static) -void +static void wrtmessage(void *cbopaque, const char *s) { @@ -57,10 +56,9 @@ wrtmessage(void *cbopaque, const char *s) #endif } -void (*je_malloc_message)(void *, const char *s) - JEMALLOC_ATTR(visibility("default")) = wrtmessage; +JEMALLOC_EXPORT void (*je_malloc_message)(void *, const char *s); -JEMALLOC_CATTR(visibility("hidden"), static) +JEMALLOC_ATTR(visibility("hidden")) void wrtmessage_1_0(const char *s1, const char *s2, const char *s3, const char *s4) @@ -76,14 +74,33 @@ void (*__malloc_message_1_0)(const char *s1, const char *s2, const char *s3, const char *s4) = wrtmessage_1_0; __sym_compat(_malloc_message, __malloc_message_1_0, FBSD_1.0); +/* + * Wrapper around malloc_message() that avoids the need for + * je_malloc_message(...) throughout the code. + */ +void +malloc_write(const char *s) +{ + + if (je_malloc_message != NULL) + je_malloc_message(NULL, s); + else + wrtmessage(NULL, s); +} + /* * glibc provides a non-standard strerror_r() when _GNU_SOURCE is defined, so * provide a wrapper. */ int -buferror(int errnum, char *buf, size_t buflen) +buferror(char *buf, size_t buflen) { -#ifdef _GNU_SOURCE + +#ifdef _WIN32 + FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), 0, + (LPSTR)buf, buflen, NULL); + return (0); +#elif defined(_GNU_SOURCE) char *b = strerror_r(errno, buf, buflen); if (b != buf) { strncpy(buf, b, buflen); @@ -104,7 +121,7 @@ malloc_strtoumax(const char *nptr, char **endptr, int base) const char *p, *ns; if (base < 0 || base == 1 || base > 36) { - errno = EINVAL; + set_errno(EINVAL); return (UINTMAX_MAX); } b = base; @@ -179,7 +196,7 @@ malloc_strtoumax(const char *nptr, char **endptr, int base) ret += digit; if (ret < pret) { /* Overflow. */ - errno = ERANGE; + set_errno(ERANGE); return (UINTMAX_MAX); } p++; @@ -299,7 +316,6 @@ malloc_vsnprintf(char *str, size_t size, const char *format, va_list ap) int ret; size_t i; const char *f; - va_list tap; #define APPEND_C(c) do { \ if (i < size) \ @@ -370,9 +386,6 @@ malloc_vsnprintf(char *str, size_t size, const char *format, va_list ap) } \ } while (0) - if (config_debug) - va_copy(tap, ap); - i = 0; f = format; while (true) { @@ -431,9 +444,9 @@ malloc_vsnprintf(char *str, size_t size, const char *format, va_list ap) case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { uintmax_t uwidth; - errno = 0; + set_errno(0); uwidth = malloc_strtoumax(f, (char **)&f, 10); - assert(uwidth != UINTMAX_MAX || errno != + assert(uwidth != UINTMAX_MAX || get_errno() != ERANGE); width = (int)uwidth; if (*f == '.') { @@ -457,9 +470,10 @@ malloc_vsnprintf(char *str, size_t size, const char *format, va_list ap) case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { uintmax_t uprec; - errno = 0; + set_errno(0); uprec = malloc_strtoumax(f, (char **)&f, 10); - assert(uprec != UINTMAX_MAX || errno != ERANGE); + assert(uprec != UINTMAX_MAX || get_errno() != + ERANGE); prec = (int)uprec; break; } @@ -610,7 +624,8 @@ malloc_vcprintf(void (*write_cb)(void *, const char *), void *cbopaque, * function, so use the default one. malloc_write() is an * inline function, so use malloc_message() directly here. */ - write_cb = je_malloc_message; + write_cb = (je_malloc_message != NULL) ? je_malloc_message : + wrtmessage; cbopaque = NULL; } diff --git a/contrib/less/LICENSE b/contrib/less/LICENSE index c7168e71827..3fe715f1706 100644 --- a/contrib/less/LICENSE +++ b/contrib/less/LICENSE @@ -2,7 +2,7 @@ ------------ Less -Copyright (C) 1984-2011 Mark Nudelman +Copyright (C) 1984-2012 Mark Nudelman Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/contrib/less/Makefile.aut b/contrib/less/Makefile.aut index b3ee3f4639d..f7026249e66 100644 --- a/contrib/less/Makefile.aut +++ b/contrib/less/Makefile.aut @@ -1,6 +1,6 @@ # Makefile for authoring less. -EMAIL = markn@greenwoodsoftware.com +EMAIL = bug-less@gnu.org HOMEPAGE = http://www.greenwoodsoftware.com/less SHELL = /bin/sh RCS = rcs @@ -112,8 +112,7 @@ dist: ${DISTFILES} echo "Preparing $$REL"; \ rm -rf $$REL; mkdir $$REL; \ for file in ${DISTFILES}; do \ - cp -p $$file $$REL; \ - chmod -w $$REL/$$file; \ + ./add_copyright $$file $$REL; \ done; \ cd $$REL; chmod +w ${DISTFILES_W}; cd ..; \ echo "Creating release/$$REL/$$REL.tar.gz"; \ diff --git a/contrib/less/NEWS b/contrib/less/NEWS index eb38025cbf4..9a8ea26372f 100644 --- a/contrib/less/NEWS +++ b/contrib/less/NEWS @@ -7,8 +7,34 @@ http://www.greenwoodsoftware.com/less You can also download the latest version of less from there. - To report bugs, suggestions or comments, send email to - bug-less@gnu.org or markn@greenwoodsoftware.com. + To report bugs, suggestions or comments, send email to bug-less@gnu.org. + +====================================================================== + + Major changes between "less" versions 444 and 449 + +* Add ESC-F command to keep reading data until a pattern is found. + +* Use exit code of LESSOPEN script if LESSOPEN starts with "||". + +* When up/down arrow is used on the command line immediately after + typing text, the next command starting with that text is found. + +* Add support for GNU regex. + +* Add configure option --with-regex=none and fix compile errors + when compiling with no regex library. + +* Fix bugs handling SGR sequences in Win32. + +* Fix possible crashes caused by malformed LESSOPEN or + LESSCLOSE variables. + +* Fix bug highlighting text which is discontiguous in the file + due to backspace processing. + +* Fix bug in displaying status column when scrolling backwards + with -J and -S in effect. ====================================================================== diff --git a/contrib/less/README b/contrib/less/README index ba6f2690019..e00ce823fbe 100644 --- a/contrib/less/README +++ b/contrib/less/README @@ -7,9 +7,9 @@ ************************************************************************** ************************************************************************** - Less, version 444 + Less, version 449 - This is the distribution of less, version 444, released 09 Jun 2011. + This is the distribution of less, version 449, released 26 Jun 2012. This program is part of the GNU project (http://www.gnu.org). This program is free software. You may redistribute it and/or @@ -21,7 +21,7 @@ or 2. The Less License, in the file LICENSE. - Please report any problems to bug-less@gnu.org or markn@greenwoodsoftware.com. + Please report any problems to bug-less@gnu.org. See http://www.greenwoodsoftware.com/less for the latest info. ========================================================================= @@ -60,10 +60,11 @@ INSTALLATION (Unix systems only): regcomp Use the V8-compatible regcomp. regcomp-local Use Henry Spencer's V8-compatible regcomp (source is supplied with less). + none No regular expressions, only simple string matching. --with-secure Builds a "secure" version of less, with some features disabled - to prevent users from viewing other files, accessing shell - commands, etc. + to prevent users from viewing other files, accessing shell + commands, etc. 3. It is a good idea to look over the generated Makefile and defines.h @@ -96,7 +97,7 @@ INSTALLATION (Unix systems only): bindir and/or mandir to the appropriate directories. If you have any problems building or running "less", suggestions, -complaints, etc., you may mail to the author at markn@greenwoodsoftware.com. +complaints, etc., you may mail to bug-less@gnu.org. Note to hackers: comments noting possible improvements are enclosed in double curly brackets {{ like this }}. diff --git a/contrib/less/brac.c b/contrib/less/brac.c index 22c71ebfc83..fcf9ed216fb 100644 --- a/contrib/less/brac.c +++ b/contrib/less/brac.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/ch.c b/contrib/less/ch.c index 1b84ec1618f..8e431df5fdf 100644 --- a/contrib/less/ch.c +++ b/contrib/less/ch.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -582,6 +581,8 @@ ch_length() return (NULL_POSITION); if (ch_flags & CH_HELPFILE) return (size_helpdata); + if (ch_flags & CH_NODATA) + return (0); return (ch_fsize); } diff --git a/contrib/less/charset.c b/contrib/less/charset.c index 12b59d6b731..4ce6a54f09b 100644 --- a/contrib/less/charset.c +++ b/contrib/less/charset.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/charset.h b/contrib/less/charset.h index 8ccf748df09..0ae636646a9 100644 --- a/contrib/less/charset.h +++ b/contrib/less/charset.h @@ -1,12 +1,11 @@ -/* - * Copyright (C) 2005-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ #define IS_ASCII_OCTET(c) (((c) & 0x80) == 0) #define IS_UTF8_TRAIL(c) (((c) & 0xC0) == 0x80) diff --git a/contrib/less/cmd.h b/contrib/less/cmd.h index 3176b917226..627f85bcf0a 100644 --- a/contrib/less/cmd.h +++ b/contrib/less/cmd.h @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ #define MAX_USERCMD 500 @@ -66,6 +65,7 @@ #define A_NEXT_TAG 53 #define A_PREV_TAG 54 #define A_FILTER 55 +#define A_F_UNTIL_HILITE 56 #define A_INVALID 100 #define A_NOACTION 101 @@ -78,7 +78,7 @@ #define A_EXTRA 0200 -/* Line editting characters */ +/* Line editing characters */ #define EC_BACKSPACE 1 #define EC_LINEKILL 2 diff --git a/contrib/less/cmdbuf.c b/contrib/less/cmdbuf.c index 74a74ffe9b1..804a0329b13 100644 --- a/contrib/less/cmdbuf.c +++ b/contrib/less/cmdbuf.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -30,6 +29,7 @@ static int prompt_col; /* Column of cursor just after prompt */ static char *cp; /* Pointer into cmdbuf */ static int cmd_offset; /* Index into cmdbuf of first displayed char */ static int literal; /* Next input char should not be interpreted */ +static int updown_match = -1; /* Prefix length in up/down movement */ #if TAB_COMPLETE_FILENAME static int cmd_complete(); @@ -122,6 +122,7 @@ cmd_reset() cmd_offset = 0; literal = 0; cmd_mbc_buf_len = 0; + updown_match = -1; } /* @@ -132,6 +133,7 @@ clear_cmd() { cmd_col = prompt_col = 0; cmd_mbc_buf_len = 0; + updown_match = -1; } /* @@ -504,6 +506,7 @@ cmd_ichar(cs, clen) /* * Reprint the tail of the line from the inserted char. */ + updown_match = -1; cmd_repaint(cp); cmd_right(); return (CC_OK); @@ -547,6 +550,7 @@ cmd_erase() /* * Repaint the buffer after the erased char. */ + updown_match = -1; cmd_repaint(cp); /* @@ -643,6 +647,7 @@ cmd_kill() cmd_offset = 0; cmd_home(); *cp = '\0'; + updown_match = -1; cmd_repaint(cp); /* @@ -675,12 +680,15 @@ set_mlist(mlist, cmdflags) #if CMD_HISTORY /* * Move up or down in the currently selected command history list. + * Only consider entries whose first updown_match chars are equal to + * cmdbuf's corresponding chars. */ static int cmd_updown(action) int action; { char *s; + struct mlist *ml; if (curr_mlist == NULL) { @@ -690,24 +698,47 @@ cmd_updown(action) bell(); return (CC_OK); } - cmd_home(); - clear_eol(); + + if (updown_match < 0) + { + updown_match = cp - cmdbuf; + } + /* - * Move curr_mp to the next/prev entry. + * Find the next history entry which matches. */ - if (action == EC_UP) - curr_mlist->curr_mp = curr_mlist->curr_mp->prev; - else - curr_mlist->curr_mp = curr_mlist->curr_mp->next; + for (ml = curr_mlist->curr_mp;;) + { + ml = (action == EC_UP) ? ml->prev : ml->next; + if (ml == curr_mlist) + { + /* + * We reached the end (or beginning) of the list. + */ + break; + } + if (strncmp(cmdbuf, ml->string, updown_match) == 0) + { + /* + * This entry matches; stop here. + * Copy the entry into cmdbuf and echo it on the screen. + */ + curr_mlist->curr_mp = ml; + s = ml->string; + if (s == NULL) + s = ""; + strcpy(cmdbuf, s); + cmd_home(); + clear_eol(); + for (cp = cmdbuf; *cp != '\0'; ) + cmd_right(); + return (CC_OK); + } + } /* - * Copy the entry into cmdbuf and echo it on the screen. + * We didn't find a history entry that matches. */ - s = curr_mlist->curr_mp->string; - if (s == NULL) - s = ""; - strcpy(cmdbuf, s); - for (cp = cmdbuf; *cp != '\0'; ) - cmd_right(); + bell(); return (CC_OK); } #endif @@ -1457,9 +1488,6 @@ save_cmdhist() FILE *f; int modified = 0; - filename = histfile_name(); - if (filename == NULL) - return; if (mlist_search.modified) modified = 1; #if SHELL_ESCAPE || PIPEC @@ -1468,6 +1496,9 @@ save_cmdhist() #endif if (!modified) return; + filename = histfile_name(); + if (filename == NULL) + return; f = fopen(filename, "w"); free(filename); if (f == NULL) diff --git a/contrib/less/command.c b/contrib/less/command.c index def3d3679ad..de8f52a5937 100644 --- a/contrib/less/command.c +++ b/contrib/less/command.c @@ -1,13 +1,12 @@ /* $FreeBSD$ */ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -38,6 +37,7 @@ extern int secure; extern int hshift; extern int show_attn; extern int less_is_more; +extern POSITION highest_hilite; extern char *every_first_cmd; extern char *curr_altfilename; extern char version[]; @@ -104,8 +104,8 @@ cmd_exec() static void start_mca(action, prompt, mlist, cmdflags) int action; - char *prompt; - void constant *mlist; + constant char *prompt; + constant void *mlist; int cmdflags; { mca = action; @@ -686,7 +686,7 @@ make_display() static void prompt() { - register char constant *p; + register constant char *p; if (ungot != NULL) { @@ -961,6 +961,44 @@ multi_search(pattern, n) } } +/* + * Forward forever, or until a highlighted line appears. + */ + static int +forw_loop(until_hilite) + int until_hilite; +{ + POSITION curr_len; + + if (ch_getflags() & CH_HELPFILE) + return (A_NOACTION); + + cmd_exec(); + jump_forw(); + curr_len = ch_length(); + highest_hilite = until_hilite ? curr_len : NULL_POSITION; + ignore_eoi = 1; + while (!sigs) + { + if (until_hilite && highest_hilite > curr_len) + { + bell(); + break; + } + make_display(); + forward(1, 0, 0); + } + ignore_eoi = 0; + + /* + * This gets us back in "F mode" after processing + * a non-abort signal (e.g. window-change). + */ + if (sigs && !ABORT_SIGS()) + return (A_F_FOREVER); + return (A_NOACTION); +} + /* * Main command processor. * Accept and execute commands until a quit command. @@ -979,6 +1017,7 @@ commands() IFILE old_ifile; IFILE new_ifile; char *tagfile; + int until_hilite = 0; search_type = SRCH_FORW; wscroll = (sc_height + 1) / 2; @@ -1206,23 +1245,11 @@ commands() /* * Forward forever, ignoring EOF. */ - if (ch_getflags() & CH_HELPFILE) - break; - cmd_exec(); - jump_forw(); - ignore_eoi = 1; - while (!sigs) - { - make_display(); - forward(1, 0, 0); - } - ignore_eoi = 0; - /* - * This gets us back in "F mode" after processing - * a non-abort signal (e.g. window-change). - */ - if (sigs && !ABORT_SIGS()) - newaction = A_F_FOREVER; + newaction = forw_loop(0); + break; + + case A_F_UNTIL_HILITE: + newaction = forw_loop(1); break; case A_F_SCROLL: diff --git a/contrib/less/configure b/contrib/less/configure index f2a7c8c73b3..de1606173c3 100755 --- a/contrib/less/configure +++ b/contrib/less/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.67 for less 1. +# Generated by GNU Autoconf 2.68 for less 1. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -89,6 +89,7 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. +as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -214,11 +215,18 @@ IFS=$as_save_IFS # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} + case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : @@ -1067,7 +1075,7 @@ Try \`$0 --help' for more information" $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac @@ -1281,7 +1289,7 @@ Optional Packages: --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-secure Compile in secure mode --with-no-float Do not use floating point - --with-regex={auto,pcre,posix,regcmp,re_comp,regcomp,regcomp-local} Select a regular expression library auto + --with-regex={auto,gnu,pcre,posix,regcmp,re_comp,regcomp,regcomp-local,none} Select a regular expression library auto --with-editor=PROGRAM use PROGRAM as the default editor vi Some influential environment variables: @@ -1361,7 +1369,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF less configure 1 -generated by GNU Autoconf 2.67 +generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation @@ -1407,7 +1415,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile @@ -1453,7 +1461,7 @@ fi # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link @@ -1490,7 +1498,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp @@ -1532,7 +1540,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run @@ -1545,10 +1553,10 @@ fi ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval "test \"\${$3+set}\"" = set; then : + if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 @@ -1611,7 +1619,7 @@ $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" @@ -1620,7 +1628,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel @@ -1633,7 +1641,7 @@ ac_fn_c_check_header_compile () as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -1651,7 +1659,7 @@ fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile @@ -1664,7 +1672,7 @@ ac_fn_c_check_type () as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" @@ -1705,7 +1713,7 @@ fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type @@ -1717,7 +1725,7 @@ ac_fn_c_check_func () as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -1772,7 +1780,7 @@ fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF @@ -1780,7 +1788,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by less $as_me 1, which was -generated by GNU Autoconf 2.67. Invocation command line was +generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -2142,7 +2150,7 @@ if test -n "$ac_tool_prefix"; then set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2182,7 +2190,7 @@ if test -z "$ac_cv_prog_CC"; then set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : +if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -2235,7 +2243,7 @@ if test -z "$CC"; then set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2275,7 +2283,7 @@ if test -z "$CC"; then set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2334,7 +2342,7 @@ if test -z "$CC"; then set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2378,7 +2386,7 @@ do set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : +if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -2661,7 +2669,7 @@ rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then : +if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2712,7 +2720,7 @@ OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then : +if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2749,7 +2757,7 @@ ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then : +if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag @@ -2827,7 +2835,7 @@ else fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then : +if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no @@ -2925,7 +2933,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5 $as_echo_n "checking for library containing strerror... " >&6; } -if test "${ac_cv_search_strerror+set}" = set; then : +if ${ac_cv_search_strerror+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS @@ -2959,11 +2967,11 @@ for ac_lib in '' cposix; do fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if test "${ac_cv_search_strerror+set}" = set; then : + if ${ac_cv_search_strerror+:} false; then : break fi done -if test "${ac_cv_search_strerror+set}" = set; then : +if ${ac_cv_search_strerror+:} false; then : else ac_cv_search_strerror=no @@ -2991,7 +2999,7 @@ if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then : + if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -3119,7 +3127,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then : +if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -3182,7 +3190,7 @@ $as_echo "$ac_cv_path_GREP" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then : +if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -3250,7 +3258,7 @@ $as_echo "$ac_cv_path_EGREP" >&6; } if test $ac_cv_c_compiler_gnu = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 $as_echo_n "checking whether $CC needs -traditional... " >&6; } -if test "${ac_cv_prog_gcc_traditional+set}" = set; then : +if ${ac_cv_prog_gcc_traditional+:} false; then : $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" @@ -3335,7 +3343,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then : +if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3422,7 +3430,7 @@ if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } -if test "${ac_cv_sys_largefile_CC+set}" = set; then : +if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no @@ -3473,7 +3481,7 @@ $as_echo "$ac_cv_sys_largefile_CC" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } -if test "${ac_cv_sys_file_offset_bits+set}" = set; then : +if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do @@ -3542,7 +3550,7 @@ rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } -if test "${ac_cv_sys_large_files+set}" = set; then : +if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do @@ -3615,7 +3623,7 @@ fi # Checks for general libraries. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgoto in -ltinfo" >&5 $as_echo_n "checking for tgoto in -ltinfo... " >&6; } -if test "${ac_cv_lib_tinfo_tgoto+set}" = set; then : +if ${ac_cv_lib_tinfo_tgoto+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -3649,7 +3657,7 @@ LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tinfo_tgoto" >&5 $as_echo "$ac_cv_lib_tinfo_tgoto" >&6; } -if test "x$ac_cv_lib_tinfo_tgoto" = x""yes; then : +if test "x$ac_cv_lib_tinfo_tgoto" = xyes; then : have_tinfo=yes else have_tinfo=no @@ -3657,7 +3665,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lxcurses" >&5 $as_echo_n "checking for initscr in -lxcurses... " >&6; } -if test "${ac_cv_lib_xcurses_initscr+set}" = set; then : +if ${ac_cv_lib_xcurses_initscr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -3691,7 +3699,7 @@ LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xcurses_initscr" >&5 $as_echo "$ac_cv_lib_xcurses_initscr" >&6; } -if test "x$ac_cv_lib_xcurses_initscr" = x""yes; then : +if test "x$ac_cv_lib_xcurses_initscr" = xyes; then : have_xcurses=yes else have_xcurses=no @@ -3699,7 +3707,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lncursesw" >&5 $as_echo_n "checking for initscr in -lncursesw... " >&6; } -if test "${ac_cv_lib_ncursesw_initscr+set}" = set; then : +if ${ac_cv_lib_ncursesw_initscr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -3733,7 +3741,7 @@ LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncursesw_initscr" >&5 $as_echo "$ac_cv_lib_ncursesw_initscr" >&6; } -if test "x$ac_cv_lib_ncursesw_initscr" = x""yes; then : +if test "x$ac_cv_lib_ncursesw_initscr" = xyes; then : have_ncursesw=yes else have_ncursesw=no @@ -3741,7 +3749,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lncurses" >&5 $as_echo_n "checking for initscr in -lncurses... " >&6; } -if test "${ac_cv_lib_ncurses_initscr+set}" = set; then : +if ${ac_cv_lib_ncurses_initscr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -3775,7 +3783,7 @@ LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_initscr" >&5 $as_echo "$ac_cv_lib_ncurses_initscr" >&6; } -if test "x$ac_cv_lib_ncurses_initscr" = x""yes; then : +if test "x$ac_cv_lib_ncurses_initscr" = xyes; then : have_ncurses=yes else have_ncurses=no @@ -3783,7 +3791,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lcurses" >&5 $as_echo_n "checking for initscr in -lcurses... " >&6; } -if test "${ac_cv_lib_curses_initscr+set}" = set; then : +if ${ac_cv_lib_curses_initscr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -3817,7 +3825,7 @@ LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_initscr" >&5 $as_echo "$ac_cv_lib_curses_initscr" >&6; } -if test "x$ac_cv_lib_curses_initscr" = x""yes; then : +if test "x$ac_cv_lib_curses_initscr" = xyes; then : have_curses=yes else have_curses=no @@ -3825,7 +3833,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltermcap" >&5 $as_echo_n "checking for tgetent in -ltermcap... " >&6; } -if test "${ac_cv_lib_termcap_tgetent+set}" = set; then : +if ${ac_cv_lib_termcap_tgetent+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -3859,7 +3867,7 @@ LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termcap_tgetent" >&5 $as_echo "$ac_cv_lib_termcap_tgetent" >&6; } -if test "x$ac_cv_lib_termcap_tgetent" = x""yes; then : +if test "x$ac_cv_lib_termcap_tgetent" = xyes; then : have_termcap=yes else have_termcap=no @@ -3867,7 +3875,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltermlib" >&5 $as_echo_n "checking for tgetent in -ltermlib... " >&6; } -if test "${ac_cv_lib_termlib_tgetent+set}" = set; then : +if ${ac_cv_lib_termlib_tgetent+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -3901,21 +3909,20 @@ LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termlib_tgetent" >&5 $as_echo "$ac_cv_lib_termlib_tgetent" >&6; } -if test "x$ac_cv_lib_termlib_tgetent" = x""yes; then : +if test "x$ac_cv_lib_termlib_tgetent" = xyes; then : have_termlib=yes else have_termlib=no fi -# Regular expressions (regcmp) are in -lgen on Solaris 2, -# and in -lintl on SCO Unix. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for regcmp in -lgen" >&5 -$as_echo_n "checking for regcmp in -lgen... " >&6; } -if test "${ac_cv_lib_gen_regcmp+set}" = set; then : +# Regular expressions (regcmp) are in -lgen on Solaris 2, (but in libc +# at least on Solaris 10 (2.10)) and in -lintl on SCO Unix. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing regcmp" >&5 +$as_echo_n "checking for library containing regcmp... " >&6; } +if ${ac_cv_search_regcmp+:} false; then : $as_echo_n "(cached) " >&6 else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lgen $LIBS" + ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -3934,113 +3941,35 @@ return regcmp (); return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_gen_regcmp=yes -else - ac_cv_lib_gen_regcmp=no +for ac_lib in '' gen intl PW; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_regcmp=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS + conftest$ac_exeext + if ${ac_cv_search_regcmp+:} false; then : + break fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_regcmp" >&5 -$as_echo "$ac_cv_lib_gen_regcmp" >&6; } -if test "x$ac_cv_lib_gen_regcmp" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBGEN 1 -_ACEOF +done +if ${ac_cv_search_regcmp+:} false; then : - LIBS="-lgen $LIBS" - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for regcmp in -lintl" >&5 -$as_echo_n "checking for regcmp in -lintl... " >&6; } -if test "${ac_cv_lib_intl_regcmp+set}" = set; then : - $as_echo_n "(cached) " >&6 else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lintl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char regcmp (); -int -main () -{ -return regcmp (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_intl_regcmp=yes -else - ac_cv_lib_intl_regcmp=no + ac_cv_search_regcmp=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_regcmp" >&5 -$as_echo "$ac_cv_lib_intl_regcmp" >&6; } -if test "x$ac_cv_lib_intl_regcmp" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBINTL 1 -_ACEOF - - LIBS="-lintl $LIBS" - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for regcmp in -lPW" >&5 -$as_echo_n "checking for regcmp in -lPW... " >&6; } -if test "${ac_cv_lib_PW_regcmp+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lPW $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char regcmp (); -int -main () -{ -return regcmp (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_PW_regcmp=yes -else - ac_cv_lib_PW_regcmp=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_PW_regcmp" >&5 -$as_echo "$ac_cv_lib_PW_regcmp" >&6; } -if test "x$ac_cv_lib_PW_regcmp" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPW 1 -_ACEOF - - LIBS="-lPW $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_regcmp" >&5 +$as_echo "$ac_cv_search_regcmp" >&6; } +ac_res=$ac_cv_search_regcmp +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi @@ -4310,7 +4239,7 @@ LIBS="$LIBS $TERMLIBS" # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then : +if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4454,7 +4383,7 @@ done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5 $as_echo_n "checking whether stat file-mode macros are broken... " >&6; } -if test "${ac_cv_header_stat_broken+set}" = set; then : +if ${ac_cv_header_stat_broken+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4496,7 +4425,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if test "${ac_cv_c_const+set}" = set; then : +if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4575,7 +4504,7 @@ $as_echo "#define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" -if test "x$ac_cv_type_off_t" = x""yes; then : +if test "x$ac_cv_type_off_t" = xyes; then : else @@ -4586,7 +4515,7 @@ _ACEOF fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = x""yes; then : +if test "x$ac_cv_type_size_t" = xyes; then : else @@ -4598,7 +4527,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if test "${ac_cv_header_time+set}" = set; then : +if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4659,11 +4588,12 @@ fi + # Checks for identifiers. ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" -if test "x$ac_cv_type_off_t" = x""yes; then : +if test "x$ac_cv_type_off_t" = xyes; then : else @@ -4766,7 +4696,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Checks for library functions. { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } -if test "${ac_cv_type_signal+set}" = set; then : +if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4894,7 +4824,7 @@ rm -f core conftest.err conftest.$ac_objext \ # Some systems have termios.h but not the corresponding functions. ac_fn_c_check_func "$LINENO" "tcgetattr" "ac_cv_func_tcgetattr" -if test "x$ac_cv_func_tcgetattr" = x""yes; then : +if test "x$ac_cv_func_tcgetattr" = xyes; then : $as_echo "#define HAVE_TERMIOS_FUNCS 1" >>confdefs.h fi @@ -4986,7 +4916,7 @@ rm -f core conftest.err conftest.$ac_objext \ ac_fn_c_check_type "$LINENO" "sigset_t" "ac_cv_type_sigset_t" "#include " -if test "x$ac_cv_type_sigset_t" = x""yes; then : +if test "x$ac_cv_type_sigset_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIGSET_T 1 @@ -5336,11 +5266,58 @@ fi fi fi +if test $have_regex = no; then +if test $WANT_REGEX = auto -o $WANT_REGEX = gnu; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for re_compile_pattern in -lc" >&5 +$as_echo_n "checking for re_compile_pattern in -lc... " >&6; } +if ${ac_cv_lib_c_re_compile_pattern+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char re_compile_pattern (); +int +main () +{ +return re_compile_pattern (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_re_compile_pattern=yes +else + ac_cv_lib_c_re_compile_pattern=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_re_compile_pattern" >&5 +$as_echo "$ac_cv_lib_c_re_compile_pattern" >&6; } +if test "x$ac_cv_lib_c_re_compile_pattern" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: using gnu" >&5 +$as_echo "using gnu" >&6; }; $as_echo "#define HAVE_GNU_REGEX 1" >>confdefs.h + have_regex=yes +fi + +fi +fi + if test $have_regex = no; then if test $WANT_REGEX = auto -o $WANT_REGEX = pcre; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcre_compile in -lpcre" >&5 $as_echo_n "checking for pcre_compile in -lpcre... " >&6; } -if test "${ac_cv_lib_pcre_pcre_compile+set}" = set; then : +if ${ac_cv_lib_pcre_pcre_compile+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -5374,7 +5351,7 @@ LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcre_pcre_compile" >&5 $as_echo "$ac_cv_lib_pcre_pcre_compile" >&6; } -if test "x$ac_cv_lib_pcre_pcre_compile" = x""yes; then : +if test "x$ac_cv_lib_pcre_pcre_compile" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: using pcre" >&5 $as_echo "using pcre" >&6; }; $as_echo "#define HAVE_PCRE 1" >>confdefs.h LIBS="$LIBS -lpcre" have_regex=yes @@ -5386,7 +5363,7 @@ fi if test $have_regex = no; then if test $WANT_REGEX = auto -o $WANT_REGEX = regcmp; then ac_fn_c_check_func "$LINENO" "regcmp" "ac_cv_func_regcmp" -if test "x$ac_cv_func_regcmp" = x""yes; then : +if test "x$ac_cv_func_regcmp" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: using regcmp" >&5 $as_echo "using regcmp" >&6; }; $as_echo "#define HAVE_REGCMP 1" >>confdefs.h have_regex=yes @@ -5432,7 +5409,7 @@ if test $have_regex = no; then if test $WANT_REGEX = auto -o $WANT_REGEX = re_comp; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: using re_comp" >&5 $as_echo "using re_comp" >&6; }; ac_fn_c_check_func "$LINENO" "re_comp" "ac_cv_func_re_comp" -if test "x$ac_cv_func_re_comp" = x""yes; then : +if test "x$ac_cv_func_re_comp" = xyes; then : $as_echo "#define HAVE_RE_COMP 1" >>confdefs.h have_regex=yes fi @@ -5440,6 +5417,13 @@ fi fi fi +if test $have_regex = no; then +if test $WANT_REGEX = auto -o $WANT_REGEX = none; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: using no regex" >&5 +$as_echo "using no regex" >&6; }; have_regex=yes; +fi +fi + if test $have_regex = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot find regular expression library" >&5 $as_echo "cannot find regular expression library" >&6; }; $as_echo "#define NO_REGEX 1" >>confdefs.h @@ -5527,10 +5511,21 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && + if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} @@ -5562,7 +5557,7 @@ LTLIBOBJS=$ac_ltlibobjs -: ${CONFIG_STATUS=./config.status} +: "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" @@ -5663,6 +5658,7 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. +as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5970,7 +5966,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # values after options handling. ac_log=" This file was extended by less $as_me 1, which was -generated by GNU Autoconf 2.67. Invocation command line was +generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -6032,7 +6028,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ less config.status 1 -configured by $0, generated by GNU Autoconf 2.67, +configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. @@ -6178,9 +6174,10 @@ fi # after its creation but before its name has been assigned to `$tmp'. $debug || { - tmp= + tmp= ac_tmp= trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } @@ -6188,12 +6185,13 @@ $debug || { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" + test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -6215,7 +6213,7 @@ else ac_cs_awk_cr=$ac_cr fi -echo 'BEGIN {' >"$tmp/subs1.awk" && +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF @@ -6243,7 +6241,7 @@ done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h @@ -6291,7 +6289,7 @@ t delim rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" @@ -6323,7 +6321,7 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF @@ -6357,7 +6355,7 @@ fi # test -n "$CONFIG_FILES" # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then -cat >"$tmp/defines.awk" <<\_ACAWK || +cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF @@ -6369,8 +6367,8 @@ _ACEOF # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do - ac_t=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_t"; then + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 @@ -6490,7 +6488,7 @@ do for ac_f do case $ac_f in - -) ac_f="$tmp/stdin";; + -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. @@ -6525,7 +6523,7 @@ $as_echo "$as_me: creating $ac_file" >&6;} esac case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ + *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; @@ -6656,21 +6654,22 @@ s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} - rm -f "$tmp/stdin" + rm -f "$ac_tmp/stdin" case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; @@ -6681,20 +6680,20 @@ which seems to be undefined. Please make sure it is defined" >&2;} if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" - } >"$tmp/config.h" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" - mv "$tmp/config.h" "$ac_file" \ + mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; diff --git a/contrib/less/configure.ac b/contrib/less/configure.ac index 0b386b07572..167f8ba623c 100644 --- a/contrib/less/configure.ac +++ b/contrib/less/configure.ac @@ -30,11 +30,9 @@ AC_CHECK_LIB(ncurses, initscr, [have_ncurses=yes], [have_ncurses=no]) AC_CHECK_LIB(curses, initscr, [have_curses=yes], [have_curses=no]) AC_CHECK_LIB(termcap, tgetent, [have_termcap=yes], [have_termcap=no]) AC_CHECK_LIB(termlib, tgetent, [have_termlib=yes], [have_termlib=no]) -# Regular expressions (regcmp) are in -lgen on Solaris 2, -# and in -lintl on SCO Unix. -AC_CHECK_LIB(gen, regcmp) -AC_CHECK_LIB(intl, regcmp) -AC_CHECK_LIB(PW, regcmp) +# Regular expressions (regcmp) are in -lgen on Solaris 2, (but in libc +# at least on Solaris 10 (2.10)) and in -lintl on SCO Unix. +AC_SEARCH_LIBS([regcmp], [gen intl PW]) # Checks for terminal libraries AC_MSG_CHECKING([for working terminal libraries]) @@ -179,6 +177,8 @@ AC_TYPE_SIZE_T AC_HEADER_TIME # Autoheader templates for symbols defined later by AC_DEFINE. +AH_TEMPLATE([HAVE_GNU_REGEX], + [GNU regex library]) AH_TEMPLATE([HAVE_POSIX_REGCOMP], [POSIX regcomp() and regex.h]) AH_TEMPLATE([HAVE_PCRE], @@ -388,7 +388,7 @@ AC_MSG_CHECKING(for regcomp) # Select a regular expression library. WANT_REGEX=auto AC_ARG_WITH(regex, - [ --with-regex={auto,pcre,posix,regcmp,re_comp,regcomp,regcomp-local} Select a regular expression library [auto]], + [ --with-regex={auto,gnu,pcre,posix,regcmp,re_comp,regcomp,regcomp-local,none} Select a regular expression library [auto]], WANT_REGEX="$withval") if test $have_regex = no; then @@ -425,6 +425,13 @@ fi fi fi +if test $have_regex = no; then +if test $WANT_REGEX = auto -o $WANT_REGEX = gnu; then +AC_CHECK_LIB(c, re_compile_pattern, +[AC_MSG_RESULT(using gnu); AC_DEFINE(HAVE_GNU_REGEX) have_regex=yes], []) +fi +fi + if test $have_regex = no; then if test $WANT_REGEX = auto -o $WANT_REGEX = pcre; then AC_CHECK_LIB(pcre, pcre_compile, @@ -459,6 +466,12 @@ AC_MSG_RESULT(using re_comp); AC_CHECK_FUNC(re_comp, AC_DEFINE(HAVE_RE_COMP) hav fi fi +if test $have_regex = no; then +if test $WANT_REGEX = auto -o $WANT_REGEX = none; then +AC_MSG_RESULT(using no regex); have_regex=yes; +fi +fi + if test $have_regex = no; then AC_MSG_RESULT(cannot find regular expression library); AC_DEFINE(NO_REGEX) fi diff --git a/contrib/less/cvt.c b/contrib/less/cvt.c index 74439847e01..85838c48ee7 100644 --- a/contrib/less/cvt.c +++ b/contrib/less/cvt.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* * Routines to convert text in various ways. Used by search. @@ -64,6 +63,7 @@ cvt_text(odst, osrc, chpos, lenp, ops) int ops; { char *dst; + char *edst = odst; char *src; register char *src_end; LWCHAR ch; @@ -98,23 +98,17 @@ cvt_text(odst, osrc, chpos, lenp, ops) if ((ops & CVT_TO_LC) && IS_UPPER(ch)) ch = TO_LOWER(ch); put_wchar(&dst, ch); - /* - * Record the original position of the char. - * But if we've already recorded a position - * for this char (due to a backspace), leave - * it alone; if multiple source chars map to - * one destination char, we want the position - * of the first one. - */ - if (chpos != NULL && chpos[dst_pos] < 0) + /* Record the original position of the char. */ + if (chpos != NULL) chpos[dst_pos] = src_pos; } + if (dst > edst) + edst = dst; } - if ((ops & CVT_CRLF) && dst > odst && dst[-1] == '\r') - dst--; - *dst = '\0'; + if ((ops & CVT_CRLF) && edst > odst && edst[-1] == '\r') + edst--; + *edst = '\0'; if (lenp != NULL) - *lenp = dst - odst; - if (chpos != NULL) - chpos[dst - odst] = src - osrc; + *lenp = edst - odst; + /* FIXME: why was this here? if (chpos != NULL) chpos[dst - odst] = src - osrc; */ } diff --git a/contrib/less/decode.c b/contrib/less/decode.c index 65d65bb6562..f83a3b63879 100644 --- a/contrib/less/decode.c +++ b/contrib/less/decode.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -79,6 +78,7 @@ static unsigned char cmdtable[] = 'w',0, A_B_WINDOW, ESC,' ',0, A_FF_SCREEN, 'F',0, A_F_FOREVER, + ESC,'F',0, A_F_UNTIL_HILITE, 'R',0, A_FREPAINT, 'r',0, A_REPAINT, CONTROL('R'),0, A_REPAINT, diff --git a/contrib/less/defines.ds b/contrib/less/defines.ds index 4dbbd6518a1..f344a76816e 100644 --- a/contrib/less/defines.ds +++ b/contrib/less/defines.ds @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* DOS definition file for less. */ diff --git a/contrib/less/defines.h.in b/contrib/less/defines.h.in index 8d4506383f7..a5e8b69d640 100644 --- a/contrib/less/defines.h.in +++ b/contrib/less/defines.h.in @@ -225,18 +225,12 @@ /* Define to 1 if you have the `fsync' function. */ #undef HAVE_FSYNC +/* GNU regex library */ +#undef HAVE_GNU_REGEX + /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H -/* Define to 1 if you have the `gen' library (-lgen). */ -#undef HAVE_LIBGEN - -/* Define to 1 if you have the `intl' library (-lintl). */ -#undef HAVE_LIBINTL - -/* Define to 1 if you have the `PW' library (-lPW). */ -#undef HAVE_LIBPW - /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H diff --git a/contrib/less/defines.o2 b/contrib/less/defines.o2 index 0fd8cc73503..4ffa45fcdb4 100644 --- a/contrib/less/defines.o2 +++ b/contrib/less/defines.o2 @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* OS/2 definition file for less. */ diff --git a/contrib/less/defines.o9 b/contrib/less/defines.o9 index 3bb1d2cb8ca..278db64024c 100644 --- a/contrib/less/defines.o9 +++ b/contrib/less/defines.o9 @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* OS/9 definition file for less. */ diff --git a/contrib/less/defines.wn b/contrib/less/defines.wn index 416a548e745..07a71eb8502 100644 --- a/contrib/less/defines.wn +++ b/contrib/less/defines.wn @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* Windows definition file for less. */ diff --git a/contrib/less/edit.c b/contrib/less/edit.c index 4781d95988e..96236b07664 100644 --- a/contrib/less/edit.c +++ b/contrib/less/edit.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ #include "less.h" @@ -310,6 +309,10 @@ edit_ifile(ifile) */ __djgpp_set_ctrl_c(1); #endif + } else if (strcmp(open_filename, FAKE_EMPTYFILE) == 0) + { + f = -1; + chflags |= CH_NODATA; } else if (strcmp(open_filename, FAKE_HELPFILE) == 0) { f = -1; diff --git a/contrib/less/filename.c b/contrib/less/filename.c index 0bbe82ab21c..e99f81a099b 100644 --- a/contrib/less/filename.c +++ b/contrib/less/filename.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -806,6 +805,27 @@ lglob(filename) return (gfilename); } +/* + * Return number of %s escapes in a string. + * Return a large number if there are any other % escapes besides %s. + */ + static int +num_pct_s(lessopen) + char *lessopen; +{ + int num; + + for (num = 0;; num++) + { + lessopen = strchr(lessopen, '%'); + if (lessopen == NULL) + break; + if (*++lessopen != 's') + return (999); + } + return (num); +} + /* * See if we should open a "replacement file" * instead of the file we're about to open. @@ -832,7 +852,7 @@ open_altfile(filename, pf, pfd) ch_ungetchar(-1); if ((lessopen = lgetenv("LESSOPEN")) == NULL) return (NULL); - if (*lessopen == '|') + while (*lessopen == '|') { /* * If LESSOPEN starts with a |, it indicates @@ -843,7 +863,7 @@ open_altfile(filename, pf, pfd) return (NULL); #else lessopen++; - returnfd = 1; + returnfd++; #endif } if (*lessopen == '-') { @@ -855,6 +875,11 @@ open_altfile(filename, pf, pfd) if (strcmp(filename, "-") == 0) return (NULL); } + if (num_pct_s(lessopen) > 1) + { + error("Invalid LESSOPEN variable", NULL_PARG); + return (NULL); + } len = strlen(lessopen) + strlen(filename) + 2; cmd = (char *) ecalloc(len, sizeof(char)); @@ -883,9 +908,18 @@ open_altfile(filename, pf, pfd) if (read(f, &c, 1) != 1) { /* - * Pipe is empty. This means there is no alt file. + * Pipe is empty. + * If more than 1 pipe char was specified, + * the exit status tells whether the file itself + * is empty, or if there is no alt file. + * If only one pipe char, just assume no alt file. */ - pclose(fd); + int status = pclose(fd); + if (returnfd > 1 && status == 0) { + *pfd = NULL; + *pf = -1; + return (save(FAKE_EMPTYFILE)); + } return (NULL); } ch_ungetchar(c); @@ -935,6 +969,11 @@ close_altfile(altfilename, filename, pipefd) } if ((lessclose = lgetenv("LESSCLOSE")) == NULL) return; + if (num_pct_s(lessclose) > 2) + { + error("Invalid LESSCLOSE variable"); + return; + } len = strlen(lessclose) + strlen(filename) + strlen(altfilename) + 2; cmd = (char *) ecalloc(len, sizeof(char)); SNPRINTF2(cmd, len, lessclose, filename, altfilename); diff --git a/contrib/less/forwback.c b/contrib/less/forwback.c index cbb61820986..5ece51b259f 100644 --- a/contrib/less/forwback.c +++ b/contrib/less/forwback.c @@ -1,13 +1,12 @@ /* $FreeBSD$ */ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/help.c b/contrib/less/help.c index 85b0a4adf94..07d62985b68 100644 --- a/contrib/less/help.c +++ b/contrib/less/help.c @@ -6,6 +6,7 @@ constant char helpdata[] = { '\n', ' ',' ',' ',' ',' ',' ','C','o','m','m','a','n','d','s',' ','m','a','r','k','e','d',' ','w','i','t','h',' ','*',' ','m','a','y',' ','b','e',' ','p','r','e','c','e','d','e','d',' ','b','y',' ','a',' ','n','u','m','b','e','r',',',' ','_','\b','N','.','\n', ' ',' ',' ',' ',' ',' ','N','o','t','e','s',' ','i','n',' ','p','a','r','e','n','t','h','e','s','e','s',' ','i','n','d','i','c','a','t','e',' ','t','h','e',' ','b','e','h','a','v','i','o','r',' ','i','f',' ','_','\b','N',' ','i','s',' ','g','i','v','e','n','.','\n', +' ',' ',' ',' ',' ',' ','A',' ','k','e','y',' ','p','r','e','c','e','d','e','d',' ','b','y',' ','a',' ','c','a','r','a','t',' ','i','n','d','i','c','a','t','e','s',' ','t','h','e',' ','C','t','r','l',' ','k','e','y',';',' ','t','h','u','s',' ','^','K',' ','i','s',' ','c','t','r','l','-','K','.','\n', '\n', ' ',' ','h',' ',' ','H',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','i','s','p','l','a','y',' ','t','h','i','s',' ','h','e','l','p','.','\n', ' ',' ','q',' ',' ',':','q',' ',' ','Q',' ',' ',':','Q',' ',' ','Z','Z',' ',' ',' ',' ',' ','E','x','i','t','.','\n', @@ -43,7 +44,7 @@ constant char helpdata[] = { ' ',' ','E','S','C','-','u',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','U','n','d','o',' ','(','t','o','g','g','l','e',')',' ','s','e','a','r','c','h',' ','h','i','g','h','l','i','g','h','t','i','n','g','.','\n', ' ',' ','&','_','\b','p','_','\b','a','_','\b','t','_','\b','t','_','\b','e','_','\b','r','_','\b','n',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','*',' ',' ','D','i','s','p','l','a','y',' ','o','n','l','y',' ','m','a','t','c','h','i','n','g',' ','l','i','n','e','s','\n', ' ',' ',' ',' ',' ',' ',' ',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','\n', -' ',' ',' ',' ',' ',' ',' ',' ','S','e','a','r','c','h',' ','p','a','t','t','e','r','n','s',' ','m','a','y',' ','b','e',' ','m','o','d','i','f','i','e','d',' ','b','y',' ','o','n','e',' ','o','r',' ','m','o','r','e',' ','o','f',':','\n', +' ',' ',' ',' ',' ',' ',' ',' ','A',' ','s','e','a','r','c','h',' ','p','a','t','t','e','r','n',' ','m','a','y',' ','b','e',' ','p','r','e','c','e','d','e','d',' ','b','y',' ','o','n','e',' ','o','r',' ','m','o','r','e',' ','o','f',':','\n', ' ',' ',' ',' ',' ',' ',' ',' ','^','N',' ','o','r',' ','!',' ',' ','S','e','a','r','c','h',' ','f','o','r',' ','N','O','N','-','m','a','t','c','h','i','n','g',' ','l','i','n','e','s','.','\n', ' ',' ',' ',' ',' ',' ',' ',' ','^','E',' ','o','r',' ','*',' ',' ','S','e','a','r','c','h',' ','m','u','l','t','i','p','l','e',' ','f','i','l','e','s',' ','(','p','a','s','s',' ','t','h','r','u',' ','E','N','D',' ','O','F',' ','F','I','L','E',')','.','\n', ' ',' ',' ',' ',' ',' ',' ',' ','^','F',' ','o','r',' ','@',' ',' ','S','t','a','r','t',' ','s','e','a','r','c','h',' ','a','t',' ','F','I','R','S','T',' ','f','i','l','e',' ','(','f','o','r',' ','/',')',' ','o','r',' ','l','a','s','t',' ','f','i','l','e',' ','(','f','o','r',' ','?',')','.','\n', @@ -114,9 +115,9 @@ constant char helpdata[] = { ' ',' ','-','?',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','h','e','l','p','\n', ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','i','s','p','l','a','y',' ','h','e','l','p',' ','(','f','r','o','m',' ','c','o','m','m','a','n','d',' ','l','i','n','e',')','.','\n', ' ',' ','-','a',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','s','e','a','r','c','h','-','s','k','i','p','-','s','c','r','e','e','n','\n', -' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','F','o','r','w','a','r','d',' ','s','e','a','r','c','h',' ','s','k','i','p','s',' ','c','u','r','r','e','n','t',' ','s','c','r','e','e','n','.','\n', +' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','S','e','a','r','c','h',' ','s','k','i','p','s',' ','c','u','r','r','e','n','t',' ','s','c','r','e','e','n','.','\n', ' ',' ','-','A',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','S','E','A','R','C','H','-','S','K','I','P','-','S','C','R','E','E','N','\n', -' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','F','o','r','w','a','r','d',' ','s','e','a','r','c','h',' ','a','l','w','a','y','s',' ','s','k','i','p','s',' ','t','a','r','g','e','t',' ','l','i','n','e','.','\n', +' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','S','e','a','r','c','h',' ','s','t','a','r','t','s',' ','j','u','s','t',' ','a','f','t','e','r',' ','t','a','r','g','e','t',' ','l','i','n','e','.','\n', ' ',' ','-','b',' ','[','_','\b','N',']',' ',' ','.','.','.','.',' ',' ','-','-','b','u','f','f','e','r','s','=','[','_','\b','N',']','\n', ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','N','u','m','b','e','r',' ','o','f',' ','b','u','f','f','e','r','s','.','\n', ' ',' ','-','B',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','a','u','t','o','-','b','u','f','f','e','r','s','\n', @@ -172,7 +173,7 @@ constant char helpdata[] = { ' ',' ','-','s',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','s','q','u','e','e','z','e','-','b','l','a','n','k','-','l','i','n','e','s','\n', ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','S','q','u','e','e','z','e',' ','m','u','l','t','i','p','l','e',' ','b','l','a','n','k',' ','l','i','n','e','s','.','\n', ' ',' ','-','S',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','c','h','o','p','-','l','o','n','g','-','l','i','n','e','s','\n', -' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','C','h','o','p',' ','l','o','n','g',' ','l','i','n','e','s','.','\n', +' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','C','h','o','p',' ','(','t','r','u','n','c','a','t','e',')',' ','l','o','n','g',' ','l','i','n','e','s',' ','r','a','t','h','e','r',' ','t','h','a','n',' ','w','r','a','p','p','i','n','g','.','\n', ' ',' ','-','t',' ','[','_','\b','t','_','\b','a','_','\b','g',']',' ',' ','.','.',' ',' ','-','-','t','a','g','=','[','_','\b','t','_','\b','a','_','\b','g',']','\n', ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','F','i','n','d',' ','a',' ','t','a','g','.','\n', ' ',' ','-','T',' ','[','_','\b','t','_','\b','a','_','\b','g','_','\b','s','_','\b','f','_','\b','i','_','\b','l','_','\b','e',']',' ','-','-','t','a','g','-','f','i','l','e','=','[','_','\b','t','_','\b','a','_','\b','g','_','\b','s','_','\b','f','_','\b','i','_','\b','l','_','\b','e',']','\n', @@ -189,8 +190,6 @@ constant char helpdata[] = { ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','S','e','t',' ','t','a','b',' ','s','t','o','p','s','.','\n', ' ',' ','-','X',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','n','o','-','i','n','i','t','\n', ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','o','n','\'','t',' ','u','s','e',' ','t','e','r','m','c','a','p',' ','i','n','i','t','/','d','e','i','n','i','t',' ','s','t','r','i','n','g','s','.','\n', -' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','-','-','n','o','-','k','e','y','p','a','d','\n', -' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','o','n','\'','t',' ','u','s','e',' ','t','e','r','m','c','a','p',' ','k','e','y','p','a','d',' ','i','n','i','t','/','d','e','i','n','i','t',' ','s','t','r','i','n','g','s','.','\n', ' ',' ','-','y',' ','[','_','\b','N',']',' ',' ','.','.','.','.',' ',' ','-','-','m','a','x','-','f','o','r','w','-','s','c','r','o','l','l','=','[','_','\b','N',']','\n', ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','F','o','r','w','a','r','d',' ','s','c','r','o','l','l',' ','l','i','m','i','t','.','\n', ' ',' ','-','z',' ','[','_','\b','N',']',' ',' ','.','.','.','.',' ',' ','-','-','w','i','n','d','o','w','=','[','_','\b','N',']','\n', @@ -202,7 +201,7 @@ constant char helpdata[] = { ' ',' ','-','#',' ','[','_','\b','N',']',' ',' ','.','.','.','.',' ',' ','-','-','s','h','i','f','t','=','[','_','\b','N',']','\n', ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','H','o','r','i','z','o','n','t','a','l',' ','s','c','r','o','l','l',' ','a','m','o','u','n','t',' ','(','0',' ','=',' ','o','n','e',' ','h','a','l','f',' ','s','c','r','e','e','n',' ','w','i','d','t','h',')','\n', ' ',' ',' ',' ',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','n','o','-','k','e','y','p','a','d','\n', -' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','o','n','\'','t',' ','s','e','n','d',' ','k','e','y','p','a','d',' ','i','n','i','t','/','d','e','i','n','i','t',' ','s','e','q','u','e','n','c','e','.','\n', +' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','o','n','\'','t',' ','s','e','n','d',' ','t','e','r','m','c','a','p',' ','k','e','y','p','a','d',' ','i','n','i','t','/','d','e','i','n','i','t',' ','s','t','r','i','n','g','s','.','\n', ' ',' ',' ',' ',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','f','o','l','l','o','w','-','n','a','m','e','\n', ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','T','h','e',' ','F',' ','c','o','m','m','a','n','d',' ','c','h','a','n','g','e','s',' ','f','i','l','e','s',' ','i','f',' ','t','h','e',' ','i','n','p','u','t',' ','f','i','l','e',' ','i','s',' ','r','e','n','a','m','e','d','.','\n', '\n', @@ -216,20 +215,20 @@ constant char helpdata[] = { '\n', ' ','R','i','g','h','t','A','r','r','o','w',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','l',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','r','i','g','h','t',' ','o','n','e',' ','c','h','a','r','a','c','t','e','r','.','\n', ' ','L','e','f','t','A','r','r','o','w',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','h',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','l','e','f','t',' ','o','n','e',' ','c','h','a','r','a','c','t','e','r','.','\n', -' ','C','N','T','L','-','R','i','g','h','t','A','r','r','o','w',' ',' ','E','S','C','-','R','i','g','h','t','A','r','r','o','w',' ',' ','E','S','C','-','w',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','r','i','g','h','t',' ','o','n','e',' ','w','o','r','d','.','\n', -' ','C','N','T','L','-','L','e','f','t','A','r','r','o','w',' ',' ',' ','E','S','C','-','L','e','f','t','A','r','r','o','w',' ',' ',' ','E','S','C','-','b',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','l','e','f','t',' ','o','n','e',' ','w','o','r','d','.','\n', +' ','c','t','r','l','-','R','i','g','h','t','A','r','r','o','w',' ',' ','E','S','C','-','R','i','g','h','t','A','r','r','o','w',' ',' ','E','S','C','-','w',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','r','i','g','h','t',' ','o','n','e',' ','w','o','r','d','.','\n', +' ','c','t','r','l','-','L','e','f','t','A','r','r','o','w',' ',' ',' ','E','S','C','-','L','e','f','t','A','r','r','o','w',' ',' ',' ','E','S','C','-','b',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','l','e','f','t',' ','o','n','e',' ','w','o','r','d','.','\n', ' ','H','O','M','E',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','0',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','t','o',' ','s','t','a','r','t',' ','o','f',' ','l','i','n','e','.','\n', ' ','E','N','D',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','$',' ',' ',' ',' ',' ','M','o','v','e',' ','c','u','r','s','o','r',' ','t','o',' ','e','n','d',' ','o','f',' ','l','i','n','e','.','\n', ' ','B','A','C','K','S','P','A','C','E',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','c','h','a','r',' ','t','o',' ','l','e','f','t',' ','o','f',' ','c','u','r','s','o','r','.','\n', ' ','D','E','L','E','T','E',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','x',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','c','h','a','r',' ','u','n','d','e','r',' ','c','u','r','s','o','r','.','\n', -' ','C','N','T','L','-','B','A','C','K','S','P','A','C','E',' ',' ',' ','E','S','C','-','B','A','C','K','S','P','A','C','E',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','w','o','r','d',' ','t','o',' ','l','e','f','t',' ','o','f',' ','c','u','r','s','o','r','.','\n', -' ','C','N','T','L','-','D','E','L','E','T','E',' ',' ',' ',' ',' ',' ','E','S','C','-','D','E','L','E','T','E',' ',' ',' ',' ',' ',' ','E','S','C','-','X',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','w','o','r','d',' ','u','n','d','e','r',' ','c','u','r','s','o','r','.','\n', -' ','C','N','T','L','-','U',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C',' ','(','M','S','-','D','O','S',' ','o','n','l','y',')',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','e','n','t','i','r','e',' ','l','i','n','e','.','\n', +' ','c','t','r','l','-','B','A','C','K','S','P','A','C','E',' ',' ',' ','E','S','C','-','B','A','C','K','S','P','A','C','E',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','w','o','r','d',' ','t','o',' ','l','e','f','t',' ','o','f',' ','c','u','r','s','o','r','.','\n', +' ','c','t','r','l','-','D','E','L','E','T','E',' ',' ',' ',' ',' ',' ','E','S','C','-','D','E','L','E','T','E',' ',' ',' ',' ',' ',' ','E','S','C','-','X',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','w','o','r','d',' ','u','n','d','e','r',' ','c','u','r','s','o','r','.','\n', +' ','c','t','r','l','-','U',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C',' ','(','M','S','-','D','O','S',' ','o','n','l','y',')',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','e','l','e','t','e',' ','e','n','t','i','r','e',' ','l','i','n','e','.','\n', ' ','U','p','A','r','r','o','w',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','k',' ',' ',' ',' ',' ','R','e','t','r','i','e','v','e',' ','p','r','e','v','i','o','u','s',' ','c','o','m','m','a','n','d',' ','l','i','n','e','.','\n', ' ','D','o','w','n','A','r','r','o','w',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','j',' ',' ',' ',' ',' ','R','e','t','r','i','e','v','e',' ','n','e','x','t',' ','c','o','m','m','a','n','d',' ','l','i','n','e','.','\n', ' ','T','A','B',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','C','o','m','p','l','e','t','e',' ','f','i','l','e','n','a','m','e',' ','&',' ','c','y','c','l','e','.','\n', ' ','S','H','I','F','T','-','T','A','B',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','S','C','-','T','A','B',' ',' ',' ','C','o','m','p','l','e','t','e',' ','f','i','l','e','n','a','m','e',' ','&',' ','r','e','v','e','r','s','e',' ','c','y','c','l','e','.','\n', -' ','C','N','T','L','-','L',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','C','o','m','p','l','e','t','e',' ','f','i','l','e','n','a','m','e',',',' ','l','i','s','t',' ','a','l','l','.','\n', +' ','c','t','r','l','-','L',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','C','o','m','p','l','e','t','e',' ','f','i','l','e','n','a','m','e',',',' ','l','i','s','t',' ','a','l','l','.','\n', '\n', '\n', 0 }; diff --git a/contrib/less/ifile.c b/contrib/less/ifile.c index 971e3b5e25e..68bea929571 100644 --- a/contrib/less/ifile.c +++ b/contrib/less/ifile.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/input.c b/contrib/less/input.c index b82868bca4d..9e3cf036e5b 100644 --- a/contrib/less/input.c +++ b/contrib/less/input.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -416,7 +415,7 @@ get_back_line: goto get_back_line; } - if (status_col && is_hilited(base_pos, ch_tell()-1, 1, NULL)) + if (status_col && curr_pos > 0 && is_hilited(base_pos, curr_pos-1, 1, NULL)) set_status_col('*'); #endif diff --git a/contrib/less/jump.c b/contrib/less/jump.c index d7ec77046f8..90ab4b18e94 100644 --- a/contrib/less/jump.c +++ b/contrib/less/jump.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/less.h b/contrib/less/less.h index bad585d3a1f..efdf66b70a1 100644 --- a/contrib/less/less.h +++ b/contrib/less/less.h @@ -1,13 +1,12 @@ /* $FreeBSD$ */ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ #define NEWBOT 1 @@ -486,10 +485,13 @@ struct textlist #define CH_KEEPOPEN 002 #define CH_POPENED 004 #define CH_HELPFILE 010 +#define CH_NODATA 020 /* Special case for zero length files */ + #define ch_zero() ((POSITION)0) #define FAKE_HELPFILE "@/\\less/\\help/\\file/\\@" +#define FAKE_EMPTYFILE "@/\\less/\\empty/\\file/\\@" /* Flags for cvt_text */ #define CVT_TO_LC 01 /* Convert upper-case to lower-case */ diff --git a/contrib/less/less.hlp b/contrib/less/less.hlp index 84d951f0d53..1194a6339ba 100644 --- a/contrib/less/less.hlp +++ b/contrib/less/less.hlp @@ -3,6 +3,7 @@ Commands marked with * may be preceded by a number, _N. Notes in parentheses indicate the behavior if _N is given. + A key preceded by a carat indicates the Ctrl key; thus ^K is ctrl-K. h H Display this help. q :q Q :Q ZZ Exit. @@ -40,7 +41,7 @@ ESC-u Undo (toggle) search highlighting. &_p_a_t_t_e_r_n * Display only matching lines --------------------------------------------------- - Search patterns may be modified by one or more of: + A search pattern may be preceded by one or more of: ^N or ! Search for NON-matching lines. ^E or * Search multiple files (pass thru END OF FILE). ^F or @ Start search at FIRST file (for /) or last file (for ?). @@ -111,9 +112,9 @@ -? ........ --help Display help (from command line). -a ........ --search-skip-screen - Forward search skips current screen. + Search skips current screen. -A ........ --SEARCH-SKIP-SCREEN - Forward search always skips target line. + Search starts just after target line. -b [_N] .... --buffers=[_N] Number of buffers. -B ........ --auto-buffers @@ -169,7 +170,7 @@ -s ........ --squeeze-blank-lines Squeeze multiple blank lines. -S ........ --chop-long-lines - Chop long lines. + Chop (truncate) long lines rather than wrapping. -t [_t_a_g] .. --tag=[_t_a_g] Find a tag. -T [_t_a_g_s_f_i_l_e] --tag-file=[_t_a_g_s_f_i_l_e] @@ -186,8 +187,6 @@ Set tab stops. -X ........ --no-init Don't use termcap init/deinit strings. - --no-keypad - Don't use termcap keypad init/deinit strings. -y [_N] .... --max-forw-scroll=[_N] Forward scroll limit. -z [_N] .... --window=[_N] @@ -199,7 +198,7 @@ -# [_N] .... --shift=[_N] Horizontal scroll amount (0 = one half screen width) ........ --no-keypad - Don't send keypad init/deinit sequence. + Don't send termcap keypad init/deinit strings. ........ --follow-name The F command changes files if the input file is renamed. @@ -213,19 +212,19 @@ RightArrow ESC-l Move cursor right one character. LeftArrow ESC-h Move cursor left one character. - CNTL-RightArrow ESC-RightArrow ESC-w Move cursor right one word. - CNTL-LeftArrow ESC-LeftArrow ESC-b Move cursor left one word. + ctrl-RightArrow ESC-RightArrow ESC-w Move cursor right one word. + ctrl-LeftArrow ESC-LeftArrow ESC-b Move cursor left one word. HOME ESC-0 Move cursor to start of line. END ESC-$ Move cursor to end of line. BACKSPACE Delete char to left of cursor. DELETE ESC-x Delete char under cursor. - CNTL-BACKSPACE ESC-BACKSPACE Delete word to left of cursor. - CNTL-DELETE ESC-DELETE ESC-X Delete word under cursor. - CNTL-U ESC (MS-DOS only) Delete entire line. + ctrl-BACKSPACE ESC-BACKSPACE Delete word to left of cursor. + ctrl-DELETE ESC-DELETE ESC-X Delete word under cursor. + ctrl-U ESC (MS-DOS only) Delete entire line. UpArrow ESC-k Retrieve previous command line. DownArrow ESC-j Retrieve next command line. TAB Complete filename & cycle. SHIFT-TAB ESC-TAB Complete filename & reverse cycle. - CNTL-L Complete filename, list all. + ctrl-L Complete filename, list all. diff --git a/contrib/less/less.man b/contrib/less/less.man index a54609d953e..913f38c45ea 100644 --- a/contrib/less/less.man +++ b/contrib/less/less.man @@ -107,6 +107,10 @@ LESS(1) LESS(1) which is growing while it is being viewed. (The behavior is similar to the "tail -f" command.) + ESC-F Like F, but as soon as a line is found which matches the last + search pattern, the terminal bell is rung and forward scrolling + stops. + g or < or ESC-< Go to line N in the file, default 1 (beginning of file). (Warn- ing: this may be slow if N is large.) @@ -709,59 +713,60 @@ LESS(1) LESS(1) blank line. This is useful when viewing nroff output. -S or --chop-long-lines - Causes lines longer than the screen width to be chopped rather - than folded. That is, the portion of a long line that does not - fit in the screen width is not shown. The default is to fold - long lines; that is, display the remainder on the next line. + Causes lines longer than the screen width to be chopped (trun- + cated) rather than wrapped. That is, the portion of a long line + that does not fit in the screen width is not shown. The default + is to wrap long lines; that is, display the remainder on the + next line. -ttag or --tag=tag The -t option, followed immediately by a TAG, will edit the file - containing that tag. For this to work, tag information must be - available; for example, there may be a file in the current + containing that tag. For this to work, tag information must be + available; for example, there may be a file in the current directory called "tags", which was previously built by ctags (1) or an equivalent command. If the environment variable LESSGLOB- - ALTAGS is set, it is taken to be the name of a command compati- - ble with global (1), and that command is executed to find the + ALTAGS is set, it is taken to be the name of a command compati- + ble with global (1), and that command is executed to find the tag. (See http://www.gnu.org/software/global/global.html). The - -t option may also be specified from within less (using the - - command) as a way of examining a new file. The command ":t" is + -t option may also be specified from within less (using the - + command) as a way of examining a new file. The command ":t" is equivalent to specifying -t from within less. -Ttagsfile or --tag-file=tagsfile Specifies a tags file to be used instead of "tags". -u or --underline-special - Causes backspaces and carriage returns to be treated as print- - able characters; that is, they are sent to the terminal when + Causes backspaces and carriage returns to be treated as print- + able characters; that is, they are sent to the terminal when they appear in the input. -U or --UNDERLINE-SPECIAL - Causes backspaces, tabs and carriage returns to be treated as - control characters; that is, they are handled as specified by + Causes backspaces, tabs and carriage returns to be treated as + control characters; that is, they are handled as specified by the -r option. - By default, if neither -u nor -U is given, backspaces which - appear adjacent to an underscore character are treated spe- - cially: the underlined text is displayed using the terminal's - hardware underlining capability. Also, backspaces which appear - between two identical characters are treated specially: the - overstruck text is printed using the terminal's hardware bold- - face capability. Other backspaces are deleted, along with the + By default, if neither -u nor -U is given, backspaces which + appear adjacent to an underscore character are treated spe- + cially: the underlined text is displayed using the terminal's + hardware underlining capability. Also, backspaces which appear + between two identical characters are treated specially: the + overstruck text is printed using the terminal's hardware bold- + face capability. Other backspaces are deleted, along with the preceding character. Carriage returns immediately followed by a - newline are deleted. other carriage returns are handled as - specified by the -r option. Text which is overstruck or under- + newline are deleted. Other carriage returns are handled as + specified by the -r option. Text which is overstruck or under- lined can be searched for if neither -u nor -U is in effect. -V or --version Displays the version number of less. -w or --hilite-unread - Temporarily highlights the first "new" line after a forward + Temporarily highlights the first "new" line after a forward movement of a full page. The first "new" line is the line imme- - diately following the line previously at the bottom of the + diately following the line previously at the bottom of the screen. Also highlights the target line after a g or p command. - The highlight is removed at the next command which causes move- - ment. The entire line is highlighted, unless the -J option is + The highlight is removed at the next command which causes move- + ment. The entire line is highlighted, unless the -J option is in effect, in which case only the status column is highlighted. -W or --HILITE-UNREAD @@ -769,48 +774,48 @@ LESS(1) LESS(1) forward movement command larger than one line. -xn,... or --tabs=n,... - Sets tab stops. If only one n is specified, tab stops are set - at multiples of n. If multiple values separated by commas are - specified, tab stops are set at those positions, and then con- - tinue with the same spacing as the last two. For example, - -x9,17 will set tabs at positions 9, 17, 25, 33, etc. The + Sets tab stops. If only one n is specified, tab stops are set + at multiples of n. If multiple values separated by commas are + specified, tab stops are set at those positions, and then con- + tinue with the same spacing as the last two. For example, + -x9,17 will set tabs at positions 9, 17, 25, 33, etc. The default for n is 8. -X or --no-init Disables sending the termcap initialization and deinitialization - strings to the terminal. This is sometimes desirable if the - deinitialization string does something unnecessary, like clear- + strings to the terminal. This is sometimes desirable if the + deinitialization string does something unnecessary, like clear- ing the screen. -yn or --max-forw-scroll=n Specifies a maximum number of lines to scroll forward. If it is - necessary to scroll forward more than n lines, the screen is - repainted instead. The -c or -C option may be used to repaint - from the top of the screen if desired. By default, any forward + necessary to scroll forward more than n lines, the screen is + repainted instead. The -c or -C option may be used to repaint + from the top of the screen if desired. By default, any forward movement causes scrolling. -[z]n or --window=n - Changes the default scrolling window size to n lines. The + Changes the default scrolling window size to n lines. The default is one screenful. The z and w commands can also be used - to change the window size. The "z" may be omitted for compati- + to change the window size. The "z" may be omitted for compati- bility with some versions of more. If the number n is negative, - it indicates n lines less than the current screen size. For + it indicates n lines less than the current screen size. For example, if the screen is 24 lines, -z-4 sets the scrolling win- - dow to 20 lines. If the screen is resized to 40 lines, the + dow to 20 lines. If the screen is resized to 40 lines, the scrolling window automatically changes to 36 lines. -"cc or --quotes=cc - Changes the filename quoting character. This may be necessary - if you are trying to name a file which contains both spaces and - quote characters. Followed by a single character, this changes - the quote character to that character. Filenames containing a + Changes the filename quoting character. This may be necessary + if you are trying to name a file which contains both spaces and + quote characters. Followed by a single character, this changes + the quote character to that character. Filenames containing a space should then be surrounded by that character rather than by - double quotes. Followed by two characters, changes the open - quote to the first character, and the close quote to the second + double quotes. Followed by two characters, changes the open + quote to the first character, and the close quote to the second character. Filenames containing a space should then be preceded - by the open quote character and followed by the close quote - character. Note that even after the quote characters are - changed, this option remains -" (a dash followed by a double + by the open quote character and followed by the close quote + character. Note that even after the quote characters are + changed, this option remains -" (a dash followed by a double quote). -~ or --tilde @@ -820,60 +825,60 @@ LESS(1) LESS(1) -# or --shift Specifies the default number of positions to scroll horizontally - in the RIGHTARROW and LEFTARROW commands. If the number speci- - fied is zero, it sets the default number of positions to one + in the RIGHTARROW and LEFTARROW commands. If the number speci- + fied is zero, it sets the default number of positions to one half of the screen width. Alternately, the number may be speci- - fied as a fraction of the width of the screen, starting with a - decimal point: .5 is half of the screen width, .3 is three - tenths of the screen width, and so on. If the number is speci- - fied as a fraction, the actual number of scroll positions is - recalculated if the terminal window is resized, so that the - actual scroll remains at the specified fraction of the screen + fied as a fraction of the width of the screen, starting with a + decimal point: .5 is half of the screen width, .3 is three + tenths of the screen width, and so on. If the number is speci- + fied as a fraction, the actual number of scroll positions is + recalculated if the terminal window is resized, so that the + actual scroll remains at the specified fraction of the screen width. --no-keypad - Disables sending the keypad initialization and deinitialization + Disables sending the keypad initialization and deinitialization strings to the terminal. This is sometimes useful if the keypad strings make the numeric keypad behave in an undesirable manner. --follow-name - Normally, if the input file is renamed while an F command is - executing, less will continue to display the contents of the - original file despite its name change. If --follow-name is + Normally, if the input file is renamed while an F command is + executing, less will continue to display the contents of the + original file despite its name change. If --follow-name is specified, during an F command less will periodically attempt to reopen the file by name. If the reopen succeeds and the file is - a different file from the original (which means that a new file - has been created with the same name as the original (now + a different file from the original (which means that a new file + has been created with the same name as the original (now renamed) file), less will display the contents of that new file. - -- A command line argument of "--" marks the end of option argu- - ments. Any arguments following this are interpreted as file- + -- A command line argument of "--" marks the end of option argu- + ments. Any arguments following this are interpreted as file- names. This can be useful when viewing a file whose name begins with a "-" or "+". - + If a command line option begins with +, the remainder of that - option is taken to be an initial command to less. For example, - +G tells less to start at the end of the file rather than the - beginning, and +/xyz tells it to start at the first occurrence - of "xyz" in the file. As a special case, + acts like + + If a command line option begins with +, the remainder of that + option is taken to be an initial command to less. For example, + +G tells less to start at the end of the file rather than the + beginning, and +/xyz tells it to start at the first occurrence + of "xyz" in the file. As a special case, + acts like +g; that is, it starts the display at the specified line - number (however, see the caveat under the "g" command above). - If the option starts with ++, the initial command applies to - every file being viewed, not just the first one. The + command + number (however, see the caveat under the "g" command above). + If the option starts with ++, the initial command applies to + every file being viewed, not just the first one. The + command described previously may also be used to set (or change) an ini- tial command for every file. LINE EDITING - When entering command line at the bottom of the screen (for example, a + When entering command line at the bottom of the screen (for example, a filename for the :e command, or the pattern for a search command), cer- - tain keys can be used to manipulate the command line. Most commands - have an alternate form in [ brackets ] which can be used if a key does - not exist on a particular keyboard. (Note that the forms beginning - with ESC do not work in some MS-DOS and Windows systems because ESC is - the line erase character.) Any of these special keys may be entered - literally by preceding it with the "literal" character, either ^V or - ^A. A backslash itself may also be entered literally by entering two + tain keys can be used to manipulate the command line. Most commands + have an alternate form in [ brackets ] which can be used if a key does + not exist on a particular keyboard. (Note that the forms beginning + with ESC do not work in some MS-DOS and Windows systems because ESC is + the line erase character.) Any of these special keys may be entered + literally by preceding it with the "literal" character, either ^V or + ^A. A backslash itself may also be entered literally by entering two backslashes. LEFTARROW [ ESC-h ] @@ -883,7 +888,7 @@ LESS(1) LESS(1) Move the cursor one space to the right. ^LEFTARROW [ ESC-b or ESC-LEFTARROW ] - (That is, CONTROL and LEFTARROW simultaneously.) Move the cur- + (That is, CONTROL and LEFTARROW simultaneously.) Move the cur- sor one word to the left. ^RIGHTARROW [ ESC-w or ESC-RIGHTARROW ] @@ -897,44 +902,48 @@ LESS(1) LESS(1) Move the cursor to the end of the line. BACKSPACE - Delete the character to the left of the cursor, or cancel the + Delete the character to the left of the cursor, or cancel the command if the command line is empty. DELETE or [ ESC-x ] Delete the character under the cursor. ^BACKSPACE [ ESC-BACKSPACE ] - (That is, CONTROL and BACKSPACE simultaneously.) Delete the + (That is, CONTROL and BACKSPACE simultaneously.) Delete the word to the left of the cursor. ^DELETE [ ESC-X or ESC-DELETE ] - (That is, CONTROL and DELETE simultaneously.) Delete the word + (That is, CONTROL and DELETE simultaneously.) Delete the word under the cursor. UPARROW [ ESC-k ] - Retrieve the previous command line. + Retrieve the previous command line. If you first enter some + text and then press UPARROW, it will retrieve the previous com- + mand which begins with that text. DOWNARROW [ ESC-j ] - Retrieve the next command line. + Retrieve the next command line. If you first enter some text + and then press DOWNARROW, it will retrieve the next command + which begins with that text. - TAB Complete the partial filename to the left of the cursor. If it - matches more than one filename, the first match is entered into - the command line. Repeated TABs will cycle thru the other + TAB Complete the partial filename to the left of the cursor. If it + matches more than one filename, the first match is entered into + the command line. Repeated TABs will cycle thru the other matching filenames. If the completed filename is a directory, a - "/" is appended to the filename. (On MS-DOS systems, a "\" is - appended.) The environment variable LESSSEPARATOR can be used + "/" is appended to the filename. (On MS-DOS systems, a "\" is + appended.) The environment variable LESSSEPARATOR can be used to specify a different character to append to a directory name. BACKTAB [ ESC-TAB ] Like, TAB, but cycles in the reverse direction thru the matching filenames. - ^L Complete the partial filename to the left of the cursor. If it + ^L Complete the partial filename to the left of the cursor. If it matches more than one filename, all matches are entered into the command line (if they fit). ^U (Unix and OS/2) or ESC (MS-DOS) - Delete the entire command line, or cancel the command if the + Delete the entire command line, or cancel the command if the command line is empty. If you have changed your line-kill char- acter in Unix to something other than ^U, that character is used instead of ^U. @@ -943,72 +952,72 @@ LESS(1) LESS(1) KEY BINDINGS - You may define your own less commands by using the program lesskey (1) - to create a lesskey file. This file specifies a set of command keys - and an action associated with each key. You may also use lesskey to + You may define your own less commands by using the program lesskey (1) + to create a lesskey file. This file specifies a set of command keys + and an action associated with each key. You may also use lesskey to change the line-editing keys (see LINE EDITING), and to set environment - variables. If the environment variable LESSKEY is set, less uses that - as the name of the lesskey file. Otherwise, less looks in a standard - place for the lesskey file: On Unix systems, less looks for a lesskey - file called "$HOME/.less". On MS-DOS and Windows systems, less looks - for a lesskey file called "$HOME/_less", and if it is not found there, + variables. If the environment variable LESSKEY is set, less uses that + as the name of the lesskey file. Otherwise, less looks in a standard + place for the lesskey file: On Unix systems, less looks for a lesskey + file called "$HOME/.less". On MS-DOS and Windows systems, less looks + for a lesskey file called "$HOME/_less", and if it is not found there, then looks for a lesskey file called "_less" in any directory specified - in the PATH environment variable. On OS/2 systems, less looks for a - lesskey file called "$HOME/less.ini", and if it is not found, then - looks for a lesskey file called "less.ini" in any directory specified + in the PATH environment variable. On OS/2 systems, less looks for a + lesskey file called "$HOME/less.ini", and if it is not found, then + looks for a lesskey file called "less.ini" in any directory specified in the INIT environment variable, and if it not found there, then looks - for a lesskey file called "less.ini" in any directory specified in the - PATH environment variable. See the lesskey manual page for more + for a lesskey file called "less.ini" in any directory specified in the + PATH environment variable. See the lesskey manual page for more details. - A system-wide lesskey file may also be set up to provide key bindings. + A system-wide lesskey file may also be set up to provide key bindings. If a key is defined in both a local lesskey file and in the system-wide - file, key bindings in the local file take precedence over those in the - system-wide file. If the environment variable LESSKEY_SYSTEM is set, + file, key bindings in the local file take precedence over those in the + system-wide file. If the environment variable LESSKEY_SYSTEM is set, less uses that as the name of the system-wide lesskey file. Otherwise, - less looks in a standard place for the system-wide lesskey file: On - Unix systems, the system-wide lesskey file is /usr/local/etc/sysless. - (However, if less was built with a different sysconf directory than + less looks in a standard place for the system-wide lesskey file: On + Unix systems, the system-wide lesskey file is /usr/local/etc/sysless. + (However, if less was built with a different sysconf directory than /usr/local/etc, that directory is where the sysless file is found.) On - MS-DOS and Windows systems, the system-wide lesskey file is c:\_sys- + MS-DOS and Windows systems, the system-wide lesskey file is c:\_sys- less. On OS/2 systems, the system-wide lesskey file is c:\sysless.ini. INPUT PREPROCESSOR - You may define an "input preprocessor" for less. Before less opens a + You may define an "input preprocessor" for less. Before less opens a file, it first gives your input preprocessor a chance to modify the way - the contents of the file are displayed. An input preprocessor is sim- - ply an executable program (or shell script), which writes the contents + the contents of the file are displayed. An input preprocessor is sim- + ply an executable program (or shell script), which writes the contents of the file to a different file, called the replacement file. The con- - tents of the replacement file are then displayed in place of the con- - tents of the original file. However, it will appear to the user as if - the original file is opened; that is, less will display the original + tents of the replacement file are then displayed in place of the con- + tents of the original file. However, it will appear to the user as if + the original file is opened; that is, less will display the original filename as the name of the current file. - An input preprocessor receives one command line argument, the original - filename, as entered by the user. It should create the replacement - file, and when finished, print the name of the replacement file to its - standard output. If the input preprocessor does not output a replace- - ment filename, less uses the original file, as normal. The input pre- - processor is not called when viewing standard input. To set up an - input preprocessor, set the LESSOPEN environment variable to a command - line which will invoke your input preprocessor. This command line - should include one occurrence of the string "%s", which will be - replaced by the filename when the input preprocessor command is + An input preprocessor receives one command line argument, the original + filename, as entered by the user. It should create the replacement + file, and when finished, print the name of the replacement file to its + standard output. If the input preprocessor does not output a replace- + ment filename, less uses the original file, as normal. The input pre- + processor is not called when viewing standard input. To set up an + input preprocessor, set the LESSOPEN environment variable to a command + line which will invoke your input preprocessor. This command line + should include one occurrence of the string "%s", which will be + replaced by the filename when the input preprocessor command is invoked. When less closes a file opened in such a way, it will call another pro- - gram, called the input postprocessor, which may perform any desired - clean-up action (such as deleting the replacement file created by + gram, called the input postprocessor, which may perform any desired + clean-up action (such as deleting the replacement file created by LESSOPEN). This program receives two command line arguments, the orig- - inal filename as entered by the user, and the name of the replacement - file. To set up an input postprocessor, set the LESSCLOSE environment - variable to a command line which will invoke your input postprocessor. - It may include two occurrences of the string "%s"; the first is - replaced with the original name of the file and the second with the + inal filename as entered by the user, and the name of the replacement + file. To set up an input postprocessor, set the LESSCLOSE environment + variable to a command line which will invoke your input postprocessor. + It may include two occurrences of the string "%s"; the first is + replaced with the original name of the file and the second with the name of the replacement file, which was output by LESSOPEN. - For example, on many Unix systems, these two scripts will allow you to + For example, on many Unix systems, these two scripts will allow you to keep files in compressed format, but still let less view them directly: lessopen.sh: @@ -1027,50 +1036,65 @@ LESS(1) LESS(1) #! /bin/sh rm $2 - To use these scripts, put them both where they can be executed and set + To use these scripts, put them both where they can be executed and set LESSOPEN="lessopen.sh %s", and LESSCLOSE="lessclose.sh %s %s". More - complex LESSOPEN and LESSCLOSE scripts may be written to accept other + complex LESSOPEN and LESSCLOSE scripts may be written to accept other types of compressed files, and so on. - It is also possible to set up an input preprocessor to pipe the file - data directly to less, rather than putting the data into a replacement + It is also possible to set up an input preprocessor to pipe the file + data directly to less, rather than putting the data into a replacement file. This avoids the need to decompress the entire file before start- ing to view it. An input preprocessor that works this way is called an - input pipe. An input pipe, instead of writing the name of a replace- - ment file on its standard output, writes the entire contents of the - replacement file on its standard output. If the input pipe does not - write any characters on its standard output, then there is no replace- - ment file and less uses the original file, as normal. To use an input - pipe, make the first character in the LESSOPEN environment variable a - vertical bar (|) to signify that the input preprocessor is an input + input pipe. An input pipe, instead of writing the name of a replace- + ment file on its standard output, writes the entire contents of the + replacement file on its standard output. If the input pipe does not + write any characters on its standard output, then there is no replace- + ment file and less uses the original file, as normal. To use an input + pipe, make the first character in the LESSOPEN environment variable a + vertical bar (|) to signify that the input preprocessor is an input pipe. - For example, on many Unix systems, this script will work like the pre- + For example, on many Unix systems, this script will work like the pre- vious example scripts: lesspipe.sh: #! /bin/sh case "$1" in *.Z) uncompress -c $1 2>/dev/null + *) exit 1 ;; esac + exit $? To use this script, put it where it can be executed and set - LESSOPEN="|lesspipe.sh %s". When an input pipe is used, a LESSCLOSE - postprocessor can be used, but it is usually not necessary since there - is no replacement file to clean up. In this case, the replacement file - name passed to the LESSCLOSE postprocessor is "-". + LESSOPEN="|lesspipe.sh %s". - For compatibility with previous versions of less, the input preproces- + Note that a preprocessor cannot output an empty file, since that is + interpreted as meaning there is no replacement, and the original file + is used. To avoid this, if LESSOPEN starts with two vertical bars, the + exit status of the script becomes meaningful. If the exit status is + zero, the output is considered to be replacement text, even if it + empty. If the exit status is nonzero, any output is ignored and the + original file is used. For compatibility with previous versions of + less, if LESSOPEN starts with only one vertical bar, the exit status of + the preprocessor is ignored. + + When an input pipe is used, a LESSCLOSE postprocessor can be used, but + it is usually not necessary since there is no replacement file to clean + up. In this case, the replacement file name passed to the LESSCLOSE + postprocessor is "-". + + For compatibility with previous versions of less, the input preproces- sor or pipe is not used if less is viewing standard input. However, if - the first character of LESSOPEN is a dash (-), the input preprocessor - is used on standard input as well as other files. In this case, the - dash is not considered to be part of the preprocessor command. If + the first character of LESSOPEN is a dash (-), the input preprocessor + is used on standard input as well as other files. In this case, the + dash is not considered to be part of the preprocessor command. If standard input is being viewed, the input preprocessor is passed a file - name consisting of a single dash. Similarly, if the first two charac- - ters of LESSOPEN are vertical bar and dash (|-), the input pipe is used - on standard input as well as other files. Again, in this case the dash - is not considered to be part of the input pipe command. + name consisting of a single dash. Similarly, if the first two charac- + ters of LESSOPEN are vertical bar and dash (|-) or two vertical bars + and a dash (||-), the input pipe is used on standard input as well as + other files. Again, in this case the dash is not considered to be part + of the input pipe command. NATIONAL CHARACTER SETS @@ -1535,10 +1559,13 @@ LESS(1) LESS(1) the window system's idea of the screen size takes precedence over the LINES and COLUMNS environment variables.) - PATH User's search path (used to find a lesskey file on MS-DOS and + MORE Options which are passed to less automatically when running in + more compatible mode. + + PATH User's search path (used to find a lesskey file on MS-DOS and OS/2 systems). - SHELL The shell used to execute the ! command, as well as to expand + SHELL The shell used to execute the ! command, as well as to expand filenames. TERM The type of terminal on which less is being run. @@ -1551,28 +1578,27 @@ LESS(1) LESS(1) COPYRIGHT - Copyright (C) 1984-2011 Mark Nudelman + Copyright (C) 1984-2012 Mark Nudelman - less is part of the GNU project and is free software. You can redis- - tribute it and/or modify it under the terms of either (1) the GNU Gen- - eral Public License as published by the Free Software Foundation; or + less is part of the GNU project and is free software. You can redis- + tribute it and/or modify it under the terms of either (1) the GNU Gen- + eral Public License as published by the Free Software Foundation; or (2) the Less License. See the file README in the less distribution for more details regarding redistribution. You should have received a copy - of the GNU General Public License along with the source for less; see - the file COPYING. If not, write to the Free Software Foundation, 59 - Temple Place, Suite 330, Boston, MA 02111-1307, USA. You should also + of the GNU General Public License along with the source for less; see + the file COPYING. If not, write to the Free Software Foundation, 59 + Temple Place, Suite 330, Boston, MA 02111-1307, USA. You should also have received a copy of the Less License; see the file LICENSE. less is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FIT- - NESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + WARRANTY; without even the implied warranty of MERCHANTABILITY or FIT- + NESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. AUTHOR - Mark Nudelman - Send bug reports or comments to the above address or to bug- - less@gnu.org. + Mark Nudelman + Send bug reports or comments to bug-less@gnu.org. See http://www.greenwoodsoftware.com/less/bugs.html for the latest list of known bugs in less. For more information, see the less homepage at @@ -1580,4 +1606,4 @@ LESS(1) LESS(1) - Version 444: 09 Jun 2011 LESS(1) + Version 449: 26 Jun 2012 LESS(1) diff --git a/contrib/less/less.nro b/contrib/less/less.nro index 0bc21b505cd..0ee74418fd4 100644 --- a/contrib/less/less.nro +++ b/contrib/less/less.nro @@ -1,4 +1,4 @@ -.TH LESS 1 "Version 444: 09 Jun 2011" +.TH LESS 1 "Version 449: 26 Jun 2012" .SH NAME less \- opposite of more .SH SYNOPSIS @@ -109,6 +109,10 @@ Normally this command would be used when already at the end of the file. It is a way to monitor the tail of a file which is growing while it is being viewed. (The behavior is similar to the "tail \-f" command.) +.IP "ESC-F" +Like F, but as soon as a line is found which matches +the last search pattern, the terminal bell is rung +and forward scrolling stops. .IP "g or < or ESC-<" Go to line N in the file, default 1 (beginning of file). (Warning: this may be slow if N is large.) @@ -761,10 +765,10 @@ This is useful when viewing output. .IP "\-S or \-\-chop-long-lines" Causes lines longer than the screen width to be -chopped rather than folded. +chopped (truncated) rather than wrapped. That is, the portion of a long line that does not fit in the screen width is not shown. -The default is to fold long lines; that is, display the remainder +The default is to wrap long lines; that is, display the remainder on the next line. .IP "\-t\fItag\fP or \-\-tag=\fItag\fP" The \-t option, followed immediately by a TAG, @@ -805,7 +809,7 @@ the overstruck text is printed using the terminal's hardware boldface capability. Other backspaces are deleted, along with the preceding character. Carriage returns immediately followed by a newline are deleted. -other carriage returns are handled as specified by the \-r option. +Other carriage returns are handled as specified by the \-r option. Text which is overstruck or underlined can be searched for if neither \-u nor \-U is in effect. .IP "\-V or \-\-version" @@ -963,8 +967,12 @@ Delete the word to the left of the cursor. Delete the word under the cursor. .IP "UPARROW [ ESC-k ]" Retrieve the previous command line. +If you first enter some text and then press UPARROW, +it will retrieve the previous command which begins with that text. .IP "DOWNARROW [ ESC-j ]" Retrieve the next command line. +If you first enter some text and then press DOWNARROW, +it will retrieve the next command which begins with that text. .IP "TAB" Complete the partial filename to the left of the cursor. If it matches more than one filename, the first match @@ -1157,14 +1165,33 @@ lesspipe.sh: case "$1" in .br *.Z) uncompress \-c $1 2>/dev/null +.br + *) exit 1 .br ;; .br esac +.br + exit $? .br .PP To use this script, put it where it can be executed and set LESSOPEN="|lesspipe.sh %s". +.PP +Note that a preprocessor cannot output an empty file, since that +is interpreted as meaning there is no replacement, and +the original file is used. +To avoid this, if LESSOPEN starts with two vertical bars, +the exit status of the script becomes meaningful. +If the exit status is zero, the output is considered to be +replacement text, even if it empty. +If the exit status is nonzero, any output is ignored and the +original file is used. +For compatibility with previous versions of +.I less, +if LESSOPEN starts with only one vertical bar, the exit status +of the preprocessor is ignored. +.PP When an input pipe is used, a LESSCLOSE postprocessor can be used, but it is usually not necessary since there is no replacement file to clean up. @@ -1183,7 +1210,8 @@ the preprocessor command. If standard input is being viewed, the input preprocessor is passed a file name consisting of a single dash. Similarly, if the first two characters of LESSOPEN are vertical bar and dash -(|\-), the input pipe is used on standard input as well as other files. +(|\-) or two vertical bars and a dash (||\-), +the input pipe is used on standard input as well as other files. Again, in this case the dash is not considered to be part of the input pipe command. @@ -1666,6 +1694,12 @@ Takes precedence over the number of lines specified by the TERM variable. (But if you have a windowing system which supports TIOCGWINSZ or WIOCGETD, the window system's idea of the screen size takes precedence over the LINES and COLUMNS environment variables.) +.IP MORE +Options which are passed to +.I less +automatically when running in +.I more +compatible mode. .IP PATH User's search path (used to find a lesskey file on MS-DOS and OS/2 systems). @@ -1682,7 +1716,7 @@ The name of the editor (used for the v command). lesskey(1) .SH COPYRIGHT -Copyright (C) 1984-2011 Mark Nudelman +Copyright (C) 1984-2012 Mark Nudelman .PP less is part of the GNU project and is free software. You can redistribute it and/or modify it @@ -1705,9 +1739,9 @@ See the GNU General Public License for more details. .SH AUTHOR .PP -Mark Nudelman +Mark Nudelman .br -Send bug reports or comments to the above address or to bug-less@gnu.org. +Send bug reports or comments to bug-less@gnu.org. .br See http://www.greenwoodsoftware.com/less/bugs.html for the latest list of known bugs in less. .br diff --git a/contrib/less/lessecho.c b/contrib/less/lessecho.c index 6dcaf6c820b..cdadd7249ed 100644 --- a/contrib/less/lessecho.c +++ b/contrib/less/lessecho.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -28,7 +27,7 @@ #include "less.h" -static char *version = "$Revision: 1.14 $"; +static char *version = "$Revision: 1.15 $"; static int quote_all = 0; static char openquote = '"'; diff --git a/contrib/less/lessecho.man b/contrib/less/lessecho.man index 682b0bd835e..e28f3c1f05b 100644 --- a/contrib/less/lessecho.man +++ b/contrib/less/lessecho.man @@ -10,12 +10,18 @@ LESSECHO(1) LESSECHO(1) DESCRIPTION lessecho is a program that simply echos its arguments on standard out- - put. But any argument containing spaces is enclosed in quotes. + put. But any metacharacter in the output is preceded by an "escape" + character, which by default is a backslash. OPTIONS A summary of options is included below. - -ox Specifies "x" to be the open quote character. + -ex Specifies "x", rather than backslash, to be the escape char for + metachars. If x is "-", no escape char is used and arguments + containing metachars are surrounded by quotes instead. + + -ox Specifies "x", rather than double-quote, to be the open quote + character, which is used if the -e- option is specified. -cx Specifies "x" to be the close quote character. @@ -23,27 +29,26 @@ LESSECHO(1) LESSECHO(1) -dn Specifies "n" to be the close quote character, as an integer. - -mx Specifies "x" to be a metachar. + -mx Specifies "x" to be a metachar. By default, no characters are + considered metachars. -nn Specifies "n" to be a metachar, as an integer. - -ex Specifies "x" to be the escape char for metachars. - - -fn Specifies "n" to be the escape char for metachars, as an inte- + -fn Specifies "n" to be the escape char for metachars, as an inte- ger. - -a Specifies that all arguments are to be quoted. The default is - that only arguments containing spaces are quoted. + -a Specifies that all arguments are to be quoted. The default is + that only arguments containing metacharacters are quoted SEE ALSO less(1) AUTHOR - This manual page was written by Thomas Schoepf , + This manual page was written by Thomas Schoepf , for the Debian GNU/Linux system (but may be used by others). Send bug reports or comments to bug-less@gnu.org. - Version 444: 09 Jun 2011 LESSECHO(1) + Version 449: 26 Jun 2012 LESSECHO(1) diff --git a/contrib/less/lessecho.nro b/contrib/less/lessecho.nro index 46540e8bcca..a2030c77c0f 100644 --- a/contrib/less/lessecho.nro +++ b/contrib/less/lessecho.nro @@ -1,4 +1,4 @@ -.TH LESSECHO 1 "Version 444: 09 Jun 2011" +.TH LESSECHO 1 "Version 449: 26 Jun 2012" .SH NAME lessecho \- expand metacharacters .SH SYNOPSIS @@ -7,12 +7,19 @@ lessecho \- expand metacharacters .SH "DESCRIPTION" .I lessecho is a program that simply echos its arguments on standard output. -But any argument containing spaces is enclosed in quotes. +But any metacharacter in the output is preceded by an "escape" +character, which by default is a backslash. .SH OPTIONS A summary of options is included below. .TP +.B \-ex +Specifies "x", rather than backslash, to be the escape char for metachars. +If x is "-", no escape char is used and arguments containing metachars +are surrounded by quotes instead. +.TP .B \-ox -Specifies "x" to be the open quote character. +Specifies "x", rather than double-quote, to be the open quote character, +which is used if the -e- option is specified. .TP .B \-cx Specifies "x" to be the close quote character. @@ -25,19 +32,17 @@ Specifies "n" to be the close quote character, as an integer. .TP .B \-mx Specifies "x" to be a metachar. +By default, no characters are considered metachars. .TP .B \-nn Specifies "n" to be a metachar, as an integer. .TP -.B \-ex -Specifies "x" to be the escape char for metachars. -.TP .B \-fn Specifies "n" to be the escape char for metachars, as an integer. .TP .B \-a Specifies that all arguments are to be quoted. -The default is that only arguments containing spaces are quoted. +The default is that only arguments containing metacharacters are quoted .SH "SEE ALSO" less(1) .SH AUTHOR diff --git a/contrib/less/lesskey.c b/contrib/less/lesskey.c index 1ee2c404020..e01d28980d4 100644 --- a/contrib/less/lesskey.c +++ b/contrib/less/lesskey.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -112,6 +111,7 @@ struct cmdname cmdnames[] = { "flush-repaint", A_FREPAINT }, { "forw-bracket", A_F_BRACKET }, { "forw-forever", A_F_FOREVER }, + { "forw-until-hilite", A_F_UNTIL_HILITE }, { "forw-line", A_F_LINE }, { "forw-line-force", A_FF_LINE }, { "forw-screen", A_F_SCREEN }, diff --git a/contrib/less/lesskey.h b/contrib/less/lesskey.h index 9a457a924fb..cb44d2c42f5 100644 --- a/contrib/less/lesskey.h +++ b/contrib/less/lesskey.h @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/lesskey.man b/contrib/less/lesskey.man index 5e0a99914ba..ea0562ff1a4 100644 --- a/contrib/less/lesskey.man +++ b/contrib/less/lesskey.man @@ -145,6 +145,7 @@ LESSKEY(1) LESSKEY(1) w back-window \e\40 forw-screen-force F forw-forever + \eF forw-until-hilite R repaint-flush r repaint ^R repaint @@ -329,7 +330,7 @@ LESSKEY(1) LESSKEY(1) COPYRIGHT - Copyright (C) 2000-2011 Mark Nudelman + Copyright (C) 2000-2012 Mark Nudelman lesskey is part of the GNU project and is free software; you can redis- tribute it and/or modify it under the terms of the GNU General Public @@ -347,11 +348,11 @@ LESSKEY(1) LESSKEY(1) AUTHOR - Mark Nudelman + Mark Nudelman Send bug reports or comments to the above address or to bug- less@gnu.org. - Version 444: 09 Jun 2011 LESSKEY(1) + Version 449: 26 Jun 2012 LESSKEY(1) diff --git a/contrib/less/lesskey.nro b/contrib/less/lesskey.nro index d305b957ce1..1a066b96d77 100644 --- a/contrib/less/lesskey.nro +++ b/contrib/less/lesskey.nro @@ -1,4 +1,4 @@ -.TH LESSKEY 1 "Version 444: 09 Jun 2011" +.TH LESSKEY 1 "Version 449: 26 Jun 2012" .SH NAME lesskey \- specify key bindings for less .SH SYNOPSIS @@ -162,6 +162,7 @@ default command keys used by less: w back-window \ee\e40 forw-screen-force F forw-forever + \eeF forw-until-hilite R repaint-flush r repaint ^R repaint @@ -355,7 +356,7 @@ which start with a NUL character (0). This NUL character should be represented as \e340 in a lesskey file. .SH COPYRIGHT -Copyright (C) 2000-2011 Mark Nudelman +Copyright (C) 2000-2012 Mark Nudelman .PP lesskey is part of the GNU project and is free software; you can redistribute it and/or modify it @@ -375,7 +376,7 @@ Suite 330, Boston, MA 02111-1307, USA. .SH AUTHOR .PP -Mark Nudelman +Mark Nudelman .br Send bug reports or comments to the above address or to bug-less@gnu.org. diff --git a/contrib/less/lglob.h b/contrib/less/lglob.h index e2427e3abb4..4e0a41f7792 100644 --- a/contrib/less/lglob.h +++ b/contrib/less/lglob.h @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/line.c b/contrib/less/line.c index 0a951f6fe81..6bc74109a97 100644 --- a/contrib/less/line.c +++ b/contrib/less/line.c @@ -1,13 +1,12 @@ /* $FreeBSD$ */ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -28,6 +27,7 @@ public int hshift; /* Desired left-shift of output line buffer */ public int tabstops[TABSTOP_MAX] = { 0 }; /* Custom tabstops */ public int ntabstops = 1; /* Number of tabstops */ public int tabdefault = 8; /* Default repeated tabstops */ +public POSITION highest_hilite; /* Pos of last hilite in file found so far */ static int curr; /* Index into linebuf */ static int column; /* Printable length, accounting for @@ -586,7 +586,12 @@ store_char(ch, a, rep, pos) * Override the attribute passed in. */ if (a != AT_ANSI) + { + if (highest_hilite != NULL_POSITION && + pos > highest_hilite) + highest_hilite = pos; a |= AT_HILITE; + } } } #endif diff --git a/contrib/less/linenum.c b/contrib/less/linenum.c index 4369f87b266..807eb30ac15 100644 --- a/contrib/less/linenum.c +++ b/contrib/less/linenum.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/lsystem.c b/contrib/less/lsystem.c index 0a8ca52ea5a..1b3fa04e2f4 100644 --- a/contrib/less/lsystem.c +++ b/contrib/less/lsystem.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/main.c b/contrib/less/main.c index 8c522eb8fb9..3bd7ecf12eb 100644 --- a/contrib/less/main.c +++ b/contrib/less/main.c @@ -1,13 +1,12 @@ /* $FreeBSD$ */ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -220,6 +219,7 @@ main(argc, argv) argv++; (void) get_ifile(filename, ifile); ifile = prev_ifile(NULL_IFILE); + free(filename); #endif } /* diff --git a/contrib/less/mark.c b/contrib/less/mark.c index 585b412b49d..f95866c91e9 100644 --- a/contrib/less/mark.c +++ b/contrib/less/mark.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ #include "less.h" diff --git a/contrib/less/mkhelp.c b/contrib/less/mkhelp.c index 4aa8cbda6aa..94d189482b7 100644 --- a/contrib/less/mkhelp.c +++ b/contrib/less/mkhelp.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/optfunc.c b/contrib/less/optfunc.c index a0aa10a81cd..b4288d78bb5 100644 --- a/contrib/less/optfunc.c +++ b/contrib/less/optfunc.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -481,7 +480,30 @@ opt__V(type, s) any_display = 1; putstr("less "); putstr(version); - putstr("\nCopyright (C) 1984-2009 Mark Nudelman\n\n"); + putstr(" ("); +#if HAVE_GNU_REGEX + putstr("GNU "); +#endif +#if HAVE_POSIX_REGCOMP + putstr("POSIX "); +#endif +#if HAVE_PCRE + putstr("PCRE "); +#endif +#if HAVE_RE_COMP + putstr("BSD "); +#endif +#if HAVE_REGCMP + putstr("V8 "); +#endif +#if HAVE_V8_REGCOMP + putstr("Spencer V8 "); +#endif +#if !HAVE_GNU_REGEX && !HAVE_POSIX_REGCOMP && !HAVE_PCRE && !HAVE_RE_COMP && !HAVE_REGCMP && !HAVE_V8_REGCOMP + putstr("no "); +#endif + putstr("regular expressions)\n"); + putstr("Copyright (C) 1984-2012 Mark Nudelman\n\n"); putstr("less comes with NO WARRANTY, to the extent permitted by law.\n"); putstr("For information about the terms of redistribution,\n"); putstr("see the file named README in the less distribution.\n"); diff --git a/contrib/less/option.c b/contrib/less/option.c index acb8962527e..cf5ed36a72c 100644 --- a/contrib/less/option.c +++ b/contrib/less/option.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/option.h b/contrib/less/option.h index a32139eea66..00b4b7d1fd6 100644 --- a/contrib/less/option.h +++ b/contrib/less/option.h @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ #define END_OPTION_STRING ('$') diff --git a/contrib/less/opttbl.c b/contrib/less/opttbl.c index 63f6889955b..615fb2785c4 100644 --- a/contrib/less/opttbl.c +++ b/contrib/less/opttbl.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/os.c b/contrib/less/os.c index dbb52fe3b85..f59c0d4f3f9 100644 --- a/contrib/less/os.c +++ b/contrib/less/os.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/output.c b/contrib/less/output.c index a4fdada1ba7..ba074213024 100644 --- a/contrib/less/output.c +++ b/contrib/less/output.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -174,6 +173,7 @@ flush() */ p++; anchor = p_next = p; + at = 0; WIN32setcolors(nm_fg_color, nm_bg_color); continue; } @@ -272,20 +272,25 @@ flush() break; if (at & 1) { - fg = bo_fg_color; - bg = bo_bg_color; +#if MSDOS_COMPILER==WIN32C + fg |= FOREGROUND_INTENSITY; + bg |= BACKGROUND_INTENSITY; +#else + fg = bo_fg_color; + bg = bo_bg_color; +#endif } else if (at & 2) { - fg = so_fg_color; - bg = so_bg_color; + fg = so_fg_color; + bg = so_bg_color; } else if (at & 4) { - fg = ul_fg_color; - bg = ul_bg_color; + fg = ul_fg_color; + bg = ul_bg_color; } else if (at & 8) { - fg = bl_fg_color; - bg = bl_bg_color; + fg = bl_fg_color; + bg = bl_bg_color; } fg &= 0xf; bg &= 0xf; diff --git a/contrib/less/pattern.c b/contrib/less/pattern.c index ca349b6c192..606f28cb67e 100644 --- a/contrib/less/pattern.c +++ b/contrib/less/pattern.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* * Routines to do pattern matching. @@ -26,75 +25,92 @@ compile_pattern2(pattern, search_type, comp_pattern) int search_type; void **comp_pattern; { - if ((search_type & SRCH_NO_REGEX) == 0) + if (search_type & SRCH_NO_REGEX) + return (0); + { +#if HAVE_GNU_REGEX + struct re_pattern_buffer *comp = (struct re_pattern_buffer *) + ecalloc(1, sizeof(struct re_pattern_buffer)); + struct re_pattern_buffer **pcomp = + (struct re_pattern_buffer **) comp_pattern; + re_set_syntax(RE_SYNTAX_POSIX_EXTENDED); + if (re_compile_pattern(pattern, strlen(pattern), comp)) { + free(comp); + error("Invalid pattern", NULL_PARG); + return (-1); + } + if (*pcomp != NULL) + regfree(*pcomp); + *pcomp = comp; +#endif #if HAVE_POSIX_REGCOMP - regex_t *comp = (regex_t *) ecalloc(1, sizeof(regex_t)); - regex_t **pcomp = (regex_t **) comp_pattern; - if (regcomp(comp, pattern, REGCOMP_FLAG)) - { - free(comp); - error("Invalid pattern", NULL_PARG); - return (-1); - } - if (*pcomp != NULL) - regfree(*pcomp); - *pcomp = comp; + regex_t *comp = (regex_t *) ecalloc(1, sizeof(regex_t)); + regex_t **pcomp = (regex_t **) comp_pattern; + if (regcomp(comp, pattern, REGCOMP_FLAG)) + { + free(comp); + error("Invalid pattern", NULL_PARG); + return (-1); + } + if (*pcomp != NULL) + regfree(*pcomp); + *pcomp = comp; #endif #if HAVE_PCRE - pcre *comp; - pcre **pcomp = (pcre **) comp_pattern; - const char *errstring; - int erroffset; - PARG parg; - comp = pcre_compile(pattern, 0, - &errstring, &erroffset, NULL); - if (comp == NULL) - { - parg.p_string = (char *) errstring; - error("%s", &parg); - return (-1); - } - *pcomp = comp; + pcre *comp; + pcre **pcomp = (pcre **) comp_pattern; + constant char *errstring; + int erroffset; + PARG parg; + comp = pcre_compile(pattern, 0, + &errstring, &erroffset, NULL); + if (comp == NULL) + { + parg.p_string = (char *) errstring; + error("%s", &parg); + return (-1); + } + *pcomp = comp; #endif #if HAVE_RE_COMP - PARG parg; - int *pcomp = (int *) comp_pattern; - if ((parg.p_string = re_comp(pattern)) != NULL) - { - error("%s", &parg); - return (-1); - } - *pcomp = 1; + PARG parg; + int *pcomp = (int *) comp_pattern; + if ((parg.p_string = re_comp(pattern)) != NULL) + { + error("%s", &parg); + return (-1); + } + *pcomp = 1; #endif #if HAVE_REGCMP - char *comp; - char **pcomp = (char **) comp_pattern; - if ((comp = regcmp(pattern, 0)) == NULL) - { - error("Invalid pattern", NULL_PARG); - return (-1); - } - if (pcomp != NULL) - free(*pcomp); - *pcomp = comp; + char *comp; + char **pcomp = (char **) comp_pattern; + if ((comp = regcmp(pattern, 0)) == NULL) + { + error("Invalid pattern", NULL_PARG); + return (-1); + } + if (pcomp != NULL) + free(*pcomp); + *pcomp = comp; #endif #if HAVE_V8_REGCOMP - struct regexp *comp; - struct regexp **pcomp = (struct regexp **) comp_pattern; - if ((comp = regcomp(pattern)) == NULL) - { - /* - * regcomp has already printed an error message - * via regerror(). - */ - return (-1); - } - if (*pcomp != NULL) - free(*pcomp); - *pcomp = comp; -#endif + struct regexp *comp; + struct regexp **pcomp = (struct regexp **) comp_pattern; + if ((comp = regcomp(pattern)) == NULL) + { + /* + * regcomp has already printed an error message + * via regerror(). + */ + return (-1); } + if (*pcomp != NULL) + free(*pcomp); + *pcomp = comp; +#endif + } return (0); } @@ -130,6 +146,12 @@ compile_pattern(pattern, search_type, comp_pattern) uncompile_pattern(pattern) void **pattern; { +#if HAVE_GNU_REGEX + struct re_pattern_buffer **pcomp = (struct re_pattern_buffer **) pattern; + if (*pcomp != NULL) + regfree(*pcomp); + *pcomp = NULL; +#endif #if HAVE_POSIX_REGCOMP regex_t **pcomp = (regex_t **) pattern; if (*pcomp != NULL) @@ -167,6 +189,9 @@ uncompile_pattern(pattern) is_null_pattern(pattern) void *pattern; { +#if HAVE_GNU_REGEX + return (pattern == NULL); +#endif #if HAVE_POSIX_REGCOMP return (pattern == NULL); #endif @@ -182,9 +207,6 @@ is_null_pattern(pattern) #if HAVE_V8_REGCOMP return (pattern == NULL); #endif -#if NO_REGEX - return (search_pattern != NULL); -#endif } /* @@ -236,6 +258,9 @@ match_pattern(pattern, tpattern, line, line_len, sp, ep, notbol, search_type) int search_type; { int matched; +#if HAVE_GNU_REGEX + struct re_pattern_buffer *spattern = (struct re_pattern_buffer *) pattern; +#endif #if HAVE_POSIX_REGCOMP regex_t *spattern = (regex_t *) pattern; #endif @@ -252,10 +277,30 @@ match_pattern(pattern, tpattern, line, line_len, sp, ep, notbol, search_type) struct regexp *spattern = (struct regexp *) pattern; #endif +#if NO_REGEX + search_type |= SRCH_NO_REGEX; +#endif if (search_type & SRCH_NO_REGEX) matched = match(tpattern, strlen(tpattern), line, line_len, sp, ep); else { +#if HAVE_GNU_REGEX + { + struct re_registers search_regs; + regoff_t *starts = (regoff_t *) ecalloc(1, sizeof (regoff_t)); + regoff_t *ends = (regoff_t *) ecalloc(1, sizeof (regoff_t)); + spattern->not_bol = notbol; + re_set_registers(spattern, &search_regs, 1, starts, ends); + matched = re_search(spattern, line, line_len, 0, line_len, &search_regs) >= 0; + if (matched) + { + *sp = line + search_regs.start[0]; + *ep = line + search_regs.end[0]; + } + free(starts); + free(ends); + } +#endif #if HAVE_POSIX_REGCOMP { regmatch_t rm; @@ -310,9 +355,6 @@ match_pattern(pattern, tpattern, line, line_len, sp, ep, notbol, search_type) *sp = spattern->startp[0]; *ep = spattern->endp[0]; } -#endif -#if NO_REGEX - matched = match(tpattern, strlen(tpattern), line, line_len, sp, ep); #endif } matched = (!(search_type & SRCH_NO_MATCH) && matched) || diff --git a/contrib/less/pattern.h b/contrib/less/pattern.h index c92aa029552..2bcc7ab5217 100644 --- a/contrib/less/pattern.h +++ b/contrib/less/pattern.h @@ -1,12 +1,18 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ + +#if HAVE_GNU_REGEX +#define __USE_GNU 1 +#include +#define DEFINE_PATTERN(name) struct re_pattern_buffer *name +#define CLEAR_PATTERN(name) name = NULL +#endif #if HAVE_POSIX_REGCOMP #include @@ -47,3 +53,7 @@ extern char *__loc1; #define CLEAR_PATTERN(name) name = NULL #endif +#if NO_REGEX +#define DEFINE_PATTERN(name) +#define CLEAR_PATTERN(name) +#endif diff --git a/contrib/less/pckeys.h b/contrib/less/pckeys.h index 3708d85f43d..306ffde8992 100644 --- a/contrib/less/pckeys.h +++ b/contrib/less/pckeys.h @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/position.c b/contrib/less/position.c index 8c05c5dd129..234dc94e3b5 100644 --- a/contrib/less/position.c +++ b/contrib/less/position.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/position.h b/contrib/less/position.h index 146972ca79f..e0ab36059dc 100644 --- a/contrib/less/position.h +++ b/contrib/less/position.h @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/prompt.c b/contrib/less/prompt.c index 53e66dc4ccd..e1f8e17b96e 100644 --- a/contrib/less/prompt.c +++ b/contrib/less/prompt.c @@ -1,13 +1,12 @@ /* $FreeBSD$ */ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -394,9 +393,9 @@ protochar(c, where, iseditproto) * where to resume parsing the string. * We must keep track of nested IFs and skip them properly. */ - static char constant * + static constant char * skipcond(p) - register char constant *p; + register constant char *p; { register int iflevel; @@ -452,7 +451,7 @@ skipcond(p) /* * Decode a char that represents a position on the screen. */ - static char constant * + static constant char * wherechar(p, wp) char constant *p; int *wp; @@ -478,10 +477,10 @@ wherechar(p, wp) */ public char * pr_expand(proto, maxwidth) - char constant *proto; + constant char *proto; int maxwidth; { - register char constant *p; + register constant char *p; register int c; int where; diff --git a/contrib/less/screen.c b/contrib/less/screen.c index 928967da113..8b4fdbd76ae 100644 --- a/contrib/less/screen.c +++ b/contrib/less/screen.c @@ -1,13 +1,12 @@ /* $FreeBSD$ */ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/scrsize.c b/contrib/less/scrsize.c index 05d041ee5fb..b9c7a492ba6 100644 --- a/contrib/less/scrsize.c +++ b/contrib/less/scrsize.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* * This program is used to determine the screen dimensions on OS/2 systems. diff --git a/contrib/less/search.c b/contrib/less/search.c index 0b8b961cee9..e0bdddb22fe 100644 --- a/contrib/less/search.c +++ b/contrib/less/search.c @@ -1,13 +1,12 @@ /* $FreeBSD$ */ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -68,6 +67,12 @@ struct pattern_info { char* text; int search_type; }; + +#if NO_REGEX +#define info_compiled(info) ((void*)0) +#else +#define info_compiled(info) ((info)->compiled) +#endif static struct pattern_info search_info; static struct pattern_info filter_info; @@ -100,10 +105,12 @@ set_pattern(info, pattern, search_type) char *pattern; int search_type; { +#if !NO_REGEX if (pattern == NULL) - CLEAR_PATTERN(search_info.compiled); + CLEAR_PATTERN(info->compiled); else if (compile_pattern(pattern, search_type, &info->compiled) < 0) return -1; +#endif /* Pattern compiled successfully; save the text too. */ if (info->text != NULL) free(info->text); @@ -137,7 +144,9 @@ clear_pattern(info) if (info->text != NULL) free(info->text); info->text = NULL; +#if !NO_REGEX uncompile_pattern(&info->compiled); +#endif } /* @@ -193,9 +202,11 @@ get_cvt_ops() prev_pattern(info) struct pattern_info *info; { - if (info->search_type & SRCH_NO_REGEX) - return (info->text != NULL); - return (!is_null_pattern(info->compiled)); +#if !NO_REGEX + if ((info->search_type & SRCH_NO_REGEX) == 0) + return (!is_null_pattern(info->compiled)); +#endif + return (info->text != NULL); } #if HILITE_SEARCH @@ -477,6 +488,47 @@ add_hilite(anchor, hl) ihl->hl_next = hl; } +/* + * Hilight every character in a range of displayed characters. + */ + static void +create_hilites(linepos, start_index, end_index, chpos) + POSITION linepos; + int start_index; + int end_index; + int *chpos; +{ + struct hilite *hl; + int i; + + /* Start the first hilite. */ + hl = (struct hilite *) ecalloc(1, sizeof(struct hilite)); + hl->hl_startpos = linepos + chpos[start_index]; + + /* + * Step through the displayed chars. + * If the source position (before cvt) of the char is one more + * than the source pos of the previous char (the usual case), + * just increase the size of the current hilite by one. + * Otherwise (there are backspaces or something involved), + * finish the current hilite and start a new one. + */ + for (i = start_index+1; i <= end_index; i++) + { + if (chpos[i] != chpos[i-1] + 1 || i == end_index) + { + hl->hl_endpos = linepos + chpos[i-1] + 1; + add_hilite(&hilite_anchor, hl); + /* Start new hilite unless this is the last char. */ + if (i < end_index) + { + hl = (struct hilite *) ecalloc(1, sizeof(struct hilite)); + hl->hl_startpos = linepos + chpos[i]; + } + } + } +} + /* * Make a hilite for each string in a physical line which matches * the current pattern. @@ -494,7 +546,6 @@ hilite_line(linepos, line, line_len, chpos, sp, ep, cvt_ops) { char *searchp; char *line_end = line + line_len; - struct hilite *hl; if (sp == NULL || ep == NULL) return; @@ -510,13 +561,7 @@ hilite_line(linepos, line, line_len, chpos, sp, ep, cvt_ops) */ searchp = line; do { - if (ep > sp) - { - hl = (struct hilite *) ecalloc(1, sizeof(struct hilite)); - hl->hl_startpos = linepos + chpos[sp-line]; - hl->hl_endpos = linepos + chpos[ep-line]; - add_hilite(&hilite_anchor, hl); - } + create_hilites(linepos, sp-line, ep-line, chpos); /* * If we matched more than zero characters, * move to the first char after the string we matched. @@ -528,7 +573,7 @@ hilite_line(linepos, line, line_len, chpos, sp, ep, cvt_ops) searchp++; else /* end of line */ break; - } while (match_pattern(search_info.compiled, search_info.text, + } while (match_pattern(info_compiled(&search_info), search_info.text, searchp, line_end - searchp, &sp, &ep, 1, search_info.search_type)); } #endif @@ -800,7 +845,7 @@ search_range(pos, endpos, search_type, matches, maxlines, plinepos, pendpos) * If so, add an entry to the filter list. */ if ((search_type & SRCH_FIND_ALL) && prev_pattern(&filter_info)) { - int line_filter = match_pattern(filter_info.compiled, filter_info.text, + int line_filter = match_pattern(info_compiled(&filter_info), filter_info.text, cline, line_len, &sp, &ep, 0, filter_info.search_type); if (line_filter) { @@ -820,7 +865,7 @@ search_range(pos, endpos, search_type, matches, maxlines, plinepos, pendpos) */ if (prev_pattern(&search_info)) { - line_match = match_pattern(search_info.compiled, search_info.text, + line_match = match_pattern(info_compiled(&search_info), search_info.text, cline, line_len, &sp, &ep, 0, search_type); if (line_match) { diff --git a/contrib/less/signal.c b/contrib/less/signal.c index f305c12f050..8c64ce7b957 100644 --- a/contrib/less/signal.c +++ b/contrib/less/signal.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* $FreeBSD$ */ diff --git a/contrib/less/tags.c b/contrib/less/tags.c index c00f9d488dd..8fd36b555c6 100644 --- a/contrib/less/tags.c +++ b/contrib/less/tags.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ #include "less.h" diff --git a/contrib/less/ttyin.c b/contrib/less/ttyin.c index 00f2c9e4ad5..b2f5262fd3b 100644 --- a/contrib/less/ttyin.c +++ b/contrib/less/ttyin.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* diff --git a/contrib/less/version.c b/contrib/less/version.c index dc5bb0c4f2f..096ae206672 100644 --- a/contrib/less/version.c +++ b/contrib/less/version.c @@ -1,12 +1,11 @@ -/* - * Copyright (C) 1984-2011 Mark Nudelman - * - * You may distribute under the terms of either the GNU General Public - * License or the Less License, as specified in the README file. - * - * For more information about less, or for information on how to - * contact the author, see the README file. - */ +/* + * Copyright (C) 1984-2012 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information, see the README file. + */ /* @@ -343,7 +342,7 @@ v201 7/27/94 Check for no memcpy; add casts to calloc; look for regcmp in libgen.a. (thanks to Kaveh Ghazi). v202 7/28/94 Fix bug in edit_next/edit_prev with - non-existant files. + non-existent files. v203 8/2/94 Fix a variety of configuration bugs on various systems. (thanks to Sakai Kiyotaka, Harald Koenig, Bjorn Brox, @@ -743,6 +742,15 @@ v442 3/2/11 Fix search bug. Add ctrl-G line edit command. v443 4/9/11 Fix Windows build. v444 6/8/11 Fix ungetc bug; remove vestiges of obsolete -l option. +----------------------------------------------------------------- +v445 10/19/11 Fix hilite bug in backwards scroll with -J. + Fix hilite bug with backspaces. + Fix bugs handling SGR sequences in Win32 (thanks to Eric Lee). + Add support for GNU regex (thanks to Reuben Thomas). +v446 5/15/12 Up/down arrows in cmd editing search for matching cmd. +v447 5/21/12 Add ESC-F command, two-pipe LESSOPEN syntax. +v448 6/15/12 Print name of regex library in version message. +v449 6/23/12 Allow config option --with-regex=none. */ -char version[] = "444"; +char version[] = "449"; diff --git a/contrib/libc++/include/__bit_reference b/contrib/libc++/include/__bit_reference index 906b9da462e..48538a24d51 100644 --- a/contrib/libc++/include/__bit_reference +++ b/contrib/libc++/include/__bit_reference @@ -950,11 +950,15 @@ __equal_unaligned(__bit_iterator<_Cp, true> __first1, __bit_iterator<_Cp, true> __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); if (__first2.__ctz_ > __first1.__ctz_) + { if ((*__first2.__seg_ & __m) != (__b << (__first2.__ctz_ - __first1.__ctz_))) return false; + } else + { if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ - __first2.__ctz_))) return false; + } __first2.__seg_ += (__ddn + __first2.__ctz_) / __bits_per_word; __first2.__ctz_ = static_cast((__ddn + __first2.__ctz_) % __bits_per_word); __dn -= __ddn; diff --git a/contrib/libc++/include/__config b/contrib/libc++/include/__config index 6b290145858..7cd01dc1b55 100644 --- a/contrib/libc++/include/__config +++ b/contrib/libc++/include/__config @@ -384,7 +384,9 @@ template struct __static_assert_check {}; #endif #ifdef _LIBCPP_HAS_NO_CONSTEXPR -#define constexpr const +#define _LIBCPP_CONSTEXPR +#else +#define _LIBCPP_CONSTEXPR constexpr #endif #ifndef __has_feature diff --git a/contrib/libc++/include/__tuple b/contrib/libc++/include/__tuple index 3b2be1c5a74..82168048e6c 100644 --- a/contrib/libc++/include/__tuple +++ b/contrib/libc++/include/__tuple @@ -216,7 +216,7 @@ struct __tuple_convertible_imp : public false_type {}; template struct __tuple_convertible_imp, __tuple_types<_Up0, _Up...> > : public integral_constant::value && + is_convertible<_Tp0, _Up0>::value && __tuple_convertible_imp, __tuple_types<_Up...> >::value> {}; template <> @@ -235,6 +235,33 @@ struct __tuple_convertible<_Tp, _Up, true, true> typename __make_tuple_types<_Tp>::type, typename __make_tuple_types<_Up>::type> {}; +// __tuple_constructible + +template +struct __tuple_constructible_imp : public false_type {}; + +template +struct __tuple_constructible_imp, __tuple_types<_Up0, _Up...> > + : public integral_constant::value && + __tuple_constructible_imp, __tuple_types<_Up...> >::value> {}; + +template <> +struct __tuple_constructible_imp, __tuple_types<> > + : public true_type {}; + +template ::type>::value, + bool = __tuple_like<_Up>::value> +struct __tuple_constructible + : public false_type {}; + +template +struct __tuple_constructible<_Tp, _Up, true, true> + : public __tuple_constructible_imp::type>::value == + tuple_size<_Up>::value, + typename __make_tuple_types<_Tp>::type, typename __make_tuple_types<_Up>::type> +{}; + // __tuple_assignable template diff --git a/contrib/libc++/include/algorithm b/contrib/libc++/include/algorithm index f9c6843a60a..d924a7de3f2 100644 --- a/contrib/libc++/include/algorithm +++ b/contrib/libc++/include/algorithm @@ -2508,11 +2508,16 @@ private: _Engine_result_type __mask0_; _Engine_result_type __mask1_; +#ifdef _LIBCPP_HAS_NO_CONSTEXPR static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min - + _Working_result_type(1); - static const size_t __m = __log2<_Working_result_type, _Rp>::value; - static const size_t _WDt = numeric_limits<_Working_result_type>::digits; - static const size_t _EDt = numeric_limits<_Engine_result_type>::digits; + + _Working_result_type(1); +#else + static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min() + + _Working_result_type(1); +#endif + static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value; + static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits; + static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits; public: // constructors and seeding functions @@ -2712,8 +2717,8 @@ public: result_type operator()(); - static constexpr result_type min() {return _Min;} - static constexpr result_type max() {return _Max;} + static _LIBCPP_CONSTEXPR result_type min() {return _Min;} + static _LIBCPP_CONSTEXPR result_type max() {return _Max;} friend __rs_default __rs_get(); }; diff --git a/contrib/libc++/include/atomic b/contrib/libc++/include/atomic index f2e428a2611..6a200eba599 100644 --- a/contrib/libc++/include/atomic +++ b/contrib/libc++/include/atomic @@ -29,7 +29,7 @@ typedef enum memory_order memory_order_seq_cst // store-release load-acquire } memory_order; -template T kill_dependency(T y); +template T kill_dependency(T y) noexcept; // lock-free property @@ -46,40 +46,40 @@ template T kill_dependency(T y); typedef struct atomic_flag { - bool test_and_set(memory_order m = memory_order_seq_cst) volatile; - bool test_and_set(memory_order m = memory_order_seq_cst); - void clear(memory_order m = memory_order_seq_cst) volatile; - void clear(memory_order m = memory_order_seq_cst); - atomic_flag() = default; + bool test_and_set(memory_order m = memory_order_seq_cst) volatile noexcept; + bool test_and_set(memory_order m = memory_order_seq_cst) noexcept; + void clear(memory_order m = memory_order_seq_cst) volatile noexcept; + void clear(memory_order m = memory_order_seq_cst) noexcept; + atomic_flag() noexcept = default; atomic_flag(const atomic_flag&) = delete; atomic_flag& operator=(const atomic_flag&) = delete; atomic_flag& operator=(const atomic_flag&) volatile = delete; } atomic_flag; bool - atomic_flag_test_and_set(volatile atomic_flag* obj); + atomic_flag_test_and_set(volatile atomic_flag* obj) noexcept; bool - atomic_flag_test_and_set(atomic_flag* obj); + atomic_flag_test_and_set(atomic_flag* obj) noexcept; bool atomic_flag_test_and_set_explicit(volatile atomic_flag* obj, - memory_order m); + memory_order m) noexcept; bool - atomic_flag_test_and_set_explicit(atomic_flag* obj, memory_order m); + atomic_flag_test_and_set_explicit(atomic_flag* obj, memory_order m) noexcept; void - atomic_flag_clear(volatile atomic_flag* obj); + atomic_flag_clear(volatile atomic_flag* obj) noexcept; void - atomic_flag_clear(atomic_flag* obj); + atomic_flag_clear(atomic_flag* obj) noexcept; void - atomic_flag_clear_explicit(volatile atomic_flag* obj, memory_order m); + atomic_flag_clear_explicit(volatile atomic_flag* obj, memory_order m) noexcept; void - atomic_flag_clear_explicit(atomic_flag* obj, memory_order m); + atomic_flag_clear_explicit(atomic_flag* obj, memory_order m) noexcept; #define ATOMIC_FLAG_INIT see below #define ATOMIC_VAR_INIT(value) see below @@ -87,388 +87,388 @@ void template struct atomic { - bool is_lock_free() const volatile; - bool is_lock_free() const; - void store(T desr, memory_order m = memory_order_seq_cst) volatile; - void store(T desr, memory_order m = memory_order_seq_cst); - T load(memory_order m = memory_order_seq_cst) const volatile; - T load(memory_order m = memory_order_seq_cst) const; - operator T() const volatile; - operator T() const; - T exchange(T desr, memory_order m = memory_order_seq_cst) volatile; - T exchange(T desr, memory_order m = memory_order_seq_cst); + bool is_lock_free() const volatile noexcept; + bool is_lock_free() const noexcept; + void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; + void store(T desr, memory_order m = memory_order_seq_cst) noexcept; + T load(memory_order m = memory_order_seq_cst) const volatile noexcept; + T load(memory_order m = memory_order_seq_cst) const noexcept; + operator T() const volatile noexcept; + operator T() const noexcept; + T exchange(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; + T exchange(T desr, memory_order m = memory_order_seq_cst) noexcept; bool compare_exchange_weak(T& expc, T desr, - memory_order s, memory_order f) volatile; - bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f); + memory_order s, memory_order f) volatile noexcept; + bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f) noexcept; bool compare_exchange_strong(T& expc, T desr, - memory_order s, memory_order f) volatile; + memory_order s, memory_order f) volatile noexcept; bool compare_exchange_strong(T& expc, T desr, - memory_order s, memory_order f); + memory_order s, memory_order f) noexcept; bool compare_exchange_weak(T& expc, T desr, - memory_order m = memory_order_seq_cst) volatile; + memory_order m = memory_order_seq_cst) volatile noexcept; bool compare_exchange_weak(T& expc, T desr, - memory_order m = memory_order_seq_cst); + memory_order m = memory_order_seq_cst) noexcept; bool compare_exchange_strong(T& expc, T desr, - memory_order m = memory_order_seq_cst) volatile; + memory_order m = memory_order_seq_cst) volatile noexcept; bool compare_exchange_strong(T& expc, T desr, - memory_order m = memory_order_seq_cst); + memory_order m = memory_order_seq_cst) noexcept; - atomic() = default; - constexpr atomic(T desr); + atomic() noexcept = default; + constexpr atomic(T desr) noexcept; atomic(const atomic&) = delete; atomic& operator=(const atomic&) = delete; atomic& operator=(const atomic&) volatile = delete; - T operator=(T) volatile; - T operator=(T); + T operator=(T) volatile noexcept; + T operator=(T) noexcept; }; template <> struct atomic { - bool is_lock_free() const volatile; - bool is_lock_free() const; - void store(integral desr, memory_order m = memory_order_seq_cst) volatile; - void store(integral desr, memory_order m = memory_order_seq_cst); - integral load(memory_order m = memory_order_seq_cst) const volatile; - integral load(memory_order m = memory_order_seq_cst) const; - operator integral() const volatile; - operator integral() const; + bool is_lock_free() const volatile noexcept; + bool is_lock_free() const noexcept; + void store(integral desr, memory_order m = memory_order_seq_cst) volatile noexcept; + void store(integral desr, memory_order m = memory_order_seq_cst) noexcept; + integral load(memory_order m = memory_order_seq_cst) const volatile noexcept; + integral load(memory_order m = memory_order_seq_cst) const noexcept; + operator integral() const volatile noexcept; + operator integral() const noexcept; integral exchange(integral desr, - memory_order m = memory_order_seq_cst) volatile; - integral exchange(integral desr, memory_order m = memory_order_seq_cst); + memory_order m = memory_order_seq_cst) volatile noexcept; + integral exchange(integral desr, memory_order m = memory_order_seq_cst) noexcept; bool compare_exchange_weak(integral& expc, integral desr, - memory_order s, memory_order f) volatile; + memory_order s, memory_order f) volatile noexcept; bool compare_exchange_weak(integral& expc, integral desr, - memory_order s, memory_order f); + memory_order s, memory_order f) noexcept; bool compare_exchange_strong(integral& expc, integral desr, - memory_order s, memory_order f) volatile; + memory_order s, memory_order f) volatile noexcept; bool compare_exchange_strong(integral& expc, integral desr, - memory_order s, memory_order f); + memory_order s, memory_order f) noexcept; bool compare_exchange_weak(integral& expc, integral desr, - memory_order m = memory_order_seq_cst) volatile; + memory_order m = memory_order_seq_cst) volatile noexcept; bool compare_exchange_weak(integral& expc, integral desr, - memory_order m = memory_order_seq_cst); + memory_order m = memory_order_seq_cst) noexcept; bool compare_exchange_strong(integral& expc, integral desr, - memory_order m = memory_order_seq_cst) volatile; + memory_order m = memory_order_seq_cst) volatile noexcept; bool compare_exchange_strong(integral& expc, integral desr, - memory_order m = memory_order_seq_cst); + memory_order m = memory_order_seq_cst) noexcept; integral - fetch_add(integral op, memory_order m = memory_order_seq_cst) volatile; - integral fetch_add(integral op, memory_order m = memory_order_seq_cst); + fetch_add(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; + integral fetch_add(integral op, memory_order m = memory_order_seq_cst) noexcept; integral - fetch_sub(integral op, memory_order m = memory_order_seq_cst) volatile; - integral fetch_sub(integral op, memory_order m = memory_order_seq_cst); + fetch_sub(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; + integral fetch_sub(integral op, memory_order m = memory_order_seq_cst) noexcept; integral - fetch_and(integral op, memory_order m = memory_order_seq_cst) volatile; - integral fetch_and(integral op, memory_order m = memory_order_seq_cst); + fetch_and(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; + integral fetch_and(integral op, memory_order m = memory_order_seq_cst) noexcept; integral - fetch_or(integral op, memory_order m = memory_order_seq_cst) volatile; - integral fetch_or(integral op, memory_order m = memory_order_seq_cst); + fetch_or(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; + integral fetch_or(integral op, memory_order m = memory_order_seq_cst) noexcept; integral - fetch_xor(integral op, memory_order m = memory_order_seq_cst) volatile; - integral fetch_xor(integral op, memory_order m = memory_order_seq_cst); + fetch_xor(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; + integral fetch_xor(integral op, memory_order m = memory_order_seq_cst) noexcept; - atomic() = default; - constexpr atomic(integral desr); + atomic() noexcept = default; + constexpr atomic(integral desr) noexcept; atomic(const atomic&) = delete; atomic& operator=(const atomic&) = delete; atomic& operator=(const atomic&) volatile = delete; - integral operator=(integral desr) volatile; - integral operator=(integral desr); + integral operator=(integral desr) volatile noexcept; + integral operator=(integral desr) noexcept; - integral operator++(int) volatile; - integral operator++(int); - integral operator--(int) volatile; - integral operator--(int); - integral operator++() volatile; - integral operator++(); - integral operator--() volatile; - integral operator--(); - integral operator+=(integral op) volatile; - integral operator+=(integral op); - integral operator-=(integral op) volatile; - integral operator-=(integral op); - integral operator&=(integral op) volatile; - integral operator&=(integral op); - integral operator|=(integral op) volatile; - integral operator|=(integral op); - integral operator^=(integral op) volatile; - integral operator^=(integral op); + integral operator++(int) volatile noexcept; + integral operator++(int) noexcept; + integral operator--(int) volatile noexcept; + integral operator--(int) noexcept; + integral operator++() volatile noexcept; + integral operator++() noexcept; + integral operator--() volatile noexcept; + integral operator--() noexcept; + integral operator+=(integral op) volatile noexcept; + integral operator+=(integral op) noexcept; + integral operator-=(integral op) volatile noexcept; + integral operator-=(integral op) noexcept; + integral operator&=(integral op) volatile noexcept; + integral operator&=(integral op) noexcept; + integral operator|=(integral op) volatile noexcept; + integral operator|=(integral op) noexcept; + integral operator^=(integral op) volatile noexcept; + integral operator^=(integral op) noexcept; }; template struct atomic { - bool is_lock_free() const volatile; - bool is_lock_free() const; - void store(T* desr, memory_order m = memory_order_seq_cst) volatile; - void store(T* desr, memory_order m = memory_order_seq_cst); - T* load(memory_order m = memory_order_seq_cst) const volatile; - T* load(memory_order m = memory_order_seq_cst) const; - operator T*() const volatile; - operator T*() const; - T* exchange(T* desr, memory_order m = memory_order_seq_cst) volatile; - T* exchange(T* desr, memory_order m = memory_order_seq_cst); + bool is_lock_free() const volatile noexcept; + bool is_lock_free() const noexcept; + void store(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept; + void store(T* desr, memory_order m = memory_order_seq_cst) noexcept; + T* load(memory_order m = memory_order_seq_cst) const volatile noexcept; + T* load(memory_order m = memory_order_seq_cst) const noexcept; + operator T*() const volatile noexcept; + operator T*() const noexcept; + T* exchange(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept; + T* exchange(T* desr, memory_order m = memory_order_seq_cst) noexcept; bool compare_exchange_weak(T*& expc, T* desr, - memory_order s, memory_order f) volatile; + memory_order s, memory_order f) volatile noexcept; bool compare_exchange_weak(T*& expc, T* desr, - memory_order s, memory_order f); + memory_order s, memory_order f) noexcept; bool compare_exchange_strong(T*& expc, T* desr, - memory_order s, memory_order f) volatile; + memory_order s, memory_order f) volatile noexcept; bool compare_exchange_strong(T*& expc, T* desr, - memory_order s, memory_order f); + memory_order s, memory_order f) noexcept; bool compare_exchange_weak(T*& expc, T* desr, - memory_order m = memory_order_seq_cst) volatile; + memory_order m = memory_order_seq_cst) volatile noexcept; bool compare_exchange_weak(T*& expc, T* desr, - memory_order m = memory_order_seq_cst); + memory_order m = memory_order_seq_cst) noexcept; bool compare_exchange_strong(T*& expc, T* desr, - memory_order m = memory_order_seq_cst) volatile; + memory_order m = memory_order_seq_cst) volatile noexcept; bool compare_exchange_strong(T*& expc, T* desr, - memory_order m = memory_order_seq_cst); - T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile; - T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst); - T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile; - T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst); + memory_order m = memory_order_seq_cst) noexcept; + T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile noexcept; + T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst) noexcept; + T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile noexcept; + T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) noexcept; - atomic() = default; - constexpr atomic(T* desr); + atomic() noexcept = default; + constexpr atomic(T* desr) noexcept; atomic(const atomic&) = delete; atomic& operator=(const atomic&) = delete; atomic& operator=(const atomic&) volatile = delete; - T* operator=(T*) volatile; - T* operator=(T*); - T* operator++(int) volatile; - T* operator++(int); - T* operator--(int) volatile; - T* operator--(int); - T* operator++() volatile; - T* operator++(); - T* operator--() volatile; - T* operator--(); - T* operator+=(ptrdiff_t op) volatile; - T* operator+=(ptrdiff_t op); - T* operator-=(ptrdiff_t op) volatile; - T* operator-=(ptrdiff_t op); + T* operator=(T*) volatile noexcept; + T* operator=(T*) noexcept; + T* operator++(int) volatile noexcept; + T* operator++(int) noexcept; + T* operator--(int) volatile noexcept; + T* operator--(int) noexcept; + T* operator++() volatile noexcept; + T* operator++() noexcept; + T* operator--() volatile noexcept; + T* operator--() noexcept; + T* operator+=(ptrdiff_t op) volatile noexcept; + T* operator+=(ptrdiff_t op) noexcept; + T* operator-=(ptrdiff_t op) volatile noexcept; + T* operator-=(ptrdiff_t op) noexcept; }; template bool - atomic_is_lock_free(const volatile atomic* obj); + atomic_is_lock_free(const volatile atomic* obj) noexcept; template bool - atomic_is_lock_free(const atomic* obj); + atomic_is_lock_free(const atomic* obj) noexcept; template void - atomic_init(volatile atomic* obj, T desr); + atomic_init(volatile atomic* obj, T desr) noexcept; template void - atomic_init(atomic* obj, T desr); + atomic_init(atomic* obj, T desr) noexcept; template void - atomic_store(volatile atomic* obj, T desr); + atomic_store(volatile atomic* obj, T desr) noexcept; template void - atomic_store(atomic* obj, T desr); + atomic_store(atomic* obj, T desr) noexcept; template void - atomic_store_explicit(volatile atomic* obj, T desr, memory_order m); + atomic_store_explicit(volatile atomic* obj, T desr, memory_order m) noexcept; template void - atomic_store_explicit(atomic* obj, T desr, memory_order m); + atomic_store_explicit(atomic* obj, T desr, memory_order m) noexcept; template T - atomic_load(const volatile atomic* obj); + atomic_load(const volatile atomic* obj) noexcept; template T - atomic_load(const atomic* obj); + atomic_load(const atomic* obj) noexcept; template T - atomic_load_explicit(const volatile atomic* obj, memory_order m); + atomic_load_explicit(const volatile atomic* obj, memory_order m) noexcept; template T - atomic_load_explicit(const atomic* obj, memory_order m); + atomic_load_explicit(const atomic* obj, memory_order m) noexcept; template T - atomic_exchange(volatile atomic* obj, T desr); + atomic_exchange(volatile atomic* obj, T desr) noexcept; template T - atomic_exchange(atomic* obj, T desr); + atomic_exchange(atomic* obj, T desr) noexcept; template T - atomic_exchange_explicit(volatile atomic* obj, T desr, memory_order m); + atomic_exchange_explicit(volatile atomic* obj, T desr, memory_order m) noexcept; template T - atomic_exchange_explicit(atomic* obj, T desr, memory_order m); + atomic_exchange_explicit(atomic* obj, T desr, memory_order m) noexcept; template bool - atomic_compare_exchange_weak(volatile atomic* obj, T* expc, T desr); + atomic_compare_exchange_weak(volatile atomic* obj, T* expc, T desr) noexcept; template bool - atomic_compare_exchange_weak(atomic* obj, T* expc, T desr); + atomic_compare_exchange_weak(atomic* obj, T* expc, T desr) noexcept; template bool - atomic_compare_exchange_strong(volatile atomic* obj, T* expc, T desr); + atomic_compare_exchange_strong(volatile atomic* obj, T* expc, T desr) noexcept; template bool - atomic_compare_exchange_strong(atomic* obj, T* expc, T desr); + atomic_compare_exchange_strong(atomic* obj, T* expc, T desr) noexcept; template bool atomic_compare_exchange_weak_explicit(volatile atomic* obj, T* expc, T desr, - memory_order s, memory_order f); + memory_order s, memory_order f) noexcept; template bool atomic_compare_exchange_weak_explicit(atomic* obj, T* expc, T desr, - memory_order s, memory_order f); + memory_order s, memory_order f) noexcept; template bool atomic_compare_exchange_strong_explicit(volatile atomic* obj, T* expc, T desr, - memory_order s, memory_order f); + memory_order s, memory_order f) noexcept; template bool atomic_compare_exchange_strong_explicit(atomic* obj, T* expc, T desr, - memory_order s, memory_order f); + memory_order s, memory_order f) noexcept; template Integral - atomic_fetch_add(volatile atomic* obj, Integral op); + atomic_fetch_add(volatile atomic* obj, Integral op) noexcept; template Integral - atomic_fetch_add(atomic* obj, Integral op); + atomic_fetch_add(atomic* obj, Integral op) noexcept; template Integral atomic_fetch_add_explicit(volatile atomic* obj, Integral op, - memory_order m); + memory_order m) noexcept; template Integral atomic_fetch_add_explicit(atomic* obj, Integral op, - memory_order m); + memory_order m) noexcept; template Integral - atomic_fetch_sub(volatile atomic* obj, Integral op); + atomic_fetch_sub(volatile atomic* obj, Integral op) noexcept; template Integral - atomic_fetch_sub(atomic* obj, Integral op); + atomic_fetch_sub(atomic* obj, Integral op) noexcept; template Integral atomic_fetch_sub_explicit(volatile atomic* obj, Integral op, - memory_order m); + memory_order m) noexcept; template Integral atomic_fetch_sub_explicit(atomic* obj, Integral op, - memory_order m); + memory_order m) noexcept; template Integral - atomic_fetch_and(volatile atomic* obj, Integral op); + atomic_fetch_and(volatile atomic* obj, Integral op) noexcept; template Integral - atomic_fetch_and(atomic* obj, Integral op); + atomic_fetch_and(atomic* obj, Integral op) noexcept; template Integral atomic_fetch_and_explicit(volatile atomic* obj, Integral op, - memory_order m); + memory_order m) noexcept; template Integral atomic_fetch_and_explicit(atomic* obj, Integral op, - memory_order m); + memory_order m) noexcept; template Integral - atomic_fetch_or(volatile atomic* obj, Integral op); + atomic_fetch_or(volatile atomic* obj, Integral op) noexcept; template Integral - atomic_fetch_or(atomic* obj, Integral op); + atomic_fetch_or(atomic* obj, Integral op) noexcept; template Integral atomic_fetch_or_explicit(volatile atomic* obj, Integral op, - memory_order m); + memory_order m) noexcept; template Integral atomic_fetch_or_explicit(atomic* obj, Integral op, - memory_order m); + memory_order m) noexcept; template Integral - atomic_fetch_xor(volatile atomic* obj, Integral op); + atomic_fetch_xor(volatile atomic* obj, Integral op) noexcept; template Integral - atomic_fetch_xor(atomic* obj, Integral op); + atomic_fetch_xor(atomic* obj, Integral op) noexcept; template Integral atomic_fetch_xor_explicit(volatile atomic* obj, Integral op, - memory_order m); + memory_order m) noexcept; template Integral atomic_fetch_xor_explicit(atomic* obj, Integral op, - memory_order m); + memory_order m) noexcept; template T* - atomic_fetch_add(volatile atomic* obj, ptrdiff_t op); + atomic_fetch_add(volatile atomic* obj, ptrdiff_t op) noexcept; template T* - atomic_fetch_add(atomic* obj, ptrdiff_t op); + atomic_fetch_add(atomic* obj, ptrdiff_t op) noexcept; template T* atomic_fetch_add_explicit(volatile atomic* obj, ptrdiff_t op, - memory_order m); + memory_order m) noexcept; template T* - atomic_fetch_add_explicit(atomic* obj, ptrdiff_t op, memory_order m); + atomic_fetch_add_explicit(atomic* obj, ptrdiff_t op, memory_order m) noexcept; template T* - atomic_fetch_sub(volatile atomic* obj, ptrdiff_t op); + atomic_fetch_sub(volatile atomic* obj, ptrdiff_t op) noexcept; template T* - atomic_fetch_sub(atomic* obj, ptrdiff_t op); + atomic_fetch_sub(atomic* obj, ptrdiff_t op) noexcept; template T* atomic_fetch_sub_explicit(volatile atomic* obj, ptrdiff_t op, - memory_order m); + memory_order m) noexcept; template T* - atomic_fetch_sub_explicit(atomic* obj, ptrdiff_t op, memory_order m); + atomic_fetch_sub_explicit(atomic* obj, ptrdiff_t op, memory_order m) noexcept; // Atomics for standard typedef types @@ -514,8 +514,8 @@ typedef atomic atomic_uintmax_t; // fences -void atomic_thread_fence(memory_order m); -void atomic_signal_fence(memory_order m); +void atomic_thread_fence(memory_order m) noexcept; +void atomic_signal_fence(memory_order m) noexcept; } // std @@ -545,7 +545,7 @@ typedef enum memory_order template inline _LIBCPP_INLINE_VISIBILITY _Tp -kill_dependency(_Tp __y) +kill_dependency(_Tp __y) _NOEXCEPT { return __y; } @@ -558,70 +558,70 @@ struct __atomic_base // false _Atomic(_Tp) __a_; _LIBCPP_INLINE_VISIBILITY - bool is_lock_free() const volatile - {return __atomic_is_lock_free(_Tp());} + bool is_lock_free() const volatile _NOEXCEPT + {return __c11_atomic_is_lock_free(sizeof(_Tp));} _LIBCPP_INLINE_VISIBILITY - bool is_lock_free() const - {return __atomic_is_lock_free(_Tp());} + bool is_lock_free() const _NOEXCEPT + {return __c11_atomic_is_lock_free(sizeof(_Tp));} _LIBCPP_INLINE_VISIBILITY - void store(_Tp __d, memory_order __m = memory_order_seq_cst) volatile - {__atomic_store(&__a_, __d, __m);} + void store(_Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT + {__c11_atomic_store(&__a_, __d, __m);} _LIBCPP_INLINE_VISIBILITY - void store(_Tp __d, memory_order __m = memory_order_seq_cst) - {__atomic_store(&__a_, __d, __m);} + void store(_Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT + {__c11_atomic_store(&__a_, __d, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp load(memory_order __m = memory_order_seq_cst) const volatile - {return __atomic_load(&__a_, __m);} + _Tp load(memory_order __m = memory_order_seq_cst) const volatile _NOEXCEPT + {return __c11_atomic_load(&__a_, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp load(memory_order __m = memory_order_seq_cst) const - {return __atomic_load(&__a_, __m);} + _Tp load(memory_order __m = memory_order_seq_cst) const _NOEXCEPT + {return __c11_atomic_load(&__a_, __m);} _LIBCPP_INLINE_VISIBILITY - operator _Tp() const volatile {return load();} + operator _Tp() const volatile _NOEXCEPT {return load();} _LIBCPP_INLINE_VISIBILITY - operator _Tp() const {return load();} + operator _Tp() const _NOEXCEPT {return load();} _LIBCPP_INLINE_VISIBILITY - _Tp exchange(_Tp __d, memory_order __m = memory_order_seq_cst) volatile - {return __atomic_exchange(&__a_, __d, __m);} + _Tp exchange(_Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT + {return __c11_atomic_exchange(&__a_, __d, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp exchange(_Tp __d, memory_order __m = memory_order_seq_cst) - {return __atomic_exchange(&__a_, __d, __m);} + _Tp exchange(_Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT + {return __c11_atomic_exchange(&__a_, __d, __m);} _LIBCPP_INLINE_VISIBILITY bool compare_exchange_weak(_Tp& __e, _Tp __d, - memory_order __s, memory_order __f) volatile - {return __atomic_compare_exchange_weak(&__a_, &__e, __d, __s, __f);} + memory_order __s, memory_order __f) volatile _NOEXCEPT + {return __c11_atomic_compare_exchange_weak(&__a_, &__e, __d, __s, __f);} _LIBCPP_INLINE_VISIBILITY bool compare_exchange_weak(_Tp& __e, _Tp __d, - memory_order __s, memory_order __f) - {return __atomic_compare_exchange_weak(&__a_, &__e, __d, __s, __f);} + memory_order __s, memory_order __f) _NOEXCEPT + {return __c11_atomic_compare_exchange_weak(&__a_, &__e, __d, __s, __f);} _LIBCPP_INLINE_VISIBILITY bool compare_exchange_strong(_Tp& __e, _Tp __d, - memory_order __s, memory_order __f) volatile - {return __atomic_compare_exchange_strong(&__a_, &__e, __d, __s, __f);} + memory_order __s, memory_order __f) volatile _NOEXCEPT + {return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __s, __f);} _LIBCPP_INLINE_VISIBILITY bool compare_exchange_strong(_Tp& __e, _Tp __d, - memory_order __s, memory_order __f) - {return __atomic_compare_exchange_strong(&__a_, &__e, __d, __s, __f);} + memory_order __s, memory_order __f) _NOEXCEPT + {return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __s, __f);} _LIBCPP_INLINE_VISIBILITY bool compare_exchange_weak(_Tp& __e, _Tp __d, - memory_order __m = memory_order_seq_cst) volatile - {return __atomic_compare_exchange_weak(&__a_, &__e, __d, __m, __m);} + memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT + {return __c11_atomic_compare_exchange_weak(&__a_, &__e, __d, __m, __m);} _LIBCPP_INLINE_VISIBILITY bool compare_exchange_weak(_Tp& __e, _Tp __d, - memory_order __m = memory_order_seq_cst) - {return __atomic_compare_exchange_weak(&__a_, &__e, __d, __m, __m);} + memory_order __m = memory_order_seq_cst) _NOEXCEPT + {return __c11_atomic_compare_exchange_weak(&__a_, &__e, __d, __m, __m);} _LIBCPP_INLINE_VISIBILITY bool compare_exchange_strong(_Tp& __e, _Tp __d, - memory_order __m = memory_order_seq_cst) volatile - {return __atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);} + memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT + {return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);} _LIBCPP_INLINE_VISIBILITY bool compare_exchange_strong(_Tp& __e, _Tp __d, - memory_order __m = memory_order_seq_cst) - {return __atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);} + memory_order __m = memory_order_seq_cst) _NOEXCEPT + {return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);} _LIBCPP_INLINE_VISIBILITY - __atomic_base() {} // = default; + __atomic_base() _NOEXCEPT {} // = default; _LIBCPP_INLINE_VISIBILITY - /*constexpr*/ __atomic_base(_Tp __d) { __atomic_store(&__a_, __d, memory_order_seq_cst); } + _LIBCPP_CONSTEXPR __atomic_base(_Tp __d) _NOEXCEPT : __a_(__d) {} #ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS __atomic_base(const __atomic_base&) = delete; __atomic_base& operator=(const __atomic_base&) = delete; @@ -642,77 +642,77 @@ struct __atomic_base<_Tp, true> { typedef __atomic_base<_Tp, false> __base; _LIBCPP_INLINE_VISIBILITY - __atomic_base() {} // = default; + __atomic_base() _NOEXCEPT {} // = default; _LIBCPP_INLINE_VISIBILITY - /*constexpr*/ __atomic_base(_Tp __d) : __base(__d) {} + _LIBCPP_CONSTEXPR __atomic_base(_Tp __d) _NOEXCEPT : __base(__d) {} _LIBCPP_INLINE_VISIBILITY - _Tp fetch_add(_Tp __op, memory_order __m = memory_order_seq_cst) volatile - {return __atomic_fetch_add(&this->__a_, __op, __m);} + _Tp fetch_add(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT + {return __c11_atomic_fetch_add(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp fetch_add(_Tp __op, memory_order __m = memory_order_seq_cst) - {return __atomic_fetch_add(&this->__a_, __op, __m);} + _Tp fetch_add(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT + {return __c11_atomic_fetch_add(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp fetch_sub(_Tp __op, memory_order __m = memory_order_seq_cst) volatile - {return __atomic_fetch_sub(&this->__a_, __op, __m);} + _Tp fetch_sub(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT + {return __c11_atomic_fetch_sub(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp fetch_sub(_Tp __op, memory_order __m = memory_order_seq_cst) - {return __atomic_fetch_sub(&this->__a_, __op, __m);} + _Tp fetch_sub(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT + {return __c11_atomic_fetch_sub(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp fetch_and(_Tp __op, memory_order __m = memory_order_seq_cst) volatile - {return __atomic_fetch_and(&this->__a_, __op, __m);} + _Tp fetch_and(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT + {return __c11_atomic_fetch_and(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp fetch_and(_Tp __op, memory_order __m = memory_order_seq_cst) - {return __atomic_fetch_and(&this->__a_, __op, __m);} + _Tp fetch_and(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT + {return __c11_atomic_fetch_and(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp fetch_or(_Tp __op, memory_order __m = memory_order_seq_cst) volatile - {return __atomic_fetch_or(&this->__a_, __op, __m);} + _Tp fetch_or(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT + {return __c11_atomic_fetch_or(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp fetch_or(_Tp __op, memory_order __m = memory_order_seq_cst) - {return __atomic_fetch_or(&this->__a_, __op, __m);} + _Tp fetch_or(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT + {return __c11_atomic_fetch_or(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp fetch_xor(_Tp __op, memory_order __m = memory_order_seq_cst) volatile - {return __atomic_fetch_xor(&this->__a_, __op, __m);} + _Tp fetch_xor(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT + {return __c11_atomic_fetch_xor(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp fetch_xor(_Tp __op, memory_order __m = memory_order_seq_cst) - {return __atomic_fetch_xor(&this->__a_, __op, __m);} + _Tp fetch_xor(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT + {return __c11_atomic_fetch_xor(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp operator++(int) volatile {return fetch_add(_Tp(1));} + _Tp operator++(int) volatile _NOEXCEPT {return fetch_add(_Tp(1));} _LIBCPP_INLINE_VISIBILITY - _Tp operator++(int) {return fetch_add(_Tp(1));} + _Tp operator++(int) _NOEXCEPT {return fetch_add(_Tp(1));} _LIBCPP_INLINE_VISIBILITY - _Tp operator--(int) volatile {return fetch_sub(_Tp(1));} + _Tp operator--(int) volatile _NOEXCEPT {return fetch_sub(_Tp(1));} _LIBCPP_INLINE_VISIBILITY - _Tp operator--(int) {return fetch_sub(_Tp(1));} + _Tp operator--(int) _NOEXCEPT {return fetch_sub(_Tp(1));} _LIBCPP_INLINE_VISIBILITY - _Tp operator++() volatile {return fetch_add(_Tp(1)) + _Tp(1);} + _Tp operator++() volatile _NOEXCEPT {return fetch_add(_Tp(1)) + _Tp(1);} _LIBCPP_INLINE_VISIBILITY - _Tp operator++() {return fetch_add(_Tp(1)) + _Tp(1);} + _Tp operator++() _NOEXCEPT {return fetch_add(_Tp(1)) + _Tp(1);} _LIBCPP_INLINE_VISIBILITY - _Tp operator--() volatile {return fetch_sub(_Tp(1)) - _Tp(1);} + _Tp operator--() volatile _NOEXCEPT {return fetch_sub(_Tp(1)) - _Tp(1);} _LIBCPP_INLINE_VISIBILITY - _Tp operator--() {return fetch_sub(_Tp(1)) - _Tp(1);} + _Tp operator--() _NOEXCEPT {return fetch_sub(_Tp(1)) - _Tp(1);} _LIBCPP_INLINE_VISIBILITY - _Tp operator+=(_Tp __op) volatile {return fetch_add(__op) + __op;} + _Tp operator+=(_Tp __op) volatile _NOEXCEPT {return fetch_add(__op) + __op;} _LIBCPP_INLINE_VISIBILITY - _Tp operator+=(_Tp __op) {return fetch_add(__op) + __op;} + _Tp operator+=(_Tp __op) _NOEXCEPT {return fetch_add(__op) + __op;} _LIBCPP_INLINE_VISIBILITY - _Tp operator-=(_Tp __op) volatile {return fetch_sub(__op) - __op;} + _Tp operator-=(_Tp __op) volatile _NOEXCEPT {return fetch_sub(__op) - __op;} _LIBCPP_INLINE_VISIBILITY - _Tp operator-=(_Tp __op) {return fetch_sub(__op) - __op;} + _Tp operator-=(_Tp __op) _NOEXCEPT {return fetch_sub(__op) - __op;} _LIBCPP_INLINE_VISIBILITY - _Tp operator&=(_Tp __op) volatile {return fetch_and(__op) & __op;} + _Tp operator&=(_Tp __op) volatile _NOEXCEPT {return fetch_and(__op) & __op;} _LIBCPP_INLINE_VISIBILITY - _Tp operator&=(_Tp __op) {return fetch_and(__op) & __op;} + _Tp operator&=(_Tp __op) _NOEXCEPT {return fetch_and(__op) & __op;} _LIBCPP_INLINE_VISIBILITY - _Tp operator|=(_Tp __op) volatile {return fetch_or(__op) | __op;} + _Tp operator|=(_Tp __op) volatile _NOEXCEPT {return fetch_or(__op) | __op;} _LIBCPP_INLINE_VISIBILITY - _Tp operator|=(_Tp __op) {return fetch_or(__op) | __op;} + _Tp operator|=(_Tp __op) _NOEXCEPT {return fetch_or(__op) | __op;} _LIBCPP_INLINE_VISIBILITY - _Tp operator^=(_Tp __op) volatile {return fetch_xor(__op) ^ __op;} + _Tp operator^=(_Tp __op) volatile _NOEXCEPT {return fetch_xor(__op) ^ __op;} _LIBCPP_INLINE_VISIBILITY - _Tp operator^=(_Tp __op) {return fetch_xor(__op) ^ __op;} + _Tp operator^=(_Tp __op) _NOEXCEPT {return fetch_xor(__op) ^ __op;} }; // atomic @@ -723,15 +723,15 @@ struct atomic { typedef __atomic_base<_Tp> __base; _LIBCPP_INLINE_VISIBILITY - atomic() {} // = default; + atomic() _NOEXCEPT {} // = default; _LIBCPP_INLINE_VISIBILITY - /*constexpr*/ atomic(_Tp __d) : __base(__d) {} + _LIBCPP_CONSTEXPR atomic(_Tp __d) _NOEXCEPT : __base(__d) {} _LIBCPP_INLINE_VISIBILITY - _Tp operator=(_Tp __d) volatile + _Tp operator=(_Tp __d) volatile _NOEXCEPT {__base::store(__d); return __d;} _LIBCPP_INLINE_VISIBILITY - _Tp operator=(_Tp __d) + _Tp operator=(_Tp __d) _NOEXCEPT {__base::store(__d); return __d;} }; @@ -743,56 +743,56 @@ struct atomic<_Tp*> { typedef __atomic_base<_Tp*> __base; _LIBCPP_INLINE_VISIBILITY - atomic() {} // = default; + atomic() _NOEXCEPT {} // = default; _LIBCPP_INLINE_VISIBILITY - /*constexpr*/ atomic(_Tp* __d) : __base(__d) {} + _LIBCPP_CONSTEXPR atomic(_Tp* __d) _NOEXCEPT : __base(__d) {} _LIBCPP_INLINE_VISIBILITY - _Tp* operator=(_Tp* __d) volatile + _Tp* operator=(_Tp* __d) volatile _NOEXCEPT {__base::store(__d); return __d;} _LIBCPP_INLINE_VISIBILITY - _Tp* operator=(_Tp* __d) + _Tp* operator=(_Tp* __d) _NOEXCEPT {__base::store(__d); return __d;} _LIBCPP_INLINE_VISIBILITY _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) - volatile - {return __atomic_fetch_add(&this->__a_, __op, __m);} + volatile _NOEXCEPT + {return __c11_atomic_fetch_add(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) - {return __atomic_fetch_add(&this->__a_, __op, __m);} + _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT + {return __c11_atomic_fetch_add(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) - volatile - {return __atomic_fetch_sub(&this->__a_, __op, __m);} + volatile _NOEXCEPT + {return __c11_atomic_fetch_sub(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) - {return __atomic_fetch_sub(&this->__a_, __op, __m);} + _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT + {return __c11_atomic_fetch_sub(&this->__a_, __op, __m);} _LIBCPP_INLINE_VISIBILITY - _Tp* operator++(int) volatile {return fetch_add(1);} + _Tp* operator++(int) volatile _NOEXCEPT {return fetch_add(1);} _LIBCPP_INLINE_VISIBILITY - _Tp* operator++(int) {return fetch_add(1);} + _Tp* operator++(int) _NOEXCEPT {return fetch_add(1);} _LIBCPP_INLINE_VISIBILITY - _Tp* operator--(int) volatile {return fetch_sub(1);} + _Tp* operator--(int) volatile _NOEXCEPT {return fetch_sub(1);} _LIBCPP_INLINE_VISIBILITY - _Tp* operator--(int) {return fetch_sub(1);} + _Tp* operator--(int) _NOEXCEPT {return fetch_sub(1);} _LIBCPP_INLINE_VISIBILITY - _Tp* operator++() volatile {return fetch_add(1) + 1;} + _Tp* operator++() volatile _NOEXCEPT {return fetch_add(1) + 1;} _LIBCPP_INLINE_VISIBILITY - _Tp* operator++() {return fetch_add(1) + 1;} + _Tp* operator++() _NOEXCEPT {return fetch_add(1) + 1;} _LIBCPP_INLINE_VISIBILITY - _Tp* operator--() volatile {return fetch_sub(1) - 1;} + _Tp* operator--() volatile _NOEXCEPT {return fetch_sub(1) - 1;} _LIBCPP_INLINE_VISIBILITY - _Tp* operator--() {return fetch_sub(1) - 1;} + _Tp* operator--() _NOEXCEPT {return fetch_sub(1) - 1;} _LIBCPP_INLINE_VISIBILITY - _Tp* operator+=(ptrdiff_t __op) volatile {return fetch_add(__op) + __op;} + _Tp* operator+=(ptrdiff_t __op) volatile _NOEXCEPT {return fetch_add(__op) + __op;} _LIBCPP_INLINE_VISIBILITY - _Tp* operator+=(ptrdiff_t __op) {return fetch_add(__op) + __op;} + _Tp* operator+=(ptrdiff_t __op) _NOEXCEPT {return fetch_add(__op) + __op;} _LIBCPP_INLINE_VISIBILITY - _Tp* operator-=(ptrdiff_t __op) volatile {return fetch_sub(__op) - __op;} + _Tp* operator-=(ptrdiff_t __op) volatile _NOEXCEPT {return fetch_sub(__op) - __op;} _LIBCPP_INLINE_VISIBILITY - _Tp* operator-=(ptrdiff_t __op) {return fetch_sub(__op) - __op;} + _Tp* operator-=(ptrdiff_t __op) _NOEXCEPT {return fetch_sub(__op) - __op;} }; // atomic_is_lock_free @@ -800,7 +800,7 @@ struct atomic<_Tp*> template inline _LIBCPP_INLINE_VISIBILITY bool -atomic_is_lock_free(const volatile atomic<_Tp>* __o) +atomic_is_lock_free(const volatile atomic<_Tp>* __o) _NOEXCEPT { return __o->is_lock_free(); } @@ -808,7 +808,7 @@ atomic_is_lock_free(const volatile atomic<_Tp>* __o) template inline _LIBCPP_INLINE_VISIBILITY bool -atomic_is_lock_free(const atomic<_Tp>* __o) +atomic_is_lock_free(const atomic<_Tp>* __o) _NOEXCEPT { return __o->is_lock_free(); } @@ -818,17 +818,17 @@ atomic_is_lock_free(const atomic<_Tp>* __o) template inline _LIBCPP_INLINE_VISIBILITY void -atomic_init(volatile atomic<_Tp>* __o, _Tp __d) +atomic_init(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT { - __atomic_store(&__o->__a_, __d, memory_order_seq_cst); + __c11_atomic_init(&__o->__a_, __d); } template inline _LIBCPP_INLINE_VISIBILITY void -atomic_init(atomic<_Tp>* __o, _Tp __d) +atomic_init(atomic<_Tp>* __o, _Tp __d) _NOEXCEPT { - __atomic_store(&__o->__a_, __d, memory_order_seq_cst); + __c11_atomic_init(&__o->__a_, __d); } // atomic_store @@ -836,7 +836,7 @@ atomic_init(atomic<_Tp>* __o, _Tp __d) template inline _LIBCPP_INLINE_VISIBILITY void -atomic_store(volatile atomic<_Tp>* __o, _Tp __d) +atomic_store(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT { __o->store(__d); } @@ -844,7 +844,7 @@ atomic_store(volatile atomic<_Tp>* __o, _Tp __d) template inline _LIBCPP_INLINE_VISIBILITY void -atomic_store(atomic<_Tp>* __o, _Tp __d) +atomic_store(atomic<_Tp>* __o, _Tp __d) _NOEXCEPT { __o->store(__d); } @@ -854,7 +854,7 @@ atomic_store(atomic<_Tp>* __o, _Tp __d) template inline _LIBCPP_INLINE_VISIBILITY void -atomic_store_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) +atomic_store_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT { __o->store(__d, __m); } @@ -862,7 +862,7 @@ atomic_store_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) template inline _LIBCPP_INLINE_VISIBILITY void -atomic_store_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) +atomic_store_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT { __o->store(__d, __m); } @@ -872,7 +872,7 @@ atomic_store_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) template inline _LIBCPP_INLINE_VISIBILITY _Tp -atomic_load(const volatile atomic<_Tp>* __o) +atomic_load(const volatile atomic<_Tp>* __o) _NOEXCEPT { return __o->load(); } @@ -880,7 +880,7 @@ atomic_load(const volatile atomic<_Tp>* __o) template inline _LIBCPP_INLINE_VISIBILITY _Tp -atomic_load(const atomic<_Tp>* __o) +atomic_load(const atomic<_Tp>* __o) _NOEXCEPT { return __o->load(); } @@ -890,7 +890,7 @@ atomic_load(const atomic<_Tp>* __o) template inline _LIBCPP_INLINE_VISIBILITY _Tp -atomic_load_explicit(const volatile atomic<_Tp>* __o, memory_order __m) +atomic_load_explicit(const volatile atomic<_Tp>* __o, memory_order __m) _NOEXCEPT { return __o->load(__m); } @@ -898,7 +898,7 @@ atomic_load_explicit(const volatile atomic<_Tp>* __o, memory_order __m) template inline _LIBCPP_INLINE_VISIBILITY _Tp -atomic_load_explicit(const atomic<_Tp>* __o, memory_order __m) +atomic_load_explicit(const atomic<_Tp>* __o, memory_order __m) _NOEXCEPT { return __o->load(__m); } @@ -908,7 +908,7 @@ atomic_load_explicit(const atomic<_Tp>* __o, memory_order __m) template inline _LIBCPP_INLINE_VISIBILITY _Tp -atomic_exchange(volatile atomic<_Tp>* __o, _Tp __d) +atomic_exchange(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT { return __o->exchange(__d); } @@ -916,7 +916,7 @@ atomic_exchange(volatile atomic<_Tp>* __o, _Tp __d) template inline _LIBCPP_INLINE_VISIBILITY _Tp -atomic_exchange(atomic<_Tp>* __o, _Tp __d) +atomic_exchange(atomic<_Tp>* __o, _Tp __d) _NOEXCEPT { return __o->exchange(__d); } @@ -926,7 +926,7 @@ atomic_exchange(atomic<_Tp>* __o, _Tp __d) template inline _LIBCPP_INLINE_VISIBILITY _Tp -atomic_exchange_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) +atomic_exchange_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT { return __o->exchange(__d, __m); } @@ -934,7 +934,7 @@ atomic_exchange_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) template inline _LIBCPP_INLINE_VISIBILITY _Tp -atomic_exchange_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) +atomic_exchange_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT { return __o->exchange(__d, __m); } @@ -944,7 +944,7 @@ atomic_exchange_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) template inline _LIBCPP_INLINE_VISIBILITY bool -atomic_compare_exchange_weak(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) +atomic_compare_exchange_weak(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT { return __o->compare_exchange_weak(*__e, __d); } @@ -952,7 +952,7 @@ atomic_compare_exchange_weak(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) template inline _LIBCPP_INLINE_VISIBILITY bool -atomic_compare_exchange_weak(atomic<_Tp>* __o, _Tp* __e, _Tp __d) +atomic_compare_exchange_weak(atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT { return __o->compare_exchange_weak(*__e, __d); } @@ -962,7 +962,7 @@ atomic_compare_exchange_weak(atomic<_Tp>* __o, _Tp* __e, _Tp __d) template inline _LIBCPP_INLINE_VISIBILITY bool -atomic_compare_exchange_strong(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) +atomic_compare_exchange_strong(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT { return __o->compare_exchange_strong(*__e, __d); } @@ -970,7 +970,7 @@ atomic_compare_exchange_strong(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) template inline _LIBCPP_INLINE_VISIBILITY bool -atomic_compare_exchange_strong(atomic<_Tp>* __o, _Tp* __e, _Tp __d) +atomic_compare_exchange_strong(atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT { return __o->compare_exchange_strong(*__e, __d); } @@ -982,7 +982,7 @@ inline _LIBCPP_INLINE_VISIBILITY bool atomic_compare_exchange_weak_explicit(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d, - memory_order __s, memory_order __f) + memory_order __s, memory_order __f) _NOEXCEPT { return __o->compare_exchange_weak(*__e, __d, __s, __f); } @@ -991,7 +991,7 @@ template inline _LIBCPP_INLINE_VISIBILITY bool atomic_compare_exchange_weak_explicit(atomic<_Tp>* __o, _Tp* __e, _Tp __d, - memory_order __s, memory_order __f) + memory_order __s, memory_order __f) _NOEXCEPT { return __o->compare_exchange_weak(*__e, __d, __s, __f); } @@ -1003,7 +1003,7 @@ inline _LIBCPP_INLINE_VISIBILITY bool atomic_compare_exchange_strong_explicit(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d, - memory_order __s, memory_order __f) + memory_order __s, memory_order __f) _NOEXCEPT { return __o->compare_exchange_strong(*__e, __d, __s, __f); } @@ -1013,7 +1013,7 @@ inline _LIBCPP_INLINE_VISIBILITY bool atomic_compare_exchange_strong_explicit(atomic<_Tp>* __o, _Tp* __e, _Tp __d, - memory_order __s, memory_order __f) + memory_order __s, memory_order __f) _NOEXCEPT { return __o->compare_exchange_strong(*__e, __d, __s, __f); } @@ -1027,7 +1027,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_add(volatile atomic<_Tp>* __o, _Tp __op) +atomic_fetch_add(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT { return __o->fetch_add(__op); } @@ -1039,7 +1039,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_add(atomic<_Tp>* __o, _Tp __op) +atomic_fetch_add(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT { return __o->fetch_add(__op); } @@ -1047,7 +1047,7 @@ atomic_fetch_add(atomic<_Tp>* __o, _Tp __op) template inline _LIBCPP_INLINE_VISIBILITY _Tp* -atomic_fetch_add(volatile atomic<_Tp*>* __o, ptrdiff_t __op) +atomic_fetch_add(volatile atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT { return __o->fetch_add(__op); } @@ -1055,7 +1055,7 @@ atomic_fetch_add(volatile atomic<_Tp*>* __o, ptrdiff_t __op) template inline _LIBCPP_INLINE_VISIBILITY _Tp* -atomic_fetch_add(atomic<_Tp*>* __o, ptrdiff_t __op) +atomic_fetch_add(atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT { return __o->fetch_add(__op); } @@ -1069,7 +1069,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_add_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) +atomic_fetch_add_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT { return __o->fetch_add(__op, __m); } @@ -1081,7 +1081,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_add_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) +atomic_fetch_add_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT { return __o->fetch_add(__op, __m); } @@ -1090,7 +1090,7 @@ template inline _LIBCPP_INLINE_VISIBILITY _Tp* atomic_fetch_add_explicit(volatile atomic<_Tp*>* __o, ptrdiff_t __op, - memory_order __m) + memory_order __m) _NOEXCEPT { return __o->fetch_add(__op, __m); } @@ -1098,7 +1098,7 @@ atomic_fetch_add_explicit(volatile atomic<_Tp*>* __o, ptrdiff_t __op, template inline _LIBCPP_INLINE_VISIBILITY _Tp* -atomic_fetch_add_explicit(atomic<_Tp*>* __o, ptrdiff_t __op, memory_order __m) +atomic_fetch_add_explicit(atomic<_Tp*>* __o, ptrdiff_t __op, memory_order __m) _NOEXCEPT { return __o->fetch_add(__op, __m); } @@ -1112,7 +1112,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_sub(volatile atomic<_Tp>* __o, _Tp __op) +atomic_fetch_sub(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT { return __o->fetch_sub(__op); } @@ -1124,7 +1124,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_sub(atomic<_Tp>* __o, _Tp __op) +atomic_fetch_sub(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT { return __o->fetch_sub(__op); } @@ -1132,7 +1132,7 @@ atomic_fetch_sub(atomic<_Tp>* __o, _Tp __op) template inline _LIBCPP_INLINE_VISIBILITY _Tp* -atomic_fetch_sub(volatile atomic<_Tp*>* __o, ptrdiff_t __op) +atomic_fetch_sub(volatile atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT { return __o->fetch_sub(__op); } @@ -1140,7 +1140,7 @@ atomic_fetch_sub(volatile atomic<_Tp*>* __o, ptrdiff_t __op) template inline _LIBCPP_INLINE_VISIBILITY _Tp* -atomic_fetch_sub(atomic<_Tp*>* __o, ptrdiff_t __op) +atomic_fetch_sub(atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT { return __o->fetch_sub(__op); } @@ -1154,7 +1154,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_sub_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) +atomic_fetch_sub_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT { return __o->fetch_sub(__op, __m); } @@ -1166,7 +1166,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_sub_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) +atomic_fetch_sub_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT { return __o->fetch_sub(__op, __m); } @@ -1175,7 +1175,7 @@ template inline _LIBCPP_INLINE_VISIBILITY _Tp* atomic_fetch_sub_explicit(volatile atomic<_Tp*>* __o, ptrdiff_t __op, - memory_order __m) + memory_order __m) _NOEXCEPT { return __o->fetch_sub(__op, __m); } @@ -1183,7 +1183,7 @@ atomic_fetch_sub_explicit(volatile atomic<_Tp*>* __o, ptrdiff_t __op, template inline _LIBCPP_INLINE_VISIBILITY _Tp* -atomic_fetch_sub_explicit(atomic<_Tp*>* __o, ptrdiff_t __op, memory_order __m) +atomic_fetch_sub_explicit(atomic<_Tp*>* __o, ptrdiff_t __op, memory_order __m) _NOEXCEPT { return __o->fetch_sub(__op, __m); } @@ -1197,7 +1197,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_and(volatile atomic<_Tp>* __o, _Tp __op) +atomic_fetch_and(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT { return __o->fetch_and(__op); } @@ -1209,7 +1209,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_and(atomic<_Tp>* __o, _Tp __op) +atomic_fetch_and(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT { return __o->fetch_and(__op); } @@ -1223,7 +1223,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_and_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) +atomic_fetch_and_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT { return __o->fetch_and(__op, __m); } @@ -1235,7 +1235,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_and_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) +atomic_fetch_and_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT { return __o->fetch_and(__op, __m); } @@ -1249,7 +1249,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_or(volatile atomic<_Tp>* __o, _Tp __op) +atomic_fetch_or(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT { return __o->fetch_or(__op); } @@ -1261,7 +1261,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_or(atomic<_Tp>* __o, _Tp __op) +atomic_fetch_or(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT { return __o->fetch_or(__op); } @@ -1275,7 +1275,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_or_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) +atomic_fetch_or_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT { return __o->fetch_or(__op, __m); } @@ -1287,7 +1287,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_or_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) +atomic_fetch_or_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT { return __o->fetch_or(__op, __m); } @@ -1301,7 +1301,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_xor(volatile atomic<_Tp>* __o, _Tp __op) +atomic_fetch_xor(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT { return __o->fetch_xor(__op); } @@ -1313,7 +1313,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_xor(atomic<_Tp>* __o, _Tp __op) +atomic_fetch_xor(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT { return __o->fetch_xor(__op); } @@ -1327,7 +1327,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_xor_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) +atomic_fetch_xor_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT { return __o->fetch_xor(__op, __m); } @@ -1339,7 +1339,7 @@ typename enable_if is_integral<_Tp>::value && !is_same<_Tp, bool>::value, _Tp >::type -atomic_fetch_xor_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) +atomic_fetch_xor_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT { return __o->fetch_xor(__op, __m); } @@ -1351,22 +1351,22 @@ typedef struct atomic_flag _Atomic(bool) __a_; _LIBCPP_INLINE_VISIBILITY - bool test_and_set(memory_order __m = memory_order_seq_cst) volatile - {return __atomic_exchange(&__a_, true, __m);} + bool test_and_set(memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT + {return __c11_atomic_exchange(&__a_, true, __m);} _LIBCPP_INLINE_VISIBILITY - bool test_and_set(memory_order __m = memory_order_seq_cst) - {return __atomic_exchange(&__a_, true, __m);} + bool test_and_set(memory_order __m = memory_order_seq_cst) _NOEXCEPT + {return __c11_atomic_exchange(&__a_, true, __m);} _LIBCPP_INLINE_VISIBILITY - void clear(memory_order __m = memory_order_seq_cst) volatile - {__atomic_store(&__a_, false, __m);} + void clear(memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT + {__c11_atomic_store(&__a_, false, __m);} _LIBCPP_INLINE_VISIBILITY - void clear(memory_order __m = memory_order_seq_cst) - {__atomic_store(&__a_, false, __m);} + void clear(memory_order __m = memory_order_seq_cst) _NOEXCEPT + {__c11_atomic_store(&__a_, false, __m);} _LIBCPP_INLINE_VISIBILITY - atomic_flag() {} // = default; + atomic_flag() _NOEXCEPT {} // = default; _LIBCPP_INLINE_VISIBILITY - atomic_flag(bool __b) { __atomic_store(&__a_, __b, memory_order_seq_cst); } + atomic_flag(bool __b) _NOEXCEPT : __a_(__b) {} #ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS atomic_flag(const atomic_flag&) = delete; @@ -1382,56 +1382,56 @@ private: inline _LIBCPP_INLINE_VISIBILITY bool -atomic_flag_test_and_set(volatile atomic_flag* __o) +atomic_flag_test_and_set(volatile atomic_flag* __o) _NOEXCEPT { return __o->test_and_set(); } inline _LIBCPP_INLINE_VISIBILITY bool -atomic_flag_test_and_set(atomic_flag* __o) +atomic_flag_test_and_set(atomic_flag* __o) _NOEXCEPT { return __o->test_and_set(); } inline _LIBCPP_INLINE_VISIBILITY bool -atomic_flag_test_and_set_explicit(volatile atomic_flag* __o, memory_order __m) +atomic_flag_test_and_set_explicit(volatile atomic_flag* __o, memory_order __m) _NOEXCEPT { return __o->test_and_set(__m); } inline _LIBCPP_INLINE_VISIBILITY bool -atomic_flag_test_and_set_explicit(atomic_flag* __o, memory_order __m) +atomic_flag_test_and_set_explicit(atomic_flag* __o, memory_order __m) _NOEXCEPT { return __o->test_and_set(__m); } inline _LIBCPP_INLINE_VISIBILITY void -atomic_flag_clear(volatile atomic_flag* __o) +atomic_flag_clear(volatile atomic_flag* __o) _NOEXCEPT { __o->clear(); } inline _LIBCPP_INLINE_VISIBILITY void -atomic_flag_clear(atomic_flag* __o) +atomic_flag_clear(atomic_flag* __o) _NOEXCEPT { __o->clear(); } inline _LIBCPP_INLINE_VISIBILITY void -atomic_flag_clear_explicit(volatile atomic_flag* __o, memory_order __m) +atomic_flag_clear_explicit(volatile atomic_flag* __o, memory_order __m) _NOEXCEPT { __o->clear(__m); } inline _LIBCPP_INLINE_VISIBILITY void -atomic_flag_clear_explicit(atomic_flag* __o, memory_order __m) +atomic_flag_clear_explicit(atomic_flag* __o, memory_order __m) _NOEXCEPT { __o->clear(__m); } @@ -1440,16 +1440,16 @@ atomic_flag_clear_explicit(atomic_flag* __o, memory_order __m) inline _LIBCPP_INLINE_VISIBILITY void -atomic_thread_fence(memory_order __m) +atomic_thread_fence(memory_order __m) _NOEXCEPT { - __atomic_thread_fence(__m); + __c11_atomic_thread_fence(__m); } inline _LIBCPP_INLINE_VISIBILITY void -atomic_signal_fence(memory_order __m) +atomic_signal_fence(memory_order __m) _NOEXCEPT { - __atomic_signal_fence(__m); + __c11_atomic_signal_fence(__m); } // Atomics for standard typedef types diff --git a/contrib/libc++/include/cmath b/contrib/libc++/include/cmath index 026889f81e5..76d7a821acb 100644 --- a/contrib/libc++/include/cmath +++ b/contrib/libc++/include/cmath @@ -648,10 +648,17 @@ using ::double_t; // abs -template inline _LIBCPP_INLINE_VISIBILITY -typename enable_if::value, _A1>::type -abs(_A1 __x) {return fabs(__x);} +float +abs(float __x) {return fabsf(__x);} + +inline _LIBCPP_INLINE_VISIBILITY +double +abs(double __x) {return fabs(__x);} + +inline _LIBCPP_INLINE_VISIBILITY +long double +abs(long double __x) {return fabsl(__x);} #ifndef __sun__ diff --git a/contrib/libc++/include/limits b/contrib/libc++/include/limits index ea579ad3136..68e63366abe 100644 --- a/contrib/libc++/include/limits +++ b/contrib/libc++/include/limits @@ -21,43 +21,43 @@ template class numeric_limits { public: - static const bool is_specialized = false; - static T min() noexcept; - static T max() noexcept; - static T lowest() noexcept; + static constexpr bool is_specialized = false; + static constexpr T min() noexcept; + static constexpr T max() noexcept; + static constexpr T lowest() noexcept; - static const int digits = 0; - static const int digits10 = 0; - static const int max_digits10 = 0; - static const bool is_signed = false; - static const bool is_integer = false; - static const bool is_exact = false; - static const int radix = 0; - static T epsilon() noexcept; - static T round_error() noexcept; + static constexpr int digits = 0; + static constexpr int digits10 = 0; + static constexpr int max_digits10 = 0; + static constexpr bool is_signed = false; + static constexpr bool is_integer = false; + static constexpr bool is_exact = false; + static constexpr int radix = 0; + static constexpr T epsilon() noexcept; + static constexpr T round_error() noexcept; - static const int min_exponent = 0; - static const int min_exponent10 = 0; - static const int max_exponent = 0; - static const int max_exponent10 = 0; + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; - static const bool has_infinity = false; - static const bool has_quiet_NaN = false; - static const bool has_signaling_NaN = false; - static const float_denorm_style has_denorm = denorm_absent; - static const bool has_denorm_loss = false; - static T infinity() noexcept; - static T quiet_NaN() noexcept; - static T signaling_NaN() noexcept; - static T denorm_min() noexcept; + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm = denorm_absent; + static constexpr bool has_denorm_loss = false; + static constexpr T infinity() noexcept; + static constexpr T quiet_NaN() noexcept; + static constexpr T signaling_NaN() noexcept; + static constexpr T denorm_min() noexcept; - static const bool is_iec559 = false; - static const bool is_bounded = false; - static const bool is_modulo = false; + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = false; + static constexpr bool is_modulo = false; - static const bool traps = false; - static const bool tinyness_before = false; - static const float_round_style round_style = round_toward_zero; + static constexpr bool traps = false; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style = round_toward_zero; }; enum float_round_style @@ -139,55 +139,55 @@ class __libcpp_numeric_limits protected: typedef _Tp type; - static const bool is_specialized = false; - _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return type();} - _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return type();} - _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return type();} + static _LIBCPP_CONSTEXPR const bool is_specialized = false; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return type();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return type();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return type();} - static const int digits = 0; - static const int digits10 = 0; - static const int max_digits10 = 0; - static const bool is_signed = false; - static const bool is_integer = false; - static const bool is_exact = false; - static const int radix = 0; - _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return type();} - _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return type();} + static _LIBCPP_CONSTEXPR const int digits = 0; + static _LIBCPP_CONSTEXPR const int digits10 = 0; + static _LIBCPP_CONSTEXPR const int max_digits10 = 0; + static _LIBCPP_CONSTEXPR const bool is_signed = false; + static _LIBCPP_CONSTEXPR const bool is_integer = false; + static _LIBCPP_CONSTEXPR const bool is_exact = false; + static _LIBCPP_CONSTEXPR const int radix = 0; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type();} - static const int min_exponent = 0; - static const int min_exponent10 = 0; - static const int max_exponent = 0; - static const int max_exponent10 = 0; + static _LIBCPP_CONSTEXPR const int min_exponent = 0; + static _LIBCPP_CONSTEXPR const int min_exponent10 = 0; + static _LIBCPP_CONSTEXPR const int max_exponent = 0; + static _LIBCPP_CONSTEXPR const int max_exponent10 = 0; - static const bool has_infinity = false; - static const bool has_quiet_NaN = false; - static const bool has_signaling_NaN = false; - static const float_denorm_style has_denorm = denorm_absent; - static const bool has_denorm_loss = false; - _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return type();} - _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return type();} - _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return type();} - _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return type();} + static _LIBCPP_CONSTEXPR const bool has_infinity = false; + static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false; + static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false; + static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent; + static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type();} - static const bool is_iec559 = false; - static const bool is_bounded = false; - static const bool is_modulo = false; + static _LIBCPP_CONSTEXPR const bool is_iec559 = false; + static _LIBCPP_CONSTEXPR const bool is_bounded = false; + static _LIBCPP_CONSTEXPR const bool is_modulo = false; - static const bool traps = false; - static const bool tinyness_before = false; - static const float_round_style round_style = round_toward_zero; + static _LIBCPP_CONSTEXPR const bool traps = false; + static _LIBCPP_CONSTEXPR const bool tinyness_before = false; + static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero; }; template struct __libcpp_compute_min { - static const _Tp value = _Tp(_Tp(1) << digits); + static _LIBCPP_CONSTEXPR const _Tp value = _Tp(_Tp(1) << digits); }; template struct __libcpp_compute_min<_Tp, digits, false> { - static const _Tp value = _Tp(0); + static _LIBCPP_CONSTEXPR const _Tp value = _Tp(0); }; template @@ -196,50 +196,50 @@ class __libcpp_numeric_limits<_Tp, true> protected: typedef _Tp type; - static const bool is_specialized = true; + static _LIBCPP_CONSTEXPR const bool is_specialized = true; - static const bool is_signed = type(-1) < type(0); - static const int digits = static_cast(sizeof(type) * __CHAR_BIT__ - is_signed); - static const int digits10 = digits * 3 / 10; - static const int max_digits10 = 0; - static const type __min = __libcpp_compute_min::value; - static const type __max = is_signed ? type(type(~0) ^ __min) : type(~0); - _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __min;} - _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __max;} - _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return min();} + static _LIBCPP_CONSTEXPR const bool is_signed = type(-1) < type(0); + static _LIBCPP_CONSTEXPR const int digits = static_cast(sizeof(type) * __CHAR_BIT__ - is_signed); + static _LIBCPP_CONSTEXPR const int digits10 = digits * 3 / 10; + static _LIBCPP_CONSTEXPR const int max_digits10 = 0; + static _LIBCPP_CONSTEXPR const type __min = __libcpp_compute_min::value; + static _LIBCPP_CONSTEXPR const type __max = is_signed ? type(type(~0) ^ __min) : type(~0); + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __min;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __max;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return min();} - static const bool is_integer = true; - static const bool is_exact = true; - static const int radix = 2; - _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return type(0);} - _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return type(0);} + static _LIBCPP_CONSTEXPR const bool is_integer = true; + static _LIBCPP_CONSTEXPR const bool is_exact = true; + static _LIBCPP_CONSTEXPR const int radix = 2; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type(0);} - static const int min_exponent = 0; - static const int min_exponent10 = 0; - static const int max_exponent = 0; - static const int max_exponent10 = 0; + static _LIBCPP_CONSTEXPR const int min_exponent = 0; + static _LIBCPP_CONSTEXPR const int min_exponent10 = 0; + static _LIBCPP_CONSTEXPR const int max_exponent = 0; + static _LIBCPP_CONSTEXPR const int max_exponent10 = 0; - static const bool has_infinity = false; - static const bool has_quiet_NaN = false; - static const bool has_signaling_NaN = false; - static const float_denorm_style has_denorm = denorm_absent; - static const bool has_denorm_loss = false; - _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return type(0);} - _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return type(0);} - _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return type(0);} - _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return type(0);} + static _LIBCPP_CONSTEXPR const bool has_infinity = false; + static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false; + static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false; + static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent; + static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type(0);} - static const bool is_iec559 = false; - static const bool is_bounded = true; - static const bool is_modulo = true; + static _LIBCPP_CONSTEXPR const bool is_iec559 = false; + static _LIBCPP_CONSTEXPR const bool is_bounded = true; + static _LIBCPP_CONSTEXPR const bool is_modulo = true; #if __i386__ || __x86_64__ - static const bool traps = true; + static _LIBCPP_CONSTEXPR const bool traps = true; #else - static const bool traps = false; + static _LIBCPP_CONSTEXPR const bool traps = false; #endif - static const bool tinyness_before = false; - static const float_round_style round_style = round_toward_zero; + static _LIBCPP_CONSTEXPR const bool tinyness_before = false; + static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero; }; template <> @@ -248,46 +248,46 @@ class __libcpp_numeric_limits protected: typedef bool type; - static const bool is_specialized = true; + static _LIBCPP_CONSTEXPR const bool is_specialized = true; - static const bool is_signed = false; - static const int digits = 1; - static const int digits10 = 0; - static const int max_digits10 = 0; - static const type __min = false; - static const type __max = true; - _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __min;} - _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __max;} - _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return min();} + static _LIBCPP_CONSTEXPR const bool is_signed = false; + static _LIBCPP_CONSTEXPR const int digits = 1; + static _LIBCPP_CONSTEXPR const int digits10 = 0; + static _LIBCPP_CONSTEXPR const int max_digits10 = 0; + static _LIBCPP_CONSTEXPR const type __min = false; + static _LIBCPP_CONSTEXPR const type __max = true; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __min;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __max;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return min();} - static const bool is_integer = true; - static const bool is_exact = true; - static const int radix = 2; - _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return type(0);} - _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return type(0);} + static _LIBCPP_CONSTEXPR const bool is_integer = true; + static _LIBCPP_CONSTEXPR const bool is_exact = true; + static _LIBCPP_CONSTEXPR const int radix = 2; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type(0);} - static const int min_exponent = 0; - static const int min_exponent10 = 0; - static const int max_exponent = 0; - static const int max_exponent10 = 0; + static _LIBCPP_CONSTEXPR const int min_exponent = 0; + static _LIBCPP_CONSTEXPR const int min_exponent10 = 0; + static _LIBCPP_CONSTEXPR const int max_exponent = 0; + static _LIBCPP_CONSTEXPR const int max_exponent10 = 0; - static const bool has_infinity = false; - static const bool has_quiet_NaN = false; - static const bool has_signaling_NaN = false; - static const float_denorm_style has_denorm = denorm_absent; - static const bool has_denorm_loss = false; - _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return type(0);} - _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return type(0);} - _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return type(0);} - _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return type(0);} + static _LIBCPP_CONSTEXPR const bool has_infinity = false; + static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false; + static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false; + static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent; + static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type(0);} - static const bool is_iec559 = false; - static const bool is_bounded = true; - static const bool is_modulo = false; + static _LIBCPP_CONSTEXPR const bool is_iec559 = false; + static _LIBCPP_CONSTEXPR const bool is_bounded = true; + static _LIBCPP_CONSTEXPR const bool is_modulo = false; - static const bool traps = false; - static const bool tinyness_before = false; - static const float_round_style round_style = round_toward_zero; + static _LIBCPP_CONSTEXPR const bool traps = false; + static _LIBCPP_CONSTEXPR const bool tinyness_before = false; + static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero; }; template <> @@ -296,44 +296,44 @@ class __libcpp_numeric_limits protected: typedef float type; - static const bool is_specialized = true; + static _LIBCPP_CONSTEXPR const bool is_specialized = true; - static const bool is_signed = true; - static const int digits = __FLT_MANT_DIG__; - static const int digits10 = __FLT_DIG__; - static const int max_digits10 = 2+(digits * 30103)/100000; - _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __FLT_MIN__;} - _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __FLT_MAX__;} - _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return -max();} + static _LIBCPP_CONSTEXPR const bool is_signed = true; + static _LIBCPP_CONSTEXPR const int digits = __FLT_MANT_DIG__; + static _LIBCPP_CONSTEXPR const int digits10 = __FLT_DIG__; + static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103)/100000; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __FLT_MIN__;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __FLT_MAX__;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();} - static const bool is_integer = false; - static const bool is_exact = false; - static const int radix = __FLT_RADIX__; - _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __FLT_EPSILON__;} - _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return 0.5F;} + static _LIBCPP_CONSTEXPR const bool is_integer = false; + static _LIBCPP_CONSTEXPR const bool is_exact = false; + static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __FLT_EPSILON__;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5F;} - static const int min_exponent = __FLT_MIN_EXP__; - static const int min_exponent10 = __FLT_MIN_10_EXP__; - static const int max_exponent = __FLT_MAX_EXP__; - static const int max_exponent10 = __FLT_MAX_10_EXP__; + static _LIBCPP_CONSTEXPR const int min_exponent = __FLT_MIN_EXP__; + static _LIBCPP_CONSTEXPR const int min_exponent10 = __FLT_MIN_10_EXP__; + static _LIBCPP_CONSTEXPR const int max_exponent = __FLT_MAX_EXP__; + static _LIBCPP_CONSTEXPR const int max_exponent10 = __FLT_MAX_10_EXP__; - static const bool has_infinity = true; - static const bool has_quiet_NaN = true; - static const bool has_signaling_NaN = true; - static const float_denorm_style has_denorm = denorm_present; - static const bool has_denorm_loss = false; - _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __builtin_huge_valf();} - _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __builtin_nanf("");} - _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __builtin_nansf("");} - _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __FLT_DENORM_MIN__;} + static _LIBCPP_CONSTEXPR const bool has_infinity = true; + static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true; + static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true; + static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present; + static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_valf();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nanf("");} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nansf("");} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __FLT_DENORM_MIN__;} - static const bool is_iec559 = true; - static const bool is_bounded = true; - static const bool is_modulo = false; + static _LIBCPP_CONSTEXPR const bool is_iec559 = true; + static _LIBCPP_CONSTEXPR const bool is_bounded = true; + static _LIBCPP_CONSTEXPR const bool is_modulo = false; - static const bool traps = false; - static const bool tinyness_before = false; - static const float_round_style round_style = round_to_nearest; + static _LIBCPP_CONSTEXPR const bool traps = false; + static _LIBCPP_CONSTEXPR const bool tinyness_before = false; + static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest; }; template <> @@ -342,44 +342,44 @@ class __libcpp_numeric_limits protected: typedef double type; - static const bool is_specialized = true; + static _LIBCPP_CONSTEXPR const bool is_specialized = true; - static const bool is_signed = true; - static const int digits = __DBL_MANT_DIG__; - static const int digits10 = __DBL_DIG__; - static const int max_digits10 = 2+(digits * 30103)/100000; - _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __DBL_MIN__;} - _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __DBL_MAX__;} - _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return -max();} + static _LIBCPP_CONSTEXPR const bool is_signed = true; + static _LIBCPP_CONSTEXPR const int digits = __DBL_MANT_DIG__; + static _LIBCPP_CONSTEXPR const int digits10 = __DBL_DIG__; + static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103)/100000; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __DBL_MIN__;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __DBL_MAX__;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();} - static const bool is_integer = false; - static const bool is_exact = false; - static const int radix = __FLT_RADIX__; - _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __DBL_EPSILON__;} - _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return 0.5;} + static _LIBCPP_CONSTEXPR const bool is_integer = false; + static _LIBCPP_CONSTEXPR const bool is_exact = false; + static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __DBL_EPSILON__;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5;} - static const int min_exponent = __DBL_MIN_EXP__; - static const int min_exponent10 = __DBL_MIN_10_EXP__; - static const int max_exponent = __DBL_MAX_EXP__; - static const int max_exponent10 = __DBL_MAX_10_EXP__; + static _LIBCPP_CONSTEXPR const int min_exponent = __DBL_MIN_EXP__; + static _LIBCPP_CONSTEXPR const int min_exponent10 = __DBL_MIN_10_EXP__; + static _LIBCPP_CONSTEXPR const int max_exponent = __DBL_MAX_EXP__; + static _LIBCPP_CONSTEXPR const int max_exponent10 = __DBL_MAX_10_EXP__; - static const bool has_infinity = true; - static const bool has_quiet_NaN = true; - static const bool has_signaling_NaN = true; - static const float_denorm_style has_denorm = denorm_present; - static const bool has_denorm_loss = false; - _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __builtin_huge_val();} - _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __builtin_nan("");} - _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __builtin_nans("");} - _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __DBL_DENORM_MIN__;} + static _LIBCPP_CONSTEXPR const bool has_infinity = true; + static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true; + static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true; + static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present; + static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_val();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nan("");} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nans("");} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __DBL_DENORM_MIN__;} - static const bool is_iec559 = true; - static const bool is_bounded = true; - static const bool is_modulo = false; + static _LIBCPP_CONSTEXPR const bool is_iec559 = true; + static _LIBCPP_CONSTEXPR const bool is_bounded = true; + static _LIBCPP_CONSTEXPR const bool is_modulo = false; - static const bool traps = false; - static const bool tinyness_before = false; - static const float_round_style round_style = round_to_nearest; + static _LIBCPP_CONSTEXPR const bool traps = false; + static _LIBCPP_CONSTEXPR const bool tinyness_before = false; + static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest; }; template <> @@ -388,48 +388,48 @@ class __libcpp_numeric_limits protected: typedef long double type; - static const bool is_specialized = true; + static _LIBCPP_CONSTEXPR const bool is_specialized = true; - static const bool is_signed = true; - static const int digits = __LDBL_MANT_DIG__; - static const int digits10 = __LDBL_DIG__; - static const int max_digits10 = 2+(digits * 30103)/100000; - _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __LDBL_MIN__;} - _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __LDBL_MAX__;} - _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return -max();} + static _LIBCPP_CONSTEXPR const bool is_signed = true; + static _LIBCPP_CONSTEXPR const int digits = __LDBL_MANT_DIG__; + static _LIBCPP_CONSTEXPR const int digits10 = __LDBL_DIG__; + static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103)/100000; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __LDBL_MIN__;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __LDBL_MAX__;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();} - static const bool is_integer = false; - static const bool is_exact = false; - static const int radix = __FLT_RADIX__; - _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __LDBL_EPSILON__;} - _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return 0.5;} + static _LIBCPP_CONSTEXPR const bool is_integer = false; + static _LIBCPP_CONSTEXPR const bool is_exact = false; + static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __LDBL_EPSILON__;} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5;} - static const int min_exponent = __LDBL_MIN_EXP__; - static const int min_exponent10 = __LDBL_MIN_10_EXP__; - static const int max_exponent = __LDBL_MAX_EXP__; - static const int max_exponent10 = __LDBL_MAX_10_EXP__; + static _LIBCPP_CONSTEXPR const int min_exponent = __LDBL_MIN_EXP__; + static _LIBCPP_CONSTEXPR const int min_exponent10 = __LDBL_MIN_10_EXP__; + static _LIBCPP_CONSTEXPR const int max_exponent = __LDBL_MAX_EXP__; + static _LIBCPP_CONSTEXPR const int max_exponent10 = __LDBL_MAX_10_EXP__; - static const bool has_infinity = true; - static const bool has_quiet_NaN = true; - static const bool has_signaling_NaN = true; - static const float_denorm_style has_denorm = denorm_present; - static const bool has_denorm_loss = false; - _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __builtin_huge_vall();} - _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __builtin_nanl("");} - _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __builtin_nansl("");} - _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __LDBL_DENORM_MIN__;} + static _LIBCPP_CONSTEXPR const bool has_infinity = true; + static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true; + static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true; + static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present; + static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_vall();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nanl("");} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nansl("");} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __LDBL_DENORM_MIN__;} #if (defined(__ppc__) || defined(__ppc64__)) - static const bool is_iec559 = false; + static _LIBCPP_CONSTEXPR const bool is_iec559 = false; #else - static const bool is_iec559 = true; + static _LIBCPP_CONSTEXPR const bool is_iec559 = true; #endif - static const bool is_bounded = true; - static const bool is_modulo = false; + static _LIBCPP_CONSTEXPR const bool is_bounded = true; + static _LIBCPP_CONSTEXPR const bool is_modulo = false; - static const bool traps = false; - static const bool tinyness_before = false; - static const float_round_style round_style = round_to_nearest; + static _LIBCPP_CONSTEXPR const bool traps = false; + static _LIBCPP_CONSTEXPR const bool tinyness_before = false; + static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest; }; template @@ -439,43 +439,43 @@ class _LIBCPP_VISIBLE numeric_limits typedef __libcpp_numeric_limits::type> __base; typedef typename __base::type type; public: - static const bool is_specialized = __base::is_specialized; - _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __base::min();} - _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __base::max();} - _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return __base::lowest();} + static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();} - static const int digits = __base::digits; - static const int digits10 = __base::digits10; - static const int max_digits10 = __base::max_digits10; - static const bool is_signed = __base::is_signed; - static const bool is_integer = __base::is_integer; - static const bool is_exact = __base::is_exact; - static const int radix = __base::radix; - _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __base::epsilon();} - _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return __base::round_error();} + static _LIBCPP_CONSTEXPR const int digits = __base::digits; + static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10; + static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10; + static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed; + static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer; + static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact; + static _LIBCPP_CONSTEXPR const int radix = __base::radix; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();} - static const int min_exponent = __base::min_exponent; - static const int min_exponent10 = __base::min_exponent10; - static const int max_exponent = __base::max_exponent; - static const int max_exponent10 = __base::max_exponent10; + static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent; + static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10; + static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent; + static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10; - static const bool has_infinity = __base::has_infinity; - static const bool has_quiet_NaN = __base::has_quiet_NaN; - static const bool has_signaling_NaN = __base::has_signaling_NaN; - static const float_denorm_style has_denorm = __base::has_denorm; - static const bool has_denorm_loss = __base::has_denorm_loss; - _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __base::infinity();} - _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} - _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} - _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __base::denorm_min();} + static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity; + static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN; + static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN; + static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm; + static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();} - static const bool is_iec559 = __base::is_iec559; - static const bool is_bounded = __base::is_bounded; - static const bool is_modulo = __base::is_modulo; + static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559; + static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded; + static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo; - static const bool traps = __base::traps; - static const bool tinyness_before = __base::tinyness_before; - static const float_round_style round_style = __base::round_style; + static _LIBCPP_CONSTEXPR const bool traps = __base::traps; + static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before; + static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style; }; template @@ -485,43 +485,43 @@ class _LIBCPP_VISIBLE numeric_limits typedef numeric_limits<_Tp> __base; typedef _Tp type; public: - static const bool is_specialized = __base::is_specialized; - _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __base::min();} - _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __base::max();} - _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return __base::lowest();} + static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();} - static const int digits = __base::digits; - static const int digits10 = __base::digits10; - static const int max_digits10 = __base::max_digits10; - static const bool is_signed = __base::is_signed; - static const bool is_integer = __base::is_integer; - static const bool is_exact = __base::is_exact; - static const int radix = __base::radix; - _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __base::epsilon();} - _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return __base::round_error();} + static _LIBCPP_CONSTEXPR const int digits = __base::digits; + static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10; + static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10; + static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed; + static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer; + static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact; + static _LIBCPP_CONSTEXPR const int radix = __base::radix; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();} - static const int min_exponent = __base::min_exponent; - static const int min_exponent10 = __base::min_exponent10; - static const int max_exponent = __base::max_exponent; - static const int max_exponent10 = __base::max_exponent10; + static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent; + static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10; + static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent; + static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10; - static const bool has_infinity = __base::has_infinity; - static const bool has_quiet_NaN = __base::has_quiet_NaN; - static const bool has_signaling_NaN = __base::has_signaling_NaN; - static const float_denorm_style has_denorm = __base::has_denorm; - static const bool has_denorm_loss = __base::has_denorm_loss; - _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __base::infinity();} - _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} - _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} - _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __base::denorm_min();} + static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity; + static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN; + static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN; + static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm; + static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();} - static const bool is_iec559 = __base::is_iec559; - static const bool is_bounded = __base::is_bounded; - static const bool is_modulo = __base::is_modulo; + static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559; + static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded; + static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo; - static const bool traps = __base::traps; - static const bool tinyness_before = __base::tinyness_before; - static const float_round_style round_style = __base::round_style; + static _LIBCPP_CONSTEXPR const bool traps = __base::traps; + static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before; + static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style; }; template @@ -531,43 +531,43 @@ class _LIBCPP_VISIBLE numeric_limits typedef numeric_limits<_Tp> __base; typedef _Tp type; public: - static const bool is_specialized = __base::is_specialized; - _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __base::min();} - _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __base::max();} - _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return __base::lowest();} + static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();} - static const int digits = __base::digits; - static const int digits10 = __base::digits10; - static const int max_digits10 = __base::max_digits10; - static const bool is_signed = __base::is_signed; - static const bool is_integer = __base::is_integer; - static const bool is_exact = __base::is_exact; - static const int radix = __base::radix; - _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __base::epsilon();} - _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return __base::round_error();} + static _LIBCPP_CONSTEXPR const int digits = __base::digits; + static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10; + static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10; + static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed; + static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer; + static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact; + static _LIBCPP_CONSTEXPR const int radix = __base::radix; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();} - static const int min_exponent = __base::min_exponent; - static const int min_exponent10 = __base::min_exponent10; - static const int max_exponent = __base::max_exponent; - static const int max_exponent10 = __base::max_exponent10; + static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent; + static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10; + static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent; + static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10; - static const bool has_infinity = __base::has_infinity; - static const bool has_quiet_NaN = __base::has_quiet_NaN; - static const bool has_signaling_NaN = __base::has_signaling_NaN; - static const float_denorm_style has_denorm = __base::has_denorm; - static const bool has_denorm_loss = __base::has_denorm_loss; - _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __base::infinity();} - _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} - _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} - _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __base::denorm_min();} + static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity; + static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN; + static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN; + static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm; + static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();} - static const bool is_iec559 = __base::is_iec559; - static const bool is_bounded = __base::is_bounded; - static const bool is_modulo = __base::is_modulo; + static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559; + static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded; + static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo; - static const bool traps = __base::traps; - static const bool tinyness_before = __base::tinyness_before; - static const float_round_style round_style = __base::round_style; + static _LIBCPP_CONSTEXPR const bool traps = __base::traps; + static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before; + static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style; }; template @@ -577,43 +577,43 @@ class _LIBCPP_VISIBLE numeric_limits typedef numeric_limits<_Tp> __base; typedef _Tp type; public: - static const bool is_specialized = __base::is_specialized; - _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __base::min();} - _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __base::max();} - _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return __base::lowest();} + static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();} - static const int digits = __base::digits; - static const int digits10 = __base::digits10; - static const int max_digits10 = __base::max_digits10; - static const bool is_signed = __base::is_signed; - static const bool is_integer = __base::is_integer; - static const bool is_exact = __base::is_exact; - static const int radix = __base::radix; - _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __base::epsilon();} - _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return __base::round_error();} + static _LIBCPP_CONSTEXPR const int digits = __base::digits; + static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10; + static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10; + static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed; + static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer; + static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact; + static _LIBCPP_CONSTEXPR const int radix = __base::radix; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();} - static const int min_exponent = __base::min_exponent; - static const int min_exponent10 = __base::min_exponent10; - static const int max_exponent = __base::max_exponent; - static const int max_exponent10 = __base::max_exponent10; + static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent; + static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10; + static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent; + static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10; - static const bool has_infinity = __base::has_infinity; - static const bool has_quiet_NaN = __base::has_quiet_NaN; - static const bool has_signaling_NaN = __base::has_signaling_NaN; - static const float_denorm_style has_denorm = __base::has_denorm; - static const bool has_denorm_loss = __base::has_denorm_loss; - _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __base::infinity();} - _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} - _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} - _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __base::denorm_min();} + static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity; + static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN; + static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN; + static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm; + static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss; + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();} - static const bool is_iec559 = __base::is_iec559; - static const bool is_bounded = __base::is_bounded; - static const bool is_modulo = __base::is_modulo; + static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559; + static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded; + static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo; - static const bool traps = __base::traps; - static const bool tinyness_before = __base::tinyness_before; - static const float_round_style round_style = __base::round_style; + static _LIBCPP_CONSTEXPR const bool traps = __base::traps; + static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before; + static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style; }; _LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/include/memory b/contrib/libc++/include/memory index aa24f960aec..e30a6fd7c5b 100644 --- a/contrib/libc++/include/memory +++ b/contrib/libc++/include/memory @@ -1685,39 +1685,21 @@ public: ::new((void*)__p) _Tp(); } # if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) + template _LIBCPP_INLINE_VISIBILITY - typename enable_if - < - !is_convertible<_A0, __rv<_A0> >::value, - void - >::type + void construct(pointer __p, _A0& __a0) { ::new((void*)__p) _Tp(__a0); } template _LIBCPP_INLINE_VISIBILITY - typename enable_if - < - !is_convertible<_A0, __rv<_A0> >::value, - void - >::type + void construct(pointer __p, const _A0& __a0) { ::new((void*)__p) _Tp(__a0); } - template - _LIBCPP_INLINE_VISIBILITY - typename enable_if - < - is_convertible<_A0, __rv<_A0> >::value, - void - >::type - construct(pointer __p, _A0 __a0) - { - ::new((void*)__p) _Tp(_VSTD::move(__a0)); - } # endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) template _LIBCPP_INLINE_VISIBILITY @@ -1793,39 +1775,21 @@ public: ::new((void*)__p) _Tp(); } # if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) + template _LIBCPP_INLINE_VISIBILITY - typename enable_if - < - !is_convertible<_A0, __rv<_A0> >::value, - void - >::type + void construct(pointer __p, _A0& __a0) { ::new((void*)__p) _Tp(__a0); } template _LIBCPP_INLINE_VISIBILITY - typename enable_if - < - !is_convertible<_A0, __rv<_A0> >::value, - void - >::type + void construct(pointer __p, const _A0& __a0) { ::new((void*)__p) _Tp(__a0); } - template - _LIBCPP_INLINE_VISIBILITY - typename enable_if - < - is_convertible<_A0, __rv<_A0> >::value, - void - >::type - construct(pointer __p, _A0 __a0) - { - ::new((void*)__p) _Tp(_VSTD::move(__a0)); - } # endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) template _LIBCPP_INLINE_VISIBILITY @@ -3086,6 +3050,18 @@ operator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x) return !(nullptr < __x); } +#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template +inline _LIBCPP_INLINE_VISIBILITY +unique_ptr<_Tp, _Dp> +move(unique_ptr<_Tp, _Dp>& __t) +{ + return unique_ptr<_Tp, _Dp>(__rv >(__t)); +} + +#endif + template struct hash; // We use murmur2 when size_t is 32 bits, and cityhash64 when size_t diff --git a/contrib/libc++/include/random b/contrib/libc++/include/random index 02ea9b63011..098332725c8 100644 --- a/contrib/libc++/include/random +++ b/contrib/libc++/include/random @@ -1659,7 +1659,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD template struct __is_seed_sequence { - static const bool value = + static _LIBCPP_CONSTEXPR const bool value = !is_convertible<_Sseq, typename _Engine::result_type>::value && !is_same::type, _Engine>::value; }; @@ -1837,24 +1837,24 @@ public: private: result_type __x_; - static const result_type _Mp = result_type(~0); + static _LIBCPP_CONSTEXPR const result_type _Mp = result_type(~0); static_assert(__m == 0 || __a < __m, "linear_congruential_engine invalid parameters"); static_assert(__m == 0 || __c < __m, "linear_congruential_engine invalid parameters"); public: - static const result_type _Min = __c == 0u ? 1u: 0u; - static const result_type _Max = __m - 1u; + static _LIBCPP_CONSTEXPR const result_type _Min = __c == 0u ? 1u: 0u; + static _LIBCPP_CONSTEXPR const result_type _Max = __m - 1u; static_assert(_Min < _Max, "linear_congruential_engine invalid parameters"); // engine characteristics - static const/*expr*/ result_type multiplier = __a; - static const/*expr*/ result_type increment = __c; - static const/*expr*/ result_type modulus = __m; + static _LIBCPP_CONSTEXPR const result_type multiplier = __a; + static _LIBCPP_CONSTEXPR const result_type increment = __c; + static _LIBCPP_CONSTEXPR const result_type modulus = __m; _LIBCPP_INLINE_VISIBILITY - static const/*expr*/ result_type min() {return _Min;} + static _LIBCPP_CONSTEXPR result_type min() {return _Min;} _LIBCPP_INLINE_VISIBILITY - static const/*expr*/ result_type max() {return _Max;} - static const/*expr*/ result_type default_seed = 1u; + static _LIBCPP_CONSTEXPR result_type max() {return _Max;} + static _LIBCPP_CONSTEXPR const result_type default_seed = 1u; // constructors and seeding functions _LIBCPP_INLINE_VISIBILITY @@ -2074,7 +2074,7 @@ private: static_assert( 0 < __m, "mersenne_twister_engine invalid parameters"); static_assert(__m <= __n, "mersenne_twister_engine invalid parameters"); - static const result_type _Dt = numeric_limits::digits; + static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits::digits; static_assert(__w <= _Dt, "mersenne_twister_engine invalid parameters"); static_assert( 2 <= __w, "mersenne_twister_engine invalid parameters"); static_assert(__r <= __w, "mersenne_twister_engine invalid parameters"); @@ -2083,9 +2083,9 @@ private: static_assert(__t <= __w, "mersenne_twister_engine invalid parameters"); static_assert(__l <= __w, "mersenne_twister_engine invalid parameters"); public: - static const result_type _Min = 0; - static const result_type _Max = __w == _Dt ? result_type(~0) : - (result_type(1) << __w) - result_type(1); + static _LIBCPP_CONSTEXPR const result_type _Min = 0; + static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : + (result_type(1) << __w) - result_type(1); static_assert(_Min < _Max, "mersenne_twister_engine invalid parameters"); static_assert(__a <= _Max, "mersenne_twister_engine invalid parameters"); static_assert(__b <= _Max, "mersenne_twister_engine invalid parameters"); @@ -2094,24 +2094,24 @@ public: static_assert(__f <= _Max, "mersenne_twister_engine invalid parameters"); // engine characteristics - static const/*expr*/ size_t word_size = __w; - static const/*expr*/ size_t state_size = __n; - static const/*expr*/ size_t shift_size = __m; - static const/*expr*/ size_t mask_bits = __r; - static const/*expr*/ result_type xor_mask = __a; - static const/*expr*/ size_t tempering_u = __u; - static const/*expr*/ result_type tempering_d = __d; - static const/*expr*/ size_t tempering_s = __s; - static const/*expr*/ result_type tempering_b = __b; - static const/*expr*/ size_t tempering_t = __t; - static const/*expr*/ result_type tempering_c = __c; - static const/*expr*/ size_t tempering_l = __l; - static const/*expr*/ result_type initialization_multiplier = __f; + static _LIBCPP_CONSTEXPR const size_t word_size = __w; + static _LIBCPP_CONSTEXPR const size_t state_size = __n; + static _LIBCPP_CONSTEXPR const size_t shift_size = __m; + static _LIBCPP_CONSTEXPR const size_t mask_bits = __r; + static _LIBCPP_CONSTEXPR const result_type xor_mask = __a; + static _LIBCPP_CONSTEXPR const size_t tempering_u = __u; + static _LIBCPP_CONSTEXPR const result_type tempering_d = __d; + static _LIBCPP_CONSTEXPR const size_t tempering_s = __s; + static _LIBCPP_CONSTEXPR const result_type tempering_b = __b; + static _LIBCPP_CONSTEXPR const size_t tempering_t = __t; + static _LIBCPP_CONSTEXPR const result_type tempering_c = __c; + static _LIBCPP_CONSTEXPR const size_t tempering_l = __l; + static _LIBCPP_CONSTEXPR const result_type initialization_multiplier = __f; _LIBCPP_INLINE_VISIBILITY - static const/*expr*/ result_type min() { return _Min; } + static _LIBCPP_CONSTEXPR result_type min() { return _Min; } _LIBCPP_INLINE_VISIBILITY - static const/*expr*/ result_type max() { return _Max; } - static const/*expr*/ result_type default_seed = 5489u; + static _LIBCPP_CONSTEXPR result_type max() { return _Max; } + static _LIBCPP_CONSTEXPR const result_type default_seed = 5489u; // constructors and seeding functions _LIBCPP_INLINE_VISIBILITY @@ -2462,26 +2462,26 @@ private: result_type __c_; size_t __i_; - static const result_type _Dt = numeric_limits::digits; + static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits::digits; static_assert( 0 < __w, "subtract_with_carry_engine invalid parameters"); static_assert(__w <= _Dt, "subtract_with_carry_engine invalid parameters"); static_assert( 0 < __s, "subtract_with_carry_engine invalid parameters"); static_assert(__s < __r, "subtract_with_carry_engine invalid parameters"); public: - static const result_type _Min = 0; - static const result_type _Max = __w == _Dt ? result_type(~0) : - (result_type(1) << __w) - result_type(1); + static _LIBCPP_CONSTEXPR const result_type _Min = 0; + static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : + (result_type(1) << __w) - result_type(1); static_assert(_Min < _Max, "subtract_with_carry_engine invalid parameters"); // engine characteristics - static const/*expr*/ size_t word_size = __w; - static const/*expr*/ size_t short_lag = __s; - static const/*expr*/ size_t long_lag = __r; + static _LIBCPP_CONSTEXPR const size_t word_size = __w; + static _LIBCPP_CONSTEXPR const size_t short_lag = __s; + static _LIBCPP_CONSTEXPR const size_t long_lag = __r; _LIBCPP_INLINE_VISIBILITY - static const/*expr*/ result_type min() { return _Min; } + static _LIBCPP_CONSTEXPR result_type min() { return _Min; } _LIBCPP_INLINE_VISIBILITY - static const/*expr*/ result_type max() { return _Max; } - static const/*expr*/ result_type default_seed = 19780503u; + static _LIBCPP_CONSTEXPR result_type max() { return _Max; } + static _LIBCPP_CONSTEXPR const result_type default_seed = 19780503u; // constructors and seeding functions _LIBCPP_INLINE_VISIBILITY @@ -2733,17 +2733,21 @@ public: typedef typename _Engine::result_type result_type; // engine characteristics - static const/*expr*/ size_t block_size = __p; - static const/*expr*/ size_t used_block = __r; + static _LIBCPP_CONSTEXPR const size_t block_size = __p; + static _LIBCPP_CONSTEXPR const size_t used_block = __r; - // Temporary work around for lack of constexpr +#ifdef _LIBCPP_HAS_NO_CONSTEXPR static const result_type _Min = _Engine::_Min; static const result_type _Max = _Engine::_Max; +#else + static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min(); + static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max(); +#endif _LIBCPP_INLINE_VISIBILITY - static const/*expr*/ result_type min() { return _Engine::min(); } + static _LIBCPP_CONSTEXPR result_type min() { return _Engine::min(); } _LIBCPP_INLINE_VISIBILITY - static const/*expr*/ result_type max() { return _Engine::max(); } + static _LIBCPP_CONSTEXPR result_type max() { return _Engine::max(); } // constructors and seeding functions _LIBCPP_INLINE_VISIBILITY @@ -2889,12 +2893,12 @@ class _LIBCPP_VISIBLE independent_bits_engine template class __get_n { - static const size_t _Dt = numeric_limits<_UI>::digits; - static const size_t _Np = _Wp / _Mp + (_Wp % _Mp != 0); - static const size_t _W0 = _Wp / _Np; - static const _UI _Y0 = _W0 >= _Dt ? 0 : (_R0 >> _W0) << _W0; + static _LIBCPP_CONSTEXPR const size_t _Dt = numeric_limits<_UI>::digits; + static _LIBCPP_CONSTEXPR const size_t _Np = _Wp / _Mp + (_Wp % _Mp != 0); + static _LIBCPP_CONSTEXPR const size_t _W0 = _Wp / _Np; + static _LIBCPP_CONSTEXPR const _UI _Y0 = _W0 >= _Dt ? 0 : (_R0 >> _W0) << _W0; public: - static const size_t value = _R0 - _Y0 > _Y0 / _Np ? _Np + 1 : _Np; + static _LIBCPP_CONSTEXPR const size_t value = _R0 - _Y0 > _Y0 / _Np ? _Np + 1 : _Np; }; public: // types @@ -2903,7 +2907,7 @@ public: private: _Engine __e_; - static const result_type _Dt = numeric_limits::digits; + static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits::digits; static_assert( 0 < __w, "independent_bits_engine invalid parameters"); static_assert(__w <= _Dt, "independent_bits_engine invalid parameters"); @@ -2914,36 +2918,40 @@ private: result_type, _Engine_result_type >::type _Working_result_type; - // Temporary work around for lack of constexpr +#ifdef _LIBCPP_HAS_NO_CONSTEXPR static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min - + _Working_result_type(1); - static const size_t __m = __log2<_Working_result_type, _Rp>::value; - static const size_t __n = __get_n<_Working_result_type, _Rp, __w, __m>::value; - static const size_t __w0 = __w / __n; - static const size_t __n0 = __n - __w % __n; - static const size_t _WDt = numeric_limits<_Working_result_type>::digits; - static const size_t _EDt = numeric_limits<_Engine_result_type>::digits; - static const _Working_result_type __y0 = __w0 >= _WDt ? 0 : - (_Rp >> __w0) << __w0; - static const _Working_result_type __y1 = __w0 >= _WDt - 1 ? 0 : - (_Rp >> (__w0+1)) << (__w0+1); - static const _Engine_result_type __mask0 = __w0 > 0 ? + + _Working_result_type(1); +#else + static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min() + + _Working_result_type(1); +#endif + static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value; + static _LIBCPP_CONSTEXPR const size_t __n = __get_n<_Working_result_type, _Rp, __w, __m>::value; + static _LIBCPP_CONSTEXPR const size_t __w0 = __w / __n; + static _LIBCPP_CONSTEXPR const size_t __n0 = __n - __w % __n; + static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits; + static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits; + static _LIBCPP_CONSTEXPR const _Working_result_type __y0 = __w0 >= _WDt ? 0 : + (_Rp >> __w0) << __w0; + static _LIBCPP_CONSTEXPR const _Working_result_type __y1 = __w0 >= _WDt - 1 ? 0 : + (_Rp >> (__w0+1)) << (__w0+1); + static _LIBCPP_CONSTEXPR const _Engine_result_type __mask0 = __w0 > 0 ? _Engine_result_type(~0) >> (_EDt - __w0) : _Engine_result_type(0); - static const _Engine_result_type __mask1 = __w0 < _EDt - 1 ? + static _LIBCPP_CONSTEXPR const _Engine_result_type __mask1 = __w0 < _EDt - 1 ? _Engine_result_type(~0) >> (_EDt - (__w0 + 1)) : _Engine_result_type(~0); public: - static const result_type _Min = 0; - static const result_type _Max = __w == _Dt ? result_type(~0) : - (result_type(1) << __w) - result_type(1); + static _LIBCPP_CONSTEXPR const result_type _Min = 0; + static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : + (result_type(1) << __w) - result_type(1); static_assert(_Min < _Max, "independent_bits_engine invalid parameters"); // engine characteristics _LIBCPP_INLINE_VISIBILITY - static const/*expr*/ result_type min() { return _Min; } + static _LIBCPP_CONSTEXPR result_type min() { return _Min; } _LIBCPP_INLINE_VISIBILITY - static const/*expr*/ result_type max() { return _Max; } + static _LIBCPP_CONSTEXPR result_type max() { return _Max; } // constructors and seeding functions _LIBCPP_INLINE_VISIBILITY @@ -3121,23 +3129,23 @@ operator>>(basic_istream<_CharT, _Traits>& __is, template struct __ugcd { - static const uint64_t value = __ugcd<_Yp, _Xp % _Yp>::value; + static _LIBCPP_CONSTEXPR const uint64_t value = __ugcd<_Yp, _Xp % _Yp>::value; }; template struct __ugcd<_Xp, 0> { - static const uint64_t value = _Xp; + static _LIBCPP_CONSTEXPR const uint64_t value = _Xp; }; template class __uratio { static_assert(_Dp != 0, "__uratio divide by 0"); - static const uint64_t __gcd = __ugcd<_Np, _Dp>::value; + static _LIBCPP_CONSTEXPR const uint64_t __gcd = __ugcd<_Np, _Dp>::value; public: - static const uint64_t num = _Np / __gcd; - static const uint64_t den = _Dp / __gcd; + static _LIBCPP_CONSTEXPR const uint64_t num = _Np / __gcd; + static _LIBCPP_CONSTEXPR const uint64_t den = _Dp / __gcd; typedef __uratio type; }; @@ -3157,17 +3165,22 @@ private: public: // engine characteristics - static const/*expr*/ size_t table_size = __k; + static _LIBCPP_CONSTEXPR const size_t table_size = __k; +#ifdef _LIBCPP_HAS_NO_CONSTEXPR static const result_type _Min = _Engine::_Min; static const result_type _Max = _Engine::_Max; +#else + static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min(); + static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max(); +#endif static_assert(_Min < _Max, "shuffle_order_engine invalid parameters"); _LIBCPP_INLINE_VISIBILITY - static const/*expr*/ result_type min() { return _Min; } + static _LIBCPP_CONSTEXPR result_type min() { return _Min; } _LIBCPP_INLINE_VISIBILITY - static const/*expr*/ result_type max() { return _Max; } + static _LIBCPP_CONSTEXPR result_type max() { return _Max; } - static const unsigned long long _Rp = _Max - _Min + 1ull; + static _LIBCPP_CONSTEXPR const unsigned long long _Rp = _Max - _Min + 1ull; // constructors and seeding functions _LIBCPP_INLINE_VISIBILITY @@ -3370,13 +3383,13 @@ public: typedef unsigned result_type; // generator characteristics - static const result_type _Min = 0; - static const result_type _Max = 0xFFFFFFFFu; + static _LIBCPP_CONSTEXPR const result_type _Min = 0; + static _LIBCPP_CONSTEXPR const result_type _Max = 0xFFFFFFFFu; _LIBCPP_INLINE_VISIBILITY - static constexpr result_type min() { return _Min;} + static _LIBCPP_CONSTEXPR result_type min() { return _Min;} _LIBCPP_INLINE_VISIBILITY - static constexpr result_type max() { return _Max;} + static _LIBCPP_CONSTEXPR result_type max() { return _Max;} // constructors explicit random_device(const string& __token = "/dev/urandom"); @@ -3522,13 +3535,17 @@ generate_canonical(_URNG& __g) { const size_t _Dt = numeric_limits<_RealType>::digits; const size_t __b = _Dt < __bits ? _Dt : __bits; +#ifdef _LIBCPP_HAS_NO_CONSTEXPR const size_t __logR = __log2::value; +#else + const size_t __logR = __log2::value; +#endif const size_t __k = __b / __logR + (__b % __logR != 0) + (__b == 0); - const _RealType _Rp = _URNG::_Max - _URNG::_Min + _RealType(1); + const _RealType _Rp = _URNG::max() - _URNG::min() + _RealType(1); _RealType __base = _Rp; - _RealType _Sp = __g() - _URNG::_Min; + _RealType _Sp = __g() - _URNG::min(); for (size_t __i = 1; __i < __k; ++__i, __base *= _Rp) - _Sp += (__g() - _URNG::_Min) * __base; + _Sp += (__g() - _URNG::min()) * __base; return _Sp / __base; } diff --git a/contrib/libc++/include/system_error b/contrib/libc++/include/system_error index 805c6464883..e9f2b55eac1 100644 --- a/contrib/libc++/include/system_error +++ b/contrib/libc++/include/system_error @@ -366,8 +366,8 @@ class _LIBCPP_VISIBLE error_category public: virtual ~error_category() _NOEXCEPT; -private: error_category() _NOEXCEPT; +private: error_category(const error_category&);// = delete; error_category& operator=(const error_category&);// = delete; diff --git a/contrib/libc++/include/tuple b/contrib/libc++/include/tuple index 2bdb05fbc09..683c9dd5294 100644 --- a/contrib/libc++/include/tuple +++ b/contrib/libc++/include/tuple @@ -552,7 +552,7 @@ public: ) {} template ::type - >::value - >::type + >::value, + bool + >::type = false + > + _LIBCPP_INLINE_VISIBILITY + tuple(_Up&&... __u) + : base_(typename __make_tuple_indices::type(), + typename __make_tuple_types::type(), + typename __make_tuple_indices::type(), + typename __make_tuple_types::type(), + _VSTD::forward<_Up>(__u)...) {} + + template , + typename __make_tuple_types::type + >::value && + !__tuple_convertible + < + tuple<_Up...>, + typename __make_tuple_types::type + >::value, + bool + >::type =false > _LIBCPP_INLINE_VISIBILITY explicit @@ -598,15 +630,29 @@ public: _VSTD::forward<_Up>(__u)...) {} template ::value - >::type + __tuple_convertible<_Tuple, tuple>::value, + bool + >::type = false > _LIBCPP_INLINE_VISIBILITY tuple(_Tuple&& __t) : base_(_VSTD::forward<_Tuple>(__t)) {} + template ::value && + !__tuple_convertible<_Tuple, tuple>::value, + bool + >::type = false + > + _LIBCPP_INLINE_VISIBILITY + explicit + tuple(_Tuple&& __t) + : base_(_VSTD::forward<_Tuple>(__t)) {} + template struct _LIBCPP_VISIBLE integral_constant { - static constexpr _Tp value = __v; + static _LIBCPP_CONSTEXPR const _Tp value = __v; typedef _Tp value_type; typedef integral_constant type; _LIBCPP_INLINE_VISIBILITY -#ifndef _LIBCPP_HAS_NO_CONSTEXPR - constexpr -#endif - operator value_type() -#ifdef _LIBCPP_HAS_NO_CONSTEXPR - const -#endif - {return value;} + _LIBCPP_CONSTEXPR operator value_type() const {return value;} }; template -constexpr _Tp integral_constant<_Tp, __v>::value; +_LIBCPP_CONSTEXPR const _Tp integral_constant<_Tp, __v>::value; typedef integral_constant true_type; typedef integral_constant false_type; @@ -1304,6 +1297,31 @@ forward(typename std::remove_reference<_Tp>::type&& __t) _NOEXCEPT #else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +template +inline _LIBCPP_INLINE_VISIBILITY +_Tp& +move(_Tp& __t) +{ + return __t; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +const _Tp& +move(const _Tp& __t) +{ + return __t; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +_Tp& +forward(typename std::remove_reference<_Tp>::type& __t) _NOEXCEPT +{ + return __t; +} + + template class __rv { @@ -1316,90 +1334,6 @@ public: explicit __rv(_Trr& __t) : t_(__t) {} }; -template -inline _LIBCPP_INLINE_VISIBILITY -typename enable_if -< - !is_convertible<_Tp, __rv<_Tp> >::value, - _Tp& ->::type -move(_Tp& __t) -{ - return __t; -} - -template -inline _LIBCPP_INLINE_VISIBILITY -typename enable_if -< - !is_convertible<_Tp, __rv<_Tp> >::value, - const _Tp& ->::type -move(const _Tp& __t) -{ - return __t; -} - -template -inline _LIBCPP_INLINE_VISIBILITY -typename enable_if -< - is_convertible<_Tp, __rv<_Tp> >::value, - _Tp ->::type -move(_Tp& __t) -{ - return _Tp(__rv<_Tp>(__t)); -} - -template -inline _LIBCPP_INLINE_VISIBILITY -typename enable_if -< - !is_convertible<_Tp, __rv<_Tp> >::value, - typename add_lvalue_reference<_Tp>::type ->::type -forward(_Up& __t) -{ - return __t; -} - -template -inline _LIBCPP_INLINE_VISIBILITY -typename enable_if -< - !is_convertible<_Tp, __rv<_Tp> >::value, - typename add_lvalue_reference<_Tp>::type ->::type -forward(const _Up& __t) -{ - return __t; -} - -template -inline _LIBCPP_INLINE_VISIBILITY -typename enable_if -< - is_convertible<_Tp, __rv<_Tp> >::value, - _Tp ->::type -forward(_Up& __t) -{ - return _Tp(__rv<_Tp>(__t)); -} - -template -inline _LIBCPP_INLINE_VISIBILITY -typename enable_if -< - is_convertible<_Tp, __rv<_Tp> >::value, - _Tp ->::type -forward(const _Up& __t) -{ - return _Tp(__rv<_Tp>(__t)); -} - #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES template diff --git a/contrib/libc++/include/utility b/contrib/libc++/include/utility index 7facea3a649..279d4218882 100644 --- a/contrib/libc++/include/utility +++ b/contrib/libc++/include/utility @@ -206,8 +206,11 @@ move_if_noexcept(_Tp& __x) _NOEXCEPT } struct _LIBCPP_VISIBLE piecewise_construct_t { }; -//constexpr +#if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_UTILITY) extern const piecewise_construct_t piecewise_construct;// = piecewise_construct_t(); +#else +constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t(); +#endif template struct _LIBCPP_VISIBLE pair @@ -221,7 +224,7 @@ struct _LIBCPP_VISIBLE pair // pair(const pair&) = default; // pair(pair&&) = default; - _LIBCPP_INLINE_VISIBILITY pair() : first(), second() {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR pair() : first(), second() {} _LIBCPP_INLINE_VISIBILITY pair(const _T1& __x, const _T2& __y) : first(__x), second(__y) {} diff --git a/contrib/libc++/src/iostream.cpp b/contrib/libc++/src/iostream.cpp index 157c3977d47..bfb1bfb85e3 100644 --- a/contrib/libc++/src/iostream.cpp +++ b/contrib/libc++/src/iostream.cpp @@ -9,45 +9,58 @@ #include "__std_stream" #include "string" +#include "new" _LIBCPP_BEGIN_NAMESPACE_STD -static __stdinbuf __cin(stdin); -static __stdoutbuf __cout(stdout); -static __stdoutbuf __cerr(stderr); -static __stdinbuf __wcin(stdin); -static __stdoutbuf __wcout(stdout); -static __stdoutbuf __wcerr(stderr); +alignas (__stdinbuf ) static char __cin [sizeof(__stdinbuf )]; +alignas (__stdoutbuf) static char __cout[sizeof(__stdoutbuf)]; +alignas (__stdoutbuf) static char __cerr[sizeof(__stdoutbuf)]; +alignas (__stdinbuf ) static char __wcin [sizeof(__stdinbuf )]; +alignas (__stdoutbuf) static char __wcout[sizeof(__stdoutbuf)]; +alignas (__stdoutbuf) static char __wcerr[sizeof(__stdoutbuf)]; -istream cin(&__cin); -ostream cout(&__cout); -ostream cerr(&__cerr); -ostream clog(&__cerr); -wistream wcin(&__wcin); -wostream wcout(&__wcout); -wostream wcerr(&__wcerr); -wostream wclog(&__wcerr); +alignas (istream) char cin [sizeof(istream)]; +alignas (ostream) char cout[sizeof(ostream)]; +alignas (ostream) char cerr[sizeof(ostream)]; +alignas (ostream) char clog[sizeof(ostream)]; +alignas (wistream) char wcin [sizeof(wistream)]; +alignas (wostream) char wcout[sizeof(wostream)]; +alignas (wostream) char wcerr[sizeof(wostream)]; +alignas (wostream) char wclog[sizeof(wostream)]; ios_base::Init __start_std_streams; ios_base::Init::Init() { - cin.tie(&cout); - _VSTD::unitbuf(cerr); - cerr.tie(&cout); + istream* cin_ptr = ::new(cin) istream(::new(__cin) __stdinbuf (stdin) ); + ostream* cout_ptr = ::new(cout) ostream(::new(__cout) __stdoutbuf(stdout)); + ostream* cerr_ptr = ::new(cerr) ostream(::new(__cerr) __stdoutbuf(stderr)); + ::new(clog) ostream(cerr_ptr->rdbuf()); + cin_ptr->tie(cout_ptr); + _VSTD::unitbuf(*cerr_ptr); + cerr_ptr->tie(cout_ptr); - wcin.tie(&wcout); - _VSTD::unitbuf(wcerr); - wcerr.tie(&wcout); + wistream* wcin_ptr = ::new(wcin) wistream(::new(__wcin) __stdinbuf (stdin) ); + wostream* wcout_ptr = ::new(wcout) wostream(::new(__wcout) __stdoutbuf(stdout)); + wostream* wcerr_ptr = ::new(wcerr) wostream(::new(__wcerr) __stdoutbuf(stderr)); + ::new(wclog) wostream(wcerr_ptr->rdbuf()); + wcin_ptr->tie(wcout_ptr); + _VSTD::unitbuf(*wcerr_ptr); + wcerr_ptr->tie(wcout_ptr); } ios_base::Init::~Init() { - cout.flush(); - clog.flush(); + ostream* cout_ptr = (ostream*)cout; + ostream* clog_ptr = (ostream*)clog; + cout_ptr->flush(); + clog_ptr->flush(); - wcout.flush(); - wclog.flush(); + wostream* wcout_ptr = (wostream*)wcout; + wostream* wclog_ptr = (wostream*)wclog; + wcout_ptr->flush(); + wclog_ptr->flush(); } _LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/stdexcept.cpp b/contrib/libc++/src/stdexcept.cpp index b516b0ca68b..9fa4f593137 100644 --- a/contrib/libc++/src/stdexcept.cpp +++ b/contrib/libc++/src/stdexcept.cpp @@ -15,7 +15,11 @@ #include #include #include "system_error" + +// Use to determine whether we're linking against libc++abi. +#if __has_include() #include +#endif // Note: optimize for size diff --git a/contrib/libc++/src/utility.cpp b/contrib/libc++/src/utility.cpp index 7dccffb73e5..e9830e7c24f 100644 --- a/contrib/libc++/src/utility.cpp +++ b/contrib/libc++/src/utility.cpp @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// +#define _LIBCPP_BUILDING_UTILITY #include "utility" _LIBCPP_BEGIN_NAMESPACE_STD diff --git a/contrib/libpcap/CHANGES b/contrib/libpcap/CHANGES index de3ac954f43..3c82052df05 100644 --- a/contrib/libpcap/CHANGES +++ b/contrib/libpcap/CHANGES @@ -1,3 +1,77 @@ +Friday December 9, 2011. guy@alum.mit.edu. +Summary for 1.2.1 libpcap release + Update README file. + Fix typoes in README.linux file. + Clean up some compiler warnings. + Fix Linux compile problems and tests for ethtool.h. + Treat Debian/kFreeBSD and GNU/Hurd as systems with GNU + toolchains. + Support 802.1 QinQ as a form of VLAN in filters. + Treat "carp" as equivalent to "vrrp" in filters. + Fix code generated for "ip6 protochain". + Add some new link-layer header types. + Support capturing NetFilter log messages on Linux. + Clean up some error messages. + Turn off monitor mode on exit for mac80211 interfaces on Linux. + Fix problems turning monitor mode on for non-mac80211 interfaces + on Linux. + Properly fail if /sys/class/net or /proc/net/dev exist but can't + be opened. + Fail if pcap_activate() is called on an already-activated + pcap_t, and add a test program for that. + Fix filtering in pcap-ng files. + Don't build for PowerPC on Mac OS X Lion. + Simplify handling of new DLT_/LINKTYPE_ values. + Expand pcap(3PCAP) man page. + +Sunday July 24, 2011. mcr@sandelman.ca. +Summary for 1.2 libpcap release + All of the changes listed below for 1.1.1 and 1.1.2. + Changes to error handling for pcap_findalldevs(). + Fix the calculation of the frame size in memory-mapped captures. + Add a link-layer header type for STANAG 5066 D_PDUs. + Add a link-layer type for a variant of 3GPP TS 27.010. + Noted real nature of LINKTYPE_ARCNET. + Add a link-layer type for DVB-CI. + Fix configure-script discovery of VLAN acceleration support. + see http://netoptimizer.blogspot.com/2010/09/tcpdump-vs-vlan-tags.html + Linux, HP-UX, AIX, NetBSD and OpenBSD compilation/conflict fixes. + Protect against including AIX 5.x's having been included. + Add DLT_DBUS, for raw D-Bus messages. + Treat either EPERM or EACCES as "no soup for you". + Changes to permissions on DLPI systems. + Add DLT_IEEE802_15_4_NOFCS for 802.15.4 interfaces. + +Fri. August 6, 2010. guy@alum.mit.edu. +Summary for 1.1.2 libpcap release + Return DLT_ values, not raw LINKTYPE_ values from + pcap_datalink() when reading pcap-ng files + Add support for "wlan ra" and "wlan ta", to check the RA and TA + of WLAN frames that have them + Don't crash if "wlan addr{1,2,3,4}" are used without 802.11 + headers + Do filtering on USB and Bluetooth capturing + On FreeBSD/SPARC64, use -fPIC - it's apparently necessary + Check for valid port numbers (fit in a 16-bit unsigned field) in + "port" filters + Reject attempts to put savefiles into non-blocking mode + Check for "no such device" for the "get the media types" ioctl + in *BSD + Improve error messages from bpf_open(), and let it do the error + handling + Return more specific errors from pcap_can_set_rfmon(); fix + documentation + Update description fetching code for FreeBSD, fix code for + OpenBSD + Ignore /sys/net/dev files if we get ENODEV for them, not just + ENXIO; fixes handling of bonding devices on Linux + Fix check for a constant 0 argument to BPF_DIV + Use the right version of ar when cross-building + Free any filter set on a savefile when the savefile is closed + Include the CFLAGS setting when configure was run in the + compiler flags + Add support for 802.15.4 interfaces on Linux + Thu. April 1, 2010. guy@alum.mit.edu. Summary for 1.1.1 libpcap release Update CHANGES to reflect more of the changes in 1.1.0. diff --git a/contrib/libpcap/CREDITS b/contrib/libpcap/CREDITS index 2d7c09e9d0a..68b283fd8d7 100644 --- a/contrib/libpcap/CREDITS +++ b/contrib/libpcap/CREDITS @@ -1,145 +1,154 @@ This file lists people who have contributed to libpcap: The current maintainers: - Bill Fenner - Fulvio Risso - Guy Harris - Hannes Gredler - Michael Richardson + Bill Fenner + Fulvio Risso + Guy Harris + Hannes Gredler + Michael Richardson Additional people who have contributed patches: - Alan Bawden - Albert Chin - Alexander 'Leo' Bergolth - Alexey Kuznetsov - Alon Bar-Lev - Andrew Brown - Antti Kantee - Arien Vijn - Arkadiusz Miskiewicz - Armando L. Caro Jr. - Assar Westerlund - Brian Ginsbach - Charles M. Hannum - Chris G. Demetriou - Chris Lightfoot - Chris Maynard - Chris Pepper - Christian Bell - Christian Peron - Daniele Orlandi - Darren Reed - David Kaelbling - David Young - Dean Gaudet - Don Ebright - Dug Song - Dustin Spicuzza - Eric Anderson - Erik de Castro Lopo - Felix Obenhuber - Florent Drouin - Franz Schaefer - Fulko Hew - Fumiyuki Shimizu - Gianluca Varenni - Gilbert Hoyek - Gisle Vanem - Graeme Hewson - Greg Stark - Greg Troxel - Gregor Maier - Guillaume Pelat - Hagen Paul Pfeifer - Hyung Sik Yoon - Igor Khristophorov - Jan-Philip Velders - Jason R. Thorpe - Javier Achirica - Jean Tourrilhes - Jean-Louis Charton - Jefferson Ogata - Jesper Peterson - Joerg Mayer - John Bankier - Jon Lindgren - Jon Smirl - Juergen Schoenwaelder - Jung-uk Kim - Kazushi Sugyo - Klaus Klein - Koryn Grant - Kris Katterjohn - Krzysztof Halasa - Lorenzo Cavallaro - Loris Degioanni - Love Hörnquist-Ã…strand - Luis Martin Garcia - Maciej W. Rozycki - Marcus Felipe Pereira - Mark C. Brown - Mark Pizzolato - Markus Mayer - Martin Husemann - Márton Németh - Matthew Luckie - Max Laier - Mike Frysinger - Mike Kershaw - Mike Wiacek - Monroe Williams - N. Leiten - Nicolas Dade - Octavian Cerna - Olaf Kirch - Ollie Wild - Onno van der Linden - Paolo Abeni - Patrick Marie - Patrick McHardy - Paul Mundt - Pavel Kankovsky - Pawel Pokrywka - Peter Fales - Peter Jeremy - Peter Volkov - Phil Wood - Rafal Maszkowski - - Richard Stearn - Rick Jones - Robert Edmonds - Roberto Mariani - Romain Francoise - Sagun Shakya - Scott Barron - Scott Gifford - Sebastian Krahmer - Sebastien Roy - Sepherosa Ziehau - Shaun Clowes - Solomon Peachy - Stefan Hudson - Stephen Donnelly - Takashi Yamamoto - Tanaka Shin-ya - Tobias Poschwatta - Tony Li - Torsten Landschoff - Uns Lider - Uwe Girlich - Wesley Shields - Xianjie Zhang - Xin Li - Yen Yen Lim - Yvan Vanhullebus - Yoann Vandoorselaere + Alan Bawden + Albert Chin + Alexander 'Leo' Bergolth + Alexey Kuznetsov + Alon Bar-Lev + Andrew Brown + + Antti Kantee + Arien Vijn + Arkadiusz Miskiewicz + Armando L. Caro Jr. + Assar Westerlund + Brian Ginsbach + Charles M. Hannum + Chris G. Demetriou + Chris Lightfoot + Chris Maynard + Chris Pepper + Christian Bell + Christian Peron + Daniele Orlandi + Darren Reed + David Kaelbling + David Young + Dean Gaudet + Don Ebright + Dug Song + Dustin Spicuzza + Eric Anderson + Erik de Castro Lopo + Felix Obenhuber + Florent Drouin + Franz Schaefer + frederich + Fulko Hew + Fumiyuki Shimizu + Garrett Cooper + Gianluca Varenni + Gilbert Hoyek + Gisle Vanem + Graeme Hewson + Greg Stark + Greg Troxel + Gregor Maier + Guillaume Pelat + Hagen Paul Pfeifer + Henri Doreau + Hyung Sik Yoon + Igor Khristophorov + Jan-Philip Velders + Jason R. Thorpe + Javier Achirica + Jean Tourrilhes + Jean-Louis Charton + Jefferson Ogata + Jesper Dangaard Brouer + Jesper Peterson + Joerg Mayer + John Bankier + Jon Lindgren + Jon Smirl + Juergen Schoenwaelder + Julien Moutinho + Jung-uk Kim + Kazushi Sugyo + Klaus Klein + Koryn Grant + Kris Katterjohn + Krzysztof Halasa + Lorenzo Cavallaro + Loris Degioanni + Love Hörnquist-Ã…strand + Luis MartinGarcia + Maciej W. Rozycki + Marcus Felipe Pereira + Mark C. Brown + Mark Pizzolato + Markus Mayer + Martin Husemann + Márton Németh + Matthew Luckie + Max Laier + Mike Frysinger + Mike Kershaw + Mike Wiacek + Miroslav Lichvar + Monroe Williams + + N. Leiten + Nicolas Dade + Octavian Cerna + Olaf Kirch + Ollie Wild + Onno van der Linden + Paolo Abeni + Patrick Marie + Patrick McHardy + Paul Mundt + Pavel Kankovsky + Pawel Pokrywka + Peter Fales + Peter Jeremy + Peter Volkov + Phil Wood + Rafal Maszkowski + + Richard Stearn + Rick Jones + Robert Edmonds + Roberto Mariani + Romain Francoise + Sagun Shakya + Scott Barron + Scott Gifford + Scott Mcmillan + Sebastian Krahmer + Sebastien Roy + Sepherosa Ziehau + Shaun Clowes + Solomon Peachy + Stefan Hudson + Stephen Donnelly + Takashi Yamamoto + Tanaka Shin-ya + Tobias Poschwatta + Tony Li + Torsten Landschoff + Uns Lider + Uwe Girlich + Wesley Shields + Xianjie Zhang + Xin Li + Yen Yen Lim + Yvan Vanhullebus + Yoann Vandoorselaere The original LBL crew: - Steve McCanne - Craig Leres - Van Jacobson + Steve McCanne + Craig Leres + Van Jacobson Past maintainers: - Jun-ichiro itojun Hagino + Jun-ichiro itojun Hagino diff --git a/contrib/libpcap/Makefile.in b/contrib/libpcap/Makefile.in index f576462d44f..912b7e3d57c 100644 --- a/contrib/libpcap/Makefile.in +++ b/contrib/libpcap/Makefile.in @@ -46,19 +46,21 @@ VPATH = @srcdir@ LD = /usr/bin/ld CC = @CC@ +AR = @AR@ CCOPT = @V_CCOPT@ INCLS = -I. @V_INCLS@ DEFS = @DEFS@ @V_DEFS@ ADDLOBJS = @ADDLOBJS@ ADDLARCHIVEOBJS = @ADDLARCHIVEOBJS@ LIBS = @LIBS@ +CFLAGS = @CFLAGS@ LDFLAGS = @LDFLAGS@ DYEXT = @DYEXT@ V_RPATH_OPT = @V_RPATH_OPT@ PROG=libpcap # Standard CFLAGS -CFLAGS = $(CCOPT) $(INCLS) $(DEFS) +FULL_CFLAGS = $(CCOPT) $(INCLS) $(DEFS) $(CFLAGS) INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -78,9 +80,9 @@ YACC = @V_YACC@ # problem if you don't own the file but can write to the directory. .c.o: @rm -f $@ - $(CC) $(CFLAGS) -c $(srcdir)/$*.c + $(CC) $(FULL_CFLAGS) -c $(srcdir)/$*.c -PSRC = pcap-@V_PCAP@.c @USB_SRC@ @BT_SRC@ @CAN_SRC@ +PSRC = pcap-@V_PCAP@.c @USB_SRC@ @BT_SRC@ @CAN_SRC@ @NETFILTER_SRC@ FSRC = fad-@V_FINDALLDEVS@.c SSRC = @SSRC@ CSRC = pcap.c inet.c gencode.c optimize.c nametoaddr.c etherent.c \ @@ -123,14 +125,29 @@ HDR = $(PUBHDR) \ sf-pcap-ng.h \ sunatmpos.h +TESTS = \ + filtertest \ + findalldevstest \ + nonblocktest \ + opentest \ + selpolltest + +TESTS_SRC = \ + tests/filtertest.c \ + tests/findalldevstest.c \ + tests/nonblocktest.c \ + tests/opentest.c \ + tests/reactivatetest.c \ + tests/selpolltest.c + GENHDR = \ scanner.h tokdefs.h version.h TAGFILES = \ $(SRC) $(HDR) -CLEANFILES = $(OBJ) libpcap.* filtertest findalldevstest selpolltest \ - opentest $(PROG)-`cat $(srcdir)/VERSION`.tar.gz $(GENSRC) $(GENHDR) \ +CLEANFILES = $(OBJ) libpcap.* $(TESTS) \ + $(PROG)-`cat $(srcdir)/VERSION`.tar.gz $(GENSRC) $(GENHDR) \ lex.yy.c pcap-config MAN1 = pcap-config.1 @@ -141,8 +158,10 @@ MAN3PCAP_EXPAND = \ pcap_datalink.3pcap.in \ pcap_dump_open.3pcap.in \ pcap_list_datalinks.3pcap.in \ + pcap_list_tstamp_types.3pcap.in \ pcap_open_dead.3pcap.in \ - pcap_open_offline.3pcap.in + pcap_open_offline.3pcap.in \ + pcap_set_tstamp_type.3pcap.in MAN3PCAP_NOEXPAND = \ pcap_activate.3pcap \ @@ -160,9 +179,7 @@ MAN3PCAP_NOEXPAND = \ pcap_file.3pcap \ pcap_fileno.3pcap \ pcap_findalldevs.3pcap \ - pcap_freealldevs.3pcap \ pcap_freecode.3pcap \ - pcap_free_datalinks.3pcap \ pcap_get_selectable_fd.3pcap \ pcap_geterr.3pcap \ pcap_inject.3pcap \ @@ -187,7 +204,9 @@ MAN3PCAP_NOEXPAND = \ pcap_snapshot.3pcap \ pcap_stats.3pcap \ pcap_statustostr.3pcap \ - pcap_strerror.3pcap + pcap_strerror.3pcap \ + pcap_tstamp_type_name_to_val.3pcap \ + pcap_tstamp_type_val_to_name.3pcap MAN3PCAP = $(MAN3PCAP_NOEXPAND) $(MAN3PCAP_EXPAND:.in=) @@ -196,9 +215,11 @@ MANFILE = \ MANMISC = \ pcap-filter.manmisc.in \ - pcap-linktype.manmisc.in + pcap-linktype.manmisc.in \ + pcap-tstamp.manmisc.in EXTRA_DIST = \ + $(TESTS_SRC) \ CHANGES \ ChmodBPF/ChmodBPF \ ChmodBPF/StartupParameters.plist \ @@ -237,8 +258,6 @@ EXTRA_DIST = \ fad-null.c \ fad-sita.c \ fad-win32.c \ - filtertest.c \ - findalldevstest.c \ grammar.y \ install-sh \ lbl/os-aix4.h \ @@ -263,7 +282,6 @@ EXTRA_DIST = \ msdos/pktdrvr.c \ msdos/pktdrvr.h \ msdos/readme.dos \ - opentest.c \ org.tcpdump.chmod_bpf.plist \ packaging/pcap.spec.in \ pcap-bpf.c \ @@ -282,6 +300,8 @@ EXTRA_DIST = \ pcap-libdlpi.c \ pcap-linux.c \ pcap-namedb.h \ + pcap-netfilter-linux.c \ + pcap-netfilter-linux.h \ pcap-nit.c \ pcap-null.c \ pcap-pf.c \ @@ -299,7 +319,6 @@ EXTRA_DIST = \ pcap-win32.c \ runlex.sh \ scanner.l \ - selpolltest.c \ Win32/Include/Gnuc.h \ Win32/Include/addrinfo.h \ Win32/Include/bittypes.h \ @@ -328,7 +347,7 @@ all: libpcap.a shared pcap-config libpcap.a: $(OBJ) @rm -f $@ - ar rc $@ $(OBJ) $(ADDLARCHIVEOBJS) + $(AR) rc $@ $(OBJ) $(ADDLARCHIVEOBJS) $(RANLIB) $@ shared: libpcap.$(DYEXT) @@ -401,7 +420,7 @@ libpcap.sl: $(OBJ) libpcap.shareda: $(OBJ) @rm -f $@ shr.o $(CC) @V_SHLIB_OPT@ -o shr.o $(OBJ) $(ADDLOBJS) $(LDFLAGS) $(LIBS) - ar rc $@ shr.o + $(AR) rc $@ shr.o # # For platforms that don't support shared libraries (or on which we @@ -414,7 +433,7 @@ scanner.c: $(srcdir)/scanner.l $(srcdir)/runlex.sh $(LEX) -o$@ $< scanner.o: scanner.c tokdefs.h - $(CC) $(CFLAGS) -c scanner.c + $(CC) $(FULL_CFLAGS) -c scanner.c pcap.o: version.h @@ -427,13 +446,13 @@ grammar.c: $(srcdir)/grammar.y grammar.o: grammar.c @rm -f $@ - $(CC) $(CFLAGS) -Dyylval=pcap_lval -c grammar.c + $(CC) $(FULL_CFLAGS) -Dyylval=pcap_lval -c grammar.c version.o: version.c - $(CC) $(CFLAGS) -c version.c + $(CC) $(FULL_CFLAGS) -c version.c snprintf.o: $(srcdir)/missing/snprintf.c - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/snprintf.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/snprintf.c version.c: $(srcdir)/VERSION @rm -f $@ @@ -467,35 +486,47 @@ bpf_filter.c: $(srcdir)/bpf/net/bpf_filter.c ln -s $(srcdir)/bpf/net/bpf_filter.c bpf_filter.c bpf_filter.o: bpf_filter.c - $(CC) $(CFLAGS) -c bpf_filter.c + $(CC) $(FULL_CFLAGS) -c bpf_filter.c # # Generate the pcap-config script. # -pcap-config: $(srcdir)/pcap-config.in +# Some Makes, e.g. AIX Make and Solaris Make, can't handle "--file=$@.tmp:$<"; +# for example, the Solaris 9 make man page says +# +# Because make assigns $< and $* as it would for implicit rules +# (according to the suffixes list and the directory contents), +# they may be unreliable when used within explicit target entries. +# +# and this is an explicit target entry. +# +# Therefore, instead of using $<, we explicitly put in $(srcdir)/pcap-config.in. +# +pcap-config: $(srcdir)/pcap-config.in ./config.status @rm -f $@ $@.tmp - sed -e 's|@includedir[@]|$(includedir)|g' \ - -e 's|@libdir[@]|$(libdir)|g' \ - -e 's|@LIBS[@]|$(LIBS)|g' \ - -e 's|@V_RPATH_OPT[@]|$(V_RPATH_OPT)|g' \ - $(srcdir)/pcap-config.in >$@.tmp + ./config.status --file=$@.tmp:$(srcdir)/pcap-config.in mv $@.tmp $@ chmod a+x $@ # # Test programs - not built by default, and not installed. # -filtertest: filtertest.c libpcap.a - $(CC) $(CFLAGS) -I. -L. -o filtertest $(srcdir)/filtertest.c libpcap.a $(LIBS) +tests: $(TESTS) -findalldevstest: findalldevstest.c libpcap.a - $(CC) $(CFLAGS) -I. -L. -o findalldevstest $(srcdir)/findalldevstest.c libpcap.a $(LIBS) +filtertest: tests/filtertest.c libpcap.a + $(CC) $(FULL_CFLAGS) -I. -L. -o filtertest $(srcdir)/tests/filtertest.c libpcap.a $(LIBS) -selpolltest: selpolltest.c libpcap.a - $(CC) $(CFLAGS) -I. -L. -o selpolltest $(srcdir)/selpolltest.c libpcap.a $(LIBS) +findalldevstest: tests/findalldevstest.c libpcap.a + $(CC) $(FULL_CFLAGS) -I. -L. -o findalldevstest $(srcdir)/tests/findalldevstest.c libpcap.a $(LIBS) -opentest: opentest.c libpcap.a - $(CC) $(CFLAGS) -I. -L. -o opentest $(srcdir)/opentest.c libpcap.a $(LIBS) +nonblocktest: tests/nonblocktest.c libpcap.a + $(CC) $(FULL_CFLAGS) -I. -L. -o nonblocktest $(srcdir)/tests/nonblocktest.c libpcap.a $(LIBS) + +opentest: tests/opentest.c libpcap.a + $(CC) $(FULL_CFLAGS) -I. -L. -o opentest $(srcdir)/tests/opentest.c libpcap.a $(LIBS) + +selpolltest: tests/selpolltest.c libpcap.a + $(CC) $(FULL_CFLAGS) -I. -L. -o selpolltest $(srcdir)/tests/selpolltest.c libpcap.a $(LIBS) install: install-shared install-archive pcap-config [ -d $(DESTDIR)$(libdir) ] || \ @@ -533,12 +564,21 @@ install: install-shared install-archive pcap-config rm -f $(DESTDIR)$(mandir)/man3/pcap_dump_fopen.3pcap ln $(DESTDIR)$(mandir)/man3/pcap_dump_open.3pcap \ $(DESTDIR)$(mandir)/man3/pcap_dump_fopen.3pcap + rm -f $(DESTDIR)$(mandir)/man3/pcap_freealldevs.3pcap + ln $(DESTDIR)$(mandir)/man3/pcap_findalldevs.3pcap \ + $(DESTDIR)$(mandir)/man3/pcap_freealldevs.3pcap rm -f $(DESTDIR)$(mandir)/man3/pcap_perror.3pcap ln $(DESTDIR)$(mandir)/man3/pcap_geterr.3pcap \ $(DESTDIR)$(mandir)/man3/pcap_perror.3pcap rm -f $(DESTDIR)$(mandir)/man3/pcap_sendpacket.3pcap ln $(DESTDIR)$(mandir)/man3/pcap_inject.3pcap \ $(DESTDIR)$(mandir)/man3/pcap_sendpacket.3pcap + rm -f $(DESTDIR)$(mandir)/man3/pcap_free_datalinks.3pcap + ln $(DESTDIR)$(mandir)/man3/pcap_list_datalinks.3pcap \ + $(DESTDIR)$(mandir)/man3/pcap_free_datalinks.3pcap + rm -f $(DESTDIR)$(mandir)/man3/pcap_free_tstamp_types.3pcap + ln $(DESTDIR)$(mandir)/man3/pcap_list_tstamp_types.3pcap \ + $(DESTDIR)$(mandir)/man3/pcap_free_tstamp_types.3pcap rm -f $(DESTDIR)$(mandir)/man3/pcap_dispatch.3pcap ln $(DESTDIR)$(mandir)/man3/pcap_loop.3pcap \ $(DESTDIR)$(mandir)/man3/pcap_dispatch.3pcap @@ -622,8 +662,11 @@ uninstall: uninstall-shared rm -f $(DESTDIR)$(mandir)/man3/$$i; done rm -f $(DESTDIR)$(mandir)/man3/pcap_datalink_val_to_description.3pcap rm -f $(DESTDIR)$(mandir)/man3/pcap_dump_fopen.3pcap + rm -f $(DESTDIR)$(mandir)/man3/pcap_freealldevs.3pcap rm -f $(DESTDIR)$(mandir)/man3/pcap_perror.3pcap rm -f $(DESTDIR)$(mandir)/man3/pcap_sendpacket.3pcap + rm -f $(DESTDIR)$(mandir)/man3/pcap_free_datalinks.3pcap + rm -f $(DESTDIR)$(mandir)/man3/pcap_free_tstamp_types.3pcap rm -f $(DESTDIR)$(mandir)/man3/pcap_dispatch.3pcap rm -f $(DESTDIR)$(mandir)/man3/pcap_minor_version.3pcap rm -f $(DESTDIR)$(mandir)/man3/pcap_next.3pcap @@ -660,7 +703,7 @@ clean: distclean: clean rm -f Makefile config.cache config.log config.status \ - config.h gnuc.h os-proto.h bpf_filter.c pcap-config \ + config.h gnuc.h net os-proto.h bpf_filter.c pcap-config \ stamp-h stamp-h.in rm -f $(MAN3PCAP_EXPAND:.in=) $(MANFILE:.in=) $(MANMISC:.in=) rm -rf autom4te.cache diff --git a/contrib/libpcap/README b/contrib/libpcap/README index 47944d7a72a..a206474aa19 100644 --- a/contrib/libpcap/README +++ b/contrib/libpcap/README @@ -63,13 +63,14 @@ added overhead (especially, for selective filters). Ideally, libpcap would translate BPF filters into a filter program that is compatible with the underlying kernel subsystem, but this is not yet implemented. -BPF is standard in 4.4BSD, BSD/OS, NetBSD, FreeBSD, and OpenBSD. DEC -OSF/1/Digital UNIX/Tru64 UNIX uses the packetfilter interface but has -been extended to accept BPF filters (which libpcap utilizes). Also, you -can add BPF filter support to Ultrix using the kernel source and/or -object patches available in: +BPF is standard in 4.4BSD, BSD/OS, NetBSD, FreeBSD, OpenBSD, DragonFly +BSD, and Mac OS X; an older, modified and undocumented version is +standard in AIX. {DEC OSF/1, Digital UNIX, Tru64 UNIX} uses the +packetfilter interface but has been extended to accept BPF filters +(which libpcap utilizes). Also, you can add BPF filter support to +Ultrix using the kernel source and/or object patches available in: - ftp://gatekeeper.dec.com/pub/DEC/net/bpfext42.tar.Z. + http://www.tcpdump.org/other/bpfext42.tar.Z Linux, in the 2.2 kernel and later kernels, has a "Socket Filter" mechanism that accepts BPF filters; see the README.linux file for diff --git a/contrib/libpcap/VERSION b/contrib/libpcap/VERSION index 524cb55242b..6085e946503 100644 --- a/contrib/libpcap/VERSION +++ b/contrib/libpcap/VERSION @@ -1 +1 @@ -1.1.1 +1.2.1 diff --git a/contrib/libpcap/bpf/net/bpf_filter.c b/contrib/libpcap/bpf/net/bpf_filter.c index f172384fa8c..be0662e2ee3 100644 --- a/contrib/libpcap/bpf/net/bpf_filter.c +++ b/contrib/libpcap/bpf/net/bpf_filter.c @@ -619,7 +619,7 @@ bpf_validate(f, len) /* * Check for constant division by 0. */ - if (BPF_RVAL(p->code) == BPF_K && p->k == 0) + if (BPF_SRC(p->code) == BPF_K && p->k == 0) return 0; break; default: diff --git a/contrib/libpcap/config.h.in b/contrib/libpcap/config.h.in index 55e13dad7af..fb5ae096292 100644 --- a/contrib/libpcap/config.h.in +++ b/contrib/libpcap/config.h.in @@ -18,6 +18,9 @@ /* define if you have streams capable DAG API */ #undef HAVE_DAG_STREAMS_API +/* define if you have vdag_set_device_info() */ +#undef HAVE_DAG_VDAG + /* Define to 1 if you have the declaration of `ether_hostton', and to 0 if you don't. */ #undef HAVE_DECL_ETHER_HOSTTON @@ -52,12 +55,30 @@ /* if libnl exists */ #undef HAVE_LIBNL +/* if libnl exists and is version 2.x */ +#undef HAVE_LIBNL_2_x + /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_COMPILER_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_ETHTOOL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_IF_PACKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_NET_TSTAMP_H + /* if tp_vlan_tci exists */ #undef HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_TYPES_H + /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_USBDEVICE_FS_H @@ -73,6 +94,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IF_ETHER_H +/* Define to 1 if you have the header file. */ +#undef HAVE_NETPACKET_IF_PACKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETPACKET_PACKET_H + /* Define to 1 if you have the header file. */ #undef HAVE_NET_IF_MEDIA_H @@ -217,6 +244,9 @@ /* target host supports CAN sniffing */ #undef PCAP_SUPPORT_CAN +/* target host supports netfilter sniffing */ +#undef PCAP_SUPPORT_NETFILTER + /* target host supports USB sniffing */ #undef PCAP_SUPPORT_USB diff --git a/contrib/libpcap/configure b/contrib/libpcap/configure index 390aba00e5b..e40facff504 100755 --- a/contrib/libpcap/configure +++ b/contrib/libpcap/configure @@ -679,6 +679,7 @@ HAVE_LINUX_TPACKET_AUXDATA V_LEX V_YACC RANLIB +AR V_CCOPT V_DEFS V_FINDALLDEVS @@ -696,6 +697,8 @@ MAN_FILE_FORMATS MAN_MISC_INFO PCAP_SUPPORT_USB USB_SRC +PCAP_SUPPORT_NETFILTER +NETFILTER_SRC PCAP_SUPPORT_BT BT_SRC PCAP_SUPPORT_CAN @@ -1293,6 +1296,7 @@ Optional Features: getaddrinfo available] --enable-optimizer-dbg build optimizer debugging code --enable-yydebug build parser debugging code + --disable-universal don't build universal on OS X --enable-bluetooth enable Bluetooth support [default=yes, if support available] --enable-can enable CAN support [default=yes, if support @@ -3229,7 +3233,24 @@ _ACEOF # or accepts command-line arguments like # those the GNU linker accepts. # - V_CCOPT="$V_CCOPT -fpic" + # Some instruction sets require -fPIC on some + # operating systems. Check for them. If you + # have a combination that requires it, add it + # here. + # + PIC_OPT=-fpic + case "$host_cpu" in + + sparc64*) + case "$host_os" in + + freebsd*) + PIC_OPT=-fPIC + ;; + esac + ;; + esac + V_CCOPT="$V_CCOPT $PIC_OPT" V_SONAME_OPT="-Wl,-soname," V_RPATH_OPT="-Wl,-rpath," ;; @@ -5425,6 +5446,288 @@ fi done +for ac_header in linux/types.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + +for ac_header in linux/if_packet.h netpacket/packet.h netpacket/if_packet.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + for ac_header in net/pfvar.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` @@ -7214,37 +7517,6 @@ _ACEOF ;; linux) - { echo "$as_me:$LINENO: checking Linux kernel version" >&5 -echo $ECHO_N "checking Linux kernel version... $ECHO_C" >&6; } - if test "$cross_compiling" = yes; then - if test "${ac_cv_linux_vers+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_linux_vers=unknown -fi - - else - if test "${ac_cv_linux_vers+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_linux_vers=`uname -r 2>&1 | \ - sed -n -e '$s/.* //' -e '$s/\..*//p'` -fi - - fi - { echo "$as_me:$LINENO: result: $ac_cv_linux_vers" >&5 -echo "${ECHO_T}$ac_cv_linux_vers" >&6; } - if test $ac_cv_linux_vers = unknown ; then - { { echo "$as_me:$LINENO: error: cannot determine linux version when cross-compiling" >&5 -echo "$as_me: error: cannot determine linux version when cross-compiling" >&2;} - { (exit 1); exit 1; }; } - fi - if test $ac_cv_linux_vers -lt 2 ; then - { { echo "$as_me:$LINENO: error: version 2 or higher required; see the INSTALL doc for more info" >&5 -echo "$as_me: error: version 2 or higher required; see the INSTALL doc for more info" >&2;} - { (exit 1); exit 1; }; } - fi - # # Do we have the wireless extensions? # @@ -7322,7 +7594,93 @@ fi if test x$with_libnl != xno ; then - { echo "$as_me:$LINENO: checking for nl_handle_alloc in -lnl" >&5 + # + # Try libnl 2.x first. + # + { echo "$as_me:$LINENO: checking for nl_socket_alloc in -lnl" >&5 +echo $ECHO_N "checking for nl_socket_alloc in -lnl... $ECHO_C" >&6; } +if test "${ac_cv_lib_nl_nl_socket_alloc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char nl_socket_alloc (); +int +main () +{ +return nl_socket_alloc (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_nl_nl_socket_alloc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_nl_nl_socket_alloc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_nl_nl_socket_alloc" >&5 +echo "${ECHO_T}$ac_cv_lib_nl_nl_socket_alloc" >&6; } +if test $ac_cv_lib_nl_nl_socket_alloc = yes; then + + # + # Yes, we have libnl 2.x. + # + LIBS="-lnl-genl -lnl $LIBS" + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBNL 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBNL_2_x 1 +_ACEOF + + +else + + # + # No, we don't; do we have libnl 1.x? + # + { echo "$as_me:$LINENO: checking for nl_handle_alloc in -lnl" >&5 echo $ECHO_N "checking for nl_handle_alloc in -lnl... $ECHO_C" >&6; } if test "${ac_cv_lib_nl_nl_handle_alloc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -7384,23 +7742,96 @@ fi { echo "$as_me:$LINENO: result: $ac_cv_lib_nl_nl_handle_alloc" >&5 echo "${ECHO_T}$ac_cv_lib_nl_nl_handle_alloc" >&6; } if test $ac_cv_lib_nl_nl_handle_alloc = yes; then - LIBS="-lnl $LIBS" + + # + # Yes. + # + LIBS="-lnl $LIBS" cat >>confdefs.h <<\_ACEOF #define HAVE_LIBNL 1 _ACEOF + else - if test x$with_libnl = xyes ; then - { { echo "$as_me:$LINENO: error: libnl support requested but libnl not found" >&5 + + # + # No, we don't have libnl at all. + # + if test x$with_libnl = xyes ; then + { { echo "$as_me:$LINENO: error: libnl support requested but libnl not found" >&5 echo "$as_me: error: libnl support requested but libnl not found" >&2;} { (exit 1); exit 1; }; } - fi + fi + +fi + fi fi + +for ac_header in linux/ethtool.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +$ac_includes_default +#include + + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + { echo "$as_me:$LINENO: checking if if_packet.h has tpacket_stats defined" >&5 echo $ECHO_N "checking if if_packet.h has tpacket_stats defined... $ECHO_C" >&6; } if test "${ac_cv_lbl_tpacket_stats+set}" = set; then @@ -7461,7 +7892,7 @@ _ACEOF fi { echo "$as_me:$LINENO: checking if tpacket_auxdata struct has tp_vlan_tci member" >&5 echo $ECHO_N "checking if tpacket_auxdata struct has tp_vlan_tci member... $ECHO_C" >&6; } - if test "${ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1+set}" = set; then + if test "${ac_cv_lbl_linux_tpacket_auxdata_tp_vlan_tci+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -7471,6 +7902,7 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ +# include # include int main () @@ -8602,7 +9034,7 @@ echo $ECHO_N "checking whether we have DAG API headers... $ECHO_C" >&6; } if test -z "$dag_tools_dir"; then dag_tools_dir="$dag_root/tools" - fi + fi if test -r $dag_include_dir/dagapi.h; then ac_cv_lbl_dag_api=yes @@ -8611,143 +9043,9 @@ echo $ECHO_N "checking whether we have DAG API headers... $ECHO_C" >&6; } echo "${ECHO_T}$ac_cv_lbl_dag_api ($dag_include_dir)" >&6; } fi -if test $ac_cv_lbl_dag_api = yes; then - - { echo "$as_me:$LINENO: checking dagapi.o" >&5 -echo $ECHO_N "checking dagapi.o... $ECHO_C" >&6; } - dagapi_obj=no - if test -r $dag_tools_dir/dagapi.o; then - # 2.4.x. - dagapi_obj=$dag_tools_dir/dagapi.o - elif test -r $dag_lib_dir/dagapi.o; then - # 2.5.x. - dagapi_obj=$dag_lib_dir/dagapi.o - elif test -r $dag_lib_dir/libdag.a; then - # 2.5.x. - ar x $dag_lib_dir/libdag.a dagapi.o 2>/dev/null - if test -r ./dagapi.o; then - dagapi_obj=./dagapi.o - else - ar x $dag_lib_dir/libdag.a libdag_la-dagapi.o 2>/dev/null - if test -r ./libdag_la-dagapi.o; then - dagapi_obj=./libdag_la-dagapi.o - fi - fi - fi - - if test $dagapi_obj = no; then - { echo "$as_me:$LINENO: result: no (checked $dag_lib_dir $dag_tools_dir $dag_lib_dir/libdag.a)" >&5 -echo "${ECHO_T}no (checked $dag_lib_dir $dag_tools_dir $dag_lib_dir/libdag.a)" >&6; } - ac_cv_lbl_dag_api=no - else - { echo "$as_me:$LINENO: result: yes ($dagapi_obj)" >&5 -echo "${ECHO_T}yes ($dagapi_obj)" >&6; } - fi -fi - -if test $ac_cv_lbl_dag_api = yes; then - - { echo "$as_me:$LINENO: checking dagopts.o" >&5 -echo $ECHO_N "checking dagopts.o... $ECHO_C" >&6; } - dagopts_obj=no - if test -r $dag_tools_dir/dagopts.o; then - # 2.4.x. - dagopts_obj=$dag_tools_dir/dagopts.o - elif test -r $dag_lib_dir/dagopts.o; then - # 2.5.x. - dagopts_obj=$dag_lib_dir/dagopts.o - elif test -r $dag_lib_dir/libdag.a; then - # 2.5.x. - ar x $dag_lib_dir/libdag.a dagopts.o 2>/dev/null - if test -r ./dagopts.o; then - dagopts_obj=./dagopts.o - else - ar x $dag_lib_dir/libdag.a libdag_la-dagopts.o 2>/dev/null - if test -r ./libdag_la-dagopts.o; then - dagopts_obj=./libdag_la-dagopts.o - fi - fi - fi - - if test $dagopts_obj = no; then - { echo "$as_me:$LINENO: result: no (checked $dag_lib_dir $dag_tools_dir $dag_lib_dir/libdag.a)" >&5 -echo "${ECHO_T}no (checked $dag_lib_dir $dag_tools_dir $dag_lib_dir/libdag.a)" >&6; } - ac_cv_lbl_dag_api=no - else - { echo "$as_me:$LINENO: result: yes ($dagopts_obj)" >&5 -echo "${ECHO_T}yes ($dagopts_obj)" >&6; } - fi -fi - -if test $ac_cv_lbl_dag_api = yes; then - # Under 2.5.x only we need to add dagreg.o. - if test -r $dag_include_dir/dagreg.h; then - { echo "$as_me:$LINENO: checking dagreg.o" >&5 -echo $ECHO_N "checking dagreg.o... $ECHO_C" >&6; } - dagreg_obj=no - if test -r $dag_lib_dir/dagreg.o; then - # Object file is ready and waiting. - dagreg_obj=$dag_lib_dir/dagreg.o - elif test -r $dag_lib_dir/libdag.a; then - # Extract from libdag.a. - ar x $dag_lib_dir/libdag.a dagreg.o 2>/dev/null - if test -r ./dagreg.o; then - dagreg_obj=./dagreg.o - else - ar x $dag_lib_dir/libdag.a libdag_la-dagreg.o 2>/dev/null - if test -r ./libdag_la-dagreg.o; then - dagreg_obj=./libdag_la-dagreg.o - fi - fi - fi - - if test $dagreg_obj = no; then - { echo "$as_me:$LINENO: result: no (checked $dag_lib_dir $dag_lib_dir/libdag.a)" >&5 -echo "${ECHO_T}no (checked $dag_lib_dir $dag_lib_dir/libdag.a)" >&6; } - ac_cv_lbl_dag_api=no - else - { echo "$as_me:$LINENO: result: yes ($dagreg_obj)" >&5 -echo "${ECHO_T}yes ($dagreg_obj)" >&6; } - fi - fi -fi - -if test $ac_cv_lbl_dag_api = yes; then - # Under 2.5.x only we need to add dagutil.o. - if test -r $dag_include_dir/dagutil.h; then - { echo "$as_me:$LINENO: checking dagutil.o" >&5 -echo $ECHO_N "checking dagutil.o... $ECHO_C" >&6; } - dagutil_obj=no - if test -r $dag_lib_dir/dagutil.o; then - # Object file is ready and waiting. - dagutil_obj=$dag_lib_dir/dagutil.o - elif test -r $dag_lib_dir/libdag.a; then - # Extract from libdag.a. - ar x $dag_lib_dir/libdag.a dagutil.o 2>/dev/null - if test -r ./dagutil.o; then - dagutil_obj=./dagutil.o - else - ar x $dag_lib_dir/libdag.a libdag_la-dagutil.o 2>/dev/null - if test -r ./libdag_la-dagutil.o; then - dagutil_obj=./libdag_la-dagutil.o - fi - fi - fi - - if test $dagutil_obj = no; then - { echo "$as_me:$LINENO: result: no (checked $dag_lib_dir $dag_lib_dir/libdag.a)" >&5 -echo "${ECHO_T}no (checked $dag_lib_dir $dag_lib_dir/libdag.a)" >&6; } - ac_cv_lbl_dag_api=no - else - { echo "$as_me:$LINENO: result: yes ($dagutil_obj)" >&5 -echo "${ECHO_T}yes ($dagutil_obj)" >&6; } - fi - fi -fi - if test $ac_cv_lbl_dag_api = yes; then V_INCLS="$V_INCLS -I$dag_include_dir" - ADDLARCHIVEOBJS="$ADDLARCHIVEOBJS $dagapi_obj $dagopts_obj $dagreg_obj $dagutil_obj" + if test $V_PCAP != dag ; then SSRC="pcap-dag.c" fi @@ -8964,6 +9262,7 @@ _ACEOF fi + LDFLAGS=$saved_ldflags if test "$dag_streams" = 1; then @@ -8973,6 +9272,83 @@ cat >>confdefs.h <<\_ACEOF _ACEOF LIBS="$LIBS -ldag" + LDFLAGS="$LDFLAGS -L$dag_lib_dir" + + { echo "$as_me:$LINENO: checking for vdag_set_device_info in -lvdag" >&5 +echo $ECHO_N "checking for vdag_set_device_info in -lvdag... $ECHO_C" >&6; } +if test "${ac_cv_lib_vdag_vdag_set_device_info+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lvdag $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char vdag_set_device_info (); +int +main () +{ +return vdag_set_device_info (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_vdag_vdag_set_device_info=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_vdag_vdag_set_device_info=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_vdag_vdag_set_device_info" >&5 +echo "${ECHO_T}$ac_cv_lib_vdag_vdag_set_device_info" >&6; } +if test $ac_cv_lib_vdag_vdag_set_device_info = yes; then + ac_dag_have_vdag="1" +else + ac_dag_have_vdag="0" +fi + + if test "$ac_dag_have_vdag" = 1; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_DAG_VDAG 1 +_ACEOF + + LIBS="$LIBS -lpthread" + fi fi @@ -9540,6 +9916,49 @@ echo "${ECHO_T}yes" >&6; } darwin*) DYEXT="dylib" V_CCOPT="$V_CCOPT -fno-common" + # Check whether --enable-universal was given. +if test "${enable_universal+set}" = set; then + enableval=$enable_universal; +fi + + if test "$enable_universal" != "no"; then + case "$host_os" in + + darwin9.*) + # + # Leopard. Build for 32-bit PowerPC, 64-bit + # PowerPC, x86, and x86-64, with 32-bit PowerPC + # first. (That's what Apple does.) + # + V_CCOPT="$V_CCOPT -arch ppc -arch ppc64 -arch i386 -arch x86_64" + LDFLAGS="$LDFLAGS -arch ppc -arch ppc64 -arch i386 -arch x86_64" + ;; + + darwin10.*) + # + # Snow Leopard. Build for x86-64, x86, and + # 32-bit PowerPC, with x86-64 first. (That's + # what Apple does, even though Snow Leopard + # doesn't run on PPC, so PPC libpcap runs under + # Rosetta, and Rosetta doesn't support BPF + # ioctls, so PPC programs can't do live + # captures.) + # + V_CCOPT="$V_CCOPT -arch x86_64 -arch i386 -arch ppc" + LDFLAGS="$LDFLAGS -arch x86_64 -arch i386 -arch ppc" + ;; + + darwin11.*) + # + # Lion. Build for x86-64 and x86, with x86-64 + # first. (That's probably what Apple does, + # given that Rosetta is gone.) + # + V_CCOPT="$V_CCOPT -arch x86_64 -arch i386" + LDFLAGS="$LDFLAGS -arch x86_64 -arch i386" + ;; + esac + fi ;; hpux9*) @@ -9607,7 +10026,7 @@ irix*) MAN_MISC_INFO=5 ;; -linux*|freebsd*|netbsd*|openbsd*|dragonfly*) +linux*|freebsd*|netbsd*|openbsd*|dragonfly*|kfreebsd*|gnu*) DYEXT="so" # @@ -9801,6 +10220,102 @@ else RANLIB="$ac_cv_prog_RANLIB" fi +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + rm -f os-proto.h if test "${LBL_CFLAGS+set}" = set; then @@ -10161,20 +10676,227 @@ cat >>confdefs.h <<\_ACEOF #define PCAP_SUPPORT_USB 1 _ACEOF - USB_SRC=pcap-usb-linux.c - { echo "$as_me:$LINENO: result: yes" >&5 + USB_SRC=pcap-usb-linux.c + { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } - ac_usb_dev_name=`udevinfo -q name -p /sys/class/usb_device/usbmon 2>/dev/null` - if test $? -ne 0 ; then - ac_usb_dev_name="usbmon" - fi + ac_usb_dev_name=`udevinfo -q name -p /sys/class/usb_device/usbmon 2>/dev/null` + if test $? -ne 0 ; then + ac_usb_dev_name="usbmon" + fi cat >>confdefs.h <<_ACEOF #define LINUX_USB_MON_DEV "/dev/$ac_usb_dev_name" _ACEOF - { echo "$as_me:$LINENO: Device for USB sniffing is /dev/$ac_usb_dev_name" >&5 + { echo "$as_me:$LINENO: Device for USB sniffing is /dev/$ac_usb_dev_name" >&5 echo "$as_me: Device for USB sniffing is /dev/$ac_usb_dev_name" >&6;} + # + # Do we have a version of available? + # If so, we might need it for . + # + +for ac_header in linux/compiler.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + if test "$ac_cv_header_linux_compiler_h" = yes; then + # + # Yes - include it when testing for . + # + +for ac_header in linux/usbdevice_fs.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + else for ac_header in linux/usbdevice_fs.h do @@ -10315,16 +11037,17 @@ fi done - if test "$ac_cv_header_linux_usbdevice_fs_h" = yes; then - # - # OK, does it define bRequestType? Older versions of the kernel - # define fields with names like "requesttype, "request", and - # "value", rather than "bRequestType", "bRequest", and - # "wValue". - # - { echo "$as_me:$LINENO: checking if usbdevfs_ctrltransfer struct has bRequestType member" >&5 + fi + if test "$ac_cv_header_linux_usbdevice_fs_h" = yes; then + # + # OK, does it define bRequestType? Older versions of the kernel + # define fields with names like "requesttype, "request", and + # "value", rather than "bRequestType", "bRequest", and + # "wValue". + # + { echo "$as_me:$LINENO: checking if usbdevfs_ctrltransfer struct has bRequestType member" >&5 echo $ECHO_N "checking if usbdevfs_ctrltransfer struct has bRequestType member... $ECHO_C" >&6; } - if test "${ac_cv_usbdevfs_ctrltransfer_has_bRequestType+set}" = set; then + if test "${ac_cv_usbdevfs_ctrltransfer_has_bRequestType+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -10338,7 +11061,10 @@ $ac_includes_default #ifdef HAVE_SYS_BITYPES_H #include #endif -# include +#ifdef HAVE_LINUX_COMPILER_H +#include +#endif +#include int main () { @@ -10375,21 +11101,109 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - { echo "$as_me:$LINENO: result: $ac_cv_usbdevfs_ctrltransfer_has_bRequestType" >&5 + { echo "$as_me:$LINENO: result: $ac_cv_usbdevfs_ctrltransfer_has_bRequestType" >&5 echo "${ECHO_T}$ac_cv_usbdevfs_ctrltransfer_has_bRequestType" >&6; } - if test $ac_cv_usbdevfs_ctrltransfer_has_bRequestType = yes ; then + if test $ac_cv_usbdevfs_ctrltransfer_has_bRequestType = yes ; then cat >>confdefs.h <<\_ACEOF #define HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE 1 _ACEOF - fi - fi - ;; + fi + fi + ;; *) - { echo "$as_me:$LINENO: result: no" >&5 + { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } - ;; + ;; +esac + + + +{ echo "$as_me:$LINENO: checking whether the platform could support netfilter sniffing" >&5 +echo $ECHO_N "checking whether the platform could support netfilter sniffing... $ECHO_C" >&6; } +case "$host_os" in +linux*) + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + # + # Life's too short to deal with trying to get this to compile + # if you don't get the right types defined with + # __KERNEL_STRICT_NAMES getting defined by some other include. + # + # Check whether the includes Just Work. If not, don't turn on + # netfilter support. + # + { echo "$as_me:$LINENO: checking whether we can compile the netfilter support" >&5 +echo $ECHO_N "checking whether we can compile the netfilter support... $ECHO_C" >&6; } + if test "${ac_cv_netfilter_can_compile+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +$ac_includes_default +#include +#include + +#include +#include +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_netfilter_can_compile=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_netfilter_can_compile=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + { echo "$as_me:$LINENO: result: $ac_cv_netfilter_can_compile" >&5 +echo "${ECHO_T}$ac_cv_netfilter_can_compile" >&6; } + if test $ac_cv_netfilter_can_compile = yes ; then + +cat >>confdefs.h <<\_ACEOF +#define PCAP_SUPPORT_NETFILTER 1 +_ACEOF + + NETFILTER_SRC=pcap-netfilter-linux.c + fi + ;; +*) + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + ;; esac @@ -10405,7 +11219,7 @@ fi if test "x$enable_bluetooth" != "xno" ; then case "$host_os" in linux*) - if test "${ac_cv_header_bluetooth_bluetooth_h+set}" = set; then + if test "${ac_cv_header_bluetooth_bluetooth_h+set}" = set; then { echo "$as_me:$LINENO: checking for bluetooth/bluetooth.h" >&5 echo $ECHO_N "checking for bluetooth/bluetooth.h... $ECHO_C" >&6; } if test "${ac_cv_header_bluetooth_bluetooth_h+set}" = set; then @@ -10537,8 +11351,8 @@ cat >>confdefs.h <<\_ACEOF #define PCAP_SUPPORT_BT 1 _ACEOF - BT_SRC=pcap-bt-linux.c - { echo "$as_me:$LINENO: Bluetooth sniffing is supported" >&5 + BT_SRC=pcap-bt-linux.c + { echo "$as_me:$LINENO: Bluetooth sniffing is supported" >&5 echo "$as_me: Bluetooth sniffing is supported" >&6;} else @@ -10548,11 +11362,11 @@ echo "$as_me: Bluetooth sniffing is not supported; install bluez-lib devel to en fi - ;; + ;; *) - { echo "$as_me:$LINENO: no Bluetooth sniffing support implemented for $host_os" >&5 + { echo "$as_me:$LINENO: no Bluetooth sniffing support implemented for $host_os" >&5 echo "$as_me: no Bluetooth sniffing support implemented for $host_os" >&6;} - ;; + ;; esac @@ -10639,6 +11453,155 @@ echo "$as_me: no CAN sniffing support implemented for $host_os" >&6;} fi +case "$host_os" in +linux*) + +for ac_header in linux/net_tstamp.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + ;; +*) + { echo "$as_me:$LINENO: no hardware timestamp support implemented for $host_os" >&5 +echo "$as_me: no hardware timestamp support implemented for $host_os" >&6;} + ;; +esac + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: @@ -10723,7 +11686,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_config_headers="$ac_config_headers config.h" -ac_config_files="$ac_config_files Makefile pcap-filter.manmisc pcap-linktype.manmisc pcap-savefile.manfile pcap.3pcap pcap_compile.3pcap pcap_datalink.3pcap pcap_dump_open.3pcap pcap_list_datalinks.3pcap pcap_open_dead.3pcap pcap_open_offline.3pcap" +ac_config_files="$ac_config_files Makefile pcap-filter.manmisc pcap-linktype.manmisc pcap-tstamp.manmisc pcap-savefile.manfile pcap.3pcap pcap_compile.3pcap pcap_datalink.3pcap pcap_dump_open.3pcap pcap_list_datalinks.3pcap pcap_list_tstamp_types.3pcap pcap_open_dead.3pcap pcap_open_offline.3pcap pcap_set_tstamp_type.3pcap" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -11282,14 +12245,17 @@ do "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "pcap-filter.manmisc") CONFIG_FILES="$CONFIG_FILES pcap-filter.manmisc" ;; "pcap-linktype.manmisc") CONFIG_FILES="$CONFIG_FILES pcap-linktype.manmisc" ;; + "pcap-tstamp.manmisc") CONFIG_FILES="$CONFIG_FILES pcap-tstamp.manmisc" ;; "pcap-savefile.manfile") CONFIG_FILES="$CONFIG_FILES pcap-savefile.manfile" ;; "pcap.3pcap") CONFIG_FILES="$CONFIG_FILES pcap.3pcap" ;; "pcap_compile.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_compile.3pcap" ;; "pcap_datalink.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_datalink.3pcap" ;; "pcap_dump_open.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_dump_open.3pcap" ;; "pcap_list_datalinks.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_list_datalinks.3pcap" ;; + "pcap_list_tstamp_types.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_list_tstamp_types.3pcap" ;; "pcap_open_dead.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_open_dead.3pcap" ;; "pcap_open_offline.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_open_offline.3pcap" ;; + "pcap_set_tstamp_type.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_set_tstamp_type.3pcap" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} @@ -11416,6 +12382,7 @@ HAVE_LINUX_TPACKET_AUXDATA!$HAVE_LINUX_TPACKET_AUXDATA$ac_delim V_LEX!$V_LEX$ac_delim V_YACC!$V_YACC$ac_delim RANLIB!$RANLIB$ac_delim +AR!$AR$ac_delim V_CCOPT!$V_CCOPT$ac_delim V_DEFS!$V_DEFS$ac_delim V_FINDALLDEVS!$V_FINDALLDEVS$ac_delim @@ -11433,6 +12400,8 @@ MAN_FILE_FORMATS!$MAN_FILE_FORMATS$ac_delim MAN_MISC_INFO!$MAN_MISC_INFO$ac_delim PCAP_SUPPORT_USB!$PCAP_SUPPORT_USB$ac_delim USB_SRC!$USB_SRC$ac_delim +PCAP_SUPPORT_NETFILTER!$PCAP_SUPPORT_NETFILTER$ac_delim +NETFILTER_SRC!$NETFILTER_SRC$ac_delim PCAP_SUPPORT_BT!$PCAP_SUPPORT_BT$ac_delim BT_SRC!$BT_SRC$ac_delim PCAP_SUPPORT_CAN!$PCAP_SUPPORT_CAN$ac_delim @@ -11443,7 +12412,7 @@ INSTALL_DATA!$INSTALL_DATA$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 90; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 93; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 diff --git a/contrib/libpcap/configure.in b/contrib/libpcap/configure.in index 794da275805..6a146cad996 100755 --- a/contrib/libpcap/configure.in +++ b/contrib/libpcap/configure.in @@ -103,6 +103,8 @@ dnl and set "HAVE_SYS_IOCCOM_H" if we have it, otherwise dnl "AC_LBL_FIXINCLUDES" wouldn't work on some platforms such as Solaris. dnl AC_CHECK_HEADERS(sys/ioccom.h sys/sockio.h limits.h paths.h) +AC_CHECK_HEADERS(linux/types.h) +AC_CHECK_HEADERS(linux/if_packet.h netpacket/packet.h netpacket/if_packet.h) AC_CHECK_HEADERS(net/pfvar.h, , , [#include #include #include ]) @@ -152,7 +154,7 @@ needsnprintf=no AC_CHECK_FUNCS(vsnprintf snprintf,, [needsnprintf=yes]) if test $needsnprintf = yes; then - AC_LIBOBJ(snprintf) + AC_LIBOBJ([snprintf]) fi # @@ -410,23 +412,6 @@ dlpi) ;; linux) - AC_MSG_CHECKING(Linux kernel version) - if test "$cross_compiling" = yes; then - AC_CACHE_VAL(ac_cv_linux_vers, - ac_cv_linux_vers=unknown) - else - AC_CACHE_VAL(ac_cv_linux_vers, - ac_cv_linux_vers=`uname -r 2>&1 | \ - sed -n -e '$s/.* //' -e '$s/\..*//p'`) - fi - AC_MSG_RESULT($ac_cv_linux_vers) - if test $ac_cv_linux_vers = unknown ; then - AC_MSG_ERROR(cannot determine linux version when cross-compiling) - fi - if test $ac_cv_linux_vers -lt 2 ; then - AC_MSG_ERROR(version 2 or higher required; see the INSTALL doc for more info) - fi - # # Do we have the wireless extensions? # @@ -445,15 +430,46 @@ linux) with_libnl=$withval,,) if test x$with_libnl != xno ; then - AC_CHECK_LIB(nl, nl_handle_alloc, - LIBS="-lnl $LIBS" - AC_DEFINE(HAVE_LIBNL,1,[if libnl exists]), - if test x$with_libnl = xyes ; then - AC_MSG_ERROR([libnl support requested but libnl not found]) - fi - ) + # + # Try libnl 2.x first. + # + AC_CHECK_LIB(nl, nl_socket_alloc, + [ + # + # Yes, we have libnl 2.x. + # + LIBS="-lnl-genl -lnl $LIBS" + AC_DEFINE(HAVE_LIBNL,1,[if libnl exists]) + AC_DEFINE(HAVE_LIBNL_2_x,1,[if libnl exists and is version 2.x]) + ], + [ + # + # No, we don't; do we have libnl 1.x? + # + AC_CHECK_LIB(nl, nl_handle_alloc, + [ + # + # Yes. + # + LIBS="-lnl $LIBS" + AC_DEFINE(HAVE_LIBNL,1,[if libnl exists]) + ], + [ + # + # No, we don't have libnl at all. + # + if test x$with_libnl = xyes ; then + AC_MSG_ERROR([libnl support requested but libnl not found]) + fi + ]) + ]) fi + AC_CHECK_HEADERS(linux/ethtool.h,,, + [ +AC_INCLUDES_DEFAULT +#include + ]) AC_LBL_TPACKET_STATS AC_LBL_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI ;; @@ -727,7 +743,7 @@ if test "$want_dag" != no; then if test -z "$dag_tools_dir"; then dag_tools_dir="$dag_root/tools" - fi + fi if test -r $dag_include_dir/dagapi.h; then ac_cv_lbl_dag_api=yes @@ -735,131 +751,9 @@ if test "$want_dag" != no; then AC_MSG_RESULT([$ac_cv_lbl_dag_api ($dag_include_dir)]) fi -if test $ac_cv_lbl_dag_api = yes; then - - AC_MSG_CHECKING([dagapi.o]) - dagapi_obj=no - if test -r $dag_tools_dir/dagapi.o; then - # 2.4.x. - dagapi_obj=$dag_tools_dir/dagapi.o - elif test -r $dag_lib_dir/dagapi.o; then - # 2.5.x. - dagapi_obj=$dag_lib_dir/dagapi.o - elif test -r $dag_lib_dir/libdag.a; then - # 2.5.x. - ar x $dag_lib_dir/libdag.a dagapi.o 2>/dev/null - if test -r ./dagapi.o; then - dagapi_obj=./dagapi.o - else - ar x $dag_lib_dir/libdag.a libdag_la-dagapi.o 2>/dev/null - if test -r ./libdag_la-dagapi.o; then - dagapi_obj=./libdag_la-dagapi.o - fi - fi - fi - - if test $dagapi_obj = no; then - AC_MSG_RESULT([no (checked $dag_lib_dir $dag_tools_dir $dag_lib_dir/libdag.a)]) - ac_cv_lbl_dag_api=no - else - AC_MSG_RESULT([yes ($dagapi_obj)]) - fi -fi - -if test $ac_cv_lbl_dag_api = yes; then - - AC_MSG_CHECKING([dagopts.o]) - dagopts_obj=no - if test -r $dag_tools_dir/dagopts.o; then - # 2.4.x. - dagopts_obj=$dag_tools_dir/dagopts.o - elif test -r $dag_lib_dir/dagopts.o; then - # 2.5.x. - dagopts_obj=$dag_lib_dir/dagopts.o - elif test -r $dag_lib_dir/libdag.a; then - # 2.5.x. - ar x $dag_lib_dir/libdag.a dagopts.o 2>/dev/null - if test -r ./dagopts.o; then - dagopts_obj=./dagopts.o - else - ar x $dag_lib_dir/libdag.a libdag_la-dagopts.o 2>/dev/null - if test -r ./libdag_la-dagopts.o; then - dagopts_obj=./libdag_la-dagopts.o - fi - fi - fi - - if test $dagopts_obj = no; then - AC_MSG_RESULT([no (checked $dag_lib_dir $dag_tools_dir $dag_lib_dir/libdag.a)]) - ac_cv_lbl_dag_api=no - else - AC_MSG_RESULT([yes ($dagopts_obj)]) - fi -fi - -if test $ac_cv_lbl_dag_api = yes; then - # Under 2.5.x only we need to add dagreg.o. - if test -r $dag_include_dir/dagreg.h; then - AC_MSG_CHECKING([dagreg.o]) - dagreg_obj=no - if test -r $dag_lib_dir/dagreg.o; then - # Object file is ready and waiting. - dagreg_obj=$dag_lib_dir/dagreg.o - elif test -r $dag_lib_dir/libdag.a; then - # Extract from libdag.a. - ar x $dag_lib_dir/libdag.a dagreg.o 2>/dev/null - if test -r ./dagreg.o; then - dagreg_obj=./dagreg.o - else - ar x $dag_lib_dir/libdag.a libdag_la-dagreg.o 2>/dev/null - if test -r ./libdag_la-dagreg.o; then - dagreg_obj=./libdag_la-dagreg.o - fi - fi - fi - - if test $dagreg_obj = no; then - AC_MSG_RESULT([no (checked $dag_lib_dir $dag_lib_dir/libdag.a)]) - ac_cv_lbl_dag_api=no - else - AC_MSG_RESULT([yes ($dagreg_obj)]) - fi - fi -fi - -if test $ac_cv_lbl_dag_api = yes; then - # Under 2.5.x only we need to add dagutil.o. - if test -r $dag_include_dir/dagutil.h; then - AC_MSG_CHECKING([dagutil.o]) - dagutil_obj=no - if test -r $dag_lib_dir/dagutil.o; then - # Object file is ready and waiting. - dagutil_obj=$dag_lib_dir/dagutil.o - elif test -r $dag_lib_dir/libdag.a; then - # Extract from libdag.a. - ar x $dag_lib_dir/libdag.a dagutil.o 2>/dev/null - if test -r ./dagutil.o; then - dagutil_obj=./dagutil.o - else - ar x $dag_lib_dir/libdag.a libdag_la-dagutil.o 2>/dev/null - if test -r ./libdag_la-dagutil.o; then - dagutil_obj=./libdag_la-dagutil.o - fi - fi - fi - - if test $dagutil_obj = no; then - AC_MSG_RESULT([no (checked $dag_lib_dir $dag_lib_dir/libdag.a)]) - ac_cv_lbl_dag_api=no - else - AC_MSG_RESULT([yes ($dagutil_obj)]) - fi - fi -fi - if test $ac_cv_lbl_dag_api = yes; then V_INCLS="$V_INCLS -I$dag_include_dir" - ADDLARCHIVEOBJS="$ADDLARCHIVEOBJS $dagapi_obj $dagopts_obj $dagreg_obj $dagutil_obj" + if test $V_PCAP != dag ; then SSRC="pcap-dag.c" fi @@ -874,11 +768,19 @@ if test $ac_cv_lbl_dag_api = yes; then AC_DEFINE(HAVE_DAG_GET_ERF_TYPES, 1, [define if you have dag_get_erf_types()])]) AC_CHECK_LIB([dag],[dag_get_stream_erf_types], [ AC_DEFINE(HAVE_DAG_GET_STREAM_ERF_TYPES, 1, [define if you have dag_get_stream_erf_types()])]) + LDFLAGS=$saved_ldflags if test "$dag_streams" = 1; then AC_DEFINE(HAVE_DAG_STREAMS_API, 1, [define if you have streams capable DAG API]) LIBS="$LIBS -ldag" + LDFLAGS="$LDFLAGS -L$dag_lib_dir" + + AC_CHECK_LIB([vdag],[vdag_set_device_info], [ac_dag_have_vdag="1"], [ac_dag_have_vdag="0"]) + if test "$ac_dag_have_vdag" = 1; then + AC_DEFINE(HAVE_DAG_VDAG, 1, [define if you have vdag_set_device_info()]) + LIBS="$LIBS -lpthread" + fi fi AC_DEFINE(HAVE_DAG_API, 1, [define if you have the DAG API]) @@ -1169,6 +1071,46 @@ aix*) darwin*) DYEXT="dylib" V_CCOPT="$V_CCOPT -fno-common" + AC_ARG_ENABLE(universal, + AC_HELP_STRING([--disable-universal],[don't build universal on OS X])) + if test "$enable_universal" != "no"; then + case "$host_os" in + + darwin9.*) + # + # Leopard. Build for 32-bit PowerPC, 64-bit + # PowerPC, x86, and x86-64, with 32-bit PowerPC + # first. (That's what Apple does.) + # + V_CCOPT="$V_CCOPT -arch ppc -arch ppc64 -arch i386 -arch x86_64" + LDFLAGS="$LDFLAGS -arch ppc -arch ppc64 -arch i386 -arch x86_64" + ;; + + darwin10.*) + # + # Snow Leopard. Build for x86-64, x86, and + # 32-bit PowerPC, with x86-64 first. (That's + # what Apple does, even though Snow Leopard + # doesn't run on PPC, so PPC libpcap runs under + # Rosetta, and Rosetta doesn't support BPF + # ioctls, so PPC programs can't do live + # captures.) + # + V_CCOPT="$V_CCOPT -arch x86_64 -arch i386 -arch ppc" + LDFLAGS="$LDFLAGS -arch x86_64 -arch i386 -arch ppc" + ;; + + darwin11.*) + # + # Lion. Build for x86-64 and x86, with x86-64 + # first. (That's probably what Apple does, + # given that Rosetta is gone.) + # + V_CCOPT="$V_CCOPT -arch x86_64 -arch i386" + LDFLAGS="$LDFLAGS -arch x86_64 -arch i386" + ;; + esac + fi ;; hpux9*) @@ -1234,7 +1176,7 @@ irix*) MAN_MISC_INFO=5 ;; -linux*|freebsd*|netbsd*|openbsd*|dragonfly*) +linux*|freebsd*|netbsd*|openbsd*|dragonfly*|kfreebsd*|gnu*) DYEXT="so" # @@ -1283,6 +1225,7 @@ solaris*) esac AC_PROG_RANLIB +AC_CHECK_TOOL([AR], [ar]) AC_LBL_DEVEL(V_CCOPT) @@ -1325,48 +1268,103 @@ dnl check for USB sniffing support AC_MSG_CHECKING(for USB sniffing support) case "$host_os" in linux*) - AC_DEFINE(PCAP_SUPPORT_USB, 1, [target host supports USB sniffing]) - USB_SRC=pcap-usb-linux.c - AC_MSG_RESULT(yes) - ac_usb_dev_name=`udevinfo -q name -p /sys/class/usb_device/usbmon 2>/dev/null` - if test $? -ne 0 ; then - ac_usb_dev_name="usbmon" - fi - AC_DEFINE_UNQUOTED(LINUX_USB_MON_DEV, "/dev/$ac_usb_dev_name", [path for device for USB sniffing]) - AC_MSG_NOTICE(Device for USB sniffing is /dev/$ac_usb_dev_name) - AC_CHECK_HEADERS(linux/usbdevice_fs.h) - if test "$ac_cv_header_linux_usbdevice_fs_h" = yes; then - # - # OK, does it define bRequestType? Older versions of the kernel - # define fields with names like "requesttype, "request", and - # "value", rather than "bRequestType", "bRequest", and - # "wValue". - # - AC_MSG_CHECKING(if usbdevfs_ctrltransfer struct has bRequestType member) - AC_CACHE_VAL(ac_cv_usbdevfs_ctrltransfer_has_bRequestType, - AC_TRY_COMPILE([ + AC_DEFINE(PCAP_SUPPORT_USB, 1, [target host supports USB sniffing]) + USB_SRC=pcap-usb-linux.c + AC_MSG_RESULT(yes) + ac_usb_dev_name=`udevinfo -q name -p /sys/class/usb_device/usbmon 2>/dev/null` + if test $? -ne 0 ; then + ac_usb_dev_name="usbmon" + fi + AC_DEFINE_UNQUOTED(LINUX_USB_MON_DEV, "/dev/$ac_usb_dev_name", [path for device for USB sniffing]) + AC_MSG_NOTICE(Device for USB sniffing is /dev/$ac_usb_dev_name) + # + # Do we have a version of available? + # If so, we might need it for . + # + AC_CHECK_HEADERS(linux/compiler.h) + if test "$ac_cv_header_linux_compiler_h" = yes; then + # + # Yes - include it when testing for . + # + AC_CHECK_HEADERS(linux/usbdevice_fs.h,,,[#include ]) + else + AC_CHECK_HEADERS(linux/usbdevice_fs.h) + fi + if test "$ac_cv_header_linux_usbdevice_fs_h" = yes; then + # + # OK, does it define bRequestType? Older versions of the kernel + # define fields with names like "requesttype, "request", and + # "value", rather than "bRequestType", "bRequest", and + # "wValue". + # + AC_MSG_CHECKING(if usbdevfs_ctrltransfer struct has bRequestType member) + AC_CACHE_VAL(ac_cv_usbdevfs_ctrltransfer_has_bRequestType, + AC_TRY_COMPILE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_BITYPES_H #include #endif -# include ], - [u_int i = sizeof(((struct usbdevfs_ctrltransfer *)0)->bRequestType)], - ac_cv_usbdevfs_ctrltransfer_has_bRequestType=yes, - ac_cv_usbdevfs_ctrltransfer_has_bRequestType=no)) - AC_MSG_RESULT($ac_cv_usbdevfs_ctrltransfer_has_bRequestType) - if test $ac_cv_usbdevfs_ctrltransfer_has_bRequestType = yes ; then - AC_DEFINE(HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE,1, - [if struct usbdevfs_ctrltransfer has bRequestType]) - fi - fi - ;; +#ifdef HAVE_LINUX_COMPILER_H +#include +#endif +#include ], + [u_int i = sizeof(((struct usbdevfs_ctrltransfer *)0)->bRequestType)], + ac_cv_usbdevfs_ctrltransfer_has_bRequestType=yes, + ac_cv_usbdevfs_ctrltransfer_has_bRequestType=no)) + AC_MSG_RESULT($ac_cv_usbdevfs_ctrltransfer_has_bRequestType) + if test $ac_cv_usbdevfs_ctrltransfer_has_bRequestType = yes ; then + AC_DEFINE(HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE,1, + [if struct usbdevfs_ctrltransfer has bRequestType]) + fi + fi + ;; *) - AC_MSG_RESULT(no) - ;; + AC_MSG_RESULT(no) + ;; esac AC_SUBST(PCAP_SUPPORT_USB) AC_SUBST(USB_SRC) +dnl check for netfilter sniffing support +AC_MSG_CHECKING(whether the platform could support netfilter sniffing) +case "$host_os" in +linux*) + AC_MSG_RESULT(yes) + # + # Life's too short to deal with trying to get this to compile + # if you don't get the right types defined with + # __KERNEL_STRICT_NAMES getting defined by some other include. + # + # Check whether the includes Just Work. If not, don't turn on + # netfilter support. + # + AC_MSG_CHECKING(whether we can compile the netfilter support) + AC_CACHE_VAL(ac_cv_netfilter_can_compile, + AC_TRY_COMPILE([ +AC_INCLUDES_DEFAULT +#include +#include + +#include +#include +#include ], + [], + ac_cv_netfilter_can_compile=yes, + ac_cv_netfilter_can_compile=no)) + AC_MSG_RESULT($ac_cv_netfilter_can_compile) + if test $ac_cv_netfilter_can_compile = yes ; then + AC_DEFINE(PCAP_SUPPORT_NETFILTER, 1, + [target host supports netfilter sniffing]) + NETFILTER_SRC=pcap-netfilter-linux.c + fi + ;; +*) + AC_MSG_RESULT(no) + ;; +esac +AC_SUBST(PCAP_SUPPORT_NETFILTER) +AC_SUBST(NETFILTER_SRC) + AC_ARG_ENABLE([bluetooth], [AC_HELP_STRING([--enable-bluetooth],[enable Bluetooth support @<:@default=yes, if support available@:>@])], ,enable_bluetooth=yes) @@ -1375,18 +1373,18 @@ if test "x$enable_bluetooth" != "xno" ; then dnl check for Bluetooth sniffing support case "$host_os" in linux*) - AC_CHECK_HEADER(bluetooth/bluetooth.h, - [ + AC_CHECK_HEADER(bluetooth/bluetooth.h, + [ AC_DEFINE(PCAP_SUPPORT_BT, 1, [target host supports Bluetooth sniffing]) - BT_SRC=pcap-bt-linux.c - AC_MSG_NOTICE(Bluetooth sniffing is supported) + BT_SRC=pcap-bt-linux.c + AC_MSG_NOTICE(Bluetooth sniffing is supported) ], AC_MSG_NOTICE(Bluetooth sniffing is not supported; install bluez-lib devel to enable it) - ) - ;; + ) + ;; *) - AC_MSG_NOTICE(no Bluetooth sniffing support implemented for $host_os) - ;; + AC_MSG_NOTICE(no Bluetooth sniffing support implemented for $host_os) + ;; esac AC_SUBST(PCAP_SUPPORT_BT) AC_SUBST(BT_SRC) @@ -1416,15 +1414,26 @@ if test "x$enable_can" != "xno" ; then AC_SUBST(CAN_SRC) fi +dnl check for hardware timestamp support +case "$host_os" in +linux*) + AC_CHECK_HEADERS([linux/net_tstamp.h]) + ;; +*) + AC_MSG_NOTICE(no hardware timestamp support implemented for $host_os) + ;; +esac + AC_PROG_INSTALL AC_CONFIG_HEADER(config.h) AC_OUTPUT(Makefile pcap-filter.manmisc pcap-linktype.manmisc - pcap-savefile.manfile pcap.3pcap pcap_compile.3pcap - pcap_datalink.3pcap pcap_dump_open.3pcap - pcap_list_datalinks.3pcap pcap_open_dead.3pcap - pcap_open_offline.3pcap) + pcap-tstamp.manmisc pcap-savefile.manfile pcap.3pcap + pcap_compile.3pcap pcap_datalink.3pcap pcap_dump_open.3pcap + pcap_list_datalinks.3pcap pcap_list_tstamp_types.3pcap + pcap_open_dead.3pcap pcap_open_offline.3pcap + pcap_set_tstamp_type.3pcap) if test -f .devel ; then make depend diff --git a/contrib/libpcap/ethertype.h b/contrib/libpcap/ethertype.h index d22b92778e2..2d6bbebddd5 100644 --- a/contrib/libpcap/ethertype.h +++ b/contrib/libpcap/ethertype.h @@ -117,3 +117,6 @@ #ifndef ETHERTYPE_LOOPBACK #define ETHERTYPE_LOOPBACK 0x9000 #endif +#ifndef ETHERTYPE_8021QINQ +#define ETHERTYPE_8021QINQ 0x9100 +#endif diff --git a/contrib/libpcap/fad-getad.c b/contrib/libpcap/fad-getad.c index 831ddae7aa8..742ae1facb1 100644 --- a/contrib/libpcap/fad-getad.c +++ b/contrib/libpcap/fad-getad.c @@ -61,15 +61,21 @@ static const char rcsid[] _U_ = #endif #ifdef AF_PACKET +# ifdef HAVE_NETPACKET_PACKET_H +/* Solaris 11 and later, Linux distributions with newer glibc */ +# include +# else /* HAVE_NETPACKET_PACKET_H */ +/* LynxOS, Linux distributions with older glibc */ # ifdef __Lynx__ /* LynxOS */ # include -# else +# else /* __Lynx__ */ /* Linux */ # include # include -# endif -#endif +# endif /* __Lynx__ */ +# endif /* HAVE_NETPACKET_PACKET_H */ +#endif /* AF_PACKET */ /* * This is fun. diff --git a/contrib/libpcap/gencode.c b/contrib/libpcap/gencode.c index 2d28406be10..fd10aed86b8 100644 --- a/contrib/libpcap/gencode.c +++ b/contrib/libpcap/gencode.c @@ -49,7 +49,7 @@ static const char rcsid[] _U_ = * XXX - why was this included even on UNIX? */ #ifdef __MINGW32__ -#include "IP6_misc.h" +#include "ip6_misc.h" #endif #ifndef WIN32 @@ -774,7 +774,8 @@ static int reg_off_ll; * This is the offset of the beginning of the MAC-layer header from * the beginning of the link-layer header. * It's usually 0, except for ATM LANE, where it's the offset, relative - * to the beginning of the raw packet data, of the Ethernet header. + * to the beginning of the raw packet data, of the Ethernet header, and + * for Ethernet with various additional information. */ static u_int off_mac; @@ -1240,26 +1241,6 @@ init_linktype(p) off_nl_nosnap = 0; /* no 802.2 LLC */ return; - case DLT_LINUX_IRDA: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_DOCSIS: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - case DLT_SYMANTEC_FIREWALL: off_linktype = 6; off_macpl = 44; @@ -1368,6 +1349,16 @@ init_linktype(p) off_nl_nosnap = -1; return; + case DLT_JUNIPER_VS: + case DLT_JUNIPER_SRX_E2E: + case DLT_JUNIPER_FIBRECHANNEL: + case DLT_JUNIPER_ATM_CEMIC: + off_linktype = 8; + off_macpl = -1; + off_nl = -1; + off_nl_nosnap = -1; + return; + case DLT_MTP2: off_li = 2; off_sio = 3; @@ -1413,126 +1404,6 @@ init_linktype(p) return; #endif - case DLT_LINUX_LAPD: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_USB: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_BLUETOOTH_HCI_H4: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_USB_LINUX: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_CAN20B: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_IEEE802_15_4_LINUX: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_IEEE802_16_MAC_CPS_RADIO: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_IEEE802_15_4: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_SITA: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_RAIF1: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_IPMB: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_BLUETOOTH_HCI_H4_WITH_PHDR: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - case DLT_AX25_KISS: /* * Currently, only raw "link[N:M]" filtering is supported. @@ -1544,52 +1415,43 @@ init_linktype(p) off_mac = 1; /* step over the kiss length byte */ return; - case DLT_IEEE802_15_4_NONASK_PHY: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_MPLS: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_USB_LINUX_MMAPPED: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - - case DLT_CAN_SOCKETCAN: - /* - * Currently, only raw "link[N:M]" filtering is supported. - */ - off_linktype = -1; - off_macpl = -1; - off_nl = -1; - off_nl_nosnap = -1; - return; - case DLT_IPNET: off_linktype = 1; off_macpl = 24; /* ipnet header length */ off_nl = 0; off_nl_nosnap = -1; return; + + case DLT_NETANALYZER: + off_mac = 4; /* MAC header is past 4-byte pseudo-header */ + off_linktype = 16; /* includes 4-byte pseudo-header */ + off_macpl = 18; /* pseudo-header+Ethernet header length */ + off_nl = 0; /* Ethernet II */ + off_nl_nosnap = 3; /* 802.3+802.2 */ + return; + + case DLT_NETANALYZER_TRANSPARENT: + off_mac = 12; /* MAC header is past 4-byte pseudo-header, preamble, and SFD */ + off_linktype = 24; /* includes 4-byte pseudo-header+preamble+SFD */ + off_macpl = 26; /* pseudo-header+preamble+SFD+Ethernet header length */ + off_nl = 0; /* Ethernet II */ + off_nl_nosnap = 3; /* 802.3+802.2 */ + return; + + default: + /* + * For values in the range in which we've assigned new + * DLT_ values, only raw "link[N:M]" filtering is supported. + */ + if (linktype >= DLT_MATCHING_MIN && + linktype <= DLT_MATCHING_MAX) { + off_linktype = -1; + off_macpl = -1; + off_nl = -1; + off_nl_nosnap = -1; + return; + } + } bpf_error("unknown data link type %d", linktype); /* NOTREACHED */ @@ -3061,6 +2923,8 @@ gen_linktype(proto) switch (linktype) { case DLT_EN10MB: + case DLT_NETANALYZER: + case DLT_NETANALYZER_TRANSPARENT: return gen_ether_linktype(proto); /*NOTREACHED*/ break; @@ -3464,6 +3328,11 @@ gen_linktype(proto) case DLT_JUNIPER_VP: case DLT_JUNIPER_ST: case DLT_JUNIPER_ISM: + case DLT_JUNIPER_VS: + case DLT_JUNIPER_SRX_E2E: + case DLT_JUNIPER_FIBRECHANNEL: + case DLT_JUNIPER_ATM_CEMIC: + /* just lets verify the magic number for now - * on ATM we may have up to 6 different encapsulations on the wire * and need a lot of heuristics to figure out that the payload @@ -3513,6 +3382,7 @@ gen_linktype(proto) case DLT_IEEE802_15_4: case DLT_IEEE802_15_4_LINUX: case DLT_IEEE802_15_4_NONASK_PHY: + case DLT_IEEE802_15_4_NOFCS: bpf_error("IEEE 802.15.4 link-layer type filtering not implemented"); case DLT_IEEE802_16_MAC_CPS_RADIO: @@ -3787,6 +3657,30 @@ gen_ehostop(eaddr, dir) b1 = gen_ehostop(eaddr, Q_DST); gen_or(b0, b1); return b1; + + case Q_ADDR1: + bpf_error("'addr1' is only supported on 802.11 with 802.11 headers"); + break; + + case Q_ADDR2: + bpf_error("'addr2' is only supported on 802.11 with 802.11 headers"); + break; + + case Q_ADDR3: + bpf_error("'addr3' is only supported on 802.11 with 802.11 headers"); + break; + + case Q_ADDR4: + bpf_error("'addr4' is only supported on 802.11 with 802.11 headers"); + break; + + case Q_RA: + bpf_error("'ra' is only supported on 802.11 with 802.11 headers"); + break; + + case Q_TA: + bpf_error("'ta' is only supported on 802.11 with 802.11 headers"); + break; } abort(); /* NOTREACHED */ @@ -3829,6 +3723,30 @@ gen_fhostop(eaddr, dir) b1 = gen_fhostop(eaddr, Q_DST); gen_or(b0, b1); return b1; + + case Q_ADDR1: + bpf_error("'addr1' is only supported on 802.11"); + break; + + case Q_ADDR2: + bpf_error("'addr2' is only supported on 802.11"); + break; + + case Q_ADDR3: + bpf_error("'addr3' is only supported on 802.11"); + break; + + case Q_ADDR4: + bpf_error("'addr4' is only supported on 802.11"); + break; + + case Q_RA: + bpf_error("'ra' is only supported on 802.11"); + break; + + case Q_TA: + bpf_error("'ta' is only supported on 802.11"); + break; } abort(); /* NOTREACHED */ @@ -3863,6 +3781,30 @@ gen_thostop(eaddr, dir) b1 = gen_thostop(eaddr, Q_DST); gen_or(b0, b1); return b1; + + case Q_ADDR1: + bpf_error("'addr1' is only supported on 802.11"); + break; + + case Q_ADDR2: + bpf_error("'addr2' is only supported on 802.11"); + break; + + case Q_ADDR3: + bpf_error("'addr3' is only supported on 802.11"); + break; + + case Q_ADDR4: + bpf_error("'addr4' is only supported on 802.11"); + break; + + case Q_RA: + bpf_error("'ra' is only supported on 802.11"); + break; + + case Q_TA: + bpf_error("'ta' is only supported on 802.11"); + break; } abort(); /* NOTREACHED */ @@ -4156,8 +4098,79 @@ gen_wlanhostop(eaddr, dir) gen_and(b1, b0); return b0; + case Q_RA: + /* + * Not present in management frames; addr1 in other + * frames. + */ + + /* + * If the high-order bit of the type value is 0, this + * is a management frame. + * I.e, check "(link[0] & 0x08)". + */ + s = gen_load_a(OR_LINK, 0, BPF_B); + b1 = new_block(JMP(BPF_JSET)); + b1->s.k = 0x08; + b1->stmts = s; + + /* + * Check addr1. + */ + b0 = gen_bcmp(OR_LINK, 4, 6, eaddr); + + /* + * AND that with the check of addr1. + */ + gen_and(b1, b0); + return (b0); + + case Q_TA: + /* + * Not present in management frames; addr2, if present, + * in other frames. + */ + + /* + * Not present in CTS or ACK control frames. + */ + b0 = gen_mcmp(OR_LINK, 0, BPF_B, IEEE80211_FC0_TYPE_CTL, + IEEE80211_FC0_TYPE_MASK); + gen_not(b0); + b1 = gen_mcmp(OR_LINK, 0, BPF_B, IEEE80211_FC0_SUBTYPE_CTS, + IEEE80211_FC0_SUBTYPE_MASK); + gen_not(b1); + b2 = gen_mcmp(OR_LINK, 0, BPF_B, IEEE80211_FC0_SUBTYPE_ACK, + IEEE80211_FC0_SUBTYPE_MASK); + gen_not(b2); + gen_and(b1, b2); + gen_or(b0, b2); + + /* + * If the high-order bit of the type value is 0, this + * is a management frame. + * I.e, check "(link[0] & 0x08)". + */ + s = gen_load_a(OR_LINK, 0, BPF_B); + b1 = new_block(JMP(BPF_JSET)); + b1->s.k = 0x08; + b1->stmts = s; + + /* + * AND that with the check for frames other than + * CTS and ACK frames. + */ + gen_and(b1, b2); + + /* + * Check addr2. + */ + b1 = gen_bcmp(OR_LINK, 10, 6, eaddr); + gen_and(b2, b1); + return b1; + /* - * XXX - add RA, TA, and BSSID keywords? + * XXX - add BSSID keyword? */ case Q_ADDR1: return (gen_bcmp(OR_LINK, 4, 6, eaddr)); @@ -4253,6 +4266,30 @@ gen_ipfchostop(eaddr, dir) b1 = gen_ipfchostop(eaddr, Q_DST); gen_or(b0, b1); return b1; + + case Q_ADDR1: + bpf_error("'addr1' is only supported on 802.11"); + break; + + case Q_ADDR2: + bpf_error("'addr2' is only supported on 802.11"); + break; + + case Q_ADDR3: + bpf_error("'addr3' is only supported on 802.11"); + break; + + case Q_ADDR4: + bpf_error("'addr4' is only supported on 802.11"); + break; + + case Q_RA: + bpf_error("'ra' is only supported on 802.11"); + break; + + case Q_TA: + bpf_error("'ta' is only supported on 802.11"); + break; } abort(); /* NOTREACHED */ @@ -4446,6 +4483,9 @@ gen_host(addr, mask, proto, dir, type) case Q_VRRP: bpf_error("'vrrp' modifier applied to %s", typestr); + case Q_CARP: + bpf_error("'carp' modifier applied to %s", typestr); + case Q_ATALK: bpf_error("ATALK host filtering not implemented"); @@ -4565,6 +4605,9 @@ gen_host6(addr, mask, proto, dir, type) case Q_VRRP: bpf_error("'vrrp' modifier applied to %s", typestr); + case Q_CARP: + bpf_error("'carp' modifier applied to %s", typestr); + case Q_ATALK: bpf_error("ATALK host filtering not implemented"); @@ -4649,6 +4692,8 @@ gen_gateway(eaddr, alist, proto, dir) case Q_RARP: switch (linktype) { case DLT_EN10MB: + case DLT_NETANALYZER: + case DLT_NETANALYZER_TRANSPARENT: b0 = gen_ehostop(eaddr, Q_OR); break; case DLT_FDDI: @@ -4778,6 +4823,14 @@ gen_proto_abbrev(proto) b1 = gen_proto(IPPROTO_VRRP, Q_IP, Q_DEFAULT); break; +#ifndef IPPROTO_CARP +#define IPPROTO_CARP 112 +#endif + + case Q_CARP: + b1 = gen_proto(IPPROTO_CARP, Q_IP, Q_DEFAULT); + break; + case Q_IP: b1 = gen_linktype(ETHERTYPE_IP); break; @@ -4959,7 +5012,7 @@ gen_ipfrag() struct slist *s; struct block *b; - /* not ip frag */ + /* not IPv4 frag other than the first frag */ s = gen_load_a(OR_NET, 6, BPF_H); b = new_block(JMP(BPF_JSET)); b->s.k = 0x1fff; @@ -5002,7 +5055,7 @@ gen_portop(port, proto, dir) { struct block *b0, *b1, *tmp; - /* ip proto 'proto' */ + /* ip proto 'proto' and not a fragment other than the first fragment */ tmp = gen_cmp(OR_NET, 9, BPF_B, (bpf_int32)proto); b0 = gen_ipfrag(); gen_and(tmp, b0); @@ -5094,6 +5147,7 @@ gen_portop6(port, proto, dir) struct block *b0, *b1, *tmp; /* ip6 proto 'proto' */ + /* XXX - catch the first fragment of a fragmented packet? */ b0 = gen_cmp(OR_NET, 6, BPF_B, (bpf_int32)proto); switch (dir) { @@ -5195,7 +5249,7 @@ gen_portrangeop(port1, port2, proto, dir) { struct block *b0, *b1, *tmp; - /* ip proto 'proto' */ + /* ip proto 'proto' and not a fragment other than the first fragment */ tmp = gen_cmp(OR_NET, 9, BPF_B, (bpf_int32)proto); b0 = gen_ipfrag(); gen_and(tmp, b0); @@ -5299,6 +5353,7 @@ gen_portrangeop6(port1, port2, proto, dir) struct block *b0, *b1, *tmp; /* ip6 proto 'proto' */ + /* XXX - catch the first fragment of a fragmented packet? */ b0 = gen_cmp(OR_NET, 6, BPF_B, (bpf_int32)proto); switch (dir) { @@ -5576,12 +5631,9 @@ gen_protochain(v, proto, dir) /* * in short, - * A = P[X]; - * X = X + (P[X + 1] + 1) * 8; + * A = P[X + packet head]; + * X = X + (P[X + packet head + 1] + 1) * 8; */ - /* A = X */ - s[i] = new_stmt(BPF_MISC|BPF_TXA); - i++; /* A = P[X + packet head] */ s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B); s[i]->s.k = off_macpl + off_nl; @@ -5590,19 +5642,9 @@ gen_protochain(v, proto, dir) s[i] = new_stmt(BPF_ST); s[i]->s.k = reg2; i++; - /* A = X */ - s[i] = new_stmt(BPF_MISC|BPF_TXA); - i++; - /* A += 1 */ - s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K); - s[i]->s.k = 1; - i++; - /* X = A */ - s[i] = new_stmt(BPF_MISC|BPF_TAX); - i++; - /* A = P[X + packet head]; */ + /* A = P[X + packet head + 1]; */ s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B); - s[i]->s.k = off_macpl + off_nl; + s[i]->s.k = off_macpl + off_nl + 1; i++; /* A += 1 */ s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K); @@ -5612,6 +5654,10 @@ gen_protochain(v, proto, dir) s[i] = new_stmt(BPF_ALU|BPF_MUL|BPF_K); s[i]->s.k = 8; i++; + /* A += X */ + s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_X); + s[i]->s.k = 0; + i++; /* X = A; */ s[i] = new_stmt(BPF_MISC|BPF_TAX); i++; @@ -5935,6 +5981,10 @@ gen_proto(v, proto, dir) bpf_error("'vrrp proto' is bogus"); /* NOTREACHED */ + case Q_CARP: + bpf_error("'carp proto' is bogus"); + /* NOTREACHED */ + #ifdef INET6 case Q_IPV6: b0 = gen_linktype(ETHERTYPE_IPV6); @@ -6018,6 +6068,8 @@ gen_scode(name, q) switch (linktype) { case DLT_EN10MB: + case DLT_NETANALYZER: + case DLT_NETANALYZER_TRANSPARENT: eaddr = pcap_ether_hostton(name); if (eaddr == NULL) bpf_error( @@ -6199,6 +6251,10 @@ gen_scode(name, q) /* override PROTO_UNDEF */ real_proto = IPPROTO_SCTP; } + if (port < 0) + bpf_error("illegal port number %d < 0", port); + if (port > 65535) + bpf_error("illegal port number %d > 65535", port); #ifndef INET6 return gen_port(port, real_proto, dir); #else @@ -6240,6 +6296,15 @@ gen_scode(name, q) /* override PROTO_UNDEF */ real_proto = IPPROTO_SCTP; } + if (port1 < 0) + bpf_error("illegal port number %d < 0", port1); + if (port1 > 65535) + bpf_error("illegal port number %d > 65535", port1); + if (port2 < 0) + bpf_error("illegal port number %d < 0", port2); + if (port2 > 65535) + bpf_error("illegal port number %d > 65535", port2); + #ifndef INET6 return gen_portrange(port1, port2, real_proto, dir); #else @@ -6391,6 +6456,9 @@ gen_ncode(s, v, q) else bpf_error("illegal qualifier of 'port'"); + if (v > 65535) + bpf_error("illegal port number %u > 65535", v); + #ifndef INET6 return gen_port((int)v, proto, dir); #else @@ -6414,6 +6482,9 @@ gen_ncode(s, v, q) else bpf_error("illegal qualifier of 'portrange'"); + if (v > 65535) + bpf_error("illegal port number %u > 65535", v); + #ifndef INET6 return gen_portrange((int)v, (int)v, proto, dir); #else @@ -6518,6 +6589,8 @@ gen_ecode(eaddr, q) if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) && q.proto == Q_LINK) { switch (linktype) { case DLT_EN10MB: + case DLT_NETANALYZER: + case DLT_NETANALYZER_TRANSPARENT: return gen_ehostop(eaddr, (int)q.dir); case DLT_FDDI: return gen_fhostop(eaddr, (int)q.dir); @@ -6647,7 +6720,7 @@ gen_load(proto, inst, size) /* * Load into the X register the offset computed into the - * register specifed by "index". + * register specified by "index". */ s = xfer_to_x(inst); @@ -6679,7 +6752,7 @@ gen_load(proto, inst, size) * the link-layer header. Add to it the offset computed * into the register specified by "index", and move that * into the X register. Otherwise, just load into the X - * register the offset computed into the register specifed + * register the offset computed into the register specified * by "index". */ if (s != NULL) { @@ -6728,7 +6801,7 @@ gen_load(proto, inst, size) * payload. Add to it the offset computed into the * register specified by "index", and move that into * the X register. Otherwise, just load into the X - * register the offset computed into the register specifed + * register the offset computed into the register specified * by "index". */ if (s != NULL) { @@ -6773,6 +6846,7 @@ gen_load(proto, inst, size) case Q_IGRP: case Q_PIM: case Q_VRRP: + case Q_CARP: /* * The offset is relative to the beginning of * the transport-layer header. @@ -7121,6 +7195,8 @@ gen_broadcast(proto) case DLT_ARCNET_LINUX: return gen_ahostop(abroadcast, Q_DST); case DLT_EN10MB: + case DLT_NETANALYZER: + case DLT_NETANALYZER_TRANSPARENT: return gen_ehostop(ebroadcast, Q_DST); case DLT_FDDI: return gen_fhostop(ebroadcast, Q_DST); @@ -7216,6 +7292,8 @@ gen_multicast(proto) /* all ARCnet multicasts use the same address */ return gen_ahostop(abroadcast, Q_DST); case DLT_EN10MB: + case DLT_NETANALYZER: + case DLT_NETANALYZER_TRANSPARENT: /* ether[0] & 1 != 0 */ return gen_mac_multicast(0); case DLT_FDDI: @@ -7479,6 +7557,11 @@ gen_inbound(dir) case DLT_JUNIPER_VP: case DLT_JUNIPER_ST: case DLT_JUNIPER_ISM: + case DLT_JUNIPER_VS: + case DLT_JUNIPER_SRX_E2E: + case DLT_JUNIPER_FIBRECHANNEL: + case DLT_JUNIPER_ATM_CEMIC: + /* juniper flags (including direction) are stored * the byte after the 3-byte magic number */ if (dir) { @@ -7759,6 +7842,30 @@ gen_ahostop(eaddr, dir) b1 = gen_ahostop(eaddr, Q_DST); gen_or(b0, b1); return b1; + + case Q_ADDR1: + bpf_error("'addr1' is only supported on 802.11"); + break; + + case Q_ADDR2: + bpf_error("'addr2' is only supported on 802.11"); + break; + + case Q_ADDR3: + bpf_error("'addr3' is only supported on 802.11"); + break; + + case Q_ADDR4: + bpf_error("'addr4' is only supported on 802.11"); + break; + + case Q_RA: + bpf_error("'ra' is only supported on 802.11"); + break; + + case Q_TA: + bpf_error("'ta' is only supported on 802.11"); + break; } abort(); /* NOTREACHED */ @@ -7813,9 +7920,15 @@ gen_vlan(vlan_num) switch (linktype) { case DLT_EN10MB: - /* check for VLAN */ + case DLT_NETANALYZER: + case DLT_NETANALYZER_TRANSPARENT: + /* check for VLAN, including QinQ */ b0 = gen_cmp(OR_LINK, off_linktype, BPF_H, (bpf_int32)ETHERTYPE_8021Q); + b1 = gen_cmp(OR_LINK, off_linktype, BPF_H, + (bpf_int32)ETHERTYPE_8021QINQ); + gen_or(b0,b1); + b0 = b1; /* If a specific VLAN is requested, check VLAN id */ if (vlan_num >= 0) { @@ -7876,6 +7989,8 @@ gen_mpls(label_num) case DLT_C_HDLC: /* fall through */ case DLT_EN10MB: + case DLT_NETANALYZER: + case DLT_NETANALYZER_TRANSPARENT: b0 = gen_linktype(ETHERTYPE_MPLS); break; diff --git a/contrib/libpcap/gencode.h b/contrib/libpcap/gencode.h index e2388b78c42..e8b0593da9a 100644 --- a/contrib/libpcap/gencode.h +++ b/contrib/libpcap/gencode.h @@ -126,6 +126,8 @@ #define Q_RADIO 40 +#define Q_CARP 41 + /* Directional qualifiers. */ #define Q_SRC 1 @@ -136,6 +138,8 @@ #define Q_ADDR2 6 #define Q_ADDR3 7 #define Q_ADDR4 8 +#define Q_RA 9 +#define Q_TA 10 #define Q_DEFAULT 0 #define Q_UNDEF 255 diff --git a/contrib/libpcap/grammar.y b/contrib/libpcap/grammar.y index b42a45753b5..8e128642130 100644 --- a/contrib/libpcap/grammar.y +++ b/contrib/libpcap/grammar.y @@ -273,12 +273,12 @@ pfaction_to_num(const char *action) %token DST SRC HOST GATEWAY %token NET NETMASK PORT PORTRANGE LESS GREATER PROTO PROTOCHAIN CBYTE -%token ARP RARP IP SCTP TCP UDP ICMP IGMP IGRP PIM VRRP +%token ARP RARP IP SCTP TCP UDP ICMP IGMP IGRP PIM VRRP CARP %token ATALK AARP DECNET LAT SCA MOPRC MOPDL %token TK_BROADCAST TK_MULTICAST %token NUM INBOUND OUTBOUND %token PF_IFNAME PF_RSET PF_RNR PF_SRNR PF_REASON PF_ACTION -%token TYPE SUBTYPE DIR ADDR1 ADDR2 ADDR3 ADDR4 +%token TYPE SUBTYPE DIR ADDR1 ADDR2 ADDR3 ADDR4 RA TA %token LINK %token GEQ LEQ NEQ %token ID EID HID HID6 AID @@ -443,6 +443,8 @@ dqual: SRC { $$ = Q_SRC; } | ADDR2 { $$ = Q_ADDR2; } | ADDR3 { $$ = Q_ADDR3; } | ADDR4 { $$ = Q_ADDR4; } + | RA { $$ = Q_RA; } + | TA { $$ = Q_TA; } ; /* address type qualifiers */ aqual: HOST { $$ = Q_HOST; } @@ -465,6 +467,7 @@ pname: LINK { $$ = Q_LINK; } | IGRP { $$ = Q_IGRP; } | PIM { $$ = Q_PIM; } | VRRP { $$ = Q_VRRP; } + | CARP { $$ = Q_CARP; } | ATALK { $$ = Q_ATALK; } | AARP { $$ = Q_AARP; } | DECNET { $$ = Q_DECNET; } diff --git a/contrib/libpcap/inet.c b/contrib/libpcap/inet.c index 178eb81f4ff..6ae46ef8762 100644 --- a/contrib/libpcap/inet.c +++ b/contrib/libpcap/inet.c @@ -133,6 +133,7 @@ add_or_find_if(pcap_if_t **curdev_ret, pcap_if_t **alldevs, const char *name, pcap_t *p; pcap_if_t *curdev, *prevdev, *nextdev; int this_instance; + char open_errbuf[PCAP_ERRBUF_SIZE]; /* * Is there already an entry in the list for this interface? @@ -192,11 +193,11 @@ add_or_find_if(pcap_if_t **curdev_ret, pcap_if_t **alldevs, const char *name, } strcpy(en_name, "en"); strcat(en_name, name + 3); - p = pcap_open_live(en_name, 68, 0, 0, errbuf); + p = pcap_open_live(en_name, 68, 0, 0, open_errbuf); free(en_name); } else #endif /* __APPLE */ - p = pcap_open_live(name, 68, 0, 0, errbuf); + p = pcap_open_live(name, 68, 0, 0, open_errbuf); if (p == NULL) { /* * No. Don't bother including it. @@ -476,8 +477,7 @@ add_addr_to_iflist(pcap_if_t **alldevs, const char *name, u_int flags, free(description); description = NULL; } - } else - break; + } #endif /* __FreeBSD__ */ close(s); if (description != NULL && strlen(description) == 0) { @@ -878,8 +878,10 @@ pcap_lookupdev(errbuf) */ while(NAdapts--) { - strcpy((char*)tUstr, tAstr); - (char*)tUstr += strlen(tAstr) + 1;; + char* tmp = (char*)tUstr; + strcpy(tmp, tAstr); + tmp += strlen(tAstr) + 1; + tUstr = (WCHAR*)tmp; tAstr += strlen(tAstr) + 1; } diff --git a/contrib/libpcap/packaging/pcap.spec.in b/contrib/libpcap/packaging/pcap.spec.in index 9e63dac296a..4a7a82271ef 100644 --- a/contrib/libpcap/packaging/pcap.spec.in +++ b/contrib/libpcap/packaging/pcap.spec.in @@ -1,58 +1,75 @@ %define prefix /usr %define version @VERSION@ -Summary: packet capture library +Summary: A system-independent interface for user-level packet capture Name: libpcap Version: %version Release: 1 Group: Development/Libraries -Copyright: BSD +License: BSD with advertising Source: @NAME@.tar.gz BuildRoot: /tmp/%{name}-buildroot URL: http://www.tcpdump.org +Source: http://www.tcpdump.org/release/%{name}-%{version}.tar.gz + %description -Packet-capture library LIBPCAP @VERSION@ -Now maintained by "The Tcpdump Group" -See http://www.tcpdump.org -Please send inquiries/comments/reports to tcpdump-workers@lists.tcpdump.org +Libpcap provides a portable framework for low-level network +monitoring. Libpcap can provide network statistics collection, +security monitoring and network debugging. Since almost every system +vendor provides a different interface for packet capture, the libpcap +authors created this system-independent API to ease in porting and to +alleviate the need for several system-dependent packet capture modules +in each application. +Install libpcap if you need to do low-level network traffic monitoring +on your network. + +%package devel +Summary: Libraries and header files for the libpcap library +Group: Development/Libraries + +%description devel +Libpcap provides a portable framework for low-level network +monitoring. Libpcap can provide network statistics collection, +security monitoring and network debugging. Since almost every system +vendor provides a different interface for packet capture, the libpcap +authors created this system-independent API to ease in porting and to +alleviate the need for several system-dependent packet capture modules +in each application. + +This package provides the libraries, include files, and other +resources needed for developing libpcap applications. + %prep -%setup - -%post -ldconfig +%setup -q %build -CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix -make +export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" +%configure +make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT -make install DESTDIR=$RPM_BUILD_ROOT mandir=/usr/share/man -cd $RPM_BUILD_ROOT/usr/lib -V1=`echo @VERSION@ | sed 's/\\.[^\.]*$//g'` -V2=`echo @VERSION@ | sed 's/\\.[^\.]*\.[^\.]*$//g'` -ln -sf libpcap.so.@VERSION@ libpcap.so.$V1 -if test "$V2" -ne "$V1"; then - ln -sf libpcap.so.$V1 libpcap.so.$V2 - ln -sf libpcap.so.$V2 libpcap.so -else - ln -sf libpcap.so.$V1 libpcap.so -fi + +make DESTDIR=$RPM_BUILD_ROOT install %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) -%doc LICENSE CHANGES INSTALL.txt README.linux TODO VERSION CREDITS packaging/pcap.spec -/usr/lib/libpcap.a -/usr/share/man/man3/* -/usr/share/man/man5/* -/usr/share/man/man7/* -/usr/include/pcap.h -/usr/include/pcap/*.h -/usr/include/pcap-bpf.h -/usr/include/pcap-namedb.h -/usr/lib/libpcap.so* +%doc LICENSE README CHANGES INSTALL.txt README.linux TODO VERSION CREDITS packaging/pcap.spec +%{_libdir}/libpcap.so.* +%{_mandir}/man7/pcap*.7* + +%files devel +%defattr(-,root,root) +%{_bindir}/pcap-config +%{_includedir}/pcap*.h +%{_includedir}/pcap.h +%{_libdir}/libpcap.so +%{_libdir}/libpcap.a +%{_mandir}/man1/pcap-config.1* +%{_mandir}/man3/pcap*.3* +%{_mandir}/man5/pcap*.5* diff --git a/contrib/libpcap/pcap-bpf.c b/contrib/libpcap/pcap-bpf.c index 5e3d3eaca2d..8337be8dbaf 100644 --- a/contrib/libpcap/pcap-bpf.c +++ b/contrib/libpcap/pcap-bpf.c @@ -33,8 +33,8 @@ static const char rcsid[] _U_ = #ifdef HAVE_ZEROCOPY_BPF #include #endif -#include #include +#include /* * defines ioctls, but doesn't include . * @@ -188,77 +188,67 @@ static int pcap_setfilter_bpf(pcap_t *p, struct bpf_program *fp); static int pcap_setdirection_bpf(pcap_t *, pcap_direction_t); static int pcap_set_datalink_bpf(pcap_t *p, int dlt); -#ifdef HAVE_ZEROCOPY_BPF /* - * For zerocopy bpf, we need to override the setnonblock/getnonblock routines - * so we don't call select(2) if the pcap handle is in non-blocking mode. We - * preserve the timeout supplied by pcap_open functions to make sure it - * does not get clobbered if the pcap handle moves between blocking and non- - * blocking mode. + * For zerocopy bpf, the setnonblock/getnonblock routines need to modify + * p->md.timeout so we don't call select(2) if the pcap handle is in non- + * blocking mode. We preserve the timeout supplied by pcap_open functions + * to make sure it does not get clobbered if the pcap handle moves between + * blocking and non-blocking mode. */ static int -pcap_getnonblock_zbuf(pcap_t *p, char *errbuf) +pcap_getnonblock_bpf(pcap_t *p, char *errbuf) { - /* - * Use a negative value for the timeout to represent that the - * pcap handle is in non-blocking mode. - */ - return (p->md.timeout < 0); +#ifdef HAVE_ZEROCOPY_BPF + if (p->md.zerocopy) { + /* + * Use a negative value for the timeout to represent that the + * pcap handle is in non-blocking mode. + */ + return (p->md.timeout < 0); + } +#endif + return (pcap_getnonblock_fd(p, errbuf)); } static int -pcap_setnonblock_zbuf(pcap_t *p, int nonblock, char *errbuf) +pcap_setnonblock_bpf(pcap_t *p, int nonblock, char *errbuf) { - /* - * Map each value to the corresponding 2's complement, to - * preserve the timeout value provided with pcap_set_timeout. - * (from pcap-linux.c). - */ - if (nonblock) { - if (p->md.timeout >= 0) { - /* - * Timeout is non-negative, so we're not already - * in non-blocking mode; set it to the 2's - * complement, to make it negative, as an - * indication that we're in non-blocking mode. - */ - p->md.timeout = p->md.timeout * -1 - 1; - } - } else { - if (p->md.timeout < 0) { - /* - * Timeout is negative, so we're not already - * in blocking mode; reverse the previous - * operation, to make the timeout non-negative - * again. - */ - p->md.timeout = (p->md.timeout + 1) * -1; +#ifdef HAVE_ZEROCOPY_BPF + if (p->md.zerocopy) { + /* + * Map each value to the corresponding 2's complement, to + * preserve the timeout value provided with pcap_set_timeout. + * (from pcap-linux.c). + */ + if (nonblock) { + if (p->md.timeout >= 0) { + /* + * Timeout is non-negative, so we're not + * currently in non-blocking mode; set it + * to the 2's complement, to make it + * negative, as an indication that we're + * in non-blocking mode. + */ + p->md.timeout = p->md.timeout * -1 - 1; + } + } else { + if (p->md.timeout < 0) { + /* + * Timeout is negative, so we're currently + * in blocking mode; reverse the previous + * operation, to make the timeout non-negative + * again. + */ + p->md.timeout = (p->md.timeout + 1) * -1; + } } + return (0); } - return (0); -} - -/* - * Zero-copy specific close method. Un-map the shared buffers then call - * pcap_cleanup_live_common. - */ -static void -pcap_cleanup_zbuf(pcap_t *p) -{ - /* - * Delete the mappings. Note that p->buffer gets initialized to one - * of the mmapped regions in this case, so do not try and free it - * directly; null it out so that pcap_cleanup_live_common() doesn't - * try to free it. - */ - if (p->md.zbuf1 != MAP_FAILED && p->md.zbuf1 != NULL) - (void) munmap(p->md.zbuf1, p->md.zbufsize); - if (p->md.zbuf2 != MAP_FAILED && p->md.zbuf2 != NULL) - (void) munmap(p->md.zbuf2, p->md.zbufsize); - p->buffer = NULL; - pcap_cleanup_live_common(p); +#endif + return (pcap_setnonblock_fd(p, nonblock, errbuf)); } +#ifdef HAVE_ZEROCOPY_BPF /* * Zero-copy BPF buffer routines to check for and acknowledge BPF data in * shared memory buffers. @@ -412,7 +402,7 @@ pcap_ack_zbuf(pcap_t *p) p->buffer = NULL; return (0); } -#endif +#endif /* HAVE_ZEROCOPY_BPF */ pcap_t * pcap_create(const char *device, char *ebuf) @@ -437,6 +427,10 @@ pcap_create(const char *device, char *ebuf) return (p); } +/* + * On success, returns a file descriptor for a BPF device. + * On failure, returns a PCAP_ERROR_ value, and sets p->errbuf. + */ static int bpf_open(pcap_t *p) { @@ -497,12 +491,52 @@ bpf_open(pcap_t *p) * XXX better message for all minors used */ if (fd < 0) { - if (errno == EACCES) - fd = PCAP_ERROR_PERM_DENIED; - else + switch (errno) { + + case ENOENT: fd = PCAP_ERROR; - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "(no devices found) %s: %s", - device, pcap_strerror(errno)); + if (n == 1) { + /* + * /dev/bpf0 doesn't exist, which + * means we probably have no BPF + * devices. + */ + snprintf(p->errbuf, PCAP_ERRBUF_SIZE, + "(there are no BPF devices)"); + } else { + /* + * We got EBUSY on at least one + * BPF device, so we have BPF + * devices, but all the ones + * that exist are busy. + */ + snprintf(p->errbuf, PCAP_ERRBUF_SIZE, + "(all BPF devices are busy)"); + } + break; + + case EACCES: + /* + * Got EACCES on the last device we tried, + * and EBUSY on all devices before that, + * if any. + */ + fd = PCAP_ERROR_PERM_DENIED; + snprintf(p->errbuf, PCAP_ERRBUF_SIZE, + "(cannot open BPF device) %s: %s", device, + pcap_strerror(errno)); + break; + + default: + /* + * Some other problem. + */ + fd = PCAP_ERROR; + snprintf(p->errbuf, PCAP_ERRBUF_SIZE, + "(cannot open BPF device) %s: %s", device, + pcap_strerror(errno)); + break; + } } #endif @@ -675,14 +709,23 @@ pcap_can_set_rfmon_bpf(pcap_t *p) */ fd = bpf_open(p); if (fd < 0) - return (fd); + return (fd); /* fd is the appropriate error code */ /* * Now bind to the device. */ (void)strncpy(ifr.ifr_name, p->opt.source, sizeof(ifr.ifr_name)); if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) < 0) { - if (errno == ENETDOWN) { + switch (errno) { + + case ENXIO: + /* + * There's no such device. + */ + close(fd); + return (PCAP_ERROR_NO_SUCH_DEVICE); + + case ENETDOWN: /* * Return a "network down" indication, so that * the application can report that rather than @@ -692,7 +735,8 @@ pcap_can_set_rfmon_bpf(pcap_t *p) */ close(fd); return (PCAP_ERROR_IFACE_NOT_UP); - } else { + + default: snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETIF: %s: %s", p->opt.source, pcap_strerror(errno)); @@ -913,14 +957,28 @@ pcap_read_bpf(pcap_t *p, int cnt, pcap_handler callback, u_char *user) * processed so far. */ if (p->break_loop) { + p->bp = bp; + p->cc = ep - bp; + /* + * ep is set based on the return value of read(), + * but read() from a BPF device doesn't necessarily + * return a value that's a multiple of the alignment + * value for BPF_WORDALIGN(). However, whenever we + * increment bp, we round up the increment value by + * a value rounded up by BPF_WORDALIGN(), so we + * could increment bp past ep after processing the + * last packet in the buffer. + * + * We treat ep < bp as an indication that this + * happened, and just set p->cc to 0. + */ + if (p->cc < 0) + p->cc = 0; if (n == 0) { p->break_loop = 0; return (PCAP_ERROR_BREAK); - } else { - p->bp = bp; - p->cc = ep - bp; + } else return (n); - } } caplen = bhp->bh_caplen; @@ -972,6 +1030,11 @@ pcap_read_bpf(pcap_t *p, int cnt, pcap_handler callback, u_char *user) if (++n >= cnt && cnt > 0) { p->bp = bp; p->cc = ep - bp; + /* + * See comment above about p->cc < 0. + */ + if (p->cc < 0) + p->cc = 0; return (n); } } else { @@ -1272,15 +1335,19 @@ pcap_cleanup_bpf(pcap_t *p) } #ifdef HAVE_ZEROCOPY_BPF - /* - * In zero-copy mode, p->buffer is just a pointer into one of the two - * memory-mapped buffers, so no need to free it. - */ if (p->md.zerocopy) { + /* + * Delete the mappings. Note that p->buffer gets + * initialized to one of the mmapped regions in + * this case, so do not try and free it directly; + * null it out so that pcap_cleanup_live_common() + * doesn't try to free it. + */ if (p->md.zbuf1 != MAP_FAILED && p->md.zbuf1 != NULL) - munmap(p->md.zbuf1, p->md.zbufsize); + (void) munmap(p->md.zbuf1, p->md.zbufsize); if (p->md.zbuf2 != MAP_FAILED && p->md.zbuf2 != NULL) - munmap(p->md.zbuf2, p->md.zbufsize); + (void) munmap(p->md.zbuf2, p->md.zbufsize); + p->buffer = NULL; p->buffer = NULL; } #endif @@ -1395,7 +1462,15 @@ pcap_activate_bpf(pcap_t *p) { int status = 0; int fd; +#ifdef LIFNAMSIZ + struct lifreq ifr; + char *ifrname = ifr.lifr_name; + const size_t ifnamsiz = sizeof(ifr.lifr_name); +#else struct ifreq ifr; + char *ifrname = ifr.ifr_name; + const size_t ifnamsiz = sizeof(ifr.ifr_name); +#endif struct bpf_version bv; #ifdef __APPLE__ int sockfd; @@ -1503,9 +1578,8 @@ pcap_activate_bpf(pcap_t *p) */ sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd != -1) { - strlcpy(ifr.ifr_name, - p->opt.source, - sizeof(ifr.ifr_name)); + strlcpy(ifrname, + p->opt.source, ifnamsiz); if (ioctl(sockfd, SIOCGIFFLAGS, (char *)&ifr) < 0) { /* @@ -1570,14 +1644,6 @@ pcap_activate_bpf(pcap_t *p) */ p->md.zerocopy = 1; - /* - * Set the cleanup and set/get nonblocking mode ops - * as appropriate for zero-copy mode. - */ - p->cleanup_op = pcap_cleanup_zbuf; - p->setnonblock_op = pcap_setnonblock_zbuf; - p->getnonblock_op = pcap_getnonblock_zbuf; - /* * How to pick a buffer size: first, query the maximum buffer * size supported by zero-copy. This also lets us quickly @@ -1627,7 +1693,7 @@ pcap_activate_bpf(pcap_t *p) pcap_strerror(errno)); goto bad; } - (void)strncpy(ifr.ifr_name, p->opt.source, sizeof(ifr.ifr_name)); + (void)strncpy(ifrname, p->opt.source, ifnamsiz); if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) < 0) { snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETIF: %s: %s", p->opt.source, pcap_strerror(errno)); @@ -1657,9 +1723,13 @@ pcap_activate_bpf(pcap_t *p) /* * Now bind to the device. */ - (void)strncpy(ifr.ifr_name, p->opt.source, - sizeof(ifr.ifr_name)); - if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) < 0) { + (void)strncpy(ifrname, p->opt.source, ifnamsiz); +#ifdef BIOCSETLIF + if (ioctl(fd, BIOCSETLIF, (caddr_t)&ifr) < 0) +#else + if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) < 0) +#endif + { status = check_setif_failure(p, errno); goto bad; } @@ -1686,9 +1756,12 @@ pcap_activate_bpf(pcap_t *p) */ (void) ioctl(fd, BIOCSBLEN, (caddr_t)&v); - (void)strncpy(ifr.ifr_name, p->opt.source, - sizeof(ifr.ifr_name)); + (void)strncpy(ifrname, p->opt.source, ifnamsiz); +#ifdef BIOCSETLIF + if (ioctl(fd, BIOCSETLIF, (caddr_t)&ifr) >= 0) +#else if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) >= 0) +#endif break; /* that size worked; we're done */ if (errno != ENOBUFS) { @@ -2180,8 +2253,8 @@ pcap_activate_bpf(pcap_t *p) p->setfilter_op = pcap_setfilter_bpf; p->setdirection_op = pcap_setdirection_bpf; p->set_datalink_op = pcap_set_datalink_bpf; - p->getnonblock_op = pcap_getnonblock_fd; - p->setnonblock_op = pcap_setnonblock_fd; + p->getnonblock_op = pcap_getnonblock_bpf; + p->setnonblock_op = pcap_setnonblock_bpf; p->stats_op = pcap_stats_bpf; p->cleanup_op = pcap_cleanup_bpf; @@ -2234,17 +2307,28 @@ monitor_mode(pcap_t *p, int set) /* * Can't get the media types. */ - if (errno == EINVAL) { + switch (errno) { + + case ENXIO: + /* + * There's no such device. + */ + close(sock); + return (PCAP_ERROR_NO_SUCH_DEVICE); + + case EINVAL: /* * Interface doesn't support SIOC{G,S}IFMEDIA. */ close(sock); return (PCAP_ERROR_RFMON_NOTSUP); + + default: + snprintf(p->errbuf, PCAP_ERRBUF_SIZE, + "SIOCGIFMEDIA 1: %s", pcap_strerror(errno)); + close(sock); + return (PCAP_ERROR); } - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "SIOCGIFMEDIA 1: %s", - pcap_strerror(errno)); - close(sock); - return (PCAP_ERROR); } if (req.ifm_count == 0) { /* diff --git a/contrib/libpcap/pcap-bt-linux.c b/contrib/libpcap/pcap-bt-linux.c index a36c144d8a9..0c6c08d199e 100644 --- a/contrib/libpcap/pcap-bt-linux.c +++ b/contrib/libpcap/pcap-bt-linux.c @@ -67,7 +67,6 @@ static const char rcsid[] _U_ = static int bt_activate(pcap_t *); static int bt_read_linux(pcap_t *, int , pcap_handler , u_char *); static int bt_inject_linux(pcap_t *, const void *, size_t); -static int bt_setfilter_linux(pcap_t *, struct bpf_program *); static int bt_setdirection_linux(pcap_t *, pcap_direction_t); static int bt_stats_linux(pcap_t *, struct pcap_stat *); @@ -86,8 +85,8 @@ bt_platform_finddevs(pcap_if_t **alldevsp, char *err_str) /* if bluetooth is not supported this this is not fatal*/ if (errno == EAFNOSUPPORT) return 0; - snprintf(err_str, PCAP_ERRBUF_SIZE, "Can't open raw Bluetooth socket %d:%s", - errno, strerror(errno)); + snprintf(err_str, PCAP_ERRBUF_SIZE, + "Can't open raw Bluetooth socket: %s", strerror(errno)); return -1; } @@ -104,8 +103,9 @@ bt_platform_finddevs(pcap_if_t **alldevsp, char *err_str) if (ioctl(sock, HCIGETDEVLIST, (void *) dev_list) < 0) { - snprintf(err_str, PCAP_ERRBUF_SIZE, "Can't get Bluetooth device list via ioctl %d:%s", - errno, strerror(errno)); + snprintf(err_str, PCAP_ERRBUF_SIZE, + "Can't get Bluetooth device list via ioctl: %s", + strerror(errno)); ret = -1; goto free; } @@ -172,7 +172,7 @@ bt_activate(pcap_t* handle) handle->read_op = bt_read_linux; handle->inject_op = bt_inject_linux; - handle->setfilter_op = bt_setfilter_linux; + handle->setfilter_op = install_bpf_program; /* no kernel filtering */ handle->setdirection_op = bt_setdirection_linux; handle->set_datalink_op = NULL; /* can't change data link type */ handle->getnonblock_op = pcap_getnonblock_fd; @@ -183,8 +183,8 @@ bt_activate(pcap_t* handle) /* Create HCI socket */ handle->fd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); if (handle->fd < 0) { - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't create raw socket %d:%s", - errno, strerror(errno)); + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "Can't create raw socket: %s", strerror(errno)); return PCAP_ERROR; } @@ -197,15 +197,15 @@ bt_activate(pcap_t* handle) opt = 1; if (setsockopt(handle->fd, SOL_HCI, HCI_DATA_DIR, &opt, sizeof(opt)) < 0) { - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't enable data direction info %d:%s", - errno, strerror(errno)); + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "Can't enable data direction info: %s", strerror(errno)); goto close_fail; } opt = 1; if (setsockopt(handle->fd, SOL_HCI, HCI_TIME_STAMP, &opt, sizeof(opt)) < 0) { - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't enable time stamp %d:%s", - errno, strerror(errno)); + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "Can't enable time stamp: %s", strerror(errno)); goto close_fail; } @@ -215,8 +215,8 @@ bt_activate(pcap_t* handle) memset((void *) &flt.type_mask, 0xff, sizeof(flt.type_mask)); memset((void *) &flt.event_mask, 0xff, sizeof(flt.event_mask)); if (setsockopt(handle->fd, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0) { - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't set filter %d:%s", - errno, strerror(errno)); + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "Can't set filter: %s", strerror(errno)); goto close_fail; } @@ -225,8 +225,9 @@ bt_activate(pcap_t* handle) addr.hci_family = AF_BLUETOOTH; addr.hci_dev = handle->md.ifindex; if (bind(handle->fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't attach to device %d %d:%s", - handle->md.ifindex, errno, strerror(errno)); + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "Can't attach to device %d: %s", handle->md.ifindex, + strerror(errno)); goto close_fail; } @@ -238,7 +239,7 @@ bt_activate(pcap_t* handle) goto close_fail; } - if (handle->opt.buffer_size == 0) { + if (handle->opt.buffer_size != 0) { /* * Set the socket buffer size to the specified value. */ @@ -265,6 +266,7 @@ bt_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *us struct cmsghdr *cmsg; struct msghdr msg; struct iovec iv; + ssize_t ret; struct pcap_pkthdr pkth; pcap_bluetooth_h4_header* bthdr; @@ -280,31 +282,33 @@ bt_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *us /* ignore interrupt system call error */ do { - pkth.caplen = recvmsg(handle->fd, &msg, 0); + ret = recvmsg(handle->fd, &msg, 0); if (handle->break_loop) { handle->break_loop = 0; return -2; } - } while ((pkth.caplen == -1) && (errno == EINTR)); + } while ((ret == -1) && (errno == EINTR)); - - if (pkth.caplen < 0) { - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't receive packet %d:%s", - errno, strerror(errno)); + if (ret < 0) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "Can't receive packet: %s", strerror(errno)); return -1; } + pkth.caplen = ret; + /* get direction and timestamp*/ cmsg = CMSG_FIRSTHDR(&msg); int in=0; while (cmsg) { switch (cmsg->cmsg_type) { case HCI_CMSG_DIR: - in = *((int *) CMSG_DATA(cmsg)); + memcpy(&in, CMSG_DATA(cmsg), sizeof in); break; case HCI_CMSG_TSTAMP: - pkth.ts = *((struct timeval *) CMSG_DATA(cmsg)); + memcpy(&pkth.ts, CMSG_DATA(cmsg), + sizeof pkth.ts); break; } cmsg = CMSG_NXTHDR(&msg, cmsg); @@ -316,8 +320,13 @@ bt_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *us bthdr->direction = htonl(in != 0); pkth.caplen+=sizeof(pcap_bluetooth_h4_header); pkth.len = pkth.caplen; - callback(user, &pkth, &handle->buffer[handle->offset]); - return 1; + if (handle->fcode.bf_insns == NULL || + bpf_filter(handle->fcode.bf_insns, &handle->buffer[handle->offset], + pkth.len, pkth.caplen)) { + callback(user, &pkth, &handle->buffer[handle->offset]); + return 1; + } + return 0; /* didn't pass filter */ } static int @@ -337,14 +346,14 @@ bt_stats_linux(pcap_t *handle, struct pcap_stat *stats) struct hci_dev_stats * s = &dev_info.stat; dev_info.dev_id = handle->md.ifindex; - /* ingnore eintr */ + /* ignore eintr */ do { ret = ioctl(handle->fd, HCIGETDEVINFO, (void *)&dev_info); } while ((ret == -1) && (errno == EINTR)); if (ret < 0) { - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "can get stats" - " via ioctl %d:%s", errno, strerror(errno)); + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "Can't get stats via ioctl: %s", strerror(errno)); return (-1); } @@ -357,13 +366,6 @@ bt_stats_linux(pcap_t *handle, struct pcap_stat *stats) return 0; } -static int -bt_setfilter_linux(pcap_t *p, struct bpf_program *fp) -{ - return 0; -} - - static int bt_setdirection_linux(pcap_t *p, pcap_direction_t d) { diff --git a/contrib/libpcap/pcap-common.c b/contrib/libpcap/pcap-common.c index 979b5e364da..f188eeb750e 100644 --- a/contrib/libpcap/pcap-common.c +++ b/contrib/libpcap/pcap-common.c @@ -18,21 +18,9 @@ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * savefile.c - supports offline use of tcpdump - * Extraction/creation by Jeffrey Mogul, DECWRL - * Modified by Steve McCanne, LBL. - * - * Used to save the received packet headers, after filtering, to - * a file, and then read them later. - * The first record in the file contains saved values for the machine - * dependent values so we can print the dump file on any architecture. + * pcap-common.c - common code for pcap and pcap-ng files */ -#ifndef lint -static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/savefile.c,v 1.183 2008-12-23 20:13:29 guy Exp $ (LBL)"; -#endif - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -106,6 +94,23 @@ static const char rcsid[] _U_ = * file, and new values after that one might have been assigned. Also, * do *NOT* use any values below 100 - those might already have been * taken by one (or more!) organizations. + * + * Any platform that defines additional DLT_* codes should: + * + * request a LINKTYPE_* code and value from tcpdump.org, + * as per the above; + * + * add, in their version of libpcap, an entry to map + * those DLT_* codes to the corresponding LINKTYPE_* + * code; + * + * redefine, in their "net/bpf.h", any DLT_* values + * that collide with the values used by their additional + * DLT_* codes, to remove those collisions (but without + * making them collide with any of the LINKTYPE_* + * values equal to 50 or above; they should also avoid + * defining DLT_* values that collide with those + * LINKTYPE_* values, either). */ #define LINKTYPE_NULL DLT_NULL #define LINKTYPE_ETHERNET DLT_EN10MB /* also for 100Mb and up */ @@ -114,7 +119,7 @@ static const char rcsid[] _U_ = #define LINKTYPE_PRONET DLT_PRONET #define LINKTYPE_CHAOS DLT_CHAOS #define LINKTYPE_TOKEN_RING DLT_IEEE802 /* DLT_IEEE802 is used for Token Ring */ -#define LINKTYPE_ARCNET DLT_ARCNET /* BSD-style headers */ +#define LINKTYPE_ARCNET_BSD DLT_ARCNET /* BSD-style headers */ #define LINKTYPE_SLIP DLT_SLIP #define LINKTYPE_PPP DLT_PPP #define LINKTYPE_FDDI DLT_FDDI @@ -140,10 +145,29 @@ static const char rcsid[] _U_ = #define LINKTYPE_SYMANTEC_FIREWALL 99 /* Symantec Enterprise Firewall */ +/* + * These correspond to DLT_s that have different values on different + * platforms; we map between these values in capture files and + * the DLT_ values as returned by pcap_datalink() and passed to + * pcap_open_dead(). + */ #define LINKTYPE_ATM_RFC1483 100 /* LLC/SNAP-encapsulated ATM */ #define LINKTYPE_RAW 101 /* raw IP */ #define LINKTYPE_SLIP_BSDOS 102 /* BSD/OS SLIP BPF header */ #define LINKTYPE_PPP_BSDOS 103 /* BSD/OS PPP BPF header */ + +/* + * Values starting with 104 are used for newly-assigned link-layer + * header type values; for those link-layer header types, the DLT_ + * value returned by pcap_datalink() and passed to pcap_open_dead(), + * and the LINKTYPE_ value that appears in capture files, are the + * same. + * + * LINKTYPE_MATCHING_MIN is the lowest such value; LINKTYPE_MATCHING_MAX + * is the highest such value. + */ +#define LINKTYPE_MATCHING_MIN 104 /* lowest value in the "matching" range */ + #define LINKTYPE_C_HDLC 104 /* Cisco HDLC */ #define LINKTYPE_IEEE802_11 105 /* IEEE 802.11 (wireless) */ #define LINKTYPE_ATM_CLIP 106 /* Linux Classical IP over ATM */ @@ -544,39 +568,39 @@ static const char rcsid[] _U_ = * IPMB with a Linux-specific pseudo-header; as requested by Alexey Neyman * . */ -#define LINKTYPE_IPMB_LINUX 209 +#define LINKTYPE_IPMB_LINUX 209 /* * FlexRay automotive bus - http://www.flexray.com/ - as requested * by Hannes Kaelber . */ -#define LINKTYPE_FLEXRAY 210 +#define LINKTYPE_FLEXRAY 210 /* * Media Oriented Systems Transport (MOST) bus for multimedia * transport - http://www.mostcooperation.com/ - as requested * by Hannes Kaelber . */ -#define LINKTYPE_MOST 211 +#define LINKTYPE_MOST 211 /* * Local Interconnect Network (LIN) bus for vehicle networks - * http://www.lin-subbus.org/ - as requested by Hannes Kaelber * . */ -#define LINKTYPE_LIN 212 +#define LINKTYPE_LIN 212 /* * X2E-private data link type used for serial line capture, * as requested by Hannes Kaelber . */ -#define LINKTYPE_X2E_SERIAL 213 +#define LINKTYPE_X2E_SERIAL 213 /* * X2E-private data link type used for the Xoraya data logger * family, as requested by Hannes Kaelber . */ -#define LINKTYPE_X2E_XORAYA 214 +#define LINKTYPE_X2E_XORAYA 214 /* * IEEE 802.15.4, exactly as it appears in the spec (no padding, no @@ -595,22 +619,22 @@ static const char rcsid[] _U_ = * is used to communicate keystrokes and mouse movements from the * Linux kernel to display systems, such as Xorg. */ -#define LINKTYPE_LINUX_EVDEV 216 +#define LINKTYPE_LINUX_EVDEV 216 /* * GSM Um and Abis interfaces, preceded by a "gsmtap" header. * * Requested by Harald Welte . */ -#define LINKTYPE_GSMTAP_UM 217 -#define LINKTYPE_GSMTAP_ABIS 218 +#define LINKTYPE_GSMTAP_UM 217 +#define LINKTYPE_GSMTAP_ABIS 218 /* * MPLS, with an MPLS label as the link-layer header. * Requested by Michele Marchetto on behalf * of OpenBSD. */ -#define LINKTYPE_MPLS 219 +#define LINKTYPE_MPLS 219 /* * USB packets, beginning with a Linux USB header, with the USB header @@ -622,7 +646,7 @@ static const char rcsid[] _U_ = * DECT packets, with a pseudo-header; requested by * Matthias Wenzel . */ -#define LINKTYPE_DECT 221 +#define LINKTYPE_DECT 221 /* * From: "Lidwa, Eric (GSFC-582.0)[SGT INC]" @@ -633,7 +657,7 @@ static const char rcsid[] _U_ = * legal before I can submit a patch. * */ -#define LINKTYPE_AOS 222 +#define LINKTYPE_AOS 222 /* * Wireless HART (Highway Addressable Remote Transducer) @@ -642,13 +666,13 @@ static const char rcsid[] _U_ = * * Requested by Sam Roberts . */ -#define LINKTYPE_WIHART 223 +#define LINKTYPE_WIHART 223 /* * Fibre Channel FC-2 frames, beginning with a Frame_Header. * Requested by Kahou Lei . */ -#define LINKTYPE_FC_2 224 +#define LINKTYPE_FC_2 224 /* * Fibre Channel FC-2 frames, beginning with an encoding of the @@ -710,7 +734,7 @@ static const char rcsid[] _U_ = * An IPv4 or IPv6 datagram follows the pseudo-header; dli_family indicates * which of those it is. */ -#define LINKTYPE_IPNET 226 +#define LINKTYPE_IPNET 226 /* * CAN (Controller Area Network) frames, with a pseudo-header as supplied @@ -719,15 +743,114 @@ static const char rcsid[] _U_ = * * Requested by Felix Obenhuber . */ -#define LINKTYPE_CAN_SOCKETCAN 227 +#define LINKTYPE_CAN_SOCKETCAN 227 /* * Raw IPv4/IPv6; different from DLT_RAW in that the DLT_ value specifies * whether it's v4 or v6. Requested by Darren Reed . */ -#define LINKTYPE_IPV4 228 -#define LINKTYPE_IPV6 229 +#define LINKTYPE_IPV4 228 +#define LINKTYPE_IPV6 229 +/* + * IEEE 802.15.4, exactly as it appears in the spec (no padding, no + * nothing), and with no FCS at the end of the frame; requested by + * Jon Smirl . + */ +#define LINKTYPE_IEEE802_15_4_NOFCS 230 + +/* + * Raw D-Bus: + * + * http://www.freedesktop.org/wiki/Software/dbus + * + * messages: + * + * http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-messages + * + * starting with the endianness flag, followed by the message type, etc., + * but without the authentication handshake before the message sequence: + * + * http://dbus.freedesktop.org/doc/dbus-specification.html#auth-protocol + * + * Requested by Martin Vidner . + */ +#define LINKTYPE_DBUS 231 + +/* + * Juniper-private data link type, as per request from + * Hannes Gredler . + */ +#define LINKTYPE_JUNIPER_VS 232 +#define LINKTYPE_JUNIPER_SRX_E2E 233 +#define LINKTYPE_JUNIPER_FIBRECHANNEL 234 + +/* + * DVB-CI (DVB Common Interface for communication between a PC Card + * module and a DVB receiver). See + * + * http://www.kaiser.cx/pcap-dvbci.html + * + * for the specification. + * + * Requested by Martin Kaiser . + */ +#define LINKTYPE_DVB_CI 235 + +/* + * Variant of 3GPP TS 27.010 multiplexing protocol. Requested + * by Hans-Christoph Schemmel . + */ +#define LINKTYPE_MUX27010 236 + +/* + * STANAG 5066 D_PDUs. Requested by M. Baris Demiray + * . + */ +#define LINKTYPE_STANAG_5066_D_PDU 237 + +/* + * Juniper-private data link type, as per request from + * Hannes Gredler . + */ +#define LINKTYPE_JUNIPER_ATM_CEMIC 238 + +/* + * NetFilter LOG messages + * (payload of netlink NFNL_SUBSYS_ULOG/NFULNL_MSG_PACKET packets) + * + * Requested by Jakub Zawadzki + */ +#define LINKTYPE_NFLOG 239 + +/* + * Hilscher Gesellschaft fuer Systemautomation mbH link-layer type + * for Ethernet packets with a 4-byte pseudo-header and always + * with the payload including the FCS, as supplied by their + * netANALYZER hardware and software. + * + * Requested by Holger P. Frommer + */ +#define LINKTYPE_NETANALYZER 240 + +/* + * Hilscher Gesellschaft fuer Systemautomation mbH link-layer type + * for Ethernet packets with a 4-byte pseudo-header and FCS and + * 1 byte of SFD, as supplied by their netANALYZER hardware and + * software. + * + * Requested by Holger P. Frommer + */ +#define LINKTYPE_NETANALYZER_TRANSPARENT 241 + +/* + * IP-over-Infiniband, as specified by RFC 4391. + * + * Requested by Petr Sumbera . + */ +#define LINKTYPE_IPOIB 242 + +#define LINKTYPE_MATCHING_MAX 242 /* highest value in the "matching" range */ static struct linktype_map { int dlt; @@ -744,7 +867,7 @@ static struct linktype_map { { DLT_PRONET, LINKTYPE_PRONET }, { DLT_CHAOS, LINKTYPE_CHAOS }, { DLT_IEEE802, LINKTYPE_TOKEN_RING }, - { DLT_ARCNET, LINKTYPE_ARCNET }, + { DLT_ARCNET, LINKTYPE_ARCNET_BSD }, { DLT_SLIP, LINKTYPE_SLIP }, { DLT_PPP, LINKTYPE_PPP }, { DLT_FDDI, LINKTYPE_FDDI }, @@ -785,295 +908,12 @@ static struct linktype_map { /* NetBSD PPP over Ethernet */ { DLT_PPP_ETHER, LINKTYPE_PPP_ETHER }, - /* IEEE 802.11 wireless */ - { DLT_IEEE802_11, LINKTYPE_IEEE802_11 }, - - /* Frame Relay */ - { DLT_FRELAY, LINKTYPE_FRELAY }, - - /* OpenBSD loopback */ - { DLT_LOOP, LINKTYPE_LOOP }, - - /* OpenBSD IPSEC enc */ - { DLT_ENC, LINKTYPE_ENC }, - - /* Linux cooked socket capture */ - { DLT_LINUX_SLL, LINKTYPE_LINUX_SLL }, - - /* Apple LocalTalk hardware */ - { DLT_LTALK, LINKTYPE_LTALK }, - - /* Acorn Econet */ - { DLT_ECONET, LINKTYPE_ECONET }, - - /* OpenBSD DLT_PFLOG */ - { DLT_PFLOG, LINKTYPE_PFLOG }, - - /* For Cisco-internal use */ - { DLT_CISCO_IOS, LINKTYPE_CISCO_IOS }, - - /* Prism II monitor-mode header plus 802.11 header */ - { DLT_PRISM_HEADER, LINKTYPE_PRISM_HEADER }, - - /* FreeBSD Aironet driver stuff */ - { DLT_AIRONET_HEADER, LINKTYPE_AIRONET_HEADER }, - - /* Siemens HiPath HDLC */ - { DLT_HHDLC, LINKTYPE_HHDLC }, - - /* RFC 2625 IP-over-Fibre Channel */ - { DLT_IP_OVER_FC, LINKTYPE_IP_OVER_FC }, - - /* Solaris+SunATM */ - { DLT_SUNATM, LINKTYPE_SUNATM }, - - /* RapidIO */ - { DLT_RIO, LINKTYPE_RIO }, - - /* PCI Express */ - { DLT_PCI_EXP, LINKTYPE_PCI_EXP }, - - /* Xilinx Aurora link layer */ - { DLT_AURORA, LINKTYPE_AURORA }, - - /* 802.11 plus BSD radio header */ - { DLT_IEEE802_11_RADIO, LINKTYPE_IEEE802_11_RADIO }, - - /* Tazmen Sniffer Protocol */ - { DLT_TZSP, LINKTYPE_TZSP }, - - /* Arcnet with Linux-style link-layer headers */ - { DLT_ARCNET_LINUX, LINKTYPE_ARCNET_LINUX }, - - /* Juniper-internal chassis encapsulation */ - { DLT_JUNIPER_MLPPP, LINKTYPE_JUNIPER_MLPPP }, - { DLT_JUNIPER_MLFR, LINKTYPE_JUNIPER_MLFR }, - { DLT_JUNIPER_ES, LINKTYPE_JUNIPER_ES }, - { DLT_JUNIPER_GGSN, LINKTYPE_JUNIPER_GGSN }, - { DLT_JUNIPER_MFR, LINKTYPE_JUNIPER_MFR }, - { DLT_JUNIPER_ATM2, LINKTYPE_JUNIPER_ATM2 }, - { DLT_JUNIPER_SERVICES, LINKTYPE_JUNIPER_SERVICES }, - { DLT_JUNIPER_ATM1, LINKTYPE_JUNIPER_ATM1 }, - - /* Apple IP-over-IEEE 1394 cooked header */ - { DLT_APPLE_IP_OVER_IEEE1394, LINKTYPE_APPLE_IP_OVER_IEEE1394 }, - - /* SS7 */ - { DLT_MTP2_WITH_PHDR, LINKTYPE_MTP2_WITH_PHDR }, - { DLT_MTP2, LINKTYPE_MTP2 }, - { DLT_MTP3, LINKTYPE_MTP3 }, - { DLT_SCCP, LINKTYPE_SCCP }, - - /* DOCSIS MAC frames */ - { DLT_DOCSIS, LINKTYPE_DOCSIS }, - - /* IrDA IrLAP packets + Linux-cooked header */ - { DLT_LINUX_IRDA, LINKTYPE_LINUX_IRDA }, - - /* IBM SP and Next Federation switches */ - { DLT_IBM_SP, LINKTYPE_IBM_SP }, - { DLT_IBM_SN, LINKTYPE_IBM_SN }, - - /* 802.11 plus AVS radio header */ - { DLT_IEEE802_11_RADIO_AVS, LINKTYPE_IEEE802_11_RADIO_AVS }, - /* - * Any platform that defines additional DLT_* codes should: - * - * request a LINKTYPE_* code and value from tcpdump.org, - * as per the above; - * - * add, in their version of libpcap, an entry to map - * those DLT_* codes to the corresponding LINKTYPE_* - * code; - * - * redefine, in their "net/bpf.h", any DLT_* values - * that collide with the values used by their additional - * DLT_* codes, to remove those collisions (but without - * making them collide with any of the LINKTYPE_* - * values equal to 50 or above; they should also avoid - * defining DLT_* values that collide with those - * LINKTYPE_* values, either). + * All LINKTYPE_ values between LINKTYPE_MATCHING_MIN + * and LINKTYPE_MATCHING_MAX are mapped to identical + * DLT_ values. */ - /* Juniper-internal chassis encapsulation */ - { DLT_JUNIPER_MONITOR, LINKTYPE_JUNIPER_MONITOR }, - - /* BACnet MS/TP */ - { DLT_BACNET_MS_TP, LINKTYPE_BACNET_MS_TP }, - - /* PPP for pppd, with direction flag in the PPP header */ - { DLT_PPP_PPPD, LINKTYPE_PPP_PPPD}, - - /* Juniper-internal chassis encapsulation */ - { DLT_JUNIPER_PPPOE, LINKTYPE_JUNIPER_PPPOE }, - { DLT_JUNIPER_PPPOE_ATM,LINKTYPE_JUNIPER_PPPOE_ATM }, - - /* GPRS LLC */ - { DLT_GPRS_LLC, LINKTYPE_GPRS_LLC }, - - /* Transparent Generic Framing Procedure (ITU-T G.7041/Y.1303) */ - { DLT_GPF_T, LINKTYPE_GPF_T }, - - /* Framed Generic Framing Procedure (ITU-T G.7041/Y.1303) */ - { DLT_GPF_F, LINKTYPE_GPF_F }, - - { DLT_GCOM_T1E1, LINKTYPE_GCOM_T1E1 }, - { DLT_GCOM_SERIAL, LINKTYPE_GCOM_SERIAL }, - - /* Juniper-internal chassis encapsulation */ - { DLT_JUNIPER_PIC_PEER, LINKTYPE_JUNIPER_PIC_PEER }, - - /* Endace types */ - { DLT_ERF_ETH, LINKTYPE_ERF_ETH }, - { DLT_ERF_POS, LINKTYPE_ERF_POS }, - - /* viSDN LAPD */ - { DLT_LINUX_LAPD, LINKTYPE_LINUX_LAPD }, - - /* Juniper meta-information before Ether, PPP, Frame Relay, C-HDLC Frames */ - { DLT_JUNIPER_ETHER, LINKTYPE_JUNIPER_ETHER }, - { DLT_JUNIPER_PPP, LINKTYPE_JUNIPER_PPP }, - { DLT_JUNIPER_FRELAY, LINKTYPE_JUNIPER_FRELAY }, - { DLT_JUNIPER_CHDLC, LINKTYPE_JUNIPER_CHDLC }, - - /* Multi Link Frame Relay (FRF.16) */ - { DLT_MFR, LINKTYPE_MFR }, - - /* Juniper Voice PIC */ - { DLT_JUNIPER_VP, LINKTYPE_JUNIPER_VP }, - - /* Controller Area Network (CAN) v2.0B */ - { DLT_A429, LINKTYPE_A429 }, - - /* Arinc 653 Interpartition Communication messages */ - { DLT_A653_ICM, LINKTYPE_A653_ICM }, - - /* USB */ - { DLT_USB, LINKTYPE_USB }, - - /* Bluetooth HCI UART transport layer */ - { DLT_BLUETOOTH_HCI_H4, LINKTYPE_BLUETOOTH_HCI_H4 }, - - /* IEEE 802.16 MAC Common Part Sublayer */ - { DLT_IEEE802_16_MAC_CPS, LINKTYPE_IEEE802_16_MAC_CPS }, - - /* USB with Linux header */ - { DLT_USB_LINUX, LINKTYPE_USB_LINUX }, - - /* Controller Area Network (CAN) v2.0B */ - { DLT_CAN20B, LINKTYPE_CAN20B }, - - /* IEEE 802.15.4 with address fields padded */ - { DLT_IEEE802_15_4_LINUX, LINKTYPE_IEEE802_15_4_LINUX }, - - /* Per Packet Information encapsulated packets */ - { DLT_PPI, LINKTYPE_PPI }, - - /* IEEE 802.16 MAC Common Part Sublayer plus radiotap header */ - { DLT_IEEE802_16_MAC_CPS_RADIO, LINKTYPE_IEEE802_16_MAC_CPS_RADIO }, - - /* Juniper Voice ISM */ - { DLT_JUNIPER_ISM, LINKTYPE_JUNIPER_ISM }, - - /* IEEE 802.15.4 exactly as it appears in the spec */ - { DLT_IEEE802_15_4, LINKTYPE_IEEE802_15_4 }, - - /* Various link-layer types for SITA */ - { DLT_SITA, LINKTYPE_SITA }, - - /* Various link-layer types for Endace */ - { DLT_ERF, LINKTYPE_ERF }, - - /* Special header for u10 Networks boards */ - { DLT_RAIF1, LINKTYPE_RAIF1 }, - - /* IPMB */ - { DLT_IPMB, LINKTYPE_IPMB }, - - /* Juniper Secure Tunnel */ - { DLT_JUNIPER_ST, LINKTYPE_JUNIPER_ST }, - - /* Bluetooth HCI UART transport layer, with pseudo-header */ - { DLT_BLUETOOTH_HCI_H4_WITH_PHDR, LINKTYPE_BLUETOOTH_HCI_H4_WITH_PHDR }, - - /* AX.25 with KISS header */ - { DLT_AX25_KISS, LINKTYPE_AX25_KISS }, - - /* Raw LAPD, with no pseudo-header */ - { DLT_LAPD, LINKTYPE_LAPD }, - - /* PPP with one-byte pseudo-header giving direction */ - { DLT_PPP_WITH_DIR, LINKTYPE_PPP_WITH_DIR }, - - /* Cisco HDLC with one-byte pseudo-header giving direction */ - { DLT_C_HDLC_WITH_DIR, LINKTYPE_C_HDLC_WITH_DIR }, - - /* Frame Relay with one-byte pseudo-header giving direction */ - { DLT_FRELAY_WITH_DIR, LINKTYPE_FRELAY_WITH_DIR }, - - /* LAPB with one-byte pseudo-header giving direction */ - { DLT_LAPB_WITH_DIR, LINKTYPE_LAPB_WITH_DIR }, - - /* IPMB with Linux pseudo-header */ - { DLT_IPMB_LINUX, LINKTYPE_IPMB_LINUX }, - - /* FlexRay */ - { DLT_FLEXRAY, LINKTYPE_FLEXRAY }, - - /* MOST */ - { DLT_MOST, LINKTYPE_MOST }, - - /* LIN */ - { DLT_LIN, LINKTYPE_LIN }, - - /* X2E-private serial line capture */ - { DLT_X2E_SERIAL, LINKTYPE_X2E_SERIAL }, - - /* X2E-private for Xoraya data logger family */ - { DLT_X2E_XORAYA, LINKTYPE_X2E_XORAYA }, - - /* IEEE 802.15.4 with PHY data for non-ASK PHYs */ - { DLT_IEEE802_15_4_NONASK_PHY, LINKTYPE_IEEE802_15_4_NONASK_PHY }, - - /* Input device events from Linux /dev/input/eventN devices */ - { DLT_LINUX_EVDEV, LINKTYPE_LINUX_EVDEV }, - - /* GSM types */ - { DLT_GSMTAP_UM, LINKTYPE_GSMTAP_UM }, - { DLT_GSMTAP_ABIS, LINKTYPE_GSMTAP_ABIS }, - - /* MPLS, with an MPLS label as the link-layer header */ - { DLT_MPLS, LINKTYPE_MPLS }, - - /* USB with padded Linux header */ - { DLT_USB_LINUX_MMAPPED, LINKTYPE_USB_LINUX_MMAPPED }, - - /* DECT packets with a pseudo-header */ - { DLT_DECT, LINKTYPE_DECT }, - - /* AOS Space Data Link Protocol */ - { DLT_AOS, LINKTYPE_AOS }, - - /* Wireless HART */ - { DLT_WIHART, LINKTYPE_WIHART }, - - /* Fibre Channel FC-2 frames without SOF or EOF */ - { DLT_FC_2, LINKTYPE_FC_2 }, - - /* Fibre Channel FC-2 frames with SOF and EOF */ - { DLT_FC_2_WITH_FRAME_DELIMS, LINKTYPE_FC_2_WITH_FRAME_DELIMS }, - - /* Solaris IPNET */ - { DLT_IPNET, LINKTYPE_IPNET }, - - /* CAN frames with SocketCAN headers */ - { DLT_CAN_SOCKETCAN, LINKTYPE_CAN_SOCKETCAN }, - - /* Raw IPv4/IPv6 */ - { DLT_IPV4, LINKTYPE_IPV4 }, - { DLT_IPV6, LINKTYPE_IPV6 }, - { -1, -1 } }; @@ -1082,6 +922,15 @@ dlt_to_linktype(int dlt) { int i; + /* + * Map the values in the matching range. + */ + if (dlt >= DLT_MATCHING_MIN && dlt <= DLT_MATCHING_MAX) + return (dlt); + + /* + * Map the values outside that range. + */ for (i = 0; map[i].dlt != -1; i++) { if (map[i].dlt == dlt) return (map[i].linktype); @@ -1089,8 +938,8 @@ dlt_to_linktype(int dlt) /* * If we don't have a mapping for this DLT_ code, return an - * error; that means that the table above needs to have an - * entry added. + * error; that means that this is a value with no corresponding + * LINKTYPE_ code, and we need to assign one. */ return (-1); } @@ -1100,6 +949,16 @@ linktype_to_dlt(int linktype) { int i; + /* + * Map the values in the matching range. + */ + if (linktype >= LINKTYPE_MATCHING_MIN && + linktype <= LINKTYPE_MATCHING_MAX) + return (linktype); + + /* + * Map the values outside that range. + */ for (i = 0; map[i].linktype != -1; i++) { if (map[i].linktype == linktype) return (map[i].dlt); @@ -1127,33 +986,72 @@ swap_linux_usb_header(const struct pcap_pkthdr *hdr, u_char *buf, int header_len_64_bytes) { pcap_usb_header_mmapped *uhdr = (pcap_usb_header_mmapped *)buf; + bpf_u_int32 offset = 0; + usb_isodesc *pisodesc; + int32_t numdesc, i; + + /* + * "offset" is the offset *past* the field we're swapping; + * we skip the field *before* checking to make sure + * the captured data length includes the entire field. + */ /* * The URB id is a totally opaque value; do we really need to * convert it to the reading host's byte order??? */ - if (hdr->caplen < 8) + offset += 8; /* skip past id */ + if (hdr->caplen < offset) return; uhdr->id = SWAPLL(uhdr->id); - if (hdr->caplen < 14) + + offset += 4; /* skip past various 1-byte fields */ + + offset += 2; /* skip past bus_id */ + if (hdr->caplen < offset) return; uhdr->bus_id = SWAPSHORT(uhdr->bus_id); - if (hdr->caplen < 24) + + offset += 2; /* skip past various 1-byte fields */ + + offset += 8; /* skip past ts_sec */ + if (hdr->caplen < offset) return; uhdr->ts_sec = SWAPLL(uhdr->ts_sec); - if (hdr->caplen < 28) + + offset += 4; /* skip past ts_usec */ + if (hdr->caplen < offset) return; uhdr->ts_usec = SWAPLONG(uhdr->ts_usec); - if (hdr->caplen < 32) + + offset += 4; /* skip past status */ + if (hdr->caplen < offset) return; uhdr->status = SWAPLONG(uhdr->status); - if (hdr->caplen < 36) + + offset += 4; /* skip past urb_len */ + if (hdr->caplen < offset) return; uhdr->urb_len = SWAPLONG(uhdr->urb_len); - if (hdr->caplen < 40) + + offset += 4; /* skip past data_len */ + if (hdr->caplen < offset) return; uhdr->data_len = SWAPLONG(uhdr->data_len); + if (uhdr->transfer_type == URB_ISOCHRONOUS) { + offset += 4; /* skip past s.iso.error_count */ + if (hdr->caplen < offset) + return; + uhdr->s.iso.error_count = SWAPLONG(uhdr->s.iso.error_count); + + offset += 4; /* skip past s.iso.numdesc */ + if (hdr->caplen < offset) + return; + uhdr->s.iso.numdesc = SWAPLONG(uhdr->s.iso.numdesc); + } else + offset += 8; /* skip USB setup header */ + if (header_len_64_bytes) { /* * This is either the "version 1" header, with @@ -1163,17 +1061,50 @@ swap_linux_usb_header(const struct pcap_pkthdr *hdr, u_char *buf, * at the end. Byte swap them as if this were * a "version 1" header. */ - if (hdr->caplen < 52) + offset += 4; /* skip past interval */ + if (hdr->caplen < offset) return; uhdr->interval = SWAPLONG(uhdr->interval); - if (hdr->caplen < 56) + + offset += 4; /* skip past start_frame */ + if (hdr->caplen < offset) return; uhdr->start_frame = SWAPLONG(uhdr->start_frame); - if (hdr->caplen < 60) + + offset += 4; /* skip past xfer_flags */ + if (hdr->caplen < offset) return; uhdr->xfer_flags = SWAPLONG(uhdr->xfer_flags); - if (hdr->caplen < 64) + + offset += 4; /* skip past ndesc */ + if (hdr->caplen < offset) return; uhdr->ndesc = SWAPLONG(uhdr->ndesc); } + + if (uhdr->transfer_type == URB_ISOCHRONOUS) { + /* swap the values in struct linux_usb_isodesc */ + pisodesc = (usb_isodesc *)(void *)(buf+offset); + numdesc = uhdr->s.iso.numdesc; + for (i = 0; i < numdesc; i++) { + offset += 4; /* skip past status */ + if (hdr->caplen < offset) + return; + pisodesc->status = SWAPLONG(pisodesc->status); + + offset += 4; /* skip past offset */ + if (hdr->caplen < offset) + return; + pisodesc->offset = SWAPLONG(pisodesc->offset); + + offset += 4; /* skip past len */ + if (hdr->caplen < offset) + return; + pisodesc->len = SWAPLONG(pisodesc->len); + + offset += 4; /* skip past padding */ + + pisodesc++; + } + } } diff --git a/contrib/libpcap/pcap-config.in b/contrib/libpcap/pcap-config.in index 37526d7fed6..206be3b4a64 100644 --- a/contrib/libpcap/pcap-config.in +++ b/contrib/libpcap/pcap-config.in @@ -4,6 +4,13 @@ # Script to give the appropriate compiler flags and linker flags # to use when building code that uses libpcap. # +prefix="@prefix@" +exec_prefix="@exec_prefix@" +includedir="@includedir@" +libdir="@libdir@" +V_RPATH_OPT="@V_RPATH_OPT@" +LIBS="@LIBS@" + static=0 show_cflags=0 show_libs=0 @@ -29,14 +36,14 @@ do esac shift done -if [ "@V_RPATH_OPT@" != "" ] +if [ "$V_RPATH_OPT" != "" ] then # # If libdir isn't /usr/lib, add it to the run-time linker path. # - if [ "@libdir@" != "/usr/lib" ] + if [ "$libdir" != "/usr/lib" ] then - RPATH=@V_RPATH_OPT@@libdir@ + RPATH=$V_RPATH_OPT$libdir fi fi if [ "$static" = 1 ] @@ -47,19 +54,19 @@ then # if [ "$show_cflags" = 1 -a "$show_libs" = 1 ] then - echo "-I@includedir@ -L@libdir@ -lpcap @LIBS@" + echo "-I$includedir -L$libdir -lpcap $LIBS" elif [ "$show_cflags" = 1 -a "$show_additional_libs" = 1 ] then - echo "-I@includedir@ -L@libdir@ @LIBS@" + echo "-I$includedir -L$libdir $LIBS" elif [ "$show_cflags" = 1 ] then - echo "-I@includedir@" + echo "-I$includedir" elif [ "$show_libs" = 1 ] then - echo "-L@libdir@ -lpcap @LIBS@" + echo "-L$libdir -lpcap $LIBS" elif [ "$show_additional_libs" = 1 ] then - echo "@LIBS@" + echo "$LIBS" fi else # @@ -68,15 +75,15 @@ else # if [ "$show_cflags" = 1 -a "$show_libs" = 1 ] then - echo "-I@includedir@ -L@libdir@ $RPATH -lpcap" + echo "-I$includedir -L$libdir $RPATH -lpcap" elif [ "$show_cflags" = 1 -a "$show_additional_libs" = 1 ] then - echo "-I@includedir@" + echo "-I$includedir" elif [ "$show_cflags" = 1 ] then - echo "-I@includedir@" + echo "-I$includedir" elif [ "$show_libs" = 1 ] then - echo "-L@libdir@ $RPATH -lpcap" + echo "-L$libdir $RPATH -lpcap" fi fi diff --git a/contrib/libpcap/pcap-dag.c b/contrib/libpcap/pcap-dag.c index 938ec26dce4..b5de0691b95 100644 --- a/contrib/libpcap/pcap-dag.c +++ b/contrib/libpcap/pcap-dag.c @@ -879,8 +879,8 @@ dag_platform_finddevs(pcap_if_t **devlistp, char *errbuf) int dagstream; int dagfd; - /* Try all the DAGs 0-9 */ - for (c = 0; c < 9; c++) { + /* Try all the DAGs 0-31 */ + for (c = 0; c < 32; c++) { snprintf(name, 12, "dag%d", c); if (-1 == dag_parse_name(name, dagname, DAGNAME_BUFSIZE, &dagstream)) { @@ -897,7 +897,7 @@ dag_platform_finddevs(pcap_if_t **devlistp, char *errbuf) { int stream, rxstreams; rxstreams = dag_rx_get_stream_count(dagfd); - for(stream=0;stream<16;stream+=2) { + for(stream=0;streamfd = open(dname, O_RDWR)) < 0) { if (errno != ENOENT) { - if (errno == EACCES) + if (errno == EPERM || errno == EACCES) status = PCAP_ERROR_PERM_DENIED; snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "%s: %s", dname, pcap_strerror(errno)); @@ -486,7 +485,7 @@ pcap_activate_dlpi(pcap_t *p) snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "%s: No DLPI device found", p->opt.source); } else { - if (errno == EACCES) + if (errno == EPERM || errno == EACCES) status = PCAP_ERROR_PERM_DENIED; snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "%s: %s", dname2, pcap_strerror(errno)); @@ -610,9 +609,12 @@ pcap_activate_dlpi(pcap_t *p) /* ** Enable promiscuous (not necessary on send FD) */ - if (dlpromisconreq(p->fd, DL_PROMISC_PHYS, p->errbuf) < 0 || - dlokack(p->fd, "promisc_phys", (char *)buf, p->errbuf) < 0) + status = dlpromiscon(p, DL_PROMISC_PHYS); + if (status < 0) { + if (status == PCAP_ERROR_PERM_DENIED) + status = PCAP_ERROR_PROMISC_PERM_DENIED; goto bad; + } /* ** Try to enable multicast (you would have thought @@ -620,8 +622,8 @@ pcap_activate_dlpi(pcap_t *p) ** HP-UX or SINIX) (Not necessary on send FD) */ #if !defined(__hpux) && !defined(sinix) - if (dlpromisconreq(p->fd, DL_PROMISC_MULTI, p->errbuf) < 0 || - dlokack(p->fd, "promisc_multi", (char *)buf, p->errbuf) < 0) + status = dlpromiscon(p, DL_PROMISC_MULTI); + if (status < 0) status = PCAP_WARNING; #endif } @@ -631,20 +633,27 @@ pcap_activate_dlpi(pcap_t *p) ** under SINIX) (Not necessary on send FD) */ #ifndef sinix - if ( -#ifdef __hpux - !p->opt.promisc && +#if defined(__hpux) + /* HP-UX - only do this when not in promiscuous mode */ + if (!p->opt.promisc) { +#elif defined(HAVE_SOLARIS) + /* Solaris - don't do this on SunATM devices */ + if (!isatm) { +#else + /* Everything else (except for SINIX) - always do this */ + { #endif -#ifdef HAVE_SOLARIS - !isatm && -#endif - (dlpromisconreq(p->fd, DL_PROMISC_SAP, p->errbuf) < 0 || - dlokack(p->fd, "promisc_sap", (char *)buf, p->errbuf) < 0)) { - /* Not fatal if promisc since the DL_PROMISC_PHYS worked */ - if (p->opt.promisc) - status = PCAP_WARNING; - else - goto bad; + status = dlpromiscon(p, DL_PROMISC_SAP); + if (status < 0) { + /* + * Not fatal, since the DL_PROMISC_PHYS mode worked. + * Report it as a warning, however. + */ + if (p->opt.promisc) + status = PCAP_WARNING; + else + goto bad; + } } #endif /* sinix */ @@ -815,11 +824,15 @@ split_dname(char *device, int *unitp, char *ebuf) static int dl_doattach(int fd, int ppa, char *ebuf) { + dl_attach_req_t req; bpf_u_int32 buf[MAXDLBUF]; int err; - if (dlattachreq(fd, ppa, ebuf) < 0) + req.dl_primitive = DL_ATTACH_REQ; + req.dl_ppa = ppa; + if (send_request(fd, (char *)&req, sizeof(req), "attach", ebuf) < 0) return (PCAP_ERROR); + err = dlokack(fd, "attach", (char *)buf, ebuf); if (err < 0) return (err); @@ -877,6 +890,27 @@ dl_dohpuxbind(int fd, char *ebuf) } #endif +#define STRINGIFY(n) #n + +static int +dlpromiscon(pcap_t *p, bpf_u_int32 level) +{ + dl_promiscon_req_t req; + bpf_u_int32 buf[MAXDLBUF]; + int err; + + req.dl_primitive = DL_PROMISCON_REQ; + req.dl_level = level; + if (send_request(p->fd, (char *)&req, sizeof(req), "promiscon", + p->errbuf) < 0) + return (PCAP_ERROR); + err = dlokack(p->fd, "promiscon" STRINGIFY(level), (char *)buf, + p->errbuf); + if (err < 0) + return (err); + return (0); +} + int pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf) { @@ -986,7 +1020,8 @@ recv_ack(int fd, int size, const char *what, char *bufp, char *ebuf, int *uerror snprintf(ebuf, PCAP_ERRBUF_SIZE, "recv_ack: %s: UNIX error - %s", what, pcap_strerror(dlp->error_ack.dl_unix_errno)); - if (dlp->error_ack.dl_unix_errno == EACCES) + if (dlp->error_ack.dl_unix_errno == EPERM || + dlp->error_ack.dl_unix_errno == EACCES) return (PCAP_ERROR_PERM_DENIED); break; @@ -1221,17 +1256,6 @@ dlprim(bpf_u_int32 prim) } } -static int -dlattachreq(int fd, bpf_u_int32 ppa, char *ebuf) -{ - dl_attach_req_t req; - - req.dl_primitive = DL_ATTACH_REQ; - req.dl_ppa = ppa; - - return (send_request(fd, (char *)&req, sizeof(req), "attach", ebuf)); -} - static int dlbindreq(int fd, bpf_u_int32 sap, char *ebuf) { @@ -1259,17 +1283,6 @@ dlbindack(int fd, char *bufp, char *ebuf, int *uerror) return (recv_ack(fd, DL_BIND_ACK_SIZE, "bind", bufp, ebuf, uerror)); } -static int -dlpromisconreq(int fd, bpf_u_int32 level, char *ebuf) -{ - dl_promiscon_req_t req; - - req.dl_primitive = DL_PROMISCON_REQ; - req.dl_level = level; - - return (send_request(fd, (char *)&req, sizeof(req), "promiscon", ebuf)); -} - static int dlokack(int fd, const char *what, char *bufp, char *ebuf) { diff --git a/contrib/libpcap/pcap-filter.manmisc b/contrib/libpcap/pcap-filter.manmisc index 372bb98fdad..293a241d226 100644 --- a/contrib/libpcap/pcap-filter.manmisc +++ b/contrib/libpcap/pcap-filter.manmisc @@ -1,4 +1,4 @@ -.\" @(#) $Header: /tcpdump/master/libpcap/pcap-filter.manmisc.in,v 1.1.2.2 2008-10-21 07:44:56 guy Exp $ (LBL) +.\" @(#) $Header: /tcpdump/master/libpcap/pcap-filter.manmisc.in,v 1.1 2008-10-21 07:33:01 guy Exp $ (LBL) .\" .\" Copyright (c) 1987, 1988, 1989, 1990, 1991, 1992, 1994, 1995, 1996, 1997 .\" The Regents of the University of California. All rights reserved. @@ -65,6 +65,8 @@ Possible directions are .BR dst , .BR "src or dst" , .BR "src and dst" , +.BR ra , +.BR ta , .BR addr1 , .BR addr2 , .BR addr3 , @@ -76,6 +78,8 @@ there is no dir qualifier, .B "src or dst" is assumed. The +.BR ra , +.BR ta , .BR addr1 , .BR addr2 , .BR addr3 , @@ -472,6 +476,15 @@ and .B scrub (applies only to packets logged by OpenBSD's or FreeBSD's .BR pf (4)). +.IP "\fBwlan ra \fIehost\fR" +True if the IEEE 802.11 RA is +.IR ehost . +The RA field is used in all frames except for management frames. +.IP "\fBwlan ta \fIehost\fR" +True if the IEEE 802.11 TA is +.IR ehost . +The TA field is used in all frames except for management frames and +CTS (Clear To Send) and ACK (Acknowledgment) control frames. .IP "\fBwlan addr1 \fIehost\fR" True if the first IEEE 802.11 address is .IR ehost . @@ -490,7 +503,7 @@ True if the fourth IEEE 802.11 address, if present, is .IR ehost . The fourth address field is only used for WDS (Wireless Distribution System) frames. -.IP "\fBip\fR, \fBip6\fR, \fBarp\fR, \fBrarp\fR, \fBatalk\fR, \fBaarp\fR, \fBdecnet\fR, \fBiso\fR, \fBstp\fR, \fBipx\fR, \fInetbeui\fP" +.IP "\fBip\fR, \fBip6\fR, \fBarp\fR, \fBrarp\fR, \fBatalk\fR, \fBaarp\fR, \fBdecnet\fR, \fBiso\fR, \fBstp\fR, \fBipx\fR, \fBnetbeui\fP" Abbreviations for: .in +.5i .nf diff --git a/contrib/libpcap/pcap-filter.manmisc.in b/contrib/libpcap/pcap-filter.manmisc.in index 6b826e3cc49..d7b4b0a5f0f 100644 --- a/contrib/libpcap/pcap-filter.manmisc.in +++ b/contrib/libpcap/pcap-filter.manmisc.in @@ -65,6 +65,8 @@ Possible directions are .BR dst , .BR "src or dst" , .BR "src and dst" , +.BR ra , +.BR ta , .BR addr1 , .BR addr2 , .BR addr3 , @@ -76,6 +78,8 @@ there is no dir qualifier, .B "src or dst" is assumed. The +.BR ra , +.BR ta , .BR addr1 , .BR addr2 , .BR addr3 , @@ -472,6 +476,15 @@ and .B scrub (applies only to packets logged by OpenBSD's or FreeBSD's .BR pf (4)). +.IP "\fBwlan ra \fIehost\fR" +True if the IEEE 802.11 RA is +.IR ehost . +The RA field is used in all frames except for management frames. +.IP "\fBwlan ta \fIehost\fR" +True if the IEEE 802.11 TA is +.IR ehost . +The TA field is used in all frames except for management frames and +CTS (Clear To Send) and ACK (Acknowledgment) control frames. .IP "\fBwlan addr1 \fIehost\fR" True if the first IEEE 802.11 address is .IR ehost . @@ -490,7 +503,7 @@ True if the fourth IEEE 802.11 address, if present, is .IR ehost . The fourth address field is only used for WDS (Wireless Distribution System) frames. -.IP "\fBip\fR, \fBip6\fR, \fBarp\fR, \fBrarp\fR, \fBatalk\fR, \fBaarp\fR, \fBdecnet\fR, \fBiso\fR, \fBstp\fR, \fBipx\fR, \fInetbeui\fP" +.IP "\fBip\fR, \fBip6\fR, \fBarp\fR, \fBrarp\fR, \fBatalk\fR, \fBaarp\fR, \fBdecnet\fR, \fBiso\fR, \fBstp\fR, \fBipx\fR, \fBnetbeui\fP" Abbreviations for: .in +.5i .nf diff --git a/contrib/libpcap/pcap-int.h b/contrib/libpcap/pcap-int.h index c3afbade52b..8444e62cee8 100644 --- a/contrib/libpcap/pcap-int.h +++ b/contrib/libpcap/pcap-int.h @@ -209,6 +209,7 @@ struct pcap_opt { char *source; int promisc; int rfmon; + int tstamp_type; }; /* @@ -331,6 +332,8 @@ struct pcap { char errbuf[PCAP_ERRBUF_SIZE + 1]; int dlt_count; u_int *dlt_list; + int tstamp_type_count; + u_int *tstamp_type_list; struct pcap_pkthdr pcap_header; /* This is needed for the pcap_next_ex() to work */ }; diff --git a/contrib/libpcap/pcap-libdlpi.c b/contrib/libpcap/pcap-libdlpi.c index 87cd08b7d92..8d6a0386e01 100644 --- a/contrib/libpcap/pcap-libdlpi.c +++ b/contrib/libpcap/pcap-libdlpi.c @@ -49,6 +49,7 @@ static const char rcsid[] _U_ = #include "dlpisubs.h" /* Forwards. */ +static int dlpromiscon(pcap_t *, bpf_u_int32); static int pcap_read_libdlpi(pcap_t *, int, pcap_handler, u_char *); static int pcap_inject_libdlpi(pcap_t *, const void *, size_t); static void pcap_close_libdlpi(pcap_t *); @@ -114,7 +115,8 @@ pcap_activate_libdlpi(pcap_t *p) if (retv != DLPI_SUCCESS) { if (retv == DLPI_ELINKNAMEINVAL || retv == DLPI_ENOLINK) err = PCAP_ERROR_NO_SUCH_DEVICE; - else if (retv == DL_SYSERR && errno == EACCES) + else if (retv == DL_SYSERR && + (errno == EPERM || errno == EACCES)) err = PCAP_ERROR_PERM_DENIED; pcap_libdlpi_err(p->opt.source, "dlpi_open", retv, p->errbuf); @@ -139,34 +141,43 @@ pcap_activate_libdlpi(pcap_t *p) /* Enable promiscuous mode. */ if (p->opt.promisc) { - retv = dlpi_promiscon(p->dlpi_hd, DL_PROMISC_PHYS); - if (retv != DLPI_SUCCESS) { - pcap_libdlpi_err(p->opt.source, - "dlpi_promisc(PHYSICAL)", retv, p->errbuf); + err = dlpromiscon(p, DL_PROMISC_PHYS); + if (err < 0) { + /* + * "You don't have permission to capture on + * this device" and "you don't have permission + * to capture in promiscuous mode on this + * device" are different; let the user know, + * so if they can't get permission to + * capture in promiscuous mode, they can at + * least try to capture in non-promiscuous + * mode. + * + * XXX - you might have to capture in + * promiscuous mode to see outgoing packets. + */ + if (err == PCAP_ERROR_PERM_DENIED) + err = PCAP_ERROR_PROMISC_PERM_DENIED; goto bad; } } else { /* Try to enable multicast. */ - retv = dlpi_promiscon(p->dlpi_hd, DL_PROMISC_MULTI); - if (retv != DLPI_SUCCESS) { - pcap_libdlpi_err(p->opt.source, "dlpi_promisc(MULTI)", - retv, p->errbuf); + err = dlpromiscon(p, DL_PROMISC_MULTI); + if (err < 0) goto bad; - } } /* Try to enable SAP promiscuity. */ - retv = dlpi_promiscon(p->dlpi_hd, DL_PROMISC_SAP); - if (retv != DLPI_SUCCESS) { - if (p->opt.promisc) { - pcap_libdlpi_err(p->opt.source, "dlpi_promisc(SAP)", - retv, p->errbuf); + err = dlpromiscon(p, DL_PROMISC_SAP); + if (err < 0) { + /* + * Not fatal, since the DL_PROMISC_PHYS mode worked. + * Report it as a warning, however. + */ + if (p->opt.promisc) + err = PCAP_WARNING; + else goto bad; - } - - /* Not fatal, since the DL_PROMISC_PHYS mode worked. */ - fprintf(stderr, "WARNING: dlpi_promisc(SAP) failed on" - " %s:(%s)\n", p->opt.source, dlpi_strerror(retv)); } /* Determine link type. */ @@ -219,6 +230,27 @@ bad: return (err); } +#define STRINGIFY(n) #n + +static int +dlpromiscon(pcap_t *p, bpf_u_int32 level) +{ + int err; + + retv = dlpi_promiscon(p->hd, level); + if (retv != DLPI_SUCCESS) { + if (retv == DL_SYSERR && + (errno == EPERM || errno == EACCES)) + err = PCAP_ERROR_PERM_DENIED; + else + err = PCAP_ERROR; + pcap_libdlpi_err(p->opt.source, "dlpi_promiscon" STRINGIFY(level), + retv, p->errbuf); + return (err); + } + return (0); +} + /* * In Solaris, the "standard" mechanism" i.e SIOCGLIFCONF will only find * network links that are plumbed and are up. dlpi_walk(3DLPI) will find diff --git a/contrib/libpcap/pcap-linktype.manmisc b/contrib/libpcap/pcap-linktype.manmisc index ed9dba4a38a..7dff3a5186f 100644 --- a/contrib/libpcap/pcap-linktype.manmisc +++ b/contrib/libpcap/pcap-linktype.manmisc @@ -1,4 +1,4 @@ -.\" @(#) $Header: /tcpdump/master/libpcap/pcap-linktype.manmisc.in,v 1.1.2.4 2008-10-27 22:52:05 guy Exp $ +.\" @(#) $Header: /tcpdump/master/libpcap/pcap-linktype.manmisc.in,v 1.3 2008-10-27 22:52:30 guy Exp $ .\" .\" Copyright (c) 1987, 1988, 1989, 1990, 1991, 1992, 1994, 1995, 1996, 1997 .\" The Regents of the University of California. All rights reserved. @@ -44,239 +44,7 @@ by The names for those values begin with .BR LINKTYPE_ . .PP -The link-layer header types supported by libpcap are listed here. The -value corresponding to -.B LINKTYPE_ -names are given; the value corresponding to -.B DLT_ -values are, in some cases, platform dependent, and are not given; -applications should check for particular -.B DLT_ -values by name. -.RS 5 -.TP 5 -.BR DLT_NULL "; " LINKTYPE_NULL = 0 -BSD loopback encapsulation; the link layer header is a 4-byte field, in -.I host -byte order, containing a PF_ value from -.B socket.h -for the network-layer protocol of the packet. -.IP -Note that ``host byte order'' is the byte order of the machine on which -the packets are captured, and the PF_ values are for the OS of the -machine on which the packets are captured; if a live capture is being -done, ``host byte order'' is the byte order of the machine capturing the -packets, and the PF_ values are those of the OS of the machine capturing -the packets, but if a ``savefile'' is being read, the byte order and PF_ -values are -.I not -necessarily those of the machine reading the capture file. -.TP 5 -.BR DLT_EN10MB "; " LINKTYPE_ETHERNET = 1 -Ethernet (10Mb, 100Mb, 1000Mb, and up); the -.B 10MB -in the -.B DLT_ -name is historical. -.TP 5 -.BR DLT_IEEE802 "; " LINKTYPE_TOKEN_RING = 6 -IEEE 802.5 Token Ring; the -.B IEEE802 -in the -.B DLT_ -name is historical. -.TP 5 -.BR DLT_ARCNET "; " LINKTYPE_ARCNET = 7 -ARCNET -.TP 5 -.BR DLT_SLIP "; " LINKTYPE_SLIP = 8 -SLIP; the link layer header contains, in order: -.RS 10 -.LP -a 1-byte flag, which is 0 for packets received by the machine and 1 for -packets sent by the machine; -.LP -a 1-byte field, the upper 4 bits of which indicate the type of packet, -as per RFC 1144: -.RS 5 -.TP 5 -0x40 -an unmodified IP datagram (TYPE_IP); -.TP 5 -0x70 -an uncompressed-TCP IP datagram (UNCOMPRESSED_TCP), with that byte being -the first byte of the raw IP header on the wire, containing the -connection number in the protocol field; -.TP 5 -0x80 -a compressed-TCP IP datagram (COMPRESSED_TCP), with that byte being the -first byte of the compressed TCP/IP datagram header; -.RE -.LP -for UNCOMPRESSED_TCP, the rest of the modified IP header, and for -COMPRESSED_TCP, the compressed TCP/IP datagram header; -.RE -.RS 5 -.LP -for a total of 16 bytes; the uncompressed IP datagram follows the header. -.RE -.TP 5 -.BR DLT_PPP "; " LINKTYPE_PPP = 9 -PPP; if the first 2 bytes are 0xff and 0x03, it's PPP in HDLC-like -framing, with the PPP header following those two bytes, otherwise it's -PPP without framing, and the packet begins with the PPP header. -.TP 5 -.BR DLT_FDDI "; " LINKTYPE_FDDI = 10 -FDDI -.TP 5 -.BR DLT_ATM_RFC1483 "; " LINKTYPE_ATM_RFC1483 = 100 -RFC 1483 LLC/SNAP-encapsulated ATM; the packet begins with an IEEE 802.2 -LLC header. -.TP 5 -.BR DLT_RAW "; " LINKTYPE_RAW = 101 -raw IP; the packet begins with an IP header. -.TP 5 -.BR DLT_PPP_SERIAL "; " LINKTYPE_PPP_HDLC = 50 -PPP in HDLC-like framing, as per RFC 1662, or Cisco PPP with HDLC -framing, as per section 4.3.1 of RFC 1547; the first byte will be 0xFF -for PPP in HDLC-like framing, and will be 0x0F or 0x8F for Cisco PPP -with HDLC framing. -.TP 5 -.BR DLT_PPP_ETHER "; " LINKTYPE_PPP_ETHER = 51 -PPPoE; the packet begins with a PPPoE header, as per RFC 2516. -.TP 5 -.BR DLT_C_HDLC "; " LINKTYPE_C_HDLC = 104 -Cisco PPP with HDLC framing, as per section 4.3.1 of RFC 1547. -.TP 5 -.BR DLT_IEEE802_11 "; " LINKTYPE_IEEE802_11 = 105 -IEEE 802.11 wireless LAN -.TP 5 -.BR DLT_FRELAY "; " LINKTYPE_FRELAY = 107 -Frame Relay -.TP 5 -.BR DLT_LOOP "; " LINKTYPE_LOOP = 108 -OpenBSD loopback encapsulation; the link layer header is a 4-byte field, in -.I network -byte order, containing a PF_ value from OpenBSD's -.B socket.h -for the network-layer protocol of the packet. -.IP -Note that, if a ``savefile'' is being read, those PF_ values are -.I not -necessarily those of the machine reading the capture file. -.TP 5 -.BR DLT_LINUX_SLL "; " LINKTYPE_LINUX_SLL = 113 -Linux "cooked" capture encapsulation; the link layer header contains, in -order: -.RS 10 -.LP -a 2-byte "packet type", in network byte order, which is one of: -.RS 5 -.TP 5 -0 -packet was sent to us by somebody else -.TP 5 -1 -packet was broadcast by somebody else -.TP 5 -2 -packet was multicast, but not broadcast, by somebody else -.TP 5 -3 -packet was sent by somebody else to somebody else -.TP 5 -4 -packet was sent by us -.RE -.LP -a 2-byte field, in network byte order, containing a Linux ARPHRD_ value -for the link layer device type; -.LP -a 2-byte field, in network byte order, containing the length of the -link layer address of the sender of the packet (which could be 0); -.LP -an 8-byte field containing that number of bytes of the link layer header -(if there are more than 8 bytes, only the first 8 are present); -.LP -a 2-byte field containing an Ethernet protocol type, in network byte -order, or containing 1 for Novell 802.3 frames without an 802.2 LLC -header or 4 for frames beginning with an 802.2 LLC header. -.RE -.TP 5 -.BR DLT_LTALK "; " LINKTYPE_LTALK = 104 -Apple LocalTalk; the packet begins with an AppleTalk LLAP header. -.TP 5 -.BR DLT_PFLOG "; " LINKTYPE_PFLOG = 117 -OpenBSD pflog; the link layer header contains a -.B "struct pfloghdr" -structure, as defined by the host on which the file was saved. (This -differs from operating system to operating system and release to -release; there is nothing in the file to indicate what the layout of -that structure is.) -.TP 5 -.BR DLT_PRISM_HEADER "; " LINKTYPE_PRISM_HEADER = 119 -Prism monitor mode information followed by an 802.11 header. -.TP 5 -.BR DLT_IP_OVER_FC "; " LINKTYPE_IP_OVER_FC = 122 -RFC 2625 IP-over-Fibre Channel, with the link-layer header being the -Network_Header as described in that RFC. -.TP 5 -.BR DLT_SUNATM "; " LINKTYPE_SUNATM = 123 -SunATM devices; the link layer header contains, in order: -.RS 10 -.LP -a 1-byte flag field, containing a direction flag in the uppermost bit, -which is set for packets transmitted by the machine and clear for -packets received by the machine, and a 4-byte traffic type in the -low-order 4 bits, which is one of: -.RS 5 -.TP 5 -0 -raw traffic -.TP 5 -1 -LANE traffic -.TP 5 -2 -LLC-encapsulated traffic -.TP 5 -3 -MARS traffic -.TP 5 -4 -IFMP traffic -.TP 5 -5 -ILMI traffic -.TP 5 -6 -Q.2931 traffic -.RE -.LP -a 1-byte VPI value; -.LP -a 2-byte VCI field, in network byte order. -.RE -.TP 5 -.BR DLT_IEEE802_11_RADIO "; " LINKTYPE_IEEE802_11_RADIO = 127 -link-layer information followed by an 802.11 header - see -http://www.shaftnet.org/~pizza/software/capturefrm.txt for a description -of the link-layer information. -.TP 5 -.BR DLT_ARCNET_LINUX "; " LINKTYPE_ARCNET_LINUX = 129 -ARCNET, with no exception frames, reassembled packets rather than raw -frames, and an extra 16-bit offset field between the destination host -and type bytes. -.TP 5 -.BR DLT_LINUX_IRDA "; " LINKTYPE_LINUX_IRDA = 144 -Linux-IrDA packets, with a -.B DLT_LINUX_SLL -header followed by the IrLAP header. -.TP 5 -.BR DLT_LINUX_LAPD "; " LINKTYPE_LINUX_LAPD = 177 -LAPD (Q.921) frames, with a -.B DLT_LINUX_SLL -header captured via vISDN. -.RE +The link-layer header types supported by libpcap are described at +http://www.tcpdump.org/linktypes.html. .SH SEE ALSO pcap_datalink(3PCAP) diff --git a/contrib/libpcap/pcap-linktype.manmisc.in b/contrib/libpcap/pcap-linktype.manmisc.in index fa156120ff4..890438728a3 100644 --- a/contrib/libpcap/pcap-linktype.manmisc.in +++ b/contrib/libpcap/pcap-linktype.manmisc.in @@ -44,241 +44,7 @@ by The names for those values begin with .BR LINKTYPE_ . .PP -The link-layer header types supported by libpcap are listed here. The -value corresponding to -.B LINKTYPE_ -names are given; the value corresponding to -.B DLT_ -values are, in some cases, platform dependent, and are not given; -applications should check for particular -.B DLT_ -values by name. -.RS 5 -.TP 5 -.BR DLT_NULL "; " LINKTYPE_NULL = 0 -BSD loopback encapsulation; the link-layer header is a 4-byte field, in -.I host -byte order, containing a PF_ value from -.B socket.h -for the network-layer protocol of the packet. -.IP -Note that ``host byte order'' is the byte order of the machine on which -the packets are captured, and the PF_ values are for the OS of the -machine on which the packets are captured; if a live capture is being -done, ``host byte order'' is the byte order of the machine capturing the -packets, and the PF_ values are those of the OS of the machine capturing -the packets, but if a ``savefile'' is being read, the byte order and PF_ -values are -.I not -necessarily those of the machine reading the capture file. -.TP 5 -.BR DLT_EN10MB "; " LINKTYPE_ETHERNET = 1 -Ethernet (10Mb, 100Mb, 1000Mb, and up); the -.B 10MB -in the -.B DLT_ -name is historical. -.TP 5 -.BR DLT_IEEE802 "; " LINKTYPE_TOKEN_RING = 6 -IEEE 802.5 Token Ring; the -.B IEEE802 -in the -.B DLT_ -name is historical. -.TP 5 -.BR DLT_ARCNET "; " LINKTYPE_ARCNET = 7 -ARCNET -.TP 5 -.BR DLT_SLIP "; " LINKTYPE_SLIP = 8 -SLIP; the link-layer header contains, in order: -.RS 10 -.LP -a 1-byte flag, which is 0 for packets received by the machine and 1 for -packets sent by the machine; -.LP -a 1-byte field, the upper 4 bits of which indicate the type of packet, -as per RFC 1144: -.RS 5 -.TP 5 -0x40 -an unmodified IP datagram (TYPE_IP); -.TP 5 -0x70 -an uncompressed-TCP IP datagram (UNCOMPRESSED_TCP), with that byte being -the first byte of the raw IP header on the wire, containing the -connection number in the protocol field; -.TP 5 -0x80 -a compressed-TCP IP datagram (COMPRESSED_TCP), with that byte being the -first byte of the compressed TCP/IP datagram header; -.RE -.LP -for UNCOMPRESSED_TCP, the rest of the modified IP header, and for -COMPRESSED_TCP, the compressed TCP/IP datagram header; -.RE -.RS 5 -.LP -for a total of 16 bytes; the uncompressed IP datagram follows the header. -.RE -.TP 5 -.BR DLT_PPP "; " LINKTYPE_PPP = 9 -PPP; if the first 2 bytes are 0xff and 0x03, it's PPP in HDLC-like -framing, with the PPP header following those two bytes, otherwise it's -PPP without framing, and the packet begins with the PPP header. -.TP 5 -.BR DLT_FDDI "; " LINKTYPE_FDDI = 10 -FDDI -.TP 5 -.BR DLT_ATM_RFC1483 "; " LINKTYPE_ATM_RFC1483 = 100 -RFC 1483 LLC/SNAP-encapsulated ATM; the packet begins with an IEEE 802.2 -LLC header. -.TP 5 -.BR DLT_RAW "; " LINKTYPE_RAW = 101 -raw IP; the packet begins with an IP header. -.TP 5 -.BR DLT_PPP_SERIAL "; " LINKTYPE_PPP_HDLC = 50 -PPP in HDLC-like framing, as per RFC 1662, or Cisco PPP with HDLC -framing, as per section 4.3.1 of RFC 1547; the first byte will be 0xFF -for PPP in HDLC-like framing, and will be 0x0F or 0x8F for Cisco PPP -with HDLC framing. -.TP 5 -.BR DLT_PPP_ETHER "; " LINKTYPE_PPP_ETHER = 51 -PPPoE; the packet begins with a PPPoE header, as per RFC 2516. -.TP 5 -.BR DLT_C_HDLC "; " LINKTYPE_C_HDLC = 104 -Cisco PPP with HDLC framing, as per section 4.3.1 of RFC 1547. -.TP 5 -.BR DLT_IEEE802_11 "; " LINKTYPE_IEEE802_11 = 105 -IEEE 802.11 wireless LAN -.TP 5 -.BR DLT_FRELAY "; " LINKTYPE_FRELAY = 107 -Frame Relay -.TP 5 -.BR DLT_LOOP "; " LINKTYPE_LOOP = 108 -OpenBSD loopback encapsulation; the link-layer header is a 4-byte field, in -.I network -byte order, containing a PF_ value from OpenBSD's -.B socket.h -for the network-layer protocol of the packet. -.IP -Note that, if a ``savefile'' is being read, those PF_ values are -.I not -necessarily those of the machine reading the capture file. -.TP 5 -.BR DLT_LINUX_SLL "; " LINKTYPE_LINUX_SLL = 113 -Linux "cooked" capture encapsulation; the link-layer header contains, in -order: -.RS 10 -.LP -a 2-byte "packet type", in network byte order, which is one of: -.RS 5 -.TP 5 -0 -packet was sent to us by somebody else -.TP 5 -1 -packet was broadcast by somebody else -.TP 5 -2 -packet was multicast, but not broadcast, by somebody else -.TP 5 -3 -packet was sent by somebody else to somebody else -.TP 5 -4 -packet was sent by us -.RE -.LP -a 2-byte field, in network byte order, containing a Linux ARPHRD_ value -for the link-layer device type; -.LP -a 2-byte field, in network byte order, containing the length of the -link-layer address of the sender of the packet (which could be 0); -.LP -an 8-byte field containing that number of bytes of the link-layer -address of the sender (if there are more than 8 bytes, only the first -8 are present, and if there are fewer than 8 bytes, there are padding -bytes after the address to pad the field to 8 bytes); -.LP -a 2-byte field containing an Ethernet protocol type, in network byte -order, or containing 1 for Novell 802.3 frames without an 802.2 LLC -header or 4 for frames beginning with an 802.2 LLC header. -.RE -.TP 5 -.BR DLT_LTALK "; " LINKTYPE_LTALK = 104 -Apple LocalTalk; the packet begins with an AppleTalk LLAP header. -.TP 5 -.BR DLT_PFLOG "; " LINKTYPE_PFLOG = 117 -OpenBSD pflog; the link-layer header contains a -.B "struct pfloghdr" -structure, as defined by the host on which the file was saved. (This -differs from operating system to operating system and release to -release; there is nothing in the file to indicate what the layout of -that structure is.) -.TP 5 -.BR DLT_PRISM_HEADER "; " LINKTYPE_PRISM_HEADER = 119 -Prism monitor mode information followed by an 802.11 header. -.TP 5 -.BR DLT_IP_OVER_FC "; " LINKTYPE_IP_OVER_FC = 122 -RFC 2625 IP-over-Fibre Channel, with the link-layer header being the -Network_Header as described in that RFC. -.TP 5 -.BR DLT_SUNATM "; " LINKTYPE_SUNATM = 123 -SunATM devices; the link-layer header contains, in order: -.RS 10 -.LP -a 1-byte flag field, containing a direction flag in the uppermost bit, -which is set for packets transmitted by the machine and clear for -packets received by the machine, and a 4-byte traffic type in the -low-order 4 bits, which is one of: -.RS 5 -.TP 5 -0 -raw traffic -.TP 5 -1 -LANE traffic -.TP 5 -2 -LLC-encapsulated traffic -.TP 5 -3 -MARS traffic -.TP 5 -4 -IFMP traffic -.TP 5 -5 -ILMI traffic -.TP 5 -6 -Q.2931 traffic -.RE -.LP -a 1-byte VPI value; -.LP -a 2-byte VCI field, in network byte order. -.RE -.TP 5 -.BR DLT_IEEE802_11_RADIO "; " LINKTYPE_IEEE802_11_RADIO = 127 -link-layer information followed by an 802.11 header - see -http://www.shaftnet.org/~pizza/software/capturefrm.txt for a description -of the link-layer information. -.TP 5 -.BR DLT_ARCNET_LINUX "; " LINKTYPE_ARCNET_LINUX = 129 -ARCNET, with no exception frames, reassembled packets rather than raw -frames, and an extra 16-bit offset field between the destination host -and type bytes. -.TP 5 -.BR DLT_LINUX_IRDA "; " LINKTYPE_LINUX_IRDA = 144 -Linux-IrDA packets, with a -.B DLT_LINUX_SLL -header followed by the IrLAP header. -.TP 5 -.BR DLT_LINUX_LAPD "; " LINKTYPE_LINUX_LAPD = 177 -LAPD (Q.921) frames, with a -.B DLT_LINUX_SLL -header captured via vISDN. -.RE +The link-layer header types supported by libpcap are described at +http://www.tcpdump.org/linktypes.html. .SH SEE ALSO pcap_datalink(3PCAP) diff --git a/contrib/libpcap/pcap-linux.c b/contrib/libpcap/pcap-linux.c index af125433f07..d4f50b7d16e 100644 --- a/contrib/libpcap/pcap-linux.c +++ b/contrib/libpcap/pcap-linux.c @@ -138,26 +138,6 @@ static const char rcsid[] _U_ = #include #include -/* - * Got Wireless Extensions? - */ -#ifdef HAVE_LINUX_WIRELESS_H -#include -#endif /* HAVE_LINUX_WIRELESS_H */ - -/* - * Got libnl? - */ -#ifdef HAVE_LIBNL -#include - -#include -#include -#include -#include -#include -#endif /* HAVE_LIBNL */ - #include "pcap-int.h" #include "pcap/sll.h" #include "pcap/vlan.h" @@ -186,6 +166,10 @@ static const char rcsid[] _U_ = #include "pcap-can-linux.h" #endif +#ifdef PCAP_SUPPORT_NETFILTER +#include "pcap-netfilter-linux.h" +#endif + /* * If PF_PACKET is defined, we can use {SOCK_RAW,SOCK_DGRAM}/PF_PACKET * sockets rather than SOCK_PACKET sockets. @@ -250,6 +234,46 @@ static const char rcsid[] _U_ = #include #endif +/* + * We need linux/sockios.h if we have linux/net_tstamp.h (for time stamp + * specification) or linux/ethtool.h (for ethtool ioctls to get offloading + * information). + */ +#if defined(HAVE_LINUX_NET_TSTAMP_H) || defined(HAVE_LINUX_ETHTOOL_H) +#include +#endif + +#ifdef HAVE_LINUX_NET_TSTAMP_H +#include +#endif + +/* + * Got Wireless Extensions? + */ +#ifdef HAVE_LINUX_WIRELESS_H +#include +#endif /* HAVE_LINUX_WIRELESS_H */ + +/* + * Got libnl? + */ +#ifdef HAVE_LIBNL +#include + +#include +#include +#include +#include +#include +#endif /* HAVE_LIBNL */ + +/* + * Got ethtool support? + */ +#ifdef HAVE_LINUX_ETHTOOL_H +#include +#endif + #ifndef HAVE_SOCKLEN_T typedef int socklen_t; #endif @@ -295,7 +319,7 @@ static short int map_packet_type_to_sll_type(short int); static int pcap_activate_linux(pcap_t *); static int activate_old(pcap_t *); static int activate_new(pcap_t *); -static int activate_mmap(pcap_t *); +static int activate_mmap(pcap_t *, int *); static int pcap_can_set_rfmon_linux(pcap_t *); static int pcap_read_linux(pcap_t *, int, pcap_handler, u_char *); static int pcap_read_packet(pcap_t *, pcap_handler, u_char *); @@ -315,7 +339,7 @@ union thdr { #define RING_GET_FRAME(h) (((union thdr **)h->buffer)[h->offset]) static void destroy_ring(pcap_t *handle); -static int create_ring(pcap_t *handle); +static int create_ring(pcap_t *handle, int *status); static int prepare_tpacket_socket(pcap_t *handle); static void pcap_cleanup_linux_mmap(pcap_t *); static int pcap_read_linux_mmap(pcap_t *, int, pcap_handler , u_char *); @@ -331,7 +355,7 @@ static void pcap_oneshot_mmap(u_char *user, const struct pcap_pkthdr *h, */ #ifdef HAVE_PF_PACKET_SOCKETS static int iface_get_id(int fd, const char *device, char *ebuf); -#endif +#endif /* HAVE_PF_PACKET_SOCKETS */ static int iface_get_mtu(int fd, const char *device, char *ebuf); static int iface_get_arptype(int fd, const char *device, char *ebuf); #ifdef HAVE_PF_PACKET_SOCKETS @@ -342,6 +366,7 @@ static int has_wext(int sock_fd, const char *device, char *ebuf); static int enter_rfmon_mode(pcap_t *handle, int sock_fd, const char *device); #endif /* HAVE_PF_PACKET_SOCKETS */ +static int iface_get_offload(pcap_t *handle); static int iface_bind_old(int fd, const char *device, char *ebuf); #ifdef SO_ATTACH_FILTER @@ -355,7 +380,7 @@ static struct sock_filter total_insn = BPF_STMT(BPF_RET | BPF_K, 0); static struct sock_fprog total_fcode = { 1, &total_insn }; -#endif +#endif /* SO_ATTACH_FILTER */ pcap_t * pcap_create(const char *device, char *ebuf) @@ -405,58 +430,85 @@ pcap_create(const char *device, char *ebuf) } #endif +#ifdef PCAP_SUPPORT_NETFILTER + if (strncmp(device, "nflog", strlen("nflog")) == 0) { + return nflog_create(device, ebuf); + } +#endif + handle = pcap_create_common(device, ebuf); if (handle == NULL) return NULL; handle->activate_op = pcap_activate_linux; handle->can_set_rfmon_op = pcap_can_set_rfmon_linux; +#if defined(HAVE_LINUX_NET_TSTAMP_H) && defined(PACKET_TIMESTAMP) + /* + * We claim that we support: + * + * software time stamps, with no details about their precision; + * hardware time stamps, synced to the host time; + * hardware time stamps, not synced to the host time. + * + * XXX - we can't ask a device whether it supports + * hardware time stamps, so we just claim all devices do. + */ + handle->tstamp_type_count = 3; + handle->tstamp_type_list = malloc(3 * sizeof(u_int)); + if (handle->tstamp_type_list == NULL) { + free(handle); + return NULL; + } + handle->tstamp_type_list[0] = PCAP_TSTAMP_HOST; + handle->tstamp_type_list[1] = PCAP_TSTAMP_ADAPTER; + handle->tstamp_type_list[2] = PCAP_TSTAMP_ADAPTER_UNSYNCED; +#endif + return handle; } #ifdef HAVE_LIBNL /* - * - * If interface {if} is a mac80211 driver, the file - * /sys/class/net/{if}/phy80211 is a symlink to - * /sys/class/ieee80211/{phydev}, for some {phydev}. - * - * On Fedora 9, with a 2.6.26.3-29 kernel, my Zydas stick, at - * least, has a "wmaster0" device and a "wlan0" device; the - * latter is the one with the IP address. Both show up in - * "tcpdump -D" output. Capturing on the wmaster0 device - * captures with 802.11 headers. - * - * airmon-ng searches through /sys/class/net for devices named - * monN, starting with mon0; as soon as one *doesn't* exist, - * it chooses that as the monitor device name. If the "iw" - * command exists, it does "iw dev {if} interface add {monif} - * type monitor", where {monif} is the monitor device. It - * then (sigh) sleeps .1 second, and then configures the - * device up. Otherwise, if /sys/class/ieee80211/{phydev}/add_iface - * is a file, it writes {mondev}, without a newline, to that file, - * and again (sigh) sleeps .1 second, and then iwconfig's that - * device into monitor mode and configures it up. Otherwise, - * you can't do monitor mode. - * - * All these devices are "glued" together by having the - * /sys/class/net/{device}/phy80211 links pointing to the same - * place, so, given a wmaster, wlan, or mon device, you can - * find the other devices by looking for devices with - * the same phy80211 link. - * - * To turn monitor mode off, delete the monitor interface, - * either with "iw dev {monif} interface del" or by sending - * {monif}, with no NL, down /sys/class/ieee80211/{phydev}/remove_iface - * - * Note: if you try to create a monitor device named "monN", and - * there's already a "monN" device, it fails, as least with - * the netlink interface (which is what iw uses), with a return - * value of -ENFILE. (Return values are negative errnos.) We - * could probably use that to find an unused device. - * - * Yes, you can have multiple monitor devices for a given - * physical device. + * If interface {if} is a mac80211 driver, the file + * /sys/class/net/{if}/phy80211 is a symlink to + * /sys/class/ieee80211/{phydev}, for some {phydev}. + * + * On Fedora 9, with a 2.6.26.3-29 kernel, my Zydas stick, at + * least, has a "wmaster0" device and a "wlan0" device; the + * latter is the one with the IP address. Both show up in + * "tcpdump -D" output. Capturing on the wmaster0 device + * captures with 802.11 headers. + * + * airmon-ng searches through /sys/class/net for devices named + * monN, starting with mon0; as soon as one *doesn't* exist, + * it chooses that as the monitor device name. If the "iw" + * command exists, it does "iw dev {if} interface add {monif} + * type monitor", where {monif} is the monitor device. It + * then (sigh) sleeps .1 second, and then configures the + * device up. Otherwise, if /sys/class/ieee80211/{phydev}/add_iface + * is a file, it writes {mondev}, without a newline, to that file, + * and again (sigh) sleeps .1 second, and then iwconfig's that + * device into monitor mode and configures it up. Otherwise, + * you can't do monitor mode. + * + * All these devices are "glued" together by having the + * /sys/class/net/{device}/phy80211 links pointing to the same + * place, so, given a wmaster, wlan, or mon device, you can + * find the other devices by looking for devices with + * the same phy80211 link. + * + * To turn monitor mode off, delete the monitor interface, + * either with "iw dev {monif} interface del" or by sending + * {monif}, with no NL, down /sys/class/ieee80211/{phydev}/remove_iface + * + * Note: if you try to create a monitor device named "monN", and + * there's already a "monN" device, it fails, as least with + * the netlink interface (which is what iw uses), with a return + * value of -ENFILE. (Return values are negative errnos.) We + * could probably use that to find an unused device. + * + * Yes, you can have multiple monitor devices for a given + * physical device. */ /* @@ -501,8 +553,41 @@ get_mac80211_phydev(pcap_t *handle, const char *device, char *phydev_path, return 1; } +#ifdef HAVE_LIBNL_2_x +#define get_nl_errmsg nl_geterror +#else +/* libnl 2.x compatibility code */ + +#define nl_sock nl_handle + +static inline struct nl_handle * +nl_socket_alloc(void) +{ + return nl_handle_alloc(); +} + +static inline void +nl_socket_free(struct nl_handle *h) +{ + nl_handle_destroy(h); +} + +#define get_nl_errmsg strerror + +static inline int +__genl_ctrl_alloc_cache(struct nl_handle *h, struct nl_cache **cache) +{ + struct nl_cache *tmp = genl_ctrl_alloc_cache(h); + if (!tmp) + return -ENOMEM; + *cache = tmp; + return 0; +} +#define genl_ctrl_alloc_cache __genl_ctrl_alloc_cache +#endif /* !HAVE_LIBNL_2_x */ + struct nl80211_state { - struct nl_handle *nl_handle; + struct nl_sock *nl_sock; struct nl_cache *nl_cache; struct genl_family *nl80211; }; @@ -510,23 +595,26 @@ struct nl80211_state { static int nl80211_init(pcap_t *handle, struct nl80211_state *state, const char *device) { - state->nl_handle = nl_handle_alloc(); - if (!state->nl_handle) { + int err; + + state->nl_sock = nl_socket_alloc(); + if (!state->nl_sock) { snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "%s: failed to allocate netlink handle", device); return PCAP_ERROR; } - if (genl_connect(state->nl_handle)) { + if (genl_connect(state->nl_sock)) { snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "%s: failed to connect to generic netlink", device); goto out_handle_destroy; } - state->nl_cache = genl_ctrl_alloc_cache(state->nl_handle); - if (!state->nl_cache) { + err = genl_ctrl_alloc_cache(state->nl_sock, &state->nl_cache); + if (err < 0) { snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, - "%s: failed to allocate generic netlink cache", device); + "%s: failed to allocate generic netlink cache: %s", + device, get_nl_errmsg(-err)); goto out_handle_destroy; } @@ -542,7 +630,7 @@ nl80211_init(pcap_t *handle, struct nl80211_state *state, const char *device) out_cache_free: nl_cache_free(state->nl_cache); out_handle_destroy: - nl_handle_destroy(state->nl_handle); + nl_socket_free(state->nl_sock); return PCAP_ERROR; } @@ -551,7 +639,7 @@ nl80211_cleanup(struct nl80211_state *state) { genl_family_put(state->nl80211); nl_cache_free(state->nl_cache); - nl_handle_destroy(state->nl_handle); + nl_socket_free(state->nl_sock); } static int @@ -579,12 +667,19 @@ add_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state, NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, mondevice); NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, NL80211_IFTYPE_MONITOR); - err = nl_send_auto_complete(state->nl_handle, msg); + err = nl_send_auto_complete(state->nl_sock, msg); if (err < 0) { +#ifdef HAVE_LIBNL_2_x + if (err == -NLE_FAILURE) { +#else if (err == -ENFILE) { +#endif /* * Device not available; our caller should just - * keep trying. + * keep trying. (libnl 2.x maps ENFILE to + * NLE_FAILURE; it can also map other errors + * to that, but there's not much we can do + * about that.) */ nlmsg_free(msg); return 0; @@ -595,17 +690,24 @@ add_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state, */ snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "%s: nl_send_auto_complete failed adding %s interface: %s", - device, mondevice, strerror(-err)); + device, mondevice, get_nl_errmsg(-err)); nlmsg_free(msg); return PCAP_ERROR; } } - err = nl_wait_for_ack(state->nl_handle); + err = nl_wait_for_ack(state->nl_sock); if (err < 0) { +#ifdef HAVE_LIBNL_2_x + if (err == -NLE_FAILURE) { +#else if (err == -ENFILE) { +#endif /* * Device not available; our caller should just - * keep trying. + * keep trying. (libnl 2.x maps ENFILE to + * NLE_FAILURE; it can also map other errors + * to that, but there's not much we can do + * about that.) */ nlmsg_free(msg); return 0; @@ -616,7 +718,7 @@ add_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state, */ snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "%s: nl_wait_for_ack failed adding %s interface: %s", - device, mondevice, strerror(-err)); + device, mondevice, get_nl_errmsg(-err)); nlmsg_free(msg); return PCAP_ERROR; } @@ -659,47 +761,21 @@ del_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state, 0, NL80211_CMD_DEL_INTERFACE, 0); NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex); - err = nl_send_auto_complete(state->nl_handle, msg); + err = nl_send_auto_complete(state->nl_sock, msg); if (err < 0) { - if (err == -ENFILE) { - /* - * Device not available; our caller should just - * keep trying. - */ - nlmsg_free(msg); - return 0; - } else { - /* - * Real failure, not just "that device is not - * available. - */ - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, - "%s: nl_send_auto_complete failed deleting %s interface: %s", - device, mondevice, strerror(-err)); - nlmsg_free(msg); - return PCAP_ERROR; - } + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: nl_send_auto_complete failed deleting %s interface: %s", + device, mondevice, get_nl_errmsg(-err)); + nlmsg_free(msg); + return PCAP_ERROR; } - err = nl_wait_for_ack(state->nl_handle); + err = nl_wait_for_ack(state->nl_sock); if (err < 0) { - if (err == -ENFILE) { - /* - * Device not available; our caller should just - * keep trying. - */ - nlmsg_free(msg); - return 0; - } else { - /* - * Real failure, not just "that device is not - * available. - */ - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, - "%s: nl_wait_for_ack failed adding %s interface: %s", - device, mondevice, strerror(-err)); - nlmsg_free(msg); - return PCAP_ERROR; - } + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: nl_wait_for_ack failed adding %s interface: %s", + device, mondevice, get_nl_errmsg(-err)); + nlmsg_free(msg); + return PCAP_ERROR; } /* @@ -785,6 +861,18 @@ added: nanosleep(&delay, NULL); #endif + /* + * If we haven't already done so, arrange to have + * "pcap_close_all()" called when we exit. + */ + if (!pcap_do_addexit(handle)) { + /* + * "atexit()" failed; don't put the interface + * in rfmon mode, just give up. + */ + return PCAP_ERROR_RFMON_NOTSUP; + } + /* * Now configure the monitor interface up. */ @@ -994,6 +1082,7 @@ static void pcap_cleanup_linux( pcap_t *handle ) int ret; #endif /* HAVE_LIBNL */ #ifdef IW_MODE_MONITOR + int oldflags; struct iwreq ireq; #endif /* IW_MODE_MONITOR */ @@ -1017,10 +1106,10 @@ static void pcap_cleanup_linux( pcap_t *handle ) sizeof(ifr.ifr_name)); if (ioctl(handle->fd, SIOCGIFFLAGS, &ifr) == -1) { fprintf(stderr, - "Can't restore interface flags (SIOCGIFFLAGS failed: %s).\n" + "Can't restore interface %s flags (SIOCGIFFLAGS failed: %s).\n" "Please adjust manually.\n" "Hint: This can't happen with Linux >= 2.2.0.\n", - strerror(errno)); + handle->md.device, strerror(errno)); } else { if (ifr.ifr_flags & IFF_PROMISC) { /* @@ -1031,9 +1120,10 @@ static void pcap_cleanup_linux( pcap_t *handle ) if (ioctl(handle->fd, SIOCSIFFLAGS, &ifr) == -1) { fprintf(stderr, - "Can't restore interface flags (SIOCSIFFLAGS failed: %s).\n" + "Can't restore interface %s flags (SIOCSIFFLAGS failed: %s).\n" "Please adjust manually.\n" "Hint: This can't happen with Linux >= 2.2.0.\n", + handle->md.device, strerror(errno)); } } @@ -1067,6 +1157,29 @@ static void pcap_cleanup_linux( pcap_t *handle ) * mode, this code cannot know that, so it'll take * it out of rfmon mode. */ + + /* + * First, take the interface down if it's up; + * otherwise, we might get EBUSY. + * If we get errors, just drive on and print + * a warning if we can't restore the mode. + */ + oldflags = 0; + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, handle->md.device, + sizeof(ifr.ifr_name)); + if (ioctl(handle->fd, SIOCGIFFLAGS, &ifr) != -1) { + if (ifr.ifr_flags & IFF_UP) { + oldflags = ifr.ifr_flags; + ifr.ifr_flags &= ~IFF_UP; + if (ioctl(handle->fd, SIOCSIFFLAGS, &ifr) == -1) + oldflags = 0; /* didn't set, don't restore */ + } + } + + /* + * Now restore the mode. + */ strncpy(ireq.ifr_ifrn.ifrn_name, handle->md.device, sizeof ireq.ifr_ifrn.ifrn_name); ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] @@ -1077,9 +1190,23 @@ static void pcap_cleanup_linux( pcap_t *handle ) * Scientist, you've failed. */ fprintf(stderr, - "Can't restore interface wireless mode (SIOCSIWMODE failed: %s).\n" + "Can't restore interface %s wireless mode (SIOCSIWMODE failed: %s).\n" "Please adjust manually.\n", - strerror(errno)); + handle->md.device, strerror(errno)); + } + + /* + * Now bring the interface back up if we brought + * it down. + */ + if (oldflags != 0) { + ifr.ifr_flags = oldflags; + if (ioctl(handle->fd, SIOCSIFFLAGS, &ifr) == -1) { + fprintf(stderr, + "Can't bring interface %s back up (SIOCSIFFLAGS failed: %s).\n" + "Please adjust manually.\n", + handle->md.device, strerror(errno)); + } } } #endif /* IW_MODE_MONITOR */ @@ -1167,34 +1294,46 @@ pcap_activate_linux(pcap_t *handle) * to be compatible with older kernels for a while so we are * trying both methods with the newer method preferred. */ - - if ((status = activate_new(handle)) == 1) { + status = activate_new(handle); + if (status < 0) { + /* + * Fatal error with the new way; just fail. + * status has the error return; if it's PCAP_ERROR, + * handle->errbuf has been set appropriately. + */ + goto fail; + } + if (status == 1) { /* * Success. * Try to use memory-mapped access. */ - switch (activate_mmap(handle)) { + switch (activate_mmap(handle, &status)) { case 1: - /* we succeeded; nothing more to do */ - return 0; + /* + * We succeeded. status has been + * set to the status to return, + * which might be 0, or might be + * a PCAP_WARNING_ value. + */ + return status; case 0: /* * Kernel doesn't support it - just continue * with non-memory-mapped access. */ - status = 0; break; case -1: /* - * We failed to set up to use it, or kernel - * supports it, but we failed to enable it; - * return an error. handle->errbuf contains - * an error message. + * We failed to set up to use it, or the kernel + * supports it, but we failed to enable it. + * status has been set to the error status to + * return and, if it's PCAP_ERROR, handle->errbuf + * contains the error message. */ - status = PCAP_ERROR; goto fail; } } @@ -1208,18 +1347,12 @@ pcap_activate_linux(pcap_t *handle) */ goto fail; } - } else { - /* - * Fatal error with the new way; just fail. - * status has the error return; if it's PCAP_ERROR, - * handle->errbuf has been set appropriately. - */ - goto fail; } /* * We set up the socket, but not with memory-mapped access. */ + status = 0; if (handle->opt.buffer_size != 0) { /* * Set the socket buffer size to the specified value. @@ -1814,8 +1947,20 @@ scan_sys_class_net(pcap_if_t **devlistp, char *errbuf) int ret = 1; sys_class_net_d = opendir("/sys/class/net"); - if (sys_class_net_d == NULL && errno == ENOENT) - return (0); + if (sys_class_net_d == NULL) { + /* + * Don't fail if it doesn't exist at all. + */ + if (errno == ENOENT) + return (0); + + /* + * Fail if we got some other error. + */ + (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + "Can't open /sys/class/net: %s", pcap_strerror(errno)); + return (-1); + } /* * Create a socket from which to fetch interface information. @@ -1824,6 +1969,7 @@ scan_sys_class_net(pcap_if_t **devlistp, char *errbuf) if (fd < 0) { (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, "socket: %s", pcap_strerror(errno)); + (void)closedir(sys_class_net_d); return (-1); } @@ -1883,7 +2029,7 @@ scan_sys_class_net(pcap_if_t **devlistp, char *errbuf) */ strncpy(ifrflags.ifr_name, name, sizeof(ifrflags.ifr_name)); if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifrflags) < 0) { - if (errno == ENXIO) + if (errno == ENXIO || errno == ENODEV) continue; (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, "SIOCGIFFLAGS: %.*s: %s", @@ -1947,8 +2093,20 @@ scan_proc_net_dev(pcap_if_t **devlistp, char *errbuf) int ret = 0; proc_net_f = fopen("/proc/net/dev", "r"); - if (proc_net_f == NULL && errno == ENOENT) - return (0); + if (proc_net_f == NULL) { + /* + * Don't fail if it doesn't exist at all. + */ + if (errno == ENOENT) + return (0); + + /* + * Fail if we got some other error. + */ + (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + "Can't open /proc/net/dev: %s", pcap_strerror(errno)); + return (-1); + } /* * Create a socket from which to fetch interface information. @@ -1957,6 +2115,7 @@ scan_proc_net_dev(pcap_if_t **devlistp, char *errbuf) if (fd < 0) { (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, "socket: %s", pcap_strerror(errno)); + (void)fclose(proc_net_f); return (-1); } @@ -2132,6 +2291,14 @@ pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf) return (-1); #endif +#ifdef PCAP_SUPPORT_NETFILTER + /* + * Add netfilter devices. + */ + if (netfilter_platform_finddevs(alldevsp, errbuf) < 0) + return (-1); +#endif + return (0); } @@ -2227,6 +2394,30 @@ pcap_setfilter_linux_common(pcap_t *handle, struct bpf_program *filter, } } + /* + * NOTE: at this point, we've set both the "len" and "filter" + * fields of "fcode". As of the 2.6.32.4 kernel, at least, + * those are the only members of the "sock_fprog" structure, + * so we initialize every member of that structure. + * + * If there is anything in "fcode" that is not initialized, + * it is either a field added in a later kernel, or it's + * padding. + * + * If a new field is added, this code needs to be updated + * to set it correctly. + * + * If there are no other fields, then: + * + * if the Linux kernel looks at the padding, it's + * buggy; + * + * if the Linux kernel doesn't look at the padding, + * then if some tool complains that we're passing + * uninitialized data to the kernel, then the tool + * is buggy and needs to understand that it's just + * padding. + */ if (can_filter_in_kernel) { if ((err = set_kernel_filter(handle, &fcode)) == 0) { @@ -2302,7 +2493,6 @@ pcap_setdirection_linux(pcap_t *handle, pcap_direction_t d) return -1; } - #ifdef HAVE_PF_PACKET_SOCKETS /* * Map the PACKET_ value to a LINUX_SLL_ value; we @@ -2649,6 +2839,13 @@ static void map_arphrd_to_dlt(pcap_t *handle, int arptype, int cooked_ok) handle->linktype = DLT_RAW; break; +#ifndef ARPHRD_IEEE802154 +#define ARPHRD_IEEE802154 804 +#endif + case ARPHRD_IEEE802154: + handle->linktype = DLT_IEEE802_15_4_NOFCS; + break; + default: handle->linktype = -1; break; @@ -2688,9 +2885,28 @@ activate_new(pcap_t *handle) socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (sock_fd == -1) { + if (errno == EINVAL || errno == EAFNOSUPPORT) { + /* + * We don't support PF_PACKET/SOCK_whatever + * sockets; try the old mechanism. + */ + return 0; + } + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "socket: %s", pcap_strerror(errno) ); - return 0; /* try old mechanism */ + if (errno == EPERM || errno == EACCES) { + /* + * You don't have permission to open the + * socket. + */ + return PCAP_ERROR_PERM_DENIED; + } else { + /* + * Other error. + */ + return PCAP_ERROR; + } } /* It seems the kernel supports the new interface. */ @@ -2787,7 +3003,18 @@ activate_new(pcap_t *handle) if (sock_fd == -1) { snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "socket: %s", pcap_strerror(errno)); - return PCAP_ERROR; + if (errno == EPERM || errno == EACCES) { + /* + * You don't have permission to + * open the socket. + */ + return PCAP_ERROR_PERM_DENIED; + } else { + /* + * Other error. + */ + return PCAP_ERROR; + } } handle->md.cooked = 1; @@ -2950,10 +3177,22 @@ activate_new(pcap_t *handle) #endif } -static int -activate_mmap(pcap_t *handle) -{ #ifdef HAVE_PACKET_RING +/* + * Attempt to activate with memory-mapped access. + * + * On success, returns 1, and sets *status to 0 if there are no warnings + * or to a PCAP_WARNING_ code if there is a warning. + * + * On failure due to lack of support for memory-mapped capture, returns + * 0. + * + * On error, returns -1, and sets *status to the appropriate error code; + * if that is PCAP_ERROR, sets handle->errbuf to the appropriate message. + */ +static int +activate_mmap(pcap_t *handle, int *status) +{ int ret; /* @@ -2965,7 +3204,8 @@ activate_mmap(pcap_t *handle) snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "can't allocate oneshot buffer: %s", pcap_strerror(errno)); - return PCAP_ERROR; + *status = PCAP_ERROR; + return -1; } if (handle->opt.buffer_size == 0) { @@ -2973,20 +3213,38 @@ activate_mmap(pcap_t *handle) handle->opt.buffer_size = 2*1024*1024; } ret = prepare_tpacket_socket(handle); - if (ret != 1) { + if (ret == -1) { free(handle->md.oneshot_buffer); + *status = PCAP_ERROR; return ret; } - ret = create_ring(handle); - if (ret != 1) { + ret = create_ring(handle, status); + if (ret == 0) { + /* + * We don't support memory-mapped capture; our caller + * will fall back on reading from the socket. + */ free(handle->md.oneshot_buffer); - return ret; + return 0; + } + if (ret == -1) { + /* + * Error attempting to enable memory-mapped capture; + * fail. create_ring() has set *status. + */ + free(handle->md.oneshot_buffer); + return -1; } - /* override some defaults and inherit the other fields from - * activate_new - * handle->offset is used to get the current position into the rx ring - * handle->cc is used to store the ring size */ + /* + * Success. *status has been set either to 0 if there are no + * warnings or to a PCAP_WARNING_ value if there is a warning. + * + * Override some defaults and inherit the other fields from + * activate_new. + * handle->offset is used to get the current position into the rx ring. + * handle->cc is used to store the ring size. + */ handle->read_op = pcap_read_linux_mmap; handle->cleanup_op = pcap_cleanup_linux_mmap; handle->setfilter_op = pcap_setfilter_linux_mmap; @@ -2995,12 +3253,21 @@ activate_mmap(pcap_t *handle) handle->oneshot_callback = pcap_oneshot_mmap; handle->selectable_fd = handle->fd; return 1; -#else /* HAVE_PACKET_RING */ - return 0; -#endif /* HAVE_PACKET_RING */ } +#else /* HAVE_PACKET_RING */ +static int +activate_mmap(pcap_t *handle _U_, int *status _U_) +{ + return 0; +} +#endif /* HAVE_PACKET_RING */ #ifdef HAVE_PACKET_RING +/* + * Attempt to set the socket to version 2 of the memory-mapped header. + * Return 1 if we succeed or if we fail because version 2 isn't + * supported; return -1 on any other error, and set handle->errbuf. + */ static int prepare_tpacket_socket(pcap_t *handle) { @@ -3052,20 +3319,140 @@ prepare_tpacket_socket(pcap_t *handle) return 1; } +/* + * Attempt to set up memory-mapped access. + * + * On success, returns 1, and sets *status to 0 if there are no warnings + * or to a PCAP_WARNING_ code if there is a warning. + * + * On failure due to lack of support for memory-mapped capture, returns + * 0. + * + * On error, returns -1, and sets *status to the appropriate error code; + * if that is PCAP_ERROR, sets handle->errbuf to the appropriate message. + */ static int -create_ring(pcap_t *handle) +create_ring(pcap_t *handle, int *status) { unsigned i, j, frames_per_block; struct tpacket_req req; + socklen_t len; + unsigned int sk_type, tp_reserve, maclen, tp_hdrlen, netoff, macoff; + unsigned int frame_size; - /* Note that with large snapshot (say 64K) only a few frames - * will be available in the ring even with pretty large ring size - * (and a lot of memory will be unused). - * The snap len should be carefully chosen to achive best - * performance */ - req.tp_frame_size = TPACKET_ALIGN(handle->snapshot + - TPACKET_ALIGN(handle->md.tp_hdrlen) + - sizeof(struct sockaddr_ll)); + /* + * Start out assuming no warnings or errors. + */ + *status = 0; + + /* Note that with large snapshot length (say 64K, which is the default + * for recent versions of tcpdump, the value that "-s 0" has given + * for a long time with tcpdump, and the default in Wireshark/TShark), + * if we use the snapshot length to calculate the frame length, + * only a few frames will be available in the ring even with pretty + * large ring size (and a lot of memory will be unused). + * + * Ideally, we should choose a frame length based on the + * minimum of the specified snapshot length and the maximum + * packet size. That's not as easy as it sounds; consider, for + * example, an 802.11 interface in monitor mode, where the + * frame would include a radiotap header, where the maximum + * radiotap header length is device-dependent. + * + * So, for now, we just do this for Ethernet devices, where + * there's no metadata header, and the link-layer header is + * fixed length. We can get the maximum packet size by + * adding 18, the Ethernet header length plus the CRC length + * (just in case we happen to get the CRC in the packet), to + * the MTU of the interface; we fetch the MTU in the hopes + * that it reflects support for jumbo frames. (Even if the + * interface is just being used for passive snooping, the driver + * might set the size of buffers in the receive ring based on + * the MTU, so that the MTU limits the maximum size of packets + * that we can receive.) + * + * We don't do that if segmentation/fragmentation or receive + * offload are enabled, so we don't get rudely surprised by + * "packets" bigger than the MTU. */ + frame_size = handle->snapshot; + if (handle->linktype == DLT_EN10MB) { + int mtu; + int offload; + + offload = iface_get_offload(handle); + if (offload == -1) { + *status = PCAP_ERROR; + return -1; + } + if (!offload) { + mtu = iface_get_mtu(handle->fd, handle->opt.source, + handle->errbuf); + if (mtu == -1) { + *status = PCAP_ERROR; + return -1; + } + if (frame_size > mtu + 18) + frame_size = mtu + 18; + } + } + + /* NOTE: calculus matching those in tpacket_rcv() + * in linux-2.6/net/packet/af_packet.c + */ + len = sizeof(sk_type); + if (getsockopt(handle->fd, SOL_SOCKET, SO_TYPE, &sk_type, &len) < 0) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "getsockopt: %s", pcap_strerror(errno)); + *status = PCAP_ERROR; + return -1; + } +#ifdef PACKET_RESERVE + len = sizeof(tp_reserve); + if (getsockopt(handle->fd, SOL_PACKET, PACKET_RESERVE, &tp_reserve, &len) < 0) { + if (errno != ENOPROTOOPT) { + /* + * ENOPROTOOPT means "kernel doesn't support + * PACKET_RESERVE", in which case we fall back + * as best we can. + */ + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "getsockopt: %s", pcap_strerror(errno)); + *status = PCAP_ERROR; + return -1; + } + tp_reserve = 0; /* older kernel, reserve not supported */ + } +#else + tp_reserve = 0; /* older kernel, reserve not supported */ +#endif + maclen = (sk_type == SOCK_DGRAM) ? 0 : MAX_LINKHEADER_SIZE; + /* XXX: in the kernel maclen is calculated from + * LL_ALLOCATED_SPACE(dev) and vnet_hdr.hdr_len + * in: packet_snd() in linux-2.6/net/packet/af_packet.c + * then packet_alloc_skb() in linux-2.6/net/packet/af_packet.c + * then sock_alloc_send_pskb() in linux-2.6/net/core/sock.c + * but I see no way to get those sizes in userspace, + * like for instance with an ifreq ioctl(); + * the best thing I've found so far is MAX_HEADER in the kernel + * part of linux-2.6/include/linux/netdevice.h + * which goes up to 128+48=176; since pcap-linux.c defines + * a MAX_LINKHEADER_SIZE of 256 which is greater than that, + * let's use it.. maybe is it even large enough to directly + * replace macoff.. + */ + tp_hdrlen = TPACKET_ALIGN(handle->md.tp_hdrlen) + sizeof(struct sockaddr_ll) ; + netoff = TPACKET_ALIGN(tp_hdrlen + (maclen < 16 ? 16 : maclen)) + tp_reserve; + /* NOTE: AFAICS tp_reserve may break the TPACKET_ALIGN of + * netoff, which contradicts + * linux-2.6/Documentation/networking/packet_mmap.txt + * documenting that: + * "- Gap, chosen so that packet data (Start+tp_net) + * aligns to TPACKET_ALIGNMENT=16" + */ + /* NOTE: in linux-2.6/include/linux/skbuff.h: + * "CPUs often take a performance hit + * when accessing unaligned memory locations" + */ + macoff = netoff - maclen; + req.tp_frame_size = TPACKET_ALIGN(macoff + frame_size); req.tp_frame_nr = handle->opt.buffer_size/req.tp_frame_size; /* compute the minumum block size that will handle this frame. @@ -3078,6 +3465,109 @@ create_ring(pcap_t *handle) frames_per_block = req.tp_block_size/req.tp_frame_size; + /* + * PACKET_TIMESTAMP was added after linux/net_tstamp.h was, + * so we check for PACKET_TIMESTAMP. We check for + * linux/net_tstamp.h just in case a system somehow has + * PACKET_TIMESTAMP but not linux/net_tstamp.h; that might + * be unnecessary. + * + * SIOCSHWTSTAMP was introduced in the patch that introduced + * linux/net_tstamp.h, so we don't bother checking whether + * SIOCSHWTSTAMP is defined (if your Linux system has + * linux/net_tstamp.h but doesn't define SIOCSHWTSTAMP, your + * Linux system is badly broken). + */ +#if defined(HAVE_LINUX_NET_TSTAMP_H) && defined(PACKET_TIMESTAMP) + /* + * If we were told to do so, ask the kernel and the driver + * to use hardware timestamps. + * + * Hardware timestamps are only supported with mmapped + * captures. + */ + if (handle->opt.tstamp_type == PCAP_TSTAMP_ADAPTER || + handle->opt.tstamp_type == PCAP_TSTAMP_ADAPTER_UNSYNCED) { + struct hwtstamp_config hwconfig; + struct ifreq ifr; + int timesource; + + /* + * Ask for hardware time stamps on all packets, + * including transmitted packets. + */ + memset(&hwconfig, 0, sizeof(hwconfig)); + hwconfig.tx_type = HWTSTAMP_TX_ON; + hwconfig.rx_filter = HWTSTAMP_FILTER_ALL; + + memset(&ifr, 0, sizeof(ifr)); + strcpy(ifr.ifr_name, handle->opt.source); + ifr.ifr_data = (void *)&hwconfig; + + if (ioctl(handle->fd, SIOCSHWTSTAMP, &ifr) < 0) { + switch (errno) { + + case EPERM: + /* + * Treat this as an error, as the + * user should try to run this + * with the appropriate privileges - + * and, if they can't, shouldn't + * try requesting hardware time stamps. + */ + *status = PCAP_ERROR_PERM_DENIED; + return -1; + + case EOPNOTSUPP: + /* + * Treat this as a warning, as the + * only way to fix the warning is to + * get an adapter that supports hardware + * time stamps. We'll just fall back + * on the standard host time stamps. + */ + *status = PCAP_WARNING_TSTAMP_TYPE_NOTSUP; + break; + + default: + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "SIOCSHWTSTAMP failed: %s", + pcap_strerror(errno)); + *status = PCAP_ERROR; + return -1; + } + } else { + /* + * Well, that worked. Now specify the type of + * hardware time stamp we want for this + * socket. + */ + if (handle->opt.tstamp_type == PCAP_TSTAMP_ADAPTER) { + /* + * Hardware timestamp, synchronized + * with the system clock. + */ + timesource = SOF_TIMESTAMPING_SYS_HARDWARE; + } else { + /* + * PCAP_TSTAMP_ADAPTER_UNSYNCED - hardware + * timestamp, not synchronized with the + * system clock. + */ + timesource = SOF_TIMESTAMPING_RAW_HARDWARE; + } + if (setsockopt(handle->fd, SOL_PACKET, PACKET_TIMESTAMP, + (void *)×ource, sizeof(timesource))) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "can't set PACKET_TIMESTAMP: %s", + pcap_strerror(errno)); + *status = PCAP_ERROR; + return -1; + } + } + } +#endif /* HAVE_LINUX_NET_TSTAMP_H && PACKET_TIMESTAMP */ + /* ask the kernel to create the ring */ retry: req.tp_block_nr = req.tp_frame_nr / frames_per_block; @@ -3112,6 +3602,7 @@ retry: snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "can't create rx ring on packet socket: %s", pcap_strerror(errno)); + *status = PCAP_ERROR; return -1; } @@ -3125,6 +3616,7 @@ retry: /* clear the allocated ring on error*/ destroy_ring(handle); + *status = PCAP_ERROR; return -1; } @@ -3137,6 +3629,7 @@ retry: pcap_strerror(errno)); destroy_ring(handle); + *status = PCAP_ERROR; return -1; } @@ -3813,6 +4306,8 @@ enter_rfmon_mode_wext(pcap_t *handle, int sock_fd, const char *device) monitor_type montype; int i; __u32 cmd; + struct ifreq ifr; + int oldflags; int args[2]; int channel; @@ -3822,6 +4317,13 @@ enter_rfmon_mode_wext(pcap_t *handle, int sock_fd, const char *device) err = has_wext(sock_fd, device, handle->errbuf); if (err <= 0) return err; /* either it doesn't or the device doesn't even exist */ + /* + * Start out assuming we have no private extensions to control + * radio metadata. + */ + montype = MONITOR_WEXT; + cmd = 0; + /* * Try to get all the Wireless Extensions private ioctls * supported by this device. @@ -3845,187 +4347,189 @@ enter_rfmon_mode_wext(pcap_t *handle, int sock_fd, const char *device) device); return PCAP_ERROR; } - if (errno == EOPNOTSUPP) { + if (errno != EOPNOTSUPP) { /* - * No private ioctls, so we assume that there's only one - * DLT_ for monitor mode. + * OK, it's not as if there are no private ioctls. */ - return 0; - } - if (errno != E2BIG) { + if (errno != E2BIG) { + /* + * Failed. + */ + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: SIOCGIWPRIV: %s", device, + pcap_strerror(errno)); + return PCAP_ERROR; + } + /* - * Failed. + * OK, try to get the list of private ioctls. */ - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, - "%s: SIOCGIWPRIV: %s", device, pcap_strerror(errno)); - return PCAP_ERROR; - } - priv = malloc(ireq.u.data.length * sizeof (struct iw_priv_args)); - if (priv == NULL) { - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, - "malloc: %s", pcap_strerror(errno)); - return PCAP_ERROR; - } - ireq.u.data.pointer = (void *)priv; - if (ioctl(sock_fd, SIOCGIWPRIV, &ireq) == -1) { - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, - "%s: SIOCGIWPRIV: %s", device, pcap_strerror(errno)); - free(priv); - return PCAP_ERROR; - } + priv = malloc(ireq.u.data.length * sizeof (struct iw_priv_args)); + if (priv == NULL) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "malloc: %s", pcap_strerror(errno)); + return PCAP_ERROR; + } + ireq.u.data.pointer = (void *)priv; + if (ioctl(sock_fd, SIOCGIWPRIV, &ireq) == -1) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: SIOCGIWPRIV: %s", device, + pcap_strerror(errno)); + free(priv); + return PCAP_ERROR; + } - /* - * Look for private ioctls to turn monitor mode on or, if - * monitor mode is on, to set the header type. - */ - montype = MONITOR_WEXT; - cmd = 0; - for (i = 0; i < ireq.u.data.length; i++) { - if (strcmp(priv[i].name, "monitor_type") == 0) { - /* - * Hostap driver, use this one. - * Set monitor mode first. - * You can set it to 0 to get DLT_IEEE80211, - * 1 to get DLT_PRISM, 2 to get - * DLT_IEEE80211_RADIO_AVS, and, with more - * recent versions of the driver, 3 to get - * DLT_IEEE80211_RADIO. - */ - if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT) - break; - if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED)) - break; - if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 1) - break; - montype = MONITOR_HOSTAP; - cmd = priv[i].cmd; - break; - } - if (strcmp(priv[i].name, "set_prismhdr") == 0) { - /* - * Prism54 driver, use this one. - * Set monitor mode first. - * You can set it to 2 to get DLT_IEEE80211 - * or 3 or get DLT_PRISM. - */ - if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT) - break; - if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED)) - break; - if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 1) - break; - montype = MONITOR_PRISM54; - cmd = priv[i].cmd; - break; - } - if (strcmp(priv[i].name, "forceprismheader") == 0) { - /* - * RT2570 driver, use this one. - * Do this after turning monitor mode on. - * You can set it to 1 to get DLT_PRISM or 2 - * to get DLT_IEEE80211. - */ - if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT) - break; - if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED)) - break; - if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 1) - break; - montype = MONITOR_RT2570; - cmd = priv[i].cmd; - break; - } - if (strcmp(priv[i].name, "forceprism") == 0) { - /* - * RT73 driver, use this one. - * Do this after turning monitor mode on. - * Its argument is a *string*; you can - * set it to "1" to get DLT_PRISM or "2" - * to get DLT_IEEE80211. - */ - if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_CHAR) - break; - if (priv[i].set_args & IW_PRIV_SIZE_FIXED) - break; - montype = MONITOR_RT73; - cmd = priv[i].cmd; - break; - } - if (strcmp(priv[i].name, "prismhdr") == 0) { - /* - * One of the RTL8xxx drivers, use this one. - * It can only be done after monitor mode - * has been turned on. You can set it to 1 - * to get DLT_PRISM or 0 to get DLT_IEEE80211. - */ - if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT) - break; - if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED)) - break; - if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 1) - break; - montype = MONITOR_RTL8XXX; - cmd = priv[i].cmd; - break; - } - if (strcmp(priv[i].name, "rfmontx") == 0) { - /* - * RT2500 or RT61 driver, use this one. - * It has one one-byte parameter; set - * u.data.length to 1 and u.data.pointer to - * point to the parameter. - * It doesn't itself turn monitor mode on. - * You can set it to 1 to allow transmitting - * in monitor mode(?) and get DLT_IEEE80211, - * or set it to 0 to disallow transmitting in - * monitor mode(?) and get DLT_PRISM. - */ - if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT) - break; - if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 2) - break; - montype = MONITOR_RT2500; - cmd = priv[i].cmd; - break; - } - if (strcmp(priv[i].name, "monitor") == 0) { - /* - * Either ACX100 or hostap, use this one. - * It turns monitor mode on. - * If it takes two arguments, it's ACX100; - * the first argument is 1 for DLT_PRISM - * or 2 for DLT_IEEE80211, and the second - * argument is the channel on which to - * run. If it takes one argument, it's - * HostAP, and the argument is 2 for - * DLT_IEEE80211 and 3 for DLT_PRISM. - * - * If we see this, we don't quit, as this - * might be a version of the hostap driver - * that also supports "monitor_type". - */ - if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT) - break; - if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED)) - break; - switch (priv[i].set_args & IW_PRIV_SIZE_MASK) { - - case 1: - montype = MONITOR_PRISM; + /* + * Look for private ioctls to turn monitor mode on or, if + * monitor mode is on, to set the header type. + */ + for (i = 0; i < ireq.u.data.length; i++) { + if (strcmp(priv[i].name, "monitor_type") == 0) { + /* + * Hostap driver, use this one. + * Set monitor mode first. + * You can set it to 0 to get DLT_IEEE80211, + * 1 to get DLT_PRISM, 2 to get + * DLT_IEEE80211_RADIO_AVS, and, with more + * recent versions of the driver, 3 to get + * DLT_IEEE80211_RADIO. + */ + if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT) + break; + if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED)) + break; + if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 1) + break; + montype = MONITOR_HOSTAP; cmd = priv[i].cmd; break; - - case 2: - montype = MONITOR_ACX100; - cmd = priv[i].cmd; - break; - - default: - break; + } + if (strcmp(priv[i].name, "set_prismhdr") == 0) { + /* + * Prism54 driver, use this one. + * Set monitor mode first. + * You can set it to 2 to get DLT_IEEE80211 + * or 3 or get DLT_PRISM. + */ + if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT) + break; + if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED)) + break; + if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 1) + break; + montype = MONITOR_PRISM54; + cmd = priv[i].cmd; + break; + } + if (strcmp(priv[i].name, "forceprismheader") == 0) { + /* + * RT2570 driver, use this one. + * Do this after turning monitor mode on. + * You can set it to 1 to get DLT_PRISM or 2 + * to get DLT_IEEE80211. + */ + if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT) + break; + if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED)) + break; + if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 1) + break; + montype = MONITOR_RT2570; + cmd = priv[i].cmd; + break; + } + if (strcmp(priv[i].name, "forceprism") == 0) { + /* + * RT73 driver, use this one. + * Do this after turning monitor mode on. + * Its argument is a *string*; you can + * set it to "1" to get DLT_PRISM or "2" + * to get DLT_IEEE80211. + */ + if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_CHAR) + break; + if (priv[i].set_args & IW_PRIV_SIZE_FIXED) + break; + montype = MONITOR_RT73; + cmd = priv[i].cmd; + break; + } + if (strcmp(priv[i].name, "prismhdr") == 0) { + /* + * One of the RTL8xxx drivers, use this one. + * It can only be done after monitor mode + * has been turned on. You can set it to 1 + * to get DLT_PRISM or 0 to get DLT_IEEE80211. + */ + if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT) + break; + if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED)) + break; + if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 1) + break; + montype = MONITOR_RTL8XXX; + cmd = priv[i].cmd; + break; + } + if (strcmp(priv[i].name, "rfmontx") == 0) { + /* + * RT2500 or RT61 driver, use this one. + * It has one one-byte parameter; set + * u.data.length to 1 and u.data.pointer to + * point to the parameter. + * It doesn't itself turn monitor mode on. + * You can set it to 1 to allow transmitting + * in monitor mode(?) and get DLT_IEEE80211, + * or set it to 0 to disallow transmitting in + * monitor mode(?) and get DLT_PRISM. + */ + if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT) + break; + if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 2) + break; + montype = MONITOR_RT2500; + cmd = priv[i].cmd; + break; + } + if (strcmp(priv[i].name, "monitor") == 0) { + /* + * Either ACX100 or hostap, use this one. + * It turns monitor mode on. + * If it takes two arguments, it's ACX100; + * the first argument is 1 for DLT_PRISM + * or 2 for DLT_IEEE80211, and the second + * argument is the channel on which to + * run. If it takes one argument, it's + * HostAP, and the argument is 2 for + * DLT_IEEE80211 and 3 for DLT_PRISM. + * + * If we see this, we don't quit, as this + * might be a version of the hostap driver + * that also supports "monitor_type". + */ + if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT) + break; + if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED)) + break; + switch (priv[i].set_args & IW_PRIV_SIZE_MASK) { + + case 1: + montype = MONITOR_PRISM; + cmd = priv[i].cmd; + break; + + case 2: + montype = MONITOR_ACX100; + cmd = priv[i].cmd; + break; + + default: + break; + } } } + free(priv); } - free(priv); /* * XXX - ipw3945? islism? @@ -4120,7 +4624,29 @@ enter_rfmon_mode_wext(pcap_t *handle, int sock_fd, const char *device) } /* - * First, turn monitor mode on. + * First, take the interface down if it's up; otherwise, we + * might get EBUSY. + */ + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name)); + if (ioctl(sock_fd, SIOCGIFFLAGS, &ifr) == -1) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: Can't get flags: %s", device, strerror(errno)); + return PCAP_ERROR; + } + oldflags = 0; + if (ifr.ifr_flags & IFF_UP) { + oldflags = ifr.ifr_flags; + ifr.ifr_flags &= ~IFF_UP; + if (ioctl(sock_fd, SIOCSIFFLAGS, &ifr) == -1) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: Can't set flags: %s", device, strerror(errno)); + return PCAP_ERROR; + } + } + + /* + * Then turn monitor mode on. */ strncpy(ireq.ifr_ifrn.ifrn_name, device, sizeof ireq.ifr_ifrn.ifrn_name); @@ -4129,7 +4655,14 @@ enter_rfmon_mode_wext(pcap_t *handle, int sock_fd, const char *device) if (ioctl(sock_fd, SIOCSIWMODE, &ireq) == -1) { /* * Scientist, you've failed. + * Bring the interface back up if we shut it down. */ + ifr.ifr_flags = oldflags; + if (ioctl(sock_fd, SIOCSIFFLAGS, &ifr) == -1) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: Can't set flags: %s", device, strerror(errno)); + return PCAP_ERROR; + } return PCAP_ERROR_RFMON_NOTSUP; } @@ -4291,6 +4824,32 @@ enter_rfmon_mode_wext(pcap_t *handle, int sock_fd, const char *device) break; } + /* + * Now bring the interface back up if we brought it down. + */ + if (oldflags != 0) { + ifr.ifr_flags = oldflags; + if (ioctl(sock_fd, SIOCSIFFLAGS, &ifr) == -1) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: Can't set flags: %s", device, strerror(errno)); + + /* + * At least try to restore the old mode on the + * interface. + */ + if (ioctl(handle->fd, SIOCSIWMODE, &ireq) == -1) { + /* + * Scientist, you've failed. + */ + fprintf(stderr, + "Can't restore interface wireless mode (SIOCSIWMODE failed: %s).\n" + "Please adjust manually.\n", + strerror(errno)); + } + return PCAP_ERROR; + } + } + /* * Note that we have to put the old mode back when we * close the device. @@ -4340,6 +4899,112 @@ enter_rfmon_mode(pcap_t *handle, int sock_fd, const char *device) return 0; } +/* + * Find out if we have any form of fragmentation/reassembly offloading. + * + * We do so using SIOCETHTOOL checking for various types of offloading; + * if SIOCETHTOOL isn't defined, or we don't have any #defines for any + * of the types of offloading, there's nothing we can do to check, so + * we just say "no, we don't". + */ +#if defined(SIOCETHTOOL) && (defined(ETHTOOL_GTSO) || defined(ETHTOOL_GUFO) || defined(ETHTOOL_GGSO) || defined(ETHTOOL_GFLAGS) || defined(ETHTOOL_GGRO)) +static int +iface_ethtool_ioctl(pcap_t *handle, int cmd, const char *cmdname) +{ + struct ifreq ifr; + struct ethtool_value eval; + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, handle->opt.source, sizeof(ifr.ifr_name)); + eval.cmd = cmd; + ifr.ifr_data = (caddr_t)&eval; + if (ioctl(handle->fd, SIOCETHTOOL, &ifr) == -1) { + if (errno == EOPNOTSUPP) { + /* + * OK, let's just return 0, which, in our + * case, either means "no, what we're asking + * about is not enabled" or "all the flags + * are clear (i.e., nothing is enabled)". + */ + return 0; + } + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: SIOETHTOOL(%s) ioctl failed: %s", handle->opt.source, + cmdname, strerror(errno)); + return -1; + } + return eval.data; +} + +static int +iface_get_offload(pcap_t *handle) +{ + int ret; + +#ifdef ETHTOOL_GTSO + ret = iface_ethtool_ioctl(handle, ETHTOOL_GTSO, "ETHTOOL_GTSO"); + if (ret == -1) + return -1; + if (ret) + return 1; /* TCP segmentation offloading on */ +#endif + +#ifdef ETHTOOL_GUFO + ret = iface_ethtool_ioctl(handle, ETHTOOL_GUFO, "ETHTOOL_GUFO"); + if (ret == -1) + return -1; + if (ret) + return 1; /* UDP fragmentation offloading on */ +#endif + +#ifdef ETHTOOL_GGSO + /* + * XXX - will this cause large unsegmented packets to be + * handed to PF_PACKET sockets on transmission? If not, + * this need not be checked. + */ + ret = iface_ethtool_ioctl(handle, ETHTOOL_GGSO, "ETHTOOL_GGSO"); + if (ret == -1) + return -1; + if (ret) + return 1; /* generic segmentation offloading on */ +#endif + +#ifdef ETHTOOL_GFLAGS + ret = iface_ethtool_ioctl(handle, ETHTOOL_GFLAGS, "ETHTOOL_GFLAGS"); + if (ret == -1) + return -1; + if (ret & ETH_FLAG_LRO) + return 1; /* large receive offloading on */ +#endif + +#ifdef ETHTOOL_GGRO + /* + * XXX - will this cause large reassembled packets to be + * handed to PF_PACKET sockets on receipt? If not, + * this need not be checked. + */ + ret = iface_ethtool_ioctl(handle, ETHTOOL_GGRO, "ETHTOOL_GGRO"); + if (ret == -1) + return -1; + if (ret) + return 1; /* generic (large) receive offloading on */ +#endif + + return 0; +} +#else /* SIOCETHTOOL */ +static int +iface_get_offload(pcap_t *handle _U_) +{ + /* + * XXX - do we need to get this information if we don't + * have the ethtool ioctls? If so, how do we do that? + */ + return 0; +} +#endif /* SIOCETHTOOL */ + #endif /* HAVE_PF_PACKET_SOCKETS */ /* ===== Functions to interface to the older kernels ================== */ @@ -4363,7 +5028,18 @@ activate_old(pcap_t *handle) if (handle->fd == -1) { snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "socket: %s", pcap_strerror(errno)); - return PCAP_ERROR_PERM_DENIED; + if (errno == EPERM || errno == EACCES) { + /* + * You don't have permission to open the + * socket. + */ + return PCAP_ERROR_PERM_DENIED; + } else { + /* + * Other error. + */ + return PCAP_ERROR; + } } /* It worked - we are using the old interface */ diff --git a/contrib/libpcap/pcap-netfilter-linux.c b/contrib/libpcap/pcap-netfilter-linux.c new file mode 100644 index 00000000000..225e49f904e --- /dev/null +++ b/contrib/libpcap/pcap-netfilter-linux.c @@ -0,0 +1,468 @@ +/* + * Copyright (c) 2011 Jakub Zawadzki + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcap-int.h" + +#ifdef NEED_STRERROR_H +#include "strerror.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "pcap-netfilter-linux.h" + +#define HDR_LENGTH (NLMSG_LENGTH(NLMSG_ALIGN(sizeof(struct nfgenmsg)))) + +#define NFLOG_IFACE "nflog" + +static int +nflog_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user) +{ + const unsigned char *buf; + int count = 0; + int len; + + /* ignore interrupt system call error */ + do { + len = recv(handle->fd, handle->buffer, handle->bufsize, 0); + if (handle->break_loop) { + handle->break_loop = 0; + return -2; + } + } while ((len == -1) && (errno == EINTR)); + + if (len < 0) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't receive packet %d:%s", errno, pcap_strerror(errno)); + return -1; + } + + buf = handle->buffer; + while (len >= NLMSG_SPACE(0)) { + const struct nlmsghdr *nlh = (const struct nlmsghdr *) buf; + u_int32_t msg_len; + + if (nlh->nlmsg_len < sizeof(struct nlmsghdr) || len < nlh->nlmsg_len) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Message truncated: (got: %d) (nlmsg_len: %u)", len, nlh->nlmsg_len); + return -1; + } + + if (NFNL_SUBSYS_ID(nlh->nlmsg_type) == NFNL_SUBSYS_ULOG && + NFNL_MSG_TYPE(nlh->nlmsg_type) == NFULNL_MSG_PACKET) + { + const unsigned char *payload = NULL; + struct pcap_pkthdr pkth; + + if (handle->linktype != DLT_NFLOG) { + const struct nfattr *payload_attr = NULL; + + if (nlh->nlmsg_len < HDR_LENGTH) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Malformed message: (nlmsg_len: %u)", nlh->nlmsg_len); + return -1; + } + + if (nlh->nlmsg_len > HDR_LENGTH) { + struct nfattr *attr = NFM_NFA(NLMSG_DATA(nlh)); + int attr_len = nlh->nlmsg_len - NLMSG_ALIGN(HDR_LENGTH); + + while (NFA_OK(attr, attr_len)) { + switch (NFA_TYPE(attr)) { + case NFULA_PAYLOAD: + payload_attr = attr; + break; + } + attr = NFA_NEXT(attr, attr_len); + } + } + + if (payload_attr) { + payload = NFA_DATA(payload_attr); + pkth.len = pkth.caplen = NFA_PAYLOAD(payload_attr); + } + + } else { + payload = NLMSG_DATA(nlh); + pkth.caplen = pkth.len = nlh->nlmsg_len-NLMSG_ALIGN(sizeof(struct nlmsghdr)); + } + + if (payload) { + /* pkth.caplen = min (payload_len, handle->snapshot); */ + + gettimeofday(&pkth.ts, NULL); + if (handle->fcode.bf_insns == NULL || + bpf_filter(handle->fcode.bf_insns, payload, pkth.len, pkth.caplen)) + { + handle->md.packets_read++; + callback(user, &pkth, payload); + count++; + } + } + } + + msg_len = NLMSG_ALIGN(nlh->nlmsg_len); + if (msg_len > len) + msg_len = len; + + len -= msg_len; + buf += msg_len; + } + return count; +} + +static int +netfilter_set_datalink(pcap_t *handle, int dlt) +{ + handle->linktype = dlt; + return 0; +} + +static int +netfilter_stats_linux(pcap_t *handle, struct pcap_stat *stats) +{ + stats->ps_recv = handle->md.packets_read; + stats->ps_drop = 0; + stats->ps_ifdrop = 0; + return 0; +} + +static int +netfilter_inject_linux(pcap_t *handle, const void *buf, size_t size) +{ + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "inject not supported on netfilter devices"); + return (-1); +} + +struct my_nfattr { + u_int16_t nfa_len; + u_int16_t nfa_type; + void *data; +}; + +static int +nflog_send_config_msg(const pcap_t *handle, u_int8_t family, u_int16_t res_id, const struct my_nfattr *mynfa) +{ + char buf[1024] __attribute__ ((aligned)); + + struct nlmsghdr *nlh = (struct nlmsghdr *) buf; + struct nfgenmsg *nfg = (struct nfgenmsg *) (buf + sizeof(struct nlmsghdr)); + + struct sockaddr_nl snl; + static unsigned int seq_id; + + if (!seq_id) + seq_id = time(NULL); + ++seq_id; + + nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct nfgenmsg)); + nlh->nlmsg_type = (NFNL_SUBSYS_ULOG << 8) | NFULNL_MSG_CONFIG; + nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; + nlh->nlmsg_pid = 0; /* to kernel */ + nlh->nlmsg_seq = seq_id; + + nfg->nfgen_family = family; + nfg->version = NFNETLINK_V0; + nfg->res_id = htons(res_id); + + if (mynfa) { + struct nfattr *nfa = (struct nfattr *) (buf + NLMSG_ALIGN(nlh->nlmsg_len)); + + nfa->nfa_type = mynfa->nfa_type; + nfa->nfa_len = NFA_LENGTH(mynfa->nfa_len); + memcpy(NFA_DATA(nfa), mynfa->data, mynfa->nfa_len); + nlh->nlmsg_len = NLMSG_ALIGN(nlh->nlmsg_len) + NFA_ALIGN(nfa->nfa_len); + } + + memset(&snl, 0, sizeof(snl)); + snl.nl_family = AF_NETLINK; + + if (sendto(handle->fd, nlh, nlh->nlmsg_len, 0, (struct sockaddr *) &snl, sizeof(snl)) == -1) + return -1; + + /* waiting for reply loop */ + do { + socklen_t addrlen = sizeof(snl); + int len; + + /* ignore interrupt system call error */ + do { + len = recvfrom(handle->fd, buf, sizeof(buf), 0, (struct sockaddr *) &snl, &addrlen); + } while ((len == -1) && (errno == EINTR)); + + if (len <= 0) + return len; + + if (addrlen != sizeof(snl) || snl.nl_family != AF_NETLINK) { + errno = EINVAL; + return -1; + } + + nlh = (struct nlmsghdr *) buf; + if (snl.nl_pid != 0 || seq_id != nlh->nlmsg_seq) /* if not from kernel or wrong sequence skip */ + continue; + + while (len >= NLMSG_SPACE(0) && NLMSG_OK(nlh, len)) { + if (nlh->nlmsg_type == NLMSG_ERROR || (nlh->nlmsg_type == NLMSG_DONE && nlh->nlmsg_flags & NLM_F_MULTI)) { + if (nlh->nlmsg_len < NLMSG_ALIGN(sizeof(struct nlmsgerr))) { + errno = EBADMSG; + return -1; + } + errno = -(*((int *)NLMSG_DATA(nlh))); + return (errno == 0) ? 0 : -1; + } + nlh = NLMSG_NEXT(nlh, len); + } + } while (1); + + return -1; /* never here */ +} + +static int +nflog_send_config_cmd(const pcap_t *handle, u_int16_t group_id, u_int8_t cmd, u_int8_t family) +{ + struct nfulnl_msg_config_cmd msg; + struct my_nfattr nfa; + + msg.command = cmd; + + nfa.data = &msg; + nfa.nfa_type = NFULA_CFG_CMD; + nfa.nfa_len = sizeof(msg); + + return nflog_send_config_msg(handle, family, group_id, &nfa); +} + +static int +nflog_send_config_mode(const pcap_t *handle, u_int16_t group_id, u_int8_t copy_mode, u_int32_t copy_range) +{ + struct nfulnl_msg_config_mode msg; + struct my_nfattr nfa; + + msg.copy_range = htonl(copy_range); + msg.copy_mode = copy_mode; + + nfa.data = &msg; + nfa.nfa_type = NFULA_CFG_MODE; + nfa.nfa_len = sizeof(msg); + + return nflog_send_config_msg(handle, AF_UNSPEC, group_id, &nfa); +} + +static int +nflog_activate(pcap_t* handle) +{ + const char *dev = handle->opt.source; + unsigned short groups[32]; + int group_count = 0; + int i; + + if (strncmp(dev, NFLOG_IFACE, strlen(NFLOG_IFACE)) == 0) { + dev += strlen(NFLOG_IFACE); + + /* nflog:30,33,42 looks nice, allow it */ + if (*dev == ':') + dev++; + + while (*dev) { + long int group_id; + char *end_dev; + + if (group_count == 32) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "Maximum 32 netfilter groups! dev: %s", + handle->opt.source); + return PCAP_ERROR; + } + + group_id = strtol(dev, &end_dev, 0); + if (end_dev != dev) { + if (group_id < 0 || group_id > 65535) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "Netfilter group range from 0 to 65535 (got %ld)", + group_id); + return PCAP_ERROR; + } + + groups[group_count++] = (unsigned short) group_id; + dev = end_dev; + } + if (*dev != ',') + break; + dev++; + } + } + + if (*dev) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "Can't get netfilter group(s) index from %s", + handle->opt.source); + return PCAP_ERROR; + } + + /* if no groups, add default: 0 */ + if (!group_count) { + groups[0] = 0; + group_count = 1; + } + + /* Initialize some components of the pcap structure. */ + handle->bufsize = 128 + handle->snapshot; + handle->offset = 0; + handle->linktype = DLT_NFLOG; + handle->read_op = nflog_read_linux; + handle->inject_op = netfilter_inject_linux; + handle->setfilter_op = install_bpf_program; /* no kernel filtering */ + handle->setdirection_op = NULL; + handle->set_datalink_op = NULL; + handle->set_datalink_op = netfilter_set_datalink; + handle->getnonblock_op = pcap_getnonblock_fd; + handle->setnonblock_op = pcap_setnonblock_fd; + handle->stats_op = netfilter_stats_linux; + + /* Create netlink socket */ + handle->fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER); + if (handle->fd < 0) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't create raw socket %d:%s", errno, pcap_strerror(errno)); + return PCAP_ERROR; + } + + handle->dlt_list = (u_int *) malloc(sizeof(u_int) * 2); + if (handle->dlt_list != NULL) { + handle->dlt_list[0] = DLT_NFLOG; + handle->dlt_list[1] = DLT_IPV4; + handle->dlt_count = 2; + } + + handle->buffer = malloc(handle->bufsize); + if (!handle->buffer) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't allocate dump buffer: %s", pcap_strerror(errno)); + goto close_fail; + } + + if (nflog_send_config_cmd(handle, 0, NFULNL_CFG_CMD_PF_UNBIND, AF_INET) < 0) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "NFULNL_CFG_CMD_PF_UNBIND: %s", pcap_strerror(errno)); + goto close_fail; + } + + if (nflog_send_config_cmd(handle, 0, NFULNL_CFG_CMD_PF_BIND, AF_INET) < 0) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "NFULNL_CFG_CMD_PF_BIND: %s", pcap_strerror(errno)); + goto close_fail; + } + + /* Bind socket to the nflog groups */ + for (i = 0; i < group_count; i++) { + if (nflog_send_config_cmd(handle, groups[i], NFULNL_CFG_CMD_BIND, AF_UNSPEC) < 0) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't listen on group group index: %s", pcap_strerror(errno)); + goto close_fail; + } + + if (nflog_send_config_mode(handle, groups[i], NFULNL_COPY_PACKET, handle->snapshot) < 0) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "NFULNL_COPY_PACKET: %s", pcap_strerror(errno)); + goto close_fail; + } + } + + if (handle->opt.rfmon) { + /* + * Monitor mode doesn't apply to netfilter devices. + */ + pcap_cleanup_live_common(handle); + return PCAP_ERROR_RFMON_NOTSUP; + } + + if (handle->opt.buffer_size != 0) { + /* + * Set the socket buffer size to the specified value. + */ + if (setsockopt(handle->fd, SOL_SOCKET, SO_RCVBUF, &handle->opt.buffer_size, sizeof(handle->opt.buffer_size)) == -1) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "SO_RCVBUF: %s", pcap_strerror(errno)); + goto close_fail; + } + } + + handle->selectable_fd = handle->fd; + return 0; + +close_fail: + pcap_cleanup_live_common(handle); + return PCAP_ERROR; +} + +pcap_t * +nflog_create(const char *device, char *ebuf) +{ + pcap_t *p; + + p = pcap_create_common(device, ebuf); + if (p == NULL) + return (NULL); + + p->activate_op = nflog_activate; + return (p); +} + +int +netfilter_platform_finddevs(pcap_if_t **alldevsp, char *err_str) +{ + pcap_if_t *found_dev = *alldevsp; + int sock; + + sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER); + if (sock < 0) { + /* if netlink is not supported this this is not fatal */ + if (errno == EAFNOSUPPORT) + return 0; + snprintf(err_str, PCAP_ERRBUF_SIZE, "Can't open netlink socket %d:%s", + errno, pcap_strerror(errno)); + return -1; + } + close(sock); + + if (pcap_add_if(&found_dev, NFLOG_IFACE, 0, "Linux netfilter log (NFLOG) interface", err_str) < 0) + return -1; + return 0; +} + diff --git a/contrib/libpcap/pcap-netfilter-linux.h b/contrib/libpcap/pcap-netfilter-linux.h new file mode 100644 index 00000000000..dd76b8a4350 --- /dev/null +++ b/contrib/libpcap/pcap-netfilter-linux.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2011 Jakub Zawadzki + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Prototypes for netlink-related functions + */ +int netfilter_platform_finddevs(pcap_if_t **alldevsp, char *err_str); +pcap_t *nflog_create(const char *device, char *ebuf); diff --git a/contrib/libpcap/pcap-savefile.manfile b/contrib/libpcap/pcap-savefile.manfile index 21fdb2e8f35..1d0f33c8ed8 100644 --- a/contrib/libpcap/pcap-savefile.manfile +++ b/contrib/libpcap/pcap-savefile.manfile @@ -1,5 +1,5 @@ '\" t -.\" @(#) $Header: /tcpdump/master/libpcap/pcap-savefile.manfile.in,v 1.1.2.3 2008-10-24 07:34:06 guy Exp $ +.\" @(#) $Header: /tcpdump/master/libpcap/pcap-savefile.manfile.in,v 1.2 2008-10-24 07:33:50 guy Exp $ .\" .\" Copyright (c) 1994, 1996, 1997 .\" The Regents of the University of California. All rights reserved. diff --git a/contrib/libpcap/pcap-stdinc.h b/contrib/libpcap/pcap-stdinc.h index f025013ce30..f1c736e50ef 100644 --- a/contrib/libpcap/pcap-stdinc.h +++ b/contrib/libpcap/pcap-stdinc.h @@ -33,13 +33,6 @@ #ifndef pcap_stdinc_h #define pcap_stdinc_h -#define SIZEOF_CHAR 1 -#define SIZEOF_SHORT 2 -#define SIZEOF_INT 4 -#ifndef _MSC_EXTENSIONS -#define SIZEOF_LONG_LONG 8 -#endif - /* * Avoids a compiler warning in case this was already defined * (someone defined _WINSOCKAPI_ when including 'windows.h', in order diff --git a/contrib/libpcap/pcap-tstamp.manmisc b/contrib/libpcap/pcap-tstamp.manmisc new file mode 100644 index 00000000000..d66a39781d2 --- /dev/null +++ b/contrib/libpcap/pcap-tstamp.manmisc @@ -0,0 +1,132 @@ +.\" +.\" Copyright (c) 1987, 1988, 1989, 1990, 1991, 1992, 1994, 1995, 1996, 1997 +.\" The Regents of the University of California. All rights reserved. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that: (1) source code distributions +.\" retain the above copyright notice and this paragraph in its entirety, (2) +.\" distributions including binary code include the above copyright notice and +.\" this paragraph in its entirety in the documentation or other materials +.\" provided with the distribution, and (3) all advertising materials mentioning +.\" features or use of this software display the following acknowledgement: +.\" ``This product includes software developed by the University of California, +.\" Lawrence Berkeley Laboratory and its contributors.'' Neither the name of +.\" the University nor the names of its contributors may be used to endorse +.\" or promote products derived from this software without specific prior +.\" written permission. +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +.\" +.TH PCAP-TSTAMP 7 "22 August 2010" +.SH NAME +pcap-tstamp \- packet time stamps in libpcap +.SH DESCRIPTION +When capturing traffic, each packet is given a time stamp representing, +for incoming packets, the arrival time of the packet and, for outgoing +packets, the transmission time of the packet. This time is an +approximation of the arrival or transmission time. If it is supplied by +the operating system running on the host on which the capture is being +done, there are several reasons why it might not precisely represent the +arrival or transmission time: +.IP +if the time stamp is applied to the packet when the networking stack +receives the packet, the networking stack might not see the packet until +an interrupt is delivered for the packet or a timer event causes the +networking device driver to poll for packets, and the time stamp might +not be applied until the packet has had some processing done by other +code in the networking stack, so there might be a significant delay +between the time when the last bit of the packet is received by the +capture device and when the networking stack time-stamps the packet; +.IP +the timer used to generate the time stamps might have low resolution, +for example, it might be a timer updated once per host operating system +timer tick, with the host operating system timer ticking once every few +milliseconds; +.IP +a high-resolution timer might use a counter that runs at a rate +dependent on the processor clock speed, and that clock speed might be +adjusted upwards or downwards over time and the timer might not be able +to compensate for all those adjustments; +.IP +the host operating system's clock might be adjusted over time to match a +time standard to which the host is being synchronized, which might be +done by temporarily slowing down or speeding up the clock or by making a +single adjustment; +.IP +different CPU cores on a multi-core or multi-processor system might be +running at different speeds, or might not have time counters all +synchronized, so packets time-stamped by different cores might not have +consistent time stamps. +.LP +In addition, packets time-stamped by different cores might be +time-stamped in one order and added to the queue of packets for libpcap +to read in another order, so time stamps might not be monotonically +increasing. +.LP +Some capture devices on some platforms can provide time stamps for +packets; those time stamps are usually high-resolution time stamps, and +are usually applied to the packet when the first or last bit of the +packet arrives, and are thus more accurate than time stamps provided by +the host operating system. Those time stamps might not, however, be +synchronized with the host operating system's clock, so that, for +example, the time stamp of a packet might not correspond to the time +stamp of an event on the host triggered by the arrival of that packet. +.LP +Depending on the capture device and the software on the host, libpcap +might allow different types of time stamp to be used. The +.BR pcap_list_tstamp_types (3PCAP) +routine provides, for a packet capture handle created by +.BR pcap_create (3PCAP) +but not yet activated by +.BR pcap_activate (3PCAP), +a list of time stamp types supported by the capture device for that +handle. +The list might be empty, in which case no choice of time stamp type is +offered for that capture device. If the list is not empty, the +.BR pcap_set_tstamp_type (3PCAP) +routine can be used after a +.B pcap_create() +call and before a +.B pcap_activate() +call to specify the type of time stamp to be used on the device. +The time stamp types are listed here; the first value is the #define to +use in code, the second value is the value returned by +.B pcap_tstamp_type_val_to_name() +and accepted by +.BR pcap_tstamp_name_to_val() . +.RS 5 +.TP 5 +.BR PCAP_TSTAMP_HOST " - " host +Time stamp provided by the host on which the capture is being done. The +precision of this time stamp is unspecified; it might or might not be +synchronized with the host operating system's clock. +.TP 5 +.BR PCAP_TSTAMP_HOST_LOWPREC " - " host_lowprec +Time stamp provided by the host on which the capture is being done. +This is a low-precision time stamp, synchronized with the host operating +system's clock. +.TP 5 +.BR PCAP_TSTAMP_HOST_HIPREC " - " host_hiprec +Time stamp provided by the host on which the capture is being done. +This is a high-precision time stamp; it might or might not be +synchronized with the host operating system's clock. It might be more +expensive to fetch than +.BR PCAP_TSTAMP_HOST_LOWPREC . +.TP 5 +.BR PCAP_TSTAMP_ADAPTER " - " adapter +Time stamp provided by the network adapter on which the capture is being +done. This is a high-precision time stamp, synchronized with the host +operating system's clock. +.TP 5 +.BR PCAP_TSTAMP_ADAPTER_UNSYNCED " - " adapter_unsynced +Time stamp provided by the network adapter on which the capture is being +done. This is a high-precision time stamp; it is not synchronized with +the host operating system's clock. +.RE +.SH SEE ALSO +pcap_set_tstamp_type(3PCAP), +pcap_list_tstamp_types(3PCAP), +pcap_tstamp_type_val_to_name(3PCAP), +pcap_tstamp_name_to_val(3PCAP) diff --git a/contrib/libpcap/pcap-tstamp.manmisc.in b/contrib/libpcap/pcap-tstamp.manmisc.in new file mode 100644 index 00000000000..2cd32c62136 --- /dev/null +++ b/contrib/libpcap/pcap-tstamp.manmisc.in @@ -0,0 +1,132 @@ +.\" +.\" Copyright (c) 1987, 1988, 1989, 1990, 1991, 1992, 1994, 1995, 1996, 1997 +.\" The Regents of the University of California. All rights reserved. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that: (1) source code distributions +.\" retain the above copyright notice and this paragraph in its entirety, (2) +.\" distributions including binary code include the above copyright notice and +.\" this paragraph in its entirety in the documentation or other materials +.\" provided with the distribution, and (3) all advertising materials mentioning +.\" features or use of this software display the following acknowledgement: +.\" ``This product includes software developed by the University of California, +.\" Lawrence Berkeley Laboratory and its contributors.'' Neither the name of +.\" the University nor the names of its contributors may be used to endorse +.\" or promote products derived from this software without specific prior +.\" written permission. +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +.\" +.TH PCAP-TSTAMP @MAN_MISC_INFO@ "22 August 2010" +.SH NAME +pcap-tstamp \- packet time stamps in libpcap +.SH DESCRIPTION +When capturing traffic, each packet is given a time stamp representing, +for incoming packets, the arrival time of the packet and, for outgoing +packets, the transmission time of the packet. This time is an +approximation of the arrival or transmission time. If it is supplied by +the operating system running on the host on which the capture is being +done, there are several reasons why it might not precisely represent the +arrival or transmission time: +.IP +if the time stamp is applied to the packet when the networking stack +receives the packet, the networking stack might not see the packet until +an interrupt is delivered for the packet or a timer event causes the +networking device driver to poll for packets, and the time stamp might +not be applied until the packet has had some processing done by other +code in the networking stack, so there might be a significant delay +between the time when the last bit of the packet is received by the +capture device and when the networking stack time-stamps the packet; +.IP +the timer used to generate the time stamps might have low resolution, +for example, it might be a timer updated once per host operating system +timer tick, with the host operating system timer ticking once every few +milliseconds; +.IP +a high-resolution timer might use a counter that runs at a rate +dependent on the processor clock speed, and that clock speed might be +adjusted upwards or downwards over time and the timer might not be able +to compensate for all those adjustments; +.IP +the host operating system's clock might be adjusted over time to match a +time standard to which the host is being synchronized, which might be +done by temporarily slowing down or speeding up the clock or by making a +single adjustment; +.IP +different CPU cores on a multi-core or multi-processor system might be +running at different speeds, or might not have time counters all +synchronized, so packets time-stamped by different cores might not have +consistent time stamps. +.LP +In addition, packets time-stamped by different cores might be +time-stamped in one order and added to the queue of packets for libpcap +to read in another order, so time stamps might not be monotonically +increasing. +.LP +Some capture devices on some platforms can provide time stamps for +packets; those time stamps are usually high-resolution time stamps, and +are usually applied to the packet when the first or last bit of the +packet arrives, and are thus more accurate than time stamps provided by +the host operating system. Those time stamps might not, however, be +synchronized with the host operating system's clock, so that, for +example, the time stamp of a packet might not correspond to the time +stamp of an event on the host triggered by the arrival of that packet. +.LP +Depending on the capture device and the software on the host, libpcap +might allow different types of time stamp to be used. The +.BR pcap_list_tstamp_types (3PCAP) +routine provides, for a packet capture handle created by +.BR pcap_create (3PCAP) +but not yet activated by +.BR pcap_activate (3PCAP), +a list of time stamp types supported by the capture device for that +handle. +The list might be empty, in which case no choice of time stamp type is +offered for that capture device. If the list is not empty, the +.BR pcap_set_tstamp_type (3PCAP) +routine can be used after a +.B pcap_create() +call and before a +.B pcap_activate() +call to specify the type of time stamp to be used on the device. +The time stamp types are listed here; the first value is the #define to +use in code, the second value is the value returned by +.B pcap_tstamp_type_val_to_name() +and accepted by +.BR pcap_tstamp_name_to_val() . +.RS 5 +.TP 5 +.BR PCAP_TSTAMP_HOST " - " host +Time stamp provided by the host on which the capture is being done. The +precision of this time stamp is unspecified; it might or might not be +synchronized with the host operating system's clock. +.TP 5 +.BR PCAP_TSTAMP_HOST_LOWPREC " - " host_lowprec +Time stamp provided by the host on which the capture is being done. +This is a low-precision time stamp, synchronized with the host operating +system's clock. +.TP 5 +.BR PCAP_TSTAMP_HOST_HIPREC " - " host_hiprec +Time stamp provided by the host on which the capture is being done. +This is a high-precision time stamp; it might or might not be +synchronized with the host operating system's clock. It might be more +expensive to fetch than +.BR PCAP_TSTAMP_HOST_LOWPREC . +.TP 5 +.BR PCAP_TSTAMP_ADAPTER " - " adapter +Time stamp provided by the network adapter on which the capture is being +done. This is a high-precision time stamp, synchronized with the host +operating system's clock. +.TP 5 +.BR PCAP_TSTAMP_ADAPTER_UNSYNCED " - " adapter_unsynced +Time stamp provided by the network adapter on which the capture is being +done. This is a high-precision time stamp; it is not synchronized with +the host operating system's clock. +.RE +.SH SEE ALSO +pcap_set_tstamp_type(3PCAP), +pcap_list_tstamp_types(3PCAP), +pcap_tstamp_type_val_to_name(3PCAP), +pcap_tstamp_name_to_val(3PCAP) diff --git a/contrib/libpcap/pcap-usb-linux.c b/contrib/libpcap/pcap-usb-linux.c index fea527f4f9e..f1b430c7bda 100644 --- a/contrib/libpcap/pcap-usb-linux.c +++ b/contrib/libpcap/pcap-usb-linux.c @@ -61,8 +61,15 @@ static const char rcsid[] _U_ = #include #include #ifdef HAVE_LINUX_USBDEVICE_FS_H +/* + * We might need to define __user for + * . + */ +#ifdef HAVE_LINUX_COMPILER_H +#include +#endif /* HAVE_LINUX_COMPILER_H */ #include -#endif +#endif /* HAVE_LINUX_USBDEVICE_FS_H */ #define USB_IFACE "usbmon" #define USB_TEXT_DIR_OLD "/sys/kernel/debug/usbmon" @@ -122,7 +129,6 @@ static int usb_read_linux(pcap_t *, int , pcap_handler , u_char *); static int usb_read_linux_bin(pcap_t *, int , pcap_handler , u_char *); static int usb_read_linux_mmap(pcap_t *, int , pcap_handler , u_char *); static int usb_inject_linux(pcap_t *, const void *, size_t); -static int usb_setfilter_linux(pcap_t *, struct bpf_program *); static int usb_setdirection_linux(pcap_t *, pcap_direction_t); static void usb_cleanup_linux_mmap(pcap_t *); @@ -301,7 +307,7 @@ usb_activate(pcap_t* handle) handle->linktype = DLT_USB_LINUX; handle->inject_op = usb_inject_linux; - handle->setfilter_op = usb_setfilter_linux; + handle->setfilter_op = install_bpf_program; /* no kernel filtering */ handle->setdirection_op = usb_setdirection_linux; handle->set_datalink_op = NULL; /* can't change data link type */ handle->getnonblock_op = pcap_getnonblock_fd; @@ -597,12 +603,17 @@ usb_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *u got: uhdr->data_len = data_len; - handle->md.packets_read++; if (pkth.caplen > handle->snapshot) pkth.caplen = handle->snapshot; - callback(user, &pkth, handle->buffer); - return 1; + if (handle->fcode.bf_insns == NULL || + bpf_filter(handle->fcode.bf_insns, handle->buffer, + pkth.len, pkth.caplen)) { + handle->md.packets_read++; + callback(user, &pkth, handle->buffer); + return 1; + } + return 0; /* didn't pass filter */ } static int @@ -688,12 +699,6 @@ usb_stats_linux(pcap_t *handle, struct pcap_stat *stats) return 0; } -static int -usb_setfilter_linux(pcap_t *p, struct bpf_program *fp) -{ - return 0; -} - static int usb_setdirection_linux(pcap_t *p, pcap_direction_t d) { @@ -767,9 +772,15 @@ usb_read_linux_bin(pcap_t *handle, int max_packets, pcap_handler callback, u_cha pkth.ts.tv_sec = info.hdr->ts_sec; pkth.ts.tv_usec = info.hdr->ts_usec; - handle->md.packets_read++; - callback(user, &pkth, handle->buffer); - return 1; + if (handle->fcode.bf_insns == NULL || + bpf_filter(handle->fcode.bf_insns, handle->buffer, + pkth.len, pkth.caplen)) { + handle->md.packets_read++; + callback(user, &pkth, handle->buffer); + return 1; + } + + return 0; /* didn't pass filter */ } /* @@ -841,9 +852,13 @@ usb_read_linux_mmap(pcap_t *handle, int max_packets, pcap_handler callback, u_ch pkth.ts.tv_sec = hdr->ts_sec; pkth.ts.tv_usec = hdr->ts_usec; - handle->md.packets_read++; - callback(user, &pkth, (u_char*) hdr); - packets++; + if (handle->fcode.bf_insns == NULL || + bpf_filter(handle->fcode.bf_insns, (u_char*) hdr, + pkth.len, pkth.caplen)) { + handle->md.packets_read++; + callback(user, &pkth, (u_char*) hdr); + packets++; + } } /* with max_packets <= 0 we stop afer the first chunk*/ diff --git a/contrib/libpcap/pcap-win32.c b/contrib/libpcap/pcap-win32.c index 0e2201e36f5..d8ed453510d 100644 --- a/contrib/libpcap/pcap-win32.c +++ b/contrib/libpcap/pcap-win32.c @@ -39,7 +39,12 @@ static const char rcsid[] _U_ = #include #include #ifdef __MINGW32__ +#ifdef __MINGW64__ +#include +#else /*__MINGW64__*/ +#include #include +#endif /*__MINGW64__*/ #else /*__MINGW32__*/ #include #endif /*__MINGW32__*/ @@ -232,7 +237,7 @@ pcap_read_win32_npf(pcap_t *p, int cnt, pcap_handler callback, u_char *user) * XXX A bpf_hdr matches a pcap_pkthdr. */ (*callback)(user, (struct pcap_pkthdr*)bp, bp + hdrlen); - bp += BPF_WORDALIGN(caplen + hdrlen); + bp += Packet_WORDALIGN(caplen + hdrlen); if (++n >= cnt && cnt > 0) { p->bp = bp; p->cc = ep - bp; diff --git a/contrib/libpcap/pcap.3pcap b/contrib/libpcap/pcap.3pcap index b6947141d1c..a8d9787b378 100644 --- a/contrib/libpcap/pcap.3pcap +++ b/contrib/libpcap/pcap.3pcap @@ -1,4 +1,4 @@ -.\" @(#) $Header: /tcpdump/master/libpcap/pcap.3pcap.in,v 1.1.2.2 2008-10-21 07:44:57 guy Exp $ +.\" @(#) $Header: /tcpdump/master/libpcap/pcap.3pcap.in,v 1.1 2008-10-21 07:33:01 guy Exp $ .\" .\" Copyright (c) 1994, 1996, 1997 .\" The Regents of the University of California. All rights reserved. @@ -37,22 +37,51 @@ on the network, even those destined for other hosts, are accessible through this mechanism. It also supports saving captured packets to a ``savefile'', and reading packets from a ``savefile''. -.PP -To open a handle for a live capture, call -.BR pcap_create() , +.SS Opening a capture handle for reading +To open a handle for a live capture, given the name of the network or +other interface on which the capture should be done, call +.BR pcap_create (), set the appropriate options on the handle, and then activate it with -.BR pcap_activate() . -To open a handle for a ``savefile'' with captured packets, call -.BR pcap_open_offline() . -Both -.B pcap_create() +.BR pcap_activate (). +.PP +To obtain a list of devices that can be opened for a live capture, call +.BR pcap_findalldevs (); +to free the list returned by +.BR pcap_findalldevs (), +call +.BR pcap_freealldevs (). +.BR pcap_lookupdev () +will return the first device on that list that is not a ``loopback`` +network interface. +.PP +To open a handle for a ``savefile'' from which to read packets, given the +pathname of the ``savefile'', call +.BR pcap_open_offline (); +to set up a handle for a ``savefile'', given a +.B "FILE\ *" +referring to a file already opened for reading, call +.BR pcap_fopen_offline (). +.PP +In order to get a ``fake'' +.B pcap_t +for use in routines that require a +.B pcap_t +as an argument, such as routines to open a ``savefile'' for writing and +to compile a filter expression, call +.BR pcap_open_dead (). +.PP +.BR pcap_create (), +.BR pcap_open_offline (), +.BR pcap_fopen_offline (), and -.B pcap_open_offline() +.BR pcap_open_dead () return a pointer to a .BR pcap_t , which is the handle used for reading packets from the capture stream or the ``savefile'', and for finding out information about the capture stream or ``savefile''. +To close a handle, use +.BR pcap_close (). .PP The options that can be set on a capture handle include .IP "snapshot length" @@ -75,7 +104,7 @@ A snapshot length of 65535 should be sufficient, on most if not all networks, to capture all the data available from the packet. .IP The snapshot length is set with -.BR pcap_set_snaplen() . +.BR pcap_set_snaplen (). .IP "promiscuous mode" On broadcast LANs such as Ethernet, if the network isn't switched, or if the adapter is connected to a "mirror port" on a switch to which all @@ -97,7 +126,7 @@ For now, this doesn't work on the "any" device; if an argument of "any" or NULL is supplied, the setting of promiscuous mode is ignored. .IP Promiscuous mode is set with -.BR pcap_set_promisc() . +.BR pcap_set_promisc (). .IP "monitor mode" On IEEE 802.11 wireless LANs, even if an adapter is in promiscuous mode, it will supply to the host only frames for the network with which it's @@ -118,9 +147,9 @@ if you are capturing in monitor mode and are not connected to another network with another adapter. .IP Monitor mode is set with -.BR pcap_set_rfmon() , +.BR pcap_set_rfmon (), and -.B pcap_can_set_rfmon() +.BR pcap_can_set_rfmon () can be used to determine whether an adapter can be put into monitor mode. .IP "read timeout" @@ -162,7 +191,7 @@ guarantee that a call reading packets will return after the timeout expires even if no packets have arrived. .IP The read timeout is set with -.BR pcap_set_timeout() . +.BR pcap_set_timeout (). .IP "buffer size" Packets that arrive for a capture are stored in a buffer, so that they do not have to be read by the application as soon as they arrive. On @@ -175,7 +204,17 @@ non-pageable operating system memory than is necessary to prevent packets from being dropped. .IP The buffer size is set with -.BR pcap_set_buffer_size() . +.BR pcap_set_buffer_size (). +.IP "timestamp type" +On some platforms, the time stamp given to packets on live captures can +come from different sources that can have different resolutions or that +can have different relationships to the time values for the current time +supplied by routines on the native operating system. See +.BR pcap-tstamp (7) +for a list of time stamp types. +.IP +The time stamp type is set with +.BR pcap_set_tstamp_type (). .PP Reading packets from a network interface may require that you have special privileges: @@ -260,26 +299,193 @@ have to find some other way to make that happen at boot time. .PP Reading a saved packet file doesn't require special privileges. .PP -To open a ``savefile`` to which to write packets, call -.BR pcap_dump_open() . -It returns a pointer to a -.BR pcap_dumper_t , -which is the handle used for writing packets to the ``savefile''. +The packets read from the handle may include a ``pseudo-header'' +containing various forms of packet meta-data, and probably includes a +link-layer header whose contents can differ for different network +interfaces. To determine the format of the packets supplied by the +handle, call +.BR pcap_datalink (); +.I http://www.tcpdump.org/linktypes.html +lists the values it returns and describes the packet formats that +correspond to those values. .PP +To obtain the +.B "FILE\ *" +corresponding to a +.B pcap_t +opened for a ``savefile'', call +.BR pcap_file (). +.TP +.B Routines +.RS +.TP +.BR pcap_create (3PCAP) +get a +.B pcap_t +for live capture +.TP +.BR pcap_activate (3PCAP) +activate a +.B pcap_t +for live capture +.TP +.BR pcap_findalldevs (3PCAP) +get a list of devices that can be opened for a live capture +.TP +.BR pcap_freealldevs (3PCAP) +free list of devices +.TP +.BR pcap_lookupdev (3PCAP) +get first non-loopback device on that list +.TP +.BR pcap_open_offline (3PCAP) +open a +.B pcap_t +for a ``savefile'', given a pathname +.TP +.BR pcap_fopen_offline (3PCAP) +open a +.B pcap_t +for a ``savefile'', given a +.B "FILE\ *" +.TP +.BR pcap_open_dead (3PCAP) +create a ``fake'' +.B pcap_t +.TP +.BR pcap_close (3PCAP) +close a +.B pcap_t +.TP +.BR pcap_set_snaplen (3PCAP) +set the snapshot length for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_snapshot (3PCAP) +get the snapshot length for a +.B pcap_t +.TP +.BR pcap_set_promisc (3PCAP) +set promiscuous mode for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_set_rfmon (3PCAP) +set monitor mode for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_can_set_rfmon (3PCAP) +determine whether monitor mode can be set for a +.B pcap_t +for live capture +.TP +.BR pcap_set_timeout (3PCAP) +set read timeout for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_set_buffer_size (3PCAP) +set buffer size for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_set_tstamp_type (3PCAP) +set time stamp type for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_list_tstamp_types (3PCAP) +get list of available time stamp types for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_free_tstamp_types (3PCAP) +free list of available time stamp types +.TP +.BR pcap_tstamp_type_val_to_name (3PCAP) +get name for a time stamp type +.TP +.BR pcap_tstamp_type_val_to_description (3PCAP) +get description for a time stamp type +.TP +.BR pcap_tstamp_name_to_val (3PCAP) +get time stamp type corresponding to a name +.TP +.BR pcap_datalink (3PCAP) +get link-layer header type for a +.B pcap_t +.TP +.BR pcap_file (3PCAP) +get the +.B "FILE\ *" +for a +.B pcap_t +opened for a ``savefile'' +.TP +.BR pcap_is_swapped (3PCAP) +determine whether a ``savefile'' being read came from a machine with the +opposite byte order +.TP +.BR pcap_major_version (3PCAP) +.PD 0 +.TP +.BR pcap_minor_version (3PCAP) +get the major and minor version of the file format version for a +``savefile'' +.PD +.RE +.SS Selecting a link-layer header type for a live capture +Some devices may provide more than one link-layer header type. To +obtain a list of all link-layer header types provided by a device, call +.BR pcap_list_datalinks () +on an activated +.B pcap_t +for the device. +To free a list of link-layer header types, call +.BR pcap_free_datalinks (). +To set the link-layer header type for a device, call +.BR pcap_set_datalink (). +This should be done after the device has been activated but before any +packets are read and before any filters are compiled or installed. +.TP +.B Routines +.RS +.TP +.BR pcap_list_datalinks (3PCAP) +get a list of link-layer header types for a device +.TP +.BR pcap_free_datalinks (3PCAP) +free list of link-layer header types +.TP +.BR pcap_set_datalink (3PCAP) +set link-layer header type for a device +.TP +.BR pcap_datalink_val_to_name (3PCAP) +get name for a link-layer header type +.TP +.BR pcap_datalink_val_to_description (3PCAP) +get description for a link-layer header type +.TP +.BR pcap_datalink_name_to_val (3PCAP) +get link-layer header type corresponding to a name +.RE +.SS Reading packets Packets are read with -.B pcap_dispatch() +.BR pcap_dispatch () or -.BR pcap_loop() , +.BR pcap_loop (), which process one or more packets, calling a callback routine for each packet, or with -.B pcap_next() +.BR pcap_next () or -.BR pcap_next_ex() , +.BR pcap_next_ex (), which return the next packet. The callback for -.B pcap_dispatch() +.BR pcap_dispatch () and -.BR pcap_loop() +.BR pcap_loop () is supplied a pointer to a .IR "struct pcap_pkthdr" , which includes the following members: @@ -304,9 +510,9 @@ number of bytes available from the capture, if the length of the packet is larger than the maximum number of bytes to capture). .RE .PP -.B pcap_next_ex() +.BR pcap_next_ex () supplies that pointer through a pointer argument. -.B pcap_next() +.BR pcap_next () is passed an argument that points to a .I struct pcap_pkthdr structure, and fills it in. @@ -323,15 +529,306 @@ packet; to capture the entire packet, you will have to provide a value for .I snaplen in your call to -.B pcap_open_live() +.BR pcap_set_snaplen () that is sufficiently large to get all of the packet's data - a value of 65535 should be sufficient on most if not all networks). When reading from a ``savefile'', the snapshot length specified when the capture was performed will limit the amount of packet data available. -.B pcap_next() +.BR pcap_next () returns that pointer; -.B pcap_next_ex() +.BR pcap_next_ex () supplies that pointer through a pointer argument. +.PP +To force the loop in +.BR pcap_dispatch () +or +.BR pcap_loop () +to terminate, call +.BR pcap_breakloop (). +.PP +By default, when reading packets from an interface opened for a live +capture, +.BR pcap_dispatch (), +.BR pcap_next (), +and +.BR pcap_next_ex () +will, if no packets are currently available to be read, block waiting +for packets to become available. On some, but +.I not +all, platforms, if a read timeout was specified, the wait will terminate +after the read timeout expires; applications should be prepared for +this, as it happens on some platforms, but should not rely on it, as it +does not happen on other platforms. +.PP +A handle can be put into ``non-blocking mode'', so that those routines +will, rather than blocking, return an indication that no packets are +available to read. Call +.BR pcap_setnonblock () +to put a handle into non-blocking mode or to take it out of non-blocking +mode; call +.BR pcap_getnonblock () +to determine whether a handle is in non-blocking mode. Note that +non-blocking mode does not work correctly in Mac OS X 10.6. +.PP +Non-blocking mode is often combined with routines such as +.BR select (2) +or +.BR poll (2) +or other routines a platform offers to wait for the availability of data +on any of a set of descriptors. To obtain, for a handle, a descriptor +that can be used in those routines, call +.BR pcap_get_selectable_fd (). +Not all handles have such a descriptor available; +.BR pcap_get_selectable_fd () +will return \-1 if no such descriptor exists. In addition, for various +reasons, one or more of those routines will not work properly with the +descriptor; the documentation for +.BR pcap_get_selectable_fd () +gives details. +.TP +.B Routines +.RS +.TP +.BR pcap_dispatch (3PCAP) +read a bufferful of packets from a +.B pcap_t +open for a live capture or the full set of packets from a +.B pcap_t +open for a ``savefile'' +.TP +.BR pcap_loop (3PCAP) +read packets from a +.B pcap_t +until an interrupt or error occurs +.TP +.BR pcap_next (3PCAP) +read the next packet from a +.B pcap_t +without an indication whether an error occurred +.TP +.BR pcap_next_ex (3PCAP) +read the next packet from a +.B pcap_t +with an error indication on an error +.TP +.BR pcap_breakloop (3PCAP) +prematurely terminate the loop in +.BR pcap_dispatch () +or +.BR pcap_loop () +.TP +.BR pcap_setnonblock (3PCAP) +set or clear non-blocking mode on a +.B pcap_t +.TP +.BR pcap_getnonblock (3PCAP) +get the state of non-blocking mode for a +.B pcap_t +.TP +.BR pcap_get_selectable_fd (3PCAP) +attempt to get a descriptor for a +.B pcap_t +that can be used in calls such as +.BR select (2) +and +.BR poll (2) +.RE +.SS Filters +In order to cause only certain packets to be returned when reading +packets, a filter can be set on a handle. For a live capture, the +filtering will be performed in kernel mode, if possible, to avoid +copying ``uninteresting'' packets from the kernel to user mode. +.PP +A filter can be specified as a text string; the syntax and semantics of +the string are as described by +.BR pcap-filter (7). +A filter string is compiled into a program in a pseudo-machine-language +by +.BR pcap_compile () +and the resulting program can be made a filter for a handle with +.BR pcap_setfilter (). +The result of +.BR pcap_compile () +can be freed with a call to +.BR pcap_freecode (). +.BR pcap_compile () +may require a network mask for certain expressions in the filter string; +.BR pcap_lookupnet () +can be used to find the network address and network mask for a given +capture device. +.PP +A compiled filter can also be applied directly to a packet that has been +read using +.BR pcap_offline_filter (). +.TP +.B Routines +.RS +.TP +.BR pcap_compile (3PCAP) +compile filter expression to a pseudo-machine-language code program +.TP +.BR pcap_freecode (3PCAP) +free a filter program +.TP +.BR pcap_setfilter (3PCAP) +set filter for a +.B pcap_t +.TP +.BR pcap_lookupnet (3PCAP) +get network address and network mask for a capture device +.TP +.BR pcap_offline_filter (3PCAP) +apply a filter program to a packet +.RE +.SS Incoming and outgoing packets +By default, libpcap will attempt to capture both packets sent by the +machine and packets received by the machine. To limit it to capturing +only packets received by the machine or, if possible, only packets sent +by the machine, call +.BR pcap_setdirection (). +.TP +.BR Routines +.RS +.TP +.BR pcap_setdirection (3PCAP) +specify whether to capture incoming packets, outgoing packets, or both +.RE +.SS Capture statistics +To get statistics about packets received and dropped in a live capture, +call +.BR pcap_stats (). +.TP +.B Routines +.RS +.TP +.BR pcap_stats (3PCAP) +get capture statistics +.RE +.SS Opening a handle for writing captured packets +To open a ``savefile`` to which to write packets, given the pathname the +``savefile'' should have, call +.BR pcap_dump_open (). +To open a ``savefile`` to which to write packets, given the pathname the +``savefile'' should have, call +.BR pcap_dump_open (); +to set up a handle for a ``savefile'', given a +.B "FILE\ *" +referring to a file already opened for writing, call +.BR pcap_dump_fopen (). +They each return pointers to a +.BR pcap_dumper_t , +which is the handle used for writing packets to the ``savefile''. If it +succeeds, it will have created the file if it doesn't exist and +truncated the file if it does exist. +To close a +.BR pcap_dumper_t , +call +.BR pcap_dump_close (). +.TP +.B Routines +.RS +.TP +.BR pcap_dump_open (3PCAP) +open a +.B pcap_dumper_t +for a ``savefile``, given a pathname +.TP +.BR pcap_dump_fopen (3PCAP) +open a +.B pcap_dumper_t +for a ``savefile``, given a +.B "FILE\ *" +.TP +.BR pcap_dump_close (3PCAP) +close a +.B pcap_dumper_t +.TP +.BR pcap_dump_file (3PCAP) +get the +.B "FILE\ *" +for a +.B pcap_dumper_t +opened for a ``savefile'' +.RE +.SS Writing packets +To write a packet to a +.BR pcap_dumper_t , +call +.BR pcap_dump (). +Packets written with +.BR pcap_dump () +may be buffered, rather than being immediately written to the +``savefile''. Closing the +.B pcap_dumper_t +will cause all buffered-but-not-yet-written packets to be written to the +``savefile''. +To force all packets written to the +.BR pcap_dumper_t , +and not yet written to the ``savefile'' because they're buffered by the +.BR pcap_dumper_t , +to be written to the ``savefile'', without closing the +.BR pcap_dumper_t , +call +.BR pcap_dump_flush (). +.TP +.B Routines +.RS +.TP +.BR pcap_dump (3PCAP) +write packet to a +.B pcap_dumper_t +.TP +.BR pcap_dump_flush (3PCAP) +flush buffered packets written to a +.B pcap_dumper_t +to the ``savefile'' +.TP +.BR pcap_dump_ftell (3PCAP) +get current file position for a +.B pcap_dumper_t +.RE +.SS Injecting packets +If you have the required privileges, you can inject packets onto a +network with a +.B pcap_t +for a live capture, using +.BR pcap_inject () +or +.BR pcap_sendpacket (). +(The two routines exist for compatibility with both OpenBSD and WinPcap; +they perform the same function, but have different return values.) +.TP +.B Routines +.RS +.TP +.BR pcap_inject (3PCAP) +.PD 0 +.TP +.BR pcap_sendpacket (3PCAP) +transmit a packet +.PD +.RE +.SS Reporting errors +Some routines return error or warning status codes; to convert them to a +string, use +.BR pcap_statustostr (). +.TP +.B Routines +.RS +.TP +.BR pcap_statustostr (3PCAP) +get a string for an error or warning status code +.RE +.SS Getting library version information +To get a string giving version information about libpcap, call +.BR pcap_library_version (). +.TP +.B Routines +.RS +.TP +.BR pcap_library_version (3PCAP) +get library version string +.RE .SH BACKWARDS COMPATIBILITY .PP In versions of libpcap prior to 1.0, the @@ -346,18 +843,18 @@ which will include for you, rather than including .BR . .PP -.B pcap_create() +.BR pcap_create () and -.B pcap_activate() +.BR pcap_activate () were not available in versions of libpcap prior to 1.0; if you are writing an application that must work on versions of libpcap prior to 1.0, either use -.B pcap_open_live() +.BR pcap_open_live () to get a handle for a live capture or, if you want to be able to use the additional capabilities offered by using -.B pcap_create() +.BR pcap_create () and -.BR pcap_activate() , +.BR pcap_activate (), use an .BR autoconf (1) script or some other configuration script to check whether the libpcap diff --git a/contrib/libpcap/pcap.3pcap.in b/contrib/libpcap/pcap.3pcap.in index c2f912663b6..6f99cc519de 100644 --- a/contrib/libpcap/pcap.3pcap.in +++ b/contrib/libpcap/pcap.3pcap.in @@ -37,22 +37,51 @@ on the network, even those destined for other hosts, are accessible through this mechanism. It also supports saving captured packets to a ``savefile'', and reading packets from a ``savefile''. -.PP -To open a handle for a live capture, call -.BR pcap_create() , +.SS Opening a capture handle for reading +To open a handle for a live capture, given the name of the network or +other interface on which the capture should be done, call +.BR pcap_create (), set the appropriate options on the handle, and then activate it with -.BR pcap_activate() . -To open a handle for a ``savefile'' with captured packets, call -.BR pcap_open_offline() . -Both -.B pcap_create() +.BR pcap_activate (). +.PP +To obtain a list of devices that can be opened for a live capture, call +.BR pcap_findalldevs (); +to free the list returned by +.BR pcap_findalldevs (), +call +.BR pcap_freealldevs (). +.BR pcap_lookupdev () +will return the first device on that list that is not a ``loopback`` +network interface. +.PP +To open a handle for a ``savefile'' from which to read packets, given the +pathname of the ``savefile'', call +.BR pcap_open_offline (); +to set up a handle for a ``savefile'', given a +.B "FILE\ *" +referring to a file already opened for reading, call +.BR pcap_fopen_offline (). +.PP +In order to get a ``fake'' +.B pcap_t +for use in routines that require a +.B pcap_t +as an argument, such as routines to open a ``savefile'' for writing and +to compile a filter expression, call +.BR pcap_open_dead (). +.PP +.BR pcap_create (), +.BR pcap_open_offline (), +.BR pcap_fopen_offline (), and -.B pcap_open_offline() +.BR pcap_open_dead () return a pointer to a .BR pcap_t , which is the handle used for reading packets from the capture stream or the ``savefile'', and for finding out information about the capture stream or ``savefile''. +To close a handle, use +.BR pcap_close (). .PP The options that can be set on a capture handle include .IP "snapshot length" @@ -75,7 +104,7 @@ A snapshot length of 65535 should be sufficient, on most if not all networks, to capture all the data available from the packet. .IP The snapshot length is set with -.BR pcap_set_snaplen() . +.BR pcap_set_snaplen (). .IP "promiscuous mode" On broadcast LANs such as Ethernet, if the network isn't switched, or if the adapter is connected to a "mirror port" on a switch to which all @@ -97,7 +126,7 @@ For now, this doesn't work on the "any" device; if an argument of "any" or NULL is supplied, the setting of promiscuous mode is ignored. .IP Promiscuous mode is set with -.BR pcap_set_promisc() . +.BR pcap_set_promisc (). .IP "monitor mode" On IEEE 802.11 wireless LANs, even if an adapter is in promiscuous mode, it will supply to the host only frames for the network with which it's @@ -118,9 +147,9 @@ if you are capturing in monitor mode and are not connected to another network with another adapter. .IP Monitor mode is set with -.BR pcap_set_rfmon() , +.BR pcap_set_rfmon (), and -.B pcap_can_set_rfmon() +.BR pcap_can_set_rfmon () can be used to determine whether an adapter can be put into monitor mode. .IP "read timeout" @@ -162,7 +191,7 @@ guarantee that a call reading packets will return after the timeout expires even if no packets have arrived. .IP The read timeout is set with -.BR pcap_set_timeout() . +.BR pcap_set_timeout (). .IP "buffer size" Packets that arrive for a capture are stored in a buffer, so that they do not have to be read by the application as soon as they arrive. On @@ -175,7 +204,17 @@ non-pageable operating system memory than is necessary to prevent packets from being dropped. .IP The buffer size is set with -.BR pcap_set_buffer_size() . +.BR pcap_set_buffer_size (). +.IP "timestamp type" +On some platforms, the time stamp given to packets on live captures can +come from different sources that can have different resolutions or that +can have different relationships to the time values for the current time +supplied by routines on the native operating system. See +.BR pcap-tstamp (@MAN_MISC_INFO@) +for a list of time stamp types. +.IP +The time stamp type is set with +.BR pcap_set_tstamp_type (). .PP Reading packets from a network interface may require that you have special privileges: @@ -260,26 +299,193 @@ have to find some other way to make that happen at boot time. .PP Reading a saved packet file doesn't require special privileges. .PP -To open a ``savefile`` to which to write packets, call -.BR pcap_dump_open() . -It returns a pointer to a -.BR pcap_dumper_t , -which is the handle used for writing packets to the ``savefile''. +The packets read from the handle may include a ``pseudo-header'' +containing various forms of packet meta-data, and probably includes a +link-layer header whose contents can differ for different network +interfaces. To determine the format of the packets supplied by the +handle, call +.BR pcap_datalink (); +.I http://www.tcpdump.org/linktypes.html +lists the values it returns and describes the packet formats that +correspond to those values. .PP +To obtain the +.B "FILE\ *" +corresponding to a +.B pcap_t +opened for a ``savefile'', call +.BR pcap_file (). +.TP +.B Routines +.RS +.TP +.BR pcap_create (3PCAP) +get a +.B pcap_t +for live capture +.TP +.BR pcap_activate (3PCAP) +activate a +.B pcap_t +for live capture +.TP +.BR pcap_findalldevs (3PCAP) +get a list of devices that can be opened for a live capture +.TP +.BR pcap_freealldevs (3PCAP) +free list of devices +.TP +.BR pcap_lookupdev (3PCAP) +get first non-loopback device on that list +.TP +.BR pcap_open_offline (3PCAP) +open a +.B pcap_t +for a ``savefile'', given a pathname +.TP +.BR pcap_fopen_offline (3PCAP) +open a +.B pcap_t +for a ``savefile'', given a +.B "FILE\ *" +.TP +.BR pcap_open_dead (3PCAP) +create a ``fake'' +.B pcap_t +.TP +.BR pcap_close (3PCAP) +close a +.B pcap_t +.TP +.BR pcap_set_snaplen (3PCAP) +set the snapshot length for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_snapshot (3PCAP) +get the snapshot length for a +.B pcap_t +.TP +.BR pcap_set_promisc (3PCAP) +set promiscuous mode for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_set_rfmon (3PCAP) +set monitor mode for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_can_set_rfmon (3PCAP) +determine whether monitor mode can be set for a +.B pcap_t +for live capture +.TP +.BR pcap_set_timeout (3PCAP) +set read timeout for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_set_buffer_size (3PCAP) +set buffer size for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_set_tstamp_type (3PCAP) +set time stamp type for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_list_tstamp_types (3PCAP) +get list of available time stamp types for a not-yet-activated +.B pcap_t +for live capture +.TP +.BR pcap_free_tstamp_types (3PCAP) +free list of available time stamp types +.TP +.BR pcap_tstamp_type_val_to_name (3PCAP) +get name for a time stamp type +.TP +.BR pcap_tstamp_type_val_to_description (3PCAP) +get description for a time stamp type +.TP +.BR pcap_tstamp_name_to_val (3PCAP) +get time stamp type corresponding to a name +.TP +.BR pcap_datalink (3PCAP) +get link-layer header type for a +.B pcap_t +.TP +.BR pcap_file (3PCAP) +get the +.B "FILE\ *" +for a +.B pcap_t +opened for a ``savefile'' +.TP +.BR pcap_is_swapped (3PCAP) +determine whether a ``savefile'' being read came from a machine with the +opposite byte order +.TP +.BR pcap_major_version (3PCAP) +.PD 0 +.TP +.BR pcap_minor_version (3PCAP) +get the major and minor version of the file format version for a +``savefile'' +.PD +.RE +.SS Selecting a link-layer header type for a live capture +Some devices may provide more than one link-layer header type. To +obtain a list of all link-layer header types provided by a device, call +.BR pcap_list_datalinks () +on an activated +.B pcap_t +for the device. +To free a list of link-layer header types, call +.BR pcap_free_datalinks (). +To set the link-layer header type for a device, call +.BR pcap_set_datalink (). +This should be done after the device has been activated but before any +packets are read and before any filters are compiled or installed. +.TP +.B Routines +.RS +.TP +.BR pcap_list_datalinks (3PCAP) +get a list of link-layer header types for a device +.TP +.BR pcap_free_datalinks (3PCAP) +free list of link-layer header types +.TP +.BR pcap_set_datalink (3PCAP) +set link-layer header type for a device +.TP +.BR pcap_datalink_val_to_name (3PCAP) +get name for a link-layer header type +.TP +.BR pcap_datalink_val_to_description (3PCAP) +get description for a link-layer header type +.TP +.BR pcap_datalink_name_to_val (3PCAP) +get link-layer header type corresponding to a name +.RE +.SS Reading packets Packets are read with -.B pcap_dispatch() +.BR pcap_dispatch () or -.BR pcap_loop() , +.BR pcap_loop (), which process one or more packets, calling a callback routine for each packet, or with -.B pcap_next() +.BR pcap_next () or -.BR pcap_next_ex() , +.BR pcap_next_ex (), which return the next packet. The callback for -.B pcap_dispatch() +.BR pcap_dispatch () and -.BR pcap_loop() +.BR pcap_loop () is supplied a pointer to a .IR "struct pcap_pkthdr" , which includes the following members: @@ -304,9 +510,9 @@ number of bytes available from the capture, if the length of the packet is larger than the maximum number of bytes to capture). .RE .PP -.B pcap_next_ex() +.BR pcap_next_ex () supplies that pointer through a pointer argument. -.B pcap_next() +.BR pcap_next () is passed an argument that points to a .I struct pcap_pkthdr structure, and fills it in. @@ -323,15 +529,306 @@ packet; to capture the entire packet, you will have to provide a value for .I snaplen in your call to -.B pcap_open_live() +.BR pcap_set_snaplen () that is sufficiently large to get all of the packet's data - a value of 65535 should be sufficient on most if not all networks). When reading from a ``savefile'', the snapshot length specified when the capture was performed will limit the amount of packet data available. -.B pcap_next() +.BR pcap_next () returns that pointer; -.B pcap_next_ex() +.BR pcap_next_ex () supplies that pointer through a pointer argument. +.PP +To force the loop in +.BR pcap_dispatch () +or +.BR pcap_loop () +to terminate, call +.BR pcap_breakloop (). +.PP +By default, when reading packets from an interface opened for a live +capture, +.BR pcap_dispatch (), +.BR pcap_next (), +and +.BR pcap_next_ex () +will, if no packets are currently available to be read, block waiting +for packets to become available. On some, but +.I not +all, platforms, if a read timeout was specified, the wait will terminate +after the read timeout expires; applications should be prepared for +this, as it happens on some platforms, but should not rely on it, as it +does not happen on other platforms. +.PP +A handle can be put into ``non-blocking mode'', so that those routines +will, rather than blocking, return an indication that no packets are +available to read. Call +.BR pcap_setnonblock () +to put a handle into non-blocking mode or to take it out of non-blocking +mode; call +.BR pcap_getnonblock () +to determine whether a handle is in non-blocking mode. Note that +non-blocking mode does not work correctly in Mac OS X 10.6. +.PP +Non-blocking mode is often combined with routines such as +.BR select (2) +or +.BR poll (2) +or other routines a platform offers to wait for the availability of data +on any of a set of descriptors. To obtain, for a handle, a descriptor +that can be used in those routines, call +.BR pcap_get_selectable_fd (). +Not all handles have such a descriptor available; +.BR pcap_get_selectable_fd () +will return \-1 if no such descriptor exists. In addition, for various +reasons, one or more of those routines will not work properly with the +descriptor; the documentation for +.BR pcap_get_selectable_fd () +gives details. +.TP +.B Routines +.RS +.TP +.BR pcap_dispatch (3PCAP) +read a bufferful of packets from a +.B pcap_t +open for a live capture or the full set of packets from a +.B pcap_t +open for a ``savefile'' +.TP +.BR pcap_loop (3PCAP) +read packets from a +.B pcap_t +until an interrupt or error occurs +.TP +.BR pcap_next (3PCAP) +read the next packet from a +.B pcap_t +without an indication whether an error occurred +.TP +.BR pcap_next_ex (3PCAP) +read the next packet from a +.B pcap_t +with an error indication on an error +.TP +.BR pcap_breakloop (3PCAP) +prematurely terminate the loop in +.BR pcap_dispatch () +or +.BR pcap_loop () +.TP +.BR pcap_setnonblock (3PCAP) +set or clear non-blocking mode on a +.B pcap_t +.TP +.BR pcap_getnonblock (3PCAP) +get the state of non-blocking mode for a +.B pcap_t +.TP +.BR pcap_get_selectable_fd (3PCAP) +attempt to get a descriptor for a +.B pcap_t +that can be used in calls such as +.BR select (2) +and +.BR poll (2) +.RE +.SS Filters +In order to cause only certain packets to be returned when reading +packets, a filter can be set on a handle. For a live capture, the +filtering will be performed in kernel mode, if possible, to avoid +copying ``uninteresting'' packets from the kernel to user mode. +.PP +A filter can be specified as a text string; the syntax and semantics of +the string are as described by +.BR pcap-filter (@MAN_MISC_INFO@). +A filter string is compiled into a program in a pseudo-machine-language +by +.BR pcap_compile () +and the resulting program can be made a filter for a handle with +.BR pcap_setfilter (). +The result of +.BR pcap_compile () +can be freed with a call to +.BR pcap_freecode (). +.BR pcap_compile () +may require a network mask for certain expressions in the filter string; +.BR pcap_lookupnet () +can be used to find the network address and network mask for a given +capture device. +.PP +A compiled filter can also be applied directly to a packet that has been +read using +.BR pcap_offline_filter (). +.TP +.B Routines +.RS +.TP +.BR pcap_compile (3PCAP) +compile filter expression to a pseudo-machine-language code program +.TP +.BR pcap_freecode (3PCAP) +free a filter program +.TP +.BR pcap_setfilter (3PCAP) +set filter for a +.B pcap_t +.TP +.BR pcap_lookupnet (3PCAP) +get network address and network mask for a capture device +.TP +.BR pcap_offline_filter (3PCAP) +apply a filter program to a packet +.RE +.SS Incoming and outgoing packets +By default, libpcap will attempt to capture both packets sent by the +machine and packets received by the machine. To limit it to capturing +only packets received by the machine or, if possible, only packets sent +by the machine, call +.BR pcap_setdirection (). +.TP +.BR Routines +.RS +.TP +.BR pcap_setdirection (3PCAP) +specify whether to capture incoming packets, outgoing packets, or both +.RE +.SS Capture statistics +To get statistics about packets received and dropped in a live capture, +call +.BR pcap_stats (). +.TP +.B Routines +.RS +.TP +.BR pcap_stats (3PCAP) +get capture statistics +.RE +.SS Opening a handle for writing captured packets +To open a ``savefile`` to which to write packets, given the pathname the +``savefile'' should have, call +.BR pcap_dump_open (). +To open a ``savefile`` to which to write packets, given the pathname the +``savefile'' should have, call +.BR pcap_dump_open (); +to set up a handle for a ``savefile'', given a +.B "FILE\ *" +referring to a file already opened for writing, call +.BR pcap_dump_fopen (). +They each return pointers to a +.BR pcap_dumper_t , +which is the handle used for writing packets to the ``savefile''. If it +succeeds, it will have created the file if it doesn't exist and +truncated the file if it does exist. +To close a +.BR pcap_dumper_t , +call +.BR pcap_dump_close (). +.TP +.B Routines +.RS +.TP +.BR pcap_dump_open (3PCAP) +open a +.B pcap_dumper_t +for a ``savefile``, given a pathname +.TP +.BR pcap_dump_fopen (3PCAP) +open a +.B pcap_dumper_t +for a ``savefile``, given a +.B "FILE\ *" +.TP +.BR pcap_dump_close (3PCAP) +close a +.B pcap_dumper_t +.TP +.BR pcap_dump_file (3PCAP) +get the +.B "FILE\ *" +for a +.B pcap_dumper_t +opened for a ``savefile'' +.RE +.SS Writing packets +To write a packet to a +.BR pcap_dumper_t , +call +.BR pcap_dump (). +Packets written with +.BR pcap_dump () +may be buffered, rather than being immediately written to the +``savefile''. Closing the +.B pcap_dumper_t +will cause all buffered-but-not-yet-written packets to be written to the +``savefile''. +To force all packets written to the +.BR pcap_dumper_t , +and not yet written to the ``savefile'' because they're buffered by the +.BR pcap_dumper_t , +to be written to the ``savefile'', without closing the +.BR pcap_dumper_t , +call +.BR pcap_dump_flush (). +.TP +.B Routines +.RS +.TP +.BR pcap_dump (3PCAP) +write packet to a +.B pcap_dumper_t +.TP +.BR pcap_dump_flush (3PCAP) +flush buffered packets written to a +.B pcap_dumper_t +to the ``savefile'' +.TP +.BR pcap_dump_ftell (3PCAP) +get current file position for a +.B pcap_dumper_t +.RE +.SS Injecting packets +If you have the required privileges, you can inject packets onto a +network with a +.B pcap_t +for a live capture, using +.BR pcap_inject () +or +.BR pcap_sendpacket (). +(The two routines exist for compatibility with both OpenBSD and WinPcap; +they perform the same function, but have different return values.) +.TP +.B Routines +.RS +.TP +.BR pcap_inject (3PCAP) +.PD 0 +.TP +.BR pcap_sendpacket (3PCAP) +transmit a packet +.PD +.RE +.SS Reporting errors +Some routines return error or warning status codes; to convert them to a +string, use +.BR pcap_statustostr (). +.TP +.B Routines +.RS +.TP +.BR pcap_statustostr (3PCAP) +get a string for an error or warning status code +.RE +.SS Getting library version information +To get a string giving version information about libpcap, call +.BR pcap_library_version (). +.TP +.B Routines +.RS +.TP +.BR pcap_library_version (3PCAP) +get library version string +.RE .SH BACKWARDS COMPATIBILITY .PP In versions of libpcap prior to 1.0, the @@ -346,18 +843,18 @@ which will include for you, rather than including .BR . .PP -.B pcap_create() +.BR pcap_create () and -.B pcap_activate() +.BR pcap_activate () were not available in versions of libpcap prior to 1.0; if you are writing an application that must work on versions of libpcap prior to 1.0, either use -.B pcap_open_live() +.BR pcap_open_live () to get a handle for a live capture or, if you want to be able to use the additional capabilities offered by using -.B pcap_create() +.BR pcap_create () and -.BR pcap_activate() , +.BR pcap_activate (), use an .BR autoconf (1) script or some other configuration script to check whether the libpcap diff --git a/contrib/libpcap/pcap.c b/contrib/libpcap/pcap.c index 324752f87f6..3bed10d0785 100644 --- a/contrib/libpcap/pcap.c +++ b/contrib/libpcap/pcap.c @@ -58,7 +58,7 @@ static const char rcsid[] _U_ = #include #include #include -#if !defined(_MSC_VER) && !defined(__BORLANDC__) +#if !defined(_MSC_VER) && !defined(__BORLANDC__) && !defined(__MINGW32__) #include #endif #include @@ -83,7 +83,7 @@ int pcap_not_initialized(pcap_t *pcap) { /* this means 'not initialized' */ - return PCAP_ERROR_NOT_ACTIVATED; + return (PCAP_ERROR_NOT_ACTIVATED); } /* @@ -105,6 +105,56 @@ pcap_cant_set_rfmon(pcap_t *p _U_) return (0); } +/* + * Sets *tstamp_typesp to point to an array 1 or more supported time stamp + * types; the return value is the number of supported time stamp types. + * The list should be freed by a call to pcap_free_tstamp_types() when + * you're done with it. + * + * A return value of 0 means "you don't get a choice of time stamp type", + * in which case *tstamp_typesp is set to null. + * + * PCAP_ERROR is returned on error. + */ +int +pcap_list_tstamp_types(pcap_t *p, int **tstamp_typesp) +{ + if (p->tstamp_type_count == 0) { + /* + * We don't support multiple time stamp types. + */ + *tstamp_typesp = NULL; + } else { + *tstamp_typesp = (int*)calloc(sizeof(**tstamp_typesp), + p->tstamp_type_count); + if (*tstamp_typesp == NULL) { + (void)snprintf(p->errbuf, sizeof(p->errbuf), + "malloc: %s", pcap_strerror(errno)); + return (PCAP_ERROR); + } + (void)memcpy(*tstamp_typesp, p->tstamp_type_list, + sizeof(**tstamp_typesp) * p->tstamp_type_count); + } + return (p->tstamp_type_count); +} + +/* + * In Windows, you might have a library built with one version of the + * C runtime library and an application built with another version of + * the C runtime library, which means that the library might use one + * version of malloc() and free() and the application might use another + * version of malloc() and free(). If so, that means something + * allocated by the library cannot be freed by the application, so we + * need to have a pcap_free_tstamp_types() routine to free up the list + * allocated by pcap_list_tstamp_types(), even though it's just a wrapper + * around free(). + */ +void +pcap_free_tstamp_types(int *tstamp_type_list) +{ + free(tstamp_type_list); +} + /* * Default one-shot callback; overridden for capture types where the * packet data cannot be guaranteed to be available after the callback @@ -150,7 +200,8 @@ pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header, int status; /* We are on an offline capture */ - status = pcap_offline_read(p, 1, pcap_oneshot, (u_char *)&s); + status = pcap_offline_read(p, 1, p->oneshot_callback, + (u_char *)&s); /* * Return codes for pcap_offline_read() are: @@ -179,7 +230,7 @@ pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header, * The first one ('0') conflicts with the return code of 0 from * pcap_offline_read() meaning "end of file". */ - return (p->read_op(p, 1, pcap_oneshot, (u_char *)&s)); + return (p->read_op(p, 1, p->oneshot_callback, (u_char *)&s)); } static void @@ -259,6 +310,7 @@ pcap_create_common(const char *source, char *ebuf) pcap_set_snaplen(p, 65535); /* max packet size */ p->opt.promisc = 0; p->opt.buffer_size = 0; + p->opt.tstamp_type = -1; /* default to not setting time stamp type */ return (p); } @@ -268,54 +320,89 @@ pcap_check_activated(pcap_t *p) if (p->activated) { snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "can't perform " " operation on activated capture"); - return -1; + return (-1); } - return 0; + return (0); } int pcap_set_snaplen(pcap_t *p, int snaplen) { if (pcap_check_activated(p)) - return PCAP_ERROR_ACTIVATED; + return (PCAP_ERROR_ACTIVATED); p->snapshot = snaplen; - return 0; + return (0); } int pcap_set_promisc(pcap_t *p, int promisc) { if (pcap_check_activated(p)) - return PCAP_ERROR_ACTIVATED; + return (PCAP_ERROR_ACTIVATED); p->opt.promisc = promisc; - return 0; + return (0); } int pcap_set_rfmon(pcap_t *p, int rfmon) { if (pcap_check_activated(p)) - return PCAP_ERROR_ACTIVATED; + return (PCAP_ERROR_ACTIVATED); p->opt.rfmon = rfmon; - return 0; + return (0); } int pcap_set_timeout(pcap_t *p, int timeout_ms) { if (pcap_check_activated(p)) - return PCAP_ERROR_ACTIVATED; + return (PCAP_ERROR_ACTIVATED); p->md.timeout = timeout_ms; - return 0; + return (0); +} + +int +pcap_set_tstamp_type(pcap_t *p, int tstamp_type) +{ + int i; + + if (pcap_check_activated(p)) + return (PCAP_ERROR_ACTIVATED); + + /* + * If p->tstamp_type_count is 0, we don't support setting + * the time stamp type at all. + */ + if (p->tstamp_type_count == 0) + return (PCAP_ERROR_CANTSET_TSTAMP_TYPE); + + /* + * Check whether we claim to support this type of time stamp. + */ + for (i = 0; i < p->tstamp_type_count; i++) { + if (p->tstamp_type_list[i] == tstamp_type) { + /* + * Yes. + */ + p->opt.tstamp_type = tstamp_type; + return (0); + } + } + + /* + * No. We support setting the time stamp type, but not to this + * particular value. + */ + return (PCAP_WARNING_TSTAMP_TYPE_NOTSUP); } int pcap_set_buffer_size(pcap_t *p, int buffer_size) { if (pcap_check_activated(p)) - return PCAP_ERROR_ACTIVATED; + return (PCAP_ERROR_ACTIVATED); p->opt.buffer_size = buffer_size; - return 0; + return (0); } int @@ -323,6 +410,15 @@ pcap_activate(pcap_t *p) { int status; + /* + * Catch attempts to re-activate an already-activated + * pcap_t; this should, for example, catch code that + * calls pcap_open_live() followed by pcap_activate(), + * as some code that showed up in a Stack Exchange + * question did. + */ + if (pcap_check_activated(p)) + return (PCAP_ERROR_ACTIVATED); status = p->activate_op(p); if (status >= 0) p->activated = 1; @@ -385,7 +481,8 @@ fail: snprintf(errbuf, PCAP_ERRBUF_SIZE, "%s: %s", source, p->errbuf); else if (status == PCAP_ERROR_NO_SUCH_DEVICE || - status == PCAP_ERROR_PERM_DENIED) + status == PCAP_ERROR_PERM_DENIED || + status == PCAP_ERROR_PROMISC_PERM_DENIED) snprintf(errbuf, PCAP_ERRBUF_SIZE, "%s: %s (%s)", source, pcap_statustostr(status), p->errbuf); else @@ -398,7 +495,7 @@ fail: int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user) { - return p->read_op(p, cnt, callback, user); + return (p->read_op(p, cnt, callback, user)); } /* @@ -408,7 +505,7 @@ int pcap_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user) { - return p->read_op(p, cnt, callback, user); + return (p->read_op(p, cnt, callback, user)); } int @@ -572,111 +669,6 @@ unsupported: return (-1); } -struct dlt_choice { - const char *name; - const char *description; - int dlt; -}; - -#define DLT_CHOICE(code, description) { #code, description, code } -#define DLT_CHOICE_SENTINEL { NULL, NULL, 0 } - -static struct dlt_choice dlt_choices[] = { - DLT_CHOICE(DLT_NULL, "BSD loopback"), - DLT_CHOICE(DLT_EN10MB, "Ethernet"), - DLT_CHOICE(DLT_IEEE802, "Token ring"), - DLT_CHOICE(DLT_ARCNET, "BSD ARCNET"), - DLT_CHOICE(DLT_SLIP, "SLIP"), - DLT_CHOICE(DLT_PPP, "PPP"), - DLT_CHOICE(DLT_FDDI, "FDDI"), - DLT_CHOICE(DLT_ATM_RFC1483, "RFC 1483 LLC-encapsulated ATM"), - DLT_CHOICE(DLT_RAW, "Raw IP"), - DLT_CHOICE(DLT_SLIP_BSDOS, "BSD/OS SLIP"), - DLT_CHOICE(DLT_PPP_BSDOS, "BSD/OS PPP"), - DLT_CHOICE(DLT_ATM_CLIP, "Linux Classical IP-over-ATM"), - DLT_CHOICE(DLT_PPP_SERIAL, "PPP over serial"), - DLT_CHOICE(DLT_PPP_ETHER, "PPPoE"), - DLT_CHOICE(DLT_SYMANTEC_FIREWALL, "Symantec Firewall"), - DLT_CHOICE(DLT_C_HDLC, "Cisco HDLC"), - DLT_CHOICE(DLT_IEEE802_11, "802.11"), - DLT_CHOICE(DLT_FRELAY, "Frame Relay"), - DLT_CHOICE(DLT_LOOP, "OpenBSD loopback"), - DLT_CHOICE(DLT_ENC, "OpenBSD encapsulated IP"), - DLT_CHOICE(DLT_LINUX_SLL, "Linux cooked"), - DLT_CHOICE(DLT_LTALK, "Localtalk"), - DLT_CHOICE(DLT_PFLOG, "OpenBSD pflog file"), - DLT_CHOICE(DLT_PRISM_HEADER, "802.11 plus Prism header"), - DLT_CHOICE(DLT_IP_OVER_FC, "RFC 2625 IP-over-Fibre Channel"), - DLT_CHOICE(DLT_SUNATM, "Sun raw ATM"), - DLT_CHOICE(DLT_IEEE802_11_RADIO, "802.11 plus radiotap header"), - DLT_CHOICE(DLT_ARCNET_LINUX, "Linux ARCNET"), - DLT_CHOICE(DLT_JUNIPER_MLPPP, "Juniper Multi-Link PPP"), - DLT_CHOICE(DLT_JUNIPER_MLFR, "Juniper Multi-Link Frame Relay"), - DLT_CHOICE(DLT_JUNIPER_ES, "Juniper Encryption Services PIC"), - DLT_CHOICE(DLT_JUNIPER_GGSN, "Juniper GGSN PIC"), - DLT_CHOICE(DLT_JUNIPER_MFR, "Juniper FRF.16 Frame Relay"), - DLT_CHOICE(DLT_JUNIPER_ATM2, "Juniper ATM2 PIC"), - DLT_CHOICE(DLT_JUNIPER_SERVICES, "Juniper Advanced Services PIC"), - DLT_CHOICE(DLT_JUNIPER_ATM1, "Juniper ATM1 PIC"), - DLT_CHOICE(DLT_APPLE_IP_OVER_IEEE1394, "Apple IP-over-IEEE 1394"), - DLT_CHOICE(DLT_MTP2_WITH_PHDR, "SS7 MTP2 with Pseudo-header"), - DLT_CHOICE(DLT_MTP2, "SS7 MTP2"), - DLT_CHOICE(DLT_MTP3, "SS7 MTP3"), - DLT_CHOICE(DLT_SCCP, "SS7 SCCP"), - DLT_CHOICE(DLT_DOCSIS, "DOCSIS"), - DLT_CHOICE(DLT_LINUX_IRDA, "Linux IrDA"), - DLT_CHOICE(DLT_IEEE802_11_RADIO_AVS, "802.11 plus AVS radio information header"), - DLT_CHOICE(DLT_JUNIPER_MONITOR, "Juniper Passive Monitor PIC"), - DLT_CHOICE(DLT_PPP_PPPD, "PPP for pppd, with direction flag"), - DLT_CHOICE(DLT_JUNIPER_PPPOE, "Juniper PPPoE"), - DLT_CHOICE(DLT_JUNIPER_PPPOE_ATM, "Juniper PPPoE/ATM"), - DLT_CHOICE(DLT_GPRS_LLC, "GPRS LLC"), - DLT_CHOICE(DLT_GPF_T, "GPF-T"), - DLT_CHOICE(DLT_GPF_F, "GPF-F"), - DLT_CHOICE(DLT_JUNIPER_PIC_PEER, "Juniper PIC Peer"), - DLT_CHOICE(DLT_ERF_ETH, "Ethernet with Endace ERF header"), - DLT_CHOICE(DLT_ERF_POS, "Packet-over-SONET with Endace ERF header"), - DLT_CHOICE(DLT_LINUX_LAPD, "Linux vISDN LAPD"), - DLT_CHOICE(DLT_JUNIPER_ETHER, "Juniper Ethernet"), - DLT_CHOICE(DLT_JUNIPER_PPP, "Juniper PPP"), - DLT_CHOICE(DLT_JUNIPER_FRELAY, "Juniper Frame Relay"), - DLT_CHOICE(DLT_JUNIPER_CHDLC, "Juniper C-HDLC"), - DLT_CHOICE(DLT_MFR, "FRF.16 Frame Relay"), - DLT_CHOICE(DLT_JUNIPER_VP, "Juniper Voice PIC"), - DLT_CHOICE(DLT_A429, "Arinc 429"), - DLT_CHOICE(DLT_A653_ICM, "Arinc 653 Interpartition Communication"), - DLT_CHOICE(DLT_USB, "USB"), - DLT_CHOICE(DLT_BLUETOOTH_HCI_H4, "Bluetooth HCI UART transport layer"), - DLT_CHOICE(DLT_IEEE802_16_MAC_CPS, "IEEE 802.16 MAC Common Part Sublayer"), - DLT_CHOICE(DLT_USB_LINUX, "USB with Linux header"), - DLT_CHOICE(DLT_CAN20B, "Controller Area Network (CAN) v. 2.0B"), - DLT_CHOICE(DLT_IEEE802_15_4_LINUX, "IEEE 802.15.4 with Linux padding"), - DLT_CHOICE(DLT_PPI, "Per-Packet Information"), - DLT_CHOICE(DLT_IEEE802_16_MAC_CPS_RADIO, "IEEE 802.16 MAC Common Part Sublayer plus radiotap header"), - DLT_CHOICE(DLT_JUNIPER_ISM, "Juniper Integrated Service Module"), - DLT_CHOICE(DLT_IEEE802_15_4, "IEEE 802.15.4"), - DLT_CHOICE(DLT_SITA, "SITA pseudo-header"), - DLT_CHOICE(DLT_ERF, "Endace ERF header"), - DLT_CHOICE(DLT_RAIF1, "Ethernet with u10 Networks pseudo-header"), - DLT_CHOICE(DLT_IPMB, "IPMB"), - DLT_CHOICE(DLT_JUNIPER_ST, "Juniper Secure Tunnel"), - DLT_CHOICE(DLT_BLUETOOTH_HCI_H4_WITH_PHDR, "Bluetooth HCI UART transport layer plus pseudo-header"), - DLT_CHOICE(DLT_AX25_KISS, "AX.25 with KISS header"), - DLT_CHOICE(DLT_IEEE802_15_4_NONASK_PHY, "IEEE 802.15.4 with non-ASK PHY data"), - DLT_CHOICE(DLT_MPLS, "MPLS with label as link-layer header"), - DLT_CHOICE(DLT_USB_LINUX_MMAPPED, "USB with padded Linux header"), - DLT_CHOICE(DLT_DECT, "DECT"), - DLT_CHOICE(DLT_AOS, "AOS Space Data Link protocol"), - DLT_CHOICE(DLT_WIHART, "Wireless HART"), - DLT_CHOICE(DLT_FC_2, "Fibre Channel FC-2"), - DLT_CHOICE(DLT_FC_2_WITH_FRAME_DELIMS, "Fibre Channel FC-2 with frame delimiters"), - DLT_CHOICE(DLT_IPNET, "Solaris ipnet"), - DLT_CHOICE(DLT_CAN_SOCKETCAN, "CAN-bus with SocketCAN headers"), - DLT_CHOICE(DLT_IPV4, "Raw IPv4"), - DLT_CHOICE(DLT_IPV6, "Raw IPv6"), - DLT_CHOICE_SENTINEL -}; - /* * This array is designed for mapping upper and lower case letter * together for a case independent comparison. The mappings are @@ -762,6 +754,121 @@ pcap_strcasecmp(const char *s1, const char *s2) return (cm[*us1] - cm[*--us2]); } +struct dlt_choice { + const char *name; + const char *description; + int dlt; +}; + +#define DLT_CHOICE(code, description) { #code, description, code } +#define DLT_CHOICE_SENTINEL { NULL, NULL, 0 } + +static struct dlt_choice dlt_choices[] = { + DLT_CHOICE(DLT_NULL, "BSD loopback"), + DLT_CHOICE(DLT_EN10MB, "Ethernet"), + DLT_CHOICE(DLT_IEEE802, "Token ring"), + DLT_CHOICE(DLT_ARCNET, "BSD ARCNET"), + DLT_CHOICE(DLT_SLIP, "SLIP"), + DLT_CHOICE(DLT_PPP, "PPP"), + DLT_CHOICE(DLT_FDDI, "FDDI"), + DLT_CHOICE(DLT_ATM_RFC1483, "RFC 1483 LLC-encapsulated ATM"), + DLT_CHOICE(DLT_RAW, "Raw IP"), + DLT_CHOICE(DLT_SLIP_BSDOS, "BSD/OS SLIP"), + DLT_CHOICE(DLT_PPP_BSDOS, "BSD/OS PPP"), + DLT_CHOICE(DLT_ATM_CLIP, "Linux Classical IP-over-ATM"), + DLT_CHOICE(DLT_PPP_SERIAL, "PPP over serial"), + DLT_CHOICE(DLT_PPP_ETHER, "PPPoE"), + DLT_CHOICE(DLT_SYMANTEC_FIREWALL, "Symantec Firewall"), + DLT_CHOICE(DLT_C_HDLC, "Cisco HDLC"), + DLT_CHOICE(DLT_IEEE802_11, "802.11"), + DLT_CHOICE(DLT_FRELAY, "Frame Relay"), + DLT_CHOICE(DLT_LOOP, "OpenBSD loopback"), + DLT_CHOICE(DLT_ENC, "OpenBSD encapsulated IP"), + DLT_CHOICE(DLT_LINUX_SLL, "Linux cooked"), + DLT_CHOICE(DLT_LTALK, "Localtalk"), + DLT_CHOICE(DLT_PFLOG, "OpenBSD pflog file"), + DLT_CHOICE(DLT_PRISM_HEADER, "802.11 plus Prism header"), + DLT_CHOICE(DLT_IP_OVER_FC, "RFC 2625 IP-over-Fibre Channel"), + DLT_CHOICE(DLT_SUNATM, "Sun raw ATM"), + DLT_CHOICE(DLT_IEEE802_11_RADIO, "802.11 plus radiotap header"), + DLT_CHOICE(DLT_ARCNET_LINUX, "Linux ARCNET"), + DLT_CHOICE(DLT_JUNIPER_MLPPP, "Juniper Multi-Link PPP"), + DLT_CHOICE(DLT_JUNIPER_MLFR, "Juniper Multi-Link Frame Relay"), + DLT_CHOICE(DLT_JUNIPER_ES, "Juniper Encryption Services PIC"), + DLT_CHOICE(DLT_JUNIPER_GGSN, "Juniper GGSN PIC"), + DLT_CHOICE(DLT_JUNIPER_MFR, "Juniper FRF.16 Frame Relay"), + DLT_CHOICE(DLT_JUNIPER_ATM2, "Juniper ATM2 PIC"), + DLT_CHOICE(DLT_JUNIPER_SERVICES, "Juniper Advanced Services PIC"), + DLT_CHOICE(DLT_JUNIPER_ATM1, "Juniper ATM1 PIC"), + DLT_CHOICE(DLT_APPLE_IP_OVER_IEEE1394, "Apple IP-over-IEEE 1394"), + DLT_CHOICE(DLT_MTP2_WITH_PHDR, "SS7 MTP2 with Pseudo-header"), + DLT_CHOICE(DLT_MTP2, "SS7 MTP2"), + DLT_CHOICE(DLT_MTP3, "SS7 MTP3"), + DLT_CHOICE(DLT_SCCP, "SS7 SCCP"), + DLT_CHOICE(DLT_DOCSIS, "DOCSIS"), + DLT_CHOICE(DLT_LINUX_IRDA, "Linux IrDA"), + DLT_CHOICE(DLT_IEEE802_11_RADIO_AVS, "802.11 plus AVS radio information header"), + DLT_CHOICE(DLT_JUNIPER_MONITOR, "Juniper Passive Monitor PIC"), + DLT_CHOICE(DLT_PPP_PPPD, "PPP for pppd, with direction flag"), + DLT_CHOICE(DLT_JUNIPER_PPPOE, "Juniper PPPoE"), + DLT_CHOICE(DLT_JUNIPER_PPPOE_ATM, "Juniper PPPoE/ATM"), + DLT_CHOICE(DLT_GPRS_LLC, "GPRS LLC"), + DLT_CHOICE(DLT_GPF_T, "GPF-T"), + DLT_CHOICE(DLT_GPF_F, "GPF-F"), + DLT_CHOICE(DLT_JUNIPER_PIC_PEER, "Juniper PIC Peer"), + DLT_CHOICE(DLT_ERF_ETH, "Ethernet with Endace ERF header"), + DLT_CHOICE(DLT_ERF_POS, "Packet-over-SONET with Endace ERF header"), + DLT_CHOICE(DLT_LINUX_LAPD, "Linux vISDN LAPD"), + DLT_CHOICE(DLT_JUNIPER_ETHER, "Juniper Ethernet"), + DLT_CHOICE(DLT_JUNIPER_PPP, "Juniper PPP"), + DLT_CHOICE(DLT_JUNIPER_FRELAY, "Juniper Frame Relay"), + DLT_CHOICE(DLT_JUNIPER_CHDLC, "Juniper C-HDLC"), + DLT_CHOICE(DLT_MFR, "FRF.16 Frame Relay"), + DLT_CHOICE(DLT_JUNIPER_VP, "Juniper Voice PIC"), + DLT_CHOICE(DLT_A429, "Arinc 429"), + DLT_CHOICE(DLT_A653_ICM, "Arinc 653 Interpartition Communication"), + DLT_CHOICE(DLT_USB, "USB"), + DLT_CHOICE(DLT_BLUETOOTH_HCI_H4, "Bluetooth HCI UART transport layer"), + DLT_CHOICE(DLT_IEEE802_16_MAC_CPS, "IEEE 802.16 MAC Common Part Sublayer"), + DLT_CHOICE(DLT_USB_LINUX, "USB with Linux header"), + DLT_CHOICE(DLT_CAN20B, "Controller Area Network (CAN) v. 2.0B"), + DLT_CHOICE(DLT_IEEE802_15_4_LINUX, "IEEE 802.15.4 with Linux padding"), + DLT_CHOICE(DLT_PPI, "Per-Packet Information"), + DLT_CHOICE(DLT_IEEE802_16_MAC_CPS_RADIO, "IEEE 802.16 MAC Common Part Sublayer plus radiotap header"), + DLT_CHOICE(DLT_JUNIPER_ISM, "Juniper Integrated Service Module"), + DLT_CHOICE(DLT_IEEE802_15_4, "IEEE 802.15.4 with FCS"), + DLT_CHOICE(DLT_SITA, "SITA pseudo-header"), + DLT_CHOICE(DLT_ERF, "Endace ERF header"), + DLT_CHOICE(DLT_RAIF1, "Ethernet with u10 Networks pseudo-header"), + DLT_CHOICE(DLT_IPMB, "IPMB"), + DLT_CHOICE(DLT_JUNIPER_ST, "Juniper Secure Tunnel"), + DLT_CHOICE(DLT_BLUETOOTH_HCI_H4_WITH_PHDR, "Bluetooth HCI UART transport layer plus pseudo-header"), + DLT_CHOICE(DLT_AX25_KISS, "AX.25 with KISS header"), + DLT_CHOICE(DLT_IEEE802_15_4_NONASK_PHY, "IEEE 802.15.4 with non-ASK PHY data"), + DLT_CHOICE(DLT_MPLS, "MPLS with label as link-layer header"), + DLT_CHOICE(DLT_USB_LINUX_MMAPPED, "USB with padded Linux header"), + DLT_CHOICE(DLT_DECT, "DECT"), + DLT_CHOICE(DLT_AOS, "AOS Space Data Link protocol"), + DLT_CHOICE(DLT_WIHART, "Wireless HART"), + DLT_CHOICE(DLT_FC_2, "Fibre Channel FC-2"), + DLT_CHOICE(DLT_FC_2_WITH_FRAME_DELIMS, "Fibre Channel FC-2 with frame delimiters"), + DLT_CHOICE(DLT_IPNET, "Solaris ipnet"), + DLT_CHOICE(DLT_CAN_SOCKETCAN, "CAN-bus with SocketCAN headers"), + DLT_CHOICE(DLT_IPV4, "Raw IPv4"), + DLT_CHOICE(DLT_IPV6, "Raw IPv6"), + DLT_CHOICE(DLT_IEEE802_15_4_NOFCS, "IEEE 802.15.4 without FCS"), + DLT_CHOICE(DLT_JUNIPER_VS, "Juniper Virtual Server"), + DLT_CHOICE(DLT_JUNIPER_SRX_E2E, "Juniper SRX E2E"), + DLT_CHOICE(DLT_JUNIPER_FIBRECHANNEL, "Juniper Fibre Channel"), + DLT_CHOICE(DLT_DVB_CI, "DVB-CI"), + DLT_CHOICE(DLT_JUNIPER_ATM_CEMIC, "Juniper ATM CEMIC"), + DLT_CHOICE(DLT_NFLOG, "Linux netfilter log messages"), + DLT_CHOICE(DLT_NETANALYZER, "Ethernet with Hilscher netANALYZER pseudo-header"), + DLT_CHOICE(DLT_NETANALYZER_TRANSPARENT, "Ethernet with Hilscher netANALYZER pseudo-header and with preamble and SFD"), + DLT_CHOICE(DLT_IPOIB, "RFC 4391 IP-over-Infiniband"), + DLT_CHOICE_SENTINEL +}; + int pcap_datalink_name_to_val(const char *name) { @@ -799,6 +906,57 @@ pcap_datalink_val_to_description(int dlt) return (NULL); } +struct tstamp_type_choice { + const char *name; + const char *description; + int type; +}; + +static struct tstamp_type_choice tstamp_type_choices[] = { + { "host", "Host", PCAP_TSTAMP_HOST }, + { "host_lowprec", "Host, low precision", PCAP_TSTAMP_HOST_LOWPREC }, + { "host_hiprec", "Host, high precision", PCAP_TSTAMP_HOST_HIPREC }, + { "adapter", "Adapter", PCAP_TSTAMP_ADAPTER }, + { "adapter_unsynced", "Adapter, not synced with system time", PCAP_TSTAMP_ADAPTER_UNSYNCED }, + { NULL, NULL, 0 } +}; + +int +pcap_tstamp_type_name_to_val(const char *name) +{ + int i; + + for (i = 0; tstamp_type_choices[i].name != NULL; i++) { + if (pcap_strcasecmp(tstamp_type_choices[i].name, name) == 0) + return (tstamp_type_choices[i].type); + } + return (PCAP_ERROR); +} + +const char * +pcap_tstamp_type_val_to_name(int tstamp_type) +{ + int i; + + for (i = 0; tstamp_type_choices[i].name != NULL; i++) { + if (tstamp_type_choices[i].type == tstamp_type) + return (tstamp_type_choices[i].name); + } + return (NULL); +} + +const char * +pcap_tstamp_type_val_to_description(int tstamp_type) +{ + int i; + + for (i = 0; tstamp_type_choices[i].name != NULL; i++) { + if (tstamp_type_choices[i].type == tstamp_type) + return (tstamp_type_choices[i].description); + } + return (NULL); +} + int pcap_snapshot(pcap_t *p) { @@ -865,7 +1023,7 @@ pcap_geterr(pcap_t *p) int pcap_getnonblock(pcap_t *p, char *errbuf) { - return p->getnonblock_op(p, errbuf); + return (p->getnonblock_op(p, errbuf)); } /* @@ -897,7 +1055,7 @@ pcap_getnonblock_fd(pcap_t *p, char *errbuf) int pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf) { - return p->setnonblock_op(p, nonblock, errbuf); + return (p->setnonblock_op(p, nonblock, errbuf)); } #if !defined(WIN32) && !defined(MSDOS) @@ -977,6 +1135,9 @@ pcap_statustostr(int errnum) case PCAP_WARNING: return("Generic warning"); + case PCAP_WARNING_TSTAMP_TYPE_NOTSUP: + return ("That type of time stamp is not supported by that device"); + case PCAP_WARNING_PROMISC_NOTSUP: return ("That device doesn't support promiscuous mode"); @@ -1006,6 +1167,12 @@ pcap_statustostr(int errnum) case PCAP_ERROR_IFACE_NOT_UP: return ("That device is not up"); + + case PCAP_ERROR_CANTSET_TSTAMP_TYPE: + return ("That device doesn't support setting the time stamp type"); + + case PCAP_ERROR_PROMISC_PERM_DENIED: + return ("You don't have permission to capture in promiscuous mode on that device"); } (void)snprintf(ebuf, sizeof ebuf, "Unknown error: %d", errnum); return(ebuf); @@ -1034,7 +1201,7 @@ pcap_strerror(int errnum) int pcap_setfilter(pcap_t *p, struct bpf_program *fp) { - return p->setfilter_op(p, fp); + return (p->setfilter_op(p, fp)); } /* @@ -1049,15 +1216,15 @@ pcap_setdirection(pcap_t *p, pcap_direction_t d) if (p->setdirection_op == NULL) { snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Setting direction is not implemented on this platform"); - return -1; + return (-1); } else - return p->setdirection_op(p, d); + return (p->setdirection_op(p, d)); } int pcap_stats(pcap_t *p, struct pcap_stat *ps) { - return p->stats_op(p, ps); + return (p->stats_op(p, ps)); } static int @@ -1072,7 +1239,7 @@ pcap_stats_dead(pcap_t *p, struct pcap_stat *ps _U_) int pcap_setbuff(pcap_t *p, int dim) { - return p->setbuff_op(p, dim); + return (p->setbuff_op(p, dim)); } static int @@ -1086,7 +1253,7 @@ pcap_setbuff_dead(pcap_t *p, int dim) int pcap_setmode(pcap_t *p, int mode) { - return p->setmode_op(p, mode); + return (p->setmode_op(p, mode)); } static int @@ -1100,7 +1267,7 @@ pcap_setmode_dead(pcap_t *p, int mode) int pcap_setmintocopy(pcap_t *p, int size) { - return p->setmintocopy_op(p, size); + return (p->setmintocopy_op(p, size)); } static int @@ -1213,6 +1380,11 @@ pcap_cleanup_live_common(pcap_t *p) p->dlt_list = NULL; p->dlt_count = 0; } + if (p->tstamp_type_list != NULL) { + free(p->tstamp_type_list); + p->tstamp_type_list = NULL; + p->tstamp_type_count = 0; + } pcap_freecode(&p->fcode); #if !defined(WIN32) && !defined(MSDOS) if (p->fd >= 0) { @@ -1249,7 +1421,7 @@ pcap_open_dead(int linktype, int snaplen) #endif p->cleanup_op = pcap_cleanup_dead; p->activated = 1; - return p; + return (p); } /* diff --git a/contrib/libpcap/pcap/bpf.h b/contrib/libpcap/pcap/bpf.h index 8cea3532418..0495c7f00ca 100644 --- a/contrib/libpcap/pcap/bpf.h +++ b/contrib/libpcap/pcap/bpf.h @@ -48,10 +48,30 @@ * "pcap-bpf.c" will include the native OS version, as it deals with * the OS's BPF implementation. * - * XXX - should this all just be moved to "pcap.h"? + * At least two programs found by Google Code Search explicitly includes + * (even though / includes it for you), + * so moving that stuff to would break the build for some + * programs. */ -#ifndef BPF_MAJOR_VERSION +/* + * If we've already included , don't re-define this stuff. + * We assume BSD-style multiple-include protection in , + * which is true of all but the oldest versions of FreeBSD and NetBSD, + * or Tru64 UNIX-style multiple-include protection (or, at least, + * Tru64 UNIX 5.x-style; I don't have earlier versions available to check), + * or AIX-style multiple-include protection (or, at least, AIX 5.x-style; + * I don't have earlier versions available to check). + * + * We do not check for BPF_MAJOR_VERSION, as that's defined by + * , which is directly or indirectly included in some + * programs that also include pcap.h, and doesn't + * define stuff we need. + * + * This also provides our own multiple-include protection. + */ +#if !defined(_NET_BPF_H_) && !defined(_BPF_H_) && !defined(_H_BPF) && !defined(lib_pcap_bpf_h) +#define lib_pcap_bpf_h #ifdef __cplusplus extern "C" { @@ -70,7 +90,9 @@ typedef u_int bpf_u_int32; /* * Alignment macros. BPF_WORDALIGN rounds up to the next - * even multiple of BPF_ALIGNMENT. + * even multiple of BPF_ALIGNMENT. + * + * Tcpdump's print-pflog.c uses this, so we define it here. */ #ifndef __NetBSD__ #define BPF_ALIGNMENT sizeof(bpf_int32) @@ -79,9 +101,6 @@ typedef u_int bpf_u_int32; #endif #define BPF_WORDALIGN(x) (((x)+(BPF_ALIGNMENT-1))&~(BPF_ALIGNMENT-1)) -#define BPF_MAXBUFSIZE 0x8000 -#define BPF_MINBUFSIZE 32 - /* * Structure for "pcap_compile()", "pcap_setfilter()", etc.. */ @@ -91,26 +110,7 @@ struct bpf_program { }; /* - * Struct return by BIOCVERSION. This represents the version number of - * the filter language described by the instruction encodings below. - * bpf understands a program iff kernel_major == filter_major && - * kernel_minor >= filter_minor, that is, if the value returned by the - * running kernel has the same major number and a minor number equal - * equal to or less than the filter being downloaded. Otherwise, the - * results are undefined, meaning an error may be returned or packets - * may be accepted haphazardly. - * It has nothing to do with the source code version. - */ -struct bpf_version { - u_short bv_major; - u_short bv_minor; -}; -/* Current version number of filter architecture. */ -#define BPF_MAJOR_VERSION 1 -#define BPF_MINOR_VERSION 1 - -/* - * Data-link level type codes. + * Link-layer header type codes. * * Do *NOT* add new values to this list without asking * "tcpdump-workers@lists.tcpdump.org" for a value. Otherwise, you run @@ -119,6 +119,12 @@ struct bpf_version { * being able to handle captures with your new DLT_ value, with no hope * that they will ever be changed to do so (as that would destroy their * ability to read captures using that value for that other purpose). + * + * See + * + * http://www.tcpdump.org/linktypes.html + * + * for detailed descriptions of some of these link-layer header types. */ /* @@ -203,10 +209,23 @@ struct bpf_version { /* * Values between 100 and 103 are used in capture file headers as - * link-layer types corresponding to DLT_ types that differ - * between platforms; don't use those values for new DLT_ new types. + * link-layer header type LINKTYPE_ values corresponding to DLT_ types + * that differ between platforms; don't use those values for new DLT_ + * new types. */ +/* + * Values starting with 104 are used for newly-assigned link-layer + * header type values; for those link-layer header types, the DLT_ + * value returned by pcap_datalink() and passed to pcap_open_dead(), + * and the LINKTYPE_ value that appears in capture files, are the + * same. + * + * DLT_MATCHING_MIN is the lowest such value; DLT_MATCHING_MAX is + * the highest such value. + */ +#define DLT_MATCHING_MIN 104 + /* * This value was defined by libpcap 0.5; platforms that have defined * it with a different value should define it here with that value - @@ -697,6 +716,8 @@ struct bpf_version { /* * IEEE 802.15.4, exactly as it appears in the spec (no padding, no * nothing); requested by Mikko Saarnivala . + * For this one, we expect the FCS to be present at the end of the frame; + * if the frame has no FCS, DLT_IEEE802_15_4_NOFCS should be used. */ #define DLT_IEEE802_15_4 195 @@ -942,7 +963,7 @@ struct bpf_version { * An IPv4 or IPv6 datagram follows the pseudo-header; dli_family indicates * which of those it is. */ -#define DLT_IPNET 226 +#define DLT_IPNET 226 /* * CAN (Controller Area Network) frames, with a pseudo-header as supplied @@ -951,14 +972,116 @@ struct bpf_version { * * Requested by Felix Obenhuber . */ -#define DLT_CAN_SOCKETCAN 227 +#define DLT_CAN_SOCKETCAN 227 /* * Raw IPv4/IPv6; different from DLT_RAW in that the DLT_ value specifies * whether it's v4 or v6. Requested by Darren Reed . */ -#define DLT_IPV4 228 -#define DLT_IPV6 229 +#define DLT_IPV4 228 +#define DLT_IPV6 229 + +/* + * IEEE 802.15.4, exactly as it appears in the spec (no padding, no + * nothing), and with no FCS at the end of the frame; requested by + * Jon Smirl . + */ +#define DLT_IEEE802_15_4_NOFCS 230 + +/* + * Raw D-Bus: + * + * http://www.freedesktop.org/wiki/Software/dbus + * + * messages: + * + * http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-messages + * + * starting with the endianness flag, followed by the message type, etc., + * but without the authentication handshake before the message sequence: + * + * http://dbus.freedesktop.org/doc/dbus-specification.html#auth-protocol + * + * Requested by Martin Vidner . + */ +#define DLT_DBUS 231 + +/* + * Juniper-private data link type, as per request from + * Hannes Gredler . + */ +#define DLT_JUNIPER_VS 232 +#define DLT_JUNIPER_SRX_E2E 233 +#define DLT_JUNIPER_FIBRECHANNEL 234 + +/* + * DVB-CI (DVB Common Interface for communication between a PC Card + * module and a DVB receiver). See + * + * http://www.kaiser.cx/pcap-dvbci.html + * + * for the specification. + * + * Requested by Martin Kaiser . + */ +#define DLT_DVB_CI 235 + +/* + * Variant of 3GPP TS 27.010 multiplexing protocol (similar to, but + * *not* the same as, 27.010). Requested by Hans-Christoph Schemmel + * . + */ +#define DLT_MUX27010 236 + +/* + * STANAG 5066 D_PDUs. Requested by M. Baris Demiray + * . + */ +#define DLT_STANAG_5066_D_PDU 237 + +/* + * Juniper-private data link type, as per request from + * Hannes Gredler . + */ +#define DLT_JUNIPER_ATM_CEMIC 238 + +/* + * NetFilter LOG messages + * (payload of netlink NFNL_SUBSYS_ULOG/NFULNL_MSG_PACKET packets) + * + * Requested by Jakub Zawadzki + */ +#define DLT_NFLOG 239 + +/* + * Hilscher Gesellschaft fuer Systemautomation mbH link-layer type + * for Ethernet packets with a 4-byte pseudo-header and always + * with the payload including the FCS, as supplied by their + * netANALYZER hardware and software. + * + * Requested by Holger P. Frommer + */ +#define DLT_NETANALYZER 240 + +/* + * Hilscher Gesellschaft fuer Systemautomation mbH link-layer type + * for Ethernet packets with a 4-byte pseudo-header and FCS and + * with the Ethernet header preceded by 7 bytes of preamble and + * 1 byte of SFD, as supplied by their netANALYZER hardware and + * software. + * + * Requested by Holger P. Frommer + */ +#define DLT_NETANALYZER_TRANSPARENT 241 + +/* + * IP-over-Infiniband, as specified by RFC 4391. + * + * Requested by Petr Sumbera . + */ +#define DLT_IPOIB 242 + +#define DLT_MATCHING_MAX 242 /* highest value in the "matching" range */ /* * DLT and savefile link type values are split into a class and @@ -1069,4 +1192,4 @@ extern u_int bpf_filter(); } #endif -#endif +#endif /* !defined(_NET_BPF_H_) && !defined(_BPF_H_) && !defined(_H_BPF) && !defined(lib_pcap_bpf_h) */ diff --git a/contrib/libpcap/pcap/pcap.h b/contrib/libpcap/pcap/pcap.h index 7b19fb810f2..8f4ef9e27a3 100644 --- a/contrib/libpcap/pcap/pcap.h +++ b/contrib/libpcap/pcap/pcap.h @@ -249,6 +249,8 @@ typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, #define PCAP_ERROR_NOT_RFMON -7 /* operation supported only in monitor mode */ #define PCAP_ERROR_PERM_DENIED -8 /* no permission to open the device */ #define PCAP_ERROR_IFACE_NOT_UP -9 /* interface isn't up */ +#define PCAP_ERROR_CANTSET_TSTAMP_TYPE -10 /* this device doesn't support setting the time stamp type */ +#define PCAP_ERROR_PROMISC_PERM_DENIED -11 /* you don't have permission to capture in promiscuous mode */ /* * Warning codes for the pcap API. @@ -257,6 +259,7 @@ typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, */ #define PCAP_WARNING 1 /* generic warning code */ #define PCAP_WARNING_PROMISC_NOTSUP 2 /* this device doesn't support promiscuous mode */ +#define PCAP_WARNING_TSTAMP_TYPE_NOTSUP 3 /* the requested time stamp type is not supported */ /* * Value to pass to pcap_compile() as the netmask if you don't know what @@ -273,9 +276,60 @@ int pcap_set_promisc(pcap_t *, int); int pcap_can_set_rfmon(pcap_t *); int pcap_set_rfmon(pcap_t *, int); int pcap_set_timeout(pcap_t *, int); +int pcap_set_tstamp_type(pcap_t *, int); int pcap_set_buffer_size(pcap_t *, int); int pcap_activate(pcap_t *); +int pcap_list_tstamp_types(pcap_t *, int **); +void pcap_free_tstamp_types(int *); +int pcap_tstamp_type_name_to_val(const char *); +const char *pcap_tstamp_type_val_to_name(int); +const char *pcap_tstamp_type_val_to_description(int); + +/* + * Time stamp types. + * Not all systems and interfaces will necessarily support all of these. + * + * A system that supports PCAP_TSTAMP_HOST is offering time stamps + * provided by the host machine, rather than by the capture device, + * but not committing to any characteristics of the time stamp; + * it will not offer any of the PCAP_TSTAMP_HOST_ subtypes. + * + * PCAP_TSTAMP_HOST_LOWPREC is a time stamp, provided by the host machine, + * that's low-precision but relatively cheap to fetch; it's normally done + * using the system clock, so it's normally synchronized with times you'd + * fetch from system calls. + * + * PCAP_TSTAMP_HOST_HIPREC is a time stamp, provided by the host machine, + * that's high-precision; it might be more expensive to fetch. It might + * or might not be synchronized with the system clock, and might have + * problems with time stamps for packets received on different CPUs, + * depending on the platform. + * + * PCAP_TSTAMP_ADAPTER is a high-precision time stamp supplied by the + * capture device; it's synchronized with the system clock. + * + * PCAP_TSTAMP_ADAPTER_UNSYNCED is a high-precision time stamp supplied by + * the capture device; it's not synchronized with the system clock. + * + * Note that time stamps synchronized with the system clock can go + * backwards, as the system clock can go backwards. If a clock is + * not in sync with the system clock, that could be because the + * system clock isn't keeping accurate time, because the other + * clock isn't keeping accurate time, or both. + * + * Note that host-provided time stamps generally correspond to the + * time when the time-stamping code sees the packet; this could + * be some unknown amount of time after the first or last bit of + * the packet is received by the network adapter, due to batching + * of interrupts for packet arrival, queueing delays, etc.. + */ +#define PCAP_TSTAMP_HOST 0 /* host-provided, unknown characteristics */ +#define PCAP_TSTAMP_HOST_LOWPREC 1 /* host-provided, low precision */ +#define PCAP_TSTAMP_HOST_HIPREC 2 /* host-provided, high precision */ +#define PCAP_TSTAMP_ADAPTER 3 /* device-provided, synced with the system clock */ +#define PCAP_TSTAMP_ADAPTER_UNSYNCED 4 /* device-provided, not synced with the system clock */ + pcap_t *pcap_open_live(const char *, int, int, int, char *); pcap_t *pcap_open_dead(int, int); pcap_t *pcap_open_offline(const char *, char *); @@ -346,8 +400,16 @@ void pcap_freealldevs(pcap_if_t *); const char *pcap_lib_version(void); -/* XXX this guy lives in the bpf tree */ +/* + * On at least some versions of NetBSD, we don't want to declare + * bpf_filter() here, as it's also be declared in , with a + * different signature, but, on other BSD-flavored UN*Xes, it's not + * declared in , so we *do* want to declare it here, so it's + * declared when we build pcap-bpf.c. + */ +#ifndef __NetBSD__ u_int bpf_filter(struct bpf_insn *, u_char *, u_int, u_int); +#endif int bpf_validate(const struct bpf_insn *f, int len); char *bpf_image(struct bpf_insn *, int); void bpf_dump(struct bpf_program *, int); @@ -395,4 +457,4 @@ int pcap_get_selectable_fd(pcap_t *); } #endif -#endif +#endif /* lib_pcap_pcap_h */ diff --git a/contrib/libpcap/pcap_activate.3pcap b/contrib/libpcap/pcap_activate.3pcap index b33fa530fd2..f963d35e519 100644 --- a/contrib/libpcap/pcap_activate.3pcap +++ b/contrib/libpcap/pcap_activate.3pcap @@ -43,6 +43,11 @@ returns 0 on success without warnings, .B PCAP_WARNING_PROMISC_NOTSUP on success on a device that doesn't support promiscuous mode if promiscuous mode was requested, +.B PCAP_WARNING_TSTAMP_TYPE_NOTSUP +on success if the time stamp type specified in a previous +.B pcap_set_tstamp_type() +call isn't supported by the capture source (the time stamp type is +left as the default), .B PCAP_WARNING on success with any other warning, .B PCAP_ERROR_ACTIVATED @@ -52,6 +57,9 @@ if the capture source specified when the handle was created doesn't exist, .B PCAP_ERROR_PERM_DENIED if the process doesn't have permission to open the capture source, +.B PCAP_ERROR_PROMISC_PERM_DENIED +if the process has permission to open the capture source but doesn't +have permission to put it into promiscuous mode, .B PCAP_ERROR_RFMON_NOTSUP if monitor mode was specified but the capture source doesn't support monitor mode, diff --git a/contrib/libpcap/pcap_can_set_rfmon.3pcap b/contrib/libpcap/pcap_can_set_rfmon.3pcap index 4c85e238ba0..00b92a40343 100644 --- a/contrib/libpcap/pcap_can_set_rfmon.3pcap +++ b/contrib/libpcap/pcap_can_set_rfmon.3pcap @@ -19,7 +19,7 @@ .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" -.TH PCAP_CAN_SET_RFMON 3PCAP "5 April 2008" +.TH PCAP_CAN_SET_RFMON 3PCAP "18 May 2010" .SH NAME pcap_can_set_rfmon \- check whether monitor mode can be set for a not-yet-activated capture handle @@ -37,11 +37,15 @@ int pcap_can_set_rfmon(pcap_t *p); checks whether monitor mode could be set on a capture handle when the handle is activated. .SH RETURN VALUE -.B pcap_set_rfmon() +.B pcap_can_set_rfmon() returns 0 if monitor mode could not be set, 1 if monitor mode could be set, .B PCAP_ERROR_NO_SUCH_DEVICE -if the device specified when the handle was created doesn't exist, +if the capture source specified when the handle was created doesn't +exist, +.B PCAP_ERROR_PERM_DENIED +if the process doesn't have permission to check whether monitor mode +could be supported, .B PCAP_ERROR_ACTIVATED if called on a capture handle that has been activated, or .B PCAP_ERROR diff --git a/contrib/libpcap/pcap_compile.3pcap b/contrib/libpcap/pcap_compile.3pcap index b0bfee3b5df..aa5e4917ac7 100644 --- a/contrib/libpcap/pcap_compile.3pcap +++ b/contrib/libpcap/pcap_compile.3pcap @@ -1,4 +1,4 @@ -.\" @(#) $Header: /tcpdump/master/libpcap/pcap_compile.3pcap.in,v 1.1.2.2 2008-10-21 07:44:57 guy Exp $ +.\" @(#) $Header: /tcpdump/master/libpcap/pcap_compile.3pcap.in,v 1.1 2008-10-21 07:33:02 guy Exp $ .\" .\" Copyright (c) 1994, 1996, 1997 .\" The Regents of the University of California. All rights reserved. @@ -54,9 +54,9 @@ captured; it is used only when checking for IPv4 broadcast addresses in the filter program. If the netmask of the network on which packets are being captured isn't known to the program, or if packets are being captured on the Linux "any" pseudo-interface that can capture on more -than one network, a value of 0 can be supplied; tests for IPv4 broadcast -addreses won't be done correctly, but all other tests in the filter -program will be OK. +than one network, a value of PCAP_NETMASK_UNKNOWN can be supplied; tests +for IPv4 broadcast addresses will fail to compile, but all other tests in +the filter program will be OK. .SH RETURN VALUE .B pcap_compile() returns 0 on success and \-1 on failure. diff --git a/contrib/libpcap/pcap_compile.3pcap.in b/contrib/libpcap/pcap_compile.3pcap.in index e557fdb43ec..7dbdad5a1ca 100644 --- a/contrib/libpcap/pcap_compile.3pcap.in +++ b/contrib/libpcap/pcap_compile.3pcap.in @@ -55,7 +55,7 @@ the filter program. If the netmask of the network on which packets are being captured isn't known to the program, or if packets are being captured on the Linux "any" pseudo-interface that can capture on more than one network, a value of PCAP_NETMASK_UNKNOWN can be supplied; tests -for IPv4 broadcast addreses will fail to compile, but all other tests in +for IPv4 broadcast addresses will fail to compile, but all other tests in the filter program will be OK. .SH RETURN VALUE .B pcap_compile() diff --git a/contrib/libpcap/pcap_datalink.3pcap b/contrib/libpcap/pcap_datalink.3pcap index 06dfdeef2f2..285d522bbfd 100644 --- a/contrib/libpcap/pcap_datalink.3pcap +++ b/contrib/libpcap/pcap_datalink.3pcap @@ -1,4 +1,4 @@ -.\" @(#) $Header: /tcpdump/master/libpcap/pcap_datalink.3pcap.in,v 1.1.2.2 2008-10-21 07:44:57 guy Exp $ +.\" @(#) $Header: /tcpdump/master/libpcap/pcap_datalink.3pcap.in,v 1.1 2008-10-21 07:33:02 guy Exp $ .\" .\" Copyright (c) 1994, 1996, 1997 .\" The Regents of the University of California. All rights reserved. @@ -19,7 +19,7 @@ .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" -.TH PCAP_DATALINK 3PCAP "5 April 2008" +.TH PCAP_DATALINK 3PCAP "22 August 2010" .SH NAME pcap_datalink \- get the link-layer header type .SH SYNOPSIS @@ -34,7 +34,7 @@ int pcap_datalink(pcap_t *p); .fi .SH DESCRIPTION .B pcap_datalink() -returns the link layer type for the live capture or ``savefile'' +returns the link-layer header type for the live capture or ``savefile'' specified by .IR p . .SH SEE ALSO diff --git a/contrib/libpcap/pcap_datalink.3pcap.in b/contrib/libpcap/pcap_datalink.3pcap.in index cdc7c245630..3d4ace1d794 100644 --- a/contrib/libpcap/pcap_datalink.3pcap.in +++ b/contrib/libpcap/pcap_datalink.3pcap.in @@ -19,7 +19,7 @@ .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" -.TH PCAP_DATALINK 3PCAP "5 April 2008" +.TH PCAP_DATALINK 3PCAP "22 August 2010" .SH NAME pcap_datalink \- get the link-layer header type .SH SYNOPSIS @@ -34,7 +34,7 @@ int pcap_datalink(pcap_t *p); .fi .SH DESCRIPTION .B pcap_datalink() -returns the link layer type for the live capture or ``savefile'' +returns the link-layer header type for the live capture or ``savefile'' specified by .IR p . .SH SEE ALSO diff --git a/contrib/libpcap/pcap_datalink_name_to_val.3pcap b/contrib/libpcap/pcap_datalink_name_to_val.3pcap index 93daafdfb13..9c8e18a3c48 100644 --- a/contrib/libpcap/pcap_datalink_name_to_val.3pcap +++ b/contrib/libpcap/pcap_datalink_name_to_val.3pcap @@ -19,7 +19,7 @@ .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" -.TH PCAP_DATALINK_NAME_TO_VAL 3PCAP "5 April 2008" +.TH PCAP_DATALINK_NAME_TO_VAL 3PCAP "22 August 2010" .SH NAME pcap_datalink_name_to_val \- get the link-layer header type value corresponding to a header type name @@ -35,12 +35,12 @@ int pcap_datalink_name_to_val(const char *name); .fi .SH DESCRIPTION .B pcap_datalink_name_to_val() -translates a data link type name, which is a +translates a link-layer header type name, which is a .B DLT_ name with the .B DLT_ -removed, to the corresponding data link type value. The translation -is case-insensitive. +removed, to the corresponding link-layer header type value. The +translation is case-insensitive. .SH RETURN VALUE .B pcap_datalink_name_to_val() returns 0 on success and \-1 on failure. diff --git a/contrib/libpcap/pcap_datalink_val_to_name.3pcap b/contrib/libpcap/pcap_datalink_val_to_name.3pcap index 5e4f6bceda2..26397faf91d 100644 --- a/contrib/libpcap/pcap_datalink_val_to_name.3pcap +++ b/contrib/libpcap/pcap_datalink_val_to_name.3pcap @@ -19,7 +19,7 @@ .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" -.TH PCAP_DATALINK_VAL_TO_NAME 3PCAP "24 December 2008" +.TH PCAP_DATALINK_VAL_TO_NAME 3PCAP "22 August 2010" .SH NAME pcap_datalink_val_to_name, pcap_datalink_val_to_description \- get a name or description for a link-layer header type value @@ -36,9 +36,9 @@ const char *pcap_datalink_val_to_description(int dlt); .fi .SH DESCRIPTION .B pcap_datalink_val_to_name() -translates a data link type value to the corresponding data link type -name. NULL is returned on failure. +translates a link-layer header type value to the corresponding +link-layer header type name. NULL is returned on failure. .PP .B pcap_datalink_val_to_description() -translates a data link type value to a short description of that data -link type. NULL is returned on failure. +translates a link-layer header type value to a short description of that +link-layer header type. NULL is returned on failure. diff --git a/contrib/libpcap/pcap_dump_open.3pcap b/contrib/libpcap/pcap_dump_open.3pcap index 70aa932cbf5..82f88c15bae 100644 --- a/contrib/libpcap/pcap_dump_open.3pcap +++ b/contrib/libpcap/pcap_dump_open.3pcap @@ -1,4 +1,4 @@ -.\" @(#) $Header: /tcpdump/master/libpcap/pcap_dump_open.3pcap.in,v 1.1.2.2 2008-10-23 05:59:43 guy Exp $ +.\" @(#) $Header: /tcpdump/master/libpcap/pcap_dump_open.3pcap.in,v 1.1 2008-10-23 05:56:59 guy Exp $ .\" .\" Copyright (c) 1994, 1996, 1997 .\" The Regents of the University of California. All rights reserved. diff --git a/contrib/libpcap/pcap_fileno.3pcap b/contrib/libpcap/pcap_fileno.3pcap index 02d24b532fb..723733e73de 100644 --- a/contrib/libpcap/pcap_fileno.3pcap +++ b/contrib/libpcap/pcap_fileno.3pcap @@ -47,7 +47,7 @@ returns the file descriptor from which captured packets are read. .LP If .I p -refers to a ``savefile'' that was opened using fuctions such as +refers to a ``savefile'' that was opened using functions such as .BR pcap_open_offline() or .BR pcap_fopen_offline() , diff --git a/contrib/libpcap/pcap_findalldevs.3pcap b/contrib/libpcap/pcap_findalldevs.3pcap index 3bf152059e8..2e56d091658 100644 --- a/contrib/libpcap/pcap_findalldevs.3pcap +++ b/contrib/libpcap/pcap_findalldevs.3pcap @@ -19,9 +19,10 @@ .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" -.TH PCAP_FINDALLDEVS 3PCAP "5 April 2008" +.TH PCAP_FINDALLDEVS 3PCAP "22 August 2010" .SH NAME -pcap_findalldevs \- get a list of capture devices +pcap_findalldevs, pcap_freealldevs \- get a list of capture devices, and +free that list .SH SYNOPSIS .nf .ft B @@ -35,6 +36,7 @@ char errbuf[PCAP_ERRBUF_SIZE]; .LP .ft B int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf); +void pcap_freealldevs(pcap_if_t *alldevs); .ft .fi .SH DESCRIPTION @@ -48,12 +50,17 @@ or with (Note that there may be network devices that cannot be opened by the process calling .BR pcap_findalldevs() , -because, for example, that process might not have sufficient privileges +because, for example, that process does not have sufficient privileges to open them for capturing; if so, those devices will not appear on the list.) +If +.B pcap_findalldevs() +succeeds, the pointer pointed to by .I alldevsp -is set to point to the first element of the list; each element of the -list is of type +is set to point to the first element of the list, or to +.B NULL +if no devices were found (this is considered success). +Each element of the list is of type .BR pcap_if_t , and has the following members: .RS @@ -75,14 +82,18 @@ if not a pointer to a string giving a human-readable description of the device .TP .B addresses -a pointer to the first element of a list of addresses for the interface +a pointer to the first element of a list of network addresses for the +device, +or +.B NULL +if the device has no addresses .TP .B flags -interface flags: +device flags: .RS .TP .B PCAP_IF_LOOPBACK -set if the interface is a loopback interface +set if the device is a loopback interface .RE .RE .PP @@ -119,7 +130,7 @@ a pointer to a that contains the broadcast address corresponding to the address pointed to by .BR addr ; -may be null if the interface doesn't support broadcasts +may be null if the device doesn't support broadcasts .TP .B dstaddr if not @@ -129,21 +140,40 @@ a pointer to a that contains the destination address corresponding to the address pointed to by .BR addr ; -may be null if the interface isn't a point-to-point interface +may be null if the device isn't a point-to-point interface .RE .PP -Note that not all the addresses in the list of addresses are -necessarily IPv4 or IPv6 addresses - you must check the +Note that the addresses in the list of addresses might be IPv4 +addresses, IPv6 addresses, or some other type of addresses, so you must +check the .B sa_family member of the .B "struct sockaddr" -before interpreting the contents of the address. +before interpreting the contents of the address; do not assume that the +addresses are all IPv4 addresses, or even all IPv4 or IPv6 addresses. +IPv4 addresses have the value +.BR AF_INET , +IPv6 addresses have the value +.B AF_INET6 +(which older operating systems that don't support IPv6 might not +define), and other addresses have other values. Whether other addresses +are returned, and what types they might have is platform-dependent. +For IPv4 addresses, the +.B "struct sockaddr" +pointer can be interpreted as if it pointed to a +.BR "struct sockaddr_in" ; +for IPv6 addresses, it can be interpreted as if it pointed to a +.BR "struct sockaddr_in6". .PP The list of devices must be freed with -.BR pcap_freealldevs() . +.BR pcap_freealldevs() , +whch frees the list pointed to by +.IR alldevs . .SH RETURN VALUE .B pcap_findalldevs() -returns 0 on success and \-1 on failure. +returns 0 on success and \-1 on failure; as indicated, finding no +devices is considered success, rather than failure, so 0 will be +returned in that case. If \-1 is returned, .I errbuf is filled in with an appropriate error message. @@ -153,4 +183,4 @@ is assumed to be able to hold at least chars. .SH SEE ALSO pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP), -pcap_open_live(3PCAP), pcap_freealldevs(3PCAP) +pcap_open_live(3PCAP) diff --git a/contrib/libpcap/pcap_get_selectable_fd.3pcap b/contrib/libpcap/pcap_get_selectable_fd.3pcap index 61be3d32e8a..ae33dbb2e4b 100644 --- a/contrib/libpcap/pcap_get_selectable_fd.3pcap +++ b/contrib/libpcap/pcap_get_selectable_fd.3pcap @@ -56,19 +56,29 @@ or (for example, regular network devices on FreeBSD 4.3 and 4.4, and Endace DAG devices), so \-1 is returned for those devices. .PP -Note that on most versions of most BSDs (including Mac OS X) +Note that in: +.IP +FreeBSD prior to FreeBSD 4.6; +.IP +NetBSD prior to NetBSD 3.0; +.IP +OpenBSD prior to OpenBSD 2.4; +.IP +Mac OS X prior to Mac OS X 10.7; +.PP .B select() and .B poll() do not work correctly on BPF devices; .B pcap_get_selectable_fd() will return a file descriptor on most of those versions (the exceptions -being FreeBSD 4.3 and 4.4), a simple +being FreeBSD 4.3 and 4.4), but a simple .B select() or .B poll() -will not return even after the read timeout expires. To work around -this, an application that uses +will not indicate that the descriptor is readable until a full buffer's +worth of packets is received, even if the read timeout expires before +then. To work around this, an application that uses .B select() or .B poll() diff --git a/contrib/libpcap/pcap_list_datalinks.3pcap b/contrib/libpcap/pcap_list_datalinks.3pcap index 4e73196d57c..f053a000037 100644 --- a/contrib/libpcap/pcap_list_datalinks.3pcap +++ b/contrib/libpcap/pcap_list_datalinks.3pcap @@ -1,4 +1,4 @@ -.\" @(#) $Header: /tcpdump/master/libpcap/pcap_list_datalinks.3pcap.in,v 1.1.2.2 2008-10-21 07:44:57 guy Exp $ +.\" @(#) $Header: /tcpdump/master/libpcap/pcap_list_datalinks.3pcap.in,v 1.1 2008-10-21 07:33:02 guy Exp $ .\" .\" Copyright (c) 1994, 1996, 1997 .\" The Regents of the University of California. All rights reserved. @@ -19,10 +19,10 @@ .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" -.TH PCAP_LIST_DATALINKS 3PCAP "5 April 2008" +.TH PCAP_LIST_DATALINKS 3PCAP "22 August 2010" .SH NAME -pcap_list_datalinks \- get a list of link-layer header types supported -by a capture device +pcap_list_datalinks, pcap_free_datalinks \- get a list of link-layer header +types supported by a capture device, and free that list .SH SYNOPSIS .nf .ft B @@ -31,21 +31,26 @@ by a capture device .LP .ft B int pcap_list_datalinks(pcap_t *p, int **dlt_buf); +void pcap_free_datalinks(int *dlt_list); .ft .fi .SH DESCRIPTION .B pcap_list_datalinks() -is used to get a list of the supported data link types of the interface -associated with the pcap descriptor. +is used to get a list of the supported link-layer header types of the +interface associated with the pcap descriptor. .B pcap_list_datalinks() allocates an array to hold the list and sets -.IR *dlt_buf . +.IR *dlt_buf +to point to that array. +.LP The caller is responsible for freeing the array with -.BR pcap_free_datalinks (3PCAP). +.BR pcap_free_datalinks() , +which frees the list of link-layer header types pointed to by +.IR dlt_list . .SH RETURN VALUE .B pcap_list_datalinks() -returns the number of data link types in the array on success and \-1 -on failure. +returns the number of link-layer header types in the array on success +and \-1 on failure. If \-1 is returned, .B pcap_geterr() or @@ -54,5 +59,6 @@ may be called with .I p as an argument to fetch or display the error text. .SH SEE ALSO -pcap(3PCAP), pcap_geterr(3PCAP), pcap_free_datalinks(3PCAP), +pcap(3PCAP), pcap_geterr(3PCAP), +pcap_datalink_val_to_name(3PCAP), pcap-linktype(7) diff --git a/contrib/libpcap/pcap_list_datalinks.3pcap.in b/contrib/libpcap/pcap_list_datalinks.3pcap.in index 490e8dde799..632757642b5 100644 --- a/contrib/libpcap/pcap_list_datalinks.3pcap.in +++ b/contrib/libpcap/pcap_list_datalinks.3pcap.in @@ -19,10 +19,10 @@ .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" -.TH PCAP_LIST_DATALINKS 3PCAP "5 April 2008" +.TH PCAP_LIST_DATALINKS 3PCAP "22 August 2010" .SH NAME -pcap_list_datalinks \- get a list of link-layer header types supported -by a capture device +pcap_list_datalinks, pcap_free_datalinks \- get a list of link-layer header +types supported by a capture device, and free that list .SH SYNOPSIS .nf .ft B @@ -31,21 +31,26 @@ by a capture device .LP .ft B int pcap_list_datalinks(pcap_t *p, int **dlt_buf); +void pcap_free_datalinks(int *dlt_list); .ft .fi .SH DESCRIPTION .B pcap_list_datalinks() -is used to get a list of the supported data link types of the interface -associated with the pcap descriptor. +is used to get a list of the supported link-layer header types of the +interface associated with the pcap descriptor. .B pcap_list_datalinks() allocates an array to hold the list and sets -.IR *dlt_buf . +.IR *dlt_buf +to point to that array. +.LP The caller is responsible for freeing the array with -.BR pcap_free_datalinks (3PCAP). +.BR pcap_free_datalinks() , +which frees the list of link-layer header types pointed to by +.IR dlt_list . .SH RETURN VALUE .B pcap_list_datalinks() -returns the number of data link types in the array on success and \-1 -on failure. +returns the number of link-layer header types in the array on success +and \-1 on failure. If \-1 is returned, .B pcap_geterr() or @@ -54,5 +59,6 @@ may be called with .I p as an argument to fetch or display the error text. .SH SEE ALSO -pcap(3PCAP), pcap_geterr(3PCAP), pcap_free_datalinks(3PCAP), +pcap(3PCAP), pcap_geterr(3PCAP), +pcap_datalink_val_to_name(3PCAP), pcap-linktype(@MAN_MISC_INFO@) diff --git a/contrib/libpcap/pcap_list_tstamp_types.3pcap b/contrib/libpcap/pcap_list_tstamp_types.3pcap new file mode 100644 index 00000000000..6d1f16f1d30 --- /dev/null +++ b/contrib/libpcap/pcap_list_tstamp_types.3pcap @@ -0,0 +1,70 @@ +.\" +.\" Copyright (c) 1994, 1996, 1997 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that: (1) source code distributions +.\" retain the above copyright notice and this paragraph in its entirety, (2) +.\" distributions including binary code include the above copyright notice and +.\" this paragraph in its entirety in the documentation or other materials +.\" provided with the distribution, and (3) all advertising materials mentioning +.\" features or use of this software display the following acknowledgement: +.\" ``This product includes software developed by the University of California, +.\" Lawrence Berkeley Laboratory and its contributors.'' Neither the name of +.\" the University nor the names of its contributors may be used to endorse +.\" or promote products derived from this software without specific prior +.\" written permission. +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +.\" +.TH PCAP_LIST_TSTAMP_TYPES 3PCAP "21 August 2010" +.SH NAME +pcap_list_tstamp_types, pcap_free_tstamp_types \- get a list of time +stamp types supported by a capture device, and free that list +.SH SYNOPSIS +.nf +.ft B +#include +.ft +.LP +.ft B +int pcap_list_tstamp_types(pcap_t *p, int **tstamp_typesp); +void pcap_free_tstamp_types(int *tstamp_types); +.ft +.fi +.SH DESCRIPTION +.B pcap_list_tstamp_types() +is used to get a list of the supported time stamp types of the interface +associated with the pcap descriptor. +.B pcap_list_tstamp_types() +allocates an array to hold the list and sets +.I *tstamp_typesp +to point to the array. +See +.BR pcap-tstamp (7) +for a list of all the time stamp types. +.PP +The caller is responsible for freeing the array with +.BR pcap_free_tstamp_types() , +which frees the list pointed to by +.IR tstamp_types . +.SH RETURN VALUE +.B pcap_list_tstamp_types() +returns the number of time stamp types in the array on success and +.B PCAP_ERROR +on failure. +A return value of zero means that you cannot specify a time stamp type; +you are limited to the capture device's default time stamp type. +If +.B PCAP_ERROR +is returned, +.B pcap_geterr() +or +.B pcap_perror() +may be called with +.I p +as an argument to fetch or display the error text. +.SH SEE ALSO +pcap(3PCAP), pcap_geterr(3PCAP), pcap_tstamp_type_val_to_name(3PCAP), +pcap-tstamp(7) diff --git a/contrib/libpcap/pcap_list_tstamp_types.3pcap.in b/contrib/libpcap/pcap_list_tstamp_types.3pcap.in new file mode 100644 index 00000000000..66d3d667931 --- /dev/null +++ b/contrib/libpcap/pcap_list_tstamp_types.3pcap.in @@ -0,0 +1,70 @@ +.\" +.\" Copyright (c) 1994, 1996, 1997 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that: (1) source code distributions +.\" retain the above copyright notice and this paragraph in its entirety, (2) +.\" distributions including binary code include the above copyright notice and +.\" this paragraph in its entirety in the documentation or other materials +.\" provided with the distribution, and (3) all advertising materials mentioning +.\" features or use of this software display the following acknowledgement: +.\" ``This product includes software developed by the University of California, +.\" Lawrence Berkeley Laboratory and its contributors.'' Neither the name of +.\" the University nor the names of its contributors may be used to endorse +.\" or promote products derived from this software without specific prior +.\" written permission. +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +.\" +.TH PCAP_LIST_TSTAMP_TYPES 3PCAP "21 August 2010" +.SH NAME +pcap_list_tstamp_types, pcap_free_tstamp_types \- get a list of time +stamp types supported by a capture device, and free that list +.SH SYNOPSIS +.nf +.ft B +#include +.ft +.LP +.ft B +int pcap_list_tstamp_types(pcap_t *p, int **tstamp_typesp); +void pcap_free_tstamp_types(int *tstamp_types); +.ft +.fi +.SH DESCRIPTION +.B pcap_list_tstamp_types() +is used to get a list of the supported time stamp types of the interface +associated with the pcap descriptor. +.B pcap_list_tstamp_types() +allocates an array to hold the list and sets +.I *tstamp_typesp +to point to the array. +See +.BR pcap-tstamp (@MAN_MISC_INFO@) +for a list of all the time stamp types. +.PP +The caller is responsible for freeing the array with +.BR pcap_free_tstamp_types() , +which frees the list pointed to by +.IR tstamp_types . +.SH RETURN VALUE +.B pcap_list_tstamp_types() +returns the number of time stamp types in the array on success and +.B PCAP_ERROR +on failure. +A return value of zero means that you cannot specify a time stamp type; +you are limited to the capture device's default time stamp type. +If +.B PCAP_ERROR +is returned, +.B pcap_geterr() +or +.B pcap_perror() +may be called with +.I p +as an argument to fetch or display the error text. +.SH SEE ALSO +pcap(3PCAP), pcap_geterr(3PCAP), pcap_tstamp_type_val_to_name(3PCAP), +pcap-tstamp(@MAN_MISC_INFO@) diff --git a/contrib/libpcap/pcap_loop.3pcap b/contrib/libpcap/pcap_loop.3pcap index 70cfaa0293c..da3069310a2 100644 --- a/contrib/libpcap/pcap_loop.3pcap +++ b/contrib/libpcap/pcap_loop.3pcap @@ -109,7 +109,12 @@ pointer to the first (as given in the .I struct pcap_pkthdr a pointer to which is passed to the callback routine) -bytes of data from the packet. +bytes of data from the packet. The +.I struct pcap_pkthdr +and the packet data are not to be freed by the callback routine, and are +not guaranteed to be valid after the callback routine returns; if the +code needs them to be valid after the callback, it must make a copy of +them. .SH RETURN VALUE .B pcap_loop() returns 0 if diff --git a/contrib/libpcap/pcap_major_version.3pcap b/contrib/libpcap/pcap_major_version.3pcap index 6f9c8ae705d..31903dcfd03 100644 --- a/contrib/libpcap/pcap_major_version.3pcap +++ b/contrib/libpcap/pcap_major_version.3pcap @@ -36,12 +36,14 @@ int pcap_minor_version(pcap_t *p); .SH DESCRIPTION If .I p -refers to a savefile, +refers to a ``savefile'', .B pcap_major_version() -returns the major number of the file format of the savefile and +returns the major number of the file format of the ``savefile'' and .B pcap_minor_version() -returns the minor number of the file format of the savefile. The -version number is stored in the header of the savefile. +returns the minor number of the file format of the ``savefile''. The +version number is stored in the ``savefile''; note that the meaning of +its values depends on the type of ``savefile'' (for example, pcap or +pcap-NG). .PP If .I p diff --git a/contrib/libpcap/pcap_next_ex.3pcap b/contrib/libpcap/pcap_next_ex.3pcap index 50ad198aa43..737383604b1 100644 --- a/contrib/libpcap/pcap_next_ex.3pcap +++ b/contrib/libpcap/pcap_next_ex.3pcap @@ -45,7 +45,16 @@ argument is set to point to the struct for the packet, and the pointer pointed to by the .I pkt_data -argument is set to point to the data in the packet. +argument is set to point to the data in the packet. The +.I struct pcap_pkthdr +and the packet data are not to be freed by the caller, and are not +guaranteed to be valid after the next call to +.BR pcap_next_ex() , +.BR pcap_next() , +.BR pcap_loop() , +or +.BR pcap_dispatch() ; +if the code needs them to remain valid, it must make a copy of them. .PP .B pcap_next() reads the next packet (by calling @@ -54,7 +63,15 @@ with a .I cnt of 1) and returns a .I u_char -pointer to the data in that packet. +pointer to the data in that packet. The +packet data is not to be freed by the caller, and is not +guaranteed to be valid after the next call to +.BR pcap_next_ex() , +.BR pcap_next() , +.BR pcap_loop() , +or +.BR pcap_dispatch() ; +if the code needs it to remain valid, it must make a copy of it. The .I pcap_pkthdr structure pointed to by @@ -78,13 +95,13 @@ as an argument to fetch or display the error text. .B pcap_next() returns a pointer to the packet data on success, and returns .B NULL -if an error occured, or if no packets were read from a live +if an error occurred, or if no packets were read from a live capture (if, for example, they were discarded because they didn't pass the packet filter, or if, on platforms that support a read timeout that starts before any packets arrive, the timeout expires before any packets arrive, or if the file descriptor for the capture device is in non-blocking mode and no packets were available to be read), or if no more packets are available in a ``savefile.'' Unfortunately, there is -no way to determine whether an error occured or not. +no way to determine whether an error occurred or not. .SH SEE ALSO pcap(3PCAP), pcap_geterr(3PCAP), pcap_dispatch(3PCAP) diff --git a/contrib/libpcap/pcap_open_dead.3pcap b/contrib/libpcap/pcap_open_dead.3pcap index 29b8f7a00ee..975206df489 100644 --- a/contrib/libpcap/pcap_open_dead.3pcap +++ b/contrib/libpcap/pcap_open_dead.3pcap @@ -1,4 +1,4 @@ -.\" @(#) $Header: /tcpdump/master/libpcap/pcap_open_dead.3pcap.in,v 1.1.2.2 2008-10-21 07:44:57 guy Exp $ +.\" @(#) $Header: /tcpdump/master/libpcap/pcap_open_dead.3pcap.in,v 1.1 2008-10-21 07:33:02 guy Exp $ .\" .\" Copyright (c) 1994, 1996, 1997 .\" The Regents of the University of California. All rights reserved. diff --git a/contrib/libpcap/pcap_open_live.3pcap b/contrib/libpcap/pcap_open_live.3pcap index 623f0986ed0..0889a2a2586 100644 --- a/contrib/libpcap/pcap_open_live.3pcap +++ b/contrib/libpcap/pcap_open_live.3pcap @@ -74,7 +74,7 @@ is filled in with an appropriate error message. .I errbuf may also be set to warning text when .B pcap_open_live() -succeds; to detect this case the caller should store a zero-length string in +succeeds; to detect this case the caller should store a zero-length string in .I errbuf before calling .B pcap_open_live() diff --git a/contrib/libpcap/pcap_open_offline.3pcap b/contrib/libpcap/pcap_open_offline.3pcap index c89b8679e55..fbf50a51072 100644 --- a/contrib/libpcap/pcap_open_offline.3pcap +++ b/contrib/libpcap/pcap_open_offline.3pcap @@ -1,4 +1,4 @@ -.\" @(#) $Header: /tcpdump/master/libpcap/pcap_open_offline.3pcap.in,v 1.1.2.2 2008-10-23 05:59:43 guy Exp $ +.\" @(#) $Header: /tcpdump/master/libpcap/pcap_open_offline.3pcap.in,v 1.1 2008-10-23 05:56:59 guy Exp $ .\" .\" Copyright (c) 1994, 1996, 1997 .\" The Regents of the University of California. All rights reserved. @@ -43,11 +43,15 @@ pcap_t *pcap_fopen_offline(FILE *fp, char *errbuf); is called to open a ``savefile'' for reading. .PP .I fname -specifies the name of the file to open. The file has -the same format as those used by +specifies the name of the file to open. The file can have the pcap file +format as described in +.BR pcap-savefile (5), +which is the file format used by, among other programs, .BR tcpdump (1) and -.BR tcpslice (1). +.BR tcpslice (1), +or can have the pcap-ng file format, although not all pcap-ng files can +be read. The name "-" in a synonym for .BR stdin . .PP diff --git a/contrib/libpcap/pcap_set_datalink.3pcap b/contrib/libpcap/pcap_set_datalink.3pcap index bad39e4c836..9af32d0696a 100644 --- a/contrib/libpcap/pcap_set_datalink.3pcap +++ b/contrib/libpcap/pcap_set_datalink.3pcap @@ -19,7 +19,7 @@ .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" -.TH PCAP_SET_DATALINK 3PCAP "5 April 2008" +.TH PCAP_SET_DATALINK 3PCAP "22 August 2010" .SH NAME pcap_set_datalink \- set the link-layer header type to be used by a capture device @@ -35,7 +35,7 @@ int pcap_set_datalink(pcap_t *p, int dlt); .fi .SH DESCRIPTION .B pcap_set_datalink() -is used to set the current data link type of the pcap descriptor +is used to set the current link-layer header type of the pcap descriptor to the type specified by .IR dlt . .SH RETURN VALUE @@ -49,4 +49,5 @@ may be called with .I p as an argument to fetch or display the error text. .SH SEE ALSO -pcap(3PCAP), pcap_geterr(3PCAP) +pcap(3PCAP), pcap_geterr(3PCAP), +pcap_datalink_name_to_val(3PCAP) diff --git a/contrib/libpcap/pcap_set_tstamp_type.3pcap b/contrib/libpcap/pcap_set_tstamp_type.3pcap new file mode 100644 index 00000000000..b31b945e7ee --- /dev/null +++ b/contrib/libpcap/pcap_set_tstamp_type.3pcap @@ -0,0 +1,65 @@ +.\" +.\" Copyright (c) 1994, 1996, 1997 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that: (1) source code distributions +.\" retain the above copyright notice and this paragraph in its entirety, (2) +.\" distributions including binary code include the above copyright notice and +.\" this paragraph in its entirety in the documentation or other materials +.\" provided with the distribution, and (3) all advertising materials mentioning +.\" features or use of this software display the following acknowledgement: +.\" ``This product includes software developed by the University of California, +.\" Lawrence Berkeley Laboratory and its contributors.'' Neither the name of +.\" the University nor the names of its contributors may be used to endorse +.\" or promote products derived from this software without specific prior +.\" written permission. +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +.\" +.TH PCAP_SET_TSTAMP_TYPE 3PCAP "21 August 2010" +.SH NAME +pcap_set_tstamp_type \- set the time stamp type to be used by a +capture device +.SH SYNOPSIS +.nf +.ft B +#include +.ft +.LP +.ft B +int pcap_set_tstamp_type(pcap_t *p, int tstamp_type); +.ft +.fi +.SH DESCRIPTION +.B pcap_set_tstamp_type() +sets the the type of time stamp desired for packets captured on the pcap +descriptor to the type specified by +.IR tstamp_type . +It must be called on a pcap descriptor created by +.B pcap_create() +that has not yet been activated by +.BR pcap_activate() . +.B pcap_list_tstamp_types() +will give a list of the time stamp types supported by a given capture +device. +See +.BR pcap-tstamp (7) +for a list of all the time stamp types. +.SH RETURN VALUE +.B pcap_set_tstamp_type() +returns 0 on success if the specified time stamp type is expected to be +supported by the capture device, +.B PCAP_WARNING_TSTAMP_TYPE_NOTSUP +on success if the specified time stamp type is not supported by the +capture device, +.B PCAP_ERROR_ACTIVATED +if called on a capture handle that has been activated, and +.B PCAP_ERROR_CANTSET_TSTAMP_TYPE +if the capture device doesn't support setting the time stamp type. +.SH SEE ALSO +pcap(3PCAP), +pcap_list_tstamp_types(3PCAP), +pcap_tstamp_type_name_to_val(3PCAP), +pcap-tstamp(7) diff --git a/contrib/libpcap/pcap_set_tstamp_type.3pcap.in b/contrib/libpcap/pcap_set_tstamp_type.3pcap.in new file mode 100644 index 00000000000..261c315200c --- /dev/null +++ b/contrib/libpcap/pcap_set_tstamp_type.3pcap.in @@ -0,0 +1,65 @@ +.\" +.\" Copyright (c) 1994, 1996, 1997 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that: (1) source code distributions +.\" retain the above copyright notice and this paragraph in its entirety, (2) +.\" distributions including binary code include the above copyright notice and +.\" this paragraph in its entirety in the documentation or other materials +.\" provided with the distribution, and (3) all advertising materials mentioning +.\" features or use of this software display the following acknowledgement: +.\" ``This product includes software developed by the University of California, +.\" Lawrence Berkeley Laboratory and its contributors.'' Neither the name of +.\" the University nor the names of its contributors may be used to endorse +.\" or promote products derived from this software without specific prior +.\" written permission. +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +.\" +.TH PCAP_SET_TSTAMP_TYPE 3PCAP "21 August 2010" +.SH NAME +pcap_set_tstamp_type \- set the time stamp type to be used by a +capture device +.SH SYNOPSIS +.nf +.ft B +#include +.ft +.LP +.ft B +int pcap_set_tstamp_type(pcap_t *p, int tstamp_type); +.ft +.fi +.SH DESCRIPTION +.B pcap_set_tstamp_type() +sets the the type of time stamp desired for packets captured on the pcap +descriptor to the type specified by +.IR tstamp_type . +It must be called on a pcap descriptor created by +.B pcap_create() +that has not yet been activated by +.BR pcap_activate() . +.B pcap_list_tstamp_types() +will give a list of the time stamp types supported by a given capture +device. +See +.BR pcap-tstamp (@MAN_MISC_INFO@) +for a list of all the time stamp types. +.SH RETURN VALUE +.B pcap_set_tstamp_type() +returns 0 on success if the specified time stamp type is expected to be +supported by the capture device, +.B PCAP_WARNING_TSTAMP_TYPE_NOTSUP +on success if the specified time stamp type is not supported by the +capture device, +.B PCAP_ERROR_ACTIVATED +if called on a capture handle that has been activated, and +.B PCAP_ERROR_CANTSET_TSTAMP_TYPE +if the capture device doesn't support setting the time stamp type. +.SH SEE ALSO +pcap(3PCAP), +pcap_list_tstamp_types(3PCAP), +pcap_tstamp_type_name_to_val(3PCAP), +pcap-tstamp(@MAN_MISC_INFO@) diff --git a/contrib/libpcap/pcap_free_datalinks.3pcap b/contrib/libpcap/pcap_tstamp_type_name_to_val.3pcap similarity index 71% rename from contrib/libpcap/pcap_free_datalinks.3pcap rename to contrib/libpcap/pcap_tstamp_type_name_to_val.3pcap index b7355bdf819..8fcc4d75c00 100644 --- a/contrib/libpcap/pcap_free_datalinks.3pcap +++ b/contrib/libpcap/pcap_tstamp_type_name_to_val.3pcap @@ -1,4 +1,3 @@ -.\" @(#) $Header: /tcpdump/master/libpcap/pcap_free_datalinks.3pcap,v 1.1 2008-05-26 19:58:06 guy Exp $ .\" .\" Copyright (c) 1994, 1996, 1997 .\" The Regents of the University of California. All rights reserved. @@ -19,10 +18,10 @@ .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" -.TH PCAP_FREE_DATALINKS 3PCAP "26 May 2008" +.TH PCAP_TSTAMP_TYPE_NAME_TO_VAL 3PCAP "21 August 2010" .SH NAME -pcap_free_datalinks \- free a list of link-layer header types from -pcap_get_datalinks() +pcap_tstamp_type_name_to_val \- get the time stamp type value +corresponding to a time stamp type name .SH SYNOPSIS .nf .ft B @@ -30,12 +29,17 @@ pcap_get_datalinks() .ft .LP .ft B -void pcap_free_datalinks(int *dlt_list); +int pcap_tstamp_type_name_to_val(const char *name); .ft .fi .SH DESCRIPTION -.B pcap_free_datalinks() -is used to free a list of supported data link types returned by -.BR pcap_list_datalinks() . +.B pcap_tstamp_type_name_to_val() +translates a time stamp type name to the corresponding time stamp type +value. The translation is case-insensitive. +.SH RETURN VALUE +.B pcap_tstamp_type_name_to_val() +returns 0 on success and +.B PCAP_ERROR +on failure. .SH SEE ALSO -pcap(3PCAP), pcap_list_datalinks(3PCAP) +pcap(3PCAP), pcap_tstamp_type_val_to_name(3PCAP) diff --git a/contrib/libpcap/pcap_freealldevs.3pcap b/contrib/libpcap/pcap_tstamp_type_val_to_name.3pcap similarity index 65% rename from contrib/libpcap/pcap_freealldevs.3pcap rename to contrib/libpcap/pcap_tstamp_type_val_to_name.3pcap index d3f234fc6fd..5d8d75405c1 100644 --- a/contrib/libpcap/pcap_freealldevs.3pcap +++ b/contrib/libpcap/pcap_tstamp_type_val_to_name.3pcap @@ -1,4 +1,3 @@ -.\" @(#) $Header: /tcpdump/master/libpcap/pcap_freealldevs.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $ .\" .\" Copyright (c) 1994, 1996, 1997 .\" The Regents of the University of California. All rights reserved. @@ -19,22 +18,28 @@ .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" -.TH PCAP_FREEALLDEVS 3PCAP "5 April 2008" +.TH PCAP_TSTAMP_TYPE_VAL_TO_NAME 3PCAP "21 August 2010" .SH NAME -pcap_freealldevs \- free a list of capture devices +pcap_tstamp_type_val_to_name, pcap_tstamp_type_val_to_description \- get +a name or description for a time stamp type value .SH SYNOPSIS .nf .ft B -#include +#include .ft .LP .ft B -void pcap_freealldevs(pcap_if_t *alldevs); +const char *pcap_tstamp_type_val_to_name(int tstamp_type); +const char *pcap_tstamp_type_val_to_description(int tstamp_type); .ft .fi .SH DESCRIPTION -.B pcap_freealldevs() -is used to free a list allocated by -.BR pcap_findalldevs() . +.B pcap_tstamp_type_val_to_name() +translates a time stamp type value to the corresponding time stamp type +name. NULL is returned on failure. +.PP +.B pcap_tstamp_type_val_to_description() +translates a time stamp type value to a short description of that time +stamp type. NULL is returned on failure. .SH SEE ALSO -pcap(3PCAP), pcap_findalldevs(3PCAP) +pcap(3PCAP), pcap_tstamp_type_name_to_val(3PCAP) diff --git a/contrib/libpcap/savefile.c b/contrib/libpcap/savefile.c index 56e571937d2..8115749b134 100644 --- a/contrib/libpcap/savefile.c +++ b/contrib/libpcap/savefile.c @@ -94,10 +94,16 @@ static int sf_setnonblock(pcap_t *p, int nonblock, char *errbuf) { /* - * This is a savefile, not a live capture file, so ignore - * requests to put it in non-blocking mode. + * This is a savefile, not a live capture file, so reject + * requests to put it in non-blocking mode. (If it's a + * pipe, it could be put in non-blocking mode, but that + * would significantly complicate the code to read packets, + * as it would have to handle reading partial packets and + * keeping the state of the read.) */ - return (0); + snprintf(p->errbuf, PCAP_ERRBUF_SIZE, + "Savefiles cannot be put into non-blocking mode"); + return (-1); } static int @@ -161,6 +167,7 @@ sf_cleanup(pcap_t *p) (void)fclose(p->sf.rfile); if (p->buffer != NULL) free(p->buffer); + pcap_freecode(&p->fcode); } pcap_t * @@ -376,7 +383,7 @@ pcap_offline_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user) } if ((fcode = p->fcode.bf_insns) == NULL || - bpf_filter(fcode, p->buffer, h.len, h.caplen)) { + bpf_filter(fcode, data, h.len, h.caplen)) { (*callback)(user, &h, data); if (++n >= cnt && cnt > 0) break; diff --git a/contrib/libpcap/scanner.l b/contrib/libpcap/scanner.l index 9d981d78c1b..88c0028320f 100644 --- a/contrib/libpcap/scanner.l +++ b/contrib/libpcap/scanner.l @@ -56,7 +56,7 @@ static const char rcsid[] _U_ = #include #ifdef __MINGW32__ -#include "IP6_misc.h" +#include "ip6_misc.h" #endif #else /* WIN32 */ #include /* for "struct sockaddr" in "struct addrinfo" */ @@ -79,6 +79,7 @@ static int stoi(char *); static inline int xdtoi(int); #ifdef FLEX_SCANNER +#define YY_NO_INPUT #define YY_NO_UNPUT static YY_BUFFER_STATE in_buffer; #else @@ -203,6 +204,7 @@ igmp return IGMP; igrp return IGRP; pim return PIM; vrrp return VRRP; +carp return CARP; radio return RADIO; ip6 { @@ -274,6 +276,8 @@ address1|addr1 return ADDR1; address2|addr2 return ADDR2; address3|addr3 return ADDR3; address4|addr4 return ADDR4; +ra return RA; +ta return TA; less return LESS; greater return GREATER; diff --git a/contrib/libpcap/sf-pcap-ng.c b/contrib/libpcap/sf-pcap-ng.c index 3535777ceb3..7eb6db76493 100644 --- a/contrib/libpcap/sf-pcap-ng.c +++ b/contrib/libpcap/sf-pcap-ng.c @@ -746,7 +746,7 @@ pcap_ng_check_header(pcap_t *p, bpf_u_int32 magic, FILE *fp, char *errbuf) done: p->tzoff = 0; /* XXX - not used in pcap */ p->snapshot = idbp->snaplen; - p->linktype = idbp->linktype; + p->linktype = linktype_to_dlt(idbp->linktype); p->linktype_ext = 0; p->sf.next_packet_op = pcap_ng_next_packet; @@ -772,7 +772,6 @@ pcap_ng_next_packet(pcap_t *p, struct pcap_pkthdr *hdr, u_char **data) struct simple_packet_block *spbp; struct packet_block *pbp; bpf_u_int32 interface_id = 0xFFFFFFFF; - size_t pblock_len; struct interface_description_block *idbp; struct section_header_block *shbp; FILE *fp = p->sf.rfile; @@ -823,7 +822,6 @@ pcap_ng_next_packet(pcap_t *p, struct pcap_pkthdr *hdr, u_char **data) t = ((u_int64_t)epbp->timestamp_high) << 32 | epbp->timestamp_low; } - pblock_len = sizeof(*epbp); goto found; case BT_SPB: @@ -860,7 +858,6 @@ pcap_ng_next_packet(pcap_t *p, struct pcap_pkthdr *hdr, u_char **data) if (hdr->caplen > p->snapshot) hdr->caplen = p->snapshot; t = 0; /* no time stamps */ - pblock_len = sizeof(*spbp); goto found; case BT_PB: @@ -890,7 +887,6 @@ pcap_ng_next_packet(pcap_t *p, struct pcap_pkthdr *hdr, u_char **data) t = ((u_int64_t)pbp->timestamp_high) << 32 | pbp->timestamp_low; } - pblock_len = sizeof(*pbp); goto found; case BT_IDB: @@ -1053,7 +1049,7 @@ found: /* * Is the interface ID an interface we know? */ - if (interface_id > p->sf.ifcount) { + if (interface_id >= p->sf.ifcount) { /* * Yes. Fail. */ diff --git a/contrib/libpcap/sf-pcap.c b/contrib/libpcap/sf-pcap.c index 9d55dae5fbe..2b31a2b7a0f 100644 --- a/contrib/libpcap/sf-pcap.c +++ b/contrib/libpcap/sf-pcap.c @@ -271,8 +271,12 @@ pcap_check_header(pcap_t *p, bpf_u_int32 magic, FILE *fp, char *errbuf) * Allocate a buffer for the packet data. */ p->bufsize = p->snapshot; - if (p->bufsize <= 0) - p->bufsize = BPF_MAXBUFSIZE; + if (p->bufsize <= 0) { + /* + * Bogus snapshot length; use 64KiB as a fallback. + */ + p->bufsize = 65536; + } p->buffer = malloc(p->bufsize); if (p->buffer == NULL) { snprintf(errbuf, PCAP_ERRBUF_SIZE, "out of memory"); diff --git a/contrib/libpcap/filtertest.c b/contrib/libpcap/test/filtertest.c similarity index 100% rename from contrib/libpcap/filtertest.c rename to contrib/libpcap/test/filtertest.c diff --git a/contrib/libpcap/findalldevstest.c b/contrib/libpcap/test/findalldevstest.c similarity index 100% rename from contrib/libpcap/findalldevstest.c rename to contrib/libpcap/test/findalldevstest.c diff --git a/contrib/libpcap/test/nonblocktest.c b/contrib/libpcap/test/nonblocktest.c new file mode 100644 index 00000000000..70a6bfdaa1b --- /dev/null +++ b/contrib/libpcap/test/nonblocktest.c @@ -0,0 +1,226 @@ +/* + * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that: (1) source code distributions + * retain the above copyright notice and this paragraph in its entirety, (2) + * distributions including binary code include the above copyright notice and + * this paragraph in its entirety in the documentation or other materials + * provided with the distribution, and (3) all advertising materials mentioning + * features or use of this software display the following acknowledgement: + * ``This product includes software developed by the University of California, + * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of + * the University nor the names of its contributors may be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef lint +static const char copyright[] = + "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\ +The Regents of the University of California. All rights reserved.\n"; +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char *program_name; + +/* Forwards */ +static void countme(u_char *, const struct pcap_pkthdr *, const u_char *); +static void usage(void) __attribute__((noreturn)); +static void error(const char *, ...); +static void warning(const char *, ...); +static char *copy_argv(char **); + +static pcap_t *pd; + +extern int optind; +extern int opterr; +extern char *optarg; + +int +main(int argc, char **argv) +{ + register int op; + bpf_u_int32 localnet, netmask; + register char *cp, *cmdbuf, *device; + struct bpf_program fcode; + char ebuf[PCAP_ERRBUF_SIZE]; + int status; + int packet_count; + + device = NULL; + if ((cp = strrchr(argv[0], '/')) != NULL) + program_name = cp + 1; + else + program_name = argv[0]; + + opterr = 0; + while ((op = getopt(argc, argv, "i:")) != -1) { + switch (op) { + + case 'i': + device = optarg; + break; + + default: + usage(); + /* NOTREACHED */ + } + } + + if (device == NULL) { + device = pcap_lookupdev(ebuf); + if (device == NULL) + error("%s", ebuf); + } + *ebuf = '\0'; + pd = pcap_open_live(device, 65535, 0, 1000, ebuf); + if (pd == NULL) + error("%s", ebuf); + else if (*ebuf) + warning("%s", ebuf); + if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) { + localnet = 0; + netmask = 0; + warning("%s", ebuf); + } + cmdbuf = copy_argv(&argv[optind]); + + if (pcap_compile(pd, &fcode, cmdbuf, 1, netmask) < 0) + error("%s", pcap_geterr(pd)); + + if (pcap_setfilter(pd, &fcode) < 0) + error("%s", pcap_geterr(pd)); + if (pcap_setnonblock(pd, 1, ebuf) == -1) + error("pcap_setnonblock failed: %s", ebuf); + printf("Listening on %s\n", device); + for (;;) { + packet_count = 0; + status = pcap_dispatch(pd, -1, countme, + (u_char *)&packet_count); + if (status < 0) + break; + if (status != 0) { + printf("%d packets seen, %d packets counted after pcap_dispatch returns\n", + status, packet_count); + } + } + if (status == -2) { + /* + * We got interrupted, so perhaps we didn't + * manage to finish a line we were printing. + * Print an extra newline, just in case. + */ + putchar('\n'); + } + (void)fflush(stdout); + if (status == -1) { + /* + * Error. Report it. + */ + (void)fprintf(stderr, "%s: pcap_loop: %s\n", + program_name, pcap_geterr(pd)); + } + pcap_close(pd); + exit(status == -1 ? 1 : 0); +} + +static void +countme(u_char *user, const struct pcap_pkthdr *h, const u_char *sp) +{ + int *counterp = (int *)user; + + (*counterp)++; +} + +static void +usage(void) +{ + (void)fprintf(stderr, "Usage: %s [ -sptn ] [ -i interface ] [expression]\n", + program_name); + exit(1); +} + +/* VARARGS */ +static void +error(const char *fmt, ...) +{ + va_list ap; + + (void)fprintf(stderr, "%s: ", program_name); + va_start(ap, fmt); + (void)vfprintf(stderr, fmt, ap); + va_end(ap); + if (*fmt) { + fmt += strlen(fmt); + if (fmt[-1] != '\n') + (void)fputc('\n', stderr); + } + exit(1); + /* NOTREACHED */ +} + +/* VARARGS */ +static void +warning(const char *fmt, ...) +{ + va_list ap; + + (void)fprintf(stderr, "%s: WARNING: ", program_name); + va_start(ap, fmt); + (void)vfprintf(stderr, fmt, ap); + va_end(ap); + if (*fmt) { + fmt += strlen(fmt); + if (fmt[-1] != '\n') + (void)fputc('\n', stderr); + } +} + +/* + * Copy arg vector into a new buffer, concatenating arguments with spaces. + */ +static char * +copy_argv(register char **argv) +{ + register char **p; + register u_int len = 0; + char *buf; + char *src, *dst; + + p = argv; + if (*p == 0) + return 0; + + while (*p) + len += strlen(*p++) + 1; + + buf = (char *)malloc(len); + if (buf == NULL) + error("copy_argv: malloc"); + + p = argv; + dst = buf; + while ((src = *p++) != NULL) { + while ((*dst++ = *src++) != '\0') + ; + dst[-1] = ' '; + } + dst[-1] = '\0'; + + return buf; +} diff --git a/contrib/libpcap/opentest.c b/contrib/libpcap/test/opentest.c similarity index 100% rename from contrib/libpcap/opentest.c rename to contrib/libpcap/test/opentest.c diff --git a/contrib/libpcap/test/reactivatetest.c b/contrib/libpcap/test/reactivatetest.c new file mode 100644 index 00000000000..9031a64a619 --- /dev/null +++ b/contrib/libpcap/test/reactivatetest.c @@ -0,0 +1,84 @@ +/* + * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that: (1) source code distributions + * retain the above copyright notice and this paragraph in its entirety, (2) + * distributions including binary code include the above copyright notice and + * this paragraph in its entirety in the documentation or other materials + * provided with the distribution, and (3) all advertising materials mentioning + * features or use of this software display the following acknowledgement: + * ``This product includes software developed by the University of California, + * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of + * the University nor the names of its contributors may be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef lint +static const char copyright[] = + "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\ +The Regents of the University of California. All rights reserved.\n"; +#endif + +#include +#include +#include +#include +#include + +/* Forwards */ +static void error(const char *, ...); + +int +main(void) +{ + char ebuf[PCAP_ERRBUF_SIZE]; + pcap_t *pd; + int status = 0; + + pd = pcap_open_live("lo0", 65535, 0, 1000, ebuf); + if (pd == NULL) { + pd = pcap_open_live("lo", 65535, 0, 1000, ebuf); + if (pd == NULL) { + error("Neither lo0 nor lo could be opened: %s", + ebuf); + return 2; + } + } + status = pcap_activate(pd); + if (status != PCAP_ERROR_ACTIVATED) { + if (status == 0) + error("pcap_activate() of opened pcap_t succeeded"); + else if (status == PCAP_ERROR) + error("pcap_activate() of opened pcap_t failed with %s, not PCAP_ERROR_ACTIVATED", + pcap_geterr(pd)); + else + error("pcap_activate() of opened pcap_t failed with %s, not PCAP_ERROR_ACTIVATED", + pcap_statustostr(status)); + } + return 0; +} + +/* VARARGS */ +static void +error(const char *fmt, ...) +{ + va_list ap; + + (void)fprintf(stderr, "reactivatetest: "); + va_start(ap, fmt); + (void)vfprintf(stderr, fmt, ap); + va_end(ap); + if (*fmt) { + fmt += strlen(fmt); + if (fmt[-1] != '\n') + (void)fputc('\n', stderr); + } + exit(1); + /* NOTREACHED */ +} diff --git a/contrib/libpcap/selpolltest.c b/contrib/libpcap/test/selpolltest.c similarity index 100% rename from contrib/libpcap/selpolltest.c rename to contrib/libpcap/test/selpolltest.c diff --git a/contrib/libstdc++/include/bits/locale_facets.tcc b/contrib/libstdc++/include/bits/locale_facets.tcc index 8f62e1904ea..e8b9fd2e667 100644 --- a/contrib/libstdc++/include/bits/locale_facets.tcc +++ b/contrib/libstdc++/include/bits/locale_facets.tcc @@ -887,7 +887,11 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE const fmtflags __fmt = __io.flags(); __io.flags(__fmt & ~ios_base::basefield | ios_base::hex); - unsigned long __ul; + typedef __gnu_cxx::__conditional_type<(sizeof(void*) + <= sizeof(unsigned long)), + unsigned long, unsigned long long>::__type _UIntPtrType; + + _UIntPtrType __ul; __beg = _M_extract_int(__beg, __end, __io, __err, __ul); // Reset from hex formatted input. @@ -1309,8 +1313,12 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE | ios_base::internal); __io.flags(__flags & __fmt | (ios_base::hex | ios_base::showbase)); + typedef __gnu_cxx::__conditional_type<(sizeof(const void*) + <= sizeof(unsigned long)), + unsigned long, unsigned long long>::__type _UIntPtrType; + __s = _M_insert_int(__s, __io, __fill, - reinterpret_cast(__v)); + reinterpret_cast<_UIntPtrType>(__v)); __io.flags(__flags); return __s; } diff --git a/contrib/libstdc++/include/bits/stl_bvector.h b/contrib/libstdc++/include/bits/stl_bvector.h index 9dc26565802..5f494edcca9 100644 --- a/contrib/libstdc++/include/bits/stl_bvector.h +++ b/contrib/libstdc++/include/bits/stl_bvector.h @@ -385,6 +385,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) _Bit_iterator _M_start; _Bit_iterator _M_finish; _Bit_type* _M_end_of_storage; + + _Bvector_impl() + : _Bit_alloc_type(), _M_start(), _M_finish(), _M_end_of_storage(0) + { } + _Bvector_impl(const _Bit_alloc_type& __a) : _Bit_alloc_type(__a), _M_start(), _M_finish(), _M_end_of_storage(0) { } @@ -405,7 +410,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) get_allocator() const { return allocator_type(_M_get_Bit_allocator()); } - _Bvector_base(const allocator_type& __a) : _M_impl(__a) { } + _Bvector_base() + : _M_impl() { } + + _Bvector_base(const allocator_type& __a) + : _M_impl(__a) { } ~_Bvector_base() { this->_M_deallocate(); } @@ -480,8 +489,11 @@ template using _Base::_M_get_Bit_allocator; public: + vector() + : _Base() { } + explicit - vector(const allocator_type& __a = allocator_type()) + vector(const allocator_type& __a) : _Base(__a) { } explicit @@ -678,7 +690,7 @@ template } void - swap(vector& __x) + swap(vector& __x) { std::swap(this->_M_impl._M_start, __x._M_impl._M_start); std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish); diff --git a/contrib/libstdc++/include/bits/stl_deque.h b/contrib/libstdc++/include/bits/stl_deque.h index 9da0bb7ea79..82753697813 100644 --- a/contrib/libstdc++/include/bits/stl_deque.h +++ b/contrib/libstdc++/include/bits/stl_deque.h @@ -380,6 +380,10 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) typedef _Deque_iterator<_Tp, _Tp&, _Tp*> iterator; typedef _Deque_iterator<_Tp, const _Tp&, const _Tp*> const_iterator; + _Deque_base() + : _M_impl() + { _M_initialize_map(0); } + _Deque_base(const allocator_type& __a, size_t __num_elements) : _M_impl(__a) { _M_initialize_map(__num_elements); } @@ -406,6 +410,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) iterator _M_start; iterator _M_finish; + _Deque_impl() + : _Tp_alloc_type(), _M_map(0), _M_map_size(0), + _M_start(), _M_finish() + { } + _Deque_impl(const _Tp_alloc_type& __a) : _Tp_alloc_type(__a), _M_map(0), _M_map_size(0), _M_start(), _M_finish() @@ -679,8 +688,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) /** * @brief Default constructor creates no elements. */ + deque() + : _Base() { } + explicit - deque(const allocator_type& __a = allocator_type()) + deque(const allocator_type& __a) : _Base(__a, 0) {} /** diff --git a/contrib/libstdc++/include/bits/stl_list.h b/contrib/libstdc++/include/bits/stl_list.h index e37e5ee36f3..57445a5ba4d 100644 --- a/contrib/libstdc++/include/bits/stl_list.h +++ b/contrib/libstdc++/include/bits/stl_list.h @@ -305,6 +305,10 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) { _List_node_base _M_node; + _List_impl() + : _Node_alloc_type(), _M_node() + { } + _List_impl(const _Node_alloc_type& __a) : _Node_alloc_type(__a), _M_node() { } @@ -339,6 +343,10 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) get_allocator() const { return allocator_type(_M_get_Node_allocator()); } + _List_base() + : _M_impl() + { _M_init(); } + _List_base(const allocator_type& __a) : _M_impl(__a) { _M_init(); } @@ -468,8 +476,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) /** * @brief Default constructor creates no elements. */ + list() + : _Base() { } + explicit - list(const allocator_type& __a = allocator_type()) + list(const allocator_type& __a) : _Base(__a) { } /** diff --git a/contrib/libstdc++/include/bits/stl_map.h b/contrib/libstdc++/include/bits/stl_map.h index 13e62bc220c..62eb9714fda 100644 --- a/contrib/libstdc++/include/bits/stl_map.h +++ b/contrib/libstdc++/include/bits/stl_map.h @@ -155,7 +155,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) * @brief Default constructor creates no elements. */ map() - : _M_t(_Compare(), allocator_type()) { } + : _M_t() { } // for some reason this was made a separate function /** @@ -186,7 +186,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) */ template map(_InputIterator __first, _InputIterator __last) - : _M_t(_Compare(), allocator_type()) + : _M_t() { _M_t._M_insert_unique(__first, __last); } /** diff --git a/contrib/libstdc++/include/bits/stl_multimap.h b/contrib/libstdc++/include/bits/stl_multimap.h index b11b6e409d5..bb1c1544e71 100644 --- a/contrib/libstdc++/include/bits/stl_multimap.h +++ b/contrib/libstdc++/include/bits/stl_multimap.h @@ -152,7 +152,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) * @brief Default constructor creates no elements. */ multimap() - : _M_t(_Compare(), allocator_type()) { } + : _M_t() { } // for some reason this was made a separate function /** @@ -184,8 +184,8 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) */ template multimap(_InputIterator __first, _InputIterator __last) - : _M_t(_Compare(), allocator_type()) - { _M_t._M_insert_equal(__first, __last); } + : _M_t() + { _M_t._M_insert_unique(__first, __last); } /** * @brief Builds a %multimap from a range. diff --git a/contrib/libstdc++/include/bits/stl_multiset.h b/contrib/libstdc++/include/bits/stl_multiset.h index 8c499c3690f..6de5aeb3fdf 100644 --- a/contrib/libstdc++/include/bits/stl_multiset.h +++ b/contrib/libstdc++/include/bits/stl_multiset.h @@ -134,7 +134,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) * @brief Default constructor creates no elements. */ multiset() - : _M_t(_Compare(), allocator_type()) { } + : _M_t() { } explicit multiset(const _Compare& __comp, @@ -152,7 +152,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) */ template multiset(_InputIterator __first, _InputIterator __last) - : _M_t(_Compare(), allocator_type()) + : _M_t() { _M_t._M_insert_equal(__first, __last); } /** @@ -180,7 +180,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) * The newly-created %multiset uses a copy of the allocation object used * by @a x. */ - multiset(const multiset<_Key,_Compare,_Alloc>& __x) + multiset(const multiset& __x) : _M_t(__x._M_t) { } /** @@ -190,8 +190,8 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) * All the elements of @a x are copied, but unlike the copy constructor, * the allocator object is not copied. */ - multiset<_Key,_Compare,_Alloc>& - operator=(const multiset<_Key,_Compare,_Alloc>& __x) + multiset& + operator=(const multiset& __x) { _M_t = __x._M_t; return *this; @@ -275,7 +275,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) * std::swap(s1,s2) will feed to this function. */ void - swap(multiset<_Key, _Compare, _Alloc>& __x) + swap(multiset& __x) { _M_t.swap(__x._M_t); } // insert/erase diff --git a/contrib/libstdc++/include/bits/stl_set.h b/contrib/libstdc++/include/bits/stl_set.h index b61106aef65..a77dd8e0878 100644 --- a/contrib/libstdc++/include/bits/stl_set.h +++ b/contrib/libstdc++/include/bits/stl_set.h @@ -138,7 +138,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) // allocation/deallocation /// Default constructor creates no elements. set() - : _M_t(_Compare(), allocator_type()) {} + : _M_t() { } /** * @brief Default constructor creates no elements. @@ -162,7 +162,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) */ template set(_InputIterator __first, _InputIterator __last) - : _M_t(_Compare(), allocator_type()) + : _M_t() { _M_t._M_insert_unique(__first, __last); } /** @@ -190,7 +190,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) * The newly-created %set uses a copy of the allocation object used * by @a x. */ - set(const set<_Key,_Compare,_Alloc>& __x) + set(const set& __x) : _M_t(__x._M_t) { } /** @@ -200,8 +200,8 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) * All the elements of @a x are copied, but unlike the copy constructor, * the allocator object is not copied. */ - set<_Key,_Compare,_Alloc>& - operator=(const set<_Key, _Compare, _Alloc>& __x) + set& + operator=(const set& __x) { _M_t = __x._M_t; return *this; @@ -283,7 +283,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) * std::swap(s1,s2) will feed to this function. */ void - swap(set<_Key,_Compare,_Alloc>& __x) + swap(set& __x) { _M_t.swap(__x._M_t); } // insert/erase diff --git a/contrib/libstdc++/include/bits/stl_tree.h b/contrib/libstdc++/include/bits/stl_tree.h index e8718776d06..80cf7c4b08f 100644 --- a/contrib/libstdc++/include/bits/stl_tree.h +++ b/contrib/libstdc++/include/bits/stl_tree.h @@ -410,10 +410,19 @@ _GLIBCXX_BEGIN_NAMESPACE(std) _Rb_tree_node_base _M_header; size_type _M_node_count; // Keeps track of size of tree. - _Rb_tree_impl(const _Node_allocator& __a = _Node_allocator(), - const _Key_compare& __comp = _Key_compare()) - : _Node_allocator(__a), _M_key_compare(__comp), _M_header(), + _Rb_tree_impl() + : _Node_allocator(), _M_key_compare(), _M_header(), _M_node_count(0) + { _M_initialize(); } + + _Rb_tree_impl(const _Key_compare& __comp, const _Node_allocator& __a) + : _Node_allocator(__a), _M_key_compare(__comp), _M_header(), + _M_node_count(0) + { _M_initialize(); } + + private: + void + _M_initialize() { this->_M_header._M_color = _S_red; this->_M_header._M_parent = 0; @@ -431,11 +440,20 @@ _GLIBCXX_BEGIN_NAMESPACE(std) _Rb_tree_node_base _M_header; size_type _M_node_count; // Keeps track of size of tree. - _Rb_tree_impl(const _Node_allocator& __a = _Node_allocator(), - const _Key_compare& __comp = _Key_compare()) + _Rb_tree_impl() + : _Node_allocator(), _M_key_compare(), _M_header(), + _M_node_count(0) + { _M_initialize(); } + + _Rb_tree_impl(const _Key_compare& __comp, const _Node_allocator& __a) : _Node_allocator(__a), _M_key_compare(__comp), _M_header(), _M_node_count(0) - { + { _M_initialize(); } + + private: + void + _M_initialize() + { this->_M_header._M_color = _S_red; this->_M_header._M_parent = 0; this->_M_header._M_left = &this->_M_header; @@ -568,16 +586,13 @@ _GLIBCXX_BEGIN_NAMESPACE(std) _Rb_tree() { } - _Rb_tree(const _Compare& __comp) - : _M_impl(allocator_type(), __comp) + _Rb_tree(const _Compare& __comp, + const allocator_type& __a = allocator_type()) + : _M_impl(__comp, __a) { } - _Rb_tree(const _Compare& __comp, const allocator_type& __a) - : _M_impl(__a, __comp) - { } - - _Rb_tree(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x) - : _M_impl(__x._M_get_Node_allocator(), __x._M_impl._M_key_compare) + _Rb_tree(const _Rb_tree& __x) + : _M_impl(__x._M_impl._M_key_compare, __x._M_get_Node_allocator()) { if (__x._M_root() != 0) { @@ -591,8 +606,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ~_Rb_tree() { _M_erase(_M_begin()); } - _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& - operator=(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x); + _Rb_tree& + operator=(const _Rb_tree& __x); // Accessors. _Compare @@ -653,7 +668,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) { return get_allocator().max_size(); } void - swap(_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __t); + swap(_Rb_tree& __t); // Insert/erase. pair diff --git a/contrib/libstdc++/include/bits/stl_vector.h b/contrib/libstdc++/include/bits/stl_vector.h index a81c5974d99..1b794dc28ee 100644 --- a/contrib/libstdc++/include/bits/stl_vector.h +++ b/contrib/libstdc++/include/bits/stl_vector.h @@ -84,6 +84,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) _Tp* _M_start; _Tp* _M_finish; _Tp* _M_end_of_storage; + + _Vector_impl() + : _Tp_alloc_type(), _M_start(0), _M_finish(0), _M_end_of_storage(0) + { } + _Vector_impl(_Tp_alloc_type const& __a) : _Tp_alloc_type(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0) { } @@ -104,6 +109,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) get_allocator() const { return allocator_type(_M_get_Tp_allocator()); } + _Vector_base() + : _M_impl() { } + _Vector_base(const allocator_type& __a) : _M_impl(__a) { } @@ -194,8 +202,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) /** * @brief Default constructor creates no elements. */ + vector() + : _Base() { } + explicit - vector(const allocator_type& __a = allocator_type()) + vector(const allocator_type& __a) : _Base(__a) { } diff --git a/contrib/llvm/include/llvm-c/lto.h b/contrib/llvm/include/llvm-c/lto.h index 5d9cecbc515..f43d365e3db 100644 --- a/contrib/llvm/include/llvm-c/lto.h +++ b/contrib/llvm/include/llvm-c/lto.h @@ -250,12 +250,6 @@ extern void lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args, int nargs); -/** - * Enables the internalize pass during LTO optimizations. - */ -extern void -lto_codegen_set_whole_program_optimization(lto_code_gen_t cg); - /** * Adds to a list of all global symbols that must exist in the final * generated code. If a function is not listed, it might be diff --git a/contrib/llvm/include/llvm/ADT/SmallPtrSet.h b/contrib/llvm/include/llvm/ADT/SmallPtrSet.h index 70693d5b9aa..498a0345d8b 100644 --- a/contrib/llvm/include/llvm/ADT/SmallPtrSet.h +++ b/contrib/llvm/include/llvm/ADT/SmallPtrSet.h @@ -126,9 +126,6 @@ protected: private: bool isSmall() const { return CurArray == SmallArray; } - unsigned Hash(const void *Ptr) const { - return static_cast(((uintptr_t)Ptr >> 4) & (CurArraySize-1)); - } const void * const *FindBucketFor(const void *Ptr) const; void shrink_and_clear(); diff --git a/contrib/llvm/include/llvm/ADT/StringMap.h b/contrib/llvm/include/llvm/ADT/StringMap.h index 097418efc81..b4497a276d0 100644 --- a/contrib/llvm/include/llvm/ADT/StringMap.h +++ b/contrib/llvm/include/llvm/ADT/StringMap.h @@ -239,7 +239,7 @@ public: explicit StringMap(AllocatorTy A) : StringMapImpl(static_cast(sizeof(MapEntryTy))), Allocator(A) {} - explicit StringMap(const StringMap &RHS) + StringMap(const StringMap &RHS) : StringMapImpl(static_cast(sizeof(MapEntryTy))) { assert(RHS.empty() && "Copy ctor from non-empty stringmap not implemented yet!"); diff --git a/contrib/llvm/include/llvm/CodeGen/DFAPacketizer.h b/contrib/llvm/include/llvm/CodeGen/DFAPacketizer.h index 2d2db78144a..ee1ed0779be 100644 --- a/contrib/llvm/include/llvm/CodeGen/DFAPacketizer.h +++ b/contrib/llvm/include/llvm/CodeGen/DFAPacketizer.h @@ -28,7 +28,6 @@ #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/ADT/DenseMap.h" -#include namespace llvm { @@ -37,7 +36,7 @@ class MachineInstr; class MachineLoopInfo; class MachineDominatorTree; class InstrItineraryData; -class DefaultVLIWScheduler; +class ScheduleDAGInstrs; class SUnit; class DFAPacketizer { @@ -78,8 +77,6 @@ public: // reserveResources - Reserve the resources occupied by a machine // instruction and change the current state to reflect that change. void reserveResources(llvm::MachineInstr *MI); - - const InstrItineraryData *getInstrItins() const { return InstrItins; } }; // VLIWPacketizerList - Implements a simple VLIW packetizer using DFA. The @@ -90,21 +87,20 @@ public: // and machine resource is marked as taken. If any dependency is found, a target // API call is made to prune the dependence. class VLIWPacketizerList { -protected: const TargetMachine &TM; const MachineFunction &MF; const TargetInstrInfo *TII; - // The VLIW Scheduler. - DefaultVLIWScheduler *VLIWScheduler; + // Encapsulate data types not exposed to the target interface. + ScheduleDAGInstrs *SchedulerImpl; +protected: // Vector of instructions assigned to the current packet. std::vector CurrentPacketMIs; // DFA resource tracker. DFAPacketizer *ResourceTracker; - - // Generate MI -> SU map. - std::map MIToSUnit; + // Scheduling units. + std::vector SUnits; public: VLIWPacketizerList( @@ -122,32 +118,17 @@ public: DFAPacketizer *getResourceTracker() {return ResourceTracker;} // addToPacket - Add MI to the current packet. - virtual MachineBasicBlock::iterator addToPacket(MachineInstr *MI) { - MachineBasicBlock::iterator MII = MI; - CurrentPacketMIs.push_back(MI); - ResourceTracker->reserveResources(MI); - return MII; - } + void addToPacket(MachineInstr *MI); // endPacket - End the current packet. - void endPacket(MachineBasicBlock *MBB, MachineInstr *MI); - - // initPacketizerState - perform initialization before packetizing - // an instruction. This function is supposed to be overrided by - // the target dependent packetizer. - virtual void initPacketizerState(void) { return; } + void endPacket(MachineBasicBlock *MBB, MachineInstr *I); // ignorePseudoInstruction - Ignore bundling of pseudo instructions. - virtual bool ignorePseudoInstruction(MachineInstr *I, - MachineBasicBlock *MBB) { - return false; - } + bool ignorePseudoInstruction(MachineInstr *I, MachineBasicBlock *MBB); - // isSoloInstruction - return true if instruction MI can not be packetized - // with any other instruction, which means that MI itself is a packet. - virtual bool isSoloInstruction(MachineInstr *MI) { - return true; - } + // isSoloInstruction - return true if instruction I must end previous + // packet. + bool isSoloInstruction(MachineInstr *I); // isLegalToPacketizeTogether - Is it legal to packetize SUI and SUJ // together. @@ -160,7 +141,6 @@ public: virtual bool isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ) { return false; } - }; } diff --git a/contrib/llvm/include/llvm/CodeGen/Passes.h b/contrib/llvm/include/llvm/CodeGen/Passes.h index 3b381998588..e76fe992572 100644 --- a/contrib/llvm/include/llvm/CodeGen/Passes.h +++ b/contrib/llvm/include/llvm/CodeGen/Passes.h @@ -56,7 +56,7 @@ public: protected: TargetMachine *TM; - PassManagerBase &PM; + PassManagerBase *PM; PassConfigImpl *Impl; // Internal data structures bool Initialized; // Flagged after all passes are configured. diff --git a/contrib/llvm/include/llvm/CodeGen/ScheduleDAGInstrs.h b/contrib/llvm/include/llvm/CodeGen/ScheduleDAGInstrs.h index c8de7bc8f89..4fee108cd2b 100644 --- a/contrib/llvm/include/llvm/CodeGen/ScheduleDAGInstrs.h +++ b/contrib/llvm/include/llvm/CodeGen/ScheduleDAGInstrs.h @@ -181,6 +181,13 @@ namespace llvm { /// the def-side latency only. bool UnitLatencies; + /// The standard DAG builder does not normally include terminators as DAG + /// nodes because it does not create the necessary dependencies to prevent + /// reordering. A specialized scheduler can overide + /// TargetInstrInfo::isSchedulingBoundary then enable this flag to indicate + /// it has taken responsibility for scheduling the terminator correctly. + bool CanHandleTerminators; + /// State specific to the current scheduling region. /// ------------------------------------------------ diff --git a/contrib/llvm/include/llvm/CodeGen/SlotIndexes.h b/contrib/llvm/include/llvm/CodeGen/SlotIndexes.h index d868cb8dade..0457e43e6b7 100644 --- a/contrib/llvm/include/llvm/CodeGen/SlotIndexes.h +++ b/contrib/llvm/include/llvm/CodeGen/SlotIndexes.h @@ -23,6 +23,7 @@ #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/ADT/PointerIntPair.h" +#include "llvm/ADT/ilist.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/DenseMap.h" #include "llvm/Support/Allocator.h" @@ -33,8 +34,7 @@ namespace llvm { /// SlotIndexes pass. It should not be used directly. See the /// SlotIndex & SlotIndexes classes for the public interface to this /// information. - class IndexListEntry { - IndexListEntry *next, *prev; + class IndexListEntry : public ilist_node { MachineInstr *mi; unsigned index; @@ -51,31 +51,26 @@ namespace llvm { void setIndex(unsigned index) { this->index = index; } - - IndexListEntry* getNext() { return next; } - const IndexListEntry* getNext() const { return next; } - void setNext(IndexListEntry *next) { - this->next = next; - } - IndexListEntry* getPrev() { return prev; } - const IndexListEntry* getPrev() const { return prev; } - void setPrev(IndexListEntry *prev) { - this->prev = prev; - } }; - // Specialize PointerLikeTypeTraits for IndexListEntry. template <> - class PointerLikeTypeTraits { + struct ilist_traits : public ilist_default_traits { + private: + mutable ilist_half_node Sentinel; public: - static inline void* getAsVoidPointer(IndexListEntry *p) { - return p; + IndexListEntry *createSentinel() const { + return static_cast(&Sentinel); } - static inline IndexListEntry* getFromVoidPointer(void *p) { - return static_cast(p); - } - enum { NumLowBitsAvailable = 3 }; + void destroySentinel(IndexListEntry *) const {} + + IndexListEntry *provideInitialHead() const { return createSentinel(); } + IndexListEntry *ensureHead(IndexListEntry*) const { return createSentinel(); } + static void noteHead(IndexListEntry*, IndexListEntry*) {} + void deleteNode(IndexListEntry *N) {} + + private: + void createNode(const IndexListEntry &); }; /// SlotIndex - An opaque wrapper around machine indexes. @@ -112,13 +107,13 @@ namespace llvm { SlotIndex(IndexListEntry *entry, unsigned slot) : lie(entry, slot) {} - IndexListEntry& entry() const { + IndexListEntry* listEntry() const { assert(isValid() && "Attempt to compare reserved index."); - return *lie.getPointer(); + return lie.getPointer(); } int getIndex() const { - return entry().getIndex() | getSlot(); + return listEntry()->getIndex() | getSlot(); } /// Returns the slot for this SlotIndex. @@ -150,8 +145,7 @@ namespace llvm { SlotIndex() : lie(0, 0) {} // Construct a new slot index from the given one, and set the slot. - SlotIndex(const SlotIndex &li, Slot s) - : lie(&li.entry(), unsigned(s)) { + SlotIndex(const SlotIndex &li, Slot s) : lie(li.listEntry(), unsigned(s)) { assert(lie.getPointer() != 0 && "Attempt to construct index with 0 pointer."); } @@ -179,7 +173,7 @@ namespace llvm { bool operator!=(SlotIndex other) const { return lie != other.lie; } - + /// Compare two SlotIndex objects. Return true if the first index /// is strictly lower than the second. bool operator<(SlotIndex other) const { @@ -211,7 +205,7 @@ namespace llvm { /// isEarlierInstr - Return true if A refers to an instruction earlier than /// B. This is equivalent to A < B && !isSameInstr(A, B). static bool isEarlierInstr(SlotIndex A, SlotIndex B) { - return A.entry().getIndex() < B.entry().getIndex(); + return A.listEntry()->getIndex() < B.listEntry()->getIndex(); } /// Return the distance from this index to the given one. @@ -236,25 +230,25 @@ namespace llvm { /// is the one associated with the Slot_Block slot for the instruction /// pointed to by this index. SlotIndex getBaseIndex() const { - return SlotIndex(&entry(), Slot_Block); + return SlotIndex(listEntry(), Slot_Block); } /// Returns the boundary index for associated with this index. The boundary /// index is the one associated with the Slot_Block slot for the instruction /// pointed to by this index. SlotIndex getBoundaryIndex() const { - return SlotIndex(&entry(), Slot_Dead); + return SlotIndex(listEntry(), Slot_Dead); } /// Returns the register use/def slot in the current instruction for a /// normal or early-clobber def. SlotIndex getRegSlot(bool EC = false) const { - return SlotIndex(&entry(), EC ? Slot_EarlyClobber : Slot_Register); + return SlotIndex(listEntry(), EC ? Slot_EarlyClobber : Slot_Register); } /// Returns the dead def kill slot for the current instruction. SlotIndex getDeadSlot() const { - return SlotIndex(&entry(), Slot_Dead); + return SlotIndex(listEntry(), Slot_Dead); } /// Returns the next slot in the index list. This could be either the @@ -266,15 +260,15 @@ namespace llvm { SlotIndex getNextSlot() const { Slot s = getSlot(); if (s == Slot_Dead) { - return SlotIndex(entry().getNext(), Slot_Block); + return SlotIndex(listEntry()->getNextNode(), Slot_Block); } - return SlotIndex(&entry(), s + 1); + return SlotIndex(listEntry(), s + 1); } /// Returns the next index. This is the index corresponding to the this /// index's slot, but for the next instruction. SlotIndex getNextIndex() const { - return SlotIndex(entry().getNext(), getSlot()); + return SlotIndex(listEntry()->getNextNode(), getSlot()); } /// Returns the previous slot in the index list. This could be either the @@ -286,15 +280,15 @@ namespace llvm { SlotIndex getPrevSlot() const { Slot s = getSlot(); if (s == Slot_Block) { - return SlotIndex(entry().getPrev(), Slot_Dead); + return SlotIndex(listEntry()->getPrevNode(), Slot_Dead); } - return SlotIndex(&entry(), s - 1); + return SlotIndex(listEntry(), s - 1); } /// Returns the previous index. This is the index corresponding to this /// index's slot, but for the previous instruction. SlotIndex getPrevIndex() const { - return SlotIndex(entry().getPrev(), getSlot()); + return SlotIndex(listEntry()->getPrevNode(), getSlot()); } }; @@ -315,7 +309,7 @@ namespace llvm { return (LHS == RHS); } }; - + template <> struct isPodLike { static const bool value = true; }; @@ -346,8 +340,10 @@ namespace llvm { class SlotIndexes : public MachineFunctionPass { private: + typedef ilist IndexList; + IndexList indexList; + MachineFunction *mf; - IndexListEntry *indexListHead; unsigned functionSize; typedef DenseMap Mi2IndexMap; @@ -374,84 +370,18 @@ namespace llvm { return entry; } - void initList() { - assert(indexListHead == 0 && "Zero entry non-null at initialisation."); - indexListHead = createEntry(0, ~0U); - indexListHead->setNext(0); - indexListHead->setPrev(indexListHead); - } - - void clearList() { - indexListHead = 0; - ileAllocator.Reset(); - } - - IndexListEntry* getTail() { - assert(indexListHead != 0 && "Call to getTail on uninitialized list."); - return indexListHead->getPrev(); - } - - const IndexListEntry* getTail() const { - assert(indexListHead != 0 && "Call to getTail on uninitialized list."); - return indexListHead->getPrev(); - } - - // Returns true if the index list is empty. - bool empty() const { return (indexListHead == getTail()); } - - IndexListEntry* front() { - assert(!empty() && "front() called on empty index list."); - return indexListHead; - } - - const IndexListEntry* front() const { - assert(!empty() && "front() called on empty index list."); - return indexListHead; - } - - IndexListEntry* back() { - assert(!empty() && "back() called on empty index list."); - return getTail()->getPrev(); - } - - const IndexListEntry* back() const { - assert(!empty() && "back() called on empty index list."); - return getTail()->getPrev(); - } - - /// Insert a new entry before itr. - void insert(IndexListEntry *itr, IndexListEntry *val) { - assert(itr != 0 && "itr should not be null."); - IndexListEntry *prev = itr->getPrev(); - val->setNext(itr); - val->setPrev(prev); - - if (itr != indexListHead) { - prev->setNext(val); - } - else { - indexListHead = val; - } - itr->setPrev(val); - } - - /// Push a new entry on to the end of the list. - void push_back(IndexListEntry *val) { - insert(getTail(), val); - } - - /// Renumber locally after inserting newEntry. - void renumberIndexes(IndexListEntry *newEntry); + /// Renumber locally after inserting curItr. + void renumberIndexes(IndexList::iterator curItr); public: static char ID; - SlotIndexes() : MachineFunctionPass(ID), indexListHead(0) { + SlotIndexes() : MachineFunctionPass(ID) { initializeSlotIndexesPass(*PassRegistry::getPassRegistry()); } virtual void getAnalysisUsage(AnalysisUsage &au) const; - virtual void releaseMemory(); + virtual void releaseMemory(); virtual bool runOnMachineFunction(MachineFunction &fn); @@ -463,22 +393,21 @@ namespace llvm { /// Returns the zero index for this analysis. SlotIndex getZeroIndex() { - assert(front()->getIndex() == 0 && "First index is not 0?"); - return SlotIndex(front(), 0); + assert(indexList.front().getIndex() == 0 && "First index is not 0?"); + return SlotIndex(&indexList.front(), 0); } /// Returns the base index of the last slot in this analysis. SlotIndex getLastIndex() { - return SlotIndex(back(), 0); + return SlotIndex(&indexList.back(), 0); } /// Returns the distance between the highest and lowest indexes allocated /// so far. unsigned getIndexesLength() const { - assert(front()->getIndex() == 0 && + assert(indexList.front().getIndex() == 0 && "Initial index isn't zero?"); - - return back()->getIndex(); + return indexList.back().getIndex(); } /// Returns the number of instructions in the function. @@ -503,19 +432,15 @@ namespace llvm { /// Returns the instruction for the given index, or null if the given /// index has no instruction associated with it. MachineInstr* getInstructionFromIndex(SlotIndex index) const { - return index.isValid() ? index.entry().getInstr() : 0; + return index.isValid() ? index.listEntry()->getInstr() : 0; } /// Returns the next non-null index. SlotIndex getNextNonNullIndex(SlotIndex index) { - SlotIndex nextNonNull = index.getNextIndex(); - - while (&nextNonNull.entry() != getTail() && - getInstructionFromIndex(nextNonNull) == 0) { - nextNonNull = nextNonNull.getNextIndex(); - } - - return nextNonNull; + IndexList::iterator itr(index.listEntry()); + ++itr; + while (itr != indexList.end() && itr->getInstr() == 0) { ++itr; } + return SlotIndex(itr, index.getSlot()); } /// getIndexBefore - Returns the index of the last indexed instruction @@ -659,31 +584,31 @@ namespace llvm { assert(mi->getParent() != 0 && "Instr must be added to function."); // Get the entries where mi should be inserted. - IndexListEntry *prevEntry, *nextEntry; + IndexList::iterator prevItr, nextItr; if (Late) { // Insert mi's index immediately before the following instruction. - nextEntry = &getIndexAfter(mi).entry(); - prevEntry = nextEntry->getPrev(); + nextItr = getIndexAfter(mi).listEntry(); + prevItr = prior(nextItr); } else { // Insert mi's index immediately after the preceeding instruction. - prevEntry = &getIndexBefore(mi).entry(); - nextEntry = prevEntry->getNext(); + prevItr = getIndexBefore(mi).listEntry(); + nextItr = llvm::next(prevItr); } // Get a number for the new instr, or 0 if there's no room currently. // In the latter case we'll force a renumber later. - unsigned dist = ((nextEntry->getIndex() - prevEntry->getIndex())/2) & ~3u; - unsigned newNumber = prevEntry->getIndex() + dist; + unsigned dist = ((nextItr->getIndex() - prevItr->getIndex())/2) & ~3u; + unsigned newNumber = prevItr->getIndex() + dist; // Insert a new list entry for mi. - IndexListEntry *newEntry = createEntry(mi, newNumber); - insert(nextEntry, newEntry); + IndexList::iterator newItr = + indexList.insert(nextItr, createEntry(mi, newNumber)); // Renumber locally if we need to. if (dist == 0) - renumberIndexes(newEntry); + renumberIndexes(newItr); - SlotIndex newIndex(newEntry, SlotIndex::Slot_Block); + SlotIndex newIndex(&*newItr, SlotIndex::Slot_Block); mi2iMap.insert(std::make_pair(mi, newIndex)); return newIndex; } @@ -694,7 +619,7 @@ namespace llvm { // MachineInstr -> index mappings Mi2IndexMap::iterator mi2iItr = mi2iMap.find(mi); if (mi2iItr != mi2iMap.end()) { - IndexListEntry *miEntry(&mi2iItr->second.entry()); + IndexListEntry *miEntry(mi2iItr->second.listEntry()); assert(miEntry->getInstr() == mi && "Instruction indexes broken."); // FIXME: Eventually we want to actually delete these indexes. miEntry->setInstr(0); @@ -709,7 +634,7 @@ namespace llvm { if (mi2iItr == mi2iMap.end()) return; SlotIndex replaceBaseIndex = mi2iItr->second; - IndexListEntry *miEntry(&replaceBaseIndex.entry()); + IndexListEntry *miEntry(replaceBaseIndex.listEntry()); assert(miEntry->getInstr() == mi && "Mismatched instruction in index tables."); miEntry->setInstr(newMI); @@ -726,13 +651,13 @@ namespace llvm { IndexListEntry *nextEntry = 0; if (nextMBB == mbb->getParent()->end()) { - nextEntry = getTail(); + nextEntry = indexList.end(); } else { - nextEntry = &getMBBStartIdx(nextMBB).entry(); + nextEntry = getMBBStartIdx(nextMBB).listEntry(); } - insert(nextEntry, startEntry); - insert(nextEntry, stopEntry); + indexList.insert(nextEntry, startEntry); + indexList.insert(nextEntry, stopEntry); SlotIndex startIdx(startEntry, SlotIndex::Slot_Block); SlotIndex endIdx(nextEntry, SlotIndex::Slot_Block); @@ -766,4 +691,4 @@ namespace llvm { } -#endif // LLVM_CODEGEN_LIVEINDEX_H +#endif // LLVM_CODEGEN_SLOTINDEXES_H diff --git a/contrib/llvm/include/llvm/IntrinsicsX86.td b/contrib/llvm/include/llvm/IntrinsicsX86.td index a6fda4a3afc..cb7b3eadc87 100644 --- a/contrib/llvm/include/llvm/IntrinsicsX86.td +++ b/contrib/llvm/include/llvm/IntrinsicsX86.td @@ -1091,20 +1091,6 @@ let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". GCCBuiltin<"__builtin_ia32_vperm2f128_si256">, Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty, llvm_i8_ty], [IntrNoMem]>; - - def int_x86_avx_vpermil_pd : - Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, - llvm_i8_ty], [IntrNoMem]>; - def int_x86_avx_vpermil_ps : - Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, - llvm_i8_ty], [IntrNoMem]>; - - def int_x86_avx_vpermil_pd_256 : - Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, - llvm_i8_ty], [IntrNoMem]>; - def int_x86_avx_vpermil_ps_256 : - Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, - llvm_i8_ty], [IntrNoMem]>; } // Vector blend @@ -1659,15 +1645,9 @@ let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". def int_x86_avx2_permd : GCCBuiltin<"__builtin_ia32_permvarsi256">, Intrinsic<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_v8i32_ty], [IntrNoMem]>; - def int_x86_avx2_permq : GCCBuiltin<"__builtin_ia32_permdi256">, - Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_i8_ty], - [IntrNoMem]>; def int_x86_avx2_permps : GCCBuiltin<"__builtin_ia32_permvarsf256">, Intrinsic<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_v8f32_ty], [IntrNoMem]>; - def int_x86_avx2_permpd : GCCBuiltin<"__builtin_ia32_permdf256">, - Intrinsic<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_i8_ty], - [IntrNoMem]>; def int_x86_avx2_vperm2i128 : GCCBuiltin<"__builtin_ia32_permti256">, Intrinsic<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_v4i64_ty, llvm_i8_ty], [IntrNoMem]>; diff --git a/contrib/llvm/include/llvm/LLVMContext.h b/contrib/llvm/include/llvm/LLVMContext.h index 18adcd1e3c2..a8306a9e761 100644 --- a/contrib/llvm/include/llvm/LLVMContext.h +++ b/contrib/llvm/include/llvm/LLVMContext.h @@ -42,7 +42,7 @@ public: MD_dbg = 0, // "dbg" MD_tbaa = 1, // "tbaa" MD_prof = 2, // "prof" - MD_fpaccuracy = 3, // "fpaccuracy" + MD_fpmath = 3, // "fpmath" MD_range = 4 // "range" }; diff --git a/contrib/llvm/include/llvm/MC/MCParser/AsmLexer.h b/contrib/llvm/include/llvm/MC/MCParser/AsmLexer.h index dcecfb6aa01..9a8735f3e72 100644 --- a/contrib/llvm/include/llvm/MC/MCParser/AsmLexer.h +++ b/contrib/llvm/include/llvm/MC/MCParser/AsmLexer.h @@ -16,14 +16,11 @@ #include "llvm/ADT/StringRef.h" #include "llvm/MC/MCParser/MCAsmLexer.h" -#include "llvm/MC/MCAsmInfo.h" #include "llvm/Support/DataTypes.h" #include -#include namespace llvm { class MemoryBuffer; -class SMLoc; class MCAsmInfo; /// AsmLexer - Lexer class for assembly files. diff --git a/contrib/llvm/include/llvm/MC/MCParser/MCAsmLexer.h b/contrib/llvm/include/llvm/MC/MCParser/MCAsmLexer.h index ac04483ccf1..5e29ad49dd3 100644 --- a/contrib/llvm/include/llvm/MC/MCParser/MCAsmLexer.h +++ b/contrib/llvm/include/llvm/MC/MCParser/MCAsmLexer.h @@ -15,8 +15,6 @@ #include "llvm/Support/SMLoc.h" namespace llvm { -class MCAsmLexer; -class MCInst; /// AsmToken - Target independent representation for an assembler token. class AsmToken { @@ -53,6 +51,7 @@ public: Greater, GreaterEqual, GreaterGreater, At }; +private: TokenKind Kind; /// A reference to the entire token contents; this is always a pointer into diff --git a/contrib/llvm/include/llvm/Object/ELF.h b/contrib/llvm/include/llvm/Object/ELF.h index 0828985f2e9..e493f5bd929 100644 --- a/contrib/llvm/include/llvm/Object/ELF.h +++ b/contrib/llvm/include/llvm/Object/ELF.h @@ -33,6 +33,15 @@ namespace llvm { namespace object { +// Subclasses of ELFObjectFile may need this for template instantiation +inline std::pair +getElfArchType(MemoryBuffer *Object) { + if (Object->getBufferSize() < ELF::EI_NIDENT) + return std::make_pair((uint8_t)ELF::ELFCLASSNONE,(uint8_t)ELF::ELFDATANONE); + return std::make_pair( (uint8_t)Object->getBufferStart()[ELF::EI_CLASS] + , (uint8_t)Object->getBufferStart()[ELF::EI_DATA]); +} + // Templates to choose Elf_Addr and Elf_Off depending on is64Bits. template struct ELFDataTypeTypedefHelperCommon { diff --git a/contrib/llvm/include/llvm/Operator.h b/contrib/llvm/include/llvm/Operator.h index abd6a1939d7..1e86980cf30 100644 --- a/contrib/llvm/include/llvm/Operator.h +++ b/contrib/llvm/include/llvm/Operator.h @@ -15,8 +15,9 @@ #ifndef LLVM_OPERATOR_H #define LLVM_OPERATOR_H -#include "llvm/Instruction.h" #include "llvm/Constants.h" +#include "llvm/Instruction.h" +#include "llvm/Type.h" namespace llvm { @@ -129,14 +130,15 @@ public: IsExact = (1 << 0) }; +private: + ~PossiblyExactOperator(); // do not implement + friend class BinaryOperator; friend class ConstantExpr; void setIsExact(bool B) { SubclassOptionalData = (SubclassOptionalData & ~IsExact) | (B * IsExact); } -private: - ~PossiblyExactOperator(); // do not implement public: /// isExact - Test whether this division is known to be exact, with /// zero remainder. @@ -161,7 +163,28 @@ public: (isa(V) && classof(cast(V))); } }; - + +/// FPMathOperator - Utility class for floating point operations which can have +/// information about relaxed accuracy requirements attached to them. +class FPMathOperator : public Operator { +private: + ~FPMathOperator(); // do not implement + +public: + + /// \brief Get the maximum error permitted by this operation in ULPs. An + /// accuracy of 0.0 means that the operation should be performed with the + /// default precision. + float getFPAccuracy() const; + + static inline bool classof(const FPMathOperator *) { return true; } + static inline bool classof(const Instruction *I) { + return I->getType()->isFPOrFPVectorTy(); + } + static inline bool classof(const Value *V) { + return isa(V) && classof(cast(V)); + } +}; /// ConcreteOperator - A helper template for defining operators for individual diff --git a/contrib/llvm/include/llvm/Support/FileSystem.h b/contrib/llvm/include/llvm/Support/FileSystem.h index e6f9926af6f..a7327b8a760 100644 --- a/contrib/llvm/include/llvm/Support/FileSystem.h +++ b/contrib/llvm/include/llvm/Support/FileSystem.h @@ -422,8 +422,8 @@ error_code status_known(const Twine &path, bool &result); /// @results errc::success if result_{fd,path} have been successfully set, /// otherwise a platform specific error_code. error_code unique_file(const Twine &model, int &result_fd, - SmallVectorImpl &result_path, - bool makeAbsolute = true); + SmallVectorImpl &result_path, + bool makeAbsolute = true, unsigned mode = 0600); /// @brief Canonicalize path. /// diff --git a/contrib/llvm/include/llvm/Support/IRBuilder.h b/contrib/llvm/include/llvm/Support/IRBuilder.h index 782800173f4..ef00e8ec24e 100644 --- a/contrib/llvm/include/llvm/Support/IRBuilder.h +++ b/contrib/llvm/include/llvm/Support/IRBuilder.h @@ -17,6 +17,7 @@ #include "llvm/Instructions.h" #include "llvm/BasicBlock.h" +#include "llvm/LLVMContext.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" @@ -331,49 +332,63 @@ template > class IRBuilder : public IRBuilderBase, public Inserter { T Folder; + MDNode *DefaultFPMathTag; public: - IRBuilder(LLVMContext &C, const T &F, const Inserter &I = Inserter()) - : IRBuilderBase(C), Inserter(I), Folder(F) { + IRBuilder(LLVMContext &C, const T &F, const Inserter &I = Inserter(), + MDNode *FPMathTag = 0) + : IRBuilderBase(C), Inserter(I), Folder(F), DefaultFPMathTag(FPMathTag) { } - explicit IRBuilder(LLVMContext &C) : IRBuilderBase(C), Folder() { + explicit IRBuilder(LLVMContext &C, MDNode *FPMathTag = 0) : IRBuilderBase(C), + Folder(), DefaultFPMathTag(FPMathTag) { } - explicit IRBuilder(BasicBlock *TheBB, const T &F) - : IRBuilderBase(TheBB->getContext()), Folder(F) { + explicit IRBuilder(BasicBlock *TheBB, const T &F, MDNode *FPMathTag = 0) + : IRBuilderBase(TheBB->getContext()), Folder(F), + DefaultFPMathTag(FPMathTag) { SetInsertPoint(TheBB); } - explicit IRBuilder(BasicBlock *TheBB) - : IRBuilderBase(TheBB->getContext()), Folder() { + explicit IRBuilder(BasicBlock *TheBB, MDNode *FPMathTag = 0) + : IRBuilderBase(TheBB->getContext()), Folder(), + DefaultFPMathTag(FPMathTag) { SetInsertPoint(TheBB); } - explicit IRBuilder(Instruction *IP) - : IRBuilderBase(IP->getContext()), Folder() { + explicit IRBuilder(Instruction *IP, MDNode *FPMathTag = 0) + : IRBuilderBase(IP->getContext()), Folder(), DefaultFPMathTag(FPMathTag) { SetInsertPoint(IP); SetCurrentDebugLocation(IP->getDebugLoc()); } - explicit IRBuilder(Use &U) - : IRBuilderBase(U->getContext()), Folder() { + explicit IRBuilder(Use &U, MDNode *FPMathTag = 0) + : IRBuilderBase(U->getContext()), Folder(), DefaultFPMathTag(FPMathTag) { SetInsertPoint(U); SetCurrentDebugLocation(cast(U.getUser())->getDebugLoc()); } - IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, const T& F) - : IRBuilderBase(TheBB->getContext()), Folder(F) { + IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, const T& F, + MDNode *FPMathTag = 0) + : IRBuilderBase(TheBB->getContext()), Folder(F), + DefaultFPMathTag(FPMathTag) { SetInsertPoint(TheBB, IP); } - IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP) - : IRBuilderBase(TheBB->getContext()), Folder() { + IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, MDNode *FPMathTag = 0) + : IRBuilderBase(TheBB->getContext()), Folder(), + DefaultFPMathTag(FPMathTag) { SetInsertPoint(TheBB, IP); } /// getFolder - Get the constant folder being used. const T &getFolder() { return Folder; } + /// getDefaultFPMathTag - Get the floating point math metadata being used. + MDNode *getDefaultFPMathTag() const { return DefaultFPMathTag; } + + /// SetDefaultFPMathTag - Set the floating point math metadata to be used. + void SetDefaultFPMathTag(MDNode *FPMathTag) { DefaultFPMathTag = FPMathTag; } + /// isNamePreserving - Return true if this builder is configured to actually /// add the requested names to IR created through it. bool isNamePreserving() const { return preserveNames; } @@ -496,6 +511,14 @@ private: if (HasNSW) BO->setHasNoSignedWrap(); return BO; } + + Instruction *AddFPMathTag(Instruction *I, MDNode *FPMathTag) const { + if (!FPMathTag) + FPMathTag = DefaultFPMathTag; + if (FPMathTag) + I->setMetadata(LLVMContext::MD_fpmath, FPMathTag); + return I; + } public: Value *CreateAdd(Value *LHS, Value *RHS, const Twine &Name = "", bool HasNUW = false, bool HasNSW = false) { @@ -511,11 +534,13 @@ public: Value *CreateNUWAdd(Value *LHS, Value *RHS, const Twine &Name = "") { return CreateAdd(LHS, RHS, Name, true, false); } - Value *CreateFAdd(Value *LHS, Value *RHS, const Twine &Name = "") { + Value *CreateFAdd(Value *LHS, Value *RHS, const Twine &Name = "", + MDNode *FPMathTag = 0) { if (Constant *LC = dyn_cast(LHS)) if (Constant *RC = dyn_cast(RHS)) return Insert(Folder.CreateFAdd(LC, RC), Name); - return Insert(BinaryOperator::CreateFAdd(LHS, RHS), Name); + return Insert(AddFPMathTag(BinaryOperator::CreateFAdd(LHS, RHS), + FPMathTag), Name); } Value *CreateSub(Value *LHS, Value *RHS, const Twine &Name = "", bool HasNUW = false, bool HasNSW = false) { @@ -531,11 +556,13 @@ public: Value *CreateNUWSub(Value *LHS, Value *RHS, const Twine &Name = "") { return CreateSub(LHS, RHS, Name, true, false); } - Value *CreateFSub(Value *LHS, Value *RHS, const Twine &Name = "") { + Value *CreateFSub(Value *LHS, Value *RHS, const Twine &Name = "", + MDNode *FPMathTag = 0) { if (Constant *LC = dyn_cast(LHS)) if (Constant *RC = dyn_cast(RHS)) return Insert(Folder.CreateFSub(LC, RC), Name); - return Insert(BinaryOperator::CreateFSub(LHS, RHS), Name); + return Insert(AddFPMathTag(BinaryOperator::CreateFSub(LHS, RHS), + FPMathTag), Name); } Value *CreateMul(Value *LHS, Value *RHS, const Twine &Name = "", bool HasNUW = false, bool HasNSW = false) { @@ -551,11 +578,13 @@ public: Value *CreateNUWMul(Value *LHS, Value *RHS, const Twine &Name = "") { return CreateMul(LHS, RHS, Name, true, false); } - Value *CreateFMul(Value *LHS, Value *RHS, const Twine &Name = "") { + Value *CreateFMul(Value *LHS, Value *RHS, const Twine &Name = "", + MDNode *FPMathTag = 0) { if (Constant *LC = dyn_cast(LHS)) if (Constant *RC = dyn_cast(RHS)) return Insert(Folder.CreateFMul(LC, RC), Name); - return Insert(BinaryOperator::CreateFMul(LHS, RHS), Name); + return Insert(AddFPMathTag(BinaryOperator::CreateFMul(LHS, RHS), + FPMathTag), Name); } Value *CreateUDiv(Value *LHS, Value *RHS, const Twine &Name = "", bool isExact = false) { @@ -581,11 +610,13 @@ public: Value *CreateExactSDiv(Value *LHS, Value *RHS, const Twine &Name = "") { return CreateSDiv(LHS, RHS, Name, true); } - Value *CreateFDiv(Value *LHS, Value *RHS, const Twine &Name = "") { + Value *CreateFDiv(Value *LHS, Value *RHS, const Twine &Name = "", + MDNode *FPMathTag = 0) { if (Constant *LC = dyn_cast(LHS)) if (Constant *RC = dyn_cast(RHS)) return Insert(Folder.CreateFDiv(LC, RC), Name); - return Insert(BinaryOperator::CreateFDiv(LHS, RHS), Name); + return Insert(AddFPMathTag(BinaryOperator::CreateFDiv(LHS, RHS), + FPMathTag), Name); } Value *CreateURem(Value *LHS, Value *RHS, const Twine &Name = "") { if (Constant *LC = dyn_cast(LHS)) @@ -599,11 +630,13 @@ public: return Insert(Folder.CreateSRem(LC, RC), Name); return Insert(BinaryOperator::CreateSRem(LHS, RHS), Name); } - Value *CreateFRem(Value *LHS, Value *RHS, const Twine &Name = "") { + Value *CreateFRem(Value *LHS, Value *RHS, const Twine &Name = "", + MDNode *FPMathTag = 0) { if (Constant *LC = dyn_cast(LHS)) if (Constant *RC = dyn_cast(RHS)) return Insert(Folder.CreateFRem(LC, RC), Name); - return Insert(BinaryOperator::CreateFRem(LHS, RHS), Name); + return Insert(AddFPMathTag(BinaryOperator::CreateFRem(LHS, RHS), + FPMathTag), Name); } Value *CreateShl(Value *LHS, Value *RHS, const Twine &Name = "", @@ -729,10 +762,10 @@ public: Value *CreateNUWNeg(Value *V, const Twine &Name = "") { return CreateNeg(V, Name, true, false); } - Value *CreateFNeg(Value *V, const Twine &Name = "") { + Value *CreateFNeg(Value *V, const Twine &Name = "", MDNode *FPMathTag = 0) { if (Constant *VC = dyn_cast(V)) return Insert(Folder.CreateFNeg(VC), Name); - return Insert(BinaryOperator::CreateFNeg(V), Name); + return Insert(AddFPMathTag(BinaryOperator::CreateFNeg(V), FPMathTag), Name); } Value *CreateNot(Value *V, const Twine &Name = "") { if (Constant *VC = dyn_cast(V)) diff --git a/contrib/llvm/include/llvm/Support/Locale.h b/contrib/llvm/include/llvm/Support/Locale.h new file mode 100644 index 00000000000..b0f12958029 --- /dev/null +++ b/contrib/llvm/include/llvm/Support/Locale.h @@ -0,0 +1,17 @@ +#ifndef LLVM_SUPPORT_LOCALE +#define LLVM_SUPPORT_LOCALE + +#include "llvm/ADT/StringRef.h" + +namespace llvm { +namespace sys { +namespace locale { + +int columnWidth(StringRef s); +bool isPrint(int c); + +} +} +} + +#endif // LLVM_SUPPORT_LOCALE diff --git a/contrib/llvm/include/llvm/Support/MDBuilder.h b/contrib/llvm/include/llvm/Support/MDBuilder.h new file mode 100644 index 00000000000..40f028a4327 --- /dev/null +++ b/contrib/llvm/include/llvm/Support/MDBuilder.h @@ -0,0 +1,118 @@ +//===---- llvm/Support/MDBuilder.h - Builder for LLVM metadata --*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the MDBuilder class, which is used as a convenient way to +// create LLVM metadata with a consistent and simplified interface. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_SUPPORT_MDBUILDER_H +#define LLVM_SUPPORT_MDBUILDER_H + +#include "llvm/Constants.h" +#include "llvm/DerivedTypes.h" +#include "llvm/LLVMContext.h" +#include "llvm/Metadata.h" +#include "llvm/ADT/APInt.h" + +namespace llvm { + + class MDBuilder { + LLVMContext &Context; + + public: + MDBuilder(LLVMContext &context) : Context(context) {} + + /// \brief Return the given string as metadata. + MDString *createString(StringRef Str) { + return MDString::get(Context, Str); + } + + //===------------------------------------------------------------------===// + // FPMath metadata. + //===------------------------------------------------------------------===// + + /// \brief Return metadata with the given settings. The special value 0.0 + /// for the Accuracy parameter indicates the default (maximal precision) + /// setting. + MDNode *createFPMath(float Accuracy) { + if (Accuracy == 0.0) + return 0; + assert(Accuracy > 0.0 && "Invalid fpmath accuracy!"); + Value *Op = ConstantFP::get(Type::getFloatTy(Context), Accuracy); + return MDNode::get(Context, Op); + } + + + //===------------------------------------------------------------------===// + // Range metadata. + //===------------------------------------------------------------------===// + + /// \brief Return metadata describing the range [Lo, Hi). + MDNode *createRange(const APInt &Lo, const APInt &Hi) { + assert(Lo.getBitWidth() == Hi.getBitWidth() && "Mismatched bitwidths!"); + // If the range is everything then it is useless. + if (Hi == Lo) + return 0; + + // Return the range [Lo, Hi). + Type *Ty = IntegerType::get(Context, Lo.getBitWidth()); + Value *Range[2] = { ConstantInt::get(Ty, Lo), ConstantInt::get(Ty, Hi) }; + return MDNode::get(Context, Range); + } + + + //===------------------------------------------------------------------===// + // TBAA metadata. + //===------------------------------------------------------------------===// + + /// \brief Return metadata appropriate for a TBAA root node. Each returned + /// node is distinct from all other metadata and will never be identified + /// (uniqued) with anything else. + MDNode *createAnonymousTBAARoot() { + // To ensure uniqueness the root node is self-referential. + MDNode *Dummy = MDNode::getTemporary(Context, ArrayRef()); + MDNode *Root = MDNode::get(Context, Dummy); + // At this point we have + // !0 = metadata !{} <- dummy + // !1 = metadata !{metadata !0} <- root + // Replace the dummy operand with the root node itself and delete the dummy. + Root->replaceOperandWith(0, Root); + MDNode::deleteTemporary(Dummy); + // We now have + // !1 = metadata !{metadata !1} <- self-referential root + return Root; + } + + /// \brief Return metadata appropriate for a TBAA root node with the given + /// name. This may be identified (uniqued) with other roots with the same + /// name. + MDNode *createTBAARoot(StringRef Name) { + return MDNode::get(Context, createString(Name)); + } + + /// \brief Return metadata for a non-root TBAA node with the given name, + /// parent in the TBAA tree, and value for 'pointsToConstantMemory'. + MDNode *createTBAANode(StringRef Name, MDNode *Parent, + bool isConstant = false) { + if (isConstant) { + Constant *Flags = ConstantInt::get(Type::getInt64Ty(Context), 1); + Value *Ops[3] = { createString(Name), Parent, Flags }; + return MDNode::get(Context, Ops); + } else { + Value *Ops[2] = { createString(Name), Parent }; + return MDNode::get(Context, Ops); + } + } + + }; + +} // end namespace llvm + +#endif diff --git a/contrib/llvm/include/llvm/Support/Process.h b/contrib/llvm/include/llvm/Support/Process.h index 33799229ff3..d796b7906d3 100644 --- a/contrib/llvm/include/llvm/Support/Process.h +++ b/contrib/llvm/include/llvm/Support/Process.h @@ -136,6 +136,10 @@ namespace sys { /// Same as OutputColor, but only enables the bold attribute. static const char *OutputBold(bool bg); + /// This function returns the escape sequence to reverse forground and + /// background colors. + static const char *OutputReverse(); + /// Resets the terminals colors, or returns an escape sequence to do so. static const char *ResetColor(); /// @} diff --git a/contrib/llvm/include/llvm/Support/SourceMgr.h b/contrib/llvm/include/llvm/Support/SourceMgr.h index 58b8fab5240..76967dbf78a 100644 --- a/contrib/llvm/include/llvm/Support/SourceMgr.h +++ b/contrib/llvm/include/llvm/Support/SourceMgr.h @@ -128,8 +128,11 @@ public: /// PrintMessage - Emit a message about the specified location with the /// specified string. /// + /// @param ShowColors - Display colored messages if output is a terminal and + /// the default error handler is used. void PrintMessage(SMLoc Loc, DiagKind Kind, const Twine &Msg, - ArrayRef Ranges = ArrayRef()) const; + ArrayRef Ranges = ArrayRef(), + bool ShowColors = true) const; /// GetMessage - Return an SMDiagnostic at the specified location with the @@ -188,7 +191,7 @@ public: const std::vector > &getRanges() const { return Ranges; } - void print(const char *ProgName, raw_ostream &S) const; + void print(const char *ProgName, raw_ostream &S, bool ShowColors = true) const; }; } // end llvm namespace diff --git a/contrib/llvm/include/llvm/Support/YAMLParser.h b/contrib/llvm/include/llvm/Support/YAMLParser.h index b24cacd3c32..47206b3c6d9 100644 --- a/contrib/llvm/include/llvm/Support/YAMLParser.h +++ b/contrib/llvm/include/llvm/Support/YAMLParser.h @@ -516,8 +516,11 @@ public: document_iterator() : Doc(NullDoc) {} document_iterator(OwningPtr &D) : Doc(D) {} + bool operator ==(const document_iterator &Other) { + return Doc == Other.Doc; + } bool operator !=(const document_iterator &Other) { - return Doc != Other.Doc; + return !(*this == Other); } document_iterator operator ++() { diff --git a/contrib/llvm/include/llvm/Support/raw_ostream.h b/contrib/llvm/include/llvm/Support/raw_ostream.h index 6bfae5e2982..6c5d4787e0f 100644 --- a/contrib/llvm/include/llvm/Support/raw_ostream.h +++ b/contrib/llvm/include/llvm/Support/raw_ostream.h @@ -222,6 +222,9 @@ public: /// outputting colored text, or before program exit. virtual raw_ostream &resetColor() { return *this; } + /// Reverses the forground and background colors. + virtual raw_ostream &reverseColor() { return *this; } + /// This function determines if this stream is connected to a "tty" or /// "console" window. That is, the output would be displayed to the user /// rather than being put on a pipe or stored in a file. @@ -379,6 +382,8 @@ public: bool bg=false); virtual raw_ostream &resetColor(); + virtual raw_ostream &reverseColor(); + virtual bool is_displayed() const; /// has_error - Return the value of the flag in this raw_fd_ostream indicating diff --git a/contrib/llvm/include/llvm/TableGen/Error.h b/contrib/llvm/include/llvm/TableGen/Error.h index c01b32b1c2d..fd5f805ffc9 100644 --- a/contrib/llvm/include/llvm/TableGen/Error.h +++ b/contrib/llvm/include/llvm/TableGen/Error.h @@ -29,6 +29,11 @@ public: const std::string &getMessage() const { return Message; } }; +void PrintWarning(SMLoc WarningLoc, const Twine &Msg); +void PrintWarning(const char *Loc, const Twine &Msg); +void PrintWarning(const Twine &Msg); +void PrintWarning(const TGError &Warning); + void PrintError(SMLoc ErrorLoc, const Twine &Msg); void PrintError(const char *Loc, const Twine &Msg); void PrintError(const Twine &Msg); diff --git a/contrib/llvm/include/llvm/TableGen/Record.h b/contrib/llvm/include/llvm/TableGen/Record.h index 5e68c10a47a..3aea1aeaead 100644 --- a/contrib/llvm/include/llvm/TableGen/Record.h +++ b/contrib/llvm/include/llvm/TableGen/Record.h @@ -454,7 +454,7 @@ public: /// without adding quote markers. This primaruly affects /// StringInits where we will not surround the string value with /// quotes. - virtual std::string getAsUnquotedString() const { return getAsString(); } + virtual std::string getAsUnquotedString() const { return getAsString(); } /// dump - Debugging method that may be called through a debugger, just /// invokes print on stderr. @@ -1529,7 +1529,7 @@ struct MultiClass { void dump() const; - MultiClass(const std::string &Name, SMLoc Loc, RecordKeeper &Records) : + MultiClass(const std::string &Name, SMLoc Loc, RecordKeeper &Records) : Rec(Name, Loc, Records) {} }; diff --git a/contrib/llvm/include/llvm/Target/TargetLibraryInfo.h b/contrib/llvm/include/llvm/Target/TargetLibraryInfo.h index 70e26bf3c5a..c8cacf284d0 100644 --- a/contrib/llvm/include/llvm/Target/TargetLibraryInfo.h +++ b/contrib/llvm/include/llvm/Target/TargetLibraryInfo.h @@ -83,7 +83,7 @@ namespace llvm { /// long double expm1l(long double x); expm1l, /// float expm1f(float x); - expl1f, + expm1f, /// double fabs(double x); fabs, /// long double fabsl(long double x); @@ -159,8 +159,14 @@ namespace llvm { rint, /// float rintf(float x); rintf, - /// long dobule rintl(long double x); + /// long double rintl(long double x); rintl, + /// double round(double x); + round, + /// float roundf(float x); + roundf, + /// long double roundl(long double x); + roundl, /// double sin(double x); sin, /// long double sinl(long double x); diff --git a/contrib/llvm/include/llvm/Target/TargetRegisterInfo.h b/contrib/llvm/include/llvm/Target/TargetRegisterInfo.h index 7d8a46b49ac..6ddd36451b5 100644 --- a/contrib/llvm/include/llvm/Target/TargetRegisterInfo.h +++ b/contrib/llvm/include/llvm/Target/TargetRegisterInfo.h @@ -205,7 +205,7 @@ struct TargetRegisterInfoDesc { /// Each TargetRegisterClass has a per register weight, and weight /// limit which must be less than the limits of its pressure sets. struct RegClassWeight { - unsigned RegWeigt; + unsigned RegWeight; unsigned WeightLimit; }; diff --git a/contrib/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h b/contrib/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h index 867b9e43849..2f9dc54541b 100644 --- a/contrib/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h +++ b/contrib/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h @@ -110,7 +110,8 @@ bool isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum, /// BasicBlock *SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P = 0, bool MergeIdenticalEdges = false, - bool DontDeleteUselessPHIs = false); + bool DontDeleteUselessPHIs = false, + bool SplitLandingPads = false); inline BasicBlock *SplitCriticalEdge(BasicBlock *BB, succ_iterator SI, Pass *P = 0) { diff --git a/contrib/llvm/include/llvm/Transforms/Vectorize.h b/contrib/llvm/include/llvm/Transforms/Vectorize.h index 7701ceb4d0b..652916c26c2 100644 --- a/contrib/llvm/include/llvm/Transforms/Vectorize.h +++ b/contrib/llvm/include/llvm/Transforms/Vectorize.h @@ -34,6 +34,9 @@ struct VectorizeConfig { /// @brief Vectorize floating-point values. bool VectorizeFloats; + /// @brief Vectorize pointer values. + bool VectorizePointers; + /// @brief Vectorize casting (conversion) operations. bool VectorizeCasts; @@ -43,6 +46,12 @@ struct VectorizeConfig { /// @brief Vectorize the fused-multiply-add intrinsic. bool VectorizeFMA; + /// @brief Vectorize select instructions. + bool VectorizeSelect; + + /// @brief Vectorize getelementptr instructions. + bool VectorizeGEP; + /// @brief Vectorize loads and stores. bool VectorizeMemOps; diff --git a/contrib/llvm/lib/Analysis/ConstantFolding.cpp b/contrib/llvm/lib/Analysis/ConstantFolding.cpp index 7a0a4e1e824..783c32e6669 100644 --- a/contrib/llvm/lib/Analysis/ConstantFolding.cpp +++ b/contrib/llvm/lib/Analysis/ConstantFolding.cpp @@ -681,6 +681,7 @@ static Constant *SymbolicallyEvaluateGEP(ArrayRef Ops, // This makes it easy to determine if the getelementptr is "inbounds". // Also, this helps GlobalOpt do SROA on GlobalVariables. Type *Ty = Ptr->getType(); + assert(Ty->isPointerTy() && "Forming regular GEP of non-pointer type"); SmallVector NewIdxs; do { if (SequentialType *ATy = dyn_cast(Ty)) { @@ -711,10 +712,17 @@ static Constant *SymbolicallyEvaluateGEP(ArrayRef Ops, } Ty = ATy->getElementType(); } else if (StructType *STy = dyn_cast(Ty)) { - // Determine which field of the struct the offset points into. The - // getZExtValue is at least as safe as the StructLayout API because we - // know the offset is within the struct at this point. + // If we end up with an offset that isn't valid for this struct type, we + // can't re-form this GEP in a regular form, so bail out. The pointer + // operand likely went through casts that are necessary to make the GEP + // sensible. const StructLayout &SL = *TD->getStructLayout(STy); + if (Offset.uge(SL.getSizeInBytes())) + break; + + // Determine which field of the struct the offset points into. The + // getZExtValue is fine as we've already ensured that the offset is + // within the range representable by the StructLayout API. unsigned ElIdx = SL.getElementContainingOffset(Offset.getZExtValue()); NewIdxs.push_back(ConstantInt::get(Type::getInt32Ty(Ty->getContext()), ElIdx)); diff --git a/contrib/llvm/lib/Analysis/ScalarEvolution.cpp b/contrib/llvm/lib/Analysis/ScalarEvolution.cpp index 1d55642079a..205227ca0b7 100644 --- a/contrib/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/contrib/llvm/lib/Analysis/ScalarEvolution.cpp @@ -3187,7 +3187,7 @@ const SCEV *ScalarEvolution::createNodeForGEP(GEPOperator *GEP) { // Add the total offset from all the GEP indices to the base. return getAddExpr(BaseS, TotalOffset, - isInBounds ? SCEV::FlagNUW : SCEV::FlagAnyWrap); + isInBounds ? SCEV::FlagNSW : SCEV::FlagAnyWrap); } /// GetMinTrailingZeros - Determine the minimum number of zero bits that S is diff --git a/contrib/llvm/lib/Analysis/ValueTracking.cpp b/contrib/llvm/lib/Analysis/ValueTracking.cpp index a430f6281ef..1418e01d7c8 100644 --- a/contrib/llvm/lib/Analysis/ValueTracking.cpp +++ b/contrib/llvm/lib/Analysis/ValueTracking.cpp @@ -564,7 +564,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne, Depth+1); // If it's known zero, our sign bit is also zero. if (LHSKnownZero.isNegative()) - KnownZero |= LHSKnownZero; + KnownZero.setBit(BitWidth - 1); } break; diff --git a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp index 660684d1bea..454a923c13e 100644 --- a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp +++ b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp @@ -36,35 +36,20 @@ const char *DwarfAccelTable::Atom::AtomTypeString(enum AtomType AT) { llvm_unreachable("invalid AtomType!"); } -// The general case would need to have a less hard coded size for the -// length of the HeaderData, however, if we're constructing based on a -// single Atom then we know it will always be: 4 + 4 + 2 + 2. -DwarfAccelTable::DwarfAccelTable(DwarfAccelTable::Atom atom) : - Header(12), - HeaderData(atom) { -} - // The length of the header data is always going to be 4 + 4 + 4*NumAtoms. -DwarfAccelTable::DwarfAccelTable(std::vector &atomList) : +DwarfAccelTable::DwarfAccelTable(ArrayRef atomList) : Header(8 + (atomList.size() * 4)), - HeaderData(atomList) { -} + HeaderData(atomList), + Entries(Allocator) { } -DwarfAccelTable::~DwarfAccelTable() { - for (size_t i = 0, e = Data.size(); i < e; ++i) - delete Data[i]; - for (StringMap::iterator - EI = Entries.begin(), EE = Entries.end(); EI != EE; ++EI) - for (DataArray::iterator DI = EI->second.begin(), - DE = EI->second.end(); DI != DE; ++DI) - delete (*DI); -} +DwarfAccelTable::~DwarfAccelTable() { } void DwarfAccelTable::AddName(StringRef Name, DIE* die, char Flags) { + assert(Data.empty() && "Already finalized!"); // If the string is in the list already then add this die to the list // otherwise add a new one. DataArray &DIEs = Entries[Name]; - DIEs.push_back(new HashDataContents(die, Flags)); + DIEs.push_back(new (Allocator) HashDataContents(die, Flags)); } void DwarfAccelTable::ComputeBucketCount(void) { @@ -85,31 +70,23 @@ void DwarfAccelTable::ComputeBucketCount(void) { Header.hashes_count = num; } -namespace { - // DIESorter - comparison predicate that sorts DIEs by their offset. - struct DIESorter { - bool operator()(const struct DwarfAccelTable::HashDataContents *A, - const struct DwarfAccelTable::HashDataContents *B) const { - return A->Die->getOffset() < B->Die->getOffset(); - } - }; +// compareDIEs - comparison predicate that sorts DIEs by their offset. +static bool compareDIEs(const DwarfAccelTable::HashDataContents *A, + const DwarfAccelTable::HashDataContents *B) { + return A->Die->getOffset() < B->Die->getOffset(); } void DwarfAccelTable::FinalizeTable(AsmPrinter *Asm, const char *Prefix) { // Create the individual hash data outputs. for (StringMap::iterator EI = Entries.begin(), EE = Entries.end(); EI != EE; ++EI) { - struct HashData *Entry = new HashData((*EI).getKeyData()); // Unique the entries. - std::stable_sort(EI->second.begin(), EI->second.end(), DIESorter()); + std::stable_sort(EI->second.begin(), EI->second.end(), compareDIEs); EI->second.erase(std::unique(EI->second.begin(), EI->second.end()), EI->second.end()); - for (DataArray::const_iterator DI = EI->second.begin(), - DE = EI->second.end(); - DI != DE; ++DI) - Entry->addData((*DI)); + HashData *Entry = new (Allocator) HashData(EI->getKey(), EI->second); Data.push_back(Entry); } @@ -216,7 +193,7 @@ void DwarfAccelTable::EmitData(AsmPrinter *Asm, DwarfDebug *D) { D->getStringPool()); Asm->OutStreamer.AddComment("Num DIEs"); Asm->EmitInt32((*HI)->Data.size()); - for (std::vector::const_iterator + for (ArrayRef::const_iterator DI = (*HI)->Data.begin(), DE = (*HI)->Data.end(); DI != DE; ++DI) { // Emit the DIE offset diff --git a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfAccelTable.h b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfAccelTable.h index 2278d4c784f..963b8cdf342 100644 --- a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfAccelTable.h +++ b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfAccelTable.h @@ -15,6 +15,7 @@ #define CODEGEN_ASMPRINTER_DWARFACCELTABLE_H__ #include "llvm/ADT/StringMap.h" +#include "llvm/ADT/ArrayRef.h" #include "llvm/MC/MCSymbol.h" #include "llvm/Support/Dwarf.h" #include "llvm/Support/DataTypes.h" @@ -164,22 +165,12 @@ public: private: struct TableHeaderData { - uint32_t die_offset_base; - std::vector Atoms; + SmallVector Atoms; + + TableHeaderData(ArrayRef AtomList, uint32_t offset = 0) + : die_offset_base(offset), Atoms(AtomList.begin(), AtomList.end()) { } - TableHeaderData(std::vector &AtomList, - uint32_t offset = 0) : - die_offset_base(offset) { - for (size_t i = 0, e = AtomList.size(); i != e; ++i) - Atoms.push_back(AtomList[i]); - } - - TableHeaderData(DwarfAccelTable::Atom Atom, uint32_t offset = 0) - : die_offset_base(offset) { - Atoms.push_back(Atom); - } - #ifndef NDEBUG void print (raw_ostream &O) { O << "die_offset_base: " << die_offset_base << "\n"; @@ -221,11 +212,11 @@ private: StringRef Str; uint32_t HashValue; MCSymbol *Sym; - std::vector Data; // offsets - HashData(StringRef S) : Str(S) { + ArrayRef Data; // offsets + HashData(StringRef S, ArrayRef Data) + : Str(S), Data(Data) { HashValue = DwarfAccelTable::HashDJB(S); } - void addData(struct HashDataContents *Datum) { Data.push_back(Datum); } #ifndef NDEBUG void print(raw_ostream &O) { O << "Name: " << Str << "\n"; @@ -255,15 +246,18 @@ private: void EmitHashes(AsmPrinter *); void EmitOffsets(AsmPrinter *, MCSymbol *); void EmitData(AsmPrinter *, DwarfDebug *D); - + + // Allocator for HashData and HashDataContents. + BumpPtrAllocator Allocator; + // Output Variables TableHeader Header; TableHeaderData HeaderData; std::vector Data; // String Data - typedef std::vector DataArray; - typedef StringMap StringEntries; + typedef std::vector DataArray; + typedef StringMap StringEntries; StringEntries Entries; // Buckets/Hashes/Offsets @@ -274,8 +268,7 @@ private: // Public Implementation public: - DwarfAccelTable(DwarfAccelTable::Atom); - DwarfAccelTable(std::vector &); + DwarfAccelTable(ArrayRef); ~DwarfAccelTable(); void AddName(StringRef, DIE*, char = 0); void FinalizeTable(AsmPrinter *, const char *); diff --git a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index 69dc454ae1d..cc5b6424d73 100644 --- a/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -1032,9 +1032,10 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) { // Add function template parameters. addTemplateParams(*SPDie, SP.getTemplateParams()); - // Unfortunately this code needs to stay here to work around - // a bug in older gdbs that requires the linkage name to resolve - // multiple template functions. + // Unfortunately this code needs to stay here instead of below the + // AT_specification code in order to work around a bug in older + // gdbs that requires the linkage name to resolve multiple template + // functions. StringRef LinkageName = SP.getLinkageName(); if (!LinkageName.empty()) addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, diff --git a/contrib/llvm/lib/CodeGen/DFAPacketizer.cpp b/contrib/llvm/lib/CodeGen/DFAPacketizer.cpp index bfbe7790998..5ff641c7c84 100644 --- a/contrib/llvm/lib/CodeGen/DFAPacketizer.cpp +++ b/contrib/llvm/lib/CodeGen/DFAPacketizer.cpp @@ -23,10 +23,10 @@ // //===----------------------------------------------------------------------===// -#include "llvm/CodeGen/ScheduleDAGInstrs.h" #include "llvm/CodeGen/DFAPacketizer.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineInstrBundle.h" +#include "llvm/CodeGen/ScheduleDAGInstrs.h" #include "llvm/Target/TargetInstrInfo.h" #include "llvm/MC/MCInstrItineraries.h" using namespace llvm; @@ -100,17 +100,17 @@ void DFAPacketizer::reserveResources(llvm::MachineInstr *MI) { reserveResources(&MID); } -namespace llvm { +namespace { // DefaultVLIWScheduler - This class extends ScheduleDAGInstrs and overrides // Schedule method to build the dependence graph. class DefaultVLIWScheduler : public ScheduleDAGInstrs { public: DefaultVLIWScheduler(MachineFunction &MF, MachineLoopInfo &MLI, - MachineDominatorTree &MDT, bool IsPostRA); + MachineDominatorTree &MDT, bool IsPostRA); // Schedule - Actual scheduling work. void schedule(); }; -} +} // end anonymous namespace DefaultVLIWScheduler::DefaultVLIWScheduler( MachineFunction &MF, MachineLoopInfo &MLI, MachineDominatorTree &MDT, @@ -129,25 +129,49 @@ VLIWPacketizerList::VLIWPacketizerList( bool IsPostRA) : TM(MF.getTarget()), MF(MF) { TII = TM.getInstrInfo(); ResourceTracker = TII->CreateTargetScheduleState(&TM, 0); - VLIWScheduler = new DefaultVLIWScheduler(MF, MLI, MDT, IsPostRA); + SchedulerImpl = new DefaultVLIWScheduler(MF, MLI, MDT, IsPostRA); } // VLIWPacketizerList Dtor VLIWPacketizerList::~VLIWPacketizerList() { - if (VLIWScheduler) - delete VLIWScheduler; + delete SchedulerImpl; + delete ResourceTracker; +} - if (ResourceTracker) - delete ResourceTracker; +// ignorePseudoInstruction - ignore pseudo instructions. +bool VLIWPacketizerList::ignorePseudoInstruction(MachineInstr *MI, + MachineBasicBlock *MBB) { + if (MI->isDebugValue()) + return true; + + if (TII->isSchedulingBoundary(MI, MBB, MF)) + return true; + + return false; +} + +// isSoloInstruction - return true if instruction I must end previous +// packet. +bool VLIWPacketizerList::isSoloInstruction(MachineInstr *I) { + if (I->isInlineAsm()) + return true; + + return false; +} + +// addToPacket - Add I to the current packet and reserve resource. +void VLIWPacketizerList::addToPacket(MachineInstr *MI) { + CurrentPacketMIs.push_back(MI); + ResourceTracker->reserveResources(MI); } // endPacket - End the current packet, bundle packet instructions and reset // DFA state. void VLIWPacketizerList::endPacket(MachineBasicBlock *MBB, - MachineInstr *MI) { + MachineInstr *I) { if (CurrentPacketMIs.size() > 1) { MachineInstr *MIFirst = CurrentPacketMIs.front(); - finalizeBundle(*MBB, MIFirst, MI); + finalizeBundle(*MBB, MIFirst, I); } CurrentPacketMIs.clear(); ResourceTracker->clearResources(); @@ -157,36 +181,31 @@ void VLIWPacketizerList::endPacket(MachineBasicBlock *MBB, void VLIWPacketizerList::PacketizeMIs(MachineBasicBlock *MBB, MachineBasicBlock::iterator BeginItr, MachineBasicBlock::iterator EndItr) { - assert(VLIWScheduler && "VLIW Scheduler is not initialized!"); - VLIWScheduler->enterRegion(MBB, BeginItr, EndItr, MBB->size()); - VLIWScheduler->schedule(); - VLIWScheduler->exitRegion(); + assert(MBB->end() == EndItr && "Bad EndIndex"); - // Generate MI -> SU map. - //std::map MIToSUnit; - MIToSUnit.clear(); - for (unsigned i = 0, e = VLIWScheduler->SUnits.size(); i != e; ++i) { - SUnit *SU = &VLIWScheduler->SUnits[i]; - MIToSUnit[SU->getInstr()] = SU; - } + SchedulerImpl->enterRegion(MBB, BeginItr, EndItr, MBB->size()); + + // Build the DAG without reordering instructions. + SchedulerImpl->schedule(); + + // Remember scheduling units. + SUnits = SchedulerImpl->SUnits; // The main packetizer loop. for (; BeginItr != EndItr; ++BeginItr) { MachineInstr *MI = BeginItr; - this->initPacketizerState(); + // Ignore pseudo instructions. + if (ignorePseudoInstruction(MI, MBB)) + continue; // End the current packet if needed. - if (this->isSoloInstruction(MI)) { + if (isSoloInstruction(MI)) { endPacket(MBB, MI); continue; } - // Ignore pseudo instructions. - if (this->ignorePseudoInstruction(MI, MBB)) - continue; - - SUnit *SUI = MIToSUnit[MI]; + SUnit *SUI = SchedulerImpl->getSUnit(MI); assert(SUI && "Missing SUnit Info!"); // Ask DFA if machine resource is available for MI. @@ -196,13 +215,13 @@ void VLIWPacketizerList::PacketizeMIs(MachineBasicBlock *MBB, for (std::vector::iterator VI = CurrentPacketMIs.begin(), VE = CurrentPacketMIs.end(); VI != VE; ++VI) { MachineInstr *MJ = *VI; - SUnit *SUJ = MIToSUnit[MJ]; + SUnit *SUJ = SchedulerImpl->getSUnit(MJ); assert(SUJ && "Missing SUnit Info!"); // Is it legal to packetize SUI and SUJ together. - if (!this->isLegalToPacketizeTogether(SUI, SUJ)) { + if (!isLegalToPacketizeTogether(SUI, SUJ)) { // Allow packetization if dependency can be pruned. - if (!this->isLegalToPruneDependencies(SUI, SUJ)) { + if (!isLegalToPruneDependencies(SUI, SUJ)) { // End the packet if dependency cannot be pruned. endPacket(MBB, MI); break; @@ -215,9 +234,11 @@ void VLIWPacketizerList::PacketizeMIs(MachineBasicBlock *MBB, } // Add MI to the current packet. - BeginItr = this->addToPacket(MI); + addToPacket(MI); } // For all instructions in BB. // End any packet left behind. endPacket(MBB, EndItr); + + SchedulerImpl->exitRegion(); } diff --git a/contrib/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp b/contrib/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp index 3ade66097cb..934cc124c77 100644 --- a/contrib/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/contrib/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -1068,9 +1068,9 @@ public: #ifndef NDEBUG LIValidator validator; - std::for_each(Entering.begin(), Entering.end(), validator); - std::for_each(Internal.begin(), Internal.end(), validator); - std::for_each(Exiting.begin(), Exiting.end(), validator); + validator = std::for_each(Entering.begin(), Entering.end(), validator); + validator = std::for_each(Internal.begin(), Internal.end(), validator); + validator = std::for_each(Exiting.begin(), Exiting.end(), validator); assert(validator.rangesOk() && "moveAllOperandsFrom broke liveness."); #endif @@ -1115,9 +1115,9 @@ public: #ifndef NDEBUG LIValidator validator; - std::for_each(Entering.begin(), Entering.end(), validator); - std::for_each(Internal.begin(), Internal.end(), validator); - std::for_each(Exiting.begin(), Exiting.end(), validator); + validator = std::for_each(Entering.begin(), Entering.end(), validator); + validator = std::for_each(Internal.begin(), Internal.end(), validator); + validator = std::for_each(Exiting.begin(), Exiting.end(), validator); assert(validator.rangesOk() && "moveAllOperandsInto broke liveness."); #endif } diff --git a/contrib/llvm/lib/CodeGen/MachineBasicBlock.cpp b/contrib/llvm/lib/CodeGen/MachineBasicBlock.cpp index 6c8a1072697..1abb8f240cc 100644 --- a/contrib/llvm/lib/CodeGen/MachineBasicBlock.cpp +++ b/contrib/llvm/lib/CodeGen/MachineBasicBlock.cpp @@ -392,22 +392,44 @@ void MachineBasicBlock::updateTerminator() { TII->InsertBranch(*this, TBB, 0, Cond, dl); } } else { + // Walk through the successors and find the successor which is not + // a landing pad and is not the conditional branch destination (in TBB) + // as the fallthrough successor. + MachineBasicBlock *FallthroughBB = 0; + for (succ_iterator SI = succ_begin(), SE = succ_end(); SI != SE; ++SI) { + if ((*SI)->isLandingPad() || *SI == TBB) + continue; + assert(!FallthroughBB && "Found more than one fallthrough successor."); + FallthroughBB = *SI; + } + if (!FallthroughBB && canFallThrough()) { + // We fallthrough to the same basic block as the conditional jump + // targets. Remove the conditional jump, leaving unconditional + // fallthrough. + // FIXME: This does not seem like a reasonable pattern to support, but it + // has been seen in the wild coming out of degenerate ARM test cases. + TII->RemoveBranch(*this); + + // Finally update the unconditional successor to be reached via a branch + // if it would not be reached by fallthrough. + if (!isLayoutSuccessor(TBB)) + TII->InsertBranch(*this, TBB, 0, Cond, dl); + return; + } + // The block has a fallthrough conditional branch. - MachineBasicBlock *MBBA = *succ_begin(); - MachineBasicBlock *MBBB = *llvm::next(succ_begin()); - if (MBBA == TBB) std::swap(MBBB, MBBA); if (isLayoutSuccessor(TBB)) { if (TII->ReverseBranchCondition(Cond)) { // We can't reverse the condition, add an unconditional branch. Cond.clear(); - TII->InsertBranch(*this, MBBA, 0, Cond, dl); + TII->InsertBranch(*this, FallthroughBB, 0, Cond, dl); return; } TII->RemoveBranch(*this); - TII->InsertBranch(*this, MBBA, 0, Cond, dl); - } else if (!isLayoutSuccessor(MBBA)) { + TII->InsertBranch(*this, FallthroughBB, 0, Cond, dl); + } else if (!isLayoutSuccessor(FallthroughBB)) { TII->RemoveBranch(*this); - TII->InsertBranch(*this, TBB, MBBA, Cond, dl); + TII->InsertBranch(*this, TBB, FallthroughBB, Cond, dl); } } } diff --git a/contrib/llvm/lib/CodeGen/MachineBlockPlacement.cpp b/contrib/llvm/lib/CodeGen/MachineBlockPlacement.cpp index 22d7212007f..5ba68517b7a 100644 --- a/contrib/llvm/lib/CodeGen/MachineBlockPlacement.cpp +++ b/contrib/llvm/lib/CodeGen/MachineBlockPlacement.cpp @@ -102,13 +102,13 @@ public: } /// \brief Iterator over blocks within the chain. - typedef SmallVectorImpl::const_iterator iterator; + typedef SmallVectorImpl::iterator iterator; /// \brief Beginning of blocks within the chain. - iterator begin() const { return Blocks.begin(); } + iterator begin() { return Blocks.begin(); } /// \brief End of blocks within the chain. - iterator end() const { return Blocks.end(); } + iterator end() { return Blocks.end(); } /// \brief Merge a block chain into this one. /// @@ -211,12 +211,15 @@ class MachineBlockPlacement : public MachineFunctionPass { void buildChain(MachineBasicBlock *BB, BlockChain &Chain, SmallVectorImpl &BlockWorkList, const BlockFilterSet *BlockFilter = 0); - MachineBasicBlock *findBestLoopTop(MachineFunction &F, - MachineLoop &L, + MachineBasicBlock *findBestLoopTop(MachineLoop &L, const BlockFilterSet &LoopBlockSet); + MachineBasicBlock *findBestLoopExit(MachineFunction &F, + MachineLoop &L, + const BlockFilterSet &LoopBlockSet); void buildLoopChains(MachineFunction &F, MachineLoop &L); + void rotateLoop(BlockChain &LoopChain, MachineBasicBlock *ExitingBB, + const BlockFilterSet &LoopBlockSet); void buildCFGChains(MachineFunction &F); - void AlignLoops(MachineFunction &F); public: static char ID; // Pass identification, replacement for typeid @@ -540,13 +543,74 @@ void MachineBlockPlacement::buildChain( /// \brief Find the best loop top block for layout. /// +/// Look for a block which is strictly better than the loop header for laying +/// out at the top of the loop. This looks for one and only one pattern: +/// a latch block with no conditional exit. This block will cause a conditional +/// jump around it or will be the bottom of the loop if we lay it out in place, +/// but if it it doesn't end up at the bottom of the loop for any reason, +/// rotation alone won't fix it. Because such a block will always result in an +/// unconditional jump (for the backedge) rotating it in front of the loop +/// header is always profitable. +MachineBasicBlock * +MachineBlockPlacement::findBestLoopTop(MachineLoop &L, + const BlockFilterSet &LoopBlockSet) { + // Check that the header hasn't been fused with a preheader block due to + // crazy branches. If it has, we need to start with the header at the top to + // prevent pulling the preheader into the loop body. + BlockChain &HeaderChain = *BlockToChain[L.getHeader()]; + if (!LoopBlockSet.count(*HeaderChain.begin())) + return L.getHeader(); + + DEBUG(dbgs() << "Finding best loop top for: " + << getBlockName(L.getHeader()) << "\n"); + + BlockFrequency BestPredFreq; + MachineBasicBlock *BestPred = 0; + for (MachineBasicBlock::pred_iterator PI = L.getHeader()->pred_begin(), + PE = L.getHeader()->pred_end(); + PI != PE; ++PI) { + MachineBasicBlock *Pred = *PI; + if (!LoopBlockSet.count(Pred)) + continue; + DEBUG(dbgs() << " header pred: " << getBlockName(Pred) << ", " + << Pred->succ_size() << " successors, " + << MBFI->getBlockFreq(Pred) << " freq\n"); + if (Pred->succ_size() > 1) + continue; + + BlockFrequency PredFreq = MBFI->getBlockFreq(Pred); + if (!BestPred || PredFreq > BestPredFreq || + (!(PredFreq < BestPredFreq) && + Pred->isLayoutSuccessor(L.getHeader()))) { + BestPred = Pred; + BestPredFreq = PredFreq; + } + } + + // If no direct predecessor is fine, just use the loop header. + if (!BestPred) + return L.getHeader(); + + // Walk backwards through any straight line of predecessors. + while (BestPred->pred_size() == 1 && + (*BestPred->pred_begin())->succ_size() == 1 && + *BestPred->pred_begin() != L.getHeader()) + BestPred = *BestPred->pred_begin(); + + DEBUG(dbgs() << " final top: " << getBlockName(BestPred) << "\n"); + return BestPred; +} + + +/// \brief Find the best loop exiting block for layout. +/// /// This routine implements the logic to analyze the loop looking for the best /// block to layout at the top of the loop. Typically this is done to maximize /// fallthrough opportunities. MachineBasicBlock * -MachineBlockPlacement::findBestLoopTop(MachineFunction &F, - MachineLoop &L, - const BlockFilterSet &LoopBlockSet) { +MachineBlockPlacement::findBestLoopExit(MachineFunction &F, + MachineLoop &L, + const BlockFilterSet &LoopBlockSet) { // We don't want to layout the loop linearly in all cases. If the loop header // is just a normal basic block in the loop, we want to look for what block // within the loop is the best one to layout at the top. However, if the loop @@ -557,11 +621,11 @@ MachineBlockPlacement::findBestLoopTop(MachineFunction &F, // header and only rotate if safe. BlockChain &HeaderChain = *BlockToChain[L.getHeader()]; if (!LoopBlockSet.count(*HeaderChain.begin())) - return L.getHeader(); + return 0; BlockFrequency BestExitEdgeFreq; + unsigned BestExitLoopDepth = 0; MachineBasicBlock *ExitingBB = 0; - MachineBasicBlock *LoopingBB = 0; // If there are exits to outer loops, loop rotation can severely limit // fallthrough opportunites unless it selects such an exit. Keep a set of // blocks where rotating to exit with that block will reach an outer loop. @@ -584,15 +648,10 @@ MachineBlockPlacement::findBestLoopTop(MachineFunction &F, // successor isn't found. MachineBasicBlock *OldExitingBB = ExitingBB; BlockFrequency OldBestExitEdgeFreq = BestExitEdgeFreq; - // We also compute and store the best looping successor for use in layout. - MachineBasicBlock *BestLoopSucc = 0; + bool HasLoopingSucc = false; // FIXME: Due to the performance of the probability and weight routines in - // the MBPI analysis, we use the internal weights. This is only valid - // because it is purely a ranking function, we don't care about anything - // but the relative values. - uint32_t BestLoopSuccWeight = 0; - // FIXME: We also manually compute the probabilities to avoid quadratic - // behavior. + // the MBPI analysis, we use the internal weights and manually compute the + // probabilities to avoid quadratic behavior. uint32_t WeightScale = 0; uint32_t SumWeight = MBPI->getSumForBlock(*I, WeightScale); for (MachineBasicBlock::succ_iterator SI = (*I)->succ_begin(), @@ -604,10 +663,8 @@ MachineBlockPlacement::findBestLoopTop(MachineFunction &F, continue; BlockChain &SuccChain = *BlockToChain[*SI]; // Don't split chains, either this chain or the successor's chain. - if (&Chain == &SuccChain || *SI != *SuccChain.begin()) { - DEBUG(dbgs() << " " << (LoopBlockSet.count(*SI) ? "looping: " - : "exiting: ") - << getBlockName(*I) << " -> " + if (&Chain == &SuccChain) { + DEBUG(dbgs() << " exiting: " << getBlockName(*I) << " -> " << getBlockName(*SI) << " (chain conflict)\n"); continue; } @@ -616,60 +673,103 @@ MachineBlockPlacement::findBestLoopTop(MachineFunction &F, if (LoopBlockSet.count(*SI)) { DEBUG(dbgs() << " looping: " << getBlockName(*I) << " -> " << getBlockName(*SI) << " (" << SuccWeight << ")\n"); - if (BestLoopSucc && BestLoopSuccWeight >= SuccWeight) - continue; - - BestLoopSucc = *SI; - BestLoopSuccWeight = SuccWeight; + HasLoopingSucc = true; continue; } + unsigned SuccLoopDepth = 0; + if (MachineLoop *ExitLoop = MLI->getLoopFor(*SI)) { + SuccLoopDepth = ExitLoop->getLoopDepth(); + if (ExitLoop->contains(&L)) + BlocksExitingToOuterLoop.insert(*I); + } + BranchProbability SuccProb(SuccWeight / WeightScale, SumWeight); BlockFrequency ExitEdgeFreq = MBFI->getBlockFreq(*I) * SuccProb; DEBUG(dbgs() << " exiting: " << getBlockName(*I) << " -> " - << getBlockName(*SI) << " (" << ExitEdgeFreq << ")\n"); + << getBlockName(*SI) << " [L:" << SuccLoopDepth + << "] (" << ExitEdgeFreq << ")\n"); // Note that we slightly bias this toward an existing layout successor to // retain incoming order in the absence of better information. // FIXME: Should we bias this more strongly? It's pretty weak. - if (!ExitingBB || ExitEdgeFreq > BestExitEdgeFreq || + if (!ExitingBB || BestExitLoopDepth < SuccLoopDepth || + ExitEdgeFreq > BestExitEdgeFreq || ((*I)->isLayoutSuccessor(*SI) && !(ExitEdgeFreq < BestExitEdgeFreq))) { BestExitEdgeFreq = ExitEdgeFreq; ExitingBB = *I; } - - if (MachineLoop *ExitLoop = MLI->getLoopFor(*SI)) - if (ExitLoop->contains(&L)) - BlocksExitingToOuterLoop.insert(*I); } // Restore the old exiting state, no viable looping successor was found. - if (!BestLoopSucc) { + if (!HasLoopingSucc) { ExitingBB = OldExitingBB; BestExitEdgeFreq = OldBestExitEdgeFreq; continue; } - - // If this was best exiting block thus far, also record the looping block. - if (ExitingBB == *I) - LoopingBB = BestLoopSucc; } - // Without a candidate exitting block or with only a single block in the + // Without a candidate exiting block or with only a single block in the // loop, just use the loop header to layout the loop. if (!ExitingBB || L.getNumBlocks() == 1) - return L.getHeader(); + return 0; // Also, if we have exit blocks which lead to outer loops but didn't select // one of them as the exiting block we are rotating toward, disable loop // rotation altogether. if (!BlocksExitingToOuterLoop.empty() && !BlocksExitingToOuterLoop.count(ExitingBB)) - return L.getHeader(); + return 0; - assert(LoopingBB && "All successors of a loop block are exit blocks!"); DEBUG(dbgs() << " Best exiting block: " << getBlockName(ExitingBB) << "\n"); - DEBUG(dbgs() << " Best top block: " << getBlockName(LoopingBB) << "\n"); - return LoopingBB; + return ExitingBB; +} + +/// \brief Attempt to rotate an exiting block to the bottom of the loop. +/// +/// Once we have built a chain, try to rotate it to line up the hot exit block +/// with fallthrough out of the loop if doing so doesn't introduce unnecessary +/// branches. For example, if the loop has fallthrough into its header and out +/// of its bottom already, don't rotate it. +void MachineBlockPlacement::rotateLoop(BlockChain &LoopChain, + MachineBasicBlock *ExitingBB, + const BlockFilterSet &LoopBlockSet) { + if (!ExitingBB) + return; + + MachineBasicBlock *Top = *LoopChain.begin(); + bool ViableTopFallthrough = false; + for (MachineBasicBlock::pred_iterator PI = Top->pred_begin(), + PE = Top->pred_end(); + PI != PE; ++PI) { + BlockChain *PredChain = BlockToChain[*PI]; + if (!LoopBlockSet.count(*PI) && + (!PredChain || *PI == *llvm::prior(PredChain->end()))) { + ViableTopFallthrough = true; + break; + } + } + + // If the header has viable fallthrough, check whether the current loop + // bottom is a viable exiting block. If so, bail out as rotating will + // introduce an unnecessary branch. + if (ViableTopFallthrough) { + MachineBasicBlock *Bottom = *llvm::prior(LoopChain.end()); + for (MachineBasicBlock::succ_iterator SI = Bottom->succ_begin(), + SE = Bottom->succ_end(); + SI != SE; ++SI) { + BlockChain *SuccChain = BlockToChain[*SI]; + if (!LoopBlockSet.count(*SI) && + (!SuccChain || *SI == *SuccChain->begin())) + return; + } + } + + BlockChain::iterator ExitIt = std::find(LoopChain.begin(), LoopChain.end(), + ExitingBB); + if (ExitIt == LoopChain.end()) + return; + + std::rotate(LoopChain.begin(), llvm::next(ExitIt), LoopChain.end()); } /// \brief Forms basic block chains from the natural loop structures. @@ -688,8 +788,20 @@ void MachineBlockPlacement::buildLoopChains(MachineFunction &F, SmallVector BlockWorkList; BlockFilterSet LoopBlockSet(L.block_begin(), L.block_end()); - MachineBasicBlock *LayoutTop = findBestLoopTop(F, L, LoopBlockSet); - BlockChain &LoopChain = *BlockToChain[LayoutTop]; + // First check to see if there is an obviously preferable top block for the + // loop. This will default to the header, but may end up as one of the + // predecessors to the header if there is one which will result in strictly + // fewer branches in the loop body. + MachineBasicBlock *LoopTop = findBestLoopTop(L, LoopBlockSet); + + // If we selected just the header for the loop top, look for a potentially + // profitable exit block in the event that rotating the loop can eliminate + // branches by placing an exit edge at the bottom. + MachineBasicBlock *ExitingBB = 0; + if (LoopTop == L.getHeader()) + ExitingBB = findBestLoopExit(F, L, LoopBlockSet); + + BlockChain &LoopChain = *BlockToChain[LoopTop]; // FIXME: This is a really lame way of walking the chains in the loop: we // walk the blocks, and use a set to prevent visiting a particular chain @@ -721,7 +833,8 @@ void MachineBlockPlacement::buildLoopChains(MachineFunction &F, BlockWorkList.push_back(*Chain.begin()); } - buildChain(LayoutTop, LoopChain, BlockWorkList, &LoopBlockSet); + buildChain(LoopTop, LoopChain, BlockWorkList, &LoopBlockSet); + rotateLoop(LoopChain, ExitingBB, LoopBlockSet); DEBUG({ // Crash at the end so we get all of the debugging output first. @@ -733,7 +846,8 @@ void MachineBlockPlacement::buildLoopChains(MachineFunction &F, << " Chain header: " << getBlockName(*LoopChain.begin()) << "\n"; } for (BlockChain::iterator BCI = LoopChain.begin(), BCE = LoopChain.end(); - BCI != BCE; ++BCI) + BCI != BCE; ++BCI) { + dbgs() << " ... " << getBlockName(*BCI) << "\n"; if (!LoopBlockSet.erase(*BCI)) { // We don't mark the loop as bad here because there are real situations // where this can occur. For example, with an unanalyzable fallthrough @@ -743,6 +857,7 @@ void MachineBlockPlacement::buildLoopChains(MachineFunction &F, << " Chain header: " << getBlockName(*LoopChain.begin()) << "\n" << " Bad block: " << getBlockName(*BCI) << "\n"; } + } if (!LoopBlockSet.empty()) { BadLoop = true; @@ -882,28 +997,33 @@ void MachineBlockPlacement::buildCFGChains(MachineFunction &F) { MachineBasicBlock *TBB = 0, *FBB = 0; // For AnalyzeBranch. if (!TII->AnalyzeBranch(F.back(), TBB, FBB, Cond)) F.back().updateTerminator(); -} -/// \brief Recursive helper to align a loop and any nested loops. -static void AlignLoop(MachineFunction &F, MachineLoop *L, unsigned Align) { - // Recurse through nested loops. - for (MachineLoop::iterator I = L->begin(), E = L->end(); I != E; ++I) - AlignLoop(F, *I, Align); - - L->getTopBlock()->setAlignment(Align); -} - -/// \brief Align loop headers to target preferred alignments. -void MachineBlockPlacement::AlignLoops(MachineFunction &F) { + // Walk through the backedges of the function now that we have fully laid out + // the basic blocks and align the destination of each backedge. We don't rely + // on the loop info here so that we can align backedges in unnatural CFGs and + // backedges that were introduced purely because of the loop rotations done + // during this layout pass. + // FIXME: This isn't quite right, we shouldn't align backedges that result + // from blocks being sunken below the exit block for the function. if (F.getFunction()->hasFnAttr(Attribute::OptimizeForSize)) return; - unsigned Align = TLI->getPrefLoopAlignment(); if (!Align) return; // Don't care about loop alignment. - for (MachineLoopInfo::iterator I = MLI->begin(), E = MLI->end(); I != E; ++I) - AlignLoop(F, *I, Align); + SmallPtrSet PreviousBlocks; + for (BlockChain::iterator BI = FunctionChain.begin(), + BE = FunctionChain.end(); + BI != BE; ++BI) { + PreviousBlocks.insert(*BI); + // Set alignment on the destination of all the back edges in the new + // ordering. + for (MachineBasicBlock::succ_iterator SI = (*BI)->succ_begin(), + SE = (*BI)->succ_end(); + SI != SE; ++SI) + if (PreviousBlocks.count(*SI)) + (*SI)->setAlignment(Align); + } } bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &F) { @@ -919,7 +1039,6 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &F) { assert(BlockToChain.empty()); buildCFGChains(F); - AlignLoops(F); BlockToChain.clear(); ChainAllocator.DestroyAll(); diff --git a/contrib/llvm/lib/CodeGen/Passes.cpp b/contrib/llvm/lib/CodeGen/Passes.cpp index 53d1fcf7377..490547bbb87 100644 --- a/contrib/llvm/lib/CodeGen/Passes.cpp +++ b/contrib/llvm/lib/CodeGen/Passes.cpp @@ -37,8 +37,9 @@ static cl::opt DisableTailDuplicate("disable-tail-duplicate", cl::Hidden, cl::desc("Disable tail duplication")); static cl::opt DisableEarlyTailDup("disable-early-taildup", cl::Hidden, cl::desc("Disable pre-register allocation tail duplication")); -static cl::opt EnableBlockPlacement("enable-block-placement", - cl::Hidden, cl::desc("Enable probability-driven block placement")); +static cl::opt DisableBlockPlacement("disable-block-placement", + cl::Hidden, cl::desc("Disable the probability-driven block placement, and " + "re-enable the old code placement pass")); static cl::opt EnableBlockPlacementStats("enable-block-placement-stats", cl::Hidden, cl::desc("Collect probability-driven block placement stats")); static cl::opt DisableCodePlace("disable-code-place", cl::Hidden, @@ -206,7 +207,7 @@ TargetPassConfig::~TargetPassConfig() { // Out of line constructor provides default values for pass options and // registers all common codegen passes. TargetPassConfig::TargetPassConfig(TargetMachine *tm, PassManagerBase &pm) - : ImmutablePass(ID), TM(tm), PM(pm), Impl(0), Initialized(false), + : ImmutablePass(ID), TM(tm), PM(&pm), Impl(0), Initialized(false), DisableVerify(false), EnableTailMerge(true) { @@ -233,7 +234,7 @@ TargetPassConfig *LLVMTargetMachine::createPassConfig(PassManagerBase &PM) { } TargetPassConfig::TargetPassConfig() - : ImmutablePass(ID), PM(*(PassManagerBase*)0) { + : ImmutablePass(ID), PM(0) { llvm_unreachable("TargetPassConfig should not be constructed on-the-fly"); } @@ -268,16 +269,16 @@ AnalysisID TargetPassConfig::addPass(char &ID) { Pass *P = Pass::createPass(FinalID); if (!P) llvm_unreachable("Pass ID not registered"); - PM.add(P); + PM->add(P); return FinalID; } void TargetPassConfig::printAndVerify(const char *Banner) const { if (TM->shouldPrintMachineCode()) - PM.add(createMachineFunctionPrinterPass(dbgs(), Banner)); + PM->add(createMachineFunctionPrinterPass(dbgs(), Banner)); if (VerifyMachineCode) - PM.add(createMachineVerifierPass(Banner)); + PM->add(createMachineVerifierPass(Banner)); } /// Add common target configurable passes that perform LLVM IR to IR transforms @@ -287,46 +288,46 @@ void TargetPassConfig::addIRPasses() { // Add TypeBasedAliasAnalysis before BasicAliasAnalysis so that // BasicAliasAnalysis wins if they disagree. This is intended to help // support "obvious" type-punning idioms. - PM.add(createTypeBasedAliasAnalysisPass()); - PM.add(createBasicAliasAnalysisPass()); + PM->add(createTypeBasedAliasAnalysisPass()); + PM->add(createBasicAliasAnalysisPass()); // Before running any passes, run the verifier to determine if the input // coming from the front-end and/or optimizer is valid. if (!DisableVerify) - PM.add(createVerifierPass()); + PM->add(createVerifierPass()); // Run loop strength reduction before anything else. if (getOptLevel() != CodeGenOpt::None && !DisableLSR) { - PM.add(createLoopStrengthReducePass(getTargetLowering())); + PM->add(createLoopStrengthReducePass(getTargetLowering())); if (PrintLSR) - PM.add(createPrintFunctionPass("\n\n*** Code after LSR ***\n", &dbgs())); + PM->add(createPrintFunctionPass("\n\n*** Code after LSR ***\n", &dbgs())); } - PM.add(createGCLoweringPass()); + PM->add(createGCLoweringPass()); // Make sure that no unreachable blocks are instruction selected. - PM.add(createUnreachableBlockEliminationPass()); + PM->add(createUnreachableBlockEliminationPass()); } /// Add common passes that perform LLVM IR to IR transforms in preparation for /// instruction selection. void TargetPassConfig::addISelPrepare() { if (getOptLevel() != CodeGenOpt::None && !DisableCGP) - PM.add(createCodeGenPreparePass(getTargetLowering())); + PM->add(createCodeGenPreparePass(getTargetLowering())); - PM.add(createStackProtectorPass(getTargetLowering())); + PM->add(createStackProtectorPass(getTargetLowering())); addPreISel(); if (PrintISelInput) - PM.add(createPrintFunctionPass("\n\n" - "*** Final LLVM Code input to ISel ***\n", - &dbgs())); + PM->add(createPrintFunctionPass("\n\n" + "*** Final LLVM Code input to ISel ***\n", + &dbgs())); // All passes which modify the LLVM IR are now complete; run the verifier // to ensure that the IR is valid. if (!DisableVerify) - PM.add(createVerifierPass()); + PM->add(createVerifierPass()); } /// Add the complete set of target-independent postISel code generator passes. @@ -404,7 +405,7 @@ void TargetPassConfig::addMachinePasses() { // GC addPass(GCMachineCodeAnalysisID); if (PrintGCInfo) - PM.add(createGCInfoPrinter(dbgs())); + PM->add(createGCInfoPrinter(dbgs())); // Basic block placement. if (getOptLevel() != CodeGenOpt::None) @@ -521,7 +522,7 @@ void TargetPassConfig::addFastRegAlloc(FunctionPass *RegAllocPass) { addPass(PHIEliminationID); addPass(TwoAddressInstructionPassID); - PM.add(RegAllocPass); + PM->add(RegAllocPass); printAndVerify("After Register Allocation"); } @@ -563,7 +564,7 @@ void TargetPassConfig::addOptimizedRegAlloc(FunctionPass *RegAllocPass) { printAndVerify("After Machine Scheduling"); // Add the selected register allocation pass. - PM.add(RegAllocPass); + PM->add(RegAllocPass); printAndVerify("After Register Allocation"); // FinalizeRegAlloc is convenient until MachineInstrBundles is more mature, @@ -610,10 +611,10 @@ void TargetPassConfig::addMachineLateOptimization() { /// Add standard basic block placement passes. void TargetPassConfig::addBlockPlacement() { AnalysisID ID = &NoPassID; - if (EnableBlockPlacement) { - // MachineBlockPlacement is an experimental pass which is disabled by - // default currently. Eventually it should subsume CodePlacementOpt, so - // when enabled, the other is disabled. + if (!DisableBlockPlacement) { + // MachineBlockPlacement is a new pass which subsumes the functionality of + // CodPlacementOpt. The old code placement pass can be restored by + // disabling block placement, but eventually it will be removed. ID = addPass(MachineBlockPlacementID); } else { ID = addPass(CodePlacementOptID); diff --git a/contrib/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp b/contrib/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp index 6be1ab7f5b0..d46eb896e54 100644 --- a/contrib/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp +++ b/contrib/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp @@ -39,8 +39,8 @@ ScheduleDAGInstrs::ScheduleDAGInstrs(MachineFunction &mf, LiveIntervals *lis) : ScheduleDAG(mf), MLI(mli), MDT(mdt), MFI(mf.getFrameInfo()), InstrItins(mf.getTarget().getInstrItineraryData()), LIS(lis), - IsPostRA(IsPostRAFlag), UnitLatencies(false), LoopRegs(MLI, MDT), - FirstDbgValue(0) { + IsPostRA(IsPostRAFlag), UnitLatencies(false), CanHandleTerminators(false), + LoopRegs(MLI, MDT), FirstDbgValue(0) { assert((IsPostRA || LIS) && "PreRA scheduling requires LiveIntervals"); DbgValues.clear(); assert(!(IsPostRA && MRI.getNumVirtRegs()) && @@ -554,7 +554,7 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA) { continue; } - assert(!MI->isTerminator() && !MI->isLabel() && + assert((!MI->isTerminator() || CanHandleTerminators) && !MI->isLabel() && "Cannot schedule terminators or labels!"); SUnit *SU = MISUnitMap[MI]; diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index d1b998f8d84..0914c662766 100644 --- a/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -1080,6 +1080,7 @@ void DAGCombiner::Run(CombineLevel AtLevel) { // If the root changed (e.g. it was a dead load, update the root). DAG.setRoot(Dummy.getValue()); + DAG.RemoveDeadNodes(); } SDValue DAGCombiner::visit(SDNode *N) { diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp index 3ae8345bd19..9fe4480d113 100644 --- a/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp +++ b/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp @@ -417,7 +417,8 @@ SDValue VectorLegalizer::ExpandVSELECT(SDValue Op) { Op1 = DAG.getNode(ISD::AND, DL, VT, Op1, Mask); Op2 = DAG.getNode(ISD::AND, DL, VT, Op2, NotMask); - return DAG.getNode(ISD::OR, DL, VT, Op1, Op2); + SDValue Val = DAG.getNode(ISD::OR, DL, VT, Op1, Op2); + return DAG.getNode(ISD::BITCAST, DL, Op.getValueType(), Val); } SDValue VectorLegalizer::ExpandUINT_TO_FLOAT(SDValue Op) { diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp index 69dd813b24e..748668cdf67 100644 --- a/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp +++ b/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp @@ -131,28 +131,16 @@ static void CheckForPhysRegDependency(SDNode *Def, SDNode *User, unsigned Op, } } -static void AddGlue(SDNode *N, SDValue Glue, bool AddGlue, SelectionDAG *DAG) { - SmallVector VTs; - SDNode *GlueDestNode = Glue.getNode(); - - // Don't add glue from a node to itself. - if (GlueDestNode == N) return; - - // Don't add glue to something which already has glue. - if (N->getValueType(N->getNumValues() - 1) == MVT::Glue) return; - - for (unsigned I = 0, E = N->getNumValues(); I != E; ++I) - VTs.push_back(N->getValueType(I)); - - if (AddGlue) - VTs.push_back(MVT::Glue); - +// Helper for AddGlue to clone node operands. +static void CloneNodeWithValues(SDNode *N, SelectionDAG *DAG, + SmallVectorImpl &VTs, + SDValue ExtraOper = SDValue()) { SmallVector Ops; for (unsigned I = 0, E = N->getNumOperands(); I != E; ++I) Ops.push_back(N->getOperand(I)); - if (GlueDestNode) - Ops.push_back(Glue); + if (ExtraOper.getNode()) + Ops.push_back(ExtraOper); SDVTList VTList = DAG->getVTList(&VTs[0], VTs.size()); MachineSDNode::mmo_iterator Begin = 0, End = 0; @@ -171,6 +159,46 @@ static void AddGlue(SDNode *N, SDValue Glue, bool AddGlue, SelectionDAG *DAG) { MN->setMemRefs(Begin, End); } +static bool AddGlue(SDNode *N, SDValue Glue, bool AddGlue, SelectionDAG *DAG) { + SmallVector VTs; + SDNode *GlueDestNode = Glue.getNode(); + + // Don't add glue from a node to itself. + if (GlueDestNode == N) return false; + + // Don't add a glue operand to something that already uses glue. + if (GlueDestNode && + N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Glue) { + return false; + } + // Don't add glue to something that already has a glue value. + if (N->getValueType(N->getNumValues() - 1) == MVT::Glue) return false; + + for (unsigned I = 0, E = N->getNumValues(); I != E; ++I) + VTs.push_back(N->getValueType(I)); + + if (AddGlue) + VTs.push_back(MVT::Glue); + + CloneNodeWithValues(N, DAG, VTs, Glue); + + return true; +} + +// Cleanup after unsuccessful AddGlue. Use the standard method of morphing the +// node even though simply shrinking the value list is sufficient. +static void RemoveUnusedGlue(SDNode *N, SelectionDAG *DAG) { + assert((N->getValueType(N->getNumValues() - 1) == MVT::Glue && + !N->hasAnyUseOfValue(N->getNumValues() - 1)) && + "expected an unused glue value"); + + SmallVector VTs; + for (unsigned I = 0, E = N->getNumValues()-1; I != E; ++I) + VTs.push_back(N->getValueType(I)); + + CloneNodeWithValues(N, DAG, VTs); +} + /// ClusterNeighboringLoads - Force nearby loads together by "gluing" them. /// This function finds loads of the same base and different offsets. If the /// offsets are not far apart (target specific), it add MVT::Glue inputs and @@ -238,19 +266,23 @@ void ScheduleDAGSDNodes::ClusterNeighboringLoads(SDNode *Node) { // Cluster loads by adding MVT::Glue outputs and inputs. This also // ensure they are scheduled in order of increasing addresses. SDNode *Lead = Loads[0]; - AddGlue(Lead, SDValue(0, 0), true, DAG); - - SDValue InGlue = SDValue(Lead, Lead->getNumValues() - 1); + SDValue InGlue = SDValue(0, 0); + if (AddGlue(Lead, InGlue, true, DAG)) + InGlue = SDValue(Lead, Lead->getNumValues() - 1); for (unsigned I = 1, E = Loads.size(); I != E; ++I) { bool OutGlue = I < E - 1; SDNode *Load = Loads[I]; - AddGlue(Load, InGlue, OutGlue, DAG); + // If AddGlue fails, we could leave an unsused glue value. This should not + // cause any + if (AddGlue(Load, InGlue, OutGlue, DAG)) { + if (OutGlue) + InGlue = SDValue(Load, Load->getNumValues() - 1); - if (OutGlue) - InGlue = SDValue(Load, Load->getNumValues() - 1); - - ++LoadsClustered; + ++LoadsClustered; + } + else if (!OutGlue && InGlue.getNode()) + RemoveUnusedGlue(InGlue.getNode(), DAG); } } diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 94cb95804f6..f1e879be956 100644 --- a/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -5050,7 +5050,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) { } case Intrinsic::gcroot: if (GFI) { - const Value *Alloca = I.getArgOperand(0); + const Value *Alloca = I.getArgOperand(0)->stripPointerCasts(); const Constant *TypeMap = cast(I.getArgOperand(1)); FrameIndexSDNode *FI = cast(getValue(Alloca).getNode()); diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 09a2b1f3d7a..e341e15e41a 100644 --- a/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -1367,8 +1367,9 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op, // bits on that side are also known to be set on the other side, turn this // into an AND, as we know the bits will be cleared. // e.g. (X | C1) ^ C2 --> (X | C1) & ~C2 iff (C1&C2) == C2 - if ((NewMask & (KnownZero|KnownOne)) == NewMask) { // all known - if ((KnownOne & KnownOne2) == KnownOne) { + // NB: it is okay if more bits are known than are requested + if ((NewMask & (KnownZero|KnownOne)) == NewMask) { // all known on one side + if (KnownOne == KnownOne2) { // set bits are the same on both sides EVT VT = Op.getValueType(); SDValue ANDC = TLO.DAG.getConstant(~KnownOne & NewMask, VT); return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::AND, dl, VT, diff --git a/contrib/llvm/lib/CodeGen/SlotIndexes.cpp b/contrib/llvm/lib/CodeGen/SlotIndexes.cpp index c5bd3a3cae6..26cf2594416 100644 --- a/contrib/llvm/lib/CodeGen/SlotIndexes.cpp +++ b/contrib/llvm/lib/CodeGen/SlotIndexes.cpp @@ -34,7 +34,8 @@ void SlotIndexes::releaseMemory() { mi2iMap.clear(); MBBRanges.clear(); idx2MBBMap.clear(); - clearList(); + indexList.clear(); + ileAllocator.Reset(); } bool SlotIndexes::runOnMachineFunction(MachineFunction &fn) { @@ -45,17 +46,15 @@ bool SlotIndexes::runOnMachineFunction(MachineFunction &fn) { // iterator in lock-step (though skipping it over indexes which have // null pointers in the instruction field). // At each iteration assert that the instruction pointed to in the index - // is the same one pointed to by the MI iterator. This + // is the same one pointed to by the MI iterator. This // FIXME: This can be simplified. The mi2iMap_, Idx2MBBMap, etc. should // only need to be set up once after the first numbering is computed. mf = &fn; - initList(); // Check that the list contains only the sentinal. - assert(indexListHead->getNext() == 0 && - "Index list non-empty at initial numbering?"); + assert(indexList.empty() && "Index list non-empty at initial numbering?"); assert(idx2MBBMap.empty() && "Index -> MBB mapping non-empty at initial numbering?"); assert(MBBRanges.empty() && @@ -68,7 +67,7 @@ bool SlotIndexes::runOnMachineFunction(MachineFunction &fn) { MBBRanges.resize(mf->getNumBlockIDs()); idx2MBBMap.reserve(mf->size()); - push_back(createEntry(0, index)); + indexList.push_back(createEntry(0, index)); // Iterate over the function. for (MachineFunction::iterator mbbItr = mf->begin(), mbbEnd = mf->end(); @@ -76,7 +75,7 @@ bool SlotIndexes::runOnMachineFunction(MachineFunction &fn) { MachineBasicBlock *mbb = &*mbbItr; // Insert an index for the MBB start. - SlotIndex blockStartIndex(back(), SlotIndex::Slot_Block); + SlotIndex blockStartIndex(&indexList.back(), SlotIndex::Slot_Block); for (MachineBasicBlock::iterator miItr = mbb->begin(), miEnd = mbb->end(); miItr != miEnd; ++miItr) { @@ -85,20 +84,20 @@ bool SlotIndexes::runOnMachineFunction(MachineFunction &fn) { continue; // Insert a store index for the instr. - push_back(createEntry(mi, index += SlotIndex::InstrDist)); + indexList.push_back(createEntry(mi, index += SlotIndex::InstrDist)); // Save this base index in the maps. - mi2iMap.insert(std::make_pair(mi, SlotIndex(back(), + mi2iMap.insert(std::make_pair(mi, SlotIndex(&indexList.back(), SlotIndex::Slot_Block))); - + ++functionSize; } // We insert one blank instructions between basic blocks. - push_back(createEntry(0, index += SlotIndex::InstrDist)); + indexList.push_back(createEntry(0, index += SlotIndex::InstrDist)); MBBRanges[mbb->getNumber()].first = blockStartIndex; - MBBRanges[mbb->getNumber()].second = SlotIndex(back(), + MBBRanges[mbb->getNumber()].second = SlotIndex(&indexList.back(), SlotIndex::Slot_Block); idx2MBBMap.push_back(IdxMBBPair(blockStartIndex, mbb)); } @@ -119,38 +118,37 @@ void SlotIndexes::renumberIndexes() { unsigned index = 0; - for (IndexListEntry *curEntry = front(); curEntry != getTail(); - curEntry = curEntry->getNext()) { - curEntry->setIndex(index); + for (IndexList::iterator I = indexList.begin(), E = indexList.end(); + I != E; ++I) { + I->setIndex(index); index += SlotIndex::InstrDist; } } -// Renumber indexes locally after curEntry was inserted, but failed to get a new +// Renumber indexes locally after curItr was inserted, but failed to get a new // index. -void SlotIndexes::renumberIndexes(IndexListEntry *curEntry) { +void SlotIndexes::renumberIndexes(IndexList::iterator curItr) { // Number indexes with half the default spacing so we can catch up quickly. const unsigned Space = SlotIndex::InstrDist/2; assert((Space & 3) == 0 && "InstrDist must be a multiple of 2*NUM"); - IndexListEntry *start = curEntry->getPrev(); - unsigned index = start->getIndex(); - IndexListEntry *tail = getTail(); + IndexList::iterator startItr = prior(curItr); + unsigned index = startItr->getIndex(); do { - curEntry->setIndex(index += Space); - curEntry = curEntry->getNext(); + curItr->setIndex(index += Space); + ++curItr; // If the next index is bigger, we have caught up. - } while (curEntry != tail && curEntry->getIndex() <= index); + } while (curItr != indexList.end() && curItr->getIndex() <= index); - DEBUG(dbgs() << "\n*** Renumbered SlotIndexes " << start->getIndex() << '-' + DEBUG(dbgs() << "\n*** Renumbered SlotIndexes " << startItr->getIndex() << '-' << index << " ***\n"); ++NumLocalRenum; } void SlotIndexes::dump() const { - for (const IndexListEntry *itr = front(); itr != getTail(); - itr = itr->getNext()) { + for (IndexList::const_iterator itr = indexList.begin(); + itr != indexList.end(); ++itr) { dbgs() << itr->getIndex() << " "; if (itr->getInstr() != 0) { @@ -168,7 +166,7 @@ void SlotIndexes::dump() const { // Print a SlotIndex to a raw_ostream. void SlotIndex::print(raw_ostream &os) const { if (isValid()) - os << entry().getIndex() << "Berd"[getSlot()]; + os << listEntry()->getIndex() << "Berd"[getSlot()]; else os << "invalid"; } diff --git a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/GDBRegistrar.cpp b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/GDBRegistrar.cpp new file mode 100644 index 00000000000..8b501014224 --- /dev/null +++ b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/GDBRegistrar.cpp @@ -0,0 +1,214 @@ +//===-- GDBRegistrar.cpp - Registers objects with GDB ---------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "JITRegistrar.h" +#include "llvm/ADT/DenseMap.h" +#include "llvm/Support/MutexGuard.h" +#include "llvm/Support/Mutex.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/Compiler.h" + +using namespace llvm; + +// This must be kept in sync with gdb/gdb/jit.h . +extern "C" { + + typedef enum { + JIT_NOACTION = 0, + JIT_REGISTER_FN, + JIT_UNREGISTER_FN + } jit_actions_t; + + struct jit_code_entry { + struct jit_code_entry *next_entry; + struct jit_code_entry *prev_entry; + const char *symfile_addr; + uint64_t symfile_size; + }; + + struct jit_descriptor { + uint32_t version; + // This should be jit_actions_t, but we want to be specific about the + // bit-width. + uint32_t action_flag; + struct jit_code_entry *relevant_entry; + struct jit_code_entry *first_entry; + }; + + // We put information about the JITed function in this global, which the + // debugger reads. Make sure to specify the version statically, because the + // debugger checks the version before we can set it during runtime. + static struct jit_descriptor __jit_debug_descriptor = { 1, 0, 0, 0 }; + + // Debuggers puts a breakpoint in this function. + LLVM_ATTRIBUTE_NOINLINE void __jit_debug_register_code() { } + +} + +namespace { + +// Buffer for an in-memory object file in executable memory +typedef llvm::DenseMap< const char*, + std::pair > + RegisteredObjectBufferMap; + +/// Global access point for the JIT debugging interface designed for use with a +/// singleton toolbox. Handles thread-safe registration and deregistration of +/// object files that are in executable memory managed by the client of this +/// class. +class GDBJITRegistrar : public JITRegistrar { + /// A map of in-memory object files that have been registered with the + /// JIT interface. + RegisteredObjectBufferMap ObjectBufferMap; + +public: + /// Instantiates the JIT service. + GDBJITRegistrar() : ObjectBufferMap() {} + + /// Unregisters each object that was previously registered and releases all + /// internal resources. + virtual ~GDBJITRegistrar(); + + /// Creates an entry in the JIT registry for the buffer @p Object, + /// which must contain an object file in executable memory with any + /// debug information for the debugger. + void registerObject(const MemoryBuffer &Object); + + /// Removes the internal registration of @p Object, and + /// frees associated resources. + /// Returns true if @p Object was found in ObjectBufferMap. + bool deregisterObject(const MemoryBuffer &Object); + +private: + /// Deregister the debug info for the given object file from the debugger + /// and delete any temporary copies. This private method does not remove + /// the function from Map so that it can be called while iterating over Map. + void deregisterObjectInternal(RegisteredObjectBufferMap::iterator I); +}; + +/// Lock used to serialize all jit registration events, since they +/// modify global variables. +llvm::sys::Mutex JITDebugLock; + +/// Acquire the lock and do the registration. +void NotifyDebugger(jit_code_entry* JITCodeEntry) { + llvm::MutexGuard locked(JITDebugLock); + __jit_debug_descriptor.action_flag = JIT_REGISTER_FN; + + // Insert this entry at the head of the list. + JITCodeEntry->prev_entry = NULL; + jit_code_entry* NextEntry = __jit_debug_descriptor.first_entry; + JITCodeEntry->next_entry = NextEntry; + if (NextEntry != NULL) { + NextEntry->prev_entry = JITCodeEntry; + } + __jit_debug_descriptor.first_entry = JITCodeEntry; + __jit_debug_descriptor.relevant_entry = JITCodeEntry; + __jit_debug_register_code(); +} + +GDBJITRegistrar::~GDBJITRegistrar() { + // Free all registered object files. + for (RegisteredObjectBufferMap::iterator I = ObjectBufferMap.begin(), E = ObjectBufferMap.end(); + I != E; ++I) { + // Call the private method that doesn't update the map so our iterator + // doesn't break. + deregisterObjectInternal(I); + } + ObjectBufferMap.clear(); +} + +void GDBJITRegistrar::registerObject(const MemoryBuffer &Object) { + + const char *Buffer = Object.getBufferStart(); + size_t Size = Object.getBufferSize(); + + assert(Buffer && "Attempt to register a null object with a debugger."); + assert(ObjectBufferMap.find(Buffer) == ObjectBufferMap.end() && + "Second attempt to perform debug registration."); + jit_code_entry* JITCodeEntry = new jit_code_entry(); + + if (JITCodeEntry == 0) { + llvm::report_fatal_error( + "Allocation failed when registering a JIT entry!\n"); + } + else { + JITCodeEntry->symfile_addr = Buffer; + JITCodeEntry->symfile_size = Size; + + ObjectBufferMap[Buffer] = std::make_pair(Size, JITCodeEntry); + NotifyDebugger(JITCodeEntry); + } +} + +bool GDBJITRegistrar::deregisterObject(const MemoryBuffer& Object) { + const char *Buffer = Object.getBufferStart(); + RegisteredObjectBufferMap::iterator I = ObjectBufferMap.find(Buffer); + + if (I != ObjectBufferMap.end()) { + deregisterObjectInternal(I); + ObjectBufferMap.erase(I); + return true; + } + return false; +} + +void GDBJITRegistrar::deregisterObjectInternal( + RegisteredObjectBufferMap::iterator I) { + + jit_code_entry*& JITCodeEntry = I->second.second; + + // Acquire the lock and do the unregistration. + { + llvm::MutexGuard locked(JITDebugLock); + __jit_debug_descriptor.action_flag = JIT_UNREGISTER_FN; + + // Remove the jit_code_entry from the linked list. + jit_code_entry* PrevEntry = JITCodeEntry->prev_entry; + jit_code_entry* NextEntry = JITCodeEntry->next_entry; + + if (NextEntry) { + NextEntry->prev_entry = PrevEntry; + } + if (PrevEntry) { + PrevEntry->next_entry = NextEntry; + } + else { + assert(__jit_debug_descriptor.first_entry == JITCodeEntry); + __jit_debug_descriptor.first_entry = NextEntry; + } + + // Tell the debugger which entry we removed, and unregister the code. + __jit_debug_descriptor.relevant_entry = JITCodeEntry; + __jit_debug_register_code(); + } + + delete JITCodeEntry; + JITCodeEntry = NULL; +} + +} // end namespace + +namespace llvm { + +JITRegistrar& JITRegistrar::getGDBRegistrar() { + static GDBJITRegistrar* sRegistrar = NULL; + if (sRegistrar == NULL) { + // The mutex is here so that it won't slow down access once the registrar + // is instantiated + llvm::MutexGuard locked(JITDebugLock); + // Check again to be sure another thread didn't create this while we waited + if (sRegistrar == NULL) { + sRegistrar = new GDBJITRegistrar; + } + } + return *sRegistrar; +} + +} // namespace llvm diff --git a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/JITRegistrar.h b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/JITRegistrar.h new file mode 100644 index 00000000000..f964bc61829 --- /dev/null +++ b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/JITRegistrar.h @@ -0,0 +1,43 @@ +//===-- JITRegistrar.h - Registers objects with a debugger ----------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_EXECUTION_ENGINE_JIT_REGISTRAR_H +#define LLVM_EXECUTION_ENGINE_JIT_REGISTRAR_H + +#include "llvm/Support/MemoryBuffer.h" + +namespace llvm { + +/// Global access point for the JIT debugging interface. +class JITRegistrar { +public: + /// Instantiates the JIT service. + JITRegistrar() {} + + /// Unregisters each object that was previously registered and releases all + /// internal resources. + virtual ~JITRegistrar() {} + + /// Creates an entry in the JIT registry for the buffer @p Object, + /// which must contain an object file in executable memory with any + /// debug information for the debugger. + virtual void registerObject(const MemoryBuffer &Object) = 0; + + /// Removes the internal registration of @p Object, and + /// frees associated resources. + /// Returns true if @p Object was previously registered. + virtual bool deregisterObject(const MemoryBuffer &Object) = 0; + + /// Returns a reference to a GDB JIT registrar singleton + static JITRegistrar& getGDBRegistrar(); +}; + +} // end namespace llvm + +#endif // LLVM_EXECUTION_ENGINE_JIT_REGISTRAR_H diff --git a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/ObjectImage.h b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/ObjectImage.h new file mode 100644 index 00000000000..8206eadbd25 --- /dev/null +++ b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/ObjectImage.h @@ -0,0 +1,59 @@ +//===---- ObjectImage.h - Format independent executuable object image -----===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file declares a file format independent ObjectImage class. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_RUNTIMEDYLD_OBJECT_IMAGE_H +#define LLVM_RUNTIMEDYLD_OBJECT_IMAGE_H + +#include "llvm/Object/ObjectFile.h" + +namespace llvm { + +class ObjectImage { + ObjectImage(); // = delete + ObjectImage(const ObjectImage &other); // = delete +protected: + object::ObjectFile *ObjFile; + +public: + ObjectImage(object::ObjectFile *Obj) { ObjFile = Obj; } + virtual ~ObjectImage() {} + + virtual object::symbol_iterator begin_symbols() const + { return ObjFile->begin_symbols(); } + virtual object::symbol_iterator end_symbols() const + { return ObjFile->end_symbols(); } + + virtual object::section_iterator begin_sections() const + { return ObjFile->begin_sections(); } + virtual object::section_iterator end_sections() const + { return ObjFile->end_sections(); } + + virtual /* Triple::ArchType */ unsigned getArch() const + { return ObjFile->getArch(); } + + // Subclasses can override these methods to update the image with loaded + // addresses for sections and common symbols + virtual void updateSectionAddress(const object::SectionRef &Sec, + uint64_t Addr) {} + virtual void updateSymbolAddress(const object::SymbolRef &Sym, uint64_t Addr) + {} + + // Subclasses can override this method to provide JIT debugging support + virtual void registerWithDebugger() {} + virtual void deregisterWithDebugger() {} +}; + +} // end namespace llvm + +#endif // LLVM_RUNTIMEDYLD_OBJECT_IMAGE_H + diff --git a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index 63cec1aca3b..1b1840ae066 100644 --- a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -59,11 +59,17 @@ void RuntimeDyldImpl::mapSectionAddress(void *LocalAddress, llvm_unreachable("Attempting to remap address of unknown section!"); } +// Subclasses can implement this method to create specialized image instances +// The caller owns the the pointer that is returned. +ObjectImage *RuntimeDyldImpl::createObjectImage(const MemoryBuffer *InputBuffer) { + ObjectFile *ObjFile = ObjectFile::createObjectFile(const_cast + (InputBuffer)); + ObjectImage *Obj = new ObjectImage(ObjFile); + return Obj; +} + bool RuntimeDyldImpl::loadObject(const MemoryBuffer *InputBuffer) { - // FIXME: ObjectFile don't modify MemoryBuffer. - // It should use const MemoryBuffer as parameter. - OwningPtr obj(ObjectFile::createObjectFile( - const_cast(InputBuffer))); + OwningPtr obj(createObjectImage(InputBuffer)); if (!obj) report_fatal_error("Unable to create object image from memory buffer!"); @@ -110,7 +116,8 @@ bool RuntimeDyldImpl::loadObject(const MemoryBuffer *InputBuffer) { (uintptr_t)FileOffset; uintptr_t SectOffset = (uintptr_t)(SymPtr - (const uint8_t*)sData.begin()); unsigned SectionID = - findOrEmitSection(*si, + findOrEmitSection(*obj, + *si, SymType == object::SymbolRef::ST_Function, LocalSections); bool isGlobal = flags & SymbolRef::SF_Global; @@ -128,7 +135,7 @@ bool RuntimeDyldImpl::loadObject(const MemoryBuffer *InputBuffer) { // Allocate common symbols if (CommonSize != 0) - emitCommonSymbols(CommonSymbols, CommonSize, LocalSymbols); + emitCommonSymbols(*obj, CommonSymbols, CommonSize, LocalSymbols); // Parse and proccess relocations DEBUG(dbgs() << "Parse relocations:\n"); @@ -145,7 +152,7 @@ bool RuntimeDyldImpl::loadObject(const MemoryBuffer *InputBuffer) { // If it's first relocation in this section, find its SectionID if (isFirstRelocation) { - SectionID = findOrEmitSection(*si, true, LocalSections); + SectionID = findOrEmitSection(*obj, *si, true, LocalSections); DEBUG(dbgs() << "\tSectionID: " << SectionID << "\n"); isFirstRelocation = false; } @@ -164,10 +171,14 @@ bool RuntimeDyldImpl::loadObject(const MemoryBuffer *InputBuffer) { processRelocationRef(RI, *obj, LocalSections, LocalSymbols, Stubs); } } + + handleObjectLoaded(obj.take()); + return false; } -unsigned RuntimeDyldImpl::emitCommonSymbols(const CommonSymbolMap &Map, +unsigned RuntimeDyldImpl::emitCommonSymbols(ObjectImage &Obj, + const CommonSymbolMap &Map, uint64_t TotalSize, LocalSymbolMap &LocalSymbols) { // Allocate memory for the section @@ -191,6 +202,7 @@ unsigned RuntimeDyldImpl::emitCommonSymbols(const CommonSymbolMap &Map, uint64_t Size = it->second; StringRef Name; it->first.getName(Name); + Obj.updateSymbolAddress(it->first, (uint64_t)Addr); LocalSymbols[Name.data()] = SymbolLoc(SectionID, Offset); Offset += Size; Addr += Size; @@ -199,7 +211,8 @@ unsigned RuntimeDyldImpl::emitCommonSymbols(const CommonSymbolMap &Map, return SectionID; } -unsigned RuntimeDyldImpl::emitSection(const SectionRef &Section, +unsigned RuntimeDyldImpl::emitSection(ObjectImage &Obj, + const SectionRef &Section, bool IsCode) { unsigned StubBufSize = 0, @@ -257,6 +270,7 @@ unsigned RuntimeDyldImpl::emitSection(const SectionRef &Section, << " StubBufSize: " << StubBufSize << " Allocate: " << Allocate << "\n"); + Obj.updateSectionAddress(Section, (uint64_t)Addr); } else { // Even if we didn't load the section, we need to record an entry for it @@ -277,7 +291,8 @@ unsigned RuntimeDyldImpl::emitSection(const SectionRef &Section, return SectionID; } -unsigned RuntimeDyldImpl::findOrEmitSection(const SectionRef &Section, +unsigned RuntimeDyldImpl::findOrEmitSection(ObjectImage &Obj, + const SectionRef &Section, bool IsCode, ObjSectionToIDMap &LocalSections) { @@ -286,7 +301,7 @@ unsigned RuntimeDyldImpl::findOrEmitSection(const SectionRef &Section, if (i != LocalSections.end()) SectionID = i->second; else { - SectionID = emitSection(Section, IsCode); + SectionID = emitSection(Obj, Section, IsCode); LocalSections[Section] = SectionID; } return SectionID; diff --git a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp index 57fefee5ded..db6da8c8ef2 100644 --- a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp +++ b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp @@ -20,11 +20,176 @@ #include "llvm/Object/ObjectFile.h" #include "llvm/Support/ELF.h" #include "llvm/ADT/Triple.h" +#include "llvm/Object/ELF.h" +#include "JITRegistrar.h" using namespace llvm; using namespace llvm::object; +namespace { + +template +class DyldELFObject : public ELFObjectFile { + LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits) + + typedef Elf_Shdr_Impl Elf_Shdr; + typedef Elf_Sym_Impl Elf_Sym; + typedef Elf_Rel_Impl Elf_Rel; + typedef Elf_Rel_Impl Elf_Rela; + + typedef typename ELFObjectFile:: + Elf_Ehdr Elf_Ehdr; + + typedef typename ELFDataTypeTypedefHelper< + target_endianness, is64Bits>::value_type addr_type; + +protected: + // This duplicates the 'Data' member in the 'Binary' base class + // but it is necessary to workaround a bug in gcc 4.2 + MemoryBuffer *InputData; + +public: + DyldELFObject(MemoryBuffer *Object, error_code &ec); + + void updateSectionAddress(const SectionRef &Sec, uint64_t Addr); + void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr); + + const MemoryBuffer& getBuffer() const { return *InputData; } + + // Methods for type inquiry through isa, cast, and dyn_cast + static inline bool classof(const Binary *v) { + return (isa >(v) + && classof(cast >(v))); + } + static inline bool classof( + const ELFObjectFile *v) { + return v->isDyldType(); + } + static inline bool classof(const DyldELFObject *v) { + return true; + } +}; + +template +class ELFObjectImage : public ObjectImage { + protected: + DyldELFObject *DyldObj; + bool Registered; + + public: + ELFObjectImage(DyldELFObject *Obj) + : ObjectImage(Obj), + DyldObj(Obj), + Registered(false) {} + + virtual ~ELFObjectImage() { + if (Registered) + deregisterWithDebugger(); + } + + // Subclasses can override these methods to update the image with loaded + // addresses for sections and common symbols + virtual void updateSectionAddress(const SectionRef &Sec, uint64_t Addr) + { + DyldObj->updateSectionAddress(Sec, Addr); + } + + virtual void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr) + { + DyldObj->updateSymbolAddress(Sym, Addr); + } + + virtual void registerWithDebugger() + { + JITRegistrar::getGDBRegistrar().registerObject(DyldObj->getBuffer()); + Registered = true; + } + virtual void deregisterWithDebugger() + { + JITRegistrar::getGDBRegistrar().deregisterObject(DyldObj->getBuffer()); + } +}; + +template +DyldELFObject::DyldELFObject(MemoryBuffer *Object, + error_code &ec) + : ELFObjectFile(Object, ec), + InputData(Object) { + this->isDyldELFObject = true; +} + +template +void DyldELFObject::updateSectionAddress( + const SectionRef &Sec, + uint64_t Addr) { + DataRefImpl ShdrRef = Sec.getRawDataRefImpl(); + Elf_Shdr *shdr = const_cast( + reinterpret_cast(ShdrRef.p)); + + // This assumes the address passed in matches the target address bitness + // The template-based type cast handles everything else. + shdr->sh_addr = static_cast(Addr); +} + +template +void DyldELFObject::updateSymbolAddress( + const SymbolRef &SymRef, + uint64_t Addr) { + + Elf_Sym *sym = const_cast( + ELFObjectFile:: + getSymbol(SymRef.getRawDataRefImpl())); + + // This assumes the address passed in matches the target address bitness + // The template-based type cast handles everything else. + sym->st_value = static_cast(Addr); +} + +} // namespace + + namespace llvm { +ObjectImage *RuntimeDyldELF::createObjectImage( + const MemoryBuffer *ConstInputBuffer) { + MemoryBuffer *InputBuffer = const_cast(ConstInputBuffer); + std::pair Ident = getElfArchType(InputBuffer); + error_code ec; + + if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB) { + DyldELFObject *Obj = + new DyldELFObject(InputBuffer, ec); + return new ELFObjectImage(Obj); + } + else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB) { + DyldELFObject *Obj = + new DyldELFObject(InputBuffer, ec); + return new ELFObjectImage(Obj); + } + else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB) { + DyldELFObject *Obj = + new DyldELFObject(InputBuffer, ec); + return new ELFObjectImage(Obj); + } + else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) { + DyldELFObject *Obj = + new DyldELFObject(InputBuffer, ec); + return new ELFObjectImage(Obj); + } + else + llvm_unreachable("Unexpected ELF format"); +} + +void RuntimeDyldELF::handleObjectLoaded(ObjectImage *Obj) +{ + Obj->registerWithDebugger(); + // Save the loaded object. It will deregister itself when deleted + LoadedObject = Obj; +} + +RuntimeDyldELF::~RuntimeDyldELF() { + if (LoadedObject) + delete LoadedObject; +} void RuntimeDyldELF::resolveX86_64Relocation(uint8_t *LocalAddress, uint64_t FinalAddress, @@ -167,7 +332,7 @@ void RuntimeDyldELF::resolveRelocation(uint8_t *LocalAddress, } void RuntimeDyldELF::processRelocationRef(const ObjRelocationInfo &Rel, - const ObjectFile &Obj, + ObjectImage &Obj, ObjSectionToIDMap &ObjSectionToID, LocalSymbolMap &Symbols, StubMap &Stubs) { @@ -206,7 +371,7 @@ void RuntimeDyldELF::processRelocationRef(const ObjRelocationInfo &Rel, if (si == Obj.end_sections()) llvm_unreachable("Symbol section not found, bad object file format!"); DEBUG(dbgs() << "\t\tThis is section symbol\n"); - Value.SectionID = findOrEmitSection((*si), true, ObjSectionToID); + Value.SectionID = findOrEmitSection(Obj, (*si), true, ObjSectionToID); Value.Addend = Addend; break; } @@ -236,7 +401,7 @@ void RuntimeDyldELF::processRelocationRef(const ObjRelocationInfo &Rel, // Look up for existing stub. StubMap::const_iterator i = Stubs.find(Value); if (i != Stubs.end()) { - resolveRelocation(Target, Section.LoadAddress, (uint64_t)Section.Address + + resolveRelocation(Target, (uint64_t)Target, (uint64_t)Section.Address + i->second, RelType, 0); DEBUG(dbgs() << " Stub function found\n"); } else { @@ -247,7 +412,7 @@ void RuntimeDyldELF::processRelocationRef(const ObjRelocationInfo &Rel, Section.StubOffset); AddRelocation(Value, Rel.SectionID, StubTargetAddr - Section.Address, ELF::R_ARM_ABS32); - resolveRelocation(Target, Section.LoadAddress, (uint64_t)Section.Address + + resolveRelocation(Target, (uint64_t)Target, (uint64_t)Section.Address + Section.StubOffset, RelType, 0); Section.StubOffset += getMaxStubSize(); } diff --git a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h index 36566da57a5..e7f6fab16fc 100644 --- a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h +++ b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h @@ -22,6 +22,8 @@ using namespace llvm; namespace llvm { class RuntimeDyldELF : public RuntimeDyldImpl { protected: + ObjectImage *LoadedObject; + void resolveX86_64Relocation(uint8_t *LocalAddress, uint64_t FinalAddress, uint64_t Value, @@ -47,12 +49,18 @@ protected: int64_t Addend); virtual void processRelocationRef(const ObjRelocationInfo &Rel, - const ObjectFile &Obj, + ObjectImage &Obj, ObjSectionToIDMap &ObjSectionToID, LocalSymbolMap &Symbols, StubMap &Stubs); + virtual ObjectImage *createObjectImage(const MemoryBuffer *InputBuffer); + virtual void handleObjectLoaded(ObjectImage *Obj); + public: - RuntimeDyldELF(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {} + RuntimeDyldELF(RTDyldMemoryManager *mm) + : RuntimeDyldImpl(mm), LoadedObject(0) {} + + virtual ~RuntimeDyldELF(); bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const; }; diff --git a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h index bf678af6ece..2dea13f15ce 100644 --- a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h +++ b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h @@ -29,6 +29,7 @@ #include "llvm/ADT/Triple.h" #include #include "llvm/Support/Format.h" +#include "ObjectImage.h" using namespace llvm; using namespace llvm::object; @@ -154,7 +155,8 @@ protected: /// \brief Emits a section containing common symbols. /// \return SectionID. - unsigned emitCommonSymbols(const CommonSymbolMap &Map, + unsigned emitCommonSymbols(ObjectImage &Obj, + const CommonSymbolMap &Map, uint64_t TotalSize, LocalSymbolMap &Symbols); @@ -162,14 +164,18 @@ protected: /// \param IsCode if it's true then allocateCodeSection() will be /// used for emmits, else allocateDataSection() will be used. /// \return SectionID. - unsigned emitSection(const SectionRef &Section, bool IsCode); + unsigned emitSection(ObjectImage &Obj, + const SectionRef &Section, + bool IsCode); /// \brief Find Section in LocalSections. If the secton is not found - emit /// it and store in LocalSections. /// \param IsCode if it's true then allocateCodeSection() will be /// used for emmits, else allocateDataSection() will be used. /// \return SectionID. - unsigned findOrEmitSection(const SectionRef &Section, bool IsCode, + unsigned findOrEmitSection(ObjectImage &Obj, + const SectionRef &Section, + bool IsCode, ObjSectionToIDMap &LocalSections); /// \brief If Value.SymbolName is NULL then store relocation to the @@ -200,11 +206,18 @@ protected: /// \brief Parses the object file relocation and store it to Relocations /// or SymbolRelocations. Its depend from object file type. virtual void processRelocationRef(const ObjRelocationInfo &Rel, - const ObjectFile &Obj, + ObjectImage &Obj, ObjSectionToIDMap &ObjSectionToID, LocalSymbolMap &Symbols, StubMap &Stubs) = 0; void resolveSymbols(); + virtual ObjectImage *createObjectImage(const MemoryBuffer *InputBuffer); + virtual void handleObjectLoaded(ObjectImage *Obj) + { + // Subclasses may choose to retain this image if they have a use for it + delete Obj; + } + public: RuntimeDyldImpl(RTDyldMemoryManager *mm) : MemMgr(mm), HasError(false) {} diff --git a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp index 1318b445425..b7f515d6ce6 100644 --- a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp +++ b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp @@ -205,7 +205,7 @@ resolveARMRelocation(uint8_t *LocalAddress, } void RuntimeDyldMachO::processRelocationRef(const ObjRelocationInfo &Rel, - const ObjectFile &Obj, + ObjectImage &Obj, ObjSectionToIDMap &ObjSectionToID, LocalSymbolMap &Symbols, StubMap &Stubs) { @@ -246,7 +246,7 @@ void RuntimeDyldMachO::processRelocationRef(const ObjRelocationInfo &Rel, break; } assert(si != se && "No section containing relocation!"); - Value.SectionID = findOrEmitSection(*si, true, ObjSectionToID); + Value.SectionID = findOrEmitSection(Obj, *si, true, ObjSectionToID); Value.Addend = *(const intptr_t *)Target; if (Value.Addend) { // The MachO addend is offset from the current section, we need set it diff --git a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h index 898b85190e7..418d130f635 100644 --- a/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h +++ b/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h @@ -49,7 +49,7 @@ protected: int64_t Addend); virtual void processRelocationRef(const ObjRelocationInfo &Rel, - const ObjectFile &Obj, + ObjectImage &Obj, ObjSectionToIDMap &ObjSectionToID, LocalSymbolMap &Symbols, StubMap &Stubs); @@ -59,7 +59,7 @@ public: uint64_t Value, uint32_t Type, int64_t Addend); - + RuntimeDyldMachO(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {} bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const; diff --git a/contrib/llvm/lib/MC/MCParser/AsmParser.cpp b/contrib/llvm/lib/MC/MCParser/AsmParser.cpp index 2d61cac6258..8aef43cb0b4 100644 --- a/contrib/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/contrib/llvm/lib/MC/MCParser/AsmParser.cpp @@ -1527,11 +1527,11 @@ bool AsmParser::HandleMacroEntry(StringRef Name, SMLoc NameLoc, } Lex(); } - // If there weren't any arguments, erase the token vector so everything - // else knows that. Leaving around the vestigal empty token list confuses - // things. - if (MacroArguments.size() == 1 && MacroArguments.back().empty()) - MacroArguments.clear(); + // If the last argument didn't end up with any tokens, it's not a real + // argument and we should remove it from the list. This happens with either + // a tailing comma or an empty argument list. + if (MacroArguments.back().empty()) + MacroArguments.pop_back(); // Macro instantiation is lexical, unfortunately. We construct a new buffer // to hold the macro body with substitutions. diff --git a/contrib/llvm/lib/Object/ELFObjectFile.cpp b/contrib/llvm/lib/Object/ELFObjectFile.cpp index ab5f8108af1..663b84ec8b1 100644 --- a/contrib/llvm/lib/Object/ELFObjectFile.cpp +++ b/contrib/llvm/lib/Object/ELFObjectFile.cpp @@ -17,16 +17,6 @@ namespace llvm { using namespace object; -namespace { - std::pair - getElfArchType(MemoryBuffer *Object) { - if (Object->getBufferSize() < ELF::EI_NIDENT) - return std::make_pair((uint8_t)ELF::ELFCLASSNONE,(uint8_t)ELF::ELFDATANONE); - return std::make_pair( (uint8_t)Object->getBufferStart()[ELF::EI_CLASS] - , (uint8_t)Object->getBufferStart()[ELF::EI_DATA]); - } -} - // Creates an in-memory object-file by default: createELFObjectFile(Buffer) ObjectFile *ObjectFile::createELFObjectFile(MemoryBuffer *Object) { std::pair Ident = getElfArchType(Object); diff --git a/contrib/llvm/lib/Support/Locale.cpp b/contrib/llvm/lib/Support/Locale.cpp new file mode 100644 index 00000000000..17b9b6c47d6 --- /dev/null +++ b/contrib/llvm/lib/Support/Locale.cpp @@ -0,0 +1,10 @@ +#include "llvm/Support/Locale.h" +#include "llvm/Config/config.h" + +#ifdef __APPLE__ +#include "LocaleXlocale.inc" +#elif LLVM_ON_WIN32 +#include "LocaleWindows.inc" +#else +#include "LocaleGeneric.inc" +#endif diff --git a/contrib/llvm/lib/Support/LocaleGeneric.inc b/contrib/llvm/lib/Support/LocaleGeneric.inc new file mode 100644 index 00000000000..278deee3e4d --- /dev/null +++ b/contrib/llvm/lib/Support/LocaleGeneric.inc @@ -0,0 +1,17 @@ +#include + +namespace llvm { +namespace sys { +namespace locale { + +int columnWidth(StringRef s) { + return s.size(); +} + +bool isPrint(int c) { + return iswprint(c); +} + +} +} +} diff --git a/contrib/llvm/lib/Support/LocaleWindows.inc b/contrib/llvm/lib/Support/LocaleWindows.inc new file mode 100644 index 00000000000..6827ac15a1a --- /dev/null +++ b/contrib/llvm/lib/Support/LocaleWindows.inc @@ -0,0 +1,15 @@ +namespace llvm { +namespace sys { +namespace locale { + +int columnWidth(StringRef s) { + return s.size(); +} + +bool isPrint(int c) { + return ' ' <= c && c <= '~'; +} + +} +} +} \ No newline at end of file diff --git a/contrib/llvm/lib/Support/LocaleXlocale.inc b/contrib/llvm/lib/Support/LocaleXlocale.inc new file mode 100644 index 00000000000..f595e7c582c --- /dev/null +++ b/contrib/llvm/lib/Support/LocaleXlocale.inc @@ -0,0 +1,61 @@ +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/Support/ManagedStatic.h" +#include +#include + + +namespace { + struct locale_holder { + locale_holder() + : l(newlocale(LC_CTYPE_MASK,"en_US.UTF-8",LC_GLOBAL_LOCALE)) + { + assert(NULL!=l); + } + ~locale_holder() { + freelocale(l); + } + + int mbswidth(llvm::SmallString<16> s) const { + // this implementation assumes no '\0' in s + assert(s.size()==strlen(s.c_str())); + + size_t size = mbstowcs_l(NULL,s.c_str(),0,l); + assert(size!=(size_t)-1); + if (size==0) + return 0; + llvm::SmallVector ws(size); + size = mbstowcs_l(&ws[0],s.c_str(),ws.size(),l); + assert(ws.size()==size); + return wcswidth_l(&ws[0],ws.size(),l); + } + + int isprint(int c) const { + return iswprint_l(c,l); + } + + private: + + locale_t l; + }; + + llvm::ManagedStatic l; +} + +namespace llvm { +namespace sys { +namespace locale { + +int columnWidth(StringRef s) { + int width = l->mbswidth(s); + assert(width>=0); + return width; +} + +bool isPrint(int c) { + return l->isprint(c); +} + +} +} +} diff --git a/contrib/llvm/lib/Support/SmallPtrSet.cpp b/contrib/llvm/lib/Support/SmallPtrSet.cpp index 68d9c29411f..3b53e9ff49f 100644 --- a/contrib/llvm/lib/Support/SmallPtrSet.cpp +++ b/contrib/llvm/lib/Support/SmallPtrSet.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/DenseMapInfo.h" #include "llvm/Support/MathExtras.h" #include #include @@ -102,7 +103,7 @@ bool SmallPtrSetImpl::erase_imp(const void * Ptr) { } const void * const *SmallPtrSetImpl::FindBucketFor(const void *Ptr) const { - unsigned Bucket = Hash(Ptr); + unsigned Bucket = DenseMapInfo::getHashValue(Ptr) & (CurArraySize-1); unsigned ArraySize = CurArraySize; unsigned ProbeAmt = 1; const void *const *Array = CurArray; diff --git a/contrib/llvm/lib/Support/SourceMgr.cpp b/contrib/llvm/lib/Support/SourceMgr.cpp index bbe36b260b9..15278c598e5 100644 --- a/contrib/llvm/lib/Support/SourceMgr.cpp +++ b/contrib/llvm/lib/Support/SourceMgr.cpp @@ -193,7 +193,8 @@ SMDiagnostic SourceMgr::GetMessage(SMLoc Loc, SourceMgr::DiagKind Kind, } void SourceMgr::PrintMessage(SMLoc Loc, SourceMgr::DiagKind Kind, - const Twine &Msg, ArrayRef Ranges) const { + const Twine &Msg, ArrayRef Ranges, + bool ShowColors) const { SMDiagnostic Diagnostic = GetMessage(Loc, Kind, Msg, Ranges); // Report the message with the diagnostic handler if present. @@ -208,7 +209,7 @@ void SourceMgr::PrintMessage(SMLoc Loc, SourceMgr::DiagKind Kind, assert(CurBuf != -1 && "Invalid or unspecified location!"); PrintIncludeStack(getBufferInfo(CurBuf).IncludeLoc, OS); - Diagnostic.print(0, OS); + Diagnostic.print(0, OS, ShowColors); } //===----------------------------------------------------------------------===// @@ -225,7 +226,14 @@ SMDiagnostic::SMDiagnostic(const SourceMgr &sm, SMLoc L, const std::string &FN, } -void SMDiagnostic::print(const char *ProgName, raw_ostream &S) const { +void SMDiagnostic::print(const char *ProgName, raw_ostream &S, + bool ShowColors) const { + // Display colors only if OS goes to a tty. + ShowColors &= S.is_displayed(); + + if (ShowColors) + S.changeColor(raw_ostream::SAVEDCOLOR, true); + if (ProgName && ProgName[0]) S << ProgName << ": "; @@ -244,13 +252,33 @@ void SMDiagnostic::print(const char *ProgName, raw_ostream &S) const { } switch (Kind) { - case SourceMgr::DK_Error: S << "error: "; break; - case SourceMgr::DK_Warning: S << "warning: "; break; - case SourceMgr::DK_Note: S << "note: "; break; + case SourceMgr::DK_Error: + if (ShowColors) + S.changeColor(raw_ostream::RED, true); + S << "error: "; + break; + case SourceMgr::DK_Warning: + if (ShowColors) + S.changeColor(raw_ostream::MAGENTA, true); + S << "warning: "; + break; + case SourceMgr::DK_Note: + if (ShowColors) + S.changeColor(raw_ostream::BLACK, true); + S << "note: "; + break; } - + + if (ShowColors) { + S.resetColor(); + S.changeColor(raw_ostream::SAVEDCOLOR, true); + } + S << Message << '\n'; + if (ShowColors) + S.resetColor(); + if (LineNo == -1 || ColumnNo == -1) return; @@ -292,6 +320,9 @@ void SMDiagnostic::print(const char *ProgName, raw_ostream &S) const { } S << '\n'; + if (ShowColors) + S.changeColor(raw_ostream::GREEN, true); + // Print out the caret line, matching tabs in the source line. for (unsigned i = 0, e = CaretLine.size(), OutCol = 0; i != e; ++i) { if (i >= LineContents.size() || LineContents[i] != '\t') { @@ -306,6 +337,9 @@ void SMDiagnostic::print(const char *ProgName, raw_ostream &S) const { ++OutCol; } while (OutCol & 7); } + + if (ShowColors) + S.resetColor(); S << '\n'; } diff --git a/contrib/llvm/lib/Support/Unix/PathV2.inc b/contrib/llvm/lib/Support/Unix/PathV2.inc index edb101efb0f..38a5fe21470 100644 --- a/contrib/llvm/lib/Support/Unix/PathV2.inc +++ b/contrib/llvm/lib/Support/Unix/PathV2.inc @@ -346,9 +346,10 @@ error_code status(const Twine &path, file_status &result) { return error_code::success(); } +// Since this is most often used for temporary files, mode defaults to 0600. error_code unique_file(const Twine &model, int &result_fd, - SmallVectorImpl &result_path, - bool makeAbsolute) { + SmallVectorImpl &result_path, + bool makeAbsolute, unsigned mode) { SmallString<128> Model; model.toVector(Model); // Null terminate. @@ -395,7 +396,7 @@ retry_random_path: // Try to open + create the file. rety_open_create: - int RandomFD = ::open(RandomPath.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600); + int RandomFD = ::open(RandomPath.c_str(), O_RDWR | O_CREAT | O_EXCL, mode); if (RandomFD == -1) { // If the file existed, try again, otherwise, error. if (errno == errc::file_exists) diff --git a/contrib/llvm/lib/Support/Unix/Process.inc b/contrib/llvm/lib/Support/Unix/Process.inc index 2d7fd384e8b..f640462a451 100644 --- a/contrib/llvm/lib/Support/Unix/Process.inc +++ b/contrib/llvm/lib/Support/Unix/Process.inc @@ -290,6 +290,10 @@ const char *Process::OutputBold(bool bg) { return "\033[1m"; } +const char *Process::OutputReverse() { + return "\033[7m"; +} + const char *Process::ResetColor() { return "\033[0m"; } diff --git a/contrib/llvm/lib/Support/Windows/PathV2.inc b/contrib/llvm/lib/Support/Windows/PathV2.inc index e9ce5d9097a..3ac983a3eaa 100644 --- a/contrib/llvm/lib/Support/Windows/PathV2.inc +++ b/contrib/llvm/lib/Support/Windows/PathV2.inc @@ -487,9 +487,11 @@ handle_status_error: return error_code::success(); } +// FIXME: mode should be used here and default to user r/w only, +// it currently comes in as a UNIX mode. error_code unique_file(const Twine &model, int &result_fd, - SmallVectorImpl &result_path, - bool makeAbsolute) { + SmallVectorImpl &result_path, + bool makeAbsolute, unsigned mode) { // Use result_path as temp storage. result_path.set_size(0); StringRef m = model.toStringRef(result_path); diff --git a/contrib/llvm/lib/Support/Windows/Process.inc b/contrib/llvm/lib/Support/Windows/Process.inc index 913b0734ddc..9a388b4efc6 100644 --- a/contrib/llvm/lib/Support/Windows/Process.inc +++ b/contrib/llvm/lib/Support/Windows/Process.inc @@ -215,6 +215,38 @@ const char *Process::OutputColor(char code, bool bold, bool bg) { return 0; } +static WORD GetConsoleTextAttribute(HANDLE hConsoleOutput) { + CONSOLE_SCREEN_BUFFER_INFO info; + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info); + return info.wAttributes; +} + +const char *Process::OutputReverse() { + const WORD attributes + = GetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE)); + + const WORD foreground_mask = FOREGROUND_BLUE | FOREGROUND_GREEN | + FOREGROUND_RED | FOREGROUND_INTENSITY; + const WORD background_mask = BACKGROUND_BLUE | BACKGROUND_GREEN | + BACKGROUND_RED | BACKGROUND_INTENSITY; + const WORD color_mask = foreground_mask | background_mask; + + WORD new_attributes = + ((attributes & FOREGROUND_BLUE )?BACKGROUND_BLUE :0) | + ((attributes & FOREGROUND_GREEN )?BACKGROUND_GREEN :0) | + ((attributes & FOREGROUND_RED )?BACKGROUND_RED :0) | + ((attributes & FOREGROUND_INTENSITY)?BACKGROUND_INTENSITY:0) | + ((attributes & BACKGROUND_BLUE )?FOREGROUND_BLUE :0) | + ((attributes & BACKGROUND_GREEN )?FOREGROUND_GREEN :0) | + ((attributes & BACKGROUND_RED )?FOREGROUND_RED :0) | + ((attributes & BACKGROUND_INTENSITY)?FOREGROUND_INTENSITY:0) | + 0; + new_attributes = (attributes & ~color_mask) | (new_attributes & color_mask); + + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), new_attributes); + return 0; +} + const char *Process::ResetColor() { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), defaultColors()); return 0; diff --git a/contrib/llvm/lib/Support/YAMLParser.cpp b/contrib/llvm/lib/Support/YAMLParser.cpp index 330519f3019..d38b51b0b28 100644 --- a/contrib/llvm/lib/Support/YAMLParser.cpp +++ b/contrib/llvm/lib/Support/YAMLParser.cpp @@ -1732,7 +1732,7 @@ StringRef ScalarNode::unescapeDoubleQuoted( StringRef UnquotedValue if (UnquotedValue.size() < 3) // TODO: Report error. break; - unsigned int UnicodeScalarValue; + unsigned int UnicodeScalarValue = 0; UnquotedValue.substr(1, 2).getAsInteger(16, UnicodeScalarValue); encodeUTF8(UnicodeScalarValue, Storage); UnquotedValue = UnquotedValue.substr(2); @@ -1742,7 +1742,7 @@ StringRef ScalarNode::unescapeDoubleQuoted( StringRef UnquotedValue if (UnquotedValue.size() < 5) // TODO: Report error. break; - unsigned int UnicodeScalarValue; + unsigned int UnicodeScalarValue = 0; UnquotedValue.substr(1, 4).getAsInteger(16, UnicodeScalarValue); encodeUTF8(UnicodeScalarValue, Storage); UnquotedValue = UnquotedValue.substr(4); @@ -1752,7 +1752,7 @@ StringRef ScalarNode::unescapeDoubleQuoted( StringRef UnquotedValue if (UnquotedValue.size() < 9) // TODO: Report error. break; - unsigned int UnicodeScalarValue; + unsigned int UnicodeScalarValue = 0; UnquotedValue.substr(1, 8).getAsInteger(16, UnicodeScalarValue); encodeUTF8(UnicodeScalarValue, Storage); UnquotedValue = UnquotedValue.substr(8); diff --git a/contrib/llvm/lib/Support/raw_ostream.cpp b/contrib/llvm/lib/Support/raw_ostream.cpp index 72d3986f41d..86cdca15727 100644 --- a/contrib/llvm/lib/Support/raw_ostream.cpp +++ b/contrib/llvm/lib/Support/raw_ostream.cpp @@ -633,6 +633,19 @@ raw_ostream &raw_fd_ostream::resetColor() { return *this; } +raw_ostream &raw_fd_ostream::reverseColor() { + if (sys::Process::ColorNeedsFlush()) + flush(); + const char *colorcode = sys::Process::OutputReverse(); + if (colorcode) { + size_t len = strlen(colorcode); + write(colorcode, len); + // don't account colors towards output characters + pos -= len; + } + return *this; +} + bool raw_fd_ostream::is_displayed() const { return sys::Process::FileDescriptorIsDisplayed(FD); } diff --git a/contrib/llvm/lib/TableGen/Error.cpp b/contrib/llvm/lib/TableGen/Error.cpp index 5071ee77ac4..1463b68144a 100644 --- a/contrib/llvm/lib/TableGen/Error.cpp +++ b/contrib/llvm/lib/TableGen/Error.cpp @@ -20,6 +20,22 @@ namespace llvm { SourceMgr SrcMgr; +void PrintWarning(SMLoc WarningLoc, const Twine &Msg) { + SrcMgr.PrintMessage(WarningLoc, SourceMgr::DK_Warning, Msg); +} + +void PrintWarning(const char *Loc, const Twine &Msg) { + SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Warning, Msg); +} + +void PrintWarning(const Twine &Msg) { + errs() << "warning:" << Msg << "\n"; +} + +void PrintWarning(const TGError &Warning) { + PrintWarning(Warning.getLoc(), Warning.getMessage()); +} + void PrintError(SMLoc ErrorLoc, const Twine &Msg) { SrcMgr.PrintMessage(ErrorLoc, SourceMgr::DK_Error, Msg); } diff --git a/contrib/llvm/lib/Target/ARM/ARMCallingConv.td b/contrib/llvm/lib/Target/ARM/ARMCallingConv.td index d33364bb287..b9a25126ba6 100644 --- a/contrib/llvm/lib/Target/ARM/ARMCallingConv.td +++ b/contrib/llvm/lib/Target/ARM/ARMCallingConv.td @@ -9,10 +9,6 @@ // This describes the calling conventions for ARM architecture. //===----------------------------------------------------------------------===// -/// CCIfSubtarget - Match if the current subtarget has a feature F. -class CCIfSubtarget: - CCIf().", F), A>; - /// CCIfAlign - Match of the original alignment of the arg class CCIfAlign: CCIf; diff --git a/contrib/llvm/lib/Target/ARM/ARMInstrFormats.td b/contrib/llvm/lib/Target/ARM/ARMInstrFormats.td index 1d38bcf9e84..f04926aaceb 100644 --- a/contrib/llvm/lib/Target/ARM/ARMInstrFormats.td +++ b/contrib/llvm/lib/Target/ARM/ARMInstrFormats.td @@ -532,6 +532,7 @@ class AIswp pattern> let Inst{11-4} = 0b00001001; let Inst{3-0} = Rt2; + let Unpredictable{11-8} = 0b1111; let DecoderMethod = "DecodeSwap"; } diff --git a/contrib/llvm/lib/Target/ARM/ARMInstrInfo.td b/contrib/llvm/lib/Target/ARM/ARMInstrInfo.td index 3caaa236612..1eb561d6901 100644 --- a/contrib/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/contrib/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -219,8 +219,11 @@ def UseFPVMLx : Predicate<"Subtarget->useFPVMLx()">; // Prefer fused MAC for fp mul + add over fp VMLA / VMLS if they are available. // But only select them if more precision in FP computation is allowed. -def UseFusedMAC : Predicate<"!TM.Options.NoExcessFPPrecision">; -def DontUseFusedMAC : Predicate<"!Subtarget->hasVFP4()">; +// Do not use them for Darwin platforms. +def UseFusedMAC : Predicate<"!TM.Options.NoExcessFPPrecision && " + "!Subtarget->isTargetDarwin()">; +def DontUseFusedMAC : Predicate<"!Subtarget->hasVFP4() || " + "Subtarget->isTargetDarwin()">; //===----------------------------------------------------------------------===// // ARM Flag Definitions. @@ -905,6 +908,11 @@ def p_imm : Operand { let DecoderMethod = "DecodeCoprocessor"; } +def pf_imm : Operand { + let PrintMethod = "printPImmediate"; + let ParserMatchClass = CoprocNumAsmOperand; +} + def CoprocRegAsmOperand : AsmOperandClass { let Name = "CoprocReg"; let ParserMethod = "parseCoprocRegOperand"; @@ -1184,6 +1192,8 @@ multiclass AI1_cmp_irs opcod, string opc, let Inst{19-16} = Rn; let Inst{15-12} = 0b0000; let Inst{11-0} = imm; + + let Unpredictable{15-12} = 0b1111; } def rr : AI1 opcod, string opc, let Inst{15-12} = 0b0000; let Inst{11-4} = 0b00000000; let Inst{3-0} = Rm; + + let Unpredictable{15-12} = 0b1111; } def rsi : AI1 opcod, string opc, let Inst{11-5} = shift{11-5}; let Inst{4} = 0; let Inst{3-0} = shift{3-0}; + + let Unpredictable{15-12} = 0b1111; } def rsr : AI1 { + [(opnode GPRnopc:$Rn, so_reg_reg:$shift)]> { bits<4> Rn; bits<12> shift; let Inst{25} = 0; @@ -1227,6 +1241,8 @@ multiclass AI1_cmp_irs opcod, string opc, let Inst{6-5} = shift{6-5}; let Inst{4} = 1; let Inst{3-0} = shift{3-0}; + + let Unpredictable{15-12} = 0b1111; } } @@ -4103,7 +4119,7 @@ def ISB : AInoP<(outs), (ins memb_opt:$opt), MiscFrm, NoItinerary, let Inst{3-0} = opt; } -// Pseudo isntruction that combines movs + predicated rsbmi +// Pseudo instruction that combines movs + predicated rsbmi // to implement integer ABS let usesCustomInserter = 1, Defs = [CPSR] in { def ABS : ARMPseudoInst< @@ -4264,9 +4280,9 @@ def CLREX : AXI<(outs), (ins), MiscFrm, NoItinerary, "clrex", []>, // SWP/SWPB are deprecated in V6/V7. let mayLoad = 1, mayStore = 1 in { -def SWP : AIswp<0, (outs GPR:$Rt), (ins GPR:$Rt2, addr_offset_none:$addr), +def SWP : AIswp<0, (outs GPRnopc:$Rt), (ins GPRnopc:$Rt2, addr_offset_none:$addr), "swp", []>; -def SWPB: AIswp<1, (outs GPR:$Rt), (ins GPR:$Rt2, addr_offset_none:$addr), +def SWPB: AIswp<1, (outs GPRnopc:$Rt), (ins GPRnopc:$Rt2, addr_offset_none:$addr), "swpb", []>; } @@ -4295,7 +4311,7 @@ def CDP : ABI<0b1110, (outs), (ins p_imm:$cop, imm0_15:$opc1, let Inst{23-20} = opc1; } -def CDP2 : ABXI<0b1110, (outs), (ins p_imm:$cop, imm0_15:$opc1, +def CDP2 : ABXI<0b1110, (outs), (ins pf_imm:$cop, imm0_15:$opc1, c_imm:$CRd, c_imm:$CRn, c_imm:$CRm, imm0_7:$opc2), NoItinerary, "cdp2\t$cop, $opc1, $CRd, $CRn, $CRm, $opc2", [(int_arm_cdp2 imm:$cop, imm:$opc1, imm:$CRd, imm:$CRn, @@ -4574,7 +4590,7 @@ def : ARMV5TPat<(int_arm_mrc2 imm:$cop, imm:$opc1, imm:$CRn, class MovRRCopro pattern = []> : ABI<0b1100, (outs), (ins p_imm:$cop, imm0_15:$opc1, - GPR:$Rt, GPR:$Rt2, c_imm:$CRm), + GPRnopc:$Rt, GPRnopc:$Rt2, c_imm:$CRm), NoItinerary, opc, "\t$cop, $opc1, $Rt, $Rt2, $CRm", pattern> { let Inst{23-21} = 0b010; let Inst{20} = direction; @@ -4593,13 +4609,13 @@ class MovRRCopro pattern = []> } def MCRR : MovRRCopro<"mcrr", 0 /* from ARM core register to coprocessor */, - [(int_arm_mcrr imm:$cop, imm:$opc1, GPR:$Rt, GPR:$Rt2, + [(int_arm_mcrr imm:$cop, imm:$opc1, GPRnopc:$Rt, GPRnopc:$Rt2, imm:$CRm)]>; def MRRC : MovRRCopro<"mrrc", 1 /* from coprocessor to ARM core register */>; class MovRRCopro2 pattern = []> : ABXI<0b1100, (outs), (ins p_imm:$cop, imm0_15:$opc1, - GPR:$Rt, GPR:$Rt2, c_imm:$CRm), NoItinerary, + GPRnopc:$Rt, GPRnopc:$Rt2, c_imm:$CRm), NoItinerary, !strconcat(opc, "\t$cop, $opc1, $Rt, $Rt2, $CRm"), pattern> { let Inst{31-28} = 0b1111; let Inst{23-21} = 0b010; @@ -4616,10 +4632,12 @@ class MovRRCopro2 pattern = []> let Inst{11-8} = cop; let Inst{7-4} = opc1; let Inst{3-0} = CRm; + + let DecoderMethod = "DecodeMRRC2"; } def MCRR2 : MovRRCopro2<"mcrr2", 0 /* from ARM core register to coprocessor */, - [(int_arm_mcrr2 imm:$cop, imm:$opc1, GPR:$Rt, GPR:$Rt2, + [(int_arm_mcrr2 imm:$cop, imm:$opc1, GPRnopc:$Rt, GPRnopc:$Rt2, imm:$CRm)]>; def MRRC2 : MovRRCopro2<"mrrc2", 1 /* from coprocessor to ARM core register */>; @@ -4628,22 +4646,32 @@ def MRRC2 : MovRRCopro2<"mrrc2", 1 /* from coprocessor to ARM core register */>; // // Move to ARM core register from Special Register -def MRS : ABI<0b0001, (outs GPR:$Rd), (ins), NoItinerary, +def MRS : ABI<0b0001, (outs GPRnopc:$Rd), (ins), NoItinerary, "mrs", "\t$Rd, apsr", []> { bits<4> Rd; let Inst{23-16} = 0b00001111; + let Unpredictable{19-17} = 0b111; + let Inst{15-12} = Rd; - let Inst{7-4} = 0b0000; + + let Inst{11-0} = 0b000000000000; + let Unpredictable{11-0} = 0b110100001111; } -def : InstAlias<"mrs${p} $Rd, cpsr", (MRS GPR:$Rd, pred:$p)>, Requires<[IsARM]>; +def : InstAlias<"mrs${p} $Rd, cpsr", (MRS GPRnopc:$Rd, pred:$p)>, Requires<[IsARM]>; -def MRSsys : ABI<0b0001, (outs GPR:$Rd), (ins), NoItinerary, +// The MRSsys instruction is the MRS instruction from the ARM ARM, +// section B9.3.9, with the R bit set to 1. +def MRSsys : ABI<0b0001, (outs GPRnopc:$Rd), (ins), NoItinerary, "mrs", "\t$Rd, spsr", []> { bits<4> Rd; let Inst{23-16} = 0b01001111; + let Unpredictable{19-16} = 0b1111; + let Inst{15-12} = Rd; - let Inst{7-4} = 0b0000; + + let Inst{11-0} = 0b000000000000; + let Unpredictable{11-0} = 0b110100001111; } // Move from ARM core register to Special Register diff --git a/contrib/llvm/lib/Target/ARM/ARMInstrNEON.td b/contrib/llvm/lib/Target/ARM/ARMInstrNEON.td index c7219a60f6c..fd8ac0b328e 100644 --- a/contrib/llvm/lib/Target/ARM/ARMInstrNEON.td +++ b/contrib/llvm/lib/Target/ARM/ARMInstrNEON.td @@ -5634,6 +5634,7 @@ multiclass Lengthen_HalfSingle = // Pat<(v4i32 (extloadvi8 addrmode5:$addr)) // (EXTRACT_SUBREG (VMOVLuv4i32 @@ -5644,28 +5645,63 @@ multiclass Lengthen_HalfSingle; multiclass Lengthen_Double { + string Insn2Ty> { + def _Any : Pat<(!cast("v" # DestLanes # DestTy) + (!cast("extloadv" # SrcTy) addrmode5:$addr)), + (!cast("VMOVLuv" # Insn2Lanes # Insn2Ty) + (EXTRACT_SUBREG (!cast("VMOVLuv" # Insn1Lanes # Insn1Ty) + (INSERT_SUBREG (f64 (IMPLICIT_DEF)), (VLDRS addrmode5:$addr), + ssub_0)), dsub_0))>; + def _Z : Pat<(!cast("v" # DestLanes # DestTy) + (!cast("zextloadv" # SrcTy) addrmode5:$addr)), + (!cast("VMOVLuv" # Insn2Lanes # Insn2Ty) + (EXTRACT_SUBREG (!cast("VMOVLuv" # Insn1Lanes # Insn1Ty) + (INSERT_SUBREG (f64 (IMPLICIT_DEF)), (VLDRS addrmode5:$addr), + ssub_0)), dsub_0))>; + def _S : Pat<(!cast("v" # DestLanes # DestTy) + (!cast("sextloadv" # SrcTy) addrmode5:$addr)), + (!cast("VMOVLsv" # Insn2Lanes # Insn2Ty) + (EXTRACT_SUBREG (!cast("VMOVLsv" # Insn1Lanes # Insn1Ty) + (INSERT_SUBREG (f64 (IMPLICIT_DEF)), (VLDRS addrmode5:$addr), + ssub_0)), dsub_0))>; +} + +// extload, zextload and sextload for a lengthening load followed by another +// lengthening load, to quadruple the initial length, but which ends up only +// requiring half the available lanes (a 64-bit outcome instead of a 128-bit). +// +// Lengthen_HalfDouble<"2", "i32", "i8", "8", "i16", "4", "i32"> = +// Pat<(v4i32 (extloadvi8 addrmode5:$addr)) +// (EXTRACT_SUBREG (VMOVLuv4i32 +// (EXTRACT_SUBREG (VMOVLuv8i16 (INSERT_SUBREG (f64 (IMPLICIT_DEF)), +// (VLDRS addrmode5:$addr), +// ssub_0)), +// dsub_0)), +// dsub_0)>; +multiclass Lengthen_HalfDouble { def _Any : Pat<(!cast("v" # DestLanes # DestTy) (!cast("extloadv" # SrcTy) addrmode5:$addr)), (EXTRACT_SUBREG (!cast("VMOVLuv" # Insn2Lanes # Insn2Ty) (EXTRACT_SUBREG (!cast("VMOVLuv" # Insn1Lanes # Insn1Ty) (INSERT_SUBREG (f64 (IMPLICIT_DEF)), (VLDRS addrmode5:$addr), ssub_0)), dsub_0)), - RegType)>; + dsub_0)>; def _Z : Pat<(!cast("v" # DestLanes # DestTy) (!cast("zextloadv" # SrcTy) addrmode5:$addr)), (EXTRACT_SUBREG (!cast("VMOVLuv" # Insn2Lanes # Insn2Ty) (EXTRACT_SUBREG (!cast("VMOVLuv" # Insn1Lanes # Insn1Ty) (INSERT_SUBREG (f64 (IMPLICIT_DEF)), (VLDRS addrmode5:$addr), ssub_0)), dsub_0)), - RegType)>; + dsub_0)>; def _S : Pat<(!cast("v" # DestLanes # DestTy) (!cast("sextloadv" # SrcTy) addrmode5:$addr)), (EXTRACT_SUBREG (!cast("VMOVLsv" # Insn2Lanes # Insn2Ty) (EXTRACT_SUBREG (!cast("VMOVLsv" # Insn1Lanes # Insn1Ty) (INSERT_SUBREG (f64 (IMPLICIT_DEF)), (VLDRS addrmode5:$addr), ssub_0)), dsub_0)), - RegType)>; + dsub_0)>; } defm : Lengthen_Single<"8", "i16", "i8">; // v8i8 -> v8i16 @@ -5676,12 +5712,12 @@ defm : Lengthen_HalfSingle<"4", "i16", "i8", "8", "i16">; // v4i8 -> v4i16 defm : Lengthen_HalfSingle<"2", "i16", "i8", "8", "i16">; // v2i8 -> v2i16 defm : Lengthen_HalfSingle<"2", "i32", "i16", "4", "i32">; // v2i16 -> v2i32 -// Double lengthening - v4i8 -> v4i16 -> v4i32 -defm : Lengthen_Double<"4", "i32", "i8", "8", "i16", "4", "i32", qsub_0>; +// Double lengthening - v4i8 -> v4i16 -> v4i32 +defm : Lengthen_Double<"4", "i32", "i8", "8", "i16", "4", "i32">; // v2i8 -> v2i16 -> v2i32 -defm : Lengthen_Double<"2", "i32", "i8", "8", "i16", "4", "i32", dsub_0>; +defm : Lengthen_HalfDouble<"2", "i32", "i8", "8", "i16", "4", "i32">; // v2i16 -> v2i32 -> v2i64 -defm : Lengthen_Double<"2", "i64", "i16", "4", "i32", "2", "i64", qsub_0>; +defm : Lengthen_Double<"2", "i64", "i16", "4", "i32", "2", "i64">; // Triple lengthening - v2i8 -> v2i16 -> v2i32 -> v2i64 def : Pat<(v2i64 (extloadvi8 addrmode5:$addr)), @@ -5951,7 +5987,7 @@ def : NEONInstAlias<"vshl${p}.u32 $Vdn, $Vm", def : NEONInstAlias<"vshl${p}.u64 $Vdn, $Vm", (VSHLuv2i64 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; -// VSHL (immediate) two-operand aliases. +// VSHR (immediate) two-operand aliases. def : NEONInstAlias<"vshr${p}.s8 $Vdn, $imm", (VSHRsv8i8 DPR:$Vdn, DPR:$Vdn, shr_imm8:$imm, pred:$p)>; def : NEONInstAlias<"vshr${p}.s16 $Vdn, $imm", @@ -5988,6 +6024,41 @@ def : NEONInstAlias<"vshr${p}.u32 $Vdn, $imm", def : NEONInstAlias<"vshr${p}.u64 $Vdn, $imm", (VSHRuv2i64 QPR:$Vdn, QPR:$Vdn, shr_imm64:$imm, pred:$p)>; +// VRSHL two-operand aliases. +def : NEONInstAlias<"vrshl${p}.s8 $Vdn, $Vm", + (VRSHLsv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.s16 $Vdn, $Vm", + (VRSHLsv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.s32 $Vdn, $Vm", + (VRSHLsv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.s64 $Vdn, $Vm", + (VRSHLsv1i64 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.u8 $Vdn, $Vm", + (VRSHLuv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.u16 $Vdn, $Vm", + (VRSHLuv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.u32 $Vdn, $Vm", + (VRSHLuv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.u64 $Vdn, $Vm", + (VRSHLuv1i64 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; + +def : NEONInstAlias<"vrshl${p}.s8 $Vdn, $Vm", + (VRSHLsv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.s16 $Vdn, $Vm", + (VRSHLsv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.s32 $Vdn, $Vm", + (VRSHLsv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.s64 $Vdn, $Vm", + (VRSHLsv2i64 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.u8 $Vdn, $Vm", + (VRSHLuv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.u16 $Vdn, $Vm", + (VRSHLuv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.u32 $Vdn, $Vm", + (VRSHLuv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vrshl${p}.u64 $Vdn, $Vm", + (VRSHLuv2i64 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; + // VLD1 single-lane pseudo-instructions. These need special handling for // the lane index that an InstAlias can't handle, so we use these instead. def VLD1LNdAsm_8 : NEONDataTypeAsmPseudoInst<"vld1${p}", ".8", "$list, $addr", @@ -6951,6 +7022,100 @@ def : NEONInstAlias<"vsli${p}.32 $Vdm, $imm", def : NEONInstAlias<"vsli${p}.64 $Vdm, $imm", (VSLIv2i64 QPR:$Vdm, QPR:$Vdm, shr_imm64:$imm, pred:$p)>; +// Two-operand variants for VHSUB. + // Signed. +def : NEONInstAlias<"vhsub${p}.s8 $Vdn, $Vm", + (VHSUBsv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhsub${p}.s16 $Vdn, $Vm", + (VHSUBsv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhsub${p}.s32 $Vdn, $Vm", + (VHSUBsv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; + +def : NEONInstAlias<"vhsub${p}.s8 $Vdn, $Vm", + (VHSUBsv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhsub${p}.s16 $Vdn, $Vm", + (VHSUBsv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhsub${p}.s32 $Vdn, $Vm", + (VHSUBsv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; + + // Unsigned. +def : NEONInstAlias<"vhsub${p}.u8 $Vdn, $Vm", + (VHSUBuv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhsub${p}.u16 $Vdn, $Vm", + (VHSUBuv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhsub${p}.u32 $Vdn, $Vm", + (VHSUBuv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; + +def : NEONInstAlias<"vhsub${p}.u8 $Vdn, $Vm", + (VHSUBuv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhsub${p}.u16 $Vdn, $Vm", + (VHSUBuv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhsub${p}.u32 $Vdn, $Vm", + (VHSUBuv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; + + +// Two-operand variants for VHADD. + // Signed. +def : NEONInstAlias<"vhadd${p}.s8 $Vdn, $Vm", + (VHADDsv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhadd${p}.s16 $Vdn, $Vm", + (VHADDsv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhadd${p}.s32 $Vdn, $Vm", + (VHADDsv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; + +def : NEONInstAlias<"vhadd${p}.s8 $Vdn, $Vm", + (VHADDsv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhadd${p}.s16 $Vdn, $Vm", + (VHADDsv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhadd${p}.s32 $Vdn, $Vm", + (VHADDsv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; + + // Unsigned. +def : NEONInstAlias<"vhadd${p}.u8 $Vdn, $Vm", + (VHADDuv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhadd${p}.u16 $Vdn, $Vm", + (VHADDuv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhadd${p}.u32 $Vdn, $Vm", + (VHADDuv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>; + +def : NEONInstAlias<"vhadd${p}.u8 $Vdn, $Vm", + (VHADDuv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhadd${p}.u16 $Vdn, $Vm", + (VHADDuv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; +def : NEONInstAlias<"vhadd${p}.u32 $Vdn, $Vm", + (VHADDuv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>; + +// Two-operand variants for VRHADD. + // Signed. +def : NEONInstAlias<"vrhadd${p}.s8 $Vdn, $Rm", + (VRHADDsv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Rm, pred:$p)>; +def : NEONInstAlias<"vrhadd${p}.s16 $Vdn, $Rm", + (VRHADDsv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Rm, pred:$p)>; +def : NEONInstAlias<"vrhadd${p}.s32 $Vdn, $Rm", + (VRHADDsv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Rm, pred:$p)>; + +def : NEONInstAlias<"vrhadd${p}.s8 $Vdn, $Rm", + (VRHADDsv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Rm, pred:$p)>; +def : NEONInstAlias<"vrhadd${p}.s16 $Vdn, $Rm", + (VRHADDsv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Rm, pred:$p)>; +def : NEONInstAlias<"vrhadd${p}.s32 $Vdn, $Rm", + (VRHADDsv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Rm, pred:$p)>; + + // Unsigned. +def : NEONInstAlias<"vrhadd${p}.u8 $Vdn, $Rm", + (VRHADDuv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Rm, pred:$p)>; +def : NEONInstAlias<"vrhadd${p}.u16 $Vdn, $Rm", + (VRHADDuv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Rm, pred:$p)>; +def : NEONInstAlias<"vrhadd${p}.u32 $Vdn, $Rm", + (VRHADDuv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Rm, pred:$p)>; + +def : NEONInstAlias<"vrhadd${p}.u8 $Vdn, $Rm", + (VRHADDuv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Rm, pred:$p)>; +def : NEONInstAlias<"vrhadd${p}.u16 $Vdn, $Rm", + (VRHADDuv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Rm, pred:$p)>; +def : NEONInstAlias<"vrhadd${p}.u32 $Vdn, $Rm", + (VRHADDuv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Rm, pred:$p)>; + // VSWP allows, but does not require, a type suffix. defm : NEONDTAnyInstAlias<"vswp${p}", "$Vd, $Vm", (VSWPd DPR:$Vd, DPR:$Vm, pred:$p)>; diff --git a/contrib/llvm/lib/Target/ARM/ARMTargetMachine.cpp b/contrib/llvm/lib/Target/ARM/ARMTargetMachine.cpp index 047efc23a4e..9aa83089202 100644 --- a/contrib/llvm/lib/Target/ARM/ARMTargetMachine.cpp +++ b/contrib/llvm/lib/Target/ARM/ARMTargetMachine.cpp @@ -136,22 +136,22 @@ TargetPassConfig *ARMBaseTargetMachine::createPassConfig(PassManagerBase &PM) { bool ARMPassConfig::addPreISel() { if (TM->getOptLevel() != CodeGenOpt::None && EnableGlobalMerge) - PM.add(createGlobalMergePass(TM->getTargetLowering())); + PM->add(createGlobalMergePass(TM->getTargetLowering())); return false; } bool ARMPassConfig::addInstSelector() { - PM.add(createARMISelDag(getARMTargetMachine(), getOptLevel())); + PM->add(createARMISelDag(getARMTargetMachine(), getOptLevel())); return false; } bool ARMPassConfig::addPreRegAlloc() { // FIXME: temporarily disabling load / store optimization pass for Thumb1. if (getOptLevel() != CodeGenOpt::None && !getARMSubtarget().isThumb1Only()) - PM.add(createARMLoadStoreOptimizationPass(true)); + PM->add(createARMLoadStoreOptimizationPass(true)); if (getOptLevel() != CodeGenOpt::None && getARMSubtarget().isCortexA9()) - PM.add(createMLxExpansionPass()); + PM->add(createMLxExpansionPass()); return true; } @@ -159,23 +159,23 @@ bool ARMPassConfig::addPreSched2() { // FIXME: temporarily disabling load / store optimization pass for Thumb1. if (getOptLevel() != CodeGenOpt::None) { if (!getARMSubtarget().isThumb1Only()) { - PM.add(createARMLoadStoreOptimizationPass()); + PM->add(createARMLoadStoreOptimizationPass()); printAndVerify("After ARM load / store optimizer"); } if (getARMSubtarget().hasNEON()) - PM.add(createExecutionDependencyFixPass(&ARM::DPRRegClass)); + PM->add(createExecutionDependencyFixPass(&ARM::DPRRegClass)); } // Expand some pseudo instructions into multiple instructions to allow // proper scheduling. - PM.add(createARMExpandPseudoPass()); + PM->add(createARMExpandPseudoPass()); if (getOptLevel() != CodeGenOpt::None) { if (!getARMSubtarget().isThumb1Only()) addPass(IfConverterID); } if (getARMSubtarget().isThumb2()) - PM.add(createThumb2ITBlockPass()); + PM->add(createThumb2ITBlockPass()); return true; } @@ -183,13 +183,13 @@ bool ARMPassConfig::addPreSched2() { bool ARMPassConfig::addPreEmitPass() { if (getARMSubtarget().isThumb2()) { if (!getARMSubtarget().prefers32BitThumb()) - PM.add(createThumb2SizeReductionPass()); + PM->add(createThumb2SizeReductionPass()); // Constant island pass work on unbundled instructions. addPass(UnpackMachineBundlesID); } - PM.add(createARMConstantIslandPass()); + PM->add(createARMConstantIslandPass()); return true; } diff --git a/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index e55a7dad45d..2c53e3f8f8c 100644 --- a/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -82,8 +82,14 @@ class ARMAsmParser : public MCTargetAsmParser { MCAsmParser &getParser() const { return Parser; } MCAsmLexer &getLexer() const { return Parser.getLexer(); } - void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); } - bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); } + bool Warning(SMLoc L, const Twine &Msg, + ArrayRef Ranges = ArrayRef()) { + return Parser.Warning(L, Msg, Ranges); + } + bool Error(SMLoc L, const Twine &Msg, + ArrayRef Ranges = ArrayRef()) { + return Parser.Error(L, Msg, Ranges); + } int tryParseRegister(); bool tryParseRegisterWithWriteBack(SmallVectorImpl &); @@ -478,6 +484,8 @@ public: /// getEndLoc - Get the location of the last token of this operand. SMLoc getEndLoc() const { return EndLoc; } + SMRange getLocRange() const { return SMRange(StartLoc, EndLoc); } + ARMCC::CondCodes getCondCode() const { assert(Kind == k_CondCode && "Invalid access!"); return CC.Val; @@ -4518,22 +4526,26 @@ bool ARMAsmParser::parseOperand(SmallVectorImpl &Operands, case AsmToken::Dollar: case AsmToken::Hash: { // #42 -> immediate. - // TODO: ":lower16:" and ":upper16:" modifiers after # before immediate S = Parser.getTok().getLoc(); Parser.Lex(); - bool isNegative = Parser.getTok().is(AsmToken::Minus); - const MCExpr *ImmVal; - if (getParser().ParseExpression(ImmVal)) - return true; - const MCConstantExpr *CE = dyn_cast(ImmVal); - if (CE) { - int32_t Val = CE->getValue(); - if (isNegative && Val == 0) - ImmVal = MCConstantExpr::Create(INT32_MIN, getContext()); + + if (Parser.getTok().isNot(AsmToken::Colon)) { + bool isNegative = Parser.getTok().is(AsmToken::Minus); + const MCExpr *ImmVal; + if (getParser().ParseExpression(ImmVal)) + return true; + const MCConstantExpr *CE = dyn_cast(ImmVal); + if (CE) { + int32_t Val = CE->getValue(); + if (isNegative && Val == 0) + ImmVal = MCConstantExpr::Create(INT32_MIN, getContext()); + } + E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); + Operands.push_back(ARMOperand::CreateImm(ImmVal, S, E)); + return false; } - E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); - Operands.push_back(ARMOperand::CreateImm(ImmVal, S, E)); - return false; + // w/ a ':' after the '#', it's just like a plain ':'. + // FALLTHROUGH } case AsmToken::Colon: { // ":lower16:" and ":upper16:" expression prefixes @@ -7321,7 +7333,8 @@ MatchAndEmitInstruction(SMLoc IDLoc, return Error(ErrorLoc, "invalid operand for instruction"); } case Match_MnemonicFail: - return Error(IDLoc, "invalid instruction"); + return Error(IDLoc, "invalid instruction", + ((ARMOperand*)Operands[0])->getLocRange()); case Match_ConversionFail: // The converter function will have already emited a diagnostic. return true; diff --git a/contrib/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp b/contrib/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp index 2f504b756b1..912935db17a 100644 --- a/contrib/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp +++ b/contrib/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp @@ -326,6 +326,8 @@ static DecodeStatus DecodeT2ShifterImmOperand(MCInst &Inst, unsigned Val, static DecodeStatus DecodeLDR(MCInst &Inst, unsigned Val, uint64_t Address, const void *Decoder); +static DecodeStatus DecodeMRRC2(llvm::MCInst &Inst, unsigned Val, + uint64_t Address, const void *Decoder); #include "ARMGenDisassemblerTables.inc" #include "ARMGenInstrInfo.inc" #include "ARMGenEDInfo.inc" @@ -2690,7 +2692,6 @@ static DecodeStatus DecodeVLD2DupInstruction(MCInst &Inst, unsigned Insn, unsigned Rm = fieldFromInstruction32(Insn, 0, 4); unsigned align = fieldFromInstruction32(Insn, 4, 1); unsigned size = 1 << fieldFromInstruction32(Insn, 6, 2); - unsigned pred = fieldFromInstruction32(Insn, 22, 4); align *= 2*size; switch (Inst.getOpcode()) { @@ -2721,16 +2722,11 @@ static DecodeStatus DecodeVLD2DupInstruction(MCInst &Inst, unsigned Insn, return MCDisassembler::Fail; Inst.addOperand(MCOperand::CreateImm(align)); - if (Rm == 0xD) - Inst.addOperand(MCOperand::CreateReg(0)); - else if (Rm != 0xF) { + if (Rm != 0xD && Rm != 0xF) { if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) return MCDisassembler::Fail; } - if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder))) - return MCDisassembler::Fail; - return S; } @@ -4314,6 +4310,10 @@ static DecodeStatus DecodeSwap(MCInst &Inst, unsigned Insn, return DecodeCPSInstruction(Inst, Insn, Address, Decoder); DecodeStatus S = MCDisassembler::Success; + + if (Rt == Rn || Rn == Rt2) + S = MCDisassembler::SoftFail; + if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder))) return MCDisassembler::Fail; if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder))) @@ -4409,3 +4409,31 @@ static DecodeStatus DecodeLDR(MCInst &Inst, unsigned Val, return S; } +static DecodeStatus DecodeMRRC2(llvm::MCInst &Inst, unsigned Val, + uint64_t Address, const void *Decoder) { + + DecodeStatus S = MCDisassembler::Success; + + unsigned CRm = fieldFromInstruction32(Val, 0, 4); + unsigned opc1 = fieldFromInstruction32(Val, 4, 4); + unsigned cop = fieldFromInstruction32(Val, 8, 4); + unsigned Rt = fieldFromInstruction32(Val, 12, 4); + unsigned Rt2 = fieldFromInstruction32(Val, 16, 4); + + if ((cop & ~0x1) == 0xa) + return MCDisassembler::Fail; + + if (Rt == Rt2) + S = MCDisassembler::SoftFail; + + Inst.addOperand(MCOperand::CreateImm(cop)); + Inst.addOperand(MCOperand::CreateImm(opc1)); + if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder))) + return MCDisassembler::Fail; + if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder))) + return MCDisassembler::Fail; + Inst.addOperand(MCOperand::CreateImm(CRm)); + + return S; +} + diff --git a/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp b/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp index b3eeafe0831..cbd81c11a45 100644 --- a/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp +++ b/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp @@ -209,12 +209,12 @@ void ARMInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, } else { assert(Op.isExpr() && "unknown operand kind in printOperand"); // If a symbolic branch target was added as a constant expression then print - // that address in hex. + // that address in hex. And only print 32 unsigned bits for the address. const MCConstantExpr *BranchTarget = dyn_cast(Op.getExpr()); int64_t Address; if (BranchTarget && BranchTarget->EvaluateAsAbsolute(Address)) { O << "0x"; - O.write_hex(Address); + O.write_hex((uint32_t)Address); } else { // Otherwise, just print the expression. diff --git a/contrib/llvm/lib/Target/CellSPU/SPUCallingConv.td b/contrib/llvm/lib/Target/CellSPU/SPUCallingConv.td index 9f9692bf67f..9bc6be79860 100644 --- a/contrib/llvm/lib/Target/CellSPU/SPUCallingConv.td +++ b/contrib/llvm/lib/Target/CellSPU/SPUCallingConv.td @@ -11,10 +11,6 @@ // //===----------------------------------------------------------------------===// -/// CCIfSubtarget - Match if the current subtarget has a feature F. -class CCIfSubtarget - : CCIf().", F), A>; - //===----------------------------------------------------------------------===// // Return Value Calling Convention //===----------------------------------------------------------------------===// diff --git a/contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.cpp b/contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.cpp index 21f6b25bf25..3b90261fe69 100644 --- a/contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.cpp +++ b/contrib/llvm/lib/Target/CellSPU/SPUTargetMachine.cpp @@ -72,7 +72,7 @@ TargetPassConfig *SPUTargetMachine::createPassConfig(PassManagerBase &PM) { bool SPUPassConfig::addInstSelector() { // Install an instruction selector. - PM.add(createSPUISelDag(getSPUTargetMachine())); + PM->add(createSPUISelDag(getSPUTargetMachine())); return false; } @@ -85,9 +85,9 @@ bool SPUPassConfig::addPreEmitPass() { (BuilderFunc)(intptr_t)sys::DynamicLibrary::SearchForAddressOfSymbol( "createTCESchedulerPass"); if (schedulerCreator != NULL) - PM.add(schedulerCreator("cellspu")); + PM->add(schedulerCreator("cellspu")); //align instructions with nops/lnops for dual issue - PM.add(createSPUNopFillerPass(getSPUTargetMachine())); + PM->add(createSPUNopFillerPass(getSPUTargetMachine())); return true; } diff --git a/contrib/llvm/lib/Target/Hexagon/Hexagon.h b/contrib/llvm/lib/Target/Hexagon/Hexagon.h index 43858b9624f..08083233367 100644 --- a/contrib/llvm/lib/Target/Hexagon/Hexagon.h +++ b/contrib/llvm/lib/Target/Hexagon/Hexagon.h @@ -40,7 +40,6 @@ namespace llvm { FunctionPass *createHexagonHardwareLoops(); FunctionPass *createHexagonPeephole(); FunctionPass *createHexagonFixupHwLoops(); - FunctionPass *createHexagonPacketizer(); /* TODO: object output. MCCodeEmitter *createHexagonMCCodeEmitter(const Target &, diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp b/contrib/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp index 2cc8b814a02..39bf45d2d77 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp +++ b/contrib/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp @@ -13,11 +13,11 @@ // //===----------------------------------------------------------------------===// + #define DEBUG_TYPE "asm-printer" #include "Hexagon.h" #include "HexagonAsmPrinter.h" #include "HexagonMachineFunctionInfo.h" -#include "HexagonMCInst.h" #include "HexagonTargetMachine.h" #include "HexagonSubtarget.h" #include "InstPrinter/HexagonInstPrinter.h" @@ -54,7 +54,6 @@ #include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" -#include using namespace llvm; @@ -78,7 +77,8 @@ void HexagonAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, const MachineOperand &MO = MI->getOperand(OpNo); switch (MO.getType()) { - default: llvm_unreachable(""); + default: + assert(0 && ""); case MachineOperand::MO_Register: O << HexagonInstPrinter::getRegisterName(MO.getReg()); return; @@ -196,45 +196,10 @@ void HexagonAsmPrinter::printPredicateOperand(const MachineInstr *MI, /// the current output stream. /// void HexagonAsmPrinter::EmitInstruction(const MachineInstr *MI) { - if (MI->isBundle()) { - std::vector BundleMIs; + MCInst MCI; - const MachineBasicBlock *MBB = MI->getParent(); - MachineBasicBlock::const_instr_iterator MII = MI; - ++MII; - unsigned int IgnoreCount = 0; - while (MII != MBB->end() && MII->isInsideBundle()) { - const MachineInstr *MInst = MII; - if (MInst->getOpcode() == TargetOpcode::DBG_VALUE || - MInst->getOpcode() == TargetOpcode::IMPLICIT_DEF) { - IgnoreCount++; - ++MII; - continue; - } - //BundleMIs.push_back(&*MII); - BundleMIs.push_back(MInst); - ++MII; - } - unsigned Size = BundleMIs.size(); - assert((Size+IgnoreCount) == MI->getBundleSize() && "Corrupt Bundle!"); - for (unsigned Index = 0; Index < Size; Index++) { - HexagonMCInst MCI; - MCI.setStartPacket(Index == 0); - MCI.setEndPacket(Index == (Size-1)); - - HexagonLowerToMC(BundleMIs[Index], MCI, *this); - OutStreamer.EmitInstruction(MCI); - } - } - else { - HexagonMCInst MCI; - if (MI->getOpcode() == Hexagon::ENDLOOP0) { - MCI.setStartPacket(true); - MCI.setEndPacket(true); - } - HexagonLowerToMC(MI, MCI, *this); - OutStreamer.EmitInstruction(MCI); - } + HexagonLowerToMC(MI, MCI, *this); + OutStreamer.EmitInstruction(MCI); return; } @@ -277,17 +242,17 @@ void HexagonAsmPrinter::printJumpTable(const MachineInstr *MI, int OpNo, raw_ostream &O) { const MachineOperand &MO = MI->getOperand(OpNo); assert( (MO.getType() == MachineOperand::MO_JumpTableIndex) && - "Expecting jump table index"); + "Expecting jump table index"); // Hexagon_TODO: Do we need name mangling? O << *GetJTISymbol(MO.getIndex()); } void HexagonAsmPrinter::printConstantPool(const MachineInstr *MI, int OpNo, - raw_ostream &O) { + raw_ostream &O) { const MachineOperand &MO = MI->getOperand(OpNo); assert( (MO.getType() == MachineOperand::MO_ConstantPoolIndex) && - "Expecting constant pool index"); + "Expecting constant pool index"); // Hexagon_TODO: Do we need name mangling? O << *GetCPISymbol(MO.getIndex()); diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp b/contrib/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp index d6da0d0911b..8c4350d1c50 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp +++ b/contrib/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp @@ -32,9 +32,11 @@ #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/SelectionDAGISel.h" #include "llvm/CodeGen/ValueTypes.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/CommandLine.h" +#include "llvm/Support/raw_ostream.h" + using namespace llvm; const unsigned Hexagon_MAX_RET_SIZE = 64; diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonInstrFormats.td b/contrib/llvm/lib/Target/Hexagon/HexagonInstrFormats.td index 48f0f01bb4c..c9f16fb538a 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonInstrFormats.td +++ b/contrib/llvm/lib/Target/Hexagon/HexagonInstrFormats.td @@ -13,26 +13,13 @@ // *** Must match HexagonBaseInfo.h *** //===----------------------------------------------------------------------===// -class Type t> { - bits<5> Value = t; -} -def TypePSEUDO : Type<0>; -def TypeALU32 : Type<1>; -def TypeCR : Type<2>; -def TypeJR : Type<3>; -def TypeJ : Type<4>; -def TypeLD : Type<5>; -def TypeST : Type<6>; -def TypeSYSTEM : Type<7>; -def TypeXTYPE : Type<8>; -def TypeMARKER : Type<31>; //===----------------------------------------------------------------------===// // Intruction Class Declaration + //===----------------------------------------------------------------------===// class InstHexagon pattern, - string cstr, InstrItinClass itin, Type type> : Instruction { + string cstr, InstrItinClass itin> : Instruction { field bits<32> Inst; let Namespace = "Hexagon"; @@ -44,15 +31,11 @@ class InstHexagon pattern, let Constraints = cstr; let Itinerary = itin; - // *** Must match HexagonBaseInfo.h *** - Type HexagonType = type; - let TSFlags{4-0} = HexagonType.Value; - bits<1> isHexagonSolo = 0; - let TSFlags{5} = isHexagonSolo; + // *** The code below must match HexagonBaseInfo.h *** // Predicated instructions. bits<1> isPredicated = 0; - let TSFlags{6} = isPredicated; + let TSFlags{1} = isPredicated; // *** The code above must match HexagonBaseInfo.h *** } @@ -64,40 +47,28 @@ class InstHexagon pattern, // LD Instruction Class in V2/V3/V4. // Definition of the instruction class NOT CHANGED. class LDInst pattern> - : InstHexagon { + : InstHexagon { bits<5> rd; bits<5> rs; bits<13> imm13; - let mayLoad = 1; } // LD Instruction Class in V2/V3/V4. // Definition of the instruction class NOT CHANGED. class LDInstPost pattern, string cstr> - : InstHexagon { + : InstHexagon { bits<5> rd; bits<5> rs; bits<5> rt; bits<13> imm13; - let mayLoad = 1; } // ST Instruction Class in V2/V3 can take SLOT0 only. // ST Instruction Class in V4 can take SLOT0 & SLOT1. // Definition of the instruction class CHANGED from V2/V3 to V4. class STInst pattern> - : InstHexagon { - bits<5> rd; - bits<5> rs; - bits<13> imm13; - let mayStore = 1; -} - -// SYSTEM Instruction Class in V4 can take SLOT0 only -// In V2/V3 we used ST for this but in v4 ST can take SLOT0 or SLOT1. -class SYSInst pattern> - : InstHexagon { + : InstHexagon { bits<5> rd; bits<5> rs; bits<13> imm13; @@ -108,18 +79,17 @@ class SYSInst pattern> // Definition of the instruction class CHANGED from V2/V3 to V4. class STInstPost pattern, string cstr> - : InstHexagon { + : InstHexagon { bits<5> rd; bits<5> rs; bits<5> rt; bits<13> imm13; - let mayStore = 1; } // ALU32 Instruction Class in V2/V3/V4. // Definition of the instruction class NOT CHANGED. class ALU32Type pattern> - : InstHexagon { + : InstHexagon { bits<5> rd; bits<5> rs; bits<5> rt; @@ -132,17 +102,7 @@ class ALU32Type pattern> // Definition of the instruction class NOT CHANGED. // Name of the Instruction Class changed from ALU64 to XTYPE from V2/V3 to V4. class ALU64Type pattern> - : InstHexagon { - bits<5> rd; - bits<5> rs; - bits<5> rt; - bits<16> imm16; - bits<16> imm16_2; -} - -class ALU64_acc pattern, - string cstr> - : InstHexagon { + : InstHexagon { bits<5> rd; bits<5> rs; bits<5> rt; @@ -155,7 +115,7 @@ class ALU64_acc pattern, // Definition of the instruction class NOT CHANGED. // Name of the Instruction Class changed from M to XTYPE from V2/V3 to V4. class MInst pattern> - : InstHexagon { + : InstHexagon { bits<5> rd; bits<5> rs; bits<5> rt; @@ -166,8 +126,8 @@ class MInst pattern> // Definition of the instruction class NOT CHANGED. // Name of the Instruction Class changed from M to XTYPE from V2/V3 to V4. class MInst_acc pattern, - string cstr> - : InstHexagon { + string cstr> + : InstHexagon { bits<5> rd; bits<5> rs; bits<5> rt; @@ -178,7 +138,9 @@ class MInst_acc pattern, // Definition of the instruction class NOT CHANGED. // Name of the Instruction Class changed from S to XTYPE from V2/V3 to V4. class SInst pattern> - : InstHexagon { +//: InstHexagon { + : InstHexagon { +// : InstHexagon { bits<5> rd; bits<5> rs; bits<5> rt; @@ -189,8 +151,8 @@ class SInst pattern> // Definition of the instruction class NOT CHANGED. // Name of the Instruction Class changed from S to XTYPE from V2/V3 to V4. class SInst_acc pattern, - string cstr> - : InstHexagon { + string cstr> + : InstHexagon { // : InstHexagon { // : InstHexagon { bits<5> rd; @@ -201,14 +163,14 @@ class SInst_acc pattern, // J Instruction Class in V2/V3/V4. // Definition of the instruction class NOT CHANGED. class JType pattern> - : InstHexagon { + : InstHexagon { bits<16> imm16; } // JR Instruction Class in V2/V3/V4. // Definition of the instruction class NOT CHANGED. class JRType pattern> - : InstHexagon { + : InstHexagon { bits<5> rs; bits<5> pu; // Predicate register } @@ -216,22 +178,15 @@ class JRType pattern> // CR Instruction Class in V2/V3/V4. // Definition of the instruction class NOT CHANGED. class CRInst pattern> - : InstHexagon { + : InstHexagon { bits<5> rs; bits<10> imm10; } -class Marker pattern> - : InstHexagon { - let isCodeGenOnly = 1; - let isPseudo = 1; -} class Pseudo pattern> - : InstHexagon { - let isCodeGenOnly = 1; - let isPseudo = 1; -} + : InstHexagon; + //===----------------------------------------------------------------------===// // Intruction Classes Definitions - @@ -267,11 +222,6 @@ class ALU64_rr pattern> : ALU64Type { } -class ALU64_ri pattern> - : ALU64Type { - let rt{0-4} = 0; -} - // J Type Instructions. class JInst pattern> : JType { @@ -287,14 +237,12 @@ class JRInst pattern> class STInstPI pattern, string cstr> : STInstPost { let rt{0-4} = 0; - let mayStore = 1; } // Post increment LD Instruction. class LDInstPI pattern, string cstr> : LDInstPost { let rt{0-4} = 0; - let mayLoad = 1; } //===----------------------------------------------------------------------===// diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonInstrFormatsV4.td b/contrib/llvm/lib/Target/Hexagon/HexagonInstrFormatsV4.td index 49741a3d1b2..bd5e4493d7c 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonInstrFormatsV4.td +++ b/contrib/llvm/lib/Target/Hexagon/HexagonInstrFormatsV4.td @@ -11,25 +11,11 @@ // //===----------------------------------------------------------------------===// -//----------------------------------------------------------------------------// -// Hexagon Intruction Flags + -// -// *** Must match BaseInfo.h *** -//----------------------------------------------------------------------------// - -def TypeMEMOP : Type<9>; -def TypeNV : Type<10>; -def TypePREFIX : Type<30>; - -//----------------------------------------------------------------------------// -// Intruction Classes Definitions + -//----------------------------------------------------------------------------// - // // NV type instructions. // class NVInst_V4 pattern> - : InstHexagon { + : InstHexagon { bits<5> rd; bits<5> rs; bits<13> imm13; @@ -38,7 +24,7 @@ class NVInst_V4 pattern> // Definition of Post increment new value store. class NVInstPost_V4 pattern, string cstr> - : InstHexagon { + : InstHexagon { bits<5> rd; bits<5> rs; bits<5> rt; @@ -53,15 +39,8 @@ class NVInstPI_V4 pattern, } class MEMInst_V4 pattern> - : InstHexagon { + : InstHexagon { bits<5> rd; bits<5> rs; bits<6> imm6; } - -class Immext pattern> - : InstHexagon { - let isCodeGenOnly = 1; - - bits<26> imm26; -} diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp b/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp index 8685ec192c7..77b366372cf 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp +++ b/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp @@ -11,10 +11,10 @@ // //===----------------------------------------------------------------------===// +#include "Hexagon.h" #include "HexagonInstrInfo.h" #include "HexagonRegisterInfo.h" #include "HexagonSubtarget.h" -#include "Hexagon.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/CodeGen/DFAPacketizer.h" @@ -466,865 +466,7 @@ unsigned HexagonInstrInfo::createVR(MachineFunction* MF, MVT VT) const { return NewReg; } -bool HexagonInstrInfo::isExtendable(const MachineInstr *MI) const { - switch(MI->getOpcode()) { - // JMP_EQri - case Hexagon::JMP_EQriPt_nv_V4: - case Hexagon::JMP_EQriPnt_nv_V4: - case Hexagon::JMP_EQriNotPt_nv_V4: - case Hexagon::JMP_EQriNotPnt_nv_V4: - // JMP_EQri - with -1 - case Hexagon::JMP_EQriPtneg_nv_V4: - case Hexagon::JMP_EQriPntneg_nv_V4: - case Hexagon::JMP_EQriNotPtneg_nv_V4: - case Hexagon::JMP_EQriNotPntneg_nv_V4: - - // JMP_EQrr - case Hexagon::JMP_EQrrPt_nv_V4: - case Hexagon::JMP_EQrrPnt_nv_V4: - case Hexagon::JMP_EQrrNotPt_nv_V4: - case Hexagon::JMP_EQrrNotPnt_nv_V4: - - // JMP_GTri - case Hexagon::JMP_GTriPt_nv_V4: - case Hexagon::JMP_GTriPnt_nv_V4: - case Hexagon::JMP_GTriNotPt_nv_V4: - case Hexagon::JMP_GTriNotPnt_nv_V4: - - // JMP_GTri - with -1 - case Hexagon::JMP_GTriPtneg_nv_V4: - case Hexagon::JMP_GTriPntneg_nv_V4: - case Hexagon::JMP_GTriNotPtneg_nv_V4: - case Hexagon::JMP_GTriNotPntneg_nv_V4: - - // JMP_GTrr - case Hexagon::JMP_GTrrPt_nv_V4: - case Hexagon::JMP_GTrrPnt_nv_V4: - case Hexagon::JMP_GTrrNotPt_nv_V4: - case Hexagon::JMP_GTrrNotPnt_nv_V4: - - // JMP_GTrrdn - case Hexagon::JMP_GTrrdnPt_nv_V4: - case Hexagon::JMP_GTrrdnPnt_nv_V4: - case Hexagon::JMP_GTrrdnNotPt_nv_V4: - case Hexagon::JMP_GTrrdnNotPnt_nv_V4: - - // JMP_GTUri - case Hexagon::JMP_GTUriPt_nv_V4: - case Hexagon::JMP_GTUriPnt_nv_V4: - case Hexagon::JMP_GTUriNotPt_nv_V4: - case Hexagon::JMP_GTUriNotPnt_nv_V4: - - // JMP_GTUrr - case Hexagon::JMP_GTUrrPt_nv_V4: - case Hexagon::JMP_GTUrrPnt_nv_V4: - case Hexagon::JMP_GTUrrNotPt_nv_V4: - case Hexagon::JMP_GTUrrNotPnt_nv_V4: - - // JMP_GTUrrdn - case Hexagon::JMP_GTUrrdnPt_nv_V4: - case Hexagon::JMP_GTUrrdnPnt_nv_V4: - case Hexagon::JMP_GTUrrdnNotPt_nv_V4: - case Hexagon::JMP_GTUrrdnNotPnt_nv_V4: - return true; - - // TFR_FI - case Hexagon::TFR_FI: - return true; - - - default: - return false; - } - return false; -} - -bool HexagonInstrInfo::isExtended(const MachineInstr *MI) const { - switch(MI->getOpcode()) { - // JMP_EQri - case Hexagon::JMP_EQriPt_ie_nv_V4: - case Hexagon::JMP_EQriPnt_ie_nv_V4: - case Hexagon::JMP_EQriNotPt_ie_nv_V4: - case Hexagon::JMP_EQriNotPnt_ie_nv_V4: - - // JMP_EQri - with -1 - case Hexagon::JMP_EQriPtneg_ie_nv_V4: - case Hexagon::JMP_EQriPntneg_ie_nv_V4: - case Hexagon::JMP_EQriNotPtneg_ie_nv_V4: - case Hexagon::JMP_EQriNotPntneg_ie_nv_V4: - - // JMP_EQrr - case Hexagon::JMP_EQrrPt_ie_nv_V4: - case Hexagon::JMP_EQrrPnt_ie_nv_V4: - case Hexagon::JMP_EQrrNotPt_ie_nv_V4: - case Hexagon::JMP_EQrrNotPnt_ie_nv_V4: - - // JMP_GTri - case Hexagon::JMP_GTriPt_ie_nv_V4: - case Hexagon::JMP_GTriPnt_ie_nv_V4: - case Hexagon::JMP_GTriNotPt_ie_nv_V4: - case Hexagon::JMP_GTriNotPnt_ie_nv_V4: - - // JMP_GTri - with -1 - case Hexagon::JMP_GTriPtneg_ie_nv_V4: - case Hexagon::JMP_GTriPntneg_ie_nv_V4: - case Hexagon::JMP_GTriNotPtneg_ie_nv_V4: - case Hexagon::JMP_GTriNotPntneg_ie_nv_V4: - - // JMP_GTrr - case Hexagon::JMP_GTrrPt_ie_nv_V4: - case Hexagon::JMP_GTrrPnt_ie_nv_V4: - case Hexagon::JMP_GTrrNotPt_ie_nv_V4: - case Hexagon::JMP_GTrrNotPnt_ie_nv_V4: - - // JMP_GTrrdn - case Hexagon::JMP_GTrrdnPt_ie_nv_V4: - case Hexagon::JMP_GTrrdnPnt_ie_nv_V4: - case Hexagon::JMP_GTrrdnNotPt_ie_nv_V4: - case Hexagon::JMP_GTrrdnNotPnt_ie_nv_V4: - - // JMP_GTUri - case Hexagon::JMP_GTUriPt_ie_nv_V4: - case Hexagon::JMP_GTUriPnt_ie_nv_V4: - case Hexagon::JMP_GTUriNotPt_ie_nv_V4: - case Hexagon::JMP_GTUriNotPnt_ie_nv_V4: - - // JMP_GTUrr - case Hexagon::JMP_GTUrrPt_ie_nv_V4: - case Hexagon::JMP_GTUrrPnt_ie_nv_V4: - case Hexagon::JMP_GTUrrNotPt_ie_nv_V4: - case Hexagon::JMP_GTUrrNotPnt_ie_nv_V4: - - // JMP_GTUrrdn - case Hexagon::JMP_GTUrrdnPt_ie_nv_V4: - case Hexagon::JMP_GTUrrdnPnt_ie_nv_V4: - case Hexagon::JMP_GTUrrdnNotPt_ie_nv_V4: - case Hexagon::JMP_GTUrrdnNotPnt_ie_nv_V4: - - // V4 absolute set addressing. - case Hexagon::LDrid_abs_setimm_V4: - case Hexagon::LDriw_abs_setimm_V4: - case Hexagon::LDrih_abs_setimm_V4: - case Hexagon::LDrib_abs_setimm_V4: - case Hexagon::LDriuh_abs_setimm_V4: - case Hexagon::LDriub_abs_setimm_V4: - - case Hexagon::STrid_abs_setimm_V4: - case Hexagon::STrib_abs_setimm_V4: - case Hexagon::STrih_abs_setimm_V4: - case Hexagon::STriw_abs_setimm_V4: - - // V4 global address load. - case Hexagon::LDrid_GP_cPt_V4 : - case Hexagon::LDrid_GP_cNotPt_V4 : - case Hexagon::LDrid_GP_cdnPt_V4 : - case Hexagon::LDrid_GP_cdnNotPt_V4 : - case Hexagon::LDrib_GP_cPt_V4 : - case Hexagon::LDrib_GP_cNotPt_V4 : - case Hexagon::LDrib_GP_cdnPt_V4 : - case Hexagon::LDrib_GP_cdnNotPt_V4 : - case Hexagon::LDriub_GP_cPt_V4 : - case Hexagon::LDriub_GP_cNotPt_V4 : - case Hexagon::LDriub_GP_cdnPt_V4 : - case Hexagon::LDriub_GP_cdnNotPt_V4 : - case Hexagon::LDrih_GP_cPt_V4 : - case Hexagon::LDrih_GP_cNotPt_V4 : - case Hexagon::LDrih_GP_cdnPt_V4 : - case Hexagon::LDrih_GP_cdnNotPt_V4 : - case Hexagon::LDriuh_GP_cPt_V4 : - case Hexagon::LDriuh_GP_cNotPt_V4 : - case Hexagon::LDriuh_GP_cdnPt_V4 : - case Hexagon::LDriuh_GP_cdnNotPt_V4 : - case Hexagon::LDriw_GP_cPt_V4 : - case Hexagon::LDriw_GP_cNotPt_V4 : - case Hexagon::LDriw_GP_cdnPt_V4 : - case Hexagon::LDriw_GP_cdnNotPt_V4 : - case Hexagon::LDd_GP_cPt_V4 : - case Hexagon::LDd_GP_cNotPt_V4 : - case Hexagon::LDd_GP_cdnPt_V4 : - case Hexagon::LDd_GP_cdnNotPt_V4 : - case Hexagon::LDb_GP_cPt_V4 : - case Hexagon::LDb_GP_cNotPt_V4 : - case Hexagon::LDb_GP_cdnPt_V4 : - case Hexagon::LDb_GP_cdnNotPt_V4 : - case Hexagon::LDub_GP_cPt_V4 : - case Hexagon::LDub_GP_cNotPt_V4 : - case Hexagon::LDub_GP_cdnPt_V4 : - case Hexagon::LDub_GP_cdnNotPt_V4 : - case Hexagon::LDh_GP_cPt_V4 : - case Hexagon::LDh_GP_cNotPt_V4 : - case Hexagon::LDh_GP_cdnPt_V4 : - case Hexagon::LDh_GP_cdnNotPt_V4 : - case Hexagon::LDuh_GP_cPt_V4 : - case Hexagon::LDuh_GP_cNotPt_V4 : - case Hexagon::LDuh_GP_cdnPt_V4 : - case Hexagon::LDuh_GP_cdnNotPt_V4 : - case Hexagon::LDw_GP_cPt_V4 : - case Hexagon::LDw_GP_cNotPt_V4 : - case Hexagon::LDw_GP_cdnPt_V4 : - case Hexagon::LDw_GP_cdnNotPt_V4 : - - // V4 global address store. - case Hexagon::STrid_GP_cPt_V4 : - case Hexagon::STrid_GP_cNotPt_V4 : - case Hexagon::STrid_GP_cdnPt_V4 : - case Hexagon::STrid_GP_cdnNotPt_V4 : - case Hexagon::STrib_GP_cPt_V4 : - case Hexagon::STrib_GP_cNotPt_V4 : - case Hexagon::STrib_GP_cdnPt_V4 : - case Hexagon::STrib_GP_cdnNotPt_V4 : - case Hexagon::STrih_GP_cPt_V4 : - case Hexagon::STrih_GP_cNotPt_V4 : - case Hexagon::STrih_GP_cdnPt_V4 : - case Hexagon::STrih_GP_cdnNotPt_V4 : - case Hexagon::STriw_GP_cPt_V4 : - case Hexagon::STriw_GP_cNotPt_V4 : - case Hexagon::STriw_GP_cdnPt_V4 : - case Hexagon::STriw_GP_cdnNotPt_V4 : - case Hexagon::STd_GP_cPt_V4 : - case Hexagon::STd_GP_cNotPt_V4 : - case Hexagon::STd_GP_cdnPt_V4 : - case Hexagon::STd_GP_cdnNotPt_V4 : - case Hexagon::STb_GP_cPt_V4 : - case Hexagon::STb_GP_cNotPt_V4 : - case Hexagon::STb_GP_cdnPt_V4 : - case Hexagon::STb_GP_cdnNotPt_V4 : - case Hexagon::STh_GP_cPt_V4 : - case Hexagon::STh_GP_cNotPt_V4 : - case Hexagon::STh_GP_cdnPt_V4 : - case Hexagon::STh_GP_cdnNotPt_V4 : - case Hexagon::STw_GP_cPt_V4 : - case Hexagon::STw_GP_cNotPt_V4 : - case Hexagon::STw_GP_cdnPt_V4 : - case Hexagon::STw_GP_cdnNotPt_V4 : - - // V4 predicated global address new value store. - case Hexagon::STrib_GP_cPt_nv_V4 : - case Hexagon::STrib_GP_cNotPt_nv_V4 : - case Hexagon::STrib_GP_cdnPt_nv_V4 : - case Hexagon::STrib_GP_cdnNotPt_nv_V4 : - case Hexagon::STrih_GP_cPt_nv_V4 : - case Hexagon::STrih_GP_cNotPt_nv_V4 : - case Hexagon::STrih_GP_cdnPt_nv_V4 : - case Hexagon::STrih_GP_cdnNotPt_nv_V4 : - case Hexagon::STriw_GP_cPt_nv_V4 : - case Hexagon::STriw_GP_cNotPt_nv_V4 : - case Hexagon::STriw_GP_cdnPt_nv_V4 : - case Hexagon::STriw_GP_cdnNotPt_nv_V4 : - case Hexagon::STb_GP_cPt_nv_V4 : - case Hexagon::STb_GP_cNotPt_nv_V4 : - case Hexagon::STb_GP_cdnPt_nv_V4 : - case Hexagon::STb_GP_cdnNotPt_nv_V4 : - case Hexagon::STh_GP_cPt_nv_V4 : - case Hexagon::STh_GP_cNotPt_nv_V4 : - case Hexagon::STh_GP_cdnPt_nv_V4 : - case Hexagon::STh_GP_cdnNotPt_nv_V4 : - case Hexagon::STw_GP_cPt_nv_V4 : - case Hexagon::STw_GP_cNotPt_nv_V4 : - case Hexagon::STw_GP_cdnPt_nv_V4 : - case Hexagon::STw_GP_cdnNotPt_nv_V4 : - - // TFR_FI - case Hexagon::TFR_FI_immext_V4: - return true; - - default: - return false; - } - return false; -} - -bool HexagonInstrInfo::isNewValueJump(const MachineInstr *MI) const { - switch (MI->getOpcode()) { - // JMP_EQri - case Hexagon::JMP_EQriPt_nv_V4: - case Hexagon::JMP_EQriPnt_nv_V4: - case Hexagon::JMP_EQriNotPt_nv_V4: - case Hexagon::JMP_EQriNotPnt_nv_V4: - case Hexagon::JMP_EQriPt_ie_nv_V4: - case Hexagon::JMP_EQriPnt_ie_nv_V4: - case Hexagon::JMP_EQriNotPt_ie_nv_V4: - case Hexagon::JMP_EQriNotPnt_ie_nv_V4: - - // JMP_EQri - with -1 - case Hexagon::JMP_EQriPtneg_nv_V4: - case Hexagon::JMP_EQriPntneg_nv_V4: - case Hexagon::JMP_EQriNotPtneg_nv_V4: - case Hexagon::JMP_EQriNotPntneg_nv_V4: - case Hexagon::JMP_EQriPtneg_ie_nv_V4: - case Hexagon::JMP_EQriPntneg_ie_nv_V4: - case Hexagon::JMP_EQriNotPtneg_ie_nv_V4: - case Hexagon::JMP_EQriNotPntneg_ie_nv_V4: - - // JMP_EQrr - case Hexagon::JMP_EQrrPt_nv_V4: - case Hexagon::JMP_EQrrPnt_nv_V4: - case Hexagon::JMP_EQrrNotPt_nv_V4: - case Hexagon::JMP_EQrrNotPnt_nv_V4: - case Hexagon::JMP_EQrrPt_ie_nv_V4: - case Hexagon::JMP_EQrrPnt_ie_nv_V4: - case Hexagon::JMP_EQrrNotPt_ie_nv_V4: - case Hexagon::JMP_EQrrNotPnt_ie_nv_V4: - - // JMP_GTri - case Hexagon::JMP_GTriPt_nv_V4: - case Hexagon::JMP_GTriPnt_nv_V4: - case Hexagon::JMP_GTriNotPt_nv_V4: - case Hexagon::JMP_GTriNotPnt_nv_V4: - case Hexagon::JMP_GTriPt_ie_nv_V4: - case Hexagon::JMP_GTriPnt_ie_nv_V4: - case Hexagon::JMP_GTriNotPt_ie_nv_V4: - case Hexagon::JMP_GTriNotPnt_ie_nv_V4: - - // JMP_GTri - with -1 - case Hexagon::JMP_GTriPtneg_nv_V4: - case Hexagon::JMP_GTriPntneg_nv_V4: - case Hexagon::JMP_GTriNotPtneg_nv_V4: - case Hexagon::JMP_GTriNotPntneg_nv_V4: - case Hexagon::JMP_GTriPtneg_ie_nv_V4: - case Hexagon::JMP_GTriPntneg_ie_nv_V4: - case Hexagon::JMP_GTriNotPtneg_ie_nv_V4: - case Hexagon::JMP_GTriNotPntneg_ie_nv_V4: - - // JMP_GTrr - case Hexagon::JMP_GTrrPt_nv_V4: - case Hexagon::JMP_GTrrPnt_nv_V4: - case Hexagon::JMP_GTrrNotPt_nv_V4: - case Hexagon::JMP_GTrrNotPnt_nv_V4: - case Hexagon::JMP_GTrrPt_ie_nv_V4: - case Hexagon::JMP_GTrrPnt_ie_nv_V4: - case Hexagon::JMP_GTrrNotPt_ie_nv_V4: - case Hexagon::JMP_GTrrNotPnt_ie_nv_V4: - - // JMP_GTrrdn - case Hexagon::JMP_GTrrdnPt_nv_V4: - case Hexagon::JMP_GTrrdnPnt_nv_V4: - case Hexagon::JMP_GTrrdnNotPt_nv_V4: - case Hexagon::JMP_GTrrdnNotPnt_nv_V4: - case Hexagon::JMP_GTrrdnPt_ie_nv_V4: - case Hexagon::JMP_GTrrdnPnt_ie_nv_V4: - case Hexagon::JMP_GTrrdnNotPt_ie_nv_V4: - case Hexagon::JMP_GTrrdnNotPnt_ie_nv_V4: - - // JMP_GTUri - case Hexagon::JMP_GTUriPt_nv_V4: - case Hexagon::JMP_GTUriPnt_nv_V4: - case Hexagon::JMP_GTUriNotPt_nv_V4: - case Hexagon::JMP_GTUriNotPnt_nv_V4: - case Hexagon::JMP_GTUriPt_ie_nv_V4: - case Hexagon::JMP_GTUriPnt_ie_nv_V4: - case Hexagon::JMP_GTUriNotPt_ie_nv_V4: - case Hexagon::JMP_GTUriNotPnt_ie_nv_V4: - - // JMP_GTUrr - case Hexagon::JMP_GTUrrPt_nv_V4: - case Hexagon::JMP_GTUrrPnt_nv_V4: - case Hexagon::JMP_GTUrrNotPt_nv_V4: - case Hexagon::JMP_GTUrrNotPnt_nv_V4: - case Hexagon::JMP_GTUrrPt_ie_nv_V4: - case Hexagon::JMP_GTUrrPnt_ie_nv_V4: - case Hexagon::JMP_GTUrrNotPt_ie_nv_V4: - case Hexagon::JMP_GTUrrNotPnt_ie_nv_V4: - - // JMP_GTUrrdn - case Hexagon::JMP_GTUrrdnPt_nv_V4: - case Hexagon::JMP_GTUrrdnPnt_nv_V4: - case Hexagon::JMP_GTUrrdnNotPt_nv_V4: - case Hexagon::JMP_GTUrrdnNotPnt_nv_V4: - case Hexagon::JMP_GTUrrdnPt_ie_nv_V4: - case Hexagon::JMP_GTUrrdnPnt_ie_nv_V4: - case Hexagon::JMP_GTUrrdnNotPt_ie_nv_V4: - case Hexagon::JMP_GTUrrdnNotPnt_ie_nv_V4: - return true; - - default: - return false; - } - return false; -} - -unsigned HexagonInstrInfo::getImmExtForm(const MachineInstr* MI) const { - switch(MI->getOpcode()) { - default: llvm_unreachable("Unknown type of instruction"); - - // JMP_EQri - case Hexagon::JMP_EQriPt_nv_V4: - return Hexagon::JMP_EQriPt_ie_nv_V4; - case Hexagon::JMP_EQriNotPt_nv_V4: - return Hexagon::JMP_EQriNotPt_ie_nv_V4; - case Hexagon::JMP_EQriPnt_nv_V4: - return Hexagon::JMP_EQriPnt_ie_nv_V4; - case Hexagon::JMP_EQriNotPnt_nv_V4: - return Hexagon::JMP_EQriNotPnt_ie_nv_V4; - - // JMP_EQri -- with -1 - case Hexagon::JMP_EQriPtneg_nv_V4: - return Hexagon::JMP_EQriPtneg_ie_nv_V4; - case Hexagon::JMP_EQriNotPtneg_nv_V4: - return Hexagon::JMP_EQriNotPtneg_ie_nv_V4; - case Hexagon::JMP_EQriPntneg_nv_V4: - return Hexagon::JMP_EQriPntneg_ie_nv_V4; - case Hexagon::JMP_EQriNotPntneg_nv_V4: - return Hexagon::JMP_EQriNotPntneg_ie_nv_V4; - - // JMP_EQrr - case Hexagon::JMP_EQrrPt_nv_V4: - return Hexagon::JMP_EQrrPt_ie_nv_V4; - case Hexagon::JMP_EQrrNotPt_nv_V4: - return Hexagon::JMP_EQrrNotPt_ie_nv_V4; - case Hexagon::JMP_EQrrPnt_nv_V4: - return Hexagon::JMP_EQrrPnt_ie_nv_V4; - case Hexagon::JMP_EQrrNotPnt_nv_V4: - return Hexagon::JMP_EQrrNotPnt_ie_nv_V4; - - // JMP_GTri - case Hexagon::JMP_GTriPt_nv_V4: - return Hexagon::JMP_GTriPt_ie_nv_V4; - case Hexagon::JMP_GTriNotPt_nv_V4: - return Hexagon::JMP_GTriNotPt_ie_nv_V4; - case Hexagon::JMP_GTriPnt_nv_V4: - return Hexagon::JMP_GTriPnt_ie_nv_V4; - case Hexagon::JMP_GTriNotPnt_nv_V4: - return Hexagon::JMP_GTriNotPnt_ie_nv_V4; - - // JMP_GTri -- with -1 - case Hexagon::JMP_GTriPtneg_nv_V4: - return Hexagon::JMP_GTriPtneg_ie_nv_V4; - case Hexagon::JMP_GTriNotPtneg_nv_V4: - return Hexagon::JMP_GTriNotPtneg_ie_nv_V4; - case Hexagon::JMP_GTriPntneg_nv_V4: - return Hexagon::JMP_GTriPntneg_ie_nv_V4; - case Hexagon::JMP_GTriNotPntneg_nv_V4: - return Hexagon::JMP_GTriNotPntneg_ie_nv_V4; - - // JMP_GTrr - case Hexagon::JMP_GTrrPt_nv_V4: - return Hexagon::JMP_GTrrPt_ie_nv_V4; - case Hexagon::JMP_GTrrNotPt_nv_V4: - return Hexagon::JMP_GTrrNotPt_ie_nv_V4; - case Hexagon::JMP_GTrrPnt_nv_V4: - return Hexagon::JMP_GTrrPnt_ie_nv_V4; - case Hexagon::JMP_GTrrNotPnt_nv_V4: - return Hexagon::JMP_GTrrNotPnt_ie_nv_V4; - - // JMP_GTrrdn - case Hexagon::JMP_GTrrdnPt_nv_V4: - return Hexagon::JMP_GTrrdnPt_ie_nv_V4; - case Hexagon::JMP_GTrrdnNotPt_nv_V4: - return Hexagon::JMP_GTrrdnNotPt_ie_nv_V4; - case Hexagon::JMP_GTrrdnPnt_nv_V4: - return Hexagon::JMP_GTrrdnPnt_ie_nv_V4; - case Hexagon::JMP_GTrrdnNotPnt_nv_V4: - return Hexagon::JMP_GTrrdnNotPnt_ie_nv_V4; - - // JMP_GTUri - case Hexagon::JMP_GTUriPt_nv_V4: - return Hexagon::JMP_GTUriPt_ie_nv_V4; - case Hexagon::JMP_GTUriNotPt_nv_V4: - return Hexagon::JMP_GTUriNotPt_ie_nv_V4; - case Hexagon::JMP_GTUriPnt_nv_V4: - return Hexagon::JMP_GTUriPnt_ie_nv_V4; - case Hexagon::JMP_GTUriNotPnt_nv_V4: - return Hexagon::JMP_GTUriNotPnt_ie_nv_V4; - - // JMP_GTUrr - case Hexagon::JMP_GTUrrPt_nv_V4: - return Hexagon::JMP_GTUrrPt_ie_nv_V4; - case Hexagon::JMP_GTUrrNotPt_nv_V4: - return Hexagon::JMP_GTUrrNotPt_ie_nv_V4; - case Hexagon::JMP_GTUrrPnt_nv_V4: - return Hexagon::JMP_GTUrrPnt_ie_nv_V4; - case Hexagon::JMP_GTUrrNotPnt_nv_V4: - return Hexagon::JMP_GTUrrNotPnt_ie_nv_V4; - - // JMP_GTUrrdn - case Hexagon::JMP_GTUrrdnPt_nv_V4: - return Hexagon::JMP_GTUrrdnPt_ie_nv_V4; - case Hexagon::JMP_GTUrrdnNotPt_nv_V4: - return Hexagon::JMP_GTUrrdnNotPt_ie_nv_V4; - case Hexagon::JMP_GTUrrdnPnt_nv_V4: - return Hexagon::JMP_GTUrrdnPnt_ie_nv_V4; - case Hexagon::JMP_GTUrrdnNotPnt_nv_V4: - return Hexagon::JMP_GTUrrdnNotPnt_ie_nv_V4; - - case Hexagon::TFR_FI: - return Hexagon::TFR_FI_immext_V4; - - case Hexagon::MEMw_ADDSUBi_indexed_MEM_V4 : - case Hexagon::MEMw_ADDi_indexed_MEM_V4 : - case Hexagon::MEMw_SUBi_indexed_MEM_V4 : - case Hexagon::MEMw_ADDr_indexed_MEM_V4 : - case Hexagon::MEMw_SUBr_indexed_MEM_V4 : - case Hexagon::MEMw_ANDr_indexed_MEM_V4 : - case Hexagon::MEMw_ORr_indexed_MEM_V4 : - case Hexagon::MEMw_ADDSUBi_MEM_V4 : - case Hexagon::MEMw_ADDi_MEM_V4 : - case Hexagon::MEMw_SUBi_MEM_V4 : - case Hexagon::MEMw_ADDr_MEM_V4 : - case Hexagon::MEMw_SUBr_MEM_V4 : - case Hexagon::MEMw_ANDr_MEM_V4 : - case Hexagon::MEMw_ORr_MEM_V4 : - case Hexagon::MEMh_ADDSUBi_indexed_MEM_V4 : - case Hexagon::MEMh_ADDi_indexed_MEM_V4 : - case Hexagon::MEMh_SUBi_indexed_MEM_V4 : - case Hexagon::MEMh_ADDr_indexed_MEM_V4 : - case Hexagon::MEMh_SUBr_indexed_MEM_V4 : - case Hexagon::MEMh_ANDr_indexed_MEM_V4 : - case Hexagon::MEMh_ORr_indexed_MEM_V4 : - case Hexagon::MEMh_ADDSUBi_MEM_V4 : - case Hexagon::MEMh_ADDi_MEM_V4 : - case Hexagon::MEMh_SUBi_MEM_V4 : - case Hexagon::MEMh_ADDr_MEM_V4 : - case Hexagon::MEMh_SUBr_MEM_V4 : - case Hexagon::MEMh_ANDr_MEM_V4 : - case Hexagon::MEMh_ORr_MEM_V4 : - case Hexagon::MEMb_ADDSUBi_indexed_MEM_V4 : - case Hexagon::MEMb_ADDi_indexed_MEM_V4 : - case Hexagon::MEMb_SUBi_indexed_MEM_V4 : - case Hexagon::MEMb_ADDr_indexed_MEM_V4 : - case Hexagon::MEMb_SUBr_indexed_MEM_V4 : - case Hexagon::MEMb_ANDr_indexed_MEM_V4 : - case Hexagon::MEMb_ORr_indexed_MEM_V4 : - case Hexagon::MEMb_ADDSUBi_MEM_V4 : - case Hexagon::MEMb_ADDi_MEM_V4 : - case Hexagon::MEMb_SUBi_MEM_V4 : - case Hexagon::MEMb_ADDr_MEM_V4 : - case Hexagon::MEMb_SUBr_MEM_V4 : - case Hexagon::MEMb_ANDr_MEM_V4 : - case Hexagon::MEMb_ORr_MEM_V4 : - llvm_unreachable("Needs implementing"); - } -} - -unsigned HexagonInstrInfo::getNormalBranchForm(const MachineInstr* MI) const { - switch(MI->getOpcode()) { - default: llvm_unreachable("Unknown type of jump instruction"); - - // JMP_EQri - case Hexagon::JMP_EQriPt_ie_nv_V4: - return Hexagon::JMP_EQriPt_nv_V4; - case Hexagon::JMP_EQriNotPt_ie_nv_V4: - return Hexagon::JMP_EQriNotPt_nv_V4; - case Hexagon::JMP_EQriPnt_ie_nv_V4: - return Hexagon::JMP_EQriPnt_nv_V4; - case Hexagon::JMP_EQriNotPnt_ie_nv_V4: - return Hexagon::JMP_EQriNotPnt_nv_V4; - - // JMP_EQri -- with -1 - case Hexagon::JMP_EQriPtneg_ie_nv_V4: - return Hexagon::JMP_EQriPtneg_nv_V4; - case Hexagon::JMP_EQriNotPtneg_ie_nv_V4: - return Hexagon::JMP_EQriNotPtneg_nv_V4; - case Hexagon::JMP_EQriPntneg_ie_nv_V4: - return Hexagon::JMP_EQriPntneg_nv_V4; - case Hexagon::JMP_EQriNotPntneg_ie_nv_V4: - return Hexagon::JMP_EQriNotPntneg_nv_V4; - - // JMP_EQrr - case Hexagon::JMP_EQrrPt_ie_nv_V4: - return Hexagon::JMP_EQrrPt_nv_V4; - case Hexagon::JMP_EQrrNotPt_ie_nv_V4: - return Hexagon::JMP_EQrrNotPt_nv_V4; - case Hexagon::JMP_EQrrPnt_ie_nv_V4: - return Hexagon::JMP_EQrrPnt_nv_V4; - case Hexagon::JMP_EQrrNotPnt_ie_nv_V4: - return Hexagon::JMP_EQrrNotPnt_nv_V4; - - // JMP_GTri - case Hexagon::JMP_GTriPt_ie_nv_V4: - return Hexagon::JMP_GTriPt_nv_V4; - case Hexagon::JMP_GTriNotPt_ie_nv_V4: - return Hexagon::JMP_GTriNotPt_nv_V4; - case Hexagon::JMP_GTriPnt_ie_nv_V4: - return Hexagon::JMP_GTriPnt_nv_V4; - case Hexagon::JMP_GTriNotPnt_ie_nv_V4: - return Hexagon::JMP_GTriNotPnt_nv_V4; - - // JMP_GTri -- with -1 - case Hexagon::JMP_GTriPtneg_ie_nv_V4: - return Hexagon::JMP_GTriPtneg_nv_V4; - case Hexagon::JMP_GTriNotPtneg_ie_nv_V4: - return Hexagon::JMP_GTriNotPtneg_nv_V4; - case Hexagon::JMP_GTriPntneg_ie_nv_V4: - return Hexagon::JMP_GTriPntneg_nv_V4; - case Hexagon::JMP_GTriNotPntneg_ie_nv_V4: - return Hexagon::JMP_GTriNotPntneg_nv_V4; - - // JMP_GTrr - case Hexagon::JMP_GTrrPt_ie_nv_V4: - return Hexagon::JMP_GTrrPt_nv_V4; - case Hexagon::JMP_GTrrNotPt_ie_nv_V4: - return Hexagon::JMP_GTrrNotPt_nv_V4; - case Hexagon::JMP_GTrrPnt_ie_nv_V4: - return Hexagon::JMP_GTrrPnt_nv_V4; - case Hexagon::JMP_GTrrNotPnt_ie_nv_V4: - return Hexagon::JMP_GTrrNotPnt_nv_V4; - - // JMP_GTrrdn - case Hexagon::JMP_GTrrdnPt_ie_nv_V4: - return Hexagon::JMP_GTrrdnPt_nv_V4; - case Hexagon::JMP_GTrrdnNotPt_ie_nv_V4: - return Hexagon::JMP_GTrrdnNotPt_nv_V4; - case Hexagon::JMP_GTrrdnPnt_ie_nv_V4: - return Hexagon::JMP_GTrrdnPnt_nv_V4; - case Hexagon::JMP_GTrrdnNotPnt_ie_nv_V4: - return Hexagon::JMP_GTrrdnNotPnt_nv_V4; - - // JMP_GTUri - case Hexagon::JMP_GTUriPt_ie_nv_V4: - return Hexagon::JMP_GTUriPt_nv_V4; - case Hexagon::JMP_GTUriNotPt_ie_nv_V4: - return Hexagon::JMP_GTUriNotPt_nv_V4; - case Hexagon::JMP_GTUriPnt_ie_nv_V4: - return Hexagon::JMP_GTUriPnt_nv_V4; - case Hexagon::JMP_GTUriNotPnt_ie_nv_V4: - return Hexagon::JMP_GTUriNotPnt_nv_V4; - - // JMP_GTUrr - case Hexagon::JMP_GTUrrPt_ie_nv_V4: - return Hexagon::JMP_GTUrrPt_nv_V4; - case Hexagon::JMP_GTUrrNotPt_ie_nv_V4: - return Hexagon::JMP_GTUrrNotPt_nv_V4; - case Hexagon::JMP_GTUrrPnt_ie_nv_V4: - return Hexagon::JMP_GTUrrPnt_nv_V4; - case Hexagon::JMP_GTUrrNotPnt_ie_nv_V4: - return Hexagon::JMP_GTUrrNotPnt_nv_V4; - - // JMP_GTUrrdn - case Hexagon::JMP_GTUrrdnPt_ie_nv_V4: - return Hexagon::JMP_GTUrrdnPt_nv_V4; - case Hexagon::JMP_GTUrrdnNotPt_ie_nv_V4: - return Hexagon::JMP_GTUrrdnNotPt_nv_V4; - case Hexagon::JMP_GTUrrdnPnt_ie_nv_V4: - return Hexagon::JMP_GTUrrdnPnt_nv_V4; - case Hexagon::JMP_GTUrrdnNotPnt_ie_nv_V4: - return Hexagon::JMP_GTUrrdnNotPnt_nv_V4; - } -} - - -bool HexagonInstrInfo::isNewValueStore(const MachineInstr *MI) const { - switch (MI->getOpcode()) { - - // Store Byte - case Hexagon::STrib_nv_V4: - case Hexagon::STrib_indexed_nv_V4: - case Hexagon::STrib_indexed_shl_nv_V4: - case Hexagon::STrib_shl_nv_V4: - case Hexagon::STrib_GP_nv_V4: - case Hexagon::STb_GP_nv_V4: - case Hexagon::POST_STbri_nv_V4: - case Hexagon::STrib_cPt_nv_V4: - case Hexagon::STrib_cdnPt_nv_V4: - case Hexagon::STrib_cNotPt_nv_V4: - case Hexagon::STrib_cdnNotPt_nv_V4: - case Hexagon::STrib_indexed_cPt_nv_V4: - case Hexagon::STrib_indexed_cdnPt_nv_V4: - case Hexagon::STrib_indexed_cNotPt_nv_V4: - case Hexagon::STrib_indexed_cdnNotPt_nv_V4: - case Hexagon::STrib_indexed_shl_cPt_nv_V4: - case Hexagon::STrib_indexed_shl_cdnPt_nv_V4: - case Hexagon::STrib_indexed_shl_cNotPt_nv_V4: - case Hexagon::STrib_indexed_shl_cdnNotPt_nv_V4: - case Hexagon::POST_STbri_cPt_nv_V4: - case Hexagon::POST_STbri_cdnPt_nv_V4: - case Hexagon::POST_STbri_cNotPt_nv_V4: - case Hexagon::POST_STbri_cdnNotPt_nv_V4: - case Hexagon::STb_GP_cPt_nv_V4: - case Hexagon::STb_GP_cNotPt_nv_V4: - case Hexagon::STb_GP_cdnPt_nv_V4: - case Hexagon::STb_GP_cdnNotPt_nv_V4: - case Hexagon::STrib_GP_cPt_nv_V4: - case Hexagon::STrib_GP_cNotPt_nv_V4: - case Hexagon::STrib_GP_cdnPt_nv_V4: - case Hexagon::STrib_GP_cdnNotPt_nv_V4: - case Hexagon::STrib_abs_nv_V4: - case Hexagon::STrib_abs_cPt_nv_V4: - case Hexagon::STrib_abs_cdnPt_nv_V4: - case Hexagon::STrib_abs_cNotPt_nv_V4: - case Hexagon::STrib_abs_cdnNotPt_nv_V4: - case Hexagon::STrib_imm_abs_nv_V4: - case Hexagon::STrib_imm_abs_cPt_nv_V4: - case Hexagon::STrib_imm_abs_cdnPt_nv_V4: - case Hexagon::STrib_imm_abs_cNotPt_nv_V4: - case Hexagon::STrib_imm_abs_cdnNotPt_nv_V4: - - // Store Halfword - case Hexagon::STrih_nv_V4: - case Hexagon::STrih_indexed_nv_V4: - case Hexagon::STrih_indexed_shl_nv_V4: - case Hexagon::STrih_shl_nv_V4: - case Hexagon::STrih_GP_nv_V4: - case Hexagon::STh_GP_nv_V4: - case Hexagon::POST_SThri_nv_V4: - case Hexagon::STrih_cPt_nv_V4: - case Hexagon::STrih_cdnPt_nv_V4: - case Hexagon::STrih_cNotPt_nv_V4: - case Hexagon::STrih_cdnNotPt_nv_V4: - case Hexagon::STrih_indexed_cPt_nv_V4: - case Hexagon::STrih_indexed_cdnPt_nv_V4: - case Hexagon::STrih_indexed_cNotPt_nv_V4: - case Hexagon::STrih_indexed_cdnNotPt_nv_V4: - case Hexagon::STrih_indexed_shl_cPt_nv_V4: - case Hexagon::STrih_indexed_shl_cdnPt_nv_V4: - case Hexagon::STrih_indexed_shl_cNotPt_nv_V4: - case Hexagon::STrih_indexed_shl_cdnNotPt_nv_V4: - case Hexagon::POST_SThri_cPt_nv_V4: - case Hexagon::POST_SThri_cdnPt_nv_V4: - case Hexagon::POST_SThri_cNotPt_nv_V4: - case Hexagon::POST_SThri_cdnNotPt_nv_V4: - case Hexagon::STh_GP_cPt_nv_V4: - case Hexagon::STh_GP_cNotPt_nv_V4: - case Hexagon::STh_GP_cdnPt_nv_V4: - case Hexagon::STh_GP_cdnNotPt_nv_V4: - case Hexagon::STrih_GP_cPt_nv_V4: - case Hexagon::STrih_GP_cNotPt_nv_V4: - case Hexagon::STrih_GP_cdnPt_nv_V4: - case Hexagon::STrih_GP_cdnNotPt_nv_V4: - case Hexagon::STrih_abs_nv_V4: - case Hexagon::STrih_abs_cPt_nv_V4: - case Hexagon::STrih_abs_cdnPt_nv_V4: - case Hexagon::STrih_abs_cNotPt_nv_V4: - case Hexagon::STrih_abs_cdnNotPt_nv_V4: - case Hexagon::STrih_imm_abs_nv_V4: - case Hexagon::STrih_imm_abs_cPt_nv_V4: - case Hexagon::STrih_imm_abs_cdnPt_nv_V4: - case Hexagon::STrih_imm_abs_cNotPt_nv_V4: - case Hexagon::STrih_imm_abs_cdnNotPt_nv_V4: - - // Store Word - case Hexagon::STriw_nv_V4: - case Hexagon::STriw_indexed_nv_V4: - case Hexagon::STriw_indexed_shl_nv_V4: - case Hexagon::STriw_shl_nv_V4: - case Hexagon::STriw_GP_nv_V4: - case Hexagon::STw_GP_nv_V4: - case Hexagon::POST_STwri_nv_V4: - case Hexagon::STriw_cPt_nv_V4: - case Hexagon::STriw_cdnPt_nv_V4: - case Hexagon::STriw_cNotPt_nv_V4: - case Hexagon::STriw_cdnNotPt_nv_V4: - case Hexagon::STriw_indexed_cPt_nv_V4: - case Hexagon::STriw_indexed_cdnPt_nv_V4: - case Hexagon::STriw_indexed_cNotPt_nv_V4: - case Hexagon::STriw_indexed_cdnNotPt_nv_V4: - case Hexagon::STriw_indexed_shl_cPt_nv_V4: - case Hexagon::STriw_indexed_shl_cdnPt_nv_V4: - case Hexagon::STriw_indexed_shl_cNotPt_nv_V4: - case Hexagon::STriw_indexed_shl_cdnNotPt_nv_V4: - case Hexagon::POST_STwri_cPt_nv_V4: - case Hexagon::POST_STwri_cdnPt_nv_V4: - case Hexagon::POST_STwri_cNotPt_nv_V4: - case Hexagon::POST_STwri_cdnNotPt_nv_V4: - case Hexagon::STw_GP_cPt_nv_V4: - case Hexagon::STw_GP_cNotPt_nv_V4: - case Hexagon::STw_GP_cdnPt_nv_V4: - case Hexagon::STw_GP_cdnNotPt_nv_V4: - case Hexagon::STriw_GP_cPt_nv_V4: - case Hexagon::STriw_GP_cNotPt_nv_V4: - case Hexagon::STriw_GP_cdnPt_nv_V4: - case Hexagon::STriw_GP_cdnNotPt_nv_V4: - case Hexagon::STriw_abs_nv_V4: - case Hexagon::STriw_abs_cPt_nv_V4: - case Hexagon::STriw_abs_cdnPt_nv_V4: - case Hexagon::STriw_abs_cNotPt_nv_V4: - case Hexagon::STriw_abs_cdnNotPt_nv_V4: - case Hexagon::STriw_imm_abs_nv_V4: - case Hexagon::STriw_imm_abs_cPt_nv_V4: - case Hexagon::STriw_imm_abs_cdnPt_nv_V4: - case Hexagon::STriw_imm_abs_cNotPt_nv_V4: - case Hexagon::STriw_imm_abs_cdnNotPt_nv_V4: - return true; - - default: - return false; - } - return false; -} - -bool HexagonInstrInfo::isPostIncrement (const MachineInstr* MI) const { - switch (MI->getOpcode()) - { - // Load Byte - case Hexagon::POST_LDrib: - case Hexagon::POST_LDrib_cPt: - case Hexagon::POST_LDrib_cNotPt: - case Hexagon::POST_LDrib_cdnPt_V4: - case Hexagon::POST_LDrib_cdnNotPt_V4: - - // Load unsigned byte - case Hexagon::POST_LDriub: - case Hexagon::POST_LDriub_cPt: - case Hexagon::POST_LDriub_cNotPt: - case Hexagon::POST_LDriub_cdnPt_V4: - case Hexagon::POST_LDriub_cdnNotPt_V4: - - // Load halfword - case Hexagon::POST_LDrih: - case Hexagon::POST_LDrih_cPt: - case Hexagon::POST_LDrih_cNotPt: - case Hexagon::POST_LDrih_cdnPt_V4: - case Hexagon::POST_LDrih_cdnNotPt_V4: - - // Load unsigned halfword - case Hexagon::POST_LDriuh: - case Hexagon::POST_LDriuh_cPt: - case Hexagon::POST_LDriuh_cNotPt: - case Hexagon::POST_LDriuh_cdnPt_V4: - case Hexagon::POST_LDriuh_cdnNotPt_V4: - - // Load word - case Hexagon::POST_LDriw: - case Hexagon::POST_LDriw_cPt: - case Hexagon::POST_LDriw_cNotPt: - case Hexagon::POST_LDriw_cdnPt_V4: - case Hexagon::POST_LDriw_cdnNotPt_V4: - - // Load double word - case Hexagon::POST_LDrid: - case Hexagon::POST_LDrid_cPt: - case Hexagon::POST_LDrid_cNotPt: - case Hexagon::POST_LDrid_cdnPt_V4: - case Hexagon::POST_LDrid_cdnNotPt_V4: - - // Store byte - case Hexagon::POST_STbri: - case Hexagon::POST_STbri_cPt: - case Hexagon::POST_STbri_cNotPt: - case Hexagon::POST_STbri_cdnPt_V4: - case Hexagon::POST_STbri_cdnNotPt_V4: - - // Store halfword - case Hexagon::POST_SThri: - case Hexagon::POST_SThri_cPt: - case Hexagon::POST_SThri_cNotPt: - case Hexagon::POST_SThri_cdnPt_V4: - case Hexagon::POST_SThri_cdnNotPt_V4: - - // Store word - case Hexagon::POST_STwri: - case Hexagon::POST_STwri_cPt: - case Hexagon::POST_STwri_cNotPt: - case Hexagon::POST_STwri_cdnPt_V4: - case Hexagon::POST_STwri_cdnNotPt_V4: - - // Store double word - case Hexagon::POST_STdri: - case Hexagon::POST_STdri_cPt: - case Hexagon::POST_STdri_cNotPt: - case Hexagon::POST_STdri_cdnPt_V4: - case Hexagon::POST_STdri_cdnNotPt_V4: - return true; - - default: - return false; - } -} - -bool HexagonInstrInfo::isSaveCalleeSavedRegsCall(const MachineInstr *MI) const { - return MI->getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4; -} bool HexagonInstrInfo::isPredicable(MachineInstr *MI) const { bool isPred = MI->getDesc().isPredicable(); @@ -2445,24 +1587,6 @@ isSpillPredRegOp(const MachineInstr *MI) const { return false; } -bool HexagonInstrInfo:: -isConditionalTransfer (const MachineInstr *MI) const { - switch (MI->getOpcode()) { - case Hexagon::TFR_cPt: - case Hexagon::TFR_cNotPt: - case Hexagon::TFRI_cPt: - case Hexagon::TFRI_cNotPt: - case Hexagon::TFR_cdnPt: - case Hexagon::TFR_cdnNotPt: - case Hexagon::TFRI_cdnPt: - case Hexagon::TFRI_cdnNotPt: - return true; - - default: - return false; - } - return false; -} bool HexagonInstrInfo::isConditionalALU32 (const MachineInstr* MI) const { const HexagonRegisterInfo& QRI = getRegisterInfo(); @@ -2502,6 +1626,7 @@ bool HexagonInstrInfo::isConditionalALU32 (const MachineInstr* MI) const { } } + bool HexagonInstrInfo:: isConditionalLoad (const MachineInstr* MI) const { const HexagonRegisterInfo& QRI = getRegisterInfo(); @@ -2575,136 +1700,6 @@ isConditionalLoad (const MachineInstr* MI) const { } } -// Returns true if an instruction is a conditional store. -// -// Note: It doesn't include conditional new-value stores as they can't be -// converted to .new predicate. -// -// p.new NV store [ if(p0.new)memw(R0+#0)=R2.new ] -// ^ ^ -// / \ (not OK. it will cause new-value store to be -// / X conditional on p0.new while R2 producer is -// / \ on p0) -// / \. -// p.new store p.old NV store -// [if(p0.new)memw(R0+#0)=R2] [if(p0)memw(R0+#0)=R2.new] -// ^ ^ -// \ / -// \ / -// \ / -// p.old store -// [if (p0)memw(R0+#0)=R2] -// -// The above diagram shows the steps involoved in the conversion of a predicated -// store instruction to its .new predicated new-value form. -// -// The following set of instructions further explains the scenario where -// conditional new-value store becomes invalid when promoted to .new predicate -// form. -// -// { 1) if (p0) r0 = add(r1, r2) -// 2) p0 = cmp.eq(r3, #0) } -// -// 3) if (p0) memb(r1+#0) = r0 --> this instruction can't be grouped with -// the first two instructions because in instr 1, r0 is conditional on old value -// of p0 but its use in instr 3 is conditional on p0 modified by instr 2 which -// is not valid for new-value stores. -bool HexagonInstrInfo:: -isConditionalStore (const MachineInstr* MI) const { - const HexagonRegisterInfo& QRI = getRegisterInfo(); - switch (MI->getOpcode()) - { - case Hexagon::STrib_imm_cPt_V4 : - case Hexagon::STrib_imm_cNotPt_V4 : - case Hexagon::STrib_indexed_shl_cPt_V4 : - case Hexagon::STrib_indexed_shl_cNotPt_V4 : - case Hexagon::STrib_cPt : - case Hexagon::STrib_cNotPt : - case Hexagon::POST_STbri_cPt : - case Hexagon::POST_STbri_cNotPt : - case Hexagon::STrid_indexed_cPt : - case Hexagon::STrid_indexed_cNotPt : - case Hexagon::STrid_indexed_shl_cPt_V4 : - case Hexagon::POST_STdri_cPt : - case Hexagon::POST_STdri_cNotPt : - case Hexagon::STrih_cPt : - case Hexagon::STrih_cNotPt : - case Hexagon::STrih_indexed_cPt : - case Hexagon::STrih_indexed_cNotPt : - case Hexagon::STrih_imm_cPt_V4 : - case Hexagon::STrih_imm_cNotPt_V4 : - case Hexagon::STrih_indexed_shl_cPt_V4 : - case Hexagon::STrih_indexed_shl_cNotPt_V4 : - case Hexagon::POST_SThri_cPt : - case Hexagon::POST_SThri_cNotPt : - case Hexagon::STriw_cPt : - case Hexagon::STriw_cNotPt : - case Hexagon::STriw_indexed_cPt : - case Hexagon::STriw_indexed_cNotPt : - case Hexagon::STriw_imm_cPt_V4 : - case Hexagon::STriw_imm_cNotPt_V4 : - case Hexagon::STriw_indexed_shl_cPt_V4 : - case Hexagon::STriw_indexed_shl_cNotPt_V4 : - case Hexagon::POST_STwri_cPt : - case Hexagon::POST_STwri_cNotPt : - return QRI.Subtarget.hasV4TOps(); - - // V4 global address store before promoting to dot new. - case Hexagon::STrid_GP_cPt_V4 : - case Hexagon::STrid_GP_cNotPt_V4 : - case Hexagon::STrib_GP_cPt_V4 : - case Hexagon::STrib_GP_cNotPt_V4 : - case Hexagon::STrih_GP_cPt_V4 : - case Hexagon::STrih_GP_cNotPt_V4 : - case Hexagon::STriw_GP_cPt_V4 : - case Hexagon::STriw_GP_cNotPt_V4 : - case Hexagon::STd_GP_cPt_V4 : - case Hexagon::STd_GP_cNotPt_V4 : - case Hexagon::STb_GP_cPt_V4 : - case Hexagon::STb_GP_cNotPt_V4 : - case Hexagon::STh_GP_cPt_V4 : - case Hexagon::STh_GP_cNotPt_V4 : - case Hexagon::STw_GP_cPt_V4 : - case Hexagon::STw_GP_cNotPt_V4 : - return QRI.Subtarget.hasV4TOps(); - - // Predicated new value stores (i.e. if (p0) memw(..)=r0.new) are excluded - // from the "Conditional Store" list. Because a predicated new value store - // would NOT be promoted to a double dot new store. See diagram below: - // This function returns yes for those stores that are predicated but not - // yet promoted to predicate dot new instructions. - // - // +---------------------+ - // /-----| if (p0) memw(..)=r0 |---------\~ - // || +---------------------+ || - // promote || /\ /\ || promote - // || /||\ /||\ || - // \||/ demote || \||/ - // \/ || || \/ - // +-------------------------+ || +-------------------------+ - // | if (p0.new) memw(..)=r0 | || | if (p0) memw(..)=r0.new | - // +-------------------------+ || +-------------------------+ - // || || || - // || demote \||/ - // promote || \/ NOT possible - // || || /\~ - // \||/ || /||\~ - // \/ || || - // +-----------------------------+ - // | if (p0.new) memw(..)=r0.new | - // +-----------------------------+ - // Double Dot New Store - // - - default: - return false; - - } - return false; -} - - - DFAPacketizer *HexagonInstrInfo:: CreateTargetScheduleState(const TargetMachine *TM, const ScheduleDAG *DAG) const { diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfo.h b/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfo.h index 6a45871b67e..730687036c8 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfo.h +++ b/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfo.h @@ -160,20 +160,10 @@ public: bool isS8_Immediate(const int value) const; bool isS6_Immediate(const int value) const; - bool isSaveCalleeSavedRegsCall(const MachineInstr* MI) const; - bool isConditionalTransfer(const MachineInstr* MI) const; bool isConditionalALU32 (const MachineInstr* MI) const; bool isConditionalLoad (const MachineInstr* MI) const; - bool isConditionalStore(const MachineInstr* MI) const; bool isDeallocRet(const MachineInstr *MI) const; unsigned getInvertedPredicatedOpcode(const int Opc) const; - bool isExtendable(const MachineInstr* MI) const; - bool isExtended(const MachineInstr* MI) const; - bool isPostIncrement(const MachineInstr* MI) const; - bool isNewValueStore(const MachineInstr* MI) const; - bool isNewValueJump(const MachineInstr* MI) const; - unsigned getImmExtForm(const MachineInstr* MI) const; - unsigned getNormalBranchForm(const MachineInstr* MI) const; private: int getMatchingCondBranchOpcode(int Opc, bool sense) const; diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfo.td b/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfo.td index fd5adef0f63..b563ac3c613 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfo.td +++ b/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfo.td @@ -3046,7 +3046,3 @@ include "HexagonInstrInfoV3.td" //===----------------------------------------------------------------------===// include "HexagonInstrInfoV4.td" - -//===----------------------------------------------------------------------===// -// V4 Instructions - -//===----------------------------------------------------------------------===// diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfoV3.td b/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfoV3.td index 2bd6770efd7..a73897ee345 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfoV3.td +++ b/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfoV3.td @@ -41,11 +41,10 @@ let isCall = 1, neverHasSideEffects = 1, } -// Jump to address from register // if(p?.new) jumpr:t r? let isReturn = 1, isTerminator = 1, isBarrier = 1, Defs = [PC], Uses = [R31] in { - def JMPR_cdnPt_V3: JRInst<(outs), (ins PredRegs:$src1, IntRegs:$src2), + def JMPR_cPnewt: JRInst<(outs), (ins PredRegs:$src1, IntRegs:$src2), "if ($src1.new) jumpr:t $src2", []>, Requires<[HasV3T]>; } @@ -53,7 +52,7 @@ let isReturn = 1, isTerminator = 1, isBarrier = 1, // if (!p?.new) jumpr:t r? let isReturn = 1, isTerminator = 1, isBarrier = 1, Defs = [PC], Uses = [R31] in { - def JMPR_cdnNotPt_V3: JRInst<(outs), (ins PredRegs:$src1, IntRegs:$src2), + def JMPR_cNotPnewt: JRInst<(outs), (ins PredRegs:$src1, IntRegs:$src2), "if (!$src1.new) jumpr:t $src2", []>, Requires<[HasV3T]>; } @@ -62,7 +61,7 @@ let isReturn = 1, isTerminator = 1, isBarrier = 1, // if(p?.new) jumpr:nt r? let isReturn = 1, isTerminator = 1, isBarrier = 1, Defs = [PC], Uses = [R31] in { - def JMPR_cdnPnt: JRInst<(outs), (ins PredRegs:$src1, IntRegs:$src2), + def JMPR_cPnewNt: JRInst<(outs), (ins PredRegs:$src1, IntRegs:$src2), "if ($src1.new) jumpr:nt $src2", []>, Requires<[HasV3T]>; } @@ -70,7 +69,7 @@ let isReturn = 1, isTerminator = 1, isBarrier = 1, // if (!p?.new) jumpr:nt r? let isReturn = 1, isTerminator = 1, isBarrier = 1, Defs = [PC], Uses = [R31] in { - def JMPR_cdnNotPnt: JRInst<(outs), (ins PredRegs:$src1, IntRegs:$src2), + def JMPR_cNotPnewNt: JRInst<(outs), (ins PredRegs:$src1, IntRegs:$src2), "if (!$src1.new) jumpr:nt $src2", []>, Requires<[HasV3T]>; } @@ -87,22 +86,20 @@ let AddedComplexity = 200 in def MAXw_dd : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2), "$dst = max($src2, $src1)", - [(set (i64 DoubleRegs:$dst), - (i64 (select (i1 (setlt (i64 DoubleRegs:$src2), - (i64 DoubleRegs:$src1))), - (i64 DoubleRegs:$src1), - (i64 DoubleRegs:$src2))))]>, + [(set DoubleRegs:$dst, (select (i1 (setlt DoubleRegs:$src2, + DoubleRegs:$src1)), + DoubleRegs:$src1, + DoubleRegs:$src2))]>, Requires<[HasV3T]>; let AddedComplexity = 200 in def MINw_dd : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2), "$dst = min($src2, $src1)", - [(set (i64 DoubleRegs:$dst), - (i64 (select (i1 (setgt (i64 DoubleRegs:$src2), - (i64 DoubleRegs:$src1))), - (i64 DoubleRegs:$src1), - (i64 DoubleRegs:$src2))))]>, + [(set DoubleRegs:$dst, (select (i1 (setgt DoubleRegs:$src2, + DoubleRegs:$src1)), + DoubleRegs:$src1, + DoubleRegs:$src2))]>, Requires<[HasV3T]>; //===----------------------------------------------------------------------===// @@ -112,25 +109,25 @@ Requires<[HasV3T]>; -//def : Pat <(brcond (i1 (seteq (i32 IntRegs:$src1), 0)), bb:$offset), -// (JMP_RegEzt (i32 IntRegs:$src1), bb:$offset)>, Requires<[HasV3T]>; +//def : Pat <(brcond (i1 (seteq IntRegs:$src1, 0)), bb:$offset), +// (JMP_RegEzt IntRegs:$src1, bb:$offset)>, Requires<[HasV3T]>; -//def : Pat <(brcond (i1 (setne (i32 IntRegs:$src1), 0)), bb:$offset), -// (JMP_RegNzt (i32 IntRegs:$src1), bb:$offset)>, Requires<[HasV3T]>; +//def : Pat <(brcond (i1 (setne IntRegs:$src1, 0)), bb:$offset), +// (JMP_RegNzt IntRegs:$src1, bb:$offset)>, Requires<[HasV3T]>; -//def : Pat <(brcond (i1 (setle (i32 IntRegs:$src1), 0)), bb:$offset), -// (JMP_RegLezt (i32 IntRegs:$src1), bb:$offset)>, Requires<[HasV3T]>; +//def : Pat <(brcond (i1 (setle IntRegs:$src1, 0)), bb:$offset), +// (JMP_RegLezt IntRegs:$src1, bb:$offset)>, Requires<[HasV3T]>; -//def : Pat <(brcond (i1 (setge (i32 IntRegs:$src1), 0)), bb:$offset), -// (JMP_RegGezt (i32 IntRegs:$src1), bb:$offset)>, Requires<[HasV3T]>; +//def : Pat <(brcond (i1 (setge IntRegs:$src1, 0)), bb:$offset), +// (JMP_RegGezt IntRegs:$src1, bb:$offset)>, Requires<[HasV3T]>; -//def : Pat <(brcond (i1 (setgt (i32 IntRegs:$src1), -1)), bb:$offset), -// (JMP_RegGezt (i32 IntRegs:$src1), bb:$offset)>, Requires<[HasV3T]>; +//def : Pat <(brcond (i1 (setgt IntRegs:$src1, -1)), bb:$offset), +// (JMP_RegGezt IntRegs:$src1, bb:$offset)>, Requires<[HasV3T]>; // Map call instruction -def : Pat<(call (i32 IntRegs:$dst)), - (CALLRv3 (i32 IntRegs:$dst))>, Requires<[HasV3T]>; +def : Pat<(call IntRegs:$dst), + (CALLRv3 IntRegs:$dst)>, Requires<[HasV3T]>; def : Pat<(call tglobaladdr:$dst), (CALLv3 tglobaladdr:$dst)>, Requires<[HasV3T]>; def : Pat<(call texternalsym:$dst), diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfoV4.td b/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfoV4.td index f507e4f37c1..9e60cf26d08 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfoV4.td +++ b/contrib/llvm/lib/Target/Hexagon/HexagonInstrInfoV4.td @@ -11,11 +11,6 @@ // //===----------------------------------------------------------------------===// -def IMMEXT : Immext<(outs), (ins), - "##immext //should never emit this", - []>, - Requires<[HasV4T]>; - // Hexagon V4 Architecture spec defines 8 instruction classes: // LD ST ALU32 XTYPE J JR MEMOP NV CR SYSTEM(system is not implemented in the // compiler) @@ -255,151 +250,23 @@ def ZXTH_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst), []>, Requires<[HasV4T]>; -// Generate frame index addresses. -let neverHasSideEffects = 1, isReMaterializable = 1 in -def TFR_FI_immext_V4 : ALU32_ri<(outs IntRegs:$dst), - (ins IntRegs:$src1, s32Imm:$offset), - "$dst = add($src1, ##$offset)", - []>, - Requires<[HasV4T]>; - //===----------------------------------------------------------------------===// // ALU32 - //===----------------------------------------------------------------------===// -//===----------------------------------------------------------------------===// -// ALU32/PERM + -//===----------------------------------------------------------------------===// - -// Combine -// Rdd=combine(Rs, #s8) -let neverHasSideEffects = 1 in -def COMBINE_ri_V4 : ALU32_ri<(outs DoubleRegs:$dst), - (ins IntRegs:$src1, s8Imm:$src2), - "$dst = combine($src1, #$src2)", - []>, - Requires<[HasV4T]>; -// Rdd=combine(#s8, Rs) -let neverHasSideEffects = 1 in -def COMBINE_ir_V4 : ALU32_ir<(outs DoubleRegs:$dst), - (ins s8Imm:$src1, IntRegs:$src2), - "$dst = combine(#$src1, $src2)", - []>, - Requires<[HasV4T]>; -//===----------------------------------------------------------------------===// -// ALU32/PERM + -//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // LD + //===----------------------------------------------------------------------===// -// -// These absolute set addressing mode instructions accept immediate as -// an operand. We have duplicated these patterns to take global address. +/// +/// Make sure that in post increment load, the first operand is always the post +/// increment operand. +/// +//// Load doubleword. +// Rdd=memd(Re=#U6) -let neverHasSideEffects = 1 in -def LDrid_abs_setimm_V4 : LDInst<(outs DoubleRegs:$dst1, IntRegs:$dst2), - (ins u6Imm:$addr), - "$dst1 = memd($dst2=#$addr)", - []>, - Requires<[HasV4T]>; - -// Rd=memb(Re=#U6) -let neverHasSideEffects = 1 in -def LDrib_abs_setimm_V4 : LDInst<(outs IntRegs:$dst1, IntRegs:$dst2), - (ins u6Imm:$addr), - "$dst1 = memb($dst2=#$addr)", - []>, - Requires<[HasV4T]>; - -// Rd=memh(Re=#U6) -let neverHasSideEffects = 1 in -def LDrih_abs_setimm_V4 : LDInst<(outs IntRegs:$dst1, IntRegs:$dst2), - (ins u6Imm:$addr), - "$dst1 = memh($dst2=#$addr)", - []>, - Requires<[HasV4T]>; - -// Rd=memub(Re=#U6) -let neverHasSideEffects = 1 in -def LDriub_abs_setimm_V4 : LDInst<(outs IntRegs:$dst1, IntRegs:$dst2), - (ins u6Imm:$addr), - "$dst1 = memub($dst2=#$addr)", - []>, - Requires<[HasV4T]>; - -// Rd=memuh(Re=#U6) -let neverHasSideEffects = 1 in -def LDriuh_abs_setimm_V4 : LDInst<(outs IntRegs:$dst1, IntRegs:$dst2), - (ins u6Imm:$addr), - "$dst1 = memuh($dst2=#$addr)", - []>, - Requires<[HasV4T]>; - -// Rd=memw(Re=#U6) -let neverHasSideEffects = 1 in -def LDriw_abs_setimm_V4 : LDInst<(outs IntRegs:$dst1, IntRegs:$dst2), - (ins u6Imm:$addr), - "$dst1 = memw($dst2=#$addr)", - []>, - Requires<[HasV4T]>; - -// Following patterns are defined for absolute set addressing mode -// instruction which take global address as operand. -let mayLoad = 1, neverHasSideEffects = 1 in -def LDrid_abs_set_V4 : LDInst<(outs DoubleRegs:$dst1, IntRegs:$dst2), - (ins globaladdress:$addr), - "$dst1 = memd($dst2=##$addr)", - []>, - Requires<[HasV4T]>; - -// Rd=memb(Re=#U6) -let mayLoad = 1, neverHasSideEffects = 1 in -def LDrib_abs_set_V4 : LDInst<(outs IntRegs:$dst1, IntRegs:$dst2), - (ins globaladdress:$addr), - "$dst1 = memb($dst2=##$addr)", - []>, - Requires<[HasV4T]>; - -// Rd=memh(Re=#U6) -let mayLoad = 1, neverHasSideEffects = 1 in -def LDrih_abs_set_V4 : LDInst<(outs IntRegs:$dst1, IntRegs:$dst2), - (ins globaladdress:$addr), - "$dst1 = memh($dst2=##$addr)", - []>, - Requires<[HasV4T]>; - -// Rd=memub(Re=#U6) -let mayLoad = 1, neverHasSideEffects = 1 in -def LDriub_abs_set_V4 : LDInst<(outs IntRegs:$dst1, IntRegs:$dst2), - (ins globaladdress:$addr), - "$dst1 = memub($dst2=##$addr)", - []>, - Requires<[HasV4T]>; - -// Rd=memuh(Re=#U6) -let mayLoad = 1, neverHasSideEffects = 1 in -def LDriuh_abs_set_V4 : LDInst<(outs IntRegs:$dst1, IntRegs:$dst2), - (ins globaladdress:$addr), - "$dst1 = memuh($dst2=##$addr)", - []>, - Requires<[HasV4T]>; - -// Rd=memw(Re=#U6) -let mayLoad = 1, neverHasSideEffects = 1 in -def LDriw_abs_set_V4 : LDInst<(outs IntRegs:$dst1, IntRegs:$dst2), - (ins globaladdress:$addr), - "$dst1 = memw($dst2=##$addr)", - []>, - Requires<[HasV4T]>; - -// Load doubleword. -// -// Make sure that in post increment load, the first operand is always the post -// increment operand. -// // Rdd=memd(Rs+Rt<<#u2) // Special case pattern for indexed load without offset which is easier to // match. AddedComplexity of this pattern should be lower than base+offset load @@ -409,19 +276,17 @@ let AddedComplexity = 10, isPredicable = 1 in def LDrid_indexed_V4 : LDInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst=memd($src1+$src2<<#0)", - [(set (i64 DoubleRegs:$dst), - (i64 (load (add (i32 IntRegs:$src1), - (i32 IntRegs:$src2)))))]>, + [(set DoubleRegs:$dst, (load (add IntRegs:$src1, + IntRegs:$src2)))]>, Requires<[HasV4T]>; let AddedComplexity = 40, isPredicable = 1 in def LDrid_indexed_shl_V4 : LDInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), "$dst=memd($src1+$src2<<#$offset)", - [(set (i64 DoubleRegs:$dst), - (i64 (load (add (i32 IntRegs:$src1), - (shl (i32 IntRegs:$src2), - u2ImmPred:$offset)))))]>, + [(set DoubleRegs:$dst, (load (add IntRegs:$src1, + (shl IntRegs:$src2, + u2ImmPred:$offset))))]>, Requires<[HasV4T]>; //// Load doubleword conditionally. @@ -497,62 +362,60 @@ def LDrid_indexed_shl_cdnNotPt_V4 : LDInst<(outs DoubleRegs:$dst), // Rdd=memd(Rt<<#u2+#U6) //// Load byte. +// Rd=memb(Re=#U6) + // Rd=memb(Rs+Rt<<#u2) let AddedComplexity = 10, isPredicable = 1 in def LDrib_indexed_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst=memb($src1+$src2<<#0)", - [(set (i32 IntRegs:$dst), - (i32 (sextloadi8 (add (i32 IntRegs:$src1), - (i32 IntRegs:$src2)))))]>, + [(set IntRegs:$dst, (sextloadi8 (add IntRegs:$src1, + IntRegs:$src2)))]>, Requires<[HasV4T]>; let AddedComplexity = 10, isPredicable = 1 in def LDriub_indexed_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst=memub($src1+$src2<<#0)", - [(set (i32 IntRegs:$dst), - (i32 (zextloadi8 (add (i32 IntRegs:$src1), - (i32 IntRegs:$src2)))))]>, + [(set IntRegs:$dst, (zextloadi8 (add IntRegs:$src1, + IntRegs:$src2)))]>, Requires<[HasV4T]>; let AddedComplexity = 10, isPredicable = 1 in def LDriub_ae_indexed_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst=memub($src1+$src2<<#0)", - [(set (i32 IntRegs:$dst), - (i32 (extloadi8 (add (i32 IntRegs:$src1), - (i32 IntRegs:$src2)))))]>, + [(set IntRegs:$dst, (extloadi8 (add IntRegs:$src1, + IntRegs:$src2)))]>, Requires<[HasV4T]>; let AddedComplexity = 40, isPredicable = 1 in def LDrib_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), "$dst=memb($src1+$src2<<#$offset)", - [(set (i32 IntRegs:$dst), - (i32 (sextloadi8 (add (i32 IntRegs:$src1), - (shl (i32 IntRegs:$src2), - u2ImmPred:$offset)))))]>, + [(set IntRegs:$dst, + (sextloadi8 (add IntRegs:$src1, + (shl IntRegs:$src2, + u2ImmPred:$offset))))]>, Requires<[HasV4T]>; let AddedComplexity = 40, isPredicable = 1 in def LDriub_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), "$dst=memub($src1+$src2<<#$offset)", - [(set (i32 IntRegs:$dst), - (i32 (zextloadi8 (add (i32 IntRegs:$src1), - (shl (i32 IntRegs:$src2), - u2ImmPred:$offset)))))]>, + [(set IntRegs:$dst, + (zextloadi8 (add IntRegs:$src1, + (shl IntRegs:$src2, + u2ImmPred:$offset))))]>, Requires<[HasV4T]>; let AddedComplexity = 40, isPredicable = 1 in def LDriub_ae_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), "$dst=memub($src1+$src2<<#$offset)", - [(set (i32 IntRegs:$dst), - (i32 (extloadi8 (add (i32 IntRegs:$src1), - (shl (i32 IntRegs:$src2), - u2ImmPred:$offset)))))]>, + [(set IntRegs:$dst, (extloadi8 (add IntRegs:$src1, + (shl IntRegs:$src2, + u2ImmPred:$offset))))]>, Requires<[HasV4T]>; //// Load byte conditionally. @@ -698,32 +561,31 @@ def LDriub_indexed_shl_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), // Rd=memb(Rt<<#u2+#U6) //// Load halfword +// Rd=memh(Re=#U6) + // Rd=memh(Rs+Rt<<#u2) let AddedComplexity = 10, isPredicable = 1 in def LDrih_indexed_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst=memh($src1+$src2<<#0)", - [(set (i32 IntRegs:$dst), - (i32 (sextloadi16 (add (i32 IntRegs:$src1), - (i32 IntRegs:$src2)))))]>, + [(set IntRegs:$dst, (sextloadi16 (add IntRegs:$src1, + IntRegs:$src2)))]>, Requires<[HasV4T]>; let AddedComplexity = 10, isPredicable = 1 in def LDriuh_indexed_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst=memuh($src1+$src2<<#0)", - [(set (i32 IntRegs:$dst), - (i32 (zextloadi16 (add (i32 IntRegs:$src1), - (i32 IntRegs:$src2)))))]>, + [(set IntRegs:$dst, (zextloadi16 (add IntRegs:$src1, + IntRegs:$src2)))]>, Requires<[HasV4T]>; let AddedComplexity = 10, isPredicable = 1 in def LDriuh_ae_indexed_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst=memuh($src1+$src2<<#0)", - [(set (i32 IntRegs:$dst), - (i32 (extloadi16 (add (i32 IntRegs:$src1), - (i32 IntRegs:$src2)))))]>, + [(set IntRegs:$dst, (extloadi16 (add IntRegs:$src1, + IntRegs:$src2)))]>, Requires<[HasV4T]>; // Rd=memh(Rs+Rt<<#u2) @@ -731,30 +593,30 @@ let AddedComplexity = 40, isPredicable = 1 in def LDrih_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), "$dst=memh($src1+$src2<<#$offset)", - [(set (i32 IntRegs:$dst), - (i32 (sextloadi16 (add (i32 IntRegs:$src1), - (shl (i32 IntRegs:$src2), - u2ImmPred:$offset)))))]>, + [(set IntRegs:$dst, + (sextloadi16 (add IntRegs:$src1, + (shl IntRegs:$src2, + u2ImmPred:$offset))))]>, Requires<[HasV4T]>; let AddedComplexity = 40, isPredicable = 1 in def LDriuh_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), "$dst=memuh($src1+$src2<<#$offset)", - [(set (i32 IntRegs:$dst), - (i32 (zextloadi16 (add (i32 IntRegs:$src1), - (shl (i32 IntRegs:$src2), - u2ImmPred:$offset)))))]>, + [(set IntRegs:$dst, + (zextloadi16 (add IntRegs:$src1, + (shl IntRegs:$src2, + u2ImmPred:$offset))))]>, Requires<[HasV4T]>; let AddedComplexity = 40, isPredicable = 1 in def LDriuh_ae_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), "$dst=memuh($src1+$src2<<#$offset)", - [(set (i32 IntRegs:$dst), - (i32 (extloadi16 (add (i32 IntRegs:$src1), - (shl (i32 IntRegs:$src2), - u2ImmPred:$offset)))))]>, + [(set IntRegs:$dst, + (extloadi16 (add IntRegs:$src1, + (shl IntRegs:$src2, + u2ImmPred:$offset))))]>, Requires<[HasV4T]>; //// Load halfword conditionally. @@ -900,14 +762,6 @@ def LDriuh_indexed_shl_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), // Rd=memh(Rt<<#u2+#U6) //// Load word. -// Load predicate: Fix for bug 5279. -let mayLoad = 1, neverHasSideEffects = 1 in -def LDriw_pred_V4 : LDInst<(outs PredRegs:$dst), - (ins MEMri:$addr), - "Error; should not emit", - []>, - Requires<[HasV4T]>; - // Rd=memw(Re=#U6) // Rd=memw(Rs+Rt<<#u2) @@ -915,9 +769,8 @@ let AddedComplexity = 10, isPredicable = 1 in def LDriw_indexed_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst=memw($src1+$src2<<#0)", - [(set (i32 IntRegs:$dst), - (i32 (load (add (i32 IntRegs:$src1), - (i32 IntRegs:$src2)))))]>, + [(set IntRegs:$dst, (load (add IntRegs:$src1, + IntRegs:$src2)))]>, Requires<[HasV4T]>; // Rd=memw(Rs+Rt<<#u2) @@ -925,10 +778,9 @@ let AddedComplexity = 40, isPredicable = 1 in def LDriw_indexed_shl_V4 : LDInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset), "$dst=memw($src1+$src2<<#$offset)", - [(set (i32 IntRegs:$dst), - (i32 (load (add (i32 IntRegs:$src1), - (shl (i32 IntRegs:$src2), - u2ImmPred:$offset)))))]>, + [(set IntRegs:$dst, (load (add IntRegs:$src1, + (shl IntRegs:$src2, + u2ImmPred:$offset))))]>, Requires<[HasV4T]>; //// Load word conditionally. @@ -1103,633 +955,6 @@ def POST_LDriw_cdnNotPt_V4 : LDInstPI<(outs IntRegs:$dst1, IntRegs:$dst2), "$src2 = $dst2">, Requires<[HasV4T]>; -/// Load from global offset - -let isPredicable = 1, mayLoad = 1, neverHasSideEffects = 1 in -def LDrid_GP_V4 : LDInst<(outs DoubleRegs:$dst), - (ins globaladdress:$global, u16Imm:$offset), - "$dst=memd(#$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDrid_GP_cPt_V4 : LDInst<(outs DoubleRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if ($src1) $dst=memd(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDrid_GP_cNotPt_V4 : LDInst<(outs DoubleRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if (!$src1) $dst=memd(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDrid_GP_cdnPt_V4 : LDInst<(outs DoubleRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if ($src1.new) $dst=memd(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDrid_GP_cdnNotPt_V4 : LDInst<(outs DoubleRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if (!$src1.new) $dst=memd(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let isPredicable = 1, mayLoad = 1, neverHasSideEffects = 1 in -def LDrib_GP_V4 : LDInst<(outs IntRegs:$dst), - (ins globaladdress:$global, u16Imm:$offset), - "$dst=memb(#$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDrib_GP_cPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if ($src1) $dst=memb(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDrib_GP_cNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if (!$src1) $dst=memb(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDrib_GP_cdnPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if ($src1.new) $dst=memb(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDrib_GP_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if (!$src1.new) $dst=memb(##$global+$offset)", - []>, - Requires<[HasV4T]>; - - -let isPredicable = 1, mayLoad = 1, neverHasSideEffects = 1 in -def LDriub_GP_V4 : LDInst<(outs IntRegs:$dst), - (ins globaladdress:$global, u16Imm:$offset), - "$dst=memub(#$global+$offset)", - []>, - Requires<[HasV4T]>; - - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDriub_GP_cPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if ($src1) $dst=memub(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDriub_GP_cNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if (!$src1) $dst=memub(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDriub_GP_cdnPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if ($src1.new) $dst=memub(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDriub_GP_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if (!$src1.new) $dst=memub(##$global+$offset)", - []>, - Requires<[HasV4T]>; - - -let isPredicable = 1, mayLoad = 1, neverHasSideEffects = 1 in -def LDrih_GP_V4 : LDInst<(outs IntRegs:$dst), - (ins globaladdress:$global, u16Imm:$offset), - "$dst=memh(#$global+$offset)", - []>, - Requires<[HasV4T]>; - - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDrih_GP_cPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if ($src1) $dst=memh(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDrih_GP_cNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if (!$src1) $dst=memh(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDrih_GP_cdnPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if ($src1.new) $dst=memh(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDrih_GP_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if (!$src1.new) $dst=memh(##$global+$offset)", - []>, - Requires<[HasV4T]>; - - -let isPredicable = 1, mayLoad = 1, neverHasSideEffects = 1 in -def LDriuh_GP_V4 : LDInst<(outs IntRegs:$dst), - (ins globaladdress:$global, u16Imm:$offset), - "$dst=memuh(#$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDriuh_GP_cPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if ($src1) $dst=memuh(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDriuh_GP_cNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if (!$src1) $dst=memuh(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDriuh_GP_cdnPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if ($src1.new) $dst=memuh(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDriuh_GP_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if (!$src1.new) $dst=memuh(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let isPredicable = 1, mayLoad = 1, neverHasSideEffects = 1 in -def LDriw_GP_V4 : LDInst<(outs IntRegs:$dst), - (ins globaladdress:$global, u16Imm:$offset), - "$dst=memw(#$global+$offset)", - []>, - Requires<[HasV4T]>; - - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDriw_GP_cPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if ($src1) $dst=memw(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDriw_GP_cNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if (!$src1) $dst=memw(##$global+$offset)", - []>, - Requires<[HasV4T]>; - - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDriw_GP_cdnPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if ($src1.new) $dst=memw(##$global+$offset)", - []>, - Requires<[HasV4T]>; - -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDriw_GP_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset), - "if (!$src1.new) $dst=memw(##$global+$offset)", - []>, - Requires<[HasV4T]>; - - -let isPredicable = 1, mayLoad = 1, neverHasSideEffects = 1 in -def LDd_GP_V4 : LDInst<(outs DoubleRegs:$dst), - (ins globaladdress:$global), - "$dst=memd(#$global)", - []>, - Requires<[HasV4T]>; - -// if (Pv) Rtt=memd(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDd_GP_cPt_V4 : LDInst<(outs DoubleRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if ($src1) $dst=memd(##$global)", - []>, - Requires<[HasV4T]>; - - -// if (!Pv) Rtt=memd(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDd_GP_cNotPt_V4 : LDInst<(outs DoubleRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if (!$src1) $dst=memd(##$global)", - []>, - Requires<[HasV4T]>; - -// if (Pv) Rtt=memd(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDd_GP_cdnPt_V4 : LDInst<(outs DoubleRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if ($src1.new) $dst=memd(##$global)", - []>, - Requires<[HasV4T]>; - - -// if (!Pv) Rtt=memd(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDd_GP_cdnNotPt_V4 : LDInst<(outs DoubleRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if (!$src1.new) $dst=memd(##$global)", - []>, - Requires<[HasV4T]>; - -let isPredicable = 1, mayLoad = 1, neverHasSideEffects = 1 in -def LDb_GP_V4 : LDInst<(outs IntRegs:$dst), - (ins globaladdress:$global), - "$dst=memb(#$global)", - []>, - Requires<[HasV4T]>; - -// if (Pv) Rt=memb(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDb_GP_cPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if ($src1) $dst=memb(##$global)", - []>, - Requires<[HasV4T]>; - -// if (!Pv) Rt=memb(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDb_GP_cNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if (!$src1) $dst=memb(##$global)", - []>, - Requires<[HasV4T]>; - -// if (Pv) Rt=memb(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDb_GP_cdnPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if ($src1.new) $dst=memb(##$global)", - []>, - Requires<[HasV4T]>; - -// if (!Pv) Rt=memb(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDb_GP_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if (!$src1.new) $dst=memb(##$global)", - []>, - Requires<[HasV4T]>; - -let isPredicable = 1, mayLoad = 1, neverHasSideEffects = 1 in -def LDub_GP_V4 : LDInst<(outs IntRegs:$dst), - (ins globaladdress:$global), - "$dst=memub(#$global)", - []>, - Requires<[HasV4T]>; - -// if (Pv) Rt=memub(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDub_GP_cPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if ($src1) $dst=memub(##$global)", - []>, - Requires<[HasV4T]>; - - -// if (!Pv) Rt=memub(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDub_GP_cNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if (!$src1) $dst=memub(##$global)", - []>, - Requires<[HasV4T]>; - -// if (Pv) Rt=memub(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDub_GP_cdnPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if ($src1.new) $dst=memub(##$global)", - []>, - Requires<[HasV4T]>; - - -// if (!Pv) Rt=memub(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDub_GP_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if (!$src1.new) $dst=memub(##$global)", - []>, - Requires<[HasV4T]>; - -let isPredicable = 1, mayLoad = 1, neverHasSideEffects = 1 in -def LDh_GP_V4 : LDInst<(outs IntRegs:$dst), - (ins globaladdress:$global), - "$dst=memh(#$global)", - []>, - Requires<[HasV4T]>; - -// if (Pv) Rt=memh(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDh_GP_cPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if ($src1) $dst=memh(##$global)", - []>, - Requires<[HasV4T]>; - -// if (!Pv) Rt=memh(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDh_GP_cNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if (!$src1) $dst=memh(##$global)", - []>, - Requires<[HasV4T]>; - -// if (Pv) Rt=memh(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDh_GP_cdnPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if ($src1.new) $dst=memh(##$global)", - []>, - Requires<[HasV4T]>; - -// if (!Pv) Rt=memh(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDh_GP_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if (!$src1.new) $dst=memh(##$global)", - []>, - Requires<[HasV4T]>; - -let isPredicable = 1, mayLoad = 1, neverHasSideEffects = 1 in -def LDuh_GP_V4 : LDInst<(outs IntRegs:$dst), - (ins globaladdress:$global), - "$dst=memuh(#$global)", - []>, - Requires<[HasV4T]>; - -// if (Pv) Rt=memuh(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDuh_GP_cPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if ($src1) $dst=memuh(##$global)", - []>, - Requires<[HasV4T]>; - -// if (!Pv) Rt=memuh(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDuh_GP_cNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if (!$src1) $dst=memuh(##$global)", - []>, - Requires<[HasV4T]>; - -// if (Pv) Rt=memuh(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDuh_GP_cdnPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if ($src1.new) $dst=memuh(##$global)", - []>, - Requires<[HasV4T]>; - -// if (!Pv) Rt=memuh(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDuh_GP_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if (!$src1.new) $dst=memuh(##$global)", - []>, - Requires<[HasV4T]>; - -let isPredicable = 1, mayLoad = 1, neverHasSideEffects = 1 in -def LDw_GP_V4 : LDInst<(outs IntRegs:$dst), - (ins globaladdress:$global), - "$dst=memw(#$global)", - []>, - Requires<[HasV4T]>; - -// if (Pv) Rt=memw(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDw_GP_cPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if ($src1) $dst=memw(##$global)", - []>, - Requires<[HasV4T]>; - - -// if (!Pv) Rt=memw(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDw_GP_cNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if (!$src1) $dst=memw(##$global)", - []>, - Requires<[HasV4T]>; - -// if (Pv) Rt=memw(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDw_GP_cdnPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if ($src1.new) $dst=memw(##$global)", - []>, - Requires<[HasV4T]>; - - -// if (!Pv) Rt=memw(##global) -let mayLoad = 1, neverHasSideEffects = 1, isPredicated = 1 in -def LDw_GP_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$global), - "if (!$src1.new) $dst=memw(##$global)", - []>, - Requires<[HasV4T]>; - - - -def : Pat <(atomic_load_64 (HexagonCONST32_GP tglobaladdr:$global)), - (i64 (LDd_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -def : Pat <(atomic_load_32 (HexagonCONST32_GP tglobaladdr:$global)), - (i32 (LDw_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -def : Pat <(atomic_load_16 (HexagonCONST32_GP tglobaladdr:$global)), - (i32 (LDuh_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -def : Pat <(atomic_load_8 (HexagonCONST32_GP tglobaladdr:$global)), - (i32 (LDub_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress) -> memw(#foo + 0) -let AddedComplexity = 100 in -def : Pat <(i64 (load (HexagonCONST32_GP tglobaladdr:$global))), - (i64 (LDd_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -// Map from Pd = load(globaladdress) -> Rd = memb(globaladdress), Pd = Rd -let AddedComplexity = 100 in -def : Pat <(i1 (load (HexagonCONST32_GP tglobaladdr:$global))), - (i1 (TFR_PdRs (i32 (LDb_GP_V4 tglobaladdr:$global))))>, - Requires<[HasV4T]>; - -// When the Interprocedural Global Variable optimizer realizes that a certain -// global variable takes only two constant values, it shrinks the global to -// a boolean. Catch those loads here in the following 3 patterns. -let AddedComplexity = 100 in -def : Pat <(i32 (extloadi1 (HexagonCONST32_GP tglobaladdr:$global))), - (i32 (LDb_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -let AddedComplexity = 100 in -def : Pat <(i32 (sextloadi1 (HexagonCONST32_GP tglobaladdr:$global))), - (i32 (LDb_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress) -> memb(#foo) -let AddedComplexity = 100 in -def : Pat <(i32 (extloadi8 (HexagonCONST32_GP tglobaladdr:$global))), - (i32 (LDb_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress) -> memb(#foo) -let AddedComplexity = 100 in -def : Pat <(i32 (sextloadi8 (HexagonCONST32_GP tglobaladdr:$global))), - (i32 (LDb_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -let AddedComplexity = 100 in -def : Pat <(i32 (zextloadi1 (HexagonCONST32_GP tglobaladdr:$global))), - (i32 (LDub_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress) -> memub(#foo) -let AddedComplexity = 100 in -def : Pat <(i32 (zextloadi8 (HexagonCONST32_GP tglobaladdr:$global))), - (i32 (LDub_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress) -> memh(#foo) -let AddedComplexity = 100 in -def : Pat <(i32 (extloadi16 (HexagonCONST32_GP tglobaladdr:$global))), - (i32 (LDh_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress) -> memh(#foo) -let AddedComplexity = 100 in -def : Pat <(i32 (sextloadi16 (HexagonCONST32_GP tglobaladdr:$global))), - (i32 (LDh_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress) -> memuh(#foo) -let AddedComplexity = 100 in -def : Pat <(i32 (zextloadi16 (HexagonCONST32_GP tglobaladdr:$global))), - (i32 (LDuh_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress) -> memw(#foo) -let AddedComplexity = 100 in -def : Pat <(i32 (load (HexagonCONST32_GP tglobaladdr:$global))), - (i32 (LDw_GP_V4 tglobaladdr:$global))>, - Requires<[HasV4T]>; - -def : Pat <(atomic_load_64 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset)), - (i64 (LDrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, - Requires<[HasV4T]>; - -def : Pat <(atomic_load_32 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset)), - (i32 (LDriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, - Requires<[HasV4T]>; - -def : Pat <(atomic_load_16 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset)), - (i32 (LDriuh_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, - Requires<[HasV4T]>; - -def : Pat <(atomic_load_8 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset)), - (i32 (LDriub_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress + x) -> memd(#foo + x) -let AddedComplexity = 100 in -def : Pat <(i64 (load (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset))), - (i64 (LDrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress + x) -> memb(#foo + x) -let AddedComplexity = 100 in -def : Pat <(i32 (extloadi8 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset))), - (i32 (LDrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress + x) -> memb(#foo + x) -let AddedComplexity = 100 in -def : Pat <(i32 (sextloadi8 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset))), - (i32 (LDrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress + x) -> memub(#foo + x) -let AddedComplexity = 100 in -def : Pat <(i32 (zextloadi8 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset))), - (i32 (LDriub_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress + x) -> memuh(#foo + x) -let AddedComplexity = 100 in -def : Pat <(i32 (extloadi16 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset))), - (i32 (LDrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress + x) -> memh(#foo + x) -let AddedComplexity = 100 in -def : Pat <(i32 (sextloadi16 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset))), - (i32 (LDrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, - Requires<[HasV4T]>; - - -// Map from load(globaladdress + x) -> memuh(#foo + x) -let AddedComplexity = 100 in -def : Pat <(i32 (zextloadi16 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset))), - (i32 (LDriuh_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, - Requires<[HasV4T]>; - -// Map from load(globaladdress + x) -> memw(#foo + x) -let AddedComplexity = 100 in -def : Pat <(i32 (load (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset))), - (i32 (LDriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>, - Requires<[HasV4T]>; - //===----------------------------------------------------------------------===// // LD - @@ -1746,70 +971,18 @@ def : Pat <(i32 (load (add (HexagonCONST32_GP tglobaladdr:$global), /// last operand. /// +// Store doubleword. // memd(Re=#U6)=Rtt -def STrid_abs_setimm_V4 : STInst<(outs IntRegs:$dst1), - (ins DoubleRegs:$src1, u6Imm:$src2), - "memd($dst1=#$src2) = $src1", - []>, - Requires<[HasV4T]>; - -// memb(Re=#U6)=Rs -def STrib_abs_setimm_V4 : STInst<(outs IntRegs:$dst1), - (ins IntRegs:$src1, u6Imm:$src2), - "memb($dst1=#$src2) = $src1", - []>, - Requires<[HasV4T]>; - -// memh(Re=#U6)=Rs -def STrih_abs_setimm_V4 : STInst<(outs IntRegs:$dst1), - (ins IntRegs:$src1, u6Imm:$src2), - "memh($dst1=#$src2) = $src1", - []>, - Requires<[HasV4T]>; - -// memw(Re=#U6)=Rs -def STriw_abs_setimm_V4 : STInst<(outs IntRegs:$dst1), - (ins IntRegs:$src1, u6Imm:$src2), - "memw($dst1=#$src2) = $src1", - []>, - Requires<[HasV4T]>; - -// memd(Re=#U6)=Rtt -def STrid_abs_set_V4 : STInst<(outs IntRegs:$dst1), - (ins DoubleRegs:$src1, globaladdress:$src2), - "memd($dst1=##$src2) = $src1", - []>, - Requires<[HasV4T]>; - -// memb(Re=#U6)=Rs -def STrib_abs_set_V4 : STInst<(outs IntRegs:$dst1), - (ins IntRegs:$src1, globaladdress:$src2), - "memb($dst1=##$src2) = $src1", - []>, - Requires<[HasV4T]>; - -// memh(Re=#U6)=Rs -def STrih_abs_set_V4 : STInst<(outs IntRegs:$dst1), - (ins IntRegs:$src1, globaladdress:$src2), - "memh($dst1=##$src2) = $src1", - []>, - Requires<[HasV4T]>; - -// memw(Re=#U6)=Rs -def STriw_abs_set_V4 : STInst<(outs IntRegs:$dst1), - (ins IntRegs:$src1, globaladdress:$src2), - "memw($dst1=##$src2) = $src1", - []>, - Requires<[HasV4T]>; +// TODO: needs to be implemented +// memd(Rs+#s11:3)=Rtt // memd(Rs+Ru<<#u2)=Rtt let AddedComplexity = 10, isPredicable = 1 in def STrid_indexed_shl_V4 : STInst<(outs), (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, DoubleRegs:$src4), "memd($src1+$src2<<#$src3) = $src4", - [(store (i64 DoubleRegs:$src4), - (add (i32 IntRegs:$src1), - (shl (i32 IntRegs:$src2), u2ImmPred:$src3)))]>, + [(store DoubleRegs:$src4, (add IntRegs:$src1, + (shl IntRegs:$src2, u2ImmPred:$src3)))]>, Requires<[HasV4T]>; // memd(Ru<<#u2+#U6)=Rtt @@ -1817,9 +990,9 @@ let AddedComplexity = 10 in def STrid_shl_V4 : STInst<(outs), (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, DoubleRegs:$src4), "memd($src1<<#$src2+#$src3) = $src4", - [(store (i64 DoubleRegs:$src4), - (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2), - u6ImmPred:$src3))]>, + [(store DoubleRegs:$src4, (shl IntRegs:$src1, + (add u2ImmPred:$src2, + u6ImmPred:$src3)))]>, Requires<[HasV4T]>; // memd(Rx++#s4:3)=Rtt @@ -1836,8 +1009,7 @@ def STrid_shl_V4 : STInst<(outs), // if ([!]Pv[.new]) memd(Rs+#u6:3)=Rtt // if (Pv) memd(Rs+#u6:3)=Rtt // if (Pv.new) memd(Rs+#u6:3)=Rtt -let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1 in def STrid_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, MEMri:$addr, DoubleRegs:$src2), "if ($src1.new) memd($addr) = $src2", @@ -1846,8 +1018,7 @@ def STrid_cdnPt_V4 : STInst<(outs), // if (!Pv) memd(Rs+#u6:3)=Rtt // if (!Pv.new) memd(Rs+#u6:3)=Rtt -let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1 in def STrid_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, MEMri:$addr, DoubleRegs:$src2), "if (!$src1.new) memd($addr) = $src2", @@ -1856,8 +1027,7 @@ def STrid_cdnNotPt_V4 : STInst<(outs), // if (Pv) memd(Rs+#u6:3)=Rtt // if (Pv.new) memd(Rs+#u6:3)=Rtt -let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1 in def STrid_indexed_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_3Imm:$src3, DoubleRegs:$src4), @@ -1867,8 +1037,7 @@ def STrid_indexed_cdnPt_V4 : STInst<(outs), // if (!Pv) memd(Rs+#u6:3)=Rtt // if (!Pv.new) memd(Rs+#u6:3)=Rtt -let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1 in def STrid_indexed_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_3Imm:$src3, DoubleRegs:$src4), @@ -1878,8 +1047,7 @@ def STrid_indexed_cdnNotPt_V4 : STInst<(outs), // if ([!]Pv[.new]) memd(Rs+Ru<<#u2)=Rtt // if (Pv) memd(Rs+Ru<<#u2)=Rtt -let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1 in def STrid_indexed_shl_cPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, DoubleRegs:$src5), @@ -1888,17 +1056,15 @@ def STrid_indexed_shl_cPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (Pv.new) memd(Rs+Ru<<#u2)=Rtt -let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1 in def STrid_indexed_shl_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, DoubleRegs:$src5), - "if ($src1.new) memd($src2+$src3<<#$src4) = $src5", + "if ($src1) memd($src2+$src3<<#$src4) = $src5", []>, Requires<[HasV4T]>; // if (!Pv) memd(Rs+Ru<<#u2)=Rtt -let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1 in def STrid_indexed_shl_cNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, DoubleRegs:$src5), @@ -1906,8 +1072,7 @@ def STrid_indexed_shl_cNotPt_V4 : STInst<(outs), []>, Requires<[HasV4T]>; // if (!Pv.new) memd(Rs+Ru<<#u2)=Rtt -let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1 in def STrid_indexed_shl_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, DoubleRegs:$src5), @@ -1918,8 +1083,7 @@ def STrid_indexed_shl_cdnNotPt_V4 : STInst<(outs), // if ([!]Pv[.new]) memd(Rx++#s4:3)=Rtt // if (Pv) memd(Rx++#s4:3)=Rtt // if (Pv.new) memd(Rx++#s4:3)=Rtt -let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1 in def POST_STdri_cdnPt_V4 : STInstPI<(outs IntRegs:$dst), (ins PredRegs:$src1, DoubleRegs:$src2, IntRegs:$src3, s4_3Imm:$offset), @@ -1930,8 +1094,7 @@ def POST_STdri_cdnPt_V4 : STInstPI<(outs IntRegs:$dst), // if (!Pv) memd(Rx++#s4:3)=Rtt // if (!Pv.new) memd(Rx++#s4:3)=Rtt -let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let AddedComplexity = 10, mayStore = 1, neverHasSideEffects = 1 in def POST_STdri_cdnNotPt_V4 : STInstPI<(outs IntRegs:$dst), (ins PredRegs:$src1, DoubleRegs:$src2, IntRegs:$src3, s4_3Imm:$offset), @@ -1942,12 +1105,15 @@ def POST_STdri_cdnNotPt_V4 : STInstPI<(outs IntRegs:$dst), // Store byte. +// memb(Re=#U6)=Rt +// TODO: needs to be implemented. +// memb(Rs+#s11:0)=Rt // memb(Rs+#u6:0)=#S8 let AddedComplexity = 10, isPredicable = 1 in def STrib_imm_V4 : STInst<(outs), (ins IntRegs:$src1, u6_0Imm:$src2, s8Imm:$src3), "memb($src1+#$src2) = #$src3", - [(truncstorei8 s8ImmPred:$src3, (add (i32 IntRegs:$src1), + [(truncstorei8 s8ImmPred:$src3, (add IntRegs:$src1, u6_0ImmPred:$src2))]>, Requires<[HasV4T]>; @@ -1956,10 +1122,9 @@ let AddedComplexity = 10, isPredicable = 1 in def STrib_indexed_shl_V4 : STInst<(outs), (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4), "memb($src1+$src2<<#$src3) = $src4", - [(truncstorei8 (i32 IntRegs:$src4), - (add (i32 IntRegs:$src1), - (shl (i32 IntRegs:$src2), - u2ImmPred:$src3)))]>, + [(truncstorei8 IntRegs:$src4, (add IntRegs:$src1, + (shl IntRegs:$src2, + u2ImmPred:$src3)))]>, Requires<[HasV4T]>; // memb(Ru<<#u2+#U6)=Rt @@ -1967,9 +1132,9 @@ let AddedComplexity = 10 in def STrib_shl_V4 : STInst<(outs), (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4), "memb($src1<<#$src2+#$src3) = $src4", - [(truncstorei8 (i32 IntRegs:$src4), - (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2), - u6ImmPred:$src3))]>, + [(truncstorei8 IntRegs:$src4, (shl IntRegs:$src1, + (add u2ImmPred:$src2, + u6ImmPred:$src3)))]>, Requires<[HasV4T]>; // memb(Rx++#s4:0:circ(Mu))=Rt @@ -1983,8 +1148,7 @@ def STrib_shl_V4 : STInst<(outs), // if ([!]Pv[.new]) memb(#u6)=Rt // if ([!]Pv[.new]) memb(Rs+#u6:0)=#S6 // if (Pv) memb(Rs+#u6:0)=#S6 -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_imm_cPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4), "if ($src1) memb($src2+#$src3) = #$src4", @@ -1992,8 +1156,7 @@ def STrib_imm_cPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (Pv.new) memb(Rs+#u6:0)=#S6 -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_imm_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4), "if ($src1.new) memb($src2+#$src3) = #$src4", @@ -2001,8 +1164,7 @@ def STrib_imm_cdnPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv) memb(Rs+#u6:0)=#S6 -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_imm_cNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4), "if (!$src1) memb($src2+#$src3) = #$src4", @@ -2010,8 +1172,7 @@ def STrib_imm_cNotPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv.new) memb(Rs+#u6:0)=#S6 -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_imm_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4), "if (!$src1.new) memb($src2+#$src3) = #$src4", @@ -2021,8 +1182,7 @@ def STrib_imm_cdnNotPt_V4 : STInst<(outs), // if ([!]Pv[.new]) memb(Rs+#u6:0)=Rt // if (Pv) memb(Rs+#u6:0)=Rt // if (Pv.new) memb(Rs+#u6:0)=Rt -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if ($src1.new) memb($addr) = $src2", @@ -2031,8 +1191,7 @@ def STrib_cdnPt_V4 : STInst<(outs), // if (!Pv) memb(Rs+#u6:0)=Rt // if (!Pv.new) memb(Rs+#u6:0)=Rt -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if (!$src1.new) memb($addr) = $src2", @@ -2042,8 +1201,7 @@ def STrib_cdnNotPt_V4 : STInst<(outs), // if (Pv) memb(Rs+#u6:0)=Rt // if (!Pv) memb(Rs+#u6:0)=Rt // if (Pv.new) memb(Rs+#u6:0)=Rt -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_indexed_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4), "if ($src1.new) memb($src2+#$src3) = $src4", @@ -2051,8 +1209,7 @@ def STrib_indexed_cdnPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv.new) memb(Rs+#u6:0)=Rt -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_indexed_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4), "if (!$src1.new) memb($src2+#$src3) = $src4", @@ -2061,8 +1218,7 @@ def STrib_indexed_cdnNotPt_V4 : STInst<(outs), // if ([!]Pv[.new]) memb(Rs+Ru<<#u2)=Rt // if (Pv) memb(Rs+Ru<<#u2)=Rt -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrib_indexed_shl_cPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -2071,8 +1227,7 @@ def STrib_indexed_shl_cPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (Pv.new) memb(Rs+Ru<<#u2)=Rt -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrib_indexed_shl_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -2081,8 +1236,7 @@ def STrib_indexed_shl_cdnPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv) memb(Rs+Ru<<#u2)=Rt -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrib_indexed_shl_cNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -2091,8 +1245,7 @@ def STrib_indexed_shl_cNotPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv.new) memb(Rs+Ru<<#u2)=Rt -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrib_indexed_shl_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -2103,8 +1256,7 @@ def STrib_indexed_shl_cdnNotPt_V4 : STInst<(outs), // if ([!]Pv[.new]) memb(Rx++#s4:0)=Rt // if (Pv) memb(Rx++#s4:0)=Rt // if (Pv.new) memb(Rx++#s4:0)=Rt -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_STbri_cdnPt_V4 : STInstPI<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset), "if ($src1.new) memb($src3++#$offset) = $src2", @@ -2113,8 +1265,7 @@ def POST_STbri_cdnPt_V4 : STInstPI<(outs IntRegs:$dst), // if (!Pv) memb(Rx++#s4:0)=Rt // if (!Pv.new) memb(Rx++#s4:0)=Rt -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_STbri_cdnNotPt_V4 : STInstPI<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset), "if (!$src1.new) memb($src3++#$offset) = $src2", @@ -2123,15 +1274,20 @@ def POST_STbri_cdnNotPt_V4 : STInstPI<(outs IntRegs:$dst), // Store halfword. -// TODO: needs to be implemented // memh(Re=#U6)=Rt.H +// TODO: needs to be implemented + +// memh(Re=#U6)=Rt +// TODO: needs to be implemented + // memh(Rs+#s11:1)=Rt.H +// memh(Rs+#s11:1)=Rt // memh(Rs+#u6:1)=#S8 let AddedComplexity = 10, isPredicable = 1 in def STrih_imm_V4 : STInst<(outs), (ins IntRegs:$src1, u6_1Imm:$src2, s8Imm:$src3), "memh($src1+#$src2) = #$src3", - [(truncstorei16 s8ImmPred:$src3, (add (i32 IntRegs:$src1), + [(truncstorei16 s8ImmPred:$src3, (add IntRegs:$src1, u6_1ImmPred:$src2))]>, Requires<[HasV4T]>; @@ -2143,10 +1299,9 @@ let AddedComplexity = 10, isPredicable = 1 in def STrih_indexed_shl_V4 : STInst<(outs), (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4), "memh($src1+$src2<<#$src3) = $src4", - [(truncstorei16 (i32 IntRegs:$src4), - (add (i32 IntRegs:$src1), - (shl (i32 IntRegs:$src2), - u2ImmPred:$src3)))]>, + [(truncstorei16 IntRegs:$src4, (add IntRegs:$src1, + (shl IntRegs:$src2, + u2ImmPred:$src3)))]>, Requires<[HasV4T]>; // memh(Ru<<#u2+#U6)=Rt.H @@ -2155,9 +1310,9 @@ let AddedComplexity = 10 in def STrih_shl_V4 : STInst<(outs), (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4), "memh($src1<<#$src2+#$src3) = $src4", - [(truncstorei16 (i32 IntRegs:$src4), - (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2), - u6ImmPred:$src3))]>, + [(truncstorei16 IntRegs:$src4, (shl IntRegs:$src1, + (add u2ImmPred:$src2, + u6ImmPred:$src3)))]>, Requires<[HasV4T]>; // memh(Rx++#s4:1:circ(Mu))=Rt.H @@ -2168,14 +1323,17 @@ def STrih_shl_V4 : STInst<(outs), // memh(Rx++Mu)=Rt // memh(Rx++Mu:brev)=Rt.H // memh(Rx++Mu:brev)=Rt +// memh(gp+#u16:1)=Rt.H // memh(gp+#u16:1)=Rt + + +// Store halfword conditionally. // if ([!]Pv[.new]) memh(#u6)=Rt.H // if ([!]Pv[.new]) memh(#u6)=Rt // if ([!]Pv[.new]) memh(Rs+#u6:1)=#S6 // if (Pv) memh(Rs+#u6:1)=#S6 -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_imm_cPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4), "if ($src1) memh($src2+#$src3) = #$src4", @@ -2183,8 +1341,7 @@ def STrih_imm_cPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (Pv.new) memh(Rs+#u6:1)=#S6 -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_imm_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4), "if ($src1.new) memh($src2+#$src3) = #$src4", @@ -2192,8 +1349,7 @@ def STrih_imm_cdnPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv) memh(Rs+#u6:1)=#S6 -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_imm_cNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4), "if (!$src1) memh($src2+#$src3) = #$src4", @@ -2201,8 +1357,7 @@ def STrih_imm_cNotPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv.new) memh(Rs+#u6:1)=#S6 -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_imm_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4), "if (!$src1.new) memh($src2+#$src3) = #$src4", @@ -2215,8 +1370,7 @@ def STrih_imm_cdnNotPt_V4 : STInst<(outs), // if ([!]Pv[.new]) memh(Rs+#u6:1)=Rt // if (Pv) memh(Rs+#u6:1)=Rt // if (Pv.new) memh(Rs+#u6:1)=Rt -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if ($src1.new) memh($addr) = $src2", @@ -2225,8 +1379,7 @@ def STrih_cdnPt_V4 : STInst<(outs), // if (!Pv) memh(Rs+#u6:1)=Rt // if (!Pv.new) memh(Rs+#u6:1)=Rt -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if (!$src1.new) memh($addr) = $src2", @@ -2234,8 +1387,7 @@ def STrih_cdnNotPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (Pv.new) memh(Rs+#u6:1)=Rt -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_indexed_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4), "if ($src1.new) memh($src2+#$src3) = $src4", @@ -2243,8 +1395,7 @@ def STrih_indexed_cdnPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv.new) memh(Rs+#u6:1)=Rt -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_indexed_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4), "if (!$src1.new) memh($src2+#$src3) = $src4", @@ -2254,8 +1405,7 @@ def STrih_indexed_cdnNotPt_V4 : STInst<(outs), // if ([!]Pv[.new]) memh(Rs+Ru<<#u2)=Rt.H // if ([!]Pv[.new]) memh(Rs+Ru<<#u2)=Rt // if (Pv) memh(Rs+Ru<<#u2)=Rt -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrih_indexed_shl_cPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -2264,8 +1414,6 @@ def STrih_indexed_shl_cPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (Pv.new) memh(Rs+Ru<<#u2)=Rt -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in def STrih_indexed_shl_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -2274,8 +1422,7 @@ def STrih_indexed_shl_cdnPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv) memh(Rs+Ru<<#u2)=Rt -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrih_indexed_shl_cNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -2284,8 +1431,7 @@ def STrih_indexed_shl_cNotPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv.new) memh(Rs+Ru<<#u2)=Rt -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrih_indexed_shl_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -2299,8 +1445,7 @@ def STrih_indexed_shl_cdnNotPt_V4 : STInst<(outs), // if ([!]Pv[.new]) memh(Rx++#s4:1)=Rt // if (Pv) memh(Rx++#s4:1)=Rt // if (Pv.new) memh(Rx++#s4:1)=Rt -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_SThri_cdnPt_V4 : STInstPI<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset), "if ($src1.new) memh($src3++#$offset) = $src2", @@ -2309,8 +1454,7 @@ def POST_SThri_cdnPt_V4 : STInstPI<(outs IntRegs:$dst), // if (!Pv) memh(Rx++#s4:1)=Rt // if (!Pv.new) memh(Rx++#s4:1)=Rt -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_SThri_cdnNotPt_V4 : STInstPI<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset), "if (!$src1.new) memh($src3++#$offset) = $src2", @@ -2322,22 +1466,13 @@ def POST_SThri_cdnNotPt_V4 : STInstPI<(outs IntRegs:$dst), // memw(Re=#U6)=Rt // TODO: Needs to be implemented. -// Store predicate: -let mayStore = 1, neverHasSideEffects = 1 in -def STriw_pred_V4 : STInst<(outs), - (ins MEMri:$addr, PredRegs:$src1), - "Error; should not emit", - []>, - Requires<[HasV4T]>; - - +// memw(Rs+#s11:2)=Rt // memw(Rs+#u6:2)=#S8 let AddedComplexity = 10, isPredicable = 1 in def STriw_imm_V4 : STInst<(outs), (ins IntRegs:$src1, u6_2Imm:$src2, s8Imm:$src3), "memw($src1+#$src2) = #$src3", - [(store s8ImmPred:$src3, (add (i32 IntRegs:$src1), - u6_2ImmPred:$src2))]>, + [(store s8ImmPred:$src3, (add IntRegs:$src1, u6_2ImmPred:$src2))]>, Requires<[HasV4T]>; // memw(Rs+Ru<<#u2)=Rt @@ -2345,9 +1480,8 @@ let AddedComplexity = 10, isPredicable = 1 in def STriw_indexed_shl_V4 : STInst<(outs), (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4), "memw($src1+$src2<<#$src3) = $src4", - [(store (i32 IntRegs:$src4), (add (i32 IntRegs:$src1), - (shl (i32 IntRegs:$src2), - u2ImmPred:$src3)))]>, + [(store IntRegs:$src4, (add IntRegs:$src1, + (shl IntRegs:$src2, u2ImmPred:$src3)))]>, Requires<[HasV4T]>; // memw(Ru<<#u2+#U6)=Rt @@ -2355,9 +1489,8 @@ let AddedComplexity = 10 in def STriw_shl_V4 : STInst<(outs), (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4), "memw($src1<<#$src2+#$src3) = $src4", - [(store (i32 IntRegs:$src4), - (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2), - u6ImmPred:$src3))]>, + [(store IntRegs:$src4, (shl IntRegs:$src1, + (add u2ImmPred:$src2, u6ImmPred:$src3)))]>, Requires<[HasV4T]>; // memw(Rx++#s4:2)=Rt @@ -2369,11 +1502,12 @@ def STriw_shl_V4 : STInst<(outs), // Store word conditionally. +// if ([!]Pv[.new]) memw(#u6)=Rt +// TODO: Needs to be implemented. // if ([!]Pv[.new]) memw(Rs+#u6:2)=#S6 // if (Pv) memw(Rs+#u6:2)=#S6 -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_imm_cPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4), "if ($src1) memw($src2+#$src3) = #$src4", @@ -2381,8 +1515,7 @@ def STriw_imm_cPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (Pv.new) memw(Rs+#u6:2)=#S6 -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_imm_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4), "if ($src1.new) memw($src2+#$src3) = #$src4", @@ -2390,8 +1523,7 @@ def STriw_imm_cdnPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv) memw(Rs+#u6:2)=#S6 -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_imm_cNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4), "if (!$src1) memw($src2+#$src3) = #$src4", @@ -2399,8 +1531,7 @@ def STriw_imm_cNotPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv.new) memw(Rs+#u6:2)=#S6 -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_imm_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4), "if (!$src1.new) memw($src2+#$src3) = #$src4", @@ -2410,8 +1541,7 @@ def STriw_imm_cdnNotPt_V4 : STInst<(outs), // if ([!]Pv[.new]) memw(Rs+#u6:2)=Rt // if (Pv) memw(Rs+#u6:2)=Rt // if (Pv.new) memw(Rs+#u6:2)=Rt -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if ($src1.new) memw($addr) = $src2", @@ -2420,8 +1550,7 @@ def STriw_cdnPt_V4 : STInst<(outs), // if (!Pv) memw(Rs+#u6:2)=Rt // if (!Pv.new) memw(Rs+#u6:2)=Rt -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if (!$src1.new) memw($addr) = $src2", @@ -2431,8 +1560,7 @@ def STriw_cdnNotPt_V4 : STInst<(outs), // if (Pv) memw(Rs+#u6:2)=Rt // if (!Pv) memw(Rs+#u6:2)=Rt // if (Pv.new) memw(Rs+#u6:2)=Rt -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_indexed_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4), "if ($src1.new) memw($src2+#$src3) = $src4", @@ -2440,8 +1568,7 @@ def STriw_indexed_cdnPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv.new) memw(Rs+#u6:2)=Rt -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_indexed_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4), "if (!$src1.new) memw($src2+#$src3) = $src4", @@ -2450,8 +1577,7 @@ def STriw_indexed_cdnNotPt_V4 : STInst<(outs), // if ([!]Pv[.new]) memw(Rs+Ru<<#u2)=Rt // if (Pv) memw(Rs+Ru<<#u2)=Rt -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STriw_indexed_shl_cPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -2460,8 +1586,7 @@ def STriw_indexed_shl_cPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (Pv.new) memw(Rs+Ru<<#u2)=Rt -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STriw_indexed_shl_cdnPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -2470,8 +1595,7 @@ def STriw_indexed_shl_cdnPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv) memw(Rs+Ru<<#u2)=Rt -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STriw_indexed_shl_cNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -2480,8 +1604,7 @@ def STriw_indexed_shl_cNotPt_V4 : STInst<(outs), Requires<[HasV4T]>; // if (!Pv.new) memw(Rs+Ru<<#u2)=Rt -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STriw_indexed_shl_cdnNotPt_V4 : STInst<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -2492,8 +1615,7 @@ def STriw_indexed_shl_cdnNotPt_V4 : STInst<(outs), // if ([!]Pv[.new]) memw(Rx++#s4:2)=Rt // if (Pv) memw(Rx++#s4:2)=Rt // if (Pv.new) memw(Rx++#s4:2)=Rt -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_STwri_cdnPt_V4 : STInstPI<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset), "if ($src1.new) memw($src3++#$offset) = $src2", @@ -2502,8 +1624,7 @@ def POST_STwri_cdnPt_V4 : STInstPI<(outs IntRegs:$dst), // if (!Pv) memw(Rx++#s4:2)=Rt // if (!Pv.new) memw(Rx++#s4:2)=Rt -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_STwri_cdnNotPt_V4 : STInstPI<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset), "if (!$src1.new) memw($src3++#$offset) = $src2", @@ -2511,439 +1632,6 @@ def POST_STwri_cdnNotPt_V4 : STInstPI<(outs IntRegs:$dst), Requires<[HasV4T]>; -/// store to global address - -let isPredicable = 1, mayStore = 1, neverHasSideEffects = 1 in -def STrid_GP_V4 : STInst<(outs), - (ins globaladdress:$global, u16Imm:$offset, DoubleRegs:$src), - "memd(#$global+$offset) = $src", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STrid_GP_cPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - DoubleRegs:$src2), - "if ($src1) memd(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STrid_GP_cNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - DoubleRegs:$src2), - "if (!$src1) memd(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STrid_GP_cdnPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - DoubleRegs:$src2), - "if ($src1.new) memd(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STrid_GP_cdnNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - DoubleRegs:$src2), - "if (!$src1.new) memd(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let isPredicable = 1, mayStore = 1, neverHasSideEffects = 1 in -def STrib_GP_V4 : STInst<(outs), - (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src), - "memb(#$global+$offset) = $src", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STrib_GP_cPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if ($src1) memb(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STrib_GP_cNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if (!$src1) memb(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STrib_GP_cdnPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if ($src1.new) memb(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STrib_GP_cdnNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if (!$src1.new) memb(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let isPredicable = 1, mayStore = 1, neverHasSideEffects = 1 in -def STrih_GP_V4 : STInst<(outs), - (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src), - "memh(#$global+$offset) = $src", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STrih_GP_cPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if ($src1) memh(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STrih_GP_cNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if (!$src1) memh(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STrih_GP_cdnPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if ($src1.new) memh(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STrih_GP_cdnNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if (!$src1.new) memh(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let isPredicable = 1, mayStore = 1, neverHasSideEffects = 1 in -def STriw_GP_V4 : STInst<(outs), - (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src), - "memw(#$global+$offset) = $src", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STriw_GP_cPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if ($src1) memw(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STriw_GP_cNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if (!$src1) memw(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STriw_GP_cdnPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if ($src1.new) memw(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STriw_GP_cdnNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if (!$src1.new) memw(##$global+$offset) = $src2", - []>, - Requires<[HasV4T]>; - -// memd(#global)=Rtt -let isPredicable = 1, mayStore = 1, neverHasSideEffects = 1 in -def STd_GP_V4 : STInst<(outs), - (ins globaladdress:$global, DoubleRegs:$src), - "memd(#$global) = $src", - []>, - Requires<[HasV4T]>; - -// if (Pv) memd(##global) = Rtt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STd_GP_cPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2), - "if ($src1) memd(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memd(##global) = Rtt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STd_GP_cNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2), - "if (!$src1) memd(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// if (Pv) memd(##global) = Rtt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STd_GP_cdnPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2), - "if ($src1.new) memd(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memd(##global) = Rtt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STd_GP_cdnNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2), - "if (!$src1.new) memd(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// memb(#global)=Rt -let isPredicable = 1, mayStore = 1, neverHasSideEffects = 1 in -def STb_GP_V4 : STInst<(outs), - (ins globaladdress:$global, IntRegs:$src), - "memb(#$global) = $src", - []>, - Requires<[HasV4T]>; - -// if (Pv) memb(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STb_GP_cPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if ($src1) memb(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memb(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STb_GP_cNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if (!$src1) memb(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// if (Pv) memb(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STb_GP_cdnPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if ($src1.new) memb(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memb(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STb_GP_cdnNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if (!$src1.new) memb(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// memh(#global)=Rt -let isPredicable = 1, mayStore = 1, neverHasSideEffects = 1 in -def STh_GP_V4 : STInst<(outs), - (ins globaladdress:$global, IntRegs:$src), - "memh(#$global) = $src", - []>, - Requires<[HasV4T]>; - -// if (Pv) memh(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STh_GP_cPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if ($src1) memh(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memh(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STh_GP_cNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if (!$src1) memh(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// if (Pv) memh(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STh_GP_cdnPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if ($src1.new) memh(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memh(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STh_GP_cdnNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if (!$src1.new) memh(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// memw(#global)=Rt -let isPredicable = 1, mayStore = 1, neverHasSideEffects = 1 in -def STw_GP_V4 : STInst<(outs), - (ins globaladdress:$global, IntRegs:$src), - "memw(#$global) = $src", - []>, - Requires<[HasV4T]>; - -// if (Pv) memw(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STw_GP_cPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if ($src1) memw(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memw(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STw_GP_cNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if (!$src1) memw(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// if (Pv) memw(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STw_GP_cdnPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if ($src1.new) memw(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memw(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1, isPredicated = 1 in -def STw_GP_cdnNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if (!$src1.new) memw(##$global) = $src2", - []>, - Requires<[HasV4T]>; - -// 64 bit atomic store -def : Pat <(atomic_store_64 (HexagonCONST32_GP tglobaladdr:$global), - (i64 DoubleRegs:$src1)), - (STd_GP_V4 tglobaladdr:$global, (i64 DoubleRegs:$src1))>, - Requires<[HasV4T]>; - -// Map from store(globaladdress) -> memd(#foo) -let AddedComplexity = 100 in -def : Pat <(store (i64 DoubleRegs:$src1), (HexagonCONST32_GP tglobaladdr:$global)), - (STd_GP_V4 tglobaladdr:$global, (i64 DoubleRegs:$src1))>, - Requires<[HasV4T]>; - -// 8 bit atomic store -def : Pat < (atomic_store_8 (HexagonCONST32_GP tglobaladdr:$global), - (i32 IntRegs:$src1)), - (STb_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>, - Requires<[HasV4T]>; - -// Map from store(globaladdress) -> memb(#foo) -let AddedComplexity = 100 in -def : Pat<(truncstorei8 (i32 IntRegs:$src1), - (HexagonCONST32_GP tglobaladdr:$global)), - (STb_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>, - Requires<[HasV4T]>; - -// Map from "i1 = constant<-1>; memw(CONST32(#foo)) = i1" -// to "r0 = 1; memw(#foo) = r0" -let AddedComplexity = 100 in -def : Pat<(store (i1 -1), (HexagonCONST32_GP tglobaladdr:$global)), - (STb_GP_V4 tglobaladdr:$global, (TFRI 1))>, - Requires<[HasV4T]>; - -def : Pat<(atomic_store_16 (HexagonCONST32_GP tglobaladdr:$global), - (i32 IntRegs:$src1)), - (STh_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>, - Requires<[HasV4T]>; - -// Map from store(globaladdress) -> memh(#foo) -let AddedComplexity = 100 in -def : Pat<(truncstorei16 (i32 IntRegs:$src1), - (HexagonCONST32_GP tglobaladdr:$global)), - (STh_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>, - Requires<[HasV4T]>; - -// 32 bit atomic store -def : Pat<(atomic_store_32 (HexagonCONST32_GP tglobaladdr:$global), - (i32 IntRegs:$src1)), - (STw_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>, - Requires<[HasV4T]>; - -// Map from store(globaladdress) -> memw(#foo) -let AddedComplexity = 100 in -def : Pat<(store (i32 IntRegs:$src1), (HexagonCONST32_GP tglobaladdr:$global)), - (STw_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>, - Requires<[HasV4T]>; - -def : Pat<(atomic_store_64 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset), - (i64 DoubleRegs:$src1)), - (STrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, - (i64 DoubleRegs:$src1))>, - Requires<[HasV4T]>; - -def : Pat<(atomic_store_32 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset), - (i32 IntRegs:$src1)), - (STriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, (i32 IntRegs:$src1))>, - Requires<[HasV4T]>; - -def : Pat<(atomic_store_16 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset), - (i32 IntRegs:$src1)), - (STrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, (i32 IntRegs:$src1))>, - Requires<[HasV4T]>; - -def : Pat<(atomic_store_8 (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset), - (i32 IntRegs:$src1)), - (STrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, (i32 IntRegs:$src1))>, - Requires<[HasV4T]>; - -// Map from store(globaladdress + x) -> memd(#foo + x) -let AddedComplexity = 100 in -def : Pat<(store (i64 DoubleRegs:$src1), (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset)), - (STrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, - (i64 DoubleRegs:$src1))>, - Requires<[HasV4T]>; - -// Map from store(globaladdress + x) -> memb(#foo + x) -let AddedComplexity = 100 in -def : Pat<(truncstorei8 (i32 IntRegs:$src1), - (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset)), - (STrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, (i32 IntRegs:$src1))>, - Requires<[HasV4T]>; - -// Map from store(globaladdress + x) -> memh(#foo + x) -let AddedComplexity = 100 in -def : Pat<(truncstorei16 (i32 IntRegs:$src1), - (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset)), - (STrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, (i32 IntRegs:$src1))>, - Requires<[HasV4T]>; - -// Map from store(globaladdress + x) -> memw(#foo + x) -let AddedComplexity = 100 in -def : Pat<(store (i32 IntRegs:$src1), - (add (HexagonCONST32_GP tglobaladdr:$global), - u16ImmPred:$offset)), - (STriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset, (i32 IntRegs:$src1))>, - Requires<[HasV4T]>; - - - //===----------------------------------------------------------------------=== // ST - //===----------------------------------------------------------------------=== @@ -3008,19 +1696,11 @@ def STrib_GP_nv_V4 : NVInst_V4<(outs), []>, Requires<[HasV4T]>; -// memb(#global)=Nt.new -let mayStore = 1, neverHasSideEffects = 1 in -def STb_GP_nv_V4 : NVInst_V4<(outs), - (ins globaladdress:$global, IntRegs:$src), - "memb(#$global) = $src.new", - []>, - Requires<[HasV4T]>; // Store new-value byte conditionally. // if ([!]Pv[.new]) memb(#u6)=Nt.new // if (Pv) memb(Rs+#u6:0)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_cPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if ($src1) memb($addr) = $src2.new", @@ -3028,8 +1708,7 @@ def STrib_cPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (Pv.new) memb(Rs+#u6:0)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_cdnPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if ($src1.new) memb($addr) = $src2.new", @@ -3037,8 +1716,7 @@ def STrib_cdnPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv) memb(Rs+#u6:0)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_cNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if (!$src1) memb($addr) = $src2.new", @@ -3046,8 +1724,7 @@ def STrib_cNotPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv.new) memb(Rs+#u6:0)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_cdnNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if (!$src1.new) memb($addr) = $src2.new", @@ -3055,8 +1732,7 @@ def STrib_cdnNotPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (Pv) memb(Rs+#u6:0)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_indexed_cPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4), "if ($src1) memb($src2+#$src3) = $src4.new", @@ -3064,8 +1740,7 @@ def STrib_indexed_cPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (Pv.new) memb(Rs+#u6:0)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_indexed_cdnPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4), "if ($src1.new) memb($src2+#$src3) = $src4.new", @@ -3073,8 +1748,7 @@ def STrib_indexed_cdnPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv) memb(Rs+#u6:0)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_indexed_cNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4), "if (!$src1) memb($src2+#$src3) = $src4.new", @@ -3082,8 +1756,7 @@ def STrib_indexed_cNotPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv.new) memb(Rs+#u6:0)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrib_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4), "if (!$src1.new) memb($src2+#$src3) = $src4.new", @@ -3093,8 +1766,7 @@ def STrib_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs), // if ([!]Pv[.new]) memb(Rs+Ru<<#u2)=Nt.new // if (Pv) memb(Rs+Ru<<#u2)=Nt.new -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrib_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -3103,8 +1775,7 @@ def STrib_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (Pv.new) memb(Rs+Ru<<#u2)=Nt.new -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrib_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -3113,8 +1784,7 @@ def STrib_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv) memb(Rs+Ru<<#u2)=Nt.new -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrib_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -3123,8 +1793,7 @@ def STrib_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv.new) memb(Rs+Ru<<#u2)=Nt.new -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrib_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -3134,8 +1803,7 @@ def STrib_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs), // if ([!]Pv[.new]) memb(Rx++#s4:0)=Nt.new // if (Pv) memb(Rx++#s4:0)=Nt.new -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_STbri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset), "if ($src1) memb($src3++#$offset) = $src2.new", @@ -3143,8 +1811,7 @@ def POST_STbri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), Requires<[HasV4T]>; // if (Pv.new) memb(Rx++#s4:0)=Nt.new -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_STbri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset), "if ($src1.new) memb($src3++#$offset) = $src2.new", @@ -3152,8 +1819,7 @@ def POST_STbri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), Requires<[HasV4T]>; // if (!Pv) memb(Rx++#s4:0)=Nt.new -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_STbri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset), "if (!$src1) memb($src3++#$offset) = $src2.new", @@ -3161,8 +1827,7 @@ def POST_STbri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), Requires<[HasV4T]>; // if (!Pv.new) memb(Rx++#s4:0)=Nt.new -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_STbri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset), "if (!$src1.new) memb($src3++#$offset) = $src2.new", @@ -3224,14 +1889,6 @@ def STrih_GP_nv_V4 : NVInst_V4<(outs), []>, Requires<[HasV4T]>; -// memh(#global)=Nt.new -let mayStore = 1, neverHasSideEffects = 1 in -def STh_GP_nv_V4 : NVInst_V4<(outs), - (ins globaladdress:$global, IntRegs:$src), - "memh(#$global) = $src.new", - []>, - Requires<[HasV4T]>; - // Store new-value halfword conditionally. @@ -3239,8 +1896,7 @@ def STh_GP_nv_V4 : NVInst_V4<(outs), // if ([!]Pv[.new]) memh(Rs+#u6:1)=Nt.new // if (Pv) memh(Rs+#u6:1)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_cPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if ($src1) memh($addr) = $src2.new", @@ -3248,8 +1904,7 @@ def STrih_cPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (Pv.new) memh(Rs+#u6:1)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_cdnPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if ($src1.new) memh($addr) = $src2.new", @@ -3257,8 +1912,7 @@ def STrih_cdnPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv) memh(Rs+#u6:1)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_cNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if (!$src1) memh($addr) = $src2.new", @@ -3266,8 +1920,7 @@ def STrih_cNotPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv.new) memh(Rs+#u6:1)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_cdnNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if (!$src1.new) memh($addr) = $src2.new", @@ -3275,8 +1928,7 @@ def STrih_cdnNotPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (Pv) memh(Rs+#u6:1)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_indexed_cPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4), "if ($src1) memh($src2+#$src3) = $src4.new", @@ -3284,8 +1936,7 @@ def STrih_indexed_cPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (Pv.new) memh(Rs+#u6:1)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_indexed_cdnPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4), "if ($src1.new) memh($src2+#$src3) = $src4.new", @@ -3293,8 +1944,7 @@ def STrih_indexed_cdnPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv) memh(Rs+#u6:1)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_indexed_cNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4), "if (!$src1) memh($src2+#$src3) = $src4.new", @@ -3302,8 +1952,7 @@ def STrih_indexed_cNotPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv.new) memh(Rs+#u6:1)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STrih_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4), "if (!$src1.new) memh($src2+#$src3) = $src4.new", @@ -3312,8 +1961,7 @@ def STrih_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs), // if ([!]Pv[.new]) memh(Rs+Ru<<#u2)=Nt.new // if (Pv) memh(Rs+Ru<<#u2)=Nt.new -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrih_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -3322,8 +1970,7 @@ def STrih_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (Pv.new) memh(Rs+Ru<<#u2)=Nt.new -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrih_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -3332,8 +1979,7 @@ def STrih_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv) memh(Rs+Ru<<#u2)=Nt.new -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrih_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -3342,8 +1988,7 @@ def STrih_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv.new) memh(Rs+Ru<<#u2)=Nt.new -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STrih_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -3353,8 +1998,7 @@ def STrih_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs), // if ([!]Pv[]) memh(Rx++#s4:1)=Nt.new // if (Pv) memh(Rx++#s4:1)=Nt.new -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_SThri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset), "if ($src1) memh($src3++#$offset) = $src2.new", @@ -3362,8 +2006,7 @@ def POST_SThri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), Requires<[HasV4T]>; // if (Pv.new) memh(Rx++#s4:1)=Nt.new -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_SThri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset), "if ($src1.new) memh($src3++#$offset) = $src2.new", @@ -3371,8 +2014,7 @@ def POST_SThri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), Requires<[HasV4T]>; // if (!Pv) memh(Rx++#s4:1)=Nt.new -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_SThri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset), "if (!$src1) memh($src3++#$offset) = $src2.new", @@ -3380,8 +2022,7 @@ def POST_SThri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), Requires<[HasV4T]>; // if (!Pv.new) memh(Rx++#s4:1)=Nt.new -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_SThri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset), "if (!$src1.new) memh($src3++#$offset) = $src2.new", @@ -3444,12 +2085,6 @@ def STriw_GP_nv_V4 : NVInst_V4<(outs), []>, Requires<[HasV4T]>; -let mayStore = 1, neverHasSideEffects = 1 in -def STw_GP_nv_V4 : NVInst_V4<(outs), - (ins globaladdress:$global, IntRegs:$src), - "memw(#$global) = $src.new", - []>, - Requires<[HasV4T]>; // Store new-value word conditionally. @@ -3457,8 +2092,7 @@ def STw_GP_nv_V4 : NVInst_V4<(outs), // if ([!]Pv[.new]) memw(Rs+#u6:2)=Nt.new // if (Pv) memw(Rs+#u6:2)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_cPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if ($src1) memw($addr) = $src2.new", @@ -3466,8 +2100,7 @@ def STriw_cPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (Pv.new) memw(Rs+#u6:2)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_cdnPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if ($src1.new) memw($addr) = $src2.new", @@ -3475,8 +2108,7 @@ def STriw_cdnPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv) memw(Rs+#u6:2)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_cNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if (!$src1) memw($addr) = $src2.new", @@ -3484,8 +2116,7 @@ def STriw_cNotPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv.new) memw(Rs+#u6:2)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_cdnNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2), "if (!$src1.new) memw($addr) = $src2.new", @@ -3493,8 +2124,7 @@ def STriw_cdnNotPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (Pv) memw(Rs+#u6:2)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_indexed_cPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4), "if ($src1) memw($src2+#$src3) = $src4.new", @@ -3502,8 +2132,7 @@ def STriw_indexed_cPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (Pv.new) memw(Rs+#u6:2)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_indexed_cdnPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4), "if ($src1.new) memw($src2+#$src3) = $src4.new", @@ -3511,8 +2140,7 @@ def STriw_indexed_cdnPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv) memw(Rs+#u6:2)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_indexed_cNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4), "if (!$src1) memw($src2+#$src3) = $src4.new", @@ -3520,8 +2148,7 @@ def STriw_indexed_cNotPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv.new) memw(Rs+#u6:2)=Nt.new -let mayStore = 1, neverHasSideEffects = 1, - isPredicated = 1 in +let mayStore = 1, neverHasSideEffects = 1 in def STriw_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4), "if (!$src1.new) memw($src2+#$src3) = $src4.new", @@ -3531,8 +2158,7 @@ def STriw_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs), // if ([!]Pv[.new]) memw(Rs+Ru<<#u2)=Nt.new // if (Pv) memw(Rs+Ru<<#u2)=Nt.new -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STriw_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -3541,8 +2167,7 @@ def STriw_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (Pv.new) memw(Rs+Ru<<#u2)=Nt.new -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STriw_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -3551,8 +2176,7 @@ def STriw_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv) memw(Rs+Ru<<#u2)=Nt.new -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STriw_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -3561,8 +2185,7 @@ def STriw_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs), Requires<[HasV4T]>; // if (!Pv.new) memw(Rs+Ru<<#u2)=Nt.new -let mayStore = 1, AddedComplexity = 10, - isPredicated = 1 in +let mayStore = 1, AddedComplexity = 10 in def STriw_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4, IntRegs:$src5), @@ -3572,8 +2195,7 @@ def STriw_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs), // if ([!]Pv[.new]) memw(Rx++#s4:2)=Nt.new // if (Pv) memw(Rx++#s4:2)=Nt.new -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_STwri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset), "if ($src1) memw($src3++#$offset) = $src2.new", @@ -3581,8 +2203,7 @@ def POST_STwri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), Requires<[HasV4T]>; // if (Pv.new) memw(Rx++#s4:2)=Nt.new -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_STwri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset), "if ($src1.new) memw($src3++#$offset) = $src2.new", @@ -3590,8 +2211,7 @@ def POST_STwri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), Requires<[HasV4T]>; // if (!Pv) memw(Rx++#s4:2)=Nt.new -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_STwri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset), "if (!$src1) memw($src3++#$offset) = $src2.new", @@ -3599,8 +2219,7 @@ def POST_STwri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), Requires<[HasV4T]>; // if (!Pv.new) memw(Rx++#s4:2)=Nt.new -let mayStore = 1, hasCtrlDep = 1, - isPredicated = 1 in +let mayStore = 1, hasCtrlDep = 1 in def POST_STwri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset), "if (!$src1.new) memw($src3++#$offset) = $src2.new", @@ -3608,199 +2227,6 @@ def POST_STwri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst), Requires<[HasV4T]>; - -// if (Pv) memb(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1 in -def STb_GP_cPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if ($src1) memb(##$global) = $src2.new", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memb(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1 in -def STb_GP_cNotPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if (!$src1) memb(##$global) = $src2.new", - []>, - Requires<[HasV4T]>; - -// if (Pv) memb(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1 in -def STb_GP_cdnPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if ($src1.new) memb(##$global) = $src2.new", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memb(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1 in -def STb_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if (!$src1.new) memb(##$global) = $src2.new", - []>, - Requires<[HasV4T]>; - -// if (Pv) memh(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1 in -def STh_GP_cPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if ($src1) memh(##$global) = $src2.new", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memh(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1 in -def STh_GP_cNotPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if (!$src1) memh(##$global) = $src2.new", - []>, - Requires<[HasV4T]>; - -// if (Pv) memh(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1 in -def STh_GP_cdnPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if ($src1.new) memh(##$global) = $src2.new", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memh(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1 in -def STh_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if (!$src1.new) memh(##$global) = $src2.new", - []>, - Requires<[HasV4T]>; - -// if (Pv) memw(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1 in -def STw_GP_cPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if ($src1) memw(##$global) = $src2.new", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memw(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1 in -def STw_GP_cNotPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if (!$src1) memw(##$global) = $src2.new", - []>, - Requires<[HasV4T]>; - -// if (Pv) memw(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1 in -def STw_GP_cdnPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if ($src1.new) memw(##$global) = $src2.new", - []>, - Requires<[HasV4T]>; - -// if (!Pv) memw(##global) = Rt -let mayStore = 1, neverHasSideEffects = 1 in -def STw_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2), - "if (!$src1.new) memw(##$global) = $src2.new", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1 in -def STrib_GP_cPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if ($src1) memb(##$global+$offset) = $src2.new", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1 in -def STrib_GP_cNotPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if (!$src1) memb(##$global+$offset) = $src2.new", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1 in -def STrib_GP_cdnPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if ($src1.new) memb(##$global+$offset) = $src2.new", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1 in -def STrib_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if (!$src1.new) memb(##$global+$offset) = $src2.new", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1 in -def STrih_GP_cPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if ($src1) memh(##$global+$offset) = $src2.new", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1 in -def STrih_GP_cNotPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if (!$src1) memh(##$global+$offset) = $src2.new", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1 in -def STrih_GP_cdnPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if ($src1.new) memh(##$global+$offset) = $src2.new", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1 in -def STrih_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if (!$src1.new) memh(##$global+$offset) = $src2.new", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1 in -def STriw_GP_cPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if ($src1) memw(##$global+$offset) = $src2.new", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1 in -def STriw_GP_cNotPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if (!$src1) memw(##$global+$offset) = $src2.new", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1 in -def STriw_GP_cdnPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if ($src1.new) memw(##$global+$offset) = $src2.new", - []>, - Requires<[HasV4T]>; - -let mayStore = 1, neverHasSideEffects = 1 in -def STriw_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs), - (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset, - IntRegs:$src2), - "if (!$src1.new) memw(##$global+$offset) = $src2.new", - []>, - Requires<[HasV4T]>; - //===----------------------------------------------------------------------===// // NV/ST - //===----------------------------------------------------------------------===// @@ -3990,18 +2416,16 @@ let isBranch = 1, isTerminator=1, neverHasSideEffects = 1, Defs = [PC] in { def ADDr_ADDri_V4 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, s6Imm:$src3), "$dst = add($src1, add($src2, #$src3))", - [(set (i32 IntRegs:$dst), - (add (i32 IntRegs:$src1), (add (i32 IntRegs:$src2), - s6ImmPred:$src3)))]>, + [(set IntRegs:$dst, + (add IntRegs:$src1, (add IntRegs:$src2, s6ImmPred:$src3)))]>, Requires<[HasV4T]>; // Rd=add(Rs,sub(#s6,Ru)) def ADDr_SUBri_V4 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, s6Imm:$src2, IntRegs:$src3), "$dst = add($src1, sub(#$src2, $src3))", - [(set (i32 IntRegs:$dst), - (add (i32 IntRegs:$src1), (sub s6ImmPred:$src2, - (i32 IntRegs:$src3))))]>, + [(set IntRegs:$dst, + (add IntRegs:$src1, (sub s6ImmPred:$src2, IntRegs:$src3)))]>, Requires<[HasV4T]>; // Generates the same instruction as ADDr_SUBri_V4 but matches different @@ -4010,9 +2434,8 @@ def ADDr_SUBri_V4 : MInst<(outs IntRegs:$dst), def ADDri_SUBr_V4 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, s6Imm:$src2, IntRegs:$src3), "$dst = add($src1, sub(#$src2, $src3))", - [(set (i32 IntRegs:$dst), - (sub (add (i32 IntRegs:$src1), s6ImmPred:$src2), - (i32 IntRegs:$src3)))]>, + [(set IntRegs:$dst, + (sub (add IntRegs:$src1, s6ImmPred:$src2), IntRegs:$src3))]>, Requires<[HasV4T]>; @@ -4028,16 +2451,16 @@ def ADDri_SUBr_V4 : MInst<(outs IntRegs:$dst), def ANDd_NOTd_V4 : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2), "$dst = and($src1, ~$src2)", - [(set (i64 DoubleRegs:$dst), (and (i64 DoubleRegs:$src1), - (not (i64 DoubleRegs:$src2))))]>, + [(set DoubleRegs:$dst, (and DoubleRegs:$src1, + (not DoubleRegs:$src2)))]>, Requires<[HasV4T]>; // Rdd=or(Rtt,~Rss) def ORd_NOTd_V4 : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2), "$dst = or($src1, ~$src2)", - [(set (i64 DoubleRegs:$dst), - (or (i64 DoubleRegs:$src1), (not (i64 DoubleRegs:$src2))))]>, + [(set DoubleRegs:$dst, + (or DoubleRegs:$src1, (not DoubleRegs:$src2)))]>, Requires<[HasV4T]>; @@ -4046,9 +2469,8 @@ def ORd_NOTd_V4 : MInst<(outs DoubleRegs:$dst), def XORd_XORdd: MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2, DoubleRegs:$src3), "$dst ^= xor($src2, $src3)", - [(set (i64 DoubleRegs:$dst), - (xor (i64 DoubleRegs:$src1), (xor (i64 DoubleRegs:$src2), - (i64 DoubleRegs:$src3))))], + [(set DoubleRegs:$dst, + (xor DoubleRegs:$src1, (xor DoubleRegs:$src2, DoubleRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4058,9 +2480,8 @@ def XORd_XORdd: MInst_acc<(outs DoubleRegs:$dst), def ORr_ANDri_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, s10Imm:$src3), "$dst = or($src1, and($src2, #$src3))", - [(set (i32 IntRegs:$dst), - (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), - s10ImmPred:$src3)))], + [(set IntRegs:$dst, + (or IntRegs:$src1, (and IntRegs:$src2, s10ImmPred:$src3)))], "$src2 = $dst">, Requires<[HasV4T]>; @@ -4069,9 +2490,8 @@ def ORr_ANDri_V4 : MInst_acc<(outs IntRegs:$dst), def ANDr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), "$dst &= and($src2, $src3)", - [(set (i32 IntRegs:$dst), - (and (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), - (i32 IntRegs:$src3))))], + [(set IntRegs:$dst, + (and IntRegs:$src1, (and IntRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4079,9 +2499,8 @@ def ANDr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst), def ORr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), "$dst |= and($src2, $src3)", - [(set (i32 IntRegs:$dst), - (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), - (i32 IntRegs:$src3))))], + [(set IntRegs:$dst, + (or IntRegs:$src1, (and IntRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4089,9 +2508,8 @@ def ORr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst), def XORr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), "$dst ^= and($src2, $src3)", - [(set (i32 IntRegs:$dst), - (xor (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), - (i32 IntRegs:$src3))))], + [(set IntRegs:$dst, + (xor IntRegs:$src1, (and IntRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4100,9 +2518,8 @@ def XORr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst), def ANDr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), "$dst &= and($src2, ~$src3)", - [(set (i32 IntRegs:$dst), - (and (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), - (not (i32 IntRegs:$src3)))))], + [(set IntRegs:$dst, + (and IntRegs:$src1, (and IntRegs:$src2, (not IntRegs:$src3))))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4110,9 +2527,8 @@ def ANDr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst), def ORr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), "$dst |= and($src2, ~$src3)", - [(set (i32 IntRegs:$dst), - (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), - (not (i32 IntRegs:$src3)))))], + [(set IntRegs:$dst, + (or IntRegs:$src1, (and IntRegs:$src2, (not IntRegs:$src3))))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4120,9 +2536,8 @@ def ORr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst), def XORr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), "$dst ^= and($src2, ~$src3)", - [(set (i32 IntRegs:$dst), - (xor (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), - (not (i32 IntRegs:$src3)))))], + [(set IntRegs:$dst, + (xor IntRegs:$src1, (and IntRegs:$src2, (not IntRegs:$src3))))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4131,9 +2546,8 @@ def XORr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst), def ANDr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), "$dst &= or($src2, $src3)", - [(set (i32 IntRegs:$dst), - (and (i32 IntRegs:$src1), (or (i32 IntRegs:$src2), - (i32 IntRegs:$src3))))], + [(set IntRegs:$dst, + (and IntRegs:$src1, (or IntRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4141,9 +2555,8 @@ def ANDr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst), def ORr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), "$dst |= or($src2, $src3)", - [(set (i32 IntRegs:$dst), - (or (i32 IntRegs:$src1), (or (i32 IntRegs:$src2), - (i32 IntRegs:$src3))))], + [(set IntRegs:$dst, + (or IntRegs:$src1, (or IntRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4151,9 +2564,8 @@ def ORr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst), def XORr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), "$dst ^= or($src2, $src3)", - [(set (i32 IntRegs:$dst), - (xor (i32 IntRegs:$src1), (or (i32 IntRegs:$src2), - (i32 IntRegs:$src3))))], + [(set IntRegs:$dst, + (xor IntRegs:$src1, (or IntRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4162,9 +2574,8 @@ def XORr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst), def ANDr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), "$dst &= xor($src2, $src3)", - [(set (i32 IntRegs:$dst), - (and (i32 IntRegs:$src1), (xor (i32 IntRegs:$src2), - (i32 IntRegs:$src3))))], + [(set IntRegs:$dst, + (and IntRegs:$src1, (xor IntRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4172,9 +2583,8 @@ def ANDr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst), def ORr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), "$dst |= xor($src2, $src3)", - [(set (i32 IntRegs:$dst), - (and (i32 IntRegs:$src1), (xor (i32 IntRegs:$src2), - (i32 IntRegs:$src3))))], + [(set IntRegs:$dst, + (and IntRegs:$src1, (xor IntRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4182,9 +2592,8 @@ def ORr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst), def XORr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3), "$dst ^= xor($src2, $src3)", - [(set (i32 IntRegs:$dst), - (and (i32 IntRegs:$src1), (xor (i32 IntRegs:$src2), - (i32 IntRegs:$src3))))], + [(set IntRegs:$dst, + (and IntRegs:$src1, (xor IntRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4192,9 +2601,8 @@ def XORr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst), def ORr_ANDri2_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, s10Imm:$src3), "$dst |= and($src2, #$src3)", - [(set (i32 IntRegs:$dst), - (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), - s10ImmPred:$src3)))], + [(set IntRegs:$dst, + (or IntRegs:$src1, (and IntRegs:$src2, s10ImmPred:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4202,9 +2610,8 @@ def ORr_ANDri2_V4 : MInst_acc<(outs IntRegs:$dst), def ORr_ORri_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs: $src2, s10Imm:$src3), "$dst |= or($src2, #$src3)", - [(set (i32 IntRegs:$dst), - (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2), - s10ImmPred:$src3)))], + [(set IntRegs:$dst, + (or IntRegs:$src1, (and IntRegs:$src2, s10ImmPred:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4256,9 +2663,8 @@ def ORr_ORri_V4 : MInst_acc<(outs IntRegs:$dst), def ADDi_MPYri_V4 : MInst<(outs IntRegs:$dst), (ins u6Imm:$src1, IntRegs:$src2, u6Imm:$src3), "$dst = add(#$src1, mpyi($src2, #$src3))", - [(set (i32 IntRegs:$dst), - (add (mul (i32 IntRegs:$src2), u6ImmPred:$src3), - u6ImmPred:$src1))]>, + [(set IntRegs:$dst, + (add (mul IntRegs:$src2, u6ImmPred:$src3), u6ImmPred:$src1))]>, Requires<[HasV4T]>; // Rd=add(#u6,mpyi(Rs,Rt)) @@ -4266,36 +2672,32 @@ def ADDi_MPYri_V4 : MInst<(outs IntRegs:$dst), def ADDi_MPYrr_V4 : MInst<(outs IntRegs:$dst), (ins u6Imm:$src1, IntRegs:$src2, IntRegs:$src3), "$dst = add(#$src1, mpyi($src2, $src3))", - [(set (i32 IntRegs:$dst), - (add (mul (i32 IntRegs:$src2), (i32 IntRegs:$src3)), - u6ImmPred:$src1))]>, + [(set IntRegs:$dst, + (add (mul IntRegs:$src2, IntRegs:$src3), u6ImmPred:$src1))]>, Requires<[HasV4T]>; // Rd=add(Ru,mpyi(#u6:2,Rs)) def ADDr_MPYir_V4 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u6Imm:$src2, IntRegs:$src3), "$dst = add($src1, mpyi(#$src2, $src3))", - [(set (i32 IntRegs:$dst), - (add (i32 IntRegs:$src1), (mul (i32 IntRegs:$src3), - u6_2ImmPred:$src2)))]>, + [(set IntRegs:$dst, + (add IntRegs:$src1, (mul IntRegs:$src3, u6_2ImmPred:$src2)))]>, Requires<[HasV4T]>; // Rd=add(Ru,mpyi(Rs,#u6)) def ADDr_MPYri_V4 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u6Imm:$src3), "$dst = add($src1, mpyi($src2, #$src3))", - [(set (i32 IntRegs:$dst), - (add (i32 IntRegs:$src1), (mul (i32 IntRegs:$src2), - u6ImmPred:$src3)))]>, + [(set IntRegs:$dst, + (add IntRegs:$src1, (mul IntRegs:$src2, u6ImmPred:$src3)))]>, Requires<[HasV4T]>; // Rx=add(Ru,mpyi(Rx,Rs)) def ADDr_MPYrr_V4 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, IntRegs:$src3), "$dst = add($src1, mpyi($src2, $src3))", - [(set (i32 IntRegs:$dst), - (add (i32 IntRegs:$src1), (mul (i32 IntRegs:$src2), - (i32 IntRegs:$src3))))], + [(set IntRegs:$dst, + (add IntRegs:$src1, (mul IntRegs:$src2, IntRegs:$src3)))], "$src2 = $dst">, Requires<[HasV4T]>; @@ -4343,9 +2745,8 @@ def ADDr_MPYrr_V4 : MInst_acc<(outs IntRegs:$dst), def ADDi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst), (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), "$dst = add(#$src1, asl($src2, #$src3))", - [(set (i32 IntRegs:$dst), - (add (shl (i32 IntRegs:$src2), u5ImmPred:$src3), - u8ImmPred:$src1))], + [(set IntRegs:$dst, + (add (shl IntRegs:$src2, u5ImmPred:$src3), u8ImmPred:$src1))], "$src2 = $dst">, Requires<[HasV4T]>; @@ -4353,9 +2754,8 @@ def ADDi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst), def ADDi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst), (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), "$dst = add(#$src1, lsr($src2, #$src3))", - [(set (i32 IntRegs:$dst), - (add (srl (i32 IntRegs:$src2), u5ImmPred:$src3), - u8ImmPred:$src1))], + [(set IntRegs:$dst, + (add (srl IntRegs:$src2, u5ImmPred:$src3), u8ImmPred:$src1))], "$src2 = $dst">, Requires<[HasV4T]>; @@ -4363,9 +2763,8 @@ def ADDi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst), def SUBi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst), (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), "$dst = sub(#$src1, asl($src2, #$src3))", - [(set (i32 IntRegs:$dst), - (sub (shl (i32 IntRegs:$src2), u5ImmPred:$src3), - u8ImmPred:$src1))], + [(set IntRegs:$dst, + (sub (shl IntRegs:$src2, u5ImmPred:$src3), u8ImmPred:$src1))], "$src2 = $dst">, Requires<[HasV4T]>; @@ -4373,9 +2772,8 @@ def SUBi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst), def SUBi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst), (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), "$dst = sub(#$src1, lsr($src2, #$src3))", - [(set (i32 IntRegs:$dst), - (sub (srl (i32 IntRegs:$src2), u5ImmPred:$src3), - u8ImmPred:$src1))], + [(set IntRegs:$dst, + (sub (srl IntRegs:$src2, u5ImmPred:$src3), u8ImmPred:$src1))], "$src2 = $dst">, Requires<[HasV4T]>; @@ -4385,9 +2783,8 @@ def SUBi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst), def ANDi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst), (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), "$dst = and(#$src1, asl($src2, #$src3))", - [(set (i32 IntRegs:$dst), - (and (shl (i32 IntRegs:$src2), u5ImmPred:$src3), - u8ImmPred:$src1))], + [(set IntRegs:$dst, + (and (shl IntRegs:$src2, u5ImmPred:$src3), u8ImmPred:$src1))], "$src2 = $dst">, Requires<[HasV4T]>; @@ -4395,31 +2792,26 @@ def ANDi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst), def ANDi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst), (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), "$dst = and(#$src1, lsr($src2, #$src3))", - [(set (i32 IntRegs:$dst), - (and (srl (i32 IntRegs:$src2), u5ImmPred:$src3), - u8ImmPred:$src1))], + [(set IntRegs:$dst, + (and (srl IntRegs:$src2, u5ImmPred:$src3), u8ImmPred:$src1))], "$src2 = $dst">, Requires<[HasV4T]>; //Rx=or(#u8,asl(Rx,#U5)) -let AddedComplexity = 30 in def ORi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst), (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), "$dst = or(#$src1, asl($src2, #$src3))", - [(set (i32 IntRegs:$dst), - (or (shl (i32 IntRegs:$src2), u5ImmPred:$src3), - u8ImmPred:$src1))], + [(set IntRegs:$dst, + (or (shl IntRegs:$src2, u5ImmPred:$src3), u8ImmPred:$src1))], "$src2 = $dst">, Requires<[HasV4T]>; //Rx=or(#u8,lsr(Rx,#U5)) -let AddedComplexity = 30 in def ORi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst), (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3), "$dst = or(#$src1, lsr($src2, #$src3))", - [(set (i32 IntRegs:$dst), - (or (srl (i32 IntRegs:$src2), u5ImmPred:$src3), - u8ImmPred:$src1))], + [(set IntRegs:$dst, + (or (srl IntRegs:$src2, u5ImmPred:$src3), u8ImmPred:$src1))], "$src2 = $dst">, Requires<[HasV4T]>; @@ -4428,8 +2820,7 @@ def ORi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst), //Rd=lsl(#s6,Rt) def LSLi_V4 : MInst<(outs IntRegs:$dst), (ins s6Imm:$src1, IntRegs:$src2), "$dst = lsl(#$src1, $src2)", - [(set (i32 IntRegs:$dst), (shl s6ImmPred:$src1, - (i32 IntRegs:$src2)))]>, + [(set IntRegs:$dst, (shl s6ImmPred:$src1, IntRegs:$src2))]>, Requires<[HasV4T]>; @@ -4438,9 +2829,8 @@ def LSLi_V4 : MInst<(outs IntRegs:$dst), (ins s6Imm:$src1, IntRegs:$src2), def ASLd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3), "$dst ^= asl($src2, $src3)", - [(set (i64 DoubleRegs:$dst), - (xor (i64 DoubleRegs:$src1), (shl (i64 DoubleRegs:$src2), - (i32 IntRegs:$src3))))], + [(set DoubleRegs:$dst, + (xor DoubleRegs:$src1, (shl DoubleRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4448,9 +2838,8 @@ def ASLd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst), def ASRd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3), "$dst ^= asr($src2, $src3)", - [(set (i64 DoubleRegs:$dst), - (xor (i64 DoubleRegs:$src1), (sra (i64 DoubleRegs:$src2), - (i32 IntRegs:$src3))))], + [(set DoubleRegs:$dst, + (xor DoubleRegs:$src1, (sra DoubleRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4458,9 +2847,8 @@ def ASRd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst), def LSLd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3), "$dst ^= lsl($src2, $src3)", - [(set (i64 DoubleRegs:$dst), (xor (i64 DoubleRegs:$src1), - (shl (i64 DoubleRegs:$src2), - (i32 IntRegs:$src3))))], + [(set DoubleRegs:$dst, + (xor DoubleRegs:$src1, (shl DoubleRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4468,9 +2856,8 @@ def LSLd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst), def LSRd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3), "$dst ^= lsr($src2, $src3)", - [(set (i64 DoubleRegs:$dst), - (xor (i64 DoubleRegs:$src1), (srl (i64 DoubleRegs:$src2), - (i32 IntRegs:$src3))))], + [(set DoubleRegs:$dst, + (xor DoubleRegs:$src1, (srl DoubleRegs:$src2, IntRegs:$src3)))], "$src1 = $dst">, Requires<[HasV4T]>; @@ -4516,16 +2903,16 @@ let AddedComplexity = 30 in def MEMw_ADDSUBi_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_2Imm:$offset, m6Imm:$addend), "Error; should not emit", - [(store (add (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)), - m6ImmPred:$addend), - (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>, + [(store (add (load (add IntRegs:$base, u6_2ImmPred:$offset)), +m6ImmPred:$addend), + (add IntRegs:$base, u6_2ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // memw(Rs+#u6:2) += #U5 let AddedComplexity = 30 in def MEMw_ADDi_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_2Imm:$offset, u5Imm:$addend), - "memw($base+#$offset) += #$addend", + "memw($base+#$offset) += $addend", []>, Requires<[HasV4T, UseMEMOP]>; @@ -4533,7 +2920,7 @@ def MEMw_ADDi_indexed_MEM_V4 : MEMInst_V4<(outs), let AddedComplexity = 30 in def MEMw_SUBi_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_2Imm:$offset, u5Imm:$subend), - "memw($base+#$offset) -= #$subend", + "memw($base+#$offset) -= $subend", []>, Requires<[HasV4T, UseMEMOP]>; @@ -4542,9 +2929,9 @@ let AddedComplexity = 30 in def MEMw_ADDr_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$addend), "memw($base+#$offset) += $addend", - [(store (add (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)), - (i32 IntRegs:$addend)), - (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>, + [(store (add (load (add IntRegs:$base, u6_2ImmPred:$offset)), +IntRegs:$addend), + (add IntRegs:$base, u6_2ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // memw(Rs+#u6:2) -= Rt @@ -4552,19 +2939,19 @@ let AddedComplexity = 30 in def MEMw_SUBr_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$subend), "memw($base+#$offset) -= $subend", - [(store (sub (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)), - (i32 IntRegs:$subend)), - (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>, + [(store (sub (load (add IntRegs:$base, u6_2ImmPred:$offset)), +IntRegs:$subend), + (add IntRegs:$base, u6_2ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // memw(Rs+#u6:2) &= Rt let AddedComplexity = 30 in def MEMw_ANDr_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$andend), - "memw($base+#$offset) &= $andend", - [(store (and (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)), - (i32 IntRegs:$andend)), - (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>, + "memw($base+#$offset) += $andend", + [(store (and (load (add IntRegs:$base, u6_2ImmPred:$offset)), +IntRegs:$andend), + (add IntRegs:$base, u6_2ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // memw(Rs+#u6:2) |= Rt @@ -4572,9 +2959,9 @@ let AddedComplexity = 30 in def MEMw_ORr_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$orend), "memw($base+#$offset) |= $orend", - [(store (or (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)), - (i32 IntRegs:$orend)), - (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>, + [(store (or (load (add IntRegs:$base, u6_2ImmPred:$offset)), + IntRegs:$orend), + (add IntRegs:$base, u6_2ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // MEMw_ADDSUBi_V4: @@ -4609,7 +2996,7 @@ let AddedComplexity = 30 in def MEMw_ADDr_MEM_V4 : MEMInst_V4<(outs), (ins MEMri:$addr, IntRegs:$addend), "memw($addr) += $addend", - [(store (add (load ADDRriU6_2:$addr), (i32 IntRegs:$addend)), + [(store (add (load ADDRriU6_2:$addr), IntRegs:$addend), ADDRriU6_2:$addr)]>, Requires<[HasV4T, UseMEMOP]>; @@ -4618,7 +3005,7 @@ let AddedComplexity = 30 in def MEMw_SUBr_MEM_V4 : MEMInst_V4<(outs), (ins MEMri:$addr, IntRegs:$subend), "memw($addr) -= $subend", - [(store (sub (load ADDRriU6_2:$addr), (i32 IntRegs:$subend)), + [(store (sub (load ADDRriU6_2:$addr), IntRegs:$subend), ADDRriU6_2:$addr)]>, Requires<[HasV4T, UseMEMOP]>; @@ -4627,7 +3014,7 @@ let AddedComplexity = 30 in def MEMw_ANDr_MEM_V4 : MEMInst_V4<(outs), (ins MEMri:$addr, IntRegs:$andend), "memw($addr) &= $andend", - [(store (and (load ADDRriU6_2:$addr), (i32 IntRegs:$andend)), + [(store (and (load ADDRriU6_2:$addr), IntRegs:$andend), ADDRriU6_2:$addr)]>, Requires<[HasV4T, UseMEMOP]>; @@ -4636,8 +3023,8 @@ let AddedComplexity = 30 in def MEMw_ORr_MEM_V4 : MEMInst_V4<(outs), (ins MEMri:$addr, IntRegs:$orend), "memw($addr) |= $orend", - [(store (or (load ADDRriU6_2:$addr), (i32 IntRegs:$orend)), - ADDRriU6_2:$addr)]>, + [(store (or (load ADDRriU6_2:$addr), IntRegs:$orend), +ADDRriU6_2:$addr)]>, Requires<[HasV4T, UseMEMOP]>; //===----------------------------------------------------------------------===// @@ -4673,10 +3060,10 @@ let AddedComplexity = 30 in def MEMh_ADDSUBi_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_1Imm:$offset, m6Imm:$addend), "Error; should not emit", - [(truncstorei16 (add (sextloadi16 (add (i32 IntRegs:$base), + [(truncstorei16 (add (sextloadi16 (add IntRegs:$base, u6_1ImmPred:$offset)), m6ImmPred:$addend), - (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>, + (add IntRegs:$base, u6_1ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // memh(Rs+#u6:1) += #U5 @@ -4700,10 +3087,10 @@ let AddedComplexity = 30 in def MEMh_ADDr_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$addend), "memh($base+#$offset) += $addend", - [(truncstorei16 (add (sextloadi16 (add (i32 IntRegs:$base), + [(truncstorei16 (add (sextloadi16 (add IntRegs:$base, u6_1ImmPred:$offset)), - (i32 IntRegs:$addend)), - (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>, + IntRegs:$addend), + (add IntRegs:$base, u6_1ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // memh(Rs+#u6:1) -= Rt @@ -4711,10 +3098,10 @@ let AddedComplexity = 30 in def MEMh_SUBr_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$subend), "memh($base+#$offset) -= $subend", - [(truncstorei16 (sub (sextloadi16 (add (i32 IntRegs:$base), + [(truncstorei16 (sub (sextloadi16 (add IntRegs:$base, u6_1ImmPred:$offset)), - (i32 IntRegs:$subend)), - (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>, + IntRegs:$subend), + (add IntRegs:$base, u6_1ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // memh(Rs+#u6:1) &= Rt @@ -4722,10 +3109,10 @@ let AddedComplexity = 30 in def MEMh_ANDr_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$andend), "memh($base+#$offset) += $andend", - [(truncstorei16 (and (sextloadi16 (add (i32 IntRegs:$base), + [(truncstorei16 (and (sextloadi16 (add IntRegs:$base, u6_1ImmPred:$offset)), - (i32 IntRegs:$andend)), - (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>, + IntRegs:$andend), + (add IntRegs:$base, u6_1ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // memh(Rs+#u6:1) |= Rt @@ -4733,10 +3120,10 @@ let AddedComplexity = 30 in def MEMh_ORr_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$orend), "memh($base+#$offset) |= $orend", - [(truncstorei16 (or (sextloadi16 (add (i32 IntRegs:$base), + [(truncstorei16 (or (sextloadi16 (add IntRegs:$base, u6_1ImmPred:$offset)), - (i32 IntRegs:$orend)), - (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>, + IntRegs:$orend), + (add IntRegs:$base, u6_1ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // MEMh_ADDSUBi_V4: @@ -4772,7 +3159,7 @@ def MEMh_ADDr_MEM_V4 : MEMInst_V4<(outs), (ins MEMri:$addr, IntRegs:$addend), "memh($addr) += $addend", [(truncstorei16 (add (sextloadi16 ADDRriU6_1:$addr), - (i32 IntRegs:$addend)), ADDRriU6_1:$addr)]>, + IntRegs:$addend), ADDRriU6_1:$addr)]>, Requires<[HasV4T, UseMEMOP]>; // memh(Rs+#u6:1) -= Rt @@ -4781,7 +3168,7 @@ def MEMh_SUBr_MEM_V4 : MEMInst_V4<(outs), (ins MEMri:$addr, IntRegs:$subend), "memh($addr) -= $subend", [(truncstorei16 (sub (sextloadi16 ADDRriU6_1:$addr), - (i32 IntRegs:$subend)), ADDRriU6_1:$addr)]>, + IntRegs:$subend), ADDRriU6_1:$addr)]>, Requires<[HasV4T, UseMEMOP]>; // memh(Rs+#u6:1) &= Rt @@ -4790,7 +3177,7 @@ def MEMh_ANDr_MEM_V4 : MEMInst_V4<(outs), (ins MEMri:$addr, IntRegs:$andend), "memh($addr) &= $andend", [(truncstorei16 (and (sextloadi16 ADDRriU6_1:$addr), - (i32 IntRegs:$andend)), ADDRriU6_1:$addr)]>, + IntRegs:$andend), ADDRriU6_1:$addr)]>, Requires<[HasV4T, UseMEMOP]>; // memh(Rs+#u6:1) |= Rt @@ -4799,7 +3186,7 @@ def MEMh_ORr_MEM_V4 : MEMInst_V4<(outs), (ins MEMri:$addr, IntRegs:$orend), "memh($addr) |= $orend", [(truncstorei16 (or (sextloadi16 ADDRriU6_1:$addr), - (i32 IntRegs:$orend)), ADDRriU6_1:$addr)]>, + IntRegs:$orend), ADDRriU6_1:$addr)]>, Requires<[HasV4T, UseMEMOP]>; @@ -4836,10 +3223,10 @@ let AddedComplexity = 30 in def MEMb_ADDSUBi_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_0Imm:$offset, m6Imm:$addend), "Error; should not emit", - [(truncstorei8 (add (sextloadi8 (add (i32 IntRegs:$base), + [(truncstorei8 (add (sextloadi8 (add IntRegs:$base, u6_0ImmPred:$offset)), m6ImmPred:$addend), - (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>, + (add IntRegs:$base, u6_0ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // memb(Rs+#u6:0) += #U5 @@ -4863,10 +3250,10 @@ let AddedComplexity = 30 in def MEMb_ADDr_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$addend), "memb($base+#$offset) += $addend", - [(truncstorei8 (add (sextloadi8 (add (i32 IntRegs:$base), + [(truncstorei8 (add (sextloadi8 (add IntRegs:$base, u6_0ImmPred:$offset)), - (i32 IntRegs:$addend)), - (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>, + IntRegs:$addend), + (add IntRegs:$base, u6_0ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // memb(Rs+#u6:0) -= Rt @@ -4874,10 +3261,10 @@ let AddedComplexity = 30 in def MEMb_SUBr_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$subend), "memb($base+#$offset) -= $subend", - [(truncstorei8 (sub (sextloadi8 (add (i32 IntRegs:$base), + [(truncstorei8 (sub (sextloadi8 (add IntRegs:$base, u6_0ImmPred:$offset)), - (i32 IntRegs:$subend)), - (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>, + IntRegs:$subend), + (add IntRegs:$base, u6_0ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // memb(Rs+#u6:0) &= Rt @@ -4885,10 +3272,10 @@ let AddedComplexity = 30 in def MEMb_ANDr_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$andend), "memb($base+#$offset) += $andend", - [(truncstorei8 (and (sextloadi8 (add (i32 IntRegs:$base), + [(truncstorei8 (and (sextloadi8 (add IntRegs:$base, u6_0ImmPred:$offset)), - (i32 IntRegs:$andend)), - (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>, + IntRegs:$andend), + (add IntRegs:$base, u6_0ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // memb(Rs+#u6:0) |= Rt @@ -4896,10 +3283,10 @@ let AddedComplexity = 30 in def MEMb_ORr_indexed_MEM_V4 : MEMInst_V4<(outs), (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$orend), "memb($base+#$offset) |= $orend", - [(truncstorei8 (or (sextloadi8 (add (i32 IntRegs:$base), + [(truncstorei8 (or (sextloadi8 (add IntRegs:$base, u6_0ImmPred:$offset)), - (i32 IntRegs:$orend)), - (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>, + IntRegs:$orend), + (add IntRegs:$base, u6_0ImmPred:$offset))]>, Requires<[HasV4T, UseMEMOP]>; // MEMb_ADDSUBi_V4: @@ -4935,7 +3322,7 @@ def MEMb_ADDr_MEM_V4 : MEMInst_V4<(outs), (ins MEMri:$addr, IntRegs:$addend), "memb($addr) += $addend", [(truncstorei8 (add (sextloadi8 ADDRriU6_0:$addr), - (i32 IntRegs:$addend)), ADDRriU6_0:$addr)]>, + IntRegs:$addend), ADDRriU6_0:$addr)]>, Requires<[HasV4T, UseMEMOP]>; // memb(Rs+#u6:0) -= Rt @@ -4944,7 +3331,7 @@ def MEMb_SUBr_MEM_V4 : MEMInst_V4<(outs), (ins MEMri:$addr, IntRegs:$subend), "memb($addr) -= $subend", [(truncstorei8 (sub (sextloadi8 ADDRriU6_0:$addr), - (i32 IntRegs:$subend)), ADDRriU6_0:$addr)]>, + IntRegs:$subend), ADDRriU6_0:$addr)]>, Requires<[HasV4T, UseMEMOP]>; // memb(Rs+#u6:0) &= Rt @@ -4953,7 +3340,7 @@ def MEMb_ANDr_MEM_V4 : MEMInst_V4<(outs), (ins MEMri:$addr, IntRegs:$andend), "memb($addr) &= $andend", [(truncstorei8 (and (sextloadi8 ADDRriU6_0:$addr), - (i32 IntRegs:$andend)), ADDRriU6_0:$addr)]>, + IntRegs:$andend), ADDRriU6_0:$addr)]>, Requires<[HasV4T, UseMEMOP]>; // memb(Rs+#u6:0) |= Rt @@ -4962,7 +3349,7 @@ def MEMb_ORr_MEM_V4 : MEMInst_V4<(outs), (ins MEMri:$addr, IntRegs:$orend), "memb($addr) |= $orend", [(truncstorei8 (or (sextloadi8 ADDRriU6_0:$addr), - (i32 IntRegs:$orend)), ADDRriU6_0:$addr)]>, + IntRegs:$orend), ADDRriU6_0:$addr)]>, Requires<[HasV4T, UseMEMOP]>; @@ -4977,16 +3364,13 @@ def MEMb_ORr_MEM_V4 : MEMInst_V4<(outs), // The implemented patterns are: EQ/GT/GTU. // Missing patterns are: GE/GEU/LT/LTU/LE/LEU. -// Following instruction is not being extended as it results into the -// incorrect code for negative numbers. // Pd=cmpb.eq(Rs,#u8) - let isCompare = 1 in def CMPbEQri_V4 : MInst<(outs PredRegs:$dst), (ins IntRegs:$src1, u8Imm:$src2), "$dst = cmpb.eq($src1, #$src2)", - [(set (i1 PredRegs:$dst), - (seteq (and (i32 IntRegs:$src1), 255), u8ImmPred:$src2))]>, + [(set PredRegs:$dst, (seteq (and IntRegs:$src1, 255), + u8ImmPred:$src2))]>, Requires<[HasV4T]>; // Pd=cmpb.eq(Rs,Rt) @@ -4994,9 +3378,10 @@ let isCompare = 1 in def CMPbEQrr_ubub_V4 : MInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst = cmpb.eq($src1, $src2)", - [(set (i1 PredRegs:$dst), - (seteq (and (xor (i32 IntRegs:$src1), - (i32 IntRegs:$src2)), 255), 0))]>, + [(set PredRegs:$dst, (seteq (and (xor IntRegs:$src1, + IntRegs:$src2), + 255), + 0))]>, Requires<[HasV4T]>; // Pd=cmpb.eq(Rs,Rt) @@ -5004,31 +3389,26 @@ let isCompare = 1 in def CMPbEQrr_sbsb_V4 : MInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst = cmpb.eq($src1, $src2)", - [(set (i1 PredRegs:$dst), - (seteq (shl (i32 IntRegs:$src1), (i32 24)), - (shl (i32 IntRegs:$src2), (i32 24))))]>, + [(set PredRegs:$dst, (seteq (shl IntRegs:$src1, (i32 24)), + (shl IntRegs:$src2, (i32 24))))]>, Requires<[HasV4T]>; -/* Incorrect Pattern -- immediate should be right shifted before being -used in the cmpb.gt instruction. // Pd=cmpb.gt(Rs,#s8) let isCompare = 1 in def CMPbGTri_V4 : MInst<(outs PredRegs:$dst), - (ins IntRegs:$src1, s8Imm:$src2), + (ins IntRegs:$src1, s32Imm:$src2), "$dst = cmpb.gt($src1, #$src2)", - [(set (i1 PredRegs:$dst), (setgt (shl (i32 IntRegs:$src1), (i32 24)), - s8ImmPred:$src2))]>, + [(set PredRegs:$dst, (setgt (shl IntRegs:$src1, (i32 24)), + s32_24ImmPred:$src2))]>, Requires<[HasV4T]>; -*/ // Pd=cmpb.gt(Rs,Rt) let isCompare = 1 in def CMPbGTrr_V4 : MInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst = cmpb.gt($src1, $src2)", - [(set (i1 PredRegs:$dst), - (setgt (shl (i32 IntRegs:$src1), (i32 24)), - (shl (i32 IntRegs:$src2), (i32 24))))]>, + [(set PredRegs:$dst, (setgt (shl IntRegs:$src1, (i32 24)), + (shl IntRegs:$src2, (i32 24))))]>, Requires<[HasV4T]>; // Pd=cmpb.gtu(Rs,#u7) @@ -5036,8 +3416,8 @@ let isCompare = 1 in def CMPbGTUri_V4 : MInst<(outs PredRegs:$dst), (ins IntRegs:$src1, u7Imm:$src2), "$dst = cmpb.gtu($src1, #$src2)", - [(set (i1 PredRegs:$dst), (setugt (and (i32 IntRegs:$src1), 255), - u7ImmPred:$src2))]>, + [(set PredRegs:$dst, (setugt (and IntRegs:$src1, 255), + u7ImmPred:$src2))]>, Requires<[HasV4T]>; // Pd=cmpb.gtu(Rs,Rt) @@ -5045,21 +3425,18 @@ let isCompare = 1 in def CMPbGTUrr_V4 : MInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst = cmpb.gtu($src1, $src2)", - [(set (i1 PredRegs:$dst), (setugt (and (i32 IntRegs:$src1), 255), - (and (i32 IntRegs:$src2), 255)))]>, + [(set PredRegs:$dst, (setugt (and IntRegs:$src1, 255), + (and IntRegs:$src2, 255)))]>, Requires<[HasV4T]>; -// Following instruction is not being extended as it results into the incorrect -// code for negative numbers. - // Signed half compare(.eq) ri. // Pd=cmph.eq(Rs,#s8) let isCompare = 1 in def CMPhEQri_V4 : MInst<(outs PredRegs:$dst), - (ins IntRegs:$src1, s8Imm:$src2), + (ins IntRegs:$src1, u16Imm:$src2), "$dst = cmph.eq($src1, #$src2)", - [(set (i1 PredRegs:$dst), (seteq (and (i32 IntRegs:$src1), 65535), - s8ImmPred:$src2))]>, + [(set PredRegs:$dst, (seteq (and IntRegs:$src1, 65535), + u16_s8ImmPred:$src2))]>, Requires<[HasV4T]>; // Signed half compare(.eq) rr. @@ -5072,9 +3449,10 @@ let isCompare = 1 in def CMPhEQrr_xor_V4 : MInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst = cmph.eq($src1, $src2)", - [(set (i1 PredRegs:$dst), (seteq (and (xor (i32 IntRegs:$src1), - (i32 IntRegs:$src2)), - 65535), 0))]>, + [(set PredRegs:$dst, (seteq (and (xor IntRegs:$src1, + IntRegs:$src2), + 65535), + 0))]>, Requires<[HasV4T]>; // Signed half compare(.eq) rr. @@ -5087,25 +3465,19 @@ let isCompare = 1 in def CMPhEQrr_shl_V4 : MInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst = cmph.eq($src1, $src2)", - [(set (i1 PredRegs:$dst), - (seteq (shl (i32 IntRegs:$src1), (i32 16)), - (shl (i32 IntRegs:$src2), (i32 16))))]>, + [(set PredRegs:$dst, (seteq (shl IntRegs:$src1, (i32 16)), + (shl IntRegs:$src2, (i32 16))))]>, Requires<[HasV4T]>; -/* Incorrect Pattern -- immediate should be right shifted before being -used in the cmph.gt instruction. // Signed half compare(.gt) ri. // Pd=cmph.gt(Rs,#s8) - let isCompare = 1 in def CMPhGTri_V4 : MInst<(outs PredRegs:$dst), - (ins IntRegs:$src1, s8Imm:$src2), + (ins IntRegs:$src1, s32Imm:$src2), "$dst = cmph.gt($src1, #$src2)", - [(set (i1 PredRegs:$dst), - (setgt (shl (i32 IntRegs:$src1), (i32 16)), - s8ImmPred:$src2))]>, + [(set PredRegs:$dst, (setgt (shl IntRegs:$src1, (i32 16)), + s32_16s8ImmPred:$src2))]>, Requires<[HasV4T]>; -*/ // Signed half compare(.gt) rr. // Pd=cmph.gt(Rs,Rt) @@ -5113,9 +3485,8 @@ let isCompare = 1 in def CMPhGTrr_shl_V4 : MInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst = cmph.gt($src1, $src2)", - [(set (i1 PredRegs:$dst), - (setgt (shl (i32 IntRegs:$src1), (i32 16)), - (shl (i32 IntRegs:$src2), (i32 16))))]>, + [(set PredRegs:$dst, (setgt (shl IntRegs:$src1, (i32 16)), + (shl IntRegs:$src2, (i32 16))))]>, Requires<[HasV4T]>; // Unsigned half compare rr (.gtu). @@ -5124,9 +3495,8 @@ let isCompare = 1 in def CMPhGTUrr_V4 : MInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2), "$dst = cmph.gtu($src1, $src2)", - [(set (i1 PredRegs:$dst), - (setugt (and (i32 IntRegs:$src1), 65535), - (and (i32 IntRegs:$src2), 65535)))]>, + [(set PredRegs:$dst, (setugt (and IntRegs:$src1, 65535), + (and IntRegs:$src2, 65535)))]>, Requires<[HasV4T]>; // Unsigned half compare ri (.gtu). @@ -5135,8 +3505,8 @@ let isCompare = 1 in def CMPhGTUri_V4 : MInst<(outs PredRegs:$dst), (ins IntRegs:$src1, u7Imm:$src2), "$dst = cmph.gtu($src1, #$src2)", - [(set (i1 PredRegs:$dst), (setugt (and (i32 IntRegs:$src1), 65535), - u7ImmPred:$src2))]>, + [(set PredRegs:$dst, (setugt (and IntRegs:$src1, 65535), + u7ImmPred:$src2))]>, Requires<[HasV4T]>; //===----------------------------------------------------------------------===// @@ -5153,37 +3523,9 @@ let isReturn = 1, isTerminator = 1, isBarrier = 1, isPredicable = 1, Requires<[HasV4T]>; } -// Restore registers and dealloc return function call. -let isCall = 1, isBarrier = 1, isReturn = 1, isTerminator = 1, - Defs = [R29, R30, R31, PC] in { - def RESTORE_DEALLOC_RET_JMP_V4 : JInst<(outs), (ins calltarget:$dst, variable_ops), - "jump $dst // Restore_and_dealloc_return", - []>, - Requires<[HasV4T]>; -} - -// Restore registers and dealloc frame before a tail call. -let isCall = 1, isBarrier = 1, - Defs = [R29, R30, R31, PC] in { - def RESTORE_DEALLOC_BEFORE_TAILCALL_V4 : JInst<(outs), (ins calltarget:$dst, variable_ops), - "call $dst // Restore_and_dealloc_before_tailcall", - []>, - Requires<[HasV4T]>; -} - -// Save registers function call. -let isCall = 1, isBarrier = 1, - Uses = [R29, R31] in { - def SAVE_REGISTERS_CALL_V4 : JInst<(outs), (ins calltarget:$dst, variable_ops), - "call $dst // Save_calle_saved_registers", - []>, - Requires<[HasV4T]>; -} - // if (Ps) dealloc_return let isReturn = 1, isTerminator = 1, - Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1, - isPredicated = 1 in { + Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1 in { def DEALLOC_RET_cPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, i32imm:$amt1), "if ($src1) dealloc_return", []>, @@ -5192,8 +3534,7 @@ let isReturn = 1, isTerminator = 1, // if (!Ps) dealloc_return let isReturn = 1, isTerminator = 1, - Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1, - isPredicated = 1 in { + Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1 in { def DEALLOC_RET_cNotPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, i32imm:$amt1), "if (!$src1) dealloc_return", @@ -5203,8 +3544,7 @@ let isReturn = 1, isTerminator = 1, // if (Ps.new) dealloc_return:nt let isReturn = 1, isTerminator = 1, - Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1, - isPredicated = 1 in { + Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1 in { def DEALLOC_RET_cdnPnt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, i32imm:$amt1), "if ($src1.new) dealloc_return:nt", @@ -5214,8 +3554,7 @@ let isReturn = 1, isTerminator = 1, // if (!Ps.new) dealloc_return:nt let isReturn = 1, isTerminator = 1, - Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1, - isPredicated = 1 in { + Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1 in { def DEALLOC_RET_cNotdnPnt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, i32imm:$amt1), "if (!$src1.new) dealloc_return:nt", @@ -5225,8 +3564,7 @@ let isReturn = 1, isTerminator = 1, // if (Ps.new) dealloc_return:t let isReturn = 1, isTerminator = 1, - Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1, - isPredicated = 1 in { + Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1 in { def DEALLOC_RET_cdnPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, i32imm:$amt1), "if ($src1.new) dealloc_return:t", @@ -5236,511 +3574,10 @@ let isReturn = 1, isTerminator = 1, // if (!Ps.new) dealloc_return:nt let isReturn = 1, isTerminator = 1, - Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1, - isPredicated = 1 in { + Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1 in { def DEALLOC_RET_cNotdnPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1, i32imm:$amt1), "if (!$src1.new) dealloc_return:t", []>, Requires<[HasV4T]>; } - - -// Load/Store with absolute addressing mode -// memw(#u6)=Rt - -multiclass ST_abs { - let isPredicable = 1 in - def _abs_V4 : STInst<(outs), - (ins globaladdress:$absaddr, IntRegs:$src), - !strconcat(OpcStr, "(##$absaddr) = $src"), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), - !strconcat("if ($src1)", !strconcat(OpcStr, "(##$absaddr) = $src2")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), - !strconcat("if (!$src1)", !strconcat(OpcStr, "(##$absaddr) = $src2")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cdnPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), - !strconcat("if ($src1.new)", !strconcat(OpcStr, "(##$absaddr) = $src2")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cdnNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), - !strconcat("if (!$src1.new)", !strconcat(OpcStr, "(##$absaddr) = $src2")), - []>, - Requires<[HasV4T]>; - - def _abs_nv_V4 : STInst<(outs), - (ins globaladdress:$absaddr, IntRegs:$src), - !strconcat(OpcStr, "(##$absaddr) = $src.new"), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cPt_nv_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), - !strconcat("if ($src1)", !strconcat(OpcStr, "(##$absaddr) = $src2.new")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cNotPt_nv_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), - !strconcat("if (!$src1)", !strconcat(OpcStr, "(##$absaddr) = $src2.new")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cdnPt_nv_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), - !strconcat("if ($src1.new)", !strconcat(OpcStr, "(##$absaddr) = $src2.new")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cdnNotPt_nv_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2), - !strconcat("if (!$src1.new)", !strconcat(OpcStr, "(##$absaddr) = $src2.new")), - []>, - Requires<[HasV4T]>; -} - -let AddedComplexity = 30, isPredicable = 1 in -def STrid_abs_V4 : STInst<(outs), - (ins globaladdress:$absaddr, DoubleRegs:$src), - "memd(##$absaddr) = $src", - [(store (i64 DoubleRegs:$src), (HexagonCONST32 tglobaladdr:$absaddr))]>, - Requires<[HasV4T]>; - -let AddedComplexity = 30, isPredicated = 1 in -def STrid_abs_cPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2), - "if ($src1) memd(##$absaddr) = $src2", - []>, - Requires<[HasV4T]>; - -let AddedComplexity = 30, isPredicated = 1 in -def STrid_abs_cNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2), - "if (!$src1) memd(##$absaddr) = $src2", - []>, - Requires<[HasV4T]>; - -let AddedComplexity = 30, isPredicated = 1 in -def STrid_abs_cdnPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2), - "if ($src1.new) memd(##$absaddr) = $src2", - []>, - Requires<[HasV4T]>; - -let AddedComplexity = 30, isPredicated = 1 in -def STrid_abs_cdnNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2), - "if (!$src1.new) memd(##$absaddr) = $src2", - []>, - Requires<[HasV4T]>; - -defm STrib : ST_abs<"memb">; -defm STrih : ST_abs<"memh">; -defm STriw : ST_abs<"memw">; - -let Predicates = [HasV4T], AddedComplexity = 30 in -def : Pat<(truncstorei8 (i32 IntRegs:$src1), (HexagonCONST32 tglobaladdr:$absaddr)), - (STrib_abs_V4 tglobaladdr: $absaddr, IntRegs: $src1)>; - -let Predicates = [HasV4T], AddedComplexity = 30 in -def : Pat<(truncstorei16 (i32 IntRegs:$src1), (HexagonCONST32 tglobaladdr:$absaddr)), - (STrih_abs_V4 tglobaladdr: $absaddr, IntRegs: $src1)>; - -let Predicates = [HasV4T], AddedComplexity = 30 in -def : Pat<(store (i32 IntRegs:$src1), (HexagonCONST32 tglobaladdr:$absaddr)), - (STriw_abs_V4 tglobaladdr: $absaddr, IntRegs: $src1)>; - - -multiclass LD_abs { - let isPredicable = 1 in - def _abs_V4 : LDInst<(outs IntRegs:$dst), - (ins globaladdress:$absaddr), - !strconcat("$dst = ", !strconcat(OpcStr, "(##$absaddr)")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$absaddr), - !strconcat("if ($src1) $dst = ", !strconcat(OpcStr, "(##$absaddr)")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$absaddr), - !strconcat("if (!$src1) $dst = ", !strconcat(OpcStr, "(##$absaddr)")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cdnPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$absaddr), - !strconcat("if ($src1.new) $dst = ", !strconcat(OpcStr, "(##$absaddr)")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$absaddr), - !strconcat("if (!$src1.new) $dst = ", !strconcat(OpcStr, "(##$absaddr)")), - []>, - Requires<[HasV4T]>; -} - -let AddedComplexity = 30 in -def LDrid_abs_V4 : LDInst<(outs DoubleRegs:$dst), - (ins globaladdress:$absaddr), - "$dst = memd(##$absaddr)", - [(set (i64 DoubleRegs:$dst), (load (HexagonCONST32 tglobaladdr:$absaddr)))]>, - Requires<[HasV4T]>; - -let AddedComplexity = 30, isPredicated = 1 in -def LDrid_abs_cPt_V4 : LDInst<(outs DoubleRegs:$dst), - (ins PredRegs:$src1, globaladdress:$absaddr), - "if ($src1) $dst = memd(##$absaddr)", - []>, - Requires<[HasV4T]>; - -let AddedComplexity = 30, isPredicated = 1 in -def LDrid_abs_cNotPt_V4 : LDInst<(outs DoubleRegs:$dst), - (ins PredRegs:$src1, globaladdress:$absaddr), - "if (!$src1) $dst = memd(##$absaddr)", - []>, - Requires<[HasV4T]>; - -let AddedComplexity = 30, isPredicated = 1 in -def LDrid_abs_cdnPt_V4 : LDInst<(outs DoubleRegs:$dst), - (ins PredRegs:$src1, globaladdress:$absaddr), - "if ($src1.new) $dst = memd(##$absaddr)", - []>, - Requires<[HasV4T]>; - -let AddedComplexity = 30, isPredicated = 1 in -def LDrid_abs_cdnNotPt_V4 : LDInst<(outs DoubleRegs:$dst), - (ins PredRegs:$src1, globaladdress:$absaddr), - "if (!$src1.new) $dst = memd(##$absaddr)", - []>, - Requires<[HasV4T]>; - -defm LDrib : LD_abs<"memb">; -defm LDriub : LD_abs<"memub">; -defm LDrih : LD_abs<"memh">; -defm LDriuh : LD_abs<"memuh">; -defm LDriw : LD_abs<"memw">; - - -let Predicates = [HasV4T], AddedComplexity = 30 in -def : Pat<(i32 (load (HexagonCONST32 tglobaladdr:$absaddr))), - (LDriw_abs_V4 tglobaladdr: $absaddr)>; - -let Predicates = [HasV4T], AddedComplexity=30 in -def : Pat<(i32 (sextloadi8 (HexagonCONST32 tglobaladdr:$absaddr))), - (LDrib_abs_V4 tglobaladdr:$absaddr)>; - -let Predicates = [HasV4T], AddedComplexity=30 in -def : Pat<(i32 (zextloadi8 (HexagonCONST32 tglobaladdr:$absaddr))), - (LDriub_abs_V4 tglobaladdr:$absaddr)>; - -let Predicates = [HasV4T], AddedComplexity=30 in -def : Pat<(i32 (sextloadi16 (HexagonCONST32 tglobaladdr:$absaddr))), - (LDrih_abs_V4 tglobaladdr:$absaddr)>; - -let Predicates = [HasV4T], AddedComplexity=30 in -def : Pat<(i32 (zextloadi16 (HexagonCONST32 tglobaladdr:$absaddr))), - (LDriuh_abs_V4 tglobaladdr:$absaddr)>; - -// Transfer global address into a register -let AddedComplexity=50, isMoveImm = 1, isReMaterializable = 1 in -def TFRI_V4 : ALU32_ri<(outs IntRegs:$dst), (ins globaladdress:$src1), - "$dst = ##$src1", - [(set IntRegs:$dst, (HexagonCONST32 tglobaladdr:$src1))]>, - Requires<[HasV4T]>; - -let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in -def TFRI_cPt_V4 : ALU32_ri<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$src2), - "if($src1) $dst = ##$src2", - []>, - Requires<[HasV4T]>; - -let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in -def TFRI_cNotPt_V4 : ALU32_ri<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$src2), - "if(!$src1) $dst = ##$src2", - []>, - Requires<[HasV4T]>; - -let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in -def TFRI_cdnPt_V4 : ALU32_ri<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$src2), - "if($src1.new) $dst = ##$src2", - []>, - Requires<[HasV4T]>; - -let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in -def TFRI_cdnNotPt_V4 : ALU32_ri<(outs IntRegs:$dst), - (ins PredRegs:$src1, globaladdress:$src2), - "if(!$src1.new) $dst = ##$src2", - []>, - Requires<[HasV4T]>; - -let AddedComplexity = 50, Predicates = [HasV4T] in -def : Pat<(HexagonCONST32_GP tglobaladdr:$src1), - (TFRI_V4 tglobaladdr:$src1)>; - - -// Load - Indirect with long offset: These instructions take global address -// as an operand -let AddedComplexity = 10 in -def LDrid_ind_lo_V4 : LDInst<(outs DoubleRegs:$dst), - (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$offset), - "$dst=memd($src1<<#$src2+##$offset)", - [(set (i64 DoubleRegs:$dst), - (load (add (shl IntRegs:$src1, u2ImmPred:$src2), - (HexagonCONST32 tglobaladdr:$offset))))]>, - Requires<[HasV4T]>; - -let AddedComplexity = 10 in -multiclass LD_indirect_lo { - def _lo_V4 : LDInst<(outs IntRegs:$dst), - (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$offset), - !strconcat("$dst = ", !strconcat(OpcStr, "($src1<<#$src2+##$offset)")), - [(set IntRegs:$dst, - (i32 (OpNode (add (shl IntRegs:$src1, u2ImmPred:$src2), - (HexagonCONST32 tglobaladdr:$offset)))))]>, - Requires<[HasV4T]>; -} - -defm LDrib_ind : LD_indirect_lo<"memb", sextloadi8>; -defm LDriub_ind : LD_indirect_lo<"memub", zextloadi8>; -defm LDrih_ind : LD_indirect_lo<"memh", sextloadi16>; -defm LDriuh_ind : LD_indirect_lo<"memuh", zextloadi16>; -defm LDriw_ind : LD_indirect_lo<"memw", load>; - -// Store - Indirect with long offset: These instructions take global address -// as an operand -let AddedComplexity = 10 in -def STrid_ind_lo_V4 : STInst<(outs), - (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$src3, - DoubleRegs:$src4), - "memd($src1<<#$src2+#$src3) = $src4", - [(store (i64 DoubleRegs:$src4), - (add (shl IntRegs:$src1, u2ImmPred:$src2), - (HexagonCONST32 tglobaladdr:$src3)))]>, - Requires<[HasV4T]>; - -let AddedComplexity = 10 in -multiclass ST_indirect_lo { - def _lo_V4 : STInst<(outs), - (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$src3, - IntRegs:$src4), - !strconcat(OpcStr, "($src1<<#$src2+##$src3) = $src4"), - [(OpNode (i32 IntRegs:$src4), - (add (shl IntRegs:$src1, u2ImmPred:$src2), - (HexagonCONST32 tglobaladdr:$src3)))]>, - Requires<[HasV4T]>; -} - -defm STrib_ind : ST_indirect_lo<"memb", truncstorei8>; -defm STrih_ind : ST_indirect_lo<"memh", truncstorei16>; -defm STriw_ind : ST_indirect_lo<"memw", store>; - -// Store - absolute addressing mode: These instruction take constant -// value as the extended operand -multiclass ST_absimm { - let isPredicable = 1 in - def _abs_V4 : STInst<(outs), - (ins u6Imm:$src1, IntRegs:$src2), - !strconcat(OpcStr, "(#$src1) = $src2"), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cPt_V4 : STInst<(outs), - (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), - !strconcat("if ($src1)", !strconcat(OpcStr, "(#$src2) = $src3")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), - !strconcat("if (!$src1)", !strconcat(OpcStr, "(#$src2) = $src3")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cdnPt_V4 : STInst<(outs), - (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), - !strconcat("if ($src1.new)", !strconcat(OpcStr, "(#$src2) = $src3")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cdnNotPt_V4 : STInst<(outs), - (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), - !strconcat("if (!$src1.new)", !strconcat(OpcStr, "(#$src2) = $src3")), - []>, - Requires<[HasV4T]>; - - def _abs_nv_V4 : STInst<(outs), - (ins u6Imm:$src1, IntRegs:$src2), - !strconcat(OpcStr, "(#$src1) = $src2.new"), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cPt_nv_V4 : STInst<(outs), - (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), - !strconcat("if ($src1)", !strconcat(OpcStr, "(#$src2) = $src3.new")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cNotPt_nv_V4 : STInst<(outs), - (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), - !strconcat("if (!$src1)", !strconcat(OpcStr, "(#$src2) = $src3.new")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cdnPt_nv_V4 : STInst<(outs), - (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), - !strconcat("if ($src1.new)", !strconcat(OpcStr, "(#$src2) = $src3.new")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cdnNotPt_nv_V4 : STInst<(outs), - (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3), - !strconcat("if (!$src1.new)", !strconcat(OpcStr, "(#$src2) = $src3.new")), - []>, - Requires<[HasV4T]>; -} - -defm STrib_imm : ST_absimm<"memb">; -defm STrih_imm : ST_absimm<"memh">; -defm STriw_imm : ST_absimm<"memw">; - -let Predicates = [HasV4T], AddedComplexity = 30 in -def : Pat<(truncstorei8 (i32 IntRegs:$src1), u6ImmPred:$src2), - (STrib_imm_abs_V4 u6ImmPred:$src2, IntRegs: $src1)>; - -let Predicates = [HasV4T], AddedComplexity = 30 in -def : Pat<(truncstorei16 (i32 IntRegs:$src1), u6ImmPred:$src2), - (STrih_imm_abs_V4 u6ImmPred:$src2, IntRegs: $src1)>; - -let Predicates = [HasV4T], AddedComplexity = 30 in -def : Pat<(store (i32 IntRegs:$src1), u6ImmPred:$src2), - (STriw_imm_abs_V4 u6ImmPred:$src2, IntRegs: $src1)>; - - -// Load - absolute addressing mode: These instruction take constant -// value as the extended operand - -multiclass LD_absimm { - let isPredicable = 1 in - def _abs_V4 : LDInst<(outs IntRegs:$dst), - (ins u6Imm:$src), - !strconcat("$dst = ", !strconcat(OpcStr, "(#$src)")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, u6Imm:$src2), - !strconcat("if ($src1) $dst = ", !strconcat(OpcStr, "(#$src2)")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, u6Imm:$src2), - !strconcat("if (!$src1) $dst = ", !strconcat(OpcStr, "(#$src2)")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cdnPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, u6Imm:$src2), - !strconcat("if ($src1.new) $dst = ", !strconcat(OpcStr, "(#$src2)")), - []>, - Requires<[HasV4T]>; - - let isPredicated = 1 in - def _abs_cdnNotPt_V4 : LDInst<(outs IntRegs:$dst), - (ins PredRegs:$src1, u6Imm:$src2), - !strconcat("if (!$src1.new) $dst = ", !strconcat(OpcStr, "(#$src2)")), - []>, - Requires<[HasV4T]>; -} - -defm LDrib_imm : LD_absimm<"memb">; -defm LDriub_imm : LD_absimm<"memub">; -defm LDrih_imm : LD_absimm<"memh">; -defm LDriuh_imm : LD_absimm<"memuh">; -defm LDriw_imm : LD_absimm<"memw">; - -let Predicates = [HasV4T], AddedComplexity = 30 in -def : Pat<(i32 (load u6ImmPred:$src)), - (LDriw_imm_abs_V4 u6ImmPred:$src)>; - -let Predicates = [HasV4T], AddedComplexity=30 in -def : Pat<(i32 (sextloadi8 u6ImmPred:$src)), - (LDrib_imm_abs_V4 u6ImmPred:$src)>; - -let Predicates = [HasV4T], AddedComplexity=30 in -def : Pat<(i32 (zextloadi8 u6ImmPred:$src)), - (LDriub_imm_abs_V4 u6ImmPred:$src)>; - -let Predicates = [HasV4T], AddedComplexity=30 in -def : Pat<(i32 (sextloadi16 u6ImmPred:$src)), - (LDrih_imm_abs_V4 u6ImmPred:$src)>; - -let Predicates = [HasV4T], AddedComplexity=30 in -def : Pat<(i32 (zextloadi16 u6ImmPred:$src)), - (LDriuh_imm_abs_V4 u6ImmPred:$src)>; - - -// Indexed store double word - global address. -// memw(Rs+#u6:2)=#S8 -let AddedComplexity = 10 in -def STriw_offset_ext_V4 : STInst<(outs), - (ins IntRegs:$src1, u6_2Imm:$src2, globaladdress:$src3), - "memw($src1+#$src2) = ##$src3", - [(store (HexagonCONST32 tglobaladdr:$src3), - (add IntRegs:$src1, u6_2ImmPred:$src2))]>, - Requires<[HasV4T]>; - - -// Indexed store double word - global address. -// memw(Rs+#u6:2)=#S8 -let AddedComplexity = 10 in -def STrih_offset_ext_V4 : STInst<(outs), - (ins IntRegs:$src1, u6_1Imm:$src2, globaladdress:$src3), - "memh($src1+#$src2) = ##$src3", - [(truncstorei16 (HexagonCONST32 tglobaladdr:$src3), - (add IntRegs:$src1, u6_1ImmPred:$src2))]>, - Requires<[HasV4T]>; diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonMCInstLower.cpp b/contrib/llvm/lib/Target/Hexagon/HexagonMCInstLower.cpp index 70bddcc76a5..fbb331bdd8b 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonMCInstLower.cpp +++ b/contrib/llvm/lib/Target/Hexagon/HexagonMCInstLower.cpp @@ -49,7 +49,7 @@ void llvm::HexagonLowerToMC(const MachineInstr* MI, MCInst& MCI, switch (MO.getType()) { default: MI->dump(); - llvm_unreachable("unknown operand type"); + assert(0 && "unknown operand type"); case MachineOperand::MO_Register: // Ignore all implicit register operands. if (MO.isImplicit()) continue; diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonSchedule.td b/contrib/llvm/lib/Target/Hexagon/HexagonSchedule.td index c4887963895..fbea4452ec6 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonSchedule.td +++ b/contrib/llvm/lib/Target/Hexagon/HexagonSchedule.td @@ -13,6 +13,7 @@ def LSUNIT : FuncUnit; def MUNIT : FuncUnit; def SUNIT : FuncUnit; + // Itinerary classes def ALU32 : InstrItinClass; def ALU64 : InstrItinClass; @@ -23,25 +24,23 @@ def LD : InstrItinClass; def M : InstrItinClass; def ST : InstrItinClass; def S : InstrItinClass; -def SYS : InstrItinClass; -def MARKER : InstrItinClass; def PSEUDO : InstrItinClass; + def HexagonItineraries : - ProcessorItineraries<[LUNIT, LSUNIT, MUNIT, SUNIT], [], [ - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]> - ]>; + ProcessorItineraries<[LUNIT, LSUNIT, MUNIT, SUNIT], [], [ + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]> +]>; + //===----------------------------------------------------------------------===// // V4 Machine Info + diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonScheduleV4.td b/contrib/llvm/lib/Target/Hexagon/HexagonScheduleV4.td index 1d82dbb90e9..4cf66fe7434 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonScheduleV4.td +++ b/contrib/llvm/lib/Target/Hexagon/HexagonScheduleV4.td @@ -23,6 +23,7 @@ // | SLOT3 | XTYPE ALU32 J CR | // |===========|==================================================| + // Functional Units. def SLOT0 : FuncUnit; def SLOT1 : FuncUnit; @@ -33,26 +34,22 @@ def SLOT3 : FuncUnit; def NV_V4 : InstrItinClass; def MEM_V4 : InstrItinClass; // ALU64/M/S Instruction classes of V2 are collectively knownn as XTYPE in V4. -def PREFIX : InstrItinClass; -def HexagonItinerariesV4 : - ProcessorItineraries<[SLOT0, SLOT1, SLOT2, SLOT3], [], [ - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]>, - InstrItinData]> - ]>; +def HexagonItinerariesV4 : ProcessorItineraries< + [SLOT0, SLOT1, SLOT2, SLOT3], [], [ + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]>, + InstrItinData]> +]>; //===----------------------------------------------------------------------===// // Hexagon V4 Resource Definitions - diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp b/contrib/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp index 411325bf963..55bbba7251a 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp +++ b/contrib/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp @@ -100,23 +100,23 @@ TargetPassConfig *HexagonTargetMachine::createPassConfig(PassManagerBase &PM) { } bool HexagonPassConfig::addInstSelector() { - PM.add(createHexagonRemoveExtendOps(getHexagonTargetMachine())); - PM.add(createHexagonISelDag(getHexagonTargetMachine())); - PM.add(createHexagonPeephole()); + PM->add(createHexagonRemoveExtendOps(getHexagonTargetMachine())); + PM->add(createHexagonISelDag(getHexagonTargetMachine())); + PM->add(createHexagonPeephole()); return false; } bool HexagonPassConfig::addPreRegAlloc() { if (!DisableHardwareLoops) { - PM.add(createHexagonHardwareLoops()); + PM->add(createHexagonHardwareLoops()); } return false; } bool HexagonPassConfig::addPostRegAlloc() { - PM.add(createHexagonCFGOptimizer(getHexagonTargetMachine())); + PM->add(createHexagonCFGOptimizer(getHexagonTargetMachine())); return true; } @@ -129,17 +129,14 @@ bool HexagonPassConfig::addPreSched2() { bool HexagonPassConfig::addPreEmitPass() { if (!DisableHardwareLoops) { - PM.add(createHexagonFixupHwLoops()); + PM->add(createHexagonFixupHwLoops()); } // Expand Spill code for predicate registers. - PM.add(createHexagonExpandPredSpillCode(getHexagonTargetMachine())); + PM->add(createHexagonExpandPredSpillCode(getHexagonTargetMachine())); // Split up TFRcondsets into conditional transfers. - PM.add(createHexagonSplitTFRCondSets(getHexagonTargetMachine())); - - // Create Packets. - PM.add(createHexagonPacketizer()); + PM->add(createHexagonSplitTFRCondSets(getHexagonTargetMachine())); return false; } diff --git a/contrib/llvm/lib/Target/Hexagon/InstPrinter/HexagonInstPrinter.cpp b/contrib/llvm/lib/Target/Hexagon/InstPrinter/HexagonInstPrinter.cpp index 75d6bfb0813..47384cd533f 100644 --- a/contrib/llvm/lib/Target/Hexagon/InstPrinter/HexagonInstPrinter.cpp +++ b/contrib/llvm/lib/Target/Hexagon/InstPrinter/HexagonInstPrinter.cpp @@ -15,7 +15,6 @@ #include "Hexagon.h" #include "HexagonAsmPrinter.h" #include "HexagonInstPrinter.h" -#include "HexagonMCInst.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCExpr.h" @@ -38,50 +37,20 @@ StringRef HexagonInstPrinter::getRegName(unsigned RegNo) const { void HexagonInstPrinter::printInst(const MCInst *MI, raw_ostream &O, StringRef Annot) { - printInst((const HexagonMCInst*)(MI), O, Annot); -} - -void HexagonInstPrinter::printInst(const HexagonMCInst *MI, raw_ostream &O, - StringRef Annot) { const char packetPadding[] = " "; const char startPacket = '{', endPacket = '}'; // TODO: add outer HW loop when it's supported too. if (MI->getOpcode() == Hexagon::ENDLOOP0) { - // Ending a harware loop is different from ending an regular packet. - assert(MI->isEndPacket() && "Loop end must also end the packet"); + MCInst Nop; - if (MI->isStartPacket()) { - // There must be a packet to end a loop. - // FIXME: when shuffling is always run, this shouldn't be needed. - HexagonMCInst Nop; - StringRef NoAnnot; - - Nop.setOpcode (Hexagon::NOP); - Nop.setStartPacket (MI->isStartPacket()); - printInst (&Nop, O, NoAnnot); - } - - // Close the packet. - if (MI->isEndPacket()) - O << packetPadding << endPacket; - - printInstruction(MI, O); - } - else { - // Prefix the insn opening the packet. - if (MI->isStartPacket()) - O << packetPadding << startPacket << '\n'; - - printInstruction(MI, O); - - // Suffix the insn closing the packet. - if (MI->isEndPacket()) - // Suffix the packet in a new line always, since the GNU assembler has - // issues with a closing brace on the same line as CONST{32,64}. - O << '\n' << packetPadding << endPacket; + O << packetPadding << startPacket << '\n'; + Nop.setOpcode(Hexagon::NOP); + printInstruction(&Nop, O); + O << packetPadding << endPacket; } + printInstruction(MI, O); printAnnotation(O, Annot); } @@ -100,18 +69,18 @@ void HexagonInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, } } -void HexagonInstPrinter::printImmOperand(const MCInst *MI, unsigned OpNo, - raw_ostream &O) const { +void HexagonInstPrinter::printImmOperand + (const MCInst *MI, unsigned OpNo, raw_ostream &O) const { O << MI->getOperand(OpNo).getImm(); } void HexagonInstPrinter::printExtOperand(const MCInst *MI, unsigned OpNo, - raw_ostream &O) const { + raw_ostream &O) const { O << MI->getOperand(OpNo).getImm(); } -void HexagonInstPrinter::printUnsignedImmOperand(const MCInst *MI, unsigned OpNo, - raw_ostream &O) const { +void HexagonInstPrinter::printUnsignedImmOperand + (const MCInst *MI, unsigned OpNo, raw_ostream &O) const { O << MI->getOperand(OpNo).getImm(); } @@ -120,13 +89,13 @@ void HexagonInstPrinter::printNegImmOperand(const MCInst *MI, unsigned OpNo, O << -MI->getOperand(OpNo).getImm(); } -void HexagonInstPrinter::printNOneImmOperand(const MCInst *MI, unsigned OpNo, - raw_ostream &O) const { +void HexagonInstPrinter::printNOneImmOperand + (const MCInst *MI, unsigned OpNo, raw_ostream &O) const { O << -1; } -void HexagonInstPrinter::printMEMriOperand(const MCInst *MI, unsigned OpNo, - raw_ostream &O) const { +void HexagonInstPrinter::printMEMriOperand + (const MCInst *MI, unsigned OpNo, raw_ostream &O) const { const MCOperand& MO0 = MI->getOperand(OpNo); const MCOperand& MO1 = MI->getOperand(OpNo + 1); @@ -134,8 +103,8 @@ void HexagonInstPrinter::printMEMriOperand(const MCInst *MI, unsigned OpNo, O << " + #" << MO1.getImm(); } -void HexagonInstPrinter::printFrameIndexOperand(const MCInst *MI, unsigned OpNo, - raw_ostream &O) const { +void HexagonInstPrinter::printFrameIndexOperand + (const MCInst *MI, unsigned OpNo, raw_ostream &O) const { const MCOperand& MO0 = MI->getOperand(OpNo); const MCOperand& MO1 = MI->getOperand(OpNo + 1); diff --git a/contrib/llvm/lib/Target/Hexagon/InstPrinter/HexagonInstPrinter.h b/contrib/llvm/lib/Target/Hexagon/InstPrinter/HexagonInstPrinter.h index 3ce7dfcbdbe..dad4334c3eb 100644 --- a/contrib/llvm/lib/Target/Hexagon/InstPrinter/HexagonInstPrinter.h +++ b/contrib/llvm/lib/Target/Hexagon/InstPrinter/HexagonInstPrinter.h @@ -14,7 +14,6 @@ #ifndef HEXAGONINSTPRINTER_H #define HEXAGONINSTPRINTER_H -#include "HexagonMCInst.h" #include "llvm/MC/MCInstPrinter.h" namespace llvm { @@ -26,7 +25,6 @@ namespace llvm { : MCInstPrinter(MAI, MII, MRI) {} virtual void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot); - void printInst(const HexagonMCInst *MI, raw_ostream &O, StringRef Annot); virtual StringRef getOpcodeName(unsigned Opcode) const; void printInstruction(const MCInst *MI, raw_ostream &O); StringRef getRegName(unsigned RegNo) const; diff --git a/contrib/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonBaseInfo.h b/contrib/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonBaseInfo.h index 7221e906342..ed55c3c1c15 100644 --- a/contrib/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonBaseInfo.h +++ b/contrib/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonBaseInfo.h @@ -23,41 +23,14 @@ namespace llvm { /// instruction info tracks. /// namespace HexagonII { + // *** The code below must match HexagonInstrFormat*.td *** // - // Insn types. - // *** Must match HexagonInstrFormat*.td *** - enum Type { - TypePSEUDO = 0, - TypeALU32 = 1, - TypeCR = 2, - TypeJR = 3, - TypeJ = 4, - TypeLD = 5, - TypeST = 6, - TypeSYSTEM = 7, - TypeXTYPE = 8, - TypeMEMOP = 9, - TypeNV = 10, - TypePREFIX = 30, // Such as extenders. - TypeMARKER = 31 // Such as end of a HW loop. - }; - - - // MCInstrDesc TSFlags - // *** Must match HexagonInstrFormat*.td *** enum { - // This 5-bit field describes the insn type. - TypePos = 0, - TypeMask = 0x1f, - - // Solo instructions. - SoloPos = 5, - SoloMask = 0x1, // Predicated instructions. - PredicatedPos = 6, + PredicatedPos = 1, PredicatedMask = 0x1 }; diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeCallingConv.td b/contrib/llvm/lib/Target/MBlaze/MBlazeCallingConv.td index 4962573f96a..00a4219d047 100644 --- a/contrib/llvm/lib/Target/MBlaze/MBlazeCallingConv.td +++ b/contrib/llvm/lib/Target/MBlaze/MBlazeCallingConv.td @@ -9,10 +9,6 @@ // This describes the calling conventions for MBlaze architecture. //===----------------------------------------------------------------------===// -/// CCIfSubtarget - Match if the current subtarget has a feature F. -class CCIfSubtarget: - CCIf().", F), A>; - //===----------------------------------------------------------------------===// // MBlaze ABI Calling Convention //===----------------------------------------------------------------------===// diff --git a/contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.cpp b/contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.cpp index dd7de9bff36..62393d0920b 100644 --- a/contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.cpp +++ b/contrib/llvm/lib/Target/MBlaze/MBlazeTargetMachine.cpp @@ -68,7 +68,7 @@ TargetPassConfig *MBlazeTargetMachine::createPassConfig(PassManagerBase &PM) { // Install an instruction selector pass using // the ISelDag to gen MBlaze code. bool MBlazePassConfig::addInstSelector() { - PM.add(createMBlazeISelDag(getMBlazeTargetMachine())); + PM->add(createMBlazeISelDag(getMBlazeTargetMachine())); return false; } @@ -76,6 +76,6 @@ bool MBlazePassConfig::addInstSelector() { // machine code is emitted. return true if -print-machineinstrs should // print out the code after the passes. bool MBlazePassConfig::addPreEmitPass() { - PM.add(createMBlazeDelaySlotFillerPass(getMBlazeTargetMachine())); + PM->add(createMBlazeDelaySlotFillerPass(getMBlazeTargetMachine())); return true; } diff --git a/contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.cpp b/contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.cpp index 9f2eda13d7f..3acf96bb7d2 100644 --- a/contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.cpp +++ b/contrib/llvm/lib/Target/MSP430/MSP430TargetMachine.cpp @@ -60,12 +60,12 @@ TargetPassConfig *MSP430TargetMachine::createPassConfig(PassManagerBase &PM) { bool MSP430PassConfig::addInstSelector() { // Install an instruction selector. - PM.add(createMSP430ISelDag(getMSP430TargetMachine(), getOptLevel())); + PM->add(createMSP430ISelDag(getMSP430TargetMachine(), getOptLevel())); return false; } bool MSP430PassConfig::addPreEmitPass() { // Must run branch selection immediately preceding the asm printer. - PM.add(createMSP430BranchSelectionPass()); + PM->add(createMSP430BranchSelectionPass()); return false; } diff --git a/contrib/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp b/contrib/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp new file mode 100644 index 00000000000..78dbc069490 --- /dev/null +++ b/contrib/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp @@ -0,0 +1,552 @@ +//===- MipsDisassembler.cpp - Disassembler for Mips -------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file is part of the Mips Disassembler. +// +//===----------------------------------------------------------------------===// + +#include "Mips.h" +#include "MipsSubtarget.h" +#include "llvm/MC/EDInstInfo.h" +#include "llvm/MC/MCDisassembler.h" +#include "llvm/Support/MemoryObject.h" +#include "llvm/Support/TargetRegistry.h" +#include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/MC/MCInst.h" +#include "llvm/MC/MCRegisterInfo.h" +#include "llvm/Support/MathExtras.h" + + +#include "MipsGenEDInfo.inc" + +using namespace llvm; + +typedef MCDisassembler::DecodeStatus DecodeStatus; + +/// MipsDisassembler - a disasembler class for Mips32. +class MipsDisassembler : public MCDisassembler { +public: + /// Constructor - Initializes the disassembler. + /// + MipsDisassembler(const MCSubtargetInfo &STI, bool bigEndian) : + MCDisassembler(STI), isBigEndian(bigEndian) { + } + + ~MipsDisassembler() { + } + + /// getInstruction - See MCDisassembler. + DecodeStatus getInstruction(MCInst &instr, + uint64_t &size, + const MemoryObject ®ion, + uint64_t address, + raw_ostream &vStream, + raw_ostream &cStream) const; + + /// getEDInfo - See MCDisassembler. + const EDInstInfo *getEDInfo() const; + +private: + bool isBigEndian; +}; + + +/// Mips64Disassembler - a disasembler class for Mips64. +class Mips64Disassembler : public MCDisassembler { +public: + /// Constructor - Initializes the disassembler. + /// + Mips64Disassembler(const MCSubtargetInfo &STI, bool bigEndian) : + MCDisassembler(STI), isBigEndian(bigEndian) { + } + + ~Mips64Disassembler() { + } + + /// getInstruction - See MCDisassembler. + DecodeStatus getInstruction(MCInst &instr, + uint64_t &size, + const MemoryObject ®ion, + uint64_t address, + raw_ostream &vStream, + raw_ostream &cStream) const; + + /// getEDInfo - See MCDisassembler. + const EDInstInfo *getEDInfo() const; + +private: + bool isBigEndian; +}; + +const EDInstInfo *MipsDisassembler::getEDInfo() const { + return instInfoMips; +} + +const EDInstInfo *Mips64Disassembler::getEDInfo() const { + return instInfoMips; +} + +// Decoder tables for Mips register +static const unsigned CPURegsTable[] = { + Mips::ZERO, Mips::AT, Mips::V0, Mips::V1, + Mips::A0, Mips::A1, Mips::A2, Mips::A3, + Mips::T0, Mips::T1, Mips::T2, Mips::T3, + Mips::T4, Mips::T5, Mips::T6, Mips::T7, + Mips::S0, Mips::S1, Mips::S2, Mips::S3, + Mips::S4, Mips::S5, Mips::S6, Mips::S7, + Mips::T8, Mips::T9, Mips::K0, Mips::K1, + Mips::GP, Mips::SP, Mips::FP, Mips::RA +}; + +static const unsigned FGR32RegsTable[] = { + Mips::F0, Mips::F1, Mips::F2, Mips::F3, + Mips::F4, Mips::F5, Mips::F6, Mips::F7, + Mips::F8, Mips::F9, Mips::F10, Mips::F11, + Mips::F12, Mips::F13, Mips::F14, Mips::F15, + Mips::F16, Mips::F17, Mips::F18, Mips::F18, + Mips::F20, Mips::F21, Mips::F22, Mips::F23, + Mips::F24, Mips::F25, Mips::F26, Mips::F27, + Mips::F28, Mips::F29, Mips::F30, Mips::F31 +}; + +static const unsigned CPU64RegsTable[] = { + Mips::ZERO_64, Mips::AT_64, Mips::V0_64, Mips::V1_64, + Mips::A0_64, Mips::A1_64, Mips::A2_64, Mips::A3_64, + Mips::T0_64, Mips::T1_64, Mips::T2_64, Mips::T3_64, + Mips::T4_64, Mips::T5_64, Mips::T6_64, Mips::T7_64, + Mips::S0_64, Mips::S1_64, Mips::S2_64, Mips::S3_64, + Mips::S4_64, Mips::S5_64, Mips::S6_64, Mips::S7_64, + Mips::T8_64, Mips::T9_64, Mips::K0_64, Mips::K1_64, + Mips::GP_64, Mips::SP_64, Mips::FP_64, Mips::RA_64 +}; + +static const unsigned FGR64RegsTable[] = { + Mips::D0_64, Mips::D1_64, Mips::D2_64, Mips::D3_64, + Mips::D4_64, Mips::D5_64, Mips::D6_64, Mips::D7_64, + Mips::D8_64, Mips::D9_64, Mips::D10_64, Mips::D11_64, + Mips::D12_64, Mips::D13_64, Mips::D14_64, Mips::D15_64, + Mips::D16_64, Mips::D17_64, Mips::D18_64, Mips::D19_64, + Mips::D20_64, Mips::D21_64, Mips::D22_64, Mips::D23_64, + Mips::D24_64, Mips::D25_64, Mips::D26_64, Mips::D27_64, + Mips::D28_64, Mips::D29_64, Mips::D30_64, Mips::D31_64 +}; + +static const unsigned AFGR64RegsTable[] = { + Mips::D0, Mips::D1, Mips::D2, Mips::D3, + Mips::D4, Mips::D5, Mips::D6, Mips::D7, + Mips::D8, Mips::D9, Mips::D10, Mips::D11, + Mips::D12, Mips::D13, Mips::D14, Mips::D15 +}; + +// Forward declare these because the autogenerated code will reference them. +// Definitions are further down. +static DecodeStatus DecodeCPU64RegsRegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeCPURegsRegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeHWRegs64RegisterClass(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeBranchTarget(MCInst &Inst, + unsigned Offset, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeBC1(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder); + + +static DecodeStatus DecodeJumpTarget(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeMem(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeSimm16(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeCondCode(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeInsSize(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder); + +static DecodeStatus DecodeExtSize(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder); + +namespace llvm { +extern Target TheMipselTarget, TheMipsTarget, TheMips64Target, + TheMips64elTarget; +} + +static MCDisassembler *createMipsDisassembler( + const Target &T, + const MCSubtargetInfo &STI) { + return new MipsDisassembler(STI,true); +} + +static MCDisassembler *createMipselDisassembler( + const Target &T, + const MCSubtargetInfo &STI) { + return new MipsDisassembler(STI,false); +} + +static MCDisassembler *createMips64Disassembler( + const Target &T, + const MCSubtargetInfo &STI) { + return new Mips64Disassembler(STI,true); +} + +static MCDisassembler *createMips64elDisassembler( + const Target &T, + const MCSubtargetInfo &STI) { + return new Mips64Disassembler(STI, false); +} + +extern "C" void LLVMInitializeMipsDisassembler() { + // Register the disassembler. + TargetRegistry::RegisterMCDisassembler(TheMipsTarget, + createMipsDisassembler); + TargetRegistry::RegisterMCDisassembler(TheMipselTarget, + createMipselDisassembler); + TargetRegistry::RegisterMCDisassembler(TheMips64Target, + createMips64Disassembler); + TargetRegistry::RegisterMCDisassembler(TheMips64elTarget, + createMips64elDisassembler); +} + + +#include "MipsGenDisassemblerTables.inc" + + /// readInstruction - read four bytes from the MemoryObject + /// and return 32 bit word sorted according to the given endianess +static DecodeStatus readInstruction32(const MemoryObject ®ion, + uint64_t address, + uint64_t &size, + uint32_t &insn, + bool isBigEndian) { + uint8_t Bytes[4]; + + // We want to read exactly 4 Bytes of data. + if (region.readBytes(address, 4, (uint8_t*)Bytes, NULL) == -1) { + size = 0; + return MCDisassembler::Fail; + } + + if (isBigEndian) { + // Encoded as a big-endian 32-bit word in the stream. + insn = (Bytes[3] << 0) | + (Bytes[2] << 8) | + (Bytes[1] << 16) | + (Bytes[0] << 24); + } + else { + // Encoded as a small-endian 32-bit word in the stream. + insn = (Bytes[0] << 0) | + (Bytes[1] << 8) | + (Bytes[2] << 16) | + (Bytes[3] << 24); + } + + return MCDisassembler::Success; +} + +DecodeStatus +MipsDisassembler::getInstruction(MCInst &instr, + uint64_t &Size, + const MemoryObject &Region, + uint64_t Address, + raw_ostream &vStream, + raw_ostream &cStream) const { + uint32_t Insn; + + DecodeStatus Result = readInstruction32(Region, Address, Size, + Insn, isBigEndian); + if (Result == MCDisassembler::Fail) + return MCDisassembler::Fail; + + // Calling the auto-generated decoder function. + Result = decodeMipsInstruction32(instr, Insn, Address, this, STI); + if (Result != MCDisassembler::Fail) { + Size = 4; + return Result; + } + + return MCDisassembler::Fail; +} + +DecodeStatus +Mips64Disassembler::getInstruction(MCInst &instr, + uint64_t &Size, + const MemoryObject &Region, + uint64_t Address, + raw_ostream &vStream, + raw_ostream &cStream) const { + uint32_t Insn; + + DecodeStatus Result = readInstruction32(Region, Address, Size, + Insn, isBigEndian); + if (Result == MCDisassembler::Fail) + return MCDisassembler::Fail; + + // Calling the auto-generated decoder function. + Result = decodeMips64Instruction32(instr, Insn, Address, this, STI); + if (Result != MCDisassembler::Fail) { + Size = 4; + return Result; + } + // If we fail to decode in Mips64 decoder space we can try in Mips32 + Result = decodeMipsInstruction32(instr, Insn, Address, this, STI); + if (Result != MCDisassembler::Fail) { + Size = 4; + return Result; + } + + return MCDisassembler::Fail; +} + +static DecodeStatus DecodeCPU64RegsRegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder) { + + if (RegNo > 31) + return MCDisassembler::Fail; + + Inst.addOperand(MCOperand::CreateReg(CPU64RegsTable[RegNo])); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeCPURegsRegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder) { + if (RegNo > 31) + return MCDisassembler::Fail; + + Inst.addOperand(MCOperand::CreateReg(CPURegsTable[RegNo])); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder) { + if (RegNo > 31) + return MCDisassembler::Fail; + + Inst.addOperand(MCOperand::CreateReg(FGR64RegsTable[RegNo])); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder) { + if (RegNo > 31) + return MCDisassembler::Fail; + + Inst.addOperand(MCOperand::CreateReg(FGR32RegsTable[RegNo])); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder) { + Inst.addOperand(MCOperand::CreateReg(RegNo)); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeMem(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder) { + int Offset = SignExtend32<16>(Insn & 0xffff); + int Reg = (int)fieldFromInstruction32(Insn, 16, 5); + int Base = (int)fieldFromInstruction32(Insn, 21, 5); + + if(Inst.getOpcode() == Mips::SC){ + Inst.addOperand(MCOperand::CreateReg(CPURegsTable[Reg])); + } + + Inst.addOperand(MCOperand::CreateReg(CPURegsTable[Reg])); + Inst.addOperand(MCOperand::CreateReg(CPURegsTable[Base])); + Inst.addOperand(MCOperand::CreateImm(Offset)); + + return MCDisassembler::Success; +} + +static DecodeStatus DecodeFMem(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder) { + int Offset = SignExtend32<16>(Insn & 0xffff); + int Reg = (int)fieldFromInstruction32(Insn, 16, 5); + int Base = (int)fieldFromInstruction32(Insn, 21, 5); + + Inst.addOperand(MCOperand::CreateReg(FGR64RegsTable[Reg])); + Inst.addOperand(MCOperand::CreateReg(CPURegsTable[Base])); + Inst.addOperand(MCOperand::CreateImm(Offset)); + + return MCDisassembler::Success; +} + + +static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder) { + // Currently only hardware register 29 is supported. + if (RegNo != 29) + return MCDisassembler::Fail; + Inst.addOperand(MCOperand::CreateReg(Mips::HWR29)); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeCondCode(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder) { + int CondCode = Insn & 0xf; + Inst.addOperand(MCOperand::CreateImm(CondCode)); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder) { + if (RegNo > 31) + return MCDisassembler::Fail; + + Inst.addOperand(MCOperand::CreateReg(AFGR64RegsTable[RegNo])); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeHWRegs64RegisterClass(MCInst &Inst, + unsigned RegNo, + uint64_t Address, + const void *Decoder) { + //Currently only hardware register 29 is supported + if (RegNo != 29) + return MCDisassembler::Fail; + Inst.addOperand(MCOperand::CreateReg(Mips::HWR29)); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeBranchTarget(MCInst &Inst, + unsigned Offset, + uint64_t Address, + const void *Decoder) { + unsigned BranchOffset = Offset & 0xffff; + BranchOffset = SignExtend32<18>(BranchOffset << 2) + 4; + Inst.addOperand(MCOperand::CreateImm(BranchOffset)); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeBC1(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder) { + unsigned BranchOffset = Insn & 0xffff; + BranchOffset = SignExtend32<18>(BranchOffset << 2) + 4; + Inst.addOperand(MCOperand::CreateImm(BranchOffset)); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeJumpTarget(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder) { + + unsigned JumpOffset = fieldFromInstruction32(Insn, 0, 26) << 2; + Inst.addOperand(MCOperand::CreateImm(JumpOffset)); + return MCDisassembler::Success; +} + + +static DecodeStatus DecodeSimm16(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder) { + Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Insn))); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeInsSize(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder) { + // First we need to grab the pos(lsb) from MCInst. + int Pos = Inst.getOperand(2).getImm(); + int Size = (int) Insn - Pos + 1; + Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size))); + return MCDisassembler::Success; +} + +static DecodeStatus DecodeExtSize(MCInst &Inst, + unsigned Insn, + uint64_t Address, + const void *Decoder) { + int Size = (int) Insn + 1; + Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size))); + return MCDisassembler::Success; +} diff --git a/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp index e79be336362..9b4caf65cbf 100644 --- a/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp +++ b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp @@ -12,7 +12,6 @@ //===----------------------------------------------------------------------===// // -#include "MipsBaseInfo.h" #include "MipsFixupKinds.h" #include "MCTargetDesc/MipsMCTargetDesc.h" #include "llvm/MC/MCAsmBackend.h" @@ -85,9 +84,8 @@ public: uint64_t Value) const { MCFixupKind Kind = Fixup.getKind(); Value = adjustFixupValue((unsigned)Kind, Value); - int64_t SymOffset = MipsGetSymAndOffset(Fixup).second; - if (!Value && !SymOffset) + if (!Value) return; // Doesn't change encoding. // Where do we start in the object @@ -118,7 +116,7 @@ public: } uint64_t Mask = ((uint64_t)(-1) >> (64 - getFixupKindInfo(Kind).TargetSize)); - CurVal |= (Value + SymOffset) & Mask; + CurVal |= Value & Mask; // Write out the fixed up bytes back to the code/data bits. for (unsigned i = 0; i != NumBytes; ++i) { diff --git a/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp index 27954b174ed..4ed2be0f430 100644 --- a/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp +++ b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp @@ -194,7 +194,7 @@ getMachineOpValue(const MCInst &MI, const MCOperand &MO, assert (Kind == MCExpr::SymbolRef); - Mips::Fixups FixupKind; + Mips::Fixups FixupKind = Mips::Fixups(0); switch(cast(Expr)->getKind()) { case MCSymbolRefExpr::VK_Mips_GPREL: diff --git a/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp index 3c544f6aec9..f634f082be5 100644 --- a/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp +++ b/contrib/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp @@ -34,6 +34,38 @@ using namespace llvm; +static std::string ParseMipsTriple(StringRef TT, StringRef CPU) { + std::string MipsArchFeature; + size_t DashPosition = 0; + StringRef TheTriple; + + // Let's see if there is a dash, like mips-unknown-linux. + DashPosition = TT.find('-'); + + if (DashPosition == StringRef::npos) { + // No dash, we check the string size. + TheTriple = TT.substr(0); + } else { + // We are only interested in substring before dash. + TheTriple = TT.substr(0,DashPosition); + } + + if (TheTriple == "mips" || TheTriple == "mipsel") { + if (CPU.empty() || CPU == "mips32") { + MipsArchFeature = "+mips32"; + } else if (CPU == "mips32r2") { + MipsArchFeature = "+mips32r2"; + } + } else { + if (CPU.empty() || CPU == "mips64") { + MipsArchFeature = "+mips64"; + } else if (CPU == "mips64r2") { + MipsArchFeature = "+mips64r2"; + } + } + return MipsArchFeature; +} + static MCInstrInfo *createMipsMCInstrInfo() { MCInstrInfo *X = new MCInstrInfo(); InitMipsMCInstrInfo(X); @@ -48,8 +80,15 @@ static MCRegisterInfo *createMipsMCRegisterInfo(StringRef TT) { static MCSubtargetInfo *createMipsMCSubtargetInfo(StringRef TT, StringRef CPU, StringRef FS) { + std::string ArchFS = ParseMipsTriple(TT,CPU); + if (!FS.empty()) { + if (!ArchFS.empty()) + ArchFS = ArchFS + "," + FS.str(); + else + ArchFS = FS; + } MCSubtargetInfo *X = new MCSubtargetInfo(); - InitMipsMCSubtargetInfo(X, TT, CPU, FS); + InitMipsMCSubtargetInfo(X, TT, CPU, ArchFS); return X; } diff --git a/contrib/llvm/lib/Target/Mips/Mips64InstrInfo.td b/contrib/llvm/lib/Target/Mips/Mips64InstrInfo.td index 427e8d97ad9..0382869255f 100644 --- a/contrib/llvm/lib/Target/Mips/Mips64InstrInfo.td +++ b/contrib/llvm/lib/Target/Mips/Mips64InstrInfo.td @@ -36,6 +36,7 @@ def immZExt6 : ImmLeaf; //===----------------------------------------------------------------------===// // Shifts // 64-bit shift instructions. +let DecoderNamespace = "Mips64" in { class shift_rotate_imm64 func, bits<5> isRotate, string instr_asm, SDNode OpNode>: shift_rotate_imm func, string instr_asm, InstrItinClass itin>: multiclass Atomic2Ops64 { def #NAME# : Atomic2Ops, Requires<[NotN64]>; - def _P8 : Atomic2Ops, Requires<[IsN64]>; + def _P8 : Atomic2Ops, Requires<[IsN64]> { + let isCodeGenOnly = 1; + } } multiclass AtomicCmpSwap64 { def #NAME# : AtomicCmpSwap, Requires<[NotN64]>; def _P8 : AtomicCmpSwap, - Requires<[IsN64]>; + Requires<[IsN64]> { + let isCodeGenOnly = 1; + } } - -let usesCustomInserter = 1, Predicates = [HasMips64] in { +} +let usesCustomInserter = 1, Predicates = [HasMips64], + DecoderNamespace = "Mips64" in { defm ATOMIC_LOAD_ADD_I64 : Atomic2Ops64; defm ATOMIC_LOAD_SUB_I64 : Atomic2Ops64; defm ATOMIC_LOAD_AND_I64 : Atomic2Ops64; @@ -72,7 +78,7 @@ let usesCustomInserter = 1, Predicates = [HasMips64] in { //===----------------------------------------------------------------------===// // Instruction definition //===----------------------------------------------------------------------===// - +let DecoderNamespace = "Mips64" in { /// Arithmetic Instructions (ALU Immediate) def DADDiu : ArithLogicI<0x19, "daddiu", add, simm16_64, immSExt16, CPU64Regs>; @@ -97,16 +103,17 @@ def NOR64 : LogicNOR<0x00, 0x27, "nor", CPU64Regs>; def DSLL : shift_rotate_imm64<0x38, 0x00, "dsll", shl>; def DSRL : shift_rotate_imm64<0x3a, 0x00, "dsrl", srl>; def DSRA : shift_rotate_imm64<0x3b, 0x00, "dsra", sra>; -def DSLLV : shift_rotate_reg<0x24, 0x00, "dsllv", shl, CPU64Regs>; -def DSRLV : shift_rotate_reg<0x26, 0x00, "dsrlv", srl, CPU64Regs>; -def DSRAV : shift_rotate_reg<0x27, 0x00, "dsrav", sra, CPU64Regs>; - +def DSLLV : shift_rotate_reg<0x14, 0x00, "dsllv", shl, CPU64Regs>; +def DSRLV : shift_rotate_reg<0x16, 0x00, "dsrlv", srl, CPU64Regs>; +def DSRAV : shift_rotate_reg<0x17, 0x00, "dsrav", sra, CPU64Regs>; +} // Rotate Instructions -let Predicates = [HasMips64r2] in { +let Predicates = [HasMips64r2], DecoderNamespace = "Mips64" in { def DROTR : shift_rotate_imm64<0x3a, 0x01, "drotr", rotr>; def DROTRV : shift_rotate_reg<0x16, 0x01, "drotrv", rotr, CPU64Regs>; } +let DecoderNamespace = "Mips64" in { /// Load and Store Instructions /// aligned defm LB64 : LoadM64<0x20, "lb", sextloadi8>; @@ -132,9 +139,13 @@ defm USD : StoreM64<0x3f, "usd", store_u, 1>; /// Load-linked, Store-conditional def LLD : LLBase<0x34, "lld", CPU64Regs, mem>, Requires<[NotN64]>; -def LLD_P8 : LLBase<0x34, "lld", CPU64Regs, mem64>, Requires<[IsN64]>; +def LLD_P8 : LLBase<0x34, "lld", CPU64Regs, mem64>, Requires<[IsN64]> { + let isCodeGenOnly = 1; +} def SCD : SCBase<0x3c, "scd", CPU64Regs, mem>, Requires<[NotN64]>; -def SCD_P8 : SCBase<0x3c, "scd", CPU64Regs, mem64>, Requires<[IsN64]>; +def SCD_P8 : SCBase<0x3c, "scd", CPU64Regs, mem64>, Requires<[IsN64]> { + let isCodeGenOnly = 1; +} /// Jump and Branch Instructions def JR64 : JumpFR<0x00, 0x08, "jr", CPU64Regs>; @@ -142,11 +153,13 @@ def BEQ64 : CBranch<0x04, "beq", seteq, CPU64Regs>; def BNE64 : CBranch<0x05, "bne", setne, CPU64Regs>; def BGEZ64 : CBranchZero<0x01, 1, "bgez", setge, CPU64Regs>; def BGTZ64 : CBranchZero<0x07, 0, "bgtz", setgt, CPU64Regs>; -def BLEZ64 : CBranchZero<0x07, 0, "blez", setle, CPU64Regs>; +def BLEZ64 : CBranchZero<0x06, 0, "blez", setle, CPU64Regs>; def BLTZ64 : CBranchZero<0x01, 0, "bltz", setlt, CPU64Regs>; - +} +let DecoderNamespace = "Mips64" in def JALR64 : JumpLinkReg<0x00, 0x09, "jalr", CPU64Regs>; +let DecoderNamespace = "Mips64" in { /// Multiply and Divide Instructions. def DMULT : Mult64<0x1c, "dmult", IIImul>; def DMULTu : Mult64<0x1d, "dmultu", IIImul>; @@ -171,11 +184,13 @@ def DSBH : SubwordSwap<0x24, 0x2, "dsbh", CPU64Regs>; def DSHD : SubwordSwap<0x24, 0x5, "dshd", CPU64Regs>; def LEA_ADDiu64 : EffectiveAddress<"daddiu\t$rt, $addr", CPU64Regs, mem_ea_64>; - -let Uses = [SP_64] in +} +let Uses = [SP_64], DecoderNamespace = "Mips64" in def DynAlloc64 : EffectiveAddress<"daddiu\t$rt, $addr", CPU64Regs, mem_ea_64>, - Requires<[IsN64]>; - + Requires<[IsN64]> { + let isCodeGenOnly = 1; +} +let DecoderNamespace = "Mips64" in { def RDHWR64 : ReadHardware; def DEXT : ExtBase<3, "dext", CPU64Regs>; @@ -183,12 +198,12 @@ def DINS : InsBase<7, "dins", CPU64Regs>; def DSLL64_32 : FR<0x3c, 0x00, (outs CPU64Regs:$rd), (ins CPURegs:$rt), "dsll\t$rd, $rt, 32", [], IIAlu>; - def SLL64_32 : FR<0x0, 0x00, (outs CPU64Regs:$rd), (ins CPURegs:$rt), "sll\t$rd, $rt, 0", [], IIAlu>; +let isCodeGenOnly = 1 in def SLL64_64 : FR<0x0, 0x00, (outs CPU64Regs:$rd), (ins CPU64Regs:$rt), "sll\t$rd, $rt, 0", [], IIAlu>; - +} //===----------------------------------------------------------------------===// // Arbitrary patterns that map to one or more instructions //===----------------------------------------------------------------------===// diff --git a/contrib/llvm/lib/Target/Mips/MipsCondMov.td b/contrib/llvm/lib/Target/Mips/MipsCondMov.td index 075a3e807b1..da336804e51 100644 --- a/contrib/llvm/lib/Target/Mips/MipsCondMov.td +++ b/contrib/llvm/lib/Target/Mips/MipsCondMov.td @@ -95,45 +95,65 @@ multiclass MovnPats; -let Predicates = [HasMips64] in { +let Predicates = [HasMips64],DecoderNamespace = "Mips64" in { def MOVZ_I_I64 : CondMovIntInt; - def MOVZ_I64_I : CondMovIntInt; - def MOVZ_I64_I64 : CondMovIntInt; + def MOVZ_I64_I : CondMovIntInt { + let isCodeGenOnly = 1; + } + def MOVZ_I64_I64 : CondMovIntInt { + let isCodeGenOnly = 1; + } } def MOVN_I_I : CondMovIntInt; -let Predicates = [HasMips64] in { +let Predicates = [HasMips64],DecoderNamespace = "Mips64" in { def MOVN_I_I64 : CondMovIntInt; - def MOVN_I64_I : CondMovIntInt; - def MOVN_I64_I64 : CondMovIntInt; + def MOVN_I64_I : CondMovIntInt { + let isCodeGenOnly = 1; + } + def MOVN_I64_I64 : CondMovIntInt { + let isCodeGenOnly = 1; + } } def MOVZ_I_S : CondMovIntFP; def MOVZ_I64_S : CondMovIntFP, - Requires<[HasMips64]>; + Requires<[HasMips64]> { + let DecoderNamespace = "Mips64"; +} def MOVN_I_S : CondMovIntFP; def MOVN_I64_S : CondMovIntFP, - Requires<[HasMips64]>; + Requires<[HasMips64]> { + let DecoderNamespace = "Mips64"; +} let Predicates = [NotFP64bit] in { def MOVZ_I_D32 : CondMovIntFP; def MOVN_I_D32 : CondMovIntFP; } -let Predicates = [IsFP64bit] in { +let Predicates = [IsFP64bit],DecoderNamespace = "Mips64" in { def MOVZ_I_D64 : CondMovIntFP; - def MOVZ_I64_D64 : CondMovIntFP; + def MOVZ_I64_D64 : CondMovIntFP { + let isCodeGenOnly = 1; + } def MOVN_I_D64 : CondMovIntFP; - def MOVN_I64_D64 : CondMovIntFP; + def MOVN_I64_D64 : CondMovIntFP { + let isCodeGenOnly = 1; + } } def MOVT_I : CondMovFPInt; def MOVT_I64 : CondMovFPInt, - Requires<[HasMips64]>; + Requires<[HasMips64]> { + let DecoderNamespace = "Mips64"; +} def MOVF_I : CondMovFPInt; def MOVF_I64 : CondMovFPInt, - Requires<[HasMips64]>; + Requires<[HasMips64]> { + let DecoderNamespace = "Mips64"; +} def MOVT_S : CondMovFPFP; def MOVF_S : CondMovFPFP; @@ -142,7 +162,7 @@ let Predicates = [NotFP64bit] in { def MOVT_D32 : CondMovFPFP; def MOVF_D32 : CondMovFPFP; } -let Predicates = [IsFP64bit] in { +let Predicates = [IsFP64bit], DecoderNamespace = "Mips64" in { def MOVT_D64 : CondMovFPFP; def MOVF_D64 : CondMovFPFP; } diff --git a/contrib/llvm/lib/Target/Mips/MipsISelLowering.cpp b/contrib/llvm/lib/Target/Mips/MipsISelLowering.cpp index 6a23bc3d1d7..ace47ab0791 100644 --- a/contrib/llvm/lib/Target/Mips/MipsISelLowering.cpp +++ b/contrib/llvm/lib/Target/Mips/MipsISelLowering.cpp @@ -34,6 +34,8 @@ #include "llvm/CodeGen/ValueTypes.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/raw_ostream.h" + using namespace llvm; // If I is a shifted mask, set the size (Size) and the first bit of the diff --git a/contrib/llvm/lib/Target/Mips/MipsInstrFPU.td b/contrib/llvm/lib/Target/Mips/MipsInstrFPU.td index b6559452fec..14d8f1e7ba9 100644 --- a/contrib/llvm/lib/Target/Mips/MipsInstrFPU.td +++ b/contrib/llvm/lib/Target/Mips/MipsInstrFPU.td @@ -47,17 +47,17 @@ def MipsExtractElementF64 : SDNode<"MipsISD::ExtractElementF64", SDT_MipsExtractElementF64>; // Operand for printing out a condition code. -let PrintMethod = "printFCCOperand" in +let PrintMethod = "printFCCOperand", DecoderMethod = "DecodeCondCode" in def condcode : Operand; //===----------------------------------------------------------------------===// // Feature predicates. //===----------------------------------------------------------------------===// -def IsFP64bit : Predicate<"Subtarget.isFP64bit()">; -def NotFP64bit : Predicate<"!Subtarget.isFP64bit()">; -def IsSingleFloat : Predicate<"Subtarget.isSingleFloat()">; -def IsNotSingleFloat : Predicate<"!Subtarget.isSingleFloat()">; +def IsFP64bit : Predicate<"Subtarget.isFP64bit()">, AssemblerPredicate<"FeatureFP64Bit">; +def NotFP64bit : Predicate<"!Subtarget.isFP64bit()">, AssemblerPredicate<"!FeatureFP64Bit">; +def IsSingleFloat : Predicate<"Subtarget.isSingleFloat()">, AssemblerPredicate<"FeatureSingleFloat">; +def IsNotSingleFloat : Predicate<"!Subtarget.isSingleFloat()">, AssemblerPredicate<"!FeatureSingleFloat">; // FP immediate patterns. def fpimm0 : PatLeaf<(fpimm), [{ @@ -83,6 +83,7 @@ def fpimm0neg : PatLeaf<(fpimm), [{ //===----------------------------------------------------------------------===// // FP load. +let DecoderMethod = "DecodeFMem" in { class FPLoad op, string opstr, RegisterClass RC, Operand MemOpnd>: FMem op, string opstr, RegisterClass RC, Operand MemOpnd>: FMem; - +} // FP indexed load. class FPIdxLoad funct, string opstr, RegisterClass DRC, RegisterClass PRC, PatFrag FOp>: @@ -118,11 +119,13 @@ multiclass FFR1_W_M funct, string opstr> { def _D32 : FFR1, Requires<[NotFP64bit]>; def _D64 : FFR1, - Requires<[IsFP64bit]>; + Requires<[IsFP64bit]> { + let DecoderNamespace = "Mips64"; + } } // Instructions that convert an FP value to 64-bit fixed point. -let Predicates = [IsFP64bit] in +let Predicates = [IsFP64bit], DecoderNamespace = "Mips64" in multiclass FFR1_L_M funct, string opstr> { def _S : FFR1; def _D64 : FFR1; @@ -134,7 +137,9 @@ multiclass FFR1P_M funct, string opstr, SDNode OpNode> { def _D32 : FFR1P, Requires<[NotFP64bit]>; def _D64 : FFR1P, - Requires<[IsFP64bit]>; + Requires<[IsFP64bit]> { + let DecoderNamespace = "Mips64"; + } } multiclass FFR2P_M funct, string opstr, SDNode OpNode, bit isComm = 0> { @@ -143,9 +148,11 @@ multiclass FFR2P_M funct, string opstr, SDNode OpNode, bit isComm = 0> { def _D32 : FFR2P, Requires<[NotFP64bit]>; def _D64 : FFR2P, - Requires<[IsFP64bit]>; + Requires<[IsFP64bit]> { + let DecoderNamespace = "Mips64"; } } +} // FP madd/msub/nmadd/nmsub instruction classes. class FMADDSUB funct, bits<3> fmt, string opstr, string fmtstr, @@ -172,9 +179,11 @@ defm CEIL_L : FFR1_L_M<0xa, "ceil">; defm FLOOR_W : FFR1_W_M<0xf, "floor">; defm FLOOR_L : FFR1_L_M<0xb, "floor">; defm CVT_W : FFR1_W_M<0x24, "cvt">; -defm CVT_L : FFR1_L_M<0x25, "cvt">; +//defm CVT_L : FFR1_L_M<0x25, "cvt">; def CVT_S_W : FFR1<0x20, 20, "cvt", "s.w", FGR32, FGR32>; +def CVT_L_S : FFR1<0x25, 16, "cvt", "l.s", FGR64, FGR32>; +def CVT_L_D64: FFR1<0x25, 17, "cvt", "l.d", FGR64, FGR64>; let Predicates = [NotFP64bit] in { def CVT_S_D32 : FFR1<0x20, 17, "cvt", "s.d", FGR32, AFGR64>; @@ -182,7 +191,7 @@ let Predicates = [NotFP64bit] in { def CVT_D32_S : FFR1<0x21, 16, "cvt", "d.s", AFGR64, FGR32>; } -let Predicates = [IsFP64bit] in { +let Predicates = [IsFP64bit], DecoderNamespace = "Mips64" in { def CVT_S_D64 : FFR1<0x20, 17, "cvt", "s.d", FGR32, FGR64>; def CVT_S_L : FFR1<0x20, 21, "cvt", "s.l", FGR32, FGR64>; def CVT_D64_W : FFR1<0x21, 20, "cvt", "d.w", FGR64, FGR32>; @@ -235,14 +244,20 @@ def FMOV_S : FFR1<0x6, 16, "mov", "s", FGR32, FGR32>; def FMOV_D32 : FFR1<0x6, 17, "mov", "d", AFGR64, AFGR64>, Requires<[NotFP64bit]>; def FMOV_D64 : FFR1<0x6, 17, "mov", "d", FGR64, FGR64>, - Requires<[IsFP64bit]>; + Requires<[IsFP64bit]> { + let DecoderNamespace = "Mips64"; +} /// Floating Point Memory Instructions -let Predicates = [IsN64] in { +let Predicates = [IsN64], DecoderNamespace = "Mips64" in { def LWC1_P8 : FPLoad<0x31, "lwc1", FGR32, mem64>; def SWC1_P8 : FPStore<0x39, "swc1", FGR32, mem64>; - def LDC164_P8 : FPLoad<0x35, "ldc1", FGR64, mem64>; - def SDC164_P8 : FPStore<0x3d, "sdc1", FGR64, mem64>; + def LDC164_P8 : FPLoad<0x35, "ldc1", FGR64, mem64> { + let isCodeGenOnly =1; + } + def SDC164_P8 : FPStore<0x3d, "sdc1", FGR64, mem64> { + let isCodeGenOnly =1; + } } let Predicates = [NotN64] in { @@ -250,7 +265,7 @@ let Predicates = [NotN64] in { def SWC1 : FPStore<0x39, "swc1", FGR32, mem>; } -let Predicates = [NotN64, HasMips64] in { +let Predicates = [NotN64, HasMips64], DecoderNamespace = "Mips64" in { def LDC164 : FPLoad<0x35, "ldc1", FGR64, mem>; def SDC164 : FPStore<0x3d, "sdc1", FGR64, mem>; } @@ -273,13 +288,13 @@ let Predicates = [HasMips32r2, NotMips64] in { def SDXC1 : FPIdxStore<0x9, "sdxc1", AFGR64, CPURegs, store_a>; } -let Predicates = [HasMips64, NotN64] in { +let Predicates = [HasMips64, NotN64], DecoderNamespace="Mips64" in { def LDXC164 : FPIdxLoad<0x1, "ldxc1", FGR64, CPURegs, load_a>; def SDXC164 : FPIdxStore<0x9, "sdxc1", FGR64, CPURegs, store_a>; } // n64 -let Predicates = [IsN64] in { +let Predicates = [IsN64], isCodeGenOnly=1 in { def LWXC1_P8 : FPIdxLoad<0x0, "lwxc1", FGR32, CPU64Regs, load_a>; def LUXC1_P8 : FPIdxLoad<0x5, "luxc1", FGR32, CPU64Regs, load_u>; def LDXC164_P8 : FPIdxLoad<0x1, "ldxc1", FGR64, CPU64Regs, load_a>; @@ -314,12 +329,12 @@ let Predicates = [HasMips32r2, NotFP64bit, NoNaNsFPMath] in { def NMSUB_D32 : FNMADDSUB<0x7, 1, "nmsub", "d", fsub, AFGR64>; } -let Predicates = [HasMips32r2, IsFP64bit] in { +let Predicates = [HasMips32r2, IsFP64bit], isCodeGenOnly=1 in { def MADD_D64 : FMADDSUB<0x4, 1, "madd", "d", fadd, FGR64>; def MSUB_D64 : FMADDSUB<0x5, 1, "msub", "d", fsub, FGR64>; } -let Predicates = [HasMips32r2, IsFP64bit, NoNaNsFPMath] in { +let Predicates = [HasMips32r2, IsFP64bit, NoNaNsFPMath], isCodeGenOnly=1 in { def NMADD_D64 : FNMADDSUB<0x6, 1, "nmadd", "d", fadd, FGR64>; def NMSUB_D64 : FNMADDSUB<0x7, 1, "nmsub", "d", fsub, FGR64>; } @@ -342,9 +357,10 @@ let isBranch=1, isTerminator=1, hasDelaySlot=1, base=0x8, Uses=[FCR31] in let Inst{16} = tf; } +let DecoderMethod = "DecodeBC1" in { def BC1F : FBRANCH<0, 0, MIPS_BRANCH_F, "bc1f">; def BC1T : FBRANCH<0, 1, MIPS_BRANCH_T, "bc1t">; - +} //===----------------------------------------------------------------------===// // Floating Point Flag Conditions //===----------------------------------------------------------------------===// @@ -376,7 +392,9 @@ class FCMP fmt, RegisterClass RC, string typestr> : let Defs=[FCR31] in { def FCMP_S32 : FCMP<0x10, FGR32, "s">; def FCMP_D32 : FCMP<0x11, AFGR64, "d">, Requires<[NotFP64bit]>; - def FCMP_D64 : FCMP<0x11, FGR64, "d">, Requires<[IsFP64bit]>; + def FCMP_D64 : FCMP<0x11, FGR64, "d">, Requires<[IsFP64bit]> { + let DecoderNamespace = "Mips64"; + } } //===----------------------------------------------------------------------===// @@ -438,13 +456,13 @@ let Predicates = [IsFP64bit] in { // Patterns for unaligned floating point loads and stores. let Predicates = [HasMips32r2Or64, NotN64] in { - def : Pat<(f32 (load_u CPURegs:$addr)), (LUXC1 CPURegs:$addr, ZERO)>; + def : Pat<(f32 (load_u CPURegs:$addr)), (LUXC1 CPURegs:$addr, ZERO)>; def : Pat<(store_u FGR32:$src, CPURegs:$addr), (SUXC1 FGR32:$src, CPURegs:$addr, ZERO)>; } let Predicates = [IsN64] in { - def : Pat<(f32 (load_u CPU64Regs:$addr)), (LUXC1_P8 CPU64Regs:$addr, ZERO_64)>; + def : Pat<(f32 (load_u CPU64Regs:$addr)), (LUXC1_P8 CPU64Regs:$addr, ZERO_64)>; def : Pat<(store_u FGR32:$src, CPU64Regs:$addr), (SUXC1_P8 FGR32:$src, CPU64Regs:$addr, ZERO_64)>; } diff --git a/contrib/llvm/lib/Target/Mips/MipsInstrFormats.td b/contrib/llvm/lib/Target/Mips/MipsInstrFormats.td index 455530389eb..841eba0ec0a 100644 --- a/contrib/llvm/lib/Target/Mips/MipsInstrFormats.td +++ b/contrib/llvm/lib/Target/Mips/MipsInstrFormats.td @@ -45,6 +45,8 @@ class MipsInst pattern, let Namespace = "Mips"; + let Size = 4; + bits<6> Opcode = 0; // Top 6 bits are the 'opcode' field @@ -64,6 +66,10 @@ class MipsInst pattern, // TSFlags layout should be kept in sync with MipsInstrInfo.h. let TSFlags{3-0} = FormBits; + + let DecoderNamespace = "Mips"; + + field bits<32> SoftFail = 0; } // Mips Pseudo Instructions Format diff --git a/contrib/llvm/lib/Target/Mips/MipsInstrInfo.td b/contrib/llvm/lib/Target/Mips/MipsInstrInfo.td index be74f8e5230..873d2bd99ae 100644 --- a/contrib/llvm/lib/Target/Mips/MipsInstrInfo.td +++ b/contrib/llvm/lib/Target/Mips/MipsInstrInfo.td @@ -121,21 +121,36 @@ def MipsIns : SDNode<"MipsISD::Ins", SDT_Ins>; //===----------------------------------------------------------------------===// // Mips Instruction Predicate Definitions. //===----------------------------------------------------------------------===// -def HasSEInReg : Predicate<"Subtarget.hasSEInReg()">; -def HasBitCount : Predicate<"Subtarget.hasBitCount()">; -def HasSwap : Predicate<"Subtarget.hasSwap()">; -def HasCondMov : Predicate<"Subtarget.hasCondMov()">; -def HasMips32 : Predicate<"Subtarget.hasMips32()">; -def HasMips32r2 : Predicate<"Subtarget.hasMips32r2()">; -def HasMips64 : Predicate<"Subtarget.hasMips64()">; -def HasMips32r2Or64 : Predicate<"Subtarget.hasMips32r2Or64()">; -def NotMips64 : Predicate<"!Subtarget.hasMips64()">; -def HasMips64r2 : Predicate<"Subtarget.hasMips64r2()">; -def IsN64 : Predicate<"Subtarget.isABI_N64()">; -def NotN64 : Predicate<"!Subtarget.isABI_N64()">; -def RelocStatic : Predicate<"TM.getRelocationModel() == Reloc::Static">; -def RelocPIC : Predicate<"TM.getRelocationModel() == Reloc::PIC_">; -def NoNaNsFPMath : Predicate<"TM.Options.NoNaNsFPMath">; +def HasSEInReg : Predicate<"Subtarget.hasSEInReg()">, + AssemblerPredicate<"FeatureSEInReg">; +def HasBitCount : Predicate<"Subtarget.hasBitCount()">, + AssemblerPredicate<"FeatureBitCount">; +def HasSwap : Predicate<"Subtarget.hasSwap()">, + AssemblerPredicate<"FeatureSwap">; +def HasCondMov : Predicate<"Subtarget.hasCondMov()">, + AssemblerPredicate<"FeatureCondMov">; +def HasMips32 : Predicate<"Subtarget.hasMips32()">, + AssemblerPredicate<"FeatureMips32">; +def HasMips32r2 : Predicate<"Subtarget.hasMips32r2()">, + AssemblerPredicate<"FeatureMips32r2">; +def HasMips64 : Predicate<"Subtarget.hasMips64()">, + AssemblerPredicate<"FeatureMips64">; +def HasMips32r2Or64 : Predicate<"Subtarget.hasMips32r2Or64()">, + AssemblerPredicate<"FeatureMips32r2,FeatureMips64">; +def NotMips64 : Predicate<"!Subtarget.hasMips64()">, + AssemblerPredicate<"!FeatureMips64">; +def HasMips64r2 : Predicate<"Subtarget.hasMips64r2()">, + AssemblerPredicate<"FeatureMips64r2">; +def IsN64 : Predicate<"Subtarget.isABI_N64()">, + AssemblerPredicate<"FeatureN64">; +def NotN64 : Predicate<"!Subtarget.isABI_N64()">, + AssemblerPredicate<"!FeatureN64">; +def RelocStatic : Predicate<"TM.getRelocationModel() == Reloc::Static">, + AssemblerPredicate<"FeatureMips32">; +def RelocPIC : Predicate<"TM.getRelocationModel() == Reloc::PIC_">, + AssemblerPredicate<"FeatureMips32">; +def NoNaNsFPMath : Predicate<"TM.Options.NoNaNsFPMath">, + AssemblerPredicate<"FeatureMips32">; //===----------------------------------------------------------------------===// // Mips Operand, Complex Patterns and Transformations Definitions. @@ -148,12 +163,15 @@ def jmptarget : Operand { def brtarget : Operand { let EncoderMethod = "getBranchTargetOpValue"; let OperandType = "OPERAND_PCREL"; + let DecoderMethod = "DecodeBranchTarget"; } def calltarget : Operand { let EncoderMethod = "getJumpTargetOpValue"; } def calltarget64: Operand; -def simm16 : Operand; +def simm16 : Operand { + let DecoderMethod= "DecodeSimm16"; +} def simm16_64 : Operand; def shamt : Operand; @@ -189,11 +207,13 @@ def mem_ea_64 : Operand { // size operand of ext instruction def size_ext : Operand { let EncoderMethod = "getSizeExtEncoding"; + let DecoderMethod = "DecodeExtSize"; } // size operand of ins instruction def size_ins : Operand { let EncoderMethod = "getSizeInsEncoding"; + let DecoderMethod = "DecodeInsSize"; } // Transformation Function - get the lower 16 bits. @@ -295,6 +315,7 @@ class ArithLogicR op, bits<6> func, string instr_asm, SDNode OpNode, [(set RC:$rd, (OpNode RC:$rs, RC:$rt))], itin> { let shamt = 0; let isCommutable = isComm; + let isReMaterializable = 1; } class ArithOverflowR op, bits<6> func, string instr_asm, @@ -310,7 +331,9 @@ class ArithLogicI op, string instr_asm, SDNode OpNode, Operand Od, PatLeaf imm_type, RegisterClass RC> : FI; + [(set RC:$rt, (OpNode RC:$rs, imm_type:$imm16))], IIAlu> { + let isReMaterializable = 1; +} class ArithOverflowI op, string instr_asm, SDNode OpNode, Operand Od, PatLeaf imm_type, RegisterClass RC> : @@ -366,6 +389,7 @@ class LoadUpper op, string instr_asm, RegisterClass RC, Operand Imm>: !strconcat(instr_asm, "\t$rt, $imm16"), [], IIAlu> { let rs = 0; let neverHasSideEffects = 1; + let isReMaterializable = 1; } class FMem op, dag outs, dag ins, string asmstr, list pattern, @@ -373,6 +397,7 @@ class FMem op, dag outs, dag ins, string asmstr, list pattern, bits<21> addr; let Inst{25-21} = addr{20-16}; let Inst{15-0} = addr{15-0}; + let DecoderMethod = "DecodeMem"; } // Memory Load/Store @@ -407,7 +432,10 @@ multiclass LoadM32 op, string instr_asm, PatFrag OpNode, def #NAME# : LoadM, Requires<[NotN64]>; def _P8 : LoadM, - Requires<[IsN64]>; + Requires<[IsN64]> { + let DecoderNamespace = "Mips64"; + let isCodeGenOnly = 1; + } } // 64-bit load. @@ -416,7 +444,10 @@ multiclass LoadM64 op, string instr_asm, PatFrag OpNode, def #NAME# : LoadM, Requires<[NotN64]>; def _P8 : LoadM, - Requires<[IsN64]>; + Requires<[IsN64]> { + let DecoderNamespace = "Mips64"; + let isCodeGenOnly = 1; + } } // 32-bit load. @@ -424,7 +455,10 @@ multiclass LoadUnAlign32 op> { def #NAME# : LoadUnAlign, Requires<[NotN64]>; def _P8 : LoadUnAlign, - Requires<[IsN64]>; + Requires<[IsN64]> { + let DecoderNamespace = "Mips64"; + let isCodeGenOnly = 1; + } } // 32-bit store. multiclass StoreM32 op, string instr_asm, PatFrag OpNode, @@ -432,7 +466,10 @@ multiclass StoreM32 op, string instr_asm, PatFrag OpNode, def #NAME# : StoreM, Requires<[NotN64]>; def _P8 : StoreM, - Requires<[IsN64]>; + Requires<[IsN64]> { + let DecoderNamespace = "Mips64"; + let isCodeGenOnly = 1; + } } // 64-bit store. @@ -441,7 +478,10 @@ multiclass StoreM64 op, string instr_asm, PatFrag OpNode, def #NAME# : StoreM, Requires<[NotN64]>; def _P8 : StoreM, - Requires<[IsN64]>; + Requires<[IsN64]> { + let DecoderNamespace = "Mips64"; + let isCodeGenOnly = 1; + } } // 32-bit store. @@ -449,7 +489,10 @@ multiclass StoreUnAlign32 op> { def #NAME# : StoreUnAlign, Requires<[NotN64]>; def _P8 : StoreUnAlign, - Requires<[IsN64]>; + Requires<[IsN64]> { + let DecoderNamespace = "Mips64"; + let isCodeGenOnly = 1; + } } // Conditional Branch @@ -499,6 +542,7 @@ class JumpFJ op, string instr_asm>: let isBarrier=1; let hasDelaySlot = 1; let Predicates = [RelocStatic]; + let DecoderMethod = "DecodeJumpTarget"; } // Unconditional branch @@ -529,7 +573,9 @@ let isCall=1, hasDelaySlot=1 in { class JumpLink op, string instr_asm>: FJ; + IIBranch> { + let DecoderMethod = "DecodeJumpTarget"; + } class JumpLinkReg op, bits<6> func, string instr_asm, RegisterClass RC>: @@ -685,7 +731,9 @@ class Atomic2Ops { def #NAME# : Atomic2Ops, Requires<[NotN64]>; - def _P8 : Atomic2Ops, Requires<[IsN64]>; + def _P8 : Atomic2Ops, Requires<[IsN64]> { + let DecoderNamespace = "Mips64"; + } } // Atomic Compare & Swap. @@ -697,7 +745,9 @@ class AtomicCmpSwap { def #NAME# : AtomicCmpSwap, Requires<[NotN64]>; - def _P8 : AtomicCmpSwap, Requires<[IsN64]>; + def _P8 : AtomicCmpSwap, Requires<[IsN64]> { + let DecoderNamespace = "Mips64"; + } } class LLBase Opc, string opstring, RegisterClass RC, Operand Mem> : @@ -868,9 +918,14 @@ def SYNC : MipsInst<(outs), (ins i32imm:$stype), "sync $stype", /// Load-linked, Store-conditional def LL : LLBase<0x30, "ll", CPURegs, mem>, Requires<[NotN64]>; -def LL_P8 : LLBase<0x30, "ll", CPURegs, mem64>, Requires<[IsN64]>; +def LL_P8 : LLBase<0x30, "ll", CPURegs, mem64>, Requires<[IsN64]> { + let DecoderNamespace = "Mips64"; +} + def SC : SCBase<0x38, "sc", CPURegs, mem>, Requires<[NotN64]>; -def SC_P8 : SCBase<0x38, "sc", CPURegs, mem64>, Requires<[IsN64]>; +def SC_P8 : SCBase<0x38, "sc", CPURegs, mem64>, Requires<[IsN64]> { + let DecoderNamespace = "Mips64"; +} /// Jump and Branch Instructions def J : JumpFJ<0x02, "j">; @@ -888,7 +943,7 @@ def JALR : JumpLinkReg<0x00, 0x09, "jalr", CPURegs>; def BGEZAL : BranchLink<"bgezal", 0x11, CPURegs>; def BLTZAL : BranchLink<"bltzal", 0x10, CPURegs>; -let isReturn=1, isTerminator=1, hasDelaySlot=1, +let isReturn=1, isTerminator=1, hasDelaySlot=1, isCodeGenOnly=1, isBarrier=1, hasCtrlDep=1, rd=0, rt=0, shamt=0 in def RET : FR <0x00, 0x08, (outs), (ins CPURegs:$target), "jr\t$target", [(MipsRet CPURegs:$target)], IIBranch>; @@ -923,13 +978,17 @@ let addr=0 in // instructions. The same not happens for stack address copies, so an // add op with mem ComplexPattern is used and the stack address copy // can be matched. It's similar to Sparc LEA_ADDRi -def LEA_ADDiu : EffectiveAddress<"addiu\t$rt, $addr", CPURegs, mem_ea>; +def LEA_ADDiu : EffectiveAddress<"addiu\t$rt, $addr", CPURegs, mem_ea> { + let isCodeGenOnly = 1; +} // DynAlloc node points to dynamically allocated stack space. // $sp is added to the list of implicitly used registers to prevent dead code // elimination from removing instructions that modify $sp. let Uses = [SP] in -def DynAlloc : EffectiveAddress<"addiu\t$rt, $addr", CPURegs, mem_ea>; +def DynAlloc : EffectiveAddress<"addiu\t$rt, $addr", CPURegs, mem_ea> { + let isCodeGenOnly = 1; +} // MADD*/MSUB* def MADD : MArithR<0, "madd", MipsMAdd, 1>; diff --git a/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp b/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp index ad022311ed7..858723bad9d 100644 --- a/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp +++ b/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp @@ -117,18 +117,16 @@ TargetPassConfig *MipsTargetMachine::createPassConfig(PassManagerBase &PM) { // Install an instruction selector pass using // the ISelDag to gen Mips code. -bool MipsPassConfig::addInstSelector() -{ - PM.add(createMipsISelDag(getMipsTargetMachine())); +bool MipsPassConfig::addInstSelector() { + PM->add(createMipsISelDag(getMipsTargetMachine())); return false; } // Implemented by targets that want to run passes immediately before // machine code is emitted. return true if -print-machineinstrs should // print out the code after the passes. -bool MipsPassConfig::addPreEmitPass() -{ - PM.add(createMipsDelaySlotFillerPass(getMipsTargetMachine())); +bool MipsPassConfig::addPreEmitPass() { + PM->add(createMipsDelaySlotFillerPass(getMipsTargetMachine())); return true; } @@ -136,12 +134,12 @@ bool MipsPassConfig::addPreRegAlloc() { // Do not restore $gp if target is Mips64. // In N32/64, $gp is a callee-saved register. if (!getMipsSubtarget().hasMips64()) - PM.add(createMipsEmitGPRestorePass(getMipsTargetMachine())); + PM->add(createMipsEmitGPRestorePass(getMipsTargetMachine())); return true; } bool MipsPassConfig::addPreSched2() { - PM.add(createMipsExpandPseudoPass(getMipsTargetMachine())); + PM->add(createMipsExpandPseudoPass(getMipsTargetMachine())); return true; } diff --git a/contrib/llvm/lib/Target/PTX/PTXTargetMachine.cpp b/contrib/llvm/lib/Target/PTX/PTXTargetMachine.cpp index c55a658dc37..97b8de1a0b4 100644 --- a/contrib/llvm/lib/Target/PTX/PTXTargetMachine.cpp +++ b/contrib/llvm/lib/Target/PTX/PTXTargetMachine.cpp @@ -130,7 +130,7 @@ TargetPassConfig *PTXTargetMachine::createPassConfig(PassManagerBase &PM) { } bool PTXPassConfig::addInstSelector() { - PM.add(createPTXISelDag(getPTXTargetMachine(), getOptLevel())); + PM->add(createPTXISelDag(getPTXTargetMachine(), getOptLevel())); return false; } @@ -145,7 +145,7 @@ void PTXPassConfig::addOptimizedRegAlloc(FunctionPass *RegAllocPass) { bool PTXPassConfig::addPostRegAlloc() { // PTXMFInfoExtract must after register allocation! - //PM.add(createPTXMFInfoExtract(getPTXTargetMachine())); + //PM->add(createPTXMFInfoExtract(getPTXTargetMachine())); return false; } @@ -159,7 +159,7 @@ void PTXPassConfig::addMachineLateOptimization() { } bool PTXPassConfig::addPreEmitPass() { - PM.add(createPTXMFInfoExtract(getPTXTargetMachine(), getOptLevel())); - PM.add(createPTXFPRoundingModePass(getPTXTargetMachine(), getOptLevel())); + PM->add(createPTXMFInfoExtract(getPTXTargetMachine(), getOptLevel())); + PM->add(createPTXFPRoundingModePass(getPTXTargetMachine(), getOptLevel())); return true; } diff --git a/contrib/llvm/lib/Target/PowerPC/PPCCallingConv.td b/contrib/llvm/lib/Target/PowerPC/PPCCallingConv.td index 9883c2e4299..b2b53648561 100644 --- a/contrib/llvm/lib/Target/PowerPC/PPCCallingConv.td +++ b/contrib/llvm/lib/Target/PowerPC/PPCCallingConv.td @@ -12,10 +12,6 @@ // //===----------------------------------------------------------------------===// -/// CCIfSubtarget - Match if the current subtarget has a feature F. -class CCIfSubtarget - : CCIf().", F), A>; - //===----------------------------------------------------------------------===// // Return Value Calling Convention //===----------------------------------------------------------------------===// diff --git a/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp b/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp index d1139766991..50f3db8b27f 100644 --- a/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -98,13 +98,13 @@ TargetPassConfig *PPCTargetMachine::createPassConfig(PassManagerBase &PM) { bool PPCPassConfig::addInstSelector() { // Install an instruction selector. - PM.add(createPPCISelDag(getPPCTargetMachine())); + PM->add(createPPCISelDag(getPPCTargetMachine())); return false; } bool PPCPassConfig::addPreEmitPass() { // Must run branch selection immediately preceding the asm printer. - PM.add(createPPCBranchSelectionPass()); + PM->add(createPPCBranchSelectionPass()); return false; } diff --git a/contrib/llvm/lib/Target/Sparc/SparcTargetMachine.cpp b/contrib/llvm/lib/Target/Sparc/SparcTargetMachine.cpp index 6f313562c10..cc253077a98 100644 --- a/contrib/llvm/lib/Target/Sparc/SparcTargetMachine.cpp +++ b/contrib/llvm/lib/Target/Sparc/SparcTargetMachine.cpp @@ -59,7 +59,7 @@ TargetPassConfig *SparcTargetMachine::createPassConfig(PassManagerBase &PM) { } bool SparcPassConfig::addInstSelector() { - PM.add(createSparcISelDag(getSparcTargetMachine())); + PM->add(createSparcISelDag(getSparcTargetMachine())); return false; } @@ -67,8 +67,8 @@ bool SparcPassConfig::addInstSelector() { /// passes immediately before machine code is emitted. This should return /// true if -print-machineinstrs should print out the code after the passes. bool SparcPassConfig::addPreEmitPass(){ - PM.add(createSparcFPMoverPass(getSparcTargetMachine())); - PM.add(createSparcDelaySlotFillerPass(getSparcTargetMachine())); + PM->add(createSparcFPMoverPass(getSparcTargetMachine())); + PM->add(createSparcDelaySlotFillerPass(getSparcTargetMachine())); return true; } diff --git a/contrib/llvm/lib/Target/TargetLibraryInfo.cpp b/contrib/llvm/lib/Target/TargetLibraryInfo.cpp index 269958fd7f1..ec95ad4deea 100644 --- a/contrib/llvm/lib/Target/TargetLibraryInfo.cpp +++ b/contrib/llvm/lib/Target/TargetLibraryInfo.cpp @@ -56,7 +56,7 @@ const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] = "exp2f", "expm1", "expm1l", - "expl1f", + "expm1f", "fabs", "fabsl", "fabsf", @@ -95,6 +95,9 @@ const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] = "rint", "rintf", "rintl", + "round", + "roundf", + "roundl", "sin", "sinl", "sinf", @@ -155,6 +158,81 @@ static void initialize(TargetLibraryInfo &TLI, const Triple &T) { TLI.setUnavailable(LibFunc::siprintf); TLI.setUnavailable(LibFunc::fiprintf); } + + if (T.getOS() == Triple::Win32) { + // Win32 does not support long double + TLI.setUnavailable(LibFunc::acosl); + TLI.setUnavailable(LibFunc::asinl); + TLI.setUnavailable(LibFunc::atanl); + TLI.setUnavailable(LibFunc::atan2l); + TLI.setUnavailable(LibFunc::ceill); + TLI.setUnavailable(LibFunc::copysignl); + TLI.setUnavailable(LibFunc::cosl); + TLI.setUnavailable(LibFunc::coshl); + TLI.setUnavailable(LibFunc::expl); + TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf + TLI.setUnavailable(LibFunc::fabsl); + TLI.setUnavailable(LibFunc::floorl); + TLI.setUnavailable(LibFunc::fmodl); + TLI.setUnavailable(LibFunc::logl); + TLI.setUnavailable(LibFunc::powl); + TLI.setUnavailable(LibFunc::sinl); + TLI.setUnavailable(LibFunc::sinhl); + TLI.setUnavailable(LibFunc::sqrtl); + TLI.setUnavailable(LibFunc::tanl); + TLI.setUnavailable(LibFunc::tanhl); + + // Win32 only has C89 math + TLI.setUnavailable(LibFunc::exp2); + TLI.setUnavailable(LibFunc::exp2f); + TLI.setUnavailable(LibFunc::exp2l); + TLI.setUnavailable(LibFunc::expm1); + TLI.setUnavailable(LibFunc::expm1f); + TLI.setUnavailable(LibFunc::expm1l); + TLI.setUnavailable(LibFunc::log2); + TLI.setUnavailable(LibFunc::log2f); + TLI.setUnavailable(LibFunc::log2l); + TLI.setUnavailable(LibFunc::log1p); + TLI.setUnavailable(LibFunc::log1pf); + TLI.setUnavailable(LibFunc::log1pl); + TLI.setUnavailable(LibFunc::nearbyint); + TLI.setUnavailable(LibFunc::nearbyintf); + TLI.setUnavailable(LibFunc::nearbyintl); + TLI.setUnavailable(LibFunc::rint); + TLI.setUnavailable(LibFunc::rintf); + TLI.setUnavailable(LibFunc::rintl); + TLI.setUnavailable(LibFunc::round); + TLI.setUnavailable(LibFunc::roundf); + TLI.setUnavailable(LibFunc::roundl); + TLI.setUnavailable(LibFunc::trunc); + TLI.setUnavailable(LibFunc::truncf); + TLI.setUnavailable(LibFunc::truncl); + + // Win32 provides some C99 math with mangled names + TLI.setAvailableWithName(LibFunc::copysign, "_copysign"); + + if (T.getArch() == Triple::x86) { + // Win32 on x86 implements single-precision math functions as macros + TLI.setUnavailable(LibFunc::acosf); + TLI.setUnavailable(LibFunc::asinf); + TLI.setUnavailable(LibFunc::atanf); + TLI.setUnavailable(LibFunc::atan2f); + TLI.setUnavailable(LibFunc::ceilf); + TLI.setUnavailable(LibFunc::copysignf); + TLI.setUnavailable(LibFunc::cosf); + TLI.setUnavailable(LibFunc::coshf); + TLI.setUnavailable(LibFunc::expf); + TLI.setUnavailable(LibFunc::floorf); + TLI.setUnavailable(LibFunc::fmodf); + TLI.setUnavailable(LibFunc::logf); + TLI.setUnavailable(LibFunc::powf); + TLI.setUnavailable(LibFunc::sinf); + TLI.setUnavailable(LibFunc::sinhf); + TLI.setUnavailable(LibFunc::sqrtf); + TLI.setUnavailable(LibFunc::tanf); + TLI.setUnavailable(LibFunc::tanhf); + } + } } diff --git a/contrib/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp b/contrib/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp index 32c722acc43..a802333002d 100644 --- a/contrib/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp +++ b/contrib/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp @@ -169,6 +169,9 @@ void DecodeUNPCKLMask(EVT VT, SmallVectorImpl &ShuffleMask) { void DecodeVPERM2X128Mask(EVT VT, unsigned Imm, SmallVectorImpl &ShuffleMask) { + if (Imm & 0x88) + return; // Not a shuffle + unsigned HalfSize = VT.getVectorNumElements()/2; unsigned FstHalfBegin = (Imm & 0x3) * HalfSize; unsigned SndHalfBegin = ((Imm >> 4) & 0x3) * HalfSize; diff --git a/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp b/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp index 9b83aade338..04299f30080 100644 --- a/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -2935,6 +2935,7 @@ static SDValue getTargetShuffleNode(unsigned Opc, DebugLoc dl, EVT VT, case X86ISD::PSHUFHW: case X86ISD::PSHUFLW: case X86ISD::VPERMILP: + case X86ISD::VPERMI: return DAG.getNode(Opc, dl, VT, V1, DAG.getConstant(TargetMask, MVT::i8)); } } @@ -3976,6 +3977,27 @@ unsigned X86::getInsertVINSERTF128Immediate(SDNode *N) { return Index / NumElemsPerChunk; } +/// getShuffleCLImmediate - Return the appropriate immediate to shuffle +/// the specified VECTOR_SHUFFLE mask with VPERMQ and VPERMPD instructions. +/// Handles 256-bit. +static unsigned getShuffleCLImmediate(ShuffleVectorSDNode *N) { + EVT VT = N->getValueType(0); + + unsigned NumElts = VT.getVectorNumElements(); + + assert((VT.is256BitVector() && NumElts == 4) && + "Unsupported vector type for VPERMQ/VPERMPD"); + + unsigned Mask = 0; + for (unsigned i = 0; i != NumElts; ++i) { + int Elt = N->getMaskElt(i); + if (Elt < 0) + continue; + Mask |= Elt << (i*2); + } + + return Mask; +} /// isZeroNode - Returns true if Elt is a constant zero or a floating point /// constant +0.0. bool X86::isZeroNode(SDValue Elt) { @@ -4408,6 +4430,7 @@ static bool getTargetShuffleMask(SDNode *N, EVT VT, case X86ISD::VPERM2X128: ImmN = N->getOperand(N->getNumOperands()-1); DecodeVPERM2X128Mask(VT, cast(ImmN)->getZExtValue(), Mask); + if (Mask.empty()) return false; break; case X86ISD::MOVDDUP: case X86ISD::MOVLHPD: @@ -6628,6 +6651,23 @@ X86TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const { if (BlendOp.getNode()) return BlendOp; + if (V2IsUndef && HasAVX2 && (VT == MVT::v8i32 || VT == MVT::v8f32)) { + SmallVector permclMask; + for (unsigned i = 0; i != 8; ++i) { + permclMask.push_back(DAG.getConstant((M[i]>=0) ? M[i] : 0, MVT::i32)); + } + SDValue Mask = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v8i32, + &permclMask[0], 8); + // Bitcast is for VPERMPS since mask is v8i32 but node takes v8f32 + return DAG.getNode(X86ISD::VPERMV, dl, VT, + DAG.getNode(ISD::BITCAST, dl, VT, Mask), V1); + } + + if (V2IsUndef && HasAVX2 && (VT == MVT::v4i64 || VT == MVT::v4f64)) + return getTargetShuffleNode(X86ISD::VPERMI, dl, VT, V1, + getShuffleCLImmediate(SVOp), DAG); + + //===--------------------------------------------------------------------===// // Since no target specific shuffle was selected for this generic one, // lower it into other known shuffles. FIXME: this isn't true yet, but @@ -9552,12 +9592,12 @@ X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const case Intrinsic::x86_avx2_vperm2i128: return DAG.getNode(X86ISD::VPERM2X128, dl, Op.getValueType(), Op.getOperand(1), Op.getOperand(2), Op.getOperand(3)); - case Intrinsic::x86_avx_vpermil_ps: - case Intrinsic::x86_avx_vpermil_pd: - case Intrinsic::x86_avx_vpermil_ps_256: - case Intrinsic::x86_avx_vpermil_pd_256: - return DAG.getNode(X86ISD::VPERMILP, dl, Op.getValueType(), - Op.getOperand(1), Op.getOperand(2)); + case Intrinsic::x86_avx2_permd: + case Intrinsic::x86_avx2_permps: + // Operands intentionally swapped. Mask is last operand to intrinsic, + // but second operand for node/intruction. + return DAG.getNode(X86ISD::VPERMV, dl, Op.getValueType(), + Op.getOperand(2), Op.getOperand(1)); // ptest and testp intrinsics. The intrinsic these come from are designed to // return an integer value, not just an instruction so lower it to the ptest @@ -11141,6 +11181,8 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const { case X86ISD::VBROADCAST: return "X86ISD::VBROADCAST"; case X86ISD::VPERMILP: return "X86ISD::VPERMILP"; case X86ISD::VPERM2X128: return "X86ISD::VPERM2X128"; + case X86ISD::VPERMV: return "X86ISD::VPERMV"; + case X86ISD::VPERMI: return "X86ISD::VPERMI"; case X86ISD::PMULUDQ: return "X86ISD::PMULUDQ"; case X86ISD::VASTART_SAVE_XMM_REGS: return "X86ISD::VASTART_SAVE_XMM_REGS"; case X86ISD::VAARG_64: return "X86ISD::VAARG_64"; @@ -11298,14 +11340,15 @@ X86TargetLowering::EmitAtomicBitwiseWithCustomInserter(MachineInstr *bInstr, unsigned notOpc, unsigned EAXreg, const TargetRegisterClass *RC, - bool invSrc) const { + bool Invert) const { // For the atomic bitwise operator, we generate // thisMBB: // newMBB: // ld t1 = [bitinstr.addr] // op t2 = t1, [bitinstr.val] + // not t3 = t2 (if Invert) // mov EAX = t1 - // lcs dest = [bitinstr.addr], t2 [EAX is implicit] + // lcs dest = [bitinstr.addr], t3 [EAX is implicit] // bz newMBB // fallthrough -->nextMBB const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); @@ -11353,13 +11396,6 @@ X86TargetLowering::EmitAtomicBitwiseWithCustomInserter(MachineInstr *bInstr, for (int i=0; i <= lastAddrIndx; ++i) (*MIB).addOperand(*argOpers[i]); - unsigned tt = F->getRegInfo().createVirtualRegister(RC); - if (invSrc) { - MIB = BuildMI(newMBB, dl, TII->get(notOpc), tt).addReg(t1); - } - else - tt = t1; - unsigned t2 = F->getRegInfo().createVirtualRegister(RC); assert((argOpers[valArgIndx]->isReg() || argOpers[valArgIndx]->isImm()) && @@ -11368,16 +11404,23 @@ X86TargetLowering::EmitAtomicBitwiseWithCustomInserter(MachineInstr *bInstr, MIB = BuildMI(newMBB, dl, TII->get(regOpc), t2); else MIB = BuildMI(newMBB, dl, TII->get(immOpc), t2); - MIB.addReg(tt); + MIB.addReg(t1); (*MIB).addOperand(*argOpers[valArgIndx]); + unsigned t3 = F->getRegInfo().createVirtualRegister(RC); + if (Invert) { + MIB = BuildMI(newMBB, dl, TII->get(notOpc), t3).addReg(t2); + } + else + t3 = t2; + MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), EAXreg); MIB.addReg(t1); MIB = BuildMI(newMBB, dl, TII->get(CXchgOpc)); for (int i=0; i <= lastAddrIndx; ++i) (*MIB).addOperand(*argOpers[i]); - MIB.addReg(t2); + MIB.addReg(t3); assert(bInstr->hasOneMemOperand() && "Unexpected number of memoperand"); (*MIB).setMemRefs(bInstr->memoperands_begin(), bInstr->memoperands_end()); @@ -11400,7 +11443,7 @@ X86TargetLowering::EmitAtomicBit6432WithCustomInserter(MachineInstr *bInstr, unsigned regOpcH, unsigned immOpcL, unsigned immOpcH, - bool invSrc) const { + bool Invert) const { // For the atomic bitwise operator, we generate // thisMBB (instructions are in pairs, except cmpxchg8b) // ld t1,t2 = [bitinstr.addr] @@ -11408,6 +11451,7 @@ X86TargetLowering::EmitAtomicBit6432WithCustomInserter(MachineInstr *bInstr, // out1, out2 = phi (thisMBB, t1/t2) (newMBB, t3/t4) // op t5, t6 <- out1, out2, [bitinstr.val] // (for SWAP, substitute: mov t5, t6 <- [bitinstr.val]) + // neg t7, t8 < t5, t6 (if Invert) // mov ECX, EBX <- t5, t6 // mov EAX, EDX <- t1, t2 // cmpxchg8b [bitinstr.addr] [EAX, EDX, EBX, ECX implicit] @@ -11491,16 +11535,9 @@ X86TargetLowering::EmitAtomicBit6432WithCustomInserter(MachineInstr *bInstr, .addReg(t2).addMBB(thisMBB).addReg(t4).addMBB(newMBB); // The subsequent operations should be using the destination registers of - //the PHI instructions. - if (invSrc) { - t1 = F->getRegInfo().createVirtualRegister(RC); - t2 = F->getRegInfo().createVirtualRegister(RC); - MIB = BuildMI(newMBB, dl, TII->get(NotOpc), t1).addReg(dest1Oper.getReg()); - MIB = BuildMI(newMBB, dl, TII->get(NotOpc), t2).addReg(dest2Oper.getReg()); - } else { - t1 = dest1Oper.getReg(); - t2 = dest2Oper.getReg(); - } + // the PHI instructions. + t1 = dest1Oper.getReg(); + t2 = dest2Oper.getReg(); int valArgIndx = lastAddrIndx + 1; assert((argOpers[valArgIndx]->isReg() || @@ -11527,15 +11564,26 @@ X86TargetLowering::EmitAtomicBit6432WithCustomInserter(MachineInstr *bInstr, MIB.addReg(t2); (*MIB).addOperand(*argOpers[valArgIndx + 1]); + unsigned t7, t8; + if (Invert) { + t7 = F->getRegInfo().createVirtualRegister(RC); + t8 = F->getRegInfo().createVirtualRegister(RC); + MIB = BuildMI(newMBB, dl, TII->get(NotOpc), t7).addReg(t5); + MIB = BuildMI(newMBB, dl, TII->get(NotOpc), t8).addReg(t6); + } else { + t7 = t5; + t8 = t6; + } + MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), X86::EAX); MIB.addReg(t1); MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), X86::EDX); MIB.addReg(t2); MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), X86::EBX); - MIB.addReg(t5); + MIB.addReg(t7); MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), X86::ECX); - MIB.addReg(t6); + MIB.addReg(t8); MIB = BuildMI(newMBB, dl, TII->get(X86::LCMPXCHG8B)); for (int i=0; i <= lastAddrIndx; ++i) diff --git a/contrib/llvm/lib/Target/X86/X86ISelLowering.h b/contrib/llvm/lib/Target/X86/X86ISelLowering.h index 4e0073365a7..09116e88af5 100644 --- a/contrib/llvm/lib/Target/X86/X86ISelLowering.h +++ b/contrib/llvm/lib/Target/X86/X86ISelLowering.h @@ -285,6 +285,8 @@ namespace llvm { UNPCKL, UNPCKH, VPERMILP, + VPERMV, + VPERMI, VPERM2X128, VBROADCAST, @@ -855,7 +857,7 @@ namespace llvm { unsigned notOpc, unsigned EAXreg, const TargetRegisterClass *RC, - bool invSrc = false) const; + bool Invert = false) const; MachineBasicBlock *EmitAtomicBit6432WithCustomInserter( MachineInstr *BInstr, @@ -864,7 +866,7 @@ namespace llvm { unsigned regOpcH, unsigned immOpcL, unsigned immOpcH, - bool invSrc = false) const; + bool Invert = false) const; /// Utility function to emit atomic min and max. It takes the min/max /// instruction to expand, the associated basic block, and the associated diff --git a/contrib/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td b/contrib/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td index 041a64f336f..35801e43229 100644 --- a/contrib/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td +++ b/contrib/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td @@ -155,6 +155,8 @@ def X86Unpckl : SDNode<"X86ISD::UNPCKL", SDTShuff2Op>; def X86Unpckh : SDNode<"X86ISD::UNPCKH", SDTShuff2Op>; def X86VPermilp : SDNode<"X86ISD::VPERMILP", SDTShuff2OpI>; +def X86VPermv : SDNode<"X86ISD::VPERMV", SDTShuff2Op>; +def X86VPermi : SDNode<"X86ISD::VPERMI", SDTShuff2OpI>; def X86VPerm2x128 : SDNode<"X86ISD::VPERM2X128", SDTShuff3OpI>; diff --git a/contrib/llvm/lib/Target/X86/X86InstrInfo.cpp b/contrib/llvm/lib/Target/X86/X86InstrInfo.cpp index 307c96b8c43..b12c1db0fe1 100644 --- a/contrib/llvm/lib/Target/X86/X86InstrInfo.cpp +++ b/contrib/llvm/lib/Target/X86/X86InstrInfo.cpp @@ -1049,9 +1049,9 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm) { X86::VPCMPGTWYrr, X86::VPCMPGTWYrm, TB_ALIGN_32 }, { X86::VPERM2I128rr, X86::VPERM2I128rm, TB_ALIGN_32 }, { X86::VPERMDYrr, X86::VPERMDYrm, TB_ALIGN_32 }, - { X86::VPERMPDYrr, X86::VPERMPDYrm, TB_ALIGN_32 }, + { X86::VPERMPDYri, X86::VPERMPDYmi, TB_ALIGN_32 }, { X86::VPERMPSYrr, X86::VPERMPSYrm, TB_ALIGN_32 }, - { X86::VPERMQYrr, X86::VPERMQYrm, TB_ALIGN_32 }, + { X86::VPERMQYri, X86::VPERMQYmi, TB_ALIGN_32 }, { X86::VPHADDDYrr, X86::VPHADDDYrm, TB_ALIGN_32 }, { X86::VPHADDSWrr256, X86::VPHADDSWrm256, TB_ALIGN_32 }, { X86::VPHADDWYrr, X86::VPHADDWYrm, TB_ALIGN_32 }, diff --git a/contrib/llvm/lib/Target/X86/X86InstrSSE.td b/contrib/llvm/lib/Target/X86/X86InstrSSE.td index 408ab16778d..65e3c1e19fa 100644 --- a/contrib/llvm/lib/Target/X86/X86InstrSSE.td +++ b/contrib/llvm/lib/Target/X86/X86InstrSSE.td @@ -6742,6 +6742,16 @@ let Predicates = [HasAVX] in { def : Pat<(v4f64 (X86Blendpd (v4f64 VR256:$src1), (v4f64 VR256:$src2), (imm:$mask))), (VBLENDPDYrri VR256:$src2, VR256:$src1, imm:$mask)>; + + def : Pat<(v8i16 (X86Blendpw (v8i16 VR128:$src1), (v8i16 VR128:$src2), + (imm:$mask))), + (VPBLENDWrri VR128:$src2, VR128:$src1, imm:$mask)>; + def : Pat<(v4f32 (X86Blendps (v4f32 VR128:$src1), (v4f32 VR128:$src2), + (imm:$mask))), + (VBLENDPSrri VR128:$src2, VR128:$src1, imm:$mask)>; + def : Pat<(v2f64 (X86Blendpd (v2f64 VR128:$src1), (v2f64 VR128:$src2), + (imm:$mask))), + (VBLENDPDrri VR128:$src2, VR128:$src1, imm:$mask)>; } let Predicates = [HasAVX2] in { @@ -6802,13 +6812,13 @@ let Predicates = [HasSSE41] in { def : Pat<(v8i16 (X86Blendpw (v8i16 VR128:$src1), (v8i16 VR128:$src2), (imm:$mask))), - (VPBLENDWrri VR128:$src2, VR128:$src1, imm:$mask)>; + (PBLENDWrri VR128:$src2, VR128:$src1, imm:$mask)>; def : Pat<(v4f32 (X86Blendps (v4f32 VR128:$src1), (v4f32 VR128:$src2), (imm:$mask))), - (VBLENDPSrri VR128:$src2, VR128:$src1, imm:$mask)>; + (BLENDPSrri VR128:$src2, VR128:$src1, imm:$mask)>; def : Pat<(v2f64 (X86Blendpd (v2f64 VR128:$src1), (v2f64 VR128:$src2), (imm:$mask))), - (VBLENDPDrri VR128:$src2, VR128:$src1, imm:$mask)>; + (BLENDPDrri VR128:$src2, VR128:$src1, imm:$mask)>; } @@ -7725,45 +7735,47 @@ def : Pat<(v4i32 (X86VBroadcast (loadi32 addr:$src))), // multiclass avx2_perm opc, string OpcodeStr, PatFrag mem_frag, - Intrinsic Int> { + ValueType OpVT> { def Yrr : AVX28I, VEX_4V; + [(set VR256:$dst, + (OpVT (X86VPermv VR256:$src1, VR256:$src2)))]>, VEX_4V; def Yrm : AVX28I, + [(set VR256:$dst, + (OpVT (X86VPermv VR256:$src1, + (bitconvert (mem_frag addr:$src2)))))]>, VEX_4V; } -defm VPERMD : avx2_perm<0x36, "vpermd", memopv4i64, int_x86_avx2_permd>; +defm VPERMD : avx2_perm<0x36, "vpermd", memopv4i64, v8i32>; let ExeDomain = SSEPackedSingle in -defm VPERMPS : avx2_perm<0x16, "vpermps", memopv8f32, int_x86_avx2_permps>; +defm VPERMPS : avx2_perm<0x16, "vpermps", memopv8f32, v8f32>; multiclass avx2_perm_imm opc, string OpcodeStr, PatFrag mem_frag, - Intrinsic Int> { - def Yrr : AVX2AIi8 { + def Yri : AVX2AIi8, VEX; - def Yrm : AVX2AIi8, VEX; + def Ymi : AVX2AIi8, - VEX; + [(set VR256:$dst, + (OpVT (X86VPermi (mem_frag addr:$src1), + (i8 imm:$src2))))]>, VEX; } -defm VPERMQ : avx2_perm_imm<0x00, "vpermq", memopv4i64, int_x86_avx2_permq>, - VEX_W; +defm VPERMQ : avx2_perm_imm<0x00, "vpermq", memopv4i64, v4i64>, VEX_W; let ExeDomain = SSEPackedDouble in -defm VPERMPD : avx2_perm_imm<0x01, "vpermpd", memopv4f64, int_x86_avx2_permpd>, - VEX_W; +defm VPERMPD : avx2_perm_imm<0x01, "vpermpd", memopv4f64, v4f64>, VEX_W; //===----------------------------------------------------------------------===// // VPERM2I128 - Permute Floating-Point Values in 128-bit chunks diff --git a/contrib/llvm/lib/Target/X86/X86Subtarget.cpp b/contrib/llvm/lib/Target/X86/X86Subtarget.cpp index 452dd7eba32..ed1a40965aa 100644 --- a/contrib/llvm/lib/Target/X86/X86Subtarget.cpp +++ b/contrib/llvm/lib/Target/X86/X86Subtarget.cpp @@ -424,7 +424,9 @@ bool X86Subtarget::enablePostRAScheduler( CodeGenOpt::Level OptLevel, TargetSubtargetInfo::AntiDepBreakMode& Mode, RegClassVector& CriticalPathRCs) const { - Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL; + //TODO: change back to ANTIDEP_CRITICAL when the + // X86 subtarget properly sets up post RA liveness. + Mode = TargetSubtargetInfo::ANTIDEP_NONE; CriticalPathRCs.clear(); return PostRAScheduler && OptLevel >= CodeGenOpt::Default; } diff --git a/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp b/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp index f4b7a6277ad..89c388415bd 100644 --- a/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp +++ b/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp @@ -145,34 +145,34 @@ TargetPassConfig *X86TargetMachine::createPassConfig(PassManagerBase &PM) { bool X86PassConfig::addInstSelector() { // Install an instruction selector. - PM.add(createX86ISelDag(getX86TargetMachine(), getOptLevel())); + PM->add(createX86ISelDag(getX86TargetMachine(), getOptLevel())); // For 32-bit, prepend instructions to set the "global base reg" for PIC. if (!getX86Subtarget().is64Bit()) - PM.add(createGlobalBaseRegPass()); + PM->add(createGlobalBaseRegPass()); return false; } bool X86PassConfig::addPreRegAlloc() { - PM.add(createX86MaxStackAlignmentHeuristicPass()); + PM->add(createX86MaxStackAlignmentHeuristicPass()); return false; // -print-machineinstr shouldn't print after this. } bool X86PassConfig::addPostRegAlloc() { - PM.add(createX86FloatingPointStackifierPass()); + PM->add(createX86FloatingPointStackifierPass()); return true; // -print-machineinstr should print after this. } bool X86PassConfig::addPreEmitPass() { bool ShouldPrint = false; if (getOptLevel() != CodeGenOpt::None && getX86Subtarget().hasSSE2()) { - PM.add(createExecutionDependencyFixPass(&X86::VR128RegClass)); + PM->add(createExecutionDependencyFixPass(&X86::VR128RegClass)); ShouldPrint = true; } if (getX86Subtarget().hasAVX() && UseVZeroUpper) { - PM.add(createX86IssueVZeroUpperPass()); + PM->add(createX86IssueVZeroUpperPass()); ShouldPrint = true; } diff --git a/contrib/llvm/lib/Target/XCore/XCoreTargetMachine.cpp b/contrib/llvm/lib/Target/XCore/XCoreTargetMachine.cpp index f65297e54a7..5afd5a1affc 100644 --- a/contrib/llvm/lib/Target/XCore/XCoreTargetMachine.cpp +++ b/contrib/llvm/lib/Target/XCore/XCoreTargetMachine.cpp @@ -55,7 +55,7 @@ TargetPassConfig *XCoreTargetMachine::createPassConfig(PassManagerBase &PM) { } bool XCorePassConfig::addInstSelector() { - PM.add(createXCoreISelDag(getXCoreTargetMachine(), getOptLevel())); + PM->add(createXCoreISelDag(getXCoreTargetMachine(), getOptLevel())); return false; } diff --git a/contrib/llvm/lib/Transforms/IPO/Internalize.cpp b/contrib/llvm/lib/Transforms/IPO/Internalize.cpp index cd29e7a7a7d..fb5869ede2b 100644 --- a/contrib/llvm/lib/Transforms/IPO/Internalize.cpp +++ b/contrib/llvm/lib/Transforms/IPO/Internalize.cpp @@ -123,6 +123,8 @@ bool InternalizePass::runOnModule(Module &M) { bool Changed = false; // Never internalize functions which code-gen might insert. + // FIXME: We should probably add this (and the __stack_chk_guard) via some + // type of call-back in CodeGen. ExternalNames.insert("__stack_chk_fail"); // Mark all functions not in the api as internal. diff --git a/contrib/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp b/contrib/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp index a1b0a4580bf..43b4ab5efa4 100644 --- a/contrib/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/contrib/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -35,6 +35,11 @@ using namespace llvm; static cl::opt RunVectorization("vectorize", cl::desc("Run vectorization passes")); +static cl::opt +UseGVNAfterVectorization("use-gvn-after-vectorization", + cl::init(false), cl::Hidden, + cl::desc("Run GVN instead of Early CSE after vectorization passes")); + PassManagerBuilder::PassManagerBuilder() { OptLevel = 2; SizeLevel = 0; @@ -182,8 +187,10 @@ void PassManagerBuilder::populateModulePassManager(PassManagerBase &MPM) { if (Vectorize) { MPM.add(createBBVectorizePass()); MPM.add(createInstructionCombiningPass()); - if (OptLevel > 1) - MPM.add(createGVNPass()); // Remove redundancies + if (OptLevel > 1 && UseGVNAfterVectorization) + MPM.add(createGVNPass()); // Remove redundancies + else + MPM.add(createEarlyCSEPass()); // Catch trivial redundancies } MPM.add(createAggressiveDCEPass()); // Delete dead instructions diff --git a/contrib/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/contrib/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp index d57ec22f44a..b085b006e4d 100644 --- a/contrib/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/contrib/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -77,6 +77,12 @@ #include using namespace llvm; +/// MaxIVUsers is an arbitrary threshold that provides an early opportunitiy for +/// bail out. This threshold is far beyond the number of users that LSR can +/// conceivably solve, so it should not affect generated code, but catches the +/// worst cases before LSR burns too much compile time and stack space. +static const unsigned MaxIVUsers = 200; + // Temporary flag to cleanup congruent phis after LSR phi expansion. // It's currently disabled until we can determine whether it's truly useful or // not. The flag should be removed after the v3.0 release. @@ -4102,7 +4108,7 @@ LSRInstance::HoistInsertPosition(BasicBlock::iterator IP, // Attempt to find an insert position in the middle of the block, // instead of at the end, so that it can be used for other expansions. if (IDom == Inst->getParent() && - (!BetterPos || DT.dominates(BetterPos, Inst))) + (!BetterPos || !DT.dominates(Inst, BetterPos))) BetterPos = llvm::next(BasicBlock::iterator(Inst)); } if (!AllDominate) @@ -4519,6 +4525,17 @@ LSRInstance::LSRInstance(const TargetLowering *tli, Loop *l, Pass *P) // If there's no interesting work to be done, bail early. if (IU.empty()) return; + // If there's too much analysis to be done, bail early. We won't be able to + // model the problem anyway. + unsigned NumUsers = 0; + for (IVUsers::const_iterator UI = IU.begin(), E = IU.end(); UI != E; ++UI) { + if (++NumUsers > MaxIVUsers) { + DEBUG(dbgs() << "LSR skipping loop, too many IV Users in " << *L + << "\n"); + return; + } + } + #ifndef NDEBUG // All dominating loops must have preheaders, or SCEVExpander may not be able // to materialize an AddRecExpr whose Start is an outer AddRecExpr. diff --git a/contrib/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp b/contrib/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp index ee232687ffd..930980f528a 100644 --- a/contrib/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/contrib/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -624,11 +624,10 @@ bool LoopUnswitch::IsTrivialUnswitchCondition(Value *Cond, Constant **Val, /// LoopCond == Val to simplify the loop. If we decide that this is profitable, /// unswitch the loop, reprocess the pieces, then return true. bool LoopUnswitch::UnswitchIfProfitable(Value *LoopCond, Constant *Val) { - Function *F = loopHeader->getParent(); - Constant *CondVal = 0; BasicBlock *ExitBlock = 0; + if (IsTrivialUnswitchCondition(LoopCond, &CondVal, &ExitBlock)) { // If the condition is trivial, always unswitch. There is no code growth // for this case. @@ -688,8 +687,8 @@ void LoopUnswitch::EmitPreheaderBranchOnCondition(Value *LIC, Constant *Val, // If either edge is critical, split it. This helps preserve LoopSimplify // form for enclosing loops. - SplitCriticalEdge(BI, 0, this); - SplitCriticalEdge(BI, 1, this); + SplitCriticalEdge(BI, 0, this, false, false, true); + SplitCriticalEdge(BI, 1, this, false, false, true); } /// UnswitchTrivialCondition - Given a loop that has a trivial unswitchable diff --git a/contrib/llvm/lib/Transforms/Scalar/ObjCARC.cpp b/contrib/llvm/lib/Transforms/Scalar/ObjCARC.cpp index 40b0b206168..7e3e69b78d3 100644 --- a/contrib/llvm/lib/Transforms/Scalar/ObjCARC.cpp +++ b/contrib/llvm/lib/Transforms/Scalar/ObjCARC.cpp @@ -162,6 +162,7 @@ namespace { IC_MoveWeak, ///< objc_moveWeak (derived) IC_CopyWeak, ///< objc_copyWeak (derived) IC_DestroyWeak, ///< objc_destroyWeak (derived) + IC_StoreStrong, ///< objc_storeStrong (derived) IC_CallOrUser, ///< could call objc_release and/or "use" pointers IC_Call, ///< could call objc_release IC_User, ///< could "use" a pointer @@ -262,6 +263,7 @@ static InstructionClass GetFunctionClass(const Function *F) { return StringSwitch(F->getName()) .Case("objc_storeWeak", IC_StoreWeak) .Case("objc_initWeak", IC_InitWeak) + .Case("objc_storeStrong", IC_StoreStrong) .Default(IC_CallOrUser); // Second argument is i8**. if (PointerType *Pte1 = dyn_cast(ETy1)) @@ -618,22 +620,35 @@ static bool DoesObjCBlockEscape(const Value *BlockPtr) { const User *UUser = *UI; // Special - Use by a call (callee or argument) is not considered // to be an escape. - if (isa(UUser) || isa(UUser)) - continue; - // Use by an instruction which copies the value is an escape if the - // result is an escape. - if (isa(UUser) || isa(UUser) || - isa(UUser) || isa(UUser)) { - Worklist.push_back(UUser); + switch (GetBasicInstructionClass(UUser)) { + case IC_StoreWeak: + case IC_InitWeak: + case IC_StoreStrong: + case IC_Autorelease: + case IC_AutoreleaseRV: + // These special functions make copies of their pointer arguments. + return true; + case IC_User: + case IC_None: + // Use by an instruction which copies the value is an escape if the + // result is an escape. + if (isa(UUser) || isa(UUser) || + isa(UUser) || isa(UUser)) { + Worklist.push_back(UUser); + continue; + } + // Use by a load is not an escape. + if (isa(UUser)) + continue; + // Use by a store is not an escape if the use is the address. + if (const StoreInst *SI = dyn_cast(UUser)) + if (V != SI->getValueOperand()) + continue; + break; + default: + // Regular calls and other stuff are not considered escapes. continue; } - // Use by a load is not an escape. - if (isa(UUser)) - continue; - // Use by a store is not an escape if the use is the address. - if (const StoreInst *SI = dyn_cast(UUser)) - if (V != SI->getValueOperand()) - continue; // Otherwise, conservatively assume an escape. return true; } @@ -883,7 +898,7 @@ bool ObjCARCExpand::runOnFunction(Function &F) { // These calls return their argument verbatim, as a low-level // optimization. However, this makes high-level optimizations // harder. Undo any uses of this optimization that the front-end - // emitted here. We'll redo them in a later pass. + // emitted here. We'll redo them in the contract pass. Changed = true; Inst->replaceAllUsesWith(cast(Inst)->getArgOperand(0)); break; @@ -997,7 +1012,11 @@ bool ObjCARCAPElim::runOnModule(Module &M) { return false; // Find the llvm.global_ctors variable, as the first step in - // identifying the global constructors. + // identifying the global constructors. In theory, unnecessary autorelease + // pools could occur anywhere, but in practice it's pretty rare. Global + // ctors are a place where autorelease pools get inserted automatically, + // so it's pretty common for them to be unnecessary, and it's pretty + // profitable to eliminate them. GlobalVariable *GV = M.getGlobalVariable("llvm.global_ctors"); if (!GV) return false; @@ -2263,6 +2282,7 @@ void ObjCARCOpt::OptimizeIndividualCalls(Function &F) { case IC_DestroyWeak: { CallInst *CI = cast(Inst); if (isNullOrUndef(CI->getArgOperand(0))) { + Changed = true; Type *Ty = CI->getArgOperand(0)->getType(); new StoreInst(UndefValue::get(cast(Ty)->getElementType()), Constant::getNullValue(Ty), @@ -2278,6 +2298,7 @@ void ObjCARCOpt::OptimizeIndividualCalls(Function &F) { CallInst *CI = cast(Inst); if (isNullOrUndef(CI->getArgOperand(0)) || isNullOrUndef(CI->getArgOperand(1))) { + Changed = true; Type *Ty = CI->getArgOperand(0)->getType(); new StoreInst(UndefValue::get(cast(Ty)->getElementType()), Constant::getNullValue(Ty), @@ -3165,6 +3186,8 @@ void ObjCARCOpt::MoveCalls(Value *Arg, } } +/// PerformCodePlacement - Identify pairings between the retains and releases, +/// and delete and/or move them. bool ObjCARCOpt::PerformCodePlacement(DenseMap &BBStates, @@ -3178,6 +3201,7 @@ ObjCARCOpt::PerformCodePlacement(DenseMap SmallVector NewReleases; SmallVector DeadInsts; + // Visit each retain. for (MapVector::const_iterator I = Retains.begin(), E = Retains.end(); I != E; ++I) { Value *V = I->first; @@ -3651,6 +3675,7 @@ bool ObjCARCOpt::doInitialization(Module &M) { if (!EnableARCOpts) return false; + // If nothing in the Module uses ARC, don't do anything. Run = ModuleHasARC(M); if (!Run) return false; @@ -3985,6 +4010,7 @@ void ObjCARCContract::ContractRelease(Instruction *Release, } bool ObjCARCContract::doInitialization(Module &M) { + // If nothing in the Module uses ARC, don't do anything. Run = ModuleHasARC(M); if (!Run) return false; @@ -4060,6 +4086,7 @@ bool ObjCARCContract::runOnFunction(Function &F) { --BBI; while (isNoopInstruction(BBI)) --BBI; if (&*BBI == GetObjCArg(Inst)) { + Changed = true; InlineAsm *IA = InlineAsm::get(FunctionType::get(Type::getVoidTy(Inst->getContext()), /*isVarArg=*/false), @@ -4109,6 +4136,13 @@ bool ObjCARCContract::runOnFunction(Function &F) { Use &U = UI.getUse(); unsigned OperandNo = UI.getOperandNo(); ++UI; // Increment UI now, because we may unlink its element. + + // If the call's return value dominates a use of the call's argument + // value, rewrite the use to use the return value. We check for + // reachability here because an unreachable call is considered to + // trivially dominate itself, which would lead us to rewriting its + // argument in terms of its return value, which would lead to + // infinite loops in GetObjCArg. if (DT->isReachableFromEntry(U) && DT->dominates(Inst, U)) { Changed = true; @@ -4123,6 +4157,9 @@ bool ObjCARCContract::runOnFunction(Function &F) { if (Replacement->getType() != UseTy) Replacement = new BitCastInst(Replacement, UseTy, "", &BB->back()); + // While we're here, rewrite all edges for this PHI, rather + // than just one use at a time, to minimize the number of + // bitcasts we emit. for (unsigned i = 0, e = PHI->getNumIncomingValues(); i != e; ++i) if (PHI->getIncomingBlock(i) == BB) { diff --git a/contrib/llvm/lib/Transforms/Scalar/Reassociate.cpp b/contrib/llvm/lib/Transforms/Scalar/Reassociate.cpp index cb408a137ea..5de00d1ab5e 100644 --- a/contrib/llvm/lib/Transforms/Scalar/Reassociate.cpp +++ b/contrib/llvm/lib/Transforms/Scalar/Reassociate.cpp @@ -559,7 +559,8 @@ static unsigned FindInOperandList(SmallVectorImpl &Ops, unsigned i, /// EmitAddTreeOfValues - Emit a tree of add instructions, summing Ops together /// and returning the result. Insert the tree before I. -static Value *EmitAddTreeOfValues(Instruction *I, SmallVectorImpl &Ops){ +static Value *EmitAddTreeOfValues(Instruction *I, + SmallVectorImpl &Ops){ if (Ops.size() == 1) return Ops.back(); Value *V1 = Ops.back(); @@ -833,7 +834,7 @@ Value *Reassociate::OptimizeAdd(Instruction *I, // from an expression will drop a use of maxocc, and this can cause // RemoveFactorFromExpression on successive values to behave differently. Instruction *DummyInst = BinaryOperator::CreateAdd(MaxOccVal, MaxOccVal); - SmallVector NewMulOps; + SmallVector NewMulOps; for (unsigned i = 0; i != Ops.size(); ++i) { // Only try to remove factors from expressions we're allowed to. BinaryOperator *BOp = dyn_cast(Ops[i].Op); diff --git a/contrib/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp b/contrib/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp index 9c49ec1c84d..f7b69411b1d 100644 --- a/contrib/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp +++ b/contrib/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp @@ -1583,21 +1583,16 @@ void SimplifyLibCalls::InitOptimizations() { Optimizations["llvm.exp2.f64"] = &Exp2; Optimizations["llvm.exp2.f32"] = &Exp2; -#ifdef HAVE_FLOORF - Optimizations["floor"] = &UnaryDoubleFP; -#endif -#ifdef HAVE_CEILF - Optimizations["ceil"] = &UnaryDoubleFP; -#endif -#ifdef HAVE_ROUNDF - Optimizations["round"] = &UnaryDoubleFP; -#endif -#ifdef HAVE_RINTF - Optimizations["rint"] = &UnaryDoubleFP; -#endif -#ifdef HAVE_NEARBYINTF - Optimizations["nearbyint"] = &UnaryDoubleFP; -#endif + if (TLI->has(LibFunc::floor) && TLI->has(LibFunc::floorf)) + Optimizations["floor"] = &UnaryDoubleFP; + if (TLI->has(LibFunc::ceil) && TLI->has(LibFunc::ceilf)) + Optimizations["ceil"] = &UnaryDoubleFP; + if (TLI->has(LibFunc::round) && TLI->has(LibFunc::roundf)) + Optimizations["round"] = &UnaryDoubleFP; + if (TLI->has(LibFunc::rint) && TLI->has(LibFunc::rintf)) + Optimizations["rint"] = &UnaryDoubleFP; + if (TLI->has(LibFunc::nearbyint) && TLI->has(LibFunc::nearbyintf)) + Optimizations["nearbyint"] = &UnaryDoubleFP; // Integer Optimizations Optimizations["ffs"] = &FFS; diff --git a/contrib/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp b/contrib/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp index f752d7981c5..2a8e9b834e3 100644 --- a/contrib/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp +++ b/contrib/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp @@ -117,33 +117,38 @@ bool llvm::isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum, return false; } -/// CreatePHIsForSplitLoopExit - When a loop exit edge is split, LCSSA form +/// createPHIsForSplitLoopExit - When a loop exit edge is split, LCSSA form /// may require new PHIs in the new exit block. This function inserts the -/// new PHIs, as needed. Preds is a list of preds inside the loop, SplitBB +/// new PHIs, as needed. Preds is a list of preds inside the loop, SplitBB /// is the new loop exit block, and DestBB is the old loop exit, now the /// successor of SplitBB. -static void CreatePHIsForSplitLoopExit(SmallVectorImpl &Preds, +static void createPHIsForSplitLoopExit(SmallVectorImpl &Preds, BasicBlock *SplitBB, BasicBlock *DestBB) { // SplitBB shouldn't have anything non-trivial in it yet. - assert(SplitBB->getFirstNonPHI() == SplitBB->getTerminator() && - "SplitBB has non-PHI nodes!"); + assert((SplitBB->getFirstNonPHI() == SplitBB->getTerminator() || + SplitBB->isLandingPad()) && "SplitBB has non-PHI nodes!"); - // For each PHI in the destination block... + // For each PHI in the destination block. for (BasicBlock::iterator I = DestBB->begin(); PHINode *PN = dyn_cast(I); ++I) { unsigned Idx = PN->getBasicBlockIndex(SplitBB); Value *V = PN->getIncomingValue(Idx); + // If the input is a PHI which already satisfies LCSSA, don't create // a new one. if (const PHINode *VP = dyn_cast(V)) if (VP->getParent() == SplitBB) continue; + // Otherwise a new PHI is needed. Create one and populate it. - PHINode *NewPN = PHINode::Create(PN->getType(), Preds.size(), "split", - SplitBB->getTerminator()); + PHINode *NewPN = + PHINode::Create(PN->getType(), Preds.size(), "split", + SplitBB->isLandingPad() ? + SplitBB->begin() : SplitBB->getTerminator()); for (unsigned i = 0, e = Preds.size(); i != e; ++i) NewPN->addIncoming(V, Preds[i]); + // Update the original PHI. PN->setIncomingValue(Idx, NewPN); } @@ -168,7 +173,8 @@ static void CreatePHIsForSplitLoopExit(SmallVectorImpl &Preds, /// BasicBlock *llvm::SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P, bool MergeIdenticalEdges, - bool DontDeleteUselessPhis) { + bool DontDeleteUselessPhis, + bool SplitLandingPads) { if (!isCriticalEdge(TI, SuccNum, MergeIdenticalEdges)) return 0; assert(!isa(TI) && @@ -338,7 +344,7 @@ BasicBlock *llvm::SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, if (P->mustPreserveAnalysisID(LCSSAID)) { SmallVector OrigPred; OrigPred.push_back(TIBB); - CreatePHIsForSplitLoopExit(OrigPred, NewBB, DestBB); + createPHIsForSplitLoopExit(OrigPred, NewBB, DestBB); } // For each unique exit block... @@ -371,10 +377,19 @@ BasicBlock *llvm::SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, // getUniqueExitBlocks above because that depends on LoopSimplify // form, which we're in the process of restoring! if (!Preds.empty() && HasPredOutsideOfLoop) { - BasicBlock *NewExitBB = - SplitBlockPredecessors(Exit, Preds, "split", P); - if (P->mustPreserveAnalysisID(LCSSAID)) - CreatePHIsForSplitLoopExit(Preds, NewExitBB, Exit); + if (!Exit->isLandingPad()) { + BasicBlock *NewExitBB = + SplitBlockPredecessors(Exit, Preds, "split", P); + if (P->mustPreserveAnalysisID(LCSSAID)) + createPHIsForSplitLoopExit(Preds, NewExitBB, Exit); + } else if (SplitLandingPads) { + SmallVector NewBBs; + SplitLandingPadPredecessors(Exit, Preds, + ".split1", ".split2", + P, NewBBs); + if (P->mustPreserveAnalysisID(LCSSAID)) + createPHIsForSplitLoopExit(Preds, NewBBs[0], Exit); + } } } } diff --git a/contrib/llvm/lib/Transforms/Vectorize/BBVectorize.cpp b/contrib/llvm/lib/Transforms/Vectorize/BBVectorize.cpp index 286b54f2f06..9d62306dce5 100644 --- a/contrib/llvm/lib/Transforms/Vectorize/BBVectorize.cpp +++ b/contrib/llvm/lib/Transforms/Vectorize/BBVectorize.cpp @@ -83,6 +83,10 @@ static cl::opt NoFloats("bb-vectorize-no-floats", cl::init(false), cl::Hidden, cl::desc("Don't try to vectorize floating-point values")); +static cl::opt +NoPointers("bb-vectorize-no-pointers", cl::init(false), cl::Hidden, + cl::desc("Don't try to vectorize pointer values")); + static cl::opt NoCasts("bb-vectorize-no-casts", cl::init(false), cl::Hidden, cl::desc("Don't try to vectorize casting (conversion) operations")); @@ -95,6 +99,14 @@ static cl::opt NoFMA("bb-vectorize-no-fma", cl::init(false), cl::Hidden, cl::desc("Don't try to vectorize the fused-multiply-add intrinsic")); +static cl::opt +NoSelect("bb-vectorize-no-select", cl::init(false), cl::Hidden, + cl::desc("Don't try to vectorize select instructions")); + +static cl::opt +NoGEP("bb-vectorize-no-gep", cl::init(false), cl::Hidden, + cl::desc("Don't try to vectorize getelementptr instructions")); + static cl::opt NoMemOps("bb-vectorize-no-mem-ops", cl::init(false), cl::Hidden, cl::desc("Don't try to vectorize loads and stores")); @@ -546,11 +558,21 @@ namespace { return false; Type *SrcTy = C->getSrcTy(); - if (!SrcTy->isSingleValueType() || SrcTy->isPointerTy()) + if (!SrcTy->isSingleValueType()) return false; Type *DestTy = C->getDestTy(); - if (!DestTy->isSingleValueType() || DestTy->isPointerTy()) + if (!DestTy->isSingleValueType()) + return false; + } else if (isa(I)) { + if (!Config.VectorizeSelect) + return false; + } else if (GetElementPtrInst *G = dyn_cast(I)) { + if (!Config.VectorizeGEP) + return false; + + // Currently, vector GEPs exist only with one index. + if (G->getNumIndices() != 1) return false; } else if (!(I->isBinaryOp() || isa(I) || isa(I) || isa(I))) { @@ -590,6 +612,11 @@ namespace { && (T1->isFPOrFPVectorTy() || T2->isFPOrFPVectorTy())) return false; + if ((!Config.VectorizePointers || TD == 0) && + (T1->getScalarType()->isPointerTy() || + T2->getScalarType()->isPointerTy())) + return false; + if (T1->getPrimitiveSizeInBits() > Config.VectorBits/2 || T2->getPrimitiveSizeInBits() > Config.VectorBits/2) return false; @@ -828,16 +855,33 @@ namespace { std::vector &PairableInsts, std::multimap &ConnectedPairs, ValuePair P) { + StoreInst *SI, *SJ; + // For each possible pairing for this variable, look at the uses of // the first value... for (Value::use_iterator I = P.first->use_begin(), E = P.first->use_end(); I != E; ++I) { + if (isa(*I)) { + // A pair cannot be connected to a load because the load only takes one + // operand (the address) and it is a scalar even after vectorization. + continue; + } else if ((SI = dyn_cast(*I)) && + P.first == SI->getPointerOperand()) { + // Similarly, a pair cannot be connected to a store through its + // pointer operand. + continue; + } + VPIteratorPair IPairRange = CandidatePairs.equal_range(*I); // For each use of the first variable, look for uses of the second // variable... for (Value::use_iterator J = P.second->use_begin(), E2 = P.second->use_end(); J != E2; ++J) { + if ((SJ = dyn_cast(*J)) && + P.second == SJ->getPointerOperand()) + continue; + VPIteratorPair JPairRange = CandidatePairs.equal_range(*J); // Look for : @@ -853,6 +897,10 @@ namespace { // Look for cases where just the first value in the pair is used by // both members of another pair (splatting). for (Value::use_iterator J = P.first->use_begin(); J != E; ++J) { + if ((SJ = dyn_cast(*J)) && + P.first == SJ->getPointerOperand()) + continue; + if (isSecondInIteratorPair(*J, IPairRange)) ConnectedPairs.insert(VPPair(P, ValuePair(*I, *J))); } @@ -863,9 +911,19 @@ namespace { // both members of another pair (splatting). for (Value::use_iterator I = P.second->use_begin(), E = P.second->use_end(); I != E; ++I) { + if (isa(*I)) + continue; + else if ((SI = dyn_cast(*I)) && + P.second == SI->getPointerOperand()) + continue; + VPIteratorPair IPairRange = CandidatePairs.equal_range(*I); for (Value::use_iterator J = P.second->use_begin(); J != E; ++J) { + if ((SJ = dyn_cast(*J)) && + P.second == SJ->getPointerOperand()) + continue; + if (isSecondInIteratorPair(*J, IPairRange)) ConnectedPairs.insert(VPPair(P, ValuePair(*I, *J))); } @@ -1891,9 +1949,12 @@ VectorizeConfig::VectorizeConfig() { VectorBits = ::VectorBits; VectorizeInts = !::NoInts; VectorizeFloats = !::NoFloats; + VectorizePointers = !::NoPointers; VectorizeCasts = !::NoCasts; VectorizeMath = !::NoMath; VectorizeFMA = !::NoFMA; + VectorizeSelect = !::NoSelect; + VectorizeGEP = !::NoGEP; VectorizeMemOps = !::NoMemOps; AlignedOnly = ::AlignedOnly; ReqChainDepth= ::ReqChainDepth; diff --git a/contrib/llvm/lib/VMCore/AutoUpgrade.cpp b/contrib/llvm/lib/VMCore/AutoUpgrade.cpp index ea3d4ba2243..2e16372fb1c 100644 --- a/contrib/llvm/lib/VMCore/AutoUpgrade.cpp +++ b/contrib/llvm/lib/VMCore/AutoUpgrade.cpp @@ -18,9 +18,6 @@ #include "llvm/LLVMContext.h" #include "llvm/Module.h" #include "llvm/IntrinsicInst.h" -#include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/SmallPtrSet.h" -#include "llvm/ADT/SmallVector.h" #include "llvm/Support/CallSite.h" #include "llvm/Support/CFG.h" #include "llvm/Support/ErrorHandling.h" @@ -59,7 +56,8 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) { if (Name.startswith("x86.sse2.pcmpeq.") || Name.startswith("x86.sse2.pcmpgt.") || Name.startswith("x86.avx2.pcmpeq.") || - Name.startswith("x86.avx2.pcmpgt.")) { + Name.startswith("x86.avx2.pcmpgt.") || + Name.startswith("x86.avx.vpermil.")) { NewFn = 0; return true; } @@ -121,7 +119,42 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { // need to sign extend since icmp returns vector of i1 Rep = Builder.CreateSExt(Rep, CI->getType(), ""); } else { - llvm_unreachable("Unknown function for CallInst upgrade."); + bool PD128 = false, PD256 = false, PS128 = false, PS256 = false; + if (Name.startswith("llvm.x86.avx.vpermil.pd.256")) + PD256 = true; + else if (Name.startswith("llvm.x86.avx.vpermil.pd")) + PD128 = true; + else if (Name.startswith("llvm.x86.avx.vpermil.ps.256")) + PS256 = true; + else if (Name.startswith("llvm.x86.avx.vpermil.ps")) + PS128 = true; + + if (PD256 || PD128 || PS256 || PS128) { + Value *Op0 = CI->getArgOperand(0); + unsigned Imm = cast(CI->getArgOperand(1))->getZExtValue(); + SmallVector Idxs; + + if (PD128) + for (unsigned i = 0; i != 2; ++i) + Idxs.push_back(Builder.getInt32((Imm >> i) & 0x1)); + else if (PD256) + for (unsigned l = 0; l != 4; l+=2) + for (unsigned i = 0; i != 2; ++i) + Idxs.push_back(Builder.getInt32(((Imm >> (l+i)) & 0x1) + l)); + else if (PS128) + for (unsigned i = 0; i != 4; ++i) + Idxs.push_back(Builder.getInt32((Imm >> (2 * i)) & 0x3)); + else if (PS256) + for (unsigned l = 0; l != 8; l+=4) + for (unsigned i = 0; i != 4; ++i) + Idxs.push_back(Builder.getInt32(((Imm >> (2 * i)) & 0x3) + l)); + else + llvm_unreachable("Unexpected function"); + + Rep = Builder.CreateShuffleVector(Op0, Op0, ConstantVector::get(Idxs)); + } else { + llvm_unreachable("Unknown function for CallInst upgrade."); + } } CI->replaceAllUsesWith(Rep); diff --git a/contrib/llvm/lib/VMCore/Instructions.cpp b/contrib/llvm/lib/VMCore/Instructions.cpp index 8db6ac9a33f..6c5db328764 100644 --- a/contrib/llvm/lib/VMCore/Instructions.cpp +++ b/contrib/llvm/lib/VMCore/Instructions.cpp @@ -2002,6 +2002,23 @@ bool BinaryOperator::isExact() const { return cast(this)->isExact(); } +//===----------------------------------------------------------------------===// +// FPMathOperator Class +//===----------------------------------------------------------------------===// + +/// getFPAccuracy - Get the maximum error permitted by this operation in ULPs. +/// An accuracy of 0.0 means that the operation should be performed with the +/// default precision. +float FPMathOperator::getFPAccuracy() const { + const MDNode *MD = + cast(this)->getMetadata(LLVMContext::MD_fpmath); + if (!MD) + return 0.0; + ConstantFP *Accuracy = cast(MD->getOperand(0)); + return Accuracy->getValueAPF().convertToFloat(); +} + + //===----------------------------------------------------------------------===// // CastInst Class //===----------------------------------------------------------------------===// diff --git a/contrib/llvm/lib/VMCore/LLVMContext.cpp b/contrib/llvm/lib/VMCore/LLVMContext.cpp index 68c56212bc6..f07f0b39392 100644 --- a/contrib/llvm/lib/VMCore/LLVMContext.cpp +++ b/contrib/llvm/lib/VMCore/LLVMContext.cpp @@ -44,9 +44,9 @@ LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl(*this)) { unsigned ProfID = getMDKindID("prof"); assert(ProfID == MD_prof && "prof kind id drifted"); (void)ProfID; - // Create the 'fpaccuracy' metadata kind. - unsigned FPAccuracyID = getMDKindID("fpaccuracy"); - assert(FPAccuracyID == MD_fpaccuracy && "fpaccuracy kind id drifted"); + // Create the 'fpmath' metadata kind. + unsigned FPAccuracyID = getMDKindID("fpmath"); + assert(FPAccuracyID == MD_fpmath && "fpmath kind id drifted"); (void)FPAccuracyID; // Create the 'range' metadata kind. diff --git a/contrib/llvm/lib/VMCore/Module.cpp b/contrib/llvm/lib/VMCore/Module.cpp index e8bc6dbe970..3c67191e09c 100644 --- a/contrib/llvm/lib/VMCore/Module.cpp +++ b/contrib/llvm/lib/VMCore/Module.cpp @@ -434,7 +434,7 @@ bool Module::MaterializeAllPermanently(std::string *ErrInfo) { // -// dropAllReferences() - This function causes all the subelementss to "let go" +// dropAllReferences() - This function causes all the subelements to "let go" // of all references that they are maintaining. This allows one to 'delete' a // whole module at a time, even though there may be circular references... first // all references are dropped, and all use counts go to zero. Then everything diff --git a/contrib/llvm/lib/VMCore/Verifier.cpp b/contrib/llvm/lib/VMCore/Verifier.cpp index 96492e44d56..47baef3e29d 100644 --- a/contrib/llvm/lib/VMCore/Verifier.cpp +++ b/contrib/llvm/lib/VMCore/Verifier.cpp @@ -1653,16 +1653,18 @@ void Verifier::visitInstruction(Instruction &I) { } } - if (MDNode *MD = I.getMetadata(LLVMContext::MD_fpaccuracy)) { + if (MDNode *MD = I.getMetadata(LLVMContext::MD_fpmath)) { Assert1(I.getType()->isFPOrFPVectorTy(), - "fpaccuracy requires a floating point result!", &I); - Assert1(MD->getNumOperands() == 1, "fpaccuracy takes one operand!", &I); - ConstantFP *Op = dyn_cast_or_null(MD->getOperand(0)); - Assert1(Op, "fpaccuracy ULPs not a floating point number!", &I); - APFloat ULPs = Op->getValueAPF(); - Assert1(ULPs.isNormal() || ULPs.isZero(), - "fpaccuracy ULPs not a normal number!", &I); - Assert1(!ULPs.isNegative(), "fpaccuracy ULPs is negative!", &I); + "fpmath requires a floating point result!", &I); + Assert1(MD->getNumOperands() == 1, "fpmath takes one operand!", &I); + Value *Op0 = MD->getOperand(0); + if (ConstantFP *CFP0 = dyn_cast_or_null(Op0)) { + APFloat Accuracy = CFP0->getValueAPF(); + Assert1(Accuracy.isNormal() && !Accuracy.isNegative(), + "fpmath accuracy not a positive number!", &I); + } else { + Assert1(false, "invalid fpmath accuracy!", &I); + } } MDNode *MD = I.getMetadata(LLVMContext::MD_range); diff --git a/contrib/llvm/tools/bugpoint/ToolRunner.cpp b/contrib/llvm/tools/bugpoint/ToolRunner.cpp index 25a2baef7dc..d975d68d969 100644 --- a/contrib/llvm/tools/bugpoint/ToolRunner.cpp +++ b/contrib/llvm/tools/bugpoint/ToolRunner.cpp @@ -128,7 +128,7 @@ static int RunProgramRemotelyWithTimeout(const sys::Path &RemoteClientPath, ErrorFile.close(); } - errs() << OS; + errs() << OS.str(); } return ReturnCode; diff --git a/contrib/llvm/tools/clang/include/clang/AST/Decl.h b/contrib/llvm/tools/clang/include/clang/AST/Decl.h index 11696db279d..0c47f2e486f 100644 --- a/contrib/llvm/tools/clang/include/clang/AST/Decl.h +++ b/contrib/llvm/tools/clang/include/clang/AST/Decl.h @@ -242,11 +242,7 @@ public: bool visibilityExplicit() const { return explicit_; } void setLinkage(Linkage L) { linkage_ = L; } - void setVisibility(Visibility V) { visibility_ = V; } void setVisibility(Visibility V, bool E) { visibility_ = V; explicit_ = E; } - void setVisibility(LinkageInfo Other) { - setVisibility(Other.visibility(), Other.visibilityExplicit()); - } void mergeLinkage(Linkage L) { setLinkage(minLinkage(linkage(), L)); diff --git a/contrib/llvm/tools/clang/include/clang/AST/DeclBase.h b/contrib/llvm/tools/clang/include/clang/AST/DeclBase.h index 4c675aed8fe..223289123eb 100644 --- a/contrib/llvm/tools/clang/include/clang/AST/DeclBase.h +++ b/contrib/llvm/tools/clang/include/clang/AST/DeclBase.h @@ -861,7 +861,6 @@ public: void dumpXML(raw_ostream &OS) const; private: - const Attr *getAttrsImpl() const; void setAttrsImpl(const AttrVec& Attrs, ASTContext &Ctx); void setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC, ASTContext &Ctx); diff --git a/contrib/llvm/tools/clang/include/clang/AST/DeclLookups.h b/contrib/llvm/tools/clang/include/clang/AST/DeclLookups.h index 66d190f4298..b8abe97be1f 100644 --- a/contrib/llvm/tools/clang/include/clang/AST/DeclLookups.h +++ b/contrib/llvm/tools/clang/include/clang/AST/DeclLookups.h @@ -67,6 +67,8 @@ public: DeclContext::all_lookups_iterator DeclContext::lookups_begin() const { DeclContext *Primary = const_cast(this)->getPrimaryContext(); + if (hasExternalVisibleStorage()) + getParentASTContext().getExternalSource()->completeVisibleDeclsMap(Primary); if (StoredDeclsMap *Map = Primary->buildLookup()) return all_lookups_iterator(Map->begin(), Map->end()); return all_lookups_iterator(); @@ -74,6 +76,8 @@ DeclContext::all_lookups_iterator DeclContext::lookups_begin() const { DeclContext::all_lookups_iterator DeclContext::lookups_end() const { DeclContext *Primary = const_cast(this)->getPrimaryContext(); + if (hasExternalVisibleStorage()) + getParentASTContext().getExternalSource()->completeVisibleDeclsMap(Primary); if (StoredDeclsMap *Map = Primary->buildLookup()) return all_lookups_iterator(Map->end(), Map->end()); return all_lookups_iterator(); diff --git a/contrib/llvm/tools/clang/include/clang/AST/Expr.h b/contrib/llvm/tools/clang/include/clang/AST/Expr.h index 558bd00ba97..b0b9b0fd6ff 100644 --- a/contrib/llvm/tools/clang/include/clang/AST/Expr.h +++ b/contrib/llvm/tools/clang/include/clang/AST/Expr.h @@ -581,16 +581,6 @@ public: /// member expression. static QualType findBoundMemberType(const Expr *expr); - /// \brief Result type of CanThrow(). - enum CanThrowResult { - CT_Cannot, - CT_Dependent, - CT_Can - }; - /// \brief Test if this expression, if evaluated, might throw, according to - /// the rules of C++ [expr.unary.noexcept]. - CanThrowResult CanThrow(ASTContext &C) const; - /// IgnoreImpCasts - Skip past any implicit casts which might /// surround this expression. Only skips ImplicitCastExprs. Expr *IgnoreImpCasts() LLVM_READONLY; @@ -3608,6 +3598,10 @@ public: return LBraceLoc.isValid() && RBraceLoc.isValid(); } + // Is this an initializer for an array of characters, initialized by a string + // literal or an @encode? + bool isStringLiteralInit() const; + SourceLocation getLBraceLoc() const { return LBraceLoc; } void setLBraceLoc(SourceLocation Loc) { LBraceLoc = Loc; } SourceLocation getRBraceLoc() const { return RBraceLoc; } diff --git a/contrib/llvm/tools/clang/include/clang/AST/ExternalASTSource.h b/contrib/llvm/tools/clang/include/clang/AST/ExternalASTSource.h index 18a1432b706..e2a60d5cf03 100644 --- a/contrib/llvm/tools/clang/include/clang/AST/ExternalASTSource.h +++ b/contrib/llvm/tools/clang/include/clang/AST/ExternalASTSource.h @@ -126,6 +126,12 @@ public: virtual DeclContextLookupResult FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name); + /// \brief Ensures that the table of all visible declarations inside this + /// context is up to date. + /// + /// The default implementation of this functino is a no-op. + virtual void completeVisibleDeclsMap(const DeclContext *DC); + /// \brief Finds all declarations lexically contained within the given /// DeclContext, after applying an optional filter predicate. /// diff --git a/contrib/llvm/tools/clang/include/clang/AST/RecursiveASTVisitor.h b/contrib/llvm/tools/clang/include/clang/AST/RecursiveASTVisitor.h index a4ad5257017..f1b51710213 100644 --- a/contrib/llvm/tools/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/contrib/llvm/tools/clang/include/clang/AST/RecursiveASTVisitor.h @@ -1870,6 +1870,7 @@ DEF_TRAVERSE_STMT(GotoStmt, { }) DEF_TRAVERSE_STMT(IfStmt, { }) DEF_TRAVERSE_STMT(IndirectGotoStmt, { }) DEF_TRAVERSE_STMT(LabelStmt, { }) +DEF_TRAVERSE_STMT(AttributedStmt, { }) DEF_TRAVERSE_STMT(NullStmt, { }) DEF_TRAVERSE_STMT(ObjCAtCatchStmt, { }) DEF_TRAVERSE_STMT(ObjCAtFinallyStmt, { }) diff --git a/contrib/llvm/tools/clang/include/clang/AST/Stmt.h b/contrib/llvm/tools/clang/include/clang/AST/Stmt.h index 84bdfb89cac..1b0f576e271 100644 --- a/contrib/llvm/tools/clang/include/clang/AST/Stmt.h +++ b/contrib/llvm/tools/clang/include/clang/AST/Stmt.h @@ -20,6 +20,7 @@ #include "clang/AST/StmtIterator.h" #include "clang/AST/DeclGroup.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/Attr.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/raw_ostream.h" @@ -794,6 +795,47 @@ public: }; +/// \brief Represents an attribute applied to a statement. +/// +/// Represents an attribute applied to a statement. For example: +/// [[omp::for(...)]] for (...) { ... } +/// +class AttributedStmt : public Stmt { + Stmt *SubStmt; + SourceLocation AttrLoc; + AttrVec Attrs; + // TODO: It can be done as Attr *Attrs[1]; and variable size array as in + // StringLiteral + + friend class ASTStmtReader; + +public: + AttributedStmt(SourceLocation loc, const AttrVec &attrs, Stmt *substmt) + : Stmt(AttributedStmtClass), SubStmt(substmt), AttrLoc(loc), Attrs(attrs) { + } + + // \brief Build an empty attributed statement. + explicit AttributedStmt(EmptyShell Empty) + : Stmt(AttributedStmtClass, Empty) { + } + + SourceLocation getAttrLoc() const { return AttrLoc; } + const AttrVec &getAttrs() const { return Attrs; } + Stmt *getSubStmt() { return SubStmt; } + const Stmt *getSubStmt() const { return SubStmt; } + + SourceRange getSourceRange() const LLVM_READONLY { + return SourceRange(AttrLoc, SubStmt->getLocEnd()); + } + child_range children() { return child_range(&SubStmt, &SubStmt + 1); } + + static bool classof(const Stmt *T) { + return T->getStmtClass() == AttributedStmtClass; + } + static bool classof(const AttributedStmt *) { return true; } +}; + + /// IfStmt - This represents an if/then/else. /// class IfStmt : public Stmt { diff --git a/contrib/llvm/tools/clang/include/clang/AST/Type.h b/contrib/llvm/tools/clang/include/clang/AST/Type.h index 7bd367c054f..7b615c19dcc 100644 --- a/contrib/llvm/tools/clang/include/clang/AST/Type.h +++ b/contrib/llvm/tools/clang/include/clang/AST/Type.h @@ -79,6 +79,7 @@ namespace clang { class CXXRecordDecl; class EnumDecl; class FieldDecl; + class FunctionDecl; class ObjCInterfaceDecl; class ObjCProtocolDecl; class ObjCMethodDecl; @@ -2700,7 +2701,9 @@ public: ExtProtoInfo() : Variadic(false), HasTrailingReturn(false), TypeQuals(0), ExceptionSpecType(EST_None), RefQualifier(RQ_None), - NumExceptions(0), Exceptions(0), NoexceptExpr(0), ConsumedArguments(0) {} + NumExceptions(0), Exceptions(0), NoexceptExpr(0), + ExceptionSpecDecl(0), ExceptionSpecTemplate(0), + ConsumedArguments(0) {} FunctionType::ExtInfo ExtInfo; bool Variadic : 1; @@ -2711,6 +2714,8 @@ public: unsigned NumExceptions; const QualType *Exceptions; Expr *NoexceptExpr; + FunctionDecl *ExceptionSpecDecl; + FunctionDecl *ExceptionSpecTemplate; const bool *ConsumedArguments; }; @@ -2756,6 +2761,11 @@ private: // NoexceptExpr - Instead of Exceptions, there may be a single Expr* pointing // to the expression in the noexcept() specifier. + // ExceptionSpecDecl, ExceptionSpecTemplate - Instead of Exceptions, there may + // be a pair of FunctionDecl* pointing to the function which should be used to + // instantiate this function type's exception specification, and the function + // from which it should be instantiated. + // ConsumedArgs - A variable size array, following Exceptions // and of length NumArgs, holding flags indicating which arguments // are consumed. This only appears if HasAnyConsumedArgs is true. @@ -2795,6 +2805,9 @@ public: EPI.Exceptions = exception_begin(); } else if (EPI.ExceptionSpecType == EST_ComputedNoexcept) { EPI.NoexceptExpr = getNoexceptExpr(); + } else if (EPI.ExceptionSpecType == EST_Uninstantiated) { + EPI.ExceptionSpecDecl = getExceptionSpecDecl(); + EPI.ExceptionSpecTemplate = getExceptionSpecTemplate(); } if (hasAnyConsumedArgs()) EPI.ConsumedArguments = getConsumedArgsBuffer(); @@ -2838,9 +2851,26 @@ public: // NoexceptExpr sits where the arguments end. return *reinterpret_cast(arg_type_end()); } + /// \brief If this function type has an uninstantiated exception + /// specification, this is the function whose exception specification + /// is represented by this type. + FunctionDecl *getExceptionSpecDecl() const { + if (getExceptionSpecType() != EST_Uninstantiated) + return 0; + return reinterpret_cast(arg_type_end())[0]; + } + /// \brief If this function type has an uninstantiated exception + /// specification, this is the function whose exception specification + /// should be instantiated to find the exception specification for + /// this type. + FunctionDecl *getExceptionSpecTemplate() const { + if (getExceptionSpecType() != EST_Uninstantiated) + return 0; + return reinterpret_cast(arg_type_end())[1]; + } bool isNothrow(ASTContext &Ctx) const { ExceptionSpecificationType EST = getExceptionSpecType(); - assert(EST != EST_Delayed); + assert(EST != EST_Delayed && EST != EST_Uninstantiated); if (EST == EST_DynamicNone || EST == EST_BasicNoexcept) return true; if (EST != EST_ComputedNoexcept) diff --git a/contrib/llvm/tools/clang/include/clang/AST/VTableBuilder.h b/contrib/llvm/tools/clang/include/clang/AST/VTableBuilder.h index 2aa9a3dec9a..392dad94a4a 100644 --- a/contrib/llvm/tools/clang/include/clang/AST/VTableBuilder.h +++ b/contrib/llvm/tools/clang/include/clang/AST/VTableBuilder.h @@ -205,11 +205,11 @@ public: typedef llvm::DenseMap AddressPointsMapTy; private: uint64_t NumVTableComponents; - VTableComponent *VTableComponents; + llvm::OwningArrayPtr VTableComponents; /// VTableThunks - Contains thunks needed by vtables. uint64_t NumVTableThunks; - VTableThunkTy *VTableThunks; + llvm::OwningArrayPtr VTableThunks; /// Address points - Address points for all vtables. AddressPointsMapTy AddressPoints; @@ -227,11 +227,11 @@ public: } vtable_component_iterator vtable_component_begin() const { - return VTableComponents; + return VTableComponents.get(); } vtable_component_iterator vtable_component_end() const { - return VTableComponents+NumVTableComponents; + return VTableComponents.get()+NumVTableComponents; } uint64_t getNumVTableThunks() const { @@ -239,11 +239,11 @@ public: } vtable_thunk_iterator vtable_thunk_begin() const { - return VTableThunks; + return VTableThunks.get(); } vtable_thunk_iterator vtable_thunk_end() const { - return VTableThunks+NumVTableThunks; + return VTableThunks.get()+NumVTableThunks; } uint64_t getAddressPoint(BaseSubobject Base) const { diff --git a/contrib/llvm/tools/clang/include/clang/Analysis/ProgramPoint.h b/contrib/llvm/tools/clang/include/clang/Analysis/ProgramPoint.h index b2200c65cfd..aa7a33c956e 100644 --- a/contrib/llvm/tools/clang/include/clang/Analysis/ProgramPoint.h +++ b/contrib/llvm/tools/clang/include/clang/Analysis/ProgramPoint.h @@ -129,7 +129,7 @@ public: static bool classof(const ProgramPoint*) { return true; } bool operator==(const ProgramPoint & RHS) const { - return Data1 == Data1 && + return Data1 == RHS.Data1 && Data2 == RHS.Data2 && L == RHS.L && Tag == RHS.Tag; diff --git a/contrib/llvm/tools/clang/include/clang/Basic/BuiltinsX86.def b/contrib/llvm/tools/clang/include/clang/Basic/BuiltinsX86.def index f44aed6f954..4aea980a9d5 100644 --- a/contrib/llvm/tools/clang/include/clang/Basic/BuiltinsX86.def +++ b/contrib/llvm/tools/clang/include/clang/Basic/BuiltinsX86.def @@ -412,6 +412,9 @@ BUILTIN(__builtin_ia32_cvtps2pd256, "V4dV4f", "") BUILTIN(__builtin_ia32_cvttpd2dq256, "V4iV4d", "") BUILTIN(__builtin_ia32_cvtpd2dq256, "V4iV4d", "") BUILTIN(__builtin_ia32_cvttps2dq256, "V8iV8f", "") +BUILTIN(__builtin_ia32_vperm2f128_pd256, "V4dV4dV4dIc", "") +BUILTIN(__builtin_ia32_vperm2f128_ps256, "V8fV8fV8fIc", "") +BUILTIN(__builtin_ia32_vperm2f128_si256, "V8iV8iV8iIc", "") BUILTIN(__builtin_ia32_vinsertf128_pd256, "V4dV4dV2dIc", "") BUILTIN(__builtin_ia32_vinsertf128_ps256, "V8fV8fV4fIc", "") BUILTIN(__builtin_ia32_vinsertf128_si256, "V8iV8iV4iIc", "") @@ -560,9 +563,8 @@ BUILTIN(__builtin_ia32_pbroadcastw128, "V8sV8s", "") BUILTIN(__builtin_ia32_pbroadcastd128, "V4iV4i", "") BUILTIN(__builtin_ia32_pbroadcastq128, "V2LLiV2LLi", "") BUILTIN(__builtin_ia32_permvarsi256, "V8iV8iV8i", "") -BUILTIN(__builtin_ia32_permdf256, "V4dV4dIc", "") BUILTIN(__builtin_ia32_permvarsf256, "V8fV8fV8f", "") -BUILTIN(__builtin_ia32_permdi256, "V4LLiV4LLiIc", "") +BUILTIN(__builtin_ia32_permti256, "V4LLiV4LLiV4LLiIc", "") BUILTIN(__builtin_ia32_extract128i256, "V2LLiV4LLiIc", "") BUILTIN(__builtin_ia32_insert128i256, "V4LLiV4LLiV2LLiIc", "") BUILTIN(__builtin_ia32_maskloadd256, "V8iV8iC*V8i", "") diff --git a/contrib/llvm/tools/clang/include/clang/Basic/ConvertUTF.h b/contrib/llvm/tools/clang/include/clang/Basic/ConvertUTF.h index ec6b973e6a7..7fb58740271 100644 --- a/contrib/llvm/tools/clang/include/clang/Basic/ConvertUTF.h +++ b/contrib/llvm/tools/clang/include/clang/Basic/ConvertUTF.h @@ -151,9 +151,9 @@ ConversionResult ConvertUTF16toUTF32 ( ConversionResult ConvertUTF32toUTF16 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); +#endif Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); -#endif Boolean isLegalUTF8String(const UTF8 *source, const UTF8 *sourceEnd); diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DelayedCleanupPool.h b/contrib/llvm/tools/clang/include/clang/Basic/DelayedCleanupPool.h deleted file mode 100644 index 8575bc21113..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Basic/DelayedCleanupPool.h +++ /dev/null @@ -1,110 +0,0 @@ -//=== DelayedCleanupPool.h - Delayed Clean-up Pool Implementation *- C++ -*===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines a facility to delay calling cleanup methods until specific -// points. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_BASIC_DELAYEDCLEANUPPOOL_H -#define LLVM_CLANG_BASIC_DELAYEDCLEANUPPOOL_H - -#include "clang/Basic/LLVM.h" -#include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/SmallVector.h" - -namespace clang { - -/// \brief Gathers pairs of pointer-to-object/pointer-to-cleanup-function -/// allowing the cleanup functions to get called (with the pointer as parameter) -/// at specific points. -/// -/// The use case is to simplify clean-up of certain resources that, while their -/// lifetime is well-known and restricted, cleaning them up manually is easy to -/// miss and cause a leak. -/// -/// The same pointer can be added multiple times; its clean-up function will -/// only be called once. -class DelayedCleanupPool { -public: - typedef void (*CleanupFn)(void *ptr); - - /// \brief Adds a pointer and its associated cleanup function to be called - /// at a later point. - /// - /// \returns false if the pointer is already added, true otherwise. - bool delayCleanup(void *ptr, CleanupFn fn) { - assert(ptr && "Expected valid pointer to object"); - assert(fn && "Expected valid pointer to function"); - - CleanupFn &mapFn = Ptrs[ptr]; - assert((!mapFn || mapFn == fn) && - "Adding a pointer with different cleanup function!"); - - if (!mapFn) { - mapFn = fn; - Cleanups.push_back(std::make_pair(ptr, fn)); - return true; - } - - return false; - } - - template - bool delayDelete(T *ptr) { - return delayCleanup(ptr, cleanupWithDelete); - } - - template - bool delayMemberFunc(T *ptr) { - return delayCleanup(ptr, cleanupWithMemberFunc); - } - - void doCleanup() { - for (SmallVector, 8>::reverse_iterator - I = Cleanups.rbegin(), E = Cleanups.rend(); I != E; ++I) - I->second(I->first); - Cleanups.clear(); - Ptrs.clear(); - } - - ~DelayedCleanupPool() { - doCleanup(); - } - -private: - llvm::DenseMap Ptrs; - SmallVector, 8> Cleanups; - - template - static void cleanupWithDelete(void *ptr) { - delete static_cast(ptr); - } - - template - static void cleanupWithMemberFunc(void *ptr) { - (static_cast(ptr)->*Fn)(); - } -}; - -/// \brief RAII object for triggering a cleanup of a DelayedCleanupPool. -class DelayedCleanupPoint { - DelayedCleanupPool &Pool; - -public: - DelayedCleanupPoint(DelayedCleanupPool &pool) : Pool(pool) { } - - ~DelayedCleanupPoint() { - Pool.doCleanup(); - } -}; - -} // end namespace clang - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td index e553740ab1d..0614adee85b 100644 --- a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -231,9 +231,13 @@ def err_using_decl_can_not_refer_to_namespace : Error< "using declaration can not refer to namespace">; def err_using_decl_constructor : Error< "using declaration can not refer to a constructor">; -def warn_cxx98_compat_using_decl_constructor : Warning< - "inherited constructors are incompatible with C++98">, - InGroup, DefaultIgnore; +def err_using_decl_constructor_unsupported : Error< + "inheriting constructors are not supported">; +// FIXME: Replace the above error with this warning if support for +// inheriting constructors is implemented. +//def warn_cxx98_compat_using_decl_constructor : Warning< +// "inheriting constructors are incompatible with C++98">, +// InGroup, DefaultIgnore; def err_using_decl_destructor : Error< "using declaration can not refer to a destructor">; def err_using_decl_template_id : Error< @@ -1547,9 +1551,6 @@ def warn_objc_redundant_literal_use : Warning< "using %0 with a literal is redundant">, InGroup; } -def warn_bool_for_boolean_literal : Warning< - "BOOL of type %0 is non-intergal and unsuitable for a " - "boolean literal - ignored">, InGroup>; def err_only_annotate_after_access_spec : Error< "access specifier can only have annotation attributes">; def err_attribute_section_invalid_for_target : Error< @@ -1563,6 +1564,9 @@ def warn_redeclaration_without_attribute_prev_attribute_ignored : Warning< def warn_attribute_ignored : Warning<"%0 attribute ignored">; def warn_unknown_attribute_ignored : Warning< "unknown attribute %0 ignored">, InGroup; +def warn_attribute_invalid_on_stmt : Warning< + "attribute %0 cannot be specified on a statement">, + InGroup; def warn_declspec_attribute_ignored : Warning< "attribute %0 is ignored, place it after \"%select{class|struct|union|enum}1\" to apply attribute to type declaration">, InGroup; def warn_attribute_precede_definition : Warning< @@ -2583,6 +2587,8 @@ def note_template_enum_def_here : Note< "in instantiation of enumeration %q0 requested here">; def note_template_type_alias_instantiation_here : Note< "in instantiation of template type alias %0 requested here">; +def note_template_exception_spec_instantiation_here : Note< + "in instantiation of exception specification for %0 requested here">; def note_default_arg_instantiation_here : Note< "in instantiation of default argument for '%0' required here">; @@ -3798,6 +3804,9 @@ def warn_null_in_comparison_operation : Warning< def err_invalid_this_use : Error< "invalid use of 'this' outside of a non-static member function">; +def err_this_static_member_func : Error< + "'this' cannot be%select{| implicitly}0 used in a static member function " + "declaration">; def err_invalid_member_use_in_static_method : Error< "invalid use of member %0 in static member function">; def err_invalid_qualified_function_type : Error< @@ -3907,7 +3916,7 @@ def err_nosetter_property_incdec : Error< def err_nogetter_property_compound_assignment : Error< "a getter method is needed to perform a compound assignment on a property">; def err_nogetter_property_incdec : Error< - "no getter method %1 for %select{increment|decrement} of property">; + "no getter method %1 for %select{increment|decrement}0 of property">; def error_no_subobject_property_setting : Error< "expression is not assignable">; def err_qualified_objc_access : Error< diff --git a/contrib/llvm/tools/clang/include/clang/Basic/ExceptionSpecificationType.h b/contrib/llvm/tools/clang/include/clang/Basic/ExceptionSpecificationType.h index 98cfd297add..e911bde1910 100644 --- a/contrib/llvm/tools/clang/include/clang/Basic/ExceptionSpecificationType.h +++ b/contrib/llvm/tools/clang/include/clang/Basic/ExceptionSpecificationType.h @@ -16,7 +16,7 @@ namespace clang { -/// \brief The various types of exception specifications that exist in C++0x. +/// \brief The various types of exception specifications that exist in C++11. enum ExceptionSpecificationType { EST_None, ///< no exception specification EST_DynamicNone, ///< throw() @@ -24,7 +24,8 @@ enum ExceptionSpecificationType { EST_MSAny, ///< Microsoft throw(...) extension EST_BasicNoexcept, ///< noexcept EST_ComputedNoexcept, ///< noexcept(expression) - EST_Delayed ///< not known yet + EST_Delayed, ///< not known yet + EST_Uninstantiated ///< not instantiated yet }; inline bool isDynamicExceptionSpec(ExceptionSpecificationType ESpecType) { @@ -35,6 +36,19 @@ inline bool isNoexceptExceptionSpec(ExceptionSpecificationType ESpecType) { return ESpecType == EST_BasicNoexcept || ESpecType == EST_ComputedNoexcept; } +/// \brief Possible results from evaluation of a noexcept expression. +enum CanThrowResult { + CT_Cannot, + CT_Dependent, + CT_Can +}; + +inline CanThrowResult mergeCanThrow(CanThrowResult CT1, CanThrowResult CT2) { + // CanThrowResult constants are ordered so that the maximum is the correct + // merge result. + return CT1 > CT2 ? CT1 : CT2; +} + } // end namespace clang #endif // LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H diff --git a/contrib/llvm/tools/clang/include/clang/Basic/OnDiskHashTable.h b/contrib/llvm/tools/clang/include/clang/Basic/OnDiskHashTable.h index 8028a73326c..b92f1cf9c6a 100644 --- a/contrib/llvm/tools/clang/include/clang/Basic/OnDiskHashTable.h +++ b/contrib/llvm/tools/clang/include/clang/Basic/OnDiskHashTable.h @@ -132,7 +132,7 @@ class OnDiskChainedHashTableGenerator { class Bucket { public: io::Offset off; - Item* head; + Item* head; unsigned length; Bucket() {} @@ -201,6 +201,7 @@ public: // Write out the number of items in the bucket. Emit16(out, B.length); + assert(B.length != 0 && "Bucket has a head but zero length?"); // Write out the entries in the bucket. for (Item *I = B.head; I ; I = I->next) { @@ -398,31 +399,30 @@ public: } key_iterator key_end() { return key_iterator(); } - /// \brief Iterates over all the entries in the table, returning - /// a key/data pair. - class item_iterator { + /// \brief Iterates over all the entries in the table, returning the data. + class data_iterator { const unsigned char* Ptr; unsigned NumItemsInBucketLeft; unsigned NumEntriesLeft; Info *InfoObj; public: - typedef std::pair value_type; + typedef data_type value_type; - item_iterator(const unsigned char* const Ptr, unsigned NumEntries, + data_iterator(const unsigned char* const Ptr, unsigned NumEntries, Info *InfoObj) : Ptr(Ptr), NumItemsInBucketLeft(0), NumEntriesLeft(NumEntries), InfoObj(InfoObj) { } - item_iterator() + data_iterator() : Ptr(0), NumItemsInBucketLeft(0), NumEntriesLeft(0), InfoObj(0) { } - bool operator==(const item_iterator& X) const { + bool operator==(const data_iterator& X) const { return X.NumEntriesLeft == NumEntriesLeft; } - bool operator!=(const item_iterator& X) const { + bool operator!=(const data_iterator& X) const { return X.NumEntriesLeft != NumEntriesLeft; } - item_iterator& operator++() { // Preincrement + data_iterator& operator++() { // Preincrement if (!NumItemsInBucketLeft) { // 'Items' starts with a 16-bit unsigned integer representing the // number of items in this bucket. @@ -438,8 +438,8 @@ public: --NumEntriesLeft; return *this; } - item_iterator operator++(int) { // Postincrement - item_iterator tmp = *this; ++*this; return tmp; + data_iterator operator++(int) { // Postincrement + data_iterator tmp = *this; ++*this; return tmp; } value_type operator*() const { @@ -454,15 +454,14 @@ public: // Read the key. const internal_key_type& Key = InfoObj->ReadKey(LocalPtr, L.first); - return std::make_pair(InfoObj->GetExternalKey(Key), - InfoObj->ReadData(Key, LocalPtr + L.first, L.second)); + return InfoObj->ReadData(Key, LocalPtr + L.first, L.second); } }; - item_iterator item_begin() { - return item_iterator(Base + 4, getNumEntries(), &InfoObj); + data_iterator data_begin() { + return data_iterator(Base + 4, getNumEntries(), &InfoObj); } - item_iterator item_end() { return item_iterator(); } + data_iterator data_end() { return data_iterator(); } Info &getInfoObj() { return InfoObj; } diff --git a/contrib/llvm/tools/clang/include/clang/Basic/StmtNodes.td b/contrib/llvm/tools/clang/include/clang/Basic/StmtNodes.td index 67d71e44c0a..e7718cd80cb 100644 --- a/contrib/llvm/tools/clang/include/clang/Basic/StmtNodes.td +++ b/contrib/llvm/tools/clang/include/clang/Basic/StmtNodes.td @@ -12,6 +12,7 @@ class DStmt : Stmt { def NullStmt : Stmt; def CompoundStmt : Stmt; def LabelStmt : Stmt; +def AttributedStmt : Stmt; def IfStmt : Stmt; def SwitchStmt : Stmt; def WhileStmt : Stmt; diff --git a/contrib/llvm/tools/clang/include/clang/Basic/TargetInfo.h b/contrib/llvm/tools/clang/include/clang/Basic/TargetInfo.h index bbd376a8241..a03cf83ff7d 100644 --- a/contrib/llvm/tools/clang/include/clang/Basic/TargetInfo.h +++ b/contrib/llvm/tools/clang/include/clang/Basic/TargetInfo.h @@ -132,6 +132,11 @@ protected: IntType SizeType, IntMaxType, UIntMaxType, PtrDiffType, IntPtrType, WCharType, WIntType, Char16Type, Char32Type, Int64Type, SigAtomicType; + /// Flag whether the Objective-C built-in boolean type should be signed char. + /// Otherwise, when this flag is not set, the normal built-in boolean type is + /// used. + unsigned UseSignedCharForObjCBool : 1; + /// Control whether the alignment of bit-field types is respected when laying /// out structures. If true, then the alignment of the bit-field type will be /// used to (a) impact the alignment of the containing structure, and (b) @@ -299,6 +304,16 @@ public: return MCountName; } + /// useSignedCharForObjCBool - Check if the Objective-C built-in boolean + /// type should be signed char. Otherwise, if this returns false, the + /// normal built-in boolean type should also be used for Objective-C. + bool useSignedCharForObjCBool() const { + return UseSignedCharForObjCBool; + } + void noSignedCharForObjCBool() { + UseSignedCharForObjCBool = false; + } + /// useBitFieldTypeAlignment() - Check whether the alignment of bit-field /// types is respected when laying out structures. bool useBitFieldTypeAlignment() const { diff --git a/contrib/llvm/tools/clang/include/clang/Driver/CC1Options.td b/contrib/llvm/tools/clang/include/clang/Driver/CC1Options.td index 88009edb43e..d9d47c50eef 100644 --- a/contrib/llvm/tools/clang/include/clang/Driver/CC1Options.td +++ b/contrib/llvm/tools/clang/include/clang/Driver/CC1Options.td @@ -428,9 +428,6 @@ def ast_view : Flag<"-ast-view">, HelpText<"Build ASTs and view them with GraphViz">; def print_decl_contexts : Flag<"-print-decl-contexts">, HelpText<"Print DeclContexts and their Decls">; -def pubnames_dump : Flag<"-pubnames-dump">, - HelpText<"Print all of the public (global) names in the source, e.g., the " - "names of all global declarations and macros">; def emit_module : Flag<"-emit-module">, HelpText<"Generate pre-compiled module file from a module map">; def emit_pth : Flag<"-emit-pth">, diff --git a/contrib/llvm/tools/clang/include/clang/Driver/Compilation.h b/contrib/llvm/tools/clang/include/clang/Driver/Compilation.h index fd88c3a6363..6f1a2217cd1 100644 --- a/contrib/llvm/tools/clang/include/clang/Driver/Compilation.h +++ b/contrib/llvm/tools/clang/include/clang/Driver/Compilation.h @@ -92,6 +92,9 @@ public: return FailureResultFiles; } + /// Returns the sysroot path. + StringRef getSysRoot() const; + /// getArgsForToolChain - Return the derived argument list for the /// tool chain \arg TC (or the default tool chain, if TC is not /// specified). diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/ASTUnit.h b/contrib/llvm/tools/clang/include/clang/Frontend/ASTUnit.h index 5e4ecadd690..041eabb5b99 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/ASTUnit.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/ASTUnit.h @@ -14,7 +14,6 @@ #ifndef LLVM_CLANG_FRONTEND_ASTUNIT_H #define LLVM_CLANG_FRONTEND_ASTUNIT_H -#include "clang/Index/ASTLocation.h" #include "clang/Serialization/ASTBitCodes.h" #include "clang/Sema/Sema.h" #include "clang/Sema/CodeCompleteConsumer.h" @@ -57,8 +56,6 @@ class SourceManager; class TargetInfo; class ASTFrontendAction; -using namespace idx; - /// \brief Utility class for loading a ASTContext from an AST file. /// class ASTUnit : public ModuleLoader { @@ -134,9 +131,6 @@ private: /// The name of the original source file used to generate this ASTUnit. std::string OriginalSourceFile; - // Critical optimization when using clang_getCursor(). - ASTLocation LastLoc; - /// \brief The set of diagnostics produced when creating the preamble. SmallVector PreambleDiagnostics; @@ -474,10 +468,6 @@ public: bool getOwnsRemappedFileBuffers() const { return OwnsRemappedFileBuffers; } void setOwnsRemappedFileBuffers(bool val) { OwnsRemappedFileBuffers = val; } - void setLastASTLocation(ASTLocation ALoc) { LastLoc = ALoc; } - ASTLocation getLastASTLocation() const { return LastLoc; } - - StringRef getMainFileName() const; typedef std::vector::iterator top_level_iterator; diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h index 8817c5af564..8f7fe87ee67 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h @@ -173,15 +173,6 @@ protected: virtual bool usesPreprocessorOnly() const { return true; } }; -class PubnamesDumpAction : public ASTFrontendAction { -protected: - virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, - StringRef InFile); - -public: - virtual bool hasCodeCompletionSupport() const { return false; } -}; - //===----------------------------------------------------------------------===// // Preprocessor Actions //===----------------------------------------------------------------------===// diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h index a051d7ff629..888388c310e 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h @@ -42,7 +42,6 @@ namespace frontend { PrintDeclContext, ///< Print DeclContext and their Decls. PrintPreamble, ///< Print the "preamble" of the input file PrintPreprocessedInput, ///< -E mode. - PubnamesDump, ///< Print all of the "public" names in the source. RewriteMacros, ///< Expand macros but not #includes. RewriteObjC, ///< ObjC->C Rewriter. RewriteTest, ///< Rewriter playground diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnostic.h b/contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnostic.h index 519d3b61ce7..314003bce2c 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnostic.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnostic.h @@ -18,6 +18,8 @@ #include "clang/Frontend/DiagnosticRenderer.h" +struct SourceColumnMap; + namespace clang { /// \brief Class to encapsulate the logic for formatting and printing a textual @@ -103,15 +105,16 @@ private: SmallVectorImpl& Ranges, ArrayRef Hints); + void emitSnippet(StringRef SourceLine); + void highlightRange(const CharSourceRange &R, unsigned LineNo, FileID FID, - const std::string &SourceLine, + const SourceColumnMap &map, std::string &CaretLine); + std::string buildFixItInsertionLine(unsigned LineNo, - const char *LineStart, - const char *LineEnd, + const SourceColumnMap &map, ArrayRef Hints); - void expandTabs(std::string &SourceLine, std::string &CaretLine); void emitParseableFixits(ArrayRef Hints); }; diff --git a/contrib/llvm/tools/clang/include/clang/Index/ASTLocation.h b/contrib/llvm/tools/clang/include/clang/Index/ASTLocation.h deleted file mode 100644 index 45097cc5c3d..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/ASTLocation.h +++ /dev/null @@ -1,173 +0,0 @@ -//===--- ASTLocation.h - A pair --------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// ASTLocation is Decl or a Stmt and its immediate Decl parent. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_ASTLOCATION_H -#define LLVM_CLANG_INDEX_ASTLOCATION_H - -#include "clang/AST/TypeLoc.h" -#include "llvm/ADT/PointerIntPair.h" -#include "llvm/Support/Compiler.h" - -namespace clang { - class Decl; - class Stmt; - class NamedDecl; - -namespace idx { - class TranslationUnit; - -/// \brief Represents a Decl or a Stmt and its immediate Decl parent. It's -/// immutable. -/// -/// ASTLocation is intended to be used as a "pointer" into the AST. It is either -/// just a Decl, or a Stmt and its Decl parent. Since a single Stmt is devoid -/// of context, its parent Decl provides all the additional missing information -/// like the declaration context, ASTContext, etc. -/// -class ASTLocation { -public: - enum NodeKind { - N_Decl, N_NamedRef, N_Stmt, N_Type - }; - - struct NamedRef { - NamedDecl *ND; - SourceLocation Loc; - - NamedRef() : ND(0) { } - NamedRef(NamedDecl *nd, SourceLocation loc) : ND(nd), Loc(loc) { } - }; - -private: - llvm::PointerIntPair ParentDecl; - - union { - Decl *D; - Stmt *Stm; - struct { - NamedDecl *ND; - unsigned RawLoc; - } NDRef; - struct { - void *TyPtr; - void *Data; - } Ty; - }; - -public: - ASTLocation() { } - - explicit ASTLocation(const Decl *d) - : ParentDecl(const_cast(d), N_Decl), D(const_cast(d)) { } - - ASTLocation(const Decl *parentDecl, const Stmt *stm) - : ParentDecl(const_cast(parentDecl), N_Stmt), - Stm(const_cast(stm)) { - if (!stm) ParentDecl.setPointer(0); - } - - ASTLocation(const Decl *parentDecl, NamedDecl *ndRef, SourceLocation loc) - : ParentDecl(const_cast(parentDecl), N_NamedRef) { - if (ndRef) { - NDRef.ND = ndRef; - NDRef.RawLoc = loc.getRawEncoding(); - } else - ParentDecl.setPointer(0); - } - - ASTLocation(const Decl *parentDecl, TypeLoc tyLoc) - : ParentDecl(const_cast(parentDecl), N_Type) { - if (tyLoc) { - Ty.TyPtr = tyLoc.getType().getAsOpaquePtr(); - Ty.Data = tyLoc.getOpaqueData(); - } else - ParentDecl.setPointer(0); - } - - bool isValid() const { return ParentDecl.getPointer() != 0; } - bool isInvalid() const { return !isValid(); } - - NodeKind getKind() const { - assert(isValid()); - return (NodeKind)ParentDecl.getInt(); - } - - Decl *getParentDecl() const { return ParentDecl.getPointer(); } - - Decl *AsDecl() const { - assert(getKind() == N_Decl); - return D; - } - Stmt *AsStmt() const { - assert(getKind() == N_Stmt); - return Stm; - } - NamedRef AsNamedRef() const { - assert(getKind() == N_NamedRef); - return NamedRef(NDRef.ND, SourceLocation::getFromRawEncoding(NDRef.RawLoc)); - } - TypeLoc AsTypeLoc() const { - assert(getKind() == N_Type); - return TypeLoc(QualType::getFromOpaquePtr(Ty.TyPtr), Ty.Data); - } - - Decl *dyn_AsDecl() const { return isValid() && getKind() == N_Decl ? D : 0; } - Stmt *dyn_AsStmt() const { - return isValid() && getKind() == N_Stmt ? Stm : 0; - } - NamedRef dyn_AsNamedRef() const { - return getKind() == N_Type ? AsNamedRef() : NamedRef(); - } - TypeLoc dyn_AsTypeLoc() const { - return getKind() == N_Type ? AsTypeLoc() : TypeLoc(); - } - - bool isDecl() const { return isValid() && getKind() == N_Decl; } - bool isStmt() const { return isValid() && getKind() == N_Stmt; } - bool isNamedRef() const { return isValid() && getKind() == N_NamedRef; } - bool isType() const { return isValid() && getKind() == N_Type; } - - /// \brief Returns the declaration that this ASTLocation references. - /// - /// If this points to a Decl, that Decl is returned. - /// If this points to an Expr that references a Decl, that Decl is returned, - /// otherwise it returns NULL. - Decl *getReferencedDecl(); - const Decl *getReferencedDecl() const { - return const_cast(this)->getReferencedDecl(); - } - - SourceRange getSourceRange() const LLVM_READONLY; - - void print(raw_ostream &OS) const; -}; - -/// \brief Like ASTLocation but also contains the TranslationUnit that the -/// ASTLocation originated from. -class TULocation : public ASTLocation { - TranslationUnit *TU; - -public: - TULocation(TranslationUnit *tu, ASTLocation astLoc) - : ASTLocation(astLoc), TU(tu) { - assert(tu && "Passed null translation unit"); - } - - TranslationUnit *getTU() const { return TU; } -}; - -} // namespace idx - -} // namespace clang - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Index/Analyzer.h b/contrib/llvm/tools/clang/include/clang/Index/Analyzer.h deleted file mode 100644 index f6b5465148e..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/Analyzer.h +++ /dev/null @@ -1,56 +0,0 @@ -//===--- Analyzer.h - Analysis for indexing information ---------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the Analyzer interface. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_ANALYZER_H -#define LLVM_CLANG_INDEX_ANALYZER_H - -namespace clang { - class Decl; - class ObjCMessageExpr; - -namespace idx { - class Program; - class IndexProvider; - class TULocationHandler; - -/// \brief Provides indexing information, like finding all references of an -/// Entity across translation units. -class Analyzer { - Program &Prog; - IndexProvider &Idxer; - - Analyzer(const Analyzer&); // do not implement - Analyzer &operator=(const Analyzer &); // do not implement - -public: - explicit Analyzer(Program &prog, IndexProvider &idxer) - : Prog(prog), Idxer(idxer) { } - - /// \brief Find all TULocations for declarations of the given Decl and pass - /// them to Handler. - void FindDeclarations(Decl *D, TULocationHandler &Handler); - - /// \brief Find all TULocations for references of the given Decl and pass - /// them to Handler. - void FindReferences(Decl *D, TULocationHandler &Handler); - - /// \brief Find methods that may respond to the given message and pass them - /// to Handler. - void FindObjCMethods(ObjCMessageExpr *MsgE, TULocationHandler &Handler); -}; - -} // namespace idx - -} // namespace clang - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Index/DeclReferenceMap.h b/contrib/llvm/tools/clang/include/clang/Index/DeclReferenceMap.h deleted file mode 100644 index 73f2fe50b3b..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/DeclReferenceMap.h +++ /dev/null @@ -1,50 +0,0 @@ -//===--- DeclReferenceMap.h - Map Decls to their references -----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// DeclReferenceMap creates a mapping from Decls to the ASTLocations that -// reference them. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_DECLREFERENCEMAP_H -#define LLVM_CLANG_INDEX_DECLREFERENCEMAP_H - -#include "clang/Index/ASTLocation.h" -#include "clang/Index/STLExtras.h" -#include - -namespace clang { - class ASTContext; - class NamedDecl; - -namespace idx { - -/// \brief Maps NamedDecls with the ASTLocations that reference them. -/// -/// References are mapped and retrieved using the canonical decls. -class DeclReferenceMap { -public: - explicit DeclReferenceMap(ASTContext &Ctx); - - typedef std::multimap MapTy; - typedef pair_value_iterator astlocation_iterator; - - astlocation_iterator refs_begin(NamedDecl *D) const; - astlocation_iterator refs_end(NamedDecl *D) const; - bool refs_empty(NamedDecl *D) const; - -private: - mutable MapTy Map; -}; - -} // end idx namespace - -} // end clang namespace - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Index/Entity.h b/contrib/llvm/tools/clang/include/clang/Index/Entity.h deleted file mode 100644 index d104458ec24..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/Entity.h +++ /dev/null @@ -1,149 +0,0 @@ -//===--- Entity.h - Cross-translation-unit "token" for decls ----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Entity is a ASTContext-independent way to refer to declarations that are -// visible across translation units. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_ENTITY_H -#define LLVM_CLANG_INDEX_ENTITY_H - -#include "clang/Basic/LLVM.h" -#include "llvm/ADT/PointerUnion.h" -#include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/StringRef.h" -#include - -namespace clang { - class ASTContext; - class Decl; - -namespace idx { - class Program; - class EntityImpl; - -/// \brief A ASTContext-independent way to refer to declarations. -/// -/// Entity is basically the link for declarations that are semantically the same -/// in multiple ASTContexts. A client will convert a Decl into an Entity and -/// later use that Entity to find the "same" Decl into another ASTContext. -/// Declarations that are semantically the same and visible across translation -/// units will be associated with the same Entity. -/// -/// An Entity may also refer to declarations that cannot be visible across -/// translation units, e.g. static functions with the same name in multiple -/// translation units will be associated with different Entities. -/// -/// Entities can be checked for equality but note that the same Program object -/// should be used when getting Entities. -/// -class Entity { - /// \brief Stores the Decl directly if it is not visible outside of its own - /// translation unit, otherwise it stores the associated EntityImpl. - llvm::PointerUnion Val; - - explicit Entity(Decl *D); - explicit Entity(EntityImpl *impl) : Val(impl) { } - friend class EntityGetter; - -public: - Entity() { } - - /// \brief Find the Decl that can be referred to by this entity. - Decl *getDecl(ASTContext &AST) const; - - /// \brief If this Entity represents a declaration that is internal to its - /// translation unit, getInternalDecl() returns it. - Decl *getInternalDecl() const { - assert(isInternalToTU() && "This Entity is not internal!"); - return Val.get(); - } - - /// \brief Get a printable name for debugging purpose. - std::string getPrintableName() const; - - /// \brief Get an Entity associated with the given Decl. - /// \returns invalid Entity if an Entity cannot refer to this Decl. - static Entity get(Decl *D, Program &Prog); - - /// \brief Get an Entity associated with a name in the global namespace. - static Entity get(StringRef Name, Program &Prog); - - /// \brief true if the Entity is not visible outside the trasnlation unit. - bool isInternalToTU() const { - assert(isValid() && "This Entity is not valid!"); - return Val.is(); - } - - bool isValid() const { return !Val.isNull(); } - bool isInvalid() const { return !isValid(); } - - void *getAsOpaquePtr() const { return Val.getOpaqueValue(); } - static Entity getFromOpaquePtr(void *Ptr) { - Entity Ent; - Ent.Val = llvm::PointerUnion::getFromOpaqueValue(Ptr); - return Ent; - } - - friend bool operator==(const Entity &LHS, const Entity &RHS) { - return LHS.getAsOpaquePtr() == RHS.getAsOpaquePtr(); - } - - // For use in a std::map. - friend bool operator < (const Entity &LHS, const Entity &RHS) { - return LHS.getAsOpaquePtr() < RHS.getAsOpaquePtr(); - } - - // For use in DenseMap/DenseSet. - static Entity getEmptyMarker() { - Entity Ent; - Ent.Val = - llvm::PointerUnion::getFromOpaqueValue((void*)-1); - return Ent; - } - static Entity getTombstoneMarker() { - Entity Ent; - Ent.Val = - llvm::PointerUnion::getFromOpaqueValue((void*)-2); - return Ent; - } -}; - -} // namespace idx - -} // namespace clang - -namespace llvm { -/// Define DenseMapInfo so that Entities can be used as keys in DenseMap and -/// DenseSets. -template<> -struct DenseMapInfo { - static inline clang::idx::Entity getEmptyKey() { - return clang::idx::Entity::getEmptyMarker(); - } - - static inline clang::idx::Entity getTombstoneKey() { - return clang::idx::Entity::getTombstoneMarker(); - } - - static unsigned getHashValue(clang::idx::Entity); - - static inline bool - isEqual(clang::idx::Entity LHS, clang::idx::Entity RHS) { - return LHS == RHS; - } -}; - -template <> -struct isPodLike { static const bool value = true; }; - -} // end namespace llvm - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Index/GlobalCallGraph.h b/contrib/llvm/tools/clang/include/clang/Index/GlobalCallGraph.h deleted file mode 100644 index 7ba1cceac18..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/GlobalCallGraph.h +++ /dev/null @@ -1,149 +0,0 @@ -//== GlobalCallGraph.h - Call graph building --------------------*- C++ -*--==// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defined the CallGraph and CallGraphNode classes. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_CALLGRAPH -#define LLVM_CLANG_INDEX_CALLGRAPH - -#include "clang/Index/ASTLocation.h" -#include "clang/Index/Entity.h" -#include "clang/Index/Program.h" -#include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/GraphTraits.h" -#include "llvm/ADT/STLExtras.h" -#include -#include - -using namespace clang; - -namespace clang { -namespace idx { - -class CallGraphNode { - Entity F; - typedef std::pair CallRecord; - std::vector CalledFunctions; - -public: - CallGraphNode(Entity f) : F(f) {} - - typedef std::vector::iterator iterator; - typedef std::vector::const_iterator const_iterator; - - iterator begin() { return CalledFunctions.begin(); } - iterator end() { return CalledFunctions.end(); } - const_iterator begin() const { return CalledFunctions.begin(); } - const_iterator end() const { return CalledFunctions.end(); } - - void addCallee(ASTLocation L, CallGraphNode *Node) { - CalledFunctions.push_back(std::make_pair(L, Node)); - } - - bool hasCallee() const { return begin() != end(); } - - std::string getName() const { return F.getPrintableName(); } - - Decl *getDecl(ASTContext &Ctx) const { return F.getDecl(Ctx); } -}; - -class CallGraph { - /// Program manages all Entities. - Program &Prog; - - typedef std::map FunctionMapTy; - - /// FunctionMap owns all CallGraphNodes. - FunctionMapTy FunctionMap; - - /// CallerCtx maps a caller to its ASTContext. - llvm::DenseMap CallerCtx; - - /// Root node is the 'main' function or 0. - CallGraphNode *Root; - - /// ExternalCallingNode has edges to all external functions. - CallGraphNode *ExternalCallingNode; - -public: - CallGraph(Program &P); - ~CallGraph(); - - typedef FunctionMapTy::iterator iterator; - typedef FunctionMapTy::const_iterator const_iterator; - - iterator begin() { return FunctionMap.begin(); } - iterator end() { return FunctionMap.end(); } - const_iterator begin() const { return FunctionMap.begin(); } - const_iterator end() const { return FunctionMap.end(); } - - CallGraphNode *getRoot() { return Root; } - - CallGraphNode *getExternalCallingNode() { return ExternalCallingNode; } - - void addTU(ASTContext &AST); - - Program &getProgram() { return Prog; } - - CallGraphNode *getOrInsertFunction(idx::Entity F); - - Decl *getDecl(CallGraphNode *Node); - - void print(raw_ostream &os); - void dump(); - - void ViewCallGraph() const; -}; - -}} // end clang idx namespace - -namespace llvm { - -template <> struct GraphTraits { - typedef clang::idx::CallGraph GraphType; - typedef clang::idx::CallGraphNode NodeType; - - typedef std::pair CGNPairTy; - typedef std::pointer_to_unary_function CGNDerefFun; - - typedef mapped_iterator ChildIteratorType; - - static NodeType *getEntryNode(GraphType *CG) { - return CG->getExternalCallingNode(); - } - - static ChildIteratorType child_begin(NodeType *N) { - return map_iterator(N->begin(), CGNDerefFun(CGNDeref)); - } - static ChildIteratorType child_end(NodeType *N) { - return map_iterator(N->end(), CGNDerefFun(CGNDeref)); - } - - typedef std::pair PairTy; - typedef std::pointer_to_unary_function DerefFun; - - typedef mapped_iterator nodes_iterator; - - static nodes_iterator nodes_begin(const GraphType &CG) { - return map_iterator(CG.begin(), DerefFun(CGDeref)); - } - static nodes_iterator nodes_end(const GraphType &CG) { - return map_iterator(CG.end(), DerefFun(CGDeref)); - } - - static NodeType *CGNDeref(CGNPairTy P) { return P.second; } - - static NodeType *CGDeref(PairTy P) { return P.second; } -}; - -} // end llvm namespace - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Index/GlobalSelector.h b/contrib/llvm/tools/clang/include/clang/Index/GlobalSelector.h deleted file mode 100644 index 9cd83a8595b..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/GlobalSelector.h +++ /dev/null @@ -1,100 +0,0 @@ -//===--- GlobalSelector.h - Cross-translation-unit "token" for selectors --===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// GlobalSelector is a ASTContext-independent way to refer to selectors. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_GLOBALSELECTOR_H -#define LLVM_CLANG_INDEX_GLOBALSELECTOR_H - -#include "llvm/ADT/DenseMap.h" -#include - -namespace clang { - class ASTContext; - class Selector; - -namespace idx { - class Program; - -/// \brief A ASTContext-independent way to refer to selectors. -class GlobalSelector { - void *Val; - - explicit GlobalSelector(void *val) : Val(val) { } - -public: - GlobalSelector() : Val(0) { } - - /// \brief Get the ASTContext-specific selector. - Selector getSelector(ASTContext &AST) const; - - bool isValid() const { return Val != 0; } - bool isInvalid() const { return !isValid(); } - - /// \brief Get a printable name for debugging purpose. - std::string getPrintableName() const; - - /// \brief Get a GlobalSelector for the ASTContext-specific selector. - static GlobalSelector get(Selector Sel, Program &Prog); - - void *getAsOpaquePtr() const { return Val; } - - static GlobalSelector getFromOpaquePtr(void *Ptr) { - return GlobalSelector(Ptr); - } - - friend bool operator==(const GlobalSelector &LHS, const GlobalSelector &RHS) { - return LHS.getAsOpaquePtr() == RHS.getAsOpaquePtr(); - } - - // For use in a std::map. - friend bool operator< (const GlobalSelector &LHS, const GlobalSelector &RHS) { - return LHS.getAsOpaquePtr() < RHS.getAsOpaquePtr(); - } - - // For use in DenseMap/DenseSet. - static GlobalSelector getEmptyMarker() { return GlobalSelector((void*)-1); } - static GlobalSelector getTombstoneMarker() { - return GlobalSelector((void*)-2); - } -}; - -} // namespace idx - -} // namespace clang - -namespace llvm { -/// Define DenseMapInfo so that GlobalSelectors can be used as keys in DenseMap -/// and DenseSets. -template<> -struct DenseMapInfo { - static inline clang::idx::GlobalSelector getEmptyKey() { - return clang::idx::GlobalSelector::getEmptyMarker(); - } - - static inline clang::idx::GlobalSelector getTombstoneKey() { - return clang::idx::GlobalSelector::getTombstoneMarker(); - } - - static unsigned getHashValue(clang::idx::GlobalSelector); - - static inline bool - isEqual(clang::idx::GlobalSelector LHS, clang::idx::GlobalSelector RHS) { - return LHS == RHS; - } -}; - -template <> -struct isPodLike { static const bool value = true;}; - -} // end namespace llvm - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Index/Handlers.h b/contrib/llvm/tools/clang/include/clang/Index/Handlers.h deleted file mode 100644 index 1e017f8a7c8..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/Handlers.h +++ /dev/null @@ -1,82 +0,0 @@ -//===--- Handlers.h - Interfaces for receiving information ------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Abstract interfaces for receiving information. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_HANDLERS_H -#define LLVM_CLANG_INDEX_HANDLERS_H - -#include "clang/Basic/LLVM.h" -#include "llvm/ADT/SmallVector.h" - -namespace clang { - -namespace idx { - class Entity; - class TranslationUnit; - class TULocation; - -/// \brief Abstract interface for receiving Entities. -class EntityHandler { -public: - typedef Entity receiving_type; - - virtual ~EntityHandler(); - virtual void Handle(Entity Ent) = 0; -}; - -/// \brief Abstract interface for receiving TranslationUnits. -class TranslationUnitHandler { -public: - typedef TranslationUnit* receiving_type; - - virtual ~TranslationUnitHandler(); - virtual void Handle(TranslationUnit *TU) = 0; -}; - -/// \brief Abstract interface for receiving TULocations. -class TULocationHandler { -public: - typedef TULocation receiving_type; - - virtual ~TULocationHandler(); - virtual void Handle(TULocation TULoc) = 0; -}; - -/// \brief Helper for the Handler classes. Stores the objects into a vector. -/// example: -/// @code -/// Storing TURes; -/// IndexProvider.GetTranslationUnitsFor(Entity, TURes); -/// for (Storing::iterator -/// I = TURes.begin(), E = TURes.end(); I != E; ++I) { .... -/// @endcode -template -class Storing : public handler_type { - typedef typename handler_type::receiving_type receiving_type; - typedef SmallVector StoreTy; - StoreTy Store; - -public: - virtual void Handle(receiving_type Obj) { - Store.push_back(Obj); - } - - typedef typename StoreTy::const_iterator iterator; - iterator begin() const { return Store.begin(); } - iterator end() const { return Store.end(); } -}; - -} // namespace idx - -} // namespace clang - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Index/IndexProvider.h b/contrib/llvm/tools/clang/include/clang/Index/IndexProvider.h deleted file mode 100644 index 187dd9393cb..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/IndexProvider.h +++ /dev/null @@ -1,38 +0,0 @@ -//===--- IndexProvider.h - Maps information to translation units -*- C++ -*-==// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Maps information to TranslationUnits. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_INDEXPROVIDER_H -#define LLVM_CLANG_INDEX_INDEXPROVIDER_H - -namespace clang { - -namespace idx { - class Entity; - class TranslationUnitHandler; - class GlobalSelector; - -/// \brief Maps information to TranslationUnits. -class IndexProvider { -public: - virtual ~IndexProvider(); - virtual void GetTranslationUnitsFor(Entity Ent, - TranslationUnitHandler &Handler) = 0; - virtual void GetTranslationUnitsFor(GlobalSelector Sel, - TranslationUnitHandler &Handler) = 0; -}; - -} // namespace idx - -} // namespace clang - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Index/Indexer.h b/contrib/llvm/tools/clang/include/clang/Index/Indexer.h deleted file mode 100644 index 96c585df247..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/Indexer.h +++ /dev/null @@ -1,71 +0,0 @@ -//===--- Indexer.h - IndexProvider implementation ---------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// IndexProvider implementation. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_INDEXER_H -#define LLVM_CLANG_INDEX_INDEXER_H - -#include "clang/Index/IndexProvider.h" -#include "clang/Index/Entity.h" -#include "clang/Index/GlobalSelector.h" -#include "llvm/ADT/SmallPtrSet.h" -#include "llvm/ADT/DenseMap.h" -#include - -namespace clang { - class ASTContext; - class FunctionDecl; - -namespace idx { - class Program; - class TranslationUnit; - -/// \brief Maps information to TranslationUnits. -class Indexer : public IndexProvider { -public: - typedef llvm::SmallPtrSet TUSetTy; - typedef llvm::DenseMap CtxTUMapTy; - typedef std::map MapTy; - typedef std::map SelMapTy; - typedef std::map > DefMapTy; - - explicit Indexer(Program &prog) : - Prog(prog) { } - - Program &getProgram() const { return Prog; } - - /// \brief Find all Entities and map them to the given translation unit. - void IndexAST(TranslationUnit *TU); - - virtual void GetTranslationUnitsFor(Entity Ent, - TranslationUnitHandler &Handler); - virtual void GetTranslationUnitsFor(GlobalSelector Sel, - TranslationUnitHandler &Handler); - - std::pair getDefinitionFor(Entity Ent); - -private: - Program &Prog; - - MapTy Map; - // Map a function Entity to the its definition. - DefMapTy DefMap; - - CtxTUMapTy CtxTUMap; - SelMapTy SelMap; -}; - -} // namespace idx - -} // namespace clang - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Index/Program.h b/contrib/llvm/tools/clang/include/clang/Index/Program.h deleted file mode 100644 index 8039192512d..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/Program.h +++ /dev/null @@ -1,45 +0,0 @@ -//===--- Program.h - Cross-translation unit information ---------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the idx::Program interface. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_PROGRAM_H -#define LLVM_CLANG_INDEX_PROGRAM_H - -namespace clang { - class ASTContext; - -namespace idx { - class EntityHandler; - -/// \brief Top level object that owns and maintains information -/// that is common across translation units. -class Program { - void *Impl; - - Program(const Program&); // do not implement - Program &operator=(const Program &); // do not implement - friend class Entity; - friend class GlobalSelector; - -public: - Program(); - ~Program(); - - /// \brief Traverses the AST and passes all the entities to the Handler. - void FindEntities(ASTContext &Ctx, EntityHandler &Handler); -}; - -} // namespace idx - -} // namespace clang - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Index/STLExtras.h b/contrib/llvm/tools/clang/include/clang/Index/STLExtras.h deleted file mode 100644 index a3693c6c79a..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/STLExtras.h +++ /dev/null @@ -1,63 +0,0 @@ -//===--- STLExtras.h - Helper STL related templates -------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Helper templates for using with the STL. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_STLEXTRAS_H -#define LLVM_CLANG_INDEX_STLEXTRAS_H - -namespace clang { - -namespace idx { - -/// \brief Wraps an iterator whose value_type is a pair, and provides -/// pair's second object as the value. -template -class pair_value_iterator { - iter_type I; - -public: - typedef typename iter_type::value_type::second_type value_type; - typedef value_type& reference; - typedef value_type* pointer; - typedef typename iter_type::iterator_category iterator_category; - typedef typename iter_type::difference_type difference_type; - - pair_value_iterator() { } - pair_value_iterator(iter_type i) : I(i) { } - - reference operator*() const { return I->second; } - pointer operator->() const { return &I->second; } - - pair_value_iterator& operator++() { - ++I; - return *this; - } - - pair_value_iterator operator++(int) { - pair_value_iterator tmp(*this); - ++(*this); - return tmp; - } - - friend bool operator==(pair_value_iterator L, pair_value_iterator R) { - return L.I == R.I; - } - friend bool operator!=(pair_value_iterator L, pair_value_iterator R) { - return L.I != R.I; - } -}; - -} // end idx namespace - -} // end clang namespace - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Index/SelectorMap.h b/contrib/llvm/tools/clang/include/clang/Index/SelectorMap.h deleted file mode 100644 index be01702fcbd..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/SelectorMap.h +++ /dev/null @@ -1,57 +0,0 @@ -//===--- SelectorMap.h - Maps selectors to methods and messages -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// SelectorMap creates a mapping from selectors to ObjC method declarations -// and ObjC message expressions. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_SELECTORMAP_H -#define LLVM_CLANG_INDEX_SELECTORMAP_H - -#include "clang/Index/ASTLocation.h" -#include "clang/Index/STLExtras.h" -#include "clang/Basic/IdentifierTable.h" -#include - -namespace clang { - class ASTContext; - class ObjCMethodDecl; - -namespace idx { - -/// \brief Maps NamedDecls with the ASTLocations that reference them. -/// -/// References are mapped and retrieved using the canonical decls. -class SelectorMap { -public: - explicit SelectorMap(ASTContext &Ctx); - - typedef std::multimap SelMethMapTy; - typedef std::multimap SelRefMapTy; - - typedef pair_value_iterator method_iterator; - typedef pair_value_iterator astlocation_iterator; - - method_iterator methods_begin(Selector Sel) const; - method_iterator methods_end(Selector Sel) const; - - astlocation_iterator refs_begin(Selector Sel) const; - astlocation_iterator refs_end(Selector Sel) const; - -private: - mutable SelMethMapTy SelMethMap; - mutable SelRefMapTy SelRefMap; -}; - -} // end idx namespace - -} // end clang namespace - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Index/TranslationUnit.h b/contrib/llvm/tools/clang/include/clang/Index/TranslationUnit.h deleted file mode 100644 index ba5d48d3732..00000000000 --- a/contrib/llvm/tools/clang/include/clang/Index/TranslationUnit.h +++ /dev/null @@ -1,41 +0,0 @@ -//===--- TranslationUnit.h - Interface for a translation unit ---*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Abstract interface for a translation unit. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_TRANSLATIONUNIT_H -#define LLVM_CLANG_INDEX_TRANSLATIONUNIT_H - -namespace clang { - class ASTContext; - class DiagnosticsEngine; - class Preprocessor; - -namespace idx { - class DeclReferenceMap; - class SelectorMap; - -/// \brief Abstract interface for a translation unit. -class TranslationUnit { -public: - virtual ~TranslationUnit(); - virtual ASTContext &getASTContext() = 0; - virtual Preprocessor &getPreprocessor() = 0; - virtual DiagnosticsEngine &getDiagnostic() = 0; - virtual DeclReferenceMap &getDeclReferenceMap() = 0; - virtual SelectorMap &getSelectorMap() = 0; -}; - -} // namespace idx - -} // namespace clang - -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Parse/Parser.h b/contrib/llvm/tools/clang/include/clang/Parse/Parser.h index dff85105d6c..2a7464ff276 100644 --- a/contrib/llvm/tools/clang/include/clang/Parse/Parser.h +++ b/contrib/llvm/tools/clang/include/clang/Parse/Parser.h @@ -15,7 +15,6 @@ #define LLVM_CLANG_PARSE_PARSER_H #include "clang/Basic/Specifiers.h" -#include "clang/Basic/DelayedCleanupPool.h" #include "clang/Lex/Preprocessor.h" #include "clang/Lex/CodeCompletionHandler.h" #include "clang/Sema/Sema.h" @@ -192,9 +191,9 @@ class Parser : public CodeCompletionHandler { /// Factory object for creating AttributeList objects. AttributeFactory AttrFactory; - /// \brief Gathers and cleans up objects when parsing of a top-level - /// declaration is finished. - DelayedCleanupPool TopLevelDeclCleanupPool; + /// \brief Gathers and cleans up TemplateIdAnnotations when parsing of a + /// top-level declaration is finished. + SmallVector TemplateIds; IdentifierInfo *getSEHExceptKeyword(); @@ -568,9 +567,7 @@ private: const char *&PrevSpec, unsigned &DiagID, bool &isInvalid); - /// \brief Get the TemplateIdAnnotation from the token and put it in the - /// cleanup pool so that it gets destroyed when parsing the current top level - /// declaration is finished. + /// \brief Get the TemplateIdAnnotation from the token. TemplateIdAnnotation *takeTemplateIdAnnotation(const Token &tok); /// TentativeParsingAction - An object that is used as a kind of "tentative @@ -587,11 +584,15 @@ private: class TentativeParsingAction { Parser &P; Token PrevTok; + unsigned short PrevParenCount, PrevBracketCount, PrevBraceCount; bool isActive; public: explicit TentativeParsingAction(Parser& p) : P(p) { PrevTok = P.Tok; + PrevParenCount = P.ParenCount; + PrevBracketCount = P.BracketCount; + PrevBraceCount = P.BraceCount; P.PP.EnableBacktrackAtThisPos(); isActive = true; } @@ -604,6 +605,9 @@ private: assert(isActive && "Parsing action was finished!"); P.PP.Backtrack(); P.Tok = PrevTok; + P.ParenCount = PrevParenCount; + P.BracketCount = PrevBracketCount; + P.BraceCount = PrevBraceCount; isActive = false; } ~TentativeParsingAction() { @@ -858,7 +862,7 @@ private: /// argument (C++ [class.mem]p2). struct LateParsedMethodDeclaration : public LateParsedDeclaration { explicit LateParsedMethodDeclaration(Parser *P, Decl *M) - : Self(P), Method(M), TemplateScope(false) { } + : Self(P), Method(M), TemplateScope(false), ExceptionSpecTokens(0) { } virtual void ParseLexedMethodDeclarations(); @@ -878,6 +882,10 @@ private: /// method will be stored so that they can be reintroduced into /// scope at the appropriate times. SmallVector DefaultArgs; + + /// \brief The set of tokens that make up an exception-specification that + /// has not yet been parsed. + CachedTokens *ExceptionSpecTokens; }; /// LateParsedMemberInitializer - An initializer for a non-static class data @@ -1420,7 +1428,7 @@ private: // C++ 15: C++ Throw Expression ExprResult ParseThrowExpression(); - ExceptionSpecificationType MaybeParseExceptionSpecification( + ExceptionSpecificationType tryParseExceptionSpecification( SourceRange &SpecificationRange, SmallVectorImpl &DynamicExceptions, SmallVectorImpl &DynamicExceptionRanges, @@ -1517,42 +1525,40 @@ private: //===--------------------------------------------------------------------===// // C99 6.8: Statements and Blocks. - StmtResult ParseStatement(SourceLocation *TrailingElseLoc = NULL) { + StmtResult ParseStatement(SourceLocation *TrailingElseLoc = 0) { StmtVector Stmts(Actions); return ParseStatementOrDeclaration(Stmts, true, TrailingElseLoc); } - StmtResult ParseStatementOrDeclaration(StmtVector& Stmts, + StmtResult ParseStatementOrDeclaration(StmtVector &Stmts, bool OnlyStatement, - SourceLocation *TrailingElseLoc = NULL); - StmtResult ParseExprStatement(ParsedAttributes &Attrs); - StmtResult ParseLabeledStatement(ParsedAttributes &Attr); - StmtResult ParseCaseStatement(ParsedAttributes &Attr, - bool MissingCase = false, + SourceLocation *TrailingElseLoc = 0); + StmtResult ParseStatementOrDeclarationAfterAttributes( + StmtVector &Stmts, + bool OnlyStatement, + SourceLocation *TrailingElseLoc, + ParsedAttributesWithRange &Attrs); + StmtResult ParseExprStatement(); + StmtResult ParseLabeledStatement(ParsedAttributesWithRange &attrs); + StmtResult ParseCaseStatement(bool MissingCase = false, ExprResult Expr = ExprResult()); - StmtResult ParseDefaultStatement(ParsedAttributes &Attr); - StmtResult ParseCompoundStatement(ParsedAttributes &Attr, - bool isStmtExpr = false); - StmtResult ParseCompoundStatement(ParsedAttributes &Attr, - bool isStmtExpr, + StmtResult ParseDefaultStatement(); + StmtResult ParseCompoundStatement(bool isStmtExpr = false); + StmtResult ParseCompoundStatement(bool isStmtExpr, unsigned ScopeFlags); StmtResult ParseCompoundStatementBody(bool isStmtExpr = false); bool ParseParenExprOrCondition(ExprResult &ExprResult, Decl *&DeclResult, SourceLocation Loc, bool ConvertToBoolean); - StmtResult ParseIfStatement(ParsedAttributes &Attr, - SourceLocation *TrailingElseLoc); - StmtResult ParseSwitchStatement(ParsedAttributes &Attr, - SourceLocation *TrailingElseLoc); - StmtResult ParseWhileStatement(ParsedAttributes &Attr, - SourceLocation *TrailingElseLoc); - StmtResult ParseDoStatement(ParsedAttributes &Attr); - StmtResult ParseForStatement(ParsedAttributes &Attr, - SourceLocation *TrailingElseLoc); - StmtResult ParseGotoStatement(ParsedAttributes &Attr); - StmtResult ParseContinueStatement(ParsedAttributes &Attr); - StmtResult ParseBreakStatement(ParsedAttributes &Attr); - StmtResult ParseReturnStatement(ParsedAttributes &Attr); + StmtResult ParseIfStatement(SourceLocation *TrailingElseLoc); + StmtResult ParseSwitchStatement(SourceLocation *TrailingElseLoc); + StmtResult ParseWhileStatement(SourceLocation *TrailingElseLoc); + StmtResult ParseDoStatement(); + StmtResult ParseForStatement(SourceLocation *TrailingElseLoc); + StmtResult ParseGotoStatement(); + StmtResult ParseContinueStatement(); + StmtResult ParseBreakStatement(); + StmtResult ParseReturnStatement(); StmtResult ParseAsmStatement(bool &msAsm); StmtResult ParseMicrosoftAsmStatement(SourceLocation AsmLoc); @@ -1586,7 +1592,7 @@ private: /// \brief The behavior of this __if_exists or __if_not_exists block /// should. IfExistsBehavior Behavior; -}; + }; bool ParseMicrosoftIfExistsCondition(IfExistsCondition& Result); void ParseMicrosoftIfExistsStatement(StmtVector &Stmts); @@ -1602,14 +1608,14 @@ private: //===--------------------------------------------------------------------===// // C++ 6: Statements and Blocks - StmtResult ParseCXXTryBlock(ParsedAttributes &Attr); + StmtResult ParseCXXTryBlock(); StmtResult ParseCXXTryBlockCommon(SourceLocation TryLoc); StmtResult ParseCXXCatchBlock(); //===--------------------------------------------------------------------===// // MS: SEH Statements and Blocks - StmtResult ParseSEHTryBlock(ParsedAttributes &Attr); + StmtResult ParseSEHTryBlock(); StmtResult ParseSEHTryBlockCommon(SourceLocation Loc); StmtResult ParseSEHExceptBlock(SourceLocation Loc); StmtResult ParseSEHFinallyBlock(SourceLocation Loc); @@ -1883,6 +1889,7 @@ private: void ProhibitAttributes(ParsedAttributesWithRange &attrs) { if (!attrs.Range.isValid()) return; DiagnoseProhibitedAttributes(attrs); + attrs.clear(); } void DiagnoseProhibitedAttributes(ParsedAttributesWithRange &attrs); @@ -1967,7 +1974,7 @@ private: void ParseTypeofSpecifier(DeclSpec &DS); SourceLocation ParseDecltypeSpecifier(DeclSpec &DS); - void AnnotateExistingDecltypeSpecifier(const DeclSpec &DS, + void AnnotateExistingDecltypeSpecifier(const DeclSpec &DS, SourceLocation StartLoc, SourceLocation EndLoc); void ParseUnderlyingTypeSpecifier(DeclSpec &DS); @@ -2106,8 +2113,8 @@ private: ParsingDeclRAIIObject *DiagsFromTParams = 0); void ParseConstructorInitializer(Decl *ConstructorDecl); MemInitResult ParseMemInitializer(Decl *ConstructorDecl); - void HandleMemberFunctionDefaultArgs(Declarator& DeclaratorInfo, - Decl *ThisDecl); + void HandleMemberFunctionDeclDelays(Declarator& DeclaratorInfo, + Decl *ThisDecl); //===--------------------------------------------------------------------===// // C++ 10: Derived classes [class.derived] diff --git a/contrib/llvm/tools/clang/include/clang/Sema/Initialization.h b/contrib/llvm/tools/clang/include/clang/Sema/Initialization.h index 4433843ff86..0dd68875a9e 100644 --- a/contrib/llvm/tools/clang/include/clang/Sema/Initialization.h +++ b/contrib/llvm/tools/clang/include/clang/Sema/Initialization.h @@ -225,7 +225,9 @@ public: /// \brief Create the initialization entity for a temporary. static InitializedEntity InitializeTemporary(QualType Type) { - return InitializedEntity(EK_Temporary, SourceLocation(), Type); + InitializedEntity Result(EK_Temporary, SourceLocation(), Type); + Result.TypeInfo = 0; + return Result; } /// \brief Create the initialization entity for a temporary. diff --git a/contrib/llvm/tools/clang/include/clang/Sema/ParsedTemplate.h b/contrib/llvm/tools/clang/include/clang/Sema/ParsedTemplate.h index 3ff045954be..c1b471014b7 100644 --- a/contrib/llvm/tools/clang/include/clang/Sema/ParsedTemplate.h +++ b/contrib/llvm/tools/clang/include/clang/Sema/ParsedTemplate.h @@ -178,8 +178,11 @@ namespace clang { ParsedTemplateArgument *getTemplateArgs() { return reinterpret_cast(this + 1); } - - static TemplateIdAnnotation* Allocate(unsigned NumArgs) { + + /// \brief Creates a new TemplateIdAnnotation with NumArgs arguments and + /// appends it to List. + static TemplateIdAnnotation * + Allocate(unsigned NumArgs, SmallVectorImpl &List) { TemplateIdAnnotation *TemplateId = (TemplateIdAnnotation *)std::malloc(sizeof(TemplateIdAnnotation) + sizeof(ParsedTemplateArgument) * NumArgs); @@ -193,6 +196,7 @@ namespace clang { for (unsigned I = 0; I != NumArgs; ++I) new (TemplateArgs + I) ParsedTemplateArgument(); + List.push_back(TemplateId); return TemplateId; } diff --git a/contrib/llvm/tools/clang/include/clang/Sema/Scope.h b/contrib/llvm/tools/clang/include/clang/Sema/Scope.h index e9aa173cb9c..48f54179ec4 100644 --- a/contrib/llvm/tools/clang/include/clang/Sema/Scope.h +++ b/contrib/llvm/tools/clang/include/clang/Sema/Scope.h @@ -81,13 +81,8 @@ public: /// SwitchScope - This is a scope that corresponds to a switch statement. SwitchScope = 0x800, - /// ThisScope - This is the scope of a struct/union/class definition, - /// outside of any member function definition, where 'this' is nonetheless - /// usable. - ThisScope = 0x1000, - /// TryScope - This is the scope of a C++ try statement. - TryScope = 0x2000 + TryScope = 0x1000 }; private: /// The parent scope for this scope. This is null for the translation-unit diff --git a/contrib/llvm/tools/clang/include/clang/Sema/Sema.h b/contrib/llvm/tools/clang/include/clang/Sema/Sema.h index 31c410a9f90..c8767b6f960 100644 --- a/contrib/llvm/tools/clang/include/clang/Sema/Sema.h +++ b/contrib/llvm/tools/clang/include/clang/Sema/Sema.h @@ -331,6 +331,11 @@ public: /// cycle detection at the end of the TU. DelegatingCtorDeclsType DelegatingCtorDecls; + /// \brief All the destructors seen during a class definition that had their + /// exception spec computation delayed because it depended on an unparsed + /// exception spec. + SmallVector DelayedDestructorExceptionSpecs; + /// \brief All the overriding destructors seen during a class definition /// (there could be multiple due to nested classes) that had their exception /// spec checks delayed, plus the overridden destructor. @@ -446,11 +451,13 @@ public: Sema &S; DeclContext *SavedContext; ProcessingContextState SavedContextState; - + QualType SavedCXXThisTypeOverride; + public: ContextRAII(Sema &S, DeclContext *ContextToPush) : S(S), SavedContext(S.CurContext), - SavedContextState(S.DelayedDiagnostics.pushContext()) + SavedContextState(S.DelayedDiagnostics.pushContext()), + SavedCXXThisTypeOverride(S.CXXThisTypeOverride) { assert(ContextToPush && "pushing null context"); S.CurContext = ContextToPush; @@ -460,6 +467,7 @@ public: if (!SavedContext) return; S.CurContext = SavedContext; S.DelayedDiagnostics.popContext(SavedContextState); + S.CXXThisTypeOverride = SavedCXXThisTypeOverride; SavedContext = 0; } @@ -646,27 +654,23 @@ public: /// A stack of expression evaluation contexts. SmallVector ExprEvalContexts; - + /// SpecialMemberOverloadResult - The overloading result for a special member /// function. /// - /// This is basically a wrapper around PointerIntPair. The lowest bit of the - /// integer is used to determine whether we have a parameter qualification - /// match, the second-lowest is whether we had success in resolving the - /// overload to a unique non-deleted function. - /// - /// The ConstParamMatch bit represents whether, when looking up a copy - /// constructor or assignment operator, we found a potential copy - /// constructor/assignment operator whose first parameter is const-qualified. - /// This is used for determining parameter types of other objects and is - /// utterly meaningless on other types of special members. + /// This is basically a wrapper around PointerIntPair. The lowest bits of the + /// integer are used to determine whether overload resolution succeeded, and + /// whether, when looking up a copy constructor or assignment operator, we + /// found a potential copy constructor/assignment operator whose first + /// parameter is const-qualified. This is used for determining parameter types + /// of other objects and is utterly meaningless on other types of special + /// members. class SpecialMemberOverloadResult : public llvm::FastFoldingSetNode { public: enum Kind { NoMemberOrDeleted, Ambiguous, - SuccessNonConst, - SuccessConst + Success }; private: @@ -682,9 +686,6 @@ public: Kind getKind() const { return static_cast(Pair.getInt()); } void setKind(Kind K) { Pair.setInt(K); } - - bool hasSuccess() const { return getKind() >= SuccessNonConst; } - bool hasConstParamMatch() const { return getKind() == SuccessConst; } }; /// \brief A cache of special member function overload resolution results @@ -898,11 +899,15 @@ public: TypeSourceInfo *GetTypeForDeclaratorCast(Declarator &D, QualType FromTy); TypeSourceInfo *GetTypeSourceInfoForDeclarator(Declarator &D, QualType T, TypeSourceInfo *ReturnTypeInfo); + /// \brief Package the given type and TSI into a ParsedType. ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo); DeclarationNameInfo GetNameForDeclarator(Declarator &D); DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name); static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo = 0); + CanThrowResult canThrow(const Expr *E); + const FunctionProtoType *ResolveExceptionSpec(SourceLocation Loc, + const FunctionProtoType *FPT); bool CheckSpecifiedExceptionType(QualType T, const SourceRange &Range); bool CheckDistantExceptionSpec(QualType T); bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New); @@ -1902,11 +1907,9 @@ public: DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class); CXXConstructorDecl *LookupDefaultConstructor(CXXRecordDecl *Class); CXXConstructorDecl *LookupCopyingConstructor(CXXRecordDecl *Class, - unsigned Quals, - bool *ConstParam = 0); + unsigned Quals); CXXMethodDecl *LookupCopyingAssignment(CXXRecordDecl *Class, unsigned Quals, - bool RValueThis, unsigned ThisQuals, - bool *ConstParam = 0); + bool RValueThis, unsigned ThisQuals); CXXConstructorDecl *LookupMovingConstructor(CXXRecordDecl *Class); CXXMethodDecl *LookupMovingAssignment(CXXRecordDecl *Class, bool RValueThis, unsigned ThisQuals); @@ -1974,6 +1977,10 @@ public: bool CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC); bool CheckNoReturnAttr(const AttributeList &attr); + /// \brief Stmt attributes - this routine is the top level dispatcher. + StmtResult ProcessStmtAttributes(Stmt *Stmt, AttributeList *Attrs, + SourceRange Range); + void WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method, bool &IncompleteImpl, unsigned DiagID); void WarnConflictingTypedMethods(ObjCMethodDecl *Method, @@ -2251,6 +2258,9 @@ public: StmtResult ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl, SourceLocation ColonLoc, Stmt *SubStmt); + StmtResult ActOnAttributedStmt(SourceLocation AttrLoc, const AttrVec &Attrs, + Stmt *SubStmt); + StmtResult ActOnIfStmt(SourceLocation IfLoc, FullExprArg CondVal, Decl *CondVar, Stmt *ThenVal, @@ -3039,7 +3049,7 @@ public: /// implicitly-declared special member functions. class ImplicitExceptionSpecification { // Pointer to allow copying - ASTContext *Context; + Sema *Self; // We order exception specifications thus: // noexcept is the most restrictive, but is only used in C++0x. // throw() comes next. @@ -3063,9 +3073,9 @@ public: } public: - explicit ImplicitExceptionSpecification(ASTContext &Context) - : Context(&Context), ComputedEST(EST_BasicNoexcept) { - if (!Context.getLangOpts().CPlusPlus0x) + explicit ImplicitExceptionSpecification(Sema &Self) + : Self(&Self), ComputedEST(EST_BasicNoexcept) { + if (!Self.Context.getLangOpts().CPlusPlus0x) ComputedEST = EST_DynamicNone; } @@ -3083,7 +3093,7 @@ public: const QualType *data() const { return Exceptions.data(); } /// \brief Integrate another called method into the collected data. - void CalledDecl(CXXMethodDecl *Method); + void CalledDecl(SourceLocation CallLoc, CXXMethodDecl *Method); /// \brief Integrate an invoked expression into the collected data. void CalledExpr(Expr *E); @@ -3135,6 +3145,15 @@ public: ImplicitExceptionSpecification ComputeDefaultedDtorExceptionSpec(CXXRecordDecl *ClassDecl); + /// \brief Check the given exception-specification and update the + /// extended prototype information with the results. + void checkExceptionSpecification(ExceptionSpecificationType EST, + ArrayRef DynamicExceptions, + ArrayRef DynamicExceptionRanges, + Expr *NoexceptExpr, + llvm::SmallVectorImpl &Exceptions, + FunctionProtoType::ExtProtoInfo &EPI); + /// \brief Determine if a special member function should have a deleted /// definition when it is defaulted. bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMember CSM, @@ -3172,7 +3191,8 @@ public: /// C++11 says that user-defined destructors with no exception spec get one /// that looks as if the destructor was implicitly declared. void AdjustDestructorExceptionSpec(CXXRecordDecl *ClassDecl, - CXXDestructorDecl *Destructor); + CXXDestructorDecl *Destructor, + bool WasDelayed = false); /// \brief Declare all inherited constructors for the given class. /// @@ -3240,6 +3260,22 @@ public: /// special member function. bool isImplicitlyDeleted(FunctionDecl *FD); + /// \brief Check whether 'this' shows up in the type of a static member + /// function after the (naturally empty) cv-qualifier-seq would be. + /// + /// \returns true if an error occurred. + bool checkThisInStaticMemberFunctionType(CXXMethodDecl *Method); + + /// \brief Whether this' shows up in the exception specification of a static + /// member function. + bool checkThisInStaticMemberFunctionExceptionSpec(CXXMethodDecl *Method); + + /// \brief Check whether 'this' shows up in the attributes of the given + /// static member function. + /// + /// \returns true if an error occurred. + bool checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method); + /// MaybeBindToTemporary - If the passed in expression has a record type with /// a non-trivial destructor, this will return CXXBindTemporaryExpr. Otherwise /// it simply returns the passed in expression. @@ -3321,6 +3357,29 @@ public: /// \returns The type of 'this', if possible. Otherwise, returns a NULL type. QualType getCurrentThisType(); + /// \brief When non-NULL, the C++ 'this' expression is allowed despite the + /// current context not being a non-static member function. In such cases, + /// this provides the type used for 'this'. + QualType CXXThisTypeOverride; + + /// \brief RAII object used to temporarily allow the C++ 'this' expression + /// to be used, with the given qualifiers on the current class type. + class CXXThisScopeRAII { + Sema &S; + QualType OldCXXThisTypeOverride; + bool Enabled; + + public: + /// \brief Introduce a new scope where 'this' may be allowed (when enabled), + /// using the given declaration (which is either a class template or a + /// class) along with the given qualifiers. + /// along with the qualifiers placed on '*this'. + CXXThisScopeRAII(Sema &S, Decl *ContextDecl, unsigned CXXThisTypeQuals, + bool Enabled = true); + + ~CXXThisScopeRAII(); + }; + /// \brief Make sure the value of 'this' is actually available in the current /// context, if it is a potentially evaluated context. /// @@ -3330,6 +3389,11 @@ public: /// capture list. void CheckCXXThisCapture(SourceLocation Loc, bool Explicit = false); + /// \brief Determine whether the given type is the type of *this that is used + /// outside of the body of a member function for a type that is currently + /// being defined. + bool isThisOutsideMemberFunctionBody(QualType BaseType); + /// ActOnCXXBoolLiteral - Parse {true,false} literals. ExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind); @@ -3966,6 +4030,7 @@ public: SourceLocation LBrac, SourceLocation RBrac, AttributeList *AttrList); + void ActOnFinishCXXMemberDecls(); void ActOnReenterTemplateScope(Scope *S, Decl *Template); void ActOnReenterDeclaratorTemplateScope(Scope *S, DeclaratorDecl *D); @@ -5120,7 +5185,11 @@ public: /// We are checking the validity of a default template argument that /// has been used when naming a template-id. - DefaultTemplateArgumentChecking + DefaultTemplateArgumentChecking, + + /// We are instantiating the exception specification for a function + /// template which was deferred until it was needed. + ExceptionSpecInstantiation } Kind; /// \brief The point of instantiation within the source code. @@ -5168,6 +5237,7 @@ public: switch (X.Kind) { case TemplateInstantiation: + case ExceptionSpecInstantiation: return true; case PriorTemplateArgumentSubstitution: @@ -5285,6 +5355,13 @@ public: Decl *Entity, SourceRange InstantiationRange = SourceRange()); + struct ExceptionSpecification {}; + /// \brief Note that we are instantiating an exception specification + /// of a function template. + InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, + FunctionDecl *Entity, ExceptionSpecification, + SourceRange InstantiationRange = SourceRange()); + /// \brief Note that we are instantiating a default argument in a /// template-id. InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, @@ -5474,7 +5551,9 @@ public: TypeSourceInfo *SubstFunctionDeclType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, - DeclarationName Entity); + DeclarationName Entity, + CXXRecordDecl *ThisContext, + unsigned ThisTypeQuals); ParmVarDecl *SubstParmVarDecl(ParmVarDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, int indexAdjustment, @@ -5582,6 +5661,8 @@ public: TemplateArgumentListInfo &Result, const MultiLevelTemplateArgumentList &TemplateArgs); + void InstantiateExceptionSpec(SourceLocation PointOfInstantiation, + FunctionDecl *Function); void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive = false, @@ -6463,11 +6544,11 @@ public: /// and reports the appropriate diagnostics. Returns false on success. /// Can optionally return the value of the expression. ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, - PartialDiagnostic Diag, + const PartialDiagnostic &Diag, bool AllowFold, - PartialDiagnostic FoldDiag); + const PartialDiagnostic &FoldDiag); ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, - PartialDiagnostic Diag, + const PartialDiagnostic &Diag, bool AllowFold = true) { return VerifyIntegerConstantExpression(E, Result, Diag, AllowFold, PDiag(0)); diff --git a/contrib/llvm/tools/clang/include/clang/Serialization/ASTBitCodes.h b/contrib/llvm/tools/clang/include/clang/Serialization/ASTBitCodes.h index 4591630357d..f9bb8928a36 100644 --- a/contrib/llvm/tools/clang/include/clang/Serialization/ASTBitCodes.h +++ b/contrib/llvm/tools/clang/include/clang/Serialization/ASTBitCodes.h @@ -964,6 +964,8 @@ namespace clang { STMT_DEFAULT, /// \brief A LabelStmt record. STMT_LABEL, + /// \brief An AttributedStmt record. + STMT_ATTRIBUTED, /// \brief An IfStmt record. STMT_IF, /// \brief A SwitchStmt record. diff --git a/contrib/llvm/tools/clang/include/clang/Serialization/ASTReader.h b/contrib/llvm/tools/clang/include/clang/Serialization/ASTReader.h index 9baaf4bcb52..a9d0fc3f1e8 100644 --- a/contrib/llvm/tools/clang/include/clang/Serialization/ASTReader.h +++ b/contrib/llvm/tools/clang/include/clang/Serialization/ASTReader.h @@ -170,6 +170,9 @@ class ReadMethodPoolVisitor; namespace reader { class ASTIdentifierLookupTrait; + /// \brief The on-disk hash table used for the DeclContext's Name lookup table. + typedef OnDiskChainedHashTable + ASTDeclContextNameLookupTable; } } // end namespace serialization @@ -323,7 +326,9 @@ private: // TU, and when we read those update records, the actual context will not // be available yet (unless it's the TU), so have this pending map using the // ID as a key. It will be realized when the context is actually loaded. - typedef SmallVector, 1> DeclContextVisibleUpdates; + typedef + SmallVector, 1> DeclContextVisibleUpdates; typedef llvm::DenseMap DeclContextVisibleUpdatesPending; @@ -1467,7 +1472,7 @@ public: llvm::DenseMap::iterator Pos); /// \brief Load all external visible decls in the given DeclContext. - void completeVisibleDeclsMap(DeclContext *DC); + void completeVisibleDeclsMap(const DeclContext *DC); /// \brief Retrieve the AST context that this AST reader supplements. ASTContext &getContext() { return Context; } diff --git a/contrib/llvm/tools/clang/include/clang/Serialization/ASTWriter.h b/contrib/llvm/tools/clang/include/clang/Serialization/ASTWriter.h index 4c62385cf2c..e693f17593f 100644 --- a/contrib/llvm/tools/clang/include/clang/Serialization/ASTWriter.h +++ b/contrib/llvm/tools/clang/include/clang/Serialization/ASTWriter.h @@ -76,6 +76,7 @@ public: typedef SmallVectorImpl RecordDataImpl; friend class ASTDeclWriter; + friend class ASTStmtWriter; private: /// \brief Map that provides the ID numbers of each type within the /// output stream, plus those deserialized from a chained PCH. diff --git a/contrib/llvm/tools/clang/include/clang/Serialization/Module.h b/contrib/llvm/tools/clang/include/clang/Serialization/Module.h index 4c93c33842c..786ecd33c1d 100644 --- a/contrib/llvm/tools/clang/include/clang/Serialization/Module.h +++ b/contrib/llvm/tools/clang/include/clang/Serialization/Module.h @@ -27,9 +27,14 @@ namespace clang { class DeclContext; class Module; - +template class OnDiskChainedHashTable; + namespace serialization { +namespace reader { + class ASTDeclContextNameLookupTrait; +} + /// \brief Specifies the kind of module that has been loaded. enum ModuleKind { MK_Module, ///< File is a module proper. @@ -43,7 +48,8 @@ struct DeclContextInfo { DeclContextInfo() : NameLookupTableData(), LexicalDecls(), NumLexicalDecls() {} - void *NameLookupTableData; // an ASTDeclContextNameLookupTable. + OnDiskChainedHashTable + *NameLookupTableData; // an ASTDeclContextNameLookupTable. const KindDeclIDPair *LexicalDecls; unsigned NumLexicalDecls; }; diff --git a/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h b/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h index 3cbecf7d6ef..d01644ba0eb 100644 --- a/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h +++ b/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h @@ -22,11 +22,6 @@ namespace clang { -namespace idx { - class Indexer; - class TranslationUnit; -} - namespace ento { class CheckerManager; @@ -46,11 +41,6 @@ class AnalysisManager : public BugReporterData { CheckerManager *CheckerMgr; - /// \brief Provide function definitions in other translation units. This is - /// NULL if we don't have multiple translation units. AnalysisManager does - /// not own the Indexer. - idx::Indexer *Idxer; - enum AnalysisScope { ScopeTU, ScopeDecl } AScope; /// \brief The maximum number of exploded nodes the analyzer will generate. @@ -99,7 +89,6 @@ public: StoreManagerCreator storemgr, ConstraintManagerCreator constraintmgr, CheckerManager *checkerMgr, - idx::Indexer *idxer, unsigned maxnodes, unsigned maxvisit, bool vizdot, bool vizubi, AnalysisPurgeMode purge, bool eager, bool trim, @@ -137,8 +126,6 @@ public: CheckerManager *getCheckerManager() const { return CheckerMgr; } - idx::Indexer *getIndexer() const { return Idxer; } - virtual ASTContext &getASTContext() { return Ctx; } @@ -186,10 +173,6 @@ public: bool shouldInlineCall() const { return (IPAMode == Inlining); } - bool hasIndexer() const { return Idxer != 0; } - - AnalysisDeclContext *getAnalysisDeclContextInAnotherTU(const Decl *D); - CFG *getCFG(Decl const *D) { return AnaCtxMgr.getContext(D)->getCFG(); } diff --git a/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h b/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h index ed01db25ef2..ce3eb1db836 100644 --- a/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h +++ b/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h @@ -425,10 +425,12 @@ class MemRegionVal : public Loc { public: explicit MemRegionVal(const MemRegion* r) : Loc(MemRegionKind, r) {} + /// \brief Get the underlining region. const MemRegion* getRegion() const { return static_cast(Data); } + /// \brief Get the underlining region and strip casts. const MemRegion* stripCasts() const; template diff --git a/contrib/llvm/tools/clang/include/clang/Tooling/CompilationDatabase.h b/contrib/llvm/tools/clang/include/clang/Tooling/CompilationDatabase.h index 3430320b511..625c8eced4b 100644 --- a/contrib/llvm/tools/clang/include/clang/Tooling/CompilationDatabase.h +++ b/contrib/llvm/tools/clang/include/clang/Tooling/CompilationDatabase.h @@ -33,22 +33,21 @@ #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/Twine.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/SourceMgr.h" +#include "llvm/Support/YAMLParser.h" #include #include -namespace llvm { -class MemoryBuffer; -} // end namespace llvm - namespace clang { namespace tooling { /// \brief Specifies the working directory and command of a compilation. struct CompileCommand { CompileCommand() {} - CompileCommand(StringRef Directory, ArrayRef CommandLine) - : Directory(Directory), CommandLine(CommandLine) {} + CompileCommand(Twine Directory, ArrayRef CommandLine) + : Directory(Directory.str()), CommandLine(CommandLine) {} /// \brief The working directory the command was executed from. std::string Directory; @@ -95,6 +94,59 @@ public: StringRef FilePath) const = 0; }; +/// \brief A compilation database that returns a single compile command line. +/// +/// Useful when we want a tool to behave more like a compiler invocation. +class FixedCompilationDatabase : public CompilationDatabase { +public: + /// \brief Creates a FixedCompilationDatabase from the arguments after "--". + /// + /// Parses the given command line for "--". If "--" is found, the rest of + /// the arguments will make up the command line in the returned + /// FixedCompilationDatabase. + /// The arguments after "--" must not include positional parameters or the + /// argv[0] of the tool. Those will be added by the FixedCompilationDatabase + /// when a CompileCommand is requested. The argv[0] of the returned command + /// line will be "clang-tool". + /// + /// Returns NULL in case "--" is not found. + /// + /// The argument list is meant to be compatible with normal llvm command line + /// parsing in main methods. + /// int main(int argc, char **argv) { + /// llvm::OwningPtr Compilations( + /// FixedCompilationDatabase::loadFromCommandLine(argc, argv)); + /// cl::ParseCommandLineOptions(argc, argv); + /// ... + /// } + /// + /// \param Argc The number of command line arguments - will be changed to + /// the number of arguments before "--", if "--" was found in the argument + /// list. + /// \param Argv Points to the command line arguments. + /// \param Directory The base directory used in the FixedCompilationDatabase. + static FixedCompilationDatabase *loadFromCommandLine(int &Argc, + const char **Argv, + Twine Directory = "."); + + /// \brief Constructs a compilation data base from a specified directory + /// and command line. + FixedCompilationDatabase(Twine Directory, ArrayRef CommandLine); + + /// \brief Returns the given compile command. + /// + /// Will always return a vector with one entry that contains the directory + /// and command line specified at construction with "clang-tool" as argv[0] + /// and 'FilePath' as positional argument. + virtual std::vector getCompileCommands( + StringRef FilePath) const; + +private: + /// This is built up to contain a single entry vector to be returned from + /// getCompileCommands after adding the positional argument. + std::vector CompileCommands; +}; + /// \brief A JSON based compilation database. /// /// JSON compilation database files must contain a list of JSON objects which @@ -114,7 +166,6 @@ public: /// by setting the flag -DCMAKE_EXPORT_COMPILE_COMMANDS. class JSONCompilationDatabase : public CompilationDatabase { public: - /// \brief Loads a JSON compilation database from the specified file. /// /// Returns NULL and sets ErrorMessage if the database could not be @@ -139,7 +190,7 @@ public: private: /// \brief Constructs a JSON compilation database on a memory buffer. JSONCompilationDatabase(llvm::MemoryBuffer *Database) - : Database(Database) {} + : Database(Database), YAMLStream(Database->getBuffer(), SM) {} /// \brief Parses the database file and creates the index. /// @@ -147,14 +198,17 @@ private: /// failed. bool parse(std::string &ErrorMessage); - // Tuple (directory, commandline) where 'commandline' is a JSON escaped bash - // escaped command line. - typedef std::pair CompileCommandRef; + // Tuple (directory, commandline) where 'commandline' pointing to the + // corresponding nodes in the YAML stream. + typedef std::pair CompileCommandRef; // Maps file paths to the compile command lines for that file. llvm::StringMap< std::vector > IndexByFile; llvm::OwningPtr Database; + llvm::SourceMgr SM; + llvm::yaml::Stream YAMLStream; }; } // end namespace tooling diff --git a/contrib/llvm/tools/clang/lib/AST/ASTContext.cpp b/contrib/llvm/tools/clang/lib/AST/ASTContext.cpp index acf5e0bbc9a..cb4d336de15 100644 --- a/contrib/llvm/tools/clang/lib/AST/ASTContext.cpp +++ b/contrib/llvm/tools/clang/lib/AST/ASTContext.cpp @@ -481,7 +481,8 @@ void ASTContext::InitBuiltinTypes(const TargetInfo &Target) { InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel); // Builtin type for __objc_yes and __objc_no - ObjCBuiltinBoolTy = SignedCharTy; + ObjCBuiltinBoolTy = (Target.useSignedCharForObjCBool() ? + SignedCharTy : BoolTy); ObjCConstantStringType = QualType(); @@ -2193,6 +2194,8 @@ ASTContext::getFunctionType(QualType ResultTy, Size += EPI.NumExceptions * sizeof(QualType); else if (EPI.ExceptionSpecType == EST_ComputedNoexcept) { Size += sizeof(Expr*); + } else if (EPI.ExceptionSpecType == EST_Uninstantiated) { + Size += 2 * sizeof(FunctionDecl*); } if (EPI.ConsumedArguments) Size += NumArgs * sizeof(bool); diff --git a/contrib/llvm/tools/clang/lib/AST/Decl.cpp b/contrib/llvm/tools/clang/lib/AST/Decl.cpp index 399f2e48abe..53032bc64d6 100644 --- a/contrib/llvm/tools/clang/lib/AST/Decl.cpp +++ b/contrib/llvm/tools/clang/lib/AST/Decl.cpp @@ -69,33 +69,25 @@ typedef NamedDecl::LinkageInfo LinkageInfo; namespace { /// Flags controlling the computation of linkage and visibility. struct LVFlags { - bool ConsiderGlobalVisibility; - bool ConsiderVisibilityAttributes; - bool ConsiderTemplateParameterTypes; + const bool ConsiderGlobalVisibility; + const bool ConsiderVisibilityAttributes; + const bool ConsiderTemplateParameterTypes; LVFlags() : ConsiderGlobalVisibility(true), ConsiderVisibilityAttributes(true), ConsiderTemplateParameterTypes(true) { } + LVFlags(bool Global, bool Attributes, bool Parameters) : + ConsiderGlobalVisibility(Global), + ConsiderVisibilityAttributes(Attributes), + ConsiderTemplateParameterTypes(Parameters) { + } + /// \brief Returns a set of flags that is only useful for computing the /// linkage, not the visibility, of a declaration. static LVFlags CreateOnlyDeclLinkage() { - LVFlags F; - F.ConsiderGlobalVisibility = false; - F.ConsiderVisibilityAttributes = false; - F.ConsiderTemplateParameterTypes = false; - return F; - } - - /// Returns a set of flags, otherwise based on these, which ignores - /// off all sources of visibility except template arguments. - LVFlags onlyTemplateVisibility() const { - LVFlags F = *this; - F.ConsiderGlobalVisibility = false; - F.ConsiderVisibilityAttributes = false; - F.ConsiderTemplateParameterTypes = false; - return F; + return LVFlags(false, false, false); } }; } // end anonymous namespace @@ -284,7 +276,6 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) { if (F.ConsiderVisibilityAttributes) { if (llvm::Optional Vis = D->getExplicitVisibility()) { LV.setVisibility(*Vis, true); - F.ConsiderGlobalVisibility = false; } else { // If we're declared in a namespace with a visibility attribute, // use that namespace's visibility, but don't call it explicit. @@ -295,7 +286,6 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) { if (!ND) continue; if (llvm::Optional Vis = ND->getExplicitVisibility()) { LV.setVisibility(*Vis, true); - F.ConsiderGlobalVisibility = false; break; } } @@ -335,8 +325,7 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) { LinkageInfo TypeLV = getLVForType(Var->getType()); if (TypeLV.linkage() != ExternalLinkage) return LinkageInfo::uniqueExternal(); - LV.mergeVisibilityWithMin(TypeLV.visibility(), - TypeLV.visibilityExplicit()); + LV.mergeVisibilityWithMin(TypeLV); } if (Var->getStorageClass() == SC_PrivateExtern) @@ -412,7 +401,7 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) { = Function->getTemplateSpecializationInfo()) { if (shouldConsiderTemplateLV(Function, specInfo)) { LV.merge(getLVForDecl(specInfo->getTemplate(), - F.onlyTemplateVisibility())); + LVFlags::CreateOnlyDeclLinkage())); const TemplateArgumentList &templateArgs = *specInfo->TemplateArguments; LV.mergeWithMin(getLVForTemplateArgumentList(templateArgs, F)); } @@ -436,7 +425,7 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) { if (shouldConsiderTemplateLV(spec)) { // From the template. LV.merge(getLVForDecl(spec->getSpecializedTemplate(), - F.onlyTemplateVisibility())); + LVFlags::CreateOnlyDeclLinkage())); // The arguments at which the template was instantiated. const TemplateArgumentList &TemplateArgs = spec->getTemplateArgs(); @@ -444,12 +433,6 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) { } } - // Consider -fvisibility unless the type has C linkage. - if (F.ConsiderGlobalVisibility) - F.ConsiderGlobalVisibility = - (Context.getLangOpts().CPlusPlus && - !Tag->getDeclContext()->isExternCContext()); - // - an enumerator belonging to an enumeration with external linkage; } else if (isa(D)) { LinkageInfo EnumLV = getLVForDecl(cast(D->getDeclContext()), F); @@ -501,22 +484,47 @@ static LinkageInfo getLVForClassMember(const NamedDecl *D, LVFlags F) { LinkageInfo LV; LV.mergeVisibility(D->getASTContext().getLangOpts().getVisibilityMode()); - // The flags we're going to use to compute the class's visibility. - LVFlags ClassF = F; - + bool DHasExplicitVisibility = false; // If we have an explicit visibility attribute, merge that in. if (F.ConsiderVisibilityAttributes) { if (llvm::Optional Vis = D->getExplicitVisibility()) { LV.mergeVisibility(*Vis, true); - // Ignore global visibility later, but not this attribute. - F.ConsiderGlobalVisibility = false; - - // Ignore both global visibility and attributes when computing our - // parent's visibility. - ClassF = F.onlyTemplateVisibility(); + DHasExplicitVisibility = true; } } + // Ignore both global visibility and attributes when computing our + // parent's visibility if we already have an explicit one. + LVFlags ClassF = DHasExplicitVisibility ? + LVFlags::CreateOnlyDeclLinkage() : F; + + // If we're paying attention to global visibility, apply + // -finline-visibility-hidden if this is an inline method. + // + // Note that we do this before merging information about + // the class visibility. + if (const CXXMethodDecl *MD = dyn_cast(D)) { + TemplateSpecializationKind TSK = TSK_Undeclared; + if (FunctionTemplateSpecializationInfo *spec + = MD->getTemplateSpecializationInfo()) { + TSK = spec->getTemplateSpecializationKind(); + } else if (MemberSpecializationInfo *MSI = + MD->getMemberSpecializationInfo()) { + TSK = MSI->getTemplateSpecializationKind(); + } + + const FunctionDecl *Def = 0; + // InlineVisibilityHidden only applies to definitions, and + // isInlined() only gives meaningful answers on definitions + // anyway. + if (TSK != TSK_ExplicitInstantiationDeclaration && + TSK != TSK_ExplicitInstantiationDefinition && + F.ConsiderGlobalVisibility && + !LV.visibilityExplicit() && + MD->getASTContext().getLangOpts().InlineVisibilityHidden && + MD->hasBody(Def) && Def->isInlined()) + LV.mergeVisibility(HiddenVisibility, true); + } // Class members only have linkage if their class has external // linkage. @@ -534,8 +542,6 @@ static LinkageInfo getLVForClassMember(const NamedDecl *D, LVFlags F) { if (MD->getType()->getLinkage() == UniqueExternalLinkage) return LinkageInfo::uniqueExternal(); - TemplateSpecializationKind TSK = TSK_Undeclared; - // If this is a method template specialization, use the linkage for // the template parameters and arguments. if (FunctionTemplateSpecializationInfo *spec @@ -547,29 +553,6 @@ static LinkageInfo getLVForClassMember(const NamedDecl *D, LVFlags F) { LV.merge(getLVForTemplateParameterList( spec->getTemplate()->getTemplateParameters())); } - - TSK = spec->getTemplateSpecializationKind(); - } else if (MemberSpecializationInfo *MSI = - MD->getMemberSpecializationInfo()) { - TSK = MSI->getTemplateSpecializationKind(); - } - - // If we're paying attention to global visibility, apply - // -finline-visibility-hidden if this is an inline method. - // - // Note that ConsiderGlobalVisibility doesn't yet have information - // about whether containing classes have visibility attributes, - // and that's intentional. - if (TSK != TSK_ExplicitInstantiationDeclaration && - TSK != TSK_ExplicitInstantiationDefinition && - F.ConsiderGlobalVisibility && - MD->getASTContext().getLangOpts().InlineVisibilityHidden) { - // InlineVisibilityHidden only applies to definitions, and - // isInlined() only gives meaningful answers on definitions - // anyway. - const FunctionDecl *Def = 0; - if (MD->hasBody(Def) && Def->isInlined()) - LV.setVisibility(HiddenVisibility); } // Note that in contrast to basically every other situation, we @@ -597,7 +580,7 @@ static LinkageInfo getLVForClassMember(const NamedDecl *D, LVFlags F) { if (TypeLV.linkage() != ExternalLinkage) LV.mergeLinkage(UniqueExternalLinkage); if (!LV.visibilityExplicit()) - LV.mergeVisibility(TypeLV.visibility(), TypeLV.visibilityExplicit()); + LV.mergeVisibility(TypeLV); } return LV; @@ -802,7 +785,7 @@ static LinkageInfo getLVForDecl(const NamedDecl *D, LVFlags Flags) { LinkageInfo LV; if (Flags.ConsiderVisibilityAttributes) { if (llvm::Optional Vis = Function->getExplicitVisibility()) - LV.setVisibility(*Vis); + LV.setVisibility(*Vis, true); } if (const FunctionDecl *Prev = Function->getPreviousDecl()) { @@ -823,10 +806,10 @@ static LinkageInfo getLVForDecl(const NamedDecl *D, LVFlags Flags) { LinkageInfo LV; if (Var->getStorageClass() == SC_PrivateExtern) - LV.setVisibility(HiddenVisibility); + LV.setVisibility(HiddenVisibility, true); else if (Flags.ConsiderVisibilityAttributes) { if (llvm::Optional Vis = Var->getExplicitVisibility()) - LV.setVisibility(*Vis); + LV.setVisibility(*Vis, true); } if (const VarDecl *Prev = Var->getPreviousDecl()) { diff --git a/contrib/llvm/tools/clang/lib/AST/Expr.cpp b/contrib/llvm/tools/clang/lib/AST/Expr.cpp index 868109e3d56..fcde5429b39 100644 --- a/contrib/llvm/tools/clang/lib/AST/Expr.cpp +++ b/contrib/llvm/tools/clang/lib/AST/Expr.cpp @@ -1590,6 +1590,16 @@ void InitListExpr::setArrayFiller(Expr *filler) { inits[i] = filler; } +bool InitListExpr::isStringLiteralInit() const { + if (getNumInits() != 1) + return false; + const ConstantArrayType *CAT = dyn_cast(getType()); + if (!CAT || !CAT->getElementType()->isIntegerType()) + return false; + const Expr *Init = getInit(0)->IgnoreParenImpCasts(); + return isa(Init) || isa(Init); +} + SourceRange InitListExpr::getSourceRange() const { if (SyntacticForm) return SyntacticForm->getSourceRange(); @@ -1986,331 +1996,6 @@ QualType Expr::findBoundMemberType(const Expr *expr) { return QualType(); } -static Expr::CanThrowResult MergeCanThrow(Expr::CanThrowResult CT1, - Expr::CanThrowResult CT2) { - // CanThrowResult constants are ordered so that the maximum is the correct - // merge result. - return CT1 > CT2 ? CT1 : CT2; -} - -static Expr::CanThrowResult CanSubExprsThrow(ASTContext &C, const Expr *CE) { - Expr *E = const_cast(CE); - Expr::CanThrowResult R = Expr::CT_Cannot; - for (Expr::child_range I = E->children(); I && R != Expr::CT_Can; ++I) { - R = MergeCanThrow(R, cast(*I)->CanThrow(C)); - } - return R; -} - -static Expr::CanThrowResult CanCalleeThrow(ASTContext &Ctx, const Expr *E, - const Decl *D, - bool NullThrows = true) { - if (!D) - return NullThrows ? Expr::CT_Can : Expr::CT_Cannot; - - // See if we can get a function type from the decl somehow. - const ValueDecl *VD = dyn_cast(D); - if (!VD) // If we have no clue what we're calling, assume the worst. - return Expr::CT_Can; - - // As an extension, we assume that __attribute__((nothrow)) functions don't - // throw. - if (isa(D) && D->hasAttr()) - return Expr::CT_Cannot; - - QualType T = VD->getType(); - const FunctionProtoType *FT; - if ((FT = T->getAs())) { - } else if (const PointerType *PT = T->getAs()) - FT = PT->getPointeeType()->getAs(); - else if (const ReferenceType *RT = T->getAs()) - FT = RT->getPointeeType()->getAs(); - else if (const MemberPointerType *MT = T->getAs()) - FT = MT->getPointeeType()->getAs(); - else if (const BlockPointerType *BT = T->getAs()) - FT = BT->getPointeeType()->getAs(); - - if (!FT) - return Expr::CT_Can; - - if (FT->getExceptionSpecType() == EST_Delayed) { - assert(isa(D) && - "only constructor exception specs can be unknown"); - Ctx.getDiagnostics().Report(E->getLocStart(), - diag::err_exception_spec_unknown) - << E->getSourceRange(); - return Expr::CT_Can; - } - - return FT->isNothrow(Ctx) ? Expr::CT_Cannot : Expr::CT_Can; -} - -static Expr::CanThrowResult CanDynamicCastThrow(const CXXDynamicCastExpr *DC) { - if (DC->isTypeDependent()) - return Expr::CT_Dependent; - - if (!DC->getTypeAsWritten()->isReferenceType()) - return Expr::CT_Cannot; - - if (DC->getSubExpr()->isTypeDependent()) - return Expr::CT_Dependent; - - return DC->getCastKind() == clang::CK_Dynamic? Expr::CT_Can : Expr::CT_Cannot; -} - -static Expr::CanThrowResult CanTypeidThrow(ASTContext &C, - const CXXTypeidExpr *DC) { - if (DC->isTypeOperand()) - return Expr::CT_Cannot; - - Expr *Op = DC->getExprOperand(); - if (Op->isTypeDependent()) - return Expr::CT_Dependent; - - const RecordType *RT = Op->getType()->getAs(); - if (!RT) - return Expr::CT_Cannot; - - if (!cast(RT->getDecl())->isPolymorphic()) - return Expr::CT_Cannot; - - if (Op->Classify(C).isPRValue()) - return Expr::CT_Cannot; - - return Expr::CT_Can; -} - -Expr::CanThrowResult Expr::CanThrow(ASTContext &C) const { - // C++ [expr.unary.noexcept]p3: - // [Can throw] if in a potentially-evaluated context the expression would - // contain: - switch (getStmtClass()) { - case CXXThrowExprClass: - // - a potentially evaluated throw-expression - return CT_Can; - - case CXXDynamicCastExprClass: { - // - a potentially evaluated dynamic_cast expression dynamic_cast(v), - // where T is a reference type, that requires a run-time check - CanThrowResult CT = CanDynamicCastThrow(cast(this)); - if (CT == CT_Can) - return CT; - return MergeCanThrow(CT, CanSubExprsThrow(C, this)); - } - - case CXXTypeidExprClass: - // - a potentially evaluated typeid expression applied to a glvalue - // expression whose type is a polymorphic class type - return CanTypeidThrow(C, cast(this)); - - // - a potentially evaluated call to a function, member function, function - // pointer, or member function pointer that does not have a non-throwing - // exception-specification - case CallExprClass: - case CXXMemberCallExprClass: - case CXXOperatorCallExprClass: - case UserDefinedLiteralClass: { - const CallExpr *CE = cast(this); - CanThrowResult CT; - if (isTypeDependent()) - CT = CT_Dependent; - else if (isa(CE->getCallee()->IgnoreParens())) - CT = CT_Cannot; - else - CT = CanCalleeThrow(C, this, CE->getCalleeDecl()); - if (CT == CT_Can) - return CT; - return MergeCanThrow(CT, CanSubExprsThrow(C, this)); - } - - case CXXConstructExprClass: - case CXXTemporaryObjectExprClass: { - CanThrowResult CT = CanCalleeThrow(C, this, - cast(this)->getConstructor()); - if (CT == CT_Can) - return CT; - return MergeCanThrow(CT, CanSubExprsThrow(C, this)); - } - - case LambdaExprClass: { - const LambdaExpr *Lambda = cast(this); - CanThrowResult CT = Expr::CT_Cannot; - for (LambdaExpr::capture_init_iterator Cap = Lambda->capture_init_begin(), - CapEnd = Lambda->capture_init_end(); - Cap != CapEnd; ++Cap) - CT = MergeCanThrow(CT, (*Cap)->CanThrow(C)); - return CT; - } - - case CXXNewExprClass: { - CanThrowResult CT; - if (isTypeDependent()) - CT = CT_Dependent; - else - CT = CanCalleeThrow(C, this, cast(this)->getOperatorNew()); - if (CT == CT_Can) - return CT; - return MergeCanThrow(CT, CanSubExprsThrow(C, this)); - } - - case CXXDeleteExprClass: { - CanThrowResult CT; - QualType DTy = cast(this)->getDestroyedType(); - if (DTy.isNull() || DTy->isDependentType()) { - CT = CT_Dependent; - } else { - CT = CanCalleeThrow(C, this, - cast(this)->getOperatorDelete()); - if (const RecordType *RT = DTy->getAs()) { - const CXXRecordDecl *RD = cast(RT->getDecl()); - CT = MergeCanThrow(CT, CanCalleeThrow(C, this, RD->getDestructor())); - } - if (CT == CT_Can) - return CT; - } - return MergeCanThrow(CT, CanSubExprsThrow(C, this)); - } - - case CXXBindTemporaryExprClass: { - // The bound temporary has to be destroyed again, which might throw. - CanThrowResult CT = CanCalleeThrow(C, this, - cast(this)->getTemporary()->getDestructor()); - if (CT == CT_Can) - return CT; - return MergeCanThrow(CT, CanSubExprsThrow(C, this)); - } - - // ObjC message sends are like function calls, but never have exception - // specs. - case ObjCMessageExprClass: - case ObjCPropertyRefExprClass: - case ObjCSubscriptRefExprClass: - return CT_Can; - - // All the ObjC literals that are implemented as calls are - // potentially throwing unless we decide to close off that - // possibility. - case ObjCArrayLiteralClass: - case ObjCDictionaryLiteralClass: - case ObjCNumericLiteralClass: - return CT_Can; - - // Many other things have subexpressions, so we have to test those. - // Some are simple: - case ConditionalOperatorClass: - case CompoundLiteralExprClass: - case CXXConstCastExprClass: - case CXXDefaultArgExprClass: - case CXXReinterpretCastExprClass: - case DesignatedInitExprClass: - case ExprWithCleanupsClass: - case ExtVectorElementExprClass: - case InitListExprClass: - case MemberExprClass: - case ObjCIsaExprClass: - case ObjCIvarRefExprClass: - case ParenExprClass: - case ParenListExprClass: - case ShuffleVectorExprClass: - case VAArgExprClass: - return CanSubExprsThrow(C, this); - - // Some might be dependent for other reasons. - case ArraySubscriptExprClass: - case BinaryOperatorClass: - case CompoundAssignOperatorClass: - case CStyleCastExprClass: - case CXXStaticCastExprClass: - case CXXFunctionalCastExprClass: - case ImplicitCastExprClass: - case MaterializeTemporaryExprClass: - case UnaryOperatorClass: { - CanThrowResult CT = isTypeDependent() ? CT_Dependent : CT_Cannot; - return MergeCanThrow(CT, CanSubExprsThrow(C, this)); - } - - // FIXME: We should handle StmtExpr, but that opens a MASSIVE can of worms. - case StmtExprClass: - return CT_Can; - - case ChooseExprClass: - if (isTypeDependent() || isValueDependent()) - return CT_Dependent; - return cast(this)->getChosenSubExpr(C)->CanThrow(C); - - case GenericSelectionExprClass: - if (cast(this)->isResultDependent()) - return CT_Dependent; - return cast(this)->getResultExpr()->CanThrow(C); - - // Some expressions are always dependent. - case CXXDependentScopeMemberExprClass: - case CXXUnresolvedConstructExprClass: - case DependentScopeDeclRefExprClass: - return CT_Dependent; - - case AtomicExprClass: - case AsTypeExprClass: - case BinaryConditionalOperatorClass: - case BlockExprClass: - case CUDAKernelCallExprClass: - case DeclRefExprClass: - case ObjCBridgedCastExprClass: - case ObjCIndirectCopyRestoreExprClass: - case ObjCProtocolExprClass: - case ObjCSelectorExprClass: - case OffsetOfExprClass: - case PackExpansionExprClass: - case PseudoObjectExprClass: - case SubstNonTypeTemplateParmExprClass: - case SubstNonTypeTemplateParmPackExprClass: - case UnaryExprOrTypeTraitExprClass: - case UnresolvedLookupExprClass: - case UnresolvedMemberExprClass: - // FIXME: Can any of the above throw? If so, when? - return CT_Cannot; - - case AddrLabelExprClass: - case ArrayTypeTraitExprClass: - case BinaryTypeTraitExprClass: - case TypeTraitExprClass: - case CXXBoolLiteralExprClass: - case CXXNoexceptExprClass: - case CXXNullPtrLiteralExprClass: - case CXXPseudoDestructorExprClass: - case CXXScalarValueInitExprClass: - case CXXThisExprClass: - case CXXUuidofExprClass: - case CharacterLiteralClass: - case ExpressionTraitExprClass: - case FloatingLiteralClass: - case GNUNullExprClass: - case ImaginaryLiteralClass: - case ImplicitValueInitExprClass: - case IntegerLiteralClass: - case ObjCEncodeExprClass: - case ObjCStringLiteralClass: - case ObjCBoolLiteralExprClass: - case OpaqueValueExprClass: - case PredefinedExprClass: - case SizeOfPackExprClass: - case StringLiteralClass: - case UnaryTypeTraitExprClass: - // These expressions can never throw. - return CT_Cannot; - -#define STMT(CLASS, PARENT) case CLASS##Class: -#define STMT_RANGE(Base, First, Last) -#define LAST_STMT_RANGE(BASE, FIRST, LAST) -#define EXPR(CLASS, PARENT) -#define ABSTRACT_STMT(STMT) -#include "clang/AST/StmtNodes.inc" - case NoStmtClass: - llvm_unreachable("Invalid class for expression"); - } - llvm_unreachable("Bogus StmtClass"); -} - Expr* Expr::IgnoreParens() { Expr* E = this; while (true) { diff --git a/contrib/llvm/tools/clang/lib/AST/ExprConstant.cpp b/contrib/llvm/tools/clang/lib/AST/ExprConstant.cpp index 01c9fe7cd84..66a88b065ce 100644 --- a/contrib/llvm/tools/clang/lib/AST/ExprConstant.cpp +++ b/contrib/llvm/tools/clang/lib/AST/ExprConstant.cpp @@ -934,6 +934,7 @@ static bool IsGlobalLValue(APValue::LValueBase B) { case Expr::ObjCStringLiteralClass: case Expr::ObjCEncodeExprClass: case Expr::CXXTypeidExprClass: + case Expr::CXXUuidofExprClass: return true; case Expr::CallExprClass: return IsStringLiteralCall(cast(E)); @@ -1491,15 +1492,19 @@ static unsigned getBaseIndex(const CXXRecordDecl *Derived, llvm_unreachable("base class missing from derived class's bases list"); } -/// Extract the value of a character from a string literal. +/// Extract the value of a character from a string literal. CharType is used to +/// determine the expected signedness of the result -- a string literal used to +/// initialize an array of 'signed char' or 'unsigned char' might contain chars +/// of the wrong signedness. static APSInt ExtractStringLiteralCharacter(EvalInfo &Info, const Expr *Lit, - uint64_t Index) { + uint64_t Index, QualType CharType) { // FIXME: Support PredefinedExpr, ObjCEncodeExpr, MakeStringConstant const StringLiteral *S = dyn_cast(Lit); assert(S && "unexpected string literal expression kind"); + assert(CharType->isIntegerType() && "unexpected character type"); APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(), - Lit->getType()->getArrayElementTypeNoTypeQual()->isUnsignedIntegerType()); + CharType->isUnsignedIntegerType()); if (Index < S->getLength()) Value = S->getCodeUnit(Index); return Value; @@ -1546,7 +1551,7 @@ static bool ExtractSubobject(EvalInfo &Info, const Expr *E, assert(I == N - 1 && "extracting subobject of character?"); assert(!O->hasLValuePath() || O->getLValuePath().empty()); Obj = APValue(ExtractStringLiteralCharacter( - Info, O->getLValueBase().get(), Index)); + Info, O->getLValueBase().get(), Index, SubType)); return true; } else if (O->getArrayInitializedElts() > Index) O = &O->getArrayInitializedElt(Index); @@ -2868,6 +2873,7 @@ public: bool VisitStringLiteral(const StringLiteral *E) { return Success(E); } bool VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { return Success(E); } bool VisitCXXTypeidExpr(const CXXTypeidExpr *E); + bool VisitCXXUuidofExpr(const CXXUuidofExpr *E); bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E); bool VisitUnaryDeref(const UnaryOperator *E); bool VisitUnaryReal(const UnaryOperator *E); @@ -2973,6 +2979,10 @@ bool LValueExprEvaluator::VisitCXXTypeidExpr(const CXXTypeidExpr *E) { return Success(E); } +bool LValueExprEvaluator::VisitCXXUuidofExpr(const CXXUuidofExpr *E) { + return Success(E); +} + bool LValueExprEvaluator::VisitMemberExpr(const MemberExpr *E) { // Handle static data members. if (const VarDecl *VD = dyn_cast(E->getMemberDecl())) { @@ -3849,8 +3859,7 @@ bool ArrayExprEvaluator::VisitInitListExpr(const InitListExpr *E) { // C++11 [dcl.init.string]p1: A char array [...] can be initialized by [...] // an appropriately-typed string literal enclosed in braces. - if (E->getNumInits() == 1 && E->getInit(0)->isGLValue() && - Info.Ctx.hasSameUnqualifiedType(E->getType(), E->getInit(0)->getType())) { + if (E->isStringLiteralInit()) { LValue LV; if (!EvaluateLValue(E->getInit(0), LV, Info)) return false; @@ -5079,14 +5088,37 @@ bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { } } + // The comparison here must be unsigned, and performed with the same + // width as the pointer. + unsigned PtrSize = Info.Ctx.getTypeSize(LHSTy); + uint64_t CompareLHS = LHSOffset.getQuantity(); + uint64_t CompareRHS = RHSOffset.getQuantity(); + assert(PtrSize <= 64 && "Unexpected pointer width"); + uint64_t Mask = ~0ULL >> (64 - PtrSize); + CompareLHS &= Mask; + CompareRHS &= Mask; + + // If there is a base and this is a relational operator, we can only + // compare pointers within the object in question; otherwise, the result + // depends on where the object is located in memory. + if (!LHSValue.Base.isNull() && E->isRelationalOp()) { + QualType BaseTy = getType(LHSValue.Base); + if (BaseTy->isIncompleteType()) + return Error(E); + CharUnits Size = Info.Ctx.getTypeSizeInChars(BaseTy); + uint64_t OffsetLimit = Size.getQuantity(); + if (CompareLHS > OffsetLimit || CompareRHS > OffsetLimit) + return Error(E); + } + switch (E->getOpcode()) { default: llvm_unreachable("missing comparison operator"); - case BO_LT: return Success(LHSOffset < RHSOffset, E); - case BO_GT: return Success(LHSOffset > RHSOffset, E); - case BO_LE: return Success(LHSOffset <= RHSOffset, E); - case BO_GE: return Success(LHSOffset >= RHSOffset, E); - case BO_EQ: return Success(LHSOffset == RHSOffset, E); - case BO_NE: return Success(LHSOffset != RHSOffset, E); + case BO_LT: return Success(CompareLHS < CompareRHS, E); + case BO_GT: return Success(CompareLHS > CompareRHS, E); + case BO_LE: return Success(CompareLHS <= CompareRHS, E); + case BO_GE: return Success(CompareLHS >= CompareRHS, E); + case BO_EQ: return Success(CompareLHS == CompareRHS, E); + case BO_NE: return Success(CompareLHS != CompareRHS, E); } } } diff --git a/contrib/llvm/tools/clang/lib/AST/ExternalASTSource.cpp b/contrib/llvm/tools/clang/lib/AST/ExternalASTSource.cpp index fd616dbc9d2..6b9fe26ccc9 100644 --- a/contrib/llvm/tools/clang/lib/AST/ExternalASTSource.cpp +++ b/contrib/llvm/tools/clang/lib/AST/ExternalASTSource.cpp @@ -49,7 +49,10 @@ ExternalASTSource::FindExternalVisibleDeclsByName(const DeclContext *DC, return DeclContext::lookup_result(); } -ExternalLoadResult +void ExternalASTSource::completeVisibleDeclsMap(const DeclContext *DC) { +} + +ExternalLoadResult ExternalASTSource::FindExternalLexicalDecls(const DeclContext *DC, bool (*isKindWeWant)(Decl::Kind), SmallVectorImpl &Result) { diff --git a/contrib/llvm/tools/clang/lib/AST/ItaniumMangle.cpp b/contrib/llvm/tools/clang/lib/AST/ItaniumMangle.cpp index d7b63545401..0d405f1f57f 100644 --- a/contrib/llvm/tools/clang/lib/AST/ItaniumMangle.cpp +++ b/contrib/llvm/tools/clang/lib/AST/ItaniumMangle.cpp @@ -2280,9 +2280,7 @@ void CXXNameMangler::mangleIntegerLiteral(QualType T, } -/// Mangles a member expression. Implicit accesses are not handled, -/// but that should be okay, because you shouldn't be able to -/// make an implicit access in a function template declaration. +/// Mangles a member expression. void CXXNameMangler::mangleMemberExpr(const Expr *base, bool isArrow, NestedNameSpecifier *qualifier, @@ -2291,8 +2289,17 @@ void CXXNameMangler::mangleMemberExpr(const Expr *base, unsigned arity) { // ::= dt // ::= pt - Out << (isArrow ? "pt" : "dt"); - mangleExpression(base); + if (base) { + if (base->isImplicitCXXThis()) { + // Note: GCC mangles member expressions to the implicit 'this' as + // *this., whereas we represent them as this->. The Itanium C++ ABI + // does not specify anything here, so we follow GCC. + Out << "dtdefpT"; + } else { + Out << (isArrow ? "pt" : "dt"); + mangleExpression(base); + } + } mangleUnresolvedName(qualifier, firstQualifierLookup, member, arity); } @@ -2346,6 +2353,7 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { // ::= L E # integer literal // ::= L E # floating literal // ::= L E # external name + // ::= fpT # 'this' expression QualType ImplicitlyConvertedToType; recurse: @@ -2361,7 +2369,6 @@ recurse: // These all can only appear in local or variable-initialization // contexts and so should never appear in a mangling. case Expr::AddrLabelExprClass: - case Expr::CXXThisExprClass: case Expr::DesignatedInitExprClass: case Expr::ImplicitValueInitExprClass: case Expr::ParenListExprClass: @@ -2919,6 +2926,10 @@ recurse: mangleExpression(cast(E)->GetTemporaryExpr()); break; } + + case Expr::CXXThisExprClass: + Out << "fpT"; + break; } } diff --git a/contrib/llvm/tools/clang/lib/AST/Stmt.cpp b/contrib/llvm/tools/clang/lib/AST/Stmt.cpp index 6af20df4beb..e4d9f0a1ef4 100644 --- a/contrib/llvm/tools/clang/lib/AST/Stmt.cpp +++ b/contrib/llvm/tools/clang/lib/AST/Stmt.cpp @@ -97,8 +97,8 @@ Stmt *Stmt::IgnoreImplicit() { /// \brief Strip off all label-like statements. /// -/// This will strip off label statements, case statements, and default -/// statements recursively. +/// This will strip off label statements, case statements, attributed +/// statements and default statements recursively. const Stmt *Stmt::stripLabelLikeStatements() const { const Stmt *S = this; while (true) { @@ -106,6 +106,8 @@ const Stmt *Stmt::stripLabelLikeStatements() const { S = LS->getSubStmt(); else if (const SwitchCase *SC = dyn_cast(S)) S = SC->getSubStmt(); + else if (const AttributedStmt *AS = dyn_cast(S)) + S = AS->getSubStmt(); else return S; } diff --git a/contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp b/contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp index 3a44183e203..0d1066b7e32 100644 --- a/contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp +++ b/contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp @@ -169,6 +169,23 @@ void StmtPrinter::VisitLabelStmt(LabelStmt *Node) { PrintStmt(Node->getSubStmt(), 0); } +void StmtPrinter::VisitAttributedStmt(AttributedStmt *Node) { + OS << "[["; + bool first = true; + for (AttrVec::const_iterator it = Node->getAttrs().begin(), + end = Node->getAttrs().end(); + it != end; ++it) { + if (!first) { + OS << ", "; + first = false; + } + // TODO: check this + (*it)->printPretty(OS, Context); + } + OS << "]] "; + PrintStmt(Node->getSubStmt(), 0); +} + void StmtPrinter::PrintRawIfStmt(IfStmt *If) { OS << "if ("; PrintExpr(If->getCond()); diff --git a/contrib/llvm/tools/clang/lib/AST/StmtProfile.cpp b/contrib/llvm/tools/clang/lib/AST/StmtProfile.cpp index e5526cea74a..e50523ae860 100644 --- a/contrib/llvm/tools/clang/lib/AST/StmtProfile.cpp +++ b/contrib/llvm/tools/clang/lib/AST/StmtProfile.cpp @@ -109,6 +109,11 @@ void StmtProfiler::VisitLabelStmt(const LabelStmt *S) { VisitDecl(S->getDecl()); } +void StmtProfiler::VisitAttributedStmt(const AttributedStmt *S) { + VisitStmt(S); + // TODO: maybe visit attributes? +} + void StmtProfiler::VisitIfStmt(const IfStmt *S) { VisitStmt(S); VisitDecl(S->getConditionVariable()); @@ -758,6 +763,7 @@ void StmtProfiler::VisitCXXUuidofExpr(const CXXUuidofExpr *S) { void StmtProfiler::VisitCXXThisExpr(const CXXThisExpr *S) { VisitExpr(S); + ID.AddBoolean(S->isImplicit()); } void StmtProfiler::VisitCXXThrowExpr(const CXXThrowExpr *S) { diff --git a/contrib/llvm/tools/clang/lib/AST/Type.cpp b/contrib/llvm/tools/clang/lib/AST/Type.cpp index c82aeaadd49..3f6a09457d1 100644 --- a/contrib/llvm/tools/clang/lib/AST/Type.cpp +++ b/contrib/llvm/tools/clang/lib/AST/Type.cpp @@ -1546,6 +1546,14 @@ FunctionProtoType::FunctionProtoType(QualType result, const QualType *args, else if (epi.NoexceptExpr->isInstantiationDependent()) setInstantiationDependent(); } + } else if (getExceptionSpecType() == EST_Uninstantiated) { + // Store the function decl from which we will resolve our + // exception specification. + FunctionDecl **slot = reinterpret_cast(argSlot + numArgs); + slot[0] = epi.ExceptionSpecDecl; + slot[1] = epi.ExceptionSpecTemplate; + // This exception specification doesn't make the type dependent, because + // it's not instantiated as part of instantiating the type. } if (epi.ConsumedArguments) { @@ -1629,6 +1637,8 @@ void FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID, QualType Result, ID.AddPointer(epi.Exceptions[i].getAsOpaquePtr()); } else if (epi.ExceptionSpecType == EST_ComputedNoexcept && epi.NoexceptExpr){ epi.NoexceptExpr->Profile(ID, Context, false); + } else if (epi.ExceptionSpecType == EST_Uninstantiated) { + ID.AddPointer(epi.ExceptionSpecDecl->getCanonicalDecl()); } if (epi.ConsumedArguments) { for (unsigned i = 0; i != NumArgs; ++i) diff --git a/contrib/llvm/tools/clang/lib/AST/VTableBuilder.cpp b/contrib/llvm/tools/clang/lib/AST/VTableBuilder.cpp index 7a459726493..107d9fb78c5 100644 --- a/contrib/llvm/tools/clang/lib/AST/VTableBuilder.cpp +++ b/contrib/llvm/tools/clang/lib/AST/VTableBuilder.cpp @@ -2157,13 +2157,12 @@ VTableLayout::VTableLayout(uint64_t NumVTableComponents, VTableThunks(new VTableThunkTy[NumVTableThunks]), AddressPoints(AddressPoints) { std::copy(VTableComponents, VTableComponents+NumVTableComponents, - this->VTableComponents); - std::copy(VTableThunks, VTableThunks+NumVTableThunks, this->VTableThunks); + this->VTableComponents.get()); + std::copy(VTableThunks, VTableThunks+NumVTableThunks, + this->VTableThunks.get()); } -VTableLayout::~VTableLayout() { - delete[] VTableComponents; -} +VTableLayout::~VTableLayout() { } VTableContext::~VTableContext() { llvm::DeleteContainerSeconds(VTableLayouts); diff --git a/contrib/llvm/tools/clang/lib/Analysis/CFG.cpp b/contrib/llvm/tools/clang/lib/Analysis/CFG.cpp index d1334a54319..2f1f1cb4e4d 100644 --- a/contrib/llvm/tools/clang/lib/Analysis/CFG.cpp +++ b/contrib/llvm/tools/clang/lib/Analysis/CFG.cpp @@ -18,6 +18,7 @@ #include "clang/AST/StmtVisitor.h" #include "clang/AST/PrettyPrinter.h" #include "clang/AST/CharUnits.h" +#include "clang/Basic/AttrKinds.h" #include "llvm/Support/GraphWriter.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Format.h" @@ -1069,6 +1070,9 @@ CFGBlock *CFGBuilder::Visit(Stmt * S, AddStmtChoice asc) { case Stmt::LambdaExprClass: return VisitLambdaExpr(cast(S), asc); + case Stmt::AttributedStmtClass: + return Visit(cast(S)->getSubStmt(), asc); + case Stmt::MemberExprClass: return VisitMemberExpr(cast(S), asc); @@ -1131,7 +1135,7 @@ CFGBlock *CFGBuilder::VisitStmt(Stmt *S, AddStmtChoice asc) { /// VisitChildren - Visit the children of a Stmt. CFGBlock *CFGBuilder::VisitChildren(Stmt *Terminator) { - CFGBlock *lastBlock = Block; + CFGBlock *lastBlock = Block; for (Stmt::child_range I = Terminator->children(); I; ++I) if (Stmt *child = *I) if (CFGBlock *b = Visit(child)) @@ -1280,7 +1284,8 @@ static bool CanThrow(Expr *E, ASTContext &Ctx) { const FunctionType *FT = Ty->getAs(); if (FT) { if (const FunctionProtoType *Proto = dyn_cast(FT)) - if (Proto->isNothrow(Ctx)) + if (Proto->getExceptionSpecType() != EST_Uninstantiated && + Proto->isNothrow(Ctx)) return false; } return true; diff --git a/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp b/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp index 6e5da252597..1c7e6b62f83 100644 --- a/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp +++ b/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp @@ -168,7 +168,8 @@ static const BinaryOperator *getLogicalOperatorInChain(const CFGBlock *block) { if (block->empty()) return 0; - const CFGStmt *cstmt = block->front().getAs(); + CFGElement front = block->front(); + const CFGStmt *cstmt = front.getAs(); if (!cstmt) return 0; diff --git a/contrib/llvm/tools/clang/lib/Basic/TargetInfo.cpp b/contrib/llvm/tools/clang/lib/Basic/TargetInfo.cpp index f938b5a6045..8c49486b0dc 100644 --- a/contrib/llvm/tools/clang/lib/Basic/TargetInfo.cpp +++ b/contrib/llvm/tools/clang/lib/Basic/TargetInfo.cpp @@ -58,6 +58,7 @@ TargetInfo::TargetInfo(const std::string &T) : Triple(T) { Char32Type = UnsignedInt; Int64Type = SignedLongLong; SigAtomicType = SignedInt; + UseSignedCharForObjCBool = true; UseBitFieldTypeAlignment = true; UseZeroLengthBitfieldAlignment = false; ZeroLengthBitfieldBoundary = 0; diff --git a/contrib/llvm/tools/clang/lib/Basic/Targets.cpp b/contrib/llvm/tools/clang/lib/Basic/Targets.cpp index 1ad37c4e572..dd2a89a18b7 100644 --- a/contrib/llvm/tools/clang/lib/Basic/Targets.cpp +++ b/contrib/llvm/tools/clang/lib/Basic/Targets.cpp @@ -365,7 +365,7 @@ protected: DefineStd(Builder, "unix", Opts); Builder.defineMacro("__ELF__"); if (Opts.POSIXThreads) - Builder.defineMacro("_POSIX_THREADS"); + Builder.defineMacro("_REENTRANT"); } public: OpenBSDTargetInfo(const std::string &triple) @@ -3546,7 +3546,10 @@ public: virtual bool setFeatureEnabled(llvm::StringMap &Features, StringRef Name, bool Enabled) const { - if (Name == "soft-float" || Name == "single-float") { + if (Name == "soft-float" || Name == "single-float" || + Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" || + Name == "mips32" || Name == "mips32r2" || + Name == "mips64" || Name == "mips64r2") { Features[Name] = Enabled; return true; } diff --git a/contrib/llvm/tools/clang/lib/Basic/Version.cpp b/contrib/llvm/tools/clang/lib/Basic/Version.cpp index 36138ac6002..2b3ed58ea0a 100644 --- a/contrib/llvm/tools/clang/lib/Basic/Version.cpp +++ b/contrib/llvm/tools/clang/lib/Basic/Version.cpp @@ -32,7 +32,7 @@ std::string getClangRepositoryPath() { // If the SVN_REPOSITORY is empty, try to use the SVN keyword. This helps us // pick up a tag in an SVN export, for example. - static StringRef SVNRepository("$URL: http://llvm.org/svn/llvm-project/cfe/trunk/lib/Basic/Version.cpp $"); + static StringRef SVNRepository("$URL: http://llvm.org/svn/llvm-project/cfe/branches/release_31/lib/Basic/Version.cpp $"); if (URL.empty()) { URL = SVNRepository.slice(SVNRepository.find(':'), SVNRepository.find("/lib/Basic")); diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.cpp index 27bb4ef5d1a..f8c7bcd4d7b 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.cpp @@ -491,6 +491,8 @@ static void computeBlockInfo(CodeGenModule &CGM, CodeGenFunction *CGF, /// a full-expression so that the block's cleanups are pushed at the /// right place in the stack. static void enterBlockScope(CodeGenFunction &CGF, BlockDecl *block) { + assert(CGF.HaveInsertPoint()); + // Allocate the block info and place it at the head of the list. CGBlockInfo &blockInfo = *new CGBlockInfo(block, CGF.CurFn->getName()); diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGCall.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGCall.cpp index 4455f1a0865..82ee4fc1ee3 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGCall.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGCall.cpp @@ -419,16 +419,37 @@ void CodeGenTypes::GetExpandedTypes(QualType type, uint64_t NumElts = AT->getSize().getZExtValue(); for (uint64_t Elt = 0; Elt < NumElts; ++Elt) GetExpandedTypes(AT->getElementType(), expandedTypes); - } else if (const RecordType *RT = type->getAsStructureType()) { + } else if (const RecordType *RT = type->getAs()) { const RecordDecl *RD = RT->getDecl(); assert(!RD->hasFlexibleArrayMember() && "Cannot expand structure with flexible array."); - for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); - i != e; ++i) { - const FieldDecl *FD = *i; - assert(!FD->isBitField() && - "Cannot expand structure with bit-field members."); - GetExpandedTypes(FD->getType(), expandedTypes); + if (RD->isUnion()) { + // Unions can be here only in degenerative cases - all the fields are same + // after flattening. Thus we have to use the "largest" field. + const FieldDecl *LargestFD = 0; + CharUnits UnionSize = CharUnits::Zero(); + + for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); + i != e; ++i) { + const FieldDecl *FD = *i; + assert(!FD->isBitField() && + "Cannot expand structure with bit-field members."); + CharUnits FieldSize = getContext().getTypeSizeInChars(FD->getType()); + if (UnionSize < FieldSize) { + UnionSize = FieldSize; + LargestFD = FD; + } + } + if (LargestFD) + GetExpandedTypes(LargestFD->getType(), expandedTypes); + } else { + for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); + i != e; ++i) { + const FieldDecl *FD = *i; + assert(!FD->isBitField() && + "Cannot expand structure with bit-field members."); + GetExpandedTypes(FD->getType(), expandedTypes); + } } } else if (const ComplexType *CT = type->getAs()) { llvm::Type *EltTy = ConvertType(CT->getElementType()); @@ -443,32 +464,55 @@ CodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV, llvm::Function::arg_iterator AI) { assert(LV.isSimple() && "Unexpected non-simple lvalue during struct expansion."); - llvm::Value *Addr = LV.getAddress(); if (const ConstantArrayType *AT = getContext().getAsConstantArrayType(Ty)) { unsigned NumElts = AT->getSize().getZExtValue(); QualType EltTy = AT->getElementType(); for (unsigned Elt = 0; Elt < NumElts; ++Elt) { - llvm::Value *EltAddr = Builder.CreateConstGEP2_32(Addr, 0, Elt); + llvm::Value *EltAddr = Builder.CreateConstGEP2_32(LV.getAddress(), 0, Elt); LValue LV = MakeAddrLValue(EltAddr, EltTy); AI = ExpandTypeFromArgs(EltTy, LV, AI); } - } else if (const RecordType *RT = Ty->getAsStructureType()) { + } else if (const RecordType *RT = Ty->getAs()) { RecordDecl *RD = RT->getDecl(); - for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); - i != e; ++i) { - FieldDecl *FD = *i; - QualType FT = FD->getType(); + if (RD->isUnion()) { + // Unions can be here only in degenerative cases - all the fields are same + // after flattening. Thus we have to use the "largest" field. + const FieldDecl *LargestFD = 0; + CharUnits UnionSize = CharUnits::Zero(); - // FIXME: What are the right qualifiers here? - LValue LV = EmitLValueForField(Addr, FD, 0); - AI = ExpandTypeFromArgs(FT, LV, AI); + for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); + i != e; ++i) { + const FieldDecl *FD = *i; + assert(!FD->isBitField() && + "Cannot expand structure with bit-field members."); + CharUnits FieldSize = getContext().getTypeSizeInChars(FD->getType()); + if (UnionSize < FieldSize) { + UnionSize = FieldSize; + LargestFD = FD; + } + } + if (LargestFD) { + // FIXME: What are the right qualifiers here? + LValue SubLV = EmitLValueForField(LV, LargestFD); + AI = ExpandTypeFromArgs(LargestFD->getType(), SubLV, AI); + } + } else { + for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); + i != e; ++i) { + FieldDecl *FD = *i; + QualType FT = FD->getType(); + + // FIXME: What are the right qualifiers here? + LValue SubLV = EmitLValueForField(LV, FD); + AI = ExpandTypeFromArgs(FT, SubLV, AI); + } } } else if (const ComplexType *CT = Ty->getAs()) { QualType EltTy = CT->getElementType(); - llvm::Value *RealAddr = Builder.CreateStructGEP(Addr, 0, "real"); + llvm::Value *RealAddr = Builder.CreateStructGEP(LV.getAddress(), 0, "real"); EmitStoreThroughLValue(RValue::get(AI++), MakeAddrLValue(RealAddr, EltTy)); - llvm::Value *ImagAddr = Builder.CreateStructGEP(Addr, 1, "imag"); + llvm::Value *ImagAddr = Builder.CreateStructGEP(LV.getAddress(), 1, "imag"); EmitStoreThroughLValue(RValue::get(AI++), MakeAddrLValue(ImagAddr, EltTy)); } else { EmitStoreThroughLValue(RValue::get(AI), LV); @@ -1760,26 +1804,38 @@ void CodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV, EltRV = EmitLoadOfLValue(LV); ExpandTypeToArgs(EltTy, EltRV, Args, IRFuncTy); } - } else if (const RecordType *RT = Ty->getAsStructureType()) { + } else if (const RecordType *RT = Ty->getAs()) { RecordDecl *RD = RT->getDecl(); assert(RV.isAggregate() && "Unexpected rvalue during struct expansion"); - llvm::Value *Addr = RV.getAggregateAddr(); - for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); - i != e; ++i) { - FieldDecl *FD = *i; - QualType FT = FD->getType(); - - // FIXME: What are the right qualifiers here? - LValue LV = EmitLValueForField(Addr, FD, 0); - RValue FldRV; - if (FT->isAnyComplexType()) - // FIXME: Volatile? - FldRV = RValue::getComplex(LoadComplexFromAddr(LV.getAddress(), false)); - else if (CodeGenFunction::hasAggregateLLVMType(FT)) - FldRV = LV.asAggregateRValue(); - else - FldRV = EmitLoadOfLValue(LV); - ExpandTypeToArgs(FT, FldRV, Args, IRFuncTy); + LValue LV = MakeAddrLValue(RV.getAggregateAddr(), Ty); + + if (RD->isUnion()) { + const FieldDecl *LargestFD = 0; + CharUnits UnionSize = CharUnits::Zero(); + + for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); + i != e; ++i) { + const FieldDecl *FD = *i; + assert(!FD->isBitField() && + "Cannot expand structure with bit-field members."); + CharUnits FieldSize = getContext().getTypeSizeInChars(FD->getType()); + if (UnionSize < FieldSize) { + UnionSize = FieldSize; + LargestFD = FD; + } + } + if (LargestFD) { + RValue FldRV = EmitRValueForField(LV, LargestFD); + ExpandTypeToArgs(LargestFD->getType(), FldRV, Args, IRFuncTy); + } + } else { + for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); + i != e; ++i) { + FieldDecl *FD = *i; + + RValue FldRV = EmitRValueForField(LV, FD); + ExpandTypeToArgs(FD->getType(), FldRV, Args, IRFuncTy); + } } } else if (Ty->isAnyComplexType()) { ComplexPairTy CV = RV.getComplexVal(); diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGClass.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGClass.cpp index 6303e2069d5..2aedf95e6a1 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGClass.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGClass.cpp @@ -555,15 +555,17 @@ static void EmitMemberInitializer(CodeGenFunction &CGF, QualType FieldType = Field->getType(); llvm::Value *ThisPtr = CGF.LoadCXXThis(); + QualType RecordTy = CGF.getContext().getTypeDeclType(ClassDecl); LValue LHS; - + // If we are initializing an anonymous union field, drill down to the field. if (MemberInit->isIndirectMemberInitializer()) { LHS = CGF.EmitLValueForAnonRecordField(ThisPtr, MemberInit->getIndirectMember(), 0); FieldType = MemberInit->getIndirectMember()->getAnonField()->getType(); } else { - LHS = CGF.EmitLValueForFieldInitialization(ThisPtr, Field, 0); + LValue ThisLHSLV = CGF.MakeNaturalAlignAddrLValue(ThisPtr, RecordTy); + LHS = CGF.EmitLValueForFieldInitialization(ThisLHSLV, Field); } // Special case: if we are in a copy or move constructor, and we are copying @@ -585,7 +587,8 @@ static void EmitMemberInitializer(CodeGenFunction &CGF, unsigned SrcArgIndex = Args.size() - 1; llvm::Value *SrcPtr = CGF.Builder.CreateLoad(CGF.GetAddrOfLocalVar(Args[SrcArgIndex])); - LValue Src = CGF.EmitLValueForFieldInitialization(SrcPtr, Field, 0); + LValue ThisRHSLV = CGF.MakeNaturalAlignAddrLValue(SrcPtr, RecordTy); + LValue Src = CGF.EmitLValueForFieldInitialization(ThisRHSLV, Field); // Copy the aggregate. CGF.EmitAggregateCopy(LHS.getAddress(), Src.getAddress(), FieldType, @@ -978,7 +981,9 @@ namespace { void Emit(CodeGenFunction &CGF, Flags flags) { // Find the address of the field. llvm::Value *thisValue = CGF.LoadCXXThis(); - LValue LV = CGF.EmitLValueForField(thisValue, field, /*CVRQualifiers=*/0); + QualType RecordTy = CGF.getContext().getTagDeclType(field->getParent()); + LValue ThisLV = CGF.MakeAddrLValue(thisValue, RecordTy); + LValue LV = CGF.EmitLValueForField(ThisLV, field); assert(LV.isSimple()); CGF.emitDestroy(LV.getAddress(), field->getType(), destroyer, diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp index 7301d2060ba..78160f5514e 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp @@ -184,7 +184,6 @@ CGDebugInfo::getClassName(const RecordDecl *RD) { const TemplateArgument *Args; unsigned NumArgs; - std::string Buffer; if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) { const TemplateSpecializationType *TST = cast(TAW->getType()); @@ -195,16 +194,17 @@ CGDebugInfo::getClassName(const RecordDecl *RD) { Args = TemplateArgs.data(); NumArgs = TemplateArgs.size(); } - Buffer = RD->getIdentifier()->getNameStart(); + StringRef Name = RD->getIdentifier()->getName(); PrintingPolicy Policy(CGM.getLangOpts()); - Buffer += TemplateSpecializationType::PrintTemplateArgumentList(Args, - NumArgs, - Policy); + std::string TemplateArgList = + TemplateSpecializationType::PrintTemplateArgumentList(Args, NumArgs, Policy); // Copy this name on the side and use its reference. - char *StrPtr = DebugInfoNames.Allocate(Buffer.length()); - memcpy(StrPtr, Buffer.data(), Buffer.length()); - return StringRef(StrPtr, Buffer.length()); + size_t Length = Name.size() + TemplateArgList.size(); + char *StrPtr = DebugInfoNames.Allocate(Length); + memcpy(StrPtr, Name.data(), Name.size()); + memcpy(StrPtr + Name.size(), TemplateArgList.data(), TemplateArgList.size()); + return StringRef(StrPtr, Length); } /// getOrCreateFile - Get the file debug info descriptor for the input location. @@ -1479,25 +1479,21 @@ llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty, // obvious/recursive way? SmallVector Subscripts; QualType EltTy(Ty, 0); - if (Ty->isIncompleteArrayType()) + while ((Ty = dyn_cast(EltTy))) { + int64_t UpperBound = 0; + int64_t LowerBound = 0; + if (const ConstantArrayType *CAT = dyn_cast(Ty)) { + if (CAT->getSize().getZExtValue()) + UpperBound = CAT->getSize().getZExtValue() - 1; + } else + // This is an unbounded array. Use Low = 1, Hi = 0 to express such + // arrays. + LowerBound = 1; + + // FIXME: Verify this is right for VLAs. + Subscripts.push_back(DBuilder.getOrCreateSubrange(LowerBound, + UpperBound)); EltTy = Ty->getElementType(); - else { - while ((Ty = dyn_cast(EltTy))) { - int64_t UpperBound = 0; - int64_t LowerBound = 0; - if (const ConstantArrayType *CAT = dyn_cast(Ty)) { - if (CAT->getSize().getZExtValue()) - UpperBound = CAT->getSize().getZExtValue() - 1; - } else - // This is an unbounded array. Use Low = 1, Hi = 0 to express such - // arrays. - LowerBound = 1; - - // FIXME: Verify this is right for VLAs. - Subscripts.push_back(DBuilder.getOrCreateSubrange(LowerBound, - UpperBound)); - EltTy = Ty->getElementType(); - } } llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts); diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGDecl.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGDecl.cpp index 8c154f07084..644777963b2 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGDecl.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGDecl.cpp @@ -1171,6 +1171,10 @@ void CodeGenFunction::EmitAutoVarCleanups(const AutoVarEmission &emission) { // If this was emitted as a global constant, we're done. if (emission.wasEmittedAsGlobal()) return; + // If we don't have an insertion point, we're done. Sema prevents + // us from jumping into any of these scopes anyway. + if (!HaveInsertPoint()) return; + const VarDecl &D = *emission.Variable; // Check the type for a cleanup. diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGExpr.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGExpr.cpp index 08970fd7386..5f2b1f055db 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGExpr.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGExpr.cpp @@ -24,6 +24,7 @@ #include "clang/Frontend/CodeGenOptions.h" #include "llvm/Intrinsics.h" #include "llvm/LLVMContext.h" +#include "llvm/Support/MDBuilder.h" #include "llvm/Target/TargetData.h" using namespace clang; using namespace CodeGen; @@ -398,8 +399,8 @@ EmitExprForReferenceBinding(CodeGenFunction &CGF, const Expr *E, break; case SubobjectAdjustment::FieldAdjustment: { - LValue LV = - CGF.EmitLValueForField(Object, Adjustment.Field, 0); + LValue LV = CGF.MakeAddrLValue(Object, E->getType()); + LV = CGF.EmitLValueForField(LV, Adjustment.Field); if (LV.isSimple()) { Object = LV.getAddress(); break; @@ -908,16 +909,8 @@ llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) { } } - if (End == Min) - return NULL; - - llvm::Value *LowAndHigh[2]; - LowAndHigh[0] = llvm::ConstantInt::get(LTy, Min); - LowAndHigh[1] = llvm::ConstantInt::get(LTy, End); - - llvm::LLVMContext &C = getLLVMContext(); - llvm::MDNode *Range = llvm::MDNode::get(C, LowAndHigh); - return Range; + llvm::MDBuilder MDHelper(getLLVMContext()); + return MDHelper.createRange(Min, End); } llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile, @@ -1577,8 +1570,12 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) { // Use special handling for lambdas. if (!V) { - if (FieldDecl *FD = LambdaCaptureFields.lookup(VD)) - return EmitLValueForField(CXXABIThisValue, FD, 0); + if (FieldDecl *FD = LambdaCaptureFields.lookup(VD)) { + QualType LambdaTagType = getContext().getTagDeclType(FD->getParent()); + LValue LambdaLV = MakeNaturalAlignAddrLValue(CXXABIThisValue, + LambdaTagType); + return EmitLValueForField(LambdaLV, FD); + } assert(isa(CurCodeDecl) && E->refersToEnclosingLocal()); CharUnits alignment = getContext().getDeclAlign(VD); @@ -1973,32 +1970,19 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) { } LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { - bool isNonGC = false; Expr *BaseExpr = E->getBase(); - llvm::Value *BaseValue = NULL; - Qualifiers BaseQuals; // If this is s.x, emit s as an lvalue. If it is s->x, emit s as a scalar. - if (E->isArrow()) { - BaseValue = EmitScalarExpr(BaseExpr); - const PointerType *PTy = - BaseExpr->getType()->getAs(); - BaseQuals = PTy->getPointeeType().getQualifiers(); - } else { - LValue BaseLV = EmitLValue(BaseExpr); - if (BaseLV.isNonGC()) - isNonGC = true; - // FIXME: this isn't right for bitfields. - BaseValue = BaseLV.getAddress(); - QualType BaseTy = BaseExpr->getType(); - BaseQuals = BaseTy.getQualifiers(); - } + LValue BaseLV; + if (E->isArrow()) + BaseLV = MakeNaturalAlignAddrLValue(EmitScalarExpr(BaseExpr), + BaseExpr->getType()->getPointeeType()); + else + BaseLV = EmitLValue(BaseExpr); NamedDecl *ND = E->getMemberDecl(); if (FieldDecl *Field = dyn_cast(ND)) { - LValue LV = EmitLValueForField(BaseValue, Field, - BaseQuals.getCVRQualifiers()); - LV.setNonGC(isNonGC); + LValue LV = EmitLValueForField(BaseLV, Field); setObjCGCLValueClass(getContext(), E, LV); return LV; } @@ -2032,8 +2016,10 @@ LValue CodeGenFunction::EmitLValueForAnonRecordField(llvm::Value *BaseValue, IndirectFieldDecl::chain_iterator I = Field->chain_begin(), IEnd = Field->chain_end(); while (true) { - LValue LV = EmitLValueForField(BaseValue, cast(*I), - CVRQualifiers); + QualType RecordTy = + getContext().getTypeDeclType(cast(*I)->getParent()); + LValue LV = EmitLValueForField(MakeAddrLValue(BaseValue, RecordTy), + cast(*I)); if (++I == IEnd) return LV; assert(LV.isSimple()); @@ -2042,19 +2028,25 @@ LValue CodeGenFunction::EmitLValueForAnonRecordField(llvm::Value *BaseValue, } } -LValue CodeGenFunction::EmitLValueForField(llvm::Value *baseAddr, - const FieldDecl *field, - unsigned cvr) { +LValue CodeGenFunction::EmitLValueForField(LValue base, + const FieldDecl *field) { if (field->isBitField()) - return EmitLValueForBitfield(baseAddr, field, cvr); + return EmitLValueForBitfield(base.getAddress(), field, + base.getVRQualifiers()); const RecordDecl *rec = field->getParent(); QualType type = field->getType(); CharUnits alignment = getContext().getDeclAlign(field); + // FIXME: It should be impossible to have an LValue without alignment for a + // complete type. + if (!base.getAlignment().isZero()) + alignment = std::min(alignment, base.getAlignment()); + bool mayAlias = rec->hasAttr(); - llvm::Value *addr = baseAddr; + llvm::Value *addr = base.getAddress(); + unsigned cvr = base.getVRQualifiers(); if (rec->isUnion()) { // For unions, there is no pointer adjustment. assert(!type->isReferenceType() && "union has reference member"); @@ -2117,30 +2109,33 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value *baseAddr, } LValue -CodeGenFunction::EmitLValueForFieldInitialization(llvm::Value *BaseValue, - const FieldDecl *Field, - unsigned CVRQualifiers) { +CodeGenFunction::EmitLValueForFieldInitialization(LValue Base, + const FieldDecl *Field) { QualType FieldType = Field->getType(); if (!FieldType->isReferenceType()) - return EmitLValueForField(BaseValue, Field, CVRQualifiers); + return EmitLValueForField(Base, Field); const CGRecordLayout &RL = CGM.getTypes().getCGRecordLayout(Field->getParent()); unsigned idx = RL.getLLVMFieldNo(Field); - llvm::Value *V = Builder.CreateStructGEP(BaseValue, idx); + llvm::Value *V = Builder.CreateStructGEP(Base.getAddress(), idx); assert(!FieldType.getObjCGCAttr() && "fields cannot have GC attrs"); - // Make sure that the address is pointing to the right type. This is critical // for both unions and structs. A union needs a bitcast, a struct element // will need a bitcast if the LLVM type laid out doesn't match the desired // type. llvm::Type *llvmType = ConvertTypeForMem(FieldType); - unsigned AS = cast(V->getType())->getAddressSpace(); - V = Builder.CreateBitCast(V, llvmType->getPointerTo(AS)); - + V = EmitBitCastOfLValueToProperType(*this, V, llvmType, Field->getName()); + CharUnits Alignment = getContext().getDeclAlign(Field); + + // FIXME: It should be impossible to have an LValue without alignment for a + // complete type. + if (!Base.getAlignment().isZero()) + Alignment = std::min(Alignment, Base.getAlignment()); + return MakeAddrLValue(V, FieldType, Alignment); } @@ -2378,6 +2373,19 @@ LValue CodeGenFunction::EmitMaterializeTemporaryExpr( return MakeAddrLValue(RV.getScalarVal(), E->getType()); } +RValue CodeGenFunction::EmitRValueForField(LValue LV, + const FieldDecl *FD) { + QualType FT = FD->getType(); + LValue FieldLV = EmitLValueForField(LV, FD); + if (FT->isAnyComplexType()) + return RValue::getComplex( + LoadComplexFromAddr(FieldLV.getAddress(), + FieldLV.isVolatileQualified())); + else if (CodeGenFunction::hasAggregateLLVMType(FT)) + return FieldLV.asAggregateRValue(); + + return EmitLoadOfLValue(FieldLV); +} //===--------------------------------------------------------------------===// // Expression Emission @@ -3158,11 +3166,10 @@ void CodeGenFunction::SetFPAccuracy(llvm::Value *Val, float Accuracy) { if (Accuracy == 0.0 || !isa(Val)) return; - llvm::Value *ULPs = llvm::ConstantFP::get(Builder.getFloatTy(), Accuracy); - llvm::MDNode *Node = llvm::MDNode::get(getLLVMContext(), ULPs); + llvm::MDBuilder MDHelper(getLLVMContext()); + llvm::MDNode *Node = MDHelper.createFPMath(Accuracy); - cast(Val)->setMetadata(llvm::LLVMContext::MD_fpaccuracy, - Node); + cast(Val)->setMetadata(llvm::LLVMContext::MD_fpmath, Node); } namespace { diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp index b6efc1cafaa..7b0e0f5157c 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp @@ -238,7 +238,10 @@ void AggExprEmitter::EmitMoveFromReturnSlot(const Expr *E, RValue Src) { // Otherwise, do a final copy, assert(Dest.getAddr() != Src.getAggregateAddr()); - EmitFinalDestCopy(E, Src, /*Ignore*/ true); + std::pair TypeInfo = + CGF.getContext().getTypeInfoInChars(E->getType()); + CharUnits Alignment = std::min(TypeInfo.second, Dest.getAlignment()); + EmitFinalDestCopy(E, Src, /*Ignore*/ true, Alignment.getQuantity()); } /// EmitFinalDestCopy - Perform the final copy to DestPtr, if desired. @@ -348,7 +351,8 @@ void AggExprEmitter::EmitStdInitializerList(llvm::Value *destPtr, CGF.ErrorUnsupported(initList, "weird std::initializer_list"); return; } - LValue start = CGF.EmitLValueForFieldInitialization(destPtr, *field, 0); + LValue DestLV = CGF.MakeNaturalAlignAddrLValue(destPtr, initList->getType()); + LValue start = CGF.EmitLValueForFieldInitialization(DestLV, *field); llvm::Value *arrayStart = Builder.CreateStructGEP(alloc, 0, "arraystart"); CGF.EmitStoreThroughLValue(RValue::get(arrayStart), start); ++field; @@ -357,7 +361,7 @@ void AggExprEmitter::EmitStdInitializerList(llvm::Value *destPtr, CGF.ErrorUnsupported(initList, "weird std::initializer_list"); return; } - LValue endOrLength = CGF.EmitLValueForFieldInitialization(destPtr, *field, 0); + LValue endOrLength = CGF.EmitLValueForFieldInitialization(DestLV, *field); if (ctx.hasSameType(field->getType(), elementPtr)) { // End pointer. llvm::Value *arrayEnd = Builder.CreateStructGEP(alloc,numInits, "arrayend"); @@ -912,28 +916,24 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) { return; } - llvm::Value *DestPtr = EnsureSlot(E->getType()).getAddr(); + AggValueSlot Dest = EnsureSlot(E->getType()); + LValue DestLV = CGF.MakeAddrLValue(Dest.getAddr(), E->getType(), + Dest.getAlignment()); // Handle initialization of an array. if (E->getType()->isArrayType()) { - if (E->getNumInits() > 0) { - QualType T1 = E->getType(); - QualType T2 = E->getInit(0)->getType(); - if (CGF.getContext().hasSameUnqualifiedType(T1, T2)) { - EmitAggLoadOfLValue(E->getInit(0)); - return; - } - } + if (E->isStringLiteralInit()) + return Visit(E->getInit(0)); QualType elementType = CGF.getContext().getAsArrayType(E->getType())->getElementType(); llvm::PointerType *APType = - cast(DestPtr->getType()); + cast(Dest.getAddr()->getType()); llvm::ArrayType *AType = cast(APType->getElementType()); - EmitArrayInit(DestPtr, AType, elementType, E); + EmitArrayInit(Dest.getAddr(), AType, elementType, E); return; } @@ -966,7 +966,7 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) { // FIXME: volatility FieldDecl *Field = E->getInitializedFieldInUnion(); - LValue FieldLoc = CGF.EmitLValueForFieldInitialization(DestPtr, Field, 0); + LValue FieldLoc = CGF.EmitLValueForFieldInitialization(DestLV, Field); if (NumInitElements) { // Store the initializer into the field EmitInitializationToLValue(E->getInit(0), FieldLoc); @@ -1004,8 +1004,8 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) { CGF.getTypes().isZeroInitializable(E->getType())) break; - // FIXME: volatility - LValue LV = CGF.EmitLValueForFieldInitialization(DestPtr, *field, 0); + + LValue LV = CGF.EmitLValueForFieldInitialization(DestLV, *field); // We never generate write-barries for initialized fields. LV.setNonGC(true); diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGExprCXX.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGExprCXX.cpp index d3ba7707470..c69c8830c1e 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGExprCXX.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGExprCXX.cpp @@ -1815,13 +1815,16 @@ llvm::Value *CodeGenFunction::EmitDynamicCast(llvm::Value *Value, void CodeGenFunction::EmitLambdaExpr(const LambdaExpr *E, AggValueSlot Slot) { RunCleanupsScope Scope(*this); + LValue SlotLV = MakeAddrLValue(Slot.getAddr(), E->getType(), + Slot.getAlignment()); CXXRecordDecl::field_iterator CurField = E->getLambdaClass()->field_begin(); for (LambdaExpr::capture_init_iterator i = E->capture_init_begin(), e = E->capture_init_end(); i != e; ++i, ++CurField) { // Emit initialization - LValue LV = EmitLValueForFieldInitialization(Slot.getAddr(), *CurField, 0); + + LValue LV = EmitLValueForFieldInitialization(SlotLV, *CurField); ArrayRef ArrayIndexes; if (CurField->getType()->isArrayType()) ArrayIndexes = E->getCaptureInitIndexVars(i); diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp index d528e0c4b72..bc9f9ef07b2 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp @@ -758,17 +758,13 @@ public: } llvm::Constant *EmitArrayInitialization(InitListExpr *ILE) { - unsigned NumInitElements = ILE->getNumInits(); - if (NumInitElements == 1 && - CGM.getContext().hasSameUnqualifiedType(ILE->getType(), - ILE->getInit(0)->getType()) && - (isa(ILE->getInit(0)) || - isa(ILE->getInit(0)))) + if (ILE->isStringLiteralInit()) return Visit(ILE->getInit(0)); llvm::ArrayType *AType = cast(ConvertType(ILE->getType())); llvm::Type *ElemTy = AType->getElementType(); + unsigned NumInitElements = ILE->getNumInits(); unsigned NumElements = AType->getNumElements(); // Initialising an array requires us to automatically diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp index bf42dcb8e21..a1d07895730 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp @@ -79,6 +79,7 @@ void CodeGenFunction::EmitStmt(const Stmt *S) { case Stmt::CompoundStmtClass: case Stmt::DeclStmtClass: case Stmt::LabelStmtClass: + case Stmt::AttributedStmtClass: case Stmt::GotoStmtClass: case Stmt::BreakStmtClass: case Stmt::ContinueStmtClass: @@ -173,6 +174,8 @@ bool CodeGenFunction::EmitSimpleStmt(const Stmt *S) { case Stmt::CompoundStmtClass: EmitCompoundStmt(cast(*S)); break; case Stmt::DeclStmtClass: EmitDeclStmt(cast(*S)); break; case Stmt::LabelStmtClass: EmitLabelStmt(cast(*S)); break; + case Stmt::AttributedStmtClass: + EmitAttributedStmt(cast(*S)); break; case Stmt::GotoStmtClass: EmitGotoStmt(cast(*S)); break; case Stmt::BreakStmtClass: EmitBreakStmt(cast(*S)); break; case Stmt::ContinueStmtClass: EmitContinueStmt(cast(*S)); break; @@ -332,6 +335,10 @@ void CodeGenFunction::EmitLabelStmt(const LabelStmt &S) { EmitStmt(S.getSubStmt()); } +void CodeGenFunction::EmitAttributedStmt(const AttributedStmt &S) { + EmitStmt(S.getSubStmt()); +} + void CodeGenFunction::EmitGotoStmt(const GotoStmt &S) { // If this code is reachable then emit a stop point (if generating // debug info). We have to do this ourselves because we are on the diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.cpp index 06e90b66485..2939062c9bb 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.cpp @@ -22,8 +22,9 @@ #include "clang/AST/DeclCXX.h" #include "clang/AST/StmtCXX.h" #include "clang/Frontend/CodeGenOptions.h" -#include "llvm/Target/TargetData.h" #include "llvm/Intrinsics.h" +#include "llvm/Support/MDBuilder.h" +#include "llvm/Target/TargetData.h" using namespace clang; using namespace CodeGen; @@ -362,8 +363,12 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy, LambdaThisCaptureField); if (LambdaThisCaptureField) { // If this lambda captures this, load it. - LValue ThisLValue = EmitLValueForField(CXXABIThisValue, - LambdaThisCaptureField, 0); + QualType LambdaTagType = + getContext().getTagDeclType(LambdaThisCaptureField->getParent()); + LValue LambdaLV = MakeNaturalAlignAddrLValue(CXXABIThisValue, + LambdaTagType); + LValue ThisLValue = EmitLValueForField(LambdaLV, + LambdaThisCaptureField); CXXThisValue = EmitLoadOfLValue(ThisLValue).getScalarVal(); } } else { diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h index 3e0cd146256..83f1e2df9f4 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h +++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h @@ -1948,6 +1948,7 @@ public: void EmitLabel(const LabelDecl *D); // helper for EmitLabelStmt. void EmitLabelStmt(const LabelStmt &S); + void EmitAttributedStmt(const AttributedStmt &S); void EmitGotoStmt(const GotoStmt &S); void EmitIndirectGotoStmt(const IndirectGotoStmt &S); void EmitIfStmt(const IfStmt &S); @@ -2104,6 +2105,8 @@ public: LValue EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E); LValue EmitOpaqueValueLValue(const OpaqueValueExpr *e); + RValue EmitRValueForField(LValue LV, const FieldDecl *FD); + class ConstantEmission { llvm::PointerIntPair ValueAndIsReference; ConstantEmission(llvm::Constant *C, bool isReference) @@ -2143,15 +2146,13 @@ public: LValue EmitLValueForAnonRecordField(llvm::Value* Base, const IndirectFieldDecl* Field, unsigned CVRQualifiers); - LValue EmitLValueForField(llvm::Value* Base, const FieldDecl* Field, - unsigned CVRQualifiers); + LValue EmitLValueForField(LValue Base, const FieldDecl* Field); /// EmitLValueForFieldInitialization - Like EmitLValueForField, except that /// if the Field is a reference, this will return the address of the reference /// and not the address of the value stored in the reference. - LValue EmitLValueForFieldInitialization(llvm::Value* Base, - const FieldDecl* Field, - unsigned CVRQualifiers); + LValue EmitLValueForFieldInitialization(LValue Base, + const FieldDecl* Field); LValue EmitLValueForIvar(QualType ObjectTy, llvm::Value* Base, const ObjCIvarDecl *Ivar, diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp index c0ccf4de4c9..9a55c084800 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp @@ -1241,7 +1241,7 @@ CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name, /// GetAddrOfGlobalVar - Return the llvm::Constant for the address of the /// given global variable. If Ty is non-null and if the global doesn't exist, -/// then it will be greated with the specified type instead of whatever the +/// then it will be created with the specified type instead of whatever the /// normal requested type would be. llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D, llvm::Type *Ty) { diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTBAA.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTBAA.cpp index 9ee3f1d2e67..a3cadcf3924 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTBAA.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTBAA.cpp @@ -28,7 +28,7 @@ using namespace CodeGen; CodeGenTBAA::CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext& VMContext, const LangOptions &Features, MangleContext &MContext) : Context(Ctx), VMContext(VMContext), Features(Features), MContext(MContext), - Root(0), Char(0) { + MDHelper(VMContext), Root(0), Char(0) { } CodeGenTBAA::~CodeGenTBAA() { @@ -40,7 +40,7 @@ llvm::MDNode *CodeGenTBAA::getRoot() { // (or a different version of this front-end), their TBAA trees will // remain distinct, and the optimizer will treat them conservatively. if (!Root) - Root = getTBAAInfoForNamedType("Simple C/C++ TBAA", 0); + Root = MDHelper.createTBAARoot("Simple C/C++ TBAA"); return Root; } @@ -51,33 +51,11 @@ llvm::MDNode *CodeGenTBAA::getChar() { // these special powers only cover user-accessible memory, and doesn't // include things like vtables. if (!Char) - Char = getTBAAInfoForNamedType("omnipotent char", getRoot()); + Char = MDHelper.createTBAANode("omnipotent char", getRoot()); return Char; } -/// getTBAAInfoForNamedType - Create a TBAA tree node with the given string -/// as its identifier, and the given Parent node as its tree parent. -llvm::MDNode *CodeGenTBAA::getTBAAInfoForNamedType(StringRef NameStr, - llvm::MDNode *Parent, - bool Readonly) { - // Currently there is only one flag defined - the readonly flag. - llvm::Value *Flags = 0; - if (Readonly) - Flags = llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), true); - - // Set up the mdnode operand list. - llvm::Value *Ops[] = { - llvm::MDString::get(VMContext, NameStr), - Parent, - Flags - }; - - // Create the mdnode. - unsigned Len = llvm::array_lengthof(Ops) - !Flags; - return llvm::MDNode::get(VMContext, llvm::makeArrayRef(Ops, Len)); -} - static bool TypeHasMayAlias(QualType QTy) { // Tagged types have declarations, and therefore may have attributes. if (const TagType *TTy = dyn_cast(QTy)) @@ -137,7 +115,7 @@ CodeGenTBAA::getTBAAInfo(QualType QTy) { // "underlying types". default: return MetadataCache[Ty] = - getTBAAInfoForNamedType(BTy->getName(Features), getChar()); + MDHelper.createTBAANode(BTy->getName(Features), getChar()); } } @@ -145,7 +123,7 @@ CodeGenTBAA::getTBAAInfo(QualType QTy) { // TODO: Implement C++'s type "similarity" and consider dis-"similar" // pointers distinct. if (Ty->isPointerType()) - return MetadataCache[Ty] = getTBAAInfoForNamedType("any pointer", + return MetadataCache[Ty] = MDHelper.createTBAANode("any pointer", getChar()); // Enum types are distinct types. In C++ they have "underlying types", @@ -173,7 +151,7 @@ CodeGenTBAA::getTBAAInfo(QualType QTy) { llvm::raw_svector_ostream Out(OutName); MContext.mangleCXXRTTIName(QualType(ETy, 0), Out); Out.flush(); - return MetadataCache[Ty] = getTBAAInfoForNamedType(OutName, getChar()); + return MetadataCache[Ty] = MDHelper.createTBAANode(OutName, getChar()); } // For now, handle any other kind of type conservatively. @@ -181,5 +159,5 @@ CodeGenTBAA::getTBAAInfo(QualType QTy) { } llvm::MDNode *CodeGenTBAA::getTBAAInfoForVTablePtr() { - return getTBAAInfoForNamedType("vtable pointer", getRoot()); + return MDHelper.createTBAANode("vtable pointer", getRoot()); } diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTBAA.h b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTBAA.h index 8e08498b7e5..4a9785287d0 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTBAA.h +++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTBAA.h @@ -17,6 +17,7 @@ #include "clang/Basic/LLVM.h" #include "llvm/ADT/DenseMap.h" +#include "llvm/Support/MDBuilder.h" namespace llvm { class LLVMContext; @@ -41,6 +42,9 @@ class CodeGenTBAA { const LangOptions &Features; MangleContext &MContext; + // MDHelper - Helper for creating metadata. + llvm::MDBuilder MDHelper; + /// MetadataCache - This maps clang::Types to llvm::MDNodes describing them. llvm::DenseMap MetadataCache; @@ -55,10 +59,6 @@ class CodeGenTBAA { /// considered to be equivalent to it. llvm::MDNode *getChar(); - llvm::MDNode *getTBAAInfoForNamedType(StringRef NameStr, - llvm::MDNode *Parent, - bool Readonly = false); - public: CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext &VMContext, const LangOptions &Features, diff --git a/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp b/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp index 3ed1778cc90..2b71fdd504e 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp @@ -2527,19 +2527,16 @@ void ARMABIInfo::computeInfo(CGFunctionInfo &FI) const { static bool isHomogeneousAggregate(QualType Ty, const Type *&Base, ASTContext &Context, uint64_t *HAMembers = 0) { - uint64_t Members; + uint64_t Members = 0; if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) { if (!isHomogeneousAggregate(AT->getElementType(), Base, Context, &Members)) return false; Members *= AT->getSize().getZExtValue(); } else if (const RecordType *RT = Ty->getAs()) { const RecordDecl *RD = RT->getDecl(); - if (RD->isUnion() || RD->hasFlexibleArrayMember()) + if (RD->hasFlexibleArrayMember()) return false; - if (const CXXRecordDecl *CXXRD = dyn_cast(RD)) { - if (!CXXRD->isAggregate()) - return false; - } + Members = 0; for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); i != e; ++i) { @@ -2547,7 +2544,9 @@ static bool isHomogeneousAggregate(QualType Ty, const Type *&Base, uint64_t FldMembers; if (!isHomogeneousAggregate(FD->getType(), Base, Context, &FldMembers)) return false; - Members += FldMembers; + + Members = (RD->isUnion() ? + std::max(Members, FldMembers) : Members + FldMembers); } } else { Members = 1; @@ -2584,7 +2583,8 @@ static bool isHomogeneousAggregate(QualType Ty, const Type *&Base, // Homogeneous Aggregates can have at most 4 members of the base type. if (HAMembers) *HAMembers = Members; - return (Members <= 4); + + return (Members > 0 && Members <= 4); } ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty) const { @@ -2609,8 +2609,10 @@ ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty) const { if (getABIKind() == ARMABIInfo::AAPCS_VFP) { // Homogeneous Aggregates need to be expanded. const Type *Base = 0; - if (isHomogeneousAggregate(Ty, Base, getContext())) + if (isHomogeneousAggregate(Ty, Base, getContext())) { + assert(Base && "Base class should be set for homogeneous aggregate"); return ABIArgInfo::getExpand(); + } } // Otherwise, pass by coercing to a structure of the appropriate size. @@ -2776,9 +2778,11 @@ ABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy) const { // Check for homogeneous aggregates with AAPCS-VFP. if (getABIKind() == AAPCS_VFP) { const Type *Base = 0; - if (isHomogeneousAggregate(RetTy, Base, getContext())) + if (isHomogeneousAggregate(RetTy, Base, getContext())) { + assert(Base && "Base class should be set for homogeneous aggregate"); // Homogeneous Aggregates are returned directly. return ABIArgInfo::getDirect(); + } } // Aggregates <= 4 bytes are returned in r0; other aggregates diff --git a/contrib/llvm/tools/clang/lib/Driver/Compilation.cpp b/contrib/llvm/tools/clang/lib/Driver/Compilation.cpp index 42c84493fa6..5553fc937e0 100644 --- a/contrib/llvm/tools/clang/lib/Driver/Compilation.cpp +++ b/contrib/llvm/tools/clang/lib/Driver/Compilation.cpp @@ -230,3 +230,7 @@ void Compilation::initCompilationForDiagnostics(void) { Redirects[1] = new const llvm::sys::Path(); Redirects[2] = new const llvm::sys::Path(); } + +StringRef Compilation::getSysRoot(void) const { + return getDriver().SysRoot; +} diff --git a/contrib/llvm/tools/clang/lib/Driver/Driver.cpp b/contrib/llvm/tools/clang/lib/Driver/Driver.cpp index 40e0c006792..bb78a41d444 100644 --- a/contrib/llvm/tools/clang/lib/Driver/Driver.cpp +++ b/contrib/llvm/tools/clang/lib/Driver/Driver.cpp @@ -49,8 +49,8 @@ Driver::Driver(StringRef ClangExecutable, bool IsProduction, DiagnosticsEngine &Diags) : Opts(createDriverOptTable()), Diags(Diags), - ClangExecutable(ClangExecutable), UseStdLib(true), - DefaultTargetTriple(DefaultTargetTriple), + ClangExecutable(ClangExecutable), SysRoot(DEFAULT_SYSROOT), + UseStdLib(true), DefaultTargetTriple(DefaultTargetTriple), DefaultImageName(DefaultImageName), DriverTitle("clang \"gcc-compatible\" driver"), CCPrintOptionsFilename(0), CCPrintHeadersFilename(0), @@ -660,9 +660,7 @@ bool Driver::HandleImmediateArgs(const Compilation &C) { llvm::outs() << "\n"; llvm::outs() << "libraries: =" << ResourceDir; - std::string sysroot; - if (Arg *A = C.getArgs().getLastArg(options::OPT__sysroot_EQ)) - sysroot = A->getValue(C.getArgs()); + StringRef sysroot = C.getSysRoot(); for (ToolChain::path_list::const_iterator it = TC.getFilePaths().begin(), ie = TC.getFilePaths().end(); it != ie; ++it) { @@ -872,30 +870,30 @@ void Driver::BuildUniversalActions(const ToolChain &TC, // Handle debug info queries. Arg *A = Args.getLastArg(options::OPT_g_Group); - if (A && !A->getOption().matches(options::OPT_g0) && - !A->getOption().matches(options::OPT_gstabs) && - ContainsCompileOrAssembleAction(Actions.back())) { - - // Add a 'dsymutil' step if necessary, when debug info is enabled and we - // have a compile input. We need to run 'dsymutil' ourselves in such cases - // because the debug info will refer to a temporary object file which is - // will be removed at the end of the compilation process. - if (Act->getType() == types::TY_Image) { - ActionList Inputs; - Inputs.push_back(Actions.back()); - Actions.pop_back(); - Actions.push_back(new DsymutilJobAction(Inputs, types::TY_dSYM)); - } - - // Verify the output (debug information only) if we passed '-verify'. - if (Args.hasArg(options::OPT_verify)) { - ActionList VerifyInputs; - VerifyInputs.push_back(Actions.back()); - Actions.pop_back(); - Actions.push_back(new VerifyJobAction(VerifyInputs, - types::TY_Nothing)); - } + if (A && !A->getOption().matches(options::OPT_g0) && + !A->getOption().matches(options::OPT_gstabs) && + ContainsCompileOrAssembleAction(Actions.back())) { + + // Add a 'dsymutil' step if necessary, when debug info is enabled and we + // have a compile input. We need to run 'dsymutil' ourselves in such cases + // because the debug info will refer to a temporary object file which is + // will be removed at the end of the compilation process. + if (Act->getType() == types::TY_Image) { + ActionList Inputs; + Inputs.push_back(Actions.back()); + Actions.pop_back(); + Actions.push_back(new DsymutilJobAction(Inputs, types::TY_dSYM)); } + + // Verify the output (debug information only) if we passed '-verify'. + if (Args.hasArg(options::OPT_verify)) { + ActionList VerifyInputs; + VerifyInputs.push_back(Actions.back()); + Actions.pop_back(); + Actions.push_back(new VerifyJobAction(VerifyInputs, + types::TY_Nothing)); + } + } } } diff --git a/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp b/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp index fa9ed497863..7f9ed9a7530 100644 --- a/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp +++ b/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp @@ -35,10 +35,6 @@ #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX -#ifndef CLANG_PREFIX -#define CLANG_PREFIX -#endif - using namespace clang::driver; using namespace clang::driver::toolchains; using namespace clang; @@ -584,7 +580,7 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { // If no '-miphoneos-version-min' specified on the command line and // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default - // based on isysroot. + // based on -isysroot. if (iOSTarget.empty()) { if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { StringRef first, second; @@ -1090,6 +1086,7 @@ bool Generic_GCC::GCCVersion::operator<(const GCCVersion &RHS) const { // a patch. if (RHS.Patch == -1) return true; if (Patch == -1) return false; if (Patch < RHS.Patch) return true; if (Patch > RHS.Patch) return false; + if (PatchSuffix == RHS.PatchSuffix) return false; // Finally, between completely tied version numbers, the version with the // suffix loses as we prefer full releases. @@ -1107,7 +1104,7 @@ static StringRef getGCCToolchainDir(const ArgList &Args) { /// \brief Construct a GCCInstallationDetector from the driver. /// /// This performs all of the autodetection and sets up the various paths. -/// Once constructed, a GCCInstallation is esentially immutable. +/// Once constructed, a GCCInstallationDetector is essentially immutable. /// /// FIXME: We shouldn't need an explicit TargetTriple parameter here, and /// should instead pull the target out of the driver. This is currently @@ -1618,10 +1615,10 @@ FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Arg // back to '/usr/lib' if it doesn't exist. if ((Triple.getArch() == llvm::Triple::x86 || Triple.getArch() == llvm::Triple::ppc) && - llvm::sys::fs::exists(getDriver().SysRoot + CLANG_PREFIX "/usr/lib32/crt1.o")) - getFilePaths().push_back(getDriver().SysRoot + CLANG_PREFIX "/usr/lib32"); + llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o")) + getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32"); else - getFilePaths().push_back(getDriver().SysRoot + CLANG_PREFIX "/usr/lib"); + getFilePaths().push_back(getDriver().SysRoot + "/usr/lib"); } Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA, @@ -1833,6 +1830,7 @@ enum LinuxDistro { OpenSuse11_3, OpenSuse11_4, OpenSuse12_1, + OpenSuse12_2, UbuntuHardy, UbuntuIntrepid, UbuntuJaunty, @@ -1851,7 +1849,7 @@ static bool IsRedhat(enum LinuxDistro Distro) { } static bool IsOpenSuse(enum LinuxDistro Distro) { - return Distro >= OpenSuse11_3 && Distro <= OpenSuse12_1; + return Distro >= OpenSuse11_3 && Distro <= OpenSuse12_2; } static bool IsDebian(enum LinuxDistro Distro) { @@ -1928,6 +1926,7 @@ static LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) { .StartsWith("openSUSE 11.3", OpenSuse11_3) .StartsWith("openSUSE 11.4", OpenSuse11_4) .StartsWith("openSUSE 12.1", OpenSuse12_1) + .StartsWith("openSUSE 12.2", OpenSuse12_2) .Default(UnknownDistro); bool Exists; @@ -2067,7 +2066,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) // If the GCC installation we found is inside of the sysroot, we want to // prefer libraries installed in the parent prefix of the GCC installation. // It is important to *not* use these paths when the GCC installation is - // outside of the system root as that can pick up un-intented libraries. + // outside of the system root as that can pick up unintended libraries. // This usually happens when there is an external cross compiler on the // host system, and a more minimal sysroot available that is the target of // the cross. diff --git a/contrib/llvm/tools/clang/lib/Driver/Tools.cpp b/contrib/llvm/tools/clang/lib/Driver/Tools.cpp index d3dab19f929..00aa6c7408c 100644 --- a/contrib/llvm/tools/clang/lib/Driver/Tools.cpp +++ b/contrib/llvm/tools/clang/lib/Driver/Tools.cpp @@ -377,10 +377,11 @@ void Clang::AddPreprocessingOptions(Compilation &C, // If we have a --sysroot, and don't have an explicit -isysroot flag, add an // -isysroot to the CC1 invocation. - if (Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) { + StringRef sysroot = C.getSysRoot(); + if (sysroot != "") { if (!Args.hasArg(options::OPT_isysroot)) { CmdArgs.push_back("-isysroot"); - CmdArgs.push_back(A->getValue(Args)); + CmdArgs.push_back(C.getArgs().MakeArgString(sysroot)); } } @@ -4017,9 +4018,10 @@ void darwin::Link::AddLinkArgs(Compilation &C, // Give --sysroot= preference, over the Apple specific behavior to also use // --isysroot as the syslibroot. - if (const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) { + StringRef sysroot = C.getSysRoot(); + if (sysroot != "") { CmdArgs.push_back("-syslibroot"); - CmdArgs.push_back(A->getValue(Args)); + CmdArgs.push_back(C.getArgs().MakeArgString(sysroot)); } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { CmdArgs.push_back("-syslibroot"); CmdArgs.push_back(A->getValue(Args)); @@ -4758,6 +4760,9 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-dynamic-linker"); CmdArgs.push_back("/libexec/ld-elf.so.1"); } + llvm::Triple::ArchType Arch = getToolChain().getArch(); + if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) + CmdArgs.push_back("--hash-style=both"); } // When building 32-bit code on FreeBSD/amd64, we have to explicitly diff --git a/contrib/llvm/tools/clang/lib/Frontend/ASTUnit.cpp b/contrib/llvm/tools/clang/lib/Frontend/ASTUnit.cpp index e32fa630a73..7aa96032ee3 100644 --- a/contrib/llvm/tools/clang/lib/Frontend/ASTUnit.cpp +++ b/contrib/llvm/tools/clang/lib/Frontend/ASTUnit.cpp @@ -643,8 +643,10 @@ void ASTUnit::ConfigureDiags(IntrusiveRefCntPtr &Diags, DiagnosticConsumer *Client = 0; if (CaptureDiagnostics) Client = new StoredDiagnosticConsumer(AST.StoredDiagnostics); - Diags = CompilerInstance::createDiagnostics(DiagOpts, ArgEnd- ArgBegin, - ArgBegin, Client); + Diags = CompilerInstance::createDiagnostics(DiagOpts, ArgEnd-ArgBegin, + ArgBegin, Client, + /*ShouldOwnClient=*/true, + /*ShouldCloneClient=*/false); } else if (CaptureDiagnostics) { Diags->setClient(new StoredDiagnosticConsumer(AST.StoredDiagnostics)); } diff --git a/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp b/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp index cab6b90d0cd..4ec3ba1695a 100644 --- a/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp +++ b/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp @@ -560,7 +560,8 @@ CompilerInstance::createOutputFile(StringRef OutputPath, TempPath += "-%%%%%%%%"; int fd; if (llvm::sys::fs::unique_file(TempPath.str(), fd, TempPath, - /*makeAbsolute=*/false) == llvm::errc::success) { + /*makeAbsolute=*/false, 0664) + == llvm::errc::success) { OS.reset(new llvm::raw_fd_ostream(fd, /*shouldClose=*/true)); OSFile = TempFile = TempPath.str(); } @@ -651,6 +652,10 @@ bool CompilerInstance::ExecuteAction(FrontendAction &Act) { // created. This complexity should be lifted elsewhere. getTarget().setForcedLangOptions(getLangOpts()); + // rewriter project will change target built-in bool type from its default. + if (getFrontendOpts().ProgramAction == frontend::RewriteObjC) + getTarget().noSignedCharForObjCBool(); + // Validate/process some options. if (getHeaderSearchOpts().Verbose) OS << "clang -cc1 version " CLANG_VERSION_STRING diff --git a/contrib/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp b/contrib/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp index 612a0d8d2f8..eedc318f0cf 100644 --- a/contrib/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp +++ b/contrib/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp @@ -429,7 +429,6 @@ static const char *getActionName(frontend::ActionKind Kind) { case frontend::PrintDeclContext: return "-print-decl-contexts"; case frontend::PrintPreamble: return "-print-preamble"; case frontend::PrintPreprocessedInput: return "-E"; - case frontend::PubnamesDump: return "-pubnames-dump"; case frontend::RewriteMacros: return "-rewrite-macros"; case frontend::RewriteObjC: return "-rewrite-objc"; case frontend::RewriteTest: return "-rewrite-test"; @@ -1371,8 +1370,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, Opts.ProgramAction = frontend::PrintPreamble; break; case OPT_E: Opts.ProgramAction = frontend::PrintPreprocessedInput; break; - case OPT_pubnames_dump: - Opts.ProgramAction = frontend::PubnamesDump; break; case OPT_rewrite_macros: Opts.ProgramAction = frontend::RewriteMacros; break; case OPT_rewrite_objc: diff --git a/contrib/llvm/tools/clang/lib/Frontend/FrontendActions.cpp b/contrib/llvm/tools/clang/lib/Frontend/FrontendActions.cpp index b4a439d4237..737ee4a098b 100644 --- a/contrib/llvm/tools/clang/lib/Frontend/FrontendActions.cpp +++ b/contrib/llvm/tools/clang/lib/Frontend/FrontendActions.cpp @@ -25,7 +25,6 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/system_error.h" -#include using namespace clang; @@ -355,77 +354,6 @@ ASTConsumer *SyntaxOnlyAction::CreateASTConsumer(CompilerInstance &CI, return new ASTConsumer(); } -namespace { - class PubnamesDumpConsumer : public ASTConsumer { - Preprocessor &PP; - - /// \brief Determine whether the given identifier provides a 'public' name. - bool isPublicName(IdentifierInfo *II) { - // If there are any top-level declarations associated with this - // identifier, it is a public name. - if (II->getFETokenInfo()) - return true; - - // If this identifier is the name of a non-builtin macro that isn't - // defined on the command line or implicitly by the front end, it is a - // public name. - if (II->hasMacroDefinition()) { - if (MacroInfo *M = PP.getMacroInfo(II)) - if (!M->isBuiltinMacro()) { - SourceLocation Loc = M->getDefinitionLoc(); - FileID File = PP.getSourceManager().getFileID(Loc); - if (PP.getSourceManager().getFileEntryForID(File)) - return true; - } - } - - return false; - } - - public: - PubnamesDumpConsumer(Preprocessor &PP) : PP(PP) { } - - virtual void HandleTranslationUnit(ASTContext &Ctx) { - std::set Pubnames; - - // Add the names of any non-builtin macros. - for (IdentifierTable::iterator I = Ctx.Idents.begin(), - IEnd = Ctx.Idents.end(); - I != IEnd; ++I) { - if (isPublicName(I->second)) - Pubnames.insert(I->first()); - } - - // If there is an external identifier lookup source, consider those - // identifiers as well. - if (IdentifierInfoLookup *External - = Ctx.Idents.getExternalIdentifierLookup()) { - OwningPtr Iter(External->getIdentifiers()); - do { - StringRef Name = Iter->Next(); - if (Name.empty()) - break; - - if (isPublicName(PP.getIdentifierInfo(Name))) - Pubnames.insert(Name); - } while (true); - } - - // Print the names, in lexicographical order. - for (std::set::iterator N = Pubnames.begin(), - NEnd = Pubnames.end(); - N != NEnd; ++N) { - llvm::outs() << *N << '\n'; - } - } - }; -} - -ASTConsumer *PubnamesDumpAction::CreateASTConsumer(CompilerInstance &CI, - StringRef InFile) { - return new PubnamesDumpConsumer(CI.getPreprocessor()); -} - //===----------------------------------------------------------------------===// // Preprocessor Actions //===----------------------------------------------------------------------===// diff --git a/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp b/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp index 7f01cd914c1..fc3388df1ed 100644 --- a/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp +++ b/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp @@ -29,9 +29,6 @@ #include "clang/Config/config.h" // C_INCLUDE_DIRS -#ifndef CLANG_PREFIX -#define CLANG_PREFIX -#endif using namespace clang; using namespace clang::frontend; @@ -319,7 +316,7 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, } break; case llvm::Triple::FreeBSD: - AddPath(CLANG_PREFIX "/usr/include/clang/" CLANG_VERSION_STRING, + AddPath("/usr/include/clang/" CLANG_VERSION_STRING, System, false, false, false); break; @@ -328,7 +325,7 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, } if ( os != llvm::Triple::RTEMS ) - AddPath(CLANG_PREFIX "/usr/include", System, false, false, false); + AddPath("/usr/include", System, false, false, false); } void InitHeaderSearch:: @@ -408,9 +405,8 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOp case llvm::Triple::FreeBSD: // FreeBSD 8.0 // FreeBSD 7.3 - AddGnuCPlusPlusIncludePaths(CLANG_PREFIX "/usr/include/c++/4.2", - "", "", "", triple); - AddGnuCPlusPlusIncludePaths(CLANG_PREFIX "/usr/include/c++/4.2/backward", + AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2", "", "", "", triple); + AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2/backward", "", "", "", triple); break; case llvm::Triple::NetBSD: diff --git a/contrib/llvm/tools/clang/lib/Frontend/TextDiagnostic.cpp b/contrib/llvm/tools/clang/lib/Frontend/TextDiagnostic.cpp index 9f5dcb48380..65fb1ae13f2 100644 --- a/contrib/llvm/tools/clang/lib/Frontend/TextDiagnostic.cpp +++ b/contrib/llvm/tools/clang/lib/Frontend/TextDiagnostic.cpp @@ -10,13 +10,17 @@ #include "clang/Frontend/TextDiagnostic.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/SourceManager.h" +#include "clang/Basic/ConvertUTF.h" #include "clang/Frontend/DiagnosticOptions.h" #include "clang/Lex/Lexer.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/Locale.h" #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringExtras.h" #include + using namespace clang; static const enum raw_ostream::Colors noteColor = @@ -36,23 +40,269 @@ static const enum raw_ostream::Colors savedColor = /// \brief Number of spaces to indent when word-wrapping. const unsigned WordWrapIndentation = 6; +int bytesSincePreviousTabOrLineBegin(StringRef SourceLine, size_t i) { + int bytes = 0; + while (0,bool> +printableTextForNextCharacter(StringRef SourceLine, size_t *i, + unsigned TabStop) { + assert(i && "i must not be null"); + assert(*i expandedTab; + expandedTab.assign(NumSpaces, ' '); + return std::make_pair(expandedTab, true); + } + + // FIXME: this data is copied from the private implementation of ConvertUTF.h + static const char trailingBytesForUTF8[256] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 + }; + + unsigned char const *begin, *end; + begin = reinterpret_cast(&*(SourceLine.begin() + *i)); + end = begin + SourceLine.size(); + + if (isLegalUTF8Sequence(begin, end)) { + UTF32 c; + UTF32 *cptr = &c; + unsigned char const *original_begin = begin; + char trailingBytes = trailingBytesForUTF8[(unsigned char)SourceLine[*i]]; + unsigned char const *cp_end = begin+trailingBytes+1; + + ConversionResult res = ConvertUTF8toUTF32(&begin, cp_end, &cptr, cptr+1, + strictConversion); + (void)res; + assert(conversionOK==res); + assert(0 < begin-original_begin + && "we must be further along in the string now"); + *i += begin-original_begin; + + if (!llvm::sys::locale::isPrint(c)) { + // If next character is valid UTF-8, but not printable + SmallString<16> expandedCP(""); + while (c) { + expandedCP.insert(expandedCP.begin()+3, llvm::hexdigit(c%16)); + c/=16; + } + while (expandedCP.size() < 8) + expandedCP.insert(expandedCP.begin()+3, llvm::hexdigit(0)); + return std::make_pair(expandedCP, false); + } + + // If next character is valid UTF-8, and printable + return std::make_pair(SmallString<16>(original_begin, cp_end), true); + + } + + // If next byte is not valid UTF-8 (and therefore not printable) + SmallString<16> expandedByte(""); + unsigned char byte = SourceLine[*i]; + expandedByte[1] = llvm::hexdigit(byte / 16); + expandedByte[2] = llvm::hexdigit(byte % 16); + ++(*i); + return std::make_pair(expandedByte, false); +} + +void expandTabs(std::string &SourceLine, unsigned TabStop) { + size_t i = SourceLine.size(); + while (i>0) { + i--; + if (SourceLine[i]!='\t') + continue; + size_t tmp_i = i; + std::pair,bool> res + = printableTextForNextCharacter(SourceLine, &tmp_i, TabStop); + SourceLine.replace(i, 1, res.first.c_str()); + } +} + +/// This function takes a raw source line and produces a mapping from the bytes +/// of the printable representation of the line to the columns those printable +/// characters will appear at (numbering the first column as 0). +/// +/// If a byte 'i' corresponds to muliple columns (e.g. the byte contains a tab +/// character) then the the array will map that byte to the first column the +/// tab appears at and the next value in the map will have been incremented +/// more than once. +/// +/// If a byte is the first in a sequence of bytes that together map to a single +/// entity in the output, then the array will map that byte to the appropriate +/// column while the subsequent bytes will be -1. +/// +/// The last element in the array does not correspond to any byte in the input +/// and instead is the number of columns needed to display the source +/// +/// example: (given a tabstop of 8) +/// +/// "a \t \u3042" -> {0,1,2,8,9,-1,-1,11} +/// +/// (\u3042 is represented in UTF-8 by three bytes and takes two columns to +/// display) +void byteToColumn(StringRef SourceLine, unsigned TabStop, + SmallVectorImpl &out) { + out.clear(); + + if (SourceLine.empty()) { + out.resize(1u,0); + return; + } + + out.resize(SourceLine.size()+1, -1); + + int columns = 0; + size_t i = 0; + while (i,bool> res + = printableTextForNextCharacter(SourceLine, &i, TabStop); + columns += llvm::sys::locale::columnWidth(res.first); + } + out.back() = columns; +} + +/// This function takes a raw source line and produces a mapping from columns +/// to the byte of the source line that produced the character displaying at +/// that column. This is the inverse of the mapping produced by byteToColumn() +/// +/// The last element in the array is the number of bytes in the source string +/// +/// example: (given a tabstop of 8) +/// +/// "a \t \u3042" -> {0,1,2,-1,-1,-1,-1,-1,3,4,-1,7} +/// +/// (\u3042 is represented in UTF-8 by three bytes and takes two columns to +/// display) +void columnToByte(StringRef SourceLine, unsigned TabStop, + SmallVectorImpl &out) { + out.clear(); + + if (SourceLine.empty()) { + out.resize(1u, 0); + return; + } + + int columns = 0; + size_t i = 0; + while (i,bool> res + = printableTextForNextCharacter(SourceLine, &i, TabStop); + columns += llvm::sys::locale::columnWidth(res.first); + } + out.resize(columns+1, -1); + out.back() = i; +} + +struct SourceColumnMap { + SourceColumnMap(StringRef SourceLine, unsigned TabStop) + : m_SourceLine(SourceLine) { + + ::byteToColumn(SourceLine, TabStop, m_byteToColumn); + ::columnToByte(SourceLine, TabStop, m_columnToByte); + + assert(m_byteToColumn.size()==SourceLine.size()+1); + assert(0 < m_byteToColumn.size() && 0 < m_columnToByte.size()); + assert(m_byteToColumn.size() + == static_cast(m_columnToByte.back()+1)); + assert(static_cast(m_byteToColumn.back()+1) + == m_columnToByte.size()); + } + int columns() const { return m_byteToColumn.back(); } + int bytes() const { return m_columnToByte.back(); } + int byteToColumn(int n) const { + assert(0<=n && n(m_byteToColumn.size())); + return m_byteToColumn[n]; + } + int columnToByte(int n) const { + assert(0<=n && n(m_columnToByte.size())); + return m_columnToByte[n]; + } + StringRef getSourceLine() const { + return m_SourceLine; + } + +private: + const std::string m_SourceLine; + SmallVector m_byteToColumn; + SmallVector m_columnToByte; +}; + +// used in assert in selectInterestingSourceRegion() +namespace { +struct char_out_of_range { + const char lower,upper; + char_out_of_range(char lower, char upper) : + lower(lower), upper(upper) {} + bool operator()(char c) { return c < lower || upper < c; } +}; +} + /// \brief When the source code line we want to print is too long for /// the terminal, select the "interesting" region. static void selectInterestingSourceRegion(std::string &SourceLine, std::string &CaretLine, std::string &FixItInsertionLine, - unsigned EndOfCaretToken, - unsigned Columns) { - unsigned MaxSize = std::max(SourceLine.size(), - std::max(CaretLine.size(), - FixItInsertionLine.size())); - if (MaxSize > SourceLine.size()) - SourceLine.resize(MaxSize, ' '); - if (MaxSize > CaretLine.size()) - CaretLine.resize(MaxSize, ' '); - if (!FixItInsertionLine.empty() && MaxSize > FixItInsertionLine.size()) - FixItInsertionLine.resize(MaxSize, ' '); - + unsigned Columns, + const SourceColumnMap &map) { + unsigned MaxColumns = std::max(map.columns(), + std::max(CaretLine.size(), + FixItInsertionLine.size())); + // if the number of columns is less than the desired number we're done + if (MaxColumns <= Columns) + return; + + // no special characters allowed in CaretLine or FixItInsertionLine + assert(CaretLine.end() == + std::find_if(CaretLine.begin(), CaretLine.end(), + char_out_of_range(' ','~'))); + assert(FixItInsertionLine.end() == + std::find_if(FixItInsertionLine.begin(), FixItInsertionLine.end(), + char_out_of_range(' ','~'))); + // Find the slice that we need to display the full caret line // correctly. unsigned CaretStart = 0, CaretEnd = CaretLine.size(); @@ -64,10 +314,8 @@ static void selectInterestingSourceRegion(std::string &SourceLine, if (!isspace(CaretLine[CaretEnd - 1])) break; - // Make sure we don't chop the string shorter than the caret token - // itself. - if (CaretEnd < EndOfCaretToken) - CaretEnd = EndOfCaretToken; + // caret has already been inserted into CaretLine so the above whitespace + // check is guaranteed to include the caret // If we have a fix-it line, make sure the slice includes all of the // fix-it information. @@ -81,10 +329,8 @@ static void selectInterestingSourceRegion(std::string &SourceLine, if (!isspace(FixItInsertionLine[FixItEnd - 1])) break; - if (FixItStart < CaretStart) - CaretStart = FixItStart; - if (FixItEnd > CaretEnd) - CaretEnd = FixItEnd; + CaretStart = std::min(FixItStart, CaretStart); + CaretEnd = std::max(FixItEnd, CaretEnd); } // CaretLine[CaretStart, CaretEnd) contains all of the interesting @@ -92,62 +338,72 @@ static void selectInterestingSourceRegion(std::string &SourceLine, // number of columns we have, try to grow the slice to encompass // more context. - // If the end of the interesting region comes before we run out of - // space in the terminal, start at the beginning of the line. - if (Columns > 3 && CaretEnd < Columns - 3) - CaretStart = 0; + unsigned SourceStart = map.columnToByte(std::min(CaretStart, + map.columns())); + unsigned SourceEnd = map.columnToByte(std::min(CaretEnd, + map.columns())); + + unsigned CaretColumnsOutsideSource = CaretEnd-CaretStart + - (map.byteToColumn(SourceEnd)-map.byteToColumn(SourceStart)); + + char const *front_ellipse = " ..."; + char const *front_space = " "; + char const *back_ellipse = "..."; + unsigned ellipses_space = strlen(front_ellipse) + strlen(back_ellipse); unsigned TargetColumns = Columns; - if (TargetColumns > 8) - TargetColumns -= 8; // Give us extra room for the ellipses. - unsigned SourceLength = SourceLine.size(); - while ((CaretEnd - CaretStart) < TargetColumns) { + // Give us extra room for the ellipses + // and any of the caret line that extends past the source + if (TargetColumns > ellipses_space+CaretColumnsOutsideSource) + TargetColumns -= ellipses_space+CaretColumnsOutsideSource; + + while (SourceStart>0 || SourceEnd 1) { - unsigned NewStart = CaretStart - 1; + + if (SourceStart>0) { + unsigned NewStart = SourceStart-1; // Skip over any whitespace we see here; we're looking for // another bit of interesting text. - while (NewStart && isspace(SourceLine[NewStart])) + while (NewStart && + (map.byteToColumn(NewStart)==-1 || isspace(SourceLine[NewStart]))) --NewStart; // Skip over this bit of "interesting" text. - while (NewStart && !isspace(SourceLine[NewStart])) + while (NewStart && + (map.byteToColumn(NewStart)!=-1 && !isspace(SourceLine[NewStart]))) --NewStart; // Move up to the non-whitespace character we just saw. if (NewStart) ++NewStart; - // If we're still within our limit, update the starting - // position within the source/caret line. - if (CaretEnd - NewStart <= TargetColumns) { - CaretStart = NewStart; + unsigned NewColumns = map.byteToColumn(SourceEnd) - + map.byteToColumn(NewStart); + if (NewColumns <= TargetColumns) { + SourceStart = NewStart; ExpandedRegion = true; } } - // Move the end of the interesting region right until we've - // pulled in something else interesting. - if (CaretEnd != SourceLength) { - assert(CaretEnd < SourceLength && "Unexpected caret position!"); - unsigned NewEnd = CaretEnd; + if (SourceEnd CaretEnd) - FixItInsertionLine.erase(CaretEnd, std::string::npos); - if (CaretStart > 2) { - SourceLine.replace(0, CaretStart, " ..."); - CaretLine.replace(0, CaretStart, " "); - if (FixItInsertionLine.size() >= CaretStart) - FixItInsertionLine.replace(0, CaretStart, " "); + assert(CaretStart!=(unsigned)-1 && CaretEnd!=(unsigned)-1 && + SourceStart!=(unsigned)-1 && SourceEnd!=(unsigned)-1); + assert(SourceStart <= SourceEnd); + assert(CaretStart <= CaretEnd); + + unsigned BackColumnsRemoved + = map.byteToColumn(SourceLine.size())-map.byteToColumn(SourceEnd); + unsigned FrontColumnsRemoved = CaretStart; + unsigned ColumnsKept = CaretEnd-CaretStart; + + // We checked up front that the line needed truncation + assert(FrontColumnsRemoved+ColumnsKept+BackColumnsRemoved > Columns); + + // The line needs some trunctiona, and we'd prefer to keep the front + // if possible, so remove the back + if (BackColumnsRemoved) + SourceLine.replace(SourceEnd, std::string::npos, back_ellipse); + + // If that's enough then we're done + if (FrontColumnsRemoved+ColumnsKept <= Columns) + return; + + // Otherwise remove the front as well + if (FrontColumnsRemoved) { + SourceLine.replace(0, SourceStart, front_ellipse); + CaretLine.replace(0, CaretStart, front_space); + if (!FixItInsertionLine.empty()) + FixItInsertionLine.replace(0, CaretStart, front_space); } } @@ -564,10 +840,13 @@ void TextDiagnostic::emitSnippetAndCaret( // Get information about the buffer it points into. bool Invalid = false; - const char *BufStart = SM.getBufferData(FID, &Invalid).data(); + StringRef BufData = SM.getBufferData(FID, &Invalid); if (Invalid) return; + const char *BufStart = BufData.data(); + const char *BufEnd = BufStart + BufData.size(); + unsigned LineNo = SM.getLineNumber(FID, FileOffset); unsigned ColNo = SM.getColumnNumber(FID, FileOffset); unsigned CaretEndColNo @@ -581,7 +860,7 @@ void TextDiagnostic::emitSnippetAndCaret( // Compute the line end. Scan forward from the error position to the end of // the line. const char *LineEnd = TokPtr; - while (*LineEnd != '\n' && *LineEnd != '\r' && *LineEnd != '\0') + while (*LineEnd != '\n' && *LineEnd != '\r' && LineEnd!=BufEnd) ++LineEnd; // FIXME: This shouldn't be necessary, but the CaretEndColNo can extend past @@ -596,19 +875,30 @@ void TextDiagnostic::emitSnippetAndCaret( // length as the line of source code. std::string CaretLine(LineEnd-LineStart, ' '); + const SourceColumnMap sourceColMap(SourceLine, DiagOpts.TabStop); + // Highlight all of the characters covered by Ranges with ~ characters. for (SmallVectorImpl::iterator I = Ranges.begin(), E = Ranges.end(); I != E; ++I) - highlightRange(*I, LineNo, FID, SourceLine, CaretLine); + highlightRange(*I, LineNo, FID, sourceColMap, CaretLine); // Next, insert the caret itself. - if (ColNo-1 < CaretLine.size()) - CaretLine[ColNo-1] = '^'; - else - CaretLine.push_back('^'); + ColNo = sourceColMap.byteToColumn(ColNo-1); + if (CaretLine.size() Columns) - selectInterestingSourceRegion(SourceLine, CaretLine, FixItInsertionLine, - CaretEndColNo, Columns); - // Finally, remove any blank spaces from the end of CaretLine. while (CaretLine[CaretLine.size()-1] == ' ') CaretLine.erase(CaretLine.end()-1); // Emit what we have computed. - OS << SourceLine << '\n'; + emitSnippet(SourceLine); if (DiagOpts.ShowColors) OS.changeColor(caretColor, true); @@ -658,13 +937,49 @@ void TextDiagnostic::emitSnippetAndCaret( emitParseableFixits(Hints); } +void TextDiagnostic::emitSnippet(StringRef line) +{ + if (line.empty()) + return; + + size_t i = 0; + + std::string to_print; + bool print_reversed = false; + + while (i,bool> res + = printableTextForNextCharacter(line, &i, DiagOpts.TabStop); + bool was_printable = res.second; + + if (DiagOpts.ShowColors + && was_printable==print_reversed) { + if (print_reversed) + OS.reverseColor(); + OS << to_print; + to_print.clear(); + if (DiagOpts.ShowColors) + OS.resetColor(); + } + + print_reversed = !was_printable; + to_print += res.first.str(); + } + + if (print_reversed && DiagOpts.ShowColors) + OS.reverseColor(); + OS << to_print; + if (print_reversed && DiagOpts.ShowColors) + OS.resetColor(); + + OS << '\n'; +} + /// \brief Highlight a SourceRange (with ~'s) for any characters on LineNo. void TextDiagnostic::highlightRange(const CharSourceRange &R, unsigned LineNo, FileID FID, - const std::string &SourceLine, + const SourceColumnMap &map, std::string &CaretLine) { - assert(CaretLine.size() == SourceLine.size() && - "Expect a correspondence between source and caret line!"); if (!R.isValid()) return; SourceLocation Begin = SM.getExpansionLoc(R.getBegin()); @@ -694,7 +1009,7 @@ void TextDiagnostic::highlightRange(const CharSourceRange &R, } // Compute the column number of the end. - unsigned EndColNo = CaretLine.size(); + unsigned EndColNo = map.getSourceLine().size(); if (EndLineNo == LineNo) { EndColNo = SM.getExpansionColumnNumber(End); if (EndColNo) { @@ -714,15 +1029,17 @@ void TextDiagnostic::highlightRange(const CharSourceRange &R, // Check that a token range does not highlight only whitespace. if (R.isTokenRange()) { // Pick the first non-whitespace column. - while (StartColNo < SourceLine.size() && - (SourceLine[StartColNo] == ' ' || SourceLine[StartColNo] == '\t')) + while (StartColNo < map.getSourceLine().size() && + (map.getSourceLine()[StartColNo] == ' ' || + map.getSourceLine()[StartColNo] == '\t')) ++StartColNo; // Pick the last non-whitespace column. - if (EndColNo > SourceLine.size()) - EndColNo = SourceLine.size(); + if (EndColNo > map.getSourceLine().size()) + EndColNo = map.getSourceLine().size(); while (EndColNo-1 && - (SourceLine[EndColNo-1] == ' ' || SourceLine[EndColNo-1] == '\t')) + (map.getSourceLine()[EndColNo-1] == ' ' || + map.getSourceLine()[EndColNo-1] == '\t')) --EndColNo; // If the start/end passed each other, then we are trying to highlight a @@ -731,15 +1048,24 @@ void TextDiagnostic::highlightRange(const CharSourceRange &R, assert(StartColNo <= EndColNo && "Trying to highlight whitespace??"); } + assert(StartColNo <= map.getSourceLine().size() && "Invalid range!"); + assert(EndColNo <= map.getSourceLine().size() && "Invalid range!"); + // Fill the range with ~'s. - for (unsigned i = StartColNo; i < EndColNo; ++i) - CaretLine[i] = '~'; + StartColNo = map.byteToColumn(StartColNo); + EndColNo = map.byteToColumn(EndColNo); + + assert(StartColNo <= EndColNo && "Invalid range!"); + if (CaretLine.size() < EndColNo) + CaretLine.resize(EndColNo,' '); + std::fill(CaretLine.begin()+StartColNo,CaretLine.begin()+EndColNo,'~'); } -std::string TextDiagnostic::buildFixItInsertionLine(unsigned LineNo, - const char *LineStart, - const char *LineEnd, - ArrayRef Hints) { +std::string TextDiagnostic::buildFixItInsertionLine( + unsigned LineNo, + const SourceColumnMap &map, + ArrayRef Hints) { + std::string FixItInsertionLine; if (Hints.empty() || !DiagOpts.ShowFixits) return FixItInsertionLine; @@ -755,13 +1081,32 @@ std::string TextDiagnostic::buildFixItInsertionLine(unsigned LineNo, // Insert the new code into the line just below the code // that the user wrote. unsigned HintColNo - = SM.getColumnNumber(HintLocInfo.first, HintLocInfo.second); + = SM.getColumnNumber(HintLocInfo.first, HintLocInfo.second) - 1; + // hint must start inside the source or right at the end + assert(HintColNo(map.bytes())+1); + HintColNo = map.byteToColumn(HintColNo); + + // FIXME: if the fixit includes tabs or other characters that do not + // take up a single column per byte when displayed then + // I->CodeToInsert.size() is not a column number and we're mixing + // units (columns + bytes). We should get printable versions + // of each fixit before using them. unsigned LastColumnModified - = HintColNo - 1 + I->CodeToInsert.size(); + = HintColNo + I->CodeToInsert.size(); + + if (LastColumnModified > static_cast(map.bytes())) { + unsigned LastExistingColumn = map.byteToColumn(map.bytes()); + unsigned AddedColumns = LastColumnModified-LastExistingColumn; + LastColumnModified = LastExistingColumn + AddedColumns; + } else { + LastColumnModified = map.byteToColumn(LastColumnModified); + } + if (LastColumnModified > FixItInsertionLine.size()) FixItInsertionLine.resize(LastColumnModified, ' '); + assert(HintColNo+I->CodeToInsert.size() <= FixItInsertionLine.size()); std::copy(I->CodeToInsert.begin(), I->CodeToInsert.end(), - FixItInsertionLine.begin() + HintColNo - 1); + FixItInsertionLine.begin() + HintColNo); } else { FixItInsertionLine.clear(); break; @@ -769,72 +1114,11 @@ std::string TextDiagnostic::buildFixItInsertionLine(unsigned LineNo, } } - if (FixItInsertionLine.empty()) - return FixItInsertionLine; - - // Now that we have the entire fixit line, expand the tabs in it. - // Since we don't want to insert spaces in the middle of a word, - // find each word and the column it should line up with and insert - // spaces until they match. - unsigned FixItPos = 0; - unsigned LinePos = 0; - unsigned TabExpandedCol = 0; - unsigned LineLength = LineEnd - LineStart; - - while (FixItPos < FixItInsertionLine.size() && LinePos < LineLength) { - // Find the next word in the FixIt line. - while (FixItPos < FixItInsertionLine.size() && - FixItInsertionLine[FixItPos] == ' ') - ++FixItPos; - unsigned CharDistance = FixItPos - TabExpandedCol; - - // Walk forward in the source line, keeping track of - // the tab-expanded column. - for (unsigned I = 0; I < CharDistance; ++I, ++LinePos) - if (LinePos >= LineLength || LineStart[LinePos] != '\t') - ++TabExpandedCol; - else - TabExpandedCol = - (TabExpandedCol/DiagOpts.TabStop + 1) * DiagOpts.TabStop; - - // Adjust the fixit line to match this column. - FixItInsertionLine.insert(FixItPos, TabExpandedCol-FixItPos, ' '); - FixItPos = TabExpandedCol; - - // Walk to the end of the word. - while (FixItPos < FixItInsertionLine.size() && - FixItInsertionLine[FixItPos] != ' ') - ++FixItPos; - } + expandTabs(FixItInsertionLine, DiagOpts.TabStop); return FixItInsertionLine; } -void TextDiagnostic::expandTabs(std::string &SourceLine, - std::string &CaretLine) { - // Scan the source line, looking for tabs. If we find any, manually expand - // them to spaces and update the CaretLine to match. - for (unsigned i = 0; i != SourceLine.size(); ++i) { - if (SourceLine[i] != '\t') continue; - - // Replace this tab with at least one space. - SourceLine[i] = ' '; - - // Compute the number of spaces we need to insert. - unsigned TabStop = DiagOpts.TabStop; - assert(0 < TabStop && TabStop <= DiagnosticOptions::MaxTabStop && - "Invalid -ftabstop value"); - unsigned NumSpaces = ((i+TabStop)/TabStop * TabStop) - (i+1); - assert(NumSpaces < TabStop && "Invalid computation of space amt"); - - // Insert spaces into the SourceLine. - SourceLine.insert(i+1, NumSpaces, ' '); - - // Insert spaces or ~'s into CaretLine. - CaretLine.insert(i+1, NumSpaces, CaretLine[i] == '~' ? '~' : ' '); - } -} - void TextDiagnostic::emitParseableFixits(ArrayRef Hints) { if (!DiagOpts.ShowParseableFixits) return; @@ -878,4 +1162,3 @@ void TextDiagnostic::emitParseableFixits(ArrayRef Hints) { OS << "\"\n"; } } - diff --git a/contrib/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/contrib/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp index 20665051808..07d2b8d19f2 100644 --- a/contrib/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/contrib/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -72,7 +72,6 @@ static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) { case PrintDeclContext: return new DeclContextPrintAction(); case PrintPreamble: return new PrintPreambleAction(); case PrintPreprocessedInput: return new PrintPreprocessedAction(); - case PubnamesDump: return new PubnamesDumpAction(); case RewriteMacros: return new RewriteMacrosAction(); case RewriteObjC: return new RewriteObjCAction(); case RewriteTest: return new RewriteTestAction(); diff --git a/contrib/llvm/tools/clang/lib/Headers/avx2intrin.h b/contrib/llvm/tools/clang/lib/Headers/avx2intrin.h index d165f1fbe2d..884c46d4d68 100644 --- a/contrib/llvm/tools/clang/lib/Headers/avx2intrin.h +++ b/contrib/llvm/tools/clang/lib/Headers/avx2intrin.h @@ -822,7 +822,9 @@ _mm256_permutevar8x32_epi32(__m256i a, __m256i b) #define _mm256_permute4x64_pd(V, M) __extension__ ({ \ __m256d __V = (V); \ - (__m256d)__builtin_ia32_permdf256((__v4df)__V, (M)); }) + (__m256d)__builtin_shufflevector((__v4df)__V, (__v4df) _mm256_setzero_pd(), \ + (M) & 0x3, ((M) & 0xc) >> 2, \ + ((M) & 0x30) >> 4, ((M) & 0xc0) >> 6); }) static __inline__ __m256 __attribute__((__always_inline__, __nodebug__)) _mm256_permutevar8x32_ps(__m256 a, __m256 b) @@ -832,16 +834,14 @@ _mm256_permutevar8x32_ps(__m256 a, __m256 b) #define _mm256_permute4x64_epi64(V, M) __extension__ ({ \ __m256i __V = (V); \ - (__m256i)__builtin_ia32_permdi256(__V, (M)); }) + (__m256i)__builtin_shufflevector((__v4di)__V, (__v4di) _mm256_setzero_si256(), \ + (M) & 0x3, ((M) & 0xc) >> 2, \ + ((M) & 0x30) >> 4, ((M) & 0xc0) >> 6); }) #define _mm256_permute2x128_si256(V1, V2, M) __extension__ ({ \ __m256i __V1 = (V1); \ __m256i __V2 = (V2); \ - __builtin_shufflevector(__V1, __V2, \ - ((M) & 0x3) * 2, \ - ((M) & 0x3) * 2 + 1, \ - (((M) & 0x30) >> 4) * 2, \ - (((M) & 0x30) >> 4) * 2 + 1); }) + (__m256i)__builtin_ia32_permti256(__V1, __V2, (M)); }) #define _mm256_extracti128_si256(A, O) __extension__ ({ \ __m256i __A = (A); \ diff --git a/contrib/llvm/tools/clang/lib/Headers/avxintrin.h b/contrib/llvm/tools/clang/lib/Headers/avxintrin.h index 7a0ec3fbd63..ee7f83572f5 100644 --- a/contrib/llvm/tools/clang/lib/Headers/avxintrin.h +++ b/contrib/llvm/tools/clang/lib/Headers/avxintrin.h @@ -289,37 +289,17 @@ _mm256_permutevar_ps(__m256 a, __m256i c) #define _mm256_permute2f128_pd(V1, V2, M) __extension__ ({ \ __m256d __V1 = (V1); \ __m256d __V2 = (V2); \ - (__m256d)__builtin_shufflevector((__v4df)__V1, (__v4df)__V2, \ - ((M) & 0x3) * 2, \ - ((M) & 0x3) * 2 + 1, \ - (((M) & 0x30) >> 4) * 2, \ - (((M) & 0x30) >> 4) * 2 + 1); }) + (__m256d)__builtin_ia32_vperm2f128_pd256((__v4df)__V1, (__v4df)__V2, (M)); }) #define _mm256_permute2f128_ps(V1, V2, M) __extension__ ({ \ __m256 __V1 = (V1); \ __m256 __V2 = (V2); \ - (__m256)__builtin_shufflevector((__v8sf)__V1, (__v8sf)__V2, \ - ((M) & 0x3) * 4, \ - ((M) & 0x3) * 4 + 1, \ - ((M) & 0x3) * 4 + 2, \ - ((M) & 0x3) * 4 + 3, \ - (((M) & 0x30) >> 4) * 4, \ - (((M) & 0x30) >> 4) * 4 + 1, \ - (((M) & 0x30) >> 4) * 4 + 2, \ - (((M) & 0x30) >> 4) * 4 + 3); }) + (__m256)__builtin_ia32_vperm2f128_ps256((__v8sf)__V1, (__v8sf)__V2, (M)); }) #define _mm256_permute2f128_si256(V1, V2, M) __extension__ ({ \ __m256i __V1 = (V1); \ __m256i __V2 = (V2); \ - (__m256i)__builtin_shufflevector((__v8si)__V1, (__v8si)__V2, \ - ((M) & 0x3) * 4, \ - ((M) & 0x3) * 4 + 1, \ - ((M) & 0x3) * 4 + 2, \ - ((M) & 0x3) * 4 + 3, \ - (((M) & 0x30) >> 4) * 4, \ - (((M) & 0x30) >> 4) * 4 + 1, \ - (((M) & 0x30) >> 4) * 4 + 2, \ - (((M) & 0x30) >> 4) * 4 + 3); }) + (__m256i)__builtin_ia32_vperm2f128_si256((__v8si)__V1, (__v8si)__V2, (M)); }) /* Vector Blend */ #define _mm256_blend_pd(V1, V2, M) __extension__ ({ \ diff --git a/contrib/llvm/tools/clang/lib/Index/ASTLocation.cpp b/contrib/llvm/tools/clang/lib/Index/ASTLocation.cpp deleted file mode 100644 index fce6099dac2..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/ASTLocation.cpp +++ /dev/null @@ -1,114 +0,0 @@ -//===--- ASTLocation.cpp - A pair ------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// ASTLocation is Decl or a Stmt and its immediate Decl parent. -// -//===----------------------------------------------------------------------===// - -#include "clang/Index/ASTLocation.h" -#include "clang/AST/Decl.h" -#include "clang/AST/DeclObjC.h" -#include "clang/AST/Stmt.h" -#include "clang/AST/Expr.h" -#include "clang/AST/ExprObjC.h" -using namespace clang; -using namespace idx; - -static Decl *getDeclFromExpr(Stmt *E) { - if (DeclRefExpr *RefExpr = dyn_cast(E)) - return RefExpr->getDecl(); - if (MemberExpr *ME = dyn_cast(E)) - return ME->getMemberDecl(); - if (ObjCIvarRefExpr *RE = dyn_cast(E)) - return RE->getDecl(); - - if (CallExpr *CE = dyn_cast(E)) - return getDeclFromExpr(CE->getCallee()); - if (CastExpr *CE = dyn_cast(E)) - return getDeclFromExpr(CE->getSubExpr()); - - return 0; -} - -Decl *ASTLocation::getReferencedDecl() { - if (isInvalid()) - return 0; - - switch (getKind()) { - case N_Type: - return 0; - case N_Decl: - return D; - case N_NamedRef: - return NDRef.ND; - case N_Stmt: - return getDeclFromExpr(Stm); - } - - llvm_unreachable("Invalid ASTLocation Kind!"); -} - -SourceRange ASTLocation::getSourceRange() const { - if (isInvalid()) - return SourceRange(); - - switch (getKind()) { - case N_Decl: - return D->getSourceRange(); - case N_Stmt: - return Stm->getSourceRange(); - case N_NamedRef: - return SourceRange(AsNamedRef().Loc, AsNamedRef().Loc); - case N_Type: - return AsTypeLoc().getLocalSourceRange(); - } - - llvm_unreachable("Invalid ASTLocation Kind!"); -} - -void ASTLocation::print(raw_ostream &OS) const { - if (isInvalid()) { - OS << "<< Invalid ASTLocation >>\n"; - return; - } - - ASTContext &Ctx = getParentDecl()->getASTContext(); - - switch (getKind()) { - case N_Decl: - OS << "[Decl: " << AsDecl()->getDeclKindName() << " "; - if (const NamedDecl *ND = dyn_cast(AsDecl())) - OS << *ND; - break; - - case N_Stmt: - OS << "[Stmt: " << AsStmt()->getStmtClassName() << " "; - AsStmt()->printPretty(OS, Ctx, 0, PrintingPolicy(Ctx.getLangOpts())); - break; - - case N_NamedRef: - OS << "[NamedRef: " << AsNamedRef().ND->getDeclKindName() << " "; - OS << *AsNamedRef().ND; - break; - - case N_Type: { - QualType T = AsTypeLoc().getType(); - OS << "[Type: " << T->getTypeClassName() << " " << T.getAsString(); - } - } - - OS << "] <"; - - SourceRange Range = getSourceRange(); - SourceManager &SourceMgr = Ctx.getSourceManager(); - Range.getBegin().print(OS, SourceMgr); - OS << ", "; - Range.getEnd().print(OS, SourceMgr); - OS << ">\n"; -} diff --git a/contrib/llvm/tools/clang/lib/Index/ASTVisitor.h b/contrib/llvm/tools/clang/lib/Index/ASTVisitor.h deleted file mode 100644 index 0b8425b2f33..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/ASTVisitor.h +++ /dev/null @@ -1,143 +0,0 @@ -//===--- ASTVisitor.h - Visitor for an ASTContext ---------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines the ASTVisitor interface. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_ASTVISITOR_H -#define LLVM_CLANG_INDEX_ASTVISITOR_H - -#include "clang/AST/DeclVisitor.h" -#include "clang/AST/StmtVisitor.h" -#include "clang/AST/TypeLocVisitor.h" - -namespace clang { - -namespace idx { - -/// \brief Traverses the full AST, both Decls and Stmts. -template -class ASTVisitor : public DeclVisitor, - public StmtVisitor, - public TypeLocVisitor { -public: - ASTVisitor() : CurrentDecl(0) { } - - Decl *CurrentDecl; - - typedef ASTVisitor Base; - typedef DeclVisitor BaseDeclVisitor; - typedef StmtVisitor BaseStmtVisitor; - typedef TypeLocVisitor BaseTypeLocVisitor; - - using BaseStmtVisitor::Visit; - - //===--------------------------------------------------------------------===// - // DeclVisitor - //===--------------------------------------------------------------------===// - - void Visit(Decl *D) { - Decl *PrevDecl = CurrentDecl; - CurrentDecl = D; - BaseDeclVisitor::Visit(D); - CurrentDecl = PrevDecl; - } - - void VisitDeclaratorDecl(DeclaratorDecl *D) { - BaseDeclVisitor::VisitDeclaratorDecl(D); - if (TypeSourceInfo *TInfo = D->getTypeSourceInfo()) - Visit(TInfo->getTypeLoc()); - } - - void VisitFunctionDecl(FunctionDecl *D) { - BaseDeclVisitor::VisitFunctionDecl(D); - if (D->isThisDeclarationADefinition()) - Visit(D->getBody()); - } - - void VisitObjCMethodDecl(ObjCMethodDecl *D) { - BaseDeclVisitor::VisitObjCMethodDecl(D); - if (D->getBody()) - Visit(D->getBody()); - } - - void VisitBlockDecl(BlockDecl *D) { - BaseDeclVisitor::VisitBlockDecl(D); - Visit(D->getBody()); - } - - void VisitVarDecl(VarDecl *D) { - BaseDeclVisitor::VisitVarDecl(D); - if (Expr *Init = D->getInit()) - Visit(Init); - } - - void VisitDecl(Decl *D) { - if (isa(D) || isa(D) || isa(D)) - return; - - if (DeclContext *DC = dyn_cast(D)) - static_cast(this)->VisitDeclContext(DC); - } - - void VisitDeclContext(DeclContext *DC) { - for (DeclContext::decl_iterator - I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I) - Visit(*I); - } - - //===--------------------------------------------------------------------===// - // StmtVisitor - //===--------------------------------------------------------------------===// - - void VisitDeclStmt(DeclStmt *Node) { - for (DeclStmt::decl_iterator - I = Node->decl_begin(), E = Node->decl_end(); I != E; ++I) - Visit(*I); - } - - void VisitBlockExpr(BlockExpr *Node) { - // The BlockDecl is also visited by 'VisitDeclContext()'. No need to visit it twice. - } - - void VisitStmt(Stmt *Node) { - for (Stmt::child_range I = Node->children(); I; ++I) - if (*I) - Visit(*I); - } - - //===--------------------------------------------------------------------===// - // TypeLocVisitor - //===--------------------------------------------------------------------===// - - void Visit(TypeLoc TL) { - for (; TL; TL = TL.getNextTypeLoc()) - BaseTypeLocVisitor::Visit(TL); - } - - void VisitArrayLoc(ArrayTypeLoc TL) { - BaseTypeLocVisitor::VisitArrayTypeLoc(TL); - if (TL.getSizeExpr()) - Visit(TL.getSizeExpr()); - } - - void VisitFunctionTypeLoc(FunctionTypeLoc TL) { - BaseTypeLocVisitor::VisitFunctionTypeLoc(TL); - for (unsigned i = 0; i != TL.getNumArgs(); ++i) - Visit(TL.getArg(i)); - } - -}; - -} // namespace idx - -} // namespace clang - -#endif diff --git a/contrib/llvm/tools/clang/lib/Index/Analyzer.cpp b/contrib/llvm/tools/clang/lib/Index/Analyzer.cpp deleted file mode 100644 index f77e6ef92d6..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/Analyzer.cpp +++ /dev/null @@ -1,470 +0,0 @@ -//===--- Analyzer.cpp - Analysis for indexing information -------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Analyzer interface. -// -//===----------------------------------------------------------------------===// - -#include "clang/Index/Analyzer.h" -#include "clang/Index/Entity.h" -#include "clang/Index/TranslationUnit.h" -#include "clang/Index/Handlers.h" -#include "clang/Index/ASTLocation.h" -#include "clang/Index/GlobalSelector.h" -#include "clang/Index/DeclReferenceMap.h" -#include "clang/Index/SelectorMap.h" -#include "clang/Index/IndexProvider.h" -#include "clang/AST/DeclObjC.h" -#include "clang/AST/ExprObjC.h" -#include "llvm/ADT/SmallSet.h" -using namespace clang; -using namespace idx; - -namespace { - -//===----------------------------------------------------------------------===// -// DeclEntityAnalyzer Implementation -//===----------------------------------------------------------------------===// - -class DeclEntityAnalyzer : public TranslationUnitHandler { - Entity Ent; - TULocationHandler &TULocHandler; - -public: - DeclEntityAnalyzer(Entity ent, TULocationHandler &handler) - : Ent(ent), TULocHandler(handler) { } - - virtual void Handle(TranslationUnit *TU) { - assert(TU && "Passed null translation unit"); - - Decl *D = Ent.getDecl(TU->getASTContext()); - assert(D && "Couldn't resolve Entity"); - - for (Decl::redecl_iterator I = D->redecls_begin(), - E = D->redecls_end(); I != E; ++I) - TULocHandler.Handle(TULocation(TU, ASTLocation(*I))); - } -}; - -//===----------------------------------------------------------------------===// -// RefEntityAnalyzer Implementation -//===----------------------------------------------------------------------===// - -class RefEntityAnalyzer : public TranslationUnitHandler { - Entity Ent; - TULocationHandler &TULocHandler; - -public: - RefEntityAnalyzer(Entity ent, TULocationHandler &handler) - : Ent(ent), TULocHandler(handler) { } - - virtual void Handle(TranslationUnit *TU) { - assert(TU && "Passed null translation unit"); - - Decl *D = Ent.getDecl(TU->getASTContext()); - assert(D && "Couldn't resolve Entity"); - NamedDecl *ND = dyn_cast(D); - if (!ND) - return; - - DeclReferenceMap &RefMap = TU->getDeclReferenceMap(); - for (DeclReferenceMap::astlocation_iterator - I = RefMap.refs_begin(ND), E = RefMap.refs_end(ND); I != E; ++I) - TULocHandler.Handle(TULocation(TU, *I)); - } -}; - -//===----------------------------------------------------------------------===// -// RefSelectorAnalyzer Implementation -//===----------------------------------------------------------------------===// - -/// \brief Accepts an ObjC method and finds all message expressions that this -/// method may respond to. -class RefSelectorAnalyzer : public TranslationUnitHandler { - Program &Prog; - TULocationHandler &TULocHandler; - - // The original ObjCInterface associated with the method. - Entity IFaceEnt; - GlobalSelector GlobSel; - bool IsInstanceMethod; - - /// \brief Super classes of the ObjCInterface. - typedef llvm::SmallSet EntitiesSetTy; - EntitiesSetTy HierarchyEntities; - -public: - RefSelectorAnalyzer(ObjCMethodDecl *MD, - Program &prog, TULocationHandler &handler) - : Prog(prog), TULocHandler(handler) { - assert(MD); - - // FIXME: Protocol methods. - assert(!isa(MD->getDeclContext()) && - "Protocol methods not supported yet"); - - ObjCInterfaceDecl *IFD = MD->getClassInterface(); - assert(IFD); - IFaceEnt = Entity::get(IFD, Prog); - GlobSel = GlobalSelector::get(MD->getSelector(), Prog); - IsInstanceMethod = MD->isInstanceMethod(); - - for (ObjCInterfaceDecl *Cls = IFD->getSuperClass(); - Cls; Cls = Cls->getSuperClass()) - HierarchyEntities.insert(Entity::get(Cls, Prog)); - } - - virtual void Handle(TranslationUnit *TU) { - assert(TU && "Passed null translation unit"); - - ASTContext &Ctx = TU->getASTContext(); - // Null means it doesn't exist in this translation unit. - ObjCInterfaceDecl *IFace = - cast_or_null(IFaceEnt.getDecl(Ctx)); - Selector Sel = GlobSel.getSelector(Ctx); - - SelectorMap &SelMap = TU->getSelectorMap(); - for (SelectorMap::astlocation_iterator - I = SelMap.refs_begin(Sel), E = SelMap.refs_end(Sel); I != E; ++I) { - if (ValidReference(*I, IFace)) - TULocHandler.Handle(TULocation(TU, *I)); - } - } - - /// \brief Determines whether the given message expression is likely to end - /// up at the given interface decl. - /// - /// It returns true "eagerly", meaning it will return false only if it can - /// "prove" statically that the interface cannot accept this message. - bool ValidReference(ASTLocation ASTLoc, ObjCInterfaceDecl *IFace) { - assert(ASTLoc.isStmt()); - - // FIXME: Finding @selector references should be through another Analyzer - // method, like FindSelectors. - if (isa(ASTLoc.AsStmt())) - return false; - - ObjCInterfaceDecl *MsgD = 0; - ObjCMessageExpr *Msg = cast(ASTLoc.AsStmt()); - - switch (Msg->getReceiverKind()) { - case ObjCMessageExpr::Instance: { - const ObjCObjectPointerType *OPT = - Msg->getInstanceReceiver()->getType()->getAsObjCInterfacePointerType(); - - // Can be anything! Accept it as a possibility.. - if (!OPT || OPT->isObjCIdType() || OPT->isObjCQualifiedIdType()) - return true; - - // Expecting class method. - if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) - return !IsInstanceMethod; - - MsgD = OPT->getInterfaceDecl(); - assert(MsgD); - - // Should be an instance method. - if (!IsInstanceMethod) - return false; - break; - } - - case ObjCMessageExpr::Class: { - // Expecting class method. - if (IsInstanceMethod) - return false; - - MsgD = Msg->getClassReceiver()->getAs()->getInterface(); - break; - } - - case ObjCMessageExpr::SuperClass: - // Expecting class method. - if (IsInstanceMethod) - return false; - - MsgD = Msg->getSuperType()->getAs()->getInterface(); - break; - - case ObjCMessageExpr::SuperInstance: - // Expecting instance method. - if (!IsInstanceMethod) - return false; - - MsgD = Msg->getSuperType()->getAs() - ->getInterfaceDecl(); - break; - } - - assert(MsgD); - - // Same interface ? We have a winner! - if (declaresSameEntity(MsgD, IFace)) - return true; - - // If the message interface is a superclass of the original interface, - // accept this message as a possibility. - if (HierarchyEntities.count(Entity::get(MsgD, Prog))) - return true; - - // If the message interface is a subclass of the original interface, accept - // the message unless there is a subclass in the hierarchy that will - // "steal" the message (thus the message "will go" to the subclass and not - /// the original interface). - if (IFace) { - Selector Sel = Msg->getSelector(); - for (ObjCInterfaceDecl *Cls = MsgD; Cls; Cls = Cls->getSuperClass()) { - if (declaresSameEntity(Cls, IFace)) - return true; - if (Cls->getMethod(Sel, IsInstanceMethod)) - return false; - } - } - - // The interfaces are unrelated, don't accept the message. - return false; - } -}; - -//===----------------------------------------------------------------------===// -// MessageAnalyzer Implementation -//===----------------------------------------------------------------------===// - -/// \brief Accepts an ObjC message expression and finds all methods that may -/// respond to it. -class MessageAnalyzer : public TranslationUnitHandler { - Program &Prog; - TULocationHandler &TULocHandler; - - // The ObjCInterface associated with the message. Can be null/invalid. - Entity MsgIFaceEnt; - GlobalSelector GlobSel; - bool CanBeInstanceMethod; - bool CanBeClassMethod; - - /// \brief Super classes of the ObjCInterface. - typedef llvm::SmallSet EntitiesSetTy; - EntitiesSetTy HierarchyEntities; - - /// \brief The interface in the message interface hierarchy that "intercepts" - /// the selector. - Entity ReceiverIFaceEnt; - -public: - MessageAnalyzer(ObjCMessageExpr *Msg, - Program &prog, TULocationHandler &handler) - : Prog(prog), TULocHandler(handler), - CanBeInstanceMethod(false), - CanBeClassMethod(false) { - - assert(Msg); - - ObjCInterfaceDecl *MsgD = 0; - - while (true) { - switch (Msg->getReceiverKind()) { - case ObjCMessageExpr::Instance: { - const ObjCObjectPointerType *OPT = - Msg->getInstanceReceiver()->getType() - ->getAsObjCInterfacePointerType(); - - if (!OPT || OPT->isObjCIdType() || OPT->isObjCQualifiedIdType()) { - CanBeInstanceMethod = CanBeClassMethod = true; - break; - } - - if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) { - CanBeClassMethod = true; - break; - } - - MsgD = OPT->getInterfaceDecl(); - assert(MsgD); - CanBeInstanceMethod = true; - break; - } - - case ObjCMessageExpr::Class: - CanBeClassMethod = true; - MsgD = Msg->getClassReceiver()->getAs()->getInterface(); - break; - - case ObjCMessageExpr::SuperClass: - CanBeClassMethod = true; - MsgD = Msg->getSuperType()->getAs()->getInterface(); - break; - - case ObjCMessageExpr::SuperInstance: - CanBeInstanceMethod = true; - MsgD = Msg->getSuperType()->getAs() - ->getInterfaceDecl(); - break; - } - } - - assert(CanBeInstanceMethod || CanBeClassMethod); - - Selector sel = Msg->getSelector(); - assert(!sel.isNull()); - - MsgIFaceEnt = Entity::get(MsgD, Prog); - GlobSel = GlobalSelector::get(sel, Prog); - - if (MsgD) { - for (ObjCInterfaceDecl *Cls = MsgD->getSuperClass(); - Cls; Cls = Cls->getSuperClass()) - HierarchyEntities.insert(Entity::get(Cls, Prog)); - - // Find the interface in the hierarchy that "receives" the message. - for (ObjCInterfaceDecl *Cls = MsgD; Cls; Cls = Cls->getSuperClass()) { - bool isReceiver = false; - - ObjCInterfaceDecl::lookup_const_iterator Meth, MethEnd; - for (llvm::tie(Meth, MethEnd) = Cls->lookup(sel); - Meth != MethEnd; ++Meth) { - if (ObjCMethodDecl *MD = dyn_cast(*Meth)) - if ((MD->isInstanceMethod() && CanBeInstanceMethod) || - (MD->isClassMethod() && CanBeClassMethod)) { - isReceiver = true; - break; - } - } - - if (isReceiver) { - ReceiverIFaceEnt = Entity::get(Cls, Prog); - break; - } - } - } - } - - virtual void Handle(TranslationUnit *TU) { - assert(TU && "Passed null translation unit"); - ASTContext &Ctx = TU->getASTContext(); - - // Null means it doesn't exist in this translation unit or there was no - // interface that was determined to receive the original message. - ObjCInterfaceDecl *ReceiverIFace = - cast_or_null(ReceiverIFaceEnt.getDecl(Ctx)); - - // No subclass for the original receiver interface, so it remains the - // receiver. - if (ReceiverIFaceEnt.isValid() && ReceiverIFace == 0) - return; - - // Null means it doesn't exist in this translation unit or there was no - // interface associated with the message in the first place. - ObjCInterfaceDecl *MsgIFace = - cast_or_null(MsgIFaceEnt.getDecl(Ctx)); - - Selector Sel = GlobSel.getSelector(Ctx); - SelectorMap &SelMap = TU->getSelectorMap(); - for (SelectorMap::method_iterator - I = SelMap.methods_begin(Sel), E = SelMap.methods_end(Sel); - I != E; ++I) { - ObjCMethodDecl *D = *I; - if (ValidMethod(D, MsgIFace, ReceiverIFace)) { - for (ObjCMethodDecl::redecl_iterator - RI = D->redecls_begin(), RE = D->redecls_end(); RI != RE; ++RI) - TULocHandler.Handle(TULocation(TU, ASTLocation(*RI))); - } - } - } - - /// \brief Determines whether the given method is likely to accept the - /// original message. - /// - /// It returns true "eagerly", meaning it will return false only if it can - /// "prove" statically that the method cannot accept the original message. - bool ValidMethod(ObjCMethodDecl *D, ObjCInterfaceDecl *MsgIFace, - ObjCInterfaceDecl *ReceiverIFace) { - assert(D); - - // FIXME: Protocol methods ? - if (isa(D->getDeclContext())) - return false; - - // No specific interface associated with the message. Can be anything. - if (MsgIFaceEnt.isInvalid()) - return true; - - if ((!CanBeInstanceMethod && D->isInstanceMethod()) || - (!CanBeClassMethod && D->isClassMethod())) - return false; - - ObjCInterfaceDecl *IFace = D->getClassInterface(); - assert(IFace); - - // If the original message interface is the same or a superclass of the - // given interface, accept the method as a possibility. - if (MsgIFace && MsgIFace->isSuperClassOf(IFace)) - return true; - - if (ReceiverIFace) { - // The given interface, "overrides" the receiver. - if (ReceiverIFace->isSuperClassOf(IFace)) - return true; - } else { - // No receiver was found for the original message. - assert(ReceiverIFaceEnt.isInvalid()); - - // If the original message interface is a subclass of the given interface, - // accept the message. - if (HierarchyEntities.count(Entity::get(IFace, Prog))) - return true; - } - - // The interfaces are unrelated, or the receiver interface wasn't - // "overriden". - return false; - } -}; - -} // end anonymous namespace - -//===----------------------------------------------------------------------===// -// Analyzer Implementation -//===----------------------------------------------------------------------===// - -void Analyzer::FindDeclarations(Decl *D, TULocationHandler &Handler) { - assert(D && "Passed null declaration"); - Entity Ent = Entity::get(D, Prog); - if (Ent.isInvalid()) - return; - - DeclEntityAnalyzer DEA(Ent, Handler); - Idxer.GetTranslationUnitsFor(Ent, DEA); -} - -void Analyzer::FindReferences(Decl *D, TULocationHandler &Handler) { - assert(D && "Passed null declaration"); - if (ObjCMethodDecl *MD = dyn_cast(D)) { - RefSelectorAnalyzer RSA(MD, Prog, Handler); - GlobalSelector Sel = GlobalSelector::get(MD->getSelector(), Prog); - Idxer.GetTranslationUnitsFor(Sel, RSA); - return; - } - - Entity Ent = Entity::get(D, Prog); - if (Ent.isInvalid()) - return; - - RefEntityAnalyzer REA(Ent, Handler); - Idxer.GetTranslationUnitsFor(Ent, REA); -} - -/// \brief Find methods that may respond to the given message and pass them -/// to Handler. -void Analyzer::FindObjCMethods(ObjCMessageExpr *Msg, - TULocationHandler &Handler) { - assert(Msg); - MessageAnalyzer MsgAnalyz(Msg, Prog, Handler); - GlobalSelector GlobSel = GlobalSelector::get(Msg->getSelector(), Prog); - Idxer.GetTranslationUnitsFor(GlobSel, MsgAnalyz); -} diff --git a/contrib/llvm/tools/clang/lib/Index/DeclReferenceMap.cpp b/contrib/llvm/tools/clang/lib/Index/DeclReferenceMap.cpp deleted file mode 100644 index 3fd4336230e..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/DeclReferenceMap.cpp +++ /dev/null @@ -1,90 +0,0 @@ -//===--- DeclReferenceMap.cpp - Map Decls to their references -------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// DeclReferenceMap creates a mapping from Decls to the ASTLocations that -// reference them. -// -//===----------------------------------------------------------------------===// - -#include "clang/Index/DeclReferenceMap.h" -#include "clang/Index/ASTLocation.h" -#include "ASTVisitor.h" -using namespace clang; -using namespace idx; - -namespace { - -class RefMapper : public ASTVisitor { - DeclReferenceMap::MapTy ⤅ - -public: - RefMapper(DeclReferenceMap::MapTy &map) : Map(map) { } - - void VisitDeclRefExpr(DeclRefExpr *Node); - void VisitMemberExpr(MemberExpr *Node); - void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node); - - void VisitTypedefTypeLoc(TypedefTypeLoc TL); - void VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL); -}; - -} // anonymous namespace - -//===----------------------------------------------------------------------===// -// RefMapper Implementation -//===----------------------------------------------------------------------===// - -void RefMapper::VisitDeclRefExpr(DeclRefExpr *Node) { - NamedDecl *PrimD = cast(Node->getDecl()->getCanonicalDecl()); - Map.insert(std::make_pair(PrimD, ASTLocation(CurrentDecl, Node))); -} - -void RefMapper::VisitMemberExpr(MemberExpr *Node) { - NamedDecl *PrimD = cast(Node->getMemberDecl()->getCanonicalDecl()); - Map.insert(std::make_pair(PrimD, ASTLocation(CurrentDecl, Node))); -} - -void RefMapper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { - Map.insert(std::make_pair(Node->getDecl(), ASTLocation(CurrentDecl, Node))); -} - -void RefMapper::VisitTypedefTypeLoc(TypedefTypeLoc TL) { - NamedDecl *ND = TL.getTypedefNameDecl(); - Map.insert(std::make_pair(ND, ASTLocation(CurrentDecl, ND, TL.getNameLoc()))); -} - -void RefMapper::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { - NamedDecl *ND = TL.getIFaceDecl(); - Map.insert(std::make_pair(ND, ASTLocation(CurrentDecl, ND, TL.getNameLoc()))); -} - -//===----------------------------------------------------------------------===// -// DeclReferenceMap Implementation -//===----------------------------------------------------------------------===// - -DeclReferenceMap::DeclReferenceMap(ASTContext &Ctx) { - RefMapper(Map).Visit(Ctx.getTranslationUnitDecl()); -} - -DeclReferenceMap::astlocation_iterator -DeclReferenceMap::refs_begin(NamedDecl *D) const { - NamedDecl *Prim = cast(D->getCanonicalDecl()); - return astlocation_iterator(Map.lower_bound(Prim)); -} - -DeclReferenceMap::astlocation_iterator -DeclReferenceMap::refs_end(NamedDecl *D) const { - NamedDecl *Prim = cast(D->getCanonicalDecl()); - return astlocation_iterator(Map.upper_bound(Prim)); -} - -bool DeclReferenceMap::refs_empty(NamedDecl *D) const { - NamedDecl *Prim = cast(D->getCanonicalDecl()); - return refs_begin(Prim) == refs_end(Prim); -} diff --git a/contrib/llvm/tools/clang/lib/Index/Entity.cpp b/contrib/llvm/tools/clang/lib/Index/Entity.cpp deleted file mode 100644 index fbab6d8684f..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/Entity.cpp +++ /dev/null @@ -1,270 +0,0 @@ -//===--- Entity.cpp - Cross-translation-unit "token" for decls ------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Entity is a ASTContext-independent way to refer to declarations that are -// visible across translation units. -// -//===----------------------------------------------------------------------===// - -#include "EntityImpl.h" -#include "ProgramImpl.h" -#include "clang/Index/Program.h" -#include "clang/Index/GlobalSelector.h" -#include "clang/AST/Decl.h" -#include "clang/AST/ASTContext.h" -#include "clang/AST/DeclVisitor.h" -using namespace clang; -using namespace idx; - -// FIXME: Entity is really really basic currently, mostly written to work -// on variables and functions. Should support types and other decls eventually.. - - -//===----------------------------------------------------------------------===// -// EntityGetter -//===----------------------------------------------------------------------===// - -namespace clang { -namespace idx { - -/// \brief Gets the Entity associated with a Decl. -class EntityGetter : public DeclVisitor { - Program &Prog; - ProgramImpl &ProgImpl; - -public: - EntityGetter(Program &prog, ProgramImpl &progImpl) - : Prog(prog), ProgImpl(progImpl) { } - - // Get an Entity. - Entity getEntity(Entity Parent, DeclarationName Name, - unsigned IdNS, bool isObjCInstanceMethod); - - // Get an Entity associated with the name in the global namespace. - Entity getGlobalEntity(StringRef Name); - - Entity VisitNamedDecl(NamedDecl *D); - Entity VisitVarDecl(VarDecl *D); - Entity VisitFieldDecl(FieldDecl *D); - Entity VisitFunctionDecl(FunctionDecl *D); - Entity VisitTypeDecl(TypeDecl *D); -}; - -} -} - -Entity EntityGetter::getEntity(Entity Parent, DeclarationName Name, - unsigned IdNS, bool isObjCInstanceMethod) { - llvm::FoldingSetNodeID ID; - EntityImpl::Profile(ID, Parent, Name, IdNS, isObjCInstanceMethod); - - ProgramImpl::EntitySetTy &Entities = ProgImpl.getEntities(); - void *InsertPos = 0; - if (EntityImpl *Ent = Entities.FindNodeOrInsertPos(ID, InsertPos)) - return Entity(Ent); - - void *Buf = ProgImpl.Allocate(sizeof(EntityImpl)); - EntityImpl *New = - new (Buf) EntityImpl(Parent, Name, IdNS, isObjCInstanceMethod); - Entities.InsertNode(New, InsertPos); - - return Entity(New); -} - -Entity EntityGetter::getGlobalEntity(StringRef Name) { - IdentifierInfo *II = &ProgImpl.getIdents().get(Name); - DeclarationName GlobName(II); - unsigned IdNS = Decl::IDNS_Ordinary; - return getEntity(Entity(), GlobName, IdNS, false); -} - -Entity EntityGetter::VisitNamedDecl(NamedDecl *D) { - Entity Parent; - if (!D->getDeclContext()->isTranslationUnit()) { - Parent = Visit(cast(D->getDeclContext())); - // FIXME: Anonymous structs ? - if (Parent.isInvalid()) - return Entity(); - } - if (Parent.isValid() && Parent.isInternalToTU()) - return Entity(D); - - // FIXME: Only works for DeclarationNames that are identifiers and selectors. - // Treats other DeclarationNames as internal Decls for now.. - - DeclarationName LocalName = D->getDeclName(); - if (!LocalName) - return Entity(D); - - DeclarationName GlobName; - - if (IdentifierInfo *II = LocalName.getAsIdentifierInfo()) { - IdentifierInfo *GlobII = &ProgImpl.getIdents().get(II->getName()); - GlobName = DeclarationName(GlobII); - } else { - Selector LocalSel = LocalName.getObjCSelector(); - - // Treats other DeclarationNames as internal Decls for now.. - if (LocalSel.isNull()) - return Entity(D); - - Selector GlobSel = - (uintptr_t)GlobalSelector::get(LocalSel, Prog).getAsOpaquePtr(); - GlobName = DeclarationName(GlobSel); - } - - assert(GlobName); - - unsigned IdNS = D->getIdentifierNamespace(); - - ObjCMethodDecl *MD = dyn_cast(D); - bool isObjCInstanceMethod = MD && MD->isInstanceMethod(); - return getEntity(Parent, GlobName, IdNS, isObjCInstanceMethod); -} - -Entity EntityGetter::VisitVarDecl(VarDecl *D) { - // Local variables have no linkage, make invalid Entities. - if (D->hasLocalStorage()) - return Entity(); - - // If it's static it cannot be referred to by another translation unit. - if (D->getStorageClass() == SC_Static) - return Entity(D); - - return VisitNamedDecl(D); -} - -Entity EntityGetter::VisitFunctionDecl(FunctionDecl *D) { - // If it's static it cannot be referred to by another translation unit. - if (D->getStorageClass() == SC_Static) - return Entity(D); - - return VisitNamedDecl(D); -} - -Entity EntityGetter::VisitFieldDecl(FieldDecl *D) { - // Make FieldDecl an invalid Entity since it has no linkage. - return Entity(); -} - -Entity EntityGetter::VisitTypeDecl(TypeDecl *D) { - // Although in C++ class name has external linkage, usually the definition of - // the class is available in the same translation unit when it's needed. So we - // make all of them invalid Entity. - return Entity(); -} - -//===----------------------------------------------------------------------===// -// EntityImpl Implementation -//===----------------------------------------------------------------------===// - -Decl *EntityImpl::getDecl(ASTContext &AST) { - DeclContext *DC = - Parent.isInvalid() ? AST.getTranslationUnitDecl() - : cast(Parent.getDecl(AST)); - if (!DC) - return 0; // Couldn't get the parent context. - - DeclarationName LocalName; - - if (IdentifierInfo *GlobII = Name.getAsIdentifierInfo()) { - IdentifierInfo &II = AST.Idents.get(GlobII->getName()); - LocalName = DeclarationName(&II); - } else { - Selector GlobSel = Name.getObjCSelector(); - assert(!GlobSel.isNull() && "A not handled yet declaration name"); - GlobalSelector GSel = - GlobalSelector::getFromOpaquePtr(GlobSel.getAsOpaquePtr()); - LocalName = GSel.getSelector(AST); - } - - assert(LocalName); - - DeclContext::lookup_result Res = DC->lookup(LocalName); - for (DeclContext::lookup_iterator I = Res.first, E = Res.second; I!=E; ++I) { - Decl *D = *I; - if (D->getIdentifierNamespace() == IdNS) { - if (ObjCMethodDecl *MD = dyn_cast(D)) { - if (MD->isInstanceMethod() == IsObjCInstanceMethod) - return MD; - } else - return D; - } - } - - return 0; // Failed to find a decl using this Entity. -} - -/// \brief Get an Entity associated with the given Decl. -/// \returns Null if an Entity cannot refer to this Decl. -Entity EntityImpl::get(Decl *D, Program &Prog, ProgramImpl &ProgImpl) { - assert(D && "Passed null Decl"); - return EntityGetter(Prog, ProgImpl).Visit(D); -} - -/// \brief Get an Entity associated with a global name. -Entity EntityImpl::get(StringRef Name, Program &Prog, - ProgramImpl &ProgImpl) { - return EntityGetter(Prog, ProgImpl).getGlobalEntity(Name); -} - -std::string EntityImpl::getPrintableName() { - return Name.getAsString(); -} - -//===----------------------------------------------------------------------===// -// Entity Implementation -//===----------------------------------------------------------------------===// - -Entity::Entity(Decl *D) : Val(D->getCanonicalDecl()) { } - -/// \brief Find the Decl that can be referred to by this entity. -Decl *Entity::getDecl(ASTContext &AST) const { - if (isInvalid()) - return 0; - - if (Decl *D = Val.dyn_cast()) - // Check that the passed AST is actually the one that this Decl belongs to. - return (&D->getASTContext() == &AST) ? D : 0; - - return Val.get()->getDecl(AST); -} - -std::string Entity::getPrintableName() const { - if (isInvalid()) - return "<< Invalid >>"; - - if (Decl *D = Val.dyn_cast()) { - if (NamedDecl *ND = dyn_cast(D)) - return ND->getNameAsString(); - else - return std::string(); - } - - return Val.get()->getPrintableName(); -} - -/// \brief Get an Entity associated with the given Decl. -/// \returns Null if an Entity cannot refer to this Decl. -Entity Entity::get(Decl *D, Program &Prog) { - if (D == 0) - return Entity(); - ProgramImpl &ProgImpl = *static_cast(Prog.Impl); - return EntityImpl::get(D, Prog, ProgImpl); -} - -Entity Entity::get(StringRef Name, Program &Prog) { - ProgramImpl &ProgImpl = *static_cast(Prog.Impl); - return EntityImpl::get(Name, Prog, ProgImpl); -} - -unsigned -llvm::DenseMapInfo::getHashValue(Entity E) { - return DenseMapInfo::getHashValue(E.getAsOpaquePtr()); -} diff --git a/contrib/llvm/tools/clang/lib/Index/EntityImpl.h b/contrib/llvm/tools/clang/lib/Index/EntityImpl.h deleted file mode 100644 index 6d6a0c6d2b6..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/EntityImpl.h +++ /dev/null @@ -1,71 +0,0 @@ -//===--- EntityImpl.h - Internal Entity implementation---------*- C++ -*-=====// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Internal implementation for the Entity class -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_ENTITYIMPL_H -#define LLVM_CLANG_INDEX_ENTITYIMPL_H - -#include "clang/Index/Entity.h" -#include "clang/AST/DeclarationName.h" -#include "llvm/ADT/FoldingSet.h" -#include "llvm/ADT/StringSet.h" - -namespace clang { - -namespace idx { - class ProgramImpl; - -class EntityImpl : public llvm::FoldingSetNode { - Entity Parent; - DeclarationName Name; - - /// \brief Identifier namespace. - unsigned IdNS; - - /// \brief If Name is a selector, this keeps track whether it's for an - /// instance method. - bool IsObjCInstanceMethod; - -public: - EntityImpl(Entity parent, DeclarationName name, unsigned idNS, - bool isObjCInstanceMethod) - : Parent(parent), Name(name), IdNS(idNS), - IsObjCInstanceMethod(isObjCInstanceMethod) { } - - /// \brief Find the Decl that can be referred to by this entity. - Decl *getDecl(ASTContext &AST); - - /// \brief Get an Entity associated with the given Decl. - /// \returns Null if an Entity cannot refer to this Decl. - static Entity get(Decl *D, Program &Prog, ProgramImpl &ProgImpl); - static Entity get(StringRef Name, Program &Prog, ProgramImpl &ProgImpl); - - std::string getPrintableName(); - - void Profile(llvm::FoldingSetNodeID &ID) const { - Profile(ID, Parent, Name, IdNS, IsObjCInstanceMethod); - } - static void Profile(llvm::FoldingSetNodeID &ID, Entity Parent, - DeclarationName Name, unsigned IdNS, - bool isObjCInstanceMethod) { - ID.AddPointer(Parent.getAsOpaquePtr()); - ID.AddPointer(Name.getAsOpaquePtr()); - ID.AddInteger(IdNS); - ID.AddBoolean(isObjCInstanceMethod); - } -}; - -} // namespace idx - -} // namespace clang - -#endif diff --git a/contrib/llvm/tools/clang/lib/Index/GlobalCallGraph.cpp b/contrib/llvm/tools/clang/lib/Index/GlobalCallGraph.cpp deleted file mode 100644 index a21b52ae602..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/GlobalCallGraph.cpp +++ /dev/null @@ -1,152 +0,0 @@ -//== GlobalCallGraph.cpp - Call graph building ------------------*- C++ -*--==// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defined the CallGraph and CGBuilder classes. -// -//===----------------------------------------------------------------------===// - -#include "clang/Index/GlobalCallGraph.h" - -#include "clang/AST/ASTContext.h" -#include "clang/AST/StmtVisitor.h" - -#include "llvm/Support/GraphWriter.h" - -using namespace clang::idx; -using clang::FunctionDecl; -using clang::DeclContext; -using clang::ASTContext; - -namespace { -class CGBuilder : public StmtVisitor { - - CallGraph &G; - FunctionDecl *FD; - - Entity CallerEnt; - - CallGraphNode *CallerNode; - -public: - CGBuilder(CallGraph &g, FunctionDecl *fd, Entity E, CallGraphNode *N) - : G(g), FD(fd), CallerEnt(E), CallerNode(N) {} - - void VisitStmt(Stmt *S) { VisitChildren(S); } - - void VisitCallExpr(CallExpr *CE); - - void VisitChildren(Stmt *S) { - for (Stmt::child_range I = S->children(); I; ++I) - if (*I) - static_cast(this)->Visit(*I); - } -}; -} - -void CGBuilder::VisitCallExpr(CallExpr *CE) { - if (FunctionDecl *CalleeDecl = CE->getDirectCallee()) { - Entity Ent = Entity::get(CalleeDecl, G.getProgram()); - CallGraphNode *CalleeNode = G.getOrInsertFunction(Ent); - CallerNode->addCallee(ASTLocation(FD, CE), CalleeNode); - } -} - -CallGraph::CallGraph(Program &P) : Prog(P), Root(0) { - ExternalCallingNode = getOrInsertFunction(Entity()); -} - -CallGraph::~CallGraph() { - if (!FunctionMap.empty()) { - for (FunctionMapTy::iterator I = FunctionMap.begin(), E = FunctionMap.end(); - I != E; ++I) - delete I->second; - FunctionMap.clear(); - } -} - -void CallGraph::addTU(ASTContext& Ctx) { - DeclContext *DC = Ctx.getTranslationUnitDecl(); - for (DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end(); - I != E; ++I) { - - if (FunctionDecl *FD = dyn_cast(*I)) { - if (FD->doesThisDeclarationHaveABody()) { - // Set caller's ASTContext. - Entity Ent = Entity::get(FD, Prog); - CallGraphNode *Node = getOrInsertFunction(Ent); - CallerCtx[Node] = &Ctx; - - // If this function has external linkage, anything could call it. - if (FD->isGlobal()) - ExternalCallingNode->addCallee(idx::ASTLocation(), Node); - - // Set root node to 'main' function. - if (FD->getNameAsString() == "main") - Root = Node; - - CGBuilder builder(*this, FD, Ent, Node); - builder.Visit(FD->getBody()); - } - } - } -} - -CallGraphNode *CallGraph::getOrInsertFunction(Entity F) { - CallGraphNode *&Node = FunctionMap[F]; - if (Node) - return Node; - - return Node = new CallGraphNode(F); -} - -Decl *CallGraph::getDecl(CallGraphNode *Node) { - // Get the function's context. - ASTContext *Ctx = CallerCtx[Node]; - - return Node->getDecl(*Ctx); -} - -void CallGraph::print(raw_ostream &os) { - for (iterator I = begin(), E = end(); I != E; ++I) { - if (I->second->hasCallee()) { - os << "function: " << I->first.getPrintableName() - << " calls:\n"; - for (CallGraphNode::iterator CI = I->second->begin(), - CE = I->second->end(); CI != CE; ++CI) { - os << " " << CI->second->getName(); - } - os << '\n'; - } - } -} - -void CallGraph::dump() { - print(llvm::errs()); -} - -void CallGraph::ViewCallGraph() const { - llvm::ViewGraph(*this, "CallGraph"); -} - -namespace llvm { - -template <> -struct DOTGraphTraits : public DefaultDOTGraphTraits { - - DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {} - - static std::string getNodeLabel(const CallGraphNode *Node, - const CallGraph &CG) { - return Node->getName(); - - } - -}; - -} diff --git a/contrib/llvm/tools/clang/lib/Index/GlobalSelector.cpp b/contrib/llvm/tools/clang/lib/Index/GlobalSelector.cpp deleted file mode 100644 index 2fe6f95ec9b..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/GlobalSelector.cpp +++ /dev/null @@ -1,71 +0,0 @@ -//===-- GlobalSelector.cpp - Cross-translation-unit "token" for selectors -===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// GlobalSelector is a ASTContext-independent way to refer to selectors. -// -//===----------------------------------------------------------------------===// - -#include "clang/Index/GlobalSelector.h" -#include "ProgramImpl.h" -#include "clang/Index/Program.h" -#include "clang/AST/ASTContext.h" -using namespace clang; -using namespace idx; - -/// \brief Get the ASTContext-specific selector. -Selector GlobalSelector::getSelector(ASTContext &AST) const { - if (isInvalid()) - return Selector(); - - Selector GlobSel = Selector(reinterpret_cast(Val)); - - SmallVector Ids; - for (unsigned i = 0, e = GlobSel.isUnarySelector() ? 1 : GlobSel.getNumArgs(); - i != e; ++i) { - IdentifierInfo *GlobII = GlobSel.getIdentifierInfoForSlot(i); - IdentifierInfo *II = &AST.Idents.get(GlobII->getName()); - Ids.push_back(II); - } - - return AST.Selectors.getSelector(GlobSel.getNumArgs(), Ids.data()); -} - -/// \brief Get a printable name for debugging purpose. -std::string GlobalSelector::getPrintableName() const { - if (isInvalid()) - return "<< Invalid >>"; - - Selector GlobSel = Selector(reinterpret_cast(Val)); - return GlobSel.getAsString(); -} - -/// \brief Get a GlobalSelector for the ASTContext-specific selector. -GlobalSelector GlobalSelector::get(Selector Sel, Program &Prog) { - if (Sel.isNull()) - return GlobalSelector(); - - ProgramImpl &ProgImpl = *static_cast(Prog.Impl); - - SmallVector Ids; - for (unsigned i = 0, e = Sel.isUnarySelector() ? 1 : Sel.getNumArgs(); - i != e; ++i) { - IdentifierInfo *II = Sel.getIdentifierInfoForSlot(i); - IdentifierInfo *GlobII = &ProgImpl.getIdents().get(II->getName()); - Ids.push_back(GlobII); - } - - Selector GlobSel = ProgImpl.getSelectors().getSelector(Sel.getNumArgs(), - Ids.data()); - return GlobalSelector(GlobSel.getAsOpaquePtr()); -} - -unsigned -llvm::DenseMapInfo::getHashValue(GlobalSelector Sel) { - return DenseMapInfo::getHashValue(Sel.getAsOpaquePtr()); -} diff --git a/contrib/llvm/tools/clang/lib/Index/Handlers.cpp b/contrib/llvm/tools/clang/lib/Index/Handlers.cpp deleted file mode 100644 index 1e9a27d297c..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/Handlers.cpp +++ /dev/null @@ -1,22 +0,0 @@ -//===--- Handlers.cpp - Interfaces for receiving information ----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Abstract interfaces for receiving information. -// -//===----------------------------------------------------------------------===// - -#include "clang/Index/Handlers.h" -#include "clang/Index/Entity.h" -using namespace clang; -using namespace idx; - -// Out-of-line to give the virtual tables a home. -EntityHandler::~EntityHandler() { } -TranslationUnitHandler::~TranslationUnitHandler() { } -TULocationHandler::~TULocationHandler() { } diff --git a/contrib/llvm/tools/clang/lib/Index/IndexProvider.cpp b/contrib/llvm/tools/clang/lib/Index/IndexProvider.cpp deleted file mode 100644 index eea09887570..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/IndexProvider.cpp +++ /dev/null @@ -1,20 +0,0 @@ -//===- IndexProvider.cpp - Maps information to translation units -*- C++ -*-==// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Maps information to TranslationUnits. -// -//===----------------------------------------------------------------------===// - -#include "clang/Index/IndexProvider.h" -#include "clang/Index/Entity.h" -using namespace clang; -using namespace idx; - -// Out-of-line to give the virtual table a home. -IndexProvider::~IndexProvider() { } diff --git a/contrib/llvm/tools/clang/lib/Index/Indexer.cpp b/contrib/llvm/tools/clang/lib/Index/Indexer.cpp deleted file mode 100644 index ebba43c4747..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/Indexer.cpp +++ /dev/null @@ -1,121 +0,0 @@ -//===--- Indexer.cpp - IndexProvider implementation -------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// IndexProvider implementation. -// -//===----------------------------------------------------------------------===// - -#include "clang/Index/Indexer.h" -#include "clang/Index/Program.h" -#include "clang/Index/Handlers.h" -#include "clang/Index/TranslationUnit.h" -#include "ASTVisitor.h" -#include "clang/AST/DeclBase.h" -using namespace clang; -using namespace idx; - -namespace { - -class EntityIndexer : public EntityHandler { - TranslationUnit *TU; - Indexer::MapTy ⤅ - Indexer::DefMapTy &DefMap; - -public: - EntityIndexer(TranslationUnit *tu, Indexer::MapTy &map, - Indexer::DefMapTy &defmap) - : TU(tu), Map(map), DefMap(defmap) { } - - virtual void Handle(Entity Ent) { - if (Ent.isInternalToTU()) - return; - Map[Ent].insert(TU); - - Decl *D = Ent.getDecl(TU->getASTContext()); - if (FunctionDecl *FD = dyn_cast(D)) - if (FD->doesThisDeclarationHaveABody()) - DefMap[Ent] = std::make_pair(FD, TU); - } -}; - -class SelectorIndexer : public ASTVisitor { - Program &Prog; - TranslationUnit *TU; - Indexer::SelMapTy ⤅ - -public: - SelectorIndexer(Program &prog, TranslationUnit *tu, Indexer::SelMapTy &map) - : Prog(prog), TU(tu), Map(map) { } - - void VisitObjCMethodDecl(ObjCMethodDecl *D) { - Map[GlobalSelector::get(D->getSelector(), Prog)].insert(TU); - Base::VisitObjCMethodDecl(D); - } - - void VisitObjCMessageExpr(ObjCMessageExpr *Node) { - Map[GlobalSelector::get(Node->getSelector(), Prog)].insert(TU); - Base::VisitObjCMessageExpr(Node); - } -}; - -} // anonymous namespace - -void Indexer::IndexAST(TranslationUnit *TU) { - assert(TU && "Passed null TranslationUnit"); - ASTContext &Ctx = TU->getASTContext(); - CtxTUMap[&Ctx] = TU; - EntityIndexer Idx(TU, Map, DefMap); - Prog.FindEntities(Ctx, Idx); - - SelectorIndexer SelIdx(Prog, TU, SelMap); - SelIdx.Visit(Ctx.getTranslationUnitDecl()); -} - -void Indexer::GetTranslationUnitsFor(Entity Ent, - TranslationUnitHandler &Handler) { - assert(Ent.isValid() && "Expected valid Entity"); - - if (Ent.isInternalToTU()) { - Decl *D = Ent.getInternalDecl(); - CtxTUMapTy::iterator I = CtxTUMap.find(&D->getASTContext()); - if (I != CtxTUMap.end()) - Handler.Handle(I->second); - return; - } - - MapTy::iterator I = Map.find(Ent); - if (I == Map.end()) - return; - - TUSetTy &Set = I->second; - for (TUSetTy::iterator I = Set.begin(), E = Set.end(); I != E; ++I) - Handler.Handle(*I); -} - -void Indexer::GetTranslationUnitsFor(GlobalSelector Sel, - TranslationUnitHandler &Handler) { - assert(Sel.isValid() && "Expected valid GlobalSelector"); - - SelMapTy::iterator I = SelMap.find(Sel); - if (I == SelMap.end()) - return; - - TUSetTy &Set = I->second; - for (TUSetTy::iterator I = Set.begin(), E = Set.end(); I != E; ++I) - Handler.Handle(*I); -} - -std::pair -Indexer::getDefinitionFor(Entity Ent) { - DefMapTy::iterator I = DefMap.find(Ent); - if (I == DefMap.end()) - return std::make_pair((FunctionDecl *)0, (TranslationUnit *)0); - else - return I->second; -} diff --git a/contrib/llvm/tools/clang/lib/Index/Program.cpp b/contrib/llvm/tools/clang/lib/Index/Program.cpp deleted file mode 100644 index 4efad2c5e92..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/Program.cpp +++ /dev/null @@ -1,50 +0,0 @@ -//===--- Program.cpp - Entity originator and misc -------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Storage for Entities and utility functions -// -//===----------------------------------------------------------------------===// - -#include "clang/Index/Program.h" -#include "ProgramImpl.h" -#include "clang/Index/Handlers.h" -#include "clang/Index/TranslationUnit.h" -#include "clang/AST/DeclBase.h" -#include "clang/AST/ASTContext.h" -#include "llvm/Support/raw_ostream.h" -using namespace clang; -using namespace idx; - -// Out-of-line to give the virtual tables a home. -TranslationUnit::~TranslationUnit() { } - -Program::Program() : Impl(new ProgramImpl()) { } - -Program::~Program() { - delete static_cast(Impl); -} - -static void FindEntitiesInDC(DeclContext *DC, Program &Prog, - EntityHandler &Handler) { - for (DeclContext::decl_iterator - I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I) { - if (I->getLocation().isInvalid()) - continue; - Entity Ent = Entity::get(*I, Prog); - if (Ent.isValid()) - Handler.Handle(Ent); - if (DeclContext *SubDC = dyn_cast(*I)) - FindEntitiesInDC(SubDC, Prog, Handler); - } -} - -/// \brief Traverses the AST and passes all the entities to the Handler. -void Program::FindEntities(ASTContext &Ctx, EntityHandler &Handler) { - FindEntitiesInDC(Ctx.getTranslationUnitDecl(), *this, Handler); -} diff --git a/contrib/llvm/tools/clang/lib/Index/ProgramImpl.h b/contrib/llvm/tools/clang/lib/Index/ProgramImpl.h deleted file mode 100644 index 57b9ce3115e..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/ProgramImpl.h +++ /dev/null @@ -1,56 +0,0 @@ -//===--- ProgramImpl.h - Internal Program implementation---------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Internal implementation for the Program class -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INDEX_PROGRAMIMPL_H -#define LLVM_CLANG_INDEX_PROGRAMIMPL_H - -#include "EntityImpl.h" -#include "clang/Basic/IdentifierTable.h" -#include "clang/Basic/LangOptions.h" - -namespace clang { - -namespace idx { - class EntityListener; - -class ProgramImpl { -public: - typedef llvm::FoldingSet EntitySetTy; - -private: - EntitySetTy Entities; - llvm::BumpPtrAllocator BumpAlloc; - - IdentifierTable Identifiers; - SelectorTable Selectors; - - ProgramImpl(const ProgramImpl&); // do not implement - ProgramImpl &operator=(const ProgramImpl &); // do not implement - -public: - ProgramImpl() : Identifiers(LangOptions()) { } - - EntitySetTy &getEntities() { return Entities; } - IdentifierTable &getIdents() { return Identifiers; } - SelectorTable &getSelectors() { return Selectors; } - - void *Allocate(unsigned Size, unsigned Align = 8) { - return BumpAlloc.Allocate(Size, Align); - } -}; - -} // namespace idx - -} // namespace clang - -#endif diff --git a/contrib/llvm/tools/clang/lib/Index/SelectorMap.cpp b/contrib/llvm/tools/clang/lib/Index/SelectorMap.cpp deleted file mode 100644 index 0f11e31a0de..00000000000 --- a/contrib/llvm/tools/clang/lib/Index/SelectorMap.cpp +++ /dev/null @@ -1,84 +0,0 @@ -//===- SelectorMap.cpp - Maps selectors to methods and messages -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// SelectorMap creates a mapping from selectors to ObjC method declarations -// and ObjC message expressions. -// -//===----------------------------------------------------------------------===// - -#include "clang/Index/SelectorMap.h" -#include "ASTVisitor.h" -using namespace clang; -using namespace idx; - -namespace { - -class SelMapper : public ASTVisitor { - SelectorMap::SelMethMapTy &SelMethMap; - SelectorMap::SelRefMapTy &SelRefMap; - -public: - SelMapper(SelectorMap::SelMethMapTy &MethMap, - SelectorMap::SelRefMapTy &RefMap) - : SelMethMap(MethMap), SelRefMap(RefMap) { } - - void VisitObjCMethodDecl(ObjCMethodDecl *D); - void VisitObjCMessageExpr(ObjCMessageExpr *Node); - void VisitObjCSelectorExpr(ObjCSelectorExpr *Node); -}; - -} // anonymous namespace - -//===----------------------------------------------------------------------===// -// SelMapper Implementation -//===----------------------------------------------------------------------===// - -void SelMapper::VisitObjCMethodDecl(ObjCMethodDecl *D) { - if (D->getCanonicalDecl() == D) - SelMethMap.insert(std::make_pair(D->getSelector(), D)); - Base::VisitObjCMethodDecl(D); -} - -void SelMapper::VisitObjCMessageExpr(ObjCMessageExpr *Node) { - ASTLocation ASTLoc(CurrentDecl, Node); - SelRefMap.insert(std::make_pair(Node->getSelector(), ASTLoc)); -} - -void SelMapper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { - ASTLocation ASTLoc(CurrentDecl, Node); - SelRefMap.insert(std::make_pair(Node->getSelector(), ASTLoc)); -} - -//===----------------------------------------------------------------------===// -// SelectorMap Implementation -//===----------------------------------------------------------------------===// - -SelectorMap::SelectorMap(ASTContext &Ctx) { - SelMapper(SelMethMap, SelRefMap).Visit(Ctx.getTranslationUnitDecl()); -} - -SelectorMap::method_iterator -SelectorMap::methods_begin(Selector Sel) const { - return method_iterator(SelMethMap.lower_bound(Sel)); -} - -SelectorMap::method_iterator -SelectorMap::methods_end(Selector Sel) const { - return method_iterator(SelMethMap.upper_bound(Sel)); -} - -SelectorMap::astlocation_iterator -SelectorMap::refs_begin(Selector Sel) const { - return astlocation_iterator(SelRefMap.lower_bound(Sel)); -} - -SelectorMap::astlocation_iterator -SelectorMap::refs_end(Selector Sel) const { - return astlocation_iterator(SelRefMap.upper_bound(Sel)); -} diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseCXXInlineMethods.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseCXXInlineMethods.cpp index c000f69e6e1..c7b29d9ba28 100644 --- a/contrib/llvm/tools/clang/lib/Parse/ParseCXXInlineMethods.cpp +++ b/contrib/llvm/tools/clang/lib/Parse/ParseCXXInlineMethods.cpp @@ -59,7 +59,7 @@ Decl *Parser::ParseCXXInlineMethodDef(AccessSpecifier AS, } } - HandleMemberFunctionDefaultArgs(D, FnD); + HandleMemberFunctionDeclDelays(D, FnD); D.complete(FnD); @@ -348,6 +348,7 @@ void Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM) { LM.DefaultArgs[I].Toks = 0; } } + PrototypeScope.Exit(); // Finish the delayed C++ method declaration. @@ -447,9 +448,9 @@ void Parser::ParseLexedMemberInitializers(ParsingClass &Class) { if (HasTemplateScope) Actions.ActOnReenterTemplateScope(getCurScope(), Class.TagOrTemplate); - // Set or update the scope flags to include Scope::ThisScope. + // Set or update the scope flags. bool AlreadyHasClassScope = Class.TopLevelClass; - unsigned ScopeFlags = Scope::ClassScope|Scope::DeclScope|Scope::ThisScope; + unsigned ScopeFlags = Scope::ClassScope|Scope::DeclScope; ParseScope ClassScope(this, ScopeFlags, !AlreadyHasClassScope); ParseScopeFlags ClassScopeFlags(this, ScopeFlags, AlreadyHasClassScope); @@ -457,10 +458,20 @@ void Parser::ParseLexedMemberInitializers(ParsingClass &Class) { Actions.ActOnStartDelayedMemberDeclarations(getCurScope(), Class.TagOrTemplate); - for (size_t i = 0; i < Class.LateParsedDeclarations.size(); ++i) { - Class.LateParsedDeclarations[i]->ParseLexedMemberInitializers(); - } + { + // C++11 [expr.prim.general]p4: + // Otherwise, if a member-declarator declares a non-static data member + // (9.2) of a class X, the expression this is a prvalue of type "pointer + // to X" within the optional brace-or-equal-initializer. It shall not + // appear elsewhere in the member-declarator. + Sema::CXXThisScopeRAII ThisScope(Actions, Class.TagOrTemplate, + /*TypeQuals=*/(unsigned)0); + for (size_t i = 0; i < Class.LateParsedDeclarations.size(); ++i) { + Class.LateParsedDeclarations[i]->ParseLexedMemberInitializers(); + } + } + if (!AlreadyHasClassScope) Actions.ActOnFinishDelayedMemberDeclarations(getCurScope(), Class.TagOrTemplate); @@ -481,6 +492,7 @@ void Parser::ParseLexedMemberInitializer(LateParsedMemberInitializer &MI) { ConsumeAnyToken(); SourceLocation EqualLoc; + ExprResult Init = ParseCXXMemberInitializer(MI.Field, /*IsFunction=*/false, EqualLoc); diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseDecl.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseDecl.cpp index cf3dca20d90..7995e68d3f2 100644 --- a/contrib/llvm/tools/clang/lib/Parse/ParseDecl.cpp +++ b/contrib/llvm/tools/clang/lib/Parse/ParseDecl.cpp @@ -729,9 +729,9 @@ void Parser::ParseLexedAttributes(ParsingClass &Class) { if (HasTemplateScope) Actions.ActOnReenterTemplateScope(getCurScope(), Class.TagOrTemplate); - // Set or update the scope flags to include Scope::ThisScope. + // Set or update the scope flags. bool AlreadyHasClassScope = Class.TopLevelClass; - unsigned ScopeFlags = Scope::ClassScope|Scope::DeclScope|Scope::ThisScope; + unsigned ScopeFlags = Scope::ClassScope|Scope::DeclScope; ParseScope ClassScope(this, ScopeFlags, !AlreadyHasClassScope); ParseScopeFlags ClassScopeFlags(this, ScopeFlags, AlreadyHasClassScope); @@ -739,11 +739,16 @@ void Parser::ParseLexedAttributes(ParsingClass &Class) { if (!AlreadyHasClassScope) Actions.ActOnStartDelayedMemberDeclarations(getCurScope(), Class.TagOrTemplate); - - for (unsigned i = 0, ni = Class.LateParsedDeclarations.size(); i < ni; ++i) { - Class.LateParsedDeclarations[i]->ParseLexedAttributes(); + { + // Allow 'this' within late-parsed attributes. + Sema::CXXThisScopeRAII ThisScope(Actions, Class.TagOrTemplate, + /*TypeQuals=*/0); + + for (unsigned i = 0, ni = Class.LateParsedDeclarations.size(); i < ni; ++i){ + Class.LateParsedDeclarations[i]->ParseLexedAttributes(); + } } - + if (!AlreadyHasClassScope) Actions.ActOnFinishDelayedMemberDeclarations(getCurScope(), Class.TagOrTemplate); @@ -756,6 +761,7 @@ void Parser::ParseLexedAttributeList(LateParsedAttrList &LAs, Decl *D, for (unsigned i = 0, ni = LAs.size(); i < ni; ++i) { LAs[i]->addDecl(D); ParseLexedAttribute(*LAs[i], EnterScope, OnDefinition); + delete LAs[i]; } LAs.clear(); } @@ -958,7 +964,7 @@ void Parser::DiagnoseProhibitedAttributes(ParsedAttributesWithRange &attrs) { /// [C++] namespace-definition /// [C++] using-directive /// [C++] using-declaration -/// [C++0x/C11] static_assert-declaration +/// [C++11/C11] static_assert-declaration /// others... [FIXME] /// Parser::DeclGroupPtrTy Parser::ParseDeclaration(StmtVector &Stmts, @@ -4241,11 +4247,28 @@ void Parser::ParseFunctionDeclarator(Declarator &D, EndLoc = RefQualifierLoc; } + // C++11 [expr.prim.general]p3: + // If a declaration declares a member function or member function + // template of a class X, the expression this is a prvalue of type + // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq + // and the end of the function-definition, member-declarator, or + // declarator. + bool IsCXX11MemberFunction = + getLangOpts().CPlusPlus0x && + (D.getContext() == Declarator::MemberContext || + (D.getContext() == Declarator::FileContext && + D.getCXXScopeSpec().isValid() && + Actions.CurContext->isRecord())); + Sema::CXXThisScopeRAII ThisScope(Actions, + dyn_cast(Actions.CurContext), + DS.getTypeQualifiers(), + IsCXX11MemberFunction); + // Parse exception-specification[opt]. - ESpecType = MaybeParseExceptionSpecification(ESpecRange, - DynamicExceptions, - DynamicExceptionRanges, - NoexceptExpr); + ESpecType = tryParseExceptionSpecification(ESpecRange, + DynamicExceptions, + DynamicExceptionRanges, + NoexceptExpr); if (ESpecType != EST_None) EndLoc = ESpecRange.getEnd(); @@ -4481,7 +4504,6 @@ void Parser::ParseParameterDeclarationClause( // If we're inside a class definition, cache the tokens // corresponding to the default argument. We'll actually parse // them when we see the end of the class definition. - // FIXME: Templates will require something similar. // FIXME: Can we use a smart pointer for Toks? DefArgToks = new CachedTokens; diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseDeclCXX.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseDeclCXX.cpp index b2a65ff0f32..5e6c4f50e03 100644 --- a/contrib/llvm/tools/clang/lib/Parse/ParseDeclCXX.cpp +++ b/contrib/llvm/tools/clang/lib/Parse/ParseDeclCXX.cpp @@ -1534,13 +1534,17 @@ AccessSpecifier Parser::getAccessSpecifierIfPresent() const { } } -void Parser::HandleMemberFunctionDefaultArgs(Declarator& DeclaratorInfo, - Decl *ThisDecl) { +/// \brief If the given declarator has any parts for which parsing has to be +/// delayed, e.g., default arguments, create a late-parsed method declaration +/// record to handle the parsing at the end of the class definition. +void Parser::HandleMemberFunctionDeclDelays(Declarator& DeclaratorInfo, + Decl *ThisDecl) { // We just declared a member function. If this member function // has any default arguments, we'll need to parse them later. LateParsedMethodDeclaration *LateMethod = 0; DeclaratorChunk::FunctionTypeInfo &FTI = DeclaratorInfo.getFunctionTypeInfo(); + for (unsigned ParamIdx = 0; ParamIdx < FTI.NumArgs; ++ParamIdx) { if (LateMethod || FTI.ArgInfo[ParamIdx].DefaultArgTokens) { if (!LateMethod) { @@ -1558,7 +1562,7 @@ void Parser::HandleMemberFunctionDefaultArgs(Declarator& DeclaratorInfo, LateParsedDefaultArgument(FTI.ArgInfo[I].Param)); } - // Add this parameter to the list of parameters (it or may + // Add this parameter to the list of parameters (it may or may // not have a default argument). LateMethod->DefaultArgs.push_back( LateParsedDefaultArgument(FTI.ArgInfo[ParamIdx].Param, @@ -2043,10 +2047,10 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, DeclsInGroup.push_back(ThisDecl); } - if (DeclaratorInfo.isFunctionDeclarator() && + if (ThisDecl && DeclaratorInfo.isFunctionDeclarator() && DeclaratorInfo.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef) { - HandleMemberFunctionDefaultArgs(DeclaratorInfo, ThisDecl); + HandleMemberFunctionDeclDelays(DeclaratorInfo, ThisDecl); } DeclaratorInfo.complete(ThisDecl); @@ -2334,13 +2338,11 @@ void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, T.getCloseLocation(), attrs.getList()); - // C++0x [class.mem]p2: Within the class member-specification, the class is - // regarded as complete within function bodies, default arguments, exception- - // specifications, and brace-or-equal-initializers for non-static data - // members (including such things in nested classes). - // - // FIXME: Only function bodies and brace-or-equal-initializers are currently - // handled. Fix the others! + // C++11 [class.mem]p2: + // Within the class member-specification, the class is regarded as complete + // within function bodies, default arguments, and + // brace-or-equal-initializers for non-static data members (including such + // things in nested classes). if (TagDecl && NonNestedClass) { // We are not inside a nested class. This class and its nested classes // are complete and we can parse the delayed portions of method @@ -2349,6 +2351,10 @@ void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, SourceLocation SavedPrevTokLocation = PrevTokLocation; ParseLexedAttributes(getCurrentClass()); ParseLexedMethodDeclarations(getCurrentClass()); + + // We've finished with all pending member declarations. + Actions.ActOnFinishCXXMemberDecls(); + ParseLexedMemberInitializers(getCurrentClass()); ParseLexedMethodDefs(getCurrentClass()); PrevTokLocation = SavedPrevTokLocation; @@ -2535,7 +2541,8 @@ Parser::MemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) { /// 'noexcept' /// 'noexcept' '(' constant-expression ')' ExceptionSpecificationType -Parser::MaybeParseExceptionSpecification(SourceRange &SpecificationRange, +Parser::tryParseExceptionSpecification( + SourceRange &SpecificationRange, SmallVectorImpl &DynamicExceptions, SmallVectorImpl &DynamicExceptionRanges, ExprResult &NoexceptExpr) { diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseExpr.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseExpr.cpp index 7f3a815edc0..6d31396cc01 100644 --- a/contrib/llvm/tools/clang/lib/Parse/ParseExpr.cpp +++ b/contrib/llvm/tools/clang/lib/Parse/ParseExpr.cpp @@ -1926,11 +1926,9 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr, // unless they've already reported an error. if (ExprType >= CompoundStmt && Tok.is(tok::l_brace)) { Diag(Tok, diag::ext_gnu_statement_expr); - Actions.ActOnStartStmtExpr(); - ParsedAttributes attrs(AttrFactory); - StmtResult Stmt(ParseCompoundStatement(attrs, true)); + StmtResult Stmt(ParseCompoundStatement(true)); ExprType = CompoundStmt; // If the substmt parsed correctly, build the AST node. diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseExprCXX.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseExprCXX.cpp index 2af74824ebc..715218448a3 100644 --- a/contrib/llvm/tools/clang/lib/Parse/ParseExprCXX.cpp +++ b/contrib/llvm/tools/clang/lib/Parse/ParseExprCXX.cpp @@ -780,10 +780,10 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer( llvm::SmallVector DynamicExceptions; llvm::SmallVector DynamicExceptionRanges; ExprResult NoexceptExpr; - ESpecType = MaybeParseExceptionSpecification(ESpecRange, - DynamicExceptions, - DynamicExceptionRanges, - NoexceptExpr); + ESpecType = tryParseExceptionSpecification(ESpecRange, + DynamicExceptions, + DynamicExceptionRanges, + NoexceptExpr); if (ESpecType != EST_None) DeclEndLoc = ESpecRange.getEnd(); @@ -872,8 +872,6 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer( // FIXME: Rename BlockScope -> ClosureScope if we decide to continue using // it. unsigned ScopeFlags = Scope::BlockScope | Scope::FnScope | Scope::DeclScope; - if (getCurScope()->getFlags() & Scope::ThisScope) - ScopeFlags |= Scope::ThisScope; ParseScope BodyScope(this, ScopeFlags); Actions.ActOnStartOfLambdaDefinition(Intro, D, getCurScope()); @@ -1711,7 +1709,7 @@ bool Parser::ParseUnqualifiedIdTemplateId(CXXScopeSpec &SS, // Form a parsed representation of the template-id to be stored in the // UnqualifiedId. TemplateIdAnnotation *TemplateId - = TemplateIdAnnotation::Allocate(TemplateArgs.size()); + = TemplateIdAnnotation::Allocate(TemplateArgs.size(), TemplateIds); if (Id.getKind() == UnqualifiedId::IK_Identifier) { TemplateId->Name = Id.Identifier; diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseStmt.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseStmt.cpp index fdb97886676..44320dfcb3b 100644 --- a/contrib/llvm/tools/clang/lib/Parse/ParseStmt.cpp +++ b/contrib/llvm/tools/clang/lib/Parse/ParseStmt.cpp @@ -78,13 +78,30 @@ using namespace clang; StmtResult Parser::ParseStatementOrDeclaration(StmtVector &Stmts, bool OnlyStatement, SourceLocation *TrailingElseLoc) { - const char *SemiError = 0; - StmtResult Res; ParenBraceBracketBalancer BalancerRAIIObj(*this); - ParsedAttributesWithRange attrs(AttrFactory); - MaybeParseCXX0XAttributes(attrs, 0, /*MightBeObjCMessageSend*/ true); + ParsedAttributesWithRange Attrs(AttrFactory); + MaybeParseCXX0XAttributes(Attrs, 0, /*MightBeObjCMessageSend*/ true); + + StmtResult Res = ParseStatementOrDeclarationAfterAttributes(Stmts, + OnlyStatement, TrailingElseLoc, Attrs); + + assert((Attrs.empty() || Res.isInvalid() || Res.isUsable()) && + "attributes on empty statement"); + + if (Attrs.empty() || Res.isInvalid()) + return Res; + + return Actions.ProcessStmtAttributes(Res.get(), Attrs.getList(), Attrs.Range); +} + +StmtResult +Parser::ParseStatementOrDeclarationAfterAttributes(StmtVector &Stmts, + bool OnlyStatement, SourceLocation *TrailingElseLoc, + ParsedAttributesWithRange &Attrs) { + const char *SemiError = 0; + StmtResult Res; // Cases in this switch statement should fall through if the parser expects // the token to end in a semicolon (in which case SemiError should be set), @@ -95,6 +112,7 @@ Retry: switch (Kind) { case tok::at: // May be a @try or @throw statement { + ProhibitAttributes(Attrs); // TODO: is it correct? AtLoc = ConsumeToken(); // consume @ return ParseObjCAtStatement(AtLoc); } @@ -108,7 +126,7 @@ Retry: Token Next = NextToken(); if (Next.is(tok::colon)) { // C99 6.8.1: labeled-statement // identifier ':' statement - return ParseLabeledStatement(attrs); + return ParseLabeledStatement(Attrs); } if (Next.isNot(tok::coloncolon)) { @@ -210,7 +228,7 @@ Retry: if ((getLangOpts().CPlusPlus || !OnlyStatement) && isDeclarationStatement()) { SourceLocation DeclStart = Tok.getLocation(), DeclEnd; DeclGroupPtrTy Decl = ParseDeclaration(Stmts, Declarator::BlockContext, - DeclEnd, attrs); + DeclEnd, Attrs); return Actions.ActOnDeclStmt(Decl, DeclStart, DeclEnd); } @@ -219,54 +237,54 @@ Retry: return StmtError(); } - return ParseExprStatement(attrs); + return ParseExprStatement(); } case tok::kw_case: // C99 6.8.1: labeled-statement - return ParseCaseStatement(attrs); + return ParseCaseStatement(); case tok::kw_default: // C99 6.8.1: labeled-statement - return ParseDefaultStatement(attrs); + return ParseDefaultStatement(); case tok::l_brace: // C99 6.8.2: compound-statement - return ParseCompoundStatement(attrs); + return ParseCompoundStatement(); case tok::semi: { // C99 6.8.3p3: expression[opt] ';' bool HasLeadingEmptyMacro = Tok.hasLeadingEmptyMacro(); return Actions.ActOnNullStmt(ConsumeToken(), HasLeadingEmptyMacro); } case tok::kw_if: // C99 6.8.4.1: if-statement - return ParseIfStatement(attrs, TrailingElseLoc); + return ParseIfStatement(TrailingElseLoc); case tok::kw_switch: // C99 6.8.4.2: switch-statement - return ParseSwitchStatement(attrs, TrailingElseLoc); + return ParseSwitchStatement(TrailingElseLoc); case tok::kw_while: // C99 6.8.5.1: while-statement - return ParseWhileStatement(attrs, TrailingElseLoc); + return ParseWhileStatement(TrailingElseLoc); case tok::kw_do: // C99 6.8.5.2: do-statement - Res = ParseDoStatement(attrs); + Res = ParseDoStatement(); SemiError = "do/while"; break; case tok::kw_for: // C99 6.8.5.3: for-statement - return ParseForStatement(attrs, TrailingElseLoc); + return ParseForStatement(TrailingElseLoc); case tok::kw_goto: // C99 6.8.6.1: goto-statement - Res = ParseGotoStatement(attrs); + Res = ParseGotoStatement(); SemiError = "goto"; break; case tok::kw_continue: // C99 6.8.6.2: continue-statement - Res = ParseContinueStatement(attrs); + Res = ParseContinueStatement(); SemiError = "continue"; break; case tok::kw_break: // C99 6.8.6.3: break-statement - Res = ParseBreakStatement(attrs); + Res = ParseBreakStatement(); SemiError = "break"; break; case tok::kw_return: // C99 6.8.6.4: return-statement - Res = ParseReturnStatement(attrs); + Res = ParseReturnStatement(); SemiError = "return"; break; case tok::kw_asm: { - ProhibitAttributes(attrs); + ProhibitAttributes(Attrs); bool msAsm = false; Res = ParseAsmStatement(msAsm); Res = Actions.ActOnFinishFullStmt(Res.get()); @@ -276,16 +294,19 @@ Retry: } case tok::kw_try: // C++ 15: try-block - return ParseCXXTryBlock(attrs); + return ParseCXXTryBlock(); case tok::kw___try: - return ParseSEHTryBlock(attrs); + ProhibitAttributes(Attrs); // TODO: is it correct? + return ParseSEHTryBlock(); case tok::annot_pragma_vis: + ProhibitAttributes(Attrs); HandlePragmaVisibility(); return StmtEmpty(); case tok::annot_pragma_pack: + ProhibitAttributes(Attrs); HandlePragmaPack(); return StmtEmpty(); } @@ -306,11 +327,10 @@ Retry: } /// \brief Parse an expression statement. -StmtResult Parser::ParseExprStatement(ParsedAttributes &Attrs) { +StmtResult Parser::ParseExprStatement() { // If a case keyword is missing, this is where it should be inserted. Token OldToken = Tok; - // FIXME: Use the attributes // expression[opt] ';' ExprResult Expr(ParseExpression()); if (Expr.isInvalid()) { @@ -331,7 +351,7 @@ StmtResult Parser::ParseExprStatement(ParsedAttributes &Attrs) { << FixItHint::CreateInsertion(OldToken.getLocation(), "case "); // Recover parsing as a case statement. - return ParseCaseStatement(Attrs, /*MissingCase=*/true, Expr); + return ParseCaseStatement(/*MissingCase=*/true, Expr); } // Otherwise, eat the semicolon. @@ -339,7 +359,7 @@ StmtResult Parser::ParseExprStatement(ParsedAttributes &Attrs) { return Actions.ActOnExprStmt(Actions.MakeFullExpr(Expr.get())); } -StmtResult Parser::ParseSEHTryBlock(ParsedAttributes & Attrs) { +StmtResult Parser::ParseSEHTryBlock() { assert(Tok.is(tok::kw___try) && "Expected '__try'"); SourceLocation Loc = ConsumeToken(); return ParseSEHTryBlockCommon(Loc); @@ -358,13 +378,12 @@ StmtResult Parser::ParseSEHTryBlockCommon(SourceLocation TryLoc) { if(Tok.isNot(tok::l_brace)) return StmtError(Diag(Tok,diag::err_expected_lbrace)); - ParsedAttributesWithRange attrs(AttrFactory); - StmtResult TryBlock(ParseCompoundStatement(attrs)); + StmtResult TryBlock(ParseCompoundStatement()); if(TryBlock.isInvalid()) return move(TryBlock); StmtResult Handler; - if (Tok.is(tok::identifier) && + if (Tok.is(tok::identifier) && Tok.getIdentifierInfo() == getSEHExceptKeyword()) { SourceLocation Loc = ConsumeToken(); Handler = ParseSEHExceptBlock(Loc); @@ -418,8 +437,7 @@ StmtResult Parser::ParseSEHExceptBlock(SourceLocation ExceptLoc) { if(ExpectAndConsume(tok::r_paren,diag::err_expected_rparen)) return StmtError(); - ParsedAttributesWithRange attrs(AttrFactory); - StmtResult Block(ParseCompoundStatement(attrs)); + StmtResult Block(ParseCompoundStatement()); if(Block.isInvalid()) return move(Block); @@ -437,8 +455,7 @@ StmtResult Parser::ParseSEHFinallyBlock(SourceLocation FinallyBlock) { raii2(Ident___abnormal_termination, false), raii3(Ident_AbnormalTermination, false); - ParsedAttributesWithRange attrs(AttrFactory); - StmtResult Block(ParseCompoundStatement(attrs)); + StmtResult Block(ParseCompoundStatement()); if(Block.isInvalid()) return move(Block); @@ -451,7 +468,7 @@ StmtResult Parser::ParseSEHFinallyBlock(SourceLocation FinallyBlock) { /// identifier ':' statement /// [GNU] identifier ':' attributes[opt] statement /// -StmtResult Parser::ParseLabeledStatement(ParsedAttributes &attrs) { +StmtResult Parser::ParseLabeledStatement(ParsedAttributesWithRange &attrs) { assert(Tok.is(tok::identifier) && Tok.getIdentifierInfo() && "Not an identifier!"); @@ -463,7 +480,8 @@ StmtResult Parser::ParseLabeledStatement(ParsedAttributes &attrs) { // identifier ':' statement SourceLocation ColonLoc = ConsumeToken(); - // Read label attributes, if present. + // Read label attributes, if present. attrs will contain both C++11 and GNU + // attributes (if present) after this point. MaybeParseGNUAttributes(attrs); StmtResult SubStmt(ParseStatement()); @@ -474,8 +492,10 @@ StmtResult Parser::ParseLabeledStatement(ParsedAttributes &attrs) { LabelDecl *LD = Actions.LookupOrCreateLabel(IdentTok.getIdentifierInfo(), IdentTok.getLocation()); - if (AttributeList *Attrs = attrs.getList()) + if (AttributeList *Attrs = attrs.getList()) { Actions.ProcessDeclAttributeList(Actions.CurScope, LD, Attrs); + attrs.clear(); + } return Actions.ActOnLabelStmt(IdentTok.getLocation(), LD, ColonLoc, SubStmt.get()); @@ -486,10 +506,8 @@ StmtResult Parser::ParseLabeledStatement(ParsedAttributes &attrs) { /// 'case' constant-expression ':' statement /// [GNU] 'case' constant-expression '...' constant-expression ':' statement /// -StmtResult Parser::ParseCaseStatement(ParsedAttributes &attrs, bool MissingCase, - ExprResult Expr) { +StmtResult Parser::ParseCaseStatement(bool MissingCase, ExprResult Expr) { assert((MissingCase || Tok.is(tok::kw_case)) && "Not a case stmt!"); - // FIXME: Use attributes? // It is very very common for code to contain many case statements recursively // nested, as in (but usually without indentation): @@ -625,9 +643,7 @@ StmtResult Parser::ParseCaseStatement(ParsedAttributes &attrs, bool MissingCase, /// 'default' ':' statement /// Note that this does not parse the 'statement' at the end. /// -StmtResult Parser::ParseDefaultStatement(ParsedAttributes &attrs) { - //FIXME: Use attributes? - +StmtResult Parser::ParseDefaultStatement() { assert(Tok.is(tok::kw_default) && "Not a default stmt!"); SourceLocation DefaultLoc = ConsumeToken(); // eat the 'default'. @@ -668,9 +684,8 @@ StmtResult Parser::ParseDefaultStatement(ParsedAttributes &attrs) { SubStmt.get(), getCurScope()); } -StmtResult Parser::ParseCompoundStatement(ParsedAttributes &Attr, - bool isStmtExpr) { - return ParseCompoundStatement(Attr, isStmtExpr, Scope::DeclScope); +StmtResult Parser::ParseCompoundStatement(bool isStmtExpr) { + return ParseCompoundStatement(isStmtExpr, Scope::DeclScope); } /// ParseCompoundStatement - Parse a "{}" block. @@ -700,11 +715,8 @@ StmtResult Parser::ParseCompoundStatement(ParsedAttributes &Attr, /// [OMP] barrier-directive /// [OMP] flush-directive /// -StmtResult Parser::ParseCompoundStatement(ParsedAttributes &attrs, - bool isStmtExpr, +StmtResult Parser::ParseCompoundStatement(bool isStmtExpr, unsigned ScopeFlags) { - //FIXME: Use attributes? - assert(Tok.is(tok::l_brace) && "Not a compount stmt!"); // Enter a scope to hold everything within the compound stmt. Compound @@ -894,10 +906,7 @@ bool Parser::ParseParenExprOrCondition(ExprResult &ExprResult, /// [C++] 'if' '(' condition ')' statement /// [C++] 'if' '(' condition ')' statement 'else' statement /// -StmtResult Parser::ParseIfStatement(ParsedAttributes &attrs, - SourceLocation *TrailingElseLoc) { - // FIXME: Use attributes? - +StmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) { assert(Tok.is(tok::kw_if) && "Not an if stmt!"); SourceLocation IfLoc = ConsumeToken(); // eat the 'if'. @@ -1028,10 +1037,7 @@ StmtResult Parser::ParseIfStatement(ParsedAttributes &attrs, /// switch-statement: /// 'switch' '(' expression ')' statement /// [C++] 'switch' '(' condition ')' statement -StmtResult Parser::ParseSwitchStatement(ParsedAttributes &attrs, - SourceLocation *TrailingElseLoc) { - // FIXME: Use attributes? - +StmtResult Parser::ParseSwitchStatement(SourceLocation *TrailingElseLoc) { assert(Tok.is(tok::kw_switch) && "Not a switch stmt!"); SourceLocation SwitchLoc = ConsumeToken(); // eat the 'switch'. @@ -1119,10 +1125,7 @@ StmtResult Parser::ParseSwitchStatement(ParsedAttributes &attrs, /// while-statement: [C99 6.8.5.1] /// 'while' '(' expression ')' statement /// [C++] 'while' '(' condition ')' statement -StmtResult Parser::ParseWhileStatement(ParsedAttributes &attrs, - SourceLocation *TrailingElseLoc) { - // FIXME: Use attributes? - +StmtResult Parser::ParseWhileStatement(SourceLocation *TrailingElseLoc) { assert(Tok.is(tok::kw_while) && "Not a while stmt!"); SourceLocation WhileLoc = Tok.getLocation(); ConsumeToken(); // eat the 'while'. @@ -1194,9 +1197,7 @@ StmtResult Parser::ParseWhileStatement(ParsedAttributes &attrs, /// do-statement: [C99 6.8.5.2] /// 'do' statement 'while' '(' expression ')' ';' /// Note: this lets the caller parse the end ';'. -StmtResult Parser::ParseDoStatement(ParsedAttributes &attrs) { - // FIXME: Use attributes? - +StmtResult Parser::ParseDoStatement() { assert(Tok.is(tok::kw_do) && "Not a do stmt!"); SourceLocation DoLoc = ConsumeToken(); // eat the 'do'. @@ -1277,10 +1278,7 @@ StmtResult Parser::ParseDoStatement(ParsedAttributes &attrs) { /// [C++0x] for-range-initializer: /// [C++0x] expression /// [C++0x] braced-init-list [TODO] -StmtResult Parser::ParseForStatement(ParsedAttributes &attrs, - SourceLocation *TrailingElseLoc) { - // FIXME: Use attributes? - +StmtResult Parser::ParseForStatement(SourceLocation *TrailingElseLoc) { assert(Tok.is(tok::kw_for) && "Not a for stmt!"); SourceLocation ForLoc = ConsumeToken(); // eat the 'for'. @@ -1535,9 +1533,7 @@ StmtResult Parser::ParseForStatement(ParsedAttributes &attrs, /// /// Note: this lets the caller parse the end ';'. /// -StmtResult Parser::ParseGotoStatement(ParsedAttributes &attrs) { - // FIXME: Use attributes? - +StmtResult Parser::ParseGotoStatement() { assert(Tok.is(tok::kw_goto) && "Not a goto stmt!"); SourceLocation GotoLoc = ConsumeToken(); // eat the 'goto'. @@ -1571,9 +1567,7 @@ StmtResult Parser::ParseGotoStatement(ParsedAttributes &attrs) { /// /// Note: this lets the caller parse the end ';'. /// -StmtResult Parser::ParseContinueStatement(ParsedAttributes &attrs) { - // FIXME: Use attributes? - +StmtResult Parser::ParseContinueStatement() { SourceLocation ContinueLoc = ConsumeToken(); // eat the 'continue'. return Actions.ActOnContinueStmt(ContinueLoc, getCurScope()); } @@ -1584,9 +1578,7 @@ StmtResult Parser::ParseContinueStatement(ParsedAttributes &attrs) { /// /// Note: this lets the caller parse the end ';'. /// -StmtResult Parser::ParseBreakStatement(ParsedAttributes &attrs) { - // FIXME: Use attributes? - +StmtResult Parser::ParseBreakStatement() { SourceLocation BreakLoc = ConsumeToken(); // eat the 'break'. return Actions.ActOnBreakStmt(BreakLoc, getCurScope()); } @@ -1594,9 +1586,7 @@ StmtResult Parser::ParseBreakStatement(ParsedAttributes &attrs) { /// ParseReturnStatement /// jump-statement: /// 'return' expression[opt] ';' -StmtResult Parser::ParseReturnStatement(ParsedAttributes &attrs) { - // FIXME: Use attributes? - +StmtResult Parser::ParseReturnStatement() { assert(Tok.is(tok::kw_return) && "Not a return stmt!"); SourceLocation ReturnLoc = ConsumeToken(); // eat the 'return'. @@ -2043,9 +2033,7 @@ bool Parser::trySkippingFunctionBody() { /// try-block: /// 'try' compound-statement handler-seq /// -StmtResult Parser::ParseCXXTryBlock(ParsedAttributes &attrs) { - // FIXME: Add attributes? - +StmtResult Parser::ParseCXXTryBlock() { assert(Tok.is(tok::kw_try) && "Expected 'try'"); SourceLocation TryLoc = ConsumeToken(); @@ -2072,17 +2060,17 @@ StmtResult Parser::ParseCXXTryBlockCommon(SourceLocation TryLoc) { if (Tok.isNot(tok::l_brace)) return StmtError(Diag(Tok, diag::err_expected_lbrace)); // FIXME: Possible draft standard bug: attribute-specifier should be allowed? - ParsedAttributesWithRange attrs(AttrFactory); - StmtResult TryBlock(ParseCompoundStatement(attrs, /*isStmtExpr=*/false, + + StmtResult TryBlock(ParseCompoundStatement(/*isStmtExpr=*/false, Scope::DeclScope|Scope::TryScope)); if (TryBlock.isInvalid()) return move(TryBlock); // Borland allows SEH-handlers with 'try' - if((Tok.is(tok::identifier) && - Tok.getIdentifierInfo() == getSEHExceptKeyword()) || - Tok.is(tok::kw___finally)) { + if ((Tok.is(tok::identifier) && + Tok.getIdentifierInfo() == getSEHExceptKeyword()) || + Tok.is(tok::kw___finally)) { // TODO: Factor into common return ParseSEHHandlerCommon(...) StmtResult Handler; if(Tok.getIdentifierInfo() == getSEHExceptKeyword()) { @@ -2103,6 +2091,7 @@ StmtResult Parser::ParseCXXTryBlockCommon(SourceLocation TryLoc) { } else { StmtVector Handlers(Actions); + ParsedAttributesWithRange attrs(AttrFactory); MaybeParseCXX0XAttributes(attrs); ProhibitAttributes(attrs); @@ -2168,8 +2157,7 @@ StmtResult Parser::ParseCXXCatchBlock() { return StmtError(Diag(Tok, diag::err_expected_lbrace)); // FIXME: Possible draft standard bug: attribute-specifier should be allowed? - ParsedAttributes attrs(AttrFactory); - StmtResult Block(ParseCompoundStatement(attrs)); + StmtResult Block(ParseCompoundStatement()); if (Block.isInvalid()) return move(Block); @@ -2188,24 +2176,23 @@ void Parser::ParseMicrosoftIfExistsStatement(StmtVector &Stmts) { if (Result.Behavior == IEB_Dependent) { if (!Tok.is(tok::l_brace)) { Diag(Tok, diag::err_expected_lbrace); - return; + return; } - - ParsedAttributes Attrs(AttrFactory); - StmtResult Compound = ParseCompoundStatement(Attrs); + + StmtResult Compound = ParseCompoundStatement(); if (Compound.isInvalid()) return; - + StmtResult DepResult = Actions.ActOnMSDependentExistsStmt(Result.KeywordLoc, Result.IsIfExists, - Result.SS, + Result.SS, Result.Name, Compound.get()); if (DepResult.isUsable()) Stmts.push_back(DepResult.get()); return; } - + BalancedDelimiterTracker Braces(*this, tok::l_brace); if (Braces.consumeOpen()) { Diag(Tok, diag::err_expected_lbrace); diff --git a/contrib/llvm/tools/clang/lib/Parse/ParseTemplate.cpp b/contrib/llvm/tools/clang/lib/Parse/ParseTemplate.cpp index 61cd9f2119a..5c3e2ba589f 100644 --- a/contrib/llvm/tools/clang/lib/Parse/ParseTemplate.cpp +++ b/contrib/llvm/tools/clang/lib/Parse/ParseTemplate.cpp @@ -652,6 +652,7 @@ Parser::ParseNonTypeTemplateParameter(unsigned Depth, unsigned Position) { // end of the template-parameter-list rather than a greater-than // operator. GreaterThanIsOperatorScope G(GreaterThanIsOperator, false); + EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated); DefaultArg = ParseAssignmentExpression(); if (DefaultArg.isInvalid()) @@ -838,7 +839,7 @@ bool Parser::AnnotateTemplateIdToken(TemplateTy Template, TemplateNameKind TNK, // later. Tok.setKind(tok::annot_template_id); TemplateIdAnnotation *TemplateId - = TemplateIdAnnotation::Allocate(TemplateArgs.size()); + = TemplateIdAnnotation::Allocate(TemplateArgs.size(), TemplateIds); TemplateId->TemplateNameLoc = TemplateNameLoc; if (TemplateName.getKind() == UnqualifiedId::IK_Identifier) { TemplateId->Name = TemplateName.Identifier; diff --git a/contrib/llvm/tools/clang/lib/Parse/Parser.cpp b/contrib/llvm/tools/clang/lib/Parse/Parser.cpp index 054a8fd6a55..f1b99fb0a12 100644 --- a/contrib/llvm/tools/clang/lib/Parse/Parser.cpp +++ b/contrib/llvm/tools/clang/lib/Parse/Parser.cpp @@ -397,6 +397,8 @@ Parser::~Parser() { PP.RemovePragmaHandler("STDC", FPContractHandler.get()); FPContractHandler.reset(); PP.clearCodeCompletionHandler(); + + assert(TemplateIds.empty() && "Still alive TemplateIdAnnotations around?"); } /// Initialize - Warm up the parser. @@ -470,10 +472,30 @@ void Parser::Initialize() { } } +namespace { + /// \brief RAIIObject to destroy the contents of a SmallVector of + /// TemplateIdAnnotation pointers and clear the vector. + class DestroyTemplateIdAnnotationsRAIIObj { + SmallVectorImpl &Container; + public: + DestroyTemplateIdAnnotationsRAIIObj(SmallVectorImpl + &Container) + : Container(Container) {} + + ~DestroyTemplateIdAnnotationsRAIIObj() { + for (SmallVectorImpl::iterator I = + Container.begin(), E = Container.end(); + I != E; ++I) + (*I)->Destroy(); + Container.clear(); + } + }; +} + /// ParseTopLevelDecl - Parse one top-level declaration, return whatever the /// action tells us to. This returns true if the EOF was encountered. bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result) { - DelayedCleanupPoint CleanupRAII(TopLevelDeclCleanupPool); + DestroyTemplateIdAnnotationsRAIIObj CleanupRAII(TemplateIds); // Skip over the EOF token, flagging end of previous input for incremental // processing @@ -543,7 +565,7 @@ void Parser::ParseTranslationUnit() { Parser::DeclGroupPtrTy Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, ParsingDeclSpec *DS) { - DelayedCleanupPoint CleanupRAII(TopLevelDeclCleanupPool); + DestroyTemplateIdAnnotationsRAIIObj CleanupRAII(TemplateIds); ParenBraceBracketBalancer BalancerRAIIObj(*this); if (PP.isCodeCompletionReached()) { @@ -1201,8 +1223,6 @@ TemplateIdAnnotation *Parser::takeTemplateIdAnnotation(const Token &tok) { assert(tok.is(tok::annot_template_id) && "Expected template-id token"); TemplateIdAnnotation * Id = static_cast(tok.getAnnotationValue()); - TopLevelDeclCleanupPool.delayMemberFunc< TemplateIdAnnotation, - &TemplateIdAnnotation::Destroy>(Id); return Id; } diff --git a/contrib/llvm/tools/clang/lib/Rewrite/RewriteModernObjC.cpp b/contrib/llvm/tools/clang/lib/Rewrite/RewriteModernObjC.cpp index 57109dee9a0..94fba64e17a 100644 --- a/contrib/llvm/tools/clang/lib/Rewrite/RewriteModernObjC.cpp +++ b/contrib/llvm/tools/clang/lib/Rewrite/RewriteModernObjC.cpp @@ -304,7 +304,6 @@ namespace { void RewriteFunctionDecl(FunctionDecl *FD); void RewriteBlockPointerType(std::string& Str, QualType Type); void RewriteBlockPointerTypeVariable(std::string& Str, ValueDecl *VD); - void RewriteBlockLiteralFunctionDecl(FunctionDecl *FD); void RewriteObjCQualifiedInterfaceTypes(Decl *Dcl); void RewriteTypeOfDecl(VarDecl *VD); void RewriteObjCQualifiedInterfaceTypes(Expr *E); @@ -2246,31 +2245,7 @@ void RewriteModernObjC::RewriteBlockPointerTypeVariable(std::string& Str, } } - -void RewriteModernObjC::RewriteBlockLiteralFunctionDecl(FunctionDecl *FD) { - SourceLocation FunLocStart = FD->getTypeSpecStartLoc(); - const FunctionType *funcType = FD->getType()->getAs(); - const FunctionProtoType *proto = dyn_cast(funcType); - if (!proto) - return; - QualType Type = proto->getResultType(); - std::string FdStr = Type.getAsString(Context->getPrintingPolicy()); - FdStr += " "; - FdStr += FD->getName(); - FdStr += "("; - unsigned numArgs = proto->getNumArgs(); - for (unsigned i = 0; i < numArgs; i++) { - QualType ArgType = proto->getArgType(i); - RewriteBlockPointerType(FdStr, ArgType); - if (i+1 < numArgs) - FdStr += ", "; - } - FdStr += ");\n"; - InsertText(FunLocStart, FdStr); - CurFunctionDeclToDeclareForBlock = 0; -} - -// SynthSuperContructorFunctionDecl - id objc_super(id obj, id super); +// SynthSuperContructorFunctionDecl - id __rw_objc_super(id obj, id super); void RewriteModernObjC::SynthSuperContructorFunctionDecl() { if (SuperContructorFunctionDecl) return; @@ -2311,21 +2286,13 @@ void RewriteModernObjC::SynthMsgSendFunctionDecl() { SC_None, false); } -// SynthMsgSendSuperFunctionDecl - id objc_msgSendSuper(struct objc_super *, SEL op, ...); +// SynthMsgSendSuperFunctionDecl - id objc_msgSendSuper(void); void RewriteModernObjC::SynthMsgSendSuperFunctionDecl() { IdentifierInfo *msgSendIdent = &Context->Idents.get("objc_msgSendSuper"); - SmallVector ArgTys; - RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl, - SourceLocation(), SourceLocation(), - &Context->Idents.get("objc_super")); - QualType argT = Context->getPointerType(Context->getTagDeclType(RD)); - assert(!argT.isNull() && "Can't build 'struct objc_super *' type"); - ArgTys.push_back(argT); - argT = Context->getObjCSelType(); - assert(!argT.isNull() && "Can't find 'SEL' type"); - ArgTys.push_back(argT); + SmallVector ArgTys; + ArgTys.push_back(Context->VoidTy); QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(), - &ArgTys[0], ArgTys.size(), + &ArgTys[0], 1, true /*isVariadic*/); MsgSendSuperFunctionDecl = FunctionDecl::Create(*Context, TUDecl, SourceLocation(), @@ -2357,22 +2324,14 @@ void RewriteModernObjC::SynthMsgSendStretFunctionDecl() { } // SynthMsgSendSuperStretFunctionDecl - -// id objc_msgSendSuper_stret(struct objc_super *, SEL op, ...); +// id objc_msgSendSuper_stret(void); void RewriteModernObjC::SynthMsgSendSuperStretFunctionDecl() { IdentifierInfo *msgSendIdent = &Context->Idents.get("objc_msgSendSuper_stret"); - SmallVector ArgTys; - RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl, - SourceLocation(), SourceLocation(), - &Context->Idents.get("objc_super")); - QualType argT = Context->getPointerType(Context->getTagDeclType(RD)); - assert(!argT.isNull() && "Can't build 'struct objc_super *' type"); - ArgTys.push_back(argT); - argT = Context->getObjCSelType(); - assert(!argT.isNull() && "Can't find 'SEL' type"); - ArgTys.push_back(argT); + SmallVector ArgTys; + ArgTys.push_back(Context->VoidTy); QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(), - &ArgTys[0], ArgTys.size(), + &ArgTys[0], 1, true /*isVariadic*/); MsgSendSuperStretFunctionDecl = FunctionDecl::Create(*Context, TUDecl, SourceLocation(), @@ -2925,18 +2884,20 @@ Stmt *RewriteModernObjC::RewriteObjCDictionaryLiteralExpr(ObjCDictionaryLiteral return CE; } -// struct objc_super { struct objc_object *receiver; struct objc_class *super; }; +// struct __rw_objc_super { +// struct objc_object *object; struct objc_object *superClass; +// }; QualType RewriteModernObjC::getSuperStructType() { if (!SuperStructDecl) { SuperStructDecl = RecordDecl::Create(*Context, TTK_Struct, TUDecl, SourceLocation(), SourceLocation(), - &Context->Idents.get("objc_super")); + &Context->Idents.get("__rw_objc_super")); QualType FieldTypes[2]; - // struct objc_object *receiver; + // struct objc_object *object; FieldTypes[0] = Context->getObjCIdType(); - // struct objc_class *super; - FieldTypes[1] = Context->getObjCClassType(); + // struct objc_object *superClass; + FieldTypes[1] = Context->getObjCIdType(); // Create fields for (unsigned i = 0; i < 2; ++i) { @@ -3073,7 +3034,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp, NoTypeInfoCStyleCastExpr(Context, Context->getObjCIdType(), CK_BitCast, Cls)); - // struct objc_super + // struct __rw_objc_super QualType superType = getSuperStructType(); Expr *SuperRep; @@ -3091,7 +3052,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp, // the structure definition in the header. The rewriter has it's own // internal definition (__rw_objc_super) that is uses. This is why // we need the cast below. For example: - // (struct objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER")) + // (struct __rw_objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER")) // SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf, Context->getPointerType(SuperRep->getType()), @@ -3101,7 +3062,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp, Context->getPointerType(superType), CK_BitCast, SuperRep); } else { - // (struct objc_super) { } + // (struct __rw_objc_super) { } InitListExpr *ILE = new (Context) InitListExpr(*Context, SourceLocation(), &InitExprs[0], InitExprs.size(), @@ -3111,7 +3072,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp, SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo, superType, VK_LValue, ILE, false); - // struct objc_super * + // struct __rw_objc_super * SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf, Context->getPointerType(SuperRep->getType()), VK_RValue, OK_Ordinary, @@ -3183,7 +3144,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp, // set 'super class', using class_getSuperclass(). NoTypeInfoCStyleCastExpr(Context, Context->getObjCIdType(), CK_BitCast, Cls)); - // struct objc_super + // struct __rw_objc_super QualType superType = getSuperStructType(); Expr *SuperRep; @@ -3200,7 +3161,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp, // the structure definition in the header. The rewriter has it's own // internal definition (__rw_objc_super) that is uses. This is why // we need the cast below. For example: - // (struct objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER")) + // (struct __rw_objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER")) // SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf, Context->getPointerType(SuperRep->getType()), @@ -3210,7 +3171,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp, Context->getPointerType(superType), CK_BitCast, SuperRep); } else { - // (struct objc_super) { } + // (struct __rw_objc_super) { } InitListExpr *ILE = new (Context) InitListExpr(*Context, SourceLocation(), &InitExprs[0], InitExprs.size(), @@ -4022,11 +3983,25 @@ std::string RewriteModernObjC::SynthesizeBlockDescriptor(std::string DescTag, return S; } +/// getFunctionSourceLocation - returns start location of a function +/// definition. Complication arises when function has declared as +/// extern "C" or extern "C" {...} +static SourceLocation getFunctionSourceLocation (FunctionDecl *FD) { + if (!FD->isExternC() || FD->isMain()) + return FD->getTypeSpecStartLoc(); + const DeclContext *DC = FD->getDeclContext(); + if (const LinkageSpecDecl *LSD = dyn_cast(DC)) { + SourceLocation BodyRBrace = LSD->getRBraceLoc(); + // if it is extern "C" {...}, return function decl's own location. + if (BodyRBrace.isValid()) + return FD->getTypeSpecStartLoc(); + return LSD->getExternLoc(); + } + return FD->getTypeSpecStartLoc(); +} + void RewriteModernObjC::SynthesizeBlockLiterals(SourceLocation FunLocStart, StringRef FunName) { - // Insert declaration for the function in which block literal is used. - if (CurFunctionDeclToDeclareForBlock && !Blocks.empty()) - RewriteBlockLiteralFunctionDecl(CurFunctionDeclToDeclareForBlock); bool RewriteSC = (GlobalVarDecl && !Blocks.empty() && GlobalVarDecl->getStorageClass() == SC_Static && @@ -4135,7 +4110,7 @@ void RewriteModernObjC::SynthesizeBlockLiterals(SourceLocation FunLocStart, } void RewriteModernObjC::InsertBlockLiteralsWithinFunction(FunctionDecl *FD) { - SourceLocation FunLocStart = FD->getTypeSpecStartLoc(); + SourceLocation FunLocStart = getFunctionSourceLocation(FD); StringRef FuncName = FD->getName(); SynthesizeBlockLiterals(FunLocStart, FuncName); @@ -4170,11 +4145,15 @@ void RewriteModernObjC::GetBlockDeclRefExprs(Stmt *S) { GetBlockDeclRefExprs(*CI); } // Handle specific things. - if (DeclRefExpr *DRE = dyn_cast(S)) - if (DRE->refersToEnclosingLocal() && - HasLocalVariableExternalStorage(DRE->getDecl())) { - BlockDeclRefs.push_back(DRE); + if (DeclRefExpr *DRE = dyn_cast(S)) { + if (DRE->refersToEnclosingLocal()) { + // FIXME: Handle enums. + if (!isa(DRE->getDecl())) + BlockDeclRefs.push_back(DRE); + if (HasLocalVariableExternalStorage(DRE->getDecl())) + BlockDeclRefs.push_back(DRE); } + } return; } @@ -4474,19 +4453,18 @@ void RewriteModernObjC::RewriteCastExpr(CStyleCastExpr *CE) { void RewriteModernObjC::RewriteImplicitCastObjCExpr(CastExpr *IC) { CastKind CastKind = IC->getCastKind(); + if (CastKind != CK_BlockPointerToObjCPointerCast && + CastKind != CK_AnyPointerToBlockPointerCast) + return; - if (CastKind == CK_BlockPointerToObjCPointerCast) { - CStyleCastExpr * CastExpr = - NoTypeInfoCStyleCastExpr(Context, IC->getType(), CK_BitCast, IC); - ReplaceStmt(IC, CastExpr); - } - else if (CastKind == CK_AnyPointerToBlockPointerCast) { - QualType BlockT = IC->getType(); - (void)convertBlockPointerToFunctionPointer(BlockT); - CStyleCastExpr * CastExpr = - NoTypeInfoCStyleCastExpr(Context, BlockT, CK_BitCast, IC); - ReplaceStmt(IC, CastExpr); - } + QualType QT = IC->getType(); + (void)convertBlockPointerToFunctionPointer(QT); + std::string TypeString(QT.getAsString(Context->getPrintingPolicy())); + std::string Str = "("; + Str += TypeString; + Str += ")"; + InsertText(IC->getSubExpr()->getLocStart(), &Str[0], Str.size()); + return; } @@ -4742,10 +4720,6 @@ std::string RewriteModernObjC::SynthesizeByrefCopyDestroyHelper(VarDecl *VD, /// /// void RewriteModernObjC::RewriteByRefVar(VarDecl *ND) { - // Insert declaration for the function in which block literal is - // used. - if (CurFunctionDeclToDeclareForBlock) - RewriteBlockLiteralFunctionDecl(CurFunctionDeclToDeclareForBlock); int flag = 0; int isa = 0; SourceLocation DeclLoc = ND->getTypeSpecStartLoc(); @@ -4784,7 +4758,7 @@ void RewriteModernObjC::RewriteByRefVar(VarDecl *ND) { // Insert this type in global scope. It is needed by helper function. SourceLocation FunLocStart; if (CurFunctionDef) - FunLocStart = CurFunctionDef->getTypeSpecStartLoc(); + FunLocStart = getFunctionSourceLocation(CurFunctionDef); else { assert(CurMethodDef && "RewriteByRefVar - CurMethodDef is null"); FunLocStart = CurMethodDef->getLocStart(); @@ -5375,6 +5349,7 @@ Stmt *RewriteModernObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) { RewriteImplicitCastObjCExpr(ICE); } #if 0 + if (ImplicitCastExpr *ICE = dyn_cast(S)) { CastExpr *Replacement = new (Context) CastExpr(ICE->getType(), ICE->getSubExpr(), @@ -5627,13 +5602,11 @@ void RewriteModernObjC::Initialize(ASTContext &context) { // These are currently generated. Preamble += "\n#pragma section(\".objc_classlist$B\", long, read, write)\n"; Preamble += "#pragma section(\".objc_catlist$B\", long, read, write)\n"; - Preamble += "#pragma section(\".objc_protolist$B\", long, read, write)\n"; Preamble += "#pragma section(\".objc_imageinfo$B\", long, read, write)\n"; Preamble += "#pragma section(\".objc_nlclslist$B\", long, read, write)\n"; Preamble += "#pragma section(\".objc_nlcatlist$B\", long, read, write)\n"; Preamble += "#pragma section(\".objc_protorefs$B\", long, read, write)\n"; // These are generated but not necessary for functionality. - Preamble += "#pragma section(\".datacoal_nt$B\", long, read, write)\n"; Preamble += "#pragma section(\".cat_cls_meth$B\", long, read, write)\n"; Preamble += "#pragma section(\".inst_meth$B\", long, read, write)\n"; Preamble += "#pragma section(\".cls_meth$B\", long, read, write)\n"; @@ -6604,7 +6577,7 @@ void RewriteModernObjC::RewriteObjCProtocolMetaData(ObjCProtocolDecl *PDecl, // Writer out root metadata for current protocol: struct _protocol_t Result += "\n"; if (LangOpts.MicrosoftExt) - Result += "__declspec(allocate(\".datacoal_nt$B\")) "; + Result += "static "; Result += "struct _protocol_t _OBJC_PROTOCOL_"; Result += PDecl->getNameAsString(); Result += " __attribute__ ((used, section (\"__DATA,__datacoal_nt,coalesced\"))) = {\n"; @@ -6662,11 +6635,8 @@ void RewriteModernObjC::RewriteObjCProtocolMetaData(ObjCProtocolDecl *PDecl, else Result += "\t0\n};\n"; - // Use this protocol meta-data to build protocol list table in section - // .objc_protolist$B - // Unspecified visibility means 'private extern'. if (LangOpts.MicrosoftExt) - Result += "__declspec(allocate(\".objc_protolist$B\")) "; + Result += "static "; Result += "struct _protocol_t *"; Result += "_OBJC_LABEL_PROTOCOL_$_"; Result += PDecl->getNameAsString(); Result += " = &_OBJC_PROTOCOL_"; Result += PDecl->getNameAsString(); diff --git a/contrib/llvm/tools/clang/lib/Rewrite/RewriteRope.cpp b/contrib/llvm/tools/clang/lib/Rewrite/RewriteRope.cpp index 6c211b28fd9..cc8de1b11a1 100644 --- a/contrib/llvm/tools/clang/lib/Rewrite/RewriteRope.cpp +++ b/contrib/llvm/tools/clang/lib/Rewrite/RewriteRope.cpp @@ -407,6 +407,11 @@ namespace { Size = LHS->size() + RHS->size(); } + ~RopePieceBTreeInterior() { + for (unsigned i = 0, e = getNumChildren(); i != e; ++i) + Children[i]->Destroy(); + } + bool isFull() const { return NumChildren == 2*WidthFactor; } unsigned getNumChildren() const { return NumChildren; } diff --git a/contrib/llvm/tools/clang/lib/Sema/Sema.cpp b/contrib/llvm/tools/clang/lib/Sema/Sema.cpp index fcdfcace0ce..30a9cd751a6 100644 --- a/contrib/llvm/tools/clang/lib/Sema/Sema.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/Sema.cpp @@ -103,6 +103,7 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, AnalysisWarnings(*this) { TUScope = 0; + LoadedExternalKnownNamespaces = false; for (unsigned I = 0; I != NSAPI::NumNSNumberLiteralMethods; ++I) NSNumberLiteralMethods[I] = 0; diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaAccess.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaAccess.cpp index dea5e76d9e1..01c141e57f9 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaAccess.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaAccess.cpp @@ -779,6 +779,13 @@ static AccessResult HasAccess(Sema &S, // that the naming class has to be derived from the effective // context. + // Emulate a MSVC bug where the creation of pointer-to-member + // to protected member of base class is allowed but only from + // a static function member functions. + if (S.getLangOpts().MicrosoftMode && !EC.Functions.empty()) + if (CXXMethodDecl* MD = dyn_cast(EC.Functions.front())) + if (MD->isStatic()) return AR_accessible; + // Despite the standard's confident wording, there is a case // where you can have an instance member that's neither in a // pointer-to-member expression nor in a member access: when diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp index 8b314b524f4..1227e92f76e 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp @@ -4471,6 +4471,11 @@ static bool FindOverriddenMethod(const CXXBaseSpecifier *Specifier, return false; } +static bool hasDelayedExceptionSpec(CXXMethodDecl *Method) { + const FunctionProtoType *Proto =Method->getType()->getAs(); + return Proto && Proto->getExceptionSpecType() == EST_Delayed; +} + /// AddOverriddenMethods - See if a method overrides any in the base classes, /// and if so, check that it's a valid override and remember it. bool Sema::AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD) { @@ -4486,7 +4491,8 @@ bool Sema::AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD) { if (CXXMethodDecl *OldMD = dyn_cast(*I)) { MD->addOverriddenMethod(OldMD->getCanonicalDecl()); if (!CheckOverridingFunctionReturnType(MD, OldMD) && - !CheckOverridingFunctionExceptionSpec(MD, OldMD) && + (hasDelayedExceptionSpec(MD) || + !CheckOverridingFunctionExceptionSpec(MD, OldMD)) && !CheckIfOverriddenFunctionIsMarkedFinal(MD, OldMD)) { AddedAny = true; } @@ -5834,6 +5840,9 @@ bool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, } } } + + if (Method->isStatic()) + checkThisInStaticMemberFunctionType(Method); } // Extra checking for C++ overloaded operators (C++ [over.oper]). @@ -7176,8 +7185,7 @@ void Sema::ActOnFinishKNRParamDeclarations(Scope *S, Declarator &D, } } -Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, - Declarator &D) { +Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Declarator &D) { assert(getCurFunctionDecl() == 0 && "Function parsing confused"); assert(D.isFunctionDeclarator() && "Not a function declarator!"); Scope *ParentScope = FnBodyScope->getParent(); @@ -7350,6 +7358,10 @@ Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Decl *D) { } } + // Ensure that the function's exception specification is instantiated. + if (const FunctionProtoType *FPT = FD->getType()->getAs()) + ResolveExceptionSpec(D->getLocation(), FPT); + // Checking attributes of current function definition // dllimport attribute. DLLImportAttr *DA = FD->getAttr(); @@ -7554,7 +7566,11 @@ void Sema::ActOnFinishDelayedAttribute(Scope *S, Decl *D, // Always attach attributes to the underlying decl. if (TemplateDecl *TD = dyn_cast(D)) D = TD->getTemplatedDecl(); - ProcessDeclAttributeList(S, D, Attrs.getList()); + ProcessDeclAttributeList(S, D, Attrs.getList()); + + if (CXXMethodDecl *Method = dyn_cast_or_null(D)) + if (Method->isStatic()) + checkThisInStaticMemberFunctionAttributes(Method); } @@ -9768,21 +9784,6 @@ void Sema::ActOnFields(Scope* S, if (!Completed) Record->completeDefinition(); - // Now that the record is complete, do any delayed exception spec checks - // we were missing. - while (!DelayedDestructorExceptionSpecChecks.empty()) { - const CXXDestructorDecl *Dtor = - DelayedDestructorExceptionSpecChecks.back().first; - if (Dtor->getParent() != Record) - break; - - assert(!Dtor->getParent()->isDependentType() && - "Should not ever add destructors of templates into the list."); - CheckOverridingFunctionExceptionSpec(Dtor, - DelayedDestructorExceptionSpecChecks.back().second); - DelayedDestructorExceptionSpecChecks.pop_back(); - } - } else { ObjCIvarDecl **ClsFields = reinterpret_cast(RecFields.data()); diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp index 847f03c948a..c861072ad74 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp @@ -25,6 +25,7 @@ #include "clang/AST/DeclVisitor.h" #include "clang/AST/ExprCXX.h" #include "clang/AST/RecordLayout.h" +#include "clang/AST/RecursiveASTVisitor.h" #include "clang/AST/StmtVisitor.h" #include "clang/AST/TypeLoc.h" #include "clang/AST/TypeOrdering.h" @@ -124,14 +125,17 @@ namespace { } } -void Sema::ImplicitExceptionSpecification::CalledDecl(CXXMethodDecl *Method) { - assert(Context && "ImplicitExceptionSpecification without an ASTContext"); +void Sema::ImplicitExceptionSpecification::CalledDecl(SourceLocation CallLoc, + CXXMethodDecl *Method) { // If we have an MSAny or unknown spec already, don't bother. if (!Method || ComputedEST == EST_MSAny || ComputedEST == EST_Delayed) return; const FunctionProtoType *Proto = Method->getType()->getAs(); + Proto = Self->ResolveExceptionSpec(CallLoc, Proto); + if (!Proto) + return; ExceptionSpecificationType EST = Proto->getExceptionSpecType(); @@ -163,7 +167,8 @@ void Sema::ImplicitExceptionSpecification::CalledDecl(CXXMethodDecl *Method) { // Check out noexcept specs. if (EST == EST_ComputedNoexcept) { - FunctionProtoType::NoexceptResult NR = Proto->getNoexceptSpec(*Context); + FunctionProtoType::NoexceptResult NR = + Proto->getNoexceptSpec(Self->Context); assert(NR != FunctionProtoType::NR_NoNoexcept && "Must have noexcept result for EST_ComputedNoexcept."); assert(NR != FunctionProtoType::NR_Dependent && @@ -187,7 +192,7 @@ void Sema::ImplicitExceptionSpecification::CalledDecl(CXXMethodDecl *Method) { for (FunctionProtoType::exception_iterator E = Proto->exception_begin(), EEnd = Proto->exception_end(); E != EEnd; ++E) - if (ExceptionsSeen.insert(Context->getCanonicalType(*E))) + if (ExceptionsSeen.insert(Self->Context.getCanonicalType(*E))) Exceptions.push_back(*E); } @@ -216,7 +221,7 @@ void Sema::ImplicitExceptionSpecification::CalledExpr(Expr *E) { // implicit definition. For now, we assume that any non-nothrow expression can // throw any exception. - if (E->CanThrow(*Context)) + if (Self->canThrow(E)) ComputedEST = EST_None; } @@ -3921,7 +3926,7 @@ void Sema::CheckExplicitlyDefaultedCopyConstructor(CXXConstructorDecl *CD) { HadError = true; } - ImplicitExceptionSpecification Spec(Context); + ImplicitExceptionSpecification Spec(*this); bool Const; llvm::tie(Spec, Const) = ComputeDefaultedCopyCtorExceptionSpecAndConst(CD->getParent()); @@ -4030,7 +4035,7 @@ void Sema::CheckExplicitlyDefaultedCopyAssignment(CXXMethodDecl *MD) { HadError = true; } - ImplicitExceptionSpecification Spec(Context); + ImplicitExceptionSpecification Spec(*this); bool Const; llvm::tie(Spec, Const) = ComputeDefaultedCopyCtorExceptionSpecAndConst(MD->getParent()); @@ -5920,10 +5925,12 @@ Decl *Sema::ActOnUsingDeclaration(Scope *S, case UnqualifiedId::IK_ConstructorName: case UnqualifiedId::IK_ConstructorTemplateId: - // C++0x inherited constructors. + // C++11 inheriting constructors. Diag(Name.getLocStart(), getLangOpts().CPlusPlus0x ? - diag::warn_cxx98_compat_using_decl_constructor : + // FIXME: Produce warn_cxx98_compat_using_decl_constructor + // instead once inheriting constructors work. + diag::err_using_decl_constructor_unsupported : diag::err_using_decl_constructor) << SS.getRange(); @@ -6813,7 +6820,7 @@ Sema::ComputeDefaultedDefaultCtorExceptionSpec(CXXRecordDecl *ClassDecl) { // C++ [except.spec]p14: // An implicitly declared special member function (Clause 12) shall have an // exception-specification. [...] - ImplicitExceptionSpecification ExceptSpec(Context); + ImplicitExceptionSpecification ExceptSpec(*this); if (ClassDecl->isInvalidDecl()) return ExceptSpec; @@ -6830,7 +6837,7 @@ Sema::ComputeDefaultedDefaultCtorExceptionSpec(CXXRecordDecl *ClassDecl) { // If this is a deleted function, add it anyway. This might be conformant // with the standard. This might not. I'm not sure. It might not matter. if (Constructor) - ExceptSpec.CalledDecl(Constructor); + ExceptSpec.CalledDecl(B->getLocStart(), Constructor); } } @@ -6844,7 +6851,7 @@ Sema::ComputeDefaultedDefaultCtorExceptionSpec(CXXRecordDecl *ClassDecl) { // If this is a deleted function, add it anyway. This might be conformant // with the standard. This might not. I'm not sure. It might not matter. if (Constructor) - ExceptSpec.CalledDecl(Constructor); + ExceptSpec.CalledDecl(B->getLocStart(), Constructor); } } @@ -6867,7 +6874,7 @@ Sema::ComputeDefaultedDefaultCtorExceptionSpec(CXXRecordDecl *ClassDecl) { // might just be ill-formed because this function attempts to refer to // a deleted function here. if (Constructor) - ExceptSpec.CalledDecl(Constructor); + ExceptSpec.CalledDecl(F->getLocation(), Constructor); } } @@ -6989,6 +6996,7 @@ void Sema::ActOnFinishDelayedMemberInitializers(Decl *D) { const FunctionProtoType *CtorTy = CtorDecl->getType()->castAs(); if (CtorTy->getExceptionSpecType() == EST_Delayed) { + // FIXME: Don't do this unless the exception spec is needed. ImplicitExceptionSpecification Spec = ComputeDefaultedDefaultCtorExceptionSpec(ClassDecl); FunctionProtoType::ExtProtoInfo EPI = Spec.getEPI(); @@ -7189,7 +7197,7 @@ Sema::ComputeDefaultedDtorExceptionSpec(CXXRecordDecl *ClassDecl) { // C++ [except.spec]p14: // An implicitly declared special member function (Clause 12) shall have // an exception-specification. - ImplicitExceptionSpecification ExceptSpec(Context); + ImplicitExceptionSpecification ExceptSpec(*this); if (ClassDecl->isInvalidDecl()) return ExceptSpec; @@ -7201,7 +7209,7 @@ Sema::ComputeDefaultedDtorExceptionSpec(CXXRecordDecl *ClassDecl) { continue; if (const RecordType *BaseType = B->getType()->getAs()) - ExceptSpec.CalledDecl( + ExceptSpec.CalledDecl(B->getLocStart(), LookupDestructor(cast(BaseType->getDecl()))); } @@ -7210,7 +7218,7 @@ Sema::ComputeDefaultedDtorExceptionSpec(CXXRecordDecl *ClassDecl) { BEnd = ClassDecl->vbases_end(); B != BEnd; ++B) { if (const RecordType *BaseType = B->getType()->getAs()) - ExceptSpec.CalledDecl( + ExceptSpec.CalledDecl(B->getLocStart(), LookupDestructor(cast(BaseType->getDecl()))); } @@ -7220,7 +7228,7 @@ Sema::ComputeDefaultedDtorExceptionSpec(CXXRecordDecl *ClassDecl) { F != FEnd; ++F) { if (const RecordType *RecordTy = Context.getBaseElementType(F->getType())->getAs()) - ExceptSpec.CalledDecl( + ExceptSpec.CalledDecl(F->getLocation(), LookupDestructor(cast(RecordTy->getDecl()))); } @@ -7311,15 +7319,42 @@ void Sema::DefineImplicitDestructor(SourceLocation CurrentLocation, } } +/// \brief Perform any semantic analysis which needs to be delayed until all +/// pending class member declarations have been parsed. +void Sema::ActOnFinishCXXMemberDecls() { + // Now we have parsed all exception specifications, determine the implicit + // exception specifications for destructors. + for (unsigned i = 0, e = DelayedDestructorExceptionSpecs.size(); + i != e; ++i) { + CXXDestructorDecl *Dtor = DelayedDestructorExceptionSpecs[i]; + AdjustDestructorExceptionSpec(Dtor->getParent(), Dtor, true); + } + DelayedDestructorExceptionSpecs.clear(); + + // Perform any deferred checking of exception specifications for virtual + // destructors. + for (unsigned i = 0, e = DelayedDestructorExceptionSpecChecks.size(); + i != e; ++i) { + const CXXDestructorDecl *Dtor = + DelayedDestructorExceptionSpecChecks[i].first; + assert(!Dtor->getParent()->isDependentType() && + "Should not ever add destructors of templates into the list."); + CheckOverridingFunctionExceptionSpec(Dtor, + DelayedDestructorExceptionSpecChecks[i].second); + } + DelayedDestructorExceptionSpecChecks.clear(); +} + void Sema::AdjustDestructorExceptionSpec(CXXRecordDecl *classDecl, - CXXDestructorDecl *destructor) { + CXXDestructorDecl *destructor, + bool WasDelayed) { // C++11 [class.dtor]p3: // A declaration of a destructor that does not have an exception- // specification is implicitly considered to have the same exception- // specification as an implicit declaration. const FunctionProtoType *dtorType = destructor->getType()-> getAs(); - if (dtorType->hasExceptionSpec()) + if (!WasDelayed && dtorType->hasExceptionSpec()) return; ImplicitExceptionSpecification exceptSpec = @@ -7336,6 +7371,14 @@ void Sema::AdjustDestructorExceptionSpec(CXXRecordDecl *classDecl, destructor->setType(ty); + // If we can't compute the exception specification for this destructor yet + // (because it depends on an exception specification which we have not parsed + // yet), make a note that we need to try again when the class is complete. + if (epi.ExceptionSpecType == EST_Delayed) { + assert(!WasDelayed && "couldn't compute destructor exception spec"); + DelayedDestructorExceptionSpecs.push_back(destructor); + } + // FIXME: If the destructor has a body that could throw, and the newly created // spec doesn't allow exceptions, we should emit a warning, because this // change in behavior can break conforming C++03 programs at runtime. @@ -7545,7 +7588,7 @@ std::pair Sema::ComputeDefaultedCopyAssignmentExceptionSpecAndConst( CXXRecordDecl *ClassDecl) { if (ClassDecl->isInvalidDecl()) - return std::make_pair(ImplicitExceptionSpecification(Context), false); + return std::make_pair(ImplicitExceptionSpecification(*this), false); // C++ [class.copy]p10: // If the class definition does not explicitly declare a copy @@ -7571,8 +7614,9 @@ Sema::ComputeDefaultedCopyAssignmentExceptionSpecAndConst( assert(!Base->getType()->isDependentType() && "Cannot generate implicit members for class with dependent bases."); CXXRecordDecl *BaseClassDecl = Base->getType()->getAsCXXRecordDecl(); - LookupCopyingAssignment(BaseClassDecl, Qualifiers::Const, false, 0, - &HasConstCopyAssignment); + HasConstCopyAssignment &= + (bool)LookupCopyingAssignment(BaseClassDecl, Qualifiers::Const, + false, 0); } // In C++11, the above citation has "or virtual" added @@ -7583,8 +7627,9 @@ Sema::ComputeDefaultedCopyAssignmentExceptionSpecAndConst( assert(!Base->getType()->isDependentType() && "Cannot generate implicit members for class with dependent bases."); CXXRecordDecl *BaseClassDecl = Base->getType()->getAsCXXRecordDecl(); - LookupCopyingAssignment(BaseClassDecl, Qualifiers::Const, false, 0, - &HasConstCopyAssignment); + HasConstCopyAssignment &= + (bool)LookupCopyingAssignment(BaseClassDecl, Qualifiers::Const, + false, 0); } } @@ -7598,8 +7643,9 @@ Sema::ComputeDefaultedCopyAssignmentExceptionSpecAndConst( ++Field) { QualType FieldType = Context.getBaseElementType((*Field)->getType()); if (CXXRecordDecl *FieldClassDecl = FieldType->getAsCXXRecordDecl()) { - LookupCopyingAssignment(FieldClassDecl, Qualifiers::Const, false, 0, - &HasConstCopyAssignment); + HasConstCopyAssignment &= + (bool)LookupCopyingAssignment(FieldClassDecl, Qualifiers::Const, + false, 0); } } @@ -7618,7 +7664,7 @@ Sema::ComputeDefaultedCopyAssignmentExceptionSpecAndConst( // Based on a similar decision made for constness in C++0x, we're erring on // the side of assuming such calls to be made regardless of whether they // actually happen. - ImplicitExceptionSpecification ExceptSpec(Context); + ImplicitExceptionSpecification ExceptSpec(*this); unsigned ArgQuals = HasConstCopyAssignment ? Qualifiers::Const : 0; for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), BaseEnd = ClassDecl->bases_end(); @@ -7630,7 +7676,7 @@ Sema::ComputeDefaultedCopyAssignmentExceptionSpecAndConst( = cast(Base->getType()->getAs()->getDecl()); if (CXXMethodDecl *CopyAssign = LookupCopyingAssignment(BaseClassDecl, ArgQuals, false, 0)) - ExceptSpec.CalledDecl(CopyAssign); + ExceptSpec.CalledDecl(Base->getLocStart(), CopyAssign); } for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), @@ -7640,7 +7686,7 @@ Sema::ComputeDefaultedCopyAssignmentExceptionSpecAndConst( = cast(Base->getType()->getAs()->getDecl()); if (CXXMethodDecl *CopyAssign = LookupCopyingAssignment(BaseClassDecl, ArgQuals, false, 0)) - ExceptSpec.CalledDecl(CopyAssign); + ExceptSpec.CalledDecl(Base->getLocStart(), CopyAssign); } for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(), @@ -7651,7 +7697,7 @@ Sema::ComputeDefaultedCopyAssignmentExceptionSpecAndConst( if (CXXRecordDecl *FieldClassDecl = FieldType->getAsCXXRecordDecl()) { if (CXXMethodDecl *CopyAssign = LookupCopyingAssignment(FieldClassDecl, ArgQuals, false, 0)) - ExceptSpec.CalledDecl(CopyAssign); + ExceptSpec.CalledDecl(Field->getLocation(), CopyAssign); } } @@ -7664,7 +7710,7 @@ CXXMethodDecl *Sema::DeclareImplicitCopyAssignment(CXXRecordDecl *ClassDecl) { // for determining the argument type of the operator. Note also that // operators taking an object instead of a reference are allowed. - ImplicitExceptionSpecification Spec(Context); + ImplicitExceptionSpecification Spec(*this); bool Const; llvm::tie(Spec, Const) = ComputeDefaultedCopyAssignmentExceptionSpecAndConst(ClassDecl); @@ -8031,7 +8077,7 @@ void Sema::DefineImplicitCopyAssignment(SourceLocation CurrentLocation, Sema::ImplicitExceptionSpecification Sema::ComputeDefaultedMoveAssignmentExceptionSpec(CXXRecordDecl *ClassDecl) { - ImplicitExceptionSpecification ExceptSpec(Context); + ImplicitExceptionSpecification ExceptSpec(*this); if (ClassDecl->isInvalidDecl()) return ExceptSpec; @@ -8058,7 +8104,7 @@ Sema::ComputeDefaultedMoveAssignmentExceptionSpec(CXXRecordDecl *ClassDecl) { = cast(Base->getType()->getAs()->getDecl()); if (CXXMethodDecl *MoveAssign = LookupMovingAssignment(BaseClassDecl, false, 0)) - ExceptSpec.CalledDecl(MoveAssign); + ExceptSpec.CalledDecl(Base->getLocStart(), MoveAssign); } for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), @@ -8068,7 +8114,7 @@ Sema::ComputeDefaultedMoveAssignmentExceptionSpec(CXXRecordDecl *ClassDecl) { = cast(Base->getType()->getAs()->getDecl()); if (CXXMethodDecl *MoveAssign = LookupMovingAssignment(BaseClassDecl, false, 0)) - ExceptSpec.CalledDecl(MoveAssign); + ExceptSpec.CalledDecl(Base->getLocStart(), MoveAssign); } for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(), @@ -8079,7 +8125,7 @@ Sema::ComputeDefaultedMoveAssignmentExceptionSpec(CXXRecordDecl *ClassDecl) { if (CXXRecordDecl *FieldClassDecl = FieldType->getAsCXXRecordDecl()) { if (CXXMethodDecl *MoveAssign = LookupMovingAssignment(FieldClassDecl, false, 0)) - ExceptSpec.CalledDecl(MoveAssign); + ExceptSpec.CalledDecl(Field->getLocation(), MoveAssign); } } @@ -8577,7 +8623,7 @@ void Sema::DefineImplicitMoveAssignment(SourceLocation CurrentLocation, std::pair Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) { if (ClassDecl->isInvalidDecl()) - return std::make_pair(ImplicitExceptionSpecification(Context), false); + return std::make_pair(ImplicitExceptionSpecification(*this), false); // C++ [class.copy]p5: // The implicitly-declared copy constructor for a class X will @@ -8602,8 +8648,8 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) { CXXRecordDecl *BaseClassDecl = cast(Base->getType()->getAs()->getDecl()); - LookupCopyingConstructor(BaseClassDecl, Qualifiers::Const, - &HasConstCopyConstructor); + HasConstCopyConstructor &= + (bool)LookupCopyingConstructor(BaseClassDecl, Qualifiers::Const); } for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), @@ -8612,8 +8658,8 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) { ++Base) { CXXRecordDecl *BaseClassDecl = cast(Base->getType()->getAs()->getDecl()); - LookupCopyingConstructor(BaseClassDecl, Qualifiers::Const, - &HasConstCopyConstructor); + HasConstCopyConstructor &= + (bool)LookupCopyingConstructor(BaseClassDecl, Qualifiers::Const); } // -- for all the nonstatic data members of X that are of a @@ -8626,8 +8672,8 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) { ++Field) { QualType FieldType = Context.getBaseElementType((*Field)->getType()); if (CXXRecordDecl *FieldClassDecl = FieldType->getAsCXXRecordDecl()) { - LookupCopyingConstructor(FieldClassDecl, Qualifiers::Const, - &HasConstCopyConstructor); + HasConstCopyConstructor &= + (bool)LookupCopyingConstructor(FieldClassDecl, Qualifiers::Const); } } // Otherwise, the implicitly declared copy constructor will have @@ -8638,7 +8684,7 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) { // C++ [except.spec]p14: // An implicitly declared special member function (Clause 12) shall have an // exception-specification. [...] - ImplicitExceptionSpecification ExceptSpec(Context); + ImplicitExceptionSpecification ExceptSpec(*this); unsigned Quals = HasConstCopyConstructor? Qualifiers::Const : 0; for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), BaseEnd = ClassDecl->bases_end(); @@ -8652,7 +8698,7 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) { = cast(Base->getType()->getAs()->getDecl()); if (CXXConstructorDecl *CopyConstructor = LookupCopyingConstructor(BaseClassDecl, Quals)) - ExceptSpec.CalledDecl(CopyConstructor); + ExceptSpec.CalledDecl(Base->getLocStart(), CopyConstructor); } for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), BaseEnd = ClassDecl->vbases_end(); @@ -8662,7 +8708,7 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) { = cast(Base->getType()->getAs()->getDecl()); if (CXXConstructorDecl *CopyConstructor = LookupCopyingConstructor(BaseClassDecl, Quals)) - ExceptSpec.CalledDecl(CopyConstructor); + ExceptSpec.CalledDecl(Base->getLocStart(), CopyConstructor); } for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(), FieldEnd = ClassDecl->field_end(); @@ -8672,7 +8718,7 @@ Sema::ComputeDefaultedCopyCtorExceptionSpecAndConst(CXXRecordDecl *ClassDecl) { if (CXXRecordDecl *FieldClassDecl = FieldType->getAsCXXRecordDecl()) { if (CXXConstructorDecl *CopyConstructor = LookupCopyingConstructor(FieldClassDecl, Quals)) - ExceptSpec.CalledDecl(CopyConstructor); + ExceptSpec.CalledDecl(Field->getLocation(), CopyConstructor); } } @@ -8685,7 +8731,7 @@ CXXConstructorDecl *Sema::DeclareImplicitCopyConstructor( // If the class definition does not explicitly declare a copy // constructor, one is declared implicitly. - ImplicitExceptionSpecification Spec(Context); + ImplicitExceptionSpecification Spec(*this); bool Const; llvm::tie(Spec, Const) = ComputeDefaultedCopyCtorExceptionSpecAndConst(ClassDecl); @@ -8783,7 +8829,7 @@ Sema::ComputeDefaultedMoveCtorExceptionSpec(CXXRecordDecl *ClassDecl) { // C++ [except.spec]p14: // An implicitly declared special member function (Clause 12) shall have an // exception-specification. [...] - ImplicitExceptionSpecification ExceptSpec(Context); + ImplicitExceptionSpecification ExceptSpec(*this); if (ClassDecl->isInvalidDecl()) return ExceptSpec; @@ -8800,7 +8846,7 @@ Sema::ComputeDefaultedMoveCtorExceptionSpec(CXXRecordDecl *ClassDecl) { // If this is a deleted function, add it anyway. This might be conformant // with the standard. This might not. I'm not sure. It might not matter. if (Constructor) - ExceptSpec.CalledDecl(Constructor); + ExceptSpec.CalledDecl(B->getLocStart(), Constructor); } } @@ -8814,7 +8860,7 @@ Sema::ComputeDefaultedMoveCtorExceptionSpec(CXXRecordDecl *ClassDecl) { // If this is a deleted function, add it anyway. This might be conformant // with the standard. This might not. I'm not sure. It might not matter. if (Constructor) - ExceptSpec.CalledDecl(Constructor); + ExceptSpec.CalledDecl(B->getLocStart(), Constructor); } } @@ -8832,7 +8878,7 @@ Sema::ComputeDefaultedMoveCtorExceptionSpec(CXXRecordDecl *ClassDecl) { // might just be ill-formed because this function attempts to refer to // a deleted function here. if (Constructor) - ExceptSpec.CalledDecl(Constructor); + ExceptSpec.CalledDecl(F->getLocation(), Constructor); } } @@ -11053,6 +11099,205 @@ void Sema::CheckDelegatingCtorCycles() { (*CI)->setInvalidDecl(); } +namespace { + /// \brief AST visitor that finds references to the 'this' expression. + class FindCXXThisExpr : public RecursiveASTVisitor { + Sema &S; + + public: + explicit FindCXXThisExpr(Sema &S) : S(S) { } + + bool VisitCXXThisExpr(CXXThisExpr *E) { + S.Diag(E->getLocation(), diag::err_this_static_member_func) + << E->isImplicit(); + return false; + } + }; +} + +bool Sema::checkThisInStaticMemberFunctionType(CXXMethodDecl *Method) { + TypeSourceInfo *TSInfo = Method->getTypeSourceInfo(); + if (!TSInfo) + return false; + + TypeLoc TL = TSInfo->getTypeLoc(); + FunctionProtoTypeLoc *ProtoTL = dyn_cast(&TL); + if (!ProtoTL) + return false; + + // C++11 [expr.prim.general]p3: + // [The expression this] shall not appear before the optional + // cv-qualifier-seq and it shall not appear within the declaration of a + // static member function (although its type and value category are defined + // within a static member function as they are within a non-static member + // function). [ Note: this is because declaration matching does not occur + // until the complete declarator is known. - end note ] + const FunctionProtoType *Proto = ProtoTL->getTypePtr(); + FindCXXThisExpr Finder(*this); + + // If the return type came after the cv-qualifier-seq, check it now. + if (Proto->hasTrailingReturn() && + !Finder.TraverseTypeLoc(ProtoTL->getResultLoc())) + return true; + + // Check the exception specification. + if (checkThisInStaticMemberFunctionExceptionSpec(Method)) + return true; + + return checkThisInStaticMemberFunctionAttributes(Method); +} + +bool Sema::checkThisInStaticMemberFunctionExceptionSpec(CXXMethodDecl *Method) { + TypeSourceInfo *TSInfo = Method->getTypeSourceInfo(); + if (!TSInfo) + return false; + + TypeLoc TL = TSInfo->getTypeLoc(); + FunctionProtoTypeLoc *ProtoTL = dyn_cast(&TL); + if (!ProtoTL) + return false; + + const FunctionProtoType *Proto = ProtoTL->getTypePtr(); + FindCXXThisExpr Finder(*this); + + switch (Proto->getExceptionSpecType()) { + case EST_Uninstantiated: + case EST_BasicNoexcept: + case EST_Delayed: + case EST_DynamicNone: + case EST_MSAny: + case EST_None: + break; + + case EST_ComputedNoexcept: + if (!Finder.TraverseStmt(Proto->getNoexceptExpr())) + return true; + + case EST_Dynamic: + for (FunctionProtoType::exception_iterator E = Proto->exception_begin(), + EEnd = Proto->exception_end(); + E != EEnd; ++E) { + if (!Finder.TraverseType(*E)) + return true; + } + break; + } + + return false; +} + +bool Sema::checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method) { + FindCXXThisExpr Finder(*this); + + // Check attributes. + for (Decl::attr_iterator A = Method->attr_begin(), AEnd = Method->attr_end(); + A != AEnd; ++A) { + // FIXME: This should be emitted by tblgen. + Expr *Arg = 0; + ArrayRef Args; + if (GuardedByAttr *G = dyn_cast(*A)) + Arg = G->getArg(); + else if (PtGuardedByAttr *G = dyn_cast(*A)) + Arg = G->getArg(); + else if (AcquiredAfterAttr *AA = dyn_cast(*A)) + Args = ArrayRef(AA->args_begin(), AA->args_size()); + else if (AcquiredBeforeAttr *AB = dyn_cast(*A)) + Args = ArrayRef(AB->args_begin(), AB->args_size()); + else if (ExclusiveLockFunctionAttr *ELF + = dyn_cast(*A)) + Args = ArrayRef(ELF->args_begin(), ELF->args_size()); + else if (SharedLockFunctionAttr *SLF + = dyn_cast(*A)) + Args = ArrayRef(SLF->args_begin(), SLF->args_size()); + else if (ExclusiveTrylockFunctionAttr *ETLF + = dyn_cast(*A)) { + Arg = ETLF->getSuccessValue(); + Args = ArrayRef(ETLF->args_begin(), ETLF->args_size()); + } else if (SharedTrylockFunctionAttr *STLF + = dyn_cast(*A)) { + Arg = STLF->getSuccessValue(); + Args = ArrayRef(STLF->args_begin(), STLF->args_size()); + } else if (UnlockFunctionAttr *UF = dyn_cast(*A)) + Args = ArrayRef(UF->args_begin(), UF->args_size()); + else if (LockReturnedAttr *LR = dyn_cast(*A)) + Arg = LR->getArg(); + else if (LocksExcludedAttr *LE = dyn_cast(*A)) + Args = ArrayRef(LE->args_begin(), LE->args_size()); + else if (ExclusiveLocksRequiredAttr *ELR + = dyn_cast(*A)) + Args = ArrayRef(ELR->args_begin(), ELR->args_size()); + else if (SharedLocksRequiredAttr *SLR + = dyn_cast(*A)) + Args = ArrayRef(SLR->args_begin(), SLR->args_size()); + + if (Arg && !Finder.TraverseStmt(Arg)) + return true; + + for (unsigned I = 0, N = Args.size(); I != N; ++I) { + if (!Finder.TraverseStmt(Args[I])) + return true; + } + } + + return false; +} + +void +Sema::checkExceptionSpecification(ExceptionSpecificationType EST, + ArrayRef DynamicExceptions, + ArrayRef DynamicExceptionRanges, + Expr *NoexceptExpr, + llvm::SmallVectorImpl &Exceptions, + FunctionProtoType::ExtProtoInfo &EPI) { + Exceptions.clear(); + EPI.ExceptionSpecType = EST; + if (EST == EST_Dynamic) { + Exceptions.reserve(DynamicExceptions.size()); + for (unsigned ei = 0, ee = DynamicExceptions.size(); ei != ee; ++ei) { + // FIXME: Preserve type source info. + QualType ET = GetTypeFromParser(DynamicExceptions[ei]); + + SmallVector Unexpanded; + collectUnexpandedParameterPacks(ET, Unexpanded); + if (!Unexpanded.empty()) { + DiagnoseUnexpandedParameterPacks(DynamicExceptionRanges[ei].getBegin(), + UPPC_ExceptionType, + Unexpanded); + continue; + } + + // Check that the type is valid for an exception spec, and + // drop it if not. + if (!CheckSpecifiedExceptionType(ET, DynamicExceptionRanges[ei])) + Exceptions.push_back(ET); + } + EPI.NumExceptions = Exceptions.size(); + EPI.Exceptions = Exceptions.data(); + return; + } + + if (EST == EST_ComputedNoexcept) { + // If an error occurred, there's no expression here. + if (NoexceptExpr) { + assert((NoexceptExpr->isTypeDependent() || + NoexceptExpr->getType()->getCanonicalTypeUnqualified() == + Context.BoolTy) && + "Parser should have made sure that the expression is boolean"); + if (NoexceptExpr && DiagnoseUnexpandedParameterPack(NoexceptExpr)) { + EPI.ExceptionSpecType = EST_BasicNoexcept; + return; + } + + if (!NoexceptExpr->isValueDependent()) + NoexceptExpr = VerifyIntegerConstantExpression(NoexceptExpr, 0, + PDiag(diag::err_noexcept_needs_constant_expression), + /*AllowFold*/ false).take(); + EPI.NoexceptExpr = NoexceptExpr; + } + return; + } +} + /// IdentifyCUDATarget - Determine the CUDA compilation target for this function Sema::CUDAFunctionTarget Sema::IdentifyCUDATarget(const FunctionDecl *D) { // Implicitly declared functions (e.g. copy constructors) are diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaExceptionSpec.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaExceptionSpec.cpp index 42221f8df48..14b24341d09 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaExceptionSpec.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaExceptionSpec.cpp @@ -96,6 +96,26 @@ bool Sema::CheckDistantExceptionSpec(QualType T) { return FnT->hasExceptionSpec(); } +const FunctionProtoType * +Sema::ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT) { + // FIXME: If FD is a special member, we should delay computing its exception + // specification until this point. + if (FPT->getExceptionSpecType() != EST_Uninstantiated) + return FPT; + + FunctionDecl *SourceDecl = FPT->getExceptionSpecDecl(); + const FunctionProtoType *SourceFPT = + SourceDecl->getType()->castAs(); + + if (SourceFPT->getExceptionSpecType() != EST_Uninstantiated) + return SourceFPT; + + // Instantiate the exception specification now. + InstantiateExceptionSpec(Loc, SourceDecl); + + return SourceDecl->getType()->castAs(); +} + bool Sema::CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New) { OverloadedOperatorKind OO = New->getDeclName().getCXXOverloadedOperator(); bool IsOperatorNew = OO == OO_New || OO == OO_Array_New; @@ -104,7 +124,7 @@ bool Sema::CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New) { unsigned DiagID = diag::err_mismatched_exception_spec; if (getLangOpts().MicrosoftExt) DiagID = diag::warn_mismatched_exception_spec; - + if (!CheckEquivalentExceptionSpec(PDiag(DiagID), PDiag(diag::note_previous_declaration), Old->getType()->getAs(), @@ -295,6 +315,13 @@ bool Sema::CheckEquivalentExceptionSpec(const PartialDiagnostic &DiagID, if (MissingEmptyExceptionSpecification) *MissingEmptyExceptionSpecification = false; + Old = ResolveExceptionSpec(NewLoc, Old); + if (!Old) + return false; + New = ResolveExceptionSpec(NewLoc, New); + if (!New) + return false; + // C++0x [except.spec]p3: Two exception-specifications are compatible if: // - both are non-throwing, regardless of their form, // - both have the form noexcept(constant-expression) and the constant- @@ -318,6 +345,7 @@ bool Sema::CheckEquivalentExceptionSpec(const PartialDiagnostic &DiagID, ExceptionSpecificationType NewEST = New->getExceptionSpecType(); assert(OldEST != EST_Delayed && NewEST != EST_Delayed && + OldEST != EST_Uninstantiated && NewEST != EST_Uninstantiated && "Shouldn't see unknown exception specifications here"); // Shortcut the case where both have no spec. @@ -483,6 +511,14 @@ bool Sema::CheckExceptionSpecSubset( if (!SubLoc.isValid()) SubLoc = SuperLoc; + // Resolve the exception specifications, if needed. + Superset = ResolveExceptionSpec(SuperLoc, Superset); + if (!Superset) + return false; + Subset = ResolveExceptionSpec(SubLoc, Subset); + if (!Subset) + return false; + ExceptionSpecificationType SuperEST = Superset->getExceptionSpecType(); // If superset contains everything, we're done. @@ -507,6 +543,7 @@ bool Sema::CheckExceptionSpecSubset( ExceptionSpecificationType SubEST = Subset->getExceptionSpecType(); assert(SuperEST != EST_Delayed && SubEST != EST_Delayed && + SuperEST != EST_Uninstantiated && SubEST != EST_Uninstantiated && "Shouldn't see unknown exception specifications here"); // It does not. If the subset contains everything, we've failed. @@ -726,4 +763,324 @@ bool Sema::CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New, New->getLocation()); } +static CanThrowResult canSubExprsThrow(Sema &S, const Expr *CE) { + Expr *E = const_cast(CE); + CanThrowResult R = CT_Cannot; + for (Expr::child_range I = E->children(); I && R != CT_Can; ++I) + R = mergeCanThrow(R, S.canThrow(cast(*I))); + return R; +} + +static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, + const Decl *D, + bool NullThrows = true) { + if (!D) + return NullThrows ? CT_Can : CT_Cannot; + + // See if we can get a function type from the decl somehow. + const ValueDecl *VD = dyn_cast(D); + if (!VD) // If we have no clue what we're calling, assume the worst. + return CT_Can; + + // As an extension, we assume that __attribute__((nothrow)) functions don't + // throw. + if (isa(D) && D->hasAttr()) + return CT_Cannot; + + QualType T = VD->getType(); + const FunctionProtoType *FT; + if ((FT = T->getAs())) { + } else if (const PointerType *PT = T->getAs()) + FT = PT->getPointeeType()->getAs(); + else if (const ReferenceType *RT = T->getAs()) + FT = RT->getPointeeType()->getAs(); + else if (const MemberPointerType *MT = T->getAs()) + FT = MT->getPointeeType()->getAs(); + else if (const BlockPointerType *BT = T->getAs()) + FT = BT->getPointeeType()->getAs(); + + if (!FT) + return CT_Can; + + FT = S.ResolveExceptionSpec(E->getLocStart(), FT); + if (!FT) + return CT_Can; + + if (FT->getExceptionSpecType() == EST_Delayed) { + // FIXME: Try to resolve a delayed exception spec in ResolveExceptionSpec. + assert(isa(D) && + "only constructor exception specs can be unknown"); + S.Diag(E->getLocStart(), diag::err_exception_spec_unknown) + << E->getSourceRange(); + return CT_Can; + } + + return FT->isNothrow(S.Context) ? CT_Cannot : CT_Can; +} + +static CanThrowResult canDynamicCastThrow(const CXXDynamicCastExpr *DC) { + if (DC->isTypeDependent()) + return CT_Dependent; + + if (!DC->getTypeAsWritten()->isReferenceType()) + return CT_Cannot; + + if (DC->getSubExpr()->isTypeDependent()) + return CT_Dependent; + + return DC->getCastKind() == clang::CK_Dynamic? CT_Can : CT_Cannot; +} + +static CanThrowResult canTypeidThrow(Sema &S, const CXXTypeidExpr *DC) { + if (DC->isTypeOperand()) + return CT_Cannot; + + Expr *Op = DC->getExprOperand(); + if (Op->isTypeDependent()) + return CT_Dependent; + + const RecordType *RT = Op->getType()->getAs(); + if (!RT) + return CT_Cannot; + + if (!cast(RT->getDecl())->isPolymorphic()) + return CT_Cannot; + + if (Op->Classify(S.Context).isPRValue()) + return CT_Cannot; + + return CT_Can; +} + +CanThrowResult Sema::canThrow(const Expr *E) { + // C++ [expr.unary.noexcept]p3: + // [Can throw] if in a potentially-evaluated context the expression would + // contain: + switch (E->getStmtClass()) { + case Expr::CXXThrowExprClass: + // - a potentially evaluated throw-expression + return CT_Can; + + case Expr::CXXDynamicCastExprClass: { + // - a potentially evaluated dynamic_cast expression dynamic_cast(v), + // where T is a reference type, that requires a run-time check + CanThrowResult CT = canDynamicCastThrow(cast(E)); + if (CT == CT_Can) + return CT; + return mergeCanThrow(CT, canSubExprsThrow(*this, E)); + } + + case Expr::CXXTypeidExprClass: + // - a potentially evaluated typeid expression applied to a glvalue + // expression whose type is a polymorphic class type + return canTypeidThrow(*this, cast(E)); + + // - a potentially evaluated call to a function, member function, function + // pointer, or member function pointer that does not have a non-throwing + // exception-specification + case Expr::CallExprClass: + case Expr::CXXMemberCallExprClass: + case Expr::CXXOperatorCallExprClass: + case Expr::UserDefinedLiteralClass: { + const CallExpr *CE = cast(E); + CanThrowResult CT; + if (E->isTypeDependent()) + CT = CT_Dependent; + else if (isa(CE->getCallee()->IgnoreParens())) + CT = CT_Cannot; + else + CT = canCalleeThrow(*this, E, CE->getCalleeDecl()); + if (CT == CT_Can) + return CT; + return mergeCanThrow(CT, canSubExprsThrow(*this, E)); + } + + case Expr::CXXConstructExprClass: + case Expr::CXXTemporaryObjectExprClass: { + CanThrowResult CT = canCalleeThrow(*this, E, + cast(E)->getConstructor()); + if (CT == CT_Can) + return CT; + return mergeCanThrow(CT, canSubExprsThrow(*this, E)); + } + + case Expr::LambdaExprClass: { + const LambdaExpr *Lambda = cast(E); + CanThrowResult CT = CT_Cannot; + for (LambdaExpr::capture_init_iterator Cap = Lambda->capture_init_begin(), + CapEnd = Lambda->capture_init_end(); + Cap != CapEnd; ++Cap) + CT = mergeCanThrow(CT, canThrow(*Cap)); + return CT; + } + + case Expr::CXXNewExprClass: { + CanThrowResult CT; + if (E->isTypeDependent()) + CT = CT_Dependent; + else + CT = canCalleeThrow(*this, E, cast(E)->getOperatorNew()); + if (CT == CT_Can) + return CT; + return mergeCanThrow(CT, canSubExprsThrow(*this, E)); + } + + case Expr::CXXDeleteExprClass: { + CanThrowResult CT; + QualType DTy = cast(E)->getDestroyedType(); + if (DTy.isNull() || DTy->isDependentType()) { + CT = CT_Dependent; + } else { + CT = canCalleeThrow(*this, E, + cast(E)->getOperatorDelete()); + if (const RecordType *RT = DTy->getAs()) { + const CXXRecordDecl *RD = cast(RT->getDecl()); + CT = mergeCanThrow(CT, canCalleeThrow(*this, E, RD->getDestructor())); + } + if (CT == CT_Can) + return CT; + } + return mergeCanThrow(CT, canSubExprsThrow(*this, E)); + } + + case Expr::CXXBindTemporaryExprClass: { + // The bound temporary has to be destroyed again, which might throw. + CanThrowResult CT = canCalleeThrow(*this, E, + cast(E)->getTemporary()->getDestructor()); + if (CT == CT_Can) + return CT; + return mergeCanThrow(CT, canSubExprsThrow(*this, E)); + } + + // ObjC message sends are like function calls, but never have exception + // specs. + case Expr::ObjCMessageExprClass: + case Expr::ObjCPropertyRefExprClass: + case Expr::ObjCSubscriptRefExprClass: + return CT_Can; + + // All the ObjC literals that are implemented as calls are + // potentially throwing unless we decide to close off that + // possibility. + case Expr::ObjCArrayLiteralClass: + case Expr::ObjCDictionaryLiteralClass: + case Expr::ObjCNumericLiteralClass: + return CT_Can; + + // Many other things have subexpressions, so we have to test those. + // Some are simple: + case Expr::ConditionalOperatorClass: + case Expr::CompoundLiteralExprClass: + case Expr::CXXConstCastExprClass: + case Expr::CXXDefaultArgExprClass: + case Expr::CXXReinterpretCastExprClass: + case Expr::DesignatedInitExprClass: + case Expr::ExprWithCleanupsClass: + case Expr::ExtVectorElementExprClass: + case Expr::InitListExprClass: + case Expr::MemberExprClass: + case Expr::ObjCIsaExprClass: + case Expr::ObjCIvarRefExprClass: + case Expr::ParenExprClass: + case Expr::ParenListExprClass: + case Expr::ShuffleVectorExprClass: + case Expr::VAArgExprClass: + return canSubExprsThrow(*this, E); + + // Some might be dependent for other reasons. + case Expr::ArraySubscriptExprClass: + case Expr::BinaryOperatorClass: + case Expr::CompoundAssignOperatorClass: + case Expr::CStyleCastExprClass: + case Expr::CXXStaticCastExprClass: + case Expr::CXXFunctionalCastExprClass: + case Expr::ImplicitCastExprClass: + case Expr::MaterializeTemporaryExprClass: + case Expr::UnaryOperatorClass: { + CanThrowResult CT = E->isTypeDependent() ? CT_Dependent : CT_Cannot; + return mergeCanThrow(CT, canSubExprsThrow(*this, E)); + } + + // FIXME: We should handle StmtExpr, but that opens a MASSIVE can of worms. + case Expr::StmtExprClass: + return CT_Can; + + case Expr::ChooseExprClass: + if (E->isTypeDependent() || E->isValueDependent()) + return CT_Dependent; + return canThrow(cast(E)->getChosenSubExpr(Context)); + + case Expr::GenericSelectionExprClass: + if (cast(E)->isResultDependent()) + return CT_Dependent; + return canThrow(cast(E)->getResultExpr()); + + // Some expressions are always dependent. + case Expr::CXXDependentScopeMemberExprClass: + case Expr::CXXUnresolvedConstructExprClass: + case Expr::DependentScopeDeclRefExprClass: + return CT_Dependent; + + case Expr::AsTypeExprClass: + case Expr::BinaryConditionalOperatorClass: + case Expr::BlockExprClass: + case Expr::CUDAKernelCallExprClass: + case Expr::DeclRefExprClass: + case Expr::ObjCBridgedCastExprClass: + case Expr::ObjCIndirectCopyRestoreExprClass: + case Expr::ObjCProtocolExprClass: + case Expr::ObjCSelectorExprClass: + case Expr::OffsetOfExprClass: + case Expr::PackExpansionExprClass: + case Expr::PseudoObjectExprClass: + case Expr::SubstNonTypeTemplateParmExprClass: + case Expr::SubstNonTypeTemplateParmPackExprClass: + case Expr::UnaryExprOrTypeTraitExprClass: + case Expr::UnresolvedLookupExprClass: + case Expr::UnresolvedMemberExprClass: + // FIXME: Can any of the above throw? If so, when? + return CT_Cannot; + + case Expr::AddrLabelExprClass: + case Expr::ArrayTypeTraitExprClass: + case Expr::AtomicExprClass: + case Expr::BinaryTypeTraitExprClass: + case Expr::TypeTraitExprClass: + case Expr::CXXBoolLiteralExprClass: + case Expr::CXXNoexceptExprClass: + case Expr::CXXNullPtrLiteralExprClass: + case Expr::CXXPseudoDestructorExprClass: + case Expr::CXXScalarValueInitExprClass: + case Expr::CXXThisExprClass: + case Expr::CXXUuidofExprClass: + case Expr::CharacterLiteralClass: + case Expr::ExpressionTraitExprClass: + case Expr::FloatingLiteralClass: + case Expr::GNUNullExprClass: + case Expr::ImaginaryLiteralClass: + case Expr::ImplicitValueInitExprClass: + case Expr::IntegerLiteralClass: + case Expr::ObjCEncodeExprClass: + case Expr::ObjCStringLiteralClass: + case Expr::ObjCBoolLiteralExprClass: + case Expr::OpaqueValueExprClass: + case Expr::PredefinedExprClass: + case Expr::SizeOfPackExprClass: + case Expr::StringLiteralClass: + case Expr::UnaryTypeTraitExprClass: + // These expressions can never throw. + return CT_Cannot; + +#define STMT(CLASS, PARENT) case Expr::CLASS##Class: +#define STMT_RANGE(Base, First, Last) +#define LAST_STMT_RANGE(BASE, FIRST, LAST) +#define EXPR(CLASS, PARENT) +#define ABSTRACT_STMT(STMT) +#include "clang/AST/StmtNodes.inc" + case Expr::NoStmtClass: + llvm_unreachable("Invalid class for expression"); + } + llvm_unreachable("Bogus StmtClass"); +} + } // end namespace clang diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaExpr.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaExpr.cpp index 0d0f2f5b99a..d2e0e6b63b4 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaExpr.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaExpr.cpp @@ -9438,10 +9438,11 @@ ExprResult Sema::VerifyIntegerConstantExpression(Expr *E, PDiag(diag::err_expr_not_ice) << LangOpts.CPlusPlus); } -ExprResult Sema::VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, - PartialDiagnostic NotIceDiag, - bool AllowFold, - PartialDiagnostic FoldDiag) { +ExprResult +Sema::VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, + const PartialDiagnostic &NotIceDiag, + bool AllowFold, + const PartialDiagnostic &FoldDiag) { SourceLocation DiagLoc = E->getLocStart(); if (getLangOpts().CPlusPlus0x) { @@ -9773,6 +9774,12 @@ void Sema::MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func) { // FIXME: Is this really right? if (CurContext == Func) return; + // Instantiate the exception specification for any function which is + // used: CodeGen will need it. + const FunctionProtoType *FPT = Func->getType()->getAs(); + if (FPT && FPT->getExceptionSpecType() == EST_Uninstantiated) + InstantiateExceptionSpec(Loc, Func); + // Implicit instantiation of function templates and member functions of // class templates. if (Func->isImplicitlyInstantiable()) { @@ -11268,22 +11275,6 @@ ExprResult Sema::ActOnObjCBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind) { assert((Kind == tok::kw___objc_yes || Kind == tok::kw___objc_no) && "Unknown Objective-C Boolean value!"); - QualType ObjCBoolLiteralQT = Context.ObjCBuiltinBoolTy; - // signed char is the default type for boolean literals. Use 'BOOL' - // instead, if BOOL typedef is visible in its scope instead. - Decl *TD = - LookupSingleName(TUScope, &Context.Idents.get("BOOL"), - SourceLocation(), LookupOrdinaryName); - if (TypedefDecl *BoolTD = dyn_cast_or_null(TD)) { - QualType QT = BoolTD->getUnderlyingType(); - if (!QT->isIntegralOrUnscopedEnumerationType()) { - Diag(OpLoc, diag::warn_bool_for_boolean_literal) << QT; - Diag(BoolTD->getLocation(), diag::note_previous_declaration); - } - else - ObjCBoolLiteralQT = QT; - } - return Owned(new (Context) ObjCBoolLiteralExpr(Kind == tok::kw___objc_yes, - ObjCBoolLiteralQT, OpLoc)); + Context.ObjCBuiltinBoolTy, OpLoc)); } diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp index 31a8115f0b4..af86cb2c43e 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp @@ -654,23 +654,44 @@ ExprResult Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, Expr *E, QualType Sema::getCurrentThisType() { DeclContext *DC = getFunctionLevelDeclContext(); - QualType ThisTy; + QualType ThisTy = CXXThisTypeOverride; if (CXXMethodDecl *method = dyn_cast(DC)) { if (method && method->isInstance()) ThisTy = method->getThisType(Context); - } else if (CXXRecordDecl *RD = dyn_cast(DC)) { - // C++0x [expr.prim]p4: - // Otherwise, if a member-declarator declares a non-static data member - // of a class X, the expression this is a prvalue of type "pointer to X" - // within the optional brace-or-equal-initializer. - Scope *S = getScopeForContext(DC); - if (!S || S->getFlags() & Scope::ThisScope) - ThisTy = Context.getPointerType(Context.getRecordType(RD)); } - + return ThisTy; } +Sema::CXXThisScopeRAII::CXXThisScopeRAII(Sema &S, + Decl *ContextDecl, + unsigned CXXThisTypeQuals, + bool Enabled) + : S(S), OldCXXThisTypeOverride(S.CXXThisTypeOverride), Enabled(false) +{ + if (!Enabled || !ContextDecl) + return; + + CXXRecordDecl *Record = 0; + if (ClassTemplateDecl *Template = dyn_cast(ContextDecl)) + Record = Template->getTemplatedDecl(); + else + Record = cast(ContextDecl); + + S.CXXThisTypeOverride + = S.Context.getPointerType( + S.Context.getRecordType(Record).withCVRQualifiers(CXXThisTypeQuals)); + + this->Enabled = true; +} + + +Sema::CXXThisScopeRAII::~CXXThisScopeRAII() { + if (Enabled) { + S.CXXThisTypeOverride = OldCXXThisTypeOverride; + } +} + void Sema::CheckCXXThisCapture(SourceLocation Loc, bool Explicit) { // We don't need to capture this in an unevaluated context. if (ExprEvalContexts.back().Context == Unevaluated && !Explicit) @@ -739,6 +760,18 @@ ExprResult Sema::ActOnCXXThis(SourceLocation Loc) { return Owned(new (Context) CXXThisExpr(Loc, ThisTy, /*isImplicit=*/false)); } +bool Sema::isThisOutsideMemberFunctionBody(QualType BaseType) { + // If we're outside the body of a member function, then we'll have a specified + // type for 'this'. + if (CXXThisTypeOverride.isNull()) + return false; + + // Determine whether we're looking into a class that's currently being + // defined. + CXXRecordDecl *Class = BaseType->getAsCXXRecordDecl(); + return Class && Class->isBeingDefined(); +} + ExprResult Sema::ActOnCXXTypeConstructExpr(ParsedType TypeRep, SourceLocation LParenLoc, @@ -3102,6 +3135,9 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT, FoundAssign = true; const FunctionProtoType *CPT = Operator->getType()->getAs(); + CPT = Self.ResolveExceptionSpec(KeyLoc, CPT); + if (!CPT) + return false; if (CPT->getExceptionSpecType() == EST_Delayed) return false; if (!CPT->isNothrow(Self.Context)) @@ -3141,6 +3177,9 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT, FoundConstructor = true; const FunctionProtoType *CPT = Constructor->getType()->getAs(); + CPT = Self.ResolveExceptionSpec(KeyLoc, CPT); + if (!CPT) + return false; if (CPT->getExceptionSpecType() == EST_Delayed) return false; // FIXME: check whether evaluating default arguments can throw. @@ -3176,6 +3215,9 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT, if (Constructor->isDefaultConstructor()) { const FunctionProtoType *CPT = Constructor->getType()->getAs(); + CPT = Self.ResolveExceptionSpec(KeyLoc, CPT); + if (!CPT) + return false; if (CPT->getExceptionSpecType() == EST_Delayed) return false; // TODO: check whether evaluating default arguments can throw. @@ -4784,8 +4826,13 @@ Sema::ActOnStartCXXMemberReference(Scope *S, Expr *Base, SourceLocation OpLoc, return Owned(Base); } - // The object type must be complete (or dependent). + // The object type must be complete (or dependent), or + // C++11 [expr.prim.general]p3: + // Unlike the object expression in other contexts, *this is not required to + // be of complete type for purposes of class member access (5.2.5) outside + // the member function body. if (!BaseType->isDependentType() && + !isThisOutsideMemberFunctionBody(BaseType) && RequireCompleteType(OpLoc, BaseType, PDiag(diag::err_incomplete_member_access))) return ExprError(); @@ -5165,9 +5212,9 @@ ExprResult Sema::BuildCXXMemberCallExpr(Expr *E, NamedDecl *FoundDecl, ExprResult Sema::BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand, SourceLocation RParen) { + CanThrowResult CanThrow = canThrow(Operand); return Owned(new (Context) CXXNoexceptExpr(Context.BoolTy, Operand, - Operand->CanThrow(Context), - KeyLoc, RParen)); + CanThrow, KeyLoc, RParen)); } ExprResult Sema::ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation, diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaExprMember.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaExprMember.cpp index 26b88a2a7ee..6c84caa3f37 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaExprMember.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaExprMember.cpp @@ -101,16 +101,8 @@ static IMAKind ClassifyImplicitMemberAccess(Sema &SemaRef, DeclContext *DC = SemaRef.getFunctionLevelDeclContext(); - bool isStaticContext = - (!isa(DC) || - cast(DC)->isStatic()); - - // C++0x [expr.prim]p4: - // Otherwise, if a member-declarator declares a non-static data member - // of a class X, the expression this is a prvalue of type "pointer to X" - // within the optional brace-or-equal-initializer. - if (CurScope->getFlags() & Scope::ThisScope) - isStaticContext = false; + bool isStaticContext = SemaRef.CXXThisTypeOverride.isNull() && + (!isa(DC) || cast(DC)->isStatic()); if (R.isUnresolvableResult()) return isStaticContext ? IMA_Unresolved_StaticContext : IMA_Unresolved; @@ -549,12 +541,13 @@ class RecordMemberExprValidatorCCC : public CorrectionCandidateCallback { } static bool -LookupMemberExprInRecord(Sema &SemaRef, LookupResult &R, +LookupMemberExprInRecord(Sema &SemaRef, LookupResult &R, SourceRange BaseRange, const RecordType *RTy, SourceLocation OpLoc, CXXScopeSpec &SS, bool HasTemplateArgs) { RecordDecl *RDecl = RTy->getDecl(); - if (SemaRef.RequireCompleteType(OpLoc, QualType(RTy, 0), + if (!SemaRef.isThisOutsideMemberFunctionBody(QualType(RTy, 0)) && + SemaRef.RequireCompleteType(OpLoc, QualType(RTy, 0), SemaRef.PDiag(diag::err_typecheck_incomplete_tag) << BaseRange)) return true; diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaLookup.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaLookup.cpp index 966eb90306a..9f5138ba4a4 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaLookup.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaLookup.cpp @@ -2277,7 +2277,7 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD, Result->setMethod(DD); Result->setKind(DD->isDeleted() ? SpecialMemberOverloadResult::NoMemberOrDeleted : - SpecialMemberOverloadResult::SuccessNonConst); + SpecialMemberOverloadResult::Success); return Result; } @@ -2288,6 +2288,9 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD, Expr *Arg = 0; unsigned NumArgs; + QualType ArgType = CanTy; + ExprValueKind VK = VK_LValue; + if (SM == CXXDefaultConstructor) { Name = Context.DeclarationNames.getCXXConstructorName(CanTy); NumArgs = 0; @@ -2308,7 +2311,6 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD, DeclareImplicitMoveAssignment(RD); } - QualType ArgType = CanTy; if (ConstArg) ArgType.addConst(); if (VolatileArg) @@ -2321,14 +2323,17 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD, // Possibly an XValue is actually correct in the case of move, but // there is no semantic difference for class types in this restricted // case. - ExprValueKind VK; if (SM == CXXCopyConstructor || SM == CXXCopyAssignment) VK = VK_LValue; else VK = VK_RValue; + } + OpaqueValueExpr FakeArg(SourceLocation(), ArgType, VK); + + if (SM != CXXDefaultConstructor) { NumArgs = 1; - Arg = new (Context) OpaqueValueExpr(SourceLocation(), ArgType, VK); + Arg = &FakeArg; } // Create the object argument @@ -2338,17 +2343,14 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD, if (VolatileThis) ThisTy.addVolatile(); Expr::Classification Classification = - (new (Context) OpaqueValueExpr(SourceLocation(), ThisTy, - RValueThis ? VK_RValue : VK_LValue))-> - Classify(Context); + OpaqueValueExpr(SourceLocation(), ThisTy, + RValueThis ? VK_RValue : VK_LValue).Classify(Context); // Now we perform lookup on the name we computed earlier and do overload // resolution. Lookup is only performed directly into the class since there // will always be a (possibly implicit) declaration to shadow any others. OverloadCandidateSet OCS((SourceLocation())); DeclContext::lookup_iterator I, E; - SpecialMemberOverloadResult::Kind SuccessKind = - SpecialMemberOverloadResult::SuccessNonConst; llvm::tie(I, E) = RD->lookup(Name); assert((I != E) && @@ -2378,17 +2380,6 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD, else AddOverloadCandidate(M, DeclAccessPair::make(M, AS_public), llvm::makeArrayRef(&Arg, NumArgs), OCS, true); - - // Here we're looking for a const parameter to speed up creation of - // implicit copy methods. - if ((SM == CXXCopyAssignment && M->isCopyAssignmentOperator()) || - (SM == CXXCopyConstructor && - cast(M)->isCopyConstructor())) { - QualType ArgType = M->getType()->getAs()->getArgType(0); - if (!ArgType->isReferenceType() || - ArgType->getPointeeType().isConstQualified()) - SuccessKind = SpecialMemberOverloadResult::SuccessConst; - } } else if (FunctionTemplateDecl *Tmpl = dyn_cast(Cand)) { if (SM == CXXCopyAssignment || SM == CXXMoveAssignment) @@ -2409,7 +2400,7 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD, switch (OCS.BestViableFunction(*this, SourceLocation(), Best)) { case OR_Success: Result->setMethod(cast(Best->Function)); - Result->setKind(SuccessKind); + Result->setKind(SpecialMemberOverloadResult::Success); break; case OR_Deleted: @@ -2442,17 +2433,13 @@ CXXConstructorDecl *Sema::LookupDefaultConstructor(CXXRecordDecl *Class) { /// \brief Look up the copying constructor for the given class. CXXConstructorDecl *Sema::LookupCopyingConstructor(CXXRecordDecl *Class, - unsigned Quals, - bool *ConstParamMatch) { + unsigned Quals) { assert(!(Quals & ~(Qualifiers::Const | Qualifiers::Volatile)) && "non-const, non-volatile qualifiers for copy ctor arg"); SpecialMemberOverloadResult *Result = LookupSpecialMember(Class, CXXCopyConstructor, Quals & Qualifiers::Const, Quals & Qualifiers::Volatile, false, false, false); - if (ConstParamMatch) - *ConstParamMatch = Result->hasConstParamMatch(); - return cast_or_null(Result->getMethod()); } @@ -2485,8 +2472,7 @@ DeclContext::lookup_result Sema::LookupConstructors(CXXRecordDecl *Class) { /// \brief Look up the copying assignment operator for the given class. CXXMethodDecl *Sema::LookupCopyingAssignment(CXXRecordDecl *Class, unsigned Quals, bool RValueThis, - unsigned ThisQuals, - bool *ConstParamMatch) { + unsigned ThisQuals) { assert(!(Quals & ~(Qualifiers::Const | Qualifiers::Volatile)) && "non-const, non-volatile qualifiers for copy assignment arg"); assert(!(ThisQuals & ~(Qualifiers::Const | Qualifiers::Volatile)) && @@ -2497,9 +2483,6 @@ CXXMethodDecl *Sema::LookupCopyingAssignment(CXXRecordDecl *Class, ThisQuals & Qualifiers::Const, ThisQuals & Qualifiers::Volatile); - if (ConstParamMatch) - *ConstParamMatch = Result->hasConstParamMatch(); - return Result->getMethod(); } @@ -3165,7 +3148,7 @@ LabelDecl *Sema::LookupOrCreateLabel(IdentifierInfo *II, SourceLocation Loc, namespace { typedef llvm::StringMap TypoResultsMap; -typedef std::map TypoEditDistanceMap; +typedef std::map TypoEditDistanceMap; static const unsigned MaxTypoDistanceResultSets = 5; @@ -3187,14 +3170,6 @@ public: : Typo(Typo->getName()), SemaRef(SemaRef) { } - ~TypoCorrectionConsumer() { - for (TypoEditDistanceMap::iterator I = BestResults.begin(), - IEnd = BestResults.end(); - I != IEnd; - ++I) - delete I->second; - } - virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, bool InBaseClass); void FoundName(StringRef Name); @@ -3212,7 +3187,7 @@ public: bool empty() const { return BestResults.empty(); } TypoCorrection &operator[](StringRef Name) { - return (*BestResults.begin()->second)[Name]; + return BestResults.begin()->second[Name]; } unsigned getBestEditDistance(bool Normalized) { @@ -3276,11 +3251,9 @@ void TypoCorrectionConsumer::addName(StringRef Name, void TypoCorrectionConsumer::addCorrection(TypoCorrection Correction) { StringRef Name = Correction.getCorrectionAsIdentifierInfo()->getName(); - TypoResultsMap *& Map = BestResults[Correction.getEditDistance(false)]; - if (!Map) - Map = new TypoResultsMap; + TypoResultsMap &Map = BestResults[Correction.getEditDistance(false)]; - TypoCorrection &CurrentCorrection = (*Map)[Name]; + TypoCorrection &CurrentCorrection = Map[Name]; if (!CurrentCorrection || // FIXME: The following should be rolled up into an operator< on // TypoCorrection with a more principled definition. @@ -3289,12 +3262,8 @@ void TypoCorrectionConsumer::addCorrection(TypoCorrection Correction) { CurrentCorrection.getAsString(SemaRef.getLangOpts())) CurrentCorrection = Correction; - while (BestResults.size() > MaxTypoDistanceResultSets) { - TypoEditDistanceMap::iterator Last = BestResults.end(); - --Last; - delete Last->second; - BestResults.erase(Last); - } + while (BestResults.size() > MaxTypoDistanceResultSets) + erase(llvm::prior(BestResults.end())); } // Fill the supplied vector with the IdentifierInfo pointers for each piece of @@ -3882,8 +3851,8 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName, while (!Consumer.empty()) { TypoCorrectionConsumer::distance_iterator DI = Consumer.begin(); unsigned ED = DI->first; - for (TypoCorrectionConsumer::result_iterator I = DI->second->begin(), - IEnd = DI->second->end(); + for (TypoCorrectionConsumer::result_iterator I = DI->second.begin(), + IEnd = DI->second.end(); I != IEnd; /* Increment in loop. */) { // If the item already has been looked up or is a keyword, keep it. // If a validator callback object was given, drop the correction @@ -3892,7 +3861,7 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName, TypoCorrectionConsumer::result_iterator Prev = I; ++I; if (!isCandidateViable(CCC, Prev->second)) - DI->second->erase(Prev); + DI->second.erase(Prev); continue; } @@ -3911,7 +3880,7 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName, { TypoCorrectionConsumer::result_iterator Next = I; ++Next; - DI->second->erase(I); + DI->second.erase(I); I = Next; } break; @@ -3929,7 +3898,7 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName, I->second.addCorrectionDecl(*TRD); ++I; if (!isCandidateViable(CCC, Prev->second)) - DI->second->erase(Prev); + DI->second.erase(Prev); break; } @@ -3938,14 +3907,14 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName, I->second.setCorrectionDecl(TmpRes.getAsSingle()); ++I; if (!isCandidateViable(CCC, Prev->second)) - DI->second->erase(Prev); + DI->second.erase(Prev); break; } } } - if (DI->second->empty()) + if (DI->second.empty()) Consumer.erase(DI); else if (!getLangOpts().CPlusPlus || QualifiedResults.empty() || !ED) // If there are results in the closest possible bucket, stop @@ -4009,7 +3978,7 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName, // No corrections remain... if (Consumer.empty()) return TypoCorrection(); - TypoResultsMap &BestResults = *Consumer.begin()->second; + TypoResultsMap &BestResults = Consumer.begin()->second; ED = TypoCorrection::NormalizeEditDistance(Consumer.begin()->first); if (ED > 0 && Typo->getName().size() / ED < 3) { @@ -4083,7 +4052,8 @@ std::string TypoCorrection::getAsString(const LangOptions &LO) const { std::string tmpBuffer; llvm::raw_string_ostream PrefixOStream(tmpBuffer); CorrectionNameSpec->print(PrefixOStream, PrintingPolicy(LO)); - return PrefixOStream.str() + CorrectionName.getAsString(); + CorrectionName.printName(PrefixOStream); + return PrefixOStream.str(); } return CorrectionName.getAsString(); diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp index 284c8dec1c6..50230f068dd 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp @@ -11150,6 +11150,7 @@ Expr *Sema::FixOverloadedFunctionReference(Expr *E, DeclAccessPair Found, VK_LValue, Found.getDecl(), TemplateArgs); + MarkDeclRefReferenced(DRE); DRE->setHadMultipleCandidates(ULE->getNumDecls() > 1); return DRE; } @@ -11178,6 +11179,7 @@ Expr *Sema::FixOverloadedFunctionReference(Expr *E, DeclAccessPair Found, VK_LValue, Found.getDecl(), TemplateArgs); + MarkDeclRefReferenced(DRE); DRE->setHadMultipleCandidates(MemExpr->getNumDecls() > 1); return DRE; } else { diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaPseudoObject.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaPseudoObject.cpp index d52c912457a..0e6632964a9 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaPseudoObject.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaPseudoObject.cpp @@ -214,6 +214,7 @@ namespace { ObjCMethodDecl *Setter; Selector SetterSelector; + Selector GetterSelector; public: ObjCPropertyOpBuilder(Sema &S, ObjCPropertyRefExpr *refExpr) : @@ -475,8 +476,24 @@ bool ObjCPropertyOpBuilder::findGetter() { // For implicit properties, just trust the lookup we already did. if (RefExpr->isImplicitProperty()) { - Getter = RefExpr->getImplicitPropertyGetter(); - return (Getter != 0); + if ((Getter = RefExpr->getImplicitPropertyGetter())) { + GetterSelector = Getter->getSelector(); + return true; + } + else { + // Must build the getter selector the hard way. + ObjCMethodDecl *setter = RefExpr->getImplicitPropertySetter(); + assert(setter && "both setter and getter are null - cannot happen"); + IdentifierInfo *setterName = + setter->getSelector().getIdentifierInfoForSlot(0); + const char *compStr = setterName->getNameStart(); + compStr += 3; + IdentifierInfo *getterName = &S.Context.Idents.get(compStr); + GetterSelector = + S.PP.getSelectorTable().getNullarySelector(getterName); + return false; + + } } ObjCPropertyDecl *prop = RefExpr->getExplicitProperty(); @@ -776,7 +793,7 @@ ObjCPropertyOpBuilder::buildIncDecOperation(Scope *Sc, SourceLocation opcLoc, assert(RefExpr->isImplicitProperty()); S.Diag(opcLoc, diag::err_nogetter_property_incdec) << unsigned(UnaryOperator::isDecrementOp(opcode)) - << RefExpr->getImplicitPropertyGetter()->getSelector() // FIXME! + << GetterSelector << op->getSourceRange(); return ExprError(); } @@ -1300,6 +1317,11 @@ static Expr *stripOpaqueValuesFromPseudoObjectRef(Sema &S, Expr *E) { Expr *opaqueRef = E->IgnoreParens(); if (ObjCPropertyRefExpr *refExpr = dyn_cast(opaqueRef)) { + // Class and super property references don't have opaque values in them. + if (refExpr->isClassReceiver() || refExpr->isSuperReceiver()) + return E; + + assert(refExpr->isObjectReceiver() && "Unknown receiver kind?"); OpaqueValueExpr *baseOVE = cast(refExpr->getBase()); return ObjCPropertyRefRebuilder(S, baseOVE->getSourceExpr()).rebuild(E); } else if (ObjCSubscriptRefExpr *refExpr diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaStmt.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaStmt.cpp index 97c8eb04e9e..9052278d733 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaStmt.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaStmt.cpp @@ -345,7 +345,6 @@ Sema::ActOnDefaultStmt(SourceLocation DefaultLoc, SourceLocation ColonLoc, StmtResult Sema::ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl, SourceLocation ColonLoc, Stmt *SubStmt) { - // If the label was multiply defined, reject it now. if (TheDecl->getStmt()) { Diag(IdentLoc, diag::err_redefinition_of_label) << TheDecl->getDeclName(); @@ -361,6 +360,16 @@ Sema::ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl, return Owned(LS); } +StmtResult Sema::ActOnAttributedStmt(SourceLocation AttrLoc, + const AttrVec &Attrs, + Stmt *SubStmt) { + // Fill in the declaration and return it. Variable length will require to + // change this to AttributedStmt::Create(Context, ....); + // and probably using ArrayRef + AttributedStmt *LS = new (Context) AttributedStmt(AttrLoc, Attrs, SubStmt); + return Owned(LS); +} + StmtResult Sema::ActOnIfStmt(SourceLocation IfLoc, FullExprArg CondVal, Decl *CondVar, Stmt *thenStmt, SourceLocation ElseLoc, diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaStmtAttr.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaStmtAttr.cpp new file mode 100644 index 00000000000..21c329758eb --- /dev/null +++ b/contrib/llvm/tools/clang/lib/Sema/SemaStmtAttr.cpp @@ -0,0 +1,48 @@ +//===--- SemaStmtAttr.cpp - Statement Attribute Handling ------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements stmt-related attribute processing. +// +//===----------------------------------------------------------------------===// + +#include "clang/Sema/SemaInternal.h" +#include "TargetAttributesSema.h" +#include "clang/AST/ASTContext.h" +#include "clang/Basic/SourceManager.h" +#include "clang/Sema/DelayedDiagnostic.h" +#include "clang/Sema/Lookup.h" +#include "llvm/ADT/StringExtras.h" +using namespace clang; +using namespace sema; + + +static Attr *ProcessStmtAttribute(Sema &S, Stmt *St, const AttributeList &A) { + switch (A.getKind()) { + default: + // if we're here, then we parsed an attribute, but didn't recognize it as a + // statement attribute => it is declaration attribute + S.Diag(A.getRange().getBegin(), diag::warn_attribute_invalid_on_stmt) << + A.getName()->getName(); + return 0; + } +} + +StmtResult Sema::ProcessStmtAttributes(Stmt *S, AttributeList *AttrList, + SourceRange Range) { + AttrVec Attrs; + for (const AttributeList* l = AttrList; l; l = l->getNext()) { + if (Attr *a = ProcessStmtAttribute(*this, S, *l)) + Attrs.push_back(a); + } + + if (Attrs.empty()) + return S; + + return ActOnAttributedStmt(Range.getBegin(), Attrs, S); +} diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp index ff8c4dacc24..51ce2a1345a 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp @@ -2496,6 +2496,7 @@ SubstDefaultTemplateArgument(Sema &SemaRef, Converted.size(), SourceRange(TemplateLoc, RAngleLoc)); + Sema::ContextRAII SavedContext(SemaRef, Template->getDeclContext()); ArgType = SemaRef.SubstType(ArgType, AllTemplateArgs, Param->getDefaultArgumentLoc(), Param->getDeclName()); @@ -2544,6 +2545,8 @@ SubstDefaultTemplateArgument(Sema &SemaRef, Converted.size(), SourceRange(TemplateLoc, RAngleLoc)); + Sema::ContextRAII SavedContext(SemaRef, Template->getDeclContext()); + EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); return SemaRef.SubstExpr(Param->getDefaultArgument(), AllTemplateArgs); } @@ -2591,6 +2594,7 @@ SubstDefaultTemplateArgument(Sema &SemaRef, Converted.size(), SourceRange(TemplateLoc, RAngleLoc)); + Sema::ContextRAII SavedContext(SemaRef, Template->getDeclContext()); // Substitute into the nested-name-specifier first, QualifierLoc = Param->getDefaultArgument().getTemplateQualifierLoc(); if (QualifierLoc) { diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateDeduction.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateDeduction.cpp index 2ea1e6ff934..d68e4642fc4 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -2310,23 +2310,42 @@ Sema::SubstituteExplicitTemplateArguments( // explicitly-specified template arguments. If the function has a trailing // return type, substitute it after the arguments to ensure we substitute // in lexical order. - if (Proto->hasTrailingReturn() && - SubstParmTypes(Function->getLocation(), - Function->param_begin(), Function->getNumParams(), - MultiLevelTemplateArgumentList(*ExplicitArgumentList), - ParamTypes)) - return TDK_SubstitutionFailure; - + if (Proto->hasTrailingReturn()) { + if (SubstParmTypes(Function->getLocation(), + Function->param_begin(), Function->getNumParams(), + MultiLevelTemplateArgumentList(*ExplicitArgumentList), + ParamTypes)) + return TDK_SubstitutionFailure; + } + // Instantiate the return type. // FIXME: exception-specifications? - QualType ResultType - = SubstType(Proto->getResultType(), - MultiLevelTemplateArgumentList(*ExplicitArgumentList), - Function->getTypeSpecStartLoc(), - Function->getDeclName()); - if (ResultType.isNull() || Trap.hasErrorOccurred()) - return TDK_SubstitutionFailure; - + QualType ResultType; + { + // C++11 [expr.prim.general]p3: + // If a declaration declares a member function or member function + // template of a class X, the expression this is a prvalue of type + // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq + // and the end of the function-definition, member-declarator, or + // declarator. + unsigned ThisTypeQuals = 0; + CXXRecordDecl *ThisContext = 0; + if (CXXMethodDecl *Method = dyn_cast(Function)) { + ThisContext = Method->getParent(); + ThisTypeQuals = Method->getTypeQualifiers(); + } + + CXXThisScopeRAII ThisScope(*this, ThisContext, ThisTypeQuals, + getLangOpts().CPlusPlus0x); + + ResultType = SubstType(Proto->getResultType(), + MultiLevelTemplateArgumentList(*ExplicitArgumentList), + Function->getTypeSpecStartLoc(), + Function->getDeclName()); + if (ResultType.isNull() || Trap.hasErrorOccurred()) + return TDK_SubstitutionFailure; + } + // Instantiate the types of each of the function parameters given the // explicitly-specified template arguments if we didn't do so earlier. if (!Proto->hasTrailingReturn() && diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiate.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiate.cpp index 4740145fd5a..128dc2f7ff4 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -153,6 +153,7 @@ Sema::getTemplateInstantiationArgs(NamedDecl *D, bool Sema::ActiveTemplateInstantiation::isInstantiationRecord() const { switch (Kind) { case TemplateInstantiation: + case ExceptionSpecInstantiation: case DefaultTemplateArgumentInstantiation: case DefaultFunctionArgumentInstantiation: return true; @@ -190,6 +191,29 @@ InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, } } +Sema::InstantiatingTemplate:: +InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, + FunctionDecl *Entity, ExceptionSpecification, + SourceRange InstantiationRange) + : SemaRef(SemaRef), + SavedInNonInstantiationSFINAEContext( + SemaRef.InNonInstantiationSFINAEContext) +{ + Invalid = CheckInstantiationDepth(PointOfInstantiation, + InstantiationRange); + if (!Invalid) { + ActiveTemplateInstantiation Inst; + Inst.Kind = ActiveTemplateInstantiation::ExceptionSpecInstantiation; + Inst.PointOfInstantiation = PointOfInstantiation; + Inst.Entity = reinterpret_cast(Entity); + Inst.TemplateArgs = 0; + Inst.NumTemplateArgs = 0; + Inst.InstantiationRange = InstantiationRange; + SemaRef.InNonInstantiationSFINAEContext = false; + SemaRef.ActiveTemplateInstantiations.push_back(Inst); + } +} + Sema::InstantiatingTemplate::InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, TemplateDecl *Template, @@ -592,6 +616,13 @@ void Sema::PrintInstantiationStack() { << Active->InstantiationRange; break; } + + case ActiveTemplateInstantiation::ExceptionSpecInstantiation: + Diags.Report(Active->PointOfInstantiation, + diag::note_template_exception_spec_instantiation_here) + << cast((Decl *)Active->Entity) + << Active->InstantiationRange; + break; } } } @@ -609,6 +640,7 @@ llvm::Optional Sema::isSFINAEContext() const { switch(Active->Kind) { case ActiveTemplateInstantiation::DefaultFunctionArgumentInstantiation: case ActiveTemplateInstantiation::TemplateInstantiation: + case ActiveTemplateInstantiation::ExceptionSpecInstantiation: // This is a template instantiation, so there is no SFINAE. return llvm::Optional(); @@ -789,6 +821,11 @@ namespace { QualType TransformFunctionProtoType(TypeLocBuilder &TLB, FunctionProtoTypeLoc TL); + QualType TransformFunctionProtoType(TypeLocBuilder &TLB, + FunctionProtoTypeLoc TL, + CXXRecordDecl *ThisContext, + unsigned ThisTypeQuals); + ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, int indexAdjustment, llvm::Optional NumExpansions, @@ -1211,6 +1248,16 @@ QualType TemplateInstantiator::TransformFunctionProtoType(TypeLocBuilder &TLB, return inherited::TransformFunctionProtoType(TLB, TL); } +QualType TemplateInstantiator::TransformFunctionProtoType(TypeLocBuilder &TLB, + FunctionProtoTypeLoc TL, + CXXRecordDecl *ThisContext, + unsigned ThisTypeQuals) { + // We need a local instantiation scope for this function prototype. + LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true); + return inherited::TransformFunctionProtoType(TLB, TL, ThisContext, + ThisTypeQuals); +} + ParmVarDecl * TemplateInstantiator::TransformFunctionTypeParam(ParmVarDecl *OldParm, int indexAdjustment, @@ -1446,7 +1493,9 @@ static bool NeedsInstantiationAsFunctionType(TypeSourceInfo *T) { TypeSourceInfo *Sema::SubstFunctionDeclType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &Args, SourceLocation Loc, - DeclarationName Entity) { + DeclarationName Entity, + CXXRecordDecl *ThisContext, + unsigned ThisTypeQuals) { assert(!ActiveTemplateInstantiations.empty() && "Cannot perform an instantiation without some context on the " "instantiation stack"); @@ -1461,7 +1510,14 @@ TypeSourceInfo *Sema::SubstFunctionDeclType(TypeSourceInfo *T, TypeLoc TL = T->getTypeLoc(); TLB.reserve(TL.getFullDataSize()); - QualType Result = Instantiator.TransformType(TLB, TL); + QualType Result; + + if (FunctionProtoTypeLoc *Proto = dyn_cast(&TL)) { + Result = Instantiator.TransformFunctionProtoType(TLB, *Proto, ThisContext, + ThisTypeQuals); + } else { + Result = Instantiator.TransformType(TLB, TL); + } if (Result.isNull()) return 0; @@ -1878,24 +1934,33 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation, CheckCompletedCXXClass(Instantiation); // Attach any in-class member initializers now the class is complete. - for (unsigned I = 0, N = FieldsWithMemberInitializers.size(); I != N; ++I) { - FieldDecl *OldField = FieldsWithMemberInitializers[I].first; - FieldDecl *NewField = FieldsWithMemberInitializers[I].second; - Expr *OldInit = OldField->getInClassInitializer(); + { + // C++11 [expr.prim.general]p4: + // Otherwise, if a member-declarator declares a non-static data member + // (9.2) of a class X, the expression this is a prvalue of type "pointer + // to X" within the optional brace-or-equal-initializer. It shall not + // appear elsewhere in the member-declarator. + CXXThisScopeRAII ThisScope(*this, Instantiation, (unsigned)0); + + for (unsigned I = 0, N = FieldsWithMemberInitializers.size(); I != N; ++I) { + FieldDecl *OldField = FieldsWithMemberInitializers[I].first; + FieldDecl *NewField = FieldsWithMemberInitializers[I].second; + Expr *OldInit = OldField->getInClassInitializer(); - ExprResult NewInit = SubstInitializer(OldInit, TemplateArgs, - /*CXXDirectInit=*/false); - if (NewInit.isInvalid()) - NewField->setInvalidDecl(); - else { - Expr *Init = NewInit.take(); - assert(Init && "no-argument initializer in class"); - assert(!isa(Init) && "call-style init in class"); - ActOnCXXInClassMemberInitializer(NewField, - Init->getSourceRange().getBegin(), Init); + ExprResult NewInit = SubstInitializer(OldInit, TemplateArgs, + /*CXXDirectInit=*/false); + if (NewInit.isInvalid()) + NewField->setInvalidDecl(); + else { + Expr *Init = NewInit.take(); + assert(Init && "no-argument initializer in class"); + assert(!isa(Init) && "call-style init in class"); + ActOnCXXInClassMemberInitializer(NewField, + Init->getSourceRange().getBegin(), + Init); + } } } - // Instantiate late parsed attributes, and attach them to their decls. // See Sema::InstantiateAttrs for (LateInstantiatedAttrVec::iterator I = LateAttrs.begin(), diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 8afe7aca975..c7bd99c1ca6 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -2141,10 +2141,19 @@ TemplateDeclInstantiator::SubstFunctionType(FunctionDecl *D, TypeSourceInfo *OldTInfo = D->getTypeSourceInfo(); assert(OldTInfo && "substituting function without type source info"); assert(Params.empty() && "parameter vector is non-empty at start"); + + CXXRecordDecl *ThisContext = 0; + unsigned ThisTypeQuals = 0; + if (CXXMethodDecl *Method = dyn_cast(D)) { + ThisContext = Method->getParent(); + ThisTypeQuals = Method->getTypeQualifiers(); + } + TypeSourceInfo *NewTInfo = SemaRef.SubstFunctionDeclType(OldTInfo, TemplateArgs, D->getTypeSpecStartLoc(), - D->getDeclName()); + D->getDeclName(), + ThisContext, ThisTypeQuals); if (!NewTInfo) return 0; @@ -2206,6 +2215,195 @@ TemplateDeclInstantiator::SubstFunctionType(FunctionDecl *D, return NewTInfo; } +/// Introduce the instantiated function parameters into the local +/// instantiation scope, and set the parameter names to those used +/// in the template. +static void addInstantiatedParametersToScope(Sema &S, FunctionDecl *Function, + const FunctionDecl *PatternDecl, + LocalInstantiationScope &Scope, + const MultiLevelTemplateArgumentList &TemplateArgs) { + unsigned FParamIdx = 0; + for (unsigned I = 0, N = PatternDecl->getNumParams(); I != N; ++I) { + const ParmVarDecl *PatternParam = PatternDecl->getParamDecl(I); + if (!PatternParam->isParameterPack()) { + // Simple case: not a parameter pack. + assert(FParamIdx < Function->getNumParams()); + ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx); + FunctionParam->setDeclName(PatternParam->getDeclName()); + Scope.InstantiatedLocal(PatternParam, FunctionParam); + ++FParamIdx; + continue; + } + + // Expand the parameter pack. + Scope.MakeInstantiatedLocalArgPack(PatternParam); + unsigned NumArgumentsInExpansion + = S.getNumArgumentsInExpansion(PatternParam->getType(), TemplateArgs); + for (unsigned Arg = 0; Arg < NumArgumentsInExpansion; ++Arg) { + ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx); + FunctionParam->setDeclName(PatternParam->getDeclName()); + Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam); + ++FParamIdx; + } + } +} + +static void InstantiateExceptionSpec(Sema &SemaRef, FunctionDecl *New, + const FunctionProtoType *Proto, + const MultiLevelTemplateArgumentList &TemplateArgs) { + assert(Proto->getExceptionSpecType() != EST_Uninstantiated); + + // C++11 [expr.prim.general]p3: + // If a declaration declares a member function or member function + // template of a class X, the expression this is a prvalue of type + // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq + // and the end of the function-definition, member-declarator, or + // declarator. + CXXRecordDecl *ThisContext = 0; + unsigned ThisTypeQuals = 0; + if (CXXMethodDecl *Method = dyn_cast(New)) { + ThisContext = Method->getParent(); + ThisTypeQuals = Method->getTypeQualifiers(); + } + Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals, + SemaRef.getLangOpts().CPlusPlus0x); + + // The function has an exception specification or a "noreturn" + // attribute. Substitute into each of the exception types. + SmallVector Exceptions; + for (unsigned I = 0, N = Proto->getNumExceptions(); I != N; ++I) { + // FIXME: Poor location information! + if (const PackExpansionType *PackExpansion + = Proto->getExceptionType(I)->getAs()) { + // We have a pack expansion. Instantiate it. + SmallVector Unexpanded; + SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), + Unexpanded); + assert(!Unexpanded.empty() && + "Pack expansion without parameter packs?"); + + bool Expand = false; + bool RetainExpansion = false; + llvm::Optional NumExpansions + = PackExpansion->getNumExpansions(); + if (SemaRef.CheckParameterPacksForExpansion(New->getLocation(), + SourceRange(), + Unexpanded, + TemplateArgs, + Expand, + RetainExpansion, + NumExpansions)) + break; + + if (!Expand) { + // We can't expand this pack expansion into separate arguments yet; + // just substitute into the pattern and create a new pack expansion + // type. + Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, -1); + QualType T = SemaRef.SubstType(PackExpansion->getPattern(), + TemplateArgs, + New->getLocation(), New->getDeclName()); + if (T.isNull()) + break; + + T = SemaRef.Context.getPackExpansionType(T, NumExpansions); + Exceptions.push_back(T); + continue; + } + + // Substitute into the pack expansion pattern for each template + bool Invalid = false; + for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { + Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, ArgIdx); + + QualType T = SemaRef.SubstType(PackExpansion->getPattern(), + TemplateArgs, + New->getLocation(), New->getDeclName()); + if (T.isNull()) { + Invalid = true; + break; + } + + Exceptions.push_back(T); + } + + if (Invalid) + break; + + continue; + } + + QualType T + = SemaRef.SubstType(Proto->getExceptionType(I), TemplateArgs, + New->getLocation(), New->getDeclName()); + if (T.isNull() || + SemaRef.CheckSpecifiedExceptionType(T, New->getLocation())) + continue; + + Exceptions.push_back(T); + } + Expr *NoexceptExpr = 0; + if (Expr *OldNoexceptExpr = Proto->getNoexceptExpr()) { + EnterExpressionEvaluationContext Unevaluated(SemaRef, + Sema::ConstantEvaluated); + ExprResult E = SemaRef.SubstExpr(OldNoexceptExpr, TemplateArgs); + if (E.isUsable()) + E = SemaRef.CheckBooleanCondition(E.get(), E.get()->getLocStart()); + + if (E.isUsable()) { + NoexceptExpr = E.take(); + if (!NoexceptExpr->isTypeDependent() && + !NoexceptExpr->isValueDependent()) + NoexceptExpr = SemaRef.VerifyIntegerConstantExpression(NoexceptExpr, + 0, SemaRef.PDiag(diag::err_noexcept_needs_constant_expression), + /*AllowFold*/ false).take(); + } + } + + // Rebuild the function type + const FunctionProtoType *NewProto + = New->getType()->getAs(); + assert(NewProto && "Template instantiation without function prototype?"); + + FunctionProtoType::ExtProtoInfo EPI = NewProto->getExtProtoInfo(); + EPI.ExceptionSpecType = Proto->getExceptionSpecType(); + EPI.NumExceptions = Exceptions.size(); + EPI.Exceptions = Exceptions.data(); + EPI.NoexceptExpr = NoexceptExpr; + + New->setType(SemaRef.Context.getFunctionType(NewProto->getResultType(), + NewProto->arg_type_begin(), + NewProto->getNumArgs(), + EPI)); +} + +void Sema::InstantiateExceptionSpec(SourceLocation PointOfInstantiation, + FunctionDecl *Decl) { + const FunctionProtoType *Proto = Decl->getType()->castAs(); + if (Proto->getExceptionSpecType() != EST_Uninstantiated) + return; + + InstantiatingTemplate Inst(*this, PointOfInstantiation, Decl, + InstantiatingTemplate::ExceptionSpecification()); + if (Inst) + return; + + // Enter the scope of this instantiation. We don't use + // PushDeclContext because we don't have a scope. + Sema::ContextRAII savedContext(*this, Decl); + LocalInstantiationScope Scope(*this); + + MultiLevelTemplateArgumentList TemplateArgs = + getTemplateInstantiationArgs(Decl, 0, /*RelativeToPrimary*/true); + + FunctionDecl *Template = Proto->getExceptionSpecTemplate(); + addInstantiatedParametersToScope(*this, Decl, Template, Scope, TemplateArgs); + + ::InstantiateExceptionSpec(*this, Decl, + Template->getType()->castAs(), + TemplateArgs); +} + /// \brief Initializes the common fields of an instantiation function /// declaration (New) from the corresponding fields of its template (Tmpl). /// @@ -2243,119 +2441,37 @@ TemplateDeclInstantiator::InitFunctionInstantiation(FunctionDecl *New, assert(Proto && "Function template without prototype?"); if (Proto->hasExceptionSpec() || Proto->getNoReturnAttr()) { - // The function has an exception specification or a "noreturn" - // attribute. Substitute into each of the exception types. - SmallVector Exceptions; - for (unsigned I = 0, N = Proto->getNumExceptions(); I != N; ++I) { - // FIXME: Poor location information! - if (const PackExpansionType *PackExpansion - = Proto->getExceptionType(I)->getAs()) { - // We have a pack expansion. Instantiate it. - SmallVector Unexpanded; - SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), - Unexpanded); - assert(!Unexpanded.empty() && - "Pack expansion without parameter packs?"); - - bool Expand = false; - bool RetainExpansion = false; - llvm::Optional NumExpansions - = PackExpansion->getNumExpansions(); - if (SemaRef.CheckParameterPacksForExpansion(New->getLocation(), - SourceRange(), - Unexpanded, - TemplateArgs, - Expand, - RetainExpansion, - NumExpansions)) - break; - - if (!Expand) { - // We can't expand this pack expansion into separate arguments yet; - // just substitute into the pattern and create a new pack expansion - // type. - Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, -1); - QualType T = SemaRef.SubstType(PackExpansion->getPattern(), - TemplateArgs, - New->getLocation(), New->getDeclName()); - if (T.isNull()) - break; - - T = SemaRef.Context.getPackExpansionType(T, NumExpansions); - Exceptions.push_back(T); - continue; - } - - // Substitute into the pack expansion pattern for each template - bool Invalid = false; - for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { - Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, ArgIdx); - - QualType T = SemaRef.SubstType(PackExpansion->getPattern(), - TemplateArgs, - New->getLocation(), New->getDeclName()); - if (T.isNull()) { - Invalid = true; - break; - } - - Exceptions.push_back(T); - } - - if (Invalid) - break; - - continue; - } - - QualType T - = SemaRef.SubstType(Proto->getExceptionType(I), TemplateArgs, - New->getLocation(), New->getDeclName()); - if (T.isNull() || - SemaRef.CheckSpecifiedExceptionType(T, New->getLocation())) - continue; - - Exceptions.push_back(T); - } - Expr *NoexceptExpr = 0; - if (Expr *OldNoexceptExpr = Proto->getNoexceptExpr()) { - EnterExpressionEvaluationContext Unevaluated(SemaRef, - Sema::ConstantEvaluated); - ExprResult E = SemaRef.SubstExpr(OldNoexceptExpr, TemplateArgs); - if (E.isUsable()) - E = SemaRef.CheckBooleanCondition(E.get(), E.get()->getLocStart()); - - if (E.isUsable()) { - NoexceptExpr = E.take(); - if (!NoexceptExpr->isTypeDependent() && - !NoexceptExpr->isValueDependent()) - NoexceptExpr = SemaRef.VerifyIntegerConstantExpression(NoexceptExpr, - 0, SemaRef.PDiag(diag::err_noexcept_needs_constant_expression), - /*AllowFold*/ false).take(); - } - } - - // Rebuild the function type - FunctionProtoType::ExtProtoInfo EPI = Proto->getExtProtoInfo(); - EPI.ExceptionSpecType = Proto->getExceptionSpecType(); - EPI.NumExceptions = Exceptions.size(); - EPI.Exceptions = Exceptions.data(); - EPI.NoexceptExpr = NoexceptExpr; - EPI.ExtInfo = Proto->getExtInfo(); - const FunctionProtoType *NewProto - = New->getType()->getAs(); - assert(NewProto && "Template instantiation without function prototype?"); - New->setType(SemaRef.Context.getFunctionType(NewProto->getResultType(), - NewProto->arg_type_begin(), - NewProto->getNumArgs(), - EPI)); + // DR1330: In C++11, defer instantiation of a non-trivial + // exception specification. + if (SemaRef.getLangOpts().CPlusPlus0x && + EPI.ExceptionSpecType != EST_None && + EPI.ExceptionSpecType != EST_DynamicNone && + EPI.ExceptionSpecType != EST_BasicNoexcept) { + FunctionDecl *ExceptionSpecTemplate = Tmpl; + if (EPI.ExceptionSpecType == EST_Uninstantiated) + ExceptionSpecTemplate = EPI.ExceptionSpecTemplate; + + // Mark the function has having an uninstantiated exception specification. + const FunctionProtoType *NewProto + = New->getType()->getAs(); + assert(NewProto && "Template instantiation without function prototype?"); + EPI = NewProto->getExtProtoInfo(); + EPI.ExceptionSpecType = EST_Uninstantiated; + EPI.ExceptionSpecDecl = New; + EPI.ExceptionSpecTemplate = ExceptionSpecTemplate; + New->setType(SemaRef.Context.getFunctionType(NewProto->getResultType(), + NewProto->arg_type_begin(), + NewProto->getNumArgs(), + EPI)); + } else { + ::InstantiateExceptionSpec(SemaRef, New, Proto, TemplateArgs); + } } - const FunctionDecl* Definition = Tmpl; - // Get the definition. Leaves the variable unchanged if undefined. + const FunctionDecl *Definition = Tmpl; Tmpl->isDefined(Definition); SemaRef.InstantiateAttrs(TemplateArgs, Definition, New, @@ -2513,33 +2629,8 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, MultiLevelTemplateArgumentList TemplateArgs = getTemplateInstantiationArgs(Function, 0, false, PatternDecl); - // Introduce the instantiated function parameters into the local - // instantiation scope, and set the parameter names to those used - // in the template. - unsigned FParamIdx = 0; - for (unsigned I = 0, N = PatternDecl->getNumParams(); I != N; ++I) { - const ParmVarDecl *PatternParam = PatternDecl->getParamDecl(I); - if (!PatternParam->isParameterPack()) { - // Simple case: not a parameter pack. - assert(FParamIdx < Function->getNumParams()); - ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx); - FunctionParam->setDeclName(PatternParam->getDeclName()); - Scope.InstantiatedLocal(PatternParam, FunctionParam); - ++FParamIdx; - continue; - } - - // Expand the parameter pack. - Scope.MakeInstantiatedLocalArgPack(PatternParam); - unsigned NumArgumentsInExpansion - = getNumArgumentsInExpansion(PatternParam->getType(), TemplateArgs); - for (unsigned Arg = 0; Arg < NumArgumentsInExpansion; ++Arg) { - ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx); - FunctionParam->setDeclName(PatternParam->getDeclName()); - Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam); - ++FParamIdx; - } - } + addInstantiatedParametersToScope(*this, Function, PatternDecl, Scope, + TemplateArgs); if (PatternDecl->isDefaulted()) { ActOnFinishFunctionBody(Function, 0, /*IsInstantiation=*/true); diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp index c41df82a48b..1400e7e5c41 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp @@ -2371,34 +2371,33 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, EPI.ConsumedArguments = ConsumedArguments.data(); SmallVector Exceptions; - EPI.ExceptionSpecType = FTI.getExceptionSpecType(); + SmallVector DynamicExceptions; + SmallVector DynamicExceptionRanges; + Expr *NoexceptExpr = 0; + if (FTI.getExceptionSpecType() == EST_Dynamic) { - Exceptions.reserve(FTI.NumExceptions); - for (unsigned ei = 0, ee = FTI.NumExceptions; ei != ee; ++ei) { - // FIXME: Preserve type source info. - QualType ET = S.GetTypeFromParser(FTI.Exceptions[ei].Ty); - // Check that the type is valid for an exception spec, and - // drop it if not. - if (!S.CheckSpecifiedExceptionType(ET, FTI.Exceptions[ei].Range)) - Exceptions.push_back(ET); + // FIXME: It's rather inefficient to have to split into two vectors + // here. + unsigned N = FTI.NumExceptions; + DynamicExceptions.reserve(N); + DynamicExceptionRanges.reserve(N); + for (unsigned I = 0; I != N; ++I) { + DynamicExceptions.push_back(FTI.Exceptions[I].Ty); + DynamicExceptionRanges.push_back(FTI.Exceptions[I].Range); } - EPI.NumExceptions = Exceptions.size(); - EPI.Exceptions = Exceptions.data(); } else if (FTI.getExceptionSpecType() == EST_ComputedNoexcept) { - // If an error occurred, there's no expression here. - if (Expr *NoexceptExpr = FTI.NoexceptExpr) { - assert((NoexceptExpr->isTypeDependent() || - NoexceptExpr->getType()->getCanonicalTypeUnqualified() == - Context.BoolTy) && - "Parser should have made sure that the expression is boolean"); - if (!NoexceptExpr->isValueDependent()) - NoexceptExpr = S.VerifyIntegerConstantExpression(NoexceptExpr, 0, - S.PDiag(diag::err_noexcept_needs_constant_expression), - /*AllowFold*/ false).take(); - EPI.NoexceptExpr = NoexceptExpr; - } - } else if (FTI.getExceptionSpecType() == EST_None && - ImplicitlyNoexcept && chunkIndex == 0) { + NoexceptExpr = FTI.NoexceptExpr; + } + + S.checkExceptionSpecification(FTI.getExceptionSpecType(), + DynamicExceptions, + DynamicExceptionRanges, + NoexceptExpr, + Exceptions, + EPI); + + if (FTI.getExceptionSpecType() == EST_None && + ImplicitlyNoexcept && chunkIndex == 0) { // Only the outermost chunk is marked noexcept, of course. EPI.ExceptionSpecType = EST_BasicNoexcept; } @@ -4196,7 +4195,8 @@ bool Sema::RequireCompleteType(SourceLocation Loc, QualType T, // class template specialization, or an array with known size of such, // try to instantiate it. QualType MaybeTemplate = T; - if (const ConstantArrayType *Array = Context.getAsConstantArrayType(T)) + while (const ConstantArrayType *Array + = Context.getAsConstantArrayType(MaybeTemplate)) MaybeTemplate = Array->getElementType(); if (const RecordType *Record = MaybeTemplate->getAs()) { if (ClassTemplateSpecializationDecl *ClassTemplateSpec diff --git a/contrib/llvm/tools/clang/lib/Sema/TreeTransform.h b/contrib/llvm/tools/clang/lib/Sema/TreeTransform.h index fdb861eea51..a66378e5178 100644 --- a/contrib/llvm/tools/clang/lib/Sema/TreeTransform.h +++ b/contrib/llvm/tools/clang/lib/Sema/TreeTransform.h @@ -522,6 +522,11 @@ public: QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); #include "clang/AST/TypeLocNodes.def" + QualType TransformFunctionProtoType(TypeLocBuilder &TLB, + FunctionProtoTypeLoc TL, + CXXRecordDecl *ThisContext, + unsigned ThisTypeQuals); + StmtResult TransformSEHHandler(Stmt *Handler); @@ -1044,6 +1049,15 @@ public: return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); } + /// \brief Build a new label statement. + /// + /// By default, performs semantic analysis to build the new statement. + /// Subclasses may override this routine to provide different behavior. + StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, const AttrVec &Attrs, + Stmt *SubStmt) { + return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); + } + /// \brief Build a new "if" statement. /// /// By default, performs semantic analysis to build the new statement. @@ -4156,12 +4170,18 @@ template QualType TreeTransform::TransformFunctionProtoType(TypeLocBuilder &TLB, FunctionProtoTypeLoc TL) { + return getDerived().TransformFunctionProtoType(TLB, TL, 0, 0); +} + +template +QualType +TreeTransform::TransformFunctionProtoType(TypeLocBuilder &TLB, + FunctionProtoTypeLoc TL, + CXXRecordDecl *ThisContext, + unsigned ThisTypeQuals) { // Transform the parameters and return type. // - // We instantiate in source order, with the return type first followed by - // the parameters, because users tend to expect this (even if they shouldn't - // rely on it!). - // + // We are required to instantiate the params and return type in source order. // When the function has a trailing return type, we instantiate the // parameters before the return type, since the return type can then refer // to the parameters themselves (via decltype, sizeof, etc.). @@ -4180,9 +4200,19 @@ TreeTransform::TransformFunctionProtoType(TypeLocBuilder &TLB, ParamTypes, &ParamDecls)) return QualType(); - ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); - if (ResultType.isNull()) - return QualType(); + { + // C++11 [expr.prim.general]p3: + // If a declaration declares a member function or member function + // template of a class X, the expression this is a prvalue of type + // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq + // and the end of the function-definition, member-declarator, or + // declarator. + Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); + + ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); + if (ResultType.isNull()) + return QualType(); + } } else { ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); @@ -4197,6 +4227,8 @@ TreeTransform::TransformFunctionProtoType(TypeLocBuilder &TLB, return QualType(); } + // FIXME: Need to transform the exception-specification too. + QualType Result = TL.getType(); if (getDerived().AlwaysRebuild() || ResultType != T->getResultType() || @@ -5154,14 +5186,30 @@ TreeTransform::TransformLabelStmt(LabelStmt *S) { S->getDecl()); if (!LD) return StmtError(); - - + + // FIXME: Pass the real colon location in. return getDerived().RebuildLabelStmt(S->getIdentLoc(), cast(LD), SourceLocation(), SubStmt.get()); } +template +StmtResult +TreeTransform::TransformAttributedStmt(AttributedStmt *S) { + StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); + if (SubStmt.isInvalid()) + return StmtError(); + + // TODO: transform attributes + if (SubStmt.get() == S->getSubStmt() /* && attrs are the same */) + return S; + + return getDerived().RebuildAttributedStmt(S->getAttrLoc(), + S->getAttrs(), + SubStmt.get()); +} + template StmtResult TreeTransform::TransformIfStmt(IfStmt *S) { diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTReader.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTReader.cpp index f91b66cf547..fd0c1713946 100644 --- a/contrib/llvm/tools/clang/lib/Serialization/ASTReader.cpp +++ b/contrib/llvm/tools/clang/lib/Serialization/ASTReader.cpp @@ -27,7 +27,6 @@ #include "clang/AST/NestedNameSpecifier.h" #include "clang/AST/Type.h" #include "clang/AST/TypeLocVisitor.h" -#include "llvm/Support/SaveAndRestore.h" #include "clang/Lex/MacroInfo.h" #include "clang/Lex/PreprocessingRecord.h" #include "clang/Lex/Preprocessor.h" @@ -46,6 +45,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" +#include "llvm/Support/SaveAndRestore.h" #include "llvm/Support/system_error.h" #include #include @@ -664,46 +664,6 @@ ASTDeclContextNameLookupTrait::GetInternalKey( return Key; } -ASTDeclContextNameLookupTrait::external_key_type -ASTDeclContextNameLookupTrait::GetExternalKey( - const internal_key_type& Key) const { - ASTContext &Context = Reader.getContext(); - switch (Key.Kind) { - case DeclarationName::Identifier: - return DeclarationName((IdentifierInfo*)Key.Data); - - case DeclarationName::ObjCZeroArgSelector: - case DeclarationName::ObjCOneArgSelector: - case DeclarationName::ObjCMultiArgSelector: - return DeclarationName(Selector(Key.Data)); - - case DeclarationName::CXXConstructorName: - return Context.DeclarationNames.getCXXConstructorName( - Context.getCanonicalType(Reader.getLocalType(F, Key.Data))); - - case DeclarationName::CXXDestructorName: - return Context.DeclarationNames.getCXXDestructorName( - Context.getCanonicalType(Reader.getLocalType(F, Key.Data))); - - case DeclarationName::CXXConversionFunctionName: - return Context.DeclarationNames.getCXXConversionFunctionName( - Context.getCanonicalType(Reader.getLocalType(F, Key.Data))); - - case DeclarationName::CXXOperatorName: - return Context.DeclarationNames.getCXXOperatorName( - (OverloadedOperatorKind)Key.Data); - - case DeclarationName::CXXLiteralOperatorName: - return Context.DeclarationNames.getCXXLiteralOperatorName( - (IdentifierInfo*)Key.Data); - - case DeclarationName::CXXUsingDirective: - return DeclarationName::getUsingDirectiveName(); - } - - llvm_unreachable("Invalid Name Kind ?"); -} - std::pair ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) { using namespace clang::io; @@ -749,7 +709,7 @@ ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) { ASTDeclContextNameLookupTrait::data_type ASTDeclContextNameLookupTrait::ReadData(internal_key_type, const unsigned char* d, - unsigned DataLen) { + unsigned DataLen) { using namespace clang::io; unsigned NumDecls = ReadUnalignedLE16(d); LE32DeclID *Start = (LE32DeclID *)d; @@ -1911,7 +1871,8 @@ ASTReader::ReadASTBlock(ModuleFile &F) { case UPDATE_VISIBLE: { unsigned Idx = 0; serialization::DeclID ID = ReadDeclID(F, Record, Idx); - void *Table = ASTDeclContextNameLookupTable::Create( + ASTDeclContextNameLookupTable *Table = + ASTDeclContextNameLookupTable::Create( (const unsigned char *)BlobStart + Record[Idx++], (const unsigned char *)BlobStart, ASTDeclContextNameLookupTrait(*this, F)); @@ -3905,6 +3866,9 @@ QualType ASTReader::readTypeRecord(unsigned Index) { EPI.Exceptions = Exceptions.data(); } else if (EST == EST_ComputedNoexcept) { EPI.NoexceptExpr = ReadExpr(*Loc.F); + } else if (EST == EST_Uninstantiated) { + EPI.ExceptionSpecDecl = ReadDeclAs(*Loc.F, Record, Idx); + EPI.ExceptionSpecTemplate = ReadDeclAs(*Loc.F, Record, Idx); } return Context.getFunctionType(ResultType, ParamTypes.data(), NumParams, EPI); @@ -4908,7 +4872,7 @@ namespace { // Look for this name within this module. ASTDeclContextNameLookupTable *LookupTable = - (ASTDeclContextNameLookupTable*)Info->second.NameLookupTableData; + Info->second.NameLookupTableData; ASTDeclContextNameLookupTable::iterator Pos = LookupTable->find(This->Name); if (Pos == LookupTable->end()) @@ -4972,48 +4936,95 @@ ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, } namespace { - /// \brief ModuleFile visitor used to complete the visible decls map of a + /// \brief ModuleFile visitor used to retrieve all visible names in a /// declaration context. - class DeclContextVisibleDeclMapVisitor { + class DeclContextAllNamesVisitor { ASTReader &Reader; - DeclContext *DC; + llvm::SmallVectorImpl &Contexts; + const DeclContext *DC; + llvm::DenseMap > &Decls; public: - DeclContextVisibleDeclMapVisitor(ASTReader &Reader, DeclContext *DC) - : Reader(Reader), DC(DC) { } + DeclContextAllNamesVisitor(ASTReader &Reader, + SmallVectorImpl &Contexts, + llvm::DenseMap > &Decls) + : Reader(Reader), Contexts(Contexts), Decls(Decls) { } static bool visit(ModuleFile &M, void *UserData) { - return static_cast(UserData)->visit(M); - } + DeclContextAllNamesVisitor *This + = static_cast(UserData); - bool visit(ModuleFile &M) { // Check whether we have any visible declaration information for // this context in this module. - ModuleFile::DeclContextInfosMap::iterator - Info = M.DeclContextInfos.find(DC); - if (Info == M.DeclContextInfos.end() || - !Info->second.NameLookupTableData) - return false; - - // Look for this name within this module. - ASTDeclContextNameLookupTable *LookupTable = - (ASTDeclContextNameLookupTable*)Info->second.NameLookupTableData; - for (ASTDeclContextNameLookupTable::key_iterator - I = LookupTable->key_begin(), - E = LookupTable->key_end(); I != E; ++I) { - DC->lookup(*I); // Force loading of the visible decls for the decl name. + ModuleFile::DeclContextInfosMap::iterator Info; + bool FoundInfo = false; + for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) { + Info = M.DeclContextInfos.find(This->Contexts[I]); + if (Info != M.DeclContextInfos.end() && + Info->second.NameLookupTableData) { + FoundInfo = true; + break; + } } - return false; + if (!FoundInfo) + return false; + + ASTDeclContextNameLookupTable *LookupTable = + Info->second.NameLookupTableData; + bool FoundAnything = false; + for (ASTDeclContextNameLookupTable::data_iterator + I = LookupTable->data_begin(), E = LookupTable->data_end(); + I != E; ++I) { + ASTDeclContextNameLookupTrait::data_type Data = *I; + for (; Data.first != Data.second; ++Data.first) { + NamedDecl *ND = This->Reader.GetLocalDeclAs(M, + *Data.first); + if (!ND) + continue; + + // Record this declaration. + FoundAnything = true; + This->Decls[ND->getDeclName()].push_back(ND); + } + } + + return FoundAnything; } }; } -void ASTReader::completeVisibleDeclsMap(DeclContext *DC) { +void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { if (!DC->hasExternalVisibleStorage()) return; - DeclContextVisibleDeclMapVisitor Visitor(*this, DC); - ModuleMgr.visit(&DeclContextVisibleDeclMapVisitor::visit, &Visitor); + llvm::DenseMap > Decls; + + // Compute the declaration contexts we need to look into. Multiple such + // declaration contexts occur when two declaration contexts from disjoint + // modules get merged, e.g., when two namespaces with the same name are + // independently defined in separate modules. + SmallVector Contexts; + Contexts.push_back(DC); + + if (DC->isNamespace()) { + MergedDeclsMap::iterator Merged + = MergedDecls.find(const_cast(cast(DC))); + if (Merged != MergedDecls.end()) { + for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) + Contexts.push_back(cast(GetDecl(Merged->second[I]))); + } + } + + DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls); + ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor); + ++NumVisibleDeclContextsRead; + + for (llvm::DenseMap >::iterator + I = Decls.begin(), E = Decls.end(); I != E; ++I) { + SetExternalVisibleDeclsForName(DC, I->first, I->second); + } } /// \brief Under non-PCH compilation the consumer receives the objc methods @@ -6364,6 +6375,6 @@ ASTReader::~ASTReader() { for (DeclContextVisibleUpdates::iterator J = I->second.begin(), F = I->second.end(); J != F; ++J) - delete static_cast(J->first); + delete J->first; } } diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTReaderDecl.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTReaderDecl.cpp index 5db5f9252b7..8dd53ee7d20 100644 --- a/contrib/llvm/tools/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/contrib/llvm/tools/clang/lib/Serialization/ASTReaderDecl.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "ASTCommon.h" +#include "ASTReaderInternals.h" #include "clang/Serialization/ASTReader.h" #include "clang/Sema/IdentifierResolver.h" #include "clang/Sema/Sema.h" @@ -955,6 +956,10 @@ void ASTDeclReader::VisitBlockDecl(BlockDecl *BD) { Params.push_back(ReadDeclAs(Record, Idx)); BD->setParams(Params); + BD->setIsVariadic(Record[Idx++]); + BD->setBlockMissingReturnType(Record[Idx++]); + BD->setIsConversionFromLambda(Record[Idx++]); + bool capturesCXXThis = Record[Idx++]; unsigned numCaptures = Record[Idx++]; SmallVector captures; @@ -2100,7 +2105,9 @@ Decl *ASTReader::ReadDeclRecord(DeclID ID) { DeclContextVisibleUpdates &U = I->second; for (DeclContextVisibleUpdates::iterator UI = U.begin(), UE = U.end(); UI != UE; ++UI) { - UI->second->DeclContextInfos[DC].NameLookupTableData = UI->first; + DeclContextInfo &Info = UI->second->DeclContextInfos[DC]; + delete Info.NameLookupTableData; + Info.NameLookupTableData = UI->first; } PendingVisibleUpdates.erase(I); } diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTReaderInternals.h b/contrib/llvm/tools/clang/lib/Serialization/ASTReaderInternals.h index 3a1dfcf4b74..e5159e95263 100644 --- a/contrib/llvm/tools/clang/lib/Serialization/ASTReaderInternals.h +++ b/contrib/llvm/tools/clang/lib/Serialization/ASTReaderInternals.h @@ -57,8 +57,7 @@ public: typedef DeclarationName external_key_type; typedef DeclNameKey internal_key_type; - explicit ASTDeclContextNameLookupTrait(ASTReader &Reader, - ModuleFile &F) + explicit ASTDeclContextNameLookupTrait(ASTReader &Reader, ModuleFile &F) : Reader(Reader), F(F) { } static bool EqualKey(const internal_key_type& a, @@ -68,9 +67,8 @@ public: unsigned ComputeHash(const DeclNameKey &Key) const; internal_key_type GetInternalKey(const external_key_type& Name) const; - external_key_type GetExternalKey(const internal_key_type& Key) const; - static std::pair + static std::pair ReadKeyDataLength(const unsigned char*& d); internal_key_type ReadKey(const unsigned char* d, unsigned); @@ -79,10 +77,6 @@ public: unsigned DataLen); }; -/// \brief The on-disk hash table used for the DeclContext's Name lookup table. -typedef OnDiskChainedHashTable - ASTDeclContextNameLookupTable; - /// \brief Class that performs lookup for an identifier stored in an AST file. class ASTIdentifierLookupTrait { ASTReader &Reader; diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp index 2eeb090af0d..007ecee9f53 100644 --- a/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp @@ -159,9 +159,18 @@ void ASTStmtReader::VisitLabelStmt(LabelStmt *S) { S->setIdentLoc(ReadSourceLocation(Record, Idx)); } +void ASTStmtReader::VisitAttributedStmt(AttributedStmt *S) { + VisitStmt(S); + AttrVec Attrs; + Reader.ReadAttributes(F, Attrs, Record, Idx); + S->Attrs = Attrs; + S->SubStmt = Reader.ReadSubStmt(); + S->AttrLoc = ReadSourceLocation(Record, Idx); +} + void ASTStmtReader::VisitIfStmt(IfStmt *S) { VisitStmt(S); - S->setConditionVariable(Reader.getContext(), + S->setConditionVariable(Reader.getContext(), ReadDeclAs(Record, Idx)); S->setCond(Reader.ReadSubExpr()); S->setThen(Reader.ReadSubStmt()); @@ -1630,6 +1639,10 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) { S = new (Context) LabelStmt(Empty); break; + case STMT_ATTRIBUTED: + S = new (Context) AttributedStmt(Empty); + break; + case STMT_IF: S = new (Context) IfStmt(Empty); break; diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTWriter.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTWriter.cpp index a4301b53e87..36933a9d9b8 100644 --- a/contrib/llvm/tools/clang/lib/Serialization/ASTWriter.cpp +++ b/contrib/llvm/tools/clang/lib/Serialization/ASTWriter.cpp @@ -195,6 +195,9 @@ void ASTTypeWriter::VisitFunctionProtoType(const FunctionProtoType *T) { Writer.AddTypeRef(T->getExceptionType(I), Record); } else if (T->getExceptionSpecType() == EST_ComputedNoexcept) { Writer.AddStmt(T->getNoexceptExpr()); + } else if (T->getExceptionSpecType() == EST_Uninstantiated) { + Writer.AddDeclRef(T->getExceptionSpecDecl(), Record); + Writer.AddDeclRef(T->getExceptionSpecTemplate(), Record); } Code = TYPE_FUNCTION_PROTO; } @@ -651,6 +654,7 @@ static void AddStmtsExprs(llvm::BitstreamWriter &Stream, RECORD(STMT_CASE); RECORD(STMT_DEFAULT); RECORD(STMT_LABEL); + RECORD(STMT_ATTRIBUTED); RECORD(STMT_IF); RECORD(STMT_SWITCH); RECORD(STMT_WHILE); diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTWriterDecl.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTWriterDecl.cpp index 7a4ef63bb3f..1ee3ac480b6 100644 --- a/contrib/llvm/tools/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/contrib/llvm/tools/clang/lib/Serialization/ASTWriterDecl.cpp @@ -775,6 +775,9 @@ void ASTDeclWriter::VisitBlockDecl(BlockDecl *D) { for (FunctionDecl::param_iterator P = D->param_begin(), PEnd = D->param_end(); P != PEnd; ++P) Writer.AddDeclRef(*P, Record); + Record.push_back(D->isVariadic()); + Record.push_back(D->blockMissingReturnType()); + Record.push_back(D->isConversionFromLambda()); Record.push_back(D->capturesCXXThis()); Record.push_back(D->getNumCaptures()); for (BlockDecl::capture_iterator diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTWriterStmt.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTWriterStmt.cpp index 827caa026a4..1e312114631 100644 --- a/contrib/llvm/tools/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/contrib/llvm/tools/clang/lib/Serialization/ASTWriterStmt.cpp @@ -106,6 +106,14 @@ void ASTStmtWriter::VisitLabelStmt(LabelStmt *S) { Code = serialization::STMT_LABEL; } +void ASTStmtWriter::VisitAttributedStmt(AttributedStmt *S) { + VisitStmt(S); + Writer.WriteAttributes(S->getAttrs(), Record); + Writer.AddStmt(S->getSubStmt()); + Writer.AddSourceLocation(S->getAttrLoc(), Record); + Code = serialization::STMT_ATTRIBUTED; +} + void ASTStmtWriter::VisitIfStmt(IfStmt *S) { VisitStmt(S); Writer.AddDeclRef(S->getConditionVariable(), Record); diff --git a/contrib/llvm/tools/clang/lib/Serialization/Module.cpp b/contrib/llvm/tools/clang/lib/Serialization/Module.cpp index 16b95e2a683..ff241d3d410 100644 --- a/contrib/llvm/tools/clang/lib/Serialization/Module.cpp +++ b/contrib/llvm/tools/clang/lib/Serialization/Module.cpp @@ -45,8 +45,7 @@ ModuleFile::~ModuleFile() { E = DeclContextInfos.end(); I != E; ++I) { if (I->second.NameLookupTableData) - delete static_cast( - I->second.NameLookupTableData); + delete I->second.NameLookupTableData; } delete static_cast(IdentifierLookupTable); diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp index d15c8ba408a..97b58cf79b0 100644 --- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp +++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp @@ -183,9 +183,6 @@ static void checkForInvalidSelf(const Expr *E, CheckerContext &C, void ObjCSelfInitChecker::checkPostObjCMessage(ObjCMessage msg, CheckerContext &C) const { - CallOrObjCMessage MsgWrapper(msg, C.getState(), C.getLocationContext()); - checkPostStmt(MsgWrapper, C); - // When encountering a message that does initialization (init rule), // tag the return value so that we know later on that if self has this value // then it is properly initialized. @@ -209,6 +206,9 @@ void ObjCSelfInitChecker::checkPostObjCMessage(ObjCMessage msg, return; } + CallOrObjCMessage MsgWrapper(msg, C.getState(), C.getLocationContext()); + checkPostStmt(MsgWrapper, C); + // We don't check for an invalid 'self' in an obj-c message expression to cut // down false positives where logging functions get information from self // (like its class) or doing "invalidation" on self when the initialization @@ -277,6 +277,11 @@ void ObjCSelfInitChecker::checkPreStmt(const CallOrObjCMessage &CE, CheckerContext &C) const { ProgramStateRef state = C.getState(); unsigned NumArgs = CE.getNumArgs(); + // If we passed 'self' as and argument to the call, record it in the state + // to be propagated after the call. + // Note, we could have just given up, but try to be more optimistic here and + // assume that the functions are going to continue initialization or will not + // modify self. for (unsigned i = 0; i < NumArgs; ++i) { SVal argV = CE.getArgSVal(i); if (isSelfVar(argV, C)) { @@ -298,14 +303,24 @@ void ObjCSelfInitChecker::checkPostStmt(const CallOrObjCMessage &CE, for (unsigned i = 0; i < NumArgs; ++i) { SVal argV = CE.getArgSVal(i); if (isSelfVar(argV, C)) { + // If the address of 'self' is being passed to the call, assume that the + // 'self' after the call will have the same flags. + // EX: log(&self) SelfFlagEnum prevFlags = (SelfFlagEnum)state->get(); state = state->remove(); addSelfFlag(state, state->getSVal(cast(argV)), prevFlags, C); return; } else if (hasSelfFlag(argV, SelfFlag_Self, C)) { + // If 'self' is passed to the call by value, assume that the function + // returns 'self'. So assign the flags, which were set on 'self' to the + // return value. + // EX: self = performMoreInitialization(self) SelfFlagEnum prevFlags = (SelfFlagEnum)state->get(); state = state->remove(); - addSelfFlag(state, state->getSVal(cast(argV)), prevFlags, C); + const Expr *CallExpr = CE.getOriginExpr(); + if (CallExpr) + addSelfFlag(state, state->getSVal(CallExpr, C.getLocationContext()), + prevFlags, C); return; } } @@ -358,7 +373,7 @@ static bool isSelfVar(SVal location, CheckerContext &C) { return false; loc::MemRegionVal MRV = cast(location); - if (const DeclRegion *DR = dyn_cast(MRV.getRegion())) + if (const DeclRegion *DR = dyn_cast(MRV.stripCasts())) return (DR->getDecl() == analCtx->getSelfDecl()); return false; diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/AnalysisManager.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/AnalysisManager.cpp index 82ac8bda021..eeaed2de836 100644 --- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/AnalysisManager.cpp +++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/AnalysisManager.cpp @@ -8,8 +8,6 @@ //===----------------------------------------------------------------------===// #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h" -#include "clang/Index/Entity.h" -#include "clang/Index/Indexer.h" using namespace clang; using namespace ento; @@ -22,7 +20,6 @@ AnalysisManager::AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags, StoreManagerCreator storemgr, ConstraintManagerCreator constraintmgr, CheckerManager *checkerMgr, - idx::Indexer *idxer, unsigned maxnodes, unsigned maxvisit, bool vizdot, bool vizubi, AnalysisPurgeMode purge, @@ -38,7 +35,7 @@ AnalysisManager::AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags, : AnaCtxMgr(useUnoptimizedCFG, addImplicitDtors, addInitializers), Ctx(ctx), Diags(diags), LangOpts(lang), PD(pd), CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr), - CheckerMgr(checkerMgr), Idxer(idxer), + CheckerMgr(checkerMgr), AScope(ScopeDecl), MaxNodes(maxnodes), MaxVisit(maxvisit), VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead(purge), EagerlyAssume(eager), TrimGraph(trim), @@ -62,7 +59,6 @@ AnalysisManager::AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags, CreateStoreMgr(ParentAM.CreateStoreMgr), CreateConstraintMgr(ParentAM.CreateConstraintMgr), CheckerMgr(ParentAM.CheckerMgr), - Idxer(ParentAM.Idxer), AScope(ScopeDecl), MaxNodes(ParentAM.MaxNodes), MaxVisit(ParentAM.MaxVisit), @@ -80,21 +76,3 @@ AnalysisManager::AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags, { AnaCtxMgr.getCFGBuildOptions().setAllAlwaysAdd(); } - - -AnalysisDeclContext * -AnalysisManager::getAnalysisDeclContextInAnotherTU(const Decl *D) { - idx::Entity Ent = idx::Entity::get(const_cast(D), - Idxer->getProgram()); - FunctionDecl *FuncDef; - idx::TranslationUnit *TU; - llvm::tie(FuncDef, TU) = Idxer->getDefinitionFor(Ent); - - if (FuncDef == 0) - return 0; - - // This AnalysisDeclContext wraps function definition in another translation unit. - // But it is still owned by the AnalysisManager associated with the current - // translation unit. - return AnaCtxMgr.getContext(FuncDef, TU); -} diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp index eb986afa3db..ca662c79921 100644 --- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp +++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp @@ -17,7 +17,6 @@ #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h" #include "clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h" #include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h" -#include "clang/Index/TranslationUnit.h" #include "clang/AST/Expr.h" #include "clang/AST/StmtCXX.h" #include "llvm/Support/Casting.h" diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index d2da9aaccb7..1fd90685186 100644 --- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -536,6 +536,7 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, case Stmt::IfStmtClass: case Stmt::IndirectGotoStmtClass: case Stmt::LabelStmtClass: + case Stmt::AttributedStmtClass: case Stmt::NoStmtClass: case Stmt::NullStmtClass: case Stmt::SwitchStmtClass: diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp index b99bd5441e4..b9f4e153d7e 100644 --- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp +++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp @@ -134,6 +134,11 @@ bool ExprEngine::shouldInlineDecl(const FunctionDecl *FD, ExplodedNode *Pred) { AnalysisDeclContext *CalleeADC = AMgr.getAnalysisDeclContext(FD); const CFG *CalleeCFG = CalleeADC->getCFG(); + // It is possible that the CFG cannot be constructed. + // Be safe, and check if the CalleeCFG is valid. + if (!CalleeCFG) + return false; + if (getNumberStackFrames(Pred->getLocationContext()) == AMgr.InlineMaxStackDepth) return false; diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp index c19ebcbcc4b..008f744957e 100644 --- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp +++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp @@ -207,7 +207,6 @@ public: PP.getLangOpts(), PD, CreateStoreMgr, CreateConstraintMgr, checkerMgr.get(), - /* Indexer */ 0, Opts.MaxNodes, Opts.MaxLoop, Opts.VisualizeEGDot, Opts.VisualizeEGUbi, Opts.AnalysisPurgeOpt, Opts.EagerlyAssume, diff --git a/contrib/llvm/tools/clang/lib/Tooling/CompilationDatabase.cpp b/contrib/llvm/tools/clang/lib/Tooling/CompilationDatabase.cpp index eea1055f491..dd9ccc07b60 100644 --- a/contrib/llvm/tools/clang/lib/Tooling/CompilationDatabase.cpp +++ b/contrib/llvm/tools/clang/lib/Tooling/CompilationDatabase.cpp @@ -13,7 +13,7 @@ #include "clang/Tooling/CompilationDatabase.h" #include "llvm/ADT/SmallString.h" -#include "llvm/Support/JSONParser.h" +#include "llvm/Support/YAMLParser.h" #include "llvm/Support/Path.h" #include "llvm/Support/system_error.h" @@ -22,10 +22,10 @@ namespace tooling { namespace { -/// \brief A parser for JSON escaped strings of command line arguments. +/// \brief A parser for escaped strings of command line arguments. /// /// Assumes \-escaping for quoted arguments (see the documentation of -/// unescapeJSONCommandLine(...)). +/// unescapeCommandLine(...)). class CommandLineArgumentParser { public: CommandLineArgumentParser(StringRef CommandLine) @@ -90,9 +90,6 @@ class CommandLineArgumentParser { bool next() { ++Position; - if (Position == Input.end()) return false; - // Remove the JSON escaping first. This is done unconditionally. - if (*Position == '\\') ++Position; return Position != Input.end(); } @@ -101,9 +98,9 @@ class CommandLineArgumentParser { std::vector CommandLine; }; -std::vector unescapeJSONCommandLine( - StringRef JSONEscapedCommandLine) { - CommandLineArgumentParser parser(JSONEscapedCommandLine); +std::vector unescapeCommandLine( + StringRef EscapedCommandLine) { + CommandLineArgumentParser parser(EscapedCommandLine); return parser.parse(); } @@ -124,6 +121,33 @@ CompilationDatabase::loadFromDirectory(StringRef BuildDirectory, return Database.take(); } +FixedCompilationDatabase * +FixedCompilationDatabase::loadFromCommandLine(int &Argc, + const char **Argv, + Twine Directory) { + const char **DoubleDash = std::find(Argv, Argv + Argc, StringRef("--")); + if (DoubleDash == Argv + Argc) + return NULL; + std::vector CommandLine(DoubleDash + 1, Argv + Argc); + Argc = DoubleDash - Argv; + return new FixedCompilationDatabase(Directory, CommandLine); +} + +FixedCompilationDatabase:: +FixedCompilationDatabase(Twine Directory, ArrayRef CommandLine) { + std::vector ToolCommandLine(1, "clang-tool"); + ToolCommandLine.insert(ToolCommandLine.end(), + CommandLine.begin(), CommandLine.end()); + CompileCommands.push_back(CompileCommand(Directory, ToolCommandLine)); +} + +std::vector +FixedCompilationDatabase::getCompileCommands(StringRef FilePath) const { + std::vector Result(CompileCommands); + Result[0].CommandLine.push_back(FilePath); + return Result; +} + JSONCompilationDatabase * JSONCompilationDatabase::loadFromFile(StringRef FilePath, std::string &ErrorMessage) { @@ -162,65 +186,77 @@ JSONCompilationDatabase::getCompileCommands(StringRef FilePath) const { const std::vector &CommandsRef = CommandsRefI->getValue(); std::vector Commands; for (int I = 0, E = CommandsRef.size(); I != E; ++I) { + llvm::SmallString<8> DirectoryStorage; + llvm::SmallString<1024> CommandStorage; Commands.push_back(CompileCommand( // FIXME: Escape correctly: - CommandsRef[I].first, - unescapeJSONCommandLine(CommandsRef[I].second))); + CommandsRef[I].first->getValue(DirectoryStorage), + unescapeCommandLine(CommandsRef[I].second->getValue(CommandStorage)))); } return Commands; } bool JSONCompilationDatabase::parse(std::string &ErrorMessage) { - llvm::SourceMgr SM; - llvm::JSONParser Parser(Database->getBuffer(), &SM); - llvm::JSONValue *Root = Parser.parseRoot(); - if (Root == NULL) { - ErrorMessage = "Error while parsing JSON."; + llvm::yaml::document_iterator I = YAMLStream.begin(); + if (I == YAMLStream.end()) { + ErrorMessage = "Error while parsing YAML."; return false; } - llvm::JSONArray *Array = dyn_cast(Root); + llvm::yaml::Node *Root = I->getRoot(); + if (Root == NULL) { + ErrorMessage = "Error while parsing YAML."; + return false; + } + llvm::yaml::SequenceNode *Array = + llvm::dyn_cast(Root); if (Array == NULL) { ErrorMessage = "Expected array."; return false; } - for (llvm::JSONArray::const_iterator AI = Array->begin(), AE = Array->end(); + for (llvm::yaml::SequenceNode::iterator AI = Array->begin(), + AE = Array->end(); AI != AE; ++AI) { - const llvm::JSONObject *Object = dyn_cast(*AI); + llvm::yaml::MappingNode *Object = + llvm::dyn_cast(&*AI); if (Object == NULL) { ErrorMessage = "Expected object."; return false; } - StringRef EntryDirectory; - StringRef EntryFile; - StringRef EntryCommand; - for (llvm::JSONObject::const_iterator KVI = Object->begin(), - KVE = Object->end(); + llvm::yaml::ScalarNode *Directory; + llvm::yaml::ScalarNode *Command; + llvm::SmallString<8> FileStorage; + llvm::StringRef File; + for (llvm::yaml::MappingNode::iterator KVI = Object->begin(), + KVE = Object->end(); KVI != KVE; ++KVI) { - const llvm::JSONValue *Value = (*KVI)->Value; + llvm::yaml::Node *Value = (*KVI).getValue(); if (Value == NULL) { ErrorMessage = "Expected value."; return false; } - const llvm::JSONString *ValueString = - dyn_cast(Value); + llvm::yaml::ScalarNode *ValueString = + llvm::dyn_cast(Value); if (ValueString == NULL) { ErrorMessage = "Expected string as value."; return false; } - if ((*KVI)->Key->getRawText() == "directory") { - EntryDirectory = ValueString->getRawText(); - } else if ((*KVI)->Key->getRawText() == "file") { - EntryFile = ValueString->getRawText(); - } else if ((*KVI)->Key->getRawText() == "command") { - EntryCommand = ValueString->getRawText(); + llvm::yaml::ScalarNode *KeyString = + llvm::dyn_cast((*KVI).getKey()); + llvm::SmallString<8> KeyStorage; + if (KeyString->getValue(KeyStorage) == "directory") { + Directory = ValueString; + } else if (KeyString->getValue(KeyStorage) == "command") { + Command = ValueString; + } else if (KeyString->getValue(KeyStorage) == "file") { + File = ValueString->getValue(FileStorage); } else { - ErrorMessage = (Twine("Unknown key: \"") + - (*KVI)->Key->getRawText() + "\"").str(); + ErrorMessage = ("Unknown key: \"" + + KeyString->getRawValue() + "\"").str(); return false; } } - IndexByFile[EntryFile].push_back( - CompileCommandRef(EntryDirectory, EntryCommand)); + IndexByFile[File].push_back( + CompileCommandRef(Directory, Command)); } return true; } diff --git a/contrib/llvm/tools/llc/llc.cpp b/contrib/llvm/tools/llc/llc.cpp index 9e30ac198b2..ceff8a6c8cc 100644 --- a/contrib/llvm/tools/llc/llc.cpp +++ b/contrib/llvm/tools/llc/llc.cpp @@ -209,29 +209,6 @@ DontPlaceZerosInBSS("nozero-initialized-in-bss", cl::desc("Don't place zero-initialized symbols into bss section"), cl::init(false)); -static cl::opt -EnableJITExceptionHandling("jit-enable-eh", - cl::desc("Emit exception handling information"), - cl::init(false)); - -// In debug builds, make this default to true. -#ifdef NDEBUG -#define EMIT_DEBUG false -#else -#define EMIT_DEBUG true -#endif -static cl::opt -EmitJitDebugInfo("jit-emit-debug", - cl::desc("Emit debug information to debugger"), - cl::init(EMIT_DEBUG)); -#undef EMIT_DEBUG - -static cl::opt -EmitJitDebugInfoToDisk("jit-emit-debug-to-disk", - cl::Hidden, - cl::desc("Emit debug info objfiles to disk"), - cl::init(false)); - static cl::opt EnableGuaranteedTailCallOpt("tailcallopt", cl::desc("Turn fastcc calls into tail calls by (potentially) changing ABI."), @@ -463,9 +440,6 @@ int main(int argc, char **argv) { if (FloatABIForCalls != FloatABI::Default) Options.FloatABIType = FloatABIForCalls; Options.NoZerosInBSS = DontPlaceZerosInBSS; - Options.JITExceptionHandling = EnableJITExceptionHandling; - Options.JITEmitDebugInfo = EmitJitDebugInfo; - Options.JITEmitDebugInfoToDisk = EmitJitDebugInfoToDisk; Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt; Options.DisableTailCalls = DisableTailCalls; Options.StackAlignmentOverride = OverrideStackAlignment; diff --git a/contrib/llvm/tools/lli/lli.cpp b/contrib/llvm/tools/lli/lli.cpp index efcc1f5870c..2e2bf7d66ec 100644 --- a/contrib/llvm/tools/lli/lli.cpp +++ b/contrib/llvm/tools/lli/lli.cpp @@ -141,6 +141,28 @@ namespace { "Large code model"), clEnumValEnd)); + cl::opt + EnableJITExceptionHandling("jit-enable-eh", + cl::desc("Emit exception handling information"), + cl::init(false)); + + cl::opt +// In debug builds, make this default to true. +#ifdef NDEBUG +#define EMIT_DEBUG false +#else +#define EMIT_DEBUG true +#endif + EmitJitDebugInfo("jit-emit-debug", + cl::desc("Emit debug information to debugger"), + cl::init(EMIT_DEBUG)); +#undef EMIT_DEBUG + + static cl::opt + EmitJitDebugInfoToDisk("jit-emit-debug-to-disk", + cl::Hidden, + cl::desc("Emit debug info objfiles to disk"), + cl::init(false)); } static ExecutionEngine *EE = 0; @@ -229,6 +251,12 @@ int main(int argc, char **argv, char * const *envp) { } builder.setOptLevel(OLvl); + TargetOptions Options; + Options.JITExceptionHandling = EnableJITExceptionHandling; + Options.JITEmitDebugInfo = EmitJitDebugInfo; + Options.JITEmitDebugInfoToDisk = EmitJitDebugInfoToDisk; + builder.setTargetOptions(Options); + EE = builder.create(); if (!EE) { if (!ErrorMsg.empty()) diff --git a/contrib/llvm/tools/llvm-mc/Disassembler.cpp b/contrib/llvm/tools/llvm-mc/Disassembler.cpp index a8cd7c1c897..5f2fdb80714 100644 --- a/contrib/llvm/tools/llvm-mc/Disassembler.cpp +++ b/contrib/llvm/tools/llvm-mc/Disassembler.cpp @@ -17,21 +17,18 @@ #include "../../lib/MC/MCDisassembler/EDInst.h" #include "../../lib/MC/MCDisassembler/EDOperand.h" #include "../../lib/MC/MCDisassembler/EDToken.h" -#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCDisassembler.h" #include "llvm/MC/MCInst.h" -#include "llvm/MC/MCInstPrinter.h" -#include "llvm/MC/MCInstrInfo.h" -#include "llvm/MC/MCRegisterInfo.h" +#include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/Triple.h" -#include "llvm/ADT/Twine.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/MemoryObject.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/raw_ostream.h" + using namespace llvm; typedef std::vector > ByteArrayTy; @@ -56,8 +53,9 @@ public: } static bool PrintInsts(const MCDisassembler &DisAsm, - MCInstPrinter &Printer, const ByteArrayTy &Bytes, - SourceMgr &SM, raw_ostream &Out) { + const ByteArrayTy &Bytes, + SourceMgr &SM, raw_ostream &Out, + MCStreamer &Streamer) { // Wrap the vector in a MemoryObject. VectorMemoryObject memoryObject(Bytes); @@ -87,8 +85,7 @@ static bool PrintInsts(const MCDisassembler &DisAsm, // Fall through case MCDisassembler::Success: - Printer.printInst(&Inst, Out, ""); - Out << "\n"; + Streamer.EmitInstruction(Inst); break; } } @@ -145,56 +142,22 @@ static bool ByteArrayFromString(ByteArrayTy &ByteArray, int Disassembler::disassemble(const Target &T, const std::string &Triple, - const std::string &Cpu, - const std::string &FeaturesStr, + MCSubtargetInfo &STI, + MCStreamer &Streamer, MemoryBuffer &Buffer, + SourceMgr &SM, raw_ostream &Out) { - // Set up disassembler. - OwningPtr AsmInfo(T.createMCAsmInfo(Triple)); - - if (!AsmInfo) { - errs() << "error: no assembly info for target " << Triple << "\n"; - return -1; - } - - OwningPtr STI(T.createMCSubtargetInfo(Triple, Cpu, - FeaturesStr)); - if (!STI) { - errs() << "error: no subtarget info for target " << Triple << "\n"; - return -1; - } - - OwningPtr DisAsm(T.createMCDisassembler(*STI)); + OwningPtr DisAsm(T.createMCDisassembler(STI)); if (!DisAsm) { errs() << "error: no disassembler for target " << Triple << "\n"; return -1; } - OwningPtr MRI(T.createMCRegInfo(Triple)); - if (!MRI) { - errs() << "error: no register info for target " << Triple << "\n"; - return -1; - } - - OwningPtr MII(T.createMCInstrInfo()); - if (!MII) { - errs() << "error: no instruction info for target " << Triple << "\n"; - return -1; - } - - int AsmPrinterVariant = AsmInfo->getAssemblerDialect(); - OwningPtr IP(T.createMCInstPrinter(AsmPrinterVariant, *AsmInfo, - *MII, *MRI, *STI)); - if (!IP) { - errs() << "error: no instruction printer for target " << Triple << '\n'; - return -1; - } + // Set up initial section manually here + Streamer.InitSections(); bool ErrorOccurred = false; - SourceMgr SM; - SM.AddNewSourceBuffer(&Buffer, SMLoc()); - // Convert the input to a vector for disassembly. ByteArrayTy ByteArray; StringRef Str = Buffer.getBuffer(); @@ -202,7 +165,7 @@ int Disassembler::disassemble(const Target &T, ErrorOccurred |= ByteArrayFromString(ByteArray, Str, SM); if (!ByteArray.empty()) - ErrorOccurred |= PrintInsts(*DisAsm, *IP, ByteArray, SM, Out); + ErrorOccurred |= PrintInsts(*DisAsm, ByteArray, SM, Out, Streamer); return ErrorOccurred; } @@ -236,12 +199,10 @@ static int verboseEvaluator(uint64_t *V, unsigned R, void *Arg) { int Disassembler::disassembleEnhanced(const std::string &TS, MemoryBuffer &Buffer, + SourceMgr &SM, raw_ostream &Out) { ByteArrayTy ByteArray; StringRef Str = Buffer.getBuffer(); - SourceMgr SM; - - SM.AddNewSourceBuffer(&Buffer, SMLoc()); if (ByteArrayFromString(ByteArray, Str, SM)) { return -1; diff --git a/contrib/llvm/tools/llvm-mc/Disassembler.h b/contrib/llvm/tools/llvm-mc/Disassembler.h index e8cd92db030..17d622f1d9d 100644 --- a/contrib/llvm/tools/llvm-mc/Disassembler.h +++ b/contrib/llvm/tools/llvm-mc/Disassembler.h @@ -22,18 +22,23 @@ namespace llvm { class MemoryBuffer; class Target; class raw_ostream; +class SourceMgr; +class MCSubtargetInfo; +class MCStreamer; class Disassembler { public: - static int disassemble(const Target &target, - const std::string &tripleString, - const std::string &Cpu, - const std::string &FeaturesStr, - MemoryBuffer &buffer, + static int disassemble(const Target &T, + const std::string &Triple, + MCSubtargetInfo &STI, + MCStreamer &Streamer, + MemoryBuffer &Buffer, + SourceMgr &SM, raw_ostream &Out); static int disassembleEnhanced(const std::string &tripleString, MemoryBuffer &buffer, + SourceMgr &SM, raw_ostream &Out); }; diff --git a/contrib/llvm/tools/llvm-mc/llvm-mc.cpp b/contrib/llvm/tools/llvm-mc/llvm-mc.cpp index d882e01529d..36a482e908c 100644 --- a/contrib/llvm/tools/llvm-mc/llvm-mc.cpp +++ b/contrib/llvm/tools/llvm-mc/llvm-mc.cpp @@ -15,6 +15,7 @@ #include "llvm/MC/MCParser/AsmLexer.h" #include "llvm/MC/MCParser/MCAsmLexer.h" #include "llvm/MC/MCAsmBackend.h" +#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCCodeEmitter.h" #include "llvm/MC/MCInstPrinter.h" @@ -242,37 +243,11 @@ static void setDwarfDebugFlags(int argc, char **argv) { } } -static int AsLexInput(const char *ProgName) { - OwningPtr BufferPtr; - if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputFilename, BufferPtr)) { - errs() << ProgName << ": " << ec.message() << '\n'; - return 1; - } - MemoryBuffer *Buffer = BufferPtr.take(); +static int AsLexInput(SourceMgr &SrcMgr, MCAsmInfo &MAI, tool_output_file *Out) { - SourceMgr SrcMgr; - - // Tell SrcMgr about this buffer, which is what TGParser will pick up. - SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); - - // Record the location of the include directories so that the lexer can find - // it later. - SrcMgr.setIncludeDirs(IncludeDirs); - - const Target *TheTarget = GetTarget(ProgName); - if (!TheTarget) - return 1; - - llvm::OwningPtr MAI(TheTarget->createMCAsmInfo(TripleName)); - assert(MAI && "Unable to create target asm info!"); - - AsmLexer Lexer(*MAI); + AsmLexer Lexer(MAI); Lexer.setBuffer(SrcMgr.getMemoryBuffer(0)); - OwningPtr Out(GetOutputStream()); - if (!Out) - return 1; - bool Error = false; while (Lexer.Lex().isNot(AsmToken::Eof)) { AsmToken Tok = Lexer.getTok(); @@ -346,13 +321,49 @@ static int AsLexInput(const char *ProgName) { Out->os() << "\")\n"; } - // Keep output if no errors. - if (Error == 0) Out->keep(); - return Error; } -static int AssembleInput(const char *ProgName) { +static int AssembleInput(const char *ProgName, const Target *TheTarget, + SourceMgr &SrcMgr, MCContext &Ctx, MCStreamer &Str, + MCAsmInfo &MAI, MCSubtargetInfo &STI) { + OwningPtr Parser(createMCAsmParser(SrcMgr, Ctx, + Str, MAI)); + OwningPtr TAP(TheTarget->createMCAsmParser(STI, *Parser)); + if (!TAP) { + errs() << ProgName + << ": error: this target does not support assembly parsing.\n"; + return 1; + } + + Parser->setShowParsedOperands(ShowInstOperands); + Parser->setTargetParser(*TAP.get()); + + int Res = Parser->Run(NoInitialTextSection); + + return Res; +} + +int main(int argc, char **argv) { + // Print a stack trace if we signal out. + sys::PrintStackTraceOnErrorSignal(); + PrettyStackTraceProgram X(argc, argv); + llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. + + // Initialize targets and assembly printers/parsers. + llvm::InitializeAllTargetInfos(); + llvm::InitializeAllTargetMCs(); + llvm::InitializeAllAsmParsers(); + llvm::InitializeAllDisassemblers(); + + // Register the target printer for --version. + cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion); + + cl::ParseCommandLineOptions(argc, argv, "llvm machine code playground\n"); + TripleName = Triple::normalize(TripleName); + setDwarfDebugFlags(argc, argv); + + const char *ProgName = argv[0]; const Target *TheTarget = GetTarget(ProgName); if (!TheTarget) return 1; @@ -413,7 +424,6 @@ static int AssembleInput(const char *ProgName) { OwningPtr STI(TheTarget->createMCSubtargetInfo(TripleName, MCPU, FeaturesStr)); - // FIXME: There is a bit of code duplication with addPassesToEmitFile. if (FileType == OFT_AssemblyFile) { MCInstPrinter *IP = TheTarget->createMCInstPrinter(OutputAsmVariant, *MAI, *MCII, *MRI, *STI); @@ -440,93 +450,24 @@ static int AssembleInput(const char *ProgName) { NoExecStack)); } - OwningPtr Parser(createMCAsmParser(SrcMgr, Ctx, - *Str.get(), *MAI)); - OwningPtr TAP(TheTarget->createMCAsmParser(*STI, *Parser)); - if (!TAP) { - errs() << ProgName - << ": error: this target does not support assembly parsing.\n"; - return 1; - } - - Parser->setShowParsedOperands(ShowInstOperands); - Parser->setTargetParser(*TAP.get()); - - int Res = Parser->Run(NoInitialTextSection); - - // Keep output if no errors. - if (Res == 0) Out->keep(); - - return Res; -} - -static int DisassembleInput(const char *ProgName, bool Enhanced) { - const Target *TheTarget = GetTarget(ProgName); - if (!TheTarget) - return 0; - - OwningPtr Buffer; - if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputFilename, Buffer)) { - errs() << ProgName << ": " << ec.message() << '\n'; - return 1; - } - - OwningPtr Out(GetOutputStream()); - if (!Out) - return 1; - - int Res; - if (Enhanced) { - Res = - Disassembler::disassembleEnhanced(TripleName, *Buffer.take(), Out->os()); - } else { - // Package up features to be passed to target/subtarget - std::string FeaturesStr; - if (MAttrs.size()) { - SubtargetFeatures Features; - for (unsigned i = 0; i != MAttrs.size(); ++i) - Features.AddFeature(MAttrs[i]); - FeaturesStr = Features.getString(); - } - - Res = Disassembler::disassemble(*TheTarget, TripleName, MCPU, FeaturesStr, - *Buffer.take(), Out->os()); - } - - // Keep output if no errors. - if (Res == 0) Out->keep(); - - return Res; -} - - -int main(int argc, char **argv) { - // Print a stack trace if we signal out. - sys::PrintStackTraceOnErrorSignal(); - PrettyStackTraceProgram X(argc, argv); - llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. - - // Initialize targets and assembly printers/parsers. - llvm::InitializeAllTargetInfos(); - llvm::InitializeAllTargetMCs(); - llvm::InitializeAllAsmParsers(); - llvm::InitializeAllDisassemblers(); - - // Register the target printer for --version. - cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion); - - cl::ParseCommandLineOptions(argc, argv, "llvm machine code playground\n"); - TripleName = Triple::normalize(TripleName); - setDwarfDebugFlags(argc, argv); - + int Res = 1; switch (Action) { case AC_AsLex: - return AsLexInput(argv[0]); + Res = AsLexInput(SrcMgr, *MAI, Out.get()); + break; case AC_Assemble: - return AssembleInput(argv[0]); + Res = AssembleInput(ProgName, TheTarget, SrcMgr, Ctx, *Str, *MAI, *STI); + break; case AC_Disassemble: - return DisassembleInput(argv[0], false); + Res = Disassembler::disassemble(*TheTarget, TripleName, *STI, *Str, + *Buffer, SrcMgr, Out->os()); + break; case AC_EDisassemble: - return DisassembleInput(argv[0], true); + Res = Disassembler::disassembleEnhanced(TripleName, *Buffer, SrcMgr, Out->os()); + break; } + + // Keep output if no errors. + if (Res == 0) Out->keep(); + return Res; } diff --git a/contrib/llvm/tools/llvm-stress/llvm-stress.cpp b/contrib/llvm/tools/llvm-stress/llvm-stress.cpp index d284ea5e42c..fb05a589e8b 100644 --- a/contrib/llvm/tools/llvm-stress/llvm-stress.cpp +++ b/contrib/llvm/tools/llvm-stress/llvm-stress.cpp @@ -412,7 +412,7 @@ struct ExtractElementModifier: public Modifier { Value *Val0 = getRandomVectorValue(); Value *V = ExtractElementInst::Create(Val0, ConstantInt::get(Type::getInt32Ty(BB->getContext()), - Ran->Rand() % cast(Val0->getType())->getNumElements()), + Ran->Rand() % cast(Val0->getType())->getNumElements()), "E", BB->getTerminator()); return PT->push_back(V); } @@ -476,7 +476,7 @@ struct CastModifier: public Modifier { DestTy = pickVectorType(VecTy->getNumElements()); } - // no need to casr. + // no need to cast. if (VTy == DestTy) return; // Pointers: @@ -487,9 +487,11 @@ struct CastModifier: public Modifier { new BitCastInst(V, DestTy, "PC", BB->getTerminator())); } + unsigned VSize = VTy->getScalarType()->getPrimitiveSizeInBits(); + unsigned DestSize = DestTy->getScalarType()->getPrimitiveSizeInBits(); + // Generate lots of bitcasts. - if ((Ran->Rand() & 1) && - VTy->getPrimitiveSizeInBits() == DestTy->getPrimitiveSizeInBits()) { + if ((Ran->Rand() & 1) && VSize == DestSize) { return PT->push_back( new BitCastInst(V, DestTy, "BC", BB->getTerminator())); } @@ -497,11 +499,11 @@ struct CastModifier: public Modifier { // Both types are integers: if (VTy->getScalarType()->isIntegerTy() && DestTy->getScalarType()->isIntegerTy()) { - if (VTy->getScalarType()->getPrimitiveSizeInBits() > - DestTy->getScalarType()->getPrimitiveSizeInBits()) { + if (VSize > DestSize) { return PT->push_back( new TruncInst(V, DestTy, "Tr", BB->getTerminator())); } else { + assert(VSize < DestSize && "Different int types with the same size?"); if (Ran->Rand() & 1) return PT->push_back( new ZExtInst(V, DestTy, "ZE", BB->getTerminator())); @@ -531,14 +533,15 @@ struct CastModifier: public Modifier { // Both floats. if (VTy->getScalarType()->isFloatingPointTy() && DestTy->getScalarType()->isFloatingPointTy()) { - if (VTy->getScalarType()->getPrimitiveSizeInBits() > - DestTy->getScalarType()->getPrimitiveSizeInBits()) { + if (VSize > DestSize) { return PT->push_back( new FPTruncInst(V, DestTy, "Tr", BB->getTerminator())); - } else { + } else if (VSize < DestSize) { return PT->push_back( new FPExtInst(V, DestTy, "ZE", BB->getTerminator())); } + // If VSize == DestSize, then the two types must be fp128 and ppc_fp128, + // for which there is no defined conversion. So do nothing. } } diff --git a/contrib/llvm/tools/opt/opt.cpp b/contrib/llvm/tools/opt/opt.cpp index 30da863b411..a5b0511fd98 100644 --- a/contrib/llvm/tools/opt/opt.cpp +++ b/contrib/llvm/tools/opt/opt.cpp @@ -114,6 +114,9 @@ static cl::opt OptLevelO3("O3", cl::desc("Optimization level 3. Similar to llvm-gcc -O3")); +static cl::opt +TargetTriple("mtriple", cl::desc("Override target triple for module")); + static cl::opt UnitAtATime("funit-at-a-time", cl::desc("Enable IPO. This is same as llvm-gcc's -funit-at-a-time"), @@ -512,6 +515,10 @@ int main(int argc, char **argv) { return 1; } + // If we are supposed to override the target triple, do so now. + if (!TargetTriple.empty()) + M->setTargetTriple(Triple::normalize(TargetTriple)); + // Figure out what stream we are supposed to write to... OwningPtr Out; if (NoOutput) { diff --git a/contrib/llvm/utils/TableGen/AsmMatcherEmitter.cpp b/contrib/llvm/utils/TableGen/AsmMatcherEmitter.cpp index 39a3c25d99d..dc92a6c218e 100644 --- a/contrib/llvm/utils/TableGen/AsmMatcherEmitter.cpp +++ b/contrib/llvm/utils/TableGen/AsmMatcherEmitter.cpp @@ -1181,7 +1181,8 @@ void AsmMatcherInfo::BuildInfo() { unsigned VariantCount = Target.getAsmParserVariantCount(); for (unsigned VC = 0; VC != VariantCount; ++VC) { Record *AsmVariant = Target.getAsmParserVariant(VC); - std::string CommentDelimiter = AsmVariant->getValueAsString("CommentDelimiter"); + std::string CommentDelimiter = + AsmVariant->getValueAsString("CommentDelimiter"); std::string RegisterPrefix = AsmVariant->getValueAsString("RegisterPrefix"); int AsmVariantNo = AsmVariant->getValueAsInt("Variant"); @@ -1208,11 +1209,11 @@ void AsmMatcherInfo::BuildInfo() { // reject it. We reject aliases and ignore instructions for now. if (OI.MINumOperands != 1) { // FIXME: Should reject these. The ARM backend hits this with $lane - // in a bunch of instructions. It is unclear what the right answer is. + // in a bunch of instructions. The right answer is unclear. DEBUG({ errs() << "warning: '" << CGI.TheDef->getName() << "': " - << "ignoring instruction with multi-operand tied operand '" - << OI.Name << "'\n"; + << "ignoring instruction with multi-operand tied operand '" + << OI.Name << "'\n"; }); continue; } @@ -1248,8 +1249,8 @@ void AsmMatcherInfo::BuildInfo() { // If the tblgen -match-prefix option is specified (for tblgen hackers), // filter the set of instruction aliases we consider, based on the target // instruction. - if (!StringRef(Alias->ResultInst->TheDef->getName()).startswith( - MatchPrefix)) + if (!StringRef(Alias->ResultInst->TheDef->getName()) + .startswith( MatchPrefix)) continue; OwningPtr II(new MatchableInfo(Alias)); @@ -1328,6 +1329,9 @@ void AsmMatcherInfo::BuildInfo() { Record *Rec = AllTokenAliases[i]; ClassInfo *FromClass = getTokenClass(Rec->getValueAsString("FromToken")); ClassInfo *ToClass = getTokenClass(Rec->getValueAsString("ToToken")); + if (FromClass == ToClass) + throw TGError(Rec->getLoc(), + "error: Destination value identical to source value."); FromClass->SuperClasses.push_back(ToClass); } @@ -1868,7 +1872,8 @@ static void EmitComputeAvailableFeatures(AsmMatcherInfo &Info, SubtargetFeatureInfo &SFI = *it->second; OS << " if ("; - std::string CondStorage = SFI.TheDef->getValueAsString("AssemblerCondString"); + std::string CondStorage = + SFI.TheDef->getValueAsString("AssemblerCondString"); StringRef Conds = CondStorage; std::pair Comma = Conds.split(','); bool First = true; diff --git a/contrib/llvm/utils/TableGen/AsmWriterEmitter.cpp b/contrib/llvm/utils/TableGen/AsmWriterEmitter.cpp index e0b0aace33e..d079b45e8d5 100644 --- a/contrib/llvm/utils/TableGen/AsmWriterEmitter.cpp +++ b/contrib/llvm/utils/TableGen/AsmWriterEmitter.cpp @@ -289,7 +289,8 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) { for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i) { AsmWriterInst *AWI = CGIAWIMap[NumberedInstructions[i]]; if (AWI != 0 && - AWI->Operands[0].OperandType == AsmWriterOperand::isLiteralTextOperand && + AWI->Operands[0].OperandType == + AsmWriterOperand::isLiteralTextOperand && !AWI->Operands[0].Str.empty()) { std::string Str = AWI->Operands[0].Str; UnescapeString(Str); @@ -589,7 +590,7 @@ class IAPrinter { std::map OpMap; std::string Result; std::string AsmString; - std::vector ReqFeatures; + SmallVector ReqFeatures; public: IAPrinter(std::string R, std::string AS) : Result(R), AsmString(AS) {} @@ -919,7 +920,7 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) { O << " }\n"; O << " }\n"; O << " }\n\n"; - + O << " return true;\n"; O << "}\n\n"; diff --git a/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.cpp b/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.cpp index d2ddf232b32..d4b02fbd2f3 100644 --- a/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/contrib/llvm/utils/TableGen/CodeGenDAGPatterns.cpp @@ -17,6 +17,7 @@ #include "llvm/TableGen/Record.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/Twine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include @@ -2483,10 +2484,9 @@ static void InferFromPattern(const CodeGenInstruction &Inst, // If we decided that this is a store from the pattern, then the .td file // entry is redundant. if (MayStore) - fprintf(stderr, - "Warning: mayStore flag explicitly set on instruction '%s'" - " but flag already inferred from pattern.\n", - Inst.TheDef->getName().c_str()); + PrintWarning(Inst.TheDef->getLoc(), + "mayStore flag explicitly set on " + "instruction, but flag already inferred from pattern."); MayStore = true; } @@ -2494,24 +2494,25 @@ static void InferFromPattern(const CodeGenInstruction &Inst, // If we decided that this is a load from the pattern, then the .td file // entry is redundant. if (MayLoad) - fprintf(stderr, - "Warning: mayLoad flag explicitly set on instruction '%s'" - " but flag already inferred from pattern.\n", - Inst.TheDef->getName().c_str()); + PrintWarning(Inst.TheDef->getLoc(), + "mayLoad flag explicitly set on " + "instruction, but flag already inferred from pattern."); MayLoad = true; } if (Inst.neverHasSideEffects) { if (HadPattern) - fprintf(stderr, "Warning: neverHasSideEffects set on instruction '%s' " - "which already has a pattern\n", Inst.TheDef->getName().c_str()); + PrintWarning(Inst.TheDef->getLoc(), + "neverHasSideEffects flag explicitly set on " + "instruction, but flag already inferred from pattern."); HasSideEffects = false; } if (Inst.hasSideEffects) { if (HasSideEffects) - fprintf(stderr, "Warning: hasSideEffects set on instruction '%s' " - "which already inferred this.\n", Inst.TheDef->getName().c_str()); + PrintWarning(Inst.TheDef->getLoc(), + "hasSideEffects flag explicitly set on " + "instruction, but flag already inferred from pattern."); HasSideEffects = true; } diff --git a/contrib/llvm/utils/TableGen/CodeGenRegisters.cpp b/contrib/llvm/utils/TableGen/CodeGenRegisters.cpp index 7ce4f878a3e..45c5bb8b3a5 100644 --- a/contrib/llvm/utils/TableGen/CodeGenRegisters.cpp +++ b/contrib/llvm/utils/TableGen/CodeGenRegisters.cpp @@ -19,6 +19,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/Twine.h" using namespace llvm; @@ -896,11 +897,10 @@ void CodeGenRegBank::computeComposites() { if (i1d->second == Reg3) { // Conflicting composition? Emit a warning but allow it. if (CodeGenSubRegIndex *Prev = Idx1->addComposite(Idx2, i1d->first)) - errs() << "Warning: SubRegIndex " << Idx1->getQualifiedName() - << " and " << Idx2->getQualifiedName() - << " compose ambiguously as " - << Prev->getQualifiedName() << " or " - << i1d->first->getQualifiedName() << "\n"; + PrintWarning(Twine("SubRegIndex") + Idx1->getQualifiedName() + + " and " + Idx2->getQualifiedName() + + " compose ambiguously as " + Prev->getQualifiedName() + + " or " + i1d->first->getQualifiedName()); } } } diff --git a/contrib/llvm/utils/TableGen/EDEmitter.cpp b/contrib/llvm/utils/TableGen/EDEmitter.cpp index 3809a4576a5..fe484ca8cf1 100644 --- a/contrib/llvm/utils/TableGen/EDEmitter.cpp +++ b/contrib/llvm/utils/TableGen/EDEmitter.cpp @@ -594,6 +594,7 @@ static int ARMFlagFromOpName(LiteralConstantEmitter *type, IMM("jtblock_operand"); IMM("nohash_imm"); IMM("p_imm"); + IMM("pf_imm"); IMM("c_imm"); IMM("coproc_option_imm"); IMM("imod_op"); diff --git a/contrib/llvm/utils/TableGen/RegisterInfoEmitter.cpp b/contrib/llvm/utils/TableGen/RegisterInfoEmitter.cpp index a2478a7330e..97fcca3a850 100644 --- a/contrib/llvm/utils/TableGen/RegisterInfoEmitter.cpp +++ b/contrib/llvm/utils/TableGen/RegisterInfoEmitter.cpp @@ -17,22 +17,23 @@ #include "CodeGenTarget.h" #include "CodeGenRegisters.h" #include "SequenceToOffsetTable.h" +#include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" #include "llvm/ADT/BitVector.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/Twine.h" #include "llvm/Support/Format.h" #include #include using namespace llvm; // runEnums - Print out enum values for all of the registers. -void -RegisterInfoEmitter::runEnums(raw_ostream &OS, - CodeGenTarget &Target, CodeGenRegBank &Bank) { +void RegisterInfoEmitter::runEnums(raw_ostream &OS, + CodeGenTarget &Target, CodeGenRegBank &Bank) { const std::vector &Registers = Bank.getRegisters(); - // Register enums are stored as uint16_t in the tables. Make sure we'll fit + // Register enums are stored as uint16_t in the tables. Make sure we'll fit. assert(Registers.size() <= 0xffff && "Too many regs to fit in tables"); std::string Namespace = Registers[0]->TheDef->getValueAsString("Namespace"); @@ -208,8 +209,8 @@ RegisterInfoEmitter::EmitRegMappingTables(raw_ostream &OS, std::vector RegNums = Reg->getValueAsListOfInts("DwarfNumbers"); maxLength = std::max((size_t)maxLength, RegNums.size()); if (DwarfRegNums.count(Reg)) - errs() << "Warning: DWARF numbers for register " << getQualifiedName(Reg) - << "specified multiple times\n"; + PrintWarning(Reg->getLoc(), Twine("DWARF numbers for register ") + + getQualifiedName(Reg) + "specified multiple times"); DwarfRegNums[Reg] = RegNums; } diff --git a/contrib/ncurses/man/curs_threads.3x b/contrib/ncurses/man/curs_threads.3x index 17dabdb7b40..867c4e42815 100644 --- a/contrib/ncurses/man/curs_threads.3x +++ b/contrib/ncurses/man/curs_threads.3x @@ -45,9 +45,9 @@ .br \fBint set_tabsize(int size);\fR .br -\fBint use_screen(SCREEN *scr, NCURSES_WINDOW_CB func, void *data);\fR +\fBint use_screen(SCREEN *scr, NCURSES_SCREEN_CB func, void *data);\fR .br -\fBint use_window(WINDOW *win, NCURSES_SCREEN_CB func, void *data);\fR +\fBint use_window(WINDOW *win, NCURSES_WINDOW_CB func, void *data);\fR .br .SH DESCRIPTION This implementation can be configured to provide rudimentary support diff --git a/contrib/netcat/FREEBSD-vendor b/contrib/netcat/FREEBSD-vendor index f54017524c1..3f3aaed0e16 100644 --- a/contrib/netcat/FREEBSD-vendor +++ b/contrib/netcat/FREEBSD-vendor @@ -1,5 +1,5 @@ # $FreeBSD$ Project: netcat (aka src/usr.bin/nc in OpenBSD) ProjectURL: http://www.openbsd.org/ -Version: 4.7 +Version: 5.1 License: BSD diff --git a/contrib/netcat/nc.1 b/contrib/netcat/nc.1 index 7fe212aa887..eb8cd9fadc2 100644 --- a/contrib/netcat/nc.1 +++ b/contrib/netcat/nc.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: nc.1,v 1.57 2011/01/09 22:16:46 jeremy Exp $ +.\" $OpenBSD: nc.1,v 1.60 2012/02/07 12:11:43 lum Exp $ .\" .\" Copyright (c) 1996 David Sacerdote .\" All rights reserved. @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 8, 2011 +.Dd October 4, 2011 .Dt NC 1 .Os .Sh NAME @@ -45,7 +45,7 @@ .Op Fl P Ar proxy_username .Op Fl p Ar source_port .Op Fl s Ar source -.Op Fl T Ar ToS +.Op Fl T Ar toskeyword .Op Fl V Ar rtable .Op Fl w Ar timeout .Op Fl X Ar proxy_protocol @@ -186,14 +186,21 @@ to create and use so that datagrams can be received. It is an error to use this option in conjunction with the .Fl l option. -.It Fl T Ar ToS -Specifies IP Type of Service (ToS) for the connection. -Valid values are the tokens -.Dq lowdelay , -.Dq throughput , -.Dq reliability , -or an 8-bit hexadecimal value preceded by -.Dq 0x . +.It Fl T Ar toskeyword +Change IPv4 TOS value. +.Ar toskeyword +may be one of +.Ar critical , +.Ar inetcontrol , +.Ar lowdelay , +.Ar netcontrol , +.Ar throughput , +.Ar reliability , +or one of the DiffServ Code Points: +.Ar ef , +.Ar af11 ... af43 , +.Ar cs0 ... cs7 ; +or a number in either hex or decimal. .It Fl t Causes .Nm @@ -227,9 +234,9 @@ Have .Nm give more verbose output. .It Fl w Ar timeout -If a connection and stdin are idle for more than +Connections which cannot be established or are idle timeout after .Ar timeout -seconds, then the connection is silently closed. +seconds. The .Fl w flag has no effect on the @@ -480,8 +487,15 @@ Original implementation by *Hobbit* Rewritten with IPv6 support by .An Eric Jackson Aq ericj@monkey.org . .Sh CAVEATS -UDP port scans will always succeed -(i.e. report the port as open), -rendering the +UDP port scans using the .Fl uz -combination of flags relatively useless. +combination of flags will always report success irrespective of +the target machine's state. +However, +in conjunction with a traffic sniffer either on the target machine +or an intermediary device, +the +.Fl uz +combination could be useful for communications diagnostics. +Note that the amount of UDP traffic generated may be limited either +due to hardware resources and/or configuration settings. diff --git a/contrib/netcat/netcat.c b/contrib/netcat/netcat.c index bee0fa6be2c..d6d507c4051 100644 --- a/contrib/netcat/netcat.c +++ b/contrib/netcat/netcat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: netcat.c,v 1.101 2011/06/21 17:31:07 mikeb Exp $ */ +/* $OpenBSD: netcat.c,v 1.105 2012/02/09 06:25:35 lum Exp $ */ /* * Copyright (c) 2001 Eric Jackson * @@ -107,6 +107,7 @@ void help(void); int local_listen(char *, char *, struct addrinfo); void readwrite(int); int remote_connect(const char *, const char *, struct addrinfo); +int timeout_connect(int, const struct sockaddr *, socklen_t); int socks_connect(const char *, const char *, struct addrinfo, const char *, const char *, struct addrinfo, int, const char *); int udptest(int); @@ -114,7 +115,7 @@ int unix_bind(char *); int unix_connect(char *); int unix_listen(char *); void set_common_sockopts(int); -int parse_iptos(char *); +int map_tos(char *, int *); void usage(int); #ifdef IPSEC @@ -281,7 +282,18 @@ main(int argc, char *argv[]) Sflag = 1; break; case 'T': - Tflag = parse_iptos(optarg); + errstr = NULL; + errno = 0; + if (map_tos(optarg, &Tflag)) + break; + if (strlen(optarg) > 1 && optarg[0] == '0' && + optarg[1] == 'x') + Tflag = (int)strtol(optarg, NULL, 16); + else + Tflag = (int)strtonum(optarg, 0, 255, + &errstr); + if (Tflag < 0 || Tflag > 255 || errstr || errno) + errx(1, "illegal tos value %s", optarg); break; default: usage(1); @@ -633,7 +645,7 @@ remote_connect(const char *host, const char *port, struct addrinfo hints) set_common_sockopts(s); - if (connect(s, res0->ai_addr, res0->ai_addrlen) == 0) + if (timeout_connect(s, res0->ai_addr, res0->ai_addrlen) == 0) break; else if (vflag) warn("connect to %s port %s (%s) failed", host, port, @@ -648,6 +660,43 @@ remote_connect(const char *host, const char *port, struct addrinfo hints) return (s); } +int +timeout_connect(int s, const struct sockaddr *name, socklen_t namelen) +{ + struct pollfd pfd; + socklen_t optlen; + int flags, optval; + int ret; + + if (timeout != -1) { + flags = fcntl(s, F_GETFL, 0); + if (fcntl(s, F_SETFL, flags | O_NONBLOCK) == -1) + err(1, "set non-blocking mode"); + } + + if ((ret = connect(s, name, namelen)) != 0 && errno == EINPROGRESS) { + pfd.fd = s; + pfd.events = POLLOUT; + if ((ret = poll(&pfd, 1, timeout)) == 1) { + optlen = sizeof(optval); + if ((ret = getsockopt(s, SOL_SOCKET, SO_ERROR, + &optval, &optlen)) == 0) { + errno = optval; + ret = optval == 0 ? 0 : -1; + } + } else if (ret == 0) { + errno = ETIMEDOUT; + ret = -1; + } else + err(1, "poll failed"); + } + + if (timeout != -1 && fcntl(s, F_SETFL, flags) == -1) + err(1, "restoring flags"); + + return (ret); +} + /* * local_listen() * Returns a socket listening on a local port, binds to specified source @@ -818,7 +867,7 @@ atelnet(int nfd, unsigned char *buf, unsigned int size) /* * build_ports() - * Build an array or ports in portlist[], listing each port + * Build an array of ports in portlist[], listing each port * that we should try to connect to. */ void @@ -830,9 +879,6 @@ build_ports(char *p) int x = 0; if ((n = strchr(p, '-')) != NULL) { - if (lflag) - errx(1, "Cannot use -l with multiple ports!"); - *n = '\0'; n++; @@ -884,8 +930,7 @@ build_ports(char *p) /* * udptest() * Do a few writes to see if the UDP port is there. - * XXX - Better way of doing this? Doesn't work for IPv6. - * Also fails after around 100 ports checked. + * Fails once PF state table is full. */ int udptest(int s) @@ -946,20 +991,51 @@ set_common_sockopts(int s) } int -parse_iptos(char *s) +map_tos(char *s, int *val) { - int tos = -1; + /* DiffServ Codepoints and other TOS mappings */ + const struct toskeywords { + const char *keyword; + int val; + } *t, toskeywords[] = { + { "af11", IPTOS_DSCP_AF11 }, + { "af12", IPTOS_DSCP_AF12 }, + { "af13", IPTOS_DSCP_AF13 }, + { "af21", IPTOS_DSCP_AF21 }, + { "af22", IPTOS_DSCP_AF22 }, + { "af23", IPTOS_DSCP_AF23 }, + { "af31", IPTOS_DSCP_AF31 }, + { "af32", IPTOS_DSCP_AF32 }, + { "af33", IPTOS_DSCP_AF33 }, + { "af41", IPTOS_DSCP_AF41 }, + { "af42", IPTOS_DSCP_AF42 }, + { "af43", IPTOS_DSCP_AF43 }, + { "critical", IPTOS_PREC_CRITIC_ECP }, + { "cs0", IPTOS_DSCP_CS0 }, + { "cs1", IPTOS_DSCP_CS1 }, + { "cs2", IPTOS_DSCP_CS2 }, + { "cs3", IPTOS_DSCP_CS3 }, + { "cs4", IPTOS_DSCP_CS4 }, + { "cs5", IPTOS_DSCP_CS5 }, + { "cs6", IPTOS_DSCP_CS6 }, + { "cs7", IPTOS_DSCP_CS7 }, + { "ef", IPTOS_DSCP_EF }, + { "inetcontrol", IPTOS_PREC_INTERNETCONTROL }, + { "lowdelay", IPTOS_LOWDELAY }, + { "netcontrol", IPTOS_PREC_NETCONTROL }, + { "reliability", IPTOS_RELIABILITY }, + { "throughput", IPTOS_THROUGHPUT }, + { NULL, -1 }, + }; - if (strcmp(s, "lowdelay") == 0) - return (IPTOS_LOWDELAY); - if (strcmp(s, "throughput") == 0) - return (IPTOS_THROUGHPUT); - if (strcmp(s, "reliability") == 0) - return (IPTOS_RELIABILITY); + for (t = toskeywords; t->keyword != NULL; t++) { + if (strcmp(s, t->keyword) == 0) { + *val = t->val; + return (1); + } + } - if (sscanf(s, "0x%x", &tos) != 1 || tos < 0 || tos > 0xff) - errx(1, "invalid IP Type of Service"); - return (tos); + return (0); } void @@ -990,7 +1066,7 @@ help(void) \t-r Randomize remote ports\n\ \t-S Enable the TCP MD5 signature option\n\ \t-s addr\t Local source address\n\ - \t-T ToS\t Set IP Type of Service\n\ + \t-T toskeyword\tSet IP Type of Service\n\ \t-t Answer TELNET negotiation\n\ \t-U Use UNIX domain socket\n\ \t-u UDP mode\n\ diff --git a/contrib/openpam/CREDITS b/contrib/openpam/CREDITS index a003ac0ad7d..2725d8888cb 100644 --- a/contrib/openpam/CREDITS +++ b/contrib/openpam/CREDITS @@ -16,16 +16,21 @@ ideas: Brian Fundakowski Feldman Christos Zoulas Daniel Richard G. - Darren J. Moffat + Darren J. Moffat Dmitry V. Levin + Don Lewis Emmanuel Dreyfus Eric Melville - Gary Winiger + Gary Winiger + Gleb Smirnoff Hubert Feyrer + Jason Evans Joe Marcus Clarke Juli Mallett Jörg Sonnenberger + Maëlle Lesage Mark Murray + Matthias Drochner Mike Petullo Mikhail Teterin Mikko Työläjärvi @@ -38,4 +43,4 @@ ideas: Wojciech A. Koszek Yar Tikhiy -$Id: CREDITS 498 2011-11-21 16:27:04Z des $ +$Id: CREDITS 587 2012-04-08 11:12:10Z des $ diff --git a/contrib/openpam/HISTORY b/contrib/openpam/HISTORY index 81af9eac5a0..3cc4c96e085 100644 --- a/contrib/openpam/HISTORY +++ b/contrib/openpam/HISTORY @@ -1,3 +1,51 @@ +OpenPAM Micrampelis 2012-05-26 + + - FEATURE: Add an openpam_readword(3) function which reads the next + word from an input stream, applying shell quoting and escaping + rules. Add numerous unit tests for openpam_readword(3). + + - FEATURE: Add an openpam_readlinev(3) function which uses the + openpam_readword(3) function to read words from an input stream one + at a time until it reaches an unquoted, unescaped newline, and + returns an array of those words. Add several unit tests for + openpam_readlinev(3). + + - FEATURE: Add a PAM_HOST item which pam_start(3) initializes to the + machine's hostname. This was implemented in Lycopsida but + inadvertantly left out of the release notes. + + - FEATURE: In pam_get_authtok(3), if neither the application nor the + module have specified a prompt and PAM_HOST and PAM_RHOST are both + defined but not equal, use a different default prompt that includes + PAM_USER and PAM_HOST. + + - ENHANCE: Rewrite the policy parser to used openpam_readlinev(), + which greatly simplifies the code. + + - ENHANCE: The previous implementation of the policy parser relied on + the openpam_readline(3) function, which (by design) munges + whitespace and understands neither quotes nor backslash escapes. + As a result of the aforementioned rewrite, whitespace, quotes and + backslash escapes in policy files are now handled in a consistent + and predictable manner. + + - ENHANCE: On platforms that have it, use fdlopen(3) to load modules. + This closes the race between the ownership / permission check and + the dlopen(3) call. + + - ENHANCE: Reduce the amount of pointless error messages generated + while searching for a module. + + - ENHANCE: Numerous documentation improvements, both in content and + formatting. + + - BUGFIX: A patch incorporated in Lycopsida inadvertantly changed + OpenPAM's behavior when several policies exist for the same + service, from ignoring all but the first to concatenating them all. + Revert to the original behavior. + + - BUGFIX: Plug a memory leak in the policy parser. +============================================================================ OpenPAM Lycopsida 2011-12-18 - ENHANCE: removed static build autodetection, which didn't work @@ -269,7 +317,7 @@ OpenPAM Cinchona 2002-04-08 - ENHANCE: Add openpam_free_data(), a generic cleanup function for pam_set_data() consumers. ============================================================================ -OpenPAM Centaury 2002-03-14 +OpenPAM Centaury 2002-03-14 - BUGFIX: Add missing #include to openpam_log.c. @@ -308,7 +356,7 @@ OpenPAM Celandine 2002-03-05 module with the same version number as the library itself to one with no version number at all. ============================================================================ -OpenPAM Cantaloupe 2002-02-22 +OpenPAM Cantaloupe 2002-02-22 - BUGFIX: The proper use of PAM_SYMBOL_ERR is to indicate an invalid argument to pam_[gs]et_item(3), not to indicate dlsym(3) failures. @@ -338,7 +386,7 @@ OpenPAM Cantaloupe 2002-02-22 - ENHANCE: openpam_get_authtok() now respects the echo_pass, try_first_pass, and use_first_pass options. ============================================================================ -OpenPAM Caliopsis 2002-02-13 +OpenPAM Caliopsis 2002-02-13 Fixed a number of bugs in the previous release, including: - a number of bugs in and related to pam_[gs]et_item(3) @@ -349,8 +397,8 @@ Fixed a number of bugs in the previous release, including: - missing 'continue' in openpam_dispatch.c caused successes to be counted as failures ============================================================================ -OpenPAM Calamite 2002-02-09 +OpenPAM Calamite 2002-02-09 First (beta) release. ============================================================================ -$Id: HISTORY 504 2011-12-18 14:11:12Z des $ +$Id: HISTORY 609 2012-05-26 13:57:45Z des $ diff --git a/contrib/openpam/LICENSE b/contrib/openpam/LICENSE index e6d4325809f..511979487ae 100644 --- a/contrib/openpam/LICENSE +++ b/contrib/openpam/LICENSE @@ -1,6 +1,6 @@ Copyright (c) 2002-2003 Networks Associates Technology, Inc. -Copyright (c) 2004-2011 Dag-Erling Smørgrav +Copyright (c) 2004-2012 Dag-Erling Smørgrav All rights reserved. This software was developed for the FreeBSD Project by ThinkSec AS and @@ -32,4 +32,4 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -$Id: LICENSE 437 2011-09-13 12:00:13Z des $ +$Id: LICENSE 546 2012-03-31 23:13:20Z des $ diff --git a/contrib/openpam/Makefile.am b/contrib/openpam/Makefile.am index 96ed4ea1d78..5c4fbf3f0a2 100644 --- a/contrib/openpam/Makefile.am +++ b/contrib/openpam/Makefile.am @@ -1,4 +1,4 @@ -# $Id: Makefile.am 428 2010-03-09 17:32:17Z des $ +# $Id: Makefile.am 549 2012-04-01 20:38:30Z des $ ACLOCAL_AMFLAGS = -I m4 @@ -8,6 +8,8 @@ if WITH_DOC SUBDIRS += doc endif +SUBDIRS += t + EXTRA_DIST = \ CREDITS \ HISTORY \ diff --git a/contrib/openpam/Makefile.in b/contrib/openpam/Makefile.in index 44624b8672a..3c0c783f46f 100644 --- a/contrib/openpam/Makefile.in +++ b/contrib/openpam/Makefile.in @@ -15,7 +15,7 @@ @SET_MAKE@ -# $Id: Makefile.am 428 2010-03-09 17:32:17Z des $ +# $Id: Makefile.am 549 2012-04-01 20:38:30Z des $ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ @@ -39,8 +39,8 @@ host_triplet = @host@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ - $(top_srcdir)/configure INSTALL config.guess config.sub \ - depcomp install-sh ltmain.sh missing + $(srcdir)/pamgdb.in $(top_srcdir)/configure INSTALL TODO \ + config.guess config.sub depcomp install-sh ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ @@ -49,7 +49,7 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = +CONFIG_CLEAN_FILES = pamgdb CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = @@ -67,7 +67,7 @@ AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags -DIST_SUBDIRS = lib bin modules include doc +DIST_SUBDIRS = lib bin modules include doc t DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -222,7 +222,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = lib bin modules include $(am__append_1) +SUBDIRS = lib bin modules include $(am__append_1) t EXTRA_DIST = \ CREDITS \ HISTORY \ @@ -288,6 +288,8 @@ $(srcdir)/config.h.in: $(am__configure_deps) distclean-hdr: -rm -f config.h stamp-h1 +pamgdb: $(top_builddir)/config.status $(srcdir)/pamgdb.in + cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo diff --git a/contrib/openpam/RELNOTES b/contrib/openpam/RELNOTES index 71f7eb92073..536460158a0 100644 --- a/contrib/openpam/RELNOTES +++ b/contrib/openpam/RELNOTES @@ -1,6 +1,6 @@ - Release notes for OpenPAM Lycopsida - =================================== + Release notes for OpenPAM Micrampelis + ===================================== This release corresponds to the code used in FreeBSD HEAD as of the release date, and is also expected to work on almost any POSIX-like @@ -19,6 +19,9 @@ intended for actual use, but rather to serve as examples for module or application developers. It also includes a command-line application (pamtest) which can be used to test policies and modules. +Unit tests for limited portions of the library can be found in the t +subdirectory. + Please direct bug reports and inquiries to . -$Id: RELNOTES 506 2011-12-18 14:25:12Z des $ +$Id: RELNOTES 609 2012-05-26 13:57:45Z des $ diff --git a/contrib/openpam/TODO b/contrib/openpam/TODO new file mode 100644 index 00000000000..2d0af16aa98 --- /dev/null +++ b/contrib/openpam/TODO @@ -0,0 +1,13 @@ +Before the next release: + + - Complete the transition from PAM_LOG_DEBUG to PAM_LOG_LIBDEBUG. + +Whenever: + + - Implement mechanism to enable / disable optional features. Use it + to disable strict error checking so pamtest and unit tests can do + things that we don't allow in production. + + - Rewrite the module-loading code. + +$Id: TODO 592 2012-04-08 13:19:51Z des $ diff --git a/contrib/openpam/aclocal.m4 b/contrib/openpam/aclocal.m4 index c3aa435a1f1..99ed44a0027 100644 --- a/contrib/openpam/aclocal.m4 +++ b/contrib/openpam/aclocal.m4 @@ -22,8 +22,8 @@ To do so, use the procedure documented by the package, typically `autoreconf'.]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, -# Inc. +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives @@ -32,8 +32,8 @@ To do so, use the procedure documented by the package, typically `autoreconf'.]) m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, -# Inc. +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. @@ -167,6 +167,8 @@ AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl @@ -652,7 +654,7 @@ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. -Copyright (C) 2010 Free Software Foundation, Inc. +Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." @@ -816,6 +818,7 @@ AC_DEFUN([LT_LANG], m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], @@ -837,6 +840,29 @@ m4_defun([_LT_LANG], ])# _LT_LANG +m4_ifndef([AC_PROG_GO], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], @@ -867,6 +893,10 @@ AC_PROVIDE_IFELSE([AC_PROG_GCJ], m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) @@ -969,7 +999,13 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD @@ -977,6 +1013,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ rm -rf libconftest.dylib* rm -f conftest.* fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no @@ -988,6 +1025,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF @@ -1005,7 +1043,9 @@ _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? - if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD @@ -1050,8 +1090,8 @@ _LT_EOF ]) -# _LT_DARWIN_LINKER_FEATURES -# -------------------------- +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ @@ -1062,6 +1102,8 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES], _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi @@ -1345,14 +1387,27 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) CFLAGS="$SAVE_CFLAGS" fi ;; -sparc*-*solaris*) +*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" @@ -1429,13 +1484,13 @@ old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in @@ -1615,6 +1670,11 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=196608 ;; + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not @@ -1654,7 +1714,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. - while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do @@ -2200,7 +2260,7 @@ need_version=unknown case $host_os in aix3*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH @@ -2209,7 +2269,7 @@ aix3*) ;; aix[[4-9]]*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes @@ -2274,7 +2334,7 @@ beos*) ;; bsdi[[45]]*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' @@ -2413,7 +2473,7 @@ m4_if([$1], [],[ ;; dgux*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' @@ -2466,17 +2526,18 @@ freebsd* | dragonfly*) ;; gnu*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" @@ -2537,7 +2598,7 @@ hpux9* | hpux10* | hpux11*) ;; interix[[3-9]]*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' @@ -2553,7 +2614,7 @@ irix5* | irix6* | nonstopux*) nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; @@ -2590,9 +2651,9 @@ linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; -# This must be Linux ELF. +# This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -2655,7 +2716,7 @@ netbsd*) ;; newsos6) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -2724,7 +2785,7 @@ rdos*) ;; solaris*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -2749,7 +2810,7 @@ sunos4*) ;; sysv4 | sysv4.3*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH @@ -2773,7 +2834,7 @@ sysv4 | sysv4.3*) sysv4*MP*) if test -d /usr/nec ;then - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH @@ -2804,7 +2865,7 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -2814,7 +2875,7 @@ tpf*) ;; uts4*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH @@ -3236,7 +3297,7 @@ irix5* | irix6* | nonstopux*) lt_cv_deplibs_check_method=pass_all ;; -# This must be Linux ELF. +# This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; @@ -3656,6 +3717,7 @@ for ac_symprfx in "" "_"; do # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ @@ -4240,7 +4302,9 @@ m4_if([$1], [CXX], [ case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi ;; esac else @@ -4332,18 +4396,33 @@ m4_if([$1], [CXX], [ ;; *) case `$CC -V 2>&1 | sed 5q` in - *Sun\ F* | *Sun*Fortran*) + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; esac ;; esac @@ -4503,7 +4582,9 @@ m4_if([$1], [CXX], [ ;; cygwin* | mingw* | cegcc*) case $cc_basename in - cl*) ;; + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] @@ -4528,7 +4609,6 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported @@ -4779,8 +4859,7 @@ _LT_EOF xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ @@ -5075,6 +5154,7 @@ _LT_EOF # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' @@ -5172,7 +5252,6 @@ _LT_EOF fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes @@ -5614,9 +5693,6 @@ _LT_TAGDECL([], [no_undefined_flag], [1], _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], - [[If ld is used when linking, flag to hardcode $libdir into a binary - during linking. This must work even if $libdir does not exist]]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], @@ -5770,7 +5846,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported @@ -6901,12 +6976,18 @@ public class foo { } }; _LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary @@ -7103,7 +7184,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no @@ -7236,7 +7316,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no @@ -7419,6 +7498,73 @@ CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler @@ -7488,6 +7634,13 @@ dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], @@ -8152,9 +8305,24 @@ dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], - [AS_HELP_STRING([--with-pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [pic_mode="$withval"], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) @@ -8326,15 +8494,15 @@ m4_define([lt_dict_filter], # @configure_input@ -# serial 3293 ltversion.m4 +# serial 3337 ltversion.m4 # This file is part of GNU Libtool -m4_define([LT_PACKAGE_VERSION], [2.4]) -m4_define([LT_PACKAGE_REVISION], [1.3293]) +m4_define([LT_PACKAGE_VERSION], [2.4.2]) +m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4' -macro_revision='1.3293' +[macro_version='2.4.2' +macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) diff --git a/contrib/openpam/bin/Makefile.am b/contrib/openpam/bin/Makefile.am index 78ebeaa5d8e..ec7a99e0600 100644 --- a/contrib/openpam/bin/Makefile.am +++ b/contrib/openpam/bin/Makefile.am @@ -1,6 +1,6 @@ -# $Id: Makefile.am 467 2011-11-02 23:42:21Z des $ +# $Id: Makefile.am 538 2012-03-31 17:04:29Z des $ -SUBDIRS = +SUBDIRS = openpam_dump_policy if WITH_PAMTEST SUBDIRS += pamtest diff --git a/contrib/openpam/bin/Makefile.in b/contrib/openpam/bin/Makefile.in index 4f6089d07d8..3c11bbfa92f 100644 --- a/contrib/openpam/bin/Makefile.in +++ b/contrib/openpam/bin/Makefile.in @@ -15,7 +15,7 @@ @SET_MAKE@ -# $Id: Makefile.am 467 2011-11-02 23:42:21Z des $ +# $Id: Makefile.am 538 2012-03-31 17:04:29Z des $ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ @@ -63,7 +63,7 @@ AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ distdir ETAGS = etags CTAGS = ctags -DIST_SUBDIRS = pamtest su +DIST_SUBDIRS = openpam_dump_policy pamtest su DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ @@ -207,7 +207,7 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUBDIRS = $(am__append_1) $(am__append_2) +SUBDIRS = openpam_dump_policy $(am__append_1) $(am__append_2) all: all-recursive .SUFFIXES: diff --git a/contrib/openpam/bin/openpam_dump_policy/Makefile.am b/contrib/openpam/bin/openpam_dump_policy/Makefile.am new file mode 100644 index 00000000000..a5fda16068b --- /dev/null +++ b/contrib/openpam/bin/openpam_dump_policy/Makefile.am @@ -0,0 +1,7 @@ +# $Id: Makefile.am 538 2012-03-31 17:04:29Z des $ + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/lib + +noinst_PROGRAMS = openpam_dump_policy +openpam_dump_policy_SOURCES = openpam_dump_policy.c +openpam_dump_policy_LDADD = $(top_builddir)/lib/libpam.la diff --git a/contrib/openpam/bin/openpam_dump_policy/Makefile.in b/contrib/openpam/bin/openpam_dump_policy/Makefile.in new file mode 100644 index 00000000000..54f09a49baa --- /dev/null +++ b/contrib/openpam/bin/openpam_dump_policy/Makefile.in @@ -0,0 +1,474 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# $Id: Makefile.am 538 2012-03-31 17:04:29Z des $ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = openpam_dump_policy$(EXEEXT) +subdir = bin/openpam_dump_policy +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_openpam_dump_policy_OBJECTS = openpam_dump_policy.$(OBJEXT) +openpam_dump_policy_OBJECTS = $(am_openpam_dump_policy_OBJECTS) +openpam_dump_policy_DEPENDENCIES = $(top_builddir)/lib/libpam.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(openpam_dump_policy_SOURCES) +DIST_SOURCES = $(openpam_dump_policy_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPT_LIBS = @CRYPT_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DL_LIBS = @DL_LIBS@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_MAJ = @LIB_MAJ@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENPAM_MODULES_DIR = @OPENPAM_MODULES_DIR@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/lib +openpam_dump_policy_SOURCES = openpam_dump_policy.c +openpam_dump_policy_LDADD = $(top_builddir)/lib/libpam.la +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign bin/openpam_dump_policy/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign bin/openpam_dump_policy/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +openpam_dump_policy$(EXEEXT): $(openpam_dump_policy_OBJECTS) $(openpam_dump_policy_DEPENDENCIES) + @rm -f openpam_dump_policy$(EXEEXT) + $(LINK) $(openpam_dump_policy_OBJECTS) $(openpam_dump_policy_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_dump_policy.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/contrib/openpam/bin/openpam_dump_policy/openpam_dump_policy.c b/contrib/openpam/bin/openpam_dump_policy/openpam_dump_policy.c new file mode 100644 index 00000000000..b65dbbd0888 --- /dev/null +++ b/contrib/openpam/bin/openpam_dump_policy/openpam_dump_policy.c @@ -0,0 +1,202 @@ +/*- + * Copyright (c) 2011 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: openpam_dump_policy.c 582 2012-04-06 23:23:35Z des $ + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include + +#include "openpam_impl.h" + +static char * +openpam_chain_name(const char *service, pam_facility_t fclt) +{ + const char *facility = pam_facility_name[fclt]; + char *name; + + if (asprintf(&name, "pam_%s_%s", service, facility) == -1) + return (NULL); + return (name); +} + +static char * +openpam_facility_index_name(pam_facility_t fclt) +{ + const char *facility = pam_facility_name[fclt]; + char *name, *p; + + if (asprintf(&name, "PAM_%s", facility) == -1) + return (NULL); + for (p = name + 4; *p; ++p) + *p = toupper(*p); + return (name); +} + +int +openpam_dump_chain(const char *name, pam_chain_t *chain) +{ + char *modname, **opt, *p; + int i; + + for (i = 0; chain != NULL; ++i, chain = chain->next) { + /* declare the module's struct pam_module */ + modname = strrchr(chain->module->path, '/'); + modname = strdup(modname ? modname : chain->module->path); + if (modname == NULL) + return (PAM_BUF_ERR); + for (p = modname; *p && *p != '.'; ++p) + /* nothing */ ; + *p = '\0'; + printf("extern struct pam_module %s_pam_module;\n", modname); + /* module arguments */ + printf("static char *%s_%d_optv[] = {\n", name, i); + for (opt = chain->optv; *opt; ++opt) { + printf("\t\""); + for (p = *opt; *p; ++p) { + if (isprint((unsigned char)*p) && *p != '"') + printf("%c", *p); + else + printf("\\x%02x", (unsigned char)*p); + } + printf("\",\n"); + } + printf("\tNULL,\n"); + printf("};\n"); + /* next module in chain */ + if (chain->next != NULL) + printf("static pam_chain_t %s_%d;\n", name, i + 1); + /* chain entry */ + printf("static pam_chain_t %s_%d = {\n", name, i); + printf("\t.module = &%s_pam_module,\n", modname); + printf("\t.flag = 0x%08x,\n", chain->flag); + printf("\t.optc = %d,\n", chain->optc); + printf("\t.optv = %s_%d_optv,\n", name, i); + if (chain->next) + printf("\t.next = &%s_%d,\n", name, i + 1); + else + printf("\t.next = NULL,\n"); + printf("};\n"); + free(modname); + } + return (PAM_SUCCESS); +} + +int +openpam_dump_policy(const char *service) +{ + pam_handle_t *pamh; + char *name; + int fclt, ret; + + if ((pamh = calloc(1, sizeof *pamh)) == NULL) + return (PAM_BUF_ERR); + if ((ret = openpam_configure(pamh, service)) != PAM_SUCCESS) + return (ret); + for (fclt = 0; fclt < PAM_NUM_FACILITIES; ++fclt) { + if (pamh->chains[fclt] != NULL) { + if ((name = openpam_chain_name(service, fclt)) == NULL) + return (PAM_BUF_ERR); + ret = openpam_dump_chain(name, pamh->chains[fclt]); + free(name); + if (ret != PAM_SUCCESS) + return (ret); + } + } + printf("static pam_policy_t pam_%s_policy = {\n", service); + printf("\t.service = \"%s\",\n", service); + printf("\t.chains = {\n"); + for (fclt = 0; fclt < PAM_NUM_FACILITIES; ++fclt) { + if ((name = openpam_facility_index_name(fclt)) == NULL) + return (PAM_BUF_ERR); + printf("\t\t[%s] = ", name); + free(name); + if (pamh->chains[fclt] != NULL) { + if ((name = openpam_chain_name(service, fclt)) == NULL) + return (PAM_BUF_ERR); + printf("&%s_0,\n", name); + free(name); + } else { + printf("NULL,\n"); + } + } + printf("\t},\n"); + printf("};\n"); + free(pamh); + return (PAM_SUCCESS); +} + +static void +usage(void) +{ + + fprintf(stderr, "usage: openpam_dump_policy [-d] policy ...\n"); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + int i, opt; + + while ((opt = getopt(argc, argv, "d")) != -1) + switch (opt) { + case 'd': + openpam_debug = 1; + break; + default: + usage(); + } + + argc -= optind; + argv += optind; + + if (argc < 1) + usage(); + + printf("#include \n"); + printf("#include \"openpam_impl.h\"\n"); + for (i = 0; i < argc; ++i) + openpam_dump_policy(argv[i]); + printf("pam_policy_t *pam_embedded_policies[] = {\n"); + for (i = 0; i < argc; ++i) + printf("\t&pam_%s_policy,\n", argv[i]); + printf("\tNULL,\n"); + printf("};\n"); + exit(0); +} diff --git a/contrib/openpam/bin/pamtest/pamtest.1 b/contrib/openpam/bin/pamtest/pamtest.1 index 78e83537c31..5cf2e0c51d9 100644 --- a/contrib/openpam/bin/pamtest/pamtest.1 +++ b/contrib/openpam/bin/pamtest/pamtest.1 @@ -10,6 +10,9 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior written +.\" permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -23,9 +26,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: pamtest.1 471 2011-11-03 09:44:40Z des $ +.\" $Id: pamtest.1 610 2012-05-26 14:03:45Z des $ .\" -.Dd November 2, 2011 +.Dd May 26, 2012 .Dt PAMTEST 1 .Os .Sh NAME @@ -33,7 +36,7 @@ .Nd PAM policy tester .Sh SYNOPSYS .Nm -.Op Fl dksv +.Op Fl dkMPsv .Op Fl H Ar rhost .Op Fl h Ar host .Op Fl t Ar tty @@ -116,6 +119,11 @@ The default is to use the result of calling .Xr gethostname 3 . .It Fl k Keep going even if one of the commands fails. +.It Fl M +Disable path, ownership and permission checks on module files. +.It Fl P +Disable service name validation and path, ownership and permission +checks on policy files. .It Fl s Set the .Dv PAM_SILENT @@ -149,14 +157,14 @@ policy: pamtest -v system auth account change setcred open close unsetcred .Ed .Sh SEE ALSO -.Xr openpam 3 -.Xr pam 3 +.Xr openpam 3 , +.Xr pam 3 , .Xr pam.conf 5 .Sh AUTHORS The .Nm utility and this manual page were written by -.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org . +.An Dag-Erling Sm\(/orgrav Aq des@des.no . .Sh BUGS The .Nm diff --git a/contrib/openpam/bin/pamtest/pamtest.c b/contrib/openpam/bin/pamtest/pamtest.c index 0addfad9a13..bfc612e72c1 100644 --- a/contrib/openpam/bin/pamtest/pamtest.c +++ b/contrib/openpam/bin/pamtest/pamtest.c @@ -11,6 +11,9 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -24,7 +27,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: pamtest.c 472 2011-11-03 09:46:52Z des $ + * $Id: pamtest.c 595 2012-04-14 14:28:35Z des $ */ #ifdef HAVE_CONFIG_H @@ -261,8 +264,8 @@ static void usage(void) { - fprintf(stderr, "usage: pamtest [-dksv] %s\n", - "[-H rhost] [-h host] [-t tty] [-U ruser] [-u user] service"); + fprintf(stderr, "usage: pamtest %s service command ...\n", + "[-dkMPsv] [-H rhost] [-h host] [-t tty] [-U ruser] [-u user]"); exit(1); } @@ -297,7 +300,7 @@ main(int argc, char *argv[]) int pame; int opt; - while ((opt = getopt(argc, argv, "dH:h:kst:U:u:v")) != -1) + while ((opt = getopt(argc, argv, "dH:h:kMPst:U:u:v")) != -1) switch (opt) { case 'd': openpam_debug++; @@ -311,6 +314,14 @@ main(int argc, char *argv[]) case 'k': keepatit = 1; break; + case 'M': + openpam_set_feature(OPENPAM_RESTRICT_MODULE_NAME, 0); + openpam_set_feature(OPENPAM_VERIFY_MODULE_FILE, 0); + break; + case 'P': + openpam_set_feature(OPENPAM_RESTRICT_SERVICE_NAME, 0); + openpam_set_feature(OPENPAM_VERIFY_POLICY_FILE, 0); + break; case 's': silent = PAM_SILENT; break; diff --git a/contrib/openpam/bin/su/su.1 b/contrib/openpam/bin/su/su.1 index 9a67ea3fec6..2dc11bbb1b2 100644 --- a/contrib/openpam/bin/su/su.1 +++ b/contrib/openpam/bin/su/su.1 @@ -10,6 +10,9 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior written +.\" permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -23,9 +26,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: su.1 458 2011-11-02 13:10:25Z des $ +.\" $Id: su.1 610 2012-05-26 14:03:45Z des $ .\" -.Dd November 2, 2011 +.Dd May 26, 2012 .Dt SU 1 .Os .Sh NAME @@ -53,10 +56,10 @@ The utility is provided with the OpenPAM library as a sample application and should not be used in production systems. .Sh SEE ALSO -.Xr openpam 3 +.Xr openpam 3 , .Xr pam 3 .Sh AUTHORS The .Nm utility and this manual page were written by -.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org . +.An Dag-Erling Sm\(/orgrav Aq des@des.no . diff --git a/contrib/openpam/config.h.in b/contrib/openpam/config.h.in index 3d16ce8e8df..69f703ca255 100644 --- a/contrib/openpam/config.h.in +++ b/contrib/openpam/config.h.in @@ -9,6 +9,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H +/* Define to 1 if you have the `fdlopen' function. */ +#undef HAVE_FDLOPEN + /* Define to 1 if you have the `fpurge' function. */ #undef HAVE_FPURGE @@ -36,6 +39,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H +/* Define to 1 if you have the `strlcat' function. */ +#undef HAVE_STRLCAT + /* Define to 1 if you have the `strlcmp' function. */ #undef HAVE_STRLCMP diff --git a/contrib/openpam/configure b/contrib/openpam/configure index fe13a93697a..5348d3f5a08 100755 --- a/contrib/openpam/configure +++ b/contrib/openpam/configure @@ -1,7 +1,7 @@ #! /bin/sh -# From configure.ac Id: configure.ac 507 2011-12-18 14:43:40Z des . +# From configure.ac Id: configure.ac 610 2012-05-26 14:03:45Z des . # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for OpenPAM 20111218. +# Generated by GNU Autoconf 2.68 for OpenPAM 20120526. # # Report bugs to . # @@ -570,8 +570,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='OpenPAM' PACKAGE_TARNAME='openpam' -PACKAGE_VERSION='20111218' -PACKAGE_STRING='OpenPAM 20111218' +PACKAGE_VERSION='20120526' +PACKAGE_STRING='OpenPAM 20120526' PACKAGE_BUGREPORT='des@des.no' PACKAGE_URL='' @@ -1308,7 +1308,7 @@ if test "$ac_init_help" = "long"; then # 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 <<_ACEOF -\`configure' configures OpenPAM 20111218 to adapt to many kinds of systems. +\`configure' configures OpenPAM 20120526 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1378,7 +1378,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of OpenPAM 20111218:";; + short | recursive ) echo "Configuration of OpenPAM 20120526:";; esac cat <<\_ACEOF @@ -1405,7 +1405,7 @@ Optional Features: Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic try to use only PIC/non-PIC objects [default=use + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR @@ -1492,7 +1492,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -OpenPAM configure 20111218 +OpenPAM configure 20120526 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. @@ -1861,7 +1861,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by OpenPAM $as_me 20111218, which was +It was created by OpenPAM $as_me 20120526, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -2678,7 +2678,7 @@ fi # Define the identity of the package. PACKAGE='openpam' - VERSION='20111218' + VERSION='20120526' cat >>confdefs.h <<_ACEOF @@ -4631,8 +4631,8 @@ esac -macro_version='2.4' -macro_revision='1.3293' +macro_version='2.4.2' +macro_revision='1.3337' @@ -5347,6 +5347,11 @@ else lt_cv_sys_max_cmd_len=196608 ;; + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not @@ -5386,7 +5391,7 @@ else # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. - while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do @@ -5815,7 +5820,7 @@ irix5* | irix6* | nonstopux*) lt_cv_deplibs_check_method=pass_all ;; -# This must be Linux ELF. +# This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; @@ -6455,13 +6460,13 @@ old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in @@ -6608,6 +6613,7 @@ for ac_symprfx in "" "_"; do # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ @@ -6996,7 +7002,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; } CFLAGS="$SAVE_CFLAGS" fi ;; -sparc*-*solaris*) +*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 @@ -7007,7 +7013,20 @@ sparc*-*solaris*) case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" @@ -7647,7 +7666,13 @@ else $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 @@ -7658,6 +7683,7 @@ else fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : @@ -7690,6 +7716,7 @@ rm -f core conftest.err conftest.$ac_objext \ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : @@ -7711,7 +7738,9 @@ _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? - if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 @@ -7847,7 +7876,22 @@ fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : - withval=$with_pic; pic_mode="$withval" + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac else pic_mode=default fi @@ -7920,6 +7964,10 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + @@ -8380,7 +8428,9 @@ lt_prog_compiler_static= case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' - lt_prog_compiler_pic='-Xcompiler -fPIC' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi ;; esac else @@ -8471,18 +8521,33 @@ lt_prog_compiler_static= ;; *) case `$CC -V 2>&1 | sed 5q` in - *Sun\ F* | *Sun*Fortran*) + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; esac ;; esac @@ -8844,7 +8909,6 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported @@ -9094,8 +9158,7 @@ _LT_EOF xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld='-rpath $libdir' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ @@ -9474,6 +9537,7 @@ fi # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' @@ -9519,6 +9583,7 @@ fi hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + else whole_archive_flag_spec='' fi @@ -9598,7 +9663,6 @@ fi fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes @@ -10216,11 +10280,6 @@ esac - - - - - @@ -10316,7 +10375,7 @@ need_version=unknown case $host_os in aix3*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH @@ -10325,7 +10384,7 @@ aix3*) ;; aix[4-9]*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes @@ -10390,7 +10449,7 @@ beos*) ;; bsdi[45]*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' @@ -10529,7 +10588,7 @@ darwin* | rhapsody*) ;; dgux*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' @@ -10582,17 +10641,18 @@ freebsd* | dragonfly*) ;; gnu*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" @@ -10653,7 +10713,7 @@ hpux9* | hpux10* | hpux11*) ;; interix[3-9]*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' @@ -10669,7 +10729,7 @@ irix5* | irix6* | nonstopux*) nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; @@ -10706,9 +10766,9 @@ linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; -# This must be Linux ELF. +# This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -10790,7 +10850,7 @@ netbsd*) ;; newsos6) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -10859,7 +10919,7 @@ rdos*) ;; solaris*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -10884,7 +10944,7 @@ sunos4*) ;; sysv4 | sysv4.3*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH @@ -10908,7 +10968,7 @@ sysv4 | sysv4.3*) sysv4*MP*) if test -d /usr/nec ;then - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH @@ -10939,7 +10999,7 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -10949,7 +11009,7 @@ tpf*) ;; uts4*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH @@ -11731,6 +11791,8 @@ CC="$lt_save_CC" + + ac_config_commands="$ac_config_commands libtool" @@ -11875,7 +11937,7 @@ fi done -for ac_func in fpurge strlcmp strlcpy +for ac_func in fdlopen fpurge strlcat strlcmp strlcpy do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" @@ -12006,7 +12068,9 @@ if test "${enable_werror+set}" = set; then : fi -ac_config_files="$ac_config_files bin/Makefile bin/pamtest/Makefile bin/su/Makefile include/Makefile include/security/Makefile lib/Makefile modules/Makefile modules/pam_unix/Makefile modules/pam_deny/Makefile modules/pam_permit/Makefile doc/Makefile doc/man/Makefile Makefile" +ac_config_files="$ac_config_files Makefile bin/Makefile bin/openpam_dump_policy/Makefile bin/pamtest/Makefile bin/su/Makefile doc/Makefile doc/man/Makefile include/Makefile include/security/Makefile lib/Makefile modules/Makefile modules/pam_deny/Makefile modules/pam_permit/Makefile modules/pam_unix/Makefile t/Makefile" + +ac_config_files="$ac_config_files pamgdb" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -12558,7 +12622,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by OpenPAM $as_me 20111218, which was +This file was extended by OpenPAM $as_me 20120526, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12624,7 +12688,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -OpenPAM config.status 20111218 +OpenPAM config.status 20120526 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" @@ -12761,6 +12825,7 @@ pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' @@ -12843,7 +12908,6 @@ with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' @@ -12899,6 +12963,7 @@ _LTECHO_EOF' # Quote evaled strings. for var in SHELL \ ECHO \ +PATH_SEPARATOR \ SED \ GREP \ EGREP \ @@ -12949,7 +13014,6 @@ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ -hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ @@ -13033,19 +13097,22 @@ do "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "bin/Makefile") CONFIG_FILES="$CONFIG_FILES bin/Makefile" ;; + "bin/openpam_dump_policy/Makefile") CONFIG_FILES="$CONFIG_FILES bin/openpam_dump_policy/Makefile" ;; "bin/pamtest/Makefile") CONFIG_FILES="$CONFIG_FILES bin/pamtest/Makefile" ;; "bin/su/Makefile") CONFIG_FILES="$CONFIG_FILES bin/su/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "doc/man/Makefile") CONFIG_FILES="$CONFIG_FILES doc/man/Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "include/security/Makefile") CONFIG_FILES="$CONFIG_FILES include/security/Makefile" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "modules/Makefile") CONFIG_FILES="$CONFIG_FILES modules/Makefile" ;; - "modules/pam_unix/Makefile") CONFIG_FILES="$CONFIG_FILES modules/pam_unix/Makefile" ;; "modules/pam_deny/Makefile") CONFIG_FILES="$CONFIG_FILES modules/pam_deny/Makefile" ;; "modules/pam_permit/Makefile") CONFIG_FILES="$CONFIG_FILES modules/pam_permit/Makefile" ;; - "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; - "doc/man/Makefile") CONFIG_FILES="$CONFIG_FILES doc/man/Makefile" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "modules/pam_unix/Makefile") CONFIG_FILES="$CONFIG_FILES modules/pam_unix/Makefile" ;; + "t/Makefile") CONFIG_FILES="$CONFIG_FILES t/Makefile" ;; + "pamgdb") CONFIG_FILES="$CONFIG_FILES pamgdb" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac @@ -13757,8 +13824,8 @@ $as_echo X"$file" | # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, -# Inc. +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. @@ -13812,6 +13879,9 @@ SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + # The host system. host_alias=$host_alias host=$host @@ -14113,10 +14183,6 @@ no_undefined_flag=$lt_no_undefined_flag # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec -# If ld is used when linking, flag to hardcode \$libdir into a binary -# during linking. This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld - # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator @@ -14367,6 +14433,7 @@ fi chmod +x "$ofile" ;; + "pamgdb":F) chmod +x pamgdb ;; esac done # for ac_tag diff --git a/contrib/openpam/configure.ac b/contrib/openpam/configure.ac index a7453b994a4..fb30726a4d1 100644 --- a/contrib/openpam/configure.ac +++ b/contrib/openpam/configure.ac @@ -1,8 +1,8 @@ -dnl $Id: configure.ac 507 2011-12-18 14:43:40Z des $ +dnl $Id: configure.ac 610 2012-05-26 14:03:45Z des $ AC_PREREQ([2.62]) -AC_REVISION([$Id: configure.ac 507 2011-12-18 14:43:40Z des $]) -AC_INIT([OpenPAM], [20111218], [des@des.no]) +AC_REVISION([$Id: configure.ac 610 2012-05-26 14:03:45Z des $]) +AC_INIT([OpenPAM], [20120526], [des@des.no]) AC_CONFIG_SRCDIR([lib/pam_start.c]) AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE([foreign]) @@ -83,7 +83,7 @@ AM_CONDITIONAL([WITH_SU], [test x"$with_su" = x"yes"]) AC_CHECK_HEADERS([crypt.h]) -AC_CHECK_FUNCS([fpurge strlcmp strlcpy]) +AC_CHECK_FUNCS([fdlopen fpurge strlcat strlcmp strlcpy]) saved_LIBS="${LIBS}" LIBS="" @@ -110,18 +110,21 @@ AC_ARG_ENABLE([werror], [CFLAGS="${CFLAGS} -Werror"]) AC_CONFIG_FILES([ + Makefile bin/Makefile + bin/openpam_dump_policy/Makefile bin/pamtest/Makefile bin/su/Makefile + doc/Makefile + doc/man/Makefile include/Makefile include/security/Makefile lib/Makefile modules/Makefile - modules/pam_unix/Makefile modules/pam_deny/Makefile modules/pam_permit/Makefile - doc/Makefile - doc/man/Makefile - Makefile + modules/pam_unix/Makefile + t/Makefile ]) +AC_CONFIG_FILES([pamgdb],[chmod +x pamgdb]) AC_OUTPUT diff --git a/contrib/openpam/doc/man/Makefile.am b/contrib/openpam/doc/man/Makefile.am index 3d1b94bb87b..4062a54d54f 100644 --- a/contrib/openpam/doc/man/Makefile.am +++ b/contrib/openpam/doc/man/Makefile.am @@ -1,4 +1,4 @@ -# $Id: Makefile.am 455 2011-10-29 18:31:11Z des $ +# $Id: Makefile.am 594 2012-04-14 14:18:41Z des $ NULL = @@ -38,12 +38,17 @@ OMAN = \ openpam_borrow_cred.3 \ openpam_free_data.3 \ openpam_free_envlist.3 \ + openpam_get_feature.3 \ openpam_get_option.3 \ openpam_log.3 \ openpam_nullconv.3 \ openpam_readline.3 \ + openpam_readlinev.3 \ + openpam_readword.3 \ openpam_restore_cred.3 \ + openpam_set_feature.3 \ openpam_set_option.3 \ + openpam_straddch.3 \ openpam_subst.3 \ openpam_ttyconv.3 \ pam_error.3 \ @@ -68,17 +73,17 @@ CLEANFILES = $(ALLCMAN) openpam.3 pam.3 GENDOC = $(top_srcdir)/misc/gendoc.pl -SRCDIR = $(top_srcdir)/lib +LIBSRCDIR = $(top_srcdir)/lib -VPATH = $(SRCDIR) +VPATH = $(LIBSRCDIR) $(srcdir) SUFFIXES = .3 .c.3: $(GENDOC) perl -w $(GENDOC) $< -openpam.3: $(OMAN) $(GENDOC) openpam.man +openpam.3: $(OMAN) $(GENDOC) $(srcdir)/openpam.man perl -w $(GENDOC) -o $(abs_srcdir)/$(OMAN) <$(srcdir)/openpam.man -pam.3: $(PMAN) $(GENDOC) pam.man +pam.3: $(PMAN) $(GENDOC) $(srcdir)/pam.man perl -w $(GENDOC) -p $(abs_srcdir)/$(PMAN) <$(srcdir)/pam.man diff --git a/contrib/openpam/doc/man/Makefile.in b/contrib/openpam/doc/man/Makefile.in index 91c9febf600..298304d0ec4 100644 --- a/contrib/openpam/doc/man/Makefile.in +++ b/contrib/openpam/doc/man/Makefile.in @@ -15,7 +15,7 @@ @SET_MAKE@ -# $Id: Makefile.am 455 2011-10-29 18:31:11Z des $ +# $Id: Makefile.am 594 2012-04-14 14:18:41Z des $ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -74,7 +74,7 @@ man5dir = $(mandir)/man5 NROFF = nroff MANS = $(dist_man3_MANS) $(dist_man5_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -VPATH = $(SRCDIR) +VPATH = $(LIBSRCDIR) $(srcdir) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ @@ -232,12 +232,17 @@ OMAN = \ openpam_borrow_cred.3 \ openpam_free_data.3 \ openpam_free_envlist.3 \ + openpam_get_feature.3 \ openpam_get_option.3 \ openpam_log.3 \ openpam_nullconv.3 \ openpam_readline.3 \ + openpam_readlinev.3 \ + openpam_readword.3 \ openpam_restore_cred.3 \ + openpam_set_feature.3 \ openpam_set_option.3 \ + openpam_straddch.3 \ openpam_subst.3 \ openpam_ttyconv.3 \ pam_error.3 \ @@ -256,7 +261,7 @@ dist_man3_MANS = $(ALLCMAN) openpam.3 pam.3 pam_conv.3 dist_man5_MANS = pam.conf.5 CLEANFILES = $(ALLCMAN) openpam.3 pam.3 GENDOC = $(top_srcdir)/misc/gendoc.pl -SRCDIR = $(top_srcdir)/lib +LIBSRCDIR = $(top_srcdir)/lib SUFFIXES = .3 all: all-am @@ -536,10 +541,10 @@ uninstall-man: uninstall-man3 uninstall-man5 .c.3: $(GENDOC) perl -w $(GENDOC) $< -openpam.3: $(OMAN) $(GENDOC) openpam.man +openpam.3: $(OMAN) $(GENDOC) $(srcdir)/openpam.man perl -w $(GENDOC) -o $(abs_srcdir)/$(OMAN) <$(srcdir)/openpam.man -pam.3: $(PMAN) $(GENDOC) pam.man +pam.3: $(PMAN) $(GENDOC) $(srcdir)/pam.man perl -w $(GENDOC) -p $(abs_srcdir)/$(PMAN) <$(srcdir)/pam.man # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/contrib/openpam/doc/man/openpam.3 b/contrib/openpam/doc/man/openpam.3 index c04a2aa9671..a3ff7fc6ce2 100644 --- a/contrib/openpam/doc/man/openpam.3 +++ b/contrib/openpam/doc/man/openpam.3 @@ -34,19 +34,24 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt OPENPAM 3 .Os .Sh NAME .Nm openpam_borrow_cred , .Nm openpam_free_data , .Nm openpam_free_envlist , +.Nm openpam_get_feature , .Nm openpam_get_option , .Nm openpam_log , .Nm openpam_nullconv , .Nm openpam_readline , +.Nm openpam_readlinev , +.Nm openpam_readword , .Nm openpam_restore_cred , +.Nm openpam_set_feature , .Nm openpam_set_option , +.Nm openpam_straddch , .Nm openpam_subst , .Nm openpam_ttyconv , .Nm pam_error , @@ -68,6 +73,8 @@ .Fn openpam_free_data "pam_handle_t *pamh" "void *data" "int status" .Ft "void" .Fn openpam_free_envlist "char **envlist" +.Ft "int" +.Fn openpam_get_feature "int feature" "int *onoff" .Ft "const char *" .Fn openpam_get_option "pam_handle_t *pamh" "const char *option" .Ft "void" @@ -76,11 +83,19 @@ .Fn openpam_nullconv "int n" "const struct pam_message **msg" "struct pam_response **resp" "void *data" .Ft "char *" .Fn openpam_readline "FILE *f" "int *lineno" "size_t *lenp" +.Ft "char **" +.Fn openpam_readlinev "FILE *f" "int *lineno" "int *lenp" +.Ft "char *" +.Fn openpam_readword "FILE *f" "int *lineno" "size_t *lenp" .Ft "int" .Fn openpam_restore_cred "pam_handle_t *pamh" .Ft "int" +.Fn openpam_set_feature "int feature" "int onoff" +.Ft "int" .Fn openpam_set_option "pam_handle_t *pamh" "const char *option" "const char *value" .Ft "int" +.Fn openpam_straddch "char **str" "size_t *size" "size_t *len" "int ch" +.Ft "int" .Fn openpam_subst "const pam_handle_t *pamh" "char *buf" "size_t *bufsize" "const char *template" .Ft "int" .Fn openpam_ttyconv "int n" "const struct pam_message **msg" "struct pam_response **resp" "void *data" @@ -117,12 +132,17 @@ standardization. .Xr openpam_borrow_cred 3 , .Xr openpam_free_data 3 , .Xr openpam_free_envlist 3 , +.Xr openpam_get_feature 3 , .Xr openpam_get_option 3 , .Xr openpam_log 3 , .Xr openpam_nullconv 3 , .Xr openpam_readline 3 , +.Xr openpam_readlinev 3 , +.Xr openpam_readword 3 , .Xr openpam_restore_cred 3 , +.Xr openpam_set_feature 3 , .Xr openpam_set_option 3 , +.Xr openpam_straddch 3 , .Xr openpam_subst 3 , .Xr openpam_ttyconv 3 , .Xr pam_error 3 , @@ -146,3 +166,6 @@ Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , as part of the DARPA CHATS research program. +.Pp +The OpenPAM library is maintained by +.An Dag-Erling Sm\(/orgrav Aq des@des.no . diff --git a/contrib/openpam/doc/man/openpam_borrow_cred.3 b/contrib/openpam/doc/man/openpam_borrow_cred.3 index 25780dba447..dd05b4430ce 100644 --- a/contrib/openpam/doc/man/openpam_borrow_cred.3 +++ b/contrib/openpam/doc/man/openpam_borrow_cred.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt OPENPAM_BORROW_CRED 3 .Os .Sh NAME @@ -50,7 +50,7 @@ .Fn openpam_borrow_cred "pam_handle_t *pamh" "const struct passwd *pwd" .Sh DESCRIPTION The -.Nm +.Fn openpam_borrow_cred function saves the current credentials and switches to those of the user specified by its .Fa pwd @@ -62,7 +62,7 @@ The original credentials can be restored using .Pp .Sh RETURN VALUES The -.Nm +.Fn openpam_borrow_cred function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -81,15 +81,15 @@ System error. .Xr pam_strerror 3 .Sh STANDARDS The -.Nm +.Fn openpam_borrow_cred function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn openpam_borrow_cred +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/openpam_free_data.3 b/contrib/openpam/doc/man/openpam_free_data.3 index b32a3457074..4d9e0eeed06 100644 --- a/contrib/openpam/doc/man/openpam_free_data.3 +++ b/contrib/openpam/doc/man/openpam_free_data.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt OPENPAM_FREE_DATA 3 .Os .Sh NAME @@ -50,7 +50,7 @@ .Fn openpam_free_data "pam_handle_t *pamh" "void *data" "int status" .Sh DESCRIPTION The -.Nm +.Fn openpam_free_data function is a cleanup function suitable for passing to .Xr pam_set_data 3 . @@ -64,15 +64,15 @@ argument to .Xr pam_set_data 3 .Sh STANDARDS The -.Nm +.Fn openpam_free_data function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn openpam_free_data +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/openpam_free_envlist.3 b/contrib/openpam/doc/man/openpam_free_envlist.3 index 0c1976a9129..cf8c585539d 100644 --- a/contrib/openpam/doc/man/openpam_free_envlist.3 +++ b/contrib/openpam/doc/man/openpam_free_envlist.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt OPENPAM_FREE_ENVLIST 3 .Os .Sh NAME @@ -50,7 +50,7 @@ .Fn openpam_free_envlist "char **envlist" .Sh DESCRIPTION The -.Nm +.Fn openpam_free_envlist function is a convenience function which frees all the environment variables in an environment list, and the list itself. @@ -62,12 +62,11 @@ It is suitable for freeing the return value from .Xr pam_getenvlist 3 .Sh STANDARDS The -.Nm +.Fn openpam_free_envlist function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the -.Fx -Project by -.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org . +.Fn openpam_free_envlist +function and this manual page were +developed by +.An Dag-Erling Sm\(/orgrav Aq des@des.no . diff --git a/contrib/openpam/doc/man/openpam_get_feature.3 b/contrib/openpam/doc/man/openpam_get_feature.3 new file mode 100644 index 00000000000..e63ef0cd6af --- /dev/null +++ b/contrib/openpam/doc/man/openpam_get_feature.3 @@ -0,0 +1,105 @@ +.\"- +.\" Copyright (c) 2001-2003 Networks Associates Technology, Inc. +.\" Copyright (c) 2004-2011 Dag-Erling Smørgrav +.\" All rights reserved. +.\" +.\" This software was developed for the FreeBSD Project by ThinkSec AS and +.\" Network Associates Laboratories, the Security Research Division of +.\" Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 +.\" ("CBOSS"), as part of the DARPA CHATS research program. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior written +.\" permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id$ +.\" +.Dd May 26, 2012 +.Dt OPENPAM_GET_FEATURE 3 +.Os +.Sh NAME +.Nm openpam_get_feature +.Nd query the state of an optional feature +.Sh LIBRARY +.Lb libpam +.Sh SYNOPSIS +.In sys/types.h +.In security/pam_appl.h +.In security/openpam.h +.Ft "int" +.Fn openpam_get_feature "int feature" "int *onoff" +.Sh DESCRIPTION +.Bf Sy +This function is experimental and may be modified or removed in a future release without further warning. +.Ef +.Pp +The +.Fn openpam_get_feature +function stores the current state of the +specified feature in the variable pointed to by its +.Fa onoff +argument. +.Pp +The following features are recognized: +.Bl -tag -width 18n +.It Dv OPENPAM_RESTRICT_SERVICE_NAME +Disallow path separators in service names. +This feature is enabled by default. +Disabling it allows the application to specify the path to +the desired policy file directly. +.It Dv OPENPAM_VERIFY_POLICY_FILE +Verify the ownership and permissions of the policy file +and the path leading up to it. +This feature is enabled by default. +.It Dv OPENPAM_RESTRICT_MODULE_NAME +Disallow path separators in module names. +This feature is disabled by default. +Enabling it prevents the use of modules in non-standard +locations. +.It Dv OPENPAM_VERIFY_MODULE_FILE +Verify the ownership and permissions of each loadable +module and the path leading up to it. +This feature is enabled by default. +.El +.Sh RETURN VALUES +The +.Fn openpam_get_feature +function returns one of the following values: +.Bl -tag -width 18n +.It Bq Er PAM_SYMBOL_ERR +Invalid symbol. +.El +.Sh SEE ALSO +.Xr openpam_set_feature 3 , +.Xr pam 3 , +.Xr pam_strerror 3 +.Sh STANDARDS +The +.Fn openpam_get_feature +function is an OpenPAM extension. +.Sh AUTHORS +The +.Fn openpam_get_feature +function and this manual page were +developed by +.An Dag-Erling Sm\(/orgrav Aq des@des.no . diff --git a/contrib/openpam/doc/man/openpam_get_option.3 b/contrib/openpam/doc/man/openpam_get_option.3 index d6566129692..68a6b2e7775 100644 --- a/contrib/openpam/doc/man/openpam_get_option.3 +++ b/contrib/openpam/doc/man/openpam_get_option.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt OPENPAM_GET_OPTION 3 .Os .Sh NAME @@ -50,7 +50,7 @@ .Fn openpam_get_option "pam_handle_t *pamh" "const char *option" .Sh DESCRIPTION The -.Nm +.Fn openpam_get_option function returns the value of the specified option in the context of the currently executing service module, or .Dv NULL @@ -58,7 +58,7 @@ if the option is not set or no module is currently executing. .Pp .Sh RETURN VALUES The -.Nm +.Fn openpam_get_option function returns .Dv NULL on failure. @@ -67,15 +67,15 @@ on failure. .Xr pam 3 .Sh STANDARDS The -.Nm +.Fn openpam_get_option function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn openpam_get_option +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/openpam_log.3 b/contrib/openpam/doc/man/openpam_log.3 index adfc0061a86..e5e3192c8ae 100644 --- a/contrib/openpam/doc/man/openpam_log.3 +++ b/contrib/openpam/doc/man/openpam_log.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt OPENPAM_LOG 3 .Os .Sh NAME @@ -50,7 +50,7 @@ .Fn openpam_log "int level" "const char *fmt" "..." .Sh DESCRIPTION The -.Nm +.Fn openpam_log function logs messages using .Xr syslog 3 . It is primarily intended for internal use by the library and modules. @@ -60,6 +60,9 @@ The argument indicates the importance of the message. The following levels are defined: .Bl -tag -width 18n +.It Dv PAM_LOG_LIBDEBUG +Debugging messages. +For internal use only. .It Dv PAM_LOG_DEBUG Debugging messages. These messages are normally not logged unless the global @@ -101,15 +104,15 @@ corresponding arguments. .Xr syslog 3 .Sh STANDARDS The -.Nm +.Fn openpam_log function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn openpam_log +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/openpam_nullconv.3 b/contrib/openpam/doc/man/openpam_nullconv.3 index 1873cba2ee3..f5194d38fff 100644 --- a/contrib/openpam/doc/man/openpam_nullconv.3 +++ b/contrib/openpam/doc/man/openpam_nullconv.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt OPENPAM_NULLCONV 3 .Os .Sh NAME @@ -50,7 +50,7 @@ .Fn openpam_nullconv "int n" "const struct pam_message **msg" "struct pam_response **resp" "void *data" .Sh DESCRIPTION The -.Nm +.Fn openpam_nullconv function is a null conversation function suitable for applications that want to use PAM but don't support interactive dialog with the user. @@ -71,7 +71,7 @@ try to query the user. .Pp .Sh RETURN VALUES The -.Nm +.Fn openpam_nullconv function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_CONV_ERR @@ -88,15 +88,15 @@ Conversation failure. .Xr pam_vprompt 3 .Sh STANDARDS The -.Nm +.Fn openpam_nullconv function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn openpam_nullconv +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/openpam_readline.3 b/contrib/openpam/doc/man/openpam_readline.3 index cf7ab47f53f..32dd55b19f4 100644 --- a/contrib/openpam/doc/man/openpam_readline.3 +++ b/contrib/openpam/doc/man/openpam_readline.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt OPENPAM_READLINE 3 .Os .Sh NAME @@ -44,27 +44,32 @@ .Lb libpam .Sh SYNOPSIS .In sys/types.h +.In stdio.h .In security/pam_appl.h .In security/openpam.h .Ft "char *" .Fn openpam_readline "FILE *f" "int *lineno" "size_t *lenp" .Sh DESCRIPTION +.Bf Sy +This function is deprecated and may be removed in a future release without further warning. The -.Nm +.Fn openpam_readlinev +function may be used to achieve similar results. +.Ef +.Pp +The +.Fn openpam_readline function reads a line from a file, and returns it in a NUL-terminated buffer allocated with .Xr malloc 3 . .Pp The -.Nm +.Fn openpam_readline function performs a certain amount of processing on the data it reads: .Bl -bullet .It -Comments (introduced by a hash sign) are stripped, as is leading and -trailing whitespace. -.It -Any amount of linear whitespace is collapsed to a single space. +Comments (introduced by a hash sign) are stripped. .It Blank lines are ignored. .It @@ -89,27 +94,28 @@ terminating NUL character) is stored in the variable it points to. The caller is responsible for releasing the returned buffer by passing it to .Xr free 3 . +.Pp .Sh RETURN VALUES The -.Nm +.Fn openpam_readline function returns .Dv NULL on failure. .Sh SEE ALSO -.Xr free 3 , -.Xr malloc 3 , +.Xr openpam_readlinev 3 , +.Xr openpam_readword 3 , .Xr pam 3 .Sh STANDARDS The -.Nm +.Fn openpam_readline function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn openpam_readline +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/openpam_readlinev.3 b/contrib/openpam/doc/man/openpam_readlinev.3 new file mode 100644 index 00000000000..f2ba1a6b775 --- /dev/null +++ b/contrib/openpam/doc/man/openpam_readlinev.3 @@ -0,0 +1,159 @@ +.\"- +.\" Copyright (c) 2001-2003 Networks Associates Technology, Inc. +.\" Copyright (c) 2004-2011 Dag-Erling Smørgrav +.\" All rights reserved. +.\" +.\" This software was developed for the FreeBSD Project by ThinkSec AS and +.\" Network Associates Laboratories, the Security Research Division of +.\" Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 +.\" ("CBOSS"), as part of the DARPA CHATS research program. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior written +.\" permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id$ +.\" +.Dd May 26, 2012 +.Dt OPENPAM_READLINEV 3 +.Os +.Sh NAME +.Nm openpam_readlinev +.Nd read a line from a file and split it into words +.Sh LIBRARY +.Lb libpam +.Sh SYNOPSIS +.In sys/types.h +.In stdio.h +.In security/pam_appl.h +.In security/openpam.h +.Ft "char **" +.Fn openpam_readlinev "FILE *f" "int *lineno" "int *lenp" +.Sh DESCRIPTION +The +.Fn openpam_readlinev +function reads a line from a file, splits it +into words according to the rules described in the +.Xr openpam_readword 3 +manual page, and returns a list of those words. +.Pp +If +.Fa lineno +is not +.Dv NULL , +the integer variable it points to is +incremented every time a newline character is read. +This includes quoted or escaped newline characters and the newline +character at the end of the line. +.Pp +If +.Fa lenp +is not +.Dv NULL , +the number of words on the line is stored in the +variable to which it points. +.Sh RETURN VALUES +If successful, the +.Fn openpam_readlinev +function returns a pointer to a +dynamically allocated array of pointers to individual dynamically +allocated NUL-terminated strings, each containing a single word, in the +order in which they were encountered on the line. +The array is terminated by a +.Dv NULL +pointer. +.Pp +The caller is responsible for freeing both the array and the individual +strings by passing each of them to +.Xr free 3 . +.Pp +If the end of the line was reached before any words were read, +.Fn openpam_readlinev +returns a pointer to a dynamically allocated array +containing a single +.Dv NULL +pointer. +.Pp +The +.Fn openpam_readlinev +function can fail and return +.Dv NULL +for one of +four reasons: +.Bl -bullet +.It +The end of the file was reached before any words were read; +.Va errno +is +zero, +.Xr ferror 3 +returns zero, and +.Xr feof 3 +returns a non-zero value. +.It +The end of the file was reached while a quote or backslash escape +was in effect; +.Va errno +is set to +.Dv EINVAL , +.Xr ferror 3 +returns zero, and +.Xr feof 3 +returns a non-zero value. +.It +An error occurred while reading from the file; +.Va errno +is non-zero, +.Xr ferror 3 +returns a non-zero value and +.Xr feof 3 +returns zero. +.It +A +.Xr malloc 3 +or +.Xr realloc 3 +call failed; +.Va errno +is set to +.Dv ENOMEM , +.Xr ferror 3 +returns a non-zero value, and +.Xr feof 3 +may or may not return +a non-zero value. +.El +.Sh SEE ALSO +.Xr openpam_readline 3 , +.Xr openpam_readword 3 , +.Xr pam 3 +.Sh STANDARDS +The +.Fn openpam_readlinev +function is an OpenPAM extension. +.Sh AUTHORS +The +.Fn openpam_readlinev +function and this manual page were +developed by +.An Dag-Erling Sm\(/orgrav Aq des@des.no . diff --git a/contrib/openpam/doc/man/openpam_readword.3 b/contrib/openpam/doc/man/openpam_readword.3 new file mode 100644 index 00000000000..6f5f58d34b7 --- /dev/null +++ b/contrib/openpam/doc/man/openpam_readword.3 @@ -0,0 +1,152 @@ +.\"- +.\" Copyright (c) 2001-2003 Networks Associates Technology, Inc. +.\" Copyright (c) 2004-2011 Dag-Erling Smørgrav +.\" All rights reserved. +.\" +.\" This software was developed for the FreeBSD Project by ThinkSec AS and +.\" Network Associates Laboratories, the Security Research Division of +.\" Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 +.\" ("CBOSS"), as part of the DARPA CHATS research program. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior written +.\" permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id$ +.\" +.Dd May 26, 2012 +.Dt OPENPAM_READWORD 3 +.Os +.Sh NAME +.Nm openpam_readword +.Nd read a word from a file, respecting shell quoting rules +.Sh LIBRARY +.Lb libpam +.Sh SYNOPSIS +.In sys/types.h +.In stdio.h +.In security/pam_appl.h +.In security/openpam.h +.Ft "char *" +.Fn openpam_readword "FILE *f" "int *lineno" "size_t *lenp" +.Sh DESCRIPTION +The +.Fn openpam_readword +function reads the next word from a file, and +returns it in a NUL-terminated buffer allocated with +.Xr malloc 3 . +.Pp +A word is a sequence of non-whitespace characters. +However, whitespace characters can be included in a word if quoted or +escaped according to the following rules: +.Bl -bullet +.It +An unescaped single or double quote introduces a quoted string, +which ends when the same quote character is encountered a second +time. +The quotes themselves are stripped. +.It +Within a single- or double-quoted string, all whitespace characters, +including the newline character, are preserved as-is. +.It +Outside a quoted string, a backslash escapes the next character, +which is preserved as-is, unless that character is a newline, in +which case it is discarded and reading continues at the beginning of +the next line as if the backslash and newline had not been there. +In all cases, the backslash itself is discarded. +.It +Within a single-quoted string, double quotes and backslashes are +preserved as-is. +.It +Within a double-quoted string, a single quote is preserved as-is, +and a backslash is preserved as-is unless used to escape a double +quote. +.El +.Pp +In addition, if the first non-whitespace character on the line is a +hash character (#), the rest of the line is discarded. +If a hash character occurs within a word, however, it is preserved +as-is. +A backslash at the end of a comment does cause line continuation. +.Pp +If +.Fa lineno +is not +.Dv NULL , +the integer variable it points to is +incremented every time a quoted or escaped newline character is read. +.Pp +If +.Fa lenp +is not +.Dv NULL , +the length of the word (after quotes and +backslashes have been removed) is stored in the variable it points to. +.Sh RETURN VALUES +If successful, the +.Fn openpam_readword +function returns a pointer to a +dynamically allocated NUL-terminated string containing the first word +encountered on the line. +.Pp +The caller is responsible for releasing the returned buffer by passing +it to +.Xr free 3 . +.Pp +If +.Fn openpam_readword +reaches the end of the line or file before any +characters are copied to the word, it returns +.Dv NULL . +In the former +case, the newline is pushed back to the file. +.Pp +If +.Fn openpam_readword +reaches the end of the file while a quote or +backslash escape is in effect, it sets +.Va errno +to +.Dv EINVAL +and returns +.Dv NULL . +.Sh IMPLEMENTATION NOTES +The parsing rules are intended to be equivalent to the normal POSIX +shell quoting rules. +Any discrepancy is a bug and should be reported to the author along +with sample input that can be used to reproduce the error. +.Pp +.Sh SEE ALSO +.Xr openpam_readline 3 , +.Xr openpam_readlinev 3 , +.Xr pam 3 +.Sh STANDARDS +The +.Fn openpam_readword +function is an OpenPAM extension. +.Sh AUTHORS +The +.Fn openpam_readword +function and this manual page were +developed by +.An Dag-Erling Sm\(/orgrav Aq des@des.no . diff --git a/contrib/openpam/doc/man/openpam_restore_cred.3 b/contrib/openpam/doc/man/openpam_restore_cred.3 index 12ff8b823af..d088ded5918 100644 --- a/contrib/openpam/doc/man/openpam_restore_cred.3 +++ b/contrib/openpam/doc/man/openpam_restore_cred.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt OPENPAM_RESTORE_CRED 3 .Os .Sh NAME @@ -50,13 +50,13 @@ .Fn openpam_restore_cred "pam_handle_t *pamh" .Sh DESCRIPTION The -.Nm +.Fn openpam_restore_cred function restores the credentials saved by .Xr openpam_borrow_cred 3 . .Pp .Sh RETURN VALUES The -.Nm +.Fn openpam_restore_cred function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_NO_MODULE_DATA @@ -73,15 +73,15 @@ System error. .Xr pam_strerror 3 .Sh STANDARDS The -.Nm +.Fn openpam_restore_cred function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn openpam_restore_cred +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/openpam_set_feature.3 b/contrib/openpam/doc/man/openpam_set_feature.3 new file mode 100644 index 00000000000..8356dec6118 --- /dev/null +++ b/contrib/openpam/doc/man/openpam_set_feature.3 @@ -0,0 +1,87 @@ +.\"- +.\" Copyright (c) 2001-2003 Networks Associates Technology, Inc. +.\" Copyright (c) 2004-2011 Dag-Erling Smørgrav +.\" All rights reserved. +.\" +.\" This software was developed for the FreeBSD Project by ThinkSec AS and +.\" Network Associates Laboratories, the Security Research Division of +.\" Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 +.\" ("CBOSS"), as part of the DARPA CHATS research program. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior written +.\" permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id$ +.\" +.Dd May 26, 2012 +.Dt OPENPAM_SET_FEATURE 3 +.Os +.Sh NAME +.Nm openpam_set_feature +.Nd enable or disable an optional feature +.Sh LIBRARY +.Lb libpam +.Sh SYNOPSIS +.In sys/types.h +.In security/pam_appl.h +.In security/openpam.h +.Ft "int" +.Fn openpam_set_feature "int feature" "int onoff" +.Sh DESCRIPTION +.Bf Sy +This function is experimental and may be modified or removed in a future release without further warning. +.Ef +.Pp +The +.Fn openpam_set_feature +function sets the state of the specified +feature to the value specified by the +.Fa onoff +argument. +See +.Xr openpam_get_feature 3 +for a list of recognized features. +.Pp +.Sh RETURN VALUES +The +.Fn openpam_set_feature +function returns one of the following values: +.Bl -tag -width 18n +.It Bq Er PAM_SYMBOL_ERR +Invalid symbol. +.El +.Sh SEE ALSO +.Xr openpam_get_feature 3 , +.Xr pam 3 , +.Xr pam_strerror 3 +.Sh STANDARDS +The +.Fn openpam_set_feature +function is an OpenPAM extension. +.Sh AUTHORS +The +.Fn openpam_set_feature +function and this manual page were +developed by +.An Dag-Erling Sm\(/orgrav Aq des@des.no . diff --git a/contrib/openpam/doc/man/openpam_set_option.3 b/contrib/openpam/doc/man/openpam_set_option.3 index f186c000d8b..b1e2267c99b 100644 --- a/contrib/openpam/doc/man/openpam_set_option.3 +++ b/contrib/openpam/doc/man/openpam_set_option.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt OPENPAM_SET_OPTION 3 .Os .Sh NAME @@ -50,13 +50,13 @@ .Fn openpam_set_option "pam_handle_t *pamh" "const char *option" "const char *value" .Sh DESCRIPTION The -.Nm +.Fn openpam_set_option function sets the specified option in the context of the currently executing service module. .Pp .Sh RETURN VALUES The -.Nm +.Fn openpam_set_option function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -70,15 +70,15 @@ System error. .Xr pam_strerror 3 .Sh STANDARDS The -.Nm +.Fn openpam_set_option function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn openpam_set_option +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/openpam_straddch.3 b/contrib/openpam/doc/man/openpam_straddch.3 new file mode 100644 index 00000000000..c55582477ed --- /dev/null +++ b/contrib/openpam/doc/man/openpam_straddch.3 @@ -0,0 +1,122 @@ +.\"- +.\" Copyright (c) 2001-2003 Networks Associates Technology, Inc. +.\" Copyright (c) 2004-2011 Dag-Erling Smørgrav +.\" All rights reserved. +.\" +.\" This software was developed for the FreeBSD Project by ThinkSec AS and +.\" Network Associates Laboratories, the Security Research Division of +.\" Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 +.\" ("CBOSS"), as part of the DARPA CHATS research program. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior written +.\" permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id$ +.\" +.Dd May 26, 2012 +.Dt OPENPAM_STRADDCH 3 +.Os +.Sh NAME +.Nm openpam_straddch +.Nd add a character to a string, expanding the buffer if needed +.Sh LIBRARY +.Lb libpam +.Sh SYNOPSIS +.In sys/types.h +.In security/pam_appl.h +.In security/openpam.h +.Ft "int" +.Fn openpam_straddch "char **str" "size_t *size" "size_t *len" "int ch" +.Sh DESCRIPTION +The +.Fn openpam_straddch +function appends a character to a dynamically +allocated NUL-terminated buffer, reallocating the buffer as needed. +.Pp +The +.Fa str +argument points to a variable containing either a pointer to +an existing buffer or +.Dv NULL . +If the value of the variable pointed to by +.Fa str +is +.Dv NULL , +a new buffer +is allocated. +.Pp +The +.Fa size +and +.Fa len +argument point to variables used to hold the size +of the buffer and the length of the string it contains, respectively. +.Pp +If a new buffer is allocated or an existing buffer is reallocated to +make room for the additional character, +.Fa str +and +.Fa size +are updated +accordingly. +.Pp +The +.Fn openpam_straddch +function ensures that the buffer is always +NUL-terminated. +.Pp +If the +.Fn openpam_straddch +function is successful, it increments the +integer variable pointed to by +.Fa len +and returns 0. +Otherwise, it leaves the variables pointed to by +.Fa str , +.Fa size +and +.Fa len +unmodified, sets +.Va errno +to +.Dv ENOMEM +and returns -1. +.Pp +.Sh RETURN VALUES +The +.Fn openpam_straddch +function returns 0 on success and -1 on failure. +.Sh SEE ALSO +.Xr pam 3 , +.Xr pam_strerror 3 +.Sh STANDARDS +The +.Fn openpam_straddch +function is an OpenPAM extension. +.Sh AUTHORS +The +.Fn openpam_straddch +function and this manual page were +developed by +.An Dag-Erling Sm\(/orgrav Aq des@des.no . diff --git a/contrib/openpam/doc/man/openpam_subst.3 b/contrib/openpam/doc/man/openpam_subst.3 index 565b3e07091..47297c92cce 100644 --- a/contrib/openpam/doc/man/openpam_subst.3 +++ b/contrib/openpam/doc/man/openpam_subst.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt OPENPAM_SUBST 3 .Os .Sh NAME @@ -50,7 +50,7 @@ .Fn openpam_subst "const pam_handle_t *pamh" "char *buf" "size_t *bufsize" "const char *template" .Sh DESCRIPTION The -.Nm +.Fn openpam_subst function expands a string, substituting PAM item values for all occurrences of specific substitution codes. The @@ -73,12 +73,12 @@ string, .Fa bufsize is updated to reflect the amount of space required to hold the entire string, and -.Nm +.Fn openpam_subst returns .Dv PAM_TRY_AGAIN . .Pp If -.Nm +.Fn openpam_subst fails for any other reason, the .Fa bufsize argument is @@ -112,10 +112,9 @@ Replaced by the current value of the .Dv PAM_USER item. .El -.Pp .Sh RETURN VALUES The -.Nm +.Fn openpam_subst function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_SYSTEM_ERR @@ -131,12 +130,11 @@ Try again. .Xr pam_strerror 3 .Sh STANDARDS The -.Nm +.Fn openpam_subst function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the -.Fx -Project by -.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org . +.Fn openpam_subst +function and this manual page were +developed by +.An Dag-Erling Sm\(/orgrav Aq des@des.no . diff --git a/contrib/openpam/doc/man/openpam_ttyconv.3 b/contrib/openpam/doc/man/openpam_ttyconv.3 index b2cd9d9dc94..3e97cb4b3d6 100644 --- a/contrib/openpam/doc/man/openpam_ttyconv.3 +++ b/contrib/openpam/doc/man/openpam_ttyconv.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt OPENPAM_TTYCONV 3 .Os .Sh NAME @@ -50,14 +50,14 @@ .Fn openpam_ttyconv "int n" "const struct pam_message **msg" "struct pam_response **resp" "void *data" .Sh DESCRIPTION The -.Nm +.Fn openpam_ttyconv function is a standard conversation function suitable for use on TTY devices. It should be adequate for the needs of most text-based interactive programs. .Pp The -.Nm +.Fn openpam_ttyconv function allows the application to specify a timeout for user input by setting the global integer variable .Va openpam_ttyconv_timeout @@ -65,7 +65,7 @@ to the length of the timeout in seconds. .Pp .Sh RETURN VALUES The -.Nm +.Fn openpam_ttyconv function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -83,15 +83,15 @@ System error. .Xr pam_vprompt 3 .Sh STANDARDS The -.Nm +.Fn openpam_ttyconv function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn openpam_ttyconv +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam.3 b/contrib/openpam/doc/man/pam.3 index 11befcda528..196a3c75cb9 100644 --- a/contrib/openpam/doc/man/pam.3 +++ b/contrib/openpam/doc/man/pam.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM 3 .Os .Sh NAME @@ -291,3 +291,6 @@ Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , as part of the DARPA CHATS research program. +.Pp +The OpenPAM library is maintained by +.An Dag-Erling Sm\(/orgrav Aq des@des.no . diff --git a/contrib/openpam/doc/man/pam.conf.5 b/contrib/openpam/doc/man/pam.conf.5 index 3669f927f98..d5f80d57a18 100644 --- a/contrib/openpam/doc/man/pam.conf.5 +++ b/contrib/openpam/doc/man/pam.conf.5 @@ -26,9 +26,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: pam.conf.5 485 2011-11-03 16:57:37Z des $ +.\" $Id: pam.conf.5 610 2012-05-26 14:03:45Z des $ .\" -.Dd November 3, 2011 +.Dd May 26, 2012 .Dt PAM.CONF 5 .Os .Sh NAME @@ -50,7 +50,7 @@ decreasing order of preference: .Pp If none of these locations contains a policy for the given service, the -.Dv default +.Dq Dv other policy is used instead, if it exists. .Pp Entries in per-service policy files must be of one of the two forms @@ -177,5 +177,5 @@ DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , as part of the DARPA CHATS research program. .Pp -This manual page was written by -.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org . +The OpenPAM library is maintained by +.An Dag-Erling Sm\(/orgrav Aq des@des.no . diff --git a/contrib/openpam/doc/man/pam_acct_mgmt.3 b/contrib/openpam/doc/man/pam_acct_mgmt.3 index 94100484fb3..f79c4646c4c 100644 --- a/contrib/openpam/doc/man/pam_acct_mgmt.3 +++ b/contrib/openpam/doc/man/pam_acct_mgmt.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_ACCT_MGMT 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_acct_mgmt "pam_handle_t *pamh" "int flags" .Sh DESCRIPTION The -.Nm +.Fn pam_acct_mgmt function verifies and enforces account restrictions after the user has been authenticated. .Pp @@ -65,12 +65,12 @@ Fail if the user's authentication token is null. .El .Pp If any other bits are set, -.Nm +.Fn pam_acct_mgmt will return .Dv PAM_SYMBOL_ERR . .Sh RETURN VALUES The -.Nm +.Fn pam_acct_mgmt function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_ABORT @@ -104,11 +104,11 @@ Unknown user. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_acct_mgmt +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_authenticate.3 b/contrib/openpam/doc/man/pam_authenticate.3 index 8263280f097..c521a388ba2 100644 --- a/contrib/openpam/doc/man/pam_authenticate.3 +++ b/contrib/openpam/doc/man/pam_authenticate.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_AUTHENTICATE 3 .Os .Sh NAME @@ -49,14 +49,14 @@ .Fn pam_authenticate "pam_handle_t *pamh" "int flags" .Sh DESCRIPTION The -.Nm +.Fn pam_authenticate function attempts to authenticate the user associated with the pam context specified by the .Fa pamh argument. .Pp The application is free to call -.Nm +.Fn pam_authenticate as many times as it wishes, but some modules may maintain an internal retry counter and return @@ -75,12 +75,12 @@ Fail if the user's authentication token is null. .El .Pp If any other bits are set, -.Nm +.Fn pam_authenticate will return .Dv PAM_SYMBOL_ERR . .Sh RETURN VALUES The -.Nm +.Fn pam_authenticate function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_ABORT @@ -118,11 +118,11 @@ Unknown user. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_authenticate +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_chauthtok.3 b/contrib/openpam/doc/man/pam_chauthtok.3 index 5823866928b..11647e7ad0b 100644 --- a/contrib/openpam/doc/man/pam_chauthtok.3 +++ b/contrib/openpam/doc/man/pam_chauthtok.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_CHAUTHTOK 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_chauthtok "pam_handle_t *pamh" "int flags" .Sh DESCRIPTION The -.Nm +.Fn pam_chauthtok function attempts to change the authentication token for the user associated with the pam context specified by the .Fa pamh @@ -67,12 +67,12 @@ Change only those authentication tokens that have expired. .El .Pp If any other bits are set, -.Nm +.Fn pam_chauthtok will return .Dv PAM_SYMBOL_ERR . .Sh RETURN VALUES The -.Nm +.Fn pam_chauthtok function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_ABORT @@ -110,11 +110,11 @@ Try again. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_chauthtok +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_close_session.3 b/contrib/openpam/doc/man/pam_close_session.3 index 43e4b0392ce..dba62e816af 100644 --- a/contrib/openpam/doc/man/pam_close_session.3 +++ b/contrib/openpam/doc/man/pam_close_session.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_CLOSE_SESSION 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_close_session "pam_handle_t *pamh" "int flags" .Sh DESCRIPTION The -.Nm +.Fn pam_close_session function tears down the user session previously set up by .Xr pam_open_session 3 . @@ -64,12 +64,12 @@ Do not emit any messages. .El .Pp If any other bits are set, -.Nm +.Fn pam_close_session will return .Dv PAM_SYMBOL_ERR . .Sh RETURN VALUES The -.Nm +.Fn pam_close_session function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_ABORT @@ -100,11 +100,11 @@ System error. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_close_session +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_conv.3 b/contrib/openpam/doc/man/pam_conv.3 index 6b6e697b063..a1b121b101c 100644 --- a/contrib/openpam/doc/man/pam_conv.3 +++ b/contrib/openpam/doc/man/pam_conv.3 @@ -32,9 +32,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: pam_conv.3 437 2011-09-13 12:00:13Z des $ +.\" $Id: pam_conv.3 610 2012-05-26 14:03:45Z des $ .\" -.Dd June 16, 2005 +.Dd May 26, 2012 .Dt PAM_CONV 3 .Os .Sh NAME @@ -181,3 +181,6 @@ the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , as part of the DARPA CHATS research program. +.Pp +The OpenPAM library is maintained by +.An Dag-Erling Sm\(/orgrav Aq des@des.no . diff --git a/contrib/openpam/doc/man/pam_end.3 b/contrib/openpam/doc/man/pam_end.3 index 66e2871c0da..0d669125bea 100644 --- a/contrib/openpam/doc/man/pam_end.3 +++ b/contrib/openpam/doc/man/pam_end.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_END 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_end "pam_handle_t *pamh" "int status" .Sh DESCRIPTION The -.Nm +.Fn pam_end function terminates a PAM transaction and destroys the corresponding PAM context, releasing all resources allocated to it. .Pp @@ -57,11 +57,10 @@ The .Fa status argument should be set to the error code returned by the last API call before the call to -.Nm -. +.Fn pam_end . .Sh RETURN VALUES The -.Nm +.Fn pam_end function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_SYSTEM_ERR @@ -77,11 +76,11 @@ System error. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_end +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_error.3 b/contrib/openpam/doc/man/pam_error.3 index c957409c8b8..6767772b574 100644 --- a/contrib/openpam/doc/man/pam_error.3 +++ b/contrib/openpam/doc/man/pam_error.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_ERROR 3 .Os .Sh NAME @@ -49,13 +49,13 @@ .Fn pam_error "const pam_handle_t *pamh" "const char *fmt" "..." .Sh DESCRIPTION The -.Nm +.Fn pam_error function displays an error message through the intermediary of the given PAM context's conversation function. .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_error function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -73,15 +73,15 @@ System error. .Xr pam_verror 3 .Sh STANDARDS The -.Nm +.Fn pam_error function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_error +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_get_authtok.3 b/contrib/openpam/doc/man/pam_get_authtok.3 index 7f0c8049aac..84c133dd52a 100644 --- a/contrib/openpam/doc/man/pam_get_authtok.3 +++ b/contrib/openpam/doc/man/pam_get_authtok.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_GET_AUTHTOK 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_get_authtok "pam_handle_t *pamh" "int item" "const char **authtok" "const char *prompt" .Sh DESCRIPTION The -.Nm +.Fn pam_get_authtok function returns the cached authentication token, or prompts the user if no token is currently cached. Either way, a pointer to the authentication token is stored in the @@ -89,7 +89,7 @@ before it is passed to the conversation function. .Pp If -.Nm +.Fn pam_get_authtok is called from a module and the .Dv authtok_prompt / @@ -110,17 +110,17 @@ is set to and there is a non-null .Dv PAM_OLDAUTHTOK item, -.Nm +.Fn pam_get_authtok will ask the user to confirm the new token by retyping it. If there is a mismatch, -.Nm +.Fn pam_get_authtok will return .Dv PAM_TRY_AGAIN . .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_get_authtok function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -140,15 +140,15 @@ Try again. .Xr pam_strerror 3 .Sh STANDARDS The -.Nm +.Fn pam_get_authtok function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_get_authtok +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_get_data.3 b/contrib/openpam/doc/man/pam_get_data.3 index 49fae056cf0..db4b723cf7a 100644 --- a/contrib/openpam/doc/man/pam_get_data.3 +++ b/contrib/openpam/doc/man/pam_get_data.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_GET_DATA 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_get_data "const pam_handle_t *pamh" "const char *module_data_name" "const void **data" .Sh DESCRIPTION The -.Nm +.Fn pam_get_data function looks up the opaque object associated with the string specified by the .Fa module_data_name @@ -61,7 +61,7 @@ A pointer to the object is stored in the location pointed to by the .Fa data argument. If -.Nm +.Fn pam_get_data fails, the .Fa data argument is untouched. @@ -72,7 +72,7 @@ are useful for managing data that are meaningful only to a particular service module. .Sh RETURN VALUES The -.Nm +.Fn pam_get_data function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_NO_MODULE_DATA @@ -91,11 +91,11 @@ System error. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_get_data +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_get_item.3 b/contrib/openpam/doc/man/pam_get_item.3 index 1244a77a9ee..aaa1badd7f7 100644 --- a/contrib/openpam/doc/man/pam_get_item.3 +++ b/contrib/openpam/doc/man/pam_get_item.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_GET_ITEM 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_get_item "const pam_handle_t *pamh" "int item_type" "const void **item" .Sh DESCRIPTION The -.Nm +.Fn pam_get_item function stores a pointer to the item specified by the .Fa item_type @@ -60,7 +60,7 @@ The item is retrieved from the PAM context specified by the .Fa pamh argument. If -.Nm +.Fn pam_get_item fails, the .Fa item argument is untouched. @@ -107,7 +107,7 @@ for a description of .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_get_item function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_SYMBOL_ERR @@ -127,11 +127,11 @@ System error. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_get_item +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_get_user.3 b/contrib/openpam/doc/man/pam_get_user.3 index 8f3b426a661..448f41898b8 100644 --- a/contrib/openpam/doc/man/pam_get_user.3 +++ b/contrib/openpam/doc/man/pam_get_user.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_GET_USER 3 .Os .Sh NAME @@ -49,13 +49,13 @@ .Fn pam_get_user "pam_handle_t *pamh" "const char **user" "const char *prompt" .Sh DESCRIPTION The -.Nm +.Fn pam_get_user function returns the name of the target user, as specified to .Xr pam_start 3 . If no user was specified, nor set using .Xr pam_set_item 3 , -.Nm +.Fn pam_get_user will prompt for a user name. Either way, a pointer to the user name is stored in the location pointed to by the @@ -80,7 +80,7 @@ before it is passed to the conversation function. .Pp If -.Nm +.Fn pam_get_user is called from a module and the .Dv user_prompt option is @@ -93,7 +93,7 @@ item. .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_get_user function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -118,11 +118,11 @@ System error. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_get_user +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_getenv.3 b/contrib/openpam/doc/man/pam_getenv.3 index ebd2992f1e9..1f0df73f2db 100644 --- a/contrib/openpam/doc/man/pam_getenv.3 +++ b/contrib/openpam/doc/man/pam_getenv.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_GETENV 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_getenv "pam_handle_t *pamh" "const char *name" .Sh DESCRIPTION The -.Nm +.Fn pam_getenv function returns the value of an environment variable. Its semantics are similar to those of .Xr getenv 3 , @@ -58,7 +58,7 @@ context's environment list instead of the application's. .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_getenv function returns .Dv NULL on failure. @@ -75,11 +75,11 @@ on failure. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_getenv +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_getenvlist.3 b/contrib/openpam/doc/man/pam_getenvlist.3 index a034c8e3cc0..9af378459b4 100644 --- a/contrib/openpam/doc/man/pam_getenvlist.3 +++ b/contrib/openpam/doc/man/pam_getenvlist.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_GETENVLIST 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_getenvlist "pam_handle_t *pamh" .Sh DESCRIPTION The -.Nm +.Fn pam_getenvlist function returns a copy of the given PAM context's environment list as a pointer to an array of strings. The last element in the array is @@ -77,7 +77,7 @@ after use: .Ed .Sh RETURN VALUES The -.Nm +.Fn pam_getenvlist function returns .Dv NULL on failure. @@ -96,11 +96,11 @@ on failure. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_getenvlist +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_info.3 b/contrib/openpam/doc/man/pam_info.3 index 08bf200de53..c08b5748c6e 100644 --- a/contrib/openpam/doc/man/pam_info.3 +++ b/contrib/openpam/doc/man/pam_info.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_INFO 3 .Os .Sh NAME @@ -49,13 +49,13 @@ .Fn pam_info "const pam_handle_t *pamh" "const char *fmt" "..." .Sh DESCRIPTION The -.Nm +.Fn pam_info function displays an informational message through the intermediary of the given PAM context's conversation function. .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_info function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -73,15 +73,15 @@ System error. .Xr pam_vinfo 3 .Sh STANDARDS The -.Nm +.Fn pam_info function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_info +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_open_session.3 b/contrib/openpam/doc/man/pam_open_session.3 index 13811c7d297..1cde0e43712 100644 --- a/contrib/openpam/doc/man/pam_open_session.3 +++ b/contrib/openpam/doc/man/pam_open_session.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_OPEN_SESSION 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_open_session "pam_handle_t *pamh" "int flags" .Sh DESCRIPTION The -.Nm +.Fn pam_open_session sets up a user session for a previously authenticated user. The session should later be torn down by a call to @@ -65,12 +65,12 @@ Do not emit any messages. .El .Pp If any other bits are set, -.Nm +.Fn pam_open_session will return .Dv PAM_SYMBOL_ERR . .Sh RETURN VALUES The -.Nm +.Fn pam_open_session function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_ABORT @@ -101,11 +101,11 @@ System error. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_open_session +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_prompt.3 b/contrib/openpam/doc/man/pam_prompt.3 index 20574f2321e..0ff7742b7fc 100644 --- a/contrib/openpam/doc/man/pam_prompt.3 +++ b/contrib/openpam/doc/man/pam_prompt.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_PROMPT 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_prompt "const pam_handle_t *pamh" "int style" "char **resp" "const char *fmt" "..." .Sh DESCRIPTION The -.Nm +.Fn pam_prompt function constructs a message from the specified format string and arguments and passes it to the given PAM context's conversation function. @@ -67,7 +67,7 @@ for further details. .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_prompt function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -85,15 +85,15 @@ System error. .Xr pam_vprompt 3 .Sh STANDARDS The -.Nm +.Fn pam_prompt function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_prompt +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_putenv.3 b/contrib/openpam/doc/man/pam_putenv.3 index e69816a0b76..4e9c6938e69 100644 --- a/contrib/openpam/doc/man/pam_putenv.3 +++ b/contrib/openpam/doc/man/pam_putenv.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_PUTENV 3 .Os .Sh NAME @@ -49,8 +49,8 @@ .Fn pam_putenv "pam_handle_t *pamh" "const char *namevalue" .Sh DESCRIPTION The -.Nm -function sets a environment variable. +.Fn pam_putenv +function sets an environment variable. Its semantics are similar to those of .Xr putenv 3 , but it modifies the PAM @@ -58,7 +58,7 @@ context's environment list instead of the application's. .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_putenv function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -80,11 +80,11 @@ System error. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_putenv +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_set_data.3 b/contrib/openpam/doc/man/pam_set_data.3 index ce4d63d0614..c02ae2ef6ee 100644 --- a/contrib/openpam/doc/man/pam_set_data.3 +++ b/contrib/openpam/doc/man/pam_set_data.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_SET_DATA 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_set_data "pam_handle_t *pamh" "const char *module_data_name" "void *data" "void (*cleanup)(pam_handle_t *pamh, void *data, int pam_end_status)" .Sh DESCRIPTION The -.Nm +.Fn pam_set_data function associates a pointer to an opaque object with an arbitrary string specified by the .Fa module_data_name @@ -71,7 +71,7 @@ are useful for managing data that are meaningful only to a particular service module. .Sh RETURN VALUES The -.Nm +.Fn pam_set_data function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -90,11 +90,11 @@ System error. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_set_data +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_set_item.3 b/contrib/openpam/doc/man/pam_set_item.3 index 9f4e78d9aa0..668c4f39ff0 100644 --- a/contrib/openpam/doc/man/pam_set_item.3 +++ b/contrib/openpam/doc/man/pam_set_item.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_SET_ITEM 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_set_item "pam_handle_t *pamh" "int item_type" "const void *item" .Sh DESCRIPTION The -.Nm +.Fn pam_set_item function sets the item specified by the .Fa item_type argument to a copy of the object pointed to by the @@ -63,7 +63,7 @@ See for a list of recognized item types. .Sh RETURN VALUES The -.Nm +.Fn pam_set_item function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -84,11 +84,11 @@ System error. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_set_item +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_setcred.3 b/contrib/openpam/doc/man/pam_setcred.3 index 1e0a2460028..a4f82493f7c 100644 --- a/contrib/openpam/doc/man/pam_setcred.3 +++ b/contrib/openpam/doc/man/pam_setcred.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_SETCRED 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_setcred "pam_handle_t *pamh" "int flags" .Sh DESCRIPTION The -.Nm +.Fn pam_setcred function manages the application's credentials. .Pp The @@ -72,12 +72,12 @@ Refresh credentials. The latter four are mutually exclusive. .Pp If any other bits are set, -.Nm +.Fn pam_setcred will return .Dv PAM_SYMBOL_ERR . .Sh RETURN VALUES The -.Nm +.Fn pam_setcred function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_ABORT @@ -113,11 +113,11 @@ Unknown user. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_setcred +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_setenv.3 b/contrib/openpam/doc/man/pam_setenv.3 index 43906efd1cc..e3b9c131e28 100644 --- a/contrib/openpam/doc/man/pam_setenv.3 +++ b/contrib/openpam/doc/man/pam_setenv.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_SETENV 3 .Os .Sh NAME @@ -49,8 +49,8 @@ .Fn pam_setenv "pam_handle_t *pamh" "const char *name" "const char *value" "int overwrite" .Sh DESCRIPTION The -.Nm -function sets a environment variable. +.Fn pam_setenv +function sets an environment variable. Its semantics are similar to those of .Xr setenv 3 , but it modifies the PAM @@ -58,7 +58,7 @@ context's environment list instead of the application's. .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_setenv function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -75,15 +75,15 @@ System error. .Xr setenv 3 .Sh STANDARDS The -.Nm +.Fn pam_setenv function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_setenv +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_sm_acct_mgmt.3 b/contrib/openpam/doc/man/pam_sm_acct_mgmt.3 index 22e1980d8e8..35dd05bb5c0 100644 --- a/contrib/openpam/doc/man/pam_sm_acct_mgmt.3 +++ b/contrib/openpam/doc/man/pam_sm_acct_mgmt.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_SM_ACCT_MGMT 3 .Os .Sh NAME @@ -50,14 +50,14 @@ .Fn pam_sm_acct_mgmt "pam_handle_t *pamh" "int flags" "int argc" "const char **argv" .Sh DESCRIPTION The -.Nm +.Fn pam_sm_acct_mgmt function is the service module's implementation of the .Xr pam_acct_mgmt 3 API function. .Sh RETURN VALUES The -.Nm +.Fn pam_sm_acct_mgmt function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_ABORT @@ -94,11 +94,11 @@ Unknown user. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_sm_acct_mgmt +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_sm_authenticate.3 b/contrib/openpam/doc/man/pam_sm_authenticate.3 index e41a70ab0c4..4c27bb76019 100644 --- a/contrib/openpam/doc/man/pam_sm_authenticate.3 +++ b/contrib/openpam/doc/man/pam_sm_authenticate.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_SM_AUTHENTICATE 3 .Os .Sh NAME @@ -50,14 +50,14 @@ .Fn pam_sm_authenticate "pam_handle_t *pamh" "int flags" "int argc" "const char **argv" .Sh DESCRIPTION The -.Nm +.Fn pam_sm_authenticate function is the service module's implementation of the .Xr pam_authenticate 3 API function. .Sh RETURN VALUES The -.Nm +.Fn pam_sm_authenticate function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_ABORT @@ -96,11 +96,11 @@ Unknown user. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_sm_authenticate +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_sm_chauthtok.3 b/contrib/openpam/doc/man/pam_sm_chauthtok.3 index bc3f461b7a5..8e28b05f991 100644 --- a/contrib/openpam/doc/man/pam_sm_chauthtok.3 +++ b/contrib/openpam/doc/man/pam_sm_chauthtok.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_SM_CHAUTHTOK 3 .Os .Sh NAME @@ -50,7 +50,7 @@ .Fn pam_sm_chauthtok "pam_handle_t *pamh" "int flags" "int argc" "const char **argv" .Sh DESCRIPTION The -.Nm +.Fn pam_sm_chauthtok function is the service module's implementation of the .Xr pam_chauthtok 3 @@ -67,7 +67,7 @@ with the flag set. .Sh RETURN VALUES The -.Nm +.Fn pam_sm_chauthtok function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_ABORT @@ -106,11 +106,11 @@ Try again. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_sm_chauthtok +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_sm_close_session.3 b/contrib/openpam/doc/man/pam_sm_close_session.3 index 3b1f57e075b..bfb5d87ee32 100644 --- a/contrib/openpam/doc/man/pam_sm_close_session.3 +++ b/contrib/openpam/doc/man/pam_sm_close_session.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_SM_CLOSE_SESSION 3 .Os .Sh NAME @@ -50,14 +50,14 @@ .Fn pam_sm_close_session "pam_handle_t *pamh" "int flags" "int args" "const char **argv" .Sh DESCRIPTION The -.Nm +.Fn pam_sm_close_session function is the service module's implementation of the .Xr pam_close_session 3 API function. .Sh RETURN VALUES The -.Nm +.Fn pam_sm_close_session function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_ABORT @@ -88,11 +88,11 @@ System error. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_sm_close_session +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_sm_open_session.3 b/contrib/openpam/doc/man/pam_sm_open_session.3 index cdfe4d41255..b92fb45b1b1 100644 --- a/contrib/openpam/doc/man/pam_sm_open_session.3 +++ b/contrib/openpam/doc/man/pam_sm_open_session.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_SM_OPEN_SESSION 3 .Os .Sh NAME @@ -50,14 +50,14 @@ .Fn pam_sm_open_session "pam_handle_t *pamh" "int flags" "int argc" "const char **argv" .Sh DESCRIPTION The -.Nm +.Fn pam_sm_open_session function is the service module's implementation of the .Xr pam_open_session 3 API function. .Sh RETURN VALUES The -.Nm +.Fn pam_sm_open_session function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_ABORT @@ -88,11 +88,11 @@ System error. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_sm_open_session +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_sm_setcred.3 b/contrib/openpam/doc/man/pam_sm_setcred.3 index 6d5c52fc169..19b192e2178 100644 --- a/contrib/openpam/doc/man/pam_sm_setcred.3 +++ b/contrib/openpam/doc/man/pam_sm_setcred.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_SM_SETCRED 3 .Os .Sh NAME @@ -50,14 +50,14 @@ .Fn pam_sm_setcred "pam_handle_t *pamh" "int flags" "int argc" "const char **argv" .Sh DESCRIPTION The -.Nm +.Fn pam_sm_setcred function is the service module's implementation of the .Xr pam_setcred 3 API function. .Sh RETURN VALUES The -.Nm +.Fn pam_sm_setcred function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_ABORT @@ -94,11 +94,11 @@ Unknown user. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_sm_setcred +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_start.3 b/contrib/openpam/doc/man/pam_start.3 index eaa9f0571c6..4e28d3e57bf 100644 --- a/contrib/openpam/doc/man/pam_start.3 +++ b/contrib/openpam/doc/man/pam_start.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_START 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_start "const char *service" "const char *user" "const struct pam_conv *pam_conv" "pam_handle_t **pamh" .Sh DESCRIPTION The -.Nm +.Fn pam_start function creates and initializes a PAM context. .Pp The @@ -78,7 +78,7 @@ for details. .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_start function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -99,11 +99,11 @@ System error. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_start +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_strerror.3 b/contrib/openpam/doc/man/pam_strerror.3 index 90031028483..5b24b68e8a0 100644 --- a/contrib/openpam/doc/man/pam_strerror.3 +++ b/contrib/openpam/doc/man/pam_strerror.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_STRERROR 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_strerror "const pam_handle_t *pamh" "int error_number" .Sh DESCRIPTION The -.Nm +.Fn pam_strerror function returns a pointer to a string containing a textual description of the error indicated by the .Fa error_number @@ -64,7 +64,7 @@ or .Dv NULL . .Sh RETURN VALUES The -.Nm +.Fn pam_strerror function returns .Dv NULL on failure. @@ -78,11 +78,11 @@ on failure. .Re .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_strerror +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_verror.3 b/contrib/openpam/doc/man/pam_verror.3 index 4987da30f98..d4a8cc54862 100644 --- a/contrib/openpam/doc/man/pam_verror.3 +++ b/contrib/openpam/doc/man/pam_verror.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_VERROR 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_verror "const pam_handle_t *pamh" "const char *fmt" "va_list ap" .Sh DESCRIPTION The -.Nm +.Fn pam_verror function passes its arguments to .Xr pam_vprompt 3 with a @@ -59,7 +59,7 @@ and discards the response. .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_verror function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -77,15 +77,15 @@ System error. .Xr pam_vprompt 3 .Sh STANDARDS The -.Nm +.Fn pam_verror function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_verror +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_vinfo.3 b/contrib/openpam/doc/man/pam_vinfo.3 index c2ac5b0c4d3..3e10b508a9c 100644 --- a/contrib/openpam/doc/man/pam_vinfo.3 +++ b/contrib/openpam/doc/man/pam_vinfo.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_VINFO 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_vinfo "const pam_handle_t *pamh" "const char *fmt" "va_list ap" .Sh DESCRIPTION The -.Nm +.Fn pam_vinfo function passes its arguments to .Xr pam_vprompt 3 with a @@ -59,7 +59,7 @@ and discards the response. .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_vinfo function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -77,15 +77,15 @@ System error. .Xr pam_vprompt 3 .Sh STANDARDS The -.Nm +.Fn pam_vinfo function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_vinfo +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/doc/man/pam_vprompt.3 b/contrib/openpam/doc/man/pam_vprompt.3 index 381008d7a99..c3d8b325827 100644 --- a/contrib/openpam/doc/man/pam_vprompt.3 +++ b/contrib/openpam/doc/man/pam_vprompt.3 @@ -34,7 +34,7 @@ .\" .\" $Id$ .\" -.Dd December 18, 2011 +.Dd May 26, 2012 .Dt PAM_VPROMPT 3 .Os .Sh NAME @@ -49,7 +49,7 @@ .Fn pam_vprompt "const pam_handle_t *pamh" "int style" "char **resp" "const char *fmt" "va_list ap" .Sh DESCRIPTION The -.Nm +.Fn pam_vprompt function constructs a string from the .Fa fmt and @@ -93,7 +93,7 @@ If they do, they may be truncated. .Pp .Sh RETURN VALUES The -.Nm +.Fn pam_vprompt function returns one of the following values: .Bl -tag -width 18n .It Bq Er PAM_BUF_ERR @@ -114,15 +114,15 @@ System error. .Xr vsnprintf 3 .Sh STANDARDS The -.Nm +.Fn pam_vprompt function is an OpenPAM extension. .Sh AUTHORS The -.Nm -function and this manual page were developed for the +.Fn pam_vprompt +function and this manual page were +developed for the .Fx -Project by -ThinkSec AS and Network Associates Laboratories, the +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , diff --git a/contrib/openpam/include/security/openpam.h b/contrib/openpam/include/security/openpam.h index 0c896a480a9..4ba8b95fa0f 100644 --- a/contrib/openpam/include/security/openpam.h +++ b/contrib/openpam/include/security/openpam.h @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam.h 455 2011-10-29 18:31:11Z des $ + * $Id: openpam.h 605 2012-04-20 11:05:10Z des $ */ #ifndef SECURITY_OPENPAM_H_INCLUDED @@ -157,12 +157,49 @@ openpam_readline(FILE *_f, int *_lineno, size_t *_lenp) OPENPAM_NONNULL((1)); + +char ** +openpam_readlinev(FILE *_f, + int *_lineno, + int *_lenp) + OPENPAM_NONNULL((1)); + +char * +openpam_readword(FILE *_f, + int *_lineno, + size_t *_lenp) + OPENPAM_NONNULL((1)); #endif +int +openpam_straddch(char **_str, + size_t *_sizep, + size_t *_lenp, + int ch) + OPENPAM_NONNULL((1)); + +/* + * Enable / disable optional features + */ +enum { + OPENPAM_RESTRICT_SERVICE_NAME, + OPENPAM_VERIFY_POLICY_FILE, + OPENPAM_RESTRICT_MODULE_NAME, + OPENPAM_VERIFY_MODULE_FILE, + OPENPAM_NUM_FEATURES +}; + +int +openpam_set_feature(int _feature, int _onoff); + +int +openpam_get_feature(int _feature, int *_onoff); + /* * Log levels */ enum { + PAM_LOG_LIBDEBUG = -1, PAM_LOG_DEBUG, PAM_LOG_VERBOSE, PAM_LOG_NOTICE, @@ -196,8 +233,8 @@ _openpam_log(int _level, void openpam_log(int _level, const char *_format, - ...) - OPENPAM_FORMAT ((__printf__, 2, 3)) + ...) + OPENPAM_FORMAT ((__printf__, 2, 3)) OPENPAM_NONNULL((2)); #endif diff --git a/contrib/openpam/include/security/openpam_version.h b/contrib/openpam/include/security/openpam_version.h index ed1c1de69f5..d50d9136895 100644 --- a/contrib/openpam/include/security/openpam_version.h +++ b/contrib/openpam/include/security/openpam_version.h @@ -32,14 +32,14 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_version.h 505 2011-12-18 14:13:08Z des $ + * $Id: openpam_version.h 609 2012-05-26 13:57:45Z des $ */ #ifndef SECURITY_OPENPAM_VERSION_H_INCLUDED #define SECURITY_OPENPAM_VERSION_H_INCLUDED #define OPENPAM -#define OPENPAM_VERSION 20111218 -#define OPENPAM_RELEASE "Lycopsida" +#define OPENPAM_VERSION 20120526 +#define OPENPAM_RELEASE "Micrampelis" #endif /* !SECURITY_OPENPAM_VERSION_H_INCLUDED */ diff --git a/contrib/openpam/lib/Makefile.am b/contrib/openpam/lib/Makefile.am index 3a2e60ec8c7..9ce2d2f5bc1 100644 --- a/contrib/openpam/lib/Makefile.am +++ b/contrib/openpam/lib/Makefile.am @@ -1,4 +1,4 @@ -# $Id: Makefile.am 499 2011-11-22 11:51:50Z des $ +# $Id: Makefile.am 602 2012-04-15 17:31:15Z des $ NULL = @@ -8,8 +8,11 @@ lib_LTLIBRARIES = libpam.la noinst_HEADERS = \ openpam_constants.h \ + openpam_ctype.h \ openpam_debug.h \ + openpam_features.h \ openpam_impl.h \ + openpam_strlcat.h \ openpam_strlcmp.h \ openpam_strlcpy.h @@ -20,17 +23,23 @@ libpam_la_SOURCES = \ openpam_constants.c \ openpam_dispatch.c \ openpam_dynamic.c \ + openpam_features.c \ openpam_findenv.c \ openpam_free_data.c \ openpam_free_envlist.c \ + openpam_get_feature.c \ openpam_get_option.c \ openpam_load.c \ openpam_log.c \ openpam_nullconv.c \ openpam_readline.c \ + openpam_readlinev.c \ + openpam_readword.c \ openpam_restore_cred.c \ openpam_set_option.c \ + openpam_set_feature.c \ openpam_static.c \ + openpam_straddch.c \ openpam_subst.c \ openpam_ttyconv.c \ pam_acct_mgmt.c \ diff --git a/contrib/openpam/lib/Makefile.in b/contrib/openpam/lib/Makefile.in index 0052ce286e3..353fbaba9b6 100644 --- a/contrib/openpam/lib/Makefile.in +++ b/contrib/openpam/lib/Makefile.in @@ -15,7 +15,7 @@ @SET_MAKE@ -# $Id: Makefile.am 499 2011-11-22 11:51:50Z des $ +# $Id: Makefile.am 602 2012-04-15 17:31:15Z des $ VPATH = @srcdir@ @@ -76,11 +76,13 @@ am__objects_1 = am_libpam_la_OBJECTS = openpam_borrow_cred.lo \ openpam_check_owner_perms.lo openpam_configure.lo \ openpam_constants.lo openpam_dispatch.lo openpam_dynamic.lo \ - openpam_findenv.lo openpam_free_data.lo \ - openpam_free_envlist.lo openpam_get_option.lo openpam_load.lo \ - openpam_log.lo openpam_nullconv.lo openpam_readline.lo \ - openpam_restore_cred.lo openpam_set_option.lo \ - openpam_static.lo openpam_subst.lo openpam_ttyconv.lo \ + openpam_features.lo openpam_findenv.lo openpam_free_data.lo \ + openpam_free_envlist.lo openpam_get_feature.lo \ + openpam_get_option.lo openpam_load.lo openpam_log.lo \ + openpam_nullconv.lo openpam_readline.lo openpam_readlinev.lo \ + openpam_readword.lo openpam_restore_cred.lo \ + openpam_set_option.lo openpam_set_feature.lo openpam_static.lo \ + openpam_straddch.lo openpam_subst.lo openpam_ttyconv.lo \ pam_acct_mgmt.lo pam_authenticate.lo pam_chauthtok.lo \ pam_close_session.lo pam_end.lo pam_error.lo \ pam_get_authtok.lo pam_get_data.lo pam_get_item.lo \ @@ -234,8 +236,11 @@ INCLUDES = -I$(top_srcdir)/include lib_LTLIBRARIES = libpam.la noinst_HEADERS = \ openpam_constants.h \ + openpam_ctype.h \ openpam_debug.h \ + openpam_features.h \ openpam_impl.h \ + openpam_strlcat.h \ openpam_strlcmp.h \ openpam_strlcpy.h @@ -246,17 +251,23 @@ libpam_la_SOURCES = \ openpam_constants.c \ openpam_dispatch.c \ openpam_dynamic.c \ + openpam_features.c \ openpam_findenv.c \ openpam_free_data.c \ openpam_free_envlist.c \ + openpam_get_feature.c \ openpam_get_option.c \ openpam_load.c \ openpam_log.c \ openpam_nullconv.c \ openpam_readline.c \ + openpam_readlinev.c \ + openpam_readword.c \ openpam_restore_cred.c \ openpam_set_option.c \ + openpam_set_feature.c \ openpam_static.c \ + openpam_straddch.c \ openpam_subst.c \ openpam_ttyconv.c \ pam_acct_mgmt.c \ @@ -387,17 +398,23 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_constants.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_dispatch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_dynamic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_features.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_findenv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_free_data.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_free_envlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_get_feature.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_get_option.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_load.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_log.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_nullconv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_readline.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_readlinev.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_readword.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_restore_cred.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_set_feature.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_set_option.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_static.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_straddch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_subst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_ttyconv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_acct_mgmt.Plo@am__quote@ diff --git a/contrib/openpam/lib/openpam_check_owner_perms.c b/contrib/openpam/lib/openpam_check_owner_perms.c index 9d64ed6e8b3..d3b2ca98596 100644 --- a/contrib/openpam/lib/openpam_check_owner_perms.c +++ b/contrib/openpam/lib/openpam_check_owner_perms.c @@ -11,6 +11,9 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -24,7 +27,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_check_owner_perms.c 499 2011-11-22 11:51:50Z des $ + * $Id: openpam_check_owner_perms.c 543 2012-03-31 22:11:34Z des $ */ #ifdef HAVE_CONFIG_H @@ -67,6 +70,12 @@ openpam_check_desc_owner_perms(const char *name, int fd) errno = serrno; return (-1); } + if (!S_ISREG(sb.st_mode)) { + openpam_log(PAM_LOG_ERROR, + "%s: not a regular file", name); + errno = EINVAL; + return (-1); + } if ((sb.st_uid != root && sb.st_uid != arbitrator) || (sb.st_mode & (S_IWGRP|S_IWOTH)) != 0) { openpam_log(PAM_LOG_ERROR, @@ -84,7 +93,7 @@ openpam_check_desc_owner_perms(const char *name, int fd) * up to it are owned by either root or the arbitrator and that they are * not writable by group or other. * - * Note that openpam_check_file_owner_perms() should be used instead if + * Note that openpam_check_desc_owner_perms() should be used instead if * possible to avoid a race between the ownership / permission check and * the actual open(). */ @@ -95,8 +104,9 @@ openpam_check_path_owner_perms(const char *path) uid_t root, arbitrator; char pathbuf[PATH_MAX]; struct stat sb; - int len, serrno; + int len, serrno, tip; + tip = 1; root = 0; arbitrator = geteuid(); if (realpath(path, pathbuf) == NULL) @@ -111,6 +121,12 @@ openpam_check_path_owner_perms(const char *path) } return (-1); } + if (tip && !S_ISREG(sb.st_mode)) { + openpam_log(PAM_LOG_ERROR, + "%s: not a regular file", pathbuf); + errno = EINVAL; + return (-1); + } if ((sb.st_uid != root && sb.st_uid != arbitrator) || (sb.st_mode & (S_IWGRP|S_IWOTH)) != 0) { openpam_log(PAM_LOG_ERROR, @@ -120,6 +136,7 @@ openpam_check_path_owner_perms(const char *path) } while (--len > 0 && pathbuf[len] != '/') pathbuf[len] = '\0'; + tip = 0; } return (0); } diff --git a/contrib/openpam/lib/openpam_configure.c b/contrib/openpam/lib/openpam_configure.c index 66ee550265d..8172a6fdf11 100644 --- a/contrib/openpam/lib/openpam_configure.c +++ b/contrib/openpam/lib/openpam_configure.c @@ -1,6 +1,6 @@ /*- * Copyright (c) 2001-2003 Networks Associates Technology, Inc. - * Copyright (c) 2004-2011 Dag-Erling Smørgrav + * Copyright (c) 2004-2012 Dag-Erling Smørgrav * All rights reserved. * * This software was developed for the FreeBSD Project by ThinkSec AS and @@ -32,13 +32,15 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_configure.c 500 2011-11-22 12:07:03Z des $ + * $Id: openpam_configure.c 612 2012-05-26 23:02:55Z des $ */ #ifdef HAVE_CONFIG_H # include "config.h" #endif +#include + #include #include #include @@ -48,389 +50,183 @@ #include #include "openpam_impl.h" -#include "openpam_strlcmp.h" +#include "openpam_ctype.h" +#include "openpam_strlcat.h" +#include "openpam_strlcpy.h" static int openpam_load_chain(pam_handle_t *, const char *, pam_facility_t); /* - * Evaluates to non-zero if the argument is a linear whitespace character. - */ -#define is_lws(ch) \ - (ch == ' ' || ch == '\t') - -/* - * Evaluates to non-zero if the argument is a printable ASCII character. - * Assumes that the execution character set is a superset of ASCII. - */ -#define is_p(ch) \ - (ch >= '!' && ch <= '~') - -/* - * Returns non-zero if the argument belongs to the POSIX Portable Filename - * Character Set. Assumes that the execution character set is a superset - * of ASCII. - */ -#define is_pfcs(ch) \ - ((ch >= '0' && ch <= '9') || \ - (ch >= 'A' && ch <= 'Z') || \ - (ch >= 'a' && ch <= 'z') || \ - ch == '.' || ch == '_' || ch == '-') - -/* - * Parse the service name. + * Validate a service name. * - * Returns the length of the service name, or 0 if the end of the string - * was reached or a disallowed non-whitespace character was encountered. - * - * If parse_service_name() is successful, it updates *service to point to - * the first character of the service name and *line to point one - * character past the end. If it reaches the end of the string, it - * updates *line to point to the terminating NUL character and leaves - * *service unmodified. In all other cases, it leaves both *line and - * *service unmodified. - * - * Allowed characters are all characters in the POSIX portable filename - * character set. + * Returns a non-zero value if the argument points to a NUL-terminated + * string consisting entirely of characters in the POSIX portable filename + * character set, excluding the path separator character. */ static int -parse_service_name(char **line, char **service) +valid_service_name(const char *name) { - char *b, *e; + const char *p; - for (b = *line; *b && is_lws(*b); ++b) - /* nothing */ ; - if (!*b) { - *line = b; - return (0); + if (OPENPAM_FEATURE(RESTRICT_SERVICE_NAME)) { + /* path separator not allowed */ + for (p = name; *p != '\0'; ++p) + if (!is_pfcs(*p)) + return (0); + } else { + /* path separator allowed */ + for (p = name; *p != '\0'; ++p) + if (!is_pfcs(*p) && *p != '/') + return (0); } - for (e = b; *e && !is_lws(*e); ++e) - if (!is_pfcs(*e)) - return (0); - if (e == b) - return (0); - *line = e; - *service = b; - return (e - b); + return (1); } /* * Parse the facility name. * - * Returns the corresponding pam_facility_t value, or -1 if the end of the - * string was reached, a disallowed non-whitespace character was - * encountered, or the first word was not a recognized facility name. - * - * If parse_facility_name() is successful, it updates *line to point one - * character past the end of the facility name. If it reaches the end of - * the string, it updates *line to point to the terminating NUL character. - * In all other cases, it leaves *line unmodified. + * Returns the corresponding pam_facility_t value, or -1 if the argument + * is not a valid facility name. */ static pam_facility_t -parse_facility_name(char **line) +parse_facility_name(const char *name) { - char *b, *e; int i; - for (b = *line; *b && is_lws(*b); ++b) - /* nothing */ ; - if (!*b) { - *line = b; - return ((pam_facility_t)-1); - } - for (e = b; *e && !is_lws(*e); ++e) - /* nothing */ ; - if (e == b) - return ((pam_facility_t)-1); for (i = 0; i < PAM_NUM_FACILITIES; ++i) - if (strlcmp(pam_facility_name[i], b, e - b) == 0) - break; - if (i == PAM_NUM_FACILITIES) - return ((pam_facility_t)-1); - *line = e; - return (i); -} - -/* - * Parse the word "include". - * - * If the next word on the line is "include", parse_include() updates - * *line to point one character past "include" and returns 1. Otherwise, - * it leaves *line unmodified and returns 0. - */ -static int -parse_include(char **line) -{ - char *b, *e; - - for (b = *line; *b && is_lws(*b); ++b) - /* nothing */ ; - if (!*b) { - *line = b; - return (-1); - } - for (e = b; *e && !is_lws(*e); ++e) - /* nothing */ ; - if (e == b) - return (0); - if (strlcmp("include", b, e - b) != 0) - return (0); - *line = e; - return (1); + if (strcmp(pam_facility_name[i], name) == 0) + return (i); + return ((pam_facility_t)-1); } /* * Parse the control flag. * - * Returns the corresponding pam_control_t value, or -1 if the end of the - * string was reached, a disallowed non-whitespace character was - * encountered, or the first word was not a recognized control flag. - * - * If parse_control_flag() is successful, it updates *line to point one - * character past the end of the control flag. If it reaches the end of - * the string, it updates *line to point to the terminating NUL character. - * In all other cases, it leaves *line unmodified. + * Returns the corresponding pam_control_t value, or -1 if the argument is + * not a valid control flag name. */ static pam_control_t -parse_control_flag(char **line) +parse_control_flag(const char *name) { - char *b, *e; int i; - for (b = *line; *b && is_lws(*b); ++b) - /* nothing */ ; - if (!*b) { - *line = b; - return ((pam_control_t)-1); - } - for (e = b; *e && !is_lws(*e); ++e) - /* nothing */ ; - if (e == b) - return ((pam_control_t)-1); for (i = 0; i < PAM_NUM_CONTROL_FLAGS; ++i) - if (strlcmp(pam_control_flag_name[i], b, e - b) == 0) - break; - if (i == PAM_NUM_CONTROL_FLAGS) - return ((pam_control_t)-1); - *line = e; - return (i); + if (strcmp(pam_control_flag_name[i], name) == 0) + return (i); + return ((pam_control_t)-1); } /* - * Parse a file name. + * Validate a file name. * - * Returns the length of the file name, or 0 if the end of the string was - * reached or a disallowed non-whitespace character was encountered. - * - * If parse_filename() is successful, it updates *filename to point to the - * first character of the filename and *line to point one character past - * the end. If it reaches the end of the string, it updates *line to - * point to the terminating NUL character and leaves *filename unmodified. - * In all other cases, it leaves both *line and *filename unmodified. - * - * Allowed characters are all characters in the POSIX portable filename - * character set, plus the path separator (forward slash). + * Returns a non-zero value if the argument points to a NUL-terminated + * string consisting entirely of characters in the POSIX portable filename + * character set, including the path separator character. */ static int -parse_filename(char **line, char **filename) +valid_module_name(const char *name) { - char *b, *e; + const char *p; - for (b = *line; *b && is_lws(*b); ++b) - /* nothing */ ; - if (!*b) { - *line = b; - return (0); - } - for (e = b; *e && !is_lws(*e); ++e) - if (!is_pfcs(*e) && *e != '/') - return (0); - if (e == b) - return (0); - *line = e; - *filename = b; - return (e - b); -} - -/* - * Parse an option. - * - * Returns a dynamically allocated string containing the next module - * option, or NULL if the end of the string was reached or a disallowed - * non-whitespace character was encountered. - * - * If parse_option() is successful, it updates *line to point one - * character past the end of the option. If it reaches the end of the - * string, it updates *line to point to the terminating NUL character. In - * all other cases, it leaves *line unmodified. - * - * If parse_option() fails to allocate memory, it will return NULL and set - * errno to a non-zero value. - * - * Allowed characters for option names are all characters in the POSIX - * portable filename character set. Allowed characters for option values - * are any printable non-whitespace characters. The option value may be - * quoted in either single or double quotes, in which case space - * characters and whichever quote character was not used are allowed. - * Note that the entire value must be quoted, not just part of it. - */ -static char * -parse_option(char **line) -{ - char *nb, *ne, *vb, *ve; - unsigned char q = 0; - char *option; - size_t size; - - errno = 0; - for (nb = *line; *nb && is_lws(*nb); ++nb) - /* nothing */ ; - if (!*nb) { - *line = nb; - return (NULL); - } - for (ne = nb; *ne && !is_lws(*ne) && *ne != '='; ++ne) - if (!is_pfcs(*ne)) - return (NULL); - if (ne == nb) - return (NULL); - if (*ne == '=') { - vb = ne + 1; - if (*vb == '"' || *vb == '\'') - q = *vb++; - for (ve = vb; - *ve && *ve != q && (is_p(*ve) || (q && is_lws(*ve))); - ++ve) - /* nothing */ ; - if (q && *ve != q) - /* non-printable character or missing endquote */ - return (NULL); - if (q && *(ve + 1) && !is_lws(*(ve + 1))) - /* garbage after value */ - return (NULL); + if (OPENPAM_FEATURE(RESTRICT_MODULE_NAME)) { + /* path separator not allowed */ + for (p = name; *p != '\0'; ++p) + if (!is_pfcs(*p)) + return (0); } else { - vb = ve = ne; + /* path separator allowed */ + for (p = name; *p != '\0'; ++p) + if (!is_pfcs(*p) && *p != '/') + return (0); } - size = (ne - nb) + 1; - if (ve > vb) - size += (ve - vb) + 1; - if ((option = malloc(size)) == NULL) - return (NULL); - strncpy(option, nb, ne - nb); - if (ve > vb) { - option[ne - nb] = '='; - strncpy(option + (ne - nb) + 1, vb, ve - vb); - } - option[size - 1] = '\0'; - *line = q ? ve + 1 : ve; - return (option); -} - -/* - * Consume trailing whitespace. - * - * If there are no non-whitespace characters left on the line, parse_eol() - * updates *line to point at the terminating NUL character and returns 0. - * Otherwise, it leaves *line unmodified and returns a non-zero value. - */ -static int -parse_eol(char **line) -{ - char *p; - - for (p = *line; *p && is_lws(*p); ++p) - /* nothing */ ; - if (*p) - return ((unsigned char)*p); - *line = p; - return (0); + return (1); } typedef enum { pam_conf_style, pam_d_style } openpam_style_t; /* * Extracts given chains from a policy file. + * + * Returns the number of policy entries which were found for the specified + * service and facility, or -1 if a system error occurred or a syntax + * error was encountered. */ static int openpam_parse_chain(pam_handle_t *pamh, const char *service, pam_facility_t facility, + FILE *f, const char *filename, openpam_style_t style) { pam_chain_t *this, **next; pam_facility_t fclt; pam_control_t ctlf; - char *line0, *line, *str, *name; - char *option, **optv; - int len, lineno, ret; - FILE *f; + char *name, *servicename, *modulename; + int count, lineno, ret, serrno; + char **wordv, *word; + int i, wordc; - if ((f = fopen(filename, "r")) == NULL) { - openpam_log(errno == ENOENT ? PAM_LOG_DEBUG : PAM_LOG_NOTICE, - "%s: %m", filename); - return (PAM_SUCCESS); - } - if (openpam_check_desc_owner_perms(filename, fileno(f)) != 0) { - fclose(f); - return (PAM_SYSTEM_ERR); - } + count = 0; this = NULL; name = NULL; lineno = 0; - while ((line0 = line = openpam_readline(f, &lineno, NULL)) != NULL) { - /* get service name if necessary */ - if (style == pam_conf_style) { - if ((len = parse_service_name(&line, &str)) == 0) { - openpam_log(PAM_LOG_NOTICE, - "%s(%d): invalid service name (ignored)", - filename, lineno); - FREE(line0); - continue; - } - if (strlcmp(service, str, len) != 0) { - FREE(line0); - continue; - } + wordc = 0; + wordv = NULL; + while ((wordv = openpam_readlinev(f, &lineno, &wordc)) != NULL) { + /* blank line? */ + if (wordc == 0) { + FREEV(wordc, wordv); + continue; + } + i = 0; + + /* check service name if necessary */ + if (style == pam_conf_style && + strcmp(wordv[i++], service) != 0) { + FREEV(wordc, wordv); + continue; } - /* get facility name */ - if ((fclt = parse_facility_name(&line)) == (pam_facility_t)-1) { + /* check facility name */ + if ((word = wordv[i++]) == NULL || + (fclt = parse_facility_name(word)) == (pam_facility_t)-1) { openpam_log(PAM_LOG_ERROR, "%s(%d): missing or invalid facility", filename, lineno); goto fail; } if (facility != fclt && facility != PAM_FACILITY_ANY) { - FREE(line0); + FREEV(wordc, wordv); continue; } /* check for "include" */ - if (parse_include(&line)) { - if ((len = parse_service_name(&line, &str)) == 0) { + if ((word = wordv[i++]) != NULL && + strcmp(word, "include") == 0) { + if ((servicename = wordv[i++]) == NULL || + !valid_service_name(servicename)) { openpam_log(PAM_LOG_ERROR, - "%s(%d): missing or invalid filename", + "%s(%d): missing or invalid service name", filename, lineno); goto fail; } - if ((name = strndup(str, len)) == NULL) - goto syserr; - if (parse_eol(&line) != 0) { + if (wordv[i] != NULL) { openpam_log(PAM_LOG_ERROR, "%s(%d): garbage at end of line", filename, lineno); goto fail; } - ret = openpam_load_chain(pamh, name, fclt); - FREE(name); - if (ret != PAM_SUCCESS) + ret = openpam_load_chain(pamh, servicename, fclt); + FREEV(wordc, wordv); + if (ret < 0) goto fail; - FREE(line0); continue; } /* get control flag */ - if ((ctlf = parse_control_flag(&line)) == (pam_control_t)-1) { + if (word == NULL || /* same word we compared to "include" */ + (ctlf = parse_control_flag(word)) == (pam_control_t)-1) { openpam_log(PAM_LOG_ERROR, "%s(%d): missing or invalid control flag", filename, lineno); @@ -438,73 +234,78 @@ openpam_parse_chain(pam_handle_t *pamh, } /* get module name */ - if ((len = parse_filename(&line, &str)) == 0) { + if ((modulename = wordv[i++]) == NULL || + !valid_module_name(modulename)) { openpam_log(PAM_LOG_ERROR, "%s(%d): missing or invalid module name", filename, lineno); goto fail; } - if ((name = strndup(str, len)) == NULL) - goto syserr; /* allocate new entry */ if ((this = calloc(1, sizeof *this)) == NULL) goto syserr; this->flag = ctlf; - /* get module options */ - if ((this->optv = malloc(sizeof *optv)) == NULL) - goto syserr; - this->optc = 0; - while ((option = parse_option(&line)) != NULL) { - optv = realloc(this->optv, - (this->optc + 2) * sizeof *optv); - if (optv == NULL) - goto syserr; - this->optv = optv; - this->optv[this->optc++] = option; - } - this->optv[this->optc] = NULL; - if (*line != '\0') { - openpam_log(PAM_LOG_ERROR, - "%s(%d): syntax error in module options", - filename, lineno); - goto fail; - } - /* load module */ - this->module = openpam_load_module(name); - FREE(name); - if (this->module == NULL) + if ((this->module = openpam_load_module(modulename)) == NULL) goto fail; + /* + * The remaining items in wordv are the module's + * arguments. We could set this->optv = wordv + i, but + * then free(this->optv) wouldn't work. Instead, we free + * the words we've already consumed, shift the rest up, + * and clear the tail end of the array. + */ + this->optc = wordc - i; + for (i = 0; i < wordc - this->optc; ++i) { + FREE(wordv[i]); + } + for (i = 0; i < this->optc; ++i) { + wordv[i] = wordv[wordc - this->optc + i]; + wordv[wordc - this->optc + i] = NULL; + } + this->optv = wordv; + wordv = NULL; + wordc = 0; + /* hook it up */ for (next = &pamh->chains[fclt]; *next != NULL; next = &(*next)->next) /* nothing */ ; *next = this; this = NULL; - - /* next please... */ - FREE(line0); + ++count; } - if (!feof(f)) + /* + * The loop ended because openpam_readword() returned NULL, which + * can happen for four different reasons: an I/O error (ferror(f) + * is true), a memory allocation failure (ferror(f) is false, + * errno is non-zero) + */ + if (ferror(f) || errno != 0) goto syserr; + if (!feof(f)) + goto fail; fclose(f); - return (PAM_SUCCESS); + return (count); syserr: + serrno = errno; openpam_log(PAM_LOG_ERROR, "%s: %m", filename); + errno = serrno; + /* fall through */ fail: - if (this && this->optc) { - while (this->optc--) - FREE(this->optv[this->optc]); - FREE(this->optv); - } + serrno = errno; + if (this && this->optc && this->optv) + FREEV(this->optc, this->optv); FREE(this); - FREE(line); + FREEV(wordc, wordv); + FREE(wordv); FREE(name); fclose(f); - return (PAM_SYSTEM_ERR); + errno = serrno; + return (-1); } static const char *openpam_policy_path[] = { @@ -515,45 +316,111 @@ static const char *openpam_policy_path[] = { NULL }; +/* + * Read the specified chains from the specified file. + * + * Returns 0 if the file exists but does not contain any matching lines. + * + * Returns -1 and sets errno to ENOENT if the file does not exist. + * + * Returns -1 and sets errno to some other non-zero value if the file + * exists but is unsafe or unreadable, or an I/O error occurs. + */ +static int +openpam_load_file(pam_handle_t *pamh, + const char *service, + pam_facility_t facility, + const char *filename, + openpam_style_t style) +{ + FILE *f; + int ret, serrno; + + /* attempt to open the file */ + if ((f = fopen(filename, "r")) == NULL) { + serrno = errno; + openpam_log(errno == ENOENT ? PAM_LOG_DEBUG : PAM_LOG_ERROR, + "%s: %m", filename); + errno = serrno; + RETURNN(-1); + } else { + openpam_log(PAM_LOG_DEBUG, "found %s", filename); + } + + /* verify type, ownership and permissions */ + if (OPENPAM_FEATURE(VERIFY_POLICY_FILE) && + openpam_check_desc_owner_perms(filename, fileno(f)) != 0) { + /* already logged the cause */ + serrno = errno; + fclose(f); + errno = serrno; + RETURNN(-1); + } + + /* parse the file */ + ret = openpam_parse_chain(pamh, service, facility, + f, filename, style); + RETURNN(ret); +} + /* * Locates the policy file for a given service and reads the given chains * from it. + * + * Returns the number of policy entries which were found for the specified + * service and facility, or -1 if a system error occurred or a syntax + * error was encountered. */ static int openpam_load_chain(pam_handle_t *pamh, const char *service, pam_facility_t facility) { - const char **path; - char *filename; + const char *p, **path; + char filename[PATH_MAX]; size_t len; + openpam_style_t style; int ret; - /* don't allow to escape from policy_path */ - if (strchr(service, '/')) { - openpam_log(PAM_LOG_ERROR, "invalid service name: %s", - service); - return (-PAM_SYSTEM_ERR); + ENTERS(facility < 0 ? "any" : pam_facility_name[facility]); + + /* either absolute or relative to cwd */ + if (strchr(service, '/') != NULL) { + if ((p = strrchr(service, '.')) != NULL && strcmp(p, ".conf") == 0) + style = pam_conf_style; + else + style = pam_d_style; + ret = openpam_load_file(pamh, service, facility, + service, style); + RETURNN(ret); } + /* search standard locations */ for (path = openpam_policy_path; *path != NULL; ++path) { - len = strlen(*path); - if ((*path)[len - 1] == '/') { - if (asprintf(&filename, "%s%s", *path, service) < 0) { - openpam_log(PAM_LOG_ERROR, "asprintf(): %m"); - return (PAM_BUF_ERR); + /* construct filename */ + len = strlcpy(filename, *path, sizeof filename); + if (filename[len - 1] == '/') { + len = strlcat(filename, service, sizeof filename); + if (len >= sizeof filename) { + errno = ENAMETOOLONG; + RETURNN(-1); } - ret = openpam_parse_chain(pamh, service, facility, - filename, pam_d_style); - FREE(filename); + style = pam_d_style; } else { - ret = openpam_parse_chain(pamh, service, facility, - *path, pam_conf_style); + style = pam_conf_style; } - if (ret != PAM_SUCCESS) - return (ret); + ret = openpam_load_file(pamh, service, facility, + filename, style); + /* the file exists, but an error occurred */ + if (ret == -1 && errno != ENOENT) + RETURNN(ret); + /* in pam.d style, an empty file counts as a hit */ + if (ret == 0 && style == pam_d_style) + RETURNN(ret); } - return (PAM_SUCCESS); + + /* no hit */ + RETURNN(0); } /* @@ -567,25 +434,27 @@ openpam_configure(pam_handle_t *pamh, const char *service) { pam_facility_t fclt; - const char *p; + int serrno; - for (p = service; *p; ++p) - if (!is_pfcs(*p)) - return (PAM_SYSTEM_ERR); - - if (openpam_load_chain(pamh, service, PAM_FACILITY_ANY) != PAM_SUCCESS) + ENTERS(service); + if (!valid_service_name(service)) { + openpam_log(PAM_LOG_ERROR, "invalid service name"); + RETURNC(PAM_SYSTEM_ERR); + } + if (openpam_load_chain(pamh, service, PAM_FACILITY_ANY) < 0) goto load_err; - for (fclt = 0; fclt < PAM_NUM_FACILITIES; ++fclt) { if (pamh->chains[fclt] != NULL) continue; - if (openpam_load_chain(pamh, PAM_OTHER, fclt) != PAM_SUCCESS) + if (openpam_load_chain(pamh, PAM_OTHER, fclt) < 0) goto load_err; } - return (PAM_SUCCESS); + RETURNC(PAM_SUCCESS); load_err: + serrno = errno; openpam_clear_chains(pamh->chains); - return (PAM_SYSTEM_ERR); + errno = serrno; + RETURNC(PAM_SYSTEM_ERR); } /* diff --git a/contrib/openpam/lib/openpam_constants.h b/contrib/openpam/lib/openpam_constants.h index b92317938c1..a7d6ce8dd7d 100644 --- a/contrib/openpam/lib/openpam_constants.h +++ b/contrib/openpam/lib/openpam_constants.h @@ -11,6 +11,9 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -24,11 +27,11 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_constants.h 491 2011-11-12 00:12:32Z des $ + * $Id: openpam_constants.h 606 2012-04-20 11:06:38Z des $ */ -#ifndef OPENPAM_CONSTANTS_INCLUDED -#define OPENPAM_CONSTANTS_INCLUDED +#ifndef OPENPAM_CONSTANTS_H_INCLUDED +#define OPENPAM_CONSTANTS_H_INCLUDED extern const char *pam_err_name[PAM_NUM_ERRORS]; extern const char *pam_item_name[PAM_NUM_ITEMS]; diff --git a/contrib/openpam/lib/openpam_ctype.h b/contrib/openpam/lib/openpam_ctype.h new file mode 100644 index 00000000000..b3ec8468997 --- /dev/null +++ b/contrib/openpam/lib/openpam_ctype.h @@ -0,0 +1,68 @@ +/*- + * Copyright (c) 2012 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: openpam_ctype.h 578 2012-04-06 00:45:59Z des $ + */ + +#ifndef OPENPAM_CTYPE_H_INCLUDED +#define OPENPAM_CTYPE_H_INCLUDED + +/* + * Evaluates to non-zero if the argument is a linear whitespace character. + * For the purposes of this macro, the definition of linear whitespace is + * extended to include the form feed and carraige return characters. + */ +#define is_lws(ch) \ + (ch == ' ' || ch == '\t' || ch == '\f' || ch == '\r') + +/* + * Evaluates to non-zero if the argument is a whitespace character. + */ +#define is_ws(ch) \ + (is_lws(ch) || ch == '\n') + +/* + * Evaluates to non-zero if the argument is a printable ASCII character. + * Assumes that the execution character set is a superset of ASCII. + */ +#define is_p(ch) \ + (ch >= '!' && ch <= '~') + +/* + * Returns non-zero if the argument belongs to the POSIX Portable Filename + * Character Set. Assumes that the execution character set is a superset + * of ASCII. + */ +#define is_pfcs(ch) \ + ((ch >= '0' && ch <= '9') || \ + (ch >= 'A' && ch <= 'Z') || \ + (ch >= 'a' && ch <= 'z') || \ + ch == '.' || ch == '_' || ch == '-') + +#endif diff --git a/contrib/openpam/lib/openpam_debug.h b/contrib/openpam/lib/openpam_debug.h index ef2884d6825..050783e4936 100644 --- a/contrib/openpam/lib/openpam_debug.h +++ b/contrib/openpam/lib/openpam_debug.h @@ -32,60 +32,68 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_debug.h 491 2011-11-12 00:12:32Z des $ + * $Id: openpam_debug.h 606 2012-04-20 11:06:38Z des $ */ -#ifndef OPENPAM_DEBUG_INCLUDED -#define OPENPAM_DEBUG_INCLUDED +#ifndef OPENPAM_DEBUG_H_INCLUDED +#define OPENPAM_DEBUG_H_INCLUDED #ifdef OPENPAM_DEBUG -#define ENTER() openpam_log(PAM_LOG_DEBUG, "entering") +#define ENTER() openpam_log(PAM_LOG_LIBDEBUG, "entering") #define ENTERI(i) do { \ int i_ = (i); \ if (i_ > 0 && i_ < PAM_NUM_ITEMS) \ - openpam_log(PAM_LOG_DEBUG, "entering: %s", pam_item_name[i_]); \ + openpam_log(PAM_LOG_LIBDEBUG, "entering: %s", pam_item_name[i_]); \ else \ - openpam_log(PAM_LOG_DEBUG, "entering: %d", i_); \ + openpam_log(PAM_LOG_LIBDEBUG, "entering: %d", i_); \ } while (0) #define ENTERN(n) do { \ int n_ = (n); \ - openpam_log(PAM_LOG_DEBUG, "entering: %d", n_); \ + openpam_log(PAM_LOG_LIBDEBUG, "entering: %d", n_); \ } while (0) #define ENTERS(s) do { \ const char *s_ = (s); \ if (s_ == NULL) \ - openpam_log(PAM_LOG_DEBUG, "entering: NULL"); \ + openpam_log(PAM_LOG_LIBDEBUG, "entering: NULL"); \ else \ - openpam_log(PAM_LOG_DEBUG, "entering: '%s'", s_); \ + openpam_log(PAM_LOG_LIBDEBUG, "entering: '%s'", s_); \ } while (0) -#define RETURNV() openpam_log(PAM_LOG_DEBUG, "returning") +#define ENTERF(f) do { \ + int f_ = (f); \ + if (f_ >= 0 && f_ <= OPENPAM_NUM_FEATURES) \ + openpam_log(PAM_LOG_LIBDEBUG, "entering: %s", \ + openpam_features[f_].name); \ + else \ + openpam_log(PAM_LOG_LIBDEBUG, "entering: %d", f_); \ +} while (0) +#define RETURNV() openpam_log(PAM_LOG_LIBDEBUG, "returning") #define RETURNC(c) do { \ int c_ = (c); \ if (c_ >= 0 && c_ < PAM_NUM_ERRORS) \ - openpam_log(PAM_LOG_DEBUG, "returning %s", pam_err_name[c_]); \ + openpam_log(PAM_LOG_LIBDEBUG, "returning %s", pam_err_name[c_]); \ else \ - openpam_log(PAM_LOG_DEBUG, "returning %d!", c_); \ + openpam_log(PAM_LOG_LIBDEBUG, "returning %d!", c_); \ return (c_); \ } while (0) #define RETURNN(n) do { \ int n_ = (n); \ - openpam_log(PAM_LOG_DEBUG, "returning %d", n_); \ + openpam_log(PAM_LOG_LIBDEBUG, "returning %d", n_); \ return (n_); \ } while (0) #define RETURNP(p) do { \ - const void *p_ = (p); \ + void *p_ = (p); \ if (p_ == NULL) \ - openpam_log(PAM_LOG_DEBUG, "returning NULL"); \ + openpam_log(PAM_LOG_LIBDEBUG, "returning NULL"); \ else \ - openpam_log(PAM_LOG_DEBUG, "returning %p", p_); \ + openpam_log(PAM_LOG_LIBDEBUG, "returning %p", p_); \ return (p_); \ } while (0) #define RETURNS(s) do { \ const char *s_ = (s); \ if (s_ == NULL) \ - openpam_log(PAM_LOG_DEBUG, "returning NULL"); \ + openpam_log(PAM_LOG_LIBDEBUG, "returning NULL"); \ else \ - openpam_log(PAM_LOG_DEBUG, "returning '%s'", s_); \ + openpam_log(PAM_LOG_LIBDEBUG, "returning '%s'", s_); \ return (s_); \ } while (0) #else @@ -93,6 +101,7 @@ #define ENTERI(i) #define ENTERN(n) #define ENTERS(s) +#define ENTERF(f) #define RETURNV() return #define RETURNC(c) return (c) #define RETURNN(n) return (n) diff --git a/contrib/openpam/lib/openpam_dynamic.c b/contrib/openpam/lib/openpam_dynamic.c index d44174fbe8e..1dfc1ac43eb 100644 --- a/contrib/openpam/lib/openpam_dynamic.c +++ b/contrib/openpam/lib/openpam_dynamic.c @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_dynamic.c 502 2011-12-18 13:59:22Z des $ + * $Id: openpam_dynamic.c 607 2012-04-20 11:09:37Z des $ */ #ifdef HAVE_CONFIG_H @@ -40,6 +40,7 @@ #endif #include +#include #include #include #include @@ -60,15 +61,50 @@ * Perform sanity checks and attempt to load a module */ +#ifdef HAVE_FDLOPEN static void * try_dlopen(const char *modfn) { + void *dlh; + int fd; - if (openpam_check_path_owner_perms(modfn) != 0) + if ((fd = open(modfn, O_RDONLY)) < 0) return (NULL); - return (dlopen(modfn, RTLD_NOW)); + if (OPENPAM_FEATURE(VERIFY_MODULE_FILE) && + openpam_check_desc_owner_perms(modfn, fd) != 0) { + close(fd); + return (NULL); + } + if ((dlh = fdlopen(fd, RTLD_NOW)) == NULL) { + openpam_log(PAM_LOG_ERROR, "%s: %s", modfn, dlerror()); + close(fd); + errno = 0; + return (NULL); + } + close(fd); + return (dlh); } - +#else +static void * +try_dlopen(const char *modfn) +{ + int check_module_file; + void *dlh; + + openpam_get_feature(OPENPAM_VERIFY_MODULE_FILE, + &check_module_file); + if (check_module_file && + openpam_check_path_owner_perms(modfn) != 0) + return (NULL); + if ((dlh = dlopen(modfn, RTLD_NOW)) == NULL) { + openpam_log(PAM_LOG_ERROR, "%s: %s", modfn, dlerror()); + errno = 0; + return (NULL); + } + return (dlh); +} +#endif + /* * OpenPAM internal * @@ -100,9 +136,6 @@ openpam_dynamic(const char *path) *strrchr(vpath, '.') = '\0'; dlh = try_dlopen(vpath); } - serrno = errno; - FREE(vpath); - errno = serrno; if (dlh == NULL) goto err; if ((module = calloc(1, sizeof *module)) == NULL) @@ -112,19 +145,41 @@ openpam_dynamic(const char *path) module->dlh = dlh; dlmodule = dlsym(dlh, "_pam_module"); for (i = 0; i < PAM_NUM_PRIMITIVES; ++i) { - module->func[i] = dlmodule ? dlmodule->func[i] : - (pam_func_t)dlsym(dlh, pam_sm_func_name[i]); - if (module->func[i] == NULL) - openpam_log(PAM_LOG_DEBUG, "%s: %s(): %s", - path, pam_sm_func_name[i], dlerror()); + if (dlmodule) { + module->func[i] = dlmodule->func[i]; + } else { + module->func[i] = + (pam_func_t)dlsym(dlh, pam_sm_func_name[i]); + /* + * This openpam_log() call is a major source of + * log spam, and the cases that matter are caught + * and logged in openpam_dispatch(). This would + * be less problematic if dlerror() returned an + * error code so we could log an error only when + * dlsym() failed for a reason other than "no such + * symbol". + */ +#if 0 + if (module->func[i] == NULL) + openpam_log(PAM_LOG_DEBUG, "%s: %s(): %s", + path, pam_sm_func_name[i], dlerror()); +#endif + } } + FREE(vpath); return (module); buf_err: + serrno = errno; if (dlh != NULL) dlclose(dlh); FREE(module); + errno = serrno; err: - openpam_log(PAM_LOG_ERROR, "%m"); + serrno = errno; + if (errno != 0) + openpam_log(PAM_LOG_ERROR, "%s: %m", vpath); + FREE(vpath); + errno = serrno; return (NULL); } diff --git a/contrib/openpam/lib/openpam_features.c b/contrib/openpam/lib/openpam_features.c new file mode 100644 index 00000000000..586fc2a5730 --- /dev/null +++ b/contrib/openpam/lib/openpam_features.c @@ -0,0 +1,69 @@ +/*- + * Copyright (c) 2012 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: openpam_features.c 608 2012-05-17 16:00:13Z des $ + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "openpam_impl.h" + +#define STRUCT_OPENPAM_FEATURE(name, descr, dflt) \ + [OPENPAM_##name] = { \ + "OPENPAM_" #name, \ + descr, \ + dflt \ + } + +struct openpam_feature openpam_features[OPENPAM_NUM_FEATURES] = { + STRUCT_OPENPAM_FEATURE( + RESTRICT_SERVICE_NAME, + "Disallow path separators in service names", + 1 + ), + STRUCT_OPENPAM_FEATURE( + VERIFY_POLICY_FILE, + "Verify ownership and permissions of policy files", + 1 + ), + STRUCT_OPENPAM_FEATURE( + RESTRICT_MODULE_NAME, + "Disallow path separators in module names", + 0 + ), + STRUCT_OPENPAM_FEATURE( + VERIFY_MODULE_FILE, + "Verify ownership and permissions of module files", + 1 + ), +}; diff --git a/contrib/tcpdump/missing/resolv_ext.h b/contrib/openpam/lib/openpam_features.h similarity index 59% rename from contrib/tcpdump/missing/resolv_ext.h rename to contrib/openpam/lib/openpam_features.h index 92c531d860c..227b1a9f729 100644 --- a/contrib/tcpdump/missing/resolv_ext.h +++ b/contrib/openpam/lib/openpam_features.h @@ -1,23 +1,24 @@ -/* - * Copyright (C) 1999 WIDE Project. +/*- + * Copyright (c) 2012 Dag-Erling Smørgrav * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) @@ -25,25 +26,23 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $Id$ */ -#ifndef MAXRESOLVSORT /* XXX */ -#define MAXRESOLVSORT 10 /* number of net to sort on */ -#endif +#ifndef OPENPAM_FEATURES_H_INCLUDED +#define OPENPAM_FEATURES_H_INCLUDED -#ifndef HAVE_RES_STATE_EXT -struct __res_state_ext { - struct sockaddr_storage nsaddr_list[MAXNS]; - struct { - int af; /* address family for addr, mask */ - union { - struct in_addr ina; -#ifdef INET6 - struct in6_addr in6a; -#endif - } addr, mask; - } sort_list[MAXRESOLVSORT]; +struct openpam_feature { + const char *name; + const char *desc; + int onoff; }; -#endif -extern struct __res_state_ext _res_ext; +extern struct openpam_feature openpam_features[OPENPAM_NUM_FEATURES]; + +/* shortcut for internal use */ +#define OPENPAM_FEATURE(f) \ + openpam_features[OPENPAM_##f].onoff + +#endif diff --git a/contrib/openpam/lib/openpam_get_feature.c b/contrib/openpam/lib/openpam_get_feature.c new file mode 100644 index 00000000000..b552357c58d --- /dev/null +++ b/contrib/openpam/lib/openpam_get_feature.c @@ -0,0 +1,99 @@ +/*- + * Copyright (c) 2012 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: openpam_get_feature.c 608 2012-05-17 16:00:13Z des $ + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "openpam_impl.h" + +/* + * OpenPAM extension + * + * Query the state of an optional feature. + */ + +int +openpam_get_feature(int feature, int *onoff) +{ + + ENTERF(feature); + if (feature < 0 || feature >= OPENPAM_NUM_FEATURES) + RETURNC(PAM_SYMBOL_ERR); + *onoff = openpam_features[feature].onoff; + RETURNC(PAM_SUCCESS); +} + +/* + * Error codes: + * + * PAM_SYMBOL_ERR + */ + +/** + * EXPERIMENTAL + * + * The =openpam_get_feature function stores the current state of the + * specified feature in the variable pointed to by its =onoff argument. + * + * The following features are recognized: + * + * =OPENPAM_RESTRICT_SERVICE_NAME: + * Disallow path separators in service names. + * This feature is enabled by default. + * Disabling it allows the application to specify the path to + * the desired policy file directly. + * + * =OPENPAM_VERIFY_POLICY_FILE: + * Verify the ownership and permissions of the policy file + * and the path leading up to it. + * This feature is enabled by default. + * + * =OPENPAM_RESTRICT_MODULE_NAME: + * Disallow path separators in module names. + * This feature is disabled by default. + * Enabling it prevents the use of modules in non-standard + * locations. + * + * =OPENPAM_VERIFY_MODULE_FILE: + * Verify the ownership and permissions of each loadable + * module and the path leading up to it. + * This feature is enabled by default. + * + * + * >openpam_set_feature + * + * AUTHOR DES + */ diff --git a/contrib/openpam/lib/openpam_get_option.c b/contrib/openpam/lib/openpam_get_option.c index b5faa878fd4..1f62d218ebf 100644 --- a/contrib/openpam/lib/openpam_get_option.c +++ b/contrib/openpam/lib/openpam_get_option.c @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_get_option.c 482 2011-11-03 16:33:02Z des $ + * $Id: openpam_get_option.c 531 2012-03-31 14:24:37Z des $ */ #ifdef HAVE_CONFIG_H @@ -44,7 +44,6 @@ #include #include -#include #include "openpam_impl.h" diff --git a/contrib/openpam/lib/openpam_impl.h b/contrib/openpam/lib/openpam_impl.h index ba4d45558a9..9e8b45f6d55 100644 --- a/contrib/openpam/lib/openpam_impl.h +++ b/contrib/openpam/lib/openpam_impl.h @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_impl.h 499 2011-11-22 11:51:50Z des $ + * $Id: openpam_impl.h 594 2012-04-14 14:18:41Z des $ */ #ifndef OPENPAM_IMPL_H_INCLUDED @@ -157,9 +157,23 @@ pam_module_t *openpam_static(const char *); #endif pam_module_t *openpam_dynamic(const char *); -#define FREE(p) do { free((p)); (p) = NULL; } while (0) +#define FREE(p) \ + do { \ + free(p); \ + (p) = NULL; \ + } while (0) + +#define FREEV(c, v) \ + do { \ + while (c) { \ + --(c); \ + FREE((v)[(c)]); \ + } \ + FREE(v); \ + } while (0) #include "openpam_constants.h" #include "openpam_debug.h" +#include "openpam_features.h" #endif diff --git a/contrib/openpam/lib/openpam_load.c b/contrib/openpam/lib/openpam_load.c index 0eb8ea7d9c2..871d1a8c057 100644 --- a/contrib/openpam/lib/openpam_load.c +++ b/contrib/openpam/lib/openpam_load.c @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_load.c 491 2011-11-12 00:12:32Z des $ + * $Id: openpam_load.c 547 2012-04-01 15:01:21Z des $ */ #ifdef HAVE_CONFIG_H @@ -108,9 +108,7 @@ openpam_destroy_chain(pam_chain_t *chain) return; openpam_destroy_chain(chain->next); chain->next = NULL; - while (chain->optc--) - FREE(chain->optv[chain->optc]); - FREE(chain->optv); + FREEV(chain->optc, chain->optv); openpam_release_module(chain->module); chain->module = NULL; FREE(chain); diff --git a/contrib/openpam/lib/openpam_log.c b/contrib/openpam/lib/openpam_log.c index 9e3d28b5b42..2b89f6c6d7d 100644 --- a/contrib/openpam/lib/openpam_log.c +++ b/contrib/openpam/lib/openpam_log.c @@ -32,18 +32,17 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_log.c 437 2011-09-13 12:00:13Z des $ + * $Id: openpam_log.c 544 2012-03-31 22:47:15Z des $ */ #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include +#include #include #include #include -#include #include #include @@ -71,6 +70,7 @@ openpam_log(int level, const char *fmt, ...) int priority; switch (level) { + case PAM_LOG_LIBDEBUG: case PAM_LOG_DEBUG: if (!openpam_debug) return; @@ -100,8 +100,10 @@ _openpam_log(int level, const char *func, const char *fmt, ...) va_list ap; char *format; int priority; + int serrno; switch (level) { + case PAM_LOG_LIBDEBUG: case PAM_LOG_DEBUG: if (!openpam_debug) return; @@ -119,10 +121,13 @@ _openpam_log(int level, const char *func, const char *fmt, ...) break; } va_start(ap, fmt); + serrno = errno; if (asprintf(&format, "in %s(): %s", func, fmt) > 0) { + errno = serrno; vsyslog(priority, format, ap); FREE(format); } else { + errno = serrno; vsyslog(priority, fmt, ap); } va_end(ap); @@ -137,6 +142,9 @@ _openpam_log(int level, const char *func, const char *fmt, ...) * The =level argument indicates the importance of the message. * The following levels are defined: * + * =PAM_LOG_LIBDEBUG: + * Debugging messages. + * For internal use only. * =PAM_LOG_DEBUG: * Debugging messages. * These messages are normally not logged unless the global diff --git a/contrib/openpam/lib/openpam_readline.c b/contrib/openpam/lib/openpam_readline.c index 9cc8cc107c4..014acfb2c1c 100644 --- a/contrib/openpam/lib/openpam_readline.c +++ b/contrib/openpam/lib/openpam_readline.c @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_readline.c 473 2011-11-03 10:48:25Z des $ + * $Id: openpam_readline.c 596 2012-04-14 14:52:40Z des $ */ #ifdef HAVE_CONFIG_H @@ -44,6 +44,7 @@ #include #include + #include "openpam_impl.h" #define MIN_LINE_LENGTH 128 @@ -61,22 +62,11 @@ openpam_readline(FILE *f, int *lineno, size_t *lenp) size_t len, size; int ch; - if ((line = malloc(MIN_LINE_LENGTH)) == NULL) + if ((line = malloc(size = MIN_LINE_LENGTH)) == NULL) { + openpam_log(PAM_LOG_ERROR, "malloc(): %m"); return (NULL); - size = MIN_LINE_LENGTH; + } len = 0; - -#define line_putch(ch) do { \ - if (len >= size - 1) { \ - char *tmp = realloc(line, size *= 2); \ - if (tmp == NULL) \ - goto fail; \ - line = tmp; \ - } \ - line[len++] = ch; \ - line[len] = '\0'; \ -} while (0) - for (;;) { ch = fgetc(f); /* strip comment */ @@ -105,26 +95,15 @@ openpam_readline(FILE *f, int *lineno, size_t *lenp) /* done */ break; } - /* whitespace */ - if (isspace(ch)) { - /* ignore leading whitespace */ - /* collapse linear whitespace */ - if (len > 0 && line[len - 1] != ' ') - line_putch(' '); - continue; - } /* anything else */ - line_putch(ch); + if (openpam_straddch(&line, &size, &len, ch) != 0) + goto fail; } - - /* remove trailing whitespace */ - while (len > 0 && isspace((unsigned char)line[len - 1])) - --len; - line[len] = '\0'; if (len == 0) goto fail; if (lenp != NULL) *lenp = len; + openpam_log(PAM_LOG_LIBDEBUG, "returning '%s'", line); return (line); fail: FREE(line); @@ -132,16 +111,18 @@ fail: } /** + * DEPRECATED openpam_readlinev + * * The =openpam_readline function reads a line from a file, and returns it - * in a NUL-terminated buffer allocated with =malloc. + * in a NUL-terminated buffer allocated with =!malloc. * * The =openpam_readline function performs a certain amount of processing * on the data it reads: * - * - Comments (introduced by a hash sign) are stripped, as is leading and - * trailing whitespace. - * - Any amount of linear whitespace is collapsed to a single space. + * - Comments (introduced by a hash sign) are stripped. + * * - Blank lines are ignored. + * * - If a line ends in a backslash, the backslash is stripped and the * next line is appended. * @@ -152,5 +133,8 @@ fail: * terminating NUL character) is stored in the variable it points to. * * The caller is responsible for releasing the returned buffer by passing - * it to =free. + * it to =!free. + * + * >openpam_readlinev + * >openpam_readword */ diff --git a/contrib/openpam/lib/openpam_readlinev.c b/contrib/openpam/lib/openpam_readlinev.c new file mode 100644 index 00000000000..5a43b61f36f --- /dev/null +++ b/contrib/openpam/lib/openpam_readlinev.c @@ -0,0 +1,156 @@ +/*- + * Copyright (c) 2012 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: openpam_readlinev.c 588 2012-04-08 11:52:25Z des $ + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include + +#include "openpam_impl.h" + +#define MIN_WORDV_SIZE 32 + +/* + * OpenPAM extension + * + * Read a line from a file and split it into words. + */ + +char ** +openpam_readlinev(FILE *f, int *lineno, int *lenp) +{ + char *word, **wordv, **tmp; + size_t wordlen, wordvsize; + int ch, serrno, wordvlen; + + wordvsize = MIN_WORDV_SIZE; + wordvlen = 0; + if ((wordv = malloc(wordvsize * sizeof *wordv)) == NULL) { + openpam_log(PAM_LOG_ERROR, "malloc(): %m"); + errno = ENOMEM; + return (NULL); + } + wordv[wordvlen] = NULL; + while ((word = openpam_readword(f, lineno, &wordlen)) != NULL) { + if ((unsigned int)wordvlen + 1 >= wordvsize) { + /* need to expand the array */ + wordvsize *= 2; + tmp = realloc(wordv, wordvsize * sizeof *wordv); + if (tmp == NULL) { + openpam_log(PAM_LOG_ERROR, "malloc(): %m"); + errno = ENOMEM; + break; + } + wordv = tmp; + } + /* insert our word */ + wordv[wordvlen++] = word; + wordv[wordvlen] = NULL; + } + if (errno != 0) { + /* I/O error or out of memory */ + serrno = errno; + while (wordvlen--) + free(wordv[wordvlen]); + free(wordv); + errno = serrno; + return (NULL); + } + /* assert(!ferror(f)) */ + ch = fgetc(f); + /* assert(ch == EOF || ch == '\n') */ + if (ch == EOF && wordvlen == 0) { + free(wordv); + return (NULL); + } + if (ch == '\n' && lineno != NULL) + ++*lineno; + if (lenp != NULL) + *lenp = wordvlen; + return (wordv); +} + +/** + * The =openpam_readlinev function reads a line from a file, splits it + * into words according to the rules described in the =openpam_readword + * manual page, and returns a list of those words. + * + * If =lineno is not =NULL, the integer variable it points to is + * incremented every time a newline character is read. + * This includes quoted or escaped newline characters and the newline + * character at the end of the line. + * + * If =lenp is not =NULL, the number of words on the line is stored in the + * variable to which it points. + * + * RETURN VALUES + * + * If successful, the =openpam_readlinev function returns a pointer to a + * dynamically allocated array of pointers to individual dynamically + * allocated NUL-terminated strings, each containing a single word, in the + * order in which they were encountered on the line. + * The array is terminated by a =NULL pointer. + * + * The caller is responsible for freeing both the array and the individual + * strings by passing each of them to =!free. + * + * If the end of the line was reached before any words were read, + * =openpam_readlinev returns a pointer to a dynamically allocated array + * containing a single =NULL pointer. + * + * The =openpam_readlinev function can fail and return =NULL for one of + * four reasons: + * + * - The end of the file was reached before any words were read; :errno is + * zero, =!ferror returns zero, and =!feof returns a non-zero value. + * + * - The end of the file was reached while a quote or backslash escape + * was in effect; :errno is set to =EINVAL, =!ferror returns zero, and + * =!feof returns a non-zero value. + * + * - An error occurred while reading from the file; :errno is non-zero, + * =!ferror returns a non-zero value and =!feof returns zero. + * + * - A =!malloc or =!realloc call failed; :errno is set to =ENOMEM, + * =!ferror returns a non-zero value, and =!feof may or may not return + * a non-zero value. + * + * >openpam_readline + * >openpam_readword + * + * AUTHOR DES + */ diff --git a/contrib/openpam/lib/openpam_readword.c b/contrib/openpam/lib/openpam_readword.c new file mode 100644 index 00000000000..74a4d462ce4 --- /dev/null +++ b/contrib/openpam/lib/openpam_readword.c @@ -0,0 +1,207 @@ +/*- + * Copyright (c) 2012 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: openpam_readword.c 588 2012-04-08 11:52:25Z des $ + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include + +#include "openpam_impl.h" +#include "openpam_ctype.h" + +#define MIN_WORD_SIZE 32 + +/* + * OpenPAM extension + * + * Read a word from a file, respecting shell quoting rules. + */ + +char * +openpam_readword(FILE *f, int *lineno, size_t *lenp) +{ + char *word; + size_t size, len; + int ch, comment, escape, quote; + int serrno; + + errno = 0; + + /* skip initial whitespace */ + comment = 0; + while ((ch = getc(f)) != EOF && ch != '\n') { + if (ch == '#') + comment = 1; + if (!is_lws(ch) && !comment) + break; + } + if (ch == EOF) + return (NULL); + ungetc(ch, f); + if (ch == '\n') + return (NULL); + + word = NULL; + size = len = 0; + escape = quote = 0; + while ((ch = fgetc(f)) != EOF && (!is_ws(ch) || quote || escape)) { + if (ch == '\\' && !escape && quote != '\'') { + /* escape next character */ + escape = ch; + } else if ((ch == '\'' || ch == '"') && !quote && !escape) { + /* begin quote */ + quote = ch; + /* edge case: empty quoted string */ + if (word == NULL && (word = malloc(1)) == NULL) { + openpam_log(PAM_LOG_ERROR, "malloc(): %m"); + errno = ENOMEM; + return (NULL); + } + *word = '\0'; + size = 1; + } else if (ch == quote && !escape) { + /* end quote */ + quote = 0; + } else if (ch == '\n' && escape && quote != '\'') { + /* line continuation */ + escape = 0; + } else { + if (escape && quote && ch != '\\' && ch != quote && + openpam_straddch(&word, &size, &len, '\\') != 0) { + free(word); + errno = ENOMEM; + return (NULL); + } + if (openpam_straddch(&word, &size, &len, ch) != 0) { + free(word); + errno = ENOMEM; + return (NULL); + } + escape = 0; + } + if (lineno != NULL && ch == '\n') + ++*lineno; + } + if (ch == EOF && ferror(f)) { + serrno = errno; + free(word); + errno = serrno; + return (NULL); + } + if (ch == EOF && (escape || quote)) { + /* Missing escaped character or closing quote. */ + openpam_log(PAM_LOG_ERROR, "unexpected end of file"); + free(word); + errno = EINVAL; + return (NULL); + } + ungetc(ch, f); + if (lenp != NULL) + *lenp = len; + return (word); +} + +/** + * The =openpam_readword function reads the next word from a file, and + * returns it in a NUL-terminated buffer allocated with =!malloc. + * + * A word is a sequence of non-whitespace characters. + * However, whitespace characters can be included in a word if quoted or + * escaped according to the following rules: + * + * - An unescaped single or double quote introduces a quoted string, + * which ends when the same quote character is encountered a second + * time. + * The quotes themselves are stripped. + * + * - Within a single- or double-quoted string, all whitespace characters, + * including the newline character, are preserved as-is. + * + * - Outside a quoted string, a backslash escapes the next character, + * which is preserved as-is, unless that character is a newline, in + * which case it is discarded and reading continues at the beginning of + * the next line as if the backslash and newline had not been there. + * In all cases, the backslash itself is discarded. + * + * - Within a single-quoted string, double quotes and backslashes are + * preserved as-is. + * + * - Within a double-quoted string, a single quote is preserved as-is, + * and a backslash is preserved as-is unless used to escape a double + * quote. + * + * In addition, if the first non-whitespace character on the line is a + * hash character (#), the rest of the line is discarded. + * If a hash character occurs within a word, however, it is preserved + * as-is. + * A backslash at the end of a comment does cause line continuation. + * + * If =lineno is not =NULL, the integer variable it points to is + * incremented every time a quoted or escaped newline character is read. + * + * If =lenp is not =NULL, the length of the word (after quotes and + * backslashes have been removed) is stored in the variable it points to. + * + * RETURN VALUES + * + * If successful, the =openpam_readword function returns a pointer to a + * dynamically allocated NUL-terminated string containing the first word + * encountered on the line. + * + * The caller is responsible for releasing the returned buffer by passing + * it to =!free. + * + * If =openpam_readword reaches the end of the line or file before any + * characters are copied to the word, it returns =NULL. In the former + * case, the newline is pushed back to the file. + * + * If =openpam_readword reaches the end of the file while a quote or + * backslash escape is in effect, it sets :errno to =EINVAL and returns + * =NULL. + * + * IMPLEMENTATION NOTES + * + * The parsing rules are intended to be equivalent to the normal POSIX + * shell quoting rules. + * Any discrepancy is a bug and should be reported to the author along + * with sample input that can be used to reproduce the error. + * + * >openpam_readline + * >openpam_readlinev + * + * AUTHOR DES + */ diff --git a/contrib/openpam/lib/openpam_set_feature.c b/contrib/openpam/lib/openpam_set_feature.c new file mode 100644 index 00000000000..4f6a4a5c92c --- /dev/null +++ b/contrib/openpam/lib/openpam_set_feature.c @@ -0,0 +1,75 @@ +/*- + * Copyright (c) 2012 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: openpam_set_feature.c 608 2012-05-17 16:00:13Z des $ + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "openpam_impl.h" + +/* + * OpenPAM extension + * + * Enable or disable an optional feature. + */ + +int +openpam_set_feature(int feature, int onoff) +{ + + ENTERF(feature); + if (feature < 0 || feature >= OPENPAM_NUM_FEATURES) + RETURNC(PAM_SYMBOL_ERR); + openpam_features[feature].onoff = onoff; + RETURNC(PAM_SUCCESS); +} + +/* + * Error codes: + * + * PAM_SYMBOL_ERR + */ + +/** + * EXPERIMENTAL + * + * The =openpam_set_feature function sets the state of the specified + * feature to the value specified by the =onoff argument. + * See =openpam_get_feature for a list of recognized features. + * + * >openpam_get_feature + * + * AUTHOR DES + */ diff --git a/contrib/openpam/lib/openpam_set_option.c b/contrib/openpam/lib/openpam_set_option.c index c7cb1c7c416..1712a718ec4 100644 --- a/contrib/openpam/lib/openpam_set_option.c +++ b/contrib/openpam/lib/openpam_set_option.c @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_set_option.c 482 2011-11-03 16:33:02Z des $ + * $Id: openpam_set_option.c 532 2012-03-31 14:24:53Z des $ */ #ifdef HAVE_CONFIG_H @@ -46,7 +46,6 @@ #include #include -#include #include "openpam_impl.h" diff --git a/contrib/openpam/lib/openpam_straddch.c b/contrib/openpam/lib/openpam_straddch.c new file mode 100644 index 00000000000..9845cc610a9 --- /dev/null +++ b/contrib/openpam/lib/openpam_straddch.c @@ -0,0 +1,111 @@ +/*- + * Copyright (c) 2012 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: openpam_straddch.c 568 2012-04-05 14:35:53Z des $ + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include + +#include "openpam_impl.h" + +#define MIN_STR_SIZE 32 + +/* + * OpenPAM extension + * + * Add a character to a string, expanding the buffer if needed. + */ + +int +openpam_straddch(char **str, size_t *size, size_t *len, int ch) +{ + size_t tmpsize; + char *tmpstr; + + if (*str == NULL) { + /* initial allocation */ + tmpsize = MIN_STR_SIZE; + if ((tmpstr = malloc(tmpsize)) == NULL) { + openpam_log(PAM_LOG_ERROR, "malloc(): %m"); + errno = ENOMEM; + return (-1); + } + *str = tmpstr; + *size = tmpsize; + *len = 0; + } else if (*len + 1 >= *size) { + /* additional space required */ + tmpsize = *size * 2; + if ((tmpstr = realloc(*str, tmpsize)) == NULL) { + openpam_log(PAM_LOG_ERROR, "realloc(): %m"); + errno = ENOMEM; + return (-1); + } + *size = tmpsize; + *str = tmpstr; + } + (*str)[*len] = ch; + ++*len; + (*str)[*len] = '\0'; + return (0); +} + +/** + * The =openpam_straddch function appends a character to a dynamically + * allocated NUL-terminated buffer, reallocating the buffer as needed. + * + * The =str argument points to a variable containing either a pointer to + * an existing buffer or =NULL. + * If the value of the variable pointed to by =str is =NULL, a new buffer + * is allocated. + * + * The =size and =len argument point to variables used to hold the size + * of the buffer and the length of the string it contains, respectively. + * + * If a new buffer is allocated or an existing buffer is reallocated to + * make room for the additional character, =str and =size are updated + * accordingly. + * + * The =openpam_straddch function ensures that the buffer is always + * NUL-terminated. + * + * If the =openpam_straddch function is successful, it increments the + * integer variable pointed to by =len and returns 0. + * Otherwise, it leaves the variables pointed to by =str, =size and =len + * unmodified, sets :errno to =ENOMEM and returns -1. + * + * AUTHOR DES + */ diff --git a/contrib/openpam/lib/openpam_strlcat.h b/contrib/openpam/lib/openpam_strlcat.h new file mode 100644 index 00000000000..1f266936be4 --- /dev/null +++ b/contrib/openpam/lib/openpam_strlcat.h @@ -0,0 +1,54 @@ +/*- + * Copyright (c) 2011 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: openpam_strlcat.h 578 2012-04-06 00:45:59Z des $ + */ + +#ifndef OPENPAM_STRLCAT_H_INCLUDED +#define OPENPAM_STRLCAT_H_INCLUDED + +#ifndef HAVE_STRLCAT +/* like strcat(3), but always NUL-terminates; returns strlen(src) */ +static size_t +strlcat(char *dst, const char *src, size_t size) +{ + size_t len; + + for (len = 0; *dst && size > 1; ++len, --size) + dst++; + for (; *src && size > 1; ++len, --size) + *dst++ = *src++; + *dst = '\0'; + while (*src) + ++len, ++src; + return (len); +} +#endif + +#endif diff --git a/contrib/openpam/lib/openpam_strlcmp.h b/contrib/openpam/lib/openpam_strlcmp.h index c692225d7f8..2a78e0f6766 100644 --- a/contrib/openpam/lib/openpam_strlcmp.h +++ b/contrib/openpam/lib/openpam_strlcmp.h @@ -11,6 +11,9 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -24,7 +27,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_strlcmp.h 475 2011-11-03 15:29:24Z des $ + * $Id: openpam_strlcmp.h 578 2012-04-06 00:45:59Z des $ */ #ifndef OPENPAM_STRLCMP_H_INCLUDED diff --git a/contrib/openpam/lib/openpam_strlcpy.h b/contrib/openpam/lib/openpam_strlcpy.h index 921653b6e9c..9c655483483 100644 --- a/contrib/openpam/lib/openpam_strlcpy.h +++ b/contrib/openpam/lib/openpam_strlcpy.h @@ -11,6 +11,9 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -24,7 +27,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_strlcpy.h 492 2011-11-20 02:04:17Z des $ + * $Id: openpam_strlcpy.h 578 2012-04-06 00:45:59Z des $ */ #ifndef OPENPAM_STRLCPY_H_INCLUDED @@ -32,7 +35,7 @@ #ifndef HAVE_STRLCPY /* like strcpy(3), but always NUL-terminates; returns strlen(src) */ -size_t +static size_t strlcpy(char *dst, const char *src, size_t size) { size_t len; diff --git a/contrib/openpam/lib/openpam_subst.c b/contrib/openpam/lib/openpam_subst.c index d54b8270daf..bab7a785faa 100644 --- a/contrib/openpam/lib/openpam_subst.c +++ b/contrib/openpam/lib/openpam_subst.c @@ -11,6 +11,9 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -24,7 +27,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_subst.c 461 2011-11-02 14:00:38Z des $ + * $Id: openpam_subst.c 543 2012-03-31 22:11:34Z des $ */ #ifdef HAVE_CONFIG_H diff --git a/contrib/openpam/lib/openpam_ttyconv.c b/contrib/openpam/lib/openpam_ttyconv.c index ec078f41804..14a324d59ed 100644 --- a/contrib/openpam/lib/openpam_ttyconv.c +++ b/contrib/openpam/lib/openpam_ttyconv.c @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: openpam_ttyconv.c 437 2011-09-13 12:00:13Z des $ + * $Id: openpam_ttyconv.c 527 2012-02-26 03:23:59Z des $ */ #ifdef HAVE_CONFIG_H @@ -69,17 +69,17 @@ prompt(const char *msg) { char buf[PAM_MAX_RESP_SIZE]; struct sigaction action, saved_action; - sigset_t saved_sigset, sigset; + sigset_t saved_sigset, the_sigset; unsigned int saved_alarm; int eof, error, fd; size_t len; char *retval; char ch; - sigemptyset(&sigset); - sigaddset(&sigset, SIGINT); - sigaddset(&sigset, SIGTSTP); - sigprocmask(SIG_SETMASK, &sigset, &saved_sigset); + sigemptyset(&the_sigset); + sigaddset(&the_sigset, SIGINT); + sigaddset(&the_sigset, SIGTSTP); + sigprocmask(SIG_SETMASK, &the_sigset, &saved_sigset); action.sa_handler = &timeout; action.sa_flags = 0; sigemptyset(&action.sa_mask); diff --git a/contrib/openpam/lib/pam_get_authtok.c b/contrib/openpam/lib/pam_get_authtok.c index a0613eff9cb..1a3aebc8109 100644 --- a/contrib/openpam/lib/pam_get_authtok.c +++ b/contrib/openpam/lib/pam_get_authtok.c @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: pam_get_authtok.c 455 2011-10-29 18:31:11Z des $ + * $Id: pam_get_authtok.c 510 2011-12-31 13:14:23Z des $ */ #ifdef HAVE_CONFIG_H @@ -50,6 +50,7 @@ #include "openpam_impl.h" static const char authtok_prompt[] = "Password:"; +static const char authtok_prompt_remote[] = "Password for %u@%h:"; static const char oldauthtok_prompt[] = "Old Password:"; static const char newauthtok_prompt[] = "New Password:"; @@ -69,6 +70,7 @@ pam_get_authtok(pam_handle_t *pamh, size_t prompt_size; const void *oldauthtok, *prevauthtok, *promptp; const char *prompt_option, *default_prompt; + const void *lhost, *rhost; char *resp, *resp2; int pitem, r, style, twice; @@ -82,6 +84,14 @@ pam_get_authtok(pam_handle_t *pamh, pitem = PAM_AUTHTOK_PROMPT; prompt_option = "authtok_prompt"; default_prompt = authtok_prompt; + r = pam_get_item(pamh, PAM_RHOST, &rhost); + if (r == PAM_SUCCESS && rhost != NULL) { + r = pam_get_item(pamh, PAM_HOST, &lhost); + if (r == PAM_SUCCESS && lhost != NULL) { + if (strcmp(rhost, lhost) != 0) + default_prompt = authtok_prompt_remote; + } + } r = pam_get_item(pamh, PAM_OLDAUTHTOK, &oldauthtok); if (r == PAM_SUCCESS && oldauthtok != NULL) { default_prompt = newauthtok_prompt; diff --git a/contrib/openpam/lib/pam_putenv.c b/contrib/openpam/lib/pam_putenv.c index 369066d8ea9..e1f0bc35e29 100644 --- a/contrib/openpam/lib/pam_putenv.c +++ b/contrib/openpam/lib/pam_putenv.c @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: pam_putenv.c 437 2011-09-13 12:00:13Z des $ + * $Id: pam_putenv.c 539 2012-03-31 20:53:22Z des $ */ #ifdef HAVE_CONFIG_H @@ -102,7 +102,7 @@ pam_putenv(pam_handle_t *pamh, */ /** - * The =pam_putenv function sets a environment variable. + * The =pam_putenv function sets an environment variable. * Its semantics are similar to those of =putenv, but it modifies the PAM * context's environment list instead of the application's. * diff --git a/contrib/openpam/lib/pam_setenv.c b/contrib/openpam/lib/pam_setenv.c index fbe6a8f1b6f..6fd4c1001e8 100644 --- a/contrib/openpam/lib/pam_setenv.c +++ b/contrib/openpam/lib/pam_setenv.c @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: pam_setenv.c 437 2011-09-13 12:00:13Z des $ + * $Id: pam_setenv.c 539 2012-03-31 20:53:22Z des $ */ #ifdef HAVE_CONFIG_H @@ -92,7 +92,7 @@ pam_setenv(pam_handle_t *pamh, */ /** - * The =pam_setenv function sets a environment variable. + * The =pam_setenv function sets an environment variable. * Its semantics are similar to those of =setenv, but it modifies the PAM * context's environment list instead of the application's. * diff --git a/contrib/openpam/ltmain.sh b/contrib/openpam/ltmain.sh index 6dfcfd58a90..16ddbf884b6 100755 --- a/contrib/openpam/ltmain.sh +++ b/contrib/openpam/ltmain.sh @@ -1,9 +1,9 @@ -# libtool (GNU libtool) 2.4 +# libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, -# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -41,6 +41,7 @@ # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) +# --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages @@ -69,7 +70,7 @@ # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4 +# $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # @@ -79,9 +80,9 @@ PROGRAM=libtool PACKAGE=libtool -VERSION=2.4 +VERSION=2.4.2 TIMESTAMP="" -package_revision=1.3293 +package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then @@ -136,15 +137,10 @@ progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} -: ${EGREP="grep -E"} -: ${FGREP="grep -F"} -: ${GREP="grep"} -: ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} -: ${SED="sed"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} @@ -387,7 +383,7 @@ case $progpath in ;; *) save_IFS="$IFS" - IFS=: + IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break @@ -771,8 +767,8 @@ func_help () s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ - s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ - s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } @@ -1052,6 +1048,7 @@ opt_finish=false opt_help=false opt_help_all=false opt_silent=: +opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false @@ -1118,6 +1115,10 @@ esac ;; --no-silent|--no-quiet) opt_silent=false +func_append preserve_args " $opt" + ;; + --no-warning|--no-warn) + opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) @@ -2089,7 +2090,7 @@ func_mode_compile () *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; @@ -3231,11 +3232,13 @@ func_mode_install () # Set up the ranlib parameters. oldlib="$destdir/$name" + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $oldlib" 'exit $?' + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. @@ -3500,7 +3503,7 @@ static const void *lt_preloaded_setup() { # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; @@ -4015,14 +4018,17 @@ func_exec_program_core () # launches target application with the remaining arguments. func_exec_program () { - for lt_wr_arg - do - case \$lt_wr_arg in - --lt-*) ;; - *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; - esac - shift - done + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac func_exec_program_core \${1+\"\$@\"} } @@ -5090,9 +5096,15 @@ void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | - $SED -e 's/\([\\"]\)/\\\1/g' \ - -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' - + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' cat <<"EOF" } EOF @@ -5677,7 +5689,8 @@ func_mode_link () continue ;; - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" @@ -6181,7 +6194,8 @@ func_mode_link () lib= found=no case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" @@ -6882,7 +6896,7 @@ func_mode_link () test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then - add_dir="-L$dir" + add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in @@ -7367,6 +7381,7 @@ func_mode_link () # which has an extra 1 added just for fun # case $version_type in + # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result @@ -7483,7 +7498,7 @@ func_mode_link () versuffix="$major.$revision" ;; - linux) + linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" @@ -8071,6 +8086,11 @@ EOF # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then + # Remove ${wl} instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= @@ -8101,7 +8121,7 @@ EOF elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; - *) func_apped perm_rpath " $libdir" ;; + *) func_append perm_rpath " $libdir" ;; esac fi done @@ -8109,11 +8129,7 @@ EOF if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" - if test -n "$hardcode_libdir_flag_spec_ld"; then - eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" - else - eval dep_rpath=\"$hardcode_libdir_flag_spec\" - fi + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. @@ -9203,6 +9219,8 @@ EOF esac done fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" @@ -9312,7 +9330,8 @@ EOF *.la) func_basename "$deplib" name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + func_resolve_sysroot "$deplib" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" diff --git a/contrib/openpam/misc/gendoc.pl b/contrib/openpam/misc/gendoc.pl index 7b766728e87..4ce2d39fad9 100644 --- a/contrib/openpam/misc/gendoc.pl +++ b/contrib/openpam/misc/gendoc.pl @@ -33,7 +33,7 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -# $Id: gendoc.pl 465 2011-11-02 20:34:26Z des $ +# $Id: gendoc.pl 599 2012-04-14 15:06:41Z des $ # use strict; @@ -81,12 +81,15 @@ $COPYRIGHT = ".\\\"- .\\\""; %AUTHORS = ( - THINKSEC => "ThinkSec AS and Network Associates Laboratories, the + THINKSEC => "developed for the +.Fx +Project by ThinkSec AS and Network Associates Laboratories, the Security Research Division of Network Associates, Inc.\\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , as part of the DARPA CHATS research program.", - DES => ".An Dag-Erling Sm\\(/orgrav Aq des\@FreeBSD.org .", + DES => "developed by +.An Dag-Erling Sm\\(/orgrav Aq des\@des.no .", ); %PAMERR = ( @@ -136,6 +139,9 @@ sub parse_source($) { my $inlist; my $intaglist; my $inliteral; + my $customrv; + my $deprecated; + my $experimental; my %xref; my @errors; my $author; @@ -154,10 +160,18 @@ sub parse_source($) { if ($source =~ m/^ \* NOPARSE\s*$/m); $author = 'THINKSEC'; - if ($source =~ s/^ \* AUTHOR\s+(.*?)\s*$//m) { + if ($source =~ s/^ \* AUTHOR\s+(\w*)\s*$//m) { $author = $1; } + if ($source =~ s/^ \* DEPRECATED\s*(\w*)\s*$//m) { + $deprecated = $1 // 0; + } + + if ($source =~ s/^ \* EXPERIMENTAL\s*$//m) { + $experimental = 1; + } + $func = $fn; $func =~ s,^(?:.*/)?([^/]+)\.c$,$1,; if ($source !~ m,\n \* ([\S ]+)\n \*/\n\n([\S ]+)\n$func\((.*?)\)\n\{,s) { @@ -195,7 +209,7 @@ sub parse_source($) { # separate argument names with | $argnames =~ s/\" \"/|/g; # and surround with () - $argnames =~ s/^\"(.*)\"$/($1)/; + $argnames =~ s/^\"(.*)\"$/$1/; # $argnames is now a regexp that matches argument names $inliteral = $inlist = $intaglist = 0; foreach (split("\n", $source)) { @@ -211,12 +225,19 @@ sub parse_source($) { s/\\(.)/$1/gs; if (m/^$/) { # paragraph separator + if ($inlist || $intaglist) { + # either a blank line between list items, or a blank + # line after the final list item. The latter case + # will be handled further down. + next; + } + if ($man =~ m/\n\.Sh [^\n]+\n$/s) { + # a blank line after a section header + next; + } if ($man ne "" && $man !~ m/\.Pp\n$/s) { if ($inliteral) { $man .= "\0\n"; - } elsif ($inlist || $intaglist) { - $man .= ".El\n.Pp\n"; - $inlist = $intaglist = 0; } else { $man .= ".Pp\n"; } @@ -229,6 +250,14 @@ sub parse_source($) { ++$xref{$sect}->{$page}; next; } + if (s/^([A-Z][0-9A-Z -]+)$/.Sh $1/) { + if ($1 eq "RETURN VALUES") { + $customrv = $1; + } + $man =~ s/\n\.Pp$/\n/s; + $man .= "$_\n"; + next; + } if (s/^\s+-\s+//) { # item in bullet list if ($inliteral) { @@ -286,11 +315,12 @@ sub parse_source($) { $man .= "$_\n"; next; } - s/\s*=$func\b\s*/\n.Nm\n/gs; - s/\s*=$argnames\b\s*/\n.Fa $1\n/gs; + s/\s*=($func)\b\s*/\n.Fn $1\n/gs; + s/\s*=($argnames)\b\s*/\n.Fa $1\n/gs; s/\s*=(struct \w+(?: \*)?)\b\s*/\n.Vt $1\n/gs; s/\s*:([a-z_]+)\b\s*/\n.Va $1\n/gs; s/\s*;([a-z_]+)\b\s*/\n.Dv $1\n/gs; + s/\s*=!([a-z_]+)\b\s*/\n.Xr $1 3\n/gs; while (s/\s*=([a-z_]+)\b\s*/\n.Xr $1 3\n/s) { ++$xref{3}->{$1}; } @@ -311,7 +341,7 @@ sub parse_source($) { $inliteral = 0; } $man =~ s/\%/\\&\%/gs; - $man =~ s/(\n\.[A-Z][a-z] [\w ]+)\n([\.,:;-]\S*)\s*/$1 $2\n/gs; + $man =~ s/(\n\.[A-Z][a-z] [\w ]+)\n([.,:;-])\s+/$1 $2\n/gs; $man =~ s/\s*$/\n/gm; $man =~ s/\n+/\n/gs; $man =~ s/\0//gs; @@ -331,6 +361,9 @@ sub parse_source($) { 'xref' => \%xref, 'errors' => \@errors, 'author' => $author, + 'customrv' => $customrv, + 'deprecated' => $deprecated, + 'experimental' => $experimental, }; if ($source =~ m/^ \* NODOC\s*$/m) { $FUNCTIONS{$func}->{'nodoc'} = 1; @@ -437,49 +470,75 @@ sub gendoc($) { .Lb libpam .Sh SYNOPSIS .In sys/types.h -.In security/pam_appl.h +"; + if ($func->{'args'} =~ m/\bFILE \*\b/) { + $mdoc .= ".In stdio.h\n"; + } + $mdoc .= ".In security/pam_appl.h "; if ($func->{'name'} =~ m/_sm_/) { - $mdoc .= ".In security/pam_modules.h\n" + $mdoc .= ".In security/pam_modules.h\n"; } if ($func->{'name'} =~ m/openpam/) { - $mdoc .= ".In security/openpam.h\n" + $mdoc .= ".In security/openpam.h\n"; } $mdoc .= ".Ft \"$func->{'type'}\" .Fn $func->{'name'} $func->{'args'} .Sh DESCRIPTION -$func->{'man'} "; - if ($func->{'type'} eq "int") { + if (defined($func->{'deprecated'})) { + $mdoc .= ".Bf Sy\n" . + "This function is deprecated and may be removed " . + "in a future release without further warning.\n"; + if ($func->{'deprecated'}) { + $mdoc .= "The\n.Fn $func->{'deprecated'}\nfunction " . + "may be used to achieve similar results.\n"; + } + $mdoc .= ".Ef\n.Pp\n"; + } + if ($func->{'experimental'}) { + $mdoc .= ".Bf Sy\n" . + "This function is experimental and may be modified or removed " . + "in a future release without further warning.\n"; + $mdoc .= ".Ef\n.Pp\n"; + } + $mdoc .= "$func->{'man'}\n"; + my @errors = @{$func->{'errors'}}; + if ($func->{'customrv'}) { + # leave it + } elsif ($func->{'type'} eq "int" && @errors) { $mdoc .= ".Sh RETURN VALUES The -.Nm +.Fn $func->{'name'} function returns one of the following values: .Bl -tag -width 18n "; - my @errors = @{$func->{'errors'}}; - warn("$func->{'name'}(): no error specification\n") - unless(@errors); foreach (@errors) { $mdoc .= ".It Bq Er $_\n$PAMERR{$_}.\n"; } $mdoc .= ".El\n"; - } else { - if ($func->{'type'} =~ m/\*$/) { - $mdoc .= ".Sh RETURN VALUES + } elsif ($func->{'type'} eq "int") { + $mdoc .= ".Sh RETURN VALUES The -.Nm +.Fn $func->{'name'} +function returns 0 on success and -1 on failure. +"; + } elsif ($func->{'type'} =~ m/\*$/) { + $mdoc .= ".Sh RETURN VALUES +The +.Fn $func->{'name'} function returns .Dv NULL on failure. "; - } + } elsif ($func->{'type'} ne "void") { + warn("$func->{'name'}(): no error specification\n"); } $mdoc .= ".Sh SEE ALSO\n" . genxref($func->{'xref'}); $mdoc .= ".Sh STANDARDS\n"; if ($func->{'openpam'}) { $mdoc .= "The -.Nm +.Fn $func->{'name'} function is an OpenPAM extension. "; } else { @@ -491,10 +550,9 @@ function is an OpenPAM extension. } $mdoc .= ".Sh AUTHORS The -.Nm -function and this manual page were developed for the -.Fx -Project by\n" . $AUTHORS{$func->{'author'} // 'THINKSEC_DARPA'} . "\n"; +.Fn $func->{'name'} +function and this manual page were\n"; + $mdoc .= $AUTHORS{$func->{'author'} // 'THINKSEC_DARPA'} . "\n"; $fn = "$func->{'name'}.3"; if (open(FILE, ">", $fn)) { print(FILE $mdoc); @@ -608,6 +666,9 @@ Security Research Division of Network Associates, Inc.\\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , as part of the DARPA CHATS research program. +.Pp +The OpenPAM library is maintained by +.An Dag-Erling Sm\\(/orgrav Aq des\@des.no . "; close(FILE); } diff --git a/contrib/openpam/pamgdb.in b/contrib/openpam/pamgdb.in new file mode 100644 index 00000000000..2ec2d65adc4 --- /dev/null +++ b/contrib/openpam/pamgdb.in @@ -0,0 +1,41 @@ +#!/bin/sh +# +# $Id: pamgdb.in 583 2012-04-07 18:56:13Z des $ +# + +srcdir="@abs_top_srcdir@" +builddir="@abs_top_builddir@" + +# Make sure we get the right version of libpam +pam_libdir="${builddir}/lib/.libs" +LD_LIBRARY_PATH="${pam_libdir}:${LD_LIBRARY_PATH}" +LD_LIBRARY_PATH="${LD_LIBRARY_PATH%:}" +export LD_LIBRARY_PATH + +# DWIM, assuming that the first positional argument is the name of the +# program to debug rather than a gdb option. +prog="$1" +if expr "${prog}" : ".*/.*" >/dev/null ; then + # The first argument is an absolute or relative path. There + # is a good chance that it points to the wrapper script + # generated by libtool rather than the actual binary. + altprog="${prog%/*}/.libs/${prog##*/}" + if [ -x "${altprog}" ] ; then + shift + set "${altprog}" "$@" + fi +elif expr "${prog}" : "[a-z.-][a-z.-]*" >/dev/null ; then + # The first argument is just the name of the program. Look for + # it in the build directory. + for libdir in $(find "${builddir}" -type d -name .libs -print) ; do + altprog="${libdir}/${prog}" + if [ -x "${altprog}" ] ; then + shift + set "${altprog}" "$@" + break + fi + done +fi + +# Let's go! +exec gdb "$@" diff --git a/contrib/openpam/t/Makefile.am b/contrib/openpam/t/Makefile.am new file mode 100644 index 00000000000..a3f596d9074 --- /dev/null +++ b/contrib/openpam/t/Makefile.am @@ -0,0 +1,16 @@ +# $Id: Makefile.am 572 2012-04-05 15:41:44Z des $ + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/lib + +noinst_HEADERS = t.h + +# tests +TESTS = t_openpam_readword t_openpam_readlinev +check_PROGRAMS = $(TESTS) + +# libt - common support code +check_LIBRARIES = libt.a +libt_a_SOURCES = t_main.c + +# link with libpam and libt +LDADD = libt.a $(top_builddir)/lib/libpam.la diff --git a/contrib/openpam/t/Makefile.in b/contrib/openpam/t/Makefile.in new file mode 100644 index 00000000000..e71618bd5e8 --- /dev/null +++ b/contrib/openpam/t/Makefile.in @@ -0,0 +1,605 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# $Id: Makefile.am 572 2012-04-05 15:41:44Z des $ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +TESTS = t_openpam_readword$(EXEEXT) t_openpam_readlinev$(EXEEXT) +check_PROGRAMS = $(am__EXEEXT_1) +subdir = t +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +ARFLAGS = cru +libt_a_AR = $(AR) $(ARFLAGS) +libt_a_LIBADD = +am_libt_a_OBJECTS = t_main.$(OBJEXT) +libt_a_OBJECTS = $(am_libt_a_OBJECTS) +am__EXEEXT_1 = t_openpam_readword$(EXEEXT) \ + t_openpam_readlinev$(EXEEXT) +t_openpam_readlinev_SOURCES = t_openpam_readlinev.c +t_openpam_readlinev_OBJECTS = t_openpam_readlinev.$(OBJEXT) +t_openpam_readlinev_LDADD = $(LDADD) +t_openpam_readlinev_DEPENDENCIES = libt.a \ + $(top_builddir)/lib/libpam.la +t_openpam_readword_SOURCES = t_openpam_readword.c +t_openpam_readword_OBJECTS = t_openpam_readword.$(OBJEXT) +t_openpam_readword_LDADD = $(LDADD) +t_openpam_readword_DEPENDENCIES = libt.a $(top_builddir)/lib/libpam.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libt_a_SOURCES) t_openpam_readlinev.c t_openpam_readword.c +DIST_SOURCES = $(libt_a_SOURCES) t_openpam_readlinev.c \ + t_openpam_readword.c +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPT_LIBS = @CRYPT_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DL_LIBS = @DL_LIBS@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_MAJ = @LIB_MAJ@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENPAM_MODULES_DIR = @OPENPAM_MODULES_DIR@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/lib +noinst_HEADERS = t.h + +# libt - common support code +check_LIBRARIES = libt.a +libt_a_SOURCES = t_main.c + +# link with libpam and libt +LDADD = libt.a $(top_builddir)/lib/libpam.la +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign t/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign t/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkLIBRARIES: + -test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES) +libt.a: $(libt_a_OBJECTS) $(libt_a_DEPENDENCIES) + -rm -f libt.a + $(libt_a_AR) libt.a $(libt_a_OBJECTS) $(libt_a_LIBADD) + $(RANLIB) libt.a + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +t_openpam_readlinev$(EXEEXT): $(t_openpam_readlinev_OBJECTS) $(t_openpam_readlinev_DEPENDENCIES) + @rm -f t_openpam_readlinev$(EXEEXT) + $(LINK) $(t_openpam_readlinev_OBJECTS) $(t_openpam_readlinev_LDADD) $(LIBS) +t_openpam_readword$(EXEEXT): $(t_openpam_readword_OBJECTS) $(t_openpam_readword_DEPENDENCIES) + @rm -f t_openpam_readword$(EXEEXT) + $(LINK) $(t_openpam_readword_OBJECTS) $(t_openpam_readword_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_openpam_readlinev.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_openpam_readword.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_LIBRARIES) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \ + clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ + clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \ + clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/contrib/openpam/t/t.h b/contrib/openpam/t/t.h new file mode 100644 index 00000000000..4805b76af09 --- /dev/null +++ b/contrib/openpam/t/t.h @@ -0,0 +1,60 @@ +/*- + * Copyright (c) 2012 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: t.h 578 2012-04-06 00:45:59Z des $ + */ + +#ifndef T_H_INCLUDED +#define T_H_INCLUDED + +#include + +struct t_test { + int (*func)(void); + const char *desc; +}; + +#define T_FUNC(n, d) \ + static int t_ ## n ## _func(void); \ + static const struct t_test t_ ## n = \ + { t_ ## n ## _func, d }; \ + static int t_ ## n ## _func(void) + +#define T(n) \ + &t_ ## n + +extern const char *t_progname; + +const struct t_test **t_prepare(int, char **); +void t_cleanup(void); + +void t_verbose(const char *, ...) + OPENPAM_FORMAT((__printf__, 1, 2)); + +#endif diff --git a/contrib/openpam/t/t_main.c b/contrib/openpam/t/t_main.c new file mode 100644 index 00000000000..6a29b0a4fda --- /dev/null +++ b/contrib/openpam/t/t_main.c @@ -0,0 +1,119 @@ +/*- + * Copyright (c) 2012 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: t_main.c 578 2012-04-06 00:45:59Z des $ + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include "t.h" + +const char *t_progname; + +static int verbose; + +void +t_verbose(const char *fmt, ...) +{ + va_list ap; + + if (verbose) { + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + } +} + +static void +usage(void) +{ + + fprintf(stderr, "usage: [-v] %s\n", t_progname); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + const struct t_test **t_plan; + const char *desc; + int n, pass, fail; + int opt; + + if ((t_progname = strrchr(argv[0], '/')) != NULL) + t_progname++; /* one past the slash */ + else + t_progname = argv[0]; + + while ((opt = getopt(argc, argv, "v")) != -1) + switch (opt) { + case 'v': + verbose = 1; + break; + default: + usage(); + } + + argc -= optind; + argv += optind; + + /* prepare the test plan */ + if ((t_plan = t_prepare(argc, argv)) == NULL) + errx(1, "no plan\n"); + + /* count the tests */ + for (n = 0; t_plan[n] != NULL; ++n) + /* nothing */; + printf("1..%d\n", n); + + /* run the tests */ + for (n = pass = fail = 0; t_plan[n] != NULL; ++n) { + desc = t_plan[n]->desc ? t_plan[n]->desc : "no description"; + if ((*t_plan[n]->func)()) { + printf("ok %d - %s\n", n + 1, desc); + ++pass; + } else { + printf("not ok %d - %s\n", n + 1, desc); + ++fail; + } + } + + /* clean up and exit */ + t_cleanup(); + exit(fail > 0 ? 1 : 0); +} diff --git a/contrib/openpam/t/t_openpam_readlinev.c b/contrib/openpam/t/t_openpam_readlinev.c new file mode 100644 index 00000000000..bb0ff90089e --- /dev/null +++ b/contrib/openpam/t/t_openpam_readlinev.c @@ -0,0 +1,342 @@ +/*- + * Copyright (c) 2012 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: t_openpam_readlinev.c 581 2012-04-06 01:08:37Z des $ + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "openpam_impl.h" +#include "t.h" + +static char filename[1024]; +static FILE *f; + +/* + * Open the temp file and immediately unlink it so it doesn't leak in case + * of premature exit. + */ +static void +orlv_open(void) +{ + int fd; + + if ((fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0600)) < 0) + err(1, "%s(): %s", __func__, filename); + if ((f = fdopen(fd, "r+")) == NULL) + err(1, "%s(): %s", __func__, filename); + if (unlink(filename) < 0) + err(1, "%s(): %s", __func__, filename); +} + +/* + * Write text to the temp file. + */ +static void +orlv_output(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vfprintf(f, fmt, ap); + va_end(ap); + if (ferror(f)) + err(1, "%s", filename); +} + +/* + * Rewind the temp file. + */ +static void +orlv_rewind(void) +{ + + errno = 0; + rewind(f); + if (errno != 0) + err(1, "%s(): %s", __func__, filename); +} + +/* + * Read a line from the temp file and verify that the result matches our + * expectations: whether a line was read at all, how many and which words + * it contained, how many lines were read (in case of quoted or escaped + * newlines) and whether we reached the end of the file. + */ +static int +orlv_expect(const char **expectedv, int lines, int eof) +{ + int expectedc, gotc, i, lineno = 0; + char **gotv; + + expectedc = 0; + if (expectedv != NULL) + while (expectedv[expectedc] != NULL) + ++expectedc; + gotv = openpam_readlinev(f, &lineno, &gotc); + if (ferror(f)) + err(1, "%s(): %s", __func__, filename); + if (expectedv != NULL && gotv == NULL) { + t_verbose("expected %d words, got nothing\n", expectedc); + return (0); + } + if (expectedv == NULL && gotv != NULL) { + t_verbose("expected nothing, got %d words\n", gotc); + FREEV(gotc, gotv); + return (0); + } + if (expectedv != NULL && gotv != NULL) { + if (expectedc != gotc) { + t_verbose("expected %d words, got %d\n", + expectedc, gotc); + FREEV(gotc, gotv); + return (0); + } + for (i = 0; i < gotc; ++i) { + if (strcmp(expectedv[i], gotv[i]) != 0) { + t_verbose("word %d: expected <<%s>>, " + "got <<%s>>\n", i, expectedv[i], gotv[i]); + FREEV(gotc, gotv); + return (0); + } + } + FREEV(gotc, gotv); + } + if (lineno != lines) { + t_verbose("expected to advance %d lines, advanced %d lines\n", + lines, lineno); + return (0); + } + if (eof && !feof(f)) { + t_verbose("expected EOF, but didn't get it\n"); + return (0); + } + if (!eof && feof(f)) { + t_verbose("didn't expect EOF, but got it anyway\n"); + return (0); + } + return (1); +} + +/* + * Close the temp file. + */ +void +orlv_close(void) +{ + + if (fclose(f) != 0) + err(1, "%s(): %s", __func__, filename); + f = NULL; +} + +/*************************************************************************** + * Commonly-used lines + */ + +static const char *empty[] = { + NULL +}; + +static const char *hello[] = { + "hello", + NULL +}; + +static const char *hello_world[] = { + "hello", + "world", + NULL +}; + + +/*************************************************************************** + * Lines without words + */ + +T_FUNC(empty_input, "empty input") +{ + int ret; + + orlv_open(); + ret = orlv_expect(NULL, 0 /*lines*/, 1 /*eof*/); + orlv_close(); + return (ret); +} + +T_FUNC(empty_line, "empty line") +{ + int ret; + + orlv_open(); + orlv_output("\n"); + orlv_rewind(); + ret = orlv_expect(empty, 1 /*lines*/, 0 /*eof*/); + orlv_close(); + return (ret); +} + +T_FUNC(unterminated_empty_line, "unterminated empty line") +{ + int ret; + + orlv_open(); + orlv_output(" "); + orlv_rewind(); + ret = orlv_expect(NULL, 0 /*lines*/, 1 /*eof*/); + orlv_close(); + return (ret); +} + +T_FUNC(whitespace, "whitespace") +{ + int ret; + + orlv_open(); + orlv_output(" \n"); + orlv_rewind(); + ret = orlv_expect(empty, 1 /*lines*/, 0 /*eof*/); + orlv_close(); + return (ret); +} + +T_FUNC(comment, "comment") +{ + int ret; + + orlv_open(); + orlv_output("# comment\n"); + orlv_rewind(); + ret = orlv_expect(empty, 1 /*lines*/, 0 /*eof*/); + orlv_close(); + return (ret); +} + +T_FUNC(whitespace_before_comment, "whitespace before comment") +{ + int ret; + + orlv_open(); + orlv_output(" # comment\n"); + orlv_rewind(); + ret = orlv_expect(empty, 1 /*lines*/, 0 /*eof*/); + orlv_close(); + return (ret); +} + + +/*************************************************************************** + * Simple words + */ + +T_FUNC(one_word, "one word") +{ + int ret; + + orlv_open(); + orlv_output("hello\n"); + orlv_rewind(); + ret = orlv_expect(hello, 1 /*lines*/, 0 /*eof*/); + orlv_close(); + return (ret); +} + +T_FUNC(two_words, "two words") +{ + int ret; + + orlv_open(); + orlv_output("hello world\n"); + orlv_rewind(); + ret = orlv_expect(hello_world, 1 /*lines*/, 0 /*eof*/); + orlv_close(); + return (ret); +} + +T_FUNC(unterminated_line, "unterminated line") +{ + int ret; + + orlv_open(); + orlv_output("hello world"); + orlv_rewind(); + ret = orlv_expect(hello_world, 0 /*lines*/, 1 /*eof*/); + orlv_close(); + return (ret); +} + + +/*************************************************************************** + * Boilerplate + */ + +const struct t_test *t_plan[] = { + T(empty_input), + T(empty_line), + T(unterminated_empty_line), + T(whitespace), + T(comment), + T(whitespace_before_comment), + + T(one_word), + T(two_words), + T(unterminated_line), + + NULL +}; + +const struct t_test ** +t_prepare(int argc, char *argv[]) +{ + + (void)argc; + (void)argv; + snprintf(filename, sizeof filename, "%s.%d.tmp", t_progname, getpid()); + if (filename == NULL) + err(1, "asprintf()"); + return (t_plan); +} + +void +t_cleanup(void) +{ +} diff --git a/contrib/openpam/t/t_openpam_readword.c b/contrib/openpam/t/t_openpam_readword.c new file mode 100644 index 00000000000..2135d8ba286 --- /dev/null +++ b/contrib/openpam/t/t_openpam_readword.c @@ -0,0 +1,829 @@ +/*- + * Copyright (c) 2012 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: t_openpam_readword.c 584 2012-04-07 22:47:16Z des $ + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "t.h" + +static char filename[1024]; +static FILE *f; + +/* + * Open the temp file and immediately unlink it so it doesn't leak in case + * of premature exit. + */ +static void +orw_open(void) +{ + int fd; + + if ((fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0600)) < 0) + err(1, "%s(): %s", __func__, filename); + if ((f = fdopen(fd, "r+")) == NULL) + err(1, "%s(): %s", __func__, filename); + if (unlink(filename) < 0) + err(1, "%s(): %s", __func__, filename); +} + +/* + * Write text to the temp file. + */ +static void +orw_output(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vfprintf(f, fmt, ap); + va_end(ap); + if (ferror(f)) + err(1, "%s", filename); +} + +/* + * Rewind the temp file. + */ +static void +orw_rewind(void) +{ + + errno = 0; + rewind(f); + if (errno != 0) + err(1, "%s(): %s", __func__, filename); +} + +/* + * Read a word from the temp file and verify that the result matches our + * expectations: whether a word was read at all, how many lines were read + * (in case of quoted or escaped newlines), whether we reached the end of + * the file and whether we reached the end of the line. + */ +static int +orw_expect(const char *expected, int lines, int eof, int eol) +{ + int ch, lineno = 0; + char *got; + size_t len; + + got = openpam_readword(f, &lineno, &len); + if (ferror(f)) + err(1, "%s(): %s", __func__, filename); + if (expected != NULL && got == NULL) { + t_verbose("expected <<%s>>, got nothing\n", expected); + return (0); + } + if (expected == NULL && got != NULL) { + t_verbose("expected nothing, got <<%s>>\n", got); + return (0); + } + if (expected != NULL && got != NULL && strcmp(expected, got) != 0) { + t_verbose("expected <<%s>>, got <<%s>>\n", expected, got); + return (0); + } + if (lineno != lines) { + t_verbose("expected to advance %d lines, advanced %d lines\n", + lines, lineno); + return (0); + } + if (eof && !feof(f)) { + t_verbose("expected EOF, but didn't get it\n"); + return (0); + } + if (!eof && feof(f)) { + t_verbose("didn't expect EOF, but got it anyway\n"); + return (0); + } + ch = fgetc(f); + if (ferror(f)) + err(1, "%s(): %s", __func__, filename); + if (eol && ch != '\n') { + t_verbose("expected EOL, but didn't get it\n"); + return (0); + } + if (!eol && ch == '\n') { + t_verbose("didn't expect EOL, but got it anyway\n"); + return (0); + } + if (ch != EOF) + ungetc(ch, f); + return (1); +} + +/* + * Close the temp file. + */ +void +orw_close(void) +{ + + if (fclose(f) != 0) + err(1, "%s(): %s", __func__, filename); + f = NULL; +} + + +/*************************************************************************** + * Lines without words + */ + +T_FUNC(empty_input, "empty input") +{ + int ret; + + orw_open(); + ret = orw_expect(NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(empty_line, "empty line") +{ + int ret; + + orw_open(); + orw_output("\n"); + orw_rewind(); + ret = orw_expect(NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(unterminated_line, "unterminated line") +{ + int ret; + + orw_open(); + orw_output(" "); + orw_rewind(); + ret = orw_expect(NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(single_whitespace, "single whitespace") +{ + int ret; + + orw_open(); + orw_output(" \n"); + orw_rewind(); + ret = orw_expect(NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(multiple_whitespace, "multiple whitespace") +{ + int ret; + + orw_open(); + orw_output(" \t\r\n"); + orw_rewind(); + ret = orw_expect(NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(comment, "comment") +{ + int ret; + + orw_open(); + orw_output("# comment\n"); + orw_rewind(); + ret = orw_expect(NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(whitespace_before_comment, "whitespace before comment") +{ + int ret; + + orw_open(); + orw_output(" # comment\n"); + orw_rewind(); + ret = orw_expect(NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + + +/*************************************************************************** + * Simple cases - no quotes or escapes + */ + +T_FUNC(single_word, "single word") +{ + const char *word = "hello"; + int ret; + + orw_open(); + orw_output("%s\n", word); + orw_rewind(); + ret = orw_expect(word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(single_whitespace_before_word, "single whitespace before word") +{ + const char *word = "hello"; + int ret; + + orw_open(); + orw_output(" %s\n", word); + orw_rewind(); + ret = orw_expect(word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(double_whitespace_before_word, "double whitespace before word") +{ + const char *word = "hello"; + int ret; + + orw_open(); + orw_output(" %s\n", word); + orw_rewind(); + ret = orw_expect(word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(single_whitespace_after_word, "single whitespace after word") +{ + const char *word = "hello"; + int ret; + + orw_open(); + orw_output("%s \n", word); + orw_rewind(); + ret = orw_expect(word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(double_whitespace_after_word, "double whitespace after word") +{ + const char *word = "hello"; + int ret; + + orw_open(); + orw_output("%s \n", word); + orw_rewind(); + ret = orw_expect(word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(comment_after_word, "comment after word") +{ + const char *word = "hello"; + int ret; + + orw_open(); + orw_output("%s # comment\n", word); + orw_rewind(); + ret = orw_expect(word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect(NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(word_containing_hash, "word containing hash") +{ + const char *word = "hello#world"; + int ret; + + orw_open(); + orw_output("%s\n", word); + orw_rewind(); + ret = orw_expect(word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(two_words, "two words") +{ + const char *word[] = { "hello", "world" }; + int ret; + + orw_open(); + orw_output("%s %s\n", word[0], word[1]); + orw_rewind(); + ret = orw_expect(word[0], 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect(word[1], 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + + +/*************************************************************************** + * Escapes + */ + +T_FUNC(naked_escape, "naked escape") +{ + int ret; + + orw_open(); + orw_output("\\"); + orw_rewind(); + ret = orw_expect(NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_escape, "escaped escape") +{ + int ret; + + orw_open(); + orw_output("\\\\\n"); + orw_rewind(); + ret = orw_expect("\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_whitespace, "escaped whitespace") +{ + int ret; + + orw_open(); + orw_output("\\ \\\t \\\r \\\n\n"); + orw_rewind(); + ret = orw_expect(" ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + /* this last one is a line continuation */ + orw_expect(NULL, 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_newline_before_word, "escaped newline before word") +{ + int ret; + + orw_open(); + orw_output("\\\nhello world\n"); + orw_rewind(); + ret = orw_expect("hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_newline_within_word, "escaped newline within word") +{ + int ret; + + orw_open(); + orw_output("hello\\\nworld\n"); + orw_rewind(); + ret = orw_expect("helloworld", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_newline_after_word, "escaped newline after word") +{ + int ret; + + orw_open(); + orw_output("hello\\\n world\n"); + orw_rewind(); + ret = orw_expect("hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_letter, "escaped letter") +{ + int ret; + + orw_open(); + orw_output("\\z\n"); + orw_rewind(); + ret = orw_expect("z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + + +/*************************************************************************** + * Quotes + */ + +T_FUNC(naked_single_quote, "naked single quote") +{ + int ret; + + orw_open(); + orw_output("'"); + orw_rewind(); + ret = orw_expect(NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(naked_double_quote, "naked double quote") +{ + int ret; + + orw_open(); + orw_output("\""); + orw_rewind(); + ret = orw_expect(NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(empty_single_quotes, "empty single quotes") +{ + int ret; + + orw_open(); + orw_output("''\n"); + orw_rewind(); + ret = orw_expect("", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(empty_double_quotes, "empty double quotes") +{ + int ret; + + orw_open(); + orw_output("\"\"\n"); + orw_rewind(); + ret = orw_expect("", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(single_quotes_within_double_quotes, "single quotes within double quotes") +{ + int ret; + + orw_open(); + orw_output("\"' '\"\n"); + orw_rewind(); + ret = orw_expect("' '", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(double_quotes_within_single_quotes, "double quotes within single quotes") +{ + int ret; + + orw_open(); + orw_output("'\" \"'\n"); + orw_rewind(); + ret = orw_expect("\" \"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(single_quoted_whitespace, "single-quoted whitespace") +{ + int ret; + + orw_open(); + orw_output("' ' '\t' '\r' '\n'\n"); + orw_rewind(); + ret = orw_expect(" ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(double_quoted_whitespace, "double-quoted whitespace") +{ + int ret; + + orw_open(); + orw_output("\" \" \"\t\" \"\r\" \"\n\"\n"); + orw_rewind(); + ret = orw_expect(" ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(single_quoted_words, "single-quoted words") +{ + int ret; + + orw_open(); + orw_output("'hello world'\n"); + orw_rewind(); + ret = orw_expect("hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(double_quoted_words, "double-quoted words") +{ + int ret; + + orw_open(); + orw_output("\"hello world\"\n"); + orw_rewind(); + ret = orw_expect("hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + + +/*************************************************************************** + * Combinations of escape and quotes + */ + +T_FUNC(escaped_single_quote, + "escaped single quote") +{ + int ret; + + orw_open(); + orw_output("\\'\n"); + orw_rewind(); + ret = orw_expect("'", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_double_quote, + "escaped double quote") +{ + int ret; + + orw_open(); + orw_output("\\\"\n"); + orw_rewind(); + ret = orw_expect("\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_whitespace_within_single_quotes, + "escaped whitespace within single quotes") +{ + int ret; + + orw_open(); + orw_output("'\\ ' '\\\t' '\\\r' '\\\n'\n"); + orw_rewind(); + ret = orw_expect("\\ ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\\\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\\\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\\\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_whitespace_within_double_quotes, + "escaped whitespace within double quotes") +{ + int ret; + + orw_open(); + orw_output("\"\\ \" \"\\\t\" \"\\\r\" \"\\\n\"\n"); + orw_rewind(); + ret = orw_expect("\\ ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\\\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect("\\\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + /* this last one is a line continuation */ + orw_expect("", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_letter_within_single_quotes, + "escaped letter within single quotes") +{ + int ret; + + orw_open(); + orw_output("'\\z'\n"); + orw_rewind(); + ret = orw_expect("\\z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_letter_within_double_quotes, + "escaped letter within double quotes") +{ + int ret; + + orw_open(); + orw_output("\"\\z\"\n"); + orw_rewind(); + ret = orw_expect("\\z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_escape_within_single_quotes, + "escaped escape within single quotes") +{ + int ret; + + orw_open(); + orw_output("'\\\\'\n"); + orw_rewind(); + ret = orw_expect("\\\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_escape_within_double_quotes, + "escaped escape within double quotes") +{ + int ret; + + orw_open(); + orw_output("\"\\\\\"\n"); + orw_rewind(); + ret = orw_expect("\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_single_quote_within_single_quotes, + "escaped single quote within single quotes") +{ + int ret; + + orw_open(); + orw_output("'\\''\n"); + orw_rewind(); + ret = orw_expect(NULL, 1 /*lines*/, 1 /*eof*/, 0 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_double_quote_within_single_quotes, + "escaped double quote within single quotes") +{ + int ret; + + orw_open(); + orw_output("'\\\"'\n"); + orw_rewind(); + ret = orw_expect("\\\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_single_quote_within_double_quotes, + "escaped single quote within double quotes") +{ + int ret; + + orw_open(); + orw_output("\"\\'\"\n"); + orw_rewind(); + ret = orw_expect("\\'", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + +T_FUNC(escaped_double_quote_within_double_quotes, + "escaped double quote within double quotes") +{ + int ret; + + orw_open(); + orw_output("\"\\\"\"\n"); + orw_rewind(); + ret = orw_expect("\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + orw_close(); + return (ret); +} + + +/*************************************************************************** + * Boilerplate + */ + +const struct t_test *t_plan[] = { + T(empty_input), + T(empty_line), + T(single_whitespace), + T(multiple_whitespace), + T(comment), + T(whitespace_before_comment), + + T(single_word), + T(single_whitespace_before_word), + T(double_whitespace_before_word), + T(single_whitespace_after_word), + T(double_whitespace_after_word), + T(comment_after_word), + T(word_containing_hash), + T(two_words), + + T(naked_escape), + T(escaped_escape), + T(escaped_whitespace), + T(escaped_newline_before_word), + T(escaped_newline_within_word), + T(escaped_newline_after_word), + T(escaped_letter), + + T(naked_single_quote), + T(naked_double_quote), + T(empty_single_quotes), + T(empty_double_quotes), + T(single_quotes_within_double_quotes), + T(double_quotes_within_single_quotes), + T(single_quoted_whitespace), + T(double_quoted_whitespace), + T(single_quoted_words), + T(double_quoted_words), + + T(escaped_single_quote), + T(escaped_double_quote), + T(escaped_whitespace_within_single_quotes), + T(escaped_whitespace_within_double_quotes), + T(escaped_letter_within_single_quotes), + T(escaped_letter_within_double_quotes), + T(escaped_escape_within_single_quotes), + T(escaped_escape_within_double_quotes), + T(escaped_single_quote_within_single_quotes), + T(escaped_double_quote_within_single_quotes), + T(escaped_single_quote_within_double_quotes), + T(escaped_double_quote_within_double_quotes), + + NULL +}; + +const struct t_test ** +t_prepare(int argc, char *argv[]) +{ + + (void)argc; + (void)argv; + snprintf(filename, sizeof filename, "%s.%d.tmp", t_progname, getpid()); + if (filename == NULL) + err(1, "asprintf()"); + return (t_plan); +} + +void +t_cleanup(void) +{ +} diff --git a/contrib/tcpdump/CHANGES b/contrib/tcpdump/CHANGES index 33f453b7d52..2fa51b9d009 100644 --- a/contrib/tcpdump/CHANGES +++ b/contrib/tcpdump/CHANGES @@ -1,3 +1,64 @@ +Friday December 9, 2011. guy@alum.mit.edu. + Summary for 4.2.1 tcpdump release + Only build the Babel printer if IPv6 is enabled. + Support Babel on port 6696 as well as 6697. + Include ppi.h in release tarball. + Include all the test files in the release tarball, and don't + "include" test files that no longer exist. + Don't assume we have - check for it. + Support "-T carp" as a way of dissecting IP protocol 112 as CARP + rather than VRRP. + Support Hilscher NetAnalyzer link-layer header format. + Constify some pointers and fix compiler warnings. + Get rid of never-true test. + Fix an unintended fall-through in a case statement in the ARP + printer. + Fix several cases where sizeof(sizeof(XXX)) was used when just + sizeof(XXX) was intended. + Make stricter sanity checks in the ES-IS printer. + Get rid of some GCCisms that caused builds to fai with compilers + that don't support them. + Fix typo in man page. + Added length checks to Babel printer. + +Sunday July 24, 2011. mcr@sandelman.ca. + Summary for 4.2.+ + merged 802.15.4 decoder from Dmitry Eremin-Solenikov + updates to forces for new port numbers + Use "-H", not "-h", for the 802.11s option. (-h always help) + Better ICMPv6 checksum handling. + add support for the RPKI/Router Protocol, per -ietf-sidr-rpki-rtr-12 + get rid of uuencoded pcap test files, git can do binary. + sFlow changes for 64-bit counters. + fixes for PPI packet header handling and printing. + Add DCB Exchange protocol (DCBX) version 1.01. + Babel dissector, from Juliusz Chroboczek and Grégoire Henry. + improvements to radiotap for rate values > 127. + Many improvements to ForCES decode, including fix SCTP TML port + updated RPL type code to RPL-17 draft + Improve printout of DHCPv6 options. + added support and test case for QinQ (802.1q VLAN) packets + Handle DLT_IEEE802_15_4_NOFCS like DLT_IEEE802_15_4. + Build fixes for Sparc and other machines with alignment restrictions. + Merged changes from Debian package. + PGM: Add ACK decoding and add PGMCC DATA and FEEDBACK options. + Build fixes for OSX (Snow Leopard and others) + Add support for IEEE 802.15.4 packets + +Tue. July 20, 2010. guy@alum.mit.edu. + Summary for 4.1.2 tcpdump release + If -U is specified, flush the file after creating it, so it's + not zero-length + Fix TCP flags output description, and some typoes, in the man + page + Add a -h flag, and only attempt to recognize 802.11s mesh + headers if it's set + When printing the link-layer type list, send *all* output to + stderr + Include the CFLAGS setting when configure was run in the + compiler flags + Thu. April 1, 2010. guy@alum.mit.edu. Summary for 4.1.1 tcpdump release Fix build on systems with PF, such as FreeBSD and OpenBSD. diff --git a/contrib/tcpdump/CREDITS b/contrib/tcpdump/CREDITS index 0a3b56eb238..9e7e875769b 100644 --- a/contrib/tcpdump/CREDITS +++ b/contrib/tcpdump/CREDITS @@ -1,189 +1,203 @@ This file lists people who have contributed to tcpdump: The current maintainers: - Bill Fenner - David Young - Fulvio Risso - Guy Harris - Hannes Gredler - Michael Richardson + Bill Fenner + David Young + Fulvio Risso + Guy Harris + Hannes Gredler + Michael Richardson Additional people who have contributed patches: - Aaron Campbell - Alfredo Andres - Albert Chin - Ananth Suryanarayana - Andrea Bittau - Andrew Brown - Andrew Church - Andrew Hintz - Andrew Silent - Andrew Tridgell - Andy Heffernan - Arkadiusz Miskiewicz - Armando L. Caro Jr. - Arnaldo Carvalho de Melo - Ben Byer - Atsushi Onoe - Ben Smithurst - Bert Vermeulen - Bjoern A. Zeeb - Brent L. Bates - Brian Ginsbach - Bruce M. Simpson - Carles Kishimoto Bisbe - Charlie Lenahan - Charles M. Hannum - Chris Cogdon - Chris G. Demetriou - Christian Sievers - Chris Jepeway - Chris Larson - Craig Rodrigues - Crist J. Clark - Daniel Hagerty - Darren Reed - David Binderman - David Horn - David Smith - David Young - Don Ebright - Eddie Kohler - Elmar Kirchner - Fang Wang - Florent Drouin - Florian Forster - Francis Dupont - Francisco Matias Cuenca-Acuna - Francois-Xavier Le Bail - Frank Volf - Fulvio Risso - George Bakos - Gerald Combs - Gerrit Renker - Gert Doering - Greg Minshall - Greg Stark - Gilbert Ramirez Jr. - Gisle Vanem - Hannes Viertel - Hank Leininger - Harry Raaymakers - Heinz-Ado Arnolds - Hendrik Scholz - Ian McDonald - Ilpo Järvinen - Jacek Tobiasz - Jakob Schlyter - Jamal Hadi Salim - Jan Oravec - Jason R. Thorpe - Jefferson Ogata - Jeffrey Hutzelman - Jesper Peterson - Jim Hutchins - Jonathan Heusser - Tatuya Jinmei - João Medeiros - Joerg Mayer - Jørgen Thomsen - Julian Cowley - Kaarthik Sivakumar - Karl Norby - Kazushi Sugyo - Kelly Carmichael - Ken Hornstein - Kevin Steves - Klaus Klein - Kris Kennaway - Krzysztof Halasa - Larry Lile - Lennert Buytenhek - Loris Degioanni - Love Hörnquist-Åstrand - Lucas C. Villa Real - Luis Martin Garcia - Maciej W. Rozycki - Manu Pathak - Marc Binderberger - Marc A. Lehmann - Mark Ellzey Thomas - Marko Kiiskila - Markus Schöpflin - Marshall Rose - Martin Husemann - Max Laier - Michael A. Meffie III - Michael Madore - Michael Riepe - Michael Shalayeff - Michael Shields - Michael T. Stolarchuk - Michele "mydecay" Marchetto - Mike Frysinger - Monroe Williams - Motonori Shindo - Nathan J. Williams - Nathaniel Couper-Noles - Neil T. Spring - Niels Provos - Nickolai Zeldovich - Nicolas Ferrero - Noritoshi Demizu - Olaf Kirch - Onno van der Linden - Paolo Abeni - Pascal Hennequin - Pasvorn Boonmark - Paul Mundt - Paul S. Traina - Pavlin Radoslavov - Pekka Savola - Peter Fales - Peter Jeremy - - Peter Volkov - Phil Wood - Rafal Maszkowski - Randy Sofia - Raphael Raimbault - Rick Cheng - Rick Jones - Rick Watson - Rob Braun - Robert Edmonds - Roderick Schertler - Sagun Shakya - Sami Farin - Scott Rose - Sebastian Krahmer - Sebastien Raveau - Sebastien Vincent - Sepherosa Ziehau - Seth Webster - Shinsuke Suzuki - Steinar Haug - Swaminathan Chandrasekaran - Takashi Yamamoto - Terry Kennedy - Timo Koskiahde - Tony Li - Toshihiro Kanda - Uns Lider - Victor Oppleman - Wesley Griffin - Wesley Shields - Wilbert de Graaf - Will Drewry - William J. Hulley - Yen Yen Lim - Yoshifumi Nishida + A Costa + Aaron Campbell + Alfredo Andres + Albert Chin + Ananth Suryanarayana + Andrea Bittau + Andrew Brown + Andrew Church + Andrew Hintz + Andrew Nording + Andrew Tridgell + Andy Heffernan + Anton Bernal + Arkadiusz Miskiewicz + Armando L. Caro Jr. + Arnaldo Carvalho de Melo + Ben Byer + Atsushi Onoe + Ben Smithurst + Bert Vermeulen + Bjoern A. Zeeb + Brent L. Bates + Brian Ginsbach + Bruce M. Simpson + Carles Kishimoto Bisbe + Charlie Lenahan + Charles M. Hannum + Chris Cogdon + Chris G. Demetriou + Chris Jepeway + Chris Larson + Christian Sievers + Christophe Rhodes + Craig Rodrigues + Crist J. Clark + Daniel Hagerty + Darren Reed + David Binderman + David Horn + David Smith + David Young + Dmitry Eremin-Solenikov + Don Ebright + Eddie Kohler + Elmar Kirchner + Fang Wang + Florent Drouin + Florian Forster + Francis Dupont + Francisco Matias Cuenca-Acuna + Francois-Xavier Le Bail + Frank Volf + Fulvio Risso + George Bakos + Gerald Combs + Gerrit Renker + Gert Doering + Greg Minshall + Greg Stark + Grégoire Henry + Gilbert Ramirez Jr. + Gisle Vanem + Hannes Viertel + Hank Leininger + Harry Raaymakers + Heinz-Ado Arnolds + Hendrik Scholz + Ian McDonald + Ilpo Järvinen + Jacek Tobiasz + Jakob Schlyter + Jamal Hadi Salim + Jan Oravec + Jason R. Thorpe + Jefferson Ogata + Jeffrey Hutzelman + Jesper Peterson + Jim Hutchins + Jonathan Heusser + Tatuya Jinmei + João Medeiros + Joerg Mayer + Jørgen Thomsen + Julian Cowley + Juliusz Chroboczek + Kaarthik Sivakumar + Kaladhar Musunuru + Karl Norby + Kazushi Sugyo + Kelly Carmichael + Ken Hornstein + Kevin Steves + Klaus Klein + Kris Kennaway + Krzysztof Halasa + Larry Lile + Lennert Buytenhek + Loris Degioanni + Love Hörnquist-Åstrand + Lucas C. Villa Real + Luis MartinGarcia + Maciej W. Rozycki + Manu Pathak + Marc Binderberger + Marc A. Lehmann + Mark Ellzey Thomas + Marko Kiiskila + Markus Schöpflin + Marshall Rose + Martin Husemann + Max Laier + Michael A. Meffie III + Michael Madore + Michael Riepe + Michael Shalayeff + Michael Shields + Michael T. Stolarchuk + Michal Sekletar + Michele "mydecay" Marchetto + Mike Frysinger + Minto Jeyananth + Monroe Williams + Motonori Shindo + Nathan J. Williams + Nathaniel Couper-Noles + Neil T. Spring + Niels Provos + Nickolai Zeldovich + Nicolas Ferrero + Noritoshi Demizu + Olaf Kirch + Onno van der Linden + Paolo Abeni + Pascal Hennequin + Pasvorn Boonmark + Paul Ferrell + Paul Mundt + Paul S. Traina + Pavlin Radoslavov + Pawel Worach + Pekka Savola + Peter Fales + Peter Jeremy + + Peter Volkov + Phil Wood + Rafal Maszkowski + Randy Sofia + Raphael Raimbault + Rick Cheng + Rick Jones + Rick Watson + Rob Braun + Robert Edmonds + Roderick Schertler + Romain Francoise + Sagun Shakya + Sami Farin + Scott Mcmillan + Scott Rose + Sebastian Krahmer + Sebastien Raveau + Sebastien Vincent + Sepherosa Ziehau + Seth Webster + Shinsuke Suzuki + Steinar Haug + Swaminathan Chandrasekaran + Takashi Yamamoto + Terry Kennedy + Timo Koskiahde + Tony Li + Toshihiro Kanda + Uns Lider + Victor Oppleman + Weesan Lee + Wesley Griffin + Wesley Shields + Wilbert de Graaf + Will Drewry + William J. Hulley + Yen Yen Lim + Yoshifumi Nishida The original LBL crew: - Steve McCanne - Craig Leres - Van Jacobson + Steve McCanne + Craig Leres + Van Jacobson Past maintainers: - Jun-ichiro itojun Hagino + Jun-ichiro itojun Hagino diff --git a/contrib/tcpdump/Makefile.in b/contrib/tcpdump/Makefile.in index 8e7b73b4cf6..d7a81bc6494 100644 --- a/contrib/tcpdump/Makefile.in +++ b/contrib/tcpdump/Makefile.in @@ -26,6 +26,7 @@ # Top level hierarchy prefix = @prefix@ exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ # Pathname of directory to install the binary sbindir = @sbindir@ # Pathname of directory to install the man page @@ -46,7 +47,8 @@ INCLS = -I. @V_INCLS@ DEFS = @DEFS@ @CPPFLAGS@ @V_DEFS@ # Standard CFLAGS -CFLAGS = $(CCOPT) $(DEFS) $(INCLS) +CFLAGS = @CFLAGS@ +FULL_CFLAGS = $(CCOPT) $(DEFS) $(INCLS) $(CFLAGS) # Standard LDFLAGS LDFLAGS = @LDFLAGS@ @@ -64,15 +66,15 @@ RANLIB = @RANLIB@ # problem if you don't own the file but can write to the directory. .c.o: @rm -f $@ - $(CC) $(CFLAGS) -c $(srcdir)/$*.c + $(CC) $(FULL_CFLAGS) -c $(srcdir)/$*.c CSRC = addrtoname.c af.c checksum.c cpack.c gmpls.c oui.c gmt2local.c ipproto.c \ - nlpid.c l2vpn.c machdep.c parsenfsfh.c \ - print-802_11.c print-ap1394.c print-ah.c print-arcnet.c \ - print-aodv.c print-arp.c print-ascii.c print-atalk.c print-atm.c \ - print-beep.c print-bfd.c print-bgp.c print-bootp.c print-bt.c \ - print-cdp.c print-cfm.c print-chdlc.c print-cip.c print-cnfp.c \ - print-dccp.c print-decnet.c \ + nlpid.c l2vpn.c machdep.c parsenfsfh.c in_cksum.c \ + print-802_11.c print-802_15_4.c print-ap1394.c print-ah.c \ + print-arcnet.c print-aodv.c print-arp.c print-ascii.c print-atalk.c \ + print-atm.c print-beep.c print-bfd.c print-bgp.c \ + print-bootp.c print-bt.c print-carp.c print-cdp.c print-cfm.c \ + print-chdlc.c print-cip.c print-cnfp.c print-dccp.c print-decnet.c \ print-domain.c print-dtp.c print-dvmrp.c print-enc.c print-egp.c \ print-eap.c print-eigrp.c\ print-esp.c print-ether.c print-fddi.c print-fr.c \ @@ -83,8 +85,9 @@ CSRC = addrtoname.c af.c checksum.c cpack.c gmpls.c oui.c gmt2local.c ipproto.c print-lmp.c print-lspping.c print-lwapp.c \ print-lwres.c print-mobile.c print-mpcp.c print-mpls.c print-msdp.c \ print-nfs.c print-ntp.c print-null.c print-olsr.c print-ospf.c \ - print-pgm.c print-pim.c print-ppp.c print-pppoe.c print-pptp.c \ - print-radius.c print-raw.c print-rip.c print-rrcp.c print-rsvp.c \ + print-pgm.c print-pim.c \ + print-ppi.c print-ppp.c print-pppoe.c print-pptp.c \ + print-radius.c print-raw.c print-rip.c print-rpki-rtr.c print-rrcp.c print-rsvp.c \ print-rx.c print-sctp.c print-sflow.c print-sip.c print-sl.c print-sll.c \ print-slow.c print-snmp.c print-stp.c print-sunatm.c print-sunrpc.c \ print-symantec.c print-syslog.c print-tcp.c print-telnet.c print-tftp.c \ @@ -165,6 +168,7 @@ HDR = \ oui.h \ pcap-missing.h \ pmap_prot.h \ + ppi.h \ ppp.h \ route6d.h \ rpc_auth.h \ @@ -226,16 +230,12 @@ EXTRA_DIST = \ lbl/os-ultrix4.h \ makemib \ missing/addrinfo.h \ - missing/addrsize.h \ - missing/bittypes.h \ missing/dlnames.c \ missing/datalinks.c \ missing/getnameinfo.c \ missing/inet_aton.c \ missing/inet_ntop.c \ missing/inet_pton.c \ - missing/resolv6.h \ - missing/resolv_ext.h \ missing/snprintf.c \ missing/sockstorage.h \ missing/strdup.c \ @@ -245,6 +245,7 @@ EXTRA_DIST = \ mkdep \ packetdat.awk \ pcap_dump_ftell.c \ + print-babel.c \ print-dhcp6.c \ print-frag6.c \ print-icmp6.c \ @@ -262,12 +263,18 @@ EXTRA_DIST = \ stime.awk \ strcasecmp.c \ tcpdump.1.in \ - tests/02-sunrise-sunset-esp.puu \ - tests/08-sunrise-sunset-aes.puu \ - tests/08-sunrise-sunset-esp2.puu \ + tests/02-sunrise-sunset-esp.pcap \ + tests/08-sunrise-sunset-aes.pcap \ + tests/08-sunrise-sunset-esp2.pcap \ + tests/QinQpacket.out \ + tests/QinQpacket.pcap \ + tests/QinQpacketv.out \ tests/TESTLIST \ tests/TESTonce \ tests/TESTrun.sh \ + tests/babel.pcap \ + tests/babel1.out \ + tests/babel1v.out \ tests/bgp-infinite-loop.pcap \ tests/bgp_vpn_attrset.out \ tests/bgp_vpn_attrset.pcap \ @@ -279,8 +286,8 @@ EXTRA_DIST = \ tests/e1000g.pcap \ tests/eapon1.gdbinit \ tests/eapon1.out \ - tests/eapon1.puu \ - tests/eapon2.puu \ + tests/eapon1.pcap \ + tests/empty.uu \ tests/esp-secrets.txt \ tests/esp0.out \ tests/esp1.gdbinit \ @@ -292,61 +299,57 @@ EXTRA_DIST = \ tests/esp5.gdbinit \ tests/esp5.out \ tests/espudp1.out \ - tests/espudp1.puu \ + tests/espudp1.pcap \ tests/forces1.out \ tests/forces1.pcap \ tests/forces1vvv.out \ tests/forces1vvvv.out \ tests/forces2.out \ - tests/forces2.pcap \ tests/forces2v.out \ tests/forces2vv.out \ - tests/ikev2.puu \ + tests/forces3vvv.out \ tests/ikev2four.out \ - tests/ikev2four.puu \ + tests/ikev2four.pcap \ tests/ikev2fourv.out \ tests/ikev2fourv4.out \ tests/ikev2pI2-secrets.txt \ tests/ikev2pI2.out \ - tests/ikev2pI2.puu \ - tests/isakmp-delete-segfault.puu \ - tests/isakmp-identification-segfault.puu \ - tests/isakmp-pointer-loop.puu \ + tests/ikev2pI2.pcap \ + tests/isakmp-delete-segfault.pcap \ + tests/isakmp-identification-segfault.pcap \ + tests/isakmp-pointer-loop.pcap \ tests/isakmp1.out \ tests/isakmp2.out \ tests/isakmp3.out \ tests/isakmp4.out \ - tests/isakmp4500.puu \ + tests/isakmp4500.pcap \ tests/isis-infinite-loop.pcap \ tests/ldp-infinite-loop.pcap \ tests/lmp.out \ - tests/lmp.puu \ + tests/lmp.pcap \ tests/lmp.sh \ tests/lspping-fec-ldp.pcap \ tests/lspping-fec-rsvp.pcap \ tests/mpls-ldp-hello.out \ - tests/mpls-ldp-hello.puu \ + tests/mpls-ldp-hello.pcap \ tests/mpls-traceroute.pcap \ tests/ospf-gmpls.out \ - tests/ospf-gmpls.puu \ + tests/ospf-gmpls.pcap \ tests/print-A.out \ tests/print-AA.out \ tests/print-capX.out \ tests/print-capXX.out \ - tests/print-flags.puu \ + tests/print-flags.pcap \ tests/print-flags.sh \ tests/print-x.out \ tests/print-xx.out \ tests/rsvp-infinite-loop.pcap \ + tests/sflow_multiple_counter_30_pdus.out \ + tests/sflow_multiple_counter_30_pdus.pcap \ vfprintf.c \ - win32/Include/Arpa/tftp.h \ win32/Include/errno.h \ win32/Include/getopt.h \ - win32/Include/inetprivate.h \ - win32/Include/telnet.h \ win32/Include/w32_fzs.h \ - win32/Include/Netinet/in_systm.h \ - win32/Include/Netinet/ip.h \ win32/Src/getopt.c \ win32/prj/GNUmakefile \ win32/prj/WinDump.dsp \ @@ -356,7 +359,7 @@ all: $(PROG) $(PROG): $(OBJ) @V_PCAPDEP@ @rm -f $@ - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(LIBS) + $(CC) $(FULL_CFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(LIBS) $(LIBNETDISSECT): $(LIBNETDISSECT_OBJ) @rm -f $@ @@ -364,30 +367,30 @@ $(LIBNETDISSECT): $(LIBNETDISSECT_OBJ) $(RANLIB) $@ datalinks.o: $(srcdir)/missing/datalinks.c - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/datalinks.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/datalinks.c dlnames.o: $(srcdir)/missing/dlnames.c - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/dlnames.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/dlnames.c getnameinfo.o: $(srcdir)/missing/getnameinfo.c - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/getnameinfo.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/getnameinfo.c getaddrinfo.o: $(srcdir)/missing/getaddrinfo.c - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/getaddrinfo.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/getaddrinfo.c inet_pton.o: $(srcdir)/missing/inet_pton.c - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/inet_pton.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/inet_pton.c inet_ntop.o: $(srcdir)/missing/inet_ntop.c - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/inet_ntop.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/inet_ntop.c inet_aton.o: $(srcdir)/missing/inet_aton.c - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/inet_aton.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/inet_aton.c snprintf.o: $(srcdir)/missing/snprintf.c - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/snprintf.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/snprintf.c strlcat.o: $(srcdir)/missing/strlcat.c - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/strlcat.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/strlcat.c strlcpy.o: $(srcdir)/missing/strlcpy.c - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/strlcpy.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/strlcpy.c strsep.o: $(srcdir)/missing/strsep.c - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/strsep.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/strsep.c version.o: version.c - $(CC) $(CFLAGS) -c version.c + $(CC) $(FULL_CFLAGS) -c version.c version.c: $(srcdir)/VERSION @rm -f $@ @@ -423,9 +426,9 @@ clean: distclean: rm -f $(CLEANFILES) Makefile config.cache config.log config.status \ config.h gnuc.h os-proto.h stamp-h stamp-h.in $(PROG).1 + rm -rf autom4te.cache check: tcpdump - uudecode --help || (echo "No uudecode program found, not running tests"; echo "apt-get/rpm install sharutils?"; exit 1) (cd tests && ./TESTrun.sh) tags: $(TAGFILES) diff --git a/contrib/tcpdump/VERSION b/contrib/tcpdump/VERSION index 627a3f43a64..fae6e3d04b2 100644 --- a/contrib/tcpdump/VERSION +++ b/contrib/tcpdump/VERSION @@ -1 +1 @@ -4.1.1 +4.2.1 diff --git a/contrib/tcpdump/acconfig.h b/contrib/tcpdump/acconfig.h index 97417969a27..9eb54f8b3df 100644 --- a/contrib/tcpdump/acconfig.h +++ b/contrib/tcpdump/acconfig.h @@ -8,12 +8,6 @@ /* Define if you enable support for the libsmi. */ #undef LIBSMI -/* define if you have struct __res_state_ext */ -#undef HAVE_RES_STATE_EXT - -/* define if your struct __res_state has the nsort member */ -#undef HAVE_NEW_RES_STATE - /* define if you have the addrinfo function. */ #undef HAVE_ADDRINFO @@ -23,15 +17,6 @@ /* define ifyou have the h_errno variable. */ #undef HAVE_H_ERRNO -/* define if IN6ADDRSZ is defined (XXX not used!) */ -#undef HAVE_IN6ADDRSZ - -/* define if INADDRSZ is defined (XXX not used!) */ -#undef HAVE_INADDRSZ - -/* define if RES_USE_INET6 is defined */ -#undef HAVE_RES_USE_INET6 - /* define if you have struct sockaddr_storage */ #undef HAVE_SOCKADDR_STORAGE @@ -68,9 +53,6 @@ /* define if you have getrpcbynumber() */ #undef HAVE_GETRPCBYNUMBER -/* AIX hack. */ -#undef _SUN - /* Workaround for missing 64-bit formats */ #undef PRId64 #undef PRIo64 diff --git a/contrib/tcpdump/addrtoname.c b/contrib/tcpdump/addrtoname.c index 2f5b4660547..41ddcc68358 100644 --- a/contrib/tcpdump/addrtoname.c +++ b/contrib/tcpdump/addrtoname.c @@ -509,6 +509,34 @@ etheraddr_string(register const u_char *ep) return (tp->e_name); } +const char * +le64addr_string(const u_char *ep) +{ + const unsigned int len = 8; + register u_int i; + register char *cp; + register struct enamemem *tp; + char buf[BUFSIZE]; + + tp = lookup_bytestring(ep, len); + if (tp->e_name) + return (tp->e_name); + + cp = buf; + for (i = len; i > 0 ; --i) { + *cp++ = hex[*(ep + i - 1) >> 4]; + *cp++ = hex[*(ep + i - 1) & 0xf]; + *cp++ = ':'; + } + cp --; + + *cp = '\0'; + + tp->e_name = strdup(buf); + + return (tp->e_name); +} + const char * linkaddr_string(const u_char *ep, const unsigned int type, const unsigned int len) { diff --git a/contrib/tcpdump/addrtoname.h b/contrib/tcpdump/addrtoname.h index 1df204a941f..cd5c41f4a5f 100644 --- a/contrib/tcpdump/addrtoname.h +++ b/contrib/tcpdump/addrtoname.h @@ -34,6 +34,7 @@ enum { extern const char *linkaddr_string(const u_char *, const unsigned int, const unsigned int); extern const char *etheraddr_string(const u_char *); +extern const char *le64addr_string(const u_char *); extern const char *etherproto_string(u_short); extern const char *tcpport_string(u_short); extern const char *udpport_string(u_short); diff --git a/contrib/tcpdump/bootp.h b/contrib/tcpdump/bootp.h index 65ca3766c71..b1b81dce908 100644 --- a/contrib/tcpdump/bootp.h +++ b/contrib/tcpdump/bootp.h @@ -37,7 +37,7 @@ struct bootp { u_int8_t bp_sname[64]; /* server host name */ u_int8_t bp_file[128]; /* boot file name */ u_int8_t bp_vend[64]; /* vendor-specific area */ -}; +} UNALIGNED; /* * UDP port numbers, server and client. @@ -217,7 +217,7 @@ struct cmu_vend { struct in_addr v_ins1, v_ins2; /* IEN-116 name servers */ struct in_addr v_ts1, v_ts2; /* Time servers */ u_int8_t v_unused[24]; /* currently unused */ -}; +} UNALIGNED; /* v_flags values */ diff --git a/contrib/tcpdump/config.h.in b/contrib/tcpdump/config.h.in index 20c3fcf394a..9ee068be14f 100644 --- a/contrib/tcpdump/config.h.in +++ b/contrib/tcpdump/config.h.in @@ -8,12 +8,6 @@ /* Define if you enable support for the libsmi. */ #undef LIBSMI -/* define if you have struct __res_state_ext */ -#undef HAVE_RES_STATE_EXT - -/* define if your struct __res_state has the nsort member */ -#undef HAVE_NEW_RES_STATE - /* define if you have the addrinfo function. */ #undef HAVE_ADDRINFO @@ -23,15 +17,6 @@ /* define ifyou have the h_errno variable. */ #undef HAVE_H_ERRNO -/* define if IN6ADDRSZ is defined (XXX not used!) */ -#undef HAVE_IN6ADDRSZ - -/* define if INADDRSZ is defined (XXX not used!) */ -#undef HAVE_INADDRSZ - -/* define if RES_USE_INET6 is defined */ -#undef HAVE_RES_USE_INET6 - /* define if you have struct sockaddr_storage */ #undef HAVE_SOCKADDR_STORAGE @@ -68,9 +53,6 @@ /* define if you have getrpcbynumber() */ #undef HAVE_GETRPCBYNUMBER -/* AIX hack. */ -#undef _SUN - /* Workaround for missing 64-bit formats */ #undef PRId64 #undef PRIo64 @@ -108,6 +90,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + /* Define to 1 if you have the `getnameinfo' function. */ #undef HAVE_GETNAMEINFO @@ -165,6 +150,9 @@ /* Define to 1 if you have the `pcap_lib_version' function. */ #undef HAVE_PCAP_LIB_VERSION +/* Define to 1 if you have the `pcap_set_tstamp_type' function. */ +#undef HAVE_PCAP_SET_TSTAMP_TYPE + /* Define to 1 if you have the header file. */ #undef HAVE_PCAP_USB_H @@ -174,6 +162,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_RPC_RPCENT_H +/* Define to 1 if you have the header file. */ +#undef HAVE_RPC_RPC_H + /* Define to 1 if you have the `setlinebuf' function. */ #undef HAVE_SETLINEBUF @@ -237,6 +228,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H +/* Define to 1 if you have the `vfork' function. */ +#undef HAVE_VFORK + /* Define to 1 if you have the `vfprintf' function. */ #undef HAVE_VFPRINTF @@ -276,21 +270,6 @@ /* return value of signal handlers */ #undef RETSIGVAL -/* The size of `char', as computed by sizeof. */ -#undef SIZEOF_CHAR - -/* The size of `int', as computed by sizeof. */ -#undef SIZEOF_INT - -/* The size of `long', as computed by sizeof. */ -#undef SIZEOF_LONG - -/* The size of `long long', as computed by sizeof. */ -#undef SIZEOF_LONG_LONG - -/* The size of `short', as computed by sizeof. */ -#undef SIZEOF_SHORT - /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS @@ -303,6 +282,9 @@ /* needed on HP-UX */ #undef _HPUX_SOURCE +/* define on AIX to get certain functions */ +#undef _SUN + /* define if your compiler allows __attribute__((format)) to be applied to function pointers */ #undef __ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS diff --git a/contrib/tcpdump/configure b/contrib/tcpdump/configure index cb51d19c805..f481d333d3f 100755 --- a/contrib/tcpdump/configure +++ b/contrib/tcpdump/configure @@ -1267,6 +1267,7 @@ if test -n "$ac_init_help"; then Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-universal don't build universal on OS X --enable-smb enable possibly-buggy SMB printer default=yes --disable-smb disable possibly-buggy SMB printer --enable-ipv6 enable ipv6 (with ipv4) support @@ -1845,7 +1846,7 @@ fi V_CCOPT="-O" V_INCLS="" if test "${srcdir}" != "." ; then - V_INCLS="-I\$(srcdir)" + V_INCLS="-I$srcdir" fi if test "${CFLAGS+set}" = set; then LBL_CFLAGS="$CFLAGS" @@ -3217,7 +3218,8 @@ if test "${ac_cv___attribute__+set}" = set; then else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ + + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -3290,7 +3292,8 @@ if test "${ac_cv___attribute___format_function_pointer+set}" = set; then else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ + + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -3986,7 +3989,8 @@ done -for ac_header in fcntl.h rpc/rpcent.h netdnet/dnetdb.h + +for ac_header in fcntl.h rpc/rpc.h rpc/rpcent.h netdnet/dnetdb.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then @@ -4387,6 +4391,36 @@ fi case "$host_os" in +darwin*) + # Check whether --enable-universal was given. +if test "${enable_universal+set}" = set; then + enableval=$enable_universal; +fi + + if test "$enable_universal" != "no"; then + case "$host_os" in + + darwin9.*) + # + # Leopard. Build for x86 and 32-bit PowerPC, with + # x86 first. (That's what Apple does.) + # + V_CCOPT="$V_CCOPT -arch i386 -arch ppc" + LDFLAGS="$LDFLAGS -arch i386 -arch ppc" + ;; + + darwin10.*) + # + # Snow Leopard. Build for x86-64 and x86, with + # x86-64 first. (That's what Apple does.) + # + V_CCOPT="$V_CCOPT -arch x86_64 -arch i386" + LDFLAGS="$LDFLAGS -arch x86_64 -arch i386" + ;; + esac + fi + ;; + linux*) { echo "$as_me:$LINENO: checking Linux kernel version" >&5 echo $ECHO_N "checking Linux kernel version... $ECHO_C" >&6; } @@ -4807,7 +4841,7 @@ if test "${enable_ipv6+set}" = set; then enableval=$enable_ipv6; case "$enableval" in yes) { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } - LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c $LOCALSRC" + LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c print-babel.c $LOCALSRC" cat >>confdefs.h <<\_ACEOF #define INET6 1 _ACEOF @@ -4867,7 +4901,7 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (exit $ac_status); }; }; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } - LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c $LOCALSRC" + LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c print-babel.c $LOCALSRC" cat >>confdefs.h <<\_ACEOF #define INET6 1 _ACEOF @@ -5467,2032 +5501,6 @@ _ACEOF fi -{ echo "$as_me:$LINENO: checking for char" >&5 -echo $ECHO_N "checking for char... $ECHO_C" >&6; } -if test "${ac_cv_type_char+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef char ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_char=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_char=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_char" >&5 -echo "${ECHO_T}$ac_cv_type_char" >&6; } - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ echo "$as_me:$LINENO: checking size of char" >&5 -echo $ECHO_N "checking size of char... $ECHO_C" >&6; } -if test "${ac_cv_sizeof_char+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef char ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef char ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef char ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef char ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo= ac_hi= -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef char ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr '(' $ac_mid ')' + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_char=$ac_lo;; -'') if test "$ac_cv_type_char" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (char) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (char) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_char=0 - fi ;; -esac -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef char ac__type_sizeof_; -static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } -static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (((long int) (sizeof (ac__type_sizeof_))) < 0) - { - long int i = longval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%ld\n", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%lu\n", i); - } - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_char=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -if test "$ac_cv_type_char" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (char) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (char) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_char=0 - fi -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.val -fi -{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_char" >&5 -echo "${ECHO_T}$ac_cv_sizeof_char" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_CHAR $ac_cv_sizeof_char -_ACEOF - - -{ echo "$as_me:$LINENO: checking for short" >&5 -echo $ECHO_N "checking for short... $ECHO_C" >&6; } -if test "${ac_cv_type_short+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef short ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_short=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_short=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5 -echo "${ECHO_T}$ac_cv_type_short" >&6; } - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ echo "$as_me:$LINENO: checking size of short" >&5 -echo $ECHO_N "checking size of short... $ECHO_C" >&6; } -if test "${ac_cv_sizeof_short+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef short ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef short ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef short ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef short ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo= ac_hi= -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef short ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr '(' $ac_mid ')' + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_short=$ac_lo;; -'') if test "$ac_cv_type_short" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (short) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (short) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_short=0 - fi ;; -esac -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef short ac__type_sizeof_; -static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } -static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (((long int) (sizeof (ac__type_sizeof_))) < 0) - { - long int i = longval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%ld\n", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%lu\n", i); - } - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_short=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -if test "$ac_cv_type_short" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (short) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (short) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_short=0 - fi -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.val -fi -{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5 -echo "${ECHO_T}$ac_cv_sizeof_short" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_SHORT $ac_cv_sizeof_short -_ACEOF - - -{ echo "$as_me:$LINENO: checking for int" >&5 -echo $ECHO_N "checking for int... $ECHO_C" >&6; } -if test "${ac_cv_type_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef int ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_int=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_int=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 -echo "${ECHO_T}$ac_cv_type_int" >&6; } - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ echo "$as_me:$LINENO: checking size of int" >&5 -echo $ECHO_N "checking size of int... $ECHO_C" >&6; } -if test "${ac_cv_sizeof_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo= ac_hi= -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr '(' $ac_mid ')' + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_int=$ac_lo;; -'') if test "$ac_cv_type_int" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_int=0 - fi ;; -esac -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } -static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (((long int) (sizeof (ac__type_sizeof_))) < 0) - { - long int i = longval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%ld\n", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%lu\n", i); - } - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_int=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -if test "$ac_cv_type_int" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_int=0 - fi -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.val -fi -{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 -echo "${ECHO_T}$ac_cv_sizeof_int" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_INT $ac_cv_sizeof_int -_ACEOF - - -{ echo "$as_me:$LINENO: checking for long" >&5 -echo $ECHO_N "checking for long... $ECHO_C" >&6; } -if test "${ac_cv_type_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef long ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_long=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_long=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 -echo "${ECHO_T}$ac_cv_type_long" >&6; } - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ echo "$as_me:$LINENO: checking size of long" >&5 -echo $ECHO_N "checking size of long... $ECHO_C" >&6; } -if test "${ac_cv_sizeof_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo= ac_hi= -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr '(' $ac_mid ')' + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_long=$ac_lo;; -'') if test "$ac_cv_type_long" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (long) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_long=0 - fi ;; -esac -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long ac__type_sizeof_; -static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } -static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (((long int) (sizeof (ac__type_sizeof_))) < 0) - { - long int i = longval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%ld\n", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%lu\n", i); - } - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_long=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -if test "$ac_cv_type_long" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (long) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_long=0 - fi -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.val -fi -{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 -echo "${ECHO_T}$ac_cv_sizeof_long" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_LONG $ac_cv_sizeof_long -_ACEOF - - -{ echo "$as_me:$LINENO: checking for long long" >&5 -echo $ECHO_N "checking for long long... $ECHO_C" >&6; } -if test "${ac_cv_type_long_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef long long ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_long_long=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_long_long=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5 -echo "${ECHO_T}$ac_cv_type_long_long" >&6; } - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ echo "$as_me:$LINENO: checking size of long long" >&5 -echo $ECHO_N "checking size of long long... $ECHO_C" >&6; } -if test "${ac_cv_sizeof_long_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long long ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long long ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long long ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long long ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo= ac_hi= -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long long ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr '(' $ac_mid ')' + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_long_long=$ac_lo;; -'') if test "$ac_cv_type_long_long" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long long) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_long_long=0 - fi ;; -esac -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long long ac__type_sizeof_; -static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } -static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (((long int) (sizeof (ac__type_sizeof_))) < 0) - { - long int i = longval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%ld\n", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%lu\n", i); - } - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_long_long=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -if test "$ac_cv_type_long_long" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long long) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_long_long=0 - fi -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.val -fi -{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_long" >&5 -echo "${ECHO_T}$ac_cv_sizeof_long_long" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long -_ACEOF - - - { echo "$as_me:$LINENO: checking for addrinfo" >&5 echo $ECHO_N "checking for addrinfo... $ECHO_C" >&6; } @@ -7706,326 +5714,6 @@ if test "$ac_cv_sa_storage" = no; then fi - ac_cv_addrsz=yes - { echo "$as_me:$LINENO: checking for INADDRSZ" >&5 -echo $ECHO_N "checking for INADDRSZ... $ECHO_C" >&6; } - if test "${ac_cv_inaddrsz+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -# include -int -main () -{ -int a = INADDRSZ - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_inaddrsz=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_inaddrsz=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - - { echo "$as_me:$LINENO: result: $ac_cv_inaddrsz" >&5 -echo "${ECHO_T}$ac_cv_inaddrsz" >&6; } - if test $ac_cv_inaddrsz = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_INADDRSZ 1 -_ACEOF - - else - ac_cv_addrsz=no - fi - { echo "$as_me:$LINENO: checking for IN6ADDRSZ" >&5 -echo $ECHO_N "checking for IN6ADDRSZ... $ECHO_C" >&6; } - if test "${ac_cv_in6addrsz+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -# include -int -main () -{ -int a = IN6ADDRSZ - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_in6addrsz=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_in6addrsz=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - - { echo "$as_me:$LINENO: result: $ac_cv_in6addrsz" >&5 -echo "${ECHO_T}$ac_cv_in6addrsz" >&6; } - if test $ac_cv_in6addrsz = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_IN6ADDRSZ 1 -_ACEOF - - else - ac_cv_addrsz=no - fi - -if test "$ac_cv_addrsz" = no; then - missing_includes=yes -fi - - - { echo "$as_me:$LINENO: checking for RES_USE_INET6" >&5 -echo $ECHO_N "checking for RES_USE_INET6... $ECHO_C" >&6; } - if test "${ac_cv_res_inet6+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -# include -# include -# include -int -main () -{ -int a = RES_USE_INET6 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_res_inet6=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_res_inet6=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - - { echo "$as_me:$LINENO: result: $ac_cv_res_inet6" >&5 -echo "${ECHO_T}$ac_cv_res_inet6" >&6; } - if test $ac_cv_res_inet6 = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_RES_USE_INET6 1 -_ACEOF - - fi - -if test "$ac_cv_res_inet6" = no; then - missing_includes=yes -fi - - - { echo "$as_me:$LINENO: checking for res_state_ext" >&5 -echo $ECHO_N "checking for res_state_ext... $ECHO_C" >&6; } - if test "${ac_cv_res_state_ext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -# include -# include -# include -# include -int -main () -{ -struct __res_state_ext e - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_res_state_ext=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_res_state_ext=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - - { echo "$as_me:$LINENO: result: $ac_cv_res_state_ext" >&5 -echo "${ECHO_T}$ac_cv_res_state_ext" >&6; } - if test $ac_cv_res_state_ext = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_RES_STATE_EXT 1 -_ACEOF - - fi - -if test "$ac_cv_res_state_ext" = no; then - missing_includes=yes -fi - - - { echo "$as_me:$LINENO: checking for nsort in res_state" >&5 -echo $ECHO_N "checking for nsort in res_state... $ECHO_C" >&6; } - if test "${ac_cv_res_state+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -# include -# include -# include -# include -int -main () -{ -struct __res_state e; e.nsort = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_res_state=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_res_state=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - - { echo "$as_me:$LINENO: result: $ac_cv_res_state" >&5 -echo "${ECHO_T}$ac_cv_res_state" >&6; } - if test $ac_cv_res_state = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_NEW_RES_STATE 1 -_ACEOF - - fi - - - - @@ -8133,7 +5821,9 @@ done -for ac_func in strftime + + +for ac_func in fork vfork strftime do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 @@ -9465,8 +7155,9 @@ echo "${ECHO_T}not found" >&6; } # # Look for pcap-config. # - # Extract the first word of "pcap-config", so it can be a program name with args. -set dummy pcap-config; ac_word=$2 + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pcap-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pcap-config; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_PCAP_CONFIG+set}" = set; then @@ -9505,13 +7196,82 @@ echo "${ECHO_T}no" >&6; } fi +fi +if test -z "$ac_cv_path_PCAP_CONFIG"; then + ac_pt_PCAP_CONFIG=$PCAP_CONFIG + # Extract the first word of "pcap-config", so it can be a program name with args. +set dummy pcap-config; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_path_ac_pt_PCAP_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $ac_pt_PCAP_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PCAP_CONFIG="$ac_pt_PCAP_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_pt_PCAP_CONFIG="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PCAP_CONFIG=$ac_cv_path_ac_pt_PCAP_CONFIG +if test -n "$ac_pt_PCAP_CONFIG"; then + { echo "$as_me:$LINENO: result: $ac_pt_PCAP_CONFIG" >&5 +echo "${ECHO_T}$ac_pt_PCAP_CONFIG" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_pt_PCAP_CONFIG" = x; then + PCAP_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + PCAP_CONFIG=$ac_pt_PCAP_CONFIG + fi +else + PCAP_CONFIG="$ac_cv_path_PCAP_CONFIG" +fi + if test -n "$PCAP_CONFIG" ; then # # Found - use it to get the include flags for # libpcap and the flags to link with libpcap. # - V_INCLS="`\"$PCAP_CONFIG\" --cflags` $V_INCLS" - libpcap="`\"$PCAP_CONFIG\" --libs`" + # Please read section 11.6 "Shell Substitutions" + # in the autoconf manual before doing anything + # to this that involves quoting. Especially note + # the statement "There is just no portable way to use + # double-quoted strings inside double-quoted back-quoted + # expressions (pfew!)." + # + cflags=`"$PCAP_CONFIG" --cflags` + V_INCLS="$cflags $V_INCLS" + libpcap=`"$PCAP_CONFIG" --libs` else # # Not found; look for pcap. @@ -9659,9 +7419,17 @@ fi # The libpcap directory has a pcap-config script. # Use it to get any additioal libraries needed # to link with the libpcap archive library in - # that directory + # that directory. # - libpcap="$libpcap `\"$PCAP_CONFIG\" --additional-libs --static`" + # Please read section 11.6 "Shell Substitutions" + # in the autoconf manual before doing anything + # to this that involves quoting. Especially note + # the statement "There is just no portable way to use + # double-quoted strings inside double-quoted back-quoted + # expressions (pfew!)." + # + additional_libs=`"$PCAP_CONFIG" --additional-libs --static` + libpcap="$libpcap $additional_libs" fi fi LIBS="$libpcap $LIBS" @@ -9700,6 +7468,100 @@ echo "${ECHO_T}yes" >&6; } esac fi + { echo "$as_me:$LINENO: checking for pcap_loop" >&5 +echo $ECHO_N "checking for pcap_loop... $ECHO_C" >&6; } +if test "${ac_cv_func_pcap_loop+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define pcap_loop to an innocuous variant, in case declares pcap_loop. + For example, HP-UX 11i declares gettimeofday. */ +#define pcap_loop innocuous_pcap_loop + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char pcap_loop (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef pcap_loop + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pcap_loop (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_pcap_loop || defined __stub___pcap_loop +choke me +#endif + +int +main () +{ +return pcap_loop (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_pcap_loop=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_pcap_loop=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_pcap_loop" >&5 +echo "${ECHO_T}$ac_cv_func_pcap_loop" >&6; } +if test $ac_cv_func_pcap_loop = yes; then + : +else + + { { echo "$as_me:$LINENO: error: Report this to tcpdump-workers@lists.tcpdump.org, and include the +config.log file in your report" >&5 +echo "$as_me: error: Report this to tcpdump-workers@lists.tcpdump.org, and include the +config.log file in your report" >&2;} + { (exit 1); exit 1; }; } + +fi + + { echo "$as_me:$LINENO: checking for pcap_list_datalinks" >&5 echo $ECHO_N "checking for pcap_list_datalinks... $ECHO_C" >&6; } if test "${ac_cv_func_pcap_list_datalinks+set}" = set; then @@ -11173,7 +9035,9 @@ fi # # Do we have the new open API? Check for pcap_create, and assume that, -# if we do, we also have pcap_activate() and the other new routines. +# if we do, we also have pcap_activate() and the other new routines +# introduced in libpcap 1.0.0. +# for ac_func in pcap_create do @@ -11268,6 +9132,106 @@ _ACEOF fi done +if test $ac_cv_func_pcap_create = "yes" ; then + # + # OK, do we have pcap_set_tstamp_type? If so, assume we have + # pcap_list_tstamp_types and pcap_free_tstamp_types as well. + # + +for ac_func in pcap_set_tstamp_type +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +fi @@ -11734,7 +9698,8 @@ MAN_MISC_INFO=7 case "$host_os" in aix*) - cat >>confdefs.h <<\_ACEOF + +cat >>confdefs.h <<\_ACEOF #define _SUN 1 _ACEOF @@ -11783,294 +9748,6 @@ if test -f /dev/bpf0 ; then V_GROUP=bpf fi -# -# Check for some headers introduced in later versions of libpcap -# and used by some printers. -# -savedcppflags="$CPPFLAGS" -CPPFLAGS="$CPPFLAGS $V_INCLS" - -for ac_header in pcap/bluetooth.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -else - # Is the header compilable? -{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6; } - -# Is the header present? -{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in pcap/usb.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -else - # Is the header compilable? -{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6; } - -# Is the header present? -{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -CPPFLAGS="$savedcppflags" - for ac_header in sys/bitypes.h do @@ -13364,6 +11041,133 @@ fi fi +# +# Check for some headers introduced in later versions of libpcap +# and used by some printers. +# +# Those headers use the {u_}intN_t types, so we must do this after +# we check for what's needed to get them defined. +# +savedcppflags="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $V_INCLS" + +for ac_header in pcap/bluetooth.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in pcap/usb.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +CPPFLAGS="$savedcppflags" + if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 @@ -13944,6 +11748,7 @@ _ACEOF fi + savedppflags="$CPPLAGS" CPPFLAGS="$CPPFLAGS $V_INCLS" for ac_header in openssl/evp.h @@ -14085,6 +11890,7 @@ fi done + CPPFLAGS="$savedcppflags" else # # Not found. Did the user explicitly ask for it? @@ -14100,8 +11906,8 @@ echo "$as_me: error: SSLeay not found" >&2;} fi if test "$missing_includes" = "yes"; then - CPPFLAGS="$CPPFLAGS -I\$(srcdir)/missing" - V_INCLS="$V_INCLS -I\$(srcdir)/missing" + CPPFLAGS="$CPPFLAGS -I$srcdir/missing" + V_INCLS="$V_INCLS -I$srcdir/missing" fi diff --git a/contrib/tcpdump/configure.in b/contrib/tcpdump/configure.in index eb3e5e8b1dd..4ac664ecf09 100755 --- a/contrib/tcpdump/configure.in +++ b/contrib/tcpdump/configure.in @@ -29,7 +29,7 @@ AC_C___ATTRIBUTE__ if test "$ac_cv___attribute__" = "yes"; then AC_C___ATTRIBUTE___FORMAT_FUNCTION_POINTER fi -AC_CHECK_HEADERS(fcntl.h rpc/rpcent.h netdnet/dnetdb.h) +AC_CHECK_HEADERS(fcntl.h rpc/rpc.h rpc/rpcent.h netdnet/dnetdb.h) AC_CHECK_HEADERS(net/pfvar.h, , , [#include #include #include ]) @@ -60,6 +60,33 @@ AC_HEADER_TIME case "$host_os" in +darwin*) + AC_ARG_ENABLE(universal, + AC_HELP_STRING([--disable-universal],[don't build universal on OS X])) + if test "$enable_universal" != "no"; then + case "$host_os" in + + darwin9.*) + # + # Leopard. Build for x86 and 32-bit PowerPC, with + # x86 first. (That's what Apple does.) + # + V_CCOPT="$V_CCOPT -arch i386 -arch ppc" + LDFLAGS="$LDFLAGS -arch i386 -arch ppc" + ;; + + darwin10.*) + # + # Snow Leopard. Build for x86-64 and x86, with + # x86-64 first. (That's what Apple does.) + # + V_CCOPT="$V_CCOPT -arch x86_64 -arch i386" + LDFLAGS="$LDFLAGS -arch x86_64 -arch i386" + ;; + esac + fi + ;; + linux*) AC_MSG_CHECKING(Linux kernel version) if test "$cross_compiling" = yes; then @@ -172,7 +199,7 @@ AC_ARG_ENABLE(ipv6, --disable-ipv6 disable ipv6 support], [ case "$enableval" in yes) AC_MSG_RESULT(yes) - LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c $LOCALSRC" + LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c print-babel.c $LOCALSRC" AC_DEFINE(INET6) ipv6=yes ;; @@ -194,7 +221,7 @@ main() } ], [ AC_MSG_RESULT(yes) - LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c $LOCALSRC" + LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c print-babel.c $LOCALSRC" AC_DEFINE(INET6) ipv6=yes], [ AC_MSG_RESULT(no) @@ -467,15 +494,6 @@ if test "$td_cv_decl_netdnet_dnetdb_h_dnet_htoa" = yes; then AC_DEFINE(HAVE_NETDNET_DNETDB_H_DNET_HTOA) fi -dnl -dnl check sizeof basic types. -dnl They're very likely to be wrong for cross-compiling. -AC_CHECK_SIZEOF(char, 1) -AC_CHECK_SIZEOF(short, 2) -AC_CHECK_SIZEOF(int, 4) -AC_CHECK_SIZEOF(long, 4) -AC_CHECK_SIZEOF(long long, 8) - dnl dnl Checks for addrinfo structure AC_STRUCT_ADDRINFO(ac_cv_addrinfo) @@ -504,34 +522,8 @@ if test "$ac_cv_sa_storage" = no; then missing_includes=yes fi -dnl -dnl Checks for IN[6]ADDRSZ -AC_CHECK_ADDRSZ(ac_cv_addrsz) -if test "$ac_cv_addrsz" = no; then - missing_includes=yes -fi - -dnl -dnl Checks for RES_USE_INET6 -AC_CHECK_RES_USE_INET6(ac_cv_res_inet6) -if test "$ac_cv_res_inet6" = no; then - missing_includes=yes -fi - -dnl -dnl Checks for res_state_ext structure -AC_STRUCT_RES_STATE_EXT(ac_cv_res_state_ext) -if test "$ac_cv_res_state_ext" = no; then - missing_includes=yes -fi - -dnl -dnl Checks if res_state structure has nsort member. -AC_STRUCT_RES_STATE(ac_cv_res_state) - - AC_REPLACE_FUNCS(vfprintf strcasecmp strlcat strlcpy strdup strsep) -AC_CHECK_FUNCS(strftime) +AC_CHECK_FUNCS(fork vfork strftime) AC_CHECK_FUNCS(setlinebuf alarm) needsnprintf=no @@ -723,8 +715,17 @@ fi # # Do we have the new open API? Check for pcap_create, and assume that, -# if we do, we also have pcap_activate() and the other new routines. +# if we do, we also have pcap_activate() and the other new routines +# introduced in libpcap 1.0.0. +# AC_CHECK_FUNCS(pcap_create) +if test $ac_cv_func_pcap_create = "yes" ; then + # + # OK, do we have pcap_set_tstamp_type? If so, assume we have + # pcap_list_tstamp_types and pcap_free_tstamp_types as well. + # + AC_CHECK_FUNCS(pcap_set_tstamp_type) +fi AC_CHECK_FUNCS(pcap_findalldevs pcap_dump_flush pcap_lib_version) if test $ac_cv_func_pcap_findalldevs = "yes" ; then @@ -803,7 +804,7 @@ case "$host_os" in aix*) dnl Workaround to enable certain features - AC_DEFINE(_SUN) + AC_DEFINE(_SUN,1,[define on AIX to get certain functions]) ;; hpux*) @@ -849,16 +850,6 @@ if test -f /dev/bpf0 ; then V_GROUP=bpf fi -# -# Check for some headers introduced in later versions of libpcap -# and used by some printers. -# -savedcppflags="$CPPFLAGS" -CPPFLAGS="$CPPFLAGS $V_INCLS" -AC_CHECK_HEADERS(pcap/bluetooth.h) -AC_CHECK_HEADERS(pcap/usb.h) -CPPFLAGS="$savedcppflags" - AC_CHECK_HEADERS(sys/bitypes.h) AC_CHECK_TYPE([int8_t], , @@ -980,6 +971,19 @@ if test "$ac_lbl_inttypes_h_defines_formats" = no; then ]) fi +# +# Check for some headers introduced in later versions of libpcap +# and used by some printers. +# +# Those headers use the {u_}intN_t types, so we must do this after +# we check for what's needed to get them defined. +# +savedcppflags="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $V_INCLS" +AC_CHECK_HEADERS(pcap/bluetooth.h,,,[#include ]) +AC_CHECK_HEADERS(pcap/usb.h,,,[#include ]) +CPPFLAGS="$savedcppflags" + AC_PROG_RANLIB AC_LBL_DEVEL(V_CCOPT) @@ -1063,8 +1067,10 @@ if test "$want_libcrypto" != "no"; then fi AC_CHECK_LIB(crypto, DES_cbc_encrypt) + savedppflags="$CPPLAGS" CPPFLAGS="$CPPFLAGS $V_INCLS" AC_CHECK_HEADERS(openssl/evp.h) + CPPFLAGS="$savedcppflags" else # # Not found. Did the user explicitly ask for it? @@ -1079,8 +1085,8 @@ fi dnl dnl set additional include path if necessary if test "$missing_includes" = "yes"; then - CPPFLAGS="$CPPFLAGS -I\$(srcdir)/missing" - V_INCLS="$V_INCLS -I\$(srcdir)/missing" + CPPFLAGS="$CPPFLAGS -I$srcdir/missing" + V_INCLS="$V_INCLS -I$srcdir/missing" fi AC_SUBST(V_CCOPT) diff --git a/contrib/tcpdump/cpack.c b/contrib/tcpdump/cpack.c index 14c0a9ee2a3..c921b390591 100644 --- a/contrib/tcpdump/cpack.c +++ b/contrib/tcpdump/cpack.c @@ -38,7 +38,7 @@ #include "cpack.h" #include "extract.h" -static u_int8_t * +u_int8_t * cpack_next_boundary(u_int8_t *buf, u_int8_t *p, size_t alignment) { size_t misalignment = (size_t)(p - buf) % alignment; @@ -53,7 +53,7 @@ cpack_next_boundary(u_int8_t *buf, u_int8_t *p, size_t alignment) * wordsize bytes remain in the buffer after the boundary. Otherwise, * return a pointer to the boundary. */ -static u_int8_t * +u_int8_t * cpack_align_and_reserve(struct cpack_state *cs, size_t wordsize) { u_int8_t *next; diff --git a/contrib/tcpdump/cpack.h b/contrib/tcpdump/cpack.h index 14ed37692cd..74f97960adb 100644 --- a/contrib/tcpdump/cpack.h +++ b/contrib/tcpdump/cpack.h @@ -43,6 +43,9 @@ int cpack_uint16(struct cpack_state *, u_int16_t *); int cpack_uint32(struct cpack_state *, u_int32_t *); int cpack_uint64(struct cpack_state *, u_int64_t *); +u_int8_t *cpack_next_boundary(u_int8_t *buf, u_int8_t *p, size_t alignment); +u_int8_t *cpack_align_and_reserve(struct cpack_state *cs, size_t wordsize); + #define cpack_int8(__s, __p) cpack_uint8((__s), (u_int8_t*)(__p)) #define cpack_int16(__s, __p) cpack_uint16((__s), (u_int16_t*)(__p)) #define cpack_int32(__s, __p) cpack_uint32((__s), (u_int32_t*)(__p)) diff --git a/contrib/tcpdump/ethertype.h b/contrib/tcpdump/ethertype.h index 8c2cd4acbbe..59b2afa2cb3 100644 --- a/contrib/tcpdump/ethertype.h +++ b/contrib/tcpdump/ethertype.h @@ -104,6 +104,20 @@ #ifndef ETHERTYPE_8021Q #define ETHERTYPE_8021Q 0x8100 #endif + +/* see: + http://en.wikipedia.org/wiki/IEEE_802.1Q + and http://en.wikipedia.org/wiki/QinQ +*/ +#ifndef ETHERTYPE_8021Q9100 +#define ETHERTYPE_8021Q9100 0x9100 +#endif +#ifndef ETHERTYPE_8021Q9200 +#define ETHERTYPE_8021Q9200 0x9200 +#endif +#ifndef ETHERTYPE_8021QinQ +#define ETHERTYPE_8021QinQ 0x88a8 +#endif #ifndef ETHERTYPE_IPX #define ETHERTYPE_IPX 0x8137 #endif diff --git a/contrib/tcpdump/forces.h b/contrib/tcpdump/forces.h index b9cf072fb61..ed497d41d7b 100644 --- a/contrib/tcpdump/forces.h +++ b/contrib/tcpdump/forces.h @@ -585,7 +585,7 @@ int pkeyitlv_print(register const u_char * pptr, register u_int len, u_int16_t op_msk, int indent); int pdatacnt_print(register const u_char * pptr, register u_int len, - u_int32_t IDcnt, u_int16_t op_msk, int indent); + u_int16_t IDcnt, u_int16_t op_msk, int indent); int pdata_print(register const u_char * pptr, register u_int len, u_int16_t op_msk, int indent); diff --git a/contrib/tcpdump/ieee802_11_radio.h b/contrib/tcpdump/ieee802_11_radio.h index 22311f12597..812b5ac31e9 100644 --- a/contrib/tcpdump/ieee802_11_radio.h +++ b/contrib/tcpdump/ieee802_11_radio.h @@ -158,6 +158,10 @@ struct ieee80211_radiotap_header { * Unitless indication of the Rx/Tx antenna for this packet. * The first antenna is antenna 0. * + * IEEE80211_RADIOTAP_RX_FLAGS u_int16_t bitmap + * + * Properties of received frames. See flags defined below. + * * IEEE80211_RADIOTAP_XCHANNEL u_int32_t bitmap * u_int16_t MHz * u_int8_t channel number @@ -168,6 +172,25 @@ struct ieee80211_radiotap_header { * finally the maximum regulatory transmit power cap in .5 dBm * units. This property supersedes IEEE80211_RADIOTAP_CHANNEL * and only one of the two should be present. + * + * IEEE80211_RADIOTAP_MCS u_int8_t known + * u_int8_t flags + * u_int8_t mcs + * + * Bitset indicating which fields have known values, followed + * by bitset of flag values, followed by the MCS rate index as + * in IEEE 802.11n. + * + * IEEE80211_RADIOTAP_VENDOR_NAMESPACE + * u_int8_t OUI[3] + * u_int8_t subspace + * u_int16_t length + * + * The Vendor Namespace Field contains three sub-fields. The first + * sub-field is 3 bytes long. It contains the vendor's IEEE 802 + * Organizationally Unique Identifier (OUI). The fourth byte is a + * vendor-specific "namespace selector." + * */ enum ieee80211_radiotap_type { IEEE80211_RADIOTAP_TSFT = 0, @@ -184,8 +207,12 @@ enum ieee80211_radiotap_type { IEEE80211_RADIOTAP_ANTENNA = 11, IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12, IEEE80211_RADIOTAP_DB_ANTNOISE = 13, + IEEE80211_RADIOTAP_RX_FLAGS = 14, /* NB: gap for netbsd definitions */ IEEE80211_RADIOTAP_XCHANNEL = 18, + IEEE80211_RADIOTAP_MCS = 19, + IEEE80211_RADIOTAP_NAMESPACE = 29, + IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30, IEEE80211_RADIOTAP_EXT = 31 }; @@ -206,6 +233,19 @@ enum ieee80211_radiotap_type { #define IEEE80211_CHAN_HT40U 0x20000 /* HT 40 channel w/ ext above */ #define IEEE80211_CHAN_HT40D 0x40000 /* HT 40 channel w/ ext below */ +/* Useful combinations of channel characteristics, borrowed from Ethereal */ +#define IEEE80211_CHAN_A \ + (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM) +#define IEEE80211_CHAN_B \ + (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK) +#define IEEE80211_CHAN_G \ + (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN) +#define IEEE80211_CHAN_TA \ + (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO) +#define IEEE80211_CHAN_TG \ + (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN | IEEE80211_CHAN_TURBO) + + /* For IEEE80211_RADIOTAP_FLAGS */ #define IEEE80211_RADIOTAP_F_CFP 0x01 /* sent/received * during CFP @@ -226,6 +266,26 @@ enum ieee80211_radiotap_type { * (to 32-bit boundary) */ #define IEEE80211_RADIOTAP_F_BADFCS 0x40 /* does not pass FCS check */ -#define IEEE80211_RADIOTAP_F_SHORTGI 0x80 /* HT short GI */ + +/* For IEEE80211_RADIOTAP_RX_FLAGS */ +#define IEEE80211_RADIOTAP_F_RX_BADFCS 0x0001 /* frame failed crc check */ +#define IEEE80211_RADIOTAP_F_RX_PLCP_CRC 0x0002 /* frame failed PLCP CRC check */ + +/* For IEEE80211_RADIOTAP_MCS known */ +#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_KNOWN 0x01 +#define IEEE80211_RADIOTAP_MCS_MCS_INDEX_KNOWN 0x02 /* MCS index field */ +#define IEEE80211_RADIOTAP_MCS_GUARD_INTERVAL_KNOWN 0x04 +#define IEEE80211_RADIOTAP_MCS_HT_FORMAT_KNOWN 0x08 +#define IEEE80211_RADIOTAP_MCS_FEC_TYPE_KNOWN 0x10 + +/* For IEEE80211_RADIOTAP_MCS flags */ +#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_MASK 0x03 +#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_20 0 +#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_40 1 +#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_20L 2 +#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_20U 3 +#define IEEE80211_RADIOTAP_MCS_SHORT_GI 0x04 /* short guard interval */ +#define IEEE80211_RADIOTAP_MCS_HT_GREENFIELD 0x08 +#define IEEE80211_RADIOTAP_MCS_FEC_LDPC 0x10 #endif /* _NET_IF_IEEE80211RADIOTAP_H_ */ diff --git a/contrib/tcpdump/in_cksum.c b/contrib/tcpdump/in_cksum.c new file mode 100644 index 00000000000..93cdfc9aad9 --- /dev/null +++ b/contrib/tcpdump/in_cksum.c @@ -0,0 +1,200 @@ +/* in_cksum.c + * 4.4-Lite-2 Internet checksum routine, modified to take a vector of + * pointers/lengths giving the pieces to be checksummed. Also using + * Tahoe/CGI version of ADDCARRY(x) macro instead of from portable version. + */ + +/* + * Copyright (c) 1988, 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_cksum.c 8.1 (Berkeley) 6/10/93 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "interface.h" + +/* + * Checksum routine for Internet Protocol family headers (Portable Version). + * + * This routine is very heavily used in the network + * code and should be modified for each CPU to be as fast as possible. + */ + +#define ADDCARRY(x) {if ((x) > 65535) (x) -= 65535;} +#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);} + +u_int16_t +in_cksum(const struct cksum_vec *vec, int veclen) +{ + register const u_int16_t *w; + register int sum = 0; + register int mlen = 0; + int byte_swapped = 0; + + union { + u_int8_t c[2]; + u_int16_t s; + } s_util; + union { + u_int16_t s[2]; + u_int32_t l; + } l_util; + + for (; veclen != 0; vec++, veclen--) { + if (vec->len == 0) + continue; + w = (const u_int16_t *)(void *)vec->ptr; + if (mlen == -1) { + /* + * The first byte of this chunk is the continuation + * of a word spanning between this chunk and the + * last chunk. + * + * s_util.c[0] is already saved when scanning previous + * chunk. + */ + s_util.c[1] = *(const u_int8_t *)w; + sum += s_util.s; + w = (const u_int16_t *)(void *)((const u_int8_t *)w + 1); + mlen = vec->len - 1; + } else + mlen = vec->len; + /* + * Force to even boundary. + */ + if ((1 & (unsigned long) w) && (mlen > 0)) { + REDUCE; + sum <<= 8; + s_util.c[0] = *(const u_int8_t *)w; + w = (const u_int16_t *)(void *)((const u_int8_t *)w + 1); + mlen--; + byte_swapped = 1; + } + /* + * Unroll the loop to make overhead from + * branches &c small. + */ + while ((mlen -= 32) >= 0) { + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; + sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11]; + sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15]; + w += 16; + } + mlen += 32; + while ((mlen -= 8) >= 0) { + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + w += 4; + } + mlen += 8; + if (mlen == 0 && byte_swapped == 0) + continue; + REDUCE; + while ((mlen -= 2) >= 0) { + sum += *w++; + } + if (byte_swapped) { + REDUCE; + sum <<= 8; + byte_swapped = 0; + if (mlen == -1) { + s_util.c[1] = *(const u_int8_t *)w; + sum += s_util.s; + mlen = 0; + } else + mlen = -1; + } else if (mlen == -1) + s_util.c[0] = *(const u_int8_t *)w; + } + if (mlen == -1) { + /* The last mbuf has odd # of bytes. Follow the + standard (the odd byte may be shifted left by 8 bits + or not as determined by endian-ness of the machine) */ + s_util.c[1] = 0; + sum += s_util.s; + } + REDUCE; + return (~sum & 0xffff); +} + +/* + * Given the host-byte-order value of the checksum field in a packet + * header, and the network-byte-order computed checksum of the data + * that the checksum covers (including the checksum itself), compute + * what the checksum field *should* have been. + */ +u_int16_t +in_cksum_shouldbe(u_int16_t sum, u_int16_t computed_sum) +{ + u_int32_t shouldbe; + + /* + * The value that should have gone into the checksum field + * is the negative of the value gotten by summing up everything + * *but* the checksum field. + * + * We can compute that by subtracting the value of the checksum + * field from the sum of all the data in the packet, and then + * computing the negative of that value. + * + * "sum" is the value of the checksum field, and "computed_sum" + * is the negative of the sum of all the data in the packets, + * so that's -(-computed_sum - sum), or (sum + computed_sum). + * + * All the arithmetic in question is one's complement, so the + * addition must include an end-around carry; we do this by + * doing the arithmetic in 32 bits (with no sign-extension), + * and then adding the upper 16 bits of the sum, which contain + * the carry, to the lower 16 bits of the sum, and then do it + * again in case *that* sum produced a carry. + * + * As RFC 1071 notes, the checksum can be computed without + * byte-swapping the 16-bit words; summing 16-bit words + * on a big-endian machine gives a big-endian checksum, which + * can be directly stuffed into the big-endian checksum fields + * in protocol headers, and summing words on a little-endian + * machine gives a little-endian checksum, which must be + * byte-swapped before being stuffed into a big-endian checksum + * field. + * + * "computed_sum" is a network-byte-order value, so we must put + * it in host byte order before subtracting it from the + * host-byte-order value from the header; the adjusted checksum + * will be in host byte order, which is what we'll return. + */ + shouldbe = sum; + shouldbe += ntohs(computed_sum); + shouldbe = (shouldbe & 0xFFFF) + (shouldbe >> 16); + shouldbe = (shouldbe & 0xFFFF) + (shouldbe >> 16); + return shouldbe; +} diff --git a/contrib/tcpdump/interface.h b/contrib/tcpdump/interface.h index 6e04b058c21..18668a21f37 100644 --- a/contrib/tcpdump/interface.h +++ b/contrib/tcpdump/interface.h @@ -28,10 +28,6 @@ #include "os-proto.h" #endif -#ifndef HAVE___ATTRIBUTE__ -#define __attribute__(x) -#endif - /* snprintf et al */ #include @@ -74,6 +70,7 @@ extern char *strsep(char **, const char *); #define PT_CNFP 7 /* Cisco NetFlow protocol */ #define PT_TFTP 8 /* trivial file transfer protocol */ #define PT_AODV 9 /* Ad-hoc On-demand Distance Vector Protocol */ +#define PT_CARP 10 /* Common Address Redundancy Protocol */ #ifndef min #define min(a,b) ((a)>(b)?(b):(a)) @@ -166,7 +163,6 @@ extern void hex_and_ascii_print(const char *, const u_char *, u_int); extern void hex_print_with_offset(const char *, const u_char *, u_int, u_int); extern void hex_print(const char *, const u_char *, u_int); extern void telnet_print(const u_char *, u_int); -extern int ethertype_print(u_short, const u_char *, u_int, u_int); extern int llc_print(const u_char *, u_int, u_int, const u_char *, const u_char *, u_short *); extern int snap_print(const u_char *, u_int, u_int, u_int); @@ -189,9 +185,6 @@ extern u_int enc_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int pflog_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int arcnet_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int arcnet_linux_if_print(const struct pcap_pkthdr *, const u_char *); -extern void ether_print(const u_char *, u_int, u_int, - void (*)(const u_char *), const u_char *); -extern u_int ether_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int token_print(const u_char *, u_int, u_int); extern u_int token_if_print(const struct pcap_pkthdr *, const u_char *); extern void fddi_print(const u_char *, u_int, u_int); @@ -231,6 +224,7 @@ extern void cisco_autorp_print(const u_char *, u_int); extern void rsvp_print(const u_char *, u_int); extern void ldp_print(const u_char *, u_int); extern void lldp_print(const u_char *, u_int); +extern void rpki_rtr_print(const u_char *, u_int); extern void lmp_print(const u_char *, u_int); extern void lspping_print(const u_char *, u_int); extern void lwapp_control_print(const u_char *, u_int, int); @@ -297,6 +291,7 @@ extern const char *nt_errstr(u_int32_t); extern void print_data(const unsigned char *, int); extern void l2tp_print(const u_char *, u_int); extern void vrrp_print(const u_char *, u_int, int); +extern void carp_print(const u_char *, u_int, int); extern void slow_print(const u_char *, u_int); extern void sflow_print(const u_char *, u_int); extern void mpcp_print(const u_char *, u_int); @@ -322,10 +317,9 @@ extern u_int bt_if_print(const struct pcap_pkthdr *, const u_char *); extern u_int usb_linux_48_byte_print(const struct pcap_pkthdr *, const u_char *); extern u_int usb_linux_64_byte_print(const struct pcap_pkthdr *, const u_char *); + #ifdef INET6 -extern void ip6_print(const u_char *, u_int); extern void ip6_opt_print(const u_char *, int); -extern int nextproto6_cksum(const struct ip6_hdr *, const u_short *, u_int, u_int); extern int hbhopt_print(const u_char *); extern int dstopt_print(const u_char *); extern int frag6_print(const u_char *, const u_char *); @@ -334,9 +328,15 @@ extern void ripng_print(const u_char *, unsigned int); extern int rt6_print(const u_char *, const u_char *); extern void ospf6_print(const u_char *, u_int); extern void dhcp6_print(const u_char *, u_int); +extern void babel_print(const u_char *, u_int); extern int mask62plen(const u_char *); #endif /*INET6*/ -extern u_short in_cksum(const u_short *, register u_int, int); + +struct cksum_vec { + const u_int8_t *ptr; + int len; +}; +extern u_int16_t in_cksum(const struct cksum_vec *, int); extern u_int16_t in_cksum_shouldbe(u_int16_t, u_int16_t); #ifndef HAVE_BPF_DUMP @@ -356,6 +356,7 @@ extern netdissect_options *gndo; #define bflag gndo->ndo_bflag #define eflag gndo->ndo_eflag #define fflag gndo->ndo_fflag +#define jflag gndo->ndo_jflag #define Kflag gndo->ndo_Kflag #define nflag gndo->ndo_nflag #define Nflag gndo->ndo_Nflag @@ -384,6 +385,7 @@ extern netdissect_options *gndo; #define Cflag_count gndo->ndo_Cflag_count #define Gflag_count gndo->ndo_Gflag_count #define Gflag_time gndo->ndo_Gflag_time +#define Hflag gndo->ndo_Hflag #define snaplen gndo->ndo_snaplen #define snapend gndo->ndo_snapend diff --git a/contrib/tcpdump/ip.h b/contrib/tcpdump/ip.h index a01d0f07d49..8a97632e515 100644 --- a/contrib/tcpdump/ip.h +++ b/contrib/tcpdump/ip.h @@ -62,7 +62,7 @@ struct ip { u_int8_t ip_p; /* protocol */ u_int16_t ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ -}; +} UNALIGNED; #define IP_MAXPACKET 65535 /* maximum packet size */ @@ -134,7 +134,7 @@ struct ip_timestamp { u_int32_t ipt_time; } ipt_ta[1]; } ipt_timestamp; -}; +} UNALIGNED; /* flag bits for ipt_flg */ #define IPOPT_TS_TSONLY 0 /* timestamps only */ @@ -161,4 +161,4 @@ struct ip_timestamp { #define IP_MSS 576 /* default maximum segment size */ /* in print-ip.c */ -extern u_int32_t ip_finddst(const struct ip *); +extern int nextproto4_cksum(const struct ip *, const u_int8_t *, u_int, u_int); diff --git a/contrib/tcpdump/ip6.h b/contrib/tcpdump/ip6.h index a6df97aae10..12c87ad2929 100644 --- a/contrib/tcpdump/ip6.h +++ b/contrib/tcpdump/ip6.h @@ -86,21 +86,7 @@ struct ip6_hdr { } ip6_ctlun; struct in6_addr ip6_src; /* source address */ struct in6_addr ip6_dst; /* destination address */ -}; - -/* - * Pseudo header, used for higher layer checksumming. - */ -union ip6_pseudo_hdr { - struct { - struct in6_addr ph_src; - struct in6_addr ph_dst; - u_int32_t ph_len; - u_int8_t ph_zero[3]; - u_int8_t ph_nxt; - } ph; - u_int16_t pa[20]; -}; +} UNALIGNED; #define ip6_vfc ip6_ctlun.ip6_un2_vfc #define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow @@ -123,25 +109,23 @@ union ip6_pseudo_hdr { */ struct ip6_ext { - u_char ip6e_nxt; - u_char ip6e_len; -}; + u_int8_t ip6e_nxt; + u_int8_t ip6e_len; +} UNALIGNED; /* Hop-by-Hop options header */ -/* XXX should we pad it to force alignment on an 8-byte boundary? */ struct ip6_hbh { u_int8_t ip6h_nxt; /* next header */ u_int8_t ip6h_len; /* length in units of 8 octets */ /* followed by options */ -}; +} UNALIGNED; /* Destination options header */ -/* XXX should we pad it to force alignment on an 8-byte boundary? */ struct ip6_dest { u_int8_t ip6d_nxt; /* next header */ u_int8_t ip6d_len; /* length in units of 8 octets */ /* followed by options */ -}; +} UNALIGNED; /* Option types and related macros */ #define IP6OPT_PAD1 0x00 /* 00 0 00000 */ @@ -177,7 +161,7 @@ struct ip6_rthdr { u_int8_t ip6r_type; /* routing type */ u_int8_t ip6r_segleft; /* segments left */ /* followed by routing type specific data */ -}; +} UNALIGNED; /* Type 0 Routing header */ struct ip6_rthdr0 { @@ -188,7 +172,7 @@ struct ip6_rthdr0 { u_int8_t ip6r0_reserved; /* reserved field */ u_int8_t ip6r0_slmap[3]; /* strict/loose bit map */ struct in6_addr ip6r0_addr[1]; /* up to 23 addresses */ -}; +} UNALIGNED; /* Fragment header */ struct ip6_frag { @@ -196,10 +180,13 @@ struct ip6_frag { u_int8_t ip6f_reserved; /* reserved field */ u_int16_t ip6f_offlg; /* offset, reserved, and flag */ u_int32_t ip6f_ident; /* identification */ -}; +} UNALIGNED; #define IP6F_OFF_MASK 0xfff8 /* mask out offset from ip6f_offlg */ #define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */ #define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */ +/* in print-ip6.c */ +extern int nextproto6_cksum(const struct ip6_hdr *, const u_int8_t *, u_int, u_int); + #endif /* not _NETINET_IP6_H_ */ diff --git a/contrib/tcpdump/ipproto.c b/contrib/tcpdump/ipproto.c index 644b3642771..cbb9bf3f74e 100755 --- a/contrib/tcpdump/ipproto.c +++ b/contrib/tcpdump/ipproto.c @@ -55,6 +55,7 @@ const struct tok ipproto_values[] = { { IPPROTO_PGM, "PGM" }, { IPPROTO_SCTP, "SCTP" }, { IPPROTO_MOBILITY, "Mobility" }, + { IPPROTO_CARP, "CARP" }, { 0, NULL } }; diff --git a/contrib/tcpdump/ipproto.h b/contrib/tcpdump/ipproto.h index 12938b4008d..4b6bf51cfc1 100644 --- a/contrib/tcpdump/ipproto.h +++ b/contrib/tcpdump/ipproto.h @@ -134,6 +134,9 @@ extern const struct tok ipproto_values[]; #ifndef IPPROTO_VRRP #define IPPROTO_VRRP 112 #endif +#ifndef IPPROTO_CARP +#define IPPROTO_CARP 112 +#endif #ifndef IPPROTO_PGM #define IPPROTO_PGM 113 #endif diff --git a/contrib/tcpdump/missing/bittypes.h b/contrib/tcpdump/missing/bittypes.h deleted file mode 100644 index 31013ae4552..00000000000 --- a/contrib/tcpdump/missing/bittypes.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 1999 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#ifndef HAVE_U_INT8_T - -#if SIZEOF_CHAR == 1 -typedef unsigned char u_int8_t; -#elif SIZEOF_INT == 1 -typedef unsigned int u_int8_t; -#else /* XXX */ -#error "there's no appropriate type for u_int8_t" -#endif - -#endif /* HAVE_U_INT8_T */ - -#ifndef HAVE_U_INT16_T - -#if SIZEOF_SHORT == 2 -typedef unsigned short u_int16_t; -#elif SIZEOF_INT == 2 -typedef unsigned int u_int16_t; -#elif SIZEOF_CHAR == 2 -typedef unsigned char u_int16_t; -#else /* XXX */ -#error "there's no appropriate type for u_int16_t" -#endif - -#endif /* HAVE_U_INT16_T */ - -#ifndef HAVE_U_INT32_T - -#if SIZEOF_INT == 4 -typedef unsigned int u_int32_t; -#elif SIZEOF_LONG == 4 -typedef unsigned long u_int32_t; -#elif SIZEOF_SHORT == 4 -typedef unsigned short u_int32_t; -#else /* XXX */ -#error "there's no appropriate type for u_int32_t" -#endif - -#endif /* HAVE_U_INT32_T */ - -#ifndef HAVE_U_INT64_T - -#if SIZEOF_LONG_LONG == 8 -typedef unsigned long long u_int64_t; -#elif defined(_MSC_EXTENSIONS) -typedef unsigned _int64 u_int64_t; -#elif SIZEOF_INT == 8 -typedef unsigned int u_int64_t; -#elif SIZEOF_LONG == 8 -typedef unsigned long u_int64_t; -#elif SIZEOF_SHORT == 8 -typedef unsigned short u_int64_t; -#else /* XXX */ -#error "there's no appropriate type for u_int64_t" -#endif - -#endif /* HAVE_U_INT64_T */ - -#ifndef PRId64 -#ifdef _MSC_EXTENSIONS -#define PRId64 "I64d" -#else /* _MSC_EXTENSIONS */ -#define PRId64 "lld" -#endif /* _MSC_EXTENSIONS */ -#endif /* PRId64 */ - -#ifndef PRIo64 -#ifdef _MSC_EXTENSIONS -#define PRIo64 "I64o" -#else /* _MSC_EXTENSIONS */ -#define PRIo64 "llo" -#endif /* _MSC_EXTENSIONS */ -#endif /* PRIo64 */ - -#ifndef PRIx64 -#ifdef _MSC_EXTENSIONS -#define PRIx64 "I64x" -#else /* _MSC_EXTENSIONS */ -#define PRIx64 "llx" -#endif /* _MSC_EXTENSIONS */ -#endif /* PRIx64 */ - -#ifndef PRIu64 -#ifdef _MSC_EXTENSIONS -#define PRIu64 "I64u" -#else /* _MSC_EXTENSIONS */ -#define PRIu64 "llu" -#endif /* _MSC_EXTENSIONS */ -#endif /* PRIu64 */ diff --git a/contrib/tcpdump/netdissect.h b/contrib/tcpdump/netdissect.h index e87941daf18..0c66dfaf809 100644 --- a/contrib/tcpdump/netdissect.h +++ b/contrib/tcpdump/netdissect.h @@ -107,6 +107,7 @@ struct netdissect_options { int ndo_Iflag; /* rfmon (monitor) mode */ int ndo_Oflag; /* run filter code optimizer */ int ndo_dlt; /* if != -1, ask libpcap for the DLT it names*/ + int ndo_jflag; /* packet time stamp source */ int ndo_pflag; /* don't go promiscuous */ int ndo_Cflag; /* rotate dump files after this many bytes */ @@ -116,6 +117,7 @@ struct netdissect_options { time_t ndo_Gflag_time; /* The last time_t the dump file was rotated. */ int ndo_Wflag; /* recycle output files after this number of files */ int ndo_WflagChars; + int ndo_Hflag; /* dissect 802.11s draft mesh standard */ int ndo_suppress_default_print; /* don't use default_print() for unknown packet types */ const char *ndo_dltname; @@ -157,7 +159,7 @@ struct netdissect_options { void (*ndo_error)(netdissect_options *, const char *fmt, ...) #ifdef __ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS - __attribute__ ((format (printf, 2, 3))) + __attribute__ ((noreturn, format (printf, 2, 3))) #endif ; void (*ndo_warning)(netdissect_options *, @@ -252,6 +254,9 @@ extern char *copy_argv(netdissect_options *, char **); extern void safeputchar(int); extern void safeputs(const char *, int); +#define PLURAL_SUFFIX(n) \ + (((n) != 1) ? "s" : "") + #if 0 extern const char *isonsap_string(netdissect_options *, const u_char *); extern const char *protoid_string(netdissect_options *, const u_char *); @@ -263,6 +268,12 @@ extern const char *dnnum_string(netdissect_options *, u_short); #include +typedef u_int (*if_ndo_printer)(struct netdissect_options *ndo, + const struct pcap_pkthdr *, const u_char *); +typedef u_int (*if_printer)(const struct pcap_pkthdr *, const u_char *); + +extern if_ndo_printer lookup_ndo_printer(int); +extern if_printer lookup_printer(int); extern void eap_print(netdissect_options *,const u_char *, u_int); extern int esp_print(netdissect_options *, @@ -281,6 +292,22 @@ extern void ip_print_inner(netdissect_options *ndo, const u_char *bp2); extern void rrcp_print(netdissect_options *,const u_char *, u_int); +extern void ether_print(netdissect_options *, + const u_char *, u_int, u_int, + void (*)(netdissect_options *, const u_char *), + const u_char *); + +extern u_int ether_if_print(netdissect_options *, + const struct pcap_pkthdr *,const u_char *); +extern u_int netanalyzer_if_print(netdissect_options *, + const struct pcap_pkthdr *,const u_char *); +extern u_int netanalyzer_transparent_if_print(netdissect_options *, + const struct pcap_pkthdr *, + const u_char *); + +extern int ethertype_print(netdissect_options *,u_short, const u_char *, + u_int, u_int); + /* stuff that has not yet been rototiled */ #if 0 extern void ascii_print(netdissect_options *,u_int); @@ -291,8 +318,6 @@ extern void hex_print_with_offset(netdissect_options *,const char *, u_int, u_int); extern void hex_print(netdissect_options *,const char *, u_int); extern void telnet_print(netdissect_options *,const u_char *, u_int); -extern int ethertype_print(netdissect_options *,u_short, const u_char *, - u_int, u_int); extern int llc_print(netdissect_options *, const u_char *, u_int, u_int, const u_char *, const u_char *, u_short *); @@ -319,7 +344,6 @@ extern void egp_print(netdissect_options *,const u_char *, u_int, const u_char *); extern void arcnet_if_print(u_char*,const struct pcap_pkthdr *,const u_char *); -extern void ether_if_print(u_char *,const struct pcap_pkthdr *,const u_char *); extern void token_if_print(u_char *,const struct pcap_pkthdr *,const u_char *); extern void fddi_if_print(u_char *,const struct pcap_pkthdr *, const u_char *); @@ -333,6 +357,7 @@ extern void igmp_print(netdissect_options *, register const u_char *, u_int); extern void igrp_print(netdissect_options *,const u_char *, u_int, const u_char *); +extern int nextproto4_cksum(const struct ip *, const u_int8_t *, u_int, u_int); extern void ipN_print(netdissect_options *,const u_char *, u_int); extern void ipx_print(netdissect_options *,const u_char *, u_int); extern void isoclns_print(netdissect_options *,const u_char *, @@ -378,6 +403,7 @@ extern void raw_if_print(u_char *, const struct pcap_pkthdr *, const u_char *); extern void rip_print(netdissect_options *,const u_char *, u_int); +extern void rpki_rtr_print(netdissect_options *,const u_char *, u_int); extern void sctp_print(netdissect_options *ndo, const u_char *bp, const u_char *bp2, @@ -424,6 +450,8 @@ extern void l2tp_print(netdissect_options *,const u_char *, u_int); extern void lcp_print(netdissect_options *,const u_char *, u_int); extern void vrrp_print(netdissect_options *,const u_char *bp, u_int len, int ttl); +extern void carp_print(netdissect_options *,const u_char *bp, + u_int len, int ttl); extern void cdp_print(netdissect_options *,const u_char *, u_int, u_int, const u_char *, const u_char *); extern void stp_print(netdissect_options *,const u_char *p, u_int length); @@ -433,12 +461,15 @@ extern void pptp_print(netdissect_options *,const u_char *, u_int); #endif extern u_int ipnet_if_print(netdissect_options *,const struct pcap_pkthdr *, const u_char *); +extern u_int ppi_if_print(netdissect_options *,const struct pcap_pkthdr *, const u_char *); + +extern u_int ieee802_15_4_if_print(netdissect_options *,const struct pcap_pkthdr *, const u_char *); -#if 0 #ifdef INET6 extern void ip6_print(netdissect_options *,const u_char *, u_int); +#if 0 extern void ip6_opt_print(netdissect_options *,const u_char *, int); -extern int nextproto6_cksum(const struct ip6_hdr *, const u_short *, u_int, u_int); +extern int nextproto6_cksum(const struct ip6_hdr *, const u_int8_t *, u_int, u_int); extern int hbhopt_print(netdissect_options *,const u_char *); extern int dstopt_print(netdissect_options *,const u_char *); extern int frag6_print(netdissect_options *,const u_char *, @@ -453,11 +484,17 @@ extern void dhcp6_print(netdissect_options *,const u_char *, extern void zephyr_print(netdissect_options * ndo, const u_char *cp, int length); +#endif /* 0 */ #endif /*INET6*/ -extern u_short in_cksum(const u_short *, - register u_int, int); +#if 0 +struct cksum_vec { + const u_int8_t *ptr; + int len; +}; +extern u_int16_t in_cksum(const struct cksum_vec *, int); +extern u_int16_t in_cksum_shouldbe(u_int16_t, u_int16_t); #endif extern void esp_print_decodesecret(netdissect_options *ndo); diff --git a/contrib/tcpdump/ospf.h b/contrib/tcpdump/ospf.h index 2b1c6ee4c6b..b86458baa7e 100644 --- a/contrib/tcpdump/ospf.h +++ b/contrib/tcpdump/ospf.h @@ -324,5 +324,5 @@ struct ospfhdr { #define ospf_lsa ospf_un.un_lsa /* Functions shared by ospf and ospf6 */ -extern int ospf_print_te_lsa(u_int8_t *, u_int); -extern int ospf_print_grace_lsa(u_int8_t *, u_int); +extern int ospf_print_te_lsa(const u_int8_t *, u_int); +extern int ospf_print_grace_lsa(const u_int8_t *, u_int); diff --git a/contrib/tcpdump/oui.c b/contrib/tcpdump/oui.c index 422cd161b84..1067aa1c5ce 100644 --- a/contrib/tcpdump/oui.c +++ b/contrib/tcpdump/oui.c @@ -42,6 +42,7 @@ const struct tok oui_values[] = { { OUI_IEEE_8021_PRIVATE, "IEEE 802.1 Private"}, { OUI_IEEE_8023_PRIVATE, "IEEE 802.3 Private"}, { OUI_TIA, "ANSI/TIA"}, + { OUI_DCBX, "DCBX"}, { 0, NULL } }; diff --git a/contrib/tcpdump/oui.h b/contrib/tcpdump/oui.h index dc8bb01c8f1..d39cb6cae37 100644 --- a/contrib/tcpdump/oui.h +++ b/contrib/tcpdump/oui.h @@ -30,6 +30,7 @@ extern const struct tok smi_values[]; #define OUI_IEEE_8021_PRIVATE 0x0080c2 /* IEEE 802.1 Organisation Specific - Annex F */ #define OUI_IEEE_8023_PRIVATE 0x00120f /* IEEE 802.3 Organisation Specific - Annex G */ #define OUI_TIA 0x0012bb /* TIA - Telecommunications Industry Association - ANSI/TIA-1057- 2006 */ +#define OUI_DCBX 0x001B21 /* DCBX */ /* * These are SMI Network Management Private Enterprise Codes for diff --git a/contrib/tcpdump/ppi.h b/contrib/tcpdump/ppi.h new file mode 100644 index 00000000000..733eb950f0d --- /dev/null +++ b/contrib/tcpdump/ppi.h @@ -0,0 +1,9 @@ +typedef struct ppi_header { + uint8_t ppi_ver; + uint8_t ppi_flags; + uint16_t ppi_len; + uint32_t ppi_dlt; +} ppi_header_t; + +#define PPI_HDRLEN 8 + diff --git a/contrib/tcpdump/print-802_11.c b/contrib/tcpdump/print-802_11.c index 088840ab138..24ab625a61e 100644 --- a/contrib/tcpdump/print-802_11.c +++ b/contrib/tcpdump/print-802_11.c @@ -46,6 +46,15 @@ static const char rcsid[] _U_ = #include "ieee802_11.h" #include "ieee802_11_radio.h" +/* Radiotap state */ +/* This is used to save state when parsing/processing parameters */ +struct radiotap_state +{ + u_int32_t present; + + u_int8_t rate; +}; + #define PRINT_SSID(p) \ if (p.ssid_present) { \ printf(" ("); \ @@ -74,26 +83,403 @@ static const char rcsid[] _U_ = printf("%s", \ CAPABILITY_PRIVACY(p.capability_info) ? ", PRIVACY" : "" ); -static const int ieee80211_htrates[16] = { - 13, /* IFM_IEEE80211_MCS0 */ - 26, /* IFM_IEEE80211_MCS1 */ - 39, /* IFM_IEEE80211_MCS2 */ - 52, /* IFM_IEEE80211_MCS3 */ - 78, /* IFM_IEEE80211_MCS4 */ - 104, /* IFM_IEEE80211_MCS5 */ - 117, /* IFM_IEEE80211_MCS6 */ - 130, /* IFM_IEEE80211_MCS7 */ - 26, /* IFM_IEEE80211_MCS8 */ - 52, /* IFM_IEEE80211_MCS9 */ - 78, /* IFM_IEEE80211_MCS10 */ - 104, /* IFM_IEEE80211_MCS11 */ - 156, /* IFM_IEEE80211_MCS12 */ - 208, /* IFM_IEEE80211_MCS13 */ - 234, /* IFM_IEEE80211_MCS14 */ - 260, /* IFM_IEEE80211_MCS15 */ +#define MAX_MCS_INDEX 76 + +/* + * Indices are: + * + * the MCS index (0-76); + * + * 0 for 20 MHz, 1 for 40 MHz; + * + * 0 for a long guard interval, 1 for a short guard interval. + */ +static const float ieee80211_float_htrates[MAX_MCS_INDEX+1][2][2] = { + /* MCS 0 */ + { /* 20 Mhz */ { 6.5, /* SGI */ 7.2, }, + /* 40 Mhz */ { 13.5, /* SGI */ 15.0, }, + }, + + /* MCS 1 */ + { /* 20 Mhz */ { 13.0, /* SGI */ 14.4, }, + /* 40 Mhz */ { 27.0, /* SGI */ 30.0, }, + }, + + /* MCS 2 */ + { /* 20 Mhz */ { 19.5, /* SGI */ 21.7, }, + /* 40 Mhz */ { 40.5, /* SGI */ 45.0, }, + }, + + /* MCS 3 */ + { /* 20 Mhz */ { 26.0, /* SGI */ 28.9, }, + /* 40 Mhz */ { 54.0, /* SGI */ 60.0, }, + }, + + /* MCS 4 */ + { /* 20 Mhz */ { 39.0, /* SGI */ 43.3, }, + /* 40 Mhz */ { 81.0, /* SGI */ 90.0, }, + }, + + /* MCS 5 */ + { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, + /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, + }, + + /* MCS 6 */ + { /* 20 Mhz */ { 58.5, /* SGI */ 65.0, }, + /* 40 Mhz */ { 121.5, /* SGI */ 135.0, }, + }, + + /* MCS 7 */ + { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, + /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, + }, + + /* MCS 8 */ + { /* 20 Mhz */ { 13.0, /* SGI */ 14.4, }, + /* 40 Mhz */ { 27.0, /* SGI */ 30.0, }, + }, + + /* MCS 9 */ + { /* 20 Mhz */ { 26.0, /* SGI */ 28.9, }, + /* 40 Mhz */ { 54.0, /* SGI */ 60.0, }, + }, + + /* MCS 10 */ + { /* 20 Mhz */ { 39.0, /* SGI */ 43.3, }, + /* 40 Mhz */ { 81.0, /* SGI */ 90.0, }, + }, + + /* MCS 11 */ + { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, + /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, + }, + + /* MCS 12 */ + { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, + /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, + }, + + /* MCS 13 */ + { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, + /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, + }, + + /* MCS 14 */ + { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, + /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, + }, + + /* MCS 15 */ + { /* 20 Mhz */ { 130.0, /* SGI */ 144.4, }, + /* 40 Mhz */ { 270.0, /* SGI */ 300.0, }, + }, + + /* MCS 16 */ + { /* 20 Mhz */ { 19.5, /* SGI */ 21.7, }, + /* 40 Mhz */ { 40.5, /* SGI */ 45.0, }, + }, + + /* MCS 17 */ + { /* 20 Mhz */ { 39.0, /* SGI */ 43.3, }, + /* 40 Mhz */ { 81.0, /* SGI */ 90.0, }, + }, + + /* MCS 18 */ + { /* 20 Mhz */ { 58.5, /* SGI */ 65.0, }, + /* 40 Mhz */ { 121.5, /* SGI */ 135.0, }, + }, + + /* MCS 19 */ + { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, + /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, + }, + + /* MCS 20 */ + { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, + /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, + }, + + /* MCS 21 */ + { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, + /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, + }, + + /* MCS 22 */ + { /* 20 Mhz */ { 175.5, /* SGI */ 195.0, }, + /* 40 Mhz */ { 364.5, /* SGI */ 405.0, }, + }, + + /* MCS 23 */ + { /* 20 Mhz */ { 195.0, /* SGI */ 216.7, }, + /* 40 Mhz */ { 405.0, /* SGI */ 450.0, }, + }, + + /* MCS 24 */ + { /* 20 Mhz */ { 26.0, /* SGI */ 28.9, }, + /* 40 Mhz */ { 54.0, /* SGI */ 60.0, }, + }, + + /* MCS 25 */ + { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, + /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, + }, + + /* MCS 26 */ + { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, + /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, + }, + + /* MCS 27 */ + { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, + /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, + }, + + /* MCS 28 */ + { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, + /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, + }, + + /* MCS 29 */ + { /* 20 Mhz */ { 208.0, /* SGI */ 231.1, }, + /* 40 Mhz */ { 432.0, /* SGI */ 480.0, }, + }, + + /* MCS 30 */ + { /* 20 Mhz */ { 234.0, /* SGI */ 260.0, }, + /* 40 Mhz */ { 486.0, /* SGI */ 540.0, }, + }, + + /* MCS 31 */ + { /* 20 Mhz */ { 260.0, /* SGI */ 288.9, }, + /* 40 Mhz */ { 540.0, /* SGI */ 600.0, }, + }, + + /* MCS 32 */ + { /* 20 Mhz */ { 0.0, /* SGI */ 0.0, }, /* not valid */ + /* 40 Mhz */ { 6.0, /* SGI */ 6.7, }, + }, + + /* MCS 33 */ + { /* 20 Mhz */ { 39.0, /* SGI */ 43.3, }, + /* 40 Mhz */ { 81.0, /* SGI */ 90.0, }, + }, + + /* MCS 34 */ + { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, + /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, + }, + + /* MCS 35 */ + { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, + /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, + }, + + /* MCS 36 */ + { /* 20 Mhz */ { 58.5, /* SGI */ 65.0, }, + /* 40 Mhz */ { 121.5, /* SGI */ 135.0, }, + }, + + /* MCS 37 */ + { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, + /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, + }, + + /* MCS 38 */ + { /* 20 Mhz */ { 97.5, /* SGI */ 108.3, }, + /* 40 Mhz */ { 202.5, /* SGI */ 225.0, }, + }, + + /* MCS 39 */ + { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, + /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, + }, + + /* MCS 40 */ + { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, + /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, + }, + + /* MCS 41 */ + { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, + /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, + }, + + /* MCS 42 */ + { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, + /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, + }, + + /* MCS 43 */ + { /* 20 Mhz */ { 91.0, /* SGI */ 101.1, }, + /* 40 Mhz */ { 189.0, /* SGI */ 210.0, }, + }, + + /* MCS 44 */ + { /* 20 Mhz */ { 91.0, /* SGI */ 101.1, }, + /* 40 Mhz */ { 189.0, /* SGI */ 210.0, }, + }, + + /* MCS 45 */ + { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, + /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, + }, + + /* MCS 46 */ + { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, + /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, + }, + + /* MCS 47 */ + { /* 20 Mhz */ { 97.5, /* SGI */ 108.3, }, + /* 40 Mhz */ { 202.5, /* SGI */ 225.0, }, + }, + + /* MCS 48 */ + { /* 20 Mhz */ { 97.5, /* SGI */ 108.3, }, + /* 40 Mhz */ { 202.5, /* SGI */ 225.0, }, + }, + + /* MCS 49 */ + { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, + /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, + }, + + /* MCS 50 */ + { /* 20 Mhz */ { 136.5, /* SGI */ 151.7, }, + /* 40 Mhz */ { 283.5, /* SGI */ 315.0, }, + }, + + /* MCS 51 */ + { /* 20 Mhz */ { 136.5, /* SGI */ 151.7, }, + /* 40 Mhz */ { 283.5, /* SGI */ 315.0, }, + }, + + /* MCS 52 */ + { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, + /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, + }, + + /* MCS 53 */ + { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, + /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, + }, + + /* MCS 54 */ + { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, + /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, + }, + + /* MCS 55 */ + { /* 20 Mhz */ { 91.0, /* SGI */ 101.1, }, + /* 40 Mhz */ { 189.0, /* SGI */ 210.0, }, + }, + + /* MCS 56 */ + { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, + /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, + }, + + /* MCS 57 */ + { /* 20 Mhz */ { 91.0, /* SGI */ 101.1, }, + /* 40 Mhz */ { 189.0, /* SGI */ 210.0, }, + }, + + /* MCS 58 */ + { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, + /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, + }, + + /* MCS 59 */ + { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, + /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, + }, + + /* MCS 60 */ + { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, + /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, + }, + + /* MCS 61 */ + { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, + /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, + }, + + /* MCS 62 */ + { /* 20 Mhz */ { 130.0, /* SGI */ 144.4, }, + /* 40 Mhz */ { 270.0, /* SGI */ 300.0, }, + }, + + /* MCS 63 */ + { /* 20 Mhz */ { 130.0, /* SGI */ 144.4, }, + /* 40 Mhz */ { 270.0, /* SGI */ 300.0, }, + }, + + /* MCS 64 */ + { /* 20 Mhz */ { 143.0, /* SGI */ 158.9, }, + /* 40 Mhz */ { 297.0, /* SGI */ 330.0, }, + }, + + /* MCS 65 */ + { /* 20 Mhz */ { 97.5, /* SGI */ 108.3, }, + /* 40 Mhz */ { 202.5, /* SGI */ 225.0, }, + }, + + /* MCS 66 */ + { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, + /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, + }, + + /* MCS 67 */ + { /* 20 Mhz */ { 136.5, /* SGI */ 151.7, }, + /* 40 Mhz */ { 283.5, /* SGI */ 315.0, }, + }, + + /* MCS 68 */ + { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, + /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, + }, + + /* MCS 69 */ + { /* 20 Mhz */ { 136.5, /* SGI */ 151.7, }, + /* 40 Mhz */ { 283.5, /* SGI */ 315.0, }, + }, + + /* MCS 70 */ + { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, + /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, + }, + + /* MCS 71 */ + { /* 20 Mhz */ { 175.5, /* SGI */ 195.0, }, + /* 40 Mhz */ { 364.5, /* SGI */ 405.0, }, + }, + + /* MCS 72 */ + { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, + /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, + }, + + /* MCS 73 */ + { /* 20 Mhz */ { 175.5, /* SGI */ 195.0, }, + /* 40 Mhz */ { 364.5, /* SGI */ 405.0, }, + }, + + /* MCS 74 */ + { /* 20 Mhz */ { 195.0, /* SGI */ 216.7, }, + /* 40 Mhz */ { 405.0, /* SGI */ 450.0, }, + }, + + /* MCS 75 */ + { /* 20 Mhz */ { 195.0, /* SGI */ 216.7, }, + /* 40 Mhz */ { 405.0, /* SGI */ 450.0, }, + }, + + /* MCS 76 */ + { /* 20 Mhz */ { 214.5, /* SGI */ 238.3, }, + /* 40 Mhz */ { 445.5, /* SGI */ 495.0, }, + }, }; -#define PRINT_HT_RATE(_sep, _r, _suf) \ - printf("%s%.1f%s", _sep, (.5 * ieee80211_htrates[(_r) & 0xf]), _suf) static const char *auth_alg_text[]={"Open System","Shared Key","EAP"}; #define NUM_AUTH_ALGS (sizeof auth_alg_text / sizeof auth_alg_text[0]) @@ -269,6 +655,7 @@ static int parse_elements(struct mgmt_body_t *pbody, const u_char *p, int offset, u_int length) { + u_int elementlen; struct ssid_t ssid; struct challenge_t challenge; struct rates_t rates; @@ -487,12 +874,13 @@ parse_elements(struct mgmt_body_t *pbody, const u_char *p, int offset, return 0; if (length < 2) return 0; - if (!TTEST2(*(p + offset + 2), *(p + offset + 1))) + elementlen = *(p + offset + 1); + if (!TTEST2(*(p + offset + 2), elementlen)) return 0; - if (length < (u_int)(*(p + offset + 1) + 2)) + if (length < elementlen + 2) return 0; - offset += *(p + offset + 1) + 2; - length -= *(p + offset + 1) + 2; + offset += elementlen + 2; + length -= elementlen + 2; break; } } @@ -1321,7 +1709,8 @@ ieee802_11_print(const u_char *p, u_int length, u_int orig_caplen, int pad, hdrlen = extract_header_length(fc); if (pad) hdrlen = roundup2(hdrlen, 4); - if (FC_TYPE(fc) == T_DATA && DATA_FRAME_IS_QOS(FC_SUBTYPE(fc))) { + if (Hflag && FC_TYPE(fc) == T_DATA && + DATA_FRAME_IS_QOS(FC_SUBTYPE(fc))) { meshdrlen = extract_mesh_header_length(p+hdrlen); hdrlen += meshdrlen; } else @@ -1461,7 +1850,8 @@ print_chaninfo(int freq, int flags) } static int -print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags) +print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags, + struct radiotap_state *state, u_int32_t presentflags) { union { int8_t i8; @@ -1476,9 +1866,18 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags) switch (bit) { case IEEE80211_RADIOTAP_FLAGS: rc = cpack_uint8(s, &u.u8); + if (rc != 0) + break; *flags = u.u8; break; case IEEE80211_RADIOTAP_RATE: + rc = cpack_uint8(s, &u.u8); + if (rc != 0) + break; + + /* Save state rate */ + state->rate = u.u8; + break; case IEEE80211_RADIOTAP_DB_ANTSIGNAL: case IEEE80211_RADIOTAP_DB_ANTNOISE: case IEEE80211_RADIOTAP_ANTENNA: @@ -1497,6 +1896,7 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags) case IEEE80211_RADIOTAP_FHSS: case IEEE80211_RADIOTAP_LOCK_QUALITY: case IEEE80211_RADIOTAP_TX_ATTENUATION: + case IEEE80211_RADIOTAP_RX_FLAGS: rc = cpack_uint16(s, &u.u16); break; case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: @@ -1520,6 +1920,45 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags) break; rc = cpack_uint8(s, &u4.u8); break; + case IEEE80211_RADIOTAP_MCS: + rc = cpack_uint8(s, &u.u8); + if (rc != 0) + break; + rc = cpack_uint8(s, &u2.u8); + if (rc != 0) + break; + rc = cpack_uint8(s, &u3.u8); + break; + case IEEE80211_RADIOTAP_VENDOR_NAMESPACE: { + u_int8_t vns[3]; + u_int16_t length; + u_int8_t subspace; + + if ((cpack_align_and_reserve(s, 2)) == NULL) { + rc = -1; + break; + } + + rc = cpack_uint8(s, &vns[0]); + if (rc != 0) + break; + rc = cpack_uint8(s, &vns[1]); + if (rc != 0) + break; + rc = cpack_uint8(s, &vns[2]); + if (rc != 0) + break; + rc = cpack_uint8(s, &subspace); + if (rc != 0) + break; + rc = cpack_uint16(s, &length); + if (rc != 0) + break; + + /* Skip up to length */ + s->c_next += length; + break; + } default: /* this bit indicates a field whose * size we do not know, so we cannot @@ -1534,18 +1973,64 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags) return rc; } + /* Preserve the state present flags */ + state->present = presentflags; + switch (bit) { case IEEE80211_RADIOTAP_CHANNEL: + /* + * If CHANNEL and XCHANNEL are both present, skip + * CHANNEL. + */ + if (presentflags & (1 << IEEE80211_RADIOTAP_XCHANNEL)) + break; print_chaninfo(u.u16, u2.u16); break; case IEEE80211_RADIOTAP_FHSS: printf("fhset %d fhpat %d ", u.u16 & 0xff, (u.u16 >> 8) & 0xff); break; case IEEE80211_RADIOTAP_RATE: - if (u.u8 & 0x80) - PRINT_HT_RATE("", u.u8, " Mb/s "); - else - PRINT_RATE("", u.u8, " Mb/s "); + /* + * XXX On FreeBSD rate & 0x80 means we have an MCS. On + * Linux and AirPcap it does not. (What about + * Mac OS X, NetBSD, OpenBSD, and DragonFly BSD?) + * + * This is an issue either for proprietary extensions + * to 11a or 11g, which do exist, or for 11n + * implementations that stuff a rate value into + * this field, which also appear to exist. + * + * We currently handle that by assuming that + * if the 0x80 bit is set *and* the remaining + * bits have a value between 0 and 15 it's + * an MCS value, otherwise it's a rate. If + * there are cases where systems that use + * "0x80 + MCS index" for MCS indices > 15, + * or stuff a rate value here between 64 and + * 71.5 Mb/s in here, we'll need a preference + * setting. Such rates do exist, e.g. 11n + * MCS 7 at 20 MHz with a long guard interval. + */ + if (u.u8 >= 0x80 && u.u8 <= 0x8f) { + /* + * XXX - we don't know the channel width + * or guard interval length, so we can't + * convert this to a data rate. + * + * If you want us to show a data rate, + * use the MCS field, not the Rate field; + * the MCS field includes not only the + * MCS index, it also includes bandwidth + * and guard interval information. + * + * XXX - can we get the channel width + * from XChannel and the guard interval + * information from Flags, at least on + * FreeBSD? + */ + printf("MCS %u ", u.u8 & 0x7f); + } else + printf("%2.1f Mb/s ", .5*u.u8); break; case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: printf("%ddB signal ", u.i8); @@ -1589,9 +2074,89 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags) case IEEE80211_RADIOTAP_TSFT: printf("%" PRIu64 "us tsft ", u.u64); break; + case IEEE80211_RADIOTAP_RX_FLAGS: + /* Do nothing for now */ + break; case IEEE80211_RADIOTAP_XCHANNEL: print_chaninfo(u2.u16, u.u32); break; + case IEEE80211_RADIOTAP_MCS: { + static const char *bandwidth[4] = { + "20 MHz", + "40 MHz", + "20 MHz (L)", + "20 MHz (U)" + }; + float htrate; + + if (u.u8 & IEEE80211_RADIOTAP_MCS_MCS_INDEX_KNOWN) { + /* + * We know the MCS index. + */ + if (u3.u8 <= MAX_MCS_INDEX) { + /* + * And it's in-range. + */ + if (u.u8 & (IEEE80211_RADIOTAP_MCS_BANDWIDTH_KNOWN|IEEE80211_RADIOTAP_MCS_GUARD_INTERVAL_KNOWN)) { + /* + * And we know both the bandwidth and + * the guard interval, so we can look + * up the rate. + */ + htrate = + ieee80211_float_htrates \ + [u3.u8] \ + [((u2.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_MASK) == IEEE80211_RADIOTAP_MCS_BANDWIDTH_40 ? 1 : 0)] \ + [((u2.u8 & IEEE80211_RADIOTAP_MCS_SHORT_GI) ? 1 : 0)]; + } else { + /* + * We don't know both the bandwidth + * and the guard interval, so we can + * only report the MCS index. + */ + htrate = 0.0; + } + } else { + /* + * The MCS value is out of range. + */ + htrate = 0.0; + } + if (htrate != 0.0) { + /* + * We have the rate. + * Print it. + */ + printf("%.1f Mb/s MCS %u ", htrate, u3.u8); + } else { + /* + * We at least have the MCS index. + * Print it. + */ + printf("MCS %u ", u3.u8); + } + } + if (u.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_KNOWN) { + printf("%s ", + bandwidth[u2.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_MASK]); + } + if (u.u8 & IEEE80211_RADIOTAP_MCS_GUARD_INTERVAL_KNOWN) { + printf("%s GI ", + (u2.u8 & IEEE80211_RADIOTAP_MCS_SHORT_GI) ? + "short" : "lon"); + } + if (u.u8 & IEEE80211_RADIOTAP_MCS_HT_FORMAT_KNOWN) { + printf("%s ", + (u2.u8 & IEEE80211_RADIOTAP_MCS_HT_GREENFIELD) ? + "greenfield" : "mixed"); + } + if (u.u8 & IEEE80211_RADIOTAP_MCS_FEC_TYPE_KNOWN) { + printf("%s FEC ", + (u2.u8 & IEEE80211_RADIOTAP_MCS_FEC_LDPC) ? + "LDPC" : "BCC"); + } + break; + } } return 0; } @@ -1611,6 +2176,7 @@ ieee802_11_radio_print(const u_char *p, u_int length, u_int caplen) struct cpack_state cpacker; struct ieee80211_radiotap_header *hdr; u_int32_t present, next_present; + u_int32_t presentflags = 0; u_int32_t *presentp, *last_presentp; enum ieee80211_radiotap_type bit; int bit0; @@ -1619,6 +2185,7 @@ ieee802_11_radio_print(const u_char *p, u_int length, u_int caplen) u_int8_t flags; int pad; u_int fcslen; + struct radiotap_state state; if (caplen < sizeof(*hdr)) { printf("[|802.11]"); @@ -1660,6 +2227,11 @@ ieee802_11_radio_print(const u_char *p, u_int length, u_int caplen) fcslen = 0; for (bit0 = 0, presentp = &hdr->it_present; presentp <= last_presentp; presentp++, bit0 += 32) { + presentflags = EXTRACT_LE_32BITS(presentp); + + /* Clear state. */ + memset(&state, 0, sizeof(state)); + for (present = EXTRACT_LE_32BITS(presentp); present; present = next_present) { /* clear the least significant bit that is set */ @@ -1669,16 +2241,16 @@ ieee802_11_radio_print(const u_char *p, u_int length, u_int caplen) bit = (enum ieee80211_radiotap_type) (bit0 + BITNO_32(present ^ next_present)); - if (print_radiotap_field(&cpacker, bit, &flags) != 0) + if (print_radiotap_field(&cpacker, bit, &flags, &state, presentflags) != 0) goto out; } } +out: if (flags & IEEE80211_RADIOTAP_F_DATAPAD) pad = 1; /* Atheros padding */ if (flags & IEEE80211_RADIOTAP_F_FCS) fcslen = 4; /* FCS at end of packet */ -out: return len + ieee802_11_print(p + len, length - len, caplen - len, pad, fcslen); #undef BITNO_32 diff --git a/contrib/tcpdump/print-802_15_4.c b/contrib/tcpdump/print-802_15_4.c new file mode 100644 index 00000000000..2016552cea2 --- /dev/null +++ b/contrib/tcpdump/print-802_15_4.c @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2009 + * Siemens AG, All rights reserved. + * Dmitry Eremin-Solenikov (dbaryshkov@gmail.com) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that: (1) source code distributions + * retain the above copyright notice and this paragraph in its entirety, (2) + * distributions including binary code include the above copyright notice and + * this paragraph in its entirety in the documentation or other materials + * provided with the distribution, and (3) all advertising materials mentioning + * features or use of this software display the following acknowledgement: + * ``This product includes software developed by the University of California, + * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of + * the University nor the names of its contributors may be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include +#include + +#include "interface.h" +#include "addrtoname.h" + +#include "extract.h" + +static const char *ftypes[] = { + "Beacon", /* 0 */ + "Data", /* 1 */ + "ACK", /* 2 */ + "Command", /* 3 */ + "Reserved", /* 4 */ + "Reserved", /* 5 */ + "Reserved", /* 6 */ + "Reserved", /* 7 */ +}; + +static int +extract_header_length(u_int16_t fc) +{ + int len = 0; + + switch ((fc >> 10) & 0x3) { + case 0x00: + if (fc & (1 << 6)) /* intra-PAN with none dest addr */ + return -1; + break; + case 0x01: + return -1; + case 0x02: + len += 4; + break; + case 0x03: + len += 10; + break; + } + + switch ((fc >> 14) & 0x3) { + case 0x00: + break; + case 0x01: + return -1; + case 0x02: + len += 4; + break; + case 0x03: + len += 10; + break; + } + + if (fc & (1 << 6)) { + if (len < 2) + return -1; + len -= 2; + } + + return len; +} + + +u_int +ieee802_15_4_if_print(struct netdissect_options *ndo, + const struct pcap_pkthdr *h, const u_char *p) +{ + u_int caplen = h->caplen; + int hdrlen; + u_int16_t fc; + u_int8_t seq; + + if (caplen < 3) { + ND_PRINT((ndo, "[|802.15.4] %x", caplen)); + return caplen; + } + + fc = EXTRACT_LE_16BITS(p); + hdrlen = extract_header_length(fc); + + seq = EXTRACT_LE_8BITS(p + 2); + + p += 3; + caplen -= 3; + + ND_PRINT((ndo,"IEEE 802.15.4 %s packet ", ftypes[fc & 0x7])); + if (vflag) + ND_PRINT((ndo,"seq %02x ", seq)); + if (hdrlen == -1) { + ND_PRINT((ndo,"malformed! ")); + return caplen; + } + + + if (!vflag) { + p+= hdrlen; + caplen -= hdrlen; + } else { + u_int16_t panid = 0; + + switch ((fc >> 10) & 0x3) { + case 0x00: + ND_PRINT((ndo,"none ")); + break; + case 0x01: + ND_PRINT((ndo,"reserved destination addressing mode")); + return 0; + case 0x02: + panid = EXTRACT_LE_16BITS(p); + p += 2; + ND_PRINT((ndo,"%04x:%04x ", panid, EXTRACT_LE_16BITS(p))); + p += 2; + break; + case 0x03: + panid = EXTRACT_LE_16BITS(p); + p += 2; + ND_PRINT((ndo,"%04x:%s ", panid, le64addr_string(p))); + p += 8; + break; + } + ND_PRINT((ndo,"< "); + + switch ((fc >> 14) & 0x3) { + case 0x00: + ND_PRINT((ndo,"none ")); + break; + case 0x01: + ND_PRINT((ndo,"reserved source addressing mode")); + return 0; + case 0x02: + if (!(fc & (1 << 6))) { + panid = EXTRACT_LE_16BITS(p); + p += 2; + } + ND_PRINT((ndo,"%04x:%04x ", panid, EXTRACT_LE_16BITS(p))); + p += 2; + break; + case 0x03: + if (!(fc & (1 << 6))) { + panid = EXTRACT_LE_16BITS(p); + p += 2; + } + ND_PRINT((ndo,"%04x:%s ", panid, le64addr_string(p)))); + p += 8; + break; + } + + caplen -= hdrlen; + } + + if (!suppress_default_print) + (ndo->ndo_default_print)(ndo, p, caplen); + + return 0; +} diff --git a/contrib/tcpdump/print-ap1394.c b/contrib/tcpdump/print-ap1394.c index cb9d972f43b..ab0713b5a7a 100644 --- a/contrib/tcpdump/print-ap1394.c +++ b/contrib/tcpdump/print-ap1394.c @@ -106,7 +106,7 @@ ap1394_if_print(const struct pcap_pkthdr *h, const u_char *p) p += FIREWIRE_HDRLEN; ether_type = EXTRACT_16BITS(&fp->firewire_type); - if (ethertype_print(ether_type, p, length, caplen) == 0) { + if (ethertype_print(gndo, ether_type, p, length, caplen) == 0) { /* ether_type not known, print raw packet */ if (!eflag) ap1394_hdr_print((u_char *)fp, length + FIREWIRE_HDRLEN); diff --git a/contrib/tcpdump/print-arcnet.c b/contrib/tcpdump/print-arcnet.c index a7b9f0da6bd..9531f346bff 100644 --- a/contrib/tcpdump/print-arcnet.c +++ b/contrib/tcpdump/print-arcnet.c @@ -265,14 +265,14 @@ arcnet_encap_print(u_char arctype, const u_char *p, #ifdef INET6 case ARCTYPE_INET6: - ip6_print(p, length); + ip6_print(gndo, p, length); return (1); #endif /*INET6*/ case ARCTYPE_ARP_OLD: case ARCTYPE_ARP: case ARCTYPE_REVARP: - arp_print(gndo, p, length, caplen); + arp_print(gndo, p, length, caplen); return (1); case ARCTYPE_ATALK: /* XXX was this ever used? */ diff --git a/contrib/tcpdump/print-arp.c b/contrib/tcpdump/print-arp.c index b15ae50092f..fd985548705 100644 --- a/contrib/tcpdump/print-arp.c +++ b/contrib/tcpdump/print-arp.c @@ -320,6 +320,7 @@ arp_print(netdissect_options *ndo, return; case ARPHRD_FRELAY: linkaddr = LINKADDR_FRELAY; + break; default: linkaddr = LINKADDR_ETHER; break; diff --git a/contrib/tcpdump/print-atalk.c b/contrib/tcpdump/print-atalk.c index 6a8056bf556..d088ffe9fc6 100644 --- a/contrib/tcpdump/print-atalk.c +++ b/contrib/tcpdump/print-atalk.c @@ -101,30 +101,19 @@ llap_print(register const u_char *bp, u_int length) u_short snet; u_int hdrlen; -#if 0 - /* - * Our packet is on a 4-byte boundary, as we're either called - * directly from a top-level link-layer printer (ltalk_if_print) - * or from the UDP printer. The LLAP+DDP header is a multiple - * of 4 bytes in length, so the DDP payload is also on a 4-byte - * boundary, and we don't need to align it before calling - * "ddp_print()". - */ + if (length < sizeof(*lp)) { + (void)printf(" [|llap %u]", length); + return (length); + } lp = (const struct LAP *)bp; bp += sizeof(*lp); length -= sizeof(*lp); -#else - { - static struct LAP lp_ = {0, 0, lapDDP}; - lp = &lp_; - } -#endif hdrlen = sizeof(*lp); switch (lp->type) { case lapShortDDP: if (length < ddpSSize) { - (void)printf(" [|sddp %d]", length); + (void)printf(" [|sddp %u]", length); return (length); } sdp = (const struct atShortDDP *)bp; @@ -140,7 +129,7 @@ llap_print(register const u_char *bp, u_int length) case lapDDP: if (length < ddpSize) { - (void)printf(" [|ddp %d]", length); + (void)printf(" [|ddp %u]", length); return (length); } dp = (const struct atDDP *)bp; @@ -163,7 +152,7 @@ llap_print(register const u_char *bp, u_int length) #endif default: - printf("%d > %d at-lap#%d %d", + printf("%d > %d at-lap#%d %u", lp->src, lp->dst, lp->type, length); break; } @@ -185,7 +174,7 @@ atalk_print(register const u_char *bp, u_int length) printf("AT "); if (length < ddpSize) { - (void)printf(" [|ddp %d]", length); + (void)printf(" [|ddp %u]", length); return; } dp = (const struct atDDP *)bp; @@ -274,6 +263,10 @@ atp_print(register const struct atATP *ap, u_int length) fputs(tstr, stdout); return; } + if (length < sizeof(*ap)) { + (void)printf(" [|atp %u]", length); + return; + } length -= sizeof(*ap); switch (ap->control & 0xc0) { @@ -285,7 +278,7 @@ atp_print(register const struct atATP *ap, u_int length) atp_bitmap_print(ap->bitmap); if (length != 0) - (void)printf(" [len=%d]", length); + (void)printf(" [len=%u]", length); switch (ap->control & (atpEOM|atpSTS)) { case atpEOM: @@ -301,7 +294,7 @@ atp_print(register const struct atATP *ap, u_int length) break; case atpRspCode: - (void)printf(" atp-resp%s%d:%d (%d)", + (void)printf(" atp-resp%s%d:%d (%u)", ap->control & atpEOM? "*" : " ", EXTRACT_16BITS(&ap->transID), ap->bitmap, length); switch (ap->control & (atpXO|atpSTS)) { @@ -324,7 +317,7 @@ atp_print(register const struct atATP *ap, u_int length) /* length should be zero */ if (length) - (void)printf(" [len=%d]", length); + (void)printf(" [len=%u]", length); /* there shouldn't be any control flags */ if (ap->control & (atpXO|atpEOM|atpSTS)) { @@ -346,7 +339,7 @@ atp_print(register const struct atATP *ap, u_int length) break; default: - (void)printf(" atp-0x%x %d (%d)", ap->control, + (void)printf(" atp-0x%x %d (%u)", ap->control, EXTRACT_16BITS(&ap->transID), length); break; } @@ -396,14 +389,14 @@ nbp_print(register const struct atNBP *np, u_int length, register u_short snet, const u_char *ep; if (length < nbpHeaderSize) { - (void)printf(" truncated-nbp %d", length); + (void)printf(" truncated-nbp %u", length); return; } length -= nbpHeaderSize; if (length < 8) { /* must be room for at least one tuple */ - (void)printf(" truncated-nbp %d", length + nbpHeaderSize); + (void)printf(" truncated-nbp %u", length + nbpHeaderSize); return; } /* ep points to end of available data */ @@ -448,7 +441,7 @@ nbp_print(register const struct atNBP *np, u_int length, register u_short snet, break; default: - (void)printf(" nbp-0x%x %d (%d)", np->control, np->id, + (void)printf(" nbp-0x%x %d (%u)", np->control, np->id, length); break; } @@ -560,19 +553,17 @@ ataddr_string(u_short atnet, u_char athost) if (first && (first = 0, !nflag) && (fp = fopen("/etc/atalk.names", "r"))) { char line[256]; - int i1, i2, i3; + int i1, i2; while (fgets(line, sizeof(line), fp)) { if (line[0] == '\n' || line[0] == 0 || line[0] == '#') continue; - if (sscanf(line, "%d.%d.%d %256s", &i1, &i2, &i3, - nambuf) == 4) + if (sscanf(line, "%d.%d %256s", &i1, &i2, nambuf) == 3) /* got a hostname. */ - i3 |= ((i1 << 8) | i2) << 8; - else if (sscanf(line, "%d.%d %256s", &i1, &i2, - nambuf) == 3) + i2 |= (i1 << 8); + else if (sscanf(line, "%d %256s", &i1, nambuf) == 2) /* got a net name */ - i3 = (((i1 << 8) | i2) << 8) | 255; + i2 = (i1 << 8) | 255; else continue; @@ -605,11 +596,9 @@ ataddr_string(u_short atnet, u_char athost) tp->addr = (atnet << 8) | athost; tp->nxt = newhnamemem(); if (athost != 255) - (void)snprintf(nambuf, sizeof(nambuf), "%d.%d.%d", - atnet >> 8, atnet & 0xff, athost); + (void)snprintf(nambuf, sizeof(nambuf), "%d.%d", atnet, athost); else - (void)snprintf(nambuf, sizeof(nambuf), "%d.%d", atnet >> 8, - atnet & 0xff); + (void)snprintf(nambuf, sizeof(nambuf), "%d", atnet); tp->name = strdup(nambuf); return (tp->name); diff --git a/contrib/tcpdump/print-atm.c b/contrib/tcpdump/print-atm.c index e679f74a253..b0fd6c2e844 100644 --- a/contrib/tcpdump/print-atm.c +++ b/contrib/tcpdump/print-atm.c @@ -272,10 +272,12 @@ sig_print(const u_char *p, int caplen) printf(":%s ", tok2str(msgtype2str, "msgtype#%d", p[MSG_TYPE_POS])); - if (caplen < CALL_REF_POS+3) { - printf("[|atm]"); - return; - } + /* + * The call reference comes before the message type, + * so if we know we have the message type, which we + * do from the caplen test above, we also know we have + * the call reference. + */ call_ref = EXTRACT_24BITS(&p[CALL_REF_POS]); printf("CALL_REF:0x%06x", call_ref); } else { diff --git a/contrib/tcpdump/print-babel.c b/contrib/tcpdump/print-babel.c new file mode 100644 index 00000000000..e787f8b2fc8 --- /dev/null +++ b/contrib/tcpdump/print-babel.c @@ -0,0 +1,414 @@ +/* + * Copyright (c) 2007-2011 Grégoire Henry, Juliusz Chroboczek + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include + +#include "addrtoname.h" +#include "interface.h" +#include "extract.h" + +static void babel_print_v2(const u_char *cp, u_int length); + +void +babel_print(const u_char *cp, u_int length) { + printf("babel"); + + TCHECK2(*cp, 4); + + if(cp[0] != 42) { + printf(" malformed header"); + return; + } else { + printf(" %d", cp[1]); + } + + switch(cp[1]) { + case 2: + babel_print_v2(cp,length); + break; + default: + printf(" unknown version"); + break; + } + + return; + + trunc: + printf(" [|babel]"); + return; +} + +#define MESSAGE_PAD1 0 +#define MESSAGE_PADN 1 +#define MESSAGE_ACK_REQ 2 +#define MESSAGE_ACK 3 +#define MESSAGE_HELLO 4 +#define MESSAGE_IHU 5 +#define MESSAGE_ROUTER_ID 6 +#define MESSAGE_NH 7 +#define MESSAGE_UPDATE 8 +#define MESSAGE_REQUEST 9 +#define MESSAGE_MH_REQUEST 10 + +static const char * +format_id(const u_char *id) +{ + static char buf[25]; + snprintf(buf, 25, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", + id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7]); + buf[24] = '\0'; + return buf; +} + +static const unsigned char v4prefix[16] = + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 }; + +static const char * +format_prefix(const u_char *prefix, unsigned char plen) +{ + static char buf[50]; + if(plen >= 96 && memcmp(prefix, v4prefix, 12) == 0) + snprintf(buf, 50, "%s/%u", ipaddr_string(prefix + 12), plen - 96); + else + snprintf(buf, 50, "%s/%u", ip6addr_string(prefix), plen); + buf[49] = '\0'; + return buf; +} + +static const char * +format_address(const u_char *prefix) +{ + if(memcmp(prefix, v4prefix, 12) == 0) + return ipaddr_string(prefix + 12); + else + return ip6addr_string(prefix); +} + +static int +network_prefix(int ae, int plen, unsigned int omitted, + const unsigned char *p, const unsigned char *dp, + unsigned int len, unsigned char *p_r) +{ + unsigned pb; + unsigned char prefix[16]; + + if(plen >= 0) + pb = (plen + 7) / 8; + else if(ae == 1) + pb = 4; + else + pb = 16; + + if(pb > 16) + return -1; + + memset(prefix, 0, 16); + + switch(ae) { + case 0: break; + case 1: + if(omitted > 4 || pb > 4 || (pb > omitted && len < pb - omitted)) + return -1; + memcpy(prefix, v4prefix, 12); + if(omitted) { + if (dp == NULL) return -1; + memcpy(prefix, dp, 12 + omitted); + } + if(pb > omitted) memcpy(prefix + 12 + omitted, p, pb - omitted); + break; + case 2: + if(omitted > 16 || (pb > omitted && len < pb - omitted)) + return -1; + if(omitted) { + if (dp == NULL) return -1; + memcpy(prefix, dp, omitted); + } + if(pb > omitted) memcpy(prefix + omitted, p, pb - omitted); + break; + case 3: + if(pb > 8 && len < pb - 8) return -1; + prefix[0] = 0xfe; + prefix[1] = 0x80; + if(pb > 8) memcpy(prefix + 8, p, pb - 8); + break; + default: + return -1; + } + + memcpy(p_r, prefix, 16); + return 1; +} + +static int +network_address(int ae, const unsigned char *a, unsigned int len, + unsigned char *a_r) +{ + return network_prefix(ae, -1, 0, a, NULL, len, a_r); +} + +#define ICHECK(i, l) \ + if ((i) + (l) > bodylen || (i) + (l) > length) goto corrupt; + +static void +babel_print_v2(const u_char *cp, u_int length) { + u_int i; + u_short bodylen; + u_char v4_prefix[16] = + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 }; + u_char v6_prefix[16] = {0}; + + TCHECK2(*cp, 4); + if (length < 4) + goto corrupt; + bodylen = EXTRACT_16BITS(cp + 2); + printf(" (%u)", bodylen); + + /* Process the TLVs in the body */ + i = 0; + while(i < bodylen) { + const u_char *message; + u_char type, len; + + message = cp + 4 + i; + TCHECK2(*message, 2); + ICHECK(i, 2); + type = message[0]; + len = message[1]; + + TCHECK2(*message, 2 + len); + ICHECK(i, 2 + len); + + switch(type) { + case MESSAGE_PAD1: { + if(!vflag) + printf(" pad1"); + else + printf("\n\tPad 1"); + } + break; + + case MESSAGE_PADN: { + if(!vflag) + printf(" padN"); + else + printf("\n\tPad %d", len + 2); + } + break; + + case MESSAGE_ACK_REQ: { + u_short nonce, interval; + if(!vflag) + printf(" ack-req"); + else { + printf("\n\tAcknowledgment Request "); + if(len < 6) goto corrupt; + nonce = EXTRACT_16BITS(message + 4); + interval = EXTRACT_16BITS(message + 6); + printf("%04x %d", nonce, interval); + } + } + break; + + case MESSAGE_ACK: { + u_short nonce; + if(!vflag) + printf(" ack"); + else { + printf("\n\tAcknowledgment "); + if(len < 2) goto corrupt; + nonce = EXTRACT_16BITS(message + 2); + printf("%04x", nonce); + } + } + break; + + case MESSAGE_HELLO: { + u_short seqno, interval; + if(!vflag) + printf(" hello"); + else { + printf("\n\tHello "); + if(len < 6) goto corrupt; + seqno = EXTRACT_16BITS(message + 4); + interval = EXTRACT_16BITS(message + 6); + printf("seqno %u interval %u", seqno, interval); + } + } + break; + + case MESSAGE_IHU: { + unsigned short txcost, interval; + if(!vflag) + printf(" ihu"); + else { + u_char address[16]; + int rc; + printf("\n\tIHU "); + if(len < 6) goto corrupt; + txcost = EXTRACT_16BITS(message + 4); + interval = EXTRACT_16BITS(message + 6); + rc = network_address(message[2], message + 8, len - 6, address); + if(rc < 0) { printf("[|babel]"); break; } + printf("%s txcost %u interval %d", + format_address(address), txcost, interval); + } + } + break; + + case MESSAGE_ROUTER_ID: { + if(!vflag) + printf(" router-id"); + else { + printf("\n\tRouter Id"); + if(len < 10) goto corrupt; + printf(" %s", format_id(message + 4)); + } + } + break; + + case MESSAGE_NH: { + if(!vflag) + printf(" nh"); + else { + int rc; + u_char nh[16]; + printf("\n\tNext Hop"); + if(len < 2) goto corrupt; + rc = network_address(message[2], message + 4, len - 2, nh); + if(rc < 0) goto corrupt; + printf(" %s", format_address(nh)); + } + } + break; + + case MESSAGE_UPDATE: { + if(!vflag) { + printf(" update"); + if(len < 1) + printf("/truncated"); + else + printf("%s%s%s", + (message[3] & 0x80) ? "/prefix": "", + (message[3] & 0x40) ? "/id" : "", + (message[3] & 0x3f) ? "/unknown" : ""); + } else { + u_short interval, seqno, metric; + u_char plen; + int rc; + u_char prefix[16]; + printf("\n\tUpdate"); + if(len < 10) goto corrupt; + plen = message[4] + (message[2] == 1 ? 96 : 0); + rc = network_prefix(message[2], message[4], message[5], + message + 12, + message[2] == 1 ? v4_prefix : v6_prefix, + len - 10, prefix); + if(rc < 0) goto corrupt; + interval = EXTRACT_16BITS(message + 6); + seqno = EXTRACT_16BITS(message + 8); + metric = EXTRACT_16BITS(message + 10); + printf("%s%s%s %s metric %u seqno %u interval %u", + (message[3] & 0x80) ? "/prefix": "", + (message[3] & 0x40) ? "/id" : "", + (message[3] & 0x3f) ? "/unknown" : "", + format_prefix(prefix, plen), + metric, seqno, interval); + if(message[3] & 0x80) { + if(message[2] == 1) + memcpy(v4_prefix, prefix, 16); + else + memcpy(v6_prefix, prefix, 16); + } + } + } + break; + + case MESSAGE_REQUEST: { + if(!vflag) + printf(" request"); + else { + int rc; + u_char prefix[16], plen; + printf("\n\tRequest "); + if(len < 2) goto corrupt; + plen = message[3] + (message[2] == 1 ? 96 : 0); + rc = network_prefix(message[2], message[3], 0, + message + 4, NULL, len - 2, prefix); + if(rc < 0) goto corrupt; + plen = message[3] + (message[2] == 1 ? 96 : 0); + printf("for %s", + message[2] == 0 ? "any" : format_prefix(prefix, plen)); + } + } + break; + + case MESSAGE_MH_REQUEST : { + if(!vflag) + printf(" mh-request"); + else { + int rc; + u_short seqno; + u_char prefix[16], plen; + printf("\n\tMH-Request "); + if(len < 14) goto corrupt; + seqno = EXTRACT_16BITS(message + 4); + rc = network_prefix(message[2], message[3], 0, + message + 16, NULL, len - 14, prefix); + if(rc < 0) goto corrupt; + plen = message[3] + (message[2] == 1 ? 96 : 0); + printf("(%u hops) for %s seqno %u id %s", + message[6], format_prefix(prefix, plen), + seqno, format_id(message + 8)); + } + } + break; + default: + if(!vflag) + printf(" unknown"); + else + printf("\n\tUnknown message type %d", type); + } + i += len + 2; + } + return; + + trunc: + printf(" [|babel]"); + return; + + corrupt: + printf(" (corrupt)"); + return; +} diff --git a/contrib/tcpdump/print-bgp.c b/contrib/tcpdump/print-bgp.c index d77802dd734..6460a59e0c4 100644 --- a/contrib/tcpdump/print-bgp.c +++ b/contrib/tcpdump/print-bgp.c @@ -401,8 +401,11 @@ static struct tok bgp_safi_values[] = { #define BGP_EXT_COM_L2INFO 0x800a /* draft-kompella-ppvpn-l2vpn */ -#define BGP_EXT_COM_SOURCE_AS 0x0009 /* draft-ietf-l3vpn-2547bis-mcast-bgp-02.txt */ -#define BGP_EXT_COM_VRF_RT_IMP 0x010a /* draft-ietf-l3vpn-2547bis-mcast-bgp-02.txt */ +#define BGP_EXT_COM_SOURCE_AS 0x0009 /* RFC-ietf-l3vpn-2547bis-mcast-bgp-08.txt */ +#define BGP_EXT_COM_VRF_RT_IMP 0x010b /* RFC-ietf-l3vpn-2547bis-mcast-bgp-08.txt */ +#define BGP_EXT_COM_L2VPN_RT_0 0x000a /* L2VPN Identifier,Format AS(2bytes):AN(4bytes) */ +#define BGP_EXT_COM_L2VPN_RT_1 0xF10a /* L2VPN Identifier,Format IP address:AN(2bytes) */ + /* http://www.cisco.com/en/US/tech/tk436/tk428/technologies_tech_note09186a00801eb09a.shtml */ #define BGP_EXT_COM_EIGRP_GEN 0x8800 @@ -443,6 +446,8 @@ static struct tok bgp_extd_comm_subtype_values[] = { { BGP_EXT_COM_EIGRP_EXT_REMPROTO_REMMETRIC , "eigrp-external-route (remote-proto, remote-metric)" }, { BGP_EXT_COM_SOURCE_AS, "source-AS" }, { BGP_EXT_COM_VRF_RT_IMP, "vrf-route-import"}, + { BGP_EXT_COM_L2VPN_RT_0, "l2vpn-id"}, + { BGP_EXT_COM_L2VPN_RT_1, "l2vpn-id"}, { 0, NULL}, }; @@ -951,57 +956,84 @@ decode_labeled_vpn_l2(const u_char *pptr, char *buf, u_int buflen) plen=EXTRACT_16BITS(pptr); tlen=plen; pptr+=2; - TCHECK2(pptr[0],15); - buf[0]='\0'; - strlen=snprintf(buf, buflen, "RD: %s, CE-ID: %u, Label-Block Offset: %u, Label Base %u", - bgp_vpn_rd_print(pptr), - EXTRACT_16BITS(pptr+8), - EXTRACT_16BITS(pptr+10), - EXTRACT_24BITS(pptr+12)>>4); /* the label is offsetted by 4 bits so lets shift it right */ - UPDATE_BUF_BUFLEN(buf, buflen, strlen); - pptr+=15; - tlen-=15; + /* Old and new L2VPN NLRI share AFI/SAFI + * -> Assume a 12 Byte-length NLRI is auto-discovery-only + * and > 17 as old format. Complain for the middle case + */ + if (plen==12) { + /* assume AD-only with RD, BGPNH */ + TCHECK2(pptr[0],12); + buf[0]='\0'; + strlen=snprintf(buf, buflen, "RD: %s, BGPNH: %s", + bgp_vpn_rd_print(pptr), + /* need something like getname() here */ + getname(pptr+8) + ); + UPDATE_BUF_BUFLEN(buf, buflen, strlen); + pptr+=12; + tlen-=12; + return plen; + } else if (plen>17) { + /* assume old format */ + /* RD, ID, LBLKOFF, LBLBASE */ - /* ok now the variable part - lets read out TLVs*/ - while (tlen>0) { - if (tlen < 3) - return -1; - TCHECK2(pptr[0], 3); - tlv_type=*pptr++; - tlv_len=EXTRACT_16BITS(pptr); - ttlv_len=tlv_len; - pptr+=2; + TCHECK2(pptr[0],15); + buf[0]='\0'; + strlen=snprintf(buf, buflen, "RD: %s, CE-ID: %u, Label-Block Offset: %u, Label Base %u", + bgp_vpn_rd_print(pptr), + EXTRACT_16BITS(pptr+8), + EXTRACT_16BITS(pptr+10), + EXTRACT_24BITS(pptr+12)>>4); /* the label is offsetted by 4 bits so lets shift it right */ + UPDATE_BUF_BUFLEN(buf, buflen, strlen); + pptr+=15; + tlen-=15; - switch(tlv_type) { - case 1: - if (buflen!=0) { - strlen=snprintf(buf,buflen, "\n\t\tcircuit status vector (%u) length: %u: 0x", - tlv_type, - tlv_len); - UPDATE_BUF_BUFLEN(buf, buflen, strlen); - } - ttlv_len=ttlv_len/8+1; /* how many bytes do we need to read ? */ - while (ttlv_len>0) { - TCHECK(pptr[0]); - if (buflen!=0) { - strlen=snprintf(buf,buflen, "%02x",*pptr++); - UPDATE_BUF_BUFLEN(buf, buflen, strlen); - } - ttlv_len--; - } - break; - default: - if (buflen!=0) { - strlen=snprintf(buf,buflen, "\n\t\tunknown TLV #%u, length: %u", - tlv_type, - tlv_len); - UPDATE_BUF_BUFLEN(buf, buflen, strlen); - } - break; - } - tlen-=(tlv_len<<3); /* the tlv-length is expressed in bits so lets shift it right */ + /* ok now the variable part - lets read out TLVs*/ + while (tlen>0) { + if (tlen < 3) + return -1; + TCHECK2(pptr[0], 3); + tlv_type=*pptr++; + tlv_len=EXTRACT_16BITS(pptr); + ttlv_len=tlv_len; + pptr+=2; + + switch(tlv_type) { + case 1: + if (buflen!=0) { + strlen=snprintf(buf,buflen, "\n\t\tcircuit status vector (%u) length: %u: 0x", + tlv_type, + tlv_len); + UPDATE_BUF_BUFLEN(buf, buflen, strlen); + } + ttlv_len=ttlv_len/8+1; /* how many bytes do we need to read ? */ + while (ttlv_len>0) { + TCHECK(pptr[0]); + if (buflen!=0) { + strlen=snprintf(buf,buflen, "%02x",*pptr++); + UPDATE_BUF_BUFLEN(buf, buflen, strlen); + } + ttlv_len--; + } + break; + default: + if (buflen!=0) { + strlen=snprintf(buf,buflen, "\n\t\tunknown TLV #%u, length: %u", + tlv_type, + tlv_len); + UPDATE_BUF_BUFLEN(buf, buflen, strlen); + } + break; + } + tlen-=(tlv_len<<3); /* the tlv-length is expressed in bits so lets shift it right */ + } + return plen+2; + + } else { + /* complain bitterly ? */ + /* fall through */ + goto trunc; } - return plen+2; trunc: return -2; @@ -1939,6 +1971,7 @@ bgp_attr_print(const struct bgp_attr *attr, const u_char *pptr, int len) switch(extd_comm) { case BGP_EXT_COM_RT_0: case BGP_EXT_COM_RO_0: + case BGP_EXT_COM_L2VPN_RT_0: printf(": %u:%u (= %s)", EXTRACT_16BITS(tptr+2), EXTRACT_32BITS(tptr+4), @@ -1946,6 +1979,7 @@ bgp_attr_print(const struct bgp_attr *attr, const u_char *pptr, int len) break; case BGP_EXT_COM_RT_1: case BGP_EXT_COM_RO_1: + case BGP_EXT_COM_L2VPN_RT_1: case BGP_EXT_COM_VRF_RT_IMP: printf(": %s:%u", getname(tptr+2), diff --git a/contrib/tcpdump/print-carp.c b/contrib/tcpdump/print-carp.c new file mode 100644 index 00000000000..ba5be7c6217 --- /dev/null +++ b/contrib/tcpdump/print-carp.c @@ -0,0 +1,88 @@ +/* $OpenBSD: print-carp.c,v 1.6 2009/10/27 23:59:55 deraadt Exp $ */ + +/* + * Copyright (c) 2000 William C. Fenner. + * All rights reserved. + * + * Kevin Steves July 2000 + * Modified to: + * - print version, type string and packet length + * - print IP address count if > 1 (-v) + * - verify checksum (-v) + * - print authentication string (-v) + * + * Copyright (c) 2011 Advanced Computing Technologies + * George V. Neille-Neil + * + * Modified to: + * - work correctly with CARP + * - compile into the latest tcpdump + * - print out the counter + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that: (1) source code + * distributions retain the above copyright notice and this paragraph + * in its entirety, and (2) distributions including binary code include + * the above copyright notice and this paragraph in its entirety in + * the documentation or other materials provided with the distribution. + * The name of William C. Fenner may not be used to endorse or + * promote products derived from this software without specific prior + * written permission. THIS SOFTWARE IS PROVIDED ``AS IS'' AND + * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include +#include + +#include + +#include "interface.h" +#include "extract.h" +#include "addrtoname.h" + +void +carp_print(register const u_char *bp, register u_int len, int ttl) +{ + int version, type; + const char *type_s; + + TCHECK(bp[0]); + version = (bp[0] & 0xf0) >> 4; + type = bp[0] & 0x0f; + if (type == 1) + type_s = "advertise"; + else + type_s = "unknown"; + printf("CARPv%d-%s %d: ", version, type_s, len); + if (ttl != 255) + printf("[ttl=%d!] ", ttl); + if (version != 2 || type != 1) + return; + TCHECK(bp[2]); + TCHECK(bp[5]); + printf("vhid=%d advbase=%d advskew=%d authlen=%d ", + bp[1], bp[5], bp[2], bp[3]); + if (vflag) { + struct cksum_vec vec[1]; + vec[0].ptr = (const u_int8_t *)bp; + vec[0].len = len; + if (TTEST2(bp[0], len) && in_cksum(vec, 1)) + printf(" (bad carp cksum %x!)", + EXTRACT_16BITS(&bp[6])); + } + printf("counter=%" PRIu64, EXTRACT_64BITS(&bp[8])); + + return; +trunc: + printf("[|carp]"); +} diff --git a/contrib/tcpdump/print-cdp.c b/contrib/tcpdump/print-cdp.c index bef7f5eacad..7bc617a9635 100644 --- a/contrib/tcpdump/print-cdp.c +++ b/contrib/tcpdump/print-cdp.c @@ -124,7 +124,7 @@ cdp_print(const u_char *pptr, u_int length, u_int caplen) tok2str(cdp_tlv_values,"unknown field type", type), type, len, - len>1 ? "s" : ""); /* plural */ + PLURAL_SUFFIX(len)); /* plural */ switch (type) { diff --git a/contrib/tcpdump/print-chdlc.c b/contrib/tcpdump/print-chdlc.c index 238e91a98ce..261b15ad7ef 100644 --- a/contrib/tcpdump/print-chdlc.c +++ b/contrib/tcpdump/print-chdlc.c @@ -85,7 +85,7 @@ chdlc_print(register const u_char *p, u_int length) { break; #ifdef INET6 case ETHERTYPE_IPV6: - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif case CHDLC_TYPE_SLARP: diff --git a/contrib/tcpdump/print-dccp.c b/contrib/tcpdump/print-dccp.c index fee4a6e5057..79ea5f72ee5 100644 --- a/contrib/tcpdump/print-dccp.c +++ b/contrib/tcpdump/print-dccp.c @@ -60,7 +60,7 @@ static const char *dccp_feature_nums[] = { "check data checksum", }; -static inline int dccp_csum_coverage(const struct dccp_hdr* dh, u_int len) +static inline u_int dccp_csum_coverage(const struct dccp_hdr* dh, u_int len) { u_int cov; @@ -73,61 +73,15 @@ static inline int dccp_csum_coverage(const struct dccp_hdr* dh, u_int len) static int dccp_cksum(const struct ip *ip, const struct dccp_hdr *dh, u_int len) { - int cov = dccp_csum_coverage(dh, len); - union phu { - struct phdr { - u_int32_t src; - u_int32_t dst; - u_char mbz; - u_char proto; - u_int16_t len; - } ph; - u_int16_t pa[6]; - } phu; - const u_int16_t *sp; - - /* pseudo-header.. */ - phu.ph.mbz = 0; - phu.ph.len = htons(len); - phu.ph.proto = IPPROTO_DCCP; - memcpy(&phu.ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t)); - if (IP_HL(ip) == 5) - memcpy(&phu.ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t)); - else - phu.ph.dst = ip_finddst(ip); - - sp = &phu.pa[0]; - return in_cksum((u_short *)dh, cov, sp[0]+sp[1]+sp[2]+sp[3]+sp[4]+sp[5]); + return nextproto4_cksum(ip, (const u_int8_t *)(void *)dh, + dccp_csum_coverage(dh, len), IPPROTO_DCCP); } #ifdef INET6 static int dccp6_cksum(const struct ip6_hdr *ip6, const struct dccp_hdr *dh, u_int len) { - size_t i; - u_int32_t sum = 0; - int cov = dccp_csum_coverage(dh, len); - union { - struct { - struct in6_addr ph_src; - struct in6_addr ph_dst; - u_int32_t ph_len; - u_int8_t ph_zero[3]; - u_int8_t ph_nxt; - } ph; - u_int16_t pa[20]; - } phu; - - /* pseudo-header */ - memset(&phu, 0, sizeof(phu)); - phu.ph.ph_src = ip6->ip6_src; - phu.ph.ph_dst = ip6->ip6_dst; - phu.ph.ph_len = htonl(len); - phu.ph.ph_nxt = IPPROTO_DCCP; - - for (i = 0; i < sizeof(phu.pa) / sizeof(phu.pa[0]); i++) - sum += phu.pa[i]; - - return in_cksum((u_short *)dh, cov, sum); + return nextproto6_cksum(ip6, (const u_int8_t *)(void *)dh, + dccp_csum_coverage(dh, len), IPPROTO_DCCP); } #endif diff --git a/contrib/tcpdump/print-dhcp6.c b/contrib/tcpdump/print-dhcp6.c index 26855ccbfb1..a75da823815 100644 --- a/contrib/tcpdump/print-dhcp6.c +++ b/contrib/tcpdump/print-dhcp6.c @@ -229,15 +229,15 @@ dhcp6opt_name(int type) case DH6OPT_SIP_SERVER_A: return "SIP-servers-address"; case DH6OPT_DNS: - return "DNS"; + return "DNS-server"; case DH6OPT_DNSNAME: - return "DNS-name"; + return "DNS-search-list"; case DH6OPT_IA_PD: return "IA_PD"; case DH6OPT_IA_PD_PREFIX: return "IA_PD-prefix"; case DH6OPT_NTP_SERVERS: - return "NTP-Server"; + return "NTP-server"; case DH6OPT_LIFETIME: return "lifetime"; case DH6OPT_NIS_SERVERS: diff --git a/contrib/tcpdump/print-enc.c b/contrib/tcpdump/print-enc.c index e98f7f78215..5c01f3ef7b6 100644 --- a/contrib/tcpdump/print-enc.c +++ b/contrib/tcpdump/print-enc.c @@ -80,7 +80,7 @@ enc_if_print(const struct pcap_pkthdr *h, register const u_char *p) break; #ifdef INET6 case AF_INET6: - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif /*INET6*/ } diff --git a/contrib/tcpdump/print-ether.c b/contrib/tcpdump/print-ether.c index 5091e81644a..2179215b608 100644 --- a/contrib/tcpdump/print-ether.c +++ b/contrib/tcpdump/print-ether.c @@ -25,6 +25,7 @@ static const char rcsid[] _U_ = "@(#) $Header: /tcpdump/master/tcpdump/print-ether.c,v 1.106 2008-02-06 10:47:53 guy Exp $ (LBL)"; #endif +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -47,6 +48,9 @@ const struct tok ethertype_values[] = { { ETHERTYPE_MPLS_MULTI, "MPLS multicast" }, { ETHERTYPE_IPV6, "IPv6" }, { ETHERTYPE_8021Q, "802.1Q" }, + { ETHERTYPE_8021Q9100, "802.1Q-9100" }, + { ETHERTYPE_8021QinQ, "802.1Q-QinQ" }, + { ETHERTYPE_8021Q9200, "802.1Q-9200" }, { ETHERTYPE_VMAN, "VMAN" }, { ETHERTYPE_PUP, "PUP" }, { ETHERTYPE_ARP, "ARP"}, @@ -86,33 +90,34 @@ const struct tok ethertype_values[] = { }; static inline void -ether_hdr_print(register const u_char *bp, u_int length) +ether_hdr_print(netdissect_options *ndo, + const u_char *bp, u_int length) { register const struct ether_header *ep; u_int16_t ether_type; ep = (const struct ether_header *)bp; - (void)printf("%s > %s", + (void)ND_PRINT((ndo, "%s > %s", etheraddr_string(ESRC(ep)), - etheraddr_string(EDST(ep))); + etheraddr_string(EDST(ep)))); ether_type = EXTRACT_16BITS(&ep->ether_type); - if (!qflag) { + if (!ndo->ndo_qflag) { if (ether_type <= ETHERMTU) - (void)printf(", 802.3"); + (void)ND_PRINT((ndo, ", 802.3")); else - (void)printf(", ethertype %s (0x%04x)", + (void)ND_PRINT((ndo, ", ethertype %s (0x%04x)", tok2str(ethertype_values,"Unknown", ether_type), - ether_type); + ether_type)); } else { if (ether_type <= ETHERMTU) - (void)printf(", 802.3"); + (void)ND_PRINT((ndo, ", 802.3")); else - (void)printf(", %s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", ether_type)); + (void)ND_PRINT((ndo, ", %s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", ether_type))); } - (void)printf(", length %u: ", length); + (void)ND_PRINT((ndo, ", length %u: ", length)); } /* @@ -122,8 +127,9 @@ ether_hdr_print(register const u_char *bp, u_int length) * frame's protocol, and an argument to pass to that function. */ void -ether_print(const u_char *p, u_int length, u_int caplen, - void (*print_encap_header)(const u_char *), const u_char *encap_header_arg) +ether_print(netdissect_options *ndo, + const u_char *p, u_int length, u_int caplen, + void (*print_encap_header)(netdissect_options *ndo, const u_char *), const u_char *encap_header_arg) { struct ether_header *ep; u_int orig_length; @@ -131,14 +137,14 @@ ether_print(const u_char *p, u_int length, u_int caplen, u_short extracted_ether_type; if (caplen < ETHER_HDRLEN || length < ETHER_HDRLEN) { - printf("[|ether]"); + ND_PRINT((ndo, "[|ether]")); return; } - if (eflag) { + if (ndo->ndo_eflag) { if (print_encap_header != NULL) - (*print_encap_header)(encap_header_arg); - ether_hdr_print(p, length); + (*print_encap_header)(ndo, encap_header_arg); + ether_hdr_print(ndo, p, length); } orig_length = length; @@ -158,36 +164,39 @@ recurse: if (llc_print(p, length, caplen, ESRC(ep), EDST(ep), &extracted_ether_type) == 0) { /* ether_type not known, print raw packet */ - if (!eflag) { + if (!ndo->ndo_eflag) { if (print_encap_header != NULL) - (*print_encap_header)(encap_header_arg); - ether_hdr_print((u_char *)ep, orig_length); + (*print_encap_header)(ndo, encap_header_arg); + ether_hdr_print(ndo, (u_char *)ep, orig_length); } - if (!suppress_default_print) - default_print(p, caplen); + if (!ndo->ndo_suppress_default_print) + ndo->ndo_default_print(ndo, p, caplen); } - } else if (ether_type == ETHERTYPE_8021Q) { + } else if (ether_type == ETHERTYPE_8021Q || + ether_type == ETHERTYPE_8021Q9100 || + ether_type == ETHERTYPE_8021Q9200 || + ether_type == ETHERTYPE_8021QinQ) { /* * Print VLAN information, and then go back and process * the enclosed type field. */ if (caplen < 4 || length < 4) { - printf("[|vlan]"); + ND_PRINT((ndo, "[|vlan]")); return; } - if (eflag) { + if (ndo->ndo_eflag) { u_int16_t tag = EXTRACT_16BITS(p); - printf("vlan %u, p %u%s, ", + ND_PRINT((ndo, "vlan %u, p %u%s, ", tag & 0xfff, tag >> 13, - (tag & 0x1000) ? ", CFI" : ""); + (tag & 0x1000) ? ", CFI" : "")); } ether_type = EXTRACT_16BITS(p + 2); - if (eflag && ether_type > ETHERMTU) - printf("ethertype %s, ", tok2str(ethertype_values,"0x%04x", ether_type)); + if (ndo->ndo_eflag && ether_type > ETHERMTU) + ND_PRINT((ndo, "ethertype %s, ", tok2str(ethertype_values,"0x%04x", ether_type))); p += 4; length -= 4; caplen -= 4; @@ -206,26 +215,26 @@ recurse: if (llc_print(p, length, caplen, ESRC(ep), EDST(ep), &extracted_ether_type) == 0) { /* ether_type not known, print raw packet */ - if (!eflag) { + if (!ndo->ndo_eflag) { if (print_encap_header != NULL) - (*print_encap_header)(encap_header_arg); - ether_hdr_print((u_char *)ep, orig_length); + (*print_encap_header)(ndo, encap_header_arg); + ether_hdr_print(ndo, (u_char *)ep, orig_length); } - if (!suppress_default_print) - default_print(p, caplen); + if (!ndo->ndo_suppress_default_print) + ndo->ndo_default_print(ndo, p, caplen); } } else { - if (ethertype_print(ether_type, p, length, caplen) == 0) { + if (ethertype_print(ndo, ether_type, p, length, caplen) == 0) { /* ether_type not known, print raw packet */ - if (!eflag) { + if (!ndo->ndo_eflag) { if (print_encap_header != NULL) - (*print_encap_header)(encap_header_arg); - ether_hdr_print((u_char *)ep, orig_length); + (*print_encap_header)(ndo, encap_header_arg); + ether_hdr_print(ndo, (u_char *)ep, orig_length); } - if (!suppress_default_print) - default_print(p, caplen); + if (!ndo->ndo_suppress_default_print) + ndo->ndo_default_print(ndo, p, caplen); } } } @@ -237,13 +246,71 @@ recurse: * is the number of bytes actually captured. */ u_int -ether_if_print(const struct pcap_pkthdr *h, const u_char *p) +ether_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, + const u_char *p) { - ether_print(p, h->len, h->caplen, NULL, NULL); + ether_print(ndo, p, h->len, h->caplen, NULL, NULL); return (ETHER_HDRLEN); } +/* + * This is the top level routine of the printer. 'p' points + * to the ether header of the packet, 'h->ts' is the timestamp, + * 'h->len' is the length of the packet off the wire, and 'h->caplen' + * is the number of bytes actually captured. + * + * This is for DLT_NETANALYZER, which has a 4-byte pseudo-header + * before the Ethernet header. + */ +u_int +netanalyzer_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, + const u_char *p) +{ + /* + * Fail if we don't have enough data for the Hilscher pseudo-header. + */ + if (h->len < 4 || h->caplen < 4) { + printf("[|netanalyzer]"); + return (h->caplen); + } + + /* Skip the pseudo-header. */ + ether_print(ndo, p + 4, h->len - 4, h->caplen - 4, NULL, NULL); + + return (4 + ETHER_HDRLEN); +} + +/* + * This is the top level routine of the printer. 'p' points + * to the ether header of the packet, 'h->ts' is the timestamp, + * 'h->len' is the length of the packet off the wire, and 'h->caplen' + * is the number of bytes actually captured. + * + * This is for DLT_NETANALYZER_TRANSPARENT, which has a 4-byte + * pseudo-header, a 7-byte Ethernet preamble, and a 1-byte Ethernet SOF + * before the Ethernet header. + */ +u_int +netanalyzer_transparent_if_print(netdissect_options *ndo, + const struct pcap_pkthdr *h, + const u_char *p) +{ + /* + * Fail if we don't have enough data for the Hilscher pseudo-header, + * preamble, and SOF. + */ + if (h->len < 12 || h->caplen < 12) { + printf("[|netanalyzer-transparent]"); + return (h->caplen); + } + + /* Skip the pseudo-header, preamble, and SOF. */ + ether_print(ndo, p + 12, h->len - 12, h->caplen - 12, NULL, NULL); + + return (12 + ETHER_HDRLEN); +} + /* * Prints the packet payload, given an Ethernet type code for the payload's * protocol. @@ -252,85 +319,87 @@ ether_if_print(const struct pcap_pkthdr *h, const u_char *p) */ int -ethertype_print(u_short ether_type, const u_char *p, u_int length, u_int caplen) +ethertype_print(netdissect_options *ndo, + u_short ether_type, const u_char *p, + u_int length, u_int caplen) { switch (ether_type) { case ETHERTYPE_IP: - ip_print(gndo, p, length); + ip_print(ndo, p, length); return (1); #ifdef INET6 case ETHERTYPE_IPV6: - ip6_print(p, length); + ip6_print(ndo, p, length); return (1); #endif /*INET6*/ case ETHERTYPE_ARP: case ETHERTYPE_REVARP: - arp_print(gndo, p, length, caplen); + arp_print(ndo, p, length, caplen); return (1); case ETHERTYPE_DN: - decnet_print(p, length, caplen); + decnet_print(/*ndo,*/p, length, caplen); return (1); case ETHERTYPE_ATALK: - if (vflag) + if (ndo->ndo_vflag) fputs("et1 ", stdout); - atalk_print(p, length); + atalk_print(/*ndo,*/p, length); return (1); case ETHERTYPE_AARP: - aarp_print(p, length); + aarp_print(/*ndo,*/p, length); return (1); case ETHERTYPE_IPX: - printf("(NOV-ETHII) "); - ipx_print(p, length); + ND_PRINT((ndo, "(NOV-ETHII) ")); + ipx_print(/*ndo,*/p, length); return (1); case ETHERTYPE_ISO: - isoclns_print(p+1, length-1, length-1); + isoclns_print(/*ndo,*/p+1, length-1, length-1); return(1); case ETHERTYPE_PPPOED: case ETHERTYPE_PPPOES: case ETHERTYPE_PPPOED2: case ETHERTYPE_PPPOES2: - pppoe_print(p, length); + pppoe_print(/*ndo,*/p, length); return (1); case ETHERTYPE_EAPOL: - eap_print(gndo, p, length); + eap_print(ndo, p, length); return (1); case ETHERTYPE_RRCP: - rrcp_print(gndo, p - 14 , length + 14); + rrcp_print(ndo, p - 14 , length + 14); return (1); case ETHERTYPE_PPP: if (length) { printf(": "); - ppp_print(p, length); + ppp_print(/*ndo,*/p, length); } return (1); case ETHERTYPE_MPCP: - mpcp_print(p, length); + mpcp_print(/*ndo,*/p, length); return (1); case ETHERTYPE_SLOW: - slow_print(p, length); + slow_print(/*ndo,*/p, length); return (1); case ETHERTYPE_CFM: case ETHERTYPE_CFM_OLD: - cfm_print(p, length); + cfm_print(/*ndo,*/p, length); return (1); case ETHERTYPE_LLDP: - lldp_print(p, length); + lldp_print(/*ndo,*/p, length); return (1); case ETHERTYPE_LOOPBACK: @@ -338,7 +407,7 @@ ethertype_print(u_short ether_type, const u_char *p, u_int length, u_int caplen) case ETHERTYPE_MPLS: case ETHERTYPE_MPLS_MULTI: - mpls_print(p, length); + mpls_print(/*ndo,*/p, length); return (1); case ETHERTYPE_LAT: diff --git a/contrib/tcpdump/print-forces.c b/contrib/tcpdump/print-forces.c index 26e83d3167c..033580e51bc 100644 --- a/contrib/tcpdump/print-forces.c +++ b/contrib/tcpdump/print-forces.c @@ -213,7 +213,7 @@ trunc: int pdatacnt_print(register const u_char * pptr, register u_int len, - u_int32_t IDcnt, u_int16_t op_msk, int indent) + u_int16_t IDcnt, u_int16_t op_msk, int indent) { u_int i; int rc; @@ -270,7 +270,7 @@ pdatacnt_print(register const u_char * pptr, register u_int len, if (vflag >= 3 && ops->v != F_TLV_PDAT) { if (pad) printf - ("%s %s (Length %d DataLen %d pad %d Bytes)\n", + ("%s %s (Length %d DataLen %d pad %d Bytes)\n", ib, ops->s, EXTRACT_16BITS(&pdtlv->length), tll, pad); else @@ -285,6 +285,7 @@ pdatacnt_print(register const u_char * pptr, register u_int len, rc = ops->print((const u_char *)pdtlv, tll + pad + TLV_HDRL, op_msk, indent + 2); + len -= (TLV_HDRL + pad + tll); } else { printf("Invalid path data content type 0x%x len %d\n", type, EXTRACT_16BITS(&pdtlv->length)); @@ -298,7 +299,7 @@ pd_err: } } } - return 0; + return len; trunc: fputs("[|forces]", stdout); @@ -312,6 +313,8 @@ pdata_print(register const u_char * pptr, register u_int len, const struct pathdata_h *pdh = (struct pathdata_h *)pptr; char *ib = indent_pr(indent, 0); u_int minsize = 0; + int more_pd = 0; + u_int16_t idcnt = 0; TCHECK(*pdh); if (len < sizeof(struct pathdata_h)) @@ -326,7 +329,8 @@ pdata_print(register const u_char * pptr, register u_int len, } pptr += sizeof(struct pathdata_h); len -= sizeof(struct pathdata_h); - minsize = EXTRACT_16BITS(&pdh->pIDcnt) * 4; + idcnt = EXTRACT_16BITS(&pdh->pIDcnt); + minsize = idcnt * 4; if (len < minsize) { printf("\t\t\ttruncated IDs expected %uB got %uB\n", minsize, len); @@ -334,7 +338,15 @@ pdata_print(register const u_char * pptr, register u_int len, printf("]\n"); return -1; } - return pdatacnt_print(pptr, len, EXTRACT_16BITS(&pdh->pIDcnt), op_msk, indent); + more_pd = pdatacnt_print(pptr, len, idcnt, op_msk, indent); + if (more_pd > 0) { + int consumed = len - more_pd; + pptr += consumed; + len = more_pd; + /* XXX: Argh, recurse some more */ + return recpdoptlv_print(pptr, len, op_msk, indent+1); + } else + return 0; trunc: fputs("[|forces]", stdout); diff --git a/contrib/tcpdump/print-fr.c b/contrib/tcpdump/print-fr.c index 67961ae34ba..34db239bc63 100644 --- a/contrib/tcpdump/print-fr.c +++ b/contrib/tcpdump/print-fr.c @@ -258,7 +258,7 @@ fr_print(register const u_char *p, u_int length) if (eflag) fr_hdr_print(length, addr_len, dlci, flags, extracted_ethertype); - if (ethertype_print(extracted_ethertype, + if (ethertype_print(gndo, extracted_ethertype, p+addr_len+ETHERTYPE_LEN, length-addr_len-ETHERTYPE_LEN, length-addr_len-ETHERTYPE_LEN) == 0) @@ -288,7 +288,7 @@ fr_print(register const u_char *p, u_int length) #ifdef INET6 case NLPID_IP6: - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif case NLPID_CLNP: diff --git a/contrib/tcpdump/print-gre.c b/contrib/tcpdump/print-gre.c index 106e6fd3111..b6fa5223669 100644 --- a/contrib/tcpdump/print-gre.c +++ b/contrib/tcpdump/print-gre.c @@ -210,7 +210,7 @@ gre_print_0(const u_char *bp, u_int length) break; #ifdef INET6 case ETHERTYPE_IPV6: - ip6_print(bp, len); + ip6_print(gndo, bp, len); break; #endif case ETHERTYPE_MPLS: @@ -226,7 +226,7 @@ gre_print_0(const u_char *bp, u_int length) isoclns_print(bp, len, len); break; case ETHERTYPE_TEB: - ether_print(bp, len, len, NULL, NULL); + ether_print(gndo, bp, len, len, NULL, NULL); break; default: printf("gre-proto-0x%x", prot); diff --git a/contrib/tcpdump/print-icmp.c b/contrib/tcpdump/print-icmp.c index 811d5994b7f..f0644851de4 100644 --- a/contrib/tcpdump/print-icmp.c +++ b/contrib/tcpdump/print-icmp.c @@ -348,6 +348,7 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2, int fragmented) const struct icmp_mpls_ext_object_header_t *icmp_mpls_ext_object_header; u_int hlen, dport, mtu, obj_tlen, obj_class_num, obj_ctype; char buf[MAXHOSTNAMELEN + 100]; + struct cksum_vec vec[1]; dp = (struct icmp *)bp; ext_dp = (struct icmp_ext_t *)bp; @@ -562,8 +563,11 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2, int fragmented) (void)printf("ICMP %s, length %u", str, plen); if (vflag && !fragmented) { /* don't attempt checksumming if this is a frag */ u_int16_t sum, icmp_sum; + struct cksum_vec vec[1]; if (TTEST2(*bp, plen)) { - sum = in_cksum((u_short*)dp, plen, 0); + vec[0].ptr = (const u_int8_t *)(void *)dp; + vec[0].len = plen; + sum = in_cksum(vec, 1); if (sum != 0) { icmp_sum = EXTRACT_16BITS(&dp->icmp_cksum); (void)printf(" (wrong icmp cksum %x (->%x)!)", @@ -600,10 +604,12 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2, int fragmented) * to check if an extension header is present. This is expedient, * however not all implementations set the length field proper. */ - if (!ext_dp->icmp_length && - in_cksum((const u_short *)&ext_dp->icmp_ext_version_res, - plen - ICMP_EXTD_MINLEN, 0)) { - return; + if (!ext_dp->icmp_length) { + vec[0].ptr = (const u_int8_t *)(void *)&ext_dp->icmp_ext_version_res; + vec[0].len = plen - ICMP_EXTD_MINLEN; + if (in_cksum(vec, 1)) { + return; + } } printf("\n\tMPLS extension v%u", @@ -619,10 +625,11 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2, int fragmented) } hlen = plen - ICMP_EXTD_MINLEN; + vec[0].ptr = (const u_int8_t *)(void *)&ext_dp->icmp_ext_version_res; + vec[0].len = hlen; printf(", checksum 0x%04x (%scorrect), length %u", EXTRACT_16BITS(ext_dp->icmp_ext_checksum), - in_cksum((const u_short *)&ext_dp->icmp_ext_version_res, - plen - ICMP_EXTD_MINLEN, 0) ? "in" : "", + in_cksum(vec, 1) ? "in" : "", hlen); hlen -= 4; /* subtract common header size */ diff --git a/contrib/tcpdump/print-icmp6.c b/contrib/tcpdump/print-icmp6.c index 24765381b65..ce1046ed2ea 100644 --- a/contrib/tcpdump/print-icmp6.c +++ b/contrib/tcpdump/print-icmp6.c @@ -197,50 +197,20 @@ print_lladdr(const u_int8_t *p, size_t l) static int icmp6_cksum(const struct ip6_hdr *ip6, const struct icmp6_hdr *icp, u_int len) { - size_t i; - register const u_int16_t *sp; - u_int32_t sum; - union { - struct { - struct in6_addr ph_src; - struct in6_addr ph_dst; - u_int32_t ph_len; - u_int8_t ph_zero[3]; - u_int8_t ph_nxt; - } ph; - u_int16_t pa[20]; - } phu; - - /* pseudo-header */ - memset(&phu, 0, sizeof(phu)); - phu.ph.ph_src = ip6->ip6_src; - phu.ph.ph_dst = ip6->ip6_dst; - phu.ph.ph_len = htonl(len); - phu.ph.ph_nxt = IPPROTO_ICMPV6; - - sum = 0; - for (i = 0; i < sizeof(phu.pa) / sizeof(phu.pa[0]); i++) - sum += phu.pa[i]; - - sp = (const u_int16_t *)icp; - - for (i = 0; i < (len & ~1); i += 2) - sum += *sp++; - - if (len & 1) - sum += htons((*(const u_int8_t *)sp) << 8); - - while (sum > 0xffff) - sum = (sum & 0xffff) + (sum >> 16); - sum = ~sum & 0xffff; - - return (sum); + return (nextproto6_cksum(ip6, (const u_int8_t *)(void *)icp, len, + IPPROTO_ICMPV6)); } enum ND_RPL_CODE { - ND_RPL_DAG_IS=0x01, - ND_RPL_DAG_IO=0x02, - ND_RPL_DAO =0x04 + ND_RPL_DIS =0x00, + ND_RPL_DIO =0x01, + ND_RPL_DAO =0x02, + ND_RPL_DAO_ACK=0x03, + ND_RPL_SDIS =0x80, + ND_RPL_SDIO =0x81, + ND_RPL_SDAO =0x82, + ND_RPL_SDAO_ACK=0x83, + ND_RPL_SCC =0x8A, }; enum ND_RPL_DIO_FLAGS { @@ -266,17 +236,25 @@ rpl_print(netdissect_options *ndo, const u_char *bp, u_int length _U_) { struct nd_rpl_dio *dio = (struct nd_rpl_dio *)bp; + int secured = hdr->icmp6_code & 0x80; + int basecode= hdr->icmp6_code & 0x7f; ND_TCHECK(dio->rpl_dagid); - switch(hdr->icmp6_code) { - case ND_RPL_DAG_IS: - ND_PRINT((ndo, ", DAG Information Solicitation")); + if(secured) { + ND_PRINT((ndo, ", (SEC)")); + } else { + ND_PRINT((ndo, ", (CLR)")); + } + + switch(basecode) { + case ND_RPL_DIS: + ND_PRINT((ndo, "DODAG Information Solicitation")); if(ndo->ndo_vflag) { } break; - case ND_RPL_DAG_IO: - ND_PRINT((ndo, ", DAG Information Object")); + case ND_RPL_DIO: + ND_PRINT((ndo, "DODAG Information Object")); if(ndo->ndo_vflag) { char dagid[65]; char *d = dagid; @@ -299,12 +277,17 @@ rpl_print(netdissect_options *ndo, } break; case ND_RPL_DAO: - ND_PRINT((ndo, ", Destination Advertisement Object")); + ND_PRINT((ndo, "Destination Advertisement Object")); + if(ndo->ndo_vflag) { + } + break; + case ND_RPL_DAO_ACK: + ND_PRINT((ndo, "Destination Advertisement Object Ack")); if(ndo->ndo_vflag) { } break; default: - ND_PRINT((ndo, ", RPL message, unknown code %u",hdr->icmp6_code)); + ND_PRINT((ndo, "RPL message, unknown code %u",hdr->icmp6_code)); break; } return; @@ -336,12 +319,15 @@ icmp6_print(netdissect_options *ndo, TCHECK(dp->icmp6_cksum); if (vflag && !fragmented) { - int sum = dp->icmp6_cksum; + u_int16_t sum, udp_sum; if (TTEST2(bp[0], length)) { + udp_sum = EXTRACT_16BITS(&dp->icmp6_cksum); sum = icmp6_cksum(ip, dp, length); if (sum != 0) - (void)printf("[bad icmp6 cksum %x!] ", sum); + (void)printf("[bad icmp6 cksum 0x%04x -> 0x%04x!] ", + udp_sum, + in_cksum_shouldbe(udp_sum, sum)); else (void)printf("[icmp6 sum ok] "); } diff --git a/contrib/tcpdump/print-igmp.c b/contrib/tcpdump/print-igmp.c index a848562985d..6522bc3044d 100644 --- a/contrib/tcpdump/print-igmp.c +++ b/contrib/tcpdump/print-igmp.c @@ -259,6 +259,8 @@ trunc: void igmp_print(register const u_char *bp, register u_int len) { + struct cksum_vec vec[1]; + if (qflag) { (void)printf("igmp"); return; @@ -327,7 +329,9 @@ igmp_print(register const u_char *bp, register u_int len) if (vflag && TTEST2(bp[0], len)) { /* Check the IGMP checksum */ - if (in_cksum((const u_short*)bp, len, 0)) + vec[0].ptr = bp; + vec[0].len = len; + if (in_cksum(vec, 1)) printf(" bad igmp cksum %x!", EXTRACT_16BITS(&bp[2])); } return; diff --git a/contrib/tcpdump/print-ip.c b/contrib/tcpdump/print-ip.c index dc9d2665ab1..989623386f0 100644 --- a/contrib/tcpdump/print-ip.c +++ b/contrib/tcpdump/print-ip.c @@ -89,7 +89,7 @@ ip_printroute(register const u_char *cp, u_int length) * This is used for UDP and TCP pseudo-header in the checksum * calculation. */ -u_int32_t +static u_int32_t ip_finddst(const struct ip *ip) { int length; @@ -131,6 +131,39 @@ trunc: return retval; } +/* + * Compute a V4-style checksum by building a pseudoheader. + */ +int +nextproto4_cksum(const struct ip *ip, const u_int8_t *data, + u_int len, u_int next_proto) +{ + struct phdr { + u_int32_t src; + u_int32_t dst; + u_char mbz; + u_char proto; + u_int16_t len; + } ph; + struct cksum_vec vec[2]; + + /* pseudo-header.. */ + ph.len = htons((u_int16_t)len); + ph.mbz = 0; + ph.proto = next_proto; + memcpy(&ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t)); + if (IP_HL(ip) == 5) + memcpy(&ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t)); + else + ph.dst = ip_finddst(ip); + + vec[0].ptr = (const u_int8_t *)(void *)&ph; + vec[0].len = sizeof(ph); + vec[1].ptr = data; + vec[1].len = len; + return (in_cksum(vec, 2)); +} + static void ip_printts(register const u_char *cp, u_int length) { @@ -270,92 +303,6 @@ trunc: printf("[|ip]"); } -/* - * compute an IP header checksum. - * don't modifiy the packet. - */ -u_short -in_cksum(const u_short *addr, register u_int len, int csum) -{ - int nleft = len; - const u_short *w = addr; - u_short answer; - int sum = csum; - - /* - * Our algorithm is simple, using a 32 bit accumulator (sum), - * we add sequential 16 bit words to it, and at the end, fold - * back all the carry bits from the top 16 bits into the lower - * 16 bits. - */ - while (nleft > 1) { - sum += *w++; - nleft -= 2; - } - if (nleft == 1) - sum += htons(*(u_char *)w<<8); - - /* - * add back carry outs from top 16 bits to low 16 bits - */ - sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ - sum += (sum >> 16); /* add carry */ - answer = ~sum; /* truncate to 16 bits */ - return (answer); -} - -/* - * Given the host-byte-order value of the checksum field in a packet - * header, and the network-byte-order computed checksum of the data - * that the checksum covers (including the checksum itself), compute - * what the checksum field *should* have been. - */ -u_int16_t -in_cksum_shouldbe(u_int16_t sum, u_int16_t computed_sum) -{ - u_int32_t shouldbe; - - /* - * The value that should have gone into the checksum field - * is the negative of the value gotten by summing up everything - * *but* the checksum field. - * - * We can compute that by subtracting the value of the checksum - * field from the sum of all the data in the packet, and then - * computing the negative of that value. - * - * "sum" is the value of the checksum field, and "computed_sum" - * is the negative of the sum of all the data in the packets, - * so that's -(-computed_sum - sum), or (sum + computed_sum). - * - * All the arithmetic in question is one's complement, so the - * addition must include an end-around carry; we do this by - * doing the arithmetic in 32 bits (with no sign-extension), - * and then adding the upper 16 bits of the sum, which contain - * the carry, to the lower 16 bits of the sum, and then do it - * again in case *that* sum produced a carry. - * - * As RFC 1071 notes, the checksum can be computed without - * byte-swapping the 16-bit words; summing 16-bit words - * on a big-endian machine gives a big-endian checksum, which - * can be directly stuffed into the big-endian checksum fields - * in protocol headers, and summing words on a little-endian - * machine gives a little-endian checksum, which must be - * byte-swapped before being stuffed into a big-endian checksum - * field. - * - * "computed_sum" is a network-byte-order value, so we must put - * it in host byte order before subtracting it from the - * host-byte-order value from the header; the adjusted checksum - * will be in host byte order, which is what we'll return. - */ - shouldbe = sum; - shouldbe += ntohs(computed_sum); - shouldbe = (shouldbe & 0xFFFF) + (shouldbe >> 16); - shouldbe = (shouldbe & 0xFFFF) + (shouldbe >> 16); - return shouldbe; -} - #define IP_RES 0x8000 static struct tok ip_frag_values[] = { @@ -378,6 +325,7 @@ ip_print_demux(netdissect_options *ndo, struct ip_print_demux_state *ipds) { struct protoent *proto; + struct cksum_vec vec[1]; again: switch (ipds->nh) { @@ -482,7 +430,7 @@ again: case IPPROTO_IPV4: /* DVMRP multicast tunnel (ip-in-ip encapsulation) */ - ip_print(gndo, ipds->cp, ipds->len); + ip_print(ndo, ipds->cp, ipds->len); if (! vflag) { ND_PRINT((ndo, " (ipip-proto-4)")); return; @@ -492,7 +440,7 @@ again: #ifdef INET6 case IPPROTO_IPV6: /* ip6-in-ip encapsulation */ - ip6_print(ipds->cp, ipds->len); + ip6_print(ndo, ipds->cp, ipds->len); break; #endif /*INET6*/ @@ -510,12 +458,25 @@ again: break; case IPPROTO_PIM: - pim_print(ipds->cp, ipds->len, - in_cksum((const u_short*)ipds->cp, ipds->len, 0)); + vec[0].ptr = ipds->cp; + vec[0].len = ipds->len; + pim_print(ipds->cp, ipds->len, in_cksum(vec, 1)); break; case IPPROTO_VRRP: - vrrp_print(ipds->cp, ipds->len, ipds->ip->ip_ttl); + if (packettype == PT_CARP) { + if (vflag) + (void)printf("carp %s > %s: ", + ipaddr_string(&ipds->ip->ip_src), + ipaddr_string(&ipds->ip->ip_dst)); + carp_print(ipds->cp, ipds->len, ipds->ip->ip_ttl); + } else { + if (vflag) + (void)printf("vrrp %s > %s: ", + ipaddr_string(&ipds->ip->ip_src), + ipaddr_string(&ipds->ip->ip_dst)); + vrrp_print(ipds->cp, ipds->len, ipds->ip->ip_ttl); + } break; case IPPROTO_PGM: @@ -563,6 +524,7 @@ ip_print(netdissect_options *ndo, struct ip_print_demux_state *ipds=&ipd; const u_char *ipend; u_int hlen; + struct cksum_vec vec[1]; u_int16_t sum, ip_sum; struct protoent *proto; @@ -575,7 +537,7 @@ ip_print(netdissect_options *ndo, else if (!eflag) printf("IP "); - if ((u_char *)(ipds->ip + 1) > snapend) { + if ((u_char *)(ipds->ip + 1) > ndo->ndo_snapend) { printf("[|ip]"); return; } @@ -613,8 +575,8 @@ ip_print(netdissect_options *ndo, * Cut off the snapshot length to the end of the IP payload. */ ipend = bp + ipds->len; - if (ipend < snapend) - snapend = ipend; + if (ipend < ndo->ndo_snapend) + ndo->ndo_snapend = ipend; ipds->len -= hlen; @@ -660,8 +622,10 @@ ip_print(netdissect_options *ndo, printf(")"); } - if (!Kflag && (u_char *)ipds->ip + hlen <= snapend) { - sum = in_cksum((const u_short *)ipds->ip, hlen, 0); + if (!Kflag && (u_char *)ipds->ip + hlen <= ndo->ndo_snapend) { + vec[0].ptr = (const u_int8_t *)(void *)ipds->ip; + vec[0].len = hlen; + sum = in_cksum(vec, 1); if (sum != 0) { ip_sum = EXTRACT_16BITS(&ipds->ip->ip_sum); (void)printf(", bad cksum %x (->%x)!", ip_sum, @@ -724,7 +688,7 @@ ipN_print(register const u_char *bp, register u_int length) return; #ifdef INET6 case 6: - ip6_print (bp, length); + ip6_print (gndo, bp, length); return; #endif default: diff --git a/contrib/tcpdump/print-ip6.c b/contrib/tcpdump/print-ip6.c index 659fdadff10..b9039708085 100644 --- a/contrib/tcpdump/print-ip6.c +++ b/contrib/tcpdump/print-ip6.c @@ -50,32 +50,38 @@ static const char rcsid[] _U_ = * Compute a V6-style checksum by building a pseudoheader. */ int -nextproto6_cksum(const struct ip6_hdr *ip6, const u_short *data, +nextproto6_cksum(const struct ip6_hdr *ip6, const u_int8_t *data, u_int len, u_int next_proto) { - size_t i; - u_int32_t sum = 0; - union ip6_pseudo_hdr phu; + struct { + struct in6_addr ph_src; + struct in6_addr ph_dst; + u_int32_t ph_len; + u_int8_t ph_zero[3]; + u_int8_t ph_nxt; + } ph; + struct cksum_vec vec[2]; /* pseudo-header */ - memset(&phu, 0, sizeof(phu)); - phu.ph.ph_src = ip6->ip6_src; - phu.ph.ph_dst = ip6->ip6_dst; - phu.ph.ph_len = htonl(len); - phu.ph.ph_nxt = next_proto; + memset(&ph, 0, sizeof(ph)); + ph.ph_src = ip6->ip6_src; + ph.ph_dst = ip6->ip6_dst; + ph.ph_len = htonl(len); + ph.ph_nxt = next_proto; - for (i = 0; i < sizeof(phu.pa) / sizeof(phu.pa[0]); i++) { - sum += phu.pa[i]; - } + vec[0].ptr = (const u_int8_t *)(void *)&ph; + vec[0].len = sizeof(ph); + vec[1].ptr = data; + vec[1].len = len; - return in_cksum(data, len, sum); + return in_cksum(vec, 2); } /* * print an IP6 datagram. */ void -ip6_print(register const u_char *bp, register u_int length) +ip6_print(netdissect_options *ndo, const u_char *bp, u_int length) { register const struct ip6_hdr *ip6; register int advance; @@ -91,62 +97,62 @@ ip6_print(register const u_char *bp, register u_int length) TCHECK(*ip6); if (length < sizeof (struct ip6_hdr)) { - (void)printf("truncated-ip6 %u", length); + (void)ND_PRINT((ndo, "truncated-ip6 %u", length)); return; } - if (!eflag) - printf("IP6 "); + if (!ndo->ndo_eflag) + ND_PRINT((ndo, "IP6 ")); payload_len = EXTRACT_16BITS(&ip6->ip6_plen); len = payload_len + sizeof(struct ip6_hdr); if (length < len) - (void)printf("truncated-ip6 - %u bytes missing!", - len - length); + (void)ND_PRINT((ndo, "truncated-ip6 - %u bytes missing!", + len - length)); - if (vflag) { + if (ndo->ndo_vflag) { flow = EXTRACT_32BITS(&ip6->ip6_flow); - printf("("); + ND_PRINT((ndo, "(")); #if 0 /* rfc1883 */ if (flow & 0x0f000000) - (void)printf("pri 0x%02x, ", (flow & 0x0f000000) >> 24); + (void)ND_PRINT((ndo, "pri 0x%02x, ", (flow & 0x0f000000) >> 24)); if (flow & 0x00ffffff) - (void)printf("flowlabel 0x%06x, ", flow & 0x00ffffff); + (void)ND_PRINT((ndo, "flowlabel 0x%06x, ", flow & 0x00ffffff)); #else /* RFC 2460 */ if (flow & 0x0ff00000) - (void)printf("class 0x%02x, ", (flow & 0x0ff00000) >> 20); + (void)ND_PRINT((ndo, "class 0x%02x, ", (flow & 0x0ff00000) >> 20)); if (flow & 0x000fffff) - (void)printf("flowlabel 0x%05x, ", flow & 0x000fffff); + (void)ND_PRINT((ndo, "flowlabel 0x%05x, ", flow & 0x000fffff)); #endif - (void)printf("hlim %u, next-header %s (%u) payload length: %u) ", + (void)ND_PRINT((ndo, "hlim %u, next-header %s (%u) payload length: %u) ", ip6->ip6_hlim, tok2str(ipproto_values,"unknown",ip6->ip6_nxt), ip6->ip6_nxt, - payload_len); + payload_len)); } /* * Cut off the snapshot length to the end of the IP payload. */ ipend = bp + len; - if (ipend < snapend) - snapend = ipend; + if (ipend < ndo->ndo_snapend) + ndo->ndo_snapend = ipend; cp = (const u_char *)ip6; advance = sizeof(struct ip6_hdr); nh = ip6->ip6_nxt; - while (cp < snapend && advance > 0) { + while (cp < ndo->ndo_snapend && advance > 0) { cp += advance; len -= advance; if (cp == (const u_char *)(ip6 + 1) && nh != IPPROTO_TCP && nh != IPPROTO_UDP && nh != IPPROTO_DCCP && nh != IPPROTO_SCTP) { - (void)printf("%s > %s: ", ip6addr_string(&ip6->ip6_src), - ip6addr_string(&ip6->ip6_dst)); + (void)ND_PRINT((ndo, "%s > %s: ", ip6addr_string(&ip6->ip6_src), + ip6addr_string(&ip6->ip6_dst))); } switch (nh) { @@ -160,7 +166,7 @@ ip6_print(register const u_char *bp, register u_int length) break; case IPPROTO_FRAGMENT: advance = frag6_print(cp, (const u_char *)ip6); - if (snapend <= cp + advance) + if (ndo->ndo_snapend <= cp + advance) return; nh = *cp; fragmented = 1; @@ -198,7 +204,7 @@ ip6_print(register const u_char *bp, register u_int length) udp_print(cp, len, (const u_char *)ip6, fragmented); return; case IPPROTO_ICMPV6: - icmp6_print(gndo, cp, len, (const u_char *)ip6, fragmented); + icmp6_print(ndo, cp, len, (const u_char *)ip6, fragmented); return; case IPPROTO_AH: advance = ah_print(cp); @@ -207,7 +213,7 @@ ip6_print(register const u_char *bp, register u_int length) case IPPROTO_ESP: { int enh, padlen; - advance = esp_print(gndo, cp, len, (const u_char *)ip6, &enh, &padlen); + advance = esp_print(ndo, cp, len, (const u_char *)ip6, &enh, &padlen); nh = enh & 0xff; len -= padlen; break; @@ -221,7 +227,7 @@ ip6_print(register const u_char *bp, register u_int length) } case IPPROTO_PIM: - pim_print(cp, len, nextproto6_cksum(ip6, (u_short *)cp, len, + pim_print(cp, len, nextproto6_cksum(ip6, cp, len, IPPROTO_PIM)); return; @@ -230,11 +236,11 @@ ip6_print(register const u_char *bp, register u_int length) return; case IPPROTO_IPV6: - ip6_print(cp, len); + ip6_print(ndo, cp, len); return; case IPPROTO_IPV4: - ip_print(gndo, cp, len); + ip_print(ndo, cp, len); return; case IPPROTO_PGM: @@ -250,18 +256,18 @@ ip6_print(register const u_char *bp, register u_int length) return; case IPPROTO_NONE: - (void)printf("no next header"); + (void)ND_PRINT((ndo, "no next header")); return; default: - (void)printf("ip-proto-%d %d", nh, len); + (void)ND_PRINT((ndo, "ip-proto-%d %d", nh, len)); return; } } return; trunc: - (void)printf("[|ip6]"); + (void)ND_PRINT((ndo, "[|ip6]")); } #endif /* INET6 */ diff --git a/contrib/tcpdump/print-ipnet.c b/contrib/tcpdump/print-ipnet.c index 957bd4f5234..187f939d3f8 100644 --- a/contrib/tcpdump/print-ipnet.c +++ b/contrib/tcpdump/print-ipnet.c @@ -69,7 +69,7 @@ ipnet_print(struct netdissect_options *ndo, const u_char *p, u_int length, u_int #ifdef INET6 case IPH_AF_INET6: - ip6_print(p, length); + ip6_print(ndo, p, length); break; #endif /*INET6*/ diff --git a/contrib/tcpdump/print-ipx.c b/contrib/tcpdump/print-ipx.c index 8184425efa3..f067755d80e 100644 --- a/contrib/tcpdump/print-ipx.c +++ b/contrib/tcpdump/print-ipx.c @@ -198,7 +198,7 @@ ipx_rip_print(const u_short *ipx, u_int length) (void)printf("ipx-rip-req"); if (length > 0) { TCHECK(ipx[3]); - (void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]), + (void)printf(" %08x/%d.%d", EXTRACT_32BITS(&ipx[0]), EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3])); } break; @@ -206,7 +206,7 @@ ipx_rip_print(const u_short *ipx, u_int length) (void)printf("ipx-rip-resp"); for (i = 0; i < 50 && length > 0; i++) { TCHECK(ipx[3]); - (void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]), + (void)printf(" %08x/%d.%d", EXTRACT_32BITS(&ipx[0]), EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3])); ipx += 4; diff --git a/contrib/tcpdump/print-isoclns.c b/contrib/tcpdump/print-isoclns.c index a4af8adfd36..00fce7ef59a 100644 --- a/contrib/tcpdump/print-isoclns.c +++ b/contrib/tcpdump/print-isoclns.c @@ -395,12 +395,14 @@ static struct tok isis_subtlv_link_attribute_values[] = { }; #define ISIS_SUBTLV_AUTH_SIMPLE 1 +#define ISIS_SUBTLV_AUTH_GENERIC 3 /* rfc 5310 */ #define ISIS_SUBTLV_AUTH_MD5 54 #define ISIS_SUBTLV_AUTH_MD5_LEN 16 #define ISIS_SUBTLV_AUTH_PRIVATE 255 static struct tok isis_subtlv_auth_values[] = { { ISIS_SUBTLV_AUTH_SIMPLE, "simple text password"}, + { ISIS_SUBTLV_AUTH_GENERIC, "Generic Crypto key-id"}, { ISIS_SUBTLV_AUTH_MD5, "HMAC-MD5 password"}, { ISIS_SUBTLV_AUTH_PRIVATE, "Routing Domain private password"}, { 0, NULL } @@ -441,8 +443,8 @@ static struct tok clnp_flag_values[] = { #define ISIS_MASK_MTFLAGS(x) ((x)&0xf000) static struct tok isis_mt_flag_values[] = { - { 0x4000, "sub-TLVs present"}, - { 0x8000, "ATT bit set"}, + { 0x4000, "ATT bit set"}, + { 0x8000, "Overload bit set"}, { 0, NULL} }; @@ -618,10 +620,6 @@ struct isis_tlv_lsp { void isoclns_print(const u_int8_t *p, u_int length, u_int caplen) { - const struct isis_common_header *header; - - header = (const struct isis_common_header *)p; - if (caplen <= 1) { /* enough bytes on the wire ? */ printf("|OSI"); return; @@ -664,7 +662,7 @@ void isoclns_print(const u_int8_t *p, u_int length, u_int caplen) #ifdef INET6 case NLPID_IP6: - ip6_print(p+1, length-1); + ip6_print(gndo, p+1, length-1); break; #endif @@ -1179,15 +1177,15 @@ esis_print(const u_int8_t *pptr, u_int length) } /* now walk the options */ - while (li >= 2) { + while (li != 0) { u_int op, opli; const u_int8_t *tptr; - TCHECK2(*pptr, 2); if (li < 2) { printf(", bad opts/li"); return; } + TCHECK2(*pptr, 2); op = *pptr++; opli = *pptr++; li -= 2; @@ -1206,8 +1204,11 @@ esis_print(const u_int8_t *pptr, u_int length) switch (op) { case ESIS_OPTION_ES_CONF_TIME: - TCHECK2(*pptr, 2); - printf("%us", EXTRACT_16BITS(tptr)); + if (opli == 2) { + TCHECK2(*pptr, 2); + printf("%us", EXTRACT_16BITS(tptr)); + } else + printf("(bad length)"); break; case ESIS_OPTION_PROTOCOLS: @@ -1779,7 +1780,7 @@ static int isis_print (const u_int8_t *p, u_int length) u_int8_t pdu_type, max_area, id_length, tlv_type, tlv_len, tmp, alen, lan_alen, prefix_len; u_int8_t ext_is_len, ext_ip_len, mt_len; const u_int8_t *optr, *pptr, *tptr; - u_short packet_len,pdu_len; + u_short packet_len,pdu_len, key_id; u_int i,vendor_id; int sigcheck; @@ -2378,6 +2379,15 @@ static int isis_print (const u_int8_t *p, u_int length) printf(" (%s)", tok2str(signature_check_values, "Unknown", sigcheck)); break; + case ISIS_SUBTLV_AUTH_GENERIC: + key_id = EXTRACT_16BITS((tptr+1)); + printf("%u, password: ", key_id); + for(i=1 + sizeof(u_int16_t);i + * DCBX extensions by Kaladhar Musunuru */ #ifndef lint @@ -541,6 +542,23 @@ static const struct tok lldp_aggregation_values[] = { { 0, NULL} }; +/* + * DCBX protocol subtypes. + */ +#define LLDP_DCBX_SUBTYPE_1 1 +#define LLDP_DCBX_SUBTYPE_2 2 + +static const struct tok lldp_dcbx_subtype_values[] = { + { LLDP_DCBX_SUBTYPE_1, "DCB Capability Exchange Protocol Rev 1" }, + { LLDP_DCBX_SUBTYPE_2, "DCB Capability Exchange Protocol Rev 1.01" }, + { 0, NULL} +}; + +#define LLDP_DCBX_CONTROL_TLV 1 +#define LLDP_DCBX_PRIORITY_GROUPS_TLV 2 +#define LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV 3 +#define LLDP_DCBX_APPLICATION_TLV 4 + /* * Interface numbering subtypes. */ @@ -556,13 +574,17 @@ static const struct tok lldp_intf_numb_subtype_values[] = { #define LLDP_INTF_NUM_LEN 5 /* - * Print IEEE private extensions. (802.1 annex F) + * Print IEEE 802.1 private extensions. (802.1AB annex E) */ static int -lldp_private_8021_print(const u_char *tptr) +lldp_private_8021_print(const u_char *tptr, u_int tlv_len) { int subtype, hexdump = FALSE; + u_int sublen; + if (tlv_len < 4) { + return hexdump; + } subtype = *(tptr+3); printf("\n\t %s Subtype (%u)", @@ -571,24 +593,47 @@ lldp_private_8021_print(const u_char *tptr) switch (subtype) { case LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID: + if (tlv_len < 6) { + return hexdump; + } printf("\n\t port vlan id (PVID): %u", EXTRACT_16BITS(tptr+4)); break; case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID: + if (tlv_len < 7) { + return hexdump; + } printf("\n\t port and protocol vlan id (PPVID): %u, flags [%s] (0x%02x)", EXTRACT_16BITS(tptr+5), bittok2str(lldp_8021_port_protocol_id_values, "none", *(tptr+4)), *(tptr+4)); break; case LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME: + if (tlv_len < 6) { + return hexdump; + } printf("\n\t vlan id (VID): %u", EXTRACT_16BITS(tptr+4)); + if (tlv_len < 7) { + return hexdump; + } + sublen = *(tptr+6); + if (tlv_len < 7+sublen) { + return hexdump; + } printf("\n\t vlan name: "); - safeputs((const char *)tptr+7, *(tptr+6)); + safeputs((const char *)tptr+7, sublen); break; case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY: + if (tlv_len < 5) { + return hexdump; + } + sublen = *(tptr+4); + if (tlv_len < 5+sublen) { + return hexdump; + } printf("\n\t protocol identity: "); - safeputs((const char *)tptr+5, *(tptr+4)); + safeputs((const char *)tptr+5, sublen); break; default: @@ -600,13 +645,16 @@ lldp_private_8021_print(const u_char *tptr) } /* - * Print IEEE private extensions. (802.3) + * Print IEEE 802.3 private extensions. (802.3bc) */ static int -lldp_private_8023_print(const u_char *tptr) +lldp_private_8023_print(const u_char *tptr, u_int tlv_len) { int subtype, hexdump = FALSE; + if (tlv_len < 4) { + return hexdump; + } subtype = *(tptr+3); printf("\n\t %s Subtype (%u)", @@ -615,6 +663,9 @@ lldp_private_8023_print(const u_char *tptr) switch (subtype) { case LLDP_PRIVATE_8023_SUBTYPE_MACPHY: + if (tlv_len < 9) { + return hexdump; + } printf("\n\t autonegotiation [%s] (0x%02x)", bittok2str(lldp_8023_autonegotiation_values, "none", *(tptr+4)), *(tptr+4)); @@ -627,6 +678,9 @@ lldp_private_8023_print(const u_char *tptr) break; case LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER: + if (tlv_len < 7) { + return hexdump; + } printf("\n\t MDI power support [%s], power pair %s, power class %s", bittok2str(lldp_mdi_values, "none", *(tptr+4)), tok2str(lldp_mdi_power_pairs_values, "unknown", *(tptr+5)), @@ -634,6 +688,9 @@ lldp_private_8023_print(const u_char *tptr) break; case LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR: + if (tlv_len < 9) { + return hexdump; + } printf("\n\t aggregation status [%s], aggregation port ID %u", bittok2str(lldp_aggregation_values, "none", *(tptr+4)), EXTRACT_32BITS(tptr+5)); @@ -674,8 +731,12 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len) int subtype, hexdump = FALSE; u_int8_t location_format; u_int16_t power_val; - u_int8_t lci_len, ca_type, ca_len; + u_int lci_len; + u_int8_t ca_type, ca_len; + if (tlv_len < 4) { + return hexdump; + } subtype = *(tptr+3); printf("\n\t %s Subtype (%u)", @@ -684,6 +745,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len) switch (subtype) { case LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES: + if (tlv_len < 7) { + return hexdump; + } printf("\n\t Media capabilities [%s] (0x%04x)", bittok2str(lldp_tia_capabilities_values, "none", EXTRACT_16BITS(tptr+4)), EXTRACT_16BITS(tptr+4)); @@ -693,6 +757,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len) break; case LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY: + if (tlv_len < 8) { + return hexdump; + } printf("\n\t Application type [%s] (0x%02x)", tok2str(lldp_tia_application_type_values, "none", *(tptr+4)), *(tptr+4)); @@ -707,6 +774,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len) break; case LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID: + if (tlv_len < 5) { + return hexdump; + } location_format = *(tptr+4); printf("\n\t Location data format %s (0x%02x)", tok2str(lldp_tia_location_data_format_values, "unknown", location_format), @@ -714,6 +784,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len) switch (location_format) { case LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED: + if (tlv_len < 21) { + return hexdump; + } printf("\n\t Latitude resolution %u, latitude value %" PRIu64, (*(tptr+5)>>2), lldp_extract_latlon(tptr+5)); printf("\n\t Longitude resolution %u, longitude value %" PRIu64, @@ -730,7 +803,16 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len) break; case LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS: + if (tlv_len < 6) { + return hexdump; + } lci_len = *(tptr+5); + if (lci_len < 3) { + return hexdump; + } + if (tlv_len < 7+lci_len) { + return hexdump; + } printf("\n\t LCI length %u, LCI what %s (0x%02x), Country-code ", lci_len, tok2str(lldp_tia_location_lci_what_values, "unknown", *(tptr+6)), @@ -744,6 +826,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len) /* Decode each civic address element */ while (lci_len > 0) { + if (lci_len < 2) { + return hexdump; + } ca_type = *(tptr); ca_len = *(tptr+1); @@ -758,6 +843,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len) if ( ca_type == 0 || ca_len == 0) { return hexdump; } + if (lci_len < ca_len) { + return hexdump; + } safeputs((const char *)tptr, ca_len); tptr += ca_len; @@ -777,6 +865,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len) break; case LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI: + if (tlv_len < 7) { + return hexdump; + } printf("\n\t Power type [%s]", (*(tptr+4)&0xC0>>6) ? "PD device" : "PSE device"); printf(", Power source [%s]", @@ -812,24 +903,196 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len) return hexdump; } +/* + * Print DCBX Protocol fields (V 1.01). + */ +static int +lldp_private_dcbx_print(const u_char *pptr, u_int len) +{ + int subtype, hexdump = FALSE; + u_int8_t tval; + u_int16_t tlv; + u_int32_t i, pgval, uval; + u_int tlen, tlv_type, tlv_len; + const u_char *tptr, *mptr; + + if (len < 4) { + return hexdump; + } + subtype = *(pptr+3); + + printf("\n\t %s Subtype (%u)", + tok2str(lldp_dcbx_subtype_values, "unknown", subtype), + subtype); + + /* by passing old version */ + if (subtype == LLDP_DCBX_SUBTYPE_1) + return TRUE; + + tptr = pptr + 4; + tlen = len - 4; + + while (tlen >= sizeof(tlv)) { + + TCHECK2(*tptr, sizeof(tlv)); + + tlv = EXTRACT_16BITS(tptr); + + tlv_type = LLDP_EXTRACT_TYPE(tlv); + tlv_len = LLDP_EXTRACT_LEN(tlv); + hexdump = FALSE; + + tlen -= sizeof(tlv); + tptr += sizeof(tlv); + + /* loop check */ + if (!tlv_type || !tlv_len) { + break; + } + + TCHECK2(*tptr, tlv_len); + if (tlen < tlv_len) { + goto trunc; + } + + /* decode every tlv */ + switch (tlv_type) { + case LLDP_DCBX_CONTROL_TLV: + if (tlv_len < 10) { + goto trunc; + } + printf("\n\t Control - Protocol Control (type 0x%x, length %d)", + LLDP_DCBX_CONTROL_TLV, tlv_len); + printf("\n\t Oper_Version: %d", *tptr); + printf("\n\t Max_Version: %d", *(tptr+1)); + printf("\n\t Sequence Number: %d", EXTRACT_32BITS(tptr+2)); + printf("\n\t Acknowledgement Number: %d", + EXTRACT_32BITS(tptr+6)); + break; + case LLDP_DCBX_PRIORITY_GROUPS_TLV: + if (tlv_len < 17) { + goto trunc; + } + printf("\n\t Feature - Priority Group (type 0x%x, length %d)", + LLDP_DCBX_PRIORITY_GROUPS_TLV, tlv_len); + printf("\n\t Oper_Version: %d", *tptr); + printf("\n\t Max_Version: %d", *(tptr+1)); + printf("\n\t Info block(0x%02X): ", *(tptr+2)); + tval = *(tptr+2); + printf("Enable bit: %d, Willing bit: %d, Error Bit: %d", + (tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0, + (tval & 0x20) ? 1 : 0); + printf("\n\t SubType: %d", *(tptr+3)); + printf("\n\t Priority Allocation"); + + pgval = EXTRACT_32BITS(tptr+4); + for (i = 0; i <= 7; i++) { + tval = *(tptr+4+(i/2)); + printf("\n\t PgId_%d: %d", + i, (pgval >> (28-4*i)) & 0xF); + } + printf("\n\t Priority Group Allocation"); + for (i = 0; i <= 7; i++) + printf("\n\t Pg percentage[%d]: %d", i, *(tptr+8+i)); + printf("\n\t NumTCsSupported: %d", *(tptr+8+8)); + break; + case LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV: + if (tlv_len < 6) { + goto trunc; + } + printf("\n\t Feature - Priority Flow Control"); + printf(" (type 0x%x, length %d)", + LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV, tlv_len); + printf("\n\t Oper_Version: %d", *tptr); + printf("\n\t Max_Version: %d", *(tptr+1)); + printf("\n\t Info block(0x%02X): ", *(tptr+2)); + tval = *(tptr+2); + printf("Enable bit: %d, Willing bit: %d, Error Bit: %d", + (tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0, + (tval & 0x20) ? 1 : 0); + printf("\n\t SubType: %d", *(tptr+3)); + tval = *(tptr+4); + printf("\n\t PFC Config (0x%02X)", *(tptr+4)); + for (i = 0; i <= 7; i++) + printf("\n\t Priority Bit %d: %s", + i, (tval & (1 << i)) ? "Enabled" : "Disabled"); + printf("\n\t NumTCPFCSupported: %d", *(tptr+5)); + break; + case LLDP_DCBX_APPLICATION_TLV: + if (tlv_len < 4) { + goto trunc; + } + printf("\n\t Feature - Application (type 0x%x, length %d)", + LLDP_DCBX_APPLICATION_TLV, tlv_len); + printf("\n\t Oper_Version: %d", *tptr); + printf("\n\t Max_Version: %d", *(tptr+1)); + printf("\n\t Info block(0x%02X): ", *(tptr+2)); + tval = *(tptr+2); + printf("Enable bit: %d, Willing bit: %d, Error Bit: %d", + (tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0, + (tval & 0x20) ? 1 : 0); + printf("\n\t SubType: %d", *(tptr+3)); + tval = tlv_len - 4; + mptr = tptr + 4; + while (tval >= 6) { + printf("\n\t Application Value"); + printf("\n\t Application Protocol ID: 0x%04x", + EXTRACT_16BITS(mptr)); + uval = EXTRACT_24BITS(mptr+2); + printf("\n\t SF (0x%x) Application Protocol ID is %s", + (uval >> 22), + (uval >> 22) ? "Socket Number" : "L2 EtherType"); + printf("\n\t OUI: 0x%06x", uval & 0x3fffff); + printf("\n\t User Priority Map: 0x%02x", *(mptr+5)); + tval = tval - 6; + mptr = mptr + 6; + } + break; + default: + hexdump = TRUE; + break; + } + + /* do we also want to see a hex dump ? */ + if (vflag > 1 || (vflag && hexdump)) { + print_unknown_data(tptr,"\n\t ", tlv_len); + } + + tlen -= tlv_len; + tptr += tlv_len; + } + + trunc: + return hexdump; +} + static char * -lldp_network_addr_print(const u_char *tptr) { +lldp_network_addr_print(const u_char *tptr, u_int len) { u_int8_t af; static char buf[BUFSIZE]; const char * (*pfunc)(const u_char *); + if (len < 1) + return NULL; + len--; af = *tptr; switch (af) { case AFNUM_INET: + if (len < 4) + return NULL; pfunc = getname; break; #ifdef INET6 case AFNUM_INET6: + if (len < 16) + return NULL; pfunc = getname6; break; #endif case AFNUM_802: + if (len < 6) + return NULL; pfunc = etheraddr_string; break; default: @@ -854,10 +1117,14 @@ lldp_mgmt_addr_tlv_print(const u_char *pptr, u_int len) { u_int8_t mgmt_addr_len, intf_num_subtype, oid_len; const u_char *tptr; u_int tlen; + char *mgmt_addr; tlen = len; tptr = pptr; + if (tlen < 1) { + return 0; + } mgmt_addr_len = *tptr++; tlen--; @@ -865,9 +1132,12 @@ lldp_mgmt_addr_tlv_print(const u_char *pptr, u_int len) { return 0; } + mgmt_addr = lldp_network_addr_print(tptr, mgmt_addr_len); + if (mgmt_addr == NULL) { + return 0; + } printf("\n\t Management Address length %u, %s", - mgmt_addr_len, - lldp_network_addr_print(tptr)); + mgmt_addr_len, mgmt_addr); tptr += mgmt_addr_len; tlen -= mgmt_addr_len; @@ -890,6 +1160,9 @@ lldp_mgmt_addr_tlv_print(const u_char *pptr, u_int len) { if (tlen) { oid_len = *tptr; + if (tlen < oid_len) { + return 0; + } if (oid_len) { printf("\n\t OID length %u", oid_len); safeputs((const char *)tptr+1, oid_len); @@ -906,6 +1179,7 @@ lldp_print(register const u_char *pptr, register u_int len) { u_int16_t tlv, cap, ena_cap; u_int oui, tlen, hexdump, tlv_type, tlv_len; const u_char *tptr; + char *network_addr; tptr = pptr; tlen = len; @@ -939,16 +1213,111 @@ lldp_print(register const u_char *pptr, register u_int len) { } TCHECK2(*tptr, tlv_len); + if (tlen < tlv_len) { + goto trunc; + } switch (tlv_type) { + + case LLDP_CHASSIS_ID_TLV: + if (vflag) { + if (tlv_len < 2) { + goto trunc; + } + subtype = *tptr; + printf("\n\t Subtype %s (%u): ", + tok2str(lldp_chassis_subtype_values, "Unknown", subtype), + subtype); + + switch (subtype) { + case LLDP_CHASSIS_MAC_ADDR_SUBTYPE: + if (tlv_len < 1+6) { + goto trunc; + } + printf("%s", etheraddr_string(tptr+1)); + break; + + case LLDP_CHASSIS_INTF_NAME_SUBTYPE: /* fall through */ + case LLDP_CHASSIS_LOCAL_SUBTYPE: + case LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE: + case LLDP_CHASSIS_INTF_ALIAS_SUBTYPE: + case LLDP_CHASSIS_PORT_COMP_SUBTYPE: + safeputs((const char *)tptr+1, tlv_len-1); + break; + + case LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE: + network_addr = lldp_network_addr_print(tptr+1, tlv_len-1); + if (network_addr == NULL) { + goto trunc; + } + printf("%s", network_addr); + break; + + default: + hexdump = TRUE; + break; + } + } + break; + + case LLDP_PORT_ID_TLV: + if (vflag) { + if (tlv_len < 2) { + goto trunc; + } + subtype = *tptr; + printf("\n\t Subtype %s (%u): ", + tok2str(lldp_port_subtype_values, "Unknown", subtype), + subtype); + + switch (subtype) { + case LLDP_PORT_MAC_ADDR_SUBTYPE: + if (tlv_len < 1+6) { + goto trunc; + } + printf("%s", etheraddr_string(tptr+1)); + break; + + case LLDP_PORT_INTF_NAME_SUBTYPE: /* fall through */ + case LLDP_PORT_LOCAL_SUBTYPE: + case LLDP_PORT_AGENT_CIRC_ID_SUBTYPE: + case LLDP_PORT_INTF_ALIAS_SUBTYPE: + case LLDP_PORT_PORT_COMP_SUBTYPE: + safeputs((const char *)tptr+1, tlv_len-1); + break; + + case LLDP_PORT_NETWORK_ADDR_SUBTYPE: + network_addr = lldp_network_addr_print(tptr+1, tlv_len-1); + if (network_addr == NULL) { + goto trunc; + } + printf("%s", network_addr); + break; + + default: + hexdump = TRUE; + break; + } + } + break; + case LLDP_TTL_TLV: if (vflag) { + if (tlv_len < 2) { + goto trunc; + } printf(": TTL %us", EXTRACT_16BITS(tptr)); } break; - case LLDP_SYSTEM_NAME_TLV: + case LLDP_PORT_DESCR_TLV: + if (vflag) { + printf(": "); + safeputs((const char *)tptr, tlv_len); + } + break; + case LLDP_SYSTEM_NAME_TLV: /* * The system name is also print in non-verbose mode * similar to the CDP printer. @@ -963,13 +1332,6 @@ lldp_print(register const u_char *pptr, register u_int len) { } break; - case LLDP_PORT_DESCR_TLV: - if (vflag) { - printf(": "); - safeputs((const char *)tptr, tlv_len); - } - break; - case LLDP_SYSTEM_DESCR_TLV: if (vflag) { printf("\n\t "); @@ -977,93 +1339,17 @@ lldp_print(register const u_char *pptr, register u_int len) { } break; - - case LLDP_CHASSIS_ID_TLV: - if (vflag) { - subtype = *tptr; - printf("\n\t Subtype %s (%u): ", - tok2str(lldp_chassis_subtype_values, "Unknown", subtype), - subtype); - - switch (subtype) { - case LLDP_CHASSIS_MAC_ADDR_SUBTYPE: - printf("%s", etheraddr_string(tptr+1)); - break; - - case LLDP_CHASSIS_INTF_NAME_SUBTYPE: /* fall through */ - case LLDP_CHASSIS_LOCAL_SUBTYPE: - case LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE: - case LLDP_CHASSIS_INTF_ALIAS_SUBTYPE: - case LLDP_CHASSIS_PORT_COMP_SUBTYPE: - safeputs((const char *)tptr+1, tlv_len-1); - break; - - case LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE: - printf("%s", lldp_network_addr_print(tptr+1)); - break; - - default: - hexdump = TRUE; - break; - } - } - break; - - case LLDP_PORT_ID_TLV: - if (vflag) { - subtype = *tptr; - printf("\n\t Subtype %s (%u): ", - tok2str(lldp_port_subtype_values, "Unknown", subtype), - subtype); - - switch (subtype) { - case LLDP_PORT_MAC_ADDR_SUBTYPE: - printf("%s", etheraddr_string(tptr+1)); - break; - - case LLDP_PORT_INTF_NAME_SUBTYPE: /* fall through */ - case LLDP_PORT_LOCAL_SUBTYPE: - case LLDP_PORT_AGENT_CIRC_ID_SUBTYPE: - case LLDP_PORT_INTF_ALIAS_SUBTYPE: - case LLDP_PORT_PORT_COMP_SUBTYPE: - safeputs((const char *)tptr+1, tlv_len-1); - break; - - case LLDP_PORT_NETWORK_ADDR_SUBTYPE: - printf("%s", lldp_network_addr_print(tptr+1)); - break; - - default: - hexdump = TRUE; - break; - } - } - break; - - case LLDP_PRIVATE_TLV: - if (vflag) { - oui = EXTRACT_24BITS(tptr); - printf(": OUI %s (0x%06x)", tok2str(oui_values, "Unknown", oui), oui); - - switch (oui) { - case OUI_IEEE_8021_PRIVATE: - hexdump = lldp_private_8021_print(tptr); - break; - case OUI_IEEE_8023_PRIVATE: - hexdump = lldp_private_8023_print(tptr); - break; - case OUI_TIA: - hexdump = lldp_private_tia_print(tptr, tlv_len); - break; - default: - hexdump = TRUE; - break; - } - } - break; - case LLDP_SYSTEM_CAP_TLV: if (vflag) { + /* + * XXX - IEEE Std 802.1AB-2009 says the first octet + * if a chassis ID subtype, with the system + * capabilities and enabled capabilities following + * it. + */ + if (tlv_len < 4) { + goto trunc; + } cap = EXTRACT_16BITS(tptr); ena_cap = EXTRACT_16BITS(tptr+2); printf("\n\t System Capabilities [%s] (0x%04x)", @@ -1075,12 +1361,40 @@ lldp_print(register const u_char *pptr, register u_int len) { case LLDP_MGMT_ADDR_TLV: if (vflag) { - if (!lldp_mgmt_addr_tlv_print(tptr, tlen)) { + if (!lldp_mgmt_addr_tlv_print(tptr, tlv_len)) { goto trunc; } } break; + case LLDP_PRIVATE_TLV: + if (vflag) { + if (tlv_len < 3) { + goto trunc; + } + oui = EXTRACT_24BITS(tptr); + printf(": OUI %s (0x%06x)", tok2str(oui_values, "Unknown", oui), oui); + + switch (oui) { + case OUI_IEEE_8021_PRIVATE: + hexdump = lldp_private_8021_print(tptr, tlv_len); + break; + case OUI_IEEE_8023_PRIVATE: + hexdump = lldp_private_8023_print(tptr, tlv_len); + break; + case OUI_TIA: + hexdump = lldp_private_tia_print(tptr, tlv_len); + break; + case OUI_DCBX: + hexdump = lldp_private_dcbx_print(tptr, tlv_len); + break; + default: + hexdump = TRUE; + break; + } + } + break; + default: hexdump = TRUE; break; diff --git a/contrib/tcpdump/print-mobile.c b/contrib/tcpdump/print-mobile.c index 816ffd6e658..de4eab1dce3 100644 --- a/contrib/tcpdump/print-mobile.c +++ b/contrib/tcpdump/print-mobile.c @@ -72,6 +72,7 @@ mobile_print(const u_char *bp, u_int length) { const u_char *cp = bp +8 ; const struct mobile_ip *mob; + struct cksum_vec vec[1]; u_short proto,crc; u_char osp =0; /* old source address present */ @@ -101,7 +102,9 @@ mobile_print(const u_char *bp, u_int length) (void)printf("> %s ",ipaddr_string(&mob->odst)); (void)printf("(oproto=%d)",proto>>8); } - if (in_cksum((u_short *)mob, osp ? 12 : 8, 0)!=0) { + vec[0].ptr = (const u_int8_t *)(void *)mob; + vec[0].len = osp ? 12 : 8; + if (in_cksum(vec, 1)!=0) { (void)printf(" (bad checksum %d)",crc); } diff --git a/contrib/tcpdump/print-mpls.c b/contrib/tcpdump/print-mpls.c index c6b0814ffef..d97cce5278b 100644 --- a/contrib/tcpdump/print-mpls.c +++ b/contrib/tcpdump/print-mpls.c @@ -54,6 +54,13 @@ static const char *mpls_labelname[] = { /*15*/ "rsvd", }; +enum mpls_packet_type { + PT_UNKNOWN, + PT_IPV4, + PT_IPV6, + PT_OSI +}; + /* * RFC3032: MPLS label stack encoding */ @@ -62,7 +69,8 @@ mpls_print(const u_char *bp, u_int length) { const u_char *p; u_int32_t label_entry; - u_int16_t label_stack_depth = 0; + u_int16_t label_stack_depth = 0; + enum mpls_packet_type pt = PT_UNKNOWN; p = bp; printf("MPLS"); @@ -70,9 +78,9 @@ mpls_print(const u_char *bp, u_int length) TCHECK2(*p, sizeof(label_entry)); label_entry = EXTRACT_32BITS(p); printf("%s(label %u", - label_stack_depth ? "\n\t" : " ", - MPLS_LABEL(label_entry)); - label_stack_depth++; + (label_stack_depth && vflag) ? "\n\t" : " ", + MPLS_LABEL(label_entry)); + label_stack_depth++; if (vflag && MPLS_LABEL(label_entry) < sizeof(mpls_labelname) / sizeof(mpls_labelname[0])) printf(" (%s)", mpls_labelname[MPLS_LABEL(label_entry)]); @@ -84,98 +92,128 @@ mpls_print(const u_char *bp, u_int length) p += sizeof(label_entry); } while (!MPLS_STACK(label_entry)); + /* + * Try to figure out the packet type. + */ switch (MPLS_LABEL(label_entry)) { + case 0: /* IPv4 explicit NULL label */ - case 3: /* IPv4 implicit NULL label */ - if (vflag>0) { - printf("\n\t"); - ip_print(gndo, p, length - (p - bp)); - } - else printf(", IP, length: %u",length); + case 3: /* IPv4 implicit NULL label */ + pt = PT_IPV4; break; -#ifdef INET6 + case 2: /* IPv6 explicit NULL label */ - if (vflag>0) { - printf("\n\t"); - ip6_print(p, length - (p - bp)); - } - else printf(", IPv6, length: %u",length); + pt = PT_IPV6; break; -#endif + default: /* * Generally there's no indication of protocol in MPLS label - * encoding, however draft-hsmit-isis-aal5mux-00.txt describes - * a technique that looks at the first payload byte if the BOS (bottom of stack) - * bit is set and tries to determine the network layer protocol - * 0x45-0x4f is IPv4 - * 0x60-0x6f is IPv6 - * 0x81-0x83 is OSI (CLNP,ES-IS,IS-IS) - * this technique is sometimes known as NULL encapsulation - * and decoding is particularly useful for control-plane traffic [BGP] - * which cisco by default sends MPLS encapsulated + * encoding. + * + * However, draft-hsmit-isis-aal5mux-00.txt describes a + * technique for encapsulating IS-IS and IP traffic on the + * same ATM virtual circuit; you look at the first payload + * byte to determine the network layer protocol, based on + * the fact that + * + * 1) the first byte of an IP header is 0x45-0x4f + * for IPv4 and 0x60-0x6f for IPv6; + * + * 2) the first byte of an OSI CLNP packet is 0x81, + * the first byte of an OSI ES-IS packet is 0x82, + * and the first byte of an OSI IS-IS packet is + * 0x83; + * + * so the network layer protocol can be inferred from the + * first byte of the packet, if the protocol is one of the + * ones listed above. + * + * Cisco sends control-plane traffic MPLS-encapsulated in + * this fashion. */ + switch(*p) { - if (MPLS_STACK(label_entry)) { /* only do this if the stack bit is set */ - switch(*p) { - case 0x45: - case 0x46: - case 0x47: - case 0x48: - case 0x49: - case 0x4a: - case 0x4b: - case 0x4c: - case 0x4d: - case 0x4e: - case 0x4f: - if (vflag>0) { - printf("\n\t"); - ip_print(gndo, p, length - (p - bp)); - } - else printf(", IP, length: %u",length); - break; -#ifdef INET6 - case 0x60: - case 0x61: - case 0x62: - case 0x63: - case 0x64: - case 0x65: - case 0x66: - case 0x67: - case 0x68: - case 0x69: - case 0x6a: - case 0x6b: - case 0x6c: - case 0x6d: - case 0x6e: - case 0x6f: - if (vflag>0) { - printf("\n\t"); - ip6_print(p, length - (p - bp)); - } - else printf(", IPv6, length: %u",length); - break; -#endif - case 0x81: - case 0x82: - case 0x83: - if (vflag>0) { - printf("\n\t"); - isoclns_print(p, length - (p - bp), length - (p - bp)); - } - else printf(", OSI, length: %u",length); - break; - default: - /* ok bail out - we did not figure out what it is*/ - break; - } - } - return; + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + pt = PT_IPV4; + break; + + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6a: + case 0x6b: + case 0x6c: + case 0x6d: + case 0x6e: + case 0x6f: + pt = PT_IPV6; + break; + + case 0x81: + case 0x82: + case 0x83: + pt = PT_OSI; + break; + + default: + /* ok bail out - we did not figure out what it is*/ + break; + } } + /* + * Print the payload. + */ + if (pt == PT_UNKNOWN) { + if (!suppress_default_print) + default_print(p, length - (p - bp)); + return; + } + if (vflag) + printf("\n\t"); + else + printf(" "); + switch (pt) { + + case PT_IPV4: + ip_print(gndo, p, length - (p - bp)); + break; + + case PT_IPV6: +#ifdef INET6 + ip6_print(gndo, p, length - (p - bp)); +#else + printf("IPv6, length: %u", length); +#endif + break; + + case PT_OSI: + isoclns_print(p, length - (p - bp), length - (p - bp)); + break; + + default: + break; + } + return; + trunc: printf("[|MPLS]"); } diff --git a/contrib/tcpdump/print-null.c b/contrib/tcpdump/print-null.c index ba26733f7a8..926e8d8a231 100644 --- a/contrib/tcpdump/print-null.c +++ b/contrib/tcpdump/print-null.c @@ -127,7 +127,7 @@ null_if_print(const struct pcap_pkthdr *h, const u_char *p) case BSD_AFNUM_INET6_BSD: case BSD_AFNUM_INET6_FREEBSD: case BSD_AFNUM_INET6_DARWIN: - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif diff --git a/contrib/tcpdump/print-ospf.c b/contrib/tcpdump/print-ospf.c index 983c14f40e1..f8ff4aeac5b 100644 --- a/contrib/tcpdump/print-ospf.c +++ b/contrib/tcpdump/print-ospf.c @@ -197,7 +197,7 @@ static int ospf_decode_v2(const struct ospfhdr *, const u_char *); static int ospf_decode_lls(const struct ospfhdr *, register u_int); int -ospf_print_grace_lsa (u_int8_t *tptr, u_int ls_length) { +ospf_print_grace_lsa (const u_int8_t *tptr, u_int ls_length) { u_int tlv_type, tlv_length; @@ -279,7 +279,7 @@ trunc: } int -ospf_print_te_lsa (u_int8_t *tptr, u_int ls_length) { +ospf_print_te_lsa (const u_int8_t *tptr, u_int ls_length) { u_int tlv_type, tlv_length, subtlv_type, subtlv_length; u_int priority_level, te_class, count_srlg; @@ -1028,7 +1028,7 @@ ospf_decode_v2(register const struct ospfhdr *op, lsap = op->ospf_lsu.lsu_lsa; TCHECK(op->ospf_lsu.lsu_count); lsa_count_max = EXTRACT_32BITS(&op->ospf_lsu.lsu_count); - printf(", %d LSA%s",lsa_count_max, lsa_count_max > 1 ? "s" : ""); + printf(", %d LSA%s",lsa_count_max, PLURAL_SUFFIX(lsa_count_max)); for (lsa_count=1;lsa_count <= lsa_count_max;lsa_count++) { printf("\n\t LSA #%u",lsa_count); lsap = (const struct lsa *)ospf_print_lsa(lsap); diff --git a/contrib/tcpdump/print-pflog.c b/contrib/tcpdump/print-pflog.c index 0cacabfc6e4..ac325f4b0e6 100644 --- a/contrib/tcpdump/print-pflog.c +++ b/contrib/tcpdump/print-pflog.c @@ -162,7 +162,7 @@ pflog_if_print(const struct pcap_pkthdr *h, register const u_char *p) #if OPENBSD_AF_INET6 != AF_INET6 case OPENBSD_AF_INET6: /* XXX: read pcap files */ #endif - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif diff --git a/contrib/tcpdump/print-pgm.c b/contrib/tcpdump/print-pgm.c index 73a42914c7b..2d4d7449c91 100644 --- a/contrib/tcpdump/print-pgm.c +++ b/contrib/tcpdump/print-pgm.c @@ -72,6 +72,12 @@ struct pgm_nak { /* ... options */ }; +struct pgm_ack { + u_int32_t pgma_rx_max_seq; + u_int32_t pgma_bitmap; + /* ... options */ +}; + struct pgm_poll { u_int32_t pgmp_seq; u_int16_t pgmp_round; @@ -133,6 +139,9 @@ typedef enum _pgm_type { #define PGM_OPT_RST 0x0F #define PGM_OPT_CR 0x10 #define PGM_OPT_CRQST 0x11 + +#define PGM_OPT_PGMCC_DATA 0x12 +#define PGM_OPT_PGMCC_FEEDBACK 0x13 #define PGM_OPT_MASK 0x7f @@ -446,6 +455,17 @@ pgm_print(register const u_char *bp, register u_int length, break; } + case PGM_ACK: { + struct pgm_ack *ack; + + ack = (struct pgm_ack *)(pgm + 1); + TCHECK(*ack); + (void)printf("ACK seq %u", + EXTRACT_32BITS(&ack->pgma_rx_max_seq)); + bp = (u_char *) (ack + 1); + break; + } + case PGM_SPMR: (void)printf("SPMR"); break; @@ -736,6 +756,74 @@ pgm_print(register const u_char *bp, register u_int length, opts_len -= 4; break; + case PGM_OPT_PGMCC_DATA: + flags1 = *bp++; + flags2 = *bp++; + offset = EXTRACT_32BITS(bp); + bp += sizeof(u_int32_t); + switch (EXTRACT_16BITS(bp)) { + case AFI_IP: + addr_size = sizeof(struct in_addr); + nla_af = AF_INET; + break; +#ifdef INET6 + case AFI_IP6: + addr_size = sizeof(struct in6_addr); + nla_af = AF_INET6; + break; +#endif + default: + goto trunc; + break; + } + bp += (2 * sizeof(u_int16_t)); + if (opt_len != 12 + addr_size) { + (void)printf("[Bad OPT_PGMCC_DATA option, length %u != 12 + address size]", opt_len); + return; + } + TCHECK2(*bp, addr_size); + nla = bp; + bp += addr_size; + + inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf)); + (void)printf(" PGMCC DATA %u %s", offset, (char*)nla); + opts_len -= 16; + break; + + case PGM_OPT_PGMCC_FEEDBACK: + flags1 = *bp++; + flags2 = *bp++; + offset = EXTRACT_32BITS(bp); + bp += sizeof(u_int32_t); + switch (EXTRACT_16BITS(bp)) { + case AFI_IP: + addr_size = sizeof(struct in_addr); + nla_af = AF_INET; + break; +#ifdef INET6 + case AFI_IP6: + addr_size = sizeof(struct in6_addr); + nla_af = AF_INET6; + break; +#endif + default: + goto trunc; + break; + } + bp += (2 * sizeof(u_int16_t)); + if (opt_len != 12 + addr_size) { + (void)printf("[Bad OPT_PGMCC_FEEDBACK option, length %u != 12 + address size]", opt_len); + return; + } + TCHECK2(*bp, addr_size); + nla = bp; + bp += addr_size; + + inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf)); + (void)printf(" PGMCC FEEDBACK %u %s", offset, (char*)nla); + opts_len -= 16; + break; + default: (void)printf(" OPT_%02X [%d] ", opt_type, opt_len); bp += opt_len; diff --git a/contrib/tcpdump/print-pim.c b/contrib/tcpdump/print-pim.c index 96ba75811bb..93ffb9aec6d 100644 --- a/contrib/tcpdump/print-pim.c +++ b/contrib/tcpdump/print-pim.c @@ -31,7 +31,15 @@ static const char rcsid[] _U_ = #endif #include + +#include +#include + #include "interface.h" +#include "addrtoname.h" +#include "extract.h" + +#include "ip.h" #define PIMV2_TYPE_HELLO 0 #define PIMV2_TYPE_REGISTER 1 @@ -110,16 +118,6 @@ struct pim { u_short pim_cksum; /* IP style check sum */ }; - -#include -#include - -#include "interface.h" -#include "addrtoname.h" -#include "extract.h" - -#include "ip.h" - static void pimv2_print(register const u_char *bp, register u_int len, u_int cksum); static void @@ -401,8 +399,12 @@ cisco_autorp_print(register const u_char *bp, register u_int len) TCHECK2(bp[0], 6); (void)printf("%c%s%s/%d", s, bp[0] & 1 ? "!" : "", ipaddr_string(&bp[2]), bp[1]); - if (bp[0] & 0xfe) - (void)printf("[rsvd=0x%02x]", bp[0] & 0xfe); + if (bp[0] & 0x02) { + (void)printf(" bidir"); + } + if (bp[0] & 0xfc) { + (void)printf("[rsvd=0x%02x]", bp[0] & 0xfc); + } s = ','; bp += 6; len -= 6; } @@ -770,7 +772,7 @@ pimv2_print(register const u_char *bp, register u_int len, u_int cksum) break; #ifdef INET6 case 6: /* IPv6 */ - ip6_print(bp, len); + ip6_print(gndo, bp, len); break; #endif default: diff --git a/contrib/tcpdump/print-ppi.c b/contrib/tcpdump/print-ppi.c new file mode 100644 index 00000000000..38873c84c5a --- /dev/null +++ b/contrib/tcpdump/print-ppi.c @@ -0,0 +1,104 @@ +/* + * Oracle + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include + +#include "netdissect.h" +#include "interface.h" +#include "extract.h" +#include "ppi.h" + +#ifdef DLT_PPI + +static inline void +ppi_header_print(struct netdissect_options *ndo, const u_char *bp, u_int length) +{ + const ppi_header_t *hdr; + u_int32_t dlt; + u_int16_t len; + + hdr = (const ppi_header_t *)bp; + + len = EXTRACT_16BITS(&hdr->ppi_len); + dlt = EXTRACT_32BITS(&hdr->ppi_dlt); + + if (!ndo->ndo_qflag) { + ND_PRINT((ndo,", V.%d DLT %s (%d) len %d", hdr->ppi_ver, + pcap_datalink_val_to_name(dlt), dlt, + len)); + } else { + ND_PRINT((ndo,", %s", pcap_datalink_val_to_name(dlt))); + } + + ND_PRINT((ndo, ", length %u: ", length)); +} + +static void +ppi_print(struct netdissect_options *ndo, + const struct pcap_pkthdr *h, const u_char *p) +{ + if_ndo_printer ndo_printer; + if_printer printer; + ppi_header_t *hdr; + u_int caplen = h->caplen; + u_int length = h->len; + u_int32_t dlt; + + if (caplen < sizeof(ppi_header_t)) { + ND_PRINT((ndo, "[|ppi]")); + return; + } + hdr = (ppi_header_t *)p; + dlt = EXTRACT_32BITS(&hdr->ppi_dlt); + + if (ndo->ndo_eflag) + ppi_header_print(ndo, p, length); + + length -= sizeof(ppi_header_t); + caplen -= sizeof(ppi_header_t); + p += sizeof(ppi_header_t); + + if ((printer = lookup_printer(dlt)) != NULL) { + printer(h, p); + } else if ((ndo_printer = lookup_ndo_printer(dlt)) != NULL) { + ndo_printer(ndo, h, p); + } else { + if (!ndo->ndo_eflag) + ppi_header_print(ndo, (u_char *)hdr, + length + sizeof(ppi_header_t)); + + if (!ndo->ndo_suppress_default_print) + ndo->ndo_default_print(ndo, p, caplen); + } +} + +/* + * This is the top level routine of the printer. 'p' points + * to the ether header of the packet, 'h->ts' is the timestamp, + * 'h->len' is the length of the packet off the wire, and 'h->caplen' + * is the number of bytes actually captured. + */ +u_int +ppi_if_print(struct netdissect_options *ndo, + const struct pcap_pkthdr *h, const u_char *p) +{ + ppi_print(ndo, h, p); + + return (sizeof(ppi_header_t)); +} + +/* + * Local Variables: + * c-style: whitesmith + * c-basic-offset: 8 + * End: + */ + +#endif /* DLT_PPI */ diff --git a/contrib/tcpdump/print-ppp.c b/contrib/tcpdump/print-ppp.c index 6020e03c1d4..4bae64aeb07 100644 --- a/contrib/tcpdump/print-ppp.c +++ b/contrib/tcpdump/print-ppp.c @@ -1305,11 +1305,11 @@ ppp_hdlc(const u_char *p, int length) goto cleanup; #ifdef INET6 case PPP_IPV6: - ip6_print(b+1, t - b - 1); - goto cleanup; + ip6_print(gndo, b+1, t - b - 1); + goto cleanup; #endif default: /* no luck - try next guess */ - break; + break; } proto = EXTRACT_16BITS(b); /* next guess - load two octets */ @@ -1370,7 +1370,7 @@ handle_ppp(u_int proto, const u_char *p, int length) #ifdef INET6 case ETHERTYPE_IPV6: /*XXX*/ case PPP_IPV6: - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif case ETHERTYPE_IPX: /*XXX*/ @@ -1677,11 +1677,11 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_ p += hdrlength; switch (ptype) { case PPP_IP: - ip_print(p, length); + ip_print(gndo, p, length); break; #ifdef INET6 case PPP_IPV6: - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif case PPP_MPLS_UCAST: @@ -1696,11 +1696,11 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_ p += hdrlength; switch (ptype) { case PPP_IP: - ip_print(p, length); + ip_print(gndo, p, length); break; #ifdef INET6 case PPP_IPV6: - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif case PPP_MPLS_UCAST: @@ -1732,12 +1732,12 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_ break; #ifdef INET6 case PPP_IPV6: - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif case PPP_MPLS_UCAST: case PPP_MPLS_MCAST: - mpls_print(p, length); + mpls_print(gndo, p, length); break; default: printf("%s ", tok2str(ppptype2str, "unknown PPP protocol (0x%04x)", ptype)); diff --git a/contrib/tcpdump/print-rpki-rtr.c b/contrib/tcpdump/print-rpki-rtr.c new file mode 100644 index 00000000000..8679759ef8d --- /dev/null +++ b/contrib/tcpdump/print-rpki-rtr.c @@ -0,0 +1,368 @@ +/* + * Copyright (c) 1998-2011 The TCPDUMP project + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that: (1) source code + * distributions retain the above copyright notice and this paragraph + * in its entirety, and (2) distributions including binary code include + * the above copyright notice and this paragraph in its entirety in + * the documentation or other materials provided with the distribution. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND + * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. + * + * support for the The RPKI/Router Protocol Protocol as per draft-ietf-sidr-rpki-rtr-12 + * + * Original code by Hannes Gredler (hannes@juniper.net) + */ + +#ifndef lint +static const char rcsid[] _U_ = +"@(#) $Header: /tcpdump/master/tcpdump/print-rpki_rtr.c,v 1.10 2008-03-20 09:30:56 hannes Exp $"; +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include +#include + +#include "interface.h" +#include "extract.h" +#include "addrtoname.h" + +/* + * RPKI/Router PDU header + * + * Here's what the PDU header looks like. + * The length does include the version and length fields. + */ +typedef struct rpki_rtr_pdu_ { + u_char version; /* Version number */ + u_char pdu_type; /* PDU type */ + union { + u_char cache_nonce[2]; /* Cache Nonce */ + u_char error_code[2]; /* Error code */ + } u; + u_char length[4]; +} rpki_rtr_pdu; +#define RPKI_RTR_PDU_OVERHEAD (offsetof(rpki_rtr_pdu, rpki_rtr_pdu_msg)) + +/* + * IPv4 Prefix PDU. + */ +typedef struct rpki_rtr_pdu_ipv4_prefix_ { + rpki_rtr_pdu pdu_header; + u_char flags; + u_char prefix_length; + u_char max_length; + u_char zero; + u_char prefix[4]; + u_char as[4]; +} rpki_rtr_pdu_ipv4_prefix; + +/* + * IPv6 Prefix PDU. + */ +typedef struct rpki_rtr_pdu_ipv6_prefix_ { + rpki_rtr_pdu pdu_header; + u_char flags; + u_char prefix_length; + u_char max_length; + u_char zero; + u_char prefix[16]; + u_char as[4]; +} rpki_rtr_pdu_ipv6_prefix; + +/* + * Error report PDU. + */ +typedef struct rpki_rtr_pdu_error_report_ { + rpki_rtr_pdu pdu_header; + u_char encapsulated_pdu_length[4]; /* Encapsulated PDU length */ +} rpki_rtr_pdu_error_report; + +/* + * PDU type codes + */ +#define RPKI_RTR_SERIAL_NOTIFY_PDU 0 +#define RPKI_RTR_SERIAL_QUERY_PDU 1 +#define RPKI_RTR_RESET_QUERY_PDU 2 +#define RPKI_RTR_CACHE_RESPONSE_PDU 3 +#define RPKI_RTR_IPV4_PREFIX_PDU 4 +#define RPKI_RTR_IPV6_PREFIX_PDU 6 +#define RPKI_RTR_END_OF_DATA_PDU 7 +#define RPKI_RTR_CACHE_RESET_PDU 8 +#define RPKI_RTR_ERROR_REPORT_PDU 10 + +static const struct tok rpki_rtr_pdu_values[] = { + { RPKI_RTR_SERIAL_NOTIFY_PDU, "Serial Notify" }, + { RPKI_RTR_SERIAL_QUERY_PDU, "Serial Query" }, + { RPKI_RTR_RESET_QUERY_PDU, "Reset Query" }, + { RPKI_RTR_CACHE_RESPONSE_PDU, "Cache Response" }, + { RPKI_RTR_IPV4_PREFIX_PDU, "IPV4 Prefix" }, + { RPKI_RTR_IPV6_PREFIX_PDU, "IPV6 Prefix" }, + { RPKI_RTR_END_OF_DATA_PDU, "End of Data" }, + { RPKI_RTR_CACHE_RESET_PDU, "Cache Reset" }, + { RPKI_RTR_ERROR_REPORT_PDU, "Error Report" }, + { 0, NULL} +}; + +static const struct tok rpki_rtr_error_codes[] = { + { 0, "Corrupt Data" }, + { 1, "Internal Error" }, + { 2, "No Data Available" }, + { 3, "Invalid Request" }, + { 4, "Unsupported Protocol Version" }, + { 5, "Unsupported PDU Type" }, + { 6, "Withdrawal of Unknown Record" }, + { 7, "Duplicate Announcement Received" }, + { 0, NULL} +}; + +/* + * Build a identation string for a given identation level. + * XXX this should be really in util.c + */ +static char * +indent_string (u_int indent) +{ + static char buf[20]; + u_int idx; + + idx = 0; + buf[idx] = '\0'; + + /* + * Does the static buffer fit ? + */ + if (sizeof(buf) < ((indent/8) + (indent %8) + 2)) { + return buf; + } + + /* + * Heading newline. + */ + buf[idx] = '\n'; + idx++; + + while (indent >= 8) { + buf[idx] = '\t'; + idx++; + indent -= 8; + } + + while (indent > 0) { + buf[idx] = ' '; + idx++; + indent--; + } + + /* + * Trailing zero. + */ + buf[idx] = '\0'; + + return buf; +} + +/* + * Print a single PDU. + */ +static void +rpki_rtr_pdu_print (const u_char *tptr, u_int indent) +{ + const rpki_rtr_pdu *pdu_header; + u_int pdu_type, pdu_len, hexdump; + const u_char *msg; + + pdu_header = (rpki_rtr_pdu *)tptr; + pdu_type = pdu_header->pdu_type; + pdu_len = EXTRACT_32BITS(pdu_header->length); + hexdump = FALSE; + + printf("%sRPKI-RTRv%u, %s PDU (%u), length: %u", + indent_string(8), + pdu_header->version, + tok2str(rpki_rtr_pdu_values, "Unknown", pdu_type), + pdu_type, pdu_len); + + switch (pdu_type) { + + /* + * The following PDUs share the message format. + */ + case RPKI_RTR_SERIAL_NOTIFY_PDU: + case RPKI_RTR_SERIAL_QUERY_PDU: + case RPKI_RTR_END_OF_DATA_PDU: + msg = (const u_char *)(pdu_header + 1); + printf("%sCache-Nonce: 0x%04x, Serial: %u", + indent_string(indent+2), + EXTRACT_16BITS(pdu_header->u.cache_nonce), + EXTRACT_32BITS(msg)); + break; + + /* + * The following PDUs share the message format. + */ + case RPKI_RTR_RESET_QUERY_PDU: + case RPKI_RTR_CACHE_RESET_PDU: + + /* + * Zero payload PDUs. + */ + break; + + case RPKI_RTR_CACHE_RESPONSE_PDU: + printf("%sCache-Nonce: 0x%04x", + indent_string(indent+2), + EXTRACT_16BITS(pdu_header->u.cache_nonce)); + break; + + case RPKI_RTR_IPV4_PREFIX_PDU: + { + rpki_rtr_pdu_ipv4_prefix *pdu; + + pdu = (rpki_rtr_pdu_ipv4_prefix *)tptr; + printf("%sIPv4 Prefix %s/%u-%u, origin-as %u, flags 0x%02x", + indent_string(indent+2), + ipaddr_string(pdu->prefix), + pdu->prefix_length, pdu->max_length, + EXTRACT_32BITS(pdu->as), pdu->flags); + } + break; + +#ifdef INET6 + case RPKI_RTR_IPV6_PREFIX_PDU: + { + rpki_rtr_pdu_ipv6_prefix *pdu; + + pdu = (rpki_rtr_pdu_ipv6_prefix *)tptr; + printf("%sIPv6 Prefix %s/%u-%u, origin-as %u, flags 0x%02x", + indent_string(indent+2), + ip6addr_string(pdu->prefix), + pdu->prefix_length, pdu->max_length, + EXTRACT_32BITS(pdu->as), pdu->flags); + } + break; +#endif + + case RPKI_RTR_ERROR_REPORT_PDU: + { + rpki_rtr_pdu_error_report *pdu; + u_int encapsulated_pdu_length, text_length, tlen, error_code; + u_char buf[80]; + + pdu = (rpki_rtr_pdu_error_report *)tptr; + encapsulated_pdu_length = EXTRACT_32BITS(pdu->encapsulated_pdu_length); + tlen = pdu_len; + + error_code = EXTRACT_16BITS(pdu->pdu_header.u.error_code); + printf("%sError code: %s (%u), Encapsulated PDU length: %u", + indent_string(indent+2), + tok2str(rpki_rtr_error_codes, "Unknown", error_code), + error_code, encapsulated_pdu_length); + + tptr += sizeof(*pdu); + tlen -= sizeof(*pdu); + + /* + * Recurse if there is an encapsulated PDU. + */ + if (encapsulated_pdu_length && + (encapsulated_pdu_length <= tlen)) { + printf("%s-----encapsulated PDU-----", indent_string(indent+4)); + rpki_rtr_pdu_print(tptr, indent+2); + } + + tptr += encapsulated_pdu_length; + tlen -= encapsulated_pdu_length; + + /* + * Extract, trail-zero and print the Error message. + */ + text_length = 0; + if (tlen > 4) { + text_length = EXTRACT_32BITS(tptr); + tptr += 4; + tlen -= 4; + } + if (text_length && (text_length <= tlen )) { + memcpy(buf, tptr, MIN(sizeof(buf)-1, text_length)); + buf[text_length] = '\0'; + printf("%sError text: %s", indent_string(indent+2), buf); + } + } + break; + + default: + + /* + * Unknown data, please hexdump. + */ + hexdump = TRUE; + } + + /* do we also want to see a hex dump ? */ + if (vflag > 1 || (vflag && hexdump)) { + print_unknown_data(tptr,"\n\t ", pdu_len); + } +} + +void +rpki_rtr_print(register const u_char *pptr, register u_int len) { + + u_int tlen, pdu_type, pdu_len; + const u_char *tptr; + const rpki_rtr_pdu *pdu_header; + + tptr = pptr; + tlen = len; + + if (!vflag) { + printf(", RPKI-RTR"); + return; + } + + while (tlen >= sizeof(rpki_rtr_pdu)) { + + TCHECK2(*tptr, sizeof(rpki_rtr_pdu)); + + pdu_header = (rpki_rtr_pdu *)tptr; + pdu_type = pdu_header->pdu_type; + pdu_len = EXTRACT_32BITS(pdu_header->length); + + /* infinite loop check */ + if (!pdu_type || !pdu_len) { + break; + } + + TCHECK2(*tptr, pdu_len); + if (tlen < pdu_len) { + goto trunc; + } + + /* + * Print the PDU. + */ + rpki_rtr_pdu_print(tptr, 8); + + tlen -= pdu_len; + tptr += pdu_len; + } + return; + trunc: + printf("\n\t[|RPKI-RTR]"); +} + +/* + * Local Variables: + * c-style: whitesmith + * c-basic-offset: 4 + * End: + */ diff --git a/contrib/tcpdump/print-rrcp.c b/contrib/tcpdump/print-rrcp.c index 961fb87309c..64cb7dec312 100644 --- a/contrib/tcpdump/print-rrcp.c +++ b/contrib/tcpdump/print-rrcp.c @@ -111,8 +111,8 @@ rrcp_print(netdissect_options *ndo, if (rrcp_opcode==1 || rrcp_opcode==2){ ND_TCHECK2(*(rrcp + RRCP_REG_ADDR_OFFSET), 6); ND_PRINT((ndo, " addr=0x%04x, data=0x%08x", - EXTRACT_16BITS(rrcp + RRCP_REG_ADDR_OFFSET), - EXTRACT_32BITS(rrcp + RRCP_REG_DATA_OFFSET))); + EXTRACT_LE_16BITS(rrcp + RRCP_REG_ADDR_OFFSET), + EXTRACT_LE_32BITS(rrcp + RRCP_REG_DATA_OFFSET))); } if (rrcp_proto==1){ ND_TCHECK2(*(rrcp + RRCP_AUTHKEY_OFFSET), 2); diff --git a/contrib/tcpdump/print-sctp.c b/contrib/tcpdump/print-sctp.c index 0229396de66..a8990a9ae00 100644 --- a/contrib/tcpdump/print-sctp.c +++ b/contrib/tcpdump/print-sctp.c @@ -59,9 +59,9 @@ static const char rcsid[] _U_ = #include "ip6.h" #endif -#define CHAN_HP 6700 -#define CHAN_MP 6701 -#define CHAN_LP 6702 +#define CHAN_HP 6704 +#define CHAN_MP 6705 +#define CHAN_LP 6706 struct tok ForCES_channels[] = { { CHAN_HP, "ForCES HP" }, diff --git a/contrib/tcpdump/print-sflow.c b/contrib/tcpdump/print-sflow.c index baa55300b66..79a3fdf1d9c 100644 --- a/contrib/tcpdump/print-sflow.c +++ b/contrib/tcpdump/print-sflow.c @@ -15,6 +15,8 @@ * The SFLOW protocol as per http://www.sflow.org/developers/specifications.php * * Original code by Carles Kishimoto + * + * Expansion and refactoring by Rick Jones */ #ifndef lint @@ -87,6 +89,18 @@ static const struct tok sflow_format_values[] = { { 0, NULL} }; +struct sflow_flow_sample_t { + u_int8_t seqnum[4]; + u_int8_t typesource[4]; + u_int8_t rate[4]; + u_int8_t pool[4]; + u_int8_t drops[4]; + u_int8_t in_interface[4]; + u_int8_t out_interface[4]; + u_int8_t records[4]; + +}; + struct sflow_expanded_flow_sample_t { u_int8_t seqnum[4]; u_int8_t type[4]; @@ -156,6 +170,36 @@ struct sflow_expanded_flow_raw_t { u_int8_t header_size[4]; }; +struct sflow_ethernet_frame_t { + u_int8_t length[4]; + u_int8_t src_mac[8]; + u_int8_t dst_mac[8]; + u_int8_t type[4]; +}; + +struct sflow_extended_switch_data_t { + u_int8_t src_vlan[4]; + u_int8_t src_pri[4]; + u_int8_t dst_vlan[4]; + u_int8_t dst_pri[4]; +}; + +struct sflow_counter_record_t { + u_int8_t format[4]; + u_int8_t length[4]; +}; + +struct sflow_flow_record_t { + u_int8_t format[4]; + u_int8_t length[4]; +}; + +struct sflow_counter_sample_t { + u_int8_t seqnum[4]; + u_int8_t typesource[4]; + u_int8_t records[4]; +}; + struct sflow_expanded_counter_sample_t { u_int8_t seqnum[4]; u_int8_t type[4]; @@ -259,24 +303,525 @@ struct sflow_vlan_counter_t { u_int8_t discards[4]; }; +static int +print_sflow_counter_generic(const u_char *pointer, u_int len) { + + const struct sflow_generic_counter_t *sflow_gen_counter; + + if (len < sizeof(struct sflow_generic_counter_t)) + return 1; + + + sflow_gen_counter = (const struct sflow_generic_counter_t *)pointer; + printf("\n\t ifindex %u, iftype %u, ifspeed %" PRIu64 ", ifdirection %u (%s)", + EXTRACT_32BITS(sflow_gen_counter->ifindex), + EXTRACT_32BITS(sflow_gen_counter->iftype), + EXTRACT_64BITS(sflow_gen_counter->ifspeed), + EXTRACT_32BITS(sflow_gen_counter->ifdirection), + tok2str(sflow_iface_direction_values, "Unknown", + EXTRACT_32BITS(sflow_gen_counter->ifdirection))); + printf("\n\t ifstatus %u, adminstatus: %s, operstatus: %s", + EXTRACT_32BITS(sflow_gen_counter->ifstatus), + EXTRACT_32BITS(sflow_gen_counter->ifstatus)&1 ? "up" : "down", + (EXTRACT_32BITS(sflow_gen_counter->ifstatus)>>1)&1 ? "up" : "down"); + printf("\n\t In octets %" PRIu64 + ", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u", + EXTRACT_64BITS(sflow_gen_counter->ifinoctets), + EXTRACT_32BITS(sflow_gen_counter->ifinunicastpkts), + EXTRACT_32BITS(sflow_gen_counter->ifinmulticastpkts), + EXTRACT_32BITS(sflow_gen_counter->ifinbroadcastpkts), + EXTRACT_32BITS(sflow_gen_counter->ifindiscards)); + printf("\n\t In errors %u, unknown protos %u", + EXTRACT_32BITS(sflow_gen_counter->ifinerrors), + EXTRACT_32BITS(sflow_gen_counter->ifinunkownprotos)); + printf("\n\t Out octets %" PRIu64 + ", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u", + EXTRACT_64BITS(sflow_gen_counter->ifoutoctets), + EXTRACT_32BITS(sflow_gen_counter->ifoutunicastpkts), + EXTRACT_32BITS(sflow_gen_counter->ifoutmulticastpkts), + EXTRACT_32BITS(sflow_gen_counter->ifoutbroadcastpkts), + EXTRACT_32BITS(sflow_gen_counter->ifoutdiscards)); + printf("\n\t Out errors %u, promisc mode %u", + EXTRACT_32BITS(sflow_gen_counter->ifouterrors), + EXTRACT_32BITS(sflow_gen_counter->ifpromiscmode)); + + return 0; +} + +static int +print_sflow_counter_ethernet(const u_char *pointer, u_int len){ + + const struct sflow_ethernet_counter_t *sflow_eth_counter; + + if (len < sizeof(struct sflow_ethernet_counter_t)) + return 1; + + sflow_eth_counter = (const struct sflow_ethernet_counter_t *)pointer; + printf("\n\t align errors %u, fcs errors %u, single collision %u, multiple collision %u, test error %u", + EXTRACT_32BITS(sflow_eth_counter->alignerrors), + EXTRACT_32BITS(sflow_eth_counter->fcserrors), + EXTRACT_32BITS(sflow_eth_counter->single_collision_frames), + EXTRACT_32BITS(sflow_eth_counter->multiple_collision_frames), + EXTRACT_32BITS(sflow_eth_counter->test_errors)); + printf("\n\t deferred %u, late collision %u, excessive collision %u, mac trans error %u", + EXTRACT_32BITS(sflow_eth_counter->deferred_transmissions), + EXTRACT_32BITS(sflow_eth_counter->late_collisions), + EXTRACT_32BITS(sflow_eth_counter->excessive_collisions), + EXTRACT_32BITS(sflow_eth_counter->mac_transmit_errors)); + printf("\n\t carrier error %u, frames too long %u, mac receive errors %u, symbol errors %u", + EXTRACT_32BITS(sflow_eth_counter->carrier_sense_errors), + EXTRACT_32BITS(sflow_eth_counter->frame_too_longs), + EXTRACT_32BITS(sflow_eth_counter->mac_receive_errors), + EXTRACT_32BITS(sflow_eth_counter->symbol_errors)); + + return 0; +} + +static int +print_sflow_counter_token_ring(const u_char *pointer _U_, u_int len _U_) { + + return 0; +} + +static int +print_sflow_counter_basevg(const u_char *pointer, u_int len) { + + const struct sflow_100basevg_counter_t *sflow_100basevg_counter; + + if (len < sizeof(struct sflow_100basevg_counter_t)) + return 1; + + sflow_100basevg_counter = (const struct sflow_100basevg_counter_t *)pointer; + printf("\n\t in high prio frames %u, in high prio octets %" PRIu64, + EXTRACT_32BITS(sflow_100basevg_counter->in_highpriority_frames), + EXTRACT_64BITS(sflow_100basevg_counter->in_highpriority_octets)); + printf("\n\t in norm prio frames %u, in norm prio octets %" PRIu64, + EXTRACT_32BITS(sflow_100basevg_counter->in_normpriority_frames), + EXTRACT_64BITS(sflow_100basevg_counter->in_normpriority_octets)); + printf("\n\t in ipm errors %u, oversized %u, in data errors %u, null addressed frames %u", + EXTRACT_32BITS(sflow_100basevg_counter->in_ipmerrors), + EXTRACT_32BITS(sflow_100basevg_counter->in_oversized), + EXTRACT_32BITS(sflow_100basevg_counter->in_data_errors), + EXTRACT_32BITS(sflow_100basevg_counter->in_null_addressed_frames)); + printf("\n\t out high prio frames %u, out high prio octets %" PRIu64 + ", trans into frames %u", + EXTRACT_32BITS(sflow_100basevg_counter->out_highpriority_frames), + EXTRACT_64BITS(sflow_100basevg_counter->out_highpriority_octets), + EXTRACT_32BITS(sflow_100basevg_counter->transitioninto_frames)); + printf("\n\t in hc high prio octets %" PRIu64 + ", in hc norm prio octets %" PRIu64 + ", out hc high prio octets %" PRIu64, + EXTRACT_64BITS(sflow_100basevg_counter->hc_in_highpriority_octets), + EXTRACT_64BITS(sflow_100basevg_counter->hc_in_normpriority_octets), + EXTRACT_64BITS(sflow_100basevg_counter->hc_out_highpriority_octets)); + + return 0; +} + +static int +print_sflow_counter_vlan(const u_char *pointer, u_int len) { + + const struct sflow_vlan_counter_t *sflow_vlan_counter; + + if (len < sizeof(struct sflow_vlan_counter_t)) + return 1; + + sflow_vlan_counter = (const struct sflow_vlan_counter_t *)pointer; + printf("\n\t vlan_id %u, octets %" PRIu64 + ", unicast_pkt %u, multicast_pkt %u, broadcast_pkt %u, discards %u", + EXTRACT_32BITS(sflow_vlan_counter->vlan_id), + EXTRACT_64BITS(sflow_vlan_counter->octets), + EXTRACT_32BITS(sflow_vlan_counter->unicast_pkt), + EXTRACT_32BITS(sflow_vlan_counter->multicast_pkt), + EXTRACT_32BITS(sflow_vlan_counter->broadcast_pkt), + EXTRACT_32BITS(sflow_vlan_counter->discards)); + + return 0; +} + +struct sflow_processor_counter_t { + u_int8_t five_sec_util[4]; + u_int8_t one_min_util[4]; + u_int8_t five_min_util[4]; + u_int8_t total_memory[8]; + u_int8_t free_memory[8]; +}; + +static int +print_sflow_counter_processor(const u_char *pointer, u_int len) { + + const struct sflow_processor_counter_t *sflow_processor_counter; + + if (len < sizeof(struct sflow_processor_counter_t)) + return 1; + + sflow_processor_counter = (const struct sflow_processor_counter_t *)pointer; + printf("\n\t 5sec %u, 1min %u, 5min %u, total_mem %" PRIu64 + ", total_mem %" PRIu64, + EXTRACT_32BITS(sflow_processor_counter->five_sec_util), + EXTRACT_32BITS(sflow_processor_counter->one_min_util), + EXTRACT_32BITS(sflow_processor_counter->five_min_util), + EXTRACT_64BITS(sflow_processor_counter->total_memory), + EXTRACT_64BITS(sflow_processor_counter->free_memory)); + + return 0; +} + +static int +sflow_print_counter_records(const u_char *pointer, u_int len, u_int records) { + + u_int nrecords; + const u_char *tptr; + u_int tlen; + u_int counter_type; + u_int counter_len; + u_int enterprise; + const struct sflow_counter_record_t *sflow_counter_record; + + nrecords = records; + tptr = pointer; + tlen = len; + + while (nrecords > 0) { + /* do we have the "header?" */ + if (tlen < sizeof(struct sflow_counter_record_t)) + return 1; + sflow_counter_record = (const struct sflow_counter_record_t *)tptr; + + enterprise = EXTRACT_32BITS(sflow_counter_record->format); + counter_type = enterprise & 0x0FFF; + enterprise = enterprise >> 20; + counter_len = EXTRACT_32BITS(sflow_counter_record->length); + printf("\n\t enterprise %u, %s (%u) length %u", + enterprise, + (enterprise == 0) ? tok2str(sflow_counter_type_values,"Unknown",counter_type) : "Unknown", + counter_type, + counter_len); + + tptr += sizeof(struct sflow_counter_record_t); + tlen -= sizeof(struct sflow_counter_record_t); + + if (tlen < counter_len) + return 1; + if (enterprise == 0) { + switch (counter_type) { + case SFLOW_COUNTER_GENERIC: + if (print_sflow_counter_generic(tptr,tlen)) + return 1; + break; + case SFLOW_COUNTER_ETHERNET: + if (print_sflow_counter_ethernet(tptr,tlen)) + return 1; + break; + case SFLOW_COUNTER_TOKEN_RING: + if (print_sflow_counter_token_ring(tptr,tlen)) + return 1; + break; + case SFLOW_COUNTER_BASEVG: + if (print_sflow_counter_basevg(tptr,tlen)) + return 1; + break; + case SFLOW_COUNTER_VLAN: + if (print_sflow_counter_vlan(tptr,tlen)) + return 1; + break; + case SFLOW_COUNTER_PROCESSOR: + if (print_sflow_counter_processor(tptr,tlen)) + return 1; + break; + default: + if (vflag <= 1) + print_unknown_data(tptr, "\n\t\t", counter_len); + break; + } + } + tptr += counter_len; + tlen -= counter_len; + nrecords--; + + } + + return 0; +} + + +static int +sflow_print_counter_sample(const u_char *pointer, u_int len) { + + const struct sflow_counter_sample_t *sflow_counter_sample; + u_int nrecords; + u_int typesource; + u_int type; + u_int index; + + + if (len < sizeof(struct sflow_counter_sample_t)) + return 1; + + sflow_counter_sample = (const struct sflow_counter_sample_t *)pointer; + + typesource = EXTRACT_32BITS(sflow_counter_sample->typesource); + nrecords = EXTRACT_32BITS(sflow_counter_sample->records); + type = typesource >> 24; + index = typesource & 0x0FFF; + + printf(" seqnum %u, type %u, idx %u, records %u", + EXTRACT_32BITS(sflow_counter_sample->seqnum), + type, + index, + nrecords); + + return sflow_print_counter_records(pointer + sizeof(struct sflow_counter_sample_t), + len - sizeof(struct sflow_counter_sample_t), + nrecords); + +} + +static int +sflow_print_expanded_counter_sample(const u_char *pointer, u_int len) { + + const struct sflow_expanded_counter_sample_t *sflow_expanded_counter_sample; + u_int nrecords; + + + if (len < sizeof(struct sflow_expanded_counter_sample_t)) + return 1; + + sflow_expanded_counter_sample = (const struct sflow_expanded_counter_sample_t *)pointer; + + nrecords = EXTRACT_32BITS(sflow_expanded_counter_sample->records); + + printf(" seqnum %u, type %u, idx %u, records %u", + EXTRACT_32BITS(sflow_expanded_counter_sample->seqnum), + EXTRACT_32BITS(sflow_expanded_counter_sample->type), + EXTRACT_32BITS(sflow_expanded_counter_sample->index), + nrecords); + + return sflow_print_counter_records(pointer + sizeof(struct sflow_expanded_counter_sample_t), + len - sizeof(struct sflow_expanded_counter_sample_t), + nrecords); + +} + +static int +print_sflow_raw_packet(const u_char *pointer, u_int len) { + + const struct sflow_expanded_flow_raw_t *sflow_flow_raw; + + if (len < sizeof(struct sflow_expanded_flow_raw_t)) + return 1; + + sflow_flow_raw = (const struct sflow_expanded_flow_raw_t *)pointer; + printf("\n\t protocol %s (%u), length %u, stripped bytes %u, header_size %u", + tok2str(sflow_flow_raw_protocol_values,"Unknown",EXTRACT_32BITS(sflow_flow_raw->protocol)), + EXTRACT_32BITS(sflow_flow_raw->protocol), + EXTRACT_32BITS(sflow_flow_raw->length), + EXTRACT_32BITS(sflow_flow_raw->stripped_bytes), + EXTRACT_32BITS(sflow_flow_raw->header_size)); + + /* QUESTION - should we attempt to print the raw header itself? + assuming of course there is wnough data present to do so... */ + + return 0; +} + +static int +print_sflow_ethernet_frame(const u_char *pointer, u_int len) { + + const struct sflow_ethernet_frame_t *sflow_ethernet_frame; + + if (len < sizeof(struct sflow_ethernet_frame_t)) + return 1; + + sflow_ethernet_frame = (const struct sflow_ethernet_frame_t *)pointer; + + printf("\n\t frame len %u, type %u", + EXTRACT_32BITS(sflow_ethernet_frame->length), + EXTRACT_32BITS(sflow_ethernet_frame->type)); + + return 0; +} + +static int +print_sflow_extended_switch_data(const u_char *pointer, u_int len) { + + const struct sflow_extended_switch_data_t *sflow_extended_sw_data; + + if (len < sizeof(struct sflow_extended_switch_data_t)) + return 1; + + sflow_extended_sw_data = (const struct sflow_extended_switch_data_t *)pointer; + printf("\n\t src vlan %u, src pri %u, dst vlan %u, dst pri %u", + EXTRACT_32BITS(sflow_extended_sw_data->src_vlan), + EXTRACT_32BITS(sflow_extended_sw_data->src_pri), + EXTRACT_32BITS(sflow_extended_sw_data->dst_vlan), + EXTRACT_32BITS(sflow_extended_sw_data->dst_pri)); + + return 0; +} + +static int +sflow_print_flow_records(const u_char *pointer, u_int len, u_int records) { + + u_int nrecords; + const u_char *tptr; + u_int tlen; + u_int flow_type; + u_int enterprise; + u_int flow_len; + const struct sflow_flow_record_t *sflow_flow_record; + + nrecords = records; + tptr = pointer; + tlen = len; + + while (nrecords > 0) { + /* do we have the "header?" */ + if (tlen < sizeof(struct sflow_flow_record_t)) + return 1; + + sflow_flow_record = (const struct sflow_flow_record_t *)tptr; + + /* so, the funky encoding means we cannot blythly mask-off + bits, we must also check the enterprise. */ + + enterprise = EXTRACT_32BITS(sflow_flow_record->format); + flow_type = enterprise & 0x0FFF; + enterprise = enterprise >> 12; + flow_len = EXTRACT_32BITS(sflow_flow_record->length); + printf("\n\t enterprise %u %s (%u) length %u", + enterprise, + (enterprise == 0) ? tok2str(sflow_flow_type_values,"Unknown",flow_type) : "Unknown", + flow_type, + flow_len); + + tptr += sizeof(struct sflow_flow_record_t); + tlen -= sizeof(struct sflow_flow_record_t); + + if (tlen < flow_len) + return 1; + + if (enterprise == 0) { + switch (flow_type) { + case SFLOW_FLOW_RAW_PACKET: + if (print_sflow_raw_packet(tptr,tlen)) + return 1; + break; + case SFLOW_FLOW_EXTENDED_SWITCH_DATA: + if (print_sflow_extended_switch_data(tptr,tlen)) + return 1; + break; + case SFLOW_FLOW_ETHERNET_FRAME: + if (print_sflow_ethernet_frame(tptr,tlen)) + return 1; + break; + /* FIXME these need a decoder */ + case SFLOW_FLOW_IPV4_DATA: + case SFLOW_FLOW_IPV6_DATA: + case SFLOW_FLOW_EXTENDED_ROUTER_DATA: + case SFLOW_FLOW_EXTENDED_GATEWAY_DATA: + case SFLOW_FLOW_EXTENDED_USER_DATA: + case SFLOW_FLOW_EXTENDED_URL_DATA: + case SFLOW_FLOW_EXTENDED_MPLS_DATA: + case SFLOW_FLOW_EXTENDED_NAT_DATA: + case SFLOW_FLOW_EXTENDED_MPLS_TUNNEL: + case SFLOW_FLOW_EXTENDED_MPLS_VC: + case SFLOW_FLOW_EXTENDED_MPLS_FEC: + case SFLOW_FLOW_EXTENDED_MPLS_LVP_FEC: + case SFLOW_FLOW_EXTENDED_VLAN_TUNNEL: + break; + default: + if (vflag <= 1) + print_unknown_data(tptr, "\n\t\t", flow_len); + break; + } + } + tptr += flow_len; + tlen -= flow_len; + nrecords--; + + } + + return 0; +} + +static int +sflow_print_flow_sample(const u_char *pointer, u_int len) { + + const struct sflow_flow_sample_t *sflow_flow_sample; + u_int nrecords; + u_int typesource; + u_int type; + u_int index; + + if (len < sizeof(struct sflow_flow_sample_t)) + return 1; + + sflow_flow_sample = (struct sflow_flow_sample_t *)pointer; + + typesource = EXTRACT_32BITS(sflow_flow_sample->typesource); + nrecords = EXTRACT_32BITS(sflow_flow_sample->records); + type = typesource >> 24; + index = typesource & 0x0FFF; + + printf(" seqnum %u, type %u, idx %u, rate %u, pool %u, drops %u, input %u output %u records %u", + EXTRACT_32BITS(sflow_flow_sample->seqnum), + type, + index, + EXTRACT_32BITS(sflow_flow_sample->rate), + EXTRACT_32BITS(sflow_flow_sample->pool), + EXTRACT_32BITS(sflow_flow_sample->drops), + EXTRACT_32BITS(sflow_flow_sample->in_interface), + EXTRACT_32BITS(sflow_flow_sample->out_interface), + nrecords); + + return sflow_print_flow_records(pointer + sizeof(struct sflow_flow_sample_t), + len - sizeof(struct sflow_flow_sample_t), + nrecords); + +} + +static int +sflow_print_expanded_flow_sample(const u_char *pointer, u_int len) { + + const struct sflow_expanded_flow_sample_t *sflow_expanded_flow_sample; + u_int nrecords; + + if (len < sizeof(struct sflow_expanded_flow_sample_t)) + return 1; + + sflow_expanded_flow_sample = (const struct sflow_expanded_flow_sample_t *)pointer; + + nrecords = EXTRACT_32BITS(sflow_expanded_flow_sample->records); + + printf(" seqnum %u, type %u, idx %u, rate %u, pool %u, drops %u, records %u", + EXTRACT_32BITS(sflow_expanded_flow_sample->seqnum), + EXTRACT_32BITS(sflow_expanded_flow_sample->type), + EXTRACT_32BITS(sflow_expanded_flow_sample->index), + EXTRACT_32BITS(sflow_expanded_flow_sample->rate), + EXTRACT_32BITS(sflow_expanded_flow_sample->pool), + EXTRACT_32BITS(sflow_expanded_flow_sample->drops), + EXTRACT_32BITS(sflow_expanded_flow_sample->records)); + + return sflow_print_flow_records(pointer + sizeof(struct sflow_expanded_flow_sample_t), + len - sizeof(struct sflow_expanded_flow_sample_t), + nrecords); + +} + void sflow_print(const u_char *pptr, u_int len) { const struct sflow_datagram_t *sflow_datagram; const struct sflow_sample_header *sflow_sample; - const struct sflow_expanded_flow_sample_t *sflow_expanded_flow_sample; - const struct sflow_expanded_flow_raw_t *sflow_flow_raw; - const struct sflow_expanded_counter_sample_t *sflow_expanded_counter_sample; - const struct sflow_generic_counter_t *sflow_gen_counter; - const struct sflow_ethernet_counter_t *sflow_eth_counter; - const struct sflow_100basevg_counter_t *sflow_100basevg_counter; - const struct sflow_vlan_counter_t *sflow_vlan_counter; - const u_char *tptr; - int tlen; - u_int32_t sflow_sample_type, sflow_sample_len; - int nsamples, nrecords, counter_len, counter_type, flow_len, flow_type; - tptr=pptr; + const u_char *tptr; + u_int tlen; + u_int32_t sflow_sample_type, sflow_sample_len; + u_int32_t nsamples; + + + tptr = pptr; tlen = len; sflow_datagram = (const struct sflow_datagram_t *)pptr; TCHECK(*sflow_datagram); @@ -313,16 +858,21 @@ sflow_print(const u_char *pptr, u_int len) { len); /* skip Common header */ - tptr+=sizeof(const struct sflow_datagram_t); - tlen-=sizeof(const struct sflow_datagram_t); + tptr += sizeof(const struct sflow_datagram_t); + tlen -= sizeof(const struct sflow_datagram_t); while (nsamples > 0 && tlen > 0) { sflow_sample = (const struct sflow_sample_header *)tptr; + TCHECK(*sflow_sample); + sflow_sample_type = (EXTRACT_32BITS(sflow_sample->format)&0x0FFF); sflow_sample_len = EXTRACT_32BITS(sflow_sample->len); - tptr+=sizeof(struct sflow_sample_header); - tlen-=sizeof(struct sflow_sample_header); + if (tlen < sizeof(struct sflow_sample_header)) + goto trunc; + + tptr += sizeof(struct sflow_sample_header); + tlen -= sizeof(struct sflow_sample_header); printf("\n\t%s (%u), length %u,", tok2str(sflow_format_values, "Unknown", sflow_sample_type), @@ -334,226 +884,33 @@ sflow_print(const u_char *pptr, u_int len) { return; } + if (tlen < sflow_sample_len) + goto trunc; + /* did we capture enough for fully decoding the sample ? */ - if (!TTEST2(*tptr, sflow_sample_len)) - goto trunc; + TCHECK2(*tptr, sflow_sample_len); switch(sflow_sample_type) { - case SFLOW_FLOW_SAMPLE: /* XXX */ + case SFLOW_FLOW_SAMPLE: + if (sflow_print_flow_sample(tptr,tlen)) + goto trunc; break; - case SFLOW_COUNTER_SAMPLE: /* XXX */ + case SFLOW_COUNTER_SAMPLE: + if (sflow_print_counter_sample(tptr,tlen)) + goto trunc; break; case SFLOW_EXPANDED_FLOW_SAMPLE: - sflow_expanded_flow_sample = (const struct sflow_expanded_flow_sample_t *)tptr; - nrecords = EXTRACT_32BITS(sflow_expanded_flow_sample->records); - - printf(" seqnum %u, type %u, idx %u, rate %u, pool %u, drops %u, records %u", - EXTRACT_32BITS(sflow_expanded_flow_sample->seqnum), - EXTRACT_32BITS(sflow_expanded_flow_sample->type), - EXTRACT_32BITS(sflow_expanded_flow_sample->index), - EXTRACT_32BITS(sflow_expanded_flow_sample->rate), - EXTRACT_32BITS(sflow_expanded_flow_sample->pool), - EXTRACT_32BITS(sflow_expanded_flow_sample->drops), - EXTRACT_32BITS(sflow_expanded_flow_sample->records)); - - tptr+= sizeof(struct sflow_expanded_flow_sample_t); - tlen-= sizeof(struct sflow_expanded_flow_sample_t); - - while ( nrecords > 0 && tlen > 0) { - - /* decode Flow record - 2 bytes */ - flow_type = EXTRACT_32BITS(tptr)&0x0FFF; - flow_len = EXTRACT_32BITS(tptr+4); - printf("\n\t %s (%u) length %u", - tok2str(sflow_flow_type_values,"Unknown",flow_type), - flow_type, - flow_len); - - tptr += 8; - tlen -= 8; - - /* did we capture enough for fully decoding the flow ? */ - if (!TTEST2(*tptr, flow_len)) - goto trunc; - - switch(flow_type) { - case SFLOW_FLOW_RAW_PACKET: - sflow_flow_raw = (const struct sflow_expanded_flow_raw_t *)tptr; - printf("\n\t protocol %s (%u), length %u, stripped bytes %u, header_size %u", - tok2str(sflow_flow_raw_protocol_values,"Unknown",EXTRACT_32BITS(sflow_flow_raw->protocol)), - EXTRACT_32BITS(sflow_flow_raw->protocol), - EXTRACT_32BITS(sflow_flow_raw->length), - EXTRACT_32BITS(sflow_flow_raw->stripped_bytes), - EXTRACT_32BITS(sflow_flow_raw->header_size)); - break; - - /* - * FIXME those are the defined flow types that lack a decoder - */ - case SFLOW_FLOW_ETHERNET_FRAME: - case SFLOW_FLOW_IPV4_DATA: - case SFLOW_FLOW_IPV6_DATA: - case SFLOW_FLOW_EXTENDED_SWITCH_DATA: - case SFLOW_FLOW_EXTENDED_ROUTER_DATA: - case SFLOW_FLOW_EXTENDED_GATEWAY_DATA: - case SFLOW_FLOW_EXTENDED_USER_DATA: - case SFLOW_FLOW_EXTENDED_URL_DATA: - case SFLOW_FLOW_EXTENDED_MPLS_DATA: - case SFLOW_FLOW_EXTENDED_NAT_DATA: - case SFLOW_FLOW_EXTENDED_MPLS_TUNNEL: - case SFLOW_FLOW_EXTENDED_MPLS_VC: - case SFLOW_FLOW_EXTENDED_MPLS_FEC: - case SFLOW_FLOW_EXTENDED_MPLS_LVP_FEC: - case SFLOW_FLOW_EXTENDED_VLAN_TUNNEL: - break; - default: - if (vflag <= 1) - print_unknown_data(tptr, "\n\t ", flow_len); - break; - - } - tptr += flow_len; - tlen -= flow_len; - nrecords--; - } - break; + if (sflow_print_expanded_flow_sample(tptr,tlen)) + goto trunc; + break; case SFLOW_EXPANDED_COUNTER_SAMPLE: - sflow_expanded_counter_sample = (const struct sflow_expanded_counter_sample_t *)tptr; - nrecords = EXTRACT_32BITS(sflow_expanded_counter_sample->records); + if (sflow_print_expanded_counter_sample(tptr,tlen)) + goto trunc; + break; - printf(" seqnum %u, type %u, idx %u, records %u", - EXTRACT_32BITS(sflow_expanded_counter_sample->seqnum), - EXTRACT_32BITS(sflow_expanded_counter_sample->type), - EXTRACT_32BITS(sflow_expanded_counter_sample->index), - nrecords); - - tptr+= sizeof(struct sflow_expanded_counter_sample_t); - tlen-= sizeof(struct sflow_expanded_counter_sample_t); - - while ( nrecords > 0 && tlen > 0) { - - /* decode counter record - 2 bytes */ - counter_type = EXTRACT_32BITS(tptr)&0x0FFF; - counter_len = EXTRACT_32BITS(tptr+4); - printf("\n\t %s (%u) length %u", - tok2str(sflow_counter_type_values,"Unknown",counter_type), - counter_type, - counter_len); - - tptr += 8; - tlen -= 8; - - /* did we capture enough for fully decoding the counter ? */ - if (!TTEST2(*tptr, counter_len)) - goto trunc; - - switch(counter_type) { - case SFLOW_COUNTER_GENERIC: - sflow_gen_counter = (const struct sflow_generic_counter_t *)tptr; - printf("\n\t ifindex %u, iftype %u, ifspeed %u, ifdirection %u (%s)", - EXTRACT_32BITS(sflow_gen_counter->ifindex), - EXTRACT_32BITS(sflow_gen_counter->iftype), - EXTRACT_32BITS(sflow_gen_counter->ifspeed), - EXTRACT_32BITS(sflow_gen_counter->ifdirection), - tok2str(sflow_iface_direction_values, "Unknown", - EXTRACT_32BITS(sflow_gen_counter->ifdirection))); - printf("\n\t ifstatus %u, adminstatus: %s, operstatus: %s", - EXTRACT_32BITS(sflow_gen_counter->ifstatus), - EXTRACT_32BITS(sflow_gen_counter->ifstatus)&1 ? "up" : "down", - (EXTRACT_32BITS(sflow_gen_counter->ifstatus)>>1)&1 ? "up" : "down"); - printf("\n\t In octets %" PRIu64 - ", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u", - EXTRACT_64BITS(sflow_gen_counter->ifinoctets), - EXTRACT_32BITS(sflow_gen_counter->ifinunicastpkts), - EXTRACT_32BITS(sflow_gen_counter->ifinmulticastpkts), - EXTRACT_32BITS(sflow_gen_counter->ifinbroadcastpkts), - EXTRACT_32BITS(sflow_gen_counter->ifindiscards)); - printf("\n\t In errors %u, unknown protos %u", - EXTRACT_32BITS(sflow_gen_counter->ifinerrors), - EXTRACT_32BITS(sflow_gen_counter->ifinunkownprotos)); - printf("\n\t Out octets %" PRIu64 - ", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u", - EXTRACT_64BITS(sflow_gen_counter->ifoutoctets), - EXTRACT_32BITS(sflow_gen_counter->ifoutunicastpkts), - EXTRACT_32BITS(sflow_gen_counter->ifoutmulticastpkts), - EXTRACT_32BITS(sflow_gen_counter->ifoutbroadcastpkts), - EXTRACT_32BITS(sflow_gen_counter->ifoutdiscards)); - printf("\n\t Out errors %u, promisc mode %u", - EXTRACT_32BITS(sflow_gen_counter->ifouterrors), - EXTRACT_32BITS(sflow_gen_counter->ifpromiscmode)); - break; - case SFLOW_COUNTER_ETHERNET: - sflow_eth_counter = (const struct sflow_ethernet_counter_t *)tptr; - printf("\n\t align errors %u, fcs errors %u, single collision %u, multiple collision %u, test error %u", - EXTRACT_32BITS(sflow_eth_counter->alignerrors), - EXTRACT_32BITS(sflow_eth_counter->fcserrors), - EXTRACT_32BITS(sflow_eth_counter->single_collision_frames), - EXTRACT_32BITS(sflow_eth_counter->multiple_collision_frames), - EXTRACT_32BITS(sflow_eth_counter->test_errors)); - printf("\n\t deferred %u, late collision %u, excessive collision %u, mac trans error %u", - EXTRACT_32BITS(sflow_eth_counter->deferred_transmissions), - EXTRACT_32BITS(sflow_eth_counter->late_collisions), - EXTRACT_32BITS(sflow_eth_counter->excessive_collisions), - EXTRACT_32BITS(sflow_eth_counter->mac_transmit_errors)); - printf("\n\t carrier error %u, frames too long %u, mac receive errors %u, symbol errors %u", - EXTRACT_32BITS(sflow_eth_counter->carrier_sense_errors), - EXTRACT_32BITS(sflow_eth_counter->frame_too_longs), - EXTRACT_32BITS(sflow_eth_counter->mac_receive_errors), - EXTRACT_32BITS(sflow_eth_counter->symbol_errors)); - break; - case SFLOW_COUNTER_TOKEN_RING: /* XXX */ - break; - case SFLOW_COUNTER_BASEVG: - sflow_100basevg_counter = (const struct sflow_100basevg_counter_t *)tptr; - printf("\n\t in high prio frames %u, in high prio octets %" PRIu64, - EXTRACT_32BITS(sflow_100basevg_counter->in_highpriority_frames), - EXTRACT_64BITS(sflow_100basevg_counter->in_highpriority_octets)); - printf("\n\t in norm prio frames %u, in norm prio octets %" PRIu64, - EXTRACT_32BITS(sflow_100basevg_counter->in_normpriority_frames), - EXTRACT_64BITS(sflow_100basevg_counter->in_normpriority_octets)); - printf("\n\t in ipm errors %u, oversized %u, in data errors %u, null addressed frames %u", - EXTRACT_32BITS(sflow_100basevg_counter->in_ipmerrors), - EXTRACT_32BITS(sflow_100basevg_counter->in_oversized), - EXTRACT_32BITS(sflow_100basevg_counter->in_data_errors), - EXTRACT_32BITS(sflow_100basevg_counter->in_null_addressed_frames)); - printf("\n\t out high prio frames %u, out high prio octets %" PRIu64 - ", trans into frames %u", - EXTRACT_32BITS(sflow_100basevg_counter->out_highpriority_frames), - EXTRACT_64BITS(sflow_100basevg_counter->out_highpriority_octets), - EXTRACT_32BITS(sflow_100basevg_counter->transitioninto_frames)); - printf("\n\t in hc high prio octets %" PRIu64 - ", in hc norm prio octets %" PRIu64 - ", out hc high prio octets %" PRIu64, - EXTRACT_64BITS(sflow_100basevg_counter->hc_in_highpriority_octets), - EXTRACT_64BITS(sflow_100basevg_counter->hc_in_normpriority_octets), - EXTRACT_64BITS(sflow_100basevg_counter->hc_out_highpriority_octets)); - break; - case SFLOW_COUNTER_VLAN: - sflow_vlan_counter = (const struct sflow_vlan_counter_t *)tptr; - printf("\n\t vlan_id %u, octets %" PRIu64 - ", unicast_pkt %u, multicast_pkt %u, broadcast_pkt %u, discards %u", - EXTRACT_32BITS(sflow_vlan_counter->vlan_id), - EXTRACT_64BITS(sflow_vlan_counter->octets), - EXTRACT_32BITS(sflow_vlan_counter->unicast_pkt), - EXTRACT_32BITS(sflow_vlan_counter->multicast_pkt), - EXTRACT_32BITS(sflow_vlan_counter->broadcast_pkt), - EXTRACT_32BITS(sflow_vlan_counter->discards)); - break; - case SFLOW_COUNTER_PROCESSOR: /* XXX */ - break; - default: - if (vflag <= 1) - print_unknown_data(tptr, "\n\t\t", counter_len); - break; - } - tptr += counter_len; - tlen -= counter_len; - nrecords--; - } - break; default: if (vflag <= 1) print_unknown_data(tptr, "\n\t ", sflow_sample_len); diff --git a/contrib/tcpdump/print-sl.c b/contrib/tcpdump/print-sl.c index dd0276720c0..3d649a66536 100644 --- a/contrib/tcpdump/print-sl.c +++ b/contrib/tcpdump/print-sl.c @@ -75,7 +75,7 @@ sl_if_print(const struct pcap_pkthdr *h, const u_char *p) break; #ifdef INET6 case 6: - ip6_print((u_char *)ip, length); + ip6_print(gndo, (u_char *)ip, length); break; #endif default: diff --git a/contrib/tcpdump/print-sll.c b/contrib/tcpdump/print-sll.c index c9546585dcb..a044de6709f 100644 --- a/contrib/tcpdump/print-sll.c +++ b/contrib/tcpdump/print-sll.c @@ -218,7 +218,7 @@ recurse: caplen -= 4; goto recurse; } else { - if (ethertype_print(ether_type, p, length, caplen) == 0) { + if (ethertype_print(gndo, ether_type, p, length, caplen) == 0) { /* ether_type not known, print raw packet */ if (!eflag) sll_print(sllp, length + SLL_HDR_LEN); diff --git a/contrib/tcpdump/print-sunrpc.c b/contrib/tcpdump/print-sunrpc.c index 5dd7a43a42f..3a1fce74980 100644 --- a/contrib/tcpdump/print-sunrpc.c +++ b/contrib/tcpdump/print-sunrpc.c @@ -47,12 +47,12 @@ static const char rcsid[] _U_ = #include -#ifdef HAVE_GETRPCBYNUMBER +#if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H) #include #ifdef HAVE_RPC_RPCENT_H #include #endif /* HAVE_RPC_RPCENT_H */ -#endif /* HAVE_GETRPCBYNUMBER */ +#endif /* defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H) */ #include #include @@ -153,7 +153,7 @@ static char * progstr(prog) u_int32_t prog; { -#ifdef HAVE_GETRPCBYNUMBER +#if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H) register struct rpcent *rp; #endif static char buf[32]; @@ -161,12 +161,12 @@ progstr(prog) if (lastprog != 0 && prog == lastprog) return (buf); -#ifdef HAVE_GETRPCBYNUMBER +#if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H) rp = getrpcbynumber(prog); if (rp == NULL) #endif (void) snprintf(buf, sizeof(buf), "#%u", prog); -#ifdef HAVE_GETRPCBYNUMBER +#if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H) else strlcpy(buf, rp->r_name, sizeof(buf)); #endif diff --git a/contrib/tcpdump/print-symantec.c b/contrib/tcpdump/print-symantec.c index 0fba8e534de..8b4ee38c409 100644 --- a/contrib/tcpdump/print-symantec.c +++ b/contrib/tcpdump/print-symantec.c @@ -107,7 +107,7 @@ symantec_if_print(const struct pcap_pkthdr *h, const u_char *p) if (!suppress_default_print) default_print(p, caplen); - } else if (ethertype_print(ether_type, p, length, caplen) == 0) { + } else if (ethertype_print(gndo, ether_type, p, length, caplen) == 0) { /* ether_type not known, print raw packet */ if (!eflag) symantec_hdr_print((u_char *)sp, length + sizeof (struct symantec_header)); diff --git a/contrib/tcpdump/print-tcp.c b/contrib/tcpdump/print-tcp.c index e2559ecf64c..88b461576df 100644 --- a/contrib/tcpdump/print-tcp.c +++ b/contrib/tcpdump/print-tcp.c @@ -129,31 +129,8 @@ static int tcp_cksum(register const struct ip *ip, register const struct tcphdr *tp, register u_int len) { - union phu { - struct phdr { - u_int32_t src; - u_int32_t dst; - u_char mbz; - u_char proto; - u_int16_t len; - } ph; - u_int16_t pa[6]; - } phu; - const u_int16_t *sp; - - /* pseudo-header.. */ - phu.ph.len = htons((u_int16_t)len); - phu.ph.mbz = 0; - phu.ph.proto = IPPROTO_TCP; - memcpy(&phu.ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t)); - if (IP_HL(ip) == 5) - memcpy(&phu.ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t)); - else - phu.ph.dst = ip_finddst(ip); - - sp = &phu.pa[0]; - return in_cksum((u_short *)tp, len, - sp[0]+sp[1]+sp[2]+sp[3]+sp[4]+sp[5]); + return (nextproto4_cksum(ip, (const u_int8_t *)tp, len, + IPPROTO_TCP)); } void @@ -294,7 +271,6 @@ tcp_print(register const u_char *bp, register u_int length, * both directions). */ #ifdef INET6 - memset(&tha, 0, sizeof(tha)); rev = 0; if (ip6) { src = &ip6->ip6_src; @@ -315,6 +291,27 @@ tcp_print(register const u_char *bp, register u_int length, tha.port = sport << 16 | dport; } } else { + /* + * Zero out the tha structure; the src and dst + * fields are big enough to hold an IPv6 + * address, but we only have IPv4 addresses + * and thus must clear out the remaining 124 + * bits. + * + * XXX - should we just clear those bytes after + * copying the IPv4 addresses, rather than + * zeroing out the entire structure and then + * overwriting some of the zeroes? + * + * XXX - this could fail if we see TCP packets + * with an IPv6 address with the lower 124 bits + * all zero and also see TCP packes with an + * IPv4 address with the same 32 bits as the + * upper 32 bits of the IPv6 address in question. + * Can that happen? Is it likely enough to be + * an issue? + */ + memset(&tha, 0, sizeof(tha)); src = &ip->ip_src; dst = &ip->ip_dst; if (sport > dport) @@ -393,34 +390,40 @@ tcp_print(register const u_char *bp, register u_int length, return; } - if (IP_V(ip) == 4 && vflag && !Kflag && !fragmented) { + if (vflag && !Kflag && !fragmented) { + /* Check the checksum, if possible. */ u_int16_t sum, tcp_sum; - if (TTEST2(tp->th_sport, length)) { - sum = tcp_cksum(ip, tp, length); - (void)printf(", cksum 0x%04x",EXTRACT_16BITS(&tp->th_sum)); - if (sum != 0) { + if (IP_V(ip) == 4) { + if (TTEST2(tp->th_sport, length)) { + sum = tcp_cksum(ip, tp, length); tcp_sum = EXTRACT_16BITS(&tp->th_sum); - (void)printf(" (incorrect -> 0x%04x)",in_cksum_shouldbe(tcp_sum, sum)); - } else - (void)printf(" (correct)"); + + (void)printf(", cksum 0x%04x", tcp_sum); + if (sum != 0) + (void)printf(" (incorrect -> 0x%04x)", + in_cksum_shouldbe(tcp_sum, sum)); + else + (void)printf(" (correct)"); + } } - } #ifdef INET6 - if (IP_V(ip) == 6 && ip6->ip6_plen && vflag && !Kflag && !fragmented) { - u_int16_t sum,tcp_sum; - if (TTEST2(tp->th_sport, length)) { - sum = nextproto6_cksum(ip6, (u_short *)tp, length, IPPROTO_TCP); - (void)printf(", cksum 0x%04x",EXTRACT_16BITS(&tp->th_sum)); - if (sum != 0) { + else if (IP_V(ip) == 6 && ip6->ip6_plen) { + if (TTEST2(tp->th_sport, length)) { + sum = nextproto6_cksum(ip6, (const u_int8_t *)tp, length, IPPROTO_TCP); tcp_sum = EXTRACT_16BITS(&tp->th_sum); - (void)printf(" (incorrect -> 0x%04x)",in_cksum_shouldbe(tcp_sum, sum)); - } else - (void)printf(" (correct)"); + (void)printf(", cksum 0x%04x", tcp_sum); + if (sum != 0) + (void)printf(" (incorrect -> 0x%04x)", + in_cksum_shouldbe(tcp_sum, sum)); + else + (void)printf(" (correct)"); + + } } - } #endif + } length -= hlen; if (vflag > 1 || length > 0 || flags & (TH_SYN | TH_FIN | TH_RST)) { @@ -661,6 +664,8 @@ tcp_print(register const u_char *bp, register u_int length, ns_print(bp + 2, length - 2, 0); } else if (sport == MSDP_PORT || dport == MSDP_PORT) { msdp_print(bp, length); + } else if (sport == RPKI_RTR_PORT || dport == RPKI_RTR_PORT) { + rpki_rtr_print(bp, length); } else if (length > 0 && (sport == LDP_PORT || dport == LDP_PORT)) { ldp_print(bp, length); diff --git a/contrib/tcpdump/print-tftp.c b/contrib/tcpdump/print-tftp.c index 0caff428432..84cde3969d0 100644 --- a/contrib/tcpdump/print-tftp.c +++ b/contrib/tcpdump/print-tftp.c @@ -99,15 +99,7 @@ tftp_print(register const u_char *bp, u_int length) case RRQ: case WRQ: case OACK: - /* - * XXX Not all arpa/tftp.h's specify th_stuff as any - * array; use address of th_block instead - */ -#ifdef notdef p = (u_char *)tp->th_stuff; -#else - p = (u_char *)&tp->th_block; -#endif putchar(' '); /* Print filename or first option */ if (opcode != OACK) diff --git a/contrib/tcpdump/print-udp.c b/contrib/tcpdump/print-udp.c index 7eee9c78c29..eab0128c565 100644 --- a/contrib/tcpdump/print-udp.c +++ b/contrib/tcpdump/print-udp.c @@ -35,7 +35,6 @@ static const char rcsid[] _U_ = #ifdef SEGSIZE #undef SEGSIZE #endif -#include #include #include @@ -289,75 +288,16 @@ static int udp_cksum(register const struct ip *ip, register const struct udphdr *up, register u_int len) { - union phu { - struct phdr { - u_int32_t src; - u_int32_t dst; - u_char mbz; - u_char proto; - u_int16_t len; - } ph; - u_int16_t pa[6]; - } phu; - register const u_int16_t *sp; - - /* pseudo-header.. */ - phu.ph.len = htons((u_int16_t)len); - phu.ph.mbz = 0; - phu.ph.proto = IPPROTO_UDP; - memcpy(&phu.ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t)); - if (IP_HL(ip) == 5) - memcpy(&phu.ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t)); - else - phu.ph.dst = ip_finddst(ip); - - sp = &phu.pa[0]; - return in_cksum((u_short *)up, len, - sp[0]+sp[1]+sp[2]+sp[3]+sp[4]+sp[5]); + return (nextproto4_cksum(ip, (const u_int8_t *)(void *)up, len, + IPPROTO_UDP)); } #ifdef INET6 static int udp6_cksum(const struct ip6_hdr *ip6, const struct udphdr *up, u_int len) { - size_t i; - register const u_int16_t *sp; - u_int32_t sum; - union { - struct { - struct in6_addr ph_src; - struct in6_addr ph_dst; - u_int32_t ph_len; - u_int8_t ph_zero[3]; - u_int8_t ph_nxt; - } ph; - u_int16_t pa[20]; - } phu; - - /* pseudo-header */ - memset(&phu, 0, sizeof(phu)); - phu.ph.ph_src = ip6->ip6_src; - phu.ph.ph_dst = ip6->ip6_dst; - phu.ph.ph_len = htonl(len); - phu.ph.ph_nxt = IPPROTO_UDP; - - sum = 0; - for (i = 0; i < sizeof(phu.pa) / sizeof(phu.pa[0]); i++) - sum += phu.pa[i]; - - sp = (const u_int16_t *)up; - - for (i = 0; i < (len & ~1); i += 2) - sum += *sp++; - - if (len & 1) - sum += htons((*(const u_int8_t *)sp) << 8); - - while (sum > 0xffff) - sum = (sum & 0xffff) + (sum >> 16); - sum = ~sum & 0xffff; - - return (sum); + return (nextproto6_cksum(ip6, (const u_int8_t *)(void *)up, len, + IPPROTO_UDP)); } #endif @@ -570,31 +510,46 @@ udp_print(register const u_char *bp, u_int length, } udpipaddr_print(ip, sport, dport); - if (IP_V(ip) == 4 && (vflag > 1) && !Kflag && !fragmented) { - int sum = up->uh_sum; - if (sum == 0) { - (void)printf("[no cksum] "); - } else if (TTEST2(cp[0], length)) { - sum = udp_cksum(ip, up, length + sizeof(struct udphdr)); - if (sum != 0) - (void)printf("[bad udp cksum %x!] ", sum); - else - (void)printf("[udp sum ok] "); + if (vflag && !Kflag && !fragmented) { + /* Check the checksum, if possible. */ + u_int16_t sum, udp_sum; + + /* + * XXX - do this even if vflag == 1? + * TCP does, and we do so for UDP-over-IPv6. + */ + if (IP_V(ip) == 4 && (vflag > 1)) { + udp_sum = EXTRACT_16BITS(&up->uh_sum); + if (udp_sum == 0) { + (void)printf("[no cksum] "); + } else if (TTEST2(cp[0], length)) { + sum = udp_cksum(ip, up, length + sizeof(struct udphdr)); + + if (sum != 0) { + (void)printf("[bad udp cksum 0x%04x -> 0x%04x!] ", + udp_sum, + in_cksum_shouldbe(udp_sum, sum)); + } else + (void)printf("[udp sum ok] "); + } } - } #ifdef INET6 - if (IP_V(ip) == 6 && ip6->ip6_plen && vflag && !Kflag && !fragmented) { - int sum = up->uh_sum; - /* for IPv6, UDP checksum is mandatory */ - if (TTEST2(cp[0], length)) { - sum = udp6_cksum(ip6, up, length + sizeof(struct udphdr)); - if (sum != 0) - (void)printf("[bad udp cksum %x!] ", sum); - else - (void)printf("[udp sum ok] "); + else if (IP_V(ip) == 6 && ip6->ip6_plen) { + /* for IPv6, UDP checksum is mandatory */ + if (TTEST2(cp[0], length)) { + sum = udp6_cksum(ip6, up, length + sizeof(struct udphdr)); + udp_sum = EXTRACT_16BITS(&up->uh_sum); + + if (sum != 0) { + (void)printf("[bad udp cksum 0x%04x -> 0x%04x!] ", + udp_sum, + in_cksum_shouldbe(udp_sum, sum)); + } else + (void)printf("[udp sum ok] "); + } } - } #endif + } if (!qflag) { #define ISPORT(p) (dport == (p) || sport == (p)) @@ -654,9 +609,10 @@ udp_print(register const u_char *bp, u_int length, #ifdef INET6 else if (ISPORT(RIPNG_PORT)) ripng_print((const u_char *)(up + 1), length); - else if (ISPORT(DHCP6_SERV_PORT) || ISPORT(DHCP6_CLI_PORT)) { + else if (ISPORT(DHCP6_SERV_PORT) || ISPORT(DHCP6_CLI_PORT)) dhcp6_print((const u_char *)(up + 1), length); - } + else if (ISPORT(BABEL_PORT) || ISPORT(BABEL_PORT_OLD)) + babel_print((const u_char *)(up + 1), length); #endif /*INET6*/ /* * Kludge in test for whiteboard packets. diff --git a/contrib/tcpdump/print-vrrp.c b/contrib/tcpdump/print-vrrp.c index 899542dac42..8b733d228c3 100644 --- a/contrib/tcpdump/print-vrrp.c +++ b/contrib/tcpdump/print-vrrp.c @@ -110,9 +110,15 @@ vrrp_print(register const u_char *bp, register u_int len, int ttl) int i; char c; - if (TTEST2(bp[0], len) && in_cksum((const u_short*)bp, len, 0)) - printf(", (bad vrrp cksum %x)", - EXTRACT_16BITS(&bp[6])); + if (TTEST2(bp[0], len)) { + struct cksum_vec vec[1]; + + vec[0].ptr = bp; + vec[0].len = len; + if (in_cksum(vec, 1)) + printf(", (bad vrrp cksum %x)", + EXTRACT_16BITS(&bp[6])); + } printf(", addrs"); if (naddrs > 1) printf("(%d)", naddrs); diff --git a/contrib/tcpdump/tcp.h b/contrib/tcpdump/tcp.h index ac83714fe29..45fc21c0d50 100644 --- a/contrib/tcpdump/tcp.h +++ b/contrib/tcpdump/tcp.h @@ -105,6 +105,7 @@ struct tcphdr { #define NFS_PORT 2049 #endif #define MSDP_PORT 639 +#define RPKI_RTR_PORT 2222 /* experimental up until sidr-wg registers a well-known port */ #define LDP_PORT 646 #ifndef SMB_PORT #define SMB_PORT 445 diff --git a/contrib/tcpdump/tcpdump-stdinc.h b/contrib/tcpdump/tcpdump-stdinc.h index c437cc10fe9..d350d1be126 100644 --- a/contrib/tcpdump/tcpdump-stdinc.h +++ b/contrib/tcpdump/tcpdump-stdinc.h @@ -131,10 +131,43 @@ typedef char* caddr_t; #endif /* WIN32 */ -#ifdef INET6 -#include "ip6.h" +#ifndef HAVE___ATTRIBUTE__ +#define __attribute__(x) #endif +/* + * Used to declare a structure unaligned, so that the C compiler, + * if necessary, generates code that doesn't assume alignment. + * This is required because there is no guarantee that the packet + * data we get from libpcap/WinPcap is properly aligned. + * + * This assumes that, for all compilers that support __attribute__: + * + * 1) they support __attribute__((packed)); + * + * 2) for all instruction set architectures requiring strict + * alignment, declaring a structure with that attribute + * causes the compiler to generate code that handles + * misaligned 2-byte, 4-byte, and 8-byte integral + * quantities. + * + * It does not (yet) handle compilers where you can get the compiler + * to generate code of that sort by some other means. + * + * This is required in order to, for example, keep the compiler from + * generating, for + * + * if (bp->bp_htype == 1 && bp->bp_hlen == 6 && bp->bp_op == BOOTPREQUEST) { + * + * in print-bootp.c, code that loads the first 4-byte word of a + * "struct bootp", masking out the bp_hops field, and comparing the result + * against 0x01010600. + * + * Note: this also requires that padding be put into the structure, + * at least for compilers where it's implemented as __attribute__((packed)). + */ +#define UNALIGNED __attribute__((packed)) + #if defined(WIN32) || defined(MSDOS) #define FOPEN_READ_TXT "rt" #define FOPEN_READ_BIN "rb" @@ -147,7 +180,7 @@ typedef char* caddr_t; #define FOPEN_WRITE_BIN FOPEN_WRITE_TXT #endif -#if defined(__GNUC__) && defined(__i386__) && !defined(__ntohl) +#if defined(__GNUC__) && defined(__i386__) && !defined(__APPLE__) && !defined(__ntohl) #undef ntohl #undef ntohs #undef htonl diff --git a/contrib/tcpdump/tcpdump.1.in b/contrib/tcpdump/tcpdump.1.in index 5e1a00f8284..aabda771490 100644 --- a/contrib/tcpdump/tcpdump.1.in +++ b/contrib/tcpdump/tcpdump.1.in @@ -29,7 +29,7 @@ tcpdump \- dump traffic on a network .na .B tcpdump [ -.B \-AbdDefIKlLnNOpqRStuUvxX +.B \-AbdDefhHIJKlLnNOpqRStuUvxX ] [ .B \-B .I buffer_size @@ -56,6 +56,10 @@ tcpdump \- dump traffic on a network .I interface ] [ +.B \-j +.I tstamp_type +] +[ .B \-m .I module ] @@ -256,7 +260,7 @@ Print the link-level header on each dump line. .B \-E Use \fIspi@ipaddr algo:secret\fP for decrypting IPsec ESP packets that are addressed to \fIaddr\fP and contain Security Parameter Index value -\fIspi\fP. This combination may be repeated with comma or newline seperation. +\fIspi\fP. This combination may be repeated with comma or newline separation. .IP Note that setting the secret for IPv4 ESP packets is supported at this time. .IP @@ -272,7 +276,7 @@ The ability to decrypt packets is only present if \fItcpdump\fP was compiled with cryptography enabled. .IP \fIsecret\fP is the ASCII text for ESP secret key. -If preceeded by 0x, then a hex value will be read. +If preceded by 0x, then a hex value will be read. .IP The option assumes RFC2406 ESP, not RFC1827 ESP. The option is only for debugging purposes, and @@ -319,6 +323,13 @@ If used in conjunction with the .B \-C option, filenames will take the form of `\fIfile\fP'. .TP +.B \-h +Print the tcpdump and libpcap version strings, print a usage message, +and exit. +.TP +.B \-H +Attempt to detect 802.11s draft mesh headers. +.TP .B \-i Listen on \fIinterface\fP. If unspecified, \fItcpdump\fP searches the system interface list for the @@ -359,6 +370,18 @@ monitor mode will be shown; if is specified, only those link-layer types available when in monitor mode will be shown. .TP +.B \-j +Set the time stamp type for the capture to \fItstamp_type\fP. The names +to use for the time stamp types are given in +.BR pcap-tstamp-type (@MAN_MISC_INFO@); +not all the types listed there will necessarily be valid for any given +interface. +.TP +.B \-J +List the supported time stamp types for the interface and exit. If the +time stamp type cannot be set for the interface, no time stamp types are +listed. +.TP .B \-K Don't attempt to verify IP, TCP, or UDP checksums. This is useful for interfaces that perform some or all of those checksum calculation in @@ -615,7 +638,10 @@ savefile name as the only argument, make the flags & arguments arrangements and execute the command that you want. .TP .B \-Z -Drops privileges (if root) and changes user ID to +If +.I tcpdump +is running as root, after opening the capture device or input savefile, +but before opening any savefiles for output, change the user ID to .I user and the group ID to the primary group of .IR user . @@ -871,8 +897,8 @@ The general format of a tcp protocol line is: \fISrc\fP and \fIdst\fP are the source and destination IP addresses and ports. \fIFlags\fP are some combination of S (SYN), -F (FIN), P (PUSH), R (RST), W (ECN CWR) or E (ECN-Echo), or a single -`.' (no flags). +F (FIN), P (PUSH), R (RST), U (URG), W (ECN CWR), E (ECN-Echo) or +`.' (ACK), or `none' if no flags are set. \fIData-seqno\fP describes the portion of sequence space covered by the data in this packet (see example below). \fIAck\fP is sequence number of the next data expected the other @@ -919,8 +945,7 @@ bytes and there was a max-segment-size option requesting an mss of Csam replies with a similar packet except it includes a piggy-backed ack for rtsg's SYN. Rtsg then acks csam's SYN. -The `.' means no -flags were set. +The `.' means the ACK flag was set. The packet contained no data so there is no data sequence number. Note that the ack sequence number is a small integer (1). @@ -1266,7 +1291,6 @@ RA, \fInot\fP set) and `|' (truncated message, TC, set). If the `question' section doesn't contain exactly one entry, `[\fIn\fPq]' is printed. - .HD SMB/CIFS decoding .LP @@ -1274,19 +1298,18 @@ SMB/CIFS decoding on UDP/137, UDP/138 and TCP/139. Some primitive decoding of IPX and NetBEUI SMB data is also done. - +.LP By default a fairly minimal decode is done, with a much more detailed decode done if -v is used. Be warned that with -v a single SMB packet may take up a page or more, so only use -v if you really want all the gory details. - -For information on SMB packet formats and what all te fields mean see +.LP +For information on SMB packet formats and what all the fields mean see www.cifs.org or the pub/samba/specs/ directory on your favorite samba.org mirror site. The SMB patches were written by Andrew Tridgell (tridge@samba.org). - .HD NFS Requests and Replies .LP @@ -1639,7 +1662,7 @@ Ethernet interface removed the packet from the wire and when the kernel serviced the `new packet' interrupt. .SH "SEE ALSO" stty(1), pcap(3PCAP), bpf(4), nit(4P), pcap-savefile(@MAN_FILE_FORMATS@), -pcap-filter(@MAN_MISC_INFO@) +pcap-filter(@MAN_MISC_INFO@), pcap-tstamp-type(@MAN_MISC_INFO@) .SH AUTHORS The original authors are: .LP diff --git a/contrib/tcpdump/tcpdump.c b/contrib/tcpdump/tcpdump.c index 424b717690f..52783d3131d 100644 --- a/contrib/tcpdump/tcpdump.c +++ b/contrib/tcpdump/tcpdump.c @@ -94,6 +94,9 @@ netdissect_options *gndo = &Gndo; static int dflag; /* print filter code */ static int Lflag; /* list available data link types and exit */ +#ifdef HAVE_PCAP_SET_TSTAMP_TYPE +static int Jflag; /* list available time stamp types */ +#endif static char *zflag = NULL; /* compress each savefile using a specified command (like gzip or bzip2) */ static int infodelay; @@ -114,7 +117,8 @@ static void ndo_default_print(netdissect_options *, const u_char *, u_int); static void dump_packet_and_trunc(u_char *, const struct pcap_pkthdr *, const u_char *); static void dump_packet(u_char *, const struct pcap_pkthdr *, const u_char *); static void droproot(const char *, const char *); -static void ndo_error(netdissect_options *ndo, const char *fmt, ...); +static void ndo_error(netdissect_options *ndo, const char *fmt, ...) + __attribute__ ((noreturn, format (printf, 2, 3))); static void ndo_warning(netdissect_options *ndo, const char *fmt, ...); #ifdef SIGINFO @@ -132,10 +136,6 @@ RETSIGTYPE requestinfo(int); static void info(int); static u_int packets_captured; -typedef u_int (*if_printer)(const struct pcap_pkthdr *, const u_char *); -typedef u_int (*if_ndo_printer)(struct netdissect_options *ndo, - const struct pcap_pkthdr *, const u_char *); - struct printer { if_printer f; int type; @@ -153,7 +153,6 @@ static struct printer printers[] = { #ifdef DLT_ARCNET_LINUX { arcnet_linux_if_print, DLT_ARCNET_LINUX }, #endif - { ether_if_print, DLT_EN10MB }, { token_if_print, DLT_IEEE802 }, #ifdef DLT_LANE8023 { lane_if_print, DLT_LANE8023 }, @@ -305,13 +304,29 @@ static struct printer printers[] = { }; static struct ndo_printer ndo_printers[] = { + { ether_if_print, DLT_EN10MB }, #ifdef DLT_IPNET { ipnet_if_print, DLT_IPNET }, +#endif +#ifdef DLT_IEEE802_15_4 + { ieee802_15_4_if_print, DLT_IEEE802_15_4 }, +#endif +#ifdef DLT_IEEE802_15_4_NOFCS + { ieee802_15_4_if_print, DLT_IEEE802_15_4_NOFCS }, +#endif +#ifdef DLT_PPI + { ppi_if_print, DLT_PPI }, +#endif +#ifdef DLT_NETANALYZER + { netanalyzer_if_print, DLT_NETANALYZER }, +#endif +#ifdef DLT_NETANALYZER_TRANSPARENT + { netanalyzer_transparent_if_print, DLT_NETANALYZER_TRANSPARENT }, #endif { NULL, 0 }, }; -static if_printer +if_printer lookup_printer(int type) { struct printer *p; @@ -324,7 +339,7 @@ lookup_printer(int type) /* NOTREACHED */ } -static if_ndo_printer +if_ndo_printer lookup_ndo_printer(int type) { struct ndo_printer *p; @@ -361,6 +376,40 @@ struct dump_info { pcap_dumper_t *p; }; +#ifdef HAVE_PCAP_SET_TSTAMP_TYPE +static void +show_tstamp_types_and_exit(const char *device, pcap_t *pd) +{ + int n_tstamp_types; + int *tstamp_types = 0; + const char *tstamp_type_name; + int i; + + n_tstamp_types = pcap_list_tstamp_types(pd, &tstamp_types); + if (n_tstamp_types < 0) + error("%s", pcap_geterr(pd)); + + if (n_tstamp_types == 0) { + fprintf(stderr, "Time stamp type cannot be set for %s\n", + device); + exit(0); + } + fprintf(stderr, "Time stamp types for %s (use option -j to set):\n", + device); + for (i = 0; i < n_tstamp_types; i++) { + tstamp_type_name = pcap_tstamp_type_val_to_name(tstamp_types[i]); + if (tstamp_type_name != NULL) { + (void) fprintf(stderr, " %s (%s)\n", tstamp_type_name, + pcap_tstamp_type_val_to_description(tstamp_types[i])); + } else { + (void) fprintf(stderr, " %d\n", tstamp_types[i]); + } + } + pcap_free_tstamp_types(tstamp_types); + exit(0); +} +#endif + static void show_dlts_and_exit(const char *device, pcap_t *pd) { @@ -402,13 +451,13 @@ show_dlts_and_exit(const char *device, pcap_t *pd) if (lookup_printer(dlts[n_dlts]) == NULL && lookup_ndo_printer(dlts[n_dlts]) == NULL) (void) fprintf(stderr, " (printing not supported)"); - putchar('\n'); + fprintf(stderr, "\n"); } else { (void) fprintf(stderr, " DLT %d (printing not supported)\n", dlts[n_dlts]); } } - free(dlts); + pcap_free_datalinks(dlts); exit(0); } @@ -430,6 +479,16 @@ show_dlts_and_exit(const char *device, pcap_t *pd) #define I_FLAG #endif /* HAVE_PCAP_CREATE */ +#ifdef HAVE_PCAP_SET_TSTAMP_TYPE +#define j_FLAG "j:" +#define j_FLAG_USAGE " [ -j tstamptype ]" +#define J_FLAG "J" +#else /* PCAP_ERROR_TSTAMP_TYPE_NOTSUP */ +#define j_FLAG +#define j_FLAG_USAGE +#define J_FLAG +#endif /* PCAP_ERROR_TSTAMP_TYPE_NOTSUP */ + #ifdef HAVE_PCAP_FINDALLDEVS #ifndef HAVE_PCAP_IF_T #undef HAVE_PCAP_FINDALLDEVS @@ -574,6 +633,7 @@ main(int argc, char **argv) if(wsockinit() != 0) return 1; #endif /* WIN32 */ + jflag=-1; /* not set */ gndo->ndo_Oflag=1; gndo->ndo_Rflag=1; gndo->ndo_dlt=-1; @@ -600,9 +660,8 @@ main(int argc, char **argv) smiInit("tcpdump"); #endif - opterr = 0; while ( - (op = getopt(argc, argv, "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:i:" I_FLAG "KlLm:M:nNOpqr:Rs:StT:u" U_FLAG "vw:W:xXy:Yz:Z:")) != -1) + (op = getopt(argc, argv, "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOpqr:Rs:StT:u" U_FLAG "vw:W:xXy:Yz:Z:")) != -1) switch (op) { case 'a': @@ -695,6 +754,14 @@ main(int argc, char **argv) } break; + case 'h': + usage(); + break; + + case 'H': + ++Hflag; + break; + case 'i': if (optarg[0] == '0' && optarg[1] == 0) error("Invalid adapter index"); @@ -742,6 +809,18 @@ main(int argc, char **argv) break; #endif /* HAVE_PCAP_CREATE */ +#ifdef HAVE_PCAP_SET_TSTAMP_TYPE + case 'j': + jflag = pcap_tstamp_type_name_to_val(optarg); + if (jflag < 0) + error("invalid time stamp type %s", optarg); + break; + + case 'J': + Jflag++; + break; +#endif + case 'l': #ifdef WIN32 /* @@ -856,6 +935,8 @@ main(int argc, char **argv) packettype = PT_TFTP; else if (strcasecmp(optarg, "aodv") == 0) packettype = PT_AODV; + else if (strcasecmp(optarg, "carp") == 0) + packettype = PT_CARP; else error("unknown packet type `%s'", optarg); break; @@ -1034,6 +1115,10 @@ main(int argc, char **argv) pd = pcap_create(device, ebuf); if (pd == NULL) error("%s", ebuf); +#ifdef HAVE_PCAP_SET_TSTAMP_TYPE + if (Jflag) + show_tstamp_types_and_exit(device, pd); +#endif /* * Is this an interface that supports monitor mode? */ @@ -1043,16 +1128,16 @@ main(int argc, char **argv) supports_monitor_mode = 0; status = pcap_set_snaplen(pd, snaplen); if (status != 0) - error("%s: pcap_set_snaplen failed: %s", + error("%s: Can't set snapshot length: %s", device, pcap_statustostr(status)); status = pcap_set_promisc(pd, !pflag); if (status != 0) - error("%s: pcap_set_promisc failed: %s", + error("%s: Can't set promiscuous mode: %s", device, pcap_statustostr(status)); if (Iflag) { status = pcap_set_rfmon(pd, 1); if (status != 0) - error("%s: pcap_set_rfmon failed: %s", + error("%s: Can't set monitor mode: %s", device, pcap_statustostr(status)); } status = pcap_set_timeout(pd, 1000); @@ -1062,9 +1147,17 @@ main(int argc, char **argv) if (Bflag != 0) { status = pcap_set_buffer_size(pd, Bflag); if (status != 0) - error("%s: pcap_set_buffer_size failed: %s", + error("%s: Can't set buffer size: %s", device, pcap_statustostr(status)); } +#ifdef HAVE_PCAP_SET_TSTAMP_TYPE + if (jflag != -1) { + status = pcap_set_tstamp_type(pd, jflag); + if (status < 0) + error("%s: Can't set time stamp type: %s", + device, pcap_statustostr(status)); + } +#endif status = pcap_activate(pd); if (status < 0) { /* @@ -1170,14 +1263,40 @@ main(int argc, char **argv) (void)setsignal(SIGPIPE, cleanup); (void)setsignal(SIGTERM, cleanup); (void)setsignal(SIGINT, cleanup); - (void)setsignal(SIGCHLD, child_cleanup); #endif /* WIN32 */ +#if defined(HAVE_FORK) || defined(HAVE_VFORK) + (void)setsignal(SIGCHLD, child_cleanup); +#endif /* Cooperate with nohup(1) */ #ifndef WIN32 if ((oldhandler = setsignal(SIGHUP, cleanup)) != SIG_DFL) (void)setsignal(SIGHUP, oldhandler); #endif /* WIN32 */ +#ifndef WIN32 + /* + * If a user name was specified with "-Z", attempt to switch to + * that user's UID. This would probably be used with sudo, + * to allow tcpdump to be run in a special restricted + * account (if you just want to allow users to open capture + * devices, and can't just give users that permission, + * you'd make tcpdump set-UID or set-GID). + * + * Tcpdump doesn't necessarily write only to one savefile; + * the general only way to allow a -Z instance to write to + * savefiles as the user under whose UID it's run, rather + * than as the user specified with -Z, would thus be to switch + * to the original user ID before opening a capture file and + * then switch back to the -Z user ID after opening the savefile. + * Switching to the -Z user ID only after opening the first + * savefile doesn't handle the general case. + */ + if (getuid() == 0 || geteuid() == 0) { + if (username || chroot_dir) + droproot(username, chroot_dir); + } +#endif /* WIN32 */ + if (pcap_setfilter(pd, &fcode) < 0) error("%s", pcap_geterr(pd)); if (WFileName) { @@ -1207,6 +1326,10 @@ main(int argc, char **argv) callback = dump_packet; pcap_userdata = (u_char *)p; } +#ifdef HAVE_PCAP_DUMP_FLUSH + if (Uflag) + pcap_dump_flush(p); +#endif } else { type = pcap_datalink(pd); printinfo.ndo_type = 1; @@ -1227,16 +1350,7 @@ main(int argc, char **argv) callback = print_packet; pcap_userdata = (u_char *)&printinfo; } -#ifndef WIN32 - /* - * We cannot do this earlier, because we want to be able to open - * the file (if done) for writing before giving up permissions. - */ - if (getuid() == 0 || geteuid() == 0) { - if (username || chroot_dir) - droproot(username, chroot_dir); - } -#endif /* WIN32 */ + #ifdef SIGINFO /* * We can't get statistics when reading from a file rather @@ -1365,13 +1479,13 @@ cleanup(int signo _U_) On windows, we do not use a fork, so we do not care less about waiting a child processes to die */ -#ifndef WIN32 +#if defined(HAVE_FORK) || defined(HAVE_VFORK) static RETSIGTYPE child_cleanup(int signo _U_) { wait(NULL); } -#endif /* WIN32 */ +#endif /* HAVE_FORK && HAVE_VFORK */ static void info(register int verbose) @@ -1392,34 +1506,41 @@ info(register int verbose) if (!verbose) fprintf(stderr, "%s: ", program_name); - (void)fprintf(stderr, "%u packets captured", packets_captured); + (void)fprintf(stderr, "%u packet%s captured", packets_captured, + PLURAL_SUFFIX(packets_captured)); if (!verbose) fputs(", ", stderr); else putc('\n', stderr); - (void)fprintf(stderr, "%u packets received by filter", stat.ps_recv); + (void)fprintf(stderr, "%u packet%s received by filter", stat.ps_recv, + PLURAL_SUFFIX(stat.ps_recv)); if (!verbose) fputs(", ", stderr); else putc('\n', stderr); - (void)fprintf(stderr, "%u packets dropped by kernel", stat.ps_drop); + (void)fprintf(stderr, "%u packet%s dropped by kernel", stat.ps_drop, + PLURAL_SUFFIX(stat.ps_drop)); if (stat.ps_ifdrop != 0) { if (!verbose) fputs(", ", stderr); else putc('\n', stderr); - (void)fprintf(stderr, "%u packets dropped by interface\n", - stat.ps_ifdrop); + (void)fprintf(stderr, "%u packet%s dropped by interface\n", + stat.ps_ifdrop, PLURAL_SUFFIX(stat.ps_ifdrop)); } else putc('\n', stderr); infoprint = 0; } -#ifndef WIN32 +#if defined(HAVE_FORK) || defined(HAVE_VFORK) static void compress_savefile(const char *filename) { +# ifdef HAVE_FORK if (fork()) +# else + if (vfork()) +# endif return; /* * Set to lowest priority so that this doesn't disturb the capture @@ -1435,15 +1556,20 @@ compress_savefile(const char *filename) zflag, filename, strerror(errno)); +# ifdef HAVE_FORK + exit(1); +# else + _exit(1); +# endif } -#else /* WIN32 */ +#else /* HAVE_FORK && HAVE_VFORK */ static void compress_savefile(const char *filename) { fprintf(stderr, - "compress_savefile failed. Functionality not implemented under windows\n"); + "compress_savefile failed. Functionality not implemented under your system\n"); } -#endif /* WIN32 */ +#endif /* HAVE_FORK && HAVE_VFORK */ static void dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp) @@ -1782,17 +1908,17 @@ usage(void) #endif /* WIN32 */ #endif /* HAVE_PCAP_LIB_VERSION */ (void)fprintf(stderr, -"Usage: %s [-aAbd" D_FLAG "ef" I_FLAG "KlLnNOpqRStu" U_FLAG "vxX]" B_FLAG_USAGE " [ -c count ]\n", program_name); +"Usage: %s [-aAbd" D_FLAG "efhH" I_FLAG J_FLAG "KlLnNOpqRStu" U_FLAG "vxX]" B_FLAG_USAGE " [ -c count ]\n", program_name); (void)fprintf(stderr, "\t\t[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]\n"); (void)fprintf(stderr, -"\t\t[ -i interface ] [ -M secret ] [ -r file ]\n"); +"\t\t[ -i interface ]" j_FLAG_USAGE " [ -M secret ]\n"); (void)fprintf(stderr, -"\t\t[ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ]\n"); +"\t\t[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]\n"); (void)fprintf(stderr, -"\t\t[ -y datalinktype ] [ -z command ] [ -Z user ]\n"); +"\t\t[ -W filecount ] [ -y datalinktype ] [ -z command ]\n"); (void)fprintf(stderr, -"\t\t[ expression ]\n"); +"\t\t[ -Z user ] [ expression ]\n"); exit(1); } diff --git a/contrib/tcpdump/tests/02-sunrise-sunset-esp.puu b/contrib/tcpdump/tests/02-sunrise-sunset-esp.puu deleted file mode 100644 index 0ceffc1c1c8..00000000000 --- a/contrib/tcpdump/tests/02-sunrise-sunset-esp.puu +++ /dev/null @@ -1,34 +0,0 @@ -begin 644 02-sunrise-sunset-esp.pcap -MU,.RH0(`!``````````````&```!``````````````"6````E@```!```&1D -M11```&1D(P@`10``B/]G``!`,O:5P`$"%\`!`BT2-%9X`````4P@12\\L)(1 -MTZ=(S>7($>.<3N@\_I:AY"K/TKAZJP719"NCKYP;PT(0+$"M%=]-X"`*8V.' -M-'$1A]02"3N#OZI#&1R]A*1;`G8S@YFQ]`````(:<$'CW)%VZ',2KQMB@CN?'"^GJ<=: -MD-0`+.V^J'2AK).'XQ_B"B8:[%A_+K[6KS2'XR[UN`,R"BJP?^].ZM#/[$)# -M17^!D"8_[BZ>GU4Z*$7I"N$U*>J47?C-4;I>#`%6+#0%]D75YC']*Z\````` -M`````)8```"6````$```9&1%$```9&0C"`!%``"(_VD``$`R]I/``0(7P`$" -M+1(T5G@````#7?C-4;I>#`%@W%89?QJ#$TJ,4G\FO&HO=F+,,%1E(]);XI]T -MV7W.RY$2=JZ1%!QCNX[;^.JD4W91;7)NJWV2MF4?7`=&_3OWW%V&6RIXKB75 -M#;2TWNL"A:MF!I@_5R^]L6;Z`L?E@1:T&71G``````````"6````E@```!`` -M`&1D11```&1D(P@`10``B/]J``!`,O:2P`$"%\`!`BT2-%9X````!*MF!I@_ -M5R^]%';9*Q:S_B]]O_8FV:2K1A!]/SQHI7>OS815*I?4%/:.=BBJUEGJ(X8\ -MP1E/@&P\9MR)DP3[UCWI@,MR%A$\CR]=G(("[CFB7AUN$AENZOO&\:7% -M2KLW<'NP,L(I=!;8=0``````````E@```)8````0``!D9$40``!D9",(`$4` -M`(C_:P``0#+VD<`!`A?``0(M$C16>`````5NZOO&\:7%2J12,9;LOK"-S,=$ -MO0]X+J(OJQED#PLBRY[\^352UZK&576,Z<:%73AWV3:;Y/:=@(` -M`````````)8```"6````$```9&1%$```9&0C"`!%``"(_VP``$`R]I#``0(7 -MP`$"+1(T5G@````&M,^T?7>6,Z=>N_YZQFV[H1^6\!/I*IMAOHZE\E0M.Z!X -M#[0EG3#>%]7`]*2F?@S4X2''TK09J@NG/.HEXCE./..K^'-@":X[\?0L+B`S -MQA\HTK\'J]:S]N6O`]\)NQD)9;H2P\K`^NX37`R5``````````"6````E@`` -M`!```&1D11```&1D(P@`10``B/]M``!`,O:/P`$"%\`!`BT2-%9X````!^6O -M`]\)NQD)>BYZ>`/DA=N;A2...3-7FZOK?:5KGXBN`/E?$\[-11-$G#E;(>N" -M+<$/YP'SM$>16LU18&Q]9)$]0)/M]:2Z#A6]-,SM*>FI/`X*K-*-:KS3IW<" -MO(>(P(K=:X::SJ;O[J>0K```````````E@```)8````0``!D9$40``!D9",( -M`$4``(C_;@``0#+VCL`!`A?``0(M$C16>`````C3IW<"O(>(P'-43;C[`MCD -M`BMZAX]F!?'Z$8Q"5HYMVDC9"8I^O(Z4!/)`/IVD-(ZK)_52-H2XK+,(-LR) -MM)K#XLF">KY0>C?\[MA%3F%$?ORJ@:>O]5H>?-$OQH)J:['.C0J(%P -MVF'>(TU6&*"9A,`,/KS\:>DH>O_L(51)_[YY"L9?8'?J4V:_.]B+6UR\T>39D+=NA;$``````````*8```"F````$``` -M9&1%$```9&0C"`!%``"8_.L``$`R^0'``0(7P`$"+=$C16<````";K2P<-=Q -MYE]@=^I39K\[V$1HDU9'L,6BVK.^B4]E6QY&:?3?T)G?"RSU;X!J]]7S)<`, -M*L!SYO^RUWR?!EIJMWU=5B406YL-I`]LK`^;-3%(NEY#R`ST=W40=:*[M$*8 -M#`GLTK(5ZCS"BC@``````````I@```*8````0 -M``!D9$40``!D9",(`$4``)C\[```0#+Y`,`!`A?``0(MT2-%9P````,-RO@E -M%F`X`Y3]7F3YK9N>=6-;U&'6">_4H80DMY^Z9E3ZL3[ONN*L<"Z@7(VO]XT^ -M/2JP<(/^8NTO-4\/B5AJEC4N;,\"7-&(;9AM_2G5A1C.[LBK3')P?AE;$I[) -M!8N&RC?OTD77ELURFXRD/JD(:@RER``````````"F````I@`` -M`!```&1D11```&1D(P@`10``F/SM``!`,OC_P`$"%\`!`BW1(T5G````!(;* -M-^_21=S8F&G50PJ5Y>5K%@R;)A(E<5YD'@86@GT"-&&MHP*.A=?%=:FDZH=4 -M*9":>]'G'CB4%2?PJ"2^H*51\8P!9T`X3#;F+H$[4Z$7ZL0<\S=S\%`:BW9U2'@U^@D,,:.P``````````*8```"F -M````$```9&1%$```9&0C"`!%``"8_.X``$`R^/[``0(7P`$"+=$C16<````% -M,2>GIY3H1?JQ!SS-W/P4!BW&*&A[$!XGK<^M^>_X193"G"1QTWG>Q"CO25$" -MPM+1+8[6&(17\EE\P:6-WVPT=911?@'-Z,,/UVZ2!QV(X4513U9]P62CJMS> -M^ODBGHU=%T.H2&Z<4,8(!4,2[&A4^H="L:+`=4G?*(7,2@``````````I@`` -M`*8````0``!D9$40``!D9",(`$4``)C\[P``0#+X_<`!`A?``0(MT2-%9P`` -M``870ZA(;IQ0Q@@%0Q+L:%3Z@*HQPZA]3STWDY#CYJGOJH)K>I' -MEHMF"X!^G,H@,YWT7^=60.3/$7?AYH)G9GBD%%#,D]!EDA]B*?UE>U96+"5\ -MK=""/.LO'__^;$NI`L#D]@&G?Z7B2O#GI?NDK -MF[7JPN,8V\H>%G+)'+%+FL*&\8+H2^KFWF5YQ:$4V!,1?G;=OYD;!,3YD'V( -MW[Y!I(U=X9[\:L)(5GBJ,B!-5N$.CGV$VLD^R?Z,KL[AMI(ZC-P````````` -M`*8```"F````$```9&1%$```9&0C"`!%``"8_/$``$`R^/O``0(7P`$"+=$C -M16<````(PDA6>*HR($U6X0Z.?83:R;Y0&'2065/"*M'ELXD?1%3\L3TC.UK -HKWB(C5O@78>9LQ^<0Z6]F=:<;@[>L^;/\-6WB81[GX)LGD@`` -` -end diff --git a/contrib/tcpdump/tests/08-sunrise-sunset-esp2.puu b/contrib/tcpdump/tests/08-sunrise-sunset-esp2.puu deleted file mode 100644 index 4785f2b808c..00000000000 --- a/contrib/tcpdump/tests/08-sunrise-sunset-esp2.puu +++ /dev/null @@ -1,43 +0,0 @@ -begin 644 08-sunrise-sunset-esp2.pcap -MU,.RH0(`!``````````````&```!``````````````#.````S@```!```&1D -M11```&1D(P@`10``P"E-``!`,LQXP`$"%\`!`BT2-%9X`````4=!+\5+F8`+ -M[[NOU-#98*AO5\780X[VDXF@2W8<10:J!'!Z!-[7N4CFNRKIH;PUA1SL"Y9\ -M-?_3N_,W/@*T+C/"]=S[`;D!/;`SR5,3+><9K.^\9N><18TY9Z\!I\S./L8R -MFE53,S6Y5X_Z\(T)ZIUS?X$8>&(_MT1"!SV:VPP!\XU$[3S-5L)4-O"&>]`Z -M1:./61=%C6`6U1/65"A&KUE902]*``````````#.````S@```!```&1D11`` -M`&1D(P@`10``P"E/``!`,LQVP`$"%\`!`BT2-%9X`````CIU^SX%;G^!GUSP -MSA -ML7P6FM81),N>T/1Z'"P7H5;```````````#.````S@```!```&1D11```&1D -M(P@`10``P"E1``!`,LQTP`$"%\`!`BT2-%9X`````R4)-P&F>HPK/?_$MTFC -M^TOO=/L#W_APTK6MIH_BC*I7\L<,9(?/0M"HK3[T3F;(Y2V70$P5?D'7GFIB -MJZ/C",S/BD!9N8GV"\.;GVME[P!@!B1"DT=1W0_75FMI23H!T2^C);4GY>`I -M-2T^O_0_WU&$)&+/P)%[TQUQ-T7G%\RXYJT0HO[$=< -M`@@TL1#(Y980]E*/!^2@G`*&S9O^QMS1S?/`TL=5F9B(12?(145>Y2I+;+T? -MKWUD@&.7U36]K-$[.%9CB*FK^E8>N:K/)4#$]ZO/:=#;MRH-)_139\,W6M4T -M7SQ?BBX>,+A3#BB5^O=>+GKIC-4]5VBP)D-S7-)\W&;<@_J@,*!``````````#.````S@```!```&1D11```&1D(P@`10`` -MP"E5``!`,LQPP`$"%\`!`BT2-%9X````!0OIFA;,@2C4HF3>5!-C(0>5LR0" -M='1\OQ.!-?@D(U0!453"``````````#.````S@```!```&1D11```&1D(P@`10``P"E7 -M``!`,LQNP`$"%\`!`BT2-%9X````!I0M"-THEF=+!L=>A3N,\1+"'Z7(J?O0 -M.B?)(#X=/5F-.">%3.X'(=JKK:WZMN -M=B+^Q3"(KE\1299]=5E,'.&U(`H9N)+>9FS/`CA*>D^>AV.-C(S\)BM&)*XM -M^BF__^<_``````````#.````S@```!```&1D11```&1D(P@`10``P"E9``!` -M,LQLP`$"%\`!`BT2-%9X````!R"SQ'[6%(;Q>>O+]CS6D*+AD3IMC\^MMK8[ -M:T3)KM06!G^.H\>%UAT@)X6JL9\3V.HR"+_Q^_T-O$Y_S":_TP;V,LIV1O]H -M-G@DOL'V-5)O@%<%!#O$2V,AS@W7(&$IX.YKK]\K#>FITU)<>O42T2GKFW+^ -M\/[,>E4P[Q"+7O,Y1(R22LND[H+469(%3,SN&3:U:/I`'&R@<`HKGOV,^#L9,QF%)W^9!VFM -MXG'XY]CWI5VF33?7,*P?6:.PS'&[\N$7W<*==+;P*$./4*OH&=O,6G!JIN>I -M'ZDP*D&4K>SK-\/!7\Z&<&5J4%NU?NRM&25'*_"'UE3VH&?U]/V@932UYZT\ -` -end diff --git a/contrib/tcpdump/tests/TESTLIST b/contrib/tcpdump/tests/TESTLIST deleted file mode 100644 index bbc19b62b0f..00000000000 --- a/contrib/tcpdump/tests/TESTLIST +++ /dev/null @@ -1,51 +0,0 @@ -# BGP test -bgp_vpn_attrset bgp_vpn_attrset.pcap bgp_vpn_attrset.out -t -v - -# EAP tests -eapon1 eapon1.pcap eapon1.out -t - -# ESP tests -esp0 02-sunrise-sunset-esp.pcap esp0.out -t -esp1 02-sunrise-sunset-esp.pcap esp1.out -t -E "0x12345678@192.1.2.45 3des-cbc-hmac96:0x4043434545464649494a4a4c4c4f4f515152525454575758" -esp2 08-sunrise-sunset-esp2.pcap esp2.out -t -E "0x12345678@192.1.2.45 3des-cbc-hmac96:0x43434545464649494a4a4c4c4f4f51515252545457575840,0xabcdabcd@192.0.1.1 3des-cbc-hmac96:0x434545464649494a4a4c4c4f4f5151525254545757584043" -esp3 02-sunrise-sunset-esp.pcap esp1.out -t -E "3des-cbc-hmac96:0x4043434545464649494a4a4c4c4f4f515152525454575758" -esp4 08-sunrise-sunset-esp2.pcap esp2.out -t -E "file esp-secrets.txt" -esp5 08-sunrise-sunset-aes.pcap esp5.out -t -E "file esp-secrets.txt" -espudp1 espudp1.pcap espudp1.out -t -E "file esp-secrets.txt" - -# ISAKMP tests -isakmp1 isakmp-delete-segfault.pcap isakmp1.out -t -isakmp2 isakmp-pointer-loop.pcap isakmp2.out -t -isakmp3 isakmp-identification-segfault.pcap isakmp3.out -t -v -isakmp4 isakmp4500.pcap isakmp4.out -t -E "file esp-secrets.txt" - -# LMP tests (what is it?) -# fails right now. -#lmp lmp.pcap lmp.out -t -v -v - -# MPLS tests -mpls-ldp-hello mpls-ldp-hello.pcap mpls-ldp-hello.out -t -v - -# OSPF tests -ospf-gmpls ospf-gmpls.pcap ospf-gmpls.out -t -v - -# IKEv2 tests -ikev2four ikev2four.pcap ikev2four.out -t -v -ikev2fourv ikev2four.pcap ikev2fourv.out -t -v -v -v -ikev2fourv4 ikev2four.pcap ikev2fourv4.out -t -v -v -v -v -ikev2pI2 ikev2pI2.pcap ikev2pI2.out -t -E "file ikev2pI2-secrets.txt" -v -v -v -v - -# IETF ROLL RPL packets -dio01 dio.pcap dio.out -t -v - -# IPNET encapsulated site -e1000g e1000g.pcap e1000g.out -t - -# IETF FORCES WG packets and printer -forces01 forces1.pcap forces1.out -t -forces02 forces2.pcap forces2.out -t -forces02v forces2.pcap forces2v.out -t -v -forces02vv forces2.pcap forces2vv.out -t -v -v -forces01vvv forces1.pcap forces1vvv.out -t -v -v -v -forces01vvvv forces1.pcap forces1vvvv.out -t -v -v -v -v - diff --git a/contrib/tcpdump/tests/TESTonce b/contrib/tcpdump/tests/TESTonce deleted file mode 100755 index 40d544b04f4..00000000000 --- a/contrib/tcpdump/tests/TESTonce +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/perl - -system("mkdir -p NEW DIFF"); - -if(@ARGV == 1) { - open(TESTLIST, "TESTLIST") || die "can not open TESTLIST: $!\n"; - $wanted = $ARGV[0]; - #print "Searching for test case $wanted\n"; - while() { - #print "Processing $_\n"; - next unless (/^$wanted/); - - chop; - ($name,$input,$output,$options)=split(/\s+/,$_, 4); - last; - } - close(TESTLIST); - - die "Can not find test $wanted\n" unless defined($input); - -} elsif(@ARGV == 4) { - $name=$ARGV[0]; - $input=$ARGV[1]; - $output=$ARGV[2]; - $options=$ARGV[3]; -} else { - print "Usage: TESTonce name [input output options]\n"; - exit 20; -} - -print "Running $name. \n"; -print " Input: $input, OUTPUT: $output, OPTIONS: $options\n"; - -if (! -f $input) { - ($puu = $input) =~ s/\.pcap/\.puu/; - if( -f $puu) { - print "Uudecoding $puu to make $input\n"; - system("uudecode $puu"); - } -} - -print " "; -exec("../tcpdump -n -r $input $options | tee NEW/$output | diff -w - $output >DIFF/$output.diff"); -@cores = glob("core*"); -exit 10 if (@cores > 0); -exit 0; diff --git a/contrib/tcpdump/tests/TESTrun.sh b/contrib/tcpdump/tests/TESTrun.sh deleted file mode 100755 index 656974dd7c7..00000000000 --- a/contrib/tcpdump/tests/TESTrun.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/sh - -mkdir -p NEW -mkdir -p DIFF -passed=0 -failed=0 - -# first run any specific tests. -for i in *.sh -do - case $i in TEST*.sh) continue;; esac - - if sh ./$i >DIFF/$i.result - then - echo $i: passed. - rm -f DIFF/$i.result - passed=$(($passed + 1)) - else - echo $i: failed. - failed=$(($failed + 1)) - fi -done - -echo $passed >.passed -echo $failed >.failed - -# now run typical tests -cat TESTLIST | while read name input output options -do - case $name in - \#*) continue;; - '') continue;; - esac - - if ./TESTonce $name $input $output "$options" - then - echo $name: passed. - rm -f DIFF/$output.diff - passed=$(($passed + 1)) - echo $passed >.passed - else - echo $name: failed. - failed=$(($failed + 1)) - echo $failed >.failed - fi -done - -# I hate shells with their stupid, useless subshells. -passed=`cat .passed` -failed=`cat .failed` - -# exit with number of failing tests. -echo -echo -printf "%4u tests failed\n" $failed -printf "%4u tests passed\n" $passed -echo -echo -exit $failed - - - - diff --git a/contrib/tcpdump/tests/bgp-infinite-loop.pcap b/contrib/tcpdump/tests/bgp-infinite-loop.pcap deleted file mode 100644 index 9f07d412282..00000000000 Binary files a/contrib/tcpdump/tests/bgp-infinite-loop.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/bgp_vpn_attrset.out b/contrib/tcpdump/tests/bgp_vpn_attrset.out deleted file mode 100644 index a0a9f1c097b..00000000000 --- a/contrib/tcpdump/tests/bgp_vpn_attrset.out +++ /dev/null @@ -1,19 +0,0 @@ -IP (tos 0xc0, ttl 62, id 58628, offset 0, flags [none], proto TCP (6), length 173) - 12.4.4.4.2051 > 12.1.1.1.179: Flags [P.], cksum 0xcf18 (correct), seq 3293077573:3293077694, ack 3348108582, win 16384, options [nop,nop,TS val 383131 ecr 890299], length 121: BGP, length: 121 - Update Message (2), length: 121 - Origin (1), length: 1, Flags [T]: IGP - AS Path (2), length: 0, Flags [T]: empty - Local Preference (5), length: 4, Flags [T]: 100 - Extended Community (16), length: 8, Flags [OT]: - target (0x0002), Flags [none]: 300:300 (= 0.0.1.44) - Attribute Set (128), length: 36, Flags [OT]: - Origin AS: 65001 - Origin (1), length: 1, Flags [T]: IGP - AS Path (2), length: 4, Flags [T]: 5555 - Local Preference (5), length: 4, Flags [T]: 44 - Originator ID (9), length: 4, Flags [O]: 22.5.5.5 - Cluster List (10), length: 4, Flags [O]: 22.5.5.5 - Multi-Protocol Reach NLRI (14), length: 30, Flags [OE]: - AFI: IPv4 (1), SAFI: labeled VPN Unicast (128) - nexthop: RD: 0:0 (= 0.0.0.0), 12.4.4.4, nh-length: 12, no SNPA - RD: 500:500 (= 0.0.1.244), 133.0.0.0/8, label:100208 (bottom) diff --git a/contrib/tcpdump/tests/bgp_vpn_attrset.pcap b/contrib/tcpdump/tests/bgp_vpn_attrset.pcap deleted file mode 100644 index e60aff5c838..00000000000 Binary files a/contrib/tcpdump/tests/bgp_vpn_attrset.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/chdlc-slarp-short.pcap b/contrib/tcpdump/tests/chdlc-slarp-short.pcap deleted file mode 100644 index 41313dcca9b..00000000000 Binary files a/contrib/tcpdump/tests/chdlc-slarp-short.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/chdlc-slarp.pcap b/contrib/tcpdump/tests/chdlc-slarp.pcap deleted file mode 100644 index 1521443a8f1..00000000000 Binary files a/contrib/tcpdump/tests/chdlc-slarp.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/dio.out b/contrib/tcpdump/tests/dio.out deleted file mode 100644 index fd0846af77a..00000000000 --- a/contrib/tcpdump/tests/dio.out +++ /dev/null @@ -1 +0,0 @@ -IP6 (hlim 255, next-header ICMPv6 (58) payload length: 24) fe80::1000:ff:fe64:6423 > ff02::1: [icmp6 sum ok] ICMP6, RPL, length 24, DAG Information Object [seq:10,instance:42,rank:1,dagid:thisismynicedag1] diff --git a/contrib/tcpdump/tests/dio.pcap b/contrib/tcpdump/tests/dio.pcap deleted file mode 100644 index 81706352a56..00000000000 Binary files a/contrib/tcpdump/tests/dio.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/e1000g.out b/contrib/tcpdump/tests/e1000g.out deleted file mode 100644 index 0cc3b9e1003..00000000000 --- a/contrib/tcpdump/tests/e1000g.out +++ /dev/null @@ -1,20 +0,0 @@ -IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 0, length 64 -IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 0, length 64 -IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 1, length 64 -IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 1, length 64 -IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 2, length 64 -IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 2, length 64 -IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 3, length 64 -IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 3, length 64 -IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 4, length 64 -IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 4, length 64 -IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 5, length 64 -IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 5, length 64 -IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 6, length 64 -IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 6, length 64 -IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 7, length 64 -IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 7, length 64 -IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 8, length 64 -IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 8, length 64 -IP 129.146.106.55 > 10.5.233.117: ICMP echo request, id 6901, seq 9, length 64 -IP 10.5.233.117 > 129.146.106.55: ICMP echo reply, id 6901, seq 9, length 64 diff --git a/contrib/tcpdump/tests/e1000g.pcap b/contrib/tcpdump/tests/e1000g.pcap deleted file mode 100644 index 11b0174504a..00000000000 Binary files a/contrib/tcpdump/tests/e1000g.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/eapon1.gdbinit b/contrib/tcpdump/tests/eapon1.gdbinit deleted file mode 100644 index 37ad0bcd029..00000000000 --- a/contrib/tcpdump/tests/eapon1.gdbinit +++ /dev/null @@ -1 +0,0 @@ -set args -r eapon1.pcap diff --git a/contrib/tcpdump/tests/eapon1.out b/contrib/tcpdump/tests/eapon1.out deleted file mode 100644 index 69f7537c09c..00000000000 --- a/contrib/tcpdump/tests/eapon1.out +++ /dev/null @@ -1,114 +0,0 @@ -IP 192.168.1.249.138 > 192.168.1.255.138: NBT UDP PACKET(138) -IP 192.168.1.249.138 > 192.168.1.255.138: NBT UDP PACKET(138) -IP 192.168.1.249.138 > 192.168.1.255.138: NBT UDP PACKET(138) -IP 192.168.1.249.137 > 192.168.1.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST -IP 192.168.1.249.137 > 192.168.1.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST -IP 192.168.1.249.137 > 192.168.1.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST -IP 192.168.1.249.138 > 192.168.1.255.138: NBT UDP PACKET(138) -IP 192.168.1.249.137 > 192.168.1.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST -IP 192.168.1.249.137 > 192.168.1.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST -IP 192.168.1.249.137 > 192.168.1.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST -ARP, Request who-has 192.168.1.1 tell 192.168.1.249, length 28 -ARP, Reply 192.168.1.1 is-at 00:0d:88:4f:25:91, length 46 -IP 192.168.1.249.68 > 192.168.1.1.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300 -EAP packet (0) v1, len 5 -IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300 -IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300 -EAPOL start (1) v1, len 0 -EAP packet (0) v1, len 5 -EAP packet (0) v1, len 45 -EAP packet (0) v1, len 20 -EAP packet (0) v1, len 76 -EAP packet (0) v1, len 80 -EAP packet (0) v1, len 28 -EAP packet (0) v1, len 4 -EAPOL key (3) v1, len 57 -EAPOL key (3) v1, len 44 -IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300 -IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300 -IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300 -EAPOL start (1) v1, len 0 -EAP packet (0) v1, len 5 -EAP packet (0) v1, len 45 -EAP packet (0) v1, len 20 -EAP packet (0) v1, len 76 -EAP packet (0) v1, len 80 -EAP packet (0) v1, len 28 -EAP packet (0) v1, len 4 -EAPOL key (3) v1, len 57 -EAPOL key (3) v1, len 44 -ARP, Request who-has 169.254.67.194 tell 169.254.67.194, length 28 -ARP, Request who-has 169.254.67.194 tell 169.254.67.194, length 28 -ARP, Request who-has 169.254.67.194 tell 169.254.67.194, length 28 -IP 169.254.67.194.4299 > 239.255.255.250.1900: UDP, length 133 -IP 169.254.67.194 > 224.0.0.22: igmp v3 report, 1 group record(s) -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194 > 224.0.0.22: igmp v3 report, 1 group record(s) -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300 -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.4299 > 239.255.255.250.1900: UDP, length 133 -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -EAPOL start (1) v1, len 0 -EAP packet (0) v1, len 5 -EAP packet (0) v1, len 45 -EAP packet (0) v1, len 20 -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -EAP packet (0) v1, len 76 -EAP packet (0) v1, len 80 -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -EAP packet (0) v1, len 28 -EAP packet (0) v1, len 4 -EAPOL key (3) v1, len 57 -EAPOL key (3) v1, len 44 -IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300 -IP 169.254.67.194.4299 > 239.255.255.250.1900: UDP, length 133 -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300 -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST -IP 169.254.67.194.137 > 169.254.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST -IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:04:23:57:a5:7a, length 300 -EAPOL start (1) v1, len 0 -EAP packet (0) v1, len 5 -EAP packet (0) v1, len 45 -EAP packet (0) v1, len 20 -IP 169.254.67.194.138 > 169.254.255.255.138: NBT UDP PACKET(138) -EAP packet (0) v1, len 76 -EAP packet (0) v1, len 80 -EAP packet (0) v1, len 28 -EAP packet (0) v1, len 4 -EAPOL key (3) v1, len 57 -EAPOL key (3) v1, len 44 diff --git a/contrib/tcpdump/tests/eapon1.puu b/contrib/tcpdump/tests/eapon1.puu deleted file mode 100644 index 25c14367780..00000000000 --- a/contrib/tcpdump/tests/eapon1.puu +++ /dev/null @@ -1,368 +0,0 @@ -begin 644 eapon1.pcap -MU,.RH0(`!````````````/__```!````"%5@0)*@#@#=````W0```/______ -M_P`$(U>E>@@`10``SSB'``"`$7Q.P*@!^<"H`?\`B@"*`+M3[!$.B1W`J`'Y -M`(H`I0``($5%14M&041*1$9&1$1!14M#04-!0T%#04-!0T%#04%!`"!%0D9# -M14-%1D5*1D5&1$5(1D-&1D9!1D%%1D-!0T%!00#_4TU")0`````````````` -M`````````````````````!$```L```````````#H`P``````````"P!6``,` -M`0`!``(`'`!<34%)3%-,3U1<0E)/5U-%``(`1$I0.353,$H`"%5@0/2@#@#= -M````W0```/_______P`$(U>E>@@`10``SSB(``"`$7Q-P*@!^<"H`?\`B@"* -M`+L,\A$.B1[`J`'Y`(H`I0``($5%14M&041*1$9&1$1!14M#04-!0T%#04-! -M0T%#04%!`"!!0D%#1E!&4$5.1D1%0T9#15!&2$9$149&4$9004-!0@#_4TU" -M)0```````````````````````````````````!$```L```````````#H`P`` -M````````"P!6``,``0`!``(`'`!<34%)3%-,3U1<0E)/5U-%``(`1$I0.353 -M,$H`"%5@0("C#@#[````^P```/_______P`$(U>E>@@`10``[3B)``"`$7PN -MP*@!^<"H`?\`B@"*`-E#WA$.B1_`J`'Y`(H`PP``($5%14M&041*1$9&1$1! -M14M#04-!0T%#04-!0T%#04%!`"!!0D%#1E!&4$5.1D1%0T9#15!&2$9$149& -M4$9004-!0@#_4TU")0```````````````````````````````````!$``"D` -M``````````#H`P``````````*0!6``,``0`!``(`.@!<34%)3%-,3U1<0E)/ -M5U-%``P`8.H``$%20D5)5%-'4E504$4``0`#"@`0`(!,_@0#1$I0.353,$H` -M"%5@0/JI#@!<````7````/_______P`$(U>E>@@`10``3CB*``"`$7S,P*@! -M^<"H`?\`B0")`#J"=XDA`1```0```````"!%0D9#14-%1D5*1D5&1$5(1D-& -M1D9!1D%%1D-!0T%"3```(``!"55@0//8"@!<````7````/_______P`$(U>E -M>@@`10``3CB-``"`$7S)P*@!^<"H`?\`B0")`#J"=XDA`1```0```````"!% -M0D9#14-%1D5*1D5&1$5(1D-&1D9!1D%%1D-!0T%"3```(``!"E5@0+,)!P!< -M````7````/_______P`$(U>E>@@`10``3CB.``"`$7S(P*@!^<"H`?\`B0") -M`#J"=XDA`1```0```````"!%0D9#14-%1D5*1D5&1$5(1D-&1D9!1D%%1D-! -M0T%"3```(``!"E5@0,@N#`#S````\P```/_______P`$(U>E>@@`10``Y3B/ -M``"`$7PPP*@!^<"H`?\`B@"*`-'GIA$.B2+`J`'Y`(H`NP``($5%14M&041* -M1$9&1$1!14M#04-!0T%#04-!0T%#04-!`"!%0D9#14-%1D5*1D5&1$5(1D-& -M1D9!1D%%1D-!0T%"3P#_4TU")0`````````````````````````````````` -M`!$``"$```````````#H`P``````````(0!6``,``0````(`,@!<34%)3%-, -M3U1<0E)/5U-%``\`@/P*`$1*4#DU4S!*``!R`&\`10,`7````%P```#_______\`!"-7I7H( -M`$4``$XXE0``@!%\P<"H`?G`J`'_`(D`B0`Z@G")*`$0``$````````@14)& -M0T5#149%2D9%1D1%2$9#1D9&049!149#04-!0DP``"```0Y58$!0N`X`7``` -M`%P```#_______\`!"-7I7H(`$4``$XXE@``@!%\P,"H`?G`J`'_`(D`B0`Z -M@G")*`$0``$````````@14)&0T5#149%2D9%1D1%2$9#1D9&049!149#04-! -M0DP``"```0]58$#*.`<`*@```"H```#_______\`!"-7I7H(!@`!"``&!``! -M``0C5Z5ZP*@!^0```````,"H`0$/56!`%UD'`#P````\``````0C5Z5Z``V( -M3R61"`8``0@`!@0``@`-B$\ED<"H`0$`!"-7I7K`J`'Y```````````````` -M````````#U5@0"E9!P!6`0``5@$````-B$\ED0`$(U>E>@@`10`!2#B7``"` -M$7S#P*@!^<"H`0$`1`!#`31YVP$!!@#(+24]CP&``,"H`?D````````````` -M````!"-7I7H````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M````````````````````````````````````````8X)38S4!!S8$P*@!`3T' -M`0`$(U>E>O\````````````````````````````````````````````````` -M``````]58$`6@0D`/````#P`````!"-7I7H`#,Z(,9J(C@$```4!`0`%`0`` -M```````````````````````````````````````````````/56!`"BL*`%8! -M``!6`0``________``0C5Z5Z"`!%``%(.)\``(`1`0<`````_____P!$`$,! -M-,&K`0$&`)@7ASP````````````````````````````$(U>E>@`````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M``````````````````!C@E-C-0$!=`$!/0E>@@`10`!2#BA``"`$0$%`````/____\`1`!#`32. -MS0$!!@#5`WTN````````````````````````````!"-7I7H````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M````````````````8X)38S4!`70!`3T'`0`$(U>E>C($P*@!^0P(1$I0.353 -M,$H\"$U31E0@-2XP-PL!#P,&+"XO'R'Y*_\``````!!58$"$8P(`$P```!,` -M````#,Z(,9H`!"-7I7J(C@$!````$%5@0.IK`@`\````/``````$(U>E>@`, -MSH@QFHB.`0``!0$"``4!```````````````````````````````````````` -M`````````!%58$!>L`L`/P```#\`````#,Z(,9H`!"-7I7J(C@$``"T"`@`M -M`3$R.34P,C,X,C`P,#4S.3%`;6YC,#(S+FUC8S(Y-2YO=VQA;BYO````7@`````, -MSH@QF@`$(U>E>HB.`0``3`(0`$P2"@``#@L`*#$R.34P,C,X,C`P,#4S.3%` -M;6YC,#(S+FUC8S(Y-2YO=VQA;BYOL.*X:RH)3A8\F -M`ET1,5U'QWV%1Z`@V,N=24.:\=%3TKIE>@`,SH@QFHB.`0,`+`$`#0``0&!5$0"=&X[D=]]>4;W^,JD$U5@0*@!#0!6`0``5@$``/_______P`$(U>E -M>@@`10`!2#BG``"`$0#_`````/____\`1`!#`30ES`$!!@#5`WTN:0$````` -M````````````````````!"-7I7H````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M````````````````````````````````````````````````````````8X)3 -M8S4!`70!`3T'`0`$(U>E>C($P*@!^0P(1$I0.353,$H\"$U31E0@-2XP-PL! -M#P,&+"XO'R'Y*_\``````!I58$#O`@T`5@$``%8!``#_______\`!"-7I7H( -M`$4``4@XKP``@!$`]P````#_____`$0`0P$T)E>@`````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M``````````````````````````````````````````````````!C@E-C-0$! -M=`$!/0E>HB.`0$` -M```P56!`^J$*`#P````\``````0C5Z5Z``S.B#&:B(X!```%`0,`!0$````` -M````````````````````````````````````````````,%5@0)SA"@`_```` -M/P`````,SH@QF@`$(U>E>HB.`0``+0(#`"T!,3(Y-3`R,S@R,#`P-3,Y,4!M -M;F,P,C,N;6-C,CDU+F]W;&%N+F]R9S!58$#0!`P`/````#P`````!"-7I7H` -M#,Z(,9J(C@$``!0!+P`4$@H```\"``(``0``$0$!```````````````````` -M```````````R56!`-$(%`%X```!>``````S.B#&:``0C5Z5ZB(X!``!,`B\` -M3!(*```."P`H,3(Y-3`R,S@R,#`P-3,Y,4!M;F,P,C,N;6-C,CDU+F]W;&%N -M+F]R9P<%``#7H!![\\SE,P[&']$W6C<%$`$``3)58$#,.`<`8@```&(````` -M!"-7I7H`#,Z(,9J(C@$``%`!,`!0$@L```$-```P```````````````````` -M,0```````````````````#(````````````````````+!0``0WL?0G!%;49D -M0(DL@MD'#C-58$!S4P(`+@```"X`````#,Z(,9H`!"-7I7J(C@$``!P",``< -M$@L```L%``!%[_\P8H+&6U!$B#@$)T-",U5@0"'6`P`\````/``````$(U>E -M>@`,SH@QFHB.`0``!`,```0````````````````````````````````````` -M`````````````#-58$!=V@,`2P```$L`````!"-7I7H`#,Z(,9J(C@$#`#D! -M``T``$!@53$`G7]!<++?0.3Y>#A83O[YHHT"0T@&N\)FL/6P9NHATX%BIRI%B`S56!`F-T#`#X````^``````0C5Z5Z``S.B#&:B(X!`P`L -M`0`-``!`8%4Q`)[N$`!R;$K*.XLG`JO9N"A#@XK>5*[_:U"C]E[O?""IR!5+ -M56!`]Q(-`"H````J````________``0C5Z5Z"`8``0@`!@0``0`$(U>E>JG^ -M0\(```````"I_D/"2U5@0'&!#0`J````*@```/_______P`$(U>E>@@&``$( -M``8$``$`!"-7I7JI_D/"````````J?Y#PDQ58$`X@@T`*@```"H```#_____ -M__\`!"-7I7H(!@`!"``&!``!``0C5Z5ZJ?Y#P@```````*G^0\)-56!`*=H- -M`*\```"O`````0!>?__Z``0C5Z5Z"`!%``"A.+X```$1HM.I_D/"[___^A#+ -M!VP`C6+X32U314%20T@@*B!(5%10+S$N,0T*2&]S=#HR,SDN,C4U+C(U-2XR -M-3`Z,3DP,`T*4U0Z=7)N.G-C:&5M87,M=7!N<"UO41E=FEC93HQ#0I-86XZ(G-S9'`Z9&ES8V]V97(B#0I-6#HS -M#0H-"DU58$"\Y`T`-@```#8````!`%X``!8`!"-7I7H(`$8``"@XP````0(> -M.:G^0\+@```6E`0``"(`Z@,````!!````.____I-56!`OK4.`&X```!N```` -M________``0C5Z5Z"`!%``!@.,(``(`1:@RI_D/"J?[__P")`(D`3+4(B2XI -M$``!```````!($5%14M&041*1$9&1$1!14M#04-!0T%#04-!0T%#04%!```@ -M``'`#``@``$`!)/@``9@`*G^0\).56!`!H\*`#8````V`````0!>```6``0C -M5Z5Z"`!&```H.,0```$"'C6I_D/"X```%I0$```B`.H#`````00```#O___Z -M3E5@0!3E"@!N````;@```/_______P`$(U>E>@@`10``8#C%``"`$6H)J?Y# -MPJG^__\`B0")`$RU"(DN*1```0```````2!%145+1D%$2D1&1D1$045+0T%# -M04-!0T%#04-!0T%!00``(``!P`P`(``!``23X``&8`"I_D/"3U5@0#,6!P!N -M````;@```/_______P`$(U>E>@@`10``8#C&``"`$6H(J?Y#PJG^__\`B0") -M`$RU"(DN*1```0```````2!%145+1D%$2D1&1D1$045+0T%#04-!0T%#04-! -M0T%!00``(``!P`P`(``!``23X``&8`"I_D/"3U5@0*^U#0!6`0``5@$``/__ -M_____P`$(U>E>@@`10`!2#C'``"`$0#?`````/____\`1`!#`325:P$!!@"2 -M13E.``"`````````````````````````!"-7I7H````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M````````8X)38S4!`70!`3T'`0`$(U>E>C($P*@!^0P(1$I0.353,$H\"$U3 -M1E0@-2XP-PL!#P,&+"XO'R'Y*_\``````%!58$`T1P,`;@```&X```#_____ -M__\`!"-7I7H(`$4``&`XR```@!%J!JG^0\*I_O__`(D`B0!,M@B)+B@0``$` -M``````$@145%2T9!1$I$1D9$1$%%2T-!0T%#04-!0T%#04-!04$``"```<`, -M`"```0`$D^``!F``J?Y#PE!58$",WPT`KP```*\````!`%Y___H`!"-7I7H( -M`$4``*$XR@```1&BQZG^0\+O___Z$,L';`"-8OA-+5-%05)#2"`J($A45%`O -M,2XQ#0I(;W-T.C(S.2XR-34N,C4U+C(U,#HQ.3`P#0I35#IUE>@@`10``8#C,``"`$6H"J?Y#PJG^__\`B0")`$PP]8DO*1`` -M`0```````2!%0D9#14-%1D5*1D5&1$5(1D-&1D9!1D%%1D-!0T%!00``(``! -MP`P`(``!``23X``&X`"I_D/"455@0#/A`P`3````$P`````,SH@QF@`$(U>E -M>HB.`0$```!156!`8>D#`#P````\``````0C5Z5Z``S.B#&:B(X!```%`00` -M!0$`````````````````````````````````````````````````455@0+TU -M!``_````/P`````,SH@QF@`$(U>E>HB.`0``+0($`"T!,3(Y-3`R,S@R,#`P -M-3,Y,4!M;F,P,C,N;6-C,CDU+F]W;&%N+F]R9U%58$#Y[@4`/````#P````` -M!"-7I7H`#,Z(,9J(C@$``!0!4``4$@H```\"``(``0``$0$!```````````` -M``````````````````!156!`9.L*`&X```!N````________``0C5Z5Z"`!% -M``!@.,T``(`1:@&I_D/"J?[__P")`(D`3##UB2\I$``!```````!($5"1D-% -M0T5&14I&149$14A&0T9&1D%&045&0T%#04%!```@``'`#``@``$`!)/@``;@ -M`*G^0\)256!`71P'`&X```!N````________``0C5Z5Z"`!%``!@.,X``(`1 -M:@"I_D/"J?[__P")`(D`3##UB2\I$``!```````!($5"1D-%0T5&14I&149$ -M14A&0T9&1D%&045&0T%#04%!```@``'`#``@``$`!)/@``;@`*G^0\)256!` -M9[(.`%X```!>``````S.B#&:``0C5Z5ZB(X!``!,`E``3!(*```."P`H,3(Y -M-3`R,S@R,#`P-3,Y,4!M;F,P,C,N;6-C,CDU+F]W;&%N+F]R9P<%```Z)]TL -M?V'JYOR&8?J))U]%$`$``5)58$`"$P\`8@```&(`````!"-7I7H`#,Z(,9J( -MC@$``%`!40!0$@L```$-```P````````````````````,0`````````````` -M`````#(````````````````````+!0``*IFHOZ$\8[TX!>!F]%P6:%-58$!8 -M30,`;@```&X```#_______\`!"-7I7H(`$4``&`XSP``@!%I_ZG^0\*I_O__ -M`(D`B0!,,?6)+R@0``$```````$@14)&0T5#149%2D9%1D1%2$9#1D9&049! -M149#04-!04$``"```<`,`"```0`$D^``!N``J?Y#PE-58$#M3`H`+@```"X` -M````#,Z(,9H`!"-7I7J(C@$``!P"40`<$@L```L%``#BE(K>$<9]M,I(_@G, -MC).Y4U5@0`*="@`\````/``````$(U>E>@`,SH@QFHB.`0``!`,```0````` -M`````````````````````````````````````````````%-58$#CH`H`2P`` -M`$L`````!"-7I7H`#,Z(,9J(C@$#`#D!``T``$!@55(`GZN0MGOEA8[@4WO* -M&_11@$@"&2ZIH`.YHY==8)$_%6#R:U/Z"F'14BLDK,Z)I:%356!`&*0*`#X` -M```^``````0C5Z5Z``S.B#&:B(X!`P`L`0`-``!`8%52`*!&UK1?KE>@`````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M``!C@E-C-0$!=`$!/0E>@@`10``H3C2```!$:*_J?Y#PN____H0RP=L`(UB^$TM4T5!4D-(("H@ -M2%144"\Q+C$-"DAOE>@@`10``SSCF``"` -M$6EYJ?Y#PJG^__\`B@"*`+L)/1$.B3:I_D/"`(H`I0``($5%14M&041*1$9& -M1$1!14M#04-!0T%#04-!0T%#04%!`"!%0D9#14-%1D5*1D5&1$5(1D-&1D9! -M1D%%1D-!0T%"3@#_4TU")0```````````````````````````````````!$` -M``L```````````#H`P``````````"P!6``,``0`!``(`'`!<34%)3%-,3U1< -M0E)/5U-%``(`1$I0.353,$H`655@0.K0#@#=````W0```/_______P`$(U>E -M>@@`10``SSCG``"`$6EXJ?Y#PJG^__\`B@"*`+L)/!$.B3>I_D/"`(H`I0`` -M($5%14M&041*1$9&1$1!14M#04-!0T%#04-!0T%#04%!`"!%0D9#14-%1D5* -M1D5&1$5(1D-&1D9!1D%%1D-!0T%"3@#_4TU")0`````````````````````` -M`````````````!$```L```````````#H`P``````````"P!6``,``0`!``(` -M'`!<34%)3%-,3U1<0E)/5U-%``(`1$I0.353,$H`6U5@0-@R!P#=````W0`` -M`/_______P`$(U>E>@@`10``SSCH``"`$6EWJ?Y#PJG^__\`B@"*`+L).Q$. -MB3BI_D/"`(H`I0``($5%14M&041*1$9&1$1!14M#04-!0T%#04-!0T%#04%! -M`"!%0D9#14-%1D5*1D5&1$5(1D-&1D9!1D%%1D-!0T%"3@#_4TU")0`````` -M`````````````````````````````!$```L```````````#H`P`````````` -M"P!6``,``0`!``(`'`!<34%)3%-,3U1<0E)/5U-%``(`1$I0.353,$H`7%5@ -M0"2]#0!6`0``5@$``/_______P`$(U>E>@@`10`!2#CI``"`$0"]`````/__ -M__\`1`!#`31L:@$!!@"213E.*0&`````````````````````````!"-7I7H` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M````````````````````````````8X)38S4!`70!`3T'`0`$(U>E>C($P*@! -M^0P(1$I0.353,$H\"$U31E0@-2XP-PL!#P,&+"XO'R'Y*_\``````%Q58$`# -MUPX`Z0```.D```#_______\`!"-7I7H(`$4``-LXZ@``@!%I::G^0\*I_O__ -M`(H`B@#';@L1#HDYJ?Y#P@"*`+$``"!%145+1D%$2D1&1D1$045+0T%#04-! -M0T%#04-!0T%!00`@14)&0T5#149%2D9%1D1%2$9#1D9&049!149#04-!0D\` -M_U--0B4````````````````````````````````````1```7```````````` -MZ`,``````````!<`5@`#``$``0`"`"@`7$U!24Q33$]47$)23U=310`(`2`/ -M`1!9L1D5`````$1*4#DU4S!*`%U58$#/UPX`Z0```.D```#_______\`!"-7 -MI7H(`$4``-LXZP``@!%I:*G^0\*I_O__`(H`B@#';@H1#HDZJ?Y#P@"*`+$` -M`"!%145+1D%$2D1&1D1$045+0T%#04-!0T%#04-!0T%!00`@14)&0T5#149% -M2D9%1D1%2$9#1D9&049!149#04-!0D\`_U--0B4````````````````````` -M```````````````1```7````````````Z`,``````````!<`5@`#``$``0`" -M`"@`7$U!24Q33$]47$)23U=310`(`2`/`1!9L1D5`````$1*4#DU4S!*`%Y5 -M8$"+V`X`Z0```.D```#_______\`!"-7I7H(`$4``-LX[```@!%I9ZG^0\*I -M_O__`(H`B@#';@D1#HD[J?Y#P@"*`+$``"!%145+1D%$2D1&1D1$045+0T%# -M04-!0T%#04-!0T%!00`@14)&0T5#149%2D9%1D1%2$9#1D9&049!149#04-! -M0D\`_U--0B4````````````````````````````````````1```7```````` -M````Z`,``````````!<`5@`#``$``0`"`"@`7$U!24Q33$]47$)23U=310`( -M`2`/`1!9L1D5`````$1*4#DU4S!*`%]58$!)V0X`Z0```.D```#_______\` -M!"-7I7H(`$4``-LX[0``@!%I9JG^0\*I_O__`(H`B@#';@@1#HD\J?Y#P@"* -M`+$``"!%145+1D%$2D1&1D1$045+0T%#04-!0T%#04-!0T%!00`@14)&0T5# -M149%2D9%1D1%2$9#1D9&049!149#04-!0D\`_U--0B4````````````````` -M```````````````````1```7````````````Z`,``````````!<`5@`#``$` -M`0`"`"@`7$U!24Q33$]47$)23U=310`(`2`/`1!9L1D5`````$1*4#DU4S!* -M`&!58$"CV@X`;@```&X```#_______\`!"-7I7H(`$4``&`X[@``@!%IX*G^ -M0\*I_O__`(D`B0!,H^:)/2D0``$```````$@14)&0T5#149%2D9%1D1%2$9# -M1D9&049!149#04-!0DX``"```<`,`"```0`$D^``!F``J?Y#PF%58$#F"@L` -M;@```&X```#_______\`!"-7I7H(`$4``&`X[P``@!%IWZG^0\*I_O__`(D` -MB0!,H^:)/2D0``$```````$@14)&0T5#149%2D9%1D1%2$9#1D9&049!149# -M04-!0DX``"```<`,`"```0`$D^``!F``J?Y#PF)58$#?.P<`;@```&X```#_ -M______\`!"-7I7H(`$4``&`X\```@!%IWJG^0\*I_O__`(D`B0!,H^:)/2D0 -M``$```````$@14)&0T5#149%2D9%1D1%2$9#1D9&049!149#04-!0DX``"`` -M`<`,`"```0`$D^``!F``J?Y#PF-58$#9;`,`;@```&X```#_______\`!"-7 -MI7H(`$4``&`X\P``@!%IVZG^0\*I_O__`(D`B0!,I.:)/2@0``$```````$@ -M14)&0T5#149%2D9%1D1%2$9#1D9&049!149#04-!0DX``"```<`,`"```0`$ -MD^``!F``J?Y#PF-58$"'X`X`;@```&X```#_______\`!"-7I7H(`$4``&`X -M]```@!%IVJG^0\*I_O__`(D`B0!,Z>R)/BD0``$```````$@04)!0T901E!% -M3D9$14-&0T501DA&1$5&1E!&4$%#04(``"```<`,`"```0`$D^``!N``J?Y# -MPF158$`/$0L`;@```&X```#_______\`!"-7I7H(`$4``&`X]0``@!%IV:G^ -M0\*I_O__`(D`B0!,Z>R)/BD0``$```````$@04)!0T901E!%3D9$14-&0T50 -M1DA&1$5&1E!&4$%#04(``"```<`,`"```0`$D^``!N``J?Y#PF558$`&0@<` -M;@```&X```#_______\`!"-7I7H(`$4``&`X]@``@!%IV*G^0\*I_O__`(D` -MB0!,Z>R)/BD0``$```````$@04)!0T901E!%3D9$14-&0T501DA&1$5&1E!& -M4$%#04(``"```<`,`"```0`$D^``!N``J?Y#PF958$#^<@,`;@```&X```#_ -M______\`!"-7I7H(`$4``&`X]P``@!%IUZG^0\*I_O__`(D`B0!,ZNR)/B@0 -M``$```````$@04)!0T901E!%3D9$14-&0T501DA&1$5&1E!&4$%#04(``"`` -M`<`,`"```0`$D^``!N``J?Y#PF958$!_Y@X`W0```-T```#_______\`!"-7 -MI7H(`$4``,\X^```@!%I9ZG^0\*I_O__`(H`B@"[%C41#HD_J?Y#P@"*`*4` -M`"!%145+1D%$2D1&1D1$045+0T%#04-!0T%#04-!0T%!00`@14)&0T5#149% -M2D9%1D1%2$9#1D9&049!149#04-!04$`_U--0B4````````````````````` -M```````````````1```+````````````Z`,```````````L`5@`#``$``0`" -M`!P`7$U!24Q33$]47$)23U=310`"`$1*4#DU4S!*`&958$!AYPX`W0```-T` -M``#_______\`!"-7I7H(`$4``,\X^0``@!%I9JG^0\*I_O__`(H`B@"[SSH1 -M#HE`J?Y#P@"*`*4``"!%145+1D%$2D1&1D1$045+0T%#04-!0T%#04-!0T%! -M00`@04)!0T901E!%3D9$14-&0T501DA&1$5&1E!&4$%#04(`_U--0B4````` -M```````````````````````````````1```+````````````Z`,````````` -M``L`5@`#``$``0`"`!P`7$U!24Q33$]47$)23U=310`"`$1*4#DU4S!*`&95 -M8$!PZ@X`^P```/L```#_______\`!"-7I7H(`$4``.TX^@``@!%I1ZG^0\*I -M_O__`(H`B@#9)2,1#HE!J?Y#P@"*`,,``"!%145+1D%$2D1&1D1$045+0T%# -M04-!0T%#04-!0T%!00`@04)!0T901E!%3D9$14-&0T501DA&1$5&1E!&4$%# -M04(`_U--0B4````````````````````````````````````1```I```````` -M````Z`,``````````"D`5@`#``$``0`"`#H`7$U!24Q33$]47$)23U=310`, -M`&#J``!!4D)%25131U)54%!%``$``PH`$`"`;/[%!D1*4#DU4S!*`&958$"4 -M\`X`7````%P```#_______\`!"-7I7H(`$4``$XX^P``@!%IY:G^0\*I_O__ -M`(D`B0`Z;]^)0P$0``$````````@14)&0T5#149%2D9%1D1%2$9#1D9&049! -M149#04-!0DP``"```6=58$`('PL`7````%P```#_______\`!"-7I7H(`$4` -M`$XX_```@!%IY*G^0\*I_O__`(D`B0`Z;]^)0P$0``$````````@14)&0T5# -M149%2D9%1D1%2$9#1D9&049!149#04-!0DP``"```6A58$`&4`<`7````%P` -M``#_______\`!"-7I7H(`$4``$XX_0``@!%IXZG^0\*I_O__`(D`B0`Z;]^) -M0P$0``$````````@14)&0T5#149%2D9%1D1%2$9#1D9&049!149#04-!0DP` -M`"```6M58$"J6P<`7````%P```#_______\`!"-7I7H(`$4``$XY`0``@!%I -MWZG^0\*I_O__`(D`B0`Z;]N)1P$0``$````````@14)&0T5#149%2D9%1D1% -M2$9#1D9&049!149#04-!0DP``"```6Q58$`-BP,`7````%P```#_______\` -M!"-7I7H(`$4``$XY`@``@!%IWJG^0\*I_O__`(D`B0`Z;]N)1P$0``$````` -M```@14)&0T5#149%2D9%1D1%2$9#1D9&049!149#04-!0DP``"```6Q58$!% -M_@X`7````%P```#_______\`!"-7I7H(`$4``$XY!```@!%IW*G^0\*I_O__ -M`(D`B0`Z;]N)1P$0``$````````@14)&0T5#149%2D9%1D1%2$9#1D9&049! -M149#04-!0DP``"```6U58$`7O@T`5@$``%8!``#_______\`!"-7I7H(`$4` -M`4@Y!@``@!$`H`````#_____`$0`0P$T;&H!`08`DD4Y3BD!@``````````` -M``````````````0C5Z5Z```````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M`````````````````````````````````````````````````&."4V,U`0%T -M`0$]!P$`!"-7I7HR!,"H`?D,"$1*4#DU4S!*/`A-4T94(#4N,#<+`0\#!BPN -M+Q\A^2O_``````!Q56!`]:$*`!,````3``````S.B#&:``0C5Z5ZB(X!`0`` -M`'%58$!%P`H`/````#P`````!"-7I7H`#,Z(,9J(C@$```4!!0`%`0`````` -M``````````````````````````````````````````!Q56!`C?4*`#\````_ -M``````S.B#&:``0C5Z5ZB(X!```M`@4`+0$Q,CDU,#(S.#(P,#`U,SDQ0&UN -M8S`R,RYM8V,R.34N;W=L86XN;W)G<55@0/XV"P`\````/``````$(U>E>@`, -MSH@QFHB.`0``%`%P`!02"@``#P(``@`!```1`0$````````````````````` -M`````````')58$#=.0P`\P```/,```#_______\`!"-7I7H(`$4``.4Y#``` -M@!%I/:G^0\*I_O__`(H`B@#1\^D1#HE*J?Y#P@"*`+L``"!%145+1D%$2D1& -M1D1$045+0T%#04-!0T%#04-!0T%#00`@14)&0T5#149%2D9%1D1%2$9#1D9& -M049!149#04-!0D\`_U--0B4````````````````````````````````````1 -M```A````````````Z`,``````````"$`5@`#``$````"`#(`7$U!24Q33$]4 -M7$)23U=310`/`(#\"@!$2E`Y-5,P2@``60!<`%4`!0$#$`4`#P%5J@!S56!` -MJ'L$`%X```!>``````S.B#&:``0C5Z5ZB(X!``!,`G``3!(*```."P`H,3(Y -M-3`R,S@R,#`P-3,Y,4!M;F,P,C,N;6-C,CDU+F]W;&%N+F]R9P<%```)[DNV -M]E>@`,SH@QFHB.`0`` -M!`,```0``````````````````````````````````````````````````'15 -M8$`G6P``2P```$L`````!"-7I7H`#,Z(,9J(C@$#`#D!``T``$!@57(`H7=G -MF]`L&:EKBMN@`6*6Y2?^.:F>V`$/C@ -M9C@```$!"`H974FMBM15+Q!58$!QG`8`8````.L`````"]N0_0(`X$]@<4 -M5(X`:)P-"Q0`8$$!L&:EKA4C@<4`/I,<`$5`/+M5G/\`0<0G:=Q]S4< -MM*"$``/81;I[5@?]ZP9J6N%2.!Q0`RHLB`18`PB*WG4W^01LM]B4XN&`' -M6E(!*C$R.34P,C,X,C`P,#4S.3%`;6YC,#(S+FUC8S(Y-2YO$55@0!P&!0!@ -M````!@$`````#`>LA0`+VY#]`@@`10``^``"0`!`$0RDP9J6N-6!_WH'%%2. -M`.2>DP(6`-P04TN>&O"\WL%@,.`1V142"`;____^#`8```)`!@8````"&CH` -M``$W$32`+U<1;LS62B]58$!:H@8`8````.L`````"]N0_0(`X$]@M>A=G -MB0$J,3(Y-3`R,S@R,#`P-3,Y,4!M;F,P,C,N;6-C,CDU+F\O56!`G*<&`&`` -M``"*```````,!ZR%``O;D/T""`!%``!\``-``$`1#1_!FI:XU8'_>@<45(X` -M:#L&:EKA4C@<4`/H2$P$9`/)6HP7H8R0(O -M*"8``/81;IG5@?]ZP9J6N%2.!Q0`R@WC`1H`PCS/?&QHIT8SX.[2#=[S68H! -M*C$R.34P,C,X,C`P,#4S.3%`;6YC,#(S+FUC8S(Y-2YO,55@0#VS#0!@```` -M!@$`````#`>LA0`+VY#]`@@`10``^``%0`!`$0RAP9J6N-6!_WH'%%2.`.3B -MMP(:`-S*Z(?9H34)&AB0":D9@<45(X`:#0% -M"QL`8(N:^N5L(EK&#H6-':U$XV((!O____X,!@```D`&!@````)/%@%0`!02 -M"@``#P(``@`!455@0*VL"0!@````'`$````+VY#]`@#@3UR$8`@`10`!#B@I -M``#V$6YFU8'_>L&:EKA4C@<4`/KDFP$<`/+H$R8P9(B"W[^G<4!"HKQ+`2HQ -M,CDU,#(S.#(P,#`U,SDQ0&UN8S`R,RYM8V,R.34N;U%58$"ZL@D`8````,8` -M``````P'K(4`"]N0_0((`$4``+@`!T``0!$,W\&:EKC5@?]Z!Q14C@"DI=@+ -M'`";*!>&FY;C?2/)T74`@&_____@P&```"0`8&`````D]2`5$`4!(+ -M```!#0``,`!256!`@SL%`&````#L``````O;D/T"`.!/7(1@"`!%``#>*"H` -M`/81;I75@?]ZP9J6N%2.!Q0`RI"T`1T`PE:^P6JH@]U$D*!C#8CO0UP!*C$R -M.34P,C,X,C`P,#4S.3%`;6YC,#(S+FUC8S(Y-2YO4E5@0'M`!0!@````!@$` -M````#`>LA0`+VY#]`@@`10``^``(0`!`$0R>P9J6N-6!_WH'%%2.`.2<&@(= -M`-P&]WGHNB++Z0K&A"^B<2S/"`;____^#`8```)`!@8````"&CH```$W$32F -M=DT@&\D[/G!58$!OW04`8````.L`````"]N0_0(`X$]AS"W^P0$J,3(Y -M-3`R,S@R,#`P-3,Y,4!M;F,P,C,N;6-C,CDU+F]P56!`L>(%`&````"*```` -M```,!ZR%``O;D/T""`!%``!\``E``$`1#1G!FI:XU8'_>@<45(X`:`.V"QX` -M8+P/!*Y!RZ>(/:C.%/A62\((!O____X,!@```D`&!@````)/%@%P`!02"@`` -M#P(``@`!<55@0)*H#@!@````'`$````+VY#]`@#@3UR$8`@`10`!#B@L``#V -M$6YCU8'_>L&:EKA4C@<4`/JLH@$?`/*.M".D<>M4,KL=.(:"[-F;`2HQ,CDU -M,#(S.#(P,#`U,SDQ0&UN8S`R,RYM8V,R.34N;W%58$#$K@X`8````,8````` -M``P'K(4`"]N0_0((`$4``+@`"D``0!$,W,&:EKC5@?]Z!Q14C@"DK7D+'P"< -MMWVPJO:XC`JEY#15<5U0Z@@&_____@P&```"0`8&`````D]2`7$`4!(+```! -M#0``,`!R56!`S#4*`&````#L``````O;D/T"`.!/7(1@"`!%``#>*"T``/81 -M;I+5@?]ZP9J6N%2.!Q0`RE>1`2``PK+"]?UCV]G1I<-+X16?0+L!*C$R.34P -M,C,X,C`P,#4S.3%`;6YC,#(S+FUC8S(Y-2YOLA0`+VY#]`@@`10``^``+0`!`$0R;P9J6N-6!_WH'%%2.`.1M%P(@`-PJ -M=?H'6<1=UD&:FRVA,V+S"`;____^#`8```)`!@8````"&CH```$W$32RVRE= -$I%P\00`` -` -end diff --git a/contrib/tcpdump/tests/esp-secrets.txt b/contrib/tcpdump/tests/esp-secrets.txt deleted file mode 100644 index 81847a0e3e5..00000000000 --- a/contrib/tcpdump/tests/esp-secrets.txt +++ /dev/null @@ -1,5 +0,0 @@ -# a comment - -0x12345678@192.1.2.45 3des-cbc-hmac96:0x43434545464649494a4a4c4c4f4f51515252545457575840 -0xabcdabcd@192.0.1.1 3des-cbc-hmac96:0x434545464649494a4a4c4c4f4f5151525254545757584043 -0xd1234567@192.1.2.45 aes256-cbc-hmac96:0xaaaabbbbccccdddd4043434545464649494a4a4c4c4f4f515152525454575758 diff --git a/contrib/tcpdump/tests/esp0.out b/contrib/tcpdump/tests/esp0.out deleted file mode 100644 index a0ddf1b2dc7..00000000000 --- a/contrib/tcpdump/tests/esp0.out +++ /dev/null @@ -1,8 +0,0 @@ -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x1), length 116 -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x2), length 116 -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x3), length 116 -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x4), length 116 -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x5), length 116 -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x6), length 116 -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x7), length 116 -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x8), length 116 diff --git a/contrib/tcpdump/tests/esp1.gdbinit b/contrib/tcpdump/tests/esp1.gdbinit deleted file mode 100644 index 6c8ae890cbd..00000000000 --- a/contrib/tcpdump/tests/esp1.gdbinit +++ /dev/null @@ -1 +0,0 @@ -set args -t -n -E "0x12345678@192.1.2.45 3des-cbc-hmac96:0x4043434545464649494a4a4c4c4f4f515152525454575758" -r 02-sunrise-sunset-esp.pcap diff --git a/contrib/tcpdump/tests/esp1.out b/contrib/tcpdump/tests/esp1.out deleted file mode 100644 index 61b2967639a..00000000000 --- a/contrib/tcpdump/tests/esp1.out +++ /dev/null @@ -1,8 +0,0 @@ -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x1), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1280, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x2), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1536, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x3), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1792, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x4), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2048, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x5), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2304, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x6), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2560, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x7), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2816, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x8), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 3072, length 64 (ipip-proto-4) diff --git a/contrib/tcpdump/tests/esp2.gdbinit b/contrib/tcpdump/tests/esp2.gdbinit deleted file mode 100644 index 7c184075862..00000000000 --- a/contrib/tcpdump/tests/esp2.gdbinit +++ /dev/null @@ -1 +0,0 @@ -set args -t -n -E "0x12345678@192.1.2.45 3des-cbc-hmac96:0x43434545464649494a4a4c4c4f4f51515252545457575840,0xabcdabcd@192.0.1.1 3des-cbc-hmac96:0x434545464649494a4a4c4c4f4f5151525254545757584043" -r 08-sunrise-sunset-esp2.pcap diff --git a/contrib/tcpdump/tests/esp2.out b/contrib/tcpdump/tests/esp2.out deleted file mode 100644 index a829c8ea339..00000000000 --- a/contrib/tcpdump/tests/esp2.out +++ /dev/null @@ -1,8 +0,0 @@ -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x1), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x1), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1280, length 64 (ipip-proto-4) (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x2), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x2), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1536, length 64 (ipip-proto-4) (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x3), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x3), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1792, length 64 (ipip-proto-4) (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x4), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x4), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2048, length 64 (ipip-proto-4) (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x5), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x5), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2304, length 64 (ipip-proto-4) (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x6), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x6), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2560, length 64 (ipip-proto-4) (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x7), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x7), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2816, length 64 (ipip-proto-4) (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x12345678,seq=0x8), length 172: IP 192.1.2.23 > 192.0.1.1: ESP(spi=0xabcdabcd,seq=0x8), length 116: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 3072, length 64 (ipip-proto-4) (ipip-proto-4) diff --git a/contrib/tcpdump/tests/esp3.gdbinit b/contrib/tcpdump/tests/esp3.gdbinit deleted file mode 100644 index 71501187a22..00000000000 --- a/contrib/tcpdump/tests/esp3.gdbinit +++ /dev/null @@ -1 +0,0 @@ -set args -t -n -E "3des-cbc-hmac96:0x43434545464649494a4a4c4c4f4f51515252545457575840" -r 08-sunrise-sunset-esp2.pcap diff --git a/contrib/tcpdump/tests/esp4.gdbinit b/contrib/tcpdump/tests/esp4.gdbinit deleted file mode 100644 index 8007444b74e..00000000000 --- a/contrib/tcpdump/tests/esp4.gdbinit +++ /dev/null @@ -1,2 +0,0 @@ -set args -t -n -E "file esp-secrets.txt" -r 08-sunrise-sunset-esp2.pcap - diff --git a/contrib/tcpdump/tests/esp5.gdbinit b/contrib/tcpdump/tests/esp5.gdbinit deleted file mode 100644 index 2f578e32704..00000000000 --- a/contrib/tcpdump/tests/esp5.gdbinit +++ /dev/null @@ -1,3 +0,0 @@ -set args -t -n -E "file esp-secrets.txt" -r 08-sunrise-sunset-aes.pcap - - diff --git a/contrib/tcpdump/tests/esp5.out b/contrib/tcpdump/tests/esp5.out deleted file mode 100644 index 73f35e0b220..00000000000 --- a/contrib/tcpdump/tests/esp5.out +++ /dev/null @@ -1,8 +0,0 @@ -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x1), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1280, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x2), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1536, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x3), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 1792, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x4), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2048, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x5), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2304, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x6), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2560, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x7), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 2816, length 64 (ipip-proto-4) -IP 192.1.2.23 > 192.1.2.45: ESP(spi=0xd1234567,seq=0x8), length 132: IP 192.0.2.1 > 192.0.1.1: ICMP echo request, id 28416, seq 3072, length 64 (ipip-proto-4) diff --git a/contrib/tcpdump/tests/espudp1.out b/contrib/tcpdump/tests/espudp1.out deleted file mode 100644 index db8eafb848d..00000000000 --- a/contrib/tcpdump/tests/espudp1.out +++ /dev/null @@ -1,8 +0,0 @@ -IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x1), length 116 -IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x2), length 116: ip-proto-227 49 -IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x3), length 116: PIMv13, length 10 -IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x4), length 116 -IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x5), length 116 -IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x6), length 116: ip-proto-183 28 -IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x7), length 116: ip-proto-72 34 -IP 192.1.2.23.4500 > 192.1.2.45.4500: UDP-encap: ESP(spi=0x12345678,seq=0x8), length 116: ip-proto-224 59 diff --git a/contrib/tcpdump/tests/espudp1.puu b/contrib/tcpdump/tests/espudp1.puu deleted file mode 100644 index 353c1c9c3d5..00000000000 --- a/contrib/tcpdump/tests/espudp1.puu +++ /dev/null @@ -1,35 +0,0 @@ -begin 644 espudp1.pcap -MU,.RH0(`!``````````````&```!``````````````">````G@```!```&1D -M11```&1D(P@`10``D*8.``!`$5`(P`$"%\`!`BT1E!&4`'P``!(T5G@````! -MIQI1WARY*2.,3*N>\E4-MV0"Q0&B9RG\CH]Z?F.J2U2J6?9"%WHI),PCC4.T -MPHU1D2,KT6".3TG`1R:V$E7'FE[]PG%1#\!'O=1;9"P[#Q*U;DU12<9BO$:/ -M(AI2S*,BK5H_YVKC,]K'@[Y^``````````">````G@```!```&1D11```&1D -M(P@`10``D*8/``!`$5`'P`$"%\`!`BT1E!&4`'P``!(T5G@````"*3$H)*^K -MG65!9?U^[O>)/*D1"&WNUN@=BGJZV$;E12<$J$SGOAFJ!<5)O%=NY:HY\B$3 -M!*Q.N--U/:_F^;L-H0>[$9AU0\QP"`F5JD8GY307\SDD5=Y\G@%('76R5O`G -MA/2`=,$VWF]0[L\*``````````">````G@```!```&1D11```&1D(P@`10`` -MD*80``!`$5`&P`$"%\`!`BT1E!&4`'P``!(T5G@````#C]!\R;K$H/YX7>T6 -MZT6>/2I[+Q4&*]7A`VLB)[%A_/MKQMX-:R"-)DA.[G>)\5]KF#Z5:3L+JCMC -MXDHKBE%/Q%D1VV#=?\3JEZ?8)&[3[(4F"4*0W"B)."[.?0U(7!!Z2_69:0DV -M98H$8R%=``````````">````G@```!```&1D11```&1D(P@`10``D*81``!` -M$5`%P`$"%\`!`BT1E!&4`'P``!(T5G@````$FV8=\*GR(@_[&TF2&3'AZ9)Q -M*?@[(M!I:IE"@-?4W5TEZ-5@(F\613%V19L#%[XCJFJY^G4BVW"O\/*X\!A6 -M@1<[4J(5+60M8]9R>$=\TU>XX7AB7\T'1W1HAPX[(KPTVN"*NEC)E/7@5D_1 -M``````````">````G@```!```&1D11```&1D(P@`10``D*82``!`$5`$P`$" -M%\`!`BT1E!&4`'P``!(T5G@````%=@CRA49O0D;A1@T5[WR$Q5?Y(\M[>D@C -MRFK+$5I%Y8:85K`)&LZ.Q@G&N)8-RG@2;GNYJ\2OC9ZV?,IT7HJU7K&DM/1_ -M:K+-8KXY4?22*8=.1@O<,#R&;^R2P`>PAR9E7*>!>3*D24OK4*C1```````` -M``">````G@```!```&1D11```&1D(P@`10``D*83``!`$5`#P`$"%\`!`BT1 -ME!&4`'P``!(T5G@````&OTF+$=SM[Y.=U8E>9V&69R:M\.1&LA]$#9Q^:+E7 -MQE#E^)1R]--?O]SW!%7]KB<7\MLR56^WX)#?)/IJR<_@C91NG`(S^S``````````">```` -MG@```!```&1D11```&1D(P@`10``D*84``!`$5`"P`$"%\`!`BT1E!&4`'P` -M`!(T5G@````'!12933DTC1RSTN*./4ZCE%A8GGVL:;@`.%'8MEA.C7/6]D[S -MO1C([D/N6]%[?NISR>1W1EE,)=\I9&.PF-'Q*LXZQU71100.[\,-HK41G3/R -MG9DY$,].(M58U1\0XT\4R[<=RCCXM;_%AVM)``````````">````G@```!`` -M`&1D11```&1D(P@`10``D*85``!`$5`!P`$"%\`!`BT1E!&4`'P``!(T5G@` -M```(*_3L6&DE`65QQPA"@BAQ5FY@=%,+]@C9K+O)@],/GCI4%,MKI282(0M9 -M*<@/=L.DB"**EM":*2KJK`^H=0YM,$^[`=L%(RO,O_<4`MNKJ*:^9W8@1BP$ -59LK`-:)VQ/=2B;1'4FV3B?L]2;O! -` -end diff --git a/contrib/tcpdump/tests/forces1.out b/contrib/tcpdump/tests/forces1.out deleted file mode 100644 index 7e013d7bd00..00000000000 --- a/contrib/tcpdump/tests/forces1.out +++ /dev/null @@ -1,8 +0,0 @@ -IP 192.168.1.7.6700 > 192.168.1.7.34917: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3442086958] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query - -IP 192.168.1.7.34917 > 192.168.1.7.6700: sctp[ForCES HP] (1) [SACK] [cum ack 3442086958] [a_rwnd 56288] [#gap acks 0] [#dup tsns 0] -IP 192.168.1.7.34917 > 192.168.1.7.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 2574629157] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query Response - -IP 192.168.1.7.6700 > 192.168.1.7.34917: sctp[ForCES HP] (1) [SACK] [cum ack 2574629157] [a_rwnd 56296] [#gap acks 0] [#dup tsns 0] diff --git a/contrib/tcpdump/tests/forces1.pcap b/contrib/tcpdump/tests/forces1.pcap deleted file mode 100644 index 49c8f6453b6..00000000000 Binary files a/contrib/tcpdump/tests/forces1.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/forces1vvv.out b/contrib/tcpdump/tests/forces1vvv.out deleted file mode 100644 index 886e42992ef..00000000000 --- a/contrib/tcpdump/tests/forces1vvv.out +++ /dev/null @@ -1,52 +0,0 @@ -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 112) - 192.168.1.7.6700 > 192.168.1.7.34917: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3442086958] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query - ForCES Version 1 len 64B flags 0xf8000000 - SrcID 0x40000001(CE) DstID 0x7(FE) Correlator 0x2 - ForCES flags: - AlwaysACK(0x3), prio=7, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - LFBselect TLV, length 40 (data length 36 Bytes) - FEObj LFB(Classid 1) instance 1 - Oper TLV Get(0x7) length 28 - PATH-DATA TLV, length 24 (data encapsulated 20 Bytes) - Pathdata: Flags 0x0 ID count 1 - ID#01: 2 - PATH-DATA TLV, length 12 (data encapsulated 8 Bytes) - Pathdata: Flags 0x0 ID count 1 - ID#01: 2 - - -IP (tos 0x2,ECT(0), ttl 64, id 7, offset 0, flags [DF], proto SCTP (132), length 48) - 192.168.1.7.34917 > 192.168.1.7.6700: sctp[ForCES HP] - 1) [SACK] [cum ack 3442086958] [a_rwnd 56288] [#gap acks 0] [#dup tsns 0] -IP (tos 0x2,ECT(0), ttl 64, id 8, offset 0, flags [DF], proto SCTP (132), length 124) - 192.168.1.7.34917 > 192.168.1.7.6700: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 2574629157] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query Response - ForCES Version 1 len 76B flags 0x38000000 - SrcID 0x7(FE) DstID 0x40000001(CE) Correlator 0x2 - ForCES flags: - NoACK(0x0), prio=7, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - LFBselect TLV, length 52 (data length 48 Bytes) - FEObj LFB(Classid 1) instance 1 - Oper TLV GetResp(0x9) length 40 - PATH-DATA TLV, length 36 (data encapsulated 32 Bytes) - Pathdata: Flags 0x0 ID count 1 - ID#01: 2 - PATH-DATA TLV, length 24 (data encapsulated 20 Bytes) - Pathdata: Flags 0x0 ID count 1 - ID#01: 2 - FULLDATA TLV (Length 12 DataLen 8 Bytes) - [ - 0x0000: 0000 0002 0000 0001 - ] - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48) - 192.168.1.7.6700 > 192.168.1.7.34917: sctp[ForCES HP] - 1) [SACK] [cum ack 2574629157] [a_rwnd 56296] [#gap acks 0] [#dup tsns 0] diff --git a/contrib/tcpdump/tests/forces1vvvv.out b/contrib/tcpdump/tests/forces1vvvv.out deleted file mode 100644 index 4274ca33b86..00000000000 --- a/contrib/tcpdump/tests/forces1vvvv.out +++ /dev/null @@ -1,67 +0,0 @@ -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 112) - 192.168.1.7.6700 > 192.168.1.7.34917: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3442086958] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query - ForCES Version 1 len 64B flags 0xf8000000 - SrcID 0x40000001(CE) DstID 0x7(FE) Correlator 0x2 - ForCES flags: - AlwaysACK(0x3), prio=7, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - LFBselect TLV, length 40 (data length 36 Bytes) - FEObj LFB(Classid 1) instance 1 - Oper TLV Get(0x7) length 28 - PATH-DATA TLV, length 24 (data encapsulated 20 Bytes) - Pathdata: Flags 0x0 ID count 1 - ID#01: 2 - PATH-DATA TLV, length 12 (data encapsulated 8 Bytes) - Pathdata: Flags 0x0 ID count 1 - ID#01: 2 - - Raw ForCES message - [ - 0x0000: 1004 0010 4000 0001 0000 0007 0000 0000 - 0x0010: 0000 0002 f800 0000 1000 0028 0000 0001 - 0x0020: 0000 0001 0007 001c 0110 0018 0000 0001 - 0x0030: 0000 0002 0110 000c 0000 0001 0000 0002 - ] - -IP (tos 0x2,ECT(0), ttl 64, id 7, offset 0, flags [DF], proto SCTP (132), length 48) - 192.168.1.7.34917 > 192.168.1.7.6700: sctp[ForCES HP] - 1) [SACK] [cum ack 3442086958] [a_rwnd 56288] [#gap acks 0] [#dup tsns 0] -IP (tos 0x2,ECT(0), ttl 64, id 8, offset 0, flags [DF], proto SCTP (132), length 124) - 192.168.1.7.34917 > 192.168.1.7.6700: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 2574629157] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query Response - ForCES Version 1 len 76B flags 0x38000000 - SrcID 0x7(FE) DstID 0x40000001(CE) Correlator 0x2 - ForCES flags: - NoACK(0x0), prio=7, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - LFBselect TLV, length 52 (data length 48 Bytes) - FEObj LFB(Classid 1) instance 1 - Oper TLV GetResp(0x9) length 40 - PATH-DATA TLV, length 36 (data encapsulated 32 Bytes) - Pathdata: Flags 0x0 ID count 1 - ID#01: 2 - PATH-DATA TLV, length 24 (data encapsulated 20 Bytes) - Pathdata: Flags 0x0 ID count 1 - ID#01: 2 - FULLDATA TLV (Length 12 DataLen 8 Bytes) - [ - 0x0000: 0000 0002 0000 0001 - ] - - Raw ForCES message - [ - 0x0000: 1014 0013 0000 0007 4000 0001 0000 0000 - 0x0010: 0000 0002 3800 0000 1000 0034 0000 0001 - 0x0020: 0000 0001 0009 0028 0110 0024 0000 0001 - 0x0030: 0000 0002 0110 0018 0000 0001 0000 0002 - 0x0040: 0112 000c 0000 0002 0000 0001 - ] - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 48) - 192.168.1.7.6700 > 192.168.1.7.34917: sctp[ForCES HP] - 1) [SACK] [cum ack 2574629157] [a_rwnd 56296] [#gap acks 0] [#dup tsns 0] diff --git a/contrib/tcpdump/tests/forces2.out b/contrib/tcpdump/tests/forces2.out deleted file mode 100644 index a997b5946df..00000000000 --- a/contrib/tcpdump/tests/forces2.out +++ /dev/null @@ -1,491 +0,0 @@ -IP 122.234.155.8.32820 > 150.140.188.145.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 996458213] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Setup - -IP 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691905] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Response - -IP 150.140.188.146.32780 > 150.140.188.145.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 2256581227] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Setup - -IP 150.140.188.145.6700 > 150.140.188.146.32780: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3596535672] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Response - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632869] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244257] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.50001 > 150.140.188.145.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3118638120] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Setup - -IP 150.140.188.145.6700 > 150.140.188.175.50001: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3264258942] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Response - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073935] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825012] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632870] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632870] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019513] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437131] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073936] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825013] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632871] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244258] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019514] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437132] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073937] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825014] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632872] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244260] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019515] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437133] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073938] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825015] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632873] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244261] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019516] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437134] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073939] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825016] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691906] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query - -IP 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691906] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query - -IP 122.234.155.8.32820 > 150.140.188.145.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 996458214] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query Response - -IP 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691906] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019517] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437135] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073940] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825017] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632874] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244262] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019518] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437136] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073941] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825018] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632875] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244263] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019519] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437137] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073942] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825019] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632876] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632876] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019520] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437138] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073943] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825020] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632877] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244264] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019521] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437139] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073944] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825021] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632878] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244266] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019522] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437140] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073945] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825022] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632879] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244267] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019523] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437141] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073946] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825023] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632880] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632880] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019524] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437142] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073947] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691907] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES Config - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825024] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32820 > 150.140.188.145.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 996458215] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES Config Response - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019525] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437143] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073948] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632881] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825025] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632881] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019526] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437144] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073949] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632882] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825026] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244269] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019527] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437145] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073950] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825027] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632883] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244271] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019528] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437146] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073951] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825028] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632884] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244272] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019529] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437147] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073952] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825029] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632885] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244273] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691908] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES Config - -IP 122.234.155.8.32820 > 150.140.188.145.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 996458216] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES Config Response - -IP 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691908] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES Config - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019530] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437148] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073953] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825030] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632886] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019531] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437149] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073954] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825031] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632887] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019532] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437150] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244274] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat -, (2) [DATA] (B)(E) [TSN: 1662244278] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073955] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825032] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632888] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019533] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437151] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073956] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825033] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632889] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244279] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019534] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437152] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244283] [SID: 0] [SSEQ 26] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073957] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825034] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632890] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244284] [SID: 0] [SSEQ 27] [PPID 0x0] - ForCES HeartBeat - -IP 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244285] [SID: 0] [SSEQ 28] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019535] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437153] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073958] [SID: 0] [SSEQ 23] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825035] [SID: 0] [SSEQ 23] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019536] [SID: 0] [SSEQ 23] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437154] [SID: 0] [SSEQ 23] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073959] [SID: 0] [SSEQ 24] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825036] [SID: 0] [SSEQ 24] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019537] [SID: 0] [SSEQ 24] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437155] [SID: 0] [SSEQ 24] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073960] [SID: 0] [SSEQ 25] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825037] [SID: 0] [SSEQ 25] [PPID 0x0] - ForCES HeartBeat - -IP 150.140.188.145.6700 > 150.140.188.146.32780: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3596535673] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Association TearDown - -IP 150.140.188.145.6700 > 150.140.188.175.50001: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3264258943] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Association TearDown - diff --git a/contrib/tcpdump/tests/forces2.pcap b/contrib/tcpdump/tests/forces2.pcap deleted file mode 100644 index 6970b348782..00000000000 Binary files a/contrib/tcpdump/tests/forces2.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/forces2v.out b/contrib/tcpdump/tests/forces2v.out deleted file mode 100644 index dff4df56459..00000000000 --- a/contrib/tcpdump/tests/forces2v.out +++ /dev/null @@ -1,982 +0,0 @@ -IP (tos 0x0, ttl 43, id 1, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32820 > 150.140.188.145.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 996458213] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Setup - ForCES Version 1 len 24B flags 0xf8000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x1 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691905] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Response - ForCES Version 1 len 32B flags 0x38100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x1 - -IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32780 > 150.140.188.145.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 2256581227] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Setup - ForCES Version 1 len 24B flags 0xf8000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x1 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80) - 150.140.188.145.6700 > 150.140.188.146.32780: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3596535672] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Response - ForCES Version 1 len 32B flags 0x38100000 - SrcID 0x40000001(CE) DstID 0x6(FE) Correlator 0x1 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632869] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x1 - -IP (tos 0x0, ttl 43, id 2, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244257] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x1 - -IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.50001 > 150.140.188.145.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3118638120] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Setup - ForCES Version 1 len 24B flags 0xf8000000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x1 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80) - 150.140.188.145.6700 > 150.140.188.175.50001: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3264258942] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Response - ForCES Version 1 len 32B flags 0x38100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x1 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073935] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x1 - -IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825012] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x1 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632870] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x2 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632870] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x2 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019513] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x1 - -IP (tos 0x2,ECT(0), ttl 64, id 4, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437131] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x1 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073936] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x2 - -IP (tos 0x2,ECT(0), ttl 64, id 3, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825013] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x2 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632871] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x3 - -IP (tos 0x0, ttl 43, id 7, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244258] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x2 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019514] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x2 - -IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437132] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x2 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073937] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x3 - -IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825014] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x3 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632872] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x4 - -IP (tos 0x0, ttl 43, id 8, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244260] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x4 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019515] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x3 - -IP (tos 0x2,ECT(0), ttl 64, id 7, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437133] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x3 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073938] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x4 - -IP (tos 0x2,ECT(0), ttl 64, id 8, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825015] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x4 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632873] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x5 - -IP (tos 0x0, ttl 43, id 10, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244261] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x5 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019516] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x4 - -IP (tos 0x2,ECT(0), ttl 64, id 9, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437134] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x4 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073939] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x5 - -IP (tos 0x2,ECT(0), ttl 64, id 10, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825016] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x5 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 152) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691906] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query - ForCES Version 1 len 104B flags 0xf8400000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x6 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 152) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691906] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query - ForCES Version 1 len 104B flags 0xf8400000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x6 - -IP (tos 0x0, ttl 43, id 9, offset 0, flags [DF], proto SCTP (132), length 372) - 122.234.155.8.32820 > 150.140.188.145.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 996458214] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query Response - ForCES Version 1 len 324B flags 0x38400000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x6 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 152) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691906] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query - ForCES Version 1 len 104B flags 0xf8400000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x6 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019517] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x5 - -IP (tos 0x2,ECT(0), ttl 64, id 11, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437135] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x5 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073940] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x6 - -IP (tos 0x2,ECT(0), ttl 64, id 12, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825017] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x6 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632874] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x7 - -IP (tos 0x0, ttl 43, id 14, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244262] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x7 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019518] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x6 - -IP (tos 0x2,ECT(0), ttl 64, id 13, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437136] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x6 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073941] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x7 - -IP (tos 0x2,ECT(0), ttl 64, id 14, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825018] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x7 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632875] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x8 - -IP (tos 0x0, ttl 43, id 16, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244263] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x8 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019519] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x7 - -IP (tos 0x2,ECT(0), ttl 64, id 15, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437137] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x7 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073942] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x8 - -IP (tos 0x2,ECT(0), ttl 64, id 16, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825019] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x8 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632876] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x9 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632876] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x9 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019520] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x8 - -IP (tos 0x2,ECT(0), ttl 64, id 17, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437138] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x8 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073943] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x9 - -IP (tos 0x2,ECT(0), ttl 64, id 18, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825020] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x9 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632877] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x10 - -IP (tos 0x0, ttl 43, id 22, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244264] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x9 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019521] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x9 - -IP (tos 0x2,ECT(0), ttl 64, id 19, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437139] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x9 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073944] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x10 - -IP (tos 0x2,ECT(0), ttl 64, id 20, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825021] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x10 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632878] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x11 - -IP (tos 0x0, ttl 43, id 23, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244266] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x11 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019522] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x10 - -IP (tos 0x2,ECT(0), ttl 64, id 21, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437140] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x10 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073945] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x11 - -IP (tos 0x2,ECT(0), ttl 64, id 22, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825022] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x11 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632879] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x12 - -IP (tos 0x0, ttl 43, id 25, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244267] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x12 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019523] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x11 - -IP (tos 0x2,ECT(0), ttl 64, id 23, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437141] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x11 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073946] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x12 - -IP (tos 0x2,ECT(0), ttl 64, id 24, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825023] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x12 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632880] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x13 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632880] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x13 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019524] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x12 - -IP (tos 0x2,ECT(0), ttl 64, id 25, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437142] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x12 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073947] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x13 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 148) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691907] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES Config - ForCES Version 1 len 100B flags 0xf8400000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x14 - -IP (tos 0x2,ECT(0), ttl 64, id 26, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825024] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x13 - -IP (tos 0x0, ttl 43, id 21, offset 0, flags [DF], proto SCTP (132), length 124) - 122.234.155.8.32820 > 150.140.188.145.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 996458215] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES Config Response - ForCES Version 1 len 76B flags 0x38400000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x14 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019525] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x13 - -IP (tos 0x2,ECT(0), ttl 64, id 27, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437143] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x13 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073948] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x14 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632881] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x15 - -IP (tos 0x2,ECT(0), ttl 64, id 28, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825025] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x14 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632881] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x15 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019526] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x14 - -IP (tos 0x2,ECT(0), ttl 64, id 29, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437144] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x14 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073949] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x15 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632882] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x16 - -IP (tos 0x2,ECT(0), ttl 64, id 30, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825026] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x15 - -IP (tos 0x0, ttl 43, id 35, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244269] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x15 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019527] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x15 - -IP (tos 0x2,ECT(0), ttl 64, id 31, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437145] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x15 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073950] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x16 - -IP (tos 0x2,ECT(0), ttl 64, id 31, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825027] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x16 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632883] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x17 - -IP (tos 0x0, ttl 43, id 36, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244271] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x17 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019528] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x16 - -IP (tos 0x2,ECT(0), ttl 64, id 33, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437146] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x16 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073951] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x17 - -IP (tos 0x2,ECT(0), ttl 64, id 33, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825028] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x17 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632884] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x18 - -IP (tos 0x0, ttl 43, id 38, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244272] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x18 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019529] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x17 - -IP (tos 0x2,ECT(0), ttl 64, id 35, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437147] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x17 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073952] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x18 - -IP (tos 0x2,ECT(0), ttl 64, id 35, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825029] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x18 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632885] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x19 - -IP (tos 0x0, ttl 43, id 40, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244273] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x19 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 128) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691908] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES Config - ForCES Version 1 len 80B flags 0xf8400000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x20 - -IP (tos 0x0, ttl 43, id 29, offset 0, flags [DF], proto SCTP (132), length 128) - 122.234.155.8.32820 > 150.140.188.145.6700: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 996458216] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES Config Response - ForCES Version 1 len 80B flags 0x38400000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x20 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 128) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3761691908] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES Config - ForCES Version 1 len 80B flags 0xf8400000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x20 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019530] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x18 - -IP (tos 0x2,ECT(0), ttl 64, id 37, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437148] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x18 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073953] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x19 - -IP (tos 0x2,ECT(0), ttl 64, id 37, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825030] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x19 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632886] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x21 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019531] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x19 - -IP (tos 0x2,ECT(0), ttl 64, id 39, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437149] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x19 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073954] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x20 - -IP (tos 0x2,ECT(0), ttl 64, id 40, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825031] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x20 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632887] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x22 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019532] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x20 - -IP (tos 0x2,ECT(0), ttl 64, id 41, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437150] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x20 - -IP (tos 0x0, ttl 43, id 46, offset 0, flags [DF], proto SCTP (132), length 112) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244274] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x1 -, (2) [DATA] (B)(E) [TSN: 1662244278] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x3 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073955] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x21 - -IP (tos 0x2,ECT(0), ttl 64, id 42, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825032] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x21 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632888] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x23 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019533] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x21 - -IP (tos 0x2,ECT(0), ttl 64, id 43, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437151] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x21 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073956] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x22 - -IP (tos 0x2,ECT(0), ttl 64, id 44, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825033] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x22 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632889] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x24 - -IP (tos 0x0, ttl 43, id 50, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244279] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x4 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019534] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x22 - -IP (tos 0x2,ECT(0), ttl 64, id 45, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437152] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x22 - -IP (tos 0x0, ttl 43, id 51, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244283] [SID: 0] [SSEQ 26] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x6 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073957] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x23 - -IP (tos 0x2,ECT(0), ttl 64, id 46, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825034] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x23 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2633632890] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x25 - -IP (tos 0x0, ttl 43, id 52, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244284] [SID: 0] [SSEQ 27] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x25 - -IP (tos 0x0, ttl 43, id 54, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1662244285] [SID: 0] [SSEQ 28] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x7 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019535] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x23 - -IP (tos 0x2,ECT(0), ttl 64, id 47, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437153] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x23 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073958] [SID: 0] [SSEQ 23] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x24 - -IP (tos 0x2,ECT(0), ttl 64, id 48, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825035] [SID: 0] [SSEQ 23] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x24 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019536] [SID: 0] [SSEQ 23] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x24 - -IP (tos 0x2,ECT(0), ttl 64, id 49, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437154] [SID: 0] [SSEQ 23] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x24 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073959] [SID: 0] [SSEQ 24] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x25 - -IP (tos 0x2,ECT(0), ttl 64, id 50, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825036] [SID: 0] [SSEQ 24] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x25 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 1724019537] [SID: 0] [SSEQ 24] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x25 - -IP (tos 0x2,ECT(0), ttl 64, id 51, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3749437155] [SID: 0] [SSEQ 24] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x25 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 3406073960] [SID: 0] [SSEQ 25] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x26 - -IP (tos 0x2,ECT(0), ttl 64, id 52, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] (1) [DATA] (B)(E) [TSN: 2826825037] [SID: 0] [SSEQ 25] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x26 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80) - 150.140.188.145.6700 > 150.140.188.146.32780: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3596535673] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Association TearDown - ForCES Version 1 len 32B flags 0x38100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x0 - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80) - 150.140.188.145.6700 > 150.140.188.175.50001: sctp[ForCES HP] (1) [DATA] (B)(E) [TSN: 3264258943] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Association TearDown - ForCES Version 1 len 32B flags 0x38100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x0 - diff --git a/contrib/tcpdump/tests/forces2vv.out b/contrib/tcpdump/tests/forces2vv.out deleted file mode 100644 index d43de7435bd..00000000000 --- a/contrib/tcpdump/tests/forces2vv.out +++ /dev/null @@ -1,1966 +0,0 @@ -IP (tos 0x0, ttl 43, id 1, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32820 > 150.140.188.145.6700: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 996458213] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Setup - ForCES Version 1 len 24B flags 0xf8000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x1 - ForCES flags: - AlwaysACK(0x3), prio=7, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3761691905] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Response - ForCES Version 1 len 32B flags 0x38100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x1 - ForCES flags: - NoACK(0x0), prio=7, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32780 > 150.140.188.145.6700: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 2256581227] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Setup - ForCES Version 1 len 24B flags 0xf8000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x1 - ForCES flags: - AlwaysACK(0x3), prio=7, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80) - 150.140.188.145.6700 > 150.140.188.146.32780: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3596535672] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Response - ForCES Version 1 len 32B flags 0x38100000 - SrcID 0x40000001(CE) DstID 0x6(FE) Correlator 0x1 - ForCES flags: - NoACK(0x0), prio=7, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632869] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x1 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 2, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244257] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x1 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 1, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.50001 > 150.140.188.145.6700: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3118638120] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Setup - ForCES Version 1 len 24B flags 0xf8000000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x1 - ForCES flags: - AlwaysACK(0x3), prio=7, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80) - 150.140.188.145.6700 > 150.140.188.175.50001: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3264258942] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES Association Response - ForCES Version 1 len 32B flags 0x38100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x1 - ForCES flags: - NoACK(0x0), prio=7, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073935] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x1 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 2, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825012] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x1 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632870] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x2 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632870] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x2 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019513] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x1 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 4, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437131] [SID: 0] [SSEQ 0] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x1 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073936] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x2 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 3, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825013] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x2 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632871] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x3 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 7, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244258] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x2 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019514] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x2 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437132] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x2 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073937] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x3 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 5, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825014] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x3 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632872] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x4 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 8, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244260] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x4 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019515] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x3 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 7, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437133] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x3 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073938] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x4 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 8, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825015] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x4 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632873] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x5 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 10, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244261] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x5 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019516] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x4 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 9, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437134] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x4 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073939] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x5 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 10, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825016] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x5 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 152) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3761691906] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query - ForCES Version 1 len 104B flags 0xf8400000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x6 - ForCES flags: - AlwaysACK(0x3), prio=7, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 152) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3761691906] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query - ForCES Version 1 len 104B flags 0xf8400000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x6 - ForCES flags: - AlwaysACK(0x3), prio=7, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 9, offset 0, flags [DF], proto SCTP (132), length 372) - 122.234.155.8.32820 > 150.140.188.145.6700: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 996458214] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query Response - ForCES Version 1 len 324B flags 0x38400000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x6 - ForCES flags: - NoACK(0x0), prio=7, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 152) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3761691906] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Query - ForCES Version 1 len 104B flags 0xf8400000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x6 - ForCES flags: - AlwaysACK(0x3), prio=7, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019517] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x5 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 11, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437135] [SID: 0] [SSEQ 4] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x5 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073940] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x6 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 12, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825017] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x6 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632874] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x7 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 14, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244262] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x7 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019518] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x6 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 13, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437136] [SID: 0] [SSEQ 5] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x6 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073941] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x7 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 14, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825018] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x7 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632875] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x8 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 16, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244263] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x8 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019519] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x7 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 15, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437137] [SID: 0] [SSEQ 6] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x7 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073942] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x8 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 16, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825019] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x8 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632876] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x9 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632876] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x9 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019520] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x8 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 17, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437138] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x8 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073943] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x9 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 18, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825020] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x9 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632877] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x10 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 22, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244264] [SID: 0] [SSEQ 7] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x9 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019521] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x9 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 19, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437139] [SID: 0] [SSEQ 8] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x9 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073944] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x10 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 20, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825021] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x10 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632878] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x11 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 23, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244266] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x11 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019522] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x10 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 21, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437140] [SID: 0] [SSEQ 9] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x10 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073945] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x11 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 22, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825022] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x11 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632879] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x12 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 25, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244267] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x12 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019523] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x11 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 23, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437141] [SID: 0] [SSEQ 10] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x11 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073946] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x12 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 24, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825023] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x12 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632880] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x13 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632880] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x13 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019524] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x12 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 25, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437142] [SID: 0] [SSEQ 11] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x12 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073947] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x13 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 148) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3761691907] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES Config - ForCES Version 1 len 100B flags 0xf8400000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x14 - ForCES flags: - AlwaysACK(0x3), prio=7, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 26, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825024] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x13 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 21, offset 0, flags [DF], proto SCTP (132), length 124) - 122.234.155.8.32820 > 150.140.188.145.6700: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 996458215] [SID: 0] [SSEQ 2] [PPID 0x0] - ForCES Config Response - ForCES Version 1 len 76B flags 0x38400000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x14 - ForCES flags: - NoACK(0x0), prio=7, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019525] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x13 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 27, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437143] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x13 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073948] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x14 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632881] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x15 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 28, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825025] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x14 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632881] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x15 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019526] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x14 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 29, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437144] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x14 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073949] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x15 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632882] [SID: 0] [SSEQ 13] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x16 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 30, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825026] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x15 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 35, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244269] [SID: 0] [SSEQ 12] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x15 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019527] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x15 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 31, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437145] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x15 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073950] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x16 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 31, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825027] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x16 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632883] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x17 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 36, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244271] [SID: 0] [SSEQ 14] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x17 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019528] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x16 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 33, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437146] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x16 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073951] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x17 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 33, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825028] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x17 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632884] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x18 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 38, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244272] [SID: 0] [SSEQ 15] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x18 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019529] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x17 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 35, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437147] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x17 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073952] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x18 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 35, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825029] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x18 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632885] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x19 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 40, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244273] [SID: 0] [SSEQ 16] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x19 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 128) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3761691908] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES Config - ForCES Version 1 len 80B flags 0xf8400000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x20 - ForCES flags: - AlwaysACK(0x3), prio=7, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 29, offset 0, flags [DF], proto SCTP (132), length 128) - 122.234.155.8.32820 > 150.140.188.145.6700: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 996458216] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES Config Response - ForCES Version 1 len 80B flags 0x38400000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x20 - ForCES flags: - NoACK(0x0), prio=7, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 128) - 150.140.188.145.6700 > 122.234.155.8.32820: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3761691908] [SID: 0] [SSEQ 3] [PPID 0x0] - ForCES Config - ForCES Version 1 len 80B flags 0xf8400000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x20 - ForCES flags: - AlwaysACK(0x3), prio=7, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019530] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x18 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 37, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437148] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x18 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073953] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x19 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 37, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825030] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x19 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632886] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x21 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019531] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x19 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 39, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437149] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x19 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073954] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x20 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 40, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825031] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x20 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632887] [SID: 0] [SSEQ 18] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x22 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019532] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x20 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 41, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437150] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x20 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 46, offset 0, flags [DF], proto SCTP (132), length 112) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244274] [SID: 0] [SSEQ 17] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x1 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - - 2) [DATA] (B)(E) [TSN: 1662244278] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x3 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073955] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x21 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 42, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825032] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x21 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632888] [SID: 0] [SSEQ 19] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x23 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019533] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x21 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 43, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437151] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x21 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073956] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x22 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 44, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825033] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x22 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632889] [SID: 0] [SSEQ 20] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x24 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 50, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244279] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x4 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019534] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x22 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 45, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437152] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x22 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 51, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244283] [SID: 0] [SSEQ 26] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x6 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073957] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x23 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 46, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825034] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x23 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 122.234.155.8.32821: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2633632890] [SID: 0] [SSEQ 21] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x3(FE) Correlator 0x25 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 52, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244284] [SID: 0] [SSEQ 27] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x25 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x0, ttl 43, id 54, offset 0, flags [DF], proto SCTP (132), length 72) - 122.234.155.8.32821 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1662244285] [SID: 0] [SSEQ 28] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0000000 - SrcID 0x3(FE) DstID 0x40000000(CE) Correlator 0x7 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019535] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x23 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 47, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437153] [SID: 0] [SSEQ 22] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x23 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073958] [SID: 0] [SSEQ 23] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x24 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 48, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825035] [SID: 0] [SSEQ 23] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x24 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019536] [SID: 0] [SSEQ 23] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x24 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 49, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437154] [SID: 0] [SSEQ 23] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x24 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073959] [SID: 0] [SSEQ 24] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x25 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 50, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825036] [SID: 0] [SSEQ 24] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x25 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.175.41074: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 1724019537] [SID: 0] [SSEQ 24] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x25 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 51, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.175.41074 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3749437155] [SID: 0] [SSEQ 24] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00400000 - SrcID 0x1(FE) DstID 0x40000000(CE) Correlator 0x25 - ForCES flags: - NoACK(0x0), prio=0, execute-all-or-none(0x1), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.145.6702 > 150.140.188.146.32782: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 3406073960] [SID: 0] [SSEQ 25] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0xc0100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x26 - ForCES flags: - AlwaysACK(0x3), prio=0, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 52, offset 0, flags [DF], proto SCTP (132), length 72) - 150.140.188.146.32782 > 150.140.188.145.6702: sctp[ForCES LP] - 1) [DATA] (B)(E) [TSN: 2826825037] [SID: 0] [SSEQ 25] [PPID 0x0] - ForCES HeartBeat - ForCES Version 1 len 24B flags 0x00000000 - SrcID 0x6(FE) DstID 0x40000001(CE) Correlator 0x26 - ForCES flags: - NoACK(0x0), prio=0, EMReserved(0x0), - Standalone(0x0), StartofTransaction(0x0) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80) - 150.140.188.145.6700 > 150.140.188.146.32780: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3596535673] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Association TearDown - ForCES Version 1 len 32B flags 0x38100000 - SrcID 0x40000000(CE) DstID 0x6(FE) Correlator 0x0 - ForCES flags: - NoACK(0x0), prio=7, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - -IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto SCTP (132), length 80) - 150.140.188.145.6700 > 150.140.188.175.50001: sctp[ForCES HP] - 1) [DATA] (B)(E) [TSN: 3264258943] [SID: 0] [SSEQ 1] [PPID 0x0] - ForCES Association TearDown - ForCES Version 1 len 32B flags 0x38100000 - SrcID 0x40000000(CE) DstID 0x1(FE) Correlator 0x0 - ForCES flags: - NoACK(0x0), prio=7, EMReserved(0x0), - Standalone(0x0), EndofTransaction(0x2) - Extra flags: rsv(b5-7) 0x0 rsv(b13-31) 0x0 - - diff --git a/contrib/tcpdump/tests/ikev2.puu b/contrib/tcpdump/tests/ikev2.puu deleted file mode 100644 index 85b773fd3a5..00000000000 --- a/contrib/tcpdump/tests/ikev2.puu +++ /dev/null @@ -1,22231 +0,0 @@ -begin 644 ikev2.pcap -MU,.RH0(`!````````````-P%````````1!*W1JWG!0"8`0``F`$```(```!% -M``&43<0``$`1``#`J`$!P*@!`@'T`?0!@`=EJ(AUJ!F)DJ8``````````"$@ -M(@@````````!>"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``M41;U@SLYOW-/):E++M[M":HQZ#U:IPXT;'$\,.FZ.?;I<'[_$%BT02 -MMT9`]@4`7````%P````"````10``6$W%``!`$0``P*@!`<"H`0(!]`'T`$0& -M*:B(=:@9B9*F```````````I("(@`````````#P````@``!`!@````'"(AY0 -MP6X2/RL,<:[\\,L[>8>"QD02MT8;!08`N`$``+@!```"````10`!M$W&``!` -M$0``P*@!`<"H`0(!]`'T`:`'A:B(=:@9B9*F```````````I("((```````` -M`9@A```@``!`!@````'"(AY0P6X2/RL,<:[\\,L[>8>"QB(``'@```!T`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``M41;U@SLYOW-/):E++M[M":H -MQZ#U:IPXT;'$\,.FZ.?;I<'[_$%BT02MT9-*`8`4`$``%`!```"````10`! -M3$W'``!`$0``P*@!`<"H`0(!]`'T`3@'':B(=:@9B9*F<;Z#6.^N=F,A("(@ -M`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@# -M```"````"`0```(H``"(``(``%I6<4TZOV3CH_0!ZMGU,C_PMW^J7QZ9&9L3 -MK((?"@Q/A4>&R@FWIVJE"+SN$?%C::%M7Z!!RBV:C?J"*,8?)(+2%UQ<&I21 -M_"(;['H?II]E;4R8NDFNG7(=[?2@+7[-_"`=QX6A/M=.3SF"=BHG(/_?PV7N -M3C'MO`@:%/L/9\_X%R'? -M[L'Y*0``'```0`3^*_M\+('M"V'W5K5_K'BG7.V*]@```!P``$`%D%E4IX.^ -M+#?BS,3]TG"E,MOF]"A$$K=&E%0&``P!```,`0```@```$4``0A-R```0!$` -M`,"H`0'`J`$"`?0!]`#T!]FHB'6H&8F2IG&^@UCOKG9C+B`C"`````$```#L -M(P``T/8&$UK3<^<(-OVI&V/*3&".&M6"&$B,)D?_'HJ1*5BJ=^^\,&BBKFJW -MP]#+'F^X9-^9QB\LP$5P@(1P@52CD\+TR^^M'VA(4EU)VU8^$S1:3FXOT&;` -M3BSBD?1Q2Z[&OS*#5L1&)'RK@UO:/HX:KEEG)(\!ZSH<`J5!M-H)LR=K0`U0 -MH&=4*F>$:,7T'E0!?`"63Q`#^,B(EJ;Q(A6E\:!@<3S(.`+*XZON&$%\##7< -M;UB@&MN6[1P`G&CC!IKG#TL0K[=S;!$:WDV";D02MT;S:P8`O````+P````" -M````10``N$W)``!`$0``P*@!`<"H`0(!]`'T`*0&B:B(=:@9B9*F<;Z#6.^N -M=F,N(",@`````0```)PD``"`:OZ5O%%'L*U^3,N10<%@I$]\;MW&LIU!2M7B -MN()43]QL/N:8.N%`BU=DL6230X=D5-&_35%:KP/!7J_G&^:TSU&K8&,,1;SP -MXJ+;CNYP"5I.`0_;-"K;;0/:Y=[YU)!\W\C,UO/:FW27Q8Z$J5+9@[K[E!JQ -MWAL+N?^M.T02MT8RB@8`'`$``!P!```"````10`!&$W*``!`$0``P*@!`<"H -M`0(!]`'T`00'Z:B(=:@9B9*F<;Z#6.^N=F,N("0(`````@```/PA``#@4\QL -M"T'Q3D_`5\?VHU)*W>A2'R;V?`6$,*D"VQI2[1;3(F,-+K45-RW!+9?5'S?YI]JIQ:;H)UK6QHAP#+?TO-;[@"7I -M.[;=7U@?KKR^RWF,AV%Z3L&P:Z*0K%_!UN3"GQ -M?;]$A\:2//`+<$#5.;R4?'!7D.3IFX-*>N*HUY]6(.$6%>"G8HB:JX(>#0,3 -M+?N,QK-QA8)!&\V8PD*HL0IF)TVN'.!5^S"DT^9,EIOFX(MB:5CT1&QN2@R- -M>B12*5G&%2YCI77`:3#""74YO[W_",<%,T*,]K12X+BP)9PBDI)=+M8NB5:\ -M?CJ1&F%0F^&LCWM\U&-A=N4D]-#Q=7/RKMW.(E'];5V7NO>T -M'G@T(KQ-J_70.K)"#2=].R\HT?`#VIC11!*W1A"[!@!L````;`````(```!% -M``!H36&N!*].1Z=P)@UAXIT8^Q/."3I'EP!H -MVLLT+WF9S#T-6?=ZE$02MT9=U`8`/`$``#P!```"````10`!.$W.``!`$0`` -MP*@!`<"H`0(!]`'T`20'":B(=:@9B9*F<;Z#6.^N=F,N("0(````!````1PA -M``$`Q_+QS$F7LPIA8C(BU+^U-;JC`AF<38P?W/IT6PLIM>=AC_`U:$A$324! -M#EK4('8(D.W@9L@X)ILBV>,-3^P:`2YS&B$,)#^`.V89<-,NF8Z1GU<\5T+2 -M*(E)!2Q:1J#-?$H:*5[>*6Q/V8.;9-Q)1.$:-?0JC.&+1'(`_0/;U8IQ6#LZ -M)\.`%(R`'.%$4O?75K'U6Q"X2EC/J5)@`?_W%7%49%`BY$5@A5%\[MF+>>(. -MTS*7SUK8`H?G@G**C&N'TK0BY^[:''*S/KQ1I;=M[YI9_]&T^7WLB,(J3U1( -MIQKNWR#(?:Y;1,TN>E&=<9I0GX/SLOKV]<8'VF"?1!*W1A7@!@`<`0``'`$` -M``(```!%``$83<\``$`1``#`J`$!P*@!`@'T`?0!!`?IJ(AUJ!F)DJ9QOH-8 -M[ZYV8RX@)`@````%````_"$``.#:YA-*G/\:3CS%FGG@&:D_A&G=3B^JJM'# -MK[HB[-$H_;'HE4QU/X]BKK:JR7,O04L&7L.5::9POFF`R!ZSY$O)/L8^FG5- -M!%;&<#S7&#<>WN]G22@8#YT4PYY2SZ2E%S:.?;+Z"_VT'/5MEP!B,Q`_(F4/ -MW-7_JX08Y`D#Y'2>$FT&Z=PJ&,_5O]H`$^/IZU/GF[XPZM\/3=SONK#`CH<+ -M*=.;)`''6VC\1J!F>"A7RDC51^00K!7*NV'.F8.+G4T1(H=&14-QL,QN -MP&?A3AY<5E*$#/VN#JA,?PIN>9_W^Q,=%78_[O1>@/)'%LWD?2-2?VC@5:?# -MK<L$[MO$`F''>J9)_!&0RS0&P0C0@30%8.Z\Z1!*W -M1G4.!P#L````[`````(```!%``#H3=$``$`1``#`J`$!P*@!`@'T`?0`U`:Y -MJ(AUJ!F)DJ9QOH-8[ZYV8RX@)"`````%````S"$``+#V_($3\TN2ZWU96@2/ -M5]1EDT0:V:89&>61GGWD14^C6(*3?3MTR#JY6?T%/&H2I1L$H.DN`6@W@F6+ -MN:\KO,>DO5X>[RV\W'<5RL;J[/O,!1I&\B8]&X.'O:U^:,;DNAOI>4X6/DA' -M:)E:GTH8[!UNV[=Z-I -MJ$1-Q'I-P)7KTZP['<,W5PO$+)/-;>A.EC.%\9;&%Z& -MWO@]9O3$W<0SYFNOE0I9G$U>E$YL+8^OS+F4M\).+K>I:E@[A=8X`^J9# -MOMA?>M[BXN=;KNR>#?B(5Z9\I?*B])&="R1ZW7^RA175J#,KC9`[I -MC!9HG?411#(HA&TL6X@PZFT4G!J^T1K0HHRC.9,#;I&674BH*HF!1:VIE*]5 -MEX:62`JVRVE^$^9Y:*=TC#,X>&[[=R4.5!&SI^K(3-(A,DO7N1"=FFE$$K=& -M=S8'`!P!```<`0```@```$4``1A-TP``0!$``,"H`0'`J`$"`?0!]`$$!^FH -MB'6H&8F2IG&^@UCOKG9C+B`D"`````<```#\(0``X`+'`_2]V#)&K<9^'*!] -M?GS^(;:]Z48W:`HS*!.XI,I'-!J].IPW)CB6P()2O['J;'ZD1X.Y*L4JRT^_ -M[%/P-50H'&-W90P)((\]=XL1YWM?O9@[X>EFF2,CDN\QI0']ISQA4/S"Z`NK -M'@U)A%O5U1'WR2A>P(-2:'HJR-<-#>PT=DD<0+E\N=I`5@;\7HU&N^&9YMD: -MZ9.W^J!8/L0I:H"!+[?@KHC3O53$HPY>VR=XR6#SX,M;$VGIF?A-Y-QRM=`& -M@%[[?BTNU`,^$?^5>`$M(I0N-YG)."4&H"%$$K=&#D8'`.P```#L`````@`` -M`$4``.A-U```0!$``,"H`0'`J`$"`?0!]`#4!KFHB'6H&8F2IG&^@UCOKG9C -M+B`D(`````8```#,(0``L'XN9B/&;A8=Z60:Q^&VW]SSI?1;OM$COHCS=4T2 -M440$K\!4L\?WB>M2I#*D.#6=WC$5+!&XT@D@/6)WG*!D@CUP4VQ`^$;4/6:4 -MHO$J,7;U<`>C4&R"__KSV[<3N]NU]4"WLYKN/)<45G%00U8)7WJPQ:A#1\`F -MB\XEG*4;2BW76GXZ?N>?.__%C2_`K#9H8BGR,)M=F-'A_G=P3C&>2^J!TOBZ\M#^#]$ -M0DEGD!CL;QN>3:LF*0RI27"0&WI0+,X -MR12SK:&MNW"_%P=&0^WY?F.MY>T']T9T\FQ(TM:I!$1W -M[I\@,(3";H5`68?LBY:3WJZB#.>,*D4;].@TU[S#Q4P3(K7RBZ,'\LXQH`52 -MN7N/P0.BG^XN`$#,W?H0OSJST2">9#PBC>Q74D#'O74,]-;0;)6/9KV*>8,= -M^''V^]D^`EL6O0/>-?_-NKK&57#2-GYB39^.A6#:F\.B%"MU`(M\ZXZ#G;]" -M7:=,2^%\:QO9<(W4$+<^6@M]T)9N,1#?7[HWQG^INP=6]210)S')V -MUP[@NI%RM!=_O.?Z*!<:(VRHXN#!2>8"R<:@H_]?!4*']4M\,4L'S?;21B0= -MTV3'09S`9'0BT(]5$;$^>URW&6%D9N'&EF]UB-:[/][SY(/,+P%8P'!QUM^N]SW,MLW/>E=8Y!=XVLZW'/9S -M/A<6B^_V[R`5UG#`ME=/QRZ7U"@I"99O.4J?G@_.V.)IN_8.D_#R"`](W-3@ -M+_$2FY3VBR:-W9S_0V\XYX^GF&V'YB+1\]H[/">55PZ\)]/#U1\I[P__`:Z) -MO7'2X0JX^NY]>[2UOHJ>X.J;7C1[NO/KWZ\9S_N -M98A1*)EIQ5[<;587&*#'8;";#V?);F'0"G^BDI`CM:W/W3-#;V.D>!0=4;4C -M,T02MT9GY@<`?````'P````"````10``>$W8``!`$0``P*@!`<"H`0(!]`'T -M`&0&21V;Z44=3Y>H9**DM=#A>VHN("4(`````````%PJ``!`:1M(@IML76W9 -M/ZCC/#C=3`#U0TW"*T)1P(=O"]M=NZ/=!B@Y!U6:)R\'['<)N=66HDS8_FFX -M*A]EV_;R1!*W1D#Q!P!L````;`````(```!%``!H3=D``$`1``#`J`$!P*@! -M`@'T`?0`5`8Y'9OI11U/EZADHJ2UT.%[:BX@)2``````````3````#!$I23@ -M.FG-L;@E0<#<"6$G*L'FZ!5B*`<&K[X0A'OE[=$OXA21Q%4.N!P0%$02MT8` -M``@`;````&P````"````10``:$W:``!`$0``P*@!`<"H`0(!]`'T`%0&.1V; -MZ44=3Y>H9**DM=#A>VHN("4(`````0```$PJ```P7O[NGM9!0O6XN$"%'SGM -M-D%;L+=VOMOW[S/1@3S,S$*700"N58X0#&Z[%&Q$$K=&.`T(`&P```!L```` -M`@```$4``&A-W```0!$``,"H`0'`J`$"`?0!]`!4!CD=F^E%'4^7J&2BI+70 -MX7MJ+B`E(`````$```!,````,)G:-DSX^QV`@LUWBM[!_-IW'1\9B?1C-A'! -M!*Z>I!&/0A4ML"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``WGS[ -MUOV]XT6R7?T[,2)59]+;!_91&!H;O5J=X*+8\Z"B2?EST``I^16[;6?7M0&)!4R+^V[15)%+4?<$I```DKE'6[G)I -M49S&T'5ZDI[0X0Q?IZL?`58S+$LT^$A"SP6E$S&L*V0BZ7B<>!"].TND02MT8T&`D` -M7````%P````"````10``6$W>``!`$0``P*@!`<"H`0(!]`'T`$0&*51S&P,7 -MST[@```````````I("(@`````````#P````@``!`!@````%G7*!?)CY_R?:^ -MA,\_A([]_?EO?T02MT86*`D`N`$``+@!```"````10`!M$W?``!`$0``P*@! -M`<"H`0(!]`'T`:`'A51S&P,7ST[@```````````I("((`````````9@A```@ -M``!`!@````%G7*!?)CY_R?:^A,\_A([]_?EO?R(``'@```!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``WGS[UOV]XT6R7?T[,2)59]+;!_91&!H; -MO5J=X*+8\Z"B2?EST``I^16[;6?7M -M0&)!4R+^V[15)%+4?<$I```DKE'6[G)I49S&T'5ZDI[0X0Q?IZL?`58S+$LT -M^$A"SP -M6E$S&L*V0BZ7B<>!"].TND02MT;Y2PD`4`$``%`!```"````10`!3$W@``!` -M$0``P*@!`<"H`0(!]`'T`3@''51S&P,7ST[@5%`A&I@X#9(A("(@```````` -M`3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"```` -M"`0```(H``"(``(``"E;6V_=X0;85F#![,3)M;_-F1+6+X&\*8>)'7G;`W>2 -M.M04%]Y0J:Z-GK07`HG^4`OL_LDQ/F1;K4$;J!E_A)"+BT8EK7B]6!,4#<*0`` -M'```0`2F9)@!3*OGYW3C]-Z'D%/P^++J]P```!P``$`%42U]_T^!C.UD'U;P -M3A$V#J5'F'9$$K=&PGD)``P!```,`0```@```$4``0A-X0``0!$``,"H`0'` -MJ`$"`?0!]`#T!]E4-+`H>V(\'"Y--#UO')+$LBSD--8+L55@43[3#AMN -M1F4#L^9M1?B7Y'45D) -M.%)C(I2VLNQ621ZQ1`=O;AU%@8@8_;HAVE<8SE/Q[EP/?2:2^?1Z'M'#R&R83V?[@TJ,%LB%).5:+:?2/W*-T('@^K=O&\6P\O -M=97@25W,VDE59][1[%NIGVO+T??>HM5RR2/ -M?7]O"IVMKVI.O6M]_=U^$1:,H81)*2LGW\=7.,VF,:HPHVADHB;?]-:D@=4C -M27D]L%D.O+$_Z2&5I@I[B]+0&`:&P/_9_Q,$S?TY7;"]?8M7`Z0`/!N0C/0I -ML\O%?WL7A![*._PSP578>;P%N2MC,:1!*W1O7B"0!L````;`````(```!%``!H3>8` -M`$`1``#`J`$!P*@!`@'T`?0`5`8Y5',;`Q?/3N!44"$:F#@-DBX@)"`````# -M````3"D``#`[3T^$2DIWV1"%CR8=X\()?NL',9#DES0`MMA9FOUG;S:2:P0! -M4S"ISEG8T402MT;:_@D`/`$``#P!```"````10`!.$WG``!`$0``P*@!`<"H -M`0(!]`'T`20'"51S&P,7ST[@5%`A&I@X#9(N("0(````!````1PA``$`T*H^ -MYK#!9#QV,`N6#?]=`*ML`F'"R%3B\H+Q67&)YR]5]_MDQ-#?7#&\/*IX#G*M -M'C!7YQ)&%@,5NF:,*[B,(#.G/):/G>M$AGHH\%U^8?#1A!<6)25O3_6U/"<3==#Y;#,4[)0JZT)<@SHIF2;A/[F -M$C'THQI$;TY:5[^;'4?,:EB0IV1%QN$1JP`AV[0S6KL_0'][LM1WQ5(#8L_P -M,!'T[D%-$60`IFII=Y#7CJ&O28RD,CG_FSBO39;L)I<),*:\Y7SC,\0ZPC(S -M)NTS=?$*=FFVZKET>6F1%1!*W1O4*"@`<`0``'`$```(```!% -M``$83>@``$`1``#`J`$!P*@!`@'T`?0!!`?I5',;`Q?/3N!44"$:F#@-DBX@ -M)`@````%````_"$``.`^[E<9U09(\JR]9`ON?;OOJ-C[0Y"+O#P['JN0U/S; -M0'QA!8IX>UT\>UDT%S]V/B5%-A#SG"F9L&Q\I+%N\,+"#$(3UP,6L59)EEIX -MRA_8HWC9Y$(NB,JX0(_E-:-3I>[;J+!YRFZYX;_X\+V&CG\,I+1O]P&,L5>?D5_0VYE)C;,1TBR3 -M,KR8L^I]G)!!VOR!(N_HO524T&+^RN$7(P65_WD,Q71?'.N*=J;*QBAA$[86 -M%CPAD``$`1``#`J`$! -MP*@!`@'T`?0`U`:Y5',;`Q?/3N!44"$:F#@-DBX@)"`````$````S"$``+#8 -MQ'W*^WAK+7.KLP!6.3YD1J,L[83^.@E^]5![^87XX@)F$P]]TRIW'9**NZQ] -M?F#\%/#]!R5IRT'L!20-3]$%=3+_/2ZQ'B6%B/S8!SW0,[$JM@4SF_70\X3` -MOQMV`JN(^,.JE[L\\>1'$3*N:3.O0<)Z3(WRM?5X+@IW2U`!87@T4JC;&?)U -M2/U/0+)VV?\P^WW'Y;1A$."+?]DA?Z3H1HK1@E`=);;ON$131!*W1HX\"@#L -M````[`````(```!%``#H3>H``$`1``#`J`$!P*@!`@'T`?0`U`:Y5',;`Q?/ -M3N!44"$:F#@-DBX@)"`````%````S"$``+!-_%.(@QZYU*VX^/J7%+MY.#3_ -M'X8:%]*C;F)63*C4C)R])=KF -M]\-!4:L^KF'/3+[3D\Y*5]=%S1!`#H.*Q/&T[5E,L\K6FL"6NT;J$9N+?ZCF -MG[D#,JYX\L$7@=R=M%1A?);]"CE\*1]@P+<:!7%16RV[;YF* -M<2_I$&GA*MI']U"5U/L+;@&(1!*W1HQ9"@`\`0``/`$```(```!%``$X3>L` -M`$`1``#`J`$!P*@!`@'T`?0!)`<)5',;`Q?/3N!44"$:F#@-DBX@)`@````& -M```!'"$``0!6EYI/.$-B0B"7*Q-SD$CG`2IY5VG$V^YLU]J&T85X=\`]AB_< -MX?[.@8:80\$NU'/WU>]+B,BB(+\L!;KWUX6@^Y+]KL4!ZP,^Q*.D/=]J&W]6 -M:MJNTR(H-C-"2`WRSW"1IG2N':`N$;Q6^Z8N*H"C@0#$/APZR84<:Z\#A[*Z -M`P\=I"_G]0UGV39>(NXWY\6JFV+,[JZ(3'A4T#`4+A8C8#/Q>-PW&W,+@AO>B_FB4S/J5-WEK>'WI3-DHEJ:1U$$K=&360*`!P! -M```<`0```@```$4``1A-[```0!$``,"H`0'`J`$"`?0!]`$$!^E4DE2=LWVYRD-Q`#B'?TZG[ -MY_2&S1]?<`,BM-^/VP@%;+;S^Z'!ROB=B+;[X];:&"+4_ -MV/HH&@=LT98.(_1XG3^E3+,\_B?U6BE+,]4%:?>^Z<`1[;+1+CI,;EQH/IY5'I6K8[-FQ12F78VR)V#+B -MBW&Y^_A#/)Z:F"`<#N+0AP5";_"%=C-K/^E'N(!:L*^7AQEN;;TZ+/>P_KU& -M0$)"?F'-(G)5N7/9*_6#UX:2T^T)$S.5+1\;NH]KQ:M3:V,G)6JYO)MH/%U] -MXL%$$K=&N)<*`.P```#L`````@```$4``.A-[@``0!$``,"H`0'`J`$"`?0! -M]`#4!KE4TL_PIC(/%62(6:@N#$D!! -M)S-I:-'^XP[9$AL:_8,))7)`@63O]08^8,YXZ!.@L/.04+6VF">/"??^ -MU+2Q`^6:9RHL@34[N/#LJC7\[(W$R8CSBM;=>`S"M..A8)CZPZZ_Y&T!!?^P -ME@BUD;7(%)[IUW@GQW^:16Z*IBG#Z(EHG=/GYS%$$K=&FKT*`(P!``",`0`` -M`@```$4``8A-[P``0!$``,"H`0'`J`$"`?0!]`%T!UE4-H&TI31^/?R@03UT%?C4N_<";VNF)#[6R/&NSAPR4>Q`4WHWQB@F<)ON%2 -MC4&#"DGG?)L]>[&Z`PIY;WT5(3&4R65$`5=DY>GA$T!T?N_!P7]M\S#";D?T -M]]H)H'Z\5#2SSMVLAQCB?Y08!E5_;36[])&7Y&^*]]O;[ -MA-&5'@N'4$U)HP?[P;A%G)T&?FE/5VQCASDM(?NKTT,I.7I3YY$S6/)ODWYS -MJ&R<_F&04`!E0&`$^,^AP_Z1+JKP(I&WQ_BD3PSL8B4;YP#?,8K$3[D=L8"M -MOT"9(Y3NNC`@MDQ>DTYI4%7;A[Q9ZUFG\,#B"$LRGQ5&AY/^1!*W1KSQ"@!< -M`0``7`$```(```!%``%83?```$`1``#`J`$!P*@!`@'T`?0!1`RI%8N]N"]A1>MWH0 -MG7CR#'UD!W`U7ZC^"W3G+5$8%VT/ZNNFXB4XTL477'Z#O0O(,IR4W!\M_&BD -M]^0DSV>Q""(H]2M/L^B=#J8-_V2%I6>E;U*RDI;KQPP78PM5P7CRZ6S-07_# -M3-$$HWI49?'!+Q,OUPJ)<5M`RN5@UD?R]\\^.4<0<`@.9+/A/5Z6WVF=H0$N -M=8HK>7FGE8.]JAXG3#-/PU!S.F?8KD_6:2I0_[1MA*3'&NI,8Y5Y9#+;BRV/ -MT\825A,570UMQJ4LLX(&7W0JU/"<(ZS],=,U>N\:FEW^WCB2KC"*I>UDL:B% -M.&E!)9;$WQ``!`$0``P*@!`<"H`0(!]`'T`&0&28SF -M^@RVP`F[")#FM3GJSZ@N("4(`````````%PJ``!`JRS02/].&S51X.16;.H* -MVS"/_(W+7(3\C'[WCT:(M2D9)D-_F](;K0NV325/E)^KZ -M1!*W1IHC"P!L````;`````(```!%``!H3?(``$`1``#`J`$!P*@!`@'T`?0` -M5`8YC.;Z#+;`";L(D.:U.>K/J"X@)2``````````3````#`G=OGODK/:$:HJ -MT"(PTL/*%FKN*Z['9TGQ`#3B;Z+?G\>4FA0>I,$@]P&?VT02MT97,@L`;``` -M`&P````"````10``:$WS``!`$0``P*@!`<"H`0(!]`'T`%0&.8SF^@RVP`F[ -M")#FM3GJSZ@N("4(`````0```$PJ```P0L!]*:R/W5& -M`/^R\6%9`^'%A^$?=`U;/OWCO9B2@8M$$K=&GS\+`&P```!L`````@```$4` -M`&A-]```0!$``,"H`0'`J`$"`?0!]`!4!CF,YOH,ML`)NPB0YK4YZL^H+B`E -M(`````$```!,````,.`[,[F48`GKB^F5D-I#G=A3PW_F-:4R8^6)L9?7R:=0 -MJ%*.4>3BLM4,>?NU1!*W1L4\#`"8`0``F`$```(```!%``&43?4``$`1``#` -MJ`$!P*@!`@'T`?0!@`=ETB+:][SD:'L``````````"$@(@@````````!>"(` -M`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``T69"RFEU,96- -ML3`*__;4)I3K.U6V0/28.KZ=%`:^QB=-VMFZ,KEO/^2V6?-EH4FSDT.#;VW' -M.$7]4X"9,35"-S;)QG@O5J!8>[HJ_F?_,;'YJN>)F<^6UPJ&Z)PP%C3YG:4I -MS3TI?:.,UY[O@6@52[L4@=W>*WT@,#EMA5)@UH$I```D-&6+%NN%Y;P4=?[O -M'>9W4L74T:.@YM_6$"$:YDQ(!%0I```<``!`!%N*FVF3#B9#"X39^$ZU'7%M -MB,1+````'```0`53?.5._2UKES6-G[[B*QS-"L\Y&A[```` -M```````I("(@`````````#P````@``!`!@````$+TQG"/`^M=<;U;B3CKOP# -MR]@#^D02MT9+6PP`N`$``+@!```"````10`!M$WW``!`$0``P*@!`<"H`0(! -M]`'T`:`'A=(BVO>\Y&A[```````````I("((`````````9@A```@``!`!@`` -M``$+TQG"/`^M=<;U;B3CKOP#R]@#^B(``'@```!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``T69"RFEU,96-L3`*__;4)I3K.U6V0/28.KZ=%`:^ -MQB=-VMFZ,KEO/^2V6?-EH4FSDT.#;VW'.$7]4X"9,35"-S;)QG@O5J!8>[HJ -M_F?_,;'YJN>)F<^6UPJ&Z)PP%C3YG:4IS3TI?:.,UY[O@6@52[L4@=W>*WT@ -M,#EMA5)@UH$I```D-&6+%NN%Y;P4=?[O'>9W4L74T:.@YM_6$"$:YDQ(!%0I -M```<``!`!%N*FVF3#B9#"X39^$ZU'7%MB,1+````'```0`53?.5._2UKES6- -MG[[B*QS-"L\Y&A[TPO3Q7FH/@4A("(@`````````3`B```P -M````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H -M``"(``(``!O?XWIU;BO)/QXF*E3XG4=3=GN11W'`W]*D>ABZMA2`_'?\F>WJ8YGL&Z#9*0``'```0`2' -M^Z=!4`![6ECMO>D8&H99`I;8YP```!P``$`%S0',#!PC0A#LWZ3D_^0+$K.% -M"45$$K=&=JT,``P!```,`0```@```$4``0A-^0``0!$``,"H`0'`J`$"`?0! -M]`#T!]G2(MKWO.1H>],+T\5YJ#X%+B`C"`````$```#L(P``T&I]7E!!+9+Y -M]7B(@A'[$UL"'("P_RU5Y%44'J4+LS14[6_T4)LSM]$&XS%\1$"@'38<3_L6%:5Y] -M`G`9T=\^#E"V*[#<70'H5T02MT;XQ0P`O````+P````"````10``N$WZ``!` -M$0``P*@!`<"H`0(!]`'T`*0&B=(BVO>\Y&A[TPO3Q7FH/@4N(",@`````0`` -M`)PD``"`')C-QK,$J]O]XWSYF"=S.D\OLNA>O/%3\BA5*"!)3E&"TGZS6H)1F@7(U6@J&1.;%6W2T]'#V?[>@YL5KL(`IT5KN3B -MA&]$'"BQQ93U%L:3K9?,''I,D&`V)08`@8/AWHU?E9OKF0>8,5VN(T02MT:W -MY0P`'`$``!P!```"````10`!&$W[``!`$0``P*@!`<"H`0(!]`'T`00'Z=(B -MVO>\Y&A[TPO3Q7FH/@4N("0(`````@```/PA``#@4!G?1)Y34`<<"+"^G<$G -MO:GNHVEC81^?X%]OU%-KGA]N9ZFZV](9[7_HI7>2^S>8ABQ&/F?SBO<,G+T1 -MJQ*G!V>8%WX.J`8@A9^A-?*@-R"4Q9CJP!&Y('1II3<3%V57TL0>$ -M\Y&A[TPO3Q7FH/@4N -M("0(`````P```-PA``#`TI)_57M:Z'7341JB&^@(*N.0F$(\*V0M"6;MG8VIR]=R6D7E%^PK$_.<,M`'%'9ZM2:CM98RX2_JJTNI.6C"ELAR3K -MDA"W;J,M.)_MV9JSR"ME!0F=XH]#+':#HLCM_II4"]TJ(+,",KAYHSC!8!2= -MZ1NE59T,$.T0M]9VZAY)L)]_.%;%E:G6"Q8:DX;)RJV'P';"ZKF1/V.8\H@? -M2LIPNWTC'O.#0UKS+%"CH*3$5J(_(N1$$K=&=/P,`&P```!L`````@```$4` -M`&A-_0``0!$``,"H`0'`J`$"`?0!]`!4!CG2(MKWO.1H>],+T\5YJ#X%+B`D -M(`````(```!,*0``,/]LMG:P)\`MJ9H[JF\/N8O(@/(MXN%2""CU@IZ\?WM: -M?E6!^B.#HWS:?7/?1!*W1O$7#0!L````;`````(```!%``!H3?X``$`1``#` -MJ`$!P*@!`@'T`?0`5`8YTB+:][SD:'O3"]/%>:@^!2X@)"`````#````3"D` -M`#!04+PYGI488Z?O'M^3+YSD8GN(*BO5?&PMOB)*E8FLSB(/$JX`'37B(\B9 -MWD02MT8>,PT`/`$``#P!```"````10`!.$W_``!`$0``P*@!`<"H`0(!]`'T -M`20'"=(BVO>\Y&A[TPO3Q7FH/@4N("0(````!````1PA``$`9""'&R;"P>&O -MDM(_(M:3LMO'3T`#*)P"\OYUF:"$,.UI[R1CH[H>]0E&0^4ANW/Q8'QZKO`< -M#`4QPL&=,IH4YS72J#2EL@=$WL$\MDA[ZJ*S=/(XV09D3#,I#]S94,"U"!-7 -M;0`S8$]^H*X2=GTDV_7FZ(-_%A`H"@66G4J_$3SM#7,>@WMN9%B"U"IB45M# -M!):+3=!X,E&M_:K)WD+BQ2BT.O&,C*KDP\?-F!$%@-"W8';M:_JOMH)%:I3? -M:L'6"#C$ASUT[M'IT2*R';4$7)(KE$;T4>M4K@N;+IVCJ/5S`F&NJ__N\-,"&1!*W1H(^#0`<`0``'`$```(```!%``$83@`` -M`$`1``#`J`$!P*@!`@'T`?0!!`?ITB+:][SD:'O3"]/%>:@^!2X@)`@````% -M````_"$``.#^MYBRM90'ZJU%P06;4[8FSMB?O_TE'7@X>LEPT!Z$3B2*Q;NC-M -M9T.IKJ^G(+8H@]!*A@`VN).@#L99@HG![C=Z5ZL#9Y-#7/ -M'IXY1!*W1KE.#0#L````[`````(```!%``#H3@$``$`1``#`J`$!P*@!`@'T -M`?0`U`:YTB+:][SD:'O3"]/%>:@^!2X@)"`````$````S"$``+#%7G86BE&= -M!?CR4-40K[B@B$D/>Y#.N1B3/_%* -M'L!75J$NCOC4^`2-MUF"C]2Y@MK^>%JY[$&D4KJ9LH926#`4(N#<`C^2@FU -MC`ZR$SA])CF!\BC_:@^!2X@)"`````%````S"$``+`)9N3CW9>/[*Y!=RP#0^-<]6K+(A.?J_P! -MC$D[APK7M>3Z!]6(.^`@?`0)O1VPFGS=JP -MF35?U)-W-MCW=1!*W1G^/#0`\`0``/`$```(```!%``$X3@,``$`1``#` -MJ`$!P*@!`@'T`?0!)`<)TB+:][SD:'O3"]/%>:@^!2X@)`@````&```!'"$` -M`0"QJ29TI>7174%`&UIAL`N*T%[E4@T`E&U5DRQ]-?'W]=E)K"91SP2*&3$(H%O4 -M1\0%1`/41"1$+D@8"F6R;#"*,14W`,F"^3[C[SR9V(&7+H.5JRX*LBE/O$C5 -M-<-D'SQ_%ZGXK+KOK)D-7Y-@8R]2K6JPJ0KM+RA$$K=&!IL-`!P!```<`0`` -M`@```$4``1A.!```0!$``,"H`0'`J`$"`?0!]`$$!^G2(MKWO.1H>],+T\5Y -MJ#X%+B`D"`````<```#\(0``X#\Y?`H34K#MDF[)^^MI4KZ=Z-/HJ80HM%04 -MJYB=KP")FP"C![&'2A>EE"GI7!7KT5>JEX@+18OA036EYRWC=4/JPG*9=`>V -M":DY-(-UN)*4`(Y\*3^2D5R=#@?F=^,SOZI*A`X;7JN!@R#66+7^" -M#]>*&&GFY'MH??P*737A1;E&YYB`>E#=(V,4R"0 -M,D)SFS#C&2_._!YDON&D39)Z],+T\5YJ#X%+B`D(`````8```#, -M(0``L-!2!)R"/>!GT1JPIC'Q[PE1Q+Q!T!+,E?RO5`;4Y84['B.,$?Q%,HG&9\89=P-? -MYYK->3+S4$G"(N$C8R=0>E.-2>0+J:D5.606[JC\!@YGY>!J(\4`%^BZCW7G -M6'IZ8Y3XORTD59I=;%#!_N#<;\EID!XB9A44_$**9X:UW<.VC7DHF0Q$$K=& -ME\X-`.P```#L`````@```$4``.A."```0!$``,"H`0'`J`$"`?0!]`#4!KG2 -M(MKWO.1H>],+T\5YJ#X%+B`D(`````<```#,(0``L++N/U(18>@<`Q/&Q4#W -M6)NIS>1AN]Z6P5)+',J+A^2D1X`&.=U.ZFS\V!!1,^A&L7_^*X -MFPU()Q,J'D)[,)VOK#!,,^/QYQ1=KY=%=!'Y$$K=&GO0-`(P!``",`0```@```$4` -M`8A."0``0!$``,"H`0'`J`$"`?0!]`%T!UG2(MKWO.1H>],+T\5YJ#X%+B`D -M"`````@```%L(0`!4`PYR,>_*Z5VFMBEONYP7IXX=^%"$S@!]A3Q!5#N>R'[ -M:KUL`HSWR9@7^>>D;AV+]?^PK/SV<,^:.R["VMSH"?T*'IRI9HS1_"!+0W-* -MA)OG_/Y)CW[CD3>%''KN<.A`/9=4`"442C@_SU;-,]`R5,12/1A;6!T -M6[*)O.%-1.[#*12%?&"LAZTK'+;DR7)P;QHYBMH$-O2HVI;>$AF;U%X9E;5[3@M)4Z[^PB]BON%7/R"]% -M0JEO9EJ39DV`GNOVD%CY!V*>BQMJGRI9_. -M8#7UPK@3%\-0J&_&)7S/.\UG9$[_]\A@-J.]Y\D)1!*W1CPJ#@!<`0``7`$` -M``(```!%``%83@H``$`1``#`J`$!P*@!`@'T`?0!1`:@^!2X@)"`````(```!/"$``2"W_,`NY'"2-U`_I!?S!'IWMK\7PZP!C%'QM!I\ -M?_IWDP:3VT[Q'O_-W,&_Z!X4D?,V7L34FAID>Z4(X1=<[402MT8T4@X`?``` -M`'P````"````10``>$X+``!`$0``P*@!`<"H`0(!]`'T`&0&2?76W9IJ;HV= -MBA'-Q:0U.*$N("4(`````````%PJ``!`3IRAK3*4M%PZ[%7AW81CXA%;B%[W -M"5+$"N+A(J_:Z*XD1DXWJ8A3E`&Z&@':@S02JTD-J"LR"J3EB8&11!*W1J9= -M#@!L````;`````(```!%``!H3@P``$`1``#`J`$!P*@!`@'T`?0`5`8Y]=;= -MFFINC9V*$W -M^%H!39>]7QUK0WR0-IR$UG)RK+YLQJ-L;HZ.WD02MT9>;`X`;````&P````" -M````10``:$X-``!`$0``P*@!`<"H`0(!]`'T`%0&.?76W9IJ;HV=BA'-Q:0U -M.*$N("4(`````0```$PJ```P4VK?Y%Y"DFV_;%.S\[-_XGPFS&LN"4:0M1&QZ911*W1IPT``"8`0``F`$```(```!%``&43@\``$`1``#`J`$!P*@! -M`@'T`?0!@`=E43]1BISDM%X``````````"$@(@@````````!>"(``'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``U-=BQ2%E7U'S5N4RH(B^ -M+=0-3+_M&I;:5:K;@CU@WJQ')"AN6Q2-@AST`AL$FSMT*84):F^`&NLU.CA^ -M`H@QG3(%B/R:N0+BY.QTZ1YXG/M"I*:]7*?!$&_DB,,@=XD!-7;@!1@(^KXP -M!#CXAQ@5R^$`I```DDKP/J2O''F><.[)*CI05YR+L -MY#3),VBI]VE#TJ&=7JDI```<``!`!!O5GA2Y```` -M'```0`65*0KIH3'WIOWFPY_>:7/YFHXH$$42MT9L0P``7````%P````"```` -M10``6$X0``!`$0``P*@!`<"H`0(!]`'T`$0&*5$_48J```````````I -M("(@`````````#P````@``!`!@````$:F2,_?E>C1)LM]TY96X"U4A;%+442 -MMT9"5```N`$``+@!```"````10`!M$X1``!`$0``P*@!`<"H`0(!]`'T`:`' -MA5$_48J```````````I("((`````````9@A```@``!`!@````$:F2,_ -M?E>C1)LM]TY96X"U4A;%+2(``'@```!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``U-=BQ2%E7U'S5N4RH(B^+=0-3+_M&I;:5:K;@CU@WJQ')"AN -M6Q2-@AST`AL$FSMT*84):F^`&NLU.CA^`H@QG3(%B/R:N0+BY.QTZ1YXG/M" -MI*:]7*?!$&_DB,,@=XD!-7;@!1@(^KXP!#CXAQ@5R -M^$`I```DDKP/J2O''F><.[)*CI05YR+LY#3),VBI]VE#TJ&=7JDI```<``!` -M!!O5GA2Y````'```0`65*0KIH3'WIOWFPY_>:7/Y -MFHXH$$42MT;5=P``4`$``%`!```"````10`!3$X2``!`$0``P*@!`<"H`0(! -M]`'T`3@''5$_48J^M[MF1:N?_`A("(@`````````3`B```P````+`$! -M``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(` -M`#I1MF=>2J!2%3$W$0HV!0B?P+!5EWW2`%W$D%W+BH(U341R`0S:-O`(<6+A -M]95:27TD^#`MGW'+K[ORU\_2RVZ)W+@9>OEUF#7%R44?_"1?<8A*>1P%ED"' -M?R0.4DX[F',:X/4:N<^6*5*9OS?R90%$/D":]&!W3)6U!9T)P!4\*0``),_V -M3KK2N#AS_D">S#$]M[$-0[*\3;=M.)(-E["?$3[1*0``'```0`2,@4%_KIS6 -M">=-(+(6H=^NT:/]00```!P``$`%C5-'[^61SCXURH]OC84!"_2\/FQ%$K=& -MV:0```P!```,`0```@```$4``0A.$P``0!$``,"H`0'`J`$"`?0!]`#T!]E1 -M/U&*G.2T7OK>[9D6KG_P+B`C"`````$```#L(P``T!FOZ+1:!GXHH^]5=B[# -M).EJTY*O.O=T\.D=I0ST1[&]Q&B\)TRF'//%"Y>7JRQNRY/O7)^;D^I&Q!)Q -M/XKI3$]NI"V0"(]WUDBIUP`.6_-=W'*%V!H(U%T(USB:>%=PS>@BYT8`"X%MBP!ET.X7BCX*#DJ35.9>H\ON&PI4Z(/+&U^M[MF1:N?_`N(",@`````0```)PD``"` -MIV+FM=:B&]RQ)JV(QEZ...>M_`K"GO=GZ60I&P:L]"K'%YROUBS&*F,+R%8I -M1#N_R^0Y*$SJS#X'F$UG@A(FU$42MT;?W0``'`$` -M`!P!```"````10`!&$X5``!`$0``P*@!`<"H`0(!]`'T`00'Z5$_48J -M^M[MF1:N?_`N("0(`````@```/PA``#@UT^M[MF1:N?_`N("0(```` -M`P```-PA``#`R\S&AU.FH+/B7^4A&$H^(E8TA'K,6N<8;=70I]5++Z'!C*P$@P]A -M]JLM!GH9"( -M,J92[9D6KG_P+B`D(`````(` -M``!,*0``,-7JN&-'[XT)3)D5#DZS^WTI!?KTRQ%0\&(`9Z)C5`4C1X&B'[XQ -M'6+2X7BK11*W1G$/`0!L````;`````(```!%``!H3A@``$`1``#`J`$!P*@! -M`@'T`?0`5`8Y43]1BISDM%[ZWNV9%JY_\"X@)"`````#````3"D``#"G\I-0 -M>>/F&A_RZGC'-5PH!R%!%HO.3IR'^3MFI71P5AND?_$A[:,(<=%@?$42MT:- -M*P$`/`$``#P!```"````10`!.$X9``!`$0``P*@!`<"H`0(!]`'T`20'"5$_ -M48J^M[MF1:N?_`N("0(````!````1PA``$`<:M_*/>F+65R%EV^,+__ -M4"X&1]]:T(8^4A=OF3_<`N'>=4MFS)`OO,*V>6%8_D!;,+S/NY -MB_KZ8E^2\H7KAS!U\*8_V;\L!HL$<:@\3H(_CQ5\2JC&B^[QT)"Y^_5UC!3@ -M(J:RV;S'0"/NOT17FC8EP3&RS71Z=._Q4<,H94W[..B,`-(N9XF(3?,*R1BY -M)(+JRPIOBZ.B"Z"5IX=:.`Q;PU[6EI'"+J3:H^%6P"#RS/-8U`JR3)(^=&+# -MS';>'/7->O=J`!DEFFY>-#HG'F=^`NU>.VP3.P2MR7E=VMD:8?E]T(1N&F]?!< -M!M)M%EAZ+U'7YX&%8]83UA'7>5&NJ)T6#O+1B]`9V(\2+(G$ -ML!(J/^7U:UQC`^1H:;,O%0/\+BIU"@/$R)\:DR)(<%?,7<(WWO+6&-3M+H,- -ME(#Z:<,(NO?;X86LI>?JI8:\7!BE]CG:^!`M@V-BI4B.2;PX=54=<^IY-"S7 -M#H^MVAE,)/]"%49I@]N41*3PP2PXI*HQV*F+F>76;317[;Z.F@P`KP2+11*W -M1N9&`0#L````[`````(```!%``#H3AL``$`1``#`J`$!P*@!`@'T`?0`U`:Y -M43]1BISDM%[ZWNV9%JY_\"X@)"`````$````S"$``+!@NJ+>U&7'/C+N:6CA -MF:"+[R:;'MG9#ZUC>AF0+%YE6DH/.:.QL7.ZZJD>&`&,!--":Y4W&7:2UOVB-21!;11*W1H1J`0#L````[`````(```!% -M``#H3AT``$`1``#`J`$!P*@!`@'T`?0`U`:Y43]1BISDM%[ZWNV9%JY_\"X@ -M)"`````%````S"$``+"TE%&8QR%FGW9/DI;,!J'^9,%57W>B4D:D_'J.;LI6 -M@H:JP!W?)\2XR:L/DG.(E0OG@E.@UWW.PN'O]A3I7#/-4%%2O+^HU[VD*F?L -MMM"_'ROP55N,_#[`"IXNSQI![SU6(1?;;M#/<86,AOFI(U9T0`D:=J7/C#&# -MUBM+%B1-74?6599.$+$5TALRR+R!Q\>9P1YEPT,+X:QXJ1']ZVI -M61^>"3]^/;PM46&"&M`>KM1O=;N045J"D(%C&Y;4,K_B&[0.J*C#R5=OKD#$ -M[,,!=R8C$OL":,K(0?Q]7S-)`:Y"^T$)N#/G/GR.-S/Y(]O,B3#!G+)-D&8R -M?O%VBG&JC8,V`#/Z:2]3%#I%=.[^D+1USS8G3K2E'@DQR!#?*?LD!9?\M[S> -M9)C\D:,D?JI+3YJYK7KJDON)&[HR.75%$K=&DK,!`.P```#L`````@```$4` -M`.A.10``0!$``,"H`0'`J`$"`?0!]`#4!KE1/U&*G.2T7OK>[9D6KG_P+B`D -M(`````8```#,(0``L"\X$;6$Z]DG:46E$0$Y2M6[RK$,N6(O98ERV!=,==83 -MU@2@N'LGD9&;EFRYZ@K/6>_GJX!_S`P-P3V=5BEP%;415SN:UE#(!B9_M]?OE^ -M;3$OV5FNU?"!4MD*T]A+U@A1\_6^4^Z!SH+SXWATR'W6K<.GAUD]QG5O)X+> -M;^HRD_=%$K=&N;0!`!P!```<`0```@```$4``1A.1@``0!$``,"H`0'`J`$" -M`?0!]`$$!^E1/U&*G.2T7OK>[9D6KG_P+B`D"`````<```#\(0``X&XWBH.` -MC.'PR5S`W^[-ZS=G!R*TICN/([-6%QR?)KUC.[(E'I>R-_!!F -MZ!LP:Q*6PLMOI&+J:]2ASH3QY"X5+M(6OIF^XG'ON(3!K,%4$XRMI`R^D;N=%$K=&8]@!`.P` -M``#L`````@```$4``.A.2```0!$``,"H`0'`J`$"`?0!]`#4!KE1/U&*G.2T -M7OK>[9D6KG_P+B`D(`````<```#,(0``L#X;T!OT-UIAI2'P'7;5YW%+1ON@ -M!9YAJFN1YA/E#[?YBU[7,'-D?\$0LADH<#SC6L74^((#T-@/YS\VT;9PW;4% -M9=%@$>'3.D+;PES9`7HD.')\\:PL/M"[0[$O[)TBX.ZTW

9R[C[/],7A)= -M\%/.C/K0#+R'27@L8CLNMV['GFGY6GW!HZJ>0GVR:E-33F`^G#X$/9W^EFMC -MR3^V[Z8!\4-9?_CTCS?8Q[9D6KG_P+B`D"`````@` -M``%L(0`!4+!-/JT4I6U,5\TG]W])`[[LD"BKIH3LN:SO8H^'^*3MKDSY3E&: -M)JX208V\7B=-#*]9WO]*:^R%6%+)_Z&4,]+0EG/$>W2N2S(CL*?#98\\*<:: -M,FL9;W^8!4;0>ACPKT"*-$]8@CTBT52<`8&&_QH%)%KC9YS!LBV3S2V.^DD@ -M/2BFM,HB:Z>2".$V-;_]?[E.4N>#6'6_N/3_JZ&;RS(<]J>N;2Y:#(52"#3U -MX@XGI76XZ!ZIP]FW58M.!&WS\/O>%Q?LO[C-J[(<1 -MT@7!LKA.*9.2^']V;]=A@Z]AV4=;PV61*<)UL;$Q=@1 -M[G#YGS4=*]1LGEGCWM/0RH`#CW\5C?X0@;+UW?9U;GDSW8/VEQY/+82K+B0= -MVJN'MF(I)>PT]HQH$)[V/;U,B28)4,..11*W1@HT`@!<`0``7`$```(```!% -M``%83DH``$`1``#`J`$!P*@!`@'T`?0!1`%%.;(K,2X'VYC71^8J<@0]N/3GP`#(C0L.1;$7`X+&AZ+@]L\C4[Q+_"Y6UBRU2E2V_FSNR0?>TY"!V(O^X^15?#PT_4U=MLNSYY -M#/T7H>PQ['@$6;Y4&7];MVD7QOR/V%[]PKD.7D42MT;V6@(`?````'P````" -M````10``>$Y+``!`$0``P*@!`<"H`0(!]`'T`&0&20UG.Q.A`'F97S5NN6UA -MZ@@N("4(`````````%PJ``!`"MJFT4U2:(!4M[<$R(QN"DLI)$[%JMNBW?U* -MG+)@G76/D`%L&O-)B77_75O<@1+H.29[;9XJN09:V)3-11*W1KUG`@!L```` -M;`````(```!%``!H3DP``$`1``#`J`$!P*@!`@'T`?0`5`8Y#6<[$Z$`>9E? -M-6ZY;6'J""X@)2``````````3````#`QH+P?D0B2&E8:B^XM`%'SY_);^'2/ -M;/.$0<8Z:-70\`D,X,?T!`F(+90+0T42MT9-=P(`;````&P````"````10`` -M:$Y-``!`$0``P*@!`<"H`0(!]`'T`%0&.0UG.Q.A`'F97S5NN6UAZ@@N("4( -M`````0```$PJ```PLIS-UG>G8#?7DY2+&?]S'TG1K%=N]=:GQKMY2+K#!@-0 -MXU+5_PWQ%:[^A/E%$K=&$H4"`&P```!L`````@```$4``&A.3@``0!$``,"H -M`0'`J`$"`?0!]`!4!CD-9SL3H0!YF5\U;KEM8>H(+B`E(`````$```!,```` -M,)T[AOVVWJ\#0YJB_[F3"%16"H=;P*S:M552K2ZA5:ZO!,/\1DBO0^&.$(\? -M11*W1ON!`P"8`0``F`$```(```!%``&43E,``$`1``#`J`$!P*@!`@'T`?0! -M@`=E6KM!)(B+I8D``````````"$@(@@````````!>"(``'@```!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``$UCG_D6)H4E`>+-6'M;O[^C0%(*6 -MIY^,MNX=1/5-Q1L_4_MK.[Q&`8ML=HJ]PNHM.^$WL5/565;>\E7JC`SO=8+F -MW>$=L?:M[!?`37T)IU_X7*4,-,X@8:IQBS$L?FG- -MB9#JO3^X.94[:*_X@!UZ2:0I```DOQQMXM+J`O)2]@0:#'ZAL.'2C$.9Z6O= -MMC\V"4_ZBCLI```<``!`!')?P[&X8FRFFKM7ULO9\I"/6:+D````'```0`48 -ML5%Q<3=":%]!8GKHGW5["&N"GD42MT9HD`,`7````%P````"````10``6$Y4 -M``!`$0``P*@!`<"H`0(!]`'T`$0&*5J[022(BZ6)```````````I("(@```` -M`````#P````@``!`!@````',.1A0KH+-6'M;O[^C0%(*6IY^,MNX=1/5-Q1L_4_MK.[Q&`8ML -M=HJ]PNHM.^$WL5/565;>\E7JC`SO=8+FW>$=L?:M[!?`37T)IU_X7*4,-,X@8:IQBS$L?FG-B9#JO3^X.94[:*_X@!UZ2:0I```D -MOQQMXM+J`O)2]@0:#'ZAL.'2C$.9Z6O=MC\V"4_ZBCLI```<``!`!')?P[&X -M8FRFFKM7ULO9\I"/6:+D````'```0`48L5%Q<3=":%]!8GKHGW5["&N"GD42 -MMT;=Q`,`4`$``%`!```"````10`!3$Y6``!`$0``P*@!`<"H`0(!]`'T`3@' -M'5J[022(BZ6)I1_B\W;9E.PA("(@`````````3`B```P````+`$!``0#```, -M`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``%'S%/>< -MBW5T2#Y)PE!U#/P,E(R^3A$>']&JP`(%,YL.5\$U(BW+H_#]RCQ:TV,^)JG$ -M:M6G7ZE1,PIN^GD]:"A:G:T91M3Y^'NT9'DD(:=IN$R6JBE9)WX*"N5^;+&+ -MV>V[I]]O.-9?J?A-+N)'P%@>!KL,=MJA[*%/]Q6W`W9S*0``)!P:OF=O(L)-KH5E@;X87+]RD2SG1&I.9-4,!L*0``'```0`02[*&9HV1:0?A)X,OY -M9)U_U),_60```!P``$`%C`5%R1(.;;=KTS$PJ0IN1'7>O=%%$K=&J_$#``P! -M```,`0```@```$4``0A.5P``0!$``,"H`0'`J`$"`?0!]`#T!]E:NT$DB(NE -MB:4?XO-VV93L+B`C"`````$```#L(P``T*_2#%Y2_ZYGAIO7H&F&=.OL0V8G -MY+:-W8F -M^+35DD42MT;^"@0`O````+P````"````10``N$Y8``!`$0``P*@!`<"H`0(! -M]`'T`*0&B5J[022(BZ6)I1_B\W;9E.PN(",@`````0```)PD``"`(P=:\.IY -M89^HT,:C%S?X,&E?&^)6@!>\NOT8$&1XI]"C97'"E0G@/?)P^:*=J=K>6)@_ -M=+>+3,4*&2I]&2UZ[J0[$A69O_@F]71H`UQ#(1M8P%[T5>`_M(5ZJ=^0AD%#:S=.3BURT42MT;&*@0`'`$``!P!```" -M````10`!&$Y9``!`$0``P*@!`<"H`0(!]`'T`00'Z5J[022(BZ6)I1_B\W;9 -ME.PN("0(`````@```/PA``#@9_(X`#Q<9A5GA*F?"&6C;/)9U^.=0AU?'_/T -MN,((RB%$IM^F\WWP@8JB[.M'(R9XATH&D+30(T4^@MRJH4Y -MR]5U$CVP3Z(?>'=>8`EO2*[VR/C"0GIF)O`*9RN6>PL1_!U`4M4\PNF442MT8!-@0`_````/P````"````10``^$Y:``!`$0`` -MP*@!`<"H`0(!]`'T`.0&R5J[022(BZ6)I1_B\W;9E.PN("0(`````P```-PA -M``#`KJ-U2&!"NGU[!F/&%:H[J0+KL$3[Y+`1C]Z@3W0G'D%@,RH!G=1(I'A:9/VK!MWC09_] -M^YKWH"W6(=;@9U.3K53CYS&P4()HV$$F7>`^D9V19JLN,*A2[]>QJ;A_NKZ; -MHIE?IUNP@S!"S9,[>M-%Z[+RW&$CP::899)K%'N"!UN^5A&IOP=>HUTD)Z<$ -MUFKV#G8E)SA"R$9%$K=&ST`$`&P```!L`````@```$4``&A.6P``0!$``,"H -M`0'`J`$"`?0!]`!4!CE:NT$DB(NEB:4?XO-VV93L+B`D(`````(```!,*0`` -M,'+AN:5P+;H07>UJ#' -M11*W1DE8!`!L````;`````(```!%``!H3EP``$`1``#`J`$!P*@!`@'T`?0` -M5`8Y6KM!)(B+I8FE'^+S=MF4["X@)"`````#````3"D``#`)%MX#43TP*P4; -MP$OG`^]*Q]*;.@`W@T7%/CW9140Y>\N'L\=."CK)N:9B4^ -MRBXD'8.,BHYU)D3_GV@O0$YTY%%NS$PDJ([U'JO1RR+-R5"TO_<+LL:H'!&. -MV&KCV+TG8^R![85.,U@<(BXP`2>(9^&GI)P_`[O@SF1Q;67-"HR$58:43^&7 -MV5E9GP)3@8^973L0N)*8\>[J&,2>P_XG1W8!-B@%C>WTM^(,O?D8A(``Z>QL -M:Y>A9S>3^+W)+X/]FYTVJ@WE<[Q(9S&E6$R^C@UZ^N2H4G#+ -MZ(?_ACPO7W::!(O.;C+UE^/37(AP%D.,WT6;-@(0(4.,+P-+CYSDI)=_=!PP -MU5*3(:BV11*W1NR"!``<`0``'`$```(```!%``$83EX``$`1``#`J`$!P*@! -M`@'T`?0!!`?I6KM!)(B+I8FE'^+S=MF4["X@)`@````%````_"$``.#5:]NQ -MV"\8G=V(-ESXB3G7=)=$FN^3&G6I(7F?+-EYE,H"$ABI2V,Z"5-(Z_"`O>+' -M&BQ'W6\-9Q%@=J]8R+K)30=^24SP"0..M'"+8J`+(:I,)- -M-FND2%"_#3@]O2!)/-$2>AY#5L0TTP6XNRB=Z$K9'K9B.>#G`D\,=,$)7^OH -M1566R'!EM2WQ@\-%^JJ81VU<(3I^GDDO9\CW\[':8>Z27SA5]"-CZU(Y$\!8 -M\:W+%V)]II6D']K'[^9DT*C$GGM+V2J -M5G]2VUI>$R*BNPS;[DFSFE(Q=_6L=%A3/6<$DZ/:&>B2FJUR(X%LBVP/MF/J -MQ$#@3>>2'\W<`%W2I4$PD(,F,C2*X+G@QS.G\_9R#/"Q+V5;GV#?5DO -M?*LQ?]@5_C7#&@3Q8)'-_4U>11*W1D:U!`#L````[`````(```!%``#H3F`` -M`$`1``#`J`$!P*@!`@'T`?0`U`:Y6KM!)(B+I8FE'^+S=MF4["X@)"`````% -M````S"$``+!N,>@.;&O5J\W+TUU]3P])-=?DN/@=B&E;X1KFMMT_#/PVB -M^E1'`NW#A%217=0U,S8\%XH!,G]S6H+M:ISE3XI1ZMUQ[4PT-2!I@^G-`1S) -MBUZ!][(\+,D;@^#%B"5GWG!#V8NV&]"89'K*\2!-,DY,+;)=0ELBI>8+/-]B -M=/K!X2,G6'4WP??[DCL`42B:&KSQPJ!_AL-V"=DBYNU#$@S9(Q(5@ZN@;AMG>AR!Y\_N%J7F-ND^!3 -M#$00?$R+#'PQ -MV?;Z1>L*D+`4,:JA:WN*?H%%$K=&$]\$`!P!```<`0```@```$4``1A.8@`` -M0!$``,"H`0'`J`$"`?0!]`$$!^E:NT$DB(NEB:4?XO-VV93L+B`D"`````<` -M``#\(0``X.ZARNS"6*YJVM[&&H>[S:C`Z68E^$>3*<\[6.?$\T#1!Z5E.#VE)2HHW]:TXQH!SI)"V,_FESOGWY -MDMEUNO6<4]T>8551+14P\"?AN]3^+NHV[3)&U0U!;'8[OSSW9'XW'(*@*=Y[ -MVVUD)%Z..41UP:OE#(UPOK#=F9I7GE$Y5C:1_N]WM9<&G1=ENA07OOVDFN59 -MD!)%$K=&2NX$`.P```#L`````@```$4``.A.8P``0!$``,"H`0'`J`$"`?0! -M]`#4!KE:NT$DB(NEB:4?XO-VV93L+B`D(`````8```#,(0``L,G&'-J>21X= -M=ID8*9P'&]/NH(RK-&*%[XK)D,%JZ!.[(P@(M;5EBR/QL?R8]#JP'=(; -M%)[`/66"5V\5^1C%,\LJ:"(B><:U<9B)H4_< -M^NZO>2VR1.YAP):7$E0)=K#W\QKF`O4=H4$6!U6S,P&IW0'\:-L3L[@T- -MY%@I,R1XQBQ/39%%$K=&+#T%`(P!``",`0```@```$4``8A.9P``0!$``,"H -M`0'`J`$"`?0!]`%T!UE:NT$DB(NEB:4?XO-VV93L+B`D"`````@```%L(0`! -M4'M[T>9(2#F4V8!3E-UA5T(,F0W/G0AB(CNT`/4A9E.^?ZOOS"R=W"K;A6\; -M\.PK+@G["J/`'=H"$9VL(#=^_,'Y(MUEH[;G:VV'JF; -M7MLQ"TWBR@`$HSZC=#=+!:@1O*]N;.R*2,_!5V11),12JDV:;#UI\R@*-C6% -M)]H(QSJOJJ%TTWU'9M-5\P%%S!OJI'20D5<-5QR_A%Y;=9E1^KJOM.B"A$]H]O-55_3AYYW[G]X+W`5M5&W^`ZU10,;KQGZ,D^$OB[R'Z2@,GY?NGG1[@<])B-_Z%Y -M3\%(Z[YY15A94>>*T].<[@[311*W1E9R!0!<`0``7`$```(```!%``%83F@` -M`$`1``#`J`$!P*@!`@'T`?0!1`@<5('4UGPZJB=1J)W)A&2%3 -M5[=C>X&E*/N!C\67VD.A44=IPHOMNW!9 -MC]0X3VN-D(K`BJ<-\*+@F-^WR[M-%9])N<8UFI%FW+(%Q1@H5IUNC!9D83FX -MK%PQF4$3YU.9]3F@"`0=T>4ZVM'#'TQTUKW0WIE!$3OMR<[DC57+7N*LD&2O -MBT7H0F]WA[_CGVY7$YI``!`$0``P*@!`<"H`0(!]`'T`&0&2?0VTAS6.P1XNLYK\LA)O?@N("4( -M`````````%PJ``!`A]B%?`W`8KCZNPPR_:C5,8$FHS-+K.:_+(2;WX+B`E(`````$```!,````,-=MWMU4 -M`--'_*R7<6[N::AC7[D!**86ZRL#,>U_,`_3IF5+@2^I)C)@*_<=11*W1I;Z -M!@"8`0``F`$```(```!%``&43FX``$`1``#`J`$!P*@!`@'T`?0!@`=E@5*K -MN#D7COX``````````"$@(@@````````!>"(``'@```!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``.--'%60%A]+_ZM-K>O8BR"79(B*3"$O9=,^: -MU?5_1,W5+#Q1O!U]IG+^]'7I0/[917(4B[2=:N*%K,^(&OY*#;#H8$L7/-(4 -ME)B.EP,YI+YZIJ1]I?\CM6:BJ#F+*HKC^'`.:Z)'K4^M7IM)%2J@$U6-EP@! -M>4S'>@'(.);$J7O8BR"79(B*3"$O9=,^:U?5_1,W5+#Q1O!U]IG+^]'7I0/[9 -M17(4B[2=:N*%K,^(&OY*#;#H8$L7/-(4E)B.EP,YI+YZIJ1]I?\CM6:BJ#F+ -M*HKC^'`.:Z)'K4^M7IM)%2J@$U6-EP@!>4S'>@'(.);$J7K$[>&?4)+9 -M>?QI6/G#6A@X$]GI-H++>JRUGXW"\U"/`53Q(U`: -MJFSZ*%).0_B&R_]$8H'?HWT^;_D3&-Q)!Y?OV$B?;%OAJ91PVW-;0:XA*=!AMS,)^%;49YLLQ*0``)'X^B'@F&/3W1F]M+@Q+@'L_$K$-9%D._F:3'2@U -MV>]<+B`C"`````$```#L(P``T"K]O*L'-?/J0?WH&_M)+6;BNY$2]/Q=AXD_ -M=E28$FF!N6&"Y=T,?H[5^RAL6FLJ`;&N5>IR_FONL&UZ+9MC.4E9)Q1[+2#8 -MC5VWX,#`_<[L<_PZ;#XM -MC[:/?](S]37WLO^L\U;J4=`:IO#OYA8D&HA<'8;VY#E_TOOL%,PVG&@SOW-I!3XS -M4\.5T8IH#/!`1OQ?FK*RI*G -MX$@YH2[!/;(HW8@P]T1]K[2JZ`D)LI3QO>?/9*8('&MP?%_DHCJ+;IHB\G!/ -M^9#FD4E/WWW>#Y9'QS1>Y*`M/?OOXY!7=O#I -M_RFG9GSVE442MT8+RP<`_````/P````"````10``^$YU``!`$0``P*@!`<"H -M`0(!]`'T`.0&R8%2J[@Y%X[^9I,=*#79[UPN("0(`````P```-PA``#`Y?_E -MW:[P@MSF>*@`_X#!X3]9%;2)D]_#JJW#@QG,;3_*49'-5 -M[S+7T;U<%=0&Y.Y\BY--DZ5'DQ'AQDSI2&`>BGZBN'OTY]/-VBFT['6(C&LI -MO;A9.,>KWN3D\&MZ$)6Y=_):8S#W'[:6*21]338JC53OWD6$,+=!$"C-CNM^ -M1N$,JLMNGBE``(?S.WE$:<1>7__S=2%_U(NNZ5MSY=6+CAFQ9#$57YJO^)M/ -M+>D;\(9%$K=&`.0'`&P```!L`````@```$4``&A.=@``0!$``,"H`0'`J`$" -M`?0!]`!4!CF!4JNX.1>._F:3'2@UV>]<+B`D(`````(```!,*0``,-//R=CP -ME^&>T-=U/(*.A@2V^>:K!!Z5P3<,$#B)DB>6)+]1^@XX861-3X5511*W1F8` -M"`!L````;`````(```!%``!H3G<``$`1``#`J`$!P*@!`@'T`?0`5`8Y@5*K -MN#D7COYFDQTH-=GO7"X@)"`````#````3"D``#!>@='MEN\+VXN_T?.46C$K -M_]>&8MN+\Q3U\4,4PRJ`@:D0W1FN29C)9[9*\442MT9P&P@`/`$``#P!```" -M````10`!.$YX``!`$0``P*@!`<"H`0(!]`'T`20'"8%2J[@Y%X[^9I,=*#79 -M[UPN("0(````!````1PA``$`Q5J#-%$NB(#/$IQ>OY!PROW?K.VP2&KE)Z7D -MY"F;3GC'*5!Y:I$`'P+QY(QC2)2J9AO1,#E1O:X1ME]7'SOVJZ1^AQDZ-&VB -M?RS^)]6G6NSF_(%GS!&*/)SD*\-=@?P!)8MH="V$'1E!V96EK/SD!(!TRPAP -MCY*1`=I+X2]#"#\;AO583=X>8O@QH<1EV/)%OE2D7Z_QI*(.>=YC`)] -MF*,13]#VTW+6O;2F*=K5[3@N -M11*W1KA%8*GY>1H':3 -M$-WC!4[!+K&,8)Q,U,OD;M\#%I$>@9IS=X5O -M_M0TOIK,]C(`N2I]?%@R"NCU[*R@:\WAI20QKIM>.8=VGTZ,*W?0_?4X#2!S -M4=7P*#;1T=+-OS3IN+;+@:WVRV"-24,GYK,E"MO=11*W1A4W"`#L````[``` -M``(```!%``#H3GP``$`1``#`J`$!P*@!`@'T`?0`U`:Y@5*KN#D7COYFDQTH -M-=GO7"X@)"`````$````S"$``+!NA82+`9>.^N16M,B)JF*0%JOF/GWS,B$B -MM%$SF6#/"[HM<.V]00T478/6D-MLR-&_,Y5(SF9&(*%'1$VMWFO-L]H#@,/? -M-PPGK52_"MIF3Y@IXED47(9`KTN+Y3'$JS?"'<((*+.TA*3WT_B35+SI2V-Z -M'9ST\I(MD,&*&F@4[!X?E3^=[$LE?8`^`2H=H76)7>Q^DE,^;B>P_-_N31IC -MX09YPRR/_K=&)L&]11*W1G)9"`#L````[`````(```!%``#H3GT``$`1``#` -MJ`$!P*@!`@'T`?0`U`:Y@5*KN#D7COYFDQTH-=GO7"X@)"`````%````S"$` -M`+##<1K0KCD&[A#T:2:__4#]E+Z%.C\LKOZ]<<]\)NB2CMC@369(U;K`A4J8 -MS13)%VH6P]/;G"-2*5>UEVDFB**/-'(A]WMPN`NPO%!A0K95F=T>,-Z/-(L. -MNQM9JQY(^Z36S0'?3=23@#:$UBYPW[7JFG"A1=U+QK.A"&:P*1-=K=[0T[]:*511*W1G:% -M"``\`0``/`$```(```!%``$X3GX``$`1``#`J`$!P*@!`@'T`?0!)`<)@5*K -MN#D7COYFDQTH-=GO7"X@)`@````&```!'"$``0!C)-YR_3&-36^AS\Y#ZZ&A -MZ<,-U[%@$D"Z)P!<"#]+7.G'DMR@92,LVF1%K#MB#PY^-@4*TMGK-I*LM\*, -M5\-H-'F5!K%:RSD(>NTN"CVU*/O3X#=N$,2P9!20+92LXUB,J#7""P9>$JD! -M1#)_#B3NX]7=.H;>8-GE7>BWI//QC7G#`"!>_32K8XEPAB2NV.D"1F[.5(.* -MG#>:+*3Q"NZTR,=V.0XB^=:5]V..UI0G>>@+R]HUC&\G-%B@H'!B/5]*#7#$ -MB;+<%$V]2(Q*&Y3OC8S3I%$K=&+9D(`!P!```<`0```@```$4``1A.?P``0!$``,"H -M`0'`J`$"`?0!]`$$!^F!4JNX.1>._F:3'2@UV>]<+B`D"`````<```#\(0`` -MX+Z6TU>V4-$PEB4N#P^X/UPB,UYK*S_YI=S.QQ -M,Z*@3>O`XMEUKY"N%Y&J>\HK;P4/#-2`/491R;VBC=$\F%.]]A-?77/ -MCK>`Y"[-CJY$U=K8HH.9A:Q&5($^",R/PJ#\=T]HAAJRH`IY'DD$ZP$?9([- -MKCIXKQZ&Z[V`KD/TT(\&DJI;-VT]:@_V!#'%>\Z0M96.3Y3^_DCC<#),C]7& -M$7I8KJ6F*)_@)D8-TO]#7*3$M_&;4ZY80L9[-RS#17J82W^9G;$_;Z=%$K=& -MO:`(`.P```#L`````@```$4``.A.@```0!$``,"H`0'`J`$"`?0!]`#4!KF! -M4JNX.1>._F:3'2@UV>]<+B`D(`````8```#,(0``L-NP0]M"01XPB+5F/1WE -M84NF*O")*"Z-TZUTYF?\B7C^:,Q3S#3[Y@`\A;:"/ZL>F$13.V%8`)_3`YBG -M[G#H':+X(9H1K>U3O+9OR1CIW^@BWA1'>&T.1?P5GY215?43S1)_._F:3'2@UV>]<+B`D -M(`````<```#,(0``L!87U4CA:ZFB4B3>8UW9[>^C;B4<]'6.T1.Z^0XJY3_@ -MW%!$TJ3#=RIYSZ6*1).V2Y@#8 -M[P3F3]GBB$O<+!^]-.4YT/WN2Q<2YDP$-02"S'[0_0KR(.Q7:5YQ01HNJE[ -M^(*M8QY%$K=&MO@(`(P!``",`0```@```$4``8A.@@``0!$``,"H`0'`J`$" -M`?0!]`%T!UF!4JNX.1>._F:3'2@UV>]<+B`D"`````@```%L(0`!4*4[39>S -M+@@%3`W!.`7=E0,..PT6V*KYX3^7Q>ZSS7 -M:Y3BKY[3`N;HPUN9^1)QC6*O_V_@)3?#\X5#\*YL9=;C9I/_@[[& -M7DOF)<FW2BO7>\C:_-YX?+Q`!5EQM&,\LO\UWX26$SQNN//XX+9T+W -M&D&6E]RQRG-#@+XR,>;(E&'8/>$NS -MU)O*\8EO'"U]`6JF11*W1B(T"0!<`0``7`$```(```!%``%83H,``$`1``#` -MJ`$!P*@!`@'T`?0!1`>_.7EZ><;GRH!C,ZZKP/PHQJEN>W2K`_X$B(EJ -M9:3\%-?05=GJF'TSL`09P@N*$K/$XH-,&]VXJK'[#&8B^]N^E4==-J_\NNKJ -M>#^="ION9.:\R@C0/VM*08F2V,%K%(XKQ75_)96Y*['9VJ06Y(6@!U*@K6'Y -M@O^8(T";/CVC^@[#TM,/[442MT856PD`?````'P````"````10``>$Z$``!` -M$0``P*@!`<"H`0(!]`'T`&0&24U"XYH9:EB3/I"VJ6B%%=DN("4(```````` -M`%PJ``!`;'N[N#<(_./&A&C\*28;RT*MMUK1`7W.X,_#>8T'001V;(A:L>GG -MRWPYP:?&=VZ;14*"O50]*DX97EG$11*W1DYF"0!L````;`````(```!%``!H -M3H4``$`1``#`J`$!P*@!`@'T`?0`5`8Y34+CFAEJ6),^D+:I:(45V2X@)2`` -M````````3````#`I^!L2R(QK&60Z,OMK_J\:[O$D*Q%NM5C;C'%'%;R!J,+L -MJTC@_CS;M(DSD442MT9M>0D`;````&P````"````10``:$Z&``!`$0``P*@! -M`<"H`0(!]`'T`%0&.4U"XYH9:EB3/I"VJ6B%%=DN("4(`````0```$PJ```P -M-!5P)F9#[4S39@OFL)Z"(MJK!VE_80(5%A<8$M/<'GQW&4!_4TCFNZ1/MR9% -M$K=&/XD)`&P```!L`````@```$4``&A.AP``0!$``,"H`0'`J`$"`?0!]`!4 -M!CE-0N.:&6I8DSZ0MJEHA179+B`E(`````$```!,````,'YP6E#;"8WM[.W6 -M*X"(``'@```!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``_1J1L$VT&2QKY1T]]_VJP2 -M!QN6/+PGLB?5'Q3>(9HWC)DWMDV!2N@RE%,>IP8/8]E,MU@0K[9FS8RQ7$9S -M0QVI%M3IPK)XK_WG21P&XA%%QR=A+`EX]1I#FIB0[59&\T]MR"Y\>E4@2^F8 -MIW%+<$@I```D+)JJN/SJFFP4EX+RPO;\,K&B";F&LO5*NG/)(]#'SC$I```< -M``!`!!Z,E3(/BU=-3F-<+A%%/S%1&>@[````'```0`7TN+ZX>`I[IU*K]Q4G -MS(SRU9,1HD42MT89NPH`7````%P````"````10``6$Z)``!`$0``P*@!`<"H -M`0(!]`'T`$0&*6'"H(MC:S(-```````````I("(@`````````#P````@``!` -M!@````''_T_E")201M">3Y'^K.KM@ZBS`D42MT:OR@H`N`$``+@!```"```` -M10`!M$Z*``!`$0``P*@!`<"H`0(!]`'T`:`'A6'"H(MC:S(-```````````I -M("((`````````9@A```@``!`!@````''_T_E")201M">3Y'^K.KM@ZBS`B(` -M`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``_1J1L$VT&2QK -MY1T]]_VJP2!QN6/+PGLB?5'Q3>(9HWC)DWMDV! -M2N@RE%,>IP8/8]E,MU@0K[9FS8RQ7$9S0QVI%M3IPK)XK_WG21P&XA%%QR=A -M+`EX]1I#FIB0[59&\T]MR"Y\>E4@2^F8IW%+<$@I```D+)JJN/SJFFP4EX+R -MPO;\,K&B";F&LO5*NG/)(]#'SC$I```<``!`!!Z,E3(/BU=-3F-<+A%%/S%1 -M&>@[````'```0`7TN+ZX>`I[IU*K]Q4GS(SRU9,1HD42MT9F[@H`4`$``%`! -M```"````10`!3$Z+``!`$0``P*@!`<"H`0(!]`'T`3@''6'"H(MC:S(-Q465 -MMOQ/)*\X9V.(TO2V.4WR -M8Q[B$*U':8*8WE?>*0``'```0`0*573"H'=K"G#Y6QA<@#:XZ<=N,0```!P` -M`$`%?P`;-N3$$)L_8WQU+CEK;\0?ET'$O -M:WH/,T[B>=@@<4XR@G=AD)G:Q\;47SL*2ZH1NV-]#AMWL<+>A3TO7P1!M\TU -M$4'HY^7[\@2R`J(%;*HE=>O12-<6F -M5#3:F2SS^"7DIR"-F4O&2D42MT:880L`'`$``!P!```"````10`!&$Z.``!` -M$0``P*@!`<"H`0(!]`'T`00'Z6'"H(MC:S(-Q465MOQ/)*DL<-?8<:J<3E8&U][!Y5EBMIS#J%!P!P% -M14Z`+UTR0USZ7E8RW0QC*_Y1?X[+K5Z$!Y,#SP,:FM15/:TM0X;!:[;._@$V -M10IA2HO\:$FP4<&)1UURN/BHSEENJJEQ$A+P\0A1O+I3Z5,G?Z4GID_:Q3!R -M-DV;^OL/)\4%=!Q;EW@J4^PSQ$KH22MWE+6R=+A]SE3-E7 -M1T42MT98;0L`_````/P````"````10``^$Z/``!`$0``P*@!`<"H`0(!]`'T -M`.0&R6'"H(MC:S(-Q465MOQ/)*3W<1''!"Q; -M^LY]@]A`M789MG'K<$;C@Z*AH8?0-4R59?*[$42MT:,O`L`/`$``#P!```"````10`! -M.$Z2``!`$0``P*@!`<"H`0(!]`'T`20'"6'"H(MC:S(-Q465MOQ/)*2IC_XSUN%`RV1UW+8T\: -M4]JPF`!*O1AMH'X51@W60)Z1J\,R+=#*$BNQW`D?$">YLSW$M+_:-VN7?_[Y -M:79R:XXMM&_^Z"I3VOH<>XT7?=`N88P'D0D"DXY^9HHR` -M6HPW??&%O7",LZZ7W_$!X_E:SVLBWZVXX;P^U&<]MW1<>-['6&&YXA8WPSC- -M>(V9=4Z[UMC?0NN=W;EC6Y_'.QJ#VBMZ2M?OJ_6S-ZQUL!E7M[5^ES",?>6L -M`)GY,JO)(5BW#E2MNZN56T1-)OC`+]9`6=\FI-(#_T/=9>4?QM.J11*W1F[( -M"P`<`0``'`$```(```!%``$83I,``$`1``#`J`$!P*@!`@'T`?0!!`?I8<*@ -MBV-K,@W%196V_$\DIRX@)`@````%````_"$``.`:Z'HRIZ5?0Z*W]U^Y7*O5 -MI1_7Z*"9)_4KV.;L?'QR\R8+$NO%ADU0 -M?8P0&!H.L/WT -M-[RDF/B7C9+[^MH\[6L9^)Z!4F8A^:+PSNI^7#O_Y2_?4I(E?SJ'LM7-;/8^ -MLXM;BF`[K=Z#CUKTHL8E78WK%__N5?>/11*W1JKF"P#L````[`````(```!% -M``#H3I0``$`1``#`J`$!P*@!`@'T`?0`U`:Y8<*@BV-K,@W%196V_$\DIRX@ -M)"`````$````S"$``+#>U1!(5+NG5D]5T6:2Z#1.^])U%4&W@@=E#<,+CJ!9 -M>_")MC2(01C1[/-WPO9H&#.5XZQ:_VKH4#/4%OM:R91E=S?E6Q=X?%SBUF!9 -M:RX)2X?\YY!/K_Y;3D>]F16+[?G/<0/+(,]H^Q3R@MRHMC9XQ0=]JP`?ZW -MR@/OHF)?CXT=W7\T7BMH9>L0.*T9N+(6)>O'?59P\/DU`BB -M3ZH+0Y;N6MFDXF_1ZKP7P5\O-DY$`%-QHO.[8[J`AJ2_N$C&,US2;X#HE+;B -MT>?+"&Y7TN_N%+5)2CC9LF:O<8SZ^[=-OW&DX_SP[8J\)#3>^SUXVQ^(6VG% -M1C5)HML(5=&-SZ$H2SX/YN=JY@UZA#_6Z/.RYG>A?O\511*W1JTQ#``\`0`` -M/`$```(```!%``$X3I8``$`1``#`J`$!P*@!`@'T`?0!)`<)8<*@BV-K,@W% -M196V_$\DIRX@)`@````&```!'"$``0!.^Y@"7?`9[Y6V$!;Z7?O_C,XD`Q"T -M,HD81,C"9W&7=9BI1;W(->'B+?=5XQC%\!4?Y$N7,4&^ -M-,&8VQQN:XPD!!0*B:@MZH`I4P7&V^[86V5D[A(M#\)A:2!W085_W.84*\BJ -MG0=Q/MR$R@E#S>\!B,>!5DU7'>*W9UVW!317^.$^?`N%>+\DYMX0:Y#ZYN-Y -MS#)0^>5OOHGCN]V+_\4)/A3%]RY$^DIY^`8`4JC>VSZ/Q3/%I47:^4D@=$;W -M-6]Z!6\*V81]62VI"#JQG^HFYCL]ZMI(][4%#/)9=3]HG^7'()?F$5U=6\$) -MUA$:@SQ%$K=&]4P,`!P!```<`0```@```$4``1A.EP``0!$``,"H`0'`J`$" -M`?0!]`$$!^EAPJ"+8VLR#<5%E;;\3R2G+B`D"`````<```#\(0``X$LI&QLK -MX<*J\W\FX`7O3QA$7>5,^T=YE#?>;R%^(W:MB1 -MW5CZUU94`Y56IIE=Q!)N"[52%-Y(`-N2J$4S?&#)(G?&M=VK_.Q2J"*MW.[JS>_L?#J(+/,FOV/ -MU`'?_S+VD]Y2/)JH7*!YEE;0:1L')">QS']\XW!YI1Y6KL$PY0_GM0T\V8QP\FXH?7QU&;FAJK><850:.H,P!\H9`X\I0NJX -M90SCWZ[!"I9+&IM:I*(D@<1D!B%_OIJ\5%! -MZ)0)R/>Z0F5&QSHWKOF!K6?T:&[JL*&.!R]R4/9JP.]HMDF".AZW[[ZH,4_P -MW&>,^2^+OU;Y:,)EB;LN?>Q-'L\S<'"=+R8U8V^#PNDS<2Y1Y.;%2K1%Q2PN -M59-6H?P/`EL3).'^!JPFD_D/VN6MACFVANO/>4LY%RX.M30;L#&Y% -M$K=&,+T,`(P!``",`0```@```$4``8A.F@``0!$``,"H`0'`J`$"`?0!]`%T -M!UEAPJ"+8VLR#<5%E;;\3R2G+B`D"`````@```%L(0`!4!#.(%7\D#F=57@D -M`>#N5%_I*'E%O+6/J&99G,-E34L&ZD;6:`?0O?N(A+"1=9+=^QMQI5BHYIOC,3/S%_<QN?^[!GT&!@^*OM)XJ\4\W)&$+"-T::L48H" -M#EO3TO*EY<`TAA?_?6=R0!`VZ,]B@1^/S:J^R5DVY*(/ZTC')%DP8<@'?G -M99=>\GM]11*W1O3P#`!<`0``7`$```(```!%``%83IL``$`1``#`J`$!P*@! -M`@'T`?0!1`)-.$>Q'*GNND$(\T<:3T8\=,NYTP"UV([XN4P[Y -MKV$^BYZ-P@7%/,?L[&A,.O;D%.B!L_QQ4W+?16MW.`WKH*D(4U2S9+B3*V0R -M/6TRFDNUTA`RSLY8`/[##>&["L`Q`16'(\7[%93A,JJZ)ZJ#&]^+_&J>:-^_^;#_L=K*M_#$J[4#6*]G#'T($5RKW -M.,-!#F.$C2JEZU[!8?9UR97JA?4.+IY0.BA4QI<&1^KD,VCAJ$^[#\\$:=)> -M02R]==``U&WQ^#1KZO;\L>X')CS3BDXKYEMRIJ-_A\-W,\\'6XF_F/O$`ZP- -MD?*4@?<;M+O-9$42MT:M%PT`?````'P````"````10``>$Z<``!`$0``P*@! -M`<"H`0(!]`'T`&0&2=BG@+1^#%^>O3$/2=TE**8N("4(`````````%PJ``!` -M._KCVBZ;/>!^WT2%07K$//FC;G].98-V6K*48')FL0,)SR-BK9;$0;*H:OQ+ -MJ);Y"LOBWTQC;0#A8QU+11*W1F,Q#0!L````;`````(```!%``!H3IT``$`1 -M``#`J`$!P*@!`@'T`?0`5`8YV*>`M'X,7YZ],0])W24HIBX@)2`````````` -M3````#"_@FC^)HJD'1++;(QD-/JOY=24.FY3^6CLK^]F9``!`$0``P*@!`<"H`0(! -M]`'T`%0&.=BG@+1^#%^>O3$/2=TE**8N("4(`````0```$PJ```P9W$;2(\0 -MV-X]/GM_2X:WO+_Z9!&M@$L=!`I%R?O!Y%BS=5E/240"T"LD%GY%$K=&3TT- -M`&P```!L`````@```$4``&A.GP``0!$``,"H`0'`J`$"`?0!]`!4!CG8IX"T -M?@Q?GKTQ#TG=)2BF+B`E(`````$```!,````,&AK$8^I3.7B4ML`[XW)A2AH -MM)FI\P]\%PS,$TJL+YT"YWN[7C9)R6\>V!I^11*W1MR.#@"8`0``F`$```(` -M``!%``&43J```$`1``#`J`$!P*@!`@'T`?0!@`=EE/ET7-YG?&,````````` -M`"$@(@@````````!>"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``AWQ#U%>8,DJM2+@.!Y?."!YKO%MH\\@S5JK)\&O*7<,8$9Q>87LE -M;:GB+IF&99KC)&Q1<"8,E4^P_`I```<``!`!`JN -MMQ#F?6A7>?1(SZ:VQY%==X9U````'```0`6FU9@-[%O#./]=`"N5C*_\X-4@ -M<$42MT;AG0X`7````%P````"````10``6$ZA``!`$0``P*@!`<"H`0(!]`'T -M`$0&*93Y=%S>9WQC```````````I("(@`````````#P````@``!`!@````%C -M=5/?NC\5>*^K+?;8Z^'#PO@'W$42MT;[MPX`N`$``+@!```"````10`!M$ZB -M``!`$0``P*@!`<"H`0(!]`'T`:`'A93Y=%S>9WQC```````````I("((```` -M`````9@A```@``!`!@````%C=5/?NC\5>*^K+?;8Z^'#PO@'W"(``'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``AWQ#U%>8,DJM2+@.!Y?. -M"!YKO%MH\\@S5JK)\&O*7<,8$9Q>87LE;:GB+IF -M&99KC)&Q1<"8,E4^P_`I```<``!`!`JNMQ#F?6A7>?1(SZ:VQY%==X9U```` -M'```0`6FU9@-[%O#./]=`"N5C*_\X-4@<$42MT8]XPX`4`$``%`!```"```` -M10`!3$ZC``!`$0``P*@!`<"H`0(!]`'T`3@''93Y=%S>9WQC?=$%6LG^0R`A -M("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,` -M``@#```"````"`0```(H``"(``(``!]2$KS$I\I=!N_(W"/)@?&G@W4G1;;W -MWL()("^VSZ;F,#Y-NQ>K3KEUGU&^Q7?1/P"`'_Q!O94?6:D@#8[TYRRC@ML% -M^Q3N+YZ8WK1^IY(L@?QV7(F3+=%K3;!3R-1A`+;>>&IS6CAN?H@,]`P>>3+\ -M;'LTK]LIS-S,I^^$UY^U*0``)`H"],E;$/590HQ?T1&GO).S05_IX4K=)\=? -MK_VZ$KCE*0``'```0`2HYO+>TYJ3Z-ZR%@2$IP`0FS0W@````!P``$`%H8;< -MQLZ*DIB#M%\!S8H>89Y)P+M%$K=&(1`/``P!```,`0```@```$4``0A.I``` -M0!$``,"H`0'`J`$"`?0!]`#T!]F4^71M7X)V"TR5(3OCV_JTW#@O69NG,AJR-NO57Q)7DIV&D5ZZ0(^`._& -M_N1%*7#!UB6)ZCM&P1.R2FQ5V/7(3_6>&\LZ[C2D4%#/!UH]PR+^ZPE54$EX -M=TA_]J^^.P`7E[+_7LJ>I7W&YE$/*.V,^-0P:#Y4:ZL.2CNR^90/EX,Z#6_Z -M+FS2L<.TB?(RBWB:O3+!3Z'Q\81IIB@GP/?WSMT43442MT;W*`\`O````+P` -M```"````10``N$ZE``!`$0``P*@!`<"H`0(!]`'T`*0&B93Y=%S>9WQC?=$% -M6LG^0R`N(",@`````0```)PD``"`RB^B4/K>3N;;7= -MZ`DB8(SUH/MF;R2R+(O0A!PA5HFV"5!4')>:+NVVF'FC>Z@2O]0E&B0U[HW: -M;C#HB"=7_I*/XO;>=(@B5X7V&2=KQA0SA]MZXN=S&;OJ"^0\H-OSL(YV:$SX -M'9WQC?=$%6LG^0R`N("0(`````@```/PA``#@ -M5NDJ"[*[RFU_]*_<3;4:=`,H>Y6D9^*#C3T#GPE)=Z2?7&M/-/T64Z98\;W% -M2B4N3C&.H]O=M._8DR4KL!L7.]V;/TK56#"TY5`8'N#D@3Q:0R.HGK?WBIE` -MI@'>NGFPJ1!82,X,SUA4:^"WBN@7WF3S?M:O$K@S.^(=Z7;EV`0VPPWR'=JG -MR@LX))/U)HL><;T_CP=B`"NV6X?(;V2_%#,^I;X9.)6$4IP#B4K54073^%`` -MCC."XNI'#!A:/LTJ2*>_E4&UZ%ZX&SMU<$\M@9WQC?=$%6LG^0R`N("0(`````P```-PA``#`,I.*.D7`:?J-*%4WY8.# -M$2]F"@[)TG==(:)7-L(Z<%'/N)G -M>U4ADGE,D-9SCSQ7^F[;]]&5^-`C'`N[1)GQ2F;'0P!Q]NJIE,J_I:SP!NF) -M:'&$[":-^1,\.\G)$E&&:[!XR%,,NPC0>4R_U+KVT*''=S2B$$*>1MQD_1CJ -M^=>OD-0];#_`ZH$?_]V*4JPB_Q29:`;'>A!_@)+^FUJ:@[.$SBE&$K=&\QP` -M`&P```!L`````@```$4``&A.J```0!$``,"H`0'`J`$"`?0!]`!4!CF4^71< -MWF=\8WW1!5K)_D,@+B`D(`````(```!,*0``,(N<"G].U(9X'H*1B?&AH_@E -M\\-SFY9X5=W8E5`$Z^NP2/\Y815N[)UK,.9T1A*W1E!4``!L````;`````(` -M``!%``!H3JD``$`1``#`J`$!P*@!`@'T`?0`5`8YE/ET7-YG?&-]T05:R?Y# -M("X@)"`````#````3"D``##UN`RUYX;R(7D,6%9PRSK=>\PZI0/^'.(S[A0[ -MQ8C/3.@=ZJIDM/]5I#7(MT82MT9B;P``/`$``#P!```"````10`!.$ZJ``!` -M$0``P*@!`<"H`0(!]`'T`20'"93Y=%S>9WQC?=$%6LG^0R`N("0(````!``` -M`1PA``$`>C#!PHW/@(Z2FEX,T"$9B#L&2CH]5^N+^#;MC3,J,LIC9;9MGV&_ -M^X)L*N492&AQ>]KQ;<&G:,N+OF([3(:Q<'/(Z6JAX,-'.VWT3[@T8!194C0L -MM+>,,H#$C:A;=(!1IFLLZLVZY37V$B1X&ULT:[\/PK.4_P0X&U`Y#1\O5494-\+3:+;1JU^DF"C-[2`9'33M).2A@MQ$U.*(D -M$>6&!^]0 -M:6;<^D[I><.^P_*C(V\.&6>6.%R_,)AO<\;N?G`D%W+61A*W1@-[```<`0`` -M'`$```(```!%``$83JL``$`1``#`J`$!P*@!`@'T`?0!!`?IE/ET7-YG?&-] -MT05:R?Y#("X@)`@````%````_"$``.!`0,JE)3@/)-PA9(D[W6)`%"TK`K9@ -M(BP5>/%*FG4,Z5*_')"GI5DH-US\;?<1_..KGJ$>;Q;N&KY8Y'/GW3?^9RH` -M@0WW[([)OJ2CR\89!@.TE1N"4*)E)1W0\]>/^3<*@*H=N:CX=JM*ME](+5XP -MNW@$+;)O\E4:W-=4\T7K)"P1JM#+/LV8-J3SNFRB>GHSEMMO5_?E8G+)HI#` -M@D_"XN8WR/K-^I60?B7N7LS=T#">Q/"'I-FT1SHKL,`<@VF6S'[NK`5]GM1EJQUOUFY1A*W1A*9``#L````[`````(```!%``#H3JP` -M`$`1``#`J`$!P*@!`@'T`?0`U`:YE/ET7-YG?&-]T05:R?Y#("X@)"`````$ -M````S"$``+"5+16<(;M"X^L)PR;4A/BR,\65ZR3(5II.]1C^U@TF+W4"UO2$ -ME#_K,KN+:T>_E469@D3Z8^_0EI"<+L8B<,F)"KY7>H%9)'WWUB/]/12_V%_[ -M+QYZ>0:I).>+IX[JJNZ%+W:!.RZ+2/A)^H[R8N8Z]&NX`G3A("G9PS<9<:N0 -M`@(7M.[[A1/*@TX(+!J,8K?"Q3!R=JO1X'T^&9&F!V'IHP&A>NS-N61KU3PT -M1A*W1F*[``#L````[`````(```!%``#H3JT``$`1``#`J`$!P*@!`@'T`?0` -MU`:YE/ET7-YG?&-]T05:R?Y#("X@)"`````%````S"$``+"1T^VQ^);*#M%, -M50K6?AC!\9JT2E:S<,`KA89%K)U4OG@8M!Y3'^UO].\M:;@]UA**/K*`4./.36M8'-K)6;^%KWBP$-OO/I-%?#`CAU -M1\@?A<)#V=(1GXBV_V"M,64D*L@["@F3J@D+1A*W1G[8```\`0``/`$```(` -M``!%``$X3JX``$`1``#`J`$!P*@!`@'T`?0!)`<)E/ET7-YG?&-]T05:R?Y# -M("X@)`@````&```!'"$``0#$M^(]GA9VI+?%3&04QD#7S$0\@>Q5O406BN0= -MA8@9*@(%"/*VVLJ*R![?U!G,VA+I170%7]_\51RN'MO%U0A,-*]@\XQF?F7\ -MD=AR!$"E"+_7'(;86VP"&!LPZ\&^J:6O2X'.`8O*1_&KW$]E5?S:(RC68'D\ -M(HR8[CZV&S15HMGXUA1?QC:7`YM$8XS_656!;!30/P2T>SL(RJOK/PVGO:U> -MD(JH%BIL6;CFWOQ*W7SQ$`AD.?OL6#R-P6R.;6=77WH]RG2?%OVJ&%;:OWNC -M3,TV@.6N!57_OM$>YXW]B0:SMDKIB`^D*D&8>XV -M`$U80$D9^&$R#A&&@,3R%47]1:8UUDJ(W?L@0R^%>57=/J%F_H:*=B.R`<[^ -MF(RJ@8WE(C3E!*\)"I2>#5HJ/'?_TV94$O8EV9/%^!>.9:B#&TBH[7R&H69\ -M&T+M;UO[`J^G^SAW&"B31V$$R$5\KI2*RP^7(H9&$K=&S?,``.P```#L```` -M`@```$4``.A.L```0!$``,"H`0'`J`$"`?0!]`#4!KF4^71TUS-:%3R31*7B,GK\D>*MN<^%E:S$1 -M+Q<)%XEXV;DY9$\T7W,+_0K/Q]W,HHGBDRH/&QI<+]@U=8R?2?4[L'+)=3:W -MTN)#M2T2%TKE6,4K^R+HQLZOXN3WI`[X\&/<>V\R1#6Q*(7_8%"T?WI3A1)S -MRSMSJK0YW-'R>#U&$K=&="0!`.P```#L`````@```$4``.A.L0``0!$``,"H -M`0'`J`$"`?0!]`#4!KF4^71NOA=B.U9B%H,?29KEKAYCS3W$G'U09$\D97_*M.S -M0TE[1EJF<`<#<=`EX)N5#(M+OW%:(@C&2/@'472&<!+_]HAT#"F=#[-/:9TIE1(U&$K=&XE0! -M`(P!``",`0```@```$4``8A.L@``0!$``,"H`0'`J`$"`?0!]`%T!UF4^71< -MWF=\8WW1!5K)_D,@+B`D"`````@```%L(0`!4+LIA`8X6C#Y#];+Z[.2/US# -MA@T"H4#M-:Z+T9\%'O[F4?\/R&=(M.WP\/QAY9C*#SJ0F=6I1,_"M+6F/661T#C;A%';"*+4LN -M*>4\"KX%HF2)@I_8;HFM7<<&SN1RC/?A=?]ZXSD@VZO-HH*A[`A86KJR''I4 -M1A*W1CV)`0!<`0``7`$```(```!%``%83K,``$`1``#`J`$!P*@!`@'T`?0! -M1`0$A.AWLH0 -M@I5$._#I7GRNON(4XA#A,=AR^X*]7^"!U/#Y+*5'DTE9X!<`ZCO[3;75E.&9 -M6?D@I,92V+09-I=:D[W$!'(I-`Z4\]).]0'^Z&X@SMS">H\,S7KK]BZ_WUNN -MF6(X7W[;XW%!3X%R/A2D40">`R98S.I)W.'GWI%,>JZ)(:-SJ@(@AZG%?O+\ -MB`;)DC[&QW/:FM)$DP>[^WMC21@OGU6K?2%T4F*]5:PI\WA.&+33D,$DU.[, -M?;L/-W(,>8,1L16B.8D-V)$,X@9OQ]-CP.\ZM^H%'#Q.\\Y6Q_V3Y4OMX1-W -MA'4O6)$<(F54,C69F*[F#_Z$!)F!#]273BPP9Z2[<&;_-44?2""/4]'D" -M7;N![$82MT9FO@$`?````'P````"````10``>$ZT``!`$0``P*@!`<"H`0(! -M]`'T`&0&2;@`:4^AT"/!JHOP@>W(IQ(N("4(`````````%PJ``!`O"0::_U; -MVSF=B4#1"4$'S:.[])I6@X#J_6Q1%'=FJ#7.%>=(T3"&%XE"ZXQ1FL2K_BQP\%1A*W1C+*`0!L````;`````(```!%``!H3K4``$`1``#`J`$! -MP*@!`@'T`?0`5`8YN`!I3Z'0(\&JB_"![BI)-482 -MMT;%V`$`;````&P````"````10``:$ZV``!`$0``P*@!`<"H`0(!]`'T`%0& -M.;@`:4^AT"/!JHOP@>W(IQ(N("4(`````0```$PJ```P9'V_'"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M!B0D05M*N']&2IT4;,H`C-_8F$J;[N'U/5C#;N2C3@T6M>^0$\(ZR0OV8E," -MG945<*CAT!=9%MM%K).[0DM-C@VS!1BG7H[/C"^C.K*2ZY]P5Z[4LX=SY4^;Q(`VUL;DE;=<=F71[RWTU,R@4-%]!,F(/%`I```D-Y]C -M=Y$"]81!4LH&?Z0<%/<:/H%*WGXRP*$PEZ+]R^0$\(ZR0OV8E,"G945<*CAT!=9%MM%K).[0DM-C@VS -M!1BG7H[/C"^C.K*2ZY]P5Z[4LX=SY4^;Q(`VUL;DE;=< -M=F71[RWTU,R@4-%]!,F(/%`I```D-Y]C=Y$"]81!4LH&?Z0<%/<:/H%*WGXR -MP*$PEZ+]RI689_M]NXQO)/C6;P50TEI -M3V`G]!.#06=.MYNNF8H]'-*G;W+\YZ9'D/-*T;E$?>FU5^WR'^QB&,PIZ?7C -MT:X+`"'\%@`"E0\N6-/?5$+@7]>7=.;Z3I1$INX;8`("?R%6NNVUCYB8'JW:-9/OO):%LF#*\30 -MQS%_9&IX:(CK.4'DKHB-K&TQ+H+EQ0\-X+K%4I(L>SWRPXAG#;FEK',N?587 -MO?/Q-=ID@YWP,]J`1):(J!A?N4S['1&84ED#./`I;G_]=,0K/XX9;A6,`XOAFST#9(<1H2SP;>$J&*Y1*F?81T<*:*]@0Q,]"]9C#UL'`+<\4Q7&,"XR(E0N@QRAV+XZ[0]N?MV/X1[_`+H!QX[< -MEU$A.R:ES$`-:FN+7`6O3/*(#R$6\!S@`#1[I6IF=H7[2--W\!`_`$-W -M_TR0#[+SOZ]V"T),OW3>G(\$[?1UA70Z\27X^M.\-DQ7.2EQ_>8D7/53(W.C -MY*;@_#A:@LT(6.M9>`?Q3ST2E/F?[S\D,E7N6BJG4 -MR*\]QY`N446K.21GLS%A,9M#,YOSR_T!J#6)TO\^-.`8,R4^2LOBJQH575_Q -M7%;MQC57Y55JA/0PX)JIZF93'`<_Y'\L%-687^(-)]"EY=V`BQ,LGM><5'E' -MK+UT.*TR2FA2&FH4+&=`TLY'!+/_";*/K2],J_4X72I&$K=&!:$#`&P```!L -M`````@```$4``&A.P```0!$``,"H`0'`J`$"`?0!]`!4!CD+LMM-A)FMJ#$, -MAY\XAZ-Y+B`D(`````(```!,*0``,'?8A>V)IM:;J69-B/-3#0QVOJRT4X*2 -M`Q"$K<$)T-_(N#2YC>&=TU)S`H$Y1A*W1D/``P!L````;`````(```!%``!H -M3L8``$`1``#`J`$!P*@!`@'T`?0`5`8Y"[+;3829K:@Q#(>?.(>C>2X@)"`` -M```#````3"D``#";,5QPE8Z%C37NJ!F,-=I`]H=;E%3389.K1!_9>)[>"V%* -M6GP[,Z!@P.J[Y$82MT:LY`,`/`$``#P!```"````10`!.$[H``!`$0``P*@! -M`<"H`0(!]`'T`20'"0NRVTV$F:VH,0R'GSB'HWDN("0(````!````1PA``$` -M28+@3L9G%/JYE%$OWB9AGV51^IVAS]VT=::4>2)9$OB0SH7+I,@BX[$B1K-F -MGT]4WX7>K_KIJ!T65S,=YKN50JZ9D3ZWG'>6RW0,B^XGM%3I+KG:GMBS\J5* -MPJ0D(IG4N.J61E65:E[_#T"10ZCNNP#AL'4EQ"`6B@#8)=ZF5E55R=7 -MD4<>^P0A69E`+Q%TEH"B''85=QJ&QB4%7DFH]1ORVIVR_`F1">-Z@Q:VFHBD -MK^,]`M-4W*KLG/VS93:5;WR04S934[B7C)DR#OLV&%W!ZWGB3](W*Z?Q&BG0 -MBA;VA05_GW=DM8$[@9`M*(6GH],YX2WWD,'61A*W1L+R`P`<`0``'`$```(` -M``!%``$83ND``$`1``#`J`$!P*@!`@'T`?0!!`?I"[+;3829K:@Q#(>?.(>C -M>2X@)`@````%````_"$``.!5NM$IR9=+?HB=@>'3V1>L>`KWUQ1TM0R#SNM_ -M3>H<2&GA/7PJ\XI!8P0_L^XM?$T,C"VO18`96\SC6M9[_>]]A$GG8NE)TOC] -M<`7G3JPT>_\='H272S'0<+MB7QX:\SSWZV-?>G^P+IIF9>W%E=02$HNQKE/\ -M(6@'>"Q.R:F':^Z'Z+2'P`D.Y*%?5OPN>\6'P$_O6[=NVBE8/+?F9:,+6/S+ -M_92NE#)'2?'Q2\;7JXQUPRS=.SP`B:(KS7T31H%#6)T7YR&*A*Y$U)TDVCBG -M9VW0CFY@K'S)3&]+1A*W1I;_`P#L````[`````(```!%``#H3NH``$`1``#` -MJ`$!P*@!`@'T`?0`U`:Y"[+;3829K:@Q#(>?.(>C>2X@)"`````$````S"$` -M`+`>MB*I_/+W^4"2]A8#`9N,":'\9B4FDK$UA1$[`"(&X)?;+%5J<@NJ7XC? -MU;LK\]_4.@4_QS,M**>#K$%]&SJ'D<2MFU%WX,#>"^]$KS2`N1OBYA97BR*H -M;>.WLGTI\#Y2H&7>JN);70:UH_.Y=1` -MX,2W@^SZ8K&I??&V'8L?"WSHM.\@G_EC2?(5_ZX;R"!)VNB-:X4Y1A*W1@\C -M!`#L````[`````(```!%``#H3NL``$`1``#`J`$!P*@!`@'T`?0`U`:Y"[+; -M3829K:@Q#(>?.(>C>2X@)"`````%````S"$``+"@J]W8821X2\<'*,0BKA)@ -M"LN"E`@JHM>Q`UY6N,T33%C[LL<,$*2&9AI[SA\ -M'PWK77NH^]B_QUD^T87J3R$1D=@[PO007PL]^;QJ/[@ZMT&C!;+1X!*%1=2W -M8=GT3R]FZ-_K;55SM9#_K=0V_R\X1A*W1@%`!``\`0``/`$```(```!%``$X -M3NP``$`1``#`J`$!P*@!`@'T`?0!)`<)"[+;3829K:@Q#(>?.(>C>2X@)`@` -M```&```!'"$``0!T1PG[ALPI*=K.2D5:\7[&B=,HZW^&6+[H,:O]"=>BKSFHNVN0ZDRH2L-3"7 -MR)4$QA3-GHU1^[4U5JYAJC9R^ELZ?C."Z1AY00P8>1=Z)--V207$@-I(`)'H -M/@C:Y?TT9G9T-MB=]EG7"=\"=@]Y&CU2#B\W\D\*?`E15&$K=&5$P$ -M`!P!```<`0```@```$4``1A.[0``0!$``,"H`0'`J`$"`?0!]`$$!^D+LMM- -MA)FMJ#$,AY\XAZ-Y+B`D"`````<```#\(0``X&FR(G&!DC=Z];F4:?WP.RL% -M0XZS*UD2#]6"KIWR['E6PDVQ-?.C#.19'H):BWM56]H2>6W7FX"M8'CEX\08 -MM`[$-JUZ#?*8^D'PL/5Z">?L9L$YYH13EJ^CQ/R4Y9"PFT;[,PHG.OI@C;3ZWMF*(+*=2N$6)R8)CSK-_ -MZBK]1A5N,A7SW^TS:O":MMB7;M!_[ZKU(;)8LTR)6Y!PQ(--FB?S$,:)F6 -MO7XU_T/=Y!\&W#>+J1-:(VQ1W#MN%C!!5`@))=B*($7YLEM22D7C=+;I1*PC -M#W0YU$8SF>7XC1V'2%//*C^LC-W]/P-G%)\V_.&8,8G;G'IP:!+R@\N"V?YA -M"2NKS)IWLY;J;YA$IY?M)&$K=&U'T$`.P```#L`````@```$4``.A.[P``0!$``,"H`0'`J`$" -M`?0!]`#4!KD+LMM-A)FMJ#$,AY\XAZ-Y+B`D(`````<```#,(0``L!"YYD.^ -M[,=/0.A^-JH)B6FB$".A)0S`<1NUP+97..F7+A^DHI<&/ZJ)]XWK'LQM'-9! -M&L2;:[Y9P@/O%T[=/#YO"%O@(C5#L;:8>@PBF$SEL(YS"SW?8&*E?*@NGUX] -M;YQ[VL;L0ZSYUH9I?W3,$;>#W/'W*.4[MW4P/NM- -MS%,FGG,Q[;X/TQ%X'E[S2S$U(RR+*'4+XHMW-9?S^>M&$K=&>:8$`(P!``", -M`0```@```$4``8A.\@``0!$``,"H`0'`J`$"`?0!]`%T!UD+LMM-A)FMJ#$, -MAY\XAZ-Y+B`D"`````@```%L(0`!4$B`9*;LTBAK$A%0PE:WBN)/^PNZ!]6Q.9+.-M0!DJ[ZVBK$ -MOE?S:\I!V$TIP],_7UQ'@2DQERV)-)5Q2>9G='-E>]?L"5I!F*5/VLP0CM+P\]J<,0#M -M]D/QX9UM1]5RJ5/*#L=R2N`;KV5N9=O8(?*7@)!`I;)),P(5$MXU.?MX:UN5 -M5DFRK]MFL`L72!B@^IW#6;U_`;SKRSJVE9'<0&J6AZ8\)-(H$5&'I1<&95]T -M&-3?+RP\RY/LW8W@`@[(K'S&I7I1A*W1K/< -M!`!<`0``7`$```(```!%``%83O,``$`1``#`J`$!P*@!`@'T`?0!1`?.(>C>2X@)"`````(```!/"$``2!'V:Z*OJ!6\`*8N%\&2(1B -MK^,[V:7)0;81T3R\.`R,_/1>4J422RM^EV199,C,PSDDM?%+;66=X0_=Y8CP9+T3R -MJG]\1_GAV$5HA0--2.5VCDPWR%%,=3D>_RKYS`RF,15V*/\!",Y0-%N8"UD7 -M\\7Q6PW-PU&/^!X51)!(5_*VS)KTQAA#M(R1PD6&(IWH3"!FSHJTMVK1,T82 -MMT84!04`?````'P````"````10``>$[U``!`$0``P*@!`<"H`0(!]`'T`&0& -M26/OX!N]8^LT8CUJJ)7@.9*UR79,R7HDUU['$R:3\H781:9^@ZQA_>,&; -M7.M#1A*W1F40!0!L````;`````(```!%``!H3O8``$`1``#`J`$!P*@!`@'T -M`?0`5`8Y8^_AR%:0@UK@%<%?WX#<-2X@)2``````````3````##"_JE?8W95 -MW0RU]?UZ96#PU44>D4\G@N2$NF++'.+6KCK:4XKGGX%RT$N%"T82MT9J'P4` -M;````&P````"````10``:$[W``!`$0``P*@!`<"H`0(!]`'T`%0&.6/OX3'9OZ+F_7ZN-AE="(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``RQ\2'%CG -M0B1RXX0/^W1@&:G'X+=:[3LP5$JB@8D#`16"Q8$`-EP_, -M7X^U3;B3'+=VZ&8?^<+!(N651^BOKK@F$1'H?*"[R@^C<`#T^VO\V?(("[@`+1"'Y_CY#4I```DP]',[WG`:WSK -MCD%5`7'`$CL"?_HTO!BA75!RN.-=70\I```<``!`!*10;G]MK7OC9PJO2.OX -MYW-?$$V[````'```0`7$T?'`P"0D4?DLQG5M@]K9I'B]ET82MT;K/@8`7``` -M`%P````"````10``6$\!``!`$0``P*@!`<"H`0(!]`'T`$0&*66+RY=%*C'( -M```````````I("(@`````````#P````@``!`!@````$L/;>%\COHLF6V=:PB -M!4KY:*'7M482MT;83@8`N`$``+@!```"````10`!M$\"``!`$0``P*@!`<"H -M`0(!]`'T`:`'A66+RY=%*C'(```````````I("((`````````9@A```@``!` -M!@````$L/;>%\COHLF6V=:PB!4KY:*'7M2(``'@```!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``RQ\2'%CG0B1RXX0/^W1@&:G'X+=:[3LP5$J< -MI\A;4Z[1,,N61>B@8D#`16"Q8$`-EP_,7X^U3;B3'+=VZ&8?^<+!(N651^BO -MKK@F$1'H?*"[R@^C<`#T^VO\V?( -M("[@`+1"'Y_CY#4I```DP]',[WG`:WSKCD%5`7'`$CL"?_HTO!BA75!RN.-= -M70\I```<``!`!*10;G]MK7OC9PJO2.OXYW-?$$V[````'```0`7$T?'`P"0D -M4?DLQG5M@]K9I'B]ET82MT9D"YS8X+]Y-E%A -MP*ZNRY$R-LPYKQTZ`.^.N;)/!E0:,^B#)&ATFD;/](V)$)RSOE^5G/&[G'#Q -MI9,<*0``))1L80EU2A4H8EGUNR/3R5=_,0@*?>+3_4IY\HQ2_XXU*0``'``` -M0`0C9[7]7:"1;4JQ[IM!^D.<.41>;P```!P``$`%:+4G>P6C)".9>=5[.K5@ -MHPX6_$A&$K=&!Z(&``P!```,`0```@```$4``0A/!@``0!$``,"H`0'`J`$" -M`?0!]`#T!]EEB\N712HQR$M\93K#6:!O+B`C"`````$```#L(P``T'1KQE3U -MAH1O$V^U0>NT&C\O>M-"(,9=SFV#F/DUJ,1N_9;\U[U.D33X>I8L?(9;AGMVO -M$`N/V%S<1:R;S25H+=^1S]H*[S-DJ3MC#/G!`\^GY>_1S2I)E?UTW=;[M!.3 -M3'C46A_A],DDJ2O3NS5$Q#[D11]\VMP"'H]4BDKJ+3@(P,Y8-=V`V";_,K)P -M3E?3=X9"&'Q(J1_O2]"1BFBJF482MT:^NP8`O````+P````"````10``N$\' -M``!`$0``P*@!`<"H`0(!]`'T`*0&B66+RY=%*C'(2WQE.L-9H&\N(",@```` -M`0```)PD``"`?C:F>IQNW"Y4;3UUSS+(F-0O?E+5S-5$P`CX+Z9*O@5:>R+; -M0P2W$&Q7CU+[8<)[)/%T!26*SXYN$PX#BS'OAO!*7N4H_H41XM%V(T]#O2`E -M<))U17R"(@KQ0G?=9@P&109STD\(]3YHVZ3VP_^$E.:EL-\3)SL8*/Y[W482 -MMT88W`8`'`$``!P!```"````10`!&$\(``!`$0``P*@!`<"H`0(!]`'T`00' -MZ66+RY=%*C'(2WQE.L-9H&\N("0(`````@```/PA``#@91E^TKIWO$U@7$[G -M%G9[LORJR5,N0017X.(!ZD1NQ`B<0P:E1?$H1.)1S4A8(ARN>"OUS_?2/XD^ -ME!+<^!!Q3*U*\C'4S.LVM0@W+A_I/LKU%YF_K`@0KT\1NDYX*]0),ZZX(!.5BEV<4Y3+$GY",QVDFI)K< -M.I4;4#>OEZ8^LC:!)+8]^R@*/.G$MD$OH`=R$$82MT9[YP8`_````/P````" -M````10``^$\)``!`$0``P*@!`<"H`0(!]`'T`.0&R66+RY=%*C'(2WQE.L-9 -MH&\N("0(`````P```-PA``#`GCNGN4XHDZ@IZZWES=1I? -M]\>)S$(%&^UA%%9-'5*&Y@=C>_Y0;A('"B/<^2_:MU>UKI+6%)$!6%@[Z7JH -M!Y:Z%D][8[_SC'B47\M_G-:K#/^B3+W%;^V-9G%L!;6"%XWH[684WD_90_33 -M%ROG:9`9NE?P(R*9UDCI]5N[BX"><(EDZ?\^[#[$M85PQ5HVR9FSM -M?3*B^J-0V@:%'OZIG?H@F0PM*PBE][T@O2A&$K=&+?(&`&P```!L`````@`` -M`$4``&A/"@``0!$``,"H`0'`J`$"`?0!]`!4!CEEB\N712HQR$M\93K#6:!O -M+B`D(`````(```!,*0``,$2T/V?Z.U#K+U31,?,_A*.+NHM%KEGS7=&G3:LB -M-,4YC;&L(2K+K!;U=[+%)Q`_)T#WC8N@-=5%XQPZ??5%(%-[*M%=@6-F=^ -M=>A`*$82MT:>*P<`/`$``#P!```"````10`!.$\,``!`$0``P*@!`<"H`0(! -M]`'T`20'"66+RY=%*C'(2WQE.L-9H&\N("0(````!````1PA``$`_5][=CL; -M<@,FO03$!<2HJ`'5&;[F7PB].XC'=*[(,/0Y4]C,NF6I.K<< -MH9]OAK(+[RXUCL0IMX, -MQ:`\=XV>#DG;KKFQ[#MQ>(C![D967<::Z7^&>VG#:O]:*>CG*0O=W04YHOS1 -MK\@A)9XE&OE2TVL,KI!U#375F5@.;Q"`VF->B[O).E**JI(]LH%M"& -M$Y>S(.KSQ%92>L)=.=2W"FOR`1>):N'Y%;FMOMIK[7(QS^LRQ;>3P"J%3[KZ -MXVB\J:#2H]56+H1;(_R>CN0O4F;GQ(?3@]R9A9:\4=';%Y&6X1;:\O3$C*MSE8WTN+[W@H6N]DW_"6W -MTXJJ=-IK]B#C%0?]_5V!SUNLZB'4@C_1A*W1G5I!P#L```` -M[`````(```!%``#H3P\``$`1``#`J`$!P*@!`@'T`?0`U`:Y98O+ET4J,R`,6F%#7!HB -M#QS0.4SQ-=U?7\;U`C>H?:9$)$UA5Y-2P%4DD8(>PI\[^_)3D4FT5S]74]XA -MQUV(E8Y;P?#+VJ8\Y*H\111B0K1]5X%$<,\;I.Y_7FQTI9?RP^BZ:$SGCBI! -M31IOG*/$T_9\P=5!`:CD6XO&[Y%FY[<^X(?`A@E4^-]<)^$E-C`WB1V -M\T>Z/TJW''X1KINJ;'#]1A*W1N2'!P`\`0``/`$```(```!%``$X3Q```$`1 -M``#`J`$!P*@!`@'T`?0!)`<)98O+ET4J,H0NI2KS(+V?V&#WI5&W-*?O?_:X -MS`3\DV#@(!>E@L=)%,#S]9>?ZU>#@%.+G4=@-T1&K&@B_[4'N8[)'U/$:'0J -M=7`$44]*ER"[1P3$-@G-F(),^RG21DMNX@_YJSM5-"KLDLIX$<2W3*(#ZZR) -MAG%N&]/8]W7O!8"F1/]?6*)TRB+335%X+\*#`CCPQT[$=*V_C*_9@>G8N;_@ -M2Y"FP`?3IR)+$7>EIJ0+G\#L5+4F)!'CUGWH8XIJ?*5&$K=&,Y,'`!P!```< -M`0```@```$4``1A/$0``0!$``,"H`0'`J`$"`?0!]`$$!^EEB\N712HQR$M\ -M93K#6:!O+B`D"`````<```#\(0``X/EKQ-ATQ#M'*-C\C#M7M33_B]*D?5^F -MNF7'8`2+34&`<0(/D$W?7[D6-E!GUQB[S%CUN_:GU\<5QG(TD(A.QNG5^B/Q -M#Z1"`L.O9!]G@[<>_<-&QW@`$%Q3XW(_^.^8G3*7/#VTI%_ -MA*9K7-R(9>86`G#$3^[-8K!&$K=&HZ('`.P```#L`````@```$4``.A/$@`` -M0!$``,"H`0'`J`$"`?0!]`#4!KEEB\N712HQR$M\93K#6:!O+B`D(`````8` -M``#,(0``L(5;"3*$#]*K3L5_'L.2T!\8J7K]UTIWL&M:*`S0(^&46_\=N&-6 -MT=MB>LXW,01&,IS>1^`T(V^;8HV@!Y>W!1KCH?N.8EX*.^HS31!+"#Y`?:+($8S>ZMQF`37SH -MI\;;%''),A/6+F5L&-]T_D>-"3I`15GV2C<^^PXMABO.&<19&V])O%Q:RZI& -M$K=&8,4'`.P```#L`````@```$4``.A/$P``0!$``,"H`0'`J`$"`?0!]`#4 -M!KEEB\N712HQR$M\93K#6:!O+B`D(`````<```#,(0``L$57M.FIA`#P1LFM -MC*<6SKBN$2(;*>MG@B86(&@.H,@7NZ>=:B6.+Z_?6QN]+Z4RC`_]E0*6&,[] -MSJM/==\E,BPS:?H-\SC''N%[CAKR7ML^,'Z.FC**<4]29,V"EU1L!5Z4)_R? -M\)%P9$]2;"-C44P;,?@I,IFI&$K=&4.L'`(P!``",`0```@`` -M`$4``8A/%```0!$``,"H`0'`J`$"`?0!]`%T!UEEB\N712HQR$M\93K#6:!O -M+B`D"`````@```%L(0`!4)1E]-AQ9@QA-12QU4_2'M0P("4',1MAA%"'397( -M5"[M"\LS>OJGAQLH3FUE1&+6FJHNE&@2C -MYG@2.C3HZ=V09QB^0'W"SP2-GC!U?Y2HI*)5:J[1!GP)O($:P+__W7QM -MJ_)(S=SR9%H)8AO/JEY0U5$=38_.0_P(1672&?%UH7J>5VH)AN&%J5H9R1+B -M=V;IBH?=*%TO0P`4@>=@B(E'.SPC]](K^R:`J`]%66.H*7=L9$_4&U#)S7F, -MOH`45V4Q";!\/S]4N6[.HJ="(*0;[K0(OFVP19T&`]Z2HU^QIQ&3-RD<(J1A*W1K,?"`!<`0`` -M7`$```(```!%``%83Q4``$`1``#`J`$!P*@!`@'T`?0!1`?]-(CYM;`6O -M#W1I/XRC*;TD]G<1*;Y2IT`%@X>W/78$K*L0U72BF,;;$O.2'AU;R0R]7(&^ -MZ-0&H,P:#U'L4YV'\==O.NV^*M5JPEL(UE[,[C'L-42,49_P+1R+.,!=I)I4 -MX*\_?KHG\?#^-5N-^U:$4FD3+&[_^\"$PAM/#A,I/)K)$XQY6-)B>J60W1^) -MO1($::4NJ[QZ_/$YM8D7['Q4OF>JX/6\KXG!I]=W*)X7PCS<#6EI"<^4$]D@ -M7/S.ORS3QSMK3LY7`&JO"^3##R+248:V<@ZQ,!4$S>,\%M&1EG:FO^G+;(D# -M]$S=RMJ([ZJPEKI?Q!,ZNWB8(P$\6``!`$0``P*@!`<"H`0(!]`'T`&0&24.$/3

[M]M`2^O-\<+?S3&Z+!I!G$A:04DX:LI^XVO+UNT82MT:/8@@`;````&P` -M```"````10``:$\8``!`$0``P*@!`<"H`0(!]`'T`%0&.4.$/3"(``'@` -M``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``7T/529F6!768S.W^ -MF#7-=O7.M*-&-E;CDR*MV3=JCGSQ_N#=+=M$6O0_MMA]MHO<`D`7````%P````" -M````10``6$\>``!`$0``P*@!`<"H`0(!]`'T`$0&*8J_#%0SK`9\```````` -M```I("(@`````````#P````@``!`!@````&0._P7A^.810S.$RA"D$1%DBRW -M<$82MT;;APD`N`$``+@!```"````10`!M$\?``!`$0``P*@!`<"H`0(!]`'T -M`:`'A8J_#%0SK`9\```````````I("((`````````9@A```@``!`!@````&0 -M._P7A^.810S.$RA"D$1%DBRW<"(``'@```!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``7T/529F6!768S.W^F#7-=O7.M*-&-E;CDR*MV3=JCGSQ -M_N#=+=M$6O0_MMA]MHO<S,M=9=3S(.'B[4AN;QG)K"P#Q;!L'.);A"D$0S -M/3`9',J<.\\'Q'$S:,B/&;1<_;`P:D\V13,/PELZ$=#T*/3!$A._)T3+?[[O -MQ'+B6#5$U[0]^.)D(?K72I`&9:@>WG;5-!W.EP6;LG^MR?_RE+M0$$"_*0`` -M)(C%/7T_FUE..V+J7A4!L+[&OD8'X%CYJ&1\L#"ADDJI*0``'```0`08;T*D -MI66!`&:O3&1TM\#G[J+2$P```!P``$`%W>MP#(4GLZ!%FU9ILG(_+_"K>NI& -M$K=&X=D)``P!```,`0```@```$4``0A/(@``0!$``,"H`0'`J`$"`?0!]`#T -M!]F*OPQ4,ZP&?(\*BPX@PR_6+B`C"`````$```#L(P``T!)8DVNU6(1+HVU% -M:BW\/,7?.52L>\\H])QPH-.]=/=P5>\0:X#NO=+/0B<*SP?8R.)%]!P_5T4R -M7Y3@U[;O^'1E=?H$Y)8MVU!=[C[:T612SR)4N_ZF.E[.3!V_F8^$Y`/&%KZ> -M6`E^A:206JV%M30Y35H*2+23E`:3135*I!V347'-PW(HEL+")B_I7F\+,AJ/ -MJ_'OQ`6)4NK-IVU"./R^D!+WO=Y7]>VT-75-,EMX[:P>^0E@0!Y5O-*`+#B3 -M_M;PSDMDX+DM0H?@X$82MT:D\@D`O````+P````"````10``N$\D``!`$0`` -MP*@!`<"H`0(!]`'T`*0&B8J_#%0SK`9\CPJ+#B##+]8N(",@`````0```)PD -M``"`PG270Z0Z/;0UV,&L?H83>]TRJ4+N\SQS__FY -M(NYQ0EXP-X]B5BAH&-@1YB%EBHF[BU94_VGH;&#+L33K=Z$V?%QK5!9^XP;, -M7(L9BF?;!JK,*DJ)>6@79]1!OO%6KJ0+:C`QX20PKJ).C7Z^,D82MT8^$0H` -M'`$``!P!```"````10`!&$\E``!`$0``P*@!`<"H`0(!]`'T`00'Z8J_#%0S -MK`9\CPJ+#B##+]8N("0(`````@```/PA``#@GL>1Q1_L\$)3;UI:+PG%Z[YW -M1_SHA+0322!A>I&%\V?X7#_"G&3F_;)!9AIYGPA[6T-('-OC^EOZD]]6G3P9 -M8&L2^%.-&/BA6W%D7X`4((L4+KGIHOK!6K8+!GZ;[?#6NPM=I<6 -M=-9H_@O9*58;]`EG,N9]ISN`'$3++@H7YQ*7F(D`YUF7W&"PL?Y/U'#`#ES- -M%0;.2+X(703!LJ(M?;K1\<2S$`:7V)G(!\NI6\4`+V1VJ(>:\C"7Q@%C3=UF -M*MX*VRD]=Z"(/Y5]MUJIAA!)!Z+L#$82MT9B'0H`_````/P````"````10`` -M^$\F``!`$0``P*@!`<"H`0(!]`'T`.0&R8J_#%0SK`9\CPJ+#B##+]8N("0( -M`````P```-PA``#`YLLT"OVPO%W%V-[<51&[-@497'/`)+0P'"D<`/^?*O/U -ME_J[,6YFG>YB1[Y,18I+BLTPKS'Z*-O03II3GVG47C)K$&Y-U -MBUM%4S4=-U""N6V&.([ -M*I"@3-:,PFS;FG!P*0M,#N,M1\[7`3A#4VCHY@/*-V_@.^*G$0F1F<6<8/1A*W1C-K"@`<`0``'`$```(```!%``$83RH``$`1 -M``#`J`$!P*@!`@'T`?0!!`?IBK\,5#.L!GR/"HL.(,,OUBX@)`@````%```` -M_"$``."U4AP4JFJ%<'EX>3,#"'=9K%HL::QB_4]'-*_<8SG,X]*:[:E.7WFB -MJ/SI>&JPA9:&[.[$+,O8%(?N>XNYIIZE58_BM#MD6V](M!2(#/V_S'[6@D'\ -MF-=PM=Q_\N?<*B+!23`):T,R2P,3HB"O9D;5-+K'*K%L<\S0M[A6ONM4=[QT -M?`.BA)$M'L==K`$FY?8*K]<5`K1I4+#I[KC8UBIVF\,RE/6"96/P35Z(TRP" -M;HVP:^69YLMIDTL6LBZJ0XA^*98MH[GF]?WVEM9/7@O1WM-K0-#08V^YNK8: -M1A*W1J=Z"@#L````[`````(```!%``#H3RL``$`1``#`J`$!P*@!`@'T`?0` -MU`:YBK\,5#.L!GR/"HL.(,,OUBX@)"`````$````S"$``+!]#.Z6(!1.?-X? -MD6.^W=4V?CUZPTP=@A/I2BRY0^=]KP4K=A.1_HT$ -MFTB:I%/;LM;.].MNBEA7D/=Z)H4V1[[6ZVR5?+GR<#F*8`PR_WYUN.%/M,G@ -M:^/X_TH.$EE4Y*VK^416I&VKK@GKAZUQ)&,_1A*W1AV="@#L````[`````(` -M``!%``#H3RP``$`1``#`J`$!P*@!`@'T`?0`U`:YBK\,5#.L!GR/"HL.(,,O -MUBX@)"`````%````S"$``+`EB[1RDK-Y3T0.6S>;E55&![V0!\;ENP.^K!`J -MRV;SD,UK)YMU#_#J9*L$8>H12YULHBI>?8")#6TC#7<]YZ8R5Q^OAM#\B7*= -MROQO!FJ#U`-0A>"?H%:5!*.LNV@4:T:[ZTNK-*AK2ER':7(DS_X%\?-(BW>/ -M^89JK3R`T0D0KB1M&P4"6ON\3(BN[K3]E6'@A^M\@(+*3#B';.]NNN;Y<(>@ -MX^[`9I[FI33$1A*W1MZY"@`\`0``/`$```(```!%``$X3RT``$`1``#`J`$! -MP*@!`@'T`?0!)`<)BK\,5#.L!GR/"HL.(,,OUBX@)`@````&```!'"$``0`1 -MTC&!MI"F6:[D4+4 -MZDYE?L#7_Q4"LIE)O1^PQ3Q#^EE^Q2N7.QW6%I$8<8VOT\[/(UY,C7H#6=H9 -M]<@B=D/[B&$4R^%+@^OUZ)LJ`*B!F[,1`G87S3\4ZJ966*TL1">Z?SI2[A;' -ML7($K#P:D,%RE7OF?ZLCI&$K=&;,4*`!P!```<`0```@`` -M`$4``1A/+@``0!$``,"H`0'`J`$"`?0!]`$$!^F*OPQ4,ZP&?(\*BPX@PR_6 -M+B`D"`````<```#\(0``X+%IC)'8H#Z.!'=KVEJSV4LPXZ=MK0PE8_#A$<A -MZSYT)KEX:I&$#R9L') -M8>XKQ^):]^/&HWODGVHG0"\Q4=71;7IR$YX`+/YD-B;C7/8!,-G/ -M$5^:E`'6T%KW,UM&$K=&GM4*`.P```#L`````@```$4``.A/+P``0!$``,"H -M`0'`J`$"`?0!]`#4!KF*OPQ4,ZP&?(\*BPX@PR_6+B`D(`````8```#,(0`` -ML#(-15"G3$U,!\C^9B&7\ZVM7WHSY/E:T#W+3BO5A;A<%X,;<]J:]N8:J=Y: -MR]2`MSH>PEA\L=#5CS\)Q#8G(;O8>_,J5QYA]_VZU7_>O<*WS -M;#2VHAR6JB],J>IW0+EC3K`B:+ABVFKX8BH#S*?WOUWO'D0C-R-&$K=&O`0+ -M`.P```#L`````@```$4``.A/1P``0!$``,"H`0'`J`$"`?0!]`#4!KF*OPQ4 -M,ZP&?(\*BPX@PR_6+B`D(`````<```#,(0``L%S>.VA>A&IU:SS<]V -MJ?X7-V&GJJAGA.8/O2WO%^B&2>FP9G[F]4:^+E%UN5[)8&9HX4VX@&?Q$+!N -M9,0T'#I6=N2`-MN];9,=]SXI2/=`DSMHW7T'WAJ'Z/7;34I7,?%!=@EJEV)= -MF]GI+'7/R6P[/6/VXT&=*U::US(-BO81U!'78%OQ5U2^XXVOG%\=X6HA -MY!;2=\3*^(69373IY:'Z\8@)''WF(`$,03C.D7G3FL#CTM*V3-W?$3)7\#0RP!M@125^>X2W3CUL,2_;P\8LJ9+`6GH/T8/OW"R\[!D!#??DMLS>'LQEY&0HX3S:% -M7%)=N@$]*``!`$0``P*@!`<"H`0(!]`'T`&0&20O&Z)-)-WMBVDR< -ML8VOM(Y7_D;@2Y1A*W1K62"P!L -M````;`````(```!%``!H3TT``$`1``#`J`$!P*@!`@'T`?0`5`8Y"\;HDTDW -M>V+:3)RQC:^TARX@)2``````````3````#`AFSRJ)JM*X(D$XV;E+]FM/H62 -M+Z0PR@J,H_Z/KM*'S\PM+M2H$#\(,K(PW482MT8$H@L`;````&P````"```` -M10``:$]/``!`$0``P*@!`<"H`0(!]`'T`%0&.0O&Z)-)-WMBVDR- -MSIGM1A*W1DBK#`"8`0``F`$```(```!%``&43U$``$`1``#`J`$!P*@!`@'T -M`?0!@`=E>,:-I*PNC;X``````````"$@(@@````````!>"(``'@```!T`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``HF87@F;YC$AP/A0:L>F9[J7+R'N,-:,%%P'Z+A`&+(WUJ3AN<>8D4#IY4Y*PT^Z<]/'TABHF= -MW(?CGXVA$K]%7H(!JL3HL:8$`D&K=C%)>8]ZXQ7?8LSF;UJ0S(5P7Z@`,(F@Y0S(5 -MP7Z@`,(F@YF9[J7+R'N,-:,%%P'Z+A`&+ -M(WUJ3AN<>8D4#IY4Y*PT^Z<]/'TABHF=W(?CGXVA$K]%7H(!JL3HL:8$`D&K -M=C%)>8]ZXQ7?8LSF;UJEF'$ -M^VF3&AG'X2:SU&F3S:ZO"C.B86\2]+G>LBY6Y68-;7G="D;KZ=[@QN3D;&0X -M.G9Q:\:NR=?()]D29ZU=9P4ZZF2%09?O9\<\)H?[!WE -M"M9@TCA[SNIB71H/NKE4<#[%\#-TOG9CPC97<(V[1:G'#JB'1),F()R$AP3] -MB&5O0H^[8D[XM1G(KD9EUX4'>(P*:NX2E-[^!=%:!@.9L;9RFYGA>ZFRR7G, -M4G'=QV61G_NYXLC>\?98TTMCWXC>T$2DNX(CE)\QGTOE68?O -MURO$9J&G*?06>/Z-Q@X_88>LY#H[,5QLF<*CG_3.)WNW=LDO%WJLY:_)HP*` -M+IS%^FX.GT82MT8!-`T`O````+P````"````10``N$]6``!`$0``P*@!`<"H -M`0(!]`'T`*0&B7C&C:2L+HV^`)3`IJ<&D%EO6I3"P`J&F3()5J26-^QW!A`%5C,= -M;V%2%&8?)#;PE\O)ACB85=:[G$P`T;/+@?*:,BW?CT82MT974PT`'`$``!P! -M```"````10`!&$]8``!`$0``P*@!`<"H`0(!]`'T`00'Z7C&C:2L+HV^`)3` -MIJF!&E]/%1O=VT30])%(VKEB -M`VNT68[X!^F-Q3%,-$0>?"?9D)FMJ(Y2;L%;8&PI?^W+WJW-O,65N94>M;S= -M!/C<:\J=FKA,JJFJ?:7-I\LYT'VZEQY\,A4D4'R0)EUKBXZ+_^]&#^;!(&,0 -MWDCKN;2,TQ:XS[A&JB`X*)G/1A/J27Z^D64_-&S!E?V#TX_]K!<_UN&^748Y -M9*>#"?T>C^T#\=Y[\U@;CT7EFG)L)W6Y2']116FA?`VT#(S)!CK?U]^A+`+@ -M2:/FWO5+C^_]1E30T*\)9482MT;>7@T`_````/P````"````10``^$]9``!` -M$0``P*@!`<"H`0(!]`'T`.0&R7C&C:2L+HV^`)3`IJR#\9]MN6ED`R_@I"J]H3^?C-#[(B=0]X -M?=PS=!M.@Y@=F3L>C,)3?A-&%"F.T(0D+DJ0)G,\6,^YU'\=5<9$NBCVFC,S -M:&NLT"R&26MQ5):G-__:YGQ,SJ,OX?-QJ] -M.++_/Y4`ICW9/9@5P\!&$K=&;FD-`&P```!L`````@```$4``&A/6@``0!$` -M`,"H`0'`J`$"`?0!]`!4!CEXQHVDK"Z-O@"4P*:G*4;_+B`D(`````(```!, -M*0``,$FOU-^5G>6$S,2><72CY98:]JF\R\KM%>6V-(E'Z4#C"/.[GE&?GA`A -MP=>-1A*W1E^%#0!L````;`````(```!%``!H3UL``$`1``#`J`$!P*@!`@'T -M`?0`5`8Y>,:-I*PNC;X`E,"FIRE&_RX@)"`````#````3"D``#!2%Y-2FG?5 -M;N/>8B_ZM3-&G4&&H(W,=J2WMK;"J6A#`!3-W[.3^9NK8B5+-8/]GHC9(VM/]HYUF:AE8,:>;JG/GKW>Q'$ZS#;Y_+H -M6&+O6"Q_/?ES=^`YIJ/LB+*KX\[2I/-`8"W9CXLGWV:V`((H[CTX]?@=UIN):QOO+AFG.M -MZ:8#:E&\QT5?=\(G`B!@GY-,1').>B$(5_X_QW;#7NZ(F!@;D&G]& -M%6%*VU=K%A`"2'Z3!G-,/HEJXK;8;'(":K+TI,:-I*PNC;X`E,"FIRE&_RX@)`@````%````_"$``.#[ -M[NEZ;&-GV^@R*F^;+%'"4@<&]O==-+-H$4T$NN8MB.RISV!_RI5XC]#[#GJ_ -M`DWVUZ'HE["6\.-GIH#%&2K7V6@O.RQ#IZZM-9Z(`?,+4=LO/###M1N]L^9, -MH"$+5VH6XIP[^?V$F=CY.T\*RT.Z%]]&R3F>IM'7?4:&8/!'&Y7[I6K15^XP -MNBNV.HCL)WR-:0RW../T,^D+BV<[6N3O_H//*J5A0N,?Y=^_E2,\6!`\=C[# -M:E3GYZ9&60/E\+L]Q,H1I+^N_^K,:- -MI*PNC;X`E,"FIRE&_RX@)"`````$````S"$``+#$TAZF#8O#Z`H@"24&J8I] -MPV/IAF(#2B`*?9Z!2Q7G`$BG#@S,#?;S+0`EW$M"XBW&,W\T[1/7[`OPF*W9 -MR9\1*2^U##P)^6.R#GC^N[%-4*&Q[+&*.U2Y*8:@5E`-$@1!]_HNL"(NF)\Z -M3,:-I*PNC;X`E,"FIRE&_RX@)"`` -M```%````S"$``+`CSZDG];+:P@X'.>,;C,R&>HUQK3=I$/V1N/`@FF0A(+:+ -MY'$'B5G8ROUW356X>,QN=[8@,:-I*PNC;X`E,"FIRE&_RX@)`@````&```!'"$``0`?(]GJ:_C` -M5A$U(3#3$<&2T:5BQ*!>.LDZO;.FC5E`3XL^=)1E;3'1V"6S'7P#W^(_'E7D -M(4B?Z9>J`L%2B6O[1W;5M'E$#Y"+X2DVOSQ5%PQ%,5QQP'9NA8/.*,NMG8J) -MC,@XC$Z):O8-I*B(8O(VU&`_`1!9).B">TL,03[6)STWOS$6S`OO$]L:DAC-M -MN+=19F5QOF9<;.VY7U"!>(($*3JH3.R!C6"X3D=.W$Y)<.?5C&/#J'JU&$K=&.@<.`!P!```<`0```@```$4``1A/ -M80``0!$``,"H`0'`J`$"`?0!]`$$!^EXQHVDK"Z-O@"4P*:G*4;_+B`D"``` -M``<```#\(0``X+KK>T-N?*E8''!-[WNE"5K`\K=`TR9;M1=/26!F,J(=R)2G -M.5JOY7P_7:&6)]>2G=_@MQH:K2!/Z!(7_-G!=(S84G!'#09A;Y"@K7?=?>-$ -M,OVL%#7#IZY88DX%"I!IQ+)M$-:`%PMJ8E_B -MO1%KECYK%N9O*@:DLI=SI?4NQ0"\MDS*S?,6'^I:25X&"HII`<' -M?OCT\!5&$K=&SA8.`.P```#L`````@```$4``.A/8@``0!$``,"H`0'`J`$" -M`?0!]`#4!KEXQHVDK"Z-O@"4P*:G*4;_+B`D(`````8```#,(0``L(!UG7.5 -MXX(594R5ZO/8W;T$D9`"BJ%#A -MD\#V'!B=(L!3#3Q?@0,=B(,I;KG_B7+[C7QEA#+7W117Q -M[VS\4NX1W?04>L?:O!0;\\MWQ7BK[91=#BS3R:TZY=CWS971QDC`!_D1*=(0 -MM^*H^_A7`>(E$11$:@=R57D<`E1" -M&=!2,VU?+AY17RB'Z9E&$K=&UF$.`(P!``",`0```@```$4``8A/90``0!$` -M`,"H`0'`J`$"`?0!]`%T!UEXQHVDK"Z-O@"4P*:G*4;_+B`D"`````@```%L -M(0`!4'"\X,$T1])7UK;4V][7\2&+R@B(SAJ=MET!*9BV7L:[=H074^@98PC\ -M3=^'KU9B1%SUA)2BLZN%%$B[LT2R<@"YE$UQQ=ZVDO;DQ*O;V%0`F#<*.?R_ -MSAIN/BERTRE6)&H1<89)!E)AR*$^1U-YF+@?\,^\:;X\Q5=W6=NM:-HTFN[W -MWO,F9&8Z?C)6FGE^RH@+SM&AB:@GXZ#YZLVWJDZA.><"''L@G\P(TBB/IY(G -M6>J(L9\)6?%^ECIC]-3(\U/%*FGW7=64@(I,'9(%B^A)5&E^#%%_8$/!AKN$VS$HE\B3X"14Q:T$V=BC_/LX&EBHC1X,W<>R:.,!Y85 -M][)04M.#L@0*`J:0R;G)3[%VBL!+G>BDC\/2#+G^AJ9S8]K\Z>VJFNE*+(BS -M!QA`PWZ_\>QI3'TIV.[`_'2V1:L'1A*W1DR7#@!<`0``7`$```(```!%``%8 -M3V<``$`1``#`J`$!P*@!`@'T`?0!1`,:-I*PNC;X`E,"FIRE&_RX@)"`` -M```(```!/"$``2!H57TP$,!XDJ``@0XE469)#(&R&'T0&I=A._U1=\BPOKX5 -M*#)#MGQ7,B_95J@2:3L>2W[I^Q^@'B+3CX8N/SX;2&=`JI4W"C\C*D$2"B9UB'5D#K-=8[Q7YIBH -M&/F"8IJ?8(+Y?OE%-QI?8(\_%R!V5*)O0K=-_D:A0[+*CIYFG*7/2R1]DMT( -M18=87EW!?>RC_"_Q]E'KI#F4X(AF"<63;U70.X!A68BQ*+X&K0X)\F5&(SIB -M,J\79^E'6E=#;_G5+;%^*`_3YB7IZM=']D82MT;7OPX`?````'P````"```` -M10``>$]I``!`$0``P*@!`<"H`0(!]`'T`&0&260VPPCZH+CB19L.!]G*5V0N -M("4(`````````%PJ``!`JWPS>ZIPH$GC/@OGY*:[]<4O$("DUN790KHF@NTT -M3L4>GII-BOXZNK0"K!G2)WCW\#YHF;G@K6;I)<2C1A*W1@;,#@!L````;``` -M``(```!%``!H3VH``$`1``#`J`$!P*@!`@'T`?0`5`8Y9#;#"/J@N.)%FPX' -MV!0!-'&@AOPG[?.%=G>OG -M"AEP")@(RB$HQ8':OLK@*H6V<482MT93V@X`;````&P````"````10``:$]K -M``!`$0``P*@!`<"H`0(!]`'T`%0&.60VPPCZH+CB19L.!]G*5V0N("4(```` -M`0```$PJ```P.EP*\\B=@VT7[ZR@(,_)&6*\;EC]56@H7DW%;==IX)T.D^#1 -MYGS,9.)'"'E&$K=&K><.`&P```!L`````@```$4``&A/;```0!$``,"H`0'` -MJ`$"`?0!]`!4!CED-L,(^J"XXD6;#@?9RE=D+B`E(`````$```!,````,'S? -MH\K2FZIV\4_.5W\>P,ES&/`$N`#8T8Y8;C"R;1EDVMRE*QC`]%E2Y+)51Q*W -M1NN@``"8`0``F`$```(```!%``&43W```$`1``#`J`$!P*@!`@'T`?0!@`=E -MP^0IA8IR2E8``````````"$@(@@````````!>"(``'@```!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``E1>!%RQ\3A(9'822&-[[3Y#?@`^TU#.6 -MU[3`VVW0RH]!6C*^B2%1WKKBCV+RW7U"B`87XN,=KP]SH"C"TA]<.&3NYN_@ -MA6J`B#.'SWK<185#:PD%L/*374T5SE%%E>.S*20)?+*FWJ -MP#N!'QXR?Z3EATW+&2PI```D@?/77#:$ -MY.T8A`@I```<``!`!`)M'[I"YS`<_G95W7.?O!A!3U0T````'```0`7@[]'I -M[\T@^5+;`[!E!%RQ\3A(9'822&-[[3Y#?@`^TU#.6U[3`VVW0RH]!6C*^B2%1WKKBCV+R -MW7U"B`87XN,=KP]SH"C"TA]<.&3NYN_@A6J`B#.'SWK<185#:PD%L/*374T5 -MSE%%E>.S*20)?+*FWJP#N!'QXR?Z3EATW+&2PI```D@?/7 -M7#:$Y.T8A`@I```<``!`!`)M'[I"YS`< -M_G95W7.?O!A!3U0T````'```0`7@[]'I[\T@^5+;`[!E!#?-CI[Y]*!)]QB`0B'%X7=!U``>D$*VORBL,7733T2(XCQ7,F&MS3:G -M$B"ZKS6A2E-1S5P6M\E\JI3UA.K2??4)>*)9I6H?:!NBFKZ2-HS2:,EWI'$K=&71(!``P!```, -M`0```@```$4``0A/=```0!$``,"H`0'`J`$"`?0!]`#T!]G#Y"F%BG)*5GXB -M"S?K:"P7+B`C"`````$```#L(P``T(2%+V?W8.\7O+RCHTL9,D_[KV_I/[;T-E<>5Z(/'<"*_RSR^0E'*\[\& -MV6X,:,'?,!5@@X=T:P6#WZS]%5P@M$^"8SQRI?F#QMR,?(W)SZOX\7C92,@=K=!H[ -MF_GU6U+XLDB%1]$=WMZ;7I-*`4=38>K\-_Y#]8.-0RE$<2MT8\2@$`'`$``!P!```"```` -M10`!&$]W``!`$0``P*@!`<"H`0(!]`'T`00'ZL?@]7)R,.YA&K3*&'/7HIK!V'"' -M&E1E2-WQ(93ND?O2^GA^9^&WZN;6@2MBR:NP"N^$-SZPOR2?:)I0\F'`#299CG26+\3]5R<#1!AL,(KZ -M""&S$@1`Z%\7AU.%'$K=&O&`!`&P```!L`````@```$4``&A/>0``0!$``,"H`0'` -MJ`$"`?0!]`!4!CG#Y"F%BG)*5GXB"S?K:"P7+B`D(`````(```!,*0``,`_] -M<=7?X65BJ+O5+4>8!WU.,"*;5\]Q=QK'CD\<_:$AL?,)^%9/-@!U -M:"WV.GZT'L,(6TM=1X'$(GSSF`%%GZMP/)[[7;L**T<2MT:_EP$`/`$``#P! -M```"````10`!.$]]``!`$0``P*@!`<"H`0(!]`'T`20'"G]G5Z>`CNMT)^MA>7H"5ERT;+S'# -MX(_X!MC,OZJQZ<75SUSC'6)PG:#8:E1:Q3\Z.%7K)0EW,^;?>G.%2C:HQ -M$X<<#BD76Q4XGP?DZT.62>,L7@?,B#P?.GF2FE7=ZY8:!-0X#P;5OYY@)VH*Q_S^_Z4%>.#-OG\->,`Y(AX[58J -M1OYS)MW]'XFK_;TA,)>P')V![U;;IHMX!E9UK#N=,+(`BB)I0Z>:@`FBR]`2 -MDWZ?PU\2KM2BA"CF%Q,_<1XX9T$B\T]N0JR!6CR:8H\Y:Y,)+V^.!;]&;WX. -M\2$_ZSA.J-^-(PE0ZU@/-]-0#1Q*W1F&T`0#L```` -M[`````(```!%``#H3W\``$`1``#`J`$!P*@!`@'T`?0`U`:YP^0IA8IR2E9^ -M(@LWZV@L%RX@)"`````$````S"$``+#K.7V7]KZRBA@>GNP[Y.H'N[P-]0I) -MFK$4@:`@%4S@51_W3+%7ER5TTZF=95CK8#(Q7@H6%N@C$P5(A^J2L:'QJ>UW -M=Y7AH+7@^L7.=E7[ -MF&IARWE7/AH>S?47'25I1Q*W1HS7`0#L````[`````(```!%``#H3X```$`1 -M``#`J`$!P*@!`@'T`?0`U`:YP^0IA8IR2E9^(@LWZV@L%RX@)"`````%```` -MS"$``+#DH@F8YL*EF(0?VQM'#\5FBG,#>_.O6>WWA062,1,.X4X)IOOSZ\EM!Q-MPADR^TCD?(SLD+,S-C8 -M&[/+(GS_O&F8H]Z^44^^^%N`$=/KFI;U5AB4]"HQ`6[)7>`U@9( -M1A'D&UYQ-YDE-(SJW5+D7"="^D"F!X)ERFM7.CFPYG/9$W#*V>,"VBX;2/.V -M<%["4#66C=*VI]"DS"`J(!QK'#8>@Y_.@C)Y;[&M4;.`%4_;CD -M0VOU3E,G8S`8!?;."Z9-U:,A8@__"F+BK63%UU$38]PLM)P:YYG^.D3!T0@Q -M^]LE@=/QM[ZUS9%/[7IG)@-JK4;SUN,^PVG9TV4>*'CPX[MUA?U;R?3%0*;0 -MV*-.^-E.S,#8#5"6W4M'$K=&N@,"`!P!```<`0```@```$4``1A/A0``0!$` -M`,"H`0'`J`$"`?0!]`$$!^G#Y"F%BG)*5GXB"S?K:"P7+B`D"`````<```#\ -M(0``X`H$V$[A[&0G772]ZEP.1TW^4`L#79EE"W7*#I]&?)HY+S/GG%(Q*EM` -MM8FCA,TSZ*NTE"1;WK7.F6K[&+$Q%LV-*X+:8K/E/G'\Y/403-R+$@Q5&PB- -M4/TC9@*?.26Y/D=G,5!8UG=(?P+DC-(')&-M@':X4(AVRAO#M)UR=6`N%S:P -M"GA7DBY#M:$RYQJF^#H2J!1=0K)O@4N,'O[3'":WXC$;!A'<=]L5,KZ-0[=] -M>65:O[?HG3BX+_BIL'4);5Q9S410"`.P```#L`````@```$4``.A/A@``0!$``,"H`0'`J`$"`?0!]`#4 -M!KG#Y"F%BG)*5GXB"S?K:"P7+B`D(`````8```#,(0``L,%OIT+U@TF9`.D] -MYF[T;DU]8L,X_Q6KX+;#K#7*#TM\PW[N[5V-RH%\H0M\0ZJ(JS:(S^<)SH$: -MST%$^1-R\[YC31O(@K4,*@0REYS@*`ZC[-L,G-63$N">CL\1*E3YL^E/1.XN -MXP141^0M$T->)K;KE[QL`SUFQ3-EF;C1[H38+?@B=NH2/KIH2N<%)88!/?YM -MC1EO#=CE?6[KC19T7#UO4XF,>5WZG%4)*V)'$K=&MBL"`.P```#L`````@`` -M`$4``.A/AP``0!$``,"H`0'`J`$"`?0!]`#4!KG#Y"F%BG)*5GXB"S?K:"P7 -M+B`D(`````<```#,(0``L..9D,0,^>FR@CWJ&,+)X]WB5SG%VB"4FXLW'`N; -MPC#4)+.OSUB#&7#'$Z,`!LJ]`.U$!)7I?*A.`%SK+3S1+[[Y2NS[OQM!?948 -M5;!8]5W&K<@3R/,+Q$R3N'AFB1^N.IU)6%"L]&BGY%[+U:RWA[)6@K/8OT=% -M%'\[U=0W/%4?K7USF759Z`+^B$:W9X_.L9X[S40N?U@(]+%/YA:Z#1KW1G"E -M*Z=IE:"*>I<^/(^ -MC3E]S+C:D5]@BPBPE5'9*%$<,1RAWN\JL_`(U@)0?TIVLSCL*FCX"R\ICH4* -MLJ[WO(\V!5Q#;R%-``V;*:)9:ZV,12:7:S(S.P.$2`@!<`0``7`$```(```!%``%83XD``$`1 -M``#`J`$!P*@!`@'T`?0!1`:(.0%7;;=13Z7.5BYQHCP -MK9-E02']@FG@1=F!1TY,N`RQKTLZ'/6UW"(E/$9)>7L,H]0P]"O:S++OO[I>N!!AO+6F@@SEMO%V0.3*-M+B,( -M]CRJ=M^I%EI\N7$%`XB)4,OO6T$,'!%O0%RQ$IWGR!'B'&/6##.H.E=/?\!' -M'_!,DGDFHND<;$$?#_1#.`3OJT<2MT8-N0(`?````'P````"````10``>$^* -M``!`$0``P*@!`<"H`0(!]`'T`&0&2=)'@'LU[SF',7:!*F?#VR4N("4(```` -M`````%PJ``!`1\"T%B?IR2+$1K\-!0AA9%AOLSQM5F^(U!I.XI[<((;21V]5 -MZ`,)^<7^*AR`27?M\G/D4O4D3RGH=E241Q*W1E+$`@!L````;`````(```!% -M``!H3XL``$`1``#`J`$!P*@!`@'T`?0`5`8YTD>`>S7O.81X[&3;R+#K5MF\YAS%V@2IGP]LE+B`E(`````$```!,````,-E\.A2HEDP7 -MP4CVJR]2!X;R$F>Y/._Z[GT/&Y>R48`&XC5#/"(``'@```!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``WAS*PR,8`>1)$0WTG#:TH"AB:;3=?L6$X)JLT2?5 -M$C)6Y*(.<+`&>Y,7)T$M.MUQ&9&2';<.J!?;^HH -MO8)0,/EO.0,I```D)Q=6#>XAG8N7==#:*`9M,&LP$,7Q:S&(R60I -M```<``!`!#N6^]*3AM[\O=#$$T9"=VW;:V%6````'```0`5Y#K0&E5XKWT-Q -MGD@]\I)U#ZE#R4<2MT;IZ0,`7````%P````"````10``6$^/``!`$0``P*@! -M`<"H`0(!]`'T`$0&*?_Q@%W'?56^```````````I("(@`````````#P````@ -M``!`!@````%?P/IS3F)H-^X0+CT,YKW'=&P2J4<2MT9R^0,`N`$``+@!```" -M````10`!M$^0``!`$0``P*@!`<"H`0(!]`'T`:`'A?_Q@%W'?56^```````` -M```I("((`````````9@A```@``!`!@````%?P/IS3F)H-^X0+CT,YKW'=&P2 -MJ2(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``WAS*PR,8 -M`>1)$0WTG#:TH"AB:;3=?L6$X)JLT2?5$C)6Y*( -M.<+`&>Y,7)T$M.MUQ&9&2';<.J!?;^HHO8)0,/EO.0,I```D)Q=6#>XAG8N7 -M==#:*`9M,&LP$,7Q:S&(R60I```<``!`!#N6^]*3AM[\O=#$$T9" -M=VW;:V%6````'```0`5Y#K0&E5XKWT-QGD@]\I)U#ZE#R4<2MT:M'@0`4`$` -M`%`!```"````10`!3$^1``!`$0``P*@!`<"H`0(!]`'T`3@''?_Q@%W'?56^ -M#VSW76'>Y.`U.3.O -MDD&E^>0C',=>]#RT5*N6$ECZ.%)K'X)'Q$K_"'\W=;S[M`#4/8"\VUH-DO=4 -M8F+O&,%&MZ(I\77X.HUVZ -MP=-#0WM*27E -M4BCK4]*CV)+2J#?N2O"L]:,%@"9DC$Q9IV7&;_2$+7EG8&(T9BC[V"?4X^P( -MKY\?WBJP09E1/_.QZ$12SMJ@":5[.%ZV:EH;5[_0-,?]J=>^@4IR>5&DB>'9 -M6$<3$KYDR<3T@':K'*Q237F"5;(\Z6(;(7/;(D-1Y.Y.PF.)FV%1-0W"V&=_Z),>MD5[E_#`<-0ZOE,O7X2>Q)&JWT+C4/Q`&D:R -M9/W;./J&5[[5?/!B%S8$O`AMQ^$L0+/XLQ[=63F%SAQ>/&1T5?+K&Q> -M&K8*.A)TJI`++=T31\L$<$VY?Y.F)M.U_H^>B$.RI18+!A*U`45H%,1?XI&;6(-_.YWU;+KV@\!A^3V'K -MBCK.YZQN(3,U!F;OM+KO8\6:P)I/N,9^'^:N14"H\C,@(!==:'3'6/V^8]DS -MB@JX53,VRH!IY^:*SORKODO0V(M#MRFM,3W)97K),=DH]E1XM<>E0S -MP1JE$L*B1#&5<\6ZXC;OB@_QODP-21+`L*1]]V(58+L-0/QNW>,K55U^)X]! -M:AE'$K=&K)D$`&P```!L`````@```$4``&A/E@``0!$``,"H`0'`J`$"`?0! -M]`!4!CG_\8!=QWU5O@]L]UUAWN3G+B`D(`````(```!,*0``,+OOH.SOARIR -MN#Y8$!TH;U[T^P%Q('[DWOJ;B3?)V<.-@K">D)M@[0&7GP\C1Q*W1DBU!`!L -M````;`````(```!%``!H3Y<``$`1``#`J`$!P*@!`@'T`?0`5`8Y__&`7<=] -M5;X/;/==8=[DYRX@)"`````#````3"D``#!^UH,\557,"X9U>#8[U:.8=XU@ -MVY.-;&([%_[Q)P=J)IQO^\/'41XTH"8) -MWWT^R'%;>2SL*`HCNW@GC;J!3,[>,Y=Q*6>;3@M8P'^[$0*7\N!.]S7"*[GP -M0-+RLW8;LK!_QT23^#]X4%&F#2CPMO/\P>'D8 -M9P0=-W.H7`3RVM#OY:"VE2SDNFIY@NPLE>T_H<,@]N>_$UB/RLH]]GG6&6!R -M+V,9!,V\8C_.R)X"0-`S"M_:HCGTC;<'&'HA9_I[[AG1O'-RUVW3Z -M9V*"P3NA>]A83'/E``&I2&"PH9-=)9WQNE,2!;\BMF"NIRKJ]V+AZ=>RFZP7 -M$-@+NY#<#^I%WN2PQ;B?(HT"L.\Y^G2_#KA03S:`CD=NN.Y,#&RQ`<&\=K]T"8(GT@1/._XDBU -MN!/:&$T>%I<>&#E+:?(19,-YE#3^0&`<93>FEY* -MXB#GN!TWYA0Y0-!TJ_OX:=M'P<$CS)4#LJC3$<)E%"7=@]C-A#IW1III<-'> -MW!:-#ZWU1,W"N5H6>N6&H5ANBFYCDG4#0"BMDLN!.U/02H++%`(4D^BKSP8= -MV9:C^:P#N:EN+L&0LBB.[(+FH<)?(/I`8`G?=\T5FQ\#'Z#@:B\GR[:!F?+I`K>Y)WWR_\N -M\$C/>\3*WCED[0&!M.RN"E`-'&[&!$[]C$UKP>J8Y;DC_+:!HQ4"8/:2KIU^ -M^XMCD9R&3Z$!V/UW)?Y?IRB/2]>@/&#IBCL!_;Q>':`N%(^]F1"SW5Q`#,T_ -M985J(4"QRTZG^1CC1QSH.EGZ]#7]N'M\OE/X^Q9[,5\"+)>#1Q*W1G8M!0`\ -M`0``/`$```(```!%``$X3YX``$`1``#`J`$!P*@!`@'T`?0!)`<)__&`7<=] -M5;X/;/==8=[DYRX@)`@````&```!'"$``0`:J#/\JI9JLO?%KV'ZUPW%Z8`2 -MLAQ<_^$!>3^QGLO4$@"E"B`OSH`B+HPA4K--_Q_V[\8\LP9(I4?LZ[N8V -MGI$'E.$1W^Q!%@*),@/N`T)HOO3:I\(6/;VN2YZ\=]>0M^8V<=^K(E#M`^(/,G94:?4D8@VB&)+X0%#`6&3G3T6?GL0G@=;F)%I,<' -MZA.B0L6&D"7W6Y*Y+P)S0,"@199;+VO5_1>MPOXJOHQT!A-A8:O/._)F.I*E$0> -MY]H?T[$I6?>4+;R+:8#=XSW6+V[SE9$E`4```#-V\%_`8G)6$.]'$K=&QT@% -M`.P```#L`````@```$4``.A/H```0!$``,"H`0'`J`$"`?0!]`#4!KG_\8!= -MQWU5O@]L]UUAWN3G+B`D(`````8```#,(0``L#KIS_*FTPJ:^P="!85X8,Y$ -MXK)'"9"5](.2S -MBTY66&]YN;WRSFI](+T\G%\:@EV>HFIDK`FCT2O3#%QS81%^Y//O\$%>Q)+# -M7X$#EO,S(EDIDA0(9ZB@GV=*T9PJI%',!A!V_O[>J?SVS-9I6%'W-6.Z;IQ6 -MX7YA/>CE51?@]8O78JJD>X]4R:Y'$K=&S6H%`.P```#L`````@```$4``.A/ -MH0``0!$``,"H`0'`J`$"`?0!]`#4!KG_\8!=QWU5O@]L]UUAWN3G+B`D(``` -M``<```#,(0``L(L(-5$9@+!U$RX9XJS9#1UNPV:A6P*HKB&`=#KX$[C@8I1C -MB^R`*Z3[K-M0P?)Q8:S-+JV?^-;RKBKC)FX2!64UIZ5=&7L0/%K>10K0>)KN -MH'!P7@V5Y)RJJ/_??6P!.)E:/HI/Y\6YZ\L?'[VMH]Y]TP3)O3APD`4W'B*7 -M%)R,5-`*6RYAH3P.31*V[;TC<83;'B-RD2I7?[YNPE4]_TDA,@+>T4SM],#G -M]K-'$K=&U)$%`(P!``",`0```@```$4``8A/HP``0!$``,"H`0'`J`$"`?0! -M]`%T!UG_\8!=QWU5O@]L]UUAWN3G+B`D"`````@```%L(0`!4$OAM6^Z,3EP -MWW>0"USF&T"N!@9K[Y(R4`VZ,#+?-_`>;S)Q\81B1A``/'A.Y-U"VDK36X@GGQV#*:[/?OGUFJJER_(\P5>5YBR7-! -M/5MWK*K0BW]>7$8:/L6GX'"9H]P']`/6Z`"+6$;O;F,UX/WP7>G7F4W=#TK; -M3SNSET3AJ;CJUB8(H7OA<."Q>'%N)4_/MQK8TBHZ+%I<$2A$<.F%BDVANVPIUWQN&30(?@HD8;KN@,@S^^ -M[?!XOU6E%BG$5ZNU@*H[5,+QPN40JNA65QV>_^8=HX6YG]7._S!D4ZK -M=4'/[AF`WESBBKHIZ2`G0>Y3+(@AI'X49^[['.F,P_%LV>ED>$G./N#_QABU -MZ(_&8?B2P]4'(0('X)K]+Q\%,HOACZB3(Z-A=>IDUK"YD7`SMT,.S`P_J006 -MJ5JV3I9+GZOLD,N/W6`/>8ETIE^0[>G3L!>Q=37"_UTEV9F?RZ=Q\9@=GZ<1\N"8,P?XR-#>`Z'+I#\T"=0P&8@5,B!Y8S;;-$,T9[7 -M:X"=QCG7S=U%3G]TVD<2MT9Q[@4`?````'P````"````10``>$^E``!`$0`` -MP*@!`<"H`0(!]`'T`&0&2581Y&":[.VBX8;6B0-ADG,N("4(`````````%PJ -M``!`"'+I4KXO7;X"L$[8L%LX?\O[FZ`_@CA="LN#<"^B@^,7JC:K!B$Z>910 -M*]^7)KL,#D\<3DXE^6`8:Z55'I+[D<2MT:%"`8`;````&P````"````10``:$^G``!`$0``P*@!`<"H -M`0(!]`'T`%0&.581Y&":[.VBX8;6B0-ADG,N("4(`````0```$PJ```PRW`- -M[0[`S<]WT`'';^QHGTX@2-N_;%,TQR5,*F)VY8GD)607U*1\];":75!'$K=& -M?Q4&`&P```!L`````@```$4``&A/J```0!$``,"H`0'`J`$"`?0!]`!4!CE6 -M$>1@FNSMHN&&UHD#89)S+B`E(`````$```!,````,"I=LXG4W;![QAI@HYSI -M=8XZNHKGB^_J'EMKT].+X4W:H]@N=TBQ"1Q*W1C<0!P"8`0``F`$` -M``(```!%``&43ZD``$`1``#`J`$!P*@!`@'T`?0!@`=ETM01!]CK5K(````` -M`````"$@(@@````````!>"(``'@```!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``-T'Z$_YD>>>@ZY$,""4YI^9[GPD07HPZ:R1Z6W.8VB -M++;&9]UL@(TA%H^I9_( -M3&),QU<.O`?FB'-,G:QF/OFXP_/7+9(>^_?@YI4"NSJ_':^K<"N>8)VM:8]> -M1N4I```D+NW')+67E+8NGG)0Q6>S-IS(X@8E9)T7U&\V=]"2K3PI```<``!` -M!+I8,L6&"TLM@)^2B6/90:AA9_]7````'```0`5.]&2)66AF9Y/O*"\I)!Y^ -MKF]2@4<2MT;-'@<`7````%P````"````10``6$^J``!`$0``P*@!`<"H`0(! -M]`'T`$0&*=+4$0?8ZU:R```````````I("(@`````````#P````@``!`!@`` -M``$4>>@ZY$,""4YI^9[GPD07HPZ:R1Z6W.8VB++;&9]UL@(TA%H^I9_(3&),QU<.O`?FB'-,G:QF/OFXP_/7 -M+9(>^_?@YI4"NSJ_':^K<"N>8)VM:8]>1N4I```D+NW')+67E+8NGG)0Q6>S -M-IS(X@8E9)T7U&\V=]"2K3PI```<``!`!+I8,L6&"TLM@)^2B6/90:AA9_]7 -M````'```0`5.]&2)66AF9Y/O*"\I)!Y^KF]2@4<2MT8J5`<`4`$``%`!```" -M````10`!3$^L``!`$0``P*@!`<"H`0(!]`'T`3@''=+4$0?8ZU:RXH)/_FD7 -M#FTA("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@`` -M`@,```@#```"````"`0```(H``"(``(``#3*W($W0*LT1TB]E"HKCK\K4Y;8 -M7W,SKV+S:Y:A"8>C1>J^#`U4B#V.)P'9^ER)+[D&O)FBXP%\>V6?<9OSQ?;" -M^0]VGZ*9X+%V.OD$'K77()H;,8VC.1BG\/^?7>)WU*LYUS<"3NLV*0``)*<%OZW\\IP5AG=*^GFS_?+F^/Y4O%!4 -M1LFR+SU%KANO*0``'```0`1:4;5&*7G$.)%YXZ+'W@._B>*/[````!P``$`% -M\]LD(%0P%`I;V3(6I%UQ9@V'G,A'$K=&P(`'``P!```,`0```@```$4``0A/ -MK0``0!$``,"H`0'`J`$"`?0!]`#T!]G2U!$'V.M6LN*"3_YI%PYM+B`C"``` -M``$```#L(P``T(U5>YCD-I7``"K#Y+A%G._8F)U(4C5;V,3/?'B;@'U1PJ/# -M*(4JEW9Y.-E)$6MD$(N\67#F##`LCHOCZ0-F<^591:[7Y1?M'OG$PP3IB+;X -M5'&=E"S2LE/S#J;M\'55(A4;1P-^"BE=D6,<((M;WU3B3H\Y>]L/?B3`77'U -M=B$^Z,]IVX.ZAVB'`T[&-<\4MESR?6"874'=Z,E0L5%LAF5K!/CM<'=X<:44 -M)H340T/^(=+$]SB^69QG!&0V]15J?!B`O%9J*>)R$\D0Y4<2MT8UF@<`O``` -M`+P````"````10``N$^N``!`$0``P*@!`<"H`0(!]`'T`*0&B=+4$0?8ZU:R -MXH)/_FD7#FTN(",@`````0```)PD``"`Z\,)F.8VUC?,LBR]7S*`-+&1AE1) -M=6@E8G,JWIA!Q1(<@C_DC#:)P?(OX1@[A*Y2'U8>!J;AYV\V!OEN+`-XKT]0 -M\9%]([?['ZVZB.I#5^+JZ$*%UC?J033?4]9=LN(`T='/M`SZIOO?=H;.'X[U -MFMV\@B$"M0OCLZ%F^T<2MT9VN`<`'`$``!P!```"````10`!&$^O``!`$0`` -MP*@!`<"H`0(!]`'T`00'Z=+4$0?8ZU:RXH)/_FD7#FTN("0(`````@```/PA -M``#@>3.,!,L+`$N-I,F'<9CS]CFXF=%GX=5?KXLA6$*!M`)^,"Q"3QFFN7T?03 -M#KWX%DY>>=`DYV/5VX%W6)K<;$=%D*3$]N(K"K_.CW(GAJI8`H'QP_K=A2,C -M+8[C4*+86Z]HU]D*)^F09OY'3GI1VWL,Z)5.U`RUR=FBQXH,6ZR(A&D4*])` -M,]?%(&,1'%#E,)@;MOQO,-"7,&KO#WM%^.(;G(;EC26@)+?5VI!VVW/42T<2 -MMT9QPP<`_````/P````"````10``^$^P``!`$0``P*@!`<"H`0(!]`'T`.0& -MR=+4$0?8ZU:RXH)/_FD7#FTN("0(`````P```-PA``#`9`X!6W4NBT"W8+E] -M,=D@@'$[SU"LE_>W(P/ -M"&IQ(XG!+4[GL[73!N"04K=?RW'-B@:GZ`/:?QP[[9/:,>J6AA,0=)AQ.^W) -MI](N2H'3\RK9H-H^USEZ"U!K"72J<]=46N!9@\_SY?4XNC(_RO_76N[2UZ[J($0PZO11]"1:GF#N1Q*W1D?J!P!L````;``` -M``(```!%``!H3[(``$`1``#`J`$!P*@!`@'T`?0`5`8YTM01!]CK5K+B@D_^ -M:1<.;2X@)"`````#````3"D``#!^"#=-[%FKLT1UA&*V#@B[C9Y(&422P+(; -M<6S)C&_34O5N^8)J1O^$^W989T<2MT:\!`@`/`$``#P!```"````10`!.$^S -M``!`$0``P*@!`<"H`0(!]`'T`20'"=+4$0?8ZU:RXH)/_FD7#FTN("0(```` -M!````1PA``$`%C%]A9%N_)=M+=%:!.`ZI>)F%6T`?>9Y+X8V8L$K6QH`5$$( -MU;-RHA6%^&#K...4M;.JLXI_]<:O"LWCQJR)LGH+[!VV?):MOE;R8#F3NYM8 -M/]"11G[G[C3#R4U"PP:O\Y.N`VH:PT[J#%3"H9--*F?JH=AD:^8.?-?-./_] -M_A`V'O'0?(4#H,60"T1BR!^3C@EUL*B-B6LW49WM4'TCU6>0KD_ZE783#85U -MB92H%"%+QB171T[])WDOGMJ*PJ<;1CEC'G$AL]([ECL4V34HK1Q*W1L@0"``< -M`0``'`$```(```!%``$83[4``$`1``#`J`$!P*@!`@'T`?0!!`?ITM01!]CK -M5K+B@D_^:1<.;2X@)`@````%````_"$``.""A7\9TWID*6EL#OXL-^$RX\1X -M'/&*HZO^7\&ZF8$S6\8!?#(#G]6:9K\1G#R?%);@'/EJ-806'?0G%-Y(XOI]1U&0D[IX3N,#]5D%".!DS1BWZ3JU+!L& -M`Q:DWF=!/LWTER%CJ@@YX#FJ.Q30'<@@N!;H'\E4UIX`.VY6TV(^>E_RA?F! -M0G,>`^C6X/>12&E0D+'O%J99KL?S[;&-(4`IB4L'3.TWQI-+S0*8EZ2T0LSB -MM^IV0A0W2KPW]6YCR^AX=2)&P&TA1Q*W1DD@"`#L````[`````(```!%``#H -M3[8``$`1``#`J`$!P*@!`@'T`?0`U`:YTM01!]CK5K+B@D_^:1<.;2X@)"`` -M```$````S"$``+`!U+0D9]QM@,NU-1=)]!&V:,]K,[A:O%E>,]:SX<0,73Z_ -M;R.@7FA$-@TP^?<89I8R$"AK><8:R-+52L_D55T-\66!X$EDLX/#Y\L8W[,Q -MA^Q'M3*RE"*<>*50,)[P22.6BCI#>D6=G2IX,RS54/5J\K]JR]/W4=P[N-;R -MXU9M)51U?]1I1./+[:%1`+M+W]=H^#+1:0H<(LL9_U^;WBL60^!X3&)XG[.B8!E<.L8+I,WB5FHI&;VPH'[="8D973*!H-=?^X(:>__LB]%D -MIRFU,Q-_D(@RYM%]<<.\QMF^VI5:)'#R23#WF5:3U>I0\&F;V=C(G!'_#?H# -M,=-G*'SO[JP9I,B/.?`_;A^9W."I6UXF$[UC9E^_LI\K_51S(!K)XP19T#F. -M*9']B6-JZMCUXR?B?!--T0HY)::KK-0X9I:"!BV11Q*W1OE?"``\`0``/`$` -M``(```!%``$X3[@``$`1``#`J`$!P*@!`@'T`?0!)`<)TM01!]CK5K+B@D_^ -M:1<.;2X@)`@````&```!'"$``0#.:NO8I^(E+HI+JGI$/@C:QY8_=6$'`R=+ -M-3+2:V+\'O?4O/G[FED\:T-9F+$'8[3U"Y$:_;DB).[BX?YR=TX>^J.,;5/8 -M^A4$5&OB\MQ_^?"EIZG?!.O -MBABQHMF`J,6`P!+H((N'EC>Z1O/F8%7]7=B_F+_\71HK`(L>)7^EC.E-5:IPK\$+,D+'7^T')?)-*20`DM4RM5[`KNAYZ42!?0FU7OH_&A_?'[T!S!WUDK$8 -M%@\E[^,I8V&3>AO*H";=^`H"I&Y&.9:X$<8#Y<,UT\`YQ[7BL/Q\ -M!V@F!I&1GE11!]'2P>I'$K=&_)P(`.P```#L`````@```$4``.A/NP``0!$` -M`,"H`0'`J`$"`?0!]`#4!KG2U!$'V.M6LN*"3_YI%PYM+B`D(`````<```#, -M(0``L%@QM1KV8?\GY["E:KIKF0/Z(KO/#Q`_IE@#X-[1LVS^RU:N-=$%V,'' -MZ_P1;>"EKG'\VI'UJ)_!79-XDAQ>2=[Q(;N^;B==[_1?5``]<*DD(/"]K -M2^S]O/Z!XCR,O"4JZ\?B7%SE`1GVBCF9?NK,D3SX\XI9D@BV4)M];[7DY4OW\-`:IN<50..V[=$IPF]D98/7G'\A^8``HQJG0ZP#LDG6T%W:F@>]X/UH; -MV)SB?YD5D$<2MT:P'0D`?````'P````"````10``>$^^``!`$0``P*@!`<"H -M`0(!]`'T`&0&263UABRJ7JNC!?O2T$WMYSDN("4(`````````%PJ``!`P5[O -MU63JZ,%^]+03>WG.2X@)2``````````3``` -M`#`1.=2MVBI^QD\P5)81!TAUGOZ_['0EG*[M>Z7Y7H_M?XH'^&0%+6:AA46R -MRD<2MT:[.0D`;````&P````"````10``:$_```!`$0``P*@!`<"H`0(!]`'T -M`%0&.63UABRJ7JNC!?O2T$WMYSDN("4(`````0```$PJ```P2,Z-OT*`=1'^ -M.1[*=+'/(T,*K&Z_8B!L6::S_/GA,8IOIZ\)E%'SJAODPR5'$K=&"T<)`&P` -M``!L`````@```$4``&A/P0``0!$``,"H`0'`J`$"`?0!]`!4!CED]88LJEZK -MHP7[TM!-[>"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``Q[4Z3Q@MW\-SNQ49,L?K8DIE:6'C>E4EJ+X!$KM08EO+L!V=XQ?C,:WETWR)O6V46[8/2$&RUD=Y/VD0RHI```D -MIG!N'"2FO2,Z?P3-\!C<\GJ"HO-'\XA1&G)V;6,'S9\I```<``!`!-DF"-JA -M>H&;S[)98"N)D;K;N4,&````'```0`489ZO*U74WX?Z`!P;8)U=K]Q[%4<2MT;"8`H`N`$``+@!```"````10`!M$_$``!` -M$0``P*@!`<"H`0(!]`'T`:`'A33E1[*A]'U)```````````I("((```````` -M`9@A```@``!`!@````%E;\H`<[DF>X?Z`!P;8)U=K]Q[%2(``'@```!T`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``Q[4Z3Q@MW\-SNQ49,L?K8DIE -M:6'C>E4EJ+X!$KM08EO+L!V=XQ?C,:W -METWR)O6V46[8/2$&RUD=Y/VD0RHI```DIG!N'"2FO2,Z?P3-\!C<\GJ"HO-' -M\XA1&G)V;6,'S9\I```<``!`!-DF"-JA>H&;S[)98"N)D;K;N4,&````'``` -M0`489ZO*U74WNR%CH!VQ$A("(@ -M`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@# -M```"````"`0```(H``"(``(``(G7&MN,QI+"'FIGLC?YN\W[_K,CJS2P9K'F -MF%F.2<#'B+0M\A%2*4GA$(3@8_&C#>?Z/-NEXB!*"^OERX%6I"8NTE!Y$28E -M#?3$S?!];3@M_(%/;MUB?3`-T':E`QTYB%:&G\FXBJ[;70Y5V\:/82J`T&>B -M!I!N&67J=R-F1T\F*0``)/EQ'I4>LQ0T?_IDF]H4ASFOVAM7OR0S#Q[VXJ97 -M,8@Q*0``'```0`21>4)C>>M*@U?TZ>(:MB.`DN?LI````!P``$`%R:RH?1]2:'KLA8Z`=L1+B`C"`````$```#L -M(P``T!YM1V8,8OY0W,CL7*T'5[R5!(1ZKV*TQ]=1073&=E(P\^$]'A-DQV#/ -MV(6MJ3J*&P$D:8$8%O:KM_RW9:8ACM+?%TO@DC@)E?37MPY\G7R -M4A8'&:.5GM\32BIF9CS^%]5DT<2MT;8S0H`O````+P````" -M````10``N$_'``!`$0``P*@!`<"H`0(!]`'T`*0&B33E1[*A]'U)H>NR%CH! -MVQ$N(",@`````0```)PD``"`;S!$FUUL+O5M@A3Z_5=5$^L+UF2C/,5)9&;Q -M&>13.*S,U(Z(L@_I(^7`4KGXLFW)4-4<8(FI,RNUIAO<+9G2D0N=9GH>0^PK -MM/8K<4ACW76E1J=R.>K),*^/_7+^O;TB5MKIH&7>\[*'*%-[C!PS90D`.2'& -MD\/M4RVNH$<2MT84[`H`'`$``!P!```"````10`!&$_(``!`$0``P*@!`<"H -M`0(!]`'T`00'Z33E1[*A]'U)H>NR%CH!VQ$N("0(`````@```/PA``#@5@C[ -M/RHW09+T'VW^J=U-.BTBY3B!>,U&WO"M%1/(9ZQOSZ96?R6N3UB7$J]`NZK6 -M'RPG&/>\BXR87.KUFBJ\$6EJD?LV[;F`8AVBX_X"AO6HW(Q"];S#JP,GR64\ -MV8-EN616\-K9KS)&N5M.L.V(C.3ED/> -MNT%P%`[J`W?-#"/Z:X-=`0P0/J5K#B#JG.62**5.'&:EUK0 -M%6]JCJSF#"?)W+-7+!O2+;$'>I:<^'D<]5@);AALW4)""%JS4$<2MT8B]PH` -M_````/P````"````10``^$_)``!`$0``P*@!`<"H`0(!]`'T`.0&R33E1[*A -M]'U)H>NR%CH!VQ$N("0(`````P```-PA``#`40YKDT(:O%FY/@5/C^$4D]EM -MIY?.^`GTP*>EXCNU>(H>WK"M6MA$Q71RZ"9<\QWF#\6\2WOC(?L*>>H5Q9IO -ME#ZU6,I_(;0+G;^9$ZU1?./AU'"K'[2_7$WR3MO<]_?B;0.4[(:;C]?YRH?1] -M2:'KLA8Z`=L1+B`D(`````(```!,*0``,-^<#OI/NR%CH!VQ$N("0(````!````1PA -M``$`@H;=ZLQ(S$?M'U@<_&&LH8L$EO^9DK'+FY\6T108;@>,`U-AGK616;<) -M(Z>7>#,EB;%;P8I*KEED;-R"'0$EKR0S_[O[NO[(KE/+WF,2&RH]VOY+>;*X -M5$I#\0QS^YG97[\#%N41^.(\_<4@@2W-'.:)>F'[2^XV$%\Q_;C`%\`>P5QM -M9IM\8W=M'9L]9M=?^Y5LFG\L#U;S@J('1C4P7I-&K;>+,B37]"LSK@]W(DE) -ME<$A^2,.%*UQ]K:+V]MT#O):_B!F1.1'CEX&@/&GLU"PV]F(MCIAK=T7NI)L -MU*,G.*X]R"%?5D+Q&^\V4_BF**^<&;SVAOO4)HC91Q*W1D]$"P`<`0``'`$` -M``(```!%``$83\X``$`1``#`J`$!P*@!`@'T`?0!!`?I-.5'LJ'T?4FAZ[(6 -M.@';$2X@)`@````%````_"$``.#$D&IQD@!?^6,W`!\$(P5X1?:\@;8DC?:7 -M5,IMWQ0:RV$$529GKF^3+CKM5EUMVFUGH$$V3$D$E?[J/H!IN%1_Q\/N$G#X1T`HOU=* -MQP&)@\WVO71FX2%A]I6$1Q*W1@Y4"P#L````[`````(```!%``#H3\\``$`1 -M``#`J`$!P*@!`@'T`?0`U`:Y-.5'LJ'T?4FAZ[(6.@';$2X@)"`````$```` -MS"$``+"'5DX=>/!F[2>`)]UW0>W.:VU\H& -MT[5(VP;9%RH$LK-TL6Y-Q=P4MNA:()(Y^2%/B)"H&@[?J@L'=!+ZGQQ'(?;?&;$R/B -MC#'_1("(`V)BHPBDC,RZ^[L^+D!7;:@*]':<:J#>H0Z):!`63`=[0(651Q*W -M1E1V"P#L````[`````(```!%``#H3]```$`1``#`J`$!P*@!`@'T`?0`U`:Y -M-.5'LJ'T?4FAZ[(6.@';$2X@)"`````%````S"$``+!F;S9':>L(-C2K#`E$ -M/QAXQ:6M6QR6G7^13'6R[M@2HK,8M?[)'KCH!:DY+0)RA`CQJD#O#XC)MPST#%]RC;$_0O+JW*@!DQZO2ULR%%U%`83 -MH%4&8T,>;B`$\1U<8F4\YB/:<7NBLW/7_1P6%J>,J"P*:K[6$$=LF\M49$XE -M:A*M(3)E`HZ.HW]3FD>3(Z3O)`14(!L=1Q*W1A&3"P`\`0``/`$```(```!% -M``$X3]$``$`1``#`J`$!P*@!`@'T`?0!)`<)-.5'LJ'T?4FAZ[(6.@';$2X@ -M)`@````&```!'"$``0`)^@?(C#7GVK+%`>;AXN')@8M,S/$/G7EJ)7FPDY\O -M7:_6R],QGL;;+SK`B6=G.6E\#;.N[G`\<9*,6S%2Z*6L1882J45]][EF.TBE -MH+6S^Z7,.'HX!OA4,_FG+UJS2<^5L@5O4E*8+"BLR`QOY(NZ17!VO+TQ4Y[C-N[?..A=?M]+* -M--JI4I4JH]!QQRT"ELXRVY+5Y3?/TR#8PMI3V[+C!RS8_0&;?G6X(,-&RVI=LSS-X)+701L=E'$K=& -M,Y\+`!P!```<`0```@```$4``1A/T@``0!$``,"H`0'`J`$"`?0!]`$$!^DT -MY4>RH?1]2:'KLA8Z`=L1+B`D"`````<```#\(0``X)24F2H$6;JSD276`H2N -M@A"*-K%?6?EZA9*`S53U=*R\@V[9)&X8%2_+SB6C)C*,2!O`FK5(9EG$8\L( -MRI;[)`,4>P^$PH12Z#H\AHIR^:1P4GNT0NA&OMERMYM*.KB5PE]C5=3>$K[? -M-81A":_;^;R"WH>U/\\&Y""9+R\(8V^5*5V_=$Q&T?^2 -MHFIT]N8%AO"RH?1]2:'KLA8Z`=L1 -M+B`D(`````8```#,(0``L/B&5\PI;W"ZTBY3@`F(W6UE1W"A>C*1CM?X:'KZ -MR/[J/WZJ?I==@N=D#\`HX]@PDC<&@+/HW,W?SQ+^Y!YE,>HG"F=;M]FIZX=1@:'*;V^=V`SQZY&!7UFP20I#\[EN! -M^CPPI'QY?X='$K=&!](+`.P```#L`````@```$4``.A/U```0!$``,"H`0'` -MJ`$"`?0!]`#4!KDTY4>RH?1]2:'KLA8Z`=L1+B`D(`````<```#,(0``L`73 -M:262%6E8,\BA^O*@LTU*(`D"Y&EW>=@1%#<\$GND":C.P"O#(4*3C%4E`9/^ -MVS_;@/45N$;6O:<,Y`"$21^F!L%=WP -M,23$L>/3$ -MG*T)Y+4/!L1J!OB/B7LD'XBY4.M'!01W`,A9I/?)[/@ICLI'$K=&;O@+`(P! -M``",`0```@```$4``8A/U0``0!$``,"H`0'`J`$"`?0!]`%T!UDTY4>RH?1] -M2:'KLA8Z`=L1+B`D"`````@```%L(0`!4)48%K;J(,[\\(IPUBAGE,F/""^% -MR%()\U#3@#J"*@+D<=_F$AK+65+0Y#D0TA`#Q61*V:GU%U: -M75TF'M*5#^;:BE^[W09:>/S&)].BSS`5B1ENQ\#IG;_2MVLI1J_5%)=KUL#^ -MBRF9^/2_0&"T^^0%5I3:6`+*Z#8AFV)T:S"]'U&7]=]?V -M4;'SB.*=Q(<%'DGRJ[;%2-<(LY=ON,V'J`*2-V[^$1W6>]R7;ZAWU)J61"TQ -M,*\4`IR*\/^MMXUB+CO@)H0WS7J"U7Z<:8M*>CM%%PWG7/B<4`*EG8L`JDR)-2HSYC5K@:'APAR_>@(A\)6QULS+;AP6JU(Y_? -MZG/EO3C]5W-0C0'&UWZ_/9_PM=".5;WPQ>J+\*=#EH)AR#KQ>RJI#C$F[[; -M]LLB/>+5R# -M[$L@<`07P9Y*D:=Y<.7DG*\?F%X-&+[AY)Z3+P;;7=:YXU$H[3/I!\A"5V1[ -MD[Q%4CL=CI\>_]91%C1F?-X[) -M\Z&01$_7``!`$0``P*@!`<"H`0(!]`'T -M`&0&28YXYH'.NYVF37-N@5AH3@DN("4(`````````%PJ``!`R()!V[=R^TD4 -M#TZ-,>+VO.AKCKX1IVD`-DAWL5VVJ@F,S^GY$C=>PQ'+C48!BRA.X3N0.JJ@ -M#I6I,VF*1Q*W1D]>#`!L````;`````(```!%``!H3]@``$`1``#`J`$!P*@! -M`@'T`?0`5`8YCGCF@PM'4,DEC*)R4X6ZFY,@3G+5M6'>_L-Y/6_S>!@6"]P),6.*'KD<2MT;; -M;`P`;````&P````"````10``:$_9``!`$0``P*@!`<"H`0(!]`'T`%0&.8YX -MYH'.NYVF37-N@5AH3@DN("4(`````0```$PJ```P):FB:BHPIY[*%!64(3A. -ME*;>D2_ZFOGEA%C@8"4.WX.39R7&"Y-A0XX+VO9'$K=&(WL,`&P```!L```` -M`@```$4``&A/V@``0!$``,"H`0'`J`$"`?0!]`!4!CF.>.:!SKN=IDUS;H%8 -M:$X)+B`E(`````$```!,````,([$P79Q7#`"+HL\4V)]H`!3DR"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``L6O= -MXD_NO<:C>RRQOW!9"NCM&SN&>QZ&U*X7[%< -M9FO(T/%W&1NNE-U;T.O!,[P')#=EE5?T.%PA'3/%QN>AKCTI```D3@7&I)#H -M;)FQB$`DXNX&ENO[1?S$9,,OSS_/"#>0&;LI```<``!`!!QOV4Y/Y_N!,R0_ -M^?.R(!S3Y5XY````'```0`6[^DR'3::;'M^'.E68MKG)?*#D-$<2MT;?A`T` -M7````%P````"````10``6$_<``!`$0``P*@!`<"H`0(!]`'T`$0&*2>4CSQ! -M.,QT```````````I("(@`````````#P````@``!`!@````'#K\T[7@?0W#3I -M)=02=--MHB\(]T<2MT:LE`T`N`$``+@!```"````10`!M$_=``!`$0``P*@! -M`<"H`0(!]`'T`:`'A2>4CSQ!.,QT```````````I("((`````````9@A```@ -M``!`!@````'#K\T[7@?0W#3I)=02=--MHB\(]R(``'@```!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``L6O=XD_NO<:C>RRQOW!9"NCM&SN&>QZ&U*X7[%<9FO(T/%W&1NNE-U;T.O!,[P')#=E -ME5?T.%PA'3/%QN>AKCTI```D3@7&I)#H;)FQB$`DXNX&ENO[1?S$9,,OSS_/ -M"#>0&;LI```<``!`!!QOV4Y/Y_N!,R0_^?.R(!S3Y5XY````'```0`6[^DR' -M3::;'M^'.E68MKG)?*#D-$<2MT8.N0T`4`$``%`!```"````10`!3$_>``!` -M$0``P*@!`<"H`0(!]`'T`3@''2>4CSQ!.,QTQ_[\SY-)>XDA("(@```````` -M`3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"```` -M"`0```(H``"(``(``"">_96?2VQ.^H6O+<)"-^.5L6)5-YF8*)871I0:2P"2 -MZG1S:O6\6G(:9CFU?B4Q&Z>:C6D:.%+$6=#<*F/;8/(O(3"#K5>WXX8645H4 -M;8#.:WWN-3,!L)$)LB!O437Z\M)=L<<@;[99D_A+C>SZ)\Z(W]$%E -MN&6OVUU[*0``)*/E![/H&IN`.!8LB4BD+C6FH3)(U)A4>B;K..RG:4DL*0`` -M'```0`1""OQ#/@V!T@X7Y35?MVT5H.P<]@L!\:9Z1`>FZCFQ\M;"?P3=[9(NPT -M[O$G=3)MVLFUOUX.(I+.5"UG%7G;JE6Y=5,+O1OZP(\I`_C(K%:=K4(`;>`% -MRHF?"G'L;B=?=:B8,&I+R?MK\=AJ$/^1C#:9/+-!:CY-;\;*>QE.6@N<$ -M8(DFAAB[K96`VAT<5S3XQ,S8VC5=YTL!:0YI^YT$4]1)(5E$2%^/K=!#)][> -MS>DON7*?QV=4#9'?:?^,"$H*<$VN;D<2MT;$_@T`O````+P````"````10`` -MN$_@``!`$0``P*@!`<"H`0(!]`'T`*0&B2>4CSQ!.,QTQ_[\SY-)>XDN(",@ -M`````0```)PD``"`^]5>5JU0&'Z*,@<$K2TS7(6H-,`4B6D&T5%W@69M1+67&A\K?JI>)'0G -MXE)^:J#V_YWB$*L5-%04CSQ!.,QTQ_[\SY-)>XDN("0(`````@```/PA``#@;"YFADP#%)PR -M@Q]:D?:?JV[F])BI`PL[6/82NV?]3Z':5_S-(%WV^VJY5W!5\4Z/8!MQ@257 -M3J,]BN(FD",TF_R>?@@];NBQCFQO)#R$RMF!1X=.M>?&%[8K2+NK91??9'A4 -M=^V%"VQ;JN1-N8MG%QNW;\5'%U+>^`!MR#O:!=\D/)NS1^;QEGQIMOX!6"ZP -MCH>[P$29"018XZ8'D)F_$O.Y'=>G<7*Y-^D'^U:-=+`_3_2]B0_[2.:O3.@* -MK%7%X$\M3N"EZ4!2?84,4CSQ!.,QTQ_[\ -MSY-)>XDN("0(`````P```-PA``#`Z?R:'V+2F-;W32`/'X5/3DLT9Q::V4&X -MHLDCMAEO.D2"./5@@JOMBAGF)!ZI&9NV)-J-@PLPUFPSFX!VGG/>:;5!`P!T9O5;#CT@C(I1R=%#CXR9Y1XI".'B?:@ -M/^49W/^-[T18AL2XF>OZH1N3$:I1Q*W1AA1#@!L````;`````(```!%``!H3^8` -M`$`1``#`J`$!P*@!`@'T`?0`5`8Y)Y2//$$XS'3'_OS/DTE[B2X@)"`````# -M````3"D``#"WU5E\]\*I4CSQ!.,QTQ_[\SY-)>XDN("0(````!````1PA``$`G;D0 -MR">-T`.F5X"YH1+UE/]X3O&7233[7_Q0[-R?F#S -MO62641O4D*SZ@Z2"R.,?:-H5H)K322)R]Q40R(&4'A-SS#]">KY&$JR5&QHBZ=[N8J -MR`WT7=E$,&1A1)16)$(XALJV49X.`-M!1Q*W1IQW#@`<`0``'`$```(```!% -M``$83^@``$`1``#`J`$!P*@!`@'T`?0!!`?I)Y2//$$XS'3'_OS/DTE[B2X@ -M)`@````%````_"$``.#L]*]YEDQMR`LYG'[T]&N?:&68['=P4?03RI928VKE -M@569>T!WW^TCZ:5_0!?+*NG3"F;L'T(*K6Y/"F7>BH?E\P!#(4G*-MH\F*ZC -M>AROY87?WLW#)@)'F4GQ.Y1$OJ#@;\X?7?G&<`&]"GWHP2#\^E532Z4K;LN0 -M,JZCU,]/+-&.DOW1KGZO@CS+,R7$"!?4&%$*G9V$*#1 -MT6-#953G:/(D1Q*W1D6'#@#L````[`````(```!%``#H3^D``$`1``#`J`$! -MP*@!`@'T`?0`U`:Y)Y2//$$XS'3'_OS/DTE[B2X@)"`````$````S"$``+`< -M;+\JT.9D&[G$5)538M'XE2U]8L=F#25@])*,)@[-W\L4:.)]^5*"6\)\B8LH#XS@+[9Q(X88-LUUHE76S`^&#=H^20&+4']LR,(2)@/\<9`SW@[>+!WV4 -M>\B0-;2,4T0X5=7V('8V\?S9)Q(9(B'C7BE'W7CK5K16OS3!BEO`, -M2VWKWD;&\);-A-8X9^26ODOK1Q*W1A;'#@`\`0``/`$```(```!%``$X3^L` -M`$`1``#`J`$!P*@!`@'T`?0!)`<))Y2//$$XS'3'_OS/DTE[B2X@)`@````& -M```!'"$``0#M"SRG"-8#B4LD-8$1ZQ`:C'8-QFE9J9*8P22>Z02!^5NS/0=; -M(OL_JE6YFE';)._0?H4E6[6\Y,+\1:R-MU3GQG6!1RYNJ+9:6&8Z)IJW<_ZU -MS`_%-AVXG#+KLLD84;X"O%$5R==@J_=_3+DI"B$H9M)&%TZ0^WL7Z.%U'4W3 -MMA'&I#N-S3WUV8X`$@7[M'$K=&5=(.`!P! -M```<`0```@```$4``1A/[```0!$``,"H`0'`J`$"`?0!]`$$!^DGE(\\03C, -M=,?^_,^327N)+B`D"`````<```#\(0``X#SQ/%D/G!JFXJRR2R[W`-GHR""2 -M@R;ADH-_`9@WIKXSS]7O='B"]Y`5!1;I[80WHEEDL;>LLV&,\R4GO0T72P`L -MF``ZP]8:(*RU$?XH>SK!B,_N;;D";(81+MY;0FEW>16;*RKT(L-G- -M*YX..(&4_[T+!;:L7/C5L^?NQ+6(*[P_18KJYB'[_QR-;2IK^V!2(:IW%REF -MGFMR&D8_(W2<$KFB\9B\9OB>.4T"Q;KU!.\VL+E\\@AM&G\V*RH((M=T";JQ -M!UX^;?9@_<[CR"!,P=A(3M'\@*='$K=&K>(.`.P```#L`````@```$4``.A/ -M[0``0!$``,"H`0'`J`$"`?0!]`#4!KDGE(\\03C,=,?^_,^327N)+B`D(``` -M``8```#,(0``L(H$O'H:KF$YL\^2,9C;8WV7UK';1DV9X!YQ;V9D>O_)]'/] -MQGCNO'![\T%+P'.(1OUW!I+N;*>-W-;Y`@AI:[8L8%!:'7]2?KS'G3\.>K5@ -M?X^%%EV)>ZAWT-IGM^!^8$7P?X@E`JEOE<%E`#RC7K!`QH%._47<[=[#'H/1 -M\*GVPDARL$V=K=OQ_%6L\]3PP5(G-]S@2[#?E"6M7^N&A4+^-ZMZ)MF@[Y`: -ML*)'$K=&N`4/`.P```#L`````@```$4``.A/[@``0!$``,"H`0'`J`$"`?0! -M]`#4!KDGE(\\03C,=,?^_,^327N)+B`D(`````<```#,(0``L"&"$8YX8(W( -MP/L?#:DWAKV[@$"H'^VI=E?V3DQ?)I%!>EJ=+2,Q+Q')>TL>P\`7`M^]17-1 -M:C!.EBHX62D3@!7U_%14*X2\[_YL[@@F^78^(H,P-?.ZRE9R8MBPI],E>Y]8 -MU99AQ7>)`)YC9XH[W.2ZAUJS;R<\2!J/W)26L+O0&_X4WQ]K:N`5,H=KEHQT -M_#A9A>#EFEGCQ%%57U.=F$P7PK]1+*( -MCUD@VG/P;38<%&J5:?:X7W`^/DR.A)X(C@XNB48TYEG)1^3@H+7HQ:)+R&'( -MFN`:-X@T/%L'!3C*S]Z3XIZ*\P?-;1`??&58M*@]Z-AP=1[FB(O+J^R*02H# -M="-)M=XB]0]A>R>Q4Z4H$IU.65N5>5OQUP"TBBK1@N#)X?*:=2F+%DB>QC#@ -MU0!0V9#X=H:T`CO)-*4WTO.L4+1(^>!'903*2^=]\8__!G/GPR.TQ`HZ5Y!'"_;@@("]_(6R0X>6:YW-4?2!*W1F\>``!< -M`0``7`$```(```!%``%83_```$`1``#`J`$!P*@!`@'T`?0!1`X6A'2@ -MOT*_*LW.N&?!P8RXBY5?X90]3R"^J6R@J-U_S2K!WROH?>H,'7>U$<=]##1% -M&H34*?BR'3'F2C'@;#GM'_)F@U- -M^A[JI10`V1\S_I"&(&+!LCD7\H( -M0+YO1G4`:RI=[+_C3::UV1S,:AE7-J"`4GYJ<=$_Q``!`$0``P*@!`<"H`0(!]`'T`&0&250N -M,*%FSMQ8.WAY[)_JAT,N("4(`````````%PJ``!`[@\Y%P[-;W/;K[G%<=QH -MSL`K2BI/'C&S^5N"(%S&0&;3!QUSP>>D&"O)%I+VTR;2%2.6@5Y).TJG7[4T -M2!*W1IA1``!L````;`````(```!%``!H3_(``$`1``#`J`$!P*@!`@'T`?0` -M5`8Y5"XPH6;.W%@[>'GLG^J'0RX@)2``````````3````#"AG@4'R.1C8(J- -M)JCPV)J+^NU.9SO,];>$0M])]&:6^Z5]?!?4@2MT;G7P``;``` -M`&P````"````10``:$_S``!`$0``P*@!`<"H`0(!]`'T`%0&.50N,*%FSMQ8 -M.WAY[)_JAT,N("4(`````0```$PJ```PPW&15JAA1.J9J=01>^C*;/8SD'?B -MEWJY#*[E($K=&0VT``&P```!L`````@```$4` -M`&A/]```0!$``,"H`0'`J`$"`?0!]`!4!CE4+C"A9L[<6#MX>>R?ZH=#+B`E -M(`````$```!,````,(=J'KF*G?$LK21,E,0P]8GF<)H?UVAT!IRHX%#=JX\9 -MV,6@(VK.[,!8R=?O2!*W1K]H`0"8`0``F`$```(```!%``&43_8``$`1``#` -MJ`$!P*@!`@'T`?0!@`=ETG50%C;\9?H``````````"$@(@@````````!>"(` -M`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``]J=066IGW6-P -M#?K53-:BW=,AHHC!OXRTM'[NH9#6-W!SSBRD*Z3@@/M6+2NNQP=[Z\RFBSO0 -M,]QXI&FBIOJ?>J!\6ZSIMM"*H@WF;,4:]0#-6+V70V7KDO*T\>WLXZ02WS`) -MX,%,]3.QAAQV;&65UC:2P"Q@$K\39CNO/_+._S\I```DYC7WG!SO+4[LW0EF -MF!V1LXR_8,I_/.Q8W>EKW6GQ!/(I```<``!`!!8\_4G412__#L.AQVBJ%;I; -M+<[P````'```0`4,K;)=I;M/O\;Q;R[&F3!WQ';[-4@2MT:C>`$`7````%P` -M```"````10``6$_W``!`$0``P*@!`<"H`0(!]`'T`$0&*=)U4!8V_&7Z```` -M```````I("(@`````````#P````@``!`!@````'1+D-?5CP7]`K\2^V,'NII -MSN=:]$@2MT8?B0$`N`$``+@!```"````10`!M$_X``!`$0``P*@!`<"H`0(! -M]`'T`:`'A=)U4!8V_&7Z```````````I("((`````````9@A```@``!`!@`` -M``'1+D-?5CP7]`K\2^V,'NIISN=:]"(``'@```!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``]J=066IGW6-P#?K53-:BW=,AHHC!OXRTM'[NH9#6 -M-W!SSBRD*Z3@@/M6+2NNQP=[Z\RFBSO0,]QXI&FBIOJ?>J!\6ZSIMM"*H@WF -M;,4:]0#-6+V70V7KDO*T\>WLXZ02WS`)X,%,]3.QAAQV;&65UC:2P"Q@$K\3 -M9CNO/_+._S\I```DYC7WG!SO+4[LW0EFF!V1LXR_8,I_/.Q8W>EKW6GQ!/(I -M```<``!`!!8\_4G412__#L.AQVBJ%;I;+<[P````'```0`4,K;)=I;M/O\;Q -M;R[&F3!WQ';[-4@2MT9TK0$`4`$``%`!```"````10`!3$_Y``!`$0``P*@! -M`<"H`0(!]`'T`3@''=)U4!8V_&7Z5/;-:$@&3YDA("(@`````````3`B```P -M````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H -M``"(``(``%\I`4!M[>FW!;(S^H5(47'"-1Q;-@'DCH:F-Q5#QTYSO2A+*V40 -M>W5[\E=J3=DL8\3*]@]!+>^!5AZ"U!]BSUH"6;V:%D9VC-UYL:=[+/;/II?(I]_,$C`ECBXLYV;RJAS\K*JMNR(SN\VE3LZ -M*0``)#1QL/KR=!V9+H:VWT1!9C[YH91'O"_I````!P``$`%$Z]_,HLL4%D5$EH3L.CZ9PTJ -M9^I($K=&L]P!``P!```,`0```@```$4``0A/^@``0!$``,"H`0'`J`$"`?0! -M]`#T!]G2=5`6-OQE^E3VS6A(!D^9+B`C"`````$```#L(P``T)=;W]IR6S-V -MO@BFH(2QZ`T!8^]U#:.M5%@L;X;Q8/M&V08:?@?,H>N7IW_1NW[GL5=%1&G( -M7`GC11`1^@Q3[>)4J7P/900(HRW@OH"$P,5%`FX6G!T90X)^)6#.B4YT_UZ(.,UJR]%LP6M'B -M)%^7H5-,:EJ`^AXKS_7D94]*#9"ADZ>D;>):^Q8X^&@ -M,QZNII@R-+1$`"O*M\Q?74@2MT:E]0$`O````+P````"````10``N$_[``!` -M$0``P*@!`<"H`0(!]`'T`*0&B=)U4!8V_&7Z5/;-:$@&3YDN(",@`````0`` -M`)PD``"`9G+!>Z5BT8712#OJ+P1:/[BC(]'5JE7E5*E:&R&0#1($T5,.[P?] -M/N#TX?31D!;J4WZ]8E+KOD1O8NXJ.,1/%H.&#FSH)W\LF04BWV]=AJ#;:+[$4@2MT;R -M$P(`'`$``!P!```"````10`!&$_\``!`$0``P*@!`<"H`0(!]`'T`00'Z=)U -M4!8V_&7Z5/;-:$@&3YDN("0(`````@```/PA``#@V3I^VWB9:@^F@*;?JOX` -M64D'F&M$P)+3&^(>(KC;AZ]J*VJ.`G5"L.?'OC9@:,$V6OM^$G0]A0[H6JE_ -M!>GB:TCVI<&:T"R2MZD2B2,HQD\[(.QYN2G@Z5_2>BHHW"9F*#C.]/[2TXD' -M'J34PG-904&A!]&G^X]9>O3^1?"C(:;?N`0(@P);$@2MT:V&0(`_````/P````"```` -M10``^$_]``!`$0``P*@!`<"H`0(!]`'T`.0&R=)U4!8V_&7Z5/;-:$@&3YDN -M("0(`````P```-PA``#`$HRAJN3"VX$_P/AB(O[UAO8]'SJ:'L^^)`V(YE_Q.RXLLHSPUG`DZ?RMHTA!6W*6XT6QXKB0[L>L6&XP,[EVA -M>O<&]>C%FAY)SQ=Y/]8Q%0LX").UQ4]($K=&,BH"`&P```!L`````@```$4` -M`&A/_@``0!$``,"H`0'`J`$"`?0!]`!4!CG2=5`6-OQE^E3VS6A(!D^9+B`D -M(`````(```!,*0``,`QN!)_)O!:D8IX],_**ZP)0%SAKQ9\3B.%'Z^#FEFH/ -MR$2J^:B-[!HI55"-CS>D2ARLCI;M<1D#JPKJN!=*0V(`F1`HFW,+7)',K -M+^6.,)J'X"YPC(!T`:=9V-Y.W#%R\'I;LNN6&H@5J+]:\WHN_$;@)S"RK -M-3_N/AS!31)[6':P(*M#29)$FJ7M9TZD>B0SOA-W73K>6Y347PQ5C3 -M/AQ=8#O%1U`N+W/*H,Q'LX>_1AYSOH/J!VM622FRU^*T.`YA[%J.#Q,5%V16 -M:=?RY(*E&@G@G(#W8K)-5GH[!_WM!Z%.7T8PQ2`TKXY?@'72%=D_2>5[.5'G -MR!8GSHD'!(;1E@%W00QH,Z-Q5%-$.Q&CU)ZZ$O'+H05]_QW:"ADZD1XR/:!+ -M8'FUD"=]N_2!8/\83,*F7S#V2!*W1L-M`@`<`0``'`$```(```!%``$84`$` -M`$`1``#`J`$!P*@!`@'T`?0!!`?ITG50%C;\9?I4]LUH2`9/F2X@)`@````% -M````_"$``.`R5-;-5`*-+BL!`*:_"Y-"FP*..&E?K68)5'9,IL(LCX0Q")L$ -MW32VL0WS9S#SOGE3L(:/2A(KG'ED>#`.6`/<5/3L)KW>I"1=K3)NI1W-FTRC -MW/(;.TCETF/RSKY3QE\.,,[Z!B1PQ2!=)OCRBT,?AG>S%P,$N?/1`Z2J$C'5 -M[\)>GV6=E5.3.-&A,:0^-4@>UVYUZ#,J#_=<6JS)9,DZ4#E8;<6RN4:FYOZY -MU+1?VXT/1D=G)`AM]#M;N1+Y$2!6&(IOI.N.>XE:ZO3TZI*:+8:P.XM3>B:K -MTZAT2!*W1C]]`@#L````[`````(```!%``#H4`(``$`1``#`J`$!P*@!`@'T -M`?0`U`:YTG50%C;\9?I4]LUH2`9/F2X@)"`````$````S"$``+#<23\'%LYQ -M*]ZL@W&OC'3"T1UY6MJ] -MC=2K@1(C$EQS$65_#&E]1\I;ME20>57/[VR_"P\K2!*W1M"?`@#L````[``` -M``(```!%``#H4`,``$`1``#`J`$!P*@!`@'T`?0`U`:YTG50%C;\9?I4]LUH -M2`9/F2X@)"`````%````S"$``+!.0!;Q.A;A$FOLO.SR3G:T;S/0:_0WY5[; -M:).[7P"O^^VD]E9K@;9IP+S"G5D1:ZUV=YGSZV#]`H1'I^6A;[M)$IBT=!7S -M**VL^-?3=;>E7%4T-3]D;@4>^0L,>]&"5([OZF8$'B\X\,ZT08_S.343D(Y%UC%LM** -MI@7XB2!*W1D*\`@`\`0``/`$```(```!%``$X4`0``$`1``#` -MJ`$!P*@!`@'T`?0!)`<)TG50%C;\9?I4]LUH2`9/F2X@)`@````&```!'"$` -M`0`-.T.V'-Q3>6@?3502OJY)#J+O/%U+' -M9W7(EDOKM1/LQ?2L<11Z^&RHNJ[\K1=KC'"4/9X67`T8EG5'G)HR!@5KC@UK -M*YJ`-^*H0J]DOS;7FDG`R.,5-ETWB05K?.7;RA_%U -M[_G6ONI25%"8=[T=*7X,BT_9)Y_;KC[7'^5]Y1$\K."RD>2I%PK\IFLJI>[*YD]>PFDR-!$ -MDDI7Q3O=I55S`YP/N:*];#:!ZB3\(HWMGYI=CO6P.(U=/M:EV=KOP?'VI0TD -M'SBX/I3H^K-;GN^\J+*.=19$_<2K]:#CN7N@4;%KL(OEYZXGC;-XK4CEW!/3 -MILDN'EOES^=;*^4BT:(NX2C=:6QQMX6D`-YQ@TV>K<`A`,"^["@N`9M:`&B* -M*WN+^L2'*S/$ONTS;99*<'_6P)7]!S4T9W'<)K/Z6H7;(Y$YT@5I'#=S%D?= -M-$`NU>I -M)@*2G*HM./0-WI$_$X6K184<^QMZB]0!Q,TX8'&;#0Q@%4'-^ZVT+T;01($K=& -MF?L"`.P```#L`````@```$4``.A0!P``0!$``,"H`0'`J`$"`?0!]`#4!KG2 -M=5`6-OQE^E3VS6A(!D^9+B`D(`````<```#,(0``L-S=DM/RH/*;F59EI -M6F.AC)L:,?%HM')2CU>="B2&(=`!SG3\?SWK6(?&Z;T=,D"S?>NG$ -M.IV';86E8ZZ&(]]`ZT7>>Q@G&X``9A!($K=&=B(#`(P!``",`0```@```$4` -M`8A0"```0!$``,"H`0'`J`$"`?0!]`%T!UG2=5`6-OQE^E3VS6A(!D^9+B`D -M"`````@```%L(0`!4,G>1O(8!/8)\0-V_9J15>C]5`/A*HM%1EL=$;!JJ,$8 -M-A#[J)`GLLYD@XEZ>8>HE!/!$^9LMZ+>"1PV3@JUS#NXO%7^X\VG)L?$@#J, -M#!_BJ]4')RKW'FVD6B4T;?%7(QMF*3))I:6/=9#,,IX!9XHBZLJ[^2UI#SV& -M`;(RBQ.W@G;%RZ9C92ZAP8U)&L;/+C\C0'_`2A)GY!8X,7O/?\(:Z^\!.[FV -M.^_39"A\YM'WWE^5ZW8H,[_Y&A+FCGZMB\V;8:^`!!7N%BF'YYWO$=8FUX%Q -MFEOT4N_4GTFJ/0/T7RMY,_^`L>^+&I[7B![P(RN`-:W.6UW;G77%8U'HZ7QO -M"@8%9O(/`MO1'Q,GJ.>T?=8M;NT##1:W)DU!RI!9QV8'Y8`15+.05B0ZJGX< -MR/^0PX%=Z1,!18($<2-;6K*/Z#S+`E*SWBP%\F6Q2!*W1B-7`P!<`0``7`$` -M``(```!%``%84`D``$`1``#`J`$!P*@!`@'T`?0!1`Y`J*IN]#W2-\-0B5!&246<]-<5%[T -MT%ZXUH])]D0-%0;98B]V-MA2-;\,!:L:.6QYH4&<,CR"P-[0&L'H8_-40.-P>FY*JW3)7 -M"A5)$K[XM*D/YJ04+T>?@.MQ;D(+9VZ\U4R;])]G:S2Y(N_Q;RJ&,;4`V;"M -M*U%XA"!,S!Z^>R;-8(G!T5&2F=WS(6WAA[%5?\7D0(._4Y.M^TKEST@2MT;&?0,`?``` -M`'P````"````10``>%`,``!`$0``P*@!`<"H`0(!]`'T`&0&28%M,IKY+,24 -M5ZV:.@'96,4N("4(`````````%PJ``!`0[$;LEGW'%&<,RI33BS]4#WF=F(N -M5GW.6K.?<"5>;LG&%$@.#VBIE57;01ROU0`R([9/,98I/(/)I\@F2!*W1E6) -M`P!L````;`````(```!%``!H4`T``$`1``#`J`$!P*@!`@'T`?0`5`8Y@6TR -MFODLQ)17K9HZ`=E8Q2X@)2``````````3````#"DB/I]\8NF%0SM="AA^%H< -M*$M42$8CE&+RX+SPQ`(2K%TN/V;IEU/1:0C&K$@2MT;?EP,`;````&P````" -M````10``:%`.``!`$0``P*@!`<"H`0(!]`'T`%0&.8%M,IKY+,245ZV:.@'9 -M6,4N("4(`````0```$PJ```PI$)XH-@QT,.3DJ@8U\W:A?Q`RB<[[T,KF+$X -MP!P7UF93PUF,X$!L_!UH6%I($K=&"J4#`&P```!L`````@```$4``&A0#P`` -M0!$``,"H`0'`J`$"`?0!]`!4!CF!;3*:^2S$E%>MFCH!V5C%+B`E(`````$` -M``!,````,+CPI3$;0:C@Y!M!$TJOKB::F.L1%'$LI['!Z!1H?U68[L@>/*3/ -M"(``'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``U3!=;G[E*RGX>28#PCAE -MB=?#[B4&H@UZ/;UE:NY3UWCEP98R<6`M.\./\ACTHGCXMUF(L/9@;[(9'VJF -MH,-PO?7%/F]5AO5(+NF3J*N=%*`POX2MRPK@0`7````%P````"```` -M10``6%`2``!`$0``P*@!`<"H`0(!]`'T`$0&*3(E(OL9=K&A```````````I -M("(@`````````#P````@``!`!@````%TW4'7'`H4@2 -MMT;&O@0`N`$``+@!```"````10`!M%`3``!`$0``P*@!`<"H`0(!]`'T`:`' -MA3(E(OL9=K&A```````````I("((`````````9@A```@``!`!@````%TW

4'7'`H2(``'@```!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``U3!=;G[E*RGX>28#PCAEB=?#[B4&H@UZ/;UE:NY3UWCEP98R -M<6`M.\./\ACTHGCXMUF(L/9@;[(9'VJFH,-PO?7%/F]5AO5(+NF3J*N=%*`P -MOX2MRP*MPA("(@`````````3`B```P````+`$! -M``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(` -M`"G6-#)J%E3MA&\3`?[+<".X=3,8JZ*0)8V9]OQ)+$#NN*0``)&ZC -MUH$L>58C\60XV$^ -M%(VCKIO1(NO.@8R.BP```!P``$`%_8&4`3/^:=)GI04\2#38[)%O^-9($K=& -M!A$%``P!```,`0```@```$4``0A0%0``0!$``,"H`0'`J`$"`?0!]`#T!]DR -M)2+[&7:QH7$J+%YUGBK<+B`C"`````$```#L(P``T*]VWTWZ(Q3C793?HBV:J/4)3[3K2XO/VVF[P:I_FBGN.C)9NKWMITB%X-D@8 -M:^;7I+&U`)0!2TEF(2?$F@)#)5!"@8Z4?X1G$<5N>WU,^UCPH4P$"XJ)(U_T?LN!AF[: -M.X[JN$@2MT;:*04`O````+P````"````10``N%`6``!`$0``P*@! -M`<"H`0(!]`'T`*0&B3(E(OL9=K&A<2HL7G6>*MPN(",@`````0```)PD``"` -MB=9[H=L]JF?`%@W]@\G7P+_E37("?@XH;J?$([1=/YH#A6CIT#7P^ZK:KJ6G -M]4ZBYK0=/!C`*W_6M$""P#3LHV4@U+>-19W>S@5JN?P>FM:UE)=3@GZ4MPZI]=N>1\%#*>*:3*K=POU7D@2MT8I204`'`$` -M`!P!```"````10`!&%`7``!`$0``P*@!`<"H`0(!]`'T`00'Z3(E(OL9=K&A -M<2HL7G6>*MPN("0(`````@```/PA``#@^0O@RCA.+?)K##,]"4OK;T=<3]P[ -MYWU/I]3D/AA/)8]M*3&+G9EZM7E0=\1'5)#@FQ,?3GB%A<(_8F:SF3QF8+N1 -M*:;J6:E/!\.!P.DIMR3Q,5RX]MC33UB((X6UHVG$"878@)8`QHWE_!.M$MFV -M/4STE+4YCZZ2%#B;2Z`)DGC31M+&0.#]44BLF#3$AHXX9-F+;#5-]Z1F,_F4 -M)WIBO0=(SK2PJG#_D'57&K=A*T'D_8,=#*-LU2B$JU=$F8WO^]/E).*<\%Q9 -MOD)>KW-:(J!#7)=WT.E4EWBJ,$@2MT9T5`4`_````/P````"````10``^%`8 -M``!`$0``P*@!`<"H`0(!]`'T`.0&R3(E(OL9=K&A<2HL7G6>*MPN("0(```` -M`P```-PA``#`E1GYW1@&;AH,Q3NU*OW[=30)J/NW\1\Q8RTP@(BDP\\]J0'2 -MR0)M\L.Z5(6X1%L&`%&S@:$.7(!XNB)AD-(1Z?!-_6NIW&C`FU@\Q9W%K/LW -MB%R5J1_KL!6U@>"\K$#Y9XE($K=&'E\%`&P```!L`````@```$4``&A0&0`` -M0!$``,"H`0'`J`$"`?0!]`!4!CDR)2+[&7:QH7$J+%YUGBK<+B`D(`````(` -M``!,*0``,,!"V=SA)CJ+DUL>?J&U`^,BI$#EL<%VT2*T478!$EK,<"Q,-:I+ -MYLLYY,?R2!*W1IUZ!0!L````;`````(```!%``!H4!H``$`1``#`J`$!P*@! -M`@'T`?0`5`8Y,B4B^QEVL:%Q*BQ>=9XJW"X@)"`````#````3"D``#!\G6'A -MK@@LR/UO3,&P(6G_!?_I=UP\IP75S4FCQ@N^VE(?6;OA3Y9:>]<8\D@2MT;E -ME`4`/`$``#P!```"````10`!.%`;``!`$0``P*@!`<"H`0(!]`'T`20'"3(E -M(OL9=K&A<2HL7G6>*MPN("0(````!````1PA``$`%ENM7#I'YX@@54_&Q=0X -M)LZ14K*6P.R\SLWUZ]=,A%PUY"MJA1`9A]79`3* -M<7-02O[F#-P#\E'W4S)0JE\^+\TP>''#YX3+/]07A>T"Q/L?6MQ"H!;N*RV, -M3CT=]PN-H;"D6UTQ,;AIH-G@SDQ3JQ^5'_,HW]Y4/EZ)I_NK%/?.DY3O@5FS -M_9IN@%$2C1;YI>AUWV)B83-DM#2>E4#:.MBI__*9Y1F=9XJW"X@)`@````%````_"$` -M`.#@&IY;DDFIM\(A^1?BG]E]2]'J4A#,2;&8L3KBI##%K=]O(OE2&!E(!/)O -M2*51CG%,8$S]K63FW6):B+=X,:M+#+5+$_&U%7_Y6G8G@MN3'&#`:>N\_!9< -MN7D)`+_>.I(M%/C+D;\.QV_44PWU-+1;A^>8*(A9R`>Z/ZTX\$9IDZT?3^-+ -M`_K)K67+&(LN9@^SYA]MK%3^0YD:ZZZ*1Q:(PJE6C\0YM(B-SX4]KOLRMODB -M7$+X_I<'L?)VXO_*SLNP.#`]RCV+C*G$/`C-*G;D"+2J&XJW5Q?U25Y"2!*W -M1OJP!0#L````[`````(```!%``#H4!T``$`1``#`J`$!P*@!`@'T`?0`U`:Y -M,B4B^QEVL:%Q*BQ>=9XJW"X@)"`````$````S"$``+`UV8T'(DCF$\YP+0*+ -M\PK'MH*EPW/`4O%'JE2@W0I:%G`V;/I";+Z#D5EHH3<%.R?1OG$A%LM2?-"6 -MIM&E6HCGQ4F599X1R6"U:+I`.HK0=_/5O'$F(JNKI$^IX@$4AS3S6-ARF.&[ -M.US'&U(_KIB2M3=U6;=AGT1LD6>]N3ZA<*'CRUF?B]?,AO$^OGT:F5[?W>8, -M^[1F3HY&-#$12E*N5YW_W7)+DE-YSH.,2!*W1I?3!0#L````[`````(```!% -M``#H4!X``$`1``#`J`$!P*@!`@'T`?0`U`:Y,B4B^QEVL:%Q*BQ>=9XJW"X@ -M)"`````%````S"$``+!AXLHH.KOXIK'VY31GH38-!?:A&/5'-$IA[ZLTZLY: -MF`>YK)D/_:T-=9@EEH!B_\.B+/W;P=9XJW"X@)`@````&```!'"$``0!TW5,] -M:TOH9JI01&BJZBZ<8WY*#&.';Y5A)%Y@@J03*TJWJ].A4*40YON@"+)3.!IM -MSSZRW$PGZ&.##H0.&(3;/`<>Y^L?G[O=A04A5:W!&^1<)F"IA]J'0,_C^#2] -M:3`!;#^@.6+<8ZI2"AS11P@#`$+LJ_3O/&/:+]CVUHY:X&ER0ES^./^R1=*\ -MN!G,?:9>#@C^A#QGC#?GI:K#RTZR/LCN\(V5+$PYL`]BYF$84PN$-^,`J`7X -M"D(Y23YOF@531(]Y)^5M;5M+V=(&=[:.=/]\D'#^U.H^@3X1=I9(FIDYVNG5 -M`E(5.K17_\M'%4T`.0RA%J"*(>#,3]1($K=&$OT%`!P!```<`0```@```$4` -M`1A0(```0!$``,"H`0'`J`$"`?0!]`$$!^DR)2+[&7:QH7$J+%YUGBK<+B`D -M"`````<```#\(0``X$P$2HP;XP&MBI-IEZL0\,;H.74=4CI%>4N9)R0H9W3@ -MK:+M!&&R'>?,N*!-J@XRHZT`%P`MQ+9X&P&+VF7;!1Z`CRPV$Y49,B3&F6Q- -MT_J+I[8S`J8S!.+)K(P2/.UF8RU^#80_X.'"3+'X\^0WRELPY+'?!7GMH?G` -MY01#\=Q&+O$<%=EX/`3D1K5&2W+EV.#\*`P>'# -M]).K:?:-4.(`L*[NDACW>*%A]_*B'21`M--A>-8MU*=V=,K4;J^@P\UV!@CK -M#/KV(E32=15($K=&J0P&`.P```#L`````@```$4``.A0(0``0!$``,"H`0'` -MJ`$"`?0!]`#4!KDR)2+[&7:QH7$J+%YUGBK<+B`D(`````8```#,(0``L(@Z -M]"D^@&U@U%D'HU<[7AIO$/`2:_)`6RI)U_49D;Z`($Q"G\=X(.Z?'9,:DDV] -M]H[TW-F#SUNL@K(J/3! -M=$CVC)&YT>B96Z#2+P3KS;F]Q -MU70D0ZEV[T$#%3-08A=LI/#N7']I*^$%I4T[22L>X\+2M6^C?3TB)76ZLH6T -MI_\O9+"LW8/!&J=:_$9OM-O2?VZ\%/A#MXN0`V\K7@N-[NS7FN1<2%1N)]F$ -MA(#@.4"^[$R2XR2;'D#3YG(-'+P#V/]*())ZP/Q7_\,+EUX!/O(QWAIR_W*@ -MR>G0PY54.+0!>,J54[\Y0D -MW*8EF;A?]A)-(\5RZ4:4$UW#A9]0"O)H,TFX1>LQ&,HJ;1<_89;O?9!ED!K] -MCNW>&?KPKN-3Z=&W-_=A5.!/&>M\P6`P`-KJG%U:!]::IV]IE8P13%586XM7 -M?>\1_-JG.GCBZ5]JFP(]:79=.)Q&3^E>`>Y5&. -MW.DWPPIKS:J%D7:*30'/-U'(TCXX8G][74=ECNJ:*(G=N@__EQ%`7/AJ"J#U -MAF/^26X1)='TO7GHPO#_OX'PK@)1;3NOR^$>!@K,0QUKR*RU3)&)'^;RJ(]A -MQ7=%Q]C2K;&&C7#Q5"EP._H$F!$P!4%A2!*W1H>*!@!<`0``7`$```(```!% -M``%84"0``$`1``#`J`$!P*@!`@'T`?0!1`=9XJW"X@ -M)"`````(```!/"$``2!+.2UC#V(G[PA%DQHEM"O5CVB59NBS(K.>HB?W -M>WOVI7%;<=G]M1Y-:`1C.` -M/)U;B6/+ZW-)M?*Y_//@9D16G]]:IPZ<3%,!C]+B.Z.;GW8L)@AG8U"F1*TK -MG(?JYI8[7A<;8-<8?V!ZMK6V\.!KE=EPCAJ,>U"?E#X&KAK5QL2,.@2*\+$& -MMJEI(3_H6C1T:Y\0?@K+TZ-TLV^U'VP#$[Q0A=YA2/Y]^`FSLX;#S6LL!;*+ -M)TBHB[1#YGJ%^9D]K'IMD9:*-=Y-L),!\XD5U*BIMO#U5;RO[Z -MAZG9(ZD>K]]E-\/7$TH:-/909@TL-"_^1.TPB$@2MT;*L08`?````'P````" -M````10``>%`E``!`$0``P*@!`<"H`0(!]`'T`&0&230[^,YIR]4A1WJOP#SG -MH7$N("4(`````````%PJ``!`S#`W80"4#NOVQ5^WKP@ST@NG)H*A,M=M;=K& -MA;,,\2@%`259Q-/JU179!TB>HN_4]?KLDF(37Z]&"6R]2!*W1G>]!@!L```` -M;`````(```!%``!H4"8``$`1``#`J`$!P*@!`@'T`?0`5`8Y-#OXSFG+U2%' -M>J_`/.>A<2X@)2``````````3````#"`D%L5J!;:=%G=LVJ&#//Z+])II@N$ -M5LRI;<0]?EJ+ZP%O09']15<+1)[D:$@2MT;NRP8`;````&P````"````10`` -M:%`G``!`$0``P*@!`<"H`0(!]`'T`%0&.30[^,YIR]4A1WJOP#SGH7$N("4( -M`````0```$PJ```P92A!MK:YZU?8FI\TDFAMX,KCUT5VI0X'D5M'=\__A<+K -M0.7V?N6$$-^4N[Q($K=&7=D&`&P```!L`````@```$4``&A0*```0!$``,"H -M`0'`J`$"`?0!]`!4!CDT._C.:"(``'@```!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``XGY6OL>DA`.I`:&1:>J^/XC&\^Y7 -MF^*"OP`]-%2KD=/-J`,F\9F=+$*WU1MGW(N%?_C=/@3)"Z3#];FW]7S:LTHI -M4PA%F`#U[`?^JHTR(+9Q<9)N,`#KB5;BE4<(EDNGFW"L*C7(+H?AD.1YGQX8 -MRK`=3[*[<+8YB!92WQU771\I```D-:U@($7_UB8JW[DCH*\F,Y1(-11XZ9LV -MRO,&KDA`.I`:&1:>J^/XC&\^Y7F^*"OP`]-%2KD=/-J`,F\9F=+$*W -MU1MGW(N%?_C=/@3)"Z3#];FW]7S:LTHI4PA%F`#U[`?^JHTR(+9Q<9)N,`#K -MB5;BE4<(EDNGFW"L*C7(+H?AD.1YGQX8RK`=3[*[<+8YB!92WQU771\I```D -M-:U@($7_UB8JW[DCH*\F,Y1(-11XZ9LVRO,&K,EN`H^0-%"^+1/.*.F+`+KL -MR@(EGG?TXV5`DR@TH@/&T)":Z$N7]MG%U:18,HMSS -M9_-\AHJD7!F`? -M;L$J4X]->>A2$"<1`\X!TL -M]O8Z,8&SKJV?V1J`Y!Q*_,&J[H?JG*=1ISL%I4@2MT:=>@@`'`$``!P!```" -M````10`!&%`Q``!`$0``P*@!`<"H`0(!]`'T`00'Z22-G8#R4R]NS@XTHJW? -M1+$N("0(`````@```/PA``#@&^.4C?3TJK6)L>8*)1]GM?JUDJI3B=G2-_V)N9?`W5/M3ZO23$!+`!18B5%RP!Y'<9%0[4 -MM]=K.NXVAK6<>T&)W7(=U*UE`8JC7>3CIB#O9Y@R:5`\Y)UQ*3.EOCPW6'K! -M8*UNY.QQE5V0+-2.?G&RF]L3_EB'6O^7U19[NX5C^=FY,ZP>>>UM"'G;*KU9 -M\#"QT:+C5!%U2H;\(`_L&DR:F/0?A\)KGB38U`>6*T*[H*NS71CYFEQWV$DN -MV_@8#24B0A`Q[US$MD@2MT9-A@@`_````/P````"````10``^%`R``!`$0`` -MP*@!`<"H`0(!]`'T`.0&R22-G8#R4R]NS@XTHJW?1+$N("0(`````P```-PA -M``#`(:='=4WF_=%:OQ:"$N72Z`^7VX?W0$5U-DQEVP`$@D>8E_:&\JB*"3H$ -M$%LA'1[4+M#&<0!G$7V:6:@ -M:D&%ZA8J'G27Y<2E6JY*PI'YEG]\\*1._CKB"7D)9A_0]1[27SO=&,5SW]"% -M3_:"B==$-T+:MEAF&*9+MRC[-[T(BB#X\0*M?UM1S^!+[`)CS*T>O4/ROT -M2!*W1H2K"`!L````;`````(```!%``!H4#0``$`1``#`J`$!P*@!`@'T`?0` -M5`8Y)(V=@/)3+V[.#C2BK=]$L2X@)"`````#````3"D``##^0UL>F_!+7[54 -M@YI&P.>69)V"XI%L$2314Y=I!DH*W2Z]Z&`E%15BZ,=M4D@2MT:MQ@@`/`$` -M`#P!```"````10`!.%`U``!`$0``P*@!`<"H`0(!]`'T`20'"22-G8#R4R]N -MS@XTHJW?1+$N("0(````!````1PA``$`Q.5!-8#>S#`UAGNLO4Z"30M2B4\? -M,G84&"89SIQQL$OKX)B1XZ@A5LME&A^_+U8/![CE2I>SNFMMSE@VG[*!E=B;CG[>E -M(2I+57"(_+D,OZ0Q?0CEEI"B(9$Z[&\DJWT?%F#1]#RD2I=>Z[;3MUF'/`3, -MTDA'30"/M;@$*J>ED'D=!G)UO5C"W52@)"%OVG2!*W1N'2"``<`0``'`$```(```!%``$84#8``$`1``#`J`$!P*@! -M`@'T`?0!!`?I)(V=@/)3+V[.#C2BK=]$L2X@)`@````%````_"$``.!#,[N: -M2/H!%!VKI"*-^M_@/W*B[FDLALR*)3V"`]ZL^&-EF[8YCL*.RCI -M/=C4)HB9%8P$YBC(%^NV<5=M7-6U#P!9Z_-Q"#`(?+=\/V8')B$38%\9[.2] -MSE/H!B[2`0"JCXVB]P^>`&YDX:YESQ[>R@MJR)N(][()Y@"2GWTJ+A9@. -M9>WS&^NGBZ9=K(C5-W$PB]D,9245/2]TP=,UDM*YI@IE!D]C2!*W1NGA"`#L -M````[`````(```!%``#H4#<``$`1``#`J`$!P*@!`@'T`?0`U`:Y)(V=@/)3 -M+V[.#C2BK=]$L2X@)"`````$````S"$``+#UF;Z[*NG%,6\WKB'G2XQASSH4 -M5")_`/]!+,S=$!*FKS(,/%C$/-R3.H,WF>H[3C(6GM!9DQCP!-Y(WTHK4,^[ -M(U%!/A?DG*K586B+;T$0+RP7JOEN#]`>QS@Z%0'N*<#D/TYH- -MJ:&!SE%4?\YTO;( -M+ME$E]E"`5@K`;>)6;15NO8.4/4B_R.^W;^`O7S@P>LP*CTBH[U_K"27*KL! -M*QPRE?UL[C4.`M'1?V?2I]Y-PYEN[,SJW'U=U)RRT/MN(.?/*?\=I<#,X<9& -M.1%6G#RE%O2"Z/[[:HR"F'*5<"='182,J7TN^+"2)/-'I"86C=;/U'?C>-OV -M2!*W1A8A"0`\`0``/`$```(```!%``$X4#D``$`1``#`J`$!P*@!`@'T`?0! -M)`<))(V=@/)3+V[.#C2BK=]$L2X@)`@````&```!'"$``0#-T3UPH9)_QH&T -M;(S&JCUSJRU1,X&\9NYUOXF@H+I.5/)^12&P6KK,1+IGH)/6^(W.382<#6D3 -M?W!29!Z/]A!A"*6`T+D,V1TAO1ZD;5G`;)9CZ'/358X\8?;&\0$WKIZ2."Y? -M,V%<>J&.[W*_'J"&$LJ0E^>19.#(FDVBQT\Y;\_\Z40F28CI'+NG,-4!I573 -M.X`Z8U/?,,+6+3V"")@"4A>Z!M$`:.#GV49!?2'=71B!^!;UEH5$C1G!G#F= -M"9;FTL1$TCO3%&__Z<9FY[PH.^3C[S$T%"!E1 -M0M+.#/"[I#K1"L^^HS$%VH1($K=&\"P)`!P!```<`0```@```$4``1A0.@`` -M0!$``,"H`0'`J`$"`?0!]`$$!^DDC9V`\E,O;LX.-**MWT2Q+B`D"`````<` -M``#\(0``X+%*1YKF((31L3<3+"="+N/@%J5_0)MQZ.,9L69^W^HW1]L$H3!/ -M,>$454NZNK_YYD#7U/MTN\ZT9.6/C_A/RHA&XJ(,+SA?5['H)",D'$LFG;/F -M6!X#C*P=Q:Z^!W67D5%$.G9)V7FG1`XR,8K,^S!_P$O%$Z\9;:F^-E@!GL4R -MPFW5W\6(-%Z[5CTOOG`_4`_HF$NOZ2$#*Y>D;\]$+B%11OVLO2A-WI4TTMP> -MW][VPB4]L,;]DWV/2_BCIT5E*S51@-U=C21LKR3_WX5\FDV>EU/WF'^I^W%7 -MR+E($K=&$#P)`.P```#L`````@```$4``.A0.P``0!$``,"H`0'`J`$"`?0! -M]`#4!KDDC9V`\E,O;LX.-**MWT2Q+B`D(`````8```#,(0``L.G!?O3Y%/], -MW]&J*5+?4I-W]0[C#VT+?./'JN]+`3Y5(#;A/D)?F/5?LU*7RDQ -MMN$TB]QZN'VE[MMIE3ORPF-U'*6+E9/E/A4(WG[:<85""!1"+?YLMT/C3_A& -MYLT5!81JR;!==_DZ3Q(LO,_)CS7^T'BP7D3A,:(;,%41M/9Z!\)B/LZ/O7&# -MI_IO27]VGKD%_91A>:__/\_2>4V2X=;Y*5:TSN#<<-!WW,#BF!Z0"\@U8YO`-79 -M^==IPDLLCT6@=J/"M`\OC50![V+:O`&IO.G2@`''D0",V/-EQ.LIR!68"0"< -MA++=?P97',^!>QA($K=&.H4)`(P!``",`0```@```$4``8A0/0``0!$``,"H -M`0'`J`$"`?0!]`%T!UDDC9V`\E,O;LX.-**MWT2Q+B`D"`````@```%L(0`! -M4%E"V$!)2ET8?DU"9!:/]M[9R!SO6U?UG?A?$?9+\P'67AYR`>Z8]MYG8S6@ -MWX4$">%!F>6]V7<_7?&;^I)ZN$N>VJ&?$5\GPE-!@V2&!)KS_*%]I^;[5F9U -MC7(8@1S0VGI[Y-V&8&[%AJ9 -MJ9@OWA;F6\3@YKV[S2+,@+J?AU!T2-'^=$34WRFTVTJ19O1N9H")4P5O0*S` -MD2>G<6'*!`>BZ:.OJBGN,QX<(O"4N[E.RV:;.4")D\,&G_ZM -MZ],49?L=PK$:R"O4/.?^F#AB;WUL5K`OV8P4M;:4?2!*W1@&Z"0!<`0``7`$```(```!%``%84#X` -M`$`1``#`J`$!P*@!`@'T`?0!1`D62V`$X6@&`[=X]1PF,[-@:=C&6T#GY[I -M4IM%.1$-515$*$3['#YP_D0X9\1'Q="8SD=%T#S#P^\^N.5JB\;]02-/!7F3 -MMC`?DG3X'0_7F.#_#DQK9HG_LSD%`7KD:VT`WEVT?AC2$M[(HDX;JG.=65FY -M<8BS&M3VQ'H6^WC&K>H -M3=74DU3WN6I/R(1496PNP:=Z^O5O%`_``!`$0``P*@!`<"H`0(!]`'T`&0&2>E>MJ;[T+W(O+N:K,-IMT`N("4( -M`````````%PJ``!`DSY"6ABS!S\*;?I9[Y=ZC$,$84??2#"YW/&)VO7^AR\/ -MD%6?:^M]=C1":..`WTH!)L&'!N&;7GEUSMH@2!*W1@/L"0!L````;`````(` -M``!%``!H4$```$`1``#`J`$!P*@!`@'T`?0`5`8YZ5ZVIOO0O$ -MK,NRC3V([IV../PY<-6Y&$@2MT:1^@D`;````&P````"````10``:%!!``!` -M$0``P*@!`<"H`0(!]`'T`%0&.>E>MJ;[T+W(O+N:K,-IMT`N("4(`````0`` -M`$PJ```P]5[+_,RSLZ-@/,%9MGA&#W>DO/%O>J$KM3S3IKUH6]L'Q,;:ZZW,FDF16P:5+(>2])5!`$AJ>6097&2P[PR5V':]=*6O_2!*W1A8$ -M"P"8`0``F`$```(```!%``&44$,``$`1``#`J`$!P*@!`@'T`?0!@`=EJ_": -M#2C@5O@``````````"$@(@@````````!>"(``'@```!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``?(-)7"*+:PE&B1ZH_$G!76ZNMNEL!/SB`*Z, -MI__XS,H_&-?AP-,MC,.H4:T`"&&3Z?>LKE5/X?'51)H`=#L<^B7`:Q3GC&NG -M4\-&'G%UI3!3&S6_S"H=3YU@RFI^N!G.97ZPF*A^M!8QKAGG6L]M3T7F*@MQ -M=GF<;]Z)0YE[T@LI```D[79M104W\AF"^P/7TKI(DP\6#AB%"9#A#WO//YI) -MQH]_->(++7!2*P9UB$@2MT;@$@L`7````%P````"````10``6%!$``!`$0`` -MP*@!`<"H`0(!]`'T`$0&*:OPF@THX%;X```````````I("(@`````````#P` -M```@``!`!@````&*.=&A=PQV)_P^$N)?O:5]W$YN"$@2MT9:(@L`N`$``+@! -M```"````10`!M%!%``!`$0``P*@!`<"H`0(!]`'T`:`'A:OPF@THX%;X```` -M```````I("((`````````9@A```@``!`!@````&*.=&A=PQV)_P^$N)?O:5] -MW$YN""(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``?(-) -M7"*+:PE&B1ZH_$G!76ZNMNEL!/SB`*Z,I__XS,H_&-?AP-,MC,.H4:T`"&&3 -MZ?>LKE5/X?'51)H`=#L<^B7`:Q3GC&NG4\-&'G%UI3!3&S6_S"H=3YU@RFI^ -MN!G.97ZPF*A^M!8QKAGG6L]M3T7F*@MQ=GF<;]Z)0YE[T@LI```D[79M104W -M\AF"^P/7TKI(DP\6#AB%"9#A#WO//YI)QH]_->(++7!2*P9UB$@2MT;T10L` -M4`$``%`!```"````10`!3%!&``!`$0``P*@!`<"H`0(!]`'T`3@'':OPF@TH -MX%;X7:A_^&F5IGHA("(@`````````3`B```P````+`$!``0#```,`0``#(`. -M`(`#```(`@```@,```@#```"````"`0```(H``"(``(``$:I@2^1"W0/S)C9 -M*ZK0XHD\(VO('[Q+WYO1P@#X!_57L2M8B91*+L2@6*>D -MC=&D4@]CNWQ_*C&+>*E7SHC1@^_"#\@:!4(7DJ&(.??3_95@26-ZNJ+E+L+: -MS2Z,MR(:9\69":&&?$X"T6(\TK(^@A0C\!:%*0``)##@QT>0R;DTD+G*R_.6 -M\!WQPK=H`S>&N=]!TU*3>-HD*0``'```0`2,+PM[P\.LU:4DKX!L."O#RIU\5NFX$PA7"9C_;DQ@8=S'X[ORW<]U`L@[S6BSO'?@D[<2+B`O3'$ -MWA$_FA>6_]]VP4`C7(]U.BKN1$";A0L]HYT&O67/A[B!L/)V#G-^VDSA*?>A -MP#1<<),S^@:-*];0R.2DCY6&F>+DL)B[X?C*"2./=8]YL*S:/Z -MSSS]:Z]@);<],>F6HV$4Z\2D#P"$@2MT9CJPL`'`$``!P!```"````10`! -M&%!)``!`$0``P*@!`<"H`0(!]`'T`00'Z:OPF@THX%;X7:A_^&F5IGHN("0( -M`````@```/PA``#@&[E=#^$*PBGOJ\R+,IF*;'7/LS%N2RA(@7BK0$0HHT"P -M;.'O7@*Y$$UY2[]Z_,'0&[(*>82E?,]I.K83Z3US"NNZRC9K=QG,=W1G%LP5$=3_4A4QJ`Q`8/+;@K#1 -MM*>BC)K7_$@2MT:3M@L`_````/P````"````10``^%!*``!`$0``P*@!`<"H -M`0(!]`'T`.0&R:OPF@THX%;X7:A_^&F5IGHN("0(`````P```-PA``#`"&SU -MYAX^/7]8Y8V9#Q<'TNN,Z0_$LD'9*^?JDY&RS9]LOV76PWBO%8P61"8+9_3. -M-9;FY1+P_T7W(M9,9TCTA)$XGMT4ABL.]66IZY5W`+]]Q3Q$ -M'C;KJL9][5UI>8`9Q(YB_4:@*+?KGBP/WH2*)#]770YOD#:`U31CA%CLK"QH -M(9"T('Y($K=&5L$+`&P```!L`````@```$4``&A02P``0!$``,"H`0'`J`$" -M`?0!]`!4!CFK\)H-*.!6^%VH?_AIE:9Z+B`D(`````(```!,*0``,+YP8-[, -MOY1A1P0L:I?\^]J0.Y<^YE]%2G]91>;.9*6?-I?5?K9)YBX@)"`````#````3"D``#`2M.ROR992YMO-K+O>R7:U -M_!>_&%NSBLLB6JEVK>]HZ61&;;BI%3V3:Y1R5D@2MT9?]@L`/`$``#P!```" -M````10`!.%!-``!`$0``P*@!`<"H`0(!]`'T`20'":OPF@THX%;X7:A_^&F5 -MIGHN("0(````!````1PA``$`@Q6AQST$"Z?!.*DT:2AZ,US0`?JHA?L+@>J_ -MIMPXOJ6LY+&N=93>P'V($GJ`EKX1)&4;R,_FQB.'/'4P9H$8.)/RNK<.KU.( -MJ]?F-&I0I:6S5Q%&W0L$^7UF=:?T3?YGC!"O]:]]G9U]`F$1QN4J*W>I'WKF -MN9P')S+C6)T.&"MO9K9CCQ+^R,G^R%5='S7>T<'S?A%FG['I4D=H]QD7+W,QP^\V5+%N.614>SS_7#X,Y/ -MU53S_)PE#MX5O\;R6WB*NPXMAK9<%^BJ3YGXA5C!RLD;JC^HB+(17,!48$LV -M2!*W1G0-#``<`0``'`$```(```!%``$84$X``$`1``#`J`$!P*@!`@'T`?0! -M!`?IJ_":#2C@5OA=J'_X:96F>BX@)`@````%````_"$``.`R0(UP\A@Q*@-R -MQ.O3QFY"[%3.W9][66]7\48M@J;)E&L'(K#&S9G;,T*X0509T^I;?@A^WM[O -MAZ,5<27LU$PPJ&V9OVI]O\GA(?SJ..4!`5K"P.P[J=MLDGKA9+5(0Z1Y)\OV -M1,7FKFD,=_AB]],I$3D]+)7078^,<'A`KVZA:KEX1J$1L;5<)@6.P%\@<`M6 -M-!W5;MMN1[MO0\?1PK/MBF=7([&]/(Z^8]FA<"KOKZ5<:%*DW6'U9F<=_$D! -M[N-_$]$<:4HT+]0/E.Q4^2)AJ\+G>15LS.S55/?C2!*W1N40#`#L````[``` -M``(```!%``#H4$\``$`1``#`J`$!P*@!`@'T`?0`U`:YJ_":#2C@5OA=J'_X -M:96F>BX@)"`````$````S"$``+!\%9.&"]2]'"LR%HWV4.'UM9L:U@5U!0HA -M*WEOOSK6#=VI:#4`T.B^O.>;;I&2G`\U-[2H6D<3T&LM6%-$`DC972SH+ZRU -M"]29G'_VZ&TYM/,4EF/EM,"07VL*(Y;I@L0L/DCL#OXHCNXYD`TALR\84$4& -M1W;VL)<2\7)'?7C!TIG5R6!/`D&![P'-R6EPFT3:-[MH']$I77%1JM4!-!S` -MQ8/^FZVIB';U_^M^2!*W1A0T#`#L````[`````(```!%``#H4%```$`1``#` -MJ`$!P*@!`@'T`?0`U`:YJ_":#2C@5OA=J'_X:96F>BX@)"`````%````S"$` -M`+`"OLE9(WT?U6ZR43MLM%+=!88)F;N:B.+Y(NC.!&AU1@Q4T1YO24HO3H*_ -M>*8[BH(RGD5)N9#"^2GB1D0.HI#BM-M3@AA6M!AAX692\.YM7UM3IE`A[VC# -MQMQ*E5_P$/>;EXG`/+:L2IF'M(D?AMFS3XMIZ3.];+G6.S6C:73TAC?B\0?^ -M%,_\JR-5"`1RLEVM*_JJH'AK*#P_1CXN#3`ZJ;F-7/+5'PI*UGC^2!*W1L91 -M#``\`0``/`$```(```!%``$X4%$``$`1``#`J`$!P*@!`@'T`?0!)`<)J_": -M#2C@5OA=J'_X:96F>BX@)`@````&```!'"$``0"'H3,%YM;%P'"A9MTZD>4R -MIN]M7/2XP&6%;;4G8XK:@Z_RGW(I65.,^LA*>WT)I2$Q+<4U-)^Q1N5\0SP] -M'K['_T".#];I@T[O^6.3$X=[[Q!1GDX@I]KQ"LM2?RD!?JAIU>R`?\>!JS37[IUO(V7D[#1.."D)@W,G@I,>S9!<)CU6#WXJR%7E -MLD>7#Q0?!;O<#KY($K=&?UT,`!P!```<`0```@```$4``1A04@``0!$``,"H -M`0'`J`$"`?0!]`$$!^FK\)H-*.!6^%VH?_AIE:9Z+B`D"`````<```#\(0`` -MX!K1ZLUTQBC`>BF92$4'0K0P!I:KVAW4P45!(>$`#0>DR=Q;59E=LO.W''`;*VI@ -M]9R_#FF5=,-<5/+D7!OW4M$/P9!73X$-\]&?N-U?,^5QR,4S@DF??GG&>*7] -MQA"`!(VCU+@.OOW02,"#N1Z98H%E^]HU;C38J\F(#L]++S.:_I$2*)W/T>H-[P7FC+G5.X9.A)-&G9FLCK7:`_\7J+MYMZ=4:9O=!($K=& -M[6P,`.P```#L`````@```$4``.A04P``0!$``,"H`0'`J`$"`?0!]`#4!KFK -M\)H-*.!6^%VH?_AIE:9Z+B`D(`````8```#,(0``L)+=%V5$G*ZC3U*-Y?T"T%HY8\CK,;*1$ -M5\>YC-`@VDKMZ^:D2LG;RY5-Q,%\_G%C;29O-Z2FAS&;>7[HSRWCP4S/I!L, -M!6`*+J".K4$8GN(8G1&0ZU`?(T*?(R9($K=&/8\,`.P```#L`````@```$4` -M`.A05```0!$``,"H`0'`J`$"`?0!]`#4!KFK\)H-*.!6^%VH?_AIE:9Z+B`D -M(`````<```#,(0``L&<%4)UW/;E/7_*J!Q'Q9;TG&7H@0M.+^LQH*:"Y9&/E -M9;+)QI..1)B..#Z[LY<-ZSNS"]+YE^XL?FD-W)IH?D;BD`],*<6SES3EA -MX;F.<.%3:[BK'66#N]+8Q*41C/-AGI1)FHR0U+/Z87MMF.+6:%.@?77N@8/+ -M?U4;%*A:CR$,%;N3>*S!$OVVA2F#/!OWPIB/1" -MC$%H2II($K=&Q+0,`(P!``",`0```@```$4``8A050``0!$``,"H`0'`J`$" -M`?0!]`%T!UFK\)H-*.!6^%VH?_AIE:9Z+B`D"`````@```%L(0`!4-'9*#,> -M5P<[OVH42H,T.0UZS9:WIBUW>P#!BR53?=PBWQG-[:(PI"8"-J*OCINEH+H7 -MEZC2\_#;;Y"@G`J#V/Q6SC.-I1[)MK8CF?6^V:GXJ;_B8RSVRC9)6K..>X6D -M`__M^[KZ8@$V.Q6N_9"8(D%W&OLS/4--"$@J]'+L;BN(2JB#0?E#@ -MCAY7,EC+*LO-35L29+^.5PGMIX8O35Q>M?6;P@`SKC>6\'B">2X -M:S`+Y3JM;.")/I[12U?`H+^48E:+B"\_8;!%+5:@/&]MZ.;.'I,-W@RO$O%Y -ME96PLY$HH\E2A7@RW^0V%)AK)RD7'])A:4Y7QE4Z1?IUEW7)!$*FEP!![BU* -MM)$?A!:=@2!*W1ECI#`!<`0``7`$```(```!%``%84%8``$`1``#` -MJ`$!P*@!`@'T`?0!1`BX@)"`````(```!/"$` -M`2`"L9&7OVK6'VWD'.+!06JSNH=93USO-<+K#(\1KB82==]"N2X&.'B@X=&="6=>Y8,#!_'"DF52@K<=SABYYP'3>]?D>CTDZX'%\ -MZJ7!@5?']8;Z^&Z-T%AN6U%MA##'\P-F`)V_[Z_"Q.#^9Q8+*$67%YB.VI1Q -MTX.Z74R`W:@D:H\CUWNLZ9<(_ZCG[%7V`Y:?YCQ365@0?FK#AO+2L%;#'M%M -M.,VBI(;JX0O$[(Q5+^.BKS3*6A/7.U(?%7H%^?QR!#Z[FX/M"FN)2S&I&!Z@ -MS@N";&`!"NMADK.KZ`;U3:+3@-?>.E5M=Q[(E]6_R!]A(SLF`2.N;RN8]0@_ -MQ\"85]8D>A3H/XH\;(2@(4@2MT9E$`T`?````'P````"````10``>%!7``!` -M$0``P*@!`<"H`0(!]`'T`&0&29T,%+?'_93P!V7XNIU:L.8N("4(```````` -M`%PJ``!`)`IILZ[(C+6G'5J2^$M4QTT.AX1S<>'-82>DS1B@T"R`!P@E_#UY#1?_)S\$%2!*W1H@S#@"8`0`` -MF`$```(```!%``&44%L``$`1``#`J`$!P*@!`@'T`?0!@`=E1S7>%+UIUG(` -M`````````"$@(@@````````!>"(``'@```!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``K@>LB2!JQW@G7X:DQFE)B<0W=Q*P4^0ID*[96X4_M6O[ -M:(*MB)@/K@YU'X%(VWFJRHSN$6Y4B.;F)%LXR5HE=0(<$CO_E(/?D\.V#-2U -M&I6S,&P:M8[O-,;D)OY.@X/#+B\'YLYB!<8-MYP"$%#G(X'ZP6==_L=@\S=P -M51('F*@I```DF1,[:O?[F^$HA-Y[V15T.'1?<8`AL`D"W:-9[@1%BG`I```< -M``!`!.GD!K2:>:TD,A2'3C/J'CN>]Q7M````'```0`6",D_=$N!4W'\9*#"S -MX[(5`?M]84@2MT8G0@X`7````%P````"````10``6%!<``!`$0``P*@!`<"H -M`0(!]`'T`$0&*4LB2!JQW@G -M7X:DQFE)B<0W=Q*P4^0ID*[96X4_M6O[:(*MB)@/K@YU'X%(VWFJRHSN$6Y4 -MB.;F)%LXR5HE=0(<$CO_E(/?D\.V#-2U&I6S,&P:M8[O-,;D)OY.@X/#+B\' -MYLYB!<8-MYP"$%#G(X'ZP6==_L=@\S=P51('F*@I```DF1,[:O?[F^$HA-Y[ -MV15T.'1?<8`AL`D"W:-9[@1%BG`I```<``!`!.GD!K2:>:TD,A2'3C/J'CN> -M]Q7M````'```0`6",D_=$N!4W'\9*#"SX[(5`?M]84@2MT:0=@X`4`$``%`! -M```"````10`!3%!>``!`$0``P*@!`<"H`0(!]`'T`3@''4&C0UA8FC8'H-V]0N:`&09EZ5 -MBD\#])$`JN9C!U`8X-F3"&64GC6%U:[.M5_4!Y8/-_(P#(K]/6&^86R;%=2W -MTWM7]%Z*Q$R8E@^@M&+3](PI!<-W*0``)"E6R;4D!::0"DUBJ2!"[.3$40FO -M$HX21^0H4IK$C4I[*0``'```0`1N:5:LL==?Q_Z]9>NBJMRQ$(E9&P```!P` -M`$`%D_E4NZ6X&3)<8W\:)=BCLX9]Y?I($K=&]Z(.``P!```,`0```@```$4` -M`0A07P``0!$``,"H`0'`J`$"`?0!]`#T!]E'-=X4O6G6G'G4@"43K,)T*03TC/"PILI -MM6,UEL0@]4E8Y$]AB\1^=5<@$)C&16`:H:$[;R52""UY]2DN&(MW60I.> -MRT4O=_88C/[GC9],@D:/B=H5(**6F!RZL6W_'"X()!,[A]_'\N[R-RKU(/]HNW2^>5NM,S\:EA04`M,/\0][?0&BJZQQ_Z<_7Y_CD3F!^M'5W>6\>NEU4>LZ2 -MVO+O206Z^/;LO&2O8!Z/\/*+,Q7B>#*" -MI0"K34VN-'["_B;]!Z/2.S1'%L7IX`/T7Q@8O]E\1T%[P\>6!EA( -M$K=&,_$.`&P```!L`````@```$4``&A08P``0!$``,"H`0'`J`$"`?0!]`!4 -M!CE'-=X4O6G6U_6@VR&;8HX%8XFPY%CE*K%^2!*W1CL,#P!L```` -M;`````(```!%``!H4&0``$`1``#`J`$!P*@!`@'T`?0`5`8Y1S7>%+UIUG)F -ME"A!U2^CXBX@)"`````#````3"D``#!^GZ)KSB'8A[%"KAC576//9!=#;DI6 -M%KA\=/.Z^B]Z,4I94J9ANK4J755_64@2MT;A)P\`/`$``#P!```"````10`! -M.%!E``!`$0``P*@!`<"H`0(!]`'T`20'"45\4W\D]":VR`O4.LFR0'T&/Y' -M`]\^2;>%9_HVRJB;TB@Q'*NVC]^%_FV$I\7`_'S(@!5&[8_6F^.\$IB;BVL, -MBU1B/9MV+W.&%1;ZBJ0,(K*1#*X'#J:ZIU_]PA+KP7[KL'9O]Q0'"&K="E-F -M_*5:MR\'GE%".OYR^FV:W5SL=N:.<3P')%E\&VO2!*W1I(S -M#P`<`0``'`$```(```!%``$84&8``$`1``#`J`$!P*@!`@'T`?0!!`?I1S7> -M%+UIUG)FE"A!U2^CXBX@)`@````%````_"$``.#W!AN&VW!;N`KS]87P*'1^ -MDW('A>/MYV9;MVJ''V*1F@1I@'MJ)PPE+]+S5#I#62^5_)LPUWSX._J[#\D=MK[:6PK)-XG$9$@$7`EH=ID56?#%;HMM4 -M.`!5ES.FYP!W=>UZ?'/^ZY),T9:)($V)21*W1C,"``#L````[`````(```!% -M``#H4&<``$`1``#`J`$!P*@!`@'T`?0`U`:Y1S7>%+UIUG)FE"A!U2^CXBX@ -M)"`````$````S"$``+"D^HD4-O-0%URDXD/PZJ^LWUL;",KM'L[/<9/9L?PN -MW-\XH;.B,[U5$/*A,SWT\U_%Z5E;E*'VDS -MSRY\L8*,39VQ*YQ_ZZDG>PTGWJN5H3*E-X&JE9TZ($U$0B+XF+^V/OG\3:'^%)Y%0+=(W%I3-9`()7OC.F\J95VT?^*Q<`2)/ -M../;7%_,21*W1B\D``#L````[`````(```!%``#H4&@``$`1``#`J`$!P*@! -M`@'T`?0`U`:Y1S7>%+UIUG)FE"A!U2^CXBX@)"`````%````S"$``+#4KI]1 -MQ\(I/M:OTH@7WMWP5"GDC+G)-UNT?")!R)8M'L"B6W%/93>SW6).8B:K5^_4 -M]80!/UITQ$$]&&J,5@"3__J\[@TML(.E=/#A=%+UIUG)F -ME"A!U2^CXBX@)`@````&```!'"$``0!7M;S*TYBRO5$N0,,`6TDR.G'4(HE* -M(*@(BS(QM5#A#;ZWF1FB$B3W""1",QRWN -M:]^Z%FM.KN\-X=`6L`VPAE<):HZT;J_XB]`$P/*5'F$";I"B+;C\)`^D5!B= -MA/@-:%TD!Z5]@I@L,+&P2T?-,9:WFW39&X3N:'5WZ&??7!@Y,*BX<:ZF/$.? -M*9[T@3*N\MS66?X4W@H"TX$>CDL"M!#V\+2K?&Z`]U<@.]@'X<2.?X.;Y'-> -MILB?%:`B2LST('7SVZJM6P1]`A[;G1Q;L:,K+IH4<25R,U\,R1A\W -M$23KL8FW^];-NAI%U*U;/$\(QGY)]2\]BZ;I26(:='TV[D6+VNO8B[DH%6#B -M'7VQ%W(K".DHU\?43#JD]ZCZ_ -MF=NG%:0@!Y+MMK3WMUZ^S&/L-PDJ:O[ZB3] -M$_L7AIA]8C"B@S.'2@4%E>MOK)5K^-SRY"ZP9GG)Z/&,86A)$K=&65P``.P` -M``#L`````@```$4``.A0:P``0!$``,"H`0'`J`$"`?0!]`#4!KE'-=X4O6G6 -MB>V[?V2(U$@>1?C=DW -M>0\BM>D?&TN9'U@27>'5TN.PIXBRE4J3$!QB%`DA_@2U2-KXFZ#[A\?\#>[YR`U!'>9D&BBV0=X9:A:V]>;C2O[$`0MIW8.!L4B!13V -MF!`!.+0LWNM6FU5NG^K(4;@3;7-2,!>UI0.9[UY-.E"L2R,E'E,+*]3B$EC, -MU]_Q7#Q]*T??SM&<9#8[J)=)$K=&6G\``.P```#L`````@```$4``.A0;``` -M0!$``,"H`0'`J`$"`?0!]`#4!KE'-=X4O6G6`W/]HC^[#%T_6I$97\GVRF\I`IH"!"= -MJ>!#(>?-T@C;8$/0E3B.>U"=Q-`L5$8+#.!?J`I;BQ";QL5VM!?RQWX26&3>OQ#\T&8&PP@+U9N76'@*HL*](LI*UVO*A&A(,)8PZ`]\5T5U@VOY -M^H8GF,?5M#XTROH!DT)C6QAQ(FMD%SHV?-`7"(:3X5CW;16"97`Y163M/"O\ -M3<&&JS4]%":W5*X.@;2Z25%T#)#?T&]Y[XTB$D72+DE@BG$@$5JV_HOP!>B] -M0N\=C0>:=RA`>8_AN'4C7";??HXY.(SN>-+\O),J@^AQM!QJ@/OX4RSL6A*F0B-2B"N==?6ZPIGB$1[8JK>;G%S\G"TW`KUJ^^RJ%5 -M"3/`B-T>X`4^'.G`&YJAWZ#P30M,70?W+-*OXOBT=F99&+CDOPB;1_]%GV`' -MT[>>#$OA3X^-IX@%+UIUG)FE"A!U2^CXBX@)"`````(```!/"$``2!I^YO= -MDYS7?#R^_3X<$,:V$!"=43ZVCYSG&P^#7``;GS/,W*IW8?`5<;0VP/:..H>S -M%%)T'\!C#7/6@0K+K>!<:7W>0@H[3N=[U,68^1W:D=W>5YD*^A^FK&E`M0]6 -M,K`Z!0C:-J1XPF-@ -M*)O#LZ\N[Z>,VDD2MT:C_P``?````'P````"````10``>%!O``!`$0``P*@! -M`<"H`0(!]`'T`&0&2?1AM#3L=3KZ.9E%7;QC/!+@(?A21*W1A<+`0!L````;`````(```!%``!H4'```$`1 -M``#`J`$!P*@!`@'T`?0`5`8Y]&&T-.QU.OHYF45=O&,]RRX@)2`````````` -M3````#`A,E.*,]Q&L)\#RG(QQCKGEA??-#KPJCJ-FA3M'.A9U!^R7GJ;7>\E -MS7HN`DD2MT9I&0$`;````&P````"````10``:%!Q``!`$0``P*@!`<"H`0(! -M]`'T`%0&.?1AM#3L=3KZ.9E%7;QC/^F4KXBBK3MZ963JL5CYT@5)$K=&728! -M`&P```!L`````@```$4``&A0<@``0!$``,"H`0'`J`$"`?0!]`!4!CGT8;0T -M['4Z^CF915V\8SW++B`E(`````$```!,````,'UAY94$YF*M.)MQ&!\2@8=Y -MPJ,$!5,UY8ZD6U9+#;[24=J"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``]YF>//X9E,[\UU67P^K@*M<&_G%U02V?)*\1%L018%4M^W[0-JUD -MD*=`(D))N^0]AQD'`P?S:5`R&8)1)5[[W#J(T]D3= -M$B0OAW.G1<=U)XWB&S/-RSE;,BD*`HDJJC>"5;5+^^SVEK_O](B;#K:8).0I -M```D%_W\#+5(<-L9Z[(.N[TM?6J^ZN#X?3:PEYUQ6?G0J)HI```<``!`!)SR -M?T$?83%":7`]NDD2MT:@00(`N`$``+@!```"````10`!M%!U -M``!`$0``P*@!`<"H`0(!]`'T`:`'A;+!U-"9%%K1```````````I("((```` -M`````9@A```@``!`!@````%L\G8I"V(T6G7>?T$?83%":7`]NB(``'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``]YF>//X9E,[\UU67P^K@ -M*M<&_G%U02V?)*\1%L018%4M^W[0-JUDD*=`(D))N -M^0]AQD'`P?S:5`R&8)1)5[[W#J(T]D3=$B0OAW.G1<=U)XWB&S/-RSE;,BD* -M`HDJJC>"5;5+^^SVEK_O](B;#K:8).0I```D%_W\#+5(<-L9Z[(.N[TM?6J^ -MZN#X?3:PEYUQ6?G0J)HI```<``!`!)SR+R.A -M-PVA!V\NQNK6JGTBHNHJ`8MZ9Q[^B1D#J2;E\2TW"C37S;%5.P)!)$K=&"I("``P!```,`0```@```$4``0A0=P`` -M0!$``,"H`0'`J`$"`?0!]`#T!]FRP=30F11:T65_?-LJ9PS'+B`C"`````$` -M``#L(P``T,T_8`0@)L,>C9'Q/_F#_N:/M`$D(60,C#<2O&*]5]:X@*>,3^EZ -M)21/V$C"SLV)AH@K=KI#<$0Y76UCS._.$%?)6H#8O:I(JV?'8U("]8<1HH3DGSIXOY3!^E5GU9+7\E^-K35@](4[C-HY08_'%E<+U6AS#!1F9/[E9MTPP/\> -M^Y9Q+A^;!-$"]+9RD[Z%.),>Q%Y[UK8D#_W:3#TG5$D2MT:5J@(`O````+P` -M```"````10``N%!X``!`$0``P*@!`<"H`0(!]`'T`*0&B;+!U-"9%%K197]\ -MVRIG#,%J"@Z -M9VQB+B1R0BL'V[$'T,XU?.G5R/8VRE;6P^'=]5TYXYLS`/-PQ.W<*"03SC'9 -M]E`;7#&P_TD6:TD2MT:_R0(`'`$``!P!```"````10`!&%!Y``!`$0``P*@! -M`<"H`0(!]`'T`00'Z;+!U-"9%%K197]\VRIG#,2Y]LF!L1C7Q<)X>CZA[;B1(9*"!,Y/V[AA#= -MBM:5"-1J<5:AE/([HG+,HY*Q6YE/E]>HTM>^41@R,9Y)O(WV7*O>'-W@.R'Y -MU(R2GEL+!E]''_5E.KQ -M&H37%QF8UD7A:CD]IF`OVD%5#=X?PG@E+=.F5>T`"X9E2'U1[J=)$K=&E=\" -M`&P```!L`````@```$4``&A0>P``0!$``,"H`0'`J`$"`?0!]`!4!CFRP=30 -MF11:T65_?-LJ9PS'+B`D(`````(```!,*0``,(8CNO?2K'?M-<6J.BTU;B7Y -M=$".I_LI5K6)D*+!0&\9S@6+9F7I<*0)XXC`21*W1I+[`@!L````;`````(` -M``!%``!H4'P``$`1``#`J`$!P*@!`@'T`?0`5`8YLL'4T)D46M%E?WS;*F<, -MQRX@)"`````#````3"D``#`94/^Q&P56<-,M.C9G.EQU!DC`<`?"[L3H.`97 -MVGS]-NK0/?I(HZ<=DD2MT9:%@,`/`$``#P!```"````10`!.%!]``!` -M$0``P*@!`<"H`0(!]`'T`20'";+!U-"9%%K197]\VRIG#,Y#(R*A(2H?^_87-7Y_OLA?[R7`OMWIQZ\@/)[34O\@<; -MKJ#/6E1OTE.9@NW7Z/-C+9!PZR?I$3PL6EWBBI(P@-R-BKFY[`B99[D%F3DP -M9929UZI)`M26UZ>D3ZY7AT%.#J`TL<]=AW+#K,1(^_:(K'GR^V/($'/Z3:@9 -MK'M90E<6#"GR$Y4TG"U51++U;3$N,")F4AQ#K21*W1BLB`P`<`0`` -M'`$```(```!%``$84'X``$`1``#`J`$!P*@!`@'T`?0!!`?ILL'4T)D46M%E -M?WS;*F<,QRX@)`@````%````_"$``.`?HX$1:9Y_I6]+L^:<4>17#'L/MD(] -MM%0(U3J`1,H6'(__(N9VD-.G+J]<<%,XM_5-.YPVZ>8N:)%+5(($'AIC56^5 -MR)MY:CRA"#.E5^@TVZB>Z[!8XDPV#ZLL-7QG7/E,F$&27T4(Y0X7S+VJP4UG -M]E^1=F=,M7E"/@\J#_^-66[2ZQ>+]JI<6LH4.$P:PR[O^$2]S/;O3'!OM7HJ -MPX^^FRD^>>M"[&^?@E?794<,>LU9OQPD+MV6A;)J"L.6D&8&'0&K5WN`A($:^I_XO@IJ#]>S%N!U;,>CA# -MC[U/3:.C>,RW,A][.)$&*4E#,4E;RMB!YY87$&6D3LLJN.RVNB_]3GA,&'_# -M%?[W](_);UYO9;SLW_*N%[;^-'?44$)SAX(>6G_0GL-G[8)HM)MIY\/1BTV0 -M91_)>(`&8W]@15`'X0N6R6,`.@'/*LM5DBT<;$]MK&=L#<&Y]*7R[M)O%GSL -M21*W1A15`P#L````[`````(```!%``#H4(```$`1``#`J`$!P*@!`@'T`?0` -MU`:YLL'4T)D46M%E?WS;*F<,QRX@)"`````%````S"$``+#KVT$+MO5<4&E\ -MH64Y(#S>K%06TN9KM]]#554>!E$@@HB1TVL0FIW@0RI@+;Z.\# -MB;H3&0G-NR'Z@#=K!N;>8JU+\3^`^*M4;AR*)E%:NAB?O6J=808!NA?IL:,X -M)>@X_Q%W`;=82`+M"<#"9==3FF1YCR.KAD.#655U$8E*V!3^?C*DGVY1`!,= -M`S$0( -M7BZC121'"FMTK+@ND#D45DZ2"([;RRY]L#:90IAZTE5%7NKT`T&1U?8%YU$T -M(`#3UP6Y)\1+SD;`<;)ZR,+!)@^!]!_YP_()5!_S@;?I`AFG2:2VOY"PQ.,J -M6Q:;B6M39.CGZR4A3I^H,I(X6MNF5!1X6^I'98%===/E,%;D9 -M*R.W;2:F/J;1LZ%R%XI(@];B]_9H=F&"/_SB[V4!:_;IE;>DI(IBDW?2I==& -ME^*IYPYJ@H*Z5SC3LND6@`K;O/TO;>Y];HG^K04(N;Q,>'0T5RQ+ -M[GQ.+`_.BC%SQY\K=Z)USCS])Q&H^'0%!,<8.P3:TI=[?ML6K";2="-*2=L7 -M]&AQ^J^)3YES9$%EEL;(&K;9H8U&PK8*_XMZE(/4;'$0M[Y9>^,)JEW+O<_H -MCM!+Z["8FCVD/>Z(-4:0`^_+84YT:^P[<`N)IRQ)$K=&N(P#`.P```#L```` -M`@```$4``.A0@P``0!$``,"H`0'`J`$"`?0!]`#4!KFRP=30F11:T65_?-LJ -M9PS'+B`D(`````8```#,(0``L(M.:_>!\KE(=4)Y%<0E*,E#!!)\5PRHT.NA -M,:?'AV0EQT2K2A9V,0Z89@1->]T(2DQL2C?[&PY&6(..XO`Q!SS+_Q_@_+UZ -MSO$>ABQ+JNT&@;*#L[,6``S6.^O7/UL#$7Z`ILK4<]F\(CU7/DW[GS9'_1G0 -M=++HI`T>6M`E!A7HK1(Y/P$R\XIVA:@:S9)XK-XT"A3V#/9:T:`U^D-QIU,! -M^U0P!(\KU&;_AZ9)$K=&[ZP#`.P```#L`````@```$4``.A0A```0!$``,"H -M`0'`J`$"`?0!]`#4!KFRP=30F11:T65_?-LJ9PS'+B`D(`````<```#,(0`` -ML`'B749OI1L*:1;)B"T$ZP9_U*V=F_LZ\3IV%Q@`<<.4B]2P*1E5??6R`FH+ -M_F20&9=/:">U,5.1J&42SA8W*,CGS#!]@:LYH5/VV\EBVI+56ZZS/4Z20^+- -M15.O/*T&Q$>)$^+!G!2,USWX-W@S&'DWD/*"CS\"M4I"-SN;.RS=:@(*=WJ*(`E)$K=&FM0# -M`(P!``",`0```@```$4``8A0A0``0!$``,"H`0'`J`$"`?0!]`%T!UFRP=30 -MF11:T65_?-LJ9PS'+B`D"`````@```%L(0`!4%(*U(&<\I-J?8=N -MR%M:PW1T^(CF(1L*?G?.+D6(KRWF9Y;J=UUL[9\FGUR!@MVER%>^8?JX+PD+ -MX63\3CPC2HG,9K07O#-]2R]!^5.(\*?_P@\K&!*,]3]8<,_%1A%//*4<(GIJ -MTW:,RP(U#0NI1!Y7,1-NCKAFU.,&".$$7B)]%WJ>0/.:;^TK'1_,%$'Z3_?* -M").RU`-X0PSF/'%*7FC+;PZCB-&M2A<>#/ -M.&((;V^Y%\^K3F<7W#A&)OHA$\2DW$OABYTLS$RI^)[^757VY+_VEOH4B\'T -MXK90V2E/,28(^!/L!`#,IG-]LT]07#4S:-*2!U)DIQWV2)'S?+"'<^'43E?O -M.'#):/,M)_\4]$ME1NRNN6>W0#_$L#.G-4X`31EJF&7\]^9+SF8]QN""TXBT -M21*W1F0)!`!<`0``7`$```(```!%``%84(8``$`1``#`J`$!P*@!`@'T`?0! -M1`; -MOD2359X\,RLZUF":B+MK`QQIO/Q]PCE8F:%3B-J_C>UYO9,X6AK(C@R8%D$B -MRSZEI>HZ6R\:3PQ$^ISV9"TV4P5H@O)!U&?)_8]'._5'V+6=3XOJ%,U;H6]_ -M;^TVF/]*A*D@(@A1'C8C*RKHQ31/B1//)'@L#&=*YT1P#*@8H5FW[]UM6)2R -M5=6#!M_)'0<3%'O>+%"'``!`$0``P*@!`<"H`0(! -M]`'T`&0&27MM*[UF`8A9!U]+"]N40[,N("4(`````````%PJ``!`H$QZDMKM -M`BK4()]JSM0!!-07Y]_^\5S3*K3=ZBE=`D*`-JKS,+%V8BUIEAKW*/7:U;`4 -MGO?\V]29E%(V21*W1HL[!`!L````;`````(```!%``!H4(@``$`1``#`J`$! -MP*@!`@'T`?0`5`8Y>VTKO68!B%D'7TL+VY1#LRX@)2``````````3````##Y -MD,_9M%0.@3K_4V)$H_A[V*W=_?NEHHI<%.(3CS,DONV*W)4D2 -MMT8:2@0`;````&P````"````10``:%")``!`$0``P*@!`<"H`0(!]`'T`%0& -M.7MM*[UF`8A9!U]+"]N40[,N("4(`````0```$PJ```P[LH0)(5@JQ/Y;%4K -M665>82]W5,0K41:F(6[^71R^;`U2ASH24CO;?O1S*9%)$K=&>E<$`&P```!L -M`````@```$4``&A0B@``0!$``,"H`0'`J`$"`?0!]`!4!CE[;2N]9@&(60=? -M2PO;E$.S+B`E(`````$```!,````,&-MWF9JZGIK=*LNJA`%G6\8^VT"9"3@ -M.+?B85/(4):W$!`:@7HW0ZV67)2$21*W1HU1!0"8`0``F`$```(```!%``&4 -M4(L``$`1``#`J`$!P*@!`@'T`?0!@`=E$'CI=<8>^AP``````````"$@(@@` -M```````!>"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MPQ0J!KA:;JN7%\?^,Y?EHE;1()BD2EII\$SF]X6^7JQ9&$T92FQX;Q/-+5L3 -M*2*VFJ0;*AY@"/X^!L-GVEQ/F^9*5D>;5\">)6FZIKHM\-\S>C@`JY?J[?XG -M_YT-\+2X7O,;0TL[7HM.T]*S&:"B<`4`N`$``+@!```"````10`!M%"-``!`$0`` -MP*@!`<"H`0(!]`'T`:`'A1!XZ77&'OH<```````````I("((`````````9@A -M```@``!`!@````&R^+;5\">)6FZIKHM\-\S>C@`JY?J[?XG_YT-\+2X7O,;0TL[7HM.T]*S&:"B -MB[!C]=OC*0``)`6P:K>*B&8CJOAD2AX=:,"PUZY._^?9##LSZ$>CS<[S -M*0``'```0`3'=(C^K31S"@;W\J!UN3E-C*3@/P```!P``$`%9*EMGMS`$H@U -M"G70C&&.EUQA[Z'!OOK$_-*.$L+B`C"`````$```#L(P`` -MT!)E,?HVE4E$/K>X9UV:6W8.^H-2')JMSZEU9^D87(X(G&I)J`"YV3(G#>@+ -M;YJ_JIS,[,F'.46XL?;+W@Y1;U`EQG-/H@KI<11$\#`6F`UC^MRRCQQ%`Q%" -M?@HB?RS?`R!0X==TK8F_>R$Q=.>+ECA"*=]`ARTB"17"I-M^&#`L%EE5P@O2 -MY7&:0,L6P"T5(">QZ[U=)^.K[G6S@1P>8VN?"9MDUM4D2MT:CVP4`O````+P````"```` -M10``N%"0``!`$0``P*@!`<"H`0(!]`'T`*0&B1!XZ77&'OH<&^^L3\THX2PN -M(",@`````0```)PD``"`5(Q7T#R4WN#OVX4*2W^%[W-L4`3OA'+,RH>'@R&# -M;(GMRPL(=X&L9RH&^U4AY=)&$?$FY[&A4>:EUZR? -M=JL41CS-'<%,'\06WLVN0RX63;=/EQ&]/:6C%"]4<:YY9:?1./@8;6*U&AL1!;<3!K0DQ2`VB6FP^FTP%1?N6&%#G%JUP -M=EU;OJY>`+PD_5,P`*:3A?S689`]7K%9R(+QP -MT=#Z"0A`DV,:ENV%Z+\EE#.@_F*?(;>F=8J;-$=F5>EZ8TD2MT9:!08`_``` -M`/P````"````10``^%"2``!`$0``P*@!`<"H`0(!]`'T`.0&R1!XZ77&'OH< -M&^^L3\THX2PN("0(`````P```-PA``#`=OJS"X9!_P)4E:])NA4R:]>'P@91 -M,(*QS]1D-SE>8%J-W9EJZ*,9A;/M?48W3ZNE6,Z>>K#4ZBD8R<1CJC'U&H2' -MA$CLP]/2C8\!W$4S\]R-O6^:;0K0O^GK:3MULD)7BK@EWBLSO8K=W38_O'Z. -M-6UPGTH=CR]IY(9'T"@X`5O66UK'<6L)S"P6B[0DR%=5J4@ -M_!NB&`!4\UXX[6^:W"=^]EL9^GH%I]5W$LBMPUB[:/E)$K=&'A`&`&P```!L -M`````@```$4``&A0DP``0!$``,"H`0'`J`$"`?0!]`!4!CD0>.EUQA[Z'!OO -MK$_-*.$L+B`D(`````(```!,*0``,**'LC>TCRQZF_:8N+X)D#69^VYR:4M6 -MEBN;?;>@:JQ<_#T^AP;[ZQ/S2CA+"X@)"`` -M```#````3"D``##\QQ(9*6AH42FS?RR^]\4C>HL<\$>#HL%OME.RPV7P\C&; -M:K8A%N5C$C0FQ[N6SJ06J$[1=`)-59G<'J=U3R\+EMK0#5%1_$5P\Y!.K -M61^;JG@&7%@)MZ)HX*_%'"Y"L4AS(C,Y8(6D\9/PNQA<1HMEP5 -M7^2&T?^AP;[ZQ/S2CA -M+"X@)`@````%````_"$``."\%S<#9"C1@CI[@"G=;VFCNH3:)BX%.D@6HGAS -M_\YF92^.&G8AP'K0/A;P,AF8CAU=7C5=&)A=PB5Z']!O7^)X5U,N"'SK,7X2VTYX6D/8(GK%N^8,NT0B3R68QV`PV@0,)NDC3T`#>3 -MXX;@LZ]M"$O;B7%"21*W1AYB!@#L````[`````(```!%``#H4)<``$`1``#` -MJ`$!P*@!`@'T`?0`U`:Y$'CI=<8>^AP;[ZQ/S2CA+"X@)"`````$````S"$` -M`+#N!\M=H9A>SDU,A`23\I->YT?[L4@&)RW_?=K]_F8-/K(DH?&/)RPWA*'8 -M@E)/'W7N,+]QI,5?_/MA2\G]"1YPU!Q@7B0YK)@^AP;[ZQ/S2CA+"X@)"`````%````S"$``+"G-A3FPF.&[@%"(7FEAD"K -MYHQB&XF+I\7.=>D1*XPOC[MV%/`GP`(FNR%4^X0X)E,OZ81G%>4&[^MB+6MC -MC'[O_4KKF*0:/C&(^/,_T._*YLM^AP;[ZQ/S2CA+"X@)`@` -M```&```!'"$``0`0C[YQZ8`1A/D8)4^*+7"7\Y\4%@WZ;TV(NE8G8*"+,\)( -M"N;CVLC;*P/,OCUP'PN0C@)+QI+\?`]6EO[<37>F'YS(>7RG`^93THV061 -M?/\\R,\(#=[4'AB#P&OG1$GS914\!DOMX30'RV2D.]X3'GGW,_4/-8%57;V! -M+T:BZ%@IVHM:[52$XAE74?LL@UX$TE"&UZ4MVD`'>(\20@FX+`M)$K=&)ZX& -M`!P!```<`0```@```$4``1A0F@``0!$``,"H`0'`J`$"`?0!]`$$!^D0>.EU -MQA[Z'!OOK$_-*.$L+B`D"`````<```#\(0``X-]5AFJ3EMM.$)&@.;(P#0>< -MO6ADYQYH%20E1E:Y%Y0T>*^F$CN.4T,K'Z)H__6C2Y"?`P^%ATVFH@G(Y:C[ -MD(EC3$419'`L>)/7!5OO,U?BEY3M1#"+:2)7G!6J6,KN\3+K4&Q7QQ^_E;1: -MQ@OBI?\XT<*53OJC,\!$<$K!2'.)501%\1_D9:9W)012`@,`8&U#O^W-$#5X -M0[K-T]@P*J*5OA%Y=3K36-2,M*G#=9MFZM`,.EUQA[Z'!OOK$_-*.$L+B`D -M(`````8```#,(0``L/D0;Y"/$)ZCG5M[$AX2;>:SXDE>'<8ERNM/\RI*J/`$ -MX&^@%MV-B8Y#TE@`G4U7C*LVF+GV=^JE)7=R^!LYB_T[.)V`YIJ -ME[A&"`ZQ.YG(V"(J^C"^>@YR%9XTP5!)X6RBNW3!'D3YU*N$Q[QC@:O?M3-0 -M+X?M%]2<56Z,"B+;/K]L!!)\5(*A'S?C4Q[A"-=;4*TQ66>$)$3A5*1J^0&0 -M&7KLFH=)$K=&5>`&`.P```#L`````@```$4``.A0G```0!$``,"H`0'`J`$" -M`?0!]`#4!KD0>.EUQA[Z'!OOK$_-*.$L+B`D(`````<```#,(0``L!;]F'HA -MY$!4\UQL$8OGS572:.@&A=W,">]R$.Z?F_*'P@R@=/I*3?B;!T;^%21H'"*= -M@Z9XA"HW:>HPE](RO.3^F9)ZMI*XQ\AGZ??`QG+):F9=SL(4*9XMNW&,MMN\ -M^C1)D?U).'C5`#3W](;/*J7Q/"&.P#EF6\.R*2B7AII8XFCYHINDYG43SNJ@ -M0.EUQA[Z'!OO -MK$_-*.$L+B`D"`````@```%L(0`!4$PMQ?CP432O7KC#*//$`V#/341BR1%> -MVGMNC<2NS8_)Q;VUBM34?[(]?:&U."_;3BX(9R:/\5"66"KV>VUT:30:4$%/ -M%:CZU<(CGS'K:CQ-WEC.C++:$X&(#GVED)[U&A=8A7]#$*6T^F#M-@N];=LV -MN_*1\+Y75\5_(H-6;@0S-G=$SR]LOSTD0_5;(0^\I^JM!E7S#C@]%LV&?ZS^ -MQR6`B!&2XM8HFR9#<2SVS)&S`O*&95N9O)MQFR&_*!"'8B>8(,RXVJPV>G%^ -M[:2TQ3W[FT#9Q4'7B;18).'JMI("5C;1[\3DD6YXC)#K`#)H'`37ATAP&QTZ -MN^N7W/6.!/0G3&XD!U*;EER0H04KFCBTO)V:@;Q]GC?2SSSP1-!JV-RK`N0> -M.`'!_/R>DZD(RPNQ*I"`\%:^+C9$H\F\T*)"P@A38T$[IFK4K5)>21*W1B,] -M!P!<`0``7`$```(```!%``%84)X``$`1``#`J`$!P*@!`@'T`?0!1`^AP;[ZQ/S2CA+"X@)"`````(```!/"$``2`/&OK?W&ZS47XD`AUDGCSQ -MD["Y7KG"+X4!$EM -M?6$_V4;#[SY@HFWE@(OC_G7[/F#23K[?5RY(ZI<$VWJO144JF^5N9+L#.QHG -MTEK]6!*DF^=MQ/ELVQ5\_1::RHF%^"=6.(0G6^$*UU75OS8%GL"9)KFD%C)K -MK$7N#UL#D0&?^G%-!T7'2SM8,7')<)TT9**H64)J+@LBOA@/7MQ$*J#7-*B! -MB!"'"^*7L>,`,+_-B'7A)$IN,9"^M="#%"?``!`$0``P*@!`<"H`0(!]`'T`&0& -M29:?,6(K,#?5F-O$-#AM!E=$D2MT99?@<` -M;````&P````"````10``:%"A``!`$0``P*@!`<"H`0(!]`'T`%0&.9:?,6(K -M,#?5"(!`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``XJ(K$XS9 -M4S!'T?8[A\FP'0JAT^7^YJT(PTLHO[%##C`(4,3&)^$X+%-=>CJ\%<0#H?>+ -MU+$O@C.G1AK(-[UMUY/OHOH7WY-Q[NK/*PK@%$3-Z!>J_/]0%"D;6Y4=`JV4 -MR6L.7)P<"WHR,90/'P\L%84I```<``!`!*-(6IE&@S:5X.\GZZN8 -M%]1-I8^\````'```0`4GLJK.W*C]W(BSM]I58Q'-X2M]+DD2MT:0E0@`7``` -M`%P````"````10``6%"D``!`$0``P*@!`<"H`0(!]`'T`$0&*6+'!E&KTC34 -M```````````I("(@`````````#P````@``!`!@````&GK6T+J"V;H::589Z` -M+>3Q`TE/UDD2MT9WI0@`N`$``+@!```"````10`!M%"E``!`$0``P*@!`<"H -M`0(!]`'T`:`'A6+'!E&KTC34```````````I("((`````````9@A```@``!` -M!@````&GK6T+J"V;H::589Z`+>3Q`TE/UB(``'@```!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``XJ(K$XS94S!'T?8[A\FP'0JAT^7^YJT(PTLH -MO[%##C`(4,3&)^$X+%-=>CJ\%<0#H?>+U+$O@C.G1AK(-[UMUY/OHOH7WY-Q -M[NK/*PK@%$3-Z!>J_/]0%"D;6Y4=`JV4R6L.7)P<"WHR,90/'P\L -M%84I```<``!`!*-(6IE&@S:5X.\GZZN8%]1-I8^\````'```0`4GLJK.W*C] -MW(BSM]I58Q'-X2M]+DD2MT9BR@@`4`$``%`!```"````10`!3%"F``!`$0`` -MP*@!`<"H`0(!]`'T`3@''6+'!E&KTC346XPK<5>P.K\A("(@`````````3`B -M```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0` -M``(H``"(``(``-3+PL=[KL&.,7*BF4.,FYKH!\VCQ'C+!_!8>W,5.AQ -MU*F\`@@&GS7YDQ>_1A6XK=^_0Z&WQ%H&71MA\MA*%IC$E_S`P(R7$0&3/1IA -M\Y-2*0``)#V-I6U"OL-,"+L`K8O6M6I6R)A%PD558"]H2\UP!;`^*0``'``` -M0`0S%MK0TYI5K%>90$3<8U\8J8]M#0```!P``$`%G_\2U9$^I^2Y>,.DLGMT-:S8:0D1H?TTN/%82O@I?(3F?B._Z_2A=^8@3H:P9.=?Q9E.^//I6#ALG'G&HOAZC4?XLT -MX&\=?>9B\.B/P.K\N(",@```` -M`0```)PD``"`KO,7C>Q-V*9#9@QC%C^@7H:\GD)+T9$>Z>HVG>@>BAA8,FAI -MRQZ<)^/$1[LYO1D`3J(SP'B]*NI@KHJ&:W=E]7X*@F)*>`#$.P,-0.,*]NU` -MTE*;M38DA*;"WO`L9F,PL*R&;$OM^RU@BP)LQD-4P.K\N("0(`````@```/PA``#@X0VBQ#$SO9_E`B7Y -MQX%ZBZ&,7S&@`XB#,[Y%!-=-#=[+&[E*'2"9?N16+&+)GLR\7VO.B7O=;AE! -MP]9F=-U$>:TJ=#6DB'LQ'-B>)=A*W=[RJTJ)#U=D]#.8D#=Z1"W+>M->81*U -M;Q\,5EY6'URM")E>[<3?4`2__*RYJFB#DU>-U;A7WV=%>G5S(^I6/GMV0%0MH"EU_(^FJ6I$QLWJK3 -M.6*J$F$K+XB\^9U(L6D6@OJ;[C97)SG_QB3BDDD2MT:H.@D`_````/P````" -M````10``^%"J``!`$0``P*@!`<"H`0(!]`'T`.0&R6+'!E&KTC346XPK<5>P -M.K\N("0(`````P```-PA``#`8)(/C%62-`2)P4G,//]6HX[Z_;),\)O+G(MB -MPQ>#V=;F'\^S]HK\)2EJBZ(!V=E9B(]Z?"JK7P21(NIU9D+/3X`HAO6>U+V9T8\=S\4P&L4UY37?T&:2>B'JT@3H=+_]9: -MV\ESP9@!S\EN?U(@Y25U>+YA7\XU@LD;J+Q*5B"QP/9\IK>S(+H@ZNH%A*L' -M]%%YHCEYBB1CO'F$F^#3Z`7#.`088XOV3AA)$K=&M$4)`&P```!L`````@`` -M`$4``&A0JP``0!$``,"H`0'`J`$"`?0!]`!4!CEBQP91J](TU%N,*W%7L#J_ -M+B`D(`````(```!,*0``,$)6@&<4U/JPSZOR*+S3E>&*U5J/!@.V_4WA\6., -MQD,\]M;S]GHPJ,'@;(-K21*W1I1A"0!L````;`````(```!%``!H4*P``$`1 -M``#`J`$!P*@!`@'T`?0`5`8Y8L<&4:O2--1;C"MQ5[`ZORX@)"`````#```` -M3"D``#!@:M^3%@\(2Y&CP:;LE1W1$C!/(;89\1+@I0((NW'1>;1-<0",N!@* -M,18LE$D2MT98?`D`/`$``#P!```"````10`!.%"M``!`$0``P*@!`<"H`0(! -M]`'T`20'"6+'!E&KTC346XPK<5>P.K\N("0(````!````1PA``$`Z;Q*RE&I -M)9!]:R")Z/"3V5%<*.HMJ(,9924_XV-:4Y08,B@G,^S?88_=7DPN/?0JZR7^.6A/T5M*,N0AA/ZL9:?P82@7 -M9?[F:OCKC5?SBV;5SZXL6 -M?<6Z%VKP\N.M]).:RG(>B^D(-%C#_602GK0;`V*/&09_UY_+.K -M+;Y1<(!79;'; -MG+K-D+`T?A@0PEA"@8A@"5O?WX6821*W1K^("0`<`0``'`$```(```!%``$8 -M4*X``$`1``#`J`$!P*@!`@'T`?0!!`?I8L<&4:O2--1;C"MQ5[`ZORX@)`@` -M```%````_"$``."O=%$RJ!V4?\($W/*8WW,,6BA)Q,9]Q9Q.2NY4Q`<%M'P^ -MJGVA\LLUPM%^[?KMD7S,U,9*DY4,#BIVA570^;SAO80Y5:]3K:R^/ZM.MD(; -MSIR2XLGX11G@%B/**6$H_"2[M7OE^%?IJR<'0KO26L&;LJD\BNGG.J#J0V6S -M`U"*@]BQ0F9D*PK-;WM^$OU6J*0?,6N`$.8!/%!S=S(MYSQ7#Z_;8@+FW>== -M\Z4^<[@,Q23G\6^IR,MYTKR#A7/OM(&GA>W"WAB\-=-C18E>3?\Z#@U>CA2. -M\N-H[`VFJFU[K/42TM*//,1$OA\:LW?(E)Y-_41A>[9]*)0V>!^UE:IT'DJA -M4Q78(FFONVGR_:M+'%C$-J)*N6LQ=@*`NH55C^?X8)`CPF&`:)8=IQ'M9K#B09"2NT%TZOX$O[T!PK#40N?U++=]9385A7WZ#]5=J'>'/`26$^$5K -M?X`(XC.N0J"(SNE=Y%QKPKSD44Y16ZG(O9)(IHU:6?C=ZS-6S!Y372ON);Y- -MU!ZGSITW-'[RP\@,D$K`21*W1CC8"0`\`0``/`$```(```!%``$X4+$``$`1 -M``#`J`$!P*@!`@'T`?0!)`<)8L<&4:O2--1;C"MQ5[`ZORX@)`@````&```! -M'"$``0`2V8W;A4["Q%\HGH=L?-NF)+TOL5;*MI!H/GDY(K/T\5>1U>0^GEL- -M#PL+IMW;T::V`?#6LXFQXGJN'I0/^OV#/15[K\0X9N0A?73,F7+2W4&YECI9 -M!W"*O+L(_WA][0ZL(3PV1"-A7VGE*1#JL.`D]4K9',^%7#;3=44_%E&PYVV( -M=G>^3Z'@DU.75]01GDCCNB>H>!?+=ACPP_<^V_T6*^4IU<4]KN&$G72$=]-O -M)N.T`MA=`?-%;TP;ZAY]\4)>IK-[SC`!V2$&\!,>\&\9VQ[6+9=NX8('6_=Z -M"7I0`I34YA7FJ0+)OQVY\,JJO*;S?UL.]TA/*-SH54Y)$K=&U.,)`!P!```< -M`0```@```$4``1A0L@``0!$``,"H`0'`J`$"`?0!]`$$!^EBQP91J](TU%N, -M*W%7L#J_+B`D"`````<```#\(0``X.A+#-21(8T_,R)8!_6UKNDE=$!G-WBM -M)^UWB_SF_!"<%MU._'_W)3QT!%'(^;`U?L@ER#YC&B<_4,W6;*(E'W[T_:#G -M$Q(&%>VV4$J&E/)"F-A&!@A,A26Q\.DU.3#VH9F&@KDYI_4529$&4G7L7?2W -MXVD+T%@D;2W:#>%-Z,89Z.3Q:>E'VR.C!7@^,>0:B@`))7FG02!GX5[YXD!P56?X -M?_A3,_?>EG/+,M6T9Z.R.XXSS^^A+!@\O% -M2UD0)GV!&I1$90R`$Y(F-"=&6.0I3ERKDD3A[OV:"`2>U-F]8(WONF;/*^#R@?L<00;)"RD=Z"^MW+5DCY(&C9) -M$K=*`.P```#L`````@```$4``.A0M```0!$``,"H`0'`J`$"`?0!]`#4 -M!KEBQP91J](TU%N,*W%7L#J_+B`D(`````<```#,(0``L`Y92SJRPJ`X8:R7@20AJQ6@@ -MTAT7N:$33[!N6WL.I%'Y7IF_8IUFLPU9LD3Z'L"^CO,W<)S:[\3":P=1'<0" -MS7>?T?G`DN'HJO+U1H>Y90@.YW3T#(#;!Z9)$K=&##P*`(P!``",`0```@`` -M`$4``8A0M0``0!$``,"H`0'`J`$"`?0!]`%T!UEBQP91J](TU%N,*W%7L#J_ -M+B`D"`````@```%L(0`!4`G20@T9&A+[6U4[ZD9/=B'@8,H1LYH(G2U$YME_ -M)1;8JYE@.?.A=%6H%LEK6763,L*Y,6&`'DT@V(KB`O=^$@7_2U,2C&L%&SH8 -M*TNKP3U_%E1B(5B=R&7+=P=J>#^(X'%8D.0#A"#KB1ZQ<=*]F9_$COXR=3,N -MR.&JJKT3@5#CU:)Z6_]`)/;[P1_B]Z-1"WC$T"#J,MI*L?WK/AIZ5_%[CV6B -MMV3V#FO!8LMHZ*4KJ"?&X3P1E;;$$$KM<1G$O.P8*'('D&M%3AA8(2;JYJLP -M?&;=S!UNM#"#"OG^2<[5ATO0U2M)6+@!./[YXZQ^U9W6AV!`CC1N+S0WO!V: -M5SMI)\JS,+>P+=3>IT\PQ]8LE\4.!!-0&`@!*8052M/,O$]P83L3]\G$^T-5 -M7?W")?L(][L-EI)A[.>[\'?X/(;;65^!_!_L=>C)A&QM*Q]<0RN%MI[4.Z,@7?QAO(M!2TQL\I.725"6/739^6F#")= -M`OYJ\?PVY>3<`W^Z-I":A$J+5H=MVV['#[@PT+3(\D!" -M/!'FNA#&O&<*C#^5BEJ:6W]$V61Q=I(7!C_FO&ET]#S$M>U=;D!L_E9G!N(# -MOP"FZP#-D0W'&.1]*&QG^;UW;"H2-&Y`LXT,$.)::W;IDG-'ONF&0G/^`3-2 -ML,#/MGVXUC/:`9)O2-W,$H<9]-S89XN_W5E5CN%"W``!`$0``P*@!`<"H`0(!]`'T`&0&2=W"7R/I -M'7BN):.5JF63PK`N("4(`````````%PJ``!`L^-SH?[1A!*XEHY6J99/"L"X@)2``````````3````#"VXB!/#8!REPKPX'_, -M\%;)_0-N-1$:%?1&]#4F7OT2HHU()#"[<==;C/`[\DD2MT8LLPH`;````&P` -M```"````10``:%"Y``!`$0``P*@!`<"H`0(!]`'T`%0&.=W"7R/I'7BN):.5 -MJF63PK`N("4(`````0```$PJ```PQ_J0_(@_\LM6K4G706DA7JDA)M&%?G.M -M!R"=S_7U[[,X9WZ,14Y@0Q6N]*-)$K=&9<`*`&P```!L`````@```$4``&A0 -MN@``0!$``,"H`0'`J`$"`?0!]`!4!CG=PE\CZ1UXKB6CE:IED\*P+B`E(``` -M``$```!,````,,M]-S]_5?4\PVJPC=O[YQ+T)ZD\-9G!9>*K^1W'Z"(!`'@` -M``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``4#WVR:!^`;1.)%:4 -MF=`O.LA>5AIJ'L)678D.]S<@Z.-]<@KA7?%$RS7I2]&+C3O",$C735LM>\`E -M]AN%AQ]JV@A2TT0+3\#O\2M@920;338+9]@I?V:H(,$.*-R1W_A/U8->L9\Z -MV'$1?ZG]90>R^_P>%>P!%;Z&#&?;,._,.28I```DHEI,`'7%MNTU>J_,V9`W -MW^/P;$.=,P-^"A\@M^BS*-PI```<``!`!-YOVH.?CMB>-V;/`L+E3;Z#,Y#2 -M````'```0`5))Y;[+K)5AIJ'L)678D.]S<@Z.-] -M<@KA7?%$RS7I2]&+C3O",$C735LM>\`E]AN%AQ]JV@A2TT0+3\#O\2M@920; -M338+9]@I?V:H(,$.*-R1W_A/U8->L9\ZV'$1?ZG]90>R^_P>%>P!%;Z&#&?; -M,._,.28I```DHEI,`'7%MNTU>J_,V9`WW^/P;$.=,P-^"A\@M^BS*-PI```< -M``!`!-YOVH.?CMB>-V;/`L+E3;Z#,Y#2````'```0`5))Y;[+K).LE"LA("(@`````````3`B```P```` -M+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"( -M``(``'?#,,&806=XR]6,+;+IMH@T8@+M*G@"0,"P/J&=0'BFXSLU-1$I_ -MN&7%!]]O\*.3--[>;ZO,!U?"N<-LZ2`?[@N`WA;W-29`IQ\HGMMFDB4[2+;6 -MV.W^G0_N0`)M<8%H9`UTE/LT.M`$!=Q_BY>WF83O,J)\H:*9S3<\%5M]*0`` -M).L24Q17>9$#WZ,"`/4[+D6B&:VU#="+;[?>1CM0C2[S*0``'```0`1A!`KU -M;9"X1JXH1=<-]1-7QW\6S0```!P``$`%'W\X5T7JNJ,=;C\[R[#FNEM7CYU) -M$K=&IRL,``P!```,`0```@```$4``0A0OP``0!$``,"H`0'`J`$"`?0!]`#T -M!]DS?;_:R!8^!Y;/QQRD= -M$PUGV4694_/Z[M/+[V$Y@M6&Z9+AP\- -M;B8M473N/6:%`*&I'Q68P_U-J*=$9_/ZD-7WW'W0T6?,ZRTJ&7&.LE"LN(",@`````0```)PD -M``"`DP4VC&;;WO;A5:RJ2LG]UM;,%SKA0+VL;RGRC.4&B/Q*:]4>'"_SO..C -ME+O?RO+]0P?)1I1MWP(%_SZLV5N".W^E0'44/J&4(/1O3BX(#0<3GGRZD>D_ -M0#GV8,0.G:S/W.LE"LN("0(`````@```/PA``#@K%(M!K+4<$@,SM74CHG`LU`Z -MS=L0F$7Z,X@+OWG]71A*V1^L.=T"=L]1D#-7E0?HA$%3D_J=5T($PR-35'9` -M3<2WF(+/'?"?OI$^5*E?W`CY?;)WUC[/`!;[KAN(PF?C^,(?G>01*D? -M+GT3I,!R&T=#PTI'!L4[IBG[!XTPK?G>#H\QG%9;4-CX7W0U\8G]%%W^/]'4 -M7]!O[Q\V9>;S2F5PN;Y1$Q)@)GS%V;/F$RV25G53B8W&"%?H-?];HLPD.LC>^-X18-SEDMK=D"YLTD2MT9L;PP`_````/P````"````10`` -M^%#"``!`$0``P*@!`<"H`0(!]`'T`.0&R3-]O]K(%CX'ERP:!>.LE"LN("0( -M`````P```-PA``#`G>YD/3''&A/P)-7CTV>9*XJ"/,@?:+?AJ56MI-K`NCD_ -M4E^=TQJI$LL5WZ[9#:*-]'LN;:25308T'CCX4O^)`[C*ZIO4K6NY"LF(0O.[ -MC_6@8BX_^4ILBR%M%"TQU3JQ(V&T)D]$1(!=K4N-&J*#U?DT?:IPF5P:MLO* -M/"KI!>A,1/XTH`!+<`&TJ';ZU6/IR_6^Z-OB#R0-^P21"8A&\&M)V6^53C`- -MI7Y\,QBP[&ELA&[GA>"Q]R,;R5#`!L````;`````(```!%``!H4,0``$`1``#`J`$! -MP*@!`@'T`?0`5`8Y,WV_VL@6/@>7+!H%XZR4*RX@)"`````#````3"D``#!T -M)MX$O;"<@]LN(O79YA&\!*#^]WSEY_TGM/$#8I1.-W3SCK&`ZBU[_"=K9DD2 -MMT9BL`P`/`$``#P!```"````10`!.%#%``!`$0``P*@!`<"H`0(!]`'T`20' -M"3-]O]K(%CX'ERP:!>.LE"LN("0(````!````1PA``$`70H[,PR?$9QXL?<= -MBG01\-?WXR0F%ZD;,8.&-'9`^07>)YWF1^&D;=PD;;;\7JT&F6R/M)0Y#"'W -M#%JEIU0)SU?C5,,0?[%M^%R-P[UQXH3MNWP[LIA`-7&2>&E?TBU@*/??;QXB -MEK+B3GY@ZX'34M(H!AYHVZE)[`$934>=>$Q71'DJT\/@32)S$Y$7-&357*5V -MK=F?TAZU^,8@;'U.GBR/T%ZNP[]D0[/:.[_P.22RN'''S0!MZ<.6C;0=GTZL -M>H>?5NUAW;6:Q?F';/Y:S)::A?F/$9PKGAQ!=YMG>[[Z\;$T&GNZ9)L+#A@C -MSF!T4!E&27`GHI"%U"YX21*W1M:[#``<`0``'`$```(```!%``$84,8``$`1 -M``#`J`$!P*@!`@'T`?0!!`?I,WV_VL@6/@>7+!H%XZR4*RX@)`@````%```` -M_"$``.#2BE"A"Z:,N?.W8K!6,\6-:+4GE(ZFBNY9'+^L#AH=JPS`$_C`_E`] -M[W&%\4\)Z!8Q6^J"VU7M'R[;X62.X@>:@EU.:*%R>=4$ZB4!'!RQANA"LJ?0 -M_%B7SFI7KCU)KA4>IS'*6\D05Q[@9F)G[=<1G#QQ.+5!;&].WF;=8$".%(1`"W#`+N%N;L7?OO96'?(F*&NC_W"Q.'H^=NP -M(1/7CB#![R3Y(QR7N+DL:WQ2ZSIGLXD7$FA,1KM6"3)N`FUYH-K,1+7%0O]8 -M21*W1A/+#`#L````[`````(```!%``#H4,<``$`1``#`J`$!P*@!`@'T`?0` -MU`:Y,WV_VL@6/@>7+!H%XZR4*RX@)"`````$````S"$``+!`7%IFO3`SFB22 -M\("`/=IE-R^_T0*I?:KK@"!ORXPP@19EWC=@7Q`S#8ABM0JH$N&=+DT_JM/L -M`H"NEU1M5-OYO,+'XPP5)I``6ZV"433&`V?\;$N5L2\@T]*Q*7YD70K2+&^L -MO+H0=4.9.V>F&7+!H%XZR4 -M*RX@)"`````%````S"$``+#'T-T\JN%)5(&]OPDO4)Y>1=!X'/:L!5_H<$M\ -M]!U9BTT*<$V&\XQ0P7Q(YB\?OTW.6GRO2$[B94MM[?J4:\RC&1<`EW;&Y85S -M2G&J8Z#.KF\SUUZ:E@V!MOBHXN7AL]1DQM"\W6<')SNB'D./0A[@!C.WLBV$ -MXM7+!H%XZR4*RX@)`@````&```!'"$``0#P -MM<+*\C@TW[%81[F`BYEK$P%X6RX6G;_>81R1?TK1J@:!")KJ@8(,/AGS6EZZ -MF4Z,2W]Z-/&=\\%#_')I"8?_+;]I8VR[,DX`EK7"?_ET$'ZFN:C[J1L!U'R6 -M>PBOY<7="`B!G;4H@QW4'O^$?[&\H'.RWZ1/BNF`44R0\L(T_'\H&52.9EVE -M(NF.RQ'H\VG/NWDT+H1FQM@51KQL(`VY5QCLY'[N$<4M1U$"PW\"U?QI6HF_9$ZQW:.A$",#>]^A,LLP#K*U\<%6V^A,CM`T&& -ME_RF2I*G3*C46D^4XQ!)$K=&RA<-`!P!```<`0```@`` -M`$4``1A0R@``0!$``,"H`0'`J`$"`?0!]`$$!^DS?;_:R!8^!YH'NV1SY33[#G9YV[3,QO+&'&GJH*XS;6 -MUO"<]`:/[9TH52D/DRN+6V-SZ`2R[OJ+S#!HU6R7HFHWYU69$:Z9=GX6;1[[ -M,YE+ZB[EGSQU;75QT3G*G,\E"JSZ[*,'WCPP:'#"(EZNTF+%R*GH!.:UOS-= -M*G@R=@3$GK$J;M8NM'D,^ZE5Z="F(IY?UKP1D40>8;Q7ZH*]XT34L]%-_VST -MTFK4!BK?*K)?8+8!3$I%]J_6IWJT+PIL':<)D8.3,'0>:8M=A -ME/B6T'#&8O$*,NTYC[9B]:ZK+0&Z:4G%,7-?C#K/!< -MWNUG#\/6Z$;CZ+6(U!/82PN2.;K!U]N;-@""O7ANDO6+YO/RVS])$K=&G$D- -M`.P```#L`````@```$4``.A0S```0!$``,"H`0'`J`$"`?0!]`#4!KDS?;_: -MR!8^!Y4JE -MYNW/;=1E+W'$W:*5WY3)4#$)XO$W9>@0"1<3G3K0:?YMCHH!/ -M%N#6UKF8`HKL?PDXHN^SX0ER]NUOO^QF\-`(P!``",`0```@```$4``8A0 -MS0``0!$``,"H`0'`J`$"`?0!]`%T!UDS?;_:R!8^!YRA(,.WS.Q#O83+$Y,HN7B<&I/JA9>TS%]>62W -M$;6HH#Q$1@JR0>=/5CKQ$5*^S*CHW'-%G*VW%_]M3"[;B*YC.KOTZ9( -M:YX/+_N3+LLW9^#7:9%H7G$K>0?Y7+!H%XZR4 -M*RX@)"`````(```!/"$``2#]#RAR[V8&R($>5(XK$7,@:@Y.Z`S"^%@DQ@T* -M-YEEO/9OW*=L:8V-,`],A9>F&#\YO)%+%O/%+*:?9> -MZT<>3R5>57MN*^Z4CL9^49E2E=[#\X>OG@+0>;=QW:X;D;N!B,J?UD&G1^=N -M4T/B+-HMH.T[GG6+.;D:+&.^%SKD/HX_J>1=M\TK3%)N)Q1'^J/IT;\$;BR* -M/9D$JOIRK;31DT1II8Y#P_)?'>7%^ID'G3P]1T_F<:)AM=A6>ZD'>6D0)H6< -M<(_JI>@J+E"AM3U:X2*)B^//>GSS'FO8TK?&7L_ZF-._)PJ!+U[6/\1D(L@- -M9P-N*_+7>']MX2R]GB)L1]9&-YHTL_P)Q;4'Y]G%.DD2MT8?R@T`?````'P` -M```"````10``>%#/``!`$0``P*@!`<"H`0(!]`'T`&0&2<@29T@>AC)_(13- -M;6?1U98N("4(`````````%PJ``!`(%0EH>:'!-VO`>MC]9433A$>"K#B/;E( -M1H>T!=O%R3GT3G@/BBYX7$:6.ML9OW-JV?'N)./.3#$F/,P<21*W1L/6#0!L -M````;`````(```!%``!H4-```$`1``#`J`$!P*@!`@'T`?0`5`8YR!)G2!Z& -M,G\A%,UM9]'5EBX@)2``````````3````#"<9698K#W!FF[$(_U_&)P2G]5@ -M8*)43A%/I%+:(1WVX\0BIG`]*L1=^TD2MT9[Y@T`;````&P````"```` -M10``:%#1``!`$0``P*@!`<"H`0(!]`'T`%0&.<@29T@>AC)_(13-;6?1U98N -M("4(`````0```$PJ```P,(C6=RX6/T9!-I:VG71NF&#@VB"("`'@```!T`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``AONM?&\&1"`OI+Z:-!>54VL" -M/:/8K13\YJ^;!W=_AXZ87Z31[`[GK$PO("2N__0CTV-BR>HC6C7$?]@SNQ0LB.B*5?ET%H`H)Y -MF`RO/X=V_Y3SWQ4:O"+"_[$.Y>4I```D#3]XAOAZ6LA&A@98OH>)/J)RF2B4 -M4=M<-FR"`'ZS%N8I```<``!`!!H+AQ#3F>_#A]8U.N=7L1ZJ['2V````'``` -M0`49@G\&C>YHV6`T/5UFH=E(>03A]4D2MT9L_0X`7````%P````"````10`` -M6%#4``!`$0``P*@!`<"H`0(!]`'T`$0&*9HJ%I3W+1E0```````````I("(@ -M`````````#P````@``!`!@````$E^RJ!Y7\\WU8K1%;6Q'WRPO\[K$D2MT8/ -M#0\`N`$``+@!```"````10`!M%#5``!`$0``P*@!`<"H`0(!]`'T`:`'A9HJ -M%I3W+1E0```````````I("((`````````9@A```@``!`!@````$E^RJ!Y7\\ -MWU8K1%;6Q'WRPO\[K"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``AONM?&\&1"`OI+Z:-!>54VL"/:/8K13\YJ^;!W=_AXZ87Z31[`[GK$PO("2N__0CTV -M-BR>HC6C7$?]@SNQ0LB.B*5?ET%H`H)YF`RO/X=V_Y3SWQ4:O"+"_[$.Y>4I -M```D#3]XAOAZ6LA&A@98OH>)/J)RF2B44=M<-FR"`'ZS%N8I```<``!`!!H+ -MAQ#3F>_#A]8U.N=7L1ZJ['2V````'```0`49@G\&C>YHV6`T/5UFH=E(>03A -M]4D2MT:&,0\`4`$``%`!```"````10`!3%#6``!`$0``P*@!`<"H`0(!]`'T -M`3@''9HJ%I3W+1E0+9^$52]QUWPA("(@`````````3`B```P````+`$!``0# -M```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``&IE -M9SJA1)P3\G_Z?>-]ZIGFQEV:LH47W9/T%P(826=QM1A3BK*^3G-IJ'&N=0UE -MLLQ6]LH;U=KSA3:>N/EK>:H)#11M!#AN,Y:UJ#U_+59*91SIJ[`?V(3D#1;!3AL!2HDJB0*0``'```0`0PZ7?NVEB*V.?[ -M_5!(:LCV3.P6>0```!P``$`%^`(0=I'E3W@`*8=F)%K/KSG#>I]*$K=&_1T` -M``P!```,`0```@```$4``0A0UP``0!$``,"H`0'`J`$"`?0!]`#T!]F:*A:4 -M]RT94"V?A%4O<==\+B`C"`````$```#L(P``T*^<8?!]6'_X`YV>A.R_I-;9 -M%T`M`-."*AHNTIK*`]9(@ZT.,W9*]P[JG34WN@'$)#7 -M`T5%Z&.&2CEF_@=MBH9TR`MC2A@@=*1Z=Z*8Z"W8XMYOK-UU!14&V*+N$BMN=\;L5, -M0J9&_/:"5DH2MT;6-P``O````+P````"````10``N%#8``!`$0``P*@!`<"H -M`0(!]`'T`*0&B9HJ%I3W+1E0+9^$52]QUWPN(",@`````0```)PD``"`$9VN -MC'_-'DJ>YDW)ZN)^`_%N/`0L.$>&>YJ2!JWM51V7X)[TX+6`X%*U&C*!U#L0 -M(F/K,'^;`SMO;A^EA3;^6K;X3SI,Z5Y;Q.5P$TV^K\S>>*5K1*$OIUH## -MW;;O:0'RQ%&703W?I(.US^DUX7>4]L -M<2GE?/<(/=V<4@MAF=5@9\0HC4(QERBK\9)34=G/;+5U!G\R/1_+\D&6>/LH -M-P.@QK_3MW%*9#&%S2>%Q<7@\O#&4HR;TI/^,W"U`7'K.03L,Q2KBT%P\AF% -M^=:C5`D(XT)_OV@G;-*.IVS:YKNN[C,A>3O%-%ZMG*@=]W+,GZ!LRP&7]*1, -M#A&3!8G[L9[\&/9<[C>VLE/AVM_KK3A"85C4UJPZSL8$H14\Q2_(:C-MF'50 -M]UZ[]&>4_N4F&MIY_T,Z&4H2MT:T8@``_````/P````"````10``^%#:``!` -M$0``P*@!`<"H`0(!]`'T`.0&R9HJ%I3W+1E0+9^$52]QUWPN("0(`````P`` -M`-PA``#`:!)B=-8U_F -M06]G.MSU58/1]D:,9]EW6(^Z?' -MIR)-2A*W1C^)``!L````;`````(```!%``!H4-P``$`1``#`J`$!P*@!`@'T -M`?0`5`8YFBH6E/`NB -M&/S<=%=G\D)(=DI=8?Z.*@K8U9ETO6:ZI"78,&!R\^+AZO6>^PLH3Y/R04.< -MEK'JJTX'\3L`YN[KO!>V -MU6[1-Z_/GR994A(2]AIIN1XC7`6S"(9.VB9#)40$:X>>_5!3XMLW6$S)34.X -M.0TVI&RRI,0A"4<\<).)$O*7N@=5$LP\3,+@_\';O?%U']?=D1NHDBO6;:[3 -M3PL63I%'&!!%(@X),MIIG)AF]R`^1PRD3*G1J8$">P<9AI[D4-*'1K',*<&9 -M&Q^?G?"[%K@72A*W1K.P```<`0``'`$```(```!%``$84-X``$`1``#`J`$! -MP*@!`@'T`?0!!`?IFBH6E/:`6*3]IE&JF]F$1WZP[UZ9HMRB8"Q*5ML@\;>ZMD;WT=2_[U96B;A&FG\'[.E6=@8 -MI6[M/B@4B9]FJ#T=^7Z67?B,?3=_XEJ^?Z[E$H8H"_1=N4X-2=')JRL[5F$% -M]]8:MV:G\>1/9ES*Q39%[TZ6,SHV+HI.36* -MB/`:;#;6[`0#,:,$R=B1^IW/ML4X/CB1?.&A]H'COY')W,'SQS`A2A*W1J?` -M``#L````[`````(```!%``#H4-\``$`1``#`J`$!P*@!`@'T`?0`U`:YFBH6 -ME/S+>,NM`\VDZ6T'$)[X512D^]0MN;8];IGLD#7V^>B\3G0O?96$".\G -MWV)8]C;.-X*K9?2!>!2250?;*F.-]7F_^[:<8U>%3?T=\^_:(:.!T'K)T?-D -MF(9N4O,BXHIFO6)"(]\H)U2A*W1BOC``#L````[`````(```!%``#H -M4.```$`1``#`J`$!P*@!`@'T`?0`U`:YFBH6E/BP*S` -MU@UY?F?YC9JW]('AZFV>L(>J>C27ND4A]UIE!8A#LI%V2]EC44*ZRF&3B-=# -M<0``,@"K1,[(HUVSP[N,J[?N-[@:-<87+?B`UB.G4\)2R-]O!&7E\;\ZKJNO -MZ13)N*Z$*PM2J!TC,51),(D>$L!XS%U$SZ(#@>7&LQ\_W.D.[W\0-[PK9HRG -M^RO:2A*W1@L``0`\`0``/`$```(```!%``$X4.$``$`1``#`J`$!P*@!`@'T -M`?0!)`<)FBH6E/FKC=FS:4K5W!T_E.$&3]@K$EC)#8\L(2A\F -M?I@>+T^U@. -MN0F^,L(O-N-Y4?]%\6K9!J#]%Q!F&YM1)6B[20*[+)>>U_> -MZ>P.UQ#PSV+E(#1E/=J0E;O=B?CRE@L.4HM*5B/'D2UW.EV^_%KJP!\^&JE) -MU)/,/S7*2$?.9S9Y*$K=&^3X!`.P```#L -M`````@```$4``.A0Y```0!$``,"H`0'`J`$"`?0!]`#4!KF:*A:4]RT94"V? -MA%4O<==\+B`D(`````<```#,(0``L!PX?(D0U4CK+)VA"1_#]0/Z<,A*`CY^ -M(Q5)I[.P>E7@Z\:[Q^H560=*<4Z'[<^H<2)<7-$&H-*U6VALOARP_/J;J_32GFV -M6-[!28&J=.#B^`=[97J1Y -M'T2T-T.\;GUC<]DML(/:-YJ#KI'>0:U&K1G-V)ET5 -MS8UP];D%).5VNCWLV/[2+">K"J0=3=UX\59:ZA213TQEGM -M9B*H6FRB^Z`KR"C?7F&U&*Y`F,AVYVH7S^@`-W.'^RUWP\ZO9>5*C/9B$D7* -MQ.YAXW8<>#=OZ[96'=&Q'?431ILXS>C]]W8)DRQDE<;IV-55(7\V6&#!*#L] -MGR@2YJ`]C\6?85?)9D0?KSIO/O/A2A*W1J.9`0!<`0``7`$```(```!%``%8 -M4.8``$`1``#`J`$!P*@!`@'T`?0!1`A@4(P,WG\CGS4&X1*R`<^"IZ1LCP7YFJJ#?(/<29E(B=I=(9]C52W^7AP_H' -M3D'O2Q^U-[B-\YS/H4<78I`$>"?29OJL?4H2MT;9P`$`?````'P````"```` -M10``>%#G``!`$0``P*@!`<"H`0(!]`'T`&0&24)6056SEN8$R/N^Y).4A'XN -M("4(`````````%PJ``!`!/4$:R%8+'G)<`A_S>DV%&S5@?XN-#L5=_4U1M1( -MDY-)>GIO/<.#7\P!>!7A^Z!*'3=49+FS8[1*3?]P.EB, -MGC[>/FP<\(!;OIB\846ZMKZU[4H2MT;FV@$`;````&P````"````10``:%#I -M``!`$0``P*@!`<"H`0(!]`'T`%0&.4)6056SEN8$R/N^Y).4A'XN("4(```` -M`0```$PJ```PH5QW!#;&`78S[D'SS9L&L?T):86]4;/9!9$1#!B@S'SZR8A3 -MHBY?OCF%C$I*$K=&TN@!`&P```!L`````@```$4``&A0Z@``0!$``,"H`0'` -MJ`$"`?0!]`!4!CE"5D%5LY;F!,C[ON23E(1^+B`E(`````$```!,````,*)< -MYUUON?^+NYWA?/\8>-PO*><'@MZ#1/)OZ"N$3-E?2=6!%M;\-8+A!=462A*W -M1GWF`@"8`0``F`$```(```!%``&44.L``$`1``#`J`$!P*@!`@'T`?0!@`=E -M8RT0C"(#`'@```!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``UP7*D!WA<.F*3%$U1(QQQ_)S)<;K_G"9 -M:F$&W?2@_=-BP%P>ZJ(?Q@\70KTKI.?E;CSDVO!9QW.`?1)"6W42D.LRYFW. -ME*/ROBX!!DJR]31':PY,;M$A$X"MD=9N/?G]\0?R)"N790!0AETS"KWG2+O* -M'2,1A4YF-%P!-X;ID/LI```DW!]MW1YY*&D7SP2<"Z`9$'3$HW#L]:1XL2L] -MQ;7+\T8I```<``!`!%(U6RF#8E3WC^NZET0*_"HO<"0?````'```0`6]U93K -M?;4#0WNE\W\NB&@!*T.GZTH2MT;O]`(`7````%P````"````10``6%#L``!` -M$0``P*@!`<"H`0(!]`'T`$0&*6,M$(W.&TR@```````````I("(@```````` -M`#P````@``!`!@````$>6E)("Y]A`W,1L)&1;R>MO4).3$H2MT:?!`,`N`$` -M`+@!```"````10`!M%#M``!`$0``P*@!`<"H`0(!]`'T`:`'A6,M$(W.&TR@ -M```````````I("((`````````9@A```@``!`!@````$>6E)("Y]A`W,1L)&1 -M;R>MO4).3"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MUP7*D!WA<.F*3%$U1(QQQ_)S)<;K_G"9:F$&W?2@_=-BP%P>ZJ(?Q@\70KTK -MI.?E;CSDVO!9QW.`?1)"6W42D.LRYFW.E*/ROBX!!DJR]31':PY,;M$A$X"M -MD=9N/?G]\0?R)"N790!0AETS"KWG2+O*'2,1A4YF-%P!-X;ID/LI```DW!]M -MW1YY*&D7SP2<"Z`9$'3$HW#L]:1XL2L]Q;7+\T8I```<``!`!%(U6RF#8E3W -MC^NZET0*_"HO<"0?````'```0`6]U93K?;4#0WNE\W\NB&@!*T.GZTH2MT:[ -M*`,`4`$``%`!```"````10`!3%#N``!`$0``P*@!`<"H`0(!]`'T`3@''6,M -M$(W.&TR@;9-$#V0,[W0A("(@`````````3`B```P````+`$!``0#```,`0`` -M#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``!B&Z!X^AN'Y -MC2QQX-2;A$+I\IS!7W3!9O^BL-YI9U1WW:GC[M-!7*9,=8!AE@/==^ZW]YQ#7'2,7MT#?6&FR\I`F -M2.DP<33F/4`+WVB_SW)J+N3 -M;RHY/7CUWUI$TO34>-;^GFMY`:^4*0``'```0`2LW"5#R1>GCRQM=!Z"/2OA2A5UD"KPO$DHI50(9 -MM1-N`XCHTO1VC9&:P@8W0#IT:`HQH>,>EXI6B]!^AR8!P.S!PGG!!_?\:IRG -M'Z8MDB)=*&:)AZ?"OM<=^3BPVX?W=MJ(*EIV_R3JTO>,5Q!>W(9P[+[NYXJ+ -MMDH2MT:F;@,`O````+P````"````10``N%#P``!`$0``P*@!`<"H`0(!]`'T -M`*0&B6,M$(W.&TR@;9-$#V0,[W0N(",@`````0```)PD``"`&T\0%+\!#HT< -M%WH?H+06%?N_WD&X%:.W-[X`S!'&Y]IGSI]F*ZT;HRO)[J+7OYZVP;+M__23 -M*46!/4-+P-C#@E'@$C'5LADQ^SPS]9X?-1LCZ/=M;`I]%J/%32KW#6F(J#8Z -MRF<&*2[6>;QS;XY-\`A[&P?O=7+8&IRW[DH2MT87C@,`'`$``!P!```"```` -M10`!&%#Q``!`$0``P*@!`<"H`0(!]`'T`00'Z6,M$(W.&TR@;9-$#V0,[W0N -M("0(`````@```/PA``#@TTB4NL(87XS+:#1\9GQ2/_-YB$?ZC(%L$FC6D&(/ -M`83.?"87+<4];]J=P'#KMX2-[U"*E/X*!\E?Q\S)'>"WI"$J+-X,!4IT"`,! -M;]:$,8SR0$A=`&'/F]@)KCG#YFHN1;].S,QL7[8`(SSIG,X%<9IZXP0;[E7Z -M+P0A[B:>TVG"=M.RPGN#PIBU%.KW`EMGEK3H3EEEW!P^>;34C^-I*ULU&9W@ -M`R&UI*SX`=3!``20Y>[A>IJ%=S#V#,R$-7*!`*+6IDV2/+'BT$3^)(B#)//- -M4=-LA;+')!(CZTH2MT9:F0,`_````/P````"````10``^%#R``!`$0``P*@! -M`<"H`0(!]`'T`.0&R6,M$(W.&TR@;9-$#V0,[W0N("0(`````P```-PA``#` -M09)%`YGEAI=@V?I-WJ3`+9ED7PF+N`F -M&9Z3/R)2HT8<;[N&F[8:72S[?Y1;*F$6[<,H=AAPN`FD:C0$PF -M5X)R&1D/Z'!*$K=&JZ0#`&P```!L`````@```$4``&A0\P``0!$``,"H`0'` -MJ`$"`?0!]`!4!CEC+1"-SAM,H&V31`]D#.]T+B`D(`````(```!,*0``,$SZ -MA8E\UJ;?HS0SA95\#\O&Y&JD2A*W -M1B_``P!L````;`````(```!%``!H4/0``$`1``#`J`$!P*@!`@'T`?0`5`8Y -M8RT0CA4!6+ZX![Q634H2MT;KV@,`/`$``#P! -M```"````10`!.%#U``!`$0``P*@!`<"H`0(!]`'T`20'"6,M$(W.&TR@;9-$ -M#V0,[W0N("0(````!````1PA``$`4T8''P@/,W#]1(_&,Q]Q6#TCYX0B*!MN -MO>8_J%36\(>)+;X`3\8]^:7OC=;M:P'Y*Z -M`O!6&K]T[)SK"^IKX4R+G5L:CW-218[#/^4+$V!BV/=7,28P0]S@KWM+RQN6 -MFKVA7S`@@MBE`G\]HUG/K&69A(1(T -MH!;72A*W1OKF`P`<`0``'`$```(```!%``$84/8``$`1``#`J`$!P*@!`@'T -M`?0!!`?I8RT0C3FOX2A*W1C7V`P#L```` -M[`````(```!%``#H4/<``$`1``#`J`$!P*@!`@'T`?0`U`:Y8RT0C\N::,,#_A!# -M383)A$31$K&5BWWAKA!B.SR!-6Z'_%\0I_<^B&:6E"*9(\D:-SI0BQ4FYIS. -M[>^9+S`%+,H2EZ&/,:A[!"_+^P5/+XU#2(H&$W.8+23F?QLB_L` -M,T:,"&]?9G`IN?B#";\H2A*W1FT8!`#L````[`````(```!%``#H4/@``$`1 -M``#`J`$!P*@!`@'T`?0`U`:Y8RT0CX%%IU$3+?`^+5-C5[9' -ML"DJ*A6Q,\]F+>@]%4:5+N3P[V#TL.!*,-D@ZFOYZH=`]/>]K\ -MN<3/Z5*WQKS,`(RQ1L;@=*`.#B2A)NCW]-]9KF3NLANQ:;]FP/?%R5LM>EQZ -MAR9TW"*_$LB!V9VV>Q:CC`24X8OT53'\>HPPBU]^NW/S^6&#R+#_:;?\2A*W -M1BPV!``\`0``/`$```(```!%``$X4/D``$`1``#`J`$!P*@!`@'T`?0!)`<) -M8RT0CC:*%;1&K%MT_A*\'-9>_>B -M0.>2HV2BP$I'=(F?$*:ZXGM=`00*=%"))Y$"CJ:VTN6D3J+ZX")2DAXHD&X) -M9'-.1J@EZWX9VO071U(VX$7ZX&7VFFC7CX_8L%`:*NP4:@7M69(U7=_^`^TZ8LLSTMY$M&M:@WY9/8*Y"-=^.M[-) -MNYG75I&OUGPT0HIV&K=*$K=&LC_!PC`XUCS4M5$_:0_$!\D7I!(8^-HMXP/GW6K2DA;,EJI)2 -MZI&:(!?7K15@,_T_:WXJ0J98TDONGY`EE&38&".#MY:1O9]YMQ"H4!FRD:"` -MG9$>TO`E:UT.8@.F>=IY6V9_>G:TBHS>,J/LK>3+X$FBS3[SO7?3`*WI9>$L -MY&/R5Y45D%,W#%5C4MBSN5N@"MTK)E&4/WM%%KTX^L_?>\YSF@=._V3+]P[H -ML\);,&2O\9]\@$7'* -MV/!85@9UP:E1G#>H(/`@X@T>UL&89T&.";U<98JSZ>DA+!/D#H8QNR=)F2WZ -M(KL5"9?J6@44>6#HW29;\,?;$AS))>N4`5P;*[+>_W`/;RN -MWQ?[$``;CG),NW]SOPUNC>`;0!P:+8A7 -M$G=*9X7@FG-*$K=&I9H$`(P!``",`0```@```$4``8A0_0``0!$``,"H`0'` -MJ`$"`?0!]`%T!UEC+1"-SAM,H&V31`]D#.]T+B`D"`````@```%L(0`!4,`4 -M\V?TA+A9/J4$5E&TLT$F4V6M(M2+G3X7B#6)`7R+0:W`',)FV8BZ86@-@TUL -M71U\Y&VS;)K(3,+[A%7!%^=.>!,/T&E1[3_"J-GBF=\C#[]<:O+MA6DV?!(? -M@]U2PMCWB&#/"J8JR43,##SX+HKKG7X5M+'P*XM%@![COPQ,>S3@(V_R,1JK -MWIYA7S]]X$,A&1"?ICEW`WU?[J>_DL`X!4N\JKNMHC1%+X;M5;*/AF"UBU$CUAJQ0#4'#*VK3%;=?M9PN;CT%ZC^T8;,F^;('6OI_S-EE$))Q7:E; -M0SM>1HQ3UL=Q_+<+9$A_P.^F7UP1$'I)]$B`$@)H^JCF/Z&JN0XE[(]R'B0H -MX2!KX?V[L;IY@VAKG!UPWXW=MA)V*7(!@]4-]XOIC-9)*)9QEFL\2\%I1!%= -M!A&6Y08U("658_NC>^`)2A*W1G3.!`!<`0``7`$```(```!%``%84/X``$`1 -M``#`J`$!P*@!`@'T`?0!1`V=^=<)U%W\3TQ+66(=B?^U[8`QBBO%%R+%&W1RQ&%4Y^E*+(,?*]]F; -M0U%ZC8EF,44;E%"99OL\'/!7/N8E?4T;HE&/JY(V;2,7J,\ND=-S>@G3WZZN -MRK+;[_IQ":#+U@+4V_2>CAEJ>1C>/D6A?C_X>J?(D$^,0-*@]PTSF6[5+5WL -M@FQE3N+R:DP4H<%LG9=5/EM0[5`Q(+'80"_J$X!MV\)Y;O1()14J),5[S9$? -MUV28#>G:._,_;44=G\R&BTWNW4H2MT:6]00`?````'P````"````10``>%#_ -M``!`$0``P*@!`<"H`0(!]`'T`&0&230'OX^5@P,IX[TAF`QOQ]F(8^#=<"3LLBL`@"5W0I``3CH.,;'* -MHMS7OI#S4+1-Y7]%>Z86B$+(S4,K4*/#2A*W1@`!!0!L````;`````(```!% -M``!H40```$`1``#`J`$!P*@!`@'T`?0`5`8Y-`>_CY6#`RGCO2&8#&_'URX@ -M)2``````````3````#"61I0L.]GV6"(]=ML?++,7-:N)4;!\F:`I2T;SJ/+1 -MO^B"6_RB$SD&^I#M3_3]/S9E0%".0D=@TZ6M?0O*?1-_"7QE)7 -MR&=*$K=&!!T%`&P```!L`````@```$4``&A1`@``0!$``,"H`0'`J`$"`?0! -M]`!4!CDT![^/E8,#*>.](9@,;\?7+B`E(`````$```!,````,)ET<:ZAKKF% -M$>\R7XB!S3=5S]7"TKC#/'.UN+TP#X`;3%RQ93NGM<,Q3-Y:2A*W1N48!@"8 -M`0``F`$```(```!%``&440,``$`1``#`J`$!P*@!`@'T`?0!@`=E/9&Y5CV( -M6OP``````````"$@(@@````````!>"($`'@```!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``H>'CK])-KQ,YFYT?)-$&6-#\K:[#1'*.9(1MB9H<`1#;J\I%;RRY<:^D%)H=^(?M#+=*5P^ -M=>Y5;V2&$AHI```D/I@D;FA0KNKFXW>0XN*A#0-SIX#^U=HR1HI -M```<``!`!!>TT>HGCCCZSQ`P1#E9P7HM2;N@````'```0`4[C+CS#I97'CK])- -MKQ,YFYT?)-$&6-#\K:[#1'*.9( -M1MB9H -M<`1#;J\I%;RRY<:^D%)H=^(?M#+=*5P^=>Y5;V2&$AHI```D/I@D;FA0KNKF -MXW>0XN*A#0-SIX#^U=HR1HI```<``!`!!>TT>HGCCCZSQ`P1#E9 -MP7HM2;N@````'```0`4[C+CS#I97_P"JN3)5IU8NP`` -M`!P``$`%LVU9Z:Z-MK@%9A6-[=9&]1!E -MT;Y*^<7Q2H<%)<0@<2_%Q2/_IGMM4;S9O%G%X5!];BKVJ+]]6"JG!LH/P^$- -M@<+/'UN)>Y*W#SM\CV5G-6RT@D[AVLL3/NO+,$UU"UJ\`1-+/E`!T4E6AU-T -ME(9C`<9"]-.U"R,^LG]F>`G#HQ\VBJ-D<4!89F!W>Z-7T?A:$MNB[4RVDMU@ -M/5Y9%I%3WS^R"%D?DXAL^PN*404TBZD>/PFIR8.?OUC![DX9*3Z` -M)]]%%TR1'^^YP5_?0^$WX#O]%=SY;/1K)_'D03_]Y*SJ.+14`Y+>]G8I)=Z..Q`E]?,;.X.H -M''O=[JRICM+A&5I0,/U<0$V#4\; -M==,$F_,T6D92ZG/2-&(&)&-.E!NS[,;-7M5&4Q2/HD_T;J>J\AA'S?!.M7ZI -M]4R%;=73O=B'"QMV)E&!.%_F@D"*D:B*9SA?":4BO2M,9HF)T]MUP%X -MQU!4^DH2MT8=U@8`_````/P````"````10``^%$*``!`$0``P*@!`<"H`0(! -M]`'T`.0&R3V1N58]B%K\(,R&Z01]O,0N("0(`````P```-PA``#`6[=F:!@D -MY/')$LIQAG?T?FAUU5?_E0G$QV1PX1`H%K_=B-T$*NQ)(^4AH0FP-K=3^Y+M -M#>L0T1F$0=JC4$@B2;[QK*F-1.J<8%*TCH8/L^3%U-0[6Z`ORB,K#T'[O>G$ -M8P*:NX;I?;NF?JU#6.=<:=!WEC$E+NK)2,1T(KW\^?@_BGY38+U9;0*F@)XB*2A*W1A;S!@!L -M````;`````(```!%``!H40P``$`1``#`J`$!P*@!`@'T`?0`5`8Y/9&Y5CV( -M6OP@S(;I!'V\Q"X@)"`````#````3"D``#`&V5%`@)ANNP83A@OM&,DSYGB@ -MD8(``CU;8@W=HGQO@#&J0:E,V]#'(K>^S#A8@1J\_ -M@Q%XA4BG/$5$(-CFIJ$ZX_+_QG.[CS2")D@&BTVNJ%-FHT6N(^6O>UV9+XRY -MCQ%6F54-YV9@7^X>2QP*F?.'C>1$DF*!@(H7._8MXHEQ%):1R@OJ_)V$EI>Z^ZUL6DYN9T,9R+B.02 -MT)=13?QC@G7`&*JGP0 -MKPERB4^L036ZL)GJMR,A0][Z)13`"L2PS(Z*(`;<9&XOC@^(01R;[!!&9DTC -MN!94?7%WIU4!:"2!%:CH\"/,)6>2,!DD8FTKH9GAJ(V3+I@Z8?*RN -M>,ZZ"(GK7\!TBP0L;17JO1757K^.P-(^V!M`1FN3R;:8IGSY]M' -MB-]$YI`]O.0H,])9#JMO$5P)^.Q6,QPXD*[I/]Y7XHW3GEUH@92O<+,^E#^J -M9]6A<1$!#KN"`R'!4!1Z7&N-4:?;+/T^0&,N[_"=<*>,1#"`H9A1>Q4EN'JU07SES6 -M5]9@$"&&.]ZT(]DY"C89(G[65,;#L4]]"A)8X$'U"!0\]G_<4E%]5)]<6>1Z -MNKTLC*7CWRMW336_3.!I.$(]=JASG[F%F3K\_8=D-4$TO.I]G]0KVW[0,JK+ -M&I`".LJW2A%*$K=&:G0'`!P!```<`0```@```$4``1A1$@``0!$``,"H`0'` -MJ`$"`?0!]`$$!^D]D;E6/8A:_"#,AND$?;S$+B`D"`````<```#\(0``X%5E -M]B&Y]L-G.-%M5G(TBS"";&K]SP/VY(D?R*WZ.D$$]FQ#D2\H4>&K42]7F -MVQ=?*\U6X[*"\!4D94*/AR(\;7$GN-;:+HG:EO9=#\`.WC33^6B=EY"%3FM+ -M9!E$]08%+%Z@T[YP;>T3"5J<_>C-"1,X48@X:NCG$UMW,V,A5=O4FLRT@%'T -MPVXRM^+^;2,)Y@D@Z94/:?9>Q(.VFM6M&C-<`QD.JHQT5JA_=SA7_IQ;9R(X -M#\DJW\S!O_J2YNN1%5-?DW-B5X4_A/T2,.F`PDTNCP@0L-[!9\]*$K=&OX,' -M`.P```#L`````@```$4``.A1$P``0!$``,"H`0'`J`$"`?0!]`#4!KD]D;E6 -M/8A:_"#,AND$?;S$+B`D(`````8```#,(0``L&LD5SO,(%M`*X -MEKWI1+C;[_EH2GJ6/YFOVE70@6$_G'F5!,U:7D%_20',45Q`T#'D5H#V8GLL -M=KT@%3&C9_(Z3GI2%2 -MNKHV0-AH(K0+>UKO;:9-$?4$LKID+0$Q?PT!908EI'E`D=FQEZAJ`>]E?!NI -M!?R[]T?5:H"D\T!X]^$V&,C6$$M*$K=&\J<'`.P```#L`````@```$4``.A1 -M%```0!$``,"H`0'`J`$"`?0!]`#4!KD]D;E6/8A:_"#,AND$?;S$+B`D(``` -M``<```#,(0``L+=`M7`O:E4-V[FK)K/>,`FI-JL3"(IB"7EK8XI:6AP^!ZT! -MQP^F6=#Y2S]2O8!O;+6AM?GR7LIJ<*3EBN.UX2LBD.UC+I#1BS!KS;>`A:S- -M,Q9*@6J05R`P@)Z#^&N/*NUGXX'$;5+O^,9W>P4"-""G^*8.<(@#4[!7.N3B -M*1C21RUVJ-2\,@M)9;@7T&,G)XAE.V:(EM041A4L(0[$E5X+CSL`_G*-L.<8Y*Q!9+$^"1>\H^R;J;=/[ -MIUD2K)OF`",W@"KNL(#[N_/S;Q+J]Z]WZ%6WN!+;:%D7QA"/[WLHCYO]WY1X -M"FC!KYTML2C&+U&PW)^M@!C^`.^"CH!Y%E-'['XMW9J;R#L"[,C,A,W=6WTC -MC?$Z&9<1F%&3Q:!QPYU]'=XZJ>6H>6IC5B*[9QX=OHP=H&.:Y+Y38$:3.2UOR[?)T[$;=R\A_E$!=L]+;P)6>[X/& -M92GR/!+^>G>S4GPY&LP#M+8DOYPDY$^]#^PT>$6+TK!/*LBMI+8K" -MJ!HB@-F[$G$P(]""F;[K:[LS*(O%$7``!`$0`` -MP*@!`<"H`0(!]`'T`&0&26RT.(!S]A0^:JY7H;`BK\DN("4(`````````%PJ -M``!`)S*^->+)L0<3;:"@VU&U-W/J-28/*S3'I*2.+AL"*OR2X@)2`````` -M````3````#"54#WXZJ<\MT>CY5UP]FS'C$KH)Z(JBX0JV$JA'X(KX?^&]FN` -M+EB675GK"4H2MT930P@`;````&P````"````10``:%$9``!`$0``P*@!`<"H -M`0(!]`'T`%0&.6RT.(!S]A0^:JY7H;`BK\DN("4(`````0```$PJ```PQL!Q -MO'X4+0J]4SU_@>%!XB'_KG2N#R0`Y)*%E'$R?R'[Z;L1!&C%+&F["('`'@```!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``N)CW;IGT/#(IQH;PW9'"_M4^VZ;FS-Y`AFS$/M!,34"\LSQJ -MQSL76M\HGT@DTWI-I.[_\*P071NR"H);&+(,I(-X`?3CO&0SX_Y2X-T?T'$, -MPQJYH^/1]0$':58@/3KEGG:OOVMU4LYXQ745T>C3B]"[D/`^[V]"[OT8[[;A -M_7\I```D8)@1$8TP*D@>>1@)DIWNI<5YT0X#C3B]"[D/`^[V]"[OT8[[;A_7\I```D8)@1$8TP*D@>>1@)DIWN -MI<5YT0X#``!`$0``P*@!`<"H`0(!]`'T`3@'':_B,A#MK0HB;9G7(:&' -M^&,A("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@`` -M`@,```@#```"````"`0```(H``"(``(``);R,C^U%4GQ2_SE%:,,Y"N.JWLT*:%JZ7'.@V*0``)!!/1P%>-WT1*_K7@PW".[[4_J1/]W*) -M`8Q:HS+U>R^[*0``'```0`2AF9[DL$O6:NJN;RMR?R(AMG(7(@```!P``$`% -MHAK3`')X.WFU@JS_UC].,3(Q@'E*$K=&=[L)``P!```,`0```@```$4``0A1 -M'P``0!$``,"H`0'`J`$"`?0!]`#T!]FOXC(0[:T*(FV9UR&AA_AC+B`C"``` -M``$```#L(P``T"Z\,Y=<>^,/H;G5]]G.#J;/Z+'($=`8XBHF>)WB^[9^KV*> -MW3BO=HE53+S@'G0_^UW5]Z$+5QX%E./L:]?Z*L/A(MJWNQ/L,"I;JQW`!Y1/ -M3/8EMHCEHW\=1Q;Y^RI?*:H>*>=-+K%8.>XM?OTR'HL%)D7%F3#Y?].;:%J0 -M]IIO#&TC%!K0O0)@%7&2?Q[7JJV+O@+=_4O?\!-D[:I$47;>/H=+6\H69=/A -MJLB?1P'N\TS8CFZ]S:7[UVXP1Z_U@;H.^.07I&J*#KJI-DH2MT;RTPD`O``` -M`+P````"````10``N%$@``!`$0``P*@!`<"H`0(!]`'T`*0&B:_B,A#MK0HB -M;9G7(:&'^&,N(",@`````0```)PD``"`=D*ZU>_>;'T;04X'2\/NU9F3_M:) -MB"Q@KG1\D5HGC<]GF5?BGU6[TFN=\;4E0A$VTTH2MT8A\PD`'`$``!P!```"````10`!&%$A``!`$0`` -MP*@!`<"H`0(!]`'T`00'Z:_B,A#MK0HB;9G7(:&'^&,N("0(`````@```/PA -M``#@I6,V/B]7G/SV!U[:DD89M-`VS@$B_P*UB=D1Z^K?R"=F]=4%)52SCKP+ -MD1.$$"BVB/6KACMGI8FET"CG3QK+]%:^GTQ5W;H])]$G@8]U]O$L"[&^RHA; -M-N7#.0:03Q5CZ)1;C^L[8Z]Z#)CJ9V=FX*6-F(L*JE`]<`=BD4`%*1=PL>P) -M3E\#%\;"PT#@6Z!K_CJ]?1'"O?6X^WDH2 -MMT9:_@D`_````/P````"````10``^%$B``!`$0``P*@!`<"H`0(!]`'T`.0& -MR:_B,A#MK0HB;9G7(:&'^&,N("0(`````P```-PA``#`(D]3$/A#YS+;C1[; -M!W;X[7),2ZL[52`_SEZY)+H8!Q(:,@J;/$U_!+6TR-WULO!J4E"XSTH(VQ1" -M:/\NGNDD79+JHGOW:>B=L/,$"54\0&0>I7`'V9\(PV161NSZ[NEM@Z*$$UJ>/HO9-*$K=& -MYP@*`&P```!L`````@```$4``&A1(P``0!$``,"H`0'`J`$"`?0!]`!4!CFO -MXC(0[:T*(FV9UR&AA_AC+B`D(`````(```!,*0``,+B:RKNMD;$^GI4_4)U/ -M7_1]4Z);=1\->,,/4;[-TIT;(E='OPF_!-/2O3/N2A*W1M,C"@!L````;``` -M``(```!%``!H420``$`1``#`J`$!P*@!`@'T`?0`5`8YK^(R$.VM"B)MF=
@\"25PR:Z863_&%_Y%85Z*C,V: -M6F+M:@66,J?'Z0`>4#55\LX=K$H2MT9N/@H`/`$``#P!```"````10`!.%$E -M``!`$0``P*@!`<"H`0(!]`'T`20'":_B,A#MK0HB;9G7(:&'^&,N("0(```` -M!````1PA``$`:(VU^(N]'D3B\]!63@=807D5EFV7.-`G=?[O"NZ=+L^(8[79 -M203N4E4U^W@;,%,W#LSI2[F%CQXMWP8=R_"Z(=L+G/F/'\VG!JZ2P"4_ASPD@,I>(] -M?M%CDB40N*RE09OY/#+"FF5KY^"IW[M.4@>=EONT3LD%F93E>)]GV7,YPU_TDN'/?&LO8!)U(/:_<1'VYF -MKI]#[NB,NU5;[6PAWC&E"L;Z(]?.5$"Z#F\Y?/OGKM&FH#Y-4D+-G[K`C<1^ -MC_%2?><1LOCW$4/;1,"LBZS)EL32`:3=IZ#/'-&AAD295ES/7:>U3,#WDL] -MG:BUXUQ$74W_YCAEF%=4=I)_2S6"*7*AZ(X$A0Y.MZJ\6+VI? -M5XBNK:T.^?:0EDO0F'H9=3,ZIX`9;3?A!(J7L0.*I.'$HZTTA=E_!3`G+"3Y -M_<5H(^^(RC'`FO$-#0R1F&5;"_'N5H*YAYR&HA;%A(_2VUN;N]B!KL1&G-Y_ -MR!G\"AI&A4/\QAV.F30+YQ27,:;2GW^S_=-!7Y)(_+H5L#S_X-AJZD^Z9^/L -M\WQCRZ;?AR,3G+KF-X@2F-3D*?!O]R&4B!L&*7&,2A*W1AB<"@`\`0``/`$` -M``(```!%``$X42L``$`1``#`J`$!P*@!`@'T`?0!)`<)K^(R$.VM"B)MF=F_W%].=/@[N[RU$"*+.$&^K.E -M#@7P#P5]_3#'O@Z5U7=5)^;'AF&.9FR0=BW_&(31I.$#X*[EI,X4E5&5M)KD -MQJ,/PK=]#B*^-J\%38NR4W6D$8"L0H1DFDO.KE)2IP+M"[SPRI/UP:V]63YA -MA\E*$K=&TZ<*`!P!```<`0```@```$4``1A1+```0!$``,"H`0'`J`$"`?0! -M]`$$!^FOXC(0[:T*(FV9UR&AA_AC+B`D"`````<```#\(0``X`.S;529BX:Y -MPJG&P3?$7D`7[G#5[3Y-V]A=#"":C#YG-UT:6+SEY]7B#T>^[[&Q>?=[3(AM -MYASE;E6Q)`ZW]QLKV&GJ^,/]1=5/;XE1/E0UV[EB8I]J!-:ROUCG1L&(;A(& -M)W11R9&0FNH:$)3_6K,=#ZMPP4-FAXZNS*%-C.N=O,''GSWO5$^6`\/Y"2F^ -MNM:^5T;\2!O(W6[FW?'T%!*$K=&9;<*`.P```#L -M`````@```$4``.A1+0``0!$``,"H`0'`J`$"`?0!]`#4!KFOXC(0[:T*(FV9 -MUR&AA_AC+B`D(`````8```#,(0``L/:NWST@J.H0N2Z>94W@1.W?!\-@/>X4 -M#36ZY+KV7'\H2M]*$C28'.^349%-@,2GA9H6JJFBAV_^=6H*&I'1E1@6D601 -M2&>**T;F'5"ZCE],0N)[8J5Q)KI;'C!7(D1;V:KH7U-#@$%+00-UMJE187`W*,970@:*SI+/E-FL85>O]MOS`W3T/RPWNEGEVBF"7F?;D]IZI-UW -M93?4U"]$EY^29HW4UP**@L2DCP8G2/@CW:R@#(++*9$Y0L;'@CLRU(81FW_O -M0J@,Z_A9D&]0Y(=TT')L9;$B`$%])192VEUA'Q!"]5L8ZGML5)991K5*$K=& -MJ``+`(P!``",`0```@```$4``8A1,```0!$``,"H`0'`J`$"`?0!]`%T!UFO -MXC(0[:T*(FV9UR&AA_AC+B`D"`````@```%L(0`!4.\2`@)^1,M&%K(Y7Q)J -M?E&^SBZ:]2#6D?[XV?V%@$))J^#*PAT40/Y#*P%($@W/!L'")%;(M",Z";6: -M(\"E4/2RJ?07 -M.!@D<#H'Y&;@),65\UUJPU6$SJ)42F1IR4Q-(DZL7PT=E(;-LUR$0-VB^P]H -MK305,E>AYU=LZY -MW)29[M9'#]Z%.CR3@'P>,9(U.EC:E9\V`YOV.4;0A0>C*8%A@FOX7-UFE:#R -MK&0%-L%&]/DL5;>;B[GKZ)V\/VPC:F$GN-QG$=A!OG#=QS^H,MJ^T)?ZL1]6 -MX)O*I=&NB>X]AX5G2YO]/S!7E?C"6NS``'DA0#Y]&8`L5U]0E!%Z;OG0U[WO -M]1L`2A*W1A@V"P!<`0``7`$```(```!%``%843$``$`1``#`J`$!P*@!`@'T -M`?0!1`YD?>1NBZV2()^:$Q.,^EI[S]Q45?2@U@RZ$HLSIEC_$!]BY"7Z -M$>TY[*8U>?+]0?!W`2R=:*;-YL'6N^N("[1C^ZF.B*6R!D/LH8`>:$X`%V%3 -M04CNT0.[>9++<)Z=OR+_Y"HQ7&]-I!M6)ZI*GF;68]&609?!+3%[;D-,XTO.5R10 -MUY+MB>.?1DH2MT;X70L`?````'P````"````10``>%$R``!`$0``P*@!`<"H -M`0(!]`'T`&0&243TBIF4P0^?D?4?P5T(@!(N("4(`````````%PJ``!`O^'` -ME>$5]!`L.\U0!:>&TC7;,LL-]CW+!6I7RH(87X)S-(0;JNKU$X3`)F(%CL,- -M597RQ($OD>A1\ORM2A*W1IAI"P!L````;`````(```!%``!H43,``$`1``#` -MJ`$!P*@!`@'T`?0`5`8Y1/2*F93!#Y^1]1_!70B`$BX@)2``````````3``` -M`#"*N]B,X!9S5UT3HK:\"&SJ!]8)/@=+7\$7"-$[5>/F7EWOYARE;7H+P8EV -M0TH2MT9M>`L`;````&P````"````10``:%$T``!`$0``P*@!`<"H`0(!]`'T -M`%0&.43TBIF4P0^?D?4?P5T(@!(N("4(`````0```$PJ```P\(;:BQ.'SO:; -M!:^?W*T'')J[Y0,:W5#>D4G,>-=T'ST/%&D]#-X<`4^\)7=*$K=&R84+`&P` -M``!L`````@```$4``&A1-0``0!$``,"H`0'`J`$"`?0!]`!4!CE$](J9E,$/ -MGY'U'\%="(`2+B`E(`````$```!,````,$3#-KU:\D9M+)?<@7:<=ZI8QL;: -MB!OF)?]7B?7+>:+,&^;+]YGH)JW';\*>2A*W1H:!#`"8`0``F`$```(```!% -M``&4438``$`1``#`J`$!P*@!`@'T`?0!@`=E<7$!&0\.=ET``````````"$@ -M(@@````````!>"((`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``&+I*MDBO5HA,E"$)--^_[!^!#G&:TK:K"3F;Z@@(/-]AT>*QL_:Q<%P, -M&HN)A,1K`#HCGM4WZ.M&JRDJ@3[W-A8NM3FWY[=B&8H;UHVW*A5V1']+FDW1W@O+2KWP$I```D -M9%!E?UB$R:FYA$C5@K-A!+Z62I8:6I!A;,<$3R<[AX,I```<``!`!*[QT97^ -M@V!65=<6HI`33SI60TBI````'```0`6Q4)P0!J97"1W*QL_:Q<%P,&HN)A,1K`#HCGM4WZ.M&JRDJ@3[W -M-A8NM3FWY[=B&8H;UHVW*A5V1']+FDW1W@O+2KWP$I```D9%!E?UB$R:FYA$C5@K-A!+Z62I8: -M6I!A;,<$3R<[AX,I```<``!`!*[QT97^@V!65=<6HI`33SI60TBI````'``` -M0`6Q4)P0!J97"1W,N(I&8A("(@ -M`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@# -M```"````"`0```(H``"(``(```6/ODOZ_/)[\>FVL8UZ8FSICMZ$TVN@DF"M -M^C!M26;)B$OR2%#7[.^XRH.Z#*3LI?2E%D3OL2\!E\H94-IVAQP7+%Z@;*UOH6:7[:=>0%+D-[.V:(: -MJ?@>Y6J=%9ZL'`64*0``)`A=UIG'1Y8\Q4&HH4=JL%<(?XJ:-0M,9$4A^@/]*$K=&0_@,``P!```,`0```@```$4``0A1.@``0!$` -M`,"H`0'`J`$"`?0!]`#T!]EQ<0$9#PYV7:]]EGC+B*1F+B`C"`````$```#L -M(P``T.D9!=Y:1*!K"P5HE4%<@JX/L=173%AH0`KBR)R;76X@I&BF51A*K8"T -M:`XU^,@KS*34E)$F`985::6]93LKKYF])QN?MEB&,!4-)7F`H%%E;MHMB=&:3(AE\R*MB:;-QKD0,%(&2/J!V;+V;&1X4-X; -M4"3,`UHCKTN_9,.HK8B(Q@2V",5'=X=)O"/SEL#I&@_JPC,FD=G^BGBH9O@0 -M+#5BM?$^4?OX"N^$G`A+XS6%W+A>_$0,OKFE-TH2MT8Y$@T`O````+P````" -M````10``N%$[``!`$0``P*@!`<"H`0(!]`'T`*0&B7%Q`1D/#G9=KWV6>,N( -MI&8N(",@`````0```)PD``"`?DNK8,0ND;3!PSXVB8BQ;G/IU5E[$@P6G]%M -M:SD#SM_+V]KDJ?F_&X881"A6SW)LSF$_(0*L0C%H1G,LO0*"`[J7CZ&)\'[[ -M\0)(J-Q=7H?146/)J/=^*%09KEA^[5=8S,BE2^(!$+\*#C!F+B-X[%9V**M' -M;H_7/[R_>$H2MT;`,`T`'`$``!P!```"````10`!&%$\``!`$0``P*@!`<"H -M`0(!]`'T`00'Z7%Q`1D/#G9=KWV6>,N(I&8N("0(`````@```/PA``#@Q@7, -M^W@%.PP-2@Y?&?['Z@VTJ"`0$*V]1G"(8&A@095-RD>O48)6>O&0>.DURXL5 -ME&T6MHE*4R6T9(MCQ_J[WW,XW_:2/.8SR\49*XF>P&"'KB]^]DT -M\%N7.RT9F(IJ)C/&(%G;#*G`%U^Y\3W#!J+7(.S*?I^E#P4MA)LZ6/EEG0#C -M#"&SVV32STR<,]$LQQ)_\T4@4,S%*'XC`)_Q3$]ZW5`K]&+VV2#&ZOUBRV*: -M"D&2*H0>B?-E.GP*&LO*!1T#.)I3I"",Q)$WXX&."LPJLNX9J4H2MT99/`T` -M_````/P````"````10``^%$]``!`$0``P*@!`<"H`0(!]`'T`.0&R7%Q`1D/ -M#G9=KWV6>,N(I&8N("0(`````P```-PA``#`EX;T,7+K)PQWRUV]AN*) -M5%372:A`[>[;!"7N17S:<&?N'47=PUT#'1KMYPO0SB^!N__0VK^>5#%34*[I -M?A"*5P8F(J+[(JET"[L*5I3?56C(S9^D-9>GP'(,\89-8GXH:/]J>]?/7E?X -MF^26],/AS1'5$F^&JOPG!1"6>9&]>7L8II6FS7A?U!E;%&-%@5[",N(I&8N("0(````!````1PA -M``$`CG73XMG`\T@;8.UKHNJ3^@/[V1W>=^L"0GDBJ)58`S5'N&-M*]R^Z!2/ -M:"M%"":WU(T;2G4)XP?#@%280'IF^)@Q4/W_]+9'80.%R;Y(G9BYH8=_B7;; -M&;V1P=CNE0H^UU5]N(:OV\`1P)@)',L>BA79Y&E)B'9^QVO5N6-3H$257N[8 -M`JN3,&8P=E06EK7S2`,2-OI[@6)85??%HY.D[V!L!?CP_W0L29A!3:A11^J; -M9!2+S;@FU!`EUTYK^:BA;+B`?%'WH?+F9'""X,,*+#"ED!%97GR4-XG$FY3 -MYA-&8(:4Z^?(\1$%,QH0%-T8B-,]O/BE"KK.@9".#!H/S:YH3+&'R;_O6J]= -MH#$PX]_#>Y0/;N@AUX'[;G?(5LC^K^@(V&CN%^'[%],Z+7`>Z^LYXQ"9%I(! -M330U2_FK<1<^PVHIP5S6>!=P*?:`'TZH7V<#3,Q_[]P#`DHQ*TH$R -MN>J;LA@16O='@'@-0PHN2A*W1E&;#0#L````[`````(```!%``#H440``$`1 -M``#`J`$!P*@!`@'T`?0`U`:Y<7$!&0\.=EVO?99XRXBD9BX@)"`````$```` -MS"$``+!OK]]`5!CE;/1?B@ZS]$8HS>T1&:B,V.WRS+Q#*F-U+N6Z5\'`Y""" -M!*,@1?/*1BT>LA758,^JM*66RK!",A96+$BVZGMI,A$$H<]5.:[A\S^H-6^3^=0P(+?NA_O[2);'8(::]=9N332/5YL)?N -MM+'>09)Y[29T+/SS$F1@YA#N;X5+`NYG[$5A@-A[:ZNC:29]],SYXF5&2A*W -M1@B_#0#L````[`````(```!%``#H444``$`1``#`J`$!P*@!`@'T`?0`U`:Y -M<7$!&0\.=EVO?99XRXBD9BX@)"`````%````S"$``+#XH10%:/S["X0R^I3#N[0)@"2AC%P+0)B?&A[U@ -M&(M2#L)^(@J'[T$!1"+CVAP+[G?>=XWF",9=D=WLCV2;CR+6`:OWT;'3W?$M -MK+6)?>P<:SW8G/XKS\!WDGR4BDJP_#H2`,3N)H9?;6":?.\Z(8D-8`61E@QH -M]/F14UC:OU&D-Q-(:P+:SQ^'HJ6"P4/7"T%E=V3'QQ.;SN+/N7-V#DZ3\4TN -M*=-*]WG\#VP"T/O51<`]U6-9<#H.>P -MH)JHR>,\<\T3THUFZVR%Y9*$K=& -M`>D-`!P!```<`0```@```$4``1A12```0!$``,"H`0'`J`$"`?0!]`$$!^EQ -M<0$9#PYV7:]]EGC+B*1F+B`D"`````<```#\(0``X+XTI+:[=3D0\41#?6]" -M\.P]\`C]OQZ6YT3DK=7C%[]+AC.DR4/0XQ%"L<`:.+72WGWP%J0+-.CS/P-2 -M;6=1(1W8M6PYPS=@D7"V+8F>V?.3T,Q6%B,L"JD,$8B2Z0W->%V6)\P\@2-N -MAE/WQHUZ_E[X^U"/;X36AFW2>Y6;X2B!I_PF$9)%$X*29413D_5OLQE -MP2W<,J-35MO^U1)@N.>Z-LE[<,N/?^=Z@#L]&'IUOR",7W&MA*VD^#RYVB.E -MUD(NXO;&V.(LI0&*9A"?`4%!)#!J&H#>LS9*$K=&S_@-`.P```#L`````@`` -M`$4``.A120``0!$``,"H`0'`J`$"`?0!]`#4!KEQ<0$9#PYV7:]]EGC+B*1F -M+B`D(`````8```#,(0``L%:4&4TJ+"B&58`>!<#DXIG"HHEB4K?<\M+^!ZK^ -M!>4>D<2^U,DJ1;L.5!4EOU%6L+_WT)@]3@;BZEX2HR$G$3TFF/N'*_-@AR^W -M@P^8IO6E'.1^+QB01:,W&&2]7929+][G8$MCVI=BIS=TU773:"R%^O-%IE&D -MJWK)%W=6O!*NP)\O`(7]$ILT.KI_,>XD*99PL?C]%<]=O<Z@2\498*8DI;Z0U;"?)P)N-ZY+5B@EQSOGI3ES2A%F].IE*$K=&#D(.`(P! -M``",`0```@```$4``8A12P``0!$``,"H`0'`J`$"`?0!]`%T!UEQ<0$9#PYV -M7:]]EGC+B*1F+B`D"`````@```%L(0`!4$V]1B]4"H>^F&!V6%>Y1%IW$)\` -MA8KD#+QS=^L<=2\EL$@UP+YRDIOMW.SMJ*88DQ"6_\/^.7KJ,L^8LTQ8VA>P -MIV23!U/%DZTVZ?YW\RWDWEB)*PIVUA-L0T_/%FPQOAN0#8*!.8;*?V>N:OW? -M\A$AQ=O59`!`GK4'3\?,A_N%:1L.4[NM;PG0__8(]>+F5M0?&<2@[WKR87[) -M\LC"$ZV3M`Q`E>M'M9N/QB;44(ZGW/W8$([Q*+N"7TD;,;P$SUB0KK0ES\/&VGXIL$R[HNH9DV=7/N`.C8RZR -M%OQY!12UC[.6D?%C6-?OG>7Q#IUUE]96#F46S^Q):_)+BK`]@`,23*>P/D%@ -M&;5)!W/X+B[K1D%M$M]QZV!V<7*_F\\5'K5!,^#0@#7;G->1:1J4IIL92A*W -M1H=V#@!<`0``7`$```(```!%``%844P``$`1``#`J`$!P*@!`@'T`?0!1`2.2:P2/BRPY8X$)]!;EN0K4Z43:Z#G -M60O!:O!RZ+/Q:>[TNK5Y!)("[JC2 -MF04W8:_5XZAA=MHY>:ZD/6J')PLWC1Y:.[?P>&3NMCRMZTVG*(+N3CIQQ91VPC.?KQ;0Q6&>4< -MZ$H2MT9"G0X`?````'P````"````10``>%%-``!`$0``P*@!`<"H`0(!]`'T -M`&0&29]:9>_.<]:LL0138`>".\LN("4(`````````%PJ``!`TZWM8QKG*3ZX -M*;\[+/]?B?VWJTO#JCO!.<(X)@9F`4R>:>B-H98450`]M!N#NT?HFND74H2MT9P -MN`X`;````&P````"````10``:%%/``!`$0``P*@!`<"H`0(!]`'T`%0&.9]: -M9>_.<]:LL0138`>".\LN("4(`````0```$PJ```P>.N9^'UE7!4Z%G?GE(SG -MAZD,J^SX5]^BTH#21S!#`NSO5L/-*$K=&M<4.`&P```!L```` -M`@```$4``&A14```0!$``,"H`0'`J`$"`?0!]`!4!CF?6F7OSG/6K+$$4V`' -M@CO++B`E(`````$```!,````,)3.8X\\S1T)QIE2[5\R5',\Z,XM*\M.9]A) -M'5URRK:D+`BXZP'M>X")O7]_2Q*W1NI_``"8`0``F`$```(```!%``&445$` -M`$`1``#`J`$!P*@!`@'T`?0!@`=E9?7)!26@";D``````````"$@(@@````` -M```!>"()`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``:QZW -M)>H,@F+ZX%@;"/5JBWUH]G4.I0\<;%^$FKVDE_VGLF1WZ-&Y*#JYJ?9*7/24 -M\ZT\2K7J>5\TC`YA7TXZD!J1YK\* -MK*PXGD.!XA;"\W2B\1*-WW=Z4>/332\R$`/"/W2'9^1R<$,I```DBE6\MN&T -M:+&XMBD1F\$"-!````'```0`4_F;_>J[+*-"R`#VQ/`5RA&7I=TDL2MT:/C@`` -M7````%P````"````10``6%%2``!`$0``P*@!`<"H`0(!]`'T`$0&*67UR04E -MH`FY```````````I("(@`````````#P````@``!`!@````$FP6_%4_<]Q6(Z -MHICL6DD$.6/?Y4L2MT9=G@``N`$``+@!```"````10`!M%%3``!`$0``P*@! -M`<"H`0(!]`'T`:`'A67UR04EH`FY```````````I("((`````````9@A```@ -M``!`!@````$FP6_%4_<]Q6(ZHICL6DD$.6/?Y2(``'@```!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``:QZW)>H,@F+ZX%@;"/5JBWUH]G4.I0\< -M;%^$FKVDE_VGLF1WZ-&Y*#JYJ?9*7/24\ZT\2K7J>5\TC`YA7TXZD!J1YK\*K*PXGD.!XA;"\W2B\1*-WW=Z4>/3 -M32\R$`/"/W2'9^1R<$,I```DBE6\MN&T:+&XMBD1F\$"-!````'```0`4_F;_> -MJ[+*-"R`#VQ/`5RA&7I=TDL2MT:&P@``4`$``%`!```"````10`!3%%4``!` -M$0``P*@!`<"H`0(!]`'T`3@''67UR04EH`FY_);F8_SJ%IH4MD=-^53"`AAO'O>I&8H -M:>_I1$CU]L4>5E.2?\F1TA:QQ?C_M0/9>=(L7/."$7K1G7Z.-_A;[;G*?5:A -M-F+=:A":%F'/IA+=K?>;Y97=PE[L32;!8H+S.> -M#^M4&90(*0``)([0:#E_[/R*+XL&U)&M=<*?FE$AAI;:H.9!7"9[%C$S*0`` -M'```0`0?YPB!!'FF2^D(3@H@YX"[D5^>2P```!P``$`%JJ+IRTL`FJ+;B#LS -MS!\_X<$J`XM+$K=&6>\```P!```,`0```@```$4``0A150``0!$``,"H`0'` -MJ`$"`?0!]`#T!]EE]!)"[$"V4BSQ3U&D.]OCMMESP]ZZD>$69?5@`?'YS#S_ZO"5DAG,KH@-U5NY^\58B]>XIV:SH0QTO]>3<#- -MISME>!WDW?\T%/(?N,NW?[]R&F\0_=HWRT+D-W.IYJ4V['F8BH[ -MI:IHGI]\CWMTWL4^E=Z.O$,ASLUI'4I&4H/=$`! -M%OF_+FXO,!EXK=]4")[K%,&*V;QDA.8LQAFY8DQT!@EP&T+E$ZG/R55H;E8W -MSDL2MT:(*`$`'`$``!P!```"````10`!&%%7``!`$0``P*@!`<"H`0(!]`'T -M`00'Z67UR04EH`FY_);F8_SJ%I(ID9`J?C91MC,75[.V\ZJ1:A07I5!Z/2-1"_7D`A3YC&I:%!BI2[L -M*EY+%XBLYK-".9753YB*O[&'5VI.X*IYE87/"I'E>(VRM#)+E*!X=7V'W52% -M'T$?.HT'1E^1/$ -M;(DH2:4=96,R_H$G\AM\3;YU/4#@AGXUYP=8##&VN'I:<^.R)@!@!PPEH'9K -M(48P5]/L9_=@6JB.#/'S'(SA"-CZ9[ZK'>@?C"6,Q4L2MT9H,P$`_````/P` -M```"````10``^%%8``!`$0``P*@!`<"H`0(!]`'T`.0&R67UR04EH`FY_);F -M8_SJ%I]RR!6N&4K!H4#Z$SBH!=]G#.19^[2`GWOM0.\FAPO,W\+C -M==:<$7=$];FE$9+IW_QF2?CCN4=38?35/<+=L45TZ\33L=6&8,NGU3*\9;(% -M^54L*+PU5=9K&33T2E,1,1<17;;]?SK/[0CJ;6-VVEBX?3`;.)*MR\!6)'*: -MQ@?-8%]AF'=_**YD:I5T8+L,/M4"^.C-K*X67CQ+$K=&,3X!`&P```!L```` -M`@```$4``&A160``0!$``,"H`0'`J`$"`?0!]`!4!CEE]5$*``%/GL>AI= -MO+6NSZT[SDL2MT9"=`$`/`$``#P!```"````10`!.%%;``!`$0``P*@!`<"H -M`0(!]`'T`20'"67UR04EH`FY_);F8_SJ%IU%]LYR=/]IK.JZ`1@4B)*+_=$LYO -M#L!2F9K`!K_DM-G4&R>5\;"6!H(+?Z)A5A9A-95^7^J@'+*DJ&XW[\L&O)>Z -M_VJB-TX,B2L,YP=+S^Q7LXZ+BJ+,R@D3A"B>4]Q4HW?S1$*MW\D7O$3HP/8`&N'N6[Y]=1.4W-A^BWXSDMR=.! -M6=RQU=/%>VYX9^:V1SRUT_^YQ2J!46HG/PYL6]RV#<,;LG&@X:<$/.MJZ^%J -M4U:$I>:4D1),2Q*W1HV/`0#L````[`````(```!%``#H45\``$`1``#`J`$! -MP*@!`@'T`?0`U`:Y9?7)!26@";G\EN9C_.H6ERX@)"`````$````S"$``+`^ -M-)31A,ZZIBR=6S1S6R1M#X0HYFROEQ\[6=?N-F1?;UGVP]-;LQ8=-NK4]3*C -MK8>!S\]U&ZK+R^(VJ[@&JP9+.(6ZKX5(N/'W%V99?])*5Z9??(B[$(X5:N$O -ML#K@_W>1A57??)JX\K)?Y).J6:*4%7_)*3OH8SQ;]^"W(T5J8LW/*E:P&F#] -MJUL)F;HH1LE_R)ZUBSI"6")_+&]=BX%3WG,+$'8%?T`OXHYR2Q*W1DVR`0#L -M````[`````(```!%``#H46```$`1``#`J`$!P*@!`@'T`?0`U`:Y9?7)!26@ -M";G\EN9C_.H6ERX@)"`````%````S"$``+#R+J1CN`[[?-R*@9H7TIO>3,\J -M<)%SE2T4!F'P+O70@T2ZS)C8BA\!@$=9A?)*U=&K`?A6@\_U#'1JG29:0^HP -M:!Z:.D05(87:0X7@6+/-GI3`4$MI&HR]\+P,2PK08-Q7$8&\K$FOQ<-2#3)Q -M"CBN'H(0OD6@#"Q,0'%+Z[SA^C'GGST]L$M__OUX_!BI7 -M6_6_R)F+UNX][2(\E3S=%L"U2Q*W1A'/`0`\`0``/`$```(```!%``$X46$` -M`$`1``#`J`$!P*@!`@'T`?0!)`<)9?7)!26@";G\EN9C_.H6ERX@)`@````& -M```!'"$``0!ERS_G'KNIY2AA+L('L%J+6\!`T6]2E=1BB5U]:)4<.C\8M5?0G+AZ`GH$N!H7R!P521)'S -MKV-0Y*&\RY0"+(\I]P%TKO1TW=L)MX_(EU>H/$$X2_^,5IZ*R_/$S'[2L=%G -M&.Y*(\,+1Q#XX0;_<8QPR80T9EE*7P]N1$="D^[QA5G`5%P)5B&NP%;VGM'A -M2JW7KB%)?0M!N?.3R8MI4='1ZZQ7X$5ST1Z>8(OY/,*-#B)+$K=&(-P!`!P! -M```<`0```@```$4``1A18@``0!$``,"H`0'`J`$"`?0!]`$$!^EE]]!!-$B5_B\;M?5>#,B.\&,3 -M28X9A7T@\9/^!]-`F1=:[O7(8F_CY6?9XDHOFCUW"IP?+S[F,O`BN7U7((ZR -MV.ZF+HKY3:G6K:>XR5+H**MTK/T6"F.]O"S>#GAND;P^Q0PQYNB*D_7;>!UF -M'E!EN>_%:(F=V>7MP`-\.%Z#X=?W$$]I.=`*(=5!/J4'^(69$EC@Y,>0S(0% -M:Z[<]OC'&;?14`(!&^Y8$Z4!W12WLAY#:J!AT7I@N(XR -MPU()7YSA,*&]O>AQ!-M$&"MO3.)+$K=&G^L!`.P```#L`````@```$4``.A1 -M8P``0!$``,"H`0'`J`$"`?0!]`#4!KEE]\H`Q/+0[G\/ZU9&FT$ -M35CU^"0"3'EQHU]KVT4EA@2XA/U+0H$+;.NF2D%^*ZV:$B7>>SBR9\`42;,E -M68C8UX."'@QV\1-JEP['<8NN0.?,(.Q6[Z01*8Q$K-.\L_G>I`U9\5#U^D6R -M351+$K=&C@X"`.P```#L`````@```$4``.A19```0!$``,"H`0'`J`$"`?0! -M]`#4!KEE]M. -MY$D%'*L9S5++YJC6Q^?7$D,Z9K+C$-(&PH3[?E%A>WY14/)ZG\\8?0)\$7\[ -M[O>?U+V>(U?(12;3"R0J&H])"2;<"T2A7OCX=5HG`;2\=GQ$-N6302%4RK_H -M,(VBJ4P5/(,L&XC[?B^Z7F(7Z%5)9Y^79VX:KGT1/`H]JBG3>(`U$0;AOV;^ -MQXY%-/'[I\/<<$T[-Z3XKVJK9.?;\9.H[\V2H:!+$K=&+S0"`(P!``",`0`` -M`@```$4``8A190``0!$``,"H`0'`J`$"`?0!]`%T!UEE]68\I+Y::U[/M!HAMOT>",B4A[OF^2YU\EXJ<=AG1FXN<@KDV`E/ -M/C;CE,#-<6<^*YAZ%@*V6'JC&&L;R]TH"\&I7'J]7;5J@+JT2;P -M2]3!#M(SYL-Q1$0G?K@"\&"BYV4#!5TME1`NM>L=5L?:I'#29&,57A%K>KKL?U3HZ0T#L:IR?E+@P, -M3`MD`]1O(GGKC3?PZA=07?L+#6!.!V8JD[U59/[-Z`J/I$%@A`YAO5^[?YE1 -M]4+XK59V83&H?88-?X#:#Y_#?AD.EAO,WE^D\?H(`K"4R\9Y2Q*W1NIG`@!< -M`0``7`$```(```!%``%8468``$`1``#`J`$!P*@!`@'T`?0!1`,E`JM\DD>9O+P!&'RH47>L@N881-PW16^ID?M)0/"Q=EH)?M$_NB"0USUY'=5LS -M(P(P=?#XE#HC,G#4G!E51@:^NV#\9P!N4R_]6/2Z$%[1\L6F9V\\SPZ:2H@H -MZJW($!LISNN$?KU5VC#$]G_;MQ_&'[93`(YQQX&&C;*1C-8)BIT/\QM6T"C[ -MIAD8ZHW*?S10I]<;P73F3E18C['$L*1Z[T=88[%HGOC$;-/V>%%G``!`$0``P*@!`<"H`0(!]`'T`&0&2;6: -M@..>N22ZM!43%V[$OA0N("4(`````````%PJ``!`YJ"FWN]#RZ[D7,@LQKXR -MQ[/S)ZY3]RTLQ0NU/T?JOH"JN`<(2YV&%(>Z4G*6=:7HA0^SV"F8+P\F9$&* -M2Q*W1NB:`@!L````;`````(```!%``!H46@``$`1``#`J`$!P*@!`@'T`?0` -M5`8YM9J`XYZY)+JT%1,7;L2^%"X@)2``````````3````#!3'B>;C_N&7G@K -M\ZUMN22Z -MM!43%V[$OA0N("4(`````0```$PJ```P@P]`:MO5C(%:1['XX9ALFB3(X%%] -M]5NXI16"\/XIY1[/QB0RAFVJSN:@@WA+$K=&#+@"`&P```!L`````@```$4` -M`&A1:@``0!$``,"H`0'`J`$"`?0!]`!4!CFUFH#CGKDDNK05$Q=NQ+X4+B`E -M(`````$```!,````,!\"[L..>#4ZC/&-#\_()&JGN9B!$'"Z58;&QST3QAS@ -M[&OP0'[$&EO&ZH'B2Q*W1I>R`P"8`0``F`$```(```!%``&446L``$`1``#` -MJ`$!P*@!`@'T`?0!@`=E<"5$X$FRT8,``````````"$@(@@````````!>"+W -M`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``;H'L^8*#52O=D2+=``9@#+J$*4W.;G$'%D`G)(/+)HAH?LM1( -M.7]X,ONU8UCL4F"UYNT0P\O7-FV-UV824%9?=$^5*2C*L(?4-[S#`PP(\UQ+GU&8:%N2UCC_%&-72F(I```DP?E#G%Z_:$X,0Z\V -M.3^OY`K>5O1B.W>S8N*G)!I1T -M-;86````'```0`5BJ)-K)UUI(/M%!`9=[J/_0CLC8$L2MT9-P0,`7````%P` -M```"````10``6%%L``!`$0``P*@!`<"H`0(!]`'T`$0&*7`E1.!)LM&#```` -M```````I("(@`````````#P````@``!`!@````%1MMCX]ED32)3R,/8I_3?9 -M(XL4?$L2MT;#T0,`N`$``+@!```"````10`!M%%M``!`$0``P*@!`<"H`0(! -M]`'T`:`'A7`E1.!)LM&#```````````I("((`````````9@A```@``!`!@`` -M``%1MMCX]ED32)3R,/8I_3?9(XL4?"(``'@```!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``;H'L^8*#52O=D2+=` -M`9@#+J$*4W.;G$'%D`G)(/+)HAH?LM1(.7]X,ONU8UCL4F"UYNT0P\O7-FV- -MUV824%9?=$^5*2C*L(?4-[S#`PP(\UQ+GU&8:%N2 -MUCC_%&-72F(I```DP?E#G%Z_:$X,0Z\V.3^OY`K>5O1B.W>S8N*G)!I1T-;86````'```0`5BJ)-K)UUI(/M% -M!`9=[J/_0CLC8$L2MT8S]0,`4`$``%`!```"````10`!3%%N``!`$0``P*@! -M`<"H`0(!]`'T`3@''7`E1.!)LM&#T;B[X%.]4[TA("(@`````````3`B```P -M````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H -M``"(``(``#Q/"PS9P+]7/_-\"4\)13CE5XLN,PV:L8IA_(ZU)C-Z3*CVQ0A1=(;%!8EDQ"1FX[<%>=>\'HB@```!P``$`%=\HX7C'@GKN=["NMWC!8OA3/ -M^QY+$K=&9"$$``P!```,`0```@```$4``0A1;P``0!$``,"H`0'`J`$"`?0! -M]`#T!]EP)43@2;+1@]&XN^!3O5.]+B`C"`````$```#L(P``T(XB(&P;VQ+> -MB3XZ>A80!GG!@34MJ9'2G[I-^_K;L*IF"44" -M>L>5YWSKYFDQ`P`4?M%;AS6Q"J(EOY[6.SN"M0U34/D -M!EHA?8%-0VPKMEVE2%4'WX>\OCH29,6)Y$9^J7"6@.%T%6LAAXH7UDL2MT:V -M6`0`'`$``!P!```"````10`!&%%Q``!`$0``P*@!`<"H`0(!]`'T`00'Z7`E -M1.!)LM&#T;B[X%.]4[TN("0(`````@```/PA``#@:7P^2H)F_:"0XFEH3MUS -M2B]'&Q$](+<('F%:Q'<$Y4?4<)W10H_D6QI]7F7*YDUDH/K07.M$X/W`/@EW -M[+U'?0`+W-*W6OM@;?4\#CQ-FM==>7.K3:;`:4ONP_" -MB\$,5'68O#=>0N.PR8&FR@/X][W3YFJYTE^M[L0B8Q*05$G^=C9200(ETOMA -MU`<[/72&4@"PZ="^IK(-&L.B<(Y7L]U?A$L2MT;Y8P0`_````/P````"```` -M10``^%%R``!`$0``P*@!`<"H`0(!]`'T`.0&R7`E1.!)LM&#T;B[X%.]4[TN -M("0(`````P```-PA``#`D[O<>OQS5Z'FJYK2%]3]FG^+D&P^2)T5X^L+CYSK -M^CA+`YDDWQN>R3H9Q"&R`>^S4Z)_+Y?"<=O@F&TOPO693B2GU!0O+"X)@7)$ -M2&>9S[SR;003F(R4A'9B'.:$1:ZT&^:G"$&!)21_4.F,MLE^_(J0]SQN#S4[ -M'VEA`7+NX2F\Z5O+X':(0*2'RHO6_2?FN';[^:^742Q*W1O",!`!L````;`````(```!%``!H470``$`1``#` -MJ`$!P*@!`@'T`?0`5`8Y<"5$X$FRT8/1N+O@4[U3O2X@)"`````#````3"D` -M`#`7%V)-!`N94Z4"Q"&A8#HO?(2_&F@>+WF9Z3+#:DS*O'5PDQ".@K(`PRWC -M_4L2MT:(IP0`/`$``#P!```"````10`!.%%U``!`$0``P*@!`<"H`0(!]`'T -M`20'"7`E1.!)LM&#T;B[X%.]4[TN("0(````!````1PA``$`48P7UAUTFCPX -M#/D[B"K/LHF+Y6S:22>N8&2I&5FUKIN>P96)"/Z$HN"-6WX6(K1M90BX+)JQ59F7*S1;-IG[P>#P2XY<9CY58*5H7& -MTVB.MOKCXV'^JLHO:B -MD;7!$7M8<#+--3KD(HIG.Z]5&5SFCT]KCCZ"=OHVYQ98&;5064?/B<1N`[M# -MX:UX2Q*W1K#"!`#L````[`````(```!%``#H47<``$`1``#`J`$!P*@!`@'T -M`?0`U`:Y<"5$X$FRT8/1N+O@4[U3O2X@)"`````$````S"$``+!_=:L;6F:G(D>RO[ -M.@?L<#+E#4-S5^8V!'FG;P-:BB>2N08`'G-XD,?@_!:F/[PA,I@(C0W!S"K/ -M;CBKMQ.@LL]:S]OL?+"DR)/JO2$\/2<+($$SBA!92(H/5I0+`9YO.`12WE/5 -M'QENTX',SGY')>\2QGZ@A9$E$/`8Z-B&+U3EC`\%2Q*W1A#E!`#L````[``` -M``(```!%``#H47@``$`1``#`J`$!P*@!`@'T`?0`U`:Y<"5$X$FRT8/1N+O@ -M4[U3O2X@)"`````%````S"$``+"54*,23TLR]CPBW#*.8^\C/R9L0?FSM9I> -M:3=F)EX`&@5X1[#,]YEZ;Z;\?4&E99[&>D"F$"=YP>=.P=52'__-$4M!$^:- -M]C>$O.Z,0W_L@<&V]H0$HT&(Q::FT/=)W3%*_5_Q->#(.U0>DJBF1,$$K.Y> -M@.O%'3J:V@.CPYBZ!DZ@U"M],-HC.A87-K!>^>LY$SPUU\)# -M:[N+Q$.JN*3:%U+C0#!YL -MQC7-_`>W<^V3?:[GWFO25;RJ"ZB$.-VJ9$I\G%-[FNG/?7!'!80G -M[^G\Z*`$>0N`TNI#A!G']-D1R*LMW&9Z*8K>ZNU+$K=&*`\%`!P!```<`0`` -M`@```$4``1A1>@``0!$``,"H`0'`J`$"`?0!]`$$!^EP)43@2;+1@]&XN^!3 -MO5.]+B`D"`````<```#\(0``X+[T9DCP6CVW(MQ_N!P#/&.4T#/^^;0(_MUD -M`YA`.T("!$8K8F-G098X@,[[H>"+7^0^:-"]J9/VLOHH>_IB7G#E\NN94OG- -MPXAI11JXU=<]1K[$S_M]S@:,!`*!XB!IP&)VH8"K9QJJJBN>0/2JWVUH_`Q# -MH*?;(;%A7ARB.0>H0-$:&$9V.NO_9*.;ICY(XMGBDD)M"8M^^<2Z3[T\[]`* -M'5KR4R=QALAVR;7S#1^VLS7%/D"VV8S<5*_[ES$EK$LWORHF>Z?O;3OW?9F6 -M5[MN]H-$LV?3T/UT,A=+$K=&YA\%`.P```#L`````@```$4``.A1>P``0!$` -M`,"H`0'`J`$"`?0!]`#4!KEP)43@2;+1@]&XN^!3O5.]+B`D(`````8```#, -M(0``L/?+"'C<<*S&$K1HTUE<4AMJA_)7UH_W\[F.123)M)*=?\*F&<)Q>^S9 -M>%+\9#QD0T1-U;=_?N5.0PP],&_^MZ3;-LCCB4X&QPTB(`W6(E.E_0']56YX>=1KA)?F#VZ&M+`A/CO$,H15*B=9\"MPUZ>HZ??:WPS@9C -M(DX4R?K900^C@:Z^EKX4Z$Z0E8_56!(7GKHX`F"0X%@>?X\W83FM@O@I(AKB -MJ.,/D:M)\$^[$WV\O,33H$E&+6,[)6Y:<=@^`S[-CFG!%70S?,`P%=22Q*W1NN>!0!<`0``7`$` -M``(```!%``%848```$`1``#`J`$!P*@!`@'T`?0!1`XK'C-/['V@9@= -M'MKA]J&,[Z.[X2XA*Y(%4JZ<1TL`C],'FA$OM*(^$G*LH7C06JYTZG^53&Q8 -MO,/&Q;Y$HO'1[QV0^>O2<6/J3SZ4]9T2,MR1JGVUM&;3'./4%ZT]OU-.1O)Z -MARKW6UCQX_5`&,O/::%TABG#85$.*,IY+GXZYI2Y0XR`9+_6OK6ZN_*`@?);43EGBDYKH0$4K%<_PCTXWZ -M#].02=R&&8"J@*97:DB:PF5V_*<(R@Z,TW-7I3%E1L.?7<6*/\M-?NB1#Z>? -M7.KW;H3FK\J7.!GJV(HQRB4H]R%&"``!`$0``P*@!`<"H`0(!]`'T`&0&2<*OQUC2N7!V -MMV6UW%7SO^TN("4(`````````%PJ``!`Z,2)=*'":SJFL6.%7G#,#?XNQC+D -MQA^+/DQ>LZ&=%0VD^5Y:]9.ALRO!/KK"G/@<>>+CG,,.LRJ2,.NW2Q*W1G#3 -M!0!L````;`````(```!%``!H48,``$`1``#`J`$!P*@!`@'T`?0`5`8YPJ_' -M6-*Y<':W9;7<5?._[2X@)2``````````3````#"P8\L-!MA!\\$Z#0782K`" -M0&T328)_"*5KC\.]PQ_K#I34XPQ6ZGIGN+R1+$L2MT96XP4`;````&P````" -M````10``:%&$``!`$0``P*@!`<"H`0(!]`'T`%0&.<*OQUC2N7!VMV6UW%7S -MO^TN("4(`````0```$PJ```PQ& -MWHY"]GCWO-"BO-21$75%!^A+$K=&I_`%`&P```!L`````@```$4``&A1A0`` -M0!$``,"H`0'`J`$"`?0!]`!4!CG"K\=8TKEP=K=EM=Q5\[_M+B`E(`````$` -M``!,````,"0T/+OW=>)^H,M'/"\81>O$DH2.1,L8OCP4AK,8AEW -MA#:@XE;D``````````"$@(@@````````!>"+X`'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``^E4&IB\ST:%^S\VH)*,I -M+/#L*YXYHD[='?GXKZW1IE!CZ/HRX_2D;7OGEP[UUX;]`P%M2>N,3C+R-!Z\ -MKY486X:-)5BQSP0($SS+*I-(S9IVC[92H;;3Q4:7L1[$/F(/"6 -M'*(^*_LF*7P;$"4-*XX#=>=U7Z"KZ#(I```D20369XF&@-I>H+NP;Y+G'>F+-R"6```` -M'```0`5[JZ]`K#1>AGX,+,F],1=U7Z"K -MZ#(I```D20369XF&@-I>H+NP;Y+G'>F+-R"6````'```0`5[JZ]`K#1>AGX,+,F],1+0<`4`$``%`!```"````10`!3%&)``!`$0``P*@!`<"H`0(! -M]`'T`3@''`U@G@"X9%`>P6]2/U69U!@^MLE_B7/HPL;BVJ;\^*0``)/Y` -MCTC<_WD2VR&`MG#;3R`$5QY;Q(2P9!%!)M#NU)4_2LFC!OAP%Y[/I79)GI\+0=%:7>FTW_=`Y -MIIDJX,)GKRYES)MGHP!A0AW]*[G'U"2PO0[NA$@#W-63S=QIJ8E<*CT7"7,2 -M,W9%*OOE?K00\`2BA5<#![E<_[*`=2(:J7WZ<,KZ@#[2RFF80(:;CS[&S2*R -MLP4I>!Z6;AS;%4L2MT:P>`<`O````+P````"````10``N%&+``!`$0``P*@! -M`<"H`0(!]`'T`*0&B3IY_Z0";,?<(1[RQUN=Y5EF#M>`_@:"]L\%$B+<:H*D.`W;"W](PU -M\HZ(?C,K#*FZZ3^]PN)PT\GHU=,VRG!C&?4!X)Y1)M;V*^KETBX1A;D[) -M@I@IY.=M@.&>X@^]S^";GNQT;ABV@\HUG3ZC4@JK8I/\@N>-*\BN -M^Y$K#S!`I9#U2/5BQ,I"S?&+,N[&2Y[7@&;3@P0L/R#Q_XM-=1,K)(`BX3SZ,L^65/V>QD2:APZLWMML?-#HV%KQ?!KL60>?U9D -MTA^?[5>1/0!.9G0*.)@&-H;4X/M/-?)+@[!PYWS8;D-+NG3$01K#@S@O\X"* -MT/;WKR_H5E%SQYIHBGC6IEM47\["DDPK-,>(NUT::]MD,,%O6XH7M(5%\"`N -M&\]Q%!:9\AXHR)IQH*X77R_TT4L2MT9.HP<`_````/P````"````10``^%&- -M``!`$0``P*@!`<"H`0(!]`'T`.0&R:7YHM=F3(Z%%B,MDBY%W202$[X@L.-FU'OY -MZYO&]IQES)%F*OIOQNFL;LVJ6<@C70!GV,Z-2YVA+LOZ]HM"ID$: -M`?^%HOW6=V"HX4+[,P$RKR1+$K=&"JX'`&P```!L`````@```$4``&A1C@`` -M0!$``,"H`0'`J`$"`?0!]`!4!CG)MZ$-J#B5N:`^RV8K%UZR+B`D(`````(` -M``!,*0``,.J.CS.*4^<*5R+5)5`:K4]<8U@"-_)/L-B"/7JG=CUUA#:@XE;F@/LMF*Q=>LBX@)"`````#````3"D``#"=VW=X -M-BWEF+<&,#XZB_7L=M"`TH9*6"WX.8/<)I>=T;-4)/YGE]]BD6Z_1DL2MT9H -MY0<`/`$``#P!```"````10`!.%&0``!`$0``P*@!`<"H`0(!]`'T`20'"$^]H3&AU%W8PJL4%)7: -M04N7Z8+M+*!+Z3JXM@'*WR@J+&S"!YXY[HJ)ZF='?VQ-`'MF+!SNE_+_C\XY -M_<_`V:]9?@P+#<4$N0>LK>[1;]57`L%0EF%O1WK7]XWV?,J^U"=X_@4==E0K -M/^`(XTJ[`KWW:I&Z -M(BA$-S/@=#"MBL/3@^X_W-W[#*-IT6LEWJP9'3T=K38A+J]Y-M2ZJW^Z`OSE -MB,+M--QW68%JNZ+W2Q*W1N+Q!P`<`0``'`$```(```!%``$849$``$`1``#` -MJ`$!P*@!`@'T`?0!!`?IR;>A#:@XE;F@/LMF*Q=>LBX@)`@````%````_"$` -M`."]HO)A413@G84GA5/-N%#F,6//32USW=\)=1D*SXN>5^0_)*@+X=!P -M;PQ^A("IC1/1ULWZG35IEM)\*08/3]JKU15:BG]^'S5!Z#;GC8#K9(15,(NF -M=M6[V@F4P&YJ+TM0/[*B3SR]R:R76C20F$6^`@S!Z&JHT7K(7@*JUG#YC]K# -MRNHU^X\GFG0:+9MPCJ3.3MN@WW?#SW-;BEV0@!MX_"DCB*KX.,;H,#36$GGG -M!2Q*W -M1L`!"`#L````[`````(```!%``#H49(``$`1``#`J`$!P*@!`@'T`?0`U`:Y -MR;>A#:@XE;F@/LMF*Q=>LBX@)"`````$````S"$``+!*SOWV=B7)-UC9'`C4 -MQBJKNMO\W:,#&(3I41-H8%X=E-4FS\=?SZLA/[G>-;'=+`LF9:1,;[2!O6G/ -M$I*MK*;%,\+,N1PX#/[*[S.U[:*;G!QTM&,QTTG0.,%S#J4YE;>8EJUZO<`! -MASV@_M2Q^)%D';:0FD2HJIW1WA5J]6G0#6NUB^20264$-KXS0PF8"A.Z@RBQ -MC`B:;`6R"[DIK]8&>/0K+TE%Z.LH;N*E2Q*W1K4E"`#L````[`````(```!% -M``#H494``$`1``#`J`$!P*@!`@'T`?0`U`:YR;>A#:@XE;F@/LMF*Q=>LBX@ -M)"`````%````S"$``+!@YT(.'?Y)?N[9LTI:7/]0<0\J:[$^>@'$_":7$&OK -MI5&/A#>UM3'9Y5TOF'>[_0%>!M9F,>YM_@;T_5IE$$5&]^QQX7FP.@07>(^9:CX71"O$/8$<#8(`O)%8 -MWYIGW`1L;1+$L/;W'04/.W\Y`>,=SV6PS,83>A+X-,E0=L- -M3.:^GJ*$2Q*W1MI""``\`0``/`$```(```!%``$X498``$`1``#`J`$!P*@! -M`@'T`?0!)`<)R;>A#:@XE;F@/LMF*Q=>LBX@)`@````&```!'"$``0!R>8SM -M)JY!E(&(G218#7FRF@X4IB?>0QX\UK%)Y$C+'4C%B=,G(R+^ZWWFF.EXZ$<6 -M:W52ZT+1%[HS1+5RUE$DVSXA^ENP8(E91MBY8>E?-NU>6O[2IF)A-LAZ[M(I -M%TZ4[B8I?=['1=)*SAM!ZK,)0!7,@(XR;%F@8K?V25)>E.I?<7=]7&"L?2;2 -M%X6B'YN%>7-*6SYVUAM!31#X%7RFMS:+U-Y_>T%3*)3_)Z"3GPV,IJJ&]>1( -M'VK&<+7A7P(3-+\_]UL)+$K=&;$X(`!P!```<`0```@```$4` -M`1A1EP``0!$``,"H`0'`J`$"`?0!]`$$!^G)MZ$-J#B5N:`^RV8K%UZR+B`D -M"`````<```#\(0``X'/&-.#S*B/RHMDD9*,0(%,2E*Q53B9E6>I-BY+9]SZD -M$Y)B`4@X(@5;CI#RX_Y^5RO9<_U#MT'J^M1=%[D<;?5L1FYG$"!M#"1)RT0& -M@'=RDT@9\O0^_W[W2!:9AXPRPDWU[C=@)TYQ60+?!K__%["?FS]$%8QI -M8^+>.2'([C&$1F4(B.\3B]I9"3YT73-S\I2:GP<(7.X-'$_'3%%8+'I:S>;> -M&:U39W\)OZ3V]E2CYS`>-!#!BSO6SYUH2*#/-A8NG?'0H5;8+TBHK/]LD_P[%Z>Q?HX-V -M]MGE\YBHY'/`Y$2ETXMJ&)]![EV3,E)$R1+RO`)&&MB/5VV7_$IT.'']Z6PC -M(%LKL^@260QRJD7E]^P=OX74#RI=&>&&\T<'CI\6;>[C0/AG`G,;S28`;PW2 -M=BRG6:F.EAV<6"*WK/P1!,E+$K=&XJD(`(P!``",`0```@```$4``8A1FP`` -M0!$``,"H`0'`J`$"`?0!]`%T!UG)MZ$-J#B5N:`^RV8K%UZR+B`D"`````@` -M``%L(0`!4"V5W,DB6TD1AOS^M^ZX;RDHH$LD/1)ILPAM%Y99`=27=9:5(HF?:(K$L0OYJ"@LD0SM.59*,ZS\)`9IO -M>MU4ZH;B5=%),=SM_,T;K3I:^C;! -M4.KEB8I>:)+`%QTM)YUZ#F`8N^=-82]`687J&N7,D");;,&$FYM!$(`NT]S@H%.(G1Z`[Z[0Y%B'DQZ3W3;Q- -M3Y^>.!$ND:OYKE5L!`@0NG`-,V&7B(-6>E"42)'5@950&V=(A]C2W3LY?]:& -MC&KL<7+*[TRF3$,Q"9$V1S5ZG`!E9/&$2Q*W1DK>"`!<`0``7`$```(```!% -M``%849P``$`1``#`J`$!P*@!`@'T`?0!1`A#:@XE;F@/LMF*Q=>LBX@ -M)"`````(```!/"$``2!3)<_5?Z,IMJ=#ZPFR\<2G:9.21Q60@Y#;J.VA^HUY -M7?ROKV>18/^9P?1[8_;T(J:6,&$6&:H8_5MOS>8FL4[[D@T%]Q -M==[YB[9,W=2-=Q3:C66'R)JOV*VB$Y22AA`>J$-8?>+S'_EVL2X4U2'@8YS9 -M[/LZ^X0ZTMKD%#:J)QE2]CBQ%XQZX(+$RAQ355,JR0Q'AH[GW'N,^$U)PY,> -MN^I?8[\.3'1UJ@!$#7/F(1,.BWJ#R9O;+2>W@6KNT865MB0(.).X/,L_S5U5 -M.^2?L90)H)>VI8L6N9G-=#AQ@X]!H47_Q43X^P3]$PG'`L(L!9VC@926I(,, -MA\,F)>OY9?+_DE%*,P@Z.\-SS]:TP.F"I.*3*4L2MT91!0D`?````'P````" -M````10``>%&=``!`$0``P*@!`<"H`0(!]`'T`&0&2;@?&VKXV+=E_HH8WX42 -MSW,N("4(`````````%PJ``!`H6X14$\\I%:^\J_5IU6=A6TRCY%%Q,`7PHIF -MI4`*\!Q-F>`0CP%@K`"0BU^8G2_,H0?9"3$2Q*W1O`0"0!L```` -M;`````(```!%``!H49X``$`1``#`J`$!P*@!`@'T`?0`5`8YN!\;:OC8MV7^ -MBAC?A1+/"+Y`'@```!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``V%7J_:,2Z>ZM';7ANHQ9R:XA%Q]3 -M:!%T=?XU-(1\5*Q4H)N7>HY,[JYJ*,;O2,[$A3-357@)S/H/]*A%$D; -MB6OGZA<5&A=IN)S#6;?F,ODHKV%DQU!7Y,">KS1GK!KK,7)JH\6"7.CF(X?M -M0J_(U3NVM#=>N1D-($U6OSX6S>M3NHJ>U>&P21_G4HN=!^ -M-79\GC%J=J$I```<``!`!`&T`6N5,KNU@LO<*-#XA5]'3G9U````'```0`7F -MMR3$J3JI0G.TX]75R60+'%R/!DL2MT8G.@H`7````%P````"````10``6%&D -M``!`$0``P*@!`<"H`0(!]`'T`$0&*<2B[`N64"PJ```````````I("(@```` -M`````#P````@``!`!@````&..MVKAKQ-2##=)0&SEZM';7ANHQ9R:XA%Q]3:!%T=?XU-(1\5*Q4H)N7>HY -M,[JYJ*,;O2,[$A3-357@)S/H/]*A%$D;B6OGZA<5&A=IN)S#6;?F,ODHKV%D -MQU!7Y,">KS1GK!KK,7)JH\6"7.CF(X?M0J_(U3NVM#=>N1D-($U6OSX6S>M3NHJ>U>&P21_G4HN=!^-79\GC%J=J$I```<``!`!`&T`6N5 -M,KNU@LO<*-#XA5]'3G9U````'```0`7FMR3$J3JI0G.TX]75R60+'%R/!DL2 -MMT;;;PH`4`$``%`!```"````10`!3%&G``!`$0``P*@!`<"H`0(!]`'T`3@' -M'<2B[`N64"PJ^2+_)"5(03XA("(@`````````3`B```P````+`$!``0#```, -M`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``%Z6*[+X -M)"?3I5TD<&(0BT0;G[O@_%()9Y)=0LZ-@]U&GWI"U)LG4IXA'@.K5-LD"UUU -M%Z"1^0O?=%CQ<03,OOHS/#PP1/S4''>*5J>\]O&0RE=?\ROK*J(B8ER/CY\] -MVMG:3AE@5KR8HBKY5%[Q!^5(#-1=#!Y@6L/@N2TM2)OK*0``),W^F7"M`+J) -M8#8S7F/A`>LT(YU5!5+FP2789K\F5GD7*0``'```0`3-&#^?2GIR0ZQ@3I"%S.(_S*.\ -M@<\TION-X_`WPH__&OPY`7?C,37Q!I<-RZV*%+B?237[$::BFW^C#9I1&22E -M>*_8HBB`^?M?D&%5&7]!-=UEV'OUZL0VL:@)+H25734&TI'B_30@C^D5$BKA -MYM.KHM_!\YCAV/`H@&(>X"'G(BD,@BJ`>6/UAJ;!`6,:+1^R2<+'QR.XKV&I -M#A(A8O`&M$5T?'*K]6C.Y\RD=2B)4]__0U[D$,I% -M\[J->9@9>V_A`5`GNJ_!9'E>V8>/Z^#*(CD,)<.CZC.*L?O(F^/-:1LX:F:& -M&::S<5:#:TC+!'.9R=3@@MEV/DHA4V.>PKIY`7GJ$Z -M,.9/KN=]7`_W.AZSJ+DK;.%7JDU$Z"+QG*;`+\/5;$L2MT89X`H`_````/P````"````10``^%&K``!`$0`` -MP*@!`<"H`0(!]`'T`.0&R<2B[`N64"PJ^2+_)"5(03XN("0(`````P```-PA -M``#`0#4WQE:`*$:#;Q#!L(67X?R[J:-+F^NOAE10P`6O*!8J+KX?!5I^%M1" -MBEU9ATWI#;6V#CA')C'^LLR#)R%SQ_8$+CK\S6.60B*;3>FOQ(/+F-QSD$GZ -M-$BD>AWZZE173Z;K$8)^P^/,DJ$D0,+TC7K:KM`(SM@[QH$09&700/L6:S^U -M1Q$SY(VH]1C>Q.E7$YCRI$.9LSXM;0]T9^8$@J>IF>VX^9%^97OY)V:?PXTA -M'GR4_6L!N@=E@Y)+$K=&LNH*`&P```!L`````@```$4``&A1K```0!$``,"H -M`0'`J`$"`?0!]`!4!CG$HNP+EE`L*ODB_R0E2$$^+B`D(`````(```!,*0`` -M,.'R0$-X?/B:@^(T)E.X^GI_9M2XXZ-UC#NDFLUD1*Z>/M._>GMI_%>!-TBD -M2Q*W1F4'"P!L````;`````(```!%``!H4:T``$`1``#`J`$!P*@!`@'T`?0` -M5`8YQ*+L"Y90+"KY(O\D)4A!/BX@)"`````#````3"D``#"YZ!2Y]\P!0J$C -M;Y$YI4:3ZN\\DM?8ZD[C\)^BSPC3)J+:8[J7)KP=F"&)-TL2MT;2(@L`/`$` -M`#P!```"````10`!.%&N``!`$0``P*@!`<"H`0(!]`'T`20'"<2B[`N64"PJ -M^2+_)"5(03XN("0(````!````1PA``$`3F4@`_X,WP9'^J1WP?9[;G5V47EGVBPR:LJ5(2($&J8SN`7U'+0) -M=CU.A4EK0!M>!_8ZX2EDS<$\8:5L3Z+"^<4;N1-$9IA936+D!!!_'3#Q.^75 -MRID;4L%%@$2-&"+G^C[EAZG7,2UC9'\8-77_!F$:(M&P^:US?%1\UO==#VL[ -MH#-IJVP6,)-L."L6V2#9Z/5VZ++,,X'OZ8^#G$CM]]\/O2@!8'QGOC\_H@.U8U*?R<9:+K_N.`1%&+ED+D!',M,CP_R$]3&QG$T["3M'LG%\T,:#94A-'O:CQW2#_(GDM276M`>'9<_ -MYZCQNU2`29NA',+8Y7BB'-TFOM[/91#1^--]"814KB2A6(Q?N37@_N]2"D@3 -M=VC5K'QT0QTW7]![+.\H<9.=^"@X;NAWS1P@^)3]^+W3\L2*2Q*W1AP_"P#L -M````[`````(```!%``#H4;```$`1``#`J`$!P*@!`@'T`?0`U`:YQ*+L"Y90 -M+"KY(O\D)4A!/BX@)"`````$````S"$``+!=3REOAH0&!L3%\[QKQT0?5%1C -M62.8W[]=9,+%=>-L1=6(V)<_^QHHP:IMVRL/ETF?UR$TZ>3$>##FAXB=7_K8.QWU> -M/3*88! -MZ`B$SVRC`!G52Q*W1DUA"P#L````[`````(```!%``#H4;$` -M`$`1``#`J`$!P*@!`@'T`?0`U`:YQ*+L"Y90+"KY(O\D)4A!/BX@)"`````% -M````S"$``+!6R:'22M.(LN`"UMG#8/@D=!J,;4T00-+.8EGBUS3$@7>6S6^^ -M>L[LYJ(VW=8KN+?3;?DIX9.\*&)..?,)"B#$&?%[-90?SJX&=]+A2+.Z).(1 -M%A'O8B)3M)B4(S,UAMVAD)WU"XJ9NG.`G-?IK<"L"#TD7\5 -M($Q(8:HYU&_PCTF5S=_,^QD?7=$-@7(SQM2VL#"_G/(FKU@N -M2Q*W1FE_"P`\`0``/`$```(```!%``$X4;(``$`1``#`J`$!P*@!`@'T`?0! -M)`<)Q*+L"Y90+"KY(O\D)4A!/BX@)`@````&```!'"$``0#&N7>1_1>LL\+C -M:$I@B4GH-APPT,AC`I0IJ>7J@E/T$<,?D0+A:&CT?'!,3&>)M*R/JIW*\7!& -MC5&,L4%O2(*&L?\W52(UL!V=4&<%4F,W@"D&!H>!-JZ$\#B;D;)9LF)%@I90 -MN*G6\>]D]ZS"*673M%O862]UGMTFWLYA1`%5WB-E\?Z^+)G1 -MJDE39NHIG1#%$G0I[_JOX']N8@EAP77N;GS#6&QM$^8@>HE%?M6*L'MA@;`F -MKMU5)"Z\#)Z!GA_/MR9Q_=%+$K=&HHL+`!P!```<`0```@```$4``1A1LP`` -M0!$``,"H`0'`J`$"`?0!]`$$!^G$HNP+EE`L*ODB_R0E2$$^+B`D"`````<` -M``#\(0``X$JDH`OK6AAMF1F8['=.H,ZV,;:7EE"!"6JR -MFP?TL=3(]NW+7TO$"6F4U7N.4$/"XVQ#T/BJ%T[AZF`(*[8$8[Y?U+VB;QNA -M;4>+LH+[E5YL&JK.R+'F%R;U*>O;'PL5R?75#WA]V13!P;-CATG]8M+U$(^U -MTR>``V*X#YT7ESD(&0H&JC7GF%:J1V!OK]$DOLVFM?))ILA]^K)YG*NFR#"" -MG%#F$4U7PIGO/5#/-1&OM67-()C@JD2S0ID#7G-!:VBTLJL@Y)$HNF0D^K\X -M>^-+$K=&O)H+`.P```#L`````@```$4``.A1M```0!$``,"H`0'`J`$"`?0! -M]`#4!KG$HNP+EE`L*ODB_R0E2$$^+B`D(`````8```#,(0``L(-,DXZ^M@S3UDEYVF -MS___*P59B:@,GP*Z-6;0BE=Q`*LW]UGJQK`_>[H:[Z[WVBE1\AX.*FYG*\#*52#!;7@'CC3UV?EG`'$$?P4YLNMB+.A"X<( -MG^@C_`@F`,B\I/#H)".9[=1!.0#'N,=8SKV(Y"E+$K=&';T+`.P```#L```` -M`@```$4``.A1M0``0!$``,"H`0'`J`$"`?0!]`#4!KG$HNP+EE`L*ODB_R0E -M2$$^+B`D(`````<```#,(0``L'_&H`03?2:584W2,(NQ.YDZC7V1_(50-UB("W].G$/1?\^YZ"V%XP>!KA,N-L -MU*Y!;R)B*QD40^)+$K=&_^(+`(P!``",`0```@```$4``8A1M@``0!$``,"H -M`0'`J`$"`?0!]`%T!UG$HNP+EE`L*ODB_R0E2$$^+B`D"`````@```%L(0`! -M4*1I\_<+H:4\3<^R2+ND\NNJ*NA"*.L\"GB<(-7O08(\V\]V_MGC3-L1AKA% -MU8,I!&GV>P;(X*O+0<[)O3SQ@?2G:V$5NJ]Y,-.52BE10VESA3@$'/`3,)&I -M^I28?6J1[4A07A+D?]7_8/,L)681"),"%$E'`M\NC;^V,WR,+=IBZGJTK5GV -M/'ER]!);:-`HXIH*W/X29I=X=U7@/[,D.7(HAB.I#2C6Z\X>(=>C@=Z;@T_Z -MU"`YN=;F?2X)EQ5VG%3F?):9#FG[L[F_-8U7 -M1)9E\%,H1']VT*7\DR(&7Y6WDQ[.MV78"V@-ZCL&D9Y!2J2_!RAV8;..<0&4 -MXA6$Z!ZJ`J=BTW;0`@*9M-/D2Q*W1A`8#`!<`0``7`$```(```!%``%84;<` -M`$`1``#`J`$!P*@!`@'T`?0!1`;\(BNEC+S+8M87)4>1YPLJW`:P1]W5(Q-/*.6FOW8)8D$0>Y -M%M#BU^G!I6Q->T3%VZ^S">(.1%>4[M]C8N*HA\.L"_UO:^B[!$(-DX12Y-F- -MU!3.3A_/KWU?.$',#LVCBA\DC:=WXDL2MT8!/PP`?````'P````"````10`` -M>%&X``!`$0``P*@!`<"H`0(!]`'T`&0&2>973-W"."`-UYI, -MYHAR%D20=SC9I?VVUS@5M$L2MT;E60P`;````&P````"````10``:%&Z``!` -M$0``P*@!`<"H`0(!]`'T`%0&.>973-:TH5GF,&4,3`GR93P95QM1J&?\D3_I57XQ;5)%#\S]A?5EP4 -M<23"T9M+$K=&(F<,`&P```!L`````@```$4``&A1NP``0!$``,"H`0'`J`$" -M`?0!]`!4!CGF5TS7*%`DJ(3OPJHJ[1K0B3GA3A7$1[J4*/@M0^18*Y29/12Q*W1EUA -M#0"8`0``F`$```(```!%``&44;T``$`1``#`J`$!P*@!`@'T`?0!@`=EX<)Q -M*,Y0B;X``````````"$@(@@````````!>"+\`'@```!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``Z_-Z8A0Z8_GG -M=>808WSPI9709FJ#%#%%?$D'[`M7':`7W%DFG8I<23%'Z)$BTY -M?!8T%=S3ZH&:A>HI```D9K8\?!#FBCQH51B!U!6*1]?$,CM-(*K7=OU/]P?A -MR*TI```<``!`!%?#>8-P'V/-G^M`=UEUT)@1[7W@````'```0`66)31VLMOK -MU5@$JN7#=\2.=&]IRDL2MT;X;PT`7````%P````"````10``6%&_``!`$0`` -MP*@!`<"H`0(!]`'T`$0&*>'"<2C.4(F^```````````I("(@`````````#P` -M```@``!`!@````&;&=90H@6[7Z)W+;/+?J2IP0H'$$L2MT:N?PT`N`$``+@! -M```"````10`!M%'```!`$0``P*@!`<"H`0(!]`'T`:`'A>'"<2C.4(F^```` -M```````I("((`````````9@A```@``!`!@````&;&=90H@6[7Z)W+;/+?J2I -MP0H'$"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``Z_-Z -M8A0Z8_GG=>808WSPI9709FJ#%#%%?$D'[`M7 -M':`7W%DFG8I<23%'Z)$BTY?!8T%=S3ZH&:A>HI```D9K8\?!#F -MBCQH51B!U!6*1]?$,CM-(*K7=OU/]P?AR*TI```<``!`!%?#>8-P'V/-G^M` -M=UEUT)@1[7W@````'```0`66)31VLMOKU5@$JN7#=\2.=&]IRDL2MT:WI`T` -M4`$``%`!```"````10`!3%'!``!`$0``P*@!`<"H`0(!]`'T`3@''>'"<2C. -M4(F^?<4JD[$?AYTA("(@`````````3`B```P````+`$!``0#```,`0``#(`. -M`(`#```(`@```@,```@#```"````"`0```(H``"(``(``(ANGZ&+QW]%4]-& -M,AP](CH_O/U67[#3J+XL.*^14*U&M:FD8-I]7@)>H\>\[FBRJF>*GHI4H8'M -M[@DE,AR!1(Y]*81I?.)$CF$6Y[Q&3/&9&\W,D,TF=*0``)+$_%VHQ?_Z.DSD"RWW\ -M'!HQ2N_]-%[-UE!^;#X$V0G<*0``'```0`0/MH#PLBLXW!=+B`C"`````$```#L(P``T$BU$8D2V/%PT"N,"PNU*?E^N).T2\$73;0Y -MKB99LXI.A>U7`Y"CJ92AFO*$RME1F;96POM(WU4!:/##8$`O)W01Z]BR'(9? -MKTO=@WKH!CN@=X/9OFC)K$C:NR7^&IN,Z%M[I_GF5'SJ'JO#T\E-/P=CO3XS -M^A])ZFU(ZSE;?"+*VWGG(.T#90>UUA+B>)\M6\.$%X2T-[\V1_=%_\]TI\QS -MB#K3HVL[BIZ/Q#+G4E[\*5^TGF#;^Z4TQFZK!]L#=[ZPT`O````+P````"````10``N%'#``!`$0``P*@!`<"H`0(!]`'T`*0& -MB>'"<2C.4(F^?<4JD[$?AYTN(",@`````0```)PD``"`OUH<_8M:*(W*?99E -M@$X_TE'80@C`W5=6'@_91:/*/\Q*:UBYL#.WUWQZ_> -M-!`PY'QW:'[M[5$[F)HX-%3.)ICA^(ZIC*E5@RZ:*+!K:4/L/.R%*[:Z%]:` -MEKZ/N:Y^,D^0FP#U^:'6;)$SEN)^YDL2MT;;"0X`'`$``!P!```"````10`! -M&%'$``!`$0``P*@!`<"H`0(!]`'T`00'Z>'"<2C.4(F^?<4JD[$?AYTN("0( -M`````@```/PA``#@]*3UK-ITAT3Y,[-MQU86X.83A/N -MI/IK$6P#%/1BTLF$HK$]#`'RA -M]7%UO:I_DCI*:N'T[0P0O1&M`EAM<6FBV,,!,=SG(H)'(%I&TC*_PLDQD/C%2Q2 -M-&!#^.0R!TL2MT8A%0X`_````/P````"````10``^%'%``!`$0``P*@!`<"H -M`0(!]`'T`.0&R>'"<2C.4(F^?<4JD[$?AYTN("0(`````P```-PA``#`51VA -MVUC"*)YD%(1G2S&1T&ED1#?C)#&3]^)E52!*6=GZ34HW0F.;_R!7]%860Z?> -M-4#XX3(#TS+=^@G;?Y2AUBH8:@Q/GWIU -M`+LZ]^AEG_ON2!HDF216_%OS55P5>8C_RA32)?(NTE^P9]_SK8)YYS_+_+1# -M0),$(N5+$K=&\!\.`&P```!L`````@```$4``&A1Q@``0!$``,"H`0'`J`$" -M`?0!]`!4!CGAPG$HSE")OGW%*I.Q'X>=+B`D(`````(```!,*0``,/A14TQ9 -M!!/W;>(&WS!W4EBS61T!8B(>]I9&"8+Q$=N>Q3>NC+GGQ?#N#)\B2Q*W1LTZ -M#@!L````;`````(```!%``!H4<<``$`1``#`J`$!P*@!`@'T`?0`5`8YX<)Q -M*,Y0B;Y]Q2J3L1^'G2X@)"`````#````3"D``##Y1LXCHJQ/NCA".C*'VGN\ -M^GA3`+XK(1[+=M-[HV6G$X+)I]2!#&+O)ITK5$L2MT9P5@X`/`$``#P!```" -M````10`!.%'(``!`$0``P*@!`<"H`0(!]`'T`20'">'"<2C.4(F^?<4JD[$? -MAYTN("0(````!````1PA``$`VJ*KJ<:^6I,\]FME.RHSM<*ZH:=`EBEYR46R -M@('3@[?;#T-08TWB5X1W]XE9/G512G%A.VXXS#Q6J8;0AH:GMOWOMSD@*.DU)6HI"L[N40RBZC(^[ -MC6Y/C(E,66'"RJ2B259N_>8#K`1W_"=3 -M2Q*W1FAB#@`<`0``'`$```(```!%``$84!I*)B8DAK -MSS8=1-YOX1(51T@,]P6*Y,IP$8<6R)8(Z4)P6)CB!,GR2W.PY^[48>"*4X/E -MB&K09TW#>Z&K6$Y>(U)<:2@#3.6UD\$#J/F`P\R-BP?%[1%=_%EY%6=)J(1$ -M8="[_75MB2>I9=:7XK6V&=R#U!2")VMVQ4,+*)`C1_Q^TD(U/P9K5#!$D[&!O\L2Q*W1H=R#@#L````[``` -M``(```!%``#H4%D@>@UKFJ"?7SWE5_]WQ%YJ -MC0H5\9SEZ/"N/G?ZC-S -M@^,#L*6^/O;9=2'82Q*W1G:5#@#L````[`````(```!%``#H4LJYXOR0B3.+&A@=K&7P1@W]7?*0Z:^(N2+PM`-%'%-`%)1J_R:!N? -MPX4S&JMWO_<"3@,V]]H1CD3AJPH)DCO-$[02Q*W1E.R -M#@`\`0``/`$```(```!%``$X4`$6ELBVVH=H#?IP=$SQO2G*J+$!FVF89[8AD+/G)=,.6NR-_-EM`\X*K?R]#Z[^_CN/; -M^JXS$DY.)J3$I1=LW+Q!0O=*?J/2PWPD4O`)%/$YV:3?OX#6Q4WR1)I+GY8[# -MB_=,1&2@_;,40[]+$K=&++X.`!P!```<`0```@```$4``1A1S0``0!$``,"H -M`0'`J`$"`?0!]`$$!^GAPG$HSE")OGW%*I.Q'X>=+B`D"`````<```#\(0`` -MX)"0TQ#Y1AXC3,TOZXC]VGEI$9E(J__Z-G+=T*4ZRBE@/GL6^EN\I_AYJEOXZMZ)@^QPD\ -MD00GH*3%<)Z)974=1OU="*>^K6E8B<=745`=56EL$$+5O.8R6^0QCDM+$K=& -MA=+B`D(`````8```#,(0``L-=H*$ES,NI1Y"U-0OQ4 -M\C+3<`TUW-/F1HXS1CYUOUG>P=`?I*+7OA]D"`A)-)%,K;D4SCA%HW]&&6S$ -MN'NZ?M`JZEYYS[YCZ([[XM9H6G?&'ZWQAO(H(A?L][]5VR(:L?O&U]H=0:MD -M&9CVY")9RTXHW.K(P]//./@M1&OL>,O^9.Q#FK*2)Q]A1*T5G]+MHH5JKSL[ -M$:?Y?F=+B`D -M(`````<```#,(0``L.4#I'**''BZAVUL5!9TVY!W);Z0ME]+$K=&,Q=+B`D"`````@```%L(0`!4`7_OHN] -M]Y^2GC(Z$BV`[;QPT:^`]ZSZ![8T\ -MT5E%3]^WP4E.)`J;((G=[P@^(3+DPF?NBG;1W(]%7+LCJ#SVEDT@[!HT4I:+ -M.:CW^)K:^*93=$G3Q`1EHM>5IWE'+K9D*W/;&')+`!P"%\$4E(.G),+>Z'ZK -MF!D^3U%=<\$'1%`OO&1!SCEY8SYQB/]H2EQ+[8ZQD$!?7CU.;YPL+JLT.D#G -MK2ST6LI2^QL[];S`_24?^A/!+],"=83"MI$E41T[E8A.SM>"1:=A9)`J?"H# -MZ9`H[;!(`(M04()-BG5Y_I*:^*&X`/`,RR+1J`\2:Z+3IVK!*[\/`(D2M&)F -MFT&'-_\QZ`0_1+3':>S>2]U,KO5X[R&+.Z1*)*8'N;\/D[:W#U$:"WF?D5X. -M8@JEL@S92NFE879I[.3:R1WX[[^(MIV_=U1HC1,G]F?;A-(5=HV"0T'2C4ZZ72 -MLS73'$H+_LCQJ.ZTV>0!]`,F7X8)2G-,BI;J%:]/7.D32Q:@I<"6I58"<1VS -MD*A"F&U<9(;=#G,Z!V?4GKD)190"="?I'ZH -M&B)J0+SSE;\$**EJT:MBULUU[`6\Z0<*EH=[[PR_6->KGE6FFO>"%3Z6F.X: -M--GU;(QT[HV&#W8?9-W.'?-0;6/9.=UB36O_7Y1$=FQ>OG#IT2A/KFM,O6(6 -M8O+!M'FM51FY)&;94I-,UDP2MT;_,0``?````'P````"````10``>%'2``!` -M$0``P*@!`<"H`0(!]`'T`&0&26GNEE[.JQ$4W.#>''CP28$N("4(```````` -M`%PJ``!`EMM`/YL?8?Y_/EIP34`4KEE@>"Q--J9_YBG`FWR%M/^?_E; -M.DK#OBPOW2C@+RRM'HF@M""?0:$'3!*W1H`]``!L````;`````(```!%``!H -M4=,``$`1``#`J`$!P*@!`@'T`?0`5`8Y:>Z67LZK$13/!)@2X@)2`` -M````````3````#`W["/:J-9V*+_(1Y'3@:*\&RZ9#L>)?9<7;6Q`.1V\K1ED -M_1;00<'Q,9XK"TP2MT8\3```;````&P````"````10``:%'4``!`$0``P*@! -M`<"H`0(!]`'T`%0&.6GNEE[.JQ$4W.#>''CP28$N("4(`````0```$PJ```P -MZ,2Q)@4/U#1-M5";EY[R;)?R3IB,IZF/%)=$%S+9JX1"*>I_=''!+^9?AT!, -M$K=&G%D``&P```!L`````@```$4``&A1U0``0!$``,"H`0'`J`$"`?0!]`!4 -M!CEI[I9>SJL1%-S@WAQX\$F!+B`E(`````$```!,````,)HD-M6R!O=@"+]`'@```!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``=.;S3ZDO8[?SP+YEAK$W<Q0+.5!O8AC[@:%H:\'-<]O- -M+]\)*TJI8=GA&`PCZ?)`]C1L$C63&&DFC,Z\P)]/]YOTT?*A69SAI_]:UH46 -MPU?DO2C"IY-[7```````````I("(@`````````#P````@``!` -M!@````&U#3Y[0=O6S@K0`JJ]([6V:7WY\TP2MT:/<@$`N`$``+@!```"```` -M10`!M%'8``!`$0``P*@!`<"H`0(!]`'T`:`'A4E>2C"IY-[7```````````I -M("((`````````9@A```@``!`!@````&U#3Y[0=O6S@K0`JJ]([6V:7WY\R(` -M`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``=.;S3ZDO8[?S -MP+YEAK$W<Q0+.5!O8AC[@:%H:\'-<]O-+]\)*TJI8=GA&`PCZ?)`]C1L$C63 -M&&DFC,Z\P)]/]YOTT?*A69SAI_]:UH46PU?DO2C"IY-[7K+DK -M_KE\1W,A("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```( -M`@```@,```@#```"````"`0```(H``"(``(``'B].KZ4K8BH*2S!*&&6:NNWFR@H)NT*(LOYVJ;5GS[6M -M\XOB2MS/X**=D1Z9JFKB..'LFEY9[I-3=,0I'=279+0`#S#HNFK1WK,F?^?X -M/"SR`&2WIJ?R84;SUH.6#FYMF)R?*0``)`@:Q2.6%'J89KG`$\SF"J%G_%HE -METM`J&\LP,F*B?-G*0``'```0`1=(B-E/TTDT%:[12M\P'SM0@&B=0```!P` -M`$`%WI].*H5/A#5*B968"3<6S"%0U1U,$K=&LL,!``P!```,`0```@```$4` -M`0A1V@``0!$``,"H`0'`J`$"`?0!]`#T!]E)7DHPJ>3>UZRY*_ZY?$=S+B`C -M"`````$```#L(P``T%MWNAU=$CXV_@`0P`_64?W93E!*VJI'86*%K.([A\&M -MUMIU6*/51X&?4S!IBOOL0EZM?^#'W)40`FI0@<"=3/@K68L0XQ^^4G^3J06X -M]9XU"<-'0 -MY9F=D"NSB=UE%6HXR#06!LK?Q'5)YI@/]0(,$3*C/UEG;44TIC$!XZ45R=WT -M*DU,$TKZ&TB#+M\SQ8E.RS(T=(!N+73F]R\[>GCP`*UZ4R1HX4P2MT8]W0$` -MO````+P````"````10``N%';``!`$0``P*@!`<"H`0(!]`'T`*0&B4E>2C"I -MY-[7K+DK_KE\1W,N(",@`````0```)PD``"`3<*::0*3#ZR,KF,WM155S1_A -M[)_9^**E<&?9FU6"VTET,@9B8'3D[FAA,J'Z#S4OH<"C?&5ORZ'H[*N7C9NM -M2'UBJ=W9P>EGY+]*\(VFL_A9//;C7S(_%9]L#G#0+7<'R#@RT3!Z4T"N6P\G -M?!;P*I'&1LTXAT-3'4__`DP2MT:A_`$`'`$``!P!```"````10`!&%'<``!` -M$0``P*@!`<"H`0(!]`'T`00'Z4E>2C"IY-[7K+DK_KE\1W,N("0(`````@`` -M`/PA``#@RT8%9]%4X3XGNSLCU-4\3O5PDT1^G_#Q4M`TW&73):=@1A/G=<0< -MLQ(6$76'Z3)(D`],(QQ.)!ST&%>+JNY=,6Z"?,;SET>\%U?[)FFB;C'W]BMT -ML/YCS4"?M("HGC.('*,YE9HG",&Z4#1))/1U==R",#U>2@ -MJ38=_\]PYWW(<@"*&A,*/-`FH!R;#Z>+M=+@7#]?5T,;7OBRATH_/V^6%1O" -M#C&WN"RI9TG39P("WM3:(,=3B[`O(E#IBL.<(O0)"2JZ(2N?$ISA95W@/'EU -M:DP2MT8)"`(`_````/P````"````10``^%'=``!`$0``P*@!`<"H`0(!]`'T -M`.0&R4E>2C"IY-[7K+DK_KE\1W,N("0(`````P```-PA``#`JAM$Q;;%WI^# -MW8V2LF$JI,'UDS8/TXT%^+C+K"C2IF6%4!6F?P4H<`K`3JYH2<2%[T9HCBESS1B9&8_V[A4 -M_#6=JA]G-!+N)\!,8@WMID^*)^WSR4TTZ;"Q?OU5!F!G1H3UCZKJ+0[?2;], -M$K=&QQ("`&P```!L`````@```$4``&A1W@``0!$``,"H`0'`J`$"`?0!]`!4 -M!CE)7DHPJ>3>UZRY*_ZY?$=S+B`D(`````(```!,*0``,`VE%S(%,L:HLDC; -ME=8X6C-1)R58)S#/'IT=0V:83+)K4SD*-^C3MP*X.5H`3!*W1GTN`@!L```` -M;`````(```!%``!H4=\``$`1``#`J`$!P*@!`@'T`?0`5`8Y25Y*,*GDWM>L -MN2O^N7Q'2C"IY-[7K+DK_KE\1W,N("0( -M````!````1PA``$`!@^VR8^^KM\'*=.`EY1#,^_%D`_.91+KWY+#?F&-7T-V -M]1`Y3+A2\<99=I>@,H)%+<,Q*'C*';\@^)@>#0TX0>4N9SG5.LIU`.MG -MQGVA&R#N<$-$ZY-0^*_E!A.973<)-&&7$)<\!@/SQ,M]^UAYZY2;KG\?&TK8 -M6BX]YS`,3_GV3U*U63#N,'$=XH)O*#[$6TN=)]'VT(HG-V'W`WG0FDD6NF[E -M]-X_W*]O-"G#9%FOO?!'K";G,CK(X0;#&BT?#$A@.#*$``$`1``#`J`$!P*@!`@'T`?0!!`?I25Y* -M,*GDWM>LN2O^N7Q'W)K(R1JG6?OY5<%71 -M!5MZ05W1A[VE'!1$%`RFW75TUL-S1E -MF7/HL-L3XN?2IPX!>Z#`4%SP5;YUP!<32[/UZ63L39=@<''LC(PNMEH5LQ@" -M2F*+8JZQ9&[XNL9_J;E4IHH/LQQ`FSL[NO:XP)SJK^>M8FQO)[W`IT(I];H& -MQ2EVO"H%`43O(J\Z]3.ER"*5%<>^+XN]LG9Z;J1KA3:-?0#URUG-]HLL%O[4 -M&-@0`I(S5(``$`1``#`J`$!P*@!`@'T`?0`U`:Y25Y*,*GDWM>LN2O^N7Q'OH^QSN`V%J,'!VW#,<.I&7ZU)RZK=\(WF=1)52SXGM"1PGVK -MO=Z]EM#*-<;M^F)O'&0_X&EE1U?Z&/*NZV,,``$`1``#`J`$!P*@! -M`@'T`?0`U`:Y25Y*,*GDWM>LN2O^N7Q'S_\E/37(\)_>[IM6R`L0X33,$?*R!#:7"F#Y)M>[ZPU3!*W1FNF`@`\`0`` -M/`$```(```!%``$X4>0``$`1``#`J`$!P*@!`@'T`?0!)`<)25Y*,*GDWM>L -MN2O^N7Q',O^WQB@ICF'G#&2:F7YVF'!;M>YU -MU0?-N;)JO3F)MIEO=P(&$=U56JVYS;*^<,3>UZRY*_ZY?$=S+B`D"`````<```#\(0``X-^1L`"R -MNU_X]>["SIED!-Q0C4QSZ=I) -MF54EFK:_E3Z5E`0YIA';0+*&^Q7,(A=NVQ]GN,P.D&/FC?_*GF<8;M4G;P&W -M*6FI96[FVVN]"F5C9.$UWG1QA;N%-PT;9)4VX?'S+ -M\#.I$9BDJ0W4:5FL-09]D&H"GNKP:,@XY>57\\C:0PRD$YWCU^/%7C>!_,Q) -M:#$Q7TT(6)@6888V)"$,JE7?UF(0@&G'PD:KI@_;#N.,[E5,$K=&Y\$"`.P` -M``#L`````@```$4``.A1Y@``0!$``,"H`0'`J`$"`?0!]`#4!KE)7DHPJ>3> -MUZRY*_ZY?$=S+B`D(`````8```#,(0``L+VK("\]">UY+PV36HD7$R9;@P)# -M'T$B5D%G,=S&\T0C1-J062:LM<:^=+/NF(6?0,BKU216=*?M;*1]JEO8%=9: -MA;U429#.T,HWG'8RUJ?/1(T78<[V^W4E(A\PQ>$ -MH<^3>UZRY*_ZY?$=S+B`D(`````<` -M``#,(0``L#*LQ%*"#$@D$1GEFU]7GKJ:S!,SNSRSRH0J1RL)-7?\QB5XUW*2 -MU^WC(U8CE/]H^X>J+>L?*&FZF'8$KU@(VCC9YKAJ^,"X(_%@_U.6L?7YO2X9 -M^JWJP')]T8'X9<8F$^/9#I[>3LYA"&N5MSDS`O%.!'\,Z?C@]K63I6=1*XNZ -MDS<6K[V-?!04_US-4/'+RH&AWXL2"J^8BP.O"00F:KW^U_D(O\!, -M$K=&VPH#`(P!``",`0```@```$4``8A1Z```0!$``,"H`0'`J`$"`?0!]`%T -M!UE)7DHPJ>3>UZRY*_ZY?$=S+B`D"`````@```%L(0`!4"N,8$.ED/?TMX.8 -MS!S"0NO%$N4J"T,$';;`.'/.IVSF'DJ3JA\2[C48M)"H=W?#W".SP=[:QI&N/1E.0P=LL78#^]`YG)W$A.M77$9%R'.T!T"0K,*#5ZGA3<[I\1ZP>)1A6LB'B.0X_DOS*`YO6T0-_U;S+< -MW;]2.2-ES]=CVV]P"=?N215,0VU<`-#R;L*;]Q*@,/!YL$NY)NI#C%.$#D``$`1``#`J`$!P*@! -M`@'T`?0!1`LN2O^N7Q'-MP\`$@I!JNL(9NMLQ4X-P88H)87 -MKGV_WYT9'N.JTX_$6!L*ZZP'(`(]S[VMM4D -MC]J5?Q+3)9[XP4P2MT;L9P,`?````'P````"````10``>%'J``!`$0``P*@! -M`<"H`0(!]`'T`&0&27$)7&*_[T$0H^JBM.]@/9LN("4(`````````%PJ``!` -M:G?X*#5-(9?J2DT_3;N>6JL55708+!AP*CU8(;FG*>$JZ@AMWG'E%\BJG@W, -M:1$L#UWC?[I-Z/:Q)1X^3!*W1O-S`P!L````;`````(```!%``!H4>L``$`1 -M``#`J`$!P*@!`@'T`?0`5`8Y<0E<8K_O01"CZJ*T[V`]FRX@)2`````````` -M3````##S3D17#F40.,@B?IB3*6#V!Z<27.C+;K/[N"+`&<\O:K[9'-CR\0ZR -M"1SF#$P2MT:8@P,`;````&P````"````10``:%'L``!`$0``P*@!`<"H`0(! -M]`'T`%0&.7$)7&*_[T$0H^JBM.]@/9LN("4(`````0```$PJ```P:7[>Y7`) -M3^VFA>&U:?[$1A[ZL=^+PL&D2=83^GV@5\HLHT.=&G'Z$S75^#Y,$K=&G)`# -M`&P```!L`````@```$4``&A1[0``0!$``,"H`0'`J`$"`?0!]`!4!CEQ"5QB -MO^]!$*/JHK3O8#V;+B`E(`````$```!,````,"?437%'^;[B.+[A/N(T_Q;W -M^IXYFV>ULNQ63!*W1A*-!`"8`0``F`$```(` -M``!%``&44>X``$`1``#`J`$!P*@!`@'T`?0!@`=E(0^#5WH_AJ\````````` -M`"$@(@@````````!>"+^`'@```!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``%PUIB`.3C(7(UZA10L?F:C.RM8%R.H0@S#")+[!)?ZUYL1%CJ)K! -MZV"+6U\(V*7NZ#`F?4X/RL1I[G7"/`NB_YK;^!\I29PM+H+E1]YS1'3T6.HQ -MSA4HRJ4`1I)?X=3L4%0QZ8H2;"T5B:\,4L3N*]Y6PGNI4N/[K]E\]Q.S'=HI -M```D=;LB]ZF846!BTYKM/J#D/5F"Y+L?[D7'HJ6:B8XN>Z,OWDRQ>)7WPW<4`B&96YD\7)9<*S:4=(^:LWSFYAQYIZ2' -M-K:6!#=,O_8OR",O8>S`;/(^H@8]A3)(Z[[-O3DCV..90LMEXU5M;*G'=\%Y -M5<3\!=*2D2LS+?I?O>FY*0``)$6DV0Z;G!ELW=@Y966`(@```!P``$`%!@C^&K]Q(M.XB[PZ,+B`C"`````$` -M``#L(P``T!Z]'&&442T)C\EHP)+':YK66^K!>)`_$K7ZW$Q)37MI*&.?[-!0_>GEWQ[?,5=A):;:*O9X"/3D>0W -M8*"M-5)R<[']^:4_EC%!B=>>RK#OK\9\\0Q:.J4O74"`+]PWRJDU#]D!MO -M;&0UAS^=+4Z8N4P2MT:_-@4`'`$``!P!```"````10`!&%'T``!`$0``P*@! -M`<"H`0(!]`'T`00'Z2$/@U=Z/X:OW$BT[B+O#HPN("0(`````@```/PA``#@ -MNB4ED-/*X*1)0,2:8U\6[XF@6LIRZ0I\FZT-"\Z?0%34"QZ6G*_35& -MQFKA0/YA0N^`5=HI^='^(U(?8^`T9G((PPG'>#I1(4W@K[BHGJ`MDD*FC]E`?P8P -M>$7Z?3AN`"C3+YU1G-G.75>9FX7-M\(*4DS#0I]8$Y. -M.PG(O"L[W`&'6C^;]R@5VV!G9@)&CF+FI6^)Z,@%WTR[$C!N6 -MJV8>B@GW*X"Z?OI?#Z`LJ/V'8U&A:#3RWO#?2#B;I6[BW1B.!AA4+IX>P_"G -MY>5.1WKP5C7'P$KMD0?VN:&7,C^&K]Q(M.XB[PZ,+B`D(`````(```!,*0``,`OL8QLB8G4QY)!U-_QM@Y\3!*W1I5J!0!L````;`````(` -M``!%``!H4?<``$`1``#`J`$!P*@!`@'T`?0`5`8Y(0^#5WH_AJ_<2+3N(N\. -MC"X@)"`````#````3"D``#"Z:K0F4O'B2FZR0D/6B!1ZK+-KRY3$7.\PV?,8 -M(+L?;&$V-;[DCVE1B9H0BTP2MT:-A@4`/`$``#P!```"````10`!.%'X``!` -M$0``P*@!`<"H`0(!]`'T`20'"2$/@U=Z/X:OW$BT[B+O#HPN("0(````!``` -M`1PA``$`54Z:1O!);;.S4"B`V;,);%XF$[BZK/?+6V#V!"/SG"^K(K-QH%D$ -M`5_C=[)>>QG[A](?"6P@F6AM<04OO8 -M*C0S$I`[R#22V3>&9I]6HIRU-KZ?9"QI,=0(!,Y)^B-]&>;FQ$ME4B[.%^<, -M$FL/35"P$$="CYI%!:'JS^CO/0U_9'^8E&,:NM\O1)?_#Q/X^>61SQ-O15:/ -MEMH_H5,/44\&V*_B8G_4P47\K9_L. -MW#?+]79!BU#^KB]E#]4>SW*8L6&N\H/#2$X3GL4P-O`:%A>Y]=;:&9(N&\YD -M1\!CB8B$8C2P>'PZ#KA?8=)Q&]A_HN%W7PJBQITJK:+8/PDT>2O`G$0ZS1WH -M1'5&K>Y&Z;;5%U:Q])AMRO+V'YU52RW,;F,?@#>6^F -MI\#O$6B_R4M-@BD=DS9Y]\',3!*W1FVB!0#L````[`````(```!%``#H4?H` -M`$`1``#`J`$!P*@!`@'T`?0`U`:Y(0^#5WH_AJ_<2+3N(N\.C"X@)"`````$ -M````S"$``+`[4(:,"'3\S0YG>OIU'AUYK43INFQ)6\]+/6IY@'O:W$G>HG6!ZPNF,?L'C$D?NA -M3!*W1K'%!0#L````[`````(```!%``#H4?L``$`1``#`J`$!P*@!`@'T`?0` -MU`:Y(0^#5WH_AJ_<2+3N(N\.C"X@)"`````%````S"$``+"!F*[:%,8XY6,U -MJK("4@!Y9M\#K*)7D9Y]%-;(&@M#E(6#N`EBF75;)^4[WJA=O3@:$88:R*S\ -MXA/U_,^E`.2G5)=>]VKR"CFCD5:.P16 -M`GB,E#DPQRENVBP9M]T8K2'O!92),%3H]5Y>J76F)PBH6OF0_Z&>^%/D&+'> -M5?>C]=R]CN-W7N/^-V$=YVLH?,,@'N`/^LVB'ZHM$\YW!?&YUB&7GT7>B5E, -M$K=&2/0%`!P!```<`0```@```$4``1A1_0``0!$``,"H`0'`J`$"`?0!]`$$ -M!^DA#X-7>C^&K]Q(M.XB[PZ,+B`D"`````<```#\(0``X'_-58"V?USAM4XK_66T4GZN0NL<[`OE\G -MC`$Q5#W\M%@6N.[JQ&OR0UVC -M21P7-=H191@L'`JZ?U2O?*,>T,2\3,V&K#3/C`%,$K=&(_\%`.P```#L```` -M`@```$4``.A1_@``0!$``,"H`0'`J`$"`?0!]`#4!KDA#X-7>C^&K]Q(M.XB -M[PZ,+B`D(`````8```#,(0``L/3V6#$EI>;6T6T][Y"O*(COT2X3U7X6QK`! -M!79$3'9O""*9KP!#LG.$*4Y-GCL>"_^&G\3$""K`:,ZW_OO^+(Z?_)*'9T1O -M&!CFF0K_4@0X4S0,V_MD!-.-!INIF:/>`*AET@7*2`F;SBG\U -M$KJ7^DM%W08>FBQ,$K=&/2,&`.P```#L`````@```$4``.A1_P``0!$``,"H -M`0'`J`$"`?0!]`#4!KDA#X-7>C^&K]Q(M.XB[PZ,+B`D(`````<```#,(0`` -ML/I/>VAGB(C9POX2:]\"X<]@`5JMLG4)K:0'+90H>.>);)FK6U,N->!:&HG' -M&G!W\X*TZ3`?KM2S`.S;E/B5AJU??Z)7QLV+ONW!GP')S@W[#%B^,B944?'S -M,ZM[2-Q="59GOOG5)G$#"Q[9.26I>2]AN@].\3,&NKJ&IYWFE[6>8!_M^ -M?[5"&TK@)=^S/VNEBW;L^EER&SD@'FYIN$H@-K0P]"\PP;'`3*Q,$K=&W4D& -M`(P!``",`0```@```$4``8A2````0!$``,"H`0'`J`$"`?0!]`%T!UDA#X-7 -M>C^&K]Q(M.XB[PZ,+B`D"`````@```%L(0`!4"^(C\F=F==H;)EHHVA10,E? -M$JU`(J\34@\P7$FC=3JD;ZYI1Y>U03`T7!BXB^J$Q%PI\?W:&+`)Q -MJK"`%*FA[^FH?L7((%?GTHPSB4X>7CE#RZJEG -MU*!(IIYFJ#$CY6T__C_WTK9;`9QB`-%M:U#*^;'KW_O4@H-,=[;1A; -ML*SJ^F$+:B&F1$A!#(V*>.>EEP&*GYF_4W$U2U*:1N#*[?##@CGWB=&<,^=G]P568U8N!D(@UO88,F -M?ID72W`'=]`Y:5K^^EJ0IA"4;W)O/SK4*+J_/[UTYG<2!`954S38Y7 -M3!*W1G5^!@!<`0``7`$```(```!%``%84@$``$`1``#`J`$!P*@!`@'T`?0! -M1`R?HA\%0L9H;T(HQM0DA(A,=7]J_ -M>7N\+79QB;+4FDJY_`&-6_V(I8!71OG`873&`R3['A)UXZF&0`F'V05!9.A+ -M8Q[J04P2MT;KI08`?````'P````"````10``>%("``!`$0``P*@!`<"H`0(! -M]`'T`&0&20&4T27/1=QBT5"@4([=0J^],DP#69FS3HU@ -MJW_B(\4TN1/@3!*W1GJQ!@!L````;`````(```!%``!H4@,``$`1``#`J`$! -MP*@!`@'T`?0`5`8Y`931)<]%W&+14*!0CMUR42X@)2``````````3````#"\ -M7D5\(XZ2&6,.*`)+@[-'59B'.W^35,M31L9%K&==F+(EV'Z<55=#KJH?"DP2 -MMT97P`8`;````&P````"````10``:%($``!`$0``P*@!`<"H`0(!]`'T`%0& -M.0&4T27/1=QBT5"@4([=H,J/^G#BRFE;L -MRTXPL>-@E?R@2@J+Y`LEQCB20D[@3!*W1CC+!P"8`0``F`$```(```!%``&4 -M4@8``$`1``#`J`$!P*@!`@'T`?0!@`=E[AGL/8J0(7X``````````"$@(@@` -M```````!>"+_`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M"+6XF3/&R2(T7C>Z;`L(OE\K+BE8D5;EBB'.\?-04`:.W*3:I!WY;R3R?,J7 -MG0*J3T0,;P57WSYUCZI_`[9D8"2\B6IKFUR -M:(7HMXUAS0B=DIQJJN_C1V\*%W+D_)PCK.O@@=)9MV+CE%AOCS4I```DLLWP -M+D-7$2B\#O+LB%YOH`DY&SW"(`>J?L[;=GY066LI```<``!`!!QSGS;NDVO3 -MZ-UP%14K_U)9]=TG````'```0`5FJ&G^RB9:1S^1J,AGM^EB.7817TP2MT;I -MV@<`7````%P````"````10``6%('``!`$0``P*@!`<"H`0(!]`'T`$0&*>X9 -M[#V*D"%^```````````I("(@`````````#P````@``!`!@````'"%2BX8-83 -MI?M?"VD0BKE_"W3W!4P2MT;PZ@<`N`$``+@!```"````10`!M%((``!`$0`` -MP*@!`<"H`0(!]`'T`:`'A>X9[#V*D"%^```````````I("((`````````9@A -M```@``!`!@````'"%2BX8-83I?M?"VD0BKE_"W3W!2(``'@```!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``"+6XF3/&R2(T7C>Z;`L(OE\K+BE8 -MD5;EBB'.\?-04`:.W*3:I!WY;R3R?,J7G0*J3T0,;P57WSYUCZI_`[9D8"2\B6IKFUR:(7HMXUAS0B=DIQJJN_C1V\*%W+D -M_)PCK.O@@=)9MV+CE%AOCS4I```DLLWP+D-7$2B\#O+LB%YOH`DY&SW"(`>J -M?L[;=GY066LI```<``!`!!QSGS;NDVO3Z-UP%14K_U)9]=TG````'```0`5F -MJ&G^RB9:1S^1J,AGM^EB.7817TP2MT;+#P@`4`$``%`!```"````10`!3%(+ -M``!`$0``P*@!`<"H`0(!]`'T`3@''>X9[#V*D"%^#G^G=Z"D4=4A("(@```` -M`````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```" -M````"`0```(H``"(``(``$R@6NY,M@>(P6=$G,=O*ZA]/\#HUV?&H$C"\\82 -M?-:4CKS/U/$F^=3DEPH+<#-0PTX3%:M,@2GB;%/7';4T6AK/Z;Q1ZR]FS8!2 -M(H@T]/@TKF,-:-&<]/R(-,\!$W%Y)0MM"[1Z-^Q-,838]UF0UT];\=R$_/?) -MR7!?'1XD8GO9*0``)!87/=SQXPK6^)DAHRQR5G_'W!A0CE)9SZ#;4H/W4\BQ -M*0``'```0`24J^>JBE?1224&=*AO=Y;Q+:<)+@```!P``$`%/"L_'=SAJY$5 -M9(*/`,9U6'0=P>),$K=&Z3P(``P!```,`0```@```$4``0A2#```0!$``,"H -M`0'`J`$"`?0!]`#T!]GN&>P]BI`A?@Y_IW>@I%'5+B`C"`````$```#L(P`` -MT(MK1=0FNEMI790)@,X-_1D5<[=)MOA>>=)G<28DI@^35AQFJU0^DNO5DN*/ -MWW[\X2^43=[KV/2I&H)UV@"PG&WH8-_UP^*P7&)`7QHV.(QA"&YE&K4QV0\R -MT!!.<03S<\YK[8%*S"T!.P?_0V+/*N:JWL>*#9V$[HE!(IN>FZ/%1J6J;_2O -MWZ'W%(@'Y7"+"AZ\?:I&47=VX+XE:R6,:>.AI#<%RI/$"=Y9=!R2,G<=^`HR -MUHV\HUP,95D=Q--1:E-$\/3%5K<>[9`@P4P2MT:950@`O````+P````"```` -M10``N%(-``!`$0``P*@!`<"H`0(!]`'T`*0&B>X9[#V*D"%^#G^G=Z"D4=4N -M(",@`````0```)PD``"`V\?KPQ(*/@2'>>V?U7QC4G#U2& -MVW)#A@0#8CT=_.%)V8Q=Q2X)XY0EX-@29QM"$F`TAQ,6$)35`5>I_R=8HY3^ -ML+FSHOJU1K\)6"T:A+;CCYMG&;@1>Q`*Q+JDBDL#$=^-?V(VDT-Q$.8DO$L- -MPL&7X4P2MT;^=0@`'`$``!P!```"````10`!&%(.``!`$0``P*@!`<"H`0(! -M]`'T`00'Z>X9[#V*D"%^#G^G=Z"D4=4N("0(`````@```/PA``#@G*S&90$. -MR*96T^:\6M]_L1ZIOUV,7&!H0TUR_0V[8;'H-G;P?7EC@-F#:2[$\G*J9"(S^#PH)6@'\S#Z*1@%]'CX/3Y!QLEW -MWQVA!)TCOR3=&QE5,L7`NAC7_JPAOL&FP5',(X.^UU[*'E -M@4=;":IAGBJ71S3Z3L%%?C;)N`%RC]1)/RQ#?R;S]8!Q3TP2MT86@@@`_``` -M`/P````"````10``^%(0``!`$0``P*@!`<"H`0(!]`'T`.0&R>X9[#V*D"%^ -M#G^G=Z"D4=4N("0(`````P```-PA``#`6;4YTO')ESVPK*`DK]JJ]/M?%8V] -MHB+DE#E=0?*IWK^N33O)ALQWU9&,.WG_+MB-DLT4WH%*PMJA[D0`DDT-*Q8=V)I6ARJMKB\VUW:>/C -M&+#Q6_()\Z)69UCRYEXWE&@+KD61IQ-=)?8HU@&HYW\UU;KY#$N& -M]&`V"E0>+-P]BI`A?@Y_ -MIW>@I%'5+B`D(`````(```!,*0``,.3DWHZ+A7*QBO?1%MD(!5O-0`542`*L -MASX2YT=1I1V3,I%M/`$O7#\03CK<3!*W1L>I"`!L````;`````(```!%``!H -M4A(``$`1``#`J`$!P*@!`@'T`?0`5`8Y[AGL/8J0(7X.?Z=WH*11U2X@)"`` -M```#````3"D``##U=XX9[#V*D"%^#G^G=Z"D4=4N("0(````!````1PA``$` -M];&G(O%@^]0G>S!I7U3_/2.*-$^A+M%IM:$".OXPU?Y>>`IV=QQ1B$AVT58X -MR#T2SQ6WH;G-C&BA/SKAE&?C0@7O^6NGQFJ-C),)SM&W_$%I(5.%.NBX2[0T -M.8@,RI>#A[U8Q;*OM9`9S-VL1AI%NZ>N*ZN-+O,(&E#C(4@%[;BV$WKC4I^S#WSN)->0!06(QS&MG!4/"Y3!*W1AS1"``<`0``'`$```(` -M``!%``$84A0``$`1``#`J`$!P*@!`@'T`?0!!`?I[AGL/8J0(7X.?Z=WH*11 -MU2X@)`@````%````_"$``.`>HDK.D&!YG@"2@CL;%QRE:>"W^6[JW+AC8J![ -M*8'HF8+=:A\I2<6GA/):S/>%35V1-&-,$U1OV>;FIX^!D)VX`NAOZ`\NL?62G@%/!SGR&*,V*2(Z__0H61 -M0FVQR6;:-NIPND@83!*W1BG@"`#L````[`````(```!%``#H4A4``$`1``#` -MJ`$!P*@!`@'T`?0`U`:Y[AGL/8J0(7X.?Z=WH*11U2X@)"`````$````S"$` -M`+#KYTY58/4^%KII;MGS+U7G=Z'1W>DDQ>DE%Z<0,L@)J.VN-C -M^F?VGRNT]Y-'BIX;3YI20IA/9E5E/^4E!:"7I3TYB^8MB_:Y[#L!2BWCT?_% -MXT\K<'I&B7+J]LV1=Z@\##:ZY![O?)I?^I":A`[.%_FX`#`;$6DV3!*W1BH# -M"0#L````[`````(```!%``#H4A8``$`1``#`J`$!P*@!`@'T`?0`U`:Y[AGL -M/8J0(7X.?Z=WH*11U2X@)"`````%````S"$``+#V1^/5^QN/LVU^EQ404)R< -M@$$V*5]BY7'`[CLT*0B`S@,K'[-VN2MR+G;&!"3YP[(YE"LD3\W_B%EJ\7R& -MPG-.6K_%4TEA%G3`@C8==J.Z^+LDI_1\>%CR^7G'*MB^7>L[ -M/N>%!Z@V&0-7P.LAJS:8W*$9.B5P3!*W1H,A"0`\`0``/`$```(```!%``$X -M4A<``$`1``#`J`$!P*@!`@'T`?0!)`<)[AGL/8J0(7X.?Z=WH*11U2X@)`@` -M```&```!'"$``0`=LTM>K*\.IUU$R3M8&QKO9$5LRU39,MJK8756`*6?G>G7 -MNQC9$XW$J@S6&M);)*4<2:1:#K(]C,,_,XD]?VKPG+YLAM!BN]"&Y:7$I1J\ -M$R1S4`70D\_A^LW/NUIECM1,!K=*'OM`'K$LL@A.2BL\O!?YP)1)-Q9R_'># -MRX_*O358&3TS<X]'YSJ0:PX`Y"=Z'OH2E1N`;:E -MF]+!%(*V;70^2YTYW]TO^31T_.Y,W`MZQH`$]=G-0!OU*AG)0+IMW#U73,H? -M0UH"NJ*WT!Z"+,%R,$$`;VF=W3DY7@'27WT(\=+TS;.6DU^8,UE,$K=&H"T) -M`!P!```<`0```@```$4``1A2&```0!$``,"H`0'`J`$"`?0!]`$$!^GN&>P] -MBI`A?@Y_IW>@I%'5+B`D"`````<```#\(0``X$@(^K1['HS"?,IWJ@J7@43A -MLI6T>#,B>%O93\U`6W,G;PUG2Z_!%E"%KS>;Y3_LF7M%#,)O+.0P,ZLI5EX% -MN0?;DGO%7KT4T!<&W[YZSGD'U8]M>,]Q^X'=1L.5*[X8J^39)RJ:H!@)190A -MY9R[H]5TM\@[.&7U"$IRKL+04&;9]1F^YVM097`[@C#"IO;Z0L6SX/A/'9AZ -M75FB_4L/5NF&].IO1)+(*P=#V*EDS3*IP]BI`A?@Y_IW>@I%'5+B`D -M(`````8```#,(0``L!CU>-GT*7!E&`MBAJ]I=Z]&R1;LS9W][)S`ZZJ`R%UB -M-A.,^#ZA`H#["ER$LTR@V#Y6=MG?HF@O_#KHG9,T?F>0Y8`5=4ZI&?UZ%(.! -MQM9TD;_DL/:[3TBZ457?>^.?1T,A0`=V\O5T_2U2D,T,_*])^V\=;8A]B)!" -MN5"@H*3_!!ZL-^]#@D>7E&LC-DB5`!T4CG>ON:=M]2[YU@)B^*@\#?"!)/V^ -M68%L27Q,$K=&5F`)`.P```#L`````@```$4``.A2&@``0!$``,"H`0'`J`$" -M`?0!]`#4!KGN&>P]BI`A?@Y_IW>@I%'5+B`D(`````<```#,(0``L)@&3^CU -M"63O&`-C)SKT354'*6SV\9@.QXZ>VL#IB5P*'C&[P53JV>X\!\?I5DLUW+*'I(#1E(B'@KN.O$JT1JC8P5OEZFLLFE#Z*2X="]TNE[9D?` -M<"AW$^.5A7__$=C.;B[@T,_TOINE$[&_5]-B1(1VN>@ -MN3YTLBO9Y_Z!+EI(18X\";>#,MZ3=`70I%*56'X&SLI,$K=&K88)`(P!``", -M`0```@```$4``8A2&P``0!$``,"H`0'`J`$"`?0!]`%T!UGN&>P]BI`A?@Y_ -MIW>@I%'5+B`D"`````@```%L(0`!4+"03O876W&6A/V=.IF>!C/^@+$!&SH` -M!+%HZ:N(G:UMP\G(?5$"*Q87O+!9J!I[II+AI.6E4YH5Q#E04KV&I%F=Y`!^ -M)-X^D#2A-?V@?7(N8068T(V`EYPJ,DX:^=^=_X%%J'VRN;"K7_--811!L+T/O5[9CJ#&SHHR^4@'*C(FJ+RI['7 -MYJ8YSU7:M-BXY@TQP083OBQDD]]ZLS/)@Q%\Y@#OK/;AQXZVLX370,C>*I8< -M[V_`*LP?ONB723N,T;A72N=*\&>9[B``6&K]'JJFGU(?"+M8=F^M3!*W1KJZ -M"0!<`0``7`$```(```!%``%84AP``$`1``#`J`$!P*@!`@'T`?0!1`4UM^<(5'U9%(1\G -M^J3;-5SDC\/@V'SC>]:_O>K4`NFBV_(Q!8BD-&_#(&/L^^/'=,_K?I\=BK5[ -MJV0^.]P&^VTGA2J3S7!A,7?,";AD^ZJ]31$1D(Q'?TF/V!)D!]KWM=A9OI&I -MJ=]YF2F.PMT72]6IB:%/[63X`@,:MSBH_@RK)/HJ+[>I:5V$_X%OQ6&#\"1I -MJ`B7U01#R@U'WW/6"AN8:.='Y;0&DL,!+O+=%_%BW#*B^]R3>_5?W0OWL6'T -MZ9F1SR>P2!;2+OH(*^PM3GXO`L;SJCT9D`DY#:'/2UDPN0N:J4HQC__J* -M<(@^'=8Z5L"3?`<4PK4*(M#4)/[A#YA%?-J";*@9RJU"#%0M,IQ#[[`J%TP2 -MMT;=X@D`?````'P````"````10``>%(=``!`$0``P*@!`<"H`0(!]`'T`&0& -M2:3R8NQ8.L6JU3M=$'3A+@@N("4(`````````%PJ``!`283J/FH7$T`2/?>; -MDRF&>HRS5YG:NB9"5^9P\5LY>;GC7=/6Y_1,$K=&7PH*`&P```!L`````@`` -M`$4``&A2(```0!$``,"H`0'`J`$"`?0!]`!4!CFD\F+L6#K%JM4[71!TX2X( -M+B`E(`````$```!,````,!Q%=:Z$X?-5ROQ8HWOO\T47_2"(!`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``PH4:(LCK -M/;2/1)L1M2/J1S$-K]"\-,BO4!5U$VO`@UB2<'@ -MC6@,?O:YE7$8H`G#'E&W6FZ,FM%'Q8=O4FRM@66O/J$I```D5]&)^SJ)S4L:U2 -M```````````I("(@`````````#P````@``!`!@````'U")2S/\&4+[<=W2M' -MY+818Z$YD$P2MT;U)@L`N`$``+@!```"````10`!M%(F``!`$0``P*@!`<"H -M`0(!]`'T`:`'A72:X0>4L:U2```````````I("((`````````9@A```@``!` -M!@````'U")2S/\&4+[<=W2M'Y+818Z$YD"(``'@```!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``PH4:(LCK/;2/1)L1M2/J1S$-K]"\-,BO4!5U$VO`@UB2<'@C6@,?O:YE7$8H`G#'E&W6FZ,FM%' -MQ8=O4FRM@66O/J$I```D5]&)^SJ)S4L:U2:.-U;(D[SF(A("(@`````````3`B -M```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0` -M``(H``"(``(``#RE:;R)8":$+6^F5/Y^;ON88LSZ30>1G0/LT6%]SH.\F!$. -M\5H:/S[!WL46<$'6^K<8!EUN]O63?T3(LJR8*H@`D?`C#ZZ4GFGGE!B-C@`9 -MCR$2>^^)@)>1W]'P'/U#L6LP9>Z5;;CU08Y!L^=I*4Z]6V(@1 -MA>/Q*0``)%L'R4\4]S55:^IV(KN40";T>N*=44[>E":'/+DJ]$)=*0``'``` -M0`0&&\_*E$S(4:Y8/14;FY4]&G&Y/@```!P``$`%W;W)"UV+EYRN(LW"4:EU -M1)MVSI),$K=&V'D+``P!```,`0```@```$4``0A2*```0!$``,"H`0'`J`$" -M`?0!]`#T!]ETFN$'E+&M4FCC=6R).\YB+B`C"`````$```#L(P``T#<9ZKAA -MK*6G[T5E'V!!5&IGP=WD2*BE,FKNY6=,4#<""<"6B:$IN(I3W:@2XT&'%.0] -MF:AP%20Z(M4L:U2:.-U;(D[SF(N(",@```` -M`0```)PD``"`-_`$@'%@]G5QVWIG-7FIA,SOKN[`FC4IIQ)X:S:WOD(UL1)K -MQN(0`6'%Y@O#"Q)(;?NDO]YO,0OC[M!6B;D)C`+4%CH3>[I7%*M2OETD?HV% -MDM'B4L:U2:.-U;(D[SF(N("0(`````@```/PA``#@%-T@5@`P` -M15Z0<97^6M-JQ'P7YIE+6_U%9IR\]$E,X\L(8<,91\S:2+OVI//'FEN#LLV[ -MKB15[&$]+%#`_GK-'MU1YS,A8#@JX3.M)N(^VJ6"F2( -MK/]*$(M#?/"."S4L:U2:.-U;(D[ -MSF(N("0(`````P```-PA``#`GHHRD9"NQ5\E;T:`.8Y8%T$"#KN&GXQBBFGW -M"]"0[MD)LC(=.MTZ@B'M1JEZX)`<*32V*:JA2Y&]5B(Q4W`RPMC]J*6DO^]@ -MM$7[`CTR\S8U+`6Q.)8>:N\61/G9$^&/LC*(3)$-I&8 -M'YF*NG1@D`BIKGFC?RO+3X:XCBKZ%,DSA1;"WCD5PT<[X&+Y?MQS7BW9B_7] -MJ49.BM"8NZ[A@D]WG9NVCR'D,`>>SR64#]Y,$K=&JL<+`&P```!L`````@`` -M`$4``&A2+```0!$``,"H`0'`J`$"`?0!]`!4!CETFN$'E+&M4FCC=6R).\YB -M+B`D(`````(```!,*0``,%S+@^7%6^J5LB/['@$8334>K>D>8$DGP&7[JH]; -MC9_-Q@Y?3LXZH.@>@7XT3!*W1A+C"P!L````;`````(```!%``!H4BT``$`1 -M``#`J`$!P*@!`@'T`?0`5`8Y=)KA!Y2QK5)HXW5LB3O.8BX@)"`````#```` -M3"D``##7#7"7P*8.<^J@JDB'V)TT'M2:Y9I0Y!?7*,C52*'JG.Z4//T4@``/ -M;OS=$TP2MT80_PL`/`$``#P!```"````10`!.%(N``!`$0``P*@!`<"H`0(! -M]`'T`20'"72:X0>4L:U2:.-U;(D[SF(N("0(````!````1PA``$`K`&UH`T0 -ML/E;GCK[]6='^,@0/.&%-Z=\#H,V#R`.3Q\,PFX84)U=G_RBINZH07A8[@?T -MH4`"9CGY+J+5WR+*9I&U+H3]UODE4$)%A(OV;B$90)^8GF6#8W]L7#BM1'S["ON@.@+8F;+ -M7!=A[G64784*OH;-T-GC\*[DB_SKYW`=P2!V!"7VR3!*W1M,+#``<`0``'`$```(```!%``$8 -M4B\``$`1``#`J`$!P*@!`@'T`?0!!`?I=)KA!Y2QK5)HXW5LB3O.8BX@)`@` -M```%````_"$``.!ZFVE]PI:]S9OAMI(.F:)[?_`6O5=E.P>N1AZ<(OI!<21' -M0Q0A4']E[&7Y+TR8FQ7PQ+MV.6B:/+=*^RW4>_RK(5:`RFF*4'-@ZP_U$2;O -M'O&#X*85^CM:2W?5NV$CSUV@8VB(IGX2R!.?=-0T;"H8AJIXQJ=9_JCBY/6] -M_T@4*M?66%Z?5EJ@HKZC?M4CLM9J,+YK&3;$9:+M]0`A#XI<9AV$VJ'I>@'K -MD'7`>*;Q1VE3T^O5T)OF,R2@\#Q"OJ%JG[#EO8\FI@Z$I$P,,=;^,\HE>A:! -M'`X.F]=P3!*W1@<;#`#L````[`````(```!%``#H4C```$`1``#`J`$!P*@! -M`@'T`?0`U`:Y=)KA!Y2QK5)HXW5LB3O.8BX@)"`````$````S"$``+#@)/'; -M4",TVN=H6)^'D^ -M83*1AH#[VQ*]T=.X)J]K&$U>>P>83!*W1IX]#`#L```` -M[`````(```!%``#H4C$``$`1``#`J`$!P*@!`@'T`?0`U`:Y=)KA!Y2QK5)H -MXW5LB3O.8BX@)"`````%````S"$``+#;F_++A1XD<6#8:^-HNS8!N1JKP`OK*>__+BJ9CM*N>1C:XH -MI$:^#\_K$T?Y,\J>T':8X5I(]8+%;S:!_&PBC@K&1>1A^FWAEPQ/DW%X$Y.L -M?.0^74KR>!B,&*.`8H>MI2C^6A:=ZPI@4^D72I$Y:_NY@^G4\PP2^SI>)DCX -ML.GV52KU7T1^9L".SX6D3!*W1LA;#``\`0``/`$```(```!%``$X4C(``$`1 -M``#`J`$!P*@!`@'T`?0!)`<)=)KA!Y2QK5)HXW5LB3O.8BX@)`@````&```! -M'"$``0`_]5.-#P8/HX#\#C&Z;?OPW(E'M-2KL%.5GMVNW86A0:M.2MZ+R#^. -M.YY[%)3YU$X8ORMI5G]T;F-SZI8=P"9)G8VRH5U;`N]"9P^W@WATTN=6R2VJ2*O\S -M]M=="(M3*T7>`KR1[F@VFU:"12`2Q_UG_(T?!4G0[86*M:RQ;J0$W)>%DFY[ -M"N`CHG#B"<.":BM&K9H9YV@)J[DIL["&]<77R3?..I;Y7(L70^4E'H(;!J3+ -M+TY0#AC$YSX,1("BB[E5:JG6BMA^5W(>/)2ZE,CX3ZE,$K=&SV<,`!P!```< -M`0```@```$4``1A2,P``0!$``,"H`0'`J`$"`?0!]`$$!^ETFN$'E+&M4FCC -M=6R).\YB+B`D"`````<```#\(0``X(;O_!PP63A69;09!I1:"FVV$YJ7][$Y -M`0G)DHK(=Y,W))UQ1]9!'I/D7,`QKA/<-R!;#K`]J\Y\Y.<-E:OLFIJH5T>C -M63^0_"D@(PRX7HI?X$[0DYRB.HQ?AIML7<%[K35>[6#[A7EZ!35EE#DBDS3T -M+-/G`CY7Q#1RC\#L>J4@K>D3!0@FDZ24!H1^U,:TO@3H/]FIZX\T/]QD8A5I -M%"1X4(42%.E9K!3']C=IHK)GCC>)]U"07IE93)$JFY]WL0D'=__9ZL6PS7:5 -M:G;HENILS5ZINJ_Y[0\0`EY,$K=&27<,`.P```#L`````@```$4``.A2-``` -M0!$``,"H`0'`J`$"`?0!]`#4!KETFN$'E+&M4FCC=6R).\YB+B`D(`````8` -M``#,(0``L`?>I5!ENL5F$C_[6$]7R,"<*O),DUO31\*?NTR -MWW?4-L,QEW*H+]@T/RKUW13SV-MRY&K@.\LTJ=\&$\0IM/W=."=BD#-[?JR* -MG\U]YFR7.WP#\KTDGLKL5BNCDZRD"]'`.7M^!*5V_#X5.I,DU!'Y;M@&_;], -M$K=&*9L,`.P```#L`````@```$4``.A2-0``0!$``,"H`0'`J`$"`?0!]`#4 -M!KETFN$'E+&M4FCC=6R).\YB+B`D(`````<```#,(0``L%(HDCC?=445[.JD -ML7G'T>ZYC=-CQA[BS:A^-MFS:)\`#$$C)&UU2;)J&@H4YK,OU9/$\8'L.+_W -ME5ZW%T9^P7;(?0J&,L8R8Q/JLQA)%QM5K?P14*R]($I_#$A,)'8X0WA#W&FU -MQUL:F&=46OKHV\#!*%Y9>@8YSW;[65\W=M;IA>O,]UE'A>X#W.WNG-\SW=XB -M`,?\@(EY$5T:.VQ%6Z)$1!O&:#=@R!2C(Q!,$K=&_\,,`(P!``",`0```@`` -M`$4``8A2.```0!$``,"H`0'`J`$"`?0!]`%T!UETFN$'E+&M4FCC=6R).\YB -M+B`D"`````@```%L(0`!4)J2@SI,6.Q^,L/BA;#U2K2YNT6ULX_#V"FJU.D3G'76BI5!?@LK,_;ZH6\BKJ[MA/H^0)JWHTSZUWZP%&U;))Y;8URP2)K+1HYD*>&M`T1W -M<]A-O?A!'>XW$6J+5AD_XLG@PY!NIJ5-^^J9HX-_.NO'&N8\88.JXNU5?W\0 -M%99I>;>/AJ?Z$/O_GL?^*5==T.TA&B(,K0Q1"4?#^N6R3!*W1BCX#`!<`0`` -M7`$```(```!%``%84CD``$`1``#`J`$!P*@!`@'T`?0!1``*!SQ1-E:*7;!)3?\?7K&#V`9H -M&T&/E4X03Q1`.]?,H2)Z\"#/>=01V?N[J -MH/G"[JEF?.KQ5M__)H4,"AQWM_N]S"H_)KM9Q.$45X=B!_R2C?]`*#D1L9(5'H]^; -MHNW99*%2!_,+FMBV)ER!A^-4^ZP,1/W][^11Y,*'G\0N@#[&H/S7-:-%S1SJ -MV_*A7P'+4RBMTZGQQVV'A-J7V9E\APO5:"2AVG0Z&T>Q_SS"OTP2MT8_(`T` -M?````'P````"````10``>%(Z``!`$0``P*@!`<"H`0(!]`'T`&0&204=V.3\ -M4I"PKZ88QZ]U!+0N("4(`````````%PJ``!``F(`\R:3'AJ$J`5J`.BZZY'; -M[J^-?\Q!HW%Z%,HX_=QEL8*'/2$P2MT8_/`T`;````&P` -M```"````10``:%(]``!`$0``P*@!`<"H`0(!]`'T`%0&.04=V.3\4I"PKZ88 -MQZ]U!+0N("4(`````0```$PJ```P#VZ8<<./(O2OO=02T+B`E(``` -M``$```!,````,`D5O^RMFTW7GOH^B'?QTY7P-\!)Q`D@IIH`F7/I7!C&T38- -M$0.A<#D-*66&3!*W1FA'#@"8`0``F`$```(```!%``&44C\``$`1``#`J`$! -MP*@!`@'T`?0!@`=EM3U8;BIC=]\``````````"$@(@@````````!>"("`'@` -M``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``R36]K.U%1U&J[LR4 -MXASC$&99,1(EQRS\YG)V\?;]07M=KIFN38M33M1>)27TTV3VRP=0&BZ=M](X -M+/"6*8'`&_'FTUEZ7Y3%:4OX[FJ1178P>3+4`-R!`"Y;O0GU6GK4=]L/VDO#4_ -MG*&2:V(I.7V=EM8\I'EX*>`I```<``!`!$74X0G;$2F$-Q$$'FR'RP3W$09^ -M````'```0`7N+KV=L.H-V;N#N+GQRYB]D=%_6$P2MT9M5@X`7````%P````" -M````10``6%)```!`$0``P*@!`<"H`0(!]`'T`$0&*;4]6&XJ8W??```````` -M```I("(@`````````#P````@``!`!@````&,,&F_N="[R4)/G/'9ZMM_+?R\ -M]TP2MT;79@X`N`$``+@!```"````10`!M%)!``!`$0``P*@!`<"H`0(!]`'T -M`:`'A;4]6&XJ8W??```````````I("((`````````9@A```@``!`!@````&, -M,&F_N="[R4)/G/'9ZMM_+?R\]R(``'@```!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``R36]K.U%1U&J[LR4XASC$&99,1(EQRS\YG)V\?;]07M= -MKIFN38M33M1>)27TTV3VRP=0&BZ=M](X+/"6*8'`&_'FTUEZ7Y3%:4OX[FJ1 -M178P>3+4`-R!`"Y;O0GU6GK4=]L/VDO#4_G*&2:V(I.7V=EM8\I'EX*>`I```< -M``!`!$74X0G;$2F$-Q$$'FR'RP3W$09^````'```0`7N+KV=L.H-V;N#N+GQ -MRYB]D=%_6$P2MT:(BPX`4`$``%`!```"````10`!3%)"``!`$0``P*@!`<"H -M`0(!]`'T`3@'';4]6&XJ8W??6W&-\QFR04\A("(@`````````3`B```P```` -M+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"( -M``(``+XOOGUZQ4+BNZ5,<(9+*3EOJ/MWK^GK"HE&-ZC?T:V:+MJQG3SB*BG1AG0DM/I/B,-"3LVFQ7LO538.=?V: -M6_;M8ZBK.CXR*'UN+AXVB;TW,("XE(86))@DC1VNB'D]98F93^59@/I3*0`` -M))?OTJJP%+\XB=U[\DF_.4(^@1DV<5HS1!]!_WUYAG9I*0``'```0`3#\<3+ -M+T<>F-WM\4+<,5Z:":UW2P```!P``$`%EP6RHOL#[@)2F6B7(:IM`Z39FC], -M$K=&4;D.``P!```,`0```@```$4``0A20P``0!$``,"H`0'`J`$"`?0!]`#T -M!]FU/5AN*F-WWUMQC?,9LD%/+B`C"`````$```#L(P``T&#(H=2:_SV)FD,E -MQH3=]ID#AV&SV:L,/:B%K6N@^7Q>EM8879?`6E8*%O'$!*6:FIR/02D:_Z-) -M:\^L%Z(BXR]BHCAO+VL623W9YLEP.TS%A;"!HY6^CR_DS]]O!SJP!1,59/+Y -M^O!NPP$1C$8#5[Z$UEDB(V%]YV*`9&N+UI3J!&EYVIB^\!.-3+>I=[GA0/'+ -M%Y`&EX^\MJR+_LL$I#1N63KS-<%6P+X2M=03VUK^V#@M2"WFJ?@EP5-<4.GS -ML=;,"!,L8EY*;;BS8$P2MT8,T@X`O````+P````"````10``N%)$``!`$0`` -MP*@!`<"H`0(!]`'T`*0&B;4]6&XJ8W??6W&-\QFR04\N(",@`````0```)PD -M``"`WV;2Z)>V^DPFF5<\/;>CR]XN>S&,HM=/Q#YC`H!I9N -M.35%^C+6EYG8>J[IM)R7P!I`B@&_0UP#G:K&WWK#6!ZT=8\ZG[JYI+DI?]Y` -M/W)9>CV+22S"-D_%G7ZXNU/!02>A]'V)T&&]WX<2G^H5]?.4CTP2MT:(\@X` -M'`$``!P!```"````10`!&%)%``!`$0``P*@!`<"H`0(!]`'T`00'Z;4]6&XJ -M8W??6W&-\QFR04\N("0(`````@```/PA``#@]LUL4#2#X5WU.J:ONQ&248,M -M3I$Z$QGB4$8^F/[ZFB53!YOAH_?E;.ON*BNG/0CX[IO9'X0Y7U@F?NL56 -M"R6ZQD95.0QK/[`^'R@1Z:N3<^/OX;EEC3$=L7@^)`<5K"_IQ4^WRMLT00;= -MO0#]_D!!FURXU(TJ9"MSA9?3<*H_09HU8)@U:5<@OQ2D\Q:CH^Q]MN`W"M%;51[)!;1: -M9Q)=62GRN?K+J(JN*Z?2_5HE'&$OH.O,-4[LB/75QA5UUKEGV]Q&F?SW%6/*P4&"//8G -M_>TX:VF&Z&'XGJ$SJ7X$6SLS;+J)G2OUWE:D9`PHQ;S<:LQ.23I6$L_GCZC> -MYX0*<[#R(O?;`56K.YJ^`]GWP`ON5JB\]]4O$$YPX<_RN[@REX&S,"P6^HKR -M'`!HK9;I/PI8TPCAAAAKET"?5CJ:F -MKY%*\%S_BEQ&3!*W1A(G#P!L````;`````(```!%``!H4DH``$`1``#`J`$! -MP*@!`@'T`?0`5`8YM3U8;BIC=]];<8WS&;)!3RX@)"`````#````3"D``#`& -M!/92$7;H$88M$?*B>Y^N[`2PULB[IV`#R06USHWT0%/C=/W#C/T%V_"^WTT2 -MMT9]`0``/`$``#P!```"````10`!.%)+``!`$0``P*@!`<"H`0(!]`'T`20' -M";4]6&XJ8W??6W&-\QFR04\N("0(````!````1PA``$`S5U5VP)VU:^P"?3] -M2L]@&?`>9PBAPD%U&X49$'Z4*GH.ITBA%.*F$EJ0=%N&*(MGJ[+_PHQIDL,Y -M*ZANJPVS!$JSWUP%(I.''?]!A7.C['&(9ZB>O(.=&'[)-!O)3S:M-M.L,W=J -M61.C_FA![2Y]?;#*?CNEH6\%&I.9N>H_X>L@.9([DS=I`G,QW(G0:4R_[%<= -MATUUK_8]/5>J:V>=+2R2R_4<:-D`!:PZ#!/)>YBLRQU:V`98)XD6!*FA>;QQM>6T%-C28-13 -M_S0&M\;^-(ME.YAH.`,.[^E%)!2>)*0=Z*^N+PUN_]E^SE9)#2[&:7+=E:VN -M7.K5(FXV<61US5;/PX)2(HL.9M@AF9B6I.[!RM*=^.R0"2QO6F=Z%K)Y[-:Y -M".I]D6#F*7L%Y-O>/ST,L7:E_!WJ9[H^SL>-MXR&UP"."/VTBBU//ZG531*W -M1@(>```<`0``'`$```(```!%``$84DT``$`1``#`J`$!P*@!`@'T`?0!!`?I -MM3U8;BIC=]];<8WS&;)!3RX@)`@````%````_"$``.!8SP3O*;(-36/J_26X -M,X4+."":F^SI?MN15.W\R?,1!,S`[(/,<1LXS"N'[&%9XB270;H:\$4LOVMP -M^B1[EN)!%M<[*)6&&'E^:^,7>5`Q?Z'=[59Y:R=NG#"'4I)ZDQEA`BA5*O%' -M>+5?I3%'9>8YI9$8$:7\H -M:JE`NHD1%&[%.UQ<7V3!$#)<"/G!PQNT]2MW8OI@\&!.C[I/1>1^FX\+ -M&8W0OPJ"31*W1D]"``#L````[`````(` -M``!%``#H4DX``$`1``#`J`$!P*@!`@'T`?0`U`:YM3U8;BIC=]];<8WS&;)! -M3RX@)"`````%````S"$``+`&CLT>@\C9=%RG4U8.L1[PPSGLSK+)G'$*I#./ -M`28:/>[ID'W]\1$P#)*>G2HOIWVP\'W&>P`?T`^%:Y&6]=MW:V8;=*JV77^O& -M@)ZGL?U4&<_631*W1E)A```\`0``/`$```(```!%``$X4E```$`1``#`J`$! -MP*@!`@'T`?0!)`<)M3U8;BIC=]];<8WS&;)!3RX@)`@````&```!'"$``0!$ -M&0G$4OAA]*F7VSA8+INMB#@Z+,^F8@]14!@K>\9^42V-.>`X(6JM`M=3P[]_ -M\ZNST:>E(9+,?SBFM:1F+8]S"VQ5*_`]P$55\TA]BYN,S[U`5#4JEN8+1),W -M:U?=GO>HSU>L9A^2X;,Y%FKV+N4.]0\BO(X;>>=,0U&OC,_JHC%DOC\W+#4@ -MYP*%X;\Q9B)*,DYQ:9ZY+N,7\K(%=\GQ0OD.GO>+9=G^3)'6BP;*B/(K/!W' -MCPLNKN1/QY(X]U:RW=Z=:!-$K=&K&T``!P!```<`0```@`` -M`$4``1A240``0!$``,"H`0'`J`$"`?0!]`$$!^FU/5AN*F-WWUMQC?,9LD%/ -M+B`D"`````<```#\(0``X-'HW'\O=E\\C#4NA4"RG?!A-4Q::<`%P05`@R]X -MAZ/8YDI;X[YJX4E#BS01Z*-1-V8MQ6:+6Z-&%9GUU;"#M9$7[MJ_OE*@"Q]C -M%,C3>)6JPI=-\5E\QT]M^[;XC'NF.M).3M0^:7!`PE[*OQT5/6_V`>&>[TEE -MOR$D#T-W!_2J>;R9^PER#FCHN(45Q"_W!QR:U*<.7+_,W')'J@E9/D4RJP<^ -MB\Z(ZC+G([`:?LR+&'W-=>"NFD^Q8"\A9*`__'>O!^AV?*\>$)9@S*LR7MO( -M:"@\/9`]4!\^H^--$K=&"'T``.P```#L`````@```$4``.A24@``0!$``,"H -M`0'`J`$"`?0!]`#4!KFU/5AN*F-WWUMQC?,9LD%/+B`D(`````8```#,(0`` -ML`]Z"P5`@S.?\^1+3'D8+>2/EK;255FVVV1]+)TW,6RC97ONE81S[,8V8/.B\1*%&+ -MQQ05U;65%/TC$G`S36WE%HM)/'@DK2X5_6>0\4[9>Y+4W0MWIG1?VL2O.`K) -M\N&!P0TE5PJ5"5/*:.M@H&7^F*(#E!>]324:+_ZA-$K=&`*`` -M`.P```#L`````@```$4``.A24P``0!$``,"H`0'`J`$"`?0!]`#4!KFU/5AN -M*F-WWUMQC?,9LD%/+B`D(`````<```#,(0``L-Y&2:"W1KOJ=XC4WSS^9TCL -ML+JD7Q)H`+L87]RFJH#)K.W]@IPE^KUR3][G4RKX8V)1H)P%&BEJD//DO7 -M]$/#,)5N;R0LT-V7NSS[1YG9J%=.]W6>AX^4M%\C)EOCOO8Q?5-$K=&Z<<``(P!``",`0```@```$4``8A2 -M5```0!$``,"H`0'`J`$"`?0!]`%T!UFU/5AN*F-WWUMQC?,9LD%/+B`D"``` -M``@```%L(0`!4+I)DMIF(L@S\]$8QDZJR.FP4#)S/I6EVUUA;<,SZXCQOYV, -M1I75U%,+7P,!R"'%#3HW'!M'#C[UD4C6/V:#CN^_!B>)H:XMW\`I1%,>S_OA -M7P/(&R`4J"UK7S9/IAK`/"5F8R)67^R)+NIKU$1=??&?QRTBMJ=WC8]_([>7 -MX9>$<0XX?^*G=U@0F[.&V@1>D?;!?PHSH8=.CT$^0F6UMW"K0[EN"?H)-X$. -M3DMFJ"4Y6T>H+_4,36KN,T@X_"^DH,?;MWJY2[(ATM>QS4)+3)_.AIQ*PAR\ -M"*58().Q]Z[:EW/PNN]DRZMG2?C?`JK8875MWGMJ,I0CRCUC/UZ6CERMK0L& -M*8!-X3=MO`U&'J72S[7D9^X\'AHA_4NJ&-+WL)!I.GS(=)`')5"@S5Z]=Y(L -M5?H0$S_C@^"I8+7+>&)_D!U\^L=.6<+W)\DY31*W1I[]``!<`0``7`$```(` -M``!%``%84E4``$`1``#`J`$!P*@!`@'T`?0!1`(C#D%H/2:Z?0&B7N$YJC)$TCWGRVPWK-#? -MT$F(A51LZ_6[Z>O,)S52ZX[Q_BEDTBPE*+H)J1L1S^(J$3\):42J.46'-K3$ -M!Z,4L+T3:0$UB-WJI58'4TM`!)#J[/ZF(.PXHP]`T.L5G3'(S<>UM%SXW4T! -M#Z.-":9G9@]NPLT/4M@3!M8W)))-(N -MZ"(>%EC%)6``!`$0``P*@!`<"H`0(!]`'T`&0&24-7N-=2M4[IHZ@6 -M`@`P?#4N("4(`````````%PJ``!`,QV,YPTGZ,35(*T<%`;1;>W[9Q8\TRU< -MH&2R<]`0LQ^*280_!1[6AWJ`5(_Z#3^TKU<`X]ZG`%F`TPGZ31*W1J8R`0!L -M````;`````(```!%``!H4E<``$`1``#`J`$!P*@!`@'T`?0`5`8Y0U>XUU*U -M3NFCJ!8"`#!\-2X@)2``````````3````##!A6U)77&6S77RL\..SU$BVPZ) -MV-Z?/7@J+;@E+SHM':@8[0B)W`_P$8?54$T2MT:900$`;````&P````"```` -M10``:%)8``!`$0``P*@!`<"H`0(!]`'T`%0&.4-7N-=2M4[IHZ@6`@`P?#4N -M("4(`````0```$PJ```P0RQ,=G)J$&N/"X8)L/Z0C1PMTG:U)B03EPP!AD,S -MB]`=,/*H$!5,WT:$:@9-$K=&:TX!`&P```!L`````@```$4``&A260``0!$` -M`,"H`0'`J`$"`?0!]`!4!CE#5[C74K5.Z:.H%@(`,'PU+B`E(`````$```!, -M````,&-U@*_"`37$[VAWL`[:\51?'1?K!(>(:+,5GQ-'G;H&O)%K`Z+&\.!Y -M[O"B31*W1IU+`@"8`0``F`$```(```!%``&44EH``$`1``#`J`$!P*@!`@'T -M`?0!@`=E#>I>T#XBO.X``````````"$@(@@````````!>"(#`'@```!T`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``&ILD]&V_,:'QD%?VT!CX`J6& -MA30T6N11L"K>50J57U!DQR(2DLRN&Q0'0,Q-192EFS9^RX\82QY4%Q_QY0IS -M=Z6:(.O'VSYH*TJMY"KY`K -MN*,%IR;OSZ..C-G:R$G2[A2W=B -M9`N8=V*)V#V1`U(I```<``!`!#&4^QOIR<(R`",-1!3.7=0HR50J57U!DQR(2DLRN -M&Q0'0,Q-192EFS9^RX\82QY4%Q_QY0IS=Z6:(.O'VSYH*TJMY"KY`KN*,%IR;OSZ..C-G:R$G2[A2W=B9`N8=V*)V#V1`U(I```<``!`!#&4 -M^QOIR<(R`",-1!3.7=0HRC2AOF"M! -M!/K4@->O?GNF,:"\6CL=QSA(`]BV*RRG:EIUD--`V2D-:K!Y5Z/VXCO<*BLQ -MW18-G,`=&`3`J4-D3E@HAA3UC#T;DD@3Q>L<%C3&VVK$JK;S*0``)/1":?U* -M-N>`7!WB6VD8Z6#6@K+&G'`.J&"%=R(JU@7`*0``'```0`1N:.BR.P1*IGU: -M[5!!#&^+H\5N10```!P``$`%SG."O/DLD8$S>4;/O_L7U@_#!9U-$K=&KKX" -M``P!```,`0```@```$4``0A28```0!$``,"H`0'`J`$"`?0!]`#T!]D-ZE[0 -M/B*\[M"DR*6-2/,(+B`C"`````$```#L(P``T(R3NG/X%8?(AD^'3US-SK_< -MU>3A6^59JT?IQ8"C(<&%N[]LYWWYE81RH=*?@[AV.*",`S-OMO<5C!BBK"SI -MXDJ\B1$0HRB-"&Q8W+<__5:V^8582<>4C88GQ!","D4D#[T<\L@-LC!-&'ZZ -M)0^#[):K5$"9+P=]2U7H/9ZV"!OR -M'2@*=E"63^/,Q@>LOD6/=)E$#\O%ZF*-?-"U'\2096`4I&,^?_ -MPO)0D7"'YJRWC1("Y_<',$T2MT9V!`,`_````/P````"````10``^%)C``!` -M$0``P*@!`<"H`0(!]`'T`.0&R0WJ7M`^(KSNT*3(I8U(\P@N("0(`````P`` -M`-PA``#`80FF8'G;JI)C^K"^6GH`IF6,3PH9+XN1C#GU?U-FYVB+J2)_1X+^ -M(<*K5>:WOP9!XVR4=BBUEA)'6.:%+R?M -M2#VJ&=)=E -M&0JZ!#4FL\Q]SY`1D4-+5&M3PDI>T#XBO.[0I,BEC4CS""X@)"`````#````3"D``#"H/T16J1)M -M4V0,@`./OWA!K4.#GYP\Y1'5L0D%!U;A!V+%Y/25#N,\]U.D]DT2MT:?1P,` -M/`$``#P!```"````10`!.%)F``!`$0``P*@!`<"H`0(!]`'T`20'"0WJ7M`^ -M(KSNT*3(I8U(\P@N("0(````!````1PA``$`MK[#N5_`LL%3<9>BIN453QWB -MTF="L_!WKY0ITR^SK50(G&G\V8I?"=+8PIBG5,:7A8Q""NHZ<82`V2XP%+<: -MK.`>X1+.3HZ3U4J^J9O#-*QCJ1$\<4AVY]SAV:'YI6N`V(D6$LMGPETYT/TH -M<^'S9,/#D0"6CT(2NG(5R]Y<.%5NR+'FN9BZQ+!"0VX\D->.BNKGMX7B]4C[ -MI,5[L/I@/8HE,J"\=E;A-9@N`@96N]:9EOQ+XWHC;G&` -MEAPRLGKFE_)[B?@.XUAS>8`!8H!C;\D340JY_'[_A/&_C&!V%S`J)3<.A*`V -M6M7GKXZB,U]=31*W1H)4`P`<`0``'`$```(```!%``$84F<``$`1``#`J`$! -MP*@!`@'T`?0!!`?I#>I>T#XBO.[0I,BEC4CS""X@)`@````%````_"$``.", -MI%,W<5D!3AVO-KMDI%X8=AYLL\\5Q,/N\J+2A=8*ZV^Z"%?B$_5ZO[0QO:`#U-8$FV$B-?AP31*W1N]C -M`P#L````[`````(```!%``#H4F@``$`1``#`J`$!P*@!`@'T`?0`U`:Y#>I> -MT#XBO.[0I,BEC4CS""X@)"`````$````S"$``+"DPO=YKJ\DIOV>0><;K-P( -M*J?'#/I\;FK\3O>419^[\(-5X6P_792Y6)3[9?LBSSP-.X7(/CT6>G&#BW`3 -M!C.$534-:5P*6]L:`^7@5$O%B%NHX#@H2SZD9"DAZJO4ZFC;2IYPQCLRP?S* -MOFRXZ[Q+)7)T8_]="VH"X33\4HG';^#BGHBWE&9]4[)TG-?)UCJL5# -M\0#'"LAK^^7H%M1H]RV<2CFOA=W.31*W1@:*`P#L````[`````(```!%``#H -M4FL``$`1``#`J`$!P*@!`@'T`?0`U`:Y#>I>T#XBO.[0I,BEC4CS""X@)"`` -M```%````S"$``+#VMCY6>)L#,B?$KMIWRO1=U<6=>E7"K6L@E<8&,H4&'U'+ -M,>E?=L/BPE<$&L@2 -M1XJ)31*W1O^G`P`\`0``/`$```(```!%``$X4FP``$`1``#`J`$!P*@!`@'T -M`?0!)`<)#>I>T#XBO.[0I,BEC4CS""X@)`@````&```!'"$``0!5C*2-0*<&;PY$_2V;9?LI`53Q[3U$0T_`#S)Z* -M8W6,;W^LKK+G5L#V3O.!--C`F,D`0BQ-^Z7X"1^`H.[>R"A=T_>MO:(*`0Z! -M6&$B5-WZ1&KI]=>-J[[H&YD`O!K8:=OV]TP+%'3V"#H+-7<9E>!5B<9@AUBG(DSXJ@GH^X3> -M$ICOS8(1C+O[@Q&*\S)6!5/A1#DZ0IDW9Y09_F)/E.8!OF^V9FME'B3R)VC$ -M"="YN]`M!OI%8SI9#S-184TVK3!V'SC\R+L"VAA("(F1=M,*>6SOP3I3TBXD -MY0I3F>"'\OG99NUU.R,J+;TDZK(_Y6";\,H790*\THC(#B2C+-;T<(U.Y##)SZRM[MTSID'`,HZ7P5 -M[=E.!J*=NUYT>"_#[4@8C%JRE8A>`811W?_;60`^.^Y-$K=&->@#`.P```#L -M`````@```$4``.A2;P``0!$``,"H`0'`J`$"`?0!]`#4!KD-ZE[0/B*\[M"D -MR*6-2/,(+B`D(`````<```#,(0``L'G/V(AV<:@B?_FZ,$(U7EP"F9>$(+EH -MUBW``<6O(/'J20];AF"NH?HRU_I8?"I(5*#[QR?FCX3WL%]_6K7W-QK75$Q" -MT=VP3=2]UN3V2>8V2=`UW_T)968)A3;NTZ;J\*U\;]'*W&<.?_58E^S/5\8\ -M:<,:OR7OVU]._B.71I!)DH`\+1R5'9%UM"R/$-E243/@S[Y(#+I_K2Q,?%W+ -M^='PK8=0*2X+_CE?I,]-$K=&=`\$`(P!``",`0```@```$4``8A2<```0!$` -M`,"H`0'`J`$"`?0!]`%T!UD-ZE[0/B*\[M"DR*6-2/,(+B`D"`````@```%L -M(0`!4,I.Z+8*I\[&J*14$X%;)Q>Q3QSVD4:?Y65/2FB)]\"`PV[3H(8'-@>M -ME=2R)K+B0H@\X)4EG9=,D%)!2_1SQ8$=Y^7?B"M+-GUUP-M0;4$H#ALK#/ZH -MPD7V5'GMX>_*1;;!;?8[3LW;"#R&1A*\`!/8;7#X6XI2+;@W*]4]@:'$_AP"L<^=.:7MC<"0RM970TE]YGY42`<44980$)DJVN -MCQOAPI*<6A6)07006"WS6Z^\@:83[&A'+]23R2=7['Q@H^57?Y%LNFGNP6P; -M-T#EC'568QJ_Z#?GC6U*(G;U"`5,[DS(3N).@ER1ULZ=-[+6X#?=#MMKB";` -M:A!$]PME[A!*W#RA0#%@,)JU&CN631*W1I=#!`!<`0``7`$```(```!%``%8 -M4G$``$`1``#`J`$!P*@!`@'T`?0!1`I>T#XBO.[0I,BEC4CS""X@)"`` -M```(```!/"$``2#KR;SN\KR0*)9,;:J$'71):^JY/;)&_\W?@D;UPI8KAJY" -M*H1@RE&8";P$LC9:]#G:`1Q7E_]E+16[#=!H<-+D(FU+-?,)2)5Y0LD*J!PW -M]3G1!EC:%4Y:HYR5UH3M6&OMO`*)C)G2U]BUAW5=)%%*CY3IF)(^M\YDHHUT -M1V:X'Z9F.;_ZL,,+_+50$/BRP3_!#;J%GOW4(J"5@*U6U[S0NE!@ -M!<^PT\9D!YB]64V7N#)0=MU3,9YYQ#76M4CLP%ZD;*?@AOWL3;[<"UD,])O\ -M1[CUXQ5TYL6[5/"MH5#D^0>UA00;>6X')1_'JL79W[T$,)_\$47A=0J3.SDN3=M)C)@=$RY14T2MT8";`0`?````'P````"```` -M10``>%)R``!`$0``P*@!`<"H`0(!]`'T`&0&2:F>6>DN+"0+H'9:BWYFZ@HN -M("4(`````````%PJ``!`43RP@+?@]_CFIP&S(,R="TH>J$20,6M8KS6_K6BD -MP]U=V%4(6!XO^Q[V:CQ:ET\^KN8%]WGSK&RQMY9*31*W1N!X!`!L````;``` -M``(```!%``!H4G,``$`1``#`J`$!P*@!`@'T`?0`5`8YJ9Y9Z2XL)`N@=EJ+ -M?F;J"BX@)2``````````3````###D\)-JY$2]^#$?<)L[,P'$.]Y,:MK! -MSMGW\J*2SN"S1Z#C1:C2N#&8(TT2MT8[B00`;````&P````"````10``:%)T -M``!`$0``P*@!`<"H`0(!]`'T`%0&.:F>6>DN+"0+H'9:BWYFZ@HN("4(```` -M`0```$PJ```P=1@S[TA.+M2]MBL(L1A>B"!QXM2/=R"=?P;2V0ROUMW/B$1? -MY3H])'O!M/%-$K=&TI8$`&P```!L`````@```$4``&A2=0``0!$``,"H`0'` -MJ`$"`?0!]`!4!CFIGEGI+BPD"Z!V6HM^9NH*+B`E(`````$```!,````,*0? -MLGOTFMHIM8XA)3'A2%I5OGLQ"($`'@```!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``+XG$'[9>W9S*B>H8R&,0GL:Z8(>;V7VD -M,CE5"Z`2_3/ZC_H-0V\W]7L\*2_*![07TYH9B)&=93%`HI;CR;OH^VO6RT=H -M0"P\M>84^W#4!)8&XN,\=6Z0R/K*%K$`I```<``!`!)U.O>I94\J)KOT%PO[(DU*2J%&W````'```0`5=[49` -MC`N9WJ^;;_8(GW='`0RW+4T2MT:`H@4`7````%P````"````10``6%)W``!` -M$0``P*@!`<"H`0(!]`'T`$0&*6^?NDB\G:91```````````I("(@```````` -M`#P````@``!`!@````%G\)D]'V/_P["TH08)#9KL5!#JGTT2MT;0L@4`N`$` -M`+@!```"````10`!M%)X``!`$0``P*@!`<"H`0(!]`'T`:`'A6^?NDB\G:91 -M```````````I("((`````````9@A```@``!`!@````%G\)D]'V/_P["TH08) -M#9KL5!#JGR(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M+XG$'[9>W9S*B>H8R&,0GL:Z8(>;V7VD,CE5"Z`2_3/ZC_H-0V\W]7L\*2_* -M![07TYH9B)&=93%`HI;CR;OH^VO6RT=H0"P\M>84^W#4!)8&XN,\=6Z0R/K* -M%K$`I```<``!`!)U.O>I94\J) -MKOT%PO[(DU*2J%&W````'```0`5=[49`C`N9WJ^;;_8(GW='`0RW+4T2MT9V -MUP4`4`$``%`!```"````10`!3%)Y``!`$0``P*@!`<"H`0(!]`'T`3@''6^? -MNDB\G:914[O-'%Z?&S$A("(@`````````3`B```P````+`$!``0#```,`0`` -M#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``,A2R9EVS[5A -MZ9R/YW\S;5T7&%/$(ML -M(TW%#/!>YOCI7*0``'```0`3Z>[>R'WS6+2?<=F^$!?@O -M\^144@```!P``$`%EA53%@T]F-XR;JEW&48;;##JL%5-$K=&<@0&``P!```, -M`0```@```$4``0A2>@``0!$``,"H`0'`J`$"`?0!]`#T!]EOG[I(O)VF45.[ -MS1Q>GQLQ+B`C"`````$```#L(P``T*E0)S+(B!45N[!#F!I/]<*>V7I\&(P$ -M9*W/E8/\\F'A0H0^*<$/L@)I^^&P\@%[.QVBH0E=/>I!8:G0ICZ,P;*;<`J7 -M^.Z8!Q-Y]:"D4`1'CERL&:>G5\:8O2 -M613D+C/ZF`M#>C3-U._IA=:7T-9M&Z3<6>1'$PS57IG3!#!WX*;XCB!T^I!J -M@J3E4;;7WX8\QW0@WXE^L3M!B&@C*H)MM28E1Z"CJW3+C>KQ(%[FGSE;F5D" -MSDT2MT;;'@8`O````+P````"````10``N%)\``!`$0``P*@!`<"H`0(!]`'T -M`*0&B6^?NDB\G:914[O-'%Z?&S$N(",@`````0```)PD``"`_/::U@K8&I)K -M=Y-VXL>^L,OWMJ5RG0'NB6F\Z!YBZ"(?.Q7SSC,K0:H95W^[@NKCQ),VF*FX -M5,*02$,"--D38PW_?5R3%142]$13E&E_UX**X;W7`XJDT2MT;=/P8`'`$``!P!```"```` -M10`!&%)]``!`$0``P*@!`<"H`0(!]`'T`00'Z6^?NDB\G:914[O-'%Z?&S$N -M("0(`````@```/PA``#@`@T+/;$?SS219E]BF&K'Y`:4MDZZTO>N+:IW]@P@ -M;27N_R\\E#>-A3)8^P/P>7R=E#/5.CAU-F=QD%HEX$TNHPQ!P4S59+2#,#;Z -MR4M/$5>7R\?6A$%]7[Q.48<$>FW3S<8"-;9G90>=I9Z5"?#_WVH6$RCO@CRR -M,NHJQO(N1H:UFOREA86A#B<^663HM1#&QT0`!DW5=:DX7W],X.T#('H'763N -M];5D5@TN=SV",*=Q3>G[.;AI^V'@YZ?(8+OIQLT^:%SG\T_A0=?B`S:D6K5: -M?]*`C!T=D-O-PTT2MT9T2P8`_````/P````"````10``^%)^``!`$0``P*@! -M`<"H`0(!]`'T`.0&R6^?NDB\G:914[O-'%Z?&S$N("0(`````P```-PA``#` -ME$YE59@"VT$TQ\WYX?O2F=O]Q(>-]N'7115FGB4/^E/HL%CP26]`SM7V_E"G -M@_/MPB"U54R+J5VKR!N""85F]G8=-[4R_:U[$ZK -M4?4&C,K>X8-YT&@3G3C1--MI8#_9G@S3CC_U9",ZS8W7/ET7*PQ98R2MHT=. -M6.J?46U%63G0?6FL8[K%W)<;LT#_W`F=@#"AUA1>B@X4+3[HHYM`:.2>'=)J -MGD+M!@MGY-=-$K=&'%8&`&P```!L`````@```$4``&A2?P``0!$``,"H`0'` -MJ`$"`?0!]`!4!CEOG[I(O)VF45.[S1Q>GQLQ+B`D(`````(```!,*0``,+VC -M-0FBPTO)!O7DF9`(K2(5;A@J_S.:[-?+KS$PSS0^[ZEPK+/'RD*C>:Q031*W -M1B5R!@!L````;`````(```!%``!H4H```$`1``#`J`$!P*@!`@'T`?0`5`8Y -M;Y^Z2+R=IE%3N\T<7I\;,2X@)"`````#````3"D``#`QN'`6@[P04/H=R`.> -M=)DRL,_,XIFF\XHD(UN$!'K!(E%)"C6[%<_\K_(,*4T2MT;MC@8`/`$``#P! -M```"````10`!.%*"``!`$0``P*@!`<"H`0(!]`'T`20'"6^?NDB\G:914[O- -M'%Z?&S$N("0(````!````1PA``$`JP>=@YX39/;O09"HIJ2X3T>YC'.-S<4+&X*TFS;B;%BS3&PA3N]L&@G33R`["8^,@7'@Q&,68@1 -M@(!ZRYK?$$4;F[N?2+0(?EYN3^R.H0&A%MD27%GLM&+8%@2CT>5/S7$\!`H= -M"5F'+SJ`:TWL7P_IW95:Q_=^YPM8^#P67-1 -M#YE;5*PE(M^JL$Z421%0'59'#-\GLJWBW%MM7QB0!&9,`8YN-;3^#T>8,SS< -MRV29-P"^CX82E2+:O`4;JN\]3]X+7+ROI[N#F%N42-+]:W8J?]BA<`\A[0EQ -M>A3J31*W1E6?!@`<`0``'`$```(```!%``$84H,``$`1``#`J`$!P*@!`@'T -M`?0!!`?I;Y^Z2+R=IE%3N\T<7I\;,2X@)`@````%````_"$``.!/$`\O'S(9 -M^9OW[=C)O[^?9B`:@`F;?\\BO@1CO/`=IM]IZ7*[X^3IC3(Y!AG.?UU$:LO) -MR\4EJ[XU16]@X=DJ*$)X9`(OA1YWKJY/5A\G$<;B6Q5PU)F+P' -MFL61U#>@[WRW5[`+HP_E'"80=#+*JA^TCQ$`>@+"+?M;^`LE(KC>2(9\SK@V -MQC;#U79MW]W;\`9_5N3/J*CTK+[0G"2MFE>0?Y,*MN(*45H>/3H\R)W,S?Q+ -M_?"MTU#[XR'N:XQFLI&`BK*DIG/J\Y[Y5W\9Z:P9(SI831*W1B*J!@#L```` -M[`````(```!%``#H4H0``$`1``#`J`$!P*@!`@'T`?0`U`:Y;Y^Z2+R=IE%3 -MN\T<7I\;,2X@)"`````$````S"$``+"4Y:&RO(*-\]PF<;%@-O[P%$R?OD'( -MLU/Z3?%B*RRSL&6-`\'!"FTK,./?['D=RB=$W->$%0'^_#V8Q'"(9I2:,J@T -MGF@@"A(]J3QD(J!U+='43"%SK8LE.EB^A&`A"#:H6/"'708'+.[K-?6[=)KU5VRM?_!%G61C9TOX'GX -M1#PH@.Q!%(IB)BNKY[2731*W1A7.!@#L````[`````(```!%``#H4H4``$`1 -M``#`J`$!P*@!`@'T`?0`U`:Y;Y^Z2+R=IE%3N\T<7I\;,2X@)"`````%```` -MS"$``+"*""&7H!XL@PDLYMCV'8&D2%^_S;U470KW@O<;X%DZ&0B;%-^+",02 -MCSQ++<%FL.:)OV"/+A_-)Q:"OG6E<@%RM,L;@['@0>IJ29G5MP)2WV_D^2P1 -M(O:SL^Y+4ZA#<]3&D#A7C>+6%M$(V,6C%";G&@&WE3LNX::?;P$H.\4!&VL` -M,#$)^YR=E=^03']ED*/[Q5MMIOL$A>"!6_;(HX9#=7TP-V^YJY5.IKW9T?(LL6^\0$6* -M,%J6Z[YXK1!3%,=K!,BBJRJ$X\0[M8)12H(Y%]CO`FIEO[%\A16P_-SPX5O8 -M8X@H#KI`@%;XETCTN0F:92DS#__Z@"HRF[$L"&.BJQE;7FB8PE-:_EBBICCM]M1&]B-AH`4I'M\ZP7N;P/D6,30HC;;`B$ -MYZ5NI0U5`_%>@0B1I0U^6->V(LIG_N6Y&[$?GIUE,8)(D6K^D"\X3:&IXETV -M`4;DCC=Q36&ZOQ)&<^--$K=&N/D&`!P!```<`0```@```$4``1A2AP``0!$` -M`,"H`0'`J`$"`?0!]`$$!^EOG[I(O)VF45.[S1Q>GQLQ+B`D"`````<```#\ -M(0``X)-Y2#"<(Y^0I/'@#O>D`Q\]P[R]&(K:(HW3.YUG%"GE]CBX.S$T=J]I -MS^N;*K"7^4&MC7,2R -MJOC-%:MUSQ7)NFE1GQLQ+B`D(`````8```#,(0``L*ZX8(PJ/UW*"6*/ -MGOWTX^4@JM&ISSL7A\E#5GG,O&6_C"3H!TI&-J>$(KR!Q`R1F2!C90S]W6XM -M>_)^E\N3^W`\2=$R#%LVKYO;84=.8Q/9&:`TP0%6I1W/OYWP@IQVI9JH/6W\ -MG^9:,2P!)U8BOS#/20VS(L9'O*U!A&'P1NE=C8D3\H-]V0Q_:;X2.%/H+BNS -M=@R"X3L`$9FE61U?*N7TXRLR@:((CT!-$(Y-$K=&V2T'`.P```#L`````@`` -M`$4``.A2B0``0!$``,"H`0'`J`$"`?0!]`#4!KEOG[I(O)VF45.[S1Q>GQLQ -M+B`D(`````<```#,(0``L&#W=E[<.1;?0W*%7+6:RMAZ%N.8%>]BQI1UH%@" -M(.<6`#]2AW0?SEW';-S!S_9C;CPDA,J$B31:[S>:SU$CU>LH-!73W/9E`;A_'?\DL -M6-N0,L:L`^Q-$K=&@54'`(P!``",`0```@```$4``8A2B@``0!$``,"H`0'` -MJ`$"`?0!]`%T!UEOG[I(O)VF45.[S1Q>GQLQ+B`D"`````@```%L(0`!4/]] -M^S&#BT!@!*SA!^3ZDK7O$O&"64/)2WF?G7C-EP[ -M.[_9MRLN`^3%6K5GUH'$JZNF?87_HS[)Q"R]3`GWIO%DQP%';U.#OO.F35@C -MC>->!31*W1@Z+!P!<`0``7`$```(```!%``%84HL``$`1 -M``#`J`$!P*@!`@'T`?0!1`[UIEK5CN6M\!ZT&$YA83QQU1BN]:HBU2E+>;8XE -MN.U7-5CM&'%"!/K$+7HQ'[8%X+T=WLI1R$S5U?D[M^DGNTC=YN"@9G5T] -M2C!N7B[-4*[)3XL15X>?:MV',5]>)4V*HFI=&7357W&M0E+L=]D*U&M-!71' -MD(9DYUR5#72M.F-_>[YUNP/MV]*[>/[#AD)F9'=KADK5\PD#_65JNV`('`O5 -M:,*,5@K"2'RM47NSQNTK["`ET\PXIWD7X:M^+Z-4FQH"37&E:YM^`$E-V-@Q -MLNV:4CV,L#=E."5%\=T87K\*=>VQ/>^SL.Y27P]H-\_`NX(^S8:\<[BFP7+V -M?+?[]M\ZD+K[=_0.I/HNF>C^FTT2MT9:LP<`?````'P````"````10``>%*, -M``!`$0``P*@!`<"H`0(!]`'T`&0&2;"C$:MW7D+*H\`#SK:*^9@N("4(```` -M`````%PJ``!`Z=K![I'L`W31=%=76_DRT:UT\,',+0AQGDI,8C74($DOW,5P -M-=^5@S3A"F/R$A&1F1`>F#$!4FISG@C131*W1MF^!P!L````;`````(```!% -M``!H4HT``$`1``#`J`$!P*@!`@'T`?0`5`8YL*,1JW=>0LJCP`/.MHKYF"X@ -M)2``````````3````#"2"`5MRN"5*L8]A\RC4D@3FRS=F@/?;UI*EE7R'3,D -MBUK0=/AS.B,9L`$L4$T2MT8-S@<`;````&P````"````10``:%*.``!`$0`` -MP*@!`<"H`0(!]`'T`%0&.;"C$:MW7D+*H\`#SK:*^9@N("4(`````0```$PJ -M```P51AA&QW@89:5VZ'PJES^AG5ZN?0N%#--'%:(<@TG1R/K@=XF,)330:J> -MP^5-$K=&1-P'`&P```!L`````@```$4``&A2CP``0!$``,"H`0'`J`$"`?0! -M]`!4!CFPHQ&K=UY"RJ/``\ZVBOF8+B`E(`````$```!,````,(`'3FD63;/: -MJ#HA?(Z[;UVD)"('`'@```!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``KDG"CB"P8PE``1/76\1/JL(%+X1$`I -M```<``!`!+'GZ"/Y7',2F4DWQ>WZQ>+T&@(%+X1$`I```<``!`!+'GZ"/Y7',2F4DWQ>WZ -MQ>+T&@IG-`U`9O?]<2`39=!;><3D2=.7#X_.LCBE>;YRB):0PN`4$,2ES2Z. -MG,A>"R*E^@C7Z*LT`:*CXBS:#+Z\0'D+!$TF'VT*H&J0CI:M9?Q`F=^L\^&N -M#Q.V?H8--C'6+/U:)J8TJC$Y5P^"\O88*0``)*B8MJ_9T$%LH?"R7.<+L:P, -MP=)I_2O[Y$(]`)/3%!3V*0``'```0`0"8I+(7#ZH^2;0_6%S#31YHTU!T@`` -M`!P``$`%4RT?Q,1`I5'RYF]*RB$7-9G`76U-$K=&HTH)``P!```,`0```@`` -M`$4``0A2E```0!$``,"H`0'`J`$"`?0!]`#T!]D&8E3T9T\!,L]&S!MZWY#@ -M+B`C"`````$```#L(P``T,;>ZT,0HADGK'PK92M(9,;97TVAGY0S_#6J86"Z -M^_O_".WA.SXE@K&`D,=:U_EN"2XE=`V;.:@_+X@&I=LIEAG8WTFN:XFJ[:GQ -M-I+8J!NIIEKH"@<"].MX6!;_B'46&Z'MHP&7]';`(IT'F'9?ZJ,/L'-+J5=2 -M\8M5P-TMX!&L65MIQ:4@;PI;0]2UI,459LE'ZI-P[H[C5G,%EDJD<\9JC9N@ -M//!A@.8@='1R@(`^WS3<^EWBH3^BU64-N.5;[-N$]U_RH`=>],Q<=/W7#**F -M,`21,S4SA]*D97HT9E7W^ERKA+G?>*Y1IC7&ZH5=(7FR)_I!:\'3UH);Y1U_ -MM3UY8H:\G+=@AT_&>;>GAR`%B0OE>,D!+'^FQM6&\SK>8-#4NB&'QFSO)6!R -M(#?!##/NX[<$%$DI98JX[7KB>8><\`0^>4BS8Y9#-IA#N' -M8OR7V>WSU)&"^Z6@.>@X,6F?#-/M?R)0"#L:UNPQK] -MTWQ#^KJO#9^.@G=%UPG=OK`2.ZE/*DM^0X"X@)"`````#````3"D``##>*J^-/K+&.7$GD`4K#N7`F>%J -MUQ,^9I6Q+4VU0F=_\G4=3<=$(=#B[IG^5DT2MT;LT@D`/`$``#P!```"```` -M10`!.%*<``!`$0``P*@!`<"H`0(!]`'T`20'"09B5/1G3P$RST;,&WK?D.`N -M("0(````!````1PA``$`*"O+J81>#K[IZ*JB.?:YM4/;GQW/JY8L]"Y^>Q=" -MMV6U8JI#=T^KF:24IZY&1P^L+J2,M"X7_^0@770V1_A03SN?#`EN`@(9+'D; -M[1GP-8!HD8''VYS=E]("/U+&VJ\VXDYGFU8LK."-2KR;O!`.[M^0X"X@)`@````%````_"$``.#>B[ATQ0[RA`,O1[N% -M^!Q'-:N3(%02]#")3SE(\C2=Y!PJ&+#Y'D5Q,''MTT02-&3Y'61"&ZJN*=ZW]I[5O4 -MVZM?U5HVW<4YP+X/;8SG;(-@F'!]7JN80W0,31*W1JSN"0#L````[`````(` -M``!%``#H4IX``$`1``#`J`$!P*@!`@'T`?0`U`:Y!F)4]&=/`3+/1LP;>M^0 -MX"X@)"`````$````S"$``+!#=ZWV:F?Y;:9YB_MI"#\MOFM2T[V/('M5@"U^ -M"L\^7YMVV#0F;-DJ14:W`X$/(V,&Q-%"-2,'^,`KR:MOUNCL!..V+GW2-0L+ -M^NL"#XT?'S!%PU)[H7@]5%M^0X"X@)"`````%````S"$``+"P -M<%_30.P0_6"A]UJ1Q_0B37\A%*?S&-N]?>F8JA"OG6MS.L8V7%\XLUFH4:-] -M"72A$`-%N#MK*/2';R8$J..V.'WHSJ%QN::QMZ^8/W.)`R,G?UI&3^Z?LN8]@L8&_.,<5E9Y-8#G1[SN(DK!U%KK31*W1F,P"@`\ -M`0``/`$```(```!%``$X4J```$`1``#`J`$!P*@!`@'T`?0!)`<)!F)4]&=/ -M`3+/1LP;>M^0X"X@)`@````&```!'"$``0`(,\'?GUNU'QZ"XD2B17B19MIQ -MK1:!"'G4KTG@,:0ZSE.TT@9G%.D_^D$M&&"B>[RTW2$*OQN[!$AV?&E1H#9Z -MSJ84*,?:#DI+CZXXYDJ2D;E@T(F?=:JJ'2%RFVRODZLLNU"6%J1G9]S'6UU+ -MXYA!I8IOFW5,SJ2ELTQZ0S$F:9&]R'IX^+<<_IU-D2SVU/A@.D_[YA:;VAV+ -M^"'[DE&@MZTL*Y8+TIK[)6,-80JSA+L"DLTFZ[F47@9NDQM<$0+67C%>%L;` -M7U]WGR/KR.\YG\-QW="6*:T^D45%$:UAO;L_XB]3._O],;1Q1O`*KX&9-V3] -MD)88_(VP7[A-$K=&8#P*`!P!```<`0```@```$4``1A2H0``0!$``,"H`0'` -MJ`$"`?0!]`$$!^D&8E3T9T\!,L]&S!MZWY#@+B`D"`````<```#\(0``X$&Z -MT[11UXM/A]*$W;O+@KMP:8D>CV,Y\M%#EF\2N1`]/`3@!+@PA3FYSPZC&PC9 -M5U8A.#K/JOM-EMJ#.BP.KA?;%U_*UX>C._A%3:*2;9.BRW*_AJB,;L3PKWS1 -M_]\1D;)GH.!;QR&4+_3M^41#-F,D\]'(I81^6/(34*]@GN\!8&5P5P++FOA+ -M/7-Q.3+7(I[QC'`(J,_T9-P!;G6=T&*)6=Z9>,?@7.AIP/"8'I5GY1BC9S;6 -MC4NDT(Y3QGVF0WPKL.GST?F1@8L([X%-O1M+"U`OC)KCPL\+1"E-$K=&CTP* -M`.P```#L`````@```$4``.A2H@``0!$``,"H`0'`J`$"`?0!]`#4!KD&8E3T -M9T\!,L]&S!MZWY#@+B`D(`````8```#,(0``L`A%:)()"Z]`6O1SGQ4<3TD, -M`*'MZ>JYQ*1=W`]?LA34/L=?;WC:3HP6^`E:4\6((P`R.ZX[/M5FS'XILU*7OP">M@XYBHG:02[;\ -MZ"ME9(?,="J\C]Q>ZAOY.P4X9._J:_%MD%"#>9$B$A -M.[MV6NZ$Z>!]WKFO'G5U3:=PQRD`J6P[1LY[C]A.TU-$R)&W\7*`DY$ORX;] -M"J:V*4J-1O)IOU*M#Y`9U?E^+DWO!_F,KZ,72ZF`$,2B%!A:)DLQ_(0M<]7+ -ME4F7PC>SVNG8Z'P.<8^R+:]7VX>AN75_#KXSJ4C(!73ES9:GWL#`T?VL;W%MIG[>B*W?Z. -MF+,[ED*>#B^!0T*J&ZC`CF36#2Q6V6%E'GQV>&X$>AJC#V!J9-MY5V3RO3'L -M79+C,P=7?BI431*W1H;*"@!<`0``7`$```(```!%``%84J4``$`1``#`J`$! -MP*@!`@'T`?0!1`M^0X"X@)"`````(```!/"$``2#$ -M`RP0,%PQ;'W:[Q'(+P?HJZ6#R@[N,AH.N)M4RHWFF2+O.^X)%U%BJ(67_WK*;/0C_M2W#^]M]\\LU-G4$`SA]X-GYAD=D'\WX -MW5I6F!_/L"A_F08_HJU++-K:5%TH0HN@6"+[(^.FR?`'O@'$.$A'8=;;6:$O -M#&JL\)'Z\>M^]UXQS4T2MT8*\@H`?````'P````"````10``>%*F``!`$0`` -MP*@!`<"H`0(!]`'T`&0&21`?"3IJ(9;]J(K4GC=F@B8N("4(`````````%PJ -M``!`8`2%>.[('1GB+%%CS[*9SJ;)!A?Q0>@>XRD6K5MYJF`H5:N`*I39)7HI -M/RNF;.H(+H^)5+$XKGPB2PO831*W1GO]"@!L````;`````(```!%``!H4J<` -M`$`1``#`J`$!P*@!`@'T`?0`5`8Y$!\).FHAEOVHBM2>-V:")BX@)2`````` -M````3````#".9_JE8/QQ^60%6+[1J75B$*CUF)E29[G>S\T*4081^&7M"9]? -MY2S@`.4>K4T2MT;6#0L`;````&P````"````10``:%*H``!`$0``P*@!`<"H -M`0(!]`'T`%0&.1`?"3IJ(9;]J(K4GC=F@B8N("4(`````0```$PJ```P9F6T -M\,O"^S#`(P30C+M/$K]$#1M`@Z=8EL879*@(S%#O+D\I-!\NOWOB34]-$K=& -M;QL+`&P```!L`````@```$4``&A2J0``0!$``,"H`0'`J`$"`?0!]`!4!CD0 -M'PDZ:B&6_:B*U)XW9H(F+B`E(`````$```!,````,#W.ZA^<:@4TBE1^UUD) -MO!6#R-"Y8&SK2V"DG8[K-<16J3,,LU\]M,]M-?[O31*W1H46#`"8`0``F`$` -M``(```!%``&44JH``$`1``#`J`$!P*@!`@'T`?0!@`=E9ZG8I]&S"^4````` -M`````"$@(@@````````!>"((`'@```!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``E$LTHT1FOA(';0(6+`%A[$^,/V%#H!NUC3DH)NA_J<69G0:E -M"LEJ[AP;@<5W!$^U-+;XX9A^`SG8V:)M]57)^_$"9WCD/BHMNEW!9UQ`$8?M -M<$50"Q5-GOB%L!AT*,OZ4LI*GC=BT3]A`H)CKB\`6C@YH#+'P8MUS78@?#V$ -M;N4I```D0MP5-'[UU;49CC<2\??>4;4&N[;M\7D'7*_W4-'5S.PI```<``!` -M!%%9ED>`^=RJ#$AYD`RF]3.=[N*E````'```0`5L--/0`W@:(4H/\,;`2*Y] -M,&IP:$T2MT97)@P`7````%P````"````10``6%*K``!`$0``P*@!`<"H`0(! -M]`'T`$0&*6>IV*?1LPOE```````````I("(@`````````#P````@``!`!@`` -M``%N?J7&'(V_#-67B,PO$]!U%JF-EDT2MT:S-@P`N`$``+@!```"````10`! -MM%*L``!`$0``P*@!`<"H`0(!]`'T`:`'A6>IV*?1LPOE```````````I("(( -M`````````9@A```@``!`!@````%N?J7&'(V_#-67B,PO$]!U%JF-EB(``'@` -M``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``E$LTHT1FOA(';0(6 -M+`%A[$^,/V%#H!NUC3DH)NA_J<69G0:E"LEJ[AP;@<5W!$^U-+;XX9A^`SG8 -MV:)M]57)^_$"9WCD/BHMNEW!9UQ`$8?M<$50"Q5-GOB%L!AT*,OZ4LI*GC=B -MT3]A`H)CKB\`6C@YH#+'P8MUS78@?#V$;N4I```D0MP5-'[UU;49CC<2\??> -M4;4&N[;M\7D'7*_W4-'5S.PI```<``!`!%%9ED>`^=RJ#$AYD`RF]3.=[N*E -M````'```0`5L--/0`W@:(4H/\,;`2*Y],&IP:$T2MT:Z6@P`4`$``%`!```" -M````10`!3%*M``!`$0``P*@!`<"H`0(!]`'T`3@''6>IV*?1LPOE+:8JH($T -M#=HA("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@`` -M`@,```@#```"````"`0```(H``"(``(``!WC8X<+5V(\-J6"&LAH2-;"A.MX -M%S%;!AGNJ"2@T%1\QU_J3XH:*5'(U-GC(.@@PKWQ[YC;^-9Y76'65$YC`XLL -M16\.`-N);@`7\DT(9J:'WC]>!\K9(S68`WH[.@DLC"KJ*."B^`7QB:UP"Q@^ -MJH3KK#(Y5<^M@8F=;AO=0D$"*0``)#Y3!QV4KGG+F*)DB%1@:X4N-"D:SX-( -M[CLA@RX,:M[/*0``'```0`2/^I9=YS:''30K47&7[/W!LY^%-$K=&18D,``P!```,`0```@```$4``0A2 -MK@``0!$``,"H`0'`J`$"`?0!]`#T!]EGJ=BGT;,+Y2VF*J"!-`W:+B`C"``` -M``$```#L(P``T(7$HFXICM,:EE;X-9O?FY*U\.!IS1_,$X+A9\G/$#1-( -MY[ZY6QYDLK!,T(4RLF%@@D]-62TFV/WR/,1,B9%L$NUHS6N]9(:(XGE*OLG3 -M`"AH[^XO06>8&=LE=?'M\!`/$[%PHO^*'IC!=O`]PF29G6!^UUU._BKW42XL($T2MT;FH0P`O``` -M`+P````"````10``N%*O``!`$0``P*@!`<"H`0(!]`'T`*0&B6>IV*?1LPOE -M+:8JH($T#=HN(",@`````0```)PD``"`LBZ#SA[92Z(]ZY^7:LP)LN?QC#!( -M-&OS#I8%<*I@TF9,!74PN8'B!6@&Y5Z631QI03TI6!AKQWJQ`"NNYU" -MCM!RS?BOE+%G`KF`2$^>//J[6@M!DT2MT;9P`P`'`$``!P!```"````10`!&%*P``!`$0`` -MP*@!`<"H`0(!]`'T`00'Z6>IV*?1LPOE+:8JH($T#=HN("0(`````@```/PA -M``#@ED@,.4(W0&HLS`Y=7B7*UP^-RV1 -MZIE;,O"`],\&X`':UJV]SLJ\6P_RY=^T[Y)GI\.,BW6$ZK#4M']21`K-STT2 -MMT;-R0P`_````/P````"````10``^%*Q``!`$0``P*@!`<"H`0(!]`'T`.0& -MR6>IV*?1LPOE+:8JH($T#=HN("0(`````P```-PA``#`(?A/QCEW`+<0$2;H -MIF->56`=1'.NH*6-8X.BGZ:Q#PY4.($P>N$3.5T_"R"I\#^:)TG!O3#UI*1( -MTF-&,QC;%MOQ`2[_2EIN[-7WMP=D5X7MR*)Q#C205<4H;VK->'V*VL&T4/7O -MA!8Q9?N8N?1(I[V4V(J]+B1BZG2DWCU+1=#,T+H8%"K15R$V>1Y,E;!1/>W2 -MID>SO*T,QK[;>ZIV*?1LPOE+:8JH($T#=HN("0(```` -M!````1PA``$`GY?O7;Q7Y$HZ^S'XG>`BR>>E;ZEKDFB_I;[(]D,MU0['5^GG -M0T/*:)EI:302XC5$SW?E#;2JD@V%_K9@7K@79W_'!?BI&B2-,A[NUSM])((] -M][I%N&%U@_57#+0K!KINX1R)L9`3UYR<65B]'E\3LE!4>`E/!W*1,93[)O -M^_9^S$N4<&KN(?CV'32$K'FK2V1C)DT.YDL$0+U3'QH%7 -M`8T@/L%2XKB]V5+3L@(4EUH.=,`O/DORW?[Z9=$0OM#?\\E2HD32,(SA>Q(# -M-6[#QOE)V]<0`7GI\^AK_39`IV7Q31*W1GPL#0#L````[`````(```!%``#H -M4K8``$`1``#`J`$!P*@!`@'T`?0`U`:Y9ZG8I]&S"^4MIBJ@@30-VBX@)"`` -M```$````S"$``+!#?@[3%&N<7KHE4T@0C&T./[;R3[Z[1B3?JI`7E]$]=WKR -M6["(W -M,\Y18'Q06.WT-UR@E`O6T$62ZU'])[HR(C`U[:'G/Q:L>AF9+31E)A[6*:1& -MGJ2Y#7;K#O\B"-NXL!'F-:!!N_:`C+4(%+(WV&D,-4YK"JD"638"T3L1\7); -MRF#F31*W1C=/#0#L````[`````(```!%``#H4K<``$`1``#`J`$!P*@!`@'T -M`?0`U`:Y9ZG8I]&S"^4MIBJ@@30-VBX@)"`````%````S"$``+"K730T%6_< -M4EW,%[>?/)[`4K[P-^D"^;UOK)[]*S;K>"1!RFQ7Q/ -M#S)@E9Z"';P'L."J\"D;)+DIG]3:0.BB5XC(WT$YTHSOQ*<2_8(D,C\O@P[6 -MGJK):5E_CZ_)'UQLLP.HRXU43D?1H*<4GOT,!DLY31*W1G!L#0`\`0``/`$` -M``(```!%``$X4K@``$`1``#`J`$!P*@!`@'T`?0!)`<)9ZG8I]&S"^4MIBJ@ -M@30-VBX@)`@````&```!'"$``0#YZ^IR>Z7??]GX&&PAH=K,H8+NO8)NBE^B -M:F:TX<'D'##R_5`%1!TBK%55:V=]("PO1[9`@%^F(<="S5[2YOA5\76PBS1Q -M"!5)2+4P(-/F1GK$Z;3H(Z;B'?I-L+K_N+=JPK)BJI8)_?F(DFWMK>*[GFPG -M'X)JVL@\S7E[L#BM-,1"PO8("8)O8C^5JU!0)&+]4K\3UNP@WM&WR"\FQXQJQA8/T1&)&KI(Z:Y9\( -M/Q.O"GA:`8]+BA*Y.7HRP>_84@8;N'/@G/@&:R7TLC+H2D0@<*A'\$=DN`&%N#9$F@5 -MX87_H4J(47-CZKW9!PS2?"E:LLZI$_PI$&IZ3TYJ9?^?>$/.!DA+T5TKO][- -MIB5WWO"/0]LW4,2[H_PDQ/8A%\BMK]F"7"Z`KX?<>@W+"EA%RN?$XA0N^+P5 -M$*PB^M5W)""W#Y?.VM5??%[KC+@[RVE`=H_X:EXU*9M-$K=&FH<-`.P```#L -M`````@```$4``.A2N@``0!$``,"H`0'`J`$"`?0!]`#4!KEGJ=BGT;,+Y2VF -M*J"!-`W:+B`D(`````8```#,(0``L`Y/95LU4^*9#[=[D-T.2H>39@,:,X@] -MVNV"<+T[H]_=_&.?PPTR9#AI@5`&EZF$LOR%V>?JK6ZP\%L7^"16O7DR\>=N-JK:$"JUZKHH:-0DRS+Y*ZPR1CNK3AMX7QX) -MX7*O.8J#)VN2P;:I!3%-$K=&G*L-`.P```#L`````@```$4``.A2NP``0!$` -M`,"H`0'`J`$"`?0!]`#4!KEGJ=BGT;,+Y2VF*J"!-`W:+B`D(`````<```#, -M(0``L!DBMDFG3#T$"I!R)VR?[D40[$8\2(Y5LOQ>NLX2(WH3\/I6QGX6NQ8=F+>+*QA>V -MK-#>5A@IIRZ)A0_<]!3)'\*#;"*&O/:S<8=[@'GDQV(GG%[D8)]HOZ](JA9S -M.(E\4Z"43[5G/*Y-$K=& -MGM(-`(P!``",`0```@```$4``8A2O```0!$``,"H`0'`J`$"`?0!]`%T!UEG -MJ=BGT;,+Y2VF*J"!-`W:+B`D"`````@```%L(0`!4(D$R4+*.W0DPE.]^4#\ -M%.W[=R[>MCWXD6O!`^_,B;UB7,&1IQU#!CC+][O% -M>0V8T_,)*2E3C\T!(D`OD3/K=+-BW?>2).`]2,+YDS\,1R14)N-;2\V`5I3; -MU"^!(%)&MMUIT>`]J?;S<2%\=">;4XR-4OADF&775BD*:D[4O1A9,Q;<@O -M@D%PX"@*!M(R'UK*[:TI[*:*J5W+):YR96G -MG^D0:\LVR$R@$IP!#^NCW<+EZ>OUGIR8W`-5"`%1A;*,W5A%3N -MMO0831*W1D\'#@!<`0``7`$```(```!%``%84KT``$`1``#`J`$!P*@!`@'T -M`?0!1`3]I<``N+X!VBI]O1(9,+[E9%'3S.?@UG8 -M`QS"_3IWE>*C<1E(,-OL'`,X&RBRLI8-BI==#0%+7Z\YD'B6DLQJXL"IZ=*[ -M5E"^@AX;)YXVDC5[P=3X>GJPW8IK!$'83!EX#B\OO2:O38C5R[O]DK)-M]Y? -M659++"&R7OW'ZBFK50%=9M=@G#"G(,ZH,A$EH$*,^*TKB1M`>)\](`FI`F:7 -M;.`'2LB&:S!I)83L9<*[$[^AX[%H)B7(B7-FL=-^L_VG!$`_KG%6(GYM`+FV -M1*Y(S\QWS&P0??!?U;/Y.W!MG@VD=Y3I`\#%9 -MR<&L;::=&DT2MT86+PX`?````'P````"````10``>%*^``!`$0``P*@!`<"H -M`0(!]`'T`&0&264*_2PBK]-*DU3A+.YB3B4N("4(`````````%PJ``!`#+`) -M-V)8DY&(?2&.OY&!A64?AP;QQB\O?&5^K%V>SJ*!,B)Y`;1^P"$QGBQX]XMR -MAUBLNCCN>A$%"ZZQ31*W1M$Z#@!L````;`````(```!%``!H4K\``$`1``#` -MJ`$!P*@!`@'T`?0`5`8Y90K]+"*OTTJ35.$L[F).)2X@)2``````````3``` -M`#":]>JZL-3Y-I;D=;KX*+:$DE'N'K5:E'.JQ>&EDGH^,!!EA0LID6^`'/1VG8%-$K=&XU8.`&P` -M``!L`````@```$4``&A2P0``0!$``,"H`0'`J`$"`?0!]`!4!CEE"OTL(J_3 -M2I-4X2SN8DXE+B`E(`````$```!,````,"WR4V)$;.D*D$9:9&\.G:'&4[V> -M$R"()`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``_?'>:;6P2)$S]9,?792$7`XMBOIV+H`8XV&5UT-HQ/J/ZTT$%8SJYJRI -M44?JN6J!_&R!FGT&AZ@67QPV^.&`]ELG-!*FNQ<>0ITYD?(07S(_CW&F57"+ -M\SV`XJ/P7(@#[8[=)W%J/\H]Z.5DUWT@#SDT7S3)M_D&I>[^)V:**WDI```D -M6]$LS#M^F"=5)'KVD6@_A>^AN*WE_1KF%[=HHN>W]Y(I```<``!`!(>/+=0J -M&T1]$LM[-4]=1^DZN]4X2 -MMT9H(0``7````%P````"````10``6%+#``!`$0``P*@!`<"H`0(!]`'T`$0& -M*=&12K2FN,\\7#.NRT&`QX)PW+CY4X2MT9A,0``N`$``+@!```"````10`!M%+$``!` -M$0``P*@!`<"H`0(!]`'T`:`'A=&12K2FN,\\7#.NRT&`QX)PW+CY2(``'@```!T`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``_?'>:;6P2)$S]9,?792$7`XM -MBOIV+H`8XV&5UT-HQ/J/ZTT$%8SJYJRI44?JN6J!_&R!FGT&AZ@67QPV^.&` -M]ELG-!*FNQ<>0ITYD?(07S(_CW&F57"+\SV`XJ/P7(@#[8[=)W%J/\H]Z.5D -MUWT@#SDT7S3)M_D&I>[^)V:**WDI```D6]$LS#M^F"=5)'KVD6@_A>^AN*WE -M_1KF%[=HHN>W]Y(I```<``!`!(>/+=0J&T1]$LM[-4]=1^DZN]4X2MT;T5@``4`$``%`!```"````10`! -M3%+%``!`$0``P*@!`<"H`0(!]`'T`3@''=&12K2FNG;:J4FP4=($,5::P=XS#T)58A>VF")@I)P'"5MW8C%3&>ICPR?>TY0>'B96C/X9=(&T)2S4+".WJ^%.$K=&7(0```P!```,`0```@```$4``0A2Q@``0!$` -M`,"H`0'`J`$"`?0!]`#T!]G1D4JTIKG-%!DL4;8,EE,"+B`C"`````$```#L -M(P``T`@:$VI)5+0*@G/MQNJJIYF^W?#7+\NURIKI)NP&S\HW<:O'P\4*J6G*2^[H1/1W:ORO[K -M$&%!\[`ZSX/#B\7`\S'R8R1JDK+_C/XDS!O8Y*K36X/P)[?4NK#)V5W+#3BB -MKD@FIS1"Z)D0MVH/)_E!V00HN.8_,;+POLN4LV+(^WT-`]<`%40=;DDN.IF? -M=7.C0=V-QQS5PE1=B1;-M.J9;SGN.1^4VO+-34X2MT:[G0``O````+P````" -M````10``N%+'``!`$0``P*@!`<"H`0(!]`'T`*0&B=&12K2FND8UJ] -MM=I^I]_R),:Z=&50QBQ@=S=12T2(I#;EY!L!RHW9#J60>/Z,>[MUF]@C'VF^ -MT4J/$]:'2>1$FJ9:=W^LV5&8C`8_)@A=F;,[=54OZ7VX^XA*6XJEY#SB2F8` -ML@.@7M^PX?>)-501M[#]TW=6_AXV:Q2?J0W:FJ/`2M,I9:SOI!/8!\>^(CK/ -M,5H0LUS%-WO76%^7#;P?[.?2IA?G`$U,-DG.R])L2P.$5K@>G$X2MT:3R0`` -M_````/P````"````10``^%+)``!`$0``P*@!`<"H`0(!]`'T`.0&R=&12K2F -MN`,FGKHXD%,42AX*6C6G(ZGRMM1#0PJ-%1VN9#+U2D -M9BI/XCHI7*^X"&0`M.6"YS8"`L7M,_P*GQI\S%P?:J&^@&2>CT@DJ(D?7/N` -M\T`,+AHP$_(H3THW'5QBY\BR*&?C)%'E(JRND%+K&'HBK><0EWJ1)(YS-1WH -MY+DG6&!QPVA^O9W-QD&H5CIV7LSTIIZJM"4Q&+L0Y1;(_HQ.$K=&]-,``&P` -M``!L`````@```$4``&A2R@``0!$``,"H`0'`J`$"`?0!]`!4!CG1D4JTIKG- -M%!DL4;8,EE,"+B`D(`````(```!,*0``,%PJ^K.HON@V+F=M*[]M+18!S)6> -ML,CQOE\9-G*](]5BQ*^CHEN4T4#IE?3Y3A*W1EGO``!L````;`````(```!% -M``!H4LL``$`1``#`J`$!P*@!`@'T`?0`5`8YT9%*M*:YS109+%&V#)93`BX@ -M)"`````#````3"D``#`1_UT1%#^1&SC8V(!SN+;?=2`\I#I=S/=,90/9;;&T -MJ;Y;BHJSCT7Y7&,"VDX2MT:6"@$`/`$``#P!```"````10`!.%+,``!`$0`` -MP*@!`<"H`0(!]`'T`20'"=&12K2FN5X$=A:CL@"Y7]6\"CV$*Y;=QK=$ -MB;\G*XNG6R]+MX'4=P>!0SHD(=QN_>/E.Q/]Q#_-]3-%BA<-)8L#JIDBG?^9 -MA0L0[;@^/70Z#-M.L"S>,H>P*]KHKLEN@&X]^;\#5"=-'/`I)&B*-7+K-P%N -MU`"28HN:L,+QI9J$Y1RF7J3""S:(@2,)6LA]5TBMP0WY`!E1&U,49KH1XU3F -MEI_/VW?/Z(]105U`KT@XE&1&F82*P[*OG8%31&M$3A*W1GP6`0`<`0``'`$` -M``(```!%``$84LT``$`1``#`J`$!P*@!`@'T`?0!!`?IT9%*M*:YS109+%&V -M#)93`BX@)`@````%````_"$``.#B+%KU.4?MO%H+HI?ALMK8;3QER^Y&XN5! -MJG3`[GR)L[6;8;EN2&+(/.SJVW0/:>M+*!B`QW3$ROQP%/[,\&OU::O0"*@E -MG)8M$1Z8=&?'=CNZNE>88A8*YW8JG\=BC<%8Y+\O8*D'0$/MD9-=U$'%,3+E\O-7'.H(=/WN'#>I_H\AV"3D(_'1"WUA:,LP_KJS4]?EE[:?3A*W1LDF`0#L````[`````(```!%``#H4LX``$`1 -M``#`J`$!P*@!`@'T`?0`U`:YT9%*M*:YS109+%&V#)93`BX@)"`````$```` -MS"$``+!:`?8_>/]KYJTHP(VO>!F0W$/=(L@!,MBR>/-%\^.K$ -M6QMOF;[\H?\O$.W?W_VFTLW[8I]W=$GI.L"P9.MKEB*PD@J$F83+T,Q(]?R>0%YY091)/D!P8GG;Y=+5(1N@)6<^UB[LXI(S$P\<H& -M/1!6?WG.'!L!T<4;15P4U[D.J[@T1H4M[`J$L?+X@Q'!_0KCWYR^KD@8 -M;K*HPY=`(A%Z5I,-OQ@H5LP=+X##JQ-SV7$09:@(>4BN1)GL5W7\*NL]9(!, -MZO#>48VU6\,RLGSYM!Y?HJ`RZBLWQ'$J.#_8T(\:3!E6&M_5J`3US>3U[:.+ -MF?A_=/U-R='K0SW.%JD7X_Z&X>KN57!#UH4]?UG#1AMDFS7!.$K=& -M"70!`!P!```<`0```@```$4``1A2T0``0!$``,"H`0'`J`$"`?0!]`$$!^G1 -MD4JTIKG-%!DL4;8,EE,"+B`D"`````<```#\(0``X'GE#GY7UZU("%%AW&1+ -M2Z+QO/+Z_'F87L)*0!!!T,+8X2J#GWL/@]<0.(ZON]`^$H=7!,#A(I57BYG. -M-[M2.C93^!3'6@PVK(/*49V@=H&$FH0:\?D0!#]XVYM?A-)[WN:(WR[E3C8L -MZM'5`!26M78L+])VIV[%S]EF08V-QWAFQ7DO!!9<.$VO`#;Z]7:&LX13=X(_ -MU]7R6Y6IM(Q%T12S;B7GF$B9Y^7%AXIL@NP?Q,B4]^7R4"30O+%)-2>W[RR`B\&:)"+Y4GT`0:[I!PV!1((U0S;Y@0.E?(/'T>'(>^(6%%% -M,]-QBX]L*B!^14NX$ZO#?!MI=65TC2S\]>6J2DBV;M71D58#0GE6W/[\!"FO -M6AN`_%Z";5:3%;=$^T].O@#F7(?EZ_DA\*$\>CN:XC,-M'JCVYNE6XK -MP0(L5./A=+!$_]H<6=I<5?DFJ,Z`&O<])-!'<=Z'XBI9I0K``0[["R11J0<$ -M_M1+T['38G0@Z7GOA>&8&O(1$Z`+';YT\\CF7-17_$T_27%:#RO_CFYF#G.( -MN7C6\V!3H92F/-?TPH7T<\3H721)P -M#/H"%@^3T]).Y79:*XF)P%$"J"CA.'L[4_G,1@929%=V[)D]+T]DL+TT>^&^ -M/L.:==C*#/]P_6$%D[XOF?.A\X5/8(*@@S#R>5QP4"DOI;(T6A;^HM,;GGPY -M&:DPSDAC'INECW*_;\'"YQS,CCGR`&52!NKT.WDP#*+R%YN]&-D%-LA4J7`? -MKA]**;*+,.&$"8;L+XM+L:L^FOH":I76GJM(I@+#E7[#S`#Y,0H1C6Z#DJU' -M(;)MF&`Z`+@7C&MY],R(V'C)CJ!.['3K(UD);MQ!"O\5I`[\%,$^2:%`.'+$ -M'*!BE5KHWP1;^<)\*?[>&?19/K1Z=_TGSKH;]RESA'<>8M:%#I#_$P;H8E:[DL3BH"3A*W -M1@4!`@!<`0``7`$```(```!%``%84M4``$`1``#`J`$!P*@!`@'T`?0!1`@DI7T:Y%N1M2"!W'O.^O$NI!#-VNQ6:2C;BC:H'C]"]:S;VJ -M!TX2MT98*0(`?````'P````"````10``>%+6``!`$0``P*@!`<"H`0(!]`'T -M`&0&20(+W\]\E\181:\9QS.;"KDN("4(`````````%PJ``!`W`1MB4.*.CVA -M`TP0N$;C=DH6,:15M*@^:]NXYZV-]G,0,E)KOY#(HLGB#<[)D\TX2MT:Q -M0P(`;````&P````"````10``:%+8``!`$0``P*@!`<"H`0(!]`'T`%0&.0(+ -MW\]\E\181:\9QS.;"KDN("4(`````0```$PJ```P*QD00_*QH8(#V0_'L%.# -MMLLO/`]&5CCXKSF_=W9(PFAMG90/:6;?B3K/Z)-.$K=&!%$"`&P```!L```` -M`@```$4``&A2V0``0!$``,"H`0'`J`$"`?0!]`!4!CD""]_/?)?$6$6O&<Z'F!0``````````"$@(@@````` -M```!>"+_`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``08)# -M@W,<(:9Z@1+S.;^&!H?'8;^,,0,Z["/VO)4BWVJJ+'L<%9$BIL:C/OV@C9M\ -M2_U:IS80!UJX("_59^JF'=A/AZAN,+?!K0K;X@28"A/^VJ":2?105THVS5<> -MF/&SC`F00I6]Z:8:G.>2'#[&_+)H^N_8"!*:J:L5`V:<0F,I```D4(-WDDUC -M1,R504V:)7#5%+K283O-.D9S]?I<..7OFW@I```<``!`!"6+LC:L[B:#!X<& -MF=RL3P4+^Y,:````'```0`65`/2DH1)4,W[J(1$7I25#EIT)\TX2MT:K60,` -M7````%P````"````10``6%+;``!`$0``P*@!`<"H`0(!]`'T`$0&*2]TRWWN -MAY@4```````````I("(@`````````#P````@``!`!@````'9-#MEL-"-+#_! -M,Q?C7-&H@+6A24X2MT:W:0,`N`$``+@!```"````10`!M%+<``!`$0``P*@! -M`<"H`0(!]`'T`:`'A2]TRWWNAY@4```````````I("((`````````9@A```@ -M``!`!@````'9-#MEL-"-+#_!,Q?C7-&H@+6A22(``'@```!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``08)#@W,<(:9Z@1+S.;^&!H?'8;^,,0,Z -M["/VO)4BWVJJ+'L<%9$BIL:C/OV@C9M\2_U:IS80!UJX("_59^JF'=A/AZAN -M,+?!K0K;X@28"A/^VJ":2?105THVS5<>F/&SC`F00I6]Z:8:G.>2'#[&_+)H -M^N_8"!*:J:L5`V:<0F,I```D4(-WDDUC1,R504V:)7#5%+K283O-.D9S]?I< -M..7OFW@I```<``!`!"6+LC:L[B:#!X<&F=RL3P4+^Y,:````'```0`65`/2D -MH1)4,W[J(1$7I25#EIT)\TX2MT9XC0,`4`$``%`!```"````10`!3%+=``!` -M$0``P*@!`<"H`0(!]`'T`3@''2]TRWWNAY@4-U;5GL8>7$8A("(@```````` -M`3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"```` -M"`0```(H``"(``(``'-06H673!]M5S?/VH*UN=.=TM[;FE8ZN$O'`VM1<4'H -M]KZ3OFTO&$\19"9+EU@2.N1!F_+VVJ17M,:I.YJ)G[=;(PW7'[K7GL?5D%%U -M>!"'2U&;C'6';U!PA4$J -M8UV7Q4Q=('C+2G%DY4IYQ*0`` -M'```0`0%D+-0%8M=1GR:0V5I(0U/;WC*80```!P``$`%X9X^Z3>:!;!M/0KA`_V;Y.$K=&H[P#``P!```,`0```@```$4``0A2W@``0!$``,"H`0'` -MJ`$"`?0!]`#T!]DO=,M][H>8%#=6U9[&'EQ&+B`C"`````$```#L(P``T'@Q -MOB_ZC+-8+.^V;Z?-47X3FT@[Q(C%4R(V;":OZBG`9[$POU]`O`_F#9.K"87-F./9)O!0F) -M1.+MQO;.UVO,_Y(AH4EJ:!+&#%,8=D$@HE]Z]-EXR(H3?GP89^S`U1A43`GU -M_=E3\_!TP.ET^/"MM;,GUQ.DZ`\KLDX2MT9WU0,`O````+P````"````10`` -MN%+?``!`$0``P*@!`<"H`0(!]`'T`*0&B2]TRWWNAY@4-U;5GL8>7$8N(",@ -M`````0```)PD``"`6&Y!ME*>GC&CGH)XOUG@:_(@`G15BC%ONL"%AV;-:O=% -M9D?8YHACNHI0;:;_!G1(G\"]).VG>8=6N'V(6<1]V`!3DG?O$K+@9UYZ6)`% -MTG?/6D^MZ!2T9/S"_I9OV^C)-H<(JIX1A?GA=T*<1`\.8CM?4&"0+&:J%H?X -M)DX2MT9J]`,`'`$``!P!```"````10`!&%+@``!`$0``P*@!`<"H`0(!]`'T -M`00'Z2]TRWWNAY@4-U;5GL8>7$8N("0(`````@```/PA``#@C-3#<7OOK@.L -MVPA#[G.CCI=Y'*I=KK#<_QPT+T4R;T[OS:$:J(=I=;IEWM*35K\.$&@E'-&) -MXO)OL;[R"2GK,:=PPP*I@KE?M%K_%,P8Z/K7_18[C+(-.+2UJ[-'-&A/Y`X[ -MY9-(IFSP)%=;1V?A36].B94NZ5X/5D)!PH4RPVYHIKF^C:HKI`AO2G)71,V3 -MM;QA?(A-@8\_%%U/VW@,LAX51#^>F6?<-^+T)[\#44FQ>/+D6F4A\[+*Q-FM -M^#VLWL'.PEB1\L*5%MSBKL=ZGZ7$8N("0(`````P```-PA``#`5W^4])D40YFD)E:L'9*.R@IHQFOWF -M(D3XQ@[3[$HGY"2/`X>.NL+L^38=/CFKT7+BC:U*=Z9[2%FM,ML@;"1U=4S\ -M@WLW<"8AH,O[TZE=[`R^4SE?O08S>*/X4"A1]TUNZF'XP%'\.0QIGT'H!K9E -MGBC5ZJVF,?ZU)9_L*_A%3<)/"Y.^"A9;6O]9T`CS0]:(5P_GK$2'7V"Z')88 -M"F!L7XG2"Z%4,21[7.I)]#N'5L;I?ZEO56B$8;-.$K=&60H$`&P```!L```` -M`@```$4``&A2X@``0!$``,"H`0'`J`$"`?0!]`!4!CDO=,M][H>8%#=6U9[& -M'EQ&+B`D(`````(```!,*0``,!!2W!A&XI\Z'F!0W5M6>QAY<1BX@)"`````# -M````3"D``#!#J&[7$8N("0(````!````1PA``$`KR>2 -M_M)="[VNZG_N!7O:QZU;@Y*!6QA[6L)3"HJ^"(LWNJ+AX+5(BC3+YBK8&4!\ -MY[7*V$%OW8`R!52M=%($2SBA+C_D(H.DD3RWFT(RMP2B.^,1@F!K53@+NUKJ>+7<34Q3>D+S`/53C2QRG)UY]-!+8'.]4^PUH'7=OW",MGG\'POF>WTSN,:!WL$YIT3B)V\J1L_M -M<@]:,?,=$=.L*S6M0I`!V(P&`>)!(G0D3A*W1BI-!``<`0``'`$```(```!% -M``$84N4``$`1``#`J`$!P*@!`@'T`?0!!`?I+W3+?>Z'F!0W5M6>QAY<1BX@ -M)`@````%````_"$``.#R5I7;I,A7G>;/L#+UE"*+./A*CGCU*D4FH%O+NL/T -M@)L)N(S-/;#G1?V%"TQX>>+T!OP.LFYQ#)[RC;,<&(F<^ -MR_H3[.M;4OR!97R)E+\>,V\-N;8X%&$S7'C6K!.8FE$=;)I,STFTT"&6=F*, -MD(WW6U_W_J@M3A*W1EUZ'F!0W5M6>QAY<1BX@)"`````$````S"$``+"M -MB#&:RKH3=\Y[VCVGM*??X*%@FN1[`G:@@!75`IX@W&WL+==X4%=92`69<[J2 -MV\V+/`YW+8"O1IHSN.J&#'9E97ZK6*;++H^/`P?R)PKI]Q:_.+)TS26;4-@W -M?8#RKE2*NWT>;:ANCX/7O"I4`0&F#A.(@_F;`AHG_[74MM%:\>EG54\H9IG0 -MR;XN@7Y^N/1B][F*!PK)#940^DZKZSJ6XH2`$-;2'SDAWGG&3A*W1BU_!`#L -M````[`````(```!%``#H4N<``$`1``#`J`$!P*@!`@'T`?0`U`:Y+W3+?>Z' -MF!0W5M6>QAY<1BX@)"`````%````S"$``+!CES,#OD+7P[1E6`IU>DM/Z7

'I(&7VY_[&SS_V]>53F$1&)TZWBSO_B&[?J4TW)(A%QR1+ -MI60FEO9$">9E2$D`-!D"8FM$3A*W1K2Z'F!0W5M6>QAY<1BX@)`@````& -M```!'"$``0#QZB[>WJ,J`2G-5MN_[X\3,?720208(!.&CIR"VP<`U69F_V!4 -M"_)<&9Y>5J1"#U/\RG>:T71R/,2&,Z4\Z?D+IR[I(=WO[7TIT3FE/CNB$?'L -M-'&*K!$FN&$MF*4^`K%T!NN>U:F-TV^(TI><9H1>E+G]@6AH2RACEA:'2GYU -M:Y++[6RE44=!$YU:[DISODO<-?%'+Q.]&K\O@U1B_;- -M60%(!$/*J==FJ!-B/.P,T)B0P)%H!S73-`EZ3H]L:NMY=:=6^6^&@%2#O):+ -M#AJZ`7M.(R#-T*!RUD,63\O##S"!3CGQK&!6J1ZY-3(OQQQ.$K=&X:@$`!P! -M```<`0```@```$4``1A2Z0``0!$``,"H`0'`J`$"`?0!]`$$!^DO=,M][H>8 -M%#=6U9[&'EQ&+B`D"`````<```#\(0``X(/CQ[IQFPOA*JWZL0F<>%=:@`%< -M8(F1:5IJR6R"6$F=!=K@YO+/]]*R98DYI"II]LB]4FU^)@_\`UK'^SH&70CDKGFIL8+64! -M9%6P%J46;2P`\'S*]/Q[A@7QO8=2H0#1#TX-+'7;=SC)XY>%9?]["'%*ZQS0 -M^5`-)`.T58.H;!M63N)A@H7ZK1V<^I%(FRF,5CEH7@KRD&Q8%#=6U9[&'EQ&+B`D(``` -M``8```#,(0``L-;$NTVUC;;>P2!0!@)+VC#?;S*3OSM9Z5BJ2X[)&>ZB5)?7 -MKE3$35OJ!ZX+R'ZDDC]L6AD!P>SAY?Y8F8>(U6J:P^*=E'[-4!F_HP#W(YAQ -M]85'+P`&(7!`+-!$/0V#,@MH[DRB@VC*(6JY;@)&GMGYMB"4`'NW/,+-VMU_ -M'<,^M`\VLC$48OS=LF?M'02KD`GRQ94*S*+FH)>(ED;@I(/F?^3&I+I;1;ML -M!X).$K=&I-H$`.P```#L`````@```$4``.A2ZP``0!$``,"H`0'`J`$"`?0! -M]`#4!KDO=,M][H>8%#=6U9[&'EQ&+B`D(`````<```#,(0``L#TEHY529W!1 -M][]\HS.$:@$&7`OJ]0#IL4YNG<;WUI+/\9%[)S(@\*Q-%XM]6)A\\W1F:W`. -M%S\L#.OYY;O7>MIR71C#05.$K=&K0$%`(P!``",`0`` -M`@```$4``8A2[```0!$``,"H`0'`J`$"`?0!]`%T!UDO=,M][H>8%#=6U9[& -M'EQ&+B`D"`````@```%L(0`!4%X-\?O1!Z/X=+^V.3DLU!);>W[:;B=V[FIM -M07R6()K;'VW-:[2`+A(?@3Y\3B94N#F\&.\LB1G$))OJQ*1T):0:MGE1_=RZ -M:VR]-V2C!E2`!X-SK]R?[9<2BRE4LY>$).!K:U>`Q/N_UA'?:!I.ZO5+N2=H -MG&;2_JPFF.E8%*5'RDB:_/1@';:578(""FTUOHF%I-C1L;`WSFY^/_UUOQ -MWQ@Y9K)V-(AF9DIZ!T&I_6.VDJ\P#G"I"Z=K?XN2WH_^L7T/3A*W1I@V!0!< -M`0``7`$```(```!%``%84NT``$`1``#`J`$!P*@!`@'T`?0!1`Z' -MF!0W5M6>QAY<1BX@)"`````(```!/"$``2"]8#P](!B9L='E>)TK:W+L!6.5 -MP#0$D&KY*1S.]C(Y"XCN2BT9L-:XW`WCJ@BWE!9V-5OHB$W/?6FSF?)C3C.` -M'NDBM)\Q!R.M#V]4)'; -M2_:.N-T0^PJK[()<+VH_=:>^@;=Z.`4/<,$J=,*URC-"FQ%S^O@DJ)=PS%;1 -M4^T&6RB_&]/!.R(=..C92[9S(A,4U^UM@:NK0Q&H'XU7W#YA'Y@/=L6YHJ.% -MW:&,5U_^QOR%+N``!`$0``P*@!`<"H`0(!]`'T`&0&2=(1 -M-^!C<@R0F[IM1/=5.=,N("4(`````````%PJ``!`WF1L/FT"P9RSO)&N)(Q: -M33*>3GG2+R1>CTWV:F[E_R:1,=5*J#JT=,:]0+-?Z@A--9/G5)>HHF!CV-RE -M3A*W1OYH!0!L````;`````(```!%``!H4N\``$`1``#`J`$!P*@!`@'T`?0` -M5`8YTA$WX&-R#)";NFU$]U4YTRX@)2``````````3````#"8+)J[HD?MXP;O -MQ(M]JQW+ICCD\AM+^9YNYIW6_H<>W1PQE&4QL-9=+--_HDX2MT;O=P4`;``` -M`&P````"````10``:%+P``!`$0``P*@!`<"H`0(!]`'T`%0&.=(1-^!C<@R0 -MF[IM1/=5.=,N("4(`````0```$PJ```P5CM,$.V8N_@D;^$<4=(Z12MA\`-4 -M1/TKHU?_6!95EZ!ZFIP-#-V`0DQ,EZ].$K=&3(4%`&P```!L`````@```$4` -M`&A2\0``0!$``,"H`0'`J`$"`?0!]`!4!CG2$3?@8W(,D)NZ;43W53G3+B`E -M(`````$```!,````,$#L$Z#)Y3OCB+GE+A)2"$01Y#^2G<81ZV".L>T.DTS2 -M3A-*'0W1NSC>)1"*` -M`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``4<-@VXT+;$,% -M3Q,3//MD+:.:B&>2W*GOFTE6AI9GQ4^$5PY?P6,3\Y9,`($61"A,\QU*0!LV -M&KV_KRZ1RW*QWP[SO0="P(B!G`>:8VR,`6#&L?N-!]Y`\$?AP(%32;\T@SO* -MI]2W7JT&F5<NN%L=F2I12T:E2[ -MAH9MP$X2MT8GG@8`N`$``+@!```"````10`!M%+T``!`$0``P*@!`<"H`0(! -M]`'T`:`'A:+X/*=8;AX4```````````I("((`````````9@A```@``!`!@`` -M``&W^F,C>NN%L=F2I12T:E2[AH9MP"(``'@```!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``4<-@VXT+;$,%3Q,3//MD+:.:B&>2W*GOFTE6AI9G -MQ4^$5PY?P6,3\Y9,`($61"A,\QU*0!LV&KV_KRZ1RW*QWP[SO0="P(B!G`>: -M8VR,`6#&L?N-!]Y`\$?AP(%32;\T@SO*I]2W7JT&F5<4K'#[G@NA -MY3Z"_+TH>'(AFX#EW`2L%C$[T:;7]1*=BSU]2S^2/"1D20@\4LJ7*0``'```0`3L -M9'[-ZP8YQ7K[0```!P``$`%V3JU(8,&6@I<8D=-PI&_^BN7 -MRE].$K=&M>T&``P!```,`0```@```$4``0A2]@``0!$``,"H`0'`J`$"`?0! -M]`#T!]FB^#RG6&X>%#ZYL6JZWR(J+B`C"`````$```#L(P``T.::EJP9H"CE -M<%R+ON,O>@Y1#[E:4#>V!!_9ZIMN"5N=2D=E=**;J[SVUI<)N/!1]0KWTCL/ -M6:H/B&U2^-[;XF):;L0TGKN!D-OTT<_K:J.&+DC2.21`P4F6%XZ&C[9(&.PS -M)ZWP\*T4<^!D8<"JHGRIZ@@NF#G'L(N9E``/ZE,@'&VLK(7>`S/?VNORUX(G -M[XTITDL`"I_M_QDC6[,XO<;&C+N&?6_/L](;%[`V4],A)?,M/,3;E9?)HH-V -M-`6J5*7`N?APP*V;)4NU*TX2MT8#!P<`O````+P````"````10``N%+W``!` -M$0``P*@!`<"H`0(!]`'T`*0&B:+X/*=8;AX4/KFQ:KK?(BHN(",@`````0`` -M`)PD``"`,-5YXEYM\:!:S+*\X]UIA,T%6_M=+'1 -MU<9*VS-P)LHRV,<@.R6/VS(F\"U(7,=VGSB1`W<&#N&6'BVVZ"]TRDX2MT;L -M)P<`'`$``!P!```"````10`!&%+X``!`$0``P*@!`<"H`0(!]`'T`00'Z:+X -M/*=8;AX4/KFQ:KK?(BHN("0(`````@```/PA``#@/T576HWE\GZN).9I$"_# -M_(U],,)A6VF3[\T8\:4@ZV`Q*R'VHQ;M`+)GR0^+;7+3*VG=[9H@3P/W#0E. -M^%'-C[K4%$9DF5UBG+E:"-%;I/?_EB=P,^/OFAH0WT&VIP<6\M2YUH^9;F#2 -M(I^.;-[6%BV8@%=XF2&PTF[S)5;9['?GR*/+5=*_@%RO/J4U(6GM>(M.F8]< -MG,LA]HPA0V2,WD&5^&NZ0)J2;/=1]Q>#>:#"B0%):Y:KL4L*YA"E9$X2MT:),P<`_````/P````"```` -M10``^%+Y``!`$0``P*@!`<"H`0(!]`'T`.0&R:+X/*=8;AX4/KFQ:KK?(BHN -M("0(`````P```-PA``#`[D].Q#JM1%S'\<>HR/UV`[_J-?0Y`O%QJ=G:;:Q12-H/$>"0WGDX(7=)I-FE+EN&S$EB><$Q$FO2U)"&EYM3.,-_F[5EBT!V<1/7Q?VA[?O-1Q -M-8K`XLDIU-Q7-P-3NZ$5:>:_97"X"GN;@:XGZ1.2D`J-JY6@%.[\RA:,'BR5 -MN]S)^4[T_Z:EM+N!MGC[H1RO!1CR?`9.$K=&(SX'`&P```!L`````@```$4` -M`&A2^@``0!$``,"H`0'`J`$"`?0!]`!4!CFB^#RG6&X>%#ZYL6JZWR(J+B`D -M(`````(```!,*0``,(K>(GP=^\;9^P=R%Z"L3.,DN)O>*:^8*NZOG2Q0:?NU -MY4M3A*W1LY:!P!L````;`````(```!%``!H4OL``$`1``#` -MJ`$!P*@!`@'T`?0`5`8YHO@\IUAN'A0^N;%JNM\B*BX@)"`````#````3"D` -M`##]!AN5RFM:?MK@F%/D!V*DPQF#-MUP3UJ:Q[KTB2\<\*:$LZN.=QET(M]A -M_$X2MT8G=@<`/`$``#P!```"````10`!.%+\``!`$0``P*@!`<"H`0(!]`'T -M`20'":+X/*=8;AX4/KFQ:KK?(BHN("0(````!````1PA``$`)F6LDAWLNN>U -M^5YETYB2<>5D%BD/P(@L@&1X[`\3Q!9E>`5'B1-)!&2B/9]*ZWTG\EI$,LJ, -M,AUY82"ARVV2:;QP#:QUV&[OLYS^I/]12D=[++FV:1L].ZHN`*> -M1`1&FJ-B'A9]2`R?`(,Y[RTK([!@N:"?9(XR-6IP]:T8@V'6-8U^S_!@HO"1 -M"S55FYN`<,%+"@CZGJDZ+$ZR(@HA'O0YW?1%[^`.*;"."6&RN1FH=2L&?=YY -M;;O-FEK'ZZEURRM)6IZ8'///3A*W1K2!!P`<`0``'`$```(```!%``$84OT` -M`$`1``#`J`$!P*@!`@'T`?0!!`?IHO@\IUAN'A0^N;%JNM\B*BX@)`@````% -M````_"$``.#ZIDU\/?XB?#)B2FAW4(CKATAI='&+=KK);\H:!/[M(UDKQH*( -M+*+:<6/@7H+5'&D:#EF%5)R4"4Y03;3?/WBV=V@09]+FR[5#VJM%,DJZT`9U -MH!$0TGQU:I5L+K-&;L=SD>Z! -M-R7C9!?OZ9.J&4(=@AO9)%K,L&QXZR*D]/U\B$W&'V2)ZW/JLGZYFJ*1;!5V -M(TA\3A*W1B21!P#L````[`````(```!%``#H4OX``$`1``#`J`$!P*@!`@'T -M`?0`U`:YHO@\IUAN'A0^N;%JNM\B*BX@)"`````$````S"$``+"&&;F)\@D1 -M4+0G0A02'3#?W3\%^"LV4'XB[@3J.3_0@P?#/9N48F'LPR*']D)4K]I?3T0& -MS2K#A2"><6^=T2,^MC:PN^ZX_94;F!?:A,1;U4!)3PVAQ^>ZJ-:4%X[KU`N; -MV8%UL0Z8`JTE`E8I2NP%8N^PL,U;J5@?P0"SHH>=4OV+/-;]J]<.NJNEJMXG -M%)'.(#]M-,>D/;5?JR?A8E=D22CV194,9 -M6<(3/]1+#ER-A_U4.'6M8X%W$534`(NFZ -M@=+&GVL#8X-@FD=]J*W1AK^'$P@T!/Y.DA)MEZ%T]5[.D;E5UYM9",IOBCO7 -M!J<38>YJU_>P+@2CG!A#.%H-T`.PP\%3AB&,K-QE:LN[<&A3E$OH-F$R5$FW2'\3Y:ZPQYG(K,`&!.$K=&?-T'`!P!```<`0`` -M`@```$4``1A3`0``0!$``,"H`0'`J`$"`?0!]`$$!^FB^#RG6&X>%#ZYL6JZ -MWR(J+B`D"`````<```#\(0``X+ZK\R<@D93.UK6$27"1!)U-#Q!$QQIU4U"A -M1]BFAP8(.S7P3/'S%[_9]HW#CDD8`-?6PH8F*4J)+P[R\[Y+_>:U@_GH]O>$ -MDL$R1^V)GR'\W@%\%!NP7SL51NL2]LR9$8*XNI6'!&?QBT1SK3KPX>Z@N3##G0Z(:!]91,[$>;&Y-$YM1#\V#F<0!AC+QY9$W3`=&- -M=(?SOH.!QF$!JN2\K"#)_$X2PE9EGP5/3&26J-E9W7[K("FCFRS+F3@F!@ZF -MJ2X2%?]2!L6+;:-/^D-.$K=&YNP'`.P```#L`````@```$4``.A3`@``0!$` -M`,"H`0'`J`$"`?0!]`#4!KFB^#RG6&X>%#ZYL6JZWR(J+B`D(`````8```#, -M(0``L,*OM_J\I"S],["&U@SDVB=@]784=AH,7B.V@_?Z/;,AOQVML:K.FFQK -M%CAS;Q-_(A'SR-XJQ0XICO_F83];OM*=]ZS%DX\\CAI2AB85%Q:$"1Y>M]WB -M,;3K$N&!0)NLR/=4L"MX1^!W\^'.P3JOY#^_S4^OZ%"ZU.[8V>R'R$KDR6#% -MCRV5"2/AV'H,8GQ)L/>Y\UG.QVNZ>"'A.^@P!/`?:]B-!0\-*`H>,8).$K=& -MY@X(`.P```#L`````@```$4``.A3`P``0!$``,"H`0'`J`$"`?0!]`#4!KFB -M^#RG6&X>%#ZYL6JZWR(J+B`D(`````<```#,(0``L%K4:@]!_18+%AIK/V9Q -MZRDKW>]!1I\7$:,,L:*,4-\FC7>PT47O7)#PNK'#_*IA6LM<@W2AFZJ9F`'EM:2C62SOE3C3L@IT)>0]*-[4%I>"DHWG@:H -MIY!UUB<>M@"Q%!:6B:6==QA)6#09.6EF*/6QCA&V$C0G:2 -M']-A^,G=CAZC,2?V7:YC>\C'M=_\%#ZYL6JZWR(J+B`D -M"`````@```%L(0`!4`S?'%?9S8>=\GZ33*/11SE;C"6HX1T\Y]NU>&NE6AN:PA!6R(&"J)%"9WLYVU? -M*.C^V$$G,FFZ%\0TM@;=,(*M!:]ZM/ZW6R./EIJ,<(-`I#6E5Q&P;E27>I1@ -MD77@J_"&(HD1.(1P-P"+*8&FOM*P&].PY2`2C<.O.4#+*:!2( -M2,]3^=!;1+UYEJ"26>T(96%\0$,>D`ZD_/U%2.$+UM$].V5=_D]?S_P -M_=,54K8-2/?3VQ-U^E\XQU;U3'Z'20K#Y6MLW(T%V,7-QFNS:3?7NV;^DOR; -M>O`H><(:8(FCNP_9-B#Q;LT[0M5R=6W+,D>^V@1UVY+X*8`?W?T*9#_S)5H? -M,WM,N@0[Z23/TED8&T_!W'8J30?&/H)5`5OD[X\R3A*W1N1H"`!<`0``7`$` -M``(```!%``%84P4``$`1``#`J`$!P*@!`@'T`?0!1`C@;G4,+DB9P1N%VQ2,O5E"PC[;F_\M\HTN$ -M34@FADW+>.\\2ADAZET91!?ZT+T![6P>4X[%1ZQ*VZ&H=0AR@ -MFP+5,VQ<5+>@]`0KK?'`U1D#:L38PII$'*3XTR.?TBV9H6ZWO**M!E=QI)[T -M0N4NFUE\3']UO7*D\<_FWD-,&Y0N^6F7CM@UEG"K6M\N=4X2MT;8D`@`?``` -M`'P````"````10``>%,&``!`$0``P*@!`<"H`0(!]`'T`&0&29KM=,[=6>9M -MK(\$M][`-9,N("4(`````````%PJ``!`[.@Z*8U59&E2NI(.\BYWRZ/WU/.3 -M>HB)9H28V.SU3Y_("D*5EUTX=0N`:=)YPN7:RC>DUBLYV8Y`:]K-3A*W1AR< -M"`!L````;`````(```!%``!H4P<``$`1``#`J`$!P*@!`@'T`?0`5`8YFNUT -MSMU9YFVLCP2WWL`UDRX@)2``````````3````##J#Y9MK(\$M][` -M-9,N("4(`````0```$PJ```PYZE-E^PFUF-F;`#OZ,*8:\=/E,-_=]XRP4"? -MXB(?GQ\'+$,`6JBF'4IM)^-.$K=&_[@(`&P```!L`````@```$4``&A3"0`` -M0!$``,"H`0'`J`$"`?0!]`!4!CF:[73.W5GF;:R/!+?>P#63+B`E(`````$` -M``!,````,%,+_HB2<<&1#>)CO+X[99I\["TMT2FU997!60TB]A^>+!XHRW!( -MDO%_7)Y>3A*W1NJU"0"8`0``F`$```(```!%``&44PH``$`1``#`J`$!P*@! -M`@'T`?0!@`=EZM%.%+/C+V(``````````"$@(@@````````!>"(``'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``Y!;=ZX-ZWO'2ZE48F+R[ -M2V\6$X%0;TB>`GB72N_R58E7N45-,4Z!QF@6LKNQ)"8F6-5%+^UZ7@R-H`*( -M/>BV$'2A40G,W$5XKW$U>Z\V&X=^CG)MBP>R?V6V0FWX088)(!@>\@+)T>K0 -MH#-*5\2,2HT@CZG\*$,A>TC3?`_UDU\I```D0L$6?#1TV_BNHM`D2QI$#:'] -MN[`F>@,YIB_QY.JE=_,I```<``!`!'=\1L/NI30!H6*_3_:X'I-V+:5O```` -M'```0`7ES%,0N'B.^>V\#1$ED_WH+T76$TX2MT:ZQ`D`7````%P````"```` -M10``6%,+``!`$0``P*@!`<"H`0(!]`'T`$0&*>K13A2SXR]B```````````I -M("(@`````````#P````@``!`!@````%'W?:X.PKT&[53[_(.OKUK8RX.ODX2 -MMT8&U`D`N`$``+@!```"````10`!M%,,``!`$0``P*@!`<"H`0(!]`'T`:`' -MA>K13A2SXR]B```````````I("((`````````9@A```@``!`!@````%'W?:X -M.PKT&[53[_(.OKUK8RX.OB(``'@```!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``Y!;=ZX-ZWO'2ZE48F+R[2V\6$X%0;TB>`GB72N_R58E7N45- -M,4Z!QF@6LKNQ)"8F6-5%+^UZ7@R-H`*(/>BV$'2A40G,W$5XKW$U>Z\V&X=^ -MCG)MBP>R?V6V0FWX088)(!@>\@+)T>K0H#-*5\2,2HT@CZG\*$,A>TC3?`_U -MDU\I```D0L$6?#1TV_BNHM`D2QI$#:']N[`F>@,YIB_QY.JE=_,I```<``!` -M!'=\1L/NI30!H6*_3_:X'I-V+:5O````'```0`7ES%,0N'B.^>V\#1$ED_WH -M+T76$TX2MT87^`D`4`$``%`!```"````10`!3%,-``!`$0``P*@!`<"H`0(! -M]`'T`3@''>K13A2SXR]B)H?`#],Y20(A("(@`````````3`B```P````+`$! -M``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(` -M`)N@G=]FONC&>\B52Q"XAZ9?!I)]*QN&W+D7<<_J/\41S:+Y,;6.7:!&]7?*Q7LZ%AW?V''/VQ;J5:BX[%Z,18C83EWZ.LA?PEJY.$K=& -M-B8*``P!```,`0```@```$4``0A3#@``0!$``,"H`0'`J`$"`?0!]`#T!]GJ -MT4X4L^,O8B:'P`_3.4D"+B`C"`````$```#L(P``T&%N&NN*H,VO'W6I?,>N -M_S!]7$X>(/YQEC,LH]3*>HN\W(9HXT#'SGYL`52]5-#8\+U0$GBN8C -M\#:=!G3G@<=88T1^$`LRL0KTZ7(88TSB%SAP7?'5:@>*I7K=MM8V+>/>W=4V -M%PRJ1U!P:WR&G=,.-^.'H6DMI$%\XX#/1,$+1*J)U#6$P)QI!J.9+V1Y+\P) -MR(0LT8]OQMX\'TX2MT89/PH`O````+P````"````10``N%,/``!`$0``P*@! -M`<"H`0(!]`'T`*0&B>K13A2SXR]B)H?`#],Y20(N(",@`````0```)PD``"` -MZP"G[K1+F,3Z'7V;A@`N:871ZDK13A2SXR]B -M)H?`#],Y20(N("0(`````@```/PA``#@R2_!NA?>F6+J3]Y-+\1&C_1G1??P -M2\KA9+GFUA#P(79.PG[E=[GR)-_%6\$_LE8,=2A]H_`?O4UNM-5L0PJ*+UN> -MSB361([QH2L6'FE[C"9-1/29!>F3)YH3/K.7?I<3X6+ORT1WZP$;NXSMOLD7 -ME(BE)1TQF*OM`*G:&CGT2VFTT]'1?7QE?UO1N[6P3U':9_1VVAD5L<]=QA3\ -MH9Z<$ZB^.[M!*VW)GF:GP@8F5N`S:O]>]:[D\B8A>5.Y1W3MDX2MT;3:`H`_````/P````"````10``^%,1 -M``!`$0``P*@!`<"H`0(!]`'T`.0&R>K13A2SXR]B)H?`#],Y20(N("0(```` -M`P```-PA``#`);AG*Z[5&R]YN"Z-N&XZVIALUOUHY6OG^@HR&K:#%]]AYR7F -MJ#ZG9::P8X,>DE8>JO>N),=>T9]\%0'8-WC*OA;#*-^?G&J])P,,3!52?9^^ -MHEQC9F%DRVJ[9OW/12"=!61U#;9,"HX,`)TN38(/*1BP^NP@MI_BN=]M+6,B -MD1*!O$;?8U>WO6*/U;\,#-&_#/F]&I@A"L1&`W,74TN,WJQ;(XQG7;!3:V() -MA#XL[E]+*E_L-BTEY4K4R[Y.$K=&PW,*`&P```!L`````@```$4``&A3$@`` -M0!$``,"H`0'`J`$"`?0!]`!4!CGJT4X4L^,O8B:'P`_3.4D"+B`D(`````(` -M``!,*0``,!E[0C#3$%:9*EG\ORPG9N0#U4%6)ZJ;(>=;-Z6;O!Q;]I)\F9=L -MM=M"ZHR)3A*W1AV/"@!L````;`````(```!%``!H4Q,``$`1``#`J`$!P*@! -M`@'T`?0`5`8YZM%.%+/C+V(FA\`/TSE)`BX@)"`````#````3"D``#"?5]EY -M2)[;@_1,DA9S+@=SDSJM='(GJE+27ZSP8<%EB@H?5!<.Q2T652E,`TX2MT:4 -MJ@H`/`$``#P!```"````10`!.%,4``!`$0``P*@!`<"H`0(!]`'T`20'">K1 -M3A2SXR]B)H?`#],Y20(N("0(````!````1PA``$`O&35U4\V6[M&4?.B&50/ -M>BRB_*>Q03DE/VNH_C:=CH#>I`5ML1TY05RU00.9K]KT)!_F'-RV -MO!TN'2W@R$0_YS^ED9!%Z;?(>YTK)("-YCT"?^.]'N'-DNM:TPP)6C:Y<#O_ -M_=O##1D9_=GWXN))N%B)4++Q,)G!O! -MWP!$PG#(AY.%N"[7GAOP$]2?+#\9Q@ZF+/$(4]]]K4ZGX''M)8EW)]#H#J,- -M>+2EE-ZYD%V\"GTXQW)9#3A*W1IRV"@`<`0``'`$```(```!%``$84Q4``$`1``#` -MJ`$!P*@!`@'T`?0!!`?IZM%.%+/C+V(FA\`/TSE)`BX@)`@````%````_"$` -M`."H>7>P"MG\`H25,;&F7MUY3?>D!/$8Z9+!^+]74,"KT_%`EH -MH:##WZAEK(K35(UEH[N.GK?-/.+:6)%7)&*#4V^X,C&4*V2F!_P,0TI:FQXJ -M^&?3,7!%`WE^.M*3PQ'W,76)^X!FX8Y++2:T9US8A[ZS\7*SR7_PD`RY"B9O -M@C?H%K:3Q5=@!:?I=+3IS`4!R5-%9]E0PR#@^'T[&X17V!.HBQVOFQ7(N2THB2URD>/D@T>2O-Q!]EL -MG,S_'`CKN>C&L^5/6F]"PBF/,:Z_C3',97F18)\R4M[I*Y^<1,Q'_EK)RM:/ -MFL[JBC>.6>6..P#6HS$UW-4D$!PH1:^^+1*/]:$68X'M17/9)_Y=D0`3X3BG?-PG&W"Y-_%S(^" -M_WFAM5QGC%UD^(N,)S)XP1017N698V -M,G`RRH^U%03Z"NTT*9A[GGR+X_5V?,_E.H4Z,N^)BC`)G`#>`>,BX04@7]4? -M?!_75W_Q3A*W1EX%"P`\`0``/`$```(```!%``$X4Q@``$`1``#`J`$!P*@! -M`@'T`?0!)`<)ZM%.%+/C+V(FA\`/TSE)`BX@)`@````&```!'"$``0``LLV: -M9Y"F^2(1?W]/3]#3%2#[1\@%TVJ,ZC)6R^XN1*QJB['/YO!)(-;MH`U/$DR* -M)ZY#NL8.N+QHG\5TP)&UX.('5YN=9@Z\OD,SM]J*F=10;M,48L'!I -MGUU?7[6,:^^7:XDU.ER"(9[T>+B(6Z-.$K=&*A$+`!P!```<`0```@```$4` -M`1A3&0``0!$``,"H`0'`J`$"`?0!]`$$!^GJT4X4L^,O8B:'P`_3.4D"+B`D -M"`````<```#\(0``X+%BQC7#U8%>+C)NTQP@4C0#^F_0_UQ\*DPVK61S!N$^ -M]\R1]['(_?GK%_.A,EUD$&_>#'8!&_JA">S\:-[&6+I?E%!S/K]W"'(/SVD1#$)+28B-W0-` -M1+<,M;^RZ/!4V,3\N'T)*7J$1H7:MUD+3BF!RZ3?1&[II;@C!GD$B[7DLI!I -M[-#L@1`E:*I.$K=&B"$+`.P```#L`````@```$4``.A3&@``0!$``,"H`0'` -MJ`$"`?0!]`#4!KGJT4X4L^,O8B:'P`_3.4D"+B`D(`````8```#,(0``L#^O -MX[MQ=$^5C.0G1*NO\G!4H/B9,#ON0(U-W^:!>EPR,/,=)+>PF`$UN)6WO^(\ -M0^>1=Y&G@=]"],4^-*/([Y$D\\OL%`Q69Q>E!2YHGF+?%[9;R_H)VF-V[930 -MW"0_(KIY!J;FW6B9^_>;[1YSY36C"YP6PH2SXUC;IG;C9_0J%2;O&-2!8^#F -ML7J(S_M-+NQCZXA8SJY:@I68_I5LG&CT68ZOH9G;^;I[H]_YCGG7"OL$)IK;H6^KZB:#2/@_D):BK`-/D\E/`. -M(BO<5'?#1JBDAE,1WEG:U\Y.$K=&(&H+`(P!``",`0```@```$4``8A3'``` -M0!$``,"H`0'`J`$"`?0!]`%T!UGJT4X4L^,O8B:'P`_3.4D"+B`D"`````@` -M``%L(0`!4-[!$>%6)R=P(`^([1=)V]^]`F!,!/M^PS/=LHUXN?$!)]4#/ -M$GHXQZNCY>&YI&3YY)9V:X4SVDYX2>#V*O:H[U-ZAV`9VB5[C%W&#%,:?9PO -MPZB6`FMPG>$ZX.R1/#"BCNRH`Q>K=J%`&()T8W`)01W5,U=(@D*<]D!X0)Y* -M.]73C5H8%)2_SN%9',K=O9?L_]X!V-F0Y4CODO9K]=%IG#QH[0( -M*Y6Y[^.U%)@D1M%B>G)P848PF!B;WF]#.H"FI2[F'=`4^.EBH;HIAXY!K$J] -MQ[SIA[7M(_2"AU6;OC+$Z;&PJ?W"P!<`0``7`$```(```!% -M``%84QT``$`1``#`J`$!P*@!`@'T`?0!1`7$?@S29. -M$@G'QYP8ZUKL+>9BU.J?18W:EW-ATMN@2EY"FWXH[WH3/1'"A1D=RC.,66*[ -M^:$TVY[?$B/^4?SJMX`UQ,18$W"`?/^FS).GJGXU3Y3/ -M`L'X&&3K3'`-[UV9;U)W#Z!M4G`AC!F:8$EH"R7@=*U@9I[W_2BXC;V1#=AI -MXK%]$]7CAT)5Q%,>``!`$0``P*@!`<"H`0(!]`'T`&0&2X24\7P*S;/6@8V(3 -M(JDN("4(`````````%PJ``!`;DS%>,8P9EC$CN&A]:9K]"#<\O6)U&K#>F8M -ML@H1$Q]WQ'`A&3%!^RKZQQ.K!`X24\7P*S;/6@8V(3(JDN("4( -M`````0```$PJ```PY4HIB%8\FA'U9`WKY!?["%AUTPT>U?8ENP:-BO0 -M3A*W1H_F#`"8`0``F`$```(```!%``&44R(``$`1``#`J`$!P*@!`@'T`?0! -M@`=EY(9(ON%:1"(``'@```!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``,$]1:Y\\Z7SV%L.*0\A@Y^(ZO*#T -M'3YEXBA2@-`VLA,1P/)G$8?9J@9B2.Q;N1;'E`YC,\!/>D&-*(A"/*:[9"]1 -M)X<+*M@@PE'OJ9A%TU?)(S>R*"DBZ4$S)-Y9'9'1L0Z`-M(^XXB8L\(A -M;^S+X5]#N2$I```<``!`!-H(JC_T-*CFL+GCZ>ES^LWQM?,M````'```0`6; -M2O$K_-3N19.J2V7@M+C@AERU:4X2MT8E]@P`7````%P````"````10``6%,C -M``!`$0``P*@!`<"H`0(!]`'T`$0&*>2&2+[A6D7)```````````I("(@```` -M`````#P````@``!`!@````'[D44*5S&\.X#PE(;`;#GXTBIZ14X2MT:]!0T` -MN`$``+@!```"````10`!M%,D``!`$0``P*@!`<"H`0(!]`'T`:`'A>2&2+[A -M6D7)```````````I("((`````````9@A```@``!`!@````'[D44*5S&\.X#P -ME(;`;#GXTBIZ12(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``,$]1:Y\\Z7SV%L.*0\A@Y^(ZO*#T'3YEXBA2@-`VLA,1P/)G$8?9J@9B -M2.Q;N1;'E`YC,\!/>D&-*(A"/*:[9"]1)X<+*M@@PE'OJ9A%TU?)(S>R*"DB -MZ4$S)-Y9'9'1L0Z`-M(^XXB8L\(A;^S+X5]#N2$I```<``!`!-H(JC_T -M-*CFL+GCZ>ES^LWQM?,M````'```0`6;2O$K_-3N19.J2V7@M+C@AERU:4X2 -MMT9;,0T`4`$``%`!```"````10`!3%,E``!`$0``P*@!`<"H`0(!]`'T`3@' -M'>2&2+[A6D7)AQ\)OMQHUZ\'"!ROH+B[VCG2;.NG4]5L&@"P4=S -M[UX'.5);X."A@QYPS":V!L4DG59&0O\-O89XV')+2))`*0``)+&%O2'&D@%@ -MQ#'%U&>-PUHN:P?F;3_N>)6A>[%9+G0^*0``'```0`2^MA)`E.&X<%!#0:[] -MF-XP1TQWSP```!P``$`%WL^AT)F0P=CXGGU-",HR3HWW(NU.$K=&Y%T-``P! -M```,`0```@```$4``0A3)@``0!$``,"H`0'`J`$"`?0!]`#T!]GDADB^X5I% -MR8G+B`C"`````$```#L(P``T&3L_M.B9Q_H7PMI87ZI%!.Q(&&! -MHM\$`#WM"&Q\1^]^X8W.'<2JT=^WR6^052L?*XT>"G2RMKPGJE5'O^%<(8`9 -M$?AG83RPY3JJ>J1ED=78OCY<]5ID+=2RE!$-\;G<&&68M[R?Z*T?I0-^!)9; -ML$@/KQO\2^=27C;I<6C=>GG!8M!G7S8UP^K/61>R!>I/NYQ$0*,K31U$,F6& -M=TSX2];3%%DZ9IHX^6:J,Z^':XE;BDG#8=]#J4 -MV-B9YTX2MT:C=@T`O````+P````"````10``N%,G``!`$0``P*@!`<"H`0(! -M]`'T`*0&B>2&2+[A6D7)AQ\)OMQHUZT_.^C,^K2/++Q6!,3"YWZ?H(I<^=?`Q).U(E!7Y^I^(2F?K@^`;ADO5BK -MM!YP]0T>P&[<&0_FP]L*Y<5=RTJV-/;E:%,T_;FK69WP!T5-B.]'ACC4FD3U -MY=M=>6P<_2&2+[A6D7)AQ\)OMQH -MUZ+_D4NI;=1S;>[KJY5[,%FZ\921*?]*; -M])F?^_*!RH:\!R/6Q`X9V0ZR66V@Z@F^(BHA'BQ.@W;Y2^(B+Y$QJ1SC?P!3 -M@M5&.X)^#/QIA.#-?#XRP8;N\+%!06./;]1-^N7:V$E`B4'$47)JUH2Z4%U0F6HUEPYJ* -ME^IN/C0MZ@Z2-M7@ZN!;U&MOW8PD+>NUTMU0+V';:)P<6TN7O,=`F\&7R]$: -M^9U`_P.FH]5C7EJFUTX2MT8\I0T`;````&P````"````10``:%,I``!`$0`` -MP*@!`<"H`0(!]`'T`%0&.>2&2+[A6D7)AQ\)OMQHUZ;4&E;V`7-5HQ\7K](@B-IJDF?AT3*8%E -M4=I.$K=&8*L-`/P```#\`````@```$4``/A3*@``0!$``,"H`0'`J`$"`?0! -M]`#D!LGDADB^X5I%R8G+B`D"`````,```#<(0``P##I0=!-;EME -M.#IW_+,3QW4,.4X^:)22:X%6Z6ZPSSQJ4!7MX#M/XRZX7JV$7C4=F];*BDB3 -M%W7O\L\#CGZPBBLF>OU?0>O5>4,T(4YX/JVI."!3!@4XN@Q"*ERS:[2)UC%. -M&&='!LKM'X3QKBLU<=@@T?>?:OC2:7+[5KO_3:V^`<@9;Y\ZI6/:NBF\UX\= -MGA.,96K\LBP'JWQPO&!I_#:@>N.:5OXI(E2&2+[A6D7) -MAQ\)OMQHUZ"6] -M^:B&(&/[?%D7%4\7BC<1,(],1$<32SAA!B"[MWION5]=?K2?M)[84LSKH&=8 -M`EO_T9^KNP-O!>H[Y6UQ6#_QID@%F*EC`)7FEEOBV.WPI/0S2/CW\`UJZ/@! -M*^CE:Z5>:.L;H?6JP3T5`@-9"90QGR"/A(!:8<=9_T233[H&GY0S:-AR)JA:I)IE\[]ABM)F -M_V":+HR<:F@Y9+WRL0R5GYT1@>!@J\"-[;F.FJ2$#T>:!0W>O][I'#E;T>@] -MF/S(+&'R3A*W1H7M#0`<`0``'`$```(```!%``$84RT``$`1``#`J`$!P*@! -M`@'T`?0!!`?IY(9(ON%:1*AL=7J>#-K:VK?4^Y)Z&=HW_$ -MP8^4$_4;:[U/$V!Z32P/'BQ#`3^.<418NQR)U^T.DB-2",FIHX5Q95J8D([\ -MY@8W3"P6QG+1$T\AW'+>@:NT&-=3!$.VIJJ!Q4Z).C8'X>6)M^)P60<]SH(, -M!R7T<6JFQNZ[0I@5Y/"K,M.U,YD3=7$,$X^F#]4:IE<&E%2XU!4->(IK)J^X -M:H^_TRHOL1Z`OG..T>)+W4?&>-\\00UK>PE%W0FH1:C.VP!+3A*W1O+\#0#L -M````[`````(```!%``#H4RX``$`1``#`J`$!P*@!`@'T`?0`U`:YY(9(ON%: -M1^M,1B<2&@ -MKT/%)L@/$9S_T(E;XI/V=K>]OWT3R4Q_0V'C)V;*PD##"T3@!#,M3TQ_IO]K -ML&&95`?.L:W`O@);V]96R]IPH)&=LTRS+E$-.L20" -MT7X#DJMX]RTO1UXQS(1XV+=N3A*W1O@?#@#L````[`````(```!%``#H4R\` -M`$`1``#`J`$!P*@!`@'T`?0`U`:YY(9(ON%:1*6V'BLN5G2Z&??)P[]__,[9:??! -ME=M(NJ7$4$7P4T:C`$`5B0_AR'XPR3"4ZVHG"JQ!4B9TGTK(%#$:OI1A&(E( -M+Y#AV&0@;.X/!2JRGKQ;+P@"&MVNC,(*#_)TG[=66'7$/!B^UV1FGR]%L4-- -M3A*W1H4\#@`\`0``/`$```(```!%``$X4S```$`1``#`J`$!P*@!`@'T`?0! -M)`<)Y(9(ON%:1KHRY@!O95 -M2@\X>BD29UL>B5!6USUNQ%E49#6J4;EUI9T5`35IADNI-8<4DHS(L2\.CBHV -MMNT']$8N(='UI7`O-?S[F-<[=D`:FW:IW,5>04`#RSM?WU**NU>'BT%9EP6T -M%*@B][N,>D_$6.=S\-&9R&N8.7W/";_GQ -M$29RB0XJN=B')D$W6^E[)5UJP6QF6KFP&B`(B"G&P621A>6U%H3*.J3OI2.` -M;PW8/L*^E0+<[=9P]4^=5C'QU\K>DG-L=?\7%JZQG*#*"7R^D:P0(OG[*8&Y -M!XJ1#(YSLR(6JX*6`Y?(9AQ.$K=&AD(.`!P!```<`0```@```$4``1A3,0`` -M0!$``,"H`0'`J`$"`?0!]`$$!^GDADB^X5I%R8G+B`D"`````<` -M``#\(0``X%-<#`,N'N4VTMQG@?@^)Q*>LJVF_0#TAC+YY<\&ZGJ^A?LEXEYA -M%A61J8MG?Z0K9P;&QUS_.8H4RW3O/?WS($K!SX_3^DO;$G<':K:I/3&::'WG -M_"3$!=/W,^4:0E2C/^!5>Q.J#GVCO+/6#L"";DK,6$' -M%X%.$K=&'U@.`.P```#L`````@```$4``.A3,@``0!$``,"H`0'`J`$"`?0! -M]`#4!KGDADB^X5I%R8G+B`D(`````8```#,(0``L#U)BB0/C)*# -MK>.^Q2W\+I[$^?4TUPR^"B2ML?JSX$/#2XEG'-7EQAY%75T26Z`L@H;JRI]' -M:WA>1U/2$!U#:3/[)8'UM4VH8!'EK>QAN$3]DR61_0T2YVE1'0VX\W9)M.\* -M;?4-79BEM[21J$PTC9LY'Q]AE4A`A[56T'UE%FX2E/>0Y^+CUS@U\*(O`(VX -M_\?`P:S*OR;R`*Z=6ORPM@:QVSO>72EZ##W?G+B`D(`````<```#,(0``L.C(,W",/H)L05_KC'*$DT,HUNL?HE"'9WFK -M[2'%AN?!Y[:MFQR@*5?"0D*-XHX)3%+;R.5[VF\9XAF;IZ"`.S%1"C`M0&BY -MB#2=3SNDS7LT?]<7N0\9JH-C<.+29,4=?*`1@DM]_VG'"AR0GK3,T$#Y*^"D -MK![DH*FFW=`I#?H3NK7_XVL7&NMV<5),B:7H1;\RK[8O'XX;VZ?AVQO*;S1' -M(]0AA,"Z=A$3:<9.$K=&U*`.`(P!``",`0```@```$4``8A3-0``0!$``,"H -M`0'`J`$"`?0!]`%T!UGDADB^X5I%R8G+B`D"`````@```%L(0`! -M4'>?0?VFPO%+:O2.B[DEUF(N8;AS.3AMPD:TC4RC31#=@@&,O=&"-?">:[X0 -MQ3&GM(J<:M,]5:/+A=T@ORJ8=*'6^P],2[:DJ6B9OY,Z?G9*0>]OSX"$=@-[ -MDQ0$82CEFM2THXV($D\_.\!BY$]I(0W/N4)MZM5JR?\N7[-!#=801#[8JL2R -M)-I-XNR8..C!1][ -MZJ2F]&:]`2KZ0:WK9>[-W0?.\ZCH!QM(M2`LRHL2R89/FM]OGO%,5;BF:\L6,3Y,"):!9ZG2@!>;++N6<2\#^[.5!:OT*>1?@\&;!KP#9_.M4Z6, -ML$V,3J6QZS/4+:[S[L,;#ZI]3A*W1H74#@!<`0``7`$```(```!%``%84S8` -M`$`1``#`J`$!P*@!`@'T`?0!1`=EJX>Z5)=3G-&Z($%O_3EMK*NSP(WJ*KS!G;M -M4#-EBE12+UXS7TJMZ*O!:R7CS.EZ(4%++)4JD&W8*BF4EACP5?V`F:^L>EX, -MN+O"`-VJP[UUMO'D4C+GS,5`9)P+20$'NBR3%QA$'RSWP=@\PV+*=6^2&+?;?BVA^-LR5\HC7BL:F==P7*B_Z9!D0AWLFXJ[[ -MWG**Z$X4>&\LS-(G0IGI)IV$\#$8[-CFL'>S7C4:U@"W<+R!>,T]+XJ>M&N2 -MKIK:*PN4Q>@.M5DIY7BM0U7`'B&[;Y.X+F=EDN2"B@[6[D]JLSRIK=(/:5\" -MO!.E83<9_*((W6V__.[H!!W*OP'NCTX2MT;J^PX`?````'P````"````10`` -M>%,W``!`$0``P*@!`<"H`0(!]`'T`&0&26<]FG:VX%,AH!I&O2;H6>XN("4( -M`````````%PJ``!`]"U/'R+/:>\+XXU1,-&-`$7Q9*"M"&;@WAQ>)E<[Q=J' -MH%'%_JGI^[(GC%V8Q*8;U;3>/+!34#&4=EW/3A*W1F('#P!L````;`````(` -M``!%``!H4S@``$`1``#`J`$!P*@!`@'T`?0`5`8Y9SV:=K;@4R&@&D:])NA9 -M[BX@)2``````````3````##/\E##K$(1&?11R]<460**OWO*%#KAX*>5:!9L -MKEF*D*6#>];U%_NDVC.>;4X2MT;(%0\`;````&P````"````10``:%,Y``!` -M$0``P*@!`<"H`0(!]`'T`%0&.6<]FG:VX%,AH!I&O2;H6>XN("4(`````0`` -M`$PJ```P2&.'#U8W;,DV'2NK>)8V>K[O&[X`VW`>#/.%A[RN+5E%E0@P)S`8 -M'`]=4S5.$K=&!2,/`&P```!L`````@```$4``&A3.@``0!$``,"H`0'`J`$" -M`?0!]`!4!CEG/9IVMN!3(:`:1KTFZ%GN+B`E(`````$```!,````,/5S(0*@ -M$>I=5@#=]4Z\,+@WGD%PF7YF6\:OG`&0K55&=!&D9D$_?2@PYLJ53Q*W1F3; -M``"8`0``F`$```(```!%``&44SL``$`1``#`J`$!P*@!`@'T`?0!@`=EHGE% -M9*FT2IL``````````"$@(@@````````!>"(``'@```!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``%V#W!XSS]#/K)=*9Q9"ID*[@D7 -M)WZJHP+3'EVS:R;E&E:FMHF6F]3)(QASL#'+%^@*E;Z+6'`D=NCV+3*3"\?9 -MC":+<=PUETIJ<6(^^)Z#[.F!6JWP!NZ_-Q>N_;5M`VDKU -MI<8I```<``!`!.'GG,$W$YKYD>'LT,P@55OQ@8OF````'```0`63CF0SS1%. -M"&;F22YQ#P/C'\#DHD\2MT8)Z@``7````%P````"````10``6%,\``!`$0`` -MP*@!`<"H`0(!]`'T`$0&*:)Y162IM$J;```````````I("(@`````````#P` -M```@``!`!@````&X[.P:[H)KS>!^9QGC`G07C?6\\T\2MT8O^@``N`$``+@! -M```"````10`!M%,]``!`$0``P*@!`<"H`0(!]`'T`:`'A:)Y162IM$J;```` -M```````I("((`````````9@A```@``!`!@````&X[.P:[H)KS>!^9QGC`G07 -MC?6\\R(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``%V#W -M!XSS]#/K)=*9Q9"ID*[@D7)WZJHP+3'EVS:R;E&E:FMHF6F]3) -M(QASL#'+%^@*E;Z+6'`D=NCV+3*3"\?9C":+<=PUETIJ<6(^^)Z#[.F!6JWP!NZ_-Q>N_;5M`VDKUI<8I```<``!`!.'GG,$W$YKYD>'L -MT,P@55OQ@8OF````'```0`63CF0SS1%."&;F22YQ#P/C'\#DHD\2MT98'P$` -M4`$``%`!```"````10`!3%,^``!`$0``P*@!`<"H`0(!]`'T`3@'':)Y162I -MM$J;AZ[)AZ<'TM<$DN8W.<9U(#>\M6+<>T,E;ED@=Q7RZA -MXLTV\^MRU;)-ZWIFU::GDB-+OGWY8?GV)]&;Y.'@$ -MJ!00[P"HIC;J.=Y6L6GF>VL1)3+CXR(X:U$E*0``)%^>Z%DZ-&ITYJ[]-";R -MNXT6_[NO40&&Q62CS -M@````!P``$`%L>=DD>KF;QL'N%)QM?@85UJV45DJ;1*FX>NR87+ -MI._E+B`C"`````$```#L(P``T!,BIXO?0%3+4`9G.O''S](H\/^UR/19/WDC -MI]B-<`TC>"*&94T*/'@HS!T?R4;]HKMG58]T2!64-/P7$1)A_PY#2#YQ4CG; -M"2Q,TOTZ?K\48!+W7*8T$S::I\@^;=-3N&8SNG:;(2?S#J"@*':>L[)">N=T1-(,@` -M@.SF1,7QL\_O5WE&Q;50NK0 -MC-&VY5I3$BZ3K2V3Q-,D=;(.)\$LF*YV/3R'D(="/&V>AC\(.K%]2K.X?O(T -MG#[@H^V!J4UA1(ST -MB_+,V3(GIDW6['L=CM,.YKE4$'BUY4=*N1NXG#_@U0\"Z?\KJZ.QPVEW%'`, -M:WI`T00=/4\2MT:WI`$`_````/P````"````10``^%-"``!`$0``P*@!`<"H -M`0(!]`'T`.0&R:)Y162IM$J;AZ[)A'12-:K3[E],$<):R>!B>[]N.V"^K6HLYI -MAT-4IWX!J5JK1,XFCQ,-5N>WM.:%1I445DJ;1*FX>NR87+I._E+B`D(`````(```!,*0``,/\T`>RP -M?[_"&N8'':5TH9S\3'OU2'13Q*W1L7* -M`0!L````;`````(```!%``!H4T0``$`1``#`J`$!P*@!`@'T`?0`5`8YHGE% -M9*FT2IN'KLF%RZ3OY2X@)"`````#````3"D``#`MY+K"G^=Q%A&^:&'](0'/ -MT0*_*,BC2_*H;:0Q1B;&22GE#S?HWF\YXXQ^C2F8I@46O1+:L_!UH)`[Q7 -M..B.H"X]R@O]&`^,$`M4\,ULRV%(M7X;SBTU7MWFWPW1OTM<>(@F"FT*>8!HBE -MX$C+2VX3"'].X-'ET(P`&0=30"9D:072$!UI+>PR),RK(JB'-^`4"`C>#-^0 -M3Q*W1C3U`0`<`0``'`$```(```!%``$84T8``$`1``#`J`$!P*@!`@'T`?0! -M!`?IHGE%9*FT2IN'KLF%RZ3OY2X@)`@````%````_"$``.#FO@XKF429OP]` -M5;$N9FL6[&O\8&V9\2E!QM,&7OW,SX@Z&+G2YZ&U>?(:.9/TP\9V1#ZM@CD@ -M1;7/;[;>>,U4Q\FW5G'X:;2TC&`4-5EVF5:R#E$^)41O[C$%V$ZV9=%9&J!G -M5'-+E63?1-I!'NGCY,X1I<7A^\AG2E/RI6RU?2(F@5?<8RR@$6:SS3I:4;^$7N3_9HY7)3^'2`5SWST4)*`V -M=?>P0=S^)`?(WV,3RZWLQ^XZ?.3*5U?-3.:.C^'`8LRR%U"#JA/#T=+^YD8+ -M@LEV>E=\6;>L*M9/;44RLX'&4Y<7M-1((TO\0FC<;+$-7[P>GB2/Q^#+QBV/ -MYC69"/?N;7#^TX\J.J38B!/[VF[J)H,*CCP&';W_LZE&#K+\-[L\3Q*W1BE! -M`@`\`0``/`$```(```!%``$X4TL``$`1``#`J`$!P*@!`@'T`?0!)`<)HGE% -M9*FT2IN'KLF%RZ3OY2X@)`@````&```!'"$``0`*B.`^__H:Y8/EM@M^CV;I -M7,+O3U&!*^?L!\L;'(DD-JH'VC4NHL'L<'4OA>T._ZR<86V+P:,^/\-./;8L -MO)Q1]2+[1:)-LC^]P\S_I/:^\L=IE4N)^5GMP=B;30$+;T6V==/X8/QX`QMA%[NE3:Z@*)IO5,5%&;PJ`9 -MM++&>7B<_)\=!O2H-3O*^+_S^ZZET`-IH,<`$/#9=7*.WL/+I>15G6:14)+( -MP+OS02W*YR,YM>9JB:4S0"D1;E_A8BU$KM!!/OMIS(!F!4=\Y"N]Y$JT[%B9 -M!SN[^$:(XH;;F3Y/$K=&%TX"`!P!```<`0```@```$4``1A33```0!$``,"H -M`0'`J`$"`?0!]`$$!^FB>45DJ;1*FX>NR87+I._E+B`D"`````<```#\(0`` -MX'VI7:S>FBF4.;[A?-*#67-Z\E#(&.X+NP5B>:;@%Q*7L6;99CX(1-OK90G7F7H=+[^=Y/__N<82UK_34L3G.21*1G57MTB@ -MNW>U:O_?G]8O;"#7;-GF@)92DK2"1BJ;O?%4V4G.#VQ>1BV*F/6^R%B>9R5< -M\J7LP)47[T8J#Q8!AGTJ_N4:^4PF$-='=SO[UY!5M4.^\?_<5[2INMQ/$K=& -M9%T"`.P```#L`````@```$4``.A330``0!$``,"H`0'`J`$"`?0!]`#4!KFB -M>45DJ;1*FX>NR87+I._E+B`D(`````8```#,(0``L)P##@6UU@S8DL1 -MB@QX-UR(!8%I(LR#7*IP^Z/H+I&VJV32?PL(9.,9$[*EB1Z8 -M2%0#E\R^PT#3J -MTN<<=1^.JXJ!)Q(LT/\KR(*OPW.%\SD?$[Z#3:C2J`X;.!N2(1"0M^YE![1@ -MG;WOYCO^DW8+^_UP9GIDS7EH7[EDW:E/$K=&Y'X"`.P```#L`````@```$4` -M`.A33@``0!$``,"H`0'`J`$"`?0!]`#4!KFB>45DJ;1*FX>NR87+I._E+B`D -M(`````<```#,(0``L.`L:[*CH,7._+L&DB\A?NTET+,G..D3W3BG4:CN@>.V -M=V?.,J+KZ$&M8%24;OEBGGMO\BZ[:W^$+U^*?#N.Y9W1V@VVOZ\LEU60`_[_ -MT,UR::L\8CK>E;6$D.\=CEI&H&U`F1T>`>A)VIQ.`L'C3+QR0C*SS^&;\#.` -M],QF,+25.K1F0,(BR/5VUVXG0._EC+7\D*Z6KL26LB4TUM-4`BN*`<0VAQ=[ -MFG9[*VQ/$K=&?Z0"`(P!``",`0```@```$4``8A33P``0!$``,"H`0'`J`$" -M`?0!]`%T!UFB>45DJ;1*FX>NR87+I._E+B`D"`````@```%L(0`!4%P!+.TD -M[PEB!M6T/!V6.3]OU4='$FS@(C7U=+[G]$PX17<(4_[2W"*!Q'>?Q,%;X35# -MS0#%0;6N(F`(O]B5G2>J+QRP)WLZYJ':!;.?GP].2\0V(+)=R%7<[Q*WYOI; -M'[@-(RWL9-20RFL;/9$<78?N$(J^Z(H'YA?S)$C=&+Z^%;KZK%\&5]'H8TAB -M@B..>.\80`<>2-.I'T9KY2P[DMDC]OQR`';D&3N;-DB[HFVZ:"&O=_B!3"HN -MA>HT`:01U>$O^0-T8U)DC2&S5U`>S^,-XQU#LO+$462C*_"C -M]^4A>>]%Q0I6CSS@[)`2MFI$_JOLH"C;3WFA[SN4?'T3S%V]0RS3AM5(]77\ -MK+JSID._82*%.Z+'\[)M[8JR3>P`Y+AM+R$K>#X'+7FB;O'P,3-&VV9N(#W% -M%7`%!8)BJ@/4__HV3Q*W1C+9`@!<`0``7`$```(```!%``%84U```$`1``#` -MJ`$!P*@!`@'T`?0!1`G>I@:9J== -MLJ91FX8^])X>`^M]"_M7*/6J)"PD4C/;7R1-V_\>DD+"&LU>]W?WKF4>)D9? -M@=98'(%=K+A:EQ"8DSRB_N#'9P..`^.UCD^Y'E&EE>QG@UT\8\5K0U'EP#QP -M'I904.@YSXNZ,KSDTDB"C8^,@\X4C\.\G``;F1P*JO:;[%O$G7ES'\-T<_)8 -M<.0-)65\RSZ6E'$,3[RB\$\2MT;\_P(`?````'P````"````10``>%-1``!` -M$0``P*@!`<"H`0(!]`'T`&0&225U']IC]1Q%#U(+4J7!ZS`N("4(```````` -M`%PJ``!`D%E/_%I(O_S3'R)9U-Y*9REV06UE1E4)W$8T5J6O!]0UI&!2R^+, -MC44LZJ>1?#\&"T8\B!VTL^\R!G>T3Q*W1M`+`P!L````;`````(```!%``!H -M4U(``$`1``#`J`$!P*@!`@'T`?0`5`8Y)74?VF/U'$4/4@M2I<'K,"X@)2`` -M````````3````#`?PC'@/J8%G%)9H1XO-::LQ^+4N@%1Y*T<0/ON!:/@(V+AVQ/ -M$K=&AR@#`&P```!L`````@```$4``&A35```0!$``,"H`0'`J`$"`?0!]`!4 -M!CDE=1_:8_4<10]2"U*EP>LP+B`E(`````$```!,````,)MGXQ$P\[^>X?69 -M`B?;;#&ORO+[%+8,(RMAWE*O>2WO69='C;O^FXLU/;6F3Q*W1OP@!`"8`0`` -MF`$```(```!%``&44U4``$`1``#`J`$!P*@!`@'T`?0!@`=ET(ZUJ"QUH4$` -M`````````"$@(@@````````!>"(``'@```!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``B9E'1?Y']:&%:']6Y4XHED&.^APW6!3=W5TV1E81GB79 -M;/5Z*.1FHA,0JA#&+S8L`__@$83I@%T)2JWM0:`&[OF*.RLP.W)+!KK:]$G? -M`;%0LN&@>PXD<5+OD%/,Q43K6]A;Q/QV.U/.#(#[89P^!\%4,(L -M^BA7>.4I```DBQ6A(&2[%7V@?9BR-IXV?J5"33\_-7@I'#J9C+8=*3XI```< -M``!`!,&RN5-1Y[V2&I\E$%M4X'HH/Q`;````'```0`4'161DGOWB]V)6@=TC -MPXD<5+OD%/,Q43K6]A;Q/QV.U/.#(#[89P^!\%4,(L^BA7>.4I```DBQ6A(&2[%7V@?9BR -M-IXV?J5"33\_-7@I'#J9C+8=*3XI```<``!`!,&RN5-1Y[V2&I\E$%M4X'HH -M/Q`;````'```0`4'161DGOWB]V)6@=TC+8]E1_3Y5X'+>4P%5.JD_()*0``)&Z17>7J='JFMX:N,&BP>NKL(U71 -M=;A#G[H*ZW9V6"4B*0``'```0`0ZP4OX6;;F"(&J5Z;;*`^L)W#Q8@```!P` -M`$`%H!:M=\29Y'\^T3B<=R;B(CGN/N-/$K=&7Y`$``P!```,`0```@```$4` -M`0A360``0!$``,"H`0'`J`$"`?0!]`#T!]G0CK6H+'6A0?"!!-%.RY%T+B`C -M"`````$```#L(P``T.@%9)D^V50[.IXM>S647F3GT,N%K5PL]C8M=0KYPWC& -MWA:$6/PL<>DA"X:".K@KRA,W2;)!Q#@BT'D50>CR#9,)CP),@#(%_Q:RFE;C -M!L,UM/?=(4(*L38_IM[LDORKK1.+E4=FP,F`+%_B?T=:61K@&,9I6+*2S!<< -MG4%N$*!J%OJXLM*;50!%C'96@L%2@E!,P')K_XOK`;@&7/D--W_'+"L:FBRF -MDV-A8+&6G+[Q4-N;#&]&=)8D#M9U;Y2JOR5]D-Q4V?VRA_`<#D\2MT9BJ00` -MO````+P````"````10``N%-:``!`$0``P*@!`<"H`0(!]`'T`*0&B=".M:@L -M=:%!\($$T4[+D70N(",@`````0```)PD``"`;?EU`R9K8._!^@9?G>C)P=(U -MGRWV@O^-00M/HLDPN%<]S]+,PZ8^DAH:8=/)(/+MT@F^??P9G9)YT7TK4X/5 -MD>N_>/"`Y,>P9/ZZCZ&0SP+%@N3BX5$$'AED+SJ!LWX= -M'K3$/#GN)AQ$X3"%AM>X3D\2MT;?R00`'`$``!P!```"````10`!&%-=``!` -M$0``P*@!`<"H`0(!]`'T`00'Z=".M:@L=:%!\($$T4[+D70N("0(`````@`` -M`/PA``#@Z&@7K`S?1W`UV,5`346,HX[_4)6)\7!5["Y?`:!4UXM/<4C)V0/X3P(_J?J^)[$JO0(W -MX3N_1_/D*&T%.`$\;SGX+EB6ZS0\F8QIMP1^I*F\-XI1N'*L#@\"$Q\A(?>= -MR[CI\=``!`$0``P*@!`<"H`0(!]`'T -M`.0&R=".M:@L=:%!\($$T4[+D70N("0(`````P```-PA``#`%P6J$2;6ZPN? -MW8^0P9/Y;5&F9%0,V;#V=&9)EV:(J+6N)U -MS)Y2WP>Q!5B^C0$U-=$C=J_X\SB&K&^V4?NIV'/2![^7L>;V;;L;UE#89?&) -M&9Q"S"`,--1%U@!%"?^MDJ5[7X(PE.(,N8DE7OWH;Y_5P69?Q'2PO]P+538[ -M+X*^3V`#$X^>9[#5Q%F(Q^O@NELR8NT#=R^GGY;1;+8*P8.T8-3RY0Z9$!!/ -M$K=&Y]\$`&P```!L`````@```$4``&A37P``0!$``,"H`0'`J`$"`?0!]`!4 -M!CG0CK6H+'6A0?"!!-%.RY%T+B`D(`````(```!,*0``,."%W`%5-5[::90!(U -M$@T'+?\V[_DC,\XTEP5II$*\O_`G#RO,3Q@K%<@$\)8?[[;)(=PCD3C -M*^X]U(L5>E@.V]LHU3?V/8@8FR29*8M`D11O^V+D_+MN.40J\T/$)KCJ6,:? -MZ;T14-S[>KPUV2=<_21/(V3A85J4E7TY#,R9D=VQDFZFU<.T9(YCX?]OG'7R -M6W'30&*"BG9^>0OO3BS\O$\B[(;!3QA1#:*4F-Z2[*84("7\*.54&!7*L`%^ -M46<9O'EQ<9*NC.E'KU'8;(=):-!.10()"V/P2*0A]@X2\78SK]=9?@P[BB`R0K"FL!:MM_53W:#!(B3Q*W1HH< -M!0`<`0``'`$```(```!%``$84V(``$`1``#`J`$!P*@!`@'T`?0!!`?IT(ZU -MJ"QUH4'P@0313LN1="X@)`@````%````_"$``.!5`MHP1;Y7JZ>ZK -M%BA\23M,-"*UZXGP`@(!H`>*`R8L\"D'Q=4UWX,RCT!0.-:9A-;Y8%CT;K&T -MEE_L"3`#G]6]B(%WP.L-H'!T(27C])1B\PF?MDKTL"DH?K%Z.C)YA]U-[V-. -M)TXQ)HE$00FFP`2]9VB;B:(/RM+7B@D_]9_2@HVO"MO;(?&ROL*V4BNZ\$[Z -M!5XP(B-Y'6?+]X?[[CX&QM7QV";&-3Y.>@C/ -MH%<*FPIV7[AS;ACK+R1ZWD[OD+>.M^H)3Q*W1I`S!0#L````[`````(```!% -M``#H4V0``$`1``#`J`$!P*@!`@'T`?0`U`:YT(ZUJ"QUH4'P@0313LN1="X@ -M)"`````$````S"$``+![Y"+>M[MZ7T'G;=AC5G[J@=H?1A\7)KQ,C2@&*/.# -M0`\*/PA[VW#?*5%XO7_1TYO/S_TL'5E:$L*ET^ZP7RU\2M=\*%`,;)I(]0C, -M6?76+/`^_E+JWMZNR-Q?4KV5S3OC,XA.917X/.L!:-U5(DLP'@S)R/24`3>6 -M][-L71!3.L="!Z?8XM_.P)/:$P,2J]H"&;(]8<0)FIB^E895C1JDN-SW0X_+ -MJ>:[*T/C3Q*W1J96!0#L````[`````(```!%``#H4V4``$`1``#`J`$!P*@! -M`@'T`?0`U`:YT(ZUJ"QUH4'P@0313LN1="X@)"`````%````S"$``+"X,^]@ -M1U2C&&J[NO.9V6^'EG9M?Q&-H99+<;/T@KP0Z+9Z;L0?H4L+#\OW31V7A4ZI -M@X8G9]XG#;Y`P<"5+P%CU:#+)C#@>-BR?UF9?I$-O>,LNFY#X+RJ]]("J-]P -M+APM;>(R8I;&:0HT)^`=LNQC2V8)L8QPTO4>'@(_YW_QR/JS-= -M!THJSX[(+"6>E)'&`1*IY]HE)OS7_L9:=DH]72G%`12M0[&H0,*+#1Z/>W>T -M5-'\[G*&J%IJORWJ8C[;&?8\;W'UE#LV]KD"^([F974S%.D:IL&AZ*MU6Y)& -MO\AV9`N?Q+J1H!`#"^N`2_$]T4$Z(95$;O1_BOSFI=#/.6<&1XNFV5LOOCZ8 -M=GI8._)/$K=&[G\%`!P!```<`0```@```$4``1A39P``0!$``,"H`0'`J`$" -M`?0!]`$$!^G0CK6H+'6A0?"!!-%.RY%T+B`D"`````<```#\(0``X,PYS4E/ -MUCJXN!(@2QET&KK$;1\`I'!^TA=,VO>Q-G;?#;+BV!/X`%E@9@(6&?H7'(!U -M9U]4<'WIY!B9WV.;^^*BQ#K07(WF"(8[ -M:S@1'((_J]2EI\HH\RCN`H1=6G,G+_TLC-P]'F[SD'_@`+"4%F!P5@MQ#?6@ -M`@3CN036:8($^)C@@)GSBWV*@,PI&1A,9@L\&V4,\R+=;3J0[)"Q7\Z\?51" -MVO$XS<8`TO+.$X`ZK)%BE-M'T7>$2Q-?%/58DO]4NCO+G)-_%VJ< -M^S]6^UVG<4,KO-ZX<#"MA9S;Q%O9G)G[>>"S]U`JNO8!)^KM6@'Y%(6\P'Y; -MW&C9Q,K>?(PWU@BOQ-'O]ZH/J6U*0>!""914GH0?)R_^&Q_>V+VV`XGE@F&2 -M'7*34'('=P]G"&HQ])BE/%;4G!<7V(V]&_E,OI]<\!DN)S&S6=D71X'R`QQ/ -M$K=&O=T%`(P!``",`0```@```$4``8A3:@``0!$``,"H`0'`J`$"`?0!]`%T -M!UG0CK6H+'6A0?"!!-%.RY%T+B`D"`````@```%L(0`!4+1]WU.(C3HO4?C( -MB3Q4..\6,GEPA[BYT?J60VB>VOW51:.W94:#2<&`R;<@I"9^<;>LBEU!TV.$ -M&PJ!#1\7V:M5A*4**RVARG%^/V@'YI,I#,#72`%(5ZCH1U:M>.F)5?.Y)$6J -M[CWAPG<6=2>(M,P^)SOV#UQ>E=W:`+5GU,T"S$SK?*QE,E`@G@@;4^\4>GJ" -MEZ-]?F=RT%U`SVB#`1/4%[(&I0,3/ -M@FRMP;:]"]FE\#R.D5>Q'M=4(+'AQ3H2ECU>(G3RB:*> -MDH)64@STA&.$1Z,":3!>/7'!SRQL_%I1^_L7BUU+UCQ9@$K*T=[`#'2!.3]3 -M*Q3H]@W>3Q*W1@@2!@!<`0``7`$```(```!%``%84VL``$`1``#`J`$!P*@! -M`@'T`?0!1`8R(I:8\8S -M'^OYNQD%_#%_!O^<)?`:"3R5:XDS?ZJ\AH#`*T-U>=D<'+[N5 -M@OQ)2V9BH$MEX/V`-V;147*IO1IHO,4GD.(O^B-.P/J"9<\&_=EDKI45_41Y -M4X$]^E"Z083N--#QJ*#R]`6%T`,<]R_!$MQB8DX'V#WO#3V#_)>.8&5-C'8L -M>-/U_8-@BR#=/,!(G88R!U0RM/[\A(34%7=@GN*YX2)%]KS7_P-E\=_%-L``!`$0``P*@! -M`<"H`0(!]`'T`&0&26@Y)B7W?V7T\C7X9IPBR_DN("4(`````````%PJ``!` -MXJ?->+Q:C$;*QO7VE;*8YF.$F'UGBS*/6'I3'09=R.`XM$20"O=74:"2(G^; -MY<".,E`TE6(E#+HS(VFM3Q*W1DU$!@!L````;`````(```!%``!H4VT``$`1 -M``#`J`$!P*@!`@'T`?0`5`8Y:#DF)?=_9?3R-?AFG"++^2X@)2`````````` -M3````##H3M=G`5X0^KM;2VN(&=3-0BU7>.UP109<\A=[Q&XHEH#+D"P2ER)( -MVN^$=D\2MT;A4@8`;````&P````"````10``:%-N``!`$0``P*@!`<"H`0(! -M]`'T`%0&.6@Y)B7W?V7T\C7X9IPBR_DN("4(`````0```$PJ```P,,H-/"H! -M5)WLK.[C"[3E*I7YK5.Q$ENY>@6!57P82@Z#N`!>P?%RS.0SX0Q/$K=&(6`& -M`&P```!L`````@```$4``&A3;P``0!$``,"H`0'`J`$"`?0!]`!4!CEH.28E -M]W]E]/(U^&:<(LOY+B`E(`````$```!,````,$_N<4SBDFQ[:3IZ#%%9Z/IR -M=2P,<(XIN11T'IQ"(X?=,I\JO!D[2$9<\_@43Q*W1M9"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``VGORFA<#-`SCNT\]A$&MZL%]'*0_@\0%>67*(33U*Z=FPQ!TR$RW -MW/,;P'XP7X8NR'X0VR/6B01M4F$UL[/D2[N>.G"OO]S_2AJG7HJ#9RF--5D^ -MG)/?&3-ZRB'.)M5P1<_K-2P=IPU?/['/RJ;0AK.7*EYATVK\5\8@O3=\12XI -M```DDJ%>Y'!1TL%/JHDE/U"4>1-DC#&Z?Z/ED7(.??HL:L(I```<``!`!$JF -MD['*(8Y.=7TLFZ83(SR%;);L````'```0`5_AKCSF-%+NN!UOZ"Y)DWE31JE -M`4\2MT:^:P<`7````%P````"````10``6%-S``!`$0``P*@!`<"H`0(!]`'T -M`$0&*7$>@-/1)."S```````````I("(@`````````#P````@``!`!@````&\ -M'Q7.MRI633P-=!B)Z>&TS1_ZHD\2MT8E?`<`N`$``+@!```"````10`!M%-T -M``!`$0``P*@!`<"H`0(!]`'T`:`'A7$>@-/1)."S```````````I("((```` -M`````9@A```@``!`!@````&\'Q7.MRI633P-=!B)Z>&TS1_ZHB(``'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``VGORFA<#-`SCNT\]A$&M -MZL%]'*0_@\0%>67*(33U*Z=FPQ!TR$RWW/,;P'XP7X8NR'X0VR/6B01M4F$U -ML[/D2[N>.G"OO]S_2AJG7HJ#9RF--5D^G)/?&3-ZRB'.)M5P1<_K-2P=IPU? -M/['/RJ;0AK.7*EYATVK\5\8@O3=\12XI```DDJ%>Y'!1TL%/JHDE/U"4>1-D -MC#&Z?Z/ED7(.??HL:L(I```<``!`!$JFD['*(8Y.=7TLFZ83(SR%;);L```` -M'```0`5_AKCSF-%+NN!UOZ"Y)DWE31JE`4\2MT8@-/1)."SI'TCFFL(S\$A -M("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,` -M``@#```"````"`0```(H``"(``(``-<-?LB^]*034@$4(;I3V-QPS;:=<;:V -M39P`A-'5N-7A+L^.3Z0!O>K%X&3G?CRQ?BHAX'H4D0$*]K*!.Y>&M+7H,."'+ -M7NOIM_BE7M:=_2SK7/"_/G?#1(,AJVD?:.(Y*#MJL-^#!.:?X%0A7B[)OG%Q/]^=4G$L,;KXN -M(KW"I&>XB(*`U[93K;-S0Y#.+=L)N>FNS!\A@A$&M:SYGDK5&^<"MSOPM2I+ -M['#$3<"F>=*4L>GB/7>MH##=:_W,D1P<2DQ=]\9KGT\2MT:;YP<`O````+P` -M```"````10``N%-X``!`$0``P*@!`<"H`0(!]`'T`*0&B7$>@-/1)."SI'TC -MFFL(S\$N(",@`````0```)PD``"`S>J!'F%1'D0`]DM&YHV'1G*\*HK08;FM -MFXSAW[8UJ%!)@-^)&,];+:J9R_B1CJ+XV;0%D-!!ODX[/MYWH%!"92PUBI1% -M47&[W.WFCT"E',HRJG0WWK,AVHEB9<;3WG9HUX";V/I:HVYX?+=WM@KX\BMC -M/ARHC.UW=)G3+4\2MT;:!0@`'`$``!P!```"````10`!&%-Y``!`$0``P*@! -M`<"H`0(!]`'T`00'Z7$>@-/1)."SI'TCFFL(S\$N("0(`````@```/PA``#@ -M.E+7ZD&!^_\MZ^?;GG"Q:G3GE#'8VV1F^VQJR3\4S3-XQGYR+X'9V=_?%EDV -M9/S;_F:V#"CM)/UDE;1Q0N'DG8`':,3OH"%QH\O?K"H@=/RMTC:'+,==X/3# -M*@@P9X-FKRW<832][(4B&M5Y`:)O]T;3MU*E,2G,\/:!K/Y5(H.?^*[HV-V0 -MX#5["47$_)[W=MI,P]"G\YO9F@.ITZ6/1PU&9.>2ASA;#)'5KPPN4(R%M7#O -M3:&Y+\A@[RKY*9*^=F;P!:0BJ(G#]AT62YWVGX"9K(/L[*]@ACN6^D\2MT:A -M$0@`_````/P````"````10``^%-Z``!`$0``P*@!`<"H`0(!]`'T`.0&R7$> -M@-/1)."SI'TCFFL(S\$N("0(`````P```-PA``#`BT\T<+:GB*/<.FXNQV

7*VXZJ$/L51B -MI`#4)R4VH&3RKQPW7".FM_3ZE4I1?I>"#^];*8LP8V-%V>D!ZD8W(5@3Z@E> -M,[[NB1?7YXMFD$EK'40&%>Y@%[PT5"\]DY/\4P``0!$``,"H`0'`J`$"`?0!]`!4!CEQ'H#3 -MT23@LZ1](YIK",_!+B`D(`````(```!,*0``,.A29%LQ,$WF)9\OZ:`C/FUD -M1T2SKM!\9X*H%4F!^76[Q[^.E5UB[$5:7/W8ZWHU@.2N7O,Y#!(! -M3%V%>M1@1^4S1TO&TGX6TT\2MT824P@`/`$``#P!```"````10`!.%-]``!` -M$0``P*@!`<"H`0(!]`'T`20'"7$>@-/1)."SI'TCFFL(S\$N("0(````!``` -M`1PA``$`[1=="0Y<,T\5Y/`/[&_U:_H:_K@CR;1LQ(+ -MKKP3O]-[^2()E?U6;'S"<#W^0HZ/*ALH`_SI_@QW;T#PFA$#BW4@Y3;6>J$% -MNN$@YZ^-9_&,$>@S(\2I6FUJ*G;#04QY73^KDBOMO93I;&J7=H<'A& -M=E<\N^AO!K^&3;3FX1JGRCD%%9%Y^$[\(KV_S\-0O_KI3Q*W1L=>"``<`0`` -M'`$```(```!%``$84WX``$`1``#`J`$!P*@!`@'T`?0!!`?I<1Z`T]$DX+.D -M?2.::PC/P2X@)`@````%````_"$``.!;C6M#3C%TIFCMR@5]OC;M:BM=2FYY -MGJQ)EA4MJV#>Y9E)4*\"4Z:1B+L=_TY3TDS?K;P?*0W7];L?2[/()*>GTA]W -MW8$4O5+XJ?7$:"W)6SE&O',PQJ(<%(C -MGJ=JH*AN_E(FL?VU!"A*7(\F3EC4KM28/=X65?C27,K!*KE'_S8\:B0J>,E2 -MD73\%".RQOVOH6WK!,UQDC2`3Q*W1BEN"`#L````[`````(```!%``#H4W\` -M`$`1``#`J`$!P*@!`@'T`?0`U`:Y<1Z`T]$DX+.D?2.::PC/P2X@)"`````$ -M````S"$``+"[BD*'*"14.I0^Z;F^HA[<;GK\Q"W7F%^=$6M.5+5I$*,5_QKM -M]_2^P'X5B&-5JEWQ9[^<`\2)F@+^*[88[R^_H[`XI?(6^?ZC<[/8SF^%6^4O -MG/=GH6WVIT:H;ZY4&@T/@RLX9TI@`BK!S?3M58,()\!GL49D4HP\TX) -M3Q*W1@Z1"`#L````[`````(```!%``#H4X```$`1``#`J`$!P*@!`@'T`?0` -MU`:Y<1Z`T]$DX+.D?2.::PC/P2X@)"`````%````S"$``+""&]$W*E"F#2,C -MX+")("V]^R02/XCR:)"G$>1>0FYL@E=6VO'9)'.=IPBCDH(TKBJSO"US.3&#'?8"K;%;)FYR"UY*/ZQT:,T7YIB/=*^+NN]Q34#C5(0R14J&%:?=(7FBO3Q*W1ERN"``\`0``/`$```(` -M``!%``$X4X$``$`1``#`J`$!P*@!`@'T`?0!)`<)<1Z`T]$DX+.D?2.::PC/ -MP2X@)`@````&```!'"$``0"\$U<[J!ZW8;EG^-:EC_PE_;.J>VRY?R(3:,;# -MYVM/ER[,^7S1\M?9$#4:=S!)LJ/K]*O$#80Y2]?HJ2CC6-*C!P'"V$B,@+B_ -M5,X=N\E(Z-EO3K0VN`!,Q*V -M)(7G[MF?PU@P'^W=#CP%*^_%FA8S=U;D7;WJ!/OTGY_"=?!V4BL;>Q01\#N/_;&VK;0['R[UZX"7Y -MM4,UW!!K)'F5@3S754=1;?Q050O;309I=X_Z.19,D/9':=$-'EP#2&+QP(UKZM6H8 -MH^EHMS3=:W4:J)].5YQ33(L#XI)$-G'F?[P@X;3_NW%;G)%@UUXE4 -MQW7%N7!6)NA'G=9F/`J"=`\:]#J0CH1-/$K=&[\D(`.P```#L```` -M`@```$4``.A3@P``0!$``,"H`0'`J`$"`?0!]`#4!KEQ'H#3T23@LZ1](YIK -M",_!+B`D(`````8```#,(0``L!,G^2RRAFQ\/UOB2.2#JZ+W0?W<^%2"WJOW -MK?KV`5CHF3*)0%>!0:L^Z<)5\3T-S[KLO(M7?\Z(0%JT\PRC1C:X8ZC3@=_0 -MZR_`+2QGH\H.)UB\PY6,]&L`$\[[3P%5&/BQ,5#,9GXLA":;L!!,:M;U0@0? -MDKEX8EN80UX%1`@-D,*&<]T(39URC7$)8)S.1G^KHDUL``2WH*PE,K'WU>WQ -M\.R@D9RBC@O%4EE/$K=&U.P(`.P```#L`````@```$4``.A3A```0!$``,"H -M`0'`J`$"`?0!]`#4!KEQ'H#3T23@LZ1](YIK",_!+B`D(`````<```#,(0`` -ML#$W@0BB[38C3F*%-/Z>H8)`-A](G`2=O)2B]-E(8H(@TF<6Q>5C6H69B/G\ -M_3]3NM>7H[[&`O/^5XKDNW?RU@CCSH&81NDR"&60.!`2#M+U9CX_6-=3W5&H -M%BXZ?7&60;^#=V0LU_9QM+GF3)X\.`5<].'*`:BK(Q/GQA)*R2BW')'QFA44 -M2YI'>TJY=R:WBKW=-$X*1*'?HA06>%M;7OUB&_BU2HJEO"1 -MU2%)<_[YE0%T+>R85MX=`W[^F_G"4T08YRWA1`*7UP(PDPL>N!5_;EZ17A5V -MF:/%O>&GI_N]"P.%#(RRW_RTU\GFNFKI=.HF5)Z -M$206_!CF=4);T< -M3Q*W1FI&"0!<`0``7`$```(```!%``%84X8``$`1``#`J`$!P*@!`@'T`?0! -M1`B -M\)T);S)@3_Y&?4?.&`.TR$!W;`1IZ#6'1:DOYV(W;;']&:F+[\X@F=>$TSRO -MJ0^S%@#*JS5$].FR9_1^)9NC9"2D,/K9C=W7*GZW0DZ32=A%S%7VEY/<+)VC -M39S.K2G_8[O@YS11:LV&J@%B[JG[$&1E)%I:\RR9<86%C0MUCAOS+>X(X'M: -M0,L0>\*_(O&F'E(9[?R>+SXM9QK`_`"--?\#3AG*-,\DYB[P>YAG*OD36*GA -M"H;WO_[*VWV>TK+BXVZLR?E1EH+TAD#GZ"A0<]KR<,*B8A11QWC!X?@8TCHL -MH9$"QC-:9.QRQ?_ZK>Z_*4_A)H0$2F10*+AQ2)*L'R368T]I"S/>.-?J91>8 -M&\$)\$\2MT;Z;`D`?````'P````"````10``>%.'``!`$0``P*@!`<"H`0(! -M]`'T`&0&2;T^R.???CWIAP[K26465=']%D;FXAD,5?@HS@*^`D7/GQZ4GS"_^&F -M)[1V,1*L1F'#NM)9195URX@)2``````````3````##9 -MVY^1;M0),2AF"N2D;X=,7J_G//4K*J<40B[:Q&0FKB#B`!H%#1K$ZDZN<$\2 -MMT9VB`D`;````&P````"````10``:%.)``!`$0``P*@!`<"H`0(!]`'T`%0& -M.;T^R.???CWIAP[K26465=JTZ-"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M5,.DH^QQT^'T<%T8O/#NXHH2#V8RC`OUSS_,7FI\#!S*K5&5[IG+"!O7D`5. -M)D,*-X&>[`O8D^*%%\F)*/.']38./*PI+OG; -M*%0^9C[BMU0\&<'O````'```0`6S;+I::7 -M5$54/I-P```````````I("(@`````````#P````@``!`!@````%>'@52##WM -M=\ZU*S.M2QRZ%,3*\$\2MT:,L`H`N`$``+@!```"````10`!M%.0``!`$0`` -MP*@!`<"H`0(!]`'T`:`'A>:75$54/I-P```````````I("((`````````9@A -M```@``!`!@````%>'@52##WM=\ZU*S.M2QRZ%,3*\"(``'@```!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``5,.DH^QQT^'T<%T8O/#NXHH2#V8R -MC`OUSS_,7FI\#!S*K5&5[IG+"!O7D`5.)D,*-X&>[`O8D^*%%\F)*/.']38. -M/*PI+OG;*%0^9C[BMU0\&<'O````'```0`6S -M;+I::75$54/I-PVRS@/U-7JZTA("(@```` -M`````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```" -M````"`0```(H``"(``(``$84=(H>9"X#/0'SK6_G7$$Y'R#%\(I%84+R%Y>P3N`4&RVT(9"S>8&&8.=,[U4@/&M>R,_]S'I# -MUI4P<>+A+QUZ,G.[;"J"LKF;?-!O[I0@81Z67M06C.L$G+V>7<(6T;+Q< -M*0``'```0`3@4".[57FN:U\-MZ\9]0# -M)KX5GW#\[>7;^E;#>N/"01/C3MKGH061,H:_&2KA)/[@@SO0H4$3H!5@V#K/ -MNH@-`BJ(L_'6R[1Z0=]L?K/U%Q2.<5R#9`SD`?S1F,+8=$SR"JL"[FN`')]? -M-K5L#R&%KJEF4N>(\%AJTH4<]$'H?X`IX5/ECO,!W]9(F5T"LR<&X30(\P*V -M/R_GWM#E0#G+YW\?V,'O:4NNZ%Z(5**2%4\2MT8/'`L`O````+P````"```` -M10``N%.3``!`$0``P*@!`<"H`0(!]`'T`*0&B>:75$54/I-PVRS@/U-7JZTN -M(",@`````0```)PD``"`.K^KXP6AZKP8>D6@^?9.H;I:P1)9Q-""/\'0R$F9 -M>^FC%K[1$2L"@W^`67&S```!ZJ&%<^F_X/GJ9R<\!$0E;&Q6AP>LKQ&]V%%1 -MY`7#B+H?BDJ92QJ\HL4-N\'8$"WR2>'02I$:](1(-\#Z\X)".F%X:J2JJFF_ -MJ$[/?T\2MT99.@L`'`$``!P!```"````10`!&%.4``!`$0``P*@!`<"H`0(! -M]`'T`00'Z>:75$54/I-PVRS@/U-7JZTN("0(`````@```/PA``#@0/.H'<`? -MCY1G,)V*(H($B3HR)X\01:=&B)`/F,JNQG,PKAZ8L>MP3",O/SPWT2J<0:O$ -MDO=\"N?M4IB\/47)AWH$='8A#UBG#F(C,&Y`:75$54/I-P -MVRS@/U-7JZTN("0@`````@```$PI```P7H;N\BF>(9>N1<=?IERD>@G11G`W -M/#%:BZ_SI4^R?LH;4"EG@Z9FH_4CC^U/$K=&VE`+`/P```#\`````@```$4` -M`/A3E@``0!$``,"H`0'`J`$"`?0!]`#D!LGFEU1%5#Z3<-LLX#]35ZNM+B`D -M"`````,```#<(0``P.6*QE@(M1*Z=D)V(:*/8A$1C]CK<9C3GE?I?H9;ZQZ& -MUJ_/B'F)"=D'*]7MR/]IA3)?PB]'-GY56UCF6ZD26\*;^/8L0T69Y]BX31#F -MD;2N+:AVEJ?:@AM1GW@R!ZXNQ/;^C@'SB?\RZ,M;F8W+]Q"T=\)[),#D!Z&Z -MPS]E2T2?,27!WG&/Q5F6V*UF(-9/BL+M73D9O;?4\R70<[%8&\L,\\-KB,5P -M,C,2A,*TX^)^$+3##ZA7(@J'"[PI3Q*W1H9L"P!L````;`````(```!%``!H -M4Y<``$`1``#`J`$!P*@!`@'T`?0`5`8YYI=4150^DW#;+.`_4U>KK2X@)"`` -M```#````3"D``##_ZX6,6T,!NQYEN@C+*;_WTL'7J%1(EX9AYCZ&:P\(JMBL -MUF)O_&Z`#R)R9$\2MT;GA@L`/`$``#P!```"````10`!.%.8``!`$0``P*@! -M`<"H`0(!]`'T`20'">:75$54/I-PVRS@/U-7JZTN("0(````!````1PA``$` -M6V(![]C+3;,L!57M8Q`R8R<>!]@'*+8!C_<-VX,ZW&-__X^F;,B!\Q080^DF -M8551<'?^?,6KJ? -M$XV1ZJ>33G`"+A*R\+)$H&&U>^?X50"8X(`LBW;\>S:*IDB6\:N'(+3>#.?( -M!X$!U3K]G(^@>*ONM?K]Q^=KESA -M<>$_"?->(T',G`$KE^^#F!2^")$[E,)+D^T.:I(HP"GLW/0:MAZ%$S20#B(8 -M5PM=IE'<3FJ>3^4<63LT2LZ]%NUQ"_E<521I3Q*W1I^3"P`<`0``'`$```(` -M``!%``$84YD``$`1``#`J`$!P*@!`@'T`?0!!`?IYI=4150^DW#;+.`_4U>K -MK2X@)`@````%````_"$``.#?N_Z2$4(B/XQN](XK%8`FR6NP]]:3/IWHJ+.( -MDW?WB1E"E+`*?[L"K8''\$7W\`U#3`,"EIV#J:U=Y[F56\B[^XI["`ER71)Z -MR,P(^*%OV0FEZFU8H8HE$GVO$*2C3XE5=,N8?YFRS?+XK&S989Z6O#DR7M7"?@-#,V_&D4LA!]^%/G@7- -MC41Y^K\^;3IF@[1K+I:D#"$P/T,3Z?=@7-5A^ELA60@O@=)4SHU$\AU(PUEU -M34+;+029>M;"GMLL3Q*W1B^C"P#L````[`````(```!%``#H4YH``$`1``#` -MJ`$!P*@!`@'T`?0`U`:YYI=4150^DW#;+.`_4U>KK2X@)"`````$````S"$` -M`+`U&Y,BFPCE^RAR'^'-"HF5]-:A>D-V6__U$7TRM::<'>VJF-^PFF0'-`[_ -MRL&MA*\BJ$^26NO*X*_0"6T44H7X6KCR8KY\DDR+MRI732U`;6KK3W2V!D#K -MZTY,W@`<,`>8+&9UE=)G/Z\/]9'/PLB?X^&X_7?$.EOA_-LKK2X@)"`````%````S"$``+!X$R+M(\D;T:#,D\2YX8)L -MI)'I4"R:C)XEB.YS]37"1[#6A9HE>^`"H]FQY\)YPS;\*J?J9F#E*#_J3T\783ON -M??,[Q)AM2487OE6\>RYF;*H.NK;;P+>.A7);*)SM=HVC[34:Z(XP`GW -MZ/4N4<:@?1,")D!,;/B7+WO2+F+@3Q*W1N+A"P`\`0``/`$```(```!%``$X -M4YP``$`1``#`J`$!P*@!`@'T`?0!)`<)YI=4150^DW#;+.`_4U>KK2X@)`@` -M```&```!'"$``0`WF$'Z:@%P5RPZ/4K)8ASJD6FSEZT3R^$B#X9KMHL+Q!.` -M]KS^N#K4D-X>A,/7-]JU)JH#'!WX9$'[+O#A?U\N&0CK@4(4%!+)9HLR"^-? -M#D2^_9D!68-3GFZ>J2>B\7I&_:[?*Y+-4EBRC>@DTY;0XYUF%"\*B7J/)OH@ -M3!++;/X8?QKL8L7HS>GN8(!_+P#I)B2(CG+BF[DED;W(I&*UC>2M4%'4D!@N -MU==5N_;[E'OKHW"2%W.)^L9-2.+\[B"P&)3SZU72[$9,/\O5SNAQ&S.T#9%R -MP8.V'L)JYV&9I+3ZWJX2YM[8Y#@O2]D?9%R>FW>2&8`QNV\Q\L1/$K=&Z^<+ -M`!P!```<`0```@```$4``1A3G0``0!$``,"H`0'`J`$"`?0!]`$$!^GFEU1% -M5#Z3<-LLX#]35ZNM+B`D"`````<```#\(0``X-'[Y=4>6WS-9072DF6!/"QY -M! -M^4?(!U,2RCJ=25?@R/S?KMF9*[`.B@P.@&XX\RY874)^S[E_?7#;:D"/(NSO -M2PW$%=D#OF.9VM7'#Z?'#D@IW?""P%5/$K=&=/X+`.P```#L`````@```$4` -M`.A3G@``0!$``,"H`0'`J`$"`?0!]`#4!KGFEU1%5#Z3<-LLX#]35ZNM+B`D -M(`````8```#,(0``L+-=:-<0*MF6PI-H,C-C`")F.&^U7/8!A\"1Z/4$3Z.P -MX;(>C/UDG4&B@TAQ:EF(C%3+&UY"\+]\-&NU)T9*3'!6MVTL+A8OM,%S[+<> -MS)JBOR7%*G4-%W1?85)9>((@WC/1I!N3K1K_BQC_@MKZE7=E[:=^E[JO;*7: -M^MXN.?,B'*GX83J8L_\]A0U/5DG_CXCK67QG4O!J(X+QZ'.`+(Y(XUC* -MH2Q6XH]/$K=&/"`,`.P```#L`````@```$4``.A3H0``0!$``,"H`0'`J`$" -M`?0!]`#4!KGFEU1%5#Z3<-LLX#]35ZNM+B`D(`````<```#,(0``L,='?WY9 -MBQK*Y*C>-.6$G/M;9%A_%EH2 -M;>K^W^I5TL>89'(]X^@%-050RW<_^)W]XJ,-<6[[.2*-]1J -MTLRM-79E!ABYO=$(_BG>\^/5HI_*LKJ(%XU7J(X?#!^OQ8@,@X3J1.TIU=>< -MU>^^`9$?.3%M8A`&(%B3,2T"L>:GAXIAXAN!"O6B4K,0#BE_*/A\_JT_ -M26=*?ZEI=4S-,782L"`-LD4&1@$"[BJ;"5A1'*T:$>2%QX^ -MT@\N#O*PK)$,:!H"C:Z)U3^M7$)KXO^%!8\_`^`0ZJK=?W.D?0X0E29VJF83/!IEU04W8MJB41?T3.RHO6=/0S7GY]-U^U%:095O[,I8 -M`O"@'.(H8KCA/`)6.KK2X@)"`````(```!/"$``2#IOY+,2E\=U9Z-BW]6OWYY -MF6/`?PU=S;5(82R^),-:)(!6_`7[_)>8)SG3@]^O]"NDE6>&KBL6WXTZ>_*> -M-=.)EIV@[74"!JS;HSGR*Z[_C!+O?CHR:-!+ZA)P,#AW!(RIY9>,Z?8*-4VH -MPQEC:\VKV7)LR0:IGZ?*SX`A8;4;G+VP]*\=IEM2[]'5%O2,[4\2 -MMT;[H@P`?````'P````"````10``>%.E``!`$0``P*@!`<"H`0(!]`'T`&0& -M24I/(Q;6AST44=U!Y4FZ]G@N("4(`````````%PJ``!`YPS%X8PFF*].=XCX -M58H#4XTRPH;PJW'$J(SPP<7;_NWF`<>/VJH-"'==$?WLBW[SG7S8[A8DL_<$ -MMYKC3Q*W1I&N#`!L````;`````(```!%``!H4Z8``$`1``#`J`$!P*@!`@'T -M`?0`5`8Y2D\C%M:'/111W4'E2;KV>"X@)2``````````3````###(@U,4/G_ -M6:C6@4_#;@L=%WB17T_SL$@X5)NO9X -M+B`E(`````$```!,````,$M`-0LBXVTR2Z>O6^66@E^D(Y6/Z82"@9I@Q>`A -M;3F\'$VDJ"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``Y.K8H_VY -MNY088BM+EPW;HBU$7`U&"+#F%*$*<&^CEGU,"U2MMOOG#6+]1%%@$7I.`(9S?F`W@^Y<*GL]QQ<9B3[FRT?1OSJ^4:-.46NW(K<# -M-4;40%KRT0J==SE"MY+(O)=+>GQJMZ^'=B=*_':AL@XI```D'$,[S)=63F`? -M?R'-@$*.M>"\VBAV6WYEGE,6B'R0>O`I```<``!`!#]SE*Z<<64(\EIU%@$7I.`(9S?F`W@^Y< -M*GL]QQ<9B3[FRT?1OSJ^4:-.46NW(K<#-4;40%KRT0J==SE"MY+(O)=+>GQJ -MMZ^'=B=*_':AL@XI```D'$,[S)=63F`??R'-@$*.M>"\VBAV6WYEGE,6B'R0 -M>O`I```<``!`!#]SE*Z<<64(\EIUJM_BB7>VH!`'E -M:\D.MIZ=50]GO\DG!;(XSD%0+;',&%LF(,3"%!Z*%+;]7^!JBKI[5\#8A&5Y -M.:]B*0``))8'$**#@B`S^*KH_TE=^/$\CP?):^J_Y3(V54Z1=C%B*0``'``` -M0`283#B%\PW.5F&::6,AYS%MS0OW8````!P``$`%\]89%;=K2H,=#)SH_#H8 -M:"4L4^M/$K=&OC<.``P!```,`0```@```$4``0A3K0``0!$``,"H`0'`J`$" -M`?0!]`#T!]F5)`I@IF?@OZO8KB$<_[':+B`C"`````$```#L(P``T*56Q(L6 -M/E[ZFAF5)3R*R@;^EM3OJ2I`LOGV^!!(&:BOOH#9.S4+)G`=:%?0Z\\R_7_; -ML0+Y7B-C52]@3.:RTC<0J&2(0',"]*#M%>GO@\D33(5^T!'E=O#5K^_@*T%N -M$*L7HA'T23%;/'4?#]?*&P)?&$NY\@K%'O/#P8P1B`>"A%DNF -MIMH<"NT"YH/IZ;X\L(7>TT_?3D\2MT:L4`X`O````+P````"````10``N%.N -M``!`$0``P*@!`<"H`0(!]`'T`*0&B94D"F"F9^"_J]BN(1S_L=HN(",@```` -M`0```)PD``"`D0%`RR=5&-P9JP%@9;F[_Q*2HG=X%=('Y`9)DN$8"\O3_\GQ -M+4\]5`7#@ZI.(P,%!W.8LH];02;_Q6!*%7/LI -M;>.L^V`\\/&H[(LKG:ACI$4EH;:WY2F/!O70/D+_/VVMVEB&=)'OD)WZ05G% -M5*$5B\9\"^[F`Q9YBN<"/KF2>;KZI*%XC=C=A\?4\[]W59GED!$W%$20`(DY -MH7G6:_#OHP&3\5DPET0HH\D[QFDM.PO0&OUU^\F(M:D8RJC[>:*5M_4VXX;L -M'3HACL^OS"H!8OD13C]369IJ^'A#9:4Q -MA!R7;L*7WTA'K$$@A2KJ%OV@K6N'A'5+!/._E4\2MT;$@@X`;````&P````" -M````10``:%.P``!`$0``P*@!`<"H`0(!]`'T`%0&.94D"F"F9^"_J]BN(1S_ -ML=HN("0@`````@```$PI```P2*!;S\W":*7U(3UWTP9&AJE;71C`$_=DZOIA -MSP?:=Q]3K$@5BL5&>;?&JTU/$K=&(88.`/P```#\`````@```$4``/A3L0`` -M0!$``,"H`0'`J`$"`?0!]`#D!LF5)`I@IF?@OZO8KB$<_[':+B`D"`````,` -M``#<(0``P$$S3!XE'>*V(@:7.`<521TCW673M#Z`MOTS$OH>*W!X^$SI[4(6 -M?;8E3QG&1O(SKA3;:LM,<"Z]NE^!2&OPE-R1)!XHR(/OW`$H,7"@=C-GM/?. -ME[CV]U;SRH"(-L,,X+874!>#F`"D5+J_E(:6HG0T&OTCR=28O&Z-(#5(*;ZT -MQ6<4WF*9;#]/G!QE?79^5W-JIL*H6N:*3)51*R[%CS,* -M[(&41_=ZM[L>Y-DP?U$[3Q*W1O>@#@!L````;`````(```!%``!H4[(``$`1 -M``#`J`$!P*@!`@'T`?0`5`8YE20*8*9GX+^KV*XA'/^QVBX@)"`````#```` -M3"D``#`J40=PAZ`_5B($7'XMF']'(VZ3P@G_FU1K< -M!:E4KD\2MT:^OPX`/`$``#P!```"````10`!.%.S``!`$0``P*@!`<"H`0(! -M]`'T`20'"94D"F"F9^"_J]BN(1S_L=HN("0(````!````1PA``$`V&'6?[;L -MNB,;07:O`,7CEAH*D'`/X%N -M(TM.+$BXOF7+RV$A\L*N0=[\NBZ%;$>4D<*7&]*Z?DXND]>4PIGD9^67I!IC -MZ3./1.]#P-&&HB.;3:?](*I-F+\^VC`0'5FZQUMF$BO2GL8?G'CVN9?%?"ZIDU -M%,=P.\.C8#9HJ%.ODTIVU;LMFB\E3Q*W1M++#@`<`0``'`$```(```!%``$8 -M4[0``$`1``#`J`$!P*@!`@'T`?0!!`?IE20*8*9GX+^KV*XA'/^QVBX@)`@` -M```%````_"$``."CV>5Z8Z?YT035W-MWG;'IFGG""\;LVLW;H\5_'-EX\[,^ -MB7&:46O'T>8"]T7+*X2,33F6%O-'@EQC+LU#_]<%\"\DZ/:NE'+M;R(:VP"9 -M1D(:GO9^KE]DZ6+>2ZUSG,\#U>-/W+9Z&OA?R$D6<7>Z4N3U:79LU[+*@*_RSF1L\%U>:4:1IG<<. -M4'I7^)K+3Q*W1@G;#@#L````[`````(```!%``#H4[4``$`1``#`J`$!P*@! -M`@'T`?0`U`:YE20*8*9GX+^KV*XA'/^QVBX@)"`````$````S"$``+!%'V%R -M,X;^E_MO@J+CJZ!QBR`\LN*"PC3JG<$U@2X,8?OPXW01J\3B]^=X($(O(4&X -M`:U33A0);Y1'1KN*1@H)ZRJ.B072G_O&N_:(H@"R!DE.I#7LH"7]2N<(PU7T -MW1&/HZGNJSQ[RPU!!I*3E20H&$_FD&!K55%AM&B=NE^#O;/12'R_?DI?9]*? -M#UDXPUEG\2PP0HE`DME\ECI5H-@.*%@GD?7#D6-@G0SE3Q*W1M7\#@#L```` -M[`````(```!%``#H4[8``$`1``#`J`$!P*@!`@'T`?0`U`:YE20*8*9GX+^K -MV*XA'/^QVBX@)"`````%````S"$``+!(+32U:YCQ@OO/+W3IE542`_Q,G2:< -MN&G@IRR49TMWFH0_+0032?=@(]?V3;T6MI@S)+GV?ZL28]/0L=4%&B1(3^J\ -M)M^`*@2>@9]-B3#1%,[3:H'>^/L-I%"KCF,-:,,(\NF%Z7Y(/%#L)YHY\]`> -M+SJ,SMAQX",ZQ)L^_H!C*+"NE<.?IY:*56])D%FV"!\)7LNVU]S3=MEVO\O8 -M^\Q6=_T%A&L/);[J>^K13Q*W1CP:#P`\`0``/`$```(```!%``$X4[<``$`1 -M``#`J`$!P*@!`@'T`?0!)`<)E20*8*9GX+^KV*XA'/^QVBX@)`@````&```! -M'"$``0"\QH;2[H">_[=+5NA0R%./IG):(U[ZZ1A*2EPMA@^48R#PI-=+>K.> -MU'"^(U_ZP8'J_*D"V&R!`N=7?72,(Q*?I.I?F3@%^Y(P%JXI77]RHRYPH3DC -M^KC)6DFXZ>3UM>3WOA>2,/(HUS\0D.Z@1#D:7)6H>"E1?5^7>A=>Q!EI"%-( -M'N?,\2N0'O"N*6^*&A;PLM3HOV[QMCFG56?UB+ZV`[RBA_/2!K00S@G+-$7D -M#@E98NZ,.V.#>UX?-GX:?O18^U/2E9=%?UD/0T*[3KGJ/'MVY1[_SCA%(E^' -M7[2HL3B8%C2+TGB5,08,-HXRR,2?2E]M`&I%<.5>U;]/$K=&328/`!P!```< -M`0```@```$4``1A3N```0!$``,"H`0'`J`$"`?0!]`$$!^F5)`I@IF?@OZO8 -MKB$<_[':+B`D"`````<```#\(0``X"=TRNR:@ALO1B2\>V(V:H.;:'90EH'\ -M+G?&/:*P!&5G@WS6]F?8%U#Q:J4HB^G@IC -M;EMM.'`-'O/CSI&8U3'A2BT/3Z?KMN#"$(J)-LC`V`+;[6^7_?+"=![@MB9P -M^S`(E\"6G4:"SCSZU`3;`.$=G3QE4%\_C!/I=P["*B5O@)+*7Y6?PQR6HSA&),$ -M#53J3(,79GD6;DBRL+3;^\1\B9JR[[+([.0M"#-OC@(\AHZ\%E"33V!CJZK< -M8T@P4;(4^`R?6:#@#&1BX@U4:!!!PT>$Q7)TJ=7T9EE2+;SK0W?JQZ`2*/90 -M$K=&E1<``.P```#L`````@```$4``.A3N@``0!$``,"H`0'`J`$"`?0!]`#4 -M!KF5)`I@IF?@OZO8KB$<_[':+B`D(`````<```#,(0``L&K71#6/=$,VP3"R -MNL"D.UM60"XSR.G93U(J+`%D^:TVJU'*PLR2Z6W=-]D.@[#8)`QL`W\-VD00 -M]Y)N=`6F49#/KN^(\Z%U565-GFVV,9T@K6:16H?7=2;7@V[#6V$/0$[R@"-6 -M(5D&A""T_0XKBH$A;]=CGMT -M"\"LO^MWSC.4$6BC(K[1,VWB2JV'A?P>,(G0[BRPI]?ZSSW*!M'N1US%)]=) -M^VHCT+28TD-%O_&?] -MDDQ8O47.U5VH/7`+&!LH@V^CL#4>FS$J`_!>!%@5H(_2!)[O85)F-!J9*LUY,=7OQ%#X -ML)6:#A7$SH=VJ53[-P9@J5(&VM@Y4,?P"C-$.C7`"D>24A0,R!UM)\6B**!* -MY]3O0-?QHY6=U9U1=_N(E7N-UJR%&!R,&9U]RV\RQ0$6T'\@=G?<(07%(K+# -MX_PCV48?-[8H-I*=F,B8!`B.:X-#G]/X"1['"V""QCB!4!*W1J5Q``!<`0`` -M7`$```(```!%``%84[X``$`1``#`J`$!P*@!`@'T`?0!1`T#S[S6G&.Z7>5;-_S:D?,1EA^*S^9/'& -MU0U)2TPP8`,!/SA0S/09X>+-T8`D/MG]&NO32K$U`2MT;,F``` -M?````'P````"````10``>%._``!`$0``P*@!`<"H`0(!]`'T`&0&2:YWDJI( -MS$J<6*,:0S=N1`8N("4(`````````%PJ``!`2JDC,2IQ8HQI#-VY$!BX@)2``````````3````#!?OZ,QLX-BS=$K`@"P^N;\C -M<^]1&E9*<36MU,ORVX[9A+&,8-%0$K=&3,```&P```!L`````@```$4``&A3 -MP@``0!$``,"H`0'`J`$"`?0!]`!4!CFN=Y*J2,Q*G%BC&D,W;D0&+B`E(``` -M``$```!,````,,'674R:#S0+T5>O+)5._ARF!&6EN8,2\/.3,N%P>T<53%PN -M`E)+C5K\=REQ4!*W1LN[`0"8`0``F`$```(```!%``&44\,``$`1``#`J`$! -MP*@!`@'T`?0!@`=E8@`KP'BG%P<``````````"$@(@@````````!>"(``'@` -M``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``A13.HJSO_E+@LX,XQ."HMG.>RA->50;R1F2\"BBL;8[Y$W7;TM33*>%NV$).E5]5$M@ -M?Z-9,JJ\ARD*CYDM!U8;J_QM2,I```D%)]9358-;)"S:K+((#D^ -MP5VHD]]&6H!I&&JW -M````'```0`4_-JG7,.:G.#6#^>%13%`2MT:LRP$`7````%P````" -M````10``6%/$``!`$0``P*@!`<"H`0(!]`'T`$0&*6(`*\!XIQ<'```````` -M```I("(@`````````#P````@``!`!@````%"#O'+\.TK"KX0KBT9P5[9LO`" -MSE`2MT8ZVP$`N`$``+@!```"````10`!M%/%``!`$0``P*@!`<"H`0(!]`'T -M`:`'A6(`*\!XIQ<'```````````I("((`````````9@A```@``!`!@````%" -M#O'+\.TK"KX0KBT9P5[9LO`"SB(``'@```!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``A13.HJSO_E+@LX,XQ."HMG.>RA->50;R1F2\"BBL;8[Y$W7;TM33*>%NV$).E5]5$M@?Z-9,JJ\ARD*CYDM!U8 -M;J_QM2,I```D%)]9358-;)"S:K+((#D^P5VHD]]&6H!I&&JW````'```0`4_-JG7,.:G.#6#^>%13%`2MT:4_P$`4`$``%`!```"````10`!3%/&``!`$0``P*@!`<"H -M`0(!]`'T`3@''6(`*\!XIQ<';>&Y?P*E"J`A("(@`````````3`B```P```` -M+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"( -M``(``)H5<^UR+8B_$UF"2;S+6D^A`/0OC7I7JJW99.8DO.#;>QHN9R.*<%&2 -ME)Z-I..H4I(20YY7,J(PJDRB[^ZG`Q\LRA_K19H"X[Z5;1%=L4\(A#]3#Z1G -M`NZ'Y8VUT,W#FV`0IQ;,[_P*]G;,DH-X,`KD*<7!VWAN7\"I0J@+B`C"`````$```#L(P``T*;F!S3^L.$&2X&/ -MI0Y5S3<3)O/BI2!"`:\8)$8V9QT4N<`?`#LI`L]KG/0TH=/"\];8KL@2*-R8 -MY!55)LQURU=!?$G+&4YU0MXJ9[`C&'-NJYO,.T@N*^!YE*,)DX$&4+7GA#=)@FS$UH'7`]\'?<$^ -M`A`<'9`*O69,U4FB!8OI8Y3>Q]E&;JO%6Z&Y?P*E"J`N(",@`````0```)PD -M``"`239[_;-(&DA\FKPN6SF9E^T_L>?E?ALX0-D%R:1H'N*>O@)+'-(M'?V; -MW(7'B8)N"F=PT@>%^'@O]UC.)@SYPE]WI=;*A4;^S<0Q5+NW"\[<4:=?"_?% -M`L8I;8]+2F0A.&5Y"#561_`8<`!C;W\[9_9.WC)]SWI!;)7@Y5`2MT;%8P(` -M'`$``!P!```"````10`!&%/)``!`$0``P*@!`<"H`0(!]`'T`00'Z6(`*\!X -MIQ<';>&Y?P*E"J`N("0(`````@```/PA``#@HX,`>/Y&<,`XQ\WJOH3[^E-3 -MU,)T*G1QNCWJE\*Q=(=C(I*W`8>;?E"J-!YP@_IPA:[$OA()C6BV:'&DU[], -MD8J8VPH^[0>-@?L?3@X_IH^93!9&U7!WM8F=V96YV7;I%"-B41^Y_.5N)Y)M -MZDWBD+`QA8O/W9!:AQE7X4&JJ0KP_I#[?O3VC#\Q8BN^E9//@CD,L,N8+^3/ -MLL@)DWBN.]IH+_9Y,H0$>G@-`-[]VO1I43-A=$DD-%IU8=*"+*F/M(*(0T31 -MOXM$%1^H.6?#$P@:H"D3ZX2P9]<@B%`2MT;W;@(`_````/P````"````10`` -M^%/*``!`$0``P*@!`<"H`0(!]`'T`.0&R6(`*\!XIQ<';>&Y?P*E"J`N("0( -M`````P```-PA``#`)N/EF_O(";E.X[K2/7<+L/`>'C`-/OD0U)J@Y=M^Q^';YU-YKK9!`[VZ?H-]5VD:U1=&>;"I*A"9-&S#NV;Z@._T([T>F3CQ0(8-W0;67^SEB8J?, -MH/I!EWLSOMN8EQ6@>2SX,8?+]J;:J&;UR/`WC>J4,Q_=AE,9A@*OG]1^HVM_ -M<'0N83CS%DSGC8IY28L42"#;6%Q0$K=&S'D"`&P```!L`````@```$4``&A3 -MRP``0!$``,"H`0'`J`$"`?0!]`!4!CEB`"O`>*<7!VWAN7\"I0J@+B`D(``` -M``(```!,*0``,"([%@]']X9R-B-*CO0_HZ._&*[9Q1"U:3<8!$>C.>35='P_ -MP#197T0C5?XT4!*W1@^6`@!L````;`````(```!%``!H4\P``$`1``#`J`$! -MP*@!`@'T`?0`5`8Y8@`KP'BG%P=MX;E_`J4*H"X@)"`````#````3"D``#!C -M$BJF.,]>"W2J)0R=!:SHFUYD2::$@O]BPUKBW-3)+U`2 -MMT8JL0(`/`$``#P!```"````10`!.%/-``!`$0``P*@!`<"H`0(!]`'T`20' -M"6(`*\!XIQ<';>&Y?P*E"J`N("0(````!````1PA``$`>Y',-OY#*7<%:YER -MHI35= -M8)Y4+GMGP5%4,T;3413P7)D)M"E_7W8H\+>"J-PVF3"5Y0C%7U),#PT -M!9AN(0_Y"7UXTIA=%YM5E]8*`O.>$D8Y:NJG1E30]S-Q%N)Z!AZK,<$)PXZ_ -MI^=(8Y%S@X/SP.XHX@SBFM-O'04T65H(=(RC;B<^)Y\P=$>F=L6W@KE*&IA" -MO:\P-0S2W7'CE6>JC6K\8@>YERD>IX(V>)XF"K6W$WPENBE`(?X+ -ME]VX-!M7:9E5^L0'T"QQN`%?U+DSD<%D-AJ3P]+_'??SF8X+2\-Y84F[3)A0 -MQAB=I@=].=@#2RWCW*,`P -M`)O$K7WN%R]9#]@A-]@IP$W)"7E-0*'XX -MR'VSK1HI41/TOJ$IQFY^C5M;]9>!H)G>LP?/R3<"?&OOK$7)L',3VV%(;%XE -M4!*W1HW,`@#L````[`````(```!%``#H4\\``$`1``#`J`$!P*@!`@'T`?0` -MU`:Y8@`KP'BG%P=MX;E_`J4*H"X@)"`````$````S"$``+#15=8&E\3X&T_B -M`3"],T^P;BW=QK!86+!)DQ:?Z&2MOO6+A:EUWX1N0J1SBTO;Y(^B-R""65QO -M,,G!4$*Q9; -MV:Y0,D?THT2>*5+TZU29S2I2E[F#N,SZR<;P*'S_E^W[,4?D+IZ[(&IJ`/?7 -M/S/=;@ZRY>4A6>._.P92.2QTQWU3'",T=8P?87AI5WZ\?3WUU7K_=[VCPK#C -MT\ML4=(S'WN>4!*W1OD+`P`\`0``/`$```(```!%``$X4]$``$`1``#`J`$! -MP*@!`@'T`?0!)`<)8@`KP'BG%P=MX;E_`J4*H"X@)`@````&```!'"$``0"* -M_D2JD]#%1@>.!\X"6/@X#C)(>>HZ]C5O?C2#$;]E)2--N]KHL>,(VG0\B]K0 -MRIP__T+N@:1$8L1[8!3S/J.H$6CA2-ZT$$JN'##<5]U%RVC<+HDISA7M"4HN -M^Q`FQ^U_4*-6+.YS;5-,:C -M0(QK_9S]A[+O&!QG5.:3L4]]G.AAN]B3]+<4HH*[,`R6#I0SNU3=8LRCO2#ED -MOZIN>361[=^H79TI+8BFQNB?`ZJNU&,I,?U0$K=&#A@#`!P!```<`0```@`` -M`$4``1A3T@``0!$``,"H`0'`J`$"`?0!]`$$!^EB`"O`>*<7!VWAN7\"I0J@ -M+B`D"`````<```#\(0``X.')IBU_4F9&4J0K>[(AX+GBOS9O!T)$'\80#F1_ -M8>Y>(H#=@G\R1?XAA9<&U%VS*\2LHMI'AY44NU%>F`>RN4 -MKY*`25.668C>GQ]HG8R*=BM*3MW=JVU>?>U@K/^)*$(`NR[X9I-6@@\5:V5_ -MUXON7[!,>[U>@\ST>=`^BH9-UGK\(31G,('BNBF8;)_A^-)V(49K3M-.93\* -M).A[(&V6^0ZVX5$8I+*,M/BND_-:9M&2JFO--DC%*[E$QU?D21]$-V%C7_#. -MZ4:=!2P.2DFF?VA0$K=&*<7!VWAN7\"I0J@+B`D(`````8```#,(0`` -ML)/IT$F+.J?&;+G<5:%M,K1_"P@M\,3\/M$K8X>.RIP:G18=H!*<>.N)42`R -MFA,I]:#Z^H3K./]L;I_:\+395W'F%&^7FT2&ST!-2Q>\HBX_IB?4D)@H$LW3 -M*E<$EC^2+>@OLH:-R#<;+Z)@++QY6,H)V22:;JGP/V'!L[@?SH%.XK42SIEC -MA0*<7!VWAN7\"I0J@+B`D(`````<```#,(0``L#6R\[#:HS\YC,1]^>+#+36` -MY"K#;G'5)5WZ(,XE1T1<@T*C4S92%\TE%/=\48GF?=H-5\DL*8$BGYQKI@5[ -M)M@=HY*//O1MZD5LY(7#B;,448JC]3(--%1`$>+R>9F[`>T#OC8O))HHLNW( -M`6[XOI%!]^%OMI[Y%ZEP^Y;VIRN"%QL[OD=0$K=&&G`#`(P!``",`0```@```$4``8A3 -MU0``0!$``,"H`0'`J`$"`?0!]`%T!UEB`"O`>*<7!VWAN7\"I0J@+B`D"``` -M``@```%L(0`!4(H:T-\W-C8^,/)!6!.?_Z4%Z%P*W88I7GHQ"J!AZ$F*LXG] -MKO,WEOYK^?;UR\,9&+/1?6V24.'$WQYFV"['!_N8V;D"TY=4-P>!0`UY6C,2 -MVA]#LD@%8[P%R6JXXR,^=/H\NS.3#LA(`J]H*11U -MXC(4%W!X;MH98K[4Y2E?$202WDN@F<4]8'3(0D?3_T?SE+E4,>!.L1PA(0K9 -M,A&?X@5#WN<,$A`'A4/BJ5Y)3?.=1/M;>,1=.I')Y289@&]%_0V7:DQG0F@Z -M4K(CWXKWLW.T"'/BBP"_U,90+H:.4:6C*8$/UZX_Q^=:AAJHYFBFMIWS[YM' -M4\Y_`.\U'F\&X>0[E>9U.NVS?$M#"(@.$%M6Q-[9O6Z[G;AV,,7FEM:5XKQ? -M79[N/I2D<$N-5$ADL."ADQ&0`4!9$'_!F8PQ4!*W1C2D`P!<`0``7`$```(` -M``!%``%84]8``$`1``#`J`$!P*@!`@'T`?0!1`YA?KWQM>CZU4TWX67N`YG7E=5 -M;@"ZLY1,XQ&1W15`2MT8#RP,`?````'P` -M```"````10``>%/7``!`$0``P*@!`<"H`0(!]`'T`&0&26/"@BU\FIO'\6,% -M66];MI0N("4(`````````%PJ``!`I#A#40P9S[\"[`?>=0MI7\9B1"N-@=Q% -M;6=",I9'HQ/JU,UX:9#I[^H8[\O&E9!]O-?]OE2+>RW8XZ'O4!*W1G#6`P!L -M````;`````(```!%``!H4]@``$`1``#`J`$!P*@!`@'T`?0`5`8Y8\*"+7R: -MF\?Q8P59;UNVE"X@)2``````````3````#`:&=]9 -MNO`%$3$1.5'-,25,@EG![^2PW<=^?TB>J%`2MT8LY@,`;````&P````"```` -M10``:%/;``!`$0``P*@!`<"H`0(!]`'T`%0&.6/"@BU\FIO'\6,%66];MI0N -M("4(`````0```$PJ```P>7"$30I%WE=E#HC#"F%.=%B;#&&@HA$/!AW2"SIK -M!7'EJXJXP.K@S)J?D"M0$K=&1_,#`&P```!L`````@```$4``&A3W```0!$` -M`,"H`0'`J`$"`?0!]`!4!CECPH(M?)J;Q_%C!5EO6[:4+B`E(`````$```!, -M````,.6'.7W=X2`@,PALYKT[(FU<_I?IQ(LF`[FH'X0\XC$ANMGV*$^>0X"? -M/?U$4!*W1IKO!`"8`0``F`$```(```!%``&44]X``$`1``#`J`$!P*@!`@'T -M`?0!@`=E8KMZF;L4_/,``````````"$@(@@````````!>"(``'@```!T`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``D6H^(?'2G0$%YK_3TC\?M$);E'-S]*_RR'GQ*I3FJ7F -M>F0>D:R^.L>`U/`D%!*ILT* -M0&OSCBDEWEZ>/N7,A+83ZQ%,Q_(I```DL8YY",80]RX)3I2*=X)2!Q=G",FP -M9I$K]-0XNH"4*3,I```<``!`!/YIF[%/SS```````````I("(@ -M`````````#P````@``!`!@````&BT/3$2.$Y,T5=4S<*ONB#SC<^\U`2MT9# -M#@4`N`$``+@!```"````10`!M%/@``!`$0``P*@!`<"H`0(!]`'T`:`'A6*[ -M>IF[%/SS```````````I("((`````````9@A```@``!`!@````&BT/3$2.$Y -M,T5=4S<*ONB#SC<^\R(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``D6H^(?'2G0$ -M%YK_3TC\?M$);E'-S]*_RR'GQ*I3FJ7F>F0>D:R^.L>`U/`D%!*ILT*0&OSCBDEWEZ>/N7,A+83ZQ%,Q_(I -M```DL8YY",80]RX)3I2*=X)2!Q=G",FP9I$K]-0XNH"4*3,I```<``!`!/Y< -MM[_F+46'4TP_B`Y\U%KSZ$*9````'```0`49R55[(K4A\XH?DI(\!?.!;^*N -MH%`2MT8\,P4`4`$``%`!```"````10`!3%/A``!`$0``P*@!`<"H`0(!]`'T -M`3@''6*[>IF[%/SSW$O,Q`FAGYPA("(@`````````3`B```P````+`$!``0# -M```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``+'? -M2JO@#;V(KB;7()AFHOL/%2'8FEH[@@3USR=F_E5_P(8)C0$RFC)YFTQSXMY) -MD4`,H_)=_E,]ZP)%HUNU>.@4#JQO([43YD]032+]P/W!D49].L7CH/=Y_FYH -MUZ[G8O1)UK2C'6V[B"%J.X-X-E8AUV3R=GA8[X4G!RI68$'=*0``)#KG*]E. -M+\@CJ-MX7Y>)F24KE<"%;HM[AB`"V5).GH!^*0``'```0`36>W7OE'72C!K4 -M+E$26T1NE552&````!P``$`%3<>[Q2Y',N*>C%*CY8Q+V2\W=[!0$K=&`V(% -M``P!```,`0```@```$4``0A3X@``0!$``,"H`0'`J`$"`?0!]`#T!]EBNWJ9 -MNQ3\\]Q+S,0)H9^<+B`C"`````$```#L(P``T(.+G5#TH$[MPIQGLW,MU7S/ -M5\@>1+=9CD/5>8R35T7K'>^&B'YC&W.!W\7@@`&PGK\/71H'(%%*2@`_F<6W -M'1#\HG^_V3RZBXC5Y9=N;>$:)3$P!QF[?S]O36D[< -MC6UG'A5E(CWFM#0'FO2%'E,34R<9(M_CQD^\5>-(IL$LT,"5DS*I>57Z5D3E -M(KQ/ZU9T0&%RV2RO\(GAZ.V.+M>TCAE[+5TU856MO2[P?I'E10I`??DV#*F_ -M3E@EI(0BW%`2MT;(>@4`O````+P````"````10``N%/C``!`$0``P*@!`<"H -M`0(!]`'T`*0&B6*[>IF[%/SSW$O,Q`FAGYPN(",@`````0```)PD``"`J22* -M.V=%#`5=L_XFXZ@C=8_N@0W65CZY]_)HVM,'5-I_LI;C&Z+Q'I4MXM%!X0_? -M.M!(D$D;X$KQFR/T]=H9QY/Q$I:EP(:A%#L([\0IS&+_U2U!CM"O%'0:O._] -MG9VO&_PI!H'@./G\!LW1]#91[5NI%56-,'>?5C0/&U`2MT:=F04`'`$``!P! -M```"````10`!&%/D``!`$0``P*@!`<"H`0(!]`'T`00'Z6*[>IF[%/SSW$O, -MQ`FAGYPN("0(`````@```/PA``#@X:#-N:0GR(DV<]:"7ISFM$@EZ(YIR7>G -MU6%PK"!3,96GS?VL<&4X]IP.3*-HIZ#NL^IY\?(BZZP"0"9NL8]GQZ.T*LUC -M89.B!57.HE[/(0=6'_ZSRE->;3N%6M!=E@W#,=UCW*"JQ"I?%H7<$C*ELVWX -M3)OH]D.3%?[LESX<4(,K[FO]Z%=V90"2$#EQ -M">QHW>.T-NT.',8'SX;RJE`2MT;+I`4`_````/P````"````10``^%/E``!` -M$0``P*@!`<"H`0(!]`'T`.0&R6*[>IF[%/SSW$O,Q`FAGYPN("0(`````P`` -M`-PA``#`LU@86LO#XK6_-]#ZEZ/E<8E8?..ENOZCW#]5#HN-%`P`SX\W*R8T%Y8O76-&<@RL029U1.QW2T&=J;(P$G9VQ]8FM#)U-FT-#2ZVR+='@89)1\@ -M!\CV??K"4C+P;10P"Q%0$K=&>Z\%`&P```!L`````@```$4``&A3Y@``0!$` -M`,"H`0'`J`$"`?0!]`!4!CEBNWJ9NQ3\\]Q+S,0)H9^<+B`D(`````(```!, -M*0``,+#L"PO837R+.O=/4,4XSL['_<[4V8#78U-LR"`A;HU"^"R6=/\`CV+" -M=Q,U4!*W1O_)!0!L````;`````(```!%``!H4^<``$`1``#`J`$!P*@!`@'T -M`?0`5`8Y8KMZF;L4_//<2\S$":&?G"X@)"`````#````3"D``#`"Y+G]"157 -M_?$7[=5%_D[FZ`H`[V_;T4&UD1+&A^VZ72I?)5QK1>];22R$A5`2MT9#Y`4` -M/`$``#P!```"````10`!.%/H``!`$0``P*@!`<"H`0(!]`'T`20'"6*[>IF[ -M%/SSW$O,Q`FAGYPN("0(````!````1PA``$`1B=G\P1RB:DA[GH""$_ZSZ@\ -MT<;''(A"O\H[T/5\71N(EB]$G+3C\-KO*P!!1$I![%_?6?$C<;1XVQJLU>6$ -M0P'TL^@-0\UF[=#'7BB8`UL4F&+)BC`X]N\.)RY]32&=H9=P:.5S9B%UUZ>S -M:LW-,JW?7ZINCT/.=]J[<8=5V5;7@LS!S'#@UL[X84P)KYU(P+9ZK0SI3#=/ -M7ULMTCW@JLEFO'B_KZV4T9!@J8U5;#UWQF)`[-B![(;S& -M$Y0HS\D;0F3_4!*W1M;O!0`<`0``'`$```(```!%``$84^D``$`1``#`J`$! -MP*@!`@'T`?0!!`?I8KMZF;L4_//<2\S$":&?G"X@)`@````%````_"$``.!1 -M]*Q"LF45O`L>:Q7",9'GM<80ODEWW*I63%S`__G5B\-[H$:&XCMD_O\8S6OL-@#L%`W>Y1 -ML*\%WDB6#88<)5JNCK#3!;`!'3BR5*\_AX\ROK)08`;AV^&EOP!HBM"*95>8 -MPP52'K1+%75>':U=^)<&V0X#+'G#(8^+?$H5N=K^$GQ4\.&'L-"74!*W1G<` -M!@#L````[`````(```!%``#H4^H``$`1``#`J`$!P*@!`@'T`?0`U`:Y8KMZ -MF;L4_//<2\S$":&?G"X@)"`````$````S"$``+#D;[JY3>8(*H!68Y$)6P:1 -ME);[YS'=>FB)L,_1MO9R%`3N8ZG;FD,5Q0!\6EV33@0G&=V+X%1Y[@,^;6^J -M@QR8[;.!W?K+-*,R[#3GBI4A,I4C/&(3ZPA"]?Q]J#Q95F$N%/>O?I(`LEGD+LL!!@TP -M/GR@R+]HX4W250F0")N;5L#OTFYV4!*W1ETC!@#L````[`````(```!%``#H -M4^L``$`1``#`J`$!P*@!`@'T`?0`U`:Y8KMZF;L4_//<2\S$":&?G"X@)"`` -M```%````S"$``+"?%`#6T?54&OT%GS,M9GDM*??%:/U2+V"B%JY!)DRF.=_X -M/O'ZA<[,1[K'U?9--I/P:JMZ4/N*ABM"_C"F5-0%#WOM`;/*4-F9#`3_4`T] -MF$MR,1JW?H-9&HW"/K>T`RDPR,[)G+[FX*N_1H#;.KPHM$PB$P)XM-CIEOM6 -M1;WAW3P)OB9CQ=?Z?;_S:^VI:&BI''\[=7I1E5]Z6 -M!NC#4!*W1KE`!@`\`0``/`$```(```!%``$X4^P``$`1``#`J`$!P*@!`@'T -M`?0!)`<)8KMZF;L4_//<2\S$":&?G"X@)`@````&```!'"$``0!M^D`<6`3O -MP-_;*JW">YV`4W\??E0Y,IZ@[6VJ7CP9+#=`79IP\!T0\OH-\HZS$'[6X<]; -M.%5K6[VXUW4='\14E9=TFSJ!8.2L5XFA1G"D$%&)5ID1EJ9J\MXIA"\(V!EV -MVW`%P"$Y[I6N^G#Q-5&(.+TGV&PH".AP#!^9_2 -M3'A&+V^H'*1HG\M'0`=M4#.6KA):A:&V#JO?@(@;N9<2HZ3UHI>>JD/C;AG- -MFLV)8WY16WS56!R^QX9?]MX&P450$K=&3TP&`!P!```<`0```@```$4``1A3 -M[0``0!$``,"H`0'`J`$"`?0!]`$$!^EBNWJ9NQ3\\]Q+S,0)H9^<+B`D"``` -M``<```#\(0``X#I%ZE_>E!Y1:*-_/2,!5$[VY;=@)'@F3#$=-W9O.<36F5HO -MI^(\RB5*?/SUN=XK'L=[MACG"X9;[FWQ'2S$P4E2%7?K5HIJ`2;;4NV^2-+Y -M"&E"7+QBACNDPZH/<"6>]_TWZQ(T(=#=I7',*F).!6?-:#%J_MJ&Q(RW'*^@ -MZWF1(R+1J4QPSX\AB)"IF2^'BI!WA@@QXI32$XC*?P_RB&;;M5$2"LK3MBHE -M13==HE'Z#XU5<'PG)$\AA@@%+@_5F<(1+&^A(P1!H,^Q^.=8)ZDVZ?C?V:4M -M068"!>=0$K=&ZUL&`.P```#L`````@```$4``.A3[@``0!$``,"H`0'`J`$" -M`?0!]`#4!KEBNWJ9NQ3\\]Q+S,0)H9^<+B`D(`````8```#,(0``L,&-'Y[T -M9$5D$1?^DBL1'%N@Z/CA)\)-Q8N00A?`*^,?P*I#;]0WJ[/0@53_S+0KQ1856@OW>A*=YNF?_FYS%5=5G7B_F>*&2]#Z4^$/ -MM_KZ:V`+&`_`Z<=+[?KXI241VAMM@03JWSS*C4WHI&!0$K=&Q7\&`.P```#L -M`````@```$4``.A3\0``0!$``,"H`0'`J`$"`?0!]`#4!KEBNWJ9NQ3\\]Q+ -MS,0)H9^<+B`D(`````<```#,(0``L)GEG0!,4.K1G?6:'7Z&VZ141%U3C:WF -M`SR>;Y_FSM&XRLR'J91E2*2^']\^+2^0=\N4(X(K,0-E5OMOV(1!AT(80/:) -M[E5+4W&$-J5V)Q9;:O_S*(%!76G(YKI'UR?N1@=RK<-`Q6/3#!?$0$E,XO%.-4 -MI!+NBAA&!F,32Q)P>XX0;AX0)4K%==#['?50:HR@D?(?N2P1U^\B`?O76QZ(Q-MII->/:1S.9^E3\RTX!,F'1/Y -MV`H85BO_4)+Y,*M,L#&R%UG$Y(L[A;`E!6Y$[Y3`#G8+!V\AH"^^W"S*U+WI -MBHPJ(J!&5VP^N_8GH\.H%N7L;*1S>OL$_?*,[R6$;8'Y=!9+/X/6CMOAF"O: -M4K3:9D2TB?[&C[BWF\80]8!3URR*-GFB?-N[//;8$@7(XGQR2"!T5HXODH9R -ML8JJ#F5%[:0I@@_NP)@;L"TUYBY.4!*W1O/:!@!<`0``7`$```(```!%``%8 -M4_,``$`1``#`J`$!P*@!`@'T`?0!1`\5'#7Z:)/4B5C%":P51GF( -M]2]GBS2&1]`$;0&2Z3E0;V!2T(_0FA>WEQ^[A`"G&'MC$-]I??SB`Y+7PF+%\"# -MD98=IJMR7G/0B;UZ2-)`;:3"QA+5E;NB*0-'2.L7S)CY@:UE]9+&.CZF9@&? -M]2Y=,?UX8H&(/$CCUH9*`LK\ST1-K)R0/P##&UIY0J.?NJ^E@<>8G"`JKA"E -M(QS[BT$?6P))4C9PI*36%+PZKQ_+D,I+\E`2MT8)`@<`?````'P````"```` -M10``>%/T``!`$0``P*@!`<"H`0(!]`'T`&0&28L^TP5&DB4R/M$5RW5.0#(N -M("4(`````````%PJ``!`<0Q8QR?>TP=B/IFP1EU8GI)I$!#5\(&5=IT%9+=1 -M2&[22M2WXP\Q/TP>*-#ZVWK8"[^.0GL>P+X)RTQ<4!*W1I`-!P!L````;``` -M``(```!%``!H4_4``$`1``#`J`$!P*@!`@'T`?0`5`8YBS[3!4:2)3(^T17+ -M=4Y`,BX@)2``````````3````#`==H^TUIIR:BVKTNTG!%.YFZ -MD+=K3]=M\IR'TL85VZQ5'H:*.E`2MT8P'`<`;````&P````"````10``:%/V -M``!`$0``P*@!`<"H`0(!]`'T`%0&.8L^TP5&DB4R/M$5RW5.0#(N("4(```` -M`0```$PJ```P70?/F!E3-ZR"PCAD9+NI`%[ZIT_2>F$5&:8)MH`H0R8Q/!O- -MFZK!@U*`G*Q0$K=&ERH'`&P```!L`````@```$4``&A3]P``0!$``,"H`0'` -MJ`$"`?0!]`!4!CF+/M,%1I(E,C[1%H`B`AX#&1>EMK&AQ<\/KBJ"7>QXK2*4!*W -M1@PJ"`"8`0``F`$```(```!%``&44_@``$`1``#`J`$!P*@!`@'T`?0!@`=E -M$&-H5E1L&S<``````````"$@(@@````````!>"(``'@```!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``O90,"6HELEMK_HVL9_GX)F;IH^>/8B98 -MN6&3*1\W&0Q9>?U6B]%G=8/"#>"X>I5Y&OG0D7`ILDV@\)7_I-L.R9)1Y9`+ -M*AJ'S8@93DIO`2H6#O']S&U&G&5T>\(?H6<@T$26NV(5V>TE8DF7I7C/K2%+ -MY47P?3S/"9@VA3E,(H(I```D&F+*.XS/=WR"3@F:/50;KGBRDJ&/3Z]"7V7J -MC,_PI)XI```<``!`!&1!?X8RLNXE,S-G8K].MM4,,4_<````'```0`4-UAK2 -MUVBH@7%DB\?7FRUVN/<%K5`2MT;H.`@`7````%P````"````10``6%/Y``!` -M$0``P*@!`<"H`0(!]`'T`$0&*1!C:%94;!LW```````````I("(@```````` -M`#P````@``!`!@````$+D$@ZLS?7:P68*?SWR?]_%O,^5%`2MT9)2`@`N`$` -M`+@!```"````10`!M%/Z``!`$0``P*@!`<"H`0(!]`'T`:`'A1!C:%94;!LW -M```````````I("((`````````9@A```@``!`!@````$+D$@ZLS?7:P68*?SW -MR?]_%O,^5"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MO90,"6HELEMK_HVL9_GX)F;IH^>/8B98N6&3*1\W&0Q9>?U6B]%G=8/"#>"X -M>I5Y&OG0D7`ILDV@\)7_I-L.R9)1Y9`+*AJ'S8@93DIO`2H6#O']S&U&G&5T -M>\(?H6<@T$26NV(5V>TE8DF7I7C/K2%+Y47P?3S/"9@VA3E,(H(I```D&F+* -M.XS/=WR"3@F:/50;KGBRDJ&/3Z]"7V7JC,_PI)XI```<``!`!&1!?X8RLNXE -M,S-G8K].MM4,,4_<````'```0`4-UAK2UVBH@7%DB\?7FRUVN/<%K5`2MT9Z -M;`@`4`$``%`!```"````10`!3%/[``!`$0``P*@!`<"H`0(!]`'T`3@''1!C -M:%94;!LW!U583"=(Q:@(#)Z"])W<%!DIO"^.$KXAV -M:Y60ZU!,[&_CD@XZ\PQ]_7=\&;6FX\1!PS-E;W*4"Y/ZFM?N,LP1E6+JF(ZC -M@VI%I:PJ'"I)%RG1XV:$YR6V1+S']@SPV8DD3-[%*0``),83U=KY'1[A5-F' -M73!J"-96K3RR$E7O]I7,_NY/7,$_*0``'```0`0V/EPR%+^+?DWL*UGFE0AL -MTLI#TP```!P``$`%2)\[VO=.$P+P_C4+V.TN,,"&LKU0$K=&P)D(``P!```, -M`0```@```$4``0A3_```0!$``,"H`0'`J`$"`?0!]`#T!]D08VA65&P;-P7, -MTQ,=,LT"+B`C"`````$```#L(P``T`X,9NUOY85[;Z/"\/O="Y\/[NNFDH6(-P,_YT*1-G0@NN185#,\"-CESW_BU:=O$#%ZZ%IKM;] -M@E=HX-9"(]3::Z';$[YM/#*U>?*=;=`AOE`2MT9=T@@`'`$``!P!```"```` -M10`!&%/^``!`$0``P*@!`<"H`0(!]`'T`00'Z1!C:%94;!LW!_$@ -M<5O%F7F$D<5VIKEKOT5N;#6-_@?WD%V$UQ<^^?X;C6RY;#_ST<6T_"82#4A_ -M*RLU&+M2$Y>)BIK.E;0P(I+>0`+(TN?.L#DB#1Y&IB:_4GL%:,3.E!L$S"E- -MV\SI*&57'%SH5;F<@'L()5Y+%P0? -M7\%Y+?S!&]N!7V[>QM+HOAH@44PR"6'D#W<%-%SQ2N;"0H)EAUVA'9ZJ]37V -MA*[V(?B_,%((;E`2MT8YV`@`_````/P````"````10``^%/_``!`$0``P*@! -M`<"H`0(!]`'T`.0&R1!C:%94;!LW!NZY"U1__"0AZ7Q+FFN4?[$MQF!\"3YNE\M:NRIEKB/PH^=\,+K=N -MR)@C<0^>'$)0$K=&9N@(`&P```!L`````@```$4``&A4````0!$``,"H`0'` -MJ`$"`?0!]`!4!CD08VA65&P;-P7,TQ,=,LT"+B`D(`````(```!,*0``,*-O -M[_/^IXKXPDF+"+M$W@?JON51B]W`M%F7?G"D@@0OKW*4V_:QPM#>``VZ4!*W -M1M($"0!L````;`````(```!%``!H5`$``$`1``#`J`$!P*@!`@'T`?0`5`8Y -M$&-H5E1L&S<%S-,3'3+-`BX@)"`````#````3"D``##F88*XR>K-F33^"LFY -M^QD(#"0#P*T"<'_'VC-J5Z\;T-2=3U.0C1:><=`JR_V_NV=OWKKE2QG&(DCZ<\2B3SRJW:H3D"P -M&1B=F%?LQ_MR'PV?>2Y&!W^KA0:[8.J`_TK&:0N7UR?V--9_)>5+H[G\_16B -MMM[[7#=P0-R/5;3R<_J6;(P41NK9H9CG -M$6I@+\!8Z7^RHX(E]FN` -M^%"1A9YY3]3CED'-NN#F68K=^5:3V'-X#'@B@2KGXP*JW)*ZFZ4RKBVRE$Y/ -M2?[!4!*W1G\L"0`<`0``'`$```(```!%``$85`,``$`1``#`J`$!P*@!`@'T -M`?0!!`?I$&-H5E1L&S<%S-,3'3+-`BX@)`@````%````_"$``."VHP944<(8 -M%VI08$=]AZ+ZA1^,,>QC/X9&SF8_X%WO,I?;6]-M0@)3U<$A="`N787/8.@V -M`$ZC$*Y>X;94C+48%03^=X7-NX]$69[<[Y(!X[7+\4DD09`?B*JJ_ELQZD2L.L#[QA:419N5 -M\J1HA7EUMCHZA3IF\1/!4!*W1@1@"0#L````[`````(```!%``#H5`4``$`1 -M``#`J`$!P*@!`@'T`?0`U`:Y$&-H5E1L&S<%S-,3'3+-`BX@)"`````%```` -MS"$``+#>/JH.^0&]5:BW3O_U),^-AQU0/BH:%(E/^[9!KRJ6D9I9-=F(PC'. -M]%P*M5J,)A5/I$83B4^V[8F-_<3DOP-I^"$@.H4GN"T$?=E?=.>I -MWCH?H[VIYDA7:!QITLDNUF[/ABEY%LD1H[HY%%QNR+5)@2GUR36E.'D[$>BF -M(K3%F[N-A_J'E3'VN]KL(^*"RC$YA9!JE'AS]2!Z[1YA^K9K[9C/FS\>R`16 -M%KN;%/07=+1$M4R),8W:A"?B@(;4W396K+["V#X7=DVSS;[Q`` -M.$$<>9EV=X9B/EGJHZ"1?*G3BQ3D;M_Q;,K\2I(@4J,_-.DF8.FSLST&7#3HL%IF8!N5K63_9F[1H\:8,2 -MDI-V5*1WHA]8\V:5TD"G9==TFG[(9S.>D*5$$2N>7XI@LXR'NVK;1E=,10TZ -M#EE$9R0D;>)H)`.P```#L`````@```$4``.A4"@``0!$``,"H`0'`J`$"`?0!]`#4 -M!KD08VA65&P;-P7,TQ,=,LT"+B`D(`````8```#,(0``L'"=GF^QV*T@L#H\ -MRLSZ3H6QSCOT8;>:LH?ZP.H( -M:]QZ781/ZII#WWQ^E3#T5M2D>\WR_BPUC',Y@3 -M$^\7NI]:A$9#A2\`E\LL&D]2#4S$0N^RH(-0$K=&N+T)`.P```#L`````@`` -M`$4``.A4"P``0!$``,"H`0'`J`$"`?0!]`#4!KD08VA65&P;-P7,TQ,=,LT" -M+B`D(`````<```#,(0``L,R-#XKN,7A9OE3`I.0-%MOH07"7@PL&"?P3&^/` -M\%+J@67\:KYFY6;V"L#3EV,A:J*-,=3FCJFO9CQT'*,P;"$;IHO?5]^E9,.C -MOMQV=L3T!9JCRJ\(7LS-8SIC -MH_!H-4[6:TDJ)5PA6BXZZF=UZ>/OBV5GDQD72W"[34A^2G"4N20[K0IB+#&!*^N(@&>=A\;;S?O'15=L3S'RC5AR+'1[' -MC?=97NU%!JEY[[(4[L%\\D'E+GAA96(D!#]M0`NM;UM^9<A6KZ!TMG6^V^J@[5>AFW0:-ETU*DL/.#PB]?[N92`=!,GA_#0Y29>/" -MMT"NIJ#&$AC7U^=!>;1J%7QH9N@V:@Q=\-L.;KX<3_GEYDAD^VS79=A:PEPK -M[4O86-J9F*A#IG-SNY?/NB<0SF>_=N6@(#V(1=UIL$$\9A+!5P#0PTG6X3A; -M_M6,YD[ -M$=N"+?+B@S=,61++>AT("]4E;:+F\"73TE)9,4BQBW$:HSC05]2$=#<0,Y<3 -M,$D&)H;2KHH>E(7^0^7N4!*W1I48"@!<`0``7`$```(```!%``%85`X``$`1 -M``#`J`$!P*@!`@'T`?0!1`"+T'EGV-RC(0F)S.=LX4PDS/SSRG67)OE:,#P%]Q4Y<8I*[9TLL -MU=:7,\=>;G6V0+NZ]CI:](C6=X@;"HT&V5X)F+[0=S(,,PR.Z96<1F__VC$= -M)<]65)G#,B;`[VJ(]B^Y)-1@UV/-,J^;(=$0ZE;Z0;$*`)Z]-43Y+]3-9C7` -MZ][]N&&9[K7F;CY8D+&A@B]ZE@-O? -M_+[$(K#1\&[(/7K1X]X^2/DF'-W(:LX1N][_XET<`I)LBV-==G^&W4),,G\5 -M%ZDO:YB-@P16(FKWB[W;@_V2T%`2MT9*/PH`?````'P````"````10``>%0/ -M``!`$0``P*@!`<"H`0(!]`'T`&0&2;H%WZ#\P:LD&S!+J)5!*;\N("4(```` -M`````%PJ``!`1&_Q5,F6#\4,05(PQ@Q/8,0+3=AT["5QIM^S#KMA7R!/N%[A -MK3X]ZSFZBSU:Y:D:S;N[W.Q&N(B9K$J(4!*W1H=*"@!L````;`````(```!% -M``!H5!```$`1``#`J`$!P*@!`@'T`?0`5`8YN@7?H/S!JR0;,$NHE4$IORX@ -M)2``````````3````##::O#YZA:YZ-Y*9=>(Z<_2'9$*UHZ518KF#F2SP#(% -M9U@7"2[>;4OKF_BKKE`2MT9]60H`;````&P````"````10``:%01``!`$0`` -MP*@!`<"H`0(!]`'T`%0&.;H%WZ#\P:LD&S!+J)5!*;\N("4(`````0```$PJ -M```P7A/%F"@G,!8JC -MO*I0$K=&!F@*`&P```!L`````@```$4``&A4$P``0!$``,"H`0'`J`$"`?0! -M]`!4!CFZ!=^@_,&K)!LP2ZB502F_+B`E(`````$```!,````,"QT9_&8`,3^ -MNG^[2EZNT#.#/MANL_@-J;:W$>MHY/C&;L3WA]ZM=DK-IKCS4!*W1@=F"P"8 -M`0``F`$```(```!%``&45!<``$`1``#`J`$!P*@!`@'T`?0!@`=EA@9Y2+,X -M+D0``````````"$@(@@````````!>"(``'@```!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``OR'&J+SZ]XT#@J=>S^9$.>%R!G_PM,R42!1=_*,' -MI9=JR&\CO9BWYPOQP`HG\17ZL46T30S:?7\KP6/H@:KST2$#(D&*"`-8PJ3_ -M;'",21*LYX9%W`6G<4#/^,[NO`32"H_LW5H"Z0*$3C\>"U!#T.A![4 -MJ;V[WRF@P#TI```D]!JKFV,C+`BAU,TKV=1=9+DR6AC6C;$\"-@*"X&K@GXI -M```<``!`!!7?H()W01BQTE]+'[ILY@4/!!@F````'```0`6K'Q`I]40=F"CG -M4171`-"3([^N5E`2MT8U=0L`7````%P````"````10``6%08``!`$0``P*@! -M`<"H`0(!]`'T`$0&*88&>4BS."Y$```````````I("(@`````````#P````@ -M``!`!@````$?>([)S0,7[2`'EH&LU@O4BS."Y$```````` -M```I("((`````````9@A```@``!`!@````$?>([)S0,7[2`'EH&LU@OS^9$.>%R!G_PM,R42!1=_*,'I9=JR&\CO9BWYPOQP`HG\17ZL46T -M30S:?7\KP6/H@:KST2$#(D&*"`-8PJ3_;'",21*LYX9%W`6G<4#/^, -M[NO`32"H_LW5H"Z0*$3C\>"U!#T.A![4J;V[WRF@P#TI```D]!JKFV,C+`BA -MU,TKV=1=9+DR6AC6C;$\"-@*"X&K@GXI```<``!`!!7?H()W01BQTE]+'[IL -MY@4/!!@F````'```0`6K'Q`I]40=F"CG4171`-"3([^N5E`2MT8_J0L`4`$` -M`%`!```"````10`!3%0:``!`$0``P*@!`<"H`0(!]`'T`3@''88&>4BS."Y$ -M`L:;L#G:8:PA("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`# -M```(`@```@,```@#```"````"`0```(H``"(``(``#*C=$AR#^ZZFDQJFUY: -MEU>U4E.'HJ0>C@I>$I+C[YEV/&\B0K_X6HJH4]/C$^0N(4 -MW!H6S"*?7#E+UO86X.B=PKS<\R:*N$P5*0``)-X^-XUA>/\J9<:J$1#-E@ZP -MP@:,KZQLN2O%E/P%,ZG?*0``'```0`2Q-E]N3>]-#&2*T4O]2RI0$K=&)]8+``P!```,`0```@`` -M`$4``0A4&P``0!$``,"H`0'`J`$"`?0!]`#T!]F&!GE(LS@N1`+&F[`YVF&L -M+B`C"`````$```#L(P``T/_R9R+3?435`HA(UIA=_R1\V@8'%47!"DID)9Y*5ZZ0( -M4!:#738)!BEQL<5H\K>([36B05T$1YPU935DVI7PGR/%MY%!OV'B165`2MT;2 -M[PL`O````+P````"````10``N%0<``!`$0``P*@!`<"H`0(!]`'T`*0&B88& -M>4BS."Y$`L:;L#G:8:PN(",@`````0```)PD``"`M4*E;P(00@=AL@7W)S]X&K[!0?&TB'K;A1UES&88:%GP[_5,TC7_W%E];/ -M_>Y98*'77:XM1-,.)E@;K//#V]-I"F>LY::K@4?$44BS."Y$`L:;L#G:8:PN("0(```` -M`@```/PA``#@EA%I^\:!`?&1JFAL/@"<3`I`U700!SYK*H457&0H*%%4@:CQYQ"V@/H(SUMG?C<,Z'P;Q@1\GXE_-6#,I&$YDN -M?+:(,"1.N]"'IV$N-%25-`>JTC3$\V^Q_1AJ.]ZXTEL0^_"60-O='"!$7IY" -MGT:;+V5H2)3`J>8K#"1S"'Q)0QP=U9)B;^)*.BS/B'=-Y5#1L:H.K92QYOUR -M8[)SZR,(CD``!`$0``P*@!`<"H`0(! -M]`'T`.0&R88&>4BS."Y$`L:;L#G:8:PN("0(`````P```-PA``#`\"V<12S@ -M`E`F(!0+G+@7;62%*OUNAP3- -M'S[HAL.\L^^Z(A":[!F?1"UX>>V&NQP>X\YRQO(26XU=[W-#\IPWRV^KKW%C -MDSE02J,3K.OU)3EA+?W2-'<,EOD]4L63S=.#&JXA.RXH85!02UCPP7S9)P8] -M(,E(MN4JXK#<[_L/5J`(Z[-H]."!HUA:C1O3XR$X#3*03?]>H>LZQKQ!A==@ -M\G=0$K=&9B4,`&P```!L`````@```$4``&A4'P``0!$``,"H`0'`J`$"`?0! -M]`!4!CF&!GE(LS@N1`+&F[`YVF&L+B`D(`````(```!,*0``,&<^ -M%C9[A6F*($-GP']^H0,E;,!JH;;/A2%F3E`2MT9X6PP`/`$``#P!```"```` -M10`!.%0A``!`$0``P*@!`<"H`0(!]`'T`20'"88&>4BS."Y$`L:;L#G:8:PN -M("0(````!````1PA``$``6&MP1'V]817B3>`"&M"'-E(!*"V.8&!W(O8F_R> -M"6KJOTB42X!I$')Z6_P!07(`1X?]1)`Z:/6`8\`8MW(:K:_3RW1,O -M$2P+E^40:<5]UGVX/]IYZ#HZ+:)$Y(CHRXW@B9"S.2]@)Z'+,AN/OWJB\"M+ -MBKL*LZO#U=XMUK%T*>5K%PIO%J0#AO5Y$# -M("-"MI2_&SI<^L2'M-5-/K"0!3,)\E@&PM(.7N6M*6GH[$,DTDE8[ZTFYV&) -M/@!>_Y@6;8&&%SMQJW%$[I,*IS4_<_ZD,+\EJNM1V&`LK!P&[;Q$VS\D4!*W -M1J=G#``<`0``'`$```(```!%``$85"(``$`1``#`J`$!P*@!`@'T`?0!!`?I -MA@9Y2+,X+D0"QINP.=IAK"X@)`@````%````_"$``.`^LT`?8($;_Z^\+82[O`$,$1T3^8A;H/TH`\Z,PLJJ#%5[D+1$VMP^NZJQWH.R0O9PAQB^^ -M<""KQG-,=J`8&U)-V-@J76X'"_Y/ -M.9=H+S*@Q!8L.0'&`8ZC)2\FW/+,CDQ`Q]P&4!*W1CEW#`#L````[`````(` -M``!%``#H5",``$`1``#`J`$!P*@!`@'T`?0`U`:YA@9Y2+,X+D0"QINP.=IA -MK"X@)"`````$````S"$``+"TK\I<^^&H+A1K@$`++W//>RU]ZIR9]NO[IZWR -M1/1>QISG@20C70BMRWV\2>.V1/^!>JUYG"3IF\&S>_2(,^94?R&'?-*$M`SS -MQ<*`VCH-T;\=+$#U-XKS:#':H.:T%*6<&;`9&M[M30N"II](3YBU"6KFP(JW -M<\6*M]8+F+/(=)AHLC`=GA-T!,]3W@8,U\W=[=NR,8X"5015\Z80RUME4?\3 -M:R4$/3#I?-X_4!*W1L6:#`#L````[`````(```!%``#H5"0``$`1``#`J`$! -MP*@!`@'T`?0`U`:YA@9Y2+,X+D0"QINP.=IAK"X@)"`````%````S"$``+"# -ME*"B\DM94O$DHOZ)&24B(68X)ZDK8;UQ(WR,B*+EH>1QC/:3MAS)N_N*%]=T -M4JU---FKAZO_DY:^ER*,ULJ>+8X.YB-#`YE$=!3_%:U4,'-6L[JTTP*C(JXN -M&)_2L`GKONG/.X[]C/_G6/"<2JTMZS7 -M^SEE*?O@_4502T>&%V'@+#Y[.@AT:@*YL+UK]6FK<#7ZXT>^C,_IYL(+K03Q -MTSR/?V1H?W*Y&2<6+J[OY']6N+2\273B,L'!JGSYT0>+Y$@^2?7V+?3E3`"L -MFGM*JB#HM)!W-@W&G\0H/88_["$G)=VK+O#<>P:%A9I^5]\] -M?X\3:I.QQFAZB6R/7I6DA-QM%9QA7YJ82(<`LG+\]2E2;3X,1O>C(QKC4DQ* -M.B:-XT+P7\*A+LH&]Y.I75O&(JB^>W6`I&=%8IK&J#I$L<-O/W6J.]U:X&S; -M:EF*DKV)O0M0$K=&4,,,`!P!```<`0```@```$4``1A4)@``0!$``,"H`0'` -MJ`$"`?0!]`$$!^F&!GE(LS@N1`+&F[`YVF&L+B`D"`````<```#\(0``X!/M -M`%/BI]YR3D,2TNW6Y(>W`EYO(./&2"?S4!!L`%Z,=,_&0.1,4WQ';[UU%A+V -M$V>^8EQTP_9RZ/4I_<N6_P/?F`LKO2JI -M)'=U1>L6V3O%!3VZ8%(# -M!UU;<GVX4^V=',0@SB/A^;`0@UU^=7=($GO*+ -M]:+QWWYE!QYT"#NS_5IH'O/]3B[<4-'0ZB,O@5YM"@YP,-B-7790$K=&'M,, -M`.P```#L`````@```$4``.A4)P``0!$``,"H`0'`J`$"`?0!]`#4!KF&!GE( -MLS@N1`+&F[`YVF&L+B`D(`````8```#,(0``L!N&$20Z6[_M04DRR8@]#=/"JH#'!JM%L)Y9[B=TK2%9-J -M`JH?:W0+"\Q9W#GR=W;WX?HW%J5*%QD]B9+SFYBOVY30"D=#B:AM4+%\74\W -M.$,.,"D4[D`@)E5CV*.?+H*,<6G:)P`U;EX!@&GO%K3^2,;HO33/(/SOVC:Q -MC%N&W8F#7SD`:I_/2L-]D/98ND90$K=&I/4,`.P```#L`````@```$4``.A4 -M*```0!$``,"H`0'`J`$"`?0!]`#4!KF&!GE(LS@N1`+&F[`YVF&L+B`D(``` -M``<```#,(0``L(*^#/D6=ART:[(TZTW764!(OY)%?^S/T4ZL!TB(9H3K5HZX -M&ETN8.'Y9]/<&Y3[$V?-:E""=,O#/-QSN31!GHSDZ_6920F//])C;3@AEJX, -M]!IW9#M;LN@]Y=CT,RM*^=N`?KQ8!)-2N\,E\>M@R1AYKKGZ`"?%4RAT`M_M\[L3#RPK%XAIPD#;GM\(/RA'Z'^P*.ZS_LUJKE -MZ3E0$K=&CAL-`(P!``",`0```@```$4``8A4*0``0!$``,"H`0'`J`$"`?0! -M]`%T!UF&!GE(LS@N1`+&F[`YVF&L+B`D"`````@```%L(0`!4+_`)B_+SGW9 -MV^!ZG%M5<;&#U@@>:@?E9D''*AU':,HQ!G,D-##$/=,57[`[^KO2WJ'/]/_/ -M.02"RF'QT-(4?+64T$[B+`WM(+.W9]$G^7S]BWT-*?]`E[P%<'IM.IH$7A!" -M!@(!ZVA.H3$M7`0$-$Y\KP"11STX:8V]V7\VPW&ABZ#E2532;=_B__"ZK(]? -MH]TI&J!Z>X39KX:"G+6U8=N1@)SKS'*0IR_,BP#0S"FV'58U?\#_:YN0/-?# -M$XAD+]&0*.E+^+=#3ONC/-O@L^W6W9D*KU&5%0>H%9_SB`E_9YJP&71\-\2> -M[E`M#0SNV$-ZQ855<29[ -MH!TVRJHX`1@Y4!*W1BE0#0!<`0``7`$```(```!%``%85"H``$`1``#`J`$! -MP*@!`@'T`?0!1`TUEKHF^MLHK[IK7OU]=JTWOMR1J]7]%I-7, -MR>XL--B:T=C!@IS?2:2T'XP=AN!2CJN-GYE,)75AV?SKC_Z-SU]S8!@R$]:_ -M:X!)T4)G7PHR#8J.72$E,O!D&B*(;YO!Y'Q6+\+8"F!50?T7>;7#RBKW=*FW0?WN^D83F;6HHYQRDY2`V%2[RQ>ZVG -M(HT\NLI2NL4RRC%,?D2*(35)A@I=7DC^,'ES>`T`?````'P````"````10``>%0K``!`$0`` -MP*@!`<"H`0(!]`'T`&0&2>V7H`\JPLZC(B13I*PNOQ4N("4(`````````%PJ -M``!`U)Q;!P]F&SO+LS>].[S@X2I_J1I3?4?Z]C>T'M=M6[C&+84FVG1XMY@U -MA14.8B)D(_:2]YSL7_V_[`3L4!*W1G^##0!L````;`````(```!%``!H5"P` -M`$`1``#`J`$!P*@!`@'T`?0`5`8Y[9>@#RK"SJ,B)%.DK"Z_%2X@)2`````` -M````3````#`&,$UP[G)T*4/AY=)MQ4+:J)"H^%V7H`\JPLZC(B13I*PNOQ4N("4(`````0```$PJ```P$-%S -M>+-77(M)$O51DS)P\O%0$K=& -M\)\-`&P```!L`````@```$4``&A4+@``0!$``,"H`0'`J`$"`?0!]`!4!CGM -MEZ`/*L+.HR(D4Z2L+K\5+B`E(`````$```!,````,,E!;A:'WN&9O+,/+T?D -ME<2YB8K>Z$)]B3ID=U9,`>=-`N-K^D;L(94!*W1IZ?#@"8`0``F`$` -M``(```!%``&45#4``$`1``#`J`$!P*@!`@'T`?0!@`=E&[#;@&5GW7,````` -M`````"$@(@@````````!>"(``'@```!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``0`4VBPKZ8Q=HW%?VQ:7]H:5C1&K9-B18'-LE5ZMU-;?W\=@U -M!I(YIXT5W3"XO8$F+.Y"#0T3+;2\GQ,_:?=6H]@[(_UW>+KV7S3*_."^GXX< -M02IL1&GUWJ`TA'QENY,N?G:*_I1FHG#B)$!739\XBPQI^@.4QA6`3=D`90[; -M*Q`I```D2J`]R(:2PU8=6P]:KL[L24K7.?2U,=;WP"KT>R)[N5LI```<``!` -M!,+.D@39#1BN7RX*]8R1:EU972Q5````'```0`6'@/*^7T%M3RYS;%':K7#' -MB-Q2B%`2MT:)K@X`7````%P````"````10``6%0V``!`$0``P*@!`<"H`0(! -M]`'T`$0&*1NPVX!E9]US```````````I("(@`````````#P````@``!`!@`` -M``%\Q;:]&@A"!P)$]LSI0*O6'`U+^5`2MT;-O@X`N`$``+@!```"````10`! -MM%0W``!`$0``P*@!`<"H`0(!]`'T`:`'A1NPVX!E9]US```````````I("(( -M`````````9@A```@``!`!@````%\Q;:]&@A"!P)$]LSI0*O6'`U+^2(``'@` -M``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``0`4VBPKZ8Q=HW%?V -MQ:7]H:5C1&K9-B18'-LE5ZMU-;?W\=@U!I(YIXT5W3"XO8$F+.Y"#0T3+;2\ -MGQ,_:?=6H]@[(_UW>+KV7S3*_."^GXX<02IL1&GUWJ`TA'QENY,N?G:*_I1F -MHG#B)$!739\XBPQI^@.4QA6`3=D`90[;*Q`I```D2J`]R(:2PU8=6P]:KL[L -M24K7.?2U,=;WP"KT>R)[N5LI```<``!`!,+.D@39#1BN7RX*]8R1:EU972Q5 -M````'```0`6'@/*^7T%M3RYS;%':K7#'B-Q2B%`2MT:1X@X`4`$``%`!```" -M````10`!3%0X``!`$0``P*@!`<"H`0(!]`'T`3@''1NPVX!E9]USJNU^+ON) -MZI8A("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@`` -M`@,```@#```"````"`0```(H``"(``(``.;'^B!U+0P3?,@A/P2KJC:WB\7%!50=C3Y!K,XW<)6M'J5]X>$-3M"MM9M -M;4\^*#0A"&^AU">KV$2S:TL:*0``),MQA/8U/+JVQ[3']<>J.<=Y@6\3A\0[ -M"WF?$C7/](C5_@```!P``$`% -MQZ;>,?V$[0LW)XJV+Q+\EBC9:V10$K=&'Q$/``P!```,`0```@```$4``0A4 -M.0``0!$``,"H`0'`J`$"`?0!]`#T!]D;L-N`96?=J6+B`C"``` -M``$```#L(P``T`9:'6$47W$?;P1^7$T2?*=BA6''^5X"$1[GD\?S8;C_7^;[ -M+FI>E3OP0Y162;>WJPGY(U8@Y=MT.!D@?RPO6$DD)(P(V]<#OY5MK0SU#HN`\?(H4!S7T -M?9I?7X)(92U=HQ4K^G&WJI^LO0D$V&L+`(1(,@0DK)XY>E`2MT;[*0\`O``` -M`+P````"````10``N%0Z``!`$0``P*@!`<"H`0(!]`'T`*0&B1NPVX!E9]US -MJNU^+ON)ZI8N(",@`````0```)PD``"`W95@:]$!.090(#OLU/LNC?,WMK`_ -M<7;WX+I![ -M*C\73YKN:]VG.(IE^LV,L23%7MUB/F#&%:9Q@>1CBR8GCS_TIB"H%XG%ZY[B -M$YCNCFSL$.2K1^YS!E$2MT97!P``'`$``!P!```"````10`!&%0[``!`$0`` -MP*@!`<"H`0(!]`'T`00'Z1NPVX!E9]USJNU^+ON)ZI8N("0(`````@```/PA -M``#@MZ`[';)R?J=<*/R+KCX5P*V7?1S.JG9>5(L&G@C6H'EE6[=GU'"N'&CC -MP&FT1\ZZ77>0,[6%!`:95W:/39FTLY;;DPO6.S8:_H*+;S/7)]&E#8&I">N$ -M\9/-]N7N+PDK$\[$0=(,7F@@\[(7#^W7D=QK7$V'PRW4'E%*7I\J1(DX@W-_ -MQPERL()[/[D)Z0''8#:AR=F1@@C0^CM$W+Y,G"3JC9G`^JX2*Z!%%]Q8EEX9 -M#>MEU"I]KD2]@?09I7_CT'/_N&W*OY0W7=@\$`1Q^41`<;O;DP8J)Z9+,E$2 -MMT:2$@``_````/P````"````10``^%0\``!`$0``P*@!`<"H`0(!]`'T`.0& -MR1NPVX!E9]USJNU^+ON)ZI8N("0(`````P```-PA``#`K/$FG%)!K^0+(7NJ -MV4[W]W=&W`8>(D+0_'.]IL!V21B1P^25U1*QHR==D3HY=6E!0Q*OCF?'#H:&3<81,WB;$!K?323*F+ZPU**&0Y^EY0D`>C&7;`6*CIK0PIS -MU01%[L%;U'9?_3;^(^F_NQMIIR2^?UO4X'Y6Z"UBO)V+U#=0V((&`<^&J45U -M1E`C(J/S"UQ\"RA3QT+0!\76\["W=+#ACG0#4CHY$$+=['G.[#9.9K]1$K=& -M41X``&P```!L`````@```$4``&A4/0``0!$``,"H`0'`J`$"`?0!]`!4!CD; -ML-N`96?=J6+B`D(`````(```!,*0``,,MIC7S4G5V8XM3!SIAW -MBH=K1X:D!Z*WE4D4Q.,<1DTPV7PY?Q9M>NO\[:NV41*W1I+TU,ZFDL -M=^!G0H<;SHD6UB@T_G511U*\JE$2MT8;50``/`$``#P!```"````10`!.%0_ -M``!`$0``P*@!`<"H`0(!]`'T`20'"1NPVX!E9]USJNU^+ON)ZI8N("0(```` -M!````1PA``$`"M*Y`!TM$L1!NU"IFX'!SHUYFHY[>74W>$1(:VY`)Y1726 -M^EJ,D^+HP(7+[L^LJU+2&GKOIC`7NMA1?E>UR[T=:$=(W.$_ET5+$/N]5Z;M -M>0TX-I@*"?[[X)/B1JK0F''N],ER^LR7P;TIM%[^OS:5&906%XM#J8"-0>5> -M]^MI'W:A)1]:VFWDUDRK<>(MI'QOO\QT$#+&V"=RUSL7CD>O41*W1K!@```< -M`0``'`$```(```!%``$85$```$`1``#`J`$!P*@!`@'T`?0!!`?I&[#;@&5G -MW7.J[7XN^XGJEBX@)`@````%````_"$``.!LG`*90+6NXA]+GM@(_BDGU,81 -M+V,"H2=6J5)*T*3H#.)NK*!23#:70MA/^V.E18KA#)?DN'M#EG"+4C!(@Q,- -MP9#,"9]48'"/3`::7*BBTEES -MC')WI1=.J'6;4*UP,U9:61VD$YT,+7QI("D5\"\S;-@X?EY.F%U&O9XOC+[! -M&4YH;EO7;JPQ@WT`YJ3Z`0`%G(<2R%(/8_[_YKYT<0Y"2K_< -M0O(D,CY>B^<<"3Q1V'N5]]P)]+7S41*W1GMP``#L````[`````(```!%``#H -M5$$``$`1``#`J`$!P*@!`@'T`?0`U`:Y&[#;@&5GW7.J[7XN^XGJEBX@)"`` -M```$````S"$``+#HGX?O9`8FY,5(0\&0:J9!J;F/Q@_ -M3``#L````[`````(```!%``#H5$(``$`1``#`J`$!P*@!`@'T -M`?0`U`:Y&[#;@&5GW7.J[7XN^XGJEBX@)"`````%````S"$``+"U!:;E\JQ" -MQJ6PPPM6D+R!XR]1?>$VG/V*6/*-)`EP%Z1#)>1(DK<0NACQ'3ZW/<6%EM$"U -M40DN-8!O6.,4(7O]\G6M*_84YL55-"V=)3/>X"V;41*W1N&O```\`0``/`$` -M``(```!%``$X5$,``$`1``#`J`$!P*@!`@'T`?0!)`<)&[#;@&5GW7.J[7XN -M^XGJEBX@)`@````&```!'"$``0#N>"8U`_B=PP[?U['S?X:?,06-!DOOA-R" -M>$=9UPM$9L_$K>&^P<=;P[MV#=+1@S"Z]L]C@J-P1U&##DUL4M)KZ/O['I&D -MYTR])8:[(*Z5R8F;AL@&@A$KGP6ZR*K&Q21500T@P/8^2]+Z@IDQ`H6(#6DA -MQ3"U&[?HASN3WLE<%X%U;/Z(AZ7=K@A#5IT?G^"^\5L^J)*K_3'!'A&%J&RX -M)#Z,9L@&K*S4?R=TJPW/I+JJ5O\SB<"TY3&\160X"I;>;5?]X_MI"BP9R]LK -MN%[76>FUU''QK7&&4!8]<:>_??P447`:CY.Y[A@OE]Z"1=79YF] -MB/Y1$K=&3;P``!P!```<`0```@```$4``1A41```0!$``,"H`0'`J`$"`?0! -M]`$$!^D;L-N`96?=J6+B`D"`````<```#\(0``X,[DMY^?4+$D -M-_]3)7PND]8I12Y0F'``Z4L]RC)]9=K%'[''3*KX^LEG\7-4]8&3YQ1^U+]7 -M=QM#;TBTE?GVV*MZ,$K"&Z\IU4)KBLO"$>Q+CW$1P&O=3F&;WQ-XY4!(^N(8 -M!IZ^*2%DPI3(*A37>]+;99-_)GK^32OK$P`/<==;<"^L]X,CK9(27AH:N/$*C\R4.$3[8L8LM'L43]BZRJ\XW#U@GF20LD8 -M_TKE3]Z35=C6:-"N-X%QR8C;NM*#1#H1'Z:VAL4OJ6+B`D(`````8```#,(0``L'\U5AN&J[N%G;0@YKH0('[N2SM78P=51]4 -M]087!O+#.XUC:P(-R&F(!3'W/[:WUIC7-SA%W(\7[(3T;Y%^1P,3B^DL5:LW -M-.HDZL`^)"@HRV&S;Z=1$K=&/>X``.P```#L`````@```$4``.A41@``0!$` -M`,"H`0'`J`$"`?0!]`#4!KD;L-N`96?=J6+B`D(`````<```#, -M(0``L$@\33.#M=$]%>_H8F-4E_@JIJN"%VM"R1E'EUYI3UM(M&MLAXL.WU=U -MBI$@JZ[[LVA59IH]8F*%S;42;0EX,!:W;GKZGV0QP)R-N']Z'34,,UN/UB;A -M=R$UC!G(W3F2-Y1\GT6UHC_R.F6`ZAQEBV@29,Z&)$=&,Z3@$4ZEYHK<&!U[ -M#,@SU:[-^`RP/K7.2@[46FXR0IC6_>Z5A4>D:@O^>5L`L_]D%31%A%E1$K=& -M^Q@!`(P!``",`0```@```$4``8A41P``0!$``,"H`0'`J`$"`?0!]`%T!UD; -ML-N`96?=J6+B`D"`````@```%L(0`!4#"Z`<1<5Y]C)"N5R5MS -M71(M]DW<"?F%']K]B?1F%A,F2ICY`[K&.^L;140:H.`9PV[YWV1!YMP"Q.^, -M#SA=F@)[$JZ[;R#P2*!#0L+<`R44[O.>EW$*SLC@90S?-9*`D' -MCN*%&&39^=;_B_([JZZ+W>C6[A$`/=547:0'6F%:.`,4DFX -M+'@`41*W1L)-`0!<`0``7`$```(```!%``%85$@``$`1``#`J`$!P*@!`@'T -M`?0!1`5CNWI\0Y'N>([MKUNLI6I*/'DD;7)F%M5W#6G^ZPI -M"VRD&.S()8M!E/"`*1,Z7QM@1DGSE4(:%1)``!`$0``P*@!`<"H -M`0(!]`'T`&0&216GBU<-DJDN!J*I26BI*MDN("4(`````````%PJ``!`1G:' -MIE=81P_KD[JP&*,7`DIBF>RQ)Z)WB>&#M!P:5T%,V1\'I[I(F\<-H<''FV1> -MTC=-(L[#N":XO\I-41*W1D6``0!L````;`````(```!%``!H5$H``$`1``#` -MJ`$!P*@!`@'T`?0`5`8Y%:>+5PV2J2X&HJE):*DJV2X@)2``````````3``` -M`#`T`W^L[XUE6/:#DWH+QKV`(&"D!'Z!W13Q:=U-]6O_L$/YW4(&DD(7BI%Y -M/E$2MT;8C@$`;````&P````"````10``:%1+``!`$0``P*@!`<"H`0(!]`'T -M`%0&.16GBU<-DJDN!J*I26BI*MDN("4(`````0```$PJ```P#%1EN7^GO!(P -MWFJI^P+?I2$F[N\T_$7`'`Z]Y;"D.]P>24&$H`UC -MA!*6;`:\6SH5U2R2H>D4&C-GNBU?1Y=K41*W1J&9`@"8`0``F`$```(```!% -M``&45%```$`1``#`J`$!P*@!`@'T`?0!@`=EQLJ^>&O""8(``````````"$@ -M(@@````````!>"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``,X3^AA+(*DP_K7Q(:W]+^'AN@8/)LYE3%)C5B3%=R/X\[=J13!(A3#[2 -ML#2/"-3QZS[.+@5(KHGC('_2HIW+G:/]&Q)OU,M4J=N,@Y_[KQTWRQ/7ASRD -M#\:3CBRS5'S-HKJ\@K0%0\#KT0N7-MLFT&1T&-WY28L1]QRN1)DQ5[,I```D -M^L33F!D]/L2T.L8`B197R!4/&;_IZRQS/4\T_1F+4\,I```<``!`!'6?[R2Z -MC!Z.[@*L=85!ZO494$NH````'```0`5`I"*:3R+=@.E6YLPPUZZ@+"57IE$2 -MMT8MJ0(`7````%P````"````10``6%11``!`$0``P*@!`<"H`0(!]`'T`$0& -M*<;*OGAKP@F"```````````I("(@`````````#P````@``!`!@````%;DMQ@ -MJ?XT@##\*:9*XQ)=VD*,@PA("(@ -M`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@# -M```"````"`0```(H``"(``(``$`]F`R:4!NJ/>)'.->FNW;7)ZQCXWKEW:S_ -M0FSY?[!E%0ZX7,]>C6\_77#MI]L9,8"44Z?`ON!7&L;LO^YJ!;X@S+:)*1'Y -M#"?E.]YR8]957\#J+]-$MPV3$@(/:G4T^,9I&!@\E-HHWQ97_>*%BLW$JF.$ -M20.#,S$4_7LPOSA$*0``)`V!F!WY]Y9K@.&3=JNY"?0=Q^8Y8^MQZ-8PU*VX -M]TVJ*0``'```0`2"L(+):VUE\?==23;%!Y,NNAL71P```!P``$`%.,475:Y/]HD[U#(:<53;T%H?-,6]D."023IM? -M5N>OC7P]->7Y36"T5X',_D&S2L,E)D&;HRB1N\DA;KQRHRFNH;>Y__`GH1Z.V$:9SIXX^Q^0Z]Z<&?L^A"/3)?:]G"NVN:(2=8?]K=]A_V]OX'=/X_3`4@6I^+/"1)Z[Q+*89->/HB-M$*"L -M.VD\/;Q)=VD* -M,@PN(",@`````0```)PD``"`E$<545SW])16F6L]U$RQW4$1^07\87ZV@\(, -M_(H5FPQ?N_#N(Y-A,E7_OY\[O8`Y(IOHWCP^N5^UJ0$X;,7F'2+Q3)@.Q\OD -M&"\HV(R[R+#M35$2MT;E0@,`'`$``!P!```"````10`!&%16``!`$0``P*@!`<"H -M`0(!]`'T`00'Z<;*OGAKP@F"_>Q)=VD*,@PN("0(`````@```/PA``#@,D>? -M#JBI6K0X[)*,N[PR=:JK=6BK#42L(/UL$%\BDG1HJF@:YQ*-;FOD;[3Z(FPT -MY?LZ_UT=SU*9YG2I&A&/W=BK#ZH!I,[`Q=DRH`(,1T4D-:111F5W238G( -M9B.E)B1HN1NH)HA3.H'SOOMR@$/;87"U$=.7+*8D@M_L+/* -MC.OMW="OV&5R-ZB?/("\P:E?@OUI)'KD`6V"(JP!AHVOJK6,AE$2MT;L30,` -M_````/P````"````10``^%17``!`$0``P*@!`<"H`0(!]`'T`.0&R<;*OGAK -MP@F"_>Q)=VD*,@PN("0(`````P```-PA``#`"4N0"_Q&R7W+E2P#?^[!=2RI -M%.$@9>#GG>_JJ1J'.1]1-''ZG13V6&2:O?!>XFS6]>-X;3J.5G#HL";/6[VOU05 -MZI`6<_>X5Z()EZ].%R4C;3YX%V(YZR2XF._X.(9;?Q=J#9`?N5N218.R5>C+ -M`0#2.OON6AZ;O_WUZPT.0.H[C7(=(&R0I'D)]/YP(EFKT8U1$K=&XE@#`&P` -M``!L`````@```$4``&A46```0!$``,"H`0'`J`$"`?0!]`!4!CG&RKYX:\() -M@OWL27=I"C(,+B`D(`````(```!,*0``,$?'V$;!7;EJ.ZQ5M)Y+*7/E1;XU -MEW?HZ)K0JCU.JKJA:JX"=LJ)*35_P]B&41*W1@AU`P!L````;`````(```!% -M``!H5%D``$`1``#`J`$!P*@!`@'T`?0`5`8YQLJ^>&O""8+][$EW:0HR#"X@ -M)"`````#````3"D``#!RKPT%G.*O@`49DD?6"`MFNZ^],V7Y>)_NT1H:DL=+ -MT""!IA7D8D3R@'FN$5$2MT;;CP,`/`$``#P!```"````10`!.%1:``!`$0`` -MP*@!`<"H`0(!]`'T`20'"<;*OGAKP@F"_>Q)=VD*,@PN("0(````!````1PA -M``$`_B)Q6^-=1/,Y7ZPG+>F>0TK0)N;W(`\G:#$@D)_&#$9`88$\=2IAA^/8 -M@;-\,]5R8/0V=Z%+2U)K;LJ($5ORW*H5@CWP$#4\=I!HFY/S%RP"S$B+UC/! -M+9YV&0Q&<#V9EJ[6!BH*,68K)RF$0=YW7V4HT'Z]S.`@$:J%`F -M!:)%#JU3@-)+Z1N;T@_5:2@_A8JB*H!LF0`K#T/1N -MK6O';&O""8+][$EW -M:0HR#"X@)`@````%````_"$``.`%TQP*I,*N62'5)G[Z;/*U,&8;GV;;'@& -M_*%^3.OHRW1X+<1?IPA+6YK:Q.4I"(T6D>/;OC>?#5L`J\8N_JM2.$#/)L*' -M=5OE<#B\Z"-$22ITR3],41*W1O"J`P#L````[`````(```!%``#H5%P``$`1 -M``#`J`$!P*@!`@'T`?0`U`:YQLJ^>&O""8+][$EW:0HR#"X@)"`````$```` -MS"$``+"&[E@'V%V-Z4Q'Q\>,&H9OT%9A;SS*WL2U#\,^@Y5`)DZYVE!#'36= -M9IS`#EZXRRV7=B<6>@S;#DRD"FY0UN00ZV6J$+[<46#D>H&'G"?OPQ8QJ(Y- -M-KI>;Q0Y-97(LV@!\4M-YULLH!;XLO^I:.>3I[<$B[=@;U(!JQJ)Q+1PY6P. -M-H@[WN)%P!D%.#"ZQO(7>6?O>9@;73G*RT4)K8AY_I%Q9.U$W,A'X/,O41*W -M1OC.`P#L````[`````(```!%``#H5&```$`1``#`J`$!P*@!`@'T`?0`U`:Y -MQLJ^>&O""8+][$EW:0HR#"X@)"`````%````S"$``+#[3[P4TFW3P3^;.;)E -MYP6(G5!3/6P"_$*`/">)>.#'F!\W-U6SBF>UZ1_V:-1JGP3L*S"GXG0(RN"E -M(-B5.Q0&E["M6E&O\29SH=+QR(PA*&S!$EXJ9UH0B]#56AY+T<'\MGIA/>SY -MZF?>29M.'5'_:B&NCPP[WR[@/QO4N+]N`7II"/(2/':F_SSN3LN'&O""8+][$EW:0HR#"X@ -M)`@````&```!'"$``0#K6B/ISAPY3F?EF.'W#K=*D2XECCB2Z&472R'L`M9YB`X-?.6"OWB_`R#E$6Q+K.#: -M^-)2I*;IR7/SEGA[+KRW\6`^0!#+M`-$MOF?[V^%0]8 -M>W^5^)0`&EA-P^1L,E&ZOMVP\/7:N*K^@TN"&4U4;*[T.#'<]?0,5:H/6Z]? -M,"J-`@FG/`QPZLSNDR(J4I*PG6L1$)/`N%T6R=7_,8=S'#,!"]R(N\!1$K=& -M?O@#`!P!```<`0```@```$4``1A48@``0!$``,"H`0'`J`$"`?0!]`$$!^G& -MRKYX:\()@OWL27=I"C(,+B`D"`````<```#\(0``X!H1&D9*S8:$X#N[TL*2Q6C19H&BK4U7CQU4@(5 -M,:TB8T4"CS]'[`IS?.BA#+FI=$H=G"!@P!UO[%8YHCDK]`(LG?@='*$WFHZ@ -M"]D(D((R?W2(!X9=*S/V=AHS:UD4Q_0[)85BU"1 -M*P!::@.^9:L3790UNBRLQ_+5EN:D].X2ME"0;(O/ -M.N1WV8HL<4;CG=%\I]RJ:(<=6&SLF8..FZ^/OY^S`#6FKL83B6&\N)'3@F!Z -MQOE\M(R;ZX#:7#*.A!(&$+I'$K+W_,^+?7!\?"!!HAZ![HJ1[MS"-ZH^4J@F;C=V@(7#MQO[`XT/] -M/7K\(@D_*M-1$K=&*"L$`.P```#L`````@```$4``.A49```0!$``,"H`0'` -MJ`$"`?0!]`#4!KG&RKYX:\()@OWL27=I"C(,+B`D(`````<```#,(0``L/M8 -M^EEWBC5D\+K&[4$GAR=U$TYL0R]PNJ74,EL^3:SJ9"\]]X0V3A*DYEGG:GAG -M<\N55G;8DG]CF^$$9_L-P)B]D6'0*V-6O;$U"H<,$.`.X;2Z/AM*YC%+/[I# -M#GU%#Q+'L,[3>+`Y]+X$S6O"2Z5LDDU)#JN3VPI!_5S"9S>BA8MM -M.;A#+'8R=$]C_6K=>8X&V?C=#Q]?J*![U'B!*06])-("[OQ1$K=&AE,$`(P! -M``",`0```@```$4``8A4:```0!$``,"H`0'`J`$"`?0!]`%T!UG&RKYX:\() -M@OWL27=I"C(,+B`D"`````@```%L(0`!4,2\>^?.8BZ_D"WA_L<_Q0YIFP+S -M*Q#Y%T\'1Q"..@I/57PS/WH7,6=AVW3SM56MZ[XTL&H?"*7*EAC-:)M.HX$= -MN/&TXZMT\@$AX^T4Y*1;YO],(!R)+I+]$>\)6`.MX77D@O(Q?HBHZ;>,)(X, -M[0#G=C>)DC;7VA`1``2[\I">[2S/T2J2:_1!X"`=7HW@OG1M$"`0E(]_=-D? -MV*:JDUL7B"FT$9HW-J]:?_(8,[O)HNNEG^JUA76)!9,JW0L=_B!;)W#2B2T` -MM6PL2>0"_>Z]FOO1H8".Y]`?X2-])H@$%7T3]>0RK"=LSA$DM>8PW#I,'BE; -MTXI!B@]=M32WO/4=.PB'$6=G\^,!$P]2E:@0;5'S>AR6'2SJA'N$J3B*AFR+ -MN<=,,34=O_"DU9A`:^6$P5[`23.4ZF>6[=.X)M+R,AV+3C:(09P%[Q>+41*W -M1L>'!`!<`0``7`$```(```!%``%85&D``$`1``#`J`$!P*@!`@'T`?0!1`&O""8+][$EW:0HR#"X@)"`````(```!/"$``2`108JRBF$W&/.1?IM- -MP`Y9^A;VJ7MAZ^/)0DT&H6L<`'BE#DJF1-UJ2B1^YP=!$A`)APXB]:CEVIJ\`>S?D_R -M'-1&2(E@G3$>C%1%UQ>SYQ_38L@RJX?V!*'H?H#3E5@.KZAKWQAIEK!!N]S2 -M@$Q@FR+P&^CA.&!59,&MTO*16T%P5MF]B.'#U4YAL>'2W11%5 -M,:SD9'F4S,D;!O.(:J:4)$5).A,P%QF1&X$LSZ*56V6B)!&4O_75HZ[]1%$G -M=+$,[#(22]8NU_ZFB9M$<*1Q$G*DW67UWP!7QW"LX)9D3E*A7@QK -M_%$2MT9.K@0`?````'P````"````10``>%1J``!`$0``P*@!`<"H`0(!]`'T -M`&0&27UPCC>):,.;R%A2W?7Z+W,N("4(`````````%PJ``!`&:;IH2\\?_-B -MPX]:VG.,%#S23]'-Z%B-ERIMTYA)]P*1L_074:PG0T\/:9SE*;K&N8U%E$2MT;9 -MR`0`;````&P````"````10``:%1L``!`$0``P*@!`<"H`0(!]`'T`%0&.7UP -MCC>):,.;R%A2W?7Z+W,N("4(`````0```$PJ```PY45Y;'5*-[[NDI*KR]HS -ME[L\"-P;D\-92SS+9:])MVN2V;NJ#7TF#ED4+'!1$K=&[M4$`&P```!L```` -M`@```$4``&A4;0``0!$``,"H`0'`J`$"`?0!]`!4!CE]<(XWB6C#F\A84MWU -M^B]S+B`E(`````$```!,````,#-8@G#9N-W!OF/S$'-EQ3_Y>IXN8'20@(UV -M'^R3XJG41*W1L;4!0"8`0``F`$```(```!%``&45&X` -M`$`1``#`J`$!P*@!`@'T`?0!@`=EH7]B)B"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``V]", -M0X9Q34G$-B>>VY3"9UNA9C:>WI7T5YZ)45+5D)\7TI\[J$G%I$PE90@Y/,!& -M'K>R\?HYE,2--&L\BXA:%=DQ#A(;8:,BG$W9?OL! -MP#IFCL/\W0H,SKKRSIF1F17D=P7D.-DS)S.8=AD3,I?UO8PI```D\32:!!F6 -M#9G(D!S[F/CH@[VHCY^L/D=MX^;;)`01!Z@I```<``!`!%!/VXR@:I4.O+>VY3"9UNA9C:>WI7T -M5YZ)45+5D)\7TI\[J$G%I$PE90@Y/,!&'K>R\?HYE,2--&L\BXA:%=DQ#A(;8:,BG$W9?OL!P#IFCL/\W0H,SKKRSIF1F17D=P7D -M.-DS)S.8=AD3,I?UO8PI```D\32:!!F6#9G(D!S[F/CH@[VHCY^L/D=MX^;; -M)`01!Z@I```<``!`!%!/VXR@:I4.O+]8R!GH=TWY,9O)SBH]I"^8MR8'>$*!4'7-N#B@F*=,8RP_!9M[.67Y[^\ -M;TESW?OI*0``)!0P\ZK-M`DT.KPAN$@Z(B72+'&1K]JK:P8-@```!P``$`%1&G-/EZ/'@^L]EG* -M>Q?G0I:JO-I1$K=&T4<&``P!```,`0```@```$4``0A4=0``0!$``,"H`0'` -MJ`$"`?0!]`#T!]FA?V(F)S$MMLD3T:"Y.YH>+B`C"`````$```#L(P``T('I -MC:DVAO%\VZGT`]1"EAK(GBH;92\]*#6)+0@>$1`%I\-@GRP*R\YD`QC-)WGA -MCC^1XQ="GMV2XW7@S@IB'H"!?V0R7,.X-/[)1D8Q6!2MQT!4T>%LI].RE5O; -MW(1=@7X_`MK>=U[2(2/%L;VQ50:IGZ?X'V"9!$6EG_ -MY0UMP:*?79D/:V6N=TU^2SXP^"XA*+MHS0+!`URZ@8C71J>[@J'8MLE&EFO5 -M(\LN\8J-[@U\T(A!31#`D@;Y -M0V=L/.P<5V$=R./N$CQU+"Y& -MAC9)(+HSR9)RWU8&N"`B!8XL!!A(MP1QY_$&&W2.>Z:$);Z;07;+4RNM'\B@ -MWE$2MT9]?P8`'`$``!P!```"````10`!&%1W``!`$0``P*@!`<"H`0(!]`'T -M`00'Z:%_8B8G,2VVR1/1H+D[FAXN("0(`````@```/PA``#@8TN+S#@$@(PC -M)D3OCU83N.;KREB385"4K"=>319%A9F&>O&$,1KI5M._7B=^ACF&#Y?N;B': -M_*2:30&17C1Y;8D=9G6CY?'H_9VP238 -MCLQ2@=!"S.NW#$M%)O%H@WQ1K9:0D_U\R"7NS;R.<)+_NLDF, -M0-5V#RZQ:2[N;C^X,V>/SU$U]0[K8]9N&41?74;0X;'M$WY;3P$,*JRY1/@< -MD=T'=;1]_%"Y`1:7P2$3`B23;/LU'@N[AF^Z4M;U6U$2MT;DB@8`_````/P` -M```"````10``^%1X``!`$0``P*@!`<"H`0(!]`'T`.0&R:%_8B8G,2VVR1/1 -MH+D[FAXN("0(`````P```-PA``#`]T&&Y>O[KL;]ZS>9OOHHG>;E>?\RC7#73^,I/-O<9(,HYXG+7070CO19`O2B=N=0V/G"(7 -M8`Y].-)@9=4JE^&*@US8K,UKSS\#TPILP,F_",!1$K=&T)4&`&P```!L```` -M`@```$4``&A4>0``0!$``,"H`0'`J`$"`?0!]`!4!CFA?V(F)S$MMLD3T:"Y -M.YH>+B`D(`````(```!,*0``,,R&*2I('28PL8*.B907>>7)U6%2HG*,Y`:3 -MV,?9#!!,ZQE%14>8*]QC!UL'L0=?C$S+\!#%OI>@L(C!H5/MIA`L.WC.-\FA`(0E^, -MY1NIM[O+;%$2MT:LS`8`/`$``#P!```"````10`!.%1[``!`$0``P*@!`<"H -M`0(!]`'T`20'":%_8B8G,2VVR1/1H+D[FAXN("0(````!````1PA``$`UE7` -MD<`B*5;E=Z*$=4.1SQ7A:#B%\*D/P$!UCH&/V"G%['%'0@)6H'@3]Q@[RM@( -MLV%SN-/9^ZOY=EXO[J/9@\>^!8/UDU4AY$/NNNLG@:QN:6@RG-G&)G0:+?/G! -M_2I]BF'.TSA_A2$VP5M`M,C]2MD.PL(B]$!+0;$<(0,']=9[D-O.'*4`*[.B -M_R>B\(3=\W.)LFMG"=G$GU\YA%%^4U%VK$M$6:$3/=DWN/`21E[,M8H/:C,I -MGH.>^80?GE'>^SJ:DK1D1^/D?>8IY)&P41*W1AO9!@`<`0``'`$```(```!% -M``$85'P``$`1``#`J`$!P*@!`@'T`?0!!`?IH7]B)BG$G[HWS`+8V(U^[_L_[JY&Y97=L?_&02N[B28HU -M7^&7>!#EV@Z06R^VP*%Y,>T;?<49.%0@X$.>V/.`8^E`%U!!"J_UXP<%F2EB -M',R$I6XD1/JE1\A/QGZ3JB*!($@WCR$BJ(T%&(,HR:8K[_Y[35GV2Z-7SP!\ -MMP_ZAK029M-^J?E*P_"\F/@8+]SJLB0^A\0_WM>JX)M&E9^?+6ZOP7BL1I6F -M$@G((+YGE#MV41*W1O#H!@#L````[`````(```!%``#H5'T``$`1``#`J`$! -MP*@!`@'T`?0`U`:YH7]B)BX4\HI^9^9P%ZKO,U@/;ICC/B=9(/O@8WSM)H3@$W[D6P-MMT41*W1O<,!P#L -M````[`````(```!%``#H5($``$`1``#`J`$!P*@!`@'T`?0`U`:YH7]B)BX!=SIU1!PES#9*#!<8K]_G5<6!`:7C:[!S/=NO[ -M%JT&AM7K=&#HP=/Q0),!5%T[O4/J?TBNJ@_2X/EFGDOGK9-<3`-YPZ[*.]N$ -MT2F(.^DLT7RC?GC/XFI='V;$41*W1A,L!P`\`0``/`$```(```!%``$X5((` -M`$`1``#`J`$!P*@!`@'T`?0!)`<)H7]B)B39%B"-&\V$&&OJW0!10+I,&%%LHT'3?QT!` -M?\6[6YC[[@#\9?\KT;E_KX9`GLQRACUKN/'XE+6=7!C(([8K707TX26'XPQJ -MVV7JRC2K5Y%I'(TM\@5141A]?$I9_LE%#E623+$]&"8*Q`IZ5=DQ>X7VT2#< -M-2>0,Z&^*K0RARK1'&=SY7;Y\V=9AW95H);?^DU0L$=^BXE1$K=&*#@'`!P! -M```<`0```@```$4``1A4@P``0!$``,"H`0'`J`$"`?0!]`$$!^FA?V(F)S$M -MMLD3T:"Y.YH>+B`D"`````<```#\(0``X!RRI]Z!8>CWW93F[/ZYWFL-]7#( -M).3!_ZY38@>72AKK&"GH`EZ9AZA!MD;^@-K/?-NRPZV-^Z.8I,'8*3=G] -MKJ`-$*?;OJ/X,)G[_P;[/#+%2B"V[KS51K*-(3MLZ1^S]R8N,DU)1$K=&)D@'`.P```#L`````@```$4``.A4 -MA```0!$``,"H`0'`J`$"`?0!]`#4!KFA?V(F)S$MMLD3T:"Y.YH>+B`D(``` -M``8```#,(0``L!P1E4F';12+5''4?"U@`&8D#AO'#YQF$`Q.1DF(#?XJ1W$? -MLD$._C,")>:Y`K"W]`T`TR86%LCO%16/:C>T&W3_6^P"JU"_T;Y.NZ@./L2$ -M%%PPKNIU*7IEUE(.G9Z3B"`QOJKRH,FMC9^,*%:N"IDA3TJ:V%?H64H^/CU,T<(YY;7'`JR,5Y"N\M74 -M)`A1$K=&WFH'`.P```#L`````@```$4``.A4A0``0!$``,"H`0'`J`$"`?0! -M]`#4!KFA?V(F)S$MMLD3T:"Y.YH>+B`D(`````<```#,(0``L&RC@[B9`,3= -M&PB]-F.9)CQ5O87AS,:45C,&_`_&LAM&51\G.JM`]C.PS^![;Z\1.JM:78Q,-:8*PI/[>U([N*,+*^V`XN9;,IJI#-%: -MO8Z`I3K=NTY]?Z<"Y-BO",N$GKGWID@N`"-7Y8M1$K=&/I`'`(P!``",`0`` -M`@```$4``8A4A@``0!$``,"H`0'`J`$"`?0!]`%T!UFA?V(F)S$MMLD3T:"Y -M.YH>+B`D"`````@```%L(0`!4(Y;JMC+G6JP2!&9/S-R?U\+0;/A-GM(VV<@ -MVY/1[&OQ/DQ1M;\/N>*3FA!?*$?]M3K=C0\8VUH\=()L_`(L[6:G%?4I$-Q9 -M%HO=80T7)96%@Y-V>%TWP+7/^E$G$FZ@0SV!9EPET51V%),#8F^3B]D:"I[V -M,"2\[""MM')HOXI7+PV:S&L)Y<\9Q%WXW+A\HT@I[UZ+&Q/B='!H?B2+I%$5 -M!4.Q?R'W(V+86.D@)[:XTF>K6*"*`-9Q;"(KC*2*0V/=3"BQ60=KFRMO`%L2"[ -M;$$B_`/DXRAYE(;!&P039NG9:4IW4"WXN]L&D$[YD"N@#MGHDFBE0\#\QQF/(K+I'GV=K^HS(Y$PI&L?O5G"]#:HWHPP9L) -MKN8!T=_T&_?K8IRMFT_9YMKSQ_H[8;"2]_83@`W)L%(5)/Y&H\,-.8]GI[T. -MNB]>E<3X8",]Q#Y5L,`Y<,IV_IA;WQ&Z#9NN(W.)REWJ[2!9DQ*H:3GR2&=# -M`=VQY.#O<,3`Z -M#HYR'P89HG+\1I.@S@7)$+1PS,P/:/5:U6GG@I\(LI$L%]+Q$!+&;;T<@U'4 -MH5F"A4Q0*8]I85+91E`:V1[5#8&=Y-?F%]M@.\ZYO1+LQ+>H<^&%2+``!`$0``P*@!`<"H`0(!]`'T`&0&27^G -MBN'B442@G&%0YFP\G@DN("4(`````````%PJ``!`/@V;Y/ZEX)OMX1-U+81J -MN>3L'+P?HX.`BF45<4C'!'4'[#IIYQ/'S_FS@)XY.9F+"5]_F -M41*W1C_Z!P!L````;`````(```!%``!H5(P``$`1``#`J`$!P*@!`@'T`?0` -M5`8Y?Z>*X>)11*"<85#F;#R>"2X@)2``````````3````#`PE((3NK#/F*SY -M-K[^+-"_A`'Z^PRW!)[5XF,].6A:]F@[69S'E%G5IKA#W5$2MT9V"0@`;``` -M`&P````"````10``:%2-``!`$0``P*@!`<"H`0(!]`'T`%0&.7^GBN'B442@ -MG&%0YFP\G@DN("4(`````0```$PJ```P_P'O&M#^79"&IC]T,X^L3O`_D;F` -M_`_O+CO!!-P&78&R#9GGGA@;UR#17H51$K=&41<(`&P```!L`````@```$4` -M`&A4C@``0!$``,"H`0'`J`$"`?0!]`!4!CE_IXKAXE%$H)QA4.9L/)X)+B`E -M(`````$```!,````,&+72ZB52?8Q@2BS-YS"D$5C1>""O"*B"=H-9S7E2I87 -M_^'4+U`,3A*&N,7)41*W1A03"0"8`0``F`$```(```!%``&45(\``$`1``#` -MJ`$!P*@!`@'T`?0!@`=EZUR"OJ@K*@```````````"$@(@@````````!>"(` -M`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``CG&L8G#,+L*; -MJZ4,,''$2#9Q=5E(UK/WV9_664/9J-RKOSB=2WGX$D^L!>J-9L4_ -MR>V_````'```0`5"ICC(!R%($77LB,=P06VSR3;[!E$2MT;I(0D`7````%P` -M```"````10``6%20``!`$0``P*@!`<"H`0(!]`'T`$0&*>M<@KZH*RH````` -M```````I("(@`````````#P````@``!`!@````%,"OZ&36$=Y^F<[J2&K4K) -MF2OD'5$2MT:X,0D`N`$``+@!```"````10`!M%21``!`$0``P*@!`<"H`0(! -M]`'T`:`'A>M<@KZH*RH````````````I("((`````````9@A```@``!`!@`` -M``%,"OZ&36$=Y^F<[J2&K4K)F2OD'2(``'@```!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``CG&L8G#,+L*;JZ4,,''$2#9Q=5E(UK/WV9_664/9 -MJ-RKOSB=2WGX$D^L!>J-9L4_R>V_````'```0`5"ICC(!R%($77L -MB,=P06VSR3;[!E$2MT9+5@D`4`$``%`!```"````10`!3%22``!`$0``P*@! -M`<"H`0(!]`'T`3@''>M<@KZH*RH`D-AJ#!2,2_RY`-7E"L-<7UJHVM5-$W@DX& -M/PB%/CHK77/L&2!I6U)L:QAO,$:K=["*"[*/]&A-OM[/)K$I#W%JN_XQ(]A^ -MW[+'`'P`&.V6$&V;`N[7B+?W<_)U8N?3+CM)>L_UP@9NZC>8^]@T;W]N,(^Z -M*0``)"82=']<)T!DK%F)52(TVQ^?1,NI&:P:^#[MH(-`<\;"*0``'```0`33 -M\U=/>PUSANR>2LX/GQ*R-Z6;UP```!P``$`%[D#I35[J=N-6L&K+XZ`=(YNW -MN#Y1$K=&I84)``P!```,`0```@```$4``0A4E@``0!$``,"H`0'`J`$"`?0! -M]`#T!]GK7(*^J"LJ`)#8:@P4C$OW+B`C"`````$```#L(P``T#J^\5E\'4D@ -MS0DJ(WQ@::O^43-(B'T+NO<=R&XF4W4,SI*98NJ\@V](W1;!Y88L4BD2L(,F08S2 -M*NK&Q\\.27L3N)I:-9E+H#J%KX7#/DSH-CIE,75I?YJ['Z`(Z6&&9MI:DSAC -MNO0482;M"'_]0B#67B/+2O:4#CR0UF(,U)R5A4)>A.$;S8.+.+IBC2PJWRI< -M7W/7<.#4<3>TGG]^**'F=U$2MT:#G@D`O````+P````"````10``N%27``!` -M$0``P*@!`<"H`0(!]`'T`*0&B>M<@KZH*RH`D-AJ#!2,2_,W];AYE=\+31T&TS\YCO%X]6[JF=>#'.SB3F?F<4^;#P_;C!U* -M'HJ'`0#-2A4D2XYU!B`I*5N_'7$R]!4OM3=%4V/B&"V*-;%QMJZ_7Q+9=!>3 -ML7$T>Y\2!MK+Q5&.%TT,(]EB$WWO#7*?IMW-(!QIUUM;F.A8%W0.#E$2MT;9 -MO`D`'`$``!P!```"````10`!&%28``!`$0``P*@!`<"H`0(!]`'T`00'Z>M< -M@KZH*RH`D-AJ#!2,2_?!"%LIL:!P1?UA\B4I8A"V\I;3"0JB\7PS3'U3>^]_DZP&W>GGN18 -MRT,(:.!LW1>X-KS`"V/P?Q>)R%UP:FX]>E$2MT;=QPD`_````/P````"```` -M10``^%29``!`$0``P*@!`<"H`0(!]`'T`.0&R>M<@KZH*RH`D-AJ#!2,2_>DD.EW)35=M,^2!U82V5C?,^8C!A-C6D%N% -M]EHXKL@7;+&^M+589U91-G^BEB(#25AIKRZH]EPIDDD[&I>+9HA0Y72Z2/J<+=5-Y-[3FQ?ZSCCS]A&UPI`)H7 -MS1.S5&@MO-SA9TI)LTNS -M#:][1'R"6^8-"4D_]RYK[F:"%ST2+`M1$K=&L=()`&P```!L`````@```$4` -M`&A4F@``0!$``,"H`0'`J`$"`?0!]`!4!CGK7(*^J"LJ`)#8:@P4C$OW+B`D -M(`````(```!,*0``,&56RD8+C"E)_T'W$>A)!:Y<=U^FSXVT+^QWO.!WP$@H -MG&R\/\BOT),LL$++41*W1JGM"0!L````;`````(```!%``!H5)L``$`1``#` -MJ`$!P*@!`@'T`?0`5`8YZUR"OJ@K*@"0V&H,%(Q+]RX@)"`````#````3"D` -M`##BPMZ.[KC!Z<&,T,"`59<^P!:Z%JM18>W_*Z1NP%QKH#^LW_84=#'\E5E* -M-U$2MT8B"`H`/`$``#P!```"````10`!.%2<``!`$0``P*@!`<"H`0(!]`'T -M`20'">M<@KZH*RH`D-AJ#!2,2_:G@^52P.O$54C.BMS#BC[TKBPG-F0=FCFXZ@:N%^[F57)YS0*9!7Z* -M@QQ#7EJ-[P@ZD8T=2Y<5P+_@KVMV"KF0.)<%G]G1]SJ#UH6^I<#T0DMJ&?V% -M:$P!#H"B$2%TD*?NQ,\0YU+Z>[%E[%VS/0@8#5CS&+=X64F)+9^,/Y4BTINX2 -M?=[2'(42,*OJ3$BNRW=1XQ#.>^F#XSSE'][ZUOWI\96T0[([MX^Q%7FF?ZI7 -MM_^);ZMJS6F2D#!4]![:/1%'#&^1/$;W/FC1_\;MA\?#:^WWE)9\:N]+G#O0 -MN6[0.0B5E$1CJJ6L=+V4D`,B9-RER]?W!0\S#=!/7IR8E:UG]QF_ML6;>[%W -M3"?741*W1C$J"@#L````[`````(```!%``#H5)X``$`1``#`J`$!P*@!`@'T -M`?0`U`:YZUR"OJ@K*@"0V&H,%(Q+]RX@)"`````$````S"$``+#I[LUBP$X. -MD&]*'\LV1O"0[7^%7I3I!9U.L,IVC/RX>_C>=YEEN+"`I]!$U$+ZE7YI_M!Y%'$=B$I-E_OO8!?!-B^G`Z[B+4IA]P4C"B_LVXI -M%_]R_#DKU@.@':!".SN;*GB8`9_R%8FFL)T%+87?U:8D9F$YU7W.[34L!V,H -MBQA/#R\_81&!T?W<>3K3S0A:(74QH!`/>P$'TF3841*W1B1."@#L````[``` -M``(```!%``#H5*(``$`1``#`J`$!P*@!`@'T`?0`U`:YZUR"OJ@K*@"0V&H, -M%(Q+]RX@)"`````%````S"$``+"BWF2ULHL6D45,^`"Q070!4N@2"KR%F,^N -MUK@TFFQS45.8?LTDH=/`I]',Y3]%!4E\'>8#L,+:GFB'X8CNNRH"8QL375LR -MHVB%'IZE7C([-D9$?T1\=Q>F\CY9-PTXY,.7[_5JAR&R(.Y?WWP"8/+$0HO- -M22%#]:6XXBA&#\K#;,]>CJ@Q;GY4"?881*UAMMV41*W1LMJ"@`\`0``/`$```(```!%``$X5*,``$`1``#` -MJ`$!P*@!`@'T`?0!)`<)ZUR"OJ@K*@"0V&H,%(Q+]RX@)`@````&```!'"$` -M`0`"L>$PQ+),.,(X'NY$'O<;TV2SECWI3M0O'0H[P-([9>-07(XO>+&Q(D@A -MK+STZQS];J"I;]@80U!>.T$=>$T"^3RWH`R[+,[)6%ORBG/Q%;+3*B)Q%T_# -MUA+=+$7-=)/7UO^@16WU?Y-Q3>PD8H?\YEBJB:I8,CJB7%`IJ*;EQHHB^9YI -MRS_$O*[D>+2_LN=;ZTIX4:1&E9T0>".$#)PE/)!9I/-/#JG:T:"N&\Z%I[]4 -MH26-!7I_A0RN0`$>37[B?^UWA8B8&LF^??&%=$QA%0JU^PI"#OPW`V06]+"KO$YL>)[E1$K=&U7`*`!P!```<`0`` -M`@```$4``1A4I```0!$``,"H`0'`J`$"`?0!]`$$!^GK7(*^J"LJ`)#8:@P4 -MC$OW+B`D"`````<```#\(0``X*!SKOF7=EIS#3ZG^:&\A%XR'I$1K`]]83E= -M9IM"($4K5'+F"1,FDT,22?697^&8K&N;TL"!_K\"_Y6;;[!SE+ER]*?-JVB_ -M*<;2BY"=#'!RG<"2[RH_2=]#3OG,^V^S[;6KLD6)T`5OS:27-$B67FX*3J7\ -MD6SMNT2EA&K2*!#L4KIQ!&1:.%T_EO7T_Y\%[V!`K&#*K_KOX,#&C&=1$K=&*X8*`.P```#L`````@```$4``.A4I0``0!$` -M`,"H`0'`J`$"`?0!]`#4!KGK7(*^J"LJ`)#8:@P4C$OW+B`D(`````8```#, -M(0``L)7N=!6$1B&KP'G6(0WL@%4:W'.$`YP*EM(+*4/"CXC5K<>DE-1N\0UB -M('!*`(]1E[U:':!*R#-6$U6O2!NDE3MS_9,"9Q.%)WV5CM--?SPZH@"+\,"- -MZ?JPM[75Z=V]R*?)4Q?>$P607N`5@#9LRN&.US4M3XQ4+EY[:)AO<8F9"Q0#:WCEWAJG:=/SJ%S;W&S_/=[DK -MA`9S@ZA/>PYI:0=27R4?A%Y%SZ9R2@"%TN`4QY7+'G;LO<^/WQC'5I)":/7F -MTZEC:%31-0&^B[E[4E -MQT;J@X>9[W:K8[D)JXYCF)NE_GE5+5QZAIH!@%E\94Y[Z]#QZ9_ZZDJK.0TR -MYG2B38B,)$8.=SS+594>T$;V-Z:BT9TI4O)H4[UCF?A+S\F8Y[&%ZT4CV#*) -MEJ^82.23^A?:=&U!J&2,SFJ00N)>;VG7I.#E61`E^T#GW16X:"+-+*PYH`V>\A--!JJ:/>AW@YX&.!'>TR;,1MDHWG=(M>,941*W1FD$"P!<`0``7`$` -M``(```!%``%85*@``$`1``#`J`$!P*@!`@'T`?0!1``4%?]ZZMWDSBS7I80X4.]Y`[.K+=2P -M0F%(X"Q?>M9*[E;#0P?CXM+%GIZ3AU`P[.[V/:HD.K8%8TX1VL_+>]WK/:W^_W -M](A27RWQYH.%2I``!`$0``P*@!`<"H`0(!]`'T`&0&26\":1;X0FW' -MX$%GJB`Q=O0N("4(`````````%PJ``!`\_2*GPLS`AW^DDV!MW1M3ZH*L//J -M9#P0-/=^8*ANW<.K@$C\`%BJ(#%V]"X@)2``````````3````##U`/>GR"#301U=NQ(@B010L`;````&P````" -M````10``:%2K``!`$0``P*@!`<"H`0(!]`'T`%0&.6\":1;X0FW'X$%GJB`Q -M=O0N("4(`````0```$PJ```P.;B(O056IMP+*!.9?CPNT,M>.7B4,/DHM=F]G29X6_FDR#H8 -M#1C'AAB"41*W1E5.#`"8`0``F`$```(```!%``&45*T``$`1``#`J`$!P*@! -M`@'T`?0!@`=E'6+<8?"WKJ(``````````"$@(@@````````!>"(``'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``F'+"+H.B\O\45D -M;,`\,S[IU.NTV`N)??JA/X13J@("LVJC92]Q]5F^G;#/=_],M,9"'NEJ]RJMQ;/GP@$64:!3%G!5-SZ&_!(<;U0W)HX0F -M66J\L7"E8+8DKH/0[VD':0XQ5/<[SZ0I```DI[N&KX>6X.&S2W"15BW^':32 -MH.PECYE\(!MFT'2%?RPI```<``!`!'BCM%8.@B>6<5F[`'%ZB.9UM:,V```` -M'```0`7).UL/H?5O4^U@:RT,+8N4YB2X=E$2MT9I70P`7````%P````"```` -M10``6%2N``!`$0``P*@!`<"H`0(!]`'T`$0&*1UBW&'PMZZB```````````I -M("(@`````````#P````@``!`!@````$163D8L;P@[#\WC.C)=&_@27JT@U$2 -MMT8(;0P`N`$``+@!```"````10`!M%2O``!`$0``P*@!`<"H`0(!]`'T`:`' -MA1UBW&'PMZZB```````````I("((`````````9@A```@``!`!@````$163D8 -ML;P@[#\WC.C)=&_@27JT@R(``'@```!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``F'+"+H.B\O\45D;,`\,S[IU.NTV`N)??JA/X13J@(" -MLVJC92]Q]5F^G;#/=_],M,9"'NEJ]RJMQ -M;/GP@$64:!3%G!5-SZ&_!(<;U0W)HX0F66J\L7"E8+8DKH/0[VD':0XQ5/<[ -MSZ0I```DI[N&KX>6X.&S2W"15BW^':32H.PECYE\(!MFT'2%?RPI```<``!` -M!'BCM%8.@B>6<5F[`'%ZB.9UM:,V````'```0`7).UL/H?5O4^U@:RT,+8N4 -MYB2X=E$2MT9-D0P`4`$``%`!```"````10`!3%2P``!`$0``P*@!`<"H`0(! -M]`'T`3@''1UBW&'PMZZBH5%O`JLEU1HA("(@`````````3`B```P````+`$! -M``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(` -M`,;V0@06RNL1:H8R&D+_9U\Z-[-'6PXTKFE\;,,T)AU_TG.#-"YM(NQIP73[ -MVFPFU:E]\;Z@O[XW?SQ1!`%1>_YXZ0;7X(P*\<:S*OAO)=H$!*0'*LC&_RE" -M?6GVDNZ<:R3MVPV.=LWU5_TL][\0"0N\WRRV):F-G`N?)_5(5!5?*>AV*0``'```0`2(K2XDR/(" -MF$+`UW5#&"XY\@```!P``$`%Z#3R05*A>!J>[)2.7NG$3+GK^4I1$K=& -M)[X,``P!```,`0```@```$4``0A4L0``0!$``,"H`0'`J`$"`?0!]`#T!]D= -M8MQA\+>NHJ%1;P*K)=4:+B`C"`````$```#L(P``T%.MLL'U09PR^I,2?-*> -MES\"K:]ED6EK>C=:.X*BV'\P28:RH>Q@08>KSYFI+_5/>([]4P1%^H%0+2PQ/F@<$R1A0C^%LD!]W7Z -M5GSOG6`T[\B0(?_M,Q3FEPOMY*I_Q9Q`=^RZQW/,U_P5K@P(6FVXQ%#`#G@` -M#VWX"EHH#/Q&%6',_JR70D)&KF\S`D^#F+A&I9Z>52")(Q[ -M^],VWTH^^G;^$XP6))-(U`=S07?.G,6%_.F`D8;C(^GCV__8A6?L6!.X+7AL -M<9[#<\E@_-DC%WX&BZZZ.LCO(\!M@D&]&24GCQ7OQ&R`#5$2MT80]@P`'`$` -M`!P!```"````10`!&%2S``!`$0``P*@!`<"H`0(!]`'T`00'Z1UBW&'PMZZB -MH5%O`JLEU1HN("0(`````@```/PA``#@=),)4J,ZG4@3S^94O<8=FJE$SLH^ -MU)G+J(V)7L1SHJ6L.<;NX'D4Z/?V@^]2B.*C"8!+@5M)-*8H$[J#'LEV\Y*T -MV2'RV?@L0I=#4.>JBF=?BL%7#B]G4P0ZVS4`%DECTRU#!"1W)=#NXX$1U3L_ -M!$CRP.T55GGKT909@"6%O3NM;< -M;41]XUR(:QS;^UMS:K0/FL9R2E$2MT9V`@T`_````/P````"````10``^%2T -M``!`$0``P*@!`<"H`0(!]`'T`.0&R1UBW&'PMZZBH5%O`JLEU1HN("0(```` -M`P```-PA``#`_FV\'@?1D5.;-6QD1:\BM=@Q2GBTWP*@:_0*EN[HIHXL;2;* -M!-+L_;%']4O<^U`OW0 -M8"*D9?->&"SI&^UDUKA[?LO&V>YH\5!9)^L.^FBA97\4`R./EUI0CE@`FA_( -MG00"%F9;'6414UJ3*;`.*H,EC=AD%&.>WP*8D,-`8\2KZL5?L%('!M+#&`7H -M]&M'VK64R%^4PI$!,+_!'TA1$K=&20T-`&P```!L`````@```$4``&A4M0`` -M0!$``,"H`0'`J`$"`?0!]`!4!CD=8MQA\+>NHJ%1;P*K)=4:+B`D(`````(` -M``!,*0``,`#(%HGT[3F@JA$$.U6X)Y0>\7`Z/'>#\O`!OWZ26O,'H)!WF4GC -M/E>KWX[Q41*W1NPH#0!L````;`````(```!%``!H5+8``$`1``#`J`$!P*@! -M`@'T`?0`5`8Y'6+<8?"WKJ*A46\"JR75&BX@)"`````#````3"D``#"KB0Z/ -MR\$ERV_>9X0Z:C7[HL(FZ$5KT;2N8IR%>=-4G&VC06Y%H%AW;""IQE$2MT9] -M1`T`/`$``#P!```"````10`!.%2Y``!`$0``P*@!`<"H`0(!]`'T`20'"1UB -MW&'PMZZBH5%O`JLEU1HN("0(````!````1PA``$`GCV9\/2K-09+EKR=7,?; -M+8=K_]-1RI`DCG43#)W/CG%)YJ%%A>CJ -M[=>'@&F&A9,7>G2<+J9NS5&@N)WY8V]\M0=R(V-E(TX??$\B*_>/B%![QAVC -M;$?Z+]^C>JAFSEQ!.00:M>!)*$BW@8;0'="BM!B7KV@@E9\QD6N!]%+\4V;P -MU'N0K2B+3NL!\[:VUQUB8SR*L(Q[*8;BJ92K`<7FI)KPV(AP!V)F7,.]09D;L(FD.T5_TV'+A8 -MCS*[2EX00Q[[\22$41*W1F!0#0`<`0``'`$```(```!%``$85+H``$`1``#` -MJ`$!P*@!`@'T`?0!!`?I'6+<8?"WKJ*A46\"JR75&BX@)`@````%````_"$` -M`.`$L)3ARW:^MIM[](4!?98^[2&I(7XJBP9RD)@,6R(;\M^_\FDL@A<7Y$5C -M9=B"^*[QC0"$#]WLOS[QQAZ6,O@K21003O2<"$%&\%&Z=1$SP>H3U_5@E8"* -M'P%^RYEKH'9,[`/,:\+*K08M^+8'\&#JUP;RP/3=J5)1A!=!W%<)K$ZW&R2A -MR4"5?V?8].)6]N;/>)=G<:4[X%OS80-&9WWMTDC;H%W"6D9;5!-+5)>98H4? -MHXX6C$\19).5WF.A6ERZ/8-';#R3?CLRY_K]-AR*@YY68C4L`BR@CR7F41*W -M1NI?#0#L````[`````(```!%``#H5+L``$`1``#`J`$!P*@!`@'T`?0`U`:Y -M'6+<8?"WKJ*A46\"JR75&BX@)"`````$````S"$``+#&ZP>R94A`3_6RSCS^("WUJ6X#D"3_^`^(U]2<6,84"5U[(G!Z`V/IUON4#<*& -M4,<[&7AYY*=S3;XXW`Z.*TDI;Y>U`&;?\]AM&#SHAL%6\!0,]LJ4:$)9G[)* -ML`_S\1(#+P+*Z>P8=!0)=)K=3H*_745K41*W1C:##0#L````[`````(```!% -M``#H5+P``$`1``#`J`$!P*@!`@'T`?0`U`:Y'6+<8?"WKJ*A46\"JR75&BX@ -M)"`````%````S"$``+"TN@H0Y,8%JX[ -MIM;56`+Y&'H]A-_A5C+#?M%;11Z,$/8E6+J@*N!5N*Z(?7` -M+9"&/S>6.7_^1L.[_6:^.!;W6?$""C>5N<4\&:N64KB\98\:OP9<7`B;`=4R*K^L8Z/O<'ZS_K)1L.A>]J".G:0]D4*OA -M(K)3S'`I$B>$Y*5GPEH!8H;"E=3848'R%*TG4..YHU64"+[-:&833=$V9/4[N4O;ZF/&2Z6UW&>^(9`<2 -M=TN\\0*N!4W'OBZC-K>7\,99>G3;Q@%1Z"K0-',@LXVOK85,YQX#.:,<&QOX -M@/]&HJC5D\[>\$73;^G(V?EE\E9UP/M1$K=&GZP-`!P!```<`0```@```$4` -M`1A4O@``0!$``,"H`0'`J`$"`?0!]`$$!^D=8MQA\+>NHJ%1;P*K)=4:+B`D -M"`````<```#\(0``X.@D&=#67J"-ZM`K4VT]>8AR8-GUHLJ7V:RSIWBK\C2-)WUOU4;J^GD'2CSH&J*"C -MQT]\N.2^X!3:NWU7]*KG9[4"'$@H_717RBF>PUS`[?*'2>PQCI/CD`0Y[/#RN&;F6$*<9_C@-JKG=1FA2 -M(1RQ,"KM7S1G7.@I!!`TLXK@.O$;=.$Z:LW8:U,"LNLO*+,@2X'3=+1AA.=R -M/H8XN),"X=!1$K=&'[X-`.P```#L`````@```$4``.A4P@``0!$``,"H`0'` -MJ`$"`?0!]`#4!KD=8MQA\+>NHJ%1;P*K)=4:+B`D(`````8```#,(0``L(NJ -MH/F";8\V[$,'",\Y]==14[45C4[*6T^WPY7T=7WC:0Q'79#YEIB3D82RBR6M -M!>$EWI3XOQY=,-)NU[OY:-2C!3@SDJ9:8HXB)AD6%AO6C-)X-IQ"!A`_!`UI -MAX1UGL0`2V2%4AW*S_O6:&;[$@8\]TBB2[LB^X7="BI,G[&1?BTM=7\K/5K# -M\E#T*WAT\KM*O)DO?]8E,S)\^E!XE_<8PQ4&>"NC4FOJ(G11$K=&@.$-`.P` -M``#L`````@```$4``.A4PP``0!$``,"H`0'`J`$"`?0!]`#4!KD=8MQA\+>N -MHJ%1;P*K)=4:+B`D(`````<```#,(0``L&]TD')@;_F)+(F_KJZ%0E_,/YS@ -MY>SDJ,,U>U<6=-:$ND!6V%\GX_K/9A_X,8S/'8-//@K5G9%T\_X0S4D"MC^G -MLT1+Q,-,I*7@CV4DT?=Q=>N,4(LBC>_C&.<,H4!ICC*%V%5N+CW(A/6;GOZ!]!TW,K-B -M[*!;RL^$(H'5&-'N:\(X0K91$K=&^P8.`(P!``",`0```@```$4``8A4Q``` -M0!$``,"H`0'`J`$"`?0!]`%T!UD=8MQA\+>NHJ%1;P*K)=4:+B`D"`````@` -M``%L(0`!4/%1KJ5!:)2^P_X4\1/VDH]SHL$_B[^Y!+>:I1-5%45CZ&,SSIN> -MS\BCIC=2X08NX";H:C466\N"\++GC4G0;T/C60PFZRY[.J-(0>@_ -MJ]?-FT*>OQVE_R"'9%JZ\W`9"K_F -M,R"G@_;,LI]LHT)3M-+-6M([^=T>!BR:^:)J$--1CK04DS)+4V)2\USLZ'PK -M*4=A#WOH`^^QP`D)(`$:O?G]`@("X6O@&J&6HS.M_;A9%0OMGC^/F25AAFYD -MX6\B3F3;C:]R![+/IMH1.;A`*`X]AE/P`Q]>S=H@RMB0W_N_020'>)2B`3D- -MPLK057"&\3=+CK]A)-!W%Y(//URYW5,81)19"-6]^!PP-U<3P"6/_L9N3S&I -M:_%)TT*!OL)?1\"$_'2T9$N/O.7:V6G6HC3,J[$K\7X&&.L7[,CU-%?3&4I4 -M^>RK9("RVH*K-$<5V&OZ9/>DYL;V@U'\'V/B_5$2MT:,8@X`?````'P````" -M````10``>%3&``!`$0``P*@!`<"H`0(!]`'T`&0&24#25E%JNL2TH58#`,U+ -M7T8N("4(`````````%PJ``!``E9W5`\XR64PHHRQFDYRPLOV[?TUNX(4/W2> -M3C\406N%6BKF(18NF'6O\S*RVIS\?!_:XO-Q.R6?&CQO41*W1N=N#@!L```` -M;`````(```!%``!H5,<``$`1``#`J`$!P*@!`@'T`?0`5`8Y0-)646JZQ+2A -M5@,`S4M?1BX@)2``````````3````#!524`,Y4DSN',YG09+3+#N-HV?86M2UV_W-W -MO'GCY!W=G&/)Y=A1$K=&:XH.`&P```!L`````@```$4``&A4R0``0!$``,"H -M`0'`J`$"`?0!]`!4!CE`TE91:KK$M*%6`P#-2U]&+B`E(`````$```!,```` -M,..H\`-8-\0C8OE3L4W/G*U(A_T6.?$E'Y0UJ%E+PH984OHP\A8<)4:4'/$E -M4A*W1KI'``"8`0``F`$```(```!%``&45,T``$`1``#`J`$!P*@!`@'T`?0! -M@`=E9=+>Z5P$3!<``````````"$@(@@````````!>"(``'@```!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``J+X*0K*NAS2>ZTO[^@%_88"";E" -M1ZYMWCP3,I#[J$F8$$VZ:HP@U%,ISB*[LF!;/'3&Z&5/D/TZF-R.U$->PMI3 -M_-C2TW%1)+O;I6_-5(2MT:(5@``7````%P````"````10``6%3. -M``!`$0``P*@!`<"H`0(!]`'T`$0&*672WNEAS2>ZTO[^@%_88"";E"1ZYMWCP3,I#[J$F8$$VZ:HP@U%,I -MSB*[LF!;/'3&Z&5/D/TZF-R.U$->PMI3_-C2TW%1)+O;I6_-5(2 -MMT8&T0XP3*<'R?@` -M<<]E`<0X>[FRHWLG/ZWP8)\I&!YWP'"6P&WX%UU]2\!^*0``)-\HO3;Z3C"B -MP5,H9&LX,L02@)P3J--+BQ33U%JO_&O8*0``'```0`2ZR71",5EPT/U6-YK< -MVB,8H+IL+P```!P``$`%F!.LL3[40U*#%;R#78<=)5OG6(A2$K=&V+H```P! -M```,`0```@```$4``0A4T0``0!$``,"H`0'`J`$"`?0!]`#T!]EETM[I7`1, -M%]0?33O#H6HE+B`C"`````$```#L(P``T*WQ]:"**O-VL&PS>0+R-DFG3YV^ -M\#5?$I:;5\YK)IK*=Y=C)@*T\$*`2<=%T-J#EWBIRE57Y(8QN(-KJ[AU\IY5Q$T.H4=^!^OADZ:Y)R\2 -MH`&5+P:&B/8F-!V1_7GBQIGN& -MD7S(A%29KWP!*(GE5W<*`&]?_(T2\*/)<+E`]W!-C9@]DGY084_5`OA.&;T" -M>K)0P=TXW7O%V]MJ=_6J,7)C(+9\<;I]TK+0OW,G(2-Y77(&:_/URAQ_TRW6 -M]54_1]=0,?%S(31'>])EV2+Z+4(0:3(@`@/ -M!9]%8GXJIL](P<',N%(2MT8U_@``_````/P````"````10``^%34``!`$0`` -MP*@!`<"H`0(!]`'T`.0&R672WNE+Q7_O^R!],+3WS#K7U!,/XA*P* -ML`*LQ+AXTI,$&?6S,AL7'1.(S^U.'2^UK;8>T6O\.BP9EJRL<(9U"'8[7Q59 -M>9Q#I/U7!+&6EQ$\"1"Y$C]K#^1OY'VF/*0N-5K7N\>TVN'H1Z+,3B+'D%OL -MO:48:J9B!G_?32F&&/=K35*8?ZC+7$QNQ2%:"\VUJK^(#M*8%7,A&=:I3:*A -M6A7%8F(P-MBA6`!2$K=&UPH!`&P```!L`````@```$4``&A4U@``0!$``,"H -M`0'`J`$"`?0!]`!4!CEETM[I7`1,%]0?33O#H6HE+B`D(`````(```!,*0`` -M,#$[/UE.I9J4KXQ,P!&>IL!:*NDDKZ6#4Y)L`-0*54$5PM?\.8,A"/BX^`3A -M4A*W1C`H`0!L````;`````(```!%``!H5-D``$`1``#`J`$!P*@!`@'T`?0` -M5`8Y9=+>Z5P$3!?4'TT[PZ%J)2X@)"`````#````3"D``#"\JSKM=J&1L12Y%$\RWP:6&'YV7;*96UQGK7QDI/ -M,O9)B')+_H$F6D`)XS>#&^B0+WRC^[=<8['7/)MC7NM5HQ=0;4!(S&(;YRK$ -M54H]==O5?XKUG49+[FS12M'3X]7.<_F;[-D>YO1ZCQ:')@'RTI%[9_F+2%J4 -M`:?H_:FLF]&(MO.GFGM53PA6E.=Z5P$3!?4'TT[PZ%J)2X@)`@````%````_"$``.`CD,/) -MW`R-2XB??HNBQ-FSD+<45E,P)AS-)EQF`/A,'G:&"R68.V[W^4=8PSN%BU<9 -M-:#6U"\[G(=)91GD^H-]1>B)0M0#=Y8#!!OIXVHW7C#B&:(*Z76\+0.\;4V-3U^[O%$+5H*X\7`^+5"!$"GM-3+@"%HO^(KS)CB%Y))<>EFB6>C%=& -MVC#GBS#/"ZK-]]@"-:X9!;)*,@26A*'#=&UUFJ6`7,;G'6^YEM<#8FI,@#P+ -ML`QX2^G>SXRQWN)92/_NZ\;4M^V!W\OF4_J55[]2#+WEH]^H4A*W1H9?`0#L -M````[`````(```!%``#H5-P``$`1``#`J`$!P*@!`@'T`?0`U`:Y9=+>Z5P$ -M3!?4'TT[PZ%J)2X@)"`````$````S"$``+!`KJX,)=$(3O"VT#@*@M<=DR;1 -MSF6<9L8^/K\T^0U2"+]U(@5[!>0HN^'M5.J3C![@>C9I$A6_0V.DA/3(L^B& -M`UHFQ0&,%]MV)3?E4T:6=E38NIXRR(=#A[)2+HJJ;&FVDTQ>B6;R@\WW+BC5 -M)H=:=WMA:.ZH9)_?%MP*1R"W_;5>]52?AH0`+]0>`Z.);/&!"LF[02_QZ5P$3!?4'TT[PZ%J)2X@)"`````% -M````S"$``+#4HDUJW/'Y6(I)=`6\[_ZRX!/U&Z&KB)$"F5DP6;`[)DP<\V6E -M;Q7Z+6%JPAL43\#[$H5VDN3FS+8I6NQIO%/)[K/!+F`-'Y&0&R=VC@KV;_X9 -MN;FB!M4ZIB5^2Y6RGL(LE(%6-V/3D^O:^:JI[ZY@]WRLW?1;7XR1Z/T=R^T. -MC"H4O=9V+`&;8H:5%LSF`QDZ3ZG)0>`0`\`0``/`$```(```!%``$X5-X``$`1``#`J`$!P*@!`@'T`?0! -M)`<)9=+>Z5P$3!?4'TT[PZ%J)2X@)`@````&```!'"$``0`^OU20SEM7?'5C -MG%\YO?T%Y!S3G[EFX>=,":-@"V#+5.)<8R(?R<[)Y<2;4^YUE^?RM)09'^UD -M_W5>2#@@S]08)/Z,%%9+1'(0L,8/*"GV^P,RH()-D$ICKRSN%C;>]%.Q+=3Y -M>!IR5615[7CR_BF&L2^-`D)1/.K#+BXJ$.JN$!Y=@_2BJVGOG'XR6?DCYLTW -MP0+)/&8R^M3'/,*JW[IL(NB*YH9T(0)^V5AMR[QU[KJ*X&@KG*2DB#D?!-%% -M.!2I4.:'?`+W"`H-`OJE['YX/&`C/<#R5T[><*Y^PD-PD)9^'6,]+8"+CKQY -M`Z98!UO[/._G9:91A>"R5IX>]+"I4ZK@1UZY[%)TK![(N@MWT'O[81Y,-9*E -M5]8"/F,;(AB3.\`*\,G:LM8ZN?\AUDA+I/G[T6>[XQQQ1C[O[-DH5D*W^F=3 -MO'S>:#I76=8H`%.P9>1!^<4;TT$SD(5X)*/B^.658FU0-B#ADVWIHA*[4K'B -M#NF0=XS@=!C1:#[N201`-_9;B2"RY.FI9DT*8NKC)($2(/;&L;)]I*^;GF?A -MVE]2$K=&6;L!`.P```#L`````@```$4``.A4X```0!$``,"H`0'`J`$"`?0! -M]`#4!KEETM[I7`1,%]0?33O#H6HE+B`D(`````8```#,(0``L+\4Q6,N4W%< -M'B^%KGAF:D9PUK!)ZQMV>180Y'I,;@E5U@(Y^P^7D=R^I7@#%Y>CF?KM\_%J -M`CW[37N_YY4"[8G/,(5FY1;1WL5H#[WW&!DEJ>&;8"ZEH+J`@,JR"")3B.:( -M#?*+*?$08Z/>R;;6'.5]N4Z5K[<`] -M&\KMQ2<1'1EQP*>Q62>JA'VV!?O9E_3M;CFI1*-*BB^J_C=O`S-,\E4M1@*] -M%65OW?GQHD@$LJU2$K=&&@4"`(P!``",`0```@```$4``8A4XP``0!$``,"H -M`0'`J`$"`?0!]`%T!UEETM[I7`1,%]0?33O#H6HE+B`D"`````@```%L(0`! -M4.FZ1!^?;_;5\I#M6*ZN:\L,A!W[RT+G`P_3P32:C$@U^E+3,C\*FZ)Z\/RF -M:ZAE!\^BUYZ93DO;FV9?\M>XFEZ*AV?09SOG<9VO\0R[J]+?:+%UDFM0MXOY -M;D^AJ$?C98-8;D;F4GG:M=T*''UY,`I<<,1C_,D@T)=2M1K#J]#Z`D;N^YL2 -M,IC4`XT(8*)X*L8,TO,AJJG,AB2X7*U"Z;5?6N#CG%.;14&1B)&'/KLV6TC& -MO;(D+U64J[&$&[!?-2.*B)[[1 -MU[QQ'ADHE7VW/N6@/7XXF]J!_J7AU1$ILX.R -M\#OGJ'=T;N]H>[D`DC*&JV2+AE\O8WA(8<1)/3.HV_Z(&4E*/H1((RCQ.-]V -MQX&L2KIUW$6V7U=MWLEQ6LY-4A*W1H\Z`@!<`0``7`$```(```!%``%85.0` -M`$`1``#`J`$!P*@!`@'T`?0!1`Z5P$3!?4'TT[PZ%J)2X@)"`````( -M```!/"$``2!5X0\HGSQXBS#+Z\:=`N;V(4GUC_1(#4TDU)$(OYE>-;"O)L`F#<99;-SA? -M\[.M^^*5"CAMH[E=,7'6%]'UFW:%$'I3P@2?+8AL'0EDN1Z_3N -M]!Y80A/]Q8N@-"HDSG029WY%3G``!`$0``P*@!`<"H`0(!]`'T`&0&2:;149(-,9?X]5@HLN("4( -M`````````%PJ``!`0CV!-UA':8YQLY4,:_(Y@_,DO0P(A]TV;YOW^<_*+IOW -MO92%V[*0I"#3F@P#1@L9LVGB*?_]+V?TA6>"4A*W1FUN`@!L````;`````(` -M``!%``!H5.@``$`1``#`J`$!P*@!`@'T`?0`5`8YIM%1D@TQS.(Z=YE_CU6" -MBRX@)2``````````3````#`CHYV7%;CX71.M&5ISR7`I@UUM@$+V-(E0]"4" -M="R,L=GK]6J98M&'OD,R$U(2MT84?0(`;````&P````"````10``:%3I``!` -M$0``P*@!`<"H`0(!]`'T`%0&.:;149(-,9?X]5@HLN("4(`````0`` -M`$PJ```P!:"FO9(6]OK=F#8JDS.O[OSW/:4.5^Y\L>J2'80)IG-)`9F2#.[[ -M'SC_7P]2$K=&(XL"`&P```!L`````@```$4``&A4Z@``0!$``,"H`0'`J`$" -M`?0!]`!4!CFFT5&2#3',XCIWF7^/58*++B`E(`````$```!,````,),5=Y*- -M.P^RD#4FW$`'92N&&R$3_&.&;O5837.'_?1/;2)@RAWGA-D;!J^Q4A*W1EV% -M`P"8`0``F`$```(```!%``&45.P``$`1``#`J`$!P*@!`@'T`?0!@`=ED<%A -MK+F*0XL``````````"$@(@@````````!>"(``'@```!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``_2:JZF3ZZ^WS@2"T[Y%^Y(66RA`CX!L4>L1S -M'#H;89">!1!N:J$HF]0<'XYBW`$N=N?*-GV<=I"BO`4K+,/>?"X?`IA;@-0] -M""#?CMPX6^6A)NU4+>\-"^T%[.FA5U[L((SZQ144L:5Z$N;#Z7^1AZAO3PO; -MWZT/KW-G381H'T`I```DR6T]V[WP"54WK8\593@^3UZ\]7MI3/-4B:(R.+SP -MG'\I```<``!`!+5\H6UG958.(N62JBFAPPO;V%*:````'```0`4'&XV>R6RR -MQOF46PL0L1S'#H;89">!1!N:J$HF]0<'XYBW`$N -M=N?*-GV<=I"BO`4K+,/>?"X?`IA;@-0]""#?CMPX6^6A)NU4+>\-"^T%[.FA -M5U[L((SZQ144L:5Z$N;#Z7^1AZAO3PO;WZT/KW-G381H'T`I```DR6T]V[WP -M"54WK8\593@^3UZ\]7MI3/-4B:(R.+SPG'\I```<``!`!+5\H6UG958.(N62 -MJBFAPPO;V%*:````'```0`4'&XV>R6RRQOF46PL0*YQ5"MF^T,:: -M51'\O:>HO29%/66R1LHG'Z%_%.KULA[MOKH`'F?"1&:PHSW+<,X;%?5+>8D->'O,6OJMRKTVU*U*1>L@!F\0EH*0``)%,P`HP4L1M5Z8H8/:'? -MP)@V/IDS)<(JZ#:LS#3RQ4"1@(FF^]_H$I>85(N6/QOU9ON` -M]&H!X0R^X[VW6O)9$,_`4H<8J6K=I\`18K_(=R>Z"Z&I)2!YNRBX$Y]2R0@& -MP,O(/JK>TP]Z'_NQB9X>LX:1>3F7P6[,%)NYS2R9T#GM?/G,!, -MY`1*/=#Z7QP`2;WKEN(`NQ;43HL"?ZMJ8 -M$XE.+`'>11$WOK4U'L7@C-?!RD4,7BK>%G8R>]%\6Q -M+I4R8K#O*@>'RP4E?Q,R`9E](]<5]Z0)LPM7 -MY\:CIRE7=:*@B=X!2^(5_"GUDINC93>C`;E,"7>G_CZ0BO_VIC1`(+_?+VK- -M7HC08[VAIED4M/GCPC87D#J1]&;PISU=SN,>F1E`#SE9Z3)=45P*!]^,@YL^ -M(+\"/L0]9*@8$0'+M2._1>`%P23ZD``EI,=;&W)DG!`N\H][RX5'+K`LJY6M -M:TBH*FI[(%(2MT:6/`0`_````/P````"````10``^%3S``!`$0``P*@!`<"H -M`0(!]`'T`.0&R9'!8:RYBD.+95]24XL0A%;O(@F;:QU%7#8M7Y32E:=%TN!-558AWZQ./;X1`;\-BK.=GPQ*[,9, -MBV_W.+D28F9:BH@7L-AE)+A2?B#OWZQZ3RB\EV]@XF>VR/D+4!51,H:"LEAK -MB+>?=YJ?G\AF[[M@?^$S;<(0CR7%/MLMM442`?KK](%6N)P)+P9'UYS;ES&< -MQ-!_W`K+(U1UF:"O1>062><,03``R)$J0VFUR4%-;5@["`=08CW\'+2$0\RQ -M_T%BWZE2$K=&)$@$`&P```!L`````@```$4``&A4]```0!$``,"H`0'`J`$" -M`?0!]`!4!CF1P6&LN8I#BV5?4E.+$(17+B`D(`````(```!,*0``,$=QGJ#B -M8\^$\UNBHPN82KO"\9P`7,4]W^*(3^M8<&:4-.OM+G#5HC<^F4A*W1H5C -M!`!L````;`````(```!%``!H5/4``$`1``#`J`$!P*@!`@'T`?0`5`8YD<%A -MK+F*0XME7U)3BQ"$5RX@)"`````#````3"D``#"_#H3L*Q+Z,8Z1D-MD_^.2 -M'OT/RS:R=&^->[$$NS#/BA=^UH8Z7@/YR%^KEU(2MT;=?00`/`$``#P!```" -M````10`!.%3V``!`$0``P*@!`<"H`0(!]`'T`20'"9'!8:RYBD.+95]24XL0 -MA%"Z(S]UUCX5\2O<.[5J4TE.LJ1I<4"R0T'?!_$BB@!+^=_9&CCML];7(V4GV -MNTY/$Y&C?]R\Z75".,!<$Q9%EM\K[!&KDP:37P=1X7#/2>FNO2N*`;[6O6S@ -M];'''U@F,A\HP$QG]76B&&C&0S[F,]U9IW\GZ&>?I'IUB -MOQ8NYQCB4$>Q=U/Q_J:,X>`H<2B+M09LF'?]4ZQFIP=LV05%VDE=J3-ZW?9F -M7N-CNY^!9Q!@7>);/(6!L==-&SP\\=,6;/VYI`.D8E7\#-&&YC^+J7=!LF9H6G^:(7GJQW8+7V#3X`!.]93A#5 -M/OIJY6>'W`4H!"XY4A*W1I*Z!`#L````[`````(```!%``#H5/D``$`1``#` -MJ`$!P*@!`@'T`?0`U`:YD<%AK+F*0XME7U)3BQ"$5RX@)"`````%````S"$` -M`+`4QZC5C/?N/>?,<(C6KYIJA+ -M.9G!AK"UA3\PDSMPY!<."JMLUW\5/[#5;QZ*_*<<5=?I@!OJRF"$K^6X?94A*W1LG7 -M!``\`0``/`$```(```!%``$X5/H``$`1``#`J`$!P*@!`@'T`?0!)`<)D<%A -MK+F*0XME7U)3BQ"$5RX@)`@````&```!'"$``0",J7=QZ8(D*U9(92H2.5." -M74QPR491H4Q+DP!21UE%83PJ,=`VI2NE_Q%7B\0@U37]1$'K+@EL$!8[XM5P -MB#V%/`)(O!::KSU>:.(F6C&W(P>7'L0?0U1I&4.!/08HVM@%`4__C'HC@DP2JE!>Q*)KN( -M\).%ZO\WW2SG^=C8@M0@%;,'%;^$KUQ4P?.AA3ML%[>Y]LT12KU\ZZ/4R9B$ -MKZA*8"M:CE-3\A@ -M!F1`0!7%2XJNG&XO,5B8;R4_TQ"TK7K*8LF>-:TS+'M(VL]:8^16$]\-P>JC -M-#I9N^:CC]\:`S*S0M.@6ZU?SK2.V(T4LBG4\AES_ -M34JM_)$.&2EL]'O',T.\FZ,JB0+*^U_8ST'/]TD+++W%^<3)@I<@SWYXWTTP -ML$Z'GWN7D<=OO%*;*"%UDSN-.@#9^$/%=MGGV6BS$D**^1"*@27&7'C&:]YP -M'2ANW9*4'.M3B642IO^(F!AT^2-'-I-`9@5K-7E5'3[!?^*.TIT:6#0*_DBF -M"2W/EW:&0">5Y#N7+;@E@&S6L2PBMLE2$K=&'A8%`.P```#L`````@```$4` -M`.A4_0``0!$``,"H`0'`J`$"`?0!]`#4!KF1P6&LN8I#BV5?4E.+$(17+B`D -M(`````<```#,(0``L#;][YZ623I1$/&V%O(H]FVS-$N^/U6^/=LJ.?O]S@X/ -M:5/N3>:`4>U6&*%VZ5IUG?VN)3<;BV92_L^"AW>O%)T3MB>$K4KV+2&ID')8 -M3L36E[/Z(&YD3$_#'F\'8]E#+OW2$LHXGFMA>M]]+12!?PE2CW<>+YK@0,(@ -M>05,#FG\2;\U2J8X<'0O57F,U\'LLRY=/12$K=&%SP%`(P!``",`0```@```$4``8A4_@``0!$``,"H`0'`J`$" -M`?0!]`%T!UF1P6&LN8I#BV5?4E.+$(17+B`D"`````@```%L(0`!4'P=(<=M -M&HT#CZH.0<-:C!=? -MVE,XN`:7@")4M'G0U:UQ#,6#;.BXZK0[`)4:1<0@JJ/6@+G8F0O\+-`>>8`HPOPH.*A[N()-[GT(^>FWE8DJTP()%$`979;GGR.71(>Z69 -MRJP&J(K/6-FIH#!=_:R;_^A>]*_5X;'!)-],:HU_)?A!==O9?C&?D2_HA(O, -MU'19SS-OI[8+OV$I"]OKQJ629LA3D##G([6NG)$R*L^US="DG7< -M6=*7[>5(?P_[8GWK4A*W1D!P!0!<`0``7`$```(```!%``%85/\``$`1``#` -MJ`$!P*@!`@'T`?0!1`L -MSVD6Q#GI"[+H`K/.22IXIM=@W9]U27$9PK"S%W>W:6Z'3 -MQ0],OH@-BP9)L[0=*4ULZB"^/N&NJ7=R?^2G]NCE#MH6$[7H$-UT5M.EVRR* -M;&S*CLDZ-,AGCSRC*H%\U?I?/J8RP,(I]*#*A*\+>"_JBX+$GDQRJL6B3N5' -MGM9V"NBX)&IIV/;##AID_;QRB&-%5#F=/TZ/!475BT_2 -MQK=8,PG[\462T^:(9"F^C6C3]H%35U]^*($,"G@'?-C?-YE3*9)JB14VCQ>E -MPDR8&@GB>:#1F**$[2X$M5(2MT;>EP4`?````'P````"````10``>%4```!` -M$0``P*@!`<"H`0(!]`'T`&0&26=N$)U(-KG1#->*2GY75WTN("4(```````` -M`%PJ``!`C:V$AE&H(F(JSI0ACF`.C^`#+8XA+LF4JX^ -M4Z91WV^F;(NO1E%8`Y?E>@&ND%4C4A*W1E*C!0!L````;`````(```!%``!H -M50$``$`1``#`J`$!P*@!`@'T`?0`5`8Y9VX0G4@VN=$,UXI*?E=7?2X@)2`` -M````````3````#`(^9PH%Z77#>RM4]65V#"R3*2GY75WTN("4(`````0```$PJ```P -M+WH7F]-<),0YN0HB";8_/^LGIEOG^J8+8&-,J8Y3JZQZ;A-M:PA!]8` -M`````````"$@(@@````````!>"(``'@```!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``F?5$9Z>)`@K1]%W#*DX?X0@31L -M,.9J#/#B-U;$IE,1G@^LU.SZ1H*6@?8-D/YM#]?G>G]6#F*UQ#=0G\*E;@!. -MX;2[[YT/$O#!?-3X'27_3-U%Q3 -MLT2-S/(I```DR?X]Y9P;`?*!$W]+*P````'```0`6^5(W<;^"VH8YO\JU9 -MKA,%-6NEA%(2MT8'S@8`7````%P````"````10``6%4(``!`$0``P*@!`<"H -M`0(!]`'T`$0&*10>'K6L(0?6```````````I("(@`````````#P````@``!` -M!@````%]L>YG2ZS9C55OFU]"Z83,5,1`"U(2MT9'K6L(0?6```````````I -M("((`````````9@A```@``!`!@````%]L>YG2ZS9C55OFU]"Z83,5,1`"R(` -M`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``F?5$9Z>)`@K1 -M]%W#*DX?X0@31L,.9J#/#B-U;$IE,1G@^LU.SZ1H*6 -M@?8-D/YM#]?G>G]6#F*UQ#=0G\*E;@!.X;2[[YT/$O#!?-3X'27_3-U%Q3LT2-S/(I```DR?X]Y9P;`?*!$W -M]+*P````'```0`6^5(W<;^"VH8YO\JU9KA,%-6NEA%(2MT9P`@<`4`$``%`! -M```"````10`!3%4*``!`$0``P*@!`<"H`0(!]`'T`3@''10>'K6L(0?6:49S -M<7^2OC`A("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```( -M`@```@,```@#```"````"`0```(H``"(``(``-B85T)WHDW$._]ZA-R="Z)Q5R).QS0\3C]H@7J&IG9NCWCJRD[(M,HE -MY_*HOW38BUG=9.EN)7YXTV!_*0``)'RN5ZV#X>+/-.3(91:]VE=:4SB( -MO//S,6]TRI$()VTC*0``'```0`3K0WDL54@EGB\_VC842/(YD6;,J````!P` -M`$`%W\<[',DB`_-*I*G?*"!+$Z"QW@12$K=&5C$'``P!```,`0```@```$4` -M`0A5"P``0!$``,"H`0'`J`$"`?0!]`#T!]D4'AZUK"$'UFE&5P313` -MZ4RY9S)7S]^JR.;R9&&>S/I/O^TS+W#E'!?=2PF5CL79^_N.5C`*=FVX\-$= -MWJ2CR)"ZW!UX+3+[/GF?;TZB9X\'HP("XV8/P02A#*3C[!@JN`82O\3>,B2> -MS,G$E.@$);&ZX$RA[N]FMZZD[J]:FQLD4"+E=>N,GU_?>\`LA5(2MT8A2@<` -MO````+P````"````10``N%4,``!`$0``P*@!`<"H`0(!]`'T`*0&B10>'K6L -M(0?6:49S<7^2OC`N(",@`````0```)PD``"`YM?'G3UR9$,%BKT-1?E[0`.( -MPO=G4@*(L-ERF_H>H982Y7WE@[RQH=E" -M_F_>TR"]<]'__+-1W[O7\U(2MT;9:`<`'`$``!P!```"````10`!&%4-``!` -M$0``P*@!`<"H`0(!]`'T`00'Z10>'K6L(0?6:49S<7^2OC`N("0(`````@`` -M`/PA``#@7AH2>4PQY%`41B%5V=!,N!9\,01_!8#^Z2RD>LX<"?FZ@1LU'3.P -M"WP_K40S9OR^^](M="BJ84JPF>2>]W^NUBG".10_8^%]$YP\A&4L`=$47X!* -MPNG&#*R@!TK[3O5.()/X'IL!_;M73N)/24JM%8 -MTPO)KO:I%S>_(HH:K:_H-69]E*8OTF?5.T+6EOI'>K%QC+SM;+?.]UU:_"NU&'-252IM=2EP2L6@J( -M0E(2MT9==`<`_````/P````"````10``^%4.``!`$0``P*@!`<"H`0(!]`'T -M`.0&R10>'K6L(0?6:49S<7^2OC`N("0(`````P```-PA``#`IOI=Q#9()Z`2 -ME*EKX.=_MF(H3+'A_R.2SMY%A8FO8#&=R? -M_"\;0J+C0AI\I=GW=FFLR#.D.0;AGZ8`L7S'2`J"=$Y!NL"A:SVIGUMF)LV5 -M,5K#`7-V(LDLM0,L",3C*QQ!:JM.SCYI=X\ -M_L`+TG$5U^94I6/9LA%%LT=C:C@XGHUB8R_@`^J3,JY_6$L]2B:)N`:JY$!2 -M$K=&#G\'`&P```!L`````@```$4``&A5#P``0!$``,"H`0'`J`$"`?0!]`!4 -M!CD4'AZUK"$'UFE&*KY#BTU\1RJTV3"#I;X4]R2>4A*W1N2:!P!L```` -M;`````(```!%``!H51```$`1``#`J`$!P*@!`@'T`?0`5`8Y%!X>M:PA!]9I -M1G-Q?Y*^,"X@)"`````#````3"D``#"B&:[Y3VD#-DA'4V$A!HXYAO&R@`@L -MVD(K"Z;]5D0A!R'K6L(0?6:49S<7^2OC`N("0( -M````!````1PA``$`ZBTB;2;W-UMR<87&^CZ#??H$_3KWCGUH28VARS,HU;NW -MC8'&VI=**=1%>%$;UQ#!7T@YM(H$$&"3S:1Y5&6K<:KBD92QC:O$CT"@(N.3 -M]1A87X-\5[Y'8)%*J><-Q@F%'AS;H&P8M!AC6O!8`QS -M[DC[_KI"N1NI=CTQ`T^+)!'7Z%^HV5U/V3M"@`2R3+AWR``TT903US]2%+OZ -M95O1@'%'M(MM="D32C4D(",3/&\1F0]2^U.D*7Z%>3$)XFKS$`_\#4A*W1DC" -M!P`<`0``'`$```(```!%``$851(``$`1``#`J`$!P*@!`@'T`?0!!`?I%!X> -MM:PA!]9I1G-Q?Y*^,"X@)`@````%````_"$``.#4W:@7?0'&$WT3'#>SU:>E -ME$GLEDBO=]V)#$H+-ZGH"CVLWKH^9QW9I\BN?O^")Z055:)Q -MX0%_J)!"Q_X03I].8.UE#:JG=E:O;6E<+\HM7QLM:PA!]9I1G-Q?Y*^,"X@ -M)"`````$````S"$``+#^L,8,OK099>L4TQ;![0E\UCFR'N1ST8=8K[,O0KSJ -M[KM%.+TX@QD81+UD>3UNC_(P@^8HA2D_>D@79 -MF0]P-=-2-[X&D>?N%5KI3]SDB`9*AAH*QRO'51.OQ0,2,AJ_^Y@G?=2)^?=% -MFHYZJ*6@,'#)?!JF[:\+SH8%P<*MZA?#&/\P,24A*W1F[T!P#L````[`````(```!%``#H510``$`1``#`J`$!P*@! -M`@'T`?0`U`:Y%!X>M:PA!]9I1G-Q?Y*^,"X@)"`````%````S"$``+#<;,A7 -M]"\JU:<-6`'3OJUAT]X'/%`I'Q$=.*KS/9L8<10)5-Y:V'GZM06[D@U8O]^@ -MSW%#Q7I>>3-/[C][EC$VEO_-'^G -M#2'$/Z!\MA^!"'E_?@;XM,JN)=VP&SN8K9Y&9" -M]8/])RID&4%66A_-_)FZ;1>IF-\WS$ANVSJ)4\$#JUA(4A*W1I<1"``\`0`` -M/`$```(```!%``$X514``$`1``#`J`$!P*@!`@'T`?0!)`<)%!X>M:PA!]9I -M1G-Q?Y*^,"X@)`@````&```!'"$``0"VK;5]_8DPNH9@1)8"?((Q3CFZ-*9I -MZ-R2PM[?W?F^]CP.JS8&NYT'8YIZH@K;?V3E4?:2*@<#8^AB;O#EO3J:@?YB -MN`7N^LZ383D#`Y-DG7C9?EP9L[?WFS\08^)GNYC=<65,/M*K,.@\/S)9W\.K -M(P/]Z4B@0J7=[@V*U)U7K`V:(HO25I\/BR8_K?/5^T3 -MO-Q+;IN##O87QAE'%$P.5JPKGU<,?UX9ZJ,(EPZ;[\X_]/A>7=]XFCW?OU#^ -MU8RT$99/"S/S'AG<%5E])N3?-.1X^B05$E@W:1!W-(/SS()S(?&ES1)KMJXF -M#=.[\8%2$K=&7QT(`!P!```<`0```@```$4``1A5%@``0!$``,"H`0'`J`$" -M`?0!]`$$!^D4'AZUK"$'UFE&F`\Q2+KS_>9>Q$:RA(\\GO!_VD%HSG^BTC/3P&-93P>0!)RJZ2R?7DS -MU'R'S)`7X7%#^8%897[%=HJ6'3W(&L]EO8F4""#^63*2)UB]CAB,P9I*_.8@ -MZH-V=*O-K#DXJ$LQ*7H#L8Z)]*+3+.\,QV9=36_(5MC*NKB)-(:\>X],CM`\D&>9X/Q_38:; -MH]AL]S1CVBHD93(-ZIK/P^#&GG,(G2B;DH-M$\YD_R^O,9^C0+NU$OA\%6ZG -M"97X3=GP`GLUPR_"29X?%+?$7O#;+O0*83KD;'2#U$#/65:N"01`FX-#B.WB -MY,<`;W.7.Z%+1:%5BW.>03<#9O)OD[P+L>/)8+RN%RC0]=A(KB%[::+2+Z1Z -M6LKL,7K7LG@CF#=93PLU\`]2$K=&S4\(`.P```#L`````@```$4``.A5&``` -M0!$``,"H`0'`J`$"`?0!]`#4!KD4'AZUK"$'UFE&VC)I5T>`)%9HZQ>-%S`.8U%F%LF!RNE,XVS0B+6CI -M2?];-51\?^"J)2[$"GZF^EK$8%2&,1QE!C)1.J)#?YV;&9U2 -M$K=&H7<(`(P!``",`0```@```$4``8A5&P``0!$``,"H`0'`J`$"`?0!]`%T -M!UD4'AZUK"$'UFE&=462R:1 -M4R&__;\-0`[]Y34[]?O(XO8Y$(N$$R?A;:XZ3?0&DRS3)=E,X/_-1XV[J4#J -M-%C)],P97R9;B@>+H/C,14B>=8;V(DP.I@ZPVH)0-?7@#$OO9@*']1]$-(UR -M"J=J#]G,YSL+PF8#UCK?S=!H(89=NRZPDGF@$7H0:A:VO-[U)5\"6\U2,V\6 -MK*CYRENK+-EP,QT$N9<0E54[)6*U(VN0)8@OC$*?3S6.Z5N3+TX/HR%CSJ;Z -MY(,Q&(RU/GK>66C/6['"@H5S.5H4'%R)3E\?DY07U=]"5%7H2$]OOC*/YLVI -MW7(0J:^66V5OV=WLH\_M6,`?<(.<15G]>RX%Y5'4A*W1B2L"`!<`0``7`$```(```!%``%851P``$`1``#`J`$!P*@! -M`@'T`?0!1`M:PA!]9I1G-Q?Y*^,"X@)"`````(```!/"$``2"8@+&9 -MUJ0O\CS]I1_;-P[IM[Z_-5@-GR'?D:=,W-D"JR1:IW&]2$)D00:B).6=Z^I/B=IP5 -M*\L3\0`F:H-YX"E%JOR#3#&DPC8!FR`/K!RH+&,1>>4IA;D<@/>H9$;<1DN> -M[V+,XK18S92"%*7^XF-<7[MR62&'M:EUS-8Q`>;.`/_Q;7]HA$(K@`J%RQ8= -MYJ:81?U@P'.M.1-E`$*ZNWH5LLE');NQ2>*>%QB)6,C@:4[(;?-1G6T0(_U8 -M`5+7'":H/FS@CNM6TZ/<91_\Z!'SH9?T'.U6\,5,> -M-Z%4=``!`$0``P*@! -M`<"H`0(!]`'T`&0&219RO'(VM!&!?^.6AJM-$+@N("4(`````````%PJ``!` -M\6-$/8:CWHZ#=^6PLKX4_>VA0:-`+UM!>%.P7@OLD]C(#84+%BQ%RY4^8+49 -M,;7G%SU[WV("//YGH#A%4A*W1CK?"`!L````;`````(```!%``!H51\``$`1 -M``#`J`$!P*@!`@'T`?0`5`8Y%G*\@'DL#-,E;HU*L(FM=`BO&S)Y9QV/R( -ML:=X25(2MT85[@@`;````&P````"````10``:%4@``!`$0``P*@!`<"H`0(! -M]`'T`%0&.19RO'(VM!&!?^.6AJM-$+@N("4(`````0```$PJ```P=X8SB\>9 -M>1>=N]9=8Q-[9OL( -M`&P```!L`````@```$4``&A5(0``0!$``,"H`0'`J`$"`?0!]`!4!CD6_<5&U_VT*04AA>I5ZV!B -MECS_$=C(3!V]4UUT=R1Y.-TL#(R2H2])@OIW4A*W1DSZ"0"8`0``F`$```(` -M``!%``&452<``$`1``#`J`$!P*@!`@'T`?0!@`=EE$NB@)'*VP\````````` -M`"$@(@@````````!>"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``HU$]Z>>JU#U0F<343HGB+%&:,%>#_U7Z3F[8\T5P"7)-BYO%_I^& -M1->:;M@1>D[`UK:/8GY&2D/U5RUD.LS/R)+/"R\NS)*1,KP-Y^FZ>ZZ0Y2'0XSJP8;URI9*N6ZZ2V2%E+^0X;I0>:Z6LA[DI -M```DO32/P%G<6Q0*;Q%SXHIAUJ5$#W:8FHI]-=/`'[IT*:@I```<``!`!%QP -MA<%ZZ#F'1U5OUE;.DG'/&@SP````'```0`7D%RTQ&@Q/%7+?-)M[QY2H;93X -M"%(2MT9Q"0H`7````%P````"````10``6%4H``!`$0``P*@!`<"H`0(!]`'T -M`$0&*91+HH"1RML/```````````I("(@`````````#P````@``!`!@````$5 -M<+0@I13=[T&*3WS.^FO1NV[T-%(2MT;J&`H`N`$``+@!```"````10`!M%4I -M``!`$0``P*@!`<"H`0(!]`'T`:`'A91+HH"1RML/```````````I("((```` -M`````9@A```@``!`!@````$5<+0@I13=[T&*3WS.^FO1NV[T-"(``'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``HU$]Z>>JU#U0F<343HGB -M+%&:,%>#_U7Z3F[8\T5P"7)-BYO%_I^&1->:;M@1>D[`UK:/8GY&2D/U5RUD -M.LS/R)+/"R\NS)*1,KP-Y^FZ>ZZ0Y2'0XSJP -M8;URI9*N6ZZ2V2%E+^0X;I0>:Z6LA[DI```DO32/P%G<6Q0*;Q%SXHIAUJ5$ -M#W:8FHI]-=/`'[IT*:@I```<``!`!%QPA<%ZZ#F'1U5OUE;.DG'/&@SP```` -M'```0`7D%RTQ&@Q/%7+?-)M[QY2H;93X"%(2MT:O/0H`4`$``%`!```"```` -M10`!3%4J``!`$0``P*@!`<"H`0(!]`'T`3@''91+HH"1RML/-#"3Z-_7JE#Z^L6< -M)9_K!N):Q&Y""0@?\.M-&E2FK^IJS&LY9R;44C6$<*#?H1Z'2B.QZZ,M&5R" -MJGC-LRH#',=2^,]4=&1P)#F/,&=:05XL<3B3IDQT\1RZ#F/^0'+!VQ,`K>QK -M;4!,^,/]=JR6(S"L-/CU*0``)$A[A\*803%RCH"^L"-AG`Z?$=-TRME_HC^% -MF-PK!/;$*0``'```0`3DF[D8X890#31S%(5"3CA9F*AHF````!P``$`%#XS" -MY>9Q2BDDA]^LR=PT#BQ]9MI2$K=&4&P*``P!```,`0```@```$4``0A5+``` -M0!$``,"H`0'`J`$"`?0!]`#T!]F42Z*`DNP1G`VL,E[%_(-9,^K6BH.D)F8,P2-L3!7_'J+R[%X!-!!ZPQY/9/.H]IAL7=)RS9.B]K -M,8PZ:XW.T36H7'$_G/Z-L2X<2J#PH1&I(QYE/G`0?E(2MT94A0H`O````+P` -M```"````10``N%4M``!`$0``P*@!`<"H`0(!]`'T`*0&B91+HH"1RML/-#"< -MLK/A#[$N(",@`````0```)PD``"`X4&=;#1SX0IM;+S[5C<5S8C:Z6YD1;H5 -M9160FD+&CX.>)>\?"O$PF -M^5!<\$Q&D9&CTKV#=3SQ&B%9U*$A+8;VR>I[>)G@>,4516K?TAJ!!BF[E($G -M]H$O9)'OW_857U(2MT9ZI`H`'`$``!P!```"````10`!&%4N``!`$0``P*@! -M`<"H`0(!]`'T`00'Z91+HH"1RML/-#"S$I.*&4B1[G+[A_,5F -M#+F-M_2[B[[T[$+&;3$N$3)+:Q@B1X!`7S`C,S@^HV@2N/X/IPPB1-3!F#_E>-ZD-*5W9\!//>27QHY`EAP/WF_2'C"^_W>>RHD1D*ELI\2_C4'F+_-!NU -M6"P9HCTL7_C:].=B!H.O:S&5<#!IL)0]^^D8?;IC8Z^0Z0UEI,*O.;.OF[U> -M3#%WIMW8B!)G5U([SFB1]5:!T\(]PO2WE\));T^VCJ,,:T<0D$P.!(+Q]0%: -MB-7^CZ6H:75D/CBK('>=R> -M=OYZ:&.;DYVU-S=_"I;!05(2MT9Y\0H`/`$``#P!```"````10`!.%4R``!` -M$0``P*@!`<"H`0(!]`'T`20'"91+HH"1RML/-#"Z+U6^;TWV&O+'.1ZI#9'OS4B -MB9,LJNC/%4+$'FC<1"&>0%(;N$?.S+!F1Z[4T>O:C/%0^;>(<\P87(!X-#7W -MYB4,)`3>379@EHPGQS) -MOAEV`T[-!&^>;F/JN!QK!5!6]Y]U>&Q11B:HI\O<:4`#A)XVB>V9_?SF)$]59^4A*W1GC]"@`<`0`` -M'`$```(```!%``$853,``$`1``#`J`$!P*@!`@'T`?0!!`?IE$NB@)'*VP\T -M,)RRL^$/L2X@)`@````%````_"$``.!1/O`@=5^EV+A9_>"B*57]XS6)&?SI -M6R6X311I&>':15V21`1X@WDT,J(IOX]DL]%\H1!B\ZYVI']XB;.=310"H84? -M&CAP5#T(=M&9L8T_OWBT4V+K7'W;,0BZPP_OGS$/W0Y"!<.:]]R92`_`YZ\T -M&!52O^.@!Q>;[)8.B82_92'^4P/0@1<:6TZ_U\$3H&QR)]WU;5:;@_HT6'0D -MJW'JNZI-IN`C\GKP`1)B)0<[D\^QCF7/^6D=0*X,'2`<(-ZR@AED]RF$;)#/ -M3RV"^K<".8CB4)`N#$+J*XC4<^F4` -MZU2PV"?J]Z]\$EH7GX/=.J?_3;%DM?+OS&8\G[*;#%`ZU&`SX)8Z@?>DO-TY -MG6U3U=@2V([O2\EBP;N\/9&=.#Y@9-O*5;^_#5=?Z>LC71@*PE1WA'-O;HU3 -M4A*W1J8P"P#L````[`````(```!%``#H534``$`1``#`J`$!P*@!`@'T`?0` -MU`:YE$NB@)'*VP\T,)RRL^$/L2X@)"`````%````S"$``+"A7;?E[3#L8(4A+8_=+*;:A.::D+ML71UR,%J.>KX**@`6L033IF! -M%W2X6XGLG/!I2BY[FPD-T1*=-B@F<=96*:JPS.[$1851GG&KAER%:H'^,HK- -MBN9>?[8A>R"!&C9]JN<;]SK.A*RI*C+>3D#D>?D*SRNX#AMJ7*M#F-?GC:.Q -MN-\K^N:61D$\S7,<`PWJR[[$!#%@/>O-N]F>4A*W1D9."P`\`0``/`$```(` -M``!%``$X538``$`1``#`J`$!P*@!`@'T`?0!)`<)E$NB@)'*VP\T,)RRL^$/ -ML2X@)`@````&```!'"$``0`_UP'$_WAHI%&*N>.YX;OK1])B_N9EIS">+"W] -MO]S!M:#!3CL<)2VA/,`.E;@G)'^LV4ND/M85=S@NO.E;7'MP9+R?!4M0(%BF -M02J%*5QP^B>4"=:KDX;_ERT3EXI`-*)?>IBYHAF,P,I==V71'%#KF#>$-'3Y -MJL?^>>GH%MT':)1D10!.A#]5(!9DHR125U7<^66Y>!.# -M8.=X11!FW]Z@ALK=6N8?%L[78WN:J^BGL]]_5^L*@KW3QCZ*B2:HTDBXZ3`Z?12 -M$K=&,%H+`!P!```<`0```@```$4``1A5-P``0!$``,"H`0'`J`$"`?0!]`$$ -M!^F42Z*`DJVI`20F,6P89V\E:+8/"H;:G5X>]M`]H)^_$ -M/FZMY!*%H^A4#_<2J[[U_/!V5JK*B5="*XLV.,7;>;*7T8O)%Q,AXP7%\W\S -M5$W=@][M#1:X'M22#[M(GDT!,4DE7%D!'*!BAU9=,!'\(_2J])K*X*7^!%HG -MT5O4Z//B@M\B33YKYH.:TW1Z0]:_<64,-#L?OCJV?V&"%Q%35'CCZ@+;=*>I -MLTWZ(#=-QWH*,4TDKB6]S>LC64OQ@&3-H9[5!UI2$K=&N6D+`.P```#L```` -M`@```$4``.A5.```0!$``,"H`0'`J`$"`?0!]`#4!KF42Z*`DR6<\*W+2X>BVGYF&1Z+CD%(SUC.F]L%P9(*_36`BEF>T' -M3A4HF-X9?%/Q+4T*"FFH(:9_TJ2BVY4T0&9?!3VY][=6H7OY#.E9"I0F"?LH^`KP>G3"*?ZU,ZK^:YS3^) -M4J`$@&T]/!-*N=M2$K=&XY`+`.P```#L`````@```$4``.A5.0``0!$``,"H -M`0'`J`$"`?0!]`#4!KF42Z*`D.<;`)#8IPO3O5M<24W[J5:]/L`#,&H4CF4 -M:_,)=BMG*R-1ZSF`LZ]RJ9[L0:E!5@=H8?$0S36#%_([L$LHO9*ZIE=\AQ,T -M)L&2%-7FZ?D5D1!VS!-=:G^L`QIZ!@H6\Y\HF=&XZ?5$=+#/Z5]2$K=&++<+ -M`(P!``",`0```@```$4``8A5.@``0!$``,"H`0'`J`$"`?0!]`%T!UF42Z*` -MD/`[9R99<>]9EH[5 -M;RS@>]5"Z+PX\<8]0H_0!O,'RRTD>CQ!I`OG#`LHS]5.E5O^DD."*7;5W)OH -M*!6S0@(I&XL\!3)G&"BFPDHV84IBFB#^UY(OMR -M2L%7%KCU]R9'PF!U[CRE`-K6&I?-(/P=B8^G<_]+)9RISK1ZD$L#4QX-2#R9 -MPS).1)#ES0'/J.M%@'4)(:M0;AW9P- -M8M5'B*>"0"YR$H[B*E`H9MV9)\$)B54JJ*IPRPA^8NLCP=%O56]6^KMH)M4K]099P(V`4(G4^8\&8B[0#&3DX\$G -MY0!-K:@Q/&QM.!$S=)(=Z$!9-788\EP(9\/3-4`/>A`]X"VZ15H\';F[>>_@ -M,.-P'XOBO2PP9"??AP>UNN,TLD!5DJO3'?EEP-XJ/I1L0\T:-ZFY1+Z-C;SQ -M3NR795(2MT:@%`P`?````'P````"````10``>%4\``!`$0``P*@!`<"H`0(! -M]`'T`&0&24TF9!V-E;!^&?9^@!6FA%"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MY9D1BTRN-JO`3(O%RAT(N@ZHWJV;0W+&$>P:HWCGH+;LJ.DH%1B5 -MJ01LGBYI?U"`6T4=2?:_O2M2I9HN9RK\G/Y[_S#.O:.8;G$EW#P&XY?:A8+5HI```DX5X) -M7A:CU3G'L70##SD"[KZ^66PFR%N`I```<``!`!+0?Z:6*L&=` -M=^B;S3C[X20S!!CT````'```0`6FKK9P\#4]NTVD"D"P:HWCGH+;LJ.DH%1B5J01LGBYI?U"`6T4=2?:_O2M2I9HN -M9RK\G/Y[_S#.O:.8;G$EW#P&XY?:A8+5HI```DX5X)7A:CU3G'L70##SD"[ -MKZ^66PFR%N`I```<``!`!+0?Z:6*L&=`=^B;S3C[X20S!!CT````'```0`6F -MKK9P\#4]NTV3N_@U@2$AI;BR/,TSA@+=/QCI"8) -MRR/N39/./`?9C(GXN1$DG?5#Y(BS>ZZ!8RBERC["Z;>?\/O]+XK7UEYI@E2Y -M@+S:$[Q?.1 -MC1)V0B?L3AM>]\M2$K=&AJP-``P!```,`0```@```$4``0A51P``0!$``,"H -M`0'`J`$"`?0!]`#T!]G2-3&2OG&2$02'?V`B9;(7+B`C"`````$```#L(P`` -MT..==8G.@RM(\LC4]^(SY?&:)UD[F%_$UR[KL$M,.(3$],]N&45H*?O0[M-5 -MDL-,B5!.:USBB39`X%J9X`>8.``(OY>:?Y+-?$ZR2;[W+[-Q&YM>&.M -M_FLD!D&BW!F(=XH*V^PB`T=Z_:9CU:3TB.\_)9;ZJG"Z?>%\`=570*[/BW;N -M(`-U!N%-#9*IE)UU!YM9[''*;F?T34>59!!&]RL7@B=_4P713"B#4%Y3#/?! -M']H#`>-SC(:/J=E=N(V1[IG^'(H7G\R(?%(2MT;WQ0T`O````+P````"```` -M10``N%5(``!`$0``P*@!`<"H`0(!]`'T`*0&B=(U,9*^<9(1!(=_8")ELA/BO5^F!EV)QNU6 -M?0`[$2L2,E;H0.-9@J=3(2*Y^B&N(P0%,3+)NZFNG"A:'N-S,W=`'89:G=%0 -MBVY$X<]'W$%7,@SWPH^38MJ^QF7B-_I]OM;-");"%-J(^!HC4(TV<1SV=]2/ -MJ^*58%(2MT9[Y`T`'`$``!P!```"````10`!&%5)``!`$0``P*@!`<"H`0(! -M]`'T`00'Z=(U,9*^<9(1!(=_8")ELAO9CP%%>"KWN13_OG.?*9V8V)"U`N#9WM-DGX+&`F0+;=PPF\1]UWY69#7=?>E;3^D^&K$Y -M'X+K7Q;;9:&>]\:)]M[[CH5#JE*ZD?_=M]8_[*T^`]S4!E5@GID]!/4I5E`" -ME[+*SDQ13ED'W\^"IP)CW/A/W7F2J-9,C#\/*B.+-=@B9U(2MT;C[PT`_``` -M`/P````"````10``^%5*``!`$0``P*@!`<"H`0(!]`'T`.0&R=(U,9*^<9(1 -M!(=_8")ELA:V,FP,J,A`3W#:BY`13!!!2%3Q+#1B=%$7?0`YR[04MAU2$K=&R/H-`&P```!L -M`````@```$4``&A52P``0!$``,"H`0'`J`$"`?0!]`!4!CG2-3&2OG&2$02' -M?V`B9;(7+B`D(`````(```!,*0``,'W?)7"QQ'J24H%0I;T*_OG1)NDR[-"ENA$W2%R[V$)ZAM=L$%W.2&V$)S%=< -MU;>EVT^$>V)4GR2)\7W=9]559VF*6NB?(8JLO!>93M"60IHM3[1Y>`V0IT>Z]4 -MVDC08O,(@'EK2E2.?;;/3L%2@L)SO`D:+J&,IP0%KP?V,X1)ZG%JX)FJ[>C< -M@6/K:((CG77RK;%Q1C/K5LV_UT;]%\@DJ?4_M%0!-T!A4AS=Q\=BU1`+9!^D -MY(5_-KBV)6TW0F]ZC]MH15%O^XRGTAK-'>-B4A*W1FL]#@`<`0``'`$```(` -M``!%``$854X``$`1``#`J`$!P*@!`@'T`?0!!`?ITC4QDKYQDA$$AW]@(F6R -M%RX@)`@````%````_"$``."@0,Y@VR9#CXR8E3_TWA:Y0J9)[!TV=-!BW85B -MYI,XL,C!PSZ2&R;'(IG'X/-D6F2>O.,#?(VK@7^P?WS+=_A%7X%J!W#(;7$R -M2^3.F=:RZP8_0''?5QKF%_2K*B%">8F?_?NM_=H<;8^):#?`@%X3=RH4N.A/ -MN$.:EM5I]71E@%>VO9CD1N)MQA4C3M3O2%9J\7H=*`P+%@BH;I$FC0&-B.CC -MS/A`13YY=@WG[.[I;"*#Q5<YTM1Q$`C_;1-E`E'[5SY?Y?I:J4TF@J -MIU4;O3$:CMY1?!\QCZ<,:(/F. -MD>D]2BV0GWXA>)ZQ8,[4V)!XZF/O9L`P$5K_!]:;$BU">P&`,@!#4A*W1JIO -M#@#L````[`````(```!%``#H55```$`1``#`J`$!P*@!`@'T`?0`U`:YTC4Q -MDKYQDA$$AW]@(F6R%RX@)"`````%````S"$``+"G<"_-U!3F]1K`5K2&MJ@Q -MMWN0GN7DS!#P5MZ,06F"[,AW']S;6;KN\2F&P)EY*BXV -M)&V6;0W:M5KTQ+GP,@N5@MS9/I%7.*ADRA+65A,"C@OR7:FZA6/JKP2<(J_, -M*C7M&;F?RUU%`YCF;R,9=^E8[>W!NMJD-P>`XO -M_)Y\[^./:@IQZ?IX&08#W(K+#FS?)*/QQS5!1(6+K_1:KK'KS1\^/ZEM5FW1 -MG>K"YU#3?WF`(_J`E:FA=*V_[,2>%MG&ONU/C1?=CCIUI"MP.&((S&Z&VZC8(4:;UP:O*P=@@GAX'=Y -MTG:X?;K>'L&)3V?SX.PN:LR-)F%2$K=&@*D.`.P```#L`````@```$4` -M`.A550``0!$``,"H`0'`J`$"`?0!]`#4!KG2-3&2OG&2$02'?V`B9;(7+B`D -M(`````8```#,(0``L*OUH>DWVW[H^)`G2@3X;H!8P<);YQ/OD -M`FY00*FOA<@$PB3:L.*1<4QKE5L*B')YGZ4/:I%T,QS6">8X/V7/(>(E5>"&@B,SQRH@\&V+&W]E=Q%7$C*U)U0-UPMU;G'^'-"=> -M&A9=8A6`]1>^!0H'.[-1OVB3O"7N/UZ=BX(3F?*\F:I2$K=&(?(.`(P!``", -M`0```@```$4``8A55P``0!$``,"H`0'`J`$"`?0!]`%T!UG2-3&2OG&2$02' -M?V`B9;(7+B`D"`````@```%L(0`!4,>@R&0(?G+&U#@S-@+_[+RP2U-`GF$O -M3\-5\]07-[$6K_,1;GGKU9-E[ZQ_#LTX5OU73T%F?>(A>LG*%07M!N.V^?`. -MTBFCK'N*FV@5W887@8OPOUN8.$*`\CY,OJM*(T7Q^'F/!2.2M`@D68;F0Z&5 -MMA='3/!LX*"K7QH&$$,!)W3DU4FQ:S>YJ?-4Q1U"UA'6E$Y3C&E'<@#CZHB! -M6_:MQK-S2+F(^HFYCNI,V&+M=N_IDV8$DU%58"W=#! -M=]&(BI4KBS"UL80:;-$Q$$QZ%)2T0^UR2\\@Q+8>QSC\A+[61E8/FQ"XNL`ZA4'T^J4A*W1N(F -M#P!<`0``7`$```(```!%``%855D``$`1``#`J`$!P*@!`@'T`?0!1`#. -M.F`U>KO$5RO@BTE@]62HM-=2*Z^,(($:#RUISF>/$4;Q -M>U!<1M+7[*S>NSAO"NL#T0:\?ADI*:LC:M5O&^]EXK(CB4,&Q&\;/A/T7-M^ -MMT[8'1'%F%\R^]4,5%0/:2M.Q=?`@CE62O-V\JW]8LZ@F%,9+-/F#>!!+5,2 -MMT8R#0``?````'P````"````10``>%5:``!`$0``P*@!`<"H`0(!]`'T`&0& -M2>AUH,P(N;"@N:Z'+G[8*YDN("4(`````````%PJ``!`YQ=L-QA\8],N$K3A -MUP1QL&XVSXKY+HA(:0)M;GKD;$0F8#>9-%2;4V>9(TY%;9Z)S]_(YX$/4HY_ -MRED24Q*W1ID9``!L````;`````(```!%``!H55L``$`1``#`J`$!P*@!`@'T -M`?0`5`8YZ'6@S`BYL*"YKHXU]5@4YT6'9Y.PM*^LESU,2MT:)*``` -M;````&P````"````10``:%5<``!`$0``P*@!`<"H`0(!]`'T`%0&.>AUH,P( -MN;"@N:Z'+G[8*YDN("4(`````0```$PJ```P#PZ1D'?6Z1>0I,0BMU!&@(IC -MVB8JC,"N#GM[@ZR^A8^LZU3?NY/P_WS/$+13$K=&``&P```!L`````@`` -M`$4``&A570``0!$``,"H`0'`J`$"`?0!]`!4!CGH=:#,"+FPH+FNARY^V"N9 -M+B`E(`````$```!,````,&;L`T[.B9?6\AH!POESPTP0$2D@J,K<>29*_3Q& -M"R.,;129`GTW@_$)-[:Y4Q*W1CLQ`0"8`0``F`$```(```!%``&455X``$`1 -M``#`J`$!P*@!`@'T`?0!@`=EQM;L-[C*9+T``````````"$@(@@````````! -M>"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``20'A@?+< -M_(,.?,'SG0=TVMK.7QI"5,3)87KI,;7"8W,`D$-, -M$G,WR;ITL^=L#?+:$;/%)Y>;AS&4E+/$4B\)C*?>F](I```D"ZYN>@I```<``!`!.87&BF:NAZ"O4?+">H_ -MTW]"XRF2] -M```````````I("(@`````````#P````@``!`!@````'"0,)^T!;BXH"=+@1, -M\O>?C29VD%,2MT:Y3P$`N`$``+@!```"````10`!M%5@``!`$0``P*@!`<"H -M`0(!]`'T`:`'A<;6[#>XRF2]```````````I("((`````````9@A```@``!` -M!@````'"0,)^T!;BXH"=+@1,\O>?C29VD"(``'@```!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``20'A@?+<_(,.?,'SG0=TVMK.7QI"5,3)87KI -M,;7"8W,`D$-,$G,WR;ITL^=L#?+:$;/%)Y>;AS&4 -ME+/$4B\)C*?>F](I```D"ZY -MN>@I```<``!`!.87&BF:NAZ"O4?+">H_TW]"XRF2];"D!O]B7^,LA("(@`````````3`B -M```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0` -M``(H``"(``(```?%)V-!:MT0RC,K'S*TMMZIN7%_C^C*S!/)Y^KDZQ`_Z3QVG5U4IM?T-<4R4A5K*0&.&6?F;S*0``'``` -M0`2#PH+:EVH31EXU&+$]`M]^ZO+`K5*J=GEM%Z1(9=1':>P4WN5DS4+;<13/8R.NRD9N`\6M2M.6M1@#C%^[W"J3T<)V*CIA5/XGG*7)@HB`="2C;--B-Q'4Y -MH(K*8@]&N9HMI&-#JVP(B8]#`5,2MT;HO`$`O````+P````"````10``N%5E -M``!`$0``P*@!`<"H`0(!]`'T`*0&B<;6[#>XRF2];"D!O]B7^,LN(",@```` -M`0```)PD``"`CA_/9X:<*4>(*+75),ZKKDJ*/WMPCCV9T9I1SH2X**J)$'YB5"(0562*'_00NJWWQZUX?&/,+#Y'K3KF6L]UIF>@9Y7>P-+X -MQ0G\XM7D"WO6U6N"]>NX=>?'6-0:M-OA]1=(`,.$"G=BGM-1WUS"B,MS*%,2 -MMT80W`$`'`$``!P!```"````10`!&%5F``!`$0``P*@!`<"H`0(!]`'T`00' -MZ<;6[#>XRF2];"D!O]B7^,LN("0(`````@```/PA``#@FJ3F$_,/)/$M`BIA -M@0N;I*6>?;&_EOYN;*#=Q.-[^^WBQVG6T!JJ-EHBM[K.)3L?>F8U\-,5'SI: -M$(G#3;,LNDFF7N!N7`#TN>R9U(8?DDY:887LP7E?JG]/"?1&-Y5+LR]+D\K< -M)T<%J,GN9'0[`Y?;WL0L'`]S;5X7O6'U[V"&N=8EPLNF1:A+C2SU]`N!9^L; -MWY[4N,B/$PD(R9[L[%HK,N#C.)R+E"'VB2E9E_(/GZ-@8T)D:,LK4()D-TZ$ -ML,9L^UO,_>ZOIXB,7XRF2];"D!O]B7 -M^,LN("0(`````P```-PA``#`6=9\PG9C,T/S!`31LY#5G5![FVGS5O!E0'4! -M=$: -MSCUNSU^/0>9@9Q5P=3BV=+\4C]AQ_'ZR`H[BZOL;E_?L,8TJ-P+-@O5);UK#5@].2P%<-.D=IW3+ -M*V,[62,@M(8%KTHW5ORS+'FH(<)S=/*-2IE3$K=&5?(!`&P```!L`````@`` -M`$4``&A5:```0!$``,"H`0'`J`$"`?0!]`!4!CG&UNPWN,IDO6PI`;_8E_C+ -M+B`D(`````(```!,*0``,+J$WA=W4Y>+N2/J1%S$J<9J\U)>R>[MN$O]*RV: -M!]Y3`'UM11VAH,SXH]*Q4Q*W1G`-`@!L````;`````(```!%``!H56D``$`1 -M``#`J`$!P*@!`@'T`?0`5`8YQM;L-[C*9+UL*0&_V)?XRRX@)"`````#```` -M3"D``##^2-&J0N^\5]Y!AOIWNK7Z_GF*=0"_0Z5BH?NJP@8/[99S+"XRF2];"D!O]B7^,LN("0(````!````1PA``$`Z./WFU&N -MT6DVSYW0'Y`-^CPF8"2^YHXO&M$F0BK^M^1-7BV4BS=!D=<;YL'L(J[G18FS -M&RG#4#CTCTZZC^T4V/*NI#6'T''CUBZ4"=`*O:XX)J\V:A9)-&1,VSO;=WV] -M^5&WA^1MEWDK;I?"38BX\C,AEK%C<#E/*0&C6>V4`G5[9^.*:Z*]H.]'\,*E -MD]VZ:2)I)MC4LC?6?;W9B-5KZ1"`RXTLV$0W/0H5+!L0*P' -M33QGQ^&`3:U;V*/++"#_/`NYOQ)14Q*W1H0U`@`<`0``'`$```(```!%``$8 -M56P``$`1``#`J`$!P*@!`@'T`?0!!`?IQM;L-[C*9+UL*0&_V)?XRRX@)`@` -M```%````_"$``.!5N;PDSSB68&X!40AM8I$CNKT^,C-]3H6D^L;ZO!4C\*X1 -MHUM:#."]:60J,5P43`>'30#NRY'],P -M`G*>FV1@J^SR^6:!E(WM*"(K+(FEU%*0[>F5)HF(+SM9#.Y*T3E=;:$5[7!O(LCM!ECK3J:0NMSEQ -M'E;YW4Q*W1F!%`@#L````[`````(```!%``#H56T``$`1``#`J`$!P*@! -M`@'T`?0`U`:YQM;L-[C*9+UL*0&_V)?XRRX@)"`````$````S"$``+#3!+Q[ -M%&.O#_A2-2+5=$A37.5R27;<$9L=Q#D3K]U"ZSI$ET.A#"G7(H]YERIQSTVY -MO7/K2R9`.\=&JB!L9NNZGF$CO@G0O5%UF6\/#XZ+)Z40(^RUKB!XYUVYD,.< -M%-AQ@GQ[NU,U;XX@:!J_D5':](!5RC2'2EE2.5[4/DJ'V9@EMX:02_ZG_Z1Q -M\[3'-B<)'#U=6`Z/WRPYP1@5_,?4-JY/&@X^%HX"1A#A4Q*W1D%I`@#L```` -M[`````(```!%``#H56X``$`1``#`J`$!P*@!`@'T`?0`U`:YQM;L-[C*9+UL -M*0&_V)?XRRX@)"`````%````S"$``+!(+U#"9B`S3H>D>B1&U9\I/+KD/*6* -M[#B-]6O,Q6%ZF(KB'3#+'@%&>J$>H?T_ZKZO@R9(MC8@F_1#XFT"*G8K<$Y= -M75V?^Q&WEIK!TQK>3'(@*Y*A/J<3][ROII7):W9S7H\'9G0;9G2M@\"YLJP5 -M[_"ZU?&E3ZF8V=#PY2#TK$T)V:M5$J'$V4R;)6DN<2W_[#A.KA&!L2@,ME]:*""AJ4Q*W1FB&`@`\`0``/`$```(```!%``$X56\``$`1 -M``#`J`$!P*@!`@'T`?0!)`<)QM;L-[C*9+UL*0&_V)?XRRX@)`@````&```! -M'"$``0#O)]TQ)LY;DBF1M[9N8\E?UY0MATI_>@`:S=*O/*E-^4'5/Z,F_JX= -M_TQ7GD1ST\:VT!5>*?(U!]#K/<8OJXI3@LF75& -M^ITLWMRYILK\LO;5<.,'K>M0;CR"O+1WY]Q?H>&ZS#1(>];6'N([\[N007GG -M&*2U@&W,$-RC,A#.LA/&8BH+)-R3U?4(JDUV?WM2E#_F>WYCK@7-QHG`EY;$_7HP,Z9X6KJ9[P1)4E5T+>67 -MLWO6-8`\`KY%#I12,C[A7ME#%WQ=56(@N_O@#C=S2)E3$K=&PY,"`!P!```< -M`0```@```$4``1A5<```0!$``,"H`0'`J`$"`?0!]`$$!^G&UNPWN,IDO6PI -M`;_8E_C++B`D"`````<```#\(0``X.I@-TB5%D;$W49)()),H1[4MS3!X3^@ -MIA8@XU=HH$P9.N.;;N9%46)+3VEL\)IDW]JZ0C -M74HGP:\';ZR2=>*NH1AK$*[O3GI'J-DE('GQXK-'5'?:4L;PD>Q]-!2-!LRS -MJ_Q7R_^=U*916+M$(>*&L@RZ":=NQ]W1BZ.]?8;8K\*T^"0,=WJR -M1RNYVQ@!DO*7B5S4^]?TS']3$K=&+Z,"`.P```#L`````@```$4``.A5<0`` -M0!$``,"H`0'`J`$"`?0!]`#4!KG&UNPWN,IDO6PI`;_8E_C++B`D(`````8` -M``#,(0``L.(?Z*I)81&;_.2_)!L_1]=5<"=:C4,!?,-V._`C+R&!$"HUKXRE -M:6TG+YE"6H,DE9$>3`6S?M0Y-=;`<.#Q@^P;SG97'/A8C&8<@NCN;]C4+'Q] -MHT\-@VB9J`JZPO]].__)'[)1*##IA4.:`RSN^_L5^TUCXI8F&P@;<+P@5;`" -MKJ3KQJ/IZOUG(V:*^7O_/#:G$S;#QGA""^>?3?X%9IIV5_7."@HCMQ$E'-)3 -M$K=&>,8"`.P```#L`````@```$4``.A5=```0!$``,"H`0'`J`$"`?0!]`#4 -M!KG&UNPWN,IDO6PI`;_8E_C++B`D(`````<```#,(0``L+O3Y\!)F*=2*CC" -MCW7#7UM'G81P.#[^$F4)Q%:B=>=>'Y]X5BPY^TFGFS[N&J>/91AMBF0QWE1_ -M'^:K<9,JX[B(U%/G1!0PQ[`OZ+8T(?Y@7"I$HB'COFFD;0\33B-K,Y?2_6:_ -M?ND:,[%UFBUD"[G0$2G785)I.EV,Z?"J$M&VS7V*AB`'0C0;EFH$W;O>DOWS3F[T\+2F;A3 -M30TV-8]R3G.S9PK@S@(1"*Z89N#'K6U660[[QR1E46LB-UH-;&4_.-+R_^=T -M-9QL<&;Z0TF*VG1]2[ -M)S=RD.I<>7)\:+HPEH@6(V+(H*9K]H&2,SC:\&YWO?Q44Q*W1N,C`P!<`0`` -M7`$```(```!%``%857@``$`1``#`J`$!P*@!`@'T`?0!1`'3HCHL7Y -M^<[BUUD,.^-"#A`*@GA\F5.%!M`%RB'^HPMXK]ZV+R^722*`]ZY*)VEAJ)U4 -M'&2"U1JBC&3;"820D]-AKQUF!QPE81J7L]%]2\F6+[+"9W(=J -MD69Y4-9_X0J#&)]46/XU#/FT(SWU'6PQ<8UGHFHI,I%HG82H+#JF5S,X5EXM -M/=["@U(EG'\KMD`([9!7Y)K/T=JC;O7[$=*YDW$9&*MX]Z=&)LH&#Z97HB*D -MG3+*[WM":W4_S.8)F[_UU8)L_MU,2MT9&3`,` -M?````'P````"````10``>%5[``!`$0``P*@!`<"H`0(!]`'T`&0&29)U:=#= -MT2\5J'/<:'-)C$`N("4(`````````%PJ``!`M/^`$:R1A%:MV`H&8Z!T:QXE -MA">+1T-MKQLG?1"".V;GE/J7\$BJ&#DERQ6+6$^7]/;3ET[$BRV`K/R -M^IQ@1'TE]&^D4Q*W1IMQ!`"8`0``F`$```(```!%``&457\``$`1``#`J`$! -MP*@!`@'T`?0!@`=E]XB.:W:UPF@``````````"$@(@@````````!>"(``'@` -M``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``KY+A`3[KH>UZQ*:J -M0$7+U?6PYAV<9AX9)?`:VN*][<'BYAF%%(0PRL^HNY:%8P>@\CS00V88^L92 -M\OW(LW$9SBC7&GI7A^-K-=G&:/=&J[8*"@>)7NOWPI<"7Z-XJB=82C="Q\+X -M^3+K6BBWM$F13R%IG:3)XN\-V6U`6Y,$0&`I```DF_#9E*-)B6`U"3AE?GU! -M@K2!TX\;!U]@?O3[X/2;E]`I```<``!`!`+WN^@IN>F7;8M),8?0M"0+(`U2 -M````'```0`5PK$?J1*88D6)MU0(CFMVM<)H```````` -M```I("(@`````````#P````@``!`!@````'I2!BB`VF\2H[AMSJYE+DG2=+B -M45,2MT:HD`0`N`$``+@!```"````10`!M%6!``!`$0``P*@!`<"H`0(!]`'T -M`:`'A?>(CFMVM<)H```````````I("((`````````9@A```@``!`!@````'I -M2!BB`VF\2H[AMSJYE+DG2=+B42(``'@```!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``KY+A`3[KH>UZQ*:J0$7+U?6PYAV<9AX9)?`:VN*][<'B -MYAF%%(0PRL^HNY:%8P>@\CS00V88^L92\OW(LW$9SBC7&GI7A^-K-=G&:/=& -MJ[8*"@>)7NOWPI<"7Z-XJB=82C="Q\+X^3+K6BBWM$F13R%IG:3)XN\-V6U` -M6Y,$0&`I```DF_#9E*-)B6`U"3AE?GU!@K2!TX\;!U]@?O3[X/2;E]`I```< -M``!`!`+WN^@IN>F7;8M),8?0M"0+(`U2````'```0`5PK$?J1*88D6)MU0(CFMVM<)H.M/%29[57\$A("(@`````````3`B```P```` -M+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"( -M``(``(MS+_5^`?70L*C?2/X3S@["2L3'6(SB -MG_U)]P!8WJEJ64-TVRSU7AB.Z['0TDA.O/P4S^+,4;VZW>'>]J?EJPHE*0`` -M),0&QQ_$.*/?^[%B?/V@BSV"R9HM_'!Q-1-NGLJA.AI(*0``'```0`3S+DW0 -M=NB;\@3UUNAQ7$5IICBB'````!P``$`%058^]=F(.7,*Z-PE,4TN)R&=9-M3 -M$K=&8^$$``P!```,`0```@```$4``0A5@P``0!$``,"H`0'`J`$"`?0!]`#T -M!]GWB(YK=K7":#K3Q4F>U5_!+B`C"`````$```#L(P``T&OTWXD0CH>IVSXK -MDL/;F!G!I_NMC51[T$RLTH.+]!AQUC^D_-FKI8R2NEL<85O1KI8R9$9]:_'! -MM^`9]8YC[W/8$Y680JH*.$`TUOHYI,#AV2)J>P('>-HGFS^`..W6$JWMR59G -M:.^SJ36@RE''X3&([T;,E@IQ#F(%*$L;0$4[V0AH&);M!SPWP/`7>=@IFN7@ -M$*7$PVLOIV:85X*J+;A4OF0CK\=MZ/[#Z[8W\RP]\HFY<++$2]+^@X:8O3II -MHI6S187Y:;Q(CFMVM<)H.M/%29[57\$N(",@`````0```)PD -M``"`>'7/A71E->'^.5\Y(P@2[Q][-^#Z:ENUF&C":#27O/0J\TJ$)-G3)9H8^A@3]$]6ED;96?%'/*20#BPZQK/D7V'^.D"H,+ -M0$*Q2[7-HN"1WS]"3=OX>AH:_3/ZP*$6:DX#ZF^YI!5,OPH[\5,2MT9?&`4` -M'`$``!P!```"````10`!&%6%``!`$0``P*@!`<"H`0(!]`'T`00'Z?>(CFMV -MM<)H.M/%29[57\$N("0(`````@```/PA``#@//A\->)(N8:1Z]N<=#?.X@:#T9ZBDS%@.\3V&X(NJ%[)H!*Q95>H%RE+.+,GB.BSRS&!^UQ$P=S<+-5&0-QZA62N81PPJ(< -ME26J5,_H&&^Q3L>8RH=D@OCTT^5JA5,2MT8;'@4`_````/P````"````10`` -M^%6&``!`$0``P*@!`<"H`0(!]`'T`.0&R?>(CFMVM<)H.M/%29[57\$N("0( -M`````P```-PA``#`>M-S`PK'SH>2),GGP3?HQM!R=-21D\=.AVGMA*Y3'C=W -M<`L[!Y+,>XYOS$YO;)B]AR[.B;6=GK=%@[>ILI5,B`GZX42?.\QG:?T*[6B8 -MD,G>>@!L;ILU^7.LC&>8^NC@*`;GXK(WJ^"]P^,L:Y[T3N"OB"AU4K[$1255 -M[_*J`U5_!+B`D(``` -M``(```!,*0``,-G&VR3>P"97_,"V2D.8]8W51&?((:[N0ME%^DZGHLL["QE" -MDK/$%Y5B#ESA4Q*W1I-0!0!L````;`````(```!%``!H58@``$`1``#`J`$! -MP*@!`@'T`?0`5`8Y]XB.:W:UPF@ZT\5)GM5?P2X@)"`````#````3"D``##B -MB_II&&-:Z&$@)?34]42=!RI\/3]2W(V^Z#@Z\U#A?H7&>9;GI4UMB-O\<%,2 -MMT;U:@4`/`$``#P!```"````10`!.%6)``!`$0``P*@!`<"H`0(!]`'T`20' -M"?>(CFMVM<)H.M/%29[57\$N("0(````!````1PA``$`$6N5SSN<;^U>F@)Y -MS'P-;]A,IYVX>^7W'Q6#P_0CS<[RHW,Q!)P%@J=7[_+@( -MN10B/R%7*IX+(*J4VZU-0`D92#2]^:[.#D@;YZT`GXR(8(]_Q"&/6O[\`+Y$ -MX3$+>1],A+MWD*V0ZSS#E,*FAF[RBI%%@)L -M62^`.`R:SY`XDW&,)[;8B)O9W<^GP?-IZX$"6LOT<'"4KT9R@+LP>(K$_?<3 -MO9KDCCQO*W*A5GTC&W*TUL#$(K\K!-8#"]D5LEZ1:B#A[;P%>>%UOLBB6;,= -MZ_S8DL[$\@A?*3!=2NRRVMD]_S?B96/9Z1NHIA;0]C -M#D'#FXYLZ`!YBF24%[ZA@YZ2E_1\[H=-BG;9'8I2YJY7R]V'\\YQ0^J"EP9@ -M]V7'T;Q-7O-GQB5?$T24%5KBEJ/S=BK4%;^3^==]=D^.S\'%SII^,XJC6*]- -MAQ!0?!<7^YX=II9.Y93:>/1E`>2OEJ2AT$FRQ5O:!YL:]BR!SU^ZFWD@\Y2H0[L#3F2>I2=&]U!9%Q7D25M*=\3PC`WF#MT[ -M4QM)RS55MLZ]G>7SBC,$N@Q2SC3^24R.H8J$J*/0B6YA/GXSD@R-%=)E1 -M"U3T+.\ES!;J!K%$/:RTZYQ<-P^&FA\(98\:T6Q_KS_DTKZF-UW$T(:AKN"O -M)N>F$U9<-V(979$TNIR0*6UM0@'3!Y9:K9AVL`-#P'QR+,+U4@2=5K%X-7-? -M9ZH#.?4M+?GTX2$L/19`C_J'[?ND[^9KXV\RZ-*T'/6"MHYIPOMR*YXF+('8 -ME[9\#1*2J6BZ4Q*W1F'%!0`\`0``/`$```(```!%``$X58T``$`1``#`J`$! -MP*@!`@'T`?0!)`<)]XB.:W:UPF@ZT\5)GM5?P2X@)`@````&```!'"$``0"Y -M`[!AZ)'KAHSDEE][J-<'@0D>GPT]8[OS-E5_+AVMGV?+4:E*]Y" -M6#P%@C.9$,.=W0=Z`+]U@)*X/,2@:%;[H3HLOCE#)HVSW!*F1Y[GRM\+U54/ -M_M,$"6QN&JK/3+Y=$'9@^`:!-&3ID"_4!+]^_K]*`Y,T?0T[\*CP&/^^(LX! -MG%LLS@PO3B;L_:_^0M_G?OH7-R$+,0:6Q=#IMLE,?T7/;LRL9ODZE(=3$K=&4=$%`!P!```<`0```@`` -M`$4``1A5C@``0!$``,"H`0'`J`$"`?0!]`$$!^GWB(YK=K7":#K3Q4F>U5_! -M+B`D"`````<```#\(0``X.0*6?C&5](+P6+?0[ZCJZ15#0;A#/)'53\Q=)JU -MQL;9)`'=_P=5H5/*5&])+0K+ZZ -M*:+7>[4QI;,%7NUB@&!<^+7*&W,`-3KUR!BWYK4MD?J7],SZ[LLTJ]RU126- -M^=:!^H^ZW.":[NV$3;DRU4):KH").`O>=YG[QRI1-E@>IJ4#I:VNH:LMTS[#@XT?3R_SK&",OL@]@:+`"? -MVLVXJ>B05Z/2GU5_!+B`D(`````8```#,(0`` -ML*,.7$D4_"=.<$52(T6/B#7^)%N-`)V\Z58\_'WGP56;9T5-+Q3$K=&*`,& -M`.P```#L`````@```$4``.A5D```0!$``,"H`0'`J`$"`?0!]`#4!KGWB(YK -M=K7":#K3Q4F>U5_!+B`D(`````<```#,(0``L(J0!F:U[WU5_!+B`D"``` -M``@```%L(0`!4.D*J'I%()1A%M^>LA+W)M%']<5J.(7V2<$%X`[S*DAW7.XC -M\"WT!ZOB,MQ=Z476QP_X!;Z!M<9"TD2Q89&J4@W"UP%CZ7N@*S4%;9?NASE\=`T4.([5>:W2`+W>SBU^\7\;D5_ -MN$>M3R.AGC*^V.[,/KY/-.6ZX'%(10NX#?+^`V/6+.M.Y#K';8MQ?MNV,VD# -MIFK@::<84[K]7'ZH/_(U/JD'GB)@Y8+[AAM74Q*W1I5G6$$LI-)YQCUF)'5UH1W\8_X#-':S9R1PV -MMW"1+4\^DP06@/RK:5BNA+J)X7`7RV.[A#GQQV*-Z//Z?:K"(][(0^G#0C#^ -M$'FSC9K*XY,9LWW0WL.K:E.;&5369)O%!Z%]8_R2]PZ(`;5, -MS/(I$CE]&&2>&.8G4Z8YPH-5F'7%BX"4-`R[RICAF\8PMS'KQFKQX^XRL+61 -MCCW*C+7K%65``!`$0``P*@!`<"H`0(!]`'T`&0&2=6-KTN("4(`````````%PJ``!`MM(&H5>P:MK;=R[=`FJ%I0U@'Q]ZZ59W -MHE.AFA!E@<<-S$VV-JB,%)EU'=KO*SK3P6#GBC_L7^X=\P:[4Q*W1E^.!@!L -M````;`````(```!%``!H598``$`1``#`J`$!P*@!`@'T`?0`5`8YUR7(:)&W -M2AD8)8LZYY8VO2X@)2``````````3````#`&EL]PO,X\8[PSX=MMH@A0)Y0G -M3A/RYD8NK]1/`6%:)W=>NCD@V\$OF^4:@%,2MT:EG08`;````&P````"```` -M10``:%67``!`$0``P*@!`<"H`0(!]`'T`%0&.=6-KTN -M("4(`````0```$PJ```PEQ]'28!_6G!#S(7DS_ZA^4-;]HKNQ(4F'9H].0]6 -MWK,2J8Q,EH\K\F?-M8" -MR>-S4Q*W1@ZG!P"8`0``F`$```(```!%``&459H``$`1``#`J`$!P*@!`@'T -M`?0!@`=E>+Q&\MFYTP$``````````"$@(@@````````!>"(``'@```!T`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``X:0$Y0H\7BH+^_/#3D[HL4)W -M>D7L5_7HV@7Q=.MZ4-&;55!'6J^+6!*\'!U:U6*\WI_];38EQT`T<" -M:44U7_MR$029@.:_W3S!"`%;`7B<8'HO;;I`-I=*&I@/B((,HT9'=JC0R_W% -M3E.;X1!3,!\LYS<7OL:I%*)7==HI```DM,&Z#,]-04CV)6O*9Y<1L//&*T^; -M?+-K*2+U1/4UU;$I```<``!`!%]>%V@BN8"9K5A/"FAWR!U>I(EJ````'``` -M0`6#V+6N8M`E3"C;RQ>(E"3))]S[@%,2MT;XM@<`7````%P````"````10`` -M6%6;``!`$0``P*@!`<"H`0(!]`'T`$0&*7B\1O+9N=,!```````````I("(@ -M`````````#P````@``!`!@````$777:P2K&F>.SHX":'FF=#:O'2`5,2MT:J -MQ@<`N`$``+@!```"````10`!M%6<``!`$0``P*@!`<"H`0(!]`'T`:`'A7B\ -M1O+9N=,!```````````I("((`````````9@A```@``!`!@````$777:P2K&F -M>.SHX":'FF=#:O'2`2(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``X:0$Y0H\7BH+^_/#3D[HL4)W>D7L5_7HV@7Q=.MZ4-&;55!'6J^+6!*\'!U:U6*\WI_];38EQT`T<":44U7_MR$029@.:_W3S!"`%;`7B< -M8'HO;;I`-I=*&I@/B((,HT9'=JC0R_W%3E.;X1!3,!\LYS<7OL:I%*)7==HI -M```DM,&Z#,]-04CV)6O*9Y<1L//&*T^;?+-K*2+U1/4UU;$I```<``!`!%]> -M%V@BN8"9K5A/"FAWR!U>I(EJ````'```0`6#V+6N8M`E3"C;RQ>(E"3))]S[ -M@%,2MT9FZ@<`4`$``%`!```"````10`!3%6=``!`$0``P*@!`<"H`0(!]`'T -M`3@''7B\1O+9N=,!2N_$VD8G&DLA("(@`````````3`B```P````+`$!``0# -M```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``"<; -MH7ZMM1R4'#/&V2YK-G2')?M$&9/UWLB$XRJF< -M9LU!JJ:3ZJ@;K<$Y"-CY>*=*WFY2O*)@;L7G4+DD$K(+%U=.E9C&OC,.CP8. -MK7Y,B!KO;-T*K'J4PP(R]>06@>`,:=$FED+A"3FY0!@,ZM,4*0``)([]B@`. -MV*K84M.IZT90@S[3BD.$4[F"UM(>I^:KVZKC*0``'```0`2:?APXG3GO]4&G -MH`;TK]=#+C?])P```!P``$`%'/Y9P,],8VY\_?<3%W\9.WC^SYA3$K=&M1@( -M``P!```,`0```@```$4``0A5G@``0!$``,"H`0'`J`$"`?0!]`#T!]EXO$;R -MV;G3`4KOQ-I&)QI++B`C"`````$```#L(P``T)52R[:II9DG"HH/)2RA@-/U -MISE!P^P19W/PR5"1W+^R-QBRK+(QBB=(5U:$L:&WJ90CB.L;$"LK$% -MX@\ME:NF#KQ\?H"H1'*;AL36MM6P%XI9JBN`$>\M9HH:LA`ESL;-?S9QXX@- -MD3C\AC?=%,=`U;G&]E"4Z*)_`<`R9)F-L'-H4#1F,#"GJB1YU0&I+*QU@Q8` -MF"IK'H'K0&EM%J7:!P3O44D,T'O+\'\Q* -M6]6F.5#23U,2MT;#,0@`O````+P````"````10``N%6?``!`$0``P*@!`<"H -M`0(!]`'T`*0&B7B\1O+9N=,!2N_$VD8G&DLN(",@`````0```)PD``"`ZHW7 -MP0/$&T\;T_Z[??)@JE2.*22;!^\2=&2'^$5O,9'P5N]U@O//\V>W-RA'&-8# -MX"1K(R_E -M:/SB,(<43,`7MVA6B>#$YWL(Z_S,.-P=BCIQF@/VD5,2MT:Y4`@`'`$``!P! -M```"````10`!&%6@``!`$0``P*@!`<"H`0(!]`'T`00'Z7B\1O+9N=,!2N_$ -MVD8G&DLN("0(`````@```/PA``#@(?!JP$V0^KI?'W9.M'W@ZF0@D7$Z\%9` -M9VPY4LZPDB4JI=WD:3)RRE;F>\..54&<+?W3O=EG<-7H!J*=[=L$>Y^&+G*9 -M:#0STV20RNL@S3T5/H*<:*"?G,1;&/J$O$6Z34$#MS+A%Z)V7L^H:9^M&=K(V\^G*U06VI"M -M4NF1-21+%W=IDK<`I>Y+S%,2MT;26P@`_````/P````"````10``^%6A``!` -M$0``P*@!`<"H`0(!]`'T`.0&R7B\1O+9N=,!2N_$VD8G&DLN("0(`````P`` -M`-PA``#`%DD!$",=@1Y&.**3'YX_>#"$":9$NM<*JS10"KC_S-[_%S+CI8%D -MVS<&U>#5,SG4P0%SO7NV4PK(ZLBFGBR_Z@>@8N$)#%W$2MY-J6OW?[/XC!;..,7_&D>.\9`-_.5D& -M.&JFP;TXCZ7WU1"G$F1BF'9DRUWE]8Y,$'X&(*5/8][B<8*?8_D3.>++A8XG -MZY0?>@-NQ9EY'\1M;D)3$K=&AF8(`&P```!L`````@```$4``&A5H@``0!$` -M`,"H`0'`J`$"`?0!]`!4!CEXO$;RV;G3`4KOQ-I&)QI++B`D(`````(```!, -M*0``,`0VS,2UR`GZ$Z-;SB=NGT+%AW+7%(FX03:-V7^%.EVHT!T:^FQHH=$I -MR&'Z4Q*W1H>""`!L````;`````(```!%``!H5:,``$`1``#`J`$!P*@!`@'T -M`?0`5`8Y>+Q&\MFYTP%*[\3:1B<:2RX@)"`````#````3"D``#!I#]L_RR@( -M5J"'M\G""L`5;^Z6#C2=E]Z>G4!G$PUL2J^SO>U\PVL(Q+(2C5;Z\"4;BE6R0)!DX3:T -M:!3,4H(C'?:Q4Q*W1F"I"``<`0``'`$```(```!%``$85:4``$`1``#`J`$! -MP*@!`@'T`?0!!`?I>+Q&\MFYTP%*[\3:1B<:2RX@)`@````%````_"$``.#J -MB.,CN9]S8X7@D0^5S#,^=H_H]SM9\_:/:\M@[2$+)Y`/D*2K..!_(A(8.H^L -MC4W2(44\9K,A]&)N112N]:Y/N]B3:VW%>:JM-IU.[NRYOF2X$T5#:);@TN8P4Q*W1N6X -M"`#L````[`````(```!%``#H5:8``$`1``#`J`$!P*@!`@'T`?0`U`:Y>+Q& -M\MFYTP%*[\3:1B<:2RX@)"`````$````S"$``+`#-)!2^H9DI?=\%<&&?,-[5!*B:]MU`P?(^9VEDA"?<.0Q2S)HI6.8C!&J'4B@ -M)/)4F%G6<:Q8/B:-,[Q@:P3@A)R`U1`3Q1OWE0;8X8#3*X<4G7^QVRH4H0:D -M:]NYFR=T_]HHV]":8#:^#)V95OD$1WBMY+0+U2?,I..<:ZHNVK#I3B$ZTOR; -M81$<9TUB5SXWDHL&&^D"X+(C_B3^4Q*W1A;;"`#L````[`````(```!%``#H -M5:<``$`1``#`J`$!P*@!`@'T`?0`U`:Y>+Q&\MFYTP%*[\3:1B<:2RX@)"`` -M```%````S"$``+`'EK'S5M'0-9QAY&X26]0!:Z70L4ZE$',#+]9*J8GF'%4/ -M@\R^,9!*4$8_^6=F5O;JJ:_L'/K\A,$#6='D.MM>57J2N'F[\1_/234\,H>' -M?F^8R?@94WX.O66Z8="7+&IO]:F39=QZY*+;@$0[V*.RJ3W5L&F$< -MNO50O=W,A@UTU+$KT/K6!5)#F1.4Z868+4-D@6+_Q`3)S-\\;@R^#7YT08%] -MD*.;4Q*W1LGW"``\`0``/`$```(```!%``$X5:@``$`1``#`J`$!P*@!`@'T -M`?0!)`<)>+Q&\MFYTP%*[\3:1B<:2RX@)`@````&```!'"$``0#NC2,>)D!8 -MBN$Z$ETLZO+HH\W"/*&YHJ5+Y7'.*QLL+R]#]\END%;A+#N=`186L_?:YS_DT(ZJBA8CTHX"'T -MN5;48E3IBB>L)P'R';]]8D=4SE.PJ6`$<7.RP/^)*E2'YH?_:;BQ4_52LGJP -ME,77->[T\S4^DH#)#UV/3JT#\/U[/[H1*^R1SD\+F+NT![5#_"R/)C$810Z3 -MQ`$CDWTFT59US[LRX\EUZJ\E0!04T4*20A]J:)>>`LO0%?J9@YQ_$D -M.LW&2OW7M!:9OM39+(W++>`!!P]3$K=&;0,)`!P!```<`0```@```$4``1A5 -MJ0``0!$``,"H`0'`J`$"`?0!]`$$!^EXO$;RV;G3`4KOQ-I&)QI++B`D"``` -M``<```#\(0``X!49V'AP:RK9/+4NA[`[L&WC:JFI7Z^9,/0^BDK'>P_/NDW3 -MJ+RUCO&8"WK?HZ,K;M@1>Q38FO[&C=.SOV60R.P3AC<1EY5R$=%-A_T69RV$ -MPJUMN.WJH3;K5%J3R-SBVM?^B]&O%/1$&UQ>('LTTD"6C/L7>.556L+7?S_X -MQ2#+]UP9L8FQ@:\/PS7[=N/?@*Y4B=,<9NH.592?'0O67HN?9YU5W6YQ82B] -M4A'^-6CCVLAD#G1;=-&H)ZF"-G,*D\6T&S_P- -M*#U+TNU3$K=&ZA()`.P```#L`````@```$4``.A5J@``0!$``,"H`0'`J`$" -M`?0!]`#4!KEXO$;RV;G3`4KOQ-I&)QI++B`D(`````8```#,(0``L$;\/M1W -MA_`BA4TYU8\?-TZ/T'PP-FSI$32@PX)'IH%6)WQ0O/!.5QRK]H=/\>[HE@^3 -M^]1L-CI5G@[E\>*+-C#.7-\RL=59<[N)T9K#51&AJ0D]>2!JZYH4=:H.=6>7C5EW`+T[*UGGQ=BU_UWPTO<$;3;#)<2B_[C@(Z/4-3C)%=H$>L -M5OB*(2:RO>.!D?G@=TR.@]*8<<5<6_!QX!F\958"B`:#,%4*FHX_96/- -M&?5#1G#1KH/A-/75ILVX$#TKP'). -MSBL,Z,0ID"'$79#RZEZ[R,&6!C>#)IBWOZ*4)2_[FED@!9X2GZC=]4$-T64$_UK[;R6V`O==BMH?O#@M0[(Z6'C-LR38[O -M,;]N:>-=@4L9XNQL=J13$K=&W5L)`(P!``",`0```@```$4``8A5K0``0!$` -M`,"H`0'`J`$"`?0!]`%T!UEXO$;RV;G3`4KOQ-I&)QI++B`D"`````@```%L -M(0`!4&D?")V9OY[R4]G)8Q"%%Q4JLE563R2Q&NNK4=,)6:>?421Y]*Q&Y/?. -M)E!))=[UA#`9VM35D1E82I3$U)45V;3I\]0&1$'V+K&F4ZA',QIDG;_YJ>"/ -MC(14I$@&ZG<&)XA$5*$Y91IN.M49\[`X*^H$MIQHV$PLK&W7L"CF6?$_"Y

VT8#1E%AI_D1?9C-5UC"C`#PO'ZRLT>K%#-;U/;]Z$3?Y"J&< -M$>`&H<7*H__0'K8WF205AI10)727&YZI4$84V0)(;R1:)S2`00`O&U%OF@;B -M0>,II;$3.V77O-ZBM01CP]M7^^*!<_62RV%\:1K,1%Q&\4+B#C/=5&,\GD&RVN2N3!37U-V.".%6O=YQ1NEI[6Q<*;3QP>C%`:+A -MJUZ2.R;LU".I(#(/@7[ZCU"[H`[;4Q*W1BZ0"0!<`0``7`$```(```!%``%8 -M5:X``$`1``#`J`$!P*@!`@'T`?0!1`+Q&\MFYTP%*[\3:1B<:2RX@)"`` -M```(```!/"$``2!?9OM;Z4:%9*J/\$LO%W)Z?!F -M<*TX1BN:D<#E^K_P*G>BX*B6P/C?3H8)NK$$S%N>V*`]NP63GCTF#NN-Z_6N -MEE(PER;&$/RB=20%R;?S5);8S#".V@]UU^U&O,YUS/`I3LC61A>2AHTNB`.N -M/:3*AZMF`@#IL8@KS%/UM-O5DKT\65&$AG04%IBYJG!"H9S.7T$Y;?=' -M;M1A*$V#"PJ@8=WTHMSI%[L4M#[!G4_8@:A$*@5V@,I4JCWX?FP!XL)5\IL; -MR;4886.%6O``!`$0``P*@!`<"H`0(!]`'T`&0&25[3?=#I72X>/J@R6%]&F%Y43=N*= -M-B/^]8:YDKP\\8)8VF@4Z7\[0B,#-@.#U_G?PMYK4Q*W1CG""0!L````;``` -M``(```!%``!H5;```$`1``#`J`$!P*@!`@'T`?0`5`8Y7M-]T.E=+AX^J#)8 -M7T:85RX@)2``````````3````#!K^/9I^B=%'>&]FM6I`$MIB^WWZTWU;%:' -M/J@R6%]&F%TWW0Z5TN'CZH,EA?1IA7+B`E(`````$```!,````,.%3 -M)(^9B6RGPVX\!=KZ,;N%8_,EW2U9BH*R?3I9/5':5TG1GJ,C`YPN6_(44Q*W -M1AC<"@"8`0``F`$```(```!%``&45;,``$`1``#`J`$!P*@!`@'T`?0!@`=E -M+)%1F[&JB&P``````````"$@(@@````````!>"(``'@!``!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``XQ?;4?`0P*!KDHLOO9)I_$,U3TJ9*XSL -M9(B5,,_7)[MS@KF0XW(#39N@Z4^@KSW5F/VV=I,;9\Y()T-,I]=W5B37Q.21 -MRAU4?KF3>MSK_H>+MEK%KC_F^8*B@M3X#E(1+T,^*._T3OJMC# -MVQE>P+'Z*>_SJ"0Y[)8I```DP&BT^3K>S?^_3EH`W[Q->(:#IIZ7`QG49A]9 -M&(")%'@I```<``!`!&&=F>%1`547X6IY>]'$J=;6E?A7````'```0`4YV4PZ -ML.='L!JC*KDX47H5O9V4XE,2MT8W_@T`F`$``)@!```"````10`!E%6T``!` -M$0``P*@!`<"H`0(!]`'T`8`'92R149NQJHAL```````````A("((```````` -M`7@B``!X`0``=`$!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0`` -M#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```" -M`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``.,7VU'P -M$,"@:Y*++[V2:?Q#-4]*F2N,[&2(E3#/UR>[R6*0``),!HM/DZWLW_ -MOTY:`-^\37B&@Z:>EP,9U&8?61B`B11X*0``'```0`1AG9GA40%5%^%J>7O1 -MQ*G6UI7X5P```!P``$`%.=E,.K#G1[`:HRJY.%%Z%;V=E.)4$K=&M/T$`)@! -M``"8`0```@```$4``915O@``0!$``,"H`0'`J`$"`?0!]`&`!V4LD5&;L:J( -M;```````````(2`B"`````````%X(@``>`$``'0!`0`,`P``#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"``#C%]M1\!#`H&N2BR^]DFG\0S5/2IDKC.QDB)4PS]1U[@.4A$O0SXH[_1.^JV,/;&5[`L?HI -M[_.H)#GLEBD``"3`:+3Y.M[-_[].6@#?O$UXAH.FGI<#&=1F'UD8@(D4>"D` -M`!P``$`$89V9X5$!51?A:GE[T<2IUM:5^%<````<``!`!3G93#JPYT>P&J,J -MN3A1>A6]G93B51*W1@`-`P"8`0``F`$```(```!%``&45=T``$`1``#`J`$! -MP*@!`@'T`?0!@`=E*,$P]NS/%S,``````````"$@(@@````````!>"(``'@! -M``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``DL>HR!Y7IBP,*-@E -MD$$1/GM`)#VQN+F[T^F21N>:'W>C5JLN<^6RJI51,#POEL[+E!*M[2S*$#\; -M3"#T)1R>"V&1'1"Z+.U;WA^)0O\^.IS3O?*#`F7PZV^3+KWWA0[\T_:6O6P? -M&^I`B;FVJCWQ:^%ALFIL@K6T%B5)LCD],R,I```DQ4AV,6@B@TU=\+W9CN9* -M.E)XUVT[Q$3QT@ZH1!*]?S4I```<``!`!'VY,!_24)D1^,U[Q;?XQ+NK1695 -M````'```0`7,ZP(4(VWF*-_0DC.2^-B'^6TFVE42MT8)-@8`F`$``)@!```" -M````10`!E%7A``!`$0``P*@!`<"H`0(!]`'T`8`'92C!,/;LSQ5Z8L#"C8)9!!$3Y[0"0]L;BYN]/IDD;GFA]WHU:K+G/E -MLJJ543`\+Y;.RY02K>TLRA`_&TP@]"4-=M.\1$\=(.J$02O7\U*0``'```0`1] -MN3`?TE"9$?C->\6W^,2[JT5F50```!P``$`%S.L"%"-MYBC?T)(SDOC8A_EM -M)MI5$K=&E7<,`)@!``"8`0```@```$4``9168@``0!$``,"H`0'`J`$"`?0! -M]`&`!V4HP3#V[,\7,P``````````(2`B"`````````%X(@``>`$``'0!`0`, -M`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``"2QZC('E>F+`PHV"6001$^>T`D -M/;&XN;O3Z9)&YYH?=Z-6JRYSY;*JE5$P/"^6SLN4$JWM+,H0/QM,(/0E')X+ -M89$=$+HL[5O>'XE"_SXZG-.]\H,"9?#K;Y,NO?>%#OS3]I:];!\;ZD")N;:J -M/?%KX6&R:FR"M;06)4FR.3TS(RD``"3%2'8Q:"*#35WPO=F.YDHZ4GC7;3O$ -M1/'2#JA$$KU_-2D``!P``$`$?;DP'])0F1'XS7O%M_C$NZM%9E4````<``!` -M!8HW]"2,Y+XV(?Y;2;:5A*W1E.%"@"8`0``F`$```(```!%``&4 -M5J(``$`1``#`J`$!P*@!`@'T`?0!@`=E?6!^U()9U;4``````````"$@(@@` -M```````!>"(``'@"``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MDJ#1:713(^`,5-K40>[29;JFPDO03M2#C;<"U$5H6TFNUQP5$SI.IW6#J<85 -M/.KU%#JE;E@&V3RSEK,C2K8:`O)2A6R-:7@A0"3Y7QPG6?!%)IN0YC,VQXK_ -MS%`#:/U,JG=],I>`OKK>[&VZU9*N4X$DTSAH*R.=YQ!8G$68$X\I```D9#0A -MW!1M\,&1WV!V6K&16TPK]#R'2;J9YO7;,@Y?7!PI```<``!`!"1#Y@A+%-M: -M7,A;@+W'B]FFW8#7B5@U82MT94 -ME`H`7````%P````"````10``6%:C``!`$0``P*@!`<"H`0(!]`'T`$0&*7U@ -M?M2"6=6U```````````I("(@`````````#P````@``!`!@````(@6O$4[TU; -MRF+SUHQ(MI_%P,582MT9BI`H`N`$``+@!```"````10`!M%:D``!`$0`` -MP*@!`<"H`0(!]`'T`:`'A7U@?M2"6=6U```````````I("((`````````9@A -M```@``!`!@````(@6O$4[TU;RF+SUHQ(MI_%P,2(``'@```!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``DJ#1:713(^`,5-K40>[29;JFPDO0 -M3M2#C;<"U$5H6TFNUQP5$SI.IW6#J<85/.KU%#JE;E@&V3RSEK,C2K8:`O)2 -MA6R-:7@A0"3Y7QPG6?!%)IN0YC,VQXK_S%`#:/U,JG=],I>`OKK>[&VZU9*N -M4X$DTSAH*R.=YQ!8G$68$X\I```D9#0AW!1M\,&1WV!V6K&16TPK]#R'2;J9 -MYO7;,@Y?7!PI```<``!`!"1#Y@A+%-M:7,A;@+W'B]FFW8#7B5@U82MT9>R`H`4`$``%`!```"````10`!3%:E -M``!`$0``P*@!`<"H`0(!]`'T`3@''7U@?M2"6=6U*ALTU^%CPR2W[F.R!:W?'!EV0*S>[J:=>W$SY^)?_XA&$5I4_$ZL<8$R57 -M.L=.*]O:0,O4NJK4%[TM4""R6Y+E')`"3>'>W2`NM%5,.Z0^Z4*>D_G^+0Y8 -M`W$]S5;G9/$/*0``)#,0:W/^$W*XWM*QG!2,5/SB?3Y^;-%[<*<*4>4L]VLP,`,U:9@6**@SVQY>.8*X -M'EV&S;Y)=P=(\^%'I*(-.F5*F%8>_&P;\`O?=C+>,.*,'6TW!2S20]Q]\;.% -M#Y@,*[]_Z8\.A3%_2?,ZP5BYZ_JO='ONJ"O&^FW-Q<)JL"Y@<'R$]J@6/'RY -M`%&@"PO*%@9NIHX>2$*&W;#(@MQ,*I_8)3)"P5734;N9AB+X`!6.30) -M+9';#-]XT=Y>H`VMVY:7=.B/&2>MA-P+=^,L'2S)]*N@V!KLR(_X;9W*>L\^ -MO^Z>,DJ6H1[CV7*;%TF(W`@2P?`$-4[7Q2?$C?)`U]7X?0("XX -M.2%.6582MT:?,`L`'`$``!P!```"````10`!&%:I``!`$0``P*@!`<"H`0(! -M]`'T`00'Z7U@?M2"6=6U\5"W#< -M*SD'TL:([`R"J1B*6;6#X`7/:.G#6SJ^ZIH)"6HQ#!\XC#K*1?=C.E2`,$8P -M+?Q5=JNLA@\E]RFI8!F.6X&>*7O3:UA!W<=XY)^>GV^($?>>P/A'L4Z]EB.L -ME)U6)^'[>VQW@F/\[84#?$?K1-86JU$HTE;.F%1^[;;DD=`GE*D7_PNQ3#16 -MTR1?/=">OV*"O-D>.#+QDK#3]2EEJ^[2HJ+/A&WDO/TII"K/'`_59G)'ZR5' -M%'06FF]SGC/.MK'*,J(?AXAO=@;,%K>L!$4?2BMKL+<(E582MT:..PL`_``` -M`/P````"````10``^%:J``!`$0``P*@!`<"H`0(!]`'T`.0&R7U@?M2"6=6U -M0LPT19,'(EKNAN0H"<8I3C,(B3(G2>SM_WUOPC.( -M0>AL%\)F)2);%)W&':OR942M1K#+-$$'E[XR%9^\(>/.5MWD`MVHU#=):)_? -M^S(3GB+P8+;2--#K+Z\]_!.DX"8K]W+AV>UUEBN!)-Q6$K=&.$8+`&P```!L -M`````@```$4``&A6JP``0!$``,"H`0'`J`$"`?0!]`!4!CE]8'[4@EG5M7,Z -M_-?BS(I0+B`D(`````(```!,*0``,*Q-PU5PG$:'J=,)S)K?5KUKV1&QX'9< -MR\5/%[0[ON[H^"W5_4FZN-.DU-(+5A*W1B-C"P!L````;`````(```!%``!H -M5JX``$`1``#`J`$!P*@!`@'T`?0`5`8Y?6!^U()9U;5S.OS7XLR*4"X@)"`` -M```#````3"D``##4JX&=3IWB]/_U*\)0,$3;RAWH<( -MLI!C!CV;0#*.;E82MT;&?@L`/`$``#P!```"````10`!.%:O``!`$0``P*@! -M`<"H`0(!]`'T`20'"7U@?M2"6=6UMRP_#]Z&R0ULR1C\VF,A#TA,N]Q]^`$C[\_`C&$T8:.K5/X?TABDAM[NR^ -MKD'W@1`.%8P6KCH#1;:&[?E4[Q._W5O,EX=P371$N0J(.Z,5P;9W8;Z!98"Y -M/)H,HQ+`T<^UHEBFQG_@>XFS*I:7^71]KV>\A'(")48IJOBFH)GC,!$_WQM3 -MQ2,+?DFJ%P0S,T3Q7=JLSDQK[+IA7]^)$`"RCO,'6IU$S#8V;U'=4#X3_&%< -MY?ID!HL^A+P_5.]=&"$P6H&3>R2\`D!OJ&'CPR`GP%WYE2RFLLX6(3XDD?(/ -M!/H487@G53\9XA![IEL9K79H[:[_T -M9F'4!7L<*A"S*AWY%V7*W/C)GMM`T[Q.[,P?T,%[$`YLF<&?,?I1-?FF0B<8%#1``3$Z!?]$NP\^RT%XK`PK!BRAI -M'S7"^-9;!Q_Q0!A;(A,UBP*EQ=3VB$]&RY?OQ166DPA*B%[>#44[DR]3SSCU -M"OP4H'1P$F^]E([L!N3A=A64#"MR@;]K!G^K@40E?R5A_"?)S1ER+S@S.[Q^ -M.4;`@B^$'9NGW0(I5A*W1B::"P#L````[`````(```!%``#H5K$``$`1``#` -MJ`$!P*@!`@'T`?0`U`:Y?6!^U()9U;5S.OS7XLR*4"X@)"`````$````S"$` -M`+"&+1MM])JHU$U%9T5[:0EI](-*$2)KKDD4F_K"=JT[KJW`,@N -MS5\8"]/0[G"H!2,M70SA':"$?_K`2HMSB@BL+.UEC8R`+) -M2L>#@W.$D7369;Z_`?MU2(;F;-N,N@\M9"A)AF95Z$Z.#B(]"JUB5\!V**[+ -M*MY:7O50OR;TK*0%)^$\YGG;8QJFO3JX/*@\35D-"60U`TJ'=E.B*%R'[,JIXD>._*DO75?BWRN) -M5I[.P)AS%JQM-%C1:N1^V`".MLE"4_-K!93?R3D;5>`Z2,HP'>)BC4OS51D3 -MKLWI#84XU66Z\N4_:SJ"/E+&?6Y5680CFNK+^!11` -MFD6[JGFIVPB\D?_WB3;Q-4P)X[*:5A*W1I?;"P`\`0``/`$```(```!%``$X -M5K0``$`1``#`J`$!P*@!`@'T`?0!)`<)?6!^U()9U;5S.OS7XLR*4"X@)`@` -M```&```!'"$``0`S!PQ^M?B#S37HXP/=9E%-FV-ZMK$1>4;[+W_9'!3V62`8 -M"1PU9;Y/=GM.G`=Y#\NU\WVUPR!2.`YYY-9HI(*WW?U!= -MI-IY9*B_>'GDZ!*.P`HBL39*_)'SG.XJ4/ZI;W#":"B<4.KQ,^Y6$K=&4><+ -M`!P!```<`0```@```$4``1A6M0``0!$``,"H`0'`J`$"`?0!]`$$!^E]8'[4 -M@EG5M7,Z_-?BS(I0+B`D"`````<```#\(0``X-`+9=P_Y0F7`.$O0Z\95S+G -M%Y7X?A:G;@'&)=MN&$?WPFVCGFP]!JL9R8Q"W\82VL'5$IO*`,52(95Z@LQ" -ML>3PLG=F`>EK=WR3]`CD`+(6>('YRQDC7I\WLOC0=ASMR5N"F*`1KV>I(^QG -MZS-PG'9=S%9J)D993Y^%_Y?U,503!BK4+@(.@A]41!FJ_V224MJ+KU6+JMMO -MF_"3J9B?PC')L:H21T7[O&4V0I:=9"3GI'0AW?PR,$\%=BS"-/;BUAL]_D$? -MP.O'*D)/FU,D_X(_F6N3)L3ON6@J#!A6$K=&@O<+`.P```#L`````@```$4` -M`.A6M@``0!$``,"H`0'`J`$"`?0!]`#4!KE]8'[4@EG5M7,Z_-?BS(I0+B`D -M(`````8```#,(0``L)-MCFD9GIZ0XB[Q*`>3P3(!$C&DIS<`P(5//W;,5X!X -MY*U4[%YN+8!^,"]!O4W_;%BL!/7@-_5;_S.$1"!\.U,DCBW>=,:?6-S3L7.H -M(N`VK"N8+Q;?X4WNPKT8V>:POW/!)DT1J\6E\[1K)L;8Z+-^@6@O:8#(C/N? -M*OAY&'U\IZ'DE#]0J`YC@-EKCR/I=[>*N+T_#J<0,_J-LG.:6+>PW35_$KZ9 -M*9"2=`I6$K=&)QH,`.P```#L`````@```$4``.A6MP``0!$``,"H`0'`J`$" -M`?0!]`#4!KE]8'[4@EG5M7,Z_-?BS(I0+B`D(`````<```#,(0``L*X>9!RT -M5^4F!6*;_A2VL0HBFF4]C"=_:/G!;+Z.$'[T`>CC3N3)[CK-@V5@SLOH71&C -M?M?PD*UQ7+/1E1R'=TXYJ6:^C');8*?7V1J-8$$<;$8$X-ZO>H,E:G?NI#S9 -M>2%^!^8V=P5AYOY8"3^M#12VP/Q^CQ9*9-U50Y#;[SO=#O]\J"/SR'`@"_O*TWZ'@A7Z -M2?<3IHVCF]Z8$F7R,JY#_XS6\<3,X9D<^&*9$1\N<8% -M[>C)%-%$*72:U&EU(DA38,1L&9*0896+:>?)AU.N($`0&&P&+-.I(2KZ*:3U -M0`-6=^.`6-H.PTEU/+QY!Y^WGU9#Y685C*P,*H1!ZSU=3]EDL+#F=<'C);QR'OV,3LZ;+*9B6X',<\6]=JZ;DAP3,\09JJC@-9X63C8\ -MUZ.MGW7K.&+:O._A'P7S!62=E(Y-&`Z6+2;@D`]9[(-)TS`O.OL&#A6]C^CQ -M%KST3``!K*2Z%I/4'UZ:RHQA[RBD=A(M=RB -M=X^D8L&M/6O7=BN%K.'5`:[=\CXE;@_]%&MW'"@K&2(%:Z``!`$0``P*@!`<"H`0(!]`'T`&0& -M26EAWC0"RW4LII*]/I]H;A@N("4(`````````%PJ``!`J09)'+@P0R?6`N"S -M/$+&E5V>KP`MG!,/UE]<]=S=,MH>J40;1>."DPL>[B[#1!)!6&CPZ\_@YLIX -ME($,5A*W1FJP#`!L````;`````(```!%``!H5KL``$`1``#`J`$!P*@!`@'T -M`?0`5`8Y:6'>-`++=2RFDKT^GVAN&"X@)2``````````3````#`1>SWX#\H\ -M5B66DCO^;A!_O!#J2<+7C#B;4#&H6ZQ7@^SHYPT!X%PODV5JI582MT8YOPP` -M;````&P````"````10``:%:\``!`$0``P*@!`<"H`0(!]`'T`%0&.6EAWC0" -MRW4LII*]/I]H;A@N("4(`````0```$PJ```PAROHV_3YU=\1X)$.;0M>R_DY -MN!'-;Q)@L%!+YW/+]LC\V]_$#NGK"9#_=4=6$K=&U,P,`&P```!L`````@`` -M`$4``&A6O0``0!$``,"H`0'`J`$"`?0!]`!4!CEI8=XT`LMU+*:2O3Z?:&X8 -M+B`E(`````$```!,````,"%,H&*`C,&A;\^6XC4"(``'@#``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``%T'N'DL5 -MFOE"4(&/OV3X]513_#/:B,48;?1AK$#:-3W24];BD"V@GIR$']/Y]=/1K#%^[A\S,60**>E.S>'M98%PI```<``!`!.3REOSWX!WO,X:6[8@X -MC7REQIR:````'```0`7>T?;1'^^AB%:O(=SN"^!18\1H"%<2MT8LH@$`F`$` -M`)@!```"````10`!E%;'``!`$0``P*@!`<"H`0(!]`'T`8`'92_460$#H?$0 -M```````````A("((`````````7@B``!X`P``=`$!``P#```,`0``#(`.`(`# -M```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(` -M``$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"```` -M"`0```XH``"(``(``!=![AY+%9KY0E"!C[]D^/544_PSVHC%&&WT8:Q`VC4] -MTE/6XI`MH)Z4?L&RU<>-2O2+U:EFYZZPK= -MM!$@]9T&C:7ZDCIB6VREH5#.V*X=B+'XBD7R2(U)*TTK\][G/V)W5R@V:KY7 -M+:(8&(@\*0``)!A>7Y5,'`)@!``"8`0```@```$4``916S0``0!$``,"H`0'` -MJ`$"`?0!]`&`!V4OU%D!`Z'Q$```````````(2`B"`````````%X(@``>`,` -M`'0!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"```70>X>2Q6:^4)0@8^_ -M9/CU5%/\,]J(Q1AM]&&L0-HU/=)3UN*0+:">G(0?T_GUSKJ%:[.F_U4@K7E' -M[!LM7'C4KTB]7-K7FI9N>NL*W;01(/6=!HVE^I(Z8EMLI:%0SMBN'8BQ^(I% -M\DB-22M-*_/>YS]B=UUE@7"D``!P``$`$Y/*6_/?@'>\SAI;MB#B-?*7&G)H` -M```<``!`!=[1]M$?[Z&(5J\AW.X+X%%CQ&@(6!*W1BWQ!0"8`0``F`$```(` -M``!%``&45N$``$`1``#`J`$!P*@!`@'T`?0!@`=E1;`.U'S)V3D````````` -M`"$@(@@````````!>"(``'@$``!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``FOFCDRG%RS_]A:_I''8-.=P6N2\HJA]):LC=6 -M#JVI/%7G.+M_9W<=_NQAIB'HB=]Z:&3:L:82KW\@;#Y%\118+P.N".2\7M\% -M"3B`(1AKZHX7R;\-5(!\@@`2SW]RS3)HQ5"VH[MP'`!'45M?J:ATO8=@Y(8I -M```D_2]SM(UE*'Z=[>8^JLSP>$,$&\2`#)CC*U"0I```<``!`!+C1 -MT=[3`(V=B74VS/SU\07ZM&\4````'```0`5A$BB_IFADVK&F -M$J]_(&P^1?$46"\#K@CDO%[?!0DX@"$8:^J.%\F_#52`?((`$L]_WF/JK,\'A#! -M!O$@`R8XRM0D*0``'```0`2XT='>TP"-G8EU-LS\]?$%^K1O%````!P``$`% -M81(HOZ7(P)T;W)M9CAQ@67>0BK]9$K=&?1L``)@!``"8`0```@```$4``916 -M]@``0!$``,"H`0'`J`$"`?0!]`&`!V5%L`[4?,G9.0``````````(2`B"``` -M``````%X(@``>`0``'0!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``": -M^:.3*<7+/_V%K^D<=@TYW!:Y+RBJ'URS<[ET3HSQK?;YXEJR-U8.K:D\5>B)WWIH9-JQIA*O?R!L/D7Q%%@O`ZX(Y+Q>WP4).(`A&&OJ -MCA?)OPU4@'R"`!+/?W+-,FC%4+:CNW`<`$=16U^IJ'2]AV#DABD``"3]+W.T -MC64H?IS>,#J1YWMYCZJS/!X0P0;Q(`,F.,K4)"D``!P``$`$N-'1WM,`C9V) -M=3;,_/7Q!?JT;Q0````<``!`!6$2*+^ER,"=&]R;68X<8%EWD(J_61*W1NYF -M#0"8`0``F`$```(```!%``&45Q@``$`1``#`J`$!P*@!`@'T`?0!@`=E&W@L -M#DI!)S@``````````"$@(@@````````!>"(``'@'``!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``$4/J@.WN;TE4B$D`#V:_?]BH^$6"APE8*]CO -M;/9#I\LJ'D*L`O!ZZX-0.T7J"[E%F$PY&$',A)#HS?Z\U"5IOQS>QEIB]B.6 -M2[C2]?UN$&AT_V>8T+-[6=--@*4OI&='#.?HE8Z8P-FB+X!Q-H17>Q80%'7;.2CO:=VT````'```0`5*8(>"+70` -MV]^\L=!W@@8WSO`EP%H2MT;T4P$`F`$``)@!```"````10`!E%<<``!`$0`` -MP*@!`<"H`0(!]`'T`8`'91MX+`Y*02NN#4#M%Z@NY19A,.1A! -MS(20Z,W^O-0E:;\UG338"E+Z1G1PSG -MZ)6.F,#9G.+S31N;^K:TF#N!;Q=!#6B5RG,"*X'V*0``)#;%&A9)P\W7"&R+ -M1#[;!>PK,M]2QY=3VZ*0``'```0`1WHB^`<3:$5WL6$!1UVSDH -M[VG=M````!P``$`%2F"'@BUT`-O?O+'0=X(&-\[P)"P.2D$G.``` -M````````(2`B"`````````%X(@``>`<``'0!`0`,`P``#`$```R`#@"``P`` -M#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```! -M`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$ -M```.*```B``"```10^J`[>YO252(20`/9K]_V*CX18*'"5@KV.]L]D.GRRH> -M0JP"\'KK@U`[1>H+N4683#D8074]NBD``!P` -M`$`$=Z(O@'$VA%=[%A`4==LY*.]IW;0````<``!`!4I@AX(M=`#;W[RQT'>" -M!C?.\"7`6Q*W1CRB!0"8`0``F`$```(```!%``&45SD``$`1``#`J`$!P*@! -M`@'T`?0!@`=E_!/(*-AX-7(``````````"$@(@@````````!>"(``'@(``!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``,S2A&EML7.)E[/;^^ -MQX5%'9@3G_U57=5X@C$K;S'[7[_58\SGO.S]2X%SWHL^J.V\B)_ -M_&F/_JX3\!Q;5QV,Q[(@R*A]:+@H!W]*ZY`H88DI```<``!`!,5#H05($E<4)DJR)5^4QNH=(N-O```` -M'```0`7;:18A1DF+F-*_'"C1S"=@1.[5(UL2MT8%S@@`F`$``)@!```"```` -M10`!E%=```!`$0``P*@!`<"H`0(!]`'T`8`'9?P3R"C8>#5R```````````A -M("((`````````7@B``!X"```=`$!``P#```,`0``#(`.`(`#```,`0``#(`. -M`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@`` -M!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"( -M``(``#,TH1I;;%W'Z=_3S$[*D0!;8P[*=`-.+;#?Q-X\Q[5B`?C#Z_G!^PXD -MN5"6K!QSOJ^>C*EQ7CB9>SV_OL>%11V7.L9((Q*V\Q^U^ -M_U6/,Y[SL_4N!<]Z+/JCMO(B?_QIC_ZN$_`<6U<=C,>R(,G,I1^BOB`V*0`` -M)'55Y`8D6HS'^!B2P-CI=!J9\WBH?6BX*`=_2NN0*&&)*0``'```0`3%0Z$% -M2!)7%"9*LB5?E,;J'2+C;P```!P``$`%VVD6(49)BYC2OQPHT`@``'0!`0`,`P`` -M#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"```S-*$:6VQ=Q^G?T\Q.RI$`6V,.RG0# -M3BVPW\3>/,>U8@'XP^OYP?L.)+E0EJP<<[ZOGHRI<5XXF7L]O[['A44=ESK& -M7*C$UZ!.?_55=U7B",2MO,?M?O]5CS.>\[/U+@7/>BSZH[;R(G_\:8_^KA/P -M'%M7'8S'LB#)S*4?HKX@-BD``"1U5>0&)%J,Q_@8DL#8Z70:F?-XJ'UHN"@' -M?TKKD"AAB2D``!P``$`$Q4.A!4@25Q0F2K(E7Y3&ZATBXV\````<``!`!=MI -M%B%&28N8TK\<*-',)V!$[M4C7!*W1N@=#0"8`0``F`$```(```!%``&45V\` -M`$`1``#`J`$!P*@!`@'T`?0!@`=E\PI"*U/]B.P``````````"$@(@@````` -M```!>"(``'@)``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``9?+2 -M22A&RE4@,KU7BK]4\K%]CR>^5N+`P$.7KD:<[-P3V>W6NG9\)#0W$%!A84)K -MQ31X/0`*DTC5!````'```0`6)CF[_H0HNRZPY=)NV848)"O!Z*5T2MT:Y!0$` -MF`$``)@!```"````10`!E%=W``!`$0``P*@!`<"H`0(!]`'T`8`'9?,*0BM3 -M_8CL```````````A("((`````````7@B``!X"0``=`$!``P#```,`0``#(`. -M`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P`` -M"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```" -M````"`0```XH``"(``(``&7RTDDH1LI5(#*]5XJ_5/*Q?8\GOE;BP,!#EZY& -MG.S<$]GMUKIV?"0T-Q!086%":\4T>#T`"I'+(%T`!?YXI,#J&H#;M+VLJFNR -M]5BH,ZS\94,J^59!$*[.%JL,I/PWT+'`'%<(!\.D5VNC]"CRX>%I@&ZYV-C$ -MW1TY>XF7W;(4*0``)*@C0.3H@1C;V2"7`"#T#WO#Y= -M*0``'```0`3`]8'_4H7*4<8R;6IA@8Z2'M(U00```!P``$`%B8YN_Z$*+LNL -M.72;MF%&"0KP>BE=$K=&7T<'`)@!``"8`0```@```$4``917?@``0!$``,"H -M`0'`J`$"`?0!]`&`!V7S"D(K4_V([```````````(2`B"`````````%X(@`` -M>`D``'0!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"``!E\M))*$;*52`R -MO5>*OU3RL7V/)[Y6XL#`0Y>N1ISLW!/9[=:Z=GPD-#<04&%A0FO%-'@]``J1 -MRR!=``7^>*3`ZAJ`V[2]K*IKLO58J#.L_&5#*OE601"NSA:K#*3\-]"QP!Q7 -M"`?#I%=KH_0H\N'A:8!NN=C8Q-T=.7N)E]VR%"D``"2H(T#DZ($8V]D@EP`@ -M]`][PW,W)K>KNS(M*C*`=47N72D``!P``$`$P/6!_U*%RE'&,FUJ88&.DA[2 -M-4$````<``!`!8F.;O^A"B[+K#ETF[9A1@D*\'HI7A*W1NI4!0"8`0``F`$` -M``(```!%``&45Z```$`1``#`J`$!P*@!`@'T`?0!@`=EI0:O#^ZBU20````` -M`````"$@(@@````````!>"(``'CW``!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``+8RU$A8C5RN?P)@4:)L^XFW*$_8VT;V9`;MJ*MGSY@.@WJDZ -M;WQP\MVG#I@,?<>;^$0J2N`UDRXIC_'<98<)_$4N9ZA8_-W]D8B[IH0B?Z-\ -MJ1M]@=DW*>?E/(9K-@*WMW-9#6&0\0]E*/#/-*3]+Q>/W>G4$$>%8:"`;UW^ -MV?`I```DW([#P)*^[_MVQ4@\YVSO'-"U>%42CB0'`M^55B9;S#LI```<``!` -M!'9;UA_^[%&POS!_IT!VS@OQPSE5````'```0`4/Z53$;W;#'.!/$P23#RZJ -M@@)ZF5X2MT;#?P@`F`$``)@!```"````10`!E%>D``!`$0``P*@!`<"H`0(! -M]`'T`8`'9:4&KP_NHM4D```````````A("((`````````7@B``!X]P``=`$! -M``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0`` -M`P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```( -M`P``!0,```@$```"````"`0```XH``"(``(``"V,M1(6(UH6/S=_9&(NZ:$(G^C?*D;?8'9-RGGY3R&:S8"M[=S60UAD/$/92CP -MSS2D_2\7C]WIU!!'A6&@@&]=_MGP*0``)-R.P\"2ON_[=L5(/.=L[QS0M7A5 -M$HXD!P+?E58F6\P[*0``'```0`1V6]8?_NQ1L+\P?Z=`=LX+\<,Y50```!P` -M`$`%#^E4Q&]VPQS@3Q,$DP\NJH(">IE>$K=&/\$.`)@!``"8`0```@```$4` -M`917LP``0!$``,"H`0'`J`$"`?0!]`&`!V6E!J\/[J+5)```````````(2`B -M"`````````%X(@``>/<``'0!`0`,`P``#`$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M```MC+42%B-7*Y_`F!1HFS[B;J3IO?'#RW:<. -MF`Q]QYOX1"I*X#63+BF/\=QEAPG\12YGJ%C\W?V1B+NFA")_HWRI&WV!V3W"(``'CX``!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``4N^_SVHGC*OO&ALTD&YSO@`1<_@R+DRH -M2_PWG(Q+9I%?YX#X'M:UKRL^PS*F(B)=K?_6]([QNPJKQD+3]JNX.=RN=-F -M93:UI\:2&&[,X2^GY'<#>A4=-X.N"P#L)Y -M]%E:.&4I```<``!`!)O7#/7XX1G=\H]*+_>#5T)RMA(N````'```0`7DQ5;9 -MKLH8%7`$`"%JZ5)E9\I]F&`2MT:(MP``F`$``)@!```"````10`!E%@E``!` -M$0``P*@!`<"H`0(!]`'T`8`'9;BNZP&%`)3S```````````A("((```````` -M`7@B``!X^```=`$!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0`` -M#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```" -M`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``%+OO\]J -M)XRK[QH;-)!N<[X`$7/X,BY,J$O\-YR,2V:17^>`^![6M:\K/L,RIB(B7:W_ -MUO2.\;L*J\9"T_:KN'.KTSI'VSCL741*H0!52)+*@^1_;N\AG!TP$E3#*?L) -M/!/QU'!0!:/C$1@\F'CG#K@L`[">?196CAE*0``'```0`2;UPSU^.$9W?*/2B_W -M@U="/@``'0!`0`,`P``#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"``!2[[_/:B>,J^\:&S20;G.^`!%S^#(N3*A+_#>UK6O*S[#,J8B(EVM_];TCO&["JO&0M/VJ[ASJ],Z1]LX[%U$2J$` -M54B2RH/D?V[O(9P=,!)4PRG["3P3\=1P4`6CXQ$8/)AXYW*YTV9E-K6GQIS` -M=QO:C^^;42D``"090*W=A;]Y(8;LSA+Z?D=P-Z%1TW@ZX+`.PGGT65HX92D` -M`!P``$`$F]<,]?CA&=WRCTHO]X-70G*V$BX````<``!`!>3%5MFNRA@5<`0` -M(6KI4F5GRGV881*W1C$%!0"8`0``F`$```(```!%``&46*$``$`1``#`J`$! -MP*@!`@'T`?0!@`=ES$9T>B$M_B8``````````"$@(@@````````!>"(``'CY -M``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``71DE8+_9@V9\W7]) -M`#*@MJ9+V5ZG6U9PWQS:?1==1B7NN;M7[IXI```D!`/L?Y0'(Z]]O-G$G_/M -MW7/)T^PYEZO\9IN7.;+*:V\I```<``!`!`W0;171?.OZJF9[[-T$F$[*D@BK -M````'```0`7DG3]AYR?URZ"LP':B'BXP4WA96V$2MT:',0@`F`$``)@!```" -M````10`!E%BF``!`$0``P*@!`<"H`0(!]`'T`8`'9IUM6<-\0CH.JF,&U\AITH^!YZ4:;"U,]VV@[HG-%![7&LEM.NU=`#@*KW"S -MI39;LY6O@_,]M-S$#@&!L8@6E*%[F*NMU3F$W!+W5F%-^ZLGG48E[KF[5^Z> -M*0``)`0#['^4!R.O?;S9Q)_S[=USR=/L.9>K_&:;ESFRRFMO*0``'```0`0- -MT&T5T7SK^JIF>^S=!)A.RI((JP```!P``$`%Y)T_8>/D``'0!`0`, -M`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``!=&25@O]F#9GS=?TD`,J"VIDO9 -M7J=;5G#?'-I]%US<'!,(`UDM&O]CW>=EGD(Z#JIC!M?(:=*/@>>E&FPM3/=M -MH.Z)S10>UQK);3KM70`X"J]PLZ4V6[.5KX/S/;3YBKK=4Y -MA-P2]U9A3?NK)YU&)>ZYNU?NGBD``"0$`^Q_E`2=/V'G)_7+H*S`=J(>+C!3>%E;8A*W1FY^#`"8`0``F`$```(```!%``&4 -M6,L``$`1``#`J`$!P*@!`@'T`?0!@`=E:DZL=(&"8X,``````````"$@(@@` -M```````!>"(``'C\``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MZOK,]EYLGV93N?YY'H

[-^E=0$3&-K@[)7QKHGTVYO,@)F6"Z8Q6F4:8!C -M<_"P4`X\-=,#WLX7Q%4,O;/_Q$$T5>I5PU^LG%&FEE]!6LMG/;-6.'"';R92 -MF[[&UE@.JIJ$@@O:<5^CRIF_YO -MJ<+!M5P93UM=H82:-$$$`KP*>=(V,37%Q+I+1E@I```<``!`!.082$9[/MN] -M/U5N,,%\L)59````'```0`5F57S]P;,F@#I6JH>A*G#:]Q?**6,2MT8K -M:0``F`$``)@!```"````10`!E%C0``!`$0``P*@!`<"H`0(!]`'T`8`'96I. -MK'2!@F.#```````````A("((`````````7@B``!X_```=`$!``P#```,`0`` -M#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```" -M`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$ -M```"````"`0```XH``"(``(``.KZS/9>;)]F4[G^>1Z','NS?I74!$QC:X.R -M5\:Z)]-N;S("9E@NF,5IE&F`8W/PL%`./#73`][.%\15#+VS_\1!-%7J5<-? -MK)Q1II9?05K+9SVS5CAPAV\F4IN^QM98#JJ:A((+VG%?H\J9OW+>$TFS%-S[;O3]5;C#!?+"7`17E60```!P``$`%9E5\_<&S -M)H`Z5JJ'H2IPVO<7RBEC$K=&S:H&`)@!``"8`0```@```$4``918W```0!$` -M`,"H`0'`J`$"`?0!]`&`!V5J3JQT@8)C@P``````````(2`B"`````````%X -M(@``>/P``'0!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"``#J^LSV7FR? -M9E.Y_GD>AS![LWZ5U`1,8VN#LE?&NB?3;F\R`F98+IC%:91I@&-S\+!0#CPU -MTP/>SA?$50R]L__$0315ZE7#7ZR<4::67T%:RV<]LU8X<(=O)E*;OL;66`ZJ -MFH2""]IQ7Z/*F;]RWA-)LQ37,=\PX!OAL]D%SLKRRBD``"0][F^IPL&U7!E/ -M6UVAA)HT000"O`IYTC8Q-<7$NDM&6"D``!P``$`$Y!A(1GL^V[T_56XPP7RP -MEP$5Y5D````<``!`!695?/W!LR:`.E:JAZ$J<-KW%\HI9!*W1C&W!`"8`0`` -MF`$```(```!%``&46/8``$`1``#`J`$!P*@!`@'T`?0!@`=EXY/3M[_L`<$` -M`````````"$@(@@````````!>"(``'C]``!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``?\A:T^&%^5M(']R?*1S!KW48_.SG96]Q>7JS;P,F^&AG -MDF?_R'*.P^@--7?M0CX88`_74_8&#Y$8M"!PV+!2@Q&'+G_N!FA1FXBR\ONQ#\E9>4F2`)%:-@(3$E.LFG^ROKC!0N!8VU;J.B6!?:4?5HRE&GEV8*-ZM*&@S,'YI5GU)O%/$XTX4MN@\*WLI```< -M``!`!(:-7<>ZW;8L@W4+I?=*L`E&Z@?W````'```0`4V@H,-.HCUF02MT90XP<`F`$``)@!```"````10`!E%C[``!`$0``P*@!`<"H -M`0(!]`'T`8`'9>.3T[>_[`'!```````````A("((`````````7@B``!X_0`` -M=`$!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```( -M`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$# -M```(`P``!0,```@$```"````"`0```XH``"(``(``'_(6M/AA?E;2!__MJ;T3,<$I,=,*0``)%XKJWLI1IY=F"C>K2AH,S!^ -M:59]2;Q3Q.-.%+;H/"M[*0``'```0`2&C5W'NMVV+(-U"Z7W2K`)1NH']P`` -M`!P``$`%-H'(4ZC0_!USCS8:CO'J##3J(]9D$K=&M"0.`)@!``"8`0```@`` -M`$4``919!P``0!$``,"H`0'`J`$"`?0!]`&`!V7CD].WO^P!P0`````````` -M(2`B"`````````%X(@``>/T``'0!`0`,`P``#`$```R`#@"``P``#`$```R` -M#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(` -M``0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*``` -MB``"``!_R%K3X87Y6T@?W)\I',&O=1C\[.=E;W%Y>K-O`R;X:&>29__(*ZM[*4:>79@HWJTH:#,P?FE6?4F\4\3C3A2VZ#PK>RD``!P``$`$AHU= -MQ[K=MBR#=0NE]TJP"4;J!_<````<``!`!3:!R%.HT/P="(``'C^``!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``LEXO&OS)`X%\Z""_P_LWSE8-=/;LT#,D-E0LWN$0FVSEK?[981'OHE -M1/?*0L'B2GKJO3.^?PXJX]$I```DJ3TP-N0T#+X[Q2(=LLU-_S$GZ>E4N0?] -M1#K9\>\#@^@I```<``!`!`"7EYG]7#5)\#=SE5:6I]*-#!;Y````'```0`40 -M";SBI#*ICGG0X>L2C]WT44D[\F82MT;O&@``F`$``)@!```"````10`!E%D6 -M``!`$0``P*@!`<"H`0(!]`'T`8`'98>RQ/I*%1]Y```````````A("((```` -M`````7@B``!X_@``=`$!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```, -M`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@# -M```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``+)> -M+QK\R0.!?.@@O\/['(:-Q)!XZ_-`$/"5(0%N-X7M\Y6#73V[- -M`S)#94+-[A$)MLY:W^V6$1[Z)43WRD+!XDIZZKTSOG\.*N/1*0``)*D],#;D -M-`R^.\4B';+-3?\Q)^GI5+D'_40ZV?'O`X/H*0``'```0`0`EY>9_5PU2?`W -M0``````````(2`B"`````````%X(@``>/X``'0!`0`,`P``#`$```R` -M#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,` -M``@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!``` -M`@````@$```.*```B``"``"R7B\:_,D#@7SH(+_#^QR&C<20>.OS0!#PE2$! -M7)-H+TJ5NH;(S)UC!V.T,&X_O>]H54"L(!=<>UDDV(]$`<-F,[,3/SH`M:,M -M'*!"U^7THYWKC>%[?.5@UT]NS0,R0V5"S>X1";;.6M_MEA$>^B5$]\I"P>)* -M>NJ],[Y_#BKCT2D``"2I/3`VY#0,OCO%(AVRS4W_,2?IZ52Y!_U$.MGQ[P.# -MZ"D``!P``$`$`)>7F?U<-4GP-W.55I:GTHT,%OD````<``!`!1`)O.*D,JF. -M>=#AZQ*/W?1123OR9Q*W1M%I!`"8`0``F`$```(```!%``&46;<``$`1``#` -MJ`$!P*@!`@'T`?0!@`=EA<2J%"169+L``````````"$@(@@````````!>"(` -M`'C_``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``O;?7/_R?;YFH -M/N\D60\TE&SY9>@](8YZ"K-\C;3IC(1NXN13J[]I=:M54$";-I#W:WB!DNEU -M0$C))74D'T]KNI>>FEI>[FB])(C[FT^MA#+DK<@WA^5\<*E+8Q-73FEOJ!R- -MQ6!7XET=N[2Q+9P(4`>29WB.WMF8S-LC'LX&<2MT:)E0<`F`$``)@! -M```"````10`!E%F]``!`$0``P*@!`<"H`0(!]`'T`8`'987$JA0D5F2[```` -M```````A("((`````````7@B``!X_P``=`$!``P#```,`0``#(`.`(`#```, -M`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$# -M```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0` -M``XH``"(``(``+VWUS_\GV^9J#[O)%D/-)1L^67H/2&.>@JS?(VTZ8R$;N+D -M4ZN_:76K55!`FS:0]VMX@9+I=4!(R25U)!]/:[J7GII:7NYHO22(^YM/K80R -MY*W(-X?E?'"I2V,35TYI;Z@GP"`NY( -M!%]8*0``),L_^U_1Y\EF5D/>7$`8@/(6\1:F!;9JI$9EV9T"1VF.*0``'``` -M0`1!R_0V5?Z42P/`$X@6#J]O:.J\`````!P``$`%O'L2V<"%`'DF=XCM[9F, -MS;(Q[.!G$K=&GM8-`)@!``"8`0```@```$4``919RP``0!$``,"H`0'`J`$" -M`?0!]`&`!V6%Q*H4)%9DNP``````````(2`B"`````````%X(@``>/\``'0! -M`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$` -M``,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P`` -M"`,```4#```(!````@````@$```.*```B``"``"]M]<__)]OF:@^[R19#S24 -M;/EEZ#TACGH*LWR-M.F,A&[BY%.KOVEUJU500)LVD/=K>(&2Z75`2,DE=20? -M3VNZEYZ:6E[N:+TDB/N;3ZV$,N2MR#>'Y7QPJ4MC$U=.:6^H'(W%8%?B71V[ -MM)R:PJV/W6=M;K%I'WI\`@+N2`1?6"D``"3+/_M?T>?)9E9#WEQ`&(#R%O$6 -MI@6V:J1&9=F=`D=ICBD``!P``$`$0([>V9C,VR,>S@:!*W1N3C"P"8`0``F`$```(```!% -M``&46?```$`1``#`J`$!P*@!`@'T`?0!@`=E4),)Y]#YMV0``````````"$@ -M(@@````````!>"(``'@!``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``P,%-,ZRJ"5(<$U)\+G?,DOE3!SN?2QC&"B?(DG'XK6W7@%B1'V5?A^,=^>!+MWLPI```D -MW!1>=;N'XW.>LZK4UJJ)T/SK6)4R+C>%YK2;EEE$K;PI```<``!`!+@#9]GJ -MC#ZC?PX6MC/_"EG*\$\C````'```0`5_DSH$.]WW(E+PPU,KZCTR;,L7`F@2 -MMT8*#P\`F`$``)@!```"````10`!E%GW``!`$0``P*@!`<"H`0(!]`'T`8`' -M95"3">?0^;=D```````````A("((`````````7@B``!X`0``=`$!``P#```, -M`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@" -M```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,` -M``@$```"````"`0```XH``"(``(``,#!33.LJ@E2'!-2?"YWS)+W*$B^.^F/ -MOO.)L!64JMYR#BI];L^YX'X]:T -MFY991*V\*0``'```0`2X`V?9ZHP^HW\.%K8S_PI9RO!/(P```!P``$`%?Y,Z -M!#O=]R)2\,-3*^H],FS+%P)I$K=&8@X&`)@!``"8`0```@```$4``91:```` -M0!$``,"H`0'`J`$"`?0!]`&`!V50DPGGT/FW9```````````(2`B"``````` -M``%X(@``>`$``'0!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$` -M``R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P`` -M`@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``#`P4TS -MK*H)4AP34GPN=\R2]RA(OCOIC[[SB;`5E*K><@XJ?6[/N>!^/7.1/C8-3JKE!6)R*=#&F.L%^+V=]'R -M8X]Z5,'.Y]+&,8*)\B2`6)$?95^'XQWYX$NW>S"D``"3<%%YUNX?C -MJ,/J-_#A:V -M,_\*6"(``'@"``!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``?PSC'%7R3D#099@0#DG%B0U;:\XG2*17TG@4\5"_ -M4C48/[YS18UT"Q/4MP/S\,Z$NN#@H0`$Z`$U3GR>;$HR!T3>&ARG#WK4D:$T -M+AK!B-2)'B1&#`DD4T1A0NWR9G`%W1J]#!69)I>GG#FHQ;S`0T,NKP -M6H!^/@RP:S`I```D'RG`WA,KV(@0/KE^0;;'7&2M\[?@#K7,C&538EW?E_`I -M```<``!`!"X*>GA(9D+&N#%IF"WRE]96H2MT98*00`7````%P````"````10``6%H;``!`$0``P*@! -M`<"H`0(!]`'T`$0&*8@*M+`)K;MX```````````I("(@`````````#P````@ -M``!`!@````3KN^T\Q:SHS7Y_V0748*Q3[<"G/&H2MT;1.`0`N`$``+@!```" -M````10`!M%H<``!`$0``P*@!`<"H`0(!]`'T`:`'A8@*M+`)K;MX```````` -M```I("((`````````9@A```@``!`!@````3KN^T\Q:SHS7Y_V0748*Q3[<"G -M/"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``?PSC'%7R -M3D#099@0#DG%B0U;:\XG2*17TG@4\5"_4C48/[YS18UT"Q/4MP/S\,Z$NN#@ -MH0`$Z`$U3GR>;$HR!T3>&ARG#WK4D:$T+AK!B-2)'B1&#`DD4T1A0NWR9G`%W1J]#!69)I>GG#FHQ;S`0T,NKP6H!^/@RP:S`I```D'RG`WA,KV(@0 -M/KE^0;;'7&2M\[?@#K7,C&538EW?E_`I```<``!`!"X*>GA(9D+&N#%IF"WRE]96H2MT::7`0`4`$` -M`%`!```"````10`!3%H=``!`$0``P*@!`<"H`0(!]`'T`3@''8@*M+`)K;MX -ML$42Z410>("!L5`-*7POAV$`J$?R.V2##/2\S,^S@YH,:;Q^623%G26 -M6$FP/E>`[:>*4BHV5A1D9H!MU%`?I!>4:[Q%3HH+!%$NE'.*T2 -M+B`C"`````$```#L(P``T#"+[;RGF=LM7>B/07MQ8#N2NL<3T3I=[9SHR324 -MOT`/Q:,.OORRZ\;XJZ5[M(N303TI("YF0M<$F=$Y^7"]7DCXKF=K5$\;EO*^ -M(=3Z#F)T$_MM:*A9)O#3@26]>@[&ER@[1!:#KROV6(DN$\4/#6+NN.B8BS2% -M*SO*^1_*8Q^60BRQR^0NKB86=U0*UHXPD^"ON^J&3KZ?BFX8$M"!Q\5T1W-S -M`*)7#R!>LQDVX1")>Y(G!P/B@DLIN1K=4&Q)T93,Y:Z7Q1J9D@!$B< -MP)2?]I,=+N^B+!$'*V2DO4[_%]S('9MMCZGTJ52)N7=-&ZN)=N5S)N -MZ9S\:ORVO7Z#?6=XL=BK;IT6N3AD]8*ZWP4IFN"O1ZCK5QAJ;,6@N\CG^TOX -M(36/X^21E<5:&>Q?FS,B33R\"@#"C"@H8FOQ@M@SRLW0F'MO,(R8O"_D]=Y= -MK`ZZP6$/>(2P(X6!ZD6L@'JE>V*G[O4N-#F>^A3T`+5?=82.[CV'K)N3,J7T -M)@A",9EL0@QR&P!D#K.^]-YLTEFU1B(-]F$NHJU/6H\VNTE/]KO8^TEK+4(I -MX0I<*&H2MT;5S`0`_````/P````"````10``^%HA``!`$0``P*@!`<"H`0(! -M]`'T`.0&R8@*M+`)K;MXL$42Z4*E&XR$4)7W(D4VK;D\TNE3JA9H5<\X=OC5 -M1CP&V6+D4'&21R*5'A4A$/CAR-,3;>(O2?+O[C*,*@E3XWQJO&T1[?O?&_;3 -MFT9J$K=&D]<$`&P```!L`````@```$4``&A:(@``0!$``,"H`0'`J`$"`?0! -M]`!4!CF("K2P":V[>+!%$NE'.*T2+B`D(`````(```!,*0``,.7<'(*"E9LG -MQT8"5'Q=IU,3R0*_QTP/D42XAOZ`5X@F^=,[,UFT=U30YJOR:A*W1H_R!`!L -M````;`````(```!%``!H6B,``$`1``#`J`$!P*@!`@'T`?0`5`8YB`JTL`FM -MNWBP11+I1SBM$BX@)"`````#````3"D``#"4W9(6,5GZ2/<HV]'L[9BD9;024:P]_6H2MT;$#04`/`$``#P!```"```` -M10`!.%HD``!`$0``P*@!`<"H`0(!]`'T`20'"8@*M+`)K;MXL$42Z4.[W_F3RY3AM(AO)U)6Q*"E1UMTA,"JL -M;N4[05*8%#_L`[*[HIDOF/,M[X?:A3 -M6/*@&IRM"FB24]KMGL`4^:G/(1KE_H2W<=`*\NP!?,KJ(.A=-H4O`G8[,WON -M=>O$]P>2`-(QF)`=P_:&@%!>JRJKN84?2O>Y$D^0T-6Y%&F"K1C64("$:A*W -M1DL9!0`<`0``'`$```(```!%``$86B4``$`1``#`J`$!P*@!`@'T`?0!!`?I -MB`JTL`FMNWBP11+I1SBM$BX@)`@````%````_"$``.`U?+2=*XM8A^#O`K*Y -M7%+<&UOHF=D$(1&V>N0EQ$1\7^\`:MBI]/\HIY[`UR%V7V@=A^"10*YHF"K-VQ4YUR. -M2H8)5\0P-1`&-/1[.-_WV/YC'?*18M]Z\!_B:A*W1O`H!0#L````[`````(` -M``!%``#H6B8``$`1``#`J`$!P*@!`@'T`?0`U`:YB`JTL`FMNWBP11+I1SBM -M$BX@)"`````$````S"$``+!`8]7<4_?;G("#P]($*A^IU-(8V,7;WQ\`EW/J -M/6-;A2"S!B?O+0T5R(T-]I=^7HT@4^3:PXR7F%.EJ]J$K8UYWM&^FI)H#/<< -M+3U\+JA0:^Y%3685G;T`2?H6O0`JJESF6L@Z2?!6XA'5A?"PFXE^_'<5IOCA -MHXR9$N-^Q:A*W1I1+!0#L````[`````(```!%``#H6B@``$`1``#`J`$! -MP*@!`@'T`?0`U`:YB`JTL`FMNWBP11+I1SBM$BX@)"`````%````S"$``+`% -M0SH,?:'T+F+`S'$$891#!/<@FK\+[L[4=0`XIK15P7M(E5+#>7G]SRI1YSD* -MZZ`,\,(>&72BK5_Y0)P0';YAQJ[+3.^"\Y+^L9G%/;NUOP=$]EN1#253H"@E -M"45.^GT-U7R94[**%X=B0"AUVH.M1JM9BSDD_+#"T7C8E9>R8TEVA,?Z^>G] -M>==93!#8OXL@4;I.KI$J'I:ZZ(;45VY!'(4X6WL^K -M\\>."V4W/">G2OU+733S`^%0QW",MZ\9]^4$NQ]!TDZB+8CX]W@^H`.#-_XK -M,L'1C_6M?CP6EXJYDD7>X0Q)2[MFSM('YR!PV$ -M5@WW<:OJD'H3VBK4-HC*')Y>J-23LGL<,.!0,P[XD=PRK%F89);'9F">SK.:="HE,[$ZRI?KL15M(MKVT/\$_&: -MUL>X(C86F6;"OML:G"R,[]E(KDJ*X7+.U[I._,;9ZI8H3(LH/B-_ND/?79(Y -MYUBVG-L$=/AJ$K=&EG,%`!P!```<`0```@```$4``1A:*@``0!$``,"H`0'` -MJ`$"`?0!]`$$!^F("K2P":V[>+!%$NE'.*T2+B`D"`````<```#\(0``X-[5 -MG(,T<=@*7>'#589U;Y/VWQP1MLH+AYR00,1B=S-4IMH4@$1&.%ZMI^)GL^.[ -M_@`J3"^;QA*[OR2DZ.&U>H24X`:CO)XG4*$)J$K=&Q8(% -M`.P```#L`````@```$4``.A:*P``0!$``,"H`0'`J`$"`?0!]`#4!KF("K2P -M":V[>+!%$NE'.*T2+B`D(`````8```#,(0``L+85<@2Q]?SR@@!$+IMP7K0M -M8L(!S1TV9\@^((L10+!Y^"QS0ZNS[=;.GB[W8Q<1X4[C_N>ZA79V4+:.(V?< -MP*-PJDE^5CY)Z??%`TO_+:]+/OP?],KRM+44%[323__TRB"@ -M'@\/UJ$K=&$J4%`.P```#L`````@```$4``.A: -M+```0!$``,"H`0'`J`$"`?0!]`#4!KF("K2P":V[>+!%$NE'.*T2+B`D(``` -M``<```#,(0``L*T%`Z5(7)N$*VU*E;7O&8W!"/$0$)%!XXA9IWZDZ*(L`K>C$[FU%AM^HSRT7^@5M3 -M*A\[VX2308V)@%U@*X<$0\W3H-IS:MY(LO]Q-`IM1LHE'"S -M';"(41K,X^LF$P>>HKWL5[$!Y*2J2)H(4,#Q/G^##DX"WH)U1RU\KSV8)TSE -M(RAJ$K=&8\L%`(P!``",`0```@```$4``8A:+0``0!$``,"H`0'`J`$"`?0! -M]`%T!UF("K2P":V[>+!%$NE'.*T2+B`D"`````@```%L(0`!4"M8JV0GH2,* -M-7O:<0*QI+,,DAV9%Q>DY[>'\OECJ#26;I,QM0JYE]%"YX*UG@8_41KXKT0. -MY_=MRP67,K-SK9"E"V@JIN[GNH(T/))HO@P@]$6'=U$FJL3MDAN[X3M272FDZWQ_<8S@ -M3FRL.4FRYHUR$U'8=^+PJY`JSTH:>IPSL3Z4ULU"A%X8$`3;/J3BGVR4!4J] -M+;59#D8:&9?';J_)5)A^"0";MHLE@CL`.JD&`,5*,D5WRJ-Y(9Z$=P?^1;/M -M6M+U6*0"MHZ"AD/19'X&(&`-3Z[>F+MM:09&5((`:)C3:O;6^GHH'VLXS*U> -M]?F#S!:=)Y.+:A*W1O__!0!<`0``7`$```(```!%``%86BX``$`1``#`J`$! -MP*@!`@'T`?0!1`+:])8Q_ -MO\&>,0T_L.T1&!<]27J90,>5R0]7U)!;&-M! -MA\D>9=^-I/@THVS6+)ZO\!O?W;CMK(.!#K3][0DD+6,+Y0US-X#L&H.+=T@YZ$`GGGWY_!&WT6Q -MR`P%ZP!VONPUGV9B%#G5>O&`B#,[!$%HO``!`$0`` -MP*@!`<"H`0(!]`'T`&0&25\WSRZW"&8K5O`+VI`QSA']XP1?='B6E0?*.:Q&WS>SN?S_7+*6?(N< -M0'NJ@6>A!;!4:ER>S)Z'4VP`:A*W1JLY!@!L````;`````(```!%``!H6C`` -M`$`1``#`J`$!P*@!`@'T`?0`5`8Y7S?/+K<(9BM6\`O:D#'.%RX@)2`````` -M````3````#"NN*9[MX3//SC$J%$>-%-"4#Z.G:3/ES:2Y;3A_=^^ACFFYZ;[ -MC.HV1`?8@6H2MT8(2`8`;````&P````"````10``:%HQ``!`$0``P*@!`<"H -M`0(!]`'T`%0&.5\WSRZW"&8K5O`+VI`QSA)XW[Y*:!CHGNJF^W2R'X6/6=^[EMJ$K=& -MD54&`&P```!L`````@```$4``&A:,@``0!$``,"H`0'`J`$"`?0!]`!4!CE? -M-\\NMPAF*U;P"]J0,&+>P'#VDGUEDD#.\>Y]I?]E@PX(`L!JKU4BQ2_<:A*W1JI0!P"8`0``F`$` -M``(```!%``&46C,``$`1``#`J`$!P*@!`@'T`?0!@`=E;^^I=3";/9P````` -M`````"$@(@@````````!>"(``'@#``!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``Y?AW^%B65_JG66HXCS)]G&Y7[*7OI-UPOJ@.K9*15N#BCB0] -MQ0+L>K)84Z!V)H27N''JO2,]-)XLK3DURQZZ!)YU=9J':)Q1BG1<( -M7X^4&@'57ZM'6BQ!K3)A""$K\(>NP!XI1XLB&M0:'AE00KW"1:1J%H^8QSR% -MQ8PH`F`$``)@!```"````10`!E%HT``!`$0``P*@!`<"H`0(! -M]`'T`8`'96_OJ74PFSV<```````````A("((`````````7@B``!X`P``=`$! -M``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0`` -M`P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```( -M`P``!0,```@$```"````"`0```XH``"(``(``.7X=_A8EE?ZIUEJ.(\R?9QN -M5^RE[Z3=<+ZH#JV2D5;@XHXD/<4"['JR6%.@=B:$EW-"BZP7KAQZKTC/32>+ -M*TY-N@2>=76:AVB<48IT7"%^/E!H!U5^K1UHL0:TR80@A*_"'KL`>*4>+ -M(AK4&AX94$*]PD6D:A:/F,<\A<6'*0``)&2&^5*\='\I)D?^`L#>407XK8SP -M"CSX>EDY`"^B?Q?**0``'```0`0$P,RCA!)>RRH4SLTX1D!,RA!76@```!P` -M`$`%;UJT]QC,!+[J@A#[JQ==3$0/VXUK$K=&A'H!`)@!``"8`0```@```$4` -M`91:-0``0!$``,"H`0'`J`$"`?0!]`&`!V5O[ZEU,)L]G```````````(2`B -M"`````````%X(@``>`,``'0!`0`,`P``#`$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M``#E^'?X6)97^J=9:CB/,GV<;E?LI>^DW7"^J`ZMDI%6X.*.)#W%`NQZLEA3 -MH'8FA)=S0HNL%ZX<>J](STTGBRM.37+'KH$GG5UFH=HG%&*=%PA?CY0:`=5? -MJT=:+$&M,F$((2OPAZ[`'BE'BR(:U!H>&5!"O<)%I&H6CYC'/(7%ARD``"1D -MAOE2O'1_*29'_@+`WE$%^*V,\`H\^'I9.0`OHG\7RBD``!P``$`$!,#,HX02 -M7LLJ%,[-.$9`3,H05UH````<``!`!6]:M/<8S`2^ZH(0^ZL774Q$#]N-:Q*W -M1MK-#@"8`0``F`$```(```!%``&46D@``$`1``#`J`$!P*@!`@'T`?0!@`=E -M\\,H(+K\:X(``````````"$@(@@````````!>"(``'@$``!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``=Z!MC6D$.*;]]\\.30B%\M;%3UKE][HYF'7BF*ZKP!PD*Y259#\,7I3QPT^&7W-Y$ -M_?@>U#X2H,[(Y<%K\Q(I```D$=2F&=SG1BDOOG0*>LFXM:*@172,F4$@;8UI -M!#BFW,L=W?R[)E/<_/MBV!=',TZ)L`G!2C"VR\`/G_PJQ\<6>%L#47):C*8> -MRC7YV:Y):AR'"^(I\-RV3'4'(+4#Z.9AUXIBNJ -M\`<)"N4E60_#%Z4\<-/AE]S>1/WX'M0^$J#.R.7!:_,2*0``)!'4IAG^5P??I353,2#<0* -M(BL3:>`)$0```!P``$`%J`V-D5\PY5(,Q`0``'0!`0`,`P``#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"``!WH&V-:00XIMS+'=W\NR93W/S[8M@71S-.B;`)P4HP -MMLO`#Y_\*L?'%GA;`U%R6HRF'LHU^=FN26H*8KJO`'"0KE)5D/PQ>E/'#3X9?"(``'@' -M``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``L^YY(ZAS-B]%L(`Z -MWEX;=!:]&TNS9=VQ)K*7B.A#%]Y9T`5YUR^=EE_AA7Z5R5>04G@"V=R>C/(G -MB0"HF/P'0A[QN&,1(S?:W(X37M]"&CCPO1*G$[B#%AWY0#+UT#X#L1H7'T1\ -M">G8J!ON98@@G\ZO(7_*^X1ZD780&*AU%K35%4H"&@\@I```<``!`!&I&V,6GLHG%9XA66L<%L%,H*)1" -M````'```0`6G#'UG6I+56=5_B;2$E?6/X6$```````` -M```A("((`````````7@B``!X!P``=`$!``P#```,`0``#(`.`(`#```,`0`` -M#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```( -M`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH -M``"(``(``+/N>2.H&W06O1M+LV7=L2:REXCH0Q?>6=`%>=\;AC$2,WVMR.$U[?0AHX\+T2 -MIQ.X@Q8=^4`R]=`^`[$:%Q]$?`GIV*@;[F6(()_.KR%_RON$>G+S$PB%@F@A -M*0``)#&>WP>F2^\Z?&.FB/04'I%V$!BH=1:TU15*`AH/(*0``'```0`1J -M1MC%I[*)Q6>(5EK'!;!3*"B40@```!P``$`%IPQ]9UJ2U5G5?XFTA)7UG(8, -MO)MN$K=&>2P!`)@!``"8`0```@```$4``91:@0``0!$``,"H`0'`J`$"`?0! -M]`&`!V6O(&()'C^%A```````````(2`B"`````````%X(@``>`<``'0!`0`, -M`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``"S[GDCJ',V+T6P@#K>7AMT%KT; -M2[-EW;$FLI>(Z$,7WEG0!7G7+YV67^&%?I7)5Y!2>`+9W)Z,\B>)`*B8_`=" -M'O&X8Q$C-]KWT(:./"]$J<3N(,6'?E`,O70/@.Q&ARB<5GB%9:QP6P4R@HE$(````<``!` -M!:<,?6=:DM59U7^)M(25]9R&#+R;;A*W1HM]#@"8`0``F`$```(```!%``&4 -M6ID``$`1``#`J`$!P*@!`@'T`?0!@`=E0QJ#-MEAF*,``````````"$@(@@` -M```````!>"(``'@(``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M(0TO=%L(']HZ-&SXM!U>HI```<``!`!$LI^R9^>.S* -M!CM:A>#W_:O$M-Q@````'```0`5T00T>'E#NM?N%X^>C):C`X(Z)Y&\2MT:8 -M9`(`F`$``)@!```"````10`!E%J=``!`$0``P*@!`<"H`0(!]`'T`8`'94,: -M@S;989BC```````````A("((`````````7@B``!X"```=`$!``P#```,`0`` -M#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```" -M`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$ -M```"````"`0```XH``"(``(``"$-+W1;"!_:.C1L^+7(D%\J`(-9$K9F=I>M -M#ZHD<+16W>AK+?SS0TTVW[9B<)3ZN=R`J<:>`+,/S?&6 -MB<8>A@*6"6)]HC1\*0``))I]XR05+0<$O!M-!M4[%@\3K`/GHR6HP.".B>1O$K=&+Z8(`)@!``"8`0```@```$4``91:JP``0!$` -M`,"H`0'`J`$"`?0!]`&`!V5#&H,VV6&8HP``````````(2`B"`````````%X -M(@``>`@``'0!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"```A#2]T6P@? -MVCHT;/BUR)!?*@"#61*V9G:7K0^J)'"T5MWH:RW\\T---M^V7.`5`5=>FT;E -M"VNKX/>S;TB8?K;@U..>0,L''9`GP-NEP/E*3!/YSX(XM*1NJG-D6]A_A(66 -MHU=7HG"4^KG<@*G&G@"S#\WQEHG&'H8"E@EB?:(T?"D``"2:?>,D%2T'!+P; -M30;5.Q8/$ZP'-;W#$&ML=W[BUX'5ZBD``!P``$`$2RG[)GYX[,H&.UJ%X/?] -MJ\2TW&`````<``!`!71!#1X>4.ZU^X7CYZ,EJ,#@CHGD"(``'@)``!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``6L,:&K5$UY?W4@#(G'5(VSX3!V$^<96*=BG+8-G;0.4( -M60?W*3SXB[<5'AS`N/J4%U="Y$("9CQP,#W@O#ZA#S9U=LYV:4_K&GMM$9&^ -M9.QEH,UR<:_KP!__%O%E)%_D`N!R`+````'```0`7)XP+DOOJ,@)&"P#B\ -M0U;O?G+ZHG`2MT;+W@D`F`$``)@!```"````10`!E%K+``!`$0``P*@!`<"H -M`0(!]`'T`8`'93G*=QX622_=```````````A("((`````````7@B``!X"0`` -M=`$!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```( -M`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$# -M```(`P``!0,```@$```"````"`0```XH``"(``(``%K#&AJU1->7]U(`R)QU -M2-L^$P=A/G&5BG8IRV#9VT#E"%D']RD\^(NW%1X$&!(5K#Z6ZW2-DA52I -MH%.(#!68UG9$1N[\)5QR*0``'```0`30WU*DT,"_Y'OQ;Q921?Y`+@<@"P`` -M`!P``$`%R>,"Y+[ZC("1@L`XO$-6[WYR^J)Q$K=&[=T``)@!``"8`0```@`` -M`$4``91:U@``0!$``,"H`0'`J`$"`?0!]`&`!V4YRG<>%DDOW0`````````` -M(2`B"`````````%X(@``>`D``'0!`0`,`P``#`$```R`#@"``P``#`$```R` -M#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(` -M``0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*``` -MB``"``!:PQH:M437E_=2`,B<=4C;/A,'83YQE8IV*',"X^I075T+D0@)F/'`P/>"\/J$/-G5VSG9I3^L:>VT1D;YD[&6@S7)Q -MK^O`']SD"[*K"0JNH0W%'.$@UW=49$3,&<+LX@YN[\:!N1#M`,C%.T9U+2D` -M`"3@Z`WA!@2%:P^ENMTC9(54J:!3B`P5F-9V1$;N_"5<"(``'C_``!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``C^>")B8O,RM>FUM@M`0BWA*I,?VM -MVNW;EN[OQ_3W*Q\E6#<%733M'3DRGU>WC#((K0T:KG'0MB>WE>&@`"/VI'NT@OR-H8````'```0`5C -M.-J#V+C5<_EE$ZI8ZW?U=F&(Q'(2MT9K%@(`F`$``)@!```"````10`!E%N1 -M``!`$0``P*@!`<"H`0(!]`'T`8`'9>Q),LHA%_^!```````````A("((```` -M`````7@B``!X_P``=`$!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```, -M`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@# -M```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``(_G -M@B8F+S,K7IM;8+0$(MX2J3']K=KMVY;N[\?T]RL?)5@W!5TT[1TY,I]7MXPR -M"*T-&JYQW`>I3^@FCD=_D&]YRI6RS2!9#MYYMTHZV[$0+R(ZT%CL?.?*BTXI -M6>'3VQ'D+8G(G51/G&`DUOMI>)R#FY7XHG6;I-<:N$0!`,*]*0``)*]:,(N_ -MQ/AYLZM\)E&Y).-K@Y)_0",B%`@`%W.`;>W**0``'```0`1/.O22WGMY7AH` -M`C]J1[M(+\C:&````!P``$`%8SC:@]BXU7/Y91.J6.MW]79AB,1R$K=&-%@( -M`)@!``"8`0```@```$4``91;NP``0!$``,"H`0'`J`$"`?0!]`&`!V7L23+* -M(1?_@0``````````(2`B"`````````%X(@``>/\``'0!`0`,`P``#`$```R` -M#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,` -M``@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!``` -M`@````@$```.*```B``"``"/YX(F)B\S*UZ;6V"T!"+>$JDQ_:W:[=N6[N_' -M]/,,@BM#1JN<=P'J4_H)HY'?Y!O> -M>;=*.MNQ$"\B.M!8['SGRHM.*5GAT]L1Y"V)R)U43YQ@)-;[:7B<@YN5^*)U -MFZ37&KA$`0#"O2D``"2O6C"+O\3X>;.K?"91N23C:X.2?T`C(A0(`!=S@&WM -MRBD``!P``$`$3SKTDMY[>5X:``(_:D>[2"_(VA@````<``!`!6,XVH/8N-5S -M^643JECK=_5V88C$"(` -M`'B```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``[LRVD@WN79F! -MC]QDM^&,PC2%-^OAX-4G[-D,*#'E!*Y]]"YZ50;R8MDKC7*=?$=ICXZOP)A6 -MV5JAM.W=X"S\1PA2I:5JD@U[BI$A$=$R:;-/U4*3"+.BD5LV.<8BCK1O:%O8 -MR:LO+]FP/\DG.ZQPD+*)]%AEWR8'>.?W,2MT:8D`D`F`$``)@! -M```"````10`!E%O<``!`$0``P*@!`<"H`0(!]`'T`8`'93(;!H973EX=```` -M```````A("((`````````7@B``!X@```=`$!``P#```,`0``#(`.`(`#```, -M`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$# -M```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0` -M``XH``"(``(``.[,MI(-[EV9@8_<9+?AC,(TA3?KX>#5)^S9#"@QY02N??0N -M>E4&\F+9*XURG7Q':8^.K\"85ME:H;3MW>`L_$<(4J6E:I(->XJ1(1'1,FFS -M3]5"DPBSHI%;-CG&(HZT;VA;V,FK+R_9L#_))SNL<)"RB?17+TJLWQ-)C2Z< -MG282*0``)'5\Z[#)AU?A)K$HP#\MLYSY7"+8T@@N54/0Y0O:[L'!*0``'``` -M0`1DX/$U!5'0``````````(2`B"`````````%X(@``>(```'0! -M`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$` -M``,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P`` -M"`,```4#```(!````@````@$```.*```B``"``#NS+:2#>Y=F8&/W&2WX8S" -M-(4WZ^'@U2?LV0PH,>4$KGWT+GI5!O)BV2N-'-=%Q1$@O0_8WT````< -M``!`!::P"(5:CBZUW\ZL1!Z&7?)@=XY_=!*W1E3?#0"8`0``F`$```(```!% -M``&46_,``$`1``#`J`$!P*@!`@'T`?0!@`=E.?O="O^XAI$``````````"$@ -M(@@````````!>"(``'@``0!T`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``9UN@C2Q'%]FZ)MV=8(!%V42FS._`JS@UU0&X6:+BB-T6C;:)FXH?M)/O8U`SZ5X#( -MO=-7^HI$-WR'LL>*M44<>$63WF#"]051IMAHEQ'LI>=SVU,BB^B1$^`I```D -M5J@C$%V7DHB;:(N&#Q)]:#.G0:;TB!YX`G1AHNZQCQHI```<``!`!-L:>A51 -MR>\U6\2,4G$%JUHLX@=C````'```0`4FM"OP[[,U+Q"QH(&[+D#Z-;EO/'02 -MMT9<[@T`7````%P````"````10``6%OT``!`$0``P*@!`<"H`0(!]`'T`$0& -M*3G[W0K_N(:1```````````I("(@`````````#P````@``!`!@````;;H!"2 -M9;?<$.#HUVU)[$!K[/#YX'02MT:P_0T`N`$``+@!```"````10`!M%OU``!` -M$0``P*@!`<"H`0(!]`'T`:`'A3G[W0K_N(:1```````````I("((```````` -M`9@A```@``!`!@````;;H!"29;?<$.#HUVU)[$!K[/#YX"(``'@```!T`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``9UN@C2Q'%]FZ)MV=8(!%V42F -MS._`JS@UU0&X6:+BB-T6C;:)FXH?M)/O8U`SZ5X#(O=-7^HI$-WR'LL>*M44<>$63WF#" -M]051IMAHEQ'LI>=SVU,BB^B1$^`I```D5J@C$%V7DHB;:(N&#Q)]:#.G0:;T -MB!YX`G1AHNZQCQHI```<``!`!-L:>A51R>\U6\2,4G$%JUHLX@=C````'``` -M0`4FM"OP[[,U+Q"QH(&[+D#Z-;EO/'02MT:\(0X`4`$``%`!```"````10`! -M3%OV``!`$0``P*@!`<"H`0(!]`'T`3@''3G[W0K_N(:1M03>L5SM#>DA("(@ -M`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@# -M```"````"`0```(H``"(``(``-(-%+X$:,?2E9.^R%J58'0.*?%.P?R*"MQ2 -MBFW*@&L.R\.T$(!X\3;8;F*N75V(7X;:.*YKM%%VT?H3XP-K`-\^?!ZPU>%1 -MA=P#(?^%^8/KB64(5U,F0,^Z6H5$2,?*U&^P\````!P``$`%2EQ:0^H` -ME@`,*9*!/%F>?M.X5D)T$K=&]TX.``P!```,`0```@```$4``0A;]P``0!$` -M`,"H`0'`J`$"`?0!]`#T!]DY^]T*_[B&D;4$WK%<[0WI+B`C"`````$```#L -M(P``T)G)]TVND)AT^RG;N7JZQ!R7!H1^J8/BF) -M:^M&*TV6MOMR5BCG)I&S]./TP#WFYF#%E"IV]:2(SKJ_R>'C'KL[)J+B#[6> -M##U`EY#S?L5SM -M#>DN(",@`````0```)PD``"`R/).+3>;O(M,@QDV&0N80!O8[#MI@K?%0/`+ -MI8_W6=?":_*MMG>_33BD!$NX^V(:1J;(V$PF.&PC<_,A5+"1R?%2Y.(^;FX/ -MM%Q?MO^!VLH\:&B('&1R9FS86^4,[\G02MT8XA@X`'`$``!P!```"````10`!&%OY``!`$0``P*@!`<"H -M`0(!]`'T`00'Z3G[W0K_N(:1M03>L5SM#>DN("0(`````@```/PA``#@R3P, -M=R)[M$C6K\7V+^R:KWD-'`UD^+3L(U6C(2R[)+93#_WP.`P1@6Y_GP-VK+`R -MCQ+WAS(LPC!DQ"$)@PL*%;Q2^;3Z^@F"8>&&&J"H%,X#12BH`6+\[O;ZA;#> -M>1_.^VF-"B:+/3Z&S0@`;TQE70`6Q@9"6;7V0+25;$7$ZPUJ%,W["\YJCJ'/ -M.PSR^I5+=W<^-!6]Q^YJJYQ;0K9$C9PUT_NTBH'X)]>\Q5\.,LCD(DK>%9\? -M0JHLI1^2%&Z(P8EUX;V_SKG%/$R`N.>DV+,OGGJU](6I!V>+!702MT:.D0X` -M_````/P````"````10``^%OZ``!`$0``P*@!`<"H`0(!]`'T`.0&R3G[W0K_ -MN(:1M03>L5SM#>DN("0(`````P```-PA``#`;?0HD,/H[+D_"OH3N=$TN#&: -M"\A.&[>;4&5_V1#W-<.+HT*U)PGU,@(:65B;.9#Z8&^:74;GON8&6(SPV1*K -M-2)/C/NF4A#BLL\;#I)`[@"#::F.L8"/%GK]/M*`T$[86<8#0D>F5O(_"0?5 -MF4CDHB_54YGB(%;%G3_&@,2F:.)S509S]SX$\%;%2/#&=%#'J@`H@,WW(I1+ -M-X=\(#J?=.^@$EC`RGBQS'J(HQ.^>P_&_CK$@MT$K=&])P.`&P` -M``!L`````@```$4``&A;^P``0!$``,"H`0'`J`$"`?0!]`!4!CDY^]T*_[B& -MD;4$WK%<[0WI+B`D(`````(```!,*0``,`32OW=M&.)[S&SDJZS4T<7ZX6@> -M?0W9>BX2\_D5);Q/6#G7M0KYO<"3&31\=!*W1C^X#@!L````;`````(```!% -M``!H6_P``$`1``#`J`$!P*@!`@'T`?0`5`8Y.?O="O^XAI&U!-ZQ7.T-Z2X@ -M)"`````#````3"D``#"LT&PW0+(@A@^I<,@3$Q)TI91\V;WA?LA:DCN,]05W -M5?<27.,MJLIYBJTNE702MT:,T@X`/`$``#P!```"````10`!.%O]``!`$0`` -MP*@!`<"H`0(!]`'T`20'"3G[W0K_N(:1M03>L5SM#>DN("0(````!````1PA -M``$`E:99YWUA:SVW.P_D.B/F$SFAK#G%R0DS4QGR]D?*K?#FGY!2IR051"O< -ME=UT(Y-H7M](TG&ZF7HX8V=)HA^()RX<`BOSM6=TN[':XSQIX.W+`R_K`J`8 -M;RR/2N?Y,2OW*POKW56B=FO0Z+82>$<'`OX1*IVC(Y!_4E4399/U'=\;E>NX -MA:#WTMR7D,)D21^=JXRJ\WOUC>\>TL_I9B4;(&(_::J["##_)N-==#"C<;`= -ME8M5[:?FW]FYOS) -M&_,NA*G(,4>,LFFXYR[6+O&!.N5;W'\&A+]!0I:H&HGK`K;M'#S*H1J-67G; -MI5@NOF0&92XUP3_N$PXHI?$+6;3++NM)`]\'_&%EXN*B(F_MUF!D1$-(>8NI -M_2E96J,5[*GN6D=F'ZTJZ5((-4N9KJGS@^@LSSEL*\6X];<9'/MRC-!"CR;] -M;:L\%^`'&5BWZW%<";N:R89=$LEM:5.):$N&?_CP=X@NP^^>@PL^RWB,7*?Q -M^G3[Q6)S=ZX"3)@OV%#I=!*W1OWN#@#L````[`````(```!%``#H6_\``$`1 -M``#`J`$!P*@!`@'T`?0`U`:Y.?O="O^XAI&U!-ZQ7.T-Z2X@)"`````$```` -MS"$``+`+"C?X"#0,6&%H-CK&JON^:GW06.SU_J80\@'LR??S!-S$2T@(GZ-F -M5XN$N4C^Q]A?BU(<%A:9)O3,N:X6 -MN=VGJU%OS"U!9O6P$!GSU/6?YZ,9,!U6XJY<(\!`-F+]=W\/`1+;.U$>9X7Y]U=!*W -M1E$1#P#L````[`````(```!%``#H7````$`1``#`J`$!P*@!`@'T`?0`U`:Y -M.?O="O^XAI&U!-ZQ7.T-Z2X@)"`````%````S"$``+#TN0YS,926)REHKJB8 -M1=.?3S3+[U^FMZZTXD,-LRK9M,!&5WS%Z&1>56!EVT%8EAD>77&`AZ0;\I`F-<;>U/^VL:AVQ3WPZ -M8OX<]T&$W'Q1C!1`P0$>[\6>EBO543X*`:J*%X`)MQ(I+0R?YT)O&GJ2@TM] -M-@]HB*>4Q4SIB>AVYW9\U!C(LQNA5`Z39$$#J^ZHK1AQM8^06GPAB@)Y=3=O -M?/Y1L7)_ -MNB,ZP4$HX?DET@]NOK]8C)H_MIP:LE[KEC<9M&":RQCZ<3E-`=AS+8LOEULKL\`L*EL4S.W?NB\TA6NW.CJ -M9"F&+M"U7F(Y1TP/@IDK?*!LWQ[\;^MZ[D#G2DL]_#E9OJH]K>+S$L'>[AC* -M+/9$\5R2ONA6RWWG%UBK2!:(>1!EO%:H`;<9YW;[+3:7%ZH10MI%9[5K9#C?JJQ8PESY\R; -M5_G\:F6[4A+R5,8FKE777F]"AV,JI-@HF7]U$K=&:@<``.P```#L`````@`` -M`$4``.A<`P``0!$``,"H`0'`J`$"`?0!]`#4!KDY^]T*_[B&D;4$WK%<[0WI -M+B`D(`````8```#,(0``L)T)[$4NJ_E4>YT_0Z&L/S:[V46O>MYRQ>31X'?_ -MF_Z3E#$1,3_7$'?3BJ/@;\GO'APA8(BE)2&7`)F"S*4,>-WI%=F-SVI"FVQE -M`*JX%0)D/Y*,SH+E*5G=XL-MQ0WO.MBM!'U]>LNLR'B^,N>=1X2!@))SC2$4N*-3PT>ZE -MB.4#0)(W`N9:0`&"1UFC@7\!,$[_PRV4\@:3N2N$^19\^\L%8CPZZUFE0W11 -M=HYN_.WL;Z)F=?Y>BT2:"MCK/$X)OO1TBQ\<',79BP6Y*E8W+:6W3<$"ZDCW:_>4?5%EB.*,TU)D[WX98#P$UU$K=&[T\``(P! -M``",`0```@```$4``8AEC;TU5Q#"KGG]]!9B&1 -MH2P?P]E:K5Y`1]75](]K'MXV:PK_%XQ+X^&SC3L3_7W;ELZTX9EYYXZ*7M*H -M;%>_.70Q2:]A"8PAE4-@X/%GRJB%P15PVSLITQOZD,:A[>6\8$#D:#9O*)NTC5B:PPW65'UD0Y(E+9ER"+P\6A?_;6&6\0+):VHFVC07ET;D=L=<']VJRX# -MV#.GX%,=8#`GQC0%YN]'*[MFD3Z9AF5[/,GYP_![[2;[A./6HG0Z#,#%ZJAX -M[IFBW]CX:LS1G?V`'OU1V,G2?PA@#:VVA7!(',Z"(:P%*A^Q[G,?NY_].[OI -M)742MT9)JP``?````'P````"````10``>%P'``!`$0``P*@!`<"H`0(!]`'T -M`&0&275O]QB#F/053.$%I7!STF4N("4(`````````%PJ``!`0V:-WD!%;-@\ -M.,/_MQN8A<;/$!(/_8P*((SV;U-%*K_+'75#R4=2G?5@+'AF(NDYLA:B?WY] -MOT;&F=/4=1*W1MNV``!L````;`````(```!%``!H7`@``$`1``#`J`$!P*@! -M`@'T`?0`5`8Y=6_W&(.8]!5,X06E<'/292X@)2``````````3````#!=)FM5 -M'@$3T9M,-$1I)/HXX07B0<2T>8)2D*RWTBB`8S67U5"(``'@``0!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``K;KV -MN.75LI%Z@_O7BGP@#G?XA<%&)2[AK=:$MQ67WCO2WY:)V!4,1Y5U.)D7I1`^ -MB1!]EVSRZPNMKY!&989U+C0[13KGT;HIA8!"RI'7UVD&]B16;?8<>S;[&,]1 -M7+/%R604U1OVZ1>T_EI&@#16D@U*.*;AO8B9=S+?YGX@:8?&"I=Q.C$I```<``!`!(S6JI7O1Y;7^_J; -M?0Y')^,_ -MN\0W```````````I("(@`````````#P````@``!`!@````9RN=UJLOECS"`^ -M=%`L(:%#W@_N\0W```````````I("((`````````9@A```@ -M``!`!@````9RN=UJLOECS"`^=%`L(:%#W@S;[&,]17+/%R604U1OVZ1>T_EI&@#16D@U* -M.*;AO8B9=S+?YGX@:8?& -M"I=Q.C$I```<``!`!(S6JI7O1Y;7^_J;?0Y')^,_N\0W77(1RHORL"HA("(@```````` -M`3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"```` -M"`0```(H``"(``(``$#;(])3TGD%K5IJO9>1CU850QS5BL\ -M;-9\-#"^GN%#!(\P4XW\^IP3G])O>5>_.\.B:X'!%>M*,/2A\WJ -M66KC+]M,?=P"()FT.TWRE:%Z[WAHCW42MT9*60(`O````+P````"````10`` -MN%P0``!`$0``P*@!`<"H`0(!]`'T`*0&B3SJ[]>_N\0W77(1RHORL"HN(",@ -M`````0```)PD``"`G"H]>P)Q-K`9/07FUW@:8N[&[X26R9_N\0W77(1RHORL"HN("0(`````@```/PA``#@K[5.#)R_\:TS -M]<^CQ,7U%UN4C8^`ME.8AR2\0JWJJP`9I2$LH<#0N4FB]5J(E5#FTBTH_[+I -M\,F:O>(.O(N?L,:+TL:@F?"A`4\<_R_D_)(0_Q4[,3Z(R%,,6SGJ8.X -M?+JOK8=;185AFRG:><0-0(A:,AK7)LLV;'&-PR8SA\82HOX!<6FYOT@32%N= -MQ4=V^7\"(14H;IO9N@GB)*>M9/AUQ0VXG(U_N\0W77(1 -MRHORL"HN("0(`````P```-PA``#`SR<#Q63XT(16(N&Q8OI;(VJ+K9>2OSA< -M[NL?9]HY:.-@1*1+N3L-I$;(B?0-(15)^>&Q_#=!*0@GPC'/;R,W,8BN$_.A7C0)]#B&)F( -M$>NV6QK]/W42MT98Q0(`/`$``#P!```"````10`!.%P5``!`$0``P*@!`<"H -M`0(!]`'T`20'"3SJ[]>_N\0W77(1RHORL"HN("0(````!````1PA``$`ZGV] -M(CH[L)UNV175GG'9[!&1??%H)X,Q+I$HO2#HJ=*$>^-1#7+`4;[]#!N;BNK? -MK;)F+_NIZR6U+5BU57E$F^FK3B4R$GG5Z[X"AT(KSC2)YF3+L^.-15!1M\1+ -MPA6#J9";C#]@7$PTI:>^U=(\@H^!2*/N(8`\N=Y-G*9S/+@1KA'ERY\&6JWD -M'YIA2;@="PTL$*9%]F[3JK:MZ4%K'TXM4C#0O@_7C>?)I2LKUU5=<9^52JN8 -M3CKSA!ZR0]V^)1YSC",U.J*(CJVS>^J3*T?ER'V.A;V7O,YU?341V`'(\=]= -M>?/J@K+D9!13O-#&"NLIC^J^S?B.`H3N=1*W1@/1`@`<`0``'`$```(```!% -M``$87!8``$`1``#`J`$!P*@!`@'T`?0!!`?I/.KOU[^[Q#==F0HX&^ODIB'*O(IAPNIP%=84'BGXWC7Z0U"JTXU/L`&OPJ1KK] -M7)6=2IQ.2Q+8-S=\H:X\U>79P&!_%880G@$+,]-=71R\;[9_J;."U,89>W^O -M]Y#_$YV@DTDX&2F\*U"AV=LPLGD8F?O5I2U-[>R)$Z;*P%4F]1GQP/2OZ1'L -M^&/_85QJ`\G!=1*W1IW@`@#L````[`````(```!%``#H7!<``$`1``#`J`$! -MP*@!`@'T`?0`U`:Y/.KOU[^[Q#===5H_<^LCI-28/2YPEW`M/]H[-*8=\9L3*>QL=*X1O1N#7VDF&* -ML9,6470IF@]=4%(0NEMK_9E[2"K-8<##?%,\V:O?Q+UB?)S1R;26-?_H5BPY&]3-NI -M4@>7P>I!$I#]JF(89G[(C+>0"2AWWC`YW:+\9A^CZ>)T"DGG)(&P^2-:]^:$82EO$"2S,X9P%1YZ?,TM0:E905`OKAT;*R3OYMS?W4 -M7FMIY"0+>TFRIC07@F>Z8&2EX??%568:ME)8:'/SP'+9D$6[>O$!`7HI;:6C -M\WH.MEJD:*A9/FO=E5&!D#AXGN]%V,6:8_$#-JOR`PGD:@\L*7U/ZTI.C&0X%,@L\PEAWN7X.*+QU$K=&E2L#`!P! -M```<`0```@```$4``1A<&@``0!$``,"H`0'`J`$"`?0!]`$$!^D\ZN_7O[O$ -M-UUR$6GMRIB#/'8<5G;<8^B;!F1W -M8[(1I14IUB92;AO11?5'KWT-=6A^/F>I(2KW6,@(0.<\=QO72#U(ZQE[4&:# -MI%M6HU_]#SYRHMG%,[0:L6:0?X!U$K=&&3L#`.P```#L`````@```$4``.A< -M&P``0!$``,"H`0'`J`$"`?0!]`#4!KD\ZN_7O[O$-UUR$0E;%XAFZ(&+,9;:P,56H^YC9\[Y>NK4QZ%I -M8.?RB6&J8B=O@ZOZJ,+Y'4.&,C&Y?PT@M=#M9LD+'"';?8ZD)L^?):N0FBA= -MBOH5:R2M*5J\CRV?*#XY\\5X?R1,#@N17/\\AN>T1G-$7\;PO>G]];JW)9X7.6:8A46EQS -M6)J(3`5BO['HK!^04:OO614T:J"HO2= -MWKRJM$TS5F.&;OD.:M3BC'_H81MSZ'[R`JGG[ZVU5!5(MY[EO^CPBD@;YQG> -M@>/WHR-9EX!]_N:F4Q[B/*ORV#*_4;TXI!@DD))U$K=&<(,#`(P!``",`0`` -M`@```$4``8A<'0``0!$``,"H`0'`J`$"`?0!]`%T!UD\ZN_7O[O$-UUR$(I1AX=6E9D!?1384[=,U*<&/A*[ -M(G4"$$49OUJF".1_#//\6B55?Q&NF_%:_%Q]EP1^@**JRZ71P[U82%4L]OB" -M48FJ]_2/N44.0='(\`KM:KVYB3N1POO>%&2FB+SZ'5"QH1TH]K"72 -MQIV(Y8`1?DQA.7X]<2H079KT0\6!V+28XJ&RP%^)5\\D>!?T]U;<3FQ&44/? -ML0"9%Z#.K/&-:!U/M1+%X8R9WRBEGR1A\624Q0=ER9.J(>!D=1*W1EVX`P!< -M`0``7`$```(```!%``%87!X``$`1``#`J`$!P*@!`@'T`?0!1`'V:[N!L\O'N@93)T#"V:*4TC"Y(/`IC3 -MP"$8I/LRYGMXX`2QRNK9T4Q4;6IU%U#JV*&I.F+5'"RNOC$#!!.;YAM"W__$EP]@]/+3*(I -M35V*Y292N$Q\10<,\+E[2BTA1;P*QE3;^',K$"D'3.:ABW\_58AFL<]^9)N$ -M0Q-KV"T.1;:1$%P?``!`$0``P*@!`<"H`0(!]`'T`&0&23=G -MJ`.Y*JUDC(1J4,N("4(`````````%PJ``!`F9WJ.QCQ.*JRU^0K%,)- -MOPK$HJ\:3-_1;%QL?%O3-14S=];13#7Q>MH3^,!U1NI_0X@?YAI1"\CI5B/# -M=1*W1@CQ`P!L````;`````(```!%``!H7"```$`1``#`J`$!P*@!`@'T`?0` -M5`8Y-V>H`[ERG6EXJK62,A&I0RX@)2``````````3````#!";)@[_872BH%_ -M*<6%X9BTA$[L-2R-,]RP?:HK.,J-;,4K02IW7HR"?\;17'42MT:+_P,`;``` -M`&P````"````10``:%PA``!`$0``P*@!`<"H`0(!]`'T`%0&.3=GJ`.Y*JUDC(1J4,N("4(`````0```$PJ```P?81=5&AD8;2)`"[#E14WCH;Z"SVETNR8@"(` -M`'@``@!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``\3K4+MZHHCGD*SLLX#VMZHHCGD*SLLX#VWCL^(F7;N"AX0^U%QNU\M5O`AEE0H&X$! -MF`P@01G<\B>'E:=0$1U,0[Z79\&_H9!UN*W#Y"GITVKXZR+P)^(!%\AJ<*0``'```0`2@ -M)YBG?H,3D"XYGDC`'UX+*G[420```!P``$`%1ZZ-;0$_WVA"^&H"LC4=UKE(="+B`C"`````$```#L(P``T'"+XWC;_7E) -M7B2@/$Z7U<.Y0$54Z05D25B:-:`\)KG*T"T&'"%FU7'YYK[6*8,9O,?FP3[^ -M:KY)MVV0N!F6&WL,S+!QF"ED[)#U2:ZP0C\"5%UR;@,(_R"AV)3#`*L-('6+ -MM$\]#3)"!<&IUVK]WKYY-LD'+Z>NXA-G<+OY$"M!2H/M:_5%$T#B5S -MC9[<)%_C$.0\[VB_SDHPK7+/03HY$CK%&H*@4:I8W`_6--NTL]'^U<>>'YE9 -MW5M9O^]R^6[_DEYY#H3"8OO2$.BZU\=9)8YK]R;;WRB]7O?[91-(;W42MT8Z -MK@4`'`$``!P!```"````10`!&%PI``!`$0``P*@!`<"H`0(!]`'T`00'Z595 -M[?:$+X:@*R-1W6N4AT(N("0(`````@```/PA``#@X%C&X^[WSH5<4FIK7)5W -MLW\\T&!XG.`'T&D\Q_M7(L-;EJ3.#S1V0,:WV9=RHR$X/^ -MI$>;T5Y(Z(>%#>92D4PST4R]Z"6@I^QCB;WOA85.B5_UOV#.'SJ37`ODYQX; -M0R`1B?0+,O(Z]+0K;=V%Y+;8/]H<3S%U+^/EC?8[=E1QP]S[\&NU2,E84RZ0 -M](\+(@/OX[J-=!?&^N-/_UWP,CDRBLDZ##Y>>?/OW+CIC_\"0?7`%E%A#/P4 -M41?Q)?8FF>V&!3C\IT7',S]2J+5VQI4@X742MT9[N04`_````/P````"```` -M10``^%PJ``!`$0``P*@!`<"H`0(!]`'T`.0&R595[?:$+X:@*R-1W6N4AT(N -M("0(`````P```-PA``#`?CDIY^^)"&.,2WY(X$%=R)L>DZO%K($3./=GB4/J -M3X;SDMBFO)3.(!L^I^9*_ST70/RS0%'/C'TT]P0G/NM]V-Q0Q[L:!&3%N\_] -MGL+V/H8MZ6?Z>E%G,\\F(JLD,T`:VX5'6,"E(MG=NQPZQZ/_M\EE2>/>T9S+ -M6B`ZCKQ`EQELZ%$UJ[CY(7>7R37.*)FI0XOWL0EY:0^M.ZL_^+[0Y3V=)B0C -M!G0"9,2PC;Q6[[>KO??(XGXP@D&]25IU$K=&.L0%`&P```!L`````@```$4` -M`&A<*P``0!$``,"H`0'`J`$"`?0!]`!4!CE65>WVA"^&H"LC4=UKE(="+B`D -M(`````(```!,*0``,!$H\?:^`YIG\+$7=(V\>,,-G0$L"+D#W5=6@Y9"H;)E -M7+-/.-+(@^(-PES:=1*W1B/5!0!L````;`````(```!%``!H7"P``$`1``#` -MJ`$!P*@!`@'T`?0`5`8Y5E7M]H0OAJ`K(U'=:Y2'0BX@)"`````#````3"D` -M`##CP>"DCW,,0LWET%@%!\>2)/3 -MFG42MT:/^P4`/`$``#P!```"````10`!.%PM``!`$0``P*@!`<"H`0(!]`'T -M`20'"595[?:$+X:@*R-1W6N4AT(N("0(````!````1PA``$`;^Y8%(!K@.NLQE2^6, -MADL=PNUZ^E;>@9DH(KKSVDW#*IZ4U/)I8"):NC@F.V$\+G;603I8C'5L%*3[ -M`(:P3=[!693DR=1Y[DW)Z3AG$ -M2;1??UR!-%`DN8=7B%%Q!*A#O7>L(U[GC`=H%*L',Z8$5M$C'^ -M0'*VPC"X1CYNKVF&7('9.MF@"4+P-M,>-HJV<=O83`9H(5812H%2AY=))@4= -M^CIW'UOST9&W'4]G/&1-'M_B=1*W1G,+!@`<`0``'`$```(```!%``$87"X` -M`$`1``#`J`$!P*@!`@'T`?0!!`?I5E7M]H0OAJ`K(U'=:Y2'0BX@)`@````% -M````_"$``."E$QGM;=G-\N-R7ROYE%)6;>7:K8=1Z5SCH=I4L'&\A[`R,K&? -M"\Y'ZO%;XFJ%<@42R9&^^NF!;H=C*(?O69)F1%>^F<[^!0O=+C17/BJ%RFB. -MD_,_/AA;$*<1`8!'YW*K$9'Z3=J1\+,2FC:;1$CLOO:^1`>3U@-Y!14N".%A -M/T68X*"H[6^*UR7Z()O7'P4L-Z+?@*KT0`4M_GS"=#/=!`$\"+"V[-O5P^Q( -MAQ3KI&WE^?[SBI3\65$X:T2J$UO5TZ.UAMMC8SVF&E`P(W.^6;+N-V/\P$4] -M`I`)=1*W1NX6!@#L````[`````(```!%``#H7"\``$`1``#`J`$!P*@!`@'T -M`?0`U`:Y5E7M]H0OAJ`K(U'=:Y2'0BX@)"`````$````S"$``+!Y,"Z]/9HV -M@#]"I0(!)'6@@^;?V-5*(M58@5'B"\SQ5BH"2?ZMC.])Y%W6JKWI;-D[?_0YZII[HW@(0>@AV -MW9)9#4+_.LU?0X.:[K`:MA.-\M95)%W6-1X^,2B@&\>._DD3UR_Z!?-%EL+& -MRYA?S./_C%@_H$!%=1*W1JE5!@`\`0``/`$```(```!%``$X7#$``$`1``#` -MJ`$!P*@!`@'T`?0!)`<)5E7M]H0OAJ`K(U'=:Y2'0BX@)`@````&```!'"$` -M`0#T::$EAQ`+=-8IC]>.X+3T(>5)WDU\JK22PUY[LGFXQ`M1`3!=?]:=':-B -ML^5<_@+LY:Q%-@VGYINC#!D#'*-N"E*`87^43,,ZY!?BV:J!1C7*OZ5`7F0< -MRK!0C1DT4+!J`M9VH-:?#AS/W4DD:+6+WT/_._*>=7=CI;]+1.WXFV=FJ'N3 -M'+%PFM*JP+MG!D']TM*G)+@2&Q_7F-43B<04'ZCMF'?;.=SI>,(,&%G%[M"M -M5L6GMON)P8=#$!/$U6:6\7GU3(>HO9U$K=&8F(&`!P!```<`0`` -M`@```$4``1A<,@``0!$``,"H`0'`J`$"`?0!]`$$!^E65>WVA"^&H"LC4=UK -ME(="+B`D"`````<```#\(0``X"Y9N@!HV__<\5\SP3I)HA@A,#6K&@]SJDN# -M1()_U5PIR_;T,D#X.>Y,VUP*S"5T1R\YE.)`W34*VGDAN"^$?>TPEIP]*QAV -M)UNVJ=*,J@VCO(3C_YPL6!5!GK,6E[D6*!M$`4^1_7[^?M-A'8V&M=U41JZZH7R>DA8XVDJ!L,N>&]SF` -MW-KI@8[S=4H=Z",HPWK^LN^<^390,F!HA]EF$!(O0SV4?ANPX9,M@BXF+ERI -MD0IV"(\WRL"P!?U!@IAU$K=&EW$&`.P```#L`````@```$4``.A<,P``0!$` -M`,"H`0'`J`$"`?0!]`#4!KE65>WVA"^&H"LC4=UKE(="+B`D(`````8```#, -M(0``L!R37A_B,_A76YC&,50C26'BY^R20`GA:^H^L#P'+%"Q'_?'YB\>XI&D -MT_]H\`2P2SVKBB$A^`3;;\#)1@T_I7@LWWQ]H5TK`'"_+^W'2$4VJWYH#?,Y -M3N);^:1R#[H_%#RCLM^O^OO=0/W#R&-A2*WHY6#&[?BVD7*$,XRFQFB<7]=D -M>4M#,(8,+\72K\X4I6DQX!O$TM=9MIU09\!\489R0SC)$H:3>S3,)[9U$K=& -M490&`.P```#L`````@```$4``.A<-```0!$``,"H`0'`J`$"`?0!]`#4!KE6 -M5>WVA"^&H"LC4=UKE(="+B`D(`````<```#,(0``L&3X!V#O*"BT]'SY3W8] -MWT*-D'KU-8+W_N$4_-ENWD%Q"K"O5>)"71RU8UDMAO0Y_X7$WVA"^&H"LC4=UKE(="+B`D -M"`````@```%L(0`!4)F,=?9@$G0P8R0%/1DD^]>LBW.S3Q?BH'KDY -M;R?U8#<]97I-D/[QGRVS.-;2H@3RH^(TR'@$LV.HJ$ -MD;B#`#I&M#SH:_A&J[?H#^=GP/I&QQ>$3P%=O_L&^=^=7]^'^ME[HP2[.@UH -M&E-3'B+Q=R5<7Q)152EHJY)<'S\V/$!!_44M_ARG1HV(?]U)8+W?_FH&IG*O=1*W1@;Q!@!<`0``7`$` -M``(```!%``%87#8``$`1``#`J`$!P*@!`@'T`?0!1`(\4F_V-D(4K(7I)QVTVI3?`C:TC,0:).[:R -M@FZ4^;O#0PEGUMI2(MWA -MFI3J(H(Y0!Q6]&1800T)&919\]`D+(";8R].@)VTEOAIF*CE=#VTKV!==W$D -M4+/A^48I4V=+VRF6[_3%-J!Q$LD9(9K-TMJ8IEI81/@L[XM$O;ZIB#%=>WB:FRK -M*<5/JL[L&XBK*"ZFDO):FV%?5",8!>KY,VJJ(_5-M)TUTW42MT8&&`<`?``` -M`'P````"````10``>%PW``!`$0``P*@!`<"H`0(!]`'T`&0&26LSUH@PW+T! -MA/BD?"_$:NXN("4(`````````%PJ``!`\CNQ`))2(QH*IT)'>5@!+LVO>M9" -M"T`^#1*NR:YPBBPE'ZUDS)0XOGV6&DD2)0O6K8Z$25`,A^[!3BV\=1*W1K@D -M!P!L````;`````(```!%``!H7#@``$`1``#`J`$!P*@!`@'T`?0`5`8Y:S/6 -MB##1*B<`=LU78C%%P7D^;V2HE,:E]9K8Y\9'42MT8_,P<`;````&P````" -M````10``:%PY``!`$0``P*@!`<"H`0(!]`'T`%0&.6LSUH@PW+T!A/BD?"_$ -M:NXN("4(`````0```$PJ```P&EA>$$"F,+C2J^44TK)07;V`0%DJS2K$7L(9 -MWZ?_UU%73@MKK&OJJQ/Q@WQU$K=&_T`'`&P```!L`````@```$4``&A<.@`` -M0!$``,"H`0'`J`$"`?0!]`!4!CEK,]:(,-R]`83XI'POQ&KN+B`E(`````$` -M``!,````,-X!U<"9:ZO^B+R/&3*G\8GQIB`^:0T"(``'@``P!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``\_+?PSXK/;/(+;;1]+`^ -M)%T)LMS[V?(,'?`9RF@"(=+@&@Z^R6$'R;!U55K-&C\'V?Z#8 -M<5:VL"9=Q[R9`8.*J_$I```<``!`!,!9M=`1"P$'17V[/0@!D$.!N9$5```` -M'```0`4HY*K#;N3HJ!WCJ5:XPMPB"8VQ^742MT9G3`@`7````%P````"```` -M10``6%P\``!`$0``P*@!`<"H`0(!]`'T`$0&*?@#%5K^H7RS```````````I -M("(@`````````#P````@``!`!@````:PE5EC@B$AJ+WPN";]WB;?^+*7;'42 -MMT8H7`@`N`$``+@!```"````10`!M%P]``!`$0``P*@!`<"H`0(!]`'T`:`' -MA?@#%5K^H7RS```````````I("((`````````9@A```@``!`!@````:PE5EC -M@B$AJ+WPN";]WB;?^+*7;"(``'@```!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``\_+?PSXK/;/(+;;1]+`^)%T)LMS[V?(,'?`9RF@"(=+@&@Z^ -MR6$'R;!U55K-&C\'V?Z#8<5:VL"9=Q[R9`8.*J_$I```<``!` -M!,!9M=`1"P$'17V[/0@!D$.!N9$5````'```0`4HY*K#;N3HJ!WCJ5:XPMPB -M"8VQ^742MT;X@`@`4`$``%`!```"````10`!3%P^``!`$0``P*@!`<"H`0(! -M]`'T`3@''?@#%5K^H7RS^?P>9ON(-#LA("(@`````````3`B```P````+`$! -M``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(` -M`,72W=.'XC8^,)(XQ*MFDLE?&[E-1`7C>1R!4<^Q@9G"`VL4F:'<(VG@%QW. -MP'O\%A>;.%/78KBHW#^3-&A@B676_`QOVF@=MXPSD[#BD>@0XC"Q_9RLM8*8 -MRL3>PITE+R\"QLLBX_%M][,D)O,:?%P<,'AY_=VL5S2DZ)Y/[T""*0``)-=^ -M]D2TA45B5)P3H[;P)4:].*0``'```0`31.BRD>.VD -M#V$HO?#<\V&"A"UKA=W2N3H](;N*2_H??'>-WU%"X215H-+J)TWJV4/];O7 -MO--`0XEAMDSFVH(]OPQSIW-[RSD\E"U<,;`<;;'^7V[(DXF=RY:NEH]6'EU3 -MT6_8N:+05_*;S!93B[&Z;]R`"I:04RD\L*ZP#R=.E45^(G3:V'0?`T:0"1:$ -M!-;$B+Z;]3403742MT;;Q@@`O````+P````"````10``N%Q```!`$0``P*@! -M`<"H`0(!]`'T`*0&B?@#%5K^H7RS^?P>9ON(-#LN(",@`````0```)PD``"` -M?5BXP<2Z<(TY/_HW$:5=M0FN+Z^#P+[1@@:;%KHF-2S#W0[=&_UN0$)%N -M<52*Q"W$+\':;SAPM!V0N-H9NU]B-C16O_DKZ#56JC#7EW42MT9,Y@@`'`$` -M`!P!```"````10`!&%Q!``!`$0``P*@!`<"H`0(!]`'T`00'Z?@#%5K^H7RS -M^?P>9ON(-#LN("0(`````@```/PA``#@9KS%8GSDJ&QBNYO(YATU_JDY82,'M52,O+)"`12GYDKL[-RK7,@&`R!=KS53R&UV6;31>> -M46*QZ&VHJ2\V*^;,'PYRG@<<`OQ%`N82N$\(:1`")1K6)-9UB^&S1(7+Q,5SUC:---,C/E7F/E`=/6NZ[;5"2<-]TE#38^0,(, -M565%]5A`P#G@.`;%JV!K*B-I5$!&92H7S%@?SL20V\RN-0N)ONK(DQ5<*^B% -M+<>GT4N#X3).*1B^IA-%T9ON(-#LN("0(```` -M`P```-PA``#`<"A4ZFC456FN)8]8OYGC;U<7<8 -M,"B"%XEGIJ^@'[>\8L'2I+CSI&EX$^Q!GBTZS*X"J?9G_>]VC/U[6+ENB0D8 -M3/3M_<2]L,-EC)T?HB!_/MYU$K=&)/P(`&P```!L`````@```$4``&A<0P`` -M0!$``,"H`0'`J`$"`?0!]`!4!CGX`Q5:_J%\L_G\'F;[B#0[+B`D(`````(` -M``!,*0``,!-E40'[R$Z29\.L2&'80!M6>44A$LL.@S$V\M9-5R+XC7;ZQ?O! -MA1LQ+QV-=1*W1F,7"0!L````;`````(```!%``!H7$0``$`1``#`J`$!P*@! -M`@'T`?0`5`8Y^`,56OZA?+/Y_!YF^X@T.RX@)"`````#````3"D``##2`'[< -M:^!=67<;AX^=#I'U7_A9&N5+B(8//VF2@&.LL-+F=_W@K/VH:$^-*W42MT81 -M,@D`/`$``#P!```"````10`!.%Q%``!`$0``P*@!`<"H`0(!]`'T`20'"?@# -M%5K^H7RS^?P>9ON(-#LN("0(````!````1PA``$`)KUYI3G1L*XP?E9>V^7\\W(`V#=+8*&D3J9FRE].%2$$OG8`C#!PI)*7D/K? -M(H:HP"$PZY0_*]0"90#S-<>2#\>`2K&1K$;0&N\W]ZE[350@=ZLOYAX$C16# -M^"KMDW1P1!J;<.+/';H`]\\->8;$J);%YO0W2R-]I=?-F3N!>1`%E6FJP?VA -M.EE[;!E\X#2:@HHVRD8'].5,?X7D,H-!(@WQO#UINNCSE%/BG7>'SNDZ)- -MH_^@N,`F+IUY\I"30=63K]&+&)1/&_(L/:ZUJ0[V#D7G^[V'6U5210P#[\E= -M0PFQ2ESC[/$ZP13UP1:QT3%8MMO:K:#J?7>-<^Y -MI1>>R8/R"/UG%(W7'R@"4C;9]]]H)W<'JU-;`965T!7&0^A8`:`*@/&[L[TT -MN!?*_Z]_>Q,P_W8[M4.;U^+DPOL6$S=9BDOK&;Z'B38U4YK7_.3M:&Y7=1*W -M1EI."0#L````[`````(```!%``#H7$<``$`1``#`J`$!P*@!`@'T`?0`U`:Y -M^`,56OZA?+/Y_!YF^X@T.RX@)"`````$````S"$``+`E'0KG%5B3P"]0YLHP -ME[1.Z4.`CF)3/N-^E,83YG0O4.8IOMWJ+-%M4^^5`9AK4(-N48(9_/>KT]E:[IUE]"+.G,AZ/7@8V/J,Y8WT -MY*U,<663R*"\_]\J]BGL-.`J,/M19I_+?FK])"M(:2AOQ3V+ZQ(Z>#`CS -M+<(6>)`<4A.''M?I$4CD3#^(B(,^2;Y%/I1BWXRX7>_XZ6#,)!OK)-]*=^YV -M%Q63V?_*:LF:F>G&DD&=,*A.K"AKP0@TR.7E9;]5<7P)=AT+2_F/9'.#DGN, -MGQQT%W(]^ZCYWO?"1&S5HPIP1"ZW<#$H5F68FU?C^5O%W1(J%*1@W5FR;:3 -M:62Z^R3T+\NH!'7X6>YH3O:2SQ9%2^W.RZ4FS/!I=MXTM^0_N92LV,MV/WC1 -M/11DH\[JF9E$680'Q43K&/73?P$?97^?'E\ONQ\#%C^0LA;O]H`\F3QL*X?Y -M53_BD3:]#5Q\-_2%@GT41PS[X%.AKU!?'RIUH3A3^)+A):, -M&[U2HF)+^(F)N#`^-\SEZD"L2QKV_E*8(7+5VS@H^>L.>8Q0$(J@\`8):'H6 -MG.BEEWXP%M3MD"O=[=>F%9U&.."A.;QU$K=&6YH)`!P!```<`0```@```$4` -M`1A<2@``0!$``,"H`0'`J`$"`?0!]`$$!^GX`Q5:_J%\L_G\'F;[B#0[+B`D -M"`````<```#\(0``X/@(UM2`RU=+$Z(!WU^$9U1)-5@G3=F+7_1,GI,@S/-F -M[N1#DFVF#.@9HWMBE'V+/W,G8>)I+5AHHT0B!A9]O45W#V@A>FG?3C!X*(K` -M?L_W/E(G\Z2X]SY1)/[]%SV1;6L%P%AYBIWW[]W1%EHY.]Q2F154+;\0AUZ' -M=N"?V)@<8+ZFNE,&G\F#P0&*X,@@U4,TXA0:&R[LF)V:DR:"K\\CKB%JU#5< -MWER$.:Y@4O!-="Z1'HE,"YL'H$W9NWH,4KM"B,*_\ITB:U2(AJ.4?=P=>K;O -M#@41&<,:@B=U$K=&+ZH)`.P```#L`````@```$4``.A<2P``0!$``,"H`0'` -MJ`$"`?0!]`#4!KGX`Q5:_J%\L_G\'F;[B#0[+B`D(`````8```#,(0``L*\A -MHOL_Z7N+RY(/LU"\WI.30,R63=;\*Z.B7UH@6-<&PYHXWTV!Y'>O%X8T.(SJ -MX70Y_UFLGH(#[@KT=931BR%T)P\$`4ZOF=/[H0U;$^AO%'*VJNO8.[,(7-N2 -M9_<<]]&I2KJF\#GU37[(2XYQ^M(W*7DPM-1D:A9'].OMQ"HY2;X$L,Q[&J2K -M;B[IMO%C\VH_<)#K>'LWAE?+$U[BI8_5+*)Q0LP)`.P` -M``#L`````@```$4``.A<3```0!$``,"H`0'`J`$"`?0!]`#4!KGX`Q5:_J%\ -ML_G\'F;[B#0[+B`D(`````<```#,(0``L'EKF17GF"!ZE3%)V^_'SDI:WC*N -M](G,@9)ZNHW3'IA;A6(I4$O+ZN)7$%?!R;6B-SRR\%60%3L?E)YGZ9RB,Y(3%,*YR\A_>T"B'$2M^6*80$6/XRV-9NX=&Z^+EYXD[B%?9&[L:NH^X\K^7P`W-;4KMK(Z/9NDR[] -M.UV'LV-7PJYFA[M8N&R=9);QX9['*&)G?:&^.^IJ,8)7A^O0Q/AG]LAGR=P$ -MKVLVSN0X/->9;?53QJ%?TS/_:ZM"$>&]]6T@0`W[Z;G=_J\6=I@L=3]-H`%K -MV;R54?)*!"L3RY!XC'0_8ZX5\X_!L)<#;-!#(IJ\R=3U%SGW!TIMSC:FVN>( -M:>ZF]QN]((%I5'UW&?X\<HM.=AU2KNN\:-3C-V@3ZKG_N1T'*O?:G3%D? -MJS8D"UL0ETQA3@NL8[;E2E#>S06Z*K[%(4LX2>9*F;/U^_LR'JFIS&NGL]QF -M#]=PFR(`Y9:T0"'GH`-RK'[=96_IXK,7=1*W1HTH"@!<`0``7`$```(```!% -M``%87$\``$`1``#`J`$!P*@!`@'T`?0!1`$TE"H\\=3T5R/L'-LH>#=<+Z`74$Q3W1',D+`$UT&F*O_00 -M8Z#)$ZXQ`;H]HO\,XS7WI?.AG3,)$=U)PIT<0K,S_JU2D4[.$4^0P!=JR*'HE4DSQPU*\D+'1%Q0``!`$0``P*@!`<"H`0(!]`'T`&0&298T]90"`@)E8D:.!2>C,G>#'.+5<0+67+B;-@ -MHY@HU\#;1BD156*@5_9X>YI>/>JR'T`?JQV[4;!$V[AH=1*W1O];"@!L```` -M;`````(```!%``!H7%$``$`1``#`J`$!P*@!`@'T`?0`5`8YEC3UE`("`F5A -MRC3K:OQ#ORX@)2``````````3````##UU/\2)K5JKLS4H93>&B]!T_P+YSV: -MZ9-&;NTQTL#+8-)!S/T1>`&$+1;D]'42MT;/:@H`;````&P````"````10`` -M:%Q2``!`$0``P*@!`<"H`0(!]`'T`%0&.98T]90"`@)E8=+L&\B<=K91N`,L`S@\JI+K/)9UI98( -M&P)X_&](OSQ>UY)U$K=&3G@*`&P```!L`````@```$4``&A<4P``0!$``,"H -M`0'`J`$"`?0!]`!4!CF6-/64`@("96'*-.MJ_$._+B`E(`````$```!,```` -M,%V0$,FD=X:K,9F+*Z=H0``````````"$@(@@````````!>"(``'@`!`!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``\>W%FHU%*&'TYWTK0=3LF.89--$H -M_J=%722MG;<-[4^$J,@6,;(,&80M-O_:TD4T(H45K@&_0WOSH,I*]]_B"?H( -M,]CTZ]AO$+'08!JY-S(WBI,B!Y`D!%P;/QX8/AU8D@MAC1:SC+9R/PM^\1L, -MDD-"GN?]CLQ^H/(TS/^_30`I```D"G8E_O%-G-F6T2Z\?F>)2F&J%$:_L^YD -M44T$"%5.\H0\=+11-````'```0`5J -M*>.W7!RUP=W)YQZP98^3`2,^[742MT9$@PL`7````%P````"````10``6%Q5 -M``!`$0``P*@!`<"H`0(!]`'T`$0&*5[<7IBRNG:$```````````I("(@```` -M`````#P````@``!`!@````:RV_ZO,/"@06'X(IC_*9I!K=U3-W42MT8?DPL` -MN`$``+@!```"````10`!M%Q6``!`$0``P*@!`<"H`0(!]`'T`:`'A5[<7IBR -MNG:$```````````I("((`````````9@A```@``!`!@````:RV_ZO,/"@06'X -M(IC_*9I!K=U3-R(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``\>W%FHU%*&'TYWTK0=3LF.89--$H_J=%722MG;<-[4^$J,@6,;(,&80M -M-O_:TD4T(H45K@&_0WOSH,I*]]_B"?H(,]CTZ]AO$+'08!JY-S(WBI,B!Y`D -M!%P;/QX8/AU8D@MAC1:SC+9R/PM^\1L,DD-"GN?]CLQ^H/(TS/^_30`I```D -M"G8E_O%-G-F6T2Z\?F>)2F&J%$:_L^YD44T$"%5.\H0\=+11-````'```0`5J*>.W7!RUP=W)YQZP98^3`2,^[742 -MMT9"MPL`4`$``%`!```"````10`!3%Q7``!`$0``P*@!`<"H`0(!]`'T`3@' -M'5[<7IBRNG:$#+()7TY,8VTA("(@`````````3`B```P````+`$!``0#```, -M`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``&A&YBN! -M2<1T`VN^`A=<$)H,*LXF<14W6:7\X0SSC(0?H";Z9\:RJ[YQ$/\+!8N9_U'Y -M"GAY%'CS>6OUE=?[889YO%&*S1^/8S#@U7+1R:H:X5D.5N46-Z0DVK4PN2`+@INS,\Z1*JEZ;,T8`FC+!#RV5X1.,^296#W1(@9HT*0``)%,!(^=EFLA* -MO+HKFGUV7\P_:Y`.7\>8F8J\%7]KIN`U*0``'```0`3Y?Q\?#=XW>DVT#WX1 -MR+H:$R*<]0```!P``$`%D\=&3%:50=?&JY-(R\%^&`VSW%Z8LKIV -MA`RR"5].3&-M+B`C"`````$```#L(P``T+A1,.\K'3PLZ.4H2_L4[H<^VH@I -M^9W?@IEM!F(K_"I3;H4D<:7Z0RNA6_[U(V].EL@&9X5R4M)TU7/K1N>0);4( -M8OAV)LV;%.?;?^)5-=ALF(>F!@!E1F?14IP4\VD+"<.'XJ,ALB-=(:-_I6L5 -ML%(^'FB-M(4W)4VEQZ#[[744$&S_A5D>XQ2LEHA5ZC-2Q:>=]6>N7Z04.`R] -MA%E-.]P=5=X/L8@0W^#V,F9*%&/AAQ=V6;$:DV2'R9;@QG`+U=WY$@PC&+SQ -M9?J3SG42MT9^_@L`O````+P````"````10``N%Q9``!`$0``P*@!`<"H`0(! -M]`'T`*0&B5[<7IBRNG:$#+()7TY,8VTN(",@`````0```)PD``"`/#:#F:R" -M4=4'5\RY:XM[-P*7*B*K4K&_SGXR5L;TI$ABX$HBY@),P$D)`(]^LH&X^Z:E -M'B%KK*=I#O'D;+;.CE?))#E+'W!@,H5,Y0$>ME%R1+?9U#W._WF4(%IAC77[ -M^#.WNK:1TCE]12WC&>KD`LV'DP)[YIK^5\.W6'42MT9#'0P`'`$``!P!```" -M````10`!&%Q:``!`$0``P*@!`<"H`0(!]`'T`00'Z5[<7IBRNG:$#+()7TY, -M8VTN("0(`````@```/PA``#@'Q,:>')^;J?W.IH8IT9>$Q`LN.3O0)5R[/J0 -MU^/4I]??Y.9#8%&]KW85IQ2#&(GQ+,Y>L9W&1E378#C"6*NT@P$K6`ZN-@`S -MXN(="4)3N/$-)V->+\$*#4'$KOS_Q:)U9)=DOSJ,63$U$9Z5 -ME66>Q-V'$A$_@1-#\0NH"1L\M-ZE`]Q05ODTG]-B]$HQHIYU>KCL,#?*%H47 -MV@;F=#SV(DV0ZQB=B7S/ML^)W_[W%K9,)[A5];/3]'/4_NS4([Q;6JU+OL+) -M@-[U7,K":P@3G\:L@'42MT;,*`P`_````/P````"````10``^%Q;``!`$0`` -MP*@!`<"H`0(!]`'T`.0&R5[<7IBRNG:$#+()7TY,8VTN("0(`````P```-PA -M``#`)ZK]-EW"V7>4LU?_A+SCF?U;D^(\'A25YB=\KNX`36.R[A?M@:,_^)P, -M\5F[V"A@YO=*PKM)G[W;<7EVC"J[[*.4!R!PE_:1V$UYY4JE9$DP6Y?96*.J -MT3\HG&P'W%Z8LKIVA`RR"5].3&-M+B`D(`````(```!,*0`` -M,,0GFN#4"!V/C%?@8$/TO\PI,AFQ6_5?P4'6H6;3X5,+M-^HL;N8+"-8 -M=1*W1O!.#`!L````;`````(```!%``!H7%T``$`1``#`J`$!P*@!`@'T`?0` -M5`8Y7MQ>F+*Z=H0,L@E?3DQC;2X@)"`````#````3"D``#!RR%)_&YTH8H+I -M<9]<*SWH$E+.W5YZ8,V'\\UY@@=/):3)`]:H^#)SO[HEN742MT9@:@P`/`$` -M`#P!```"````10`!.%Q>``!`$0``P*@!`<"H`0(!]`'T`20'"5[<7IBRNG:$ -M#+()7TY,8VTN("0(````!````1PA``$`/^%VJUBRYS-)A8G/S9*#Q,9QIB5H -MPAX/+@$*/$4.-$D$IPU0/ZQ1F,D[#0^D<[+\UK<'EF\\Q@*LOI]=7@N23[H@ -MFS^I/M"L(L!7+75W\LDHSIMPD2JV0*GZ1(* -M9_-7$5_I8SYXX]V&?P"I+M%\_7Y3^JU;XR<^2,. -ML27^UZ0DCO8X=_1A''0607RCN75T\,IS@GV;PJ#1@[=1ST%*+H2EV"Q.0@96 -MWKW5GU3(=1*W1C5V#``<`0``'`$```(```!%``$87%\``$`1``#`J`$!P*@! -M`@'T`?0!!`?I7MQ>F+*Z=H0,L@E?3DQC;2X@)`@````%````_"$``.#/R'LH -MF>JO)U,E;C6^,3$V#+"SG,V&L/<38GPMOO&IO['`-U"Y[)-]C@>F+*Z -M=H0,L@E?3DQC;2X@)"`````$````S"$``+!1.?@6T1BX6[IBDE#W5_A"07)I -MQ2HRXO:%V`_!+#9]*X`K-I$)2[.>LM31SQ`,#(7RAA.3PAS6XL20B/T4*LXI -MD'^TQVP`=R6AXA*%&221V1N"TY\V?!U-AX_VB8A`YO9KD]'^Z#>EI)H$#EDD -M*0!`59/LI@(E*5?;$MV62!9YG=^;/4*F=_WO$NI)YV"LGCP[!Y+I^CN^_D3` -M*OMQK-C!*\REP?]DHT,,QS9F=1*W1L&H#`#L````[`````(```!%``#H7&$` -M`$`1``#`J`$!P*@!`@'T`?0`U`:Y7MQ>F+*Z=H0,L@E?3DQC;2X@)"`````% -M````S"$``+#U!HGU<>EB^O5*E7*A2>HMTOU!9]%#I"*VD"-^&I#:`HVKCY^: -MIIX5]*$RHQZ\[$I0.B?NXE,SSS_'_YNB[V@KVF<&;T#A8,3W>\88I'@W&W[CE& -M=1*W1L_%#``\`0``/`$```(```!%``$X7&(``$`1``#`J`$!P*@!`@'T`?0! -M)`<)7MQ>F+*Z=H0,L@E?3DQC;2X@)`@````&```!'"$``0`06?JW/[*IPW#] -MHPYKSQ$O;\J!8>?Y*'@JSRN/5$C(]ZI\HM\NI<3]]V)W5>'PV@99-01<%;`, -M@.E2?QWH+VQ0FEWUM0FK14;W9'V)*_U@H+82R-;I7?S`0W9[BC3<[<\#> -MR'([<(JP)^W!YH>*W9;2,J0P:E^"L?$#PJ.;6VL;7GM&BQT]$#Q+1S&P#K(X -M:]1?=&?UNZW*M:1+V&-\/#5'_D4QK%J`V'T0HH1?;^10^,8M5I#"W"X'FYI@ -MHY59HD6C.N-YQA$Z;!KJ*4X1^LY.45V5*Q(VZ^?-'0.VYCIW%Z8LKIVA`RR"5].3&-M+B`D"`````<` -M``#\(0``X!-ZG&U&C08D6\GD/2L@DL\(KWD_2H\M5>EGEAO926^3AW3+$6V) -M7BV3?G!:D/DN43\B@49)M&ALXAV:#AB1F9Y:P8A*%3!P9Q8T%K0->?(KO-P$?$F>\3NPV"O="6M>L%>>:7*YH,BL_ -MMU+`P/8V]\PM\$3WK9T"!6Y"VF6C?TNYRS*3CF5L?C:?P`>^$'P\2Z[V8#9" -MUF``BKRR_KEDF$?'BV)`MC1PSYB;Y\01*_)2MGC*ZY8%GQ:`3TE4_\7_>;SR -MHF1U$K=&&^<,`.P```#L`````@```$4``.A<9```0!$``,"H`0'`J`$"`?0! -M]`#4!KE>W%Z8LKIVA`RR"5].3&-M+B`D(`````8```#,(0``L*ETY9M^M[EJ -MOYUO^"2P-O.+ZL:7-Z_)UBT%7&G53N^EL2$O\(MXPKG -MCA\7C68DO<$`7+#"NHJ\,H"-RN,Z,Q;T990X49?/$5_LWV'4J8K"IQ27*#FI -MR8=%5\]P?WY[:1RW@?102\4%NXLI`*??C,CM;=/Q0OUQ@3!?G*$"")7,'&=H -MZBM9_%9^KA_->ZE1NP3S(7%NQIB:[0Q#S6'P4Z!U$K=&F@@-`.P```#L```` -M`@```$4``.A<9P``0!$``,"H`0'`J`$"`?0!]`#4!KE>W%Z8LKIVA`RR"5]. -M3&-M+B`D(`````<```#,(0``L(>L3_]$]RHFU+LW+Y<0N?02>5H#+ID&A4$, -MH1]YJS2[5AO1)@[;@;/=P7Z+I0>9L%?#AV^%RD>/WC6X&W@X$G2F?KU*4W)P -M.@8D#YD?`D#]TEM*1!&A*"KP^&Y0%+C]DH&*:U3R^*R&D].PZ8"_XW_ -M5FXG]\1_.-8`@A]U$K=&$C`-`(P!``",`0```@```$4``8A<:```0!$``,"H -M`0'`J`$"`?0!]`%T!UE>W%Z8LKIVA`RR"5].3&-M+B`D"`````@```%L(0`! -M4*O::$R-9+6Y%/=D9%#M.;TF]3^F)G.EB8O`K&?NJ1K3/F?_\;V-N&B*("8DTN=?(PK:P?+Q$?'KFI27:7K"=@FF4R^%2MA*6T$W9+4 -M?FTFU`=]E\66V?_VF'A1KV"BQZ"1E?LB)T-R=`9$;_",D'I@T-/>(#+YPWR% -MA;N*U3S!PB7;C#Q^UT<;0(F`;%.@7NUDYPC?7ST2';M$KICN+.93+<"`U;9# -MRQTK?S0.3?]RDLC1I>QO>YYZF;&\MYT!+`:.TC,C0Y535VQ8.`(XW71D:4GD -M+\%+,N#.]91K;*RK7=Z?BF+*Z=H0,L@E?3DQC;2X@)"`````( -M```!/"$``2!ZE_L(!87L(T#NG?02XB7N0XCNX62E`=AXQ/IZPIY5G%"RKMI6 -M)>OQ?CL<"VOL#;80.EYX:\24X>T5"`UHK+S#]!(,P]6=[XDCD2%-KHC\)D+4 -MV+'_L1.#X>,HDY`8%;FZZ?%;;@XIMZF?XR9QD&T\X0>L?#_1O(*!87MN;0*S -M/5;-6:P>!P%W=;5TU34KJ58-#1%V-L_-E.M<@5HILZ7@.7?&6O-V/W:9"!*. -M7W"YW;-']-$-[&V&>5[4M<]0H&S-,9BL?=7._0`,165T3?A9,G6%2]L=8'@" -M5`8!M"1\JL:?I@8`>2D^#<(T:_'=-SV)I^)VJ2(^Q8`&&+>&(:R5$9=\Y%QL``!`$0``P*@!`<"H`0(!]`'T`&0&2:H)3YSKCEX,[_/>R!JD1>PN("4( -M`````````%PJ``!`7@@&-KQE>)*ETP$V_./)36HL'-NG1T>:-%J"8I'1+=1*W1F^9#0!L````;`````(` -M``!%``!H7&T``$`1``#`J`$!P*@!`@'T`?0`5`8YJ@E/G.N.7@SO\][(&J1% -M["X@)2``````````3````#"T0&HS"A#6#C:B0`EIVAX#30\"W9^R7;P+H6W42MT93J`T`;````&P````"````10``:%QN``!` -M$0``P*@!`<"H`0(!]`'T`%0&.:H)3YSKCEX,[_/>R!JD1>PN("4(`````0`` -M`$PJ```PD.VFYE4;>OO/'M>'*":A=48JJMD7]XCK*;]R*.):I'&2^N)`;+Y= -M2(`'CW!U$K=&A+8-`&P```!L`````@```$4``&A<<```0!$``,"H`0'`J`$" -M`?0!]`!4!CFJ"4^#._SWL@:I$7L+B`E(`````$```!,````,&(EJ[9] -M#\(RNT8G5-R7T>$'.]>KBM.D;V)0@G154D,,;17"(``'@`!P!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``6%XGDQ3>!U*R_NT4F`>HCGFY.PN,);TQ.'"W -MJQS4]'?J4=TK4@4^:.-XL*Z*C]H;&0WWBS;S]+\?S`2CYD5I+M?K`YR=1VF9 -MMCKC:;UWL\W001E3F]`!$KG$`-9G(AY/5L)UJ_?(RS&*?J04<1WU%>1/A*9Y -M!KZS2_6ALI]X>PTI```D]LU^O/(TRVD7+O7W2#>-M"P.%TE@CRTH0(/*.#DT -M=4HI```<``!`!)8UIR!I4````'```0`7P"8:@<.W% -MV0+#D&(!U*R_NT4F`>HCGFY.PN,);TQ.'"WJQS4]'?J4=TK4@4^:.-XL*Z*C]H; -M&0WWBS;S]+\?S`2CYD5I+M?K`YR=1VF9MCKC:;UWL\W001E3F]`!$KG$`-9G -M(AY/5L)UJ_?(RS&*?J04<1WU%>1/A*9Y!KZS2_6ALI]X>PTI```D]LU^O/(T -MRVD7+O7W2#>-M"P.%TE@CRTH0(/*.#DT=4HI```<``!`!)8UIR!I4````'```0`7P"8:@<.W%V0+#D&(05?JZAK1E?'>_MI_&I-UTGH^L'=E:9E1/WVAU"W6%!>R#Y6(@" -M.RC+5=Z7(?`."W$K,X-4QWXKI4JXBJ@6DCAFL#A]3:H9)L,M-]JUJ.Y*BVTT -M^),,Y-E5B5CP-GRTT)>E2RM006[ZO2WW^N!"*0``)'U=)T8)C9)Q`HI_]:YW -MF7(?T'@8B/JU^*88//(0P!)/*0``'```0`1CHFW0K`5(P+`X?;Z:(QWUT,S@ -M6@```!P``$`%-%O[)NPX=D?R"2QN;HW#7S80+TEU$K=&\24/``P!```,`0`` -M`@```$4``0A<=P``0!$``,"H`0'`J`$"`?0!]`#T!]D0&IR!%&&[>;^I5"QR -M`&3F+B`C"`````$```#L(P``T'TF5KZARC?EJVU0@YV9(_%O1?Z37[J;$-Z9 -MK-QR/1NNS+[#/ZPW:GOED<>LVJL/_4G/@DK?6NK>C/GI2$3-"[RQP!N,W"'( -MV(8$GDD#-('X=W)Z='$4&(H)>Z],7,ALNM-9FF&)!`(^A@B-6+Z"^+IW4PC` -MVGQY+"D3C>HN'`)MJS6"\MS@NENSO3)@WF,5[F3;M&*[P#K(J=R*5G996#`T -M3(=A0%]/^3?(L9[0R^-SMAGHKA%OKTJ\AVE>`Z2QA9BV`46<=B/.9Z-D#W42 -MMT8"0`\`O````+P````"````10``N%QX``!`$0``P*@!`<"H`0(!]`'T`*0& -MB1`:G($48;MYOZE4+'(`9.8N(",@`````0```)PD``"`\ZLKRI_]?6,`W6DI -M570OF(G3[X++[>OEH>2@O[@(0!L!\))!0*8.][GBMX2#O>_C$AC-6YI_LW24 -MWM8@:='R']$AT=CH0R\%ZM/PF<<%HN6XT+,@[L,)=1QF=H69.F>'!7"0.C?' -M>#E?%]2RDU(Z\^:@HX)9P,9=PI1BCG82MT8['0``'`$``!P!```"````10`! -M&%QY``!`$0``P*@!`<"H`0(!]`'T`00'Z1`:G($48;MYOZE4+'(`9.8N("0( -M`````@```/PA``#@C"SR=6GQ&1L@?-T&J\1N2DTH&``H\13X-]OZZL%D+]9^ -MF`@0'#^)]^/?0*8@^J2]YU3PW3D8.DYKQ8.<4[P`FD5P,%R\:N -M8T[1U?QD'$UZ3#&(RY1_%,:)#-L6&>U1$2FYH@-D&?:+WV9@))>/WTB@ZO9? -M_/]T]/P``0!$``,"H`0'`J`$" -M`?0!]`!4!CD0&IR!%&&[>;^I5"QR`&3F+B`D(`````(```!,*0``,+*[.YT3 -MF(I(K4S2\K4G?>!Y/PP94RH&]Y98`\SW)9=757B&Z7NJYVTK:"])=A*W1EA0 -M``!L````;`````(```!%``!H7'X``$`1``#`J`$!P*@!`@'T`?0`5`8Y$!J< -M@11ANWF_J50L<@!DYBX@)"`````#````3"D``#`R^EDIPY$>TJ;FX0&NY_4Q -M!(-W6#]V8M8*IZ6%-$.@Z?K5SD<(CMW -M*TZI:9L#`+E9VVWM^[9IWF,`P`F+917K3[6S+L0F(`*VUSRTN8N&?MW';57W -MLRBU$.-8!SNK337RHPGPD_MMQ1&UUU':7^%H+P=654*2MND0R4P(^C5;0N.G -ME'O,X(7AV<84*6;(:U:/D;BF2`:1D?XGJ4,X'9Z7NG_N<*>R5P9I:6WE -M]/$LK#C"WW-J#U(\-7'N7]DE>.Q%)UBAN8,ECE/F@HLO;FG[98 -MCD]WUE_Z3ASC\B,*K2%`"WHL&^0WTQC%Q5MG*1!WA;,J-MMR83_V&^1L/?.S -M=A*W1FAW```<`0``'`$```(```!%``$87(```$`1``#`J`$!P*@!`@'T`?0! -M!`?I$!J<@11ANWF_J50L<@!DYBX@)`@````%````_"$``.!J\HL462I`[&5R -M4F.F7DR,:CJ[=LEWS?V'Z[/*RKSPT=7I%]7?I"UO&Z#HUIA)OL]5]9`(!7"X -M*V*TZ&[5$\&%M&2]J+U6[V]@*JCW$&RR6C,`4B<*ZNWV_",4/XC1T+WMU2A2 -M#V7]`K.R>1UJTP1JQVU6K^)>"]M.JO,#\W!YVWXW\L&M"2?]^'-T0Q=]4#\$ -MV,R!KD.,`J`W^7WQDYBKSJ1R74HX--A->3O^I,*9\3'U_4_5.=87L[Y^KL_^**Q]V-ZT"*#-XXK*68L%QKP: -MNV)O.W.1;5LB'H::ZX"\J#:GSU^U+_YW:=%HYB$,IQ20,*8B-^#"U5[N"(MY -MZGG-/L/5UG>]%KVO5[ICJ!-2OG(YD.(HP;O6)W:;NPE+>O&$IRH1_]XR*2]3 -MP2.E(S"F]_7E0HLU=A*W1GBG``#L````[`````(```!%``#H7((``$`1``#` -MJ`$!P*@!`@'T`?0`U`:Y$!J<@11ANWF_J50L<@!DYBX@)"`````%````S"$` -M`+#(J"K!3L_YMW1+QE"(6B&.T) -M>NUQ@ZK17NOF#3:=IU%]ZGY5$/S13^!$[26]H3G@!K=Y$X\K]&8]K:NUQO.R -MNL*93D1;(7J9I1?MB8[=$@CK#5K)I0&^_BG^W45)&O(L&..X?>I#5L?UY=;0 -M%3]7=J4614>EU?VA(NA2(^=Z=C3?']N&1],4I0AQAN)`.$A/SK/0=A*W1C?& -M```\`0``/`$```(```!%``$X7(,``$`1``#`J`$!P*@!`@'T`?0!)`<)$!J< -M@11ANWF_J50L<@!DYBX@)`@````&```!'"$``0#5498>\14V$CP>2T"1^#52 -M#(!C[L(!?"F8TK\WMNM3G8`1`)=M-YZRJ)Z"*I->\L1V&M'=FCUR3+_N" -MN:VN>?\^2#5+AJ$+S?S&^PY"_T].0J`*QY<`/EJ-WJ18BB9F$N.KV]A@_0Y) -MF]1IQ8-Z6]U98HH!3>_$?)/SC.*##REZI8*D,D['B!A(= -M!>`?M7$B9;A3:-Y4WDKC&^P_LL=4-%[)UGGJ9]03ZQ_*T2I'L]D'DLCXQEZ> -M&E4.N]#W.I;_G8_R>5;$"JD[S/9N+S#)GX'?^7'L:)4RZAW7A9\W/5D_55UX -MH9C+#BXT8`).:]UV$K=&+-(``!P!```<`0```@```$4``1A;^I5"QR`&3F+B`D"`````<```#\(0`` -MX*B5FD[T&AKD(#ZK3HC:F-12(Q?)WS/?E2"Y`@W6_`.A'F,>3FE7Z[NLP`_R -M;^I5"QR`&3F+B`D(`````8```#,(0``L%J13BQ9]5W&DAWU[7Z/ -MOSA'B.V7@];%*6EU+UC`FVQRPVSOQ9!0A1$WF\U877!!P@0+P2]^=010"?I" -M4#DN1`N+_%2("HKL^;QI#*+<3T_-A_=0,CDC_;`Y*G.2.UO!W[+%_=B4S(#5 -M-';%4KW/]AEPI>/=^?Q7>G]3R5(!\W`!05?;0DF<(3`>&*_;9:^-*KA**-U. -MARH[:F^/9X@#,9=?W/M_)G9QE0ER:*5V$K=&Q@4!`.P```#L`````@```$4` -M`.A;^I5"QR`&3F+B`D -M(`````<```#,(0``L'LU)Z'4*XU&/4PS>OL>6?47ZIT=*8SKP[D#4Y!O@BD& -M:J@^OQ*LV%JURD&_ZCMD/.L`N.[:R8>*8$2?*ML'7$F -MO$;W;7]V$K=&P2L!`(P!``",`0```@```$4``8A;^I5"QR`&3F+B`D"`````@```%L(0`!4(*BITU[ -M"V>+/NRZ<7.^)&GRYOM2&4*ZA046X.)7]]Y#/V-S"LQMV;D -M:7W'^_?]9M/TZ[STH6&_E@!HEG(YO`5S -M!6^8TX;N=&X!=_FN+]'I#LB`NO4QY)*O)M*G,EZV]:.@1\8 -M(12Q-W`*#FC]2C3DO#X3?5_/.>A^&9W>;`H$F,1S^L)-,4`1A;[`]YPE.9R= -MH2%:=R6"\>[=PUW\REHP@_>#K[!C]]&04%.`XC<$,7GXR@HMG3,YEIEUH318 -M=V6SG,\?2FD=XY@?=2(O!W%R6UYKZ^D"[Y/,CUUKK.LH1&*^'9M -MN`8Q-.L6Y7ZV-P*=[NL&9M`;4;2Z)006[.[`BV1<.;([(]4?)U=YF2]^HM*MPZZCV-%*;R^SF&AL`[VVIF3>JU2NK&'QLSYR::X- -MPYE8,L)I=!4OKPHK76JE*!MBIS.Q7^,*]D`PQE%,'"$R>87_^<((O%MP277+ -M_;1[EGT4];2\)=)+Q68GP782MT8*B`$`?````'P````"````10``>%R)``!` -M$0``P*@!`<"H`0(!]`'T`&0&26"#@(ZR`?BP6@JDR0*3E,0N("4(```````` -M`%PJ``!`[=ERN@+SP/N"F.B=8=CR1](BIU/74!C''J?_=A*W1H*3`0!L````;`````(```!%``!H -M7(H``$`1``#`J`$!P*@!`@'T`?0`5`8Y8(.`CK(!^+!:"J3)`I.4Q"X@)2`` -M````````3````#!;T6@:S$:I<'YRAW!3?]"7<@-QCBX3`UEV;=%E5P']:_)3 -MN$QC%6M5"+?(['82MT9:H@$`;````&P````"````10``:%R+``!`$0``P*@! -M`<"H`0(!]`'T`%0&.6"#@(ZR`?BP6@JDR0*3E,0N("4(`````0```$PJ```P -MW@)/:>O`-M1_U0)U&H9)`HP*R9KZV1A>A%3/P`]@^KZEM5A4$!)=#35?.$EV -M$K=&*;`!`&P```!L`````@```$4``&A"(``'@`"`!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``847NT/L"<9^U8K]R180PDU.)U;D"6+"C6^#'WK:,<;Q)QX@I```< -M``!`!$Q0CWB.XHQ@<\P\SDUV:O^:R]6T````'```0`4;4L)"+B[0U,^M\/_, -M0$[M,@1(,782MT;3N0(`7````%P````"````10``6%R.``!`$0``P*@!`<"H -M`0(!]`'T`$0&*4S:#AK@\MN!```````````I("(@`````````#P````@``!` -M!@````>;U*P1E8W\J*V-P0JFXW5_ER@N;U*P1E8W\J*V-P0JFXW5_ER@NC6^#'WK:,<;Q)QX@I```<``!`!$Q0CWB.XHQ@<\P\SDUV:O^: -MR]6T````'```0`4;4L)"+B[0U,^M\/_,0$[M,@1(,782MT;J[@(`4`$``%`! -M```"````10`!3%R1``!`$0``P*@!`<"H`0(!]`'T`3@''4S:#AK@\MN!M'^! -M(A"AJ]@A("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```( -M`@```@,```@#```"````"`0```(H``"(``(```VI)%C*$;J>**5E48%;:^EK -M/&+%7BK@^Y1:N<7V!V38/U:@L8PJ\L]M0SGI8;EWN1]]Z*F;0/I0SLX!]8O0>;9T2&+.;:<4X#=TQ1#(@\:I0&C24(-V8['&2`R8;KC4O19, -M#;",_.2H0)+S.*E;R)\H3]D\:-Z(^6ENQ@```!P` -M`$`%5@?>R&X>^4/;D5U@`KF^UVYL2Q)V$K=&Y!L#``P!```,`0```@```$4` -M`0AM^NVO[ZQ,O?+'82MT;T-`,` -MO````+P````"````10``N%R3``!`$0``P*@!`<"H`0(!]`'T`*0&B4S:#AK@ -M\MN!M'^!(A"AJ]@N(",@`````0```)PD``"`GB0(9_7.!JP?)=Z-KIV&$R#V -MQIWB:$0D,&!2[\23]ZN?!0C>-!+'YV(`\1[D\.?5K*!D,(GJ&#;AS9F([[*/WUHG2C782MT9B4P,`'`$``!P!```"````10`!&%R4``!` -M$0``P*@!`<"H`0(!]`'T`00'Z4S:#AK@\MN!M'^!(A"AJ]@N("0(`````@`` -M`/PA``#@`3DHS2VEV[VO5S\UE?&8V1@->R)\7`RA%+MO(#`Z/#DTO$B,U&YD+! -ME(;6-QUU6+L/%$_%0?Y5I=(9J<>#0G6.B*>+>]94WZ*IM>FA5%&O..39F9!9 -M;YGTF6`RCD<)D#>O/..`E2OK'L.+/\5=]5V`;Z2V0/\WHG%9G0YT^L\,$47< -M-"PPZ'F*OD:'F#G&@'$98T4B2A`NG+@)?_54@WL63C9A6ZTK5:Y7&+MY0_;F -MX'82MT;>7@,`_````/P````"````10``^%R5``!`$0``P*@!`<"H`0(!]`'T -M`.0&R4S:#AK@\MN!M'^!(A"AJ]@N("0(`````P```-PA``#`,K/3&G(1D%CI -M6XCW91JX$:9`AM:FE#'U0I1B7"RF\L=5/+MCTP[CO`.,J(>CK\_A=0[0TUCG -M6RS.[,N80RI\\7:C.S'S;EBOKQ!\[1I8W)](`P#,B'D"Q&[+[:;`TW,22;DH -M!G_D[&N,6KK>/BXX6JOS!$N!%5;P[@N'6HO)*S03,9`[3=IA=Z#R57)YGJJ" -M^<$LE1:R,2!6K)$W3,G;+CK)782MT;1H@,`/`$``#P!```"````10`! -M.%R9``!`$0``P*@!`<"H`0(!]`'T`20'"4S:#AK@\MN!M'^!(A"AJ]@N("0( -M````!````1PA``$`?0_KE,!F0VD.'W49BY+*E3H5CX@K+J__V%>(>U")IN^Z -M*TR\+!0[!*5(WQ=AZ51G]H=+V%LMZHT.?_$J-*C^G8U$H_`TK@3RUPX136Z%CE@@3@;5- -MVF=J?-<@@D-HEFERS>DD__CFX*8+WJ;X#'V6>D1C:',? -MFXX=WZ#8G2/FWSXAXZI.%")2#86W1$?0WE3R<9:/;,9YU1/EOQ$,", -M=WCR?50CP>$BP(`B?567!]S'SEL52%LFC!M4*1)PC!^:UFUW6E170Y^#O@/I -M!9,F=H>@__Z][>J+X,VJ^)";5Q@AH+"L=9K?F2R;>1;2E;X=CZ6`KG&_[K4Q -M-7IEQP;PB>%W(BZ?WH;FG%!R0O(O@EQS9:=-?IG"R$(`_L.Z!_+-;QHO29C% -MA=M.+;G1ZI%GI*GS:[WNZ]AP;ZF/)0*&=A*W1F*^`P#L````[`````(```!% -M``#H7)L``$`1``#`J`$!P*@!`@'T`?0`U`:Y3-H.&N#RVX&T?X$B$*&KV"X@ -M)"`````$````S"$``+!(%?+_2U<^[V%$@T*39;L82DM!/T*Y^\D8S$S!GC?` -M:O6@]9Z8G89S:F&K1*=&$*N437F8"*<46A5(1*5>9/K,^2HCD@53WJ#0"_K@ -M-&&N-8(W-8W13]BS*%I\E=FHU<@)+OC*>,;9E*F\PA7`_J(H(NGXXP&C56RV -MQ)HC=2;%S26EKHKO*QD*Q2+BL<%NGN[8(#9Y0HJA;"RRE(.#85%LC(XB?=M. -M#528?X`I=A*W1K+B`P#L````[`````(```!%``#H7)X``$`1``#`J`$!P*@! -M`@'T`?0`U`:Y3-H.&N#RVX&T?X$B$*&KV"X@)"`````%````S"$``+#;?13> -MKD6^W2+GF)!*2@4#1*\-'1R,",&8S!R*=DYI`LPRK=Q]5Q4:CJ!);ME45Q6S&+-+)DVWQP``UNVY -M*@)XO80+[PJGH4`#[B%SH@G!DV^ -MW(1=@T6)_B72JF6X0T=@"6[*9JH6.0GA%Q##PB8N$]Z]9MRTW;H^JUU#\Y!_ -M/QUB>L.1#Q*LD4$7["+.TV7$A5#Y;FM-A[+)F>V=W& -MEHG%D"",H4\E#AYE='%GCM3*O0;M/W_M8Z5]66I>:J-N((@5?`84Q5369WR` -M#,U*J`^I+J7FSJ#K;`'>QXMS8A9JP^$A1TP0%CF0NRBZ]5M_@/BCOW,$4Q>A -M`F)I>22R+U5_8`MUIK8]D]'=`KT?5#D>>1_63R[PJGPN2!(*KJ+?]K61C+W[ -M/*#Z1)UV$K=&TPL$`!P!```<`0```@```$4``1A"-SBED=UD\GMMYQ0=]`TWH^"IJPV,_P(0%KU7-BQ33,5"`QMA6>D1*)]WN -MQ#(L9U?*C5TCB^^!W@Z\+P3C?NM1X9432O.5W!<.4_.O_3*.Z`?P1F'0A7[> -M*$<)J!X5R$%;MV^[\AJ&1%T^9:OA[3=`%(E/M@'\'7X7D=P;-SL$]'ZT]EN8 -M\@6HGP41GY.VVO?4TQ%JES09JO&DO>\&E]XUZ*S-_AD_Z-5%-]%(J!4/G,<2E-HDTD6%-C;7_W=_Y& -M3"^L:V(,]=2;;"K^)E@D>4\=H&A+7>IJ&'WE@4TS*6H-,J+A3&/:QR3_5WQ1 -M!O_F,B.C[[6.>*RCV>PI@:C;D)](U0=6ZJ([V7PU@5&GWW'K@77775!7\!<, -M9%:X,GQNA7QQ5@&9+C]@\$IV$K=&64`$`.P```#L`````@```$4``.A:7?A[AX(;6.2KN2_W54E;1(A.,>0WJ507T1,E"&@9\70OD+V]T1I&>T -MS3VL6[QF9=_GOA#ED!`U3`&9SVTMT[P7\VDGK+W`(O79U-UE<#)`J;EQ4?T@ -M5^92YZZ^Q.F^XE'>%;V($XF+])S)9'T\!26C.G?^6Q+C5HT2<1LAC*J16*9V -M$K=&1&8$`(P!``",`0```@```$4``8A`=9HR%<1,"`Z:/T5&7"]YK,6"?_$6$76S.A< -M;$Y"A8J@,'E".JY&XU+8R^1AU,>6M&,PL]Q*A1./WJ7@A]BLI&1X!N.QM_#A -MURM5`Q@^F9A*.=R2EDJCL#-+&;LB`IYZ9``3(M(?U>>''F\D`+G[W<>G-.3' -M.$\S;QF\VY7@&?'])#"J]P].K*0)-$(\[)Z=F8XH&Z._V@9X"IY2SM')^R[* -M._QW@ -MMIHEU9C:CG<.*2(USA)@P\3_Z6K\E#+^7?!7)30O!HK5*%$O-7^Z&.YBDFJZ -MH3O.JDDST])3@4\Q_A[4#,U<6IK=,F,N.<''TN)8REK[GNKXL'EJ'?6H)=#Z -MPD/C[F<:QQ<[88`?8-L$_!^-SH<7,5!5_0^7IPW0`91+O`9)Y8>I?RR:PMC! -M)7EAWR612'0\&IHW\!>G`^D$7_N6&"NO$6U/LEQ5$-+K8&$P#DE)T7%LQC4_ -M%RV0TG5SD0Q@]2VJH/`"]L;-&<(\')Y='[KWOK5JKE,GVTD6*T%"M_;RID", -M+(.[+/XK^_P%*G82MT;4P@0`?````'P````"````10``>%RE``!`$0``P*@! -M`<"H`0(!]`'T`&0&262M,P$C#T,G\4YH?./)(,$N("4(`````````%PJ``!` -MJ-F-04]6>*T2C=@-RYL2'-$@]HSBAF78R2<7831E*`]97 -M$Z6X(W82MT;IW`0`;````&P````"````10``:%RG``!`$0``P*@!`<"H`0(! -M]`'T`%0&.62M,P$C#T,G\4YH?./)(,$N("4(`````0```$PJ```PJA+[)M@` -M_PZB,:F']\R[AB$1A'*KN.-:T$BD$'-E@;EOL?#N9_#,1)`KE0%V$K=&3>H$ -M`&P```!L`````@```$4``&A7PL^X;029SCHX^6C_Y2&F^\/!VQY6=A*W1H_G!0"8`0``F`$```(` -M``!%``&47*D``$`1``#`J`$!P*@!`@'T`?0!@`=EZ\;@\9-]I[8````````` -M`"$@(@@````````!>"(``'@`"0!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``Y0>NPNK@OQP1`^RQ,`PDBXT9CH(R?I!UE+!M^D!1(H+^\2FQJ2:, -M92<8WJ_3><5(`JQ%52L`]JW1D++,^4DZ["@\-Z+."$F1N2.+FH5>L1F -M\Z)#-IT#"@#):ZZ,^P5PB^^X5K+J6H"L`37M!.W(/*ZQXOV\OV:!D0H,_J(I -M```DNRMI^ -M1G82MT8%]P4`7````%P````"````10``6%RJ``!`$0``P*@!`<"H`0(!]`'T -M`$0&*>O&X/&3?:>V```````````I("(@`````````#P````@``!`!@````?, -M[.15P1ANF7A/U;M9N#W82MT;&!@8`N`$``+@!```"````10`!M%RK -M``!`$0``P*@!`<"H`0(!]`'T`:`'A>O&X/&3?:>V```````````I("((```` -M`````9@A```@``!`!@````?,[.15P1ANF7A/U;M9N#R(``'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``Y0>NPNK@OQP1`^RQ,`PD -MBXT9CH(R?I!UE+!M^D!1(H+^\2FQJ2:,92<8WJ_3><5(`JQ%52L`]JW1D++, -M^4DZ["@\-Z+."$F1N2.+FH5>L1F\Z)#-IT#"@#):ZZ,^P5PB^^X5K+J -M6H"L`37M!.W(/*ZQXOV\OV:!D0H,_J(I```DNRMI^1G82MT;J*@8`4`$``%`!```"```` -M10`!3%RL``!`$0``P*@!`<"H`0(!]`'T`3@''>O&X/&3?:>VM,2C<`7HBE0A -M("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,` -M``@#```"````"`0```(H``"(``(``$S-IW;:G`J6WTF0WG/=IZ74@FJM)F;D -M&DG\_]SOJ>0^%*HLR4REZLT\>/_+TV;)=KS\-(0/:>L5?O1"'.63XY/3'*<5:=DYV$K=&VU@&``P!```,`0```@```$4``0A2C_7B%$$YFJT+U%A"$R-A566S`LSL&L6>0+RIUZRFEGYUOG@'LP"PMIKS -MM+@M]+:>SG^Z5G53$=Q5GIZUX!G;ZQH!-;BBU];J.15*U;.\U>24Q;J@C.G82MT9M<08`O````+P` -M```"````10``N%RN``!`$0``P*@!`<"H`0(!]`'T`*0&B>O&X/&3?:>VM,2C -M<`7HBE0N(",@`````0```)PD``"`^X,]=MD5U(X41(+`4M%A6<%GZY"KML7< -M4!@98PMVPLE2(WB"OU[##!N;W*=9W6X`)\EC!]\(`D7N"_\X::HMA5.^I`+, -MZ0:O[^8^@<\"9:Q<@AP";D-7<(,W>:/##UP[R#O'4W82MT9'E08`'`$``!P!```"````10`!&%RO``!`$0``P*@! -M`<"H`0(!]`'T`00'Z>O&X/&3?:>VM,2C<`7HBE0N("0(`````@```/PA``#@ -M-@^A<)(^RESGL?W1,6?A4FZ`P20)6T'\!6RBU]A3+8),!MR4\KV$565/1#XM4B/-FB?W\(]NKS"T(&17*HO($Q^\_SQA: -MY%]63:VG,$A96.(@C>V?*4%4KZQ&@8567\7\3:,NK*K*0$M3SUSK)(`\'H6P -M7Q4AC`B"&*>PL,`$L&M.?.1B]*WS0;%#H4Z9\$5H4;/;#VQ+AKZ\6 -MMG&P7^"SL4@1RFZK[,H>4/;G_X&FF'!DV[5OE92C;]M',A(M`Y3F>W82MT9X -MH`8`_````/P````"````10``^%RP``!`$0``P*@!`<"H`0(!]`'T`.0&R>O& -MX/&3?:>VM,2C<`7HBE0N("0(`````P```-PA``#`PO2\0Q9PKX,"IQ#N=;W:T.E_X.RU6-66&"F$P:HX6*6R770/\)" -M>B\QSO-F["+4Y&G5Y1.&@3Y=VE^&!+D/>7RAEV$K=&9JL& -M`&P```!L`````@```$4``&AN>J]"M^NG9$J* -M6F[6!&:V!P?+LL+J(TL0#F#NK#[,QQK%[&X0=A*W1D?'!@!L````;`````(` -M``!%``!H7+(``$`1``#`J`$!P*@!`@'T`?0`5`8YZ\;@\9-]I[:TQ*-P!>B* -M5"X@)"`````#````3"D``#"$'S)ELN9!;GFA\']YL9)B^?<+VH/X0T3^(^U* -MCW9Y*H&#F[]9+4_YK0P%W782MT8[X@8`/`$``#P!```"````10`!.%RT``!` -M$0``P*@!`<"H`0(!]`'T`20'">O&X/&3?:>VM,2C<`7HBE0N("0(````!``` -M`1PA``$`DZLB3R@@"KD=\^'*!5MI4$BN#[0?4'!UB\SB>\*-0L3<]`XG3#-C -M]E_B7KTV0A<%B_>C[!)(L_Q*AJ5U+[0KC"+'8?JG[!OU]>6Z]^['0$R!D2SC -M]4`)J.W;FZ2+#^1AK2>/J[<:!"K7N?';2P8.B^P&?1.$,T96+>QCP!2_.U$? -MB,3C*3L"OX]X.:#F&`Z^!VIV.D?['.:/1HKZH2*6@24DOI"9[E4R@7_-ON3K -M?SE^?K9<5]6EA5B=SV!\*"P!*B#G8"A9>/+F)N^)$%B9SQ#7&9"!MQ1FQD46 -M,9:)$S0+$4D(G89'7IPS)_0<1$_M@`PCB*5"X@)`@````%````_"$``.!VLQ.>_DY)\3XL=[2H'FI6P"*RFF*O -M=P2>+9''B^AU_=K_]`=%>9(=QIU;^D!8Q-]LC/2@]L -MC/&@HU2[U=!>;+TG%0I?@$^I!T2C>KL?G*U1YH"1OZ -M;^%D*;*+._23FF61&45B*5"X@)"`````$ -M````S"$``+`64;/K/]\^_@J>HJL775Y/(9W:$0W&K;10D)\X("H1P>NQ7.FB -M1D2IFBPZP_5BA2--KG72G=4N&W0:^7!6??AE&><+^9.+ -M5MJ'VTR5'*4.[0*F]6WF[V&6@7IW6@E=&^@Z&=R5@O%? -M=A*W1GB*5"X@)"`````%````S"$``+#,!Y*)^HX9*X)D -M[Q9@4H1FN1:I!V[X+]X2?3)PBGM5*0SE!AP^TF^G>IR6IWX++9:/)@[+CC/- -MFX&QL\^H]SIEEC4C#OA2PN7JO<QB4#O]40(\KCE]]X'GG?%N&F/=_ -M67F*W%!"6'#`;=M0&N3XS+A4_3[(<.DGR2D/C<4OD-?'7136S^*SN4>R$A25 -M&4B* -M5"X@)`@````&```!'"$``0`4\QM"?=_=5">6]&:\8KJ4H=I>L7`1L8O=WVYE -MCN:!&P:>HGK3QJ,$#SD3*.70W&J34XPERCN^G$E5"7&.I6]=:@OU[ZH]<^1? -M,W^J77NNF%>-V@0L\N,DCR072A)#8"G4EST"?$)2R;-C7?*CDNC:FGWYK8(- -M:%5E9AG;>_1\7%MZ>[M74@%1X/N=F:M=-3;#HC\>1RKY@75IW"#:.$4`5D8I -MTN;"TE19]]7^A4]QUF4XA/&6UW%KS!YS]2$GF6!_/P)XNK,6OZTZ`)':OP6& -M^EO712L?SF`]E-]#2:W554/$K;$\`E,[QAV -M$K=&T%H'`.P```#L`````@```$4``.ACQ(91^7N:L_O,L?PAEF(-[YRH8? -MJJT7)OD?=>ENM(>:'G>.^,+/(F&^+$NZQU-#2!*#,T1CEO>1LVM@DO -M`:C>CU=L=+433=8CR0/-50#)%T(-$[C.%81V$K=&*5L'`!P!```<`0```@`` -M`$4``1AM8WA)\V.#KL$OCU%$6_(H8_1E1O]J@NM.I,A -M4I&"IFYNNWP`;(T^X51!PU>8@/>F\M[W;VZ>RB&@-Z'3X&WO=V$K=&@GX'`.P```#L`````@```$4``.ATDIQV)"L4N1"N9^I^?DIGJ65X"?:LZ4TD\^?+.D7](O7F2V -M]#7'<[H\@JZ_16$R&>-9F,8,,B4H6M[8THI':M'G_-VW:(F;:1+F(9M9%'%/":EHE+.(;)J@\/'W<07,!:JM(OQD\/,LA>.[R3LE,N,\Q8P8^+( -M-NR[2B7@^#V[+SV4SH@XGAA?J*B@W/)[&1?Z_L_<"!UC^(73DTSIU0O?+4EV -M$8$@=-Q*^8M/0$M?ZX5_$JK1CZ3KL9*C(E(;`O&Q-\7<[)!'PNHS8CE -M98S>:XU)!9X*[L"(B4U%JN164@4;9E!TZ.[#)DI83/` -M19D^PVJ0>?O3FG%?OA*@H`*/UXM?G6W^:]-1.;^>==)G1TO8%+5!1.X$[4G> -MIH;U&GU',M3Y7P:P84_\%CJ*%N;TN)A`,=?%ZA/.&E6];HA.'L-@TE`_%[>-._@9!"9A,(\ZR -M=A*W1M_9!P!<`0``7`$```(```!%``%87+X``$`1``#`J`$!P*@!`@'T`?0! -M1`B*5"X@)"`````(```!/"$``2!SZZV-G5/``CX& -M9%\["^U-X]_BVZ'D;XJ5[9E)N%KD(S+V7]>4[I]U99$P&*F.*EN1DJYDYNE" -M]UCW`'6X<5K=*5+CQCXN/N\M*?W?PE3V^W=V2P6SI'?O44U\M_$3@\?QA^]* -M@WM%5BBW.?/*_V#QI73Y-VBZCUNCLT(4"'\,S%4:YQ?V0N/K^A5 -M<3%6^_P"%&>W$2J-)]LX]!<7RTX@_%??-KP,HG8Q+5%T6;LU;A$_<#P=;L\K'E6A+D5T6>PFEU/*3/O>'!D)H-] -M828:'@L*@R75*104SS17.^!"#SHS6@Y`7[L%?BR2)LD\@#W66="NX4/WH`R7 -MWE08K'82MT;1``@`?````'P````"````10``>%R_``!`$0``P*@!`<"H`0(! -M]`'T`&0&27GPSTTP":S`P]4L`]=]R70N("4(`````````%PJ``!`Y"(+TM?Q -MB-Q8/:[\TSGTK48C++@9Y-45WE:'7N5\BGT"YTG*B$WG:GX&N?X'17MN?B'# -M*6]<_8?[98:H=A*W1G\,"`!L````;`````(```!%``!H7,```$`1``#`J`$! -MP*@!`@'T`?0`5`8Y>?#/33`)K,##U2P#UWW)="X@)2``````````3````#!` -M^2?=NDIQA(S#H"5:R1%ZVX>:V/@E=G3>89/#'<*M;K@V*>6"R`?*R\Q_XW82 -MMT90&P@`;````&P````"````10``:%S!``!`$0``P*@!`<"H`0(!]`'T`%0& -M.7GPSTTP":S`P]4L`]=]R70N("4(`````0```$PJ```PBUMAW9;M^/S:@?1) -MAY?*3!MD823R>HU@ZR2'5V$K=&CR@(`&P```!L -M`````@```$4``&A"(``'@`]P!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MOJ5_T4?/R%'2E.!)E'EI.P#G@/K<7#\7`JF87@QCY(".ED`D1.%'H#ROVJIR -M]3)@Q>,8[-*0;Q+XL&AR%$9?>SF;=)_R*\;Y?0G64%GULY]NI7E(/'./-3/R -M[]@0Y8DJ[PI@_^JO<1]@J-^ZJ_?N;D:"[1L`(PHBDGZSC1<-MD,I```D^L;' -M*\_TLP)"$X0C?@+I.9]'9(>?S1\5S%G17/JK$VTI```<``!`!*=W?WS%J/S/ -M/.TZ8H3X\W5]<$_8````'```0`5#/`Q[M>*J(.U&.+%)1QPL`G1.OW82MT8W -M,PD`7````%P````"````10``6%S&``!`$0``P*@!`<"H`0(!]`'T`$0&*86Y -MF*KQB^TO```````````I("(@`````````#P````@``!`!@````?8B'82MT;S0PD`N`$``+@!```"````10`!M%S'``!`$0`` -MP*@!`<"H`0(!]`'T`:`'A86YF*KQB^TO```````````I("((`````````9@A -M```@``!`!@````?8B"(``'@```!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``OJ5_T4?/R%'2E.!)E'EI.P#G@/K< -M7#\7`JF87@QCY(".ED`D1.%'H#ROVJIR]3)@Q>,8[-*0;Q+XL&AR%$9?>SF; -M=)_R*\;Y?0G64%GULY]NI7E(/'./-3/R[]@0Y8DJ[PI@_^JO<1]@J-^ZJ_?N -M;D:"[1L`(PHBDGZSC1<-MD,I```D^L;'*\_TLP)"$X0C?@+I.9]'9(>?S1\5 -MS%G17/JK$VTI```<``!`!*=W?WS%J/S//.TZ8H3X\W5]<$_8````'```0`5# -M/`Q[M>*J(.U&.+%)1QPL`G1.OW82MT:#:@D`4`$``%`!```"````10`!3%S) -M``!`$0``P*@!`<"H`0(!]`'T`3@''86YF*KQB^TO>-U1\H]?K\TA("(@```` -M`````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```" -M````"`0```(H``"(``(``-T(CJ5P'\CYXZ#\:)*U*"NEQ3XTKFT,/D#+68&]2_^DG -MA]\N5R"#?>T@4)^:=K`22ZH;2$_V;'LH)?GZ3@BA#LWWS=T -M23Q@2L[:ZJW,*0``)%!@-QLTJUHXDMP+IV+Y*Q9:)$418[YM$I;,!.FI*:$Z -M*0``'```0`2F%,MH9X@%NV[WT(QDO`J6"F``0````!P``$`%<1F%K_S&W@W/ -MW'U@U\4)0R1(W(/^J:"T=\.*>'Y75)(><5WK]-:5."4$M]9TN2?W -M9HJ]G\T]_YPEK01GO8H=4X8_/;@"<';Y,X'"E=S1"=$UIE$0C2P;Y,@3Y$*V -M(;N/XRW242N?;^HF$%ZFXN/4[Y5X#]<+2=H<=L;P0(SZC`/`P_Z,O3`4/OG? -M^L[LC,>29BRQ+V,F=&?!J2'@JA?W]>`+;G82MT8+L0D`O````+P````"```` -M10``N%S+``!`$0``P*@!`<"H`0(!]`'T`*0&B86YF*KQB^TO>-U1\H]?K\TN -M(",@`````0```)PD``"`*;XB`%"&RKKU1,3_$3:R;K2!?/DU-62K%1HH2S+1 -MLI9)1:6_;+/MEX[SV)9MF"]_&8O0G+C@T7A%8-U1\H]?K\TN("0(`````@```/PA``#@S]>ZI"GT -M?ZAO!3Q?`DZ8[)+UAMK)'5E-WI5_`Q'DIKX:"_E(KD^>HB5.YI67@AI[2301 -M0?9&H>5/ZQ1F4&O0K(,;=>)I&$C&,'S#(3[K$S2?#H782MT8$WPD`_``` -M`/P````"````10``^%S-``!`$0``P*@!`<"H`0(!]`'T`.0&R86YF*KQB^TO -M>-U1\H]?K\TN("0(`````P```-PA``#`$RH^@@/Y0+U5>]/Y`^=BW0C)DUIQ -MW(J*K'6:9I2(E4P>.XKSW!K?%@(&YJ\Z^Y1983],\%N -M!AJ)YNV'V)TGVOQ\J??R\R;J(@VX+R'L6I2G<4>H?,]>RFHM;`-?MOQ[WBGW -M2E8V68D64?QO%X>][^B7COG-T>7Z4)`&P```!L -M`````@```$4``&A8*(H=3023_TOJ2=+OF`I#-=A*W1@$""@!L````;`````(```!%``!H -M7,\``$`1``#`J`$!P*@!`@'T`?0`5`8YA;F8JO&+[2]XW5'RCU^OS2X@)"`` -M```#````3"D``#!U9DJTB[0F]8N'L0./_OQKIZ'"@*F8`6`C')F$*DRJ6?=] -M\4T^)&BN=G*W,G82MT8Y'0H`/`$``#P!```"````10`!.%S0``!`$0``P*@! -M`<"H`0(!]`'T`20'"86YF*KQB^TO>-U1\H]?K\TN("0(````!````1PA``$` -MR:6&+?X8'+K/HCHZOX*R=52TS^,0VAQHK=);[)4DG5?VOU+NOI-7&<*)CH-- -MLRS)9LZ:%'1KB_0`@/9U>M/.]U#*G26G2%4QRA8D-RP(<4).\*K`[Y7&[G]$ -MO<&J)&H0Q"@CK)=^@]VLZCI7_1@+>[[\?GN^#CU:A6G^G&#,BVG>)"1FZ]XV"[*F.O-)LM+64^21UNX7@H\M#=I -MB+Y`:,J5?'!U^YT_%.YE0Y24PE"R_.$TQLF7*JST_:483@40R#O2:7*`B#0* -M'(41AZ$GQ"FN8/Y'SENU785M%TKKHS\\?]-P=A*W1OTH"@`<`0``'`$```(` -M``!%``$87-$``$`1``#`J`$!P*@!`@'T`?0!!`?IA;F8JO&+[2]XW5'RCU^O -MS2X@)`@````%````_"$``.!BXO1L1:U8_RMC-W'\O^`8O0C`\]V`0.H69ZL6 -M8$\5;$[\%R8RUC\-IX`@([0_5VWSO!Q_&B-E/J\I:[ -MR?W]K^$5S#DV(E3C[H%D8WV;OQ)*VN)H<+O3QG#L`+/,C<+.RP.6X+#XGFZK -M/?<(0TY^MYQ?;_6M[M`3N+0H%6R\1,II2Q/VI.02,&QXN'/2#7O.M492L-/2 -M4B(C18*OKKE8=A*W1F$Y"@#L````[`````(```!%``#H7-(``$`1``#` -MJ`$!P*@!`@'T`?0`U`:YA;F8JO&+[2]XW5'RCU^OS2X@)"`````$````S"$` -M`+#J].>EN0$54@5P?*M,,P&,VD%#ZB`YV#][S/=;5(;?$)M)PC;-D9L*1)B! -M%].X"M6EIB&(Q.L%[Y`U@-G2X/)R%N]GS?$U\C69@"?OF#<:M7+K -M4\7R4,)CS/L]-.FDZF9%9RIE^&+941>``N%=B!8O.J'^@`,L/'9_=A*W1G)= -M"@#L````[`````(```!%``#H7-4``$`1``#`J`$!P*@!`@'T`?0`U`:YA;F8 -MJO&+[2]XW5'RCU^OS2X@)"`````%````S"$``+`%JWWS=-&QMJ?B)_69%1'$5[V)7<)@2M -M.U>7]"+%RC=MWPPL9H(B7<0$`8$JB*C\^H*+D*J"T%AC3_?`KH#D;7:.` -MG!ZY1L8`=T9NW"MO\UNKI24?&&ML=A*W1H1["@`\`0``/`$```(```!%``$X -M7-8``$`1``#`J`$!P*@!`@'T`?0!)`<)A;F8JO&+[2]XW5'RCU^OS2X@)`@` -M```&```!'"$``0!L+QXQ'$0LE05AK*L(77`8*F/=*5U[6_16ZV'!^?BH%-"8N8_0 -MX_I3[I._MW/PD;6]>WEZA8#+O2ZS8QKO;CIE0B9/Z[,NO5(3Y!KG[:0G+M'X -MT=8GM"AB6NO!0QN1;5>7#!S?* -M5[KN_FTB\E3_UE5!067.C_OQJC("+JN/JY.O&[&QGO4E;7^5H!AV$K=&KH<* -M`!P!```<`0```@```$4``1A_WU6H6(MG\,=81KL+3D-" -M=;GWZ9S@K#2.@N/%,U*I+*D55%H'!P_+GVB:1DJOG=)P90UP_:/]V#R$UWFS -MSA-]?U$D*I>)E^QK$!0CE0O=*>-+.8LHB!X -M;4&0IY8[<]2&&JSG9%XN\AU%Y]BHN]R4W=WT.] -M6:-T#,L:G7D8+DJ$FZ>.BH>'RHH:#?-Z]\;9]&;&5N95;+M/")!3)[BR)9>A -M36EXW`K),1$8/8MT[VB7:_RE?QCK6*^?4+R;1[,U3;W>V#'09):CCJ>CZ'5* -M2%W5A3_EL!SV9A0FEGU+K9X/1IBK)S2#A0%K3%F[:'AD:I31/X]'LHCU.KFE -MUQ$.#4)V$K=&[;D*`.P```#L`````@```$4``.AD44=42W;57]C>49W99R+Z[%Y;7*S`-0O\7I^D>NT!V$K=&Y>`*`(P!``", -M`0```@```$4``8A2[O(E;P0`U*VQ?-,_>@0)@9ITG%[(.F_ -MR9O&T==VG))R(5?,J#I"S(;S"Z&D[OV[8*=TE67B,2..G9'(?U\SHL(!^6`4 -M3H.XK.;)RHHRJUS?XM>9"&V+UX(:(AWF.(P4"81>F7U=CZL!L_/VUGVC&D=: -MT5-42/F>$'W:)4?@&?VH?8O6DN;F[::(AJAZL`*=-^06E#8!<,9)0I/9P!). -MX<10H,FC;L5R8.%,.&X*SC3L(]R]__7>I\H^7V"FO,PN?H1>).5[;%HY<,>D -M$ZU1N476G7JQ1L\SMJ'16]J]-]63RP2AUB_D]N0^*^Q4]3U9'J_I.-Z@A_?7 -MXIVH/R-!J[NJ"S/:!K<-%"M]K64],/AN\J=4*RK]SA1JJ022@B"?=A*W1G`6 -M"P!<`0``7`$```(```!%``%87-P``$`1``#`J`$!P*@!`@'T`?0!1`Z44.[30;,$\WE*,K(#&ZB9Y?$?[R4-Z/'RL::6KQ,X]Q:=U'\U -M)YH2'$Z+_;!\YI/VVB.%=8S9!_Z9LW`++#[Q?^,1VRT1%/TYDP2IIYQM7%EU -M[*,D%:I@J]G'/J_*!%`B'.PWUS1:1,O*HD4ZZ-6DI>>#TJ[&OHRT -MO;+.-(K*\03N@CLC6SVPDMLS?"OG`42DJ"R!5+&.=:1RN;S64*/F?USR$CG\ -M)Y0ZRZ1&!>03'D3"`Z]V[-,82`!=J^L7D@PH7#)F>-Q&Q`AH"7JU[[L*G8W7 -MW[*O[B#OL0UXEHCR0C"[EH$#L222-$N>;U$RNU%)E@Q^$K"XW>[.PO]D)782 -MMT8V/@L`?````'P````"````10``>%S=``!`$0``P*@!`<"H`0(!]`'T`&0& -M26G;1+=L]E@A#)'VVF2M9K@N("4(`````````%PJ``!`G*:%*V*9/641/34Q -MN#-R^X$CCP#Y<3[OM3J/$FH%2TB/+?!FIY^@(.8JI1@\`').8)@P:^4"9>^S -M)E.[=A*W1M))"P!L````;`````(```!%``!H7-X``$`1``#`J`$!P*@!`@'T -M`?0`5`8Y:=M$MVSV6"$,D?;:9*UFN"X@)2``````````3````#"6@+EW+,28 -MF,;ET;^E_MOU>,F,N-%.[(26>8'0I8X$\T)OEQ@>A/E?66*-V'82MT8^60L` -M;````&P````"````10``:%S?``!`$0``P*@!`<"H`0(!]`'T`%0&.6G;1+=L -M]E@A#)'VVF2M9K@N("4(`````0```$PJ```PQL`'>[N&21114.'F6(E)P6X+ -M<,JA`DS^%[D[8I#YNDH1.+KJW:X8]-'H/&1V$K=&EV8+`&P```!L`````@`` -M`$4``&A.$=A*W1A%C#`"8`0``F`$```(```!%``&47.,``$`1 -M``#`J`$!P*@!`@'T`?0!@`=E\BUZ=L4A;B4``````````"$@(@@````````! -M>"(``'@`^`!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``G3ZS5?P[ -M'MV\P_@^<\L.GHDVQ^`8$>R;GAQSKOI7,5@F-ZN^DT>".+',4Q?)6(AT5 -MOJOQ[(UF>9?YI?/>T4W]#'3:,VP1:)/M!NL1DP6'==0I```D7Q=3A^I#N#52 -MKA'C=M9'G'".;5618H0*BLJ>;3@V1I0I```<``!`!$LE24;!&T%#````'```0`7VTOGF!5>C[6TH*X/M:H[HK6(-S'82MT8(<@P`7``` -M`%P````"````10``6%SD``!`$0``P*@!`<"H`0(!]`'T`$0&*?(M>G;%(6XE -M```````````I("(@`````````#P````@``!`!@````>L=_@0,JL]E\,4(]++ -MZVMLX7XDX'82MT8B@@P`N`$``+@!```"````10`!M%SE``!`$0``P*@!`<"H -M`0(!]`'T`:`'A?(M>G;%(6XE```````````I("((`````````9@A```@``!` -M!@````>L=_@0,JL]E\,4(]++ZVMLX7XDX"(``'@```!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``G3ZS5?P['MV\P_@^<\L.GHDVQ^`8$>R;G -MAQSKOI7,5@F-ZN^DT>".+',4Q?)6(AT5OJOQ[(UF>9?YI?/>T4W]#'3:,VP1 -M:)/M!NL1DP6'==0I```D7Q=3A^I#N#52KA'C=M9'G'".;5618H0*BLJ>;3@V -M1I0I```<``!`!$LE24;!&T%#````'```0`7VTOGF!5>C -M[6TH*X/M:H[HK6(-S'82MT9"I@P`4`$``%`!```"````10`!3%SF``!`$0`` -MP*@!`<"H`0(!]`'T`3@''?(M>G;%(6XE4YKR#=O,4R8A("(@`````````3`B -M```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0` -M``(H``"(``(``%=K'D83[2/.JA#7D<%J5^8+&X_.9F2MFCTRJA!IH;A%;++3 -M`8A%-@&?YK%32Q#>2AEHL3?0]'6@WA%9T@1$3`'MF%(-%OT.)5MS.P95U&18 -MOXP\`B,DJ[;`'364SMBS17I8/5;GL[+Q;[#`RE.68Q:4+ZGKA>^6L?'^IJ8Y -M.G-C*0``)(>87B[RT2=:#%GAU#@X/F]K)]]DHPD"I7$<@8Y<4O -M]M4&CYO0M!2$6B!$)KN.P6*J<6GGHV7.NKA">+E7YTY;^%CZV;'_Y\2X1W*] -MF*$C(`%L;/5L!7*=Y;XI;@3\(N+4>(O5CQV\@IN9?$31SN+FJ!:VF!X4%T3T -M])W9HG6/KVQ5`S(:C\U?DW2B+YJS"T5$P\$M5JJ_P2F&/&A;[5T$2B&+9 -M5!Z.USJO2$&VGR9$)_T,<<:K^782MT87[PP`O````+P````"````10``N%SI -M``!`$0``P*@!`<"H`0(!]`'T`*0&B?(M>G;%(6XE4YKR#=O,4R8N(",@```` -M`0```)PD``"`A4GOZ/F#41ULVBQ\%'!<\HUVT);/VVG'BH]`FHNRT8"JY[6H -MF_\Z6^D_'7[$8$`7GRUM*5:@\;2JY<.%O*>4>22\73D7\L7E15*OR#C1&+_E*(?EFA#]-!']E782 -MMT9L#@T`'`$``!P!```"````10`!&%SJ``!`$0``P*@!`<"H`0(!]`'T`00' -MZ?(M>G;%(6XE4YKR#=O,4R8N("0(`````@```/PA``#@R^U;SHZL*T;T;+AI^B-FN""TFFK:!XR]Y_T4@UM^&(K -M('9V1?`Y[E$IGG@(0Z426/KUOQ7F,OZ-33S#`#`I8JD$*7*=4!+Y/W%*G=@6 -ML-"F)5=$6CY[^]=:%P]:809_REG;%(6XE4YKR#=O, -M4R8N("0(`````P```-PA``#`6Y6[&O^2$"F:[70LE'LICBK+@<68W/SMWTFP -M?DZJ,'\)LST6`8)W3J=;^0#E)Z3R$%CSBZ/%W:FJ'.'@:BPE3GD=36)%K^2I -M"`5QN90ZGRDHI-"&!X@[(22#1NU#VON1=Z]V)-6<(M,?0T"+1\G^N]O4IK#- -MV17@/K7Y<^"'9/_3=D%'D00CS;,YXJ(^;620P(U3XF -M=KZ:#'^AZLDLH966`/7Y=A*W1E=`#0!L````;`````(```!%``!H7.T``$`1 -M``#`J`$!P*@!`@'T`?0`5`8Y\BUZ=L4A;B53FO(-V\Q3)BX@)"`````#```` -M3"D``#"[?<]M>[>?)]]:=9+MF'K,;E[IW9JV_[2\OXYNJ5[HJ'I<3"$P)G#: -MX[D25'82MT846PT`/`$``#P!```"````10`!.%SN``!`$0``P*@!`<"H`0(! -M]`'T`20'"?(M>G;%(6XE4YKR#=O,4R8N("0(````!````1PA``$`1=+GQ&,= -MLI)DFL6?#&QPR9N1TUS3_[L2O0X=E2:\KRR,W9HVN7 -M(^]//CBBI'T<-1@:?+'@:7A3>8;P^_/.X;[\0` -MV(NO#%C*5Z;%AE60PYX30I6[7D8>YE`R\Z/94:7R@GAM1Y'@IL2C)?F-!'@F -M&UV`I%^=H2_F0K -M;=4_?P0]F]2+LA?@@$,'O-E>+I.D"_.>S%6?::>>%3FB!@.Y?4H7^KZ"3.JI -MJDB0_1C7['MA$?+,XV"`%#3X+H\:F,ZM&HYV/HM)2%@4%_&:;F3F6Y3@QB*D -MA[_4R=+,GDTB+JRR\>C0A$&8(%XR5+8R9.'WZKI4O2OZ80D630J@8V&'-9Z4 -MA+Q9`56%V$GQ_M"E"NR^7)\ZF!'HF@!N-_XS3^*%BG[DH]48 -M0TZ0-3!",F*ZYM3@/I>CM0SG^J[[TJ"*G^BE#M2L==>HF4M88RVEI/=J%-J5 -MESE$T,51`5D9D2/U?&EM[/,J,Q)#&'C7-3KOQ6!0;63P=A*W1@N:#0#L```` -M[`````(```!%``#H7/$``$`1``#`J`$!P*@!`@'T`?0`U`:Y\BUZ=L4A;B53 -MFO(-V\Q3)BX@)"`````%````S"$``+`^S/7W"91='=#^&9/;0B[8F0Z&*EO@ -MS,:#*/BM\7T$X#^<603,=,_,$=8]%+XU!2[*:X.Y@[3-0A![\WZ59/@I,^@" -M7*\>W);!;9\2TYZ/&*NGVQ.6*W1GSKCY=?0TUGJ'CZ00I5$G(R+C.TFN5A9E -M5=B#GB?=FFWO+H9SJ75,K-Q%\ANEJ=HK>V"^X?G@0/8>ERF@6L/_$5;UD_F%54+2=\N8P/`CK)H>CV$^>FN)SEI:HHEUJJQ2/S^[VNT,BF -MD:,`YX_*(2GLJ`0?"=3Y*=_->C&Y/8429U$:GVCKDF(*O!;8!*D$N3\W59`' -M?52!?UE35NI,0QC?(WY20/.?1K\71TQB`3'7&MT,D:()/FYP7=)ZN*5>*^.X -M``O%4U\'":H&1>RE?7@@B"ZWGY:PT12)(!)A*H'3EPO'4$_?K:<;[;H#"@#J -M=,N06?Y(L?"$\.4:;_9CL8GE/R8HW('R-+.$1>TJ4'UR/(9L^V%](<-,#U@% -ML8@)[V+`C#>J7+$?++:5)S('()E79"6$F%84M;6P95-V$K=&>\,-`!P!```< -M`0```@```$4``1A<\P``0!$``,"H`0'`J`$"`?0!]`$$!^GR+7IVQ2%N)5.: -M\@W;S%,F+B`D"`````<```#\(0``X%J"(D>R_WFI?YIRYVCA/&/KJ'$_KO>& -MW)`$(%FY>(3QX]_,)<9$W+^@64A0.UQ$SNK=5;+8#LM(D4DC+8>#XC8[Y+@S -M:H7*#.5'JA^9QZO6N@0YAP[P[F0B,I)I0.*D1[561&7"=*$`"0/+L[38`@H' -MD8#N#J2QP*QP'6BX>5!NW0![*Z9V""DRHS'%<,_WW]H$J(6V?BJ)S_C-7N?: -M;BYN-850IR:T(Q!_E!"O,M0)6I3;\",[?XWM-JC@-FG'F$3E[\];7G?8V/>/ -M@:18?:YPD'R*6(R]D[IEAWYV$K=&WM(-`.P```#L`````@```$4``.A<]``` -M0!$``,"H`0'`J`$"`?0!]`#4!KGR+7IVQ2%N)5.:\@W;S%,F+B`D(`````8` -M``#,(0``L`#[_`VYXXDH%*#..2;+*Z]7K\U=2UNSC//^-HNJ;?5QL$3;8C8M -M"T%-AU<^4G5D_N5#<=$=71CU@J)X0`P(6RMGUY^1NG?#F]6VS^$=])A.A\_= -MWX-1Z?ES1E3S:Y-!L2T'FU(QU![6U[>7X!4"2.F+7G5!$PMD[4+O#.!]_?RK -MY!W"N'O9:+#1V\QJ!P&MUV -M$K=&Z/0-`.P```#L`````@```$4``.A<]0``0!$``,"H`0'`J`$"`?0!]`#4 -M!KGR+7IVQ2%N)5.:\@W;S%,F+B`D(`````<```#,(0``L-8>&OUTD01,YDEP -M<:_)';^OYADY6Q>@CZD=5EO^"A5I]*PWT7NM.FO`G'9U+-_L)FON>C(AZ^VG -M7;)UP&6^5621V8OGG()Z=/GI`37==%J/VNOW(6/N!,,73<"):3'0OOLA^4,\;Z;>0(J3>5;+O"W -MJMO.!>3J)OQF>I\Y5JKAV$K=&IQL.`(P!``",`0```@`` -M`$4``8A<]@``0!$``,"H`0'`J`$"`?0!]`%T!UGR+7IVQ2%N)5.:\@W;S%,F -M+B`D"`````@```%L(0`!4.A1-W13(5GTV[O3'Z1^@;9*#BZB[7Z4-_+`2@8C -MNVS\+R^Z@R"$,FT_T/EGFFQ""@BER5&JP@,N7W=AUMZ^+UL2`$2HBP4K/T!SMG'2K&;>*N`E54=PTY0N994*(ZQ.; -M.)*M$/#JY4>AD1H#.M//M\8??M`&#=$B_Z&14J'W]'$[CW2GK$BL0\'"%/'& -M?.+JFQ.0A0=0.?7QP3J2M_Y7WO@EH/9X[+VDII]R:Z=!)]/HU9HXL30RM&[, -M&J$`H>_ET5(,*[;]I5P(52OXD1U?8[BQ=OFP`N:5C,C%<6%ET/8'@6>?\0N< -M;:S#GL:`=.M9-.,V\R^N$'0IIU@Q\W0GPS]Q*MDA$!K\QH9L\VDM5%JF]H7: -MT82CTI"@V$&S-T0"A1"@%*_1+!//*ELRZG)YL(7EHTW,=A*W1DM1#@!<`0`` -M7`$```(```!%``%87/<``$`1``#`J`$!P*@!`@'T`?0!1`X"X]8V -MVBBH1G-HF@\X&04R]M,2G$V.;/LH;>5M85>#<4MR[]VKE+[-W,)*8%=//_K[J]R&W4Y;6YQRN]ERNU8PP2GCYSI_/2GXJ -M:.4'G4R@V%31=]HJH,L[JWGBF2/-7+1^5G*9U6A&$TTDM^K+BU)1?N;BM;_C -MA^A<;O)L>XJME*AER%%SX``!`$0``P*@!`<"H`0(!]`'T`&0&2?F%'BB6 -MA?-H%M=N2"$&C(\N("4(`````````%PJ``!`EE*3A#V(<:J+]>R"5;KXK4DZ -MIQ_2'^T,Y!.KI>@"7\&QKRH,6)\-1X1-)QK$DUT-K>SP!"M!FSM?8HR>=A*W -M1LJ)#@!L````;`````(```!%``!H7/D``$`1``#`J`$!P*@!`@'T`?0`5`8Y -M^84>*):%\V@6UVY((0:,CRX@)2``````````3````#"'^ZT*K)VS$:GL:V1` -MCBIN7<&H-=W^F\J300,/ZB5>L-L.+C]@3<+US2?R_G82MT:-F`X`;````&P` -M```"````10``:%SZ``!`$0``P*@!`<"H`0(!]`'T`%0&.?F%'BB6A?-H%M=N -M2"$&C(\N("4(`````0```$PJ```PO*QG=&/R*HD][=SFTE7I`##/^>,78XJ^ -M.._EK(;OT6'^-G;?U_QKN%3`WZEV$K=&-Z8.`&P```!L`````@```$4``&A< -M^P``0!$``,"H`0'`J`$"`?0!]`!4!CGYA1XHEH7S:!;7;D@A!HR/+B`E(``` -M``$```!,````,(B@[OSW#2R\9&J7'@>"(``'@` -M^0!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``*9+[T>>[X[YN]@C/ -M)1/)\S"K%!0K!^+*]*;# -M3BTW!"5W]A\_WWM>)K2`"G3ZIESW>XN>O@A])$C[XIN37]T@-^^Y\:84CQXT -M;'963R)V.D9HY.A4`HD?1>I(=#NB\GC\$<@I```D67FEVB6.]R)&#+'=_7+9 -MA%77MA4$`2]*Y[$$M..-1TLI```<``!`!/_=NL`(3NE=14\\&T*ZQ.6GT\.Z -M````'```0`5[&3'WG''G<2MT9-;P``7````%P````" -M````10``6%S]``!`$0``P*@!`<"H`0(!]`'T`$0&*01Y"_49@LE[```````` -M```I("(@`````````#P````@``!`!@````<#,.(A_,29A':AUQ6>F&F"+-_R -M;'<2MT;7?@``N`$``+@!```"````10`!M%S^``!`$0``P*@!`<"H`0(!]`'T -M`:`'A01Y"_49@LE[```````````I("((`````````9@A```@``!`!@````<# -M,.(A_,29A':AUQ6>F&F"+-_R;"(``'@```!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``*9+[T>>[X[YN]@C/)1/)\S"K%!0K!^+*]*;#3BTW!"5W]A\_WWM>)K2`"G3ZIESW -M>XN>O@A])$C[XIN37]T@-^^Y\:84CQXT;'963R)V.D9HY.A4`HD?1>I(=#NB -M\GC\$<@I```D67FEVB6.]R)&#+'=_7+9A%77MA4$`2]*Y[$$M..-1TLI```< -M``!`!/_=NL`(3NE=14\\&T*ZQ.6GT\.Z````'```0`5[&3'WG''G<2MT;$HP``4`$``%`!```"````10`!3%T!``!`$0``P*@!`<"H -M`0(!]`'T`3@''01Y"_49@LE[+/KZ3]37H!@A("(@`````````3`B```P```` -M+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"( -M``(``&[L8YA[7:+GC^OPB"@00*(R\+W\?V?(A3OEB%!!/5KACO -M01#Y.Y854"9%,VC/LF=?CT-A@6+0#-A,$>;9"T;%T/_E*0`` -M)(>^K/:C0$VT9IY"\S9L32?CTS"D2(M/^K=W?WF!Z'%:*0``'```0`3;LR9^ -ME>-\+I@BAJ,DF&S[-_E4[@```!P``$`%WX!9Y.$X/GHH1/!M93(-R3N*3KMW -M$K=&:=$```P!```,`0```@```$4``0A=`@``0!$``,"H`0'`J`$"`?0!]`#T -M!]D$>0OU&8+)>RSZ^D_4UZ`8+B`C"`````$```#L(P``T)W8SS@\(2#ZH^D0 -MQ@6B[\G=S+!W88*MP5%W!W)OUP2HL5'Y?MTD^#84G3ZN%H#E5`%F+5/G%\A% -M2%[)T'L61AKG#"R%V5N1$V&Y)B)%P\@YIQ5=.MMVA8./C`;D"53DC1ECG22E -M,Q<]P2\?TLS'>:R)GZ^MIJ-.MT((HA8ET@/C,F5"KC1"#''/L(T31F?3935I -MBXI_"V4L-(-TX]O(JNWW]US4?@$76/W>;.A+-9`M7GZX<8F"SE^0)67GWMMY$'^=Q-37AXV-30-BHX_I.!TR&0$E(;-@ -M':)K$['G@S)G4LNK'JRW:EQS1M8@D*:#6PT/+C(KYGE^!I%4Z/2F!^D3Z0`^ -MLY:-/<*]^L`=>G#DJQCAU5D6$$(B^R&'.O(-5@'#I?NHW.N4G'<2MT90"@$` -M'`$``!P!```"````10`!&%T$``!`$0``P*@!`<"H`0(!]`'T`00'Z01Y"_49 -M@LE[+/KZ3]37H!@N("0(`````@```/PA``#@?0$O]LVF\>$$B5&\'\<]^SPK -M@@5;=%N=/NK9"+B9NTA]:4OUN50'>3YR[<)_L7NF)_E_CS36CG:OX;Q!SP\N -MU<''VM%O`#38C*KYP.H)B=1H0":&$23G_PG7"*4?2H9]T`")])VE#N!X-[_( -M(SF=@5)&_F'1>^TDG<$`#Z?^KU^>]SN, -M?>XJP&CXXX2QGA[YQA)]-3FGB17YY7<2MT84%@$`_````/P````"````10`` -M^%T%``!`$0``P*@!`<"H`0(!]`'T`.0&R01Y"_49@LE[+/KZ3]37H!@N("0( -M`````P```-PA``#`U=S!J^FPK>2"KZ`NBK^&[.E1^='+@QKCA5<@W@>H6CY. -MB55OTB-%WF=H8_8"XDJ-T1_9OH&'9(/:Y53$JF311M+`CQYS&T`&@#C_6GEX -M-"LM=+>,,-00WAGEP1\T\>10YF]A&F<1+\MMM)&;CV)4G4QJL)K>N,TF>0X/ -MKA$):V(X)$L:%(@>-_@;Z_F%$+:8=A%D=;-?;,40MCG\Q'A(^E6-6B!4CX5K -MM0,C+SW=(/-\6HI:G.@5LQ4%KO]W$K=&/2$!`&P```!L`````@```$4``&A= -M!@``0!$``,"H`0'`J`$"`?0!]`!4!CD$>0OU&8+)>RSZ^D_4UZ`8+B`D(``` -M``(```!,*0``,/H-CQ7$4JR+(5UP2B_M1[X6I1)+I78")VJ;:A`)1KDT>@KL -MC!"MQJ#F]^QH=Q*W1IX\`0!L````;`````(```!%``!H70<``$`1``#`J`$! -MP*@!`@'T`?0`5`8Y!'D+]1F"R7LL^OI/U->@&"X@)"`````#````3"D``#"L -MM-!X5ZFJ>]1!TZ5M1A@S?=SG'%_6(IE*8+=F9SJG:@.^YMMM`_UW'<@V-W<2 -MMT915P$`/`$``#P!```"````10`!.%T(``!`$0``P*@!`<"H`0(!]`'T`20' -M"01Y"_49@LE[+/KZ3]37H!@N("0(````!````1PA``$`+(X4,E?!XJ+N)4GK -MG"FFW_!Z'K'`G^Y1%C2L+/&"=4A)QLP)\/'8S9\#-M\C'6JGV&H00>FR261V -MMZ*L5I?^V;;4;38879BZ6G,X"O[^(@P#8_9R+>>NIO1[Q5L3LTUKJ]V#ASO6 -M+FHO.S-84RWJGE3`1>'X=,E`OAJ4"LTWV[OC)LXZNK1]-3'$UP,%@?<%D


+(MA/N)4^UM&3?XUGTD;N6\1M2=*Y'_:H1V>KE2WM\#W?/FQB -M.-LAR%@&"X@)`@````%```` -M_"$``.!TZSWDC<"DONOSNJF&+3:MQ1X$#[$=?!;0*:Y-QE-#!6+*LR_XW@R3 -M)5(5]JE:G[_3-?2`J<(I7^B=>:WCKV`O/!A,H0GNM(0H+5,P9_T4/!4O,CTL -M5Y(L-8@OY(4Y<@=FK(0]_T881I"^+HCC-[66.76KT^7(Z.;RH)UO)?/*%FI> -M04N@&"X@)"`````$````S"$``+!J2X,7ZNNC3J2G -M/-?L]U8+M/>8,`9O-*2G2$=4JH%2!V3F6WAW@C-QEH/E>>[GMZ^I14\(_:I) -MO:C7H;%SJ)36F5`02_N9<^U[%>3PK79QV(;VC"P=-8D^J\(5`0#L````[`````(` -M``!%``#H70L``$`1``#`J`$!P*@!`@'T`?0`U`:Y!'D+]1F"R7LL^OI/U->@ -M&"X@)"`````%````S"$``+#^:1C!^68T["SW*\E+WRA8O*?Q!4TQ1D -M+3\/]%9.Y.WI'"ZDM.%P'E,[-OT>0,.^0KK>?S,MXS2+G?*("XP\I!V(K/)_ -M6N.M.[-E]$+,X3>G(GR#[X=(&<)8?`518[^`4`.&Z -ME'J^:"7]R!Q,+HGBK?2%+U"CSQ@3=V!<];875NDDJ8D>$T!$4GNXJ^ -M,8RZ=]1[L$\F=Q*W1C&S`0`\`0``/`$```(```!%``$X70P``$`1``#`J`$! -MP*@!`@'T`?0!)`<)!'D+]1F"R7LL^OI/U->@&"X@)`@````&```!'"$``0!1 -MRLL-+%=(`D_LQH(@1MT^@>[*$<5+7L_QPV8URN]7W-X27!R@UW$K=&Q+X!`!P!```<`0```@`` -M`$4``1A=#0``0!$``,"H`0'`J`$"`?0!]`$$!^D$>0OU&8+)>RSZ^D_4UZ`8 -M+B`D"`````<```#\(0``X`2D01`'TPIKGD+H9L2:F83_QOQ#A-'QH!YC)W_D -M/Z%P*.-F+,(6>%^?_BG27`0OU&8+)>RSZ^D_4UZ`8+B`D(`````8```#,(0`` -ML!!IUWI-6G,9#&#(M5!OL+G6XY*EL^\1/[K7V2URV%]O_][,&!!JC2KO>G&` -MF&/#)G\N-[.VR&.L-&E;LXRY']W%8FA[D6@\0'L=G^[/D-(HOL9=X^LIRG>K -M,GEE`RVA0.NV^5Z\GN)HS1HI3Y@(_$;ETU%8,:YE,IL\P5U"I)\BC_&&4H&" -M:PVQRLX:.7:AYE1#'+>N1%5QB>[X_EP4L6T!%I$]_K#=E'+V!69W$K=&%O$! -M`.P```#L`````@```$4``.A=#P``0!$``,"H`0'`J`$"`?0!]`#4!KD$>0OU -M&8+)>RSZ^D_4UZ`8+B`D(`````<```#,(0``L!D$:KM;#_T@<83'!(]']FIQ -MM[<]7JV#9?3M^<5^C:2QA^ -M#$OGI*?/ZH^(?L(7P<;;07[6,EW$K=&(!<"`(P!``",`0```@```$4``8A= -M$```0!$``,"H`0'`J`$"`?0!]`%T!UD$>0OU&8+)>RSZ^D_4UZ`8+B`D"``` -M``@```%L(0`!4`]^'RT)D\G)/ST$GW:/8?9:*6ENK[HC-L!]H,4K:GUV*X1G -M2FE7D#N)=K6)$N$/=P,;."%)EOJVK0;;(>*8H_+96L5$PXW*6Z.2861L;=6P9O"(>]N4\>"K$)[`=E-6:D6+I78W>0'AV$1`\21AEQSP'0KN$]F#_ -M5BDGUZH"3WINFEXZ)%&/5N7/9^1J\MNHF^6YB*F)`>C.A4%S_(W?WJ`-1R78 -MG7=S.7J^!2^`AO+%U[:FQ8542^W/A$,82O\%QQM-`P]C6O%+T;95HBM/6+)W -M,O0U9'N#;5KF`^5_=.A45N."8W)U.Z;YWW^H\K828>?>SI9MOSF3I*N('ZV` -M.<6%\K@ -M&"X@)"`````(```!/"$``2!`I1L=2./DXV3!1%G/GK8 -M"$!381/QFHQ\,0;5L!S)%GLNT2_OLM4MZAP:WIW3`%Y#-WN_,&/]AC:.:]/? -MV+W:O02^YMML),2-+Q^._/>+AEFBFKN-\BOI8IY=GH(F"I#>&IP\E4+'$V5L -M$2",Z%QG::,W>]\R^2#9)"8GX][KR%JQE&5JB_3+]G2"N1*2G7V`.G+3L8S_ -M:G$.0TND7[JR!4)%A%`//ENHO4M$H\%"441A4:1E&J2V<.1Z/D?0>+."17/0 -M+U/(_UJHU.E<&_^4&E_`_$6-:L+"B\.#FX[@2_V/J#<,X#Z(TW^V*:[T'Y1' -M;H?T.<;T,I/-*(P^N@WP9.S18(:"UF`5+K*UDVN9''<2MT9+<@(`?````'P` -M```"````10``>%T2``!`$0``P*@!`<"H`0(!]`'T`&0&2:/:)98@#8RI]29U -M'!(%VZ4N("4(`````````%PJ``!`]HT!GDLJP!OV=OK,*5LT#P"91G$O_I!F8G9=Q*W1J1]`@!L -M````;`````(```!%``!H71,``$`1``#`J`$!P*@!`@'T`?0`5`8YH]HEEB`- -MC*GU)G4<$@7;I2X@)2``````````3````##6\_NB`";P+BYZWAT,=_X!UHM7 -MHN;I(B?P5#D-F*HXMVDFHBP:.*FQ24#O4'<2MT9&C0(`;````&P````"```` -M10``:%T4``!`$0``P*@!`<"H`0(!]`'T`%0&.:/:)98@#8RI]29U'!(%VZ4N -M("4(`````0```$PJ```PA+*_@``JA<&(I7 -M1LXIRF-+A.&2],;BOFAW$K=&8)L"`&P```!L`````@```$4``&A=%0``0!$` -M`,"H`0'`J`$"`?0!]`!4!CFCVB66(`V,J?4F=1P2!=NE+B`E(`````$```!, -M````,+%A_BBL-(W7!MQA)B7LNQ1B1%$:-C3_/^U*D=[0R+H^HP.%.B-^^A6T -MS0R2=Q*W1G^5`P"8`0``F`$```(```!%``&4718``$`1``#`J`$!P*@!`@'T -M`?0!@`=E.IE7L0C7^U,``````````"$@(@@````````!>"(``'@`_`!T`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``X&H:#Y"Q0'UT7$%<:N9_Z\2E -MWQ58-(=,)87RAJ,HY'D[.UI<'ZK0%,&16W'#2$<2&WQW#<_1RNA"K\M*%Z%A -M/!3,-]5),V_N"F'PSSS.X[J+-,8%O!"A*KYK_:[5B6B7VJ+*:E@FMF1@CMM? -MU^^$WA_`V3J0FST.63/L7_J9U/DI```DJ$SC1:]:4*I(Z74W1=SXQGUS.$Y>>'!K':2VZ<7FAR````'``` -M0`7V3Q9]T_;BE7%76!2LY'<2MT9F -MM`,`N`$``+@!```"````10`!M%T8``!`$0``P*@!`<"H`0(!]`'T`:`'A3J9 -M5[$(U_M3```````````I("((`````````9@A```@``!`!@````9]T_;BE7%76!2LY"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``X&H:#Y"Q0'UT7$%<:N9_Z\2EWQ58-(=,)87RAJ,HY'D[.UI<'ZK0 -M%,&16W'#2$<2&WQW#<_1RNA"K\M*%Z%A/!3,-]5),V_N"F'PSSS.X[J+-,8% -MO!"A*KYK_:[5B6B7VJ+*:E@FMF1@CMM?U^^$WA_`V3J0FST.63/L7_J9U/DI -M```DJ$SC1:]:4*I(Z74W1=SXQGUS.$Y>>'!K':2VZ<7FAR````'```0`7V3QV0,`4`$``%`!```"````10`!3%T9``!`$0``P*@!`<"H`0(!]`'T -M`3@''3J95[$(U_M332IKB'"KJ]PA("(@`````````3`B```P````+`$!``0# -M```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``*-- -MSJ+?1>#J\`@(V/4`(XO22[0$W]GC9@")X"D"KIN66UMXQ7?6*!?4U"_$!SA= -M7C:*6,./C.^>H:F:\H.XOYP,U+1(3>.ED,D5W60X?%Z3J3Y64J0%8//0/Z)@&?\]`#FUW$K=&XP8$ -M``P!```,`0```@```$4``0A=&@``0!$``,"H`0'`J`$"`?0!]`#T!]DZF5>Q -M"-?[4TTJ:XAPJZO<+B`C"`````$```#L(P``T&V[M4IW\5MZE&IKB<4CN4N? -M6=!K(%F@!"O[3MWZEJ_JZ`)+Q%@;B4D`%KNZT5@Y1^1LPIN9U'0SXJAZ9'Y? -MS&14%O#\?ZN/G,`;YW;+AS16,STKP#JK65D_KX8^I!T0>H39M-P1Q:O0C@RM -M8(_Q#C&-*JG-2[TXH?'7"Y\Y'L7BA#8*&NU8,2GI98F09/^1G`RZG;IF\!G2 -M]`;C!D:ZKA1E=W:R^9=<_NTQIJZW5MR09C--@F_3BHZW$NFM%=6W"J$D;L^1 -M:RU!XD[.^7<2MT;5'P0`O````+P````"````10``N%T;``!`$0``P*@!`<"H -M`0(!]`'T`*0&B3J95[$(U_M332IKB'"KJ]PN(",@`````0```)PD``"`#^Y: -M35#J[YR=7W<"7?%1TA.]VQNO0'.=[WDLH.CC.COE3`X?[;B:& -MB=$BTL1W5[*Q__N@].[R0&P/WSE?D7Q!+WO#J#!/N^;_D):WZ,;1E3M>'M_) -MC/MK1@[BI:?JXIJJ&-&[K2[>ME78/E1\$=Y`E$8PHG<2MT:*/@0`'`$``!P! -M```"````10`!&%T<``!`$0``P*@!`<"H`0(!]`'T`00'Z3J95[$(U_M332IK -MB'"KJ]PN("0(`````@```/PA``#@T4E`AA&\9I;]OD0\23'=#1S+K4BJ:Y`= -M)BU@BGCC23$*"(7SZ'NG]6@JBQC11.!#;#D.RY]L&"M[#\&!YJ4VL*J-H'.'T-VHV:G>Y`;D_1?"URZJ"\ -M^)`Q(OPZ:72=;RR=H[50.!: -M*06'M"HJILK9WK$C!`*3A`2DL#2V&\4!L^,;UI\PO"LW6:014X3+3CH2M'=8 -MH/^^QLTRZ8B[>$?&_@SMLC?!<-*5*N-_,X&*B=K06 -MDSBI2NQIB48RS\?W3+KA_O/_FO2 -MRT-#9541Y)7D_P:4[TMW$K=&8E4$`&P```!L`````@```$4``&A='@``0!$` -M`,"H`0'`J`$"`?0!]`!4!CDZF5>Q"-?[4TTJ:XAPJZO<+B`D(`````(```!, -M*0``,,9_-:?SH8?2CH@@D3I@)B!%A,--]S$=<6'K!]#DB*=4E4`3_\=&7&#K -MVIT-=Q*W1B%Q!`!L````;`````(```!%``!H71\``$`1``#`J`$!P*@!`@'T -M`?0`5`8Y.IE7L0C7^U--*FN(<*NKW"X@)"`````#````3"D``#`+*(S90KZG -MS,TXR"UD0G1H$V`(Q_3T:4:_N%`!_6G*E?H/O(`HV>INWY`.[27YO8G'JSEVW+.(]JGUP/B?O/`X4VLQ^6=!IWO)']PD[%.>S`WA[!@,_W! -M0U9:\&/+2E[>302M`,7^6/MN%:A8`^=FTI=1*U'F2:5N)ZZ-$I9:"4,MS-O3 -ME=I"6TDQY(_.=Q*W1M67!``<`0``'`$```(```!%``$872$``$`1``#`J`$! -MP*@!`@'T`?0!!`?I.IE7L0C7^U--*FN(<*NKW"X@)`@````%````_"$``.`K -MM!$.1#;G"ZA*]P[KSJN>2>8=0]5&VI?IYMS25Z@:ZJA@0$XSHX6%K^%&N@V\>_^X$)#+Q.+IL+L&TBQM]\J*().``'* -M6/P=SYN'-$<,^:KJ86?QRWN?C:%X77)];80H1N5=;KU]/LD_?FTL=Q*W1HRG -M!`#L````[`````(```!%``#H72(``$`1``#`J`$!P*@!`@'T`?0`U`:Y.IE7 -ML0C7^U--*FN(<*NKW"X@)"`````$````S"$``+#X(V(Z.#]Z:G.U0Q3S^)`' -M3`>^\..*'_I?0R,?+&^DB4@,IP(AS-8FFW;%SANMPXZR*@*&N^NJS4%[+>T9 -M3`,O9\]OJW)0WNNNYAJ/LXJJB&P;D9F4<:8'NII;!-S -MG"AE8Y]9GBT^0`%]XJ20H,UPM!G/V@;JX:IQEG+\4"X5S/=J^[[8#271J#M\ -ML.MW6E6.DHM5I)JC<4>W8#PA@QX-=Q*W1I/*!`#L````[`````(```!%``#H -M72,``$`1``#`J`$!P*@!`@'T`?0`U`:Y.IE7L0C7^U--*FN(<*NKW"X@)"`` -M```%````S"$``+!Y[P+<812()+0&`TN$2/(&)=``."+;NE-P$C*/-DNRFUMT -MCK*7`*;7G&]LUAX]+&@FNBCZK*X`(W9QBM9K@),X^9ZNSL0G5*`7;VTE3"8V -M'V4`CPR3'#NZY@(4P#_;F&N&*N.E4^F[+*/@C'E[_Q#GV>JT"F$STVE=7#^U -M-38;Z:%%0*'G!M*=E$PS4GDZN)+WD](<&DN>A#VU4;_DM -MG]X+=Q*W1H#G!``\`0``/`$```(```!%``$X720``$`1``#`J`$!P*@!`@'T -M`?0!)`<).IE7L0C7^U--*FN(<*NKW"X@)`@````&```!'"$``0!8OLR2S/PG -M+FW%=#Z-;WV&.)<^!5_%^);@$-EA=$F,\=Q,M*.;=GM#[U-\;5XY!P_NCNQ; -MM_^$&82`S^7#UL<'"Z+_6*,J<:7.L`C8-_CNN!U96]$C,8AELY/S'2D<<'5; -M&.JK&&0F;UW"G_/'*@(>Z^X?/M#3D3OQ4S(>98N$.0E/HUK1QCW0F7\!17O_ -M%U']DG^&]YW6A3[#CO[B)->S'G?4]!@+#?B!=M2$JR]P!Z&?44Q.[?UQ\0,] -M70'K5QPTBEC`;X<,U_S&[T*O>>2^_!8$;:`NIP)AU?#A9/0GL&VT\.&ZM1#\ -M-5(GF/X-`6HA`A_57/!;S%P-DM=W$K=&WO($`!P!```<`0```@```$4``1A= -M)0``0!$``,"H`0'`J`$"`?0!]`$$!^DZF5>Q"-?[4TTJ:XAPJZO<+B`D"``` -M``<```#\(0``X,T>E,,A]CT8T%3Z0\H$(F>U4FRZRHL&,4V20<5V\8;,'`]) -MFZ_EV(J42_(2<;@5O4[YJ=O>RH`E*:8EQDK]5K./+!:KW>$HKT'/<":ALEF\?A'0TOR.-V?N';$&:R;6)TCW)/J,'MTA -M;XG4+_/YT\NT-P])3+)50S['*U1?70MIZ4<*KC4.B!1<9D^9&^KZ9SPIA5", -MAELL?KK43LH3Q(-R*\6$"A#O\/`9/BTNWAVX$C<*8ZJ_U4?Q\@F3V;.7]]0D -MX2XC]6)W$K=&K@,%`.P```#L`````@```$4``.A=)@``0!$``,"H`0'`J`$" -M`?0!]`#4!KDZF5>Q"-?[4TTJ:XAPJZO<+B`D(`````8```#,(0``L/_IZE[= -M"_,^V.CKVSH/ZNQ"-?[4TTJ -M:XAPJZO<+B`D(`````<```#,(0``L$`DNSA`O$UGFUMORQ9.GNSO -M8-,P?]3>EWG`&@CCQMM6FC;E;(`'S>2-$/E[^Z8?("5)9(<1;VOHW.TNRR\' -MU1L-^&A?6ZE%CV<\+"F_PZ!2E=H+8Q%9.9H7Z1\&^$.U];%)I+[S)`Y%U(3A -M0<>7M$)>?BS'QFC6,8IW$K=&&$T%`(P!``",`0```@```$4``8A=*```0!$` -M`,"H`0'`J`$"`?0!]`%T!UDZF5>Q"-?[4TTJ:XAPJZO<+B`D"`````@```%L -M(0`!4&KXG5NHRS1562Z/]:8DD+'Y= -MV)URD54N?Q#)"CS:O"F[S7\(P=0+9%A5AP?K@UD43J<6B-!I*V$NZ.-$F3TH -MD[!"BYR9@'5[T$RO6:_%A#CAC0I5^'$4'&>HG,_ML"=%SNOQX[("F)#6"1:/ -MJ58G<"Z0:T1P^I.+_#/-7%( -MR!RL9%W43N._L"EQG3GCN>PO]+0GS99K!<_]M1*&%RF,C;("Q^EK2G`DJR03 -MO9Z\WGSNK&IF/"6:A=Q*W1A6!!0!<`0``7`$```(```!%``%8 -M72D``$`1``#`J`$!P*@!`@'T`?0!1`^D/O27E0066?-%"W_\,)E6F'Q/YC@O7MOODL -MI4)=Z-8L=TQ$P$PG6[/?`Y1%$><5ML9!9^SA+1`>K%01TAF9E!'8I].U_XF& -M9T%#V2A"_71L4[H&;()F^A;5&'-57[0_QKI2-89'KL:BEAQ"$:."45,DW@_4 -MV!4,(/.3XN9H9HCG!/!&>K-24)#EAK0"D2>R)C$^)]@'&#!Y^4C\2#+R0D9K -ME\Z)M[O<8\EK,*)ZWP>OP7?Z7/W0?G3'?*?-@1<.`1-+<'[38OEJWU/5CD8` -MA)'SN@A:/)?71`6E*#BO)4X'<2MT;.IP4`?````'P````"```` -M10``>%TJ``!`$0``P*@!`<"H`0(!]`'T`&0&22P@A_#,J%V4\X>2G,&RX@)2``````````3````##QONAM2(;PY/N*()7VC[:?J-5Y[`^8$*YY -MX._=V&0?(2G,&H -M@)V\G(:V(\IW$K=&]LX%`&P```!L`````@```$4``&A=+0``0!$``,"H`0'` -MJ`$"`?0!]`!4!CDL((?PS*A=E/.'DIS!G*E[+B`E(`````$```!,````,-M@ -M)@%<7!((VT`X7['"54-/\ZZP=:5N2&69<`J7"(``'@`_0!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``I"(J3Y;`,G-?B=--3 -M7Z9.)9E]+#7=;Y/2('G!SVO,%7LL=5,2C6+$QD/'I`-CN;6A<0Q!I01/VMWQ -M)5H%>MDE/K*:\[TG(SPI```D_+*:F+6[7KOEO7>7/&@?R-I'_6J:#3)`8_HS9RZJ3G<2MT8X[P8`N`$` -M`+@!```"````10`!M%TU``!`$0``P*@!`<"H`0(!]`'T`:`'A8,AU6P+BI=3 -M```````````I("((`````````9@A```@``!`!@````>7/&@?R-I'_6J:#3)` -M8_HS9RZJ3B(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MI"(J3Y;`,G-?B=--37Z9.)9E]+#7=;Y/2('G!SVO,%7LL -M=5,2C6+$QD/'I`-CN;6A<0Q!I01/VMWQ)5H%>MDE/K*:\[TG(SPI```D_+*: -MF+6[7KOEO7>'K;; -M&JJ5O)82S!>Q5^RT"OV"GDJ5RL+JEK0!==VU_F\K0?3F(Y8.S+<2W,^Y;@SS -M"IWALI/.IE\?^:J\!A7S88;6OFY(.K1;O.Z]6&M[I#SKS0+6_<+-M'F24M9!W?+L=S@E01A9 -MB*2A!!&..(H0N"/30LJX;VD921O@(^!<\2O=NT016,;G<2MT8`>0<`'`$``!P!```"```` -M10`!&%TY``!`$0``P*@!`<"H`0(!]`'T`00'Z8,AU6P+BI=3$L$TB[F@QL0N -M("0(`````@```/PA``#@UM)YQUH^*4]S[+]Y@/PDIDMQR+@%[PI\T<`RGPDI -MAU_G-![M6[DT,N=\F1+\`2G.]=[T3^WF8\>5)_LNF!?SE?7FY^GAC,;B%O"V;[F,OZ10=E`+F?ZVHA1>9W1<=^`PPDF8(VM@1%3@ -M24Q#.,D`2U6S5W<2MT8-A@<`_````/P````"````10``^%TZ``!`$0``P*@! -M`<"H`0(!]`'T`.0&R8,AU6P+BI=3$L$TB[F@QL0N("0(`````P```-PA``#` -MM#N)RW1"=W,I>PA8;<@+F@!BE63PA,G&J>-L_$C>(\(PN[^/^,HLDK+:]&._ -M5#;70J+&=X3,8][-X$@MC:.OM6=V3TN@)X.+Y3P%"#`/!!C5T+B%OGOGLIR\ -M0K[PKM:LWNCN]*T^FC!]2LJIR]QK(%&?>F@IXKF -MK]SLC1BG\;9W$K=&Y8\'`&P```!L`````@```$4``&A=.P``0!$``,"H`0'` -MJ`$"`?0!]`!4!CF#(=5L"XJ74Q+!-(NYH,;$+B`D(`````(```!,*0``,'&$ -M(+CO=:.\:`)EB"Q#`A^@+NP&GS]R<:JD`D>@S<0LX\G=8X.M)HD1HC]X=Q*W -M1NJK!P!L````;`````(```!%``!H73P``$`1``#`J`$!P*@!`@'T`?0`5`8Y -M@R'5;`N*EU,2P32+N:#&Q"X@)"`````#````3"D``#!0#,6[[U\E6IQ&FOP- -M$]O[6Q1_/BV45O(Y6N^Q7^&2G@'U;/2?&4RI<;7[@G<2MT9\R`<`/`$``#P! -M```"````10`!.%T_``!`$0``P*@!`<"H`0(!]`'T`20'"8,AU6P+BI=3$L$T -MB[F@QL0N("0(````!````1PA``$`AMT[,%;ZUA^/V0%N4W_,,ZNO'7]-LP7W -MZ(,LX\*`=Z>'\L2+!4:7GSX'2HITJ`TXA]CW6GQ0L,WLS!(_ABM(TLQ.-<*"@J,OS),AQ6QW*#+G52NH!38N$:20I58QTHA54>$E\ -M_OJAD8X!\8PD$!:[,\M7K5.G&RDT%=VE<6.P/&P@8HA.K:0&^$MHHI3(F&75 -MGLHWMG.@/-4Z+Y#R!F%-)_F):].$+4?;B32O7+^!+6/>?R8+,*L\JUAEX_N% -M5X2RA`CGN>$Q)SH8=AD3$G#I=)HT_6V9R0BNRP(7&GP-7C_'`^1SD,(C',V1 -M">1@=Q*W1D[4!P`<`0``'`$```(```!%``$874```$`1``#`J`$!P*@!`@'T -M`?0!!`?I@R'5;`N*EU,2P32+N:#&Q"X@)`@````%````_"$``.#7SR=VB\3[ -MY%U_!J7Y@%GP6#Q7KBQ+B]"B\^L^^[<3XRY7O:;54:71Q_9,770XA5_(4B\M`3X6%_-5'UHA[.T@P;%)^D\`B>DT#$O -M^O=0"H)QD[G.;,@?(-%"W0>,LQLG6Y7N[(VN-;LI?ABYRVLZW(6H:L'!S<41 -M*TI-2X:LCE63F4]R`9$\!?$>*+V=FR.]VW'`'99.G`^Z,1N(MCJ]++*H?9>'Y,RH"<6,*#_Z*2+,ZJ4,WMC(E39AC -M#O4424FJ>P"M5SK_AQ&#Z*A'*6D`/%#SA*>^S_2]YV%@X#2_$9BZ7'P=H)6? -MN.@2%-G/65<&7<;Z+&C.E4HC1D./=Q*W1I@+"`#L````[`````(```!%``#H74(``$`1 -M``#`J`$!P*@!`@'T`?0`U`:Y@R'5;`N*EU,2P32+N:#&Q"X@)"`````%```` -MS"$``+")?,>".#LHTGV#"Z=\&(')/)'FB>*]3G-NHAHF7T]>G@6WEJW3QQF@ -MH1W8"V=L9>2ZO`K -MC[D*FCL!BCO%UKF$?8?*@U@*E;]K&G?9LM=4'?\4ZOUK"QIAX7@Q?D96=Q*W -M1@$I"``\`0``/`$```(```!%``$X74,``$`1``#`J`$!P*@!`@'T`?0!)`<) -M@R'5;`N*EU,2P32+N:#&Q"X@)`@````&```!'"$``0`Y7*)]APN!QCN/TB3] -M+J>(X.JDSC1)PL4W[!-+?+D8?QB:$+2]07^[3Z;X&G([;A0F-L)OEA>A&28V -M?#=6^1EY>C*2^2+N#>AYHZ:.S,S+!UP9]:/VAO?;8SH?)/E%(/ -MCJTS>XTZ"O@@CA^#RB'LG%$D[W -M=BQI%ZDK6\=$XH&P>4[5/=T#-7AU$/8P^#-#=0IG86.2-D0#SWJ>[Z[L^/;N.!)J -MHI9"73."Z'YX\WQ,"F)W$K=&(C,(`!P!```<`0```@```$4``1A=1```0!$` -M`,"H`0'`J`$"`?0!]`$$!^F#(=5L"XJ74Q+!-(NYH,;$+B`D"`````<```#\ -M(0``X$ML>/0+"*I.R6%[K5M67VEAH6_I^_U#RSYIB)M-Y3$3S-AZ*Z%^%?_5 -MQB2GKO-9\M4EQZK#+(TW`Y+W"G>)MKP&_:=B*B_1J?/Y?B3H6`5^'8],[";) -M/%(+-RR`;'_JX?/%X?,\48WBP&&639J4H754L\G>0L45OR<#T>90>B"O&U;N -MV-+0I/XT_M91DS$H[$\%4>'4S_U2`W)`E]F75'(+3!Z=X?@NLXIDY2L$7Q^6 -M[;&W8$?R%<>R?O;V1L,A;;6IH`!CH)#K,WPB2Y3IJ@KT4#OA."SH[6-MD$!W -M$K=&,40(`.P```#L`````@```$4``.A=10``0!$``,"H`0'`J`$"`?0!]`#4 -M!KF#(=5L"XJ74Q+!-(NYH,;$+B`D(`````8```#,(0``L+@%GN"IP$+/5@AP -M6FWMBWM-YZ(2,9P(0(,PS5TA42&<>(1FY4D6@J2QO_-(ML*&-Z^"J08J4*I%=TR)9!^B*/6X'^ -M%@B>^0*5E@7H4-5*='60.U>>WYCG4R"&Y7:F -MV'P9GIM[+*!W$K=&Y8P(`(P!``",`0```@```$4``8A=1P``0!$``,"H`0'` -MJ`$"`?0!]`%T!UF#(=5L"XJ74Q+!-(NYH,;$+B`D"`````@```%L(0`!4%C( -MZ7>%-X3\V\EEKR)-Z:6ARPQQ^W2_XQ7+GU-C'4$I%7MTNN5W]&OPU^O;0=;& -MO@1%;O2;4V$L6&LOPQ[7P--YG6X0!R?[[,_?B\"[G+?#I@MH/P@_.::5AJ\B -M>CNP,_\I!L8$FI+)&3&7=95JWDT]HQ#&"Y1?6)D=#;]J[`41,7@,^$`FY)C* -M1+&KS@\-3BTWE6%-DQ>XZISMCHU=&J+:UT.G_79.$[_2`/M*:+LB6C45+0Q= -MT`5'*MYQZX\6BLZ%.W#?2)UZN%"%DYL?731#U>*YM7D7R*AC'^?/OJI0;@:C -MR38E<7X-NYC1E^$:NT5(="VYC`]YWOSY4C"S?8H?BNQNIN#]/]SKU2_:D>@U -M6>W2M.ZR&V@G`"G3]!3OO@6&WPNV$;G^@@NI]2*04+;(\81Y(BBU&G(M;8;] -M#44[-I2QJ67MDNPDYQ!<=Q*W1@[!"`!<`0``7`$```(```!%``%874@``$`1 -M``#`J`$!P*@!`@'T`?0!1`711(0%SH-PLP`*B\@7.+9I@F26*/I$9\ -MI@G71#DW8Q>`)"1BL/ICN"JWF'<284"?+V_<3^HCF>WN\0LK(U>";:V?;JW3 -M<`"%U) -M``!`$0``P*@!`<"H`0(!]`'T`&0&29:U$1D/QPD2PQ?,*99]%%,N("4(```` -M`````%PJ``!`[ET^>0B\4+BCIZ?X!OOBN(LB'K*5Z:"5*U&)WP]^,'G,I3_* -M:')>W[5L7=9+;YVR5%%L*ZDSLH'D_8J1=Q*W1FOT"`!L````;`````(```!% -M``!H74H``$`1``#`J`$!P*@!`@'T`?0`5`8YEK41&0_'"1+#%\PIEGT44RX@ -M)2``````````3````##8E39[$S62B%OTJW2W+C3YDAVQG:^IEH<]^?Z(9[88 -M^Z3K=;\1U^05M[]Z87<2MT9!`PD`;````&P````"````10``:%U+``!`$0`` -MP*@!`<"H`0(!]`'T`%0&.9:U$1D/QPD2PQ?,*99]%%,N("4(`````0```$PJ -M```PZ)8.36G(IDOT^:$TQB4/7@"_[6,]-7I4.SW*Q'9FH,I35-[N47"ZIB6& -MA*AW$K=&=!`)`&P```!L`````@```$4``&A=3```0!$``,"H`0'`J`$"`?0! -M]`!4!CF6M1$9#\<)$L,7S"F6?113+B`E(`````$```!,````,*MD;0I&HN'8 -M*J^D"3#]-3^X2N -M39(``````````"$@(@@````````!>"(``'@`_@!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``FFDE^C413*Y^R6[%J)+<@Q*/BD+ML.0E&E/[ENX+ -MCFR!?0$\5`*M6+^F(L(:;&N.&YQ:&3G.@!JY>W18'U$X&W&>?22KLBFX -M47CM?6)C:%J!_(&.\(!PG;'\S^B->/Q?2JI).NUUJH?G4E-UU7:-5(#V7V#^ -MW%#BWP%5X((I```D"G-LS7V?S1\_-DS6N9D((519;[4Q?MH03+OQ_ZUI_@@I -M```<``!`!#!?$3R+494;IYB"Z:,IO[(5Y(YR````'```0`4)1PE0U]"GV3+P -MY\P4#2,X_]*9J7<2MT;D&0H`7````%P````"````10``6%U.``!`$0``P*@! -M`<"H`0(!]`'T`$0&*5@'D_N$KDV2```````````I("(@`````````#P````@ -M``!`!@````+^F(L(:;&N. -M&YQ:&3G.@!JY>W18'U$X&W&>?22KLBFX47CM?6)C:%J!_(&.\(!PG;'\S^B- -M>/Q?2JI).NUUJH?G4E-UU7:-5(#V7V#^W%#BWP%5X((I```D"G-LS7V?S1\_ -M-DS6N9D((519;[4Q?MH03+OQ_ZUI_@@I```<``!`!#!?$3R+494;IYB"Z:,I -MO[(5Y(YR````'```0`4)1PE0U]"GV3+PY\P4#2,X_]*9J7<2MT8M3@H`4`$` -M`%`!```"````10`!3%U1``!`$0``P*@!`<"H`0(!]`'T`3@''5@'D_N$KDV2 -M(WWM2&>[D]PA("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`# -M```(`@```@,```@#```"````"`0```(H``"(``(``+J6Y%M.53D17EP=/:X( -M\,Z,IR+;=5@AD\LVYNOP-A?==+B`?9&CG0EE:JT<2"FVA#RO&<4IW>Z:<84-@@C#D``D6YW$K=&,'P*``P!```,`0```@`` -M`$4``0A=4@``0!$``,"H`0'`J`$"`?0!]`#T!]E8!Y/[A*Y-DB-][4AGNY/< -M+B`C"`````$```#L(P``T"I4(JP)LWD"M[4)L!CX-L;*U6&#>O*;ZZ39W=S9.%O7#OZ]05V(=UEQAPT3J7/NK'8H6-!>[\$H(IY*"] -MTN:(+W;[5I"D%TQ6`/YG>*5Z;K$(`Z'KZKU'58F)!IV$"W%/-2BJ$?5=K)4U -M[D]PN(",@`````0```)PD``"`NG])(HP5YG#_K=[MK*9S -M'(4T'&U"*3S,]B="S(Q#5A]A[@BK5VH@= -MOZ&'5`)@$CX-1Y1HT6BC2CVBL@X2G?S#,$%:`=,\YMD@#!4MW_5P#(?.W3>K -ML^_!].:RZZQ=$O?VQI79D-_,UG<2MT;5LPH`'`$``!P!```"````10`!&%U4 -M``!`$0``P*@!`<"H`0(!]`'T`00'Z5@'D_N$KDV2(WWM2&>[D]PN("0(```` -M`@```/PA``#@QJJ0*4#W8W_:\Y&QEU?''CZKU@!L\(C0`+_-0[YKZ`UE!S&6 -M^\(Z+``NW)PR/SW)=@$JOU2@\.F -MF.@]$LUI__[C'SQ!'QR;+WN`"=]'.E6**`W"V4Q*-9-$\7,AM^_`T@/U^C2' -M/6MV8^ZF^-O[(\XDD%:"%]5NMBT.B=%\>FM0S7!UC_9MQ6(=>4N)U0\7O`5K -MQ"K`\S%ZCRQJ/5?L[_F0)VJU_^9CSU*#6.3=$`G*]+_2&,BY+[('N;W_K3,? -MW)CB`W<2MT:/O@H`_````/P````"````10``^%U5``!`$0``P*@!`<"H`0(! -M]`'T`.0&R5@'D_N$KDV2(WWM2&>[D]PN("0(`````P```-PA``#`C-:&<1)E -M[XHO7HP6STW7'\A@-/,\BMAF7I:$W* -MBOAV7R=UBBTE+.^,R.,1WDAW6G3`<_]/H2,W4*RZ+"A^P@^F@W'<7-7#QS)Z -M[.7'/UC%V*:46G8/0K!=`WU,Z@J1$*P#>LZP@T;X4D7Q**7YPP%5=;]=58G6 -M=BEW$K=&.,D*`&P```!L`````@```$4``&A=5@``0!$``,"H`0'`J`$"`?0! -M]`!4!CE8!Y/[A*Y-DB-][4AGNY/<+B`D(`````(```!,*0``,+S=')*/9[<* -MZ)Z^B=&Z2`-1\7PM9XQ3^X2N -M39(C?>U(9[N3W"X@)"`````#````3"D``##A/CK#N^5N0JL@J6#"9S<3*A9B -MY="E\5)F0`?9]#)M$TZ/?)`\[]<'NTZ@+G<2MT:"`0L`/`$``#P!```"```` -M10`!.%U9``!`$0``P*@!`<"H`0(!]`'T`20'"5@'D_N$KDV2(WWM2&>[D]PN -M("0(````!````1PA``$`/X,%/5;79?ZRLZ=@OF@>[>L#-AR\Y"/6^[8FGWX,2'-W7>HB$>A4>])?V=#9G1Z(1#CS;&"4$M.#6H\6-GJB_08VC_ -MLHF.:MQ3H:/I^4WH4\HG7%K(9!NQW\G2NO4\M![ME#M[=?G6.BR2THOH=Q*W -M1E$-"P`<`0``'`$```(```!%``$875H``$`1``#`J`$!P*@!`@'T`?0!!`?I -M6`>3^X2N39(C?>U(9[N3W"X@)`@````%````_"$``.".,=\_I'+KIH,;]=3+ -M>".:L1M>OI)5H.-=A)C99!\=&0-UP*I*>TO84UO]"R@QO5;`5<1O-$% -MA3?:I(D<>'ADP(LBUGOV_3YI*+AKFEF2JZQ:,XCQ!ROXXD'>Z#?!'5\5:V0* -MU*'XTP5/H\ -MX?AF-/_2RI82K%R(1GWSGUQFXQ*&1D>IX8+#=Q*W1N(="P#L````[`````(` -M``!%``#H75L``$`1``#`J`$!P*@!`@'T`?0`U`:Y6`>3^X2N39(C?>U(9[N3 -MW"X@)"`````$````S"$``+#H;81&[5VO]!%K,*#V0Y*3OY3)^>A(WT&]DXBT -M1?6.#FFX%V.MT*7ABM^%S)P332JN]]B9DSV=>=/:HTO;JU2SAT#%T7!>LSFR -M;^-24+<#-I+?6?QKU%KYHCH1Y\L.5O%:M*9,+>U&]+/3^X2N39(C?>U(9[N3W"X@)"`````%````S"$``+#E -M##\!;7W-;PJWR2'`!6P6NOUC?,,=$YPA-7R3EAT:OV5B"0$?2*$[3*[>/U2JV7:SGS1)M%3]J/=Q*W1@I>"P`\ -M`0``/`$```(```!%``$X75T``$`1``#`J`$!P*@!`@'T`?0!)`<)6`>3^X2N -M39(C?>U(9[N3W"X@)`@````&```!'"$``0#F#/K[7UPOZ,5K)[`EQT/E*>5W -M3Y+8\A^_R=@!AR'N&J5(O:C&E4K!T6+6%I$X&^^UDCQ",HT<$G/1]%7T7"D` -M>^J^6`)74S"21E^DXA8J;7HU![X?`,8ZBV1P]?:M^+AV/5$/Q1S6E.>=^BCL -M-C@2N(.C$4,GTAU@@Y+\F!JLQCL`^B8TMPL4T!2R[^52D(CM=R??W+`R.^F( -MHP#A9VMV5Y,`&849=!XRX#0QV?3,^DIPE[*."ZU&A6/VW$`KN#L_$BG**'R6 -MXVV8+\RX5<*`R.`094>'IIY;%:'Y8CE1X3MU;K9GFOGZ?F2ZJ<,\S_H-5U*V -MQ#BR&V\N8P%W$K=&UVD+`!P!```<`0```@```$4``1A=7@``0!$``,"H`0'` -MJ`$"`?0!]`$$!^E8!Y/[A*Y-DB-][4AGNY/<+B`D"`````<```#\(0``X#-( -MSV5-^E,.1F,N(LSC@3CL32NNBP)FGS#?S(>8"/A;@BLA(6J2!S+/TIF4ZL'% -MFA34<*Z'P<$$@O;>1`/G(]QRLB='`V#0?G.*BT\981B;\J.3/F*A39]33&=# -M'7\W*@$Q9:H.>0B;=S,!%56C4S81GE-U/6EKLE"E[]`@IKF-1#GY,5"A&WP= -M.3AU-6*F1K3H`W$.,%9,TQQMNJ")VU+LT4/=R]QU$9N-ZYNEI4A(0<%K)E%F -M[4X<1V^]>!["LH/L@&',I2AB3NV_ER-MOU%7GCO?[?OQR+'"'3]W$K=&('D+ -M`.P```#L`````@```$4``.A=7P``0!$``,"H`0'`J`$"`?0!]`#4!KE8!Y/[ -MA*Y-DB-][4AGNY/<+B`D(`````8```#,(0``L-U.,[A;*Q/=527;*\AAM4YN -M-\"#UBBIQKGZI+6]5?L^SS;(D]2`@@447;%HQW$K=&2IP+`.P```#L`````@```$4``.A= -M8```0!$``,"H`0'`J`$"`?0!]`#4!KE8!Y/[A*Y-DB-][4AGNY/<+B`D(``` -M``<```#,(0``L!^W6NN)%ZRCNBQ(8A[_CM>'FV/VG6V[_79L-@A@PQH!<(== -M!T&B4A3T'MJV`N;N9J/B?.(W._!*9\CD49;:1QY*B<9L_39KXPHMGJW?AZ3< -M0HF:>7/,7(,$E_Q:'M?$5O$+M34@Q4-C8O<>NXGHQZ,=_(>+#K\).O=7+JN^ -M.8B8`PNB=5@N!F.1T%00$FY7+68A4PYL@U-#V6S-&D7GZ>KURO>"YS'@Z):@ -M?,5W$K=&@<(+`(P!``",`0```@```$4``8A=80``0!$``,"H`0'`J`$"`?0! -M]`%T!UE8!Y/[A*Y-DB-][4AGNY/<+B`D"`````@```%L(0`!4#UY0AR6>IEO -M[TZ]_J3G2:QXKRQ7BDS"GU0X">TW9`W:=%N$US3N;>=GP`1P1:Y#\9S]D51+ -M96]ETN=Q^,!E_Y0)VIE2)W%J\;D++VEZH(M?D9+CBX3T3I^C3M+?SIGQ6+T] -MOO/)U]T.NSNFFS&8/A%)6:@!W\"4[EQ+)('@VTS\PX-[PM2@GFEOK5'UWTY2 -M5V-"\+KN,_"\Z-UA5%CQ,FW1!>5+=['J)7]5`V@D=4DH4WR\$,'8J'U-JE]H -MP;BJ.F6Y`J&8';+GX?1CA6Y70/$F -MG`(!QJ^3^X2N39(C?>U(9[N3W"X@)"`````(```!/"$``2"' -M=/8L"9B?KA%`X*DY'"Y+F;6+:O#H[G1YF/*H2,+LS\5V+JA)CRYFJP.+%Q97 -M*RINY[%^>[D7=V5K8`PUK@`^9`B?$]DNWZVA7^0F&K<;HW4A]1R^7BO6*KTC -M[)V*6D8QTH;OW&,1L`<1Q[T=PDXBH=`%I^GJCI(>'Q]38^2@S0K4Y=/;&R9G -M-5XC>E1'Z]J1$%7E"4;%`++9VSD<9)D0];PIVHS8:2\;]Z$1 -M.+?IYST,'4+8JTN-9IES/=O\IBY[TK^$Y$%PN,-)8G&QOG_BB<)"MR-.KN@_ -M/WIJ@]46<@@CFX$E?W<2MT9W'@P`?````'P````"````10``>%UE``!`$0`` -MP*@!`<"H`0(!]`'T`&0&21MD"/E9>T'F=3LN("4(`````````%PJ -M``!`M9L,-HX)RFA\?PRAY+=,1<&+#]B2\DK"Q50#DGOH0=--2,E\*WKVH&:7 -MRSMDU5:WD$@N>'4XJR`\*4&E=Q*W1@XJ#`!L````;`````(```!%``!H768` -M`$`1``#`J`$!P*@!`@'T`?0`5`8Y&V0(^5E[1S:;=N.=X>9U.RX@)2`````` -M````3````#"YI&>BG[N<"J!-]C);FZ)LP;8<2!=H38^M9 -M+"USPXR/A7<2MT;4.`P`;````&P````"````10``:%UG``!`$0``P*@!`<"H -M`0(!]`'T`%0&.1MD"/E9>T'F=3LN("4(`````0```$PJ```PQ6=. -M>=U"4"U?"(U5+Q^4RRA7'.@:&LYOKQI>#^M47F.2_(/1!/B&,]IH^.9W$K=& -M0$8,`&P```!L`````@```$4``&A=:```0!$``,"H`0'`J`$"`?0!]`!4!CD; -M9`CY67M'-IMVXYWAYG4[+B`E(`````$```!,````,.`/F$BB).2Z-Q$[L\BR -M@UN+]C=E"PL*)K4A3<.^EKJ7V6>AZGO-O=O4NOD?=Q*W1F9"#0"8`0``F`$` -M``(```!%``&476D``$`1``#`J`$!P*@!`@'T`?0!@`=E%*H^'`2.)5D````` -M`````"$@(@@````````!>"(``'@`_P!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``K?JX#8GS6QS^9F#P%\$%)7?QMAP.*/O?_Z!FK7.3N4!FN$YA -M_!GW_5-4Q4Z<996L`(LOL<9/K4V9T_P-,E3X&#G,LDZK]2F>&0/SX$,AN"B7 -M7I$OE7_JT$9YYQ<]&Q2XWH,DT4;.?"X2/)6QZKV0QT(%]GH\PA&-_RSR`+EZ -MUE9?T%CZ9-I?`O\LB;/]$&&6RX/%23O[]4/GE#4,`6YPO'68MD7<2MT8%80T`N`$``+@!```"````10`! -MM%UK``!`$0``P*@!`<"H`0(!]`'T`:`'A12J/AP$CB59```````````I("(( -M`````````9@A```@``!`!@````>RX/%23O[]4/GE#4,`6YPO'68MD2(``'@` -M``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``K?JX#8GS6QS^9F#P -M%\$%)7?QMAP.*/O?_Z!FK7.3N4!FN$YA_!GW_5-4Q4Z<996L`(LOL<9/K4V9 -MT_P-,E3X&#G,LDZK]2F>&0/SX$,AN"B77I$OE7_JT$9YYQ<]&Q2XWH,DT4;. -M?"X2/)6QZKV0QT(%]GH\PA&-_RSR`+EZUE9?T%CZ9-I? -M`O\LB;/]$&&6)R*C0-J!9G\YM6PO1?&N4S$4(--N2H_,2?\[`&KX=_ -M"*QE_.DN_O!]78UPZ3Q260.HMV34:R':K/A8C*(IPY0C`.$XWW]%W+[[6K#< -M8_;Y].Y](DUV]/A[HNF%&T']*0``)'Y=AE+F_8H)Q,:):2:DO7"!KHS?*L]- -MR"XE2VU8&(S&*0``'```0`2!I[-"*B^>V#U@*(NW2BPVI@6C@@```!P``$`% -M=7Y$AC;8/E5_;*YVYAZ6]5&=MH9W$K=&5+,-``P!```,`0```@```$4``0A= -M;0``0!$``,"H`0'`J`$"`?0!]`#T!]D4JCXF-^0AYH>T_S[#>F5.; -MWUX[VK+$6Q@JPD"U*Y:V@$$HRP*FUB,$0HUCYX`]KLK14%[][/]'`G"MKW\!3#YOLEL:>F;M3=EGFI)DV1L*:;X8M2G>R+PPCFI[>3%<>=L=8FKH>>; -M&4W7#DZ'=8WR$!@MEW<2MT9OZPT`'`$``!P!```"````10`!&%UO``!`$0`` -MP*@!`<"H`0(!]`'T`00'Z12J/AP$CB59GC-'&P0JG\DN("0(`````@```/PA -M``#@7P"&O.8[/]J;V8BU3KE"`OJK&DE%\%Q=[T$'= -M)9?4`%P(&ZS*7'$-]E4#^)0P$CBEIQ:<&Q,.+.OTZ5;RWPM"L'NR8G^F`F20 -M93)>6%&O=-=+29^#,%35M%4O.=1*_>:`W+GT-MU6?Z^QR0N%V#O&:.MKH'<2 -MMT:H]@T`_````/P````"````10``^%UP``!`$0``P*@!`<"H`0(!]`'T`.0& -MR12J/AP$CB59GC-'&P0JG\DN("0(`````P```-PA``#`DVJ9N;LH_+&W;M-C -MI#9E@'6>._[#ZPZ8!]%NS#?K&-&1B*?5V!<5NUT`!M#K=^1@%_G^P89WH(8H-'GJ440IM4LQ&WX8&5 -M9&3=6?L>WT8ORPYJ'39(A*N-'ISA!SSEYK<7=2MN;"9C3<;9YQ19M_L",T<; -M!"J?R2X@)"`````#````3"D``#`B0_G*`'9WDJEC;":\M@&L77XA5X_RJTBO -MJDT]?Z6,0_0XK0BZBTM7>2$R%7<2MT92.`X`/`$``#P!```"````10`!.%US -M``!`$0``P*@!`<"H`0(!]`'T`20'"12J/AP$CB59GC-'&P0JG\DN("0(```` -M!````1PA``$`(J!L6`;<<"T-CR4^MF[UV;T0%FQ7*MU8SV^%Z.MK0$^TE!`- -MJUK4P$A>Q^:>YA-=A^$(O2\YVC=;G-6*U=YEO52X+XD_,Z.G#V8*9&N,$7X! -MKS\P1/YCL55V*^R+,8(A^>:A6,^MHDI;`VK4A'RZX%/`F?H:'+$M\:)-"9DI -M;]'>YJ;K!CV4MGA8HOKP$4+7S6"$%&GY-\&=`1=^E5D_\CEW_5;:E'OR*X4' -M\<'SK]QD`/C2D3B;D8>*1>X1'V+AI6G&-<:-4)<&V"+E7>77,T<;!"J?R2X@)`@````%````_"$``.!_)KVVZ,(2X-SJ^L[FV'*=K[K% -MXZW%6*OHU&1B9)L!C;6)WBZ`@`[K83HO(1M2E%&E>R,KO@L,%F.]#(%6D#O] -M&==W\TYN8)%7-=CS4L!Q/^C1[3>KKC\:%T=Y^2R"[.?LXQYU9=6:%?#`X,-[ -MZJSDOJ%Y][KP(UFN0!$()[C*.(U,BHT41UCY:6=XG-(5^/1H1X_[YP-_K.775A\.W'E`=71"$,E2"RXAOZ"4QB=Q*W1H%4#@#L````[`````(```!%``#H -M774``$`1``#`J`$!P*@!`@'T`?0`U`:Y%*H^'`2.)5F>,T<;!"J?R2X@)"`` -M```$````S"$``+`)$0/9N+)H/OT>G7T7<,,A]*"5'.B<<4XI[5P_J6;Q9M$N(;+*^OHP+_O=-4D0O[;0 -M-C!4XOYWSD+7E.)YE\'CL89/-&Y+32G2QS!1A*P@XP/QR255 -M>CO:=Q*W1FAW#@#L````[`````(```!%``#H778``$`1``#`J`$!P*@!`@'T -M`?0`U`:Y%*H^'`2.)5F>,T<;!"J?R2X@)"`````%````S"$``+`1F&.:]DVB -ML)7:A#F=2;FQO'^*B$"`@`;>839Y`[J1MNY&5ZL?/WL0MSC,]^&VSP]8;YB< -MSM'MFCWC"<"T`"D*#9G9,@+C+#HRZGX][B]Y7JCX:)._#VKIRX24V3"62&WR -MMDUA()M(XEH+:@:ZP<356Y7:<@IZR?,[N'ETJ$G;BW,T<; -M!"J?R2X@)`@````&```!'"$``0!SJ(YY7KAJ@B#EF#;V*EY,RG36:Z8C"0:8 -MUZ4@YU?]=?53.E5!PR!ZH?;.H6KQV64;<"25@VC^%W]0[\3<3T4.MA7G'Q`[ -M[JY%;]GOYY/%#".6^5Q75VNW%/<9SPY2QM6,B/,YD]8\-$U13/#W:'`TSS^7]+#(N=*>[E5UL*33 -M=X@?=M6GF*\V+)G.Z+Q**%@5HA'/LVM3\-/"5DE"662P1."*1V]IR8]30X'* -MF"-W$K=&LJ`.`!P!```<`0```@```$4``1A=>```0!$``,"H`0'`J`$"`?0! -M]`$$!^D4JCXYM`YZ2"9D=&J=0&R6EY'XV64@`LI8C@;IW==C$!W?OYS?`E -M-D@KR_Z8[[U%B>&A@C;+BH*'OWA/H(/1#;51OZ,.0Z9]<`"2R*+H:I#E]%UD -M^FZC_/K?(/&_C6O.[YJR[O\:LJ>.$P^R8.?W8FJBD[7?%C&6\NOW,S=-\+B<(6>S,HPB@-_$7IPGI2$S -MZMT#\8C(2#FLA3S^XG6@BY0S8&Y-/8LV"L.0MW$K=&F[$.`.P```#L -M`````@```$4``.A=>@``0!$``,"H`0'`J`$"`?0!]`#4!KD4JCX3]3`R]6A)V -MYW-35P^#I"=M'?OKJV0+6&%P`3 -MD[Y\+)AO4JYTF(V97O5W$K=&&-4.`.P```#L`````@```$4``.A=>P``0!$` -M`,"H`0'`J`$"`?0!]`#4!KD4JCX(H[:4N)T==F/"F;]\._4Q?(&E,?T,U\AM*Y[ -M0"B(KP+Y@3<%JDHG9!).SPSMD/@MX6=DY>AS=I4.:NU'J["1#JJQA)R^$7+A -M`@3CX3D3.S6%EJ:'&IYA.9$IM1C2PUW3E>UJIG#6Q$-S0/V7N2[@Q^KAP:T* -MEO%7W1[!/QC(AJ-K`_@M*1#J7LD&M];"[/&(6QQDFVG9&`\.LDZWL<5W$K=& -M"?L.`(P!``",`0```@```$4``8A=?```0!$``,"H`0'`J`$"`?0!]`%T!UD4 -MJCXECCT("^<*A2=T^7'%?MJP62A871K^&DET])_#=A-8[02`V>]?^)-8'K>3V=L-PVX`1HH\[Y4X&M=H,C -M3L,ELZ*B6''2C6J_<,!U!(XR5>?]>T -M.O%`P:<$&"KLT\GG]Q*\]Y>;6A[W.4DZZ-Z3;Z26M2J7`41%++6)3E0S..P\ -M9F#)ZW;:&S02+;7KXNVC7/T2H(HMN#>`@3OFY!7302R6)4*2=M)A>L$JL)3G -M-8_A1.G;9=X"*;[ON\27_D($@N8HX)-40H]U*\,&(7QI=:6,Z41Y$G0C;74I -M?LLH@#]+WPO66`=T.[^W[]\MW'2ZWQ7XYMJG<*FJT2E%C#9)$=[!ZA*%R^%6 -M5VDW=Q*W1F4P#P!<`0``7`$```(```!%``%877T``$`1``#`J`$!P*@!`@'T -M`?0!1`,T<;!"J?R2X@)"`````(```!/"$``2`;]$3^.&*% -M#E\4Q5R0TYN3MP&XUG7@Y&!8?&N""Z8A>[#0=?/OU''W^&#L"/-P0M]J*(3> -MB"ZC1,0NV[@T>^F=&>93*7?P^FS57#T-,`3'2)9I1(G#GKR_%45BR;*.("A) -M$?RWNUY\4GB4.N0U\:_(MW>$G/&1*PO?!$XF=D0_1617"]6F3#*GK7HS*`H0 -ML\V7I.<@6[?Z3*;7-88WH%&@E=G-R`(HY+-;,E/,TO@Y5\*C=<5#KFZG37?] -M1,;&W.*/E07QIK[%=40,`S@0C$^-LU9$$2=%%B>1?;YC,Z*C_T/VZ1@=Q:48 -MY1C6EGP)C.K./YE[[SS+R?/0RYG+?]CZ.2@!3\[U'8>94*0*R?W][)VOQ!`X -M+@]+L?]V?G@2MT;7%@``?````'P````"````10``>%U^``!`$0``P*@!`<"H -M`0(!]`'T`&0&28%<>U;`+Z(H:6Z"J\;!'>PN("4(`````````%PJ``!`5B[X -M5%LB5??!H4!*,`4.5,/!:AGRG`DEO]MWJKHL4]SYOS<<31$2#B1WQ$GMPX$E -M0YPWXIZA_B2,F6>:>!*W1G,B``!L````;`````(```!%``!H77\``$`1``#` -MJ`$!P*@!`@'T`?0`5`8Y@5Q[5L`OHBAI;H*KQL$=["X@)2``````````3``` -M`#!AYJD>6+?K253_0]*AZ2OO!,3F%V7WV1A`N/N?Z':=Y-U4920)IPG9$SLK -MCW@2MT94,0``;````&P````"````10``:%V```!`$0``P*@!`<"H`0(!]`'T -M`%0&.8%<>U;`+Z(H:6Z"J\;!'>PN("4(`````0```$PJ```PB>:F]XKR*EO' -M@529/W^6M'(^7Z'D#6'@Y4_(^3TNX-4C8@'##$KF?^F#SX=X$K=&M#X``&P` -M``!L`````@```$4``&A=@0``0!$``,"H`0'`J`$"`?0!]`!4!CF!7'M6P"^B -M*&EN@JO&P1WL+B`E(`````$```!,````,!M)SNHE<%"ZKL0./(E@LH,-553U -M%-G"@AK/S1%_Q[-U`W;MG`U^9K(#L:!*W1FXX`0"8`0``F`$```(```!% -M``&478(``$`1``#`J`$!P*@!`@'T`?0!@`=EI,=_S@QR+IP``````````"$@ -M(@@````````!>"(``'@``0!T`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``G]TED7@,P7#RX`1,^GZY!J`!YO?W=^:AW5G(@OT-)!/IG]L`D(Z[98BFJ'+_XI```<``!`!#)%$4RL -M,`A:3Q,MY\+HO&_Z8*4`````'```0`6UL.XHUL%BON$@6%(.J7@2MT9H7`$`N`$``+@!```"````10`!M%V$``!` -M$0``P*@!`<"H`0(!]`'T`:`'A:3'?\X,BON$@6%(.J2(``'@```!T`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``G]TED7@,P7#RX`1,^GZY!J`! -MYO?W=^:AW5G(@OT-)!/IG] -ML`D(Z[98BFJ'+_XI```<``!`!#)%$4RL,`A:3Q,MY\+HO&_Z8*4`````'``` -M0`6UL.XHUL%.6FQ)8`,=F]()=8(UD=#:_C:RC08\3 -M#+,P):5H0*/[8[^`[V;W?_T@&XBEE-"BJQ%RV-])(-O%C/!C!R'N`]%&J9=A -MO3C>V-<;!^=,UZ$*W6YRU!71(P+:";TS1"-*&E#T+-#K;^I;8N!>"F#D4,X3 -M^SRC5#WHGZB6>B3R*0``)!HB8V>B+^;EO-$Y[B4A8JHK*N#QVQC4J"1P@(LD -M>H/W*0``'```0`2UK0,4A':_=THP&$V;7KM[AT/H#P```!P``$`%I9S(%:[' -M!G]G+/K[!:D&0(W#U?!X$K=&TJT!``P!```,`0```@```$4``0A=A@``0!$` -M`,"H`0'`J`$"`?0!]`#T!]FDQW_.#'(NG#]W"4?Z"E>^*Z,DF.Q&R^?"Z6;4O[EUSU6P5/0^4[2$Y%ATDP:TSB\-95\KZAPJ08=9_HCH1 -M/VHX4=,W-0`,?QO_)*#>C(B4>+>L6(%,VSX`'D8NE6&%-Q(L;LV;\Y!]YM&B -MQE]7MVR;1A>"'GH+/=*3\""`\YK9?^GBJE&T/@?=?B56'7ES6<'8X1P(&-*] -MJ=R3!@X>]F@W85W(075SC"C.;,C7QAS5.;W@$7@2MT89QP$`O````+P````" -M````10``N%V'``!`$0``P*@!`<"H`0(!]`'T`*0&B:3'?\X,)C"UL=MDL'K)YW0]\":U -M%^/]$B*Q5>,9I&"%4B8W#*$^KA,'.;&Z/B%D<<7OB<9VT[U0J"-%%M$O'9"M -MJB6R<2E"H8$]CSNMPWGH:)_%[4CL[]E1YRDK]-0X>')0+O74X['- -M%[[8H\1RH9`IW'1,G)93Q3#>>NQ>64>;Q/VU:]W.R&]QUP3JK`41E8[RYHBM -MQ(Y7*P?%3;SUZ4>!F>U$BPKR'/UYVOT;]_9*Y3*YF;EON+2YNQN<_6\[.58RU7 -M@!&5%7P7:$$2*HDO.!288C/S1?@4T(N/IC#XA"VG5KA86I!35JC`*(HM!"&PI -M(U;/3RD*8VJ(D*3%Y6(0U)":"RS,:C'&O8QZ;&2L-M5%7T-X$K=&]?L!`&P` -M``!L`````@```$4``&A=B@``0!$``,"H`0'`J`$"`?0!]`!4!CFDQW_.#'(N -MG#]W"4?ZS*M+_D',].`+H68K%Y>!*W1G%R`@!L````;`````(```!% -M``!H78\``$`1``#`J`$!P*@!`@'T`?0`5`8YI,=_S@QR+IP_=PE'^G-_TRX@ -M)"`````#````3"D``#"GKXC13.%I"_/?M"MS'8-`I/4!'F6M:35!U'W95E)4 -M@IE+;_YG:776/O&4VW@2MT9:C@(`/`$``#P!```"````10`!.%V0``!`$0`` -MP*@!`<"H`0(!]`'T`20'":3'?\X,8.6PA-Y628),:_\)["RW(\W..R -MH4UG3^_JZ0!%:0P!K1ZI*!MU_J11K*A8!G'E6A:R+IWOQF'FE3&I[!D+R`K\ -M[_N)G2RU3Q-L(7:#2D,5,V;8P;8MY*?U:F65>6;\Y8DE-T:_@-9\]I*8!7N6 -MWC;PCLC*G:N?YA;DHVF2J\DZMW'[2"6(\5=_HI:W*'Q10AL&ZZ')/&YATY?' -MAHJ^&_1:K`>!QR4E*G3@V-=8-P`=Q!*W1M29`@`<`0``'`$` -M``(```!%``$879$``$`1``#`J`$!P*@!`@'T`?0!!`?II,=_S@QR+IP_=PE' -M^G-_TRX@)`@````%````_"$``.!JE'QE%6]W82M)NGBT"J(S)AT+;$Y"`U_\ -M`$_\Z[@Z$N("[G-4R0R0\.2>66V_8/SY`%B%>+4!?XPZ*![>Z3D2A- -M&P^0YTY-[>VPHOC&WXVDGPF^I)-OLKR.T&PS`>!]?;DC^7+["H('0<]T.2X% -M*WJ,ELVA4*LO`%R'_#HU3<#J4R##<=K%O:N.K='S[@)%V#.&N%D.&<@E*4#R -M7,]?`E\.#2G2TX,L>;H)4(.EH>^2/X6S5'>-20+"&$`W?&"^)8^N)=ZUG$EP -M2K3`[Q/86)V'RLN.TH&;>!*W1DZI`@#L````[`````(```!%``#H79(``$`1 -M``#`J`$!P*@!`@'T`?0`U`:YI,=_S@QR+IP_=PE'^G-_TRX@)"`````$```` -MS"$``+#")YE9UO9F+:L'&8*;I^\)Q"ZM5:3+V12P<'EUJL0*)$WG%JW376D] -MDY,.5H^"M>W]%AX.KOJ]9E>L=N8XF:#"4.<)PPEV`$7PN>./:5)O&)#\Y^:& -M_U`09:]^>N.]2RUAH<$2%5\>?X$2'3/!/MJR:C&U&(U_\0*OR=#ZX\YE)#@E -M&(U*.WHE''AW)I3,+U%'\FM2`')V-2KSFHP;O7;9U)Y:!5/D3_1.)SLI>!*W -M1ES,`@#L````[`````(```!%``#H79,``$`1``#`J`$!P*@!`@'T`?0`U`:Y -MI,=_S@QR+IP_=PE'^G-_TRX@)"`````%````S"$``+`F55NR_$4?T&W_&9N] -M^VOIJ`PYANIVM*FQ(\5O2A"9U$+H\R^_&-$O3'KSSQUQZBCL49\"=$]X8^^G -M.6#YR7*`[ZB-SJ[LKO+IK]2_Y<2PIKQ5YE2)S_+SOM(_@TY;`]N78B^M_WAF -M0N-*YD/TS"1C\9#)P]N[[_U3+_4Z\-#(JOF2FIA/_4(SM(J`H;-^Y;YYQUDY -M(N1R/5^25EF:5IN@':?)F9G@N$%PWN-(>!*W1I?J`@`\`0``/`$```(```!% -M``$X794``$`1``#`J`$!P*@!`@'T`?0!)`<)I,=_S@QR+IP_=PE'^G-_TRX@ -M)`@````&```!'"$``0"Q.AZ(ND4406KU3F#N=5SZ5JK+NA)/'*3'7T+!CR%) -M!E-,E>)[6*+&E.R]W$Z:CXJ[@LN`<:D2OV7=8O\2ZR:I(,IO6\ZF+NR$?AS+ -M:6%WQ]C4@5/R`6\)P#A`)U["FKK9B/KV'!U22=@$K/S+`TY+P)6!?K -MJ244:H>C>)`LVZB+"S4UNS[5KG. -M\V<*6_J*JWM!V9M`+]_GH,),<^\4PU^,"/@1)MQI/(19$`1(LYYQM=]Q!GDX -M?;FSG^5AM"7*J;#8D_\,X"*YZ9M_M@Z1!2OKZ$$!F-5@]8CPCHN32B$1SK'4 -MG\V>")_4%<$S$'/`%0ZD+(S&_'SQ7DMXS7V*PQ_EBY1&L3\*G1+2CVA7?;8$ -MKM&+72ZB9Q!6)%7QS\8!B@=]?CV\Q)MN32&S:3#9\H(OL*S6&+>4IQI)32*2 -MWHD0YSJP:#9)5S/M&HZO15Z(AM;"BYDOR15X$K=&,P8#`.P```#L`````@`` -M`$4``.A=EP``0!$``,"H`0'`J`$"`?0!]`#4!KFDQW_.#'(NG#]W"4?ZK,WB\WN5/LAQ+QJ: -M!#J$1>B_/PL1V1XFJ]=O+5Y_RO>^"QXCU2442CM$]TN*=#6LPV)."!+&EK42Y_LW"]&0*@<.1DE61(OJ!LRJ -MFN3Q58.`7)(B9,ATPSAI%^:TF8A0MWN0%^9;-E3)=`.O'LL2=3AZ,\_.>!B_ -M#NZU>/\_ZR]X$K=&]BD#`.P```#L`````@```$4``.A=F```0!$``,"H`0'` -MJ`$"`?0!]`#4!KFDQW_.#'(NG#]W"4?Z0"I8PGP4\*6Z2"3WU/)&[CJ3W=7)J/&M=`I-.;AX$K=&ST\#`(P! -M``",`0```@```$4``8A=F0``0!$``,"H`0'`J`$"`?0!]`%T!UFDQW_.#'(N -MG#]W"4?Z1*>3E["VKR78M< -M8C_BH:TGIBOM1'SN9=TQY3FN<4[\]?2&Q=,>Y]2D`9W'7:!]4Z/AP4VO[L`8 -MUN!X'6-QE(DK50!P?8E&1`#WJ*E<&<#.=`%2C]1;3*FX1@/G`]*7H:=>]N.S_52#UC1T$9V.BH00_%Q\[!E[W/W]Q$\ -M#DN38#./0S!0[V^UO9!*1*1;XWJ_4!X!P!H'M##O,']R$?U<97BG3PB/L\_$ -M-D^7ML-U7939'PXS>;3*JPK9G5--C-@`X&:+@Q&&==RM$=>M]8BBA3J:O"[Q -M`<_--GQC=PR,BMX:OW5323Y(-BG1^%(&0@/DBR#N+89"B?HY80U+$9D3>!*W -M1CJ$`P!<`0``7`$```(```!%``%879H``$`1``#`J`$!P*@!`@'T`?0!1`[VA8`N7VZ)D&=.?;+I\"@]J4-Q -MGG)J[R0VAG'+R=!>V!V;40#NVO'?E.,?4>9N@'X0+OTZ>^$(J)V[7%!X3K7& -MT*8_M.KMY"3?%@6'F"3YR1E$!'K#F*G28\MJ[6H65%*U,S[W]NYW,FNXPXT) -M4*0,NMP-__9`(F"6M-!3YH4HKDFQ0_>!N>3\I4AJ!$G82;5P3E!,"TVWJ\8/ -M4/[M75NW]+&AC_""'DD=2IM64PWW?_RRF3.8_B:<$]DZ%V;``!`$0``P*@!`<"H`0(!]`'T -M`&0&2=F%8)Q&9+'/;<'E.@IF"64N("4(`````````%PJ``!`@*:XD\`R^+-4 -M<@??Q!<)NS+!*W1@6W`P!L````;`````(```!%``!H79P``$`1``#`J`$!P*@! -M`@'T`?0`5`8YV85@G$9DL<]MP>4Z"F8)92X@)2``````````3````#`M6NFW -M:PR3GV[^=%G,;X:3S8"^"HRF=2SW4=:E[^*BM6P9>4(D,(S&N2QPE'@2MT;? -MQ0,`;````&P````"````10``:%V=``!`$0``P*@!`<"H`0(!]`'T`%0&.=F% -M8)Q&9+'/;<'E.@IF"64N("4(`````0```$PJ```PQJCR:/3*5B@)><9L;:;G -M_K`ALZL&%D]>)X$K=&^-(#`&P```!L```` -M`@```$4``&A=G@``0!$``,"H`0'`J`$"`?0!]`!4!CG9A6"<1F2QSVW!Y3H* -M9@EE+B`E(`````$```!,````,`"ZD=,ECCBD`-GA,\$H4X``7I]9,Z/[@7GJ -MWT??/"/:S:\$#>%GHF%$E#_S>!*W1G/2!`"8`0``F`$```(```!%``&47:$` -M`$`1``#`J`$!P*@!`@'T`?0!@`=E/K[]*.1V-(P``````````"$@(@@````` -M```!>"(``'@``@!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``C0X( -M>C.P>9CKRKG`95?JQ<5%F@LT[\,P9(T"; -M";;(2=,\YEL<:5EJ1OIT"<1*O&=&B\I5SE:;"(/_]M03J"KR/AN2T5TZ%&@E -M(>$L@O\R@'/64F6M6HM2.[K4[VI#>YW@VO>M"'Z[`:9&KLXI```D/T%2HE*\ -MEB6_&#O$2'X`XOT8%Q??I.?;_)6C@DK5"D4I```<``!`!/J4-$'%M2?30/'G -MC?3PD@\4\6`+````'```0`6U';.1NY,)0CQXO>O/,G>T0!/?+G@2MT:-X00` -M7````%P````"````10``6%VB``!`$0``P*@!`<"H`0(!]`'T`$0&*3Z^_2CD -M=C2,```````````I("(@`````````#P````@``!`!@````<@UI-A?Y9%\HHQ -M%3F<6HO/Y#C.P>9CKRKG`95?JQ<5%F@LT[\,P -M9(T";";;(2=,\YEL<:5EJ1OIT"<1*O&=& -MB\I5SE:;"(/_]M03J"KR/AN2T5TZ%&@E(>$L@O\R@'/64F6M6HM2.[K4[VI# -M>YW@VO>M"'Z[`:9&KLXI```D/T%2HE*\EB6_&#O$2'X`XOT8%Q??I.?;_)6C -M@DK5"D4I```<``!`!/J4-$'%M2?30/'GC?3PD@\4\6`+````'```0`6U';.1 -MNY,)0CQXO>O/,G>T0!/?+G@2MT;N%04`4`$``%`!```"````10`!3%VD``!` -M$0``P*@!`<"H`0(!]`'T`3@''3Z^_2CD=C2,UU7.AER7#PXA("(@```````` -M`3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"```` -M"`0```(H``"(``(``*4N/,1IQQKAN"&%)0$2]E4@&;[3O,('A)''YJZ"FZXM -MOBU#FW>_G7U^TG`C"\[892E!F@%Y$CL;$A>MS:6(27ND(T++NB28]),"V)/* -M89S3VKF[$KO-%$A2)VFG9NA'U."T7-_5M*2.>`DC0^8N5%_SXT,)]7HOW[30 -M$G.&83#A*0``)"BT\@0+(J4VSSU-D\>7962/)('AN\1&UNG+`CWFRX7%*0`` -M'```0`0TZ9`%:4ABO5I^EVLOU'UDY#5J90```!P``$`%;,A!91^L^X:Y+483 -M=PXK*^6+!WYX$K=&0$H%``P!```,`0```@```$4``0A=I@``0!$``,"H`0'` -MJ`$"`?0!]`#T!]D^OOTHY'8TC-=5SH9MFW@/*=,)Q^A_9JBM)^JSOH<3!CGKZ1^OW[\#`AO+NN)*I^%2H-S?,QHXK+ -MMCL(9$OTK9"BE*+7U92F4#:U:!2:E"GHQ]B&/"UK'HQQ`627(J]4(?TM+$^! -MQ\4=-ZR7TQ53D<%JGOX57=#9PL"=^X370^I\'J83AG@.0M#NJ[Q\*`PZZM_J -M%\Q*MIDRB[?\7-?:X;VU1RYOS4>6C%#`Z:5QZ/4+BINX7C)NN`!$H2999WD7 -M>6/N`@XN&8:9+]@'2&1'P;_QS^FB4G@2MT;N8@4`O````+P````"````10`` -MN%VG``!`$0``P*@!`<"H`0(!]`'T`*0&B3Z^_2CD=C2,UU7.AER7#PXN(",@ -M`````0```)PD``"`MOC>*C-,F+ESV%N!CK(HH>WJ[0H0/G@S6]%UDFO]EQ]W -MZHHP.$0VS>3*JJT\&NSIX)XQIE<'6G"B]NDWQ65 -MVG@2MT90@@4`'`$``!P!```"````10`!&%VH``!`$0``P*@!`<"H`0(!]`'T -M`00'Z3Z^_2CD=C2,UU7.AER7#PXN("0(`````@```/PA``#@".NF)-9[G,$V -M_950_ADT^2XMD2MGW7W&<$X4V24IV*\M$6"8VH=!*RXC"A80).V])Z!7"SGEJ321E*VNBS`LBP-0[YL3.]-:90VZ7O\RC0ZE0S8 -MA822>)O'1T&R<%0Q[+_V"Q"@ARB9998A4^1X9<13VN/#FMBFN*':&2@> -MEU>/?UQ#8MA8N!<(1O!&I77).8;,0!5]^Z:0OK*TD)J+<'OC<7RC[`(*"?NY -M]#W,RM_R(P,K&=4NI5"8U(@:AE2'5%C7R%2/*6^VL'@2MT8JC@4`_````/P` -M```"````10``^%VI``!`$0``P*@!`<"H`0(!]`'T`.0&R3Z^_2CD=C2,UU7. -MAER7#PXN("0(`````P```-PA``#`I')"HX+^3>4E?#.]>B;=:A^;.N^9,Y2> -M[1BJK&ZJK::`M2DSFITE=EZ(:O<1I*5>-(\?/0)GF"?%&N$)*'YIK?/ROL49 -M/D+MH\&HKZ#)N5#,H!&D8$!C:8?;H%YP'X6Z"2*:0_"X%L'7ZB@YJ)+:V7O1 -M\*JQ/VO4)5ZKP13X\NQMD3_6D0W)_"00OJA"T8UT[*QVWC.)/(2B4$SVGI!" -M&,5R1OG1=D]A$-6@L3TD\@+DI#]L",-W+E/SQC!X$K=&.9D%`&P```!L```` -M`@```$4``&A=J@``0!$``,"H`0'`J`$"`?0!]`!4!CD^OOTHY'8TC-=5SH9< -MEP\.+B`D(`````(```!,*0``,.0!,VEL*D-.39\%BP'.:=R2-X$O;;[@!X`Y -M!NV!#H9U.(F3I"^06EHY[_GD>!*W1E^T!0!L````;`````(```!%``!H7:L` -M`$`1``#`J`$!P*@!`@'T`?0`5`8Y/K[]*.1V-(S75/U(QN4<571$@UR88Y!BS0=/^[`]=:^]5LJ5+X6 -MZO^I7MS_>C<%48.9H_]$)'F\+5QB9%CQ.:TI%[UB9P(W`O7;K"5-SD0KB\>];S2/DIGF8[ -M;GKIPS8BR0L"$LZM11_\3:X6P4YT.R!P>!*W1E;=!0`<`0``'`$```(```!% -M``$87:X``$`1``#`J`$!P*@!`@'T`?0!!`?I/K[]*.1V-(S751I^=?0TQD*8I//^4Z.7/,3G$N?/C\PD.,%_>&6#U8#YE?O626.^.4 -MB?%XU/'H9Q'J34:49B'7B6:&$'WF,"#X4+440JJWA?F(4_%[ELOWL(-[;#^P -M^WRDM_BM5F^!>!*W1HSL!0#L````[`````(```!%``#H7:\``$`1``#`J`$! -MP*@!`@'T`?0`U`:Y/K[]*.1V-(S75;]=6Y8B**&H+(D^<-6L951 -MA+LX:B<0C="O,,I(#W%74G8SBV-?&G3@7+4;SDQA(N94B8\UMHF9VEI.K&TT -MV3I>,L>L8KX'A-J6H0A73FV4N%2A8N6P.)?#F]IZ)%,U+*Q+>!*W1E\/!@#L -M````[`````(```!%``#H7;```$`1``#`J`$!P*@!`@'T`?0`U`:Y/K[]*.1V -M-(S75\H7_P`:WR]CA#[UWW9#M#`LL]ZU -MPC;96SV'AC-[]J;D)H93,NIJ;1EJ?%D&[N"&G>,<47+5/$;112/6*&6H?RS, -M@(KO(20-SY90^+\Y\?'BC4@`4D1Q -M\L,2:]^LWR7Y``DZ`,);)>/&>!*W1D`SRQ*U;`;`WDE2(BS=Z&YRS0@[O2I&*\!/;?. -M/9&U6[H.Y$8SE/CZR);$L6<$FTTB#(_,4:N6E`48N>=U:R^B*2X;0MD>( -M4E];9L42#H\)T-)GK?1=^Y`%"ML;WL\):O]"5*-K%;M/=FKLQX@UHA=?D5"J -M+ET<5Z95"5SM[A?8!>DTG"83#E_0Y*M$`EM>OT2[:9'5GD\S^/]D+JS//MY3)1IV=G? -M.@(W\_`+PT1]_S(FI5#^J/>FE*>V%5SK_82$D^%X$K=&ISD&`!P! -M```<`0```@```$4``1A=L@``0!$``,"H`0'`J`$"`?0!]`$$!^D^OOTHY'8T -MC-=5SH9_)31R+O -M4P7,S:98UTZ8ZYC3@T";MMQJR"SLL:'+LS42F;$7SPN^6,X.^K1@48HXUZ#8 -M:N4\KC#DPB7--$V9#0SXN3==1'2(.3C4"M;/`X39$Y66,EMUC)F8Y#F2?E$! -MJ='.K:<812ZW1%[R1.0YC2.)43S<;*X:%.Z?YCKBE2^;(XV:Q71[4:=9*E?_ -MW>G9-\-=/U0`#^Y!)]4O;EX -M>4JIEF)@C!3N1SEX$K=&_TD&`.P```#L`````@```$4``.A= -MLP``0!$``,"H`0'`J`$"`?0!]`#4!KD^OOTHY'8TC-=5SH9I[(9KC4^Z:.OL[7T"6\HR2BJG%4,X`"[K1$#^\JS` -M+&.H-A`L!T!=RVK&%'[(>0/BABE5D1=VQF/<@BS!7QZ_(?2%R5;H0S*.S@]W -M+F9"FY`:*8:*#I'-MF:.%X++?$Z:@UF%N2FN9DU\_;L?T_1C;)7&'0XP:(.I -M&*D]`*!<#+G`C173UOF=&Z/JRC[A3_=0<=#VHS%WW8GYO=?XGR'Y$"!.(B0% -M%"QX$K=&66P&`.P```#L`````@```$4``.A=M```0!$``,"H`0'`J`$"`?0! -M]`#4!KD^OOTHY'8TC-=5SH9P3R4IO)D7*@J`)PWPG@CL; -M;2LPE5'L5]Q*(JE`-P^`>\JTOX>W*P'(TD?*#X0_@,S^P9+9U?L(+=-``@HW -M&(TWAAD8W7KVTQL8PD&WC9/;##R"3+7W@M%F%LY!;!RY'Q4%P3%-^N[U.0M&,O@S."+'=G!X$K=&*Y,&`(P!``",`0`` -M`@```$4``8A=M@``0!$``,"H`0'`J`$"`?0!]`%T!UD^OOTHY'8TC-=5SH9< -MEP\.+B`D"`````@```%L(0`!4!RI6%]27OB&`V"XD!UW[-;Y/=0Z=CE1S8Z: -M252%4W](\Z]%D@)/9;#`?M!ULWWSC#8AM^+XI:(J_?N4$T+Y.L&%W,*AT!7? -M5D8.?<9E]&^[]?E\=!+]HAL1#'G;)>4&1$+)'^2!ZT3EX=$FPZW>;WVPC21) -M'RK7K*>4\:L%>SH%K'"\%S!ZP(S)R]3/8&>U<^0SP,,C94(9;1P,565#GR&4?P#$91&$T*N>_0S3 -ME9M:HR00_>B>;Z"K]1\A]!)38R?IBFVV^Z=`_=E&1\K$\+4!R>DWTG;3H.@= -MT36GO#==77G/#!V0$1.DO=3XFT!U!8BWSH18YO//N/`I+943>!*W1K;'!@!< -M`0``7`$```(```!%``%87;<``$`1``#`J`$!P*@!`@'T`?0!1`H3,<.)LK*PN.U\<\B_E%.D95MKWKX*KZ*9C?TY=_8- -M34M"9P7V!X``$&8'\S!/^9-/Q-RAN'O5ZSP*?V:>K$V4.,_(V!>U1_PF'?$R -MIVQVEDT5I\>6A4T@_'B5,6U&7V=I87W>N8A0=IR(E\67NIG]&NSVO'#)!OKE -M5!7JB`M^/TB@.32$DVK"]&#>*?3Q(IY2-;3@M?3,F.]LE#_DZ6M,2.7(;$A^ -MZ1Z<\P7X>GW/_/Q^S+OD$5`)!D)01*M@_82JS/XKEAG@UX6N)#C%F^\V<.@3 -M,U0!(-M`EQH'R=%P'VH&5NX.-/K(2)4_^J(+3_=Z7!`*59G83B=UF'@2MT9Z -M\`8`?````'P````"````10``>%VX``!`$0``P*@!`<"H`0(!]`'T`&0&2:)( -MJTO?1T#?S)59&,Q8W%0N("4(`````````%PJ``!`39^XZ9)H7W\J1M>&N)[' -MEPP(4^%UX)7GJZ^I.,-.=ZYT)Y94+*J8@*#:I2C3]7`^`=E'40C/%,?'LI+O -M>!*W1CW\!@!L````;`````(```!%``!H7;D``$`1``#`J`$!P*@!`@'T`?0` -M5`8YHDBK2]]'0-_,E5D8S%C<5"X@)2``````````3````#!0-L^[G`[OOQ"7,EAUR=MQE[G@2MT;@"@<`;``` -M`&P````"````10``:%VZ``!`$0``P*@!`<"H`0(!]`'T`%0&.:)(JTO?1T#? -MS)59&,Q8W%0N("4(`````0```$PJ```PEDCI)(54FG2P:7'8ZRD0WV6.?/F$ -MN5HB?'("3#>UY)KPHK'5]>!*W1F\6"`"8`0``F`$```(```!%``&47;X``$`1``#` -MJ`$!P*@!`@'T`?0!@`=E1RI'M*A58)(``````````"$@(@@````````!>"(` -M`'@``P!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``K&X.N2AHH,41/3M:46T' -M,4K,;V:69"O!:'*2L*E[66XN<*@QZX9NO_(`*8$I```D<0_*S^0-C"O]?_]* -M#[OZD]HR^A9*]FG29JG%.(I```<``!`!%.P4FHP_W,G_6J\OD\^2.O$W9U -MB#6GZG@2MT:M2`@`N`$``+@!```"````10`!M%W,``!`$0``P*@!`<"H`0(! -M]`'T`:`'A4HP_W,G_6J\OD\^2.O$W9UB#6GZB(``'@```!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``K&X.N2AHH,41/3M:46T',4K,;V:69"O!:'*2L*E[66XN<*@Q -MZX9NO_(`*8$I```D<0_*S^0-C"O]?_]*#[OZD]HR^A9*]FG29JG%.(I -M```<``!`!%.P4F&O>;JA\Z,\.D%0QN@```!P``$`%!B`12-YJ:F:01]M9;>@_LCR8 -ML)MX$K=&T)D(``P!```,`0```@```$4``0A=S@``0!$``,"H`0'`J`$"`?0! -M]`#T!]E'*D>TJ%5@DKBIW>PD(O/-+B`C"`````$```#L(P``T$VS(`*90>`5 -M9Q1>/%V[ZUME4;EIGC-#8B$O_,P3QH\)@JG+[V`$6""/XH_B(Q>=^>;HDZ4@ -M#P@\"1SL[R&::8545X51P)-OAK]8Y`[F1PPD!^=U;ZDNHK2@4%CTGX65O!!7 -MK@,<`@'@&>_?7M3`E<18I&":2-@V7$(B9H8OG]>\A4ITJ-8*`'(9#2(8,7&K -M@4/I-]XT(($C&S]4W2DYJM[4]H.#=&"0F10-(3E`$X?_-F[)MB.XW^0Y-K+Q -M;!SEGNJ**8'2?XKD3@YQ&\5ZDCP+8Z[E4A!^7%N?J2%OX\9)@\C+/'9P1J&H -MW9O]MW)F74)?8#?=#S3!*1'&5J_OF%,!TA1DN]W"A/0KP!A/1IY'FG+T\F"/B'1*^Z+E%GW;PS -M1Y'GRQ%8GJ%%@SA[M*J-G?AV\RCSV0,_&,C>2_@]<1\=K#@F;;NHNH"S6OWA -MCIL]IM;43-J6*F0)FJIIVKG:::I_F)(WFL5%!`%'.G!E/8,DP@=KX_Q!CL4% -MWC0#7PNHLW5(H/M`N*,^"/!L`#(GEC"M_6W@-7A@NPK>7^<^I\96-5-96=T@ -MV?/P+B5&I$D`#NMOIAC&:"V`@IM8M(=G?'@2MT:*UP@`_````/P````"```` -M10``^%W1``!`$0``P*@!`<"H`0(!]`'T`.0&R4"-P\XUU+'N.`?X'OG^1(6('UCIQ>;XH -M$")#T-PZK(O)8YY[8'ULH;RP8L&'R5?Z^;5Q-96GG'(@UA,O*B`6LOP3KQXA -MLZN`^UC,BI-!6-6`DB(.J*/0U+1RJ"U2H=ZP-SK2MGF2WS/&K(FYVOPNP0Q( -M-?J9F7M9JCY:YSR_B&.TLTLW`T@6_YYX$K=&L.<(`&P```!L`````@```$4` -M`&A=T@``0!$``,"H`0'`J`$"`?0!]`!4!CE'*D>TJ%5@DKBIW>PD(O/-+B`D -M(`````(```!,*0``,->3*0[3!.HOJ-?ZAB8@?`_MJ:#4"!6;"4D\S"-P8-`F -M5.+M28U31E@M+Q^(>!*W1C$%"0!L````;`````(```!%``!H7=,``$`1``#` -MJ`$!P*@!`@'T`?0`5`8Y1RI'M*A58)*XJ=WL)"+SS2X@)"`````#````3"D` -M`#!*OG>]A`C$0[L@-KP&U>6+.7C$"EE9,,-B11/7=#@Y]44R,\"WP3&N>(_, -MC7@2MT;='PD`/`$``#P!```"````10`!.%W4``!`$0``P*@!`<"H`0(!]`'T -M`20'"4NE5\_T?[.1S(RDCAT[M%86$K,^UBUN@QIC -MJ(&=<;P>$F`XM^@SS\XZ%IMZ&:AMZUWL()6'&YF/9Y&-C676$Z]A)%N3U0&6 -M;W0':\V>6-70-;C=39[N@5H8LBEZB>\"K3NE!W_KZ'8)NI%!HT.H[V+XAI@; -M?+HW[D]<$\LK0C^94K\(^DSQFXO!VMJ(Z3&.JE`UKB/\8MQ>0@HL2)KT%/'/ -MLI!'J6D4HUT)+]+NYZ.VF'6!$9.:I:%X5XW'-&E760?A/&NCF;?P3ICB@^1D -M=(#F/8S3:NIF`%/#B!67+O27>!*W1NXK"0`<`0``'`$```(```!%``$87=4` -M`$`1``#`J`$!P*@!`@'T`?0!!`?I1RI'M*A58)*XJ=WL)"+SS2X@)`@````% -M````_"$``.!\UEFA;3S^ED5Y1(<.2_;VRC5@SGQ^%"=8UK[$8^<6>R>6^6*: -M9Q5"R4I:]I*,A0Y"]&Q/?T"U]A5;>H-IPRUY8WDM*C:U=/L -MZ5]=>F'T,[S;?T3AK6BB"!(6-`$;N^Y\Z_5D76C,7*"$Z2`SSWVS8'GX%V:1 -M-COC(-L@89&&;(N]['ETC`W@:1?)9>N1RK&*H+BDH"W_E@I`FC3!:7TI`FK,>,+V]U<(,X'&1F_TNF2*G3L(D$;0/;_3G[##/BF(@C<.-CT3B -M`,N7>!*W1F8^"0#L````[`````(```!%``#H7=@``$`1``#`J`$!P*@!`@'T -M`?0`U`:Y1RI'M*A58)*XJ=WL)"+SS2X@)"`````$````S"$``+`CPW%_H!TW -M]'*$[7$W]V`O,G/.#',UJ%;^$&EM-E/.#0#WO`))+;HUZJ3&;A'S`P9GL#.;`2X3"L%6'"&0"JKMS>38`TNY&Q -M^;#/.$68GH>WM=H#5!*W1E1@"0#L````[``` -M``(```!%``#H7=D``$`1``#`J`$!P*@!`@'T`?0`U`:Y1RI'M*A58)*XJ=WL -M)"+SS2X@)"`````%````S"$``+`)Q0$+S]@B,*X6HTIG(J*6E%?_P@-8<9Q; -M7@!"X=UK+Q[+YQ`+HQYB:KNE.U!'"9HP,)[B_7DB1)]9Y!SGK*G/(W8(%8A:'U<@GY]6MV4A8SS>3F^T]+_:7HEB;) -MH+I9-U*KM%MQ&9ZN7'5@_SOG+9+YWX!H*EX202M[=U-M&#F;U+IT#V*=C8"J>!*W1D1]"0`\`0``/`$```(```!%``$X7=H``$`1``#` -MJ`$!P*@!`@'T`?0!)`<)1RI'M*A58)*XJ=WL)"+SS2X@)`@````&```!'"$` -M`0!QO0K->X6WW%GKX`T#1L-;PR#2W4<$6$I:(4@OI!DM<_66/YC=!G`,>)0N -MI$6<"8E(S<2F&T]!7;6'6,O\0A-:5JU62>.]9D-/S"U"$R$T/N$X(Z)5:STY -MJ!&-E[:`8_<^J2PH7G.P04H..S?>E]F(=C*QX3T)XHI@O/)Y@]]-$_ZL-K-0 -M.1`#*\?U&>0O'_N8170W[LE9#\A$`V_T&["9_$910L2:IO,:E,BYK]@\N];O -M5?'8:;+_P;'_5)F,N>=Y9ZZCH4)8FUXM'HF -M'-QCIC.B;,_5HB/@/IWO*7V>\L&DIR_+^O&Z7UMX$K=&8HH)`!P!```<`0`` -M`@```$4``1A=VP``0!$``,"H`0'`J`$"`?0!]`$$!^E'*D>TJ%5@DKBIW>PD -M(O/-+B`D"`````<```#\(0``X,V[(#2[+UU=M9UN#CY.B)Z$5!Y%PIG2@^29 -MRJ,<`%ZBG:N=9X%E]A:FKM[[4]'*+ -M0D9>PMD9D@R38P-J$O),5:R+#U>2Y.+=9G2KO\C!_H4VH9XFI6:4%!=ML&57NRH_H$O'*A_R8VJ!5+T2+E#,J! -MW'(-UO^*Q`2/?=CQ!IMX$K=&KIH)`.P```#L`````@```$4``.A=W```0!$` -M`,"H`0'`J`$"`?0!]`#4!KE'*D>TJ%5@DKBIW>PD(O/-+B`D(`````8```#, -M(0``L.4%FM7@E7IQ)#4I"YT\=[&HR!&J5HE9*9G`D)GST:(N*WH$$!D"')'\ -MUP$Q4\H25HI-P=C?3<7:JY]#I]II-WJ[K+Z?F)\&MWT,3S`.T(ZZH>\K#+\M -MX+Z;3K^E@D)71V=C3+!I[NPQ_<,B7Z7OQ@'@4WK&/&NM6]I"_,1:GN^>'00R -MV,A6WS$TJ%5@DKBIW>PD(O/-+B`D(`````<```#,(0``L-[\TH]VD0/>C#=`$3DT -MLO,31_Q&NE'D7.O%K>B8E[7&FV5_.8K#T%H+#!7;&OX[XX8KG- -M-M1>C7HBI"8)>2_'!RA'52:4<_RI7?&1&>@PY*+F^*6-VM'K(3,LD%#):+$> -M?I'F6P1?6HNKP7FJ35/E\VGO30:)&"*41'7?YN0#E_[>9D_VF/)UVGO?`I64 -M=^Z_-QC=:!D/EGWO26D-,/W=6EMWBRQX$K=&#.D)`(P!``",`0```@```$4` -M`8A=WP``0!$``,"H`0'`J`$"`?0!]`%T!UE'*D>TJ%5@DKBIW>PD(O/-+B`D -M"`````@```%L(0`!4(@RE-<5PD`Z=%^OJNC&EKG*];AFP^B?WBD=WO^UH;8; -MJX#/!L]#=5!0XJ]>]PN7R@SLI]K/>@\M<%.GX!`0(4PSB6*Q"HMSE,'D+F9`S&'A3U'2-LW8[>Q97%\@155QEQ"Z+]C2 -M7QR!=Q:1=>9.E;%1B>W-P5N[!L>C^J<)'.`P+#Z).M;Q`]`-\JV,OEOUJHM^ -M7]^V>MBA3F/%[T0P>25VI`;FN$RP:G7N:\-`KR0(8JS(35Z1%XFG'TJ50J]H -MH@A7]^S9"P_PW^QY$NX6`&*S]\4]A^9KK>\0)YB9<>K/N\BBO6Y$S';V,JDU -MC_+U5%SUTDP*M9V0`DBWH?'W+8=M5^8]6!WP\4U2UEL*&;(=!Q!=TDJ14R,' -M>RUQ[AY9=.PA5_G8Z:?:Q8??"I*;982D2?3`IPND>!*W1D$="@!<`0``7`$` -M``(```!%``%87>```$`1``#`J`$!P*@!`@'T`?0!1`3T2R.<:BF@I/\6X0WZJ.M#^ZN.3&H( -M=L#Y.'PCA?X:[GX?;/V54(LIXG<+CQX,-W!/- -MOHSB(2DD;X<8_5/.T64MQVQ`"NYU.$KXD]%(WY=Y,;^"`1YSV<6^-F#P*:[/ -M0T=G-[8:A9X/*IM4E35[#ZIL)&T<`P=4(6P=L&#-_:LNP4S$1897;5UW8AQ= -MR/Y\RCFDX4CUI7Z,&!/:3$6B`]K&Q'/&^866[(PS49ZB2?LN`4)5AOOQQ%)% -M_L4VNZ4>BEUFG:FEG\'*X1>QFK=)M2P0FOY?VVV4U-&O"W@2MT;01`H`?``` -M`'P````"````10``>%WA``!`$0``P*@!`<"H`0(!]`'T`&0&22Y!W*`WK)<) -M=X0V_E3I[-(N("4(`````````%PJ``!`C4Q2:\GX#R[M'9:1Y]RCODIMWNE] -M2N^A49H\&1^J9;^"'!*W1D!0 -M"@!L````;`````(```!%``!H7>(``$`1``#`J`$!P*@!`@'T`?0`5`8Y+D'< -MH#>LEPEWA#;^5.GLTBX@)2``````````3````#!TK*V91M`,>C=DB%KE>OH4 -MO,N"+)R#??;_D%"H4&C=L,PF?<)B?2EM&':>''@2MT:S7PH`;````&P````" -M````10``:%WC``!`$0``P*@!`<"H`0(!]`'T`%0&.2Y!W*`WK)<)=X0V_E3I -M[-(N("4(`````0```$PJ```PM"1[(N/]$'L2[CI'"%M(H['8=5IK2L=U9JF< -M]*8"@I*YHJ/T[T4K6M8W>[]X$K=&/VT*`&P```!L`````@```$4``&A=Y``` -M0!$``,"H`0'`J`$"`?0!]`!4!CDN0=R@-ZR7"7>$-OY4Z>S2+B`E(`````$` -M``!,````,+Y)1957/@GSHL!H8B-MMA8E[&98D.9>U!*W1O9K"P"8`0``F`$```(```!%``&47>D``$`1``#`J`$!P*@! -M`@'T`?0!@`=E%;2;T=?2(",``````````"$@(@@````````!>"(``'@`!`!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``2D%F$:=7-LR9X!XE9A`C -M><(UCMZ4L6^P(;:,]A=T6XYX,==F&"1WC@`(.::NR#!"]N7E,Q86/T_'WT/0 -M!<8O\)F,$&D-[KMK72A>&WT2K=%Y><6E:UT:';-]8X\POSUK*?(<9QI*$VDO -M;7O9@MEB-J#!6M'-\\I=10UM5K,?-:PI```D23YMHJ]08O,8]>_W97$,I#E_ -M5T__7D;-2WAL(^0P+-`I```<``!`!!_)]NK9Y25!C%='D<\_0IR$U`W1```` -M'```0`5/U73JK`PL`7````%P````"```` -M10``6%WJ``!`$0``P*@!`<"H`0(!]`'T`$0&*16TF]'7TB`C```````````I -M("(@`````````#P````@``!`!@````=U=(%XJQ7CAG#MG(AL?&"[6[%?$G@2 -MMT9HBPL`N`$``+@!```"````10`!M%WK``!`$0``P*@!`<"H`0(!]`'T`:`' -MA16TF]'7TB`C```````````I("((`````````9@A```@``!`!@````=U=(%X -MJQ7CAG#MG(AL?&"[6[%?$B(``'@```!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``2D%F$:=7-LR9X!XE9A`C><(UCMZ4L6^P(;:,]A=T6XYX,==F -M&"1WC@`(.::NR#!"]N7E,Q86/T_'WT/0!<8O\)F,$&D-[KMK72A>&WT2K=%Y -M><6E:UT:';-]8X\POSUK*?(<9QI*$VDO;7O9@MEB-J#!6M'-\\I=10UM5K,? -M-:PI```D23YMHJ]08O,8]>_W97$,I#E_5T__7D;-2WAL(^0P+-`I```<``!` -M!!_)]NK9Y25!C%='D<\_0IR$U`W1````'```0`5/U73JK`1N3IN‹?,5UY^,W4_#I[<1!,8>M(3Q3'#U -M.H,+VP>>:X''Q3*?8ILK*=@B+9D4:<^70L\Q_607[-,9*$"-E -MSO-$Q_<7Q']6!2E`AJ@'OH\N?K50Y+)H%MF9:7#O/5M?ZDNVSL"'*0``).8J -MTFG-V++=PPTV!DB'&R/7+@C=ZO-V_V9_PJ]Y"Z42*0``'```0`2Q3F324#&# -MIZN6'\+`Q3<=`"ZC90```!P``$`%%]H7^((F_YMFW]/-[XWSV!5/C2%X$K=& -M&-P+``P!```,`0```@```$4``0A=[0``0!$``,"H`0'`J`$"`?0!]`#T!]D5 -MM)O1U](@(\JG13KV4U=Z+B`C"`````$```#L(P``T-J2DL&Z%6_N185Q5#^& -M8A!U_T&L/\[PTLG'7#XRO(6"7`I&,0T2)F`(XL%H@8Y2W;7,N,PC -MZ])GV[/1>&ZA(=(I9T=%*AOIJ+EEMW-UPRU(#J]3N@)5,0%YFK&P_^85I@Q+ -M"VMPCG[4STCBJ#L\4.W)H.>7H4J:OC0:FAE%0&83ZZ`?:=N0CC*,@'%[(,., -M@W+FU>.R4TQ9WW@2MT:@]`L`O````+P````"````10``N%WN``!`$0``P*@! -M`<"H`0(!]`'T`*0&B16TF]'7TB`CRJ=%.O935WHN(",@`````0```)PD``"` -MEU?E.;6Q]EC#S]2%WF!4DR3@)7*_6_A>7'/81S_T#>J]71Y=J7W>GNDS'ZYC -M.!O8S-N^40:MK0%:J'BFI\['_NV3.]2H>*J+](Y+T$6R5#O"AR+_M4Y)6?"Y -M&4+Z.M4Z$EQNSX+\UN`S#:!(&'8G21!EX^ROS<>.C,T`67@2MT;6$PP`'`$` -M`!P!```"````10`!&%WO``!`$0``P*@!`<"H`0(!]`'T`00'Z16TF]'7TB`C -MRJ=%.O935WHN("0(`````@```/PA``#@!='Z7<$ES\B?L(2.&#M&1&SB%`[7 -M.Y,X4]L>CO#\!@J<071>V/JU*CKAD#+RDM4S*QJ-Z/5BY>HA>3TWP)8G?"@" -M=`3:$@VW*\@+DT8B"DH.[T8Z,U0,;K#B^Q%W=Y]_VVZ)Q;"EV9;H14_BPAGC -MFAXQ&^X[]D2!1VM>D%\`K#O6@HC-X@.\$@"V5-7>NHTV21P6/1RX>'B"'!4G -M4;2A#Q/":*IPQ8Q-/ZSF7KK]D).@N1APPR]!1W@2MT8]'PP`_````/P````"````10``^%WP -M``!`$0``P*@!`<"H`0(!]`'T`.0&R16TF]'7TB`CRJ=%.O935WHN("0(```` -M`P```-PA``#`AY>!H(+NO^/4D2=A]H21'V.S%EZ9YBP%2%_OH^-PWJ:1HO(O'H:L?E%(OM -MXP5-VO+C6TIS8D+HZ?4=(XEX$K=&*BT,`&P```!L`````@```$4``&A=\P`` -M0!$``,"H`0'`J`$"`?0!]`!4!CD5M)O1U](@(\JG13KV4U=Z+B`D(`````(` -M``!,*0``,)L<:^K"*!B(5=6=P@:RQ\=1$@5X,X#\']">`R(O(_:BTZ4TTF'\ -MT.K("/88>!*W1N-(#`!L````;`````(```!%``!H7?0``$`1``#`J`$!P*@! -M`@'T`?0`5`8Y%;2;T=?2("/*IT4Z]E-7>BX@)"`````#````3"D``##;T_I6 -MNJ26$I1A?B<0_EADWKC-9*SJ/3(UO-M/KL!U99!=2LB?0JYQ-.SV)GGTIPLQVO(RB -MUR5[Q%@-;48^G[E;PE':1*;0&VO( -MO;C92MQ5<$:1V^T@Q)0WJG^W9NS0??RHK8J_:^4IA)+:7@'@ZU/.&-&/%4K3 -MH8T7\!6,1&[,'0\6YV%@]<->#A]:L4!MI'>P9B.B^9]!!@;"=`/6EA6CI;.J -M23#CA0W-UDE7V@)0,99ML>71=^G]ZI$-H[6T)L8CZF*M_)O(+[2P7`D@%R:F -MV0/3BYU(OK9TQ>27@NRI+4-'@^`+[*)W#/:D6#Q<#$)+4*!#:HA] -MNJ8>1@$)P.L-+[_D>!*W1N9O#``<`0``'`$```(```!%``$87?8``$`1``#` -MJ`$!P*@!`@'T`?0!!`?I%;2;T=?2("/*IT4Z]E-7>BX@)`@````%````_"$` -M`.!@K;G>(L(\5C+'D5QDN/&>5X@(!6T%7$YXBA@2[;DV:W!@-:@_<.WS)_-% -MUF4[]5N@Q5^GYN*DOX@394L6,K1 -M\;M7UEYKU#UIE_\`@\DR/PK1+S7S"@BE.2NW1+12B=2BB$'H0,^>]UO=4_DN -MAAO'N;:MRLCRY`4KVPH8B?V%'J^8*G@N;D.2_+ZX,/-+KW'_&TPY5EL`$_$E -M[JZO-'6+S3CW^N15JF`&/P`U*N8\C!EZ3;H>*)8O:-8397^%EB8=AP,B>!*W -M1F=_#`#L````[`````(```!%``#H7?<``$`1``#`J`$!P*@!`@'T`?0`U`:Y -M%;2;T=?2("/*IT4Z]E-7>BX@)"`````$````S"$``+#+$-`HJ\%,?:JAW3@2=D5["8G,+[,`HQ83-])9,E'<%R@VIIF=E_#3D0PI(6S. -M\Y\\)#Q(+OLIC`I#M-$!*W1DJC#`#L````[`````(```!% -M``#H7?@``$`1``#`J`$!P*@!`@'T`?0`U`:Y%;2;T=?2("/*IT4Z]E-7>BX@ -M)"`````%````S"$``+#<5Z/=V$;:8T?$XPQR4L204KHU&B(WQ]^?^4C^I3QU -M^NI#8B$>TL)YB=PA8[QH]@OQMF#>6VU61^"H.0?&?Z"$XG@H?YK67&R:0ILW -M.*C8+KLUX,@G01?-AK;H1.1)CA%\>Q0"65%? -M]4P6,*"N0,JCIH$JFHY60A[>`_9V3#%^O-T'55\NCOX1*.A%H643H?+!$D4S -M?1G*`*%S>!*W1AO`#``\`0``/`$```(```!%``$X7?D``$`1``#`J`$!P*@! -M`@'T`?0!)`<)%;2;T=?2("/*IT4Z]E-7>BX@)`@````&```!'"$``0"EW@QJ -MT(&?8N.)@(*L3+]X(Q$#\+:1/_?9<5@E,`UK@Y-Y8G3_Q`(KCS/<2%PSQ]6_ -M?0(E.%`XZVU6L#TQKJ* -MM1<.=] -M5".+K7KB"SMMNB^FN6T&2]D$^<.;`QM\T -M,?M,0AWE<)VGN3\LQR7,&_F2W/XGO(XO?*_O,`,!Z"Y$(BG^Z)ES4RMO-JQG -M`-T4CX07*/X(.-UR.)%R&*-A0"0`9Y+B9/C.ET;F`D.CYRLK4(8>:S#(0IY$ -M*<*&?M1OX`_NL;C.]I=G!87E6N;3]\+%0:C/H4AI/OY'\.\?L0HLPNW.NPZB -MY,WOLHDMZ3-X$K=&#G#21#>;'1#PN;?<_W;H<P=2XGB-`#2'XM*162H1#CLNTICB^79C'+[>M.B".FN`Q-T#AT'=;) -MQ7'L+7D[%J6->OPJDRJ'D@]WG:`6&!+G[2(\GEFYYLBW[9KB;Y%08J>C**J! -MI3@=$D'D1#'8*L<=E),%1U/WRI+;;4CV1HH4`I!1G3S)/4+5M.Z"?;%%#TKN -M*/CLJYSC=Q3Z,1N%*&QXVYMX$K=&*"4-`(P!``",`0```@```$4``8A=_0`` -M0!$``,"H`0'`J`$"`?0!]`%T!UD5M)O1U](@(\JG13KV4U=Z+B`D"`````@` -M``%L(0`!4+H'6XS7$9Q!I*5-3IY3#BAW^H0?7WC+RT3%!\# -M!0)F)6M]V(6[+NZN(H?T-D'+0CLU'I>A;F/0)+:4N]^@[5>D -M\\"26R%,4@%)86F)<44T?2NN8.TPMSFA@NKL'NYIWBU`-]>QM'O@T>7>B:T- -M>+"[4:_SC8J160ZP!7SUA)S-!$8-G*[DC0D>W1Y+8M*>%9PI5@EVU_?CL+CV -M0WW8&:'0!3^+Q*TR^)[\_F$PIAUK?J^>4&N2G?XE4@#DVUR:0[9NA=U@_YS$ -ML,,=^L=\"6ZC2"LC<-5PI.@).R&3OT3D0S4E3RU@*&L640^"ZC_1_TV,O?S` -M:K;PXE&(^J77/\IJE8W6L.B<-L>!*W1LI8#0!<`0``7`$```(```!% -M``%87?X``$`1``#`J`$!P*@!`@'T`?0!1`BX@ -M)"`````(```!/"$``2#'^-K5DQUQ9QXMACO>(KC&[+CN@9GF,U+\R776G[T#SMOWN:B>L21$G,X,Y%0],[SJ,:0C^4E#BS_E*5V_8=Z8XP#+@X([I -MX^6+C^&&.)O%17_D$4#7<0(B+2JUEO!;*":%W_``!`$0``P*@!`<"H`0(!]`'T`&0&2?N[X[M)L10BT:T,JZKT -M=CHN("4(`````````%PJ``!`$@TU$^UY!?<>VH7\-CV6@V$W64O<@_J`>Z#Z -MC[+:;0Q@'ZZ7R2%"5ZE<_?(LI4MXN^M?*\BQ;UKPF4HY>!*W1O**#0!L```` -M;`````(```!%``!H7@```$`1``#`J`$!P*@!`@'T`?0`5`8Y^[OCNTFQ%"+1 -MK0RKJO1V.BX@)2``````````3````#"M3"$$"/.__BI1DSAF/AM[&K,0$8K$ -M]BIL/GA/]^\75?BVHOX9#97`?-5,TG@2MT9UF0T`;````&P````"````10`` -M:%X!``!`$0``P*@!`<"H`0(!]`'T`%0&.?N[X[M)L10BT:T,JZKT=CHN("4( -M`````0```$PJ```P<64-`2GL":?<7>KC!6:X5"[6I0HXGG:,`@``0!$``,"H -M`0'`J`$"`?0!]`!4!CG[N^.[2;$4(M&M#*NJ]'8Z+B`E(`````$```!,```` -M,'UAZ4"P*M!Q!0XSMD2T&=2*TD,LEB>?&(4`R_TI?`J2D"KW0PV)5VFI)2-( -M>!*W1MRA#@"8`0``F`$```(```!%``&47@,``$`1``#`J`$!P*@!`@'T`?0! -M@`=EU5[OT#IT/!T``````````"$@(@@````````!>"(``'@`!P!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``)`^7$RT5.T+"`_V5CHVK)[GYJKZC`-,`C\H?/1 -M'8>`8T.IX]![?J8DD::(L#LI```D?YSF+K-T:!T3MMWZ26C\X$Z3J;F@K5CU -M^*B_C]!T$?TI```<``!`!%9#!'B7E(9H^]PN_I[*1\X48HY-````'```0`5] -M-C#H7?-:D/&1"/>#LR%GIKY(N7@2MT85L0X`7````%P````"````10``6%X$ -M``!`$0``P*@!`<"H`0(!]`'T`$0&*=5>[]`Z=#P=```````````I("(@```` -M`````#P````@``!`!@````>F>'8(3T*06O+XZ(8E(:(7:;D?=W@2MT:ZP`X` -MN`$``+@!```"````10`!M%X%``!`$0``P*@!`<"H`0(!]`'T`:`'A=5>[]`Z -M=#P=```````````I("((`````````9@A```@``!`!@````>F>'8(3T*06O+X -MZ(8E(:(7:;D?=R(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``)`^7$RT5.T+"`_V5CHVK)[GYJKZC`-,`C\H?/1'8>`8T.IX]![?J8DD::(L#LI```D -M?YSF+K-T:!T3MMWZ26C\X$Z3J;F@K5CU^*B_C]!T$?TI```<``!`!%9#!'B7 -ME(9H^]PN_I[*1\X48HY-````'```0`5]-C#H7?-:D/&1"/>#LR%GIKY(N7@2 -MMT:LY0X`4`$``%`!```"````10`!3%X&``!`$0``P*@!`<"H`0(!]`'T`3@' -M'=5>[]`Z=#P=R4H)=>54V;0A("(@`````````3`B```P````+`$!``0#```, -M`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``!-N_!F` -ML+I[(V,%4`+_MS_K2IVB8[J(]E8)SW7N$":?$O>\[G\U5TI4:LV_2>A,(UNM -MH)3;4C$_5-990S*0``)+B#UGYI+;@] -MFD@0]#AH8=M[X_O+:?!EP%)@V/H;YF#S*0``'```0`07(X&'Q5/?F2,,U)LB -MKXE4[`800````!P``$`%VADI>M+033[K#5M,OKF[I'8BXXMX$K=&21,/``P! -M```,`0```@```$4``0A>!P``0!$``,"H`0'`J`$"`?0!]`#T!]G57N_0.G0\ -M'E::BZA(G.Z+_C#\4_QCF)W0S12FHE4I+*<_P^ -MC)646+P[8+W\B@ZCIR#W.A4W9V+2$:;@E<3>G+I=7_B!V,2\IQS#>$H0F,#* -MP479-'@2MT;C*P\`O````+P````"````10``N%X(``!`$0``P*@!`<"H`0(! -M]`'T`*0&B=5>[]`Z=#P=R4H)=>54V;0N(",@`````0```)PD``"`B%@%O).% -M\C/OI7>_U_D[,KH>&(-)A1+CZ7I*9,;#":`[L:8-W*C+/-/O"?O8YW@ATUAZ -MIFO6"=^1Q.`AA-)*%K4SEMP37:?SMF`X/2E4O=QKBB/6]\(["'$QF/^!M8>6 -M)?Z<3K\(=2_WTWC+ZD!1.*+XWV^9&7BQ/)PZTGD2MT:V"0``'`$``!P!```" -M````10`!&%X+``!`$0``P*@!`<"H`0(!]`'T`00'Z=5>[]`Z=#P=R4H)=>54 -MV;0N("0(`````@```/PA``#@DA<'_V4+`-E`1@-C5N!,0`<#TJ&[MP,&[W3. -MNH$;`\WDS*=D3EYA#<%`??XOX2A5G^YAHRM@[P`F\N=]PV+TVL3S9LCZOJY" -M5M_-U&=4QA@,!Q]!P9ZZSC_:!8.PXVB@/II"8M8WMK^20J$;C]=2( -M)N&C^Q$Q'L.8/X26G?2SJ>IDV?E]MO5,B)TG82#RE5:6O`B5N[B4GZPT3MFQ -M&_Y#H9GC.[U,*1[,%7D2MT8A%0``_````/P````"````10``^%X,``!`$0`` -MP*@!`<"H`0(!]`'T`.0&R=5>[]`Z=#P=R4H)=>54V;0N("0(`````P```-PA -M``#`09J,\?<1`A4EM_NUN*?'8=>U7Z+&8>&N-YPBZ*ZSL']TGTV)"OM0,XC/ -MVCYW]&/K^8XL=%^(JH!>?Q@A%1L8I.)F?)(WE)>F6E^"(A=L`QLOW.S=(0:9H)"OV>S2)'&W;#B\@)9@R.&R^ -M,T@^BKZXZ0N%@,03KSED;647O;@#`P>K>:_JW@`4O45$X.;\!,$=;R1DV86- -MF9[S<:/C5^%[*K-Y$K=&2"```&P```!L`````@```$4``&A>#@``0!$``,"H -M`0'`J`$"`?0!]`!4!CG57N_0.G0\'1*W1E4\``!L````;`````(```!%``!H7@\``$`1``#`J`$!P*@!`@'T`?0` -M5`8YU5[OT#IT/!W)2@EUY539M"X@)"`````#````3"D``#"^T#6CWQ?2M#IW -MRV`35156Y%SME#N6(G2HKU:H@]A^142=.CAKKBWN]KW/GGD2MT:[5@``/`$` -M`#P!```"````10`!.%X0``!`$0``P*@!`<"H`0(!]`'T`20'"=5>[]`Z=#P= -MR4H)=>54V;0N("0(````!````1PA``$`/_`*S^8\12B79H_M1N6U<-'BMGZ&_.&)+JU!MWX`$8U$Z -M&>+ME><6\6K1*W1K%B```<`0``'`$```(```!%``$87A$``$`1``#`J`$!P*@! -M`@'T`?0!!`?IU5[OT#IT/!W)2@EUY539M"X@)`@````%````_"$``.!2(%U^ -M]<`\V=?4!%;'F<%0'O/BPR8GF4?6!K9?GBK>;T1E3?3Y&)I&Y`=-$R6O%(K+ -MZ=`U+/8]2O+9ZT'+6A]OY;D<6#^D';E-CYC\. -M5$W`[A^='G4`1(L^87D2UM\2NL-K.PR.'GG&/4(^UUCU>K3S\^'^,LY7Q/EB -M/3N>0A*QW\$Q#9OHH.C5R[I7UQ6CUBET0JGYI[-X]&;>1*W1O!R``#L -M````[`````(```!%``#H7A(``$`1``#`J`$!P*@!`@'T`?0`U`:YU5[OT#IT -M/!W)2@EUY539M"X@)"`````$````S"$``+`F,RW>G6EJQ -MN,2:-D6F3=%D/:\]`$JP6Q!:BUFQ+_TO?>! -M.LQQ%C,9Y*1[OE$+@1&FD3[]>1*W1D65``#L````[`````(```!%``#H7A,` -M`$`1``#`J`$!P*@!`@'T`?0`U`:YU5[OT#IT/!W)2@EUY539M"X@)"`````% -M````S"$``+"]6_R&U_45=P:8TE&XV\Q%F6.1^0T9I;D^.C),F3ZTEQJQZ$A[SS*>3]V1J"M -M,G:9!"G^$W'>F2O38U"^),XN9_OOSV(`'.81;L_A)^GSTM+W`HD%(^+4@U-' -M$*LIS&6?]4B&2\>YR6O`:N4$L&L3''X6Z@][EM0*D/%LKDB?:BJE6(WR2_HG -M>1*W1@.S```\`0``/`$```(```!%``$X7A0``$`1``#`J`$!P*@!`@'T`?0! -M)`<)U5[OT#IT/!W)2@EUY539M"X@)`@````&```!'"$``0#:'N.68G]Q'LLC -M9[9BN#K>LQ^69RN^MM`>-,7)V@EI(KATT.U#40-_H?B9)N<'_P.@%W -MB6TV"GJ#3F`WIL,'"1Z39"ORSN?P-:,-[X@XF&J6C=1!7LDJPK%!4W_5<6^= -M,I52,_K,B/$/&L\^/#((:1$1OB>/ -MCH,N@ZDI[>);Y.`XQ&%$87#@M0'6Z01L%8#9#U@O78QI"ZS'3R^FD$=^S;$^ -M"Y0T)86.;!422Q'@"D2?1R5Y$K=&#[\``!P!```<`0```@```$4``1A>%0`` -M0!$``,"H`0'`J`$"`?0!]`$$!^G57N_0.G0\'>24(R:$SIL?\&/)7?25/+R -M:<;:8YPCHL&*[#Q1JWB5A83'Q6GA4,3V]3,/Q7O,M`)/_IUS!%6;6HQ[LP!4 -M?NE-5H#LLV$$)*+]9+G%J:3">=$HXLELQ%]LH\U?`SLB.H*V';LUIE2QY2FN -MTR@AKXA>]A,@Y\1>DTARA4=3.^[2QW"A(5VR4*&`3 -MS4+;DK/V[[+?T4DLAX+`?YXYS&+_O3`$6J51Y!%@``0!$``,"H`0'`J`$"`?0! -M]`#4!KG57N_0.G0\'<76DA8?MDX(6,YRQ%1I#F'66`(,A'73),MBJ@'(9`+R\FI_)AAD -MU"^:;*]M!%>S]8UU!9;8^[NL'M.VKP464.R>E2ZHNV307X5H(CAM-I3U%1QA -M^C0`1D1%`J2WI^"V)7$A--2HD$AG2E4A_%Z!@)Y'$)_YZ^1)@W#BF1?EZV:! -MYAQ0%KPJW$0?X=D47,0(C?M'^S"F'KJ0\;`!DOMY$K=&$?```.P```#L```` -M`@```$4``.A>%P``0!$``,"H`0'`J`$"`?0!]`#4!KG57N_0.G0\'M&"^^M2"MQXZ-9102"63KP;N^AZSHN7O*RT;9RO0$<&```0!$``,"H -M`0'`J`$"`?0!]`%T!UG57N_0.G0\'FS_CH/' -M*L4W8LSVU6,GSJ2^D]^71+3!.Z#0+&7TY=8P=(B7EM,MV])VL%K\0RO/2\R[ -MV,.311-<\M$OVP1.+IF)<^S^1$`2R6I!6OEO)61)>KKKX!,D@+LJ4KH3$WY# -M5TI-]_8KLRZ=/D@"1^&J3>O]O[IOT%S%T(0(-6XJ2M--DSC2KMF,%@B757`>73"L&\ -M+ZZW?BM7AB6\1)WGRCM2![=T90288M!94PL:O65@+)H?>4'\WA3KX`_W0ZTF -M1*W1II+`0!<`0``7`$```(```!%``%87AD` -M`$`1``#`J`$!P*@!`@'T`?0!1`OQL?E:K\>W#\Q?OGXG%%$S)I -M3\CO?9(CTQM+`>!4ND_D,11>=7.H5_R[ -M\.B!,J]K5#VK>K#/[63/J`*B.$?;8O!$\#XN$N%%.:E,$<+P,C>[";SRT')K -MP_QSN>TOGR2%B.0.[TX:W'KX/:&Q%X:``!`$0``P*@!`<"H`0(!]`'T`&0&25&0$Y<82>![ZT20J5XHWI8N("4( -M`````````%PJ``!`!O:X@D%TU* -M^K_J9215O=X&D@TH=PITK$E7B8=)Z%&\A;H5>1*W1I%^`0!L````;`````(` -M``!%``!H7AL``$`1``#`J`$!P*@!`@'T`?0`5`8Y49`3EQA)X'OK1)"I7BC> -MEBX@)2``````````3````#`,U@$.=/%^!A3:>3R4]G.-TH>^4NIM9`![ZT20J5XHWI8N("4(`````0`` -M`$PJ```PT5@G(S1_F!UA`T#`-_)1'?&\_.8/X!("[GB8$.K;L,9[<2NK?+F: -M9"*60MUY$K=&(9L!`&P```!L`````@```$4``&A>'0``0!$``,"H`0'`J`$" -M`?0!]`!4!CE1D!.7&$G@>^M$D*E>*-Z6+B`E(`````$```!,````,-RSZ.#8 -M5H)8*`H$,;L91*W1BN7 -M`@"8`0``F`$```(```!%``&47AX``$`1``#`J`$!P*@!`@'T`?0!@`=E:H2` -M:9M5_F@``````````"$@(@@````````!>"(``'@`"`!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``__QB=]I0>T;D:Z@NJ'&J/8(PE4.PI(:S@EPY -M],%3IP5U"1K)ZW+__C)]><;<%@508&K51*U0J<1RFP*#R9QRT:O,)^[:16=$:]"EEU;D>M-GYG'P"GE(````'```0`49=0&G$`7E -M@;8,Q.)V?=\1LU\39GD2MT8,I@(`7````%P````"````10``6%X?``!`$0`` -MP*@!`<"H`0(!]`'T`$0&*6J$@&F;5?YH```````````I("(@`````````#P` -M```@``!`!@````<=2/I?1)T_1`.V#Q"I96G\N/N.&7D2MT8KM@(`N`$``+@! -M```"````10`!M%X@``!`$0``P*@!`<"H`0(!]`'T`:`'A6J$@&F;5?YH```` -M```````I("((`````````9@A```@``!`!@````<=2/I?1)T_1`.V#Q"I96G\ -MN/N.&2(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``__QB -M=]I0>T;D:Z@NJ'&J/8(PE4.PI(:S@EPY],%3IP5U"1K)ZW+__C)]><;<%@50 -M8&K51*U0J<1RFP*#R9QRT:O,)^[:16=$:]"EEU;D -M>M-GYG'P"GE(````'```0`49=0&G$`7E@;8,Q.)V?=\1LU\39GD2MT;WV0(` -M4`$``%`!```"````10`!3%XA``!`$0``P*@!`<"H`0(!]`'T`3@''6J$@&F; -M5?YHX%ER6T\$.T`A("(@`````````3`B```P````+`$!``0#```,`0``#(`. -M`(`#```(`@```@,```@#```"````"`0```(H``"(``(``!\ET-UP82,TZ0D@ -M??&X%8,_L6HB3V/'_:442.4B/4`U/KNP+)I.)B+-ZW[KI@/>KA]/+*0``)-B/$))```0!$``,"H`0'`J`$"`?0!]`#T!]EJA(!IFU7^:.!9_ -M1*O6]'8.H6^=G4^5M#EV4^]U#]7(!%S86Q#ZPP<#RS-88/@ -M=E&QWBJ)O42G48(29+@"+<;:CUZ3CAEAZY -M8.HV[Q"=\9C3UQLZ.%B(^>/#2E\!=['^R-L3';1D9_.RYI\32#HO9$;6;^^; -M*-<86(T:3"'SWZ_UYW"L.CJ( -MM84(ES@,Y1(]H7;,+7B/6DQ<-0P55'D2MT9"1`,`'`$``!P!```"````10`! -M&%XF``!`$0``P*@!`<"H`0(!]`'T`00'Z6J$@&F;5?YHX%ER6T\$.T`N("0( -M`````@```/PA``#@L=]>=7L"[W4KQ;01*73;4EL\G@LQ>F:8J&@M^NSD.`&5 -MKO/0:\"L^"),8<0`#&S=#.Y2?>>HGC456D(OEF8$DERTMY<$RC\B3/:($N3V -M8Z0A^NJ9BC&*/0L/,@XX8#::B(A,C-[7/F]^;'(GI*H7SL;QFJ-C&@72FA]J\37.(\;G:0CK] -M00FE9*J7X7D2MT;>5`,`_````/P````"````10``^%XG``!`$0``P*@!`<"H -M`0(!]`'T`.0&R6J$@&F;5?YHX%ER6T\$.T`N("0(`````P```-PA``#`>L#8 -MK20W;$GJ=^JTEB7M;:%6U[F\\5$[(K>_!#FJ(W='I3\^@25(GB^:\39W -M;>0+2'_HR5`FI^G\:Q##^_=(@A%5K$$7G75@9%#C$?U(4O-0L,,3!+H6R!?P -M:UJ$V;NGTC>1AY`-E3_@/,R.\0E=H1F6HVIW"I:+)Q<*!18#\'(:I%I9/]@P -MA13(`BAY$K=&8U\#`&P```!L`````@```$4``&A>*```0!$``,"H`0'`J`$" -M`?0!]`!4!CEJA(!IFU7^:.!9"?8(1*W1A%[ -M`P!L````;`````(```!%``!H7BD``$`1``#`J`$!P*@!`@'T`?0`5`8Y:H2` -M:9M5_FC@67);3P0[0"X@)"`````#````3"D``#!E3C0L&0[ST>\DEJ5)#B;@ -M&D,)YC+[*]8,'.6^X5*?!(%"N_6OT[X+O9# -MI3RM0@Q(Q-5_NVR>U<&[8;1X(.Y7I\^E+EWE-/F8MN=Z^2EO:-B2Y5I$LD!- -MP?;'0*N<+U+!"?"&]/7N:@9E[`,55N+U%&H&)[)W[8-J1I!&!0;H;+\T@N0( -MT=,N0HL&/B"ESJ>-,1\H^/#_O6TJ8;>?5QRE#5DGA)QFU62+?S@=QF5W3HU` -MZD'*N+EKYO*\\6UP:R[S\B2MO1I.I2__M*='J0<1[6.S0V7J&8&E"`OD%,8B -M>1*W1J*B`P`<`0``'`$```(```!%``$87BL``$`1``#`J`$!P*@!`@'T`?0! -M!`?I:H2`:9M5_FC@67);3P0[0"X@)`@````%````_"$``.#0X*N7Y@4W+3": -MY(OO%L(H8T>@'@PL7A!EWG@>?W>@D-_[(="@A??:"=4!,"6&GO\GIT21<7AQW(9[BF^*.O2<@-K-L,Z*`#ZYB\JH[>Z6?ZY,I# -M`V.DW*$1]F@W(*D5-]W8Y+L80?<[7;]$>B>\D!>QC[,-1[0S_M4L*_#P>]'+ -M\?/0@=-"`QP[MTF)W>.8ZT_BC%7\"Z(V/GHZ.;1`>1*W1HVR`P#L````[``` -M``(```!%``#H7BP``$`1``#`J`$!P*@!`@'T`?0`U`:Y:H2`:9M5_FC@67); -M3P0[0"X@)"`````$````S"$``+#\9XAX6_@1&N$*QYHKPSGHHMQJE4!%J%2& -M#H^VO\K>2_ZX:,2P-\A0;!YNGKRTR&MRN1:3/?!PM@3KVA``/%*P4HCQS)KV -M49`4;,!J?(P_Y[F.PJ,Q.BC3;HQ?<83#PE[P.]%?YW<`8]IC+?"`7ET)D&IE -M):3I<9B6*.$)+K0&34E7+(\L+F=N<&`??@U]1F)7EKX'<[/"123\<.AV3*_/ -M(?8TI]QJ:6(KGAZX>1*W1NK5`P#L````[`````(```!%``#H7BT``$`1``#` -MJ`$!P*@!`@'T`?0`U`:Y:H2`:9M5_FC@67);3P0[0"X@)"`````%````S"$` -M`+!4F5)'FQ@DP0@A!(I5,\FX3RAD:U/4'M-9Q!RX0KK^YI!G,C": -M'B/#T8=5M[>O;1M2YN$^;W%*KD0W)06HHR2&NC5^1P,-R@]T?]#W4F;GF\XP -M@FDJN\&]>]6ZCR]>F5K%TYO=0-0F@Y#.:V/D@9&D2[DXL!8E+K:>V>"^['?E -MW8[VT*WLZ.-BTZG#%2E[<:'79H$T\*:&/N4$[TF@FF[X0:2PA_'U>1*W1C7S -M`P`\`0``/`$```(```!%``$X7B\``$`1``#`J`$!P*@!`@'T`?0!)`<):H2` -M:9M5_FC@67);3P0[0"X@)`@````&```!'"$``0!<=0L:B$RS2`A@W+@O?YOL -MA%+E6;T-GDUC*5@H_^GX$L&QV(/,+7^\XP1."@>.1Q[+V_TLGE]T30"`+N)E -M<*]>OT`X:'STD#+[R[(T#.@HQ@N$^>5%"P-/^N -M!$N9,LM9JGCKD`(%6NB/^7DFXV,```0!$``,"H -M`0'`J`$"`?0!]`$$!^EJA(!IFU7^:.!9,S"8$WQ=>=+9 -MO3B2:FMF7_X-8`P<*9\=XK>G1'JBQ5!11K?;2CCD+$=`F5=3:1?4O)]]CU?( -M)=##W4GH0?MDYH"XFI:G[VMS'.R?.S%2$;NFRIU1*UQ\6E&U0XK8K.>]EC/- -M)G.86-94\J@D)H_)'_+&I_:KK%*\NO_3O(FTQK9#.8VB]ATM51FL@WUY$K=& -M8PX$`.P```#L`````@```$4``.A>,0``0!$``,"H`0'`J`$"`?0!]`#4!KEJ -MA(!IFU7^:.!9[?*'M?G+@(DRF#K3YZP](2?CW+OU<17@'MNR/KEN)U%/)Y$K=&J#`$`.P```#L`````@```$4` -M`.A>,@``0!$``,"H`0'`J`$"`?0!]`#4!KEJA(!IFU7^:.!9Y@]S&\ZWQ`LFDLFX'BD8A%] -MZ:Y<9ZJ1]C5UM/$6?3P;YR%)RBQ]W4*-_"+^K,@5F-!.3[1DU#GDKTD.>N%# -MHL@TROEY$K=&.5<$`(P!``",`0```@```$4``8A>,P``0!$``,"H`0'`J`$" -M`?0!]`%T!UEJA(!IFU7^:.!9&T2IH-,9*$G&B'5OTK)S'&AL/Y&M0>(_:8RY!IK;`[F'A=WX -M"R/]P\+26H5GF\%JTOB/>T;VIF!_HS,26XAGD2$[VU3WT[*ST-!7@+@K7Z[; -MC#-K[\M)&0,]>Y(EE.+3?+D\XW@QA6G+#`\_A!ZHA&@K]#0P\"9LY,P[(!!, -MXXQ.VY&?B9I#X^_1C>@=V5[Q^F&K?3P`@UG6;&VQEV$J"8H3'RN%F4+8RA.I -MP:PTCZ;1!;L?FQP9KI=)(Y7(SV9_"9)\MZ1!GO=;7%'[$]I9.J7B8!Q.2E`I -MA"OW=AT+>7\?2Z/P^-P74$ZJK7_7W%Z\2[SQ<&I5G3`05+#:EY"8Q.#YT0F$ -MS\I3UVD@_#_?H5.O22:PI!5@SV55`2-5MZ?'5BQ.FY16#^TW6I"27_!4SHG! -M8<=(B5\QP6*BK8*^>1*W1G>+!`!<`0``7`$```(```!%``%87C0``$`1``#` -MJ`$!P*@!`@'T`?0!1`C#.L/Y(D>(OPX48J]6U"&_[-N7T]9T@1&O/M/>HGE8J_QXJ,&=@D=0DD'EM(E]#2VBC=[)'; -M="3^H_(OW08D+A=OLO+#&LE!I#G^9?\3+FM;.6"=95:A_'\BQ,U1Q5"!5K`Y -M_(87Y'%TCH,I76O5I%#[G(7M=^W!YL4:)T%XU``!` -M$0``P*@!`<"H`0(!]`'T`&0&21)LQ6GA@HA^3:SG;!$#N'XN("4(```````` -M`%PJ``!`+NGHY``A701HG4[]\3F[B;>T2;!<=J.I`VYSL-YI$Z:.6$EAY*9L>1*W1B*_!`!L````;`````(```!%``!H -M7C8``$`1``#`J`$!P*@!`@'T`?0`5`8Y$FS%:>&"B'Y-K.=L$0.X?BX@)2`` -M````````3````#"Z5\INT\8T:Z2,A?J,B3QF:B3?G!NX7Q^M;7VRB:)]30^< -M98QW(C-<59]>[WD2MT;&S00`;````&P````"````10``:%XW``!`$0``P*@! -M`<"H`0(!]`'T`%0&.1)LQ6GA@HA^3:SG;!$#N'XN("4(`````0```$PJ```P -M=%.N2QBA'RWC0(G%%]:*ZL]!`'[FD0SN<1;"MK7?AWZW=S%`@ZSP`#P[T2-Y -M$K=&,]L$`&P```!L`````@```$4``&A>.```0!$``,"H`0'`J`$"`?0!]`!4 -M!CD2;,5IX8*(?DVLYVP1`[A^+B`E(`````$```!,````,,80PU4>RB@QSAK, -MK#:"7;&,]G+8FE!UR%O@`.F^T%V*";JD[&9[Y]I05*GA>1*W1N77!0"8`0`` -MF`$```(```!%``&47CD``$`1``#`J`$!P*@!`@'T`?0!@`=EK3);\PSONUD` -M`````````"$@(@@````````!>"(``'@`"0!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``XS2^2J%]A_PQ+^IG?B4P#[0M^QM5EG&B?I6^4^8@L/2C -M57BQLPU3ALJ"OP&*/=2.7QQ)IY`N&D`=! -M698I```D_%V-]JN:Z6!R7R?4_`Y_E+G>=N0Z>YBZ'Y(:1QA=9O> -MM..#:O5S?7D2MT9QY@4`7````%P````"````10``6%XZ``!`$0``P*@!`<"H -M`0(!]`'T`$0&*:TR6_,,[[M9```````````I("(@`````````#P````@``!` -M!@````?^5FA%FLI3EM#E(+_P@"6-L_IO8WD2MT9J]@4`N`$``+@!```"```` -M10`!M%X[``!`$0``P*@!`<"H`0(!]`'T`:`'A:TR6_,,[[M9```````````I -M("((`````````9@A```@``!`!@````?^5FA%FLI3EM#E(+_P@"6-L_IO8R(` -M`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``XS2^2J%]A_PQ -M+^IG?B4P#[0M^QM5EG&B?I6^4^8@L/2C57BQLPU3ALJ"OP&*/=2.7QQ)IY`N&D`=!698I```D_%V-]JN:Z6!R7R?4 -M_`Y_E+G>=N0Z>YBZ'Y(:1QA=9O>M..#:O5S?7D2MT9X&@8`4`$``%`! -M```"````10`!3%X]``!`$0``P*@!`<"H`0(!]`'T`3@'':TR6_,,[[M9)IRP -M81)@O8(A("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```( -M`@```@,```@#```"````"`0```(H``"(``(``.C>0Q1\#)\B*K<;15B0_5I` -M8,IT.!8+R=X.6!,IXRS[F2]F\L=^1J'K256@H3![@14#7O#O8;PA94I,'W^8 -MO/#0&0Z^W@!;B.QD?-C2`4$HV*():KN+28S4=$<.)M#-J;X/@``0!$``,"H`0'`J`$"`?0!]`#T!]FM,EOS#.^[62:?7!;#'W`#&(G;8\C%]1C]$2J,YQC=JJI0I--U#^/9 -M6-_?750"Q/%^5(5@))C47M'+:4^H43K,*:/,\\JI9E70%>JJ>K;@BS>F:E&V]&+&=ND_2`+S=WD2MT81@`8`'`$``!P!```"````10`!&%Y```!` -M$0``P*@!`<"H`0(!]`'T`00'Z:TR6_,,[[M9)IRP81)@O8(N("0(`````@`` -M`/PA``#@J1@<[%2OL(N7VB#,UW->+0J(_4R3RV\AL?B6JB&>#NMA(FDMM6B$ -MJ:BON48E5]\3&7E$,XR?]'DY(!F"@/CEC`M&I5B -M1-'%;W1CG<]?R?;)RWK>[;P^I2[B06=H,=#.')Z,^E"'LBEBB*S -MEGD2MT8QBP8`_````/P````"````10``^%Y!``!`$0``P*@!`<"H`0(!]`'T -M`.0&R:TR6_,,[[M9)IRP81)@O8(N("0(`````P```-PA``#`"NLM$P;5./MRWZ%VUV -M[);,6F3P7KY[%N3$$76#WE:4:;WX@0?0G7*-[7Y#!:L^9*7DC,?AICTWG1,2 -MD[]H=VZS0F2P6ZB8&1`:K2U_YZ0K-^9YWK -M>->CRGNOS%$W;OH*OG(9Q*"*)Z#3Y-^6O-Y\D2@"SA._UGS])M$>U,66_A-Y -M$K=&/I8&`&P```!L`````@```$4``&A>0@``0!$``,"H`0'`J`$"`?0!]`!4 -M!CFM,EOS#.^[62:1*W1JRQ!@!L```` -M;`````(```!%``!H7D,``$`1``#`J`$!P*@!`@'T`?0`5`8YK3);\PSONUDF -MG+!A$F"]@BX@)"`````#````3"D``#"UQ:(74\9'TX6N^0GI!Z.D%]8PQ!W^ -MTPXZEI4*("JW.`(9IYZ#F\7@"LQG07D2MT9WS`8`/`$``#P!```"````10`! -M.%Y$``!`$0``P*@!`<"H`0(!]`'T`20'":TR6_,,[[M9)IRP81)@O8(N("0( -M````!````1PA``$`*AR7+'J@<3EBF)R#IHQ5@03=K(5FGL\D:_M5(KVX7#G= -M(U`/\6F??.4JW+KWNHBH"'8,2((B_";7HFNN^#6DE)BIIE\@NTH!_DD1U<$6 -MKAJJE"T("UW4X_496C@&.QSPDR,U(_:")EWO-V!S1XM*\C5])$+4<"$501@+ -MB3S0.=_Q,3-2L>"X`S_?_IW\^"VOG8=Z=XNC;MO7^OS@.E(6CJXW_0!6CGDI -M6M^KCB)UTIFRH@&&>)8$ROV$A<==!0V$_*W60T$+IS9BL)B(AK1*W1F;8 -M!@`<`0``'`$```(```!%``$87D4``$`1``#`J`$!P*@!`@'T`?0!!`?IK3); -M\PSONUDFG+!A$F"]@BX@)`@````%````_"$``.#Q%L70]=ZB59`A -MAO-/]%4Z;;<#T'ZQ3GC:_7'(Z%,[E\HC:=[:B.'(&\R0QP!:RD7K;ZX^ -MIP1/7N+=>\YT%Z5(*?K-)SN5%8&)PJ,)/3*0$\&&Y5W9$_9*1IS5D]\QT[:US+-XCS&\=,V\B@6/_E)2WD(]7M>1*W1BOH!@#L````[`````(```!% -M``#H7D8``$`1``#`J`$!P*@!`@'T`?0`U`:YK3);\PSONUDFG+!A$F"]@BX@ -M)"`````$````S"$``+`,.9KT&!B\ZU">)D0>)V4'W`1CEA6?<^X-H(MRN8*, -M&3+#@6K`N^O)IR+N)+F>SY`/4!AG<5?#$?QM-FES3<15<@G9FQ*YD9[#_`QP -M-BP`GWW['^L6:?"6=N]);Z.'.X:>Z-!`F$SF\'Q_&Q^Z8]+W*VW-[W*,=_;# -MVHL6;;MNWU?-[ZAI7:6EMZ`N>OD5W^Z=I+E9@%#KRK3N+O?>7NI39L6W4V/^ -MWE!!HZL&>1*W1LT*!P#L````[`````(```!%``#H7D<``$`1``#`J`$!P*@! -M`@'T`?0`U`:YK3);\PSONUDFG+!A$F"]@BX@)"`````%````S"$``+"Y06Q( -M'\./QBSZ@0OV"U2%%O0`8O0&&YA5-@D!&U:A2OJ-)/5)]:*TGFT5<3W,?I'M -MWKY&1]:_$SB^%3KYP4X5?%;?C"`T=L=]SB@R(W\G9E]?9RO'+;+[LE$O"#W9 -M;(58T6N.6_[LT-L"NDTFY&0EMFX,R\XB-)7LBB5",UK>`08W'T^XG0>Y@I>U -MV<#O6^:RR=/@?H.5K[`?UM1*W1IXI!P`\`0`` -M/`$```(```!%``$X7D@``$`1``#`J`$!P*@!`@'T`?0!)`<)K3);\PSONUDF -MG+!A$F"]@BX@)`@````&```!'"$``0"JC2TYD%-?BPO>^RP/!.'>PMA3!?JP -M>#GAOJBV)QBQ$0(6,MDUOIL*W)>2B3V.Z^W]HA:- -MP`3AH'@.4"[Z)7')^OTS"8P0*EUTR=V6@9QB\H.!+MD:T>PAS5&_I5E,!,L= -MD\-3/N`N']XB4S1,>*L5SA&C*FK@:"B+G!$D]?]C3P@DQ9&C&)T\.$-S5B=4\S*V`:](E( -MS3$=>P5`/NAX@F>;-B[%]CZF>ZL+:58^HFR*_C7YL-QK+9W&HO$9UM,@1_DA -MIPW4!O!Y$K=&:38'`!P!```<`0```@```$4``1A>20``0!$``,"H`0'`J`$" -M`?0!]`$$!^FM,EOS#.^[62:X#D[(9-F4;B!BDQ^1:`N_+EX]6,;ZDOV+P&.ETXY_@5V/?&[U&O+ -MVGK%"BKVPI$>WG[]1";/O:7'4VN[B"7+3ARY7I:Y\$%LF[-9N?DN3Q5,=W-F -M(U>L/],$L4\3XK33-E)EZJ(/@I%B<@ZEWMHID\IBP@4MA%1JF,5B4\*$H`/= -ME)@F.2]7EPI2XLAYZI+^$H*#77_?"B'SL-75S0;4N=@P@:.M2(U7G@Z/(O4H -M\SJN%\.^BU:P%"YEP4M5(&+::1W9"?QR06O`C!$R1.`A-OIY$K=&ZT4'`.P` -M``#L`````@```$4``.A>2@``0!$``,"H`0'`J`$"`?0!]`#4!KFM,EOS#.^[ -M62:"&7GG<45[RJ.1]0, -M3:W(,1WQ(I#.':H*_KZ"F:H#6ZQ-49Y36A3(L3--7U1QW=V/5_Z`7]9^PT1V -M+4Y4TBK&(&FL)F?2GHHM(XTJ%['9)RTRAIM%LS8Q7)F_&_A@7[$9QLR+YGY+ -M<8N6N91YW-7J"JTGM@D!+2@LB._.\B_(DEE?(\V5;"RL3AM)M]K^NI>$:Z-> -M8;RUCIZ5R#P%::W-'U]*EI9Y$K=&7&@'`.P```#L`````@```$4``.A>2P`` -M0!$``,"H`0'`J`$"`?0!]`#4!KFM,EOS#.^[62:/&W:_ -M3=4`M?3XRX'MAW)-Z[.$K-2KP")$_S/OTM0E5SRKP',/1K:OG^7P['!\_+OK -MF-QP<^&1>X-X4M3^&$YUF3.XM^0HO=HNMAC3/SU]O#H:53[%`SW/H'0/>.-Y -M$K=&9HX'`(P!``",`0```@```$4``8A>3```0!$``,"H`0'`J`$"`?0!]`%T -M!UFM,EOS#.^[62:E+1ID!&I -M!!>'S&,IZ*HKW-5(B0X31JA0[.5>WTE?GJP))[[OZ+?B%LHH4_'H`<]QP4X[ -M-IJXC.I=]L+&OC&Y,H`",O(@H'+9[",I3)J.,4DFB%$@?O\H?&-:DDB>Q/<% -M[7JOXK9"`7KI+'6:TN26@/A8G(JC;-30#\GWB9(!UW'.*3J5VS7)>U8;3+,Q -M9R!+%C8)KZX8JP#S,G37C':(IE?:$)G?UTD_N6'U/TNF-)GD#A;%0DO0Q2O. -M3^=@`OH,@(,W..SAE'9T3_W@`JA)%-)A/07W\7:\+>0$H5_]`(N\A^\ -MR:>:'\AQSQ&PGKR3_Z`C[%"9/Y7K".Y("K95WQU^WA6;\&@$_5`#'8Q9]ZEN -MC^I^B:<8>1*W1LG#!P!<`0``7`$```(```!%``%87DT``$`1``#`J`$!P*@! -M`@'T`?0!1`&V]S12DMTQAC:X2H7U[9=`I8V2KF4\QZ"1R#9;9OSO+S5^!83;V2OA -M-M].=52TU1IG$UVPC@ZX>Y@ZP:4ML7%K$]+&4/NH5K>>O6WC"$MT4]L*VS$N -MMVI0>F5*!@?/Z;>]^<$$PU(E@Y%71)A*CH+WA\IM4&[^9'@YRT&QH!5(A!!5 -MX64]8)8`#5V69^/O-"9KYC9E,VWO;V,I',-] -M2?B=F`R?=X"=B`"<-Z`;VQ+4L>1C[L\0V$1YQP'>`A4V4M#.I%\Q0.;WC$9>8NX76WM0._J2E1L&6-$,)_T#8:B%M=7XYL4[+\ -MJO:C1NGW9-E\Y'D2MT9[ZP<`?````'P````"````10``>%Y.``!`$0``P*@! -M`<"H`0(!]`'T`&0&22@T@?]8.T'VKC89\/H[.PHN("4(`````````%PJ``!` -MIC[UU!,2MJ@O4&_@:+?0L7MU.NDVJ?HT.T.RO5=>4+:H(6XO>^!:1J'U1)D0 -MIR.[BD9.3@.F;[;[SDB+>1*W1MSV!P!L````;`````(```!%``!H7D\``$`1 -M``#`J`$!P*@!`@'T`?0`5`8Y*#2!_U@[0?:N-AGP^CL["BX@)2`````````` -M3````##RR.M&\EWSY2:W%T]UGPQF^@6%(ZI&OXI-40``0!$``,"H`0'`J`$"`?0!]`!4!CDH-('_ -M6#M!]JXV&?#Z.SL*+B`E(`````$```!,````,,LGG.=,J.B%C1*W1D"(``'@`_P!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``#WE;;.3WAS\2V1P(MAG7,$=*WGER-P+1/LE[%CJJ`":U"[+U5XUG -MM#Q#EPY.!6G*H?F@CK=Q]O=QVN(#RS87++'-YS2_1DR`LN?',[&U<%O`&/PD -MGJ-.5Q.VE*RNTYT2.#4QY<1:F>M3(-Z`G;*.)__;&W@WZ#X>,@+W?.!'<)\I -M```DD1JL`.)6=M`.1S&'DT-IA@*7L1G<->:@J,A*K%\Q46@I```<``!`!+R* -MV*I!U#W)@M8:@M\(W3"%!0?I````'```0`7IE&5L8N&8_**0C=1/I\VOKFEU -MB'D2MT9I'@D`7````%P````"````10``6%Y3``!`$0``P*@!`<"H`0(!]`'T -M`$0&*;U3I\_M3&$Z```````````I("(@`````````#P````@``!`!@````>' -MMC_TA.'0Y5G]J1T;KU]"Z`U.Y7D2MT8M+@D`N`$``+@!```"````10`!M%Y4 -M``!`$0``P*@!`<"H`0(!]`'T`:`'A;U3I\_M3&$Z```````````I("((```` -M`````9@A```@``!`!@````>'MC_TA.'0Y5G]J1T;KU]"Z`U.Y2(``'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``#WE;;.3WAS\2V1P(MAG7 -M,$=*WGER-P+1/LE[%CJJ`":U"[+U5XUGM#Q#EPY.!6G*H?F@CK=Q]O=QVN(# -MRS87++'-YS2_1DR`LN?',[&U<%O`&/PDGJ-.5Q.VE*RNTYT2.#4QY<1:F>M3 -M(-Z`G;*.)__;&W@WZ#X>,@+W?.!'<)\I```DD1JL`.)6=M`.1S&'DT-IA@*7 -ML1G<->:@J,A*K%\Q46@I```<``!`!+R*V*I!U#W)@M8:@M\(W3"%!0?I```` -M'```0`7IE&5L8N&8_**0C=1/I\VOKFEUB'D2MT8A4@D`4`$``%`!```"```` -M10`!3%Y5``!`$0``P*@!`<"H`0(!]`'T`3@'';U3I\_M3&$Z7B4E0^'ZU:PA -M("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,` -M``@#```"````"`0```(H``"(``(``([4&QX)0CJ[,R3=#+8VZ66T`\D7R*`X -MX`//.&R66736!6R%&W.:>,!*&&H6;%U\R:9?F4`U\`\)8+H3L$NRGM`H0CHL -MVORCR:^U%O]J-^6->12RT>B+-/RL8WNX/4^J_,]KAKX#S;B>R+_4:WCTQ%;C -M].:#RVGY2X:F?%^FE.Y0*0``)'B$!=4=]8_$GN-)%6=J4!_SQV5@`` -M0!$``,"H`0'`J`$"`?0!]`#T!]F]4Z?/[4QA.EXE)4/A^M6L+B`C"`````$` -M``#L(P``T-JN'.W2+LZ3Z#>H6)V1`"K+\3H(;GR828B<5_S&>(HKZ2O^BYW1 -MOH#T7^4.^/4:ST>*"%TV)8[_\7(OY-C(T[[SF0:TR]P7_UM -M01)BL/G4GMX%EEJ(2V6T5EG,DMKAX.Y>#AE2CA-Y3GD2MT:#F@D`O````+P` -M```"````10``N%Y9``!`$0``P*@!`<"H`0(!]`'T`*0&B;U3I\_M3&$Z7B4E -M0^'ZU:PN(",@`````0```)PD``"`-^7B*']TJ[L@Y8"0]>MG@JY15N`8I?19!$;[GN$Z(SU9Z-DR4_'`LDAFV,!D`MQ:I-\1!$N -MMF'V/C!Z832F6CQ@T>_]?:/4>2(8UV^AMH$/Q`,H.*HH8^YFA@$K+NO`-BZ$X!7H'C(%S][A"&=CEK:0>Y -M($7;16`ZBAXVT7V2O-\$ND2?&H&HDQTX`9X)35MX'E:,9W[,\S?=;?D_TM!X -MH5$Q@,PR"(:<.4NZB243MO\`!2$3JHWT^V?]9V-X6U(^VE]J-'"32\)#U7,% -M0C/%^=>7Y9Z.H?GYEZA%[4#DF\;8K.M09KYJ!IR;CL>??@5:I\B8=-^^+'OD -M/ZQL"R7/=$Z],%R8/Q.]NS1$-[79LZ(O2O5/@^392W$Q*LS$L&O9,GD2MT:) -MQ`D`_````/P````"````10``^%Y;``!`$0``P*@!`<"H`0(!]`'T`.0&R;U3 -MI\_M3&$Z7B4E0^'ZU:PN("0(`````P```-PA``#`<\V4"!@O)^P.^PM;_K]" -M\5D[H'EZ:>99?+:`1[L31P?A@&"46^`*SIR)P[EV,MQ3-L4?>H6>#;R#(H8"`8X^15=$$&?MS?$"RA_4"5]4O>="]__4[>4RI -MT<*"ZTE[,#@B>+[+S-YD:Y@VMKJ+B#R16P`UC-K>9P8=^K14AT9Y$K=&],\) -M`&P```!L`````@```$4``&A>7```0!$``,"H`0'`J`$"`?0!]`!4!CF]4Z?/ -M[4QA.EXE)4/A^M6L+B`D(`````(```!,*0``,$_-''8P#3D0N`\5:<.9>%5N -MA:!^87W(/;K!<+,8>0)DTY=/+20%``Z7H?:`>1*W1C#K"0!L````;`````(` -M``!%``!H7ET``$`1``#`J`$!P*@!`@'T`?0`5`8YO5.GS^U,83I>)25#X?K5 -MK"X@)"`````#````3"D``#!?KC-.&KILN:!&[Y>E%,HZZ9P%:9[YAFM[GJZ+ -M*[A4*VARL=/(>G]'$@Y-%7D2MT;2!@H`/`$``#P!```"````10`!.%Y>``!` -M$0``P*@!`<"H`0(!]`'T`20'";U3I\_M3&$Z7B4E0^'ZU:PN("0(````!``` -M`1PA``$`0,0OI>@TW;KGOI(SW3E)`PK*,(FW#L\4_=7)FP)%76ER_C9VB_,> -M:"_ZK>,"X-=5&V8F$Z4#[\?)62#CX[O4^'9C5D2%UA -M,:=\QV_--EVPL_*9IW:L"0)!"6XA1RBE=Q6D%7PW7U\Z%I1*W1FX2"@`<`0`` -M'`$```(```!%``$87E\``$`1``#`J`$!P*@!`@'T`?0!!`?IO5.GS^U,83I> -M)25#X?K5K"X@)`@````%````_"$``.""A'^)\[,W\:\K_D>S@A[*C-X-Q&/< -M7]_7E=&T>=#,N]9[*5YN@!Y6AB8``(DZ(J@XD"6]1@(L-V$9:*-($!D_K"`!:=G?0( -M!_;*K+`4GK?#ZEK(Y&,XVY68+8;DYT3_P06)M;@H3J_2V;8IZOQ70B%4'56[ -MXLWRR\]R@UOG$S@@_]EQLL#F_N04`I*LDV*F!6UW)AL'1M^/#;B10&;+O);6 -MP=1*W1OTA"@#L````[`````(```!%``#H7F`` -M`$`1``#`J`$!P*@!`@'T`?0`U`:YO5.GS^U,83I>)25#X?K5K"X@)"`````$ -M````S"$``+"\/K1>L8)V-LD\L+;Q:^,T$+\L`GP4SCR%A2!1A1(J5CM.=0DD=#N2E..7"".OW4/J/"] -MKCXU-0QL>OOH$.')L'L:(Z6O#4J]71-@G\3=?5'!1J:MORJ<'1N2^S1PWG;H -M>1*W1I!#"@#L````[`````(```!%``#H7F$``$`1``#`J`$!P*@!`@'T`?0` -MU`:YO5.GS^U,83I>)25#X?K5K"X@)"`````%````S"$``+"N=NF:Y-^Z]W2! -MC>*B]FP#EFH#VJMNJ].TI0E^,N"9WI*&=#PB"):&-\-;2K0.IA0VWZ.%K/HR -MRC6K!O0J*VUIV;O.R4HPS]T)Q)EMGXBO3JC_X^^;9H(_3-/-YMH8),F6,"\Q -M8]Z[_9T\6K!YWC&W)?QV+OT&04+&TU04VB$2.3 -M+>7J)T%-[MUJB$Z[%18@F[/.:LP=81Q?9+(L>1*W1MA@"@`\`0``/`$```(` -M``!%``$X7F(``$`1``#`J`$!P*@!`@'T`?0!)`<)O5.GS^U,83I>)25#X?K5 -MK"X@)`@````&```!'"$``0!E%$W50X;R\G%VD"'QQ]:L8CQ81G%Y6YU$;4_] -M&;,,E"6CLZA97S?E:.?`:O$-N$MG9@&TIA.J]*\8(6DK6?N'$XBVQB#47Q!#TT65`&?";75P57`[ZT_7IGR(7> -M@HB/M#R!9+XVF_X/O?;88$0E:K#)UJ["$=2_5&B,(/8M-W,(&8C@UN2:!(:0 -M)*)CNVF?`D@J8(&;`H1<0.SDAZ[5N(PGBGU:'/14=-3)R*M'S7W)DWFY:8P``0!$``,"H`0'`J`$"`?0!]`$$ -M!^F]4Z?/[4QA.EXE)4/A^M6L+B`D"`````<```#\(0``X(BQ`"Q#76ZO4ZVQ -M<176&2RUN#Z*PV^>3LG0%4H^=WR;^#^>%O"G8]$XT.1E&B;,E!(&78PW1&NHE,-W$_6>5QDG`M:SDJ$[3FY>T1Q*\O7#MGH0K-H2*WD; -MRC+ME9UHHSB%"/VHJ6.<275(;V==(E8!Q4@8];0``0!$``,"H`0'`J`$"`?0!]`#4!KF]4Z?/[4QA.EXE)4/A -M^M6L+B`D(`````8```#,(0``L"Q0,09;%]NXSL)6A0_,ED>Z]>@OL8GCT2V# -MF2A!\87Z&:H8W]F*1=D5!&M=\?<_7?E[=W&J>KPRS -M$F6J.*A)=OAVNB__:`.O\@1[#/]K')\^G,O&OD.2&V)R996RQ$])C@@U^G$^ -M[J+`K5O[]I(EG:_FP,C$UF>Q!WH(0HS#Z/5EQ(>PGGQ']R$/O>QG$5^4-<$\ -M.'&9!Y`O1R=VRLMY$K=&::0*`.P```#L`````@```$4``.A>;@``0!$``,"H -M`0'`J`$"`?0!]`#4!KF]4Z?/[4QA.EXE)4/A^M6L+B`D(`````<```#,(0`` -ML`U1%SW10W2#(A8[V2"X7D@<:[HRAP+Q1)_:N -MAPW;U+QFG,%W'K&((5YNAL$0$/!L+Z.ML_.P%+`+W(U*-F,Z;#S+2T+R^"`: -M)*+!.*;T)JR^YY$K=&9;P``0!$``,"H`0'`J`$"`?0!]`%T!UF]4Z?/ -M[4QA.EXE)4/A^M6L+B`D"`````@```%L(0`!4'X/K/JE+1;MN049IL*Z$DVU;+X\9XI8UW9;VI92XG'$)/@ -M^B>557QXM?-E^<>R&=%\GF#V;V_?>@5/A3W`9PJZW2\(ZZ?C.,,-B%Q6,IP& -MHU*-'A*"+5[USM&`)B;M9F3Y?]^_"U;'*&8@[E=^X8)AY9G!A+,LQ@56$7AU83X,&/XN -M[3PH,$V\D:)/>*8;M]?V?O:]`N.]+P9WJBJ![1,JS(EPO)Q,`H6U)"J%/X,[4#BD72T&KA7\ -M3.>W3FE9,>`T/7C/:3C]W+2>[3Z=(;W:A.5";ML]1;!N$0]E-ER!OG:`9\8^ -M>1*W1M[^"@!<`0``7`$```(```!%``%87G```$`1``#`J`$!P*@!`@'T`?0! -M1`)25#X?K5K"X@)"`````(```!/"$``2#HQQ`M+9S-_VM# -M0NG38^HZG.*`5J:GY:@/C!L0BYWZ-6TD!._/PTT./<*@.(($__":/J#`5[F? -MBO<*ST_=W/FY@L`Y?WW8(CM32CRM!QM_CENC9NY*37YWT-68E)GEH99F63$< -M33-PX@&+E=AI`<3A_(,L0\4K8$AK8>?*`R'_ZU33L.-O[R\CYL9>GUM)'-SN -M6"%>$QV>-!_S3G"@9U#U]J=5%U'P'Q4@/$N&/HW:_;8BUG&JA=&BA-[([FEG -MMA<4XD:@65\/E<]WPS/Y7NX/Z"%;/U2WT,KOC9%MO".?P3&''&`J@YJAY7Y! -M(W\[Y]^6JFM`/B,`%3+D?12%L9"3`[_VDO;NH5,#PI-&R(P3DH&D::N&5EPO -M+%YQ``!`$0``P*@!`<"H`0(! -M]`'T`&0&28B'9(.YJE^U41*W1A(Q"P!L````;`````(```!%``!H7G(``$`1``#`J`$! -MP*@!`@'T`?0`5`8YB(=D@[FJ7[51R(GLW1_%J"X@)2``````````3````#`( -MI-RZ-':XU&>SD"`*()G619.:"-$BY9,F4G=>2YM21GODYA;+AAG#&!UR+GD2 -MMT850`L`;````&P````"````10``:%YS``!`$0``P*@!`<"H`0(!]`'T`%0& -M.8B'9(.YJE^U4\)%Y4& -M'VWN]438K*IJQ?)W8SK5V6QT^A[)XCHCX7/WBEB?\))Y$K=&7$T+`&P```!L -M`````@```$4``&A>=```0!$``,"H`0'`J`$"`?0!]`!4!CF(AV2#N:I?M5'( -MB>S='\6H+B`E(`````$```!,````,,KXS<%\L+`+TNQ+&JO+W4^T8\#OMR*( -MNOL#(!/,B(3W)(!E'?S*#6*,QO[B>1*W1IE0#`"8`0``F`$```(```!%``&4 -M7G<``$`1``#`J`$!P*@!`@'T`?0!@`=E))'E6G^?8QP``````````"$@(@@` -M```````!>"(``'@`@`!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MF4T;GO]S'G]A>YA36V#N"M7+/@S5@TOG7F["HKGNNGCN5_< -M:P^'H&I"@'X4,$$^:Y%?TF7,9`A/E\MQ.)B;^R-_-6-4'&F/"S,I```DG;=& -MS!>V;0*A#7_YK6;`^S$J+Z2-5Q:?9!S;K;?>U/4I```<``!`!(G&7$\_JOH% -M&?$39IN(Y^SBZO*B````'```0`6J.]O6C?=\VTQ7(!8!Y%Z$4+]EL7D2MT8B -M8`P`7````%P````"````10``6%YX``!`$0``P*@!`<"H`0(!]`'T`$0&*221 -MY5I_GV,<```````````I("(@`````````#P````@``!`!@````<7*K%M1<[O -M:V.=/1:V)GQWY'RS''D2MT;F;PP`N`$``+@!```"````10`!M%YY``!`$0`` -MP*@!`<"H`0(!]`'T`:`'A221Y5I_GV,<```````````I("((`````````9@A -M```@``!`!@````<7*K%M1<[O:V.=/1:V)GQWY'RS'"(``'@```!T`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``F4T;GO]S'G]A>YA -M36V#N"M7+/@S5@TOG7F["HKGNNGCN5_<:P^'H&I"@'X4,$$^:Y%?TF7,9`A/ -ME\MQ.)B;^R-_-6-4'&F/"S,I```DG;=&S!>V;0*A#7_YK6;`^S$J+Z2-5Q:? -M9!S;K;?>U/4I```<``!`!(G&7$\_JOH%&?$39IN(Y^SBZO*B````'```0`6J -M.]O6C?=\VTQ7(!8!Y%Z$4+]EL7D2MT;_DPP`4`$``%`!```"````10`!3%YZ -M``!`$0``P*@!`<"H`0(!]`'T`3@''221Y5I_GV,<4"1X5OX'HX\A("(@```` -M`````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```" -M````"`0```(H``"(``(``%ZQ4WB?QVI>\+`U?XAM3 -MU(%F)/[HK-V7I'$S91U?(;P<B# -M*0``'```0`1^R6_!\MCQ/F)4%.*S"%P```!P``$`%`@VI78D.%EFO -M]P0PDN[49A,^^?9Y$K=&O,`,``P!```,`0```@```$4``0A>>P``0!$``,"H -M`0'`J`$"`?0!]`#T!]DDD>5:?Y]C'%`D>%;^!Z./+B`C"`````$```#L(P`` -MT#CUF31(9I*6HLHL\EEBZW=#>7$U!K;KJQ"[H50B#4AS]EN[S6!S0U1`F/AZ -MG(7PC&!>H$FGDD5Y;#@&F`;Z*:Y>GZ=Q1?X6-522_I:)5S;G"4=HDUT-,8J< -M>\BQ[K`UJK)J.8L8FIMC'\;:%84FPS"Y,/`_Q2G;P'=4%@#`RO3.1&P4AD/P -M6OUW``V%H+DOGY%&JY33_+AP:?Z2^8L[;^6U[(3:CS(FO[#;7Q1(^N4S^T-8 -M&WK.IQ6['9>OT,?;Z\5LUQ%TE*-3X.D:PGD2MT9BV0P`O````+P````"```` -M10``N%Y\``!`$0``P*@!`<"H`0(!]`'T`*0&B221Y5I_GV,<4"1X5OX'HX\N -M(",@`````0```)PD``"`!"!V>6\PK?DH%ZXR900C'4C5..ZD$%)DEQV=K2\C -MIF(N_L$=U=[E)\;X!T'$Q7J2`@(>(M@*$C/]) -M';'8B7A??]&J#XI/.$O0('7:(QQ'33U\-%5C)\CI@I=9Y:<"RW]['P,VRDGA -M6R^U8'D2MT;%^`P`'`$``!P!```"````10`!&%Y]``!`$0``P*@!`<"H`0(! -M]`'T`00'Z221Y5I_GV,<4"1X5OX'HX\N("0(`````@```/PA``#@M0,6;K9; -MB%6Q-`D6(9N"QF)>`V8DC<,!=1GRI+HTAW0Z&F3,D8N5XSYD,.L^F`B7Y1W5 -MR\[,ZYL;YLT3.Y!*9I49G@;Q70IF]K[`$_8(G'(7P6DBZBLT/>+G0@+4A@)+ -M[BU"!V3@&ZS8.321LU%"@X*D&ZF)OD:7M?'NA8Z0L,E=*W&,Y]LI+'O:"U*J -M6=ZOL.H*!*4MQ]$R]V>9P&7*9ON*#JPX]X-J*YA+&6H*(;R`;=9CMF">^!I+P'D2MT9N`PT`_``` -M`/P````"````10``^%Y^``!`$0``P*@!`<"H`0(!]`'T`.0&R221Y5I_GV,< -M4"1X5OX'HX\N("0(`````P```-PA``#`$B9F69<$8\*WK`UQ%T2-,@&KOFP$ -M-75%/'#?JJ*E7L9&5U%)NQ<;!Q4U87P^4?+ZFT,,D9NVZ:9-<0V7(3%WIB%+ -MBY0P7[5G2E.\FJM5#0$]5'#S1YZ:&`=_/`[P24'%EZ0(I$"MKLO( -MC$#3FES94#EY^HXE,DYI;W#*&\EN'P`O/EWM#%/9"04MF-?$QG8V":.%R?C! -M?&".^14VI"_[V!#Z+5-*E6\4$*?DN/)!3]I'%IM'1:-Y$K=&20X-`&P```!L -M`````@```$4``&A>?P``0!$``,"H`0'`J`$"`?0!]`!4!CDDD>5:?Y]C'%`D -M>%;^!Z./+B`D(`````(```!,*0``,'T@^03@_#SNNTGJ,<[X#L@AT>0*4Q[I -MD[?*;0+^NWQ,6,4O=Q=0(.7PT(KG>1*W1KLJ#0!L````;`````(```!%``!H -M7H```$`1``#`J`$!P*@!`@'T`?0`5`8Y))'E6G^?8QQ0)'A6_@>CCRX@)"`` -M```#````3"D``##!EUU#(KB@3TA?V?PQ3>FJ$45IN&TWI6`Q;115YCW9*BP" -MB-,>/T@S`G%//#PG\1P-U#!5=VNAH-1S5XA`&#&`RY95P, -M^4UDJAA@6^C^/7D-5XJSE)(@W.+P&IMXL&,9YP,L;M(DOBK#64G!.D#\'Z7OQ.E/^\S&@60F\8?N5`XRT/)!U#R8-FB![G1;&9=U)V[_UG -MJ=CWJH1?KC(/0(3',,.U8[93C[IDU&@-GA7K:F65IT8`X"SB(MS8L`)W("S6 -M[X=U_@!*D'&"QXT->SNB)HDIKFA6C3B-PZQD$Z:N?LQ&'PJ<:;5#N1*W1MY1#0`<`0``'`$```(` -M``!%``$87H(``$`1``#`J`$!P*@!`@'T`?0!!`?I))'E6G^?8QQ0)'A6_@>C -MCRX@)`@````%````_"$``.`=6P:E8\+$@F0:#-*V+>/40&M$+32)NY#E84'= -M*7.]T$"!BQB`J,-(N\ZTKL9%O'%,2?:T9W#)8J_%+S_'I1L:#INE=_WO/AM8 -M<9G:!ZW/HT3L7=$!&L^#50;^Y$2R**:QG0$QLD?'8E8*7/&7HTJ*O_0E -M8%X1/L4UI];S=-QU>&!`&.=O?W,O.^+H"$INFS(/T0=A\5[7AL@_(8F3QQHZU=)X5Y:7\ -M7Z!@90?0/!"@H5[?>1*W1F-A#0#L````[`````(```!%``#H7H0``$`1``#` -MJ`$!P*@!`@'T`?0`U`:Y))'E6G^?8QQ0)'A6_@>CCRX@)"`````$````S"$` -M`+">==^*+QF;-,',;F($^YF\OM/FM7X&I&TRIJ/AT]!YD@M,ZE8\/T7OW,?I6J>>#8?S"SN1+?!2R29CF[D!"JP\!><:.9R`>`S -M'-;ZA1*W1I># -M#0#L````[`````(```!%``#H7H4``$`1``#`J`$!P*@!`@'T`?0`U`:Y))'E -M6G^?8QQ0)'A6_@>CCRX@)"`````%````S"$``+"L]J\"UN4?&?[+C1H28;LV -M+R1L9"%8R;H]PT3)X4JW%:$0-;FN4DC;HO2I>OYH:P- -MMN'AV1<'S(EW0AN-%?G^$R.?*R?Q/7FH5<4JOZ\5]3CUX'^YL&3*_(X1*W1DVA#0`\`0``/`$```(```!%``$X -M7H8``$`1``#`J`$!P*@!`@'T`?0!)`<)))'E6G^?8QQ0)'A6_@>CCRX@)`@` -M```&```!'"$``0"M?WM"K3_[$4F2__-Q-G!V^,(AC,I,(&N9`3K7`Y`*+RWDDZSQ>!0S\,-[`5DXC/KUR_(";8F"YE7+/6>-A`XG5U7X(4[9:3 -MI&=U#([R@\9+X72J[&%G:@LO'DW9%\AV79Y@!":#A-AN)1:&E@]S;T4;5RIW -MY0XJUYL!-F0=#&)?3AAJKL/:*"R4N#+NQ[X:IT07WW@WKZ#S5+O8!@T5M`(1 -M&:K>->VE)5/.Y2:XV:SK,^T#JWAM]BL[2H3)&1^GW=D\&=\?)(KPX!]BEE7L -M)9'0>F-@Q>MMC3,\9.=1,C2!O['PC1I#D#EB;:04ZJK&H'N&1LMY$K=&"ZT- -M`!P!```<`0```@```$4``1A>AP``0!$``,"H`0'`J`$"`?0!]`$$!^DDD>5: -M?Y]C'%`D>%;^!Z./+B`D"`````<```#\(0``X#_3`'=(*N!EJGP>Z,W&66S- -MGGQN-J'4W[<4H>)C:B;>BB/@4LW-19D"&V"AIJM+O=9W(D=T@BBTN>OBRU_3 -MW[YP[D'EBVPV(C*7!@]2F"T/CJG_!(MF.,<`3<-&MM4GT6Y/PN2%63[L-Q/K>;@3R`MO:36UMKSXC;+]EKJ;:<"] -M5^SVHL,X)N
/E!@6(JB\,-DLC)_(M(T -M"5['$VX#B&1^!ZGG[J`LG1;Q,?W8R0MY$K=&BKP-`.P```#L`````@```$4` -M`.A>B```0!$``,"H`0'`J`$"`?0!]`#4!KDDD>5:?Y]C'%`D>%;^!Z./+B`D -M(`````8```#,(0``L``9?:2KC+>/9E.'`CX.LN03TH&$&_WGX;AZS.\I]HJ< -MQ)&E)R51(\>&D'[Z%HF^<&79'0V>#^5G@TTX,;Q2E#Q0HY(?N23K)>I(,M5D -M8X-<1P3XWH4..^;7P:(]9B\KJNQ8F/!^5EA=3!;_3G$-4ICW%MRDX;$KKF9N -M,W"*BB0``0!$``,"H`0'`J`$" -M`?0!]`#4!KDDD>5:?Y]C'%`D>%;^!Z./+B`D(`````<```#,(0``L%W;THI+ -M'3)\XM@@-8R2DZJRJ-<9"EP2M2A-1")Q/.BT&,CD"S/858PG7UC"E#4@EIW( -ML]3U('U.6B+Q=/#7>8?*G^(M^N7NVSQ?"5`>=7,;$?]^UO,$H.MHUHW@=7;Z -M?6-(P.2,79GU?QL4BY7GWFA>D!9,Q7[87@4=`JA,XK*.T,C/"D+GQ:Y(8U(P -M0/XB*0B@``0!$``,"H`0'`J`$"`?0!]`%T!UDDD>5:?Y]C'%`D -M>%;^!Z./+B`D"`````@```%L(0`!4(@GQI0WE62AW=Y;/C.; -M-9Z.\Y1"P''S017HE]PT,YWUY3UL"WQW0OQ?+,`-K7H&U6*-]9&>(:XX49_5 -M1R#%PVX4KVO%(8/ADEPL%V2NJ&.%:"(?6/WI$,%=C\Z<+DVC]D.2%"*"01&< -M!C[&=X?.!!Q[A`2AVXG665#A/#C5]_AF<&N3ZY0V+"@3..$@'@C/3[OH\81! -M9]1P>FOK#DK@C4#I+'!*U7AJY#SY1QDCH[)C!#RLX[V&]S?VUP;:\!QR[&[Z -M3AJ'O[QM]EK=M!O_2A^G+\CR8J&BC6.CJ_[+Y9)&?(&J),[.I"LY>1*W1BLY -M#@!<`0``7`$```(```!%``%87HL``$`1``#`J`$!P*@!`@'T`?0!1`CCRX@)"`````(```!/"$``2":4?H#'D7CHJ:F$0YN$!LJ -MK'!YXP*X1_XF;WA9\B)#B,F%'::W^P?HT,4DD*,Y4DKQOO""I5C+5=ZJ\26Q -M;,B=SV-."%_@`E0:R08]S&GOG7P -M<,F04ZV)J,P+F.V4A0("4GGI[,L0MH -MK\*2[5V9`T&%QQ:`D`^VTJ(#7'N;H2E0%-+$1VCQ2'"/1>UXXZ+%=FZI4S6: -M,].@S_9QDQWF3LGY&8Z:2"1G#7=SN.;J0(V6;UTH9K%F"Y!T#BX!$?RO52!_ -M%Z,``!`$0``P*@!`<"H`0(!]`'T`&0& -M2:M`8ZD7Z4M"NYG0]=.W3*PN("4(`````````%PJ``!`A*&"[NF8"S#L[$E9 -MT+B_>!1PP?+UW]">+B781@J6@!BZ#S3P>EY9$=(O$L4PK7'LZ3P@U?""+/9[ -MD.RX>1*W1D-L#@!L````;`````(```!%``!H7HT``$`1``#`J`$!P*@!`@'T -M`?0`5`8YJT!CJ1?I2T*[F=#UT[=,K"X@)2``````````3````##SJCG=6%\( -MA\@`[@Z;M"P`B?N"AM>[8@-W3D`H@(FC-3LTUKB3F;ZB4F\6!7D2MT;1>PX` -M;````&P````"````10``:%Z0``!`$0``P*@!`<"H`0(!]`'T`%0&.:M`8ZD7 -MZ4M"NYG0]=.W3*PN("4(`````0```$PJ```P@O`_2%NVJ&$L)9BQLA]^"FTS -MJ*)I9B]9XV@8?XU\L)W)J0W/_'P["Y>`(25Y$K=&(XD.`&P```!L`````@`` -M`$4``&A>D0``0!$``,"H`0'`J`$"`?0!]`!4!CFK0&.I%^E+0KN9T/73MTRL -M+B`E(`````$```!,````,'%74+X^;HQU45I:!%Q?&-/Y]MB4!3@N9>B^EO2! -M%^M2],$(=C:KMZP]I)KY>A*W1J9"``"8`0``F`$```(```!%``&47I,``$`1 -M``#`J`$!P*@!`@'T`?0!@`=E:SGX4"]@[#D``````````"$@(@@````````! -M>"(``'@``````0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``H*4GVD;9 -MB:49]>',\$(JTH^,_EV19BR"JVL2+1%IMAGK;JP2*_U%E_U1?KPR9:Y^T\*< -M"H]FVQ9L26[/4(2O^T2HP/S!QK$F1QZ5KZW"5805HI```D0DIV5;/&GV-$ -MCCME9[FRA\/-*?,8C")0D[3$@TXH6&4I```<``!`!$Q&`7'0GC)VC2G+\!)K -M*BB'V=/H````'```0`4XP8"<.U_%^?R$?JSLU@S\_Q?$M7H2MT;5=0,`F`$` -M`)@!```"````10`!E%Z9``!`$0``P*@!`<"H`0(!]`'T`8`'96LY^%`O8.PY -M```````````A("((`````````7@B``!X``````$!``P#```,`0``#(`.`(`# -M```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(` -M``$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"```` -M"`0```XH``"(``(``*"E)]I&V8FE&?7AS/!"*M*/C/Y=D68L@JMK$BT1:;89 -MZVZL$BO]19?]47Z\,F6N?M/"G`J/9ML7)C$.!BMUMEJE: -M^MPE6$%:*0``)$)*=E6SQI]C1(X[96>YLH?#S2GS&(PB4).TQ(-.*%AE*0`` -M'```0`1,1@%QT)XR=HTIR_`2:RHHA]G3Z````!P``$`%.,&`G#M?Q?G\A'ZL -M[-8,_/\7Q+5Z$K=&9[<)`)@!``"8`0```@```$4``91>L0``0!$``,"H`0'` -MJ`$"`?0!]`&`!V5K.?A0+V#L.0``````````(2`B"`````````%X(@``>``` -M```!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"``"@I2?:1MF)I1GUXMNK!(K_467_5%^O#)EKG[3PIP*CV;;%R8Q -M#@8K=;9:G(<0PO&(7:7Q;:Q?RJD)!B9H0**7'VKFW^TXK%,%0[.DW[[+@9YF -MQ);L]0A*_[1*C`_,'&L29''I6OK<)5A!6BD``"1"2G95L\:?8T2..V5GN;*' -MP\TI\QB,(E"3M,2#3BA892D``!P``$`$3$8!<=">,G:-*Q*W1G;#!P"8`0``F`$```(` -M``!%``&47KX``$`1``#`J`$!P*@!`@'T`?0!@`=E0L;T@&A1"^H````````` -M`"$@(@@````````!>"(``'@````!`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``XYE9=L/CKK\C#.\_.'=4NUF^IV=L`:HA5P0.R?%^6A+#2J0&O.=2 -MIUSGV(3Y&)`?K1KKJ;WM:ON>[-R[O\"$A]BU6MH:(XZ!".?C_)+\31^[^TB&M9 -MYZ6;^/5%*%/10_;?:53AFE&**0``)!:IU*W]D^(P<+BZ/K?*F5#FBJ`L24SS -MPG(P/\FO1BBY*0``'```0`2QFC5D%(441(KM,>8 -MT```0!$``,"H`0'`J`$"`?0!]`&`!V5"QO2`:%$+Z@``````````(2`B"``` -M``````%X(@``>`````$!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``#C -MF5EVP^.NOR,,[S\X=U2[6;ZG9VP!JB%7!`[)\7Y:$L-*I`:\YU*G7.?8A/D8 -MD!^M&NNIO>UR<3"K\2>EF_CU12A3T4/VWVE4X9I1BBD``"06J=2M -M_9/B,'"XNCZWRIE0YHJ@+$E,\\)R,#_)KT8HN2D``!P``$`$L9HU9!2%%$2* -M[3'F'(]*5<=QN:T````<``!`!5D*4X*C"(``'@````"`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``,J?AOUC?DG"*Z#] -MA(6V9SPF3<^4;*.U-_@&W%+->.TJA`\)E_(5!4#'Q%`8K)D6TT93VA??I:QX -M2.IK*/B<(T:R^RQ$Z?VUCZ,=N,HU3XP5"))P,`F`$``)@!```"````10`!E%[W``!`$0`` -MP*@!`<"H`0(!]`'T`8`'9$CJ:RCXG"-&LOLL1.G]M8^C';C*-4^,%0B7 -M,&E:PF"1'33?D;H1K%Q5ZFPMU5%KSN%"[G^#5N(D*0``),-7S[8*ZSR`[E?` -MDMI-K.)7.**)Z,2G8TL:6SB#`TCN*0``'```0`08!YJ=+JW4:.5!FFZ*TE*, -MXSUVSP```!P``$`%J8-;&G+*(P[F9TV4!YZ<).HHV&M]$K=&+FD)`)@!``"8 -M`0```@```$4``91?"0``0!$``,"H`0'`J`$"`?0!]`&`!V7(4`\?`,T;5P`` -M````````(2`B"`````````%X(@``>`````(!`0`,`P``#`$```R`#@"``P`` -M#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```! -M`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$ -M```.*```B``"```RI^%RK]ATIBA%&0/WPP^`=D%Z_6-^2<(KH/V$A;9G/"9- -MSY1LH[4W^`;<4LUX[2J$#PF7\A4%0,?$4!BLF1;31E/:%]^EK'A(ZFLH^)PC -M1K+[+$3I_;6/HQVXRC5/C!4(ES!I6L)@D1TTWY&Z$:Q<5>IL+=51:\[A0NY_ -M@U;B)"D``"3#5\^V"NL\@.Y7P)+:3:SB5SBBB>C$IV-+&ELX@P-([BD``!P` -M`$`$&`>:G2ZMU&CE09INBM)2C.,]=L\````<``!`!:F#6QIRRB,.YF=-E`>> -MG"3J*-AK?A*W1L5T!P"8`0``F`$```(```!%``&47R,``$`1``#`J`$!P*@! -M`@'T`?0!@`=E-+K1HCE%HDL``````````"$@(@@````````!>"(``'@````# -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``P&IEF2FY_Z*24=V_Y/HK -M\JEG7AXH)^U,*4B)%ZQI.2/OP@[:36^4"5ZH0:BT*)P%`2>?+V]QY6-0PB;` -MMH(R'CWIT*O1P*X.")._D_4A.9G>^1U^K05A.0FZ9+#$`JHQ>6:C"VLS;```` -M'```0`54(H"2(*/'>LT1[E]P9?0?."ZG''X2MT:&H0H`F`$``)@!```"```` -M10`!E%\D``!`$0``P*@!`<"H`0(!]`'T`8`'932ZT:(Y1:)+```````````A -M("((`````````7@B``!X`````P$!``P#```,`0``#(`.`(`#```,`0``#(`. -M`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@`` -M!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"( -M``(``,!J99DIN?^BDE'=O^3Z*_*I9UX>*"?M3"E(B1>L:3DC[\(.VDUOE`E> -MJ$&HM"B5C4,(FP+:",AX]Z="KT<"N#@B3OY/U(3F9WOD=?JT% -M83D)NF2PQ`*J,7EFHW*%QY42U\M\[_^DV&+7;%X]!9J/:!C3R(O\Y!L/*0`` -M)%.+9Y?<&7T'S@NIQQ_ -M$K=&X*`!`)@!``"8`0```@```$4``91?*```0!$``,"H`0'`J`$"`?0!]`&` -M!V4TNM&B.46B2P``````````(2`B"`````````%X(@``>`````,!`0`,`P`` -M#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"``#`:F69*;G_HI)1W;_D^BORJ6=>'B@G -M[4PI2(D7K&DY(^_"#MI-;Y0)7JA!J+0HG`4!)Y\O;W'E8U#")L"V@C(>/>G0 -MJ]'`K@X(D[^3]2$YF=[Y'7ZM!6$Y";IDL,0"JC%Y9J-RA<>5$M?+?.__I-AB -MUVQ>/06:CV@8T\B+_.0;#RD``"13BV7+X3T^9VZ[A&@Q/^^@,(PW):W:DUBL -MT)M_&]M>HBD``!P``$`$Z>:Q;YIRJ88V-UN=WP7Z9X+:S-L````<``!`!50B -M@)(@H\=ZS1'N7W!E]!\X+J<"(``'@````$`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``VK=\ -MI,2JW6A#O*O9:Z3G,E/P\@!V&3XC-.0@VO7ZVJML0`G8EAC'AI8,7(E8SZ(= -M`\8]5%?%9LW#6/ZUAM='<=M;G)L%D+ANB<=XP"^MO9;S>%9GFK0_$S%LO)_\ -MK?9';TSA&!3(%UH;NE)*?9]DP-[K$"V42.L\Q&V@X0TS;U,I```DQ5,WW)1V -M'K_)8FMNW;U]13P37._4^Q)X9ZZ+(8B&$P$I```<``!`!/S2Y2=AE&V@X:P' -M[2ROMNX?PG$)````'```0`467X,2?T(39`8UH.5+>MX(%(#B*X`2MT9!V0(` -MF`$``)@!```"````10`!E%\Y``!`$0``P*@!`<"H`0(!]`'T`8`'9?U>QV2< -MJ%+E```````````A("((`````````7@B``!X````!`$!``P#```,`0``#(`. -M`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P`` -M"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```" -M````"`0```XH``"(``(``-JW?*3$JMUH0[RKV6NDYS)3\/(`=AD^(S3D(-KU -M^MJK;$`)V)88QX:6#%R)6,^B'0/&/517Q6;-PUC^M8;71W';6YR;!9"X;HG' -M>,`OK;V6\WA69YJT/Q,Q;+R?_*WV1V],X1@4R!=:&[I22GV?9,#>ZQ`ME$CK -M/,1MH.$-,V]3*0``),53-]R4=AZ_R6)K;MV]?44\$USOU/L2>&>NBR&(AA,! -M*0``'```0`3\TN4G891MH.&L!^TLK[;N'\)Q"0```!P``$`%%E^#$G]"$V0& -M-:#E2WK>"!2`XBN`$K=&U1H)`)@!``"8`0```@```$4``91?.@``0!$``,"H -M`0'`J`$"`?0!]`&`!V7]7L=DG*A2Y0``````````(2`B"`````````%X(@`` -M>`````0!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"``#:MWRDQ*K=:$.\ -MJ]EKI.&E@Q:M#\3,6R\G_RM]D=O3.$8 -M%,@76ANZ4DI]GV3`WNL0+91(ZSS$;:#A#3-O4RD``"3%4S?O\EB:V[= -MO7U%/!-<[]3[$GAGKHLAB(83`2D``!P``$`$_-+E)V&4;:#AK`?M+*^V[A_" -M<0D````<``!`!19?@Q)_0A-D!C6@Y4MZW@@4@.(K@1*W1J4I!P"8`0``F`$` -M``(```!%``&47ST``$`1``#`J`$!P*@!`@'T`?0!@`=E^('74]R8#/D````` -M`````"$@(@@````````!>"(``'@````'`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``(PNH@ZI;N:,@AFUL"PQ!4(S[I#K:@!C#ZNG)XTP"@@0ROH+3 -M\#KO?D'(V?,H\;J_JRV$"O'`,(:-6+&KG;LED_.9Y9>:5OD%2?5I1\<@/'$5 -MJ50GPO_91H4VKN8/L.8%\+(!F'4O4*$05O5^[O^]>YR#/W;K^0Q)L:N;(W8*IN:C1["=.IF%'7?^P.C````'```0`7]J^1[!,2#IQ9`30L[EYCS -M!8C@[8$2MT964PH`F`$``)@!```"````10`!E%\_``!`$0``P*@!`<"H`0(! -M]`'T`8`'9?B!UU/-,`H($,KZ"T_`Z[WY!R-GS*/&ZOZLMA`KQP#"&C5BQJYV[ -M)9/SF>67FE;Y!4GU:4?'(#QQ%:E4)\+_V4:%-J[F#[#F!?"R`9AU+U"A$%;U -M?N[_O7N<@S]VZ_D,2;&KFW-8G3"5*0``)+$@!-G+);V!A&XR<=&5T[$]$@;X -M^)OOBZ#N:K(#[O>[*0``'```0`3BYGB-V"J;FHT>PG3J9A1UW_L#HP```!P` -M`$`%_:OD>P3$@Z<60$T+.Y>8\P6(X.V"$K=&L%(!`)@!``"8`0```@```$4` -M`91?0@``0!$``,"H`0'`J`$"`?0!]`&`!V7X@==3W)@,^0``````````(2`B -M"`````````%X(@``>`````"(``'@````(`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``.!/DAF"*87?*X]BTN*4N8G*KN1>`$2N/4<96Q7/VPJ">&!;3&*A29+H/*_-"E(+EPN8N( -M#>.O)#_BG2L;UO@HA````'```0`419R[^ -MZB2]"75/3I)\D`NS%#8=K(,2MT8*BP(`F`$``)@!```"````10`!E%]D``!` -M$0``P*@!`<"H`0(!]`'T`8`'96WQIUE4>8BI```````````A("((```````` -M`7@B``!X````"`$!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0`` -M#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```" -M`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``#@3Y(9@ -MBF%WRN/8M+BE+F'.-/F8JF]DURA#;!B^*?H2WIRJ[D7@!$KCU'&5L5S]L*@G -MA@6TQBH4F2Z#ROS0I2"Y<+F+B`WCKR0_XITK&];X'.4VLER:1(S$R-QI:QK: -MXRBQ1@N]AN=<7U/#,OP;OTTA"2D\W*4H\,:![,0V)H1"*0``)$=:DPV.ZN^& -M].1J/!EZ?&NAE5K=J^/`=\?O:#\"7`````@!`0`,`P``#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"```X$^2&8(IA=\KCV+2XI2YASC3YF*IO9-S$-B:$0BD``"1'6I,-CNKOAO3D:CP9>GQKH95:W:OCP'?'[V@_`EW(]"D` -M`!P``$`$/;XU:L(@T0%3JPF;>[2!+(5QZB$````<``!`!1%G+O[J)+T)=4]. -MDGR0"[,4-AVLA!*W1F_9!@"8`0``F`$```(```!%``&47XD``$`1``#`J`$! -MP*@!`@'T`?0!@`=EI&1L_!HMDHP``````````"$@(@@````````!>"(``'@` -M```)`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``W/N%=/%B.KC3>H2" -M+D@3E'`&!0Y="W+"NM=2>/N64!O[>/.+`@: -MP<\AUFZ@I(^[9Y-QQ1N^$C\C0I>'H?OP.YK_V8&%HKDNCYN#6&^J5IJ++C[) -M+"YR@"B>I?:W&/-WXTLU6FG";6WM54D0OI`I```D]S]O[J/H=D@3CPJ5`>_. -M@^A0NZ3%>@`J)'Q3`5NK'#4I```<``!`!/ZB6;=09O=VXED"7B1(1`R#SH%- -M````'```0`5;K&^`5SG^2@YB1TYWN%=&(T[,E(02MT95!0H`F`$``)@!```" -M````10`!E%^=``!`$0``P*@!`<"H`0(!]`'T`8`'9:1D;/P:+9*,```````` -M```A("((`````````7@B``!X````"0$!``P#```,`0``#(`.`(`#```,`0`` -M#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```( -M`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH -M``"(``(``-S[A73Q8CJXTWJ$@BY($Y1P!@4.70MRPKK74GC[EE`;^WCW*0BK -M]@/=X'T/A`Z4XV.0C<[7CBP(&L'/(=9NH*2/NV>3<<4;OA(_(T*7AZ'[\#N: -M_]F!A:*Y+H^;@UAOJE::BRX^R2PN`````D!`0`, -M`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``#<^X5T\6(ZN--ZA((N2!.4<`8% -M#ET+!]#X0.E.-CD(W.UXXL"!K!SR'6;J"D -MC[MGDW'%&[X2/R-"EX>A^_`[FO_9@86BN2Z/FX-8;ZI6FHLN/LDL+G*`*)ZE -M]K<8\W?C2S5::<)M;>U521"^D"D``"3W/V_NH^AV2!./"I4![\Z#Z%"[I,5Z -M`"HD?%,!6ZL<-2D``!P``$`$_J)9MU!F]W;B60)>)$A$#(/.@4T````<``!` -M!5NL;X!7.?Y*#F)'3G>X5T8C3LR4A1*W1NYD#@"8`0``F`$```(```!%``&4 -M7\4``$`1``#`J`$!P*@!`@'T`?0!@`=EJX+#7N*AX:H``````````"$@(@@` -M```````!>"(``'@```!K`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M.9*6E`/C;-ICY]T2:\J>_49=FN84E'J_`37]%O!;]AH-@V\?*S=O>W22/"W^ -M2ZCQR.F]'<:O"&47=,[DJ&E<78-1%]"\[AQOD;T2\KA^*Y1C#/U\.H0F>K;] -M4Y8/:X_OGI+>W9[<9M8WL3=0LO=!WF#^!\<_2MWT6):W8L^A_DGI+:S1/MM%XYDR%F*F7A5X4G<=0I```<``!`!/OZ785(*BR[ -MN#1FTGOZS,#$QB))````'```0`6_>5MLQH$;][0X6Z:;><_?@;*+4882MT;& -M/`(`F`$``)@!```"````10`!E%_(``!`$0``P*@!`<"H`0(!]`'T`8`'9:N" -MPU[BH>&J```````````A("((`````````7@B``!X````:P$!``P#```,`0`` -M#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```" -M`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$ -M```"````"`0```XH``"(``(``#F2EI0#XVS:8^?=$FO*GOU&79KF%)1ZOP$U -M_1;P6_8:#8-O'RLW;WMTDCPM_DNH\W&;6-[$W4++W0=Y@_@?' -M/TK=]%B6MV+/H?Y'*0``),"[4VI#Q.J17T0'7IZ2VLT3[;1>.9,A9BIEX5>% -M)W'4*0``'```0`3[^EV%2"HLN[@T9M)[^LS`Q,8B20```!P``$`%OWE;;,:! -M&_>T.%NFFWG/WX&RBU&&$K=&?7X(`)@!``"8`0```@```$4``91?R0``0!$` -M`,"H`0'`J`$"`?0!]`&`!V6K@L->XJ'AJ@``````````(2`B"`````````%X -M(@``>````&L!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"```YDI:4`^-L -MVF/GW1)KRI[]1EV:YA24>K\!-?T6\%OV&@V#;Q\K-V][=)(\+?Y+J/'(Z;T= -MQJ\(91=TSN2H:5Q=@U$7T+SN'&^1O1+RN'XKE&,,_7PZA"9ZMOU3E@]KC^^> -MDM[=GMQFUC>Q-U"R]T'>8/X'QS]*W?18EK=BSZ'^1RD``"3`NU-J0\3JD5]$ -M!UZ>DMK-$^VT7CF3(68J9>%7A2=QU"D``!P``$`$^_I=A4@J++NX-&;2>_K, -MP,3&(DD````<``!`!;]Y6VS&@1OWM#A;IIMYS]^!LHM1AQ*W1D:+!@"8`0`` -MF`$```(```!%``&47\H``$`1``#`J`$!P*@!`@'T`?0!@`=E57>?7Q:1*JX` -M`````````"$@(@@````````!>"(``'@```!L`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``8+0'"K`G8))LR,Z2SVO>_1B6ZX04<[:]P*TU(FO=KG,3 -MV66-A_:[P8GF_`+3JL._.?<'&=RP!5'@`;9`/*['G+97L@4E;\V-`X^DED'P -MZ>L38!'S9,5&I-?M&Y90E1:-]'S'<+MTJ9.3ONRV"7*M7_CYB<$[@-/RUDHA -MBANOSG4I```D=$1,2H9`&651$ENQ;X[TYZA1,<6`AR0*X:*H31KTS5@I```< -M``!`!%/R?@(%Q\-J(#U<0S'+ZIT%^:OM````'```0`7Q;=X]BO^3_P4LEP^M -M;N%>X@*19(<2MT;GM@D`F`$``)@!```"````10`!E%_+``!`$0``P*@!`<"H -M`0(!]`'T`8`'955WGU\6D2JN```````````A("((`````````7@B``!X```` -M;`$!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```( -M`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$# -M```(`P``!0,```@$```"````"`0```XH``"(``(``&"T!PJP)V"2;,C.DL]K -MWOT8ENN$%'.VO<"M-2)KW:YS$]EEC8?VN\&)YOP"TZK#OSGW!QGH -M43'%@(/8K_D_\%+)````&P!`0`,`P``#`$```R`#@"``P``#`$```R` -M#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(` -M``0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*``` -MB``"``!@M`<*L"=@DFS(SI+/:][]&);KA!1SMKW`K34B:]VN;\`M.JP[\Y]P<9W+`%4>`!MD`\KL>R!25OS8T#CZ260?#IZQ-@$?-D -MQ4:DU^T;EE"5%HWT?,=PNW2IDY.^[+8)"(``'@```!M`0$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``'[/H^_&)33-3F9#.]8JU_,`I3KFJ -M`T30NTQVUSD>V28'=ZBB)4`;9M3ORF82P7[)@ -MFXY)C(+/E'%3SGG;]0*B0J-2-#^_G(]9^9]4WN4TE.&\0D;76:<13D^::ESF -MZ-O]S-JH5I8\>;8U12`7U?(I```DUZ@9VT"/CV.P'++C&1G8:4?*T9V_6H[G -M(1>%`;=)4.(66'%`A\=,?A.+?[C"ZXD2MT:8[@$`F`$``)@!```"````10`!E%_. -M``!`$0``P*@!`<"H`0(!]`'T`8`'929[^3&^6##R```````````A("((```` -M`````7@B``!X````;0$!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```, -M`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@# -M```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``!^S -MZ/OQB4TS4YF0SO6*M?S`*4ZYJ@-$T+M,=MG,1:JX-)CS&Q2A;.$ -M\K;".7HHB5`&V;4[\IF$L%^R8)N.28R"SY1Q4\YYV_4"HD*C4C0_OYR/6?F? -M5-[E-)3AO$)&UUFG$4Y/FFIH&=M` -MCX]CL!RRXQD9V&E'RM&=OUJ.YR$7A0&W25#G*0``'```0`0I$!>_DQ -MOE@P\@``````````(2`B"`````````%X(@``>````&T!`0`,`P``#`$```R` -M#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,` -M``@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!``` -M`@````@$```.*```B``"```?L^C[\8E-,U.9D,[UBK7\P"E.N:H#1-"[3';7 -M.1[9)@=WIS$6JN#28\QL4H6SA/*VPCEZ*(E0!MFU._*9A+!?LF";CDF,@L^4 -M<5/.>=OU`J)"HU(T/[^Y324X;Q"1M=9IQ%.3YIJ7.;HV_W,VJA6 -MECQYMC5%(!?5\BD``"37J!G;0(^/8[`^!];`````<``!`!0-I3EI5XA98 -M<4"'QTQ^$XM_N,+KBA*W1N`Z!@"8`0``F`$```(```!%``&47]```$`1``#` -MJ`$!P*@!`@'T`?0!@`=EN@Z"R8:E;I@``````````"$@(@@````````!>"(` -M`'@```!P`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``<,TPM_$]-T63 -MA$C*[N\R%=[2Y^A=?S7H=\^2[#YRRT4!Q<$8+,./$KV//IZ'2YT#(5)1--_)K]O&IA;H,FO*5K!+`'6O_\!&+^51 -M45V!B&+"`5S$&QVF8I(#OL/SV`M5KN6G_XO9!:Q!QSZ?T,$VZ&UC(H2MT;':`D`F`$``)@! -M```"````10`!E&`[``!`$0``P*@!`<"H`0(!]`'T`8`'9;H.@LF&I6Z8```` -M```````A("((`````````7@B``!X````<`$!``P#```,`0``#(`.`(`#```, -M`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$# -M```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0` -M``XH``"(``(``'#-,+?Q/3=%DX1(RN[O,A7>TN?H77\UZ'?/DNP^CP.%\M22(.5[E*8GCSZ>ATN=`R%2433?R:_; -MQJ86Z#)KRE:P2P!UK__`1B_E45%=@8ABP@%08B*0``'``` -M0`0+[T$FN3-:J[;2A2TO3MN6!.(2F0```!P``$`%UB0,WI_^+V06L0<<^G]# -M!-NAM8R+$K=&"F@``)@!``"8`0```@```$4``91@0```0!$``,"H`0'`J`$" -M`?0!]`&`!V6Z#H+)AJ5NF```````````(2`B"`````````%X(@``>````'`! -M`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$` -M``,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P`` -M"`,```4#```(!````@````@$```.*```B``"``!PS3"W\3TW19.$2,KN[S(5 -MWM+GZ%U_->AWSY+L/G++10'%P1@LPX\2O9R3.R"&&RAD8L=V'H\#A?+4DB#E -M>Y2F)X\^GH=+G0,A4E$TW\FOV\:F%N@R:\I6L$L`=:__P$8OY5%178&(8L(! -M7,0;':9BDAR9BNCMX.^P_/8"U6NY9RD``"3)']F^3#PKI+\[9<3NF(VUOKW% -M$$X$H3P&Y_0;KGD&(BD``!P``$`$"^]!)KDS6JNVTH4M+T[;E@3B$ID````< -M``!`!=8D#-Z?_B]D%K$''/I_0P3;H;6,BQ*W1NO3#0"8`0``F`$```(```!% -M``&484<``$`1``#`J`$!P*@!`@'T`?0!@`=EPE2U(M\35F4``````````"$@ -M(@@````````!>"(``'@```!Q`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@```?&WO);=;T*4:M<0:1!L,1,#05]5RY=!CK&,69U=3AN\I```<``!`!-]*$TR' -M@3J[:(%(!+)[=_^)ZG?H````'```0`4X:<[Y:#S25Q=J&VJ[%)7HVB?N9HP2 -MMT:IQP$`F`$``)@!```"````10`!E&'W``!`$0``P*@!`<"H`0(!]`'T`8`' -M9<)4M2+?$U9E```````````A("((`````````7@B``!X````<0$!``P#```, -M`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@" -M```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,` -M``@$```"````"`0```XH``"(``(```'QM[R6W6]"E&K7$&D07,PVDOVUO):] -MF?T-/.K\H-(FJ6:\0>_K6Q[2;]D(`OA/O)HAC2 -M/;O?[Z'5A?U'QV"31E!H(?M++,R+99?W?_B>IWZ````!P``$`%.&G. -M^6@\TE<7:AMJNQ25Z-HG[F:,$K=&+`D(`)@!``"8`0```@```$4``91B>0`` -M0!$``,"H`0'`J`$"`?0!]`&`!V7"5+4BWQ-690``````````(2`B"``````` -M``%X(@``>````'$!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$` -M``R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P`` -M`@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"```!\;>\ -MEMUO0I1JUQ!I$%S,-I+]M;R6O9G]#3SJ_*#2)JEFG'R+%FZ:NL3($+X\B]_Y -M:'O$'OZUL>TF_9"`+X3[R:(8TCV[W^^AU87]1W.D07;O2-J\MK5"\W^AJC)=0<$=NBD``"0^/=S#1O5* -MS?Z\W5QIZPQ$P-!7U7+ET&.L8Q9G5U.&[RD``!P``$`$WTH33(>!.KMH@4@$ -MLGMW_XGJ=^@````<``!`!3AISOEH/-)7%VH;:KL4E>C:)^YFC1*W1I`;!@"8 -M`0``F`$```(```!%``&48PH``$`1``#`J`$!P*@!`@'T`?0!@`=E);I>R;%1 -MJS@``````````"$@(@@````````!>"(``'@```!R`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``S7FNHB]X@=1>L[&%1PR9SGQ;A0)YC7'K.=AIZWAR"RN1 -MWF/HZ)E"^,R+.E%1WG1!BOY(%'5),@)CL,%Q5K8T2MT:\00D`F`$``)@!```"````10`!E&,8``!`$0``P*@! -M`<"H`0(!]`'T`8`'926Z7LFQ4:LX```````````A("((`````````7@B``!X -M````<@$!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`# -M```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,` -M``$#```(`P``!0,```@$```"````"`0```XH``"(``(``,UYKJ(O>('47K.Q -MA4<,F8UQZSG8:>MX<@LKD=YCZ.B90OC,BSI14=YW,N/`4JUS'=0FG!K' -MD08K^2!1U23("7.IQEQU?"(!O0>%L7W28+2W*0``)/QO?RU\#Z1NX9&6?)-Q -M3[7!VIV3'$IP+[FP`X8)".M$*0``'```0`1A,"AZ@V%S3S4,08MM?T^46XJ; -MJ````!P``$`%X->C#^NK*AG6(CV@6ZGH[#!<5:V.$K=&[4```)@!``"8`0`` -M`@```$4``91C,```0!$``,"H`0'`J`$"`?0!]`&`!V4ENE[)L5&K.``````` -M````(2`B"`````````%X(@``>````'(!`0`,`P``#`$```R`#@"``P``#`$` -M``R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P`` -M"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```. -M*```B``"``#->:ZB+WB!U%ZSL85'#)G.?%N%!RNQS2%S?:HJGR6\CLYV&GK>'(+*Y'>8^CHF4+X -MS(LZ45'>=S+CP%*MH-A#7HP_KJRH9UB(]H%NIZ.PP -M7%6MCA*W1L^,#0"8`0``F`$```(```!%``&48V4``$`1``#`J`$!P*@!`@'T -M`?0!@`=E"F9524Z"DP(``````````"$@(@@````````!>"(``'@```!S`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``68T>G8TG@Q2]W2=36MZN-UI(XL_VO.B@^R7T^#J -MFH>C`R@+EX@)E1U0MSI58-;)GX6%U(3@.5230$`F`$``)@!```"````10`! -ME&-N``!`$0``P*@!`<"H`0(!]`'T`8`'90IF54E.@I,"```````````A("(( -M`````````7@B``!X````KC=:2.+/]KSHH/LE]/@ZIJ'HP,H"Y>("94=4+>`-]QFL/;,L893KWQNC,L*0``'```0`2O&;./#*.P -MT$I````',!`0`,`P``#`$` -M``R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@`` -M`@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```( -M!````@````@$```.*```B``"``!9C1Z=AS(&(7$;0X)V)=F^&ES/D/6);@8( -MR$>8V#:,5BC#%+W=)U-:WJXW6DCBS_:\Z*#[)?3X.J:AZ,#*`N7 -MB`F5'5"W.E5@ULF?A874A.`Y5)-S,JV!79#@3[L]83?P7U\8G/7XG#@12:8F -M!LT?MIHY"[H6>8R8!"D``"09`TJX[I>_)@"&94X+X(IWG@#?<9K#VS+&&4Z] -M\;HS+"D``!P``$`$KQFSCPRCL-!*7*#$I=D?,`ND6@$````<``!`!>9/_A=H -M<+>M78JV^0*ZR@N`*^T(D!*W1LO&!0"8`0``F`$```(```!%``&48[D``$`1 -M``#`J`$!P*@!`@'T`?0!@`=E_YN-E>Y_]Y4``````````"$@(@@````````! -M>"(``'@```!U`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``?8LXYB=V -MDAOW;G7$D9!TWYO>Q9JOF[AS:$SU-TOU^[4V%_N1=OA?*7D**RC4V"HY/WO1 -M:Z[8RYP!T.KL2VFNYP?V.'WW.S\TA"%:7=3Z_@0F-<4PNUQTNG%P-*L^@,[^.6Q3H(75%4QBM8$(I```D$5:OI@`IF/=9 -M)MD!/@0@G.M?WUSU%S_2P)>]2JT21]DI```<``!`!/+.U;1)XJJ!)812K@-2 -MANC"G*E#````'```0`6&L>N[YR7>S#-LD/\Y+0I&?,^[U9`2MT9R\P@`F`$` -M`)@!```"````10`!E&._``!`$0``P*@!`<"H`0(!]`'T`8`'9?^;C97N?_>5 -M```````````A("((`````````7@B``!X````=0$!``P#```,`0``#(`.`(`# -M```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(` -M``$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"```` -M"`0```XH``"(``(``'V+..8G=I(;]VYUQ)&0=-^;WL6:KYNX*J@26$4JX#4H;HPIRI0P```!P``$`%AK'KN^``` -M`'4!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"``!]BSCF)W:2&_=N=<21 -MD'3?F][%FJ^;N'-H3/4W2_7[M387^Y%V^%\I>0HK*-38*CD_>]%KKMC+G`'0 -MZNQ+::[G!_8X??<[/S2$(5I=U/K^!"8UQ3"[7'1RA'AEK3O(&N3Y9!Q.ZE_[ -M+>.+-ZZ<7`TJSZ`SOXY;%.@A=453&*U@0BD``"015J^F`"F8]UDFV0$^!""< -MZU_?7/47/]+`E[U*K1)'V2D``!P``$`$\L[5M$GBJH$EA%*N`U*&Z,*"(``'@```!V`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``P6KF5)&@]V.8\RT1_(E;\#N@-^*!J\(H">_,R@!$\\G];1%Q;`*_ -MY@8K1R\/Q6+IQF2R2&7_ZK69AFS\OQGZS8WL^2?N%)2S_R=.7\<%0/#C7-ZR -MO8"O8&46M^236*JW:'TO`J9I=',+XF\.""YN>%^484P08@2`NA>MRVH:FV`I -M```D1*HLR[FW-$$I&?@9U!1TG*4:/\'H@227U.V=@-(Y_K4I```<``!`!/2L -MP@S>,A?F;]CJ9W_3,L=<%6LJ````'```0`7&S5LKV`KV!E%K?DDUBJMVA]+P*F:71S"^)O#@@N -M;GA?E&%,$&($@+H7K````'8!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``#! -M:N94D:#W8YCS+1'\B5OP.Z`WXH&KPB@)[\S*`$3SR?UM$7%L`K_F!BM'+P_% -M8NG&9+)(9?_JM9F&;/R_&?K-C>SY)^X4E+/_)TY?QP5`\.-B!))?4[9V`TCG^M2D``!P``$`$]*S"#-XR%^9O -MV.IG?],RQUP5:RH````<``!`!<;-5RU_U"ICUN/.J-%+G81)+!"\DQ*W1EJ# -M!0"8`0``F`$```(```!%``&48_@``$`1``#`J`$!P*@!`@'T`?0!@`=E(;LC -M@P:H_AD``````````"$@(@@````````!>"(``'@```!W`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``EDNP\W9FS[:H:CQ*P93?"-!F:.9XC=@@0:ZS -M+HDI"?Y>+HSNQW0EA7'7'];27`#OI!]V7WMP!$76=S.,)&?4P![W5#;@X&0; -MHRQ\E_X]MN*H=S$&IVF5?]@+:M?G%);T2URVUIL0QV?AXFR##(PU"X*21JW\ -M"WX\1.>G]>=M/-XI```DA;4HG4R"L74#8UV=P8!_/GPF*EV`CGPK3C73Z,N@ -M`5,4:TO41^=4````'```0`4UL4]#Y-#0 -MT+5OBQD62_[=&_)>&Y,2MT8$I0@`F`$``)@!```"````10`!E&/Z``!`$0`` -MP*@!`<"H`0(!]`'T`8`'92&[(X,&J/X9```````````A("((`````````7@B -M``!X````=P$!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`. -M`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P`` -M"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``)9+L/-V9L^V -MJ&H\2L&4WPC09FCF>(W8($&NLRZ)*0G^7BZ,[L=T)85QUQ_6TEP`[Z0?=E][ -M<`1%UG]U0VX.!D&Z,L?)?^/;;BJ')L@PR,-0N"DD:M_`M^/$3GI_7G;3S>*0``)(6U*)U,@K%U`V-= -MG<&`?SY\)BI=@(Y\*TXUT^C+H'*C*0``'```0`0^(\>4-L>4Q\9X'@%3%&M+ -MU$?G5````!P``$`%-;%/0^30T-"U;XL9%DO^W1OR7AN3$K=&EN8.`)@!``"8 -M`0```@```$4``91C^P``0!$``,"H`0'`J`$"`?0!]`&`!V4ANR.#!JC^&0`` -M````````(2`B"`````````%X(@``>````'W`$1=9W,XPD9]3`'O=4-N#@9!NC+'R7_CVV -MXJAW,0:G:95_V`MJU^<4EO1+7+;6FQ#'9^'B;(,,C#4+@I)&K?P+?CQ$YZ?U -MYVT\WBD``"2%M2B=3(*Q=0-C79W!@'\^?"8J78".?"M.-=/HRZ!RHRD``!P` -M`$`$/B/'E#;'E,?&>!X!4Q1K2]1'YU0````<``!`!36Q3T/DT-#0M6^+&19+ -M_MT;\EX;E!*W1K+R#`"8`0``F`$```(```!%``&48_X``$`1``#`J`$!P*@! -M`@'T`?0!@`=E^:"D$FFP"(``'@```!X -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``&:;EH!0N')FU;T:/ONMH -M))E2V7P%W9]+H5_(J316(A#+1WMR)HLT0QWMQKF -M-YZ1Q,$!$4J`_M\V(L$I```<``!`!)<4-V50S#.IV*!FP7V&3I*P0,;2```` -M'```0`64C[%^/+_06\IV5942MT;2W```F`$``)@!```"```` -M10`!E&/_``!`$0``P*@!`<"H`0(!]`'T`8`'9?F@I!)IL'+R```````````A -M("((`````````7@B``!X````>`$!``P#```,`0``#(`.`(`#```,`0``#(`. -M`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@`` -M!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"( -M``(``!FFY:`4+AR9M6]&C[[K:"294ME\!=V?2Z%?R*DT5B(0RT=[K,J&:W]2R"99,+')][[B;+@7U1=F-T[+A["%S!81MBX:?8,:E-&';,*0`` -M)%KQ&QY[$_G//6*I*BIJ8ZF7IC>>D<3!`1%*@/[?-B+!*0``'```0`27%#=E -M4,PSJ=B@9L%]ADZ2L$#&T@```!P``$`%E(W.:9Q\&V\[@'NQ?CR_T%O*=E65 -M$K=&````'@!`0`,`P`` -M#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"```9IN6@%"XW(FBS1#'>W&MSDB+S.[C3P4[^U8#.WT^CCF;@;-A6'( -M',K>1-.=K%62@9W9WTS`92)6-AGJS*AFM_4L@F63"QR?>^XFRX%]479C=.RX -M>PA>Q/YSSUBJ2HJ:F.IEZ8WGI'$P0$1 -M2H#^WS8BP2D``!P``$`$EQ0W95#,,ZG8H&;!?89.DK!`QM(````<``!`!92- -MSFF"(``'@```![`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``L8OJ -MRL)M7):8:*OB4V(B&IYDE%#QQ;)VKR"O1I:C;!H\T1^KV6*IQ&0N*%2W]2C1 -MIN4'#+M4%S-&'N!4*O=G1T`QNS^HUG"#EI[3GKRRRY#E-6Q#HN0I54?(W^1A -M05U[(3HJ][2\GM6OBGG(Z!]A9)((&!Z?AP!\M&&$XD?`X\HI```DI,:>$U80 -MX/$:F%RTDR.Z59XE)"`;?LZ[)5]45AA0J'(I```<``!`!*UY8@M-WS>GT283 -M$WR=#"9`TZWE````'```0`47O/N2'T+$#7^>%Q("5@K\!Q^66)82MT;25@@` -MF`$``)@!```"````10`!E&0.``!`$0``P*@!`<"H`0(!]`'T`8`'96`K]<$9 -MNS_X```````````A("((`````````7@B``!X````>P$!``P#```,`0``#(`. -M`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P`` -M"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```" -M````"`0```XH``"(``(``+&+ZLK";5R6F&BKXE-B(AJ>9)10\<6R=J\@KT:6 -MHVP:/-$?J]EBJ<1D+BA4M_4HT:;E!PR[5! -MTYZ\LLN0Y35L0Z+D*55'R-_D84%=>R$Z*O>TO)[5KXIYR.@?8622"!@>GX<` -M?+1AA.)'P./**0``)*3&GA-6$.#Q&IA)20@&W[.NR5?5%884*AR -M*0``'```0`2M>6(+3=\WI]$F$Q-\G0PF0-.MY0```!P``$`%%[S[DA]"Q`U_ -MGA<2`E8*_`````'L!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"``"QB^K*PFUX%0J]V='0#&[/ZC6<(.6GM.>O+++D.4U;$.BY"E51\C?Y&%!77LA.BKW -MM+R>U:^*>4````<``!`!1>\^Y(?0L0-?YX7$@)6"OP''Y98EQ*W1I*A#`"8`0``F`$` -M``(```!%``&49"```$`1``#`J`$!P*@!`@'T`?0!@`=EAU,J.O#CV=4````` -M`````"$@(@@````````!>"(``'@```!\`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``2L"EM:%/5>4SR6]_Z:-@]ZM8JVMUH6M(GH!<&Z.QQFQ3F@-^ -MDB.8SD\N.F842UNIWXW2N65+D"!1I$-X_^=>"IT\$\"H0Q/5!ED8WS$_"M3O -M_>JHX&SUHC3#LASUZ1NWC*F1.=7H-@8(8]/R5[.>0*0+*^F_EU,D&#`.;/:* -M.U(I```D.8`:Z2F1TJKZ?T,;O*(>1%_Z[I_SHT:YL?@I&4]6M"0I```<``!` -M!%@3O@3B=-Z%^T0?DLUHQ+$C`PT?````'```0`5!6-+J13.VH5\3(3S\AKAW -M4[,H+Y@2MT:KC@``F`$``)@!```"````10`!E&0A``!`$0``P*@!`<"H`0(! -M]`'T`8`'98=3*CKPX]G5```````````A("((`````````7@B``!X````?`$! -M``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0`` -M`P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```( -M`P``!0,```@$```"````"`0```XH``"(``(``$K`I;6A3U7E,\EO?^FC8/>K -M6*MK=:%K2)Z`7!NCL<9L4YH#?I(CF,Y/+CIF%$M;J=^-TKEE2Y`@4:1#>/_G -M7@J=/!/`J$,3U099&-\Q/PK4[_WJJ.!L]:(TP[(<]>D;MXRID3G5Z#8&"&/3 -M\E>SGD"D"ROIOY=3)!@P#FSVBCM2*0``)#F`&NDID=*J^G]#&[RB'D1?^NZ? -M\Z-&N;'X*1E/5K0D*0``'```0`18$[X$XG3>A?M$'Y+-:,2Q(P,-'P```!P` -M`$`%05C2ZD4SMJ%?$R$\_(:X=U.S*"^8$K=&(]`&`)@!``"8`0```@```$4` -M`91D(@``0!$``,"H`0'`J`$"`?0!]`&`!V6'4RHZ\./9U0``````````(2`B -M"`````````%X(@``>````'P!`0`,`P``#`$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M``!*P*6UH4]5Y3/);W_IHV#WJUBK:W6A:TB>@%P;H['&;%.:`WZ2(YC.3RXZ -M9A1+6ZG?C=*Y94N0(%&D0WC_YUX*G3P3P*A#$]4&61C?,3\*U._]ZJC@;/6B -M-,.R'/7I&[>,J9$YU>@V!@ACT_)7LYY`I`LKZ;^74R08,`YL]HH[4BD``"0Y -M@!KI*9'2JOI_0QN\HAY$7_KNG_.C1KFQ^"D93U:T)"D``!P``$`$6!.^!.)T -MWH7[1!^2S6C$L2,##1\````<``!`!4%8TNI%,[:A7Q,A//R&N'=3LR@OF1*W -M1@/9!`"8`0``F`$```(```!%``&49",``$`1``#`J`$!P*@!`@'T`?0!@`=E -MU:A&8`.*8W4``````````"$@(@@````````!>"(``'@```!]`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``.2@:JI.63ET`AJ@%58DF6H``J"L-%1%( -MNWDI*?__(\]2*)JCC:/\[7#A]4[O,VDLHNTO -M%<)4^ZZ38Z8V*$2![C]Q11=J(>%=VVA%.WOR0O:\>`S=_LS?-W"O5G4,N`,B -MP-Q,9]6C=\1@;KGVE3(I```DZ`6V-'R1$V^B%`.HM'$[1*G:07`Y-'L"/7U+ -MEJ=O,<,I```<``!`!-#`M>Q.WO57)D5;X_<447:B'A7=MH13M[ -M\D+VO'@,W?[,WS=PKU9U#+@#(L#<3&?5HW?$8&ZY]I4R*0``).@%MC1\D1-O -MHA0#J+1Q.T2IVD%P.31[`CU]2Y:G;S'#*0``'```0`30P+7L3M[U5R9%6W#] -MC_8Y3_\W#0```!P``$`%.AJ)]*>W/FZT^QV]8Y2F?W>UUM>9$K=&34H.`)@! -M``"8`0```@```$4``91D)0``0!$``,"H`0'`J`$"`?0!]`&`!V75J$9@`XIC -M=0``````````(2`B"`````````%X(@``>````'T!`0`,`P``#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"```Y*!JJDY9.70"&J`55B29:@`"H*PT5$4B[>2DI__\C -MSU(HFJ.-H_SM<.'U3N\QR'/J>CZL,VA`Y0]E^+#/!S9[:2RB[2\5PE3[KI-C -MIC8H1('N/W%%%VHAX5W;:$4[>_)"]KQX#-W^S-\W<*]6=0RX`R+`W$QGU:-W -MQ&!NN?:5,BD``"3H!;8T?)$3;Z(4`ZBT<3M$J=I!<#DT>P(]?4N6IV\QPRD` -M`!P``$`$T,"U[$[>]5"(``'@` -M`/__`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``M*^#!%0A^/T+'J=] -MU+D:I!>9+:[JU)P1<3_](+(67E/>\QE&)6HPAPTQ(F(]APOZSU#\A'G4IZ4U-$)3Y&1@'N?6>T(N<9^[+C$A9W1"4S34+K$! -M$K6?'O=O?$SZ3`R/%_>X(@JZS1E!@(6ZPBDI```D`*.,CDFHCC8F%<==S,A$ -MVZ07.7NL]E27-58!BZ@H0```F`$``)@!```" -M````10`!E&0L``!`$0``P*@!`<"H`0(!]`'T`8`'93+LK.V6*C#]```````` -M```A("((`````````7@B``!X``#__P$!``P#```,`0``#(`.`(`#```,`0`` -M#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```( -M`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH -M``"(``(``+2O@P14(?C]"QZG?=2Y&J07F2VNZM2<$7$__2"R%EY3WO,91B5J -M,(<-,2)B/8<+^L]7,K4>%'/E\`]#370-1.E:>.'@_(1YU*>E-31"4^1D8![G -MUGM"+G&?NRXQ(6=T0E,TU"ZQ`1*UGQ[W;WQ,^DP,CQ?WN"(*NLT908"%NL(I -M*0``)`"CC(Y)J(XV)A7'7C````!P``$`%=H59PPYKZ!ZOI+N[YB(1`"-P -MA36;$K=&_H$&`)@!``"8`0```@```$4``91D-```0!$``,"H`0'`J`$"`?0! -M]`&`!V4R[*SMEBHP_0``````````(2`B"`````````%X(@``>```__\!`0`, -M`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``"TKX,$5"'X_0L>IWW4N1JD%YDM -MKNK4G!%Q/_T@LA9>4][S&48E:C"'#3$B8CV'"_K/5S*U'A1SY?`/0TUT#43I -M6GCAX/R$>=2GI34T0E/D9&`>Y]9[0BYQG[LN,2%G=$)3--0NL0$2M9\>]V]\ -M3/I,#(\7][@B"KK-&4&`A;K"*2D``"0`HXR.2:B.-B85QUW,R$3;I!ZSV -M5)KZ2[N^8B$0`C<(4UG!*W1MJ-!`"8`0``F`$```(```!%``&4 -M9'$``$`1``#`J`$!P*@!`@'T`?0!@`=E+B+0&]%]H5```````````"$@(@@` -M```````!>"(``'@``(```0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M9^J^2>C2^3X=&F^YU3)[>B0@C_!\#"V7_)4&+/C.`#9FR"@0P?/SAM0DS^F= -M9[>+9&J%&ICTO-JFV+R.M26@D\:@6_'G=E`=18P>A1/8W["'(^D\WA2=S:R# -MD4\'._*-.!7(^,?/GT#FZ])TWHD((_P?`PME_R5 -M!BSXS@`V9L@H$,'S\X;4),_IG6>WBV1JA1J8]+S:IMB\CK4EH)/&H%OQYW90 -M'46,'H43V-^PAR/I/-X4G"0)-"H)]\/I\L(0)VH"/%.%/E -MSAM#*0``'```0`1%"@7Q/94?#9,HXPY)$JA2N,A%,````!P``$`%S_Q=6?V( -M'/$R0SVE2C7\&024>LZ<$K=&>?P-`)@!``"8`0```@```$4``91D?P``0!$` -M`,"H`0'`J`$"`?0!]`&`!V4N(M`;T7VA4```````````(2`B"`````````%X -M(@``>```@``!`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"``!GZKY)Z-+Y -M/AT:;[G5,GMZ)""/\'P,+9?\E08L^,X`-F;(*!#!\_.&U"3/Z9UGMXMD:H4: -MF/2\VJ;8O(ZU):"3QJ!;\>=V4!U%C!Z%$]C?L(%)W-K(.13P<[\HTX -M%NRD``"34_>SQRF4_VM^' -M@D"30J"??#Z?+"$"=J`CQ3A3Y"(``'@```!T``$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``;**S2:1PPAVT*;<@0W`0O_'B6.B#-X"7Q24+Q2]!?#&3 -MA-(B8&(G0.?D#-6"6,Y7;@@*G@1=E-]0S[S,\+U0[2(CE(UY'N5N:6P&MD]4FCDWG!S.Y$UICWMRMH(F7(T+;B_0`QTE2$HTEZ#U_=%>NN\]IJ:#$M,[."QIH=B(T,I```< -M``!`!/YLD^GOP,2UAX,=M@;XXX%[1G[+````'```0`4KD3E0C9@T?4=\*=W_ -M_7"U9DL.0YT2MT:5-`\`F`$``)@!```"````10`!E&2Q``!`$0``P*@!`<"H -M`0(!]`'T`8`'9=06_#(.*`>````````````A("((`````````7@B``!X```` -M=``!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```( -M`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$# -M```(`P``!0,```@$```"````"`0```XH``"(``(``&RBLTFD<,(=M"FW($-P -M$+_QXECH@S>`E\4E"\4O07PQDX32(F!B)T#GY`S5@EC.5VX("IX$793?4,^\ -MS/"]4.TB(Y2->1[E;FEL''RPSX.=BQ3E.H[WAK9/5)HY-YP@]?W17KK -MO/::F@Q+3.S@L::'8B-#*0``'```0`3^;)/I[\#$M8>#';8&^..!>T9^RP`` -M`!P``$`%*Y$Y4(V8-'U'?"G=__UPM69+#D.>$K=&Q3,&`)@!``"8`0```@`` -M`$4``91EFP``0!$``,"H`0'`J`$"`?0!]`&`!V74%OPR#B@'@``````````` -M(2`B"`````````%X(@``>````'0``0`,`P``#`$```R`#@"``P``#`$```R` -M#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(` -M``0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*``` -MB``"``!LHK-)I'#"';0IMR!#)8Z(,W@)?%)0O%+T%\,9.$TB)@8B=` -MY^0,U8)8SE=N"`J>!%V4WU#/O,SPO5#M(B.4C7D>Y6YI;!Q\L,^#G8L4Y3J. -M]X:V3U2:.3><',[D36F/>W*V@B9_TM2K]N@.9Q21L?I:82D` -M`"3!Z+]`#'25(2C27H/7]T5ZZ[SVFIH,2TSLX+&FAV(C0RD``!P``$`$_FR3 -MZ>_`Q+6'@QVV!OCC@7M&?LL````<``!`!2N1.5"-F#1]1WPIW?_]<+5F2PY# -MGQ*W1E!"!`"8`0``F`$```(```!%``&49N8``$`1``#`J`$!P*@!`@'T`?0! -M@`=E>?]B!O<.OA<``````````"$@(@@````````!>"(``'@```!T`@$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``]!>83ZV\'AS3BR50U3,R*UQ\T/25 -M9F$'-P7[F.N8C!C!B,NYQ,[=@FO1'IK=B"'Y;?KYR3XXTFQTYK7EMDT,)M4/ -M"Q\E*XAHJAU:XK)8<4<;DWNH:&L.(M3O,!A,WPO.I[C3,2_:FT$T!1$'<*B" -M^RNY"^W2[Z<].@T'9HNNZ>DI```D:Q-H7%Y,)M;+CEUP+)H$ADQPNMLU"W.[ -M6ZD?+*SEZ`,I```<``!`!/\)3FH7WAQL21*+Y1Q(HGH,+I;O````'```0`5U -M2GB__KA\<#8<[1XJ\W<^)D6$RY\2MT9';`<`F`$``)@!```"````10`!E&;R -M``!`$0``P*@!`<"H`0(!]`'T`8`'97G_8@;W#KX7```````````A("((```` -M`````7@B``!X````=`(!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```, -M`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@# -M```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``/07 -MF$^MO!XXTS$OVIM!-`41!W"H@OLKN0OMTN^G/3H-!V:+KNGI*0``)&L3:%Q> -M3";6RXY=<"R:!(9,<+K;-0MSNUNI'RRLY>@#*0``'```0`3_"4YJ%]X<;$D2 -MB^4<2*)Z#"Z6[P```!P``$`%=4IXO_ZX?'`V'.T>*O-W/B9%A,N?$K=&UJT- -M`)@!``"8`0```@```$4``91F^@``0!$``,"H`0'`J`$"`?0!]`&`!V5Y_V(& -M]PZ^%P``````````(2`B"`````````%X(@``>````'0"`0`,`P``#`$```R` -M#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,` -M``@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!``` -M`@````@$```.*```B``"``#T%YA/K;P>'-.+)5#5,S(K7'S0])5F80FMV((?EM^OG)/CC2;'3FM>6V30PFU0\+'R4KB&BJ -M'5KBLEAQ1QN3>ZAH:PXBU.\P&$S?"\ZGN-,Q+]J;030%$0=PJ(+[*[D+[=+O -MISTZ#0=FBZ[IZ2D``"1K$VA<7DPFULN.77`LF@2&3'"ZVS4+<[M;J1\LK.7H -M`RD``!P``$`$_PE.:A?>'&Q)$HOE'$BB>@PNEN\````<``!`!75*>+_^N'QP -M-ASM'BKS=SXF183+H!*W1E*Y"P"8`0``F`$```(```!%``&49TT``$`1``#` -MJ`$!P*@!`@'T`?0!@`=E4567_"(` -M`'@```!T`@$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``@+K%%XGPUV)& -M#7_3O58JVSW!&<2WUP<[*7Z\4]YA*^.,)V#Q,8%`2^9J]IE -M)"-+````'```0`5U9@>8K)\-=B1@U_T[U6*ML]P1G$M]<'.RE^O%/>82OCC"=@ -M\3&!7*1U!RLT>U95FI7WYTBDQITO):EHX6:%]O[E>KDD-PX##D'VG=[>8XGU -MP/^N2!!#"#)4]`-_!I;F/)+@F017`J5Y*E_/((DT8VONSDO-5\D]AF(ZK1+/ -M(HC`*0``)#!\;ESM[85%_Q`-#$0&`[A*>!@\J5T.['>%WT@$M6V'*0``'``` -M0`0*6&(H&Z#^MRH)7@$OF:O:920C2P```!P``$`%=68'F*W**U%L4_>@4%`)@!``"8`0```@```$4``91G3P``0!$``,"H`0'`J`$" -M`?0!]`&`!V5159?]RAHXT@``````````(2`B"`````````%X(@``>````'0" -M`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$` -M``,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P`` -M"`,```4#```(!````@````@$```.*```B``"``"`NL47B?#78D8-?].]5BK; -M/<$9Q+?7!SLI?KQ3WF$KXXPG8/$Q@5RD=0WF.)]<#_KD@00P@R5/0#?P:6YCR2X)D$5P*E>2I? -MSR")-&-K[LY+S5?)/89B.JT2SR*(P"D``"0P?&Y<[>V%1?\0#0Q$!@.X2G@8 -M/*E=#NQWA=](!+5MARD``!P``$`$"EAB*!N@_K#KBL``````````"$@ -M(@@````````!>"(``'@```!T`P$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``TBJ;2:@L(:"])^D3>]D8]ZQY1A":B,]*W0[<+P\-7!VV5`>R54(;>$BZ -MRUKXV#=AWEK92?`MDRU1"[*EFO4;;!)J!U_%^KUB_?,[9>S`VXSTK$>;\197 -M2I@8AV3I=0P`EF""$&SS-_=@6;F?;)HB+-B7MFOC.VE*?XSSG27*0EXI```D -MHU\TS3R2AZ'42X90TF%)67KR#LN$QE3`\>B?Q&!.LU\I```<``!`!,FYF[>; -MJ+FQQMP.$^US+[Q:00R!````'```0`7D9Y+GBWAIH5!OP\7APV?O``!`$0``P*@!`<"H`0(!]`'T`8`' -M936,DL-'@ZXK```````````A("((`````````7@B``!X````=`,!``P#```, -M`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@" -M```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,` -M``@$```"````"`0```XH``"(``(``-(JFTFH+"&@O2?I$WO9&/>L>480FHC/ -M2MT.W"\/#5P=ME0'LE5"&WA(NLM:^-@W8=Y:V4GP+9,M40NRI9KU&VP2:@=? -MQ?J]8OWS.V7LP-N,]*Q'F_$65TJ8&(=DZ74,`)9@@A!L\S?W8%FYGVR:(BS8 -ME[9KXSMI2G^,\YTERD)>*0``)*-?-,T\DH>AU$N&4-)A25EZ\@[+A,94P/'H -MG\1@3K-?*0``'```0`3)N9NWFZBYL<;<#A/M2 -MYXMX::%0;\/%X<-GW)Q;YR6B$K=&IU\-`)@!``"8`0```@```$4``91GL``` -M0!$``,"H`0'`J`$"`?0!]`&`!V4UC)+#1X.N*P``````````(2`B"``````` -M``%X(@``>````'0#`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$` -M``R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P`` -M`@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``#2*IM) -MJ"PAH+TGZ1-[V1CWK'E&$)J(STK=#MPO#PU<';94![)50AMX2+K+6OC8-V'> -M6ME)\"V3+5$+LJ6:]1ML$FH'7\7ZO6+]\SME[,#;C/2L1YOQ%E=*F!B'9.EU -M#`"68((0;/,W]V!9N9]LFB(LV)>V:^,[:4I_C/.=)O(.RX3&5,#QZ)_$8$ZS7RD``!P``$`$R;F;MYNHN;'&W`X3 -M[7,OO%I!#($````<``!`!>1GDN>+>&FA4&_#Q>'#9]R<6^"(``'@```!T!`$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``29-:O[K9&EZG4/5SR=!UXQT4&7#ZG1%^0PDD\U8L -M677J%V@#@R3L]$T9?]URLX[ALCU5#`%.9/?]\P;I#:WV4A-H#2T?=R<9U/YY632)C3P/W -M8=M#&`VN.API```D0IC![8=*8P!E7]3V#^X7UR/:$I,RXCTH,;L?@B(^H<`I -M```<``!`!+)"AW*"`R_V!X\&DSYR&7(LG$\H````'```0`7@HHK8=F!8PC@X -MG^,,WEPN9[.]?*,2MT80F`X`F`$``)@!```"````10`!E&@2``!`$0``P*@! -M`<"H`0(!]`'T`8`'9==XXG_([J0H```````````A("((`````````7@B``!X -M````=`0!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`# -M```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,` -M``$#```(`P``!0,```@$```"````"`0```XH``"(``(``$F36K^ZV1I>IU#U -M<\G0=>,=%!EP^IT1?D,))/-6+%EUZA=H`X,D[/1-&7_=5DTB8T\#]V';0Q@-KCH<*0``)$*8P>V'2F,`95_4]@_N -M%]/!I,^SO7RD$K=&W9<%`)@!``"8`0`` -M`@```$4``91H&@``0!$``,"H`0'`J`$"`?0!]`&`!V77>.)_R.ZD*``````` -M````(2`B"`````````%X(@``>````'0$`0`,`P``#`$```R`#@"``P``#`$` -M``R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P`` -M"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```. -M*```B``"``!)DUJ_NMD:7J=0]7/)T'7C'109H7:`.# -M).ST31E_W7*SCN%RAZR/55S/6]Q.K2G]&Q-89MUBW9VE/+J`BF_&?L:C>:`W -M6[>A)K=))X,`4YD]_WS!ND-K?92$V@-+1]W)QG4_GE9-(F-/`_=AVT,8#:XZ -M'"D``"1"F,'MATIC`&5?U/8/[A?7(]H2DS+B/2@QNQ^"(CZAP"D``!P``$`$ -MLD*'"BBMAV8%C".#B?XPS>7"YG -ML[U\I1*W1L"B`P"8`0``F`$```(```!%``&4:!\``$`1``#`J`$!P*@!`@'T -M`?0!@`=E0K^WN.=KWYH``````````"$@(@@````````!>"(``'@```!T!P$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``V4FR4/N#H^9(Y=VTY\5.=<.E -M"DE5_;Y8E=0,#Q1#(57,9:TR -M6(+%U+]\^AW+1C"K>C=GNN+TZCFRPHCHM7N"<@MVPC(M;X?GX'QTUW3664<@ -M*J6>.OZ@U&7JRHQ:IGUJ^@]O5G0H"X&H#<(:42MT:KSP8`F`$``)@!```"````10`! -ME&@@``!`$0``P*@!`<"H`0(!]`'T`8`'94*_M[CG:]^:```````````A("(( -M`````````7@B``!X````=`@```!P``$`%Z,XYVO?F@``````````(2`B"`````````%X(@``>````'0'`0`,`P``#`$` -M``R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@`` -M`@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```( -M!````@````@$```.*```B``"``#92;)0^X.CYDCEW;3GQ4YUPZ4*257]R(3> -MAHLPLZ%`O[8M;(YKO!I2@B6!&=A')P]YOEB5U`P/%$,A5ZXO3J.;+"B.BU>X)R"W;",BUOA^?@?'37=-991R`JI9XZ_J#4 -M9>K*C%JF=R]I/__T8RD``"3@C47")K;Q.(2F9!%?@=$>_?MLPQ`G2B-;,P#Y -M+*9QJ"D``!P``$`$7^VSYH)+^*7?32O!T[YP9#\(/7H````<``!`!>C'*%PG -M#I[6KZ#V]6="@+@:@-PAIA*W1H\>"P"8`0``F`$```(```!%``&4:"P``$`1 -M``#`J`$!P*@!`@'T`?0!@`=E3&UB<`W"(``'@```!T"`$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``--#)HZ,= -MM3.BUF75Q!CE'V^'3^^1"VS6C,`OCNPS7DL)2+5KVX,DF66NA;4,)O@@.*FH -M:&XIN?6]D$R0F]J23G#0$I@Z*PG#1C`9U0AWGH8QB&Z(L3Q6R>^).LY):)I= -MV7OQAVV?9]5,`+9>(7*A91B(*L>T1=SF'X0@```!P``$`%CD+V*58QZ=44%"DU -M>H8Z3D4+;8*G$K=&+TD%`)@!``"8`0```@```$4``91H.P``0!$``,"H`0'` -MJ`$"`?0!]`&`!V5,;6)P#=SJD0``````````(2`B"`````````%X(@``>``` -M`'0(`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"```TT,FCHQVU,Z+69=7$ -M&.4?;X=/[Y$+;-:,P"^.[#->2PE(M6O;@R299:Z%M0PF^"`XJ:AH;BFY];V0 -M3)";VI).<-`2F#HK"<-&,!G5"'>>AC&(;HBQ/%;)[XDZSDEHFEW9>_&'9P%# -MQU@MW(WMGV?53`"V7B%W(H==45VVA:-G3RD``"3=AV&L!V/JR&K5P58&@D"- -MNHYF2TS$#2MJ&0S<&9+";BD``!P``$`$0,BAD#+;7BH648B"K'M$7G5%!0I-7J&.DY%"VV"J!*W1HI5`P"8`0``F`$```(` -M``!%``&4:#T``$`1``#`J`$!P*@!`@'T`?0!@`=E+:GTMV*?#HL````````` -M`"$@(@@````````!>"(``'@```!T"0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``H$Q5[Z@A!4/3J/?WR!9KQ>.14Y+RFFB5_I_CV3\P#V7FIOD\QTU( -MV(("#!:+;XWJ[LWC\!)9`I```<``!`!&$; -M.1P"%?_!$L#0CERX+!$X?-ZU````'```0`7NE:"]M#7,Y,?0]Y57M^H(05#TZCW]\@6:\7CD5.2 -M\IIHE?Z?X]D_,`]EYJ;Y/,=-2-B"`@P6BV^-ZN[-W#_59"/+A1-!6L?XF*=P -M37Q(QYE0M3KZ:V%8W4Q1&]CF;-H]Z$0\_N)5?(?2MS[TK8B7T38IHQYI[-^- -M%&^L):2UJ,QX#'6@#OA/UM$>*0``)*6'X8^O>D@_6CWQ81(,+TKV:ND\\.@U -M5C=%JWH_`260*0``'```0`1A&SD<`A7_P1+`T(YM0```!P``$`% -M[I6@O;0US.3'T/>55[7.2R-F,@*H$K=&+<,,`)@!``"8`0```@```$4``91H -M10``0!$``,"H`0'`J`$"`?0!]`&`!V4MJ?2W8I\.BP``````````(2`B"``` -M``````%X(@``>````'0)`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``"@ -M3%7OJ"$%0].H]_?(%FO%XY%3DO*::)7^G^/9/S`/9>:F^3S'34C8@@(,%HMO -MC>KNS=P_U60CRX4305K'^)BG<$U\2,>94+4Z^FMA6-U,41O8YFS:/>A$//[B -M57R'TK<^]*V(E]$V*:,>:>S?C11OK"6DM:C,>`QUH`[X3];1'BD``"2EA^&/ -MKWI(/UH]\6$2#"]*]FKI//#H-58W1:MZ/P$ED"D``!P``$`$81LY'`(5_\$2 -MP-".7+@L$3A\WK4````<``!`!>Z5H+VT-USDLC9C("J1*W1N0[ -M"P"8`0``F`$```(```!%``&4:-$``$`1``#`J`$!P*@!`@'T`?0!@`=E[X9? -M[F*,X4(``````````"$@(@@````````!>"(``'@```!T^`$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``8'8'VN:J3&+GZ/ID:$2UO\3K^%[/;_\Y3FH: -MH(UC/_!_P+?>227QJ6LC350!`>E*'+CCO``&%>.1%W8+[0%9>88PJ^JH@]I$ -M*;0'('5;:M:Z?^!=N3.2A3TT7-=W)`\J>]"6EW#GDM74AC\IJ`+DC%RQ?F3# -ML>;CPH4UW)KZ&>(I```DH5,C;FTW)!%&;&+Q0,F1@W^;MNL>?U&&TFKK.U$" -M9;0I```<``!`!-L&L2=#XV]*4DO7GAR!PVBD6WSS````'```0`5\G7FF8#3G -M.IS1R9>'KJU_EZ$F^&7^YBC.%"```````````A("((`````````7@B -M``!X````=/@!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`. -M`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P`` -M"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``&!V!]KFJDQB -MY^CZ9&A$M;_$Z_A>SV__.4YJ&J"-8S_P?\"WWDDE\:EK(TU4`0'I2ARXX[P` -M!A7CD1=V"^T!67F&,*OJJ(/:1"FT!R!U6VK6NG_@7;DSDH4]-%S7=R0/*GO0 -MEI=PYY+5U(8_*:@"Y(QA)G.J$K=&$W`%`)@!``"8 -M`0```@```$4``91HU```0!$``,"H`0'`J`$"`?0!]`&`!V7OAE_N8HSA0@`` -M````````(2`B"`````````%X(@``>````'3X`0`,`P``#`$```R`#@"``P`` -M#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```! -M`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$ -M```.*```B``"``!@=@?:YJI,8N?H^F1H1+6_Q.OX7L]O_SE.:AJ@C6,_\'_` -MM]Y))?&I:R--5`$!Z4H2U=2&/RFH`N2,7+%^9,.QYN/"A37< -MFOH9XBD``"2A4R-N;3>'('#:*1;?/,````<``!`!7R=>:9@-.N -MK7^7H29SJQ*W1N)Z`P"8`0``F`$```(```!%``&4:-4``$`1``#`J`$!P*@! -M`@'T`?0!@`=EK86F^]W"*>P``````````"$@(@@````````!>"(``'@```!T -M^0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``C?&A.:E_JJY'65:,A2@9 -MWV@U3:V3M;UV'Z%`3(0@XIN:YDZZ^[)+,%&2\[0OCB8IP7X9.R -M[2S-[E(MQPBKS&```` -M'```0`5>*>>&RYX$Z^+:S[W$@V.S#(I[6:L2MT:@J`8`F`$``)@!```"```` -M10`!E&C:``!`$0``P*@!`<"H`0(!]`'T`8`'9:V%IOO=PBGL```````````A -M("((`````````7@B``!X````=/D!``P#```,`0``#(`.`(`#```,`0``#(`. -M`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@`` -M!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"( -M``(``(WQH3FI?ZJN1UE6C(4H&=]H-4VMD[6]=G(A3U'"IPGA^A0$R$(.*;FN -M9.NONR2S!1DO.T+XXF*<%^&3LG(OOZ.*D4$]''*H8I3GNTLS>Y2+<<(J\Q@```!P``$`%7BGGALN>!.OBVL^]Q(-CLPR*>UFK -M$K=&+^H,`)@!``"8`0```@```$4``91HXP``0!$``,"H`0'`J`$"`?0!]`&` -M!V6MA:;[W<(I[```````````(2`B"`````````%X(@``>````'3Y`0`,`P`` -M#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"``"-\:$YJ7^JKD=95HR%*!G?:#5-K9.U -MO79R(4]1PJ<)X?H4!,A"#BFYKF3KK[LDLP49+SM"^.)BG!?AD[)R+[^CBI%! -M/1QRG,>/DTXN^V"\;2 -M!VLTG:8^'"D``!P``$`$-]_G3A7J&*4Y[M+,WN4BW'"*O,8````<``!`!5XI -MYX;+G@3KXMK/O<2#8[,,BGM9K!*W1H7U"@"8`0``F`$```(```!%``&4:/4` -M`$`1``#`J`$!P*@!`@'T`?0!@`=E*#>4BK."(``'@```!T^@$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``'.I< -MVV7'2G7,/':GJ4B4R&RO+IIZ*'GH8TG'C;D6(R5;UV,8Z!`E8E% -M)2SE05*'OA03RU8OQD2(?"O.Q4:$<]`-_I7?J_WN63!T7!,I```D=Y7$Y[]P9UUW`_"&[OZZP2MT:T(@X` -MF`$``)@!```"````10`!E&D%``!`$0``P*@!`<"H`0(!]`'T`8`'92@WE(JS -MG(I4```````````A("((`````````7@B``!X````=/H!``P#```,`0``#(`. -M`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P`` -M"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```" -M````"`0```XH``"(``(``!SJ7-MEQTIUS#QVIZE(E,ALKRZ:>BAYZ&-)QXVY -M'*]38^T-<+^N-MP?@KU:[#;/Z%5W:0<<2&G%$41X>',*&RZ^`6+&,-,9D+]< -M0C':`S6L'EB,E6]=C&.@0)6)124LY4%2A[X4$\M6+\9$B'PKSL5&A'/0#?Z5 -MWZO][EDP=%P3*0``)'>5W*H*1[-4K<*NR5BO&-S#@A%$"'A.7-#&Y6>?#3A; -M*0``'```0`2H[T#,Z\Q>TR@<'\A>[!`SG4Y"O````!P``$`%MJ:F18#-C&=G -MN_<&===P/PAN[^NM$K=&["$%`)@!``"8`0```@```$4``91I"```0!$``,"H -M`0'`J`$"`?0!]`&`!V4H-Y2*LYR*5```````````(2`B"`````````%X(@`` -M>````'3Z`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"```I2)3(;*\NFGHH>>AC2<>-N1RO4V/M#7"_KC;<'X*]6NPVS^A5=VD''$AI -MQ1%$>'AS"ALNO@%BQC#3&9"_7$(QV@,UK!Y8C)5O78QCH$"5B44E+.5!4H>^ -M%!/+5B_&1(A\*\[%1H1ST`W^E=^K_>Y9,'1<$RD``"1WE=RJ"D>S5*W"KLE8 -MKQC"(``'@```!T_0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``&.?G+Z,Y6N\VE\?D+_A2W,](P$%-T.O49\;-S^9:%!X$L@D2 -M2L'%%;+[SP/>P%DT.1K:THG<.HW8JKN_6E5@=Y(3S[-LSTU<=%WZ^G)%(]56 -MH0F*<)4DXR1/[.X"]HG_`:#\S,<&-0>0\!?X(&,\\&,'=#N808,'`QQK>A*8 -MV$XI```DF=:..Q2J)1KM7XZ3TU7.@!@!!Q2E1,;:5F%!$^P7X?PI```<``!` -M!.]]GZ8N!-ZJA'M"[-)EI.D0#!MM````'```0`6#+&"B>SC7F#[R$ZLL!+()$DK!Q16R^\\#WL!9-#D:VM*)W#J-V*J[OUI5 -M8'>2$\^S;,]-7'1=^OIR12/55J$)BG"5).,D3^SN`O:)_P&@_,S'!C4'D/`7 -M^"!C//!C!W0[F$&#!P,<:WH2F-A.*0``))G6CCL4JB4:[5^.D]-5SH`8`0<4 -MI43&VE9A01/L%^'\*0``'```0`3O?9^F+@3>JH1[0NS29:3I$`P;;0```!P` -M`$`%@RQ@HGLXUY@^\A.K+',)160P;_&N$K=&WIL,`)@!``"8`0```@```$4` -M`91I*P``0!$``,"H`0'`J`$"`?0!]`&`!V67U\ZYV]-5,@``````````(2`B -M"`````````%X(@``>````'3]`0`,`P``#`$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M```8Y^T+LTF6DZ1`,&VT````<``!`!8,L8*)[.->8/O(3JRQS"45D,&_QKQ*W -M1@2H"@"8`0``F`$```(```!%``&4:2T``$`1``#`J`$!P*@!`@'T`?0!@`=E -MMA.+4>O;#7<``````````"$@(@@````````!>"(``'@```!T_@$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``2#S+H;PQ,5/F,(\5'\&?_)B"MT"X1TK( -M92?)&+:!C:/2C,;6*0%`2JGP;V5BO]:8OD!\#X>01H=BP%NA`?_N>7"3@^D^ -MQFC5H*NA[?(V]J6NA&UNST/9!^,M&03!LDN+ZX&@[>@8'CMR7,)5#U$T=4(` -MJA/M/X,RN^09\2&R0_TI```D&V.`&T\ZOL[%UE#E,3V/Z]L_(I^Q??>\C5GA -M-.T\&Y8I```<``!`!","4CV15L9-"3B$9>V7QK"2%X=W````'```0`7[X67E -M=.CF2+W'JEQV4KAWF/"7CJ\2MT9,U`T`F`$``)@!```"````10`!E&DN``!` -M$0``P*@!`<"H`0(!]`'T`8`'9;83BU'KVPUW```````````A("((```````` -M`7@B``!X````=/X!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0`` -M#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```" -M`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``$@\RZ&\ -M,3%3YC"/%1_!G_R8@K=`N$=*R&4GR1BV@8VCTHS&UBD!0$JI\&]E8K_6F+Y` -M?`^'D$:'8L!;H0'_[GEPDX/I/L9HU:"KH>WR-O:EKH1M;L]#V0?C+1D$P;)+ -MB^N!H.WH&!X['=P```!P``$`%^^%EY73HYDB]QZI<=E*X=YCPEXZP$K=&G],$`)@! -M``"8`0```@```$4``91I+P``0!$``,"H`0'`J`$"`?0!]`&`!V6V$XM1Z]L- -M=P``````````(2`B"`````````%X(@``>````'3^`0`,`P``#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"``!(/,NAO#$Q4^8PCQ4?P9_\F(*W0+A'2LAE)\D8MH&- -MH]*,QM8I`4!*J?!O96*_UIB^0'P/AY!&AV+`6Z$!_^YY<).#Z3[&:-6@JZ'M -M\C;VI:Z$;6[/0]D'XRT9!,&R2XOK@:#MZ!@>.W)$T[3P;EBD` -M`!P``$`$(P)2/9%6QDT).(1E[9?&L)(7AW<````<``!`!?OA9>5TZ.9(O<>J -M7'92N'>8\)>.L1*W1N+?`@"8`0``F`$```(```!%``&4:3```$`1``#`J`$! -MP*@!`@'T`?0!@`=E1N"(``'@` -M``!T_P$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``KJK2PQ2='ZN!:7$: -MNXQ,1I85373?S+>"_)Q66V?%GCXRZJA$LD3,2`MCT&-ZU>.8/5Z -MV)J`Y030`1XIN/AAD43.V.VUHU:'#)";\M@I```DL0Q=G.)&EZ5-&FJ=V0J= -MGD/)<_E\B$`S[X[6(9!L*MDI```<``!`!%XFY<;R^2$(3:M)6R!#JKC\5MR= -M````'```0`53*T90/$-GNC'78:IAPK'TD(C49K$2MT84#`8`F`$``)@!```" -M````10`!E&DQ``!`$0``P*@!`<"H`0(!]`'T`8`'94;G+FN-L$YO```````` -M```A("((`````````7@B``!X````=/\!``P#```,`0``#(`.`(`#```,`0`` -M#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```( -M`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH -M``"(``(``*ZJTL,4G1^K@6EQ&KN,3$:6%4UTW\RW@OR<5G-QH"NWZ< -MB6,`@T#F`V;)86:C_`?42VXXPK3[,62^E3@';"B)$J,(P7[/DODMX7EMGQ9X -M^,NJH1+)$S$@+8]!C>M7CF#U>MB:@.4$T`$>*;CX89%$SMCMM:-6APR0F_+8 -M*0``)+$,79SB1I>E31IJG=D*G9Y#R7/Y?(A`,^^.UB&0;"K9*0``'```0`1> -M)N7&\ODA"$VK25L@0ZJX_%;````'3_`0`, -M`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``"NJM+#%)T?JX%I<1J[C$Q&EA5- -M=-_,MX+\G%9S<:`KM^G'.*"OWHEC`(-`Y@-FR6%FH_P'U$MN.,*T^S%DOI4X -M!VPHB1*C",%^SY+Y+>%Y;9\6>/C+JJ$2R1,Q("V/08WK5XY@]7K8FH#E!-`! -M'BFX^&&11,[8[;6C5H<,D)ORV"D``"2Q#%V0\ES^7R( -M0#/OCM8AD&PJV2D``!P``$`$7B;EQO+Y(0A-JTE;($.JN/Q6W)T````<``!` -M!5,K1E`\0V>Z,==AJF'"L?20B-1FLA*W1IA="@"8`0``F`$```(```!%``&4 -M:3<``$`1``#`J`$!P*@!`@'T`?0!@`=E>`2M9JJ24/\``````````"$@(@@` -M```````!>"(``'@```!T``$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M0#L>L.*]XQ+T[&4W*./`ROL7X-1JXP"DP)\\\?,/2MQ'@Y\K@HI.E6B6%(!\ -M(Q!Z)?>:0*^0U/C)@5'<2G&GUC%NZC&2VGP7,:!<;2=W[-AEB>V4\U4DA6/1 -MCK$?RE7RN9@D*M\@DI8+)H2NN!M'?J)2\>L?D"BGW\A=H/,2].QE-RCCP,K[%^#4:N,`I,"? -M//'S#TK<1X.?*X**3I5HEA2`?",0>B7WFD"OD-3XR8%1W$IQI]8Q;NHQDMI\ -M%S&@7&TG=^S898GME/-5)(5CT8ZQ'\I5\KF8)"K?()*6"R:$KK@;1WZB4O'K -M'Y`HI]_(7:#W-E?%*0``)#R2ARXB':G\^R9/C!!^"1-[LK#HM54]>_NS$K=&?(4$`)@!``"8`0```@```$4``91I00``0!$` -M`,"H`0'`J`$"`?0!]`&`!V5X!*UFJI)0_P``````````(2`B"`````````%X -M(@``>````'0``0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"``!`.QZPXKWC -M$O3L93#GRN"BDZ5:)84@'PC$'HE]YI` -MKY#4^,F!4=Q*<:?6,6[J,9+:?![*PZ+55/7OW+_J&CKHE:2D``!P``$`$@J$/8-E\7RC[?L9\''[H -MU3%IO68````<``!`!;7SXE.=B(S?]@A,3C,M"#=-N3GKM!*W1I22`@"8`0`` -MF`$```(```!%``&4:4D``$`1``#`J`$!P*@!`@'T`?0!@`=EL[45*532?]P` -M`````````"$@(@@````````!>"(``'@```!T`@$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``;9RH\C??@04IW3V5:#GZGXCF2B]&%[$ZRK3=VWK8?X&HM"4OGD?.]$,B0YS%6%^O4YIWV,A5HXN9LCF4*5_. -M@VY*DTSX2NEPQ]\NQR1-_6:3C]:&,LX[ANZNL>3%:FU7G+`H:NNCYGW5X0K1 -M3CJ_K*DI```DIX-H+5OQ#&/.Z,HX7W<'%>_<-E$XJAFNJ%PK5U-0=W,I```< -M``!`!.-N0B0<\3->7I+7<\H+H*/`R)[)````'```0`4S?7U]\I(^6Y/,SA#A -M@N&M)TW#DK02MT;KO04`F`$``)@!```"````10`!E&E+``!`$0``P*@!`<"H -M`0(!]`'T`8`'9;.U%2E4TG_<```````````A("((`````````7@B``!X```` -M=`(!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```( -M`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$# -M```(`P``!0,```@$```"````"`0```XH``"(``(``&VQ.LJTW=MZW($*T4XZOZRI*0``)*>#:"U;\0QCSNC*.%]W!Q7O -MW#91.*H9KJA<*U=34'=S*0``'```0`3C;D(D'/$S7EZ2UW/*"Z"CP,B>R0`` -M`!P``$`%,WU]??*2/EN3S,X0X8+AK2=-PY*T$K=&:O\+`)@!``"8`0```@`` -M`$4``91I30``0!$``,"H`0'`J`$"`?0!]`&`!V6SM14I5-)_W``````````` -M(2`B"`````````%X(@``>````'0"`0`,`P``#`$```R`#@"``P``#`$```R` -M#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(` -M``0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*``` -MB``"``!MG*CR-]^!!2G=/95H.?J?B.9*+T87L3K*M-W;>MR'#[P#:TPQ:X!V -M[/97YYA_@:BT)2^>1\[T0R)#G,587Z]3FG?8R%6CBYFR.90I7\Z#;DJ33/A* -MZ7#'WR[')$W]9I./UH8RSCN&[JZQY,5J;5>DM=SR@N@H\#(GLD````<``!`!3-]?7WRDCY;D\S.$.&"X:TG3<.2 -MM1*W1DX/"@"8`0``F`$```(```!%``&4:5D``$`1``#`J`$!P*@!`@'T`?0! -M@`=E[M`0Q#RKL6@``````````"$@(@@````````!>"(``'@```!T`P$`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``X=$].@0[Y9EN6NC91E70D`,'6"$4 -MR\?D6WZ]`4L!4+4T4H"I6KU8"W;K=6:E9.":B8XXYK6A%>T,N2WI -M,F(\>\WM60X3>U<:AK8%X_.!6W*IG%"2]=/#^K]6%[A:O%E9_N:9KY3M:S_Y -M-T6GI4?X7>RCD\F+VY8Q/3$I```D.C?:A_B"YKJ@R%>(N30K2P^L4BE-)YB*R.?````'```0`63 -M-DT!6\V@O',O=NJ^WD`':0-VA;42MT;R-PT`F`$``)@!```"````10`!E&E< -M``!`$0``P*@!`<"H`0(!]`'T`8`'9>[0$,0\J[%H```````````A("((```` -M`````7@B``!X````=`,!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```, -M`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@# -M```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``.'1 -M/3H$.^69;EKHV495T)`#!U@A%,O'Y%M^O0%+`5"U'.F_&YN7M%*`J5J]6`MV -MZW5FI63@FHF...:UH17M#+DMZ3)B/'O-[5D.$WM7&H:V!>/S@5MRJ9Q0DO73 -MP_J_5A>X6KQ96?[FF:^4[6L_^3=%IZ5'^%WLHY/)B]N6,3TQ*0``)#HWVH?X -M@N:ZH,A7B+DT*TL/G*`7`M0.]4P%7"C(H=90*0``'```0`0K;;MZUY3.`I&' -M7K%(I32>8BLCGP```!P``$`%DS9-`5O-H+QS+W;JOMY`!VD#=H6V$K=&4C<$ -M`)@!``"8`0```@```$4``91I8P``0!$``,"H`0'`J`$"`?0!]`&`!V7NT!#$ -M/*NQ:```````````(2`B"`````````%X(@``>````'0#`0`,`P``#`$```R` -M#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,` -M``@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!``` -M`@````@$```.*```B``"``#AT3TZ!#OEF6Y:Z-E&5="0`P=8(13+Q^1;?KT! -M2P%0M1SIOQN;E[12@*E:O5@+=NMU9J5DX)J)CCCFM:$5[0RY+>DR8CQ[S>U9 -M#A-[5QJ&M@7C\X%;E1_A= -M[*.3R8O;EC$],2D``"0Z-]J'^(+FNJ#(5XBY-"M+#YR@%P+4#O5,!5PHR*'6 -M4"D``!P``$`$*VV[>M>4S@*1AUZQ2*4TGF(K(Y\````<``!`!9,V30%;S:"\ -M0`=I`W:%MQ*W1KM#`@"8`0``F`$```(```!%``&4:64``$`1``#` -MJ`$!P*@!`@'T`?0!@`=E[SV!8AW#15P``````````"$@(@@````````!>"(` -M`'@```!T!`$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``\V%L*H')3QEW -M*ORK?@HV`H%X0`"29W!@%ZLT&2UU=*;-[F#T"XL*PV8?7`[1\_PU8#I?X[DW -MK`(0B>JC.=<0R("0Q[0@TI,65X!NT?;W!9G?#'#)M"C[K&K2G=NZ;TU#`9,W -M0?:WW?OA:J3-@%+/KC*=C.WJ)N_2-TE(BO(\1.@I```D=!']P&H[FDDXP*K* -MV,"F\0/PE/$7J2XRS\'EX/`TKW\I```<``!`!&4QDI8_*2KP[I%N95(7(LO) -MFO8T````'```0`7IE/"5?@S\(M1SH]3H"K9;+_#JEK<2MT:N;P4`F`$``)@! -M```"````10`!E&EF``!`$0``P*@!`<"H`0(!]`'T`8`'9>\]@6(=PT5<```` -M```````A("((`````````7@B``!X````=`0!``P#```,`0``#(`.`(`#```, -M`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$# -M```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0` -M``XH``"(``(``/-A;"J!R4\9=RK\JWX*-@*!>$``DF=P8!>K-!DM=72FS>Y@ -M]`N+"L-F'UP.T?/\-6`Z7^.Y-ZP"$(GJHSG7$,B`D,>T(-*3%E>`;M'V]P69 -MWPQPR;0H^ZQJTIW;NF]-0P&3-T'VM]W[X6JDS8!2SZXRG8SMZB;OTC=)2(KR -M/$3H*0``)'01_#P-*]_*0``'``` -M0`1E,9*6/RDJ\.Z1;F52%R++R9KV-````!P``$`%Z93PE7X,_"+4````'0$ -M`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$` -M``,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P`` -M"`,```4#```(!````@````@$```.*```B``"``#S86PJ@L`A")ZJ,Y -MUQ#(@)#'M"#2DQ97@&[1]O<%F=\,<,FT*/NL:M*=V[IO34,!DS=!]K?=^^%J -MI,V`4L^N,IV,[>HF[](W24B*\CQ$Z"D``"1T$?W`:CN:23C`JLK8P*;Q`_"4 -M\1>I+C+/P>7@\#2O?RD``!P``$`$93&2EC\I*O#ND6YE4AF4\)5^#/PBU'.CU.@*MELO\.J6N!*W1A6]"0"8`0``F`$```(```!% -M``&4:6H``$`1``#`J`$!P*@!`@'T`?0!@`=E.O/5@#`=3!4``````````"$@ -M(@@````````!>"(``'@```!T!0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``C-)FKD)JN_P&+WEKRA5X-&E6_%Q8HS&1U\=O1<:)[KXS53),2(6_(/'2B\%0-ZA]>/B#7KJ,4I```<``!`!)XJZQ&2 -MJ6=3F"CX4V3GR[.=/`)#````'```0`6+38!R7=;,[,!"8N<#HR>FY11'];@2 -MMT:HZ0P`F`$``)@!```"````10`!E&EK``!`$0``P*@!`<"H`0(!]`'T`8`' -M93KSU8`P'4P5```````````A("((`````````7@B``!X````=`4!``P#```, -M`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@" -M```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,` -M``@$```"````"`0```XH``"(``(``(S29JY":KO\!B]Y:\H5>#1G)C1&^I6W -M+.O:&96B0@7Z1>\,415ZWT*=VHAXI`IQ<^/E!BLHP#R+3WR.@J7_HP%I#8C: -MF@93CQACKAWI5OQ<6*,QG+(Z^,U4R3$B%OR#QTHO!4#>H?7 -MCX@UZZC%*0``'```0`2>*NL1DJEG4Y@H^%-DY\NSG3P"0P```!P``$`%BTV` -M````'0%`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$` -M``R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P`` -M`@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``",TF:N -M0FJ[_`8O>6O*%7@T9R8T1OJ5MRSKVAF5HD(%^D7O#%$5>M]"G=J(>*0*<7/C -MY08K*,`\BT]\CH*E_Z,!:0V(VIH&4X\88ZX=Z5;\7%BC,9RR'.HLMNP3?S>\ -MP+T6C-;6^RY!!"40XVMSR,/#P$[@7/AAD,EK5PEA&R$N9BD``"1Y'7QV]%QH -MGNOC-5,DQ(A;\@\=*+P5`WJ'UX^(->NHQ2D``!P``$`$GBKK$9*I9U.8*/A3 -M9.?+LYT\`D,````<``!`!8M-@')=ULSLP$)BYP.C)Z;E%$?UNA*W1G[W`0"8 -M`0``F`$```(```!%``&4:6X``$`1``#`J`$!P*@!`@'T`?0!@`=E&[])+1EZ -MI:X``````````"$@(@@````````!>"(``'@```!T"`$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``54E\0:%A.;M6RER2*0FPH,7+!L@Z'37>"````'```0`5S//[M9'YV&!0L -MH"^[;G;^'#(#%KH2MT:=(04`F`$``)@!```"````10`!E&EQ``!`$0``P*@! -M`<"H`0(!]`'T`8`'91N_22T9>J6N```````````A("((`````````7@B``!X -M````=`@!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`# -M```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,` -M``$#```(`P``!0,```@$```"````"`0```XH``"(``(``%5)?$&A83F[5LI7 -M,DD6,&SO%/<9K%3^IU!9N>T9X&Y7R,\(2PNA!Y[`-!I59N<[9*0``)`_*0TV-_J/V"8.Z^6#6 -M-O6A'\0FX:M+P-.#+U@2CE;Y*0``'```0`3&NEUZ-'LDBD)L*#%RP;(.ATUW -M@@```!P``$`%````'0(`0`,`P``#`$```R`#@"``P``#`$` -M``R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P`` -M"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```. -M*```B``"``!527Q!H6$YNU;*5S))%C!L[Q3W&:Q4_J7,^C.T@A?`;HX"U"1; -M:YS/K'M06;GM'*BA0++HCNAU#L!A/!N5\C/"$L+H0>>P#0:56;G. -MV2D``"0/RD--C?ZC]@F#NOE@UC;UH1_$)N&K2\#3@R]8$HY6^2D``!P``$`$ -MQKI=>C1[)(I";"@QX``````````"$@(@@````````!>"(``'@```!T"0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``\RP=>[Q>7OSPK_U#U/^TW^?3 -M"-.TRD.A\RBA@;\@Z,C'O,*FGB;(Z*T-?RSG7*^[Q="R4"=1\EB@"$WN9+"' -MR*X39*JRRBGSKE!<]3V>+L2MT:%FPP`F`$``)@!```"````10`! -ME&E\``!`$0``P*@!`<"H`0(!]`'T`8`'959$9@,X>.WN```````````A("(( -M`````````7@B``!X````=`D!``P#```,`0``#(`.`(`#```,`0``#(`.`0`# -M```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,` -M``@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(` -M`/,L'7N\7E[\\*_]0]3_M-_GTPC3M,I#H?,HH8&_(.C(Q[S"IIXFR.BM#7\L -MYURON\70LE`G4?)8H`A-[F2PA\BN$V2JLLHI\W.">OG]9.#-3=MT#%CA6=IF5]$.N%8+3Q@-_V5V6\+BI/%31_FD]DQ_V-B!N:T]:N^7*0``)&6U -M*)3+?>6*%919\%FY@B@&3R2S(U4@4U7#W"XA/1&M*0``'```0`33KLQ8G$#B -MVN_S5EUW7XQK"8I]G````!P``$`%.#(G02!6$%RXO.:'*WJY07/4]GB\$K=& -MPYH#`)@!``"8`0```@```$4``91I?@``0!$``,"H`0'`J`$"`?0!]`&`!V56 -M1&8#.'CM[@``````````(2`B"`````````%X(@``>````'0)`0`,`P``#`$` -M``R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@`` -M`@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```( -M!````@````@$```.*```B``"``#S+!U[O%Y>_/"O_4/4_[3?Y],(T[3*0Z'S -M**&!OR#HR,>\PJ:>)LCHK0U_+.=YDL(?(KA-DJK+* -M*?-S@GKY_63@S4W;=`W(J5\BC'A8X5G:9E?1#KA6"T\8#?]E=EO"XJ3Q4T?Y -MI/9,?]C8@;FM/6KOERD``"1EM2B4RWWEBA646?!9N8(H!D\DLR-5(%-5P]PN -M(3T1K2D``!P``$`$TZ[,6)Q`XMKO\U9==U^,:PF*?9P````<``!`!3@R)T$@ -M5A!"(``'@```!T"@$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``VQ3\!*;/ -MX9,!+9>;E7D!#1D;M#!YX(/?K/()%]1%X*5IJNDUV?((_U[`^S<2>"#WZSR"1?41>"E -M::KI-=GR"/]>P/LW$G*I06[NJ]^1FKZYPZA_TW:_Z%]D,.OSIF-"FOB.J8LK -MJSJ_WP5?Z#?!-]3(VK&$G5[H/-OVRYQ0(N5`_ZW;A)59G=K!RG_)3Y&#VZ_7 -M8O=L6KGX*0``))Y^&;?*>J5H[_2<1$:`2">%E&0B:O4%<)2T1>``` -M`'0*`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"``#;%/P$IL_ADP$MEYN5 -M>0$-&1NT,'G@@]^L\@D7U$7@I6FJZ379\@C_7L#[-Q)RJ4%N[JO?D9J^N<.H -M?]-VO^A?9##K\Z9C0IKXCJF+*ZLZO]\%7^@WP3?4R-JQA)U>Z#S;]LN<4"+E -M0/^MVX2569W:P?AFWRGJE:._TG$1&@$@G -MA91D(FKU!7"4M$7G.HT/#2D``!P``$`$11D8+D87P+?.,9@_^&<%"67R80`` -M```<``!`!8>I,8HCXO'76I&Z#$\"(&'<:OF3OA*W1F@A"0"8`0``F`$```(` -M``!%``&4:80``$`1``#`J`$!P*@!`@'T`?0!@`=E?*Y1;CYAVQT````````` -M`"$@(@@````````!>"(``'@```!T_P$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``@4YH\)3@A^..U`>V\HLEZ4;`R/V#EFQLGJ.EN;@K"UCEX#B[E'_0 -M)QN\F;<)D3X(PS.Y$(62_1WZX+/W7<,8F!0\YIKX,\`$6%^)THN18'*D3V[] -M"2RZE1]DX'\JF)(+1XKG8(1__5BOVK?(3Q0Z8#!IMJNA)J0):\5QUHJ/"`0I -M```D%[*-[W<\5K6AAK)IPM&>[)R_P!$S?Z.NH-7/B`JT5(\I```<``!`!(P( -M[M1Q3-$-T^8]-*)8\^!$*_+FN+H21<+E&P,C] -M@Y9L;)ZCI;FX*PM8Y>`XNY1_T"<;O)FW"9$^",,SN1"%DOT=^N"S]UW#&)@4 -M/.::^#/`!%A?B=*+D6!RI$]N_0DLNI4?9.!_*IB2"T>*YV"$?_U8K]JWR$\4 -M.F`P:;:KH2:D"6O%<=:*CP@$*0``)!>RC>]W/%:UH8:R:<+1GNR-2P^_$K=&HTP#`)@!``"8`0```@```$4``91I -MBP``0!$``,"H`0'`J`$"`?0!]`&`!V5\KE%N/F';'0``````````(2`B"``` -M``````%X(@``>````'3_`0`,`P``#`$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``"! -M3FCPE."'XX[4![;RBR7I1L#(_8.6;&R>HZ6YN"L+6.7@.+N4?]`G&[R9MPF1 -M/@C#,[D0A9+]'?K@L_==PQB8%#SFFO@SP`187XG2BY%@"(``'@```!T@`$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``M+9:6>L'D64E>G+O8LNL^K$[`Q^SHKTI_ -M[(3VIAU)YPL4G0YQ0:OR)!<#5;YS,BH'E(ILRB=XC;A@/%]G\5)Q[\6N?G9( -M]2T"G3T;J49;*9^4&HFNX(0O/%FGATNLY(%AJMHFAK$K_LH5XJT4B`(`FB.< -M;N#9T?=TS>D(NG\I```D1+JV%8.75;&"O=CY,.^?M1]T#R'%JM6\:51:,SQ2 -M/E,I```<``!`!!J3M(E1U=<\G"B/Y!1O%.T6BU#2````'```0`6#$],6*4/: -M6-D-J3GXB`WU\]6L8L`2MT8(A00`F`$``)@!```"````10`!E&F1``!`$0`` -MP*@!`<"H`0(!]`'T`8`'9370JIA>9=[F```````````A("((`````````7@B -M``!X````=(`!``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`. -M`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P`` -M"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``+2V6EGK!Y'+ -M'EE)7IR[V++K/JQ.P,?LZ*]*?^R$]J8=2><+%)T.<4&K\B07`U6^(VX8#Q?9_%2<>_%KGYV2/4M`IT]&ZE&6RF?E!J)KN"$+SQ9IX=+K.2! -M8:K:)H:Q*_[*%>*M%(@"`)HCG&[@V='W=,WI"+I_*0``)$2ZMA6#EU6Q@KW8 -M^3#OG[4?=`\AQ:K5O&E46C,\4CY3*0``'```0`0:D[2)4=77/)PHC^04;Q3M -M%HM0T@```!P``$`%@Q/3%BE#VEC9#:DY^(@-]?/5K&+`$K=&G,8*`)@!``"8 -M`0```@```$4``91IEP``0!$``,"H`0'`J`$"`?0!]`&`!V4UT*J87F7>Y@`` -M````````(2`B"`````````%X(@``>````'2``0`,`P``#`$```R`#@"``P`` -M#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```! -M`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$ -M```.*```B``"``"TMEI9ZP>1RQY925Z4BFS*)WB-N&`\7V?Q4G'OQ:Y^=DCU+0*=/1NI -M1ELIGY0:B:[@A"\\6:>'2ZSD@6&JVB:&L2O^RA7BK12(`@":(YQNX-G1]W3- -MZ0BZ?RD``"1$NK85@Y=5L8*]V/DP[Y^U'W0/(<6JU;QI5%HS/%(^4RD``!P` -M`$`$&I.TB5'5USR<*(_D%&\4[1:+4-(````<``!`!8,3TQ8I0]I8V0VI.?B( -M#?7SU:QBP1*W1G?2"`"8`0``F`$```(```!%``&4:9\``$`1``#`J`$!P*@! -M`@'T`?0!@`=E+P_'*/C"(``'@```!T -M`0``#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``XL$>!,PN/`;L`\)5^(V# -M@A]@N)RLPLE8I`ZL6R6Z?#KG2`X;%]:Y5__I0HOK$=\NSO?`2I[LO -M[:>]LZK+_,.(SA!]5#=F?IKZ:,#%#FY1WLJN)CM0SS/Q -M+YFC*N/Q7_`-L$2MT;N_@L`F`$``)@!```"```` -M10`!E&F@``!`$0``P*@!`<"H`0(!]`'T`8`'92\/QRCXW(YX```````````A -M("((`````````7@B``!X````=`$```P#```,`0``#(`.`(`#```,`0``#(`. -M`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@`` -M!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"( -M``(``.+!'@3,+CP&[`/"5?B-@X(?8+B[+^VGO;.JR_S#B,X0?50W9GZ:^FC`Q0YN4=[* -MKB8[7#R'SQ/94(I`3#K+H6DT2/*0`` -M)!T;P^LAX5IY[C$"`RZWD,\S\2^9HRKC\5_W+]1B^-'R*0``'```0`2SI3```````````(2`B"`````````%X(@``>````'0!```,`P`` -M#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"``#BP1X$S"X\!NP#PE7XC8."'V"XG*S" -MR5BD#JQ9RB13#9[);I\.N=(#AL7UKE7_^E"B^L1WR[.]\!*GNR_MI[VSJLO\ -MPXC.$'U4-V9^FOIHP,4.;E'>RJXF.UP\A\\3V5"*7`%:>>XQ`@,NMY#/,_$OF:,JX_%? -M]R_48OC1\BD``!P``$`$LZ4W(\E`HQ58ZZ(5.B\OPJ?*&48````<``!`!2\$ -M`LI;0,51+:HWV/E0_3ILEX`VPQ*W1H8-`0"8`0``F`$```(```!%``&4:;8` -M`$`1``#`J`$!P*@!`@'T`?0!@`=E\;[69&DX>^P``````````"$@(@@````` -M```!>"(``'@```!T`0(`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``>.M( -M4M+P(4]M\[?N,>^K=M=W?]"R6.-+U$00B&CFRB``R#5$%>_@)]X6?K<^2*QJ -M*KG&&N[E.-I]M:[^B8(Z^"5?[&0-&=0`V*&JD=4\@FRH)^)7UO`\#/:_$1R< -MMWGL6.MJW`OOYZRYS.6>\CLBY_@>/O1\K5#%$Q.6+].0#.4I```DC$W'V8BM -MK8C0&<$GSW$X($NB-YJ0;''Z+XJ0$8Z; -M"!+U6Y=E*]Z*````'```0`7Q$LXFQ@;!&)YSYW>%%C*$*4%-S\,2MT;9-@0` -MF`$``)@!```"````10`!E&FX``!`$0``P*@!`<"H`0(!]`'T`8`'9?&^UF1I -M.'OL```````````A("((`````````7@B``!X````=`$"``P#```,`0``#(`. -M`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P`` -M"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```" -M````"`0```XH``"(``(``'CK2%+2\"%/;?.W[C'OJW;7=W_0LECC2]1$$(AH -MYLH@`,@U1!7OX"?>%GZW/DBL:BJYQAKNY3C:?;6N_HF".O@E7^QD#1G4`-BA -MJI'5/()LJ"?B5];P/`SVOQ$LN:D&QQ^B^*D!&.G,F5 -M*0``'```0`3$"J4!&T@.`ON7FP@2]5N792O>B@```!P``$`%\1+.)L8&P1B> -M<^=WA18RA"E!3<_#$K=&='@*`)@!``"8`0```@```$4``91INP``0!$``,"H -M`0'`J`$"`?0!]`&`!V7QOM9D:3A[[```````````(2`B"`````````%X(@`` -M>````'0!`@`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"``!XZTA2TO`A3VWS -MM^XQ[ZMVUW=_T+)8XTO41!"(:.;*(`#(-405[^`GWA9^MSY(K&HJN<8:[N4X -MVGVUKOZ)@CKX)5_L9`T9U`#8H:J1U3R";*@GXE?6\#P,]K\1')RW>>Q8ZVK< -M"^_GK+G,Y9[R.R+G^!X^]'RM4,43$Y8OTY`,Y2D``"2,3"(``'@```!T`0(`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``])_,`R&-"4'ZLN)$IJ-9SHR(C(M!IK>>_;[RU[K#L/NT;.YS -M0-_/]]%QYF$X+ZB7@)@[P8'BI<#[NA7"6[!#LS0@SN[M`P2US)9571MU59"Q"7S%CN!>1\HUMHN?%"Z-&'AW1M7NJ-]UU -M@>,I```DH1L]"_4&7I.DQNR[D@+<`Y7;S/6$=!S..X_]3P!(#`TI```<``!` -M!"&3D+170X(\=0*"P0\X;?X$8GJ%````'```0`5[?6=`0,NV&D":E*<<0R0) -MJ7)-<,02MT:QL`L`F`$``)@!```"````10`!E&G>``!`$0``P*@!`<"H`0(! -M]`'T`8`'9>*`?`P>U34R```````````A("((`````````7@B``!X````=`$" -M``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0`` -M`P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```( -M`P``!0,```@$```"````"`0```XH``"(``(``/2?S`,AC0E!^K+B1*:C6ZP[#[M&SN9A."^HEX"8.\&!XJ7`^[H5PENP -M0[,T(,[N[0,$MWUG0$#+MAI`FI2G'$,D":ER37#%$K=&%K`"`)@!``"8`0```@```$4` -M`91IWP``0!$``,"H`0'`J`$"`?0!]`&`!V7B@'P,'M4U,@``````````(2`B -M"`````````%X(@``>````'0!`@`,`P``#`$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M``#TG\P#(8T)0?JRXD2FHUG.C(B,BT&FMY[]OO+7NL.P^[1L[G-`W\_WT7'F -M83@OJ)>`F#O!@>*EP/NZ%<);L$.S-"#.[NT#!+7,EES5F5>L3'>XDZ%K,ORT -M&.?S?Z(]Y5=&W55D+$)?,6.X%Y'RC6VBY\4+HT8>'=&U>ZHWW76!XRD``"2A -M&ST+]09>DZ3&[+N2`MP#E=O,]81T',X[C_U/`$@,#2D``!P``$`$(9.0M%=# -M@CQU`H+!#SAM_@1B>H4````<``!`!7M]9T!`R[8:0)J4IQQ#)`FI```$`1``#`J`$!P*@!`@'T`?0!@`=E -MRQ0'?GB@7NT``````````"$@(@@````````!>"(``'@```!T`0,`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``BIWYT6BP4+H7D3>=6T)/ZG"W\M][BS`) -MF]98E]A7E971#2]M!7G@TYK-]2;IVERG]>AA5/01FHFF?B]QL,"A%\ICF]C[ -MN.^^%8,Q*O-D-K0JRIH'(./M0!X1%4]'&NO+#XL797\F?'TLF($T>&&B<\"5 -MQ@,\3<+Y%!Z3'8IU`_PI```D0/2%9L9[5M^MQ1'!F3ZOO&!/E+]7U=/(2XG< -M4Q?K@3TI```<``!`!),-2R/F?ZI08&&8B>ZHX4K4:'I%````'```0`5E"*MV -M-ZCQ<40RJ1W"+1J7"SD:3,82MT:&Z`,`F`$``)@!```"````10`!E&GA``!` -M$0``P*@!`<"H`0(!]`'T`8`'9XLP"9O66)?85Y65T0TO;05YX-.:S?4FZ=I$15/1QKK -MRP^+%V5_)GQ]+)B!-'AAHG/`E<8#/$W"^10>DQV*=0/\*0``)$#TA6;&>U;? -MK<41P9D^K[Q@3Y2_5]73R$N)W%,7ZX$]*0``'```0`23#4LCYG^J4&!AF(GN -MJ.%*U&AZ10```!P``$`%90BK=C>H\7%$,JD=PBT:EPLY&DS&$K=&9BH*`)@! -M``"8`0```@```$4``91IZ0``0!$``,"H`0'`J`$"`?0!]`&`!V7+%`=^>*!> -M[0``````````(2`B"`````````%X(@``>````'0!`P`,`P``#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"``"*G?G1:+!0NA>1-YU;0D_J<+?RWWN+,`F;UEB7V%>5 -ME=$-+VT%>>#3FLWU)NG:7*?UZ&%4]!&:B:9^+W&PP*$7RF.;V/NX[[X5@S$J -M\V0VM"K*F@<@X^U`'A$53T<:Z\L/BQ=E?R9\?2R8@31X8:)SP)7&`SQ-POD4 -M'I,=BG4#_"D``"1`](5FQGM6WZW%$<&9/J^\8$^4OU?5T\A+B=Q3%^N!/2D` -M`!P``$`$DPU+(^9_JE!@89B)[JCA2M1H>D4````<``!`!64(JW8WJ/%Q1#*I -M'<(M&I<+.1I,QQ*W1CLX"`"8`0``F`$```(```!%``&4:?L``$`1``#`J`$! -MP*@!`@'T`?0!@`=EK'3)=VO+\^T``````````"$@(@@````````!>"(``'@` -M``!T`00`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``C%`^1@J_ZVP<%/V>?W[9%9[E -ME>F*?+EB($ZC\]JRRA)QR#7D4/E=D76K$<8I```D^0I5\O.$\<2/NGHG!7;T -M.L]C9;NW_4$K]UF+:V,'JE\I```<``!`!"G/2)>MZ,)G-P^NTS[]^\\803*/ -M````'```0`74K3ZE60V;+(R=.!;M$:]TY473VCD?*K=BH/R"D#, -M#O*O)_"'QO2)GA3]GG]^V16>Y97IBGRY8B!.H_/:LLH2<<@UY%#Y79%UJQ'& -M*0``)/D*5?+SA/'$C[IZ)P5V]#K/8V6[M_U!*_=9BVMC!ZI?*0``'```0`0I -MSTB7K>C"9S,(3I0!2;9*AK -M4S+($K=&_&$"`)@!``"8`0```@```$4``91J#```0!$``,"H`0'`J`$"`?0! -M]`&`!V6L=,EW:\OS[0``````````(2`B"`````````%X(@``>````'0!!``, -M`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``",4#Y&"K_K;!QR,,`%2?NYVX") -M#EQ><,/3?U5>K;122E#[**N&10^5V1=:L1QBD``"3Y"E7R\X3QQ(^Z>B<%=O0ZSV-EN[?] -M02OW68MK8P>J7RD``!P``$`$*<](EZWHPF"CBV\``````````"$@(@@` -M```````!>"(``'@```!T`0<`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MCL])JCCR%LV78.Y<'V:I8CT,,H\@`*[U3;S)VD$&FPE:0U/[W;;.SC$7\I```<``!`!$;.[4;O((B> -M\D2MT9Q -MF@,`F`$``)@!```"````10`!E&J8``!`$0``P*@!`<"H`0(!]`'T`8`'93V: -MI:W@HXMO```````````A("((`````````7@B``!X````=`$'``P#```,`0`` -M#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```" -M`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$ -M```"````"`0```XH``"(``(``([/2:HX\A;-EV#N7!]FJ6(]##*/(`"N]4V\ -MR=I!!IL)6D-3^W,8[!_RYJ=D4,+E;S'U1!K=^)'?;5@P.4P-(6J4J9;E.K\7 -M^H8.EC<0XD&.Y$-4`G;D!\G7`_(X[1/66EC;84GMVVSL -MXQ%_*0``'```0`1&SNU&[R"(GG+>C\?(IQQZ0:LHT````!P``$`%@UP*````'0!!P`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"``".STFJ./(6 -MS9=@[EP?9JEB/0PRCR``KO5-O,G:00:;"5I#4_MS&.P?\N:G9%#"Y6\Q]40: -MW?B1WVU8,#E,#2%JE*F6Y3J_%_J&#I8W$.)!CN1#5`)VY`?)UP/R..T3UEI7 -M+)OG)HBI(`(G\\]22'S"]/_1`/WRDEQ^*D&K*-`````<``!`!8-<"G)0YSDJ)[RA*W1FKI!P"8`0`` -MF`$```(```!%``&4:JT``$`1``#`J`$!P*@!`@'T`?0!@`=E#=D/M0^P`<$` -M`````````"$@(@@````````!>"(``'@```!T`0@`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``G;0HYEJ@HL%]!W7<]LG$_4%=U7@12$C:/6B"NE.MS$B0BZ.]M`!_^G-X3#< -M%,35LXL_$<^@)?#<`=````'```0`6X]P"T'DAYKU,#A5-" -MOVI!?:F:;,H2MT9M%`L`F`$``)@!```"````10`!E&JR``!`$0``P*@!`<"H -M`0(!]`'T`8`'90W9#[4/L`'!```````````A("((`````````7@B``!X```` -M=`$(``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```( -M`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$# -M```(`P``!0,```@$```"````"`0```XH``"(``(``)VT*.9:H*+!?0=UW/;' -M+%6M_;KY6<*+ML1<*'2=_2-5$W-S)0XY04-I6W<]-V5WIQ/U!7=5X$4A(VCU -MH@KI3K$PW'*2D,.>\016P4+?ZBRF@5S],:9/MU!"9/(P -MTY&GW-Q1JL:5K6DY33I&LX&2PO2;`6#]*0``)&SSD"(->QXN:4%ZMP+VM/_5 -M'#><5LOY3=.7"KG=<)DS*0``'```0`22LE]JRD7A3$U;.+/Q'/H"7PW`'0`` -M`!P``$`%N/<`M!Y(>:]3`X530K]J07VIFFS+$K=&R!,"`)@!``"8`0```@`` -M`$4``91JQP``0!$``,"H`0'`J`$"`?0!]`&`!V4-V0^U#[`!P0`````````` -M(2`B"`````````%X(@``>````'0!"``,`P``#`$```R`#@"``P``#`$```R` -M#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(` -M``0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*``` -MB``"``"=M"CF6J"BP7T'==SVQRQ5K?VZ^5G"B[;$7"ATG?TC51-S!%(2-H]:(*Z4ZW,2)"+H[VT`'_Z+FE!>K<"]K3_U1PWG%;+^4W3EPJYW7"9,RD``!P``$`$DK)? -M:LI%X4Q-6SBS\1SZ`E\-P!T````<``!`!;CW`+0>2'FO4P.%4T*_:D%]J9IL -MS!*W1L8?``"8`0``F`$```(```!%``&4:L\``$`1``#`J`$!P*@!`@'T`?0! -M@`=EQ8N5_6W+.T@``````````"$@(@@````````!>"(``'@```!T`0D`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``T*4-7Z9:1#`#SRLZ0QI)EKIUE&)] -M*#6E]LLJHYK]8'-=172W%52X991;%Y2PAF(J3.%MS:!4J9ODK+JC2T9>`\]0 -M?\L?$DF20_[73Y_S2U3WW:9-Q@(D@E[]O>K!7PR">I&_$GU/%W>3J5;3=^?@G&,KOSIIC@P%*/9 -M^,#A_I9HSI\I```<``!`!".6S]?4.6#=T[>OAM$UO#0E7,7;````'```0`6@ -MEK)O"65'?!EIMJ.M(?QVN)N0B,P2MT8?3`,`F`$``)@!```"````10`!E&K0 -M``!`$0``P*@!`<"H`0(!]`'T`8`'9<6+E?UMRSM(```````````A("((```` -M`````7@B``!X````=`$)``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```, -M`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@# -M```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``-"E -M#5^F6D0P`\\K.D,:29:Z=91B?2@UI?;+*J.:_6!S745TMQ54N&646Q>4L(9B -M*DSA;_;WJ -MP5\,@GJ1OQ)]3Q=WDZE6TW?G(FLBU))*-!BR'Y%%2'UF/0>8*0``)*PZ/?B. -M&6W*I)1'GX)QC*[\Z:8X,!2CV?C`X?Z6:,Z?*0``'```0`0CEL_7U#E@W=.W -MKX;1-;PT)5S%VP```!P``$`%H):R;PEE1WP9:;:CK2'\=KB;D(C,$K=&M(T) -M`)@!``"8`0```@```$4``91JT0``0!$``,"H`0'`J`$"`?0!]`&`!V7%BY7] -M;````'0!"0`,`P``#`$```R` -M#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,` -M``@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!``` -M`@````@$```.*```B``"``#0I0U?IEI$,`//*SI#&DF6NG648GTH-:7VRRJC -MFOU@"(` -M`'@```!T`?@`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``7Y5J]G(G<216 -M+JMD;L^N&DN7W=7DVW,',P$OF\_<$B5W*95.O.2]R%LD.#UTN,,]/EN\X-E. -M)N_M\H;2[/V&8Z$`H+=\+PF65D_.WF07+1_2]$7]`<3Z\1+`+WL -M>!SKE3)?AP[R5`?YTPXD?\0ZV!4I```<``!`!$;AFJW3>E,!3*30&JO%L`/< -M'5IQ````'```0`49=\]QAGT1,D/AY@;N+5^(VF:\$\T2MT8+Q@H`F`$``)@! -M```"````10`!E&K4``!`$0``P*@!`<"H`0(!]`'T`8`'98&[BU? -MB-IFO!/.$K=&9\4!`)@!``"8`0```@```$4``91JU0``0!$``,"H`0'`J`$" -M`?0!]`&`!V7)^R6(L<+>&@``````````(2`B"`````````%X(@``>````'0! -M^``,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$` -M``,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P`` -M"`,```4#```(!````@````@$```.*```B``"``!?E6KV3;9!Q214PG6(+'?BFY4D]^4OP_QKRD``"1[T1?T!Q/KQ$L`O>QX'.N5,E^' -M#O)4!_G3#B1_Q#K8%2D``!P``$`$1N&:K=-Z4P%,I-`:J\6P`]P=6G$````< -M``!`!1EWSW&&?1$R0^'F!NXM7XC:9KP3SA*W1O80#P"8`0``F`$```(```!% -M``&4:M\``$`1``#`J`$!P*@!`@'T`?0!@`=E?%A-J>%;].X``````````"$@ -M(@@````````!>"(``'@```!T`?D`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``X>A1]L_[`NHDC0"',:"\/YCRZJ(A:4`#6=/(:*64"VM[U#]K-'+\*@F\ -M[$(=,CES1;B!-L7@/GM2SP40.M+(D'92])?^M@")>I3"8(OPZ\\2 -MMT8$_@(`F`$``)@!```"````10`!E&KB``!`$0``P*@!`<"H`0(!]`'T`8`' -M97Q83:GA6_3N```````````A("((`````````7@B``!X````=`'Y``P#```, -M`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@" -M```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,` -M``@$```"````"`0```XH``"(``(``.'H4?;/^P+J)(T`AS&@O#^8\NJB(6E` -M`UG3R&BEE`MK>]0_:S1R_"H)O.Q"'3(Y+=*,7?:$SZ?4F/19$P4B>:3I1<5EG(1%:3HH!8QW(CHY3 -M<2@U*DQM*0``'```0`0(#QP".*%J_+$V4U48_KIX;3X"L0```!P``$`%%Z````'0!^0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$` -M``R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P`` -M`@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``#AZ%'V -MS_L"ZB2-`(`^>U+/!1`ZTLB0=E+TES/C6D&FHA9P\YO3;1B1O7^&T^`K$````<``!`!1>G+L.O??:1Y_ZV`(EZE,)@B_#KT!*W1A=/!P"8 -M`0``F`$```(```!%``&4:NP``$`1``#`J`$!P*@!`@'T`?0!@`=E(F@!'`_# -M*F$``````````"$@(@@````````!>"(``'@```!T`?H`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``J="O5V_6K0<-5=/E>2T-#S\K@C/OFWTQDX>DAEVSAD;X -M60!E`0U&,10I```D=Q,39+J.M_2K\#GCRCK'H.*%4N5LU:VYFD([H+%;N$\I -M```<``!`!,"&7\M!P8CQ(E*Z'8T(%\]W@2&(````'```0`7XY#8BIK%`=+;> -M9+Y]YI'14W54JM`2MT8*>`H`F`$``)@!```"````10`!E&KP``!`$0``P*@! -M`<"H`0(!]`'T`8`'92)H`1P/PRIA```````````A("((`````````7@B``!X -M````=`'Z``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`# -M```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,` -M``$#```(`P``!0,```@$```"````"`0```XH``"(``(``*G0KU=OUJW*#!!: -MB]M'-F$UVZ1OT%=.N;0:1T5-U5*K1$K=&-7````'0!^@`,`P``#`$```R`#@"``P``#`$` -M``R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P`` -M"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```. -M*```B``"``"IT*]7;]:MR@P06HO;1S9A-=ND;]!73KFT'*^Q):1N(07,[P@, -M87!^PX:?43YI!))59=#++)'"LS:CNU*6!%>G/SZ -MYF\??\D0Y54+D]1Y!PU5T^5Y+0T//RN",^^;?3&3AZ2&7;.&1OA9`&4!#48Q -M%"D``"1W$Q-DNHZW]*OP.>/*.L>@XH52Y6S5K;F:0CN@L5NX3RD``!P``$`$ -MP(9?RT'!B/$B4KH=C0@7SW>!(8@````<``!`!?CD-B*FL4!TMMYDOGWFD=%3 -M=52JT1*W1H;$#@"8`0``F`$```(```!%``&4:OH``$`1``#`J`$!P*@!`@'T -M`?0!@`=E"&UXC%V1@H4``````````"$@(@@````````!>"(``'@```!T`?T` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``U63"TF0U?C?G75[2%;UFU*%T -MR4D5J[;4=($X=<%A^[-P%5?=`FHDM/15@6!+0N8-==3[=UB7&`J<$(Q=D8*%```````````A("(( -M`````````7@B``!X````=`']``P#```,`0``#(`.`(`#```,`0``#(`.`0`# -M```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,` -M``@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(` -M`-5DPM)D-7XWYUU>TA6]9M2A=,E)%:NVU'2!.'7!8?NSX*0``)$GY -MK$?35^?MV')N,Z"4NBX>P6"U&I^KROK>52FC1M_:*0``'```0`1Z!.WP4'8F -MY;2ZCS^,BU71R8@6,0```!P``$`%]N!#J3S$1A:BQBM.G2:12?LH@#C2$K=& -M4_$(`)@!``"8`0```@```$4``91K!```0!$``,"H`0'`J`$"`?0!]`&`!V4( -M;7B,79&"A0``````````(2`B"`````````%X(@``>````'0!_0`,`P``#`$` -M``R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@`` -M`@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```( -M!````@````@$```.*```B``"``#59,+29#5^-^==7M(5O6;4H73)216KMM1T -M@3AUP6'[LW`55]T":B2T]%6!8$M"Y@UUU/MUS!U\ZAU"]K[3@3M\%!V)N6TNH\_C(M5T"(``'@```!T`?X`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``U10=<4(J -M9`9VR9E]Y%@WY2\`6#P@$&*H=X-?+,(SZ^&9!RJ:=(T3(\0RP!B$G:;+!P-D -M=D8L**.X-7:N`66+1P>IT1@?*DF+'?W6G?YS>@9+RQ0?R-M2'Z,AH[LK<)-> -M55[\R#111%-I*0D"S.-/HHJ(N!%QLD-Z?_%!WM_(T$,I```D0F6DS=&_X[IK -M,<`(&QCM<@^?U"H,FS#/`@]LN+2A=Z4I```<``!`!,42#RC5AA]BOV*U#RT5 -MM-R_V^Q,````'```0`5&6=U%YC2HD)]1H>OI,WMU6092HM,2MT:L*0H`F`$` -M`)@!```"````10`!E&L+``!`$0``P*@!`<"H`0(!]`'T`8`'9=X'"AL5T>;[ -M```````````A("((`````````7@B``!X````=`'^``P#```,`0``#(`.`(`# -M```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(` -M``$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"```` -M"`0```XH``"(``(``-44'7%"*F0&=LF9?>18-^4O`%@\(!!BJ'>#7RS",^OA -MF0_,@T4413:2D)`LSC3Z**B+@1<;)#>G_Q -M0=[?R-!#*0``)$)EI,W1O^.Z:S'`"!L8[7(/G]0J#)LPSP(/;+BTH7>E*0`` -M'```0`3%$@\HU88?8K]BM0\M%;38TJ)"?4:'K -MZ3-[=5D&4J+4$K=&+"D!`)@!``"8`0```@```$4``91K$@``0!$``,"H`0'` -MJ`$"`?0!]`&`!V7>!PH;%='F^P``````````(2`B"`````````%X(@``>``` -M`'0!_@`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"``#5%!UQ0BID!G;)F7WD -M6#?E+P!8/"`08JAW@U\LPC/KX9D'*IITC1,CQ#+`&(2=ILL'`V1V1BPHH[@U -M=JX!98M'!ZG1&!\J28L=_=:=_G-Z!DO+%!_(VU(?HR&CNRMPDUY57OS(-%%$ -M4VDI"0+,XT^BBHBX$7&R0WI_\4'>W\C00RD``"1"9:3-T;_CNFLQP`@;&.UR -M#Y_4*@R;,,\"#VRXM*%WI2D``!P``$`$Q1(/*-6&'V*_8K4/+16TW+_;[$P` -M```<``!`!499W47F-*B0GU&AZ^DS>W59!E*BU!*W1G]X#@"8`0``F`$```(` -M``!%``&4:R$``$`1``#`J`$!P*@!`@'T`?0!@`=E"^5U0NT@^=L````````` -M`"$@(@@````````!>"(``'@```!T`?\`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``Y\J!,4HY818[6&CL?;C&TIY1`LBQC.-N.A5K]^+F@BSU%;'6U;U4 -MF,8+#F>?NPC&(:C'1?&+2TZ9Y38PK9ETK4ZI4!ZL=GL[G%50WW'4J=/GS)RN -M(I_N"D&$*'(*:M6A'QR````'```0`4LX2]:N;\K^A=.X\5N<$OP)-(. -M`]42MT:280(`F`$``)@!```"````10`!E&LD``!`$0``P*@!`<"H`0(!]`'T -M`8`'90OE=4+M(/G;```````````A("((`````````7@B``!X````=`'_``P# -M```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,` -M``@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P`` -M!0,```@$```"````"`0```XH``"(``(``.?*@3%*.6$6.UAH['VXQM*>40+( -ML8SC;CH5:_?BYH(L]16QUM6]5)C&"PYGG[L(QB&HQT7QBTM.F>4V,*V9=*U. -MJ5`>K'9[.YQ54-]QU*G3Y\R)];\BV -MVE%<*K,VA+.**0``'```0`0\VPFP-JI````'0!_P`,`P``#`$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``#G -MRH$Q2CEA%CM8:.Q]N,;2GE$"R+&,XVXZ%6OWXN:"+/45L=;5O528Q@L.9Y^[ -M",8AJ,=%\8M+3IGE-C"MF72M3JE0'JQV>SN<55#?<=2IT^?,G*XBG^X*080H -M<@IJUSIS0-/9VE#J`$JG?_^)NX`2MY:%R+.B[FH0@HB:L.X]32D``"0>Q"7+ -M]\>;([]U4-'R0SUD2*7B?6_(MMI17"JS-H2SBBD``!P``$`$/-L)L#:J7,!9 -MMB@=3ZQ=::5X?'(````<``!`!2SA+UJYOROZ%T[CQ6YP2_`DT@X#UA*W1I:U -M!@"8`0``F`$```(```!%``&4:X\``$`1``#`J`$!P*@!`@'T`?0!@`=EW7=B -M(^@JI#D``````````"$@(@@````````!>"(``'@```!T`0``#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``*.;V$>Z?=JV$<(+0LMI/&IVDX0_7XYW)@RMG?`ML][4L_".5DKT59^RM:,6WW,2/U'T -MO`=N.Q110^,&B-I#4H%,^)##?>!Q,@"+`8Y/T>SC#<-XI```D:T:,EGDG//'2RZI3HP8]=]MN7DW73/(N=!*V3*R! -MU*HI```<``!`!%J(&"1._RN\=AE*%-_>S8CDPO#"````'```0`5NM=U`:>)D -MAIWR@P.ZCV=W=LK*1M82MT:%VPD`F`$``)@!```"````10`!E&N0``!`$0`` -MP*@!`<"H`0(!]`'T`8`'9=UW8B/H*J0Y```````````A("((`````````7@B -M``!X````=`$```P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`. -M`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P`` -M"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``"CF]A'NGW:M -MA'""T++:3QJ=I.$/U^'+!X_Q;&,1!PZB7Q[K`X\>6($BV\GN=R8,K9WP+;/> -MU+/PCE9*]%6?LK6C%M]S$C]1]+P';CL444/C!HC:0U*!3/B0PWW.9/=X`S@I -M-)1WG@<3('-2DH;J-"VL>V,=Z7@BP&.3]'LXPW#>*0``)&M&C)9Y)SSQTLNJ -M4Z,&/7?;;EY-UTSR+G02MDRL@=2J*0``'```0`1:B!@D3O\KO'892A3?WLV( -MY,+PP@```!P``$`%;K7=0&GB9(:=\H,#NH]G=W;*RD;7$K=&P=H``)@!``"8 -M`0```@```$4``91KDP``0!$``,"H`0'`J`$"`?0!]`&`!V7==V(CZ"JD.0`` -M````````(2`B"`````````%X(@``>````'0!```,`P``#`$```R`#@"``P`` -M#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```! -M`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$ -M```.*```B``"```HYO81[I]VK81P@M"RVD\:G:3A#]?ARP>/\6QC$0<.HE\> -MZP./'EB!(MO)[G`,X*324=YX'$R!S4I*&ZC0MK'MC'>EX(L!CD_1[ -M.,-PWBD``"1K1HR6>2<\\=++JE.C!CUWVVY>3==,\BYT$K9,K('4JBD``!P` -M`$`$6H@8)$[_*[QV&4H4W][-B.3"\,(````<``!`!6ZUW4!IXF2&G?*#`[J/ -M9W=VRLI&UQ*W1A0I#@"8`0``F`$```(```!%``&4:Y<``$`1``#`J`$!P*@! -M`@'T`?0!@`=EQJ*Q_AZX"1P``````````"$@(@@````````!>"(``'@```!T -M`0(`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``3C8M;+XK,('Z7]YL.'?Z -M13T+]N1S&3!.PA4K`$0:L)#UF*[G8Q!DEX4>6L(TR+P;&&1<`%UL5^BQQ<_3 -M4L]#OYU@QGK$MBYVU>Y$&M&GBC0^N\8B;@FC:[SKT)RQ,(F-D(784:+AC(MZ -M!K!26]#@2BK42*!1>9M%VP&/^M9:8VLI```D=9V)UN..HN8N`D<```````````A -M("((`````````7@B``!X````=`$"``P#```,`0``#(`.`(`#```,`0``#(`. -M`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@`` -M!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"( -M``(``$XV+6R^*S"!^E_>;#AW^D4]"_;D% -M'EK"-,B\&QAD7`!=;%?HL<7/TU+/0[^=8,9ZQ+8N=M7N1!K1IXHT/KO&(FX) -MHVN\Z]"@:P4EO0X$HJU$B@47F;1=L!C_K66F-K*0`` -M)'6=B=;CCJ+F'+5_ACM%/;*(YXU*=RR71Q5K_3K4UW&H*0``'```0`0V579# -M7YV2&I(-+$LGZZ````'0!`@`,`P`` -M#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"``!.-BULOBLP@?I?WFPX=_I%/0OVY',9 -M,$["%2L`1!JPD/68KN=C$&27A1Y:PC3(O!L89%P`76Q7Z+'%S]-2ST._G6#& -M>L2V+G;5[D0:T:>*-#Z[QB)N":-KO.O0G+$PB8V0A=A1HN&,BWH&L%);T.!* -M*M1(H%%YFT7;`8_ZUEIC:RD``"1UG8G6XXZBYARU?X8[13VRB.>-2G"(``'@```!T`0,`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``E2L5 -MH_X7;0_`SKB;Y6Z*,M"$7K:Z%@LF/+7\5D1D'N45!9,DC0:?T',\`]SBUE4E -MC-[[!F^,/]41P,Z?'%;;::&HZ!#(/54KET'T=6^?5?M-&/'C.B&]7@E=G0>% -M(IA)TVZ_BXOJH_IXCE),67O<78ZEDQOO8KQY%7_B,C!_DJ4I```D%CJ"0R.KYZ]_Z````'```0`6H^P9OC#_5$<#.GQQ6VVFAJ.@0R#U5*Y=! -M]'5OGU7[31CQXSHAO5X)79T'A2*82=-NOXN+ZJ/Z>(Y23%E[W%V.I9,;[V*\ -M>15_XC(P?Y*E*0``)!8W)Q[-9/"X=1[?:Z."C@PUY)(CB,2F_;S9196BC^BS -M*0``'```0`08D"O?^@```!P``$`%J'+KU=````'0!`P`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"``"5*Q6C_A=M#\#. -MN)OE;HHRT(1>MKH6"R8\M?Q61&0>Y14%DR2-!I_0,Z(;U>"5V=!X4BF$G3;K^+ -MB^JC^GB.4DQ9>]Q=CJ63&^]BO'D5?^(R,'^2I2D``"06-R<>S63PN'4>WVNC -M@HX,->22(XC$IOV\V465HH_HLRD``!P``$`$&)`G*.T;DXBU:P=ZH)#(ZOGK -MW_H````<``!`!:ARZ]77)+_0/@P2]`;L^NA9,&9RVA*W1DH$#@"8`0``F`$` -M``(```!%``&4;`,``$`1``#`J`$!P*@!`@'T`?0!@`=E@Y?8-M)OT.H````` -M`````"$@(@@````````!>"(``'@```!T`00`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``_S*C0NBQ0@Q[-8.'KUB=@U`:Y._IO3%C;D!-SZ]CDTYQX.RQ -MT8H7)54]5@+_V_<\9H74TYE2DENROU(L##1\EG$`VK2.3SMV)/I>;FF@!?18 -M]0&)B_4GCZH'-H??LC8)P9!V*OSA+LZNHP4<^JX^]5$X7;$-.0]68=7M+0QB -M^B@I```DV/K="\Q%!88[UYNZZ-"+[QIO[>`+\\68L>Z+KX-O<[@I```<``!` -M!&%)!1)&M88Q/*E*CI)T2$`&!ZZ=````'```0`6/K"M@@L(S6#AZ]8G8-0 -M&N3OZ;TQ8VY`3<^O8Y-.<>#LL=&*%R55/58"_]OW/&:%U-.94I);LK]2+`PT -M?)9Q`-JTCD\[=B3Z7FYIH`7T6/4!B8OU)X^J!S:'W[(V"<&0=BK\X2[.KJ,% -M'/JN/O51.%VQ#3D/5F'5[2T,8OHH*0``)-CZW0O,106&.]>;NNC0B^\:;^W@ -M"_/%F+'NBZ^#;W.X*0``'```0`1A20421K6&,3RI2HZ2=$A`!@>NG0```!P` -M`$`%CZPK8(+"')B.'(=````'0!!``,`P``#`$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M``#_,J-"Z+%"#'LU@X>O6)V#4!KD[^F],6-N0$W/KV.33G'@[+'1BA/ -MJ@TM#&+Z*"D``"38 -M^MT+S$4%ACO7F[KHT(OO&F_MX`OSQ9BQ[HNO@V]SN"D``!P``$`$84D%$D:U -MAC$\J4J.DG1(0`8'KIT````<``!`!8^L*V""PAR8CAR'7-&G&9^HO[O5W!*W -M1EL[!@"8`0``F`$```(```!%``&4;!L``$`1``#`J`$!P*@!`@'T`?0!@`=E -MHF7FO05SP9\``````````"$@(@@````````!>"(``'@```!T`04`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``Q1,=0EAHUJ.E6RR0\9\-Q&7GJ;ZM#F'U -M<%S!BMM_*UUY258LR"B(D]>E"+Z`E/&T,OU?&YJY-;G+SYPVAXLI@R60D[CU -MW@XM1P=]Q:K&.)FD<2`D]F`Q[\9VJ@0:7UB\X."8CY@ZH2Y)M32^9BZ)24(V -MQ7_._8Q%IG#Y;3YV<3$I```DPQ;E1CKFAYS2"]_!>P!W8_MM'%)[;^D\U!`; -M\@\+NS@I```<``!`!-M,L9!,Z.DE:04I1@>+V.05:X]C````'```0`4(QK14 -M,%;`T$=:+%G,0][?(3-%^=P2MT8Y9@D`F`$``)@!```"````10`!E&P=``!` -M$0``P*@!`<"H`0(!]`'T`8`'9:)EYKT%<\&?```````````A("((```````` -M`7@B``!X````=`$%``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0`` -M#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```" -M`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``,43'4)8 -M:-:CI5LLD/&?#<1EYZF^K0YA]7!4E6+,@HB)/7I0B^@)3QM#+] -M7QN:N36YR\^<-H>+*8,ED).X]=X.+4<'?<6JQCB9I'$@)/9@,>_&=JH$&E]8 -MO.#@F(^8.J$N2;4TOF8NB4E"-L5_SOV,1:9P^6T^=G$Q*0``),,6Y48ZYH>< -MT@O?P7L`=V/[;1Q2>V_I/-00&_(/"[LX*0``'```0`3;3+&03.CI)6D%*48' -MB]CD%6N/8P```!P``$`%",:T5#!6P-!'6BQ9S$/>WR$S1?G=$K=&CV4``)@! -M``"8`0```@```$4``91L)0``0!$``,"H`0'`J`$"`?0!]`&`!V6B9>:]!7/! -MGP``````````(2`B"`````````%X(@``>````'0!!0`,`P``#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"``#%$QU"6&C6HZ5;+)#QGPW$9>>IOJT.8?5P7,&*VW\K -M77E)5BS(*(B3UZ4(OH"4\;0R_5\;FKDUN#BU'!WW% -MJL8XF:1Q("3V8#'OQG:J!!I?6+S@X)B/F#JA+DFU-+YF+HE)0C;%?\[]C$6F -M"(``'@` -M``!T`0@`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``E3N!&;N5[LS[5B>M(:]NWW+D^&+8 -M=S>&CW&&S,7ACA6@'L7B^GHI```<``!`!&9;@>Z"6`!X3N:4/*G5!QD,1/J] -M````'```0`7;*[38C?V40[-=3\$1!IA=%BU+P-X2MT;TG0$`F`$``)@!```" -M````10`!E&PQ``!`$0``P*@!`<"H`0(!]`'T`8`'97+9_>Y"Z:+7```````` -M```A("((`````````7@B``!X````=`$(``P#```,`0``#(`.`(`#```,`0`` -M#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```( -M`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH -M``"(``(``)4[@1F[E>[,^U7-=](?2QX&$,#AHNS+MC)+`3U+./*!Q\,_EI[X -M[`0-17^M)DEJYH2X:=];QRJD=*"P"[)4^"_=PZ4)%Q/"O_BN%)+S1!]8D.#&I08`""'="D.P!$570OKY&7,,MS`VS`S -M*0``)/E(,7HGK2&O;M]RY/ABV'$[FE#RIU0<9#$3ZO0```!P``$`%VRNTV(W]E$.S74_!$0:8718M -M2\#>$K=&>-\'`)@!``"8`0```@```$4``91L,P``0!$``,"H`0'`J`$"`?0! -M]`&`!V5RV?WN0NFBUP``````````(2`B"`````````%X(@``>````'0!"``, -M`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``"5.X$9NY7NS/M5S7?2'TL>!A#` -MX:+LR[8R2P$]2SCR@^.P$#45_K29):N:$N&G?6\7)!,LUO(H9P:F\).)#06_8NGO6)#@QJ4&``@ -MAW0I#L`1%5T+Z^1ES#+&.%:`>Q>+Z>BD``!P``$`$9EN![H)8`'A.YI0\J=4'&0Q$^KT````<``!` -M!=LKM-B-_91#LUU/P1$&F%T6+4O`WQ*W1K+N!0"8`0``F`$```(```!%``&4 -M;#L``$`1``#`J`$!P*@!`@'T`?0!@`=E4."=9$OB@K```````````"$@(@@` -M```````!>"(``'@```!T`0D`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M"`M(KG:"C63G7L/Y4U)`]PFP&&],&(S*0058WN\7S=>ZVXC/5D$9:6^PH;RH -M1XWV=%$"+)$7@0--*632J7'`EX-]JJ>4JZ))F%Y=S(8)1[A2X=U"UV-#JO?G -MV/Q!GP>-IFX]ZZTBRGV0/RJU6:1;>5;\JLG?Z;OO&$65V.I!]"\I```DWMO* -M<6-]G11`BR1%X$#32EDTJEQP)>#?:JGE*NB -M29A>7X4N'=0M=C0ZKWY]C\09\'C:9N/>NM(LI]D#\JM5FD6WE6_*K) -MW^F[[QA%E=CJ0?0O*0``)-[;RG%G.$]E&\[>AI$HZ[G?KB(>__O2]0`.1L%L -MT4%@*0``'```0`2LA(`.SD^FP2R..S5FJ.!.@+&T[@```!P``$`%W8MOYX8X -MY+M_!:>KZL$_PAC&TUK@$K=&(A<``)@!``"8`0```@```$4``91L0@``0!$` -M`,"H`0'`J`$"`?0!]`&`!V50X)UD2^*"L```````````(2`B"`````````%X -M(@``>````'0!"0`,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"```("TBN=H*- -M9.=>P_E34D#W";`8;TP8C,I!!5C>[Q?-U[K;B,]601EI;["AO*A'C?9T40(L -MD1>!`TTI9-*I<<"7@WVJIY2KHDF87EW,A@E'N%+AW4+78T.J]^?8_$&?!XVF -M;CWKK2+*?9`_*K59I%MY5ORJR=_IN^\81978ZD'T+RD``"3>V\IQ9SA/91O. -MWH:1*.NYWZXB'O_[TO4`#D;!;-%!8"D``!P``$`$K(2`#LY/IL$LCCLU9JC@ -M3H"QM.X````<``!`!=V+;^>&..2[?P6GJ^K!/\(8QM-:X!*W1K9C#0"8`0`` -MF`$```(```!%``&4;%@``$`1``#`J`$!P*@!`@'T`?0!@`=ETKN_O;+(%J,` -M`````````"$@(@@````````!>"(``'@```!T`0H`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``^]`?-B2/!+01:.#'GOQ2VRYFIX!L[PW]H+6&T\.E')@) -M5YOAWK/UJ6(?>X]Y8!-=5 -MESLYL@5$&BX,\@.+.W2JHL6\FY8MLNQJD12K[$W(I+ -M,N>)^(8I```D7<=CF.K%I*0>`>PO8LSP3_H,AHK?:H'45!MA2V=U.U$I```< -M``!`!+CD1RJ1KM%<.%9MOFM8PN.23+(O````'```0`7F\&)T.F6Q#'$H+I^S -M:O+DNFK+@.$2MT;53P$`F`$``)@!```"````10`!E&Q>``!`$0``P*@!`<"H -M`0(!]`'T`8`'9=*[O[VRR!:C```````````A("((`````````7@B``!X```` -M=`$*``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```( -M`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$# -M```(`P``!0,```@$```"````"`0```XH``"(``(``/O0'S8DCP2T$6C@QY[\ -M4MLN9J>`;.\-_:"UAM/#I1R8"5>;X=ZS]:EB'WN/>6'-J_<47G-2:UNN-)W& -MOB(R=B*C`Y32O9W?+HTKG@3759<[.;(%1!HN#/(#BSMTJJ+%O')2CH?)>Z4@ -M#!`O6L7IN6+;+L:I$4J^Q-R*2S+GB?B&*0``)%W'8YCJQ:2D'@'L+V+,\$_Z -M#(:*WVJ!U%0;84MG=3M1*0``'```0`2XY$````'0!"@`,`P``#`$```R`#@"``P``#`$```R` -M#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(` -M``0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*``` -MB``"``#[T!\V)(\$M!%HX,>>_%+;+F:G@&SO#?V@M8;3PZ4L_6I -M8A][CWEAS:OW%%YS4FM;KC2=QKXB,G8BHP.4TKV=WRZ-*YX$UU67.SFR!40: -M+@SR`XL[=*JBQ;QR4HZ'R7NE(`P0+UK%Z;EBVR[&J1%*OL3;P8G0Z9;$,<2@NG[-J\N2Z:LN` -MXA*W1IN=!0"8`0``F`$```(```!%``&4;&X``$`1``#`J`$!P*@!`@'T`?0! -M@`=E6)!'=6H-X_D``````````"$@(@@````````!>"(``'@```!T`?\`#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``A7*SX&)@@>>+7TL@\\P5I/L[\%-3 -MSU'Y!9"!STB7&/*]VWP1GVB@V+WILQQMNU2BW//F\(LJ/PC0ZJ6N,8(+1C7O -M@L`C5_[S@+>&\ZN/V`"_.U9:I.=*E>B((>7\].1A@JF:`2LXF$8B+'ORKJ;2 -MLL4!-8AG7````'```0`4[ -MR$PHR618#PW.;3R;$ZRKU,?VEN(2MT;/R0@`F`$``)@!```"````10`!E&QQ -M``!`$0``P*@!`<"H`0(!]`'T`8`'95B01W5J#>/Y```````````A("((```` -M`````7@B``!X````=`'_``P#```,`0``#(`.`(`#```,`0``#(`.`0`#```, -M`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@# -M```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``(5R -ML^!B8('GBU]+(//,%:3[._!34\]1^060@<](EQCRO=M\$9]HH-B]Z;,<;;M4 -MHMSSYO"+*C\(T.JEKC&""T8U[X+`(U?^\X"WAO.KC]@`OSM66J3G2I7HB"'E -M_/3D88*IF@$K.)A&(BQ[\JZFTK+%`36(9W,!'`_118\&&.!C*0``)&AR=?0_ -M/`9Z%J&YPSA-$_Q"8G&&7RGS^<;,`Y3QY_>.*0``'```0`1,R"\.G#*7`;C2 -MAE<;W4!A&54WEP```!P``$`%.\A,*,ED6`\-SFT\FQ.LJ]3']I;B$K=&8`L/ -M`)@!``"8`0```@```$4``91L=P``0!$``,"H`0'`J`$"`?0!]`&`!V58D$=U -M:@WC^0``````````(2`B"`````````%X(@``>````'0!_P`,`P``#`$```R` -M#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,` -M``@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!``` -M`@````@$```.*```B``"``"%FS'&V[5*+<\^;PBRH_"-#JI:XQ@@M&->^"P"-7_O.` -MMX;SJX_8`+\[5EJDYTJ5Z(@AY?STY&&"J9H!*SB81B(L>_*NIM*RQ0$UB&=S -M`1P/T46/!AC@8RD``"1HA:AN<,X31/\0F)QAE\I\_G&S`.4\>?W -MCBD``!P``$`$3,@O#IPREP&XTH97&]U`81E5-Y<````<``!`!3O(3"C)9%@/ -M#"(` -M`'@```!T`8``#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``'*HA@CIKPS7S -M"L!^RHDWK;WUH*WI+68()4ZG&<8&+C.4A"\-*-T[8I-6MG3W'K9&&K9'_L@# -MYI'N%F!H.ZGC7FU+,TKDZ4.&#\A3R8HT4^N=75$QF'>N$- -MN[DP````'```0`6W54-\PI?M`92*0``'``` -M0`0\A#Q_TQL[)V0M!032_WKA#;NY,````!P``$`%MW(Q.72M+UW!;^[BA`ZD -M+99K3R3D$K=&`T,'`)@!``"8`0```@```$4``91L@@``0!$``,"H`0'`J`$" -M`?0!]`&`!V4#2PTLND'Z/@``````````(2`B"`````````%X(@``>````'0! -M@``,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$` -M``,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P`` -M"`,```4#```(!````@````@$```.*```B``"```M -MO?6@K>DM9@@E3J<9Q@8N,Y2$+PTHW3MBDU:V=/<>MD8:MD?^R`/FD>X68&@[ -MJ>->;4LS2N3I0X8/R%/)BC13ZYU=43&8=YR3PL@$,_/R:R$O#XT=CU>=K94! -M\KL:""XB?(.J!8DTS9PK[EG4I.:2&RD``"3/:19%`Y4G<7Y%73&.K%*CS#N3 -M\]USWWE5#?,*7[0&4BD``!P``$`$/(0\?],;.R=D+04$TO]ZX0V[N3`````< -M``!`!;=R,3ETK2]=P6_NXH0.I"V6:T\DY1*W1C]1!0"8`0``F`$```(```!% -M``&4;(P``$`1``#`J`$!P*@!`@'T`?0!@`=EHIX7"(``'@```!T`0$!#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``O')GI$SV'8"?(9EZ\F#3`X=?ZABBZA?H\8L+2:OK:2MY;08>N0(60[=` -M$'*U6"43&V-*(3KI85-;--YO\37]?4K%MT2B>-6YW20B.K_)!9'K*9,&>>%$ -MOC1GQUF!#?S/R6'VR<_)H@)[^Y@$[%)\,+N4?:,F/O4^Q"U\[P)5Y70I```D -M!N-!H*%B8*/_UYF`1_"PVP%L/X2L2X'7T%G!^/)JS=8I```<``!`!)EE3RVZ -M?SNHC%Y9'*:02I]\WF[-````'```0`5?0D=J%=FF'A842D1&^)H/U1`,QN42 -MMT:.>P@`F`$``)@!```"````10`!E&R/``!`$0``P*@!`<"H`0(!]`'T`8`' -M9:*>%W.&ERK5```````````A("((`````````7@B``!X````=`$!`0P#```, -M`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@" -M```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,` -M``@$```"````"`0```XH``"(``(``+QR9Z1,]AV`GR&9>O)@TP.'7^H8HNH7 -MZ/&+"TFKZVDK>6T&'KD"%D.W0!!RM5@E$QMC2B$ZZ6%36S3>;_$U_7U*Q;=$ -MHGC5N=TD(CJ_R061ZRF3!GGA1+XT9\=9@0W\S\EA]LG/R:(">_N8!.Q2?#"[ -ME'VC)C[U/L0M?.\"5>5T*0``)`;C0:"A8F"C_]>9@$?PL-L!;#^$K$N!U]!9 -MP?CR:LW6*0``'```0`2994\MNG\[J(Q>61RFD$J??-YNS0```!P``$`%7T)' -M:A79IAX6%$I$1OB:#]40#,;E$K=&%;T.`)@!``"8`0```@```$4``91LDP`` -M0!$``,"H`0'`J`$"`?0!]`&`!V6BGA=SAI````'0!`0$,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$` -M``R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P`` -M`@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``"\D -M3/8=@)\AF7KR8-,#AU_J&*+J%^CQBPM)J^MI*WEM!AZY`A9#MT`0LIDP9YX42^-&?'68$- -M_,_)8?;)S\FB`GO[F`3L4GPPNY1]HR8^]3[$+7SO`E7E="D``"0&XT&@H6)@ -MH__7F8!'\+#;`6P_A*Q+@=?06<'X\FK-UBD``!P``$`$F65/+;I_.ZB,7ED< -MII!*GWS>;LT````<``!`!5]"1VH5V:8>%A1*1$;XF@_5$`S&YA*W1L#,#`"8 -M`0``F`$```(```!%``&4;*$``$`1``#`J`$!P*@!`@'T`?0!@`=E@1&`1!X? -MP"(``'@```!T`0$!#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``5HKHZPF?A%_;R@S#=$ICSE2PC/G)U`<'W0<%U(RK -M$;5$T6+C(2>O$'=K1[]\P;V:@Z@(WM,,.O!TV,#!!7^*__ZRU$49:'*6;3(Q -M?AG5/8I=KO%_5:7C9^)JZ2CK/["P,5(!/20-;`;MX000X54EUKG,MUZI7HEF -MSX.A"+;\77HI```DAH$]XM5)7RB4913QMS<:/[1^`?"!"B46@0WCG#GN6ZTI -M```<``!`!*;QV1T1S&1"Z,*75A%67U[^%&B>````'```0`7E"BL%[$%F^<+S -MYSNJ!3XZR]FH8.<2MT9/LP``F`$``)@!```"````10`!E&RF``!`$0``P*@! -M`<"H`0(!]`'T`8`'98$1@$0>'\',```````````A("((`````````7@B``!X -M````=`$!`0P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`# -M```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,` -M``$#```(`P``!0,```@$```"````"`0```XH``"(``(``%:*Z.L)GX1?V\H, -MPW1*8\Y4L(SYR=0'!]T'!=2,JQ&U1-%BXR$GKQ!W:T>_?,&]FH.H"-[3##KP -M=-C`P05_BO_^LM1%&6AREFTR,7X9U3V*7:[Q?U6EXV?B:NDHZS^PL#%2`3TD -M#6P&[>$$$.%5)=:YS+=>J5Z)9L^#H0BV_%UZ*0``)(:!/>+525\HE&44\;_A1H -MG@```!P``$`%Y0HK!>Q!9OG"\^<[J@4^.LO9J&#G$K=&X/0&`)@!``"8`0`` -M`@```$4``91LK@``0!$``,"H`0'`J`$"`?0!]`&`!V6!$8!$'A_!S``````` -M````(2`B"`````````%X(@``>````'0!`0$,`P``#`$```R`#@"``P``#`$` -M``R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P`` -M"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```. -M*```B``"``!6BNCK"9^$7]O*#,-T2F/.5+",^TPPZ\'38P,$%?XK__K+411EH-GXFKI*.L_L+`Q4@$])`UL!NWA!!#A5276NB6;/@Z$(MOQ= -M>BD``"2&@3WBU4E?*)1E%/&W-QH_M'X!\($*)1:!#>.<.>Y;K2D``!P``$`$ -MIO'9'1',9$+HPI=6$59?7OX4:)X````<``!`!>4**P7L06;YPO/G.ZH%/CK+ -MV:A@Z!*W1K'_!`"8`0``F`$```(```!%``&4;+8``$`1``#`J`$!P*@!`@'T -M`?0!@`=E1%1Q^1Q'K$```````````"$@(@@````````!>"(``'@```!T`0$" -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``:+DA*7GGZKYV1A]ATW6:1BYM -MJO"W].F8@TC%N4]K@$,L_?S$B%_,>H_MC*.Y[?34*<-*B8NED/(WE0NM.ZGL -MY4LV.YC.KK:!T(8*QF>ZE,Z`?HVUG*T4O[.YTRA+@1Z1A7DN_C$]1'KRQEB# -MIZ3VND69C>M2FA>/SEU%IQX7XTLI```DRX65N1LCY]N77@S(4P42&.ZUOC'5 -MN;,1N289E0O/AU\I```<``!`!"*5,.`D17&@RV.@2MT90+0@`F`$``)@!```"````10`! -ME&RX``!`$0``P*@!`<"H`0(!]`'T`8`'9414WTU"G#2HF+I9#R-Y4+K3NI[.5+-CN8SJZV@="&"L9GNI3.@'Z-M9RM%+^S -MN=,H2X$>D85Y+OXQ/41Z\L98@Z>D]KI%F8WK4IH7C\Y=1:<>%^-+*0``),N% -ME;D;(^?;EUX,R%,%$ACNM;XQU;FS$;DF&94+SX=?*0``'```0`0BE3#G,LD, -MZ>3!QIL"K!T0`3*&]P```!P``$`%]+]S!-H9BS!`0XM-S'@)$5QH,MCH$K=& -MZVX.`)@!``"8`0```@```$4``91LP0``0!$``,"H`0'`J`$"`?0!]`&`!V5$ -M5''Y'$>L0```````````(2`B"`````````%X(@``>````'0!`0(,`P``#`$` -M``R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@`` -M`@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```( -M!````@````@$```.*```B``"``!HN2$I>>?JOG9&'V'3=9I&+FVJ\+?TZ9B# -M2,6Y3VN`0RS]_,2(7\QZC^V,H[GM]-0IPTJ)BZ60\C>5"ZT[J>SE2S8[F,ZN -MMH'0A@K&9[J4SH!^C;62[^,3U$>O+&6(.GI/:Z19F- -MZU*:%X_.746G'A?C2RD``"3+A96Y&R/GVY=>#,A3!1(8[K6^,=6YLQ&Y)AF5 -M"\^'7RD``!P``$`$(I4PYS+)#.GDP<:;`JP=$`$RAO<````<``!`!?2_"(``'@```!T`0$##`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``K4.Q0@*: -MU1G(N.YQUFH6&<;-@`=\ZCGY]M?DHZ$3Z!>V-$B;V.2I;8I@QC'/E,HHI```D:PE!VB]OOYP, -MT7*?2)I26/76ATUD@I]>W:-F,^SA_[4I```<``!`!`U;VA<`:@((*5.9R?%A -MUW_=0UV>````'```0`5'Y-BY]?,&'I=9<_;T&MRI!QI6(NH2MT8490``F`$` -M`)@!```"````10`!E&S)``!`$0``P*@!`<"H`0(!]`'T`8`'9:JN_&<"T>7: -M```````````A("((`````````7@B``!X````=`$!`PP#```,`0``#(`.`(`# -M```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(` -M``$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"```` -M"`0```XH``"(``(``*U#L4("FM49R+CN<=9J%AG&S7)="\&7:`W$_ZN^7PTF -M%NS*J)O#=@%U&F_56:FT3OC4=?(`'>^J6=LSI>;+[EC"1H2-_JTKZ!,AU>NI -M5:W=[#M((DZOM2.8II6^ZIC']8K'H`'?.HY^?;7Y*.A$^@7MC1(F]CDJ6V*8 -M,8QSY3***0``)&L)0=HO;[^<#-%RGTB:4ECUUH=-9(*?7MVC9C/LX?^U*0`` -M'```0`0-6]H7`&H"""E3F``` -M`'0!`0,,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"``"M0[%"`IK5&P[2").K[4CF*:5ONJ8Q_6*QZ`!WSJ. -M?GVU^2CH1/H%[8T2)O8Y*EMBF#&,<^4RBBD``"1K"4':+V^_G`S1EUES]O0:W*D'&E8BZQ*W1G*P!`"8`0``F`$```(` -M``!%``&4;-D``$`1``#`J`$!P*@!`@'T`?0!@`=E@;TO85HE1XX````````` -M`"$@(@@````````!>"(``'@```!T`0$$#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``QIO'WDLZ!QT7F]OA?8U6SZQ[%.4` -M-(^BPBB_%29BHCQX3>0J^Q>%90`O0ZZ%)(*-LT"I7%B_IK*U"U*IZAM:;*PI -M```DMN:?J>$_7*TEXULO1G&..MJ/(*6,5&VVJI!`G?O:+I4I```<``!`!%=5 -MIC:M$.Q6)4:;JI7@`2U^(UZG````'```0`4MNC/]PC+$-HY8Z$I8I25)NY?$ -MG^L2MT8>WP<`F`$``)@!```"````10`!E&S<``!`$0``P*@!`<"H`0(!]`'T -M`8`'98&]+V%:)4>.```````````A("((`````````7@B``!X````=`$!!`P# -M```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,` -M``@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P`` -M!0,```@$```"````"`0```XH``"(``(``,:;Q]W*`UL)DP\&ROM6()\%N0BN -M87>N?T.%"HUP>@$W[(_HV-#(M1-YJ8?++,F'7Z(N9']++D.EXI^>_%5=G7`[ -MI7I+.@<=%YO;X7V-5L^L>Q3E`#2/HL(HOQ4F8J(\>$WD*OL7A64`+T.NA22" -MC;-`J5Q8OZ:RM0M2J>H;6FRL*0``)+;FGZGA/URM)>-;+T9QCCK:CR"EC%1M -MMJJ00)W[VBZ5*0``'```0`175:8VK1#L5B5&FZJ5X`$M?B->IP```!P``$`% -M+;HS_<(RQ#:.6.A*6*4E2;N7Q)_K$K=&K2`.`)@!``"8`0```@```$4``91L -MXP``0!$``,"H`0'`J`$"`?0!]`&`!V6!O2]A6B5'C@``````````(2`B"``` -M``````%X(@``>````'0!`00,`P``#`$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``#& -MF\?=R@-;"9,/!LK[5B"?!;D(KF%WKG]#A0J-<'H!-^R/Z-C0R+43>:F'RRS) -MAU^B+F1_2RY#I>*?GOQ579UP.Z5Z2SH''1>;V^%]C5;/K'L4Y0`TCZ+"*+\5 -M)F*B/'A-Y"K[%X5E`"]#KH4D@HVS0*E<6+^FLK4+4JGJ&UILK"D``"2VYI^I -MX3]`!+7XC7J<````<``!`!2VZ,_W",L0VCECH2EBE)4F[E\2?[!*W1ITM -M#`"8`0``F`$```(```!%``&4;.8``$`1``#`J`$!P*@!`@'T`?0!@`=E/VR> -M*?YE_%```````````"$@(@@````````!>"(``'@```!T`0$'#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``#I+I.IT9"6>CLTYYX6"+>KG3%/GVT1;O`Q.* -M#XBYJ').K%3/!1\)3_M<83!^]$H5TM$8$OJXE-TUJ@+5PJS`CIQVQR,4/R>B -MT6,_181J;\A-_@@2B3WW[_)D3>/`GXGOB?;V\$KQI0)1]/R$Q(J7*T53*K-I -MS!L.,XLLYNR`M+TI```DSVP>_9H7/++#V$8!````'```0`5)'V'<2L?T -M^.2[L;G8>+U`Z!6,>%@BWJYTQ3Y]M$6[P,3B@^(N:AR3JQ4SP4?"4_[7&$P?O1*%=+1&!+Z -MN)3=-:H"U<*LP(Z<=LN9+6ITM!H.?8]V:U__RZM````'0!`0<,`P``#`$```R`#@"``P`` -M#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```! -M`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$ -M```.*```B``"```.DNDZG1D)9Z.S3GGA8(MZN=,4^?;1%N\#$XH/B+FH^)]O;P2O&E`E'T_(3$BI9R!```````````"$@(@@````````!>"(``'@```!T -M`0$(#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``YR?.H+(YRG4(?$&'%@RJ -M!B1H6XQIR/LW_

[OJ+:TB -M4HGMD>Z3%.&E'E1;?_]\;1VO_[GOUYV!\0^/QW'!Z/'ZHC6#-7-LNRIV9E#` -M*64HXU?@-J-,!Q&@=Y[A4*UKW+)[9JKM0V=E`J,!]]I-_"EX?Q.H?U*-8S9( -MGNCH8RYID;MXJWQLL96L`U@<J/D`_N,&-B@\DEP\Z'Q4N("0(`````P```-PA``#`5Z1BD6[$$17?]]7J -M).85V\=,`HMH0_O8U'G8%M8N_&X8YU_2:X)Q?7+;XH6Y7F!]S\:_NC -MW#O>-T2)+2H;3_)(>%DH0/?QWNL`@(OU$MAK:-MTE2G\CJ.BR;8&Y_A2$[=& -M?AT,`&P```!L`````@```$4``&B$8P``0!$``,"H`0'`J`$"`?0!]`!4!CEG -MJCY`/[C!C8H/))$7"6%K#O=W]=:4K<*I6">3&P^P0R -MA$5D$XGDLQ#:)7086ZQZO!_5I%(3MT;D4PP`/`$``#P!```"````10`!.(1E -M``!`$0``P*@!`<"H`0(!]`'T`20'"6>J/D`_N,&-B@\DEP\Z'Q4N("0(```` -M!````1PA``$`4HFT2!YXT%RNG8=$[V."IZ\SB#0!:43N$F:FM'%NZGAN[,PC -MBX*2`!@[[=8*[R$`2O,%E!P)&5(R0''DK^Q30N>+Z558J2@$4:P1:O^2`A/1 -M'_0E)"A)(9E*Z>*$D_,]G8K#K']5DMRSM@0416#(.55!'TRNS^W:Z<;K>L$8 -M[!]/C)R:D_>/<\[;Z="G')/I^)19@_J_[+&$-3I[8N(L;TM^W\>,('!WCE'B -MY%H1+,)P0R_M4TY4.._5/=\5/0]Y:I,%IM8C&W$56DY?RUZ+?')XB\=^H&6` -MDQ3@!3Y_%C[2F%'1'DQVY)NE5>(]1PC`^WYZ2CP6`92D8`0N4A.W1L1?#``< -M`0``'`$```(```!%``$8A&8``$`1``#`J`$!P*@!`@'T`?0!!`?I9ZH^0#^X -MP8V*#R27#SH?%2X@)`@````%````_"$``.`H!3$``(FA))G'M7"L2AA*47F2 -M[',/%))_B&F=3$[TWWH>B!IH0O)CC9@GC9_"[\;O5E6K.W -M__A/_YW_Y6:!FA<2I\N33K;XOK)1V]DMN67([23`@KDJSBEO;&;OE8LY<]0/ -M/`;AW%-\6Q5?F+DVY&,'561:VO]8#W)B?Y;.DPJ5'KVFGQ"W:P\2J2@3O8`I -MM->C_,X.;,Y>7I3%NR.\PW`KTG*,+AKYMCDG+@%%\++'4Y600!CP_+AC.AEK -M#Y5SBFH?0R:@OLFN)&,EM?D<'&+"4A.W1B%P#`#L````[`````(```!%``#H -MA&<``$`1``#`J`$!P*@!`@'T`?0`U`:Y9ZH^0#^XP8V*#R27#SH?%2X@)"`` -M```$````S"$``+#H]9OM>+DW)C-V&3W4-XQ5[YX#X6>?R:.=-)-(B2+";R$) -M6K5"9MW%BPO)_\.5&289A-/M;JL/L''E$CHQ\\&2`PY^<(5MUVT&7+>N: -MDAN>[_=9<.*99Y(H#<`VX,74"!M^^K^;?/S[[?1M(/`^G7-RTJU!0*=&#_;^ -MUN=@4A.W1CR3#`#L````[`````(```!%``#HA&@``$`1``#`J`$!P*@!`@'T -M`?0`U`:Y9ZH^0#^XP8V*#R27#SH?%2X@)"`````%````S"$``+![JDZ3"W!^ -MVIC[+9@-OBXASR5)?HFA]2O((J*4P3!.T%R1V.KP&CC50_[`5*PR`_K9B#ID -M,.]0)=@7=S3)1W#:@L7^'^U)3=O\,OJUGQ/"9^XDF%C&X5ER9EURO6A(R%#* -M(WP$1GOZL;?\S.3=YJN1K"(,VC32?`".+-;#>F5L&G_>"]3$CJU2X;H\D4C- -M>"D/"^&QIT/F$_?0.`^-W&>,<64#D9%C6^$EP]>(4A.W1E.P#``\`0``/`$` -M``(```!%``$XA&D``$`1``#`J`$!P*@!`@'T`?0!)`<)9ZH^0#^XP8V*#R27 -M#SH?%2X@)`@````&```!'"$``0#[WPNJM\Z,*DXVEMFT'[E<^*/3M=LBC1M< -MZ#E"?ON$-H;M1U,A5_YZI6R98HVTR-(?2?(094[(+='X -MS$SZ -MYZG4KHO;\4544NFFW\?R"!D]BA-[$.(HH,(HS'+D-LYJ49SSR6!UGM(+HS%J -MSF6+\(OCC-*XOTS>0B@(OQ6I8[G*WMJG>O8ZHJ:_N2E+\1D68 -M.([CCOT%'VU@`URB(D:,IZB+UBR>#R4]"4D,%KJR7)F]:^+0&IVEHSW6=("& -M/#9!VWM%*+2WUK-@)O`+VI:NM%0WV'92$[=&#B_3;F5"P=,$A2A9%J[NC@LZ/TY -MI5`B=1:*S<._`)2?*HX`W.-?P\D!0/9W\@;*#5S39ID*@19,%O7P-QJ!9A]4 -M")3GG#5S`W)'-]1(`7WN_5\0NMB5(5L4*1-WF%>)S1#:KSY<)U1RO2(1W!.< -M_"7/?M'-R]"\1;TV%DE697CY8?6/G7$U\TR?"%:62S.$%PC4]`JMN`5NE;D$ -M.<2F4)A<[O9=R$[9O392$[=&?>X,`.P```#L`````@```$4``.B$;```0!$` -M`,"H`0'`J`$"`?0!]`#4!KEGJCY`/[C!C8H/))A;F6=C]6!#-1"W=9,F`,P(Q -M@`:T,+$E/,)#R/.KT;7R>"IM)Q^9HY/ID)KL>D'$A#P2H&96Z^2:4ZL$5WPQ<1I@"ZVY[S\3"^`",]Q6QL -MPH*[%_)^]%1T!N:R`"W,DRJ2Q23V3+X(%B@4IFF7Z.G;W4A+2(P%,EI2$[=& -M-!4-`(P!``",`0```@```$4``8B$;0``0!$``,"H`0'`J`$"`?0!]`%T!UEG -MJCY`/[C!C8H/))])4K/2KE:7%]+N!D3PD=Y0W4D,F)QX&U2D. -MTHD`*?L0*U=#CS(!0Q>\OSV&M#!4\>]:X@Q+BQ>4)W;\PA.TG<->4'HH[T(R -ML7D1J/KAAUM3>0L+<-VJZJI]@<4EU4I")ZHWXHI38XW26^=(:_4X2<,1+NS\ -M#YWY]1@&].^RGY:0O%6RTH.T+#^0]R=5[G;R#*F>.@C^VT_ -MA0_1)D7;O"6SK,:H3.9C+0B#=L6-I&8$93`Z>`2"J^#@PHS&$T7K<@ZSB:+/['';7&YD-C==M'_@#`#T06./D92=,>CW)7HY -MCZS*1QO7XG0^'$`J"Z`O2^&YI*R)=E%;`("YO`Y_CMK2W@%D%90V?W1=>L;+ -MML@7S*&(@AL$DE]6FL"(?1.]+R[AV[=)%\S]Q\TY%^T;#OA5"C!9C9"28QR3 -MF%!4"PAH,EC_,Q6KWC6T_[08'#PPHQ;+ -MH9W3;*)^<5(3MT9S<`T`?````'P````"````10``>(1O``!`$0``P*@!`<"H -M`0(!]`'T`&0&261O1N98B(CT,SMA3&@26Q\N("4(`````````%PJ``!`SAK* -M-;A4>CS#3JJ>SFCC4? -M8#RX5=;SCY7[[8F[4A.W1OE[#0!L````;`````(```!%``!HA'```$`1``#` -MJ`$!P*@!`@'T`?0`5`8Y9&]&YEB(B/0S.V%,:!);'RX@)2``````````3``` -M`#"1N9EX:N6"AI?0]!>CAB%5O0>S"2IH:]8)A1-$W:QR2H#<_8$EPQXF(:*E -M/%(3MT8RBPT`;````&P````"````10``:(1Q``!`$0``P*@!`<"H`0(!]`'T -M`%0&.61O1N98B(CT,SMA3&@26Q\N("4(`````0```$PJ```P-Q^7/O)#6,^? -MD,/?-#*LI6NU)M=P[91P%G]`,6,,S1W_C%J=J\5*P8O%H1U2$[=&;9@-`&P` -M``!L`````@```$4``&B$<@``0!$``,"H`0'`J`$"`?0!]`!4!CED;T;F6(B( -M]#,[84QH$EL?+B`E(`````$```!,````,"(9VST:_LYG&,JF8I%`AH87`QH4 -M8129FQ?I"_EOZ^+CDW]X'P>&T4^\ZQY]4A.W1N.3#@"8`0``F`$```(```!% -M``&4A',``$`1``#`J`$!P*@!`@'T`?0!@`=E84KO#*9$7"D``````````"$@ -M(@@````````!>"(``'@```!T`0$`#`/X``P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``&HR+7-[Z:U$&QU\JUY-2*$75>,>U%.C_[D-724EN?3Z^U6^& -M.)/X9_0&5!IDG`@!K;C2_K"DU[TY45852=]JW:)_(&PNXTKZER^;HT'[B?5L -M=>QR8/[@:S/H0'U.!E3V']&&]:\T2>88*P:HLRWJ.5+AAOZFZ7(1M6\I```D -MKBV`'D/4B.")RR%3S*1Q4ZEO>;@/F"[NR3T%\%4<<>0I```<``!`!/2G-DWI -MC5!-33L8$A,PPTV!#FW;````'```0`7$*_.R"$R9#E*/MZI+E78X"NZD6U(3 -MMT;6H@X`7````%P````"````10``6(1T``!`$0``P*@!`<"H`0(!]`'T`$0& -M*6%*[PRF1%PI```````````I("(@`````````#P````@``!`!@````KGA19/ -M?,>U%.C_[D-724EN?3Z^U6^&.)/X9_0&5!IDG`@!K;C2_K"DU[TY -M45852=]JW:)_(&PNXTKZER^;HT'[B?5L=>QR8/[@:S/H0'U.!E3V']&&]:\T -M2>88*P:HLRWJ.5+AAOZFZ7(1M6\I```DKBV`'D/4B.")RR%3S*1Q4ZEO>;@/ -MF"[NR3T%\%4<<>0I```<``!`!/2G-DWIC5!-33L8$A,PPTV!#FW;````'``` -M0`7$*_.R"$R9#E*/MZI+E78X"NZD6U(3MT;:U@X`4`$``%`!```"````10`! -M3(1V``!`$0``P*@!`<"H`0(!]`'T`3@''6%*[PRF1%PI'07*F[4.7)PA("(@ -M`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@# -M```"````"`0```(H``"(``(```,IG2IRT1PB.TKS]"QGV@I0FK*0``)#5P_V3N*.\3'NI.(S08>%_KZ`'&P3I0NC-XQ8(> -M<M94<`!=X@A^ -M>%:#HCZW;8]:Q7I-]M\AQZKL:/B^!;^;2P=EX]8J#@ -MH6WZF_WA3."CH8[7)Z8_!(C6QH@LHQ.QWCM5W2T(UOA@1\<8H?"\9^=("+"4 -MR1K)^#"G]PY3;H@$LQ+`ON6 -M:!V"-]B&P^;4%@H$X6LM7R`3IQLIOO`8ML2HQQQ\=*,*G$QL`VFRXF9F:6,X -M)Z6Z1;VYZR--$GHTQP[B:]47F]'ZC)O$F8Y.%"R7L`(]60:WP:\M*#(.=VJE -M@]*)[#2?'5(3MT:J/`\`'`$``!P!```"````10`!&(1Y``!`$0``P*@!`<"H -M`0(!]`'T`00'Z6%*[PRF1%PI'07*F[4.7)PN("0(`````@```/PA``#@F\WY -M3'^1/LA0V[]WV,HP"(E4#*NFS+S#O?C.P*D45P0`JIV%.]'&`:RI%6]#B4#9 -MQP8]]^0H<0J(*T;'U$X8K3"'049!)#A0]N.'!(6['+TH:BJ)NSLSI$GD&9IA -MC*0Z)Y5.?X>O4)9NY0WU%"BQ4YG$HJ+_-@FLM0GE,3MT9L"@`` -M;````&P````"````10``:(1Z``!`$0``P*@!`<"H`0(!]`'T`%0&.6%*[PRF -M1%PI'07*F[4.7)PN("0@`````@```$PI```P,-+?K(CN5ZCET[OO8U4U-)"Y -M@++$&>N"-]78:`,W-[/:#T0^^QSM8?C*3_-3$[=&>1```/P```#\`````@`` -M`$4``/B$>P``0!$``,"H`0'`J`$"`?0!]`#D!LEA2N\,ID1<*1T%RINU#ER< -M+B`D"`````,```#<(0``P),!\!XV(%BMZ:58NQ6[C]VC''1R%[1KZY])O- -M6>"NS4^(#-#+4K::O;)`.VJ8L\O"!#@V#+7M@[MRT=]_(K1@V48#@?26? -M\(TINID3&^DQ>)9$O%,3MT8@2```/`$``#P!```"````10`!.(1^``!`$0`` -MP*@!`<"H`0(!]`'T`20'"6%*[PRF1%PI'07*F[4.7)PN("0(````!````1PA -M``$`R(4,.!,(/1&?-`D$#D7[ -M;)95D^+EB5T.R4 -M:$24$*V82+UQ+(IDG8?AYDI:MB(=F,5F6SDXV*1B4Y1@_X@.,`6%AA[VN3^D -M!9C$G10-!.38>P?C@WXZ5S=D&-D[;OQ-#SZ8K8!DXPZNRNN&<0A?:+;5O(&@ -M/2N6045J1$HF')=-OLU^.(LL\(\1]KH4$,E(\H5=,2:KWIA\0LHH=I&0@?G( -M$A5Q,2M0.6S`>6]1JSFGC&G:M^(W-@\<$#"9]X8%=#(H)OV$/ZL+)K.,MWO$M2Q_+%%>#S>W -M<7-M(/6OTJ]`PL!B&T-27'>N\LXK&XT7D*J*2*OBT/\H2^CMA'32C>'\6?*( -M&TA+*OB<=7WTJLK\\Q2>(%&0$<[]1/-P;^+_A]E.>Q-Y`12-G[SUAU<&4-HX -MSKP!^([?4V.?<'MIQL\G@:8R1$O^E8C@[F48;I#]$I3W$2+YY9Z#'-K2E)AI -M`,."EFWJJM)W]8!T)VK]4Q.W1M-C``#L````[`````(```!%``#HA(```$`1 -M``#`J`$!P*@!`@'T`?0`U`:Y84KO#*9$7"D=!)+0;DKEA2MOL>LEOIJ -M$4ULUF9R#X,&N-)&H(?BUP6G13"]`T11Q1;O7+I>!N(UT-@'>2FC&MEV`#_# -M7+R0U:#`'<-PAC(WOK0M%"'[?3L>W?6R)A!X*\'TDCB -M6E&.VBS%C44.:6RYICG%%4_A[\X/I+XY*]#O,F.-"$\PGZ^4_]"6Z32<*Y1_ -M-!=;%Y:1=UDBVCGU:2`,D$'6!L:VQ2I2J+@#!M?.G8`/=T>!>5Q-;<-\'E.@^4Q.W1A"D```\`0``/`$```(```!% -M``$XA((``$`1``#`J`$!P*@!`@'T`?0!)`<)84KO#*9$7"D=!OLU@3&9F%6<%4`2Y"5 -M+1\8KO&(FL618(69QN6DEZTX'GQ9-C&\=&;$N[7*$`MM$&$KN9[^;\_]G8M0 -M7\??#SD`8B\8DQRI1*UMT!;%]_BM[B"*P9\\)4N?696M@Q,P\?#:I\#'@TDK,7?"DG$-1N96:)8L/3_C0E[]'[$,$FC=-%!(9PU7>7W68R9_.K]O'S[2_P'G58O5"EU@*\9( -MTHV85^3)AL/C**OB*M%T4;NI]X70UD.@QM?Z'2Z(!J -M0P`3I&']H(MO;3#&7$/4@ARI;G)!,T.Z``(;==<&I]!'L"5ZB^=:"26#?O:Z -M]-/Y_RU!_^=;&Y3QL5P)1&.FCK%6^9WKB)7-0W^(N/+O;BD3NNHK(/.4QI$3 -MQQMM@ZJ"+^Y3$[=&1.$``.P```#L`````@```$4``.B$A0``0!$``,"H`0'` -MJ`$"`?0!]`#4!KEA2N\,ID1<*1T%RINU#ER<+B`D(`````<```#,(0``L.W$ -M\$WUQ#PDW<"LG[(K1#^MP%S]B,)O%/"K#;$"&Z54>63DK4O3C]2.ZDEL%UK; -MR8K?5$%KN`!>-XXCV>YQHCK,!2[05^Y_T#4=4@%V-I4##N&=H1Y:45`N9:MN -MB-C[^U0Y,\C)OC5YM-V)BGLMP?_C],'6#C2,C>N%KWLA(YP8P%HO^C7W5KF& -M*L5\R73AMIZ@@^/C$,E*@F_S`9E7<3*0.VK&%C,1F/]I_1-3$[=&C0`]X1]J5#W=Q8RK9:(V:`-@*Q/P(FHYSD9J5^Z@`WUE@8 -MZ"T-;05SM$R4YT$+D@2++\AHVV".!AO-5XP?+:H!KF=HV:`]B[ -MB@BKT=MY4\=_$:.1\]*6%NOY!2^CF3$T?Q`>Z'OD/I\B53BD[8[I'C6?`1O[ -MCU5`S^\DL#$#S*5W+GA@_)KF#YKF"X2!\IG#QBG?4V&@JSO%NJ`F)Q -MHROK4/?N7P''O&IC:IQ0RP[!`U:]NZ8:#[`C228](9I6Z+UH3']I`$>MV,RW -M3?:=S>MR$:F;^=(,8.QFP2;C4\E9L@V*3_Y)`!UI/2EAZ$JA)0"E=4)^`5P@ -M-060P/5H%%EWIV>O&>KR8.[`(1M2X^(2(``!`$0``P*@!`<"H`0(!]`'T -M`&0&2=@<_?":3N-1IYC9N!H.="@N("4(`````````%PJ``!`>EJO6TAO*`%? -M`1=WXLG[18LL8<>Z?@K?A=,`CVG.&4NO[C8X"#VXHUZ3E9SK;[?N4B^N'O+W`H`4Q.W1G!O`0!L````;`````(```!%``!HA(D``$`1``#`J`$!P*@! -M`@'T`?0`5`8YV!S]\)I.XU&GF-FX&@YT*"X@)2``````````3````#``E,3H -MPA\V9IGD@BH,:ZL_7.<5;RN"Y2E9&!5!3??/*SB[&M/11+=6?QUCM%,3MT8+ -M?P$`;````&P````"````10``:(2*``!`$0``P*@!`<"H`0(!]`'T`%0&.=@< -M_?":3N-1IYC9N!H.="@N("4(`````0```$PJ```P]G!-M%,FBV`E$8%?%PGS -M]^A2N>L>*,:J@>>;0/#&,8V;@: -M#G0H+B`E(`````$```!,````,+"6<;,"NLFFZC'GG?0KKO$0FZW4RH5(*3T, -MO\1=/X>Y2Y#D+,=AT/<7$1<+4Q.W1EB)`@"8`0``F`$```(```!%``&4A(P` -M`$`1``#`J`$!P*@!`@'T`?0!@`=EX(FE@37V358``````````"$@(@@````` -M```!>"(``'@```!T`0$`#`/Y``P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``4FV! -MU6^S"0/++1BFL7`J"XQ+C,C?I)=6N]NEB#DM=OH;2S++U3 -M8'E=3`:Q:L-OS#)WH4'%4F5ZR]Q/9DW!GWS>A_K`.+V[8A/C3":*?D3#V<5@ -M,'JDAWFY<'#,(O!F##Z)/ZKZI\^\53LE^)HL3F*MMW"/(/XI```DU[\G%>2) -M):S.>]X&"611FE(4T[P%*#]$6H0IC]G015\I```<``!`!!:>.@;.NFFG9V@E -M/;#(5@WPYI^,````'```0`6K%FK#]+(^R#!64QA4&NO60M[#F5,3MT8BF`(` -M7````%P````"````10``6(2-``!`$0``P*@!`<"H`0(!]`'T`$0&*>")I8$U -M]DU6```````````I("(@`````````#P````@``!`!@````JBT[N2?)FY3:M" -M7;)/%4,Q;+JO2E,3MT;&IP(`N`$``+@!```"````10`!M(2.``!`$0``P*@! -M`<"H`0(!]`'T`:`'A>")I8$U]DU6```````````I("((`````````9@A```@ -M``!`!@````JBT[N2?)FY3:M"7;)/%4,Q;+JO2B(``'@```!T`0$`#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``4FV!U6^S"0/++1BFL7`J"XQ+C,C?I)=6 -MN]NEB#DM=OH;2S++U38'E=3`:Q:L-OS#)WH4'%4F5ZR]Q/ -M9DW!GWS>A_K`.+V[8A/C3":*?D3#V<5@,'JDAWFY<'#,(O!F##Z)/ZKZI\^\ -M53LE^)HL3F*MMW"/(/XI```DU[\G%>2)):S.>]X&"611FE(4T[P%*#]$6H0I -MC]G015\I```<``!`!!:>.@;.NFFG9V@E/;#(5@WPYI^,````'```0`6K%FK# -M]+(^R#!64QA4&NO60M[#F5,3MT83S`(`4`$``%`!```"````10`!3(2/``!` -M$0``P*@!`<"H`0(!]`'T`3@''>")I8$U]DU6O#(?A^R$=4TA("(@```````` -M`3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"```` -M"`0```(H``"(``(``+Z\4;)?#&L\/V-"8H.W*M?^3`T&E0]JYP\$V/&@6.#S -M,M#K*+$H2#VF(34ZR\.TNM3`W7]XAFTW3B!AD/G3`,]__0K&&K[KK_I_S+HJ -M!7ECCHV#'=DR(%?Q0FV0P5V9+!]15&!H)P3CF,Z1-P(2>D+C_^$\RU1M8EU\ -MO+6*9:T**0``)#0,;HF#S>\VKR]$@7$63E)G/U?Z^FA1#J6QQ1#L?)O)*0`` -M'```0`0(>3.S\#-XA5Z)E\2A66>Q(NJ()P```!P``$`%G[Q'+&BZ&)\F2((= -M4_YFX>;)(PI3$[=&-OD"``P!```,`0```@```$4``0B$D```0!$``,"H`0'` -MJ`$"`?0!]`#T!]G@B:6!-?9-5KPR'X?LA'5-+B`C"`````$```#L(P``T'SZ -M3PGX/#.C@"UXG!47X:S%[OVW?&9 -MW'&??MI_++L^3VO&S&)^[8O%\4R0M:;DT5J$?;%9YL;T\\1Z:IMHJ`H\1V#4 -MP`.=M"Y0*(T[\3`UH-LFKA*YI66WK@#)4'8UE(XBKHG@L9H;0$%%EQ;(W@$$ -MH;3[FFJF=M'6$2Q1UW@?[O(QZ^$DZ\`D>'Y>&@MME6%.S.4`QZ=!3D=+6]"] -M1>(;144\TI,@^?M\'%?(2A(I;TS$X%,3MT9P$@,`O````+P````"````10`` -MN(21``!`$0``P*@!`<"H`0(!]`'T`*0&B>")I8$U]DU6O#(?A^R$=4TN(",@ -M`````0```)PD``"`"YB;R#2PW6B&O3^73-0R&!I!O:U_T=G'F&G']G/= -M,,."(=^V$;'(5^;_GTRM,Y'IDC&/7%?2?6*@[30VK-PD),XML\WHTOI")I8$U]DU6O#(?A^R$=4TN("0(`````@```/PA``#@7]2#3KTHCX$N -M13[SHG+C]07$F^(-0.>+Y(H4;"2?HYJY[]Q7>].?]^A";FOS[%=8"$;'YQ`"-WCKV"71FIEF6%L`T6_,(U,7%%XB$6EA[[Z)DIFGNY&11?=U[.4@K -M(_>&2">\<7.$=+CW)_'#41]$'.3.NW&7?6K#92JE&YO[G[OWP[X=]!1(L/V_ -M6R>Z/A'>ZHU)QJJ9^L'=ZT:T.FD6IVJR^#5;%"1@]U,3MT9U/`,`_````/P` -M```"````10``^(24``!`$0``P*@!`<"H`0(!]`'T`.0&R>")I8$U]DU6O#(? -MA^R$=4TN("0(`````P```-PA``#`Z"W^S!;\F=>ARA^6E^NZ9_OZ]Y\':Q@@ -M4O!T!XV;TCB]EDE4)]*893N):T>R,^5-03\Z$&=%WXQTN\6&W&[T/.YU\;;. -MVY2SF;JK]37-S''^OB?B=K7`TQXF\P9+)WJ=#',,E32D5R<-R9N10@.=UM]93$[=&DT<#`&P```!L```` -M`@```$4``&B$E0``0!$``,"H`0'`J`$"`?0!]`!4!CG@B:6!-?9-5KPR'X?L -MA'5-+B`D(`````(```!,*0``,/$OH[*F#T8+(V[/3X@6B^YZ%N&%;(C]#9?< -M%FI^$$.;?^VA_64^_3KX9?,M4Q.W1KIB`P!L````;`````(```!%``!HA)8` -M`$`1``#`J`$!P*@!`@'T`?0`5`8YX(FE@37V35:\,A^'[(1U32X@)"`````# -M````3"D``#`NYS>V+=\#X,4#5U'H0U')L!TQF-G0)+(%/3U$+:6MVZP]\)IO -M_LQ<*REH]E,3MT9+?0,`/`$``#P!```"````10`!.(27``!`$0``P*@!`<"H -M`0(!]`'T`20'">")I8$U]DU6O#(?A^R$=4TN("0(````!````1PA``$`)R;' -MM7P=QKU<#IYPWSKYE'O6V]_"J9`@.I'O%]#*NCT@_:T68#`@77.%Z`D[:U`5 -MO\E4.O`^&&B;[9Q@TPL!0@P4ED81+2(4/@..@'^\O+D?:2A\X`ZGVE%JX>0( -M,L*U\JX2P)%(Z30L\9K<9AUY=)=TN=J6D4HOX&]Y1Y.\53IK\(+'''-0(9$B -MJ#CCY\O&\!Q'N#?&-E;V^,&0 -M)23EA@]!U-IS#ZM,`'C5*=0(LTIRF,M[$BH.*PX:)1*7YUGQY@YV++V4^I:>0P=_%O;T#Y_^UL4Q.W1OJ)`P`<`0``'`$```(```!% -M``$8A)@``$`1``#`J`$!P*@!`@'T`?0!!`?IX(FE@37V35:\,A^'[(1U32X@ -M)`@````%````_"$``.#?H0)2Z5RF1?37&#$T'Q<9:=O,T89,JUE/[WQB:+W/ -MUS;;Y#NX7LZH*SYFK&MWR[8U%GG`1G+U`UDD^(\C'4Z;F4Y':>1_/?]0;T6ID>180DE6;[<@P+2N`_W3>TH&2*,LUY&$6\R7*T8H&^=&`7QZ -M_[(+OO=;T_9>.MPG@::5*Z$8.#>,Y(::S`8&-]HOT+`C1$_6NB3@6Y`7Q+'M -MA-(J8V)LL*A#4Q.W1G*9`P#L````[`````(```!%``#HA)D``$`1``#`J`$! -MP*@!`@'T`?0`U`:YX(FE@37V35:\,A^'[(1U32X@)"`````$````S"$``+!Y -M5]+>]%04E6R_/V@AV38C8;?@?G(TUR+E@H8!!BDV'0@GC/Y4'5SUS!*J:JJ/ -MLLZC&3IH(NW=.,[P=2$:05\'M+"1^K6SA&XVLWS?^&L\)$?8TM6A43!]`+F9 -M:F85;4`&&+P2ZS6H/3F.]*`=J$_IY&U+V9WT94ZDQW2\G%`R/$9!+8K17%"2 -MSY8M:T4HR=R%(@?J3;X@?BU:X?3._H:7A)(RE4U(<3X`<'H&4Q.W1GF[`P#L -M````[`````(```!%``#HA)H``$`1``#`J`$!P*@!`@'T`?0`U`:YX(FE@37V -M35:\,A^'[(1U32X@)"`````%````S"$``+`+:Y([$X")TZA%&IM3M$L:C4%+ -MM>_Y1$O@[C/=C'^Z*#/+AUQK"RMN!L)]D,DY,S6<$0%AZV+&/E4=I?>Y2S3# -M@17Z>(7B:?%B7R0:65HHH#[(%A0WH-V:MG:\.!6)R3@82DEP7>?B9/1' -MC+6;Y`[.IKSZ>XP`POW(#V3P&Z\3.&(07+ZX,P11C1?)M:H!8__B]TO2A'12 -M]+!J0:E4/":_-2L-$4Q.W1LO8`P`\`0``/`$```(```!%``$XA)L` -M`$`1``#`J`$!P*@!`@'T`?0!)`<)X(FE@37V35:\,A^'[(1U32X@)`@````& -M```!'"$``0`SZF?TBQ((42VCF90I$7-=_#-S"'/4"HX2XR!V]1LYR8\$MS[G -M)D60BF39!7URKV3R7"%JA-Q9,IB:GT$F-1G6>6EW;\X^QNO/1JTSY/S.^JR9 -M^>[RU`7E*E#!*3DI*^RR'K13_H!B=?X@13HO4#8S-:"`X -M]&@2FE(6A6*`F4/;KB[,M[>2U#/G;VZ:/*/XKT`%8'47BKI3$[=&C>0#`!P! -M```<`0```@```$4``1B$G```0!$``,"H`0'`J`$"`?0!]`$$!^G@B:6!-?9- -M5KPR'X?LA'5-+B`D"`````<```#\(0``X*:$GTO/99;_BNS"MV=)M#'G!6G0 -M;(+8&0!]J9RKITQZ!US]1Y)[#7<;^J+(:FR;)JSXQFO9PV#`E]:D -MDC;82/K&X30UC_XIHW7\9QQR9K[WZ&C3R^`7DS"9I:%/.'/(X9XO>&%HFS&S -MT?>@C#O>2OQ8_M3$[=&+?0#`.P```#L`````@```$4``.B$ -MG0``0!$``,"H`0'`J`$"`?0!]`#4!KG@B:6!-?9-5KPR'X?LA'5-+B`D(``` -M``8```#,(0``L-`(:<&G5A'FE^KA`IQ;X:-0/X]M3$W@##_RW?-O)J[F0&:3 -ME;CVF#"JCMIVKACJ5J[]]M=U?YWC)FI]C+`0*)\WHOJGE]@U[Y10O(:@L@69 -MU@L@5Z:>8F5G;W);M9M??;>\H5P-7%2UOVV+/<=:Q -MNH[S<"[!P8"+G5@5K<2HU$%]2UXL"`(/%DDT\DOMU9ALIRHWPP03L"SP49,T8MY# -MBI_&/:1\3ZL&)NN^2R;FY8[4)O`N0XJ=E^;/V'E?!WS#\;U8D8UM2SD?DM-X -M''3Q/+LLOPBE7#%A_V[C,/6Z8>@1$=\Y,^$#1"N%),7\J(0<8K0/5FC?'8). -MI,U%(+FXH22IB&)+<408A;QB%!,^92JCW(,T*J53$[=&AST$`(P!``",`0`` -M`@```$4``8B$GP``0!$``,"H`0'`J`$"`?0!]`%T!UG@B:6!-?9-5KPR'X?L -MA'5-+B`D"`````@```%L(0`!4(5*2!;I=X-_N^V&=3>?R5\YJ/"0\,>\+XIZ -M)X'2.P#9NJXV#*2"GU!O\S+!]AI='[WA((=:+E";:B -M[P1GKM^FI%AO&C'F@>H!3=EB1,E(8M&_QC!!N\EO@))I=EX.*PI_`H"\U085 -M\YC8.O[9M#6!23V+SG.!\@]U]EM&>MUU%F/H$GQ5W,EWXJO0&B;)/#2OO8A& -M0EZIVZZY#>HJ&[6_KM2T:AKTOQI$<#VJ5+4QP9G&?C?)YRN_@(4UK\=WNO&P -M'@+71OF#V)*CL7+A2S+9,LVS/0GH%[Y'ZQ.T[373#\DNB.U74Q.W1D%Q!`!< -M`0``7`$```(```!%``%8A*```$`1``#`J`$!P*@!`@'T`?0!1`TQN-)ZH -MT=)+<8_R,'2Z('72,0(+OI -M,3?0(4[:494GFS'//.+6+/G/C!?)XHS(#_OV,FBI)-@B$JA[?>W+Y]Y*`*E1 -M,5_G0D":]9O&IW>8U2><*SJY%M@D`GYP6TG-1<.E\B0=>4RM/I7C\M=O`_0O -M^=+P5Q8L)L$`/.RLSTP?#RG':;KE\6VF3)S%)N=>.MHS(_V*S]9M6])]RY0% -M=5!H!*[KU;RV>CX>Z60`BQL>;9C&'4"WZJ:JZ\E.GU$:)+X4>Z@H)*QI80NE -ML1M\36G6I->Y$TL&\(;?&J"DSHC%MR`;OOM>BA>^@;^09?7-*[0L)E,3MT9` -MF`0`?````'P````"````10``>(2A``!`$0``P*@!`<"H`0(!]`'T`&0&2;G* -MVZ.-<:0]#_.X#K$=WJ\N("4(`````````%PJ``!`_1%,_4KL9P=T%KRX@)2``````````3````##^")B!3`MTC"W/2932GVC5H%8A[:9&FCE3$[=&E,`$`&P```!L`````@```$4` -M`&B$I```0!$``,"H`0'`J`$"`?0!]`!4!CFYRMNCC7&D/0_SN`ZQ'=ZO+B`E -M(`````$```!,````,#'FNS2H_3+:SK_;#*\KQ\2R=)I@<']')I][:=X,"E*7 -M.^?FO+?!D*PTKA374Q.W1E[D!0"8`0``F`$```(```!%``&4A-X``$`1``#` -MJ`$!P*@!`@'T`?0!@`=E5=XOG8,`3-H``````````"$@(@@````````!>"(` -M`'@```!T`0$`#`/\``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``288R*T==I$], -MYW2CT<^>PO-$F:EK#W74K'1D`6MK>KU`Z*:]X.ID+A8L4-C]H?8HQ;X`X3?9 -MXY@O@R4QJ1R3^YP\$(FF=H:VLH9N4$_8KLQ,[@Z04D_\*@G.5?]R&?[/6'20 -M>:*_P]Q^5H^$?7^&X'IOY[_+0XM3PU0JV4I```D\%P.FD)EE]EI*F-2 -M#VOV")1ZI5%]C#]2P3.PT?&CQE0I```<``!`!&+YM.\I509E)!?\[(>@*U#; -M?W-F````'```0`7@R4I5#Z+VSCNVHR$B.:'0>M9K`%,3MT:7\P4`7````%P` -M```"````10``6(3?``!`$0``P*@!`<"H`0(!]`'T`$0&*57>+YV#`$S:```` -M```````I("(@`````````#P````@``!`!@````J!&0YB44-G$1&)P>(LXS<& -MKJ,7/E,3MT;<`@8`N`$``+@!```"````10`!M(3@``!`$0``P*@!`<"H`0(! -M]`'T`:`'A57>+YV#`$S:```````````I("((`````````9@A```@``!`!@`` -M``J!&0YB44-G$1&)P>(LXS<&KJ,7/B(``'@```!T`0$`#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``288R*T==I$],YW2CT<^>PO-$F:EK#W74K'1D`6MK -M>KU`Z*:]X.ID+A8L4-C]H?8HQ;X`X3?9XY@O@R4QJ1R3^YP\$(FF=H:VLH9N -M4$_8KLQ,[@Z04D_\*@G.5?]R&?[/6'20>:*_P]Q^5H^$?7^&X'IOY[_+0XM3 -MPU0JV4I```D\%P.FD)EE]EI*F-2#VOV")1ZI5%]C#]2P3.PT?&CQE0I -M```<``!`!&+YM.\I509E)!?\[(>@*U#;?W-F````'```0`7@R4I5#Z+VSCNV -MHR$B.:'0>M9K`%,3MT9J)P8`4`$``%`!```"````10`!3(3A``!`$0``P*@! -M`<"H`0(!]`'T`3@''57>+YV#`$S:7@3U"^M8E_8A("(@`````````3`B```P -M````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H -M``"(``(``!_0S:\E@C9=.R!>4*[J-B2]&&ATYE,F?N'5+N=\:]QO%9;?F5^F -M1"7$X2,[?5VXL`KO;-#_+0T%9J/!+'9$/<(0G-_((NL'F_1@V/H3AFMJ8Z*% -MY(&38CU#S3>2GQ4R036""X-0*#%HY%W$Z=>U9(!("S&FOG6'L:?1Q$XD^E)F -M*0``)%+-/(X3TCPS\'L,PQ'HC@5I(D&(QV$#2'`QN$GIPU]M@GIUP)%3_O#RMR\=_0(B7H<5Z' -M7-C&=5DB,.0X>-03A\$Z\[5;[()I%!2M-^*DW"P=/BKJILES/`W44 -M09PC(T;6,D,V\T+:`WJP)Y`2EXK_38(!<%7?%>@'OX8?)F'X*`K+H`PH=^ -M9DB\B"Y=M\O)B%GY&PF>,5,3MT81;P8`O````+P````"````10``N(3D``!` -M$0``P*@!`<"H`0(!]`'T`*0&B57>+YV#`$S:7@3U"^M8E_8N(",@`````0`` -M`)PD``"`<\I_-,A"V$34L'CWR3(AT<$E$]:U+HJ*-_9XXY[KD?9R]^ONI3XI -MV522+^,,#+'$!/JTSZB\U,U-%;!I3:^=VE)TPENKI;W(QO;_"E7_%=,^459( -M:.^ICKOC=V)]EB[CN#0#@9@T"KU5]RKQ&[UJ#3,N]-3PMC]I4JR32E,3MT:2 -MC@8`'`$``!P!```"````10`!&(3F``!`$0``P*@!`<"H`0(!]`'T`00'Z57> -M+YV#`$S:7@3U"^M8E_8N("0(`````@```/PA``#@A0I?FV"(S1B&>8W4@.'\.W//:DV^%V1H"@K>.C*V&!UV9-8YL2P -M(3H"[F'/R>QZ;"AT_!]]V2`W[ZUN#.SW_;#Q%9&:)$]KQ&E>9]RD1$_\JHQK -M]:U33(&7P1^(NV"A7=/HC%5*Z-$EKDIPP>H3ZYI-'8_:O$>=_/O;%.:FT(W! -M&_;!`\`HQP%A?]_]RM/";;`;];%^CA5H_]'=AS%8M_M#%\Y9=9\P^28]YD^M -MM2@Q.@*(-VE`<.W7\S5C^.>4S?QMQL(!OE,3MT:/F@8`_````/P````"```` -M10``^(3G``!`$0``P*@!`<"H`0(!]`'T`.0&R57>+YV#`$S:7@3U"^M8E_8N -M("0(`````P```-PA``#`DI('#01M"]";UZI734@D0N=ZGM*I%_;D4"1O-$B9 -M3NH0Y`UZ]AR^&U$)GE[S&/%%R_7@N<\D<3-(%W"RA9Z]1'@9/C\Y\K0OD/@Q -MZRCFL>)CBJS/UY,N:"FD]J`:*#Z#GS;AUIQB`M91LZ"=W"BI,S)VC5.6X_R3 -M9,,SO`,0R?;.4^^[WH6MK9/+IE-#7+.&]A9"\NP+BOQ[&ZZ!*,/-0#0;NDXE -MDOP][;E-=K,K,*<8CR`,(H,&`*DM"^53$[=&%:8&`&P```!L`````@```$4` -M`&B$Z```0!$``,"H`0'`J`$"`?0!]`!4!CE5WB^=@P!,VEX$]0OK6)?V+B`D -M(`````(```!,*0``,/=`%=#\,#\L7?!&NQN\1:LL&/`A!4VZDXD'/&RJ]^O2 -M)="D"?!/4+ZUB7]BX@)"`````#````3"D` -M`#!R^#""&8AX>;KP)B-WV!\")=;Q.^I51K=+!KN>N\QR9$46T>4+YV#`$S:7@3U"^M8E_8N("0(````!````1PA``$`OZK"&-.S^<)` -M2XM)I+/3^T`;=*-#!9=PHQH0*,I*7::O\I.=;ET&/+YY'JU`YLUMP^K]SZV0 -ME_#\HJA_,,W)!3(6#K5-N$20#[*)-HENI+EWICKPK+[78>H\C?@80GSM+CH6 -MG)6=A^Y=P6XOW@\T8/E`JWNL![2&-T5YJ7(+KB,RT70Z`.P/AAZXQ-$4@&A= -M4VSCF"++%8*'? -M<)9@=T-;OY@"48#B:>KIDJ_H4Q.W1B'I!@`<`0``'`$```(```!%``$8A.L` -M`$`1``#`J`$!P*@!`@'T`?0!!`?I5=XOG8,`3-I>!/4+ZUB7]BX@)`@````% -M````_"$``.`5?K+-5U)!@]+\*/'528LD"D&".6+Y\TT/0[%R775ZIB><>GBI -M!-3TFL.:'E]B6%+K=>(\]C3M3XWQ'A8VN5/"=G\0D`UOL0M#^Y0,3"UBQ4$N -M1K5U':A+S)3K:;BUR!S7\_!KO$@6)-G4R\'0_T/F6<%:!!P+%6%W&+A=[[)Z -M[P@14Q.W1KSX!@#L````[`````(```!%``#HA.P``$`1``#`J`$!P*@!`@'T -M`?0`U`:Y5=XOG8,`3-I>!/4+ZUB7]BX@)"`````$````S"$``+!6%,E7DA&1 -M#=#TE"4Z9%5K`@UO,?5O"]KW3>$G`!P$K1N$D0=Q)5J%0HF&ZFGCR$81&IMN:7@W.5:Y"AIX8?VHI!/4+ -MZUB7]BX@)"`````%````S"$``+`]^D5W_3;<'9OVJWVFR64:V.^]#;S)E\]M -M9NT&S'OZB"J4%.[_SE^U*&"`BX/SVAC\4A]01_J>$$B=C":*(8T*WSHJG]R4 -M5-`JTB7/P5.S-%ZG'6K&>"E:DP>I`XQP,.'*-`DM2V+I#L^A!E)(,G"T+SBYCY9ASN>57E:U53*T,^V4>!'D<=34;!$ -MU.]&R@,_K08).AD[4Q.W1H8Y!P`\`0``/`$```(```!%``$XA.\``$`1``#` -MJ`$!P*@!`@'T`?0!)`<)5=XOG8,`3-I>!/4+ZUB7]BX@)`@````&```!'"$` -M`0`WXGO"]T;O)N636JH!T]#F=:]1V'QA*D^1RO4W,6#8$6F&,@0A=P76=?X!S8U -M7!Q:.;F;E%\/&>_V!O![G-N5!4U-ZR=*'\_\WQOW9QKW+4P7><]QH/8?2FEW -MLCK]R=CP7#IY7Y%>.F,3_S$E'X5:?JNJ69MD_]OV<8=U>Z4>#(DI`!S[A":3 -M%9$V8!*YMFPCB],&_ZPHG;73%B/YX`M!#?77$.MNNFV;U[YYNB)6Y_^#9(W&.V[4"'54< -M467T<(?OWH_`L5G:VA]3$[=&858'`.P```#L`````@```$4``.B$\0``0!$` -M`,"H`0'`J`$"`?0!]`#4!KE5WB^=@P!,VEX$]0OK6)?V+B`D(`````8```#, -M(0``L&5J4,_Q@&H.R8I#,22<=DE3 -M=(R5S)P>=WDN1A0F3@)G)PQ[0=&]";[7\Q"+3*+=+5$\;6$#ME0?)HB5B.IX -M,7NY;IZ!EN(+W[Y=8O-M-784^D'4EM8-D1:/ZS3'MJ<"15`'^(0F+OUX,!-UNY6[,,)A+ -M9>,"3BR=HCW4P%/Y98"7/.!B*;T[+;_1-=I[U4;>V.Y%SX^;CNYUD>/#(!L) -M]:$:;*1)R=]VDO7I,/>T\D:?0NXN+J^91Q=Q3G2_T2Q!;U(*A?L9%GI[9@`# -M#\=+Y4J,VG5@5P>S-@'])^7D@J2%/,7`=J``+S:#`G'`PW!_U5"0"D>CN@-KXLL_/J8-\>A\!L<_@>GL7Z -MQ4=9]:\@Z9.J:)O;KB.OO^#8@FG/7Y0@\;":&NG:O24*MX:YMN_T=MF'21D&(( -MM2.>B89_':UVW#=1FF/]*V.;=3/IZ+G,1%1XPISWVZ?M.A7?,P/:#HKB!6NP -M\I=R<&_>:Z-,!BT$(4YQI/T?$A-`0AZ+:=4BULUG4Q.W1K/4!P!<`0``7`$` -M``(```!%``%8A/4``$`1``#`J`$!P*@!`@'T`?0!1`!/4+ -MZUB7]BX@)"`````(```!/"$``2!"A^V[[>)AM6`$^PD@'C:)\7WBLMZB4^?H -M@)K<'8"2*GX@R"$?!)NW$E+M0C:9OW_&-B,V+=1[!Z5OJ$7W/36B!8O4Y$=: -M3L#$!YP4!Q=5!U9[Z`/8X#%3&.8?&:2XELX;K+1%M*Y(5?7@0?.,7[T%IK;6 -M[F#*L2_EE,3MT8^_`<`?``` -M`'P````"````10``>(3V``!`$0``P*@!`<"H`0(!]`'T`&0&28WO(75U9]WI -MP#0ICL'L4:\A -M=75GW>G`-"F.P>Q1IRX@)2``````````3````#"OJ*Y]T\F#J?-2.EZI>U5' -M$W8*G:NOF8_WXVJ[*^'_Z,'W7@#ILG$=QUI;H%,3MT8D%P@`;````&P````" -M````10``:(3X``!`$0``P*@!`<"H`0(!]`'T`%0&.8WO(75U9]WIP#0ICL'L -M4:Z<":U=E(>-66U4ZL_&$=T-PCRETVW=-3$[=&8"0(`&P```!L`````@```$4``&B$^0`` -M0!$``,"H`0'`J`$"`?0!]`!4!CF-[R%U=6?=Z<`T*8[![%&G+B`E(`````$` -M``!,````,'J9=O)XRN5QR-Z@F,;N+G#4!G[W1T7L&3"?#`(XE,_ULECU%$%V -M3PBT+Z$44Q.W1FH>"0"8`0``F`$```(```!%``&4A/T``$`1``#`J`$!P*@! -M`@'T`?0!@`=E\4$]F5`$Q`D``````````"$@(@@````````!>"(``'@```!T -M`0$`#`/]``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``%)V&5+H[ID76>A3Q-HR8 -MV8Z4`_!VBQOY`OXQ(_$JKC'PBU*FRK>8, -M'$2";R`/TTFQOEKLGX,/08\M+K'&E%5A&.T52!E).ST9[&];9<*2<9/O+HI7 -M*'QM=SG;U@Z^`%0&1$OD^\IM\,UR2H(I```DTW7B2[6M@G9R2$=ES!=2[V17 -M5*"3.0EPTUW0&S4WM>XI```<``!`!*Q^0"EV"-2^SZ.&(J:(]]-P"6;_```` -M'```0`50_.*4G#M&CFZ?OA74`=&\+*C3\U,3MT8&+@D`7````%P````"```` -M10``6(3^``!`$0``P*@!`<"H`0(!]`'T`$0&*?%!/9E0!,0)```````````I -M("(@`````````#P````@``!`!@````JE2,ZLVU-C>:KO(Y*NE,@_5>EN]E,3 -MMT;_0@D`N`$``+@!```"````10`!M(4#``!`$0``P*@!`<"H`0(!]`'T`:`' -MA?%!/9E0!,0)```````````I("((`````````9@A```@``!`!@````JE2,ZL -MVU-C>:KO(Y*NE,@_5>EN]B(``'@```!T`0$`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``%)V&5+H[ID76>A3Q-HR8V8Z4`_!VBQOY`OXQ(_$JKC'PBU*FRK>8,'$2";R`/TTFQOEKLGX,/08\M+K'& -ME%5A&.T52!E).ST9[&];9<*2<9/O+HI7*'QM=SG;U@Z^`%0&1$OD^\IM\,UR -M2H(I```DTW7B2[6M@G9R2$=ES!=2[V175*"3.0EPTUW0&S4WM>XI```<``!` -M!*Q^0"EV"-2^SZ.&(J:(]]-P"6;_````'```0`50_.*4G#M&CFZ?OA74`=&\ -M+*C3\U,3MT9.9PD`4`$``%`!```"````10`!3(4$``!`$0``P*@!`<"H`0(! -M]`'T`3@''?%!/9E0!,0)6(6HST?Y)^4A("(@`````````3`B```P````+`$! -M``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(` -M`$C.8BFN5)W4&!Z*3%N;[E&,= -M1F]KW$R]E-W_2ZHDU<#!LL_W+;7&\/9PB7]@<`KE761Q&F4O -MJ:I`%UUT`T&^(@-'G?[R_-R(20^:J:WL:QL'(;?U3P]%QHT^25TC*0``)(?$ -M##/-%47$Y*4Z8`9%JE5]^08TZ:S[(12S$7\\RM1[*0``'```0`3F9OV1[@)P -MG?>8+;*D'6R-_Y.*%````!P``$`%+6HCQ8K-X#\E5=C91P]<;=@XMDI3$[=& -M>I4)``P!```,`0```@```$4``0B%!0``0!$``,"H`0'`J`$"`?0!]`#T!]GQ -M03V94`3$"5B%J,]'^2?E+B`C"`````$```#L(P``T'P@B6:(5M+R-P-;"&#N -MRY(6U.*NT5+L>6IT"IM``*#M]Z[+/+`9/D13YZ174K350/>V/!='[]G>&/'# -M,[F_H305ZI@:C8:6:>O2R0!Z:>"B@,H^I:FD9;[8B&T%%FF=(,RG0Y+P\-!P -M7R40*5$^N$D=[8XQ2XF3F"!OZE:$/HZ)YJGYG6WC8I0[/Y&C`_4/`D'1/ -MRMNC)[*+<%(`Y'+2'B/[IL:8Z=TWH6U#_(-R`/Q_^+[A99\!I2_G>!!R'E>O -MV'?FB&?7_B^SL5,3MT8]K@D`O````+P````"````10``N(4&``!`$0``P*@! -M`<"H`0(!]`'T`*0&B?%!/9E0!,0)6(6HST?Y)^4N(",@`````0```)PD``"` -MQN`Y_5.Z!&D!-VPLIV1V2_(4A9TZNGV6(HR26*?=NKF(/):9!`O9IKG+EE)(ZLIV*-4['A^%U:_49Z&;J2`9TOFRL[]-(&) -MP^ZR:5ZZ:%!9\9)S_+FV$P>WA"2)%-70T^'';:^^MCHW;,B,+$8&#:(/3SB1 -M/,!Y:X>GTJAJ>[]'#9+#3A33'S/G-4<[;'Y<%ZR6YH)@*P&'CXL+6*M -M=6T(WR.ZZB#=%#RT996BN7K:7,;4.%@P'!R+*R_!F-&'^3;B;L>5K--GP0K; -M\B;;C71L3ZF,6Q&>+9VXM=H,2X3A'EA#VT$8]7WC+-Z\K]\SSKOR$(U7+\^' -M!6);/_0N6D]B=G>".^LL6_'>,5,3MT9;V`D`_````/P````"````10``^(4( -M``!`$0``P*@!`<"H`0(!]`'T`.0&R?%!/9E0!,0)6(6HST?Y)^4N("0(```` -M`P```-PA``#`=2^E\.6\1X9.!3D;Y;/(*E+5;H?^_!@@?0:ES4M-P./PC\(E -M-'BA2=9Y7I#6>;;:2=&S;;,>%957#9..APM@FXA&0]GI1,"GW-DGA"7X0Z]A -M%=A`P0L_R)NI\4!V6!$6F#13,Q\4E:"-O::HU"#`5F3JJ3KBM^%18[ZXD/UU -MD-B@#8/GAS7IE;[9KOF86,T!]/*VBJET8C,IZ(:M(VW3?Z_!=I('%^R+P/?23@7\4#[6[53&/[H!;4;H96AS\_PX;E,3MT9@ -M&@H`/`$``#P!```"````10`!.(4+``!`$0``P*@!`<"H`0(!]`'T`20'"?%! -M/9E0!,0)6(6HST?Y)^4N("0(````!````1PA``$`\&A1:%,X8#&R[/OU?%>5 -MVBH.21L+P8V<9"#M?&-MCI&I[A!:]T[K_^]KE)DFM)A4#JE;',/%0@H4R]&2 -M.X88'T3=,UFP+N_-S_QIY-G?-V07< -MCHO/H\-IU8!(AUU[(S^>5K?T)-"-9H*WD?L:#1.=P2/S!\31$V.^V13/2C21 -M?33I"X+/&1[EIW<@@6>LD`;?G0W:Q4,S;DL(=?_A=?9A=YS7[3M9-)*1L;LU -MCR:+0/*4`3E+Q7<$UCN*S3/LZ_Z0B@+(#O4PD*2:0:89\`DDH0!#38(GU#F' -MXDT=#]G"<[71$M@04Q.W1@0F"@`<`0``'`$```(```!%``$8A0P``$`1``#` -MJ`$!P*@!`@'T`?0!!`?I\4$]F5`$Q`E8A:C/1_DGY2X@)`@````%````_"$` -M`.#$*A'E:S6"K\_4C!H0)1NK[6[)"63%-9H]>2B[MU+IK`LUUYA9[,/CPZC1 -MBN'.@?3Z-?FXXW*<7S3HFW;(-=+GCE0^W1P:%(&`[E)-(D.9$ZIU[U`>[-KC -MD@LJ&=N+HHPP)I:TD];9.+F`]KV0.;!Z(K=P;"F"8Y&+-D'#U==8J&Y%>S\M -MOC,[BL<4P-ZE)QVV<5!PZ+YD0NS&\$80"EA94-I8B"9$,6D>,%40M1YS+[#A77BLNY6XQND[/P0\R0;+?%;\F0N9*O1ZZC;IAF1.&P2V9@4FV+3+UY -M\6BCIF5TV58_%M#F0R"--[,D+@7X027S0C@9_.T4@YB182=*.,51.391]H^4 -MQ1N(17+"'/3T,UT!`$AEE->?A:6K1RO::<)Z!8!QV0>7#3/"M".H4;W9BB/6 -M(J1*J90#!7`\9*17@?S-<=6;Z*.UPH``4Q.W1LA9"@#L````[`````(```!% -M``#HA1```$`1``#`J`$!P*@!`@'T`?0`U`:Y\4$]F5`$Q`E8A:C/1_DGY2X@ -M)"`````%````S"$``+!LFN)4;+S3#`Z1Q8\7-3(=)Z5XWY_0ZC8PK(/REB`! -ML\Q/S`7!R_R90U!"(2`5RCK6&HA;W_SF*"FPD;>2Z- -M\9#L@MS?4Q.W1E%V"@`\`0``/`$```(```!%``$XA1$``$`1``#`J`$!P*@! -M`@'T`?0!)`<)\4$]F5`$Q`E8A:C/1_DGY2X@)`@````&```!'"$``0"-,H\P -M68_$0^!EI#ZQ@1!%TSUMIMV\LP$=@;U,=]GDY[T\X!/ -M>6/4[3-*[P!"$>U45%]CYP)8%@7.@%$')I[.,.KK_S=Y&%2"44J%9,+K!YN. -MG@%[IA@YFFAP@'\^KL=L'Z\(WJ`^8,B@7R2C?9%#Q+M(D-"KKHQ-3[_A\Z;$ -M#Y?(,7BEFQ`H!>)H*!(N(@8C9JR2`9FJU!/;ZGCF7+QT@;GDZN:J1">T6'-3 -M`MK$])'KD&1F4JR@.G%J']VB,YT`KJO&Q;B#;MJJGV,;3H%]M@;S[JM'`!^T -M:,2!5"-GZC -M!8>)A2HN_;_:)X1 -M!>GA76JP['(3H>#$C911_D%/WB&[JI!D+T\X3-N16X0^UER5S34%,,'F$J -MAZQDX+?4=/!3$[=&8Y$*`.P```#L`````@```$4``.B%$P``0!$``,"H`0'` -MJ`$"`?0!]`#4!KGQ03V94`3$"5B%J,]'^2?E+B`D(`````8```#,(0``L*0( -M\Q(G;-=WLK34R>P[L)O(^$U*YO(49R9U]-IVT0!AXQWBJ7X/=$0EUIY)7:+F -M&G;V[XJ4P436\.<+!P3D#`R-M0FW]U8%A"8>*3[=VLD^\S7;&[(N9KNWS0F. -MLU6<8HO:WO?AHO;B9EGB7&,B[TW:\@M]5I05I694&)1*@YEW##<1GOI944%$ -MR!=ZA-F]O3@"-K"\IY<7?LA&ST_"I=K;:CYFM8AN)T3,$-MIYMM9 -M[^$QP9"4""!G%?]-S6=+R;"U2P+"QU*N,,\GI\7-9,FZ'A/E!_83]L$$#T7) -M6,ZCS13U"8#Y1+,=T%VCSGA"!8?#J[\(K(^Z'=>-U3M -MB62()!Q7IFK(][VXV&R,.$Y3$[=&TMH*`(P!``",`0```@```$4``8B%%0`` -M0!$``,"H`0'`J`$"`?0!]`%T!UGQ03V94`3$"5B%J,]'^2?E+B`D"`````@` -M``%L(0`!4+!`6VU?9@H*D+_%&F073"LHVXE"R]*!G -MA6N&E>O%-[;ZU:Z+LI+:;4USQ!=9RUMH95LQ\+MGA]%L6X0:4)N)!IU@/0`^Q&9E+O2PZM_'#J/C'X#4,"1`XM4@9SB`Q)Q)&-?YY).VK2C^.9!;M -M]R+KZUF06M6YP2'2_K4E?APNXR[^O>0C2*L[& -M\A+PH&BAH7`D-5B88#E`XA!>12;0G="J^W_TZF:F\.5*.X41*F>&$`VT.KY0 -M8GA.2MMS9<'`BD(8W-04S$8>[3D[ -M7'C2BU!'@HBIG-!KGC/$A5SEB;$(J6M!4Q.W1MP/"P!<`0``7`$```(```!% -M``%8A18``$`1``#`J`$!P*@!`@'T`?0!1`I7AD$'DKAFO+_R/?M9!3$S>4$IH -MCHA.Z7$9VH?IW%.M14M_XF:SW]IW/%$^2#U4'?J509)P]S? -MU"=QN;?^CYRCP%WNN++@$2B0A/138OODF]<2Q,8[@EAOSFE6H*CNB8<(HB$4 -M]3%MQX'R&E`1`WR0F"]U/Q-!#!A<,&NDL!-A?54L=Z/E\'B&%I@F,-HXS'"OP%AKCD80<'L]5WX$L'<7DO0FG+/OXBJV'9T,"NH38 -MZ^)R,*^#:`KUWX).$5HVJDXM314Y_5ZY.GUE?0[HCJL:;2@6Y,I,,+4O-/8= -M)B!R$$!W:LJ/G]IS`N?-S_0)0J:2&'?B[>O+.5,3MT8S-PL`?````'P````" -M````10``>(47``!`$0``P*@!`<"H`0(!]`'T`&0&22S*Z&M[`&'"V\2M-8_L -M2[#-QRE -M*`L]WT8L_WW20\Q3$[=&UUX+`&P```!L`````@```$4``&B%&@``0!$``,"H -M`0'`J`$"`?0!]`!4!CDLRNAK>P!APMO$K36/['-)+B`E(`````$```!,```` -M,*A%XEJ5DQZ$.#Q4(95O?BR:(5,#:N=JK!I['+I]D\QD+*FMH!:KKLO"QJ;S -M4Q.W1HI:#`"8`0``F`$```(```!%``&4A1P``$`1``#`J`$!P*@!`@'T`?0! -M@`=E97O@[4\;W6H``````````"$@(@@````````!>"(``'@```!T`0$`#`/^ -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``2D4G@K]@=Q)U]KK/MT@>,M9:8(^4 -MJQB(!;0J0,@3+-4JITIUU_)[)8^6AJ=R[&;O_-I_D#>'>:R*1P>.=!,A.MTZ>NF -MX)4E0$D*BK)?D+I@0J_F'54I```D:`&?E%T[B9NVYC)[IG"`$M_TO\=+L;K, -MW@88=1QL"1TI```<``!`!,4;A:YLZ.(8&O[;"]I'`IWKR*(R````'```0`4K -MMZ[].>-E]\GM-X$)86M!4SFWCE,3MT9_:0P`7````%P````"````10``6(4= -M``!`$0``P*@!`<"H`0(!]`'T`$0&*65[X.U/&]UJ```````````I("(@```` -M`````#P````@``!`!@````K\+.)I@9$!$\I_%N"L0P` -MN`$``+@!```"````10`!M(4>``!`$0``P*@!`<"H`0(!]`'T`:`'A65[X.U/ -M&]UJ```````````I("((`````````9@A```@``!`!@````K\+.)I@9$!$\I_ -M%N"L,M9:8(^4JQB(!;0J0,@3+-4JITIUU_)[)8^6AJ= -MR[&;O_-I_D#>'>:R*1P>.=!,A.MTZ>NFX)4E0$D*BK)?D+I@0J_F'54I```D -M:`&?E%T[B9NVYC)[IG"`$M_TO\=+L;K,W@88=1QL"1TI```<``!`!,4;A:YL -MZ.(8&O[;"]I'`IWKR*(R````'```0`4KMZ[].>-E]\GM-X$)86M!4SFWCE,3 -MMT:YG0P`4`$``%`!```"````10`!3(4?``!`$0``P*@!`<"H`0(!]`'T`3@' -M'65[X.U/&]UJ+,$`75`V-M8A("(@`````````3`B```P````+`$!``0#```, -M`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``"-!*W>@ -M8;-(L%X*<<2`\D!B1E*VIC*?E)J($W!2,\5.KW,BG+=6.H)H9M1^&`\_KF.I -M-TM9V4`F`SC-U?3RV^JL.BFE59X@QP0]Z$ZP3_:E$G/*XXP*S3"0Z$S58O@M -M*OZ)6,)NP'"VEVW!L+H_:N89UV9-_=5]L?RV%P!XNB"/*0``)$[D&^%]/-/; -MB/&0%2?<0D@=@<]B8.B9L2,.'@#9=28'*0``'```0`10^VC`8F2V#"O#]O$X -M&20;T13%!0```!P``$`%9T'_+(BBJ[8>(HH&$+0?;P.I^DE3$[=&V,H,``P! -M```,`0```@```$4``0B%(```0!$``,"H`0'`J`$"`?0!]`#T!]EE>^#M3QO= -M:BS!`%U0-C;6+B`C"`````$```#L(P``T$+5%OA#U:;14-BP1D%B-V@O]X&2 -M_S^S63J6Z68O*J`6$CA($,&O,F,)IYA3SJ&_YRKWX%O_J9`)B9*5W2[9&"21 -MLP@IH2O/'QQ3]K@IP?;^P8#ODK7=GA$P%WY4< -MRFL\Q9G^J[A#)IMY-I!@PY+%_(WSO-.UG@Z5SXT%:]VH,` -M8&J(*E,3MT:[XPP`O````+P````"````10``N(4A``!`$0``P*@!`<"H`0(! -M]`'T`*0&B65[X.U/&]UJ+,$`75`V-M8N(",@`````0```)PD``"`HJW9BP%. -M(Q31Y;%".L`JN.>3$T/1>FZ`:_PEM$W*3*%;I*Z4$$"4(S9+ -M!7<<(?([<;G.#Q7$'"O_H)3.UI"/,^^"Q>$1&U,3MT;D`@T`'`$``!P!```" -M````10`!&(4B``!`$0``P*@!`<"H`0(!]`'T`00'Z65[X.U/&]UJ+,$`75`V -M-M8N("0(`````@```/PA``#@'.=L#<%P%"?P(N>:%Q]^-3%]&$^]S;*WNUG.]%L2X\@OI6=SI2N-V]XW/.57/\S`ZL#; -M^H]V(S*;[2UP&PK[S!9!7%]C)BLV\$%61`G@M\,@&^#M3QO=:BS!`%U0-C;6+B`D(`````(```!,*0`` -M,)(@/)`>FX>)]<%[=PD#GC"V'&?@D]X'O$9_C$`(J-P'4B=]1\ET(IWA6A54 -M4Q.W1OHU#0!L````;`````(```!%``!HA28``$`1``#`J`$!P*@!`@'T`?0` -M5`8Y97O@[4\;W6HLP0!=4#8VUBX@)"`````#````3"D``#!T\"C0S2MF>[#"2>E,3MT964`T`/`$` -M`#P!```"````10`!.(4G``!`$0``P*@!`<"H`0(!]`'T`20'"65[X.U/&]UJ -M+,$`75`V-M8N("0(````!````1PA``$`!CJ^)PZ`;+A\7(+BQ5AGXHL -MT>?>MW3GY50A&CFVF&^NU/?&9L]_(,4*^5;^0"ZY@6)DD"![(TP,B#%:[@I5 -MS$\FF+5;4Q.W1@Q>#0`<`0``'`$```(```!%``$8A2D``$`1``#`J`$!P*@! -M`@'T`?0!!`?I97O@[4\;W6HLP0!=4#8VUBX@)`@````%````_"$``."B(:*V -MV^12]:?]_;A>8GS"-L+8=TDJ^*;'TL,X5SVVAF>.XFS83*'C!FWJ-:K3\CF+ -M.0,T>+`"BMXGOKLP9#N^:0LTF[UNH[U#\ESX237F)51?P",[V[1;_T.QL`"O -MFEUC.+_+#@WW6PG$\QK8D$4)!+&J6U>TGT4-*R)28*B%&+\\J,@5ZVR!Z2NA -M@1#5,(K_"@-^3@)]#!15]S[B!ZKZ@6JHPUB?%V?+)(5FRF*>>L>0T(CK.7K# -MOET-=@WC.^I3ROGYX@%OXQM3.:3!=QW,I3T(?JNJ,IYI94=A4Q.W1N]L#0#L -M````[`````(```!%``#HA2H``$`1``#`J`$!P*@!`@'T`?0`U`:Y97O@[4\; -MW6HLP0!=4#8VUBX@)"`````$````S"$``+"[<VVD,Y5R)NUK -M51>REU;.ZV5F(";N=T9OCMU2T?[#X;]R5F#+O*28-\C`C7TK,FK:#$@NYBC_ -M<]E*Y#J'SC#D"@IKP%7R?Y37N>\,7[$.%H$2+7H(V5'@D=E1))+Y(^=Z(/DD -M1QL@HE%85`L[@Z$X)&KI!DL4+`";0@XKS^34]BZC4.,2=7^[%GCR\DFPL+"G -M_B[?U;^9ND`J*?-0H):U2"3J4Q.W1D2/#0#L````[`````(```!%``#HA2L` -M`$`1``#`J`$!P*@!`@'T`?0`U`:Y97O@[4\;W6HLP0!=4#8VUBX@)"`````% -M````S"$``+#4N!S%@@?S08D[$R!=>2EJFJ<6:2BZZJR1G.ZE_ -M*OPD3=>6*<:E56O[9_CR?;R/%7;D\"*U1AG5W[;41.(&<12MSI(B-R*<0])8 -MLF:JHY(8VZ;L"\N+)4#W'RSTV$[:6;*L)HZ4VG)^12^ZH3W[13.Q71!>X8HN -M4Q.W1L.L#0`\`0``/`$```(```!%``$XA2P``$`1``#`J`$!P*@!`@'T`?0! -M)`<)97O@[4\;W6HLP0!=4#8VUBX@)`@````&```!'"$``0"+X-.5Y6G(SO/< -M)M:46`DXV*!Z<36YV?E`F#C\:[. -M8?%?HR3`6C,>)4YU!_GZC]0@J3&.D;1M$B+^=5I8!+R -MR\_D276QN>;*C+B'E-=\G"T3D^+1?[X4&VC+DPPL[#9I3$[=&"[D-`!P!```<`0```@```$4``1B%+0`` -M0!$``,"H`0'`J`$"`?0!]`$$!^EE>^#M3QO=:BS!`%U0-C;6+B`D"`````<` -M``#\(0``X)>1ABP,>>I6SK;B(E04C'A_%0'IBM3M\0";<#0[4`?=/SPY!?JN -M&OU&1F>YZYAKY]X2U_23LWS;)=*KWUMD9DM11Y!7:YM40%K:5CWJIT#,&+G\ -M`I>2UXPP5Z*"XQKU=6%S9NC@"4!Y][I-6>8`E76(>*B$/(OOJ.34/$6)D+S'F"7ZE(G%,O5A,, -M!UB(I]:#5--6EJM"*[B[3]3)$B&U&ERM)$M`,&B`DDW)W>_ZYB>PD#76;F4J -M!1A3$[=&7,@-`.P```#L`````@```$4``.B%+@``0!$``,"H`0'`J`$"`?0! -M]`#4!KEE>^#M3QO=:BS!`%U0-C;6+B`D(`````8```#,(0``L&X9'DL..+C< -MBPA5A=T,1XZL<-0/WSUN15$<]Q!1SUYUJ&6G4^S>_RG>]EXV'&FNEMSVYU<: -MEK?V[1NU7(TG`'="3SL*TB*PW+1OY[G7L^K4$$>TL`-Y,@:'EA=NC)J]'=9I;@S]\F>Y29K?;J!G-BG2TQ)S -M_>5?J^>'Y##%P645KA104(-7)=XVE^:JWB!D(NE3$[=&:NH-`.P```#L```` -M`@```$4``.B%+P``0!$``,"H`0'`J`$"`?0!]`#4!KEE>^#M3QO=:BS!`%U0 -M-C;6+B`D(`````<```#,(0``L.C.G]1]G>0R*>1",/[EK<'7"MUTS$0\@0ZS -MW]%[4=)V)HX5YF-:>AFR&2687>+5VCN(Q_\@$;2JPR3L%-&V]:S&>01L%CV[ -M%`O1X`@J_Z_UH1*,Q8?FL7(`X_5K9'Z],5G7<&^C2!IWV5T:[AYI&1.W^DC' -M>FFH"VS_$^"1QJ/]5'=%7/C(+G\]`ND2 -M(@FP,(;M[.X]"AU3$[=&-Q$.`(P!``",`0```@```$4``8B%,```0!$``,"H -M`0'`J`$"`?0!]`%T!UEE>^#M3QO=:BS!`%U0-C;6+B`D"`````@```%L(0`! -M4*7R/&6\44J=*4O#&W3QUDEK/)^T.,[:MKSC -M?E4U\<,^@GR.<`&&A1:*_Z.M@!O.Y]*-)<&XBV.W"#K:$^27@Y_TP%J%U,7"J4^QN!]6@,&8^G9172IG[C:UL1+\\6 -M:O0;\1H"\6>%IC@?=6%A+F^MK4\KAQ,+E^&)!\'Q.X0O+TDQI!8KH.8\/F3J -MJAAU,)X85G1?)UK`=V6[FC[?^)%$KG@&#SQ.@I/.WVV?'`/1K)L+L1Y"DONH -M+6U5+A3)W9Z?'U,;!F'"V=Y81;YY"'6$9Z=N$;SNOI=I,EQM#$(USC+UD.>] -M6`\XI=66`D"U2RAR\XA2):&L4Q.W1O)'#@!<`0``7`$```(```!%``%8A3$` -M`$`1``#`J`$!P*@!`@'T`?0!1`,5[U6G1PQ/5ROA!3R>XVU7[Z#;6PM#BJS\Q&`HNM>\8H7L[ -M3.\/ES\7E^7"?P9"I!X\XY-/!0V1\#(=TN!V):G3P?[`D=X%<@B46$)N'!W@ -M:*2'.X=H,Y9F1C^7XKY8>*$4];\RL,5V[.==,J([WQ8`B;O7JS"^(4R``!`$0``P*@!`<"H`0(!]`'T`&0&27>I7\4$&*F4\&9EXE-Z"HXN("4( -M`````````%PJ``!`:Z(-#X$WGK?.5WG9O2HM`&[@48B(!*639\32-OOGB9FI -M_+/V_UA4!DN)R'/5A?Q3Q?'%9!1D'@4N^]CI4Q.W1@-[#@!L````;`````(` -M``!%``!HA3,``$`1``#`J`$!P*@!`@'T`?0`5`8Y=ZE?Q008J93P9F7B4WH* -MCBX@)2``````````3````#"@D(2O/#R`;3Z(/]]JII#]P4R*@5G(H6+-$<27 -M_E7=G=ESNF*3AWQ&&>2@UE,3MT:DB0X`;````&P````"````10``:(4T``!` -M$0``P*@!`<"H`0(!]`'T`%0&.7>I7\4$&*F4\&9EXE-Z"HXN("4(`````0`` -M`$PJ```PH0'J*-?9L:+JAXO(?../[A&T!?R)3>@J.+B`E(`````$```!,````,"U2.V)> -M,T"Y`4%!&.>=W_869/\I%52AHRV@F'+"\0!N(&^E<@@L$)2L-:"(``'@```!T`0$`#`/_``P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``H_IR"JUGK_-UKJ673H=P&5F[C].VP -M,LM="4YOMV4Z<1HE(_O^##1I"U1/FK7Z:HK-J+>.-A -M_L9F":*HU:H&\>XG[EPRDCKS$C$4A-HR$7Y1;50/`]=XZ?9*W/Y%'1CXNTF3 -M$4\4?S+Y!RS2O8\I%03MT:3;P``N`$``+@! -M```"````10`!M(4Z``!`$0``P*@!`<"H`0(!]`'T`:`'A0=8M@YIV/D^```` -M```````I("((`````````9@A```@``!`!@````KI*_QX.=N6/2IC`W\\3>RS -M2O8\I"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``H_IR -M"JUGK_-UKJ673H=P&5F[C].VP,LM="4YOMV4Z<1HE(_O^##1I"U1/ -MFK7Z:HK-J+>.-A_L9F":*HU:H&\>XG[EPRDCKS$C$4 -MA-HR$7Y1;50/`]=XZ?9*W/Y%'1CXNTF3$4\4?S+Y!NYN)]-:'X#;:I_,,3*+E0:1QM>K[H/4M(PBRQ`M.#6?L -MEB-HKQ_<%#W\#.]XNWOU;'G&\HUI^^_&P@40*0``)/.F4^^U9.`%"&IQ_C!A -MZ?M0(`E5U,!.+*DXKPT+/1J1*0``'```0`2[GPT*JR95@W.R$3G)'BH&1?WK -MP0```!P``$`%EWP7U<2X-8"GH&_+$ODUV2\9);54$[=&M<(```P!```,`0`` -M`@```$4``0B%/```0!$``,"H`0'`J`$"`?0!]`#T!]D'6+8.:=CY/O8/B.8B -M?,7R69/&WH23ETES3)+9>X(F,1*TB8W,LXA;S%/R8>]>')RN&M;4"K*N6H" -MTQZN0+0Y24V(M+]#(L&E':,C:X8FJ&(Y,>'.N*#B: -M1/.N1I,5:Y&HF$Z$A&\V_AL]7DUW"X?<^I5=M-MC'*CL75]3JW/JAVA>T6I? -MY3GP&=B2EQR8WE?-$K[L_H')X)P`"'%Z-[=:!1G'E""=JX.W<3L)0]G)LE03 -MMT:\VP``O````+P````"````10``N(4]``!`$0``P*@!`<"H`0(!]`'T`*0& -MB0=8M@YIV/D^]@^(YB)R&O,N(",@`````0```)PD``"`W>K2WRP6#&SA- -MD[&O7&DQ6*]?_YX3K`51&`^J==PQK^0LK,;39%B:I$CJW1O:02AET_(CV$TM -M1TJ]=#6M".#W$][H47[F&RC.F4M_;'R2(IKE$C>EM#(]^$NP62;*YS5M6[.@ -MANRZL8=<>Y#"]R3WA3PU;/EQ>W_!\%03MT8/^@``'`$``!P!```"````10`! -M&(4^``!`$0``P*@!`<"H`0(!]`'T`00'Z0=8M@YIV/D^]@^(YB)R&O,N("0( -M`````@```/PA``#@QY=23`1R@-B!^@MEVOQ[6\_D'B9K,5MAEE/OO9"'SHL, -MZ/6>%4AS%U_OS!Z@&P0.1@=\K1462C(`KC1>91.F(#G!3,#C?'Y%@(LG&`;\ -MV,75T1$4WYADPS:XL6<.ZJ%RJ4?`584'8H>OXZKJ+:^'N)L$FSQ -MB@F^UKI0/L-+J$O`OND,H@)5>_E@R+?W#;%@L:.;6?\G,'ZRPH$F1]+*DAX5 -MB;->>((LW%03MT9#!@$`_````/P````"````10``^(4_``!`$0``P*@!`<"H -M`0(!]`'T`.0&R0=8M@YIV/D^]@^(YB)R&O,N("0(`````P```-PA``#`(`.& -MO[?M^O?/R3ZQW_YL^\6ADE -M/8#2NUK/9-!'S$[')_@I,5T*DDA($=\>.11I2E'V6N4X'6MC_FF-Q)`$P\BP -M,MJ96QT-W/:E@?-[?A@;3:1.&"-8QD -MX9>+YR/A]8B>9WI"Y]&6962KX=Q1&5)T5)+"!B!`A\O1"1'G,+O@"M2=CL'C -MY#'(:S]4$[=&!1$!`&P```!L`````@```$4``&B%0```0!$``,"H`0'`J`$" -M`?0!]`!4!CD'6+8.:=CY/O8/B.8B<+3EW.!)W@AY_$.IIL7<_I5!.W1D(M -M`0!L````;`````(```!%``!HA4$``$`1``#`J`$!P*@!`@'T`?0`5`8Y!UBV -M#FG8^3[V#XCF(G(:\RX@)"`````#````3"D``##3PW;'6J-K9N%G91!#PNF4 -MP[&E&."%159!KYXGW?>,1/$+ET.HT?DV5SSOD`Y.-&2XU]>R;^ZCPVM/VMP1G&[JDW7WFN/VI$&[Q/SOHT-^*4A,"9]&TT#\" -MB6VE+NX'/+X) -M&?=1Z!ZN$/MR)\$4`ON[KDP#8M-SX0B$!E>\ZN.G>E[C(WTCHN9X/(BLOBY) -MOPD=A613/',UX/I9!SH*)"(U0Z.FO>QS39+E8U;_HO_G<54, -M`NZH,><2KP07F41M-5_ME[5*?C_+0HK8PQ;37,FKQO_OYV[4+B9#@XIA+0B[ -MHU$(!?=-L[?-(75NI#L4:Z16$YH;1CS/T%8Q)`:N;.695!.W1FN'`0#L````[`````(```!%``#HA44``$`1``#` -MJ`$!P*@!`@'T`?0`U`:Y!UBV#FG8^3[V#XCF(G(:\RX@)"`````%````S"$` -M`+#2OQ>QGP"._^H.K\6I.5S65?411;LHFFOZK\'5O-BKQELCP0N:4X)R7#FP -MOOAK`WA+CQ^`?;89J#Z<$\UKO;$"I],M@_U!MS!>\DB7OEN[5$'\O(CO9"^= -M=]%C&6_IQ'*2Y,AJ]=,%Z52Y0W4#<975L(QI+H"X)%W]8YQ6VB'$_PW&6$]P/OD8RZ?W#L(QDQ,+JU3$6*LNS!KKMOOYV(6(9.28F$D:>M -M00@,Z[!&.OU&$T2U6S/[QC>BK&'!U>KVB:B[W0CJQHAF3#6XSR9%DBL\IP[1 -M5AO:*U`:M7)GB9U4$[=&\J\!`!P!```<`0```@```$4``1B%1P``0!$``,"H -M`0'`J`$"`?0!]`$$!^D'6+8.:=CY/O8/B.8B -M_*`Z4+H]+,Z_A'#S-BNY2=,,&\J#N6-8KXN(;LH=+;F6E$T4[_\?E?%4$[=& -MJ;\!`.P```#L`````@```$4``.B%2```0!$``,"H`0'`J`$"`?0!]`#4!KD' -M6+8.:=CY/O8/B.8BHBK0MB\]N)^6FW/STB;E93T.^6IQBJDPJ<) -M%ENP4YU>"[*O@6`T>+Q)H8-WDH4J*"K<`L^G2*K(P@_0(WWBNYU,L+N2RO1- -MI*$SJX:&UMRU*EF*2_\KM1\Q1Q\[QR#$?UJ9">+*R(!+R -M33UZ:U[6Y+2L22!-:$H]BH7MO#$M`_L.?SP;NY[JFXS%8#1C&+,'OSM_\K&5 -M'QL[\O6-@V*D6'`^]"K:V*OG+:^$R;Y5;RDC6WP5)5:.G8[[P]]`X_@KA9+& -MR"0MXHZK%]]-T4)]%PDJGA`Y2>@9&D5C$1;D[#H48D@$$"#38^'2:YCU^T#> -M.#YVX754$[=&"@D"`(P!``",`0```@```$4``8B%2@``0!$``,"H`0'`J`$" -M`?0!]`%T!UD'6+8.:=CY/O8/B.8B+50##.'SQ\2'X,$-_N4E8=J"+*Z6%].%B,!)\@/K;DF5>]?"QF%H7TUHJX -M4[N'S.>KG#NTAZAD)?7`7W2Y(K3N5@R%`J='D%D`KS" -M?2F!)(,/X=-:*9%HO1L!#M#=W1%#CY\-\ -MK:P:B<73HZ9,?>DJ18W'RYN/HS/[2X@W^'!'HZ05=-,BI)%J*KFB>6,3)#27C`NU;H%9*8,OZ%$`=7ULC1(:H=[8KHYPTQGB/+NR3'B0[)/UF -M095]M8O4!XZ&(2([T`\I$,_\4-0BQI6(NX#G@\\1(2S"J<110R,("@PZ$SX_ -M0-?,&`-;-=Z]=Y01>E7M7"6FL__"!3;G<#VM%^&-7B/3^3D!WI&P'6KE,29, -M-@1(!"EY(<<_=UF*6VPZZE03MT8>90(`?````'P````"````10``>(5,``!` -M$0``P*@!`<"H`0(!]`'T`&0&2?XFN_+YZE?KX.U"7+Z\9C@N("4(```````` -M`%PJ``!`&9+S9%'$[2$?\8OX1>+]9:*;)V[P>_?V_C"*.6V[[//`71AFKH#J -M:0S5A*IE>*1PV_O;^$K'O"Q_H";"5!.W1G1P`@!L````;`````(```!%``!H -MA4T``$`1``#`J`$!P*@!`@'T`?0`5`8Y_B:[\OGJ5^O@[4)?0G#4JYEN8=YM.80!5*UTL90!C-"WS_0R:RA4 -M$[=&L8X"`&P```!L`````@```$4``&B%40``0!$``,"H`0'`J`$"`?0!]`!4 -M!CG^)KOR^>I7Z^#M0ER^O&8X+B`E(`````$```!,````,+.I0E,,&EP`;WC; -M3;9VM_XH!!2(Q;TOX.1\S``,YH<2>-/#JAMT:Y+I#9IL5!.W1N:,`P"8`0`` -MF`$```(```!%``&4A5(``$`1``#`J`$!P*@!`@'T`?0!@`=E1Z%IZEH=NJH` -M`````````"$@(@@````````!>"(``'@```!T`0$`#`,!``P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``D\CEL%3K/&V:S,0/3!CHI/65L#&ZF=7Z;TYY%8>8*^9F6?Q(P&JF\UU,=%FOOG`LI8(?IT:F@5\? -M-PT-W_0I```DUF,%)Q`U+G;$9GL$%LWTLH^[N+`@N&5;-C7ET-<+?O`I```< -M``!`!!+'/5;_2+:%,(7%AFH656)*<9-W````'```0`43UYZ)E#)L=8FCG55K -M^`+>>;CC)%03MT;JFP,`7````%P````"````10``6(53``!`$0``P*@!`<"H -M`0(!]`'T`$0&*4>A:>I:';JJ```````````I("(@`````````#P````@``!` -M!@````JW!9$A:>I:';JJ```````````I -M("((`````````9@A```@``!`!@````JW!9$8*^9F -M6?Q(P&JF\UU,=%FOOG`LI8(?IT:F@5\?-PT-W_0I```DUF,%)Q`U+G;$9GL$ -M%LWTLH^[N+`@N&5;-C7ET-<+?O`I```<``!`!!+'/5;_2+:%,(7%AFH656)* -M<9-W````'```0`43UYZ)E#)L=8FCG55K^`+>>;CC)%03MT:$SP,`4`$``%`! -M```"````10`!3(55``!`$0``P*@!`<"H`0(!]`'T`3@''4>A:>I:';JJ6'*X -M_<$SAH\A("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```( -M`@```@,```@#```"````"`0```(H``"(``(```$A>TZ_FQ+.0W`IJMY+2/4S -M`RU]:C?^4`*@PEX\XT0P(\J3AQR3:,)CNQ1F)T3P;JB&V\+?^>WZ4^5)"5,2 -MB9:$:3:CY>*)%T^"+Z(^JWI\QUH]BGD./DV>QTG-XQ97A=70::+-X`@VJ/S3 -MKX)R.`,9&/Y=TDBFB1!9>@X^<54=*0``)$0?JX::P[8:WD77>;UJ.D`5C$<# -MAZWX27@5\W;O>D\Y*0``'```0`2@$]R+VRG^"$,?JB3_&.A,[HZ=T````!P` -M`$`%0/GC%,M=Z0V#$BN)*'Y2#[.D<&Q4$[=&/?P#``P!```,`0```@```$4` -M`0B%5@``0!$``,"H`0'`J`$"`?0!]`#T!]E'H6GJ6AVZJEARN/W!,X:/+B`C -M"`````$```#L(P``T";)"YPJ@M\HO!W!'+*8"*RN[ICPOSBJ!645WKQV%0"# -MNU%;.G3^L6CMHH.\-'".S<9!D8FX8)_3QTL7.K3U@HR#]P7.X,DP'#X'%G7) -M)UAYTZU4Q*+8'_Z&@?)=A0RBUOU!I57V47!!S#4(LN#3#9\__V"0_VY/YGC< -MT6Q[*?.(H-EA4>7_&?OR[""\6I&'OE&+/;P7F;5F)1OCAQG>#([:P!*]GPX' -M6K-I:A?E#$_.A`I,](SZ)IUI]X:1H$C']J4]R%N[2L[-5NBQE%03MT8(%@0` -MO````+P````"````10``N(57``!`$0``P*@!`<"H`0(!]`'T`*0&B4>A:>I: -M';JJ6'*X_<$SAH\N(",@`````0```)PD``"`K0D-*6A<5,'8JZGS,O-C:Z8L -M-JZUI?S?,SR\+>4NZ#RE!HOE=>RP^"WH[34H+%'=J?3(\OX?&E7HH2E7]XA9 -MBQSNM50Z%DD&($AGF08R%ERK)"?-/0A2>YWI`C%03MT8G-00`'`$``!P!```"````10`!&(58``!` -M$0``P*@!`<"H`0(!]`'T`00'Z4>A:>I:';JJ6'*X_<$SAH\N("0(`````@`` -M`/PA``#@0$Q`+"OG+L]4-Y!WB6XYKP+QLFN!L`H43U80*N)(C8[$/_U'Q`*J^25(G\E38+%"];QS7$$6_..\E(DG]*<@0I#,; -M*FN1NNT!00<($+=\NZX/#ZWVD6\$1.\)=I@TU>NC -M#0^K=ZP+BCR^ES2AX:.<.Y-;O#>&?F_*#TE`#PS`,/TA9N4EZ%5X2%LE&-Y& -M?.>BI9RN8+SDZSS9Y8`=-,*.JDM>Q)O(X]-A:>I:';JJ6'*X_<$SAH\N("0(`````P```-PA``#`AF\&T[SA;:W* -M?D)T9^#X,'G];*BD9H]FNM&]6.ELK2N>[:ELL[MQ<)D\!D4>[W5-"E45#DN? -M+"GEJ,[_8^%'$8SJAB=)F1ER3'!\[H0*L4KU0ZF\RK5_32M4 -M$[=&]$H$`&P```!L`````@```$4``&B%6@``0!$``,"H`0'`J`$"`?0!]`!4 -M!CE'H6GJ6AVZJEARN/W!,X:/+B`D(`````(```!,*0``,'EK^+`VDHL(/9TL -M5=12@<(J<%M4N1&*(9WFM[N`Q%HR=*W,Q/HS57,A>,`O5!.W1J-F!`!L```` -M;`````(```!%``!HA5L``$`1``#`J`$!P*@!`@'T`?0`5`8Y1Z%IZEH=NJI8 -MJ9;9$IYIRH2#95:YT[2&RUY+E.%03MT86@00`/`$``#P!```"````10`! -M.(5<``!`$0``P*@!`<"H`0(!]`'T`20'"4>A:>I:';JJ6'*X_<$SAH\N("0( -M````!````1PA``$`PS*\)5R4(!1>CA-74`7#IA_Q96F**\E&8XJ)L"ITA5TC -MWMI(,8@A,E#;:>0A*E9_*FRE5F^G)A8!NIF54T=U?"P0CH-;]FD#C3RS!'^1 -MQCPTYB%!:E0+=%;PA3XJ&T59_+&?TCXM_7&=CX_O'MV)!ASR-5\SW)6;108] -M+YOQ.BFN.7I(@#0>36P%& -M9@G''%\?=?&F^#2-?U70YVQ)RCBB#2?Q5!,0@WP!XXHGC\-/`,9"5!.W1A*- -M!``<`0``'`$```(```!%``$8A5T``$`1``#`J`$!P*@!`@'T`?0!!`?I1Z%I -MZEH=NJI8D?V"1N^ -M59<.WYA1#.B0#QH3VBE.`6O`#MW=L//%)A%N04YDAYS)\[M)8PCG?$7,;KH@ -M,AJ=!9:*#7G/8195P_YH7/CRYG>)D37EB%!)%T(S)3O[0A&"C?43$P*5^3KY -M76S)&[4'93?ZQ1\1=ZI"7!;=GW`&AX98(`@1&"QWKD(;0(?EF(WR*&+Q!#TT -MVO>Q';)/25UM4M**=-[*+\[SGX7NX#N=22C8/_YUOHJ?ZB(@6 -M2L*9VICIK]@!,^#4^02:KA+\51^W5?.*5!.W1J:>!`#L````[`````(```!% -M``#HA6```$`1``#`J`$!P*@!`@'T`?0`U`:Y1Z%IZEH=NJI8M)['L?GW4F(P(V6BO>=J3KH -M06QZB(W5QF*N0,9DP"%+Y(#MS!C\B6WE&\/=*\?ND<<(1)Z[MEQ+XR:7RL*+ -M96#B\9":5!.W1G7!!`#L````[`````(```!%``#HA6$``$`1``#`J`$!P*@! -M`@'T`?0`U`:Y1Z%IZEH=NJI8]-^T -M4IA"(?,KD=4W,S<8\:V.#'6>-AO1^_M>-5D*8CF!T;_W/'2)N@RQMT(U@NA# -M*XT\]I,7G\^4G@QY!38^,FT"%NAUKT"F0\M]9VL//=+HYMGTHKS<.=KU[9#X8PR+\5$Q?`$X'77$!.@1=(=<!``\`0`` -M/`$```(```!%``$XA6(``$`1``#`J`$!P*@!`@'T`?0!)`<)1Z%IZEH=NJI8 -M>T$>GC::E -M;K-%3#B7&P8%O*R;KFYG2@%NS1Y4S:+L)7(JT8YK<4L2M47&1FNPZNYJK(." -M^HB:K<_[Z4L>TQ>Y#/_NXCU=1D-"6L')28$.18*N.9!JH(I%YU_T]=[`5XR^ -M0A1<#R1;X[2VA/[46O2FN]&XU3W>3#O?6'"]`R^UV$[[ZFH'#F&.Y9X!+*^N -MI7R*[K`G7N'7Y>FU=3MH*#A\]*N8L9_LR>5*U8/#ZG]S:"[G=%#%;JQ%I6`: -M<^\*3U56\OEL5@7[2G)HF4#-YAIBM0]9Y2DWM%8?)!#!T2X!PVX0(PF!`3-V -M'554-WA4$[=&J.H$`!P!```<`0```@```$4``1B%8P``0!$``,"H`0'`J`$" -M`?0!]`$$!^E'H6GJ6AVZJEARN/W!,X:/+B`D"`````<```#\(0``X#1/G[TE -MX0LDXLA##S3,_,=$W.F3205PT4R]DSSO^>.4^QZ#!I2LKW7(-'8C4M<= -M!=\(5M"'7A8,1D6+Z_+[>LU)KE6T@VZ)87DNR9?QXQ0S63#B`$*TKT+H#EK0 -MCV]FLA@VS]34-]' -M=Y_U79!)S?@+:&7\XF.D;E,83"Y,`1KBF=1(4GNXMXJ[=@AHO`VZE,D>S"0H -M?DL?_N57)QW".YU/,=;ZEJUQ_G/\9%56];M\(9!K<([L;V14$[=&D?H$`.P` -M``#L`````@```$4``.B%9```0!$``,"H`0'`J`$"`?0!]`#4!KE'H6GJ6AVZ -MJEARN/W!,X:/+B`D(`````8```#,(0``L'8N!\B2+>SKY=S;H4+;8:XLUQK` -MZ(/]FP96C@V-PAOC708(]U$?Z:0^MS+KZ!UCH$*H&*:!CY.3)+[J`@YU:L9LO^'`@8QC\1.'#[]T-^D4)Z_?B:7")H`5IA^$"=6D -M%O7,X>$8\.J)6>-IW1D)@$Y:%MK1*"Z;*C?FA%`6F!\[(,+LO/B^\9+Y),`1'^`.P%FE49N+GA5@)' -M?P9;(68!"?Z<='>,Q?[]<0`!<\+4A)'"]J1HDZ$=5MW\"--3W"87>QY':5M+ -M2P]^B1R1_@NO)_Z_ZL,+NLIZ7IU:&=H39>3VX6Z30?-S[?3WE_:4B)MUN6]4 -M$[=&[T(%`(P!``",`0```@```$4``8B%9@``0!$``,"H`0'`J`$"`?0!]`%T -M!UE'H6GJ6AVZJEARN/W!,X:/+B`D"`````@```%L(0`!4(1.N&85&6P=7'80 -MYQ%GCK-,3\@7D/9@PJO`9A`=C179HA>*V93Z7[;1Z+UAQIYTPH/G^ZX[[93( -MUVA*K8#4&L4'C]"C>Y1>G.SM`AR!`]22:8# -M2W"WN\^QY;3:>I>T=:O(YJ9#OAW%/X>*0,\D12U9"["'NJ1X;IV3M@=>VW<3 -MAD%P?YL/"0(MK^!(V`C(V_KME&S7QF%3M^4MYI4"^Y<$L?;-P;-K*`^=XF#Y -M.JD8D'1A&``1VZ?A?.ER;Z)&D*353=!W/EP./$F\>NLV4&H!3*7\/2G'I+M^ -M^<'?*3&C\`U\"KZ(3AG:9-;PCAZ58:5$+9M?%1OL@438?*??734';=`$"1BN*FJK1LFRX;/FC -M%-&8/;=#5!.W1N5V!0!<`0``7`$```(```!%``%8A6<``$`1``#`J`$!P*@! -M`@'T`?0!1`9U -MH,1E6Y$B/5?IO\++!'J/0("YA5F`WCIEM)+TF,)!6 -M*B/MT!>L1(\D+-O6O1'CVD\(6H -M;5]N4F&"3,A5_<2]!NG[[X&B?%MO>\4@_@DKX@MCP6ZB8$+U%(@NS -MGPG$VHJ?%TMDW=O;#1P8Z[`;^\!>^<^)4F6I9G60N+EJT$R.Y-77N^0+9\\2 -M.POJA6-OHB,BW4/ABT10<:8A(5H``!`$0``P*@! -M`<"H`0(!]`'T`&0&2;M)@I;N-A$X/](=]E'5$ZXN("4(`````````%PJ``!` -M_I9P&2$8YEMG/9)4P)IC#S)Y\[F"9=`DMPBAK6FS9D/BW6CO%O^0)LF$%YVD -MWT2]7O4Z"1?ZA-XHKB2[V%#,]$(&R0Z.;E4Z_'0=4$[=&0,8% -M`&P```!L`````@```$4``&B%:P``0!$``,"H`0'`J`$"`?0!]`!4!CF[28*6 -M[C81.#_2'?91U1.N+B`E(`````$```!,````,%VVKYCYD0_IUO3T>6%%Z1C" -M3RM?7[Z$C,'>[.B5KP"(``'@```!T`0$`#`,"``P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``@8>L/V$PN)NU]@(2Z,+6KXRU>\IB0ML<6'#IG&TP -M>$$:9_4D!1OW%RV^UC:"YSJ6)<'7#\G+3:#-28[O32M3Z"O:24I3V*RKVL1- -M:Y[1EW:&]W);QL`R5RKB3%(T*;)H<`8F5VBU5TI[WT>S.HDU,938>.Q.TK$I -M```D)7Z_&!8>O;/+^04B)3V2E;NHN+W9D4[N_U*"S40%+'(I```<``!`!&X1 -M]NB8"/H7:`"5MZ&8#;@K?E\G````'```0`5P84W`[DWC$)++&FC)`]A[;QW* -M8503MT;8T08`7````%P````"````10``6(5M``!`$0``P*@!`<"H`0(!]`'T -M`$0&*=-E;(A2",\Y```````````I("(@`````````#P````@``!`!@````KU -MY`*BZ<%Y5'HX'>P@C)/+]=IDLE03MT8@X@8`N`$``+@!```"````10`!M(5N -M``!`$0``P*@!`<"H`0(!]`'T`:`'A=-E;(A2",\Y```````````I("((```` -M`````9@A```@``!`!@````KUY`*BZ<%Y5'HX'>P@C)/+]=IDLB(``'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``@8>L/V$PN)NU]@(2Z,+6 -MKXRU>\IB0ML<6'#IG&TP>$$:9_4D!1OW%RV^UC:"YSJ6)<'7 -M#\G+3:#-28[O32M3Z"O:24I3V*RKVL1-:Y[1EW:&]W);QL`R5RKB3%(T*;)H -M<`8F5VBU5TI[WT>S.HDU,938>.Q.TK$I```D)7Z_&!8>O;/+^04B)3V2E;NH -MN+W9D4[N_U*"S40%+'(I```<``!`!&X1]NB8"/H7:`"5MZ&8#;@K?E\G```` -M'```0`5P84W`[DWC$)++&FC)`]A[;QW*8503MT8E!@<`4`$``%`!```"```` -M10`!3(5O``!`$0``P*@!`<"H`0(!]`'T`3@''=-E;(A2",\Y2480.SS);VDA -M("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,` -M``@#```"````"`0```(H``"(``(``,L$;7?$+-OUP:>QII;H4P'JN_;K_74` -M61\0EO87''%$*6]*(,U^2I"'I0AW`/QS>.$F!W$4DSG9N+0&+C_)*G -M=\8&-G9#E\953OLW:5Y/H$*IT2M'&T,>LDYK^5N"8R40&E4DS:AI4'#]:PO] -M[(YCM,$NL2"_%P&>QK9]'KYHZ/3Q9ZR.Z -MHSI(N&QN*0``'```0`0>9&UFHGO<"%U43,T6FF_8JB#Y)_N[6=ZX^N)_ -M)))XL;E2OF -M+EHYS;.SNR)/[4_/*G>2!?\5BJ7E)N2FSAW-%[L]A%03MT9R3`<`O````+P` -M```"````10``N(5Q``!`$0``P*@!`<"H`0(!]`'T`*0&B=-E;(A2",\Y2480 -M.SS);VDN(",@`````0```)PD``"`IC0<,=H!D`:A7;CHS>Z/`D&-L)WT]ZF8,4)CY'=BJ&='E='`I,);?'V&\,VB8R-3Q'Q+9 -M%'RHLYSQM%&A+CG>>C@O882NQ>;"5?T'CW%<:J(PF>(PG>`H!E2 -M&)/OY:=]W=^-M7L86K`?KNPQ(X<$B4]/48J_5NAF<0L>,&FVB\1XNA52G7IM -MSO_.-2`3V`>D2J)DN#%C.RJDG8E)AES?\4W,&NYC^\,E)[R%2+DK^!05[@+6 -MS1D>JZ:76N9^/4D@58K,2%/])05+J9[F*3A?JF]8665+UTUNS\'GSI`_DN4H -M$Q%^R8CP_K?/C,A,#F[J[NN9*NFIU8Z7"\PY&Y5#]#*@@O]SKDI8QE03MT8[ -M>`<`_````/P````"````10``^(5S``!`$0``P*@!`<"H`0(!]`'T`.0&R=-E -M;(A2",\Y2480.SS);VDN("0(`````P```-PA``#`2@]N29+M3VO@_O-[;IR@ -MK4(*C@GAHT.:&>D`T^OKGJP[Y!!<@>Z]Z,1,;BR1[QJ7A!)A=T21)J^N^$S' -M452'U9`DA*2[94W]N8YR=AF_C56X)I0LQ*K]R*!\[SB?2!Q&QY?=L?NHFICJ -M0D<%[3A\>W<7OQRV:,JDQ9Y2[,SF0'>\8'*<`M+K"GX2EP<'H*KL:]KY_(!U -M/K[`8>>_<`5`KHB4^N@'56\^^W]6;PZ#LZIN`%NL3K+1.T3VP))4$[=&:H$' -M`&P```!L`````@```$4``&B%=```0!$``,"H`0'`J`$"`?0!]`!4!CG396R( -M4@C/.4E&$#L\R6]I+B`D(`````(```!,*0``,)+P`<,>[M-B:-'#+G_XI2G# -MM4+X*P/4][->7\,''O=C_,=F6'DY&&[W_ZHO5!.W1A"=!P!L````;`````(` -M``!%``!HA78``$`1``#`J`$!P*@!`@'T`?0`5`8YTV5LB%((SSE)1A`[/,EO -M:2X@)"`````#````3"D``#`GRA=65M&SIBSJ;#Z8I]0W(JO@(431*ENF[2\5 -M7)Q7JA656)Y%%_/CO*&G5%[,3Q.DS\$:1*[@L1^';%%P>EDH$U5(+$*K**]X& -ML:('4S(9?M?H+>;/I1T-0<=)3N'(;]!N,8VE/HW'_W745!.W1E;$!P`<`0`` -M'`$```(```!%``$8A7@``$`1``#`J`$!P*@!`@'T`?0!!`?ITV5LB%((SSE) -M1A`[/,EO:2X@)`@````%````_"$``.#S(MV#Z;K>$QL*=[B6K>B4,$_YA^.T -M0[02!]R`/#O*)N2KGXWAKL/;AF@"PM;2P5^*$VEZS5?V$2VQ9QEVHG'R^G@U -M.RM[.GAF^7%0<*43NN\'U5=XGM9P&KQ5@)DUIEC.<&T:AO3H*TSC-4G8KQ?3 -M`F'1%EMPP-!`MJ*8(E9(S.P8LLE*O'J2K-$I1W11D>E_)M=KK/&_6$CY2L)X -MG.M_SCC:G2:Q2U*^)9T36Z.73(09A%.S:M.ZG"1H_1\3J1J@\B0QSX:JYK:Q -M6XBL;?N2T!H@!/NM86^1E@CX5!.W1NS3!P#L````[`````(```!%``#HA7D` -M`$`1``#`J`$!P*@!`@'T`?0`U`:YTV5LB%((SSE)1A`[/,EO:2X@)"`````$ -M````S"$``+`O`WU:925LP*#=(10?^2E)!,1_403>Y,5OBZU9FO^.YURBSB?6 -M#C^%_/[J)P%^7].`:5\L-I?52(]`*SH08:=J.(Y*0*+]3/-40%F?Z*DJI*_6 -MS/>),&P9_N!RO['%T.]GQ\S;`)KMJV$U>H*A++>[G12O45C$P\T<7EAV-Q2^ -MN>$<>?QK5$Y*BG\+"&LB3OKS1)871#7?LR5.FX&3&_/Z30B@B=J(=6X"/67: -M5!.W1LWV!P#L````[`````(```!%``#HA7H``$`1``#`J`$!P*@!`@'T`?0` -MU`:YTV5LB%((SSE)1A`[/,EO:2X@)"`````%````S"$``+"'EU=K'32".RU4 -MFI\'BD>[^5:Z7@ -M"Z$QG.ZTT<_'S&)@L&$0?EX"42\T==X?\8X0(@M/\:*>0D0B>XQEW_^MY(%> -M(;;@L9MC1=-4+F;1I-E@4C$F*OWAB-YBEY>26?SDQRPPI[0FHX"ZRY7BTG=S -MQ]_NW*TC9P$AD@&+R@E]B%I4I;0G9#4WSX5`5!.W1F83"``\`0``/`$```(` -M``!%``$XA7L``$`1``#`J`$!P*@!`@'T`?0!)`<)TV5LB%((SSE)1A`[/,EO -M:2X@)`@````&```!'"$``0"@_#]3_-<(R]X]2G/^A0F5)K<81ZP^'`9,UE -MU_VL1*+F?I>91K0!#/^KMW`K8O6S@&Y)OAHC[@@")@@FQ6UEZX%-;*P2""5_ -MMG4#9;^Z!70+>9KT(2XGS0)]=HZJ*TQ;O!AF2C(`XS>4E,W\<7O-U@,,,JT. -M_]>`[C?G(T:', -M@`[TX%(8$:/[ZD61*IROFGZS2LSV7HL-7S<<\R[WQ*&!2S1X[DH2&K/+1"E4 -M$[=&W1X(`!P!```<`0```@```$4``1B%?```0!$``,"H`0'`J`$"`?0!]`$$ -M!^G396R(4@C/.4E&$#L\R6]I+B`D"`````<```#\(0``X!('BL"M[J6K((:- -MR%KIQQP2[+!EDVO=EI)K;B>C00RQP*)T#,*IK5[G?:I*AF`N/`R!U`TP_YM/ -M0JS%73NDY@TMZ>J_="^[(U#T_4>G2VM::"_TN0(VW271D8,+-9D)PP%\('?( -M2^7K_4)%3"7*7&F7)=/"JO,DYR;0G<)1M;UZI$J%Q.\&U -MP.X@C+ZJUVT_49RP\4^WF]@/3E:]1%BKJ$NL>7TI$3PO#WY5E["VQ#*X3QR3 -M/GWI63J'`3&J-9:LC`$II\[?[P5-ZVCI;[QX_;)4$[=&#"\(`.P```#L```` -M`@```$4``.B%?0``0!$``,"H`0'`J`$"`?0!]`#4!KG396R(4@C/.4E&$#L\ -MR6]I+B`D(`````8```#,(0``L/.;Z#\F-=E^/S9D*/"`8!WS+\FQG(7I#B#^`S'&/G!"[+#14)9\U;==@-!D -M^R4?TK0IZS`8<\-R)_Q]R<35QHA'MARC(CKZ5:[ZB%/:W)P.8"0*,L=/UP7) -MT.2PR5^/#M!Q4/5:I-!T&;I*KUKR^P?WL0Y=*+/O5UJV?F&XO3YNNR/((?"S -M83@C6KD;]]A_U."4-EFY%[,8LD@"6:QY4$[=&0GD( -M`(P!``",`0```@```$4``8B%@0``0!$``,"H`0'`J`$"`?0!]`%T!UG396R( -M4@C/.4E&$#L\R6]I+B`D"`````@```%L(0`!4#0Z>!(:3EX-(%2,7#$2E9+< -MEO&9*RQE\V)KGISK_;IY;'4,R5T:`\PSIW@K?.I&H?#A -MH+7&[L0 -MCP-NC>6^N:>TP(UU)Z%^[#3%BN.H6P9)H-Z%CG.!U-R"MV,O)\2:[DMAM@=T -M=?2Y7-(=^%]H*[8EIGK;>4($M=;C;+9>.7L_QV]3T>K7F;T>J,'@]V-!FFVE -M!Y7DNCFDB/.$_J%;O7))2U3K1P)JGRA`Q*6+2Z9"/@YW -M2BSZ5&T).)8&^\+9M><39T)Q@A4>C?73N&!I#2\M]@#F)J$YGM(IFDD,`: -M5!.W1DNM"`!<`0``7`$```(```!%``%8A8(``$`1``#`J`$!P*@!`@'T`?0! -M1`Y1^/6EF8X@ -M@DSYF-2'![?#';/!"=EJV"A/%_;ZNQ#[]RP:@D)@IRMF&4Q%&>LJ8?'Z%`>> -M+`Z>H8U1"B9W_S)0I>!S6P%.<:0<&54\F`4?O&=&"Q;G^(^B5AQE=U``E0FJ;O8,&J\)!CEH8BBU[33EVY -MR*0@F%03MT;PU`@`?````'P````"````10``>(6#``!`$0``P*@!`<"H`0(! -M]`'T`&0&263C*>N"T5#'9P!6(2V;XJ,N("4(`````````%PJ``!`\T7`K@2F -MK'PCEQ(!R0#RK;^X+'OCHY*?E,KX>>3Z16,CX)5XUVST/SJ0%T8=#`$#>&^3 -ME2!)F?=9!!4D5!.W1HO@"`!L````;`````(```!%``!HA80``$`1``#`J`$! -MP*@!`@'T`?0`5`8Y9.,IZX+14,=G`%8A+9OBHRX@)2``````````3````#"Q -M=W<,?:KU<7"NA23]!4P#GR>V,V/)ALN,)J'0)._)-'AE03 -MMT8)[P@`;````&P````"````10``:(6%``!`$0``P*@!`<"H`0(!]`'T`%0& -M.63C*>N"T5#'9P!6(2V;XJ,N("4(`````0```$PJ```P,Y)B'$CV4`@U74D9 -M)$Z&S6>Z\TO)R(:8&UN]L#^*5@62%TU#ZN%P?1MF-6E4$[=&V?P(`&P```!L -M`````@```$4``&B%A@``0!$``,"H`0'`J`$"`?0!]`!4!CEDXRGK@M%0QV<` -M5B$MF^*C+B`E(`````$```!,````,/B(EH/NQT4VO3AG`82ELE0)VK>RW07@ -MW8HDWSHGF(F_\8YD:WS5*)`UPF8;5!.W1C?Y"0"8`0``F`$```(```!%``&4 -MA8<``$`1``#`J`$!P*@!`@'T`?0!@`=EW5DHJ=-+Q*,``````````"$@(@@` -M```````!>"(``'@```!T`0$`#`,#``P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M%`W*)6:1C3.$V:5+\4)O\K1SE)N3L4I+5\\NHR=BW[9T`X?!)2+:"DQ;8FS8 -MV$6R3N@R@^:30\J)/&+D@7@9\8EP5I58YVP2^!X9/O2"WLG%JK+(<^5AM\J/L-K4Y_V,(1UHA4/+%0"FMK'ZLI```D0>M1 -M&%PU.`32_LG6+&;QRF@V<5ODM%6%3@E1Y<'XO<\I```<``!`!"Q08);%IER& -M>MI80)/O2"WLG%JK+(<^5AM\J/L- -MK4Y_V,(1UHA4/+%0"FMK'ZLI```D0>M1&%PU.`32_LG6+&;QRF@V<5ODM%6% -M3@E1Y<'XO<\I```<``!`!"Q08);%IER&>MI80)MHD$`A("(@```` -M`````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```" -M````"`0```(H``"(``(``)3VW.6-_,(SB]U_CEKNGL4O^L$`DL4&V8]\EB<` -MW,='S^PKDV"1IS;ONY8XACUVY-`0%CZ3E43BG/WU\@@6%!EF<';&8F32N_6" -MID(CYLS2_Y\:WI70RC`FXVC)^=<@X(3EXM@5I6V4'=&'9!L-D+>Y!T_TW['B -MCD`]_R'CVX<**0``)+HT:8<7N-++UPI5@M351%OT\G -M*0``'```0`3W'5K^ -M:?[!O_"\(*JCJ -M3!)%P8/Z4D;$CE^",WRW?/6N'C3HV(X+@'TE86LUU2,#:/7G3*B=._,F.]B# -MTHKL!J"L?P=%IIST8F9!E*>*A+0+3HS_-H/'1^,'\>,M_.TZ61C2SX+T++;/ -MW.VDINY%G[?*A9BIL?PS5AX;?O-KU_MPSE03MT:W@0H`O````+P````"```` -M10``N(6,``!`$0``P*@!`<"H`0(!]`'T`*0&B=U9**G32\2CGULE_>MHD$`N -M(",@`````0```)PD``"`N86MG,E3F'T.B=6!O+0RH?2L@UCBA=XR\E#7^G6O -MU,2\)#S'E*2]^`%Q(8EN/;:`R378KA?F:`$I=?:3]_\=RM)8\P%9&5Z9S99\ -MY[DKH&U(&7-Z-<;3C@<<(@A0`QMB("X#X@'4`(;T_PC&*S?. -M_)3&M%03MT;2H`H`'`$``!P!```"````10`!&(6-``!`$0``P*@!`<"H`0(! -M]`'T`00'Z=U9**G32\2CGULE_>MHD$`N("0(`````@```/PA``#@A#5],1D, -MXEXT-UUD%X1DJ<,'M,HU\/N-'>Z6;<+?GA!')J^`.80()[J@-63L2 -MI^GD)N/3^[H9Y@&@!4;G998U+R1O\0'5$M5IV]\>2/>5E^Y'0"`50?8;J7BM -M[GML!]$V!!F0%Z.*4 -M^C)NC4=/%7+XV=%R.1M68$&YU'9$3H\;E@?_77J_!)+UF503MT:@JPH`_``` -M`/P````"````10``^(6.``!`$0``P*@!`<"H`0(!]`'T`.0&R=U9**G32\2C -MGULE_>MHD$`N("0(`````P```-PA``#`<46^94`U+.T`SV;MWO'BVK]KIOM: -M64X?1^";)'J.-V#TX;P$KGB6BMJ*QN,VE7G@2=SG#$6,E`(R>>;O52B\"K+OHH:5J8WE--/Z7E -M=&WXZ8A)C7NV`M58L^.FQ.K4MSM;"[#1LN%"F&IE-WPXG.(1W,J!%\UT,&=M -M$-W8.0%3"`']X1;NN+NR>#UFPR1YXOL`=90<AH$K-RY9WU#O"K:Z(9ZCV)Y -MF9PSE%20(#$][=)@;1.@E>94[QB35!.W1@?2"@!L````;`````(```!%``!H -MA9```$`1``#`J`$!P*@!`@'T`?0`5`8YW5DHJ=-+Q*.?6R7]ZVB00"X@)"`` -M```#````3"D``#!C"M79U-P[LSBI+&HD.]!H7QZ-H70PY=TT36&4XYQ/Q6LM -M#A;ANK4SL"G?4503MT8+[0H`/`$``#P!```"````10`!.(61``!`$0``P*@! -M`<"H`0(!]`'T`20'"=U9**G32\2CGULE_>MHD$`N("0(````!````1PA``$` -M&F*D%83G_2+C%>H#[>5N'Q?=H\S_E9#);,%Y!T-7X -M84(8DYFQ=CLESPY'!0R5*.7[:&WG,6)MX]#7;F:(B.']N6R5=D\'<)`O`><( -M[7)]6T2=%44+>XD^VOY(W$=$FV6O>VB=,B,R/X,[63SS,2[O@]]3N[2M%=PGRR%?(@]351O@2C):&!IF'_4NRGY0]>TB6B)>W4.DWK -M4R*/A(Y<.3, -M(LP?>Q`K\>Z8XM.6_2[:#IUUQ_"\@0="N\!(5ZEG\@%*ZBS'8;M]('M0EK%\ -M(^3(O -M.H553^SZ3((.P':'5!.W1G`("P#L````[`````(```!%``#HA9,``$`1``#` -MJ`$!P*@!`@'T`?0`U`:YW5DHJ=-+Q*.?6R7]ZVB00"X@)"`````$````S"$` -M`+#E2J%$9PBP%&;#/ZM=!\)SC%NJ+,P_E--,N`@< -M6S/O=LFPQNRGH-M5Q@?#]&?<<\8&G9:@+1"T(BMKLE4OGB+,?]<"J]03NZ=#5,^OLFOAB<@;#^?#R+WPRD?]I><1^L=)D-VV>.8E+;V$ -M4%!!,'#KA*).:,IKINF14^8=;JS'H(`F*EQN$(Q+NV0)O:F3VE#F5!.W1J8K -M"P#L````[`````(```!%``#HA90``$`1``#`J`$!P*@!`@'T`?0`U`:YW5DH -MJ=-+Q*.?6R7]ZVB00"X@)"`````%````S"$``+""?YV0DEV/)&_G9N>,HF7VO+K>J>?1= -MT!OEG5R:,V9L,]\NQCI,]5>JC(EN^#4"B#13KG/P!E;C2W[2E_`HI0(@1;,: -ML;;P"9[7P;)(=]]1J6`5K*IO!0L"II]'%FYOE -MLS*.N3BC-DP!3Q6.R&]-WQ:Z845L1T)!X;__CH7P`8I^N)&%H2,*\L^2TF*^ -MZR(#R9K<+\1ZD0_S\B5)U'U;73RWPGNH:\5;"F6_)3W6&5EY`N=G]W)25B_T -MKE7U;Z%&R&J07RL?Q4-^?%1;N"3E*YVXC#B5-+T$+)+E$6V%LK14$[=&DE0+ -M`!P!```<`0```@```$4``1B%E@``0!$``,"H`0'`J`$"`?0!]`$$!^G=62BI -MTTO$HY];)?WK:)!`+B`D"`````<```#\(0``X.;4L^CX7L#PRV-]T&BJ-?P! -M-R*1>FW'B>'$^AEQQ:")*SX9+B"*S6HXEXD_LP@]3&H$RN2NY+@^#X"N1:(+ -MZZBU5]\<,BIIN.^15##_7'M.U=X"S=Q*,EP:0,D9`!!CTVC#U1E;JC)!'^L( -MK/`SW_BW[4\5(F0&K8^Y,UNZH/9+KZ035Z5#\8H1H!KM97'Q%\5<7LT\[H`L -MX!2:;/.:U7M5UF0`0&/HOD@5V8T)I?-L7CPC?S+I1WTBL]-UWUQ/+20CM//0 -M;7?@(AE(6BKJP:9=Y$Q<# -M]^%=PAD2,*B1]U9@1,#K!7`V!EZ+*1/,1Z(#,B%3)?Z"DI9$WM!UH);H^3`Y -M:1WG%MIT/F;A$_UA222@3<>8Z15/PA"6VEZ3^(U]>/.GB-H#*"ET!8`:MO_E -M?(C+2>?UAY2WL#=*)7/(0HB-<2Q6\DHBU.H218N6M_'P",,%D0;T3*JY`V-' -MC8X,]:I4$[=&OX8+`.P```#L`````@```$4``.B%F0``0!$``,"H`0'`J`$" -M`?0!]`#4!KG=62BITTO$HY];)?WK:)!`+B`D(`````<```#,(0``L*3FD/L4 -MU]Q,%"$F/YO.?F/6;`#%K=<*E+,@1E99JCE%9_ET*L[_,[M&6H%I(#5*VA@Y -M08LEX(@57),@2,>MY->?HJP36KX(*M -M_E)QTKOK_;YW8=A^!,*O;JDJ#\@GGV,+I&A?W>1X)TA4$[=&A:P+`(P!``", -M`0```@```$4``8B%F@``0!$``,"H`0'`J`$"`?0!]`%T!UG=62BITTO$HY]; -M)?WK:)!`+B`D"`````@```%L(0`!4&!P_2([M:!T$R^Q+PKN@85?R@>HP<%: -MRE-)+:1ZBL5*DS#09=PU1R"]QMFMM\S25-H><(L]74\[;V8X$(+J3+FG&(K; -MB^]5--<864$_G(+8&G0W]+H!2X7W-S[-)M$TX<."D'I*J4I_5TQER'Q9>[0F -M('61>;/QTX#Z:@X:@8NXW5>?O['[)?"9X9=LBB`&5GC,(=3MEB?W,OD?$8+Q -M/4V85=?]6'H*F`&8=\PA,U\1C"WQO4X'8X)`AV-`TQCJ$?<='E=_(T`)>$.@ -MS9EVOW"$K'SA3:#%-UFP6^&EZQJPE;L[U@,*#)TD9?@U9H1J8]^P#OJ);,]&P:-C'\OA`90[GN_!Y'-T^LTY@R6TZI!ECJ5!.W1B#A -M"P!<`0``7`$```(```!%``%8A9L``$`1``#`J`$!P*@!`@'T`?0!1`U\4/RAZ@1AA$7LAG)ON<-;&&\0Z,$-*380B] -M@'4`.'O,X!\*%T*_G!%WW2&V.#J"I:-%4&TIV0$O*\(U'F?K\[(MM-I]W;$M -MOOD1?B!BZ/QG.[T\YLC-\F2(,>4L&BC[PW2`X,#-Q)52*22.$3M3W3#<(Z[R -MINSDR_]`F=KY4.^*7X(P^N8N=9`/[N8(X"&4\CG,E\&J>VQHF2E&AD,N&P%03 -MMT8;"0P`?````'P````"````10``>(6<``!`$0``P*@!`<"H`0(!]`'T`&0& -M27Z:;FL3N=5&?/A,ZHHAV&#/T5DV_"(``'@```!T`0$`#`,$``P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``SG,"'=!F -M\MP%L!$MO`J@1VD/-&Y-3/*K3A,(]$8^?;X=^8X83WY3GI3Q\7Z5M'?Q5=*8981\HN,/F4W\9&C:/GZ23??&[4195K)X1J1NH1\) -M@.R,LL9X%C:Y.4E8*"';HK7S(I```D=C:WI?W5%A;0 -MQJ6$V,5=U+W!HZVY`;,5\)=RS&\AA"@I```<``!`!*P]=E7=Y)$0!VW8+/,Z -M'6L'V`Y<````'```0`7C7<0$P4V1AERA3N%;#J%I\06MS503MT:H00T`7``` -M`%P````"````10``6(6E``!`$0``P*@!`<"H`0(!]`'T`$0&*8J_Z'^O#2#\ -M```````````I("(@`````````#P````@``!`!@````K^#[?JN&UO$>_M$UM6 -ML\<@DI!<)E03MT844@T`N`$``+@!```"````10`!M(6F``!`$0``P*@!`<"H -M`0(!]`'T`:`'A8J_Z'^O#2#\```````````I("((`````````9@A```@``!` -M!@````K^#[?JN&UO$>_M$UM6L\<@DI!<)B(``'@```!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``SG,"'=!F\MP%L!$MO`J@1VD/-&Y-3/*K3A,( -M]$8^?;X=^8X83WY3GI3Q\7Z5M'?Q5=*8981\HN,/ -MF4W\9&C:/GZ23??&[4195K)X1J1NH1\)@.R,LL9X%C:Y.4E8*"';HK7S(I```D=C:WI?W5%A;0QJ6$V,5=U+W!HZVY`;,5\)=RS&\A -MA"@I```<``!`!*P]=E7=Y)$0!VW8+/,Z'6L'V`Y<````'```0`7C7<0$P4V1 -MAERA3N%;#J%I\06MS503MT89=@T`4`$``%`!```"````10`!3(6G``!`$0`` -MP*@!`<"H`0(!]`'T`3@''8J_Z'^O#2#\P1,\B'`A']LA("(@`````````3`B -M```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0` -M``(H``"(``(``#;I_FAMA32/WH:2=*\4S-7)ZS7E'T)"4,[4B#-+*3Y4WGF> -MP<_`4V`>-N]-SAE=?54#:]AS'5L*MN,Z=6]GL3$(;U]DKHGY8_IYIAL@$@=Z -M>M]*/KTJ4_,@OGV"+AN_KY*E/2>B<55-7PH$2\A5;?2H6`X:.R'C6&/4>B3[ -M(I%**0``)/"GN@S3EHL4QXU8=B)W*/Q)(<`I;0I30E-MXPO%T]V^*0``'``` -M0`1TB -MX_AT?1X&>S7(OM2LWH#2<)D1V#KR(NFCGS>51^?O#MF9TS=M+;[0,(8_9,:PTMV`H4;I'QB3S;\'BL=\&7P9L&6@\48:FG(FT\Q?3W"S\Q2LQ -MN6^"+0L4KR#^N#4"NM/ZW3M%EZMV8@IL6#@Q:VW/\&0V>'B^J\#"=II;V[^C -M21HCF(9BG[%,3OL'PMG\?6XL2E03MT;GNPT`O````+P````"````10``N(6I -M``!`$0``P*@!`<"H`0(!]`'T`*0&B8J_Z'^O#2#\P1,\B'`A']LN(",@```` -M`0```)PD``"`:SNO-RZ"9_6)/\6\B9@$M1UL*8$QJ*UEU=%@4.#H23"-8U]2 -M,[S\*[M\ZM!*8',SS?:B?C$8E$_.QYLAU^1O'5^M9<1`A0?X'\[ZD9D#2\JB -M\%(^%.HJF>1A.,![TG/Y%&Y-R'GGMQX26Z.YY_.J+`;OVXM!Y@Y#\W@>7503 -MMT9OV@T`'`$``!P!```"````10`!&(6J``!`$0``P*@!`<"H`0(!]`'T`00' -MZ8J_Z'^O#2#\P1,\B'`A']LN("0(`````@```/PA``#@3U2.`B>H>>`>/1MO -M#85X5!Y]S4M1RY89BGW'^",-H7QCI8Q8O(H!W_<.1U-@$Y%,J6Z*`DDG%]VG -MCFB6BR.'IRZ* -MFL-Y4E'`[QPQM5L+B_&6K[.I\89_\*RNW/_HHWF2DYM8Q6Y%'UAV$M,<-?Y[&])LYW$<[T):C(BX14^0[-] -M[[[LM80JF($NZH(2"WRNW=U1>]\EOE1?$XFG_+%`,+C._6ZGH/8/0I( -M^%ZO>N!F#789#A7P7/S>6;::NJAI'F_@/DJ.U;C?P'V*Z[RMF?ISH1T]#S/] -M`AO_.&V*Z`?)2=@DON_K_@,CF:A7S:RSOF)4$[=&+/$-`&P```!L`````@`` -M`$4``&B%K```0!$``,"H`0'`J`$"`?0!]`!4!CF*O^A_KPT@_,$3/(AP(1_; -M+B`D(`````(```!,*0``,,UO#[YG,V-/P-\#9)_R.(O6QR47>@7)873MBS'# -M2K3N34B*'4CM?NGS5A/X5!.W1OH-#@!L````;`````(```!%``!HA:T``$`1 -M``#`J`$!P*@!`@'T`?0`5`8YBK_H?Z\-(/S!$SR(<"$?VRX@)"`````#```` -M3"D``#!N72RB:.C3"MB@_R=+1XME4ACVK%YL!!N]64U(72EI;P5(-.YU]/XV -MC47 -M'Y=_3++@FS!EEAFN^"CU=\!EGC05,Q_\R+MNQB2*Y7.<"(K`E;M!@-W2_6G] -M`?+L22&3T'ID-=+1KL5Z@_J1ZVVIVAWE&,0(1LKZJ(N@\"N5*35LL5H5J+[* -MB@;?VG1.B0;ZJ8OZM=OWMEH/3'EK5!.W1G\T#@`<`0``'`$```(```!%``$8 -MA:\``$`1``#`J`$!P*@!`@'T`?0!!`?IBK_H?Z\-(/S!$SR(<"$?VRX@)`@` -M```%````_"$``.!,ORLD81$;'V00V^%285L^<\WC$&W:YAI5EH/L&)25B@AE -M%)M7Q:&@@[3K,+U&W'U.\]N[V#0VP_F8+N"W@3\T?S/<,;/LZ!@N;8C -M<+-9JH=][&+O="-25X>JPE(H_RU*!S\]/Y-3'Z!0BS$-6C,S0C4G.]JM@PV( -MMO:)H@>B^\G98W[LNBT\_RD]O!#7H-BL7<$:J;$*U.[(&+%Z&_U+N#6$]4_8 -M+.>\K4)[]=]3/P9<5!.W1BUG#@#L```` -M[`````(```!%``#HA;$``$`1``#`J`$!P*@!`@'T`?0`U`:YBK_H?Z\-(/S! -M$SR(<"$?VRX@)"`````%````S"$``+#^L%Z'Y+&1Z]LZSE8$@SS^D^:1C5'U -M%:0'66.J[GT+65 -M/`-.7(U@=G*6U@\BZE)FR3;9>#'<,DRVEGKLLK6RO(^Y]7'ZE#N?E$&TQF7GSH<+F_%0T7&9["TBN&#T7<"[E+S[7J.S$D6CRGOBB\YLX -M63?HOO[,BWY/$8KYOPQK:)&"9XN.."JG33.'4\*1(W1\M7P5%?"/D:D+G>$` -ME*8B-`B -M@3?D+Z9%4QW;`MF[H3!<)U5_$;;)I/G5T>2[AU$7A,W!6[E]?M:$Q"^)?I#) -M?J;B-OO,07UMMG[N\8S&*U(P4DBP";OZK%S,?#C[J@_J;ZUX)O]N?-9G76DO -M]S%L#LS7Y(_L)3(<CN=>J6.O(*P`:V;61S]X@DMJIY93U5 -M2.]1LB?!>VO""/[CCL*L$T#Q"^7<(XC2R,J,6N;DAA8$U6R&:14"R7,VDWU) -M4X:+MOA,/G>Z#O;/91(]*A]4$[=&H9\.`.P```#L`````@```$4``.B%M``` -M0!$``,"H`0'`J`$"`?0!]`#4!KF*O^A_KPT@_,$3/(AP(1_;+B`D(`````8` -M``#,(0``L$HMK`/LE]4V$5K^Q@\@"44K;V4+:EM+?BT*'@_'M>X+(GCC+.I0 -M/[ADN9QZ0)#BXA7PX+*"`8K44-!Q4=@+UEE._FF23.4U;3NCKJX%C">ZS"28 -M6[OSM@)-O)$S&,6-XEV(,OR:,:_PY:-%4@%5^VRM%67*^9;&?#XFX?@^I5XA -M7\HP>T2@75^:=;L,$&NM5;$`F2Z^+-;=81Z:+;$ -M?E:X'V1O'.QZ'G6LZ6SG%R*T`*8K.V]*.1,#H6(:JOOX\J:6YB7V%.MSG4OX -MA4IJV3.W[?&V1,!*9QOT2`/0T1=_DR#EE6$/XR4[MA.F(TX@#0+3D[1&-?F_ -M\^ON9Z>691N$?AUP[*GE,"RQ``\@=.4]61%4$[=&HU@]8U) -M(FZI,(U\4]9J_ZD[]PM,8<KL9`^Z`6UZ`,C??+DD`/!JE\ZZK,-"`)2@U)(&80GRR-I89[M$0`>Y^]%- -M"@=_;TN'7';YN,/R1HDH],B&$7@$W%'&%RMY\S0J/;6@5!.W1NP=#P!<`0`` -M7`$```(```!%``%8A;<``$`1``#`J`$!P*@!`@'T`?0!1`/"U6#5=^5Y@P^*@$V:N1C -M_Y4*]Y"#C1^(9ME0IECW`6P]<;9!7D.`W`822=!#[\(Q+JG4'<^`*A1#;H)( -MQ80%M:^!<,("X`7HWJ."K)-HIPZ76,:R#_&BM4`1IYIR'+]?)@(D\U9>%)YH -M7&Z.%G<6>%VPU3Y7ID<57X18V'C4(\,^GZ'(\*B(V/;Z;,[06T&4Q1_P,P0R -MB&#N`1>0P29-,_,0:`EBRHYQM*$V/S"4D7596?4G<=^D'91S/J4*^8?VJF9" -MMF6(E%J8%_KC/#LLBOT:\:<Z1-(7BQ^Z!W-(';9[3"[W,Y\3<#]LG=ZHN -MFX11R\-9T>55;%*#KMQ&+/'R;%)5)XBO,`)>".(9?"0+BAZVNU43MT:.`P`` -M?````'P````"````10``>(6X``!`$0``P*@!`<"H`0(!]`'T`&0&29TL,4O. -M7><@-F>+T'NJ\"(N("4(`````````%PJ``!`%I-:D0N+9SIJTGKYJ:<.$H$6 -M@:$L#@E=I\D5ML7@K:/R_V0HKOF4NP]SN8L0T[0!@NQBB8#,P=R\FL6=51.W -M1NH.``!L````;`````(```!%``!HA;D``$`1``#`J`$!P*@!`@'T`?0`5`8Y -MG2PQ2\Y=YR`V9XO0>ZKP(BX@)2``````````3````#`7BM#OD>&IY&6J()GC -M,_W[G!KL!"'T.Y98!#3^)J8;G@^/P:#39(F#3OLQJU43MT;;'@``;````&P` -M```"````10``:(6Z``!`$0``P*@!`<"H`0(!]`'T`%0&.9TL,4O.7><@-F>+ -MT'NJ\"(N("4(`````0```$PJ```PNG!R%(^Q&&HC8YAEC/EB$G;?""UT3FP> -M\15Q.V4[W:,9F^^/P9OJ@(+/1:15$[=&2RP``&P```!L`````@```$4``&B% -MNP``0!$``,"H`0'`J`$"`?0!]`!4!CF=+#%+SEWG(#9GB]![JO`B+B`E(``` -M``$```!,````,,U--I^HW?,)1\YH^Q"U[C,O6F6F>T#=.8F"!$H8\)RGJ,<2 -M]LTK7!2%?,&M51.W1FPI`0"8`0``F`$```(```!%``&4A;\``$`1``#`J`$! -MP*@!`@'T`?0!@`=EL8BBX,+N$#D``````````"$@(@@````````!>"(``'@` -M``!T`0$`#`,'``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``PVY(PIWQ^*HP2O#D -M^8F448IC\!N=3+-P1:QW$$,4LRXN5H,8=1WUY.\JDEU-<"U=.*9RB,(S&I!1 -M&P4XT(LR6M@?>\Z9M#JN^%$=1ZKMJ#'N5X:X0K^>$8HH/`[APL*J5J5L;K)F -M?$&"@FE$CCB4'@B,-W<<9Q).G,3TPH"0:_XI```D_R4)X#5R/8+;FC -M:2'Q.E_K__:)_^=JGZ4#2O(I```<``!`!$7&J&&K6-1.O3:R%)JM-'<\*$1L -M````'```0`4H1?5?MOV#.^[SQ4XD.HSL5J&"WU43MT:H.`$`7````%P````" -M````10``6(7```!`$0``P*@!`<"H`0(!]`'T`$0&*;&(HN#"[A`Y```````` -M```I("(@`````````#P````@``!`!@````KP>T\T\\Z9M#JN^%$=1ZKM -MJ#'N5X:X0K^>$8HH/`[APL*J5J5L;K)F?$&"@FE$CCB4'@B,-W<<9Q).G,3T -MPH"0:_XI```D_R4)X#5R/8+;FC:2'Q.E_K__:)_^=JGZ4#2O(I```< -M``!`!$7&J&&K6-1.O3:R%)JM-'<\*$1L````'```0`4H1?5?MOV#.^[SQ4XD -M.HSL5J&"WU43MT96;0$`4`$``%`!```"````10`!3(7"``!`$0``P*@!`<"H -M`0(!]`'T`3@'';&(HN#"[A`Y^9>GK+VA`W4A("(@`````````3`B```P```` -M+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"( -M``(``"R3^_3F+"5]A<`QR&0&PUD7@G&6L+05.Z,Q@5;PA8LV=E5T=<\7U_'T -M!(=4*>!6UN.AG4HQ>-!>/2BE6O37HL(R!@.CROA@W;`1%(F.D=ER;K(5DUH= -MQ)^[X:UA-D@^ZB.9(UB>6!HG:E+RSG]5XYX8HIA=PQ#"I);!$KD3N]N9;T5#A=,Z-*0``'```0`1).-?, -MZG&S-#\")'*LXB\UI?`#)@```!P``$`%P;`6GWNS'@B.S_-L6,"SJ5.<7695 -M$[=&RYH!``P!```,`0```@```$4``0B%PP``0!$``,"H`0'`J`$"`?0!]`#T -M!]FQB*+@PNX0.?F7IZR]H0-U+B`C"`````$```#L(P``T"[:1HFI-/]>_)#Z -M[42'/WZ,V@VL@YQ=)5A;1__4M>IWE"3/>0?VQL0LVM[F+D7I:B?M%Z8:8ZP"KK2EIE375)O'SP-,C2O#![FQ.QD -M1!%`0P_[K^,(NFF3M'V`'%4_0\EH8C5;QK-K0>VD3R&PS;*X=U$]JZH@(Q^+ -MCAN6"4:&?^^B\GYM0"*/N.^#;,(9?O@+BULG,E8[!>YYT2=S$ZHB)RYGZ=-E -M/@D[IFFM^&%;*UG&3U43MT;CMP$`O````+P````"````10``N(7$``!`$0`` -MP*@!`<"H`0(!]`'T`*0&B;&(HN#"[A`Y^9>GK+VA`W4N(",@`````0```)PD -M``"`+7A"(S&/&C\]CTM0M03.^%,%ZI$N-*KU43MT9BUP$` -M'`$``!P!```"````10`!&(7%``!`$0``P*@!`<"H`0(!]`'T`00'Z;&(HN#" -M[A`Y^9>GK+VA`W4N("0(`````@```/PA``#@4-`U-?0`36NG*:*H&]=#]4=> -M@Q?G/%E)==ILI0I-WPB/S0D?5"M(K&6B&YBJ7VBA2!-?[CAJ..1OI8:K?/["\'W#PC#2KQW-DMK*% -MFD**FX0]FK0BOH;D9Z_X8`W+'0)-#)^U3]81IWXTUVRO;TO!_M'D$`:$-Z?$ -MXCL)N`S%V1$JH<3CTQ9DU\9^0[96---SA'75M/+$?A(Y4W(9ZK\,CC(%CS>< -ME)TB-Q?0(U[R+1VMY>,P4*XU#IF'SE43MT9WX@$`_````/P````"````10`` -M^(7&``!`$0``P*@!`<"H`0(!]`'T`.0&R;&(HN#"[A`Y^9>GK+VA`W4N("0( -M`````P```-PA``#`6)1^'O*.)W@`X:8(UQ:!Q*$1@.VH5NX(R-?:2]NSVEZ6 -M7_EI^%,AXP6)Q,"J#(6L_L,6[EF`M$?FO4>1'%4V^_@$KG58?H^DWQTOHT -MZ*W4U\'IE7UX)C#\>1A5@CIQS`T4)10!"$-X:*53"S,:[=@BT4`,&1#ANF=% -M(Y]XYVN(:J1@9(G,I`<'TDZWH]15$[=&E>T!`&P```!L`````@```$4``&B% -MQP``0!$``,"H`0'`J`$"`?0!]`!4!CFQB*+@PNX0.?F7IZR]H0-U+B`D(``` -M``(```!,*0``,/*9Z+20^@YYGT!$C`;!9/`!T!]UU',:A/7-7]]LO:$#=2X@)"`````#````3"D``##B -MTEB7-/,#U+T?'WDM8CU!4A\@A)=?B::S!JS6P@SF?),*#0$RWG1W4&X*W543 -MMT;](@(`/`$``#P!```"````10`!.(7)``!`$0``P*@!`<"H`0(!]`'T`20' -M";&(HN#"[A`Y^9>GK+VA`W4N("0(````!````1PA``$`P[=\@65J#$`\A10* -M]."!NR%$6(ZBHB]W1F.P8V$DTBH&L<$*NO_'*I1R4?4S\'M4TZH2M4"M**UF -MNYRU?B`X+\6N'3?)^#+@M1\JDV?)$"*B;\8CS[HF$T)N21H<=+\0NO*).!>*0C@ZI5<)Q,JO*,)8YVM'\)_ -M8'657%06*#/,]+PFU;!L>*XL(WGLA4H.?WLEK9MPHFCV0#5C-=LAHOW;T]^* -MLO:$#=2X@)`@````%```` -M_"$``.#,8U!P*Q$HSSE5$J=?(58GHX5=K2VB1K)N@$W#63BCGT1_*VYFE+%* -MVUF[@^:YP/">3FD#/_O1&V7-G#79Q.GCC-H/Y@>$\R<4@CHIV&5WMSTS8&SQ -M9:X3WUKDFF"4U@\^'///AZG"&]UI@"<_@MBT_JUC*W2A1XL(L@1;+-NF)+P$ -M6Q!H_](8)SGX9N`+$9O4WFIA1W:'9<2R0L1AWP`#N)6;&/Y5BT-K#TA&6,S: -M1P2.8Z\=N=]0`,+01Z"#+Y1?03PI?>N.YZ&O$:^HG58_&FFUL5WLO:$#=2X@)"`````$````S"$``+"^-WCM,1Z`KKWY -M@KDH1RFYC>>F-\Z'3I^*K[0]T;SU92THV"*574.KPE% -MOA-+7W-5J>39>C1'VL6N/4PJ/2]?W_<4Y-M`>T9FU@QXG[8I:L?O"C[<[T33 -MKG)MMS+\LK8:9K%%&7/>D+`'V/:_#<9W.*G*\,#5>4]?EB65:J52*FJIT,&0 -M$U[B4-\;LT0D^>NL1[O>.-X3PX,_NE>$KUO*51.W1BMB`@#L````[`````(` -M``!%``#HALO:$# -M=2X@)"`````%````S"$``+#VN/L2^&<>'`&PA,0@AG[43.O#_:@<8FQG^JT4 -M@O+.^+]1OB2P%:$"VUEXSV_Y47_GS*9W@`#A*OU)5"U1VX6W_QU"&\L/;'F/ -MFPX[4ZJ]4ZTO/!5?C6.A\^-7C[PAON[;]Y,I?T('!7K\0TC/2!NG;'!-1=3/ -M5F63V2\TPR5R+N0AOVX@04497,Y6'4*`B?SS@&B4OH]?#O"8EG.7ELV#93S& -MAG(M4;<-A]#151.W1N]^`@`\`0``/`$```(```!%``$XALO:$#=2X@)`@````&```!'"$``0!. -M-D"E.,'Q-<.26Q22;D/D1N1B -M\@1"^AE_<>Z?3A,!2.%^G;;H)]`=2VH5HIQD8=^8!]&>9@!X9KC:&Z..NM1A -M,YM#5`@YXWV7`:NG8S$-%/4&!&\\:\"_Q)/.]T>&ZZNGRU=31QZ\,M/0>VWY -M;C);^WA'@SSM4R!/'IL@("JWU$;;D%5\U@#]%M-CN'%R_4V,N=/GG#<3\U>U -MYA[/?+PM+`IW4T'VM@P;-!+$0>Q^N;PN(/T=>1+&?(>AW-\Q*7[9TM'XOT=> -M,JW79D;&(<.6^6V9$2*']05FQ3N&5^K",E!5$[=&I(H"`!P!```<`0```@`` -M`$4``1B%S@``0!$``,"H`0'`J`$"`?0!]`$$!^FQB*+@PNX0.?F7IZR]H0-U -M+B`D"`````<```#\(0``X`&'#$3NGT*W6-<;&*)D$$8BW^AP7RN<(X#M4ND3 -ME:*+MWW_ZA?"(=9UQ;@1J^TO2/L@2H<\61'@5(WDFC^;O^QKJMH/'`*H!CX+ -MW#$LRV:36[!&+<84JI0XC(HK$E`=XI+#HMK2O[OQ<&&C-]MENY4WI/385IU7 -MB%]G":!%JE[8?JZ)'[-"BW]/:VX*P'606>_4MXAY-M/B/"VQIJGYRUN,E*\Q -M?2B=^1/ZK>#%RQ>GM.<%#;B>)5WCT,]N^`$-Z\D._JNOOA$]B8O -ME7UO6,O>C)X$:?@,'O!'3@5-SA,HU^G8LLE4O(=_J.9S,47] -MPR^:_-;AE\`<1(C0G:I$W*[9-0PI/70`L>$S:W(OIS'L5]F:WW)5$[=&@+P" -M`.P```#L`````@```$4``.B%T```0!$``,"H`0'`J`$"`?0!]`#4!KFQB*+@ -MPNX0.?F7IZR]H0-U+B`D(`````<```#,(0``L$=K7/X['#;HJMB;G8'PCD.G -MLA&C)E&H/:4QR&,+;#ZZ>OU[@F)NRMS[SK,8S3L`:5Z%ZE -M2[_8.'IX"/'MWYZIQE-(H<'')O0&M$F!_#.9D%J[_U!@J#/Q^`PSG@3M84DT -M>&!>TNLU8@<$P=5SJP\%U@E^,GU5$[=&Z^("`(P!``",`0```@```$4``8B% -MT0``0!$``,"H`0'`J`$"`?0!]`%T!UFQB*+@PNX0.?F7IZR]H0-U+B`D"``` -M``@```%L(0`!4&L0OOZS`:"E$,/L$Y$'3+6RL[[27+!=D^'*M>X+'$I09;J[ -MF$*5H/I$:TW&7EL,\>(M_4(\$I[<^4WRWX](J03H2F!^BW5!05P"O(06`J>0 -MOBJIL6(>\.223+6>V>;=NP"'\;.0[!7OK)`2$3%V1/_=FB``5O]3A9E5\3I!2I^^U,NP(&S0>=@!X:79I@P'8JX$(>,.,?A -M[2$QB?-G*)L67AATU290`*6LKL[S3>OX.:=GNR^>L;FTC95_R`R+@?)HRLYM -MEU[(\&[Y%'L"T_UVG)%5C-381[1MK$B>9@%W$^AA[]S_F02X!9`1@K2 -M[%29]W.KJ%KVY\G=>G`49TY/RZ7#UB#^'XE;%A5SBMT^(.-K:!:1?(,R(6^Z -MU%EZ]M?P%')Q\^4J;OG"A)]2>+1N]T%8!JS$51.W1C$8`P!<`0``7`$```(` -M``!%``%8A=(``$`1``#`J`$!P*@!`@'T`?0!1`LO:$# -M=2X@)"`````(```!/"$``2"2D!2\`E`?+OM&W#>#D4'^,T`3B6-W0`C[*MEI -MOL$7\[M^T1DMHI5[F@(?OY%7>61;'H0G)V=0,679D753>8&^+)DO46IE827H -M5+/H_H2('YAM$'+0Y8FT5-5F$D>*_9W.9,3U8UFB4\Y;DS%MI:CI^E_KG/F68H':1,>[HE(8_Y0AT -M@&Y>YE]P+I1%6#/._"<&L22KAFS)470@WHXAVR&FIY%K:[9'N#($ZW<"RYXT -M8,2W773V0DPR@FLG>@V24IR:'LM5EPX6#I!7C[7%_U43MT:K/@,`?````'P` -M```"````10``>(73``!`$0``P*@!`<"H`0(!]`'T`&0&29OJC,R]+ZBKZ=<2 -M"'^@P.LN("4(`````````%PJ``!`.4$_>N#`-FJ%.<'DQ4TN*6)V-[I8ON1! -M'#!0XT5]>A4UVVO[J)U)543MT;Y6`,`;````&P````"```` -M10``:(75``!`$0``P*@!`<"H`0(!]`'T`%0&.9OJC,R]+ZBKZ=<2"'^@P.LN -M("4(`````0```$PJ```P]-!FO=.]#]%A;*J@R@^NN%U*@.':@YW@*YL=8P)P -M4"(``'@```!T`0$` -M#`,(``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``2P^1XRWC`]0AQR(C&>7DI4S[ -MP!KUPXU@HPTW2UE9D'5?)].\)6-OP=$;0T%"ZM$ZTQ72>_'1OX:%JU/>](7&&[\ -M&5V;K6W,.S08?NE7X"$G"NRZDK$I```DXI?_<+50R<,LI;.!N28GPD'AT@PP -MLY=[&29E3IV:(;(I```<``!`!+1?&GB<;1&W`_!OGX3/U:IPZ6\GB>O5U*ICL%43MT;E<00`7````%P````"````10`` -M6(79``!`$0``P*@!`<"H`0(!]`'T`$0&*5,GTHK/-7,=```````````I("(@ -M`````````#P````@``!`!@````HJ_^2A>1[U41BLB,I\6,#S&M%";543MT8] -M@00`N`$``+@!```"````10`!M(7:``!`$0``P*@!`<"H`0(!]`'T`:`'A5,G -MTHK/-7,=```````````I("((`````````9@A```@``!`!@````HJ_^2A>1[U -M41BLB,I\6,#S&M%";2(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``2P^1XRWC`]0AQR(C&>7DI4S[P!KUPXU@HPTW2UE9D'5?)].\)6-O -MP=$;0T%"ZM$ZTQ72>_'1OX:%JU/>](7&&[\&5V;K6W,.S08?NE7X"$G"NRZDK$I -M```DXI?_<+50R<,LI;.!N28GPD'AT@PPLY=[&29E3IV:(;(I```<``!`!+1? -M&GB<;1&W`_!OGX3/U:IPZ6\GB>O5U*IC -ML%43MT:"J`0`4`$``%`!```"````10`!3(7>``!`$0``P*@!`<"H`0(!]`'T -M`3@''5,GTHK/-7,=A@P4?,%FTZTA("(@`````````3`B```P````+`$!``0# -M```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``.'E -M^0#DW0N===[1&ZI+Y>`3I*L;TR6[AWO_$@V]9"^X8*0``)#QFQ[YJ -M*O?\%$%;6SVL.)NK'5T/=>WG">`X;2W1VG6I*0``'```0`2*N0M6'$CX#7)- -M9.PUZ;X#=.P?[````!P``$`%R,-1(K]1.I"F4/?X[:Y`0#>H7XA5$[=&S-4$ -M``P!```,`0```@```$4``0B%WP``0!$``,"H`0'`J`$"`?0!]`#T!]E3)]** -MSS5S'88,%'S!9M.M+B`C"`````$```#L(P``T`_2IPFMSYR!DZ9_='7+08^5 -M[=GIK`-BI=0O0;)AOGZJ,E4;I$[H3&SODBH=WP5`IHB,@7H@&CO.XJOG"AE& -M011@9@_`Q!5;'/V9F*./]>B9J$O$Z.J:A-]#@XRP;6FC_+G1T'7E7L!$73PW[4AI5=!3`=6_,U!GWC)F#M6]EX&'C -MCR8%`ID%3E43MT8D[P0`O````+P````"````10``N(7@``!`$0``P*@!`<"H -M`0(!]`'T`*0&B5,GTHK/-7,=A@P4?,%FTZTN(",@`````0```)PD``"`)>D7 -M4Z!HO7"C9,QS=,:?[""#U+$:#R -M]R,,S=]M4:@8ILS8V>@"N9!5"WB\V]OTTL[B0LZ6-Y$TKZ]837O'EIXP+X#F -M@U%;,%"C/1R$YVC5K(P$%'ZY"T?\/I>Y=;X:&7\!7E43MT;`#04`'`$``!P! -M```"````10`!&(7A``!`$0``P*@!`<"H`0(!]`'T`00'Z5,GTHK/-7,=A@P4 -M?,%FTZTN("0(`````@```/PA``#@H_<[_L5WM6',JD$')9S.ZMWGT5-]*3'S -M@J4=90PF1XK?=M+J50VRR/>YUEYK>;?@C[$N8&T/E1RV/0\.-V"!:^"VY/.( -M^!W#RP+T%EU]\LYT=;ZH1$N6ZU'2`RAB1G](=#P&J>@*:?P%=]JBG`>M']O*R.YE3LKI@+8YL.H,;0H) -MD9^'QI,+,&-ZB?,@R=C7$PGJ=KK'Y!0B`E -MG*VK%C5C*FQM"HM6@IG.MU43MT9_$P4`_````/P````"````10``^(7B``!` -M$0``P*@!`<"H`0(!]`'T`.0&R5,GTHK/-7,=A@P4?,%FTZTN("0(`````P`` -M`-PA``#`LK+:IF!_N"B[/1-0=IF5^DH70(X6`[2M#,I+`E?+`O%83+ZP;F8> -ML`D`"'F&F8Y-I^HR>/BC)`N\VF%^Y(@B1\>.^1H&UG),/RL3AL=BJ(_-SU47 -M?7Y#>V:WOF81,AO!<_`,V-6=1-X(/O^'(YEAMBU>27IIH8V"3L+!^U74&NN> -M3T@&1/!2&2;,PJ:5;F\@V(*(;3DFRXG@/_JN;G";P^N1UP",Y2#N"<^(=/@2 -M5:SA[]0:*#VX@\JN[0I5$[=&^R,%`&P```!L`````@```$4``&B%XP``0!$` -M`,"H`0'`J`$"`?0!]`!4!CE3)]**SS5S'88,%'S!9M.M+B`D(`````(```!, -M*0``,'&2\EMBVG(&F?BDM_]_URY!URD`R=X(@H?V]GLE.\X]X9I)[]5I*J'% -M.G0``$`1``#`J`$!P*@!`@'T -M`?0`5`8Y4R?2BL\U:WQ -M(;#!]1_$O%>=@IM0WXYRJT:8V`5*+P\=>C8+*4YX5'L62_O&`U43MT;P6@4` -M/`$``#P!```"````10`!.(7E``!`$0``P*@!`<"H`0(!]`'T`20'"5,GTHK/ -M-7,=A@P4?,%FTZTN("0(````!````1PA``$`]7]&GW.2KQA5V^C3?-C_CG9% -MF?OG+_GM:TTC,M#@T2\J%6QR=#1JJ"5#K%EGTAI[L47#YM:-W%[LF?%?-QE\ -MA.5?8?F[Z"5FR*6KY">0#!N(FO.=A0)P&7>9CR'O+-A'5_3`]-2$T9,#-FE]X$N)8U"F=C9 -M7;35$I)MOMC(ZYZ[F/(&,!'0'Z977C=`)%9,42!,6_V"5+UP_M&UU_G%M[BCWM`,PGK -MI?N"OK6`6C$M51.W1OMF!0`<`0``'`$```(```!%``$8A>8``$`1``#`J`$! -MP*@!`@'T`?0!!`?I4R?2BL\UIL]*M1P9:J;OD]9XTBYV6E6SA$$1?FT_YG?,(4LCE'7&^+<\_L#JPF.&G*+'C$KW. -M8'=%U3#'S,/OZ#5_'6^E"&!H/-G:K`Q%!01^5S__]_P9DJZF]U(U>LE42(UK -ML5)[K!$*KX;;S=?1P*KF^V^"IHX9Q%/-R[[KI,-/PM$/I.\S$SBX51.W1I%V -M!0#L````[`````(```!%``#HA><``$`1``#`J`$!P*@!`@'T`?0`U`:Y4R?2 -MBL\U`)`$.1B%2\N\HX2_#SWV\5(IZ -M!*[>^/I'F"\S"#^Z16\(7O)4`N^*5E8J<..L`[BG].J%+:GHZ)!X51.W1NF8!0#L````[`````(```!%``#H -MA>@``$`1``#`J`$!P*@!`@'T`?0`U`:Y4R?2BL\UME^*MC_>NYT -M"YT)KF_79+@$NOF9EV/CT&);\5S8)0(ZV\@8*^9PPB#KCB$#3-%&+B+0'0!% -M\&4+_3[94&]7F4ASKJ/NID``$`1``#`J`$!P*@!`@'T -M`?0!)`<)4R?2BL\UXELQE(K<-YM?AT@R\3TE!!'=3HS0:*(#2R7>72E_* -M"G'?M`JIK!'I4]"F:N=3Y7DF=\>3R/=7QC-4!Z@"?!I-HJ%Y&\*>+5Q[:1FY -M0'$S\]BU[-,U5:2:)+&?;E1@!EUD&&=NM8*B!7[HCOK(`[@T9+K -MBTSTY:0,ZY@Z4I*..1Z6OR9-`8:**+5>IT@012\4M!,WO:[^PIEYL8U:A![8 -M;%Z%;B`;OO)W5"XIU'<,SW%<@M:G;I".O-M$S]*=L-H2$`!%B9[Z(!IBP'B7 -MX/ZW)-*P%&XIF@/$DF:FUQA*K[=5$[=&[<(%`!P!```<`0```@```$4``1B% -MZ@``0!$``,"H`0'`J`$"`?0!]`$$!^E3)]**SS5S'88,%'S!9M.M+B`D"``` -M``<```#\(0``X(DTJYJ9^>G7H2Z6%\NZEL+XQ1N7@/I")6WZ$64$>J5IO!BF -M3"!,G57X';"BS[&4Q$H9(T<5.B7\HW;WXO^Q>KR:.8[*!F\MB/9V20<@S&\* -MQRV$!6I`^AP?#=3;78L(/F&W_39N-(:PN06U7QO:%^E`&.;8[##C1T$/P)WV -M#\\JW26M%POVB;^*^VO$JZ7-D8HD$EVB>C?U#P%3X?=RT;\(C0L"""^C\^(YZE`U&TZU_]=''P;,VDM(=$@Q;T&%'/3=^'L=G!"7VB-2..DW;.:2KC4@;)` -M-N*=O9I:#E\(_"Q`ARN011B?_95-9RRO^/SBL\/QE/RT5N^BKPF'+RFDF6[X -M+;\3+Y>4NZ_#5`-=1[S1J`I*_X,O1OM:XTU173GYZ]=5$[=&6_0%`.P```#L -M`````@```$4``.B%[```0!$``,"H`0'`J`$"`?0!]`#4!KE3)]**SS5S'88, -M%'S!9M.M+B`D(`````<```#,(0``L)'CQSZ_\C)3N'*?$@[A.B_6:^/.Q_WA -M]($'\FTF2IBL<4*7A!^LBHW^(E,W8WL'W;#4N2M/B(,]ZEOR6`RCS7E)3K*# -M'W`-]T]U=&$N^A":'AFCV%/,7%$!;A>E',[,?3PMGL?+WKNWFL2_-GO -M\.Y=PA#^6[=EIBB29VD`\U;0?Y/=6MI$-QGL-A>`\R+B -MKLQ^&$"./!R-Z0:TX*`X;S=,!RK?.FCXH<*_2("G((;)Q"<<-]IM;J/=JIYD -ME<=N.@1XL^65Y;VQ>_-^F@>WU0OIT>54D01(>&DNHG4*P#EN)`![3#P2?",. -MU'#XC+8W7(?5*N?ZJ[`W_2IBP;,J%6'[4]?LJ%`SX``$`1``#`J`$!P*@!`@'T`?0!1`LEV)<@8;@\63J"D\GA$Y%.`OALT>Z`('E4P@<:Q]-)(:A5!PT,WRQ.M8SN"ZJOH8('X<';AXFN0\9=H'A -M4R<#:NYTD5T.KQH`K!)1,U#@KUNX3Z_\=1?4H1#&N5<"B/Q_.B-J#82[V+A0 -MCFIJ/6S]D;UEQ8!^%\9);&;:%40>'C'B;%43MT;A=08`?````'P````"```` -M10``>(7O``!`$0``P*@!`<"H`0(!]`'T`&0&2;H:T#U:,>?M;'U:P^HG0@DN -M("4(`````````%PJ``!`:)*8\Y%?F$[=Y9P8%>YGN:0V[WVCEF'K3U43MT9[D08`;````&P````"````10``:(7Q -M``!`$0``P*@!`<"H`0(!]`'T`%0&.;H:T#U:,>?M;'U:P^HG0@DN("4(```` -M`0```$PJ```P9TN3*$INB,I63+]U62[W+G\A]D^[_HGXO(P/<@L$)>AE06,R -M1RC-M_`E_D!5$[=&!Y\&`&P```!L`````@```$4``&B%\@``0!$``,"H`0'` -MJ`$"`?0!]`!4!CFZ&M`]6C'G[6Q]6L/J)T()+B`E(`````$```!,````,'5P -MT3ID#O$KO7OWQ1+ZZV0+VVTDL&+R\Z\.6L)5V4^ZU0M'7_%19H,I2;3?51.W -M1L&=!P"8`0``F`$```(```!%``&4A?4``$`1``#`J`$!P*@!`@'T`?0!@`=E -MP`/.<\:B33X``````````"$@(@@````````!>"(``'@```!T`0$`#`,)``P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``G=7JO$;!B;"4)>R-25/O*Q&3`==`A6[U!I`+*-^-MDU(XZ=WF -M'/?*WAX,%=U$5>%PNGDI```D`$QB5HA'HSK:TS`($5\4-.<,98$W\?"V`'FV -MB7J$1;\I```<``!`!!.(:*VGE-K>P2RK^?.!L<@G?`O1````'```0`57NH?/ -M?/?V7",@`+R^'NE,053*J543MT:+K`<`7````%P````"````10``6(7V``!` -M$0``P*@!`<"H`0(!]`'T`$0&*<`#SG/&HDT^```````````I("(@```````` -M`#P````@``!`!@````KE=,+%[+E(+?M110!N0FL$94`Q8543MT8LO`<`N`$` -M`+@!```"````10`!M(7W``!`$0``P*@!`<"H`0(!]`'T`:`'A<`#SG/&HDT^ -M```````````I("((`````````9@A```@``!`!@````KE=,+%[+E(+?M110!N -M0FL$94`Q82(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MG=7JO$;!B;"4)>R-2 -M5/O*Q&3`==`A6[U!I`+*-^-MDU(XZ=WF'/?*WAX,%=U$5>%PNGDI```D`$QB -M5HA'HSK:TS`($5\4-.<,98$W\?"V`'FVB7J$1;\I```<``!`!!.(:*VGE-K> -MP2RK^?.!L<@G?`O1````'```0`57NH?/?/?V7",@`+R^'NE,053*J543MT;D -MWP<`4`$``%`!```"````10`!3(7X``!`$0``P*@!`<"H`0(!]`'T`3@''<`# -MSG/&HDT^2*V(@S9_R-XA("(@`````````3`B```P````+`$!``0#```,`0`` -M#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``)TPK(%FM<4W -M\UY!;CTI-HA3-"G/\OC`N89LS2HSXF)WGI!EI.94+G2>I_[8M_CD="(^99UL -M9I#3?-WVU,#;&=05'ROP3\+-C9J#C:KLV!N;!`V!5"C-!Z?F&,D,X_HQX.Y! -MHL,%3_1*#FP/B$I7',%G]XR9HV2D:S]W`K0;KBB3*0``)-+N]TF5#0F&5QLY -MS:2A"HG9.LWG00KOOD[<0O";$)*K*0``'```0`36%0[61GW'/(7I254^RS+? -MO3@TG@```!P``$`%@\@UC?T_?E!PRLL5/=>UY@4PY8!5$[=&<@T(``P!```, -M`0```@```$4``0B%^0``0!$``,"H`0'`J`$"`?0!]`#T!]G``\YSQJ)-/DBM -MB(,V?\C>+B`C"`````$```#L(P``T%$&MHV2]$B)>NAY;CD`C#Z8U+Y@C)D@ -M0Q_(@*.N6OU$4[XJ]V`>O_3Z#]"3L^ -M#+^T"WY=U[XC5Y9^M06&1Z0N\[F/;-KZS36/,3_Q;:K:A//*0ZVA9O1OT0K^ -M#;O=]JRFZ<1\"(=W(!E`4EG36[P.]8/BZI,N-7T;VNNPY=STJ[M+40AN\\$- -M?E43MT;T)@@`O````+P````"````10``N(7Z``!`$0``P*@!`<"H`0(!]`'T -M`*0&B<`#SG/&HDT^2*V(@S9_R-XN(",@`````0```)PD``"`XVU,8AO4Z@SQ -M6\4;)$B/BVJ;V].IXXNJ?Y=M,61"IEJIIDS'^P!)2Q%S`M47&(5OD)^%F[%Z -M]T_C6'&.PDPH]30Y:$$>N89*?MB[Z5E^`2CM#0B%\MY9NAT5 -MM<)WKC+4FRT3;<1^;#BN.R^)9%X)PU[S>]GZ>S_!1J&HB>4Q+=6M[;DH6YQ-)/2[$NHQ'<]W0B?EH -M\2!!0%^5K?,KBE43MT9%5P@`_````/P````"````10``^(7\``!`$0``P*@! -M`<"H`0(!]`'T`.0&R<`#SG/&HDT^2*V(@S9_R-XN("0(`````P```-PA``#` -M+`NLG?10*'_BF^$/Y$XPBFA12GPS&?;K-P>2)B-)_)*Y*R;LYC/\N.8N(G53QA%TLD**:W'`B_K-V,9KX"86W7ZZ$ -M!H^B_[ILB9?,T83</]TY)?82`5.+B`D(`````(```!,*0``,*I8 -MG<:*[#XT3Z_-FGQ!$T\MB/+9SR[(^()E24I!>JI\,2:>:H8\K2HVE5CI51.W -M1IEV"`!L````;`````(```!%``!HA?X``$`1``#`J`$!P*@!`@'T`?0`5`8Y -MP`/.<\:B33Y(K8B#-G_(WBX@)"`````#````3"D``#"<=Y1&6X0#WWFV-YO -M/"G]0IRH[`[E%94SB"*IE:"<5^E*(`7/I+;:;HZ-3EA]Z-Q``0-2^N2:$_#?MJR)JC -MAB%:;9XF\24NH`1AB`G)JSCF,HM@O[Y*>7-0U=M1$1X*@>,6"%2^QOO2+2EW -M-9-D)`\:>9-J'F(\\&KKTX]!,@E]@CHY,_H[WLFO]/8WK&8/6IX6VE]LI0T9VU'VV"U4*)3C -M\,2&51.W1K:="``<`0``'`$```(```!%``$8A@```$`1``#`J`$!P*@!`@'T -M`?0!!`?IP`/.<\:B33Y(K8B#-G_(WBX@)`@````%````_"$``.!X?ZJ;)UX$ -M.!&K*9.W"G&&C`ON1Y[POM3Q?S)-6PI2G)XXF[K$8L6,:-XQ\U`X]>B];#_A -M\$0DCQ"<"-HUG`[G=AJI93\4.W%VGK,Z4-Q&)V%H -MWV*).Z3[9Z6LKI91&^[_S,C;G^HVW6`6Y@:>N=FJ;JX$51.W1A:M"`#L```` -M[`````(```!%``#HA@$``$`1``#`J`$!P*@!`@'T`?0`U`:YP`/.<\:B33Y( -MK8B#-G_(WBX@)"`````$````S"$``+#)B,G#/DX!=CGL%2BR**`U^D"Q -MPP>`48=3S-E.PIL3*33S.E]U$@M)*#$B125=]AV?MZ_AX5QFLHGB?,/TZ&(' -M?AHW\AVF$>JR-L8:L>B<.8#A&Q@`LLMCFZ+IS3Q@LG)WT1O*N@QKQ;?%;U.`9TD/"OQ!49:(-"UG.@ -MWI`JT3-S!S`MI`^1Q$^+51.W1OC."`#L````[`````(```!%``#HA@(``$`1 -M``#`J`$!P*@!`@'T`?0`U`:YP`/.<\:B33Y(K8B#-G_(WBX@)"`````%```` -MS"$``+##YH/I-'2T/S?<&V5K';M0;;2M_E?Z26@XO*RZG*6MJKJ<^*9+XF6- -M@Y]778(WPIY_F;>G1&+PSV4I7_Y.L?/MN.(V -M0&13."D"[H/*T2EO&X2]W,`$4OT]!*)1QE>2BJ[6QJB@4`(0K"&X&YTB(M^G -MD%O7[U^;X0(YAWY3=TL$W\@??\N8#^[5A[V=0<^W>^1ON3UD3*.Y^)LG51.W -M1G7K"``\`0``/`$```(```!%``$XA@,``$`1``#`J`$!P*@!`@'T`?0!)`<) -MP`/.<\:B33Y(K8B#-G_(WBX@)`@````&```!'"$``0!\V2VT]C>'75%LM0,3 -M<-E2$< -MQCF^7`VO?X->_4VM5T@_2E(04_M=`1^1<>.'Z<[&H1R%&E*%5-0?%,0FR+TR -MV*D20IT,0L!EPCWG5@-_+&>MJ"J+RV0N8)2@T(_[LU'@T -M'2+/KJA)UF0!1,NHGSJ3F7.#KR,`@.Y[(IY_^,M.W`M//K%$^@^9-6[JU^B5 -M,_]`O,@1[X?`P[5QXE!5$[=&RO<(`!P!```<`0```@```$4``1B&!```0!$` -M`,"H`0'`J`$"`?0!]`$$!^G``\YSQJ)-/DBMB(,V?\C>+B`D"`````<```#\ -M(0``X!QFJ0'1GP8A=3UH<_]Z42-SL:BWW@CF]:JT@14KG$&:`\!-`JD]L -ME#=2H\%1(>U0>W6Z#.XP%.`<'GUO*\P%"!_\U('_<+QKZZ7.UE""C5%4@HR? -MX]&$43OP+IQWH(&?JA26U%9VCV/%VU^U7IVS$Q[_1B7+RRK03+G47>1?<5$. -M^>#"XP,HQ172_GD3^,#;`M\+$1*:#0@D$Z%TZ^Y;.0Y,UI0:69R]&4%L;]AX -MEN+>WN[)(XZEFS0-@*A>/QIB177&323PZA5&UV(AGXLM18K?YW/U)T,QNM]5 -M$[=&0P<)`.P```#L`````@```$4``.B&!0``0!$``,"H`0'`J`$"`?0!]`#4 -M!KG``\YSQJ)-/DBMB(,V?\C>+B`D(`````8```#,(0``L`D[HD40<_%-DZ`$ -MV<$T`&,1YU!:RRP'`82MZOVWN-IU43').J3U2$Z3A,3'"G$:WAY3?*#^J<[F -M]7^^/Q^:7%>)WAU7OACE5CY;5.;KJ5?Z#=M0,L2QZB&RN%S2+<\`O-?I07G@ -M:1#"OARYG5Y*@]7T?1<4.-1@OS'*A]1:BCM]]SP7,S2C2.")JFCA6X5,BQB" -MOJ\2K84A3M>);]:W-2W!I7+]65ZF1XX/MWM5$[=&T"D)`.P```#L`````@`` -M`$4``.B&!@``0!$``,"H`0'`J`$"`?0!]`#4!KG``\YSQJ)-/DBMB(,V?\C> -M+B`D(`````<```#,(0``L%@TP$V1=DCNWL'6,O@DC02*.\0*:HX-Q3>2^X&Z -M?>J1.O/Q\4W_I&Y5V*M*V*/X%Q9\$C(J(+813$JM1G$]MR8@>A+NELQ,,(C0/(@;294@=,-,*1#TTPW"3&L -MJ:51V(CI9I#&88G[E+7>Q@=HQ/Q<+B`D"`````@```%L(0`!4/>6 -MZV]7RF7XMW.*)\)=/84S]#^'/AI!8T#J?MU_B;DI7@B.G3@3.->C,X4EECHH=<("15F41:ZO[IKC/6IM,HV)V09P3 -M?K8.5D=930E]#"@*4Q$HD5S'47HNZ7'Y/U`5GX5V!'36;]2UCRU^R=^UI\H3 -MFH$91`\]T0=)8'.?9L*ST$)R1]+3HW&SPQU>OOC2`5F0`E;J+9A,RVF;0$"J -M?C65A$-K,D/WL$2L[C0VQ_8L!'[QO?S54NH[&7,]^>YM@C:RQ[3M`'=H)CPR#Q&%ZE/+ -MK!<+F(JQ#8KE"@,]4N$T54)V`Z\T7%L$O*41K+DWX0I*][.6IF.+7QE*]!DZ -M=@TI'Y,LHG2AP'L&KIO"Z'!%'U43MT:5J@D`?````'P````"````10``>(8) -M``!`$0``P*@!`<"H`0(!]`'T`&0&28,6Q30ZB%3E!@L=:5;2V4LN("4(```` -M`````%PJ``!`>^L)<#NIZTCX(;$R<#+"I(>4]\'MN6$]`6\3]:QRYJR---'` -M:5H(OM\#H*?D6.;<;2J(#FK/]@EP`H2Y51.W1NRU"0!L````;`````(```!% -M``!HA@H``$`1``#`J`$!P*@!`@'T`?0`5`8Y@Q;%-#J(5.4&"QUI5M+92RX@ -M)2``````````3````#!U:MX+#_PJ\B6KV,#PKQ.[BG=]D]K3\4YMV__F=@"E -MW_?<`KUP89GPK0XB7%43MT90Q`D`;````&P````"````10``:(8+``!`$0`` -MP*@!`<"H`0(!]`'T`%0&.8,6Q30ZB%3E!@L=:5;2V4LN("4(`````0```$PJ -M```P\@[+21.NC.B$MR/NV3&X6/5B_JMH6S4`SZ\W$_.B[I`Z'P)F7GJBAT2) -M#%!5$[=&&=4)`&P```!L`````@```$4``&B&#```0!$``,"H`0'`J`$"`?0! -M]`!4!CF#%L4T.HA4Y08+'6E6TME++B`E(`````$```!,````,!DX$>&V3R;9 -M_;)"(``'@```!T`0$`#`/_``P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``SN4@D71TKC]S[HM@TT77-2T,(PF/>8<"F:4(7CDD%E^QKS:-A`8Z.U"L[P+K-&`&*\7X=4 -M\F%+^E%JXBJ9F30.TD''8A_3J&J,ZJ>J'6X-9F[9S/.L1P54'D8B?,K])5=7````'```0`4^BBD&,J8F:2P\ -M%=$9L\'%+I:M,%43MT:^X@H`7````%P````"````10``6(8.``!`$0``P*@! -M`<"H`0(!]`'T`$0&*>T=Z&_SRM&G```````````I("(@`````````#P````@ -M``!`!@````K!D2N"KVZLMIT=Z&_SRM&G```````` -M```I("((`````````9@A```@``!`!@````K!D2N"KVZLMI/>8<"F:4(7C -MDD%E^QKS:-A`8Z.U"L[P+K-&`&*\7X=4\F%+^E%JXBJ9F30.TD''8A_3J&J, -MZJ>J'6X-9F[9S/.L1P54'D8B -M?,K])5=7````'```0`4^BBD&,J8F:2P\%=$9L\'%+I:M,%43MT8*%@L`4`$` -M`%`!```"````10`!3(80``!`$0``P*@!`<"H`0(!]`'T`3@''>T=Z&_SRM&G -MW<5`D@('/O(A("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`# -M```(`@```@,```@#```"````"`0```(H``"(``(``/]JC@L"[647QEW7)+N^ -M`.CA*;_@E3S4YWL(-37_/0A]5M1JFLBC=7^.-]*^Z@WDYEQ%2A1>/&2UW+A_ -MN_OO-Y&WMC$C(ZB2HH-HFSN'GT$\4$(W;"O+H%D##VW'5&0N&HIDJ?;1C4!K -MIUIAK4Y^WYVTV7IK);D]QC2M8SA]400T*0``)`%('I$2FB6_XW##RF]RHW&G -M"':Z[LC=JUE_PD8,?@SG*0``'```0`0WGEA'(-;YJ@\;LVZ.XU#Z+I%/@@`` -M`!P``$`%.AU1C%@UWH'+*R<)AO\\K1I]W%0)("!S[R -M+B`C"`````$```#L(P``T%[NR]6.>SW71#AXL04A7^LDPQ3%;RQ4CDODO0'" -MI>S4T_OS7<>.[;/V58*VU]'A%BP"HLEE;,0T)HOP[>2`$>E9,K1U1L^+6CLN -M'6BKOW0KO3B7"[(>+:+8[0@H-,\C#-Y:J[ZY^>=#G>V#?"(ZOF+1LJG#UU*Q -M'MRO+NDZ"D&+38JI`LI89F;H\K'BV19U-<$1YC*F^?/!AK=?A^`'3YSAM'_[ -MGK$H0BT49WM+T= -MZ&_SRM&GW<5`D@('/O(N(",@`````0```)PD``"`%$>V6F-VA.@E!Z*.\0_( -MM`B&>BB7_UEYU@92K=:#?#&3V.OV?$HR[\.H3O<5^]7IR#N"Z?%JZLOP^Z17 -M*?*5GDHO4ZQ[DS`;;T_/5E43MT9<>@L`'`$``!P!```"````10`!&(83 -M``!`$0``P*@!`<"H`0(!]`'T`00'Z>T=Z&_SRM&GW<5`D@('/O(N("0(```` -M`@```/PA``#@^^;.P-W:_.PF94P(."AZ7=%`;-PEQ6HU[BR9O61Y=4Q[LI;: -M<:/(B&)[UU'":+TL*$JPF<@^GG>2;BO%.2O!W/`RWB(02/CX!)<8/1.6`J&PDR_O3L13[\1W$'C=H2K9?B)-T%C/I;)5A%-<.`:O\P -M^SL+EK]'`@-,X"+]RR\K6H[?OK9?G.D7ZC#5%;H2+G%`,0O9^=^Y?VDGT5@K -MC<0RJE43MT9MA0L`_````/P````"````10``^(84``!`$0``P*@!`<"H`0(! -M]`'T`.0&R>T=Z&_SRM&GW<5`D@('/O(N("0(`````P```-PA``#`GE&U'6'- -M1EC=,J'C4DH,ON:&H!7S=G!?PAP82W`?NJ%O9YSF\4/*#'0^B#S>10;H50;) -MZS2B@FV=/LP&'ZS"=32YM?#^7P\O!UO#4<8D:I%Q`$KX1N-\_"5K/XP]TF+/ -M.2N6A+T(AJ\%:"L7`Z?OF**[(#VTF$$K[1U^WS6\\5@2Q%-M65&OW97]64\" -M3]<@)YMDR>N9`Z3[JM2L^R;\V?;;!O%[B'=%`=Q09?AO\\K1I]W%0)("!S[R+B`D(`````(```!,*0``,%.09.5V'/2* -MRQKN`">5SG.T@JFZ8&8\`7U%*2$:OZ=`(:]Q@4XF165>LF8X51.W1ABM"P!L -M````;`````(```!%``!HAA8``$`1``#`J`$!P*@!`@'T`?0`5`8Y[1WH;_/* -MT:?=Q4"2`@<^\BX@)"`````#````3"D``##Q1HGQS3[8#=G.H]:H^V/';)^* -M/S(@SL6(#:ZL2(;IZR89"N'9#E_"%6EFOU43MT:T=Z&_SRM&GW<5`D@('/O(N -M("0(````!````1PA``$`["7,JV6UJ25#FQ6V'CQT!(>P,64?TEP<:KTT>Z`I>K&&2A:/,2[ -M+3.VM'X@#K3#GL:W+-RH.YQW&NKL32G?>__,9._Z[Y_;I=;[H#STH$C;+H;8 -M@%Q@,`'FB#K.0M&_Y("FH6F,PS)E+\'O)Q0(C3H -MUV\4,]C&])[HVW-;IP)M>)P:_$["0>%[_HQ>#3KM;R35X$$`1\I_Z9ZX+,`1 -MOC-(0.&4QPLE95@#)/_0:]AJ;55H2RJY=G@<-[[_8)2TU6EQ1"MW/=+#51.W -M1B;3"P`<`0``'`$```(```!%``$8AA@``$`1``#`J`$!P*@!`@'T`?0!!`?I -M[1WH;_/*T:?=Q4"2`@<^\BX@)`@````%````_"$``.`T.0E@M6:]D4)U4#8L -M&+32V>.$I$Y0F&)8->;S(!W">?<;^.#UJ\.@;+!R0;_5OE65.ZX5@PMO4@_J -MO`,=_'DV&46$YL(CGQC#$PB1X<4-PV`KTQ'1-/`DQ.B&)QX#$L;EY:PI3F?U -M(#9PDTF3[##N7O*I%)VLI>(I&K0-5S=Q.]+$DHOT#'L`AP14=W)^?E?QMN%R -MX\R+>I^%RP1?<"OQ1D!Y)4O,(P62#,9-U -MAC=FV?>QE*PO5/I5%2(J*^KO=<7JK$6F$``X!PR#_%RO0;`/^VSH4H7:J;L+ -M;H$XEYL":D4-VR:-B8RD7,!)F\L96M4<>2T=GMG -MPW==IK)#/@4'51.W1@T%#`#L````[`````(```!%``#HAAH``$`1``#`J`$! -MP*@!`@'T`?0`U`:Y[1WH;_/*T:?=Q4"2`@<^\BX@)"`````%````S"$``+#[ -M4M-";QG=NU.D-[-#8JX;(-2NW26'>YSN5_6^?\B2!F>']W2#@.P$0:D9A+RM$!-X)FF&J66KV)QL6:,'::.;/Y0-A0G"0 -ML33UU5Z;0&@S16FW)4LB[>@=0GW"Z.5,BO.163\-1;]$YKI4$FVU'_7-BSV) -M"8%!E-\85*3C5O[@R12'D4)5>/=LU"/_D+O9(VMOS(H`E:HSO9GC8N@W/N=Q -MHQ5VKG]+UR`?=,,4&=R,4(@KV3>M=T^[1]O#-E0;U61J&-P('F,P!/98)59X -M[FX\'\C0*'!5$[=&XBT,`!P!```<`0```@```$4``1B&'```0!$``,"H`0'` -MJ`$"`?0!]`$$!^GM'>AO\\K1I]W%0)("!S[R+B`D"`````<```#\(0``X`)` -M%>T?A\2%6`I'A7W6F7RH;D*,SQ/[HZ%I;]3+!+4W6>^I6+T?@D"@-00#]7:] -M8".(:WY7#GDH;4Q1,V<4&ML[UF(OC1Q4EX4?`F"/ -MWCI.MYKC[>,H]^A&B"U.$$]D:K>UIJ\:0*I+']7GCR]\BOID_:I'A?TJD,1M -M*P:KFG*3L(DN_Y+;;64=8?'M`:-J')`LCS8&U+0&M(@\P:D!AG,*)_@<.TO& -MAO -M\\K1I]W%0)("!S[R+B`D(`````8```#,(0``L/AX9=?S;%?40KM0$CI^7NEU95"IEO["X_ -MX[[^#QXB5QL&T=VYD/ZO:N2'[?5>IX^K37_,;S\P.3?,$[@Q5Y%[N\.P:,KU -M#K.@J+CM17.>8T:E]0_3;"473.=5$[=&D6`,`.P```#L`````@```$4``.B& -M'@``0!$``,"H`0'`J`$"`?0!]`#4!KGM'>AO\\K1I]W%0)("!S[R+B`D(``` -M``<```#,(0``L((JU$=*:CY.<^.2]C9Q.NI]Q$C)#I(IEU#P%FK%8Q$?9Y^T -MWI.&V02DVBM)4.;`6_C1G\QT@/KGQ^2?UA=\\WYY1X6]A1.4Z#[Z3)\P"/I@ -M4;VS&X"2"^I8$S;&TQ^&#V#G=FLODX\!F7RUVK7.50A*J?)Q*=46A6,59!`0 -M"&ZIAU8;J0.-(YHLKD%[]'DEE()#@-[*K\:*_4FTYJ?, -M9%Y5$[=&@X8,`(P!``",`0```@```$4``8B&'P``0!$``,"H`0'`J`$"`?0! -M]`%T!UGM'>AO\\K1I]W%0)("!S[R+B`D"`````@```%L(0`!4%M4=]^0C7V, -M.4#MR==RZ6J#IB0:IHG!N6F%-J;`WDZIT-/91G8?L(C]7_"GB7:2Q!M-.`1S -M.0"N:OK+O(Y+C1E,JTZ!$MK^>JU/+54\8FB.*B*=CW1B!)@&T&,RXD$&_9^P -M!O23L2;L^U>0TF>P=;-A,V*T\2MX<*S\9[54KBNB%EA/-\GY5]](PDHEWAGY -M+^0PO\.+2'B-7^,%21[EL&W$+<9/+IY!]MV>@IW=3PNF32`0MYFUC.R)U1G@ -ME1O/7P3T_4VN9#W2.-A!F-0\Q%8,VU(/OY4'3SMUC/"R8$/";>;V;@_"+&N. -MPIQ5BKW6:_FH1K2"KW3KG+-!`\(\TR+X%:@^@,W8*5?PC4D>CS3D)/`&+ALW -M?64SY?>YD2"L/FG>!?*X4BD@71ITQN%AO-E`'Q:RA3/]5)"0@?8,Y.9@.X=' -MZTPHT33J$5H$51.W1O2Z#`!<`0``7`$```(```!%``%8AB```$`1``#`J`$! -MP*@!`@'T`?0!1`H](+@=0^,P&50PM+""%383B?FY`M`_ -MIO#4(WW)FG?YDDGZTYZ>LGM%.^VJA[K_+J5?*L961%5:+OK'U8JV+9=P:>'S -MO*(78.J0?&\1!=NLBQ\.V/-?U(03JWV;TI$!QXPZR7H91,<7_%V9.8XC6(KE -M*.75/C/HFK0/UVS'^>)`&ZXXR`PRJ*R(#!K9 -MCJTB(M`:)>0/,0[RIW9]L\\?><+;]MDR'I"KYS?PFOQ8K':)X"G_",D98.DY -M9*:._9QAI7**2AB66LDXX/(9T -M`7G,)#4>,<]T/&>=/%43MT8*X@P`?````'P````"````10``>(8A``!`$0`` -MP*@!`<"H`0(!]`'T`&0&2;IJ'6-,NU;KRN4;9U"N;>\N("4(`````````%PJ -M``!``V/KQ*V,EK5\4':B9I.?PQWXF01A?GE#>451.W1A[M#`!L````;`````(```!%``!HAB(` -M`$`1``#`J`$!P*@!`@'T`?0`5`8YNFH=8TR[5NO*Y1MG4*YM[RX@)2`````` -M````3````#"FN$[4]/TWD';Z]DM>/4Z\N("4(`````0```$PJ```P!&W9 -M'FWLS-XUP6LV#2XQRM'+$[S4/%"Q.JI[0>@2)'GZ6TFF'&ZSE=)>(J15$[=& -MA0D-`&P```!L`````@```$4``&B&)```0!$``,"H`0'`J`$"`?0!]`!4!CFZ -M:AUC3+M6Z\KE&V=0KFWO+B`E(`````$```!,````,(5V"Z(8BP?K$S.KP+>@ -MF[`/R*GVL8H*S-M3.B1]$?HSGJM`4VUJSXM;C7J:51.W1IP$#@"8`0``F`$` -M``(```!%``&4AB4``$`1``#`J`$!P*@!`@'T`?0!@`=E>9,?Z,3RGR<````` -M`````"$@(@@````````!>"(``'@```!T`0$`#`.```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``6RX.:E(H_U,_^:)7;6L$G&@?=&Y]LQ>'=$"F53V,V%@$:2R/ -MR'[Z>[;Y?5F]`)JL:6+1(8`(33:L,_2BJ0@7;&;P]8,B;G_C)VSRHI```<``!` -M!%4)J?(:O&]<]AX]6'=$"F53V,V%@$:2R/R'[Z>[;Y?5F]`)JL:6+1(8`(33:L -M,_ -M2BJ0@7;&;P]8,B;G_C)VSRHI```<``!`!%4)J?(:O&]<]AX]6"!,ZH(`30NE3*0``)(V_>Q1=\M5P::KAI9@2,Z6-&&KO;E#M -MVZO;RBU>D7&6*0``'```0`0C`B[/L[.0!:L54_FUC^Y94(''N@```!P``$`% -MCH_23TV^63P(6XVU0ETGD*W4UFFVAM"(45:B/XR -M(S&L>B_VRK>CP^\!RV5\#T:HFQ/G]-(>'ZW=^8[F=QXFI729PH(.RC;K6S_, -M1"7HBJ=6Q('*$T]:\F->8M\OC,OU3FJ1Y1/C4&D7_A$'GFU#-'T-FS9IE?G: -M?XM0,U`H"RPM3^2N4GWI?WT#?YS]?JT*X@O.EBQ^3J?)(?^Q;TCGB&ZXX!3I -MBEZOGN"&C%CM;.)D<\KIDPUO-X^26E&GV:5IPB9G'EP5V%43MT9%DPX`O``` -M`+P````"````10``N(8J``!`$0``P*@!`<"H`0(!]`'T`*0&B7F3'^C$\I\G -M(VK\G8E1W-@N(",@`````0```)PD``"`[@='H70[C@@CXN[;4OC1!4[NB3", -M'&]*WNEA59>Z0VMNG2.I4-\K)NXO0V0:H&,]/DKH=!)U1\`DDGJZ%I^W0N6U -MS!\:F@(SSX)'K]+&>N*"F4VH'`VG*Z`:'W$:8:S\BZ5@($N+CE>OP13_#Q.U -MI6S-IR'GD5=BM7].-543MT:&L0X`'`$``!P!```"````10`!&(8K``!`$0`` -MP*@!`<"H`0(!]`'T`00'Z7F3'^C$\I\G(VK\G8E1W-@N("0(`````@```/PA -M``#@S>(/+R/!>KPOTC4&C#0N>P=/)']Y76$J)1#1*#8/N'5(>CX/PPBOU;&A -M\Z76ON)PUN[9SBFNN)D@$>MI#!GQYFWJZM=##KF\$.@QH6&5D.PY5J -MHGS3V&-87"Y5L?AD,)=!,&?<:/VM9%CN,%ZMFK)O^;)A_#E43 -MMT;'O`X`_````/P````"````10``^(8L``!`$0``P*@!`<"H`0(!]`'T`.0& -MR7F3'^C$\I\G(VK\G8E1W-@N("0(`````P```-PA``#`*0_V9HT,AUL8CT*E -MHF)Q(V;*]U`DHR/D=F#7$:5`TZI/[7"/5)/^T<<$$\"WDLTZJ6[_UT$<6R-S3AV9%8E'"42#`Q=X*0<6=\I)8,B -M)G"8D5=8D(`W:EQ1J/%(`.:ZO)Q)`C/C(FWUK!E[I@J9LF&"^R!\V7&]K&!* -MZ2%Y\EJU=^%":4>HJO2E!!4Y6(3X"K,HF&]5@PO/2Z(CYWW)_B#@^NA5$[=& -MZ<<.`&P```!L`````@```$4``&B&+0``0!$``,"H`0'`J`$"`?0!]`!4!CEY -MDQ_HQ/*?)R-J_)V)4=S8+B`D(`````(```!,*0``,/]SY^H[FZP13VAHOS/] -M5IPXIP-GCB6Q;>F:!ZVV+HS0B&9+%4\YBY5TFO\751.W1G?D#@!L````;``` -M``(```!%``!HABX``$`1``#`J`$!P*@!`@'T`?0`5`8Y>9,?Z,3RGR;Y9J[VJP,=G*SITYP$]Z##_(VO -M6UL*8!P$>:3$^6SSREO@]!J/I3PD;KN>@8-)99&-YQM'/#& -M&)=-O`/'J+_B0B -M2JM6J81!<*ON*,Z7R:R^F(&1J3'-P)P*CP4.;R#,55\MM2V"A&^D)84>MW^_ -MJY$L6]!X.A-`KR5OE6-=;IO])UC4YU?C94:0Z/_+":B=X-@SEAIP1*L=-6%. -M5,I![GQG7R3T1G?MW0)YU2/IFAG\CX\;"U9(*&L+HAWF\&PQ51.W1@T+#P`< -M`0``'`$```(```!%``$8AC```$`1``#`J`$!P*@!`@'T`?0!!`?I>9,?Z,3R -MGR, -M%'6$X2[7[65B<6P^0G4PR<]7-7XCQ(F>PJM3X(K>%*1RW$,)Z7W'VPS#'O5? -M;7",B9@@NB@(!XD4@3-$(F2 -M:#C^,G\@?<=V)+."Q&T%FD@!F#P>51.W1IT:#P#L````[`````(```!%``#H -MAC$``$`1``#`J`$!P*@!`@'T`?0`U`:Y>9,?Z,3RGR$JR32+$H$9(_R\ -ME\U!WJ1T7Y%MW_'*=BUP@7S&EI7?>0Y@%XR`Q0',K,EJ8--A&I]3>6ZX5<+N -M""YXHHH;*\M03FA&=_`-452ZLP::J_S4G`DX]#JK!H-@'^:["/A9&'G[Y9,?Z,3RGRY%RL7`O5A^G+@>F0]>\]G:+.DC@/U5A.W1LH8```\`0``/`$` -M``(```!%``$XAC,``$`1``#`J`$!P*@!`@'T`?0!)`<)>9,?Z,3RGR/6VV+*+ -M;]ITA\(&?PE%KV8<0:%1>$7BT5129(IJN-&2G#96,&_H&OJ$<]G"1<6_6L!F -M3T;$6I7HY8C!]>=\A@/(1HL4F%`U'#DKZ6_*#'SS9>2K_ -MP^[XP0[Z3XY&[T90F]R>:E:ZN'T,2.E<8]\"V#[V2M3S.]DYE52'VI!XD%)V>C#_W -MV')E51[#7D]@S'^(A3>(_R[P%0&AFL5ZBL!JDMT@,E,(>@XV?%C._8R-[/TB7:?G%E3"2S6`\O,+"2W*^:;,3:]W -M)W9`<,RQPNV!F;G"I(TA\+\XJ3-PL)NF;M00,9[#6I1EH6-`"H_OJ6^^">.2 -MV^Y!KNT=`)=&KU@JS8\6*T;-4=48")(^Q1K*J1`;4716$[=&3S0``.P```#L -M`````@```$4``.B&-0``0!$``,"H`0'`J`$"`?0!]`#4!KEYDQ_HQ/*?)R-J -M_)V)4=S8+B`D(`````8```#,(0``L-6K>K43#BZFX6*6_MK[^J83;6+%R6O5 -M(=JG3MRP^[#D!8^!+FY*AV>82,N*"#B;G-KY9VX%_P"`7REYNEA+FM[ -MGHZ(>$S[S!LX`'V_J9+66@/;DEZQM$X2(7V>8(47?8!A@2"5T7L=>?1='[N#@[.3^`QTVY`UY]DFMSDP`O]"91%IZZ+)=5 -M;H-R2L,PZ\.Z-7-&;[A6$[=&NU@``.P```#L`````@```$4``.B&-@``0!$` -M`,"H`0'`J`$"`?0!]`#4!KEYDQ_HQ/*?)R-J_)V)4=S8+B`D(`````<```#, -M(0``L);^GYDQ@THIE>-AD31R*NDP'I_"N`2:%I5'A1^OW"7)L99*(O`684VI -M`@HR=2!68B(6J8IC-17RI780)ZRU0+DI^D0>^`)R@L\J\IKL,2'&G*_=1VPYW2-O0!Y9;RFEM2DU8+ZOWV(OE"#P4B%=;*S%2.A -M>(,;4X$K@:SN*XF/,5Z\69\53=7\08E>?#`KZI[\8%<5T-J9"=FR%.I(+QCH -M?A=G5A.W1B&S``!<`0``7`$```(```!%``%8AC@``$`1``#`J`$!P*@!`@'T -M`?0!1`9,?Z,3RGRE3>BAY0$B%=[@[(*F"CX3Z?0MBWZ??GVE!D6XPPS2W82$F]\3PW -MRU@18C9\X(_\R..J[>#=ZW\>RN:32]0*0X:HRL1PJG)G;I`'_?Q,/H$V)3ZS -M_H=V]UIN+>".#XFM1[.I)^%]CD-G0.#&9@SJE+Y_G3['I>HYZ\3!S.@E&GV" -M!AU>!4DW\V_E$9X42OZJ<>//(8X",V5CA4VS]Y.B,'W"@T,E=AI?(J8X]5C8 -M5#$W[:=N%9+^0N:5C[@$R)?M`'6!E`E*"1,7I0AFH-7%-ZM`,DN]\8+J&3/R -M)PY(8Y``!`$0``P*@!`<"H -M`0(!]`'T`&0&2?Y_P8Z9:NBSA'-S-91G*WHN("4(`````````%PJ``!`YE=Q -M<94\(SJ8^+IE^*R>Z#!\EM^?^V]3$0@=W7J)-Q>_TTOY-\S;1";MZ+40 -MXLLOZ2B5/`HW,OO45A.W1D/E``!L````;`````(```!%``!HACH``$`1``#` -MJ`$!P*@!`@'T`?0`5`8Y_G_!CIEJZ+.$BX@)2``````````3``` -M`#!X0L^C*\IJCT/W&D-T(;!>F[/5<$%!3A9FA)WIE()XK'A'":Y)<,==6XA+V24&K*N?[D;YU;1S24F-S7AU7Y6$[=&9@$!`&P` -M``!L`````@```$4``&B&/```0!$``,"H`0'`J`$"`?0!]`!4!CG^?\&.F6KH -MLX1S"(``'@```!T`0$`#`,````!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``?NDP#$B!T4:DOW+,>67!4W4PR\I&PN]^8/OS$\Z)5E?"Z-]].,?-9H"K -MJ081,Q@H&B3Z6T71,A$6_67X`XLP8,&M`).?=2>5,4(N4NJB_+QE[AM[]6:: -MV+^O=>9V;,FH@*Y<%]?\N:!B+7&O-,DE0D"7;H(+^,':JS!1)?\WZ.TI```D -M&_T0F_G4QL,*0"SHVKBYU$OIXF2R?A&2A%3T,Z-\TY8I```<``!`!.O20CAU -MA$`\J?;<>7QSOMW452(5````'```0`5TC1:=JYRP1$X;>_5FFMB_KW7F=FS)J("N7!?7_+F@8BUQKS3))4)` -MEVZ""_C!VJLP427_-^CM*0``)!O]$)OYU,;#"D`LZ-JXN=1+Z>)DLGX1DH14 -M]#.C?-.6*0``'```0`3KTD(X=81`/*GVW'E\<[[=U%4B%0```!P``$`%=(T6 -MG:NV]=.R(AM.RI!]6$[=&A%X+`)@!``"8`0```@```$4``92&1@`` -M0!$``,"H`0'`J`$"`?0!]`&`!V6S=2]8/@GTT0``````````(2`B"``````` -M``%X(@``>````'0!`0`,`P````$```R`#@"``P``#`$```R`#@$``P``#`$` -M``R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P`` -M`@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``!^Z3`, -M2('11J2_"(``'@```!T`0$`#`,```$!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``?UR]*-V="?G740%M4BI;`M[:/;$'E/E,"-`3BJD7 -MIP`=3P%VQV"LYJ\B$BE'&3&U]T?LH=R_S.5VXMLX$8V?[O9,.?Y)^UZ`S`=Z -M2[&Q9R`Y<#-'(0Z$G_.@W))QX!U]6A.)CJ&SPOS?;TV42K+DJ]9>FTOF;NE" -MTU5VYLD2.8\I```DS'DE@#N%OC4',>=$3R+\X_*5SF3.%^Z=C(E./R"A5H@I -M```<``!`!`,*M:U&*B=-*XA5F5^'!M#\MCXF````'```0`6A-=V]>,2/X($N -M)G@C[J&Q2#$-,U<3MT:XE@P`F`$``)@!```"````10`!E(9+``!`$0``P*@! -M`<"H`0(!]`'T`8`'91:#XQ$Q0_X````````````A("((`````````7@B``!X -M````=`$!``P#```!`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`# -M```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,` -M``$#```(`P``!0,```@$```"````"`0```XH``"(``(``']VCVQ!Y3Y3`C0$XJI%Z<`'4\!=L=@K.:O(A(I1QDQM?='[*'@,P'>DNQL6<@.7`S1R$.A)_SH-R2<>`=?5H3B8ZA -ML\+\WV]-E$JRY*O67IM+YF[I0M-5=N;)$CF/*0``),QY)8`[A;XU!S'G1$\B -M_./RE````'0!`0`,`P```0$```R`#@"``P``#`$` -M``R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P`` -M"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```. -M*```B``"``!_7+THW9T)^==1`6U2*EL"WMH]L0>4^4P(T!.*J1>G`!U/`7;' -M8*SFKR(2*4<9,;7W1^RAW+_,Y7;BVS@1C9_N]DPY_DG[7H#,!WI+L;%G(#EP -M,T26`.X6^-0"/NH;%( -M,0TS61.W1LS!`0"8`0``F`$```(```!%``&4AFH``$`1``#`J`$!P*@!`@'T -M`?0!@`=EY2,J$SU-,F4``````````"$@(@@````````!>"(``'@```!T`0$` -M#`,```(!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``0]T"Z=UCA-RP$T/,5>8&S.,- -MIJY=Q2=QA/WR'4A4TE;9EE"G(*8/!DE6DA#3+?1VS:'S_=%>;;X+RCF)=?<[ -M/#'0599SP8+#`?D\""E`%D\)DB -MDED=#T0HAF#C-*D8O]E%%QUD3MT9O]00`F`$``)@!```"````10`! -ME(9L``!`$0``P*@!`<"H`0(!]`'T`8`'9>4C*A,]33)E```````````A("(( -M`````````7@B``!X````=`$!``P#```"`0``#(`.`(`#```,`0``#(`.`0`# -M```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,` -M``@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(` -M`$/=`NG=8X3````'0!`0`,`P```@$` -M``R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@`` -M`@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```( -M!````@````@$```.*```B``"``!#W0+IW6.$W+`30\Q5Y@;,XPVFKEW%)W&$ -M_?(=2%325MF64*<@I@\&25:2$-,M]';-H?/]T5YMO@O*.8EU]SL\,=!5EG/! -MR9=)$JTKLY)5W-3D\_[)A]0^X]_7_[(BE02TJ!++AY@L,!^1P]=6#1IP@B1` -MZ;K%22D``!P``$`$QSQT$B-Z%R,625`W71H#7'98X"8````<``!`!,TD-Z8.,TJ1B_V447'6A.W1@Y$"0"8`0``F`$```(```!%``&4AG,``$`1 -M``#`J`$!P*@!`@'T`?0!@`=E_:!\\<..#/8``````````"$@(@@````````! -M>"(``'@```!T`0$`#`,```,!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@```X8`P`!_ -M8G3+535?$JI8)-ZB[O3;1CK/_%FN=IMG@7QDE;WVZ@X:")HF+G>F55;M7KC_%@I```D@F;L5HYJIQTP -M&OUP(]_;!]U73*?!ZR(S$!`!GGWA(U@I```<``!`!([KIG`3>]N45`Y#%$[R -M[@8M=5\7````'```0`5<-"&(FB`!45HN[TVT8ZS_Q9G*)3+\97 -MT<^&:_%S;B`?5T5KQIY"/]TYA[N7R5&N*SR -MN:`L+Z*T!5DW8NNDKY+BU]T(4P#LS^0^WKG:;9X%\9)6]]NH.&@B:)BYWIE5 -M6[5ZX_Q8*0``)()F[%:.:J<=,!K]<"/?VP?=5TRGP>LB,Q`0`9Y]X2-8*0`` -M'```0`2.ZZ9P$WO;E%0.0Q1.\NX&+75?%P```!P``$`%7#0AB)H@`5%7*ZQ& -M6T\=6``` -M`'0!`0`,`P```P$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"```#A@#``']B=,M5-5\2 -MJE@DWJ+N]-M&.L_\69RB4R_&5]'/AFOQ0C_=.8>[E\E1KBL\KF@+"^BM`59-V+KI*^2XM?="%,`[,_D/MZY -MVFV>!?&25O?;J#AH(FB8N=Z955NU>N/\6"D``"2"9NQ6CFJG'3`:_7`CW]L' -MW5=,I\'K(C,0$`&>?>$C6"D``!P``$`$CNNF$8````````` -M`"$@(@@````````!>"(``'@```!T`0$`#`,```0!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``#`IT9$-EV=4;[2C2V--`=,ECM-%#1U]B];S?I?T4'_(L! -MG^AD;4@RA62)YI2#;(4E+\@F-^E%)Q^NNSM_D9NCB.D@CD,_!RR5D,)CR7PI -M```D2J+V)"1$G)CV;HA;;^H'(#1I:5S/PE"^,4%L_4U+TIY`YO80@CRGHTMC30 -M'3)8[310T=?8O6\WZ7]%!_R+`9_H9&U(,H5DB>:4@VR%)2_()C?I12D=B[UZ"-R10"QM>YHQ)#0P```!P``$`% -M<[$S5HK(::5?](*0SY@E1E(X5)U<$[=&Z>@*`)@!``"8`0```@```$4``92& -M@```0!$``,"H`0'`J`$"`?0!]`&`!V6H`](!5DYX1@``````````(2`B"``` -M``````%X(@``>````'0!`0`,`P``!`$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"```, -M"G1D0V79U1OM)RH<&X_&)09"P,!;F+5H._#Q540H(>=#YFGB`T:6E0.;V$((\IZ-+8TT!TR6.TT4-'7V+UO-^E_10?\BP&?Z&1M2#*% -M9(GFE(-LA24OR"8WZ44G'ZZ[.W^1FZ.(Z2".0S\'+)60PF/)?"D``"1*HO8D -M)$2]<4:=F()4E+YQ-K!'2D``!P``$`$)`AK7I'8N]>@ -MC"(``'@```!T`0$`#`,```C--?0X<2K'K5!0,HQ@> -MKZY?(^D4%$0:OZ:]$2O-@60^M_@\H0"QN#5/'2AH'Q'Y=PD_3$*N),YTOS[' -M)1\A5RGN9GGZB+K(D?\O.$*O6A"%?%4I$7K6E):S!OTQ8.J -MMR9E&UIY<@#.SN`I```D<)F.843K,R4,$0>W_=&"_`4\BT=:D!1#:>J1H>J) -M]I,I```<``!`!*W[);1S.!_Q(A+5[`%LJCS6/6Q1````'```0`6[$'#<`&:Q -MGJQ@)L?'2],_7(`SL[@*0``)'"9CF%$ZS,E#!$' -MM_W1@OP%/(M'6I`40VGJD:'JB?:3*0``'```0`2M^R6TP!;*H\ -MUCUL40```!P``$`%NQ!PW`!FL9ZL8";'QTO3/W#UW(Q>$[=&+[T#`)@!``"8 -M`0```@```$4``921HP``0!$``,"H`0'`J`$"`?0!]`&`!V6L+13-=MV&%0`` -M````````(2`B"`````````%X(@``>````'0!`0`,`P``!P$```R`#@"``P`` -M#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```! -M`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$ -M```.*```B``"``"*T-PBQ&01=SRFL41Z,TU]#AQ*L>M4%`RC&!ZOKE\CZ104 -M1!J_IKT1*\V!9#ZW^#RA`+&X-4\=*&@?$?EW"3],0JXDSG2_/LYF -M>?J(NLB1_R\X0J]:$(5\52D1>M:4EK-R[?-I$'3/>^=X&_3%@ZJW)F4;6GER -M`,[.X"D``"1PF8YA1.LS)0P1![?]T8+\!3R+1UJ0%$-IZI&AZHGVDRD``!P` -M`$`$K?LEM',X'_$B$M7L`6RJ/-8];%$````<``!`!;L0<-P`9K&>K&`FQ\=+ -MTS]P]=R,7Q.W1F_)`0"8`0``F`$```(```!%``&4JID``$`1``#`J`$!P*@! -M`@'T`?0!@`=E`+H:G<..AHX``````````"$@(@@````````!>"(``'@```!T -M`0$`#`,```@!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``0`;_8)'"''MH1$\U;7?_ -M992'90DN4#7KPLO1J`$ -M*R%1D<57\$')+"D3"GN+1!R/-63D+)^$!=@):X@7/#G#UT\"T47U-TU&7V7$ -M?G/WCZ$*(FE\Z#&R@GO.P(W++0KX.\DI```D&-5F6N)"?WY$0S2S)&C[%D>! -MI;P9&0P()'>_'.U!'6,I```<``!`!"HWIL_<89X(G(EW\R'57=_`)?L:```` -M'```0`4-DBB=QY>VM7[``MP5S[A_<7"M")R)=_,AU5W?P"7[&@```!P``$`%#9(HG7,`&18#?7L>7G,$BL`TA'!? -M$[=&W38+`)@!``"8`0```@```$4``92JH@``0!$``,"H`0'`J`$"`?0!]`&` -M!V4`NAJ=PXZ&C@``````````(2`B"`````````%X(@``>````'0!`0`,`P`` -M"`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"``!`!O]@D<(<>VA$3S5M=_]EE(=E"2Y0 -M->O"R]&IR@`7MK5^P`+<%<^X?W%PK7-X`0K(5&1Q5?P -M0XM$'(\U9.0LGX0%V`EKB!<\./H0HB -M:7SH,;*">\[`CFS]QAG@B%.@``````````"$@(@@````` -M```!>"(``'@```!T`0$`#`,```D!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``/>Q$ -MSBYX_$$I!6F1^331779LV)FTN3)C#WN.G9=5<.>#0;4H`&%T!A#MWW'?9A^: -M=*`V5%12?`X=3V@^QY3%F^WM2Q`UO\BVDGFL?Y\WAFHEB&W.#R@&U=?I:"#Z -M[!?HMGHMGSC[K+^9(8-#V;SHTMU"_G1:A.Q'#K>K)_L,,C$I```D:U1%\?;; -M/?#.5%'3S6=UJ^Y"T4<&#?;3MGQD'1N*/1\I```<``!`!(BF5D($-<#MC_`E -M.'#WGA.BGM]T````'```0`4C*E5DV([N:N;GI;7(M&1E;7NQP&`3MT9(;PP` -MF`$``)@!```"````10`!E*JR``!`$0``P*@!`<"H`0(!]`'T`8`'99PELAXO -MWA3H```````````A("((`````````7@B``!X````=`$!``P#```)`0``#(`. -M`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P`` -M"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```" -M````"`0```XH``"(``(``#WL1,XN>/Q!*05ID?DTT5UV;-B9M+DR8P][CIV7 -M57#G@T&U*`!A=`80[=]QWV8?FG2@-E144GP.'4]H/L>4Q9OM[4L0-;_(MI)Y -MK'^?-X9J)8AMS@\H!M77Z6@@^NP7Z+9Z+9\X^ZR_F2�]F\Z-+=0OYT6H3L -M1PZWJR?[##(Q*0``)&M41?'VVSWPSE11T\UG=:ON0M%'!@WVT[9\9!T;BCT? -M*0``'```0`2(IE9"!#7`[8_P)3AP]YX3HI[?=````!P``$`%(RI59-B.[FKF -MYZ6UR+1D96U[L+]X4Z```````````(2`B"`````````%X(@`` -M>````'0!`0`,`P``"0$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"```][$3.+GC\02D% -M:9'Y--%==FS8F;2Y,F,/>XZ=EU5PYX-!M2@`870&$.W?<=]F'YITH#945%)\ -M#AU/:#['E,6;[>U+$#6_R+:2>:Q_GS>&:B6(;BV? -M./NLOYDA@T/9O.C2W4+^=%J$[$<.MZLG^PPR,2D``"1K5$7Q]ML]\,Y44=/- -M9W6K[D+11P8-]M.V?&0=&XH]'RD``!P``$`$B*960@0UP.V/\"4X>$Z*> -MWW0````<``!`!2,J5638CNYJYN>EM['`8A.W1H%Y`0"8`0``F`$` -M``(```!%``&4K-D``$`1``#`J`$!P*@!`@'T`?0!@`=E0!K:5/C:O'\````` -M`````"$@(@@````````!>"(``'@```!T`0$`#`,```,!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``S\-4&(J1ZOAP@M[YGEMB`E(H\;05)WW+TCOG"8]8L6+.P:2B -MYSSI/."CF5?`H0K5)Q!8M?@HOAMC%&^KX$TB?)];*)\*"V+]\.*@3SE(M -M;%8I```D.E9SG'1A^RJ`U1&$!1SCLR+?":P(+O4#`#FWIL.$:#HI```<``!` -M!-L[/[7MS;AL[R)%_Z]4;(B4PLR9O3 -M_86F[F(3MT:HIP0`F`$``)@!```"````10`!E*T:``!`$0``P*@!`<"H`0(! -M]`'T`8`'94`:VE3XVKQ_```````````A("((`````````7@B``!X````=`$! -M``P#```#`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0`` -M`P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```( -M`P``!0,```@$```"````"`0```XH``"(``(``,_#5!B*D>KX<(+>^9Y;8@)2 -M*/&T%2=]R]([YPF/6+%BSL&DHN<\Z3S@HYE7P*$*U2<06+7X*+X;8Q1OJ^!- -M(GR?6W*5@FDU,.B!FR -MF!Z28E*7BB?"@MB_?#BH$\Y2+6Q6*0``)#I6@*`)@!``"8`0```@```$4` -M`92NE```0!$``,"H`0'`J`$"`?0!]`&`!V5`&MI4^-J\?P``````````(2`B -M"`````````%X(@``>````'0!`0`,`P```P$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M``#/PU08BI'J^'""WOF>6V("4BCQM!4G?T5N#!-*L6TWM3#H@9LI@>DF)2EXHGPH+8OWPXJ!/.4BUL5BD``"0Z -M5G.<=&'[*H#5$80%'..S(M\)K`@N]0,`.;>FPX1H.BD``!P``$`$VSL_M>W- -MN&SO(ES$PU0A$E,")'$````<``!`!>CN-)5X7_KU1LB)3"S)F]/]A:;N8Q.W -M1EOV"`"8`0``F`$```(```!%``&4L%(``$`1``#`J`$!P*@!`@'T`?0!@`=E -M0_8=V@SQU?8``````````"$@(@@````````!>"(``'@```!T`0$`#`,```0! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``(B_RI5=@&TS]HZV!V7EB&O"7+KM]097F -M&`(_2E^_*`(_SW:%%Q!`?ULF1FB#(66%9#6.X4[KW'UQKTBPYZXK^`?N85N& -MN=^G7>'(TCWBM8'?`5$-.AY6"=Z^W>L;![ -M^OSH"]M1)E'%%N%,J#\I```D3QR5L1#]&\:V>ZW])].]N*_@'[F%;AKG?IUWAR-(]XK6!WP%1#3H7+[[;$"MZ:8M! -MF$Y#0,BNNZHKWN5@G>OMWK&P>_K\Z`O;4291Q1;A3*@_*0``)$\KGU(].U;"9)^D;>:E9*0``'```0`3VZMZ;WV[O3%*R"JRH -MPJ24YUP^Q````!P``$`%-0RO`'R">$&7%GXZA_O.;>2`2+ED$[=&9B`#`)@! -M``"8`0```@```$4``92P70``0!$``,"H`0'`J`$"`?0!]`&`!V5#]AW:#/'5 -M]@``````````(2`B"`````````%X(@``>````'0!`0`,`P``!`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"```B+_*E5V`;3/VCK8'9>6(:\)88`C]*7[\H -M`C_/=H47$$!_6R9&:(,A985D-8[A3NO*U@=\!40TZ%R^^VQ`K>FF+09A.0T#(KKNJ*][E8)WK[=ZQL'OZ_.@+VU$F -M4<46X4RH/RD``"1/')6Q$/T;QK9[K?TGT[USIMWJY]2/3M6PF2?I&WFI62D` -M`!P``$`$]NK>F]]N[TQ2L@JLJ,*DE.="F%!#\``````````"$@(@@````````!>"(``'@` -M``!T`0$`#`,```4!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``8V[=/WI3F,&WHKMT -M&CAE24_0^\>>)8.%>G&`KKU_J/6-FZ#D2?T5""2%T1PD882KVMV9[-KE),B9)D2-GP^MZK7_>Z -M_B))]D67TPW3Q/NU3(6<7S1N%-?CBS(2_"LI```D,(V'"6B6$#!W1-#F)W>P -M!6[>Q?I8#8MA`_([UJ5#G0<;NY(X\E4*1O(S0P&MV43MT;*?P0`F`$``)@!```" -M````10`!E+#-``!`$0``P*@!`<"H`0(!]`'T`8`'9?(Z,W@IA00_```````` -M```A("((`````````7@B``!X````=`$!``P#```%`0``#(`.`(`#```,`0`` -M#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```( -M`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH -M``"(``(``&-NW3]Z4YC!MZ*[=!HX94E/T/O'GB6#A7IQ@*ZW**+O5&K9+GP* -M`P+&ZDASOM)3*^4VA5T>@_W`!UAI)47$GM?ZCUC9N@Y$G]%0@DA=$<)&&$J] -MK=F>S:Y23(F29$C9\/K>JU_WNOXB2?9%E],-T\3[M4R%G%\T;A37XXLR$OPK -M*0``)#"-APEHEA`P=T30YB=WL`5NWL7Z6`V+80/R.]:E0YT'*0``'```0`0O -MJY4/LL1J(-X&J6=PM*^6#O=`#P```!P``$`%/`N78567G&[N2./)5"D;R,T, -M!K=E$[=&I,$*`)@!``"8`0```@```$4``92Q$```0!$``,"H`0'`J`$"`?0! -M]`&`!V7R.C-X*84$/P``````````(2`B"`````````%X(@``>````'0!`0`, -M`P``!0$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``!C;MT_>E.8P;>BNW0:.&5)3]#[ -MQYXE@X5Z<8"NMRBB[U1JV2Y\"@,"QNI(<[[24ROE-H5='H/]P`=8:25%Q)[7 -M^H]8V;H.1)_14()(71'"1AA*O:W9GLVN4DR)DF1(V?#ZWJM?][K^(DGV19?3 -M#=/$^[5,A9Q?-&X4U^.+,A+\*RD``"0PC8<):)80,'=$T.8G=[`%;M[%^E@- -MBV$#\CO6I4.=!RD``!P``$`$+ZN5#[+$:B#>!JEG<+2OE@[W0`\````<``!` -M!3P+EV%5EYQN[DCCR50I&\C-#`:W9A.W1NK-"`"8`0``F`$```(```!%``&4 -ML2(``$`1``#`J`$!P*@!`@'T`?0!@`=EDQ(VQ]9Q-P0``````````"$@(@@` -M```````!>"(``'@```!T`0$`#`,```@!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M4B$F2Y\S`JT,4CXGBOVMS@%4MW('PBQ.D'_J`,B6S^!8M=%=%%PZY)D`8:_% -MK1\/5K1PX7O'X@+#*Z:H#-#-]-4Y[)[U>;@FWJ=2P]@%4@8,\\##L:%$CR#A -M",97#0^`-\/E;^5_9)S.<^0D.7AM]H-5$/)HRZ8^QY"TV(>FO$@I```D0\@0 -MR>]7FX -M)MZG4L/8!5(&#//`P[&A1(\@X0C&5PT/@#?#Y6_E?V20M-B'IKQ(*0``)$/($'(?/8-C=?(587G(PZ$S`!C-O@F(J<1ZO\B3 -M!F"0*0``'```0`2QI9L3`3<%YCMDU+HN#`>W2=6X>0```!P``$`%$JI>3V0Q -MI1FZS`J&V:70EE)#SPAG$[=&5?D"`)@!``"8`0```@```$4``92Q*P``0!$` -M`,"H`0'`J`$"`?0!]`&`!V63$C;'UG$W!```````````(2`B"`````````%X -M(@``>````'0!`0`,`P``"`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"``!2(29+GS," -MK0Q2/B>*_:W.`52W<@?"+$Z0?^H`R);/X%BUT5T47#KDF0!AK\6M'P]6M'#A -M>\?B`L,KIJ@,T,WTU3GLGO5YN";>IU+#V`52!@SSP,.QH42/(.$(QE<-#X`W -MP^5OY7]DG,YSY"0Y>&WV@U40\FC+IC['D+38AZ:\2"D``"1#R!!R'SV#8W7R -M%6%YR,.A,P`8S;X)B*G$>K_(DP9@D"D``!P``$`$L:6;$P$W!>8[9-2Z+@P' -MMTG5N'D````<``!`!1*J7D]D,:49NLP*AMFET)920\\(:!.W1OL%`0"8`0`` -MF`$```(```!%``&4L3\``$`1``#`J`$!P*@!`@'T`?0!@`=E3"JBXRW!NF,` -M`````````"$@(@@````````!>"(``'@```!T`0$`#`,```D!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``$P"^',.<.6]#%/NLG$R<3JQ:!78!3*=+MCY6B*%0:9#$ -M%5M.7'8'QY+LZ.!"K&A`SZD!XNGH!#BG%:`SV!!;?=/!)$&J==F7!.9T/M,H -M+1+8`GANE4F[22#R&0GR0/;;'6=@+6M/VAMS_O1VSNNU^^+/8]RN7[Y/(.52 -MKRS"/UHI```DOPN;K8NDMI#,O06U7!YW1Z-,K$3OIMO5%6<&GG\7O^(I```< -M``!`!#I)).Y1BR+EWE/H;*R^\+A2[.C@0JQH0,^I`>+IZ`0XIQ6@ -M,]@06WW3P21!JG79EP3F=#[3*"T2V`)X;I5)NTD@\AD)\D#VVQUG8"UK3]H; -M<_[T=L[KM?OBSV/=T>C -M3*Q$[Z;;U15G!IY_%[_B*0``'```0`0Z223N48LBY=Y3Z&RLOG,Y2Z,FU0`` -M`!P``$`%!B````'0!`0`,`P``"0$```R`#@"``P``#`$```R` -M#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(` -M``0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*``` -MB``"```3`+X@$.*<5H#/8$%M]T\$D0:IUV9<$YG0^TR@M$M@">&Z5 -M2;M)(/(9"?)`]ML=9V`M:T_:&W/^]';.Z[7[XL]CW*Y?OD\@Y5*O+,(_6BD` -M`"2_"YNMBZ2VD,R]!;5<'G='HTRL1.^FV]459P:>?Q>_XBD``!P``$`$.DDD -M[E&+(N7>4^ALK+YS.4NC)M4````<``!`!08G)9[PN%R]"3(QFHTOR&HIM_DL -M:1.W1BB`"`"8`0``F`$```(```!%``&4L4P``$`1``#`J`$!P*@!`@'T`?0! -M@`=EQ>[;H@D"`#L``````````"$@(@@````````!>"(``'@```!T`0$`#`,` -M``H!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@```&7L[6NKM]:.CSM4'+K>7_T,P>9H -M5/%`2;N'2S!R(/L0Q$%C"&1@,LK(WB7@+V9#">_I\,4?OK+X,L[3]IZ$FQ)* -M0J$=G\W[`L3#@;N-1?6$E>8]@:5@B_-MCFU&$4@&X'U1VT+A=N!`]6S*JI\[ -MLG"S:+IN9MRU^WOQ.+R]/!RD80?54+X]=J$ -MA)L22D*A'9_-^P+$PX&[C47UA)7F/8&E8(OS;8YM -M1A%(!N!]4=M"X7;@0/5LRJJ?.[)PLVBZ;F;AJ$[=&$*L" -M`)@!``"8`0```@```$4``92Q50``0!$``,"H`0'`J`$"`?0!]`&`!V7%[MNB -M"0(`.P``````````(2`B"`````````%X(@``>````'0!`0`,`P``"@$```R` -M#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,` -M``@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!``` -M`@````@$```.*```B``"````9>SM:ZNWUHZ/.U0)>`O9D,)[^GPQ1^^LO@RSM/VGH2;$DI"H1V?S?L" -MQ,.!NXU%]825YCV!I6"+\VV.;4812`;@?5';0N%VX$#U;,JJGSNR<+-HNFYF -MW+7[>_$XMS@NK2D``"06=1O\DCD?N?4N=[+T\'*1A!]50OCUVH1P%DI=79FH -M32D``!P``$`$02G\K1*A8SEH"1.[^.=22PCO--0````<``!`!;>,JXY*`?0" -M;R,0A.V%C<6OA:7H:Q.W1LRY``"8`0``F`$```(```!%``&4L6,``$`1``#` -MJ`$!P*@!`@'T`?0!@`=EM,2KG3,'$9P``````````"$@(@@````````!>"(` -M`'@```!T`0$`#`,```L!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``X?N0J'T$D:X^(P9]IABO7GUSMT13<26^PM2U.`G6+B#8&U=(93H^LL)>-,BA. -M4%^80I>(3-/SPEM7NMOB2N@D0DP=>O")W!B*ZY$I```D0V(L+7'/H`/L)FL? -MH(NI6`/G_##+UGQ?DD6Z!+S]<_8I```<``!`!!8#++-EA$\61>1PDLU4@/#O -M.9ZG````'```0`4$DR6>K+G9?R0,Q;6/M5H[.-@<_VL3MT:)XP,`F`$``)@! -M```"````10`!E+%G``!`$0``P*@!`<"H`0(!]`'T`8`'9;3$JYTS!Q&<```` -M```````A("((`````````7@B``!X````=`$!``P#```+`0``#(`.`(`#```, -M`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$# -M```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0` -M``XH``"(``(``.'[D*AW*5QNL#VY5T3R_%(5'R,B_#TVM*9@5;/:4Q@H4/^` -M]V)#IM?4W[?X&T[*=-,>DU!D[^)4#GM!)&N/B,&?:88KUY]<[=$4W$EOL+4M -M3@)UBX@V!M72&4Z/K+"7C3(H3E!?F$*7B$S3\\);5[K;XDKH)$),'7KPB=P8 -MBNN1*0``)$-B+"UQSZ`#["9K'Z"+J5@#Y_PPR]9\7Y)%N@2\_7/V*0``'``` -M0`06`RRS981/%D7D<)+-5(#P[SF>IP```!P``$`%!),EGJRYV7\D#,6UC[5: -M.SC8'/]K$[=&'B4*`)@!``"8`0```@```$4``92Q;0``0!$``,"H`0'`J`$" -M`?0!]`&`!V6TQ*N=,P<1G```````````(2`B"`````````%X(@``>````'0! -M`0`,`P``"P$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$` -M``,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P`` -M"`,```4#```(!````@````@$```.*```B``"``#A^Y"H=RE<;K`]N5=$\OQ2 -M%1\C(OP]-K2F8%6SVE,8*%#_@/=B0Z;7U-^W^!M.RG33'I-09._B5`Y[021K -MCXC!GVF&*]>?7.W1%-Q);["U+4X"=8N(-@;5TAE.CZRPEXTR*$Y07YA"EXA, -MT_/"6U>ZV^)*Z"1"3!UZ\(G<&(KKD2D``"1#8BPM<<^@`^PF:Q^@BZE8`^?\ -M,,O6?%^21;H$O/US]BD``!P``$`$%@,LLV6$3Q9%Y'"2S52`\.\YGJ<````< -M``!`!023)9ZLN=E_)`S%M8^U6CLXV!S_;!.W1N(N"`"8`0``F`$```(```!% -M``&4L7$``$`1``#`J`$!P*@!`@'T`?0!@`=E48]G_\X]S+X``````````"$@ -M(@@````````!>"(``'@```!T`0$`#`,```T!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``SQ8>6E,O3JUI-8!*8USKZ9EP4(GE."&#:?5?G&!J@FN,:W,>`L0Y8S)& -MB(ROF*+D?4&I:!D@[1_8G@',_+JIGZGL=R$1M$AK@Z=+KS66WW7_HTG_B5E= -M+*3&#P+8MR`Q$5!QEI0&XEZP*PCE$HP$C3L8-:L;U#-OZF0Z)B]&$*XI```D -M&@>^GGZ)$#A]5%FNEMBP^W\*Q8+UD[[3S3\"^+M+7,`I```<``!`!/;3/'"& -M3Q0W8W=Z$E$P+U:Q:'BY````'```0`7RU'[CH5YUX/A$`[G0\*<]TG&=AVP3 -MMT:"70L`F`$``)@!```"````10`!E+%S``!`$0``P*@!`<"H`0(!]`'T`8`' -M95&/9__./L"L(Y1*,!(T[ -MK&]0S;^ID.B8O1A"N*0``)!H'OIY^B1`X?519KI;8L/M_"L6"]9.^T\T_ -M`OB[2US`*0``'```0`3VTSQPAD\4-V-W>A)1,"]6L6AXN0```!P``$`%\M1^ -MXZ%>=>#X1`.YT/"G/=)QG8=M$[=&UUP"`)@!``"8`0```@```$4``92Q>``` -M0!$``,"H`0'`J`$"`?0!]`&`!V51CV?_SCW,O@``````````(2`B"``````` -M``%X(@``>````'0!`0`,`P``#0$```R`#@"``P``#`$```R`#@$``P``#`$` -M``R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P`` -M`@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``#/%AY: -M4R].K6DU@$IC7.OIF7!0B>4X(8-I]5^<8&J":XQK`QW(1&T2&N#ITNO-9;?=?^C2?^)65TLI,8/`MBW -M(#$14'&6E`;B7K`K".42C`2-.Q@UJQO4,V_J9#HF+T80KBD``"0:![Z>?HD0 -M.'U46:Z6V+#[?PK%@O63OM/-/P+XNTM+D````<``!`!?+4?N.A7G7@^$0#N=#PISW2<9V';A.W1B'2``"8 -M`0``F`$```(```!%``&4M3\``$`1``#`J`$!P*@!`@'T`?0!@`=E,(1P?:=J -M&,<``````````"$@(@@````````!>"(``'@```!T`0$`#`,```X!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``T27%!ZD`F;M]6H*2E1QKCWC7["]K -M:R";!&S0$C^J+VX3MT;(^`,`F`$``)@!```"````10`!E+5M``!`$0``P*@! -M`<"H`0(!]`'T`8`'93"$<'VG:AC'```````````A("((`````````7@B``!X -M````=`$!``P#```.`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`# -M```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,` -M``$#```(`P``!0,```@$```"````"`0```XH``"(``(``-$EQ0>I`)F[?5J" -MDI7+6/5XM!._J&&!_K?PW,@:%[&P`T1M'1;&NW=1$/`^9X33L,+?GD<:W'U] -M$F4P6VG`(SLG`S&%;N[PXU<;NAH!.G\X2!L15CFSA$*#/06IU!6NXQ=7\P"= -M01NS5ENFX71!XHSD(?A\O/Q=&,=WR-S?ATO<*0``)-L+PCV6KH?-NQ8EP>-1 -M\>*#5[+(+DCX@Q[[A87Z7/A$*0``'```0`1PW[2QH`96B`P[->N-3O`QKGX/ -M]````!P``$`%D/'S7H]XU^PO:VL@FP1LT!(_JB]N$[=&B"4*`)@!``"8`0`` -M`@```$4``92XB@``0!$``,"H`0'`J`$"`?0!]`&`!V4PA'!]IVH8QP`````` -M````(2`B"`````````%X(@``>````'0!`0`,`P``#@$```R`#@"``P``#`$` -M``R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P`` -M"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```. -M*```B``"``#1)<4'J0"9NWU:@I*5RUCU>+03OZAA@?ZW\-S(&A>QL`-$;1T6 -MQKMW41#P/F>$T[#"WYY'&MQ]?1)E,%MIP",[)P,QA6[N\.-7&[H:`3I_.$@; -M$58YLX1"@ST%J=05KN,75_,`G4$;LU9;IN%T0>*,Y"'X?+S\71C'=\CRR"Y(^(,>^X6%^ESX1"D``!P``$`$ -M<-^TL:`&5H@,.S7KC4[P,:Y^#_0````<``!`!9#Q\UZ/>-?L+VMK()L$;-`2 -M/ZHO;Q.W1L4Q"`"8`0``F`$```(```!%``&4N)8``$`1``#`J`$!P*@!`@'T -M`?0!@`=E'#K_@GI>"(``'@```!T`0$` -M#`,```\!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``P4B-V;A6[-AR]D?3158(BO3@ -M>CLTMVRR"ZQ5"P8QQC!Q!M"[\=.L2>]OJ:&'^Q8FY)N.!/60-^'D7C#9\;O8 -M_+GF[8\RY*'?1/5Z:$GS7D+;H`7":P'9->MA^22=L62Y='PPW]>Q40X)2K8I -M+G9Z')&FQ%W_)[HS8L'VY@%_$"LI```D%H7<#,V;%LT=.K^I?11@`C+F8)ZD -M887P-&%2I0?EL[PI```<``!`!![=T+!0`I-U\FL72YW)2+=GXLZ%````'``` -M0`5FV2:&_'VDB*8LH..=4L;5E`UW?V\3MT:170L`F`$``)@!```"````10`! -ME+B7``!`$0``P*@!`<"H`0(!]`'T`8`'91PZ_X)Z7G-#```````````A("(( -M`````````7@B``!X````=`$!``P#```/`0``#(`.`(`#```,`0``#(`.`0`# -M```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,` -M``@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(` -M`,%(C=FX5NS8FA)\UY"VZ`%PFL!V37K -M8?DDG;%DN71\,-_7L5$."4JV*2YV>AR1IL1=_R>Z,V+!]N8!?Q`K*0``)!:% -MW`S-FQ;-'3J_J7T48`(RYF">I&&%\#1A4J4'Y;.\*0``'```0`0>W="P4`*3 -M=?)K%TN=R4BW9^+.A0```!P``$`%9MDFAOQ]I(BF+*#CG5+&U90-=W]P$[=& -MKUP"`)@!``"8`0```@```$4``92XG0``0!$``,"H`0'`J`$"`?0!]`&`!V4< -M.O^">EYS0P``````````(2`B"`````````%X(@``>````'0!`0`,`P``#P$` -M``R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@`` -M`@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```( -M!````@````@$```.*```B``"``#!2(W9N%;LV'+V1]-%5@B*].!Z.S2W;+(+ -MK%4+!C'&,'$&T+OQTZQ)[V^IH8?[%B;DFXX$]9`WX>1>,-GQN]C\N>;MCS+D -MH=]$]7IH2?->0MN@!<)K`=DUZV'Y))VQ9+ET?##?U[%1#@E*MBDN=GH"(``'@```!T`0$`#`,``!`!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``UA]ML:9M -MS,]96(YU?2=\^\!I4#B&O_"8L(T@PYB0`:6>7DH\'NG[%8?J#&CM2M -M]+'(;G?I=HA6NY>TP7C$][;BE0K7*GH,W'B1%6"ZSY,I```D8X$L6WM7_<>F -M107A@?M'7G*GKCR4TLF;5>[\L^1S([EB65YD2`1NP!,99P\7$3MT;CE0,`F`$` -M`)@!```"````10`!E+CM``!`$0``P*@!`<"H`0(!]`'T`8`'9:+8R#C8^AW3 -M```````````A("((`````````7@B``!X````=`$!``P#```0`0``#(`.`(`# -M```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(` -M``$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"```` -M"`0```XH``"(``(``-8?;;&F;VXI4*URIZ#-QX -MD15@NL^3*0``)&.!+%M[5_W'ID4%X8'[1UYRIZX\E-+)FU7N_+/D7-6$*0`` -M'```0`12E1`N];XGW"8)JLZS*S;J1.L2JP```!P``$`%Y+W65WLR.Y8EE>9$ -M@$;L`3&6``` -M`'0!`0`,`P``$`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"``#6'VVQIFW,SUE8CG5] -M)WSYR-I'-T2CP>Z?L5A^H,:.U*WTL,3WMN*5"M@S<>)$58+K/DRD``"1C@2Q;>U?]QZ9%!>&!^T=> -MN/)32R9M5[ORSY%S5A"D``!P``$`$4I40+O6^)]PF":K.LRLVZD3K$JL` -M```<``!`!>2]UE=[,CN6)97F1(!&[`$QEG#Q"(``'@```!T`0$`#`,``!,!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``+1N"&R.!!]G7I9XY2XH#M:*\(UNUU'`_FXX79$1Q0R;/>9Q`C,E) -M>.*N%/BV,ZP/J32U:D"1)QNLD[R,Y7!?28J[5:9E1R`MW=2'C53<6)7&'J&( -MX$SBK."Q[4&%+NUFMD)#95(IXJ*X.>@#TI -M```D!"(AE#&://^@I```<``!`!/7_ -M=$P[,&PELH[*DANV:3]#UI"\````'```0`62('Z&:^R5",EMQZMM9&?,1[*( -M3'(3MT8K#PL`F`$``)@!```"````10`!E+IM``!`$0``P*@!`<"H`0(!]`'T -M`8`'9<3;A]@A4MIG```````````A("((`````````7@B``!X````=`$!``P# -M```3`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,` -M``@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P`` -M!0,```@$```"````"`0```XH``"(``(``"T;@ALC@0?9UZ6>.4N*`[6BO"-; -MM=1P/YN.%V1$<4,FSWF<0(S)27CBKA3XMC.L#ZDTM6I`D2<;K).\C.5P7TF* -MNU6F94<@+=W4AXU4W%B5QAZAB.!,XJW-EN5%_>)_NV90])%*O,'W:E2WC@L> -MU!A2[M9K9"0V52*>*BN#GH`]*0``)`0G`6/[5X$!^3`9FA8U@?BX;#]9R/K3 -M1WB(90QFCS_H*0``'```0`3U_W1,.S!L);*.RI(;MFD_0]:0O````!P``$`% -MDB!^AFOLE0C);<>K;61GS$>RB$QS$[=&=@X"`)@!``"8`0```@```$4``92Z -M=@``0!$``,"H`0'`J`$"`?0!]`&`!V7$VX?8(5+:9P``````````(2`B"``` -M``````%X(@``>````'0!`0`,`P``$P$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"```M -M&X(;(X$'V=>EGCE+B@.UHKPC6[74<#^;CA=D1'%#)L]YG$",R4EXXJX4^+8S -MK`^I-+5J0)$G&ZR3O(SE<%])BKM5IF5'("W=U(>-5-Q8E<8>H8C@3.*MS9;E -M1?WB?[MF4/212KS!]VI4MXX+'M084N[6:V0D-E4BGBHK@YZ`/2D``"0$)P%C -M^U>!`?DP&9H6-8'XN&P_6"(``'@```!T`0$`#`,``!0!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``:(DC4B)DC>WU&PW&;83SSX7[3*@J>ZUHK2Q"!J>9E3O-J8+A7&JM),-6%11 -M9[B>CSU[V22;TT4?\/OXGKR+B2V$.K0]>AEYRUH1*HOT%'T-%D'G\O,EQ%Q< -M_`*PVF+!H`("3M8I```DXWETZ<7;[;G6]TLANK>O[S82+J(G=DN*]4T>LY8* -M54HI```<``!`!!Q]]5#IGI-E[T13C9*2=FI'.X`Q````'```0`5,S-S="WF% -M;*L^2S3R[,A/:WT>*703MT8E1P,`F`$``)@!```"````10`!E+KO``!`$0`` -MP*@!`<"H`0(!]`'T`8`'94RVT#1YL%L$```````````A("((`````````7@B -M``!X````=`$!``P#```4`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`. -M`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P`` -M"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``&B)(U(B9(WM -M]1L-QFV$\\^%^W(1O31@M]^)?8!!_?XGH\]>]DDF]-%'_#[^)Z\BXDMA#JT/7H9 -M>]$4XV2DG9J -M1SN`,0```!P``$`%3,S;!;!``` -M````````(2`B"`````````%X(@``>````'0!`0`,`P``%`$```R`#@"``P`` -M#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```! -M`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$ -M```.*```B``"``!HB2-2(F2-[?4;#<9MA///A?MR$;TT8+??B7V`0?WW+B[F -MR5JVO]\YRA07XW-Y,J"I[K6BM+$(&IYF5.\VI@N%<:JTDPU85%%GN)Z//7O9 -M))O311_P^_B>O(N)+80ZM#UZ&7G+6A$JB_04?0T60>?R\R7$7%S\`K#:8L&@ -M`@).UBD``"3C>73IQ=OMN=;W2R&ZMZ_O-A(NHB=V2XKU31ZSE@I52BD``!P` -M`$`$''WU4.F>DV7O1%.-DI)V:D<[@#$````<``!`!4S,W-T+>85LJSY+-/+L -MR$]K?1XI=1.W1I"9!P"8`0``F`$```(```!%``&4NS\``$`1``#`J`$!P*@! -M`@'T`?0!@`=E$@=5"HXPU$4``````````"$@(@@````````!>"(``'@```!T -M`0$`#`,``!4!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``FOS$VX8$5"=P0%V%J3+# -MCXBE*&Q/R#/2YLD>3CL\Y4](Y[N"_8XEMWVK>ERN=[R;:0_R>S-/?%7YA;E[F;#*TH1'P -M0"*B".Z4:QH\_E[-;YT[M'@'5(RT#^,I```DIQS[8^CJ&X'-F`(M->A5O4N+ -MBZ+K'%4YHG"(3GQ(UDXI```<``!`!#R"-G3_OQ:A0WHA7-S#!^GG"WB%```` -M'```0`4'K#>"[\4J'5R;G#!8X)0J)?>C-G43MT8#P0H`F`$``)@!```"```` -M10`!E+M#``!`$0``P*@!`<"H`0(!]`'T`8`'91('50J.,-1%```````````A -M("((`````````7@B``!X````=`$!``P#```5`0``#(`.`(`#```,`0``#(`. -M`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@`` -M!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"( -M``(``)K\Q-N&!%0G<$!=A:DRPX^(I2AL3\@STN;)'`2Q!6:DQP0^S#U/Q+$' -M?`*Q$9;DCN_@9LP9":,RNZ*2C/LJ]87GDX[/.5/2.>[@OV.);=]JWI\F -MVD/\GLS3WQ5^86Y>YFPRM*$1\$`BH@CNE&L://Y>S6^=.[1X!U2,M`_C*0`` -M)*<<^V/HZAN!S9@"+37H5;U+BXNBZQQ5.:)PB$Y\2-9.*0``'```0`0\@C9T -M_[\6H4-Z(5S````'0!`0`,`P`` -M%0$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"``":_,3;A@14)W!`786I,L./B*4H;$_( -M,]+FR1P$L05FI,<$/LP]3\2Q!WP"L1&6Y([OX&;,&0FC,KNBDHS[*O6%YY.. -MSSE3TCGNX+]CB6W?:MZ7*YWO)MI#_)[,T]\5?F%N7N9L,K2A$?!`(J(([I1K -M&CS^7LUOG3NT>`=4C+0/XRD``"2G'/MCZ.H;@B%<+>(4````<``!`!0>L -M-X+OQ2H=7)N<,%C@E"HE]Z,V=A.W1F0.#P"8`0``F`$```(```!%``&4NU$` -M`$`1``#`J`$!P*@!`@'T`?0!@`=EX;T"(``'@```!T`0$`#`,`__\!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``SW,H -M$+D)J5L#&?0@NNS61CU9&/@(90+@WX<[MXZ\].K`'6Z";F'2G>G`DMT\;"$;Y6N$OMW>KI=['.W483:`+$@JHU* -MRWSN+8F]OSP^%9J5=W?L**,@*?SGRQFP.-KN4,%MU]3R@$4I```D60:,%`]% -M_V,XU`/.2^9^Z(LHG_"JT)C**G/N]7L4&W\I```<``!`!"$@P@J855-\]-^4^`````'```0`42B_7G8>2$S-M7VN8%DRZ^"G]@LW<3MT;#^`(` -MF`$``)@!```"````10`!E+M3``!`$0``P*@!`<"H`0(!]`'T`8`'9>&]',N4 -M.%1@```````````A("((`````````7@B``!X````=`$!``P#`/__`0``#(`. -M`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P`` -M"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```" -M````"`0```XH``"(``(``,]S*!"Y":E;`QGT(+KLUD8]61CX"&4"X-^'.:C# -MP&^I7X2*T76W&5?#%DF`0D#*5_$'G.[>.O/3JP!UN@FYATIWIP)+=/&PA&^5 -MKA+[=WJZ7>QSMU&$V@"Q(*J-2LM\[BV)O;\\/A6:E7=W["BC("G\Y\L9L#C: -M[E#!;=?4\H!%*0``)%D&C!0/1?]C.-0#SDOF?NB+*)_PJM"8RBIS[O5[%!M_ -M*0``'```0`0A(,(*F%57([9G,ONBWC?/3?E/@````!P``$`%$HOUYV'DA,S; -M5]KF!9,NO@I_8+-W$[=&<#H)`)@!``"8`0```@```$4``92[7P``0!$``,"H -M`0'`J`$"`?0!]`&`!V7AO1S+E#A48```````````(2`B"`````````%X(@`` -M>````'0!`0`,`P#__P$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"``#/Q0;?RD``!P``$`$(2#""IA55R.V9S+[HMXWSTWY -M3X`````<``!`!1*+]>=AY(3,VU?:Y@63+KX*?V"S>!.W1OM&!P"8`0``F`$` -M``(```!%``&4NV,``$`1``#`J`$!P*@!`@'T`?0!@`=E0?.A9'1+8B<````` -M`````"$@(@@````````!>"(``'@```!T`0$`#`,`@``!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``\C`5K+.[4^;2R[]:V`(]S"ZRMO0_2HA'>9@^P9)W$BK\VEL@ -M_-BSZ..;@5M/19V+,&R0T`(5'CD>VF;F4$R`L\ -M^T7^`#+'1BH\TR1&00T;!]4XW:&Q^X09$)^_J61;?ZD^%>,`Z[2I602A3')Y -MDL$I```D?%B)`G3UG*!J"[,6-&$>]Z5M7@R=7_7AOM1::^$V4SDI```<``!` -M!'O]1C8*<[?;+J$,P_)Q41E]9;@^````'```0`62M8)NE>AN8Q2N'"7B9Z;* -MYW/]S7@3MT;*<@H`F`$``)@!```"````10`!E+MD``!`$0``P*@!`<"H`0(! -M]`'T`8`'94'SH61T2V(G```````````A("((`````````7@B``!X````=`$! -M``P#`(```0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0`` -M`P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```( -M`P``!0,```@$```"````"`0```XH``"(``(``/(P%:RSNU/FTLN_6M@"/9+!*0``)'Q8B0)T]9R@:@NS%C1A'O>E;5X, -MG5_UX;[46FOA-E,Y*0``'```0`1[_48V"G.WVRZA#,/R<5$9?66X/@```!P` -M`$`%DK6";I7H;F,4KAPEXF>FRN=S_````'0!`0`,`P"```$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M``#R,!6LL[M3YM++OUK8`CW,+K*V]#]*B$=YF#[!DG<2*OS:6R#\V+/HXYN! -M5R(+(&3TNTIU#'6*Q@*:/]ZT]%G8LP;)#0`A4>.1[:9N903("SS[1?X`,L=& -M*CS3)$9!#1L'U3C=H;'[A!D0G[^I9%M_J3X5XP#KM*E9!*%,#)U?]>&^U%IKX393.2D``!P``$`$>_U&-@IS -MM]LNH0S#\G%1&7UEN#X````<``!`!9*U@FZ5Z&YC%*X<)>)GILKG<_W->1.W -M1M[!#@"8`0``F`$```(```!%``&4NW8``$`1``#`J`$!P*@!`@'T`?0!@`=E -MK&*8C?+@39P``````````"$@(@@````````!>"(``'@```!T`0$`#`,```P` -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``%&`04LR()6'67;P%5`AL1!<_D-A[&^ -M1;X^ZH7_MA>(\/-KCOWB@P^F-1\DTM(EG%P>-Y'O1"XZSI"S1N-*E/,@AG+& -MW8FRU76",1\QKF\+Z9/IFE-AQ0`A,;DB.Z(!,DNMPS-ECU$HD]9%IU2]:;(7 -M&%9X\O'7?7<3=JU@<(HI```D]A'(:M'YH&8@_Z4;-5[FQ'G\:W?S])`8F>"B -MUMST!(DI```<``!`!)'AQ>KD-&2S]X0]!>WD3MT8.X`X`N`$` -M`+@!```"````10`!M+MX``!`$0``P*@!`<"H`0(!]`'T`:`'A:QBF(WRX$V< -M```````````I("((`````````9@A```@``!`!@````QNT=?'Z6OM;>AQ>KD- -M&2S]X0]!>R(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M%&`04LR()6'67;P%5`AL1!<_D-A[&^1;X^ZH7_MA>(\/-KCOWB@P^F-1\D -MTM(EG%P>-Y'O1"XZSI"S1N-*E/,@AG+&W8FRU76",1\QKF\+Z9/IFE-AQ0`A -M,;DB.Z(!,DNMPS-ECU$HD]9%IU2]:;(7&%9X\O'7?7<3=JU@<(HI```D]A'( -M:M'YH&8@_Z4;-5[FQ'G\:W?S])`8F>"BUMST!(DI```<``!`!)'2ZI7LAA#I -MUG$.35W-"$#^E?#D;0<;NR"0\H(!Z -M=8P%9]G'H@/5>B3E5?Z",^_U4\D_]Y$[=&!S,/``P!```, -M`0```@```$4``0B[?```0!$``,"H`0'`J`$"`?0!]`#T!]FL8IB-\N!-G&$6 -MDFN"R<.W+B`C"`````$```#L(P``T''3>4T,4H%%(I+X1>)5@._ACPF,_Z-1 -MKIW0_>'S4'K^X74U\TMO58>F6?`)9Z&HKC)4"?B,N&`(25[.&Z5##!UWG\@= -M_8I,OM1\K40!B%$U%(8NEB,:AR(+]-W)9R8K8,AEKTV=VK1NG;7^8V5`'GAY -MZXRRO54V\W8<^J]`1C;IKR-Z!V%8`UGV%M9(>+QCU;^6*8=E>US`>0L!)T`> -M!0]41&+N:E6*S$!(P?G980W/-+7&3\@C:7/?7KY>)X9"S+@/'9O-H'$=V!K2 -!'P`` -` -end diff --git a/contrib/tcpdump/tests/ikev2four.out b/contrib/tcpdump/tests/ikev2four.out deleted file mode 100644 index db2e8ef09fd..00000000000 --- a/contrib/tcpdump/tests/ikev2four.out +++ /dev/null @@ -1,107 +0,0 @@ -IP (tos 0x0, ttl 64, id 19908, offset 0, flags [none], proto UDP (17), length 404) - 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000000: parent_sa ikev2_init[I]: - (sa: len=116 - (p: #1 protoid=isakmp transform=12 len=116 - (t: #1 type=encr id=aes (type=keylen value=0080)) - (t: #2 type=encr id=aes (type=keylen value=0100)) - (t: #3 type=encr id=aes (type=keylen value=00c0)) - (t: #4 type=encr id=3des ) - (t: #5 type=prf id=hmac-sha ) - (t: #6 type=prf id=hmac-md5 ) - (t: #7 type=prf id=aes128_xcbc ) - (t: #8 type=integ id=hmac-sha ) - (t: #9 type=integ id=hmac-md5 ) - (t: #10 type=integ id=aes-xcbc ) - (t: #11 type=dh id=modp1024 ) - (t: #12 type=dh id=modp2048 ))) - (v2ke: len=128 group=modp1024) - (nonce: len=32 data=(6128ebd023a864e94a7f...ba041b5de59955900d818ac54e18b236739d9e8b)) - (n: prot_id=#0 type=16388(nat_detection_source_ip)) - (n: prot_id=#0 type=16389(nat_detection_destination_ip)) -IP (tos 0x0, ttl 64, id 19909, offset 0, flags [none], proto UDP (17), length 88) - 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000000: parent_sa ikev2_init[R]: - (n: prot_id=#0 type=16390(cookie) data=(00000001c2221e50c16e123f2b0c71aefcf0cb3b798782c6)) -IP (tos 0x0, ttl 64, id 19910, offset 0, flags [none], proto UDP (17), length 436) - 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000000: parent_sa ikev2_init[I]: - (n: prot_id=#0 type=16390(cookie) data=(00000001c2221e50c16e...ba041b5de59955900d818ac54e18b236739d9e8b)) - (sa: len=116 - (p: #1 protoid=isakmp transform=12 len=116 - (t: #1 type=encr id=aes (type=keylen value=0080)) - (t: #2 type=encr id=aes (type=keylen value=0100)) - (t: #3 type=encr id=aes (type=keylen value=00c0)) - (t: #4 type=encr id=3des ) - (t: #5 type=prf id=hmac-sha ) - (t: #6 type=prf id=hmac-md5 ) - (t: #7 type=prf id=aes128_xcbc ) - (t: #8 type=integ id=hmac-sha ) - (t: #9 type=integ id=hmac-md5 ) - (t: #10 type=integ id=aes-xcbc ) - (t: #11 type=dh id=modp1024 ) - (t: #12 type=dh id=modp2048 ))) - (v2ke: len=128 group=modp1024) - (nonce: len=32 data=(6128ebd023a864e94a7f...ba041b5de59955900d818ac54e18b236739d9e8b)) - (n: prot_id=#0 type=16388(nat_detection_source_ip)) - (n: prot_id=#0 type=16389(nat_detection_destination_ip)) -IP (tos 0x0, ttl 64, id 19911, offset 0, flags [none], proto UDP (17), length 332) - 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000000: parent_sa ikev2_init[R]: - (sa: len=44 - (p: #1 protoid=isakmp transform=4 len=44 - (t: #1 type=encr id=aes (type=keylen value=0080)) - (t: #2 type=prf id=hmac-sha ) - (t: #3 type=integ id=hmac-sha ) - (t: #4 type=dh id=modp1024 ))) - (v2ke: len=128 group=modp1024) - (nonce: len=32 data=(b31c379f272ce2984bd1...905954a783be2c37e2ccc4fdd270a532dbe6f428)) - (n: prot_id=#0 type=16388(nat_detection_source_ip)) - (n: prot_id=#0 type=16389(nat_detection_destination_ip)) -IP (tos 0x0, ttl 64, id 19912, offset 0, flags [none], proto UDP (17), length 264) - 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000001: child_sa ikev2_auth[I]: - (v2e: len=204) -IP (tos 0x0, ttl 64, id 19913, offset 0, flags [none], proto UDP (17), length 184) - 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000001: child_sa ikev2_auth[R]: - (v2e: len=124) -IP (tos 0x0, ttl 64, id 19914, offset 0, flags [none], proto UDP (17), length 280) - 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000002: child_sa child_sa[I]: - (v2e: len=220) -IP (tos 0x0, ttl 64, id 19915, offset 0, flags [none], proto UDP (17), length 248) - 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000003: child_sa child_sa[I]: - (v2e: len=188) -IP (tos 0x0, ttl 64, id 19916, offset 0, flags [none], proto UDP (17), length 104) - 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000002: child_sa child_sa[R]: - (v2e: len=44) -IP (tos 0x0, ttl 64, id 19917, offset 0, flags [none], proto UDP (17), length 104) - 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000003: child_sa child_sa[R]: - (v2e: len=44) -IP (tos 0x0, ttl 64, id 19918, offset 0, flags [none], proto UDP (17), length 312) - 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000004: child_sa child_sa[I]: - (v2e: len=252) -IP (tos 0x0, ttl 64, id 19919, offset 0, flags [none], proto UDP (17), length 280) - 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000005: child_sa child_sa[I]: - (v2e: len=220) -IP (tos 0x0, ttl 64, id 19920, offset 0, flags [none], proto UDP (17), length 232) - 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000004: child_sa child_sa[R]: - (v2e: len=172) -IP (tos 0x0, ttl 64, id 19921, offset 0, flags [none], proto UDP (17), length 232) - 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000005: child_sa child_sa[R]: - (v2e: len=172) -IP (tos 0x0, ttl 64, id 19922, offset 0, flags [none], proto UDP (17), length 312) - 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000006: child_sa child_sa[I]: - (v2e: len=252) -IP (tos 0x0, ttl 64, id 19923, offset 0, flags [none], proto UDP (17), length 280) - 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000007: child_sa child_sa[I]: - (v2e: len=220) -IP (tos 0x0, ttl 64, id 19924, offset 0, flags [none], proto UDP (17), length 232) - 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000006: child_sa child_sa[R]: - (v2e: len=172) -IP (tos 0x0, ttl 64, id 19925, offset 0, flags [none], proto UDP (17), length 232) - 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000007: child_sa child_sa[R]: - (v2e: len=172) -IP (tos 0x0, ttl 64, id 19926, offset 0, flags [none], proto UDP (17), length 392) - 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000008: child_sa child_sa[I]: - (v2e: len=332) -IP (tos 0x0, ttl 64, id 19927, offset 0, flags [none], proto UDP (17), length 344) - 192.168.1.1.500 > 192.168.1.2.500: isakmp 2.0 msgid 00000008: child_sa child_sa[R]: - (v2e: len=284) -IP (tos 0x0, ttl 64, id 19928, offset 0, flags [none], proto UDP (17), length 120) - 192.168.1.2.500 > 192.168.1.1.500: isakmp 2.0 msgid 00000000: parent_sa inf2[I]: - (v2e: len=60) diff --git a/contrib/tcpdump/tests/ikev2four.puu b/contrib/tcpdump/tests/ikev2four.puu deleted file mode 100644 index b9c607a4ec1..00000000000 --- a/contrib/tcpdump/tests/ikev2four.puu +++ /dev/null @@ -1,134 +0,0 @@ -begin 644 ikev2four.pcap -MU,.RH0(`!````````````-P%````````1!*W1JWG!0"8`0``F`$```(```!% -M``&43<0``$`1J$'`J`$"P*@!`0'T`?0!@`=EJ(AUJ!F)DJ8``````````"$@ -M(@@````````!>"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``M41;U@SLYOW-/):E++M[M":HQZ#U:IPXT;'$\,.FZ.?;I<'[_$%BT02 -MMT9`]@4`7````%P````"````10``6$W%``!`$:E\P*@!`<"H`0(!]`'T`$0& -M*:B(=:@9B9*F```````````I("(@`````````#P````@``!`!@````'"(AY0 -MP6X2/RL,<:[\\,L[>8>"QD02MT8;!08`N`$``+@!```"````10`!M$W&``!` -M$:@?P*@!`L"H`0$!]`'T`:`'A:B(=:@9B9*F```````````I("((```````` -M`9@A```@``!`!@````'"(AY0P6X2/RL,<:[\\,L[>8>"QB(``'@```!T`0$` -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``M41;U@SLYOW-/):E++M[M":H -MQZ#U:IPXT;'$\,.FZ.?;I<'[_$%BT02MT9-*`8`4`$``%`!```"````10`! -M3$W'``!`$:B&P*@!`<"H`0(!]`'T`3@'':B(=:@9B9*F<;Z#6.^N=F,A("(@ -M`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@# -M```"````"`0```(H``"(``(``%I6<4TZOV3CH_0!ZMGU,C_PMW^J7QZ9&9L3 -MK((?"@Q/A4>&R@FWIVJE"+SN$?%C::%M7Z!!RBV:C?J"*,8?)(+2%UQ<&I21 -M_"(;['H?II]E;4R8NDFNG7(=[?2@+7[-_"`=QX6A/M=.3SF"=BHG(/_?PV7N -M3C'MO`@:%/L/9\_X%R'? -M[L'Y*0``'```0`3^*_M\+('M"V'W5K5_K'BG7.V*]@```!P``$`%D%E4IX.^ -M+#?BS,3]TG"E,MOF]"A$$K=&E%0&``P!```,`0```@```$4``0A-R```0!&H -MR<"H`0+`J`$!`?0!]`#T!]FHB'6H&8F2IG&^@UCOKG9C+B`C"`````$```#L -M(P``T/8&$UK3<^<(-OVI&V/*3&".&M6"&$B,)D?_'HJ1*5BJ=^^\,&BBKFJW -MP]#+'F^X9-^9QB\LP$5P@(1P@52CD\+TR^^M'VA(4EU)VU8^$S1:3FXOT&;` -M3BSBD?1Q2Z[&OS*#5L1&)'RK@UO:/HX:KEEG)(\!ZSH<`J5!M-H)LR=K0`U0 -MH&=4*F>$:,7T'E0!?`"63Q`#^,B(EJ;Q(A6E\:!@<3S(.`+*XZON&$%\##7< -M;UB@&MN6[1P`G&CC!IKG#TL0K[=S;!$:WDV";D02MT;S:P8`O````+P````" -M````10``N$W)``!`$:D8P*@!`<"H`0(!]`'T`*0&B:B(=:@9B9*F<;Z#6.^N -M=F,N(",@`````0```)PD``"`:OZ5O%%'L*U^3,N10<%@I$]\;MW&LIU!2M7B -MN()43]QL/N:8.N%`BU=DL6230X=D5-&_35%:KP/!7J_G&^:TSU&K8&,,1;SP -MXJ+;CNYP"5I.`0_;-"K;;0/:Y=[YU)!\W\C,UO/:FW27Q8Z$J5+9@[K[E!JQ -MWAL+N?^M.T02MT8RB@8`'`$``!P!```"````10`!&$W*``!`$:BWP*@!`L"H -M`0$!]`'T`00'Z:B(=:@9B9*F<;Z#6.^N=F,N("0(`````@```/PA``#@4\QL -M"T'Q3D_`5\?VHU)*W>A2'R;V?`6$,*D"VQI2[1;3(F,-+K45-RW!+9?5'S?YI]JIQ:;H)UK6QHAP#+?TO-;[@"7I -M.[;=7U@?KKR^RWF,AV%Z3L&P:Z*0K%_!UN3"GQ -M?;]$A\:2//`+<$#5.;R4?'!7D.3IFX-*>N*HUY]6(.$6%>"G8HB:JX(>#0,3 -M+?N,QK-QA8)!&\V8PD*HL0IF)TVN'.!5^S"DT^9,EIOFX(MB:5CT1&QN2@R- -M>B12*5G&%2YCI77`:3#""74YO[W_",<%,T*,]K12X+BP)9PBDI)=+M8NB5:\ -M?CJ1&F%0F^&LCWM\U&-A=N4D]-#Q=7/RKMW.(E'];5V7NO>T -M'G@T(KQ-J_70.K)"#2=].R\HT?`#VIC11!*W1A"[!@!L````;`````(```!% -M``!H36&N!*].1Z=P)@UAXIT8^Q/."3I'EP!H -MVLLT+WF9S#T-6?=ZE$02MT9=U`8`/`$``#P!```"````10`!.$W.``!`$:B3 -MP*@!`L"H`0$!]`'T`20'":B(=:@9B9*F<;Z#6.^N=F,N("0(````!````1PA -M``$`Q_+QS$F7LPIA8C(BU+^U-;JC`AF<38P?W/IT6PLIM>=AC_`U:$A$324! -M#EK4('8(D.W@9L@X)ILBV>,-3^P:`2YS&B$,)#^`.V89<-,NF8Z1GU<\5T+2 -M*(E)!2Q:1J#-?$H:*5[>*6Q/V8.;9-Q)1.$:-?0JC.&+1'(`_0/;U8IQ6#LZ -M)\.`%(R`'.%$4O?75K'U6Q"X2EC/J5)@`?_W%7%49%`BY$5@A5%\[MF+>>(. -MTS*7SUK8`H?G@G**C&N'TK0BY^[:''*S/KQ1I;=M[YI9_]&T^7WLB,(J3U1( -MIQKNWR#(?:Y;1,TN>E&=<9I0GX/SLOKV]<8'VF"?1!*W1A7@!@`<`0``'`$` -M``(```!%``$83<\``$`1J++`J`$"P*@!`0'T`?0!!`?IJ(AUJ!F)DJ9QOH-8 -M[ZYV8RX@)`@````%````_"$``.#:YA-*G/\:3CS%FGG@&:D_A&G=3B^JJM'# -MK[HB[-$H_;'HE4QU/X]BKK:JR7,O04L&7L.5::9POFF`R!ZSY$O)/L8^FG5- -M!%;&<#S7&#<>WN]G22@8#YT4PYY2SZ2E%S:.?;+Z"_VT'/5MEP!B,Q`_(F4/ -MW-7_JX08Y`D#Y'2>$FT&Z=PJ&,_5O]H`$^/IZU/GF[XPZM\/3=SONK#`CH<+ -M*=.;)`''6VC\1J!F>"A7RDC51^00K!7*NV'.F8.+G4T1(H=&14-QL,QN -MP&?A3AY<5E*$#/VN#JA,?PIN>9_W^Q,=%78_[O1>@/)'%LWD?2-2?VC@5:?# -MK<L$[MO$`F''>J9)_!&0RS0&P0C0@30%8.Z\Z1!*W -M1G4.!P#L````[`````(```!%``#H3=$``$`1J.#`J`$!P*@!`@'T`?0`U`:Y -MJ(AUJ!F)DJ9QOH-8[ZYV8RX@)"`````%````S"$``+#V_($3\TN2ZWU96@2/ -M5]1EDT0:V:89&>61GGWD14^C6(*3?3MTR#JY6?T%/&H2I1L$H.DN`6@W@F6+ -MN:\KO,>DO5X>[RV\W'<5RL;J[/O,!1I&\B8]&X.'O:U^:,;DNAOI>4X6/DA' -M:)E:GTH8[!UNV[=Z-I -MJ$1-Q'I-P)7KTZP['<,W5PO$+)/-;>A.EC.%\9;&%Z& -MWO@]9O3$W<0SYFNOE0I9G$U>E$YL+8^OS+F4M\).+K>I:E@[A=8X`^J9# -MOMA?>M[BXN=;KNR>#?B(5Z9\I?*B])&="R1ZW7^RA175J#,KC9`[I -MC!9HG?411#(HA&TL6X@PZFT4G!J^T1K0HHRC.9,#;I&674BH*HF!1:VIE*]5 -MEX:62`JVRVE^$^9Y:*=TC#,X>&[[=R4.5!&SI^K(3-(A,DO7N1"=FFE$$K=& -M=S8'`!P!```<`0```@```$4``1A-TP``0!&HKL"H`0+`J`$!`?0!]`$$!^FH -MB'6H&8F2IG&^@UCOKG9C+B`D"`````<```#\(0``X`+'`_2]V#)&K<9^'*!] -M?GS^(;:]Z48W:`HS*!.XI,I'-!J].IPW)CB6P()2O['J;'ZD1X.Y*L4JRT^_ -M[%/P-50H'&-W90P)((\]=XL1YWM?O9@[X>EFF2,CDN\QI0']ISQA4/S"Z`NK -M'@U)A%O5U1'WR2A>P(-2:'HJR-<-#>PT=DD<0+E\N=I`5@;\7HU&N^&9YMD: -MZ9.W^J!8/L0I:H"!+[?@KHC3O53$HPY>VR=XR6#SX,M;$VGIF?A-Y-QRM=`& -M@%[[?BTNU`,^$?^5>`$M(I0N-YG)."4&H"%$$K=&#D8'`.P```#L`````@`` -M`$4``.A-U```0!&HW<"H`0'`J`$"`?0!]`#4!KFHB'6H&8F2IG&^@UCOKG9C -M+B`D(`````8```#,(0``L'XN9B/&;A8=Z60:Q^&VW]SSI?1;OM$COHCS=4T2 -M440$K\!4L\?WB>M2I#*D.#6=WC$5+!&XT@D@/6)WG*!D@CUP4VQ`^$;4/6:4 -MHO$J,7;U<`>C4&R"__KSV[<3N]NU]4"WLYKN/)<45G%00U8)7WJPQ:A#1\`F -MB\XEG*4;2BW76GXZ?N>?.__%C2_`K#9H8BGR,)M=F-'A_G=P3C&>2^J!TOBZ\M#^#]$ -M0DEGD!CL;QN>3:LF*0RI27"0&WI0+,X -MR12SK:&MNW"_%P=&0^WY?F.MY>T']T9T\FQ(TM:I!$1W -M[I\@,(3";H5`68?LBY:3WJZB#.>,*D4;].@TU[S#Q4P3(K7RBZ,'\LXQH`52 -MN7N/P0.BG^XN`$#,W?H0OSJST2">9#PBC>Q74D#'O74,]-;0;)6/9KV*>8,= -M^''V^]D^`EL6O0/>-?_-NKK&57#2-GYB39^.A6#:F\.B%"MU`(M\ZXZ#G;]" -M7:=,2^%\:QO9<(W4$+<^6@M]T)9N,1#?7[HWQG^INP=6]210)S')V -MUP[@NI%RM!=_O.?Z*!<:(VRHXN#!2>8"R<:@H_]?!4*']4M\,4L'S?;21B0= -MTV3'09S`9'0BT(]5$;$^>URW&6%D9N'&EF]UB-:[/][SY(/,+P%8P'!QUM^N]SW,MLW/>E=8Y!=XVLZW'/9S -M/A<6B^_V[R`5UG#`ME=/QRZ7U"@I"99O.4J?G@_.V.)IN_8.D_#R"`](W-3@ -M+_$2FY3VBR:-W9S_0V\XYX^GF&V'YB+1\]H[/">55PZ\)]/#U1\I[P__`:Z) -MO7'2X0JX^NY]>[2UOHJ>X.J;7C1[NO/KWZ\9S_N -M98A1*)EIQ5[<;587&*#'8;";#V?);F'0"G^BDI`CM:W/W3-#;V.D>!0=4;4C -M,T02MT9GY@<`?````'P````"````10``>$W8``!`$:E)P*@!`L"H`0$!]`'T -M`&0&21V;Z44=3Y>H9**DM=#A>VHN("4(`````````%PJ``!`:1M(@IML76W9 -M/ZCC/#C=3`#U0TW"*T)1P(=O"]M=NZ/=!B@Y!U6:)R\'['<)N=66HDS8_FFX -&*A]EV_;R -` -end diff --git a/contrib/tcpdump/tests/ikev2fourv.out b/contrib/tcpdump/tests/ikev2fourv.out deleted file mode 100644 index 1162649b4f6..00000000000 --- a/contrib/tcpdump/tests/ikev2fourv.out +++ /dev/null @@ -1,107 +0,0 @@ -IP (tos 0x0, ttl 64, id 19908, offset 0, flags [none], proto UDP (17), length 404) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 7aee!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->0000000000000000: parent_sa ikev2_init[I]: - (sa: len=116 - (p: #1 protoid=isakmp transform=12 len=116 - (t: #1 type=encr id=aes (type=keylen value=0080)) - (t: #2 type=encr id=aes (type=keylen value=0100)) - (t: #3 type=encr id=aes (type=keylen value=00c0)) - (t: #4 type=encr id=3des ) - (t: #5 type=prf id=hmac-sha ) - (t: #6 type=prf id=hmac-md5 ) - (t: #7 type=prf id=aes128_xcbc ) - (t: #8 type=integ id=hmac-sha ) - (t: #9 type=integ id=hmac-md5 ) - (t: #10 type=integ id=aes-xcbc ) - (t: #11 type=dh id=modp1024 ) - (t: #12 type=dh id=modp2048 ))) - (v2ke: len=128 group=modp1024 b5445bd60cece6fdcd3c96a52cbb7bb426a8c7a0f56a9c38d1b1c4f0c3a6e8e7dba5c7339b6ed02e757119dfb5b6933ce93b604987fbbc77221b2a0c7cdd32787eff10572bef546c361462f9da34847969a42e51c755996beac42e6fba961a75de0fc1b23f099380896ee89202122dedac1bd54aa8494ac3d740be4d2a4cf39d) - (nonce: len=32 nonce=(6128ebd023a864e94a7ffb74bf7cce2fd4367322b8b073f942282bd52ebfe3e6) ) - (n: prot_id=#0 type=16388(nat_detection_source_ip)) - (n: prot_id=#0 type=16389(nat_detection_destination_ip)) -IP (tos 0x0, ttl 64, id 19909, offset 0, flags [none], proto UDP (17), length 88) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum a706!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->0000000000000000: parent_sa ikev2_init[R]: - (n: prot_id=#0 type=16390(cookie) data=(00000001c2221e50c16e123f2b0c71aefcf0cb3b798782c6)) -IP (tos 0x0, ttl 64, id 19910, offset 0, flags [none], proto UDP (17), length 436) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 7d6f!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->0000000000000000: parent_sa ikev2_init[I]: - (n: prot_id=#0 type=16390(cookie) data=(00000001c2221e50c16e...ba041b5de59955900d818ac54e18b236739d9e8b)) - (sa: len=116 - (p: #1 protoid=isakmp transform=12 len=116 - (t: #1 type=encr id=aes (type=keylen value=0080)) - (t: #2 type=encr id=aes (type=keylen value=0100)) - (t: #3 type=encr id=aes (type=keylen value=00c0)) - (t: #4 type=encr id=3des ) - (t: #5 type=prf id=hmac-sha ) - (t: #6 type=prf id=hmac-md5 ) - (t: #7 type=prf id=aes128_xcbc ) - (t: #8 type=integ id=hmac-sha ) - (t: #9 type=integ id=hmac-md5 ) - (t: #10 type=integ id=aes-xcbc ) - (t: #11 type=dh id=modp1024 ) - (t: #12 type=dh id=modp2048 ))) - (v2ke: len=128 group=modp1024 b5445bd60cece6fdcd3c96a52cbb7bb426a8c7a0f56a9c38d1b1c4f0c3a6e8e7dba5c7339b6ed02e757119dfb5b6933ce93b604987fbbc77221b2a0c7cdd32787eff10572bef546c361462f9da34847969a42e51c755996beac42e6fba961a75de0fc1b23f099380896ee89202122dedac1bd54aa8494ac3d740be4d2a4cf39d) - (nonce: len=32 nonce=(6128ebd023a864e94a7ffb74bf7cce2fd4367322b8b073f942282bd52ebfe3e6) ) - (n: prot_id=#0 type=16388(nat_detection_source_ip)) - (n: prot_id=#0 type=16389(nat_detection_destination_ip)) -IP (tos 0x0, ttl 64, id 19911, offset 0, flags [none], proto UDP (17), length 332) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 337f!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->71be8358efae7663: parent_sa ikev2_init[R]: - (sa: len=44 - (p: #1 protoid=isakmp transform=4 len=44 - (t: #1 type=encr id=aes (type=keylen value=0080)) - (t: #2 type=prf id=hmac-sha ) - (t: #3 type=integ id=hmac-sha ) - (t: #4 type=dh id=modp1024 ))) - (v2ke: len=128 group=modp1024 5a56714d3abf64e3a3f401ead9f5323ff0b77faa5f1e99199b13ac821f0a0c4f854786ca09b7a76aa508bcee11f16369a16d5fa041ca2d9a8dfa8228c61f2482d2175c5c1a9491fc221bec7a1fa69f656d4c98ba49ae9d721dedf4a02d7ecdfc201dc785a13ed74e4f3982762a2720ffdfc365ee4e37279af496cd86f881fd15) - (nonce: len=32 nonce=(b31c379f272ce2984bd17ca38c8729e1edbc081a14fb0f67cff81721dfeec1f9) ) - (n: prot_id=#0 type=16388(nat_detection_source_ip)) - (n: prot_id=#0 type=16389(nat_detection_destination_ip)) -IP (tos 0x0, ttl 64, id 19912, offset 0, flags [none], proto UDP (17), length 264) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum fdaa!] isakmp 2.0 msgid 00000001 cookie a88875a8198992a6->71be8358efae7663: child_sa ikev2_auth[I]: - (v2e: len=204 f606135ad373e70836fda91b63ca4c608e1ad58218488c2647ff1e8a912958aa77efbc3068a2ae6ab7c3d0cb1e6fb864df99c62f2cc045708084708154a393c2f4cbefad1f6848525d49db563e13345a4e6e2fd066c04e2ce291f4714baec6bf328356c446247cab835bda3e8e1aae5967248f01eb3a1c02a541b4da09b3276b400d50a067542a678468c5f41e54017c00964f1003f8c88896a6f12215a5f1a060713cc83802cae3abee18417c0c35dc6f58a01adb96ed1c009c68e3069ae70f4b10afb7736c111ade4d826e) -IP (tos 0x0, ttl 64, id 19913, offset 0, flags [none], proto UDP (17), length 184) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum bf00!] isakmp 2.0 msgid 00000001 cookie a88875a8198992a6->71be8358efae7663: child_sa ikev2_auth[R]: - (v2e: len=124 6afe95bc5147b0ad7e4ccb9141c160a44f7c6eddc6b29d414ad5e2b882544fdc6c3ee6983ae1408b5764b1649343876454d1bf4d515aaf03c15eafe71be6b4cf51ab60630c45bcf0e2a2db8eee70095a4e010fdb342adb6d03dae5def9d4907cdfc8ccd6f3da9b7497c58e84a952d983bafb941ab1de1b0bb9ffad3b) -IP (tos 0x0, ttl 64, id 19914, offset 0, flags [none], proto UDP (17), length 280) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum c32d!] isakmp 2.0 msgid 00000002 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=220 53cc6c0b41f14e4fc057c7f6a3524adde8521f26f67c058430a902db1a52ed16d322630d2eb515372dc12d97dc7c20552607e2ed193d9b33939e10aa2fc37b6199f0a629c6b58135f5b6f9e07906cd30dc3cae7d55fe08d95d3e660a623731c396a325adbff11c490f9fd102224391a65fb7bbe862945b64cf1fb833b9ce68c83df0b9d2ce7bd54f650864af9445e547cdfe5caa393344ae5274933b7efcf616821ea7daa9c5a6e8275ad6c688700cb7f4bcd6fb8025e93bb6dd5f581faebcbecb798c87617a4ec1b06ba290ac5fc1d6e4c2725c1f9f0e10b144fbbe) -IP (tos 0x0, ttl 64, id 19915, offset 0, flags [none], proto UDP (17), length 248) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum e6d7!] isakmp 2.0 msgid 00000003 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=188 9603e03f280964782717da15a502f0a9e9f17dbf4487c6923cf00b7040d539bc947c705790e4e99b834a7ae2a8d79f5620e11615e0a762889aab821e0d03132dfb8cc6b3718582411bcd98c242a8b10a66274dae1ce055fb30a4d3e64c969be6e08b626958f4446c6e4a0c8d7a24522959c6152e63a575c06930c2097539bfbdff08c70533428cf6b452e0b8b0259c2292925d2ed62e8956bc7e3a911a61509be1ac8f7b7cd4636176e524f4d0f17573f2aeddce2251fd6d5d9cd54d) -IP (tos 0x0, ttl 64, id 19916, offset 0, flags [none], proto UDP (17), length 104) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum f2c0!] isakmp 2.0 msgid 00000002 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=44 5bd2d26cb43b6cec30dec13fa387359797baf7b41e783422bc4dabf5d03ab2420d277d3b2f28d1f003da98d1) -IP (tos 0x0, ttl 64, id 19917, offset 0, flags [none], proto UDP (17), length 104) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum e03a!] isakmp 2.0 msgid 00000003 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=44 38f60ab69110967961ae04af4e47a770260d61e29d18fb13ce093a47970068dacb342f7999cc3d0d59f77a94) -IP (tos 0x0, ttl 64, id 19918, offset 0, flags [none], proto UDP (17), length 312) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 661c!] isakmp 2.0 msgid 00000004 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=252 c7f2f1cc4997b30a61623222d4bfb535baa302199c4d8c1fdcfa745b0b29b5e7618ff0356848444d25010e5ad420760890ede066c838269b22d9e30d4fec1a012e731a210c243f803b661970d32e998e919f573c5742d2288949052c5a46a0cd7c4a1a295ede296c4fd9839b64dc4944e11a35f42a8ce18b447200fd03dbd58a71583b3a27c380148c801ce14452f7d756b1f55b10b84a58cfa9526001fff7157154645022e4456085517ceed98b79e20ed33297cf5ad80287e782728a8c6b87d2b422e7eeda1c72b33ebc51a5b76def9a59ffd1b4f97dec88c22a4f5448a71aeedf20c87dae5b44cd2e7a519d719a509f83f3b2faf6f5c607da609f) -IP (tos 0x0, ttl 64, id 19919, offset 0, flags [none], proto UDP (17), length 280) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum d1d0!] isakmp 2.0 msgid 00000005 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=220 dae6134a9cff1a4e3cc59a79e019a93f8469dd4e2faaaad1c3afba22ecd128fdb1e8954c753f8f62aeb6aac9732f414b065ec39569a670be6980c81eb3e44bc93ec63e9a754d0456c6703cd718371edeef674928180f9d14c39e52cfa4a517368e7db2fa0bfdb41cf56d97006233103f22650fdcd5ffab8418e40903e4749e126d06e9dc2a18cfd5bfda0013e3e9eb53e79bbe30eadf0f4ddcefbab0c08e870b29d39b2401c75b68fc46a066782857ca48d547e410ac15cabb6738875200b535cbd9ae1e1ce99839c9c25639070e5ed977809c50b6bb9550b50b49bb) -IP (tos 0x0, ttl 64, id 19920, offset 0, flags [none], proto UDP (17), length 232) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum db6a!] isakmp 2.0 msgid 00000004 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=172 1fd8516b57b1ab1bdbcdba1930a5097decc023c5c534497ca53f178b9d4d11228746454371b0cc6ec067e14e1e5c5652840cfdae0ea84c7f0a6e799ff7fb131d15763feef45e80f24716cde47d23527f68e055a7c3adc7225489295e1bc3f1029b63822872865df55c6c275dead8a6f64bda8ae44f42c318fa71eb04eed7312dafd2dd8665fd5d3225f3aae6f7335b581c3a89c07af1009871dea9927f046432cd01b04234204d01583baf3a) -IP (tos 0x0, ttl 64, id 19921, offset 0, flags [none], proto UDP (17), length 232) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 9a59!] isakmp 2.0 msgid 00000005 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=172 f6fc8113f34b92eb7d595a048f57d46593441ad9a61919e5919e7de4454fa35882937d3b74c83ab959fd053c6a12a51b04a0e92e01683782658bb9af2bbcc7a4bd5e1eef2dbcdc7715cac6eaecfbcc051a46f2263d1b8387bdad7e68c6e4ba1be9794e163e484768995a9f4a18edcbc6a44f0a74cb01c318e7848562e0866f388b8d04f14f1af87de7de6cee1f889d4330d82932a7127b7d1a934e641c32b76e33b37706d50286f8cbe335ba) -IP (tos 0x0, ttl 64, id 19922, offset 0, flags [none], proto UDP (17), length 312) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 5ff4!] isakmp 2.0 msgid 00000006 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=252 0aa2636a3b897ff3fa8093282ad1724ec9f326b64bf998e781d6edbb77a369a8444dc47a4dc095ebd3ac3b1dc337570bc42c93cd6dcb7289bc99a90874e66cc4ede7a13a58ce17c65b185e86def83d66f4c4ddc433e66baf1834e54296671357a5139b0b63ebf32e652df0938badea5a960ee1758e00faa643bed85f7adee2e2e75baeec9e0df88857a67ca5f2a2f4919d0b272313d42c791eb75feca145756a0ccae3640ee98c16689df511443228846d2c5b8830ea6d149c1abed11ad0a28ca33993036e91965d48a82a898145ada994af55978696480ab6cb697e13e67968a7748c3338786efb77250e5411b3a7eac84cd221324bd7b9109d9a69) -IP (tos 0x0, ttl 64, id 19923, offset 0, flags [none], proto UDP (17), length 280) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 9890!] isakmp 2.0 msgid 00000007 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=220 02c703f4bdd83246adc67e1ca07d7e7cfe21b6bde94637680a332813b8a4ca47341abd3a9c37263896c08252bfb1ea6c7ea44783b92ac52acb4fbfec53f03554281c6377650c09208f3d778b11e77b5fbd983be1e96699232392ef31a501fda73c6150fcc2e80bab1e0d49845bd5d511f7c9285ec08352687a2ac8d70d0dec3476491c40b97cb9da405606fc5e8d46bbe199e6d91ae993b7faa0583ec4296a80812fb7e0ae88d3bd54c4a30e5edb2778c960f3e0cb5b1369e999f84de4dc72b5d006805efb7e2d2ed4033e11ff9578012d22942e3799c9382506a021) -IP (tos 0x0, ttl 64, id 19924, offset 0, flags [none], proto UDP (17), length 232) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 902e!] isakmp 2.0 msgid 00000006 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=172 7e2e6623c66e161de9641ac7e1b6dfdcf3a5f45bbed123be88f3754d12514404afc054b3c7f789eb52a432a438359dde31152c11b8d209203d62779ca064823d70536c40f846d43d6694a2f12a3176f57007a3506c82fffaf3dbb713bbdbb5f540b7b39aee3c97145671504356095f7ab0c5a84347c0268bce259ca51b4a2dd75a7e3a7ee79f3bffc58d2fc0ac36686229f2309b5cd0c0dcc2af798664c14f5f166ab5e3c1f693092121aa44) -IP (tos 0x0, ttl 64, id 19925, offset 0, flags [none], proto UDP (17), length 232) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 49dd!] isakmp 2.0 msgid 00000007 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=172 7b545033a2d35df2ab9f26c4bc444713910a32e60fb04cb10a9e76634787f9ddc138c6792faa074be2ebcb43f83f444249679018ec6dc7d4e2247dd8cb915778d90fa5597f1ecba8471db53e3b4da8f73d1eb60c23ca9fb5fa599dc526a961364471b49e5288fcef6a24d02a084d29c4a5c5d1fa305310dba01d09c9c36c86c0af297e05d3fc8559a11666a4363bacc354e96c941349b3f60dd397eb4c2bb09f381831167c0b33686c6bb5d8) -IP (tos 0x0, ttl 64, id 19926, offset 0, flags [none], proto UDP (17), length 392) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 1d29!] isakmp 2.0 msgid 00000008 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=332 c4bf89ec6e7936ac98a432a525c2406de940b338c9149ce19cb1bf23a69dfd481df7b3ada1adbb70bf17074643edf97e63ade5ed07f74674f26c48d2d6a9044477ee9f203084c26e85405987ec8b9693deaea20ce78c2a451bf4e834d7bcc3c54c1322b5f28ba307f2ce31a00552b97b8fc103a29fee2e0040ccddfa10bf3ab3d1209e643c228dec575240c7bd750cf4d6d06c958f66bd8a79831df871f6fbd93e025b16bd03de35ffcdbabac65570d2367e624d9f8e8560da9bc3a2142b75008b7ceb8e839dbf425da74c4be15c9dc31735ef1ac6f65c2375042dcf9682df74259b8c4437d7ee8df19fea6ec1d5bd491409cc7276d70ee0ba9172b4177fbce7fa28171a236ca8e2e0c149e602c9c6a0a3ff5f054287f54b7c314b07cdf6d246241dd364c7419cc0647422d08f5511b13e7b5cb719616466e1c6966f5ccd4d2ca2b12dda7047c6f63af5dd47) -IP (tos 0x0, ttl 64, id 19927, offset 0, flags [none], proto UDP (17), length 344) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 25cf!] isakmp 2.0 msgid 00000008 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=284 2c1ac864ae2c8499b3c7af8c61a8c4dc9e1af23577b588d6bb3fdef3e483cc2f0158c07071d6dfaef73dccb6cdcf7a5758e41778daceb71cf6733e17168beff6ef2015d670c0b6574fc72e97d4282909966f394a9f9e0fced8e269bbf60e93f0f2080f48dcd4e02ff1129b94f68b268ddd9cff436f38e78fa7986d87e622d1f3da3b3c2795570ebc27d3c3d51f29ef0fff01ae89bd71d2e10ab8faee7d7bb4b5be8a9ee0ea9b5e347bbaf3ebdfaf19735d75e6faa020d6ea72826c2aa5cb2ee648de6b36cbb25087428dea44bd34504e05f2d4fef43c48e2a690510e9278ca8ff2f775792af061b5ccbcf77b3fee658851289969c55edc6d561718a0c761b09b0f67c96e61d00a7fa2929023b5adcfdd33436f63a478141d51b52333) -IP (tos 0x0, ttl 64, id 19928, offset 0, flags [none], proto UDP (17), length 120) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 6e7f!] isakmp 2.0 msgid 00000000 cookie 1d9be9451d4f97a8->64a2a4b5d0e17b6a: parent_sa inf2[I]: - (v2e: len=60 691b48829b6c5d6dd93fa8e33c38dd4c00f5434dc22b4251c0876f0bdb5dbba3dd06283907559a272f07ec7709b9d596a24cd8fe69b82a1f65dbf6f2) diff --git a/contrib/tcpdump/tests/ikev2fourv4.out b/contrib/tcpdump/tests/ikev2fourv4.out deleted file mode 100644 index d001fc8b682..00000000000 --- a/contrib/tcpdump/tests/ikev2fourv4.out +++ /dev/null @@ -1,107 +0,0 @@ -IP (tos 0x0, ttl 64, id 19908, offset 0, flags [none], proto UDP (17), length 404) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 7aee!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->0000000000000000: parent_sa ikev2_init[I]: - (sa: len=116 - (p: #1 protoid=isakmp transform=12 len=116 - (t: #1 type=encr id=aes (type=keylen value=0080)) - (t: #2 type=encr id=aes (type=keylen value=0100)) - (t: #3 type=encr id=aes (type=keylen value=00c0)) - (t: #4 type=encr id=3des ) - (t: #5 type=prf id=hmac-sha ) - (t: #6 type=prf id=hmac-md5 ) - (t: #7 type=prf id=aes128_xcbc ) - (t: #8 type=integ id=hmac-sha ) - (t: #9 type=integ id=hmac-md5 ) - (t: #10 type=integ id=aes-xcbc ) - (t: #11 type=dh id=modp1024 ) - (t: #12 type=dh id=modp2048 ))) - (v2ke: len=128 group=modp1024 b5445bd60cece6fdcd3c96a52cbb7bb426a8c7a0f56a9c38d1b1c4f0c3a6e8e7dba5c7339b6ed02e757119dfb5b6933ce93b604987fbbc77221b2a0c7cdd32787eff10572bef546c361462f9da34847969a42e51c755996beac42e6fba961a75de0fc1b23f099380896ee89202122dedac1bd54aa8494ac3d740be4d2a4cf39d) - (nonce: len=32 nonce=(6128ebd023a864e94a7ffb74bf7cce2fd4367322b8b073f942282bd52ebfe3e6) ) - (n: prot_id=#0 type=16388(nat_detection_source_ip) data=(442ffe5aea0cee4dbacc758e801233bdc09a0abf0000001c00004005ba041b5de59955900d818ac54e18b236739d9e8b)) - (n: prot_id=#0 type=16389(nat_detection_destination_ip) data=(ba041b5de59955900d818ac54e18b236739d9e8b)) -IP (tos 0x0, ttl 64, id 19909, offset 0, flags [none], proto UDP (17), length 88) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum a706!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->0000000000000000: parent_sa ikev2_init[R]: - (n: prot_id=#0 type=16390(cookie) data=(00000001c2221e50c16e123f2b0c71aefcf0cb3b798782c6)) -IP (tos 0x0, ttl 64, id 19910, offset 0, flags [none], proto UDP (17), length 436) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 7d6f!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->0000000000000000: parent_sa ikev2_init[I]: - (n: prot_id=#0 type=16390(cookie) data=(00000001c2221e50c16e123f2b0c71aefcf0cb3b798782c622000078000000740101000c0300000c0100000c800e00800300000c0100000c800e01000300000c0100000c800e00c003000008010000030300000802000002030000080200000103000008020000040300000803000002030000080300000103000008030000050300000804000002000000080400000e2800008800020000b5445bd60cece6fdcd3c96a52cbb7bb426a8c7a0f56a9c38d1b1c4f0c3a6e8e7dba5c7339b6ed02e757119dfb5b6933ce93b604987fbbc77221b2a0c7cdd32787eff10572bef546c361462f9da34847969a42e51c755996beac42e6fba961a75de0fc1b23f099380896ee89202122dedac1bd54aa8494ac3d740be4d2a4cf39d290000246128ebd023a864e94a7ffb74bf7cce2fd4367322b8b073f942282bd52ebfe3e62900001c00004004442ffe5aea0cee4dbacc758e801233bdc09a0abf0000001c00004005ba041b5de59955900d818ac54e18b236739d9e8b)) - (sa: len=116 - (p: #1 protoid=isakmp transform=12 len=116 - (t: #1 type=encr id=aes (type=keylen value=0080)) - (t: #2 type=encr id=aes (type=keylen value=0100)) - (t: #3 type=encr id=aes (type=keylen value=00c0)) - (t: #4 type=encr id=3des ) - (t: #5 type=prf id=hmac-sha ) - (t: #6 type=prf id=hmac-md5 ) - (t: #7 type=prf id=aes128_xcbc ) - (t: #8 type=integ id=hmac-sha ) - (t: #9 type=integ id=hmac-md5 ) - (t: #10 type=integ id=aes-xcbc ) - (t: #11 type=dh id=modp1024 ) - (t: #12 type=dh id=modp2048 ))) - (v2ke: len=128 group=modp1024 b5445bd60cece6fdcd3c96a52cbb7bb426a8c7a0f56a9c38d1b1c4f0c3a6e8e7dba5c7339b6ed02e757119dfb5b6933ce93b604987fbbc77221b2a0c7cdd32787eff10572bef546c361462f9da34847969a42e51c755996beac42e6fba961a75de0fc1b23f099380896ee89202122dedac1bd54aa8494ac3d740be4d2a4cf39d) - (nonce: len=32 nonce=(6128ebd023a864e94a7ffb74bf7cce2fd4367322b8b073f942282bd52ebfe3e6) ) - (n: prot_id=#0 type=16388(nat_detection_source_ip) data=(442ffe5aea0cee4dbacc758e801233bdc09a0abf0000001c00004005ba041b5de59955900d818ac54e18b236739d9e8b)) - (n: prot_id=#0 type=16389(nat_detection_destination_ip) data=(ba041b5de59955900d818ac54e18b236739d9e8b)) -IP (tos 0x0, ttl 64, id 19911, offset 0, flags [none], proto UDP (17), length 332) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 337f!] isakmp 2.0 msgid 00000000 cookie a88875a8198992a6->71be8358efae7663: parent_sa ikev2_init[R]: - (sa: len=44 - (p: #1 protoid=isakmp transform=4 len=44 - (t: #1 type=encr id=aes (type=keylen value=0080)) - (t: #2 type=prf id=hmac-sha ) - (t: #3 type=integ id=hmac-sha ) - (t: #4 type=dh id=modp1024 ))) - (v2ke: len=128 group=modp1024 5a56714d3abf64e3a3f401ead9f5323ff0b77faa5f1e99199b13ac821f0a0c4f854786ca09b7a76aa508bcee11f16369a16d5fa041ca2d9a8dfa8228c61f2482d2175c5c1a9491fc221bec7a1fa69f656d4c98ba49ae9d721dedf4a02d7ecdfc201dc785a13ed74e4f3982762a2720ffdfc365ee4e37279af496cd86f881fd15) - (nonce: len=32 nonce=(b31c379f272ce2984bd17ca38c8729e1edbc081a14fb0f67cff81721dfeec1f9) ) - (n: prot_id=#0 type=16388(nat_detection_source_ip) data=(fe2bfb7c2c81ed0b61f756b57fac78a75ced8af60000001c00004005905954a783be2c37e2ccc4fdd270a532dbe6f428)) - (n: prot_id=#0 type=16389(nat_detection_destination_ip) data=(905954a783be2c37e2ccc4fdd270a532dbe6f428)) -IP (tos 0x0, ttl 64, id 19912, offset 0, flags [none], proto UDP (17), length 264) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum fdaa!] isakmp 2.0 msgid 00000001 cookie a88875a8198992a6->71be8358efae7663: child_sa ikev2_auth[I]: - (v2e: len=204 f606135ad373e70836fda91b63ca4c608e1ad58218488c2647ff1e8a912958aa77efbc3068a2ae6ab7c3d0cb1e6fb864df99c62f2cc045708084708154a393c2f4cbefad1f6848525d49db563e13345a4e6e2fd066c04e2ce291f4714baec6bf328356c446247cab835bda3e8e1aae5967248f01eb3a1c02a541b4da09b3276b400d50a067542a678468c5f41e54017c00964f1003f8c88896a6f12215a5f1a060713cc83802cae3abee18417c0c35dc6f58a01adb96ed1c009c68e3069ae70f4b10afb7736c111ade4d826e) -IP (tos 0x0, ttl 64, id 19913, offset 0, flags [none], proto UDP (17), length 184) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum bf00!] isakmp 2.0 msgid 00000001 cookie a88875a8198992a6->71be8358efae7663: child_sa ikev2_auth[R]: - (v2e: len=124 6afe95bc5147b0ad7e4ccb9141c160a44f7c6eddc6b29d414ad5e2b882544fdc6c3ee6983ae1408b5764b1649343876454d1bf4d515aaf03c15eafe71be6b4cf51ab60630c45bcf0e2a2db8eee70095a4e010fdb342adb6d03dae5def9d4907cdfc8ccd6f3da9b7497c58e84a952d983bafb941ab1de1b0bb9ffad3b) -IP (tos 0x0, ttl 64, id 19914, offset 0, flags [none], proto UDP (17), length 280) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum c32d!] isakmp 2.0 msgid 00000002 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=220 53cc6c0b41f14e4fc057c7f6a3524adde8521f26f67c058430a902db1a52ed16d322630d2eb515372dc12d97dc7c20552607e2ed193d9b33939e10aa2fc37b6199f0a629c6b58135f5b6f9e07906cd30dc3cae7d55fe08d95d3e660a623731c396a325adbff11c490f9fd102224391a65fb7bbe862945b64cf1fb833b9ce68c83df0b9d2ce7bd54f650864af9445e547cdfe5caa393344ae5274933b7efcf616821ea7daa9c5a6e8275ad6c688700cb7f4bcd6fb8025e93bb6dd5f581faebcbecb798c87617a4ec1b06ba290ac5fc1d6e4c2725c1f9f0e10b144fbbe) -IP (tos 0x0, ttl 64, id 19915, offset 0, flags [none], proto UDP (17), length 248) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum e6d7!] isakmp 2.0 msgid 00000003 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=188 9603e03f280964782717da15a502f0a9e9f17dbf4487c6923cf00b7040d539bc947c705790e4e99b834a7ae2a8d79f5620e11615e0a762889aab821e0d03132dfb8cc6b3718582411bcd98c242a8b10a66274dae1ce055fb30a4d3e64c969be6e08b626958f4446c6e4a0c8d7a24522959c6152e63a575c06930c2097539bfbdff08c70533428cf6b452e0b8b0259c2292925d2ed62e8956bc7e3a911a61509be1ac8f7b7cd4636176e524f4d0f17573f2aeddce2251fd6d5d9cd54d) -IP (tos 0x0, ttl 64, id 19916, offset 0, flags [none], proto UDP (17), length 104) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum f2c0!] isakmp 2.0 msgid 00000002 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=44 5bd2d26cb43b6cec30dec13fa387359797baf7b41e783422bc4dabf5d03ab2420d277d3b2f28d1f003da98d1) -IP (tos 0x0, ttl 64, id 19917, offset 0, flags [none], proto UDP (17), length 104) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum e03a!] isakmp 2.0 msgid 00000003 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=44 38f60ab69110967961ae04af4e47a770260d61e29d18fb13ce093a47970068dacb342f7999cc3d0d59f77a94) -IP (tos 0x0, ttl 64, id 19918, offset 0, flags [none], proto UDP (17), length 312) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 661c!] isakmp 2.0 msgid 00000004 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=252 c7f2f1cc4997b30a61623222d4bfb535baa302199c4d8c1fdcfa745b0b29b5e7618ff0356848444d25010e5ad420760890ede066c838269b22d9e30d4fec1a012e731a210c243f803b661970d32e998e919f573c5742d2288949052c5a46a0cd7c4a1a295ede296c4fd9839b64dc4944e11a35f42a8ce18b447200fd03dbd58a71583b3a27c380148c801ce14452f7d756b1f55b10b84a58cfa9526001fff7157154645022e4456085517ceed98b79e20ed33297cf5ad80287e782728a8c6b87d2b422e7eeda1c72b33ebc51a5b76def9a59ffd1b4f97dec88c22a4f5448a71aeedf20c87dae5b44cd2e7a519d719a509f83f3b2faf6f5c607da609f) -IP (tos 0x0, ttl 64, id 19919, offset 0, flags [none], proto UDP (17), length 280) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum d1d0!] isakmp 2.0 msgid 00000005 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=220 dae6134a9cff1a4e3cc59a79e019a93f8469dd4e2faaaad1c3afba22ecd128fdb1e8954c753f8f62aeb6aac9732f414b065ec39569a670be6980c81eb3e44bc93ec63e9a754d0456c6703cd718371edeef674928180f9d14c39e52cfa4a517368e7db2fa0bfdb41cf56d97006233103f22650fdcd5ffab8418e40903e4749e126d06e9dc2a18cfd5bfda0013e3e9eb53e79bbe30eadf0f4ddcefbab0c08e870b29d39b2401c75b68fc46a066782857ca48d547e410ac15cabb6738875200b535cbd9ae1e1ce99839c9c25639070e5ed977809c50b6bb9550b50b49bb) -IP (tos 0x0, ttl 64, id 19920, offset 0, flags [none], proto UDP (17), length 232) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum db6a!] isakmp 2.0 msgid 00000004 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=172 1fd8516b57b1ab1bdbcdba1930a5097decc023c5c534497ca53f178b9d4d11228746454371b0cc6ec067e14e1e5c5652840cfdae0ea84c7f0a6e799ff7fb131d15763feef45e80f24716cde47d23527f68e055a7c3adc7225489295e1bc3f1029b63822872865df55c6c275dead8a6f64bda8ae44f42c318fa71eb04eed7312dafd2dd8665fd5d3225f3aae6f7335b581c3a89c07af1009871dea9927f046432cd01b04234204d01583baf3a) -IP (tos 0x0, ttl 64, id 19921, offset 0, flags [none], proto UDP (17), length 232) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 9a59!] isakmp 2.0 msgid 00000005 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=172 f6fc8113f34b92eb7d595a048f57d46593441ad9a61919e5919e7de4454fa35882937d3b74c83ab959fd053c6a12a51b04a0e92e01683782658bb9af2bbcc7a4bd5e1eef2dbcdc7715cac6eaecfbcc051a46f2263d1b8387bdad7e68c6e4ba1be9794e163e484768995a9f4a18edcbc6a44f0a74cb01c318e7848562e0866f388b8d04f14f1af87de7de6cee1f889d4330d82932a7127b7d1a934e641c32b76e33b37706d50286f8cbe335ba) -IP (tos 0x0, ttl 64, id 19922, offset 0, flags [none], proto UDP (17), length 312) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 5ff4!] isakmp 2.0 msgid 00000006 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=252 0aa2636a3b897ff3fa8093282ad1724ec9f326b64bf998e781d6edbb77a369a8444dc47a4dc095ebd3ac3b1dc337570bc42c93cd6dcb7289bc99a90874e66cc4ede7a13a58ce17c65b185e86def83d66f4c4ddc433e66baf1834e54296671357a5139b0b63ebf32e652df0938badea5a960ee1758e00faa643bed85f7adee2e2e75baeec9e0df88857a67ca5f2a2f4919d0b272313d42c791eb75feca145756a0ccae3640ee98c16689df511443228846d2c5b8830ea6d149c1abed11ad0a28ca33993036e91965d48a82a898145ada994af55978696480ab6cb697e13e67968a7748c3338786efb77250e5411b3a7eac84cd221324bd7b9109d9a69) -IP (tos 0x0, ttl 64, id 19923, offset 0, flags [none], proto UDP (17), length 280) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 9890!] isakmp 2.0 msgid 00000007 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=220 02c703f4bdd83246adc67e1ca07d7e7cfe21b6bde94637680a332813b8a4ca47341abd3a9c37263896c08252bfb1ea6c7ea44783b92ac52acb4fbfec53f03554281c6377650c09208f3d778b11e77b5fbd983be1e96699232392ef31a501fda73c6150fcc2e80bab1e0d49845bd5d511f7c9285ec08352687a2ac8d70d0dec3476491c40b97cb9da405606fc5e8d46bbe199e6d91ae993b7faa0583ec4296a80812fb7e0ae88d3bd54c4a30e5edb2778c960f3e0cb5b1369e999f84de4dc72b5d006805efb7e2d2ed4033e11ff9578012d22942e3799c9382506a021) -IP (tos 0x0, ttl 64, id 19924, offset 0, flags [none], proto UDP (17), length 232) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 902e!] isakmp 2.0 msgid 00000006 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=172 7e2e6623c66e161de9641ac7e1b6dfdcf3a5f45bbed123be88f3754d12514404afc054b3c7f789eb52a432a438359dde31152c11b8d209203d62779ca064823d70536c40f846d43d6694a2f12a3176f57007a3506c82fffaf3dbb713bbdbb5f540b7b39aee3c97145671504356095f7ab0c5a84347c0268bce259ca51b4a2dd75a7e3a7ee79f3bffc58d2fc0ac36686229f2309b5cd0c0dcc2af798664c14f5f166ab5e3c1f693092121aa44) -IP (tos 0x0, ttl 64, id 19925, offset 0, flags [none], proto UDP (17), length 232) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 49dd!] isakmp 2.0 msgid 00000007 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=172 7b545033a2d35df2ab9f26c4bc444713910a32e60fb04cb10a9e76634787f9ddc138c6792faa074be2ebcb43f83f444249679018ec6dc7d4e2247dd8cb915778d90fa5597f1ecba8471db53e3b4da8f73d1eb60c23ca9fb5fa599dc526a961364471b49e5288fcef6a24d02a084d29c4a5c5d1fa305310dba01d09c9c36c86c0af297e05d3fc8559a11666a4363bacc354e96c941349b3f60dd397eb4c2bb09f381831167c0b33686c6bb5d8) -IP (tos 0x0, ttl 64, id 19926, offset 0, flags [none], proto UDP (17), length 392) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 1d29!] isakmp 2.0 msgid 00000008 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[I]: - (v2e: len=332 c4bf89ec6e7936ac98a432a525c2406de940b338c9149ce19cb1bf23a69dfd481df7b3ada1adbb70bf17074643edf97e63ade5ed07f74674f26c48d2d6a9044477ee9f203084c26e85405987ec8b9693deaea20ce78c2a451bf4e834d7bcc3c54c1322b5f28ba307f2ce31a00552b97b8fc103a29fee2e0040ccddfa10bf3ab3d1209e643c228dec575240c7bd750cf4d6d06c958f66bd8a79831df871f6fbd93e025b16bd03de35ffcdbabac65570d2367e624d9f8e8560da9bc3a2142b75008b7ceb8e839dbf425da74c4be15c9dc31735ef1ac6f65c2375042dcf9682df74259b8c4437d7ee8df19fea6ec1d5bd491409cc7276d70ee0ba9172b4177fbce7fa28171a236ca8e2e0c149e602c9c6a0a3ff5f054287f54b7c314b07cdf6d246241dd364c7419cc0647422d08f5511b13e7b5cb719616466e1c6966f5ccd4d2ca2b12dda7047c6f63af5dd47) -IP (tos 0x0, ttl 64, id 19927, offset 0, flags [none], proto UDP (17), length 344) - 192.168.1.1.500 > 192.168.1.2.500: [bad udp cksum 25cf!] isakmp 2.0 msgid 00000008 cookie a88875a8198992a6->71be8358efae7663: child_sa child_sa[R]: - (v2e: len=284 2c1ac864ae2c8499b3c7af8c61a8c4dc9e1af23577b588d6bb3fdef3e483cc2f0158c07071d6dfaef73dccb6cdcf7a5758e41778daceb71cf6733e17168beff6ef2015d670c0b6574fc72e97d4282909966f394a9f9e0fced8e269bbf60e93f0f2080f48dcd4e02ff1129b94f68b268ddd9cff436f38e78fa7986d87e622d1f3da3b3c2795570ebc27d3c3d51f29ef0fff01ae89bd71d2e10ab8faee7d7bb4b5be8a9ee0ea9b5e347bbaf3ebdfaf19735d75e6faa020d6ea72826c2aa5cb2ee648de6b36cbb25087428dea44bd34504e05f2d4fef43c48e2a690510e9278ca8ff2f775792af061b5ccbcf77b3fee658851289969c55edc6d561718a0c761b09b0f67c96e61d00a7fa2929023b5adcfdd33436f63a478141d51b52333) -IP (tos 0x0, ttl 64, id 19928, offset 0, flags [none], proto UDP (17), length 120) - 192.168.1.2.500 > 192.168.1.1.500: [bad udp cksum 6e7f!] isakmp 2.0 msgid 00000000 cookie 1d9be9451d4f97a8->64a2a4b5d0e17b6a: parent_sa inf2[I]: - (v2e: len=60 691b48829b6c5d6dd93fa8e33c38dd4c00f5434dc22b4251c0876f0bdb5dbba3dd06283907559a272f07ec7709b9d596a24cd8fe69b82a1f65dbf6f2) diff --git a/contrib/tcpdump/tests/ikev2pI2-secrets.txt b/contrib/tcpdump/tests/ikev2pI2-secrets.txt deleted file mode 100644 index efe963678f3..00000000000 --- a/contrib/tcpdump/tests/ikev2pI2-secrets.txt +++ /dev/null @@ -1,2 +0,0 @@ -ikev2 I 0x0001020304050607 0xc02e7a3031a03188 sha1:0x4ea8e662b07cdd430f6944c6723e4b82d5722418 aes128:0x3f44bf47cafd8150591deb088199fcbf -ikev2 R 0x0001020304050607 0xc02e7a3031a03188 sha1:0x515b0bd22e6d76b34fdb760aa7bfad80b109b75d aes128:0xbedb67ec7dc3d00cccac42e70cd63bde diff --git a/contrib/tcpdump/tests/ikev2pI2.out b/contrib/tcpdump/tests/ikev2pI2.out deleted file mode 100644 index 7940e8cd038..00000000000 --- a/contrib/tcpdump/tests/ikev2pI2.out +++ /dev/null @@ -1,41 +0,0 @@ -IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 536, bad cksum 0 (->f48e)!) - 192.1.2.45.500 > 192.1.2.23.500: [no cksum] isakmp 2.0 msgid 00000000 cookie 0001020304050607->0000000000000000: parent_sa ikev2_init[I]: - (sa[C]: len=240 - (p: #1 protoid=isakmp transform=4 len=40 - (t: #1 type=encr id=aes ) - (t: #2 type=integ id=hmac-sha ) - (t: #3 type=prf id=hmac-sha ) - (t: #4 type=dh id=modp1536 )) - (p: #2 protoid=isakmp transform=4 len=40 - (t: #1 type=encr id=aes ) - (t: #2 type=integ id=hmac-sha ) - (t: #3 type=prf id=hmac-md5 ) - (t: #4 type=dh id=modp1536 )) - (p: #3 protoid=isakmp transform=4 len=40 - (t: #1 type=encr id=3des ) - (t: #2 type=integ id=hmac-sha ) - (t: #3 type=prf id=hmac-sha ) - (t: #4 type=dh id=modp1536 )) - (p: #4 protoid=isakmp transform=4 len=40 - (t: #1 type=encr id=3des ) - (t: #2 type=integ id=hmac-sha ) - (t: #3 type=prf id=hmac-md5 ) - (t: #4 type=dh id=modp1536 )) - (p: #5 protoid=isakmp transform=4 len=40 - (t: #1 type=encr id=3des ) - (t: #2 type=integ id=hmac-sha ) - (t: #3 type=prf id=hmac-sha ) - (t: #4 type=dh id=modp1024 )) - (p: #6 protoid=isakmp transform=4 len=40 - (t: #1 type=encr id=3des ) - (t: #2 type=integ id=hmac-sha ) - (t: #3 type=prf id=hmac-md5 ) - (t: #4 type=dh id=modp1024 ))) - (v2ke: len=192 group=modp1536 ffbc6a92a6b9559b05fa96a7a43507b4c1e1c0861a5871d9ba73a163113788c0debb3979e7ff0c52b4ce6050eb05369ea4300d2bff3b1b299f3b802ccb13318c2ab9e3b5627cb4b35eb939982076b57c050d7b35c3c5c7cc8c0feab7b64a7d7b6b8f6b4dabf4ac406dd20126b90a98ac766efa37a7890c4394ff9a77615b58f52d651bbfa58d2a549af8b01aa4bca3d762426663b155d4ebda9f60a6a13573e6a888135cdc673dd483029903f3a90eca23e1ec1e270331b2d050f4f758f49927) - (nonce[C]: len=16 nonce=(b5ce8419095c6e2b6b62d3055305b3c4) ) - (v2vid: len=12 vid=OErlA\nQukSR 4f45726c415c6e51756b5352) -IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 312, bad cksum 0 (->f56e)!) - 192.1.2.45.500 > 192.1.2.23.500: [no cksum] isakmp 2.0 msgid 00000000 cookie 0001020304050607->c02e7a3031a03188: parent_sa ikev2_auth[I]: - (v2e[C]: len=252 000102030405060708090a0b0c0d0e0f4bcf2da20444caca5fb591c1ab4b9b4d4f22ac7cb49e6b08d2738884fb3efd8eebc607accc1f80f890e24df65e53d61e899f1d319d89c033524d036fd4ea7e0345def93356e2865e5481a6a20a7604083de04595e1071a2e98179eefb4e6ae4708e6875ae297b4dc5b2602d971e36f66cef12303946eea897d86bbb5903115281a266f4dcb627e146972ff2f7102931df82f24a2e40df594afc11e0a85eb1c56b9eddb7e2de52fa95cf51f4b4c9b5d53237ae39f64519413d201374a987fa8d1ce460fa2d67c417462203f2948c0b9ed8b734a69a015ff63bde767f44f83c3cfe5119d72d74e695b1032b957 - (v2IDi: len=8 0200000077657374 fqdn:west) - (v2auth: len=196 method=rsasig authdata=(000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) )) diff --git a/contrib/tcpdump/tests/ikev2pI2.puu b/contrib/tcpdump/tests/ikev2pI2.puu deleted file mode 100644 index 314188e0175..00000000000 --- a/contrib/tcpdump/tests/ikev2pI2.puu +++ /dev/null @@ -1,24 +0,0 @@ -begin 644 ikev2pI2.pcap -MU,.RH0(`!````````````-P%````````@%$!```````<`@``'`(```(```!% -M``(8`````$`1``#``0(MP`$"%P'T`?0"!`````$"`P0%!@<``````````"$@ -M(@@````````!_"*``/0"```H`0$`!`,```@!```,`P``"`,```(#```(`@`` -M`@````@$```%`@``*`(!``0#```(`0``#`,```@#```"`P``"`(```$````( -M!```!0(``"@#`0`$`P``"`$```,#```(`P```@,```@"```"````"`0```4" -M```H!`$`!`,```@!```#`P``"`,```(#```(`@```0````@$```%`@``*`4! -M``0#```(`0```P,```@#```"`P``"`(```(````(!````@```"@&`0`$`P`` -M"`$```,#```(`P```@,```@"```!````"`0```(H``#(``4``/^\:I*FN56; -M!?J6IZ0U![3!X<"&&EAQV;ISH6,1-XC`WKLY>>?_#%*TSF!0ZP4VGJ0P#2O_ -M.QLIGSN`+,L3,8PJN>.U8GRTLUZY.9@@=K5\!0U[-VN/ -M:TVK]*Q`;=(!)KD*F*QV;OHWIXD,0Y3_FG=A6UCU+64;OZ6-*E2:^+`:I+RC -MUV)"9F.Q5=3KVI]@IJ$U<^:HB!-!%E>$'&BZ8 -M%Y[OM.:N1PCFAUKBE[3<6R8"V7'C;V;.\2,#E&[JB7V&N[60,14H&B9O3"H7K'%:Y[=M^+>4OJ5SU'TM,FUU3(WKC -MGV11E!/2`3=*F'^HTV+ 127.0.0.1.500: isakmp: diff --git a/contrib/tcpdump/tests/isakmp2.out b/contrib/tcpdump/tests/isakmp2.out deleted file mode 100644 index 44c28db87b1..00000000000 --- a/contrib/tcpdump/tests/isakmp2.out +++ /dev/null @@ -1 +0,0 @@ -IP 129.170.249.126.500 > 129.170.249.87.500: isakmp: phase 1 ? base diff --git a/contrib/tcpdump/tests/isakmp3.out b/contrib/tcpdump/tests/isakmp3.out deleted file mode 100644 index 86192639628..00000000000 --- a/contrib/tcpdump/tests/isakmp3.out +++ /dev/null @@ -1,3 +0,0 @@ -IP (tos 0x0, ttl 255, id 41068, offset 0, flags [none], proto UDP (17), length 312) - 127.0.0.1.501 > 127.0.0.1.500: isakmp 1.0 msgid 00000000: phase 1 I ident: - (id: idtype=FQDN protoid=0 port=0 len=248 \0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00\0x00) diff --git a/contrib/tcpdump/tests/isakmp4.out b/contrib/tcpdump/tests/isakmp4.out deleted file mode 100644 index 0de3ebcc2ab..00000000000 --- a/contrib/tcpdump/tests/isakmp4.out +++ /dev/null @@ -1,35 +0,0 @@ -ARP, Request who-has 192.1.2.23 tell 192.1.2.254, length 28 -ARP, Reply 192.1.2.23 is-at 10:00:00:64:64:23, length 28 -IP 192.1.2.254.500 > 192.1.2.23.500: isakmp: phase 1 I ident -IP 192.1.2.23.500 > 192.1.2.254.500: isakmp: phase 1 R ident -IP 192.1.2.254.500 > 192.1.2.23.500: isakmp: phase 1 I ident -IP 192.1.2.23.500 > 192.1.2.254.500: isakmp: phase 1 R ident -IP 192.1.2.254.4500 > 192.1.2.23.4500: NONESP-encap: isakmp: phase 1 I ident[E] -IP 192.1.2.23.4500 > 192.1.2.254.4500: NONESP-encap: isakmp: phase 1 R ident[E] -IP 192.1.2.254.4500 > 192.1.2.23.4500: NONESP-encap: isakmp: phase 2/others I oakley-quick[E] -IP 192.1.2.23.4500 > 192.1.2.254.4500: NONESP-encap: isakmp: phase 2/others R oakley-quick[E] -IP 192.1.2.254.4500 > 192.1.2.23.4500: NONESP-encap: isakmp: phase 2/others I oakley-quick[E] -IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x1), length 132 -ARP, Request who-has 192.1.2.254 tell 192.1.2.23, length 28 -ARP, Reply 192.1.2.254 is-at 10:00:00:de:ad:ba, length 28 -IP 192.1.2.23.4500 > 192.1.2.254.4500: NONESP-encap: isakmp: phase 2/others R oakley-quick[E] -IP 192.1.2.254.4500 > 192.1.2.23.4500: NONESP-encap: isakmp: phase 2/others I oakley-quick[E] -IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x2), length 132 -IP 192.1.2.254.4500 > 192.1.2.23.4500: isakmp-nat-keep-alive -IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x3), length 132 -IP 192.1.2.23.4500 > 192.1.2.254.4500: NONESP-encap: isakmp: phase 2/others R oakley-quick[E] -IP 192.1.2.254.4500 > 192.1.2.23.4500: NONESP-encap: isakmp: phase 2/others I oakley-quick[E] -IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x4), length 132 -IP 192.1.2.254.4500 > 192.1.2.23.4500: isakmp-nat-keep-alive -IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x5), length 132 -IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x6), length 132 -ARP, Request who-has 192.1.2.23 tell 192.1.2.254, length 28 -ARP, Reply 192.1.2.23 is-at 10:00:00:64:64:23, length 28 -IP 192.1.2.254.4500 > 192.1.2.23.4500: isakmp-nat-keep-alive -IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x7), length 132 -IP 192.1.2.23.4500 > 192.1.2.254.4500: NONESP-encap: isakmp: phase 2/others R oakley-quick[E] -IP 192.1.2.254.4500 > 192.1.2.23.4500: UDP-encap: ESP(spi=0xf4dc0ae5,seq=0x8), length 132 -ARP, Request who-has 192.1.2.254 tell 192.1.2.23, length 28 -ARP, Reply 192.1.2.254 is-at 10:00:00:de:ad:ba, length 28 -IP 192.1.2.254.4500 > 192.1.2.23.4500: isakmp-nat-keep-alive -IP 192.1.2.23.4500 > 192.1.2.254.4500: NONESP-encap: isakmp: phase 2/others R inf[E] diff --git a/contrib/tcpdump/tests/isakmp4500.puu b/contrib/tcpdump/tests/isakmp4500.puu deleted file mode 100644 index 0b55dccfde4..00000000000 --- a/contrib/tcpdump/tests/isakmp4500.puu +++ /dev/null @@ -1,155 +0,0 @@ -begin 644 isakmp4500.pcap -MU,.RH0(`!``````````````&```!```````````````J````*@```/______ -M_Q```-ZMN@@&``$(``8$``$0``#>K;K``0+^````````P`$"%P`````````` -M*@```"H````0``#>K;H0``!D9",(!@`!"``&!``"$```9&0CP`$"%Q```-ZM -MNL`!`OX``````````$X!``!.`0``$```9&0C$```WJVZ"`!%``%```!``#\1 -MM97``0+^P`$"%P'T`?0!+)6LGHGR.(^0O!X```````````$0`@`````````! -M)`T``)0````!`````0```(@``0`$`P``(``!``"`"P`!@`P.$(`!``6``@`! -M@`,``X`$``4#```@`0$``(`+``&`#`X0@`$`!8`"``*``P`#@`0`!0,``"`" -M`0``@`L``8`,#A"``0`%@`(``H`#``.`!``"````(`,!``"`"P`!@`P.$(`! -M``6``@`!@`,``X`$``(-```03T5K4F)'6%)V;5!%#0``%*_*UQ-HH?'):X:6 -M_'=7`0`-```42A,<@0<#6$5<5RCR#I5%+PT``!1]E!FF4Q#*;RP7G9(54IU6 -M#0``%,U@1D,UWR'X?/VR_&BVI$@````41(45+1BVN\T+Z*A&E7G=S``````` -M````L@```+(````0``#>K;H0``!D9",(`$4``*0``$``0!&U,<`!`A?``0+^ -M`?0!]`"08%.>B?(XCY"\'@IT-7SCT:2_`1`"``````````"(#0``-`````$` -M```!````*``!``$````@``$``(`+``&`#`X0@`$`!8`"``&``P`#@`0`!0T` -M`!!/16M28D=84G9M4$4-```4K\K7$VBA\"G0U?./1I+\$$`(````` -M`````1P*``#$M]N'X4E&AEMT*7(UA)]?Z:M`RW>TPRPR/2V-U^-O'ST7,9K7 -MCQQFQ`#^2/PP0G^@]QHR=9!Y7?/EL'O(\L(I'#51V6N1?)1J+6P-A6&T0Y@" -M-KJ[,_WPC+W%H'KSV>J_(W#3`3A4&A^4Q*T^3Q*2'^M#9[XHW-IVWO.#J=M? -MDHTX?/DS#]CDJG;?BC_E:$W:3AD]N9+!U'[+6UU.`,)4^&ASH2SO\CU.=2!# -MH'UY(FI*395>I?Z@4```4 -M;OX2\$KY#?O/L5UQN$&[G@```!1$]1?@/[.!^`^$+14XS/^L``````````!& -M`0``1@$``!```-ZMNA```&1D(P@`10`!.```0`!`$;2=P`$"%\`!`OX!]`'T -M`20!UYZ)\CB/D+P>"G0U?./1I+\$$`(``````````1P*``#$YYI?^#V[%WO* -M+,?[XKU\"YVFZ0UCMOA'6Y:C93#4^M&/)'3",1Q/"&7*"D0_<1SX#@"KRZDV -M\_XCB4O9XNS0"_O8-'[C&AG5O;G^G_N*#?4,"OA'?R><"WN68Q(H<1EONM3! -MS3=]U]MRZ(4UBM]&:I\KW&3X;LQ%M[B0:,/"]DTM1^J8+8CESE'6JEFCE,,$ -M?$W5P,^5=1K1AT@YX0J-9%/E]`MY&<%C?*Y*K\'5X#2B5OD6+FTGJ)^V299# -M*>H6%```%&Q^7ZRJ16$T%<6UJE;P`` -M`!1N_A+P2OD-^\^Q77&X0;N>``````````!R`0``<@$``!```&1D(Q```-ZM -MN@@`10`!9```0``_$;5QP`$"_L`!`A<1E!&4`5!RH0````">B?(XCY"\'@IT -M-7SCT:2_!1`"`0````````%$H"1@W`ZTW:4&'Z=!K*`IRTNLK:3J/^$DD/B4 -M>Q,F?M5`3=(?!HGW$/M)`\W8Z/'FXK6$!(9!7BL9!@QV=(^E7><\)R8EVE3F -M6`.O^:2F!(>LD7%71N]`LA?B!/!0\*H2"YOJ0]_W9#9DJYZ).M/.;+8A?L[O -M`J-'HV_0*'&&^P\8:$'I^"13SN]VT%5\8O8;P2VV=`+&9+4]'MH+/&:'PR!H -M4O#,GI+1=+*MRN"5.-8D&$16)"G0U?./1I+\%$`(!`````````2S" -M8Z5]+<^-M8Q9P&X;^%JN2^*NYC1"AZ%4J-PIMZM611WA:Z$*6IBWC.3.9037)L`[ADSH`K&0*^[6)>")$E3;"4;U="I",2*`1TP_=5+%B"II3>( -M'@``````````V@$``-H!```0``!D9",0``#>K;H(`$4``4YQ5SAO`10)\84&I?],R2.?5M -MZ/Y^Y"#*%+0.<9KX(/Z$'&M,-)/2I7U^,!G,*G!E_O.D;7F_;D^V#&&*(R.+ -MH;YSI'1@I8GV%+\'*6,1(8`8D(VUP[,(R?PQ7#,5WQY3[HT+IFF"3?.+;(*M -M_?C;JQ#]O'9522*ZO7>'TEDYLLA`*L$8(XJ$!T>_HYS?G=WR11E($-021FMS -MB[NXAJ^CQVGO87[B@^I6THHW-%Z8%PTH&BCO^.[@K_NS8RVTE7CE&MA]6C@> -MEDIDM&T^.41?F(\X$Z-5[547$HC='*\>8``"[9.IHT)+[,^LZ?_6(6I\L32# -MF-JM7U".L4?X/8=G*KFA<>THJ-622W,;J`IW2^MLBI?_O<"G0U?./1I+\($"`!BWZ)1P```5RM:&N4 -MQ1;W19+;77%JE,,H'8&F6ITJM=R5O>KL1%[]#E/LJ#&./WFJ`#,3C!H=I_'* -M34/)_E+)(`!A&W00*T\"9O9JX0N">$#'(ZL<$'\P=GHB.0:\AXT/!^^*%U.'5#'2IX:7/2KZ$%^3W;%R4[&2T>'?2(@FF -M#T/=+2O[?Q4.(\@Q;]3V=L5Q2XFG)^E)0J:1AX`J4%E3_Y]^6='!R-ENY%9# -M3!XD:5K?/V&.!&X#>I_$96Y;P_!5']070(D3N#$47!AZ^VCW-?I?JT2AL5YOWBO5[D!"OV)46(FK)9" -M$C40GNJ7*A,SE6%6A(4>KPE(-$)=L6=2VQLO>Y12N8QBH3V%(90.\5YL`R,O -M1@``````````8@```&(````0``!D9",0``#>K;H(`$4``%0``$``/Q&V@<`! -M`O[``0(7$901E`!`KQ<`````GHGR.(^0O!X*=#5\X]&DOP@0(`&+?HE'```` -M-"4[,88.:.R$%:1S6K/XK;H(`$4``*"JM```/Q%+@<`!`O[``0(7$901E`",``#TW`KE```` -M`?SD"<11-X_=FBX7J&]'/C[B>;BA23X"^A;(BA/H;8_\0'U,E@M&;+=R&*LY -MAF.NT6/*J.SL[UR2)+H^A6#5<38R;!FY\:AV_6ZV)FQ2! -M1T\L:`GPK6U?_?TVHSK[6(WSF?Q"XF5K/0U,A.Y+D\RP]G(``````````"H` -M```J````$```WJVZ$```9&0C"`8``0@`!@0``1```&1D(\`!`A<```````#` -M`0+^```````````J````*@```!```&1D(Q```-ZMN@@&``$(``8$``(0``#> -MK;K``0+^$```9&0CP`$"%P``````````B@$``(H!```0``#>K;H0``!D9",( -M`$4``7P``$``0!&T6<`!`A?``0+^$901E`%HRNX`````GHGR.(^0O!X*=#5\ -MX]&DOP@0(`&+?HE'```!7*UH:Y3%%O=%DMM=<6J4PR@=@:9:G2JUW)6]ZNQ$ -M7OT.4^RH,8X_>:H`,Q.,&AVG\B(Y!KR'C0\'[XIS!(%P&'QX74X=4,=*GAS%MDNE:?+;+?\O0S-Y -MI<]*OH07Y/=L7)3L9+1X=](B":8/0]TM*_M_%0XCR#%OU/9VQ7%+B:*]7N0$*_8E18B:LED(2-1">ZIB?(XCY"\ -M'@IT-7SCT:2_"!`@`8M^B4<````T)3LQA@YH[(05I'-:L_AR6CWGJ@DY)*0" -M``````````"N````K@```!```&1D(Q```-ZMN@@`10``H*JU```_$4N`P`$" -M_L`!`A<1E!&4`(P``/3<"N4````";5_]_3:C.OM8C?.9_$+B9;KU/R+D"U^- -MLGB)>"40ZCMW:+^A4%UI1Y)\.O4B]`44T(2XS\S=2[[[X.6A-PCDZP*3XFAD -M294>+W:M%%+\`)?XP#[:6]NHG>#;FFF-RMAA7D"KQ-&OX3Z5S'CBYC"740``````````*P```"L````0``!D9",0``#>K;H(`$4``!T` -M`$``/Q&VN,`!`O[``0(7$901E``)6)O_``````````"N````K@```!```&1D -M(Q```-ZMN@@`10``H*JV```_$4M_P`$"_L`!`A<1E!&4`(P``/3<"N4````# -M7D"KQ-&OX1F0#F$^I@1V5E>.`*!H=Z?(&*,.MS]E4H#P+2"^MMG?%@Y3*L%D'7$>LLOA,HUEB3IB;87,\:-0``````````B@$` -M`(H!```0``#>K;H0``!D9",(`$4``7P``$``0!&T6<`!`A?``0+^$901E`%H -MRNX`````GHGR.(^0O!X*=#5\X]&DOP@0(`&+?HE'```!7*UH:Y3%%O=%DMM= -M<6J4PR@=@:9:G2JUW)6]ZNQ$7OT.4^RH,8X_>:H`,Q.,&AVG\B(Y!KR'C0\'[XIS!(%P&'QX74X= -M4,=*GAS%MDNE:?+;+?\O0S-YI<]*OH07Y/=L7)3L9+1X=](B":8/0]TM*_M_ -M%0XCR#%OU/9VQ7%+B:*]7N0$*_8E18B:LED(2-1">ZIB?(XCY"\'@IT-7SCT:2_"!`@`8M^B4<````T)3LQA@YH -M[(05I'-:L_AR6CWGJ@DY)*0"``````````"N````K@```!```&1D(Q```-ZM -MN@@`10``H*JW```_$4M^P`$"_L`!`A<1E!&4`(P``/3<"N4````$"^MMG?%@ -MY3*L%D'7$>LLOHFXH,6B3<'M/]A_UT%X.MP;F`ZT@=\62*]W'/Y5@1,(8+`W -MTIZ(C;8G'VC<"+'VM:$K/=:VI -MD#:KB^/G$BB@:+=TSV\S)T5-E#UOBKZ"E5_,%P``````````*P```"L````0 -M``!D9",0``#>K;H(`$4``!T``$``/Q&VN,`!`O[``0(7$901E``)6)O_```` -M``````"N````K@```!```&1D(Q```-ZMN@@`10``H*JX```_$4M]P`$"_L`! -M`A<1E!&4`(P``/3<"N4````%D#:KB^/G$BB@:+=TSV\S)XZ>X,YAOI/W1_BS -M7:N%MO?3J+1\I=>O-36N1GBDD+HMR]D8U)G(OJ] -MMX!><$3'U0``````````K@```*X````0``!D9",0``#>K;H(`$4``*"JN0`` -M/Q%+?,`!`O[``0(7$901E`",``#TW`KE````!HUKYV'DUKD9XI)"Z+@>3:9638^IH_2\8CVE-BL2&43,3ZAY3'1@3Z:+\)XSXDSO]L,@? -MCOL6@]+&+X^#H(D.X>B;)<%[E4:S:#.D70:!#<8Q\QZFH`K;H(`$4``!T``$``/Q&VN,`!`O[` -M`0(7$901E``)6)O_``````````"N````K@```!```&1D(Q```-ZMN@@`10`` -MH*JZ```_$4M[P`$"_L`!`A<1E!&4`(P``/3<"N4````'$-QC'S'J:@!R,;Z< -M<"K%#ST!-8\O2;F**R/9Z%HAZ`2#KQIW*9'HI9C067ZK-G^XAL^O0I7Z/'H( -M<.`7P@/P'/E0@``````````B@$``(H!```0``#>K;H0 -M``!D9",(`$4``7P``$``0!&T6<`!`A?``0+^$901E`%HRNX`````GHGR.(^0 -MO!X*=#5\X]&DOP@0(`&+?HE'```!7*UH:Y3%%O=%DMM=<6J4PR@=@:9:G2JU -MW)6]ZNQ$7OT.4^RH,8X_>:H`,Q.,&AVG\B(Y!KR'C0\'[XIS!(%P&'QX74X=4,=*GAS%MDNE:?+; -M+?\O0S-YI<]*OH07Y/=L7)3L9+1X=](B":8/0]TM*_M_%0XCR#%OU/9VQ7%+ -MB:*]7N0$*_8E18B:LED(2-1">ZIGVJ+F -M#M/G_FP&NANM[W@`)Y9\\Z?F4SX%'E.^2BCP\9+!/`25PK%+G'U@$&1+=@%( -M#9RV^U"B8-5,EXJ0-QZTLOJ/L^F\).BC@++XQGOL8JC_`L;'=``````````` -M*@```"H````0``#>K;H0``!D9",(!@`!"``&!``!$```9&0CP`$"%P`````` -M`,`!`OX``````````"H````J````$```9&0C$```WJVZ"`8``0@`!@0``A`` -M`-ZMNL`!`OX0``!D9"/``0(7```````````K````*P```!```&1D(Q```-ZM -MN@@`10``'0``0``_$;:XP`$"_L`!`A<1E!&4``E8F_\``````````'H```!Z -M````$```WJVZ$```9&0C"`!%``!L``!``$`1M6G``0(7P`$"_A&4$90`6,G# -M`````)Z)\CB/D+P>"G0U?./1I+\($`4!`KW&3P```$S_T\^1(\?(IVCQDA]J -C20SF@.^<&]2'1D(_3FHHKW7PKQJ'!!.01QV>?]$9K_EN`N<` -` -end diff --git a/contrib/tcpdump/tests/isis-infinite-loop.pcap b/contrib/tcpdump/tests/isis-infinite-loop.pcap deleted file mode 100644 index b482fc850d0..00000000000 Binary files a/contrib/tcpdump/tests/isis-infinite-loop.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/ldp-infinite-loop.pcap b/contrib/tcpdump/tests/ldp-infinite-loop.pcap deleted file mode 100644 index ea31f0c06f3..00000000000 Binary files a/contrib/tcpdump/tests/ldp-infinite-loop.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/lmp.out b/contrib/tcpdump/tests/lmp.out deleted file mode 100644 index 2739d9fad25..00000000000 --- a/contrib/tcpdump/tests/lmp.out +++ /dev/null @@ -1,36 +0,0 @@ -IP (tos 0x0, ttl 1, id 44530, offset 0, flags [none], proto UDP (17), length 84) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 56 -IP (tos 0x0, ttl 1, id 44531, offset 0, flags [none], proto UDP (17), length 56) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 28 -IP (tos 0x0, ttl 1, id 44532, offset 0, flags [none], proto UDP (17), length 84) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 56 -IP (tos 0x0, ttl 1, id 44533, offset 0, flags [none], proto UDP (17), length 76) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 48 -IP (tos 0x0, ttl 1, id 44534, offset 0, flags [none], proto UDP (17), length 68) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 40 -IP (tos 0x0, ttl 1, id 44535, offset 0, flags [none], proto UDP (17), length 44) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 16 -IP (tos 0x0, ttl 1, id 44536, offset 0, flags [none], proto UDP (17), length 124) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 96 -IP (tos 0x0, ttl 1, id 44537, offset 0, flags [none], proto UDP (17), length 68) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 40 -IP (tos 0x0, ttl 1, id 44538, offset 0, flags [none], proto UDP (17), length 60) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 32 -IP (tos 0x0, ttl 1, id 44539, offset 0, flags [none], proto UDP (17), length 52) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 24 -IP (tos 0x0, ttl 1, id 44540, offset 0, flags [none], proto UDP (17), length 52) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 24 -IP (tos 0x0, ttl 1, id 44541, offset 0, flags [none], proto UDP (17), length 52) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 24 -IP (tos 0x0, ttl 1, id 44542, offset 0, flags [none], proto UDP (17), length 52) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 24 -IP (tos 0x0, ttl 1, id 44543, offset 0, flags [none], proto UDP (17), length 52) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 24 -IP (tos 0x0, ttl 1, id 44544, offset 0, flags [none], proto UDP (17), length 44) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 16 -IP (tos 0x0, ttl 1, id 44545, offset 0, flags [none], proto UDP (17), length 64) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 36 -IP (tos 0x0, ttl 1, id 44546, offset 0, flags [none], proto UDP (17), length 72) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 44 -IP (tos 0x0, ttl 1, id 44547, offset 0, flags [none], proto UDP (17), length 64) - 10.0.12.1.49998 > 10.0.12.2.49998: [no cksum] UDP, length 36 diff --git a/contrib/tcpdump/tests/lmp.puu b/contrib/tcpdump/tests/lmp.puu deleted file mode 100644 index c14cd560c96..00000000000 --- a/contrib/tcpdump/tests/lmp.puu +++ /dev/null @@ -1,42 +0,0 @@ -begin 644 lmp.pcap -MU,.RH0(`!````````````/__```!````I!J-0&;J``!B````8@`````%75SJ -MQ@`$=="&2@@`10``5*WR```!$=^D"@`,`0H`#`+#3L-.`$```!````4`.``` -M`0,`"`$````!!0`(`````P(#``@!````@0@`&````!0````>")*``$+(```` -M```(I!J-0#SQ``!&````1@`````%75SJQ@`$=="&2@@`10``.*WS```!$=^_ -M"@`,`0H`#`+#3L-.`"0``!````0`'````0$`"`````$!!P`,````,@```#RD -M&HU`@/(``&(```!B``````5=7.K&``1UT(9*"`!%``!4K?0```$1WZ(*``P! -M"@`,`L-.PTX`0```$````P`X```!`0`(`````0$"``@*`#(!`@$`"`````(" -M!0`(`````P("``@*`#("@08`"``%``^D&HU`?_,``%H```!:``````5=7.K& -M``1UT(9*"`!%``!,K?4```$1WZD*``P!"@`,`L-.PTX`.```$````@`P```! -M`0`(`````0$"``@*`#(!`@$`"`````("!0`(`````P("``@*`#("I!J-0'+T -M``!2````4@`````%75SJQ@`$=="&2@@`10``1*WV```!$=^P"@`,`0H`#`+# -M3L-.`#```!````$`*````0$`"`````$!!0`(`````P$"``@*`#(!@08`"``% -M``^D&HU`0_4``#H````Z``````5=7.K&``1UT(9*"`!%```LK?<```$1W\<* -M``P!"@`,`L-.PTX`&```$```#P`0```"!0`(`````:0:C4"E]P``B@```(H` -M````!5Ulmp.new -if diff lmp.new lmp.out -then - echo passed. -else - echo failed. -fi - - diff --git a/contrib/tcpdump/tests/lspping-fec-ldp.pcap b/contrib/tcpdump/tests/lspping-fec-ldp.pcap deleted file mode 100644 index 87e86c79e6d..00000000000 Binary files a/contrib/tcpdump/tests/lspping-fec-ldp.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/lspping-fec-rsvp.pcap b/contrib/tcpdump/tests/lspping-fec-rsvp.pcap deleted file mode 100644 index d9dcf544d8e..00000000000 Binary files a/contrib/tcpdump/tests/lspping-fec-rsvp.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/mpls-ldp-hello.out b/contrib/tcpdump/tests/mpls-ldp-hello.out deleted file mode 100644 index a8b237327c1..00000000000 --- a/contrib/tcpdump/tests/mpls-ldp-hello.out +++ /dev/null @@ -1,10 +0,0 @@ -IP (tos 0xc0, ttl 1, id 15579, offset 0, flags [none], proto UDP (17), length 70) - 10.1.1.3.646 > 224.0.0.2.646: - LDP, Label-Space-ID: 10.1.0.2:0, pdu-length: 38 - Hello Message (0x0100), length: 28, Message ID: 0x00011970, Flags: [ignore if unknown] - Common Hello Parameters TLV (0x0400), length: 4, Flags: [ignore and don't forward if unknown] - Hold Time: 15s, Flags: [Link Hello] - IPv4 Transport Address TLV (0x0401), length: 4, Flags: [ignore and don't forward if unknown] - IPv4 Transport Address: 10.1.0.2 - Configuration Sequence Number TLV (0x0402), length: 4, Flags: [ignore and don't forward if unknown] - Sequence Number: 1 diff --git a/contrib/tcpdump/tests/mpls-ldp-hello.puu b/contrib/tcpdump/tests/mpls-ldp-hello.puu deleted file mode 100644 index b7f3b625b34..00000000000 --- a/contrib/tcpdump/tests/mpls-ldp-hello.puu +++ /dev/null @@ -1,6 +0,0 @@ -begin 644 mpls-ldp-hello.pcap -MU,.RH0(`!````````````.H%```)````1UFZ/E2'#`!*````2@```/\#`"%% -MP`!&/-L```$1D08*`0$#X````@*&`H8`,M2>``$`)@H!``(```$``!P``1EP -8!```!``/```$`0`$"@$``@0"``0````! -` -end diff --git a/contrib/tcpdump/tests/mpls-traceroute.pcap b/contrib/tcpdump/tests/mpls-traceroute.pcap deleted file mode 100644 index ac0b6b3a1ed..00000000000 Binary files a/contrib/tcpdump/tests/mpls-traceroute.pcap and /dev/null differ diff --git a/contrib/tcpdump/tests/ospf-gmpls.out b/contrib/tcpdump/tests/ospf-gmpls.out deleted file mode 100644 index e4dd9ab69c3..00000000000 --- a/contrib/tcpdump/tests/ospf-gmpls.out +++ /dev/null @@ -1,86 +0,0 @@ -IP (tos 0xc0, ttl 1, id 4052, offset 0, flags [none], proto OSPF (89), length 172) - 40.35.1.2 > 224.0.0.5: OSPFv2, LS-Update, length 152 - Router-ID 10.255.245.35, Backbone Area, Authentication Type: none (0), 1 LSA - LSA #1 - Advertising Router 10.255.245.37, seq 0x80000002, age 9s, length 104 - Area Local Opaque LSA (10), Opaque-Type Traffic Engineering LSA (1), Opaque-ID 8 - Options: [External] - Link TLV (2), length: 100 - Link Type subTLV (1), length: 1, Point-to-point (1) - Link ID subTLV (2), length: 4, 10.255.245.69 (0x0afff545) - Local Interface IP address subTLV (3), length: 4, 10.9.142.1 - Remote Interface IP address subTLV (4), length: 4, 10.9.142.2 - Traffic Engineering Metric subTLV (5), length: 4, Metric 63 - Maximum Bandwidth subTLV (6), length: 4, 622.080 Mbps - Maximum Reservable Bandwidth subTLV (7), length: 4, 622.080 Mbps - Unreserved Bandwidth subTLV (8), length: 32 - TE-Class 0: 622.080 Mbps - TE-Class 1: 622.080 Mbps - TE-Class 2: 622.080 Mbps - TE-Class 3: 622.080 Mbps - TE-Class 4: 622.080 Mbps - TE-Class 5: 622.080 Mbps - TE-Class 6: 622.080 Mbps - TE-Class 7: 622.080 Mbps - Administrative Group subTLV (9), length: 4, 0x00000000 -IP (tos 0xc0, ttl 1, id 4106, offset 0, flags [none], proto OSPF (89), length 172) - 40.35.1.2 > 224.0.0.5: OSPFv2, LS-Update, length 152 - Router-ID 10.255.245.35, Backbone Area, Authentication Type: none (0), 1 LSA - LSA #1 - Advertising Router 10.255.245.37, seq 0x80000002, age 9s, length 104 - Area Local Opaque LSA (10), Opaque-Type Traffic Engineering LSA (1), Opaque-ID 9 - Options: [External] - Link TLV (2), length: 100 - Link Type subTLV (1), length: 1, Point-to-point (1) - Link ID subTLV (2), length: 4, 10.255.245.69 (0x0afff545) - Local Interface IP address subTLV (3), length: 4, 10.9.143.1 - Remote Interface IP address subTLV (4), length: 4, 10.9.143.2 - Traffic Engineering Metric subTLV (5), length: 4, Metric 63 - Maximum Bandwidth subTLV (6), length: 4, 622.080 Mbps - Maximum Reservable Bandwidth subTLV (7), length: 4, 622.080 Mbps - Unreserved Bandwidth subTLV (8), length: 32 - TE-Class 0: 622.080 Mbps - TE-Class 1: 622.080 Mbps - TE-Class 2: 622.080 Mbps - TE-Class 3: 622.080 Mbps - TE-Class 4: 622.080 Mbps - TE-Class 5: 622.080 Mbps - TE-Class 6: 622.080 Mbps - TE-Class 7: 622.080 Mbps - Administrative Group subTLV (9), length: 4, 0x00000000 -IP (tos 0xc0, ttl 1, id 4160, offset 0, flags [none], proto OSPF (89), length 212) - 40.35.1.2 > 224.0.0.5: OSPFv2, LS-Update, length 192 - Router-ID 10.255.245.35, Backbone Area, Authentication Type: none (0), 1 LSA - LSA #1 - Advertising Router 10.255.245.35, seq 0x80000003, age 3s, length 144 - Area Local Opaque LSA (10), Opaque-Type Traffic Engineering LSA (1), Opaque-ID 3 - Options: [External] - Link TLV (2), length: 140 - Link Type subTLV (1), length: 1, Point-to-point (1) - Link ID subTLV (2), length: 4, 10.255.245.40 (0x0afff528) - Local Interface IP address subTLV (3), length: 4, 10.40.35.14 - Remote Interface IP address subTLV (4), length: 4, 10.40.35.13 - Traffic Engineering Metric subTLV (5), length: 4, Metric 1 - Maximum Bandwidth subTLV (6), length: 4, 100.000 Mbps - Maximum Reservable Bandwidth subTLV (7), length: 4, 100.000 Mbps - Unreserved Bandwidth subTLV (8), length: 32 - TE-Class 0: 0.000 Mbps - TE-Class 1: 0.000 Mbps - TE-Class 2: 0.000 Mbps - TE-Class 3: 0.000 Mbps - TE-Class 4: 0.000 Mbps - TE-Class 5: 0.000 Mbps - TE-Class 6: 0.000 Mbps - TE-Class 7: 0.000 Mbps - Interface Switching Capability subTLV (15), length: 44 - Interface Switching Capability: Packet-Switch Capable-1 - LSP Encoding: Ethernet V2/DIX - Max LSP Bandwidth: - priority level 0: 0.000 Mbps - priority level 1: 0.000 Mbps - priority level 2: 0.000 Mbps - priority level 3: 0.000 Mbps - priority level 4: 0.000 Mbps - priority level 5: 0.000 Mbps - priority level 6: 0.000 Mbps - priority level 7: 0.000 Mbps diff --git a/contrib/tcpdump/tests/ospf-gmpls.puu b/contrib/tcpdump/tests/ospf-gmpls.puu deleted file mode 100644 index 691e38e9f54..00000000000 --- a/contrib/tcpdump/tests/ospf-gmpls.puu +++ /dev/null @@ -1,18 +0,0 @@ -begin 644 ospf-gmpls.pcap -MU,.RH0(`!````````````'81````````KME#X`?``"`&0``0`!`0`````"``0*__5%``,` -M!`H)C@$`!``$"@F.`@`%``0````_``8`!$R44,``!P`$3)10P``(`"!,E%#` -M3)10P$R44,!,E%#`3)10P$R44,!,E%#`3)10P``)``0`````Y-E 127.0.0.1.80: Flags [S], seq 928549246, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 0,nop,wscale 2], length 0 -E..<.h@.@.!R.........p.P7X.~.........!....@.... -M........... -22:57:35.938122 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [S.], seq 930778609, ack 928549247, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 1306300950,nop,wscale 2], length 0 -E..<..@.@.<..........P.p7z..7X......n.....@.... -M...M....... -22:57:35.938167 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 1, win 8192, options [nop,nop,TS val 1306300950 ecr 1306300950], length 0 -E..4.j@.@.!X.........p.P7X..7z.... .7...... -M...M... -22:57:35.939423 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [P.], seq 1:203, ack 1, win 8192, options [nop,nop,TS val 1306300951 ecr 1306300950], length 202 -E....l@.@. ..........p.P7X..7z.... ........ -M...M...GET / HTTP/1.1 -Host: localhost -User-Agent: ELinks/0.10.4-7-debian (textmode; Linux 2.6.11-1-686-smp i686; 132x56-2) -Accept: */* -Accept-Encoding: gzip -Accept-Language: en -Connection: Keep-Alive - - -22:57:35.940474 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [.], ack 203, win 8192, options [nop,nop,TS val 1306300952 ecr 1306300951], length 0 -E..4..@.@............P.p7z..7X.I.. .7...... -M...M... -22:57:35.941232 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [P.], seq 1:5560, ack 203, win 8192, options [nop,nop,TS val 1306300953 ecr 1306300951], length 5559 -E.....@.@..%.........P.p7z..7X.I.. ........ -M...M...HTTP/1.1 200 OK -Date: Wed, 06 Jul 2005 03:57:35 GMT -Server: Apache/1.3.33 -Last-Modified: Sun, 15 Aug 2004 00:43:41 GMT -ETag: "6e80f0-148a-411eb1bd" -Accept-Ranges: bytes -Content-Length: 5258 -Keep-Alive: timeout=15, max=100 -Connection: Keep-Alive -Content-Type: text/html; charset=iso-8859-1 - - - - - - - Placeholder page - - - -

Placeholder page

-

If you are just browsing the web

- -

The owner of this web site has not put up any web pages yet. -Please come back later.

- -

Move along, nothing to see here... :-)

- -

If you are trying to locate the administrator of this machine

- -

If you want to report something about this host's behavior, please -contact the Internet Service Provider (ISP) involved directly.

- -

See the Network Abuse -Clearinghouse for how to do this.

- -

If you are the administrator of this machine

- -

The initial installation of Debian's -apache web server package was successful.

- -

You should replace this page with your own web pages as -soon as possible.

- -

Unless you changed its configuration, your new server is configured as follows: -

    -
  • -Configuration files can be found in /etc/apache.
  • - -
  • -The DocumentRoot, which is the directory under which all your -HTML files should exist, is set to /var/www.
  • - -
  • -CGI scripts are looked for in /usr/lib/cgi-bin, which is where -Debian packages will place their scripts.
  • - -
  • -Log files are placed in /var/log/apache, and will be rotated -weekly. The frequency of rotation can be easily changed by editing -/etc/logrotate.d/apache.
  • - -
  • -The default directory index is index.html, meaning that requests -for a directory /foo/bar/ will give the contents of the file /var/www/foo/bar/index.html -if it exists (assuming that /var/www is your DocumentRoot).
  • - -
  • -User directories are enabled, and user documents will be looked for -in the public_html directory of the users' homes. These dirs -should be under /home, and users will not be able to symlink -to files they don't own.
  • - -
-All the standard apache modules are available with this release and are -now managed with debconf. Type dpkg-reconfigure apache to -select which modules you want enabled. Many other modules are available -through the Debian package system with the names libapache-mod-*. -If you need to compile a module yourself, you will need to install the -apache-dev package. - -

More documentation on Apache can be found on: -

- -

You can also consult the list of World -Wide Web Frequently Asked Questions for information. - -

Let other people know about this server

- -Netcraft provides an interesting free -service for web site monitoring and statistic collection. -You can let them know about your server using their -interface. -Enabling the monitoring of your server will provide a better global overview -of who is using what and where, and it would give Debian a better -overview of the apache package usage. - -

About this page

- - - -

This is a placeholder page installed by the Debian -release of the apache Web server package. - -

This computer has installed the Debian GNU/Linux operating system, -but it has nothing to do with the Debian -Project. Please do not contact the Debian -Project about it.

- -

If you find a bug in this apache package, or in Apache itself, -please file a bug report on it. Instructions on doing this, and the -list of known bugs of this -package, can be found in the -Debian Bug Tracking System. - -

Thanks for using this package, and congratulations for your choice of -a Debian system!

- -
- -Debian - - -Apache - -
- - - - - - -22:57:35.941260 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5560, win 12383, options [nop,nop,TS val 1306300953 ecr 1306300953], length 0 -E..4.n@.@.!T.........p.P7X.I7z....0_....... -M...M... -22:57:37.229575 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [F.], seq 203, ack 5560, win 12383, options [nop,nop,TS val 1306302241 ecr 1306300953], length 0 -E..4.p@.@.!R.........p.P7X.I7z....0_....... -M..!M... -22:57:37.230839 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [F.], seq 5560, ack 204, win 8192, options [nop,nop,TS val 1306302243 ecr 1306302241], length 0 -E..4..@.@............P.p7z..7X.J.. ..5..... -M..#M..! -22:57:37.230900 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5561, win 12383, options [nop,nop,TS val 1306302243 ecr 1306302243], length 0 -E..4.r@.@.!P.........p.P7X.J7z....0_....... -M..#M..# diff --git a/contrib/tcpdump/tests/print-AA.out b/contrib/tcpdump/tests/print-AA.out deleted file mode 100644 index 6a22df2be86..00000000000 --- a/contrib/tcpdump/tests/print-AA.out +++ /dev/null @@ -1,193 +0,0 @@ -22:57:35.938066 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [S], seq 928549246, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 0,nop,wscale 2], length 0 -..............E..<.h@.@.!R.........p.P7X.~.........!....@.... -M........... -22:57:35.938122 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [S.], seq 930778609, ack 928549247, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 1306300950,nop,wscale 2], length 0 -..............E..<..@.@.<..........P.p7z..7X......n.....@.... -M...M....... -22:57:35.938167 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 1, win 8192, options [nop,nop,TS val 1306300950 ecr 1306300950], length 0 -..............E..4.j@.@.!X.........p.P7X..7z.... .7...... -M...M... -22:57:35.939423 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [P.], seq 1:203, ack 1, win 8192, options [nop,nop,TS val 1306300951 ecr 1306300950], length 202 -..............E....l@.@. ..........p.P7X..7z.... ........ -M...M...GET / HTTP/1.1 -Host: localhost -User-Agent: ELinks/0.10.4-7-debian (textmode; Linux 2.6.11-1-686-smp i686; 132x56-2) -Accept: */* -Accept-Encoding: gzip -Accept-Language: en -Connection: Keep-Alive - - -22:57:35.940474 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [.], ack 203, win 8192, options [nop,nop,TS val 1306300952 ecr 1306300951], length 0 -..............E..4..@.@............P.p7z..7X.I.. .7...... -M...M... -22:57:35.941232 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [P.], seq 1:5560, ack 203, win 8192, options [nop,nop,TS val 1306300953 ecr 1306300951], length 5559 -..............E.....@.@..%.........P.p7z..7X.I.. ........ -M...M...HTTP/1.1 200 OK -Date: Wed, 06 Jul 2005 03:57:35 GMT -Server: Apache/1.3.33 -Last-Modified: Sun, 15 Aug 2004 00:43:41 GMT -ETag: "6e80f0-148a-411eb1bd" -Accept-Ranges: bytes -Content-Length: 5258 -Keep-Alive: timeout=15, max=100 -Connection: Keep-Alive -Content-Type: text/html; charset=iso-8859-1 - - - - - - - Placeholder page - - - -

Placeholder page

-

If you are just browsing the web

- -

The owner of this web site has not put up any web pages yet. -Please come back later.

- -

Move along, nothing to see here... :-)

- -

If you are trying to locate the administrator of this machine

- -

If you want to report something about this host's behavior, please -contact the Internet Service Provider (ISP) involved directly.

- -

See the Network Abuse -Clearinghouse for how to do this.

- -

If you are the administrator of this machine

- -

The initial installation of Debian's -apache web server package was successful.

- -

You should replace this page with your own web pages as -soon as possible.

- -

Unless you changed its configuration, your new server is configured as follows: -

    -
  • -Configuration files can be found in /etc/apache.
  • - -
  • -The DocumentRoot, which is the directory under which all your -HTML files should exist, is set to /var/www.
  • - -
  • -CGI scripts are looked for in /usr/lib/cgi-bin, which is where -Debian packages will place their scripts.
  • - -
  • -Log files are placed in /var/log/apache, and will be rotated -weekly. The frequency of rotation can be easily changed by editing -/etc/logrotate.d/apache.
  • - -
  • -The default directory index is index.html, meaning that requests -for a directory /foo/bar/ will give the contents of the file /var/www/foo/bar/index.html -if it exists (assuming that /var/www is your DocumentRoot).
  • - -
  • -User directories are enabled, and user documents will be looked for -in the public_html directory of the users' homes. These dirs -should be under /home, and users will not be able to symlink -to files they don't own.
  • - -
-All the standard apache modules are available with this release and are -now managed with debconf. Type dpkg-reconfigure apache to -select which modules you want enabled. Many other modules are available -through the Debian package system with the names libapache-mod-*. -If you need to compile a module yourself, you will need to install the -apache-dev package. - -

More documentation on Apache can be found on: -

- -

You can also consult the list of World -Wide Web Frequently Asked Questions for information. - -

Let other people know about this server

- -Netcraft provides an interesting free -service for web site monitoring and statistic collection. -You can let them know about your server using their -interface. -Enabling the monitoring of your server will provide a better global overview -of who is using what and where, and it would give Debian a better -overview of the apache package usage. - -

About this page

- - - -

This is a placeholder page installed by the Debian -release of the apache Web server package. - -

This computer has installed the Debian GNU/Linux operating system, -but it has nothing to do with the Debian -Project. Please do not contact the Debian -Project about it.

- -

If you find a bug in this apache package, or in Apache itself, -please file a bug report on it. Instructions on doing this, and the -list of known bugs of this -package, can be found in the -Debian Bug Tracking System. - -

Thanks for using this package, and congratulations for your choice of -a Debian system!

- -
- -Debian - - -Apache - -
- - - - - - -22:57:35.941260 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5560, win 12383, options [nop,nop,TS val 1306300953 ecr 1306300953], length 0 -..............E..4.n@.@.!T.........p.P7X.I7z....0_....... -M...M... -22:57:37.229575 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [F.], seq 203, ack 5560, win 12383, options [nop,nop,TS val 1306302241 ecr 1306300953], length 0 -..............E..4.p@.@.!R.........p.P7X.I7z....0_....... -M..!M... -22:57:37.230839 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [F.], seq 5560, ack 204, win 8192, options [nop,nop,TS val 1306302243 ecr 1306302241], length 0 -..............E..4..@.@............P.p7z..7X.J.. ..5..... -M..#M..! -22:57:37.230900 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5561, win 12383, options [nop,nop,TS val 1306302243 ecr 1306302243], length 0 -..............E..4.r@.@.!P.........p.P7X.J7z....0_....... -M..#M..# diff --git a/contrib/tcpdump/tests/print-capX.out b/contrib/tcpdump/tests/print-capX.out deleted file mode 100644 index f95a9e96033..00000000000 --- a/contrib/tcpdump/tests/print-capX.out +++ /dev/null @@ -1,409 +0,0 @@ -22:57:35.938066 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [S], seq 928549246, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 0,nop,wscale 2], length 0 - 0x0000: 4500 003c 1b68 4000 4006 2152 7f00 0001 E..<.h@.@.!R.... - 0x0010: 7f00 0001 da70 0050 3758 897e 0000 0000 .....p.P7X.~.... - 0x0020: a002 7fff 1421 0000 0204 400c 0402 080a .....!....@..... - 0x0030: 4ddc 9216 0000 0000 0103 0302 M........... -22:57:35.938122 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [S.], seq 930778609, ack 928549247, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 1306300950,nop,wscale 2], length 0 - 0x0000: 4500 003c 0000 4000 4006 3cba 7f00 0001 E..<..@.@.<..... - 0x0010: 7f00 0001 0050 da70 377a 8df1 3758 897f .....P.p7z..7X.. - 0x0020: a012 7fff 6eb1 0000 0204 400c 0402 080a ....n.....@..... - 0x0030: 4ddc 9216 4ddc 9216 0103 0302 M...M....... -22:57:35.938167 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 1, win 8192, options [nop,nop,TS val 1306300950 ecr 1306300950], length 0 - 0x0000: 4500 0034 1b6a 4000 4006 2158 7f00 0001 E..4.j@.@.!X.... - 0x0010: 7f00 0001 da70 0050 3758 897f 377a 8df2 .....p.P7X..7z.. - 0x0020: 8010 2000 37d0 0000 0101 080a 4ddc 9216 ....7.......M... - 0x0030: 4ddc 9216 M... -22:57:35.939423 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [P.], seq 1:203, ack 1, win 8192, options [nop,nop,TS val 1306300951 ecr 1306300950], length 202 - 0x0000: 4500 00fe 1b6c 4000 4006 208c 7f00 0001 E....l@.@....... - 0x0010: 7f00 0001 da70 0050 3758 897f 377a 8df2 .....p.P7X..7z.. - 0x0020: 8018 2000 fef2 0000 0101 080a 4ddc 9217 ............M... - 0x0030: 4ddc 9216 4745 5420 2f20 4854 5450 2f31 M...GET./.HTTP/1 - 0x0040: 2e31 0d0a 486f 7374 3a20 6c6f 6361 6c68 .1..Host:.localh - 0x0050: 6f73 740d 0a55 7365 722d 4167 656e 743a ost..User-Agent: - 0x0060: 2045 4c69 6e6b 732f 302e 3130 2e34 2d37 .ELinks/0.10.4-7 - 0x0070: 2d64 6562 6961 6e20 2874 6578 746d 6f64 -debian.(textmod - 0x0080: 653b 204c 696e 7578 2032 2e36 2e31 312d e;.Linux.2.6.11- - 0x0090: 312d 3638 362d 736d 7020 6936 3836 3b20 1-686-smp.i686;. - 0x00a0: 3133 3278 3536 2d32 290d 0a41 6363 6570 132x56-2)..Accep - 0x00b0: 743a 202a 2f2a 0d0a 4163 6365 7074 2d45 t:.*/*..Accept-E - 0x00c0: 6e63 6f64 696e 673a 2067 7a69 700d 0a41 ncoding:.gzip..A - 0x00d0: 6363 6570 742d 4c61 6e67 7561 6765 3a20 ccept-Language:. - 0x00e0: 656e 0d0a 436f 6e6e 6563 7469 6f6e 3a20 en..Connection:. - 0x00f0: 4b65 6570 2d41 6c69 7665 0d0a 0d0a Keep-Alive.... -22:57:35.940474 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [.], ack 203, win 8192, options [nop,nop,TS val 1306300952 ecr 1306300951], length 0 - 0x0000: 4500 0034 1fe4 4000 4006 1cde 7f00 0001 E..4..@.@....... - 0x0010: 7f00 0001 0050 da70 377a 8df2 3758 8a49 .....P.p7z..7X.I - 0x0020: 8010 2000 3703 0000 0101 080a 4ddc 9218 ....7.......M... - 0x0030: 4ddc 9217 M... -22:57:35.941232 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [P.], seq 1:5560, ack 203, win 8192, options [nop,nop,TS val 1306300953 ecr 1306300951], length 5559 - 0x0000: 4500 15eb 1fe6 4000 4006 0725 7f00 0001 E.....@.@..%.... - 0x0010: 7f00 0001 0050 da70 377a 8df2 3758 8a49 .....P.p7z..7X.I - 0x0020: 8018 2000 13e0 0000 0101 080a 4ddc 9219 ............M... - 0x0030: 4ddc 9217 4854 5450 2f31 2e31 2032 3030 M...HTTP/1.1.200 - 0x0040: 204f 4b0d 0a44 6174 653a 2057 6564 2c20 .OK..Date:.Wed,. - 0x0050: 3036 204a 756c 2032 3030 3520 3033 3a35 06.Jul.2005.03:5 - 0x0060: 373a 3335 2047 4d54 0d0a 5365 7276 6572 7:35.GMT..Server - 0x0070: 3a20 4170 6163 6865 2f31 2e33 2e33 330d :.Apache/1.3.33. - 0x0080: 0a4c 6173 742d 4d6f 6469 6669 6564 3a20 .Last-Modified:. - 0x0090: 5375 6e2c 2031 3520 4175 6720 3230 3034 Sun,.15.Aug.2004 - 0x00a0: 2030 303a 3433 3a34 3120 474d 540d 0a45 .00:43:41.GMT..E - 0x00b0: 5461 673a 2022 3665 3830 6630 2d31 3438 Tag:."6e80f0-148 - 0x00c0: 612d 3431 3165 6231 6264 220d 0a41 6363 a-411eb1bd"..Acc - 0x00d0: 6570 742d 5261 6e67 6573 3a20 6279 7465 ept-Ranges:.byte - 0x00e0: 730d 0a43 6f6e 7465 6e74 2d4c 656e 6774 s..Content-Lengt - 0x00f0: 683a 2035 3235 380d 0a4b 6565 702d 416c h:.5258..Keep-Al - 0x0100: 6976 653a 2074 696d 656f 7574 3d31 352c ive:.timeout=15, - 0x0110: 206d 6178 3d31 3030 0d0a 436f 6e6e 6563 .max=100..Connec - 0x0120: 7469 6f6e 3a20 4b65 6570 2d41 6c69 7665 tion:.Keep-Alive - 0x0130: 0d0a 436f 6e74 656e 742d 5479 7065 3a20 ..Content-Type:. - 0x0140: 7465 7874 2f68 746d 6c3b 2063 6861 7273 text/html;.chars - 0x0150: 6574 3d69 736f 2d38 3835 392d 310d 0a0d et=iso-8859-1... - 0x0160: 0a3c 2144 4f43 5459 5045 2048 544d 4c20 . - 0x01a0: 0a3c 4854 4d4c 3e0a 3c48 4541 443e 0a20 .... - 0x01b0: 2020 3c4d 4554 4120 4854 5450 2d45 5155 .......... - 0x0250: 3c54 4954 4c45 3e50 6c61 6365 686f 6c64 Placehold - 0x0260: 6572 2070 6167 653c 2f54 4954 4c45 3e0a er.page. - 0x0270: 3c2f 4845 4144 3e0a 3c42 4f44 5920 5445 ... - 0x02d0: 3c48 313e 506c 6163 6568 6f6c 6465 7220

Placeholder. - 0x02e0: 7061 6765 3c2f 4831 3e0a 3c48 323e 4966 page

.

If - 0x02f0: 2079 6f75 2061 7265 206a 7573 7420 6272 .you.are.just.br - 0x0300: 6f77 7369 6e67 2074 6865 2077 6562 3c2f owsing.the.web..

The.owne - 0x0320: 7220 6f66 2074 6869 7320 7765 6220 7369 r.of.this.web.si - 0x0330: 7465 2068 6173 206e 6f74 2070 7574 2075 te.has.not.put.u - 0x0340: 7020 616e 7920 7765 6220 7061 6765 7320 p.any.web.pages. - 0x0350: 7965 742e 0a50 6c65 6173 6520 636f 6d65 yet..Please.come - 0x0360: 2062 6163 6b20 6c61 7465 722e 3c2f 503e .back.later.

- 0x0370: 0a0a 3c50 3e3c 534d 414c 4c3e 3c43 4954 ..

Move.along,.no - 0x0390: 7468 696e 6720 746f 2073 6565 2068 6572 thing.to.see.her - 0x03a0: 652e 2e2e 3c2f 4349 5445 3e20 3a2d 293c e....:-)< - 0x03b0: 2f53 4d41 4c4c 3e3c 2f50 3e0a 0a3c 4832 /SMALL>

..

If.you.are.tryi - 0x03d0: 6e67 2074 6f20 6c6f 6361 7465 2074 6865 ng.to.locate.the - 0x03e0: 2061 646d 696e 6973 7472 6174 6f72 206f .administrator.o - 0x03f0: 6620 7468 6973 206d 6163 6869 6e65 3c2f f.this.machine..

If.you.w - 0x0410: 616e 7420 746f 2072 6570 6f72 7420 736f ant.to.report.so - 0x0420: 6d65 7468 696e 6720 6162 6f75 7420 7468 mething.about.th - 0x0430: 6973 2068 6f73 7427 7320 6265 6861 7669 is.host's.behavi - 0x0440: 6f72 2c20 706c 6561 7365 0a63 6f6e 7461 or,.please.conta - 0x0450: 6374 2074 6865 2049 6e74 6572 6e65 7420 ct.the.Internet. - 0x0460: 5365 7276 6963 6520 5072 6f76 6964 6572 Service.Provider - 0x0470: 2028 4953 5029 2069 6e76 6f6c 7665 6420 .(ISP).involved. - 0x0480: 6469 7265 6374 6c79 2e3c 2f50 3e0a 0a3c directly.

..< - 0x0490: 503e 5365 6520 7468 6520 3c41 2068 7265 P>See.the.Networ - 0x04c0: 6b20 4162 7573 650a 436c 6561 7269 6e67 k.Abuse.Clearing - 0x04d0: 686f 7573 653c 2f41 3e20 666f 7220 686f house.for.ho - 0x04e0: 7720 746f 2064 6f20 7468 6973 2e3c 2f50 w.to.do.this.

..

If.you.ar - 0x0500: 6520 7468 6520 6164 6d69 6e69 7374 7261 e.the.administra - 0x0510: 746f 7220 6f66 2074 6869 7320 6d61 6368 tor.of.this.mach - 0x0520: 696e 653c 2f48 323e 0a0a 3c50 3e54 6865 ine

..

The - 0x0530: 2069 6e69 7469 616c 2069 6e73 7461 6c6c .initial.install - 0x0540: 6174 696f 6e20 6f66 203c 4120 6872 6566 ation.of.Debian - 0x0570: 2773 0a61 7061 6368 653c 2f41 3e20 7765 's.apache.we - 0x0580: 6220 7365 7276 6572 2070 6163 6b61 6765 b.server.package - 0x0590: 2077 6173 2073 7563 6365 7373 6675 6c2e .was.successful. - 0x05a0: 3c2f 503e 0a0a 3c50 3e3c 5354 524f 4e47

..

You.should.repl - 0x05c0: 6163 6520 7468 6973 2070 6167 6520 7769 ace.this.page.wi - 0x05d0: 7468 2079 6f75 7220 6f77 6e20 7765 6220 th.your.own.web. - 0x05e0: 7061 6765 7320 6173 0a73 6f6f 6e20 6173 pages.as.soon.as - 0x05f0: 2070 6f73 7369 626c 652e 3c2f 5354 524f .possible.

..

Unle - 0x0610: 7373 2079 6f75 2063 6861 6e67 6564 2069 ss.you.changed.i - 0x0620: 7473 2063 6f6e 6669 6775 7261 7469 6f6e ts.configuration - 0x0630: 2c20 796f 7572 206e 6577 2073 6572 7665 ,.your.new.serve - 0x0640: 7220 6973 2063 6f6e 6669 6775 7265 6420 r.is.configured. - 0x0650: 6173 2066 6f6c 6c6f 7773 3a0a 3c55 4c3e as.follows:.

    - 0x0660: 0a3c 4c49 3e0a 436f 6e66 6967 7572 6174 .
  • .Configurat - 0x0670: 696f 6e20 6669 6c65 7320 6361 6e20 6265 ion.files.can.be - 0x0680: 2066 6f75 6e64 2069 6e20 3c54 543e 2f65 .found.in./e - 0x0690: 7463 2f61 7061 6368 653c 2f54 543e 2e3c tc/apache.< - 0x06a0: 2f4c 493e 0a0a 3c4c 493e 0a54 6865 203c /LI>..
  • .The.< - 0x06b0: 5454 3e44 6f63 756d 656e 7452 6f6f 743c TT>DocumentRoot< - 0x06c0: 2f54 543e 2c20 7768 6963 6820 6973 2074 /TT>,.which.is.t - 0x06d0: 6865 2064 6972 6563 746f 7279 2075 6e64 he.directory.und - 0x06e0: 6572 2077 6869 6368 2061 6c6c 2079 6f75 er.which.all.you - 0x06f0: 720a 4854 4d4c 2066 696c 6573 2073 686f r.HTML.files.sho - 0x0700: 756c 6420 6578 6973 742c 2069 7320 7365 uld.exist,.is.se - 0x0710: 7420 746f 203c 5454 3e2f 7661 722f 7777 t.to./var/ww - 0x0720: 773c 2f54 543e 2e3c 2f4c 493e 0a0a 3c4c w.
  • ...CGI.scripts.a - 0x0740: 7265 206c 6f6f 6b65 6420 666f 7220 696e re.looked.for.in - 0x0750: 203c 5454 3e2f 7573 722f 6c69 622f 6367 ./usr/lib/cg - 0x0760: 692d 6269 6e3c 2f54 543e 2c20 7768 6963 i-bin,.whic - 0x0770: 6820 6973 2077 6865 7265 0a44 6562 6961 h.is.where.Debia - 0x0780: 6e20 7061 636b 6167 6573 2077 696c 6c20 n.packages.will. - 0x0790: 706c 6163 6520 7468 6569 7220 7363 7269 place.their.scri - 0x07a0: 7074 732e 3c2f 4c49 3e0a 0a3c 4c49 3e0a pts...
  • . - 0x07b0: 4c6f 6720 6669 6c65 7320 6172 6520 706c Log.files.are.pl - 0x07c0: 6163 6564 2069 6e20 3c54 543e 2f76 6172 aced.in./var - 0x07d0: 2f6c 6f67 2f61 7061 6368 653c 2f54 543e /log/apache - 0x07e0: 2c20 616e 6420 7769 6c6c 2062 6520 726f ,.and.will.be.ro - 0x07f0: 7461 7465 640a 7765 656b 6c79 2e20 2054 tated.weekly...T - 0x0800: 6865 2066 7265 7175 656e 6379 206f 6620 he.frequency.of. - 0x0810: 726f 7461 7469 6f6e 2063 616e 2062 6520 rotation.can.be. - 0x0820: 6561 7369 6c79 2063 6861 6e67 6564 2062 easily.changed.b - 0x0830: 7920 6564 6974 696e 670a 3c54 543e 2f65 y.editing./e - 0x0840: 7463 2f6c 6f67 726f 7461 7465 2e64 2f61 tc/logrotate.d/a - 0x0850: 7061 6368 653c 2f54 543e 2e3c 2f4c 493e pache.
  • - 0x0860: 0a0a 3c4c 493e 0a54 6865 2064 6566 6175 ..
  • .The.defau - 0x0870: 6c74 2064 6972 6563 746f 7279 2069 6e64 lt.directory.ind - 0x0880: 6578 2069 7320 3c54 543e 696e 6465 782e ex.is.index. - 0x0890: 6874 6d6c 3c2f 5454 3e2c 206d 6561 6e69 html,.meani - 0x08a0: 6e67 2074 6861 7420 7265 7175 6573 7473 ng.that.requests - 0x08b0: 0a66 6f72 2061 2064 6972 6563 746f 7279 .for.a.directory - 0x08c0: 203c 5454 3e2f 666f 6f2f 6261 722f 3c2f ./foo/bar/.will.give.th - 0x08e0: 6520 636f 6e74 656e 7473 206f 6620 7468 e.contents.of.th - 0x08f0: 6520 6669 6c65 203c 5454 3e2f 7661 722f e.file./var/ - 0x0900: 7777 772f 666f 6f2f 6261 722f 696e 6465 www/foo/bar/inde - 0x0910: 782e 6874 6d6c 3c2f 5454 3e0a 6966 2069 x.html.if.i - 0x0920: 7420 6578 6973 7473 2028 6173 7375 6d69 t.exists.(assumi - 0x0930: 6e67 2074 6861 7420 3c54 543e 2f76 6172 ng.that./var - 0x0940: 2f77 7777 3c2f 5454 3e20 6973 2079 6f75 /www.is.you - 0x0950: 7220 3c54 543e 446f 6375 6d65 6e74 526f r.DocumentRo - 0x0960: 6f74 3c2f 5454 3e29 2e3c 2f4c 493e 0a0a ot).
  • .. - 0x0970: 3c4c 493e 0a55 7365 7220 6469 7265 6374
  • .User.direct - 0x0980: 6f72 6965 7320 6172 6520 656e 6162 6c65 ories.are.enable - 0x0990: 642c 2061 6e64 2075 7365 7220 646f 6375 d,.and.user.docu - 0x09a0: 6d65 6e74 7320 7769 6c6c 2062 6520 6c6f ments.will.be.lo - 0x09b0: 6f6b 6564 2066 6f72 0a69 6e20 7468 6520 oked.for.in.the. - 0x09c0: 3c54 543e 7075 626c 6963 5f68 746d 6c3c public_html< - 0x09d0: 2f54 543e 2064 6972 6563 746f 7279 206f /TT>.directory.o - 0x09e0: 6620 7468 6520 7573 6572 7327 2068 6f6d f.the.users'.hom - 0x09f0: 6573 2e20 2054 6865 7365 2064 6972 730a es...These.dirs. - 0x0a00: 7368 6f75 6c64 2062 6520 756e 6465 7220 should.be.under. - 0x0a10: 3c54 543e 2f68 6f6d 653c 2f54 543e 2c20 /home,. - 0x0a20: 616e 6420 7573 6572 7320 7769 6c6c 206e and.users.will.n - 0x0a30: 6f74 2062 6520 6162 6c65 2074 6f20 7379 ot.be.able.to.sy - 0x0a40: 6d6c 696e 6b0a 746f 2066 696c 6573 2074 mlink.to.files.t - 0x0a50: 6865 7920 646f 6e27 7420 6f77 6e2e 3c2f hey.don't.own...
.All.t - 0x0a70: 6865 2073 7461 6e64 6172 6420 6170 6163 he.standard.apac - 0x0a80: 6865 206d 6f64 756c 6573 2061 7265 2061 he.modules.are.a - 0x0a90: 7661 696c 6162 6c65 2077 6974 6820 7468 vailable.with.th - 0x0aa0: 6973 2072 656c 6561 7365 2061 6e64 2061 is.release.and.a - 0x0ab0: 7265 0a6e 6f77 206d 616e 6167 6564 2077 re.now.managed.w - 0x0ac0: 6974 6820 6465 6263 6f6e 662e 2020 5479 ith.debconf...Ty - 0x0ad0: 7065 203c 5454 3e64 706b 672d 7265 636f pe.dpkg-reco - 0x0ae0: 6e66 6967 7572 6520 6170 6163 6865 3c2f nfigure.apache.to.select.wh - 0x0b00: 6963 6820 6d6f 6475 6c65 7320 796f 7520 ich.modules.you. - 0x0b10: 7761 6e74 2065 6e61 626c 6564 2e20 204d want.enabled...M - 0x0b20: 616e 7920 6f74 6865 7220 6d6f 6475 6c65 any.other.module - 0x0b30: 7320 6172 6520 6176 6169 6c61 626c 650a s.are.available. - 0x0b40: 7468 726f 7567 6820 7468 6520 4465 6269 through.the.Debi - 0x0b50: 616e 2070 6163 6b61 6765 2073 7973 7465 an.package.syste - 0x0b60: 6d20 7769 7468 2074 6865 206e 616d 6573 m.with.the.names - 0x0b70: 203c 5454 3e6c 6962 6170 6163 6865 2d6d .libapache-m - 0x0b80: 6f64 2d2a 3c2f 5454 3e2e 0a49 6620 796f od-*..If.yo - 0x0b90: 7520 6e65 6564 2074 6f20 636f 6d70 696c u.need.to.compil - 0x0ba0: 6520 6120 6d6f 6475 6c65 2079 6f75 7273 e.a.module.yours - 0x0bb0: 656c 662c 2079 6f75 2077 696c 6c20 6e65 elf,.you.will.ne - 0x0bc0: 6564 2074 6f20 696e 7374 616c 6c20 7468 ed.to.install.th - 0x0bd0: 650a 3c54 543e 6170 6163 6865 2d64 6576 e.apache-dev - 0x0be0: 3c2f 5454 3e20 7061 636b 6167 652e 0a0a .package... - 0x0bf0: 3c50 3e4d 6f72 6520 646f 6375 6d65 6e74

More.document - 0x0c00: 6174 696f 6e20 6f6e 2041 7061 6368 6520 ation.on.Apache. - 0x0c10: 6361 6e20 6265 2066 6f75 6e64 206f 6e3a can.be.found.on: - 0x0c20: 0a3c 554c 3e0a 3c4c 493e 0a54 6865 203c .

    .
  • .The.< - 0x0c30: 4120 4852 4546 3d22 2f64 6f63 2f61 7061 A.HREF="/doc/apa - 0x0c40: 6368 652d 646f 632f 6d61 6e75 616c 2f22 che-doc/manual/" - 0x0c50: 3e41 7061 6368 6520 646f 6375 6d65 6e74 >Apache.document - 0x0c60: 6174 696f 6e3c 2f41 3e20 7374 6f72 6564 ation.stored - 0x0c70: 206f 6e20 796f 7572 2073 6572 7665 722e .on.your.server. - 0x0c80: 3c2f 4c49 3e0a 0a3c 4c49 3e0a 5468 6520
  • ..
  • .The. - 0x0c90: 3c41 2048 5245 463d 2268 7474 703a 2f2f Apache.Project< - 0x0cc0: 2f41 3e20 686f 6d65 2073 6974 652e 3c2f /A>.home.site...
  • .The.Apache-SSL.home.site.
  • ..
  • .The.mo - 0x0d50: 6420 7065 726c 3c2f 413e 2068 6f6d 6520 d.perl.home. - 0x0d60: 7369 7465 2e3c 2f4c 493e 0a0a 3c4c 493e site.
  • ..
  • - 0x0d70: 0a54 6865 203c 4120 4852 4546 3d22 6874 .The.Apache - 0x0da0: 5765 656b 3c2f 413e 206e 6577 736c 6574 Week.newslet - 0x0db0: 7465 722e 3c2f 4c49 3e0a 0a3c 4c49 3e0a ter.
  • ..
  • . - 0x0dc0: 5468 6520 3c41 2048 5245 463d 2268 7474 The.Debian. - 0x0df0: 5072 6f6a 6563 740a 446f 6375 6d65 6e74 Project.Document - 0x0e00: 6174 696f 6e3c 2f41 3e20 7768 6963 6820 ation.which. - 0x0e10: 636f 6e74 6169 6e73 2048 4f57 544f 732c contains.HOWTOs, - 0x0e20: 2046 4151 732c 2061 6e64 2073 6f66 7477 .FAQs,.and.softw - 0x0e30: 6172 6520 7570 6461 7465 732e 3c2f 4c49 are.updates.
  • .
..

You. - 0x0e50: 6361 6e20 616c 736f 2063 6f6e 7375 6c74 can.also.consult - 0x0e60: 2074 6865 206c 6973 7420 6f66 203c 4120 .the.list.of.World.Wide.We - 0x0ea0: 6220 4672 6571 7565 6e74 6c79 2041 736b b.Frequently.Ask - 0x0eb0: 6564 2051 7565 7374 696f 6e73 3c2f 413e ed.Questions - 0x0ec0: 2066 6f72 2069 6e66 6f72 6d61 7469 6f6e .for.information - 0x0ed0: 2e0a 0a3c 4832 3e4c 6574 206f 7468 6572 ...

Let.other - 0x0ee0: 2070 656f 706c 6520 6b6e 6f77 2061 626f .people.know.abo - 0x0ef0: 7574 2074 6869 7320 7365 7276 6572 3c2f ut.this.server..Netcraft - 0x0f30: 2070 726f 7669 6465 7320 616e 2069 6e74 .provides.an.int - 0x0f40: 6572 6573 7469 6e67 2066 7265 650a 7365 eresting.free.se - 0x0f50: 7276 6963 6520 666f 7220 7765 6220 7369 rvice.for.web.si - 0x0f60: 7465 206d 6f6e 6974 6f72 696e 6720 616e te.monitoring.an - 0x0f70: 6420 7374 6174 6973 7469 6320 636f 6c6c d.statistic.coll - 0x0f80: 6563 7469 6f6e 2e0a 596f 7520 6361 6e20 ection..You.can. - 0x0f90: 6c65 7420 7468 656d 206b 6e6f 7720 6162 let.them.know.ab - 0x0fa0: 6f75 7420 796f 7572 2073 6572 7665 7220 out.your.server. - 0x0fb0: 7573 696e 6720 7468 6569 720a 3c41 2048 using.their.interface. - 0x0ff0: 0a45 6e61 626c 696e 6720 7468 6520 6d6f .Enabling.the.mo - 0x1000: 6e69 746f 7269 6e67 206f 6620 796f 7572 nitoring.of.your - 0x1010: 2073 6572 7665 7220 7769 6c6c 2070 726f .server.will.pro - 0x1020: 7669 6465 2061 2062 6574 7465 7220 676c vide.a.better.gl - 0x1030: 6f62 616c 206f 7665 7276 6965 770a 6f66 obal.overview.of - 0x1040: 2077 686f 2069 7320 7573 696e 6720 7768 .who.is.using.wh - 0x1050: 6174 2061 6e64 2077 6865 7265 2c20 616e at.and.where,.an - 0x1060: 6420 6974 2077 6f75 6c64 2067 6976 6520 d.it.would.give. - 0x1070: 4465 6269 616e 2061 2062 6574 7465 720a Debian.a.better. - 0x1080: 6f76 6572 7669 6577 206f 6620 7468 6520 overview.of.the. - 0x1090: 6170 6163 6865 2070 6163 6b61 6765 2075 apache.package.u - 0x10a0: 7361 6765 2e0a 0a3c 4832 3e41 626f 7574 sage...

About - 0x10b0: 2074 6869 7320 7061 6765 3c2f 4832 3e0a .this.page

. - 0x10c0: 0a3c 494d 4720 414c 4947 4e3d 2272 6967 ...

- 0x1110: 5468 6973 2069 7320 6120 706c 6163 6568 This.is.a.placeh - 0x1120: 6f6c 6465 7220 7061 6765 2069 6e73 7461 older.page.insta - 0x1130: 6c6c 6564 2062 7920 7468 6520 3c41 0a48 lled.by.the.Deb - 0x1160: 6961 6e3c 2f41 3e0a 7265 6c65 6173 6520 ian.release. - 0x1170: 6f66 2074 6865 2061 7061 6368 6520 5765 of.the.apache.We - 0x1180: 6220 7365 7276 6572 2070 6163 6b61 6765 b.server.package - 0x1190: 2e0a 0a3c 503e 5468 6973 2063 6f6d 7075 ...

This.compu - 0x11a0: 7465 7220 6861 7320 696e 7374 616c 6c65 ter.has.installe - 0x11b0: 6420 7468 6520 4465 6269 616e 2047 4e55 d.the.Debian.GNU - 0x11c0: 2f4c 696e 7578 206f 7065 7261 7469 6e67 /Linux.operating - 0x11d0: 2073 7973 7465 6d2c 0a62 7574 2069 7420 .system,.but.it. - 0x11e0: 6861 7320 3c73 7472 6f6e 673e 6e6f 7468 has.noth - 0x11f0: 696e 6720 746f 2064 6f20 7769 7468 2074 ing.to.do.with.t - 0x1200: 6865 2044 6562 6961 6e0a 5072 6f6a 6563 he.Debian.Projec - 0x1210: 743c 2f73 7472 6f6e 673e 2e20 506c 6561 t..Plea - 0x1220: 7365 2064 6f20 3c73 7472 6f6e 673e 6e6f se.do.no - 0x1230: 743c 2f73 7472 6f6e 673e 2063 6f6e 7461 t.conta - 0x1240: 6374 2074 6865 2044 6562 6961 6e0a 5072 ct.the.Debian.Pr - 0x1250: 6f6a 6563 7420 6162 6f75 7420 6974 2e3c oject.about.it.< - 0x1260: 2f50 3e0a 0a3c 503e 4966 2079 6f75 2066 /P>..

If.you.f - 0x1270: 696e 6420 6120 6275 6720 696e 2074 6869 ind.a.bug.in.thi - 0x1280: 7320 6170 6163 6865 2070 6163 6b61 6765 s.apache.package - 0x1290: 2c20 6f72 2069 6e20 4170 6163 6865 2069 ,.or.in.Apache.i - 0x12a0: 7473 656c 662c 0a70 6c65 6173 6520 6669 tself,.please.fi - 0x12b0: 6c65 2061 2062 7567 2072 6570 6f72 7420 le.a.bug.report. - 0x12c0: 6f6e 2069 742e 2020 496e 7374 7275 6374 on.it...Instruct - 0x12d0: 696f 6e73 206f 6e20 646f 696e 6720 7468 ions.on.doing.th - 0x12e0: 6973 2c20 616e 6420 7468 650a 6c69 7374 is,.and.the.list - 0x12f0: 206f 6620 3c41 2048 5245 463d 2268 7474 .of. - 0x1320: 6b6e 6f77 6e20 6275 6773 3c2f 413e 206f known.bugs.o - 0x1330: 6620 7468 6973 0a70 6163 6b61 6765 2c20 f.this.package,. - 0x1340: 6361 6e20 6265 2066 6f75 6e64 2069 6e20 can.be.found.in. - 0x1350: 7468 6520 0a3c 4120 4852 4546 3d22 6874 the..Debian.Bug.T - 0x1390: 7261 636b 696e 6720 5379 7374 656d 3c2f racking.System...

Thanks.f - 0x13b0: 6f72 2075 7369 6e67 2074 6869 7320 7061 or.using.this.pa - 0x13c0: 636b 6167 652c 2061 6e64 2063 6f6e 6772 ckage,.and.congr - 0x13d0: 6174 756c 6174 696f 6e73 2066 6f72 2079 atulations.for.y - 0x13e0: 6f75 7220 6368 6f69 6365 206f 660a 6120 our.choice.of.a. - 0x13f0: 4465 6269 616e 2073 7973 7465 6d21 3c2f Debian.system!...........< - 0x1520: 212d 2d0a 2020 5468 6973 2070 6167 6520 !--...This.page. - 0x1530: 7761 7320 696e 6974 6961 6c6c 7920 6372 was.initially.cr - 0x1540: 6561 7465 6420 6279 204a 6f68 6e69 6520 eated.by.Johnie. - 0x1550: 496e 6772 616d 2028 6874 7470 3a2f 2f6e Ingram.(http://n - 0x1560: 6574 676f 642e 6e65 742f 290a 2020 4974 etgod.net/)...It - 0x1570: 2077 6173 206c 6174 6572 2065 6469 7465 .was.later.edite - 0x1580: 6420 6279 204d 6174 7468 6577 2057 696c d.by.Matthew.Wil - 0x1590: 636f 7820 616e 6420 4a6f 7369 7020 526f cox.and.Josip.Ro - 0x15a0: 6469 6e2e 0a20 204c 6173 7420 6d6f 6469 din....Last.modi - 0x15b0: 6669 6564 3a20 2444 6174 653a 2032 3030 fied:.$Date:.200 - 0x15c0: 342f 3036 2f32 3020 3135 3a33 333a 3537 4/06/20.15:33:57 - 0x15d0: 2024 2e0a 2020 2d2d 3e0a 0a3c 2f42 4f44 .$....-->.... -22:57:35.941260 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5560, win 12383, options [nop,nop,TS val 1306300953 ecr 1306300953], length 0 - 0x0000: 4500 0034 1b6e 4000 4006 2154 7f00 0001 E..4.n@.@.!T.... - 0x0010: 7f00 0001 da70 0050 3758 8a49 377a a3a9 .....p.P7X.I7z.. - 0x0020: 8010 305f 10ea 0000 0101 080a 4ddc 9219 ..0_........M... - 0x0030: 4ddc 9219 M... -22:57:37.229575 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [F.], seq 203, ack 5560, win 12383, options [nop,nop,TS val 1306302241 ecr 1306300953], length 0 - 0x0000: 4500 0034 1b70 4000 4006 2152 7f00 0001 E..4.p@.@.!R.... - 0x0010: 7f00 0001 da70 0050 3758 8a49 377a a3a9 .....p.P7X.I7z.. - 0x0020: 8011 305f 0be1 0000 0101 080a 4ddc 9721 ..0_........M..! - 0x0030: 4ddc 9219 M... -22:57:37.230839 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [F.], seq 5560, ack 204, win 8192, options [nop,nop,TS val 1306302243 ecr 1306302241], length 0 - 0x0000: 4500 0034 1fe8 4000 4006 1cda 7f00 0001 E..4..@.@....... - 0x0010: 7f00 0001 0050 da70 377a a3a9 3758 8a4a .....P.p7z..7X.J - 0x0020: 8011 2000 1735 0000 0101 080a 4ddc 9723 .....5......M..# - 0x0030: 4ddc 9721 M..! -22:57:37.230900 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5561, win 12383, options [nop,nop,TS val 1306302243 ecr 1306302243], length 0 - 0x0000: 4500 0034 1b72 4000 4006 2150 7f00 0001 E..4.r@.@.!P.... - 0x0010: 7f00 0001 da70 0050 3758 8a4a 377a a3aa .....p.P7X.J7z.. - 0x0020: 8010 305f 06d4 0000 0101 080a 4ddc 9723 ..0_........M..# - 0x0030: 4ddc 9723 M..# diff --git a/contrib/tcpdump/tests/print-capXX.out b/contrib/tcpdump/tests/print-capXX.out deleted file mode 100644 index 5062a85a9d6..00000000000 --- a/contrib/tcpdump/tests/print-capXX.out +++ /dev/null @@ -1,419 +0,0 @@ -22:57:35.938066 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [S], seq 928549246, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 0,nop,wscale 2], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. - 0x0010: 003c 1b68 4000 4006 2152 7f00 0001 7f00 .<.h@.@.!R...... - 0x0020: 0001 da70 0050 3758 897e 0000 0000 a002 ...p.P7X.~...... - 0x0030: 7fff 1421 0000 0204 400c 0402 080a 4ddc ...!....@.....M. - 0x0040: 9216 0000 0000 0103 0302 .......... -22:57:35.938122 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [S.], seq 930778609, ack 928549247, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 1306300950,nop,wscale 2], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. - 0x0010: 003c 0000 4000 4006 3cba 7f00 0001 7f00 .<..@.@.<....... - 0x0020: 0001 0050 da70 377a 8df1 3758 897f a012 ...P.p7z..7X.... - 0x0030: 7fff 6eb1 0000 0204 400c 0402 080a 4ddc ..n.....@.....M. - 0x0040: 9216 4ddc 9216 0103 0302 ..M....... -22:57:35.938167 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 1, win 8192, options [nop,nop,TS val 1306300950 ecr 1306300950], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. - 0x0010: 0034 1b6a 4000 4006 2158 7f00 0001 7f00 .4.j@.@.!X...... - 0x0020: 0001 da70 0050 3758 897f 377a 8df2 8010 ...p.P7X..7z.... - 0x0030: 2000 37d0 0000 0101 080a 4ddc 9216 4ddc ..7.......M...M. - 0x0040: 9216 .. -22:57:35.939423 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [P.], seq 1:203, ack 1, win 8192, options [nop,nop,TS val 1306300951 ecr 1306300950], length 202 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. - 0x0010: 00fe 1b6c 4000 4006 208c 7f00 0001 7f00 ...l@.@......... - 0x0020: 0001 da70 0050 3758 897f 377a 8df2 8018 ...p.P7X..7z.... - 0x0030: 2000 fef2 0000 0101 080a 4ddc 9217 4ddc ..........M...M. - 0x0040: 9216 4745 5420 2f20 4854 5450 2f31 2e31 ..GET./.HTTP/1.1 - 0x0050: 0d0a 486f 7374 3a20 6c6f 6361 6c68 6f73 ..Host:.localhos - 0x0060: 740d 0a55 7365 722d 4167 656e 743a 2045 t..User-Agent:.E - 0x0070: 4c69 6e6b 732f 302e 3130 2e34 2d37 2d64 Links/0.10.4-7-d - 0x0080: 6562 6961 6e20 2874 6578 746d 6f64 653b ebian.(textmode; - 0x0090: 204c 696e 7578 2032 2e36 2e31 312d 312d .Linux.2.6.11-1- - 0x00a0: 3638 362d 736d 7020 6936 3836 3b20 3133 686-smp.i686;.13 - 0x00b0: 3278 3536 2d32 290d 0a41 6363 6570 743a 2x56-2)..Accept: - 0x00c0: 202a 2f2a 0d0a 4163 6365 7074 2d45 6e63 .*/*..Accept-Enc - 0x00d0: 6f64 696e 673a 2067 7a69 700d 0a41 6363 oding:.gzip..Acc - 0x00e0: 6570 742d 4c61 6e67 7561 6765 3a20 656e ept-Language:.en - 0x00f0: 0d0a 436f 6e6e 6563 7469 6f6e 3a20 4b65 ..Connection:.Ke - 0x0100: 6570 2d41 6c69 7665 0d0a 0d0a ep-Alive.... -22:57:35.940474 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [.], ack 203, win 8192, options [nop,nop,TS val 1306300952 ecr 1306300951], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. - 0x0010: 0034 1fe4 4000 4006 1cde 7f00 0001 7f00 .4..@.@......... - 0x0020: 0001 0050 da70 377a 8df2 3758 8a49 8010 ...P.p7z..7X.I.. - 0x0030: 2000 3703 0000 0101 080a 4ddc 9218 4ddc ..7.......M...M. - 0x0040: 9217 .. -22:57:35.941232 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [P.], seq 1:5560, ack 203, win 8192, options [nop,nop,TS val 1306300953 ecr 1306300951], length 5559 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. - 0x0010: 15eb 1fe6 4000 4006 0725 7f00 0001 7f00 ....@.@..%...... - 0x0020: 0001 0050 da70 377a 8df2 3758 8a49 8018 ...P.p7z..7X.I.. - 0x0030: 2000 13e0 0000 0101 080a 4ddc 9219 4ddc ..........M...M. - 0x0040: 9217 4854 5450 2f31 2e31 2032 3030 204f ..HTTP/1.1.200.O - 0x0050: 4b0d 0a44 6174 653a 2057 6564 2c20 3036 K..Date:.Wed,.06 - 0x0060: 204a 756c 2032 3030 3520 3033 3a35 373a .Jul.2005.03:57: - 0x0070: 3335 2047 4d54 0d0a 5365 7276 6572 3a20 35.GMT..Server:. - 0x0080: 4170 6163 6865 2f31 2e33 2e33 330d 0a4c Apache/1.3.33..L - 0x0090: 6173 742d 4d6f 6469 6669 6564 3a20 5375 ast-Modified:.Su - 0x00a0: 6e2c 2031 3520 4175 6720 3230 3034 2030 n,.15.Aug.2004.0 - 0x00b0: 303a 3433 3a34 3120 474d 540d 0a45 5461 0:43:41.GMT..ETa - 0x00c0: 673a 2022 3665 3830 6630 2d31 3438 612d g:."6e80f0-148a- - 0x00d0: 3431 3165 6231 6264 220d 0a41 6363 6570 411eb1bd"..Accep - 0x00e0: 742d 5261 6e67 6573 3a20 6279 7465 730d t-Ranges:.bytes. - 0x00f0: 0a43 6f6e 7465 6e74 2d4c 656e 6774 683a .Content-Length: - 0x0100: 2035 3235 380d 0a4b 6565 702d 416c 6976 .5258..Keep-Aliv - 0x0110: 653a 2074 696d 656f 7574 3d31 352c 206d e:.timeout=15,.m - 0x0120: 6178 3d31 3030 0d0a 436f 6e6e 6563 7469 ax=100..Connecti - 0x0130: 6f6e 3a20 4b65 6570 2d41 6c69 7665 0d0a on:.Keep-Alive.. - 0x0140: 436f 6e74 656e 742d 5479 7065 3a20 7465 Content-Type:.te - 0x0150: 7874 2f68 746d 6c3b 2063 6861 7273 6574 xt/html;.charset - 0x0160: 3d69 736f 2d38 3835 392d 310d 0a0d 0a3c =iso-8859-1....< - 0x0170: 2144 4f43 5459 5045 2048 544d 4c20 5055 !DOCTYPE.HTML.PU - 0x0180: 424c 4943 2022 2d2f 2f57 3343 2f2f 4454 BLIC."-//W3C//DT - 0x0190: 4420 4854 4d4c 2034 2e30 3120 5472 616e D.HTML.4.01.Tran - 0x01a0: 7369 7469 6f6e 616c 2f2f 454e 223e 0a3c sitional//EN">.< - 0x01b0: 4854 4d4c 3e0a 3c48 4541 443e 0a20 2020 HTML>..... - 0x01c0: 3c4d 4554 4120 4854 5450 2d45 5155 4956 ........Placeholder - 0x0270: 2070 6167 653c 2f54 4954 4c45 3e0a 3c2f .page....Placeholder.pa - 0x02f0: 6765 3c2f 4831 3e0a 3c48 323e 4966 2079 ge

.

If.y - 0x0300: 6f75 2061 7265 206a 7573 7420 6272 6f77 ou.are.just.brow - 0x0310: 7369 6e67 2074 6865 2077 6562 3c2f 6832 sing.the.web

..

The.owner. - 0x0330: 6f66 2074 6869 7320 7765 6220 7369 7465 of.this.web.site - 0x0340: 2068 6173 206e 6f74 2070 7574 2075 7020 .has.not.put.up. - 0x0350: 616e 7920 7765 6220 7061 6765 7320 7965 any.web.pages.ye - 0x0360: 742e 0a50 6c65 6173 6520 636f 6d65 2062 t..Please.come.b - 0x0370: 6163 6b20 6c61 7465 722e 3c2f 503e 0a0a ack.later.

.. - 0x0380: 3c50 3e3c 534d 414c 4c3e 3c43 4954 453e

- 0x0390: 4d6f 7665 2061 6c6f 6e67 2c20 6e6f 7468 Move.along,.noth - 0x03a0: 696e 6720 746f 2073 6565 2068 6572 652e ing.to.see.here. - 0x03b0: 2e2e 3c2f 4349 5445 3e20 3a2d 293c 2f53 ...:-)

..

I - 0x03d0: 6620 796f 7520 6172 6520 7472 7969 6e67 f.you.are.trying - 0x03e0: 2074 6f20 6c6f 6361 7465 2074 6865 2061 .to.locate.the.a - 0x03f0: 646d 696e 6973 7472 6174 6f72 206f 6620 dministrator.of. - 0x0400: 7468 6973 206d 6163 6869 6e65 3c2f 4832 this.machine

..

If.you.wan - 0x0420: 7420 746f 2072 6570 6f72 7420 736f 6d65 t.to.report.some - 0x0430: 7468 696e 6720 6162 6f75 7420 7468 6973 thing.about.this - 0x0440: 2068 6f73 7427 7320 6265 6861 7669 6f72 .host's.behavior - 0x0450: 2c20 706c 6561 7365 0a63 6f6e 7461 6374 ,.please.contact - 0x0460: 2074 6865 2049 6e74 6572 6e65 7420 5365 .the.Internet.Se - 0x0470: 7276 6963 6520 5072 6f76 6964 6572 2028 rvice.Provider.( - 0x0480: 4953 5029 2069 6e76 6f6c 7665 6420 6469 ISP).involved.di - 0x0490: 7265 6374 6c79 2e3c 2f50 3e0a 0a3c 503e rectly.

..

- 0x04a0: 5365 6520 7468 6520 3c41 2068 7265 663d See.the.Network. - 0x04d0: 4162 7573 650a 436c 6561 7269 6e67 686f Abuse.Clearingho - 0x04e0: 7573 653c 2f41 3e20 666f 7220 686f 7720 use.for.how. - 0x04f0: 746f 2064 6f20 7468 6973 2e3c 2f50 3e0a to.do.this.

. - 0x0500: 0a3c 4832 3e49 6620 796f 7520 6172 6520 .

If.you.are. - 0x0510: 7468 6520 6164 6d69 6e69 7374 7261 746f the.administrato - 0x0520: 7220 6f66 2074 6869 7320 6d61 6368 696e r.of.this.machin - 0x0530: 653c 2f48 323e 0a0a 3c50 3e54 6865 2069 e

..

The.i - 0x0540: 6e69 7469 616c 2069 6e73 7461 6c6c 6174 nitial.installat - 0x0550: 696f 6e20 6f66 203c 4120 6872 6566 3d22 ion.of.Debian's - 0x0580: 0a61 7061 6368 653c 2f41 3e20 7765 6220 .apache.web. - 0x0590: 7365 7276 6572 2070 6163 6b61 6765 2077 server.package.w - 0x05a0: 6173 2073 7563 6365 7373 6675 6c2e 3c2f as.successful...

Y - 0x05c0: 6f75 2073 686f 756c 6420 7265 706c 6163 ou.should.replac - 0x05d0: 6520 7468 6973 2070 6167 6520 7769 7468 e.this.page.with - 0x05e0: 2079 6f75 7220 6f77 6e20 7765 6220 7061 .your.own.web.pa - 0x05f0: 6765 7320 6173 0a73 6f6f 6e20 6173 2070 ges.as.soon.as.p - 0x0600: 6f73 7369 626c 652e 3c2f 5354 524f 4e47 ossible.

..

Unless - 0x0620: 2079 6f75 2063 6861 6e67 6564 2069 7473 .you.changed.its - 0x0630: 2063 6f6e 6669 6775 7261 7469 6f6e 2c20 .configuration,. - 0x0640: 796f 7572 206e 6577 2073 6572 7665 7220 your.new.server. - 0x0650: 6973 2063 6f6e 6669 6775 7265 6420 6173 is.configured.as - 0x0660: 2066 6f6c 6c6f 7773 3a0a 3c55 4c3e 0a3c .follows:.

    .< - 0x0670: 4c49 3e0a 436f 6e66 6967 7572 6174 696f LI>.Configuratio - 0x0680: 6e20 6669 6c65 7320 6361 6e20 6265 2066 n.files.can.be.f - 0x0690: 6f75 6e64 2069 6e20 3c54 543e 2f65 7463 ound.in./etc - 0x06a0: 2f61 7061 6368 653c 2f54 543e 2e3c 2f4c /apache...
  • .The.DocumentRoot,.which.is.the - 0x06e0: 2064 6972 6563 746f 7279 2075 6e64 6572 .directory.under - 0x06f0: 2077 6869 6368 2061 6c6c 2079 6f75 720a .which.all.your. - 0x0700: 4854 4d4c 2066 696c 6573 2073 686f 756c HTML.files.shoul - 0x0710: 6420 6578 6973 742c 2069 7320 7365 7420 d.exist,.is.set. - 0x0720: 746f 203c 5454 3e2f 7661 722f 7777 773c to./var/www< - 0x0730: 2f54 543e 2e3c 2f4c 493e 0a0a 3c4c 493e /TT>.
  • ..
  • - 0x0740: 0a43 4749 2073 6372 6970 7473 2061 7265 .CGI.scripts.are - 0x0750: 206c 6f6f 6b65 6420 666f 7220 696e 203c .looked.for.in.< - 0x0760: 5454 3e2f 7573 722f 6c69 622f 6367 692d TT>/usr/lib/cgi- - 0x0770: 6269 6e3c 2f54 543e 2c20 7768 6963 6820 bin,.which. - 0x0780: 6973 2077 6865 7265 0a44 6562 6961 6e20 is.where.Debian. - 0x0790: 7061 636b 6167 6573 2077 696c 6c20 706c packages.will.pl - 0x07a0: 6163 6520 7468 6569 7220 7363 7269 7074 ace.their.script - 0x07b0: 732e 3c2f 4c49 3e0a 0a3c 4c49 3e0a 4c6f s.
  • ..
  • .Lo - 0x07c0: 6720 6669 6c65 7320 6172 6520 706c 6163 g.files.are.plac - 0x07d0: 6564 2069 6e20 3c54 543e 2f76 6172 2f6c ed.in./var/l - 0x07e0: 6f67 2f61 7061 6368 653c 2f54 543e 2c20 og/apache,. - 0x07f0: 616e 6420 7769 6c6c 2062 6520 726f 7461 and.will.be.rota - 0x0800: 7465 640a 7765 656b 6c79 2e20 2054 6865 ted.weekly...The - 0x0810: 2066 7265 7175 656e 6379 206f 6620 726f .frequency.of.ro - 0x0820: 7461 7469 6f6e 2063 616e 2062 6520 6561 tation.can.be.ea - 0x0830: 7369 6c79 2063 6861 6e67 6564 2062 7920 sily.changed.by. - 0x0840: 6564 6974 696e 670a 3c54 543e 2f65 7463 editing./etc - 0x0850: 2f6c 6f67 726f 7461 7465 2e64 2f61 7061 /logrotate.d/apa - 0x0860: 6368 653c 2f54 543e 2e3c 2f4c 493e 0a0a che.
  • .. - 0x0870: 3c4c 493e 0a54 6865 2064 6566 6175 6c74
  • .The.default - 0x0880: 2064 6972 6563 746f 7279 2069 6e64 6578 .directory.index - 0x0890: 2069 7320 3c54 543e 696e 6465 782e 6874 .is.index.ht - 0x08a0: 6d6c 3c2f 5454 3e2c 206d 6561 6e69 6e67 ml,.meaning - 0x08b0: 2074 6861 7420 7265 7175 6573 7473 0a66 .that.requests.f - 0x08c0: 6f72 2061 2064 6972 6563 746f 7279 203c or.a.directory.< - 0x08d0: 5454 3e2f 666f 6f2f 6261 722f 3c2f 5454 TT>/foo/bar/.will.give.the. - 0x08f0: 636f 6e74 656e 7473 206f 6620 7468 6520 contents.of.the. - 0x0900: 6669 6c65 203c 5454 3e2f 7661 722f 7777 file./var/ww - 0x0910: 772f 666f 6f2f 6261 722f 696e 6465 782e w/foo/bar/index. - 0x0920: 6874 6d6c 3c2f 5454 3e0a 6966 2069 7420 html.if.it. - 0x0930: 6578 6973 7473 2028 6173 7375 6d69 6e67 exists.(assuming - 0x0940: 2074 6861 7420 3c54 543e 2f76 6172 2f77 .that./var/w - 0x0950: 7777 3c2f 5454 3e20 6973 2079 6f75 7220 ww.is.your. - 0x0960: 3c54 543e 446f 6375 6d65 6e74 526f 6f74 DocumentRoot - 0x0970: 3c2f 5454 3e29 2e3c 2f4c 493e 0a0a 3c4c ).
  • ...User.director - 0x0990: 6965 7320 6172 6520 656e 6162 6c65 642c ies.are.enabled, - 0x09a0: 2061 6e64 2075 7365 7220 646f 6375 6d65 .and.user.docume - 0x09b0: 6e74 7320 7769 6c6c 2062 6520 6c6f 6f6b nts.will.be.look - 0x09c0: 6564 2066 6f72 0a69 6e20 7468 6520 3c54 ed.for.in.the.public_html.directory.of. - 0x09f0: 7468 6520 7573 6572 7327 2068 6f6d 6573 the.users'.homes - 0x0a00: 2e20 2054 6865 7365 2064 6972 730a 7368 ...These.dirs.sh - 0x0a10: 6f75 6c64 2062 6520 756e 6465 7220 3c54 ould.be.under./home
    ,.an - 0x0a30: 6420 7573 6572 7320 7769 6c6c 206e 6f74 d.users.will.not - 0x0a40: 2062 6520 6162 6c65 2074 6f20 7379 6d6c .be.able.to.syml - 0x0a50: 696e 6b0a 746f 2066 696c 6573 2074 6865 ink.to.files.the - 0x0a60: 7920 646f 6e27 7420 6f77 6e2e 3c2f 4c49 y.don't.own...
.All.the - 0x0a80: 2073 7461 6e64 6172 6420 6170 6163 6865 .standard.apache - 0x0a90: 206d 6f64 756c 6573 2061 7265 2061 7661 .modules.are.ava - 0x0aa0: 696c 6162 6c65 2077 6974 6820 7468 6973 ilable.with.this - 0x0ab0: 2072 656c 6561 7365 2061 6e64 2061 7265 .release.and.are - 0x0ac0: 0a6e 6f77 206d 616e 6167 6564 2077 6974 .now.managed.wit - 0x0ad0: 6820 6465 6263 6f6e 662e 2020 5479 7065 h.debconf...Type - 0x0ae0: 203c 5454 3e64 706b 672d 7265 636f 6e66 .dpkg-reconf - 0x0af0: 6967 7572 6520 6170 6163 6865 3c2f 5454 igure.apache.to.select.whic - 0x0b10: 6820 6d6f 6475 6c65 7320 796f 7520 7761 h.modules.you.wa - 0x0b20: 6e74 2065 6e61 626c 6564 2e20 204d 616e nt.enabled...Man - 0x0b30: 7920 6f74 6865 7220 6d6f 6475 6c65 7320 y.other.modules. - 0x0b40: 6172 6520 6176 6169 6c61 626c 650a 7468 are.available.th - 0x0b50: 726f 7567 6820 7468 6520 4465 6269 616e rough.the.Debian - 0x0b60: 2070 6163 6b61 6765 2073 7973 7465 6d20 .package.system. - 0x0b70: 7769 7468 2074 6865 206e 616d 6573 203c with.the.names.< - 0x0b80: 5454 3e6c 6962 6170 6163 6865 2d6d 6f64 TT>libapache-mod - 0x0b90: 2d2a 3c2f 5454 3e2e 0a49 6620 796f 7520 -*..If.you. - 0x0ba0: 6e65 6564 2074 6f20 636f 6d70 696c 6520 need.to.compile. - 0x0bb0: 6120 6d6f 6475 6c65 2079 6f75 7273 656c a.module.yoursel - 0x0bc0: 662c 2079 6f75 2077 696c 6c20 6e65 6564 f,.you.will.need - 0x0bd0: 2074 6f20 696e 7374 616c 6c20 7468 650a .to.install.the. - 0x0be0: 3c54 543e 6170 6163 6865 2d64 6576 3c2f apache-dev.package...

More.documentat - 0x0c10: 696f 6e20 6f6e 2041 7061 6368 6520 6361 ion.on.Apache.ca - 0x0c20: 6e20 6265 2066 6f75 6e64 206f 6e3a 0a3c n.be.found.on:.< - 0x0c30: 554c 3e0a 3c4c 493e 0a54 6865 203c 4120 UL>.

  • .The.A - 0x0c60: 7061 6368 6520 646f 6375 6d65 6e74 6174 pache.documentat - 0x0c70: 696f 6e3c 2f41 3e20 7374 6f72 6564 206f ion.stored.o - 0x0c80: 6e20 796f 7572 2073 6572 7665 722e 3c2f n.your.server...
  • .The.A - 0x0cc0: 7061 6368 6520 5072 6f6a 6563 743c 2f41 pache.Project.home.site.
  • ..
  • .The.Apache-SSL. - 0x0d20: 686f 6d65 2073 6974 652e 3c2f 4c49 3e0a home.site.
  • . - 0x0d30: 0a3c 4c49 3e0a 5468 6520 3c41 2048 5245 .
  • .The.mod. - 0x0d60: 7065 726c 3c2f 413e 2068 6f6d 6520 7369 perl.home.si - 0x0d70: 7465 2e3c 2f4c 493e 0a0a 3c4c 493e 0a54 te.
  • ..
  • .T - 0x0d80: 6865 203c 4120 4852 4546 3d22 6874 7470 he.ApacheWe - 0x0db0: 656b 3c2f 413e 206e 6577 736c 6574 7465 ek.newslette - 0x0dc0: 722e 3c2f 4c49 3e0a 0a3c 4c49 3e0a 5468 r.
  • ..
  • .Th - 0x0dd0: 6520 3c41 2048 5245 463d 2268 7474 703a e.Debian.Pr - 0x0e00: 6f6a 6563 740a 446f 6375 6d65 6e74 6174 oject.Documentat - 0x0e10: 696f 6e3c 2f41 3e20 7768 6963 6820 636f ion.which.co - 0x0e20: 6e74 6169 6e73 2048 4f57 544f 732c 2046 ntains.HOWTOs,.F - 0x0e30: 4151 732c 2061 6e64 2073 6f66 7477 6172 AQs,.and.softwar - 0x0e40: 6520 7570 6461 7465 732e 3c2f 4c49 3e0a e.updates.
  • . - 0x0e50: 3c2f 554c 3e0a 0a3c 503e 596f 7520 6361 ..

    You.ca - 0x0e60: 6e20 616c 736f 2063 6f6e 7375 6c74 2074 n.also.consult.t - 0x0e70: 6865 206c 6973 7420 6f66 203c 4120 4852 he.list.of.World.Wide.Web. - 0x0eb0: 4672 6571 7565 6e74 6c79 2041 736b 6564 Frequently.Asked - 0x0ec0: 2051 7565 7374 696f 6e73 3c2f 413e 2066 .Questions.f - 0x0ed0: 6f72 2069 6e66 6f72 6d61 7469 6f6e 2e0a or.information.. - 0x0ee0: 0a3c 4832 3e4c 6574 206f 7468 6572 2070 .

    Let.other.p - 0x0ef0: 656f 706c 6520 6b6e 6f77 2061 626f 7574 eople.know.about - 0x0f00: 2074 6869 7320 7365 7276 6572 3c2f 4832 .this.server

    ..Netcraft.p - 0x0f40: 726f 7669 6465 7320 616e 2069 6e74 6572 rovides.an.inter - 0x0f50: 6573 7469 6e67 2066 7265 650a 7365 7276 esting.free.serv - 0x0f60: 6963 6520 666f 7220 7765 6220 7369 7465 ice.for.web.site - 0x0f70: 206d 6f6e 6974 6f72 696e 6720 616e 6420 .monitoring.and. - 0x0f80: 7374 6174 6973 7469 6320 636f 6c6c 6563 statistic.collec - 0x0f90: 7469 6f6e 2e0a 596f 7520 6361 6e20 6c65 tion..You.can.le - 0x0fa0: 7420 7468 656d 206b 6e6f 7720 6162 6f75 t.them.know.abou - 0x0fb0: 7420 796f 7572 2073 6572 7665 7220 7573 t.your.server.us - 0x0fc0: 696e 6720 7468 6569 720a 3c41 2048 5245 ing.their. - 0x0ff0: 696e 7465 7266 6163 653c 2f41 3e2e 0a45 interface..E - 0x1000: 6e61 626c 696e 6720 7468 6520 6d6f 6e69 nabling.the.moni - 0x1010: 746f 7269 6e67 206f 6620 796f 7572 2073 toring.of.your.s - 0x1020: 6572 7665 7220 7769 6c6c 2070 726f 7669 erver.will.provi - 0x1030: 6465 2061 2062 6574 7465 7220 676c 6f62 de.a.better.glob - 0x1040: 616c 206f 7665 7276 6965 770a 6f66 2077 al.overview.of.w - 0x1050: 686f 2069 7320 7573 696e 6720 7768 6174 ho.is.using.what - 0x1060: 2061 6e64 2077 6865 7265 2c20 616e 6420 .and.where,.and. - 0x1070: 6974 2077 6f75 6c64 2067 6976 6520 4465 it.would.give.De - 0x1080: 6269 616e 2061 2062 6574 7465 720a 6f76 bian.a.better.ov - 0x1090: 6572 7669 6577 206f 6620 7468 6520 6170 erview.of.the.ap - 0x10a0: 6163 6865 2070 6163 6b61 6765 2075 7361 ache.package.usa - 0x10b0: 6765 2e0a 0a3c 4832 3e41 626f 7574 2074 ge...

    About.t - 0x10c0: 6869 7320 7061 6765 3c2f 4832 3e0a 0a3c his.page

    ..< - 0x10d0: 494d 4720 414c 4947 4e3d 2272 6967 6874 IMG.ALIGN="right - 0x10e0: 2220 414c 543d 2222 2048 4549 4748 543d ".ALT="".HEIGHT= - 0x10f0: 2232 3437 2220 5749 4454 483d 2232 3738 "247".WIDTH="278 - 0x1100: 2220 5352 433d 2269 636f 6e73 2f6a 6865 ".SRC="icons/jhe - 0x1110: 3036 312e 706e 6722 3e0a 0a3c 503e 5468 061.png">..

    Th - 0x1120: 6973 2069 7320 6120 706c 6163 6568 6f6c is.is.a.placehol - 0x1130: 6465 7220 7061 6765 2069 6e73 7461 6c6c der.page.install - 0x1140: 6564 2062 7920 7468 6520 3c41 0a48 5245 ed.by.the.Debia - 0x1170: 6e3c 2f41 3e0a 7265 6c65 6173 6520 6f66 n.release.of - 0x1180: 2074 6865 2061 7061 6368 6520 5765 6220 .the.apache.Web. - 0x1190: 7365 7276 6572 2070 6163 6b61 6765 2e0a server.package.. - 0x11a0: 0a3c 503e 5468 6973 2063 6f6d 7075 7465 .

    This.compute - 0x11b0: 7220 6861 7320 696e 7374 616c 6c65 6420 r.has.installed. - 0x11c0: 7468 6520 4465 6269 616e 2047 4e55 2f4c the.Debian.GNU/L - 0x11d0: 696e 7578 206f 7065 7261 7469 6e67 2073 inux.operating.s - 0x11e0: 7973 7465 6d2c 0a62 7574 2069 7420 6861 ystem,.but.it.ha - 0x11f0: 7320 3c73 7472 6f6e 673e 6e6f 7468 696e s.nothin - 0x1200: 6720 746f 2064 6f20 7769 7468 2074 6865 g.to.do.with.the - 0x1210: 2044 6562 6961 6e0a 5072 6f6a 6563 743c .Debian.Project< - 0x1220: 2f73 7472 6f6e 673e 2e20 506c 6561 7365 /strong>..Please - 0x1230: 2064 6f20 3c73 7472 6f6e 673e 6e6f 743c .do.not< - 0x1240: 2f73 7472 6f6e 673e 2063 6f6e 7461 6374 /strong>.contact - 0x1250: 2074 6865 2044 6562 6961 6e0a 5072 6f6a .the.Debian.Proj - 0x1260: 6563 7420 6162 6f75 7420 6974 2e3c 2f50 ect.about.it.

    ..

    If.you.fin - 0x1280: 6420 6120 6275 6720 696e 2074 6869 7320 d.a.bug.in.this. - 0x1290: 6170 6163 6865 2070 6163 6b61 6765 2c20 apache.package,. - 0x12a0: 6f72 2069 6e20 4170 6163 6865 2069 7473 or.in.Apache.its - 0x12b0: 656c 662c 0a70 6c65 6173 6520 6669 6c65 elf,.please.file - 0x12c0: 2061 2062 7567 2072 6570 6f72 7420 6f6e .a.bug.report.on - 0x12d0: 2069 742e 2020 496e 7374 7275 6374 696f .it...Instructio - 0x12e0: 6e73 206f 6e20 646f 696e 6720 7468 6973 ns.on.doing.this - 0x12f0: 2c20 616e 6420 7468 650a 6c69 7374 206f ,.and.the.list.o - 0x1300: 6620 3c41 2048 5245 463d 2268 7474 703a f.kn - 0x1330: 6f77 6e20 6275 6773 3c2f 413e 206f 6620 own.bugs.of. - 0x1340: 7468 6973 0a70 6163 6b61 6765 2c20 6361 this.package,.ca - 0x1350: 6e20 6265 2066 6f75 6e64 2069 6e20 7468 n.be.found.in.th - 0x1360: 6520 0a3c 4120 4852 4546 3d22 6874 7470 e..Debian.Bug.Tra - 0x13a0: 636b 696e 6720 5379 7374 656d 3c2f 413e cking.System - 0x13b0: 2e0a 0a3c 503e 5468 616e 6b73 2066 6f72 ...

    Thanks.for - 0x13c0: 2075 7369 6e67 2074 6869 7320 7061 636b .using.this.pack - 0x13d0: 6167 652c 2061 6e64 2063 6f6e 6772 6174 age,.and.congrat - 0x13e0: 756c 6174 696f 6e73 2066 6f72 2079 6f75 ulations.for.you - 0x13f0: 7220 6368 6f69 6365 206f 660a 6120 4465 r.choice.of.a.De - 0x1400: 6269 616e 2073 7973 7465 6d21 3c2f 503e bian.system!

    - 0x1410: 0a0a 3c44 4956 2061 6c69 676e 3d22 6365 ........ - 0x1520: 3c2f 613e 0a3c 2f44 4956 3e0a 0a3c 212d ..... - 0x15f0: 0a3c 2f48 544d 4c3e 0a .. -22:57:35.941260 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5560, win 12383, options [nop,nop,TS val 1306300953 ecr 1306300953], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. - 0x0010: 0034 1b6e 4000 4006 2154 7f00 0001 7f00 .4.n@.@.!T...... - 0x0020: 0001 da70 0050 3758 8a49 377a a3a9 8010 ...p.P7X.I7z.... - 0x0030: 305f 10ea 0000 0101 080a 4ddc 9219 4ddc 0_........M...M. - 0x0040: 9219 .. -22:57:37.229575 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [F.], seq 203, ack 5560, win 12383, options [nop,nop,TS val 1306302241 ecr 1306300953], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. - 0x0010: 0034 1b70 4000 4006 2152 7f00 0001 7f00 .4.p@.@.!R...... - 0x0020: 0001 da70 0050 3758 8a49 377a a3a9 8011 ...p.P7X.I7z.... - 0x0030: 305f 0be1 0000 0101 080a 4ddc 9721 4ddc 0_........M..!M. - 0x0040: 9219 .. -22:57:37.230839 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [F.], seq 5560, ack 204, win 8192, options [nop,nop,TS val 1306302243 ecr 1306302241], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. - 0x0010: 0034 1fe8 4000 4006 1cda 7f00 0001 7f00 .4..@.@......... - 0x0020: 0001 0050 da70 377a a3a9 3758 8a4a 8011 ...P.p7z..7X.J.. - 0x0030: 2000 1735 0000 0101 080a 4ddc 9723 4ddc ...5......M..#M. - 0x0040: 9721 .! -22:57:37.230900 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5561, win 12383, options [nop,nop,TS val 1306302243 ecr 1306302243], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. - 0x0010: 0034 1b72 4000 4006 2150 7f00 0001 7f00 .4.r@.@.!P...... - 0x0020: 0001 da70 0050 3758 8a4a 377a a3aa 8010 ...p.P7X.J7z.... - 0x0030: 305f 06d4 0000 0101 080a 4ddc 9723 4ddc 0_........M..#M. - 0x0040: 9723 .# diff --git a/contrib/tcpdump/tests/print-flags.puu b/contrib/tcpdump/tests/print-flags.puu deleted file mode 100644 index bcd8b992683..00000000000 --- a/contrib/tcpdump/tests/print-flags.puu +++ /dev/null @@ -1,151 +0,0 @@ -begin 644 print-flags.pcap -MU,.RH0(`!````````````/__```!````KU;+0E)0#@!*````2@`````````` -M``````````@`10``/!MH0`!`!B%2?P```7\```':<`!0-UB)?@````"@`G__ -M%"$```($0`P$`@@*3=R2%@`````!`P,"KU;+0HI0#@!*````2@`````````` -M``````````@`10``/```0`!`!CRZ?P```7\```$`4-IP-WJ-\3=8B7^@$G__ -M;K$```($0`P$`@@*3=R2%DWHWR@!@@`/[R```!`0@* -M3=R2%TW?P```7\```$`4-IP-WJ-\C=8 -MBDF`$"``-P,```$!"`I-W)(83=R2%Z]6RT*P7`X`^14``/D5```````````` -M```````(`$4`%>L?YD``0`8')7\```%_```!`%#:<#=ZC?(W6(I)@!@@`!/@ -M```!`0@*3=R2&4W71E#TQ,#`-"D-O;FYE8W1I;VXZ($ME97`M06QI=F4-"D-O -M;G1E;G0M5'EP93H@=&5X="]H=&UL.R!C:&%R7!E(B!#3TY414Y4/2)T97AT+VAT;6P[(&-H -M87)S970]:7-O+3@X-3DM,2(^"B`@(#Q-151!($Y!344](D1E2!W96(@<&%G97,@ -M>65T+@I0;&5A6EN9R!T;R!L -M;V-A=&4@=&AE(&%D;6EN:7-T6]U(&%R92!T:&4@861M:6YI2!E9&ET:6YG"CQ4 -M5#XO971C+VQO9W)O=&%T92YD+V%P86-H93PO5%0^+CPO3$D^"@H\3$D^"E1H -M92!D969A=6QT(&1I2!I;F1E>"!I6]U2!O9B!T:&4@=7-E6]U('=A;G0@96YA8FQE9"X@($UA;GD@;W1H97(@;6]D=6QE6]U6]U2!T:&4@/$$*2%)%1CTB:'1T<#HO+W=W=RYD96)I86XN;W)G+R(^1&5B -M:6%N/"]!/@IR96QE87-E(&]F('1H92!A<&%C:&4@5V5B('-E7-T96TL"F)U="!I="!H87,@/'-T -M6]U -M(&9I;F0@82!B=6<@:6X@=&AI6]U2!*;VAN:64@26YG2!-871T:&5W(%=I;&-O>"!A;F0@ -M2F]S:7`@4F]D:6XN"B`@3&%S="!M;V1I9FEE9#H@)$1A=&4Z(#(P,#0O,#8O -M,C`@,34Z,S,Z-3<@)"X*("`M+3X*"CPO0D]$63X*/"](5$U,/@JO5LM"S%P. -M`$(```!"````````````````````"`!%```T&VY``$`&(51_```!?P```=IP -M`%`W6(I)-WJCJ8`0,%\0Z@```0$("DW``P!"````0@`` -M``````````````````@`10``-!MP0`!`!B%2?P```7\```':<`!0-UB*23=Z -MHZF`$3!?"^$```$!"`I-W)DIFF/print-$i.out.diff ) - then - echo print-$i passed. - else - echo print-$i failed. - fi -done diff --git a/contrib/tcpdump/tests/print-x.out b/contrib/tcpdump/tests/print-x.out deleted file mode 100644 index 779422305d4..00000000000 --- a/contrib/tcpdump/tests/print-x.out +++ /dev/null @@ -1,409 +0,0 @@ -22:57:35.938066 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [S], seq 928549246, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 0,nop,wscale 2], length 0 - 0x0000: 4500 003c 1b68 4000 4006 2152 7f00 0001 - 0x0010: 7f00 0001 da70 0050 3758 897e 0000 0000 - 0x0020: a002 7fff 1421 0000 0204 400c 0402 080a - 0x0030: 4ddc 9216 0000 0000 0103 0302 -22:57:35.938122 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [S.], seq 930778609, ack 928549247, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 1306300950,nop,wscale 2], length 0 - 0x0000: 4500 003c 0000 4000 4006 3cba 7f00 0001 - 0x0010: 7f00 0001 0050 da70 377a 8df1 3758 897f - 0x0020: a012 7fff 6eb1 0000 0204 400c 0402 080a - 0x0030: 4ddc 9216 4ddc 9216 0103 0302 -22:57:35.938167 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 1, win 8192, options [nop,nop,TS val 1306300950 ecr 1306300950], length 0 - 0x0000: 4500 0034 1b6a 4000 4006 2158 7f00 0001 - 0x0010: 7f00 0001 da70 0050 3758 897f 377a 8df2 - 0x0020: 8010 2000 37d0 0000 0101 080a 4ddc 9216 - 0x0030: 4ddc 9216 -22:57:35.939423 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [P.], seq 1:203, ack 1, win 8192, options [nop,nop,TS val 1306300951 ecr 1306300950], length 202 - 0x0000: 4500 00fe 1b6c 4000 4006 208c 7f00 0001 - 0x0010: 7f00 0001 da70 0050 3758 897f 377a 8df2 - 0x0020: 8018 2000 fef2 0000 0101 080a 4ddc 9217 - 0x0030: 4ddc 9216 4745 5420 2f20 4854 5450 2f31 - 0x0040: 2e31 0d0a 486f 7374 3a20 6c6f 6361 6c68 - 0x0050: 6f73 740d 0a55 7365 722d 4167 656e 743a - 0x0060: 2045 4c69 6e6b 732f 302e 3130 2e34 2d37 - 0x0070: 2d64 6562 6961 6e20 2874 6578 746d 6f64 - 0x0080: 653b 204c 696e 7578 2032 2e36 2e31 312d - 0x0090: 312d 3638 362d 736d 7020 6936 3836 3b20 - 0x00a0: 3133 3278 3536 2d32 290d 0a41 6363 6570 - 0x00b0: 743a 202a 2f2a 0d0a 4163 6365 7074 2d45 - 0x00c0: 6e63 6f64 696e 673a 2067 7a69 700d 0a41 - 0x00d0: 6363 6570 742d 4c61 6e67 7561 6765 3a20 - 0x00e0: 656e 0d0a 436f 6e6e 6563 7469 6f6e 3a20 - 0x00f0: 4b65 6570 2d41 6c69 7665 0d0a 0d0a -22:57:35.940474 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [.], ack 203, win 8192, options [nop,nop,TS val 1306300952 ecr 1306300951], length 0 - 0x0000: 4500 0034 1fe4 4000 4006 1cde 7f00 0001 - 0x0010: 7f00 0001 0050 da70 377a 8df2 3758 8a49 - 0x0020: 8010 2000 3703 0000 0101 080a 4ddc 9218 - 0x0030: 4ddc 9217 -22:57:35.941232 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [P.], seq 1:5560, ack 203, win 8192, options [nop,nop,TS val 1306300953 ecr 1306300951], length 5559 - 0x0000: 4500 15eb 1fe6 4000 4006 0725 7f00 0001 - 0x0010: 7f00 0001 0050 da70 377a 8df2 3758 8a49 - 0x0020: 8018 2000 13e0 0000 0101 080a 4ddc 9219 - 0x0030: 4ddc 9217 4854 5450 2f31 2e31 2032 3030 - 0x0040: 204f 4b0d 0a44 6174 653a 2057 6564 2c20 - 0x0050: 3036 204a 756c 2032 3030 3520 3033 3a35 - 0x0060: 373a 3335 2047 4d54 0d0a 5365 7276 6572 - 0x0070: 3a20 4170 6163 6865 2f31 2e33 2e33 330d - 0x0080: 0a4c 6173 742d 4d6f 6469 6669 6564 3a20 - 0x0090: 5375 6e2c 2031 3520 4175 6720 3230 3034 - 0x00a0: 2030 303a 3433 3a34 3120 474d 540d 0a45 - 0x00b0: 5461 673a 2022 3665 3830 6630 2d31 3438 - 0x00c0: 612d 3431 3165 6231 6264 220d 0a41 6363 - 0x00d0: 6570 742d 5261 6e67 6573 3a20 6279 7465 - 0x00e0: 730d 0a43 6f6e 7465 6e74 2d4c 656e 6774 - 0x00f0: 683a 2035 3235 380d 0a4b 6565 702d 416c - 0x0100: 6976 653a 2074 696d 656f 7574 3d31 352c - 0x0110: 206d 6178 3d31 3030 0d0a 436f 6e6e 6563 - 0x0120: 7469 6f6e 3a20 4b65 6570 2d41 6c69 7665 - 0x0130: 0d0a 436f 6e74 656e 742d 5479 7065 3a20 - 0x0140: 7465 7874 2f68 746d 6c3b 2063 6861 7273 - 0x0150: 6574 3d69 736f 2d38 3835 392d 310d 0a0d - 0x0160: 0a3c 2144 4f43 5459 5045 2048 544d 4c20 - 0x0170: 5055 424c 4943 2022 2d2f 2f57 3343 2f2f - 0x0180: 4454 4420 4854 4d4c 2034 2e30 3120 5472 - 0x0190: 616e 7369 7469 6f6e 616c 2f2f 454e 223e - 0x01a0: 0a3c 4854 4d4c 3e0a 3c48 4541 443e 0a20 - 0x01b0: 2020 3c4d 4554 4120 4854 5450 2d45 5155 - 0x01c0: 4956 3d22 436f 6e74 656e 742d 5479 7065 - 0x01d0: 2220 434f 4e54 454e 543d 2274 6578 742f - 0x01e0: 6874 6d6c 3b20 6368 6172 7365 743d 6973 - 0x01f0: 6f2d 3838 3539 2d31 223e 0a20 2020 3c4d - 0x0200: 4554 4120 4e41 4d45 3d22 4465 7363 7269 - 0x0210: 7074 696f 6e22 2043 4f4e 5445 4e54 3d22 - 0x0220: 5468 6520 696e 6974 6961 6c20 696e 7374 - 0x0230: 616c 6c61 7469 6f6e 206f 6620 4465 6269 - 0x0240: 616e 2061 7061 6368 652e 223e 0a20 2020 - 0x0250: 3c54 4954 4c45 3e50 6c61 6365 686f 6c64 - 0x0260: 6572 2070 6167 653c 2f54 4954 4c45 3e0a - 0x0270: 3c2f 4845 4144 3e0a 3c42 4f44 5920 5445 - 0x0280: 5854 3d22 2330 3030 3030 3022 2042 4743 - 0x0290: 4f4c 4f52 3d22 2346 4646 4646 4622 204c - 0x02a0: 494e 4b3d 2223 3030 3030 4546 2220 564c - 0x02b0: 494e 4b3d 2223 3535 3138 3841 2220 414c - 0x02c0: 494e 4b3d 2223 4646 3030 3030 223e 0a0a - 0x02d0: 3c48 313e 506c 6163 6568 6f6c 6465 7220 - 0x02e0: 7061 6765 3c2f 4831 3e0a 3c48 323e 4966 - 0x02f0: 2079 6f75 2061 7265 206a 7573 7420 6272 - 0x0300: 6f77 7369 6e67 2074 6865 2077 6562 3c2f - 0x0310: 6832 3e0a 0a3c 503e 5468 6520 6f77 6e65 - 0x0320: 7220 6f66 2074 6869 7320 7765 6220 7369 - 0x0330: 7465 2068 6173 206e 6f74 2070 7574 2075 - 0x0340: 7020 616e 7920 7765 6220 7061 6765 7320 - 0x0350: 7965 742e 0a50 6c65 6173 6520 636f 6d65 - 0x0360: 2062 6163 6b20 6c61 7465 722e 3c2f 503e - 0x0370: 0a0a 3c50 3e3c 534d 414c 4c3e 3c43 4954 - 0x0380: 453e 4d6f 7665 2061 6c6f 6e67 2c20 6e6f - 0x0390: 7468 696e 6720 746f 2073 6565 2068 6572 - 0x03a0: 652e 2e2e 3c2f 4349 5445 3e20 3a2d 293c - 0x03b0: 2f53 4d41 4c4c 3e3c 2f50 3e0a 0a3c 4832 - 0x03c0: 3e49 6620 796f 7520 6172 6520 7472 7969 - 0x03d0: 6e67 2074 6f20 6c6f 6361 7465 2074 6865 - 0x03e0: 2061 646d 696e 6973 7472 6174 6f72 206f - 0x03f0: 6620 7468 6973 206d 6163 6869 6e65 3c2f - 0x0400: 4832 3e0a 0a3c 503e 4966 2079 6f75 2077 - 0x0410: 616e 7420 746f 2072 6570 6f72 7420 736f - 0x0420: 6d65 7468 696e 6720 6162 6f75 7420 7468 - 0x0430: 6973 2068 6f73 7427 7320 6265 6861 7669 - 0x0440: 6f72 2c20 706c 6561 7365 0a63 6f6e 7461 - 0x0450: 6374 2074 6865 2049 6e74 6572 6e65 7420 - 0x0460: 5365 7276 6963 6520 5072 6f76 6964 6572 - 0x0470: 2028 4953 5029 2069 6e76 6f6c 7665 6420 - 0x0480: 6469 7265 6374 6c79 2e3c 2f50 3e0a 0a3c - 0x0490: 503e 5365 6520 7468 6520 3c41 2068 7265 - 0x04a0: 663d 2268 7474 703a 2f2f 7777 772e 6162 - 0x04b0: 7573 652e 6e65 742f 223e 4e65 7477 6f72 - 0x04c0: 6b20 4162 7573 650a 436c 6561 7269 6e67 - 0x04d0: 686f 7573 653c 2f41 3e20 666f 7220 686f - 0x04e0: 7720 746f 2064 6f20 7468 6973 2e3c 2f50 - 0x04f0: 3e0a 0a3c 4832 3e49 6620 796f 7520 6172 - 0x0500: 6520 7468 6520 6164 6d69 6e69 7374 7261 - 0x0510: 746f 7220 6f66 2074 6869 7320 6d61 6368 - 0x0520: 696e 653c 2f48 323e 0a0a 3c50 3e54 6865 - 0x0530: 2069 6e69 7469 616c 2069 6e73 7461 6c6c - 0x0540: 6174 696f 6e20 6f66 203c 4120 6872 6566 - 0x0550: 3d22 6874 7470 3a2f 2f77 7777 2e64 6562 - 0x0560: 6961 6e2e 6f72 672f 223e 4465 6269 616e - 0x0570: 2773 0a61 7061 6368 653c 2f41 3e20 7765 - 0x0580: 6220 7365 7276 6572 2070 6163 6b61 6765 - 0x0590: 2077 6173 2073 7563 6365 7373 6675 6c2e - 0x05a0: 3c2f 503e 0a0a 3c50 3e3c 5354 524f 4e47 - 0x05b0: 3e59 6f75 2073 686f 756c 6420 7265 706c - 0x05c0: 6163 6520 7468 6973 2070 6167 6520 7769 - 0x05d0: 7468 2079 6f75 7220 6f77 6e20 7765 6220 - 0x05e0: 7061 6765 7320 6173 0a73 6f6f 6e20 6173 - 0x05f0: 2070 6f73 7369 626c 652e 3c2f 5354 524f - 0x0600: 4e47 3e3c 2f50 3e0a 0a3c 503e 556e 6c65 - 0x0610: 7373 2079 6f75 2063 6861 6e67 6564 2069 - 0x0620: 7473 2063 6f6e 6669 6775 7261 7469 6f6e - 0x0630: 2c20 796f 7572 206e 6577 2073 6572 7665 - 0x0640: 7220 6973 2063 6f6e 6669 6775 7265 6420 - 0x0650: 6173 2066 6f6c 6c6f 7773 3a0a 3c55 4c3e - 0x0660: 0a3c 4c49 3e0a 436f 6e66 6967 7572 6174 - 0x0670: 696f 6e20 6669 6c65 7320 6361 6e20 6265 - 0x0680: 2066 6f75 6e64 2069 6e20 3c54 543e 2f65 - 0x0690: 7463 2f61 7061 6368 653c 2f54 543e 2e3c - 0x06a0: 2f4c 493e 0a0a 3c4c 493e 0a54 6865 203c - 0x06b0: 5454 3e44 6f63 756d 656e 7452 6f6f 743c - 0x06c0: 2f54 543e 2c20 7768 6963 6820 6973 2074 - 0x06d0: 6865 2064 6972 6563 746f 7279 2075 6e64 - 0x06e0: 6572 2077 6869 6368 2061 6c6c 2079 6f75 - 0x06f0: 720a 4854 4d4c 2066 696c 6573 2073 686f - 0x0700: 756c 6420 6578 6973 742c 2069 7320 7365 - 0x0710: 7420 746f 203c 5454 3e2f 7661 722f 7777 - 0x0720: 773c 2f54 543e 2e3c 2f4c 493e 0a0a 3c4c - 0x0730: 493e 0a43 4749 2073 6372 6970 7473 2061 - 0x0740: 7265 206c 6f6f 6b65 6420 666f 7220 696e - 0x0750: 203c 5454 3e2f 7573 722f 6c69 622f 6367 - 0x0760: 692d 6269 6e3c 2f54 543e 2c20 7768 6963 - 0x0770: 6820 6973 2077 6865 7265 0a44 6562 6961 - 0x0780: 6e20 7061 636b 6167 6573 2077 696c 6c20 - 0x0790: 706c 6163 6520 7468 6569 7220 7363 7269 - 0x07a0: 7074 732e 3c2f 4c49 3e0a 0a3c 4c49 3e0a - 0x07b0: 4c6f 6720 6669 6c65 7320 6172 6520 706c - 0x07c0: 6163 6564 2069 6e20 3c54 543e 2f76 6172 - 0x07d0: 2f6c 6f67 2f61 7061 6368 653c 2f54 543e - 0x07e0: 2c20 616e 6420 7769 6c6c 2062 6520 726f - 0x07f0: 7461 7465 640a 7765 656b 6c79 2e20 2054 - 0x0800: 6865 2066 7265 7175 656e 6379 206f 6620 - 0x0810: 726f 7461 7469 6f6e 2063 616e 2062 6520 - 0x0820: 6561 7369 6c79 2063 6861 6e67 6564 2062 - 0x0830: 7920 6564 6974 696e 670a 3c54 543e 2f65 - 0x0840: 7463 2f6c 6f67 726f 7461 7465 2e64 2f61 - 0x0850: 7061 6368 653c 2f54 543e 2e3c 2f4c 493e - 0x0860: 0a0a 3c4c 493e 0a54 6865 2064 6566 6175 - 0x0870: 6c74 2064 6972 6563 746f 7279 2069 6e64 - 0x0880: 6578 2069 7320 3c54 543e 696e 6465 782e - 0x0890: 6874 6d6c 3c2f 5454 3e2c 206d 6561 6e69 - 0x08a0: 6e67 2074 6861 7420 7265 7175 6573 7473 - 0x08b0: 0a66 6f72 2061 2064 6972 6563 746f 7279 - 0x08c0: 203c 5454 3e2f 666f 6f2f 6261 722f 3c2f - 0x08d0: 5454 3e20 7769 6c6c 2067 6976 6520 7468 - 0x08e0: 6520 636f 6e74 656e 7473 206f 6620 7468 - 0x08f0: 6520 6669 6c65 203c 5454 3e2f 7661 722f - 0x0900: 7777 772f 666f 6f2f 6261 722f 696e 6465 - 0x0910: 782e 6874 6d6c 3c2f 5454 3e0a 6966 2069 - 0x0920: 7420 6578 6973 7473 2028 6173 7375 6d69 - 0x0930: 6e67 2074 6861 7420 3c54 543e 2f76 6172 - 0x0940: 2f77 7777 3c2f 5454 3e20 6973 2079 6f75 - 0x0950: 7220 3c54 543e 446f 6375 6d65 6e74 526f - 0x0960: 6f74 3c2f 5454 3e29 2e3c 2f4c 493e 0a0a - 0x0970: 3c4c 493e 0a55 7365 7220 6469 7265 6374 - 0x0980: 6f72 6965 7320 6172 6520 656e 6162 6c65 - 0x0990: 642c 2061 6e64 2075 7365 7220 646f 6375 - 0x09a0: 6d65 6e74 7320 7769 6c6c 2062 6520 6c6f - 0x09b0: 6f6b 6564 2066 6f72 0a69 6e20 7468 6520 - 0x09c0: 3c54 543e 7075 626c 6963 5f68 746d 6c3c - 0x09d0: 2f54 543e 2064 6972 6563 746f 7279 206f - 0x09e0: 6620 7468 6520 7573 6572 7327 2068 6f6d - 0x09f0: 6573 2e20 2054 6865 7365 2064 6972 730a - 0x0a00: 7368 6f75 6c64 2062 6520 756e 6465 7220 - 0x0a10: 3c54 543e 2f68 6f6d 653c 2f54 543e 2c20 - 0x0a20: 616e 6420 7573 6572 7320 7769 6c6c 206e - 0x0a30: 6f74 2062 6520 6162 6c65 2074 6f20 7379 - 0x0a40: 6d6c 696e 6b0a 746f 2066 696c 6573 2074 - 0x0a50: 6865 7920 646f 6e27 7420 6f77 6e2e 3c2f - 0x0a60: 4c49 3e0a 0a3c 2f55 4c3e 0a41 6c6c 2074 - 0x0a70: 6865 2073 7461 6e64 6172 6420 6170 6163 - 0x0a80: 6865 206d 6f64 756c 6573 2061 7265 2061 - 0x0a90: 7661 696c 6162 6c65 2077 6974 6820 7468 - 0x0aa0: 6973 2072 656c 6561 7365 2061 6e64 2061 - 0x0ab0: 7265 0a6e 6f77 206d 616e 6167 6564 2077 - 0x0ac0: 6974 6820 6465 6263 6f6e 662e 2020 5479 - 0x0ad0: 7065 203c 5454 3e64 706b 672d 7265 636f - 0x0ae0: 6e66 6967 7572 6520 6170 6163 6865 3c2f - 0x0af0: 5454 3e20 746f 0a73 656c 6563 7420 7768 - 0x0b00: 6963 6820 6d6f 6475 6c65 7320 796f 7520 - 0x0b10: 7761 6e74 2065 6e61 626c 6564 2e20 204d - 0x0b20: 616e 7920 6f74 6865 7220 6d6f 6475 6c65 - 0x0b30: 7320 6172 6520 6176 6169 6c61 626c 650a - 0x0b40: 7468 726f 7567 6820 7468 6520 4465 6269 - 0x0b50: 616e 2070 6163 6b61 6765 2073 7973 7465 - 0x0b60: 6d20 7769 7468 2074 6865 206e 616d 6573 - 0x0b70: 203c 5454 3e6c 6962 6170 6163 6865 2d6d - 0x0b80: 6f64 2d2a 3c2f 5454 3e2e 0a49 6620 796f - 0x0b90: 7520 6e65 6564 2074 6f20 636f 6d70 696c - 0x0ba0: 6520 6120 6d6f 6475 6c65 2079 6f75 7273 - 0x0bb0: 656c 662c 2079 6f75 2077 696c 6c20 6e65 - 0x0bc0: 6564 2074 6f20 696e 7374 616c 6c20 7468 - 0x0bd0: 650a 3c54 543e 6170 6163 6865 2d64 6576 - 0x0be0: 3c2f 5454 3e20 7061 636b 6167 652e 0a0a - 0x0bf0: 3c50 3e4d 6f72 6520 646f 6375 6d65 6e74 - 0x0c00: 6174 696f 6e20 6f6e 2041 7061 6368 6520 - 0x0c10: 6361 6e20 6265 2066 6f75 6e64 206f 6e3a - 0x0c20: 0a3c 554c 3e0a 3c4c 493e 0a54 6865 203c - 0x0c30: 4120 4852 4546 3d22 2f64 6f63 2f61 7061 - 0x0c40: 6368 652d 646f 632f 6d61 6e75 616c 2f22 - 0x0c50: 3e41 7061 6368 6520 646f 6375 6d65 6e74 - 0x0c60: 6174 696f 6e3c 2f41 3e20 7374 6f72 6564 - 0x0c70: 206f 6e20 796f 7572 2073 6572 7665 722e - 0x0c80: 3c2f 4c49 3e0a 0a3c 4c49 3e0a 5468 6520 - 0x0c90: 3c41 2048 5245 463d 2268 7474 703a 2f2f - 0x0ca0: 7777 772e 6170 6163 6865 2e6f 7267 2f22 - 0x0cb0: 3e41 7061 6368 6520 5072 6f6a 6563 743c - 0x0cc0: 2f41 3e20 686f 6d65 2073 6974 652e 3c2f - 0x0cd0: 4c49 3e0a 0a3c 4c49 3e0a 5468 6520 3c41 - 0x0ce0: 2048 5245 463d 2268 7474 703a 2f2f 7777 - 0x0cf0: 772e 6170 6163 6865 2d73 736c 2e6f 7267 - 0x0d00: 2f22 3e41 7061 6368 652d 5353 4c3c 2f41 - 0x0d10: 3e20 686f 6d65 2073 6974 652e 3c2f 4c49 - 0x0d20: 3e0a 0a3c 4c49 3e0a 5468 6520 3c41 2048 - 0x0d30: 5245 463d 2268 7474 703a 2f2f 7065 726c - 0x0d40: 2e61 7061 6368 652e 6f72 672f 223e 6d6f - 0x0d50: 6420 7065 726c 3c2f 413e 2068 6f6d 6520 - 0x0d60: 7369 7465 2e3c 2f4c 493e 0a0a 3c4c 493e - 0x0d70: 0a54 6865 203c 4120 4852 4546 3d22 6874 - 0x0d80: 7470 3a2f 2f77 7777 2e61 7061 6368 6577 - 0x0d90: 6565 6b2e 636f 6d2f 223e 4170 6163 6865 - 0x0da0: 5765 656b 3c2f 413e 206e 6577 736c 6574 - 0x0db0: 7465 722e 3c2f 4c49 3e0a 0a3c 4c49 3e0a - 0x0dc0: 5468 6520 3c41 2048 5245 463d 2268 7474 - 0x0dd0: 703a 2f2f 7777 772e 6465 6269 616e 2e6f - 0x0de0: 7267 2f64 6f63 2f22 3e44 6562 6961 6e20 - 0x0df0: 5072 6f6a 6563 740a 446f 6375 6d65 6e74 - 0x0e00: 6174 696f 6e3c 2f41 3e20 7768 6963 6820 - 0x0e10: 636f 6e74 6169 6e73 2048 4f57 544f 732c - 0x0e20: 2046 4151 732c 2061 6e64 2073 6f66 7477 - 0x0e30: 6172 6520 7570 6461 7465 732e 3c2f 4c49 - 0x0e40: 3e0a 3c2f 554c 3e0a 0a3c 503e 596f 7520 - 0x0e50: 6361 6e20 616c 736f 2063 6f6e 7375 6c74 - 0x0e60: 2074 6865 206c 6973 7420 6f66 203c 4120 - 0x0e70: 4852 4546 3d22 6874 7470 3a2f 2f77 7777 - 0x0e80: 2e62 6f75 7465 6c6c 2e63 6f6d 2f66 6171 - 0x0e90: 2f22 3e57 6f72 6c64 0a57 6964 6520 5765 - 0x0ea0: 6220 4672 6571 7565 6e74 6c79 2041 736b - 0x0eb0: 6564 2051 7565 7374 696f 6e73 3c2f 413e - 0x0ec0: 2066 6f72 2069 6e66 6f72 6d61 7469 6f6e - 0x0ed0: 2e0a 0a3c 4832 3e4c 6574 206f 7468 6572 - 0x0ee0: 2070 656f 706c 6520 6b6e 6f77 2061 626f - 0x0ef0: 7574 2074 6869 7320 7365 7276 6572 3c2f - 0x0f00: 4832 3e0a 0a3c 4120 4852 4546 3d22 6874 - 0x0f10: 7470 3a2f 2f6e 6574 6372 6166 742e 636f - 0x0f20: 6d2f 223e 4e65 7463 7261 6674 3c2f 413e - 0x0f30: 2070 726f 7669 6465 7320 616e 2069 6e74 - 0x0f40: 6572 6573 7469 6e67 2066 7265 650a 7365 - 0x0f50: 7276 6963 6520 666f 7220 7765 6220 7369 - 0x0f60: 7465 206d 6f6e 6974 6f72 696e 6720 616e - 0x0f70: 6420 7374 6174 6973 7469 6320 636f 6c6c - 0x0f80: 6563 7469 6f6e 2e0a 596f 7520 6361 6e20 - 0x0f90: 6c65 7420 7468 656d 206b 6e6f 7720 6162 - 0x0fa0: 6f75 7420 796f 7572 2073 6572 7665 7220 - 0x0fb0: 7573 696e 6720 7468 6569 720a 3c41 2048 - 0x0fc0: 5245 463d 2268 7474 703a 2f2f 7570 7469 - 0x0fd0: 6d65 2e6e 6574 6372 6166 742e 636f 6d2f - 0x0fe0: 223e 696e 7465 7266 6163 653c 2f41 3e2e - 0x0ff0: 0a45 6e61 626c 696e 6720 7468 6520 6d6f - 0x1000: 6e69 746f 7269 6e67 206f 6620 796f 7572 - 0x1010: 2073 6572 7665 7220 7769 6c6c 2070 726f - 0x1020: 7669 6465 2061 2062 6574 7465 7220 676c - 0x1030: 6f62 616c 206f 7665 7276 6965 770a 6f66 - 0x1040: 2077 686f 2069 7320 7573 696e 6720 7768 - 0x1050: 6174 2061 6e64 2077 6865 7265 2c20 616e - 0x1060: 6420 6974 2077 6f75 6c64 2067 6976 6520 - 0x1070: 4465 6269 616e 2061 2062 6574 7465 720a - 0x1080: 6f76 6572 7669 6577 206f 6620 7468 6520 - 0x1090: 6170 6163 6865 2070 6163 6b61 6765 2075 - 0x10a0: 7361 6765 2e0a 0a3c 4832 3e41 626f 7574 - 0x10b0: 2074 6869 7320 7061 6765 3c2f 4832 3e0a - 0x10c0: 0a3c 494d 4720 414c 4947 4e3d 2272 6967 - 0x10d0: 6874 2220 414c 543d 2222 2048 4549 4748 - 0x10e0: 543d 2232 3437 2220 5749 4454 483d 2232 - 0x10f0: 3738 2220 5352 433d 2269 636f 6e73 2f6a - 0x1100: 6865 3036 312e 706e 6722 3e0a 0a3c 503e - 0x1110: 5468 6973 2069 7320 6120 706c 6163 6568 - 0x1120: 6f6c 6465 7220 7061 6765 2069 6e73 7461 - 0x1130: 6c6c 6564 2062 7920 7468 6520 3c41 0a48 - 0x1140: 5245 463d 2268 7474 703a 2f2f 7777 772e - 0x1150: 6465 6269 616e 2e6f 7267 2f22 3e44 6562 - 0x1160: 6961 6e3c 2f41 3e0a 7265 6c65 6173 6520 - 0x1170: 6f66 2074 6865 2061 7061 6368 6520 5765 - 0x1180: 6220 7365 7276 6572 2070 6163 6b61 6765 - 0x1190: 2e0a 0a3c 503e 5468 6973 2063 6f6d 7075 - 0x11a0: 7465 7220 6861 7320 696e 7374 616c 6c65 - 0x11b0: 6420 7468 6520 4465 6269 616e 2047 4e55 - 0x11c0: 2f4c 696e 7578 206f 7065 7261 7469 6e67 - 0x11d0: 2073 7973 7465 6d2c 0a62 7574 2069 7420 - 0x11e0: 6861 7320 3c73 7472 6f6e 673e 6e6f 7468 - 0x11f0: 696e 6720 746f 2064 6f20 7769 7468 2074 - 0x1200: 6865 2044 6562 6961 6e0a 5072 6f6a 6563 - 0x1210: 743c 2f73 7472 6f6e 673e 2e20 506c 6561 - 0x1220: 7365 2064 6f20 3c73 7472 6f6e 673e 6e6f - 0x1230: 743c 2f73 7472 6f6e 673e 2063 6f6e 7461 - 0x1240: 6374 2074 6865 2044 6562 6961 6e0a 5072 - 0x1250: 6f6a 6563 7420 6162 6f75 7420 6974 2e3c - 0x1260: 2f50 3e0a 0a3c 503e 4966 2079 6f75 2066 - 0x1270: 696e 6420 6120 6275 6720 696e 2074 6869 - 0x1280: 7320 6170 6163 6865 2070 6163 6b61 6765 - 0x1290: 2c20 6f72 2069 6e20 4170 6163 6865 2069 - 0x12a0: 7473 656c 662c 0a70 6c65 6173 6520 6669 - 0x12b0: 6c65 2061 2062 7567 2072 6570 6f72 7420 - 0x12c0: 6f6e 2069 742e 2020 496e 7374 7275 6374 - 0x12d0: 696f 6e73 206f 6e20 646f 696e 6720 7468 - 0x12e0: 6973 2c20 616e 6420 7468 650a 6c69 7374 - 0x12f0: 206f 6620 3c41 2048 5245 463d 2268 7474 - 0x1300: 703a 2f2f 6275 6773 2e64 6562 6961 6e2e - 0x1310: 6f72 672f 7372 633a 6170 6163 6865 223e - 0x1320: 6b6e 6f77 6e20 6275 6773 3c2f 413e 206f - 0x1330: 6620 7468 6973 0a70 6163 6b61 6765 2c20 - 0x1340: 6361 6e20 6265 2066 6f75 6e64 2069 6e20 - 0x1350: 7468 6520 0a3c 4120 4852 4546 3d22 6874 - 0x1360: 7470 3a2f 2f77 7777 2e64 6562 6961 6e2e - 0x1370: 6f72 672f 4275 6773 2f52 6570 6f72 7469 - 0x1380: 6e67 223e 4465 6269 616e 2042 7567 2054 - 0x1390: 7261 636b 696e 6720 5379 7374 656d 3c2f - 0x13a0: 413e 2e0a 0a3c 503e 5468 616e 6b73 2066 - 0x13b0: 6f72 2075 7369 6e67 2074 6869 7320 7061 - 0x13c0: 636b 6167 652c 2061 6e64 2063 6f6e 6772 - 0x13d0: 6174 756c 6174 696f 6e73 2066 6f72 2079 - 0x13e0: 6f75 7220 6368 6f69 6365 206f 660a 6120 - 0x13f0: 4465 6269 616e 2073 7973 7465 6d21 3c2f - 0x1400: 503e 0a0a 3c44 4956 2061 6c69 676e 3d22 - 0x1410: 6365 6e74 6572 223e 0a3c 6120 6872 6566 - 0x1420: 3d22 6874 7470 3a2f 2f77 7777 2e64 6562 - 0x1430: 6961 6e2e 6f72 672f 223e 0a3c 494d 4720 - 0x1440: 616c 6967 6e3d 226d 6964 646c 6522 2068 - 0x1450: 6569 6768 743d 2233 3022 2077 6964 7468 - 0x1460: 3d22 3235 2220 7372 633d 2269 636f 6e73 - 0x1470: 2f64 6562 6961 6e2f 6f70 656e 6c6f 676f - 0x1480: 2d32 352e 6a70 6722 2061 6c74 3d22 4465 - 0x1490: 6269 616e 223e 0a3c 2f61 3e0a 3c61 2068 - 0x14a0: 7265 663d 2268 7474 703a 2f2f 7777 772e - 0x14b0: 6170 6163 6865 2e6f 7267 2f22 3e0a 3c49 - 0x14c0: 4d47 2061 6c69 676e 3d22 6d69 6464 6c65 - 0x14d0: 2220 6865 6967 6874 3d22 3332 2220 7769 - 0x14e0: 6474 683d 2232 3539 2220 7372 633d 2269 - 0x14f0: 636f 6e73 2f61 7061 6368 655f 7062 2e70 - 0x1500: 6e67 2220 616c 743d 2241 7061 6368 6522 - 0x1510: 3e0a 3c2f 613e 0a3c 2f44 4956 3e0a 0a3c - 0x1520: 212d 2d0a 2020 5468 6973 2070 6167 6520 - 0x1530: 7761 7320 696e 6974 6961 6c6c 7920 6372 - 0x1540: 6561 7465 6420 6279 204a 6f68 6e69 6520 - 0x1550: 496e 6772 616d 2028 6874 7470 3a2f 2f6e - 0x1560: 6574 676f 642e 6e65 742f 290a 2020 4974 - 0x1570: 2077 6173 206c 6174 6572 2065 6469 7465 - 0x1580: 6420 6279 204d 6174 7468 6577 2057 696c - 0x1590: 636f 7820 616e 6420 4a6f 7369 7020 526f - 0x15a0: 6469 6e2e 0a20 204c 6173 7420 6d6f 6469 - 0x15b0: 6669 6564 3a20 2444 6174 653a 2032 3030 - 0x15c0: 342f 3036 2f32 3020 3135 3a33 333a 3537 - 0x15d0: 2024 2e0a 2020 2d2d 3e0a 0a3c 2f42 4f44 - 0x15e0: 593e 0a3c 2f48 544d 4c3e 0a -22:57:35.941260 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5560, win 12383, options [nop,nop,TS val 1306300953 ecr 1306300953], length 0 - 0x0000: 4500 0034 1b6e 4000 4006 2154 7f00 0001 - 0x0010: 7f00 0001 da70 0050 3758 8a49 377a a3a9 - 0x0020: 8010 305f 10ea 0000 0101 080a 4ddc 9219 - 0x0030: 4ddc 9219 -22:57:37.229575 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [F.], seq 203, ack 5560, win 12383, options [nop,nop,TS val 1306302241 ecr 1306300953], length 0 - 0x0000: 4500 0034 1b70 4000 4006 2152 7f00 0001 - 0x0010: 7f00 0001 da70 0050 3758 8a49 377a a3a9 - 0x0020: 8011 305f 0be1 0000 0101 080a 4ddc 9721 - 0x0030: 4ddc 9219 -22:57:37.230839 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [F.], seq 5560, ack 204, win 8192, options [nop,nop,TS val 1306302243 ecr 1306302241], length 0 - 0x0000: 4500 0034 1fe8 4000 4006 1cda 7f00 0001 - 0x0010: 7f00 0001 0050 da70 377a a3a9 3758 8a4a - 0x0020: 8011 2000 1735 0000 0101 080a 4ddc 9723 - 0x0030: 4ddc 9721 -22:57:37.230900 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5561, win 12383, options [nop,nop,TS val 1306302243 ecr 1306302243], length 0 - 0x0000: 4500 0034 1b72 4000 4006 2150 7f00 0001 - 0x0010: 7f00 0001 da70 0050 3758 8a4a 377a a3aa - 0x0020: 8010 305f 06d4 0000 0101 080a 4ddc 9723 - 0x0030: 4ddc 9723 diff --git a/contrib/tcpdump/tests/print-xx.out b/contrib/tcpdump/tests/print-xx.out deleted file mode 100644 index d9d24db55d5..00000000000 --- a/contrib/tcpdump/tests/print-xx.out +++ /dev/null @@ -1,419 +0,0 @@ -22:57:35.938066 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [S], seq 928549246, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 0,nop,wscale 2], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 - 0x0010: 003c 1b68 4000 4006 2152 7f00 0001 7f00 - 0x0020: 0001 da70 0050 3758 897e 0000 0000 a002 - 0x0030: 7fff 1421 0000 0204 400c 0402 080a 4ddc - 0x0040: 9216 0000 0000 0103 0302 -22:57:35.938122 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [S.], seq 930778609, ack 928549247, win 32767, options [mss 16396,sackOK,TS val 1306300950 ecr 1306300950,nop,wscale 2], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 - 0x0010: 003c 0000 4000 4006 3cba 7f00 0001 7f00 - 0x0020: 0001 0050 da70 377a 8df1 3758 897f a012 - 0x0030: 7fff 6eb1 0000 0204 400c 0402 080a 4ddc - 0x0040: 9216 4ddc 9216 0103 0302 -22:57:35.938167 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 1, win 8192, options [nop,nop,TS val 1306300950 ecr 1306300950], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 - 0x0010: 0034 1b6a 4000 4006 2158 7f00 0001 7f00 - 0x0020: 0001 da70 0050 3758 897f 377a 8df2 8010 - 0x0030: 2000 37d0 0000 0101 080a 4ddc 9216 4ddc - 0x0040: 9216 -22:57:35.939423 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [P.], seq 1:203, ack 1, win 8192, options [nop,nop,TS val 1306300951 ecr 1306300950], length 202 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 - 0x0010: 00fe 1b6c 4000 4006 208c 7f00 0001 7f00 - 0x0020: 0001 da70 0050 3758 897f 377a 8df2 8018 - 0x0030: 2000 fef2 0000 0101 080a 4ddc 9217 4ddc - 0x0040: 9216 4745 5420 2f20 4854 5450 2f31 2e31 - 0x0050: 0d0a 486f 7374 3a20 6c6f 6361 6c68 6f73 - 0x0060: 740d 0a55 7365 722d 4167 656e 743a 2045 - 0x0070: 4c69 6e6b 732f 302e 3130 2e34 2d37 2d64 - 0x0080: 6562 6961 6e20 2874 6578 746d 6f64 653b - 0x0090: 204c 696e 7578 2032 2e36 2e31 312d 312d - 0x00a0: 3638 362d 736d 7020 6936 3836 3b20 3133 - 0x00b0: 3278 3536 2d32 290d 0a41 6363 6570 743a - 0x00c0: 202a 2f2a 0d0a 4163 6365 7074 2d45 6e63 - 0x00d0: 6f64 696e 673a 2067 7a69 700d 0a41 6363 - 0x00e0: 6570 742d 4c61 6e67 7561 6765 3a20 656e - 0x00f0: 0d0a 436f 6e6e 6563 7469 6f6e 3a20 4b65 - 0x0100: 6570 2d41 6c69 7665 0d0a 0d0a -22:57:35.940474 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [.], ack 203, win 8192, options [nop,nop,TS val 1306300952 ecr 1306300951], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 - 0x0010: 0034 1fe4 4000 4006 1cde 7f00 0001 7f00 - 0x0020: 0001 0050 da70 377a 8df2 3758 8a49 8010 - 0x0030: 2000 3703 0000 0101 080a 4ddc 9218 4ddc - 0x0040: 9217 -22:57:35.941232 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [P.], seq 1:5560, ack 203, win 8192, options [nop,nop,TS val 1306300953 ecr 1306300951], length 5559 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 - 0x0010: 15eb 1fe6 4000 4006 0725 7f00 0001 7f00 - 0x0020: 0001 0050 da70 377a 8df2 3758 8a49 8018 - 0x0030: 2000 13e0 0000 0101 080a 4ddc 9219 4ddc - 0x0040: 9217 4854 5450 2f31 2e31 2032 3030 204f - 0x0050: 4b0d 0a44 6174 653a 2057 6564 2c20 3036 - 0x0060: 204a 756c 2032 3030 3520 3033 3a35 373a - 0x0070: 3335 2047 4d54 0d0a 5365 7276 6572 3a20 - 0x0080: 4170 6163 6865 2f31 2e33 2e33 330d 0a4c - 0x0090: 6173 742d 4d6f 6469 6669 6564 3a20 5375 - 0x00a0: 6e2c 2031 3520 4175 6720 3230 3034 2030 - 0x00b0: 303a 3433 3a34 3120 474d 540d 0a45 5461 - 0x00c0: 673a 2022 3665 3830 6630 2d31 3438 612d - 0x00d0: 3431 3165 6231 6264 220d 0a41 6363 6570 - 0x00e0: 742d 5261 6e67 6573 3a20 6279 7465 730d - 0x00f0: 0a43 6f6e 7465 6e74 2d4c 656e 6774 683a - 0x0100: 2035 3235 380d 0a4b 6565 702d 416c 6976 - 0x0110: 653a 2074 696d 656f 7574 3d31 352c 206d - 0x0120: 6178 3d31 3030 0d0a 436f 6e6e 6563 7469 - 0x0130: 6f6e 3a20 4b65 6570 2d41 6c69 7665 0d0a - 0x0140: 436f 6e74 656e 742d 5479 7065 3a20 7465 - 0x0150: 7874 2f68 746d 6c3b 2063 6861 7273 6574 - 0x0160: 3d69 736f 2d38 3835 392d 310d 0a0d 0a3c - 0x0170: 2144 4f43 5459 5045 2048 544d 4c20 5055 - 0x0180: 424c 4943 2022 2d2f 2f57 3343 2f2f 4454 - 0x0190: 4420 4854 4d4c 2034 2e30 3120 5472 616e - 0x01a0: 7369 7469 6f6e 616c 2f2f 454e 223e 0a3c - 0x01b0: 4854 4d4c 3e0a 3c48 4541 443e 0a20 2020 - 0x01c0: 3c4d 4554 4120 4854 5450 2d45 5155 4956 - 0x01d0: 3d22 436f 6e74 656e 742d 5479 7065 2220 - 0x01e0: 434f 4e54 454e 543d 2274 6578 742f 6874 - 0x01f0: 6d6c 3b20 6368 6172 7365 743d 6973 6f2d - 0x0200: 3838 3539 2d31 223e 0a20 2020 3c4d 4554 - 0x0210: 4120 4e41 4d45 3d22 4465 7363 7269 7074 - 0x0220: 696f 6e22 2043 4f4e 5445 4e54 3d22 5468 - 0x0230: 6520 696e 6974 6961 6c20 696e 7374 616c - 0x0240: 6c61 7469 6f6e 206f 6620 4465 6269 616e - 0x0250: 2061 7061 6368 652e 223e 0a20 2020 3c54 - 0x0260: 4954 4c45 3e50 6c61 6365 686f 6c64 6572 - 0x0270: 2070 6167 653c 2f54 4954 4c45 3e0a 3c2f - 0x0280: 4845 4144 3e0a 3c42 4f44 5920 5445 5854 - 0x0290: 3d22 2330 3030 3030 3022 2042 4743 4f4c - 0x02a0: 4f52 3d22 2346 4646 4646 4622 204c 494e - 0x02b0: 4b3d 2223 3030 3030 4546 2220 564c 494e - 0x02c0: 4b3d 2223 3535 3138 3841 2220 414c 494e - 0x02d0: 4b3d 2223 4646 3030 3030 223e 0a0a 3c48 - 0x02e0: 313e 506c 6163 6568 6f6c 6465 7220 7061 - 0x02f0: 6765 3c2f 4831 3e0a 3c48 323e 4966 2079 - 0x0300: 6f75 2061 7265 206a 7573 7420 6272 6f77 - 0x0310: 7369 6e67 2074 6865 2077 6562 3c2f 6832 - 0x0320: 3e0a 0a3c 503e 5468 6520 6f77 6e65 7220 - 0x0330: 6f66 2074 6869 7320 7765 6220 7369 7465 - 0x0340: 2068 6173 206e 6f74 2070 7574 2075 7020 - 0x0350: 616e 7920 7765 6220 7061 6765 7320 7965 - 0x0360: 742e 0a50 6c65 6173 6520 636f 6d65 2062 - 0x0370: 6163 6b20 6c61 7465 722e 3c2f 503e 0a0a - 0x0380: 3c50 3e3c 534d 414c 4c3e 3c43 4954 453e - 0x0390: 4d6f 7665 2061 6c6f 6e67 2c20 6e6f 7468 - 0x03a0: 696e 6720 746f 2073 6565 2068 6572 652e - 0x03b0: 2e2e 3c2f 4349 5445 3e20 3a2d 293c 2f53 - 0x03c0: 4d41 4c4c 3e3c 2f50 3e0a 0a3c 4832 3e49 - 0x03d0: 6620 796f 7520 6172 6520 7472 7969 6e67 - 0x03e0: 2074 6f20 6c6f 6361 7465 2074 6865 2061 - 0x03f0: 646d 696e 6973 7472 6174 6f72 206f 6620 - 0x0400: 7468 6973 206d 6163 6869 6e65 3c2f 4832 - 0x0410: 3e0a 0a3c 503e 4966 2079 6f75 2077 616e - 0x0420: 7420 746f 2072 6570 6f72 7420 736f 6d65 - 0x0430: 7468 696e 6720 6162 6f75 7420 7468 6973 - 0x0440: 2068 6f73 7427 7320 6265 6861 7669 6f72 - 0x0450: 2c20 706c 6561 7365 0a63 6f6e 7461 6374 - 0x0460: 2074 6865 2049 6e74 6572 6e65 7420 5365 - 0x0470: 7276 6963 6520 5072 6f76 6964 6572 2028 - 0x0480: 4953 5029 2069 6e76 6f6c 7665 6420 6469 - 0x0490: 7265 6374 6c79 2e3c 2f50 3e0a 0a3c 503e - 0x04a0: 5365 6520 7468 6520 3c41 2068 7265 663d - 0x04b0: 2268 7474 703a 2f2f 7777 772e 6162 7573 - 0x04c0: 652e 6e65 742f 223e 4e65 7477 6f72 6b20 - 0x04d0: 4162 7573 650a 436c 6561 7269 6e67 686f - 0x04e0: 7573 653c 2f41 3e20 666f 7220 686f 7720 - 0x04f0: 746f 2064 6f20 7468 6973 2e3c 2f50 3e0a - 0x0500: 0a3c 4832 3e49 6620 796f 7520 6172 6520 - 0x0510: 7468 6520 6164 6d69 6e69 7374 7261 746f - 0x0520: 7220 6f66 2074 6869 7320 6d61 6368 696e - 0x0530: 653c 2f48 323e 0a0a 3c50 3e54 6865 2069 - 0x0540: 6e69 7469 616c 2069 6e73 7461 6c6c 6174 - 0x0550: 696f 6e20 6f66 203c 4120 6872 6566 3d22 - 0x0560: 6874 7470 3a2f 2f77 7777 2e64 6562 6961 - 0x0570: 6e2e 6f72 672f 223e 4465 6269 616e 2773 - 0x0580: 0a61 7061 6368 653c 2f41 3e20 7765 6220 - 0x0590: 7365 7276 6572 2070 6163 6b61 6765 2077 - 0x05a0: 6173 2073 7563 6365 7373 6675 6c2e 3c2f - 0x05b0: 503e 0a0a 3c50 3e3c 5354 524f 4e47 3e59 - 0x05c0: 6f75 2073 686f 756c 6420 7265 706c 6163 - 0x05d0: 6520 7468 6973 2070 6167 6520 7769 7468 - 0x05e0: 2079 6f75 7220 6f77 6e20 7765 6220 7061 - 0x05f0: 6765 7320 6173 0a73 6f6f 6e20 6173 2070 - 0x0600: 6f73 7369 626c 652e 3c2f 5354 524f 4e47 - 0x0610: 3e3c 2f50 3e0a 0a3c 503e 556e 6c65 7373 - 0x0620: 2079 6f75 2063 6861 6e67 6564 2069 7473 - 0x0630: 2063 6f6e 6669 6775 7261 7469 6f6e 2c20 - 0x0640: 796f 7572 206e 6577 2073 6572 7665 7220 - 0x0650: 6973 2063 6f6e 6669 6775 7265 6420 6173 - 0x0660: 2066 6f6c 6c6f 7773 3a0a 3c55 4c3e 0a3c - 0x0670: 4c49 3e0a 436f 6e66 6967 7572 6174 696f - 0x0680: 6e20 6669 6c65 7320 6361 6e20 6265 2066 - 0x0690: 6f75 6e64 2069 6e20 3c54 543e 2f65 7463 - 0x06a0: 2f61 7061 6368 653c 2f54 543e 2e3c 2f4c - 0x06b0: 493e 0a0a 3c4c 493e 0a54 6865 203c 5454 - 0x06c0: 3e44 6f63 756d 656e 7452 6f6f 743c 2f54 - 0x06d0: 543e 2c20 7768 6963 6820 6973 2074 6865 - 0x06e0: 2064 6972 6563 746f 7279 2075 6e64 6572 - 0x06f0: 2077 6869 6368 2061 6c6c 2079 6f75 720a - 0x0700: 4854 4d4c 2066 696c 6573 2073 686f 756c - 0x0710: 6420 6578 6973 742c 2069 7320 7365 7420 - 0x0720: 746f 203c 5454 3e2f 7661 722f 7777 773c - 0x0730: 2f54 543e 2e3c 2f4c 493e 0a0a 3c4c 493e - 0x0740: 0a43 4749 2073 6372 6970 7473 2061 7265 - 0x0750: 206c 6f6f 6b65 6420 666f 7220 696e 203c - 0x0760: 5454 3e2f 7573 722f 6c69 622f 6367 692d - 0x0770: 6269 6e3c 2f54 543e 2c20 7768 6963 6820 - 0x0780: 6973 2077 6865 7265 0a44 6562 6961 6e20 - 0x0790: 7061 636b 6167 6573 2077 696c 6c20 706c - 0x07a0: 6163 6520 7468 6569 7220 7363 7269 7074 - 0x07b0: 732e 3c2f 4c49 3e0a 0a3c 4c49 3e0a 4c6f - 0x07c0: 6720 6669 6c65 7320 6172 6520 706c 6163 - 0x07d0: 6564 2069 6e20 3c54 543e 2f76 6172 2f6c - 0x07e0: 6f67 2f61 7061 6368 653c 2f54 543e 2c20 - 0x07f0: 616e 6420 7769 6c6c 2062 6520 726f 7461 - 0x0800: 7465 640a 7765 656b 6c79 2e20 2054 6865 - 0x0810: 2066 7265 7175 656e 6379 206f 6620 726f - 0x0820: 7461 7469 6f6e 2063 616e 2062 6520 6561 - 0x0830: 7369 6c79 2063 6861 6e67 6564 2062 7920 - 0x0840: 6564 6974 696e 670a 3c54 543e 2f65 7463 - 0x0850: 2f6c 6f67 726f 7461 7465 2e64 2f61 7061 - 0x0860: 6368 653c 2f54 543e 2e3c 2f4c 493e 0a0a - 0x0870: 3c4c 493e 0a54 6865 2064 6566 6175 6c74 - 0x0880: 2064 6972 6563 746f 7279 2069 6e64 6578 - 0x0890: 2069 7320 3c54 543e 696e 6465 782e 6874 - 0x08a0: 6d6c 3c2f 5454 3e2c 206d 6561 6e69 6e67 - 0x08b0: 2074 6861 7420 7265 7175 6573 7473 0a66 - 0x08c0: 6f72 2061 2064 6972 6563 746f 7279 203c - 0x08d0: 5454 3e2f 666f 6f2f 6261 722f 3c2f 5454 - 0x08e0: 3e20 7769 6c6c 2067 6976 6520 7468 6520 - 0x08f0: 636f 6e74 656e 7473 206f 6620 7468 6520 - 0x0900: 6669 6c65 203c 5454 3e2f 7661 722f 7777 - 0x0910: 772f 666f 6f2f 6261 722f 696e 6465 782e - 0x0920: 6874 6d6c 3c2f 5454 3e0a 6966 2069 7420 - 0x0930: 6578 6973 7473 2028 6173 7375 6d69 6e67 - 0x0940: 2074 6861 7420 3c54 543e 2f76 6172 2f77 - 0x0950: 7777 3c2f 5454 3e20 6973 2079 6f75 7220 - 0x0960: 3c54 543e 446f 6375 6d65 6e74 526f 6f74 - 0x0970: 3c2f 5454 3e29 2e3c 2f4c 493e 0a0a 3c4c - 0x0980: 493e 0a55 7365 7220 6469 7265 6374 6f72 - 0x0990: 6965 7320 6172 6520 656e 6162 6c65 642c - 0x09a0: 2061 6e64 2075 7365 7220 646f 6375 6d65 - 0x09b0: 6e74 7320 7769 6c6c 2062 6520 6c6f 6f6b - 0x09c0: 6564 2066 6f72 0a69 6e20 7468 6520 3c54 - 0x09d0: 543e 7075 626c 6963 5f68 746d 6c3c 2f54 - 0x09e0: 543e 2064 6972 6563 746f 7279 206f 6620 - 0x09f0: 7468 6520 7573 6572 7327 2068 6f6d 6573 - 0x0a00: 2e20 2054 6865 7365 2064 6972 730a 7368 - 0x0a10: 6f75 6c64 2062 6520 756e 6465 7220 3c54 - 0x0a20: 543e 2f68 6f6d 653c 2f54 543e 2c20 616e - 0x0a30: 6420 7573 6572 7320 7769 6c6c 206e 6f74 - 0x0a40: 2062 6520 6162 6c65 2074 6f20 7379 6d6c - 0x0a50: 696e 6b0a 746f 2066 696c 6573 2074 6865 - 0x0a60: 7920 646f 6e27 7420 6f77 6e2e 3c2f 4c49 - 0x0a70: 3e0a 0a3c 2f55 4c3e 0a41 6c6c 2074 6865 - 0x0a80: 2073 7461 6e64 6172 6420 6170 6163 6865 - 0x0a90: 206d 6f64 756c 6573 2061 7265 2061 7661 - 0x0aa0: 696c 6162 6c65 2077 6974 6820 7468 6973 - 0x0ab0: 2072 656c 6561 7365 2061 6e64 2061 7265 - 0x0ac0: 0a6e 6f77 206d 616e 6167 6564 2077 6974 - 0x0ad0: 6820 6465 6263 6f6e 662e 2020 5479 7065 - 0x0ae0: 203c 5454 3e64 706b 672d 7265 636f 6e66 - 0x0af0: 6967 7572 6520 6170 6163 6865 3c2f 5454 - 0x0b00: 3e20 746f 0a73 656c 6563 7420 7768 6963 - 0x0b10: 6820 6d6f 6475 6c65 7320 796f 7520 7761 - 0x0b20: 6e74 2065 6e61 626c 6564 2e20 204d 616e - 0x0b30: 7920 6f74 6865 7220 6d6f 6475 6c65 7320 - 0x0b40: 6172 6520 6176 6169 6c61 626c 650a 7468 - 0x0b50: 726f 7567 6820 7468 6520 4465 6269 616e - 0x0b60: 2070 6163 6b61 6765 2073 7973 7465 6d20 - 0x0b70: 7769 7468 2074 6865 206e 616d 6573 203c - 0x0b80: 5454 3e6c 6962 6170 6163 6865 2d6d 6f64 - 0x0b90: 2d2a 3c2f 5454 3e2e 0a49 6620 796f 7520 - 0x0ba0: 6e65 6564 2074 6f20 636f 6d70 696c 6520 - 0x0bb0: 6120 6d6f 6475 6c65 2079 6f75 7273 656c - 0x0bc0: 662c 2079 6f75 2077 696c 6c20 6e65 6564 - 0x0bd0: 2074 6f20 696e 7374 616c 6c20 7468 650a - 0x0be0: 3c54 543e 6170 6163 6865 2d64 6576 3c2f - 0x0bf0: 5454 3e20 7061 636b 6167 652e 0a0a 3c50 - 0x0c00: 3e4d 6f72 6520 646f 6375 6d65 6e74 6174 - 0x0c10: 696f 6e20 6f6e 2041 7061 6368 6520 6361 - 0x0c20: 6e20 6265 2066 6f75 6e64 206f 6e3a 0a3c - 0x0c30: 554c 3e0a 3c4c 493e 0a54 6865 203c 4120 - 0x0c40: 4852 4546 3d22 2f64 6f63 2f61 7061 6368 - 0x0c50: 652d 646f 632f 6d61 6e75 616c 2f22 3e41 - 0x0c60: 7061 6368 6520 646f 6375 6d65 6e74 6174 - 0x0c70: 696f 6e3c 2f41 3e20 7374 6f72 6564 206f - 0x0c80: 6e20 796f 7572 2073 6572 7665 722e 3c2f - 0x0c90: 4c49 3e0a 0a3c 4c49 3e0a 5468 6520 3c41 - 0x0ca0: 2048 5245 463d 2268 7474 703a 2f2f 7777 - 0x0cb0: 772e 6170 6163 6865 2e6f 7267 2f22 3e41 - 0x0cc0: 7061 6368 6520 5072 6f6a 6563 743c 2f41 - 0x0cd0: 3e20 686f 6d65 2073 6974 652e 3c2f 4c49 - 0x0ce0: 3e0a 0a3c 4c49 3e0a 5468 6520 3c41 2048 - 0x0cf0: 5245 463d 2268 7474 703a 2f2f 7777 772e - 0x0d00: 6170 6163 6865 2d73 736c 2e6f 7267 2f22 - 0x0d10: 3e41 7061 6368 652d 5353 4c3c 2f41 3e20 - 0x0d20: 686f 6d65 2073 6974 652e 3c2f 4c49 3e0a - 0x0d30: 0a3c 4c49 3e0a 5468 6520 3c41 2048 5245 - 0x0d40: 463d 2268 7474 703a 2f2f 7065 726c 2e61 - 0x0d50: 7061 6368 652e 6f72 672f 223e 6d6f 6420 - 0x0d60: 7065 726c 3c2f 413e 2068 6f6d 6520 7369 - 0x0d70: 7465 2e3c 2f4c 493e 0a0a 3c4c 493e 0a54 - 0x0d80: 6865 203c 4120 4852 4546 3d22 6874 7470 - 0x0d90: 3a2f 2f77 7777 2e61 7061 6368 6577 6565 - 0x0da0: 6b2e 636f 6d2f 223e 4170 6163 6865 5765 - 0x0db0: 656b 3c2f 413e 206e 6577 736c 6574 7465 - 0x0dc0: 722e 3c2f 4c49 3e0a 0a3c 4c49 3e0a 5468 - 0x0dd0: 6520 3c41 2048 5245 463d 2268 7474 703a - 0x0de0: 2f2f 7777 772e 6465 6269 616e 2e6f 7267 - 0x0df0: 2f64 6f63 2f22 3e44 6562 6961 6e20 5072 - 0x0e00: 6f6a 6563 740a 446f 6375 6d65 6e74 6174 - 0x0e10: 696f 6e3c 2f41 3e20 7768 6963 6820 636f - 0x0e20: 6e74 6169 6e73 2048 4f57 544f 732c 2046 - 0x0e30: 4151 732c 2061 6e64 2073 6f66 7477 6172 - 0x0e40: 6520 7570 6461 7465 732e 3c2f 4c49 3e0a - 0x0e50: 3c2f 554c 3e0a 0a3c 503e 596f 7520 6361 - 0x0e60: 6e20 616c 736f 2063 6f6e 7375 6c74 2074 - 0x0e70: 6865 206c 6973 7420 6f66 203c 4120 4852 - 0x0e80: 4546 3d22 6874 7470 3a2f 2f77 7777 2e62 - 0x0e90: 6f75 7465 6c6c 2e63 6f6d 2f66 6171 2f22 - 0x0ea0: 3e57 6f72 6c64 0a57 6964 6520 5765 6220 - 0x0eb0: 4672 6571 7565 6e74 6c79 2041 736b 6564 - 0x0ec0: 2051 7565 7374 696f 6e73 3c2f 413e 2066 - 0x0ed0: 6f72 2069 6e66 6f72 6d61 7469 6f6e 2e0a - 0x0ee0: 0a3c 4832 3e4c 6574 206f 7468 6572 2070 - 0x0ef0: 656f 706c 6520 6b6e 6f77 2061 626f 7574 - 0x0f00: 2074 6869 7320 7365 7276 6572 3c2f 4832 - 0x0f10: 3e0a 0a3c 4120 4852 4546 3d22 6874 7470 - 0x0f20: 3a2f 2f6e 6574 6372 6166 742e 636f 6d2f - 0x0f30: 223e 4e65 7463 7261 6674 3c2f 413e 2070 - 0x0f40: 726f 7669 6465 7320 616e 2069 6e74 6572 - 0x0f50: 6573 7469 6e67 2066 7265 650a 7365 7276 - 0x0f60: 6963 6520 666f 7220 7765 6220 7369 7465 - 0x0f70: 206d 6f6e 6974 6f72 696e 6720 616e 6420 - 0x0f80: 7374 6174 6973 7469 6320 636f 6c6c 6563 - 0x0f90: 7469 6f6e 2e0a 596f 7520 6361 6e20 6c65 - 0x0fa0: 7420 7468 656d 206b 6e6f 7720 6162 6f75 - 0x0fb0: 7420 796f 7572 2073 6572 7665 7220 7573 - 0x0fc0: 696e 6720 7468 6569 720a 3c41 2048 5245 - 0x0fd0: 463d 2268 7474 703a 2f2f 7570 7469 6d65 - 0x0fe0: 2e6e 6574 6372 6166 742e 636f 6d2f 223e - 0x0ff0: 696e 7465 7266 6163 653c 2f41 3e2e 0a45 - 0x1000: 6e61 626c 696e 6720 7468 6520 6d6f 6e69 - 0x1010: 746f 7269 6e67 206f 6620 796f 7572 2073 - 0x1020: 6572 7665 7220 7769 6c6c 2070 726f 7669 - 0x1030: 6465 2061 2062 6574 7465 7220 676c 6f62 - 0x1040: 616c 206f 7665 7276 6965 770a 6f66 2077 - 0x1050: 686f 2069 7320 7573 696e 6720 7768 6174 - 0x1060: 2061 6e64 2077 6865 7265 2c20 616e 6420 - 0x1070: 6974 2077 6f75 6c64 2067 6976 6520 4465 - 0x1080: 6269 616e 2061 2062 6574 7465 720a 6f76 - 0x1090: 6572 7669 6577 206f 6620 7468 6520 6170 - 0x10a0: 6163 6865 2070 6163 6b61 6765 2075 7361 - 0x10b0: 6765 2e0a 0a3c 4832 3e41 626f 7574 2074 - 0x10c0: 6869 7320 7061 6765 3c2f 4832 3e0a 0a3c - 0x10d0: 494d 4720 414c 4947 4e3d 2272 6967 6874 - 0x10e0: 2220 414c 543d 2222 2048 4549 4748 543d - 0x10f0: 2232 3437 2220 5749 4454 483d 2232 3738 - 0x1100: 2220 5352 433d 2269 636f 6e73 2f6a 6865 - 0x1110: 3036 312e 706e 6722 3e0a 0a3c 503e 5468 - 0x1120: 6973 2069 7320 6120 706c 6163 6568 6f6c - 0x1130: 6465 7220 7061 6765 2069 6e73 7461 6c6c - 0x1140: 6564 2062 7920 7468 6520 3c41 0a48 5245 - 0x1150: 463d 2268 7474 703a 2f2f 7777 772e 6465 - 0x1160: 6269 616e 2e6f 7267 2f22 3e44 6562 6961 - 0x1170: 6e3c 2f41 3e0a 7265 6c65 6173 6520 6f66 - 0x1180: 2074 6865 2061 7061 6368 6520 5765 6220 - 0x1190: 7365 7276 6572 2070 6163 6b61 6765 2e0a - 0x11a0: 0a3c 503e 5468 6973 2063 6f6d 7075 7465 - 0x11b0: 7220 6861 7320 696e 7374 616c 6c65 6420 - 0x11c0: 7468 6520 4465 6269 616e 2047 4e55 2f4c - 0x11d0: 696e 7578 206f 7065 7261 7469 6e67 2073 - 0x11e0: 7973 7465 6d2c 0a62 7574 2069 7420 6861 - 0x11f0: 7320 3c73 7472 6f6e 673e 6e6f 7468 696e - 0x1200: 6720 746f 2064 6f20 7769 7468 2074 6865 - 0x1210: 2044 6562 6961 6e0a 5072 6f6a 6563 743c - 0x1220: 2f73 7472 6f6e 673e 2e20 506c 6561 7365 - 0x1230: 2064 6f20 3c73 7472 6f6e 673e 6e6f 743c - 0x1240: 2f73 7472 6f6e 673e 2063 6f6e 7461 6374 - 0x1250: 2074 6865 2044 6562 6961 6e0a 5072 6f6a - 0x1260: 6563 7420 6162 6f75 7420 6974 2e3c 2f50 - 0x1270: 3e0a 0a3c 503e 4966 2079 6f75 2066 696e - 0x1280: 6420 6120 6275 6720 696e 2074 6869 7320 - 0x1290: 6170 6163 6865 2070 6163 6b61 6765 2c20 - 0x12a0: 6f72 2069 6e20 4170 6163 6865 2069 7473 - 0x12b0: 656c 662c 0a70 6c65 6173 6520 6669 6c65 - 0x12c0: 2061 2062 7567 2072 6570 6f72 7420 6f6e - 0x12d0: 2069 742e 2020 496e 7374 7275 6374 696f - 0x12e0: 6e73 206f 6e20 646f 696e 6720 7468 6973 - 0x12f0: 2c20 616e 6420 7468 650a 6c69 7374 206f - 0x1300: 6620 3c41 2048 5245 463d 2268 7474 703a - 0x1310: 2f2f 6275 6773 2e64 6562 6961 6e2e 6f72 - 0x1320: 672f 7372 633a 6170 6163 6865 223e 6b6e - 0x1330: 6f77 6e20 6275 6773 3c2f 413e 206f 6620 - 0x1340: 7468 6973 0a70 6163 6b61 6765 2c20 6361 - 0x1350: 6e20 6265 2066 6f75 6e64 2069 6e20 7468 - 0x1360: 6520 0a3c 4120 4852 4546 3d22 6874 7470 - 0x1370: 3a2f 2f77 7777 2e64 6562 6961 6e2e 6f72 - 0x1380: 672f 4275 6773 2f52 6570 6f72 7469 6e67 - 0x1390: 223e 4465 6269 616e 2042 7567 2054 7261 - 0x13a0: 636b 696e 6720 5379 7374 656d 3c2f 413e - 0x13b0: 2e0a 0a3c 503e 5468 616e 6b73 2066 6f72 - 0x13c0: 2075 7369 6e67 2074 6869 7320 7061 636b - 0x13d0: 6167 652c 2061 6e64 2063 6f6e 6772 6174 - 0x13e0: 756c 6174 696f 6e73 2066 6f72 2079 6f75 - 0x13f0: 7220 6368 6f69 6365 206f 660a 6120 4465 - 0x1400: 6269 616e 2073 7973 7465 6d21 3c2f 503e - 0x1410: 0a0a 3c44 4956 2061 6c69 676e 3d22 6365 - 0x1420: 6e74 6572 223e 0a3c 6120 6872 6566 3d22 - 0x1430: 6874 7470 3a2f 2f77 7777 2e64 6562 6961 - 0x1440: 6e2e 6f72 672f 223e 0a3c 494d 4720 616c - 0x1450: 6967 6e3d 226d 6964 646c 6522 2068 6569 - 0x1460: 6768 743d 2233 3022 2077 6964 7468 3d22 - 0x1470: 3235 2220 7372 633d 2269 636f 6e73 2f64 - 0x1480: 6562 6961 6e2f 6f70 656e 6c6f 676f 2d32 - 0x1490: 352e 6a70 6722 2061 6c74 3d22 4465 6269 - 0x14a0: 616e 223e 0a3c 2f61 3e0a 3c61 2068 7265 - 0x14b0: 663d 2268 7474 703a 2f2f 7777 772e 6170 - 0x14c0: 6163 6865 2e6f 7267 2f22 3e0a 3c49 4d47 - 0x14d0: 2061 6c69 676e 3d22 6d69 6464 6c65 2220 - 0x14e0: 6865 6967 6874 3d22 3332 2220 7769 6474 - 0x14f0: 683d 2232 3539 2220 7372 633d 2269 636f - 0x1500: 6e73 2f61 7061 6368 655f 7062 2e70 6e67 - 0x1510: 2220 616c 743d 2241 7061 6368 6522 3e0a - 0x1520: 3c2f 613e 0a3c 2f44 4956 3e0a 0a3c 212d - 0x1530: 2d0a 2020 5468 6973 2070 6167 6520 7761 - 0x1540: 7320 696e 6974 6961 6c6c 7920 6372 6561 - 0x1550: 7465 6420 6279 204a 6f68 6e69 6520 496e - 0x1560: 6772 616d 2028 6874 7470 3a2f 2f6e 6574 - 0x1570: 676f 642e 6e65 742f 290a 2020 4974 2077 - 0x1580: 6173 206c 6174 6572 2065 6469 7465 6420 - 0x1590: 6279 204d 6174 7468 6577 2057 696c 636f - 0x15a0: 7820 616e 6420 4a6f 7369 7020 526f 6469 - 0x15b0: 6e2e 0a20 204c 6173 7420 6d6f 6469 6669 - 0x15c0: 6564 3a20 2444 6174 653a 2032 3030 342f - 0x15d0: 3036 2f32 3020 3135 3a33 333a 3537 2024 - 0x15e0: 2e0a 2020 2d2d 3e0a 0a3c 2f42 4f44 593e - 0x15f0: 0a3c 2f48 544d 4c3e 0a -22:57:35.941260 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5560, win 12383, options [nop,nop,TS val 1306300953 ecr 1306300953], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 - 0x0010: 0034 1b6e 4000 4006 2154 7f00 0001 7f00 - 0x0020: 0001 da70 0050 3758 8a49 377a a3a9 8010 - 0x0030: 305f 10ea 0000 0101 080a 4ddc 9219 4ddc - 0x0040: 9219 -22:57:37.229575 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [F.], seq 203, ack 5560, win 12383, options [nop,nop,TS val 1306302241 ecr 1306300953], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 - 0x0010: 0034 1b70 4000 4006 2152 7f00 0001 7f00 - 0x0020: 0001 da70 0050 3758 8a49 377a a3a9 8011 - 0x0030: 305f 0be1 0000 0101 080a 4ddc 9721 4ddc - 0x0040: 9219 -22:57:37.230839 IP 127.0.0.1.80 > 127.0.0.1.55920: Flags [F.], seq 5560, ack 204, win 8192, options [nop,nop,TS val 1306302243 ecr 1306302241], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 - 0x0010: 0034 1fe8 4000 4006 1cda 7f00 0001 7f00 - 0x0020: 0001 0050 da70 377a a3a9 3758 8a4a 8011 - 0x0030: 2000 1735 0000 0101 080a 4ddc 9723 4ddc - 0x0040: 9721 -22:57:37.230900 IP 127.0.0.1.55920 > 127.0.0.1.80: Flags [.], ack 5561, win 12383, options [nop,nop,TS val 1306302243 ecr 1306302243], length 0 - 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 - 0x0010: 0034 1b72 4000 4006 2150 7f00 0001 7f00 - 0x0020: 0001 da70 0050 3758 8a4a 377a a3aa 8010 - 0x0030: 305f 06d4 0000 0101 080a 4ddc 9723 4ddc - 0x0040: 9723 diff --git a/contrib/tcpdump/tests/rsvp-infinite-loop.pcap b/contrib/tcpdump/tests/rsvp-infinite-loop.pcap deleted file mode 100644 index dc03dacc8b1..00000000000 Binary files a/contrib/tcpdump/tests/rsvp-infinite-loop.pcap and /dev/null differ diff --git a/contrib/tcpdump/udp.h b/contrib/tcpdump/udp.h index fb45d68f7be..ad1d8506dde 100644 --- a/contrib/tcpdump/udp.h +++ b/contrib/tcpdump/udp.h @@ -90,4 +90,6 @@ struct udphdr { #define RIPNG_PORT 521 /*XXX*/ #define DHCP6_SERV_PORT 546 /*XXX*/ #define DHCP6_CLI_PORT 547 /*XXX*/ +#define BABEL_PORT 6696 +#define BABEL_PORT_OLD 6697 #endif diff --git a/contrib/telnet/telnet/telnet.1 b/contrib/telnet/telnet/telnet.1 index 0acfe78931e..2dce4c51dd5 100644 --- a/contrib/telnet/telnet/telnet.1 +++ b/contrib/telnet/telnet/telnet.1 @@ -344,7 +344,6 @@ Only enough of each command to uniquely identify it need be typed and .Ic display commands). -.Pp .Bl -tag -width "mode type" .It Ic auth Ar argument ... The auth command manipulates the information sent through the @@ -664,7 +663,6 @@ An end of file (in command mode) will also close a session and exit. Sends one or more special character sequences to the remote host. The following are the arguments which may be specified (more than one argument may be specified at a time): -.Pp .Bl -tag -width escape .It Ic abort Sends the diff --git a/contrib/top/display.c b/contrib/top/display.c index 89795c05e4d..e65ae24f528 100644 --- a/contrib/top/display.c +++ b/contrib/top/display.c @@ -66,6 +66,7 @@ char *screenbuf = NULL; static char **procstate_names; static char **cpustate_names; static char **memory_names; +static char **arc_names; static char **swap_names; static int num_procstates; @@ -100,6 +101,8 @@ int x_brkdn = 15; int y_brkdn = 1; int x_mem = 5; int y_mem = 3; +int x_arc = 5; +int y_arc = 4; int x_swap = 6; int y_swap = 4; int y_message = 5; @@ -216,6 +219,8 @@ struct statics *statics; num_memory = string_count(memory_names); lmemory = (int *)malloc(num_memory * sizeof(int)); + arc_names = statics->arc_names; + /* calculate starting columns where needed */ cpustate_total_length = 0; pp = cpustate_names; @@ -626,6 +631,46 @@ int *stats; line_update(memory_buffer, new, x_mem, y_mem); } +/* + * *_arc(stats) - print "ARC: " followed by the ARC summary string + * + * Assumptions: cursor is on "lastline" + * for i_arc ONLY: cursor is on the previous line + */ +char arc_buffer[MAX_COLS]; + +i_arc(stats) + +int *stats; + +{ + if (arc_names == NULL) + return (0); + + fputs("\nARC: ", stdout); + lastline++; + + /* format and print the memory summary */ + summary_format(arc_buffer, stats, arc_names); + fputs(arc_buffer, stdout); +} + +u_arc(stats) + +int *stats; + +{ + static char new[MAX_COLS]; + + if (arc_names == NULL) + return (0); + + /* format the new line */ + summary_format(new, stats, arc_names); + line_update(arc_buffer, new, x_arc, y_arc); +} + + /* * *_swap(stats) - print "Swap: " followed by the swap summary string * diff --git a/contrib/top/layout.h b/contrib/top/layout.h index 1b2564e0a65..a04fce215b0 100644 --- a/contrib/top/layout.h +++ b/contrib/top/layout.h @@ -19,6 +19,8 @@ extern int x_brkdn; /* 15 */ extern int y_brkdn; /* 1 */ extern int x_mem; /* 5 */ extern int y_mem; /* 3 */ +extern int x_arc; /* 5 */ +extern int y_arc; /* 4 */ extern int x_swap; /* 6 */ extern int y_swap; /* 4 */ extern int y_message; /* 5 */ diff --git a/contrib/top/machine.h b/contrib/top/machine.h index 3e1af1609ec..699c7554df0 100644 --- a/contrib/top/machine.h +++ b/contrib/top/machine.h @@ -16,6 +16,7 @@ struct statics char **procstate_names; char **cpustate_names; char **memory_names; + char **arc_names; char **swap_names; #ifdef ORDER char **order_names; @@ -42,6 +43,7 @@ struct system_info int *procstates; int *cpustates; int *memory; + int *arc; int *swap; struct timeval boottime; int ncpus; diff --git a/contrib/top/top.c b/contrib/top/top.c index 50bc9b967b5..c2eb35da1a9 100644 --- a/contrib/top/top.c +++ b/contrib/top/top.c @@ -121,6 +121,8 @@ int i_cpustates(); int u_cpustates(); int i_memory(); int u_memory(); +int i_arc(); +int u_arc(); int i_swap(); int u_swap(); int i_message(); @@ -135,6 +137,7 @@ int (*d_loadave)() = i_loadave; int (*d_procstates)() = i_procstates; int (*d_cpustates)() = i_cpustates; int (*d_memory)() = i_memory; +int (*d_arc)() = i_arc; int (*d_swap)() = i_swap; int (*d_message)() = i_message; int (*d_header)() = i_header; @@ -647,6 +650,7 @@ restart: /* display memory stats */ (*d_memory)(system_info.memory); + (*d_arc)(system_info.arc); /* display swap stats */ (*d_swap)(system_info.swap); @@ -712,6 +716,7 @@ restart: d_procstates = u_procstates; d_cpustates = u_cpustates; d_memory = u_memory; + d_arc = u_arc; d_swap = u_swap; d_message = u_message; d_header = u_header; @@ -1129,6 +1134,7 @@ reset_display() d_procstates = i_procstates; d_cpustates = i_cpustates; d_memory = i_memory; + d_arc = i_arc; d_swap = i_swap; d_message = i_message; d_header = i_header; diff --git a/contrib/traceroute/traceroute.8 b/contrib/traceroute/traceroute.8 index 9d54bc6d2c9..654b538536c 100644 --- a/contrib/traceroute/traceroute.8 +++ b/contrib/traceroute/traceroute.8 @@ -16,113 +16,64 @@ .\" $Id: traceroute.8,v 1.19 2000/09/21 08:44:19 leres Exp $ .\" $FreeBSD$ .\" -.TH TRACEROUTE 8 "19 February 2008" -.UC 6 -.SH NAME -traceroute \- print the route packets take to network host -.SH SYNOPSIS -.na -.B traceroute -[ -.B \-adDeFISnrvx -] [ -.B \-f -.I first_ttl -] [ -.B \-g -.I gateway -] -.br -.ti +8 -[ -.B \-i -.I iface -] [ -.B \-M -.I first_ttl -] -.br -.ti +8 -[ -.B \-m -.I max_ttl -] [ -.B \-P -.I proto -] [ -.B \-p -.I port -] -.br -.ti +8 -[ -.B \-q -.I nqueries -] [ -.B \-s -.I src_addr -] [ -.B \-t -.I tos -] -.br -.ti +8 -[ -.B \-w -.I waittime -] [ -.B \-A -.I as_server -] [ -.B \-z -.I pausemsecs -] -.br -.ti +8 -.I host -[ -.I packetlen -] -.ad -.SH DESCRIPTION +.Dd June 19, 2012 +.Dt TRACEROUTE 8 +.Os +.Sh NAME +.Nm traceroute +.Nd "print the route packets take to network host" +.Sh SYNOPSIS +.Nm +.Bk -words +.Op Fl adDeFISnrvx +.Op Fl f Ar first_ttl +.Op Fl g Ar gateway +.Op Fl M Ar first_ttl +.Op Fl m Ar max_ttl +.Op Fl P Ar proto +.Op Fl p Ar port +.Op Fl q Ar nqueries +.Op Fl s Ar src_addr +.Op Fl t Ar tos +.Op Fl w Ar waittime +.Op Fl A Ar as_server +.Op Fl z Ar pausemsecs +.Ar host +.Op Ar packetlen +.Ek +.Sh DESCRIPTION The Internet is a large and complex aggregation of network hardware, connected together by gateways. Tracking the route one's packets follow (or finding the miscreant gateway that's discarding your packets) can be difficult. -.I Traceroute +.Nm utilizes the IP protocol `time to live' field and attempts to elicit an ICMP TIME_EXCEEDED response from each gateway along the path to some host. -.PP +.Pp The only mandatory parameter is the destination host name or IP number. The default probe datagram length is 40 bytes, but this may be increased by specifying a packet length (in bytes) after the destination host name. -.PP +.Pp Other options are: -.TP -.B \-a +.Bl -tag -width Ds +.It Fl a Turn on AS# lookups for each hop encountered. -.TP -.B -A +.It Fl A Ar as_server Turn on AS# lookups and use the given server instead of the default. -.TP -.B \-e +.It Fl e Firewall evasion mode. Use fixed destination ports for UDP and TCP probes. The destination port does NOT increment with each packet sent. -.TP -.B \-f +.It Fl f Ar first_ttl Set the initial time-to-live used in the first outgoing probe packet. -.TP -.B \-F +.It Fl F Set the "don't fragment" bit. -.TP -.B \-d +.It Fl d Enable socket level debugging. -.TP -.B \-D +.It Fl D When an ICMP response to our probe datagram is received, print the differences between the transmitted packet and the packet quoted by the ICMP response. @@ -133,74 +84,66 @@ Bytes that are unchanged in the quoted packet are shown as underscores. Note, the IP checksum and the TTL of the quoted packet are not expected to match. By default, only one probe per hop is sent with this option. -.TP -.B \-g +.It Fl g Ar gateway Specify a loose source route gateway (8 maximum). -.TP -.B \-i +.It Fl i Ar iface Specify a network interface to obtain the source IP address for outgoing probe packets. This is normally only useful on a multi-homed host. (See the -.B \-s +.Fl s flag for another way to do this.) -.TP -.B \-I +.It Fl I Use ICMP ECHO instead of UDP datagrams. (A synonym for "-P icmp"). -.TP -.B \-M +.It Fl M Ar first_ttl Set the initial time-to-live value used in outgoing probe packets. The default is 1, i.e., start with the first hop. -.TP -.B \-m +.It Fl m Ar max_ttl Set the max time-to-live (max number of hops) used in outgoing probe -packets. The default is -.I net.inet.ip.ttl -hops (the same default used for TCP +packets. The default is the value of the +.Va net.inet.ip.ttl +.Xr sysctl 8 +(the same default used for TCP connections). -.TP -.B \-n +.It Fl n Print hop addresses numerically rather than symbolically and numerically (saves a nameserver address-to-name lookup for each gateway found on the path). -.TP -.B \-P +.It Fl P Ar proto Send packets of specified IP protocol. The currently supported protocols are: UDP, TCP, GRE and ICMP. Other protocols may also be specified (either by name or by number), though -.I traceroute +.Nm does not implement any special knowledge of their packet formats. This option is useful for determining which router along a path may be blocking packets based on IP protocol number. But see BUGS below. -.TP -.B \-p +.It Fl p Ar port Protocol specific. For UDP and TCP, sets -the base port number used in probes (default is 33434). +the base +.Ar port +number used in probes (default is 33434). Traceroute hopes that nothing is listening on UDP ports -.I base +.Em base to -.I base + nhops * nprobes - 1 +.Em base + nhops * nprobes - 1 at the destination host (so an ICMP PORT_UNREACHABLE message will be returned to terminate the route tracing). If something is listening on a port in the default range, this option can be used to pick an unused port range. -.TP -.B \-q +.It Fl q Ar nqueries Set the number of probes per hop (default is 3, unless -.B -D +.Fl D is specified, when it is 1). -.TP -.B \-r +.It Fl r Bypass the normal routing tables and send directly to a host on an attached network. If the host is not on a directly-attached network, an error is returned. This option can be used to ping a local host through an interface that has no route through it (e.g., after the interface was dropped by -.IR routed (8C)). -.TP -.B \-s +.Xr routed 8 . +.It Fl s Ar src_addr Use the following IP address (which usually is given as an IP number, not a hostname) as the source address in outgoing probe packets. On multi-homed hosts (those with more than one IP @@ -209,15 +152,13 @@ force the source address to be something other than the IP address of the interface the probe packet is sent on. If the IP address is not one of this machine's interface addresses, an error is returned and nothing is sent. (See the -.B \-i +.Fl i flag for another way to do this.) -.TP -.B \-S +.It Fl S Print a summary of how many probes were not answered for each hop. -.TP -.B \-t +.It Fl t Ar tos Set the -.I type-of-service +.Em type-of-service in probe packets to the following value (default zero). The value must be a decimal integer in the range 0 to 255. This option can be used to see if different types-of-service result in different paths. (If you @@ -226,72 +167,69 @@ services like telnet and ftp don't let you control the TOS). Not all values of TOS are legal or meaningful \- see the IP spec for definitions. Useful values are probably -.RB ` -t -.IR 16 ' +.Fl t Ar 16 (low delay) and -.RB ` -t -.IR 8 ' +.Fl t Ar 8 (high throughput). -.TP -.B \-v -Verbose output. Received ICMP packets other than TIME_EXCEEDED and -UNREACHABLEs are listed. -.TP -.B \-w +.It Fl v +Verbose output. Received ICMP packets other than +.Dv TIME_EXCEEDED +and +.Dv UNREACHABLE Ns s +are listed. +.It Fl w Ar waittime Set the time (in seconds) to wait for a response to a probe (default 5 sec.). -.TP -.B \-x +.It Fl x Toggle ip checksums. Normally, this prevents traceroute from calculating ip checksums. In some cases, the operating system can overwrite parts of the outgoing packet but not recalculate the checksum (so in some cases the default is to not calculate checksums and using -.B \-x +.Fl x causes them to be calculated). Note that checksums are usually required for the last hop when using ICMP ECHO probes -.RB ( \-I ). +.Pq Fl I . So they are always calculated when using ICMP. -.TP -.B \-z +.It Fl z Ar pausemsecs Set the time (in milliseconds) to pause between probes (default 0). Some systems such as Solaris and routers such as Ciscos rate limit icmp messages. A good value to use with this this is 500 (e.g. 1/2 second). -.PP +.El +.Pp This program attempts to trace the route an IP packet would follow to some internet host by launching UDP probe packets with a small ttl (time to live) then listening for an ICMP "time exceeded" reply from a gateway. We start our probes with a ttl of one and increase by one until we get an ICMP "port unreachable" (which means we got to "host") or hit a max (which -defaults to -.I net.inet.ip.ttl -hops & can be changed with the -.B \-m +defaults to the amount of hops specified by the +.Va net.inet.ip.ttl +.Xr sysctl 8 +and can be changed with the +.Fl m flag). Three probes (change with -.B \-q +.Fl q flag) are sent at each ttl setting and a line is printed showing the ttl, address of the gateway and round trip time of each probe. If the probe answers come from different gateways, the address of each responding system will be printed. If there is no response within a 5 sec. timeout interval (changed with the -.B \-w +.Fl w flag), a "*" is printed for that probe. -.PP +.Pp We don't want the destination host to process the UDP probe packets so the destination port is set to an unlikely value (if some clod on the destination is using that value, it can be changed with the -.B \-p +.Fl p flag). -.PP +.Pp A sample use and output might be: - -.RS -.nf -[yak 71]% traceroute nis.nsf.net. +.Bd -literal -offset 4n +% traceroute nis.nsf.net. traceroute to nis.nsf.net (35.1.1.48), 64 hops max, 38 byte packet 1 helios.ee.lbl.gov (128.3.112.1) 19 ms 19 ms 0 ms 2 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 39 ms 19 ms @@ -304,21 +242,18 @@ traceroute to nis.nsf.net (35.1.1.48), 64 hops max, 38 byte packet 9 129.140.71.6 (129.140.71.6) 139 ms 239 ms 319 ms 10 129.140.81.7 (129.140.81.7) 220 ms 199 ms 199 ms 11 nic.merit.edu (35.1.1.48) 239 ms 239 ms 239 ms -.fi -.RE - +.Ed +.Pp Note that lines 2 & 3 are the same. This is due to a buggy kernel on the 2nd hop system \- lilac-dmc.Berkeley.EDU \- that forwards packets with a zero ttl (a bug in the distributed version of 4.3BSD). Note that you have to guess what path the packets are taking cross-country since the NSFNet (129.140) doesn't supply address-to-name translations for its NSSes. -.PP +.Pp A more interesting example is: - -.RS -.nf -[yak 72]% traceroute allspice.lcs.mit.edu. +.Bd -literal -offset 4n +% traceroute allspice.lcs.mit.edu. traceroute to allspice.lcs.mit.edu (18.26.0.115), 64 hops max 1 helios.ee.lbl.gov (128.3.112.1) 0 ms 0 ms 0 ms 2 lilac-dmc.Berkeley.EDU (128.32.216.1) 19 ms 19 ms 19 ms @@ -338,15 +273,14 @@ traceroute to allspice.lcs.mit.edu (18.26.0.115), 64 hops max 16 * * * 17 * * * 18 ALLSPICE.LCS.MIT.EDU (18.26.0.115) 339 ms 279 ms 279 ms -.fi -.RE - +.Ed +.Pp Note that the gateways 12, 14, 15, 16 & 17 hops away either don't send ICMP "time exceeded" messages or send them with a ttl too small to reach us. 14 \- 17 are running the MIT C Gateway code that doesn't send "time exceeded"s. God only knows what's going on with 12. -.PP +.Pp The silent gateway 12 in the above may be the result of a bug in the 4.[23]BSD network code (and its derivatives): 4.x (x <= 3) sends an unreachable message using whatever ttl remains in the @@ -354,9 +288,7 @@ original datagram. Since, for gateways, the remaining ttl is zero, the ICMP "time exceeded" is guaranteed to not make it back to us. The behavior of this bug is slightly more interesting when it appears on the destination system: - -.RS -.nf +.Bd -literal -offset 4n 1 helios.ee.lbl.gov (128.3.112.1) 0 ms 0 ms 0 ms 2 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 19 ms 39 ms 3 lilac-dmc.Berkeley.EDU (128.32.216.1) 19 ms 39 ms 19 ms @@ -370,9 +302,8 @@ when it appears on the destination system: 11 * * * 12 * * * 13 rip.Berkeley.EDU (128.32.131.22) 59 ms ! 39 ms ! 39 ms ! -.fi -.RE - +.Ed +.Pp Notice that there are 12 "gateways" (13 is the final destination) and exactly the last half of them are "missing". What's really happening is that rip (a Sun-3 running Sun OS3.5) @@ -383,77 +314,82 @@ ICMP's) until we probe with a ttl that's at least twice the path length. I.e., rip is really only 7 hops away. A reply that returns with a ttl of 1 is a clue this problem exists. Traceroute prints a "!" after the time if the ttl is <= 1. -Since vendors ship a lot of obsolete (DEC's Ultrix, Sun 3.x) or -non-standard (HPUX) software, expect to see this problem +Since vendors ship a lot of obsolete +.Pf ( Tn DEC Ns \'s +Ultrix, Sun 3.x) or +non-standard +.Pq Tn HP-UX +software, expect to see this problem frequently and/or take care picking the target host of your probes. - -Other possible annotations after the time are -.BR !H , -.BR !N , -or -.B !P -(host, network or protocol unreachable), -.B !S -(source route failed), -.B !F\- -(fragmentation needed \- the RFC1191 Path MTU Discovery value is displayed), -.B !U -or -.B !W -(destination network/host unknown), -.B !I -(source host is isolated), -.B !A -(communication with destination network administratively prohibited), -.B !Z -(communication with destination host administratively prohibited), -.B !Q -(for this ToS the destination network is unreachable), -.B !T -(for this ToS the destination host is unreachable), -.B !X -(communication administratively prohibited), -.B !V -(host precedence violation), -.B !C -(precedence cutoff in effect), or -.B ! -(ICMP unreachable code ). +.Pp +Other possible annotations after the time are: +.Bl -hang -offset indent -width 12n +.It Sy !H +Host unreachable. +.It Sy !N +Network unreachable. +.It Sy !P +Protocol unreachable. +.It Sy !S +Source route failed. +.It Sy !F\- +Fragmentation needed. +The RFC1191 Path MTU Discovery value is displayed. +.It Sy !U +Destination network unknown. +.It Sy !W +Destination host unknown. +.It Sy !I +Source host is isolated. +.It Sy !A +Communication with destination network administratively prohibited. +.It Sy !Z +Communication with destination host administratively prohibited. +.It Sy !Q +For this ToS the destination network is unreachable. +.It Sy !T +For this ToS the destination host is unreachable. +.It Sy !X +Communication administratively prohibited. +.It Sy !V +Host precedence violation. +.It Sy !C +Precedence cutoff in effect. +.It Sy ! +ICMP unreachable code . +.El +.Pp These are defined by RFC1812 (which supersedes RFC1716). -If almost all the probes result in some kind of unreachable, traceroute +If almost all the probes result in some kind of unreachable, +.Nm will give up and exit. -.PP +.Pp This program is intended for use in network testing, measurement and management. It should be used primarily for manual fault isolation. Because of the load it could impose on the network, it is unwise to use -.I traceroute +.Nm during normal operations or from automated scripts. -.SH SEE ALSO -pathchar(8), netstat(1), ping(8) -.SH AUTHOR +.Sh SEE ALSO +.Xr netstat 1 , +.Xr ping 8 , +.Xr ping6 8 , +.Xr traceroute6 8 . +.Sh AUTHORS Implemented by Van Jacobson from a suggestion by Steve Deering. Debugged by a cast of thousands with particularly cogent suggestions or fixes from C. Philip Wood, Tim Seaver and Ken Adelman. -.LP -The current version is available via anonymous ftp: -.LP -.RS -.I ftp://ftp.ee.lbl.gov/traceroute.tar.gz -.RE -.SH BUGS +.Sh BUGS When using protocols other than UDP, functionality is reduced. In particular, the last packet will often appear to be lost, because even though it reaches the destination host, there's no way to know that because no ICMP message is sent back. In the TCP case, -.I traceroute +.Nm should listen for a RST from the destination host (or an intermediate router that's filtering packets), but this is not implemented yet. -.PP -Please send bug reports to traceroute@ee.lbl.gov. -.PP +.Pp The AS number capability reports information that may sometimes be inaccurate due to discrepancies between the contents of the routing database server and the current state of the Internet. diff --git a/contrib/traceroute/traceroute.c b/contrib/traceroute/traceroute.c index 1c98262bacf..63cefa1c421 100644 --- a/contrib/traceroute/traceroute.c +++ b/contrib/traceroute/traceroute.c @@ -1406,8 +1406,7 @@ tcp_prep(struct outdata *outdata) tcp->th_sport = htons(ident); tcp->th_dport = htons(port + (fixedPort ? 0 : outdata->seq)); - tcp->th_seq = (tcp->th_sport << 16) | (tcp->th_dport + - (fixedPort ? outdata->seq : 0)); + tcp->th_seq = (tcp->th_sport << 16) | tcp->th_dport; tcp->th_ack = 0; tcp->th_off = 5; tcp->th_flags = TH_SYN; @@ -1425,8 +1424,8 @@ tcp_check(const u_char *data, int seq) struct tcphdr *const tcp = (struct tcphdr *) data; return (ntohs(tcp->th_sport) == ident - && ntohs(tcp->th_dport) == port + (fixedPort ? 0 : seq)) - && tcp->th_seq == (((tcp_seq)ident << 16) | (port + seq)); + && ntohs(tcp->th_dport) == port + (fixedPort ? 0 : seq) + && tcp->th_seq == (tcp_seq)((tcp->th_sport << 16) | tcp->th_dport)); } void diff --git a/crypto/openssh/ssh-keyscan.1 b/crypto/openssh/ssh-keyscan.1 index dbb0d7da6d2..ebc2e3f5fec 100644 --- a/crypto/openssh/ssh-keyscan.1 +++ b/crypto/openssh/ssh-keyscan.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keyscan.1,v 1.29 2010/08/31 11:54:45 djm Exp $ +.\" $OpenBSD: ssh-keyscan.1,v 1.30 2012/04/11 13:34:17 djm Exp $ .\" $FreeBSD$ .\" .\" Copyright 1995, 1996 by David Mazieres . @@ -7,7 +7,7 @@ .\" permitted provided that due credit is given to the author and the .\" OpenBSD project by leaving this copyright notice intact. .\" -.Dd August 31, 2010 +.Dd April 11 2012 .Dt SSH-KEYSCAN 1 .Os .Sh NAME @@ -95,8 +95,11 @@ or .Dq rsa for protocol version 2. Multiple values may be specified by separating them with commas. -The default is -.Dq rsa . +The default is to fetch +.Dq rsa +and +.Dq ecdsa +keys. .It Fl v Verbose mode. Causes diff --git a/crypto/openssh/ssh-keyscan.c b/crypto/openssh/ssh-keyscan.c index b085dd41703..c9de130f46e 100644 --- a/crypto/openssh/ssh-keyscan.c +++ b/crypto/openssh/ssh-keyscan.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keyscan.c,v 1.85 2011/03/15 10:36:02 okan Exp $ */ +/* $OpenBSD: ssh-keyscan.c,v 1.86 2012/04/11 13:34:17 djm Exp $ */ /* * Copyright 1995, 1996 by David Mazieres . * @@ -57,7 +57,7 @@ int ssh_port = SSH_DEFAULT_PORT; #define KT_RSA 4 #define KT_ECDSA 8 -int get_keytypes = KT_RSA; /* Get only RSA keys by default */ +int get_keytypes = KT_RSA|KT_ECDSA;/* Get RSA and ECDSA keys by default */ int hash_hosts = 0; /* Hash hostname on output */ diff --git a/crypto/openssh/ssh.c b/crypto/openssh/ssh.c index 21fe19bf5db..ed3ab926ac7 100644 --- a/crypto/openssh/ssh.c +++ b/crypto/openssh/ssh.c @@ -437,7 +437,8 @@ main(int ac, char **av) /* FALLTHROUGH */ case 'V': fprintf(stderr, "%s, %s\n", - SSH_RELEASE, SSLeay_version(SSLEAY_VERSION)); + ssh_version_get(options.hpn_disabled), + SSLeay_version(SSLEAY_VERSION)); if (opt == 'V') exit(0); break; diff --git a/crypto/openssh/sshconnect.c b/crypto/openssh/sshconnect.c index 042f2a62431..f07317890ea 100644 --- a/crypto/openssh/sshconnect.c +++ b/crypto/openssh/sshconnect.c @@ -585,7 +585,7 @@ ssh_exchange_identification(int timeout_ms) snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s%s", compat20 ? PROTOCOL_MAJOR_2 : PROTOCOL_MAJOR_1, compat20 ? PROTOCOL_MINOR_2 : minor1, - SSH_RELEASE, compat20 ? "\r\n" : "\n"); + ssh_version_get(options.hpn_disabled), compat20 ? "\r\n" : "\n"); if (roaming_atomicio(vwrite, connection_out, buf, strlen(buf)) != strlen(buf)) fatal("write: %.100s", strerror(errno)); diff --git a/crypto/openssh/sshd.c b/crypto/openssh/sshd.c index 7851a6cfe3b..fa79b6306a2 100644 --- a/crypto/openssh/sshd.c +++ b/crypto/openssh/sshd.c @@ -431,7 +431,7 @@ sshd_exchange_identification(int sock_in, int sock_out) minor = PROTOCOL_MINOR_1; } snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s%s", major, minor, - SSH_RELEASE, newline); + ssh_version_get(options.hpn_disabled), newline); server_version_string = xstrdup(buf); /* Send our protocol version identification. */ @@ -894,7 +894,7 @@ static void usage(void) { fprintf(stderr, "%s, %s\n", - SSH_RELEASE, SSLeay_version(SSLEAY_VERSION)); + ssh_version_get(0), SSLeay_version(SSLEAY_VERSION)); fprintf(stderr, "usage: sshd [-46DdeiqTt] [-b bits] [-C connection_spec] [-c host_cert_file]\n" " [-f config_file] [-g login_grace_time] [-h host_key_file]\n" @@ -1583,7 +1583,7 @@ main(int ac, char **av) exit(1); } - debug("sshd version %.100s", SSH_RELEASE); + debug("sshd version %.100s", ssh_version_get(options.hpn_disabled)); /* Store privilege separation user for later use if required. */ if ((privsep_pw = getpwnam(SSH_PRIVSEP_USER)) == NULL) { diff --git a/crypto/openssh/version.c b/crypto/openssh/version.c index 3cb4b7a13ab..2f467949cde 100644 --- a/crypto/openssh/version.c +++ b/crypto/openssh/version.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2001 Brian Fundakowski Feldman + * Copyright (c) 2012 Eygene Ryabinkin * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,30 +36,60 @@ __RCSID("$FreeBSD$"); static char *version = NULL; +/* NULL means "use default value", empty string means "unset" */ +static const char *addendum = NULL; +static unsigned char update_version = 1; +/* + * Constructs the version string if it is empty or needs updating. + * + * HPN patch we're running requires both parties + * to have the "hpn" string inside the advertized version + * (see compat.c::compat_datafellows), so we should + * include it to the generated string if HPN is enabled. + */ const char * -ssh_version_get(void) { +ssh_version_get(int hpn_disabled) +{ + const char *hpn = NULL, *add = NULL; + char *newvers = NULL; + size_t size = 0; + + if (version != NULL && !update_version) + return (version); + + hpn = (hpn_disabled ? NULL : SSH_VERSION_HPN); + add = (addendum == NULL ? SSH_VERSION_ADDENDUM : + (addendum[0] == '\0' ? NULL : addendum)); + + size = strlen(SSH_VERSION_BASE) + (hpn ? strlen(hpn) : 0) + + (add ? strlen(add) + 1 : 0) + 1; + newvers = xmalloc(size); + strcpy(newvers, SSH_VERSION_BASE); + if (hpn) + strcat(newvers, hpn); + if (add) { + strcat(newvers, " "); + strcat(newvers, add); + } + + if (version) + xfree(version); + version = newvers; + update_version = 0; - if (version == NULL) - version = xstrdup(SSH_VERSION); return (version); } void -ssh_version_set_addendum(const char *add) { - char *newvers; - size_t size; +ssh_version_set_addendum(const char *add) +{ + if (add && addendum && !strcmp(add, addendum)) + return; - if (add != NULL) { - size = strlen(SSH_VERSION_BASE) + strlen(SSH_VERSION_HPN) + 1 + - strlen(add) + 1; - newvers = xmalloc(size); - snprintf(newvers, size, "%s %s", SSH_VERSION_BASE, - SSH_VERSION_HPN, add); - } else { - newvers = xstrdup(SSH_VERSION_BASE SSH_VERSION_HPN); - } - if (version != NULL) - xfree(version); - version = newvers; + if (addendum) + xfree((void *)addendum); + addendum = (add ? xstrdup(add) : xstrdup("")); + + update_version = 1; } diff --git a/crypto/openssh/version.h b/crypto/openssh/version.h index 3eb10fc4ffc..129aad419b8 100644 --- a/crypto/openssh/version.h +++ b/crypto/openssh/version.h @@ -1,13 +1,13 @@ /* $OpenBSD: version.h,v 1.62 2011/08/02 23:13:01 djm Exp $ */ /* $FreeBSD$ */ -#ifndef SSH_VERSION +#ifndef _VERSION_H_ +#define _VERSION_H_ + #define SSH_VERSION_BASE "OpenSSH_5.9p1" #define SSH_VERSION_ADDENDUM "FreeBSD-20111001" #define SSH_VERSION_HPN "_hpn13v11" -#define SSH_VERSION SSH_VERSION_BASE SSH_VERSION_HPN " " SSH_VERSION_ADDENDUM -#define SSH_RELEASE (ssh_version_get()) -const char *ssh_version_get(void); +const char *ssh_version_get(int hpn_disabled); void ssh_version_set_addendum(const char *); -#endif /* SSH_VERSION */ +#endif /* _VERSION_H_ */ diff --git a/crypto/openssl/CHANGES b/crypto/openssl/CHANGES index 55820dbf735..e914a426ed4 100644 --- a/crypto/openssl/CHANGES +++ b/crypto/openssl/CHANGES @@ -2,6 +2,142 @@ OpenSSL CHANGES _______________ + Changes between 0.9.8w and 0.9.8x [10 May 2012] + + *) Sanity check record length before skipping explicit IV in DTLS + to fix DoS attack. + + Thanks to Codenomicon for discovering this issue using Fuzz-o-Matic + fuzzing as a service testing platform. + (CVE-2012-2333) + [Steve Henson] + + *) Initialise tkeylen properly when encrypting CMS messages. + Thanks to Solar Designer of Openwall for reporting this issue. + [Steve Henson] + + Changes between 0.9.8v and 0.9.8w [23 Apr 2012] + + *) The fix for CVE-2012-2110 did not take into account that the + 'len' argument to BUF_MEM_grow and BUF_MEM_grow_clean is an + int in OpenSSL 0.9.8, making it still vulnerable. Fix by + rejecting negative len parameter. (CVE-2012-2131) + [Tomas Hoger ] + + Changes between 0.9.8u and 0.9.8v [19 Apr 2012] + + *) Check for potentially exploitable overflows in asn1_d2i_read_bio + BUF_mem_grow and BUF_mem_grow_clean. Refuse attempts to shrink buffer + in CRYPTO_realloc_clean. + + Thanks to Tavis Ormandy, Google Security Team, for discovering this + issue and to Adam Langley for fixing it. + (CVE-2012-2110) + [Adam Langley (Google), Tavis Ormandy, Google Security Team] + + Changes between 0.9.8t and 0.9.8u [12 Mar 2012] + + *) Fix MMA (Bleichenbacher's attack on PKCS #1 v1.5 RSA padding) weakness + in CMS and PKCS7 code. When RSA decryption fails use a random key for + content decryption and always return the same error. Note: this attack + needs on average 2^20 messages so it only affects automated senders. The + old behaviour can be reenabled in the CMS code by setting the + CMS_DEBUG_DECRYPT flag: this is useful for debugging and testing where + an MMA defence is not necessary. + Thanks to Ivan Nestlerode for discovering + this issue. (CVE-2012-0884) + [Steve Henson] + + *) Fix CVE-2011-4619: make sure we really are receiving a + client hello before rejecting multiple SGC restarts. Thanks to + Ivan Nestlerode for discovering this bug. + [Steve Henson] + + Changes between 0.9.8s and 0.9.8t [18 Jan 2012] + + *) Fix for DTLS DoS issue introduced by fix for CVE-2011-4109. + Thanks to Antonio Martin, Enterprise Secure Access Research and + Development, Cisco Systems, Inc. for discovering this bug and + preparing a fix. (CVE-2012-0050) + [Antonio Martin] + + Changes between 0.9.8r and 0.9.8s [4 Jan 2012] + + *) Nadhem Alfardan and Kenny Paterson have discovered an extension + of the Vaudenay padding oracle attack on CBC mode encryption + which enables an efficient plaintext recovery attack against + the OpenSSL implementation of DTLS. Their attack exploits timing + differences arising during decryption processing. A research + paper describing this attack can be found at: + http://www.isg.rhul.ac.uk/~kp/dtls.pdf + Thanks go to Nadhem Alfardan and Kenny Paterson of the Information + Security Group at Royal Holloway, University of London + (www.isg.rhul.ac.uk) for discovering this flaw and to Robin Seggelmann + and Michael Tuexen + for preparing the fix. (CVE-2011-4108) + [Robin Seggelmann, Michael Tuexen] + + *) Stop policy check failure freeing same buffer twice. (CVE-2011-4109) + [Ben Laurie, Kasper ] + + *) Clear bytes used for block padding of SSL 3.0 records. + (CVE-2011-4576) + [Adam Langley (Google)] + + *) Only allow one SGC handshake restart for SSL/TLS. Thanks to George + Kadianakis for discovering this issue and + Adam Langley for preparing the fix. (CVE-2011-4619) + [Adam Langley (Google)] + + *) Prevent malformed RFC3779 data triggering an assertion failure. + Thanks to Andrew Chi, BBN Technologies, for discovering the flaw + and Rob Austein for fixing it. (CVE-2011-4577) + [Rob Austein ] + + *) Fix ssl_ciph.c set-up race. + [Adam Langley (Google)] + + *) Fix spurious failures in ecdsatest.c. + [Emilia Käsper (Google)] + + *) Fix the BIO_f_buffer() implementation (which was mixing different + interpretations of the '..._len' fields). + [Adam Langley (Google)] + + *) Fix handling of BN_BLINDING: now BN_BLINDING_invert_ex (rather than + BN_BLINDING_invert_ex) calls BN_BLINDING_update, ensuring that concurrent + threads won't reuse the same blinding coefficients. + + This also avoids the need to obtain the CRYPTO_LOCK_RSA_BLINDING + lock to call BN_BLINDING_invert_ex, and avoids one use of + BN_BLINDING_update for each BN_BLINDING structure (previously, + the last update always remained unused). + [Emilia Käsper (Google)] + + *) Fix SSL memory handling for (EC)DH ciphersuites, in particular + for multi-threaded use of ECDH. + [Adam Langley (Google)] + + *) Fix x509_name_ex_d2i memory leak on bad inputs. + [Bodo Moeller] + + *) Add protection against ECDSA timing attacks as mentioned in the paper + by Billy Bob Brumley and Nicola Tuveri, see: + + http://eprint.iacr.org/2011/232.pdf + + [Billy Bob Brumley and Nicola Tuveri] + + Changes between 0.9.8q and 0.9.8r [8 Feb 2011] + + *) Fix parsing of OCSP stapling ClientHello extension. CVE-2011-0014 + [Neel Mehta, Adam Langley, Bodo Moeller (Google)] + + *) Fix bug in string printing code: if *any* escaping is enabled we must + escape the escape character (backslash) or the resulting string is + ambiguous. + [Steve Henson] + Changes between 0.9.8p and 0.9.8q [2 Dec 2010] *) Disable code workaround for ancient and obsolete Netscape browsers diff --git a/crypto/openssl/Configure b/crypto/openssl/Configure index e94f7f068be..ec87f24f343 100755 --- a/crypto/openssl/Configure +++ b/crypto/openssl/Configure @@ -371,6 +371,9 @@ my %table=( "linux-alpha-ccc","ccc:-fast -readonly_strings -DL_ENDIAN -DTERMIO::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${no_asm}", "linux-alpha+bwx-ccc","ccc:-fast -readonly_strings -DL_ENDIAN -DTERMIO::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${no_asm}", +# Android: Linux but without -DTERMIO and pointers to headers and libs. +"android","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", + #### *BSD [do see comment about ${BSDthreads} above!] "BSD-generic32","gcc:-DTERMIOS -O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", "BSD-x86", "gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_out_asm}:dlfcn:bsd-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", diff --git a/crypto/openssl/FAQ b/crypto/openssl/FAQ index 50e9314082b..bb6f7e2d297 100644 --- a/crypto/openssl/FAQ +++ b/crypto/openssl/FAQ @@ -10,6 +10,7 @@ OpenSSL - Frequently Asked Questions * Why aren't tools like 'autoconf' and 'libtool' used? * What is an 'engine' version? * How do I check the authenticity of the OpenSSL distribution? +* How does the versioning scheme work? [LEGAL] Legal questions @@ -82,7 +83,7 @@ OpenSSL - Frequently Asked Questions * Which is the current version of OpenSSL? The current version is available from . -OpenSSL 1.0.0c was released on Dec 2nd, 2010. +OpenSSL 1.0.1c was released on May 10th, 2012. In addition to the current stable release, you can also access daily snapshots of the OpenSSL development version at . Note that the online documents refer to the very latest development versions of OpenSSL and may include features not present in released versions. If in doubt refer to the documentation -that came with the version of OpenSSL you are using. +that came with the version of OpenSSL you are using. The pod format +documentation is included in each OpenSSL distribution under the docs +directory. For information on parts of libcrypto that are not yet documented, you might want to read Ariel Glenn's documentation on SSLeay 0.9, OpenSSL's @@ -173,6 +176,19 @@ just do: pgp TARBALL.asc +* How does the versioning scheme work? + +After the release of OpenSSL 1.0.0 the versioning scheme changed. Letter +releases (e.g. 1.0.1a) can only contain bug and security fixes and no +new features. Minor releases change the last number (e.g. 1.0.2) and +can contain new features that retain binary compatibility. Changes to +the middle number are considered major releases and neither source nor +binary compatibility is guaranteed. + +Therefore the answer to the common question "when will feature X be +backported to OpenSSL 1.0.0/0.9.8?" is "never" but it could appear +in the next minor release. + [LEGAL] ======================================================================= * Do I need patent licenses to use OpenSSL? @@ -284,7 +300,7 @@ current directory in this case, but this has changed with 0.9.6a.) Check out the CA.pl(1) manual page. This provides a simple wrapper round the 'req', 'verify', 'ca' and 'pkcs12' utilities. For finer control check out the manual pages for the individual utilities and the certificate -extensions documentation (currently in doc/openssl.txt). +extensions documentation (in ca(1), req(1), x509v3_config(5) ) * Why can't I create certificate requests? diff --git a/crypto/openssl/LICENSE b/crypto/openssl/LICENSE index a2c4adcbe6a..e47d101f102 100644 --- a/crypto/openssl/LICENSE +++ b/crypto/openssl/LICENSE @@ -12,7 +12,7 @@ --------------- /* ==================================================================== - * Copyright (c) 1998-2008 The OpenSSL Project. All rights reserved. + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/crypto/openssl/Makefile b/crypto/openssl/Makefile index 1d0d2a0ee78..7fcc154ef81 100644 --- a/crypto/openssl/Makefile +++ b/crypto/openssl/Makefile @@ -4,7 +4,7 @@ ## Makefile for OpenSSL ## -VERSION=0.9.8q +VERSION=0.9.8x MAJOR=0 MINOR=9.8 SHLIB_VERSION_NUMBER=0.9.8 diff --git a/crypto/openssl/NEWS b/crypto/openssl/NEWS index df190f815e6..b36d1d8e463 100644 --- a/crypto/openssl/NEWS +++ b/crypto/openssl/NEWS @@ -5,6 +5,40 @@ This file gives a brief overview of the major changes between each OpenSSL release. For more details please read the CHANGES file. + Major changes between OpenSSL 0.9.8w and OpenSSL 0.9.8x: + + o Fix DTLS record length checking bug CVE-2012-2333 + + Major changes between OpenSSL 0.9.8v and OpenSSL 0.9.8w: + + o Fix for CVE-2012-2131 (corrected fix for 0.9.8 and CVE-2012-2110) + + Major changes between OpenSSL 0.9.8u and OpenSSL 0.9.8v: + + o Fix for ASN1 overflow bug CVE-2012-2110 + + Major changes between OpenSSL 0.9.8t and OpenSSL 0.9.8u: + + o Fix for CMS/PKCS#7 MMA CVE-2012-0884 + o Corrected fix for CVE-2011-4619 + o Various DTLS fixes. + + Major changes between OpenSSL 0.9.8s and OpenSSL 0.9.8t: + + o Fix for DTLS DoS issue CVE-2012-0050 + + Major changes between OpenSSL 0.9.8r and OpenSSL 0.9.8s: + + o Fix for DTLS plaintext recovery attack CVE-2011-4108 + o Fix policy check double free error CVE-2011-4109 + o Clear block padding bytes of SSL 3.0 records CVE-2011-4576 + o Only allow one SGC handshake restart for SSL/TLS CVE-2011-4619 + o Check for malformed RFC3779 data CVE-2011-4577 + + Major changes between OpenSSL 0.9.8q and OpenSSL 0.9.8r: + + o Fix for security issue CVE-2011-0014 + Major changes between OpenSSL 0.9.8p and OpenSSL 0.9.8q: o Fix for security issue CVE-2010-4180 @@ -181,6 +215,11 @@ o Added initial support for Win64. o Added alternate pkg-config files. + Major changes between OpenSSL 0.9.7l and OpenSSL 0.9.7m: + + o FIPS 1.1.1 module linking. + o Various ciphersuite selection fixes. + Major changes between OpenSSL 0.9.7k and OpenSSL 0.9.7l: o Introduce limits to prevent malicious key DoS (CVE-2006-2940) diff --git a/crypto/openssl/README b/crypto/openssl/README index 5b015b6bbe0..fea38533670 100644 --- a/crypto/openssl/README +++ b/crypto/openssl/README @@ -1,7 +1,7 @@ - OpenSSL 0.9.8q 2 Dec 2010 + OpenSSL 0.9.8x 10 May 2012 - Copyright (c) 1998-2009 The OpenSSL Project + Copyright (c) 1998-2011 The OpenSSL Project Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson All rights reserved. diff --git a/crypto/openssl/apps/Makefile b/crypto/openssl/apps/Makefile index a54881542f1..e33ad2b613a 100644 --- a/crypto/openssl/apps/Makefile +++ b/crypto/openssl/apps/Makefile @@ -176,720 +176,703 @@ progs.h: progs.pl app_rand.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h app_rand.o: ../include/openssl/buffer.h ../include/openssl/conf.h app_rand.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -app_rand.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -app_rand.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -app_rand.o: ../include/openssl/evp.h ../include/openssl/fips.h -app_rand.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -app_rand.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -app_rand.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -app_rand.o: ../include/openssl/ossl_typ.h ../include/openssl/pkcs7.h -app_rand.o: ../include/openssl/rand.h ../include/openssl/safestack.h -app_rand.o: ../include/openssl/sha.h ../include/openssl/stack.h -app_rand.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -app_rand.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -app_rand.o: ../include/openssl/x509v3.h app_rand.c apps.h +app_rand.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +app_rand.o: ../include/openssl/engine.h ../include/openssl/evp.h +app_rand.o: ../include/openssl/fips.h ../include/openssl/lhash.h +app_rand.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +app_rand.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +app_rand.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +app_rand.o: ../include/openssl/pkcs7.h ../include/openssl/rand.h +app_rand.o: ../include/openssl/safestack.h ../include/openssl/sha.h +app_rand.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +app_rand.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +app_rand.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h +app_rand.o: app_rand.c apps.h apps.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h apps.o: ../include/openssl/bn.h ../include/openssl/buffer.h apps.o: ../include/openssl/conf.h ../include/openssl/crypto.h apps.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -apps.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -apps.o: ../include/openssl/engine.h ../include/openssl/err.h -apps.o: ../include/openssl/evp.h ../include/openssl/fips.h -apps.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -apps.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -apps.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -apps.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -apps.o: ../include/openssl/pem2.h ../include/openssl/pkcs12.h -apps.o: ../include/openssl/pkcs7.h ../include/openssl/rsa.h -apps.o: ../include/openssl/safestack.h ../include/openssl/sha.h -apps.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -apps.o: ../include/openssl/txt_db.h ../include/openssl/ui.h -apps.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -apps.o: ../include/openssl/x509v3.h apps.c apps.h +apps.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +apps.o: ../include/openssl/err.h ../include/openssl/evp.h +apps.o: ../include/openssl/fips.h ../include/openssl/lhash.h +apps.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +apps.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +apps.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +apps.o: ../include/openssl/pem.h ../include/openssl/pem2.h +apps.o: ../include/openssl/pkcs12.h ../include/openssl/pkcs7.h +apps.o: ../include/openssl/rsa.h ../include/openssl/safestack.h +apps.o: ../include/openssl/sha.h ../include/openssl/stack.h +apps.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h +apps.o: ../include/openssl/ui.h ../include/openssl/x509.h +apps.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.c apps.h asn1pars.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h asn1pars.o: ../include/openssl/buffer.h ../include/openssl/conf.h asn1pars.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -asn1pars.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -asn1pars.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -asn1pars.o: ../include/openssl/err.h ../include/openssl/evp.h -asn1pars.o: ../include/openssl/fips.h ../include/openssl/lhash.h -asn1pars.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -asn1pars.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -asn1pars.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -asn1pars.o: ../include/openssl/pem.h ../include/openssl/pem2.h -asn1pars.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -asn1pars.o: ../include/openssl/sha.h ../include/openssl/stack.h -asn1pars.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -asn1pars.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -asn1pars.o: ../include/openssl/x509v3.h apps.h asn1pars.c +asn1pars.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +asn1pars.o: ../include/openssl/engine.h ../include/openssl/err.h +asn1pars.o: ../include/openssl/evp.h ../include/openssl/fips.h +asn1pars.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +asn1pars.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +asn1pars.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +asn1pars.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +asn1pars.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +asn1pars.o: ../include/openssl/safestack.h ../include/openssl/sha.h +asn1pars.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +asn1pars.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +asn1pars.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +asn1pars.o: asn1pars.c ca.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h ca.o: ../include/openssl/bn.h ../include/openssl/buffer.h ca.o: ../include/openssl/conf.h ../include/openssl/crypto.h ca.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -ca.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -ca.o: ../include/openssl/engine.h ../include/openssl/err.h -ca.o: ../include/openssl/evp.h ../include/openssl/fips.h -ca.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -ca.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -ca.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -ca.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -ca.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -ca.o: ../include/openssl/safestack.h ../include/openssl/sha.h -ca.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -ca.o: ../include/openssl/txt_db.h ../include/openssl/x509.h -ca.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h ca.c +ca.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +ca.o: ../include/openssl/err.h ../include/openssl/evp.h +ca.o: ../include/openssl/fips.h ../include/openssl/lhash.h +ca.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +ca.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +ca.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +ca.o: ../include/openssl/pem.h ../include/openssl/pem2.h +ca.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h +ca.o: ../include/openssl/sha.h ../include/openssl/stack.h +ca.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h +ca.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +ca.o: ../include/openssl/x509v3.h apps.h ca.c ciphers.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h ciphers.o: ../include/openssl/bn.h ../include/openssl/buffer.h ciphers.o: ../include/openssl/comp.h ../include/openssl/conf.h ciphers.o: ../include/openssl/crypto.h ../include/openssl/dtls1.h ciphers.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -ciphers.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -ciphers.o: ../include/openssl/engine.h ../include/openssl/err.h -ciphers.o: ../include/openssl/evp.h ../include/openssl/fips.h -ciphers.o: ../include/openssl/hmac.h ../include/openssl/kssl.h -ciphers.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -ciphers.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -ciphers.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -ciphers.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -ciphers.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -ciphers.o: ../include/openssl/pq_compat.h ../include/openssl/pqueue.h -ciphers.o: ../include/openssl/safestack.h ../include/openssl/sha.h -ciphers.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h -ciphers.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h -ciphers.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -ciphers.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h -ciphers.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -ciphers.o: ../include/openssl/x509v3.h apps.h ciphers.c +ciphers.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +ciphers.o: ../include/openssl/err.h ../include/openssl/evp.h +ciphers.o: ../include/openssl/fips.h ../include/openssl/hmac.h +ciphers.o: ../include/openssl/kssl.h ../include/openssl/lhash.h +ciphers.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +ciphers.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +ciphers.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +ciphers.o: ../include/openssl/pem.h ../include/openssl/pem2.h +ciphers.o: ../include/openssl/pkcs7.h ../include/openssl/pq_compat.h +ciphers.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h +ciphers.o: ../include/openssl/sha.h ../include/openssl/ssl.h +ciphers.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h +ciphers.o: ../include/openssl/ssl3.h ../include/openssl/stack.h +ciphers.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h +ciphers.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +ciphers.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +ciphers.o: ciphers.c cms.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h cms.o: ../include/openssl/buffer.h ../include/openssl/conf.h cms.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -cms.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -cms.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -cms.o: ../include/openssl/evp.h ../include/openssl/fips.h -cms.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -cms.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -cms.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -cms.o: ../include/openssl/ossl_typ.h ../include/openssl/pkcs7.h -cms.o: ../include/openssl/safestack.h ../include/openssl/sha.h -cms.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -cms.o: ../include/openssl/txt_db.h ../include/openssl/x509.h -cms.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h cms.c +cms.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +cms.o: ../include/openssl/engine.h ../include/openssl/evp.h +cms.o: ../include/openssl/fips.h ../include/openssl/lhash.h +cms.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +cms.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +cms.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +cms.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h +cms.o: ../include/openssl/sha.h ../include/openssl/stack.h +cms.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h +cms.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +cms.o: ../include/openssl/x509v3.h apps.h cms.c crl.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h crl.o: ../include/openssl/buffer.h ../include/openssl/conf.h crl.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -crl.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -crl.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -crl.o: ../include/openssl/err.h ../include/openssl/evp.h -crl.o: ../include/openssl/fips.h ../include/openssl/lhash.h -crl.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -crl.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -crl.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -crl.o: ../include/openssl/pem.h ../include/openssl/pem2.h -crl.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -crl.o: ../include/openssl/sha.h ../include/openssl/stack.h -crl.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -crl.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -crl.o: ../include/openssl/x509v3.h apps.h crl.c +crl.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +crl.o: ../include/openssl/engine.h ../include/openssl/err.h +crl.o: ../include/openssl/evp.h ../include/openssl/fips.h +crl.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +crl.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +crl.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +crl.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +crl.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +crl.o: ../include/openssl/safestack.h ../include/openssl/sha.h +crl.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +crl.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +crl.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h crl.c crl2p7.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h crl2p7.o: ../include/openssl/buffer.h ../include/openssl/conf.h crl2p7.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -crl2p7.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -crl2p7.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -crl2p7.o: ../include/openssl/err.h ../include/openssl/evp.h -crl2p7.o: ../include/openssl/fips.h ../include/openssl/lhash.h -crl2p7.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -crl2p7.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -crl2p7.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -crl2p7.o: ../include/openssl/pem.h ../include/openssl/pem2.h -crl2p7.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -crl2p7.o: ../include/openssl/sha.h ../include/openssl/stack.h -crl2p7.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -crl2p7.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -crl2p7.o: ../include/openssl/x509v3.h apps.h crl2p7.c +crl2p7.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +crl2p7.o: ../include/openssl/engine.h ../include/openssl/err.h +crl2p7.o: ../include/openssl/evp.h ../include/openssl/fips.h +crl2p7.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +crl2p7.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +crl2p7.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +crl2p7.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +crl2p7.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +crl2p7.o: ../include/openssl/safestack.h ../include/openssl/sha.h +crl2p7.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +crl2p7.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +crl2p7.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +crl2p7.o: crl2p7.c dgst.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h dgst.o: ../include/openssl/buffer.h ../include/openssl/conf.h dgst.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -dgst.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -dgst.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -dgst.o: ../include/openssl/err.h ../include/openssl/evp.h -dgst.o: ../include/openssl/fips.h ../include/openssl/hmac.h -dgst.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -dgst.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -dgst.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -dgst.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -dgst.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -dgst.o: ../include/openssl/safestack.h ../include/openssl/sha.h -dgst.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -dgst.o: ../include/openssl/txt_db.h ../include/openssl/x509.h -dgst.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h dgst.c +dgst.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +dgst.o: ../include/openssl/engine.h ../include/openssl/err.h +dgst.o: ../include/openssl/evp.h ../include/openssl/fips.h +dgst.o: ../include/openssl/hmac.h ../include/openssl/lhash.h +dgst.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +dgst.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +dgst.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +dgst.o: ../include/openssl/pem.h ../include/openssl/pem2.h +dgst.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h +dgst.o: ../include/openssl/sha.h ../include/openssl/stack.h +dgst.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h +dgst.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +dgst.o: ../include/openssl/x509v3.h apps.h dgst.c dh.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h dh.o: ../include/openssl/bn.h ../include/openssl/buffer.h dh.o: ../include/openssl/conf.h ../include/openssl/crypto.h dh.o: ../include/openssl/dh.h ../include/openssl/e_os2.h -dh.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -dh.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -dh.o: ../include/openssl/err.h ../include/openssl/evp.h -dh.o: ../include/openssl/fips.h ../include/openssl/lhash.h -dh.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -dh.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -dh.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -dh.o: ../include/openssl/pem.h ../include/openssl/pem2.h -dh.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -dh.o: ../include/openssl/sha.h ../include/openssl/stack.h -dh.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -dh.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -dh.o: ../include/openssl/x509v3.h apps.h dh.c +dh.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +dh.o: ../include/openssl/engine.h ../include/openssl/err.h +dh.o: ../include/openssl/evp.h ../include/openssl/fips.h +dh.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +dh.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +dh.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +dh.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +dh.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +dh.o: ../include/openssl/safestack.h ../include/openssl/sha.h +dh.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +dh.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +dh.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h dh.c dsa.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h dsa.o: ../include/openssl/bn.h ../include/openssl/buffer.h dsa.o: ../include/openssl/conf.h ../include/openssl/crypto.h dsa.o: ../include/openssl/dsa.h ../include/openssl/e_os2.h -dsa.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -dsa.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -dsa.o: ../include/openssl/err.h ../include/openssl/evp.h -dsa.o: ../include/openssl/fips.h ../include/openssl/lhash.h -dsa.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -dsa.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -dsa.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -dsa.o: ../include/openssl/pem.h ../include/openssl/pem2.h -dsa.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -dsa.o: ../include/openssl/sha.h ../include/openssl/stack.h -dsa.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -dsa.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -dsa.o: ../include/openssl/x509v3.h apps.h dsa.c +dsa.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +dsa.o: ../include/openssl/engine.h ../include/openssl/err.h +dsa.o: ../include/openssl/evp.h ../include/openssl/fips.h +dsa.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +dsa.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +dsa.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +dsa.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +dsa.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +dsa.o: ../include/openssl/safestack.h ../include/openssl/sha.h +dsa.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +dsa.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +dsa.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h dsa.c dsaparam.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h dsaparam.o: ../include/openssl/bn.h ../include/openssl/buffer.h dsaparam.o: ../include/openssl/conf.h ../include/openssl/crypto.h dsaparam.o: ../include/openssl/dh.h ../include/openssl/dsa.h dsaparam.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -dsaparam.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -dsaparam.o: ../include/openssl/engine.h ../include/openssl/err.h -dsaparam.o: ../include/openssl/evp.h ../include/openssl/fips.h -dsaparam.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -dsaparam.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -dsaparam.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -dsaparam.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -dsaparam.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -dsaparam.o: ../include/openssl/rand.h ../include/openssl/rsa.h -dsaparam.o: ../include/openssl/safestack.h ../include/openssl/sha.h -dsaparam.o: ../include/openssl/stack.h ../include/openssl/store.h -dsaparam.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -dsaparam.o: ../include/openssl/ui.h ../include/openssl/x509.h -dsaparam.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h -dsaparam.o: dsaparam.c +dsaparam.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +dsaparam.o: ../include/openssl/err.h ../include/openssl/evp.h +dsaparam.o: ../include/openssl/fips.h ../include/openssl/lhash.h +dsaparam.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +dsaparam.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +dsaparam.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +dsaparam.o: ../include/openssl/pem.h ../include/openssl/pem2.h +dsaparam.o: ../include/openssl/pkcs7.h ../include/openssl/rand.h +dsaparam.o: ../include/openssl/rsa.h ../include/openssl/safestack.h +dsaparam.o: ../include/openssl/sha.h ../include/openssl/stack.h +dsaparam.o: ../include/openssl/store.h ../include/openssl/symhacks.h +dsaparam.o: ../include/openssl/txt_db.h ../include/openssl/ui.h +dsaparam.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +dsaparam.o: ../include/openssl/x509v3.h apps.h dsaparam.c ec.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h ec.o: ../include/openssl/buffer.h ../include/openssl/conf.h ec.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -ec.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -ec.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -ec.o: ../include/openssl/err.h ../include/openssl/evp.h -ec.o: ../include/openssl/fips.h ../include/openssl/lhash.h -ec.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -ec.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -ec.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -ec.o: ../include/openssl/pem.h ../include/openssl/pem2.h -ec.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -ec.o: ../include/openssl/sha.h ../include/openssl/stack.h -ec.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -ec.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -ec.o: ../include/openssl/x509v3.h apps.h ec.c +ec.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +ec.o: ../include/openssl/engine.h ../include/openssl/err.h +ec.o: ../include/openssl/evp.h ../include/openssl/fips.h +ec.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +ec.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +ec.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +ec.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +ec.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +ec.o: ../include/openssl/safestack.h ../include/openssl/sha.h +ec.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +ec.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +ec.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h ec.c ecparam.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h ecparam.o: ../include/openssl/bn.h ../include/openssl/buffer.h ecparam.o: ../include/openssl/conf.h ../include/openssl/crypto.h ecparam.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -ecparam.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -ecparam.o: ../include/openssl/engine.h ../include/openssl/err.h -ecparam.o: ../include/openssl/evp.h ../include/openssl/fips.h -ecparam.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -ecparam.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -ecparam.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -ecparam.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -ecparam.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -ecparam.o: ../include/openssl/safestack.h ../include/openssl/sha.h -ecparam.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -ecparam.o: ../include/openssl/txt_db.h ../include/openssl/x509.h -ecparam.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h -ecparam.o: ecparam.c +ecparam.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +ecparam.o: ../include/openssl/err.h ../include/openssl/evp.h +ecparam.o: ../include/openssl/fips.h ../include/openssl/lhash.h +ecparam.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +ecparam.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +ecparam.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +ecparam.o: ../include/openssl/pem.h ../include/openssl/pem2.h +ecparam.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h +ecparam.o: ../include/openssl/sha.h ../include/openssl/stack.h +ecparam.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h +ecparam.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +ecparam.o: ../include/openssl/x509v3.h apps.h ecparam.c enc.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h enc.o: ../include/openssl/buffer.h ../include/openssl/conf.h enc.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -enc.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -enc.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -enc.o: ../include/openssl/err.h ../include/openssl/evp.h -enc.o: ../include/openssl/fips.h ../include/openssl/lhash.h -enc.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -enc.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -enc.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -enc.o: ../include/openssl/pem.h ../include/openssl/pem2.h -enc.o: ../include/openssl/pkcs7.h ../include/openssl/rand.h -enc.o: ../include/openssl/safestack.h ../include/openssl/sha.h -enc.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -enc.o: ../include/openssl/txt_db.h ../include/openssl/x509.h -enc.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h enc.c +enc.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +enc.o: ../include/openssl/engine.h ../include/openssl/err.h +enc.o: ../include/openssl/evp.h ../include/openssl/fips.h +enc.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +enc.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +enc.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +enc.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +enc.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +enc.o: ../include/openssl/rand.h ../include/openssl/safestack.h +enc.o: ../include/openssl/sha.h ../include/openssl/stack.h +enc.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h +enc.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +enc.o: ../include/openssl/x509v3.h apps.h enc.c engine.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h engine.o: ../include/openssl/bn.h ../include/openssl/buffer.h engine.o: ../include/openssl/comp.h ../include/openssl/conf.h engine.o: ../include/openssl/crypto.h ../include/openssl/dtls1.h engine.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -engine.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -engine.o: ../include/openssl/engine.h ../include/openssl/err.h -engine.o: ../include/openssl/evp.h ../include/openssl/fips.h -engine.o: ../include/openssl/hmac.h ../include/openssl/kssl.h -engine.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -engine.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -engine.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -engine.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -engine.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -engine.o: ../include/openssl/pq_compat.h ../include/openssl/pqueue.h -engine.o: ../include/openssl/safestack.h ../include/openssl/sha.h -engine.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h -engine.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h -engine.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -engine.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h -engine.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -engine.o: ../include/openssl/x509v3.h apps.h engine.c +engine.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +engine.o: ../include/openssl/err.h ../include/openssl/evp.h +engine.o: ../include/openssl/fips.h ../include/openssl/hmac.h +engine.o: ../include/openssl/kssl.h ../include/openssl/lhash.h +engine.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +engine.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +engine.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +engine.o: ../include/openssl/pem.h ../include/openssl/pem2.h +engine.o: ../include/openssl/pkcs7.h ../include/openssl/pq_compat.h +engine.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h +engine.o: ../include/openssl/sha.h ../include/openssl/ssl.h +engine.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h +engine.o: ../include/openssl/ssl3.h ../include/openssl/stack.h +engine.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h +engine.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +engine.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +engine.o: engine.c errstr.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h errstr.o: ../include/openssl/bn.h ../include/openssl/buffer.h errstr.o: ../include/openssl/comp.h ../include/openssl/conf.h errstr.o: ../include/openssl/crypto.h ../include/openssl/dtls1.h errstr.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -errstr.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -errstr.o: ../include/openssl/engine.h ../include/openssl/err.h -errstr.o: ../include/openssl/evp.h ../include/openssl/fips.h -errstr.o: ../include/openssl/hmac.h ../include/openssl/kssl.h -errstr.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -errstr.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -errstr.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -errstr.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -errstr.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -errstr.o: ../include/openssl/pq_compat.h ../include/openssl/pqueue.h -errstr.o: ../include/openssl/safestack.h ../include/openssl/sha.h -errstr.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h -errstr.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h -errstr.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -errstr.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h -errstr.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -errstr.o: ../include/openssl/x509v3.h apps.h errstr.c +errstr.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +errstr.o: ../include/openssl/err.h ../include/openssl/evp.h +errstr.o: ../include/openssl/fips.h ../include/openssl/hmac.h +errstr.o: ../include/openssl/kssl.h ../include/openssl/lhash.h +errstr.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +errstr.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +errstr.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +errstr.o: ../include/openssl/pem.h ../include/openssl/pem2.h +errstr.o: ../include/openssl/pkcs7.h ../include/openssl/pq_compat.h +errstr.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h +errstr.o: ../include/openssl/sha.h ../include/openssl/ssl.h +errstr.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h +errstr.o: ../include/openssl/ssl3.h ../include/openssl/stack.h +errstr.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h +errstr.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +errstr.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +errstr.o: errstr.c gendh.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h gendh.o: ../include/openssl/bn.h ../include/openssl/buffer.h gendh.o: ../include/openssl/conf.h ../include/openssl/crypto.h gendh.o: ../include/openssl/dh.h ../include/openssl/dsa.h gendh.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -gendh.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -gendh.o: ../include/openssl/engine.h ../include/openssl/err.h -gendh.o: ../include/openssl/evp.h ../include/openssl/fips.h -gendh.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -gendh.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -gendh.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -gendh.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -gendh.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -gendh.o: ../include/openssl/rand.h ../include/openssl/rsa.h -gendh.o: ../include/openssl/safestack.h ../include/openssl/sha.h -gendh.o: ../include/openssl/stack.h ../include/openssl/store.h -gendh.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -gendh.o: ../include/openssl/ui.h ../include/openssl/x509.h -gendh.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h -gendh.o: gendh.c +gendh.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +gendh.o: ../include/openssl/err.h ../include/openssl/evp.h +gendh.o: ../include/openssl/fips.h ../include/openssl/lhash.h +gendh.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +gendh.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +gendh.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +gendh.o: ../include/openssl/pem.h ../include/openssl/pem2.h +gendh.o: ../include/openssl/pkcs7.h ../include/openssl/rand.h +gendh.o: ../include/openssl/rsa.h ../include/openssl/safestack.h +gendh.o: ../include/openssl/sha.h ../include/openssl/stack.h +gendh.o: ../include/openssl/store.h ../include/openssl/symhacks.h +gendh.o: ../include/openssl/txt_db.h ../include/openssl/ui.h +gendh.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +gendh.o: ../include/openssl/x509v3.h apps.h gendh.c gendsa.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h gendsa.o: ../include/openssl/bn.h ../include/openssl/buffer.h gendsa.o: ../include/openssl/conf.h ../include/openssl/crypto.h gendsa.o: ../include/openssl/dsa.h ../include/openssl/e_os2.h -gendsa.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -gendsa.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -gendsa.o: ../include/openssl/err.h ../include/openssl/evp.h -gendsa.o: ../include/openssl/fips.h ../include/openssl/lhash.h -gendsa.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -gendsa.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -gendsa.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -gendsa.o: ../include/openssl/pem.h ../include/openssl/pem2.h -gendsa.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -gendsa.o: ../include/openssl/sha.h ../include/openssl/stack.h -gendsa.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -gendsa.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -gendsa.o: ../include/openssl/x509v3.h apps.h gendsa.c +gendsa.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +gendsa.o: ../include/openssl/engine.h ../include/openssl/err.h +gendsa.o: ../include/openssl/evp.h ../include/openssl/fips.h +gendsa.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +gendsa.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +gendsa.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +gendsa.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +gendsa.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +gendsa.o: ../include/openssl/safestack.h ../include/openssl/sha.h +gendsa.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +gendsa.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +gendsa.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +gendsa.o: gendsa.c genrsa.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h genrsa.o: ../include/openssl/bn.h ../include/openssl/buffer.h genrsa.o: ../include/openssl/conf.h ../include/openssl/crypto.h genrsa.o: ../include/openssl/dh.h ../include/openssl/dsa.h genrsa.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -genrsa.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -genrsa.o: ../include/openssl/engine.h ../include/openssl/err.h -genrsa.o: ../include/openssl/evp.h ../include/openssl/fips.h -genrsa.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -genrsa.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -genrsa.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -genrsa.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -genrsa.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -genrsa.o: ../include/openssl/rand.h ../include/openssl/rsa.h -genrsa.o: ../include/openssl/safestack.h ../include/openssl/sha.h -genrsa.o: ../include/openssl/stack.h ../include/openssl/store.h -genrsa.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -genrsa.o: ../include/openssl/ui.h ../include/openssl/x509.h -genrsa.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h -genrsa.o: genrsa.c +genrsa.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +genrsa.o: ../include/openssl/err.h ../include/openssl/evp.h +genrsa.o: ../include/openssl/fips.h ../include/openssl/lhash.h +genrsa.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +genrsa.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +genrsa.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +genrsa.o: ../include/openssl/pem.h ../include/openssl/pem2.h +genrsa.o: ../include/openssl/pkcs7.h ../include/openssl/rand.h +genrsa.o: ../include/openssl/rsa.h ../include/openssl/safestack.h +genrsa.o: ../include/openssl/sha.h ../include/openssl/stack.h +genrsa.o: ../include/openssl/store.h ../include/openssl/symhacks.h +genrsa.o: ../include/openssl/txt_db.h ../include/openssl/ui.h +genrsa.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +genrsa.o: ../include/openssl/x509v3.h apps.h genrsa.c nseq.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h nseq.o: ../include/openssl/buffer.h ../include/openssl/conf.h nseq.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -nseq.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -nseq.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -nseq.o: ../include/openssl/err.h ../include/openssl/evp.h -nseq.o: ../include/openssl/fips.h ../include/openssl/lhash.h -nseq.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -nseq.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -nseq.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -nseq.o: ../include/openssl/pem.h ../include/openssl/pem2.h -nseq.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -nseq.o: ../include/openssl/sha.h ../include/openssl/stack.h -nseq.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -nseq.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -nseq.o: ../include/openssl/x509v3.h apps.h nseq.c +nseq.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +nseq.o: ../include/openssl/engine.h ../include/openssl/err.h +nseq.o: ../include/openssl/evp.h ../include/openssl/fips.h +nseq.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +nseq.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +nseq.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +nseq.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +nseq.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +nseq.o: ../include/openssl/safestack.h ../include/openssl/sha.h +nseq.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +nseq.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +nseq.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h nseq.c ocsp.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h ocsp.o: ../include/openssl/bn.h ../include/openssl/buffer.h ocsp.o: ../include/openssl/comp.h ../include/openssl/conf.h ocsp.o: ../include/openssl/crypto.h ../include/openssl/dtls1.h ocsp.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -ocsp.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -ocsp.o: ../include/openssl/engine.h ../include/openssl/err.h -ocsp.o: ../include/openssl/evp.h ../include/openssl/fips.h -ocsp.o: ../include/openssl/hmac.h ../include/openssl/kssl.h -ocsp.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -ocsp.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -ocsp.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -ocsp.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -ocsp.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -ocsp.o: ../include/openssl/pq_compat.h ../include/openssl/pqueue.h -ocsp.o: ../include/openssl/safestack.h ../include/openssl/sha.h -ocsp.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h -ocsp.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h -ocsp.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -ocsp.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h -ocsp.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -ocsp.o: ../include/openssl/x509v3.h apps.h ocsp.c +ocsp.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +ocsp.o: ../include/openssl/err.h ../include/openssl/evp.h +ocsp.o: ../include/openssl/fips.h ../include/openssl/hmac.h +ocsp.o: ../include/openssl/kssl.h ../include/openssl/lhash.h +ocsp.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +ocsp.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +ocsp.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +ocsp.o: ../include/openssl/pem.h ../include/openssl/pem2.h +ocsp.o: ../include/openssl/pkcs7.h ../include/openssl/pq_compat.h +ocsp.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h +ocsp.o: ../include/openssl/sha.h ../include/openssl/ssl.h +ocsp.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h +ocsp.o: ../include/openssl/ssl3.h ../include/openssl/stack.h +ocsp.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h +ocsp.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +ocsp.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h ocsp.c openssl.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h openssl.o: ../include/openssl/bn.h ../include/openssl/buffer.h openssl.o: ../include/openssl/comp.h ../include/openssl/conf.h openssl.o: ../include/openssl/crypto.h ../include/openssl/dtls1.h openssl.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -openssl.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -openssl.o: ../include/openssl/engine.h ../include/openssl/err.h -openssl.o: ../include/openssl/evp.h ../include/openssl/fips.h -openssl.o: ../include/openssl/hmac.h ../include/openssl/kssl.h -openssl.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -openssl.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -openssl.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -openssl.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -openssl.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -openssl.o: ../include/openssl/pq_compat.h ../include/openssl/pqueue.h -openssl.o: ../include/openssl/safestack.h ../include/openssl/sha.h -openssl.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h -openssl.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h -openssl.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -openssl.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h -openssl.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -openssl.o: ../include/openssl/x509v3.h apps.h openssl.c progs.h s_apps.h +openssl.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +openssl.o: ../include/openssl/err.h ../include/openssl/evp.h +openssl.o: ../include/openssl/fips.h ../include/openssl/hmac.h +openssl.o: ../include/openssl/kssl.h ../include/openssl/lhash.h +openssl.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +openssl.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +openssl.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +openssl.o: ../include/openssl/pem.h ../include/openssl/pem2.h +openssl.o: ../include/openssl/pkcs7.h ../include/openssl/pq_compat.h +openssl.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h +openssl.o: ../include/openssl/sha.h ../include/openssl/ssl.h +openssl.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h +openssl.o: ../include/openssl/ssl3.h ../include/openssl/stack.h +openssl.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h +openssl.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +openssl.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +openssl.o: openssl.c progs.h s_apps.h passwd.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h passwd.o: ../include/openssl/buffer.h ../include/openssl/conf.h passwd.o: ../include/openssl/crypto.h ../include/openssl/des.h passwd.o: ../include/openssl/des_old.h ../include/openssl/e_os2.h -passwd.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -passwd.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -passwd.o: ../include/openssl/err.h ../include/openssl/evp.h -passwd.o: ../include/openssl/fips.h ../include/openssl/lhash.h -passwd.o: ../include/openssl/md5.h ../include/openssl/obj_mac.h -passwd.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -passwd.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -passwd.o: ../include/openssl/ossl_typ.h ../include/openssl/pkcs7.h -passwd.o: ../include/openssl/rand.h ../include/openssl/safestack.h -passwd.o: ../include/openssl/sha.h ../include/openssl/stack.h -passwd.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -passwd.o: ../include/openssl/ui.h ../include/openssl/ui_compat.h -passwd.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -passwd.o: ../include/openssl/x509v3.h apps.h passwd.c +passwd.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +passwd.o: ../include/openssl/engine.h ../include/openssl/err.h +passwd.o: ../include/openssl/evp.h ../include/openssl/fips.h +passwd.o: ../include/openssl/lhash.h ../include/openssl/md5.h +passwd.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +passwd.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +passwd.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +passwd.o: ../include/openssl/pkcs7.h ../include/openssl/rand.h +passwd.o: ../include/openssl/safestack.h ../include/openssl/sha.h +passwd.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +passwd.o: ../include/openssl/txt_db.h ../include/openssl/ui.h +passwd.o: ../include/openssl/ui_compat.h ../include/openssl/x509.h +passwd.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +passwd.o: passwd.c pkcs12.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h pkcs12.o: ../include/openssl/buffer.h ../include/openssl/conf.h pkcs12.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -pkcs12.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -pkcs12.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -pkcs12.o: ../include/openssl/err.h ../include/openssl/evp.h -pkcs12.o: ../include/openssl/fips.h ../include/openssl/lhash.h -pkcs12.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -pkcs12.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -pkcs12.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -pkcs12.o: ../include/openssl/pem.h ../include/openssl/pem2.h -pkcs12.o: ../include/openssl/pkcs12.h ../include/openssl/pkcs7.h -pkcs12.o: ../include/openssl/safestack.h ../include/openssl/sha.h -pkcs12.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -pkcs12.o: ../include/openssl/txt_db.h ../include/openssl/x509.h -pkcs12.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h -pkcs12.o: pkcs12.c +pkcs12.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +pkcs12.o: ../include/openssl/engine.h ../include/openssl/err.h +pkcs12.o: ../include/openssl/evp.h ../include/openssl/fips.h +pkcs12.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +pkcs12.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +pkcs12.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +pkcs12.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +pkcs12.o: ../include/openssl/pem2.h ../include/openssl/pkcs12.h +pkcs12.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h +pkcs12.o: ../include/openssl/sha.h ../include/openssl/stack.h +pkcs12.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h +pkcs12.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +pkcs12.o: ../include/openssl/x509v3.h apps.h pkcs12.c pkcs7.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h pkcs7.o: ../include/openssl/buffer.h ../include/openssl/conf.h pkcs7.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -pkcs7.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -pkcs7.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -pkcs7.o: ../include/openssl/err.h ../include/openssl/evp.h -pkcs7.o: ../include/openssl/fips.h ../include/openssl/lhash.h -pkcs7.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -pkcs7.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -pkcs7.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -pkcs7.o: ../include/openssl/pem.h ../include/openssl/pem2.h -pkcs7.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -pkcs7.o: ../include/openssl/sha.h ../include/openssl/stack.h -pkcs7.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -pkcs7.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -pkcs7.o: ../include/openssl/x509v3.h apps.h pkcs7.c +pkcs7.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +pkcs7.o: ../include/openssl/engine.h ../include/openssl/err.h +pkcs7.o: ../include/openssl/evp.h ../include/openssl/fips.h +pkcs7.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +pkcs7.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +pkcs7.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +pkcs7.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +pkcs7.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +pkcs7.o: ../include/openssl/safestack.h ../include/openssl/sha.h +pkcs7.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +pkcs7.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +pkcs7.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +pkcs7.o: pkcs7.c pkcs8.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h pkcs8.o: ../include/openssl/buffer.h ../include/openssl/conf.h pkcs8.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -pkcs8.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -pkcs8.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -pkcs8.o: ../include/openssl/err.h ../include/openssl/evp.h -pkcs8.o: ../include/openssl/fips.h ../include/openssl/lhash.h -pkcs8.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -pkcs8.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -pkcs8.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -pkcs8.o: ../include/openssl/pem.h ../include/openssl/pem2.h -pkcs8.o: ../include/openssl/pkcs12.h ../include/openssl/pkcs7.h -pkcs8.o: ../include/openssl/safestack.h ../include/openssl/sha.h -pkcs8.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -pkcs8.o: ../include/openssl/txt_db.h ../include/openssl/x509.h -pkcs8.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h -pkcs8.o: pkcs8.c +pkcs8.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +pkcs8.o: ../include/openssl/engine.h ../include/openssl/err.h +pkcs8.o: ../include/openssl/evp.h ../include/openssl/fips.h +pkcs8.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +pkcs8.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +pkcs8.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +pkcs8.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +pkcs8.o: ../include/openssl/pem2.h ../include/openssl/pkcs12.h +pkcs8.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h +pkcs8.o: ../include/openssl/sha.h ../include/openssl/stack.h +pkcs8.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h +pkcs8.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +pkcs8.o: ../include/openssl/x509v3.h apps.h pkcs8.c prime.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h prime.o: ../include/openssl/bn.h ../include/openssl/buffer.h prime.o: ../include/openssl/conf.h ../include/openssl/crypto.h prime.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -prime.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -prime.o: ../include/openssl/engine.h ../include/openssl/evp.h -prime.o: ../include/openssl/fips.h ../include/openssl/lhash.h -prime.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -prime.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -prime.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -prime.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -prime.o: ../include/openssl/sha.h ../include/openssl/stack.h -prime.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -prime.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -prime.o: ../include/openssl/x509v3.h apps.h prime.c +prime.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +prime.o: ../include/openssl/evp.h ../include/openssl/fips.h +prime.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +prime.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +prime.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +prime.o: ../include/openssl/ossl_typ.h ../include/openssl/pkcs7.h +prime.o: ../include/openssl/safestack.h ../include/openssl/sha.h +prime.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +prime.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +prime.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +prime.o: prime.c rand.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h rand.o: ../include/openssl/buffer.h ../include/openssl/conf.h rand.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -rand.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -rand.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -rand.o: ../include/openssl/err.h ../include/openssl/evp.h -rand.o: ../include/openssl/fips.h ../include/openssl/lhash.h -rand.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -rand.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -rand.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -rand.o: ../include/openssl/pkcs7.h ../include/openssl/rand.h -rand.o: ../include/openssl/safestack.h ../include/openssl/sha.h -rand.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -rand.o: ../include/openssl/txt_db.h ../include/openssl/x509.h -rand.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h rand.c +rand.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +rand.o: ../include/openssl/engine.h ../include/openssl/err.h +rand.o: ../include/openssl/evp.h ../include/openssl/fips.h +rand.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +rand.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +rand.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +rand.o: ../include/openssl/ossl_typ.h ../include/openssl/pkcs7.h +rand.o: ../include/openssl/rand.h ../include/openssl/safestack.h +rand.o: ../include/openssl/sha.h ../include/openssl/stack.h +rand.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h +rand.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +rand.o: ../include/openssl/x509v3.h apps.h rand.c req.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h req.o: ../include/openssl/bn.h ../include/openssl/buffer.h req.o: ../include/openssl/conf.h ../include/openssl/crypto.h req.o: ../include/openssl/dh.h ../include/openssl/dsa.h req.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -req.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -req.o: ../include/openssl/engine.h ../include/openssl/err.h -req.o: ../include/openssl/evp.h ../include/openssl/fips.h -req.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -req.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -req.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -req.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -req.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -req.o: ../include/openssl/rand.h ../include/openssl/rsa.h -req.o: ../include/openssl/safestack.h ../include/openssl/sha.h -req.o: ../include/openssl/stack.h ../include/openssl/store.h -req.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -req.o: ../include/openssl/ui.h ../include/openssl/x509.h -req.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h req.c +req.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +req.o: ../include/openssl/err.h ../include/openssl/evp.h +req.o: ../include/openssl/fips.h ../include/openssl/lhash.h +req.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +req.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +req.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +req.o: ../include/openssl/pem.h ../include/openssl/pem2.h +req.o: ../include/openssl/pkcs7.h ../include/openssl/rand.h +req.o: ../include/openssl/rsa.h ../include/openssl/safestack.h +req.o: ../include/openssl/sha.h ../include/openssl/stack.h +req.o: ../include/openssl/store.h ../include/openssl/symhacks.h +req.o: ../include/openssl/txt_db.h ../include/openssl/ui.h +req.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +req.o: ../include/openssl/x509v3.h apps.h req.c rsa.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h rsa.o: ../include/openssl/bn.h ../include/openssl/buffer.h rsa.o: ../include/openssl/conf.h ../include/openssl/crypto.h rsa.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -rsa.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -rsa.o: ../include/openssl/engine.h ../include/openssl/err.h -rsa.o: ../include/openssl/evp.h ../include/openssl/fips.h -rsa.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -rsa.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -rsa.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -rsa.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -rsa.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -rsa.o: ../include/openssl/rsa.h ../include/openssl/safestack.h -rsa.o: ../include/openssl/sha.h ../include/openssl/stack.h -rsa.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -rsa.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -rsa.o: ../include/openssl/x509v3.h apps.h rsa.c +rsa.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +rsa.o: ../include/openssl/err.h ../include/openssl/evp.h +rsa.o: ../include/openssl/fips.h ../include/openssl/lhash.h +rsa.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +rsa.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +rsa.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +rsa.o: ../include/openssl/pem.h ../include/openssl/pem2.h +rsa.o: ../include/openssl/pkcs7.h ../include/openssl/rsa.h +rsa.o: ../include/openssl/safestack.h ../include/openssl/sha.h +rsa.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +rsa.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +rsa.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h rsa.c rsautl.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h rsautl.o: ../include/openssl/buffer.h ../include/openssl/conf.h rsautl.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -rsautl.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -rsautl.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -rsautl.o: ../include/openssl/err.h ../include/openssl/evp.h -rsautl.o: ../include/openssl/fips.h ../include/openssl/lhash.h -rsautl.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -rsautl.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -rsautl.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -rsautl.o: ../include/openssl/pem.h ../include/openssl/pem2.h -rsautl.o: ../include/openssl/pkcs7.h ../include/openssl/rsa.h -rsautl.o: ../include/openssl/safestack.h ../include/openssl/sha.h -rsautl.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -rsautl.o: ../include/openssl/txt_db.h ../include/openssl/x509.h -rsautl.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h -rsautl.o: rsautl.c +rsautl.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +rsautl.o: ../include/openssl/engine.h ../include/openssl/err.h +rsautl.o: ../include/openssl/evp.h ../include/openssl/fips.h +rsautl.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +rsautl.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +rsautl.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +rsautl.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +rsautl.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +rsautl.o: ../include/openssl/rsa.h ../include/openssl/safestack.h +rsautl.o: ../include/openssl/sha.h ../include/openssl/stack.h +rsautl.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h +rsautl.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +rsautl.o: ../include/openssl/x509v3.h apps.h rsautl.c s_cb.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h s_cb.o: ../include/openssl/bn.h ../include/openssl/buffer.h s_cb.o: ../include/openssl/comp.h ../include/openssl/conf.h s_cb.o: ../include/openssl/crypto.h ../include/openssl/dtls1.h s_cb.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -s_cb.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -s_cb.o: ../include/openssl/engine.h ../include/openssl/err.h -s_cb.o: ../include/openssl/evp.h ../include/openssl/fips.h -s_cb.o: ../include/openssl/hmac.h ../include/openssl/kssl.h -s_cb.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -s_cb.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -s_cb.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -s_cb.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -s_cb.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -s_cb.o: ../include/openssl/pq_compat.h ../include/openssl/pqueue.h -s_cb.o: ../include/openssl/rand.h ../include/openssl/safestack.h -s_cb.o: ../include/openssl/sha.h ../include/openssl/ssl.h -s_cb.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h -s_cb.o: ../include/openssl/ssl3.h ../include/openssl/stack.h -s_cb.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h -s_cb.o: ../include/openssl/txt_db.h ../include/openssl/x509.h -s_cb.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h -s_cb.o: s_apps.h s_cb.c +s_cb.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +s_cb.o: ../include/openssl/err.h ../include/openssl/evp.h +s_cb.o: ../include/openssl/fips.h ../include/openssl/hmac.h +s_cb.o: ../include/openssl/kssl.h ../include/openssl/lhash.h +s_cb.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +s_cb.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +s_cb.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +s_cb.o: ../include/openssl/pem.h ../include/openssl/pem2.h +s_cb.o: ../include/openssl/pkcs7.h ../include/openssl/pq_compat.h +s_cb.o: ../include/openssl/pqueue.h ../include/openssl/rand.h +s_cb.o: ../include/openssl/safestack.h ../include/openssl/sha.h +s_cb.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h +s_cb.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h +s_cb.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +s_cb.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h +s_cb.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +s_cb.o: ../include/openssl/x509v3.h apps.h s_apps.h s_cb.c s_client.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h s_client.o: ../include/openssl/bn.h ../include/openssl/buffer.h s_client.o: ../include/openssl/comp.h ../include/openssl/conf.h s_client.o: ../include/openssl/crypto.h ../include/openssl/dtls1.h s_client.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -s_client.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -s_client.o: ../include/openssl/engine.h ../include/openssl/err.h -s_client.o: ../include/openssl/evp.h ../include/openssl/fips.h -s_client.o: ../include/openssl/hmac.h ../include/openssl/kssl.h -s_client.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -s_client.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -s_client.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -s_client.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -s_client.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -s_client.o: ../include/openssl/pq_compat.h ../include/openssl/pqueue.h -s_client.o: ../include/openssl/rand.h ../include/openssl/safestack.h -s_client.o: ../include/openssl/sha.h ../include/openssl/ssl.h -s_client.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h -s_client.o: ../include/openssl/ssl3.h ../include/openssl/stack.h -s_client.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h -s_client.o: ../include/openssl/txt_db.h ../include/openssl/x509.h -s_client.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h -s_client.o: s_apps.h s_client.c timeouts.h +s_client.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +s_client.o: ../include/openssl/err.h ../include/openssl/evp.h +s_client.o: ../include/openssl/fips.h ../include/openssl/hmac.h +s_client.o: ../include/openssl/kssl.h ../include/openssl/lhash.h +s_client.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +s_client.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +s_client.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +s_client.o: ../include/openssl/pem.h ../include/openssl/pem2.h +s_client.o: ../include/openssl/pkcs7.h ../include/openssl/pq_compat.h +s_client.o: ../include/openssl/pqueue.h ../include/openssl/rand.h +s_client.o: ../include/openssl/safestack.h ../include/openssl/sha.h +s_client.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h +s_client.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h +s_client.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +s_client.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h +s_client.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +s_client.o: ../include/openssl/x509v3.h apps.h s_apps.h s_client.c timeouts.h s_server.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h s_server.o: ../include/openssl/bn.h ../include/openssl/buffer.h s_server.o: ../include/openssl/comp.h ../include/openssl/conf.h s_server.o: ../include/openssl/crypto.h ../include/openssl/dh.h s_server.o: ../include/openssl/dsa.h ../include/openssl/dtls1.h s_server.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -s_server.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -s_server.o: ../include/openssl/engine.h ../include/openssl/err.h -s_server.o: ../include/openssl/evp.h ../include/openssl/fips.h -s_server.o: ../include/openssl/hmac.h ../include/openssl/kssl.h -s_server.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -s_server.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -s_server.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -s_server.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -s_server.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -s_server.o: ../include/openssl/pq_compat.h ../include/openssl/pqueue.h -s_server.o: ../include/openssl/rand.h ../include/openssl/rsa.h -s_server.o: ../include/openssl/safestack.h ../include/openssl/sha.h -s_server.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h -s_server.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h -s_server.o: ../include/openssl/stack.h ../include/openssl/store.h -s_server.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h -s_server.o: ../include/openssl/txt_db.h ../include/openssl/ui.h -s_server.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -s_server.o: ../include/openssl/x509v3.h apps.h s_apps.h s_server.c timeouts.h +s_server.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +s_server.o: ../include/openssl/err.h ../include/openssl/evp.h +s_server.o: ../include/openssl/fips.h ../include/openssl/hmac.h +s_server.o: ../include/openssl/kssl.h ../include/openssl/lhash.h +s_server.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +s_server.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +s_server.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +s_server.o: ../include/openssl/pem.h ../include/openssl/pem2.h +s_server.o: ../include/openssl/pkcs7.h ../include/openssl/pq_compat.h +s_server.o: ../include/openssl/pqueue.h ../include/openssl/rand.h +s_server.o: ../include/openssl/rsa.h ../include/openssl/safestack.h +s_server.o: ../include/openssl/sha.h ../include/openssl/ssl.h +s_server.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h +s_server.o: ../include/openssl/ssl3.h ../include/openssl/stack.h +s_server.o: ../include/openssl/store.h ../include/openssl/symhacks.h +s_server.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h +s_server.o: ../include/openssl/ui.h ../include/openssl/x509.h +s_server.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +s_server.o: s_apps.h s_server.c timeouts.h s_socket.o: ../e_os.h ../e_os2.h ../include/openssl/asn1.h s_socket.o: ../include/openssl/bio.h ../include/openssl/bn.h s_socket.o: ../include/openssl/buffer.h ../include/openssl/comp.h s_socket.o: ../include/openssl/conf.h ../include/openssl/crypto.h s_socket.o: ../include/openssl/dtls1.h ../include/openssl/e_os2.h -s_socket.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -s_socket.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -s_socket.o: ../include/openssl/evp.h ../include/openssl/fips.h -s_socket.o: ../include/openssl/hmac.h ../include/openssl/kssl.h -s_socket.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -s_socket.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -s_socket.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -s_socket.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -s_socket.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -s_socket.o: ../include/openssl/pq_compat.h ../include/openssl/pqueue.h -s_socket.o: ../include/openssl/safestack.h ../include/openssl/sha.h -s_socket.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h -s_socket.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h -s_socket.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -s_socket.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h -s_socket.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -s_socket.o: ../include/openssl/x509v3.h apps.h s_apps.h s_socket.c +s_socket.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +s_socket.o: ../include/openssl/engine.h ../include/openssl/evp.h +s_socket.o: ../include/openssl/fips.h ../include/openssl/hmac.h +s_socket.o: ../include/openssl/kssl.h ../include/openssl/lhash.h +s_socket.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +s_socket.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +s_socket.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +s_socket.o: ../include/openssl/pem.h ../include/openssl/pem2.h +s_socket.o: ../include/openssl/pkcs7.h ../include/openssl/pq_compat.h +s_socket.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h +s_socket.o: ../include/openssl/sha.h ../include/openssl/ssl.h +s_socket.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h +s_socket.o: ../include/openssl/ssl3.h ../include/openssl/stack.h +s_socket.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h +s_socket.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +s_socket.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +s_socket.o: s_apps.h s_socket.c s_time.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h s_time.o: ../include/openssl/bn.h ../include/openssl/buffer.h s_time.o: ../include/openssl/comp.h ../include/openssl/conf.h s_time.o: ../include/openssl/crypto.h ../include/openssl/dtls1.h s_time.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -s_time.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -s_time.o: ../include/openssl/engine.h ../include/openssl/err.h -s_time.o: ../include/openssl/evp.h ../include/openssl/fips.h -s_time.o: ../include/openssl/hmac.h ../include/openssl/kssl.h -s_time.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -s_time.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -s_time.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -s_time.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -s_time.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -s_time.o: ../include/openssl/pq_compat.h ../include/openssl/pqueue.h -s_time.o: ../include/openssl/safestack.h ../include/openssl/sha.h -s_time.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h -s_time.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h -s_time.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -s_time.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h -s_time.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -s_time.o: ../include/openssl/x509v3.h apps.h s_apps.h s_time.c +s_time.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +s_time.o: ../include/openssl/err.h ../include/openssl/evp.h +s_time.o: ../include/openssl/fips.h ../include/openssl/hmac.h +s_time.o: ../include/openssl/kssl.h ../include/openssl/lhash.h +s_time.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +s_time.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +s_time.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +s_time.o: ../include/openssl/pem.h ../include/openssl/pem2.h +s_time.o: ../include/openssl/pkcs7.h ../include/openssl/pq_compat.h +s_time.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h +s_time.o: ../include/openssl/sha.h ../include/openssl/ssl.h +s_time.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h +s_time.o: ../include/openssl/ssl3.h ../include/openssl/stack.h +s_time.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h +s_time.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +s_time.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +s_time.o: s_apps.h s_time.c sess_id.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h sess_id.o: ../include/openssl/bn.h ../include/openssl/buffer.h sess_id.o: ../include/openssl/comp.h ../include/openssl/conf.h sess_id.o: ../include/openssl/crypto.h ../include/openssl/dtls1.h sess_id.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -sess_id.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -sess_id.o: ../include/openssl/engine.h ../include/openssl/err.h -sess_id.o: ../include/openssl/evp.h ../include/openssl/fips.h -sess_id.o: ../include/openssl/hmac.h ../include/openssl/kssl.h -sess_id.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h -sess_id.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -sess_id.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -sess_id.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -sess_id.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -sess_id.o: ../include/openssl/pq_compat.h ../include/openssl/pqueue.h -sess_id.o: ../include/openssl/safestack.h ../include/openssl/sha.h -sess_id.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h -sess_id.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h -sess_id.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -sess_id.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h -sess_id.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -sess_id.o: ../include/openssl/x509v3.h apps.h sess_id.c +sess_id.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +sess_id.o: ../include/openssl/err.h ../include/openssl/evp.h +sess_id.o: ../include/openssl/fips.h ../include/openssl/hmac.h +sess_id.o: ../include/openssl/kssl.h ../include/openssl/lhash.h +sess_id.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +sess_id.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +sess_id.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +sess_id.o: ../include/openssl/pem.h ../include/openssl/pem2.h +sess_id.o: ../include/openssl/pkcs7.h ../include/openssl/pq_compat.h +sess_id.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h +sess_id.o: ../include/openssl/sha.h ../include/openssl/ssl.h +sess_id.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h +sess_id.o: ../include/openssl/ssl3.h ../include/openssl/stack.h +sess_id.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h +sess_id.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +sess_id.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +sess_id.o: sess_id.c smime.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h smime.o: ../include/openssl/buffer.h ../include/openssl/conf.h smime.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -smime.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -smime.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -smime.o: ../include/openssl/err.h ../include/openssl/evp.h -smime.o: ../include/openssl/fips.h ../include/openssl/lhash.h -smime.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -smime.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -smime.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -smime.o: ../include/openssl/pem.h ../include/openssl/pem2.h -smime.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -smime.o: ../include/openssl/sha.h ../include/openssl/stack.h -smime.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -smime.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -smime.o: ../include/openssl/x509v3.h apps.h smime.c +smime.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +smime.o: ../include/openssl/engine.h ../include/openssl/err.h +smime.o: ../include/openssl/evp.h ../include/openssl/fips.h +smime.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +smime.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +smime.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +smime.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +smime.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +smime.o: ../include/openssl/safestack.h ../include/openssl/sha.h +smime.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +smime.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +smime.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +smime.o: smime.c speed.o: ../e_os.h ../include/openssl/aes.h ../include/openssl/asn1.h speed.o: ../include/openssl/bio.h ../include/openssl/blowfish.h speed.o: ../include/openssl/bn.h ../include/openssl/buffer.h @@ -897,89 +880,88 @@ speed.o: ../include/openssl/cast.h ../include/openssl/conf.h speed.o: ../include/openssl/crypto.h ../include/openssl/des.h speed.o: ../include/openssl/des_old.h ../include/openssl/dsa.h speed.o: ../include/openssl/e_os2.h ../include/openssl/ec.h -speed.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h -speed.o: ../include/openssl/engine.h ../include/openssl/err.h -speed.o: ../include/openssl/evp.h ../include/openssl/fips.h -speed.o: ../include/openssl/hmac.h ../include/openssl/idea.h -speed.o: ../include/openssl/lhash.h ../include/openssl/md2.h -speed.o: ../include/openssl/md4.h ../include/openssl/md5.h -speed.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -speed.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -speed.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -speed.o: ../include/openssl/pkcs7.h ../include/openssl/rand.h -speed.o: ../include/openssl/rc2.h ../include/openssl/rc4.h -speed.o: ../include/openssl/ripemd.h ../include/openssl/rsa.h -speed.o: ../include/openssl/safestack.h ../include/openssl/sha.h -speed.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -speed.o: ../include/openssl/txt_db.h ../include/openssl/ui.h -speed.o: ../include/openssl/ui_compat.h ../include/openssl/x509.h -speed.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h -speed.o: speed.c testdsa.h testrsa.h +speed.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +speed.o: ../include/openssl/err.h ../include/openssl/evp.h +speed.o: ../include/openssl/fips.h ../include/openssl/hmac.h +speed.o: ../include/openssl/idea.h ../include/openssl/lhash.h +speed.o: ../include/openssl/md2.h ../include/openssl/md4.h +speed.o: ../include/openssl/md5.h ../include/openssl/obj_mac.h +speed.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +speed.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +speed.o: ../include/openssl/ossl_typ.h ../include/openssl/pkcs7.h +speed.o: ../include/openssl/rand.h ../include/openssl/rc2.h +speed.o: ../include/openssl/rc4.h ../include/openssl/ripemd.h +speed.o: ../include/openssl/rsa.h ../include/openssl/safestack.h +speed.o: ../include/openssl/sha.h ../include/openssl/stack.h +speed.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h +speed.o: ../include/openssl/ui.h ../include/openssl/ui_compat.h +speed.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +speed.o: ../include/openssl/x509v3.h apps.h speed.c testdsa.h testrsa.h spkac.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h spkac.o: ../include/openssl/buffer.h ../include/openssl/conf.h spkac.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -spkac.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -spkac.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -spkac.o: ../include/openssl/err.h ../include/openssl/evp.h -spkac.o: ../include/openssl/fips.h ../include/openssl/lhash.h -spkac.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -spkac.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -spkac.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -spkac.o: ../include/openssl/pem.h ../include/openssl/pem2.h -spkac.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -spkac.o: ../include/openssl/sha.h ../include/openssl/stack.h -spkac.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -spkac.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -spkac.o: ../include/openssl/x509v3.h apps.h spkac.c +spkac.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +spkac.o: ../include/openssl/engine.h ../include/openssl/err.h +spkac.o: ../include/openssl/evp.h ../include/openssl/fips.h +spkac.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +spkac.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +spkac.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +spkac.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +spkac.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +spkac.o: ../include/openssl/safestack.h ../include/openssl/sha.h +spkac.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +spkac.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +spkac.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +spkac.o: spkac.c verify.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h verify.o: ../include/openssl/buffer.h ../include/openssl/conf.h verify.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h -verify.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -verify.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -verify.o: ../include/openssl/err.h ../include/openssl/evp.h -verify.o: ../include/openssl/fips.h ../include/openssl/lhash.h -verify.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -verify.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -verify.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -verify.o: ../include/openssl/pem.h ../include/openssl/pem2.h -verify.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -verify.o: ../include/openssl/sha.h ../include/openssl/stack.h -verify.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -verify.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -verify.o: ../include/openssl/x509v3.h apps.h verify.c +verify.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +verify.o: ../include/openssl/engine.h ../include/openssl/err.h +verify.o: ../include/openssl/evp.h ../include/openssl/fips.h +verify.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +verify.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +verify.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +verify.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +verify.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +verify.o: ../include/openssl/safestack.h ../include/openssl/sha.h +verify.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +verify.o: ../include/openssl/txt_db.h ../include/openssl/x509.h +verify.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +verify.o: verify.c version.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h version.o: ../include/openssl/blowfish.h ../include/openssl/bn.h version.o: ../include/openssl/buffer.h ../include/openssl/conf.h version.o: ../include/openssl/crypto.h ../include/openssl/des.h version.o: ../include/openssl/des_old.h ../include/openssl/e_os2.h -version.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -version.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -version.o: ../include/openssl/evp.h ../include/openssl/fips.h -version.o: ../include/openssl/idea.h ../include/openssl/lhash.h -version.o: ../include/openssl/md2.h ../include/openssl/obj_mac.h -version.o: ../include/openssl/objects.h ../include/openssl/ocsp.h -version.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -version.o: ../include/openssl/ossl_typ.h ../include/openssl/pkcs7.h -version.o: ../include/openssl/rc4.h ../include/openssl/safestack.h -version.o: ../include/openssl/sha.h ../include/openssl/stack.h -version.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h -version.o: ../include/openssl/ui.h ../include/openssl/ui_compat.h -version.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h -version.o: ../include/openssl/x509v3.h apps.h version.c +version.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +version.o: ../include/openssl/engine.h ../include/openssl/evp.h +version.o: ../include/openssl/fips.h ../include/openssl/idea.h +version.o: ../include/openssl/lhash.h ../include/openssl/md2.h +version.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +version.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h +version.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h +version.o: ../include/openssl/pkcs7.h ../include/openssl/rc4.h +version.o: ../include/openssl/safestack.h ../include/openssl/sha.h +version.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +version.o: ../include/openssl/txt_db.h ../include/openssl/ui.h +version.o: ../include/openssl/ui_compat.h ../include/openssl/x509.h +version.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h +version.o: version.c x509.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h x509.o: ../include/openssl/bn.h ../include/openssl/buffer.h x509.o: ../include/openssl/conf.h ../include/openssl/crypto.h x509.o: ../include/openssl/dsa.h ../include/openssl/e_os2.h -x509.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -x509.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -x509.o: ../include/openssl/err.h ../include/openssl/evp.h -x509.o: ../include/openssl/fips.h ../include/openssl/lhash.h -x509.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -x509.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h -x509.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -x509.o: ../include/openssl/pem.h ../include/openssl/pem2.h -x509.o: ../include/openssl/pkcs7.h ../include/openssl/rsa.h -x509.o: ../include/openssl/safestack.h ../include/openssl/sha.h -x509.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -x509.o: ../include/openssl/txt_db.h ../include/openssl/x509.h -x509.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h x509.c +x509.o: ../include/openssl/ec.h ../include/openssl/ecdsa.h +x509.o: ../include/openssl/engine.h ../include/openssl/err.h +x509.o: ../include/openssl/evp.h ../include/openssl/fips.h +x509.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h +x509.o: ../include/openssl/objects.h ../include/openssl/ocsp.h +x509.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +x509.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +x509.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +x509.o: ../include/openssl/rsa.h ../include/openssl/safestack.h +x509.o: ../include/openssl/sha.h ../include/openssl/stack.h +x509.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h +x509.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h +x509.o: ../include/openssl/x509v3.h apps.h x509.c diff --git a/crypto/openssl/apps/asn1pars.c b/crypto/openssl/apps/asn1pars.c index bde61d02d12..305cdfc6af3 100644 --- a/crypto/openssl/apps/asn1pars.c +++ b/crypto/openssl/apps/asn1pars.c @@ -408,6 +408,7 @@ static int do_generate(BIO *bio, char *genstr, char *genconf, BUF_MEM *buf) atyp = ASN1_generate_nconf(genstr, cnf); NCONF_free(cnf); + cnf = NULL; if (!atyp) return -1; diff --git a/crypto/openssl/apps/cms.c b/crypto/openssl/apps/cms.c index 6d227acabe8..b8c0ee8dd5d 100644 --- a/crypto/openssl/apps/cms.c +++ b/crypto/openssl/apps/cms.c @@ -226,6 +226,8 @@ int MAIN(int argc, char **argv) else if (!strcmp(*args,"-camellia256")) cipher = EVP_camellia_256_cbc(); #endif + else if (!strcmp (*args, "-debug_decrypt")) + flags |= CMS_DEBUG_DECRYPT; else if (!strcmp (*args, "-text")) flags |= CMS_TEXT; else if (!strcmp (*args, "-nointern")) @@ -611,7 +613,7 @@ int MAIN(int argc, char **argv) BIO_printf (bio_err, "-certsout file certificate output file\n"); BIO_printf (bio_err, "-signer file signer certificate file\n"); BIO_printf (bio_err, "-recip file recipient certificate file for decryption\n"); - BIO_printf (bio_err, "-skeyid use subject key identifier\n"); + BIO_printf (bio_err, "-keyid use subject key identifier\n"); BIO_printf (bio_err, "-in file input file\n"); BIO_printf (bio_err, "-inform arg input format SMIME (default), PEM or DER\n"); BIO_printf (bio_err, "-inkey file input private key (if not signer or recipient)\n"); @@ -1013,6 +1015,8 @@ int MAIN(int argc, char **argv) ret = 4; if (operation == SMIME_DECRYPT) { + if (flags & CMS_DEBUG_DECRYPT) + CMS_decrypt(cms, NULL, NULL, NULL, NULL, flags); if (secret_key) { diff --git a/crypto/openssl/apps/openssl.cnf b/crypto/openssl/apps/openssl.cnf index cf8f8ea1e44..6b51bd6babd 100644 --- a/crypto/openssl/apps/openssl.cnf +++ b/crypto/openssl/apps/openssl.cnf @@ -142,7 +142,7 @@ localityName = Locality Name (eg, city) organizationalUnitName = Organizational Unit Name (eg, section) #organizationalUnitName_default = -commonName = Common Name (eg, YOUR name) +commonName = Common Name (e.g. server FQDN or YOUR name) commonName_max = 64 emailAddress = Email Address diff --git a/crypto/openssl/apps/pkcs12.c b/crypto/openssl/apps/pkcs12.c index 0db0b79765a..4860560b92a 100644 --- a/crypto/openssl/apps/pkcs12.c +++ b/crypto/openssl/apps/pkcs12.c @@ -659,7 +659,7 @@ int MAIN(int argc, char **argv) if (!twopass) BUF_strlcpy(macpass, pass, sizeof macpass); - if (options & INFO) BIO_printf (bio_err, "MAC Iteration %ld\n", p12->mac->iter ? ASN1_INTEGER_get (p12->mac->iter) : 1); + if ((options & INFO) && p12->mac) BIO_printf (bio_err, "MAC Iteration %ld\n", p12->mac->iter ? ASN1_INTEGER_get (p12->mac->iter) : 1); if(macver) { #ifdef CRYPTO_MDEBUG CRYPTO_push_info("verify MAC"); diff --git a/crypto/openssl/apps/s_client.c b/crypto/openssl/apps/s_client.c index 2f743f0a0af..54a32ece6bf 100644 --- a/crypto/openssl/apps/s_client.c +++ b/crypto/openssl/apps/s_client.c @@ -345,13 +345,7 @@ int MAIN(int argc, char **argv) char *jpake_secret = NULL; #endif -#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3) meth=SSLv23_client_method(); -#elif !defined(OPENSSL_NO_SSL3) - meth=SSLv3_client_method(); -#elif !defined(OPENSSL_NO_SSL2) - meth=SSLv2_client_method(); -#endif apps_startup(); c_Pause=0; diff --git a/crypto/openssl/apps/s_server.c b/crypto/openssl/apps/s_server.c index 9ef643e2b4d..d1d3ccc5bce 100644 --- a/crypto/openssl/apps/s_server.c +++ b/crypto/openssl/apps/s_server.c @@ -781,13 +781,7 @@ int MAIN(int argc, char *argv[]) tlsextctx tlsextcbp = {NULL, NULL, SSL_TLSEXT_ERR_ALERT_WARNING}; #endif -#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3) meth=SSLv23_server_method(); -#elif !defined(OPENSSL_NO_SSL3) - meth=SSLv3_server_method(); -#elif !defined(OPENSSL_NO_SSL2) - meth=SSLv2_server_method(); -#endif local_argc=argc; local_argv=argv; diff --git a/crypto/openssl/apps/x509.c b/crypto/openssl/apps/x509.c index 151d3a91a72..b16afd0666d 100644 --- a/crypto/openssl/apps/x509.c +++ b/crypto/openssl/apps/x509.c @@ -969,7 +969,7 @@ bad: else { pk=load_key(bio_err, - keyfile, FORMAT_PEM, 0, + keyfile, keyformat, 0, passin, e, "request key"); if (pk == NULL) goto end; } diff --git a/crypto/openssl/config b/crypto/openssl/config index b9d1c7aa268..7a958cb4326 100755 --- a/crypto/openssl/config +++ b/crypto/openssl/config @@ -790,6 +790,10 @@ esac # options="$options -DATALLA" #fi +($CC -Wa,--help -c -o /dev/null -x assembler /dev/null 2>&1 | \ + grep \\--noexecstack) 2>&1 > /dev/null && \ + options="$options -Wa,--noexecstack" + # gcc < 2.8 does not support -march=ultrasparc if [ "$OUT" = solaris-sparcv9-gcc -a $GCCVER -lt 28 ] then diff --git a/crypto/openssl/crypto/asn1/a_d2i_fp.c b/crypto/openssl/crypto/asn1/a_d2i_fp.c index ece40bc4c00..52b2ebdb631 100644 --- a/crypto/openssl/crypto/asn1/a_d2i_fp.c +++ b/crypto/openssl/crypto/asn1/a_d2i_fp.c @@ -57,6 +57,7 @@ */ #include +#include #include "cryptlib.h" #include #include @@ -143,17 +144,11 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb) BUF_MEM *b; unsigned char *p; int i; - int ret=-1; ASN1_const_CTX c; - int want=HEADER_SIZE; + size_t want=HEADER_SIZE; int eos=0; -#if defined(__GNUC__) && defined(__ia64) - /* pathetic compiler bug in all known versions as of Nov. 2002 */ - long off=0; -#else - int off=0; -#endif - int len=0; + size_t off=0; + size_t len=0; b=BUF_MEM_new(); if (b == NULL) @@ -169,7 +164,7 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb) { want-=(len-off); - if (!BUF_MEM_grow_clean(b,len+want)) + if (len + want < len || !BUF_MEM_grow_clean(b,len+want)) { ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ERR_R_MALLOC_FAILURE); goto err; @@ -181,7 +176,14 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb) goto err; } if (i > 0) + { + if (len+i < len) + { + ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG); + goto err; + } len+=i; + } } /* else data already loaded */ @@ -206,6 +208,11 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb) { /* no data body so go round again */ eos++; + if (eos < 0) + { + ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_HEADER_TOO_LONG); + goto err; + } want=HEADER_SIZE; } else if (eos && (c.slen == 0) && (c.tag == V_ASN1_EOC)) @@ -220,10 +227,16 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb) else { /* suck in c.slen bytes of data */ - want=(int)c.slen; + want=c.slen; if (want > (len-off)) { want-=(len-off); + if (want > INT_MAX /* BIO_read takes an int length */ || + len+want < len) + { + ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG); + goto err; + } if (!BUF_MEM_grow_clean(b,len+want)) { ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ERR_R_MALLOC_FAILURE); @@ -238,11 +251,18 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb) ASN1_R_NOT_ENOUGH_DATA); goto err; } + /* This can't overflow because + * |len+want| didn't overflow. */ len+=i; - want -= i; + want-=i; } } - off+=(int)c.slen; + if (off + c.slen < off) + { + ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG); + goto err; + } + off+=c.slen; if (eos <= 0) { break; @@ -252,9 +272,15 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb) } } + if (off > INT_MAX) + { + ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG); + goto err; + } + *pb = b; return off; err: if (b != NULL) BUF_MEM_free(b); - return(ret); + return -1; } diff --git a/crypto/openssl/crypto/asn1/a_object.c b/crypto/openssl/crypto/asn1/a_object.c index 365e4673a95..3ac2bc2a01a 100644 --- a/crypto/openssl/crypto/asn1/a_object.c +++ b/crypto/openssl/crypto/asn1/a_object.c @@ -139,7 +139,7 @@ int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num) ASN1err(ASN1_F_A2D_ASN1_OBJECT,ASN1_R_INVALID_DIGIT); goto err; } - if (!use_bn && l > (ULONG_MAX / 10L)) + if (!use_bn && l >= ((ULONG_MAX - 80) / 10L)) { use_bn = 1; if (!bl) @@ -294,7 +294,7 @@ ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, /* Sanity check OID encoding: can't have leading 0x80 in * subidentifiers, see: X.690 8.19.2 */ - for (i = 0, p = *pp + 1; i < len - 1; i++, p++) + for (i = 0, p = *pp; i < len; i++, p++) { if (*p == 0x80 && (!i || !(p[-1] & 0x80))) { diff --git a/crypto/openssl/crypto/asn1/a_strex.c b/crypto/openssl/crypto/asn1/a_strex.c index 7fc14d3296c..264ebf2393a 100644 --- a/crypto/openssl/crypto/asn1/a_strex.c +++ b/crypto/openssl/crypto/asn1/a_strex.c @@ -74,6 +74,11 @@ #define CHARTYPE_BS_ESC (ASN1_STRFLGS_ESC_2253 | CHARTYPE_FIRST_ESC_2253 | CHARTYPE_LAST_ESC_2253) +#define ESC_FLAGS (ASN1_STRFLGS_ESC_2253 | \ + ASN1_STRFLGS_ESC_QUOTE | \ + ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB) + /* Three IO functions for sending data to memory, a BIO and * and a FILE pointer. @@ -148,6 +153,13 @@ static int do_esc_char(unsigned long c, unsigned char flags, char *do_quotes, ch if(!io_ch(arg, tmphex, 3)) return -1; return 3; } + /* If we get this far and do any escaping at all must escape + * the escape character itself: backslash. + */ + if (chtmp == '\\' && flags & ESC_FLAGS) { + if(!io_ch(arg, "\\\\", 2)) return -1; + return 2; + } if(!io_ch(arg, &chtmp, 1)) return -1; return 1; } @@ -292,11 +304,6 @@ static const signed char tag2nbyte[] = { 4, -1, 2 /* 28-30 */ }; -#define ESC_FLAGS (ASN1_STRFLGS_ESC_2253 | \ - ASN1_STRFLGS_ESC_QUOTE | \ - ASN1_STRFLGS_ESC_CTRL | \ - ASN1_STRFLGS_ESC_MSB) - /* This is the main function, print out an * ASN1_STRING taking note of various escape * and display options. Returns number of diff --git a/crypto/openssl/crypto/asn1/a_strnid.c b/crypto/openssl/crypto/asn1/a_strnid.c index fe515b52bae..b68ae433d4e 100644 --- a/crypto/openssl/crypto/asn1/a_strnid.c +++ b/crypto/openssl/crypto/asn1/a_strnid.c @@ -96,7 +96,7 @@ unsigned long ASN1_STRING_get_default_mask(void) * default: the default value, Printable, T61, BMP. */ -int ASN1_STRING_set_default_mask_asc(char *p) +int ASN1_STRING_set_default_mask_asc(const char *p) { unsigned long mask; char *end; diff --git a/crypto/openssl/crypto/asn1/asn1.h b/crypto/openssl/crypto/asn1/asn1.h index 1958298f749..d9d5443a33c 100644 --- a/crypto/openssl/crypto/asn1/asn1.h +++ b/crypto/openssl/crypto/asn1/asn1.h @@ -1051,7 +1051,7 @@ ASN1_STRING *ASN1_pack_string(void *obj, i2d_of_void *i2d, ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_OCTET_STRING **oct); void ASN1_STRING_set_default_mask(unsigned long mask); -int ASN1_STRING_set_default_mask_asc(char *p); +int ASN1_STRING_set_default_mask_asc(const char *p); unsigned long ASN1_STRING_get_default_mask(void); int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len, int inform, unsigned long mask); diff --git a/crypto/openssl/crypto/asn1/asn_mime.c b/crypto/openssl/crypto/asn1/asn_mime.c index d8d9e76cc06..ad8fbed9072 100644 --- a/crypto/openssl/crypto/asn1/asn_mime.c +++ b/crypto/openssl/crypto/asn1/asn_mime.c @@ -418,9 +418,9 @@ ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it) if(strcmp(hdr->value, "application/x-pkcs7-signature") && strcmp(hdr->value, "application/pkcs7-signature")) { - sk_MIME_HEADER_pop_free(headers, mime_hdr_free); ASN1err(ASN1_F_SMIME_READ_ASN1,ASN1_R_SIG_INVALID_MIME_TYPE); ERR_add_error_data(2, "type: ", hdr->value); + sk_MIME_HEADER_pop_free(headers, mime_hdr_free); sk_BIO_pop_free(parts, BIO_vfree); return NULL; } @@ -790,12 +790,17 @@ static int mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value) static int mime_hdr_cmp(const MIME_HEADER * const *a, const MIME_HEADER * const *b) { + if (!(*a)->name || !(*b)->name) + return !!(*a)->name - !!(*b)->name; + return(strcmp((*a)->name, (*b)->name)); } static int mime_param_cmp(const MIME_PARAM * const *a, const MIME_PARAM * const *b) { + if (!(*a)->param_name || !(*b)->param_name) + return !!(*a)->param_name - !!(*b)->param_name; return(strcmp((*a)->param_name, (*b)->param_name)); } diff --git a/crypto/openssl/crypto/asn1/x_name.c b/crypto/openssl/crypto/asn1/x_name.c index 04380abc3ff..9a1a9f415ff 100644 --- a/crypto/openssl/crypto/asn1/x_name.c +++ b/crypto/openssl/crypto/asn1/x_name.c @@ -196,7 +196,9 @@ static int x509_name_ex_d2i(ASN1_VALUE **val, const unsigned char **in, long len *val = nm.a; *in = p; return ret; - err: +err: + if (nm.x != NULL) + X509_NAME_free(nm.x); ASN1err(ASN1_F_X509_NAME_EX_D2I, ERR_R_NESTED_ASN1_ERROR); return 0; } diff --git a/crypto/openssl/crypto/asn1/x_pubkey.c b/crypto/openssl/crypto/asn1/x_pubkey.c index 91c27561161..94d9f7ebab9 100644 --- a/crypto/openssl/crypto/asn1/x_pubkey.c +++ b/crypto/openssl/crypto/asn1/x_pubkey.c @@ -367,7 +367,16 @@ EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key) goto err; } - key->pkey = ret; + /* Check to see if another thread set key->pkey first */ + CRYPTO_w_lock(CRYPTO_LOCK_EVP_PKEY); + if (key->pkey) + { + EVP_PKEY_free(ret); + ret = key->pkey; + } + else + key->pkey = ret; + CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY); CRYPTO_add(&ret->references, 1, CRYPTO_LOCK_EVP_PKEY); return(ret); err: diff --git a/crypto/openssl/crypto/bio/bf_buff.c b/crypto/openssl/crypto/bio/bf_buff.c index c1fd75aaad8..4b5a132d8a1 100644 --- a/crypto/openssl/crypto/bio/bf_buff.c +++ b/crypto/openssl/crypto/bio/bf_buff.c @@ -209,7 +209,7 @@ start: /* add to buffer and return */ if (i >= inl) { - memcpy(&(ctx->obuf[ctx->obuf_len]),in,inl); + memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,inl); ctx->obuf_len+=inl; return(num+inl); } @@ -219,7 +219,7 @@ start: { if (i > 0) /* lets fill it up if we can */ { - memcpy(&(ctx->obuf[ctx->obuf_len]),in,i); + memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,i); in+=i; inl-=i; num+=i; @@ -294,9 +294,9 @@ static long buffer_ctrl(BIO *b, int cmd, long num, void *ptr) case BIO_C_GET_BUFF_NUM_LINES: ret=0; p1=ctx->ibuf; - for (i=ctx->ibuf_off; iibuf_len; i++) + for (i=0; iibuf_len; i++) { - if (p1[i] == '\n') ret++; + if (p1[ctx->ibuf_off + i] == '\n') ret++; } break; case BIO_CTRL_WPENDING: @@ -399,17 +399,18 @@ static long buffer_ctrl(BIO *b, int cmd, long num, void *ptr) for (;;) { BIO_clear_retry_flags(b); - if (ctx->obuf_len > ctx->obuf_off) + if (ctx->obuf_len > 0) { r=BIO_write(b->next_bio, &(ctx->obuf[ctx->obuf_off]), - ctx->obuf_len-ctx->obuf_off); + ctx->obuf_len); #if 0 -fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len-ctx->obuf_off,r); +fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len,r); #endif BIO_copy_next_retry(b); if (r <= 0) return((long)r); ctx->obuf_off+=r; + ctx->obuf_len-=r; } else { diff --git a/crypto/openssl/crypto/bio/bio.h b/crypto/openssl/crypto/bio/bio.h index ebb42781e6e..03bd3b28758 100644 --- a/crypto/openssl/crypto/bio/bio.h +++ b/crypto/openssl/crypto/bio/bio.h @@ -145,6 +145,7 @@ extern "C" { /* #endif */ #define BIO_CTRL_DGRAM_QUERY_MTU 40 /* as kernel for current MTU */ +#define BIO_CTRL_DGRAM_GET_FALLBACK_MTU 47 #define BIO_CTRL_DGRAM_GET_MTU 41 /* get cached value for MTU */ #define BIO_CTRL_DGRAM_SET_MTU 42 /* set cached value for * MTU. want to use this @@ -321,6 +322,15 @@ DECLARE_STACK_OF(BIO) typedef struct bio_f_buffer_ctx_struct { + /* Buffers are setup like this: + * + * <---------------------- size -----------------------> + * +---------------------------------------------------+ + * | consumed | remaining | free space | + * +---------------------------------------------------+ + * <-- off --><------- len -------> + */ + /* BIO *bio; */ /* this is now in the BIO struct */ int ibuf_size; /* how big is the input buffer */ int obuf_size; /* how big is the output buffer */ diff --git a/crypto/openssl/crypto/bio/bss_dgram.c b/crypto/openssl/crypto/bio/bss_dgram.c index 14ca854b4af..e0327bdea67 100644 --- a/crypto/openssl/crypto/bio/bss_dgram.c +++ b/crypto/openssl/crypto/bio/bss_dgram.c @@ -57,7 +57,6 @@ * */ -#ifndef OPENSSL_NO_DGRAM #include #include @@ -65,6 +64,7 @@ #include "cryptlib.h" #include +#ifndef OPENSSL_NO_DGRAM #if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) #include @@ -288,7 +288,6 @@ static int dgram_read(BIO *b, char *out, int outl) */ dgram_adjust_rcv_timeout(b); ret=recvfrom(b->num,out,outl,0,&peer,(void *)&peerlen); - dgram_reset_rcv_timeout(b); if ( ! data->connected && ret >= 0) BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &peer); @@ -302,6 +301,8 @@ static int dgram_read(BIO *b, char *out, int outl) data->_errno = get_last_socket_error(); } } + + dgram_reset_rcv_timeout(b); } return(ret); } @@ -493,6 +494,9 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) ret = 0; #endif break; + case BIO_CTRL_DGRAM_GET_FALLBACK_MTU: + ret = 576 - 20 - 8; + break; case BIO_CTRL_DGRAM_GET_MTU: return data->mtu; break; @@ -654,9 +658,13 @@ static int BIO_dgram_should_retry(int i) { err=get_last_socket_error(); -#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ - if ((i == -1) && (err == 0)) - return(1); +#if defined(OPENSSL_SYS_WINDOWS) + /* If the socket return value (i) is -1 + * and err is unexpectedly 0 at this point, + * the error code was overwritten by + * another system call before this error + * handling is called. + */ #endif return(BIO_dgram_non_fatal_error(err)); @@ -719,7 +727,6 @@ int BIO_dgram_non_fatal_error(int err) } return(0); } -#endif static void get_current_time(struct timeval *t) { @@ -737,3 +744,5 @@ static void get_current_time(struct timeval *t) gettimeofday(t, NULL); #endif } + +#endif diff --git a/crypto/openssl/crypto/bn/asm/mo-586.pl b/crypto/openssl/crypto/bn/asm/mo-586.pl index 0982293094d..061127e0b11 100755 --- a/crypto/openssl/crypto/bn/asm/mo-586.pl +++ b/crypto/openssl/crypto/bn/asm/mo-586.pl @@ -539,8 +539,10 @@ $sbit=$num; &jle (&label("sqradd")); &mov ($carry,"edx"); - &lea ("edx",&DWP(0,$sbit,"edx",2)); + &add ("edx","edx"); &shr ($carry,31); + &add ("edx",$sbit); + &adc ($carry,0); &set_label("sqrlast"); &mov ($word,$_n0); &mov ($inp,$_np); diff --git a/crypto/openssl/crypto/bn/asm/ppc.pl b/crypto/openssl/crypto/bn/asm/ppc.pl index 806e53ad6e1..84448836e3d 100644 --- a/crypto/openssl/crypto/bn/asm/ppc.pl +++ b/crypto/openssl/crypto/bn/asm/ppc.pl @@ -1039,7 +1039,7 @@ sub data { addze r11,r0 #mul_add_c(a[3],b[2],c3,c1,c2); $LD r6,`3*$BNSZ`(r4) - $LD r7,`2*$BNSZ`(r4) + $LD r7,`2*$BNSZ`(r5) $UMULL r8,r6,r7 $UMULH r9,r6,r7 addc r12,r8,r12 diff --git a/crypto/openssl/crypto/bn/bn_blind.c b/crypto/openssl/crypto/bn/bn_blind.c index c11fb4ccc2d..ca7f996bc8a 100644 --- a/crypto/openssl/crypto/bn/bn_blind.c +++ b/crypto/openssl/crypto/bn/bn_blind.c @@ -123,7 +123,7 @@ struct bn_blinding_st BIGNUM *mod; /* just a reference */ unsigned long thread_id; /* added in OpenSSL 0.9.6j and 0.9.7b; * used only by crypto/rsa/rsa_eay.c, rsa_lib.c */ - unsigned int counter; + int counter; unsigned long flags; BN_MONT_CTX *m_ctx; int (*bn_mod_exp)(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, @@ -157,7 +157,10 @@ BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, /* const */ BIGN if (BN_get_flags(mod, BN_FLG_CONSTTIME) != 0) BN_set_flags(ret->mod, BN_FLG_CONSTTIME); - ret->counter = BN_BLINDING_COUNTER; + /* Set the counter to the special value -1 + * to indicate that this is never-used fresh blinding + * that does not need updating before first use. */ + ret->counter = -1; return(ret); err: if (ret != NULL) BN_BLINDING_free(ret); @@ -186,7 +189,10 @@ int BN_BLINDING_update(BN_BLINDING *b, BN_CTX *ctx) goto err; } - if (--(b->counter) == 0 && b->e != NULL && + if (b->counter == -1) + b->counter = 0; + + if (++b->counter == BN_BLINDING_COUNTER && b->e != NULL && !(b->flags & BN_BLINDING_NO_RECREATE)) { /* re-create blinding parameters */ @@ -201,8 +207,8 @@ int BN_BLINDING_update(BN_BLINDING *b, BN_CTX *ctx) ret=1; err: - if (b->counter == 0) - b->counter = BN_BLINDING_COUNTER; + if (b->counter == BN_BLINDING_COUNTER) + b->counter = 0; return(ret); } @@ -223,6 +229,12 @@ int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *ctx) return(0); } + if (b->counter == -1) + /* Fresh blinding, doesn't need updating. */ + b->counter = 0; + else if (!BN_BLINDING_update(b,ctx)) + return(0); + if (r != NULL) { if (!BN_copy(r, b->Ai)) ret=0; @@ -243,22 +255,19 @@ int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, BN_CTX *ct int ret; bn_check_top(n); - if ((b->A == NULL) || (b->Ai == NULL)) - { - BNerr(BN_F_BN_BLINDING_INVERT_EX,BN_R_NOT_INITIALIZED); - return(0); - } if (r != NULL) ret = BN_mod_mul(n, n, r, b->mod, ctx); else - ret = BN_mod_mul(n, n, b->Ai, b->mod, ctx); - - if (ret >= 0) { - if (!BN_BLINDING_update(b,ctx)) + if (b->Ai == NULL) + { + BNerr(BN_F_BN_BLINDING_INVERT_EX,BN_R_NOT_INITIALIZED); return(0); + } + ret = BN_mod_mul(n, n, b->Ai, b->mod, ctx); } + bn_check_top(n); return(ret); } diff --git a/crypto/openssl/crypto/bn/bn_gf2m.c b/crypto/openssl/crypto/bn/bn_gf2m.c index ae642ccb394..5d90f1e88be 100644 --- a/crypto/openssl/crypto/bn/bn_gf2m.c +++ b/crypto/openssl/crypto/bn/bn_gf2m.c @@ -607,6 +607,7 @@ int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) { while (!BN_is_odd(u)) { + if (BN_is_zero(u)) goto err; if (!BN_rshift1(u, u)) goto err; if (BN_is_odd(b)) { diff --git a/crypto/openssl/crypto/buffer/buffer.c b/crypto/openssl/crypto/buffer/buffer.c index b3e947771d5..3b4c79f7048 100644 --- a/crypto/openssl/crypto/buffer/buffer.c +++ b/crypto/openssl/crypto/buffer/buffer.c @@ -60,6 +60,11 @@ #include "cryptlib.h" #include +/* LIMIT_BEFORE_EXPANSION is the maximum n such that (n+3)/3*4 < 2**31. That + * function is applied in several functions in this file and this limit ensures + * that the result fits in an int. */ +#define LIMIT_BEFORE_EXPANSION 0x5ffffffc + BUF_MEM *BUF_MEM_new(void) { BUF_MEM *ret; @@ -94,6 +99,11 @@ int BUF_MEM_grow(BUF_MEM *str, int len) char *ret; unsigned int n; + if (len < 0) + { + BUFerr(BUF_F_BUF_MEM_GROW,ERR_R_MALLOC_FAILURE); + return 0; + } if (str->length >= len) { str->length=len; @@ -105,6 +115,12 @@ int BUF_MEM_grow(BUF_MEM *str, int len) str->length=len; return(len); } + /* This limit is sufficient to ensure (len+3)/3*4 < 2**31 */ + if (len > LIMIT_BEFORE_EXPANSION) + { + BUFerr(BUF_F_BUF_MEM_GROW,ERR_R_MALLOC_FAILURE); + return 0; + } n=(len+3)/3*4; if (str->data == NULL) ret=OPENSSL_malloc(n); @@ -130,6 +146,11 @@ int BUF_MEM_grow_clean(BUF_MEM *str, int len) char *ret; unsigned int n; + if (len < 0) + { + BUFerr(BUF_F_BUF_MEM_GROW_CLEAN,ERR_R_MALLOC_FAILURE); + return 0; + } if (str->length >= len) { memset(&str->data[len],0,str->length-len); @@ -142,6 +163,12 @@ int BUF_MEM_grow_clean(BUF_MEM *str, int len) str->length=len; return(len); } + /* This limit is sufficient to ensure (len+3)/3*4 < 2**31 */ + if (len > LIMIT_BEFORE_EXPANSION) + { + BUFerr(BUF_F_BUF_MEM_GROW_CLEAN,ERR_R_MALLOC_FAILURE); + return 0; + } n=(len+3)/3*4; if (str->data == NULL) ret=OPENSSL_malloc(n); diff --git a/crypto/openssl/crypto/cms/cms.h b/crypto/openssl/crypto/cms/cms.h index 25f88745f23..75e3be0e4bc 100644 --- a/crypto/openssl/crypto/cms/cms.h +++ b/crypto/openssl/crypto/cms/cms.h @@ -110,6 +110,7 @@ DECLARE_ASN1_FUNCTIONS_const(CMS_ReceiptRequest) #define CMS_PARTIAL 0x4000 #define CMS_REUSE_DIGEST 0x8000 #define CMS_USE_KEYID 0x10000 +#define CMS_DEBUG_DECRYPT 0x20000 const ASN1_OBJECT *CMS_get0_type(CMS_ContentInfo *cms); diff --git a/crypto/openssl/crypto/cms/cms_enc.c b/crypto/openssl/crypto/cms/cms_enc.c index bab26235bdc..f873ce37944 100644 --- a/crypto/openssl/crypto/cms/cms_enc.c +++ b/crypto/openssl/crypto/cms/cms_enc.c @@ -73,6 +73,8 @@ BIO *cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec) const EVP_CIPHER *ciph; X509_ALGOR *calg = ec->contentEncryptionAlgorithm; unsigned char iv[EVP_MAX_IV_LENGTH], *piv = NULL; + unsigned char *tkey = NULL; + size_t tkeylen; int ok = 0; @@ -137,32 +139,57 @@ BIO *cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec) CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR); goto err; } - - - if (enc && !ec->key) + tkeylen = EVP_CIPHER_CTX_key_length(ctx); + /* Generate random session key */ + if (!enc || !ec->key) { - /* Generate random key */ - if (!ec->keylen) - ec->keylen = EVP_CIPHER_CTX_key_length(ctx); - ec->key = OPENSSL_malloc(ec->keylen); - if (!ec->key) + tkey = OPENSSL_malloc(tkeylen); + if (!tkey) { CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, ERR_R_MALLOC_FAILURE); goto err; } - if (EVP_CIPHER_CTX_rand_key(ctx, ec->key) <= 0) + if (EVP_CIPHER_CTX_rand_key(ctx, tkey) <= 0) goto err; - keep_key = 1; } - else if (ec->keylen != (unsigned int)EVP_CIPHER_CTX_key_length(ctx)) + + if (!ec->key) + { + ec->key = tkey; + ec->keylen = tkeylen; + tkey = NULL; + if (enc) + keep_key = 1; + else + ERR_clear_error(); + + } + + if (ec->keylen != tkeylen) { /* If necessary set key length */ if (EVP_CIPHER_CTX_set_key_length(ctx, ec->keylen) <= 0) { - CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, - CMS_R_INVALID_KEY_LENGTH); - goto err; + /* Only reveal failure if debugging so we don't + * leak information which may be useful in MMA. + */ + if (enc || ec->debug) + { + CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, + CMS_R_INVALID_KEY_LENGTH); + goto err; + } + else + { + /* Use random key */ + OPENSSL_cleanse(ec->key, ec->keylen); + OPENSSL_free(ec->key); + ec->key = tkey; + ec->keylen = tkeylen; + tkey = NULL; + ERR_clear_error(); + } } } @@ -198,6 +225,11 @@ BIO *cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec) OPENSSL_free(ec->key); ec->key = NULL; } + if (tkey) + { + OPENSSL_cleanse(tkey, tkeylen); + OPENSSL_free(tkey); + } if (ok) return b; BIO_free(b); diff --git a/crypto/openssl/crypto/cms/cms_env.c b/crypto/openssl/crypto/cms/cms_env.c index d499ae85b40..b8685fa1759 100644 --- a/crypto/openssl/crypto/cms/cms_env.c +++ b/crypto/openssl/crypto/cms/cms_env.c @@ -352,6 +352,8 @@ static int cms_RecipientInfo_ktri_decrypt(CMS_ContentInfo *cms, unsigned char *ek = NULL; int eklen; int ret = 0; + CMS_EncryptedContentInfo *ec; + ec = cms->d.envelopedData->encryptedContentInfo; if (ktri->pkey == NULL) { @@ -382,8 +384,14 @@ static int cms_RecipientInfo_ktri_decrypt(CMS_ContentInfo *cms, ret = 1; - cms->d.envelopedData->encryptedContentInfo->key = ek; - cms->d.envelopedData->encryptedContentInfo->keylen = eklen; + if (ec->key) + { + OPENSSL_cleanse(ec->key, ec->keylen); + OPENSSL_free(ec->key); + } + + ec->key = ek; + ec->keylen = eklen; err: if (!ret && ek) diff --git a/crypto/openssl/crypto/cms/cms_io.c b/crypto/openssl/crypto/cms/cms_io.c index 30f5ddfe6d2..6d3edba5f72 100644 --- a/crypto/openssl/crypto/cms/cms_io.c +++ b/crypto/openssl/crypto/cms/cms_io.c @@ -112,7 +112,7 @@ static int cms_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, cmsbio = tmpbio; } - return 1; + return r; } diff --git a/crypto/openssl/crypto/cms/cms_lcl.h b/crypto/openssl/crypto/cms/cms_lcl.h index 7d60fac67eb..ce65d6ef665 100644 --- a/crypto/openssl/crypto/cms/cms_lcl.h +++ b/crypto/openssl/crypto/cms/cms_lcl.h @@ -175,6 +175,8 @@ struct CMS_EncryptedContentInfo_st const EVP_CIPHER *cipher; unsigned char *key; size_t keylen; + /* Set to 1 if we are debugging decrypt and don't fake keys for MMA */ + int debug; }; struct CMS_RecipientInfo_st diff --git a/crypto/openssl/crypto/cms/cms_smime.c b/crypto/openssl/crypto/cms/cms_smime.c index f35883aa22b..2be07c2099a 100644 --- a/crypto/openssl/crypto/cms/cms_smime.c +++ b/crypto/openssl/crypto/cms/cms_smime.c @@ -622,7 +622,10 @@ int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert) STACK_OF(CMS_RecipientInfo) *ris; CMS_RecipientInfo *ri; int i, r; + int debug = 0; ris = CMS_get0_RecipientInfos(cms); + if (ris) + debug = cms->d.envelopedData->encryptedContentInfo->debug; for (i = 0; i < sk_CMS_RecipientInfo_num(ris); i++) { ri = sk_CMS_RecipientInfo_value(ris, i); @@ -636,17 +639,38 @@ int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert) CMS_RecipientInfo_set0_pkey(ri, pk); r = CMS_RecipientInfo_decrypt(cms, ri); CMS_RecipientInfo_set0_pkey(ri, NULL); - if (r > 0) - return 1; if (cert) { + /* If not debugging clear any error and + * return success to avoid leaking of + * information useful to MMA + */ + if (!debug) + { + ERR_clear_error(); + return 1; + } + if (r > 0) + return 1; CMSerr(CMS_F_CMS_DECRYPT_SET1_PKEY, CMS_R_DECRYPT_ERROR); return 0; } - ERR_clear_error(); + /* If no cert and not debugging don't leave loop + * after first successful decrypt. Always attempt + * to decrypt all recipients to avoid leaking timing + * of a successful decrypt. + */ + else if (r > 0 && debug) + return 1; } } + /* If no cert and not debugging always return success */ + if (!cert && !debug) + { + ERR_clear_error(); + return 1; + } CMSerr(CMS_F_CMS_DECRYPT_SET1_PKEY, CMS_R_NO_MATCHING_RECIPIENT); return 0; @@ -705,9 +729,14 @@ int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert, } if (!dcont && !check_content(cms)) return 0; + if (flags & CMS_DEBUG_DECRYPT) + cms->d.envelopedData->encryptedContentInfo->debug = 1; + else + cms->d.envelopedData->encryptedContentInfo->debug = 0; + if (!pk && !cert && !dcont && !out) + return 1; if (pk && !CMS_decrypt_set1_pkey(cms, pk, cert)) return 0; - cont = CMS_dataInit(cms, dcont); if (!cont) return 0; diff --git a/crypto/openssl/crypto/comp/c_rle.c b/crypto/openssl/crypto/comp/c_rle.c index efd366fa223..18bceae51e7 100644 --- a/crypto/openssl/crypto/comp/c_rle.c +++ b/crypto/openssl/crypto/comp/c_rle.c @@ -46,7 +46,7 @@ static int rle_expand_block(COMP_CTX *ctx, unsigned char *out, { int i; - if (olen < (ilen-1)) + if (ilen == 0 || olen < (ilen-1)) { /* ZZZZZZZZZZZZZZZZZZZZZZ */ return(-1); @@ -59,4 +59,3 @@ static int rle_expand_block(COMP_CTX *ctx, unsigned char *out, } return(ilen-1); } - diff --git a/crypto/openssl/crypto/conf/conf_api.c b/crypto/openssl/crypto/conf/conf_api.c index 909d72b4b89..17bae8359f0 100644 --- a/crypto/openssl/crypto/conf/conf_api.c +++ b/crypto/openssl/crypto/conf/conf_api.c @@ -64,6 +64,7 @@ #endif #include +#include #include #include #include diff --git a/crypto/openssl/crypto/cryptlib.c b/crypto/openssl/crypto/cryptlib.c index 497d00363e9..dd74ea8855f 100644 --- a/crypto/openssl/crypto/cryptlib.c +++ b/crypto/openssl/crypto/cryptlib.c @@ -396,7 +396,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: - ERR_remove_state(0); break; case DLL_PROCESS_DETACH: break; diff --git a/crypto/openssl/crypto/crypto.h b/crypto/openssl/crypto/crypto.h index 0e4fb0723ce..fc1374fad5f 100644 --- a/crypto/openssl/crypto/crypto.h +++ b/crypto/openssl/crypto/crypto.h @@ -588,15 +588,15 @@ int OPENSSL_isservice(void); #endif /* def OPENSSL_FIPS */ +#define OPENSSL_HAVE_INIT 1 +void OPENSSL_init(void); + /* BEGIN ERROR CODES */ /* The following lines are auto generated by the script mkerr.pl. Any changes * made after this point may be overwritten when the script is next run. */ void ERR_load_CRYPTO_strings(void); -#define OPENSSL_HAVE_INIT 1 -void OPENSSL_init(void); - /* Error codes for the CRYPTO functions. */ /* Function codes. */ diff --git a/crypto/openssl/crypto/ec/ec2_smpl.c b/crypto/openssl/crypto/ec/ec2_smpl.c index 522d036ca1d..c06b3b667f0 100644 --- a/crypto/openssl/crypto/ec/ec2_smpl.c +++ b/crypto/openssl/crypto/ec/ec2_smpl.c @@ -821,7 +821,7 @@ int ec_GF2m_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_ field_sqr = group->meth->field_sqr; /* only support affine coordinates */ - if (!point->Z_is_one) goto err; + if (!point->Z_is_one) return -1; if (ctx == NULL) { @@ -871,6 +871,9 @@ int ec_GF2m_simple_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT { return EC_POINT_is_at_infinity(group, b) ? 0 : 1; } + + if (EC_POINT_is_at_infinity(group, b)) + return 1; if (a->Z_is_one && b->Z_is_one) { diff --git a/crypto/openssl/crypto/ec/ec_key.c b/crypto/openssl/crypto/ec/ec_key.c index 12fb0e6d6d7..522802c07ae 100644 --- a/crypto/openssl/crypto/ec/ec_key.c +++ b/crypto/openssl/crypto/ec/ec_key.c @@ -304,7 +304,13 @@ int EC_KEY_check_key(const EC_KEY *eckey) ECerr(EC_F_EC_KEY_CHECK_KEY, ERR_R_PASSED_NULL_PARAMETER); return 0; } - + + if (EC_POINT_is_at_infinity(eckey->group, eckey->pub_key)) + { + ECerr(EC_F_EC_KEY_CHECK_KEY, EC_R_POINT_AT_INFINITY); + goto err; + } + if ((ctx = BN_CTX_new()) == NULL) goto err; if ((point = EC_POINT_new(eckey->group)) == NULL) diff --git a/crypto/openssl/crypto/ec/ecp_smpl.c b/crypto/openssl/crypto/ec/ecp_smpl.c index 4d26f8bdf69..66a92e2a900 100644 --- a/crypto/openssl/crypto/ec/ecp_smpl.c +++ b/crypto/openssl/crypto/ec/ecp_smpl.c @@ -1406,6 +1406,9 @@ int ec_GFp_simple_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT * { return EC_POINT_is_at_infinity(group, b) ? 0 : 1; } + + if (EC_POINT_is_at_infinity(group, b)) + return 1; if (a->Z_is_one && b->Z_is_one) { diff --git a/crypto/openssl/crypto/ecdsa/ecdsatest.c b/crypto/openssl/crypto/ecdsa/ecdsatest.c index b07e31252b9..1ad507d4717 100644 --- a/crypto/openssl/crypto/ecdsa/ecdsatest.c +++ b/crypto/openssl/crypto/ecdsa/ecdsatest.c @@ -168,10 +168,9 @@ int fbytes(unsigned char *buf, int num) return 0; } fbytes_counter ++; - ret = BN_bn2bin(tmp, buf); - if (ret == 0 || ret != num) + if (num != BN_num_bytes(tmp) || !BN_bn2bin(tmp, buf)) ret = 0; - else + else ret = 1; if (tmp) BN_free(tmp); @@ -287,9 +286,13 @@ int test_builtin(BIO *out) size_t crv_len = 0, n = 0; EC_KEY *eckey = NULL, *wrong_eckey = NULL; EC_GROUP *group; + ECDSA_SIG *ecdsa_sig = NULL; unsigned char digest[20], wrong_digest[20]; - unsigned char *signature = NULL; - unsigned int sig_len; + unsigned char *signature = NULL; + const unsigned char *sig_ptr; + unsigned char *sig_ptr2; + unsigned char *raw_buf = NULL; + unsigned int sig_len, degree, r_len, s_len, bn_len, buf_len; int nid, ret = 0; /* fill digest values with some random data */ @@ -339,7 +342,8 @@ int test_builtin(BIO *out) if (EC_KEY_set_group(eckey, group) == 0) goto builtin_err; EC_GROUP_free(group); - if (EC_GROUP_get_degree(EC_KEY_get0_group(eckey)) < 160) + degree = EC_GROUP_get_degree(EC_KEY_get0_group(eckey)); + if (degree < 160) /* drop the curve */ { EC_KEY_free(eckey); @@ -415,26 +419,89 @@ int test_builtin(BIO *out) } BIO_printf(out, "."); (void)BIO_flush(out); - /* modify a single byte of the signature */ - offset = signature[10] % sig_len; - dirt = signature[11]; - signature[offset] ^= dirt ? dirt : 1; + /* wrong length */ + if (ECDSA_verify(0, digest, 20, signature, sig_len - 1, + eckey) == 1) + { + BIO_printf(out, " failed\n"); + goto builtin_err; + } + BIO_printf(out, "."); + (void)BIO_flush(out); + + /* Modify a single byte of the signature: to ensure we don't + * garble the ASN1 structure, we read the raw signature and + * modify a byte in one of the bignums directly. */ + sig_ptr = signature; + if ((ecdsa_sig = d2i_ECDSA_SIG(NULL, &sig_ptr, sig_len)) == NULL) + { + BIO_printf(out, " failed\n"); + goto builtin_err; + } + + /* Store the two BIGNUMs in raw_buf. */ + r_len = BN_num_bytes(ecdsa_sig->r); + s_len = BN_num_bytes(ecdsa_sig->s); + bn_len = (degree + 7) / 8; + if ((r_len > bn_len) || (s_len > bn_len)) + { + BIO_printf(out, " failed\n"); + goto builtin_err; + } + buf_len = 2 * bn_len; + if ((raw_buf = OPENSSL_malloc(buf_len)) == NULL) + goto builtin_err; + /* Pad the bignums with leading zeroes. */ + memset(raw_buf, 0, buf_len); + BN_bn2bin(ecdsa_sig->r, raw_buf + bn_len - r_len); + BN_bn2bin(ecdsa_sig->s, raw_buf + buf_len - s_len); + + /* Modify a single byte in the buffer. */ + offset = raw_buf[10] % buf_len; + dirt = raw_buf[11] ? raw_buf[11] : 1; + raw_buf[offset] ^= dirt; + /* Now read the BIGNUMs back in from raw_buf. */ + if ((BN_bin2bn(raw_buf, bn_len, ecdsa_sig->r) == NULL) || + (BN_bin2bn(raw_buf + bn_len, bn_len, ecdsa_sig->s) == NULL)) + goto builtin_err; + + sig_ptr2 = signature; + sig_len = i2d_ECDSA_SIG(ecdsa_sig, &sig_ptr2); if (ECDSA_verify(0, digest, 20, signature, sig_len, eckey) == 1) { BIO_printf(out, " failed\n"); goto builtin_err; } + /* Sanity check: undo the modification and verify signature. */ + raw_buf[offset] ^= dirt; + if ((BN_bin2bn(raw_buf, bn_len, ecdsa_sig->r) == NULL) || + (BN_bin2bn(raw_buf + bn_len, bn_len, ecdsa_sig->s) == NULL)) + goto builtin_err; + + sig_ptr2 = signature; + sig_len = i2d_ECDSA_SIG(ecdsa_sig, &sig_ptr2); + if (ECDSA_verify(0, digest, 20, signature, sig_len, eckey) != 1) + { + BIO_printf(out, " failed\n"); + goto builtin_err; + } BIO_printf(out, "."); (void)BIO_flush(out); BIO_printf(out, " ok\n"); /* cleanup */ + /* clean bogus errors */ + ERR_clear_error(); OPENSSL_free(signature); signature = NULL; EC_KEY_free(eckey); eckey = NULL; EC_KEY_free(wrong_eckey); wrong_eckey = NULL; + ECDSA_SIG_free(ecdsa_sig); + ecdsa_sig = NULL; + OPENSSL_free(raw_buf); + raw_buf = NULL; } ret = 1; @@ -443,8 +510,12 @@ builtin_err: EC_KEY_free(eckey); if (wrong_eckey) EC_KEY_free(wrong_eckey); + if (ecdsa_sig) + ECDSA_SIG_free(ecdsa_sig); if (signature) OPENSSL_free(signature); + if (raw_buf) + OPENSSL_free(raw_buf); if (curves) OPENSSL_free(curves); diff --git a/crypto/openssl/crypto/ecdsa/ecs_ossl.c b/crypto/openssl/crypto/ecdsa/ecs_ossl.c index 551cf5068fa..1bbf328de54 100644 --- a/crypto/openssl/crypto/ecdsa/ecs_ossl.c +++ b/crypto/openssl/crypto/ecdsa/ecs_ossl.c @@ -144,6 +144,14 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp, } while (BN_is_zero(k)); + /* We do not want timing information to leak the length of k, + * so we compute G*k using an equivalent scalar of fixed + * bit-length. */ + + if (!BN_add(k, k, order)) goto err; + if (BN_num_bits(k) <= BN_num_bits(order)) + if (!BN_add(k, k, order)) goto err; + /* compute r the x-coordinate of generator * k */ if (!EC_POINT_mul(group, tmp_point, k, NULL, NULL, ctx)) { diff --git a/crypto/openssl/crypto/evp/evp_test.c b/crypto/openssl/crypto/evp/evp_test.c index 436be20bf10..a36ca7e4b37 100644 --- a/crypto/openssl/crypto/evp/evp_test.c +++ b/crypto/openssl/crypto/evp/evp_test.c @@ -435,6 +435,7 @@ int main(int argc,char **argv) EXIT(3); } } + fclose(f); #ifndef OPENSSL_NO_ENGINE ENGINE_cleanup(); diff --git a/crypto/openssl/crypto/mem.c b/crypto/openssl/crypto/mem.c index 00ebaf0b9b5..05d7b9cd3d7 100644 --- a/crypto/openssl/crypto/mem.c +++ b/crypto/openssl/crypto/mem.c @@ -372,6 +372,10 @@ void *CRYPTO_realloc_clean(void *str, int old_len, int num, const char *file, if (num <= 0) return NULL; + /* We don't support shrinking the buffer. Note the memcpy that copies + * |old_len| bytes to the new buffer, below. */ + if (num < old_len) return NULL; + if (realloc_debug_func != NULL) realloc_debug_func(str, NULL, num, file, line, 0); ret=malloc_ex_func(num,file,line); diff --git a/crypto/openssl/crypto/ocsp/ocsp_lib.c b/crypto/openssl/crypto/ocsp/ocsp_lib.c index 27450811d72..441ccb7a9e4 100755 --- a/crypto/openssl/crypto/ocsp/ocsp_lib.c +++ b/crypto/openssl/crypto/ocsp/ocsp_lib.c @@ -169,14 +169,14 @@ int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pss char *host, *port; - /* dup the buffer since we are going to mess with it */ - buf = BUF_strdup(url); - if (!buf) goto mem_err; - *phost = NULL; *pport = NULL; *ppath = NULL; + /* dup the buffer since we are going to mess with it */ + buf = BUF_strdup(url); + if (!buf) goto mem_err; + /* Check for initial colon */ p = strchr(buf, ':'); diff --git a/crypto/openssl/crypto/opensslv.h b/crypto/openssl/crypto/opensslv.h index 0da91c26dd4..516940c887c 100644 --- a/crypto/openssl/crypto/opensslv.h +++ b/crypto/openssl/crypto/opensslv.h @@ -25,11 +25,11 @@ * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for * major minor fix final patch/beta) */ -#define OPENSSL_VERSION_NUMBER 0x0090811f +#define OPENSSL_VERSION_NUMBER 0x0090818fL #ifdef OPENSSL_FIPS -#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8q-fips 2 Dec 2010" +#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8x-fips 10 May 2012" #else -#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8q 2 Dec 2010" +#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8x 10 May 2012" #endif #define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT diff --git a/crypto/openssl/crypto/perlasm/cbc.pl b/crypto/openssl/crypto/perlasm/cbc.pl index e43dc9ae15e..6fc2510905b 100644 --- a/crypto/openssl/crypto/perlasm/cbc.pl +++ b/crypto/openssl/crypto/perlasm/cbc.pl @@ -158,7 +158,6 @@ sub cbc &jmp_ptr($count); &set_label("ej7"); - &xor("edx", "edx") if $ppro; # ppro friendly &movb(&HB("edx"), &BP(6,$in,"",0)); &shl("edx",8); &set_label("ej6"); @@ -170,7 +169,6 @@ sub cbc &jmp(&label("ejend")); &set_label("ej3"); &movb(&HB("ecx"), &BP(2,$in,"",0)); - &xor("ecx", "ecx") if $ppro; # ppro friendly &shl("ecx",8); &set_label("ej2"); &movb(&HB("ecx"), &BP(1,$in,"",0)); diff --git a/crypto/openssl/crypto/pkcs7/pk7_doit.c b/crypto/openssl/crypto/pkcs7/pk7_doit.c index c8f1eb1b458..8b3024e7740 100644 --- a/crypto/openssl/crypto/pkcs7/pk7_doit.c +++ b/crypto/openssl/crypto/pkcs7/pk7_doit.c @@ -420,6 +420,8 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert) int max; X509_OBJECT ret; #endif + unsigned char *tkey = NULL; + int tkeylen; int jj; if ((etmp=BIO_new(BIO_f_cipher())) == NULL) @@ -461,36 +463,42 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert) if (pcert == NULL) { + /* Temporary storage in case EVP_PKEY_decrypt + * overwrites output buffer on error. + */ + unsigned char *tmp2; + tmp2 = OPENSSL_malloc(jj); + if (!tmp2) + goto err; + jj = -1; + /* Always attempt to decrypt all cases to avoid + * leaking timing information about a successful + * decrypt. + */ for (i=0; ienc_key), M_ASN1_STRING_length(ri->enc_key), pkey); - if (jj > 0) - break; + if (tret > 0) + { + memcpy(tmp, tmp2, tret); + OPENSSL_cleanse(tmp2, tret); + jj = tret; + } ERR_clear_error(); - ri = NULL; - } - if (ri == NULL) - { - PKCS7err(PKCS7_F_PKCS7_DATADECODE, - PKCS7_R_NO_RECIPIENT_MATCHES_KEY); - goto err; } + OPENSSL_free(tmp2); } else { jj=EVP_PKEY_decrypt(tmp, M_ASN1_STRING_data(ri->enc_key), M_ASN1_STRING_length(ri->enc_key), pkey); - if (jj <= 0) - { - PKCS7err(PKCS7_F_PKCS7_DATADECODE, - ERR_R_EVP_LIB); - goto err; - } + ERR_clear_error(); } evp_ctx=NULL; @@ -499,24 +507,49 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert) goto err; if (EVP_CIPHER_asn1_to_param(evp_ctx,enc_alg->parameter) < 0) goto err; + /* Generate random key to counter MMA */ + tkeylen = EVP_CIPHER_CTX_key_length(evp_ctx); + tkey = OPENSSL_malloc(tkeylen); + if (!tkey) + goto err; + if (EVP_CIPHER_CTX_rand_key(evp_ctx, tkey) <= 0) + goto err; + /* If we have no key use random key */ + if (jj <= 0) + { + OPENSSL_free(tmp); + jj = tkeylen; + tmp = tkey; + tkey = NULL; + } - if (jj != EVP_CIPHER_CTX_key_length(evp_ctx)) { + if (jj != tkeylen) { /* Some S/MIME clients don't use the same key * and effective key length. The key length is * determined by the size of the decrypted RSA key. */ if(!EVP_CIPHER_CTX_set_key_length(evp_ctx, jj)) { - PKCS7err(PKCS7_F_PKCS7_DATADECODE, - PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH); - goto err; + /* As MMA defence use random key instead */ + OPENSSL_cleanse(tmp, jj); + OPENSSL_free(tmp); + jj = tkeylen; + tmp = tkey; + tkey = NULL; } } + ERR_clear_error(); if (EVP_CipherInit_ex(evp_ctx,NULL,NULL,tmp,NULL,0) <= 0) goto err; OPENSSL_cleanse(tmp,jj); + if (tkey) + { + OPENSSL_cleanse(tkey, tkeylen); + OPENSSL_free(tkey); + } + if (out == NULL) out=etmp; else diff --git a/crypto/openssl/crypto/pkcs7/pk7_smime.c b/crypto/openssl/crypto/pkcs7/pk7_smime.c index fd18ec3d95c..6b458af3d79 100644 --- a/crypto/openssl/crypto/pkcs7/pk7_smime.c +++ b/crypto/openssl/crypto/pkcs7/pk7_smime.c @@ -486,15 +486,34 @@ int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags) return 0; } ret = SMIME_text(bread, data); + if (ret > 0 && BIO_method_type(tmpmem) == BIO_TYPE_CIPHER) + { + if (!BIO_get_cipher_status(tmpmem)) + ret = 0; + } BIO_free_all(bread); return ret; } else { for(;;) { i = BIO_read(tmpmem, buf, sizeof(buf)); - if(i <= 0) break; - BIO_write(data, buf, i); + if(i <= 0) + { + ret = 1; + if (BIO_method_type(tmpmem) == BIO_TYPE_CIPHER) + { + if (!BIO_get_cipher_status(tmpmem)) + ret = 0; + } + + break; + } + if (BIO_write(data, buf, i) != i) + { + ret = 0; + break; + } } BIO_free_all(tmpmem); - return 1; + return ret; } } diff --git a/crypto/openssl/crypto/rc4/asm/rc4-x86_64.pl b/crypto/openssl/crypto/rc4/asm/rc4-x86_64.pl index 00c6fa28aaf..53ce20ea92e 100755 --- a/crypto/openssl/crypto/rc4/asm/rc4-x86_64.pl +++ b/crypto/openssl/crypto/rc4/asm/rc4-x86_64.pl @@ -167,7 +167,7 @@ $code.=<<___; movzb ($dat,$XX[0]),$TX[0]#d test \$-8,$len jz .Lcloop1 - cmp \$0,260($dat) + cmpl \$0,260($dat) jnz .Lcloop1 push %rbx jmp .Lcloop8 diff --git a/crypto/openssl/crypto/rc4/rc4_skey.c b/crypto/openssl/crypto/rc4/rc4_skey.c index 4478d1a4b3b..d1dc912b241 100644 --- a/crypto/openssl/crypto/rc4/rc4_skey.c +++ b/crypto/openssl/crypto/rc4/rc4_skey.c @@ -138,9 +138,9 @@ void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data) */ #ifdef OPENSSL_FIPS unsigned long *ia32cap_ptr = OPENSSL_ia32cap_loc(); - if (ia32cap_ptr && (*ia32cap_ptr & (1<<28))) { + if (ia32cap_ptr && (*ia32cap_ptr & (1<<20))) { #else - if (OPENSSL_ia32cap_P & (1<<28)) { + if (OPENSSL_ia32cap_P & (1<<20)) { #endif unsigned char *cp=(unsigned char *)d; diff --git a/crypto/openssl/crypto/rsa/rsa_eay.c b/crypto/openssl/crypto/rsa/rsa_eay.c index 412d0eacf73..d477f08c4ca 100644 --- a/crypto/openssl/crypto/rsa/rsa_eay.c +++ b/crypto/openssl/crypto/rsa/rsa_eay.c @@ -312,51 +312,56 @@ static BN_BLINDING *rsa_get_blinding(RSA *rsa, int *local, BN_CTX *ctx) return ret; } -static int rsa_blinding_convert(BN_BLINDING *b, int local, BIGNUM *f, - BIGNUM *r, BN_CTX *ctx) -{ - if (local) +static int rsa_blinding_convert(BN_BLINDING *b, BIGNUM *f, BIGNUM *unblind, + BN_CTX *ctx) + { + if (unblind == NULL) + /* Local blinding: store the unblinding factor + * in BN_BLINDING. */ return BN_BLINDING_convert_ex(f, NULL, b, ctx); else { - int ret; - CRYPTO_r_lock(CRYPTO_LOCK_RSA_BLINDING); - ret = BN_BLINDING_convert_ex(f, r, b, ctx); - CRYPTO_r_unlock(CRYPTO_LOCK_RSA_BLINDING); - return ret; - } -} - -static int rsa_blinding_invert(BN_BLINDING *b, int local, BIGNUM *f, - BIGNUM *r, BN_CTX *ctx) -{ - if (local) - return BN_BLINDING_invert_ex(f, NULL, b, ctx); - else - { + /* Shared blinding: store the unblinding factor + * outside BN_BLINDING. */ int ret; CRYPTO_w_lock(CRYPTO_LOCK_RSA_BLINDING); - ret = BN_BLINDING_invert_ex(f, r, b, ctx); + ret = BN_BLINDING_convert_ex(f, unblind, b, ctx); CRYPTO_w_unlock(CRYPTO_LOCK_RSA_BLINDING); return ret; } -} + } + +static int rsa_blinding_invert(BN_BLINDING *b, BIGNUM *f, BIGNUM *unblind, + BN_CTX *ctx) + { + /* For local blinding, unblind is set to NULL, and BN_BLINDING_invert_ex + * will use the unblinding factor stored in BN_BLINDING. + * If BN_BLINDING is shared between threads, unblind must be non-null: + * BN_BLINDING_invert_ex will then use the local unblinding factor, + * and will only read the modulus from BN_BLINDING. + * In both cases it's safe to access the blinding without a lock. + */ + return BN_BLINDING_invert_ex(f, unblind, b, ctx); + } /* signing */ static int RSA_eay_private_encrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding) { - BIGNUM *f, *ret, *br, *res; + BIGNUM *f, *ret, *res; int i,j,k,num=0,r= -1; unsigned char *buf=NULL; BN_CTX *ctx=NULL; int local_blinding = 0; + /* Used only if the blinding structure is shared. A non-NULL unblind + * instructs rsa_blinding_convert() and rsa_blinding_invert() to store + * the unblinding factor outside the blinding structure. */ + BIGNUM *unblind = NULL; BN_BLINDING *blinding = NULL; if ((ctx=BN_CTX_new()) == NULL) goto err; BN_CTX_start(ctx); f = BN_CTX_get(ctx); - br = BN_CTX_get(ctx); ret = BN_CTX_get(ctx); num = BN_num_bytes(rsa->n); buf = OPENSSL_malloc(num); @@ -404,8 +409,15 @@ static int RSA_eay_private_encrypt(int flen, const unsigned char *from, } if (blinding != NULL) - if (!rsa_blinding_convert(blinding, local_blinding, f, br, ctx)) + { + if (!local_blinding && ((unblind = BN_CTX_get(ctx)) == NULL)) + { + RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,ERR_R_MALLOC_FAILURE); goto err; + } + if (!rsa_blinding_convert(blinding, f, unblind, ctx)) + goto err; + } if ( (rsa->flags & RSA_FLAG_EXT_PKEY) || ((rsa->p != NULL) && @@ -439,7 +451,7 @@ static int RSA_eay_private_encrypt(int flen, const unsigned char *from, } if (blinding) - if (!rsa_blinding_invert(blinding, local_blinding, ret, br, ctx)) + if (!rsa_blinding_invert(blinding, ret, unblind, ctx)) goto err; if (padding == RSA_X931_PADDING) @@ -478,18 +490,21 @@ err: static int RSA_eay_private_decrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding) { - BIGNUM *f, *ret, *br; + BIGNUM *f, *ret; int j,num=0,r= -1; unsigned char *p; unsigned char *buf=NULL; BN_CTX *ctx=NULL; int local_blinding = 0; + /* Used only if the blinding structure is shared. A non-NULL unblind + * instructs rsa_blinding_convert() and rsa_blinding_invert() to store + * the unblinding factor outside the blinding structure. */ + BIGNUM *unblind = NULL; BN_BLINDING *blinding = NULL; if((ctx = BN_CTX_new()) == NULL) goto err; BN_CTX_start(ctx); f = BN_CTX_get(ctx); - br = BN_CTX_get(ctx); ret = BN_CTX_get(ctx); num = BN_num_bytes(rsa->n); buf = OPENSSL_malloc(num); @@ -527,8 +542,15 @@ static int RSA_eay_private_decrypt(int flen, const unsigned char *from, } if (blinding != NULL) - if (!rsa_blinding_convert(blinding, local_blinding, f, br, ctx)) + { + if (!local_blinding && ((unblind = BN_CTX_get(ctx)) == NULL)) + { + RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,ERR_R_MALLOC_FAILURE); goto err; + } + if (!rsa_blinding_convert(blinding, f, unblind, ctx)) + goto err; + } /* do the decrypt */ if ( (rsa->flags & RSA_FLAG_EXT_PKEY) || @@ -562,7 +584,7 @@ static int RSA_eay_private_decrypt(int flen, const unsigned char *from, } if (blinding) - if (!rsa_blinding_invert(blinding, local_blinding, ret, br, ctx)) + if (!rsa_blinding_invert(blinding, ret, unblind, ctx)) goto err; p=buf; diff --git a/crypto/openssl/crypto/x509/x509_vfy.c b/crypto/openssl/crypto/x509/x509_vfy.c index aeb6337688d..b9275848054 100644 --- a/crypto/openssl/crypto/x509/x509_vfy.c +++ b/crypto/openssl/crypto/x509/x509_vfy.c @@ -1097,7 +1097,7 @@ int X509_cmp_time(ASN1_TIME *ctm, time_t *cmp_time) atm.length=sizeof(buff2); atm.data=(unsigned char *)buff2; - if (X509_time_adj(&atm,-offset*60, cmp_time) == NULL) + if (X509_time_adj(&atm, offset*60, cmp_time) == NULL) return 0; if (ctm->type == V_ASN1_UTCTIME) diff --git a/crypto/openssl/crypto/x509v3/pcy_map.c b/crypto/openssl/crypto/x509v3/pcy_map.c index f28796e6d4e..acd2ede6f34 100644 --- a/crypto/openssl/crypto/x509v3/pcy_map.c +++ b/crypto/openssl/crypto/x509v3/pcy_map.c @@ -70,8 +70,6 @@ static int ref_cmp(const X509_POLICY_REF * const *a, static void policy_map_free(X509_POLICY_REF *map) { - if (map->subjectDomainPolicy) - ASN1_OBJECT_free(map->subjectDomainPolicy); OPENSSL_free(map); } @@ -95,6 +93,7 @@ int policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps) { POLICY_MAPPING *map; X509_POLICY_REF *ref = NULL; + ASN1_OBJECT *subjectDomainPolicyRef; X509_POLICY_DATA *data; X509_POLICY_CACHE *cache = x->policy_cache; int i; @@ -153,13 +152,16 @@ int policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps) if (!sk_ASN1_OBJECT_push(data->expected_policy_set, map->subjectDomainPolicy)) goto bad_mapping; + /* map->subjectDomainPolicy will be freed when + * cache->data is freed. Set it to NULL to avoid double-free. */ + subjectDomainPolicyRef = map->subjectDomainPolicy; + map->subjectDomainPolicy = NULL; ref = OPENSSL_malloc(sizeof(X509_POLICY_REF)); if (!ref) goto bad_mapping; - ref->subjectDomainPolicy = map->subjectDomainPolicy; - map->subjectDomainPolicy = NULL; + ref->subjectDomainPolicy = subjectDomainPolicyRef; ref->data = data; if (!sk_X509_POLICY_REF_push(cache->maps, ref)) diff --git a/crypto/openssl/crypto/x509v3/pcy_tree.c b/crypto/openssl/crypto/x509v3/pcy_tree.c index 89f84bfa18b..92ad0a2b399 100644 --- a/crypto/openssl/crypto/x509v3/pcy_tree.c +++ b/crypto/openssl/crypto/x509v3/pcy_tree.c @@ -612,6 +612,10 @@ int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, case 2: return 1; + /* Some internal error */ + case -1: + return -1; + /* Some internal error */ case 0: return 0; @@ -691,4 +695,3 @@ int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, return 0; } - diff --git a/crypto/openssl/crypto/x509v3/v3_addr.c b/crypto/openssl/crypto/x509v3/v3_addr.c index efdf7c3ba75..c0e1d2d142e 100644 --- a/crypto/openssl/crypto/x509v3/v3_addr.c +++ b/crypto/openssl/crypto/x509v3/v3_addr.c @@ -142,12 +142,13 @@ unsigned int v3_addr_get_afi(const IPAddressFamily *f) * Expand the bitstring form of an address into a raw byte array. * At the moment this is coded for simplicity, not speed. */ -static void addr_expand(unsigned char *addr, +static int addr_expand(unsigned char *addr, const ASN1_BIT_STRING *bs, const int length, const unsigned char fill) { - OPENSSL_assert(bs->length >= 0 && bs->length <= length); + if (bs->length < 0 || bs->length > length) + return 0; if (bs->length > 0) { memcpy(addr, bs->data, bs->length); if ((bs->flags & 7) != 0) { @@ -159,6 +160,7 @@ static void addr_expand(unsigned char *addr, } } memset(addr + bs->length, fill, length - bs->length); + return 1; } /* @@ -177,13 +179,17 @@ static int i2r_address(BIO *out, unsigned char addr[ADDR_RAW_BUF_LEN]; int i, n; + if (bs->length < 0) + return 0; switch (afi) { case IANA_AFI_IPV4: - addr_expand(addr, bs, 4, fill); + if (!addr_expand(addr, bs, 4, fill)) + return 0; BIO_printf(out, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); break; case IANA_AFI_IPV6: - addr_expand(addr, bs, 16, fill); + if (!addr_expand(addr, bs, 16, fill)) + return 0; for (n = 16; n > 1 && addr[n-1] == 0x00 && addr[n-2] == 0x00; n -= 2) ; for (i = 0; i < n; i += 2) @@ -309,6 +315,12 @@ static int i2r_IPAddrBlocks(X509V3_EXT_METHOD *method, /* * Sort comparison function for a sequence of IPAddressOrRange * elements. + * + * There's no sane answer we can give if addr_expand() fails, and an + * assertion failure on externally supplied data is seriously uncool, + * so we just arbitrarily declare that if given invalid inputs this + * function returns -1. If this messes up your preferred sort order + * for garbage input, tough noogies. */ static int IPAddressOrRange_cmp(const IPAddressOrRange *a, const IPAddressOrRange *b, @@ -321,22 +333,26 @@ static int IPAddressOrRange_cmp(const IPAddressOrRange *a, switch (a->type) { case IPAddressOrRange_addressPrefix: - addr_expand(addr_a, a->u.addressPrefix, length, 0x00); + if (!addr_expand(addr_a, a->u.addressPrefix, length, 0x00)) + return -1; prefixlen_a = addr_prefixlen(a->u.addressPrefix); break; case IPAddressOrRange_addressRange: - addr_expand(addr_a, a->u.addressRange->min, length, 0x00); + if (!addr_expand(addr_a, a->u.addressRange->min, length, 0x00)) + return -1; prefixlen_a = length * 8; break; } switch (b->type) { case IPAddressOrRange_addressPrefix: - addr_expand(addr_b, b->u.addressPrefix, length, 0x00); + if (!addr_expand(addr_b, b->u.addressPrefix, length, 0x00)) + return -1; prefixlen_b = addr_prefixlen(b->u.addressPrefix); break; case IPAddressOrRange_addressRange: - addr_expand(addr_b, b->u.addressRange->min, length, 0x00); + if (!addr_expand(addr_b, b->u.addressRange->min, length, 0x00)) + return -1; prefixlen_b = length * 8; break; } @@ -378,6 +394,7 @@ static int range_should_be_prefix(const unsigned char *min, unsigned char mask; int i, j; + OPENSSL_assert(memcmp(min, max, length) <= 0); for (i = 0; i < length && min[i] == max[i]; i++) ; for (j = length - 1; j >= 0 && min[j] == 0x00 && max[j] == 0xFF; j--) @@ -651,22 +668,22 @@ int v3_addr_add_range(IPAddrBlocks *addr, /* * Extract min and max values from an IPAddressOrRange. */ -static void extract_min_max(IPAddressOrRange *aor, +static int extract_min_max(IPAddressOrRange *aor, unsigned char *min, unsigned char *max, int length) { - OPENSSL_assert(aor != NULL && min != NULL && max != NULL); + if (aor == NULL || min == NULL || max == NULL) + return 0; switch (aor->type) { case IPAddressOrRange_addressPrefix: - addr_expand(min, aor->u.addressPrefix, length, 0x00); - addr_expand(max, aor->u.addressPrefix, length, 0xFF); - return; + return (addr_expand(min, aor->u.addressPrefix, length, 0x00) && + addr_expand(max, aor->u.addressPrefix, length, 0xFF)); case IPAddressOrRange_addressRange: - addr_expand(min, aor->u.addressRange->min, length, 0x00); - addr_expand(max, aor->u.addressRange->max, length, 0xFF); - return; + return (addr_expand(min, aor->u.addressRange->min, length, 0x00) && + addr_expand(max, aor->u.addressRange->max, length, 0xFF)); } + return 0; } /* @@ -682,9 +699,10 @@ int v3_addr_get_range(IPAddressOrRange *aor, if (aor == NULL || min == NULL || max == NULL || afi_length == 0 || length < afi_length || (aor->type != IPAddressOrRange_addressPrefix && - aor->type != IPAddressOrRange_addressRange)) + aor->type != IPAddressOrRange_addressRange) || + !extract_min_max(aor, min, max, afi_length)) return 0; - extract_min_max(aor, min, max, afi_length); + return afi_length; } @@ -766,8 +784,9 @@ int v3_addr_is_canonical(IPAddrBlocks *addr) IPAddressOrRange *a = sk_IPAddressOrRange_value(aors, j); IPAddressOrRange *b = sk_IPAddressOrRange_value(aors, j + 1); - extract_min_max(a, a_min, a_max, length); - extract_min_max(b, b_min, b_max, length); + if (!extract_min_max(a, a_min, a_max, length) || + !extract_min_max(b, b_min, b_max, length)) + return 0; /* * Punt misordered list, overlapping start, or inverted range. @@ -795,14 +814,17 @@ int v3_addr_is_canonical(IPAddrBlocks *addr) } /* - * Check final range to see if it should be a prefix. + * Check range to see if it's inverted or should be a + * prefix. */ j = sk_IPAddressOrRange_num(aors) - 1; { IPAddressOrRange *a = sk_IPAddressOrRange_value(aors, j); - if (a->type == IPAddressOrRange_addressRange) { - extract_min_max(a, a_min, a_max, length); - if (range_should_be_prefix(a_min, a_max, length) >= 0) + if (a != NULL && a->type == IPAddressOrRange_addressRange) { + if (!extract_min_max(a, a_min, a_max, length)) + return 0; + if (memcmp(a_min, a_max, length) > 0 || + range_should_be_prefix(a_min, a_max, length) >= 0) return 0; } } @@ -836,8 +858,16 @@ static int IPAddressOrRanges_canonize(IPAddressOrRanges *aors, unsigned char a_min[ADDR_RAW_BUF_LEN], a_max[ADDR_RAW_BUF_LEN]; unsigned char b_min[ADDR_RAW_BUF_LEN], b_max[ADDR_RAW_BUF_LEN]; - extract_min_max(a, a_min, a_max, length); - extract_min_max(b, b_min, b_max, length); + if (!extract_min_max(a, a_min, a_max, length) || + !extract_min_max(b, b_min, b_max, length)) + return 0; + + /* + * Punt inverted ranges. + */ + if (memcmp(a_min, a_max, length) > 0 || + memcmp(b_min, b_max, length) > 0) + return 0; /* * Punt overlaps. @@ -864,6 +894,20 @@ static int IPAddressOrRanges_canonize(IPAddressOrRanges *aors, } } + /* + * Check for inverted final range. + */ + j = sk_IPAddressOrRange_num(aors) - 1; + { + IPAddressOrRange *a = sk_IPAddressOrRange_value(aors, j); + if (a != NULL && a->type == IPAddressOrRange_addressRange) { + unsigned char a_min[ADDR_RAW_BUF_LEN], a_max[ADDR_RAW_BUF_LEN]; + extract_min_max(a, a_min, a_max, length); + if (memcmp(a_min, a_max, length) > 0) + return 0; + } + } + return 1; } @@ -1012,6 +1056,11 @@ static void *v2i_IPAddrBlocks(struct v3_ext_method *method, X509V3_conf_err(val); goto err; } + if (memcmp(min, max, length_from_afi(afi)) > 0) { + X509V3err(X509V3_F_V2I_IPADDRBLOCKS, X509V3_R_EXTENSION_VALUE_ERROR); + X509V3_conf_err(val); + goto err; + } if (!v3_addr_add_range(addr, afi, safi, min, max)) { X509V3err(X509V3_F_V2I_IPADDRBLOCKS, ERR_R_MALLOC_FAILURE); goto err; @@ -1097,13 +1146,15 @@ static int addr_contains(IPAddressOrRanges *parent, p = 0; for (c = 0; c < sk_IPAddressOrRange_num(child); c++) { - extract_min_max(sk_IPAddressOrRange_value(child, c), - c_min, c_max, length); + if (!extract_min_max(sk_IPAddressOrRange_value(child, c), + c_min, c_max, length)) + return -1; for (;; p++) { if (p >= sk_IPAddressOrRange_num(parent)) return 0; - extract_min_max(sk_IPAddressOrRange_value(parent, p), - p_min, p_max, length); + if (!extract_min_max(sk_IPAddressOrRange_value(parent, p), + p_min, p_max, length)) + return 0; if (memcmp(p_max, c_max, length) < 0) continue; if (memcmp(p_min, c_min, length) > 0) diff --git a/crypto/openssl/crypto/x509v3/v3_asid.c b/crypto/openssl/crypto/x509v3/v3_asid.c index abd497ed1fd..11aad0b8b43 100644 --- a/crypto/openssl/crypto/x509v3/v3_asid.c +++ b/crypto/openssl/crypto/x509v3/v3_asid.c @@ -61,7 +61,6 @@ #include #include -#include #include "cryptlib.h" #include #include @@ -172,11 +171,11 @@ static int ASIdOrRange_cmp(const ASIdOrRange * const *a_, { const ASIdOrRange *a = *a_, *b = *b_; - assert((a->type == ASIdOrRange_id && a->u.id != NULL) || + OPENSSL_assert((a->type == ASIdOrRange_id && a->u.id != NULL) || (a->type == ASIdOrRange_range && a->u.range != NULL && a->u.range->min != NULL && a->u.range->max != NULL)); - assert((b->type == ASIdOrRange_id && b->u.id != NULL) || + OPENSSL_assert((b->type == ASIdOrRange_id && b->u.id != NULL) || (b->type == ASIdOrRange_range && b->u.range != NULL && b->u.range->min != NULL && b->u.range->max != NULL)); @@ -215,7 +214,7 @@ int v3_asid_add_inherit(ASIdentifiers *asid, int which) if (*choice == NULL) { if ((*choice = ASIdentifierChoice_new()) == NULL) return 0; - assert((*choice)->u.inherit == NULL); + OPENSSL_assert((*choice)->u.inherit == NULL); if (((*choice)->u.inherit = ASN1_NULL_new()) == NULL) return 0; (*choice)->type = ASIdentifierChoice_inherit; @@ -250,7 +249,7 @@ int v3_asid_add_id_or_range(ASIdentifiers *asid, if (*choice == NULL) { if ((*choice = ASIdentifierChoice_new()) == NULL) return 0; - assert((*choice)->u.asIdsOrRanges == NULL); + OPENSSL_assert((*choice)->u.asIdsOrRanges == NULL); (*choice)->u.asIdsOrRanges = sk_ASIdOrRange_new(ASIdOrRange_cmp); if ((*choice)->u.asIdsOrRanges == NULL) return 0; @@ -286,7 +285,7 @@ static void extract_min_max(ASIdOrRange *aor, ASN1_INTEGER **min, ASN1_INTEGER **max) { - assert(aor != NULL && min != NULL && max != NULL); + OPENSSL_assert(aor != NULL && min != NULL && max != NULL); switch (aor->type) { case ASIdOrRange_id: *min = aor->u.id; @@ -359,6 +358,20 @@ static int ASIdentifierChoice_is_canonical(ASIdentifierChoice *choice) goto done; } + /* + * Check for inverted range. + */ + i = sk_ASIdOrRange_num(choice->u.asIdsOrRanges) - 1; + { + ASIdOrRange *a = sk_ASIdOrRange_value(choice->u.asIdsOrRanges, i); + ASN1_INTEGER *a_min, *a_max; + if (a != NULL && a->type == ASIdOrRange_range) { + extract_min_max(a, &a_min, &a_max); + if (ASN1_INTEGER_cmp(a_min, a_max) > 0) + goto done; + } + } + ret = 1; done: @@ -373,7 +386,7 @@ static int ASIdentifierChoice_is_canonical(ASIdentifierChoice *choice) int v3_asid_is_canonical(ASIdentifiers *asid) { return (asid == NULL || - (ASIdentifierChoice_is_canonical(asid->asnum) || + (ASIdentifierChoice_is_canonical(asid->asnum) && ASIdentifierChoice_is_canonical(asid->rdi))); } @@ -393,9 +406,18 @@ static int ASIdentifierChoice_canonize(ASIdentifierChoice *choice) return 1; /* - * We have a list. Sort it. + * If not a list, or if empty list, it's broken. + */ + if (choice->type != ASIdentifierChoice_asIdsOrRanges || + sk_ASIdOrRange_num(choice->u.asIdsOrRanges) == 0) { + X509V3err(X509V3_F_ASIDENTIFIERCHOICE_CANONIZE, + X509V3_R_EXTENSION_VALUE_ERROR); + return 0; + } + + /* + * We have a non-empty list. Sort it. */ - assert(choice->type == ASIdentifierChoice_asIdsOrRanges); sk_ASIdOrRange_sort(choice->u.asIdsOrRanges); /* @@ -413,7 +435,14 @@ static int ASIdentifierChoice_canonize(ASIdentifierChoice *choice) /* * Make sure we're properly sorted (paranoia). */ - assert(ASN1_INTEGER_cmp(a_min, b_min) <= 0); + OPENSSL_assert(ASN1_INTEGER_cmp(a_min, b_min) <= 0); + + /* + * Punt inverted ranges. + */ + if (ASN1_INTEGER_cmp(a_min, a_max) > 0 || + ASN1_INTEGER_cmp(b_min, b_max) > 0) + goto done; /* * Check for overlaps. @@ -466,13 +495,27 @@ static int ASIdentifierChoice_canonize(ASIdentifierChoice *choice) break; } ASIdOrRange_free(b); - (void)sk_ASIdOrRange_delete(choice->u.asIdsOrRanges, i + 1); + (void) sk_ASIdOrRange_delete(choice->u.asIdsOrRanges, i + 1); i--; continue; } } - assert(ASIdentifierChoice_is_canonical(choice)); /* Paranoia */ + /* + * Check for final inverted range. + */ + i = sk_ASIdOrRange_num(choice->u.asIdsOrRanges) - 1; + { + ASIdOrRange *a = sk_ASIdOrRange_value(choice->u.asIdsOrRanges, i); + ASN1_INTEGER *a_min, *a_max; + if (a != NULL && a->type == ASIdOrRange_range) { + extract_min_max(a, &a_min, &a_max); + if (ASN1_INTEGER_cmp(a_min, a_max) > 0) + goto done; + } + } + + OPENSSL_assert(ASIdentifierChoice_is_canonical(choice)); /* Paranoia */ ret = 1; @@ -499,6 +542,7 @@ static void *v2i_ASIdentifiers(struct v3_ext_method *method, struct v3_ext_ctx *ctx, STACK_OF(CONF_VALUE) *values) { + ASN1_INTEGER *min = NULL, *max = NULL; ASIdentifiers *asid = NULL; int i; @@ -509,7 +553,6 @@ static void *v2i_ASIdentifiers(struct v3_ext_method *method, for (i = 0; i < sk_CONF_VALUE_num(values); i++) { CONF_VALUE *val = sk_CONF_VALUE_value(values, i); - ASN1_INTEGER *min = NULL, *max = NULL; int i1, i2, i3, is_range, which; /* @@ -579,18 +622,19 @@ static void *v2i_ASIdentifiers(struct v3_ext_method *method, max = s2i_ASN1_INTEGER(NULL, s + i2); OPENSSL_free(s); if (min == NULL || max == NULL) { - ASN1_INTEGER_free(min); - ASN1_INTEGER_free(max); X509V3err(X509V3_F_V2I_ASIDENTIFIERS, ERR_R_MALLOC_FAILURE); goto err; } + if (ASN1_INTEGER_cmp(min, max) > 0) { + X509V3err(X509V3_F_V2I_ASIDENTIFIERS, X509V3_R_EXTENSION_VALUE_ERROR); + goto err; + } } if (!v3_asid_add_id_or_range(asid, which, min, max)) { - ASN1_INTEGER_free(min); - ASN1_INTEGER_free(max); X509V3err(X509V3_F_V2I_ASIDENTIFIERS, ERR_R_MALLOC_FAILURE); goto err; } + min = max = NULL; } /* @@ -602,6 +646,8 @@ static void *v2i_ASIdentifiers(struct v3_ext_method *method, err: ASIdentifiers_free(asid); + ASN1_INTEGER_free(min); + ASN1_INTEGER_free(max); return NULL; } @@ -709,9 +755,9 @@ static int v3_asid_validate_path_internal(X509_STORE_CTX *ctx, int i, ret = 1, inherit_as = 0, inherit_rdi = 0; X509 *x = NULL; - assert(chain != NULL && sk_X509_num(chain) > 0); - assert(ctx != NULL || ext != NULL); - assert(ctx == NULL || ctx->verify_cb != NULL); + OPENSSL_assert(chain != NULL && sk_X509_num(chain) > 0); + OPENSSL_assert(ctx != NULL || ext != NULL); + OPENSSL_assert(ctx == NULL || ctx->verify_cb != NULL); /* * Figure out where to start. If we don't have an extension to @@ -723,7 +769,7 @@ static int v3_asid_validate_path_internal(X509_STORE_CTX *ctx, } else { i = 0; x = sk_X509_value(chain, i); - assert(x != NULL); + OPENSSL_assert(x != NULL); if ((ext = x->rfc3779_asid) == NULL) goto done; } @@ -756,7 +802,7 @@ static int v3_asid_validate_path_internal(X509_STORE_CTX *ctx, */ for (i++; i < sk_X509_num(chain); i++) { x = sk_X509_value(chain, i); - assert(x != NULL); + OPENSSL_assert(x != NULL); if (x->rfc3779_asid == NULL) { if (child_as != NULL || child_rdi != NULL) validation_err(X509_V_ERR_UNNESTED_RESOURCE); diff --git a/crypto/openssl/doc/HOWTO/proxy_certificates.txt b/crypto/openssl/doc/HOWTO/proxy_certificates.txt index 3d36b02f6b3..f98ec360767 100644 --- a/crypto/openssl/doc/HOWTO/proxy_certificates.txt +++ b/crypto/openssl/doc/HOWTO/proxy_certificates.txt @@ -57,7 +57,7 @@ following methods: - in all other cases, proxy certificate validation can be enabled before starting the application by setting the envirnoment variable - OPENSSL_ALLOW_PROXY with some non-empty value. + OPENSSL_ALLOW_PROXY_CERTS with some non-empty value. There are thoughts to allow proxy certificates with a line in the default openssl.cnf, but that's still in the future. diff --git a/crypto/openssl/doc/apps/ca.pod b/crypto/openssl/doc/apps/ca.pod index 5618c2dc9d2..6757b81a8e3 100644 --- a/crypto/openssl/doc/apps/ca.pod +++ b/crypto/openssl/doc/apps/ca.pod @@ -88,7 +88,7 @@ section for information on the required format. =item B<-infiles> if present this should be the last option, all subsequent arguments -are assumed to the the names of files containing certificate requests. +are assumed to be the names of files containing certificate requests. =item B<-out filename> diff --git a/crypto/openssl/doc/apps/dgst.pod b/crypto/openssl/doc/apps/dgst.pod index 908cd2a6d65..4007cedf07a 100644 --- a/crypto/openssl/doc/apps/dgst.pod +++ b/crypto/openssl/doc/apps/dgst.pod @@ -68,7 +68,7 @@ see the B section in L. =item B<-verify filename> -verify the signature using the the public key in "filename". +verify the signature using the public key in "filename". The output is either "Verification OK" or "Verification Failure". =item B<-prverify filename> diff --git a/crypto/openssl/doc/crypto/engine.pod b/crypto/openssl/doc/crypto/engine.pod index f5ab1c3e50f..8435d6bb0e3 100644 --- a/crypto/openssl/doc/crypto/engine.pod +++ b/crypto/openssl/doc/crypto/engine.pod @@ -517,7 +517,7 @@ implemented by ENGINEs should be numbered from. Any command value lower than this symbol is considered a "generic" command is handled directly by the OpenSSL core routines. -It is using these "core" control commands that one can discover the the control +It is using these "core" control commands that one can discover the control commands implemented by a given ENGINE, specifically the commands; #define ENGINE_HAS_CTRL_FUNCTION 10 diff --git a/crypto/openssl/doc/ssl/SSL_clear.pod b/crypto/openssl/doc/ssl/SSL_clear.pod index 8e077e31c9a..d4df1bfac31 100644 --- a/crypto/openssl/doc/ssl/SSL_clear.pod +++ b/crypto/openssl/doc/ssl/SSL_clear.pod @@ -39,10 +39,16 @@ for a description of the method's properties. SSL_clear() resets the SSL object to allow for another connection. The reset operation however keeps several settings of the last sessions (some of these settings were made automatically during the last -handshake). It only makes sense when opening a new session (or reusing -an old one) with the same peer that shares these settings. -SSL_clear() is not a short form for the sequence -L; L; . +handshake). It only makes sense for a new connection with the exact +same peer that shares these settings, and may fail if that peer +changes its settings between connections. Use the sequence +L; +L; +L; +L +instead to avoid such failures +(or simply L; L +if session reuse is not desired). =head1 RETURN VALUES diff --git a/crypto/openssl/engines/e_capi.c b/crypto/openssl/engines/e_capi.c index 59b2ab7b589..9f38af3b22f 100644 --- a/crypto/openssl/engines/e_capi.c +++ b/crypto/openssl/engines/e_capi.c @@ -420,28 +420,36 @@ static int capi_init(ENGINE *e) CAPI_CTX *ctx; const RSA_METHOD *ossl_rsa_meth; const DSA_METHOD *ossl_dsa_meth; - capi_idx = ENGINE_get_ex_new_index(0, NULL, NULL, NULL, 0); - cert_capi_idx = X509_get_ex_new_index(0, NULL, NULL, NULL, 0); + + if (capi_idx < 0) + { + capi_idx = ENGINE_get_ex_new_index(0, NULL, NULL, NULL, 0); + if (capi_idx < 0) + goto memerr; + + cert_capi_idx = X509_get_ex_new_index(0, NULL, NULL, NULL, 0); + + /* Setup RSA_METHOD */ + rsa_capi_idx = RSA_get_ex_new_index(0, NULL, NULL, NULL, 0); + ossl_rsa_meth = RSA_PKCS1_SSLeay(); + capi_rsa_method.rsa_pub_enc = ossl_rsa_meth->rsa_pub_enc; + capi_rsa_method.rsa_pub_dec = ossl_rsa_meth->rsa_pub_dec; + capi_rsa_method.rsa_mod_exp = ossl_rsa_meth->rsa_mod_exp; + capi_rsa_method.bn_mod_exp = ossl_rsa_meth->bn_mod_exp; + + /* Setup DSA Method */ + dsa_capi_idx = DSA_get_ex_new_index(0, NULL, NULL, NULL, 0); + ossl_dsa_meth = DSA_OpenSSL(); + capi_dsa_method.dsa_do_verify = ossl_dsa_meth->dsa_do_verify; + capi_dsa_method.dsa_mod_exp = ossl_dsa_meth->dsa_mod_exp; + capi_dsa_method.bn_mod_exp = ossl_dsa_meth->bn_mod_exp; + } ctx = capi_ctx_new(); - if (!ctx || (capi_idx < 0)) + if (!ctx) goto memerr; ENGINE_set_ex_data(e, capi_idx, ctx); - /* Setup RSA_METHOD */ - rsa_capi_idx = RSA_get_ex_new_index(0, NULL, NULL, NULL, 0); - ossl_rsa_meth = RSA_PKCS1_SSLeay(); - capi_rsa_method.rsa_pub_enc = ossl_rsa_meth->rsa_pub_enc; - capi_rsa_method.rsa_pub_dec = ossl_rsa_meth->rsa_pub_dec; - capi_rsa_method.rsa_mod_exp = ossl_rsa_meth->rsa_mod_exp; - capi_rsa_method.bn_mod_exp = ossl_rsa_meth->bn_mod_exp; - - /* Setup DSA Method */ - dsa_capi_idx = DSA_get_ex_new_index(0, NULL, NULL, NULL, 0); - ossl_dsa_meth = DSA_OpenSSL(); - capi_dsa_method.dsa_do_verify = ossl_dsa_meth->dsa_do_verify; - capi_dsa_method.dsa_mod_exp = ossl_dsa_meth->dsa_mod_exp; - capi_dsa_method.bn_mod_exp = ossl_dsa_meth->bn_mod_exp; #ifdef OPENSSL_CAPIENG_DIALOG { @@ -1133,6 +1141,7 @@ static int capi_list_containers(CAPI_CTX *ctx, BIO *out) { CAPIerr(CAPI_F_CAPI_LIST_CONTAINERS, CAPI_R_ENUMCONTAINERS_ERROR); capi_addlasterror(); + CryptReleaseContext(hprov, 0); return 0; } CAPI_trace(ctx, "Got max container len %d\n", buflen); @@ -1550,6 +1559,8 @@ static int capi_ctx_set_provname(CAPI_CTX *ctx, LPSTR pname, DWORD type, int che } CryptReleaseContext(hprov, 0); } + if (ctx->cspname) + OPENSSL_free(ctx->cspname); ctx->cspname = BUF_strdup(pname); ctx->csptype = type; return 1; @@ -1559,9 +1570,12 @@ static int capi_ctx_set_provname_idx(CAPI_CTX *ctx, int idx) { LPSTR pname; DWORD type; + int res; if (capi_get_provname(ctx, &pname, &type, idx) != 1) return 0; - return capi_ctx_set_provname(ctx, pname, type, 0); + res = capi_ctx_set_provname(ctx, pname, type, 0); + OPENSSL_free(pname); + return res; } static int cert_issuer_match(STACK_OF(X509_NAME) *ca_dn, X509 *x) diff --git a/crypto/openssl/engines/e_capi_err.h b/crypto/openssl/engines/e_capi_err.h index 4c749ec43d9..efa70010381 100644 --- a/crypto/openssl/engines/e_capi_err.h +++ b/crypto/openssl/engines/e_capi_err.h @@ -55,6 +55,10 @@ #ifndef HEADER_CAPI_ERR_H #define HEADER_CAPI_ERR_H +#ifdef __cplusplus +extern "C" { +#endif + /* BEGIN ERROR CODES */ /* The following lines are auto generated by the script mkerr.pl. Any changes * made after this point may be overwritten when the script is next run. diff --git a/crypto/openssl/fips/fips_canister.c b/crypto/openssl/fips/fips_canister.c index 64580694c48..174466189b4 100644 --- a/crypto/openssl/fips/fips_canister.c +++ b/crypto/openssl/fips/fips_canister.c @@ -19,6 +19,7 @@ (defined(__linux) && (defined(__arm) || defined(__arm__))) || \ (defined(__i386) || defined(__i386__)) || \ (defined(__x86_64) || defined(__x86_64__)) || \ + defined(__ANDROID__) || \ (defined(vax) || defined(__vax__)) # define POINTER_TO_FUNCTION_IS_POINTER_TO_1ST_INSTRUCTION # endif diff --git a/crypto/openssl/openssl.spec b/crypto/openssl/openssl.spec index e05d73adafe..021034a7758 100644 --- a/crypto/openssl/openssl.spec +++ b/crypto/openssl/openssl.spec @@ -2,7 +2,7 @@ %define libmaj 0 %define libmin 9 %define librel 8 -%define librev q +%define librev x Release: 1 %define openssldir /var/ssl diff --git a/crypto/openssl/ssl/bio_ssl.c b/crypto/openssl/ssl/bio_ssl.c index 420deb7fc96..f0a031c71d6 100644 --- a/crypto/openssl/ssl/bio_ssl.c +++ b/crypto/openssl/ssl/bio_ssl.c @@ -348,7 +348,11 @@ static long ssl_ctrl(BIO *b, int cmd, long num, void *ptr) break; case BIO_C_SET_SSL: if (ssl != NULL) + { ssl_free(b); + if (!ssl_new(b)) + return 0; + } b->shutdown=(int)num; ssl=(SSL *)ptr; ((BIO_SSL *)b->ptr)->ssl=ssl; diff --git a/crypto/openssl/ssl/d1_both.c b/crypto/openssl/ssl/d1_both.c index 920fb1ff249..4481c550511 100644 --- a/crypto/openssl/ssl/d1_both.c +++ b/crypto/openssl/ssl/d1_both.c @@ -153,12 +153,11 @@ #endif static unsigned char bitmask_start_values[] = {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80}; -static unsigned char bitmask_end_values[] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f}; +static unsigned char bitmask_end_values[] = {0xff, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f}; /* XDTLS: figure out the right values */ static unsigned int g_probable_mtu[] = {1500 - 28, 512 - 28, 256 - 28}; -static unsigned int dtls1_min_mtu(void); static unsigned int dtls1_guess_mtu(unsigned int curr_mtu); static void dtls1_fix_message_header(SSL *s, unsigned long frag_off, unsigned long frag_len); @@ -228,14 +227,14 @@ int dtls1_do_write(SSL *s, int type) unsigned int len, frag_off, mac_size, blocksize; /* AHA! Figure out the MTU, and stick to the right size */ - if ( ! (SSL_get_options(s) & SSL_OP_NO_QUERY_MTU)) + if (s->d1->mtu < dtls1_min_mtu() && !(SSL_get_options(s) & SSL_OP_NO_QUERY_MTU)) { s->d1->mtu = BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL); /* I've seen the kernel return bogus numbers when it doesn't know * (initial write), so just make sure we have a reasonable number */ - if ( s->d1->mtu < dtls1_min_mtu()) + if (s->d1->mtu < dtls1_min_mtu()) { s->d1->mtu = 0; s->d1->mtu = dtls1_guess_mtu(s->d1->mtu); @@ -264,11 +263,10 @@ int dtls1_do_write(SSL *s, int type) return ret; mtu = s->d1->mtu - (DTLS1_HM_HEADER_LENGTH + DTLS1_RT_HEADER_LENGTH); } - - OPENSSL_assert(mtu > 0); /* should have something reasonable now */ - #endif + OPENSSL_assert(s->d1->mtu >= dtls1_min_mtu()); /* should have something reasonable now */ + if ( s->init_off == 0 && type == SSL3_RT_HANDSHAKE) OPENSSL_assert(s->init_num == (int)s->d1->w_msg_hdr.msg_len + DTLS1_HM_HEADER_LENGTH); @@ -464,20 +462,9 @@ again: memset(msg_hdr, 0x00, sizeof(struct hm_header_st)); - s->d1->handshake_read_seq++; - /* we just read a handshake message from the other side: - * this means that we don't need to retransmit of the - * buffered messages. - * XDTLS: may be able clear out this - * buffer a little sooner (i.e if an out-of-order - * handshake message/record is received at the record - * layer. - * XDTLS: exception is that the server needs to - * know that change cipher spec and finished messages - * have been received by the client before clearing this - * buffer. this can simply be done by waiting for the - * first data segment, but is there a better way? */ - dtls1_clear_record_buffer(s); + /* Don't change sequence numbers while listening */ + if (!s->d1->listen) + s->d1->handshake_read_seq++; s->init_msg = s->init_buf->data + DTLS1_HM_HEADER_LENGTH; return s->init_num; @@ -806,16 +793,24 @@ dtls1_get_message_fragment(SSL *s, int st1, int stn, long max, int *ok) *ok = 0; return i; } - OPENSSL_assert(i == DTLS1_HM_HEADER_LENGTH); + /* Handshake fails if message header is incomplete */ + if (i != DTLS1_HM_HEADER_LENGTH) + { + al=SSL_AD_UNEXPECTED_MESSAGE; + SSLerr(SSL_F_DTLS1_GET_MESSAGE_FRAGMENT,SSL_R_UNEXPECTED_MESSAGE); + goto f_err; + } /* parse the message fragment header */ dtls1_get_message_header(wire, &msg_hdr); /* * if this is a future (or stale) message it gets buffered - * (or dropped)--no further processing at this time + * (or dropped)--no further processing at this time + * While listening, we accept seq 1 (ClientHello with cookie) + * although we're still expecting seq 0 (ClientHello) */ - if ( msg_hdr.seq != s->d1->handshake_read_seq) + if (msg_hdr.seq != s->d1->handshake_read_seq && !(s->d1->listen && msg_hdr.seq == 1)) return dtls1_process_out_of_seq_message(s, &msg_hdr, ok); len = msg_hdr.msg_len; @@ -876,7 +871,12 @@ dtls1_get_message_fragment(SSL *s, int st1, int stn, long max, int *ok) /* XDTLS: an incorrectly formatted fragment should cause the * handshake to fail */ - OPENSSL_assert(i == (int)frag_len); + if (i != (int)frag_len) + { + al=SSL3_AD_ILLEGAL_PARAMETER; + SSLerr(SSL_F_DTLS1_GET_MESSAGE_FRAGMENT,SSL3_AD_ILLEGAL_PARAMETER); + goto f_err; + } *ok = 1; @@ -1326,7 +1326,8 @@ unsigned char * dtls1_set_message_header(SSL *s, unsigned char *p, unsigned char mt, unsigned long len, unsigned long frag_off, unsigned long frag_len) { - if ( frag_off == 0) + /* Don't change sequence numbers while listening */ + if (frag_off == 0 && !s->d1->listen) { s->d1->handshake_write_seq = s->d1->next_handshake_write_seq; s->d1->next_handshake_write_seq++; @@ -1379,7 +1380,7 @@ dtls1_write_message_header(SSL *s, unsigned char *p) return p; } -static unsigned int +unsigned int dtls1_min_mtu(void) { return (g_probable_mtu[(sizeof(g_probable_mtu) / diff --git a/crypto/openssl/ssl/d1_clnt.c b/crypto/openssl/ssl/d1_clnt.c index 0aa77ee51d5..ac24bfb35ed 100644 --- a/crypto/openssl/ssl/d1_clnt.c +++ b/crypto/openssl/ssl/d1_clnt.c @@ -257,7 +257,6 @@ int dtls1_connect(SSL *s) if (ret <= 0) goto end; else { - dtls1_stop_timer(s); if (s->hit) s->state=SSL3_ST_CR_FINISHED_A; else @@ -350,6 +349,7 @@ int dtls1_connect(SSL *s) case SSL3_ST_CR_SRVR_DONE_B: ret=ssl3_get_server_done(s); if (ret <= 0) goto end; + dtls1_stop_timer(s); if (s->s3->tmp.cert_req) s->state=SSL3_ST_CW_CERT_A; else @@ -403,7 +403,8 @@ int dtls1_connect(SSL *s) case SSL3_ST_CW_CHANGE_A: case SSL3_ST_CW_CHANGE_B: - dtls1_start_timer(s); + if (!s->hit) + dtls1_start_timer(s); ret=dtls1_send_change_cipher_spec(s, SSL3_ST_CW_CHANGE_A,SSL3_ST_CW_CHANGE_B); if (ret <= 0) goto end; @@ -438,7 +439,8 @@ int dtls1_connect(SSL *s) case SSL3_ST_CW_FINISHED_A: case SSL3_ST_CW_FINISHED_B: - dtls1_start_timer(s); + if (!s->hit) + dtls1_start_timer(s); ret=dtls1_send_finished(s, SSL3_ST_CW_FINISHED_A,SSL3_ST_CW_FINISHED_B, s->method->ssl3_enc->client_finished_label, diff --git a/crypto/openssl/ssl/d1_enc.c b/crypto/openssl/ssl/d1_enc.c index 4a6c9090314..baa75f9186b 100644 --- a/crypto/openssl/ssl/d1_enc.c +++ b/crypto/openssl/ssl/d1_enc.c @@ -220,11 +220,7 @@ int dtls1_enc(SSL *s, int send) if (!send) { if (l == 0 || l%bs != 0) - { - SSLerr(SSL_F_DTLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG); - ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED); - return 0; - } + return -1; } EVP_Cipher(ds,rec->data,rec->input,l); @@ -253,7 +249,7 @@ int dtls1_enc(SSL *s, int send) } /* TLS 1.0 does not bound the number of padding bytes by the block size. * All of them must have value 'padding_length'. */ - if (i > (int)rec->length) + if (i + bs > (int)rec->length) { /* Incorrect padding. SSLerr() and ssl3_alert are done * by caller: we don't want to reveal whether this is diff --git a/crypto/openssl/ssl/d1_lib.c b/crypto/openssl/ssl/d1_lib.c index 54e16403e6e..3d27e308581 100644 --- a/crypto/openssl/ssl/d1_lib.c +++ b/crypto/openssl/ssl/d1_lib.c @@ -145,26 +145,33 @@ int dtls1_new(SSL *s) return(1); } -void dtls1_free(SSL *s) +static void dtls1_clear_queues(SSL *s) { pitem *item = NULL; hm_fragment *frag = NULL; - - ssl3_free(s); + DTLS1_RECORD_DATA *rdata; while( (item = pqueue_pop(s->d1->unprocessed_rcds.q)) != NULL) { + rdata = (DTLS1_RECORD_DATA *) item->data; + if (rdata->rbuf.buf) + { + OPENSSL_free(rdata->rbuf.buf); + } OPENSSL_free(item->data); pitem_free(item); } - pqueue_free(s->d1->unprocessed_rcds.q); while( (item = pqueue_pop(s->d1->processed_rcds.q)) != NULL) { + rdata = (DTLS1_RECORD_DATA *) item->data; + if (rdata->rbuf.buf) + { + OPENSSL_free(rdata->rbuf.buf); + } OPENSSL_free(item->data); pitem_free(item); } - pqueue_free(s->d1->processed_rcds.q); while( (item = pqueue_pop(s->d1->buffered_messages)) != NULL) { @@ -173,7 +180,6 @@ void dtls1_free(SSL *s) OPENSSL_free(frag); pitem_free(item); } - pqueue_free(s->d1->buffered_messages); while ( (item = pqueue_pop(s->d1->sent_messages)) != NULL) { @@ -182,15 +188,26 @@ void dtls1_free(SSL *s) OPENSSL_free(frag); pitem_free(item); } - pqueue_free(s->d1->sent_messages); while ( (item = pqueue_pop(s->d1->buffered_app_data.q)) != NULL) - { + { frag = (hm_fragment *)item->data; OPENSSL_free(frag->fragment); OPENSSL_free(frag); pitem_free(item); + } } + +void dtls1_free(SSL *s) + { + ssl3_free(s); + + dtls1_clear_queues(s); + + pqueue_free(s->d1->unprocessed_rcds.q); + pqueue_free(s->d1->processed_rcds.q); + pqueue_free(s->d1->buffered_messages); + pqueue_free(s->d1->sent_messages); pqueue_free(s->d1->buffered_app_data.q); pq_64bit_free(&(s->d1->bitmap.map)); @@ -204,6 +221,61 @@ void dtls1_free(SSL *s) void dtls1_clear(SSL *s) { + pqueue unprocessed_rcds; + pqueue processed_rcds; + pqueue buffered_messages; + pqueue sent_messages; + pqueue buffered_app_data; + unsigned int mtu; + + if (s->d1) + { + unprocessed_rcds = s->d1->unprocessed_rcds.q; + processed_rcds = s->d1->processed_rcds.q; + buffered_messages = s->d1->buffered_messages; + sent_messages = s->d1->sent_messages; + buffered_app_data = s->d1->buffered_app_data.q; + mtu = s->d1->mtu; + + dtls1_clear_queues(s); + + pq_64bit_free(&(s->d1->bitmap.map)); + pq_64bit_free(&(s->d1->bitmap.max_seq_num)); + + pq_64bit_free(&(s->d1->next_bitmap.map)); + pq_64bit_free(&(s->d1->next_bitmap.max_seq_num)); + + memset(s->d1, 0, sizeof(*(s->d1))); + + if (s->server) + { + s->d1->cookie_len = sizeof(s->d1->cookie); + } + + if (SSL_get_options(s) & SSL_OP_NO_QUERY_MTU) + { + s->d1->mtu = mtu; + } + + s->d1->unprocessed_rcds.q = unprocessed_rcds; + s->d1->processed_rcds.q = processed_rcds; + s->d1->buffered_messages = buffered_messages; + s->d1->sent_messages = sent_messages; + s->d1->buffered_app_data.q = buffered_app_data; + +#if defined(OPENSSL_SYS_VMS) || defined(VMS_TEST) + s->d1->bitmap.length=64; +#else + s->d1->bitmap.length=sizeof(s->d1->bitmap.map) * 8; +#endif + pq_64bit_init(&(s->d1->bitmap.map)); + pq_64bit_init(&(s->d1->bitmap.max_seq_num)); + + s->d1->next_bitmap.length = s->d1->bitmap.length; + pq_64bit_init(&(s->d1->next_bitmap.map)); + pq_64bit_init(&(s->d1->next_bitmap.max_seq_num)); + } + ssl3_clear(s); if (s->options & SSL_OP_CISCO_ANYCONNECT) s->version=DTLS1_BAD_VER; @@ -349,15 +421,36 @@ void dtls1_double_timeout(SSL *s) void dtls1_stop_timer(SSL *s) { /* Reset everything */ + memset(&(s->d1->timeout), 0, sizeof(struct dtls1_timeout_st)); memset(&(s->d1->next_timeout), 0, sizeof(struct timeval)); s->d1->timeout_duration = 1; BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0, &(s->d1->next_timeout)); + /* Clear retransmission buffer */ + dtls1_clear_record_buffer(s); + } + +int dtls1_check_timeout_num(SSL *s) + { + s->d1->timeout.num_alerts++; + + /* Reduce MTU after 2 unsuccessful retransmissions */ + if (s->d1->timeout.num_alerts > 2) + { + s->d1->mtu = BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_GET_FALLBACK_MTU, 0, NULL); + } + + if (s->d1->timeout.num_alerts > DTLS1_TMO_ALERT_COUNT) + { + /* fail the connection, enough alerts have been sent */ + SSLerr(SSL_F_DTLS1_CHECK_TIMEOUT_NUM,SSL_R_READ_TIMEOUT_EXPIRED); + return -1; + } + + return 0; } int dtls1_handle_timeout(SSL *s) { - DTLS1_STATE *state; - /* if no timer is expired, don't do anything */ if (!dtls1_is_timer_expired(s)) { @@ -365,19 +458,14 @@ int dtls1_handle_timeout(SSL *s) } dtls1_double_timeout(s); - state = s->d1; - state->timeout.num_alerts++; - if ( state->timeout.num_alerts > DTLS1_TMO_ALERT_COUNT) - { - /* fail the connection, enough alerts have been sent */ - SSLerr(SSL_F_DTLS1_HANDLE_TIMEOUT,SSL_R_READ_TIMEOUT_EXPIRED); - return 0; - } - state->timeout.read_timeouts++; - if ( state->timeout.read_timeouts > DTLS1_TMO_READ_COUNT) + if (dtls1_check_timeout_num(s) < 0) + return -1; + + s->d1->timeout.read_timeouts++; + if (s->d1->timeout.read_timeouts > DTLS1_TMO_READ_COUNT) { - state->timeout.read_timeouts = 1; + s->d1->timeout.read_timeouts = 1; } dtls1_start_timer(s); diff --git a/crypto/openssl/ssl/d1_pkt.c b/crypto/openssl/ssl/d1_pkt.c index 3f19077af11..65b1ef28cde 100644 --- a/crypto/openssl/ssl/d1_pkt.c +++ b/crypto/openssl/ssl/d1_pkt.c @@ -139,7 +139,6 @@ static int dtls1_process_record(SSL *s); #if PQ_64BIT_IS_INTEGER static PQ_64BIT bytes_to_long_long(unsigned char *bytes, PQ_64BIT *num); #endif -static void dtls1_clear_timeouts(SSL *s); /* copy buffered record into SSL structure */ static int @@ -335,6 +334,8 @@ dtls1_process_record(SSL *s) SSL3_RECORD *rr; unsigned int mac_size; unsigned char md[EVP_MAX_MD_SIZE]; + int decryption_failed_or_bad_record_mac = 0; + unsigned char *mac = NULL; rr= &(s->s3->rrec); @@ -369,12 +370,10 @@ dtls1_process_record(SSL *s) enc_err = s->method->ssl3_enc->enc(s,0); if (enc_err <= 0) { - if (enc_err == 0) - /* SSLerr() and ssl3_send_alert() have been called */ - goto err; - - /* otherwise enc_err == -1 */ - goto err; + /* To minimize information leaked via timing, we will always + * perform all computations before discarding the message. + */ + decryption_failed_or_bad_record_mac = 1; } #ifdef TLS_DEBUG @@ -400,28 +399,32 @@ if ( (sess == NULL) || SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_PRE_MAC_LENGTH_TOO_LONG); goto f_err; #else - goto err; + decryption_failed_or_bad_record_mac = 1; #endif } /* check the MAC for rr->input (it's in mac_size bytes at the tail) */ - if (rr->length < mac_size) + if (rr->length >= mac_size) { -#if 0 /* OK only for stream ciphers */ - al=SSL_AD_DECODE_ERROR; - SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_LENGTH_TOO_SHORT); - goto f_err; -#else - goto err; -#endif + rr->length -= mac_size; + mac = &rr->data[rr->length]; } - rr->length-=mac_size; + else + rr->length = 0; s->method->ssl3_enc->mac(s,md,0); - if (memcmp(md,&(rr->data[rr->length]),mac_size) != 0) + if (mac == NULL || memcmp(md, mac, mac_size) != 0) { - goto err; + decryption_failed_or_bad_record_mac = 1; } } + if (decryption_failed_or_bad_record_mac) + { + /* decryption failed, silently discard message */ + rr->length = 0; + s->packet_length = 0; + goto err; + } + /* r->length is now just compressed */ if (s->expand != NULL) { @@ -615,10 +618,12 @@ again: /* If this record is from the next epoch (either HM or ALERT), * and a handshake is currently in progress, buffer it since it - * cannot be processed at this time. */ + * cannot be processed at this time. However, do not buffer + * anything while listening. + */ if (is_next_epoch) { - if (SSL_in_init(s) || s->in_handshake) + if ((SSL_in_init(s) || s->in_handshake) && !s->d1->listen) { dtls1_buffer_record(s, &(s->d1->unprocessed_rcds), &rr->seq_num); } @@ -634,7 +639,6 @@ again: goto again; /* get another record */ } - dtls1_clear_timeouts(s); /* done waiting */ return(1); } @@ -1103,6 +1107,9 @@ start: */ if (msg_hdr.type == SSL3_MT_FINISHED) { + if (dtls1_check_timeout_num(s) < 0) + return -1; + dtls1_retransmit_buffered_messages(s); rr->length = 0; goto start; @@ -1806,10 +1813,3 @@ bytes_to_long_long(unsigned char *bytes, PQ_64BIT *num) return _num; } #endif - - -static void -dtls1_clear_timeouts(SSL *s) - { - memset(&(s->d1->timeout), 0x00, sizeof(struct dtls1_timeout_st)); - } diff --git a/crypto/openssl/ssl/d1_srvr.c b/crypto/openssl/ssl/d1_srvr.c index 5b313664dd1..2efaa19ddc5 100644 --- a/crypto/openssl/ssl/d1_srvr.c +++ b/crypto/openssl/ssl/d1_srvr.c @@ -148,6 +148,7 @@ int dtls1_accept(SSL *s) void (*cb)(const SSL *ssl,int type,int val)=NULL; int ret= -1; int new_state,state,skip=0; + int listen; RAND_add(&Time,sizeof(Time),0); ERR_clear_error(); @@ -157,11 +158,15 @@ int dtls1_accept(SSL *s) cb=s->info_callback; else if (s->ctx->info_callback != NULL) cb=s->ctx->info_callback; + + listen = s->d1->listen; /* init things to blank */ s->in_handshake++; if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); + s->d1->listen = listen; + if (s->cert == NULL) { SSLerr(SSL_F_DTLS1_ACCEPT,SSL_R_NO_CERTIFICATE_SET); @@ -271,11 +276,23 @@ int dtls1_accept(SSL *s) s->init_num=0; + /* Reflect ClientHello sequence to remain stateless while listening */ + if (listen) + { + memcpy(s->s3->write_sequence, s->s3->read_sequence, sizeof(s->s3->write_sequence)); + } + /* If we're just listening, stop here */ - if (s->d1->listen && s->state == SSL3_ST_SW_SRVR_HELLO_A) + if (listen && s->state == SSL3_ST_SW_SRVR_HELLO_A) { ret = 2; s->d1->listen = 0; + /* Set expected sequence numbers + * to continue the handshake. + */ + s->d1->handshake_read_seq = 2; + s->d1->handshake_write_seq = 1; + s->d1->next_handshake_write_seq = 1; goto end; } @@ -284,7 +301,6 @@ int dtls1_accept(SSL *s) case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A: case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B: - dtls1_start_timer(s); ret = dtls1_send_hello_verify_request(s); if ( ret <= 0) goto end; s->state=SSL3_ST_SW_FLUSH; @@ -457,15 +473,16 @@ int dtls1_accept(SSL *s) ret = ssl3_check_client_hello(s); if (ret <= 0) goto end; - dtls1_stop_timer(s); if (ret == 2) + { + dtls1_stop_timer(s); s->state = SSL3_ST_SR_CLNT_HELLO_C; + } else { /* could be sent for a DH cert, even if we * have not asked for it :-) */ ret=ssl3_get_client_certificate(s); if (ret <= 0) goto end; - dtls1_stop_timer(s); s->init_num=0; s->state=SSL3_ST_SR_KEY_EXCH_A; } @@ -475,7 +492,6 @@ int dtls1_accept(SSL *s) case SSL3_ST_SR_KEY_EXCH_B: ret=ssl3_get_client_key_exchange(s); if (ret <= 0) goto end; - dtls1_stop_timer(s); s->state=SSL3_ST_SR_CERT_VRFY_A; s->init_num=0; @@ -497,7 +513,6 @@ int dtls1_accept(SSL *s) /* we should decide if we expected this one */ ret=ssl3_get_cert_verify(s); if (ret <= 0) goto end; - dtls1_stop_timer(s); s->state=SSL3_ST_SR_FINISHED_A; s->init_num=0; @@ -713,9 +728,6 @@ int dtls1_send_hello_verify_request(SSL *s) /* number of bytes to write */ s->init_num=p-buf; s->init_off=0; - - /* buffer the message to handle re-xmits */ - dtls1_buffer_message(s, 0); } /* s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B */ @@ -736,7 +748,7 @@ int dtls1_send_server_hello(SSL *s) p=s->s3->server_random; Time=(unsigned long)time(NULL); /* Time */ l2n(Time,p); - RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time)); + RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-4); /* Do the message type and length last */ d=p= &(buf[DTLS1_HM_HEADER_LENGTH]); diff --git a/crypto/openssl/ssl/s2_srvr.c b/crypto/openssl/ssl/s2_srvr.c index eeffe254924..c87d84499e7 100644 --- a/crypto/openssl/ssl/s2_srvr.c +++ b/crypto/openssl/ssl/s2_srvr.c @@ -403,13 +403,14 @@ static int get_client_master_key(SSL *s) p+=3; n2s(p,i); s->s2->tmp.clear=i; n2s(p,i); s->s2->tmp.enc=i; - n2s(p,i); s->session->key_arg_length=i; - if(s->session->key_arg_length > SSL_MAX_KEY_ARG_LENGTH) + n2s(p,i); + if(i > SSL_MAX_KEY_ARG_LENGTH) { ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_KEY_ARG_TOO_LONG); return -1; } + s->session->key_arg_length=i; s->state=SSL2_ST_GET_CLIENT_MASTER_KEY_B; } diff --git a/crypto/openssl/ssl/s3_clnt.c b/crypto/openssl/ssl/s3_clnt.c index a7cb7a1ebf3..2c9fb87f528 100644 --- a/crypto/openssl/ssl/s3_clnt.c +++ b/crypto/openssl/ssl/s3_clnt.c @@ -878,7 +878,7 @@ int ssl3_get_server_hello(SSL *s) /* wrong packet length */ al=SSL_AD_DECODE_ERROR; SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_PACKET_LENGTH); - goto err; + goto f_err; } return(1); @@ -1713,7 +1713,7 @@ int ssl3_get_new_session_ticket(SSL *s) if (n < 6) { /* need at least ticket_lifetime_hint + ticket length */ - al = SSL3_AL_FATAL,SSL_AD_DECODE_ERROR; + al = SSL_AD_DECODE_ERROR; SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,SSL_R_LENGTH_MISMATCH); goto f_err; } @@ -1724,7 +1724,7 @@ int ssl3_get_new_session_ticket(SSL *s) /* ticket_lifetime_hint + ticket_length + ticket */ if (ticklen + 6 != n) { - al = SSL3_AL_FATAL,SSL_AD_DECODE_ERROR; + al = SSL_AD_DECODE_ERROR; SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,SSL_R_LENGTH_MISMATCH); goto f_err; } diff --git a/crypto/openssl/ssl/s3_enc.c b/crypto/openssl/ssl/s3_enc.c index 1539a4ce1c5..759231d9d4c 100644 --- a/crypto/openssl/ssl/s3_enc.c +++ b/crypto/openssl/ssl/s3_enc.c @@ -479,6 +479,9 @@ int ssl3_enc(SSL *s, int send) /* we need to add 'i-1' padding bytes */ l+=i; + /* the last of these zero bytes will be overwritten + * with the padding length. */ + memset(&rec->input[rec->length], 0, i); rec->length+=i; rec->input[l-1]=(i-1); } diff --git a/crypto/openssl/ssl/s3_lib.c b/crypto/openssl/ssl/s3_lib.c index e6091ef8166..a40621822b3 100644 --- a/crypto/openssl/ssl/s3_lib.c +++ b/crypto/openssl/ssl/s3_lib.c @@ -2641,4 +2641,3 @@ need to go to SSL_ST_ACCEPT. } return(ret); } - diff --git a/crypto/openssl/ssl/s3_srvr.c b/crypto/openssl/ssl/s3_srvr.c index b9f4292af65..5ada1f15507 100644 --- a/crypto/openssl/ssl/s3_srvr.c +++ b/crypto/openssl/ssl/s3_srvr.c @@ -235,6 +235,7 @@ int ssl3_accept(SSL *s) } s->init_num=0; + s->s3->flags &= ~SSL3_FLAGS_SGC_RESTART_DONE; if (s->state != SSL_ST_RENEGOTIATE) { @@ -709,6 +710,13 @@ int ssl3_check_client_hello(SSL *s) s->s3->tmp.reuse_message = 1; if (s->s3->tmp.message_type == SSL3_MT_CLIENT_HELLO) { + /* We only allow the client to restart the handshake once per + * negotiation. */ + if (s->s3->flags & SSL3_FLAGS_SGC_RESTART_DONE) + { + SSLerr(SSL_F_SSL3_CHECK_CLIENT_HELLO, SSL_R_MULTIPLE_SGC_RESTARTS); + return -1; + } /* Throw away what we have done so far in the current handshake, * which will now be aborted. (A full SSL_clear would be too much.) */ #ifndef OPENSSL_NO_DH @@ -725,6 +733,7 @@ int ssl3_check_client_hello(SSL *s) s->s3->tmp.ecdh = NULL; } #endif + s->s3->flags |= SSL3_FLAGS_SGC_RESTART_DONE; return 2; } return 1; @@ -1562,6 +1571,7 @@ int ssl3_send_server_key_exchange(SSL *s) (unsigned char *)encodedPoint, encodedlen); OPENSSL_free(encodedPoint); + encodedPoint = NULL; p += encodedlen; } #endif @@ -1951,6 +1961,7 @@ int ssl3_get_client_key_exchange(SSL *s) if (i <= 0) { SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB); + BN_clear_free(pub); goto err; } diff --git a/crypto/openssl/ssl/ssl.h b/crypto/openssl/ssl/ssl.h index 7d4e46e9163..eb50e14efd6 100644 --- a/crypto/openssl/ssl/ssl.h +++ b/crypto/openssl/ssl/ssl.h @@ -1682,6 +1682,7 @@ void ERR_load_SSL_strings(void); #define SSL_F_DTLS1_ACCEPT 246 #define SSL_F_DTLS1_ADD_CERT_TO_BUF 280 #define SSL_F_DTLS1_BUFFER_RECORD 247 +#define SSL_F_DTLS1_CHECK_TIMEOUT_NUM 293 #define SSL_F_DTLS1_CLIENT_HELLO 248 #define SSL_F_DTLS1_CONNECT 249 #define SSL_F_DTLS1_ENC 250 @@ -1739,6 +1740,7 @@ void ERR_load_SSL_strings(void); #define SSL_F_SSL3_CALLBACK_CTRL 233 #define SSL_F_SSL3_CHANGE_CIPHER_STATE 129 #define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 130 +#define SSL_F_SSL3_CHECK_CLIENT_HELLO 292 #define SSL_F_SSL3_CLIENT_HELLO 131 #define SSL_F_SSL3_CONNECT 132 #define SSL_F_SSL3_CTRL 213 @@ -1974,6 +1976,7 @@ void ERR_load_SSL_strings(void); #define SSL_R_MISSING_TMP_RSA_KEY 172 #define SSL_R_MISSING_TMP_RSA_PKEY 173 #define SSL_R_MISSING_VERIFY_MESSAGE 174 +#define SSL_R_MULTIPLE_SGC_RESTARTS 325 #define SSL_R_NON_SSLV2_INITIAL_PACKET 175 #define SSL_R_NO_CERTIFICATES_RETURNED 176 #define SSL_R_NO_CERTIFICATE_ASSIGNED 177 diff --git a/crypto/openssl/ssl/ssl3.h b/crypto/openssl/ssl/ssl3.h index 2f579c253bc..b9a85effa00 100644 --- a/crypto/openssl/ssl/ssl3.h +++ b/crypto/openssl/ssl/ssl3.h @@ -333,6 +333,17 @@ typedef struct ssl3_buffer_st #define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002 #define SSL3_FLAGS_POP_BUFFER 0x0004 #define TLS1_FLAGS_TLS_PADDING_BUG 0x0008 + +/* SSL3_FLAGS_SGC_RESTART_DONE is set when we + * restart a handshake because of MS SGC and so prevents us + * from restarting the handshake in a loop. It's reset on a + * renegotiation, so effectively limits the client to one restart + * per negotiation. This limits the possibility of a DDoS + * attack where the client handshakes in a loop using SGC to + * restart. Servers which permit renegotiation can still be + * effected, but we can't prevent that. + */ +#define SSL3_FLAGS_SGC_RESTART_DONE 0x0040 typedef struct ssl3_state_st { diff --git a/crypto/openssl/ssl/ssl_ciph.c b/crypto/openssl/ssl/ssl_ciph.c index a34680ee850..a54c06ffb7d 100644 --- a/crypto/openssl/ssl/ssl_ciph.c +++ b/crypto/openssl/ssl/ssl_ciph.c @@ -303,6 +303,7 @@ static void load_builtin_compressions(void) sk_SSL_COMP_push(ssl_comp_methods,comp); } } + sk_SSL_COMP_sort(ssl_comp_methods); } MemCheck_on(); } diff --git a/crypto/openssl/ssl/ssl_err.c b/crypto/openssl/ssl/ssl_err.c index 7eb52026e78..20895ee903a 100644 --- a/crypto/openssl/ssl/ssl_err.c +++ b/crypto/openssl/ssl/ssl_err.c @@ -1,6 +1,6 @@ /* ssl/ssl_err.c */ /* ==================================================================== - * Copyright (c) 1999-2008 The OpenSSL Project. All rights reserved. + * Copyright (c) 1999-2011 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -80,6 +80,7 @@ static ERR_STRING_DATA SSL_str_functs[]= {ERR_FUNC(SSL_F_DTLS1_ACCEPT), "DTLS1_ACCEPT"}, {ERR_FUNC(SSL_F_DTLS1_ADD_CERT_TO_BUF), "DTLS1_ADD_CERT_TO_BUF"}, {ERR_FUNC(SSL_F_DTLS1_BUFFER_RECORD), "DTLS1_BUFFER_RECORD"}, +{ERR_FUNC(SSL_F_DTLS1_CHECK_TIMEOUT_NUM), "DTLS1_CHECK_TIMEOUT_NUM"}, {ERR_FUNC(SSL_F_DTLS1_CLIENT_HELLO), "DTLS1_CLIENT_HELLO"}, {ERR_FUNC(SSL_F_DTLS1_CONNECT), "DTLS1_CONNECT"}, {ERR_FUNC(SSL_F_DTLS1_ENC), "DTLS1_ENC"}, @@ -137,6 +138,7 @@ static ERR_STRING_DATA SSL_str_functs[]= {ERR_FUNC(SSL_F_SSL3_CALLBACK_CTRL), "SSL3_CALLBACK_CTRL"}, {ERR_FUNC(SSL_F_SSL3_CHANGE_CIPHER_STATE), "SSL3_CHANGE_CIPHER_STATE"}, {ERR_FUNC(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM), "SSL3_CHECK_CERT_AND_ALGORITHM"}, +{ERR_FUNC(SSL_F_SSL3_CHECK_CLIENT_HELLO), "SSL3_CHECK_CLIENT_HELLO"}, {ERR_FUNC(SSL_F_SSL3_CLIENT_HELLO), "SSL3_CLIENT_HELLO"}, {ERR_FUNC(SSL_F_SSL3_CONNECT), "SSL3_CONNECT"}, {ERR_FUNC(SSL_F_SSL3_CTRL), "SSL3_CTRL"}, @@ -375,6 +377,7 @@ static ERR_STRING_DATA SSL_str_reasons[]= {ERR_REASON(SSL_R_MISSING_TMP_RSA_KEY) ,"missing tmp rsa key"}, {ERR_REASON(SSL_R_MISSING_TMP_RSA_PKEY) ,"missing tmp rsa pkey"}, {ERR_REASON(SSL_R_MISSING_VERIFY_MESSAGE),"missing verify message"}, +{ERR_REASON(SSL_R_MULTIPLE_SGC_RESTARTS) ,"multiple sgc restarts"}, {ERR_REASON(SSL_R_NON_SSLV2_INITIAL_PACKET),"non sslv2 initial packet"}, {ERR_REASON(SSL_R_NO_CERTIFICATES_RETURNED),"no certificates returned"}, {ERR_REASON(SSL_R_NO_CERTIFICATE_ASSIGNED),"no certificate assigned"}, diff --git a/crypto/openssl/ssl/ssl_lib.c b/crypto/openssl/ssl/ssl_lib.c index b6b8e6038aa..23de3151bf6 100644 --- a/crypto/openssl/ssl/ssl_lib.c +++ b/crypto/openssl/ssl/ssl_lib.c @@ -1000,6 +1000,11 @@ long SSL_ctrl(SSL *s,int cmd,long larg,void *parg) s->max_cert_list=larg; return(l); case SSL_CTRL_SET_MTU: +#ifndef OPENSSL_NO_DTLS1 + if (larg < (long)dtls1_min_mtu()) + return 0; +#endif + if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER) { diff --git a/crypto/openssl/ssl/ssl_locl.h b/crypto/openssl/ssl/ssl_locl.h index e305db43ff8..3d581f1f2fe 100644 --- a/crypto/openssl/ssl/ssl_locl.h +++ b/crypto/openssl/ssl/ssl_locl.h @@ -870,6 +870,7 @@ void dtls1_get_ccs_header(unsigned char *data, struct ccs_header_st *ccs_hdr); void dtls1_reset_seq_numbers(SSL *s, int rw); long dtls1_default_timeout(void); struct timeval* dtls1_get_timeout(SSL *s, struct timeval* timeleft); +int dtls1_check_timeout_num(SSL *s); int dtls1_handle_timeout(SSL *s); SSL_CIPHER *dtls1_get_cipher(unsigned int u); void dtls1_start_timer(SSL *s); @@ -877,6 +878,7 @@ void dtls1_stop_timer(SSL *s); int dtls1_is_timer_expired(SSL *s); void dtls1_double_timeout(SSL *s); int dtls1_send_newsession_ticket(SSL *s); +unsigned int dtls1_min_mtu(void); /* some client-only functions */ diff --git a/crypto/openssl/ssl/t1_lib.c b/crypto/openssl/ssl/t1_lib.c index 92cac130024..cc97258ae53 100644 --- a/crypto/openssl/ssl/t1_lib.c +++ b/crypto/openssl/ssl/t1_lib.c @@ -575,6 +575,12 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, in sdata = data; if (dsize > 0) { + if (s->tlsext_ocsp_exts) + { + sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts, + X509_EXTENSION_free); + } + s->tlsext_ocsp_exts = d2i_X509_EXTENSIONS(NULL, &sdata, dsize); diff --git a/crypto/openssl/util/fipslink.pl b/crypto/openssl/util/fipslink.pl index 3597bc1740a..8b6fbad7d85 100755 --- a/crypto/openssl/util/fipslink.pl +++ b/crypto/openssl/util/fipslink.pl @@ -43,7 +43,12 @@ die "First stage Link failure" if $? != 0; print "$fips_premain_dso $fips_target\n"; -$fips_hash=`$fips_premain_dso $fips_target`; +system("$fips_premain_dso $fips_target >$fips_target.sha1"); +die "Get hash failure" if $? != 0; +open my $sha1_res, '<', $fips_target.".sha1" or die "Get hash failure"; +$fips_hash=<$sha1_res>; +close $sha1_res; +unlink $fips_target.".sha1"; chomp $fips_hash; die "Get hash failure" if $? != 0; diff --git a/crypto/openssl/util/mkerr.pl b/crypto/openssl/util/mkerr.pl index 5d2f2188c15..5775b86a4fe 100644 --- a/crypto/openssl/util/mkerr.pl +++ b/crypto/openssl/util/mkerr.pl @@ -313,7 +313,7 @@ foreach $lib (keys %csrc) } else { push @out, "/* ====================================================================\n", -" * Copyright (c) 2001-2010 The OpenSSL Project. All rights reserved.\n", +" * Copyright (c) 2001-2011 The OpenSSL Project. All rights reserved.\n", " *\n", " * Redistribution and use in source and binary forms, with or without\n", " * modification, are permitted provided that the following conditions\n", @@ -487,7 +487,7 @@ EOF print OUT <<"EOF"; /* $cfile */ /* ==================================================================== - * Copyright (c) 1999-2010 The OpenSSL Project. All rights reserved. + * Copyright (c) 1999-2011 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -680,7 +680,7 @@ EOF undef %err_reason_strings; } -if($debug && defined(%notrans)) { +if($debug && %notrans) { print STDERR "The following function codes were not translated:\n"; foreach(sort keys %notrans) { diff --git a/crypto/openssl/util/pl/VC-32.pl b/crypto/openssl/util/pl/VC-32.pl index ab1449798e3..5001557e7d0 100644 --- a/crypto/openssl/util/pl/VC-32.pl +++ b/crypto/openssl/util/pl/VC-32.pl @@ -391,7 +391,7 @@ sub do_lib_rule $ret.="\tSET FIPS_SHA1_EXE=\$(FIPS_SHA1_EXE)\n"; $ret.="\tSET FIPS_TARGET=$target\n"; $ret.="\tSET FIPSLIB_D=\$(FIPSLIB_D)\n"; - $ret.="\t\$(FIPSLINK) \$(MLFLAGS) /map $base_arg $efile$target "; + $ret.="\t\$(FIPSLINK) \$(MLFLAGS) /fixed /map $base_arg $efile$target "; $ret.="$name @<<\n \$(SHLIB_EX_OBJ) $objs "; $ret.="\$(OBJ_D)${o}fips_premain.obj $ex\n<<\n"; } @@ -434,7 +434,7 @@ sub do_link_rule $ret.="\tSET FIPS_TARGET=$target\n"; $ret.="\tSET FIPS_SHA1_EXE=\$(FIPS_SHA1_EXE)\n"; $ret.="\tSET FIPSLIB_D=\$(FIPSLIB_D)\n"; - $ret.="\t\$(FIPSLINK) \$(LFLAGS) /map $efile$target @<<\n"; + $ret.="\t\$(FIPSLINK) \$(LFLAGS) /fixed /map $efile$target @<<\n"; $ret.="\t\$(APP_EX_OBJ) $files \$(OBJ_D)${o}fips_premain.obj $libs\n<<\n"; } else diff --git a/etc/Makefile b/etc/Makefile index 078e490a416..48124b94878 100644 --- a/etc/Makefile +++ b/etc/Makefile @@ -7,8 +7,7 @@ SUBDIR= sendmail .endif -BIN1= auth.conf \ - crontab \ +BIN1= crontab \ devd.conf \ devfs.conf \ ddb.conf \ diff --git a/etc/auth.conf b/etc/auth.conf deleted file mode 100644 index 08b6f7a3271..00000000000 --- a/etc/auth.conf +++ /dev/null @@ -1,8 +0,0 @@ -# -# $FreeBSD$ -# -# Configure some authentication-related defaults. This file is being -# gradually subsumed by user class and PAM configuration. -# - -# crypt_default = md5 des diff --git a/etc/defaults/periodic.conf b/etc/defaults/periodic.conf index 66fbcd37322..8692b305e21 100644 --- a/etc/defaults/periodic.conf +++ b/etc/defaults/periodic.conf @@ -47,6 +47,7 @@ daily_clean_tmps_dirs="/tmp" # Delete under here daily_clean_tmps_days="3" # If not accessed for daily_clean_tmps_ignore=".X*-lock .X11-unix .ICE-unix .font-unix .XIM-unix" daily_clean_tmps_ignore="$daily_clean_tmps_ignore quota.user quota.group .snap" +daily_clean_tmps_ignore="$daily_clean_tmps_ignore .sujournal" # Don't delete these daily_clean_tmps_verbose="YES" # Mention files deleted diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf index edccc646fb5..c04dab2b21b 100644 --- a/etc/defaults/rc.conf +++ b/etc/defaults/rc.conf @@ -123,6 +123,7 @@ firewall_script="/etc/rc.firewall" # Which script to run to set up the firewall firewall_type="UNKNOWN" # Firewall type (see /etc/rc.firewall) firewall_quiet="NO" # Set to YES to suppress rule display firewall_logging="NO" # Set to YES to enable events logging +firewall_logif="NO" # Set to YES to create logging-pseudo interface firewall_flags="" # Flags passed to ipfw when type is a file firewall_coscripts="" # List of executables/scripts to run after # firewall starts/stops @@ -297,8 +298,8 @@ kadmind5_server_enable="NO" # Run kadmind (or NO) kadmind5_server="/usr/libexec/kadmind" # path to kerberos 5 admin daemon kpasswdd_server_enable="NO" # Run kpasswdd (or NO) kpasswdd_server="/usr/libexec/kpasswdd" # path to kerberos 5 passwd daemon -kfd_server_enable="NO" # Run kfd (or NO) -kfd_server="/usr/libexec/kfd" # path to kerberos 5 kfd daemon +kfd_enable="NO" # Run kfd (or NO) +kfd_program="/usr/libexec/kfd" # path to kerberos 5 kfd daemon gssd_enable="NO" # Run the gssd daemon (or NO). gssd_flags="" # Flags for gssd. diff --git a/etc/devd.conf b/etc/devd.conf index 27abc1f597a..fa9ed986b4b 100644 --- a/etc/devd.conf +++ b/etc/devd.conf @@ -320,7 +320,7 @@ notify 10 { notify 0 { match "system" "RCTL"; match "rule" "user:70:swap:.*"; - action "/usr/local/etc/rc.d/postgresql restart" + action "/usr/local/etc/rc.d/postgresql restart"; }; */ diff --git a/etc/devd/usb.conf b/etc/devd/usb.conf index 7f830ab6d93..eb40f3878dd 100644 --- a/etc/devd/usb.conf +++ b/etc/devd/usb.conf @@ -157,7 +157,7 @@ nomatch 32 { match "bus" "uhub[0-9]+"; match "mode" "host"; match "vendor" "0x0403"; - match "product" "(0x6001|0x6004|0x6010|0x6011|0x8372|0x9e90|0xa6d0|0xa6d0|0xcc48|0xcc49|0xcc4a|0xd678|0xe6c8|0xe888|0xe889|0xe88a|0xe88b|0xe88c|0xee18|0xf608|0xf60b|0xf850|0xfa00|0xfa01|0xfa02|0xfa03|0xfa04|0xfc08|0xfc09|0xfc0b|0xfc0c|0xfc0d|0xfc82)"; + match "product" "(0x6001|0x6004|0x6010|0x6011|0x8372|0x9e90|0xcc48|0xcc49|0xcc4a|0xd678|0xe6c8|0xe888|0xe889|0xe88a|0xe88b|0xe88c|0xee18|0xf608|0xf60b|0xf850|0xfa00|0xfa01|0xfa02|0xfa03|0xfa04|0xfc08|0xfc09|0xfc0b|0xfc0c|0xfc0d|0xfc82)"; action "kldload -n uftdi"; }; @@ -1021,7 +1021,7 @@ nomatch 32 { match "bus" "uhub[0-9]+"; match "mode" "host"; match "vendor" "0x05c6"; - match "product" "(0x1000|0x6000|0x6613)"; + match "product" "(0x1000|0x6000|0x6613|0x9000)"; action "kldload -n u3g"; }; @@ -2849,6 +2849,14 @@ nomatch 32 { action "kldload -n usie"; }; +nomatch 32 { + match "bus" "uhub[0-9]+"; + match "mode" "host"; + match "vendor" "0x1199"; + match "product" "0x68aa"; + action "kldload -n u3g"; +}; + nomatch 32 { match "bus" "uhub[0-9]+"; match "mode" "host"; @@ -3661,7 +3669,7 @@ nomatch 32 { match "bus" "uhub[0-9]+"; match "mode" "host"; match "vendor" "0x19d2"; - match "product" "(0x0001|0x0002|0x0003|0x0004|0x0005|0x0006|0x0007|0x0008|0x0009|0x000a|0x000b|0x000c|0x000d|0x000e|0x000f|0x0010|0x0011|0x0012|0x0013|0x0014|0x0015|0x0016|0x0017|0x0018|0x0019|0x0020|0x0021|0x0022|0x0023|0x0024|0x0025|0x0026|0x0027|0x0028|0x0029|0x0030|0x0031|0x0032|0x0033|0x0037|0x0039|0x0042|0x0043|0x0048|0x0049|0x0051|0x0052|0x0053|0x0054|0x0055|0x0057|0x0058|0x0059|0x0060|0x0061|0x0062|0x0063|0x0064|0x0066|0x0069|0x0070|0x0073|0x0076|0x0078|0x0082|0x0086|0x0117|0x2000|0x2002|0x2003|0xfff1|0xfff5|0xfffe)"; + match "product" "(0x0001|0x0002|0x0003|0x0004|0x0005|0x0006|0x0007|0x0008|0x0009|0x000a|0x000b|0x000c|0x000d|0x000e|0x000f|0x0010|0x0011|0x0012|0x0013|0x0014|0x0015|0x0016|0x0017|0x0018|0x0019|0x0020|0x0021|0x0022|0x0023|0x0024|0x0025|0x0026|0x0027|0x0028|0x0029|0x0030|0x0031|0x0032|0x0033|0x0037|0x0039|0x0042|0x0043|0x0048|0x0049|0x0051|0x0052|0x0053|0x0054|0x0055|0x0057|0x0058|0x0059|0x0060|0x0061|0x0062|0x0063|0x0064|0x0066|0x0069|0x0070|0x0073|0x0076|0x0078|0x0082|0x0086|0x0117|0x1179|0x2000|0x2002|0x2003|0xfff1|0xfff5|0xfffe)"; action "kldload -n u3g"; }; @@ -4165,7 +4173,7 @@ nomatch 32 { match "bus" "uhub[0-9]+"; match "mode" "host"; match "vendor" "0x9710"; - match "product" "0x7830"; + match "product" "(0x7830|0x7832)"; action "kldload -n if_mos"; }; @@ -4336,5 +4344,5 @@ nomatch 32 { action "kldload -n umass"; }; -# 1652 USB entries processed +# 1654 USB entries processed diff --git a/etc/login.conf b/etc/login.conf index a454758decd..c62687a6510 100644 --- a/etc/login.conf +++ b/etc/login.conf @@ -23,10 +23,10 @@ # AND SEMANTICS'' section of getcap(3) for more escape sequences). default:\ - :passwd_format=md5:\ + :passwd_format=sha512:\ :copyright=/etc/COPYRIGHT:\ :welcome=/etc/motd:\ - :setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\ + :setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\ :path=/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin ~/bin:\ :nologin=/var/run/nologin:\ :cputime=unlimited:\ diff --git a/etc/mtree/BSD.include.dist b/etc/mtree/BSD.include.dist index 2de9e84c13e..637ec037e6e 100644 --- a/etc/mtree/BSD.include.dist +++ b/etc/mtree/BSD.include.dist @@ -102,6 +102,8 @@ .. ciss .. + filemon + .. firewire .. hwpmc @@ -122,6 +124,8 @@ mpilib .. .. + nand + .. ofw .. pbio @@ -154,6 +158,8 @@ .. msdosfs .. + nandfs + .. nfs .. ntfs diff --git a/etc/mtree/BSD.usr.dist b/etc/mtree/BSD.usr.dist index b9f79d2d84c..10e88f3cece 100644 --- a/etc/mtree/BSD.usr.dist +++ b/etc/mtree/BSD.usr.dist @@ -200,6 +200,10 @@ .. .. .. + dtrace + toolkit + .. + .. examples BSD_daemon .. @@ -209,8 +213,8 @@ .. bootforth .. - csh - .. + csh + .. cvs contrib .. diff --git a/etc/pam.d/Makefile b/etc/pam.d/Makefile index f3795b312ac..7369022cc8b 100644 --- a/etc/pam.d/Makefile +++ b/etc/pam.d/Makefile @@ -7,7 +7,6 @@ FILES= README \ cron \ ftpd \ imap \ - kde \ login \ other \ passwd pop3 \ diff --git a/etc/pam.d/kde b/etc/pam.d/kde deleted file mode 100644 index f7d54f66c6c..00000000000 --- a/etc/pam.d/kde +++ /dev/null @@ -1,19 +0,0 @@ -# -# $FreeBSD$ -# -# PAM configuration for the "kde" service -# - -# auth -#auth sufficient pam_krb5.so no_warn try_first_pass -#auth sufficient pam_ssh.so no_warn try_first_pass -auth required pam_unix.so no_warn try_first_pass - -# account -account required pam_nologin.so -#account required pam_krb5.so -account required pam_unix.so - -# session -#session optional pam_ssh.so want_agent -session required pam_permit.so diff --git a/etc/periodic/daily/400.status-disks b/etc/periodic/daily/400.status-disks index dc525a5bcca..dd828aaaf39 100755 --- a/etc/periodic/daily/400.status-disks +++ b/etc/periodic/daily/400.status-disks @@ -19,12 +19,15 @@ case "$daily_status_disks_enable" in df $daily_status_disks_df_flags && rc=1 || rc=3 # display which filesystems need backing up - if ! [ -f /etc/fstab ]; then - export PATH_FSTAB=/dev/null - fi + if [ -s /etc/dumpdates ]; then + if ! [ -f /etc/fstab ]; then + export PATH_FSTAB=/dev/null + fi - echo "" - dump W || rc=3;; + echo "" + dump W || rc=3 + fi + ;; *) rc=0;; esac diff --git a/etc/periodic/daily/420.status-network b/etc/periodic/daily/420.status-network index 8399cf720ef..13ae1e8b8b6 100755 --- a/etc/periodic/daily/420.status-network +++ b/etc/periodic/daily/420.status-network @@ -18,9 +18,9 @@ case "$daily_status_network_enable" in case "$daily_status_network_usedns" in [Yy][Ee][Ss]) - netstat -i && rc=0 || rc=3;; + netstat -id && rc=0 || rc=3;; *) - netstat -in && rc=0 || rc=3;; + netstat -idn && rc=0 || rc=3;; esac;; *) rc=0;; diff --git a/etc/rc.d/accounting b/etc/rc.d/accounting index 85483fec80e..0c7ac36c0e8 100755 --- a/etc/rc.d/accounting +++ b/etc/rc.d/accounting @@ -65,9 +65,7 @@ accounting_rotate_log() mv ${accounting_file} ${accounting_file}.0 if checkyesno accounting_enable; then - ln $_file ${accounting_file##*/} - ${accounting_command} ${accounting_file} - unlink $_file + mv $_file ${accounting_file} fi } diff --git a/etc/rc.d/ipfw b/etc/rc.d/ipfw index 4beb609cb8d..625d07dd49a 100755 --- a/etc/rc.d/ipfw +++ b/etc/rc.d/ipfw @@ -57,6 +57,10 @@ ipfw_start() echo 'Firewall logging enabled.' sysctl net.inet.ip.fw.verbose=1 >/dev/null fi + if checkyesno firewall_logif; then + ifconfig ipfw0 create + echo 'Firewall logging pseudo-interface (ipfw0) created.' + fi } ipfw_poststart() diff --git a/etc/rc.d/jail b/etc/rc.d/jail index 72ab62ee876..f5b8f311c1a 100755 --- a/etc/rc.d/jail +++ b/etc/rc.d/jail @@ -641,7 +641,7 @@ jail_start() i=$((i + 1)) done - eval ${_setfib} jail ${_flags} -i ${_rootdir} ${_hostname} \ + eval ${_setfib} jail ${_flags} -n ${_jail} -i ${_rootdir} ${_hostname} \ \"${_addrl}\" ${_exec_start} > ${_tmp_jail} 2>&1 \ % @@ -192,13 +189,6 @@ flag is your gateway. Nice bash prompt: PS1='(\[$(tput md)\]\t <\w>\[$(tput me)\]) $(echo $?) \$ ' -- Mathieu % -Nice tcsh prompts: - set prompt = '[%B%m%b] %B%~%b%# ' - set prompt = '%m %# ' - set prompt = '%n@%m%# ' - set prompt = '%n@%m:%/%# ' - set prompt = '%n@%m:%~%# ' -% Over quota? "du -s * | sort -n " will give you a sorted list of your directory sizes. -- David Scheidt @@ -263,7 +253,7 @@ To quickly create an empty file, use "touch filename". -- Dru % To read a compressed file without having to first uncompress it, use -"zcat" or "zmore" to view it. +"zcat" or "zless" to view it. -- Dru % To repeat the last command in the C shell, type "!!". @@ -282,7 +272,7 @@ will search '/', and all subdirectories, for files with 'GENERIC' in the name. % To see all of the directories on your FreeBSD system, type - ls -R / | more + ls -R / | less -- Dru % To see how long it takes a command to run, type the word "time" before the @@ -322,7 +312,7 @@ been replaced with other messages, look at /var/run/dmesg.boot. Want colour in your directory listings? Use "ls -G". "ls -F" is also useful, and they can be combined as "ls -FG". % -Want to find a specific port, just type the following under /usr/ports, +Want to find a specific port, just type the following under /usr/ports or one its subdirectories: "make search name=" @@ -479,3 +469,9 @@ when you are trying to find where in the ports tree an application is. Try "whereis firefox" and "whereis whereis". -- Konstantinos Konstantinidis % +Want to run the same command again? +In tcsh you can type "!!" +% +Want to go the directory you were just in? +Type "cd -" +% diff --git a/gnu/lib/Makefile b/gnu/lib/Makefile index 80039e2f3a9..6750403d66c 100644 --- a/gnu/lib/Makefile +++ b/gnu/lib/Makefile @@ -2,7 +2,11 @@ .include -SUBDIR= csu libgcc libgcov libdialog libgomp libregex libreadline libssp +SUBDIR= csu libgcc libgcov libdialog libgomp libregex libreadline + +.if ${MK_SSP} != "no" +SUBDIR+= libssp +.endif # libsupc++ uses libstdc++ headers, although 'make includes' should # have taken care of that already. diff --git a/gnu/lib/csu/Makefile b/gnu/lib/csu/Makefile index 4999d06a578..a65be66f382 100644 --- a/gnu/lib/csu/Makefile +++ b/gnu/lib/csu/Makefile @@ -12,7 +12,7 @@ CCDIR= ${.CURDIR}/../../usr.bin/cc SRCS= crtstuff.c tconfig.h tm.h options.h OBJS= crtbegin.o crtend.o crtbeginT.o -SOBJS= crtbegin.So crtend.So +SOBJS= crtbeginS.o crtendS.o CSTD?= gnu89 CFLAGS+= -DIN_GCC -DHAVE_LD_EH_FRAME_HDR -DDT_CONFIG -D__GLIBC__=3 CFLAGS+= -finhibit-size-directive -fno-inline-functions \ @@ -55,7 +55,7 @@ crtbeginT.o: ${BEGINSRC} ${CC} ${CFLAGS} -g0 -DCRT_BEGIN -DCRTSTUFFT_O \ -c -o ${.TARGET} ${.ALLSRC:N*.h} -crtbegin.So: ${BEGINSRC} +crtbeginS.o: ${BEGINSRC} ${CC} ${CFLAGS} -g0 -DCRT_BEGIN ${CRTS_CFLAGS} \ -c -o ${.TARGET} ${.ALLSRC:N*.h} @@ -63,7 +63,7 @@ crtend.o: ${ENDSRC} ${CC} ${CFLAGS} -g0 -DCRT_END \ -c -o ${.TARGET} ${.ALLSRC:N*.h} -crtend.So: ${ENDSRC} +crtendS.o: ${ENDSRC} ${CC} ${CFLAGS} -g0 -DCRT_END ${CRTS_CFLAGS} \ -c -o ${.TARGET} ${.ALLSRC:N*.h} @@ -74,7 +74,7 @@ tm.h tconfig.h options.h: ${CCDIR}/cc_tools/Makefile realinstall: .for file in ${OBJS} ${SOBJS} ${TGTOBJS} ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ - ${file} ${DESTDIR}${LIBDIR}/${file:S/.So$/S.o/} + ${file} ${DESTDIR}${LIBDIR}/${file} .endfor .include diff --git a/gnu/lib/libgcc/Makefile b/gnu/lib/libgcc/Makefile index 47829ca3bd2..9c543773216 100644 --- a/gnu/lib/libgcc/Makefile +++ b/gnu/lib/libgcc/Makefile @@ -15,7 +15,7 @@ MK_SSP= no .include "${.CURDIR}/../../usr.bin/cc/Makefile.tgt" -.if ${TARGET_CPUARCH} == "sparc64" || ${TARGET_CPUARCH} == "mips" +.if ${TARGET_CPUARCH} == "mips" LIB= gcc .endif diff --git a/gnu/lib/libgomp/config.h b/gnu/lib/libgomp/config.h index c56d8601c20..6ef541be733 100644 --- a/gnu/lib/libgomp/config.h +++ b/gnu/lib/libgomp/config.h @@ -59,7 +59,7 @@ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if the target supports thread-local storage. */ -#if !defined(__arm__) && !defined(__mips__) +#if !defined(__mips__) #define HAVE_TLS 1 #endif diff --git a/gnu/lib/libstdc++/config.h b/gnu/lib/libstdc++/config.h index a4afbdbec30..7955ab62a60 100644 --- a/gnu/lib/libstdc++/config.h +++ b/gnu/lib/libstdc++/config.h @@ -371,7 +371,7 @@ /* #undef HAVE_TANL */ /* Define to 1 if the target supports thread-local storage. */ -#if !defined(__arm__) && !defined(__mips__) +#if !defined(__mips__) #define HAVE_TLS 1 #endif diff --git a/gnu/lib/libsupc++/Version.map b/gnu/lib/libsupc++/Version.map index 12438ca61c1..ec6303ef78e 100644 --- a/gnu/lib/libsupc++/Version.map +++ b/gnu/lib/libsupc++/Version.map @@ -130,6 +130,20 @@ CXXABI_1.3 { *; }; +GLIBCXX_3.4 { + # operator new and new[] + _Znai[jm]; + _Zna[jm]RKSt9nothrow_t; + _Znw[jm]; + _Znw[jm]RKSt9nothrow_t; + + # operator delete and delete[] + _ZdaPv; + _ZdaPvRKSt9nothrow_t; + _ZdlPv; + _ZdlPvRKSt9nothrow_t; +}; + CXXABI_1.3.1 { __cxa_get_exception_ptr; diff --git a/gnu/usr.bin/binutils/addr2line/addr2line.1 b/gnu/usr.bin/binutils/addr2line/addr2line.1 index dc946f84741..4f76544fa35 100644 --- a/gnu/usr.bin/binutils/addr2line/addr2line.1 +++ b/gnu/usr.bin/binutils/addr2line/addr2line.1 @@ -131,7 +131,7 @@ .if n .ad l .nh .SH "NAME" -addr2line \- convert addresses into file names and line numbers. +addr2line \- convert addresses into file names and line numbers .SH "SYNOPSIS" .IX Header "SYNOPSIS" addr2line [\fB\-b\fR \fIbfdname\fR|\fB\-\-target=\fR\fIbfdname\fR] diff --git a/gnu/usr.bin/binutils/ar/Makefile b/gnu/usr.bin/binutils/ar/Makefile index 464445e544b..6fe22c890e9 100644 --- a/gnu/usr.bin/binutils/ar/Makefile +++ b/gnu/usr.bin/binutils/ar/Makefile @@ -1,6 +1,7 @@ # $FreeBSD$ .include "../Makefile.inc0" +.include .PATH: ${SRCDIR}/binutils ${SRCDIR}/binutils/doc @@ -16,7 +17,9 @@ CFLAGS+= -D_GNU_SOURCE CFLAGS+= -I${.CURDIR}/${RELTOP}/libbinutils CFLAGS+= -I${SRCDIR}/binutils CFLAGS+= -I${SRCDIR}/bfd +.if ${MK_SHARED_TOOLCHAIN} == "no" NO_SHARED?= yes +.endif DPADD= ${RELTOP}/libbinutils/libbinutils.a DPADD+= ${RELTOP}/libbfd/libbfd.a DPADD+= ${RELTOP}/libiberty/libiberty.a diff --git a/gnu/usr.bin/binutils/as/Makefile b/gnu/usr.bin/binutils/as/Makefile index bf8df81a8bf..5fef1f3da46 100644 --- a/gnu/usr.bin/binutils/as/Makefile +++ b/gnu/usr.bin/binutils/as/Makefile @@ -4,6 +4,7 @@ # BINDIR .include "${.CURDIR}/../../Makefile.inc" .include "${.CURDIR}/../Makefile.inc0" +.include .PATH: ${SRCDIR}/gas ${SRCDIR}/gas/config @@ -79,7 +80,9 @@ CFLAGS+= -D_GNU_SOURCE CFLAGS+= -I${SRCDIR}/gas -I${SRCDIR}/bfd -I${SRCDIR}/gas/config -I${SRCDIR} CFLAGS+= -I${.CURDIR} -I${.CURDIR}/${TARGET_CPUARCH}-freebsd +.if ${MK_SHARED_TOOLCHAIN} == "no" NO_SHARED?= yes +.endif DPADD= ${RELTOP}/libbfd/libbfd.a DPADD+= ${RELTOP}/libiberty/libiberty.a diff --git a/gnu/usr.bin/binutils/ld/Makefile b/gnu/usr.bin/binutils/ld/Makefile index d4420ed0930..ef19afae07d 100644 --- a/gnu/usr.bin/binutils/ld/Makefile +++ b/gnu/usr.bin/binutils/ld/Makefile @@ -1,6 +1,7 @@ # $FreeBSD$ .include "../Makefile.inc0" +.include .PATH: ${SRCDIR}/ld @@ -34,7 +35,9 @@ CFLAGS+= -DBINDIR=\"${BINDIR}\" -DTARGET_SYSTEM_ROOT=\"${TOOLS_PREFIX}\" CFLAGS+= -DTOOLBINDIR=\"${TOOLS_PREFIX}/${BINDIR}/libexec\" CFLAGS+= -D_GNU_SOURCE CFLAGS+= -I${SRCDIR}/ld -I${SRCDIR}/bfd +.if ${MK_SHARED_TOOLCHAIN} == "no" NO_SHARED?= yes +.endif DPADD= ${RELTOP}/libbfd/libbfd.a DPADD+= ${RELTOP}/libiberty/libiberty.a LDADD= ${DPADD} diff --git a/gnu/usr.bin/binutils/ranlib/Makefile b/gnu/usr.bin/binutils/ranlib/Makefile index 86793759ff7..052f9fe7253 100644 --- a/gnu/usr.bin/binutils/ranlib/Makefile +++ b/gnu/usr.bin/binutils/ranlib/Makefile @@ -1,6 +1,7 @@ # $FreeBSD$ .include "../Makefile.inc0" +.include .PATH: ${SRCDIR}/binutils ${SRCDIR}/binutils/doc @@ -16,7 +17,9 @@ CFLAGS+= -D_GNU_SOURCE CFLAGS+= -I${.CURDIR}/${RELTOP}/libbinutils CFLAGS+= -I${SRCDIR}/binutils CFLAGS+= -I${SRCDIR}/bfd +.if ${MK_SHARED_TOOLCHAIN} == "no" NO_SHARED?= yes +.endif DPADD= ${RELTOP}/libbinutils/libbinutils.a DPADD+= ${RELTOP}/libbfd/libbfd.a DPADD+= ${RELTOP}/libiberty/libiberty.a diff --git a/gnu/usr.bin/binutils/ranlib/ranlib.1 b/gnu/usr.bin/binutils/ranlib/ranlib.1 index 88a10e646b5..ba2b7d26f0d 100644 --- a/gnu/usr.bin/binutils/ranlib/ranlib.1 +++ b/gnu/usr.bin/binutils/ranlib/ranlib.1 @@ -131,7 +131,7 @@ .if n .ad l .nh .SH "NAME" -ranlib \- generate index to archive. +ranlib \- generate index to archive .SH "SYNOPSIS" .IX Header "SYNOPSIS" ranlib [\fB\-vV\fR] \fIarchive\fR diff --git a/gnu/usr.bin/binutils/size/size.1 b/gnu/usr.bin/binutils/size/size.1 index 3f90967e593..7064762186f 100644 --- a/gnu/usr.bin/binutils/size/size.1 +++ b/gnu/usr.bin/binutils/size/size.1 @@ -131,7 +131,7 @@ .if n .ad l .nh .SH "NAME" -size \- list section sizes and total size. +size \- list section sizes and total size .SH "SYNOPSIS" .IX Header "SYNOPSIS" size [\fB\-A\fR|\fB\-B\fR|\fB\-\-format=\fR\fIcompatibility\fR] diff --git a/gnu/usr.bin/binutils/strip/strip.1 b/gnu/usr.bin/binutils/strip/strip.1 index 2b77c33c1ba..3f0d7a3e3db 100644 --- a/gnu/usr.bin/binutils/strip/strip.1 +++ b/gnu/usr.bin/binutils/strip/strip.1 @@ -131,7 +131,7 @@ .if n .ad l .nh .SH "NAME" -strip \- Discard symbols from object files. +strip \- Discard symbols from object files .SH "SYNOPSIS" .IX Header "SYNOPSIS" strip [\fB\-F\fR \fIbfdname\fR |\fB\-\-target=\fR\fIbfdname\fR] diff --git a/gnu/usr.bin/cc/cc/Makefile b/gnu/usr.bin/cc/cc/Makefile index 78c83a5da18..ba53565c35f 100644 --- a/gnu/usr.bin/cc/cc/Makefile +++ b/gnu/usr.bin/cc/cc/Makefile @@ -9,7 +9,9 @@ PROG= gcc MAN= gcc.1 SRCS+= gccspec.c +.if ${MK_SHARED_TOOLCHAIN} == "no" NO_SHARED?=yes +.endif MLINKS= gcc.1 g++.1 .if ${MK_CLANG_IS_CC} == "no" diff --git a/gnu/usr.bin/cc/cc1/Makefile b/gnu/usr.bin/cc/cc1/Makefile index c65acd28ece..7b1e34390f7 100644 --- a/gnu/usr.bin/cc/cc1/Makefile +++ b/gnu/usr.bin/cc/cc1/Makefile @@ -1,14 +1,17 @@ # $FreeBSD$ .include "../Makefile.inc" +NO_MAN= +.include .PATH: ${GCCDIR} PROG= cc1 SRCS= main.c c-parser.c c-lang.c BINDIR= /usr/libexec -NO_MAN= +.if ${MK_SHARED_TOOLCHAIN} == "no" NO_SHARED?=yes +.endif OBJS+= ${PROG}-checksum.o DPADD= ${LIBBACKEND} ${LIBCPP} ${LIBDECNUMBER} ${LIBIBERTY} diff --git a/gnu/usr.bin/cc/cc1plus/Makefile b/gnu/usr.bin/cc/cc1plus/Makefile index 964d20fd46d..dd3d524e4b1 100644 --- a/gnu/usr.bin/cc/cc1plus/Makefile +++ b/gnu/usr.bin/cc/cc1plus/Makefile @@ -1,6 +1,8 @@ # $FreeBSD$ .include "../Makefile.inc" +NO_MAN= +.include .PATH: ${GCCDIR}/cp ${GCCDIR} @@ -13,8 +15,9 @@ SRCS+= main.c cp-lang.c c-opts.c call.c class.c cvt.c cxx-pretty-print.c \ cp-objcp-common.c cp-gimplify.c tree-mudflap.c BINDIR= /usr/libexec -NO_MAN= +.if ${MK_SHARED_TOOLCHAIN} == "no" NO_SHARED?=yes +.endif CFLAGS+= -I${GCCDIR}/cp -I. diff --git a/gnu/usr.bin/cc/cc_tools/auto-host.h b/gnu/usr.bin/cc/cc_tools/auto-host.h index 5d6ddc01205..7b72ea9117e 100644 --- a/gnu/usr.bin/cc/cc_tools/auto-host.h +++ b/gnu/usr.bin/cc/cc_tools/auto-host.h @@ -261,7 +261,7 @@ /* Define if your assembler supports R_PPC_REL16 relocs. */ #ifndef USED_FOR_TARGET -/* #undef HAVE_AS_REL16 */ +#define HAVE_AS_REL16 #endif diff --git a/gnu/usr.bin/gdb/gdb/gdb.1 b/gnu/usr.bin/gdb/gdb/gdb.1 index ea4d6494ef3..ee84659ac57 100644 --- a/gnu/usr.bin/gdb/gdb/gdb.1 +++ b/gnu/usr.bin/gdb/gdb/gdb.1 @@ -322,11 +322,11 @@ to output the full file name and line number in a standard, recognizable fashion each time a stack frame is displayed (which includes each time the program stops). This recognizable format looks like two `\|\c -.B \032\c +.B \e032\c \&\|' characters, followed by the file name, line number and character position separated by colons, and a newline. The Emacs-to-GDB interface program uses the two `\|\c -.B \032\c +.B \e032\c \&\|' characters as a signal to display the source code for the frame. diff --git a/gnu/usr.bin/gdb/kgdb/trgt_powerpc.c b/gnu/usr.bin/gdb/kgdb/trgt_powerpc.c index 6b8731b8e83..a83c2d0a31c 100644 --- a/gnu/usr.bin/gdb/kgdb/trgt_powerpc.c +++ b/gnu/usr.bin/gdb/kgdb/trgt_powerpc.c @@ -28,8 +28,13 @@ __FBSDID("$FreeBSD$"); #include +#ifdef CROSS_DEBUGGER +#include +#include +#else #include #include +#endif #include #include #include diff --git a/gnu/usr.bin/gdb/libgdb/fbsd-threads.c b/gnu/usr.bin/gdb/libgdb/fbsd-threads.c index 5733e4063ad..78819a743e5 100644 --- a/gnu/usr.bin/gdb/libgdb/fbsd-threads.c +++ b/gnu/usr.bin/gdb/libgdb/fbsd-threads.c @@ -1311,7 +1311,7 @@ tsd_cb (thread_key_t key, void (*destructor)(void *), void *ignore) else name = DEPRECATED_SYMBOL_NAME (ms); - printf_filtered ("Destructor %p <%s>\n", destructor, name); + printf_filtered ("Key %d, destructor %p <%s>\n", key, destructor, name); return 0; } diff --git a/gnu/usr.bin/sort/Makefile b/gnu/usr.bin/sort/Makefile index e3a005dfbbc..bf193bc2b7c 100644 --- a/gnu/usr.bin/sort/Makefile +++ b/gnu/usr.bin/sort/Makefile @@ -3,7 +3,18 @@ SORTDIR= ${.CURDIR}/../../../contrib/gnu-sort .PATH: ${SORTDIR}/lib ${SORTDIR}/src ${SORTDIR}/man +.include + +.if ${MK_GNU_SORT} == "yes" PROG= sort +.else +PROG= gnusort + +CLEANFILES+= gnusort.1 +gnusort.1: sort.1 + cp ${.ALLSRC} ${.TARGET} +.endif + SRCS= sort.c \ __fpending.c \ argmatch.c \ diff --git a/include/Makefile b/include/Makefile index 2cbc9d2113e..d2f6d7f0885 100644 --- a/include/Makefile +++ b/include/Makefile @@ -39,11 +39,11 @@ LDIRS= bsm cam geom net net80211 netatalk netgraph netinet netinet6 \ sys vm LSUBDIRS= cam/ata cam/scsi \ - dev/acpica dev/an dev/bktr dev/ciss dev/firewire dev/hwpmc \ + dev/acpica dev/an dev/bktr dev/ciss dev/filemon dev/firewire dev/hwpmc \ dev/ic dev/iicbus ${_dev_ieee488} dev/io dev/lmc dev/mfi dev/ofw \ dev/pbio ${_dev_powermac_nvram} dev/ppbus dev/smbus \ dev/speaker dev/usb dev/utopia dev/vkbd dev/wi \ - fs/devfs fs/fdescfs fs/msdosfs fs/nfs fs/ntfs fs/nullfs \ + fs/devfs fs/fdescfs fs/msdosfs fs/nandfs fs/nfs fs/ntfs fs/nullfs \ ${_fs_nwfs} fs/portalfs fs/procfs fs/smbfs fs/udf fs/unionfs \ geom/cache geom/concat geom/eli geom/gate geom/journal geom/label \ geom/mirror geom/mountver geom/multipath geom/nop \ @@ -157,7 +157,7 @@ copies: done .endif .endfor -.for i in ${LDIRS} ${LSUBDIRS:Ndev/acpica:Ndev/bktr} ${LSUBSUBDIRS} +.for i in ${LDIRS} ${LSUBDIRS:Ndev/acpica:Ndev/bktr:Ndev/nand} ${LSUBSUBDIRS} cd ${.CURDIR}/../sys; \ ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 $i/*.h \ ${DESTDIR}${INCLUDEDIR}/$i @@ -168,6 +168,13 @@ copies: cd ${.CURDIR}/../sys/dev/bktr; \ ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 ioctl_*.h \ ${DESTDIR}${INCLUDEDIR}/dev/bktr +.if ${MK_NAND} != "no" + cd ${.CURDIR}/../sys/dev/nand; \ + ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 nandsim.h \ + ${DESTDIR}${INCLUDEDIR}/dev/nand; \ + ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 nand_dev.h \ + ${DESTDIR}${INCLUDEDIR}/dev/nand +.endif cd ${.CURDIR}/../sys/contrib/altq/altq; \ ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 *.h \ ${DESTDIR}${INCLUDEDIR}/altq @@ -224,7 +231,7 @@ symlinks: ln -fs ../../../sys/$i/$$h ${DESTDIR}${INCLUDEDIR}/$i; \ done .endfor -.for i in ${LSUBDIRS:Ndev/acpica:Ndev/bktr} +.for i in ${LSUBDIRS:Ndev/acpica:Ndev/bktr:Ndev/nand} cd ${.CURDIR}/../sys/$i; \ for h in *.h; do \ ln -fs ../../../../sys/$i/$$h ${DESTDIR}${INCLUDEDIR}/$i; \ @@ -240,6 +247,13 @@ symlinks: ln -fs ../../../../sys/dev/bktr/$$h \ ${DESTDIR}${INCLUDEDIR}/dev/bktr; \ done +.if ${MK_NAND} != "no" + cd ${.CURDIR}/../sys/dev/nand; \ + for h in nandsim.h nand_dev.h; do \ + ln -fs ../../../../sys/dev/nand/$$h \ + ${DESTDIR}${INCLUDEDIR}/dev/nand; \ + done +.endif .for i in ${LSUBSUBDIRS} cd ${.CURDIR}/../sys/$i; \ for h in *.h; do \ diff --git a/include/dirent.h b/include/dirent.h index e3ef1495f77..941a97756ea 100644 --- a/include/dirent.h +++ b/include/dirent.h @@ -55,24 +55,8 @@ /* definitions for library routines operating on directories. */ #define DIRBLKSIZ 1024 -struct _telldir; /* see telldir.h */ -struct pthread_mutex; - -/* structure describing an open directory. */ -typedef struct _dirdesc { - int dd_fd; /* file descriptor associated with directory */ - long dd_loc; /* offset in current buffer */ - long dd_size; /* amount of data returned by getdirentries */ - char *dd_buf; /* data buffer */ - int dd_len; /* size of data buffer */ - long dd_seek; /* magic cookie returned by getdirentries */ - long dd_rewind; /* magic cookie for rewinding */ - int dd_flags; /* flags for readdir */ - struct pthread_mutex *dd_lock; /* lock */ - struct _telldir *dd_td; /* telldir position recording */ -} DIR; - -#define dirfd(dirp) ((dirp)->dd_fd) +struct _dirdesc; +typedef struct _dirdesc DIR; /* flags for opendir2 */ #define DTF_HIDEW 0x0001 /* hide whiteout entries */ @@ -91,6 +75,7 @@ typedef void * DIR; __BEGIN_DECLS #if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 700 int alphasort(const struct dirent **, const struct dirent **); +int dirfd(DIR *); #endif #if __BSD_VISIBLE DIR *__opendir2(const char *, int); diff --git a/include/fmtmsg.h b/include/fmtmsg.h index 32f0970fb94..307c844c388 100644 --- a/include/fmtmsg.h +++ b/include/fmtmsg.h @@ -32,7 +32,7 @@ /* Source of condition is... */ #define MM_HARD 0x0001 /* ...hardware. */ #define MM_SOFT 0x0002 /* ...software. */ -#define MM_FIRM 0x0004 /* ...fireware. */ +#define MM_FIRM 0x0004 /* ...firmware. */ /* Condition detected by... */ #define MM_APPL 0x0010 /* ...application. */ diff --git a/include/malloc_np.h b/include/malloc_np.h index 699077f3c1d..e1305523079 100644 --- a/include/malloc_np.h +++ b/include/malloc_np.h @@ -55,13 +55,11 @@ int mallctlbymib(const size_t *mib, size_t miblen, void *oldp, #define ALLOCM_ERR_OOM 1 #define ALLOCM_ERR_NOT_MOVED 2 -int allocm(void **ptr, size_t *rsize, size_t size, int flags) - __attribute__(nonnull(1)); +int allocm(void **ptr, size_t *rsize, size_t size, int flags) __nonnull(1); int rallocm(void **ptr, size_t *rsize, size_t size, size_t extra, - int flags) __attribute__(nonnull(1)); -int sallocm(const void *ptr, size_t *rsize, int flags) - __attribute__(nonnull(1)); -int dallocm(void *ptr, int flags) __attribute__(nonnull(1)); + int flags) __nonnull(1); +int sallocm(const void *ptr, size_t *rsize, int flags) __nonnull(1); +int dallocm(void *ptr, int flags) __nonnull(1); int nallocm(size_t *rsize, size_t size, int flags); __END_DECLS diff --git a/include/paths.h b/include/paths.h index 65039344657..1e7402b4aa6 100644 --- a/include/paths.h +++ b/include/paths.h @@ -42,7 +42,6 @@ /* Locate system binaries. */ #define _PATH_SYSPATH "/sbin:/usr/sbin" -#define _PATH_AUTHCONF "/etc/auth.conf" #define _PATH_BSHELL "/bin/sh" #define _PATH_CAPABILITY "/etc/capability" #define _PATH_CAPABILITY_DB "/etc/capability.db" diff --git a/include/printf.h b/include/printf.h index 1cb39c70092..c12c3ebf4ec 100644 --- a/include/printf.h +++ b/include/printf.h @@ -123,7 +123,7 @@ int register_printf_function(int spec, printf_function *render, printf_arginfo_f /* FreeBSD */ int register_printf_render(int spec, printf_render *render, printf_arginfo_function *arginfo); -int register_printf_render_std(const unsigned char *specs); +int register_printf_render_std(const char *specs); /* vprintf_errno.c */ printf_arginfo_function __printf_arginfo_errno; diff --git a/include/protocols/dumprestore.h b/include/protocols/dumprestore.h index d6740a6193a..93552923f81 100644 --- a/include/protocols/dumprestore.h +++ b/include/protocols/dumprestore.h @@ -65,6 +65,15 @@ #endif #define CHECKSUM (int)84446 +/* + * Since ino_t size is changing to 64-bits, yet we desire this structure to + * remain compatible with exiting dump formats, we do NOT use ino_t here, + * but rather define a 32-bit type in its place. At some point, it may be + * necessary to use some of the c_spare[] in order to fully support 64-bit + * inode numbers. + */ +typedef uint32_t dump_ino_t; + union u_spcl { char dummy[TP_BSIZE]; struct s_spcl { @@ -73,7 +82,7 @@ union u_spcl { int32_t c_old_ddate; /* date of previous dump */ int32_t c_volume; /* dump volume number */ int32_t c_old_tapea; /* logical block of this record */ - ino_t c_inumber; /* number of inode */ + dump_ino_t c_inumber; /* number of inode */ int32_t c_magic; /* magic number (see above) */ int32_t c_checksum; /* record checksum */ /* diff --git a/include/setjmp.h b/include/setjmp.h index 49d4ed5e8ce..bf03f6fbb43 100644 --- a/include/setjmp.h +++ b/include/setjmp.h @@ -46,16 +46,16 @@ __BEGIN_DECLS #if __BSD_VISIBLE || __XSI_VISIBLE >= 600 void _longjmp(jmp_buf, int) __dead2; -int _setjmp(jmp_buf); +int _setjmp(jmp_buf) __returns_twice; #endif void longjmp(jmp_buf, int) __dead2; #if __BSD_VISIBLE void longjmperror(void); #endif -int setjmp(jmp_buf); +int setjmp(jmp_buf) __returns_twice; #if __BSD_VISIBLE || __POSIX_VISIBLE || __XSI_VISIBLE void siglongjmp(sigjmp_buf, int) __dead2; -int sigsetjmp(sigjmp_buf, int); +int sigsetjmp(sigjmp_buf, int) __returns_twice; #endif __END_DECLS diff --git a/include/stdatomic.h b/include/stdatomic.h index 18769bbfb55..35469e31456 100644 --- a/include/stdatomic.h +++ b/include/stdatomic.h @@ -51,7 +51,7 @@ #if defined(__CLANG_ATOMICS) #define ATOMIC_VAR_INIT(value) (value) -#define atomic_init(obj, value) __atomic_init(obj, value) +#define atomic_init(obj, value) __c11_atomic_init(obj, value) #else #define ATOMIC_VAR_INIT(value) { .__val = (value) } #define atomic_init(obj, value) do { \ @@ -104,7 +104,10 @@ enum memory_order { * 7.17.4 Fences. */ -#if defined(__CLANG_ATOMICS) || defined(__GNUC_ATOMICS) +#ifdef __CLANG_ATOMICS +#define atomic_thread_fence(order) __c11_atomic_thread_fence(order) +#define atomic_signal_fence(order) __c11_atomic_signal_fence(order) +#elif defined(__GNUC_ATOMICS) #define atomic_thread_fence(order) __atomic_thread_fence(order) #define atomic_signal_fence(order) __atomic_signal_fence(order) #else @@ -118,7 +121,7 @@ enum memory_order { #if defined(__CLANG_ATOMICS) #define atomic_is_lock_free(obj) \ - __atomic_is_lock_free(sizeof(obj)) + __c11_atomic_is_lock_free(sizeof(obj)) #elif defined(__GNUC_ATOMICS) #define atomic_is_lock_free(obj) \ __atomic_is_lock_free(sizeof((obj)->__val)) @@ -182,28 +185,28 @@ typedef _Atomic(__uintmax_t) atomic_uintmax_t; #if defined(__CLANG_ATOMICS) #define atomic_compare_exchange_strong_explicit(object, expected, \ desired, success, failure) \ - __atomic_compare_exchange_strong(object, expected, desired, \ + __c11_atomic_compare_exchange_strong(object, expected, desired, \ success, failure) #define atomic_compare_exchange_weak_explicit(object, expected, \ desired, success, failure) \ - __atomic_compare_exchange_weak(object, expected, desired, \ + __c11_atomic_compare_exchange_weak(object, expected, desired, \ success, failure) #define atomic_exchange_explicit(object, desired, order) \ - __atomic_exchange(object, desired, order) + __c11_atomic_exchange(object, desired, order) #define atomic_fetch_add_explicit(object, operand, order) \ - __atomic_fetch_add(object, operand, order) + __c11_atomic_fetch_add(object, operand, order) #define atomic_fetch_and_explicit(object, operand, order) \ - __atomic_fetch_and(object, operand, order) + __c11_atomic_fetch_and(object, operand, order) #define atomic_fetch_or_explicit(object, operand, order) \ - __atomic_fetch_or(object, operand, order) + __c11_atomic_fetch_or(object, operand, order) #define atomic_fetch_sub_explicit(object, operand, order) \ - __atomic_fetch_sub(object, operand, order) + __c11_atomic_fetch_sub(object, operand, order) #define atomic_fetch_xor_explicit(object, operand, order) \ - __atomic_fetch_xor(object, operand, order) + __c11_atomic_fetch_xor(object, operand, order) #define atomic_load_explicit(object, order) \ - __atomic_load(object, order) + __c11_atomic_load(object, order) #define atomic_store_explicit(object, desired, order) \ - __atomic_store(object, desired, order) + __c11_atomic_store(object, desired, order) #elif defined(__GNUC_ATOMICS) #define atomic_compare_exchange_strong_explicit(object, expected, \ desired, success, failure) \ diff --git a/include/unistd.h b/include/unistd.h index 90694ede731..9b2f2ecb997 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -479,7 +479,7 @@ char *getwd(char *); /* obsoleted by getcwd() */ useconds_t ualarm(useconds_t, useconds_t); int usleep(useconds_t); -pid_t vfork(void); +pid_t vfork(void) __returns_twice; #endif #if __BSD_VISIBLE diff --git a/include/wchar.h b/include/wchar.h index 1ebb72f5822..9e8d807c5f2 100644 --- a/include/wchar.h +++ b/include/wchar.h @@ -88,10 +88,8 @@ typedef __wint_t wint_t; #define _WINT_T_DECLARED #endif -#ifndef WCHAR_MIN -#define WCHAR_MIN __INT_MIN -#define WCHAR_MAX __INT_MAX -#endif +#define WCHAR_MIN __WCHAR_MIN +#define WCHAR_MAX __WCHAR_MAX #ifndef WEOF #define WEOF ((wint_t)-1) diff --git a/kerberos5/Makefile.inc b/kerberos5/Makefile.inc index 5dc86c24fdd..51cfe34ec36 100644 --- a/kerberos5/Makefile.inc +++ b/kerberos5/Makefile.inc @@ -46,3 +46,7 @@ CLEANFILES+= ${_ET}.h ${_ET}.c .endfor .endif # defined(SRCS) + +ASN1_COMPILE= asn1_compile +MAKE_ROKEN= make-roken +SLC= slc diff --git a/kerberos5/lib/libasn1/Makefile b/kerberos5/lib/libasn1/Makefile index 529e557f219..94c79db6759 100644 --- a/kerberos5/lib/libasn1/Makefile +++ b/kerberos5/lib/libasn1/Makefile @@ -56,8 +56,6 @@ INCS+= krb5_asn1.h \ digest_asn1.h \ kx509_asn1.h -ASN1_COMPILE= asn1_compile - ${GEN_CMS}: cms.asn1 cms.opt ${ASN1_COMPILE} --one-code-file \ --option-file=${.ALLSRC:M*.opt} ${.ALLSRC:M*.asn1} cms_asn1 diff --git a/kerberos5/lib/libgssapi_krb5/Makefile b/kerberos5/lib/libgssapi_krb5/Makefile index 95a8f203af5..a883c7d4d8a 100644 --- a/kerberos5/lib/libgssapi_krb5/Makefile +++ b/kerberos5/lib/libgssapi_krb5/Makefile @@ -38,8 +38,6 @@ SRCS= 8003.c \ get_mic.c \ gkrb5_err.c \ gkrb5_err.h \ - gsskrb5-private.h \ - gsskrb5_locl.h \ import_name.c \ import_sec_context.c \ indicate_mechs.c \ diff --git a/kerberos5/lib/libgssapi_ntlm/Makefile b/kerberos5/lib/libgssapi_ntlm/Makefile index 7485cfa640f..cfe071677a3 100644 --- a/kerberos5/lib/libgssapi_ntlm/Makefile +++ b/kerberos5/lib/libgssapi_ntlm/Makefile @@ -21,8 +21,6 @@ SRCS= accept_sec_context.c \ export_name.c \ export_sec_context.c \ external.c \ - ntlm.h \ - ntlm-private.h \ import_name.c \ import_sec_context.c \ indicate_mechs.c \ diff --git a/kerberos5/lib/libgssapi_spnego/Makefile b/kerberos5/lib/libgssapi_spnego/Makefile index ddaac089d7a..00d299e32a2 100644 --- a/kerberos5/lib/libgssapi_spnego/Makefile +++ b/kerberos5/lib/libgssapi_spnego/Makefile @@ -13,9 +13,6 @@ SRCS= accept_sec_context.c \ external.c \ init_sec_context.c \ freebsd_compat.c \ - spnego-private.h \ - spnego_locl.h \ - spnego_asn1.h \ ${GEN:S/.x$/.c/:S/.hx$/.h/} \ gss_oid.c @@ -41,8 +38,6 @@ CFLAGS+=-I${KRB5DIR}/lib/roken -I. CLEANFILES= ${GEN} ${GEN:S/.x$/.c/:S/.hx$/.h/} \ spnego_asn1_files spnego_asn1-template.c -ASN1_COMPILE= asn1_compile - ${GEN}: spnego.asn1 spnego.opt ${ASN1_COMPILE} --option-file=${.ALLSRC:M*.opt} \ ${.ALLSRC:M*.asn1} spnego_asn1 diff --git a/kerberos5/lib/libhdb/Makefile b/kerberos5/lib/libhdb/Makefile index 1ee7f88e038..87a72ddef2d 100644 --- a/kerberos5/lib/libhdb/Makefile +++ b/kerberos5/lib/libhdb/Makefile @@ -48,8 +48,6 @@ SRCS= common.c \ hdb-sqlite.c \ hdb-keytab.c \ hdb-mitdb.c \ - hdb_locl.h \ - hdb-private.h \ keys.c \ keytab.c \ mkey.c \ @@ -86,8 +84,6 @@ GEN= asn1_Salt.x \ CLEANFILES= ${GEN} ${GEN:S/.x$/.c/:S/.hx$/.h/} hdb_asn1_files \ hdb_asn1-template.[ch]* -ASN1_COMPILE= asn1_compile - ${GEN}: hdb.asn1 ${ASN1_COMPILE} ${.ALLSRC:M*.asn1} hdb_asn1 diff --git a/kerberos5/lib/libheimbase/Makefile b/kerberos5/lib/libheimbase/Makefile index d3aa0eec7f2..b6a61d0e9e0 100644 --- a/kerberos5/lib/libheimbase/Makefile +++ b/kerberos5/lib/libheimbase/Makefile @@ -9,12 +9,9 @@ INCS= heimbase.h SRCS= \ array.c \ - baselocl.h \ bool.c \ dict.c \ heimbase.c \ - heimbasepriv.h \ - heimqueue.h \ null.c \ number.c \ string.c diff --git a/kerberos5/lib/libheimipcc/Makefile b/kerberos5/lib/libheimipcc/Makefile index c1ad6029d21..adb8f579c53 100644 --- a/kerberos5/lib/libheimipcc/Makefile +++ b/kerberos5/lib/libheimipcc/Makefile @@ -5,8 +5,7 @@ INTERNALLIB= LDADD= -lheimbase -lroken -lpthread DPADD= ${LIBHEIMBASE} ${LIBROKEN} ${LIBPTHREAD} -SRCS= hi_locl.h \ - heim_ipc_types.h \ +SRCS= \ client.c \ common.c diff --git a/kerberos5/lib/libheimipcs/Makefile b/kerberos5/lib/libheimipcs/Makefile index 333480dfcfc..55add1add4e 100644 --- a/kerberos5/lib/libheimipcs/Makefile +++ b/kerberos5/lib/libheimipcs/Makefile @@ -6,8 +6,7 @@ LDADD= -lheimbase -lroken LDFLAGS= -pthread DPADD= ${LIBHEIMBASE} ${LIBROKEN} -SRCS= hi_locl.h \ - heim_ipc_types.h \ +SRCS= \ server.c \ common.c diff --git a/kerberos5/lib/libhx509/Makefile b/kerberos5/lib/libhx509/Makefile index 57c9c18e775..469950a18e7 100644 --- a/kerberos5/lib/libhx509/Makefile +++ b/kerberos5/lib/libhx509/Makefile @@ -176,7 +176,6 @@ INCS= hx509-private.h \ SRCS= ca.c \ cert.c \ - char_map.h \ cms.c \ collector.c \ crypto.c \ @@ -184,12 +183,7 @@ SRCS= ca.c \ error.c \ env.c \ file.c \ - hx509-private.h \ - hx509-protos.h \ - hx509.h \ - hx_locl.h \ sel.c \ - sel.h \ sel-gram.y \ sel-lex.l \ keyset.c \ @@ -205,7 +199,6 @@ SRCS= ca.c \ peer.c \ print.c \ softp11.c \ - ref/pkcs11.h \ req.c \ revoke.c @@ -276,8 +269,6 @@ CLEANFILES= ${GEN} ${GEN:S/.x$/.c/:S/.hx$/.h/} ocsp_asn1_files \ INCS+= ocsp_asn1.h pkcs10_asn1.h crmf_asn1.h -ASN1_COMPILE= asn1_compile - ${GEN_OCSP}: ocsp.asn1 ocsp.opt ${ASN1_COMPILE} --option-file=${.ALLSRC:M*.opt} \ ${.ALLSRC:M*.asn1} ocsp_asn1 diff --git a/kerberos5/lib/libkadm5clnt/Makefile b/kerberos5/lib/libkadm5clnt/Makefile index 31030be5ed4..c413b5d3cac 100644 --- a/kerberos5/lib/libkadm5clnt/Makefile +++ b/kerberos5/lib/libkadm5clnt/Makefile @@ -26,17 +26,14 @@ SRCS= ad.c \ get_c.c \ get_princs_c.c \ init_c.c \ - kadm5_locl.h \ kadm5_err.c \ kadm5_err.h \ marshall.c \ modify_c.c \ - private.h \ privs_c.c \ randkey_c.c \ rename_c.c \ - send_recv.c \ - admin.h + send_recv.c CFLAGS+=-I${KRB5DIR}/lib/kadm5 -I${KRB5DIR}/lib/asn1 -I${KRB5DIR}/lib/roken -I. diff --git a/kerberos5/lib/libkadm5srv/Makefile b/kerberos5/lib/libkadm5srv/Makefile index 16322804c36..5c3a1916880 100644 --- a/kerberos5/lib/libkadm5srv/Makefile +++ b/kerberos5/lib/libkadm5srv/Makefile @@ -8,8 +8,6 @@ VERSION_MAP= ${KRB5DIR}/lib/kadm5/version-script.map MAN= kadm5_pwcheck.3 SRCS= acl.c \ - admin.h \ - admin.h \ bump_pw_expire.c \ chpass_s.c \ common_glue.c \ @@ -26,13 +24,11 @@ SRCS= acl.c \ init_s.c \ kadm5_err.c \ kadm5_err.h \ - kadm5_locl.h \ keys.c \ log.c \ marshall.c \ modify_s.c \ password_quality.c \ - private.h \ privs_s.c \ randkey_s.c \ rename_s.c \ diff --git a/kerberos5/lib/libkafs5/Makefile b/kerberos5/lib/libkafs5/Makefile index d1faae7708b..3d3326bd617 100644 --- a/kerberos5/lib/libkafs5/Makefile +++ b/kerberos5/lib/libkafs5/Makefile @@ -26,10 +26,8 @@ MLINKS= kafs5.3 k_afs_cell_of_file.3 \ SRCS= afssys.c afskrb5.c common.c krb5_err.h SRCS= afssys.c \ afskrb5.c \ - common.c \ - kafs_locl.h \ - afssysdefs.h \ - roken_rename.h + common.c + CFLAGS+= -I${KRB5DIR}/lib/kafs \ -I${KRB5DIR}/lib/krb5 \ -I${.OBJDIR}/../libkrb5/ \ diff --git a/kerberos5/lib/libkdc/Makefile b/kerberos5/lib/libkdc/Makefile index 385f160aee2..fa9792da08b 100644 --- a/kerberos5/lib/libkdc/Makefile +++ b/kerberos5/lib/libkdc/Makefile @@ -14,12 +14,10 @@ KRB5INCS= windc_plugin.h KRB5INCSDIR= ${INCLUDEDIR}/krb5 INCSGROUPS= INCS KRB5INCS -SRCS= kdc-private.h \ - kdc-protos.h \ +SRCS= \ default_config.c \ set_dbinfo.c \ digest.c \ - kdc_locl.h\ kerberos5.c \ krb5tgs.c \ pkinit.c \ @@ -27,8 +25,7 @@ SRCS= kdc-private.h \ misc.c \ kx509.c \ process.c \ - windc.c \ - rx.h + windc.c CFLAGS+= -I${KRB5DIR}/lib/roken \ -I${KRB5DIR}/lib/krb5 \ diff --git a/kerberos5/lib/libkrb5/Makefile b/kerberos5/lib/libkrb5/Makefile index f53e4d0a1bb..fbd993095dd 100644 --- a/kerberos5/lib/libkrb5/Makefile +++ b/kerberos5/lib/libkrb5/Makefile @@ -531,7 +531,6 @@ SRCS= acache.c \ crypto-pk.c \ crypto-rand.c \ crypto.c \ - crypto.h \ data.c \ deprecated.c \ digest.c \ @@ -562,8 +561,6 @@ SRCS= acache.c \ keytab_file.c \ keytab_keyfile.c \ keytab_memory.c \ - krb5-v4compat.h \ - krb5_locl.h \ krbhst.c \ kuserok.c \ log.c \ diff --git a/kerberos5/lib/libroken/Makefile b/kerberos5/lib/libroken/Makefile index 29e3082cc59..cf9368bbf3e 100644 --- a/kerberos5/lib/libroken/Makefile +++ b/kerberos5/lib/libroken/Makefile @@ -82,8 +82,6 @@ CFLAGS+=-I${KRB5DIR}/lib/roken -I. CLEANFILES= roken.h -MAKE_ROKEN= make-roken - roken.h: ${MAKE_ROKEN} > ${.TARGET} diff --git a/kerberos5/lib/libvers/Makefile b/kerberos5/lib/libvers/Makefile index 36dff0d0bcc..cef5a88a746 100644 --- a/kerberos5/lib/libvers/Makefile +++ b/kerberos5/lib/libvers/Makefile @@ -5,9 +5,7 @@ INTERNALLIB= SRCS= print_version.c roken.h CFLAGS+=-I. -I${KRB5DIR}/lib/roken -CLEANFILES= roken.h print_version.h - -MAKE_ROKEN= make-roken +CLEANFILES= roken.h roken.h: ${MAKE_ROKEN} > ${.TARGET} diff --git a/kerberos5/libexec/hprop/Makefile b/kerberos5/libexec/hprop/Makefile index 421d5a2af9b..ac1dffa81a6 100644 --- a/kerberos5/libexec/hprop/Makefile +++ b/kerberos5/libexec/hprop/Makefile @@ -2,7 +2,7 @@ PROG= hprop MAN= hprop.8 -SRCS= hprop.c mit_dump.c hprop.h +SRCS= hprop.c mit_dump.c CFLAGS+=-I${KRB5DIR}/lib/roken CFLAGS+=-I${KRB5DIR}/lib/krb5 CFLAGS+=-I${KRB5DIR}/lib/asn1 diff --git a/kerberos5/libexec/kadmind/Makefile b/kerberos5/libexec/kadmind/Makefile index 418fbdde232..f88ac2f1b33 100644 --- a/kerberos5/libexec/kadmind/Makefile +++ b/kerberos5/libexec/kadmind/Makefile @@ -5,7 +5,6 @@ MAN= kadmind.8 SRCS= rpc.c \ server.c \ kadmind.c \ - kadmin_locl.h \ kadm_conn.c CFLAGS+=-I${KRB5DIR}/lib/krb5 -I${KRB5DIR}/lib/asn1 -I${KRB5DIR}/lib/roken \ diff --git a/kerberos5/libexec/kcm/Makefile b/kerberos5/libexec/kcm/Makefile index 233cf8a030d..2643b83b690 100644 --- a/kerberos5/libexec/kcm/Makefile +++ b/kerberos5/libexec/kcm/Makefile @@ -11,9 +11,6 @@ SRCS= acl.c \ connect.c \ events.c \ glue.c \ - headers.h \ - kcm_locl.h \ - kcm-protos.h \ log.c \ main.c \ protocol.c \ diff --git a/kerberos5/libexec/kdigest/Makefile b/kerberos5/libexec/kdigest/Makefile index 208b021fcb7..c88e3b990f0 100644 --- a/kerberos5/libexec/kdigest/Makefile +++ b/kerberos5/libexec/kdigest/Makefile @@ -13,8 +13,12 @@ SRCS= kdigest.c \ kdigest-commands.c \ kdigest-commands.h -kdigest-commands.c kdigest-commands.h: kdigest-commands.in - slc ${.ALLSRC:M*.in} +kdigest-commands.h: kdigest-commands.in + ${SLC} ${.ALLSRC:M*.in} + +.for ext in c o +kdigest-commands.${ext}: kdigest-commands.h +.endfor .include diff --git a/kerberos5/libexec/kfd/Makefile b/kerberos5/libexec/kfd/Makefile index da9c70946d7..f5081f18bed 100644 --- a/kerberos5/libexec/kfd/Makefile +++ b/kerberos5/libexec/kfd/Makefile @@ -2,7 +2,6 @@ PROG= kfd MAN= kfd.8 -SRCS= kfd.c kf_locl.h CFLAGS+= -I${KRB5DIR}/lib/asn1 \ -I${KRB5DIR}/lib/roken DPADD= ${LIBKRB5} ${LIBROKEN} ${LIBASN1} ${LIBCRYPTO} \ diff --git a/kerberos5/tools/asn1_compile/Makefile b/kerberos5/tools/asn1_compile/Makefile index fa325c10c87..94174c4e637 100644 --- a/kerberos5/tools/asn1_compile/Makefile +++ b/kerberos5/tools/asn1_compile/Makefile @@ -6,9 +6,8 @@ LIBROKEN_A= ${.OBJDIR}/../../lib/libroken/libroken.a LDADD= ${LIBROKEN_A} ${LIBVERS} DPADD= ${LIBROKEN_A} ${LIBVERS} -SRCS= asn1_queue.h \ +SRCS= \ asn1parse.y \ - der.h \ gen.c \ gen_copy.c \ gen_decode.c \ @@ -16,18 +15,13 @@ SRCS= asn1_queue.h \ gen_free.c \ gen_glue.c \ gen_length.c \ - gen_locl.h \ gen_seq.c \ gen_template.c \ hash.c \ - hash.h \ lex.l \ - lex.h \ main.c \ - asn1-template.h \ roken.h \ - symbol.c \ - symbol.h + symbol.c CFLAGS+=-I${KRB5DIR}/lib/roken -I${KRB5DIR}/lib/asn1 -I. diff --git a/kerberos5/tools/slc/Makefile b/kerberos5/tools/slc/Makefile index c6f0d35c98e..6e909d97761 100644 --- a/kerberos5/tools/slc/Makefile +++ b/kerberos5/tools/slc/Makefile @@ -15,7 +15,7 @@ CFLAGS+=-I${KRB5DIR}/lib/roken -I${KRB5DIR}/lib/sl -I${KRB5DIR}/lib/vers -I. CLEANFILES= roken.h roken.h: - make-roken > ${.TARGET} + ${MAKE_ROKEN} > ${.TARGET} # ${.OBJDIR}/../make-roken/make-roken > ${.TARGET} diff --git a/kerberos5/usr.bin/hxtool/Makefile b/kerberos5/usr.bin/hxtool/Makefile index c40f009380f..c8ebf9a8951 100644 --- a/kerberos5/usr.bin/hxtool/Makefile +++ b/kerberos5/usr.bin/hxtool/Makefile @@ -10,8 +10,12 @@ DPADD= ${LIBHX509} ${LIBROKEN} ${LIBASN1} ${LIBCRYPTO} ${LIBCRYPT} ${LIBSL} ${LI LDADD= -lhx509 -lroken -lasn1 -lcrypto -lcrypt ${LIBSL} ${LIBVERS} -ledit SRCS= hxtool.c hxtool-commands.c hxtool-commands.h -hxtool-commands.c hxtool-commands.h: hxtool-commands.in - slc ${.ALLSRC:M*.in} +hxtool-commands.h: hxtool-commands.in + ${SLC} ${.ALLSRC:M*.in} + +.for ext in c o +hxtool-commands.${ext}: hxtool-commands.h +.endfor .include diff --git a/kerberos5/usr.bin/kadmin/Makefile b/kerberos5/usr.bin/kadmin/Makefile index d0f8ed19000..c04ad360adb 100644 --- a/kerberos5/usr.bin/kadmin/Makefile +++ b/kerberos5/usr.bin/kadmin/Makefile @@ -38,8 +38,12 @@ LDFLAGS=${LDAPLDFLAGS} .include -kadmin-commands.c kadmin-commands.h: ${KRB5DIR}/kadmin/kadmin-commands.in - slc ${.ALLSRC:M*.in} +kadmin-commands.h: ${KRB5DIR}/kadmin/kadmin-commands.in + ${SLC} ${.ALLSRC:M*.in} + +.for ext in o c +kadmin-commands.${ext}: kadmin-commands.h +.endfor .PATH: ${KRB5DIR}/kadmin diff --git a/kerberos5/usr.bin/kcc/Makefile b/kerberos5/usr.bin/kcc/Makefile index d690b32fe4c..3da43d7a35b 100644 --- a/kerberos5/usr.bin/kcc/Makefile +++ b/kerberos5/usr.bin/kcc/Makefile @@ -19,8 +19,12 @@ SRCS= kcc.c \ kswitch.c \ copy_cred_cache.c -kcc-commands.c kcc-commands.h: kcc-commands.in - slc ${.ALLSRC:M*.in} +kcc-commands.h: kcc-commands.in + ${SLC} ${.ALLSRC:M*.in} + +.for ext in c o +kcc-commands.${ext}: kcc-commands.h +.endfor .include diff --git a/kerberos5/usr.bin/kf/Makefile b/kerberos5/usr.bin/kf/Makefile index 0a1ccec20fe..c9d3fceb14f 100644 --- a/kerberos5/usr.bin/kf/Makefile +++ b/kerberos5/usr.bin/kf/Makefile @@ -2,7 +2,6 @@ PROG= kf MAN= kf.1 -SRCS= kf.c kf_locl.h CFLAGS+= -I${KRB5DIR}/lib/asn1 \ -I${KRB5DIR}/lib/roken DPADD= ${LIBKRB5} ${LIBROKEN} ${LIBASN1} ${LIBCRYPTO} \ diff --git a/kerberos5/usr.bin/string2key/Makefile b/kerberos5/usr.bin/string2key/Makefile index 25204fd3a12..fc790e24dd8 100644 --- a/kerberos5/usr.bin/string2key/Makefile +++ b/kerberos5/usr.bin/string2key/Makefile @@ -10,7 +10,6 @@ CFLAGS+= -I${KRB5DIR}/kdc \ DPADD= ${LIBHDB} ${LIBKRB5} ${LIBROKEN} ${LIBASN1} ${LIBCRYPTO} \ ${LIBCRYPT} ${LIBVERS} LDADD= -lhdb -lkrb5 -lroken -lasn1 -lcrypto -lcrypt ${LIBVERS} -SRCS= string2key.c headers.h .include diff --git a/kerberos5/usr.sbin/iprop-log/Makefile b/kerberos5/usr.sbin/iprop-log/Makefile index dbe269a8b54..176012a9e7d 100644 --- a/kerberos5/usr.sbin/iprop-log/Makefile +++ b/kerberos5/usr.sbin/iprop-log/Makefile @@ -13,8 +13,12 @@ DPADD= ${LIBKADM5SRV} ${LIBHDB} ${LIBKRB5} ${LIBASN1} ${LIBCRYPTO} \ LDADD= -lkadm5srv -lhdb -lkrb5 -lasn1 -lcrypto -lcrypt ${LIBSL} -lroken \ ${LIBVERS} -ledit -iprop-commands.c iprop-commands.h: iprop-commands.in - slc ${.ALLSRC:M*.in} +iprop-commands.h: iprop-commands.in + ${SLC} ${.ALLSRC:M*.in} + +.for ext in c o +iprop-commands.${ext}: iprop-commands.h +.endfor .include diff --git a/kerberos5/usr.sbin/ktutil/Makefile b/kerberos5/usr.sbin/ktutil/Makefile index 900d9213610..f7d340f78e9 100644 --- a/kerberos5/usr.sbin/ktutil/Makefile +++ b/kerberos5/usr.sbin/ktutil/Makefile @@ -9,7 +9,6 @@ SRCS= add.c \ destroy.c \ get.c \ ktutil.c \ - ktutil_locl.h \ ktutil-commands.c \ ktutil-commands.h \ list.c \ @@ -25,7 +24,11 @@ LDADD= -lkadm5clnt -lkrb5 ${LIBSL} -lroken ${LIBVERS} \ .include -ktutil-commands.c ktutil-commands.h: ${KRB5DIR}/admin/ktutil-commands.in - slc ${.ALLSRC:M*.in} +ktutil-commands.h: ${KRB5DIR}/admin/ktutil-commands.in + ${SLC} ${.ALLSRC:M*.in} + +.for ext in c o +ktutil-commands.${ext}: ktutil-commands.h +.endfor .PATH: ${KRB5DIR}/admin diff --git a/lib/Makefile b/lib/Makefile index 0c47d087d87..989ea23c8f4 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -88,6 +88,7 @@ SUBDIR= ${SUBDIR_ORDERED} \ libmemstat \ ${_libmilter} \ ${_libmp} \ + ${_libnandfs} \ ${_libncp} \ ${_libngatm} \ libopie \ @@ -104,6 +105,7 @@ SUBDIR= ${SUBDIR_ORDERED} \ ${_libsmdb} \ ${_libsmutil} \ libstand \ + libstdbuf \ libstdthreads \ ${_libtelnet} \ ${_libthr} \ @@ -175,6 +177,10 @@ _libipx= libipx _libthr= libthr .endif +.if ${MK_NAND} != "no" +_libnandfs= libnandfs +.endif + .if ${MK_NETGRAPH} != "no" _libnetgraph= libnetgraph .endif diff --git a/lib/bind/dns/code.h b/lib/bind/dns/code.h index ad9e11e54f9..a451eeb0303 100644 --- a/lib/bind/dns/code.h +++ b/lib/bind/dns/code.h @@ -83,6 +83,7 @@ #include "rdata/in_1/dhcid_49.c" #include "rdata/generic/nsec3_50.c" #include "rdata/generic/nsec3param_51.c" +#include "rdata/generic/tlsa_52.c" #include "rdata/generic/hip_55.c" #include "rdata/generic/spf_99.c" #include "rdata/generic/unspec_103.c" @@ -192,6 +193,7 @@ break; \ case 50: result = fromtext_nsec3(rdclass, type, lexer, origin, options, target, callbacks); break; \ case 51: result = fromtext_nsec3param(rdclass, type, lexer, origin, options, target, callbacks); break; \ + case 52: result = fromtext_tlsa(rdclass, type, lexer, origin, options, target, callbacks); break; \ case 55: result = fromtext_hip(rdclass, type, lexer, origin, options, target, callbacks); break; \ case 99: result = fromtext_spf(rdclass, type, lexer, origin, options, target, callbacks); break; \ case 103: result = fromtext_unspec(rdclass, type, lexer, origin, options, target, callbacks); break; \ @@ -305,6 +307,7 @@ break; \ case 50: result = totext_nsec3(rdata, tctx, target); break; \ case 51: result = totext_nsec3param(rdata, tctx, target); break; \ + case 52: result = totext_tlsa(rdata, tctx, target); break; \ case 55: result = totext_hip(rdata, tctx, target); break; \ case 99: result = totext_spf(rdata, tctx, target); break; \ case 103: result = totext_unspec(rdata, tctx, target); break; \ @@ -418,6 +421,7 @@ break; \ case 50: result = fromwire_nsec3(rdclass, type, source, dctx, options, target); break; \ case 51: result = fromwire_nsec3param(rdclass, type, source, dctx, options, target); break; \ + case 52: result = fromwire_tlsa(rdclass, type, source, dctx, options, target); break; \ case 55: result = fromwire_hip(rdclass, type, source, dctx, options, target); break; \ case 99: result = fromwire_spf(rdclass, type, source, dctx, options, target); break; \ case 103: result = fromwire_unspec(rdclass, type, source, dctx, options, target); break; \ @@ -531,6 +535,7 @@ break; \ case 50: result = towire_nsec3(rdata, cctx, target); break; \ case 51: result = towire_nsec3param(rdata, cctx, target); break; \ + case 52: result = towire_tlsa(rdata, cctx, target); break; \ case 55: result = towire_hip(rdata, cctx, target); break; \ case 99: result = towire_spf(rdata, cctx, target); break; \ case 103: result = towire_unspec(rdata, cctx, target); break; \ @@ -644,6 +649,7 @@ break; \ case 50: result = compare_nsec3(rdata1, rdata2); break; \ case 51: result = compare_nsec3param(rdata1, rdata2); break; \ + case 52: result = compare_tlsa(rdata1, rdata2); break; \ case 55: result = compare_hip(rdata1, rdata2); break; \ case 99: result = compare_spf(rdata1, rdata2); break; \ case 103: result = compare_unspec(rdata1, rdata2); break; \ @@ -757,6 +763,7 @@ break; \ case 50: result = casecompare_nsec3(rdata1, rdata2); break; \ case 51: result = casecompare_nsec3param(rdata1, rdata2); break; \ + case 52: result = casecompare_tlsa(rdata1, rdata2); break; \ case 55: result = casecompare_hip(rdata1, rdata2); break; \ case 99: result = casecompare_spf(rdata1, rdata2); break; \ case 103: result = casecompare_unspec(rdata1, rdata2); break; \ @@ -870,6 +877,7 @@ break; \ case 50: result = fromstruct_nsec3(rdclass, type, source, target); break; \ case 51: result = fromstruct_nsec3param(rdclass, type, source, target); break; \ + case 52: result = fromstruct_tlsa(rdclass, type, source, target); break; \ case 55: result = fromstruct_hip(rdclass, type, source, target); break; \ case 99: result = fromstruct_spf(rdclass, type, source, target); break; \ case 103: result = fromstruct_unspec(rdclass, type, source, target); break; \ @@ -983,6 +991,7 @@ break; \ case 50: result = tostruct_nsec3(rdata, target, mctx); break; \ case 51: result = tostruct_nsec3param(rdata, target, mctx); break; \ + case 52: result = tostruct_tlsa(rdata, target, mctx); break; \ case 55: result = tostruct_hip(rdata, target, mctx); break; \ case 99: result = tostruct_spf(rdata, target, mctx); break; \ case 103: result = tostruct_unspec(rdata, target, mctx); break; \ @@ -1096,6 +1105,7 @@ break; \ case 50: freestruct_nsec3(source); break; \ case 51: freestruct_nsec3param(source); break; \ + case 52: freestruct_tlsa(source); break; \ case 55: freestruct_hip(source); break; \ case 99: freestruct_spf(source); break; \ case 103: freestruct_unspec(source); break; \ @@ -1209,6 +1219,7 @@ break; \ case 50: result = additionaldata_nsec3(rdata, add, arg); break; \ case 51: result = additionaldata_nsec3param(rdata, add, arg); break; \ + case 52: result = additionaldata_tlsa(rdata, add, arg); break; \ case 55: result = additionaldata_hip(rdata, add, arg); break; \ case 99: result = additionaldata_spf(rdata, add, arg); break; \ case 103: result = additionaldata_unspec(rdata, add, arg); break; \ @@ -1322,6 +1333,7 @@ break; \ case 50: result = digest_nsec3(rdata, digest, arg); break; \ case 51: result = digest_nsec3param(rdata, digest, arg); break; \ + case 52: result = digest_tlsa(rdata, digest, arg); break; \ case 55: result = digest_hip(rdata, digest, arg); break; \ case 99: result = digest_spf(rdata, digest, arg); break; \ case 103: result = digest_unspec(rdata, digest, arg); break; \ @@ -1435,6 +1447,7 @@ break; \ case 50: result = checkowner_nsec3(name, rdclass, type, wildcard); break; \ case 51: result = checkowner_nsec3param(name, rdclass, type, wildcard); break; \ + case 52: result = checkowner_tlsa(name, rdclass, type, wildcard); break; \ case 55: result = checkowner_hip(name, rdclass, type, wildcard); break; \ case 99: result = checkowner_spf(name, rdclass, type, wildcard); break; \ case 103: result = checkowner_unspec(name, rdclass, type, wildcard); break; \ @@ -1548,6 +1561,7 @@ break; \ case 50: result = checknames_nsec3(rdata, owner, bad); break; \ case 51: result = checknames_nsec3param(rdata, owner, bad); break; \ + case 52: result = checknames_tlsa(rdata, owner, bad); break; \ case 55: result = checknames_hip(rdata, owner, bad); break; \ case 99: result = checknames_spf(rdata, owner, bad); break; \ case 103: result = checknames_unspec(rdata, owner, bad); break; \ @@ -1718,6 +1732,9 @@ case 233: \ RDATATYPE_COMPARE("nsec3", 50, _typename, _length, _typep); \ break; \ + case 120: \ + RDATATYPE_COMPARE("tlsa", 52, _typename, _length, _typep); \ + break; \ case 208: \ RDATATYPE_COMPARE("hip", 55, _typename, _length, _typep); \ break; \ @@ -1806,6 +1823,7 @@ case 49: return (RRTYPE_DHCID_ATTRIBUTES); \ case 50: return (RRTYPE_NSEC3_ATTRIBUTES); \ case 51: return (RRTYPE_NSEC3PARAM_ATTRIBUTES); \ + case 52: return (RRTYPE_TLSA_ATTRIBUTES); \ case 55: return (RRTYPE_HIP_ATTRIBUTES); \ case 99: return (RRTYPE_SPF_ATTRIBUTES); \ case 100: return (DNS_RDATATYPEATTR_RESERVED); \ @@ -1875,6 +1893,7 @@ case 49: return (str_totext("DHCID", target)); \ case 50: return (str_totext("NSEC3", target)); \ case 51: return (str_totext("NSEC3PARAM", target)); \ + case 52: return (str_totext("TLSA", target)); \ case 55: return (str_totext("HIP", target)); \ case 99: return (str_totext("SPF", target)); \ case 100: return (str_totext("UINFO", target)); \ diff --git a/lib/bind/dns/dns/enumtype.h b/lib/bind/dns/dns/enumtype.h index bc64f69a3bd..4c9a2f9b57f 100644 --- a/lib/bind/dns/dns/enumtype.h +++ b/lib/bind/dns/dns/enumtype.h @@ -78,6 +78,7 @@ enum { dns_rdatatype_dhcid = 49, dns_rdatatype_nsec3 = 50, dns_rdatatype_nsec3param = 51, + dns_rdatatype_tlsa = 52, dns_rdatatype_hip = 55, dns_rdatatype_spf = 99, dns_rdatatype_unspec = 103, @@ -140,6 +141,7 @@ enum { #define dns_rdatatype_dhcid ((dns_rdatatype_t)dns_rdatatype_dhcid) #define dns_rdatatype_nsec3 ((dns_rdatatype_t)dns_rdatatype_nsec3) #define dns_rdatatype_nsec3param ((dns_rdatatype_t)dns_rdatatype_nsec3param) +#define dns_rdatatype_tlsa ((dns_rdatatype_t)dns_rdatatype_tlsa) #define dns_rdatatype_hip ((dns_rdatatype_t)dns_rdatatype_hip) #define dns_rdatatype_spf ((dns_rdatatype_t)dns_rdatatype_spf) #define dns_rdatatype_unspec ((dns_rdatatype_t)dns_rdatatype_unspec) diff --git a/lib/bind/dns/dns/rdatastruct.h b/lib/bind/dns/dns/rdatastruct.h index 4b50b575e33..9504fa8c79c 100644 --- a/lib/bind/dns/dns/rdatastruct.h +++ b/lib/bind/dns/dns/rdatastruct.h @@ -1839,6 +1839,41 @@ typedef struct dns_rdata_nsec3param { } dns_rdata_nsec3param_t; #endif /* GENERIC_NSEC3PARAM_51_H */ +/* + * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id$ */ + +#ifndef GENERIC_TLSA_52_H +#define GENERIC_TLSA_52_H 1 + +/*! + * \brief per draft-ietf-dane-protocol-19.txt + */ +typedef struct dns_rdata_tlsa { + dns_rdatacommon_t common; + isc_mem_t *mctx; + isc_uint8_t usage; + isc_uint8_t selector; + isc_uint8_t match; + isc_uint16_t length; + unsigned char *data; +} dns_rdata_tlsa_t; + +#endif /* GENERIC_TLSA_52_H */ /* * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") * diff --git a/lib/clang/Makefile b/lib/clang/Makefile index d6e9457895b..2d77383b431 100644 --- a/lib/clang/Makefile +++ b/lib/clang/Makefile @@ -12,7 +12,6 @@ SUBDIR= libclanganalysis \ libclangedit \ libclangfrontend \ libclangfrontendtool \ - libclangindex \ libclanglex \ libclangparse \ libclangrewrite \ diff --git a/lib/clang/clang.build.mk b/lib/clang/clang.build.mk index a14918dc5e6..67868f1e40a 100644 --- a/lib/clang/clang.build.mk +++ b/lib/clang/clang.build.mk @@ -25,9 +25,7 @@ LLVM_REQUIRES_RTTI= CXXFLAGS+=-fno-rtti .endif -.ifdef TOOLS_PREFIX -CFLAGS+=-DCLANG_PREFIX=\"${TOOLS_PREFIX}\" -.endif +CFLAGS+=-DDEFAULT_SYSROOT=\"${TOOLS_PREFIX}\" .PATH: ${LLVM_SRCS}/${SRCDIR} diff --git a/lib/clang/include/Makefile b/lib/clang/include/Makefile index 73a6120c2cd..05b43cf5197 100644 --- a/lib/clang/include/Makefile +++ b/lib/clang/include/Makefile @@ -5,17 +5,23 @@ INCSDIR=${INCLUDEDIR}/clang/3.1 INCS= altivec.h \ + avx2intrin.h \ avxintrin.h \ + bmi2intrin.h \ + bmiintrin.h \ cpuid.h \ emmintrin.h \ + fma4intrin.h \ immintrin.h \ + lzcntintrin.h \ mm3dnow.h \ mm_malloc.h \ mmintrin.h \ + module.map \ nmmintrin.h \ pmmintrin.h \ + popcntintrin.h \ smmintrin.h \ - stdalign.h \ tmmintrin.h \ unwind.h \ wmmintrin.h \ diff --git a/lib/clang/include/clang/Basic/Version.inc b/lib/clang/include/clang/Basic/Version.inc index 55d4ea6cfd9..b263857a383 100644 --- a/lib/clang/include/clang/Basic/Version.inc +++ b/lib/clang/include/clang/Basic/Version.inc @@ -5,6 +5,6 @@ #define CLANG_VERSION_MINOR 1 #define CLANG_VENDOR "FreeBSD " -#define CLANG_VENDOR_SUFFIX " 20120413" +#define CLANG_VENDOR_SUFFIX " 20120523" -#define SVN_REVISION "154661" +#define SVN_REVISION "156863" diff --git a/lib/clang/include/clang/Config/config.h b/lib/clang/include/clang/Config/config.h index 7348308e3a5..8a7936b947f 100644 --- a/lib/clang/include/clang/Config/config.h +++ b/lib/clang/include/clang/Config/config.h @@ -11,10 +11,16 @@ /* Relative directory for resource files */ #define CLANG_RESOURCE_DIR "" -/* Directory where gcc is installed. */ -#define GCC_INSTALL_PREFIX "" - /* Directories clang will search for headers */ #define C_INCLUDE_DIRS "" +/* Linker version detected at compile time. */ +/* #undef HOST_LINK_VERSION */ + +/* Default to all compiler invocations for --sysroot=. */ +/* #undef DEFAULT_SYSROOT */ + +/* Directory where gcc is installed. */ +#define GCC_INSTALL_PREFIX "" + #endif diff --git a/lib/clang/include/llvm/Config/config.h b/lib/clang/include/llvm/Config/config.h index f6001e9be80..90bee6e6947 100644 --- a/lib/clang/include/llvm/Config/config.h +++ b/lib/clang/include/llvm/Config/config.h @@ -14,6 +14,9 @@ /* Directories clang will search for headers */ #define C_INCLUDE_DIRS "" +/* Default to all compiler invocations for --sysroot=. */ +/* #undef DEFAULT_SYSROOT */ + /* Define if position independent code is enabled */ #define ENABLE_PIC 0 @@ -660,13 +663,13 @@ #define PACKAGE_NAME "LLVM" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "LLVM 3.1svn" +#define PACKAGE_STRING "LLVM 3.1" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "llvm" /* Define to the version of this package. */ -#define PACKAGE_VERSION "3.1svn" +#define PACKAGE_VERSION "3.1" /* Define as the return type of signal handlers (`int' or `void'). */ #define RETSIGTYPE void diff --git a/lib/clang/libclangindex/Makefile b/lib/clang/libclangindex/Makefile deleted file mode 100644 index 63b532c83ba..00000000000 --- a/lib/clang/libclangindex/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# $FreeBSD$ - -LIB= clangindex - -SRCDIR= tools/clang/lib/Index -SRCS= ASTLocation.cpp \ - Analyzer.cpp \ - DeclReferenceMap.cpp \ - Entity.cpp \ - GlobalSelector.cpp \ - Handlers.cpp \ - IndexProvider.cpp \ - Indexer.cpp \ - Program.cpp \ - SelectorMap.cpp \ - -TGHDRS= AttrList \ - Attrs \ - DeclNodes \ - DiagnosticCommonKinds \ - StmtNodes - -.include "../clang.lib.mk" diff --git a/lib/clang/libclangsema/Makefile b/lib/clang/libclangsema/Makefile index e40a756f33f..3b2b331ef3c 100644 --- a/lib/clang/libclangsema/Makefile +++ b/lib/clang/libclangsema/Makefile @@ -36,6 +36,7 @@ SRCS= AnalysisBasedWarnings.cpp \ SemaOverload.cpp \ SemaPseudoObject.cpp \ SemaStmt.cpp \ + SemaStmtAttr.cpp \ SemaTemplate.cpp \ SemaTemplateDeduction.cpp \ SemaTemplateInstantiate.cpp \ diff --git a/lib/clang/libllvmruntimedyld/Makefile b/lib/clang/libllvmruntimedyld/Makefile index 7280e1d3413..d5d5447e8e9 100644 --- a/lib/clang/libllvmruntimedyld/Makefile +++ b/lib/clang/libllvmruntimedyld/Makefile @@ -3,7 +3,8 @@ LIB= llvmruntimedyld SRCDIR= lib/ExecutionEngine/RuntimeDyld -SRCS= RuntimeDyld.cpp \ +SRCS= GDBRegistrar.cpp \ + RuntimeDyld.cpp \ RuntimeDyldELF.cpp \ RuntimeDyldMachO.cpp diff --git a/lib/clang/libllvmsupport/Makefile b/lib/clang/libllvmsupport/Makefile index 19afb44d92d..5fcff88dd82 100644 --- a/lib/clang/libllvmsupport/Makefile +++ b/lib/clang/libllvmsupport/Makefile @@ -30,6 +30,7 @@ SRCS= APFloat.cpp \ IntervalMap.cpp \ IntEqClasses.cpp \ IntrusiveRefCntPtr.cpp \ + Locale.cpp \ LockFileManager.cpp \ ManagedStatic.cpp \ Memory.cpp \ diff --git a/lib/libbluetooth/bluetooth.3 b/lib/libbluetooth/bluetooth.3 index aa738d4be7e..e011094a18c 100644 --- a/lib/libbluetooth/bluetooth.3 +++ b/lib/libbluetooth/bluetooth.3 @@ -494,7 +494,8 @@ previously obtained with .Xr bt_devopen 3 . Filtering can be done on packet types, i.e. .Dv ACL , -.Dv SCO or +.Dv SCO +or .Dv HCI , command and event packets, and, in addition, on .Dv HCI diff --git a/lib/libc++/Makefile b/lib/libc++/Makefile index fc35ea5369a..1c65cc38568 100644 --- a/lib/libc++/Makefile +++ b/lib/libc++/Makefile @@ -1,156 +1,163 @@ # $FreeBSD$ -LIBCXXRTDIR= ${.CURDIR}/../../contrib/libcxxrt -HDRDIR= ${.CURDIR}/../../contrib/libc++/include -SRCDIR= ${.CURDIR}/../../contrib/libc++/src -CXXINCLUDEDIR= ${INCLUDEDIR}/c++/v${SHLIB_MAJOR} +LIBCXXRTDIR= ${.CURDIR}/../../contrib/libcxxrt +HDRDIR= ${.CURDIR}/../../contrib/libc++/include +SRCDIR= ${.CURDIR}/../../contrib/libc++/src +CXXINCLUDEDIR= ${INCLUDEDIR}/c++/v${SHLIB_MAJOR} .PATH: ${SRCDIR} -LIB= c++ -SHLIB_MAJOR= 1 +LIB= c++ +SHLIB_MAJOR= 1 -SRCS+= algorithm.cpp\ - bind.cpp\ - chrono.cpp\ - condition_variable.cpp\ - debug.cpp\ - exception.cpp\ - future.cpp\ - hash.cpp\ - ios.cpp\ - iostream.cpp\ - locale.cpp\ - memory.cpp\ - mutex.cpp\ - new.cpp\ - random.cpp\ - regex.cpp\ - stdexcept.cpp\ - string.cpp\ - strstream.cpp\ - system_error.cpp\ - thread.cpp\ - typeinfo.cpp\ - utility.cpp\ - valarray.cpp +SRCS+= algorithm.cpp\ + bind.cpp\ + chrono.cpp\ + condition_variable.cpp\ + debug.cpp\ + exception.cpp\ + future.cpp\ + hash.cpp\ + ios.cpp\ + iostream.cpp\ + locale.cpp\ + memory.cpp\ + mutex.cpp\ + new.cpp\ + random.cpp\ + regex.cpp\ + stdexcept.cpp\ + string.cpp\ + strstream.cpp\ + system_error.cpp\ + thread.cpp\ + typeinfo.cpp\ + utility.cpp\ + valarray.cpp -WARNS= 0 -CXXFLAGS+= -I${HDRDIR} -I${LIBCXXRTDIR} -std=c++0x -nostdlib -DLIBCXXRT +WARNS= 0 +CXXFLAGS+= -I${HDRDIR} -I${LIBCXXRTDIR} -std=c++0x -nostdlib -DLIBCXXRT -DPADD= ${LIBCXXRT} -LDADD= -lcxxrt -LDFLAGS+= --verbose -INCSGROUPS= STD EXT +DPADD= ${LIBCXXRT} +LDADD= -lcxxrt +LDFLAGS+= --verbose +INCSGROUPS= STD EXT -STD_HEADERS= __bit_reference\ - __config\ - __debug\ - __functional_03\ - __functional_base\ - __functional_base_03\ - __hash_table\ - __locale\ - __mutex_base\ - __split_buffer\ - __sso_allocator\ - __std_stream\ - __tree\ - __tuple\ - __tuple_03\ - __undef_min_max\ - algorithm\ - array\ - atomic\ - bitset\ - cassert\ - ccomplex\ - cctype\ - cerrno\ - cfenv\ - cfloat\ - chrono\ - cinttypes\ - ciso646\ - climits\ - clocale\ - cmath\ - codecvt\ - complex\ - complex.h\ - condition_variable\ - csetjmp\ - csignal\ - cstdarg\ - cstdbool\ - cstddef\ - cstdint\ - cstdio\ - cstdlib\ - cstring\ - ctgmath\ - ctime\ - cwchar\ - cwctype\ - deque\ - exception\ - forward_list\ - fstream\ - functional\ - future\ - initializer_list\ - iomanip\ - ios\ - iosfwd\ - iostream\ - istream\ - iterator\ - limits\ - list\ - locale\ - map\ - memory\ - mutex\ - new\ - numeric\ - ostream\ - queue\ - random\ - ratio\ - regex\ - scoped_allocator\ - set\ - sstream\ - stack\ - stdexcept\ - streambuf\ - string\ - strstream\ - system_error\ - tgmath.h\ - thread\ - tuple\ - type_traits\ - typeindex\ - typeinfo\ - unordered_map\ - unordered_set\ - utility\ - valarray\ - vector +STD_HEADERS= __bit_reference\ + __config\ + __debug\ + __functional_03\ + __functional_base\ + __functional_base_03\ + __hash_table\ + __locale\ + __mutex_base\ + __split_buffer\ + __sso_allocator\ + __std_stream\ + __tree\ + __tuple\ + __tuple_03\ + __undef_min_max\ + algorithm\ + array\ + atomic\ + bitset\ + cassert\ + ccomplex\ + cctype\ + cerrno\ + cfenv\ + cfloat\ + chrono\ + cinttypes\ + ciso646\ + climits\ + clocale\ + cmath\ + codecvt\ + complex\ + complex.h\ + condition_variable\ + csetjmp\ + csignal\ + cstdarg\ + cstdbool\ + cstddef\ + cstdint\ + cstdio\ + cstdlib\ + cstring\ + ctgmath\ + ctime\ + cwchar\ + cwctype\ + deque\ + exception\ + forward_list\ + fstream\ + functional\ + future\ + initializer_list\ + iomanip\ + ios\ + iosfwd\ + iostream\ + istream\ + iterator\ + limits\ + list\ + locale\ + map\ + memory\ + mutex\ + new\ + numeric\ + ostream\ + queue\ + random\ + ratio\ + regex\ + scoped_allocator\ + set\ + sstream\ + stack\ + stdexcept\ + streambuf\ + string\ + strstream\ + system_error\ + tgmath.h\ + thread\ + tuple\ + type_traits\ + typeindex\ + typeinfo\ + unordered_map\ + unordered_set\ + utility\ + valarray\ + vector +RT_HEADERS= cxxabi.h\ + unwind.h\ + unwind-arm.h\ + unwind-itanium.h .for hdr in ${STD_HEADERS} -STD+= ${HDRDIR}/${hdr} +STD+= ${HDRDIR}/${hdr} .endfor -STDDIR= ${CXXINCLUDEDIR} +.for hdr in ${RT_HEADERS} +STD+= ${LIBCXXRTDIR}/${hdr} +.endfor +STDDIR= ${CXXINCLUDEDIR} -EXT_HEADERS= __hash\ - hash_map\ - hash_set +EXT_HEADERS= __hash\ + hash_map\ + hash_set .for hdr in ${EXT_HEADERS} -EXT+= ${HDRDIR}/ext/${hdr} +EXT+= ${HDRDIR}/ext/${hdr} .endfor -EXTDIR= ${CXXINCLUDEDIR}/ext +EXTDIR= ${CXXINCLUDEDIR}/ext .include diff --git a/lib/libc/Makefile b/lib/libc/Makefile index 22223846695..ed370536561 100644 --- a/lib/libc/Makefile +++ b/lib/libc/Makefile @@ -26,7 +26,9 @@ SHLIB_MAJOR= 7 WARNS?= 2 CFLAGS+=-I${.CURDIR}/include -I${.CURDIR}/../../include CFLAGS+=-I${.CURDIR}/${LIBC_ARCH} +.if ${MK_NLS} != "no" CFLAGS+=-DNLS +.endif CLEANFILES+=tags INSTALL_PIC_ARCHIVE= PRECIOUSLIB= @@ -41,7 +43,11 @@ CFLAGS+=${CANCELPOINTS_CFLAGS} # DPADD+= ${LIBGCC} LDFLAGS+= -nodefaultlibs -LDADD+= -lgcc -lssp_nonshared +LDADD+= -lgcc + +.if ${MK_SSP} != "no" +LDADD+= -lssp_nonshared +.endif # Define (empty) variables so that make doesn't give substitution # errors if the included makefiles don't change these: diff --git a/lib/libc/amd64/sys/Makefile.inc b/lib/libc/amd64/sys/Makefile.inc index c7b17e06121..51583d35b74 100644 --- a/lib/libc/amd64/sys/Makefile.inc +++ b/lib/libc/amd64/sys/Makefile.inc @@ -1,7 +1,8 @@ # from: Makefile.inc,v 1.1 1993/09/03 19:04:23 jtc Exp # $FreeBSD$ -SRCS+= amd64_get_fsbase.c amd64_get_gsbase.c amd64_set_fsbase.c amd64_set_gsbase.c +SRCS+= amd64_get_fsbase.c amd64_get_gsbase.c amd64_set_fsbase.c \ + amd64_set_gsbase.c __vdso_gettc.c MDASM= vfork.S brk.S cerror.S exect.S getcontext.S pipe.S ptrace.S \ reboot.S sbrk.S setlogin.S sigreturn.S diff --git a/lib/libc/amd64/sys/__vdso_gettc.c b/lib/libc/amd64/sys/__vdso_gettc.c new file mode 100644 index 00000000000..091fe26d3ba --- /dev/null +++ b/lib/libc/amd64/sys/__vdso_gettc.c @@ -0,0 +1,49 @@ +/*- + * Copyright (c) 2012 Konstantin Belousov + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +static u_int +__vdso_gettc_low(const struct vdso_timehands *th) +{ + uint32_t rv; + + __asm __volatile("rdtsc; shrd %%cl, %%edx, %0" + : "=a" (rv) : "c" (th->th_x86_shift) : "edx"); + return (rv); +} + +u_int +__vdso_gettc(const struct vdso_timehands *th) +{ + + return (th->th_x86_shift > 0 ? __vdso_gettc_low(th) : rdtsc32()); +} diff --git a/lib/libc/arm/Symbol.map b/lib/libc/arm/Symbol.map index dc460130eb4..48f674756be 100644 --- a/lib/libc/arm/Symbol.map +++ b/lib/libc/arm/Symbol.map @@ -33,6 +33,10 @@ FBSD_1.0 { sbrk; }; +FBSD_1.3 { + __flt_rounds; +}; + FBSDprivate_1.0 { /* PSEUDO syscalls */ __sys_getlogin; diff --git a/lib/libc/compat-43/sigpause.2 b/lib/libc/compat-43/sigpause.2 index 1187b524091..4c24ab7c4c2 100644 --- a/lib/libc/compat-43/sigpause.2 +++ b/lib/libc/compat-43/sigpause.2 @@ -62,7 +62,7 @@ .Sy This interface is made obsolete by .Xr sigsuspend 2 .Sy and -.Xr sigaction 2 +.Xr sigaction 2 . .Pp The .Fn sigset @@ -172,7 +172,8 @@ returns if the signal had been blocked and the signal's previous disposition if it had not been blocked. Otherwise, -.Dv SIG_ERR is returned and +.Dv SIG_ERR +is returned and .Va errno set to indicate the error. .Pp diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc index 0362ce0c10b..98e8183adb4 100644 --- a/lib/libc/gen/Makefile.inc +++ b/lib/libc/gen/Makefile.inc @@ -9,7 +9,7 @@ SRCS+= __getosreldate.c __xuname.c \ _thread_init.c \ alarm.c arc4random.c assert.c aux.c basename.c check_utility_compat.c \ clock.c closedir.c confstr.c \ - crypt.c ctermid.c daemon.c devname.c dirname.c disklabel.c \ + crypt.c ctermid.c daemon.c devname.c dirfd.c dirname.c disklabel.c \ dlfcn.c drand48.c elf_utils.c erand48.c err.c errlst.c errno.c \ exec.c fdevname.c feature_present.c fmtcheck.c fmtmsg.c fnmatch.c \ fpclassify.c frexp.c fstab.c ftok.c fts.c fts-compat.c ftw.c \ diff --git a/lib/libc/gen/Symbol.map b/lib/libc/gen/Symbol.map index d794c0a32ac..356bee57bdc 100644 --- a/lib/libc/gen/Symbol.map +++ b/lib/libc/gen/Symbol.map @@ -382,6 +382,7 @@ FBSD_1.2 { }; FBSD_1.3 { + dirfd; fdlopen; __FreeBSD_libc_enter_restricted_mode; getcontextx; diff --git a/lib/libc/gen/arc4random.c b/lib/libc/gen/arc4random.c index a2b235fe374..46059abdb43 100644 --- a/lib/libc/gen/arc4random.c +++ b/lib/libc/gen/arc4random.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -78,6 +79,9 @@ static struct arc4_stream rs; static pid_t arc4_stir_pid; static int arc4_count; +extern int __sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, + void *newp, size_t newlen); + static inline u_int8_t arc4_getbyte(void); static void arc4_stir(void); @@ -109,6 +113,28 @@ arc4_addrandom(u_char *dat, int datlen) rs.j = rs.i; } +static size_t +arc4_sysctl(u_char *buf, size_t size) +{ + int mib[2]; + size_t len, done; + + mib[0] = CTL_KERN; + mib[1] = KERN_ARND; + done = 0; + + do { + len = size; + if (__sysctl(mib, 2, buf, &len, NULL, 0) == -1) + return (done); + done += len; + buf += len; + size -= len; + } while (size > 0); + + return (done); +} + static void arc4_stir(void) { @@ -123,12 +149,16 @@ arc4_stir(void) arc4_init(); rs_initialized = 1; } - fd = _open(RANDOMDEV, O_RDONLY, 0); done = 0; - if (fd >= 0) { - if (_read(fd, &rdat, KEYSIZE) == KEYSIZE) - done = 1; - (void)_close(fd); + if (arc4_sysctl((u_char *)&rdat, KEYSIZE) == KEYSIZE) + done = 1; + if (!done) { + fd = _open(RANDOMDEV, O_RDONLY, 0); + if (fd >= 0) { + if (_read(fd, &rdat, KEYSIZE) == KEYSIZE) + done = 1; + (void)_close(fd); + } } if (!done) { (void)gettimeofday(&rdat.tv, NULL); diff --git a/lib/libc/gen/aux.c b/lib/libc/gen/aux.c index 4bf8643af16..3767ac0a263 100644 --- a/lib/libc/gen/aux.c +++ b/lib/libc/gen/aux.c @@ -66,6 +66,7 @@ __init_elf_aux_vector(void) static pthread_once_t aux_once = PTHREAD_ONCE_INIT; static int pagesize, osreldate, canary_len, ncpus, pagesizes_len; static char *canary, *pagesizes; +static void *timekeep; static void init_aux(void) @@ -101,6 +102,10 @@ init_aux(void) case AT_NCPUS: ncpus = aux->a_un.a_val; break; + + case AT_TIMEKEEP: + timekeep = aux->a_un.a_ptr; + break; } } } @@ -163,6 +168,16 @@ _elf_aux_info(int aux, void *buf, int buflen) } else res = EINVAL; break; + case AT_TIMEKEEP: + if (buflen == sizeof(void *)) { + if (timekeep != NULL) { + *(void **)buf = timekeep; + res = 0; + } else + res = ENOENT; + } else + res = EINVAL; + break; default: res = ENOENT; break; diff --git a/lib/libc/gen/closedir.c b/lib/libc/gen/closedir.c index 5db351bbd7d..4b520cc458a 100644 --- a/lib/libc/gen/closedir.c +++ b/lib/libc/gen/closedir.c @@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include "un-namespace.h" #include "libc_private.h" +#include "gen-private.h" #include "telldir.h" /* diff --git a/lib/libc/gen/directory.3 b/lib/libc/gen/directory.3 index 1c568fc14b1..0fd5bba32b7 100644 --- a/lib/libc/gen/directory.3 +++ b/lib/libc/gen/directory.3 @@ -28,7 +28,7 @@ .\" @(#)directory.3 8.1 (Berkeley) 6/4/93 .\" $FreeBSD$ .\" -.Dd April 16, 2008 +.Dd July 5, 2012 .Dt DIRECTORY 3 .Os .Sh NAME @@ -153,7 +153,7 @@ returns 0 on success or an error number to indicate failure. The .Fn telldir function -returns the current location associated with the named +returns a token representing the current location associated with the named .Em directory stream . Values returned by .Fn telldir @@ -179,6 +179,13 @@ The new position reverts to the one associated with the when the .Fn telldir operation was performed. +State associated with the token returned by +.Fn telldir is freed when it is passed to +.Fn seekdir . +If you wish return to the same location again, +then you must create a new token with another +.Fn telldir +call. .Pp The .Fn rewinddir @@ -245,3 +252,9 @@ The .Fn fdopendir function appeared in .Fx 8.0 . +.Sh BUGS +The invalidation of +.Fn telldir +tokens when calling +.Fn seekdir +is non-standard. diff --git a/lib/libc/gen/dirfd.c b/lib/libc/gen/dirfd.c new file mode 100644 index 00000000000..e29bfdccb7e --- /dev/null +++ b/lib/libc/gen/dirfd.c @@ -0,0 +1,45 @@ +/*- + * Copyright (c) 2011 Gleb Kurtsou + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "namespace.h" +#include + +#include +#include "un-namespace.h" + +#include "gen-private.h" + +int +dirfd(DIR *dirp) +{ + + return (_dirfd(dirp)); +} diff --git a/lib/libc/gen/err.3 b/lib/libc/gen/err.3 index 4871bcc1566..8bd31c360e1 100644 --- a/lib/libc/gen/err.3 +++ b/lib/libc/gen/err.3 @@ -28,7 +28,7 @@ .\" From: @(#)err.3 8.1 (Berkeley) 6/9/93 .\" $FreeBSD$ .\" -.Dd March 6, 1999 +.Dd March 29, 2012 .Dt ERR 3 .Os .Sh NAME @@ -212,6 +212,18 @@ if (error != 0) .Xr printf 3 , .Xr strerror 3 , .Xr sysexits 3 +.Sh STANDARDS +The +.Fn err +and +.Fn warn +families of functions are +.Bx +extensions. +As such they should not be used in truly portable code. +Use +.Fn strerror +or similar functions instead. .Sh HISTORY The .Fn err diff --git a/lib/libc/gen/fstab.c b/lib/libc/gen/fstab.c index b2c28ad53d4..882c57f1e88 100644 --- a/lib/libc/gen/fstab.c +++ b/lib/libc/gen/fstab.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -246,6 +247,8 @@ getfsfile(name) int setfsent() { + int fd; + if (_fs_fp) { rewind(_fs_fp); LineNo = 0; @@ -257,11 +260,18 @@ setfsent() else setfstab(getenv("PATH_FSTAB")); } - if ((_fs_fp = fopen(path_fstab, "r")) != NULL) { + fd = _open(path_fstab, O_RDONLY | O_CLOEXEC); + if (fd == -1) { + error(errno); + return (0); + } + _fs_fp = fdopen(fd, "r"); + if (_fs_fp != NULL) { LineNo = 0; return(1); } error(errno); + _close(fd); return(0); } diff --git a/lib/libc/gen/fts-compat.c b/lib/libc/gen/fts-compat.c index a6ddde4f265..65854164dc6 100644 --- a/lib/libc/gen/fts-compat.c +++ b/lib/libc/gen/fts-compat.c @@ -52,6 +52,8 @@ __FBSDID("$FreeBSD$"); #include "fts-compat.h" #include "un-namespace.h" +#include "gen-private.h" + FTSENT *__fts_children_44bsd(FTS *, int); int __fts_close_44bsd(FTS *); void *__fts_get_clientptr_44bsd(FTS *); @@ -711,7 +713,7 @@ fts_build(sp, type) */ cderrno = 0; if (nlinks || type == BREAD) { - if (fts_safe_changedir(sp, cur, dirfd(dirp), NULL)) { + if (fts_safe_changedir(sp, cur, _dirfd(dirp), NULL)) { if (nlinks && type == BREAD) cur->fts_errno = errno; cur->fts_flags |= FTS_DONTCHDIR; diff --git a/lib/libc/gen/fts.c b/lib/libc/gen/fts.c index 1344464585a..153b8dad45e 100644 --- a/lib/libc/gen/fts.c +++ b/lib/libc/gen/fts.c @@ -52,6 +52,8 @@ __FBSDID("$FreeBSD$"); #include #include "un-namespace.h" +#include "gen-private.h" + static FTSENT *fts_alloc(FTS *, char *, size_t); static FTSENT *fts_build(FTS *, int); static void fts_lfree(FTSENT *); @@ -697,7 +699,7 @@ fts_build(FTS *sp, int type) */ cderrno = 0; if (nlinks || type == BREAD) { - if (fts_safe_changedir(sp, cur, dirfd(dirp), NULL)) { + if (fts_safe_changedir(sp, cur, _dirfd(dirp), NULL)) { if (nlinks && type == BREAD) cur->fts_errno = errno; cur->fts_flags |= FTS_DONTCHDIR; diff --git a/lib/libc/gen/gen-private.h b/lib/libc/gen/gen-private.h new file mode 100644 index 00000000000..e8854ad2d85 --- /dev/null +++ b/lib/libc/gen/gen-private.h @@ -0,0 +1,59 @@ +/*- + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _GEN_PRIVATE_H_ +#define _GEN_PRIVATE_H_ + +struct _telldir; /* see telldir.h */ +struct pthread_mutex; + +/* + * Structure describing an open directory. + * + * NOTE. Change structure layout with care, at least dd_fd field has to + * remain unchanged to guarantee backward compatibility. + */ +struct _dirdesc { + int dd_fd; /* file descriptor associated with directory */ + long dd_loc; /* offset in current buffer */ + long dd_size; /* amount of data returned by getdirentries */ + char *dd_buf; /* data buffer */ + int dd_len; /* size of data buffer */ + long dd_seek; /* magic cookie returned by getdirentries */ + long dd_rewind; /* magic cookie for rewinding */ + int dd_flags; /* flags for readdir */ + struct pthread_mutex *dd_lock; /* lock */ + struct _telldir *dd_td; /* telldir position recording */ +}; + +#define _dirfd(dirp) ((dirp)->dd_fd) + +#endif /* !_GEN_PRIVATE_H_ */ diff --git a/lib/libc/gen/getcwd.c b/lib/libc/gen/getcwd.c index c886dde98fe..40feedfa0f2 100644 --- a/lib/libc/gen/getcwd.c +++ b/lib/libc/gen/getcwd.c @@ -46,6 +46,8 @@ __FBSDID("$FreeBSD$"); #include #include "un-namespace.h" +#include "gen-private.h" + #define ISDOT(dp) \ (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \ (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) @@ -117,7 +119,7 @@ getcwd(pt, size) for (first = 1;; first = 0) { /* Stat the current level. */ - if (dir != NULL ? _fstat(dirfd(dir), &s) : lstat(".", &s)) + if (dir != NULL ? _fstat(_dirfd(dir), &s) : lstat(".", &s)) goto err; /* Save current node values. */ @@ -139,13 +141,13 @@ getcwd(pt, size) } /* Open and stat parent directory. */ - fd = _openat(dir != NULL ? dirfd(dir) : AT_FDCWD, + fd = _openat(dir != NULL ? _dirfd(dir) : AT_FDCWD, "..", O_RDONLY); if (fd == -1) goto err; if (dir) (void) closedir(dir); - if (!(dir = fdopendir(fd)) || _fstat(dirfd(dir), &s)) { + if (!(dir = fdopendir(fd)) || _fstat(_dirfd(dir), &s)) { _close(fd); goto err; } @@ -171,7 +173,7 @@ getcwd(pt, size) continue; /* Save the first error for later. */ - if (fstatat(dirfd(dir), dp->d_name, &s, + if (fstatat(_dirfd(dir), dp->d_name, &s, AT_SYMLINK_NOFOLLOW)) { if (!save_errno) save_errno = errno; diff --git a/lib/libc/gen/getnetgrent.c b/lib/libc/gen/getnetgrent.c index ca75d9b8d6c..51b3e3758b6 100644 --- a/lib/libc/gen/getnetgrent.c +++ b/lib/libc/gen/getnetgrent.c @@ -161,8 +161,7 @@ setnetgrent(const char *group) if (group == NULL || !strlen(group)) return; - if (grouphead.gr == (struct netgrp *)0 || - strcmp(group, grouphead.grname)) { + if (grouphead.gr == NULL || strcmp(group, grouphead.grname)) { endnetgrent(); #ifdef YP /* Presumed guilty until proven innocent. */ @@ -172,7 +171,7 @@ setnetgrent(const char *group) * use NIS exclusively. */ if (((stat(_PATH_NETGROUP, &_yp_statp) < 0) && - errno == ENOENT) || _yp_statp.st_size == 0) + errno == ENOENT) || _yp_statp.st_size == 0) _use_only_yp = _netgr_yp_enabled = 1; if ((netf = fopen(_PATH_NETGROUP,"r")) != NULL ||_use_only_yp){ /* @@ -203,9 +202,7 @@ setnetgrent(const char *group) if (parse_netgrp(group)) endnetgrent(); else { - grouphead.grname = (char *) - malloc(strlen(group) + 1); - strcpy(grouphead.grname, group); + grouphead.grname = strdup(group); } if (netf) fclose(netf); @@ -249,27 +246,24 @@ endnetgrent(void) lp = lp->l_next; free(olp->l_groupname); free(olp->l_line); - free((char *)olp); + free(olp); } - linehead = (struct linelist *)0; + linehead = NULL; if (grouphead.grname) { free(grouphead.grname); - grouphead.grname = (char *)0; + grouphead.grname = NULL; } gp = grouphead.gr; while (gp) { ogp = gp; gp = gp->ng_next; - if (ogp->ng_str[NG_HOST]) - free(ogp->ng_str[NG_HOST]); - if (ogp->ng_str[NG_USER]) - free(ogp->ng_str[NG_USER]); - if (ogp->ng_str[NG_DOM]) - free(ogp->ng_str[NG_DOM]); - free((char *)ogp); + free(ogp->ng_str[NG_HOST]); + free(ogp->ng_str[NG_USER]); + free(ogp->ng_str[NG_DOM]); + free(ogp); } - grouphead.gr = (struct netgrp *)0; - nextgrp = (struct netgrp *)0; + grouphead.gr = NULL; + nextgrp = NULL; #ifdef YP _netgr_yp_enabled = 0; #endif @@ -284,7 +278,7 @@ _listmatch(const char *list, const char *group, int len) int glen = strlen(group); /* skip possible leading whitespace */ - while(isspace((unsigned char)*ptr)) + while (isspace((unsigned char)*ptr)) ptr++; while (ptr < list + len) { @@ -292,12 +286,12 @@ _listmatch(const char *list, const char *group, int len) while(*ptr != ',' && *ptr != '\0' && !isspace((unsigned char)*ptr)) ptr++; if (strncmp(cptr, group, glen) == 0 && glen == (ptr - cptr)) - return(1); - while(*ptr == ',' || isspace((unsigned char)*ptr)) + return (1); + while (*ptr == ',' || isspace((unsigned char)*ptr)) ptr++; } - return(0); + return (0); } static int @@ -311,32 +305,37 @@ _revnetgr_lookup(char* lookupdom, char* map, const char* str, for (rot = 0; ; rot++) { switch (rot) { - case(0): snprintf(key, MAXHOSTNAMELEN, "%s.%s", - str, dom?dom:lookupdom); - break; - case(1): snprintf(key, MAXHOSTNAMELEN, "%s.*", - str); - break; - case(2): snprintf(key, MAXHOSTNAMELEN, "*.%s", - dom?dom:lookupdom); - break; - case(3): snprintf(key, MAXHOSTNAMELEN, "*.*"); - break; - default: return(0); + case 0: + snprintf(key, MAXHOSTNAMELEN, "%s.%s", str, + dom ? dom : lookupdom); + break; + case 1: + snprintf(key, MAXHOSTNAMELEN, "%s.*", str); + break; + case 2: + snprintf(key, MAXHOSTNAMELEN, "*.%s", + dom ? dom : lookupdom); + break; + case 3: + snprintf(key, MAXHOSTNAMELEN, "*.*"); + break; + default: + return (0); } y = yp_match(lookupdom, map, key, strlen(key), &result, - &resultlen); + &resultlen); if (y == 0) { rv = _listmatch(result, group, resultlen); free(result); - if (rv) return(1); + if (rv) + return (1); } else if (y != YPERR_KEY) { /* * If we get an error other than 'no * such key in map' then something is * wrong and we should stop the search. */ - return(-1); + return (-1); } } } @@ -386,14 +385,14 @@ innetgr(const char *group, const char *host, const char *user, const char *dom) if (_use_only_yp && (host == NULL) != (user == NULL)) { int ret; if(yp_get_default_domain(&_netgr_yp_domain)) - return(0); + return (0); ret = _revnetgr_lookup(_netgr_yp_domain, host?"netgroup.byhost":"netgroup.byuser", host?host:user, dom, group); if (ret == 1) - return(1); + return (1); else if (ret == 0 && dom != NULL) - return(0); + return (0); } setnetgrent(group); @@ -416,14 +415,14 @@ innetgr(const char *group, const char *host, const char *user, const char *dom) static int parse_netgrp(const char *group) { - char *spos, *epos; - int len, strpos; + struct netgrp *grp; + struct linelist *lp = linehead; + char **ng; + char *epos, *gpos, *pos, *spos; + int freepos, len, strpos; #ifdef DEBUG int fields; #endif - char *pos, *gpos; - struct netgrp *grp; - struct linelist *lp = linehead; /* * First, see if the line has already been read in. @@ -433,8 +432,7 @@ parse_netgrp(const char *group) break; lp = lp->l_next; } - if (lp == (struct linelist *)0 && - (lp = read_for_group(group)) == (struct linelist *)0) + if (lp == NULL && (lp = read_for_group(group)) == NULL) return (1); if (lp->l_parsed) { #ifdef DEBUG @@ -453,43 +451,51 @@ parse_netgrp(const char *group) /* Watch for null pointer dereferences, dammit! */ while (pos != NULL && *pos != '\0') { if (*pos == '(') { - grp = (struct netgrp *)malloc(sizeof (struct netgrp)); - bzero((char *)grp, sizeof (struct netgrp)); - grp->ng_next = grouphead.gr; - grouphead.gr = grp; + grp = malloc(sizeof(*grp)); + if (grp == NULL) + return (1); + ng = grp->ng_str; + bzero(grp, sizeof(*grp)); pos++; gpos = strsep(&pos, ")"); #ifdef DEBUG fields = 0; #endif for (strpos = 0; strpos < 3; strpos++) { - if ((spos = strsep(&gpos, ","))) { -#ifdef DEBUG - fields++; -#endif - while (*spos == ' ' || *spos == '\t') - spos++; - if ((epos = strpbrk(spos, " \t"))) { - *epos = '\0'; - len = epos - spos; - } else - len = strlen(spos); - if (len > 0) { - grp->ng_str[strpos] = (char *) - malloc(len + 1); - bcopy(spos, grp->ng_str[strpos], - len + 1); - } - } else { + if ((spos = strsep(&gpos, ",")) == NULL) { /* * All other systems I've tested * return NULL for empty netgroup * fields. It's up to user programs * to handle the NULLs appropriately. */ - grp->ng_str[strpos] = NULL; + ng[strpos] = NULL; + continue; } +#ifdef DEBUG + fields++; +#endif + while (*spos == ' ' || *spos == '\t') + spos++; + if ((epos = strpbrk(spos, " \t"))) { + *epos = '\0'; + len = epos - spos; + } else + len = strlen(spos); + if (len <= 0) + continue; + ng[strpos] = malloc(len + 1); + if (ng[strpos] == NULL) { + for (freepos = 0; freepos < strpos; + freepos++) + free(ng[freepos]); + free(grp); + return (1); + } + bcopy(spos, ng[strpos], len + 1); } + grp->ng_next = grouphead.gr; + grouphead.gr = grp; #ifdef DEBUG /* * Note: on other platforms, malformed netgroup @@ -497,14 +503,15 @@ parse_netgrp(const char *group) * can catch bad entries and report them, we should * stay silent by default for compatibility's sake. */ - if (fields < 3) - fprintf(stderr, "Bad entry (%s%s%s%s%s) in netgroup \"%s\"\n", - grp->ng_str[NG_HOST] == NULL ? "" : grp->ng_str[NG_HOST], - grp->ng_str[NG_USER] == NULL ? "" : ",", - grp->ng_str[NG_USER] == NULL ? "" : grp->ng_str[NG_USER], - grp->ng_str[NG_DOM] == NULL ? "" : ",", - grp->ng_str[NG_DOM] == NULL ? "" : grp->ng_str[NG_DOM], - lp->l_groupname); + if (fields < 3) { + fprintf(stderr, + "Bad entry (%s%s%s%s%s) in netgroup \"%s\"\n", + ng[NG_HOST] == NULL ? "" : ng[NG_HOST], + ng[NG_USER] == NULL ? "" : ",", + ng[NG_USER] == NULL ? "" : ng[NG_USER], + ng[NG_DOM] == NULL ? "" : ",", + ng[NG_DOM] == NULL ? "" : ng[NG_DOM], + lp->l_groupname); #endif } else { spos = strsep(&pos, ", \t"); @@ -526,7 +533,7 @@ parse_netgrp(const char *group) static struct linelist * read_for_group(const char *group) { - char *pos, *spos, *linep, *olinep; + char *linep, *olinep, *pos, *spos; int len, olen; int cont; struct linelist *lp; @@ -534,6 +541,7 @@ read_for_group(const char *group) #ifdef YP char *result; int resultlen; + linep = NULL; while (_netgr_yp_enabled || fgets(line, LINSIZ, netf) != NULL) { if (_netgr_yp_enabled) { @@ -541,7 +549,7 @@ read_for_group(const char *group) if(yp_get_default_domain(&_netgr_yp_domain)) continue; if (yp_match(_netgr_yp_domain, "netgroup", group, - strlen(group), &result, &resultlen)) { + strlen(group), &result, &resultlen)) { free(result); if (_use_only_yp) return ((struct linelist *)0); @@ -554,6 +562,7 @@ read_for_group(const char *group) free(result); } #else + linep = NULL; while (fgets(line, LINSIZ, netf) != NULL) { #endif pos = (char *)&line; @@ -576,8 +585,14 @@ read_for_group(const char *group) pos++; if (*pos != '\n' && *pos != '\0') { lp = (struct linelist *)malloc(sizeof (*lp)); + if (lp == NULL) + return (NULL); lp->l_parsed = 0; lp->l_groupname = (char *)malloc(len + 1); + if (lp->l_groupname == NULL) { + free(lp); + return (NULL); + } bcopy(spos, lp->l_groupname, len); *(lp->l_groupname + len) = '\0'; len = strlen(pos); @@ -595,7 +610,12 @@ read_for_group(const char *group) } else cont = 0; if (len > 0) { - linep = (char *)malloc(olen + len + 1); + linep = malloc(olen + len + 1); + if (linep == NULL) { + free(lp->l_groupname); + free(lp); + return (NULL); + } if (olen > 0) { bcopy(olinep, linep, olen); free(olinep); @@ -634,5 +654,5 @@ read_for_group(const char *group) */ rewind(netf); #endif - return ((struct linelist *)0); + return (NULL); } diff --git a/lib/libc/gen/opendir.c b/lib/libc/gen/opendir.c index 3beead7fbd1..436639907cc 100644 --- a/lib/libc/gen/opendir.c +++ b/lib/libc/gen/opendir.c @@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include #include "un-namespace.h" +#include "gen-private.h" #include "telldir.h" static DIR * __opendir_common(int, const char *, int); diff --git a/lib/libc/gen/posix_spawnattr_getflags.3 b/lib/libc/gen/posix_spawnattr_getflags.3 index a2dda02c128..4064011f1d0 100644 --- a/lib/libc/gen/posix_spawnattr_getflags.3 +++ b/lib/libc/gen/posix_spawnattr_getflags.3 @@ -70,7 +70,7 @@ or It is the bitwise-inclusive OR of zero or more of the following flags (see .Fn posix_spawn ) : -.Bl -tag -offset indent +.Bl -tag -width "POSIX_SPAWN_SETSCHEDPARAM" -offset indent .It Dv POSIX_SPAWN_RESETIDS .It Dv POSIX_SPAWN_SETPGROUP .It Dv POSIX_SPAWN_SETSIGDEF diff --git a/lib/libc/gen/readdir.c b/lib/libc/gen/readdir.c index b4b4c39d7b4..324870b39ad 100644 --- a/lib/libc/gen/readdir.c +++ b/lib/libc/gen/readdir.c @@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include "un-namespace.h" #include "libc_private.h" +#include "gen-private.h" #include "telldir.h" /* diff --git a/lib/libc/gen/rewinddir.c b/lib/libc/gen/rewinddir.c index 45e450d856b..0eb091a0824 100644 --- a/lib/libc/gen/rewinddir.c +++ b/lib/libc/gen/rewinddir.c @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include "gen-private.h" #include "telldir.h" void diff --git a/lib/libc/gen/seekdir.c b/lib/libc/gen/seekdir.c index 45ed6b55869..e9851a7b1ea 100644 --- a/lib/libc/gen/seekdir.c +++ b/lib/libc/gen/seekdir.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include "un-namespace.h" #include "libc_private.h" +#include "gen-private.h" #include "telldir.h" /* diff --git a/lib/libc/gen/signal.3 b/lib/libc/gen/signal.3 index 866eee373a6..a41d2589778 100644 --- a/lib/libc/gen/signal.3 +++ b/lib/libc/gen/signal.3 @@ -38,20 +38,11 @@ .Lb libc .Sh SYNOPSIS .In signal.h -.\" XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX -.\" The prototype for signal(3) cannot be cleanly marked up in -mdoc -.\" without the following lower-level tweak. -.nr in-synopsis-section 0 +.\" The following is Quite Ugly, but syntactically correct. +.\" Don't try to fix it. +.Ft void +.Fn \*(lp*signal "int sig" "void \*(lp*func\*(rp\*(lpint\*(rp\*(rp\*(rp\*(lpint" .Pp -.Ft "void \*(lp*" Ns -.Fo signal -.Fa "int sig" -.Fa "void \*(lp*func\*(rp\*(lpint\*(rp" -.Fc Ns -.Ft "\*(rp\*(lpint\*(rp" ; -.Pp -.nr in-synopsis-section 1 -.\" XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX or in .Fx Ap s equivalent but easier to read typedef'd version: @@ -98,7 +89,7 @@ an interrupt. These signals are defined in the file .In signal.h : .Bl -column No ".Dv SIGVTALRM" "create core image" -.It Sy "No Name Default Action Description" +.It Sy "Num" Ta Sy "Name" Ta Sy "Default Action" Ta Sy "Description" .It 1 Ta Dv SIGHUP Ta "terminate process" Ta "terminal line hangup" .It 2 Ta Dv SIGINT Ta "terminate process" Ta "interrupt program" .It 3 Ta Dv SIGQUIT Ta "create core image" Ta "quit program" diff --git a/lib/libc/gen/sysconf.c b/lib/libc/gen/sysconf.c index 80ae62674ed..2d117b7d951 100644 --- a/lib/libc/gen/sysconf.c +++ b/lib/libc/gen/sysconf.c @@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -51,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include "../stdlib/atexit.h" #include "tzfile.h" /* from ../../../contrib/tzcode/stdtime */ +#include "libc_private.h" #define _PATH_ZONEINFO TZDIR /* from tzfile.h */ @@ -585,6 +587,8 @@ yesno: case _SC_NPROCESSORS_CONF: case _SC_NPROCESSORS_ONLN: + if (_elf_aux_info(AT_NCPUS, &value, sizeof(value)) == 0) + return ((long)value); mib[0] = CTL_HW; mib[1] = HW_NCPU; break; diff --git a/lib/libc/gen/syslog.c b/lib/libc/gen/syslog.c index de438c43b9c..99308e992f8 100644 --- a/lib/libc/gen/syslog.c +++ b/lib/libc/gen/syslog.c @@ -413,8 +413,10 @@ void closelog(void) { THREAD_LOCK(); - (void)_close(LogFile); - LogFile = -1; + if (LogFile != -1) { + (void)_close(LogFile); + LogFile = -1; + } LogTag = NULL; status = NOCONN; THREAD_UNLOCK(); diff --git a/lib/libc/gen/telldir.c b/lib/libc/gen/telldir.c index c2173333b8e..4954b973a91 100644 --- a/lib/libc/gen/telldir.c +++ b/lib/libc/gen/telldir.c @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include "un-namespace.h" #include "libc_private.h" +#include "gen-private.h" #include "telldir.h" /* diff --git a/lib/libc/gmon/gmon.c b/lib/libc/gmon/gmon.c index edf4e2f3d5e..8f508b065a0 100644 --- a/lib/libc/gmon/gmon.c +++ b/lib/libc/gmon/gmon.c @@ -157,7 +157,12 @@ _mcleanup(void) } moncontrol(0); - snprintf(outname, sizeof(outname), "%s.gmon", _getprogname()); + if (getenv("PROFIL_USE_PID")) + snprintf(outname, sizeof(outname), "%s.%d.gmon", + _getprogname(), getpid()); + else + snprintf(outname, sizeof(outname), "%s.gmon", _getprogname()); + fd = _open(outname, O_CREAT|O_TRUNC|O_WRONLY, 0666); if (fd < 0) { _warn("_mcleanup: %s", outname); diff --git a/lib/libc/gmon/moncontrol.3 b/lib/libc/gmon/moncontrol.3 index 7979a71c9fe..d63035a83d1 100644 --- a/lib/libc/gmon/moncontrol.3 +++ b/lib/libc/gmon/moncontrol.3 @@ -98,6 +98,13 @@ however, all functions in that address range will have their execution time measured. Profiling begins on return from .Fn monstartup . +.Sh ENVIRONMENT +The following environment variables affect the execution of +.Nm : +.Bl -tag -width ".Ev PROFIL_USE_PID" +.It PROFIL_USE_PID +If set, the pid of the process is inserted into the filename. +.El .Sh FILES .Bl -tag -width progname.gmon -compact .It Pa progname.gmon diff --git a/lib/libc/i386/gen/getcontextx.c b/lib/libc/i386/gen/getcontextx.c index 5908ce774ba..2d3b5625bba 100644 --- a/lib/libc/i386/gen/getcontextx.c +++ b/lib/libc/i386/gen/getcontextx.c @@ -68,7 +68,7 @@ __getcontextx_size(void) " movl %%ebx,%1\n" " popl %%ebx\n" : "=a" (p[0]), "=r" (p[1]), "=c" (p[2]), "=d" (p[3]) - : "0" (0x0)); + : "0" (0x1)); if ((p[2] & CPUID2_OSXSAVE) != 0) { __asm __volatile( " pushl %%ebx\n" diff --git a/lib/libc/i386/sys/Makefile.inc b/lib/libc/i386/sys/Makefile.inc index 98a9c9e7d39..9eefabca2ac 100644 --- a/lib/libc/i386/sys/Makefile.inc +++ b/lib/libc/i386/sys/Makefile.inc @@ -5,7 +5,8 @@ SRCS+= i386_clr_watch.c i386_set_watch.c i386_vm86.c .endif SRCS+= i386_get_fsbase.c i386_get_gsbase.c i386_get_ioperm.c i386_get_ldt.c \ - i386_set_fsbase.c i386_set_gsbase.c i386_set_ioperm.c i386_set_ldt.c + i386_set_fsbase.c i386_set_gsbase.c i386_set_ioperm.c i386_set_ldt.c \ + __vdso_gettc.c MDASM= Ovfork.S brk.S cerror.S exect.S getcontext.S pipe.S ptrace.S \ reboot.S sbrk.S setlogin.S sigreturn.S syscall.S diff --git a/lib/libc/i386/sys/__vdso_gettc.c b/lib/libc/i386/sys/__vdso_gettc.c new file mode 100644 index 00000000000..4419141a519 --- /dev/null +++ b/lib/libc/i386/sys/__vdso_gettc.c @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 2012 Konstantin Belousov + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +static u_int +__vdso_gettc_low(const struct vdso_timehands *th) +{ + uint32_t rv; + + __asm __volatile("rdtsc; shrd %%cl, %%edx, %0" + : "=a" (rv) : "c" (th->th_x86_shift) : "edx"); + return (rv); +} + +#pragma weak __vdso_gettc +u_int +__vdso_gettc(const struct vdso_timehands *th) +{ + + return (th->th_x86_shift > 0 ? __vdso_gettc_low(th) : rdtsc32()); +} diff --git a/lib/libc/include/libc_private.h b/lib/libc/include/libc_private.h index 2182f468971..faae02811d1 100644 --- a/lib/libc/include/libc_private.h +++ b/lib/libc/include/libc_private.h @@ -34,6 +34,7 @@ #ifndef _LIBC_PRIVATE_H_ #define _LIBC_PRIVATE_H_ +#include #include /* @@ -245,6 +246,12 @@ extern void * __sys_freebsd6_mmap(void *, __size_t, int, int, int, int, __off_t) /* Without back-compat translation */ extern int __sys_fcntl(int, int, ...); +struct timespec; +struct timeval; +struct timezone; +int __sys_gettimeofday(struct timeval *, struct timezone *); +int __sys_clock_gettime(__clockid_t, struct timespec *ts); + /* execve() with PATH processing to implement posix_spawnp() */ int _execvpe(const char *, char * const *, char * const *); diff --git a/lib/libc/include/port_before.h b/lib/libc/include/port_before.h index beef71d0260..304dd66df03 100644 --- a/lib/libc/include/port_before.h +++ b/lib/libc/include/port_before.h @@ -17,6 +17,6 @@ var = _u.v; \ } while (0) -#define UNUSED(x) (x) = (x) +#define UNUSED(x) (void)(x) #endif /* _PORT_BEFORE_H_ */ diff --git a/lib/libc/locale/collate.c b/lib/libc/locale/collate.c index 448e605491a..676d41cc082 100644 --- a/lib/libc/locale/collate.c +++ b/lib/libc/locale/collate.c @@ -56,11 +56,11 @@ __FBSDID("$FreeBSD$"); * We also modify the collation table test functions to search the thread-local * table first and the global table second. */ -#define __collate_load_error (table->__collate_load_error) #define __collate_substitute_nontrivial (table->__collate_substitute_nontrivial) #define __collate_substitute_table_ptr (table->__collate_substitute_table_ptr) #define __collate_char_pri_table_ptr (table->__collate_char_pri_table_ptr) #define __collate_chain_pri_table (table->__collate_chain_pri_table) +int __collate_load_error; struct xlocale_collate __xlocale_global_collate = { @@ -109,7 +109,9 @@ __collate_load(const char *encoding, locale_t unused) int __collate_load_tables(const char *encoding) { - return __collate_load_tables_l(encoding, &__xlocale_global_collate); + int ret = __collate_load_tables_l(encoding, &__xlocale_global_collate); + __collate_load_error = __xlocale_global_collate.__collate_load_error; + return ret; } int @@ -123,7 +125,7 @@ __collate_load_tables_l(const char *encoding, struct xlocale_collate *table) /* 'encoding' must be already checked. */ if (strcmp(encoding, "C") == 0 || strcmp(encoding, "POSIX") == 0) { - __collate_load_error = 1; + table->__collate_load_error = 1; return (_LDP_CACHE); } @@ -240,7 +242,7 @@ __collate_load_tables_l(const char *encoding, struct xlocale_collate *table) break; } } - __collate_load_error = 0; + table->__collate_load_error = 0; return (_LDP_LOADED); } diff --git a/lib/libc/locale/ctype_l.3 b/lib/libc/locale/ctype_l.3 index 385125ec8b8..5f427de0639 100644 --- a/lib/libc/locale/ctype_l.3 +++ b/lib/libc/locale/ctype_l.3 @@ -135,4 +135,17 @@ See the specific manual pages for more information. .Xr xlocale 3 .Sh STANDARDS These functions conform to -.St -p1003.1-2008 . +.St -p1003.1-2008 , +except for +.Fn digittoint_l , +.Fn isascii_l , +.Fn ishexnumber_l , +.Fn isideogram_l , +.Fn isnumber_l , +.Fn isphonogram_l , +.Fn isrune_l +and +.Fn isspecial_l +which are +.Fx +extensions. diff --git a/lib/libc/locale/duplocale.3 b/lib/libc/locale/duplocale.3 index 73c0b3e7d9b..1e149c05d7c 100644 --- a/lib/libc/locale/duplocale.3 +++ b/lib/libc/locale/duplocale.3 @@ -44,10 +44,10 @@ Duplicates an existing .Fa locale_t returning a new .Fa locale_t -that refers to the same locale values but has independent internal state. +that refers to the same locale values but has an independent internal state. Various functions, such as .Xr mblen 3 -require presistent state. +require a persistent state. These functions formerly used static variables and calls to them from multiple threads had undefined behavior. They now use fields in the diff --git a/lib/libc/locale/freelocale.3 b/lib/libc/locale/freelocale.3 index 8401803ba46..26060e87731 100644 --- a/lib/libc/locale/freelocale.3 +++ b/lib/libc/locale/freelocale.3 @@ -34,7 +34,7 @@ .Nd Frees a locale created with .Xr duplocale 3 or -.Xr newlocale 3 . +.Xr newlocale 3 .Sh LIBRARY .Lb libc .Sh SYNOPSIS diff --git a/lib/libc/locale/newlocale.3 b/lib/libc/locale/newlocale.3 index 599f148eeab..e2d7ebbb056 100644 --- a/lib/libc/locale/newlocale.3 +++ b/lib/libc/locale/newlocale.3 @@ -51,7 +51,7 @@ Any other components will be inherited from The .Fa mask is either -.Fa LC_ALL_MASK, +.Fa LC_ALL_MASK , indicating all possible locale components, or the logical OR of some combination of the following: .Bl -tag -width "LC_MESSAGES_MASK" -offset indent @@ -59,7 +59,7 @@ or the logical OR of some combination of the following: The locale for string collation routines. This controls alphabetic ordering in .Xr strcoll 3 - and +and .Xr strxfrm 3 . .It LC_CTYPE_MASK The locale for the diff --git a/lib/libc/locale/querylocale.3 b/lib/libc/locale/querylocale.3 index a9d018230f0..4f9775595e5 100644 --- a/lib/libc/locale/querylocale.3 +++ b/lib/libc/locale/querylocale.3 @@ -32,7 +32,7 @@ .Os .Sh NAME .Nm querylocale -.Nd Look up the locale name for a specified category. +.Nd Look up the locale name for a specified category .Sh LIBRARY .Lb libc .Sh SYNOPSIS @@ -41,7 +41,7 @@ .Fn querylocale "int mask" "locale_t locale" .Sh DESCRIPTION Returns the name of the locale for the category specified by -.Fa mask. +.Fa mask . This possible values for the mask are the same as those in .Xr newlocale 3 . If more than one bit in the mask is set, the returned value is undefined. diff --git a/lib/libc/locale/setrunelocale.c b/lib/libc/locale/setrunelocale.c index bc04e9e4798..3ffb64915bd 100644 --- a/lib/libc/locale/setrunelocale.c +++ b/lib/libc/locale/setrunelocale.c @@ -67,7 +67,6 @@ extern _RuneLocale *_Read_RuneMagi(FILE *); static int __setrunelocale(struct xlocale_ctype *l, const char *); -#define __collate_load_error (table->__collate_load_error) #define __collate_substitute_nontrivial (table->__collate_substitute_nontrivial) #define __collate_substitute_table_ptr (table->__collate_substitute_table_ptr) #define __collate_char_pri_table_ptr (table->__collate_char_pri_table_ptr) @@ -89,6 +88,17 @@ const _RuneLocale *__getCurrentRuneLocale(void) return XLOCALE_CTYPE(__get_locale())->runes; } +static void free_runes(_RuneLocale *rl) +{ + /* FIXME: The "EUC" check here is a hideous abstraction violation. */ + if ((rl != &_DefaultRuneLocale) && (rl)) { + if (strcmp(rl->__encoding, "EUC") == 0) { + free(rl->__variable); + } + free(rl); + } +} + static int __setrunelocale(struct xlocale_ctype *l, const char *encoding) { @@ -102,6 +112,7 @@ __setrunelocale(struct xlocale_ctype *l, const char *encoding) * The "C" and "POSIX" locale are always here. */ if (strcmp(encoding, "C") == 0 || strcmp(encoding, "POSIX") == 0) { + free_runes(saved.runes); (void) _none_init(l, (_RuneLocale*)&_DefaultRuneLocale); return (0); } @@ -153,13 +164,7 @@ __setrunelocale(struct xlocale_ctype *l, const char *encoding) if (ret == 0) { /* Free the old runes if it exists. */ - /* FIXME: The "EUC" check here is a hideous abstraction violation. */ - if ((saved.runes != &_DefaultRuneLocale) && (saved.runes)) { - if (strcmp(saved.runes->__encoding, "EUC") == 0) { - free(saved.runes->__variable); - } - free(saved.runes); - } + free_runes(saved.runes); } else { /* Restore the saved version if this failed. */ memcpy(l, &saved, sizeof(struct xlocale_ctype)); diff --git a/lib/libc/locale/toupper.c b/lib/libc/locale/toupper.c index d3a4fa3e7e0..704ac3a2c1b 100644 --- a/lib/libc/locale/toupper.c +++ b/lib/libc/locale/toupper.c @@ -51,7 +51,7 @@ ___toupper_l(c, l) { size_t lim; FIX_LOCALE(l); - _RuneRange *rr = &XLOCALE_CTYPE(l)->runes->__maplower_ext; + _RuneRange *rr = &XLOCALE_CTYPE(l)->runes->__mapupper_ext; _RuneEntry *base, *re; if (c < 0 || c == EOF) diff --git a/lib/libc/locale/uselocale.3 b/lib/libc/locale/uselocale.3 index 72847b37170..9b4f4303882 100644 --- a/lib/libc/locale/uselocale.3 +++ b/lib/libc/locale/uselocale.3 @@ -32,7 +32,7 @@ .Os .Sh NAME .Nm uselocale -.Nd Sets a thread-local locale. +.Nd Sets a thread-local locale .Sh LIBRARY .Lb libc .Sh SYNOPSIS diff --git a/lib/libc/locale/xlocale.3 b/lib/libc/locale/xlocale.3 index 11a392dca18..9648cc7a792 100644 --- a/lib/libc/locale/xlocale.3 +++ b/lib/libc/locale/xlocale.3 @@ -32,7 +32,7 @@ .Os .Sh NAME .Nm xlocale -.Nd Thread-safe extended locale support. +.Nd Thread-safe extended locale support .Sh LIBRARY .Lb libc .Sh SYNOPSIS diff --git a/lib/libc/net/Makefile.inc b/lib/libc/net/Makefile.inc index 4eadf980060..e61021bc8c6 100644 --- a/lib/libc/net/Makefile.inc +++ b/lib/libc/net/Makefile.inc @@ -36,7 +36,7 @@ LFLAGS+=-P_nsyy CLEANFILES+=nslexer.c -nslexer.c: nslexer.l +nslexer.c: nslexer.l nsparser.h ${LEX} ${LFLAGS} -o/dev/stdout ${.IMPSRC} | \ sed -e '/YY_BUF_SIZE/s/16384/1024/' >${.TARGET} diff --git a/lib/libc/net/Symbol.map b/lib/libc/net/Symbol.map index 39ab2c7640e..2eddc473957 100644 --- a/lib/libc/net/Symbol.map +++ b/lib/libc/net/Symbol.map @@ -143,6 +143,11 @@ FBSD_1.0 { setsourcefilter; }; +FBSD_1.3 { + sctp_recvv; + sctp_sendv; +}; + FBSDprivate_1.0 { _nsdispatch; _nsyyerror; /* generated from nslexer.l */ diff --git a/lib/libc/net/getaddrinfo.c b/lib/libc/net/getaddrinfo.c index 8083c390b3b..dc2641f731e 100644 --- a/lib/libc/net/getaddrinfo.c +++ b/lib/libc/net/getaddrinfo.c @@ -464,7 +464,7 @@ getaddrinfo(const char *hostname, const char *servname, } error = get_portmatch(pai, servname); if (error) - ERR(error); + goto bad; *pai = ai0; } diff --git a/lib/libc/net/if_indextoname.c b/lib/libc/net/if_indextoname.c index 4dadce351ad..4b16433a4ee 100644 --- a/lib/libc/net/if_indextoname.c +++ b/lib/libc/net/if_indextoname.c @@ -70,7 +70,7 @@ if_indextoname(unsigned int ifindex, char *ifname) for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_LINK && - ifindex == ((struct sockaddr_dl*)ifa->ifa_addr)->sdl_index) + ifindex == LLINDEX((struct sockaddr_dl*)ifa->ifa_addr)) break; } diff --git a/lib/libc/net/if_nameindex.c b/lib/libc/net/if_nameindex.c index 7a12d34b58e..138289c6814 100644 --- a/lib/libc/net/if_nameindex.c +++ b/lib/libc/net/if_nameindex.c @@ -123,7 +123,7 @@ if_nameindex(void) if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_LINK) { ifni2->if_index = - ((struct sockaddr_dl*)ifa->ifa_addr)->sdl_index; + LLINDEX((struct sockaddr_dl*)ifa->ifa_addr); ifni2->if_name = cp; strcpy(cp, ifa->ifa_name); ifni2++; diff --git a/lib/libc/net/if_nametoindex.c b/lib/libc/net/if_nametoindex.c index 9d47089971e..89076c0e021 100644 --- a/lib/libc/net/if_nametoindex.c +++ b/lib/libc/net/if_nametoindex.c @@ -90,7 +90,7 @@ if_nametoindex(const char *ifname) if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_LINK && strcmp(ifa->ifa_name, ifname) == 0) { - ni = ((struct sockaddr_dl*)ifa->ifa_addr)->sdl_index; + ni = LLINDEX((struct sockaddr_dl*)ifa->ifa_addr); break; } } diff --git a/lib/libc/net/nsdispatch.3 b/lib/libc/net/nsdispatch.3 index a1da892d4fc..577bce98e45 100644 --- a/lib/libc/net/nsdispatch.3 +++ b/lib/libc/net/nsdispatch.3 @@ -173,11 +173,11 @@ While there is support for arbitrary sources, the following #defines for commonly implemented sources are available: .Bl -column NSSRC_COMPAT compat -offset indent .It Sy "#define value" -.It Dv NSSRC_FILES Ta """files"" -.It Dv NSSRC_DB Ta """db"" -.It Dv NSSRC_DNS Ta """dns"" -.It Dv NSSRC_NIS Ta """nis"" -.It Dv NSSRC_COMPAT Ta """compat"" +.It Dv NSSRC_FILES Ta \&"files\&" +.It Dv NSSRC_DB Ta \&"db\&" +.It Dv NSSRC_DNS Ta \&"dns\&" +.It Dv NSSRC_NIS Ta \&"nis\&" +.It Dv NSSRC_COMPAT Ta \&"compat\&" .El .Pp Refer to diff --git a/lib/libc/net/nsparser.y b/lib/libc/net/nsparser.y index 730458a37f0..2e57cd26dd3 100644 --- a/lib/libc/net/nsparser.y +++ b/lib/libc/net/nsparser.y @@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$"); #define _NS_PRIVATE #include #include +#include #include #include #include "un-namespace.h" diff --git a/lib/libc/net/sctp_connectx.3 b/lib/libc/net/sctp_connectx.3 index 1851d4a3293..6ea1bb622f2 100644 --- a/lib/libc/net/sctp_connectx.3 +++ b/lib/libc/net/sctp_connectx.3 @@ -36,7 +36,7 @@ .Os .Sh NAME .Nm sctp_connectx -.Nd connect an SCTP socket with multiple destination addresses. +.Nd connect an SCTP socket with multiple destination addresses .Sh LIBRARY .Lb libc .Sh SYNOPSIS diff --git a/lib/libc/net/sctp_recvmsg.3 b/lib/libc/net/sctp_recvmsg.3 index 37323c87159..eda3e5cc34c 100644 --- a/lib/libc/net/sctp_recvmsg.3 +++ b/lib/libc/net/sctp_recvmsg.3 @@ -66,7 +66,7 @@ For a one-to-many (SOCK_SEQPACKET) type socket, an endpoint may call .Fn sctp_recvmsg after having implicitly started an association via one of the send calls including -.Fn sctp_sendmsg +.Fn sctp_sendmsg , .Fn sendto and .Fn sendmsg . diff --git a/lib/libc/net/sctp_sys_calls.c b/lib/libc/net/sctp_sys_calls.c index e9c9d645e55..3785a048195 100644 --- a/lib/libc/net/sctp_sys_calls.c +++ b/lib/libc/net/sctp_sys_calls.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -32,6 +32,7 @@ #include __FBSDID("$FreeBSD$"); + #include #include #include @@ -800,7 +801,6 @@ continue_send: } sinfo->sinfo_assoc_id = sctp_getassocid(sd, addrs); if (sinfo->sinfo_assoc_id == 0) { - printf("Huh, can't get associd? TSNH!\n"); (void)setsockopt(sd, IPPROTO_SCTP, SCTP_CONNECT_X_COMPLETE, (void *)addrs, (socklen_t) addrs->sa_len); errno = ENOENT; diff --git a/lib/libc/net/sourcefilter.3 b/lib/libc/net/sourcefilter.3 index c7293e05b9d..225b0209bd9 100644 --- a/lib/libc/net/sourcefilter.3 +++ b/lib/libc/net/sourcefilter.3 @@ -158,7 +158,7 @@ For the protocol-independent functions .Fn getsourcefilter and .Fn setsourcefilter , -the argument +the .Fa grouplen argument specifies the size of the structure pointed to by .Fa group . @@ -220,7 +220,7 @@ operation. .Sh SEE ALSO .Xr ip 4 , .Xr ip6 4 , -.Xr multicast 4, +.Xr multicast 4 , .Xr ifmcstat 8 .Rs .%A D. Thaler diff --git a/lib/libc/net/sourcefilter.c b/lib/libc/net/sourcefilter.c index cc0f1b971e9..4d29d9f36e0 100644 --- a/lib/libc/net/sourcefilter.c +++ b/lib/libc/net/sourcefilter.c @@ -120,7 +120,7 @@ __inaddr_to_index(in_addr_t ifaddr) psu = (sockunion_t *)ifa->ifa_addr; if (psu && psu->ss.ss_family == AF_LINK && strcmp(ifa->ifa_name, ifname) == 0) { - ifindex = psu->sdl.sdl_index; + ifindex = LLINDEX(&psu->sdl); break; } } diff --git a/lib/libc/posix1e/acl_delete_entry.3 b/lib/libc/posix1e/acl_delete_entry.3 index 3705f07baba..b1bdc5ac74b 100644 --- a/lib/libc/posix1e/acl_delete_entry.3 +++ b/lib/libc/posix1e/acl_delete_entry.3 @@ -30,7 +30,7 @@ .Os .Sh NAME .Nm acl_delete_entry , -.Nm acl_delete_entry_np , +.Nm acl_delete_entry_np .Nd delete an ACL entry from an ACL .Sh LIBRARY .Lb libc diff --git a/lib/libc/posix1e/mac_prepare.3 b/lib/libc/posix1e/mac_prepare.3 index 8e694de133b..e217b7132ef 100644 --- a/lib/libc/posix1e/mac_prepare.3 +++ b/lib/libc/posix1e/mac_prepare.3 @@ -64,7 +64,7 @@ when the label was prepared. Elements are specified in a nul-terminated string, using commas to delimit fields. Element names may be prefixed with the -.Dv ? +.Ql \&? character to indicate that a failure by the kernel to retrieve that element should not be considered fatal. .Pp diff --git a/lib/libc/powerpc/Symbol.map b/lib/libc/powerpc/Symbol.map index 14b48114a49..10b7c574e56 100644 --- a/lib/libc/powerpc/Symbol.map +++ b/lib/libc/powerpc/Symbol.map @@ -38,6 +38,10 @@ FBSD_1.0 { vfork; }; +FBSD_1.3 { + __eabi; +}; + FBSDprivate_1.0 { /* PSEUDO syscalls */ __sys_getlogin; diff --git a/lib/libc/powerpc/gen/Makefile.inc b/lib/libc/powerpc/gen/Makefile.inc index 79a274656e8..81c6a698fac 100644 --- a/lib/libc/powerpc/gen/Makefile.inc +++ b/lib/libc/powerpc/gen/Makefile.inc @@ -1,6 +1,6 @@ # $FreeBSD$ -SRCS += _ctx_start.S fabs.S flt_rounds.c fpgetmask.c fpgetround.c \ +SRCS += _ctx_start.S eabi.S fabs.S flt_rounds.c fpgetmask.c fpgetround.c \ fpgetsticky.c fpsetmask.c fpsetround.c getcontextx.c \ infinity.c ldexp.c makecontext.c _setjmp.S \ setjmp.S sigsetjmp.S signalcontext.c syncicache.c \ diff --git a/lib/libc/powerpc/gen/eabi.S b/lib/libc/powerpc/gen/eabi.S new file mode 100644 index 00000000000..59c231123f2 --- /dev/null +++ b/lib/libc/powerpc/gen/eabi.S @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2011 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +ENTRY(__eabi) + blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/rpc/auth_unix.c b/lib/libc/rpc/auth_unix.c index ff3ca7b675c..c0d25483adf 100644 --- a/lib/libc/rpc/auth_unix.c +++ b/lib/libc/rpc/auth_unix.c @@ -185,6 +185,7 @@ authunix_create(machname, uid, gid, len, aup_gids) AUTH * authunix_create_default() { + AUTH *auth; int ngids; long ngids_max; char machname[MAXHOSTNAMELEN + 1]; @@ -207,8 +208,10 @@ authunix_create_default() if (ngids > NGRPS) ngids = NGRPS; /* XXX: interface problem; those should all have been unsigned */ - return (authunix_create(machname, (int)uid, (int)gid, ngids, - (int *)gids)); + auth = authunix_create(machname, (int)uid, (int)gid, ngids, + (int *)gids); + free(gids); + return (auth); } /* diff --git a/lib/libc/rpc/publickey.3 b/lib/libc/rpc/publickey.3 index d0ad6ccda8f..ff8a615a28d 100644 --- a/lib/libc/rpc/publickey.3 +++ b/lib/libc/rpc/publickey.3 @@ -35,14 +35,14 @@ has an extra argument, which is used to decrypt the encrypted secret key stored in the database. Both routines return 1 if they are successful in finding the key, 0 otherwise. The keys are returned as -.Dv NULL Ns \-terminated , +.Dv NUL Ns \-terminated , hexadecimal strings. If the password supplied to .Fn getsecretkey fails to decrypt the secret key, the routine will return 1 but the .Fa secretkey argument will be a -.Dv NULL +.Dv NUL string .Pq Dq . .Sh SEE ALSO diff --git a/lib/libc/rpc/svc.c b/lib/libc/rpc/svc.c index 282c2be2e19..78a8ae12dfc 100644 --- a/lib/libc/rpc/svc.c +++ b/lib/libc/rpc/svc.c @@ -108,8 +108,10 @@ xprt_register(xprt) if (__svc_xports == NULL) { __svc_xports = (SVCXPRT **) mem_alloc(FD_SETSIZE * sizeof(SVCXPRT *)); - if (__svc_xports == NULL) + if (__svc_xports == NULL) { + rwlock_unlock(&svc_fd_lock); return; + } memset(__svc_xports, '\0', FD_SETSIZE * sizeof(SVCXPRT *)); } if (sock < FD_SETSIZE) { @@ -565,8 +567,14 @@ svc_xprt_alloc() SVCXPRT_EXT *ext; xprt = mem_alloc(sizeof(SVCXPRT)); + if (xprt == NULL) + return (NULL); memset(xprt, 0, sizeof(SVCXPRT)); ext = mem_alloc(sizeof(SVCXPRT_EXT)); + if (ext == NULL) { + mem_free(xprt, sizeof(SVCXPRT)); + return (NULL); + } memset(ext, 0, sizeof(SVCXPRT_EXT)); xprt->xp_p3 = ext; ext->xp_auth.svc_ah_ops = &svc_auth_null_ops; diff --git a/lib/libc/rpc/svc_raw.c b/lib/libc/rpc/svc_raw.c index 67bcba1c868..de95152a0b9 100644 --- a/lib/libc/rpc/svc_raw.c +++ b/lib/libc/rpc/svc_raw.c @@ -96,10 +96,22 @@ svc_raw_create() mutex_unlock(&svcraw_lock); return (NULL); } - if (__rpc_rawcombuf == NULL) + if (__rpc_rawcombuf == NULL) { __rpc_rawcombuf = calloc(UDPMSGSIZE, sizeof (char)); + if (__rpc_rawcombuf == NULL) { + free(srp); + mutex_unlock(&svcraw_lock); + return (NULL); + } + } srp->raw_buf = __rpc_rawcombuf; /* Share it with the client */ srp->server = svc_xprt_alloc(); + if (srp->server == NULL) { + free(__rpc_rawcombuf); + free(srp); + mutex_unlock(&svcraw_lock); + return (NULL); + } svc_raw_private = srp; } srp->server->xp_fd = FD_SETSIZE; diff --git a/lib/libc/stdio/Makefile.inc b/lib/libc/stdio/Makefile.inc index c3b60f64fbf..657005197fb 100644 --- a/lib/libc/stdio/Makefile.inc +++ b/lib/libc/stdio/Makefile.inc @@ -36,7 +36,8 @@ MAN+= fclose.3 ferror.3 fflush.3 fgetln.3 fgets.3 fgetwln.3 fgetws.3 \ fopen.3 fputs.3 \ fputws.3 fread.3 fseek.3 funopen.3 fwide.3 getc.3 \ getline.3 getwc.3 mktemp.3 \ - printf.3 putc.3 putwc.3 remove.3 scanf.3 setbuf.3 stdio.3 tmpnam.3 \ + printf.3 printf_l.3 putc.3 putwc.3 remove.3 scanf.3 scanf_l.3 setbuf.3 \ + stdio.3 tmpnam.3 \ ungetc.3 ungetwc.3 wprintf.3 wscanf.3 MLINKS+=fclose.3 fcloseall.3 @@ -63,11 +64,16 @@ MLINKS+=printf.3 asprintf.3 printf.3 dprintf.3 printf.3 fprintf.3 \ printf.3 vasprintf.3 printf.3 vdprintf.3 \ printf.3 vfprintf.3 printf.3 vprintf.3 printf.3 vsnprintf.3 \ printf.3 vsprintf.3 +MLINKS+=printf_l.3 asprintf_l.3 printf_l.3 fprintf_l.3 printf_l.3 snprintf_l.3 \ + printf_l.3 sprintf_l.3 printf_l.3 vasprintf_l.3 printf_l.3 vfprintf_l.3 \ + printf_l.3 vprintf_l.3 printf_l.3 vsnprintf_l.3 printf_l.3 vsprintf_l.3 MLINKS+=putc.3 fputc.3 putc.3 putc_unlocked.3 putc.3 putchar.3 \ putc.3 putchar_unlocked.3 putc.3 putw.3 MLINKS+=putwc.3 fputwc.3 putwc.3 putwchar.3 MLINKS+=scanf.3 fscanf.3 scanf.3 sscanf.3 scanf.3 vfscanf.3 scanf.3 vscanf.3 \ scanf.3 vsscanf.3 +MLINKS+=scanf_l.3 fscanf_l.3 scanf_l.3 sscanf_l.3 scanf_l.3 vfscanf_l.3 \ + scanf_l.3 vscanf_l.3 scanf_l.3 vsscanf_l.3 MLINKS+=setbuf.3 setbuffer.3 setbuf.3 setlinebuf.3 setbuf.3 setvbuf.3 MLINKS+=tmpnam.3 tempnam.3 tmpnam.3 tmpfile.3 MLINKS+=wprintf.3 fwprintf.3 wprintf.3 swprintf.3 \ diff --git a/lib/libc/stdio/fgets.3 b/lib/libc/stdio/fgets.3 index fba7353ac6a..278e18c4bb8 100644 --- a/lib/libc/stdio/fgets.3 +++ b/lib/libc/stdio/fgets.3 @@ -32,7 +32,7 @@ .\" @(#)fgets.3 8.1 (Berkeley) 6/4/93 .\" $FreeBSD$ .\" -.Dd June 4, 1993 +.Dd May 5, 2012 .Dt FGETS 3 .Os .Sh NAME @@ -154,5 +154,3 @@ a buffer overflow attack. It is strongly suggested that the .Fn fgets function be used in all cases. -(See -the FSA.) diff --git a/lib/libc/stdio/fgetwc.c b/lib/libc/stdio/fgetwc.c index 0e877532423..52bc988f7dc 100644 --- a/lib/libc/stdio/fgetwc.c +++ b/lib/libc/stdio/fgetwc.c @@ -59,6 +59,7 @@ fgetwc_l(FILE *fp, locale_t locale) return (r); } + wint_t fgetwc(FILE *fp) { @@ -66,40 +67,45 @@ fgetwc(FILE *fp) } /* - * Non-MT-safe version. + * Internal (non-MPSAFE) version of fgetwc(). This version takes an + * mbstate_t argument specifying the initial conversion state. For + * wide streams, this should always be fp->_mbstate. On return, *nread + * is set to the number of bytes read. */ -wint_t -__fgetwc(FILE *fp, locale_t locale) +wint_t +__fgetwc_mbs(FILE *fp, mbstate_t *mbs, int *nread, locale_t locale) { wchar_t wc; size_t nconv; struct xlocale_ctype *l = XLOCALE_CTYPE(locale); - if (fp->_r <= 0 && __srefill(fp)) + if (fp->_r <= 0 && __srefill(fp)) { + *nread = 0; return (WEOF); + } if (MB_CUR_MAX == 1) { /* Fast path for single-byte encodings. */ wc = *fp->_p++; fp->_r--; + *nread = 1; return (wc); } + *nread = 0; do { - nconv = l->__mbrtowc(&wc, fp->_p, fp->_r, &fp->_mbstate); + nconv = l->__mbrtowc(&wc, fp->_p, fp->_r, mbs); if (nconv == (size_t)-1) break; else if (nconv == (size_t)-2) continue; else if (nconv == 0) { - /* - * Assume that the only valid representation of - * the null wide character is a single null byte. - */ fp->_p++; fp->_r--; + (*nread)++; return (L'\0'); } else { fp->_p += nconv; fp->_r -= nconv; + *nread += nconv; return (wc); } } while (__srefill(fp) == 0); diff --git a/lib/libc/stdio/fpurge.c b/lib/libc/stdio/fpurge.c index 6a2c70c3c5d..148e490eafe 100644 --- a/lib/libc/stdio/fpurge.c +++ b/lib/libc/stdio/fpurge.c @@ -62,7 +62,7 @@ fpurge(fp) FREEUB(fp); fp->_p = fp->_bf._base; fp->_r = 0; - fp->_w = fp->_flags & (__SLBF|__SNBF) ? 0 : fp->_bf._size; + fp->_w = fp->_flags & (__SLBF|__SNBF|__SRD) ? 0 : fp->_bf._size; retval = 0; } FUNLOCKFILE(fp); diff --git a/lib/libc/stdio/local.h b/lib/libc/stdio/local.h index 8b37f0d0100..7168f6264d7 100644 --- a/lib/libc/stdio/local.h +++ b/lib/libc/stdio/local.h @@ -56,7 +56,7 @@ extern int _ftello(FILE *, fpos_t *); extern int _fseeko(FILE *, off_t, int, int); extern int __fflush(FILE *fp); extern void __fcloseall(void); -extern wint_t __fgetwc(FILE *, locale_t); +extern wint_t __fgetwc_mbs(FILE *, mbstate_t *, int *, locale_t); extern wint_t __fputwc(wchar_t, FILE *, locale_t); extern int __sflush(FILE *); extern FILE *__sfp(void); @@ -85,6 +85,13 @@ extern size_t __fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp); extern int __sdidinit; +static inline wint_t +__fgetwc(FILE *fp, locale_t locale) +{ + int nread; + + return (__fgetwc_mbs(fp, &fp->_mbstate, &nread, locale)); +} /* * Prepare the given FILE for writing, and return 0 iff it diff --git a/lib/libc/stdio/printf_l.3 b/lib/libc/stdio/printf_l.3 new file mode 100644 index 00000000000..20c855b0d53 --- /dev/null +++ b/lib/libc/stdio/printf_l.3 @@ -0,0 +1,80 @@ +.\" Copyright (c) 2012 Isabell Long +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd April 7, 2012 +.Dt PRINTF_L 3 +.Os +.Sh NAME +.Nm printf_l , +.Nm asprintf_l , +.Nm fprintf_l , +.Nm snprintf_l , +.Nm sprintf_l , +.Nm vasprintf_l , +.Nm vfprintf_l , +.Nm vprintf_l , +.Nm vsnprintf_l , +.Nm vsprintf_l +.Nd formatted output conversion +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In stdio.h +.Ft int +.Fn printf_l "locale_t loc" "const char * restrict format" "..." +.Ft int +.Fn asprintf_l "char **ret" "locale_t loc" "const char * format" "..." +.Ft int +.Fn fprintf_l "FILE * restrict stream" "locale_t loc" "const char * restrict format" "..." +.Ft int +.Fn snprintf_l "char * restrict str" "size_t size" "locale_t loc" "const char * restrict format" "..." +.Ft int +.Fn sprintf_l "char * restrict str" "locale_t loc" "const char * restrict format" "..." +.Ft int +.Fn vasprintf_l "char **ret" "locale_t loc" "const char *format" "va_list ap" +.Ft int +.Fn vfprintf_l "FILE * restrict stream" "locale_t loc" "const char * restrict format" "va_list ap" +.Ft int +.Fn vprintf_l "locale_t loc" "const char * restrict format" "va_list ap" +.Ft int +.Fn vsnprintf_l "char * restrict str" "size_t size" "locale_t loc" "const char * restrict format" "va_list ap" +.Ft int +.Fn vsprintf_l "char * restrict str" "locale_t loc" "const char * restrict format" "va_list ap" +.Sh DESCRIPTION +The above functions are used to convert formatted output in the locale +.Fa loc . +They behave in the same way as the versions without the _l suffix, but use +the specified locale rather than the global or per-thread locale. +See the specific manual pages for more information. +.Sh SEE ALSO +.Xr printf 3 , +.Xr xlocale 3 +.Sh STANDARDS +These functions do not conform to any specific standard so they should be +considered as non-portable local extensions. +.Sh HISTORY +These functions first appeared in Darwin and were first implemented in +.Fx 9.1 . diff --git a/lib/libc/stdio/scanf.3 b/lib/libc/stdio/scanf.3 index 319455a5fca..8a8666ccfaa 100644 --- a/lib/libc/stdio/scanf.3 +++ b/lib/libc/stdio/scanf.3 @@ -370,10 +370,10 @@ The string is to be made up of characters in (or not in) a particular set; the set is defined by the characters between the open bracket -.Cm [ +.Cm \&[ character and a close bracket -.Cm ] +.Cm \&] character. The set .Em excludes diff --git a/lib/libc/stdio/scanf_l.3 b/lib/libc/stdio/scanf_l.3 new file mode 100644 index 00000000000..04ea5d942d3 --- /dev/null +++ b/lib/libc/stdio/scanf_l.3 @@ -0,0 +1,70 @@ +.\" Copyright (c) 2012 Isabell Long +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd April 8, 2012 +.Dt SCANF_L 3 +.Os +.Sh NAME +.Nm scanf_l , +.Nm fscanf_l , +.Nm sscanf_l , +.Nm vfscanf_l , +.Nm vscanf_l , +.Nm vsscanf_l +.Nd input format conversion +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In stdio.h +.Ft int +.Fn scanf_l "locale_t loc" "const char * restrict format" "..." +.Ft int +.Fn fscanf_l "FILE * restrict stream" "locale_t loc" "const char * restrict format" "..." +.Ft int +.Fn sscanf_l "const char * restrict str" "locale_t loc" "const char * restrict format" "..." +.Ft int +.Fn vfscanf_l "FILE * restrict stream" "locale_t loc" "const char * restrict format" "va_list ap" +.Ft int +.Fn vscanf_l "locale_t loc" "const char * restrict format" "va_list ap" +.Ft int +.Fn vsscanf_l "const char * restrict str" "locale_t loc" "const char * restrict format" "va_list ap" +.Sh DESCRIPTION +The above functions scan input according to a specified +.Fa format +in the locale +.Fa loc . +They behave in the same way as the versions without the _l suffix, but use +the specific locale rather than the the global or per-thread locale. +See the specific manual pages for more information. +.Sh SEE ALSO +.Xr scanf 3 , +.Xr xlocale 3 +.Sh STANDARDS +These functions do not conform to any specific standard so they should be +considered as non-portable local extensions. +.Sh HISTORY +These functions first appeared in Darwin and were first implemented in +.Fx 9.1 . diff --git a/lib/libc/stdio/setbuf.3 b/lib/libc/stdio/setbuf.3 index be8803404b8..2eda0e62b15 100644 --- a/lib/libc/stdio/setbuf.3 +++ b/lib/libc/stdio/setbuf.3 @@ -83,6 +83,9 @@ normally does) it is line buffered. The standard error stream .Dv stderr is always unbuffered. +Note that these defaults may be altered using the +.Xr stdbuf 1 +utility. .Pp The .Fn setvbuf @@ -177,6 +180,7 @@ function returns what the equivalent .Fn setvbuf would have returned. .Sh SEE ALSO +.Xr stdbuf 1 , .Xr fclose 3 , .Xr fopen 3 , .Xr fread 3 , diff --git a/lib/libc/stdio/vfscanf.c b/lib/libc/stdio/vfscanf.c index 6a6b19ccb80..8f9d3d0e32c 100644 --- a/lib/libc/stdio/vfscanf.c +++ b/lib/libc/stdio/vfscanf.c @@ -125,11 +125,10 @@ static const mbstate_t initial_mbs; */ static __inline int -convert_char(FILE *fp, char * __restrict p, int width) +convert_char(FILE *fp, char * p, int width) { - int n, nread; + int n; - nread = 0; if (p == SUPPRESS_PTR) { size_t sum = 0; for (;;) { @@ -149,63 +148,38 @@ convert_char(FILE *fp, char * __restrict p, int width) break; } } - nread += sum; + return (sum); } else { size_t r = __fread(p, 1, width, fp); - + if (r == 0) return (-1); - nread += r; + return (r); } - return (nread); } static __inline int -convert_wchar(FILE *fp, wchar_t *wcp, int width) +convert_wchar(FILE *fp, wchar_t *wcp, int width, locale_t locale) { mbstate_t mbs; - size_t nconv; int n, nread; - char buf[MB_CUR_MAX]; + wint_t wi; - nread = 0; + mbs = initial_mbs; n = 0; - while (width != 0) { - if (n == MB_CUR_MAX) { - fp->_flags |= __SERR; - return (-1); - } - buf[n++] = *fp->_p; - fp->_p++; - fp->_r--; - mbs = initial_mbs; - nconv = mbrtowc(wcp, buf, n, &mbs); - if (nconv == (size_t)-1) { - fp->_flags |= __SERR; - return (-1); - } - if (nconv == 0 && wcp != SUPPRESS_PTR) - *wcp = L'\0'; - if (nconv != (size_t)-2) { - nread += n; - width--; - if (wcp != SUPPRESS_PTR) - wcp++; - n = 0; - } - if (fp->_r <= 0 && __srefill(fp)) { - if (n != 0) { - fp->_flags |= __SERR; - return (-1); - } - break; - } + while (width-- != 0 && + (wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF) { + if (wcp != SUPPRESS_PTR) + *wcp++ = (wchar_t)wi; + n += nread; } - return (nread); + if (n == 0) + return (-1); + return (n); } static __inline int -convert_ccl(FILE *fp, char * __restrict p, int width, const char *ccltab) +convert_ccl(FILE *fp, char * p, int width, const char *ccltab) { char *p0; int n; @@ -244,67 +218,38 @@ convert_ccl(FILE *fp, char * __restrict p, int width, const char *ccltab) } static __inline int -convert_wccl(FILE *fp, wchar_t *wcp, int width, const char *ccltab) +convert_wccl(FILE *fp, wchar_t *wcp, int width, const char *ccltab, + locale_t locale) { mbstate_t mbs; - wchar_t twc; - int n, nchars, nconv; - char buf[MB_CUR_MAX]; + wint_t wi; + int n, nread; - if (wcp == SUPPRESS_PTR) - wcp = &twc; + mbs = initial_mbs; n = 0; - nchars = 0; - while (width != 0) { - if (n == MB_CUR_MAX) { - fp->_flags |= __SERR; - return (-1); - } - buf[n++] = *fp->_p; - fp->_p++; - fp->_r--; - mbs = initial_mbs; - nconv = mbrtowc(wcp, buf, n, &mbs); - if (nconv == (size_t)-1) { - fp->_flags |= __SERR; - return (-1); - } - if (nconv == 0) - *wcp = L'\0'; - if (nconv != (size_t)-2) { - if (wctob(*wcp) != EOF && !ccltab[wctob(*wcp)]) { - while (n != 0) { - n--; - __ungetc(buf[n], fp); - } - break; - } - width--; - if (wcp != &twc) - wcp++; - nchars++; - n = 0; - } - if (fp->_r <= 0 && __srefill(fp)) { - if (n != 0) { - fp->_flags |= __SERR; - return (-1); - } - break; + if (wcp == SUPPRESS_PTR) { + while ((wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF && + width-- != 0 && ccltab[wctob(wi)]) + n += nread; + if (wi != WEOF) + __ungetwc(wi, fp, __get_locale()); + } else { + while ((wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF && + width-- != 0 && ccltab[wctob(wi)]) { + *wcp++ = (wchar_t)wi; + n += nread; } + if (wi != WEOF) + __ungetwc(wi, fp, __get_locale()); + if (n == 0) + return (0); + *wcp = 0; } - if (n != 0) { - fp->_flags |= __SERR; - return (-1); - } - if (nchars == 0) - return (0); - *wcp = L'\0'; - return (nchars); + return (n); } static __inline int -convert_string(FILE *fp, char * __restrict p, int width) +convert_string(FILE *fp, char * p, int width) { char *p0; int n; @@ -335,56 +280,31 @@ convert_string(FILE *fp, char * __restrict p, int width) } static __inline int -convert_wstring(FILE *fp, wchar_t *wcp, int width) +convert_wstring(FILE *fp, wchar_t *wcp, int width, locale_t locale) { mbstate_t mbs; - wchar_t twc; - int n, nconv, nread; - char buf[MB_CUR_MAX]; + wint_t wi; + int n, nread; - if (wcp == SUPPRESS_PTR) - wcp = &twc; - n = nread = 0; - while (!isspace(*fp->_p) && width != 0) { - if (n == MB_CUR_MAX) { - fp->_flags |= __SERR; - return (-1); - } - buf[n++] = *fp->_p; - fp->_p++; - fp->_r--; - mbs = initial_mbs; - nconv = mbrtowc(wcp, buf, n, &mbs); - if (nconv == (size_t)-1) { - fp->_flags |= __SERR; - return (-1); - } - if (nconv == 0) - *wcp = L'\0'; - if (nconv != (size_t)-2) { - if (iswspace(*wcp)) { - while (n != 0) { - n--; - __ungetc(buf[n], fp); - } - break; - } - nread += n; - width--; - if (wcp != &twc) - wcp++; - n = 0; - } - if (fp->_r <= 0 && __srefill(fp)) { - if (n != 0) { - fp->_flags |= __SERR; - return (-1); - } - break; + mbs = initial_mbs; + n = 0; + if (wcp == SUPPRESS_PTR) { + while ((wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF && + width-- != 0 && !iswspace(wi)) + n += nread; + if (wi != WEOF) + __ungetwc(wi, fp, __get_locale()); + } else { + while ((wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF && + width-- != 0 && !iswspace(wi)) { + *wcp++ = (wchar_t)wi; + n += nread; } + if (wi != WEOF) + __ungetwc(wi, fp, __get_locale()); + *wcp = '\0'; } - *wcp = L'\0'; - return (nread); + return (n); } /* @@ -467,7 +387,7 @@ parseint(FILE *fp, char * __restrict buf, int width, int base, int flags) goto ok; } break; - + /* * x ok iff flag still set & 2nd char (or 3rd char if * we have a sign). @@ -766,7 +686,7 @@ literal: width = 1; if (flags & LONG) { nr = convert_wchar(fp, GETARG(wchar_t *), - width); + width, locale); } else { nr = convert_char(fp, GETARG(char *), width); } @@ -780,7 +700,7 @@ literal: width = (size_t)~0; /* `infinity' */ if (flags & LONG) { nr = convert_wccl(fp, GETARG(wchar_t *), width, - ccltab); + ccltab, locale); } else { nr = convert_ccl(fp, GETARG(char *), width, ccltab); @@ -799,7 +719,7 @@ literal: width = (size_t)~0; if (flags & LONG) { nr = convert_wstring(fp, GETARG(wchar_t *), - width); + width, locale); } else { nr = convert_string(fp, GETARG(char *), width); } diff --git a/lib/libc/stdio/vfwscanf.c b/lib/libc/stdio/vfwscanf.c index 6b4d8c59b49..28e2c036439 100644 --- a/lib/libc/stdio/vfwscanf.c +++ b/lib/libc/stdio/vfwscanf.c @@ -138,35 +138,22 @@ static const mbstate_t initial_mbs; */ static __inline int -convert_char(FILE *fp, char * __restrict mbp, int width, locale_t locale) +convert_char(FILE *fp, char * mbp, int width, locale_t locale) { mbstate_t mbs; size_t nconv; wint_t wi; int n; - char mbbuf[MB_LEN_MAX]; n = 0; mbs = initial_mbs; - while (width != 0 && (wi = __fgetwc(fp, locale)) != WEOF) { - if (width >= MB_CUR_MAX && mbp != SUPPRESS_PTR) { + while (width-- != 0 && (wi = __fgetwc(fp, locale)) != WEOF) { + if (mbp != SUPPRESS_PTR) { nconv = wcrtomb(mbp, wi, &mbs); if (nconv == (size_t)-1) return (-1); - } else { - nconv = wcrtomb(mbbuf, wi, &mbs); - if (nconv == (size_t)-1) - return (-1); - if (nconv > width) { - __ungetwc(wi, fp, locale); - break; - } - if (mbp != SUPPRESS_PTR) - memcpy(mbp, mbbuf, nconv); - } - if (mbp != SUPPRESS_PTR) mbp += nconv; - width -= nconv; + } n++; } if (n == 0) @@ -192,35 +179,24 @@ convert_wchar(FILE *fp, wchar_t *wcp, int width, locale_t locale) } static __inline int -convert_ccl(FILE *fp, char * __restrict mbp, int width, const struct ccl *ccl, +convert_ccl(FILE *fp, char * mbp, int width, const struct ccl *ccl, locale_t locale) { mbstate_t mbs; size_t nconv; wint_t wi; int n; - char mbbuf[MB_LEN_MAX]; n = 0; mbs = initial_mbs; while ((wi = __fgetwc(fp, locale)) != WEOF && - width != 0 && inccl(ccl, wi)) { - if (width >= MB_CUR_MAX && mbp != SUPPRESS_PTR) { + width-- != 0 && inccl(ccl, wi)) { + if (mbp != SUPPRESS_PTR) { nconv = wcrtomb(mbp, wi, &mbs); if (nconv == (size_t)-1) return (-1); - } else { - nconv = wcrtomb(mbbuf, wi, &mbs); - if (nconv == (size_t)-1) - return (-1); - if (nconv > width) - break; - if (mbp != SUPPRESS_PTR) - memcpy(mbp, mbbuf, nconv); - } - if (mbp != SUPPRESS_PTR) mbp += nconv; - width -= nconv; + } n++; } if (wi != WEOF) @@ -261,34 +237,23 @@ convert_wccl(FILE *fp, wchar_t *wcp, int width, const struct ccl *ccl, } static __inline int -convert_string(FILE *fp, char * __restrict mbp, int width, locale_t locale) +convert_string(FILE *fp, char * mbp, int width, locale_t locale) { mbstate_t mbs; size_t nconv; wint_t wi; int nread; - char mbbuf[MB_LEN_MAX]; mbs = initial_mbs; nread = 0; - while ((wi = __fgetwc(fp, locale)) != WEOF && width != 0 && + while ((wi = __fgetwc(fp, locale)) != WEOF && width-- != 0 && !iswspace(wi)) { - if (width >= MB_CUR_MAX && mbp != SUPPRESS_PTR) { + if (mbp != SUPPRESS_PTR) { nconv = wcrtomb(mbp, wi, &mbs); if (nconv == (size_t)-1) return (-1); - } else { - nconv = wcrtomb(mbbuf, wi, &mbs); - if (nconv == (size_t)-1) - return (-1); - if (nconv > width) - break; - if (mbp != SUPPRESS_PTR) - memcpy(mbp, mbbuf, nconv); - } - if (mbp != SUPPRESS_PTR) mbp += nconv; - width -= nconv; + } nread++; } if (wi != WEOF) @@ -407,7 +372,7 @@ parseint(FILE *fp, wchar_t *buf, int width, int base, int flags, goto ok; } break; - + /* * x ok iff flag still set & 2nd char (or 3rd char if * we have a sign). diff --git a/lib/libc/stdio/wscanf.3 b/lib/libc/stdio/wscanf.3 index f696d3d6444..1dda777f1b5 100644 --- a/lib/libc/stdio/wscanf.3 +++ b/lib/libc/stdio/wscanf.3 @@ -365,10 +365,10 @@ The string is to be made up of characters in (or not in) a particular set; the set is defined by the characters between the open bracket -.Cm [ +.Cm \&[ character and a close bracket -.Cm ] +.Cm \&] character. The set .Em excludes diff --git a/lib/libc/stdio/xprintf.c b/lib/libc/stdio/xprintf.c index 0cc8571550b..b00b4cb3e43 100644 --- a/lib/libc/stdio/xprintf.c +++ b/lib/libc/stdio/xprintf.c @@ -651,7 +651,7 @@ register_printf_render(int spec, printf_render *render, printf_arginfo_function } int -register_printf_render_std(const unsigned char *specs) +register_printf_render_std(const char *specs) { for (; *specs != '\0'; specs++) { diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makefile.inc index 7fdb6e42dd7..75204f59443 100644 --- a/lib/libc/stdlib/Makefile.inc +++ b/lib/libc/stdlib/Makefile.inc @@ -42,6 +42,7 @@ MLINKS+=rand.3 rand_r.3 rand.3 srand.3 rand.3 sranddev.3 MLINKS+=random.3 initstate.3 random.3 setstate.3 random.3 srandom.3 \ random.3 srandomdev.3 MLINKS+=radixsort.3 sradixsort.3 +MLINKS+=strfmon.3 strfmon_l.3 MLINKS+=strtod.3 strtof.3 strtod.3 strtold.3 MLINKS+=strtol.3 strtoll.3 strtol.3 strtoq.3 strtol.3 strtoimax.3 MLINKS+=strtoul.3 strtoull.3 strtoul.3 strtouq.3 strtoul.3 strtoumax.3 diff --git a/lib/libc/stdlib/getenv.3 b/lib/libc/stdlib/getenv.3 index bc87b9d54cb..19496489457 100644 --- a/lib/libc/stdlib/getenv.3 +++ b/lib/libc/stdlib/getenv.3 @@ -152,7 +152,8 @@ failed because is a .Dv NULL pointer, -.Fa string is without an +.Fa string +is without an .Dq Li \&= character or .Dq Li \&= diff --git a/lib/libc/stdlib/getopt_long.c b/lib/libc/stdlib/getopt_long.c index bf7a04a2ee8..9f7f6d5ae73 100644 --- a/lib/libc/stdlib/getopt_long.c +++ b/lib/libc/stdlib/getopt_long.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getopt_long.c,v 1.21 2006/09/22 17:22:05 millert Exp $ */ +/* $OpenBSD: getopt_long.c,v 1.22 2006/10/04 21:29:04 jmc Exp $ */ /* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ /* @@ -35,13 +35,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/lib/libc/stdlib/realpath.3 b/lib/libc/stdlib/realpath.3 index fec5258eae1..c7384d60703 100644 --- a/lib/libc/stdlib/realpath.3 +++ b/lib/libc/stdlib/realpath.3 @@ -31,7 +31,7 @@ .\" @(#)realpath.3 8.2 (Berkeley) 2/16/94 .\" $FreeBSD$ .\" -.Dd April 19, 2010 +.Dd May 11, 2012 .Dt REALPATH 3 .Os .Sh NAME @@ -40,7 +40,6 @@ .Sh LIBRARY .Lb libc .Sh SYNOPSIS -.In sys/param.h .In stdlib.h .Ft "char *" .Fn realpath "const char *pathname" "char *resolved_path" @@ -72,11 +71,12 @@ The function will resolve both absolute and relative paths and return the absolute pathname corresponding to .Fa pathname . -All but the last component of +All components of .Fa pathname must exist when .Fn realpath -is called. +is called, and all but the last component must name either directories or +symlinks pointing to the directories. .Sh "RETURN VALUES" The .Fn realpath diff --git a/lib/libc/stdlib/realpath.c b/lib/libc/stdlib/realpath.c index 2c9562ea6e0..aded9b244e7 100644 --- a/lib/libc/stdlib/realpath.c +++ b/lib/libc/stdlib/realpath.c @@ -54,7 +54,7 @@ realpath(const char * __restrict path, char * __restrict resolved) char *p, *q, *s; size_t left_len, resolved_len; unsigned symlinks; - int m, serrno, slen; + int m, slen; char left[PATH_MAX], next_token[PATH_MAX], symlink[PATH_MAX]; if (path == NULL) { @@ -65,7 +65,6 @@ realpath(const char * __restrict path, char * __restrict resolved) errno = ENOENT; return (NULL); } - serrno = errno; if (resolved == NULL) { resolved = malloc(PATH_MAX); if (resolved == NULL) @@ -132,8 +131,29 @@ realpath(const char * __restrict path, char * __restrict resolved) resolved[resolved_len++] = '/'; resolved[resolved_len] = '\0'; } - if (next_token[0] == '\0') + if (next_token[0] == '\0') { + /* + * Handle consequential slashes. The path + * before slash shall point to a directory. + * + * Only the trailing slashes are not covered + * by other checks in the loop, but we verify + * the prefix for any (rare) "//" or "/\0" + * occurence to not implement lookahead. + */ + if (lstat(resolved, &sb) != 0) { + if (m) + free(resolved); + return (NULL); + } + if (!S_ISDIR(sb.st_mode)) { + if (m) + free(resolved); + errno = ENOTDIR; + return (NULL); + } continue; + } else if (strcmp(next_token, ".") == 0) continue; else if (strcmp(next_token, "..") == 0) { @@ -151,9 +171,7 @@ realpath(const char * __restrict path, char * __restrict resolved) } /* - * Append the next path component and lstat() it. If - * lstat() fails we still can return successfully if - * there are no more path components left. + * Append the next path component and lstat() it. */ resolved_len = strlcat(resolved, next_token, PATH_MAX); if (resolved_len >= PATH_MAX) { @@ -163,10 +181,8 @@ realpath(const char * __restrict path, char * __restrict resolved) return (NULL); } if (lstat(resolved, &sb) != 0) { - if (errno == ENOENT && p == NULL) { - errno = serrno; - return (resolved); - } + if (errno != ENOENT || p != NULL) + errno = ENOTDIR; if (m) free(resolved); return (NULL); diff --git a/lib/libc/stdlib/strfmon.3 b/lib/libc/stdlib/strfmon.3 index 11b8e211bf6..f82dfa30290 100644 --- a/lib/libc/stdlib/strfmon.3 +++ b/lib/libc/stdlib/strfmon.3 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 12, 2002 +.Dd June 25, 2012 .Dt STRFMON 3 .Os .Sh NAME @@ -36,6 +36,8 @@ .In monetary.h .Ft ssize_t .Fn strfmon "char * restrict s" "size_t maxsize" "const char * restrict format" "..." +.Ft ssize_t +.Fn strfmon_l "char * restrict s" "size_t maxsize" "locale_t loc" "const char * restrict format" "..." .Sh DESCRIPTION The .Fn strfmon @@ -47,6 +49,12 @@ No more than .Fa maxsize bytes are placed into the array. .Pp +The +.Fn strfmon_l +function does the same as +.Fn strfmon +but takes an explicit locale rather than using the current locale. +.Pp The format string is composed of zero or more directives: ordinary characters (not .Cm % ) , @@ -115,20 +123,25 @@ character is written. .El .Sh RETURN VALUES If the total number of resulting bytes including the terminating -.Dv NULL +.Dv NUL byte is not more than .Fa maxsize , .Fn strfmon returns the number of bytes placed into the array pointed to by .Fa s , not including the terminating -.Dv NULL +.Dv NUL byte. Otherwise, \-1 is returned, the contents of the array are indeterminate, and .Va errno is set to indicate the error. +.Pp +The +.Fn strfmon_l +function returns the same values as +.Fn strfmon . .Sh ERRORS The .Fn strfmon @@ -149,6 +162,10 @@ The function conforms to .St -p1003.1-2001 . +The +.Fn strfmon_l +function conforms to +.St -p1003.1-2008 . .Sh AUTHORS .An -nosplit The diff --git a/lib/libc/stdtime/Makefile.inc b/lib/libc/stdtime/Makefile.inc index a039bc9ab9a..0cc038afcdf 100644 --- a/lib/libc/stdtime/Makefile.inc +++ b/lib/libc/stdtime/Makefile.inc @@ -18,4 +18,6 @@ MLINKS+=ctime.3 asctime.3 ctime.3 difftime.3 ctime.3 gmtime.3 \ ctime.3 localtime.3 ctime.3 mktime.3 ctime.3 timegm.3 \ ctime.3 ctime_r.3 ctime.3 localtime_r.3 ctime.3 gmtime_r.3 \ ctime.3 asctime_r.3 +MLINKS+=strftime.3 strftime_l.3 +MLINKS+=strptime.3 strptime_l.3 MLINKS+=time2posix.3 posix2time.3 diff --git a/lib/libc/stdtime/strftime.3 b/lib/libc/stdtime/strftime.3 index d5cdd7dc563..0ed023b2cb3 100644 --- a/lib/libc/stdtime/strftime.3 +++ b/lib/libc/stdtime/strftime.3 @@ -32,7 +32,7 @@ .\" @(#)strftime.3 8.1 (Berkeley) 6/4/93 .\" $FreeBSD$ .\" -.Dd November 4, 2004 +.Dd June 25, 2012 .Dt STRFTIME 3 .Os .Sh NAME @@ -49,6 +49,8 @@ .Fa "const char * restrict format" .Fa "const struct tm * restrict timeptr" .Fc +.Ft size_t +.Fn strftime_l "char *restrict buf" "size_t maxsize" "const char * restrict format" "const struct tm *restrict timeptr" "locale_t loc" .Sh DESCRIPTION The .Fn strftime @@ -58,6 +60,11 @@ into the buffer .Fa buf according to the string pointed to by .Fa format . +The function +.Fn strftime_l +does the same as +.Fn strftime +but takes an explicit locale rather than using the current locale. .Pp The .Fa format @@ -268,6 +275,10 @@ The peculiar week number and year in the replacements of and .Ql \&%V are defined in ISO 8601: 1988. +The +.Fn strftime_l +function conforms to +.St -p1003.1-2008 . .Sh BUGS There is no conversion specification for the phase of the moon. .Pp diff --git a/lib/libc/stdtime/strftime.c b/lib/libc/stdtime/strftime.c index d3571ad3621..4ad0bc4352a 100644 --- a/lib/libc/stdtime/strftime.c +++ b/lib/libc/stdtime/strftime.c @@ -67,7 +67,7 @@ extern char * tzname[]; #define PAD_SPACE 2 #define PAD_ZERO 3 -static const char* fmt_padding[][4] = { +static const char fmt_padding[][4][5] = { /* DEFAULT, LESS, SPACE, ZERO */ #define PAD_FMT_MONTHDAY 0 #define PAD_FMT_HMS 0 diff --git a/lib/libc/stdtime/strptime.3 b/lib/libc/stdtime/strptime.3 index 763696b0b4c..34d2b791e70 100644 --- a/lib/libc/stdtime/strptime.3 +++ b/lib/libc/stdtime/strptime.3 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" " -.Dd January 4, 2003 +.Dd June 25, 2012 .Dt STRPTIME 3 .Os .Sh NAME @@ -41,6 +41,10 @@ .Fa "const char * restrict format" .Fa "struct tm * restrict timeptr" .Fc +.In time.h +.In xlocale.h +.Ft char * +.Fn strptime_l "const char * restrict buf" "const char * restrict format" "struct tm * restrict timeptr" "locale_t loc" .Sh DESCRIPTION The .Fn strptime @@ -53,6 +57,11 @@ and fills in the elements of the structure pointed to by The resulting values will be relative to the local time zone. Thus, it can be considered the reverse operation of .Xr strftime 3 . +The +.Fn strptime_l +function does the same as +.Fn strptime , +but takes an explicit locale rather than using the current locale. .Pp The .Fa format @@ -104,6 +113,9 @@ that has not been required to satisfy the specified conversions in It returns .Dv NULL if one of the conversions failed. +.Fn strptime_l +returns the same values as +.Fn strptime . .Sh SEE ALSO .Xr date 1 , .Xr scanf 3 , diff --git a/lib/libc/string/Makefile.inc b/lib/libc/string/Makefile.inc index 1dbe3172ef1..cd06fc89968 100644 --- a/lib/libc/string/Makefile.inc +++ b/lib/libc/string/Makefile.inc @@ -42,10 +42,13 @@ MLINKS+=ffs.3 ffsl.3 \ ffs.3 flsll.3 MLINKS+=index.3 rindex.3 MLINKS+=memchr.3 memrchr.3 -MLINKS+=strcasecmp.3 strncasecmp.3 +MLINKS+=strcasecmp.3 strncasecmp.3 \ + strcasecmp.3 strcasecmp_l.3 \ + strcasecmp.3 strncasecmp_l.3 MLINKS+=strcat.3 strncat.3 MLINKS+=strchr.3 strrchr.3 MLINKS+=strcmp.3 strncmp.3 +MLINKS+=strcoll.3 strcoll_l.3 MLINKS+=strcpy.3 stpcpy.3 \ strcpy.3 stpncpy.3 \ strcpy.3 strncpy.3 @@ -57,8 +60,10 @@ MLINKS+=strerror.3 perror.3 \ MLINKS+=strlcpy.3 strlcat.3 MLINKS+=strlen.3 strnlen.3 MLINKS+=strstr.3 strcasestr.3 \ - strstr.3 strnstr.3 + strstr.3 strnstr.3 \ + strstr.3 strcasestr_l.3 MLINKS+=strtok.3 strtok_r.3 +MLINKS+=strxfrm.3 strxfrm_l.3 MLINKS+=wmemchr.3 wcpcpy.3 \ wmemchr.3 wcpncpy.3 \ wmemchr.3 wcscasecmp.3 \ diff --git a/lib/libc/string/strcasecmp.3 b/lib/libc/string/strcasecmp.3 index 2b2ef3e4674..760b9d40272 100644 --- a/lib/libc/string/strcasecmp.3 +++ b/lib/libc/string/strcasecmp.3 @@ -45,6 +45,12 @@ .Fn strcasecmp "const char *s1" "const char *s2" .Ft int .Fn strncasecmp "const char *s1" "const char *s2" "size_t len" +.In string.h +.In xlocale.h +.Ft int +.Fn strcasecmp_l "const char *s1" "const char *s2" "locale_t loc" +.Ft int +.Fn strncasecmp_l "const char *s1" "const char *s2" "site_t len" "locale_t loc" .Sh DESCRIPTION The .Fn strcasecmp @@ -58,16 +64,22 @@ and .Pp The .Fn strncasecmp -compares at most +function compares at most .Fa len characters. -.Sh RETURN VALUES The +.Fn strcasecmp_l +and +.Fn strncasecmp_l +functions do the same as their non-locale versions above, but take an +explicit locale rather than using the current locale. +.Sh RETURN VALUES +The functions .Fn strcasecmp and .Fn strncasecmp return an integer greater than, equal to, or less than 0, -according as +depending on whether .Fa s1 is lexicographically greater than, equal to, or less than .Fa s2 @@ -77,6 +89,11 @@ The comparison is done using unsigned characters, so that .Sq Li \e200 is greater than .Ql \e0 . +The functions +.Fn strcasecmp_l +and +.Fn strncasecmp_l +do the same but take explicit locales. .Sh SEE ALSO .Xr bcmp 3 , .Xr memcmp 3 , diff --git a/lib/libc/string/strcoll.3 b/lib/libc/string/strcoll.3 index bb8b13fe5c0..20f188896ad 100644 --- a/lib/libc/string/strcoll.3 +++ b/lib/libc/string/strcoll.3 @@ -44,6 +44,8 @@ .In string.h .Ft int .Fn strcoll "const char *s1" "const char *s2" +.Ft int +.Fn strcoll_l "const char *s1" "const char *s2" "locale_t loc" .Sh DESCRIPTION The .Fn strcoll @@ -54,7 +56,7 @@ and .Fa s2 according to the current locale collation and returns an integer greater than, equal to, or less than 0, -according as +depending on whether .Fa s1 is greater than, equal to, or less than .Fa s2 . @@ -62,6 +64,9 @@ If information about the current locale collation is not available, the value of .Fn strcmp s1 s2 is returned. +The +.Fn strcoll_l +function uses an explicit locale argument rather than the system locale. .Sh SEE ALSO .Xr setlocale 3 , .Xr strcmp 3 , @@ -70,6 +75,9 @@ is returned. .Sh STANDARDS The .Fn strcoll -function -conforms to +function conforms to .St -isoC . +The +.Fn strcoll_l +function conforms to +.St -p1003.1-2008 . diff --git a/lib/libc/string/strlcpy.3 b/lib/libc/string/strlcpy.3 index 19d36211853..9ad663a23e8 100644 --- a/lib/libc/string/strlcpy.3 +++ b/lib/libc/string/strlcpy.3 @@ -169,7 +169,7 @@ if (strlcat(pname, file, sizeof(pname)) >= sizeof(pname)) .Ed .Pp Since it is known how many characters were copied the first time, things -can be sped up a bit by using a copy instead of an append +can be sped up a bit by using a copy instead of an append. .Bd -literal -offset indent char *dir, *file, pname[MAXPATHLEN]; size_t n; diff --git a/lib/libc/string/strstr.3 b/lib/libc/string/strstr.3 index 74ebdff2718..376def6f236 100644 --- a/lib/libc/string/strstr.3 +++ b/lib/libc/string/strstr.3 @@ -49,6 +49,10 @@ .Fn strcasestr "const char *big" "const char *little" .Ft char * .Fn strnstr "const char *big" "const char *little" "size_t len" +.In string.h +.In xlocale.h +.Ft char * +.Fn strcasestr_l "const char *big" "const char *little" "locale_t loc" .Sh DESCRIPTION The .Fn strstr @@ -65,6 +69,12 @@ function is similar to but ignores the case of both strings. .Pp The +.Fn strcasestr_l +function does the same as +.Fn strcasestr +but takes an explicit locale rather than using the current locale. +.Pp +The .Fn strnstr function locates the first occurrence of the null-terminated string diff --git a/lib/libc/string/strxfrm.3 b/lib/libc/string/strxfrm.3 index 5f33763a22e..da7c82ada5c 100644 --- a/lib/libc/string/strxfrm.3 +++ b/lib/libc/string/strxfrm.3 @@ -44,6 +44,8 @@ .In string.h .Ft size_t .Fn strxfrm "char * restrict dst" "const char * restrict src" "size_t n" +.Ft size_t +.Fn strxfrm_l "char * restrict dst" "const char *restrict src" "size_t n" "locale_t loc" .Sh DESCRIPTION The .Fn strxfrm @@ -73,10 +75,16 @@ after is equal to comparing two original strings with .Fn strcoll . +.Pp +.Fn strxfrm_l +does the same, however takes an explicit locale rather than the global +locale. .Sh RETURN VALUES Upon successful completion, .Fn strxfrm -returns the length of the transformed string not including +and +.Fn strxfrm_l +return the length of the transformed string not including the terminating null character. If this value is .Fa n @@ -94,3 +102,7 @@ The function conforms to .St -isoC . +The +.Fn strxfrm_l +function conforms to +.St -p1003.1-2008 . diff --git a/lib/libc/sys/Makefile.inc b/lib/libc/sys/Makefile.inc index 61d1713193e..df4ef427940 100644 --- a/lib/libc/sys/Makefile.inc +++ b/lib/libc/sys/Makefile.inc @@ -15,6 +15,10 @@ # .sinclude "${.CURDIR}/${LIBC_ARCH}/sys/Makefile.inc" +SRCS+= clock_gettime.c gettimeofday.c __vdso_gettimeofday.c +NOASM+= clock_gettime.o gettimeofday.o +PSEUDO+= _clock_gettime.o _gettimeofday.o + # Sources common to both syscall interfaces: SRCS+= stack_protector.c stack_protector_compat.c __error.c .if !defined(WITHOUT_SYSCALL_COMPAT) diff --git a/lib/libc/sys/Symbol.map b/lib/libc/sys/Symbol.map index f1c1567f0df..6888ea0783f 100644 --- a/lib/libc/sys/Symbol.map +++ b/lib/libc/sys/Symbol.map @@ -365,9 +365,6 @@ FBSD_1.2 { cap_getmode; cap_new; cap_getrights; - ffclock_getcounter; - ffclock_getestimate; - ffclock_setestimate; getloginclass; pdfork; pdgetpid; @@ -382,6 +379,9 @@ FBSD_1.2 { }; FBSD_1.3 { + ffclock_getcounter; + ffclock_getestimate; + ffclock_setestimate; posix_fadvise; }; diff --git a/lib/libc/sys/__vdso_gettimeofday.c b/lib/libc/sys/__vdso_gettimeofday.c new file mode 100644 index 00000000000..32abb6970d8 --- /dev/null +++ b/lib/libc/sys/__vdso_gettimeofday.c @@ -0,0 +1,142 @@ +/*- + * Copyright (c) 2012 Konstantin Belousov + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include "libc_private.h" + +static u_int +tc_delta(const struct vdso_timehands *th) +{ + + return ((__vdso_gettc(th) - th->th_offset_count) & + th->th_counter_mask); +} + +static int +binuptime(struct bintime *bt, struct vdso_timekeep *tk, int abs) +{ + struct vdso_timehands *th; + uint32_t curr, gen; + + do { + if (!tk->tk_enabled) + return (ENOSYS); + + /* + * XXXKIB. The load of tk->tk_current should use + * atomic_load_acq_32 to provide load barrier. But + * since tk points to r/o mapped page, x86 + * implementation of atomic_load_acq faults. + */ + curr = tk->tk_current; + rmb(); + th = &tk->tk_th[curr]; + if (th->th_algo != VDSO_TH_ALGO_1) + return (ENOSYS); + gen = th->th_gen; + *bt = th->th_offset; + bintime_addx(bt, th->th_scale * tc_delta(th)); + if (abs) + bintime_add(bt, &th->th_boottime); + + /* + * Barrier for load of both tk->tk_current and th->th_gen. + */ + rmb(); + } while (curr != tk->tk_current || gen == 0 || gen != th->th_gen); + return (0); +} + +static struct vdso_timekeep *tk; + +int +__vdso_gettimeofday(struct timeval *tv, struct timezone *tz) +{ + struct bintime bt; + int error; + + if (tz != NULL) + return (ENOSYS); + if (tk == NULL) { + error = _elf_aux_info(AT_TIMEKEEP, &tk, sizeof(tk)); + if (error != 0 || tk == NULL) + return (ENOSYS); + } + if (tk->tk_ver != VDSO_TK_VER_CURR) + return (ENOSYS); + error = binuptime(&bt, tk, 1); + if (error != 0) + return (error); + bintime2timeval(&bt, tv); + return (0); +} + +int +__vdso_clock_gettime(clockid_t clock_id, struct timespec *ts) +{ + struct bintime bt; + int abs, error; + + if (tk == NULL) { + error = _elf_aux_info(AT_TIMEKEEP, &tk, sizeof(tk)); + if (error != 0 || tk == NULL) + return (ENOSYS); + } + if (tk->tk_ver != VDSO_TK_VER_CURR) + return (ENOSYS); + switch (clock_id) { + case CLOCK_REALTIME: + case CLOCK_REALTIME_PRECISE: + case CLOCK_REALTIME_FAST: + case CLOCK_SECOND: + abs = 1; + break; + case CLOCK_MONOTONIC: + case CLOCK_MONOTONIC_PRECISE: + case CLOCK_MONOTONIC_FAST: + case CLOCK_UPTIME: + case CLOCK_UPTIME_PRECISE: + case CLOCK_UPTIME_FAST: + abs = 0; + break; + default: + return (ENOSYS); + } + error = binuptime(&bt, tk, abs); + if (error != 0) + return (error); + bintime2timespec(&bt, ts); + if (clock_id == CLOCK_SECOND) + ts->tv_nsec = 0; + return (0); +} diff --git a/lib/libc/sys/clock_gettime.c b/lib/libc/sys/clock_gettime.c new file mode 100644 index 00000000000..e7e701b2e50 --- /dev/null +++ b/lib/libc/sys/clock_gettime.c @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2012 Konstantin Belousov + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include "libc_private.h" + +int __clock_gettime(clockid_t, struct timespec *ts); + +__weak_reference(__clock_gettime, clock_gettime); + +int +__clock_gettime(clockid_t clock_id, struct timespec *ts) +{ + int error; + + if (__vdso_clock_gettime != NULL && __vdso_gettc != NULL) + error = __vdso_clock_gettime(clock_id, ts); + else + error = ENOSYS; + if (error == ENOSYS) + error = __sys_clock_gettime(clock_id, ts); + return (error); +} diff --git a/lib/libc/sys/ffclock.2 b/lib/libc/sys/ffclock.2 index 0e8f09b7400..68ea922e4d6 100644 --- a/lib/libc/sys/ffclock.2 +++ b/lib/libc/sys/ffclock.2 @@ -34,7 +34,7 @@ .Nm ffclock_getcounter , .Nm ffclock_getestimate , .Nm ffclock_setestimate -.Nd Retrieve feed-forward counter, get and set feed-forward clock estimates. +.Nd Retrieve feed-forward counter, get and set feed-forward clock estimates .Sh LIBRARY .Lb libc .Sh SYNOPSIS @@ -59,7 +59,7 @@ In the feed-forward context, a .Em timestamp is a cumulative value of the ticks of the timecounter, which can be converted into seconds by using the feed-forward -.Em clock estimates. +.Em clock estimates . .Pp The .Fn ffclock_getcounter diff --git a/lib/libc/sys/gettimeofday.c b/lib/libc/sys/gettimeofday.c new file mode 100644 index 00000000000..4cc87e1b528 --- /dev/null +++ b/lib/libc/sys/gettimeofday.c @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2012 Konstantin Belousov + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include "libc_private.h" + +int __gettimeofday(struct timeval *tv, struct timezone *tz); + +__weak_reference(__gettimeofday, gettimeofday); + +int +__gettimeofday(struct timeval *tv, struct timezone *tz) +{ + int error; + + if (__vdso_gettimeofday != NULL && __vdso_gettc != NULL) + error = __vdso_gettimeofday(tv, tz); + else + error = ENOSYS; + if (error == ENOSYS) + error = __sys_gettimeofday(tv, tz); + return (error); +} diff --git a/lib/libc/sys/jail.2 b/lib/libc/sys/jail.2 index b0619a04233..a2d692ad299 100644 --- a/lib/libc/sys/jail.2 +++ b/lib/libc/sys/jail.2 @@ -247,44 +247,6 @@ They return \-1 on failure, and set to indicate the error. .Pp .Rv -std jail_attach jail_remove -.Sh PRISON? -Once a process has been put in a prison, it and its descendants cannot escape -the prison. -.Pp -Inside the prison, the concept of -.Dq superuser -is very diluted. -In general, -it can be assumed that nothing can be mangled from inside a prison which -does not exist entirely inside that prison. -For instance the directory -tree below -.Dq Li path -can be manipulated all the ways a root can normally do it, including -.Dq Li "rm -rf /*" -but new device special nodes cannot be created because they reference -shared resources (the device drivers in the kernel). -The effective -.Dq securelevel -for a process is the greater of the global -.Dq securelevel -or, if present, the per-jail -.Dq securelevel . -.Pp -All IP activity will be forced to happen to/from the IP number specified, -which should be an alias on one of the network interfaces. -All connections to/from the loopback address -.Pf ( Li 127.0.0.1 -for IPv4, -.Li ::1 -for IPv6) will be changed to be to/from the primary address -of the jail for the given address family. -.Pp -It is possible to identify a process as jailed by examining -.Dq Li /proc//status : -it will show a field near the end of the line, either as -a single hyphen for a process at large, or the name currently -set for the prison for jailed processes. .Sh ERRORS The .Fn jail @@ -415,7 +377,7 @@ and .Fn jail_attach call .Xr chroot 2 -internally, so it can fail for all the same reasons. +internally, so they can fail for all the same reasons. Please consult the .Xr chroot 2 manual page for details. diff --git a/lib/libc/sys/ktrace.2 b/lib/libc/sys/ktrace.2 index 1740d75057d..4e5d92af837 100644 --- a/lib/libc/sys/ktrace.2 +++ b/lib/libc/sys/ktrace.2 @@ -127,7 +127,7 @@ field gives the time (with microsecond resolution) that the record was generated. The .Va ktr_tid -field holds a threadid. +field holds a thread id. .Pp The generic header is followed by .Va ktr_len diff --git a/lib/libc/sys/lseek.2 b/lib/libc/sys/lseek.2 index 874c523196d..349940a2a5b 100644 --- a/lib/libc/sys/lseek.2 +++ b/lib/libc/sys/lseek.2 @@ -28,7 +28,7 @@ .\" @(#)lseek.2 8.3 (Berkeley) 4/19/94 .\" $FreeBSD$ .\" -.Dd April 5, 2007 +.Dd May 26, 2012 .Dt LSEEK 2 .Os .Sh NAME @@ -92,9 +92,9 @@ If .Fa whence is .Dv SEEK_HOLE , -the offset of the start of the next hole greater than or equal to the supplied -.Fa offset -is returned. +the offset is set to the start of the next hole greater than or equal +to the supplied +.Fa offset . The definition of a hole is provided below. .It If diff --git a/lib/libc/sys/msgsnd.2 b/lib/libc/sys/msgsnd.2 index d6333bbd96d..051c9922e58 100644 --- a/lib/libc/sys/msgsnd.2 +++ b/lib/libc/sys/msgsnd.2 @@ -139,7 +139,7 @@ will fail if: The .Fa msqid argument -is not a valid message queue identifier +is not a valid message queue identifier. .Pp The message queue was removed while .Fn msgsnd diff --git a/lib/libc/sys/pathconf.2 b/lib/libc/sys/pathconf.2 index 8bdd5b8acf9..efa13387d65 100644 --- a/lib/libc/sys/pathconf.2 +++ b/lib/libc/sys/pathconf.2 @@ -165,7 +165,7 @@ Returns 1 if a Mandatory Access Control (MAC) label can be set on the specified file, otherwise 0. .It Li _PC_MIN_HOLE_SIZE If a file system supports the reporting of holes (see -.Xr lseek 2 , +.Xr lseek 2 ) , .Fn pathconf and .Fn fpathconf diff --git a/lib/libc/sys/pdfork.2 b/lib/libc/sys/pdfork.2 index 0808fbc9107..ad33566cc09 100644 --- a/lib/libc/sys/pdfork.2 +++ b/lib/libc/sys/pdfork.2 @@ -1,5 +1,5 @@ .\" -.\" Copyright (c) 2009-2010 Robert N. M. Watson +.\" Copyright (c) 2009-2010, 2012 Robert N. M. Watson .\" All rights reserved. .\" .\" This software was developed at the University of Cambridge Computer @@ -57,7 +57,7 @@ a variant of .Xr fork 2 , which, if successful, returns a process descriptor in the integer pointed to by -.Fa pidp . +.Fa fdp . Processes created via .Fn pdfork will not cause @@ -76,7 +76,7 @@ This option is not permitted in Capsicum capability mode (see .El .Pp .Fn pdgetpid -queries the process ID (PID) if the process descriptor +queries the process ID (PID) in the process descriptor .Fa fd . .Pp .Fn pdkill diff --git a/lib/libc/sys/posix_fadvise.2 b/lib/libc/sys/posix_fadvise.2 index 37453ff10d9..f303f422b54 100644 --- a/lib/libc/sys/posix_fadvise.2 +++ b/lib/libc/sys/posix_fadvise.2 @@ -28,7 +28,7 @@ .\" @(#)madvise.2 8.1 (Berkeley) 6/9/93 .\" $FreeBSD$ .\" -.Dd February 25, 2012 +.Dd June 19, 2012 .Dt POSIX_FADVISE 2 .Os .Sh NAME @@ -84,10 +84,9 @@ specified range and future access to this data may require a read operation. .It Dv POSIX_FADV_NOREUSE Tells the system that the specified data will only be accessed once and then not reused. -Accesses to data within the specified range are treated as if the file -descriptor has the -.Dv O_DIRECT -flag enabled. +The system may decrease the in-memory priority of data once it has been +read or written. +Future access to this data may require a read operation. .El .Sh RETURN VALUES .Rv -std posix_fadvise diff --git a/lib/libc/sys/read.2 b/lib/libc/sys/read.2 index 06e0ef10229..2127eda3990 100644 --- a/lib/libc/sys/read.2 +++ b/lib/libc/sys/read.2 @@ -164,6 +164,8 @@ argument points outside the allocated address space. .It Bq Er EIO An I/O error occurred while reading from the file system. +.It Bq Er EBUSY +Failed to read from a file, e.g. /proc//regs while is not stopped .It Bq Er EINTR A read from a slow device (i.e.\& one that might block for an arbitrary amount of time) diff --git a/lib/libc/sys/rtprio.2 b/lib/libc/sys/rtprio.2 index faad9417c55..ac78b509951 100644 --- a/lib/libc/sys/rtprio.2 +++ b/lib/libc/sys/rtprio.2 @@ -132,7 +132,8 @@ RTP_PRIO_NORMAL for normal priorities, and RTP_PRIO_IDLE for idle priorities. The priority specified by the .Va prio field ranges between 0 and -.Dv RTP_PRIO_MAX (usually 31) . +.Dv RTP_PRIO_MAX +.Pq usually 31 . 0 is the highest possible priority. .Pp Realtime and idle priority is inherited through fork() and exec(). @@ -149,7 +150,7 @@ Threads of equal real/idle priority are run round-robin. The .Fn rtprio system call -will fail if +will fail if: .Bl -tag -width Er .It Bq Er EINVAL The specified @@ -175,7 +176,7 @@ The specified process or thread was not found or visible. .Xr setpriority 2 , .Xr nice 3 , .Xr renice 8 , -.Xr p_cansee 9 . +.Xr p_cansee 9 .Sh AUTHORS .An -nosplit The original author was diff --git a/lib/libc/sys/setfib.2 b/lib/libc/sys/setfib.2 index ef561d28e72..bf23c7a9779 100644 --- a/lib/libc/sys/setfib.2 +++ b/lib/libc/sys/setfib.2 @@ -52,7 +52,7 @@ may be retrieved by the sysctl. The system maximum is set in the kernel configuration file with .Bd -ragged -offset indent -.Cd "options ROUTETABLES=" Ns Em N +.Cd "options ROUTETABLES=" Ns Em N .Ed .Pp or in @@ -95,7 +95,8 @@ system call is a .Fx extension however similar extensions have been added to many other -.Ux style kernels. +.Ux +style kernels. .Sh HISTORY The .Fn setfib diff --git a/lib/libc/sys/shm_open.2 b/lib/libc/sys/shm_open.2 index cc12132247a..a521e58412b 100644 --- a/lib/libc/sys/shm_open.2 +++ b/lib/libc/sys/shm_open.2 @@ -88,7 +88,7 @@ already exists, then .Fn shm_open will fail with -.Er EEXIST. +.Er EEXIST . .Pp Newly created objects start off with a size of zero. If an existing shared memory object is opened with diff --git a/lib/libc/sys/sigqueue.2 b/lib/libc/sys/sigqueue.2 index 9e6a4c52008..8069e98efa6 100644 --- a/lib/libc/sys/sigqueue.2 +++ b/lib/libc/sys/sigqueue.2 @@ -141,7 +141,7 @@ does not exist. The .Fn sigqueue system call conforms to -.St -p1003.1-2004 +.St -p1003.1-2004 . .Sh HISTORY Support for .Tn POSIX diff --git a/lib/libc/sys/stat.2 b/lib/libc/sys/stat.2 index b6c03ab5e3d..5e49b3c0b99 100644 --- a/lib/libc/sys/stat.2 +++ b/lib/libc/sys/stat.2 @@ -28,7 +28,7 @@ .\" @(#)stat.2 8.4 (Berkeley) 5/1/95 .\" $FreeBSD$ .\" -.Dd November 17, 2011 +.Dd June 2, 2012 .Dt STAT 2 .Os .Sh NAME @@ -431,7 +431,7 @@ system call appeared in .Sh BUGS Applying .Fn fstat -to a socket (and thus to a pipe) +to a socket returns a zeroed buffer, except for the blocksize field, and a unique device and inode number. diff --git a/lib/libc/sys/timer_create.2 b/lib/libc/sys/timer_create.2 index 316cea34ea9..3355159b320 100644 --- a/lib/libc/sys/timer_create.2 +++ b/lib/libc/sys/timer_create.2 @@ -157,7 +157,7 @@ memory protection fault. The .Fn timer_create system call conforms to -.St -p1003.1-2004 +.St -p1003.1-2004 . .Sh HISTORY Support for .Tn POSIX diff --git a/lib/libc/sys/timer_delete.2 b/lib/libc/sys/timer_delete.2 index a1b245a5275..a7f5ada0eb5 100644 --- a/lib/libc/sys/timer_delete.2 +++ b/lib/libc/sys/timer_delete.2 @@ -72,7 +72,7 @@ is not a valid timer ID. The .Fn timer_delete system call conforms to -.St -p1003.1-2004 +.St -p1003.1-2004 . .Sh HISTORY Support for .Tn POSIX diff --git a/lib/libc/sys/timer_settime.2 b/lib/libc/sys/timer_settime.2 index 4b9d93823b0..3f7be18c217 100644 --- a/lib/libc/sys/timer_settime.2 +++ b/lib/libc/sys/timer_settime.2 @@ -257,7 +257,7 @@ The and .Fn timer_settime system calls conform to -.St -p1003.1-2004 +.St -p1003.1-2004 . .Sh HISTORY Support for .Tn POSIX diff --git a/lib/libc/sys/unlink.2 b/lib/libc/sys/unlink.2 index bb27085422b..406c77c2475 100644 --- a/lib/libc/sys/unlink.2 +++ b/lib/libc/sys/unlink.2 @@ -157,7 +157,7 @@ In addition to the errors returned by the .Fn unlink , the .Fn unlinkat -may fail if +may fail if: .Bl -tag -width Er .It Bq Er EBADF The diff --git a/lib/libcompiler_rt/Makefile b/lib/libcompiler_rt/Makefile index ff9daad1649..84f9b368c13 100644 --- a/lib/libcompiler_rt/Makefile +++ b/lib/libcompiler_rt/Makefile @@ -176,7 +176,7 @@ SRCS+= ${file}.c . endif .endfor -.if ${MACHINE_CPUARCH} != "sparc64" && ${MACHINE_CPUARCH} != "mips" +.if ${MACHINE_CPUARCH} != "mips" . if ${MK_INSTALLLIB} != "no" SYMLINKS+=libcompiler_rt.a ${LIBDIR}/libgcc.a . endif diff --git a/lib/libcrypt/Makefile b/lib/libcrypt/Makefile index eea55726124..7274e287bde 100644 --- a/lib/libcrypt/Makefile +++ b/lib/libcrypt/Makefile @@ -26,11 +26,7 @@ SRCS+= crypt-des.c crypt-blowfish.c blowfish.c CFLAGS+= -I${.CURDIR} -DHAS_DES -DHAS_BLOWFISH .endif -# And the auth_getval() code and support. -.PATH: ${.CURDIR}/../libutil -SRCS+= auth.c property.c -.for sym in auth_getval property_find properties_read properties_free \ - MD4Init MD4Final MD4Update MD4Pad \ +.for sym in MD4Init MD4Final MD4Update MD4Pad \ MD5Init MD5Final MD5Update MD5Pad \ SHA256_Init SHA256_Final SHA256_Update \ SHA512_Init SHA512_Final SHA512_Update diff --git a/lib/libcrypt/crypt.3 b/lib/libcrypt/crypt.3 index 949a7a70e46..f14a6eb9d90 100644 --- a/lib/libcrypt/crypt.3 +++ b/lib/libcrypt/crypt.3 @@ -196,7 +196,7 @@ SHA-512 .Pp Other crypt formats may be easily added. An example salt would be: -.Bl -tag -offset indent +.Bl -tag -width 6n -offset indent .It Cm "$4$thesalt$rest" .El .Ss "Traditional" crypt: @@ -238,12 +238,6 @@ The .Fn crypt_set_format function sets the default encoding format according to the supplied .Fa string . -.Pp -The global default format can be set using the -.Pa /etc/auth.conf -file using the -.Va crypt_default -property. .Sh RETURN VALUES The .Fn crypt @@ -260,9 +254,7 @@ Otherwise, a value of 0 is returned. .Sh SEE ALSO .Xr login 1 , .Xr passwd 1 , -.Xr auth_getval 3 , .Xr getpass 3 , -.Xr auth.conf 5 , .Xr passwd 5 .Sh HISTORY A rotor-based diff --git a/lib/libcrypt/crypt.c b/lib/libcrypt/crypt.c index b949a480de1..bfcbb2049b5 100644 --- a/lib/libcrypt/crypt.c +++ b/lib/libcrypt/crypt.c @@ -79,23 +79,23 @@ static const struct { } }; +#ifdef HAS_DES +#define CRYPT_DEFAULT "des" +#else +#define CRYPT_DEFAULT "md5" +#endif + static int crypt_type = -1; static void crypt_setdefault(void) { - char *def; size_t i; if (crypt_type != -1) return; - def = auth_getval("crypt_default"); - if (def == NULL) { - crypt_type = 0; - return; - } for (i = 0; i < sizeof(crypt_types) / sizeof(crypt_types[0]) - 1; i++) { - if (strcmp(def, crypt_types[i].name) == 0) { + if (strcmp(CRYPT_DEFAULT, crypt_types[i].name) == 0) { crypt_type = (int)i; return; } diff --git a/lib/libcxxrt/Makefile b/lib/libcxxrt/Makefile index e7105460352..d197361a9a6 100644 --- a/lib/libcxxrt/Makefile +++ b/lib/libcxxrt/Makefile @@ -1,26 +1,26 @@ # $FreeBSD$ -SRCDIR= ${.CURDIR}/../../contrib/libcxxrt +SRCDIR= ${.CURDIR}/../../contrib/libcxxrt -SHLIB_MAJOR= 1 -SHLIBDIR?= /lib +SHLIB_MAJOR= 1 +SHLIBDIR?= /lib .PATH: ${SRCDIR} -LIB= cxxrt +LIB= cxxrt -SRCS+= libelftc_dem_gnu3.c\ - terminate.cc\ - dynamic_cast.cc\ - memory.cc\ - auxhelper.cc\ - exception.cc\ - stdexcept.cc\ - typeinfo.cc\ - guard.cc +SRCS+= libelftc_dem_gnu3.c\ + terminate.cc\ + dynamic_cast.cc\ + memory.cc\ + auxhelper.cc\ + exception.cc\ + stdexcept.cc\ + typeinfo.cc\ + guard.cc -WARNS= 0 -CFLAGS+= -I${SRCDIR} -VERSION_MAP= ${.CURDIR}/Version.map +WARNS= 0 +CFLAGS+= -I${SRCDIR} +VERSION_MAP= ${.CURDIR}/Version.map .include diff --git a/lib/libcxxrt/Version.map b/lib/libcxxrt/Version.map index b5be60e5ac2..ca990a0ddde 100644 --- a/lib/libcxxrt/Version.map +++ b/lib/libcxxrt/Version.map @@ -306,11 +306,6 @@ CXXRT_1.0 { "std::type_info::__is_pointer_p() const"; - "operator delete[](void*)"; - "operator delete(void*)"; - "operator new[](unsigned long)"; - "operator new(unsigned long)"; - "operator new(unsigned long, std::nothrow_t const&)"; }; __cxa_allocate_dependent_exception; @@ -321,3 +316,16 @@ CXXRT_1.0 { __cxa_rethrow_primary_exception; } CXXABI_1.3.1; + +GLIBCXX_3.4 { + extern "C++" { + "operator delete[](void*)"; + "operator delete(void*)"; + "operator new[](unsigned int)"; + "operator new(unsigned int)"; + "operator new(unsigned int, std::nothrow_t const&)"; + "operator new[](unsigned long)"; + "operator new(unsigned long)"; + "operator new(unsigned long, std::nothrow_t const&)"; + }; +}; diff --git a/lib/libedit/chared.c b/lib/libedit/chared.c index ffaaaa77d0a..6a4f3f63ad0 100644 --- a/lib/libedit/chared.c +++ b/lib/libedit/chared.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $NetBSD: chared.c,v 1.25 2005/08/08 01:41:30 christos Exp $ + * $NetBSD: chared.c,v 1.27 2009/02/15 21:55:23 christos Exp $ */ #if !defined(lint) && !defined(SCCSID) @@ -59,12 +59,12 @@ cv_undo(EditLine *el) { c_undo_t *vu = &el->el_chared.c_undo; c_redo_t *r = &el->el_chared.c_redo; - unsigned int size; + size_t size; /* Save entire line for undo */ size = el->el_line.lastchar - el->el_line.buffer; vu->len = size; - vu->cursor = el->el_line.cursor - el->el_line.buffer; + vu->cursor = (int)(el->el_line.cursor - el->el_line.buffer); memcpy(vu->buf, el->el_line.buffer, size); /* save command info for redo */ @@ -83,7 +83,7 @@ cv_yank(EditLine *el, const char *ptr, int size) { c_kill_t *k = &el->el_chared.c_kill; - memcpy(k->buf, ptr, size +0u); + memcpy(k->buf, ptr, (size_t)size); k->last = k->buf + size; } @@ -97,7 +97,7 @@ c_insert(EditLine *el, int num) char *cp; if (el->el_line.lastchar + num >= el->el_line.limit) { - if (!ch_enlargebufs(el, num +0u)) + if (!ch_enlargebufs(el, (size_t)num)) return; /* can't go past end of buffer */ } @@ -118,7 +118,7 @@ c_delafter(EditLine *el, int num) { if (el->el_line.cursor + num > el->el_line.lastchar) - num = el->el_line.lastchar - el->el_line.cursor; + num = (int)(el->el_line.lastchar - el->el_line.cursor); if (el->el_map.current != el->el_map.emacs) { cv_undo(el); @@ -159,7 +159,7 @@ c_delbefore(EditLine *el, int num) { if (el->el_line.cursor - num < el->el_line.buffer) - num = el->el_line.cursor - el->el_line.buffer; + num = (int)(el->el_line.cursor - el->el_line.buffer); if (el->el_map.current != el->el_map.emacs) { cv_undo(el); @@ -375,7 +375,7 @@ cv_delfini(EditLine *el) /* sanity */ return; - size = el->el_line.cursor - el->el_chared.c_vcmd.pos; + size = (int)(el->el_line.cursor - el->el_chared.c_vcmd.pos); if (size == 0) size = 1; el->el_line.cursor = el->el_chared.c_vcmd.pos; @@ -529,8 +529,7 @@ ch_reset(EditLine *el, int mclear) } private void -ch__clearmacro(el) - EditLine *el; +ch__clearmacro(EditLine *el) { c_macro_t *ma = &el->el_chared.c_macro; while (ma->level >= 0) @@ -542,9 +541,7 @@ ch__clearmacro(el) * Returns 1 if successful, 0 if not. */ protected int -ch_enlargebufs(el, addlen) - EditLine *el; - size_t addlen; +ch_enlargebufs(EditLine *el, size_t addlen) { size_t sz, newsz; char *newbuffer, *oldbuf, *oldkbuf; @@ -695,12 +692,12 @@ protected int c_gets(EditLine *el, char *buf, const char *prompt) { char ch; - int len; + ssize_t len; char *cp = el->el_line.buffer; if (prompt) { len = strlen(prompt); - memcpy(cp, prompt, len + 0u); + memcpy(cp, prompt, (size_t)len); cp += len; } len = 0; @@ -721,7 +718,7 @@ c_gets(EditLine *el, char *buf, const char *prompt) case '\010': /* Delete and backspace */ case '\177': - if (len <= 0) { + if (len == 0) { len = -1; break; } @@ -749,7 +746,7 @@ c_gets(EditLine *el, char *buf, const char *prompt) el->el_line.buffer[0] = '\0'; el->el_line.lastchar = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer; - return len; + return (int)len; } @@ -771,6 +768,6 @@ c_hpos(EditLine *el) ptr >= el->el_line.buffer && *ptr != '\n'; ptr--) continue; - return (el->el_line.cursor - ptr - 1); + return (int)(el->el_line.cursor - ptr - 1); } } diff --git a/lib/libedit/chared.h b/lib/libedit/chared.h index 6636fc7b861..153fcebb566 100644 --- a/lib/libedit/chared.h +++ b/lib/libedit/chared.h @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * @(#)chared.h 8.1 (Berkeley) 6/4/93 - * $NetBSD: chared.h,v 1.17 2006/03/06 21:11:56 christos Exp $ + * $NetBSD: chared.h,v 1.18 2009/02/15 21:55:23 christos Exp $ * $FreeBSD$ */ @@ -70,7 +70,7 @@ typedef struct c_macro_t { * Undo information for vi - no undo in emacs (yet) */ typedef struct c_undo_t { - int len; /* length of saved line */ + ssize_t len; /* length of saved line */ int cursor; /* position of saved cursor */ char *buf; /* full saved text */ } c_undo_t; diff --git a/lib/libedit/common.c b/lib/libedit/common.c index d314eef5228..05995542541 100644 --- a/lib/libedit/common.c +++ b/lib/libedit/common.c @@ -905,7 +905,7 @@ ed_command(EditLine *el, int c __unused) int tmplen; tmplen = c_gets(el, tmpbuf, "\n: "); - term__putc('\n'); + term__putc(el, '\n'); if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1) term_beep(el); diff --git a/lib/libedit/editline.3 b/lib/libedit/editline.3 index 9661d66d2db..dd4c874168c 100644 --- a/lib/libedit/editline.3 +++ b/lib/libedit/editline.3 @@ -1,4 +1,4 @@ -.\" $NetBSD: editline.3,v 1.55 2007/01/12 16:31:13 christos Exp $ +.\" $NetBSD: editline.3,v 1.70 2009/07/05 21:55:24 perry Exp $ .\" .\" Copyright (c) 1997-2003 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 12, 2007 +.Dd July 5, 2009 .Dt EDITLINE 3 .Os .Sh NAME @@ -162,6 +162,9 @@ is modified to contain the number of characters read. Returns the line read if successful, or .Dv NULL if no characters were read or if an error occurred. +The return value may not remain valid across calls to +.Fn el_gets +and must be copied if the data is to be retained. .It Fn el_getc Read a character from the tty. .Fa ch @@ -222,10 +225,30 @@ are supported, along with the required argument list: Define prompt printing function as .Fa f , which is to return a string that contains the prompt. +.It Dv EL_PROMPT_ESC , Fa "char *(*f)(EditLine *)" , Fa "char c" +Same as +.Dv EL_PROMPT , +but the +.Fa c +argument indicates the start/stop literal prompt character. +.Pp +If a start/stop literal character is found in the prompt, the +character itself +is not printed, but characters after it are printed directly to the +terminal without affecting the state of the current line. +A subsequent second start/stop literal character ends this behavior. +This is typically used to embed literal escape sequences that change the +color/style of the terminal in the prompt. +.Dv 0 +unsets it. +.It Dv EL_REFRESH +Re-display the current line on the next terminal line. .It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)" Define right side prompt printing function as .Fa f , which is to return a string that contains the prompt. +.It Dv EL_RPROMPT_ESC , Fa "char *(*f)(EditLine *)" , Fa "char c" +Define the right prompt printing function but with a literal escape character. .It Dv EL_TERMINAL , Fa "const char *type" Define terminal type of the tty to be .Fa type , @@ -259,66 +282,43 @@ reading command input: and .Dv SIGWINCH . Otherwise, the current signal handlers will be used. -.It Dv EL_BIND , Xo -.Fa "const char *" , -.Fa "..." , -.Dv NULL -.Xc +.It Dv EL_BIND , Fa "const char *" , Fa "..." , Dv NULL Perform the .Ic bind builtin command. Refer to .Xr editrc 5 for more information. -.It Dv EL_ECHOTC , Xo -.Fa "const char *" , -.Fa "..." , -.Dv NULL -.Xc +.It Dv EL_ECHOTC , Fa "const char *" , Fa "..." , Dv NULL Perform the .Ic echotc builtin command. Refer to .Xr editrc 5 for more information. -.It Dv EL_SETTC , Xo -.Fa "const char *" , -.Fa "..." , -.Dv NULL -.Xc +.It Dv EL_SETTC , Fa "const char *" , Fa "..." , Dv NULL Perform the .Ic settc builtin command. Refer to .Xr editrc 5 for more information. -.It Dv EL_SETTY , Xo -.Fa "const char *" , -.Fa "..." , -.Dv NULL -.Xc +.It Dv EL_SETTY , Fa "const char *" , Fa "..." , Dv NULL Perform the .Ic setty builtin command. Refer to .Xr editrc 5 for more information. -.It Dv EL_TELLTC , Xo -.Fa "const char *" , -.Fa "..." , -.Dv NULL -.Xc +.It Dv EL_TELLTC , Fa "const char *" , Fa "..." , Dv NULL Perform the .Ic telltc builtin command. Refer to .Xr editrc 5 for more information. -.It Dv EL_ADDFN , Xo -.Fa "const char *name" , -.Fa "const char *help" , -.Fa "unsigned char (*func)(EditLine *e, int ch)" -.Xc +.It Dv EL_ADDFN , Fa "const char *name" , Fa "const char *help" , \ +Fa "unsigned char (*func)(EditLine *e, int ch)" Add a user defined function, .Fn func , referred to as @@ -360,10 +360,8 @@ Beep, and flush tty. .It Dv CC_FATAL Fatal error, reset tty to known state. .El -.It Dv EL_HIST , Xo -.Fa "History *(*func)(History *, int op, ...)" , -.Fa "const char *ptr" -.Xc +.It Dv EL_HIST , Fa "History *(*func)(History *, int op, ...)" , \ +Fa "const char *ptr" Defines which history function to use, which is usually .Fn history . .Fa ptr @@ -435,10 +433,22 @@ The following values for are supported, along with actual type of .Fa result : .Bl -tag -width 4n -.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)" -Return a pointer to the function that displays the prompt. -.It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)" -Return a pointer to the function that displays the rightside prompt. +.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)" , Fa "char *c" +Return a pointer to the function that displays the prompt in +.Fa f . +If +.Fa c +is not +.Dv NULL , +return the start/stop literal prompt character in it. +.It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)" , Fa "char *c" +Return a pointer to the function that displays the prompt in +.Fa f . +If +.Fa c +is not +.Dv NULL , +return the start/stop literal prompt character in it. .It Dv EL_EDITOR , Fa "const char *" Return the name of the editor, which will be one of .Dq emacs @@ -603,18 +613,11 @@ assumed to be created with .Fn history_init . .It Dv H_CLEAR Clear the history. -.It Dv H_FUNC , Xo -.Fa "void *ptr" , -.Fa "history_gfun_t first" , -.Fa "history_gfun_t next" , -.Fa "history_gfun_t last" , -.Fa "history_gfun_t prev" , -.Fa "history_gfun_t curr" , -.Fa "history_sfun_t set" , -.Fa "history_vfun_t clear" , -.Fa "history_efun_t enter" , -.Fa "history_efun_t add" -.Xc +.It Dv H_FUNC , Fa "void *ptr" , Fa "history_gfun_t first" , \ +Fa "history_gfun_t next" , Fa "history_gfun_t last" , \ +Fa "history_gfun_t prev" , Fa "history_gfun_t curr" , \ +Fa "history_sfun_t set" , Fa "history_vfun_t clear" , \ +Fa "history_efun_t enter" , Fa "history_efun_t add" Define functions to perform various history operations. .Fa ptr is the argument given to a function when it is invoked. diff --git a/lib/libedit/editrc.5 b/lib/libedit/editrc.5 index 2fa1a634dea..f46b874a831 100644 --- a/lib/libedit/editrc.5 +++ b/lib/libedit/editrc.5 @@ -1,4 +1,4 @@ -.\" $NetBSD: editrc.5,v 1.20 2006/08/21 12:45:30 christos Exp $ +.\" $NetBSD: editrc.5,v 1.24 2009/04/11 22:17:52 wiz Exp $ .\" .\" Copyright (c) 1997-2000 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -89,16 +89,8 @@ shell. .Pp The following builtin commands are available: .Bl -tag -width 4n -.It Ic bind Xo -.Op Fl a -.Op Fl e -.Op Fl k -.Op Fl l -.Op Fl r -.Op Fl s -.Op Fl v -.Op Ar key Op Ar command -.Xc +.It Ic bind Oo Fl a Oc Oo Fl e Oc Oo Fl k Oc Oo Fl l Oc Oo Fl r Oc \ +Oo Fl s Oc Oo Fl v Oc Oo Ar key Oo Ar command Oc Oc Without options, list all bound keys, and the editor command to which each is bound. If @@ -192,11 +184,7 @@ if it has any, notably .Sq \e and .Sq ^ . -.It Ic echotc Xo -.Op Fl sv -.Ar arg -.Ar ... -.Xc +.It Ic echotc Oo Fl sv Oc Ar arg Ar ... Exercise terminal capabilities given in .Ar arg Ar ... . If @@ -252,16 +240,8 @@ to as defined in .Xr termcap 5 . No sanity checking is done. -.It Ic setty Xo -.Op Fl a -.Op Fl d -.Op Fl q -.Op Fl x -.Op Ar +mode -.Op Ar -mode -.Op Ar mode -.Op Ar char=c -.Xc +.It Ic setty Oo Fl a Oc Oo Fl d Oc Oo Fl q Oc Oo Fl x Oc Oo Ar +mode Oc \ +Oo Ar -mode Oc Oo Ar mode Oc Oo Ar char=c Oc Control which tty modes that .Nm will not allow the user to change. diff --git a/lib/libedit/el.c b/lib/libedit/el.c index 3b4036f1b5b..8dcd6985752 100644 --- a/lib/libedit/el.c +++ b/lib/libedit/el.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $NetBSD: el.c,v 1.44 2006/12/15 22:13:33 christos Exp $ + * $NetBSD: el.c,v 1.55 2009/07/25 21:19:23 christos Exp $ */ #if !defined(lint) && !defined(SCCSID) @@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include "el.h" #define HAVE_ISSETUGID @@ -156,9 +157,21 @@ el_set(EditLine *el, int op, ...) switch (op) { case EL_PROMPT: - case EL_RPROMPT: - rv = prompt_set(el, va_arg(ap, el_pfunc_t), op); + case EL_RPROMPT: { + el_pfunc_t p = va_arg(ap, el_pfunc_t); + + rv = prompt_set(el, p, 0, op); break; + } + + case EL_PROMPT_ESC: + case EL_RPROMPT_ESC: { + el_pfunc_t p = va_arg(ap, el_pfunc_t); + char c = va_arg(ap, int); + + rv = prompt_set(el, p, c, op); + break; + } case EL_TERMINAL: rv = term_set(el, va_arg(ap, char *)); @@ -309,6 +322,12 @@ el_set(EditLine *el, int op, ...) break; } + case EL_REFRESH: + re_clear_display(el); + re_refresh(el); + term__flush(el); + break; + default: rv = -1; break; @@ -335,9 +354,13 @@ el_get(EditLine *el, int op, ...) switch (op) { case EL_PROMPT: - case EL_RPROMPT: - rv = prompt_get(el, va_arg(ap, el_pfunc_t *), op); + case EL_RPROMPT: { + el_pfunc_t *p = va_arg(ap, el_pfunc_t *); + char *c = va_arg(ap, char *); + + rv = prompt_get(el, p, c, op); break; + } case EL_EDITOR: rv = map_get_editor(el, va_arg(ap, const char **)); @@ -364,7 +387,7 @@ el_get(EditLine *el, int op, ...) char *argv[20]; int i; - for (i = 1; i < sizeof(argv) / sizeof(argv[0]); i++) + for (i = 1; i < (int)(sizeof(argv) / sizeof(argv[0])); i++) if ((argv[i] = va_arg(ap, char *)) == NULL) break; @@ -495,12 +518,14 @@ el_source(EditLine *el, const char *fname) FILE *fp; size_t len; char *ptr; +#ifdef HAVE_ISSETUGID + char path[MAXPATHLEN]; +#endif fp = NULL; if (fname == NULL) { #ifdef HAVE_ISSETUGID static const char elpath[] = "/.editrc"; - char path[MAXPATHLEN]; if (issetugid()) return (-1); @@ -529,6 +554,13 @@ el_source(EditLine *el, const char *fname) if (len > 0 && ptr[len - 1] == '\n') --len; ptr[len] = '\0'; + + /* loop until first non-space char or EOL */ + while (*ptr != '\0' && isspace((unsigned char)*ptr)) + ptr++; + if (*ptr == '#') + continue; /* ignore, this is a comment line */ + if (parse_line(el, ptr) == -1) { (void) fclose(fp); return (-1); diff --git a/lib/libedit/histedit.h b/lib/libedit/histedit.h index 8417bb3936e..24af1d5e912 100644 --- a/lib/libedit/histedit.h +++ b/lib/libedit/histedit.h @@ -131,10 +131,10 @@ unsigned char _el_fn_sh_complete(EditLine *, int); #define EL_GETCFN 13 /* , el_rfunc_t); */ #define EL_CLIENTDATA 14 /* , void *); */ #define EL_UNBUFFERED 15 /* , int); */ -#define EL_PREP_TERM 16 /* , int); */ +#define EL_PREP_TERM 16 /* , int); */ #define EL_GETTC 17 /* , const char *, ..., NULL); */ -#define EL_GETFP 18 /* , int, FILE **) */ -#define EL_SETFP 19 /* , int, FILE *) */ +#define EL_GETFP 18 /* , int, FILE **); */ +#define EL_SETFP 19 /* , int, FILE *); */ #define EL_REFRESH 20 /* , void); set */ #define EL_PROMPT_ESC 21 /* , prompt_func, Char); set/get */ #define EL_RPROMPT_ESC 22 /* , prompt_func, Char); set/get */ diff --git a/lib/libedit/history.c b/lib/libedit/history.c index 76b3b076d81..8f30a05a997 100644 --- a/lib/libedit/history.c +++ b/lib/libedit/history.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $NetBSD: history.c,v 1.32 2006/09/28 13:52:51 christos Exp $ + * $NetBSD: history.c,v 1.34 2009/09/07 21:24:33 christos Exp $ */ #if !defined(lint) && !defined(SCCSID) @@ -116,6 +116,7 @@ private int history_prev_string(History *, HistEvent *, const char *); */ typedef struct hentry_t { HistEvent ev; /* What we return */ + void *data; /* data */ struct hentry_t *next; /* Next entry */ struct hentry_t *prev; /* Previous entry */ } hentry_t; @@ -145,6 +146,9 @@ private int history_def_init(ptr_t *, HistEvent *, int); private int history_def_insert(history_t *, HistEvent *, const char *); private void history_def_delete(history_t *, HistEvent *, hentry_t *); +private int history_deldata_nth(history_t *, HistEvent *, int, void **); +private int history_set_nth(ptr_t, HistEvent *, int); + #define history_def_setsize(p, num)(void) (((history_t *)p)->max = (num)) #define history_def_getsize(p) (((history_t *)p)->cur) #define history_def_getunique(p) (((((history_t *)p)->flags) & H_UNIQUE) != 0) @@ -335,6 +339,31 @@ history_def_set(ptr_t p, HistEvent *ev, const int n) } +/* history_set_nth(): + * Default function to set the current event in the history to the + * n-th one. + */ +private int +history_set_nth(ptr_t p, HistEvent *ev, int n) +{ + history_t *h = (history_t *) p; + + if (h->cur == 0) { + he_seterrev(ev, _HE_EMPTY_LIST); + return (-1); + } + for (h->cursor = h->list.prev; h->cursor != &h->list; + h->cursor = h->cursor->prev) + if (n-- <= 0) + break; + if (h->cursor == &h->list) { + he_seterrev(ev, _HE_NOT_FOUND); + return (-1); + } + return (0); +} + + /* history_def_add(): * Append string to element */ @@ -363,6 +392,24 @@ history_def_add(ptr_t p, HistEvent *ev, const char *str) } +private int +history_deldata_nth(history_t *h, HistEvent *ev, + int num, void **data) +{ + if (history_set_nth(h, ev, num) != 0) + return (-1); + /* magic value to skip delete (just set to n-th history) */ + if (data == (void **)-1) + return (0); + ev->str = strdup(h->cursor->ev.str); + ev->num = h->cursor->ev.num; + if (data) + *data = h->cursor->data; + history_def_delete(h, ev, h->cursor); + return (0); +} + + /* history_def_del(): * Delete element hp of the h list */ @@ -392,8 +439,11 @@ history_def_delete(history_t *h, HistEventPrivate *evp = (void *)&hp->ev; if (hp == &h->list) abort(); - if (h->cursor == hp) + if (h->cursor == hp) { h->cursor = hp->prev; + if (h->cursor == &h->list) + h->cursor = hp->next; + } hp->prev->next = hp->next; hp->next->prev = hp->prev; h_free((ptr_t) evp->str); @@ -416,6 +466,7 @@ history_def_insert(history_t *h, HistEvent *ev, const char *str) h_free((ptr_t)h->cursor); goto oomem; } + h->cursor->data = NULL; h->cursor->ev.num = ++h->eventid; h->cursor->next = h->list.next; h->cursor->prev = &h->list; @@ -711,8 +762,8 @@ history_load(History *h, const char *fname) (void) strunvis(ptr, line); line[sz] = c; if (HENTER(h, &ev, ptr) == -1) { - h_free((ptr_t)ptr); - return -1; + i = -1; + goto oomem; } } oomem: @@ -787,6 +838,23 @@ history_prev_event(History *h, HistEvent *ev, int num) } +private int +history_next_evdata(History *h, HistEvent *ev, int num, void **d) +{ + int retval; + + for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev)) + if (num-- <= 0) { + if (d) + *d = ((history_t *)h->h_ref)->cursor->data; + return (0); + } + + he_seterrev(ev, _HE_NOT_FOUND); + return (-1); +} + + /* history_next_event(): * Find the next event, with number given */ @@ -976,11 +1044,42 @@ history(History *h, HistEvent *ev, int fun, ...) retval = 0; break; + case H_NEXT_EVDATA: + { + int num = va_arg(va, int); + void **d = va_arg(va, void **); + retval = history_next_evdata(h, ev, num, d); + break; + } + + case H_DELDATA: + { + int num = va_arg(va, int); + void **d = va_arg(va, void **); + retval = history_deldata_nth((history_t *)h->h_ref, ev, num, d); + break; + } + + case H_REPLACE: /* only use after H_NEXT_EVDATA */ + { + const char *line = va_arg(va, const char *); + void *d = va_arg(va, void *); + const char *s; + if(!line || !(s = strdup(line))) { + retval = -1; + break; + } + ((history_t *)h->h_ref)->cursor->ev.str = s; + ((history_t *)h->h_ref)->cursor->data = d; + retval = 0; + break; + } + default: retval = -1; he_seterrev(ev, _HE_UNKNOWN); break; } va_end(va); - return (retval); + return retval; } diff --git a/lib/libedit/key.c b/lib/libedit/key.c index 0b9d05d337b..5a0b779b24c 100644 --- a/lib/libedit/key.c +++ b/lib/libedit/key.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $NetBSD: key.c,v 1.19 2006/03/23 20:22:51 christos Exp $ + * $NetBSD: key.c,v 1.20 2009/02/15 21:55:23 christos Exp $ */ #if !defined(lint) && !defined(SCCSID) @@ -86,8 +86,8 @@ private void node__free(key_node_t *); private void node__put(EditLine *, key_node_t *); private int node__delete(EditLine *, key_node_t **, const char *); private int node_lookup(EditLine *, const char *, key_node_t *, - int); -private int node_enum(EditLine *, key_node_t *, int); + size_t); +private int node_enum(EditLine *, key_node_t *, size_t); #define KEY_BUFSIZ EL_BUFSIZ @@ -478,9 +478,9 @@ node__free(key_node_t *k) * Print if last node */ private int -node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt) +node_lookup(EditLine *el, const char *str, key_node_t *ptr, size_t cnt) { - int ncnt; + size_t ncnt; if (ptr == NULL) return (-1); /* cannot have null ptr */ @@ -493,7 +493,8 @@ node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt) /* If match put this char into el->el_key.buf. Recurse */ if (ptr->ch == *str) { /* match found */ - ncnt = key__decode_char(el->el_key.buf, KEY_BUFSIZ, cnt, + ncnt = key__decode_char(el->el_key.buf, + (size_t)KEY_BUFSIZ, cnt, (unsigned char) ptr->ch); if (ptr->next != NULL) /* not yet at leaf */ @@ -527,9 +528,9 @@ node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt) * Traverse the node printing the characters it is bound in buffer */ private int -node_enum(EditLine *el, key_node_t *ptr, int cnt) +node_enum(EditLine *el, key_node_t *ptr, size_t cnt) { - int ncnt; + size_t ncnt; if (cnt >= KEY_BUFSIZ - 5) { /* buffer too small */ el->el_key.buf[++cnt] = '"'; @@ -547,7 +548,7 @@ node_enum(EditLine *el, key_node_t *ptr, int cnt) return (-1); } /* put this char at end of str */ - ncnt = key__decode_char(el->el_key.buf, KEY_BUFSIZ, cnt, + ncnt = key__decode_char(el->el_key.buf, (size_t)KEY_BUFSIZ, cnt, (unsigned char)ptr->ch); if (ptr->next == NULL) { /* print this key and function */ @@ -615,8 +616,8 @@ key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype) /* key__decode_char(): * Put a printable form of char in buf. */ -protected int -key__decode_char(char *buf, int cnt, int off, int ch) +protected size_t +key__decode_char(char *buf, size_t cnt, size_t off, int ch) { char *sb = buf + off; char *eb = buf + cnt; @@ -626,7 +627,7 @@ key__decode_char(char *buf, int cnt, int off, int ch) if (ch == 0) { ADDC('^'); ADDC('@'); - return b - sb; + return (int)(b - sb); } if (iscntrl(ch)) { ADDC('^'); @@ -648,15 +649,15 @@ key__decode_char(char *buf, int cnt, int off, int ch) ADDC((((unsigned int) ch >> 3) & 7) + '0'); ADDC((ch & 7) + '0'); } - return b - sb; + return (size_t)(b - sb); } /* key__decode_str(): * Make a printable version of the ey */ -protected int -key__decode_str(const char *str, char *buf, int len, const char *sep) +protected size_t +key__decode_str(const char *str, char *buf, size_t len, const char *sep) { char *b = buf, *eb = b + len; const char *p; @@ -699,7 +700,7 @@ key__decode_str(const char *str, char *buf, int len, const char *sep) } done: ADDC('\0'); - if (b - buf >= len) + if ((size_t)(b - buf) >= len) buf[len - 1] = '\0'; - return b - buf; + return (size_t)(b - buf); } diff --git a/lib/libedit/key.h b/lib/libedit/key.h index 3a212923b96..1997adc14f0 100644 --- a/lib/libedit/key.h +++ b/lib/libedit/key.h @@ -76,8 +76,8 @@ protected int key_delete(EditLine *, const char *); protected void key_print(EditLine *, const char *); protected void key_kprint(EditLine *, const char *, key_value_t *, int); -protected int key__decode_str(const char *, char *, int, +protected size_t key__decode_str(const char *, char *, size_t, const char *); -protected int key__decode_char(char *, int, int, int); +protected size_t key__decode_char(char *, size_t, size_t, int); #endif /* _h_el_key */ diff --git a/lib/libedit/prompt.c b/lib/libedit/prompt.c index 3d72da73e94..76d2d64a44a 100644 --- a/lib/libedit/prompt.c +++ b/lib/libedit/prompt.c @@ -85,14 +85,23 @@ prompt_print(EditLine *el, int op) { el_prompt_t *elp; char *p; + int ignore = 0; if (op == EL_PROMPT) elp = &el->el_prompt; else elp = &el->el_rprompt; - p = (elp->p_func) (el); - while (*p) - re_putc(el, *p++, 1); + + for (p = (*elp->p_func)(el); *p; p++) { + if (elp->p_ignore == *p) { + ignore = !ignore; + continue; + } + if (ignore) + term__putc(el, *p); + else + re_putc(el, *p, 1); + } elp->p_pos.v = el->el_refresh.r_cursor.v; elp->p_pos.h = el->el_refresh.r_cursor.h; @@ -109,10 +118,12 @@ prompt_init(EditLine *el) el->el_prompt.p_func = prompt_default; el->el_prompt.p_pos.v = 0; el->el_prompt.p_pos.h = 0; + el->el_prompt.p_ignore = '\0'; el->el_rprompt.p_func = prompt_default_r; el->el_rprompt.p_pos.v = 0; el->el_rprompt.p_pos.h = 0; - return (0); + el->el_rprompt.p_ignore = '\0'; + return 0; } @@ -130,24 +141,29 @@ prompt_end(EditLine *el __unused) * Install a prompt printing function */ protected int -prompt_set(EditLine *el, el_pfunc_t prf, int op) +prompt_set(EditLine *el, el_pfunc_t prf, char c, int op) { el_prompt_t *p; - if (op == EL_PROMPT) + if (op == EL_PROMPT || op == EL_PROMPT_ESC) p = &el->el_prompt; else p = &el->el_rprompt; + if (prf == NULL) { - if (op == EL_PROMPT) + if (op == EL_PROMPT || op == EL_PROMPT_ESC) p->p_func = prompt_default; else p->p_func = prompt_default_r; } else p->p_func = prf; + + p->p_ignore = c; + p->p_pos.v = 0; p->p_pos.h = 0; - return (0); + + return 0; } @@ -155,14 +171,22 @@ prompt_set(EditLine *el, el_pfunc_t prf, int op) * Retrieve the prompt printing function */ protected int -prompt_get(EditLine *el, el_pfunc_t *prf, int op) +prompt_get(EditLine *el, el_pfunc_t *prf, char *c, int op) { + el_prompt_t *p; if (prf == NULL) - return (-1); + return -1; + if (op == EL_PROMPT) - *prf = el->el_prompt.p_func; + p = &el->el_prompt; else - *prf = el->el_rprompt.p_func; - return (0); + p = &el->el_rprompt; + + *prf = el->el_rprompt.p_func; + + if (c) + *c = p->p_ignore; + + return 0; } diff --git a/lib/libedit/prompt.h b/lib/libedit/prompt.h index 6523add855c..fe69ca488b5 100644 --- a/lib/libedit/prompt.h +++ b/lib/libedit/prompt.h @@ -47,11 +47,13 @@ typedef char * (*el_pfunc_t)(EditLine*); typedef struct el_prompt_t { el_pfunc_t p_func; /* Function to return the prompt */ coord_t p_pos; /* position in the line after prompt */ + char p_ignore; /* character to start/end literal +*/ } el_prompt_t; protected void prompt_print(EditLine *, int); -protected int prompt_set(EditLine *, el_pfunc_t, int); -protected int prompt_get(EditLine *, el_pfunc_t *, int); +protected int prompt_set(EditLine *, el_pfunc_t, char, int); +protected int prompt_get(EditLine *, el_pfunc_t *, char *, int); protected int prompt_init(EditLine *); protected void prompt_end(EditLine *); diff --git a/lib/libedit/read.c b/lib/libedit/read.c index 0caba5d00bc..ea40e503140 100644 --- a/lib/libedit/read.c +++ b/lib/libedit/read.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $NetBSD: read.c,v 1.40 2007/03/01 21:41:45 christos Exp $ + * $NetBSD: read.c,v 1.52 2009/07/22 15:57:00 christos Exp $ */ #if !defined(lint) && !defined(SCCSID) @@ -222,7 +222,7 @@ el_push(EditLine *el, const char *str) ma->level--; } term_beep(el); - term__flush(); + term__flush(el); } @@ -286,7 +286,7 @@ read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch) private int read_char(EditLine *el, char *cp) { - int num_read; + ssize_t num_read; int tried = 0; while ((num_read = read(el->el_infd, cp, 1)) == -1) @@ -297,7 +297,7 @@ read_char(EditLine *el, char *cp) return (-1); } - return (num_read); + return (int)num_read; } /* read_pop(): @@ -309,8 +309,9 @@ read_pop(c_macro_t *ma) int i; el_free(ma->macro[0]); - for (i = ma->level--; i > 0; i--) - ma->macro[i - 1] = ma->macro[i]; + for (i = 0; i < ma->level; i++) + ma->macro[i] = ma->macro[i + 1]; + ma->level--; ma->offset = 0; } @@ -323,7 +324,7 @@ el_getc(EditLine *el, char *cp) int num_read; c_macro_t *ma = &el->el_chared.c_macro; - term__flush(); + term__flush(el); for (;;) { if (ma->level < 0) { if (!read_preread(el)) @@ -382,7 +383,7 @@ read_prepare(EditLine *el) re_refresh(el); /* print the prompt */ if (el->el_flags & UNBUFFERED) - term__flush(); + term__flush(el); } protected void @@ -406,6 +407,8 @@ el_gets(EditLine *el, int *nread) c_macro_t *ma = &el->el_chared.c_macro; #endif /* FIONREAD */ + *nread = 0; + if (el->el_flags & NO_TTY) { char *cp = el->el_line.buffer; size_t idx; @@ -428,8 +431,8 @@ el_gets(EditLine *el, int *nread) el->el_line.cursor = el->el_line.lastchar = cp; *cp = '\0'; if (nread) - *nread = el->el_line.cursor - el->el_line.buffer; - return (el->el_line.buffer); + *nread = (int)(el->el_line.cursor - el->el_line.buffer); + return (*nread ? el->el_line.buffer : NULL); } @@ -459,7 +462,7 @@ el_gets(EditLine *el, int *nread) else cp = el->el_line.lastchar; - term__flush(); + term__flush(el); while ((*el->el_read.read_char)(el, cp) == 1) { /* make sure there is space next character */ @@ -469,8 +472,6 @@ el_gets(EditLine *el, int *nread) break; cp = &el->el_line.buffer[idx]; } - if (*cp == 4) /* ought to be stty eof */ - break; cp++; crlf = cp[-1] == '\r' || cp[-1] == '\n'; if (el->el_flags & UNBUFFERED) @@ -482,8 +483,8 @@ el_gets(EditLine *el, int *nread) el->el_line.cursor = el->el_line.lastchar = cp; *cp = '\0'; if (nread) - *nread = el->el_line.cursor - el->el_line.buffer; - return (el->el_line.buffer); + *nread = (int)(el->el_line.cursor - el->el_line.buffer); + return (*nread ? el->el_line.buffer : NULL); } for (num = OKCMD; num == OKCMD;) { /* while still editing this @@ -499,7 +500,7 @@ el_gets(EditLine *el, int *nread) #endif /* DEBUG_READ */ break; } - if ((unsigned int)cmdnum >= el->el_map.nfunc) { /* BUG CHECK command */ + if ((unsigned int)cmdnum >= (unsigned int)el->el_map.nfunc) { /* BUG CHECK command */ #ifdef DEBUG_EDIT (void) fprintf(el->el_errfile, "ERROR: illegal command from key 0%o\r\n", ch); @@ -581,7 +582,7 @@ el_gets(EditLine *el, int *nread) break; case CC_NEWLINE: /* normal end of line */ - num = el->el_line.lastchar - el->el_line.buffer; + num = (int)(el->el_line.lastchar - el->el_line.buffer); break; case CC_FATAL: /* fatal error, reset to known state */ @@ -602,7 +603,7 @@ el_gets(EditLine *el, int *nread) "*** editor ERROR ***\r\n\n"); #endif /* DEBUG_READ */ term_beep(el); - term__flush(); + term__flush(el); break; } el->el_state.argument = 1; @@ -612,7 +613,7 @@ el_gets(EditLine *el, int *nread) break; } - term__flush(); /* flush any buffered output */ + term__flush(el); /* flush any buffered output */ /* make sure the tty is set up correctly */ if ((el->el_flags & UNBUFFERED) == 0) { read_finish(el); @@ -620,7 +621,8 @@ el_gets(EditLine *el, int *nread) *nread = num; } else { if (nread) - *nread = el->el_line.lastchar - el->el_line.buffer; + *nread = + (int)(el->el_line.lastchar - el->el_line.buffer); } return (num ? el->el_line.buffer : NULL); } diff --git a/lib/libedit/refresh.c b/lib/libedit/refresh.c index 22e1de419ad..8fe822909a0 100644 --- a/lib/libedit/refresh.c +++ b/lib/libedit/refresh.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $NetBSD: refresh.c,v 1.27 2005/11/09 22:11:10 christos Exp $ + * $NetBSD: refresh.c,v 1.34 2009/12/28 22:15:36 christos Exp $ */ #if !defined(lint) && !defined(SCCSID) @@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$"); #include "el.h" +private void re_nextline(EditLine *); private void re_addc(EditLine *, int); private void re_update_line(EditLine *, char *, char *, int); private void re_insert (EditLine *, char *, int, int, char *, int); @@ -86,6 +87,37 @@ re_printstr(EditLine *el, const char *str, char *f, char *t) #define ELRE_DEBUG(a, b) #endif +/* re_nextline(): + * Move to the next line or scroll + */ +private void +re_nextline(EditLine *el) +{ + el->el_refresh.r_cursor.h = 0; /* reset it. */ + + /* + * If we would overflow (input is longer than terminal size), + * emulate scroll by dropping first line and shuffling the rest. + * We do this via pointer shuffling - it's safe in this case + * and we avoid memcpy(). + */ + if (el->el_refresh.r_cursor.v + 1 >= el->el_term.t_size.v) { + int i, lins = el->el_term.t_size.v; + char *firstline = el->el_vdisplay[0]; + + for(i = 1; i < lins; i++) + el->el_vdisplay[i - 1] = el->el_vdisplay[i]; + + firstline[0] = '\0'; /* empty the string */ + el->el_vdisplay[i - 1] = firstline; + } else + el->el_refresh.r_cursor.v++; + + ELRE_ASSERT(el->el_refresh.r_cursor.v >= el->el_term.t_size.v, + (__F, "\r\nre_putc: overflow! r_cursor.v == %d > %d\r\n", + el->el_refresh.r_cursor.v, el->el_term.t_size.v), + abort()); +} /* re_addc(): * Draw c, expanding tabs, control chars etc. @@ -101,10 +133,8 @@ re_addc(EditLine *el, int c) if (c == '\n') { /* expand the newline */ int oldv = el->el_refresh.r_cursor.v; re_putc(el, '\0', 0); /* assure end of line */ - if (oldv == el->el_refresh.r_cursor.v) { /* XXX */ - el->el_refresh.r_cursor.h = 0; /* reset cursor pos */ - el->el_refresh.r_cursor.v++; - } + if (oldv == el->el_refresh.r_cursor.v) /* XXX */ + re_nextline(el); return; } if (c == '\t') { /* expand the tab */ @@ -144,33 +174,12 @@ re_putc(EditLine *el, int c, int shift) el->el_refresh.r_cursor.h++; /* advance to next place */ if (el->el_refresh.r_cursor.h >= el->el_term.t_size.h) { - el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_term.t_size.h] = '\0'; /* assure end of line */ - el->el_refresh.r_cursor.h = 0; /* reset it. */ - - /* - * If we would overflow (input is longer than terminal size), - * emulate scroll by dropping first line and shuffling the rest. - * We do this via pointer shuffling - it's safe in this case - * and we avoid memcpy(). - */ - if (el->el_refresh.r_cursor.v + 1 >= el->el_term.t_size.v) { - int i, lins = el->el_term.t_size.v; - char *firstline = el->el_vdisplay[0]; - - for(i=1; i < lins; i++) - el->el_vdisplay[i-1] = el->el_vdisplay[i]; - - firstline[0] = '\0'; /* empty the string */ - el->el_vdisplay[i-1] = firstline; - } else - el->el_refresh.r_cursor.v++; - - ELRE_ASSERT(el->el_refresh.r_cursor.v >= el->el_term.t_size.v, - (__F, "\r\nre_putc: overflow! r_cursor.v == %d > %d\r\n", - el->el_refresh.r_cursor.v, el->el_term.t_size.v), - abort()); + el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_term.t_size.h] + = '\0'; + re_nextline(el); } + } @@ -298,7 +307,7 @@ re_refresh(EditLine *el) term_move_to_char(el, 0); term_clear_EOL(el, (int) strlen(el->el_display[i])); #ifdef DEBUG_REFRESH - term_overwrite(el, "C\b", 2); + term_overwrite(el, "C\b", (size_t)2); #endif /* DEBUG_REFRESH */ el->el_display[i][0] = '\0'; } @@ -321,9 +330,9 @@ re_goto_bottom(EditLine *el) { term_move_to_line(el, el->el_refresh.r_oldcv); - term__putc('\n'); + term__putc(el, '\n'); re_clear_display(el); - term__flush(); + term__flush(el); } @@ -475,6 +484,7 @@ re_update_line(EditLine *el, char *old, char *new, int i) char *ofd, *ols, *oe, *nfd, *nls, *ne; char *osb, *ose, *nsb, *nse; int fx, sx; + size_t len; /* * find first diff @@ -601,12 +611,12 @@ re_update_line(EditLine *el, char *old, char *new, int i) * fx is the number of characters we need to insert/delete: in the * beginning to bring the two same begins together */ - fx = (nsb - nfd) - (osb - ofd); + fx = (int)((nsb - nfd) - (osb - ofd)); /* * sx is the number of characters we need to insert/delete: in the * end to bring the two same last parts together */ - sx = (nls - nse) - (ols - ose); + sx = (int)((nls - nse) - (ols - ose)); if (!EL_CAN_INSERT) { if (fx > 0) { @@ -655,8 +665,8 @@ re_update_line(EditLine *el, char *old, char *new, int i) /* * Now that we are done with pragmatics we recompute fx, sx */ - fx = (nsb - nfd) - (osb - ofd); - sx = (nls - nse) - (ols - ose); + fx = (int)((nsb - nfd) - (osb - ofd)); + sx = (int)((nls - nse) - (ols - ose)); ELRE_DEBUG(1, (__F, "fx %d, sx %d\n", fx, sx)); ELRE_DEBUG(1, (__F, "ofd %d, osb %d, ose %d, ols %d, oe %d\n", @@ -739,7 +749,7 @@ re_update_line(EditLine *el, char *old, char *new, int i) /* * Move to the first char to insert, where the first diff is. */ - term_move_to_char(el, nfd - new); + term_move_to_char(el, (int)(nfd - new)); /* * Check if we have stuff to keep at end */ @@ -752,20 +762,21 @@ re_update_line(EditLine *el, char *old, char *new, int i) ELRE_DEBUG(!EL_CAN_INSERT, (__F, "ERROR: cannot insert in early first diff\n")); term_insertwrite(el, nfd, fx); - re_insert(el, old, ofd - old, + re_insert(el, old, (int)(ofd - old), el->el_term.t_size.h, nfd, fx); } /* * write (nsb-nfd) - fx chars of new starting at * (nfd + fx) */ - term_overwrite(el, nfd + fx, (nsb - nfd) - fx); - re__strncopy(ofd + fx, nfd + fx, - (size_t) ((nsb - nfd) - fx)); + len = (size_t) ((nsb - nfd) - fx); + term_overwrite(el, (nfd + fx), len); + re__strncopy(ofd + fx, nfd + fx, len); } else { ELRE_DEBUG(1, (__F, "without anything to save\r\n")); - term_overwrite(el, nfd, (nsb - nfd)); - re__strncopy(ofd, nfd, (size_t) (nsb - nfd)); + len = (size_t)(nsb - nfd); + term_overwrite(el, nfd, len); + re__strncopy(ofd, nfd, len); /* * Done */ @@ -777,7 +788,7 @@ re_update_line(EditLine *el, char *old, char *new, int i) /* * move to the first char to delete where the first diff is */ - term_move_to_char(el, ofd - old); + term_move_to_char(el, (int)(ofd - old)); /* * Check if we have stuff to save */ @@ -791,14 +802,15 @@ re_update_line(EditLine *el, char *old, char *new, int i) ELRE_DEBUG(!EL_CAN_DELETE, (__F, "ERROR: cannot delete in first diff\n")); term_deletechars(el, -fx); - re_delete(el, old, ofd - old, + re_delete(el, old, (int)(ofd - old), el->el_term.t_size.h, -fx); } /* * write (nsb-nfd) chars of new starting at nfd */ - term_overwrite(el, nfd, (nsb - nfd)); - re__strncopy(ofd, nfd, (size_t) (nsb - nfd)); + len = (size_t) (nsb - nfd); + term_overwrite(el, nfd, len); + re__strncopy(ofd, nfd, len); } else { ELRE_DEBUG(1, (__F, @@ -806,8 +818,9 @@ re_update_line(EditLine *el, char *old, char *new, int i) /* * write (nsb-nfd) chars of new starting at nfd */ - term_overwrite(el, nfd, (nsb - nfd)); - re_clear_eol(el, fx, sx, (oe - old) - (ne - new)); + term_overwrite(el, nfd, (size_t)(nsb - nfd)); + re_clear_eol(el, fx, sx, + (int)((oe - old) - (ne - new))); /* * Done */ @@ -826,7 +839,7 @@ re_update_line(EditLine *el, char *old, char *new, int i) * fx is the number of characters inserted (+) or deleted (-) */ - term_move_to_char(el, (ose - old) + fx); + term_move_to_char(el, (int)((ose - old) + fx)); /* * Check if we have stuff to save */ @@ -843,12 +856,13 @@ re_update_line(EditLine *el, char *old, char *new, int i) /* * write (nls-nse) chars of new starting at nse */ - term_overwrite(el, nse, (nls - nse)); + term_overwrite(el, nse, (size_t)(nls - nse)); } else { ELRE_DEBUG(1, (__F, "but with nothing left to save\r\n")); - term_overwrite(el, nse, (nls - nse)); - re_clear_eol(el, fx, sx, (oe - old) - (ne - new)); + term_overwrite(el, nse, (size_t)(nls - nse)); + re_clear_eol(el, fx, sx, + (int)((oe - old) - (ne - new))); } } /* @@ -858,7 +872,7 @@ re_update_line(EditLine *el, char *old, char *new, int i) ELRE_DEBUG(1, (__F, "late first diff insert at %d...\r\n", nfd - new)); - term_move_to_char(el, nfd - new); + term_move_to_char(el, (int)(nfd - new)); /* * Check if we have stuff to keep at the end */ @@ -869,7 +883,7 @@ re_update_line(EditLine *el, char *old, char *new, int i) * to zero above as a flag saying that we hadn't done * an early first insert. */ - fx = (nsb - nfd) - (osb - ofd); + fx = (int)((nsb - nfd) - (osb - ofd)); if (fx > 0) { /* * insert fx chars of new starting at nfd @@ -877,20 +891,21 @@ re_update_line(EditLine *el, char *old, char *new, int i) ELRE_DEBUG(!EL_CAN_INSERT, (__F, "ERROR: cannot insert in late first diff\n")); term_insertwrite(el, nfd, fx); - re_insert(el, old, ofd - old, + re_insert(el, old, (int)(ofd - old), el->el_term.t_size.h, nfd, fx); } /* * write (nsb-nfd) - fx chars of new starting at * (nfd + fx) */ - term_overwrite(el, nfd + fx, (nsb - nfd) - fx); - re__strncopy(ofd + fx, nfd + fx, - (size_t) ((nsb - nfd) - fx)); + len = (size_t) ((nsb - nfd) - fx); + term_overwrite(el, (nfd + fx), len); + re__strncopy(ofd + fx, nfd + fx, len); } else { ELRE_DEBUG(1, (__F, "without anything to save\r\n")); - term_overwrite(el, nfd, (nsb - nfd)); - re__strncopy(ofd, nfd, (size_t) (nsb - nfd)); + len = (size_t) (nsb - nfd); + term_overwrite(el, nfd, len); + re__strncopy(ofd, nfd, len); } } /* @@ -898,8 +913,8 @@ re_update_line(EditLine *el, char *old, char *new, int i) */ if (sx >= 0) { ELRE_DEBUG(1, (__F, - "second diff insert at %d...\r\n", nse - new)); - term_move_to_char(el, nse - new); + "second diff insert at %d...\r\n", (int)(nse - new))); + term_move_to_char(el, (int)(nse - new)); if (ols != oe) { ELRE_DEBUG(1, (__F, "with stuff to keep at end\r\n")); if (sx > 0) { @@ -912,10 +927,11 @@ re_update_line(EditLine *el, char *old, char *new, int i) * write (nls-nse) - sx chars of new starting at * (nse + sx) */ - term_overwrite(el, nse + sx, (nls - nse) - sx); + term_overwrite(el, (nse + sx), + (size_t)((nls - nse) - sx)); } else { ELRE_DEBUG(1, (__F, "without anything to save\r\n")); - term_overwrite(el, nse, (nls - nse)); + term_overwrite(el, nse, (size_t)(nls - nse)); /* * No need to do a clear-to-end here because we were @@ -974,34 +990,28 @@ re_refresh_cursor(EditLine *el) /* do input buffer to el->el_line.cursor */ for (cp = el->el_line.buffer; cp < el->el_line.cursor; cp++) { c = *cp; - h++; /* all chars at least this long */ - if (c == '\n') {/* handle newline in data part too */ + switch (c) { + case '\n': /* handle newline in data part too */ h = 0; v++; - } else { - if (c == '\t') { /* if a tab, to next tab stop */ - while (h & 07) { - h++; - } - } else if (iscntrl((unsigned char) c)) { - /* if control char */ + break; + case '\t': /* if a tab, to next tab stop */ + while (++h & 07) + continue; + break; + default: + if (iscntrl((unsigned char) c)) + h += 2; /* ^x */ + else if (!isprint((unsigned char) c)) + h += 4; /* octal \xxx */ + else h++; - if (h > th) { /* if overflow, compensate */ - h = 1; - v++; - } - } else if (!isprint((unsigned char) c)) { - h += 3; - if (h > th) { /* if overflow, compensate */ - h = h - th; - v++; - } - } + break; } if (h >= th) { /* check, extra long tabs picked up here also */ - h = 0; + h -= th; v++; } } @@ -1009,7 +1019,7 @@ re_refresh_cursor(EditLine *el) /* now go there */ term_move_to_line(el, v); term_move_to_char(el, h); - term__flush(); + term__flush(el); } @@ -1020,7 +1030,7 @@ private void re_fastputc(EditLine *el, int c) { - term__putc(c); + term__putc(el, c); el->el_display[el->el_cursor.v][el->el_cursor.h++] = c; if (el->el_cursor.h >= el->el_term.t_size.h) { /* if we must overflow */ @@ -1036,23 +1046,23 @@ re_fastputc(EditLine *el, int c) int i, lins = el->el_term.t_size.v; char *firstline = el->el_display[0]; - for(i=1; i < lins; i++) - el->el_display[i-1] = el->el_display[i]; + for(i = 1; i < lins; i++) + el->el_display[i - 1] = el->el_display[i]; re__copy_and_pad(firstline, "", 0); - el->el_display[i-1] = firstline; + el->el_display[i - 1] = firstline; } else { el->el_cursor.v++; el->el_refresh.r_oldcv++; } if (EL_HAS_AUTO_MARGINS) { if (EL_HAS_MAGIC_MARGINS) { - term__putc(' '); - term__putc('\b'); + term__putc(el, ' '); + term__putc(el, '\b'); } } else { - term__putc('\r'); - term__putc('\n'); + term__putc(el, '\r'); + term__putc(el, '\n'); } } } @@ -1092,7 +1102,7 @@ re_fastaddc(EditLine *el) re_fastputc(el, (int)(((((unsigned int)c) >> 3) & 7) + '0')); re_fastputc(el, (c & 7) + '0'); } - term__flush(); + term__flush(el); } @@ -1121,17 +1131,16 @@ re_clear_lines(EditLine *el) if (EL_CAN_CEOL) { int i; - term_move_to_char(el, 0); - for (i = 0; i <= el->el_refresh.r_oldcv; i++) { + for (i = el->el_refresh.r_oldcv; i >= 0; i--) { /* for each line on the screen */ term_move_to_line(el, i); + term_move_to_char(el, 0); term_clear_EOL(el, el->el_term.t_size.h); } - term_move_to_line(el, 0); } else { term_move_to_line(el, el->el_refresh.r_oldcv); /* go to last line */ - term__putc('\r'); /* go to BOL */ - term__putc('\n'); /* go to new line */ + term__putc(el, '\r'); /* go to BOL */ + term__putc(el, '\n'); /* go to new line */ } } diff --git a/lib/libedit/search.c b/lib/libedit/search.c index 991bad24614..af3da8c6901 100644 --- a/lib/libedit/search.c +++ b/lib/libedit/search.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $NetBSD: search.c,v 1.20 2004/11/04 01:16:03 christos Exp $ + * $NetBSD: search.c,v 1.21 2009/02/15 21:55:23 christos Exp $ */ #if !defined(lint) && !defined(SCCSID) @@ -207,7 +207,7 @@ ce_inc_search(EditLine *el, int dir) el_action_t ret = CC_NORM; int ohisteventno = el->el_history.eventno; - int oldpatlen = el->el_search.patlen; + size_t oldpatlen = el->el_search.patlen; int newdir = dir; int done, redo; diff --git a/lib/libedit/sig.c b/lib/libedit/sig.c index a895aeabb15..218a32eb433 100644 --- a/lib/libedit/sig.c +++ b/lib/libedit/sig.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $NetBSD: sig.c,v 1.11 2003/08/07 16:44:33 agc Exp $ + * $NetBSD: sig.c,v 1.14 2009/02/18 15:04:40 christos Exp $ */ #if !defined(lint) && !defined(SCCSID) @@ -78,7 +78,7 @@ sig_handler(int signo) tty_rawmode(sel); if (ed_redisplay(sel, 0) == CC_REFRESH) re_refresh(sel); - term__flush(); + term__flush(sel); break; case SIGWINCH: @@ -94,7 +94,10 @@ sig_handler(int signo) if (signo == sighdl[i]) break; - (void) signal(signo, sel->el_signal[i]); + (void) sigaction(signo, &sel->el_signal->sig_action[i], NULL); + sel->el_signal->sig_action[i].sa_handler = SIG_ERR; + sel->el_signal->sig_action[i].sa_flags = 0; + sigemptyset(&sel->el_signal->sig_action[i].sa_mask); (void) sigprocmask(SIG_SETMASK, &oset, NULL); (void) kill(0, signo); } @@ -106,26 +109,29 @@ sig_handler(int signo) protected int sig_init(EditLine *el) { - int i; - sigset_t nset, oset; + size_t i; + sigset_t *nset, oset; - (void) sigemptyset(&nset); -#define _DO(a) (void) sigaddset(&nset, a); + el->el_signal = el_malloc(sizeof(*el->el_signal)); + if (el->el_signal == NULL) + return -1; + + nset = &el->el_signal->sig_set; + (void) sigemptyset(nset); +#define _DO(a) (void) sigaddset(nset, a); ALLSIGS #undef _DO - (void) sigprocmask(SIG_BLOCK, &nset, &oset); + (void) sigprocmask(SIG_BLOCK, nset, &oset); -#define SIGSIZE (sizeof(sighdl) / sizeof(sighdl[0]) * sizeof(el_signalhandler_t)) - - el->el_signal = (el_signalhandler_t *) el_malloc(SIGSIZE); - if (el->el_signal == NULL) - return (-1); - for (i = 0; sighdl[i] != -1; i++) - el->el_signal[i] = SIG_ERR; + for (i = 0; sighdl[i] != -1; i++) { + el->el_signal->sig_action[i].sa_handler = SIG_ERR; + el->el_signal->sig_action[i].sa_flags = 0; + sigemptyset(&el->el_signal->sig_action[i].sa_mask); + } (void) sigprocmask(SIG_SETMASK, &oset, NULL); - return (0); + return 0; } @@ -147,20 +153,21 @@ sig_end(EditLine *el) protected void sig_set(EditLine *el) { - int i; - sigset_t nset, oset; + size_t i; + sigset_t oset; + struct sigaction osa, nsa; - (void) sigemptyset(&nset); -#define _DO(a) (void) sigaddset(&nset, a); - ALLSIGS -#undef _DO - (void) sigprocmask(SIG_BLOCK, &nset, &oset); + nsa.sa_handler = sig_handler; + sigemptyset(&nsa.sa_mask); + + (void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset); for (i = 0; sighdl[i] != -1; i++) { - el_signalhandler_t s; + nsa.sa_flags = SIGINT ? 0 : SA_RESTART; /* This could happen if we get interrupted */ - if ((s = signal(sighdl[i], sig_handler)) != sig_handler) - el->el_signal[i] = s; + if (sigaction(sighdl[i], &nsa, &osa) != -1 && + osa.sa_handler != sig_handler) + el->el_signal->sig_action[i] = osa; } sel = el; (void) sigprocmask(SIG_SETMASK, &oset, NULL); @@ -173,20 +180,17 @@ sig_set(EditLine *el) protected void sig_clr(EditLine *el) { - int i; - sigset_t nset, oset; + size_t i; + sigset_t oset; - (void) sigemptyset(&nset); -#define _DO(a) (void) sigaddset(&nset, a); - ALLSIGS -#undef _DO - (void) sigprocmask(SIG_BLOCK, &nset, &oset); + (void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset); for (i = 0; sighdl[i] != -1; i++) - if (el->el_signal[i] != SIG_ERR) - (void) signal(sighdl[i], el->el_signal[i]); + if (el->el_signal->sig_action[i].sa_handler != SIG_ERR) + (void)sigaction(sighdl[i], + &el->el_signal->sig_action[i], NULL); sel = NULL; /* we are going to die if the handler is * called */ - (void) sigprocmask(SIG_SETMASK, &oset, NULL); + (void)sigprocmask(SIG_SETMASK, &oset, NULL); } diff --git a/lib/libedit/sig.h b/lib/libedit/sig.h index b1ce14b0909..8773ddcc709 100644 --- a/lib/libedit/sig.h +++ b/lib/libedit/sig.h @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * @(#)sig.h 8.1 (Berkeley) 6/4/93 - * $NetBSD: sig.h,v 1.5 2003/08/07 16:44:33 agc Exp $ + * $NetBSD: sig.h,v 1.7 2009/02/15 21:25:01 christos Exp $ * $FreeBSD$ */ @@ -51,15 +51,17 @@ #define ALLSIGS \ _DO(SIGINT) \ _DO(SIGTSTP) \ - _DO(SIGSTOP) \ _DO(SIGQUIT) \ _DO(SIGHUP) \ _DO(SIGTERM) \ _DO(SIGCONT) \ _DO(SIGWINCH) +#define ALLSIGSNO 7 -typedef void (*el_signalhandler_t)(int); -typedef el_signalhandler_t *el_signal_t; +typedef struct { + struct sigaction sig_action[ALLSIGSNO]; + sigset_t sig_set; +} *el_signal_t; protected void sig_end(EditLine*); protected int sig_init(EditLine*); diff --git a/lib/libedit/term.c b/lib/libedit/term.c index 1d89279eb3f..4899193a863 100644 --- a/lib/libedit/term.c +++ b/lib/libedit/term.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $NetBSD: term.c,v 1.46 2006/11/24 00:01:17 christos Exp $ + * $NetBSD: term.c,v 1.56 2009/12/28 21:54:21 christos Exp $ */ #if !defined(lint) && !defined(SCCSID) @@ -261,9 +261,13 @@ private int term_alloc_display(EditLine *); private void term_alloc(EditLine *, const struct termcapstr *, const char *); private void term_init_arrow(EditLine *); private void term_reset_arrow(EditLine *); +private int term_putc(int); +private void term_tputs(EditLine *, const char *, int); - -private FILE *term_outfile = NULL; /* XXX: How do we fix that? */ +#ifdef _REENTRANT +private pthread_mutex_t term_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif +private FILE *term_outfile = NULL; /* term_setflags(): @@ -311,7 +315,6 @@ term_setflags(EditLine *el) #endif /* DEBUG_SCREEN */ } - /* term_init(): * Initialize the terminal stuff */ @@ -337,7 +340,6 @@ term_init(EditLine *el) if (el->el_term.t_val == NULL) return (-1); (void) memset(el->el_term.t_val, 0, T_val * sizeof(int)); - term_outfile = el->el_outfile; term_init_arrow(el); (void) term_set(el, NULL); return (0); @@ -372,7 +374,7 @@ private void term_alloc(EditLine *el, const struct termcapstr *t, const char *cap) { char termbuf[TC_BUFSIZE]; - int tlen, clen; + size_t tlen, clen; char **tlist = el->el_term.t_str; char **tmp, **str = &tlist[t - tstr]; @@ -399,7 +401,7 @@ term_alloc(EditLine *el, const struct termcapstr *t, const char *cap) /* XXX strcpy is safe */ (void) strcpy(*str = &el->el_term.t_buf[el->el_term.t_loc], cap); - el->el_term.t_loc += clen + 1; /* one for \0 */ + el->el_term.t_loc += (int)clen + 1; /* one for \0 */ return; } /* @@ -416,7 +418,7 @@ term_alloc(EditLine *el, const struct termcapstr *t, const char *cap) termbuf[tlen++] = '\0'; } memcpy(el->el_term.t_buf, termbuf, TC_BUFSIZE); - el->el_term.t_loc = tlen; + el->el_term.t_loc = (int)tlen; if (el->el_term.t_loc + 3 >= TC_BUFSIZE) { (void) fprintf(el->el_errfile, "Out of termcap string space.\n"); @@ -424,7 +426,7 @@ term_alloc(EditLine *el, const struct termcapstr *t, const char *cap) } /* XXX strcpy is safe */ (void) strcpy(*str = &el->el_term.t_buf[el->el_term.t_loc], cap); - el->el_term.t_loc += clen + 1; /* one for \0 */ + el->el_term.t_loc += (int)clen + 1; /* one for \0 */ return; } @@ -542,19 +544,20 @@ term_move_to_line(EditLine *el, int where) el->el_display[el->el_cursor.v][0] != '\0') { /* move without newline */ term_move_to_char(el, el->el_term.t_size.h - 1); - term_overwrite(el, - &el->el_display[el->el_cursor.v][el->el_cursor.h], - 1); + term_overwrite(el, &el->el_display + [el->el_cursor.v][el->el_cursor.h], + (size_t)(el->el_term.t_size.h - + el->el_cursor.h)); /* updates Cursor */ del--; } else { if ((del > 1) && GoodStr(T_DO)) { - (void) tputs(tgoto(Str(T_DO), del, del), - del, term__putc); + term_tputs(el, tgoto(Str(T_DO), del, + del), del); del = 0; } else { for (; del > 0; del--) - term__putc('\n'); + term__putc(el, '\n'); /* because the \n will become \r\n */ el->el_cursor.h = 0; } @@ -562,12 +565,11 @@ term_move_to_line(EditLine *el, int where) } } else { /* del < 0 */ if (GoodStr(T_UP) && (-del > 1 || !GoodStr(T_up))) - (void) tputs(tgoto(Str(T_UP), -del, -del), -del, - term__putc); + term_tputs(el, tgoto(Str(T_UP), -del, -del), -del); else { if (GoodStr(T_up)) for (; del < 0; del++) - (void) tputs(Str(T_up), 1, term__putc); + term_tputs(el, Str(T_up), 1); } } el->el_cursor.v = where;/* now where is here */ @@ -594,7 +596,7 @@ mc_again: return; } if (!where) { /* if where is first column */ - term__putc('\r'); /* do a CR */ + term__putc(el, '\r'); /* do a CR */ el->el_cursor.h = 0; return; } @@ -602,25 +604,24 @@ mc_again: if ((del < -4 || del > 4) && GoodStr(T_ch)) /* go there directly */ - (void) tputs(tgoto(Str(T_ch), where, where), where, term__putc); + term_tputs(el, tgoto(Str(T_ch), where, where), where); else { if (del > 0) { /* moving forward */ if ((del > 4) && GoodStr(T_RI)) - (void) tputs(tgoto(Str(T_RI), del, del), - del, term__putc); + term_tputs(el, tgoto(Str(T_RI), del, del), del); else { /* if I can do tabs, use them */ if (EL_CAN_TAB) { if ((el->el_cursor.h & 0370) != - (where & 0370)) { + (where & ~0x7)) { /* if not within tab stop */ for (i = (el->el_cursor.h & 0370); - i < (where & 0370); + i < (where & ~0x7); i += 8) - term__putc('\t'); + term__putc(el, '\t'); /* then tab over */ - el->el_cursor.h = where & 0370; + el->el_cursor.h = where & ~0x7; } } /* @@ -631,15 +632,15 @@ mc_again: * NOTE THAT term_overwrite() WILL CHANGE * el->el_cursor.h!!! */ - term_overwrite(el, - &el->el_display[el->el_cursor.v][el->el_cursor.h], - where - el->el_cursor.h); + term_overwrite(el, &el->el_display[ + el->el_cursor.v][el->el_cursor.h], + (size_t)(where - el->el_cursor.h)); } } else { /* del < 0 := moving backward */ if ((-del > 4) && GoodStr(T_LE)) - (void) tputs(tgoto(Str(T_LE), -del, -del), - -del, term__putc); + term_tputs(el, tgoto(Str(T_LE), -del, -del), + -del); else { /* can't go directly there */ /* * if the "cost" is greater than the "cost" @@ -650,12 +651,12 @@ mc_again: (((unsigned int) where >> 3) + (where & 07))) : (-del > where)) { - term__putc('\r'); /* do a CR */ + term__putc(el, '\r'); /* do a CR */ el->el_cursor.h = 0; goto mc_again; /* and try again */ } for (i = 0; i < -del; i++) - term__putc('\b'); + term__putc(el, '\b'); } } } @@ -667,20 +668,21 @@ mc_again: * Overstrike num characters */ protected void -term_overwrite(EditLine *el, const char *cp, int n) +term_overwrite(EditLine *el, const char *cp, size_t n) { - if (n <= 0) - return; /* catch bugs */ + if (n == 0) + return; - if (n > el->el_term.t_size.h) { + if (n > (size_t)el->el_term.t_size.h) { #ifdef DEBUG_SCREEN (void) fprintf(el->el_errfile, "term_overwrite: n is riduculous: %d\r\n", n); #endif /* DEBUG_SCREEN */ return; } + do { - term__putc(*cp++); + term__putc(el, *cp++); el->el_cursor.h++; } while (--n); @@ -695,12 +697,13 @@ term_overwrite(EditLine *el, const char *cp, int n) if ((c = el->el_display[el->el_cursor.v][el->el_cursor.h]) != '\0') term_overwrite(el, &c, 1); - else - term__putc(' '); - el->el_cursor.h = 1; + else { + term__putc(el, ' '); + el->el_cursor.h = 1; + } } } else /* no wrap, but cursor stays on screen */ - el->el_cursor.h = el->el_term.t_size.h; + el->el_cursor.h = el->el_term.t_size.h - 1; } } @@ -730,19 +733,18 @@ term_deletechars(EditLine *el, int num) if (GoodStr(T_DC)) /* if I have multiple delete */ if ((num > 1) || !GoodStr(T_dc)) { /* if dc would be more * expen. */ - (void) tputs(tgoto(Str(T_DC), num, num), - num, term__putc); + term_tputs(el, tgoto(Str(T_DC), num, num), num); return; } if (GoodStr(T_dm)) /* if I have delete mode */ - (void) tputs(Str(T_dm), 1, term__putc); + term_tputs(el, Str(T_dm), 1); if (GoodStr(T_dc)) /* else do one at a time */ while (num--) - (void) tputs(Str(T_dc), 1, term__putc); + term_tputs(el, Str(T_dc), 1); if (GoodStr(T_ed)) /* if I have delete mode */ - (void) tputs(Str(T_ed), 1, term__putc); + term_tputs(el, Str(T_ed), 1); } @@ -771,37 +773,35 @@ term_insertwrite(EditLine *el, char *cp, int num) if (GoodStr(T_IC)) /* if I have multiple insert */ if ((num > 1) || !GoodStr(T_ic)) { /* if ic would be more expensive */ - (void) tputs(tgoto(Str(T_IC), num, num), - num, term__putc); - term_overwrite(el, cp, num); + term_tputs(el, tgoto(Str(T_IC), num, num), num); + term_overwrite(el, cp, (size_t)num); /* this updates el_cursor.h */ return; } if (GoodStr(T_im) && GoodStr(T_ei)) { /* if I have insert mode */ - (void) tputs(Str(T_im), 1, term__putc); + term_tputs(el, Str(T_im), 1); el->el_cursor.h += num; do - term__putc(*cp++); + term__putc(el, *cp++); while (--num); if (GoodStr(T_ip)) /* have to make num chars insert */ - (void) tputs(Str(T_ip), 1, term__putc); + term_tputs(el, Str(T_ip), 1); - (void) tputs(Str(T_ei), 1, term__putc); + term_tputs(el, Str(T_ei), 1); return; } do { if (GoodStr(T_ic)) /* have to make num chars insert */ - (void) tputs(Str(T_ic), 1, term__putc); - /* insert a char */ + term_tputs(el, Str(T_ic), 1); - term__putc(*cp++); + term__putc(el, *cp++); el->el_cursor.h++; if (GoodStr(T_ip)) /* have to make num chars insert */ - (void) tputs(Str(T_ip), 1, term__putc); + term_tputs(el, Str(T_ip), 1); /* pad the inserted char */ } while (--num); @@ -817,10 +817,10 @@ term_clear_EOL(EditLine *el, int num) int i; if (EL_CAN_CEOL && GoodStr(T_ce)) - (void) tputs(Str(T_ce), 1, term__putc); + term_tputs(el, Str(T_ce), 1); else { for (i = 0; i < num; i++) - term__putc(' '); + term__putc(el, ' '); el->el_cursor.h += num; /* have written num spaces */ } } @@ -835,14 +835,14 @@ term_clear_screen(EditLine *el) if (GoodStr(T_cl)) /* send the clear screen code */ - (void) tputs(Str(T_cl), Val(T_li), term__putc); + term_tputs(el, Str(T_cl), Val(T_li)); else if (GoodStr(T_ho) && GoodStr(T_cd)) { - (void) tputs(Str(T_ho), Val(T_li), term__putc); /* home */ + term_tputs(el, Str(T_ho), Val(T_li)); /* home */ /* clear to bottom of screen */ - (void) tputs(Str(T_cd), Val(T_li), term__putc); + term_tputs(el, Str(T_cd), Val(T_li)); } else { - term__putc('\r'); - term__putc('\n'); + term__putc(el, '\r'); + term__putc(el, '\n'); } } @@ -855,9 +855,9 @@ term_beep(EditLine *el) { if (GoodStr(T_bl)) /* what termcap says we should use */ - (void) tputs(Str(T_bl), 1, term__putc); + term_tputs(el, Str(T_bl), 1); else - term__putc('\007'); /* an ASCII bell; ^G */ + term__putc(el, '\007'); /* an ASCII bell; ^G */ } @@ -869,9 +869,9 @@ protected void term_clear_to_bottom(EditLine *el) { if (GoodStr(T_cd)) - (void) tputs(Str(T_cd), Val(T_li), term__putc); + term_tputs(el, Str(T_cd), Val(T_li)); else if (GoodStr(T_ce)) - (void) tputs(Str(T_ce), Val(T_li), term__putc); + term_tputs(el, Str(T_ce), Val(T_li)); } #endif @@ -1238,26 +1238,49 @@ term_bind_arrow(EditLine *el) } } +/* term_putc(): + * Add a character + */ +private int +term_putc(int c) +{ + + if (term_outfile == NULL) + return -1; + return fputc(c, term_outfile); +} + +private void +term_tputs(EditLine *el, const char *cap, int affcnt) +{ +#ifdef _REENTRANT + pthread_mutex_lock(&term_mutex); +#endif + term_outfile = el->el_outfile; + (void)tputs(cap, affcnt, term_putc); +#ifdef _REENTRANT + pthread_mutex_unlock(&term_mutex); +#endif +} /* term__putc(): * Add a character */ protected int -term__putc(int c) +term__putc(EditLine *el, int c) { - return (fputc(c, term_outfile)); + return fputc(c, el->el_outfile); } - /* term__flush(): * Flush output */ protected void -term__flush(void) +term__flush(EditLine *el) { - (void) fflush(term_outfile); + (void) fflush(el->el_outfile); } /* term_writec(): @@ -1267,10 +1290,10 @@ protected void term_writec(EditLine *el, int c) { char buf[8]; - int cnt = key__decode_char(buf, sizeof(buf), 0, c); + size_t cnt = key__decode_char(buf, sizeof(buf), 0, c); buf[cnt] = '\0'; - term_overwrite(el, buf, cnt); - term__flush(); + term_overwrite(el, buf, (size_t)cnt); + term__flush(el); } @@ -1585,7 +1608,7 @@ term_echotc(EditLine *el, int argc __unused, *argv); return (-1); } - (void) tputs(scap, 1, term__putc); + term_tputs(el, scap, 1); break; case 1: argv++; @@ -1613,7 +1636,7 @@ term_echotc(EditLine *el, int argc __unused, *argv); return (-1); } - (void) tputs(tgoto(scap, arg_cols, arg_rows), 1, term__putc); + term_tputs(el, tgoto(scap, arg_cols, arg_rows), 1); break; default: /* This is wrong, but I will ignore it... */ @@ -1669,8 +1692,7 @@ term_echotc(EditLine *el, int argc __unused, *argv); return (-1); } - (void) tputs(tgoto(scap, arg_cols, arg_rows), arg_rows, - term__putc); + term_tputs(el, tgoto(scap, arg_cols, arg_rows), arg_rows); break; } return (0); diff --git a/lib/libedit/term.h b/lib/libedit/term.h index 15d393c489e..4bf4685f7f7 100644 --- a/lib/libedit/term.h +++ b/lib/libedit/term.h @@ -85,7 +85,7 @@ typedef struct { protected void term_move_to_line(EditLine *, int); protected void term_move_to_char(EditLine *, int); protected void term_clear_EOL(EditLine *, int); -protected void term_overwrite(EditLine *, const char *, int); +protected void term_overwrite(EditLine *, const char *, size_t); protected void term_insertwrite(EditLine *, char *, int); protected void term_deletechars(EditLine *, int); protected void term_clear_screen(EditLine *); @@ -105,8 +105,8 @@ protected int term_gettc(EditLine *, int, char **); protected int term_telltc(EditLine *, int, const char **); protected int term_echotc(EditLine *, int, const char **); protected void term_writec(EditLine *, int); -protected int term__putc(int); -protected void term__flush(void); +protected int term__putc(EditLine *, int); +protected void term__flush(EditLine *); /* * Easy access macros diff --git a/lib/libedit/tty.c b/lib/libedit/tty.c index fca3c2bbe1d..c0b4638b323 100644 --- a/lib/libedit/tty.c +++ b/lib/libedit/tty.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $NetBSD: tty.c,v 1.24 2006/03/18 09:07:05 christos Exp $ + * $NetBSD: tty.c,v 1.25 2006/03/18 09:09:41 christos Exp $ */ #if !defined(lint) && !defined(SCCSID) diff --git a/lib/libedit/vi.c b/lib/libedit/vi.c index ae57e07a01d..4826901a2c2 100644 --- a/lib/libedit/vi.c +++ b/lib/libedit/vi.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $NetBSD: vi.c,v 1.25 2006/03/06 21:11:56 christos Exp $ + * $NetBSD: vi.c,v 1.30 2009/02/21 23:31:56 christos Exp $ */ #if !defined(lint) && !defined(SCCSID) @@ -63,7 +63,7 @@ cv_action(EditLine *el, int c) if (!(c & YANK)) cv_undo(el); cv_yank(el, el->el_line.buffer, - el->el_line.lastchar - el->el_line.buffer); + (int)(el->el_line.lastchar - el->el_line.buffer)); el->el_chared.c_vcmd.action = NOP; el->el_chared.c_vcmd.pos = 0; if (!(c & YANK)) { @@ -87,12 +87,12 @@ private el_action_t cv_paste(EditLine *el, int c) { c_kill_t *k = &el->el_chared.c_kill; - int len = k->last - k->buf; + size_t len = (size_t)(k->last - k->buf); if (k->buf == NULL || len == 0) return (CC_ERROR); #ifdef DEBUG_PASTE - (void) fprintf(el->el_errfile, "Paste: \"%.*s\"\n", len, k->buf); + (void) fprintf(el->el_errfile, "Paste: \"%.*s\"\n", (int)len, k->buf); #endif cv_undo(el); @@ -100,10 +100,10 @@ cv_paste(EditLine *el, int c) if (!c && el->el_line.cursor < el->el_line.lastchar) el->el_line.cursor++; - c_insert(el, len); + c_insert(el, (int)len); if (el->el_line.cursor + len > el->el_line.lastchar) return (CC_ERROR); - (void) memcpy(el->el_line.cursor, k->buf, len +0u); + (void) memcpy(el->el_line.cursor, k->buf, len); return (CC_REFRESH); } @@ -358,7 +358,7 @@ vi_substitute_line(EditLine *el, int c __unused) cv_undo(el); cv_yank(el, el->el_line.buffer, - el->el_line.lastchar - el->el_line.buffer); + (int)(el->el_line.lastchar - el->el_line.buffer)); (void) em_kill_line(el, 0); el->el_map.current = el->el_map.key; return (CC_REFRESH); @@ -376,7 +376,7 @@ vi_change_to_eol(EditLine *el, int c __unused) cv_undo(el); cv_yank(el, el->el_line.cursor, - el->el_line.lastchar - el->el_line.cursor); + (int)(el->el_line.lastchar - el->el_line.cursor)); (void) ed_kill_line(el, 0); el->el_map.current = el->el_map.key; return (CC_REFRESH); @@ -516,7 +516,8 @@ vi_undo(EditLine *el, int c __unused) /* switch line buffer and undo buffer */ el->el_chared.c_undo.buf = el->el_line.buffer; el->el_chared.c_undo.len = el->el_line.lastchar - el->el_line.buffer; - el->el_chared.c_undo.cursor = el->el_line.cursor - el->el_line.buffer; + el->el_chared.c_undo.cursor = + (int)(el->el_line.cursor - el->el_line.buffer); el->el_line.limit = un.buf + (el->el_line.limit - el->el_line.buffer); el->el_line.buffer = un.buf; el->el_line.cursor = un.buf + un.cursor; @@ -641,7 +642,7 @@ vi_kill_line_prev(EditLine *el, int c __unused) while (cp < el->el_line.cursor) *kp++ = *cp++; /* copy it */ el->el_chared.c_kill.last = kp; - c_delbefore(el, el->el_line.cursor - el->el_line.buffer); + c_delbefore(el, (int)(el->el_line.cursor - el->el_line.buffer)); el->el_line.cursor = el->el_line.buffer; /* zap! */ return (CC_REFRESH); } @@ -797,7 +798,7 @@ vi_match(EditLine *el, int c) { const char match_chars[] = "()[]{}"; char *cp; - int delta, i, count; + size_t delta, i, count; char o_ch, c_ch; *el->el_line.lastchar = '\0'; /* just in case */ @@ -872,7 +873,7 @@ vi_yank_end(EditLine *el, int c) { cv_yank(el, el->el_line.cursor, - el->el_line.lastchar - el->el_line.cursor); + (int)(el->el_line.lastchar - el->el_line.cursor)); return CC_REFRESH; } @@ -993,7 +994,8 @@ vi_histedit(EditLine *el, int c) { int fd; pid_t pid; - int st; + ssize_t st; + int status; char tempfile[] = "/tmp/histedit.XXXXXXXXXX"; char *cp; @@ -1006,7 +1008,7 @@ vi_histedit(EditLine *el, int c) if (fd < 0) return CC_ERROR; cp = el->el_line.buffer; - write(fd, cp, el->el_line.lastchar - cp +0u); + write(fd, cp, (size_t)(el->el_line.lastchar - cp)); write(fd, "\n", 1); pid = fork(); switch (pid) { @@ -1016,14 +1018,14 @@ vi_histedit(EditLine *el, int c) return CC_ERROR; case 0: close(fd); - execlp("vi", "vi", tempfile, NULL); + execlp("vi", "vi", tempfile, (char *)NULL); exit(0); /*NOTREACHED*/ default: - while (waitpid(pid, &st, 0) != pid) + while (waitpid(pid, &status, 0) != pid) continue; - lseek(fd, 0ll, SEEK_SET); - st = read(fd, cp, el->el_line.limit - cp +0u); + lseek(fd, (off_t)0, SEEK_SET); + st = read(fd, cp, (size_t)(el->el_line.limit - cp)); if (st > 0 && cp[st - 1] == '\n') st--; el->el_line.cursor = cp; @@ -1072,7 +1074,7 @@ vi_history_word(EditLine *el, int c) return CC_ERROR; cv_undo(el); - len = wep - wsp; + len = (int)(wep - wsp); if (el->el_line.cursor < el->el_line.lastchar) el->el_line.cursor++; c_insert(el, len + 1); diff --git a/lib/libelf/Makefile b/lib/libelf/Makefile index fe921cbe674..ee968124dac 100644 --- a/lib/libelf/Makefile +++ b/lib/libelf/Makefile @@ -55,9 +55,24 @@ SRCS= elf_begin.c \ ${GENSRCS} INCS= libelf.h gelf.h +# +# We need to link against the correct version of these files. One +# solution is to include ../../sys in the include path. This causes +# problems when a header file in sys depends on a file in another +# part of the tree, e.g. a machine dependent header. +# +SRCS+= sys/elf32.h sys/elf64.h sys/elf_common.h + GENSRCS= libelf_fsize.c libelf_msize.c libelf_convert.c CLEANFILES= ${GENSRCS} -CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../../sys +CLEANDIRS= sys +CFLAGS+= -I${.CURDIR} -I. + +sys/elf32.h sys/elf64.h sys/elf_common.h: sys + ln -sf ${.CURDIR}/../../sys/${.TARGET} ${.TARGET} + +sys: + mkdir -p ${.OBJDIR}/sys SHLIB_MAJOR= 1 diff --git a/lib/libelf/elf.3 b/lib/libelf/elf.3 index 609fab60c0a..35bba9c3e8e 100644 --- a/lib/libelf/elf.3 +++ b/lib/libelf/elf.3 @@ -385,9 +385,9 @@ See This section contains a brief overview of the available functionality in the ELF library. Each function listed here is described further in its own manual page. -.Bl -tag -width indent +.Bl -tag -width 2n .It "Archive Access" -.Bl -tag -compact +.Bl -tag -width 17n -compact .It Fn elf_getarsym Retrieve the archive symbol table. .It Fn elf_getarhdr @@ -404,7 +404,7 @@ Random access inside an archive. .El .It "Data Structures" -.Bl -tag -compact +.Bl -tag -width 17n -compact .It Fn elf_getdata Retrieve translated data for an ELF section. .It Fn elf_getscn @@ -437,7 +437,7 @@ Allocate an Executable Header in an ELF object. Allocate or resize the Program Header Table in an ELF object. .El .It "Data Translation" -.Bl -tag -compact +.Bl -tag -width 17n -compact .It Fn elf32_xlatetof , Fn elf64_xlatetof Translate an ELF data structure from its native representation to its file representation. @@ -446,14 +446,14 @@ Translate an ELF data structure from its file representation to a native representation. .El .It "Error Reporting" -.Bl -tag -compact +.Bl -tag -width 17n -compact .It Fn elf_errno Retrieve the current error. .It Fn elf_errmsg Retrieve a human readable description of the current error. .El .It "Initialization" -.Bl -tag -compact +.Bl -tag -width 17n -compact .It Fn elf_begin Opens an .Xr ar 1 @@ -468,7 +468,7 @@ archive or ELF object present in a memory area. Sets the operating version. .El .It "IO Control" -.Bl -tag -width ".Fn elf_setshstrndx" -compact +.Bl -tag -width 17n -compact .It Fn elf_cntl Manage the association between and ELF descriptor and its underlying file. .It Fn elf_flagdata @@ -492,7 +492,7 @@ Recompute ELF object layout and optionally write the modified object back to the underlying file. .El .It "Queries" -.Bl -tag -width ".Fn elf_getshstrndx" -compact +.Bl -tag -width 17n -compact .It Fn elf32_checksum , Fn elf64_checkum Compute checksum of an ELF object. .It Fn elf_getident diff --git a/lib/libelf/elf_begin.3 b/lib/libelf/elf_begin.3 index ea68c26c6f8..6d9371a9a6f 100644 --- a/lib/libelf/elf_begin.3 +++ b/lib/libelf/elf_begin.3 @@ -252,7 +252,7 @@ was created. .It Bq Er ELF_E_ARGUMENT An .Xr ar 1 -archive was opened with with +archive was opened with .Ar cmd set to .Dv ELF_C_RDWR . diff --git a/lib/libelf/elf_getdata.3 b/lib/libelf/elf_getdata.3 index 9416a2c788f..97766d8e8c9 100644 --- a/lib/libelf/elf_getdata.3 +++ b/lib/libelf/elf_getdata.3 @@ -144,7 +144,7 @@ structures of type .Dv ELF_T_BYTE . .Ss Special handling of zero-sized and SHT_NOBITS sections For sections of type -.Dv SHT_NOBITS, +.Dv SHT_NOBITS , and for zero-sized sections, the functions .Fn elf_getdata diff --git a/lib/libelf/elf_strptr.3 b/lib/libelf/elf_strptr.3 index d672388c262..d2282df14ee 100644 --- a/lib/libelf/elf_strptr.3 +++ b/lib/libelf/elf_strptr.3 @@ -64,7 +64,7 @@ encountered. .It Bq Er ELF_E_ARGUMENT Argument .Ar elf -was NULL +was NULL. .It Bq Er ELF_E_ARGUMENT Argument .Ar elf diff --git a/lib/libelf/gelf.3 b/lib/libelf/gelf.3 index d541388aee3..1c2f0108f6c 100644 --- a/lib/libelf/gelf.3 +++ b/lib/libelf/gelf.3 @@ -115,7 +115,7 @@ routines will signal an error if a GElf value is out of range for the underlying ELF data type. .Ss Namespace use The GElf interface uses the following symbols: -.Bl -tag +.Bl -tag -width 8n .It GElf_* Class-independent data types. .It gelf_* @@ -125,16 +125,16 @@ For functions defined in the API set. This section provides an overview of the GElf programming APIs. Further information is provided in the manual page of each function listed here. -.Bl -tag +.Bl -tag -width 2n .It "Allocating ELF Data Structures" -.Bl -tag -compact +.Bl -tag -width 19n -compact .It Fn gelf_newehdr Allocate a new ELF Executable Header. .It Fn gelf_newphdr Allocate a new ELF Program Header Table. .El .It "Data Translation" -.Bl -tag -compact +.Bl -tag -width 19n -compact .It Fn gelf_xlatetof Translate the native representation of an ELF data structure to its file representation. @@ -143,7 +143,7 @@ Translate from the file representation of an ELF data structure to a native representation. .El .It "Retrieving ELF Data" -.Bl -tag -compact +.Bl -tag -width 19n -compact .It Fn gelf_getdyn Retrieve an ELF .Sy .dynamic @@ -162,7 +162,7 @@ Retrieve an ELF Section Header Table entry from the underlying ELF descriptor. Retrieve an ELF symbol table entry. .El .It Queries -.Bl -tag -compact +.Bl -tag -width 19n -compact .It Fn gelf_checksum Retrieves the ELF checksum for an ELF descriptor. .It Fn gelf_fsize @@ -171,7 +171,7 @@ Retrieves the size of the file representation of an ELF type. Retrieves the ELF class of an ELF descriptor. .El .It "Updating ELF Data" -.Bl -tag -compact -width ".Fn gelf_update_shdr" +.Bl -tag -width 19n -compact .It Fn gelf_update_dyn Copy back an ELF .Sy .dynamic diff --git a/lib/libelf/gelf_getphdr.3 b/lib/libelf/gelf_getphdr.3 index 53fab17bba8..13c588fb103 100644 --- a/lib/libelf/gelf_getphdr.3 +++ b/lib/libelf/gelf_getphdr.3 @@ -66,7 +66,7 @@ Function will retrieve the program header table entry at index .Ar index from ELF descriptor -.Ar elf. +.Ar elf . The translated program header table entry will be written to the address pointed to be argument .Ar dst . diff --git a/lib/libelf/gelf_newehdr.3 b/lib/libelf/gelf_newehdr.3 index 6a2edf8f042..4dab64708bf 100644 --- a/lib/libelf/gelf_newehdr.3 +++ b/lib/libelf/gelf_newehdr.3 @@ -58,7 +58,8 @@ structure. Function .Fn elf64_newehdr returns a pointer to a 64 bit -.Vt Elf64_Ehdr structure. +.Vt Elf64_Ehdr +structure. .Pp When argument .Ar elfclass diff --git a/lib/libfetch/common.c b/lib/libfetch/common.c index e6f67c30a37..425b6de1314 100644 --- a/lib/libfetch/common.c +++ b/lib/libfetch/common.c @@ -209,11 +209,13 @@ conn_t * fetch_reopen(int sd) { conn_t *conn; + int opt = 1; /* allocate and fill connection structure */ if ((conn = calloc(1, sizeof(*conn))) == NULL) return (NULL); fcntl(sd, F_SETFD, FD_CLOEXEC); + setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof opt); conn->sd = sd; ++conn->ref; return (conn); @@ -455,11 +457,9 @@ fetch_read(conn_t *conn, char *buf, size_t len) struct timeval now, timeout, delta; fd_set readfds; ssize_t rlen, total; - int r; char *start; - if (fetchTimeout) { - FD_ZERO(&readfds); + if (fetchTimeout > 0) { gettimeofday(&timeout, NULL); timeout.tv_sec += fetchTimeout; } @@ -523,23 +523,21 @@ fetch_read(conn_t *conn, char *buf, size_t len) return (-1); } // assert(rlen == FETCH_READ_WAIT); - while (fetchTimeout && !FD_ISSET(conn->sd, &readfds)) { + FD_ZERO(&readfds); + while (!FD_ISSET(conn->sd, &readfds)) { FD_SET(conn->sd, &readfds); - gettimeofday(&now, NULL); - delta.tv_sec = timeout.tv_sec - now.tv_sec; - delta.tv_usec = timeout.tv_usec - now.tv_usec; - if (delta.tv_usec < 0) { - delta.tv_usec += 1000000; - delta.tv_sec--; - } - if (delta.tv_sec < 0) { - errno = ETIMEDOUT; - fetch_syserr(); - return (-1); + if (fetchTimeout > 0) { + gettimeofday(&now, NULL); + if (!timercmp(&timeout, &now, >)) { + errno = ETIMEDOUT; + fetch_syserr(); + return (-1); + } + timersub(&timeout, &now, &delta); } errno = 0; - r = select(conn->sd + 1, &readfds, NULL, NULL, &delta); - if (r == -1) { + if (select(conn->sd + 1, &readfds, NULL, NULL, + fetchTimeout > 0 ? &delta : NULL) < 0) { if (errno == EINTR) { if (fetchRestartCalls) continue; diff --git a/lib/libfetch/http.c b/lib/libfetch/http.c index 557ff26ebf9..f6e063aa712 100644 --- a/lib/libfetch/http.c +++ b/lib/libfetch/http.c @@ -1779,7 +1779,9 @@ http_request(struct url *URL, const char *op, struct url_stat *us, DEBUG(fprintf(stderr, "failed to parse new URL\n")); goto ouch; } - if (!*new->user && !*new->pwd) { + + /* Only copy credentials if the host matches */ + if (!strcmp(new->host, url->host) && !*new->user && !*new->pwd) { strcpy(new->user, url->user); strcpy(new->pwd, url->pwd); } diff --git a/lib/libgpib/gpib.3 b/lib/libgpib/gpib.3 index 9d80ae0aadc..01f778b08be 100644 --- a/lib/libgpib/gpib.3 +++ b/lib/libgpib/gpib.3 @@ -207,7 +207,8 @@ The variable .Dv iberr provides an error code for the most recent library call. The possible error codes are: -.Bl -tag -offset indent -compact +.Pp +.Bl -tag -width 6n -offset indent -compact .It EDVR System error .It ECIC @@ -244,7 +245,8 @@ The variable .Dv ibsta contains the controller status. This is an ORed status value, with the following individual bit names: -.Bl -tag -offset indent -compact +.Pp +.Bl -tag -width 6n -offset indent -compact .It ERR Error .It TIMO @@ -329,7 +331,8 @@ The lower 8 bits of are interpreted as an end-of-string character, .Li EOS . This character can be ORed with the following values: -.Bl -tag -compact -offset indent +.Pp +.Bl -tag -width 6n -compact -offset indent .It Dv REOS When receiving a message byte on the bus that matches the .Li EOS @@ -348,6 +351,7 @@ If set, include all 8 bits of the character in the comparison; if unset, compare only 7 bit ASCII values. .El +.Pp Passing 0 as .Fa eos will turn off any special character treatment, allowing for a fully @@ -666,7 +670,7 @@ and sends its contents to the device. .Pp The function .Fn ibwrtkey -is obsolete, and not implemented +is obsolete, and not implemented. .Pp The function .Fn ibxtrc diff --git a/lib/libgssapi/gss_accept_sec_context.3 b/lib/libgssapi/gss_accept_sec_context.3 index 825c28d04b8..cc368876e39 100644 --- a/lib/libgssapi/gss_accept_sec_context.3 +++ b/lib/libgssapi/gss_accept_sec_context.3 @@ -212,7 +212,7 @@ exist in version 1 of the GSS-API specification, so applications that wish to run over version 1 implementations must special-case these codes. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It input_chan_bindings" .It context_handle Context handle for new context. Supply @@ -400,7 +400,7 @@ Specify Mechanism specific status code. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_DEFECTIVE_CREDENTIAL" .It GSS_S_CONTINUE_NEEDED Indicates that a token from the peer application is required to complete the context, @@ -442,7 +442,7 @@ the implementation or the provided credential. .Xr gss_release_name 3 , .Xr gss_wrap 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_acquire_cred.3 b/lib/libgssapi/gss_acquire_cred.3 index 4b683e7c579..0a6caada4bd 100644 --- a/lib/libgssapi/gss_acquire_cred.3 +++ b/lib/libgssapi/gss_acquire_cred.3 @@ -126,7 +126,7 @@ immediately following the call of must return valid credential data, and may therefore incur the overhead of a deferred credential acquisition. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It output_cred_handle" .It desired_name Name of principal whose credential should be acquired. .It time_req @@ -174,7 +174,7 @@ Specify NULL if not required. Mechanism specific status code. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_CREDENTIALS_EXPIRED" .It GSS_S_COMPLETE Successful completion. .It GSS_S_BAD_MECH @@ -196,7 +196,7 @@ No credentials were found for the specified name. .Xr gss_release_cred 3 , .Xr gss_release_oid_set 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_add_cred.3 b/lib/libgssapi/gss_add_cred.3 index 67ff1c3dc74..32d98859c04 100644 --- a/lib/libgssapi/gss_add_cred.3 +++ b/lib/libgssapi/gss_add_cred.3 @@ -170,7 +170,7 @@ a non- .Fa output_cred_handle must be supplied. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It output_cred_handle" .It minor_status Mechanism specific status code. .It input_cred_handle @@ -270,7 +270,7 @@ Specify if not required. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_CREDENTIALS_EXPIRED" .It GSS_S_COMPLETE Successful completion. .It GSS_S_BAD_MECH @@ -296,7 +296,7 @@ No credentials were found for the specified name. .Xr gss_release_cred 3 , .Xr gss_release_oid_set 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_add_oid_set_member.3 b/lib/libgssapi/gss_add_oid_set_member.3 index 5839da6717c..e812681442a 100644 --- a/lib/libgssapi/gss_add_oid_set_member.3 +++ b/lib/libgssapi/gss_add_oid_set_member.3 @@ -71,7 +71,7 @@ the .Fa oid_set should remain unchanged. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It member_oid @@ -80,7 +80,7 @@ The object identifier to copied into the set. The set in which the object identifier should be inserted. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_COMPLETE" .It GSS_S_COMPLETE Successful completion .El @@ -88,7 +88,7 @@ Successful completion .Xr gss_create_empty_oid_set 3 , .Xr gss_acquire_cred 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_canonicalize_name.3 b/lib/libgssapi/gss_canonicalize_name.3 index 036c0eff824..71daad54d70 100644 --- a/lib/libgssapi/gss_canonicalize_name.3 +++ b/lib/libgssapi/gss_canonicalize_name.3 @@ -62,7 +62,7 @@ specifying .Fa mech_type as the authentication mechanism. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It input_name @@ -79,7 +79,7 @@ after use with a call to .Fn gss_release_name . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_BAD_NAMETYPE" .It GSS_S_COMPLETE Successful completion. .It GSS_S_BAD_MECH @@ -95,7 +95,7 @@ The provided internal name was ill-formed. .Xr gss_init_sec_context 3 , .Xr gss_release_name 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_compare_name.3 b/lib/libgssapi/gss_compare_name.3 index 713af232da4..0890cf924b0 100644 --- a/lib/libgssapi/gss_compare_name.3 +++ b/lib/libgssapi/gss_compare_name.3 @@ -54,7 +54,7 @@ denotes an anonymous principal, the routines should indicate that the two names do not refer to the same identity. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width "minor_status" .It minor_status Mechanism specific status code. .It name1 @@ -62,7 +62,7 @@ Internal-form name. .It name2 Internal-form name. .It name_equal -.Bl -tag +.Bl -tag -width "non-zero" .It non-zero Names refer to same entity .It zero @@ -71,7 +71,7 @@ to refer to the same identity). .El .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_BAD_NAMETYPE" .It GSS_S_COMPLETE Successful completion .It GSS_S_BAD_NAMETYPE @@ -80,7 +80,7 @@ The two names were of incomparable types. One or both of name1 or name2 was ill-formed. .El .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_context_time.3 b/lib/libgssapi/gss_context_time.3 index b6b4157dd94..4dae1d96e41 100644 --- a/lib/libgssapi/gss_context_time.3 +++ b/lib/libgssapi/gss_context_time.3 @@ -47,7 +47,7 @@ Determines the number of seconds for which the specified context will remain valid. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It context_handle" .It minor_status Mechanism specific status code. .It context_handle @@ -57,7 +57,7 @@ Number of seconds that the context will remain valid. If the context has already expired, zero will be returned. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_CONTEXT_EXPIRED" .It GSS_S_COMPLETE Successful completion .It GSS_S_CONTEXT_EXPIRED @@ -66,7 +66,7 @@ The context has already expired The context_handle parameter did not identify a valid context .El .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_create_empty_oid_set.3 b/lib/libgssapi/gss_create_empty_oid_set.3 index 3a84f855c15..466ea01873b 100644 --- a/lib/libgssapi/gss_create_empty_oid_set.3 +++ b/lib/libgssapi/gss_create_empty_oid_set.3 @@ -51,7 +51,7 @@ These routines are intended to be used to construct sets of mechanism object identifiers for input to .Fn gss_acquire_cred . .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It oid_set @@ -61,7 +61,7 @@ which the application must free after use with a call to .Fn gss_release_oid_set . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_COMPLETE" .It GSS_S_COMPLETE Successful completion .El @@ -69,7 +69,7 @@ Successful completion .Xr gss_add_oid_set_member 3 , .Xr gss_acquire_cred 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_delete_sec_context.3 b/lib/libgssapi/gss_delete_sec_context.3 index 1c4fa7b6690..be121655909 100644 --- a/lib/libgssapi/gss_delete_sec_context.3 +++ b/lib/libgssapi/gss_delete_sec_context.3 @@ -88,7 +88,7 @@ mechanisms are encouraged to return a zero-length token, indicating that no peer action is necessary, and that no token should be transferred by the application. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It context_handle" .It minor_status Mechanism specific status code. .It context_handle @@ -110,7 +110,7 @@ field of this token to zero to indicate to the application that no token is to be sent to the peer. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It context_handle" .It GSS_S_COMPLETE Successful completion .It GSS_S_NO_CONTEXT @@ -121,7 +121,7 @@ No valid context was supplied .Xr gss_init_sec_context 3 , .Xr gss_accept_sec_context 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_display_name.3 b/lib/libgssapi/gss_display_name.3 index 4944995c467..f22fcf5c2fa 100644 --- a/lib/libgssapi/gss_display_name.3 +++ b/lib/libgssapi/gss_display_name.3 @@ -76,7 +76,7 @@ via the .Fa output_name_type parameter. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It output_name_buffer" .It minor_status Mechanism specific status code. .It input_name @@ -98,7 +98,7 @@ Specify if not required. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_COMPLETE" .It GSS_S_COMPLETE Successful completion .It GSS_S_BAD_NAME @@ -109,7 +109,7 @@ was ill-formed .Xr gss_import_name 3 , .Xr gss_release_buffer 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_display_status.3 b/lib/libgssapi/gss_display_status.3 index 4bf908bb1d0..7c05e62ccca 100644 --- a/lib/libgssapi/gss_display_status.3 +++ b/lib/libgssapi/gss_display_status.3 @@ -111,13 +111,13 @@ do { } while (message_context != 0); .Ed .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It status_value Status value to be converted .It status_type -.Bl -tag +.Bl -tag -width ".It GSS_C_MECH_CODE" .It GSS_C_GSS_CODE .Fa status_value is a GSS status code @@ -153,7 +153,7 @@ application after use with a call to .Fn gss_release_buffer . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_BAD_STATUS" .It GSS_S_COMPLETE Successful completion .It GSS_S_BAD_MECH @@ -168,7 +168,7 @@ nor .Sh SEE ALSO .Xr gss_release_buffer 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_duplicate_name.3 b/lib/libgssapi/gss_duplicate_name.3 index 5eb4a6284c4..f9c9f834432 100644 --- a/lib/libgssapi/gss_duplicate_name.3 +++ b/lib/libgssapi/gss_duplicate_name.3 @@ -57,7 +57,7 @@ and must both be released, and the release of one shall not affect the validity of the other). .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It src_name @@ -70,7 +70,7 @@ after use with a call to .Fn gss_release_name . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_COMPLETE" .It GSS_S_COMPLETE Successful completion .It GSS_S_BAD_NAME @@ -81,7 +81,7 @@ parameter was ill-formed .Sh SEE ALSO .Xr gss_release_name 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_export_name.3 b/lib/libgssapi/gss_export_name.3 index 5cbf803b949..f727c4520fe 100644 --- a/lib/libgssapi/gss_export_name.3 +++ b/lib/libgssapi/gss_export_name.3 @@ -58,7 +58,7 @@ parameter must specify a valid MN or by .Fn gss_canonicalize_name ). .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It exported_name" .It minor_status Mechanism specific status code. .It input_name @@ -71,7 +71,7 @@ after use with .Fn gss_release_buffer . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_BAD_NAMETYPE" .It GSS_S_COMPLETE Successful completion .It GSS_S_NAME_NOT_MN @@ -86,7 +86,7 @@ The internal name was of a type not supported by the GSS-API implementation. .Xr gss_canonicalize_name 3 , .Xr gss_release_buffer 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_export_sec_context.3 b/lib/libgssapi/gss_export_sec_context.3 index 7ecbef31717..ca1aedd68fd 100644 --- a/lib/libgssapi/gss_export_sec_context.3 +++ b/lib/libgssapi/gss_export_sec_context.3 @@ -100,7 +100,7 @@ providing it also sets the parameter to .Dv GSS_C_NO_CONTEXT . .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It interprocess_token" .It minor_status Mechanism specific status code. .It context_handle @@ -112,7 +112,7 @@ after use with a call to .Fn gss_release_buffer . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_CONTEXT_EXPIRED" .It GSS_S_COMPLETE Successful completion .It GSS_S_CONTEXT_EXPIRED @@ -126,7 +126,7 @@ The operation is not supported .Xr gss_import_sec_context 3 , .Xr gss_release_buffer 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_get_mic.3 b/lib/libgssapi/gss_get_mic.3 index e5d81fa77f4..431f9e3f806 100644 --- a/lib/libgssapi/gss_get_mic.3 +++ b/lib/libgssapi/gss_get_mic.3 @@ -81,7 +81,7 @@ both to allow GSS-API V1 applications to link and to retain the slight parameter type differences between the obsolete versions of this routine and its current form. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It message_buffer" .It minor_status Mechanism specific status code. .It context_handle @@ -109,7 +109,7 @@ use with a call to .Fn gss_release_buffer . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_CONTEXT_EXPIRED" .It GSS_S_COMPLETE Successful completion .It GSS_S_CONTEXT_EXPIRED @@ -123,7 +123,7 @@ The specified QOP is not supported by the mechanism .Xr gss_wrap 3 , .Xr gss_release_buffer 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_import_name.3 b/lib/libgssapi/gss_import_name.3 index aef1ae8cb10..df3ce9cc0d0 100644 --- a/lib/libgssapi/gss_import_name.3 +++ b/lib/libgssapi/gss_import_name.3 @@ -59,7 +59,7 @@ parameter is of type in which case the returned internal name will be an MN for the mechanism that exported the name. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It input_name_buffer" .It minor_status Mechanism specific status code. .It input_name_buffer @@ -78,7 +78,7 @@ after use with a call to .Fn gss_release_name . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width "It GSS_S_BAD_NAMETYPE" .It GSS_S_COMPLETE Successful completion .It GSS_S_BAD_NAMETYPE @@ -97,7 +97,7 @@ but the mechanism contained within the input-name is not supported .Sh SEE ALSO .Xr gss_release_name 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_import_sec_context.3 b/lib/libgssapi/gss_import_sec_context.3 index 87aaa7872c7..b2e1c783bac 100644 --- a/lib/libgssapi/gss_import_sec_context.3 +++ b/lib/libgssapi/gss_import_sec_context.3 @@ -50,7 +50,7 @@ A given interprocess token may be imported only once. See .Fn gss_export_sec_context . .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It interprocess_token" .It minor_status Mechanism specific status code. .It interprocess_token @@ -62,7 +62,7 @@ application after use with a call to .Fn gss_delete_sec_context . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_DEFECTIVE_TOKEN" .It GSS_S_COMPLETE Successful completion .It GSS_S_NO_CONTEXT @@ -78,7 +78,7 @@ Local policy prevents the import of this context by the current process .Xr gss_export_sec_context 3 , .Xr gss_delete_sec_context 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_indicate_mechs.3 b/lib/libgssapi/gss_indicate_mechs.3 index 3eec8615a17..c49c83a3022 100644 --- a/lib/libgssapi/gss_indicate_mechs.3 +++ b/lib/libgssapi/gss_indicate_mechs.3 @@ -46,7 +46,7 @@ Allows an application to determine which underlying security mechanisms are available. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It mech_set @@ -58,14 +58,14 @@ that should be released by the caller after use with a call to .Fn gss_release_oid_set . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_COMPLETE" .It GSS_S_COMPLETE Successful completion .El .Sh SEE ALSO .Xr gss_release_oid_set 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_init_sec_context.3 b/lib/libgssapi/gss_init_sec_context.3 index 9d14859fb41..51556a61334 100644 --- a/lib/libgssapi/gss_init_sec_context.3 +++ b/lib/libgssapi/gss_init_sec_context.3 @@ -233,7 +233,7 @@ exist in version 1 of the GSS-API specification, so applications that wish to run over version 1 implementations must special-case these codes. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It initiator_cred_handle" .It minor_status Mechanism specific status code. .It initiator_cred_handle @@ -475,7 +475,7 @@ not support context expiration, the value .Dv NULL if not required. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_CREDENTIALS_EXPIRED" .It GSS_S_COMPLETE Successful completion .It GSS_S_CONTINUE_NEEDED @@ -529,7 +529,7 @@ implementation. .Xr gss_release_buffer 3 , .Xr gss_wrap 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_inquire_context.3 b/lib/libgssapi/gss_inquire_context.3 index ba5d649facd..d31823427df 100644 --- a/lib/libgssapi/gss_inquire_context.3 +++ b/lib/libgssapi/gss_inquire_context.3 @@ -55,7 +55,7 @@ The caller must already have obtained a handle that refers to the context, although the context need not be fully established. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It locally_initiated" .It minor_status Mechanism specific status code. .It context_handle @@ -229,7 +229,7 @@ Specify if not required. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_NO_CONTEXT" .It GSS_S_COMPLETE Successful completion .It GSS_S_NO_CONTEXT @@ -242,7 +242,7 @@ The referenced context could not be accessed .Xr gss_get_mic 3 , .Xr gss_export_sec_context 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_inquire_cred.3 b/lib/libgssapi/gss_inquire_cred.3 index 923b3734bea..8bbe0da4ca8 100644 --- a/lib/libgssapi/gss_inquire_cred.3 +++ b/lib/libgssapi/gss_inquire_cred.3 @@ -50,7 +50,7 @@ .Sh DESCRIPTION Obtains information about a credential. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It cred_handle @@ -99,7 +99,7 @@ Specify if not required. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_DEFECTIVE_CREDENTIAL" .It GSS_S_COMPLETE Successful completion .It GSS_S_NO_CRED @@ -116,7 +116,7 @@ it will be set to 0 .Xr gss_release_name 3 , .Xr gss_release_oid_set 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_inquire_cred_by_mech.3 b/lib/libgssapi/gss_inquire_cred_by_mech.3 index c316930cffb..ebe61969896 100644 --- a/lib/libgssapi/gss_inquire_cred_by_mech.3 +++ b/lib/libgssapi/gss_inquire_cred_by_mech.3 @@ -50,7 +50,7 @@ .Sh DESCRIPTION Obtains per-mechanism information about a credential. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It initiator_lifetime" .It minor_status Mechanism specific status code. .It cred_handle @@ -114,7 +114,7 @@ Specify if not required. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_DEFECTIVE_CREDENTIAL" .It GSS_S_COMPLETE Successful completion .It GSS_S_NO_CRED @@ -130,7 +130,7 @@ it will be set to 0. .Sh SEE ALSO .Xr gss_release_name 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_inquire_mechs_for_name.3 b/lib/libgssapi/gss_inquire_mechs_for_name.3 index d8d94edb482..661f9ac6a4f 100644 --- a/lib/libgssapi/gss_inquire_mechs_for_name.3 +++ b/lib/libgssapi/gss_inquire_mechs_for_name.3 @@ -68,7 +68,7 @@ type). Thus this routine should be used only as a pre-filter for a call to a subsequent mechanism-specific routine. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It input_name @@ -80,7 +80,7 @@ to .Fn gss_release_oid_set . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_COMPLETE" .It GSS_S_COMPLETE Successful completion .It GSS_S_BAD_NAME @@ -91,7 +91,7 @@ parameter was ill-formed .Sh SEE ALSO .Xr gss_release_oid_set 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_inquire_names_for_mech.3 b/lib/libgssapi/gss_inquire_names_for_mech.3 index c1b7528b56e..591ddb9c1b4 100644 --- a/lib/libgssapi/gss_inquire_names_for_mech.3 +++ b/lib/libgssapi/gss_inquire_names_for_mech.3 @@ -46,7 +46,7 @@ .Sh DESCRIPTION Returns the set of name-types supported by the specified mechanism. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It mechanism @@ -58,14 +58,14 @@ call to .Fn gss_release_oid_set . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width "GSS_S_COMPLETEXX" .It GSS_S_COMPLETE Successful completion .El .Sh SEE ALSO .Xr gss_release_oid_set 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_process_context_token.3 b/lib/libgssapi/gss_process_context_token.3 index 53f5ebfcc53..a7e0ab4c834 100644 --- a/lib/libgssapi/gss_process_context_token.3 +++ b/lib/libgssapi/gss_process_context_token.3 @@ -71,7 +71,7 @@ believing that the context is fully established. .Fn gss_process_context_token provides a way to pass such a token to the mechanism at any time. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It context_handle" .It minor_status Mechanism specific status code. .It context_handle @@ -80,7 +80,7 @@ Context handle of context on which token is to be processed. Token to process. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_DEFECTIVE_TOKEN" .It GSS_S_COMPLETE Successful completion .It GSS_S_DEFECTIVE_TOKEN @@ -94,7 +94,7 @@ did not refer to a valid context .Xr gss_init_sec_context 3 , .Xr gss_accept_sec_context 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_release_buffer.3 b/lib/libgssapi/gss_release_buffer.3 index c4acf81faf4..d71a6f23b2c 100644 --- a/lib/libgssapi/gss_release_buffer.3 +++ b/lib/libgssapi/gss_release_buffer.3 @@ -55,7 +55,7 @@ Any buffer object returned by a GSS-API routine may be passed to .Fn gss_release_buffer (even if there is no storage associated with the buffer). .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It buffer @@ -64,12 +64,12 @@ The gss_buffer_desc object will not be freed, but its length field will be zeroed. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_COMPLETE" .It GSS_S_COMPLETE Successful completion .El .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_release_cred.3 b/lib/libgssapi/gss_release_cred.3 index 38fc7844bea..99377e5fade 100644 --- a/lib/libgssapi/gss_release_cred.3 +++ b/lib/libgssapi/gss_release_cred.3 @@ -50,7 +50,7 @@ Implementations are encouraged to set the cred_handle to .Dv GSS_C_NO_CREDENTIAL on successful completion of this call. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It cred_handle @@ -59,14 +59,14 @@ If GSS_C_NO_CREDENTIAL is supplied, the routine will complete successfully, but will do nothing. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_COMPLETE" .It GSS_S_COMPLETE Successful completion .It GSS_S_NO_CRED Credentials could not be accessed .El .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_release_name.3 b/lib/libgssapi/gss_release_name.3 index ca737e0af3a..b6f046e87e3 100644 --- a/lib/libgssapi/gss_release_name.3 +++ b/lib/libgssapi/gss_release_name.3 @@ -48,21 +48,21 @@ Implementations are encouraged to set the name to .Dv GSS_C_NO_NAME on successful completion of this call. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor status" .It minor_status Mechanism specific status code. .It name The name to be deleted. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_COMPLETE" .It GSS_S_COMPLETE Successful completion .It GSS_S_BAD_NAME The name parameter did not contain a valid name .El .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_release_oid_set.3 b/lib/libgssapi/gss_release_oid_set.3 index 7de4e9ae195..668581629a3 100644 --- a/lib/libgssapi/gss_release_oid_set.3 +++ b/lib/libgssapi/gss_release_oid_set.3 @@ -55,19 +55,19 @@ Implementations are encouraged to set the gss_OID_set parameter to .Dv GSS_C_NO_OID_SET on successful completion of this routine. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It set The storage associated with the gss_OID_set will be deleted. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_COMPLETE" .It GSS_S_COMPLETE Successful completion .El .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_test_oid_set_member.3 b/lib/libgssapi/gss_test_oid_set_member.3 index c6dad0f2fe7..5588e8a66bd 100644 --- a/lib/libgssapi/gss_test_oid_set_member.3 +++ b/lib/libgssapi/gss_test_oid_set_member.3 @@ -54,7 +54,7 @@ and .Fn gss_inquire_cred , but will also work with user-generated sets. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It minor_status" .It minor_status Mechanism specific status code. .It member @@ -65,7 +65,7 @@ The Object Identifier set. Non-zero if the specified OID is a member of the set, zero if not. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_COMPLETE" .It GSS_S_COMPLETE Successful completion .El @@ -74,7 +74,7 @@ Successful completion .Xr gss_acquire_cred 3 , .Xr gss_inquire_cred 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_unwrap.3 b/lib/libgssapi/gss_unwrap.3 index 94537a49650..368b361efeb 100644 --- a/lib/libgssapi/gss_unwrap.3 +++ b/lib/libgssapi/gss_unwrap.3 @@ -90,7 +90,7 @@ both to allow GSS-API V1 applications to link and to retain the slight parameter type differences between the obsolete versions of this routine and its current form. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It output_message_buffer" .It minor_status Mechanism specific status code. .It context_handle @@ -100,7 +100,7 @@ Protected message. .It output_message_buffer Buffer to receive unwrapped message. Storage associated with this buffer must -be freed by the application after use use +be freed by the application after use with a call to .Xr gss_release_buffer 3 . .It conf_state @@ -116,7 +116,7 @@ Specify NULL if not required. Quality of protection provided. Specify NULL if not required. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_CONTEXT_EXPIRED" .It GSS_S_COMPLETE Successful completion. .It GSS_S_DEFECTIVE_TOKEN @@ -150,7 +150,7 @@ The context_handle parameter did not identify a valid context. .Xr gss_wrap 3 , .Xr gss_release_buffer 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_verify_mic.3 b/lib/libgssapi/gss_verify_mic.3 index e8a46119422..ae7cee2a83b 100644 --- a/lib/libgssapi/gss_verify_mic.3 +++ b/lib/libgssapi/gss_verify_mic.3 @@ -81,7 +81,7 @@ both to allow GSS-API V1 applications to link and to retain the slight parameter type differences between the obsolete versions of this routine and its current form. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It context_handle" .It minor_status Mechanism specific status code. .It context_handle @@ -97,7 +97,7 @@ Specify if not required. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_CONTEXT_EXPIRED" .It GSS_S_COMPLETE Successful completion .It GSS_S_DEFECTIVE_TOKEN @@ -130,7 +130,7 @@ The context_handle parameter did not identify a valid context .Sh SEE ALSO .Xr gss_wrap 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_wrap.3 b/lib/libgssapi/gss_wrap.3 index 5732dd24cf8..edc13458369 100644 --- a/lib/libgssapi/gss_wrap.3 +++ b/lib/libgssapi/gss_wrap.3 @@ -85,13 +85,13 @@ both to allow GSS-API V1 applications to link and to retain the slight parameter type differences between the obsolete versions of this routine and its current form. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It output_message_buffer" .It minor_status Mechanism specific status code. .It context_handle Identifies the context on which the message will be sent. .It conf_req_flag -.Bl -tag -width "Non-zero" +.Bl -tag -width "Non-zero" -compact .It Non-zero Both confidentiality and integrity services are requested. .It Zero @@ -108,7 +108,7 @@ will return a major_status of .It input_message_buffer Message to be protected. .It conf_state -.Bl -tag -width "Non-zero" +.Bl -tag -width "Non-zero" -compact .It Non-zero Confidentiality, data origin authentication and integrity services have been applied. @@ -118,12 +118,12 @@ Integrity and data origin services only has been applied. .It output_message_buffer Buffer to receive protected message. Storage associated with this buffer must -be freed by the application after use use +be freed by the application after use with a call to .Xr gss_release_buffer 3 . .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_CONTEXT_EXPIRED" .It GSS_S_COMPLETE Successful completion. .It GSS_S_CONTEXT_EXPIRED @@ -137,7 +137,7 @@ The specified QOP is not supported by the mechanism. .Xr gss_unwrap 3 , .Xr gss_release_buffer 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gss_wrap_size_limit.3 b/lib/libgssapi/gss_wrap_size_limit.3 index 7a1cb599ad2..afbff864812 100644 --- a/lib/libgssapi/gss_wrap_size_limit.3 +++ b/lib/libgssapi/gss_wrap_size_limit.3 @@ -83,7 +83,7 @@ the implementation should not return a value via .Dv max_input_bytes that is greater than this length. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It req_output_size" .It minor_status Mechanism specific status code. .It context_handle @@ -109,7 +109,7 @@ be no larger than bytes. .El .Sh RETURN VALUES -.Bl -tag +.Bl -tag -width ".It GSS_S_CONTEXT_EXPIRED" .It GSS_S_COMPLETE Successful completion. .It GSS_S_NO_CONTEXT @@ -122,7 +122,7 @@ The specified QOP is not supported by the mechanism. .Sh SEE ALSO .Xr gss_wrap 3 .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/gssapi.3 b/lib/libgssapi/gssapi.3 index 121d9e42e6e..d41595e48b9 100644 --- a/lib/libgssapi/gssapi.3 +++ b/lib/libgssapi/gssapi.3 @@ -219,7 +219,7 @@ functionality is not available from the generic forms. Applications are encouraged to use the generic routines wherever possible on portability grounds. .Sh STANDARDS -.Bl -tag +.Bl -tag -width ".It RFC 2743" .It RFC 2743 Generic Security Service Application Program Interface Version 2, Update 1 .It RFC 2744 diff --git a/lib/libgssapi/mech.5 b/lib/libgssapi/mech.5 index b56565e3d15..dd15ba98938 100644 --- a/lib/libgssapi/mech.5 +++ b/lib/libgssapi/mech.5 @@ -39,17 +39,17 @@ The file contains a list of installed GSS-API security mechanisms. Each line of the file either contains a comment if the first character is '#' or it contains five fields with the following meanings: -.Bl -tag +.Bl -tag -width ".It Object identifier" .It Name The name of this GSS-API mechanism. .It Object identifier The OID for this mechanism. .It Library A shared library containing the implementation of this mechanism. -.It Kernel module (optional) -A kernel module containing the implementation of this mechanism (not +.It Kernel module +Optional kernel module containing the implementation of this mechanism (not yet supported in FreeBSD). -.It Library options (optional) +.It Library options Optional parameters interpreted by the mechanism. Library options must be enclosed in brackets ([ ]) to differentiate them from the optional kernel module entry. @@ -68,7 +68,7 @@ file contains a list of Quality of Protection values for use with GSS-API. Each line of the file either contains a comment if the first character is '#' or it contains three fields with the following meanings: -.Bl -tag +.Bl -tag -width ".It Mechanism name" .It QOP string The name of this Quality of Protection algorithm. .It QOP value diff --git a/lib/libjail/jail.c b/lib/libjail/jail.c index af0e40a0dc4..5cd2ad2dc90 100644 --- a/lib/libjail/jail.c +++ b/lib/libjail/jail.c @@ -853,9 +853,9 @@ jailparam_free(struct jailparam *jp, unsigned njp) static int jailparam_type(struct jailparam *jp) { - char *p, *nname; + char *p, *name, *nname; size_t miblen, desclen; - int isarray; + int i, isarray; struct { int i; char s[MAXPATHLEN]; @@ -863,7 +863,8 @@ jailparam_type(struct jailparam *jp) int mib[CTL_MAXNAME]; /* The "lastjid" parameter isn't real. */ - if (!strcmp(jp->jp_name, "lastjid")) { + name = jp->jp_name; + if (!strcmp(name, "lastjid")) { jp->jp_valuelen = sizeof(int); jp->jp_ctltype = CTLTYPE_INT | CTLFLAG_WR; return (0); @@ -872,19 +873,19 @@ jailparam_type(struct jailparam *jp) /* Find the sysctl that describes the parameter. */ mib[0] = 0; mib[1] = 3; - snprintf(desc.s, sizeof(desc.s), SJPARAM ".%s", jp->jp_name); + snprintf(desc.s, sizeof(desc.s), SJPARAM ".%s", name); miblen = sizeof(mib) - 2 * sizeof(int); if (sysctl(mib, 2, mib + 2, &miblen, desc.s, strlen(desc.s)) < 0) { if (errno != ENOENT) { snprintf(jail_errmsg, JAIL_ERRMSGLEN, - "sysctl(0.3.%s): %s", jp->jp_name, strerror(errno)); + "sysctl(0.3.%s): %s", name, strerror(errno)); return (-1); } /* * The parameter probably doesn't exist. But it might be * the "no" counterpart to a boolean. */ - nname = nononame(jp->jp_name); + nname = nononame(name); if (nname == NULL) { unknown_parameter: snprintf(jail_errmsg, JAIL_ERRMSGLEN, @@ -892,8 +893,10 @@ jailparam_type(struct jailparam *jp) errno = ENOENT; return (-1); } - snprintf(desc.s, sizeof(desc.s), SJPARAM ".%s", nname); + name = alloca(strlen(nname) + 1); + strcpy(name, nname); free(nname); + snprintf(desc.s, sizeof(desc.s), SJPARAM ".%s", name); miblen = sizeof(mib) - 2 * sizeof(int); if (sysctl(mib, 2, mib + 2, &miblen, desc.s, strlen(desc.s)) < 0) @@ -906,7 +909,7 @@ jailparam_type(struct jailparam *jp) if (sysctl(mib, (miblen / sizeof(int)) + 2, &desc, &desclen, NULL, 0) < 0) { snprintf(jail_errmsg, JAIL_ERRMSGLEN, - "sysctl(0.4.%s): %s", jp->jp_name, strerror(errno)); + "sysctl(0.4.%s): %s", name, strerror(errno)); return (-1); } jp->jp_ctltype = desc.i; @@ -952,7 +955,7 @@ jailparam_type(struct jailparam *jp) if (sysctl(mib + 2, miblen / sizeof(int), desc.s, &desclen, NULL, 0) < 0) { snprintf(jail_errmsg, JAIL_ERRMSGLEN, - "sysctl(" SJPARAM ".%s): %s", jp->jp_name, + "sysctl(" SJPARAM ".%s): %s", name, strerror(errno)); return (-1); } @@ -970,28 +973,39 @@ jailparam_type(struct jailparam *jp) if (sysctl(mib + 2, miblen / sizeof(int), NULL, &jp->jp_valuelen, NULL, 0) < 0) { snprintf(jail_errmsg, JAIL_ERRMSGLEN, - "sysctl(" SJPARAM ".%s): %s", jp->jp_name, + "sysctl(" SJPARAM ".%s): %s", name, strerror(errno)); return (-1); } } break; case CTLTYPE_NODE: - /* A node might be described by an empty-named child. */ + /* + * A node might be described by an empty-named child, + * which would be immediately before or after the node itself. + */ mib[1] = 1; - mib[(miblen / sizeof(int)) + 2] = - mib[(miblen / sizeof(int)) + 1] - 1; miblen += sizeof(int); - desclen = sizeof(desc.s); - if (sysctl(mib, (miblen / sizeof(int)) + 2, desc.s, &desclen, - NULL, 0) < 0) { - snprintf(jail_errmsg, JAIL_ERRMSGLEN, - "sysctl(0.1): %s", strerror(errno)); - return (-1); + for (i = -1; i <= 1; i += 2) { + mib[(miblen / sizeof(int)) + 1] = + mib[(miblen / sizeof(int))] + i; + desclen = sizeof(desc.s); + if (sysctl(mib, (miblen / sizeof(int)) + 2, desc.s, + &desclen, NULL, 0) < 0) { + if (errno == ENOENT) + continue; + snprintf(jail_errmsg, JAIL_ERRMSGLEN, + "sysctl(0.1): %s", strerror(errno)); + return (-1); + } + if (desclen == sizeof(SJPARAM) + strlen(name) + 2 && + memcmp(SJPARAM ".", desc.s, sizeof(SJPARAM)) == 0 && + memcmp(name, desc.s + sizeof(SJPARAM), + desclen - sizeof(SJPARAM) - 2) == 0 && + desc.s[desclen - 2] == '.') + goto mib_desc; } - if (desc.s[desclen - 2] != '.') - goto unknown_parameter; - goto mib_desc; + goto unknown_parameter; default: snprintf(jail_errmsg, JAIL_ERRMSGLEN, "unknown type for %s", jp->jp_name); diff --git a/lib/libkiconv/Makefile b/lib/libkiconv/Makefile index 4ba860ef903..bda505eeaff 100644 --- a/lib/libkiconv/Makefile +++ b/lib/libkiconv/Makefile @@ -1,7 +1,10 @@ # $FreeBSD$ -LIB= kiconv SHLIBDIR?= /lib + +.include + +LIB= kiconv SRCS= kiconv_sysctl.c xlat16_iconv.c xlat16_sysctl.c SRCS+= quirks.c @@ -17,4 +20,8 @@ CFLAGS+= -I${.CURDIR}/../../sys WARNS?= 1 +.if ${MK_ICONV} == "no" +CFLAGS+= -DICONV_DLOPEN +.endif + .include diff --git a/lib/libkiconv/xlat16_iconv.c b/lib/libkiconv/xlat16_iconv.c index dc9dc865aba..f402b784d85 100644 --- a/lib/libkiconv/xlat16_iconv.c +++ b/lib/libkiconv/xlat16_iconv.c @@ -60,10 +60,18 @@ struct xlat16_table { static struct xlat16_table kiconv_xlat16_open(const char *, const char *, int); static int chklocale(int, const char *); +#ifdef ICONV_DLOPEN static int my_iconv_init(void); static iconv_t (*my_iconv_open)(const char *, const char *); static size_t (*my_iconv)(iconv_t, const char **, size_t *, char **, size_t *); static int (*my_iconv_close)(iconv_t); +#else +#include +#define my_iconv_init() 0 +#define my_iconv_open iconv_open +#define my_iconv iconv +#define my_iconv_close iconv_close +#endif static size_t my_iconv_char(iconv_t, const u_char **, size_t *, u_char **, size_t *); int @@ -310,6 +318,7 @@ chklocale(int category, const char *code) return (error); } +#ifdef ICONV_DLOPEN static int my_iconv_init(void) { @@ -327,6 +336,7 @@ my_iconv_init(void) return (0); } +#endif static size_t my_iconv_char(iconv_t cd, const u_char **ibuf, size_t * ilen, u_char **obuf, diff --git a/lib/libkvm/kvm_getpcpu.3 b/lib/libkvm/kvm_getpcpu.3 index 92036ca5fa5..1e0c1f4f48c 100644 --- a/lib/libkvm/kvm_getpcpu.3 +++ b/lib/libkvm/kvm_getpcpu.3 @@ -114,7 +114,7 @@ it returns -1 instead. On success, the .Fn kvm_getpcpu function returns a pointer to an allocated buffer or -.Dv NULL. +.Dv NULL . If an error occurs, it returns -1 instead. .Pp @@ -124,7 +124,7 @@ call returns 0; if an error occurs, it returns -1 instead. .Pp If any function encounters an error, then an error message may be retrieved via -.Xr kvm_geterr 3. +.Xr kvm_geterr 3 . .Sh SEE ALSO .Xr free 3 , .Xr kvm 3 diff --git a/lib/libmagic/Makefile b/lib/libmagic/Makefile index 59573060afb..fbf71efac83 100644 --- a/lib/libmagic/Makefile +++ b/lib/libmagic/Makefile @@ -39,8 +39,9 @@ magic.mgc: mkmagic magic CLEANFILES+= mkmagic build-tools: mkmagic -mkmagic: apprentice.c funcs.c magic.c print.c - ${CC} ${CFLAGS} -DCOMPILE_ONLY ${LDFLAGS} -o ${.TARGET} ${.ALLSRC} +mkmagic: apprentice.c funcs.c getline.c magic.c print.c + ${CC} ${CFLAGS} -DCOMPILE_ONLY -DHOSTPROG ${LDFLAGS} \ + -o ${.TARGET} ${.ALLSRC} FILEVER!= awk '$$1 == "\#define" && $$2 == "VERSION" { print $$3; exit }' \ ${.CURDIR}/config.h diff --git a/lib/libmagic/config.h b/lib/libmagic/config.h index c7e38ec761a..c17883f7615 100644 --- a/lib/libmagic/config.h +++ b/lib/libmagic/config.h @@ -39,7 +39,9 @@ #define HAVE_FSEEKO 1 /* Define to 1 if you have the `getline' function. */ +#ifndef HOSTPROG #define HAVE_GETLINE 1 +#endif /* Define to 1 if you have the header file. */ #define HAVE_GETOPT_H 1 diff --git a/lib/libmd/Makefile b/lib/libmd/Makefile index 534e8b3a60b..d0fe7054fa4 100644 --- a/lib/libmd/Makefile +++ b/lib/libmd/Makefile @@ -1,20 +1,18 @@ # $FreeBSD$ LIB= md +SHLIB_MAJOR= 6 SHLIBDIR?= /lib -SRCS= md2c.c md4c.c md5c.c md2hl.c md4hl.c md5hl.c \ +SRCS= md4c.c md5c.c md4hl.c md5hl.c \ rmd160c.c rmd160hl.c \ sha0c.c sha0hl.c sha1c.c sha1hl.c \ sha256c.c sha256hl.c \ sha512c.c sha512hl.c -INCS= md2.h md4.h md5.h ripemd.h sha.h sha256.h sha512.h +INCS= md4.h md5.h ripemd.h sha.h sha256.h sha512.h WARNS?= 0 -MAN+= md2.3 md4.3 md5.3 ripemd.3 sha.3 sha256.3 sha512.3 -MLINKS+=md2.3 MD2Init.3 md2.3 MD2Update.3 md2.3 MD2Final.3 -MLINKS+=md2.3 MD2End.3 md2.3 MD2File.3 md2.3 MD2FileChunk.3 -MLINKS+=md2.3 MD2Data.3 +MAN+= md4.3 md5.3 ripemd.3 sha.3 sha256.3 sha512.3 MLINKS+=md4.3 MD4Init.3 md4.3 MD4Update.3 md4.3 MD4Final.3 MLINKS+=md4.3 MD4End.3 md4.3 MD4File.3 md4.3 MD4FileChunk.3 MLINKS+=md4.3 MD4Data.3 @@ -59,10 +57,6 @@ CFLAGS+= -DRMD160_ASM ACFLAGS+= -DELF -Wa,--noexecstack .endif -md2hl.c: mdXhl.c - (echo '#define LENGTH 16'; \ - sed -e 's/mdX/md2/g' -e 's/MDX/MD2/g' ${.ALLSRC}) > ${.TARGET} - md4hl.c: mdXhl.c (echo '#define LENGTH 16'; \ sed -e 's/mdX/md4/g' -e 's/MDX/MD4/g' ${.ALLSRC}) > ${.TARGET} @@ -105,16 +99,6 @@ md${i}.3: ${.CURDIR}/mdX.3 cat ${.CURDIR}/md${i}.copyright >> ${.TARGET} .endfor -md2.ref: - echo 'MD2 test suite:' > ${.TARGET} - @echo 'MD2 ("") = 8350e5a3e24c153df2275c9f80692773' >> ${.TARGET} - @echo 'MD2 ("a") = 32ec01ec4a6dac72c0ab96fb34c0b5d1' >> ${.TARGET} - @echo 'MD2 ("abc") = da853b0d3f88d99b30283a69e6ded6bb' >> ${.TARGET} - @echo 'MD2 ("message digest") = ab4f496bfb2a530b219ff33031fe06b0' >> ${.TARGET} - @echo 'MD2 ("abcdefghijklmnopqrstuvwxyz") = 4e8ddff3650292ab5a4108c3aa47940b' >> ${.TARGET} - @echo 'MD2 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = da33def2a42df13975352846c30338cd' >> ${.TARGET} - @echo 'MD2 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = d5976f79d83d3a0dc9806c3c66f3efd8' >> ${.TARGET} - md4.ref: echo 'MD4 test suite:' > ${.TARGET} @echo 'MD4 ("") = 31d6cfe0d16ae931b73c59d7e0c089c0' >> ${.TARGET} @@ -205,12 +189,9 @@ rmd160.ref: @echo 'RIPEMD160 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") =' \ '9b752e45573d4b39f4dbd3323cab82bf63326bfb' >> ${.TARGET} -test: md2.ref md4.ref md5.ref sha0.ref rmd160.ref sha1.ref sha256.ref sha512.ref +test: md4.ref md5.ref sha0.ref rmd160.ref sha1.ref sha256.ref sha512.ref @${ECHO} if any of these test fail, the code produces wrong results @${ECHO} and should NOT be used. - ${CC} ${CFLAGS} ${LDFLAGS} -DMD=2 -o mddriver ${.CURDIR}/mddriver.c ./libmd.a - ./mddriver | cmp md2.ref - - @${ECHO} MD2 passed test ${CC} ${CFLAGS} ${LDFLAGS} -DMD=4 -o mddriver ${.CURDIR}/mddriver.c libmd.a ./mddriver | cmp md4.ref - @${ECHO} MD4 passed test diff --git a/lib/libmd/md2.copyright b/lib/libmd/md2.copyright deleted file mode 100644 index acef7bab5be..00000000000 --- a/lib/libmd/md2.copyright +++ /dev/null @@ -1,17 +0,0 @@ -.\" $FreeBSD$ -Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All -rights reserved. -.Pp -License to copy and use this software is granted for -non-commercial Internet Privacy-Enhanced Mail provided that it is -identified as the "RSA Data Security, Inc. MD2 Message Digest -Algorithm" in all material mentioning or referencing this software -or this function. -.Pp -RSA Data Security, Inc. makes no representations concerning either -the merchantability of this software or the suitability of this -software for any particular purpose. It is provided "as is" -without express or implied warranty of any kind. -.Pp -These notices must be retained in any copies of any part of this -documentation and/or software. diff --git a/lib/libmd/md2.h b/lib/libmd/md2.h deleted file mode 100644 index f0229f56c12..00000000000 --- a/lib/libmd/md2.h +++ /dev/null @@ -1,46 +0,0 @@ -/* MD2.H - header file for MD2C.C - * $FreeBSD$ - */ - -/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All - rights reserved. - - License to copy and use this software is granted for - non-commercial Internet Privacy-Enhanced Mail provided that it is - identified as the "RSA Data Security, Inc. MD2 Message Digest - Algorithm" in all material mentioning or referencing this software - or this function. - - RSA Data Security, Inc. makes no representations concerning either - the merchantability of this software or the suitability of this - software for any particular purpose. It is provided "as is" - without express or implied warranty of any kind. - - These notices must be retained in any copies of any part of this - documentation and/or software. - */ - -#ifndef _MD2_H_ -#define _MD2_H_ - -typedef struct MD2Context { - unsigned char state[16]; /* state */ - unsigned char checksum[16]; /* checksum */ - unsigned int count; /* number of bytes, modulo 16 */ - unsigned char buffer[16]; /* input buffer */ -} MD2_CTX; - -#include - -__BEGIN_DECLS -void MD2Init(MD2_CTX *); -void MD2Update(MD2_CTX *, const void *, unsigned int); -void MD2Pad(MD2_CTX *); -void MD2Final(unsigned char [16], MD2_CTX *); -char * MD2End(MD2_CTX *, char *); -char * MD2File(const char *, char *); -char * MD2FileChunk(const char *, char *, off_t, off_t); -char * MD2Data(const void *, unsigned int, char *); -__END_DECLS - -#endif /* _MD2_H_ */ diff --git a/lib/libmd/md2c.c b/lib/libmd/md2c.c deleted file mode 100644 index 47994572831..00000000000 --- a/lib/libmd/md2c.c +++ /dev/null @@ -1,211 +0,0 @@ -/* MD2C.C - RSA Data Security, Inc., MD2 message-digest algorithm - */ - -#include -__FBSDID("$FreeBSD$"); - -/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All - rights reserved. - - License to copy and use this software is granted for - non-commercial Internet Privacy-Enhanced Mail provided that it is - identified as the "RSA Data Security, Inc. MD2 Message Digest - Algorithm" in all material mentioning or referencing this software - or this function. - - RSA Data Security, Inc. makes no representations concerning either - the merchantability of this software or the suitability of this - software for any particular purpose. It is provided "as is" - without express or implied warranty of any kind. - - These notices must be retained in any copies of any part of this - documentation and/or software. - */ - -#include -#include -#include "md2.h" - - -typedef unsigned char *POINTER; -typedef u_int16_t UINT2; -typedef u_int32_t UINT4; - -#define PROTO_LIST(list) list - -static void MD2Transform PROTO_LIST - ((unsigned char [16], unsigned char [16], const unsigned char [16])); - -/* Permutation of 0..255 constructed from the digits of pi. It gives a - "random" nonlinear byte substitution operation. - */ -static unsigned char PI_SUBST[256] = { - 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, - 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, - 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, - 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, - 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, - 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, - 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, - 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, - 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, - 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, - 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, - 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, - 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, - 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, - 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, - 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, - 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, - 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 -}; - -static unsigned char *PADDING[] = { - (unsigned char *)"", - (unsigned char *)"\001", - (unsigned char *)"\002\002", - (unsigned char *)"\003\003\003", - (unsigned char *)"\004\004\004\004", - (unsigned char *)"\005\005\005\005\005", - (unsigned char *)"\006\006\006\006\006\006", - (unsigned char *)"\007\007\007\007\007\007\007", - (unsigned char *)"\010\010\010\010\010\010\010\010", - (unsigned char *)"\011\011\011\011\011\011\011\011\011", - (unsigned char *)"\012\012\012\012\012\012\012\012\012\012", - (unsigned char *)"\013\013\013\013\013\013\013\013\013\013\013", - (unsigned char *)"\014\014\014\014\014\014\014\014\014\014\014\014", - (unsigned char *) - "\015\015\015\015\015\015\015\015\015\015\015\015\015", - (unsigned char *) - "\016\016\016\016\016\016\016\016\016\016\016\016\016\016", - (unsigned char *) - "\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017", - (unsigned char *) - "\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020" -}; - -/* MD2 initialization. Begins an MD2 operation, writing a new context. - */ -void MD2Init (context) -MD2_CTX *context; /* context */ -{ - context->count = 0; - memset ((POINTER)context->state, 0, sizeof (context->state)); - memset - ((POINTER)context->checksum, 0, sizeof (context->checksum)); -} - -/* MD2 block update operation. Continues an MD2 message-digest - operation, processing another message block, and updating the - context. - */ -void MD2Update (context, in, inputLen) -MD2_CTX *context; /* context */ -const void *in; /* input block */ -unsigned int inputLen; /* length of input block */ -{ - unsigned int i, idx, partLen; - const unsigned char *input = in; - - /* Update number of bytes mod 16 */ - idx = context->count; - context->count = (idx + inputLen) & 0xf; - - partLen = 16 - idx; - - /* Transform as many times as possible. - */ - if (inputLen >= partLen) { - memcpy - ((POINTER)&context->buffer[idx], (POINTER)input, partLen); - MD2Transform (context->state, context->checksum, context->buffer); - - for (i = partLen; i + 15 < inputLen; i += 16) - MD2Transform (context->state, context->checksum, &input[i]); - - idx = 0; - } - else - i = 0; - - /* Buffer remaining input */ - memcpy - ((POINTER)&context->buffer[idx], (POINTER)&input[i], - inputLen-i); -} - -/* MD2 padding. - */ -void MD2Pad (context) -MD2_CTX *context; /* context */ -{ - unsigned int idx, padLen; - - /* Pad out to multiple of 16. - */ - idx = context->count; - padLen = 16 - idx; - MD2Update (context, PADDING[padLen], padLen); - - /* Extend with checksum */ - MD2Update (context, context->checksum, 16); -} - -/* MD2 finalization. Ends an MD2 message-digest operation, writing the - message digest and zeroizing the context. - */ -void MD2Final (digest, context) -unsigned char digest[16]; /* message digest */ -MD2_CTX *context; /* context */ -{ - /* Do padding */ - MD2Pad (context); - - /* Store state in digest */ - memcpy ((POINTER)digest, (POINTER)context->state, 16); - - /* Zeroize sensitive information. - */ - memset ((POINTER)context, 0, sizeof (*context)); -} - -/* MD2 basic transformation. Transforms state and updates checksum - based on block. - */ -static void MD2Transform (state, checksum, block) -unsigned char state[16]; -unsigned char checksum[16]; -const unsigned char block[16]; -{ - unsigned int i, j, t; - unsigned char x[48]; - - /* Form encryption block from state, block, state ^ block. - */ - memcpy ((POINTER)x, (POINTER)state, 16); - memcpy ((POINTER)x+16, (POINTER)block, 16); - for (i = 0; i < 16; i++) - x[i+32] = state[i] ^ block[i]; - - /* Encrypt block (18 rounds). - */ - t = 0; - for (i = 0; i < 18; i++) { - for (j = 0; j < 48; j++) - t = x[j] ^= PI_SUBST[t]; - t = (t + i) & 0xff; - } - - /* Save new state */ - memcpy ((POINTER)state, (POINTER)x, 16); - - /* Update checksum. - */ - t = checksum[15]; - for (i = 0; i < 16; i++) - t = checksum[i] ^= PI_SUBST[block[i] ^ t]; - - /* Zeroize sensitive information. - */ - memset ((POINTER)x, 0, sizeof (x)); -} diff --git a/lib/libmd/mdX.3 b/lib/libmd/mdX.3 index 03f50f12a40..223e2efa4b2 100644 --- a/lib/libmd/mdX.3 +++ b/lib/libmd/mdX.3 @@ -52,8 +52,7 @@ This net result is a .Dq fingerprint of the input-data, which does not disclose the actual input. .Pp -MD2 is the slowest, MD4 is the fastest and MD5 is somewhere in the middle. -MD2 can only be used for Privacy-Enhanced Mail. +MD4 is the fastest and MD5 is somewhat slower. MD4 has now been broken; it should only be used where necessary for backward compatibility. MD5 has not yet (1999-02-11) been broken, but sufficient attacks have been @@ -144,16 +143,10 @@ If the .Fa buf argument is non-null it must point to at least 33 characters of buffer space. .Sh SEE ALSO -.Xr md2 3 , .Xr md4 3 , .Xr md5 3 , .Xr sha 3 .Rs -.%A B. Kaliski -.%T The MD2 Message-Digest Algorithm -.%O RFC 1319 -.Re -.Rs .%A R. Rivest .%T The MD4 Message-Digest Algorithm .%O RFC 1186 @@ -192,6 +185,3 @@ Phk ristede runen. No method is known to exist which finds two files having the same hash value, nor to find a file with a specific hash value. There is on the other hand no guarantee that such a method does not exist. -.Pp -MD2 has only been licensed for use in Privacy Enhanced Mail. -Use MD4 or MD5 if that is not what you are doing. diff --git a/lib/libnandfs/Makefile b/lib/libnandfs/Makefile new file mode 100644 index 00000000000..d87573e2f34 --- /dev/null +++ b/lib/libnandfs/Makefile @@ -0,0 +1,9 @@ +# $FreeBSD$ + +LIB= nandfs +SRCS+= nandfs.c +INCS= libnandfs.h + +CFLAGS += -I${.CURDIR} + +.include diff --git a/lib/libnandfs/libnandfs.h b/lib/libnandfs/libnandfs.h new file mode 100644 index 00000000000..8338c63d600 --- /dev/null +++ b/lib/libnandfs/libnandfs.h @@ -0,0 +1,65 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _LIBNANDFS_NANDFS_H +#define _LIBNANDFS_NANDFS_H + +struct nandfs { + struct nandfs_fsdata n_fsdata; + struct nandfs_super_block n_sb; + char n_ioc[MNAMELEN]; + char n_dev[MNAMELEN]; + int n_iocfd; + int n_devfd; + int n_flags; + char n_errmsg[120]; +}; + +int nandfs_iserror(struct nandfs *); +const char *nandfs_errmsg(struct nandfs *); + +void nandfs_init(struct nandfs *, const char *); +void nandfs_destroy(struct nandfs *); + +const char *nandfs_dev(struct nandfs *); + +int nandfs_open(struct nandfs *); +void nandfs_close(struct nandfs *); + +int nandfs_get_cpstat(struct nandfs *, struct nandfs_cpstat *); + +ssize_t nandfs_get_cp(struct nandfs *, uint64_t, + struct nandfs_cpinfo *, size_t); + +ssize_t nandfs_get_snap(struct nandfs *, uint64_t, + struct nandfs_cpinfo *, size_t); + +int nandfs_make_snap(struct nandfs *, uint64_t *); +int nandfs_delete_snap(struct nandfs *, uint64_t); + +#endif /* _LIBNANDFS_NANDFS_H */ diff --git a/lib/libnandfs/nandfs.c b/lib/libnandfs/nandfs.c new file mode 100644 index 00000000000..fd59a921133 --- /dev/null +++ b/lib/libnandfs/nandfs.c @@ -0,0 +1,247 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define NANDFS_IS_VALID 0x1 +#define NANDFS_IS_OPENED 0x2 +#define NANDFS_IS_OPENED_DEV 0x4 +#define NANDFS_IS_ERROR 0x8 + +#define DEBUG +#undef DEBUG +#ifdef DEBUG +#define NANDFS_DEBUG(fmt, args...) do { \ + printf("libnandfs:" fmt "\n", ##args); } while (0) +#else +#define NANDFS_DEBUG(fmt, args...) +#endif + +#define NANDFS_ASSERT_VALID(fs) assert((fs)->n_flags & NANDFS_IS_VALID) +#define NANDFS_ASSERT_VALID_DEV(fs) \ + assert(((fs)->n_flags & (NANDFS_IS_VALID | NANDFS_IS_OPENED_DEV)) == \ + (NANDFS_IS_VALID | NANDFS_IS_OPENED_DEV)) + +int +nandfs_iserror(struct nandfs *fs) +{ + + NANDFS_ASSERT_VALID(fs); + + return (fs->n_flags & NANDFS_IS_ERROR); +} + +const char * +nandfs_errmsg(struct nandfs *fs) +{ + + NANDFS_ASSERT_VALID(fs); + + assert(nandfs_iserror(fs)); + assert(fs->n_errmsg); + return (fs->n_errmsg); +} + +static void +nandfs_seterr(struct nandfs *fs, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vsnprintf(fs->n_errmsg, sizeof(fs->n_errmsg), fmt, ap); + va_end(ap); + fs->n_flags |= NANDFS_IS_ERROR; +} + +const char * +nandfs_dev(struct nandfs *fs) +{ + + NANDFS_ASSERT_VALID(fs); + return (fs->n_dev); +} + +void +nandfs_init(struct nandfs *fs, const char *dir) +{ + + snprintf(fs->n_ioc, sizeof(fs->n_ioc), "%s/%s", dir, "."); + fs->n_iocfd = -1; + fs->n_flags = NANDFS_IS_VALID; +} + +void +nandfs_destroy(struct nandfs *fs) +{ + + assert(fs->n_iocfd == -1); + fs->n_flags &= + ~(NANDFS_IS_ERROR | NANDFS_IS_VALID); + assert(fs->n_flags == 0); +} + +int +nandfs_open(struct nandfs *fs) +{ + struct nandfs_fsinfo fsinfo; + + fs->n_flags |= NANDFS_IS_OPENED; + + fs->n_iocfd = open(fs->n_ioc, O_RDONLY, S_IRUSR | S_IWUSR | S_IRGRP | + S_IWGRP | S_IROTH | S_IWOTH); + if (fs->n_iocfd == -1) { + nandfs_seterr(fs, "couldn't open %s: %s", fs->n_ioc, + strerror(errno)); + return (-1); + } + + if (ioctl(fs->n_iocfd, NANDFS_IOCTL_GET_FSINFO, &fsinfo) == -1) { + nandfs_seterr(fs, "couldn't fetch fsinfo: %s", + strerror(errno)); + return (-1); + } + + memcpy(&fs->n_fsdata, &fsinfo.fs_fsdata, sizeof(fs->n_fsdata)); + memcpy(&fs->n_sb, &fsinfo.fs_super, sizeof(fs->n_sb)); + snprintf(fs->n_dev, sizeof(fs->n_dev), "%s", fsinfo.fs_dev); + + return (0); +} + +void +nandfs_close(struct nandfs *fs) +{ + + NANDFS_ASSERT_VALID(fs); + assert(fs->n_flags & NANDFS_IS_OPENED); + + close(fs->n_iocfd); + fs->n_iocfd = -1; + fs->n_flags &= ~NANDFS_IS_OPENED; +} + +int +nandfs_get_cpstat(struct nandfs *fs, struct nandfs_cpstat *cpstat) +{ + + NANDFS_ASSERT_VALID(fs); + + if (ioctl(fs->n_iocfd, NANDFS_IOCTL_GET_CPSTAT, cpstat) == -1) { + nandfs_seterr(fs, "ioctl NANDFS_IOCTL_GET_CPSTAT: %s", + strerror(errno)); + return (-1); + } + + return (0); +} + +static ssize_t +nandfs_get_cpinfo(struct nandfs *fs, uint64_t cno, int mode, + struct nandfs_cpinfo *cpinfo, size_t nci) +{ + struct nandfs_argv args; + + NANDFS_ASSERT_VALID(fs); + + args.nv_base = (u_long)cpinfo; + args.nv_nmembs = nci; + args.nv_index = cno; + args.nv_flags = mode; + + if (ioctl(fs->n_iocfd, NANDFS_IOCTL_GET_CPINFO, &args) == -1) { + nandfs_seterr(fs, "ioctl NANDFS_IOCTL_GET_CPINFO: %s", + strerror(errno)); + return (-1); + } + + return (args.nv_nmembs); +} + +ssize_t +nandfs_get_cp(struct nandfs *fs, uint64_t cno, struct nandfs_cpinfo *cpinfo, + size_t nci) +{ + + return (nandfs_get_cpinfo(fs, cno, NANDFS_CHECKPOINT, cpinfo, nci)); +} + +ssize_t +nandfs_get_snap(struct nandfs *fs, uint64_t cno, struct nandfs_cpinfo *cpinfo, + size_t nci) +{ + + return (nandfs_get_cpinfo(fs, cno, NANDFS_SNAPSHOT, cpinfo, nci)); +} + +int +nandfs_make_snap(struct nandfs *fs, uint64_t *cno) +{ + + NANDFS_ASSERT_VALID(fs); + + if (ioctl(fs->n_iocfd, NANDFS_IOCTL_MAKE_SNAP, cno) == -1) { + nandfs_seterr(fs, "ioctl NANDFS_IOCTL_MAKE_SNAP: %s", + strerror(errno)); + return (-1); + } + + return (0); +} + +int +nandfs_delete_snap(struct nandfs *fs, uint64_t cno) +{ + + NANDFS_ASSERT_VALID(fs); + + if (ioctl(fs->n_iocfd, NANDFS_IOCTL_DELETE_SNAP, &cno) == -1) { + nandfs_seterr(fs, "ioctl NANDFS_IOCTL_DELETE_SNAP: %s", + strerror(errno)); + return (-1); + } + + return (0); +} diff --git a/lib/libncp/ncpl_nls.c b/lib/libncp/ncpl_nls.c index 3ca83d67e1f..14a26e50710 100644 --- a/lib/libncp/ncpl_nls.c +++ b/lib/libncp/ncpl_nls.c @@ -200,6 +200,79 @@ static u_int8_t se_unix2nw[] = { 0x9c, 0x9b, 0x87, 0x98, 0x9d, 0x99, 0x97, 0x9a }; +/* + * Characters mapping for codepages used in Germany. + */ +static u_int8_t de_nw2unix[] = { + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, /* 0x00 */ + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0xb6, 0xa7, 0x5f, 0x5f, /* 0x10 */ + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20 */ + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30 */ + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40 */ + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50 */ + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60 */ + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70 */ + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0xc7, 0xfc, 0xe9, 0xe2, 0xe4, 0xe0, 0xe5, 0xe7, /* 0x80 */ + 0xea, 0xeb, 0xe8, 0xef, 0xee, 0xec, 0xc4, 0xc5, + 0xc9, 0xe6, 0xc6, 0xf4, 0xf6, 0xf2, 0xfb, 0xf9, /* 0x90 */ + 0xff, 0xd6, 0xdc, 0xa2, 0xa3, 0xa5, 0x5f, 0x5f, + 0xe1, 0xed, 0xf3, 0xfa, 0xf1, 0xd1, 0xaa, 0xba, /* 0xA0 */ + 0xbf, 0x5f, 0xac, 0xbd, 0xbc, 0xa1, 0xab, 0xbb, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, /* 0xB0 */ + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, /* 0xC0 */ + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, /* 0xD0 */ + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0xdf, 0x5f, 0x5f, 0x5f, 0x5f, 0xb5, 0x5f, /* 0xE0 */ + 0x5f, 0x5f, 0x5f, 0xf0, 0x5f, 0xf8, 0x5f, 0x5f, + 0x5f, 0xb1, 0x5f, 0x5f, 0x5f, 0x5f, 0xf7, 0x5f, /* 0xF0 */ + 0xb0, 0x5f, 0xb7, 0x5f, 0x5f, 0xb2, 0x5f, 0xa0 +}; + +static u_int8_t de_unix2nw[] = { + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, /* 0x00 */ + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, /* 0x10 */ + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20 */ + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30 */ + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40 */ + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50 */ + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60 */ + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70 */ + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, /* 0x80 */ + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, /* 0x90 */ + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0xff, 0xad, 0x9b, 0x9c, 0x5f, 0x9d, 0x5f, 0x15, /* 0xA0 */ + 0x5f, 0x5f, 0xa6, 0xae, 0xaa, 0x5f, 0x5f, 0x5f, + 0xf8, 0xf1, 0xfd, 0x5f, 0x5f, 0xe6, 0x14, 0xfa, /* 0xB0 */ + 0x5f, 0x5f, 0xa7, 0xaf, 0xac, 0xab, 0x5f, 0xa8, + 0x5f, 0x5f, 0x5f, 0x5f, 0x8e, 0x8f, 0x92, 0x80, /* 0xC0 */ + 0x5f, 0x90, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0xa5, 0x5f, 0x5f, 0x5f, 0x5f, 0x99, 0x5f, /* 0xD0 */ + 0x5f, 0x5f, 0x5f, 0x5f, 0x9a, 0x5f, 0x5f, 0xe1, + 0x85, 0xa0, 0x83, 0x5f, 0x84, 0x86, 0x91, 0x87, /* 0xE0 */ + 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, + 0xeb, 0xa4, 0x95, 0xa2, 0x93, 0x5f, 0x94, 0xf6, /* 0xF0 */ + 0xed, 0x97, 0xa3, 0x96, 0x81, 0x5f, 0x5f, 0x98 +}; + static u_int8_t def2lower[256]; static u_int8_t def2upper[256]; @@ -225,6 +298,9 @@ static struct ncp_nlsdesc ncp_nlslist[] = { {NCP_NLS_SE, NCP_NLS_SE_NAME, {def2lower, def2upper, se_nw2unix, se_unix2nw, 0} }, + {NCP_NLS_DE, NCP_NLS_DE_NAME, + {def2lower, def2upper, de_nw2unix, de_unix2nw, 0} + }, {0} }; diff --git a/lib/libpam/libpam/Makefile b/lib/libpam/libpam/Makefile index 1071e05d4d1..b57a38e7b54 100644 --- a/lib/libpam/libpam/Makefile +++ b/lib/libpam/libpam/Makefile @@ -47,16 +47,22 @@ SRCS= openpam_borrow_cred.c \ openpam_constants.c \ openpam_dispatch.c \ openpam_dynamic.c \ + openpam_features.c \ openpam_findenv.c \ openpam_free_data.c \ openpam_free_envlist.c \ + openpam_get_feature.c \ openpam_get_option.c \ openpam_load.c \ openpam_log.c \ openpam_nullconv.c \ openpam_readline.c \ + openpam_readlinev.c \ + openpam_readword.c \ openpam_restore_cred.c \ + openpam_set_feature.c \ openpam_set_option.c \ + openpam_straddch.c \ openpam_subst.c \ openpam_ttyconv.c \ pam_acct_mgmt.c \ @@ -91,12 +97,17 @@ MAN= openpam.3 \ openpam_borrow_cred.3 \ openpam_free_data.3 \ openpam_free_envlist.3 \ + openpam_get_feature.3 \ openpam_get_option.3 \ openpam_log.3 \ openpam_nullconv.3 \ openpam_readline.3 \ + openpam_readlinev.3 \ + openpam_readword.3 \ openpam_restore_cred.3 \ + openpam_set_feature.3 \ openpam_set_option.3 \ + openpam_straddch.3 \ openpam_subst.3 \ openpam_ttyconv.3 \ pam.3 \ @@ -137,11 +148,13 @@ MAN= openpam.3 \ MLINKS= pam.conf.5 pam.d.5 CSTD?= c99 -WARNS?= 3 CFLAGS+= -I${.CURDIR} -I${OPENPAM}/include CFLAGS+= -DLIB_MAJ=${SHLIB_MAJOR} CFLAGS+= -DOPENPAM_MODULES_DIR='"${PAM_MOD_DIR:C/\/*$//}/"' -CFLAGS+= -DHAVE_FPURGE=1 -DHAVE_STRLCPY=1 +CFLAGS+= -DHAVE_FDLOPEN=1 +CFLAGS+= -DHAVE_FPURGE=1 +CFLAGS+= -DHAVE_STRLCAT=1 +CFLAGS+= -DHAVE_STRLCPY=1 HEADERS= security/openpam.h \ security/openpam_attr.h \ diff --git a/lib/libpam/modules/pam_exec/pam_exec.8 b/lib/libpam/modules/pam_exec/pam_exec.8 index 3231228927e..e2be511b0ce 100644 --- a/lib/libpam/modules/pam_exec/pam_exec.8 +++ b/lib/libpam/modules/pam_exec/pam_exec.8 @@ -131,10 +131,10 @@ This is useful in shell scripts for instance. .Xr pam 8 , .Xr pam_sm_acct_mgmt 8 , .Xr pam_sm_authenticate 8 , -.Xr pam_sm_chauthtok 8, +.Xr pam_sm_chauthtok 8 , .Xr pam_sm_close_session 8 , .Xr pam_sm_open_session 8 , -.Xr pam_sm_setcred 8 . +.Xr pam_sm_setcred 8 .Sh AUTHORS The .Nm diff --git a/lib/libpam/modules/pam_ssh/pam_ssh.c b/lib/libpam/modules/pam_ssh/pam_ssh.c index ab4990bcbb1..405dd6bbf41 100644 --- a/lib/libpam/modules/pam_ssh/pam_ssh.c +++ b/lib/libpam/modules/pam_ssh/pam_ssh.c @@ -112,7 +112,7 @@ pam_ssh_load_key(const char *dir, const char *kfn, const char *passphrase, * with an empty passphrase, and if the key is not encrypted, * accept only an empty passphrase. */ - key = key_load_private(fn, NULL, &comment); + key = key_load_private(fn, "", &comment); if (key != NULL && !(*passphrase == '\0' && nullok)) { key_free(key); return (NULL); diff --git a/lib/libpcap/Makefile b/lib/libpcap/Makefile index 5b613e7f08a..1a3e63409bb 100644 --- a/lib/libpcap/Makefile +++ b/lib/libpcap/Makefile @@ -37,8 +37,6 @@ MAN= pcap.3 \ pcap_file.3 \ pcap_fileno.3 \ pcap_findalldevs.3 \ - pcap_free_datalinks.3 \ - pcap_freealldevs.3 \ pcap_freecode.3 \ pcap_get_selectable_fd.3 \ pcap_geterr.3 \ @@ -46,6 +44,7 @@ MAN= pcap.3 \ pcap_is_swapped.3 \ pcap_lib_version.3 \ pcap_list_datalinks.3 \ + pcap_list_tstamp_types.3 \ pcap_lookupdev.3 \ pcap_lookupnet.3 \ pcap_loop.3 \ @@ -61,6 +60,7 @@ MAN= pcap.3 \ pcap_set_rfmon.3 \ pcap_set_snaplen.3 \ pcap_set_timeout.3 \ + pcap_set_tstamp_type.3 \ pcap_setdirection.3 \ pcap_setfilter.3 \ pcap_setnonblock.3 \ @@ -69,12 +69,17 @@ MAN= pcap.3 \ pcap_statustostr.3 \ pcap_strerror.3 \ pcap-savefile.5 \ + pcap_tstamp_type_name_to_val.3 \ + pcap_tstamp_type_val_to_name.3 \ pcap-filter.7 \ pcap-linktype.7 MLINKS= pcap_datalink_val_to_name.3 pcap_datalink_val_to_description.3 \ pcap_dump_open.3 pcap_dump_fopen.3 \ + pcap_findalldevs.3 pcap_freealldevs.3 \ pcap_geterr.3 pcap_perror.3 \ pcap_inject.3 pcap_sendpacket.3 \ + pcap_list_datalinks.3 pcap_free_datalinks.3 \ + pcap_list_tstamp_types.3 pcap_free_tstamp_types.3 \ pcap_loop.3 pcap_dispatch.3 \ pcap_major_version.3 pcap_minor_version.3 \ pcap_next_ex.3 pcap_next.3 \ diff --git a/lib/libpcap/config.h b/lib/libpcap/config.h index d3d4a9ab081..b364c13c365 100644 --- a/lib/libpcap/config.h +++ b/lib/libpcap/config.h @@ -22,6 +22,9 @@ /* define if you have streams capable DAG API */ /* #undef HAVE_DAG_STREAMS_API */ +/* define if you have vdag_set_device_info() */ +/* #undef HAVE_DAG_VDAG */ + /* Define to 1 if you have the declaration of `ether_hostton', and to 0 if you don't. */ #define HAVE_DECL_ETHER_HOSTTON 1 @@ -56,12 +59,30 @@ /* if libnl exists */ /* #undef HAVE_LIBNL */ +/* if libnl exists and is version 2.x */ +/* #undef HAVE_LIBNL_2_x */ + /* Define to 1 if you have the header file. */ #define HAVE_LIMITS_H 1 +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LINUX_COMPILER_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LINUX_ETHTOOL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LINUX_IF_PACKET_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LINUX_NET_TSTAMP_H */ + /* if tp_vlan_tci exists */ /* #undef HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI */ +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LINUX_TYPES_H */ + /* Define to 1 if you have the header file. */ /* #undef HAVE_LINUX_USBDEVICE_FS_H */ @@ -77,6 +98,12 @@ /* Define to 1 if you have the header file. */ #define HAVE_NETINET_IF_ETHER_H 1 +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETPACKET_IF_PACKET_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETPACKET_PACKET_H */ + /* Define to 1 if you have the header file. */ #define HAVE_NET_IF_MEDIA_H 1 @@ -175,7 +202,7 @@ #define HAVE_VSNPRINTF 1 /* define if the system supports zerocopy BPF */ -#define HAVE_ZEROCOPY_BPF 1 +#define HAVE_ZEROCOPY_BPF 1 /* define if your compiler has __attribute__ */ #define HAVE___ATTRIBUTE__ 1 @@ -223,6 +250,9 @@ /* target host supports CAN sniffing */ /* #undef PCAP_SUPPORT_CAN */ +/* target host supports netfilter sniffing */ +/* #undef PCAP_SUPPORT_NETFILTER */ + /* target host supports USB sniffing */ /* #undef PCAP_SUPPORT_USB */ @@ -241,7 +271,7 @@ /* needed on HP-UX */ /* #undef _HPUX_SOURCE */ -/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ /* #undef _LARGEFILE_SOURCE */ /* Define for large files, on AIX-style hosts. */ diff --git a/lib/libpmc/pmc.3 b/lib/libpmc/pmc.3 index cf74f321076..c970da84605 100644 --- a/lib/libpmc/pmc.3 +++ b/lib/libpmc/pmc.3 @@ -111,7 +111,7 @@ processor. Certain kinds of PMCs require that a log file be configured before they may be started. These include: -.Bl -bullet -compact +.Bl -bullet .It System scope sampling PMCs. .It @@ -120,6 +120,7 @@ Process scope sampling PMCs. Process scope counting PMCs that have been configured to report PMC readings on process context switches or process exits. .El +.Pp Up to one log file may be configured per owner process. Events logged to a log file may be subsequently analyzed using the .Xr pmclog 3 @@ -129,6 +130,7 @@ The CPUs known to the PMC library are named by the .Vt "enum pmc_cputype" enumeration. Supported CPUs include: +.Pp .Bl -tag -width "Li PMC_CPU_INTEL_CORE2" -compact .It Li PMC_CPU_AMD_K7 .Tn "AMD Athlon" @@ -185,6 +187,7 @@ PMC supported by this library are named by the .Vt enum pmc_class enumeration. Supported PMC kinds include: +.Pp .Bl -tag -width "Li PMC_CLASS_IAF" -compact .It Li PMC_CLASS_IAF Fixed function hardware counters presents in CPUs conforming to the @@ -232,6 +235,7 @@ the .Vt "enum pmc_caps" enumeration. Supported capabilities include: +.Pp .Bl -tag -width "Li PMC_CAP_INTERRUPT" -compact .It Li PMC_CAP_CASCADE The ability to cascade counters. @@ -273,9 +277,9 @@ Operations on non-existent CPUs will return an error. This section contains a brief overview of the available functionality in the PMC library. Each function listed here is described further in its own manual page. -.Bl -tag -width indent +.Bl -tag -width 2n .It Administration -.Bl -tag -compact +.Bl -tag -width 6n -compact .It Fn pmc_disable , Fn pmc_enable Administratively disable (enable) specific performance monitoring counter hardware. @@ -283,7 +287,7 @@ Counters that are disabled will not be available to applications to use. .El .It "Convenience Functions" -.Bl -tag -compact +.Bl -tag -width 6n -compact .It Fn pmc_event_names_of_class Returns a list of event names supported by a given PMC type. .It Fn pmc_name_of_capability @@ -308,13 +312,13 @@ constant to a human-readable name. Return a human-readable string describing a PMC's current state. .El .It "Library Initialization" -.Bl -tag -compact +.Bl -tag -width 6n -compact .It Fn pmc_init Initialize the library. This function must be called before any other library function. .El .It "Log File Handling" -.Bl -tag -compact +.Bl -tag -width 6n -compact .It Fn pmc_configure_logfile Configure a log file for .Xr hwpmc 4 @@ -331,7 +335,7 @@ side of the stream. Append arbitrary user data to the current log file. .El .It "PMC Management" -.Bl -tag -compact +.Bl -tag -width 6n -compact .It Fn pmc_allocate , Fn pmc_release Allocate (free) a PMC. .It Fn pmc_attach , Fn pmc_detach @@ -344,7 +348,7 @@ Start (stop) a software PMC. Set the reload value for a sampling PMC. .El .It "Queries" -.Bl -tag -compact +.Bl -tag -width 6n -compact .It Fn pmc_capabilities Retrieve the capabilities for a given PMC. .It Fn pmc_cpuinfo @@ -363,7 +367,7 @@ Return information about the state of a given CPU's PMCs. Determine the width of a hardware counter in bits. .El .It "x86 Architecture Specific API" -.Bl -tag -compact +.Bl -tag -width 6n -compact .It Fn pmc_get_msr Returns the processor model specific register number associated with diff --git a/lib/libprocstat/cd9660.c b/lib/libprocstat/cd9660.c index 95882be5d9e..ab95e2a04c3 100644 --- a/lib/libprocstat/cd9660.c +++ b/lib/libprocstat/cd9660.c @@ -84,7 +84,7 @@ isofs_filestat(kvm_t *kd, struct vnode *vp, struct vnstat *vn) } vn->vn_fsid = dev2udev(kd, mnt.im_dev); vn->vn_mode = (mode_t)isonode.inode.iso_mode; - vn->vn_fileid = (long)isonode.i_number; - vn->vn_size = (u_long)isonode.i_size; + vn->vn_fileid = isonode.i_number; + vn->vn_size = isonode.i_size; return (0); } diff --git a/lib/libprocstat/common_kvm.c b/lib/libprocstat/common_kvm.c index 63302bc4f6e..be05980f183 100644 --- a/lib/libprocstat/common_kvm.c +++ b/lib/libprocstat/common_kvm.c @@ -99,9 +99,9 @@ ufs_filestat(kvm_t *kd, struct vnode *vp, struct vnstat *vn) * comparisons */ vn->vn_fsid = dev2udev(kd, inode.i_dev); - vn->vn_fileid = (long)inode.i_number; + vn->vn_fileid = inode.i_number; vn->vn_mode = (mode_t)inode.i_mode; - vn->vn_size = (u_long)inode.i_size; + vn->vn_size = inode.i_size; return (0); } diff --git a/lib/libprocstat/libprocstat.3 b/lib/libprocstat/libprocstat.3 index 07fffb24001..dd163c214cd 100644 --- a/lib/libprocstat/libprocstat.3 +++ b/lib/libprocstat/libprocstat.3 @@ -203,7 +203,7 @@ The .Fn procstat_get_socket_info and .Fn procstat_get_vnode_info -functions are used to retrive information about pipes, pseudo-terminals, +functions are used to retrieve information about pipes, pseudo-terminals, shared memory objects, sockets, and vnodes, respectively. Each of them have a similar interface API. diff --git a/lib/libprocstat/libprocstat.c b/lib/libprocstat/libprocstat.c index 167d91aba93..56562e129b1 100644 --- a/lib/libprocstat/libprocstat.c +++ b/lib/libprocstat/libprocstat.c @@ -881,6 +881,8 @@ procstat_get_shm_info_kvm(kvm_t *kd, struct filestat *fst, { struct shmfd shmfd; void *shmfdp; + char *path; + int i; assert(kd); assert(shm); @@ -896,6 +898,21 @@ procstat_get_shm_info_kvm(kvm_t *kd, struct filestat *fst, } shm->mode = S_IFREG | shmfd.shm_mode; shm->size = shmfd.shm_size; + if (fst->fs_path == NULL && shmfd.shm_path != NULL) { + path = malloc(MAXPATHLEN); + for (i = 0; i < MAXPATHLEN - 1; i++) { + if (!kvm_read_all(kd, (unsigned long)shmfd.shm_path + i, + path + i, 1)) + break; + if (path[i] == '\0') + break; + } + path[i] = '\0'; + if (i == 0) + free(path); + else + fst->fs_path = path; + } return (0); fail: diff --git a/lib/libradius/libradius.3 b/lib/libradius/libradius.3 index da60d52474b..ae0ee240603 100644 --- a/lib/libradius/libradius.3 +++ b/lib/libradius/libradius.3 @@ -108,8 +108,7 @@ allows clients to perform authentication and accounting by means of network requests to remote servers. .Ss Initialization To use the library, an application must first call -.Fn rad_auth_open -, +.Fn rad_auth_open , .Fn rad_acct_open or .Fn rad_server_open @@ -119,8 +118,7 @@ which provides the context for subsequent operations. The former function is used for RADIUS authentication and the latter is used for RADIUS accounting. Calls to -.Fn rad_auth_open -, +.Fn rad_auth_open , .Fn rad_acct_open and .Fn rad_server_open @@ -487,7 +485,7 @@ To respond to the request you should call .Fn rad_create_response and fill response content with same packet writing functions as for client. When packet is ready, it should be sent with -.Fn rad_send_response +.Fn rad_send_response . .Sh RETURN VALUES The following functions return a non-negative value on success. If diff --git a/lib/librpcsec_gss/rpc_gss_get_error.3 b/lib/librpcsec_gss/rpc_gss_get_error.3 index 3b025d7f37c..f1d8fc74b4a 100644 --- a/lib/librpcsec_gss/rpc_gss_get_error.3 +++ b/lib/librpcsec_gss/rpc_gss_get_error.3 @@ -39,7 +39,7 @@ .Sh DESCRIPTION Get details of the last RPCSEC_GSS error. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It error" .It error A pointer to a structure where the error details will be returned .El diff --git a/lib/librpcsec_gss/rpc_gss_get_mech_info.3 b/lib/librpcsec_gss/rpc_gss_get_mech_info.3 index d6abf4dc708..9a26dc107d4 100644 --- a/lib/librpcsec_gss/rpc_gss_get_mech_info.3 +++ b/lib/librpcsec_gss/rpc_gss_get_mech_info.3 @@ -40,7 +40,7 @@ This function looks up a mechanism by name by reading the file /etc/gss/mech and queries it for its capabilities. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It service" .It mech The mechanism to search for .It service diff --git a/lib/librpcsec_gss/rpc_gss_get_principal_name.3 b/lib/librpcsec_gss/rpc_gss_get_principal_name.3 index 2eba5a98c25..50fc65b0fb2 100644 --- a/lib/librpcsec_gss/rpc_gss_get_principal_name.3 +++ b/lib/librpcsec_gss/rpc_gss_get_principal_name.3 @@ -46,7 +46,7 @@ This function can be used to generate a client principal name from various strings. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It principal" .It principal If the principal is created successfully, .Fa *principal diff --git a/lib/librpcsec_gss/rpc_gss_get_versions.3 b/lib/librpcsec_gss/rpc_gss_get_versions.3 index 91920545703..d624f85e1bb 100644 --- a/lib/librpcsec_gss/rpc_gss_get_versions.3 +++ b/lib/librpcsec_gss/rpc_gss_get_versions.3 @@ -39,7 +39,7 @@ .Sh DESCRIPTION Return the highest and lowest supported versions of the RPCSEC_GSS protocol. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It vers_lo" .It vers_hi The value of .Fa *vers_hi diff --git a/lib/librpcsec_gss/rpc_gss_getcred.3 b/lib/librpcsec_gss/rpc_gss_getcred.3 index 72a638452d8..4ebd275728a 100644 --- a/lib/librpcsec_gss/rpc_gss_getcred.3 +++ b/lib/librpcsec_gss/rpc_gss_getcred.3 @@ -45,7 +45,7 @@ This function returns the RPCSEC_GSS authenticated credentials associated with an RPC request. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It cookie" .It req The RPC request to query .It rcred diff --git a/lib/librpcsec_gss/rpc_gss_is_installed.3 b/lib/librpcsec_gss/rpc_gss_is_installed.3 index f0e03d815c0..d427e87effa 100644 --- a/lib/librpcsec_gss/rpc_gss_is_installed.3 +++ b/lib/librpcsec_gss/rpc_gss_is_installed.3 @@ -40,7 +40,7 @@ This function looks up a mechanism by name by reading the file /etc/gss/mech. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It mech" .It mech The mechanism to search for .El diff --git a/lib/librpcsec_gss/rpc_gss_max_data_length.3 b/lib/librpcsec_gss/rpc_gss_max_data_length.3 index 67029a0e851..1d3a9224f03 100644 --- a/lib/librpcsec_gss/rpc_gss_max_data_length.3 +++ b/lib/librpcsec_gss/rpc_gss_max_data_length.3 @@ -41,7 +41,7 @@ Calculate the maximum message size that will fit into a packet of size .Fa max_tp_unit_len , given the current service and QoP setting. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It max_tp_unit_len" .It auth A handle to a RPCSEC_GSS security context .It max_tp_unit_len diff --git a/lib/librpcsec_gss/rpc_gss_mech_to_oid.3 b/lib/librpcsec_gss/rpc_gss_mech_to_oid.3 index 3449d0eb899..14bd5ee8e76 100644 --- a/lib/librpcsec_gss/rpc_gss_mech_to_oid.3 +++ b/lib/librpcsec_gss/rpc_gss_mech_to_oid.3 @@ -40,7 +40,7 @@ This function looks up a mechanism by name by reading the file /etc/gss/mech. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It oid_ret" .It mech The mechanism name to search for .It oid_ret diff --git a/lib/librpcsec_gss/rpc_gss_oid_to_mech.3 b/lib/librpcsec_gss/rpc_gss_oid_to_mech.3 index af2e7d026eb..661bdff851f 100644 --- a/lib/librpcsec_gss/rpc_gss_oid_to_mech.3 +++ b/lib/librpcsec_gss/rpc_gss_oid_to_mech.3 @@ -40,7 +40,7 @@ This function looks up a mechanism by oid by reading the file /etc/gss/mech. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It mech_ret" .It oid The mechanism oid to search for .It mech_ret diff --git a/lib/librpcsec_gss/rpc_gss_qop_to_num.3 b/lib/librpcsec_gss/rpc_gss_qop_to_num.3 index 6f52b7bcfc0..0f95d278bf3 100644 --- a/lib/librpcsec_gss/rpc_gss_qop_to_num.3 +++ b/lib/librpcsec_gss/rpc_gss_qop_to_num.3 @@ -40,7 +40,7 @@ This function looks up a quality of protection by name by reading the file /etc/gss/qop. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It number_ret" .It qop The quality of protection to search for .It mech diff --git a/lib/librpcsec_gss/rpc_gss_seccreate.3 b/lib/librpcsec_gss/rpc_gss_seccreate.3 index 63978a5801a..836df2378fe 100644 --- a/lib/librpcsec_gss/rpc_gss_seccreate.3 +++ b/lib/librpcsec_gss/rpc_gss_seccreate.3 @@ -48,7 +48,7 @@ This function is used to establish a security context between an application and a remote peer using the RPSEC_GSS protocol. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width "options_req" .It clnt An RPC handle which is connected to the remote peer .It principal @@ -62,7 +62,7 @@ The value of mechanism should be the name of one of the security mechanisms listed in /etc/gss/mech. .It service Type of service requested. -.Bl -tag +.Bl -tag -width "rpc_gss_svc_integrity" .It rpc_gss_svc_default The default - typically the same as .Dv rpc_gss_svc_none . diff --git a/lib/librpcsec_gss/rpc_gss_set_callback.3 b/lib/librpcsec_gss/rpc_gss_set_callback.3 index eb902271492..4226285288a 100644 --- a/lib/librpcsec_gss/rpc_gss_set_callback.3 +++ b/lib/librpcsec_gss/rpc_gss_set_callback.3 @@ -62,7 +62,7 @@ protection used by the context. If a context is locked, any subsequent requests which use different values for service and quality of protection will be rejected. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It gss_context" .It cb A structure containing the RPC program and version for this callback and a function which will be called when new contexts are created for diff --git a/lib/librpcsec_gss/rpc_gss_set_defaults.3 b/lib/librpcsec_gss/rpc_gss_set_defaults.3 index e9b062d0f7a..72f22147682 100644 --- a/lib/librpcsec_gss/rpc_gss_set_defaults.3 +++ b/lib/librpcsec_gss/rpc_gss_set_defaults.3 @@ -45,7 +45,7 @@ Set the service and quality of protection to be used for RPC requests. The new values apply for the rest of the lifetime of the context (unless changed again with this function). .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It service" .It service The service type to use for subsequent RPC requests .It qop diff --git a/lib/librpcsec_gss/rpc_gss_set_svc_name.3 b/lib/librpcsec_gss/rpc_gss_set_svc_name.3 index b63d38bd9e5..a06d7d39aef 100644 --- a/lib/librpcsec_gss/rpc_gss_set_svc_name.3 +++ b/lib/librpcsec_gss/rpc_gss_set_svc_name.3 @@ -47,7 +47,7 @@ This function registers a service principal which will be used to authenticate RPCSEC_GSS security contexts for a given RPC program and version. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It mechanism" .It principal A string representing the service principal in the form .Qq service@hostname diff --git a/lib/librpcsec_gss/rpc_gss_svc_max_data_length.3 b/lib/librpcsec_gss/rpc_gss_svc_max_data_length.3 index fdf24a6767b..f466e107434 100644 --- a/lib/librpcsec_gss/rpc_gss_svc_max_data_length.3 +++ b/lib/librpcsec_gss/rpc_gss_svc_max_data_length.3 @@ -41,7 +41,7 @@ Calculate the maximum message size that will fit into a packet of size .Fa max_tp_unit_len , given the current service and QoP setting. .Sh PARAMETERS -.Bl -tag +.Bl -tag -width ".It max_tp_unit_len" .It req An RPC request .It max_tp_unit_len diff --git a/lib/libstand/Makefile b/lib/libstand/Makefile index 567c88680ca..fd720a9e4a8 100644 --- a/lib/libstand/Makefile +++ b/lib/libstand/Makefile @@ -38,7 +38,7 @@ CFLAGS+= -msoft-float -D_STANDALONE .endif # standalone components and stuff we have modified locally -SRCS+= zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c gets.c \ +SRCS+= gzguts.h zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c gets.c \ globals.c pager.c printf.c strdup.c strerror.c strtol.c random.c \ sbrk.c twiddle.c zalloc.c zalloc_malloc.c @@ -118,23 +118,29 @@ libstand_bzlib_private.h: bzlib_private.h # decompression functionality from libz .PATH: ${.CURDIR}/../libz CFLAGS+=-DHAVE_MEMCPY -I${.CURDIR}/../libz -SRCS+= adler32.c crc32.c libstand_zutil.h +SRCS+= adler32.c crc32.c libstand_zutil.h libstand_gzguts.h .for file in infback.c inffast.c inflate.c inftrees.c zutil.c SRCS+= _${file} CLEANFILES+= _${file} _${file}: ${file} - sed "s|zutil\.h|libstand_zutil.h|" ${.ALLSRC} > ${.TARGET} + sed -e "s|zutil\.h|libstand_zutil.h|" \ + -e "s|gzguts\.h|libstand_gzguts.h|" \ + ${.ALLSRC} > ${.TARGET} .endfor # depend on stand.h being able to be included multiple times -CLEANFILES+= libstand_zutil.h -libstand_zutil.h: zutil.h - sed -e 's||"stand.h"|' \ +.for file in zutil.h gzguts.h +CLEANFILES+= libstand_${file} +libstand_${file}: ${file} + sed -e 's||"stand.h"|' \ + -e 's||"stand.h"|' \ -e 's||"stand.h"|' \ + -e 's||"stand.h"|' \ -e 's||"stand.h"|' \ ${.ALLSRC} > ${.TARGET} +.endfor # io routines SRCS+= closeall.c dev.c ioctl.c nullfs.c stat.c \ @@ -150,6 +156,9 @@ SRCS+= bootp.c rarp.c bootparam.c SRCS+= ufs.c nfs.c cd9660.c tftp.c gzipfs.c bzipfs.c SRCS+= dosfs.c ext2fs.c SRCS+= splitfs.c +.if ${MK_NAND} != "no" +SRCS+= nandfs.c +.endif .include diff --git a/lib/libstand/bswap.c b/lib/libstand/bswap.c index b8e6ffb5ba3..308edda6308 100644 --- a/lib/libstand/bswap.c +++ b/lib/libstand/bswap.c @@ -31,7 +31,7 @@ bswap32(u_int32_t x) u_int64_t bswap64(u_int64_t x) { -#ifdef _LP64 +#ifdef __LP64__ /* * Assume we have wide enough registers to do it without touching * memory. diff --git a/lib/libstand/nandfs.c b/lib/libstand/nandfs.c new file mode 100644 index 00000000000..67e2fea8103 --- /dev/null +++ b/lib/libstand/nandfs.c @@ -0,0 +1,1041 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include "stand.h" +#include "string.h" +#include "zlib.h" + +#define DEBUG +#undef DEBUG +#ifdef DEBUG +#define NANDFS_DEBUG(fmt, args...) do { \ + printf("NANDFS_DEBUG:" fmt "\n", ##args); } while (0) +#else +#define NANDFS_DEBUG(fmt, args...) +#endif + +struct nandfs_mdt { + uint32_t entries_per_block; + uint32_t entries_per_group; + uint32_t blocks_per_group; + uint32_t groups_per_desc_block; /* desc is super group */ + uint32_t blocks_per_desc_block; /* desc is super group */ +}; + +struct bmap_buf { + LIST_ENTRY(bmap_buf) list; + nandfs_daddr_t blknr; + uint64_t *map; +}; + +struct nandfs_node { + struct nandfs_inode *inode; + LIST_HEAD(, bmap_buf) bmap_bufs; +}; +struct nandfs { + int nf_blocksize; + int nf_sectorsize; + int nf_cpno; + + struct open_file *nf_file; + struct nandfs_node *nf_opened_node; + u_int nf_offset; + uint8_t *nf_buf; + int64_t nf_buf_blknr; + + struct nandfs_fsdata *nf_fsdata; + struct nandfs_super_block *nf_sb; + struct nandfs_segment_summary nf_segsum; + struct nandfs_checkpoint nf_checkpoint; + struct nandfs_super_root nf_sroot; + struct nandfs_node nf_ifile; + struct nandfs_node nf_datfile; + struct nandfs_node nf_cpfile; + struct nandfs_mdt nf_datfile_mdt; + struct nandfs_mdt nf_ifile_mdt; + + int nf_nindir[NIADDR]; +}; + +static int nandfs_open(const char *, struct open_file *); +static int nandfs_close(struct open_file *); +static int nandfs_read(struct open_file *, void *, size_t, size_t *); +static off_t nandfs_seek(struct open_file *, off_t, int); +static int nandfs_stat(struct open_file *, struct stat *); +static int nandfs_readdir(struct open_file *, struct dirent *); + +static int nandfs_buf_read(struct nandfs *, char **, size_t *); +static struct nandfs_node *nandfs_lookup_inode(struct nandfs *, nandfs_daddr_t); +static struct nandfs_node *nandfs_lookup_path(struct nandfs *, const char *); +static int nandfs_read_inode(struct nandfs *, struct nandfs_node *, + nandfs_lbn_t, u_int, void *, int); +static int nandfs_read_blk(struct nandfs *, nandfs_daddr_t, void *, int); +static int nandfs_bmap_lookup(struct nandfs *, struct nandfs_node *, + nandfs_lbn_t, nandfs_daddr_t *, int); +static int nandfs_get_checkpoint(struct nandfs *, uint64_t, + struct nandfs_checkpoint *); +static nandfs_daddr_t nandfs_vtop(struct nandfs *, nandfs_daddr_t); +static void nandfs_calc_mdt_consts(int, struct nandfs_mdt *, int); +static void nandfs_mdt_trans(struct nandfs_mdt *, uint64_t, + nandfs_daddr_t *, uint32_t *); +static int ioread(struct open_file *, off_t, void *, u_int); +static int nandfs_probe_sectorsize(struct open_file *); + +struct fs_ops nandfs_fsops = { + "nandfs", + nandfs_open, + nandfs_close, + nandfs_read, + null_write, + nandfs_seek, + nandfs_stat, + nandfs_readdir +}; + +#define NINDIR(fs) ((fs)->nf_blocksize / sizeof(nandfs_daddr_t)) + +static int +nandfs_check_fsdata_crc(struct nandfs_fsdata *fsdata) +{ + uint32_t fsdata_crc, comp_crc; + + if (fsdata->f_magic != NANDFS_FSDATA_MAGIC) + return (0); + + /* Preserve crc */ + fsdata_crc = fsdata->f_sum; + + /* Calculate */ + fsdata->f_sum = (0); + comp_crc = crc32(0, (uint8_t *)fsdata, fsdata->f_bytes); + + /* Restore */ + fsdata->f_sum = fsdata_crc; + + /* Check CRC */ + return (fsdata_crc == comp_crc); +} + +static int +nandfs_check_superblock_crc(struct nandfs_fsdata *fsdata, + struct nandfs_super_block *super) +{ + uint32_t super_crc, comp_crc; + + /* Check super block magic */ + if (super->s_magic != NANDFS_SUPER_MAGIC) + return (0); + + /* Preserve CRC */ + super_crc = super->s_sum; + + /* Calculate */ + super->s_sum = (0); + comp_crc = crc32(0, (uint8_t *)super, fsdata->f_sbbytes); + + /* Restore */ + super->s_sum = super_crc; + + /* Check CRC */ + return (super_crc == comp_crc); +} + +static int +nandfs_find_super_block(struct nandfs *fs, struct open_file *f) +{ + struct nandfs_super_block *sb; + int i, j, n; + int sectors_to_read, error; + + sb = malloc(fs->nf_sectorsize); + if (sb == NULL) + return (ENOMEM); + + memset(fs->nf_sb, 0, sizeof(*fs->nf_sb)); + + sectors_to_read = (NANDFS_NFSAREAS * fs->nf_fsdata->f_erasesize) / + fs->nf_sectorsize; + for (i = 0; i < sectors_to_read; i++) { + NANDFS_DEBUG("reading i %d offset %d\n", i, + i * fs->nf_sectorsize); + error = ioread(f, i * fs->nf_sectorsize, (char *)sb, + fs->nf_sectorsize); + if (error) { + NANDFS_DEBUG("error %d\n", error); + continue; + } + n = fs->nf_sectorsize / sizeof(struct nandfs_super_block); + if ((i * fs->nf_sectorsize) % fs->nf_fsdata->f_erasesize == 0) { + if (fs->nf_sectorsize == sizeof(struct nandfs_fsdata)) + continue; + else { + sb += (sizeof(struct nandfs_fsdata) / + sizeof(struct nandfs_super_block)); + n -= (sizeof(struct nandfs_fsdata) / + sizeof(struct nandfs_super_block)); + } + } + + for (j = 0; j < n; j++) { + if (!nandfs_check_superblock_crc(fs->nf_fsdata, &sb[j])) + continue; + NANDFS_DEBUG("magic %x wtime %jd\n", sb->s_magic, + sb->s_wtime); + if (sb[j].s_wtime > fs->nf_sb->s_wtime) + memcpy(fs->nf_sb, &sb[j], sizeof(*fs->nf_sb)); + } + } + + free(sb); + + return (fs->nf_sb->s_magic != 0 ? 0 : EINVAL); +} + +static int +nandfs_find_fsdata(struct nandfs *fs, struct open_file *f) +{ + int offset, error, i; + + NANDFS_DEBUG("starting\n"); + + offset = 0; + for (i = 0; i < 64 * NANDFS_NFSAREAS; i++) { + error = ioread(f, offset, (char *)fs->nf_fsdata, + sizeof(struct nandfs_fsdata)); + if (error) + return (error); + if (fs->nf_fsdata->f_magic == NANDFS_FSDATA_MAGIC) { + NANDFS_DEBUG("found at %x, volume %s\n", offset, + fs->nf_fsdata->f_volume_name); + if (nandfs_check_fsdata_crc(fs->nf_fsdata)) + break; + } + offset += fs->nf_sectorsize; + } + + return (error); +} + +static int +nandfs_read_structures(struct nandfs *fs, struct open_file *f) +{ + int error; + + error = nandfs_find_fsdata(fs, f); + if (error) + return (error); + + error = nandfs_find_super_block(fs, f); + + if (error == 0) + NANDFS_DEBUG("selected sb with w_time %jd last_pseg %jx\n", + fs->nf_sb->s_wtime, fs->nf_sb->s_last_pseg); + + return (error); +} + +static int +nandfs_mount(struct nandfs *fs, struct open_file *f) +{ + int err = 0, level; + uint64_t last_pseg; + + fs->nf_fsdata = malloc(sizeof(struct nandfs_fsdata)); + fs->nf_sb = malloc(sizeof(struct nandfs_super_block)); + + err = nandfs_read_structures(fs, f); + if (err) { + free(fs->nf_fsdata); + free(fs->nf_sb); + return (err); + } + + fs->nf_blocksize = 1 << (fs->nf_fsdata->f_log_block_size + 10); + + NANDFS_DEBUG("using superblock with wtime %jd\n", fs->nf_sb->s_wtime); + + fs->nf_cpno = fs->nf_sb->s_last_cno; + last_pseg = fs->nf_sb->s_last_pseg; + + /* + * Calculate indirect block levels. + */ + nandfs_daddr_t mult; + + mult = 1; + for (level = 0; level < NIADDR; level++) { + mult *= NINDIR(fs); + fs->nf_nindir[level] = mult; + } + + nandfs_calc_mdt_consts(fs->nf_blocksize, &fs->nf_datfile_mdt, + fs->nf_fsdata->f_dat_entry_size); + + nandfs_calc_mdt_consts(fs->nf_blocksize, &fs->nf_ifile_mdt, + fs->nf_fsdata->f_inode_size); + + err = ioread(f, last_pseg * fs->nf_blocksize, &fs->nf_segsum, + sizeof(struct nandfs_segment_summary)); + if (err) { + free(fs->nf_sb); + free(fs->nf_fsdata); + return (err); + } + + err = ioread(f, (last_pseg + fs->nf_segsum.ss_nblocks - 1) * + fs->nf_blocksize, &fs->nf_sroot, sizeof(struct nandfs_super_root)); + if (err) { + free(fs->nf_sb); + free(fs->nf_fsdata); + return (err); + } + + fs->nf_datfile.inode = &fs->nf_sroot.sr_dat; + LIST_INIT(&fs->nf_datfile.bmap_bufs); + fs->nf_cpfile.inode = &fs->nf_sroot.sr_cpfile; + LIST_INIT(&fs->nf_cpfile.bmap_bufs); + + err = nandfs_get_checkpoint(fs, fs->nf_cpno, &fs->nf_checkpoint); + if (err) { + free(fs->nf_sb); + free(fs->nf_fsdata); + return (err); + } + + NANDFS_DEBUG("checkpoint cp_cno=%lld\n", fs->nf_checkpoint.cp_cno); + NANDFS_DEBUG("checkpoint cp_inodes_count=%lld\n", + fs->nf_checkpoint.cp_inodes_count); + NANDFS_DEBUG("checkpoint cp_ifile_inode.i_blocks=%lld\n", + fs->nf_checkpoint.cp_ifile_inode.i_blocks); + + fs->nf_ifile.inode = &fs->nf_checkpoint.cp_ifile_inode; + LIST_INIT(&fs->nf_ifile.bmap_bufs); + return (0); +} + +#define NINDIR(fs) ((fs)->nf_blocksize / sizeof(nandfs_daddr_t)) + +static int +nandfs_open(const char *path, struct open_file *f) +{ + struct nandfs *fs; + struct nandfs_node *node; + int err, bsize, level; + + NANDFS_DEBUG("nandfs_open('%s', %p)\n", path, f); + + fs = malloc(sizeof(struct nandfs)); + f->f_fsdata = fs; + fs->nf_file = f; + + bsize = nandfs_probe_sectorsize(f); + if (bsize < 0) { + printf("Cannot probe medium sector size\n"); + return (EINVAL); + } + + fs->nf_sectorsize = bsize; + + /* + * Calculate indirect block levels. + */ + nandfs_daddr_t mult; + + mult = 1; + for (level = 0; level < NIADDR; level++) { + mult *= NINDIR(fs); + fs->nf_nindir[level] = mult; + } + + NANDFS_DEBUG("fs %p nf_sectorsize=%x\n", fs, fs->nf_sectorsize); + + err = nandfs_mount(fs, f); + if (err) { + NANDFS_DEBUG("Cannot mount nandfs: %s\n", strerror(err)); + return (err); + } + + node = nandfs_lookup_path(fs, path); + if (node == NULL) + return (EINVAL); + + fs->nf_offset = 0; + fs->nf_buf = NULL; + fs->nf_buf_blknr = -1; + fs->nf_opened_node = node; + LIST_INIT(&fs->nf_opened_node->bmap_bufs); + return (0); +} + +static int +nandfs_free_node(struct nandfs_node *node) +{ + struct bmap_buf *bmap, *tmp; + + free(node->inode); + LIST_FOREACH_SAFE(bmap, &node->bmap_bufs, list, tmp) { + LIST_REMOVE(bmap, list); + free(bmap->map); + free(bmap); + } + free(node); +} + +static int +nandfs_close(struct open_file *f) +{ + struct nandfs *fs = f->f_fsdata; + + NANDFS_DEBUG("nandfs_close(%p)\n", f); + + if (fs->nf_buf != NULL) + free(fs->nf_buf); + + nandfs_free_node(fs->nf_opened_node); + free(fs->nf_sb); + free(fs); +} + +static int +nandfs_read(struct open_file *f, void *addr, size_t size, size_t *resid) +{ + struct nandfs *fs = (struct nandfs *)f->f_fsdata; + size_t csize, buf_size; + uint8_t *buf; + int error = 0; + + NANDFS_DEBUG("nandfs_read(file=%p, addr=%p, size=%d)\n", f, addr, size); + + while (size != 0) { + if (fs->nf_offset >= fs->nf_opened_node->inode->i_size) + break; + + error = nandfs_buf_read(fs, (void *)&buf, &buf_size); + if (error) + break; + + csize = size; + if (csize > buf_size) + csize = buf_size; + + bcopy(buf, addr, csize); + + fs->nf_offset += csize; + addr = (char *)addr + csize; + size -= csize; + } + + if (resid) + *resid = size; + return (error); +} + +static off_t +nandfs_seek(struct open_file *f, off_t offset, int where) +{ + struct nandfs *fs = f->f_fsdata; + off_t off; + u_int size; + + NANDFS_DEBUG("nandfs_seek(file=%p, offset=%lld, where=%d)\n", f, + offset, where); + + size = fs->nf_opened_node->inode->i_size; + + switch (where) { + case SEEK_SET: + off = 0; + break; + case SEEK_CUR: + off = fs->nf_offset; + break; + case SEEK_END: + off = size; + break; + default: + errno = EINVAL; + return (-1); + } + + off += offset; + if (off < 0 || off > size) { + errno = EINVAL; + return(-1); + } + + fs->nf_offset = (u_int)off; + + return (off); +} + +static int +nandfs_stat(struct open_file *f, struct stat *sb) +{ + struct nandfs *fs = f->f_fsdata; + + NANDFS_DEBUG("nandfs_stat(file=%p, stat=%p)\n", f, sb); + + sb->st_size = fs->nf_opened_node->inode->i_size; + sb->st_mode = fs->nf_opened_node->inode->i_mode; + sb->st_uid = fs->nf_opened_node->inode->i_uid; + sb->st_gid = fs->nf_opened_node->inode->i_gid; + return (0); +} + +static int +nandfs_readdir(struct open_file *f, struct dirent *d) +{ + struct nandfs *fs = f->f_fsdata; + struct nandfs_dir_entry *dirent; + uint8_t *buf; + size_t buf_size; + + NANDFS_DEBUG("nandfs_readdir(file=%p, dirent=%p)\n", f, d); + + if (fs->nf_offset >= fs->nf_opened_node->inode->i_size) { + NANDFS_DEBUG("nandfs_readdir(file=%p, dirent=%p) ENOENT\n", + f, d); + return (ENOENT); + } + + if (nandfs_buf_read(fs, (void *)&buf, &buf_size)) { + NANDFS_DEBUG("nandfs_readdir(file=%p, dirent=%p)" + "buf_read failed\n", f, d); + return (EIO); + } + + NANDFS_DEBUG("nandfs_readdir(file=%p, dirent=%p) moving forward\n", + f, d); + + dirent = (struct nandfs_dir_entry *)buf; + fs->nf_offset += dirent->rec_len; + strncpy(d->d_name, dirent->name, dirent->name_len); + d->d_name[dirent->name_len] = '\0'; + d->d_type = dirent->file_type; + return (0); +} + +static int +nandfs_buf_read(struct nandfs *fs, char **buf_p, size_t *size_p) +{ + nandfs_daddr_t blknr, blkoff; + + blknr = fs->nf_offset / fs->nf_blocksize; + blkoff = fs->nf_offset % fs->nf_blocksize; + + if (blknr != fs->nf_buf_blknr) { + if (fs->nf_buf == NULL) + fs->nf_buf = malloc(fs->nf_blocksize); + + if (nandfs_read_inode(fs, fs->nf_opened_node, blknr, 1, + fs->nf_buf, 0)) + return (EIO); + + fs->nf_buf_blknr = blknr; + } + + *buf_p = fs->nf_buf + blkoff; + *size_p = fs->nf_blocksize - blkoff; + + NANDFS_DEBUG("nandfs_buf_read buf_p=%p size_p=%d\n", *buf_p, *size_p); + + if (*size_p > fs->nf_opened_node->inode->i_size - fs->nf_offset) + *size_p = fs->nf_opened_node->inode->i_size - fs->nf_offset; + + return (0); +} + +static struct nandfs_node * +nandfs_lookup_node(struct nandfs *fs, uint64_t ino) +{ + uint64_t blocknr; + int entrynr; + struct nandfs_inode *buffer; + struct nandfs_node *node; + struct nandfs_inode *inode; + + NANDFS_DEBUG("nandfs_lookup_node ino=%lld\n", ino); + + if (ino == 0) { + printf("nandfs_lookup_node: invalid inode requested\n"); + return (NULL); + } + + buffer = malloc(fs->nf_blocksize); + inode = malloc(sizeof(struct nandfs_inode)); + node = malloc(sizeof(struct nandfs_node)); + + nandfs_mdt_trans(&fs->nf_ifile_mdt, ino, &blocknr, &entrynr); + + if (nandfs_read_inode(fs, &fs->nf_ifile, blocknr, 1, buffer, 0)) + return (NULL); + + memcpy(inode, &buffer[entrynr], sizeof(struct nandfs_inode)); + node->inode = inode; + free(buffer); + return (node); +} + +static struct nandfs_node * +nandfs_lookup_path(struct nandfs *fs, const char *path) +{ + struct nandfs_node *node; + struct nandfs_dir_entry *dirent; + char *namebuf; + uint64_t i, j, done, counter, pinode, inode; + int nlinks = 0, len, link_len, nameidx; + uint8_t *buffer, *orig; + char *strp, *lpath; + + buffer = malloc(fs->nf_blocksize); + orig = buffer; + + namebuf = malloc(2 * MAXPATHLEN + 2); + strncpy(namebuf, path, MAXPATHLEN); + namebuf[MAXPATHLEN] = '\0'; + done = nameidx = 0; + lpath = namebuf; + + /* Get the root inode */ + node = nandfs_lookup_node(fs, NANDFS_ROOT_INO); + inode = NANDFS_ROOT_INO; + + while ((strp = strsep(&lpath, "/")) != NULL) { + if (*strp == '\0') + continue; + if ((node->inode->i_mode & IFMT) != IFDIR) { + nandfs_free_node(node); + node = NULL; + goto out; + } + + len = strlen(strp); + NANDFS_DEBUG("%s: looking for %s\n", __func__, strp); + for (i = 0; i < node->inode->i_blocks; i++) { + if (nandfs_read_inode(fs, node, i, 1, orig, 0)) { + node = NULL; + goto out; + } + + buffer = orig; + done = counter = 0; + while (1) { + dirent = (struct nandfs_dir_entry *)buffer; + NANDFS_DEBUG("%s: dirent.name = %s\n", + __func__, dirent->name); + NANDFS_DEBUG("%s: dirent.rec_len = %d\n", + __func__, dirent->rec_len); + NANDFS_DEBUG("%s: dirent.inode = %lld\n", + __func__, dirent->inode); + if (len == dirent->name_len && + (strncmp(strp, dirent->name, len) == 0) && + dirent->inode != 0) { + nandfs_free_node(node); + node = nandfs_lookup_node(fs, + dirent->inode); + pinode = inode; + inode = dirent->inode; + done = 1; + break; + } + + counter += dirent->rec_len; + buffer += dirent->rec_len; + + if (counter == fs->nf_blocksize) + break; + } + + if (done) + break; + } + + if (!done) { + node = NULL; + goto out; + } + + NANDFS_DEBUG("%s: %.*s has mode %o\n", __func__, + dirent->name_len, dirent->name, node->inode->i_mode); + + if ((node->inode->i_mode & IFMT) == IFLNK) { + NANDFS_DEBUG("%s: %.*s is symlink\n", + __func__, dirent->name_len, dirent->name); + link_len = node->inode->i_size; + + if (++nlinks > MAXSYMLINKS) { + nandfs_free_node(node); + node = NULL; + goto out; + } + + if (nandfs_read_inode(fs, node, 0, 1, orig, 0)) { + nandfs_free_node(node); + node = NULL; + goto out; + } + + NANDFS_DEBUG("%s: symlink is %.*s\n", + __func__, link_len, (char *)orig); + + nameidx = (nameidx == 0) ? MAXPATHLEN + 1 : 0; + bcopy((char *)orig, namebuf + nameidx, + (unsigned)link_len); + if (lpath != NULL) { + namebuf[nameidx + link_len++] = '/'; + strncpy(namebuf + nameidx + link_len, lpath, + MAXPATHLEN - link_len); + namebuf[nameidx + MAXPATHLEN] = '\0'; + } else + namebuf[nameidx + link_len] = '\0'; + + NANDFS_DEBUG("%s: strp=%s, lpath=%s, namebuf0=%s, " + "namebuf1=%s, idx=%d\n", __func__, strp, lpath, + namebuf + 0, namebuf + MAXPATHLEN + 1, nameidx); + + lpath = namebuf + nameidx; + + nandfs_free_node(node); + + /* + * If absolute pathname, restart at root. Otherwise + * continue with out parent inode. + */ + inode = (orig[0] == '/') ? NANDFS_ROOT_INO : pinode; + node = nandfs_lookup_node(fs, inode); + } + } + +out: + free(namebuf); + free(orig); + return (node); +} + +static int +nandfs_read_inode(struct nandfs *fs, struct nandfs_node *node, + nandfs_daddr_t blknr, u_int nblks, void *buf, int raw) +{ + int i; + uint64_t *pblks; + uint64_t *vblks; + int error; + + pblks = malloc(nblks * sizeof(uint64_t)); + vblks = malloc(nblks * sizeof(uint64_t)); + + NANDFS_DEBUG("nandfs_read_inode fs=%p node=%p blknr=%lld nblks=%d\n", + fs, node, blknr, nblks); + for (i = 0; i < nblks; i++) { + error = nandfs_bmap_lookup(fs, node, blknr + i, &vblks[i], raw); + if (error) { + free(pblks); + free(vblks); + return (error); + } + if (raw == 0) + pblks[i] = nandfs_vtop(fs, vblks[i]); + else + pblks[i] = vblks[i]; + } + + for (i = 0; i < nblks; i++) { + if (ioread(fs->nf_file, pblks[i] * fs->nf_blocksize, buf, + fs->nf_blocksize)) { + free(pblks); + free(vblks); + return (EIO); + } + + buf += fs->nf_blocksize; + } + + free(pblks); + free(vblks); + return (0); +} + +static int +nandfs_read_blk(struct nandfs *fs, nandfs_daddr_t blknr, void *buf, int phys) +{ + uint64_t pblknr; + + pblknr = (phys ? blknr : nandfs_vtop(fs, blknr)); + + return (ioread(fs->nf_file, pblknr * fs->nf_blocksize, buf, + fs->nf_blocksize)); +} + +static int +nandfs_get_checkpoint(struct nandfs *fs, uint64_t cpno, + struct nandfs_checkpoint *cp) +{ + uint64_t blocknr; + int blockoff, cp_per_block, dlen; + uint8_t *buf; + + NANDFS_DEBUG("nandfs_get_checkpoint(fs=%p cpno=%lld)\n", fs, cpno); + + buf = malloc(fs->nf_blocksize); + + cpno += NANDFS_CPFILE_FIRST_CHECKPOINT_OFFSET - 1; + dlen = fs->nf_fsdata->f_checkpoint_size; + cp_per_block = fs->nf_blocksize / dlen; + blocknr = cpno / cp_per_block; + blockoff = (cpno % cp_per_block) * dlen; + + if (nandfs_read_inode(fs, &fs->nf_cpfile, blocknr, 1, buf, 0)) { + free(buf); + return (EINVAL); + } + + memcpy(cp, buf + blockoff, sizeof(struct nandfs_checkpoint)); + free(buf); + + return (0); +} + +static uint64_t * +nandfs_get_map(struct nandfs *fs, struct nandfs_node *node, nandfs_daddr_t blknr, + int phys) +{ + struct bmap_buf *bmap; + uint64_t *map; + + LIST_FOREACH(bmap, &node->bmap_bufs, list) { + if (bmap->blknr == blknr) + return (bmap->map); + } + + map = malloc(fs->nf_blocksize); + if (nandfs_read_blk(fs, blknr, map, phys)) { + free(map); + return (NULL); + } + + bmap = malloc(sizeof(struct bmap_buf)); + bmap->blknr = blknr; + bmap->map = map; + + LIST_INSERT_HEAD(&node->bmap_bufs, bmap, list); + + NANDFS_DEBUG("%s:(node=%p, map=%p)\n", __func__, node, map); + return (map); +} + +static int +nandfs_bmap_lookup(struct nandfs *fs, struct nandfs_node *node, + nandfs_lbn_t lblknr, nandfs_daddr_t *vblknr, int phys) +{ + struct nandfs_inode *ino; + nandfs_daddr_t ind_block_num; + uint64_t *map, *indir; + uint64_t idx0, idx1, vblk, tmp; + int idx; + int level; + + ino = node->inode; + + if (lblknr < NDADDR) { + *vblknr = ino->i_db[lblknr]; + return (0); + } + + lblknr -= NDADDR; + + /* + * nindir[0] = NINDIR + * nindir[1] = NINDIR**2 + * nindir[2] = NINDIR**3 + * etc + */ + for (level = 0; level < NIADDR; level++) { + NANDFS_DEBUG("lblknr=%jx fs->nf_nindir[%d]=%d\n", lblknr, level, fs->nf_nindir[level]); + if (lblknr < fs->nf_nindir[level]) + break; + lblknr -= fs->nf_nindir[level]; + } + + if (level == NIADDR) { + /* Block number too high */ + NANDFS_DEBUG("lblknr %jx too high\n", lblknr); + return (EFBIG); + } + + ind_block_num = ino->i_ib[level]; + + for (; level >= 0; level--) { + if (ind_block_num == 0) { + *vblknr = 0; /* missing */ + return (0); + } + + twiddle(); + NANDFS_DEBUG("calling get_map with %jx\n", ind_block_num); + map = nandfs_get_map(fs, node, ind_block_num, phys); + if (map == NULL) + return (EIO); + + if (level > 0) { + idx = lblknr / fs->nf_nindir[level - 1]; + lblknr %= fs->nf_nindir[level - 1]; + } else + idx = lblknr; + + ind_block_num = ((nandfs_daddr_t *)map)[idx]; + } + + *vblknr = ind_block_num; + + return (0); +} + +static nandfs_daddr_t +nandfs_vtop(struct nandfs *fs, nandfs_daddr_t vblocknr) +{ + nandfs_lbn_t blocknr; + nandfs_daddr_t pblocknr; + int entrynr; + struct nandfs_dat_entry *dat; + + dat = malloc(fs->nf_blocksize); + nandfs_mdt_trans(&fs->nf_datfile_mdt, vblocknr, &blocknr, &entrynr); + + if (nandfs_read_inode(fs, &fs->nf_datfile, blocknr, 1, dat, 1)) { + free(dat); + return (0); + } + + NANDFS_DEBUG("nandfs_vtop entrynr=%d vblocknr=%lld pblocknr=%lld\n", + entrynr, vblocknr, dat[entrynr].de_blocknr); + + pblocknr = dat[entrynr].de_blocknr; + free(dat); + return (pblocknr); +} + +static void +nandfs_calc_mdt_consts(int blocksize, struct nandfs_mdt *mdt, int entry_size) +{ + + mdt->entries_per_group = blocksize * 8; /* bits in sector */ + mdt->entries_per_block = blocksize / entry_size; + mdt->blocks_per_group = + (mdt->entries_per_group -1) / mdt->entries_per_block + 1 + 1; + mdt->groups_per_desc_block = + blocksize / sizeof(struct nandfs_block_group_desc); + mdt->blocks_per_desc_block = + mdt->groups_per_desc_block * mdt->blocks_per_group + 1; +} + +static void +nandfs_mdt_trans(struct nandfs_mdt *mdt, uint64_t index, + nandfs_daddr_t *blocknr, uint32_t *entry_in_block) +{ + nandfs_daddr_t blknr; + uint64_t group, group_offset, blocknr_in_group; + uint64_t desc_block, desc_offset; + + /* Calculate our offset in the file */ + group = index / mdt->entries_per_group; + group_offset = index % mdt->entries_per_group; + desc_block = group / mdt->groups_per_desc_block; + desc_offset = group % mdt->groups_per_desc_block; + blocknr_in_group = group_offset / mdt->entries_per_block; + + /* To descgroup offset */ + blknr = 1 + desc_block * mdt->blocks_per_desc_block; + + /* To group offset */ + blknr += desc_offset * mdt->blocks_per_group; + + /* To actual file block */ + blknr += 1 + blocknr_in_group; + + *blocknr = blknr; + *entry_in_block = group_offset % mdt->entries_per_block; +} + +static int +ioread(struct open_file *f, off_t pos, void *buf, u_int length) +{ + void *buffer; + int err; + int bsize = ((struct nandfs *)f->f_fsdata)->nf_sectorsize; + u_int off, nsec; + + off = pos % bsize; + pos /= bsize; + nsec = (length + (bsize - 1)) / bsize; + + NANDFS_DEBUG("pos=%lld length=%d off=%d nsec=%d\n", pos, length, + off, nsec); + + buffer = malloc(nsec * bsize); + + err = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, pos, + nsec * bsize, buffer, NULL); + + memcpy(buf, buffer + off, length); + free(buffer); + + return (err); +} + +static int +nandfs_probe_sectorsize(struct open_file *f) +{ + void *buffer; + int i, err; + + buffer = malloc(16 * 1024); + + NANDFS_DEBUG("probing for sector size: "); + + for (i = 512; i < (16 * 1024); i <<= 1) { + NANDFS_DEBUG("%d ", i); + err = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, 0, i, + buffer, NULL); + + if (err == 0) { + NANDFS_DEBUG("found"); + free(buffer); + return (i); + } + } + + free(buffer); + NANDFS_DEBUG("not found\n"); + return (-1); +} diff --git a/lib/libstand/stand.h b/lib/libstand/stand.h index db0490f4d6e..10bb829c4ce 100644 --- a/lib/libstand/stand.h +++ b/lib/libstand/stand.h @@ -118,6 +118,7 @@ extern struct fs_ops ufs_fsops; extern struct fs_ops tftp_fsops; extern struct fs_ops nfs_fsops; extern struct fs_ops cd9660_fsops; +extern struct fs_ops nandfs_fsops; extern struct fs_ops gzipfs_fsops; extern struct fs_ops bzipfs_fsops; extern struct fs_ops dosfs_fsops; diff --git a/lib/libstdbuf/Makefile b/lib/libstdbuf/Makefile new file mode 100644 index 00000000000..cf65e4f20ab --- /dev/null +++ b/lib/libstdbuf/Makefile @@ -0,0 +1,12 @@ +# $FreeBSD$ + +.include + +LIB= stdbuf +SRCS= stdbuf.c +SHLIB_MAJOR= 1 +MAN= libstdbuf.3 + +WARNS?= 6 + +.include diff --git a/lib/libstdbuf/libstdbuf.3 b/lib/libstdbuf/libstdbuf.3 new file mode 100644 index 00000000000..9b37cb0224a --- /dev/null +++ b/lib/libstdbuf/libstdbuf.3 @@ -0,0 +1,102 @@ +.\" Copyright (c) 2012 Jeremie Le Hen +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code and documentation must retain the above +.\" copyright notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd April 28, 2012 +.Dt LIBSTDBUF 3 +.Os +.Sh NAME +.Nm libstdbuf +.Nd preloaded library to change standard streams initial buffering +.Sh DESCRIPTION +The +.Nm +library is meant to be preloaded with the +.Ev LD_PRELOAD +environment variable to as to change the initial buffering +of standard input, standard output and standard error streams. +.Pp +Although you may load and configure this library manually, +an utility, +.Xr stdbuf 1 , +can be used to run a command with the appropriate environment variables. +.Sh ENVIRONMENT +Each stream can be configured independently through the following +environment variables (values are defined below): +.Bl -tag -width size -offset indent +.It Ev _STDBUF_I +Initial buffering definition for the standard input stream +.It Ev _STDBUF_O +Initial buffering definition for the standard output stream +.It Ev _STDBUF_E +Initial buffering definition for the standard error stream +.El +.Pp +Each variable may take one of the following values: +.Bl -tag -width size -offset indent +.It Qq 0 +unbuffered +.It Qq L +line buffered +.It Qq B +fully buffered with the default buffer size +.It Ar size +fully buffered with a buffer of +.Ar size +bytes (suffixes 'k', 'M' and 'G' are accepted) +.El +.Sh EXAMPLE +In the following example, the stdout stream of the +.Xr awk 1 +command +will be fully buffered by default because it does not refer +to a terminal. +.Nm +is used to force it to be line-buffered so +.Xr vmstat 8 Ns 's +output will not stall until the full buffer fills. +.Bd -literal -offset indent +# vmstat 1 | LD_PRELOAD=/usr/lib/libstdbuf.so \\ + STDBUF_1=L awk '$2 > 1 || $3 > 1' | cat -n +.Ed +.Pp +See also the manpage of +.Xr stdbuf 1 +for a simpler way to do this. +.Sh HISTORY +The +.Nm +library first appeared in +.Fx 8.4 . +.Sh AUTHORS +.An -nosplit +The original idea of the +.Nm +command comes from +.An Padraig Brady +who implemented it in the GNU coreutils. +.An Jeremie Le Hen +implemented it on +.Fx . diff --git a/lib/libstdbuf/stdbuf.c b/lib/libstdbuf/stdbuf.c new file mode 100644 index 00000000000..1b5d39a6361 --- /dev/null +++ b/lib/libstdbuf/stdbuf.c @@ -0,0 +1,115 @@ +/*- + * Copyright (c) 2012 Jeremie Le Hen + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include + +static const char * +stream_name(FILE *s) +{ + + if (s == stdin) + return "stdin"; + if (s == stdout) + return "stdout"; + if (s == stderr) + return "stderr"; + /* This should not happen. */ + abort(); +} + +static void +change_buf(FILE *s, const char *bufmode) +{ + char *unit; + size_t bufsize; + int mode; + + bufsize = 0; + if (bufmode[0] == '0' && bufmode[1] == '\0') + mode = _IONBF; + else if (bufmode[0] == 'L' && bufmode[1] == '\0') + mode = _IOLBF; + else if (bufmode[0] == 'B' && bufmode[1] == '\0') { + mode = _IOFBF; + bufsize = 0; + } else { + /* + * This library being preloaded, depending on libutil + * would lead to excessive namespace pollution. + * Thus we do not use expand_number(). + */ + errno = 0; + bufsize = strtol(bufmode, &unit, 0); + if (errno == EINVAL || errno == ERANGE || unit == bufmode) + warn("Wrong buffer mode '%s' for %s", bufmode, + stream_name(s)); + switch (*unit) { + case 'G': + bufsize *= 1024 * 1024 * 1024; + break; + case 'M': + bufsize *= 1024 * 1024; + break; + case 'k': + bufsize *= 1024; + break; + case '\0': + break; + default: + warnx("Unknown suffix '%c' for %s", *unit, + stream_name(s)); + return; + } + mode = _IOFBF; + } + if (setvbuf(s, NULL, mode, bufsize) != 0) + warn("Cannot set buffer mode '%s' for %s", bufmode, + stream_name(s)); +} + +__attribute__ ((constructor)) static void +stdbuf(void) +{ + char *i_mode, *o_mode, *e_mode; + + i_mode = getenv("_STDBUF_I"); + o_mode = getenv("_STDBUF_O"); + e_mode = getenv("_STDBUF_E"); + + if (e_mode != NULL) + change_buf(stderr, e_mode); + if (i_mode != NULL) + change_buf(stdin, i_mode); + if (o_mode != NULL) + change_buf(stdout, o_mode); +} diff --git a/lib/libtacplus/libtacplus.3 b/lib/libtacplus/libtacplus.3 index f247a280da6..40ec6a26246 100644 --- a/lib/libtacplus/libtacplus.3 +++ b/lib/libtacplus/libtacplus.3 @@ -380,7 +380,7 @@ the request, and waits for a reply. On failure, .Fn tac_send_acct returns \-1. -Otherwise, it returns the TACACS+ status code +Otherwise, it returns the TACACS+ status code. Possible status codes, defined in .In taclib.h , include: diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c index 86abad8deaf..e1e304abef6 100644 --- a/lib/libthr/thread/thr_init.c +++ b/lib/libthr/thread/thr_init.c @@ -112,6 +112,7 @@ size_t _thr_stack_initial = THR_STACK_INITIAL; int _thr_page_size; int _thr_spinloops; int _thr_yieldloops; +int _thr_queuefifo = 4; int _gc_count; struct umutex _mutex_static_lock = DEFAULT_UMUTEX; struct umutex _cond_static_lock = DEFAULT_UMUTEX; @@ -470,6 +471,9 @@ init_private(void) env = getenv("LIBPTHREAD_YIELDLOOPS"); if (env) _thr_yieldloops = atoi(env); + env = getenv("LIBPTHREAD_QUEUE_FIFO"); + if (env) + _thr_queuefifo = atoi(env); TAILQ_INIT(&_thr_atfork_list); } init_once = 1; diff --git a/lib/libthr/thread/thr_mutex.c b/lib/libthr/thread/thr_mutex.c index 7573f28a092..91b47eca86b 100644 --- a/lib/libthr/thread/thr_mutex.c +++ b/lib/libthr/thread/thr_mutex.c @@ -538,6 +538,7 @@ mutex_self_trylock(struct pthread_mutex *m) switch (PMUTEX_TYPE(m->m_flags)) { case PTHREAD_MUTEX_ERRORCHECK: case PTHREAD_MUTEX_NORMAL: + case PTHREAD_MUTEX_ADAPTIVE_NP: ret = EBUSY; break; diff --git a/lib/libthr/thread/thr_private.h b/lib/libthr/thread/thr_private.h index 4469f6bea34..5224c7c2c1b 100644 --- a/lib/libthr/thread/thr_private.h +++ b/lib/libthr/thread/thr_private.h @@ -710,6 +710,7 @@ extern size_t _thr_stack_initial __hidden; extern int _thr_page_size __hidden; extern int _thr_spinloops __hidden; extern int _thr_yieldloops __hidden; +extern int _thr_queuefifo __hidden; /* Garbage thread count. */ extern int _gc_count __hidden; diff --git a/lib/libthr/thread/thr_sleepq.c b/lib/libthr/thread/thr_sleepq.c index 8549a877240..c5dcac59d74 100644 --- a/lib/libthr/thread/thr_sleepq.c +++ b/lib/libthr/thread/thr_sleepq.c @@ -39,6 +39,7 @@ struct sleepqueue_chain { struct umutex sc_lock; + int sc_enqcnt; LIST_HEAD(, sleepqueue) sc_queues; int sc_type; }; @@ -93,30 +94,34 @@ _sleepq_unlock(void *wchan) THR_LOCK_RELEASE(curthread, &sc->sc_lock); } -struct sleepqueue * -_sleepq_lookup(void *wchan) +static inline struct sleepqueue * +lookup(struct sleepqueue_chain *sc, void *wchan) { - struct sleepqueue_chain *sc; struct sleepqueue *sq; - sc = SC_LOOKUP(wchan); LIST_FOREACH(sq, &sc->sc_queues, sq_hash) if (sq->sq_wchan == wchan) return (sq); return (NULL); } +struct sleepqueue * +_sleepq_lookup(void *wchan) +{ + return (lookup(SC_LOOKUP(wchan), wchan)); +} + void _sleepq_add(void *wchan, struct pthread *td) { struct sleepqueue_chain *sc; struct sleepqueue *sq; - sq = _sleepq_lookup(wchan); + sc = SC_LOOKUP(wchan); + sq = lookup(sc, wchan); if (sq != NULL) { SLIST_INSERT_HEAD(&sq->sq_freeq, td->sleepqueue, sq_flink); } else { - sc = SC_LOOKUP(wchan); sq = td->sleepqueue; LIST_INSERT_HEAD(&sc->sc_queues, sq, sq_hash); sq->sq_wchan = wchan; @@ -124,7 +129,10 @@ _sleepq_add(void *wchan, struct pthread *td) } td->sleepqueue = NULL; td->wchan = wchan; - TAILQ_INSERT_TAIL(&sq->sq_blocked, td, wle); + if (((++sc->sc_enqcnt << _thr_queuefifo) & 0xff) != 0) + TAILQ_INSERT_HEAD(&sq->sq_blocked, td, wle); + else + TAILQ_INSERT_TAIL(&sq->sq_blocked, td, wle); } int diff --git a/lib/libusb/Makefile b/lib/libusb/Makefile index 75efe2eb60d..d45dd567b43 100644 --- a/lib/libusb/Makefile +++ b/lib/libusb/Makefile @@ -18,6 +18,9 @@ NOGCCERROR= WARNS?= 2 +DPADD= ${LIBPTHREAD} +LDADD= -lpthread + MLINKS+= libusb.3 usb.3 # libusb 0.1 compat @@ -74,6 +77,7 @@ MLINKS += libusb.3 libusb_get_active_config_descriptor.3 MLINKS += libusb.3 libusb_get_config_descriptor.3 MLINKS += libusb.3 libusb_get_config_descriptor_by_value.3 MLINKS += libusb.3 libusb_free_config_descriptor.3 +MLINKS += libusb.3 libusb_get_string_descriptor.3 MLINKS += libusb.3 libusb_get_string_descriptor_ascii.3 MLINKS += libusb.3 libusb_parse_ss_endpoint_comp.3 MLINKS += libusb.3 libusb_free_ss_endpoint_comp.3 diff --git a/lib/libusb/libusb.3 b/lib/libusb/libusb.3 index 6b1defdcca0..ffc761b7220 100644 --- a/lib/libusb/libusb.3 +++ b/lib/libusb/libusb.3 @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 12, 2012 +.Dd May 7, 2012 .Dt LIBUSB 3 .Os .Sh NAME @@ -100,12 +100,12 @@ counter decremented once. .Ft uint8_t .Fn libusb_get_bus_number "libusb_device *dev" Returns the number of the bus contained by the device -.Fa dev. +.Fa dev . .Pp .Ft uint8_t .Fn libusb_get_device_address "libusb_device *dev" Returns the device_address contained by the device -.Fa dev. +.Fa dev . .Pp .Ft enum libusb_speed .Fn libusb_get_device_speed "libusb_device *dev" @@ -127,12 +127,12 @@ LIBUSB_ERROR_OTHERS on other failure. .Ft libusb_device * .Fn libusb_ref_device "libusb_device *dev" Increment the reference counter of the device -.Fa dev. +.Fa dev . .Pp .Ft void .Fn libusb_unref_device "libusb_device *dev" Decrement the reference counter of the device -.Fa dev. +.Fa dev . .Pp .Ft int .Fn libusb_open "libusb_device *dev" "libusb_device_handle **devh" @@ -147,7 +147,7 @@ disconnected and a LIBUSB_ERROR code on other errors. A convenience function to open a device by vendor and product IDs .Fa vid and -.Fa pid. +.Fa pid . Returns NULL on error. .Pp .Ft void @@ -161,7 +161,7 @@ Returns NULL on error. .Pp .Ft int .Fn libusb_get_configuration "libusb_device_handle *devh" "int *config" -Returns the bConfiguration value of the current configuration. +Returns the value of the current configuration. Returns 0 on success, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a LIBUSB_ERROR code on error. @@ -171,7 +171,7 @@ and a LIBUSB_ERROR code on error. Set the active configuration to .Fa config for the device contained by -.Fa devh. +.Fa devh . This function returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the requested configuration does not exist, LIBUSB_ERROR_BUSY if the interfaces are currently claimed, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a @@ -180,7 +180,7 @@ LIBUSB_ERROR code on failure. .Ft int .Fn libusb_claim_interface "libusb_device_handle *devh" "int interface_number" Claim an interface in a given libusb_handle -.Fa devh. +.Fa devh . This is a non-blocking function. It returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the requested interface does not exist, LIBUSB_ERROR_BUSY if a program or @@ -279,7 +279,7 @@ LIBUSB_ERROR code on failure. .Ft int .Fn libusb_get_device_descriptor "libusb_device *dev" "libusb_device_descriptor *desc" Get the USB device descriptor for the device -.Fa dev. +.Fa dev . This is a non-blocking function. Returns 0 on success and a LIBUSB_ERROR code on failure. @@ -314,6 +314,12 @@ LIBUSB_ERROR code on failure. Free a configuration descriptor. .Pp .Ft int +.Fn libusb_get_string_descriptor "libusb_device_handle *devh" "uint8_t desc_idx" "uint16_t langid" "unsigned char *data" "int length" +Retrieve a string descriptor in raw format. +Returns the number of bytes actually transferred on success +or a negative LIBUSB_ERROR code on failure. +.Pp +.Ft int .Fn libusb_get_string_descriptor_ascii "libusb_device_handle *devh" "uint8_t desc_idx" "unsigned char *data" "int length" Retrieve a string descriptor in C style ASCII. Returns the positive number of bytes in the resulting ASCII string @@ -324,11 +330,11 @@ on success and a LIBUSB_ERROR code on failure. This function parses the USB 3.0 endpoint companion descriptor in host endian format pointed to by .Fa buf and having a length of -.Fa len. +.Fa len . Typically these arguments are the extra and extra_length fields of the endpoint descriptor. On success the pointer to resulting descriptor is stored at the location given by -.Fa ep_comp. +.Fa ep_comp . Returns zero on success and a LIBUSB_ERROR code on failure. On success the parsed USB 3.0 endpoint companion descriptor must be freed using the libusb_free_ss_endpoint_comp function. @@ -342,9 +348,9 @@ This function is NULL safe and frees a parsed USB 3.0 endpoint companion descrip This function parses a Binary Object Store, BOS, descriptor into host endian format pointed to by .Fa buf and having a length of -.Fa len. +.Fa len . On success the pointer to resulting descriptor is stored at the location given by -.Fa bos. +.Fa bos . Returns zero on success and a LIBUSB_ERROR code on failure. On success the parsed BOS descriptor must be freed using the libusb_free_bos_descriptor function. diff --git a/lib/libusb/libusb.h b/lib/libusb/libusb.h index d8a22b56983..1675f469d84 100644 --- a/lib/libusb/libusb.h +++ b/lib/libusb/libusb.h @@ -398,6 +398,7 @@ int libusb_get_active_config_descriptor(libusb_device * dev, struct libusb_confi int libusb_get_config_descriptor(libusb_device * dev, uint8_t config_index, struct libusb_config_descriptor **config); int libusb_get_config_descriptor_by_value(libusb_device * dev, uint8_t bConfigurationValue, struct libusb_config_descriptor **config); void libusb_free_config_descriptor(struct libusb_config_descriptor *config); +int libusb_get_string_descriptor(libusb_device_handle * devh, uint8_t desc_index, uint16_t langid, unsigned char *data, int length); int libusb_get_string_descriptor_ascii(libusb_device_handle * devh, uint8_t desc_index, uint8_t *data, int length); int libusb_get_descriptor(libusb_device_handle * devh, uint8_t desc_type, uint8_t desc_index, uint8_t *data, int length); int libusb_parse_ss_endpoint_comp(const void *buf, int len, struct libusb_ss_endpoint_companion_descriptor **ep_comp); diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c index 44331bc6ad3..256d67e93bc 100644 --- a/lib/libusb/libusb10.c +++ b/lib/libusb/libusb10.c @@ -92,6 +92,7 @@ int libusb_init(libusb_context **context) { struct libusb_context *ctx; + pthread_condattr_t attr; char *debug; int ret; @@ -110,8 +111,28 @@ libusb_init(libusb_context **context) TAILQ_INIT(&ctx->pollfds); TAILQ_INIT(&ctx->tr_done); - pthread_mutex_init(&ctx->ctx_lock, NULL); - pthread_cond_init(&ctx->ctx_cond, NULL); + if (pthread_mutex_init(&ctx->ctx_lock, NULL) != 0) { + free(ctx); + return (LIBUSB_ERROR_NO_MEM); + } + if (pthread_condattr_init(&attr) != 0) { + pthread_mutex_destroy(&ctx->ctx_lock); + free(ctx); + return (LIBUSB_ERROR_NO_MEM); + } + if (pthread_condattr_setclock(&attr, CLOCK_MONOTONIC) != 0) { + pthread_mutex_destroy(&ctx->ctx_lock); + pthread_condattr_destroy(&attr); + free(ctx); + return (LIBUSB_ERROR_OTHER); + } + if (pthread_cond_init(&ctx->ctx_cond, &attr) != 0) { + pthread_mutex_destroy(&ctx->ctx_lock); + pthread_condattr_destroy(&attr); + free(ctx); + return (LIBUSB_ERROR_NO_MEM); + } + pthread_condattr_destroy(&attr); ctx->ctx_handler = NO_THREAD; diff --git a/lib/libusb/libusb10_desc.c b/lib/libusb/libusb10_desc.c index 8e39bab15b2..11e201f3755 100644 --- a/lib/libusb/libusb10_desc.c +++ b/lib/libusb/libusb10_desc.c @@ -293,6 +293,25 @@ libusb_free_config_descriptor(struct libusb_config_descriptor *config) free(config); } +int +libusb_get_string_descriptor(libusb_device_handle *pdev, + uint8_t desc_index, uint16_t langid, unsigned char *data, + int length) +{ + if (pdev == NULL || data == NULL || length < 1) + return (LIBUSB_ERROR_INVALID_PARAM); + + if (length > 65535) + length = 65535; + + /* put some default data into the destination buffer */ + data[0] = 0; + + return (libusb_control_transfer(pdev, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_STRING << 8) | desc_index, + langid, data, length, 1000)); +} + int libusb_get_string_descriptor_ascii(libusb_device_handle *pdev, uint8_t desc_index, unsigned char *data, int length) diff --git a/lib/libusb/libusb10_io.c b/lib/libusb/libusb10_io.c index 63f833af882..302fdb8dda3 100644 --- a/lib/libusb/libusb10_io.c +++ b/lib/libusb/libusb10_io.c @@ -307,12 +307,16 @@ libusb_wait_for_event(libusb_context *ctx, struct timeval *tv) &ctx->ctx_lock); return (0); } - err = clock_gettime(CLOCK_REALTIME, &ts); + err = clock_gettime(CLOCK_MONOTONIC, &ts); if (err < 0) return (LIBUSB_ERROR_OTHER); - ts.tv_sec = tv->tv_sec; - ts.tv_nsec = tv->tv_usec * 1000; + /* + * The "tv" arguments points to a relative time structure and + * not an absolute time structure. + */ + ts.tv_sec += tv->tv_sec; + ts.tv_nsec += tv->tv_usec * 1000; if (ts.tv_nsec >= 1000000000) { ts.tv_nsec -= 1000000000; ts.tv_sec++; diff --git a/lib/libusb/libusb20.3 b/lib/libusb/libusb20.3 index d1abc554d08..c9bf9024abe 100644 --- a/lib/libusb/libusb20.3 +++ b/lib/libusb/libusb20.3 @@ -331,7 +331,7 @@ packets are avoided for proxy buffers. .Pp . .Fn libusb20_tr_get_max_total_length -function will return the maximum value for the data length sum of all USB +will return the maximum value for the data length sum of all USB frames associated with an USB transfer. In case of control transfers the value returned does not include the length of the SETUP packet, 8 bytes, which is part of frame zero. @@ -401,7 +401,7 @@ The callback type is defined by libusb20_tr_callback_t. . .Fn libusb20_tr_set_flags is used to set various USB flags for the given USB transfer. -.Bl -tag +.Bl -tag -width "LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK" .It LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK Report a short frame as error. .It LIBUSB20_TRANSFER_MULTI_SHORT_NOT_OK @@ -709,13 +709,14 @@ This function returns zero if the device is still connected else a LIBUSB20_ERRO sets the power mode of the USB device. . Valid power modes: -.Bl -tag +.Bl -tag -width "LIBUSB20_POWER_OFF" .It LIBUSB20_POWER_OFF .It LIBUSB20_POWER_ON .It LIBUSB20_POWER_SAVE .It LIBUSB20_POWER_SUSPEND .It LIBUSB20_POWER_RESUME .El +.Pp . This function returns zero on success else a LIBUSB20_ERROR value is returned. @@ -793,7 +794,7 @@ Valid bus numbers start at zero. returns the current operation mode of the USB entity. . Valid return values are: -.Bl -tag +.Bl -tag -width "LIBUSB20_MODE_DEVICE" .It LIBUSB20_MODE_HOST .It LIBUSB20_MODE_DEVICE .El @@ -803,7 +804,7 @@ Valid return values are: .Fn libusb20_dev_get_speed returns the current speed of the given USB device. . -.Bl -tag +.Bl -tag -width "LIBUSB20_SPEED_VARIABLE" .It LIBUSB20_SPEED_UNKNOWN .It LIBUSB20_SPEED_LOW .It LIBUSB20_SPEED_FULL @@ -815,7 +816,7 @@ returns the current speed of the given USB device. .Pp . .Fn libusb20_dev_get_config_index -This function returns the currently select config index for the given +returns the currently selected config index for the given USB device. . .Pp @@ -832,7 +833,7 @@ will set the debug level for the given USB device. .Pp . .Fn libusb20_dev_wait_process -function will wait until a pending USB transfer has completed on +will wait until a pending USB transfer has completed on the given USB device. . A timeout value can be specified which is passed on to the @@ -866,7 +867,7 @@ returned. .Pp . .Fn libusb20_be_get_dev_quirk -This function will return the device quirk according to +will return the device quirk according to .Fa index into the libusb20_quirk structure pointed to by .Fa pq . @@ -948,7 +949,7 @@ Dequeued USB devices will not be freed when the backend is freed. .Pp . .Fn libusb20_be_enqueue_device -This function will enqueue the given USB device pointer in the backend USB device list. +will enqueue the given USB device pointer in the backend USB device list. . Enqueued USB devices will get freed when the backend is freed. . diff --git a/lib/libusbhid/parse.c b/lib/libusbhid/parse.c index f7c2cb195be..041e2899999 100644 --- a/lib/libusbhid/parse.c +++ b/lib/libusbhid/parse.c @@ -392,7 +392,7 @@ hid_get_item(hid_data_t s, hid_item_t *h) s->loc_size = dval & mask; break; case 8: - hid_switch_rid(s, c, dval); + hid_switch_rid(s, c, dval & mask); break; case 9: /* mask because value is unsigned */ diff --git a/lib/libutil/Makefile b/lib/libutil/Makefile index 3136a050d5e..413ba0bfd0c 100644 --- a/lib/libutil/Makefile +++ b/lib/libutil/Makefile @@ -25,14 +25,13 @@ CFLAGS+= -DINET6 CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../libc/gen/ -MAN+= auth.3 expand_number.3 flopen.3 fparseln.3 hexdump.3 \ +MAN+= expand_number.3 flopen.3 fparseln.3 hexdump.3 \ humanize_number.3 kinfo_getallproc.3 kinfo_getfile.3 \ kinfo_getproc.3 kinfo_getvmmap.3 kld.3 login_auth.3 login_cap.3 \ login_class.3 login_ok.3 login_times.3 login_tty.3 pidfile.3 \ property.3 pty.3 quotafile.3 realhostname.3 realhostname_sa.3 \ _secure_path.3 trimdomain.3 uucplock.3 -MAN+= auth.conf.5 login.conf.5 -MLINKS+= auth.3 auth_getval.3 +MAN+= login.conf.5 MLINKS+= kld.3 kld_isloaded.3 kld.3 kld_load.3 MLINKS+=login_auth.3 auth_cat.3 login_auth.3 auth_checknologin.3 MLINKS+=login_cap.3 login_close.3 login_cap.3 login_getcapbool.3 \ diff --git a/lib/libutil/auth.3 b/lib/libutil/auth.3 deleted file mode 100644 index 247a0985914..00000000000 --- a/lib/libutil/auth.3 +++ /dev/null @@ -1,56 +0,0 @@ -.\" -.\" Copyright (c) 1998 Jordan Hubbard -.\" -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" " -.Dd October 7, 1998 -.Dt AUTH_GETVAL 3 -.Os -.Sh NAME -.Nm auth_getval -.Nd functions for reading values from -.Pa /etc/auth.conf -.Sh LIBRARY -.Lb libutil -.Sh SYNOPSIS -.In sys/types.h -.In libutil.h -.Ft char * -.Fn auth_getval "const char *name" -.Sh DESCRIPTION -The function -.Fn auth_getval -returns the value associated with the field called -.Fa name -or NULL if no such field is found or the auth file cannot be opened. -.Sh FILES -.Pa /etc/auth.conf -contains the name=value pairs looked up by -.Fn auth_getval . -.Sh SEE ALSO -.Xr properties_free 3 , -.Xr properties_read 3 , -.Xr property_find 3 , -.Xr auth.conf 5 diff --git a/lib/libutil/auth.c b/lib/libutil/auth.c index 748c3ad84bd..b57a784dc5e 100644 --- a/lib/libutil/auth.c +++ b/lib/libutil/auth.c @@ -31,40 +31,14 @@ #include __FBSDID("$FreeBSD$"); -#include -#include +#include + #include -#include -#include -#include - -static properties P; - -static int -initauthconf(const char *path) -{ - int fd; - - if (!P) { - if ((fd = open(path, O_RDONLY)) < 0) { - syslog(LOG_ERR, "initauthconf: unable to open file: %s", path); - return 1; - } - P = properties_read(fd); - close(fd); - if (!P) { - syslog(LOG_ERR, "initauthconf: unable to parse file: %s", path); - return 1; - } - } - return 0; -} char * auth_getval(const char *name) { - if (!P && initauthconf(_PATH_AUTHCONF)) - return NULL; - else - return property_find(P, name); + + (void)name; + return (NULL); } diff --git a/lib/libutil/auth.conf.5 b/lib/libutil/auth.conf.5 deleted file mode 100644 index be10eb85fdf..00000000000 --- a/lib/libutil/auth.conf.5 +++ /dev/null @@ -1,35 +0,0 @@ -.\" Copyright (c) 1998 Jordan Hubbard -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, is permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice immediately at the beginning of the file, without modification, -.\" this list of conditions, and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" $FreeBSD$ -.\" -.Dd October 7, 1998 -.Dt AUTH.CONF 5 -.Os -.Sh NAME -.Nm auth.conf -.Nd authentication capability database -.Sh SYNOPSIS -.Pa /etc/auth.conf -.Sh DESCRIPTION -.Nm -contains various attributes important to the authentication -code, most notably -.Xr crypt 3 -for the time being. -This documentation will be updated as the -.Pa /etc/auth.conf -file, which is very new, evolves. -.Sh SEE ALSO -.Xr auth_getval 3 , -.Xr crypt 3 diff --git a/lib/libutil/login.conf.5 b/lib/libutil/login.conf.5 index a272073f67e..a07e1f03e0d 100644 --- a/lib/libutil/login.conf.5 +++ b/lib/libutil/login.conf.5 @@ -209,7 +209,8 @@ value. The syntax is the same as for the .Fl l argument of -.Xr cpuset 1 or the word +.Xr cpuset 1 +or the word .Ql default . If set to .Ql default @@ -266,9 +267,11 @@ The backoff delay is the number of tries above multiplied by 5 seconds. .It "login-retries number 10 The number of login attempts" allowed before the login fails. -.It "passwd_format string md5 The encryption format that new or" +.It "passwd_format string sha512 The encryption format that new or" changed passwords will use. -Valid values include "des", "md5" and "blf". +Valid values include "des", "md5", "blf", "sha256" and "sha512"; see +.Xr crypt 3 +for details. NIS clients using a .No non- Ns Fx NIS server should probably use "des". diff --git a/lib/libutil/property.3 b/lib/libutil/property.3 index efe0079f07f..3d4011463a7 100644 --- a/lib/libutil/property.3 +++ b/lib/libutil/property.3 @@ -90,8 +90,6 @@ are desired, the entire value should be enclosed in { } (curly-bracket) characters. Any line beginning with a # or ; character is assumed to be a comment and will be ignored. -.Sh SEE ALSO -.Xr auth_getval 3 .Sh AUTHORS .An Jordan Hubbard .Sh BUGS diff --git a/lib/libutil/pw_util.c b/lib/libutil/pw_util.c index 63c63de81aa..4bf3001ffe7 100644 --- a/lib/libutil/pw_util.c +++ b/lib/libutil/pw_util.c @@ -437,14 +437,21 @@ pw_copy(int ffd, int tfd, const struct passwd *pw, struct passwd *old_pw) size_t len; int eof, readlen; - spw = pw; + if (old_pw == NULL && pw == NULL) + return (-1); + + spw = old_pw; + /* deleting a user */ if (pw == NULL) { line = NULL; - if (old_pw == NULL) + } else { + if ((line = pw_make(pw)) == NULL) return (-1); - spw = old_pw; - } else if ((line = pw_make(pw)) == NULL) - return (-1); + } + + /* adding a user */ + if (spw == NULL) + spw = pw; eof = 0; len = 0; @@ -511,7 +518,7 @@ pw_copy(int ffd, int tfd, const struct passwd *pw, struct passwd *old_pw) */ *q = t; - if (fpw == NULL || fpw->pw_uid != spw->pw_uid) { + if (fpw == NULL || strcmp(fpw->pw_name, spw->pw_name) != 0) { /* nope */ if (fpw != NULL) free(fpw); diff --git a/lib/libz/ChangeLog b/lib/libz/ChangeLog index f310bb0fcdb..c2c643a1a9b 100644 --- a/lib/libz/ChangeLog +++ b/lib/libz/ChangeLog @@ -1,12 +1,213 @@ ChangeLog file for zlib +Changes in 1.2.7 (2 May 2012) +- Replace use of memmove() with a simple copy for portability +- Test for existence of strerror +- Restore gzgetc_ for backward compatibility with 1.2.6 +- Fix build with non-GNU make on Solaris +- Require gcc 4.0 or later on Mac OS X to use the hidden attribute +- Include unistd.h for Watcom C +- Use __WATCOMC__ instead of __WATCOM__ +- Do not use the visibility attribute if NO_VIZ defined +- Improve the detection of no hidden visibility attribute +- Avoid using __int64 for gcc or solo compilation +- Cast to char * in gzprintf to avoid warnings [Zinser] +- Fix make_vms.com for VAX [Zinser] +- Don't use library or built-in byte swaps +- Simplify test and use of gcc hidden attribute +- Fix bug in gzclose_w() when gzwrite() fails to allocate memory +- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen() +- Fix bug in test/minigzip.c for configure --solo +- Fix contrib/vstudio project link errors [Mohanathas] +- Add ability to choose the builder in make_vms.com [Schweda] +- Add DESTDIR support to mingw32 win32/Makefile.gcc +- Fix comments in win32/Makefile.gcc for proper usage +- Allow overriding the default install locations for cmake +- Generate and install the pkg-config file with cmake +- Build both a static and a shared version of zlib with cmake +- Include version symbols for cmake builds +- If using cmake with MSVC, add the source directory to the includes +- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta] +- Move obsolete emx makefile to old [Truta] +- Allow the use of -Wundef when compiling or using zlib +- Avoid the use of the -u option with mktemp +- Improve inflate() documentation on the use of Z_FINISH +- Recognize clang as gcc +- Add gzopen_w() in Windows for wide character path names +- Rename zconf.h in CMakeLists.txt to move it out of the way +- Add source directory in CMakeLists.txt for building examples +- Look in build directory for zlib.pc in CMakeLists.txt +- Remove gzflags from zlibvc.def in vc9 and vc10 +- Fix contrib/minizip compilation in the MinGW environment +- Update ./configure for Solaris, support --64 [Mooney] +- Remove -R. from Solaris shared build (possible security issue) +- Avoid race condition for parallel make (-j) running example +- Fix type mismatch between get_crc_table() and crc_table +- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler] +- Fix the path to zlib.map in CMakeLists.txt +- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe] +- Add instructions to win32/Makefile.gcc for shared install [Torri] + +Changes in 1.2.6.1 (12 Feb 2012) +- Avoid the use of the Objective-C reserved name "id" +- Include io.h in gzguts.h for Microsoft compilers +- Fix problem with ./configure --prefix and gzgetc macro +- Include gz_header definition when compiling zlib solo +- Put gzflags() functionality back in zutil.c +- Avoid library header include in crc32.c for Z_SOLO +- Use name in GCC_CLASSIC as C compiler for coverage testing, if set +- Minor cleanup in contrib/minizip/zip.c [Vollant] +- Update make_vms.com [Zinser] +- Remove unnecessary gzgetc_ function +- Use optimized byte swap operations for Microsoft and GNU [Snyder] +- Fix minor typo in zlib.h comments [Rzesniowiecki] + +Changes in 1.2.6 (29 Jan 2012) +- Update the Pascal interface in contrib/pascal +- Fix function numbers for gzgetc_ in zlibvc.def files +- Fix configure.ac for contrib/minizip [Schiffer] +- Fix large-entry detection in minizip on 64-bit systems [Schiffer] +- Have ./configure use the compiler return code for error indication +- Fix CMakeLists.txt for cross compilation [McClure] +- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes] +- Fix compilation of contrib/minizip on FreeBSD [Marquez] +- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath] +- Include io.h for Turbo C / Borland C on all platforms [Truta] +- Make version explicit in contrib/minizip/configure.ac [Bosmans] +- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant] +- Minor cleanup up contrib/minizip/unzip.c [Vollant] +- Fix bug when compiling minizip with C++ [Vollant] +- Protect for long name and extra fields in contrib/minizip [Vollant] +- Avoid some warnings in contrib/minizip [Vollant] +- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip +- Add missing libs to minizip linker command +- Add support for VPATH builds in contrib/minizip +- Add an --enable-demos option to contrib/minizip/configure +- Add the generation of configure.log by ./configure +- Exit when required parameters not provided to win32/Makefile.gcc +- Have gzputc return the character written instead of the argument +- Use the -m option on ldconfig for BSD systems [Tobias] +- Correct in zlib.map when deflateResetKeep was added + +Changes in 1.2.5.3 (15 Jan 2012) +- Restore gzgetc function for binary compatibility +- Do not use _lseeki64 under Borland C++ [Truta] +- Update win32/Makefile.msc to build test/*.c [Truta] +- Remove old/visualc6 given CMakefile and other alternatives +- Update AS400 build files and documentation [Monnerat] +- Update win32/Makefile.gcc to build test/*.c [Truta] +- Permit stronger flushes after Z_BLOCK flushes +- Avoid extraneous empty blocks when doing empty flushes +- Permit Z_NULL arguments to deflatePending +- Allow deflatePrime() to insert bits in the middle of a stream +- Remove second empty static block for Z_PARTIAL_FLUSH +- Write out all of the available bits when using Z_BLOCK +- Insert the first two strings in the hash table after a flush + +Changes in 1.2.5.2 (17 Dec 2011) +- fix ld error: unable to find version dependency 'ZLIB_1.2.5' +- use relative symlinks for shared libs +- Avoid searching past window for Z_RLE strategy +- Assure that high-water mark initialization is always applied in deflate +- Add assertions to fill_window() in deflate.c to match comments +- Update python link in README +- Correct spelling error in gzread.c +- Fix bug in gzgets() for a concatenated empty gzip stream +- Correct error in comment for gz_make() +- Change gzread() and related to ignore junk after gzip streams +- Allow gzread() and related to continue after gzclearerr() +- Allow gzrewind() and gzseek() after a premature end-of-file +- Simplify gzseek() now that raw after gzip is ignored +- Change gzgetc() to a macro for speed (~40% speedup in testing) +- Fix gzclose() to return the actual error last encountered +- Always add large file support for windows +- Include zconf.h for windows large file support +- Include zconf.h.cmakein for windows large file support +- Update zconf.h.cmakein on make distclean +- Merge vestigial vsnprintf determination from zutil.h to gzguts.h +- Clarify how gzopen() appends in zlib.h comments +- Correct documentation of gzdirect() since junk at end now ignored +- Add a transparent write mode to gzopen() when 'T' is in the mode +- Update python link in zlib man page +- Get inffixed.h and MAKEFIXED result to match +- Add a ./config --solo option to make zlib subset with no libary use +- Add undocumented inflateResetKeep() function for CAB file decoding +- Add --cover option to ./configure for gcc coverage testing +- Add #define ZLIB_CONST option to use const in the z_stream interface +- Add comment to gzdopen() in zlib.h to use dup() when using fileno() +- Note behavior of uncompress() to provide as much data as it can +- Add files in contrib/minizip to aid in building libminizip +- Split off AR options in Makefile.in and configure +- Change ON macro to Z_ARG to avoid application conflicts +- Facilitate compilation with Borland C++ for pragmas and vsnprintf +- Include io.h for Turbo C / Borland C++ +- Move example.c and minigzip.c to test/ +- Simplify incomplete code table filling in inflate_table() +- Remove code from inflate.c and infback.c that is impossible to execute +- Test the inflate code with full coverage +- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw) +- Add deflateResetKeep and fix inflateResetKeep to retain dictionary +- Fix gzwrite.c to accommodate reduced memory zlib compilation +- Have inflate() with Z_FINISH avoid the allocation of a window +- Do not set strm->adler when doing raw inflate +- Fix gzeof() to behave just like feof() when read is not past end of file +- Fix bug in gzread.c when end-of-file is reached +- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF +- Document gzread() capability to read concurrently written files +- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo] + +Changes in 1.2.5.1 (10 Sep 2011) +- Update FAQ entry on shared builds (#13) +- Avoid symbolic argument to chmod in Makefile.in +- Fix bug and add consts in contrib/puff [Oberhumer] +- Update contrib/puff/zeros.raw test file to have all block types +- Add full coverage test for puff in contrib/puff/Makefile +- Fix static-only-build install in Makefile.in +- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno] +- Add libz.a dependency to shared in Makefile.in for parallel builds +- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out +- Replace $(...) with `...` in configure for non-bash sh [Bowler] +- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen] +- Add solaris* to Linux* in configure to allow gcc use [Groffen] +- Add *bsd* to Linux* case in configure [Bar-Lev] +- Add inffast.obj to dependencies in win32/Makefile.msc +- Correct spelling error in deflate.h [Kohler] +- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc +- Add test to configure for GNU C looking for gcc in output of $cc -v +- Add zlib.pc generation to win32/Makefile.gcc [Weigelt] +- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not +- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense +- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser) +- Make stronger test in zconf.h to include unistd.h for LFS +- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack] +- Fix zlib.h LFS support when Z_PREFIX used +- Add updated as400 support (removed from old) [Monnerat] +- Avoid deflate sensitivity to volatile input data +- Avoid division in adler32_combine for NO_DIVIDE +- Clarify the use of Z_FINISH with deflateBound() amount of space +- Set binary for output file in puff.c +- Use u4 type for crc_table to avoid conversion warnings +- Apply casts in zlib.h to avoid conversion warnings +- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller] +- Improve inflateSync() documentation to note indeterminancy +- Add deflatePending() function to return the amount of pending output +- Correct the spelling of "specification" in FAQ [Randers-Pehrson] +- Add a check in configure for stdarg.h, use for gzprintf() +- Check that pointers fit in ints when gzprint() compiled old style +- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler] +- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt] +- Add debug records in assmebler code [Londer] +- Update RFC references to use http://tools.ietf.org/html/... [Li] +- Add --archs option, use of libtool to configure for Mac OS X [Borstel] + Changes in 1.2.5 (19 Apr 2010) - Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] - Default to libdir as sharedlibdir in configure [Nieder] - Update copyright dates on modified source files - Update trees.c to be able to generate modified trees.h - Exit configure for MinGW, suggesting win32/Makefile.gcc +- Check for NULL path in gz_open [Homurlu] Changes in 1.2.4.5 (18 Apr 2010) - Set sharedlibdir in configure [Torok] @@ -261,7 +462,7 @@ Changes in 1.2.3.4 (21 Dec 2009) - Clear bytes after deflate lookahead to avoid use of uninitialized data - Change a limit in inftrees.c to be more transparent to Coverity Prevent - Update win32/zlib.def with exported symbols from zlib.h -- Correct spelling error in zlib.h [Willem] +- Correct spelling errors in zlib.h [Willem, Sobrado] - Allow Z_BLOCK for deflate() to force a new block - Allow negative bits in inflatePrime() to delete existing bit buffer - Add Z_TREES flush option to inflate() to return at end of trees diff --git a/lib/libz/FAQ b/lib/libz/FAQ index 1a22750a58e..99b7cf92e45 100644 --- a/lib/libz/FAQ +++ b/lib/libz/FAQ @@ -44,8 +44,8 @@ The lastest zlib FAQ is at http://zlib.net/zlib_faq.html 6. Where's the zlib documentation (man pages, etc.)? - It's in zlib.h . Examples of zlib usage are in the files example.c and - minigzip.c, with more in examples/ . + It's in zlib.h . Examples of zlib usage are in the files test/example.c + and test/minigzip.c, with more in examples/ . 7. Why don't you use GNU autoconf or libtool or ...? @@ -84,8 +84,10 @@ The lastest zlib FAQ is at http://zlib.net/zlib_faq.html 13. How can I make a Unix shared library? - make clean - ./configure -s + By default a shared (and a static) library is built for Unix. So: + + make distclean + ./configure make 14. How do I install a shared zlib library on Unix? @@ -325,7 +327,7 @@ The lastest zlib FAQ is at http://zlib.net/zlib_faq.html correctly points to the zlib specification in RFC 1950 for the "deflate" transfer encoding, there have been reports of servers and browsers that incorrectly produce or expect raw deflate data per the deflate - specficiation in RFC 1951, most notably Microsoft. So even though the + specification in RFC 1951, most notably Microsoft. So even though the "deflate" transfer encoding using the zlib format would be the more efficient approach (and in fact exactly what the zlib format was designed for), using the "gzip" transfer encoding is probably more reliable due to diff --git a/lib/libz/FREEBSD-upgrade b/lib/libz/FREEBSD-upgrade index 4ee4eebedb6..d2d251b0cdf 100644 --- a/lib/libz/FREEBSD-upgrade +++ b/lib/libz/FREEBSD-upgrade @@ -1,4 +1,4 @@ -$FreeBSD$ +$FreeBSD: head/lib/libz/FREEBSD-upgrade 146082 2005-05-11 03:50:50Z kientzle $ ZLib 1.2.2 diff --git a/lib/libz/Makefile b/lib/libz/Makefile index e373e834cbf..4ecb022c9a7 100644 --- a/lib/libz/Makefile +++ b/lib/libz/Makefile @@ -1,5 +1,5 @@ # -# $FreeBSD$ +# $FreeBSD: head/lib/libz/Makefile 232263 2012-02-28 18:30:18Z dim $ # LIB= z @@ -35,12 +35,12 @@ SRCS+= uncompr.c SRCS+= zopen.c SRCS+= zutil.c -.if ${MACHINE_ARCH} == "i386" && ${MACHINE_CPU:M*i686*} -.PATH: ${.CURDIR}/contrib/asm686 -SRCS+= match.S -CFLAGS+= -DASMV -DNO_UNDERLINE -ACFLAGS+= -Wa,--noexecstack -.endif +#.if ${MACHINE_ARCH} == "i386" && ${MACHINE_CPU:M*i686*} +#.PATH: ${.CURDIR}/contrib/asm686 +#SRCS+= match.S +#CFLAGS+= -DASMV -DNO_UNDERLINE +#ACFLAGS+= -Wa,--noexecstack +#.endif #.if ${MACHINE_ARCH} == "amd64" #.PATH: ${.CURDIR}/contrib/gcc_gvmat64 diff --git a/lib/libz/README b/lib/libz/README index d4219bf889f..6f1255ffe48 100644 --- a/lib/libz/README +++ b/lib/libz/README @@ -1,22 +1,22 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.5 is a general purpose data compression library. All the code is +zlib 1.2.7 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files -http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) -and rfc1952.txt (gzip format). +http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and +rfc1952 (gzip format). All functions of the compression library are documented in the file zlib.h (volunteer to write man pages welcome, contact zlib@gzip.org). A usage example -of the library is given in the file example.c which also tests that the library -is working correctly. Another example is given in the file minigzip.c. The -compression library itself is composed of all source files except example.c and -minigzip.c. +of the library is given in the file test/example.c which also tests that +the library is working correctly. Another example is given in the file +test/minigzip.c. The compression library itself is composed of all source +files in the root directory. To compile all files and run the test program, follow the instructions given at the top of Makefile.in. In short "./configure; make test", and if that goes -well, "make install" should work for most flavors of Unix. For Windows, use one -of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use +well, "make install" should work for most flavors of Unix. For Windows, use +one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use make_vms.com. Questions about zlib should be sent to , or to Gilles Vollant @@ -31,7 +31,7 @@ Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available at http://marknelson.us/1997/01/01/zlib-engine/ . -The changes made in version 1.2.5 are documented in the file ChangeLog. +The changes made in version 1.2.7 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory contrib/ . @@ -44,7 +44,7 @@ http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see -http://www.python.org/doc/lib/module-zlib.html . +http://docs.python.org/library/zlib.html . zlib is built into tcl: http://wiki.tcl.tk/4610 . @@ -84,7 +84,7 @@ Acknowledgments: Copyright notice: - (C) 1995-2010 Jean-loup Gailly and Mark Adler + (C) 1995-2012 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/lib/libz/Symbol.map b/lib/libz/Symbol.map index 2651efc70fa..c9eef6f979d 100644 --- a/lib/libz/Symbol.map +++ b/lib/libz/Symbol.map @@ -1,7 +1,14 @@ /* - * $FreeBSD$ + * $FreeBSD: head/lib/libz/Symbol.map 206709 2010-04-16 20:07:24Z delphij $ */ +ZLIB_1.2.7.0 { + deflatePending; + deflateResetKeep; + gzgetc_; + inflateResetKeep; +}; + ZLIB_1.2.4.0 { adler32; adler32_combine; diff --git a/lib/libz/Versions.def b/lib/libz/Versions.def index fe413a4711f..a5aeb28e19d 100644 --- a/lib/libz/Versions.def +++ b/lib/libz/Versions.def @@ -1,8 +1,11 @@ -# $FreeBSD$ +# $FreeBSD: head/lib/libz/Versions.def 205486 2010-03-22 22:12:27Z delphij $ ZLIB_1.2.4.0 { }; +ZLIB_1.2.7.0 { +} ZLIB_1.2.4.0; + FBSD_1.2 { } ZLIB_1.2.4.0; diff --git a/lib/libz/adler32.c b/lib/libz/adler32.c index 65ad6a5adc4..a868f073d8a 100644 --- a/lib/libz/adler32.c +++ b/lib/libz/adler32.c @@ -1,5 +1,5 @@ /* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2007 Mark Adler + * Copyright (C) 1995-2011 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,9 +9,9 @@ #define local static -local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2); +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); -#define BASE 65521UL /* largest prime smaller than 65536 */ +#define BASE 65521 /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ @@ -21,39 +21,44 @@ local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2); #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO16(buf) DO8(buf,0); DO8(buf,8); -/* use NO_DIVIDE if your processor does not do division in hardware */ +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ #ifdef NO_DIVIDE -# define MOD(a) \ +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ do { \ - if (a >= (BASE << 16)) a -= (BASE << 16); \ - if (a >= (BASE << 15)) a -= (BASE << 15); \ - if (a >= (BASE << 14)) a -= (BASE << 14); \ - if (a >= (BASE << 13)) a -= (BASE << 13); \ - if (a >= (BASE << 12)) a -= (BASE << 12); \ - if (a >= (BASE << 11)) a -= (BASE << 11); \ - if (a >= (BASE << 10)) a -= (BASE << 10); \ - if (a >= (BASE << 9)) a -= (BASE << 9); \ - if (a >= (BASE << 8)) a -= (BASE << 8); \ - if (a >= (BASE << 7)) a -= (BASE << 7); \ - if (a >= (BASE << 6)) a -= (BASE << 6); \ - if (a >= (BASE << 5)) a -= (BASE << 5); \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ if (a >= BASE) a -= BASE; \ } while (0) -# define MOD4(a) \ +# define MOD(a) \ do { \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ + CHOP(a); \ + MOD28(a); \ + } while (0) +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ if (a >= BASE) a -= BASE; \ } while (0) #else # define MOD(a) a %= BASE -# define MOD4(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE #endif /* ========================================================================= */ @@ -92,7 +97,7 @@ uLong ZEXPORT adler32(adler, buf, len) } if (adler >= BASE) adler -= BASE; - MOD4(sum2); /* only added so many BASE's */ + MOD28(sum2); /* only added so many BASE's */ return adler | (sum2 << 16); } @@ -137,8 +142,13 @@ local uLong adler32_combine_(adler1, adler2, len2) unsigned long sum2; unsigned rem; + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + /* the derivation of this formula is left as an exercise for the reader */ - rem = (unsigned)(len2 % BASE); + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; sum1 = adler1 & 0xffff; sum2 = rem * sum1; MOD(sum2); diff --git a/lib/libz/contrib/asm686/match.S b/lib/libz/contrib/asm686/match.S index 06817e1dd08..fa421092785 100644 --- a/lib/libz/contrib/asm686/match.S +++ b/lib/libz/contrib/asm686/match.S @@ -83,17 +83,25 @@ .text /* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */ +.cfi_sections .debug_frame longest_match: +.cfi_startproc /* Save registers that the compiler may be using, and adjust %esp to */ /* make room for our stack frame. */ pushl %ebp + .cfi_def_cfa_offset 8 + .cfi_offset ebp, -8 pushl %edi + .cfi_def_cfa_offset 12 pushl %esi + .cfi_def_cfa_offset 16 pushl %ebx + .cfi_def_cfa_offset 20 subl $LocalVarsSize, %esp + .cfi_def_cfa_offset LocalVarsSize+20 /* Retrieve the function arguments. %ecx will hold cur_match */ /* throughout the entire function. %edx will hold the pointer to the */ @@ -108,7 +116,7 @@ longest_match: /* if (s->prev_length >= s->good_match) { */ /* chain_length >>= 2; */ /* } */ - + movl dsPrevLen(%edx), %eax movl dsGoodMatch(%edx), %ebx cmpl %ebx, %eax @@ -336,8 +344,14 @@ LookaheadRet: /* Restore the stack and return from whence we came. */ addl $LocalVarsSize, %esp + .cfi_def_cfa_offset 20 popl %ebx + .cfi_def_cfa_offset 16 popl %esi + .cfi_def_cfa_offset 12 popl %edi + .cfi_def_cfa_offset 8 popl %ebp + .cfi_def_cfa_offset 4 +.cfi_endproc match_init: ret diff --git a/lib/libz/crc32.c b/lib/libz/crc32.c index 91be372d224..979a7190a3c 100644 --- a/lib/libz/crc32.c +++ b/lib/libz/crc32.c @@ -1,5 +1,5 @@ /* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010 Mark Adler + * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster @@ -17,6 +17,8 @@ of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should first call get_crc_table() to initialize the tables before allowing more than one thread to use crc32(). + + DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. */ #ifdef MAKECRCH @@ -30,31 +32,11 @@ #define local static -/* Find a four-byte integer type for crc32_little() and crc32_big(). */ -#ifndef NOBYFOUR -# ifdef STDC /* need ANSI C limits.h to determine sizes */ -# include -# define BYFOUR -# if (UINT_MAX == 0xffffffffUL) - typedef unsigned int u4; -# else -# if (ULONG_MAX == 0xffffffffUL) - typedef unsigned long u4; -# else -# if (USHRT_MAX == 0xffffffffUL) - typedef unsigned short u4; -# else -# undef BYFOUR /* can't find a four-byte integer type! */ -# endif -# endif -# endif -# endif /* STDC */ -#endif /* !NOBYFOUR */ - /* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif #ifdef BYFOUR -# define REV(w) ((((w)>>24)&0xff)+(((w)>>8)&0xff00)+ \ - (((w)&0xff00)<<8)+(((w)&0xff)<<24)) local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); local unsigned long crc32_big OF((unsigned long, @@ -68,16 +50,16 @@ local unsigned long gf2_matrix_times OF((unsigned long *mat, unsigned long vec)); local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); -local uLong crc32_combine_(uLong crc1, uLong crc2, z_off64_t len2); +local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); #ifdef DYNAMIC_CRC_TABLE local volatile int crc_table_empty = 1; -local unsigned long FAR crc_table[TBLS][256]; +local z_crc_t FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH - local void write_table OF((FILE *, const unsigned long FAR *)); + local void write_table OF((FILE *, const z_crc_t FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: @@ -107,9 +89,9 @@ local void make_crc_table OF((void)); */ local void make_crc_table() { - unsigned long c; + z_crc_t c; int n, k; - unsigned long poly; /* polynomial exclusive-or pattern */ + z_crc_t poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static volatile int first = 1; /* flag to limit concurrent making */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; @@ -121,13 +103,13 @@ local void make_crc_table() first = 0; /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0UL; - for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) - poly |= 1UL << (31 - p[n]); + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (z_crc_t)1 << (31 - p[n]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { - c = (unsigned long)n; + c = (z_crc_t)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; @@ -138,11 +120,11 @@ local void make_crc_table() and then the byte reversal of those as well as the first table */ for (n = 0; n < 256; n++) { c = crc_table[0][n]; - crc_table[4][n] = REV(c); + crc_table[4][n] = ZSWAP32(c); for (k = 1; k < 4; k++) { c = crc_table[0][c & 0xff] ^ (c >> 8); crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); + crc_table[k + 4][n] = ZSWAP32(c); } } #endif /* BYFOUR */ @@ -164,7 +146,7 @@ local void make_crc_table() if (out == NULL) return; fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const unsigned long FAR "); + fprintf(out, "local const z_crc_t FAR "); fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR @@ -184,12 +166,13 @@ local void make_crc_table() #ifdef MAKECRCH local void write_table(out, table) FILE *out; - const unsigned long FAR *table; + const z_crc_t FAR *table; { int n; for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + (unsigned long)(table[n]), n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); } #endif /* MAKECRCH */ @@ -204,13 +187,13 @@ local void write_table(out, table) /* ========================================================================= * This function can be used by asm versions of crc32() */ -const unsigned long FAR * ZEXPORT get_crc_table() +const z_crc_t FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ - return (const unsigned long FAR *)crc_table; + return (const z_crc_t FAR *)crc_table; } /* ========================================================================= */ @@ -232,7 +215,7 @@ unsigned long ZEXPORT crc32(crc, buf, len) #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { - u4 endian; + z_crc_t endian; endian = 1; if (*((unsigned char *)(&endian))) @@ -266,17 +249,17 @@ local unsigned long crc32_little(crc, buf, len) const unsigned char FAR *buf; unsigned len; { - register u4 c; - register const u4 FAR *buf4; + register z_crc_t c; + register const z_crc_t FAR *buf4; - c = (u4)crc; + c = (z_crc_t)crc; c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); len--; } - buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; while (len >= 32) { DOLIT32; len -= 32; @@ -306,17 +289,17 @@ local unsigned long crc32_big(crc, buf, len) const unsigned char FAR *buf; unsigned len; { - register u4 c; - register const u4 FAR *buf4; + register z_crc_t c; + register const z_crc_t FAR *buf4; - c = REV((u4)crc); + c = ZSWAP32((z_crc_t)crc); c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); len--; } - buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; buf4--; while (len >= 32) { DOBIG32; @@ -333,7 +316,7 @@ local unsigned long crc32_big(crc, buf, len) c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; - return (unsigned long)(REV(c)); + return (unsigned long)(ZSWAP32(c)); } #endif /* BYFOUR */ diff --git a/lib/libz/crc32.h b/lib/libz/crc32.h index 8053b6117c0..9e0c7781025 100644 --- a/lib/libz/crc32.h +++ b/lib/libz/crc32.h @@ -2,7 +2,7 @@ * Generated automatically by crc32.c */ -local const unsigned long FAR crc_table[TBLS][256] = +local const z_crc_t FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, diff --git a/lib/libz/deflate.c b/lib/libz/deflate.c index 5c4022f3d47..9e4c2cbc8af 100644 --- a/lib/libz/deflate.c +++ b/lib/libz/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -37,7 +37,7 @@ * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://www.ietf.org/rfc/rfc1951.txt + * Available in http://tools.ietf.org/html/rfc1951 * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler "; + " deflate 1.2.7 Copyright 1995-2012 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -155,6 +155,9 @@ local const config configuration_table[10] = { struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ #endif +/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ +#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) + /* =========================================================================== * Update a hash value with the given input byte * IN assertion: all calls to to UPDATE_HASH are made with consecutive @@ -235,10 +238,19 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; +#endif } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif #ifdef FASTEST if (level != 0) level = 1; @@ -314,43 +326,70 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) uInt dictLength; { deflate_state *s; - uInt length = dictLength; - uInt n; - IPos hash_head = 0; + uInt str, n; + int wrap; + unsigned avail; + unsigned char *next; - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || - strm->state->wrap == 2 || - (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) + return Z_STREAM_ERROR; + s = strm->state; + wrap = s->wrap; + if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) return Z_STREAM_ERROR; - s = strm->state; - if (s->wrap) + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap == 1) strm->adler = adler32(strm->adler, dictionary, dictLength); + s->wrap = 0; /* avoid computing Adler-32 in read_buf */ - if (length < MIN_MATCH) return Z_OK; - if (length > s->w_size) { - length = s->w_size; - dictionary += dictLength - length; /* use the tail of the dictionary */ + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s->w_size) { + if (wrap == 0) { /* already empty otherwise */ + CLEAR_HASH(s); + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + dictionary += dictLength - s->w_size; /* use the tail */ + dictLength = s->w_size; } - zmemcpy(s->window, dictionary, length); - s->strstart = length; - s->block_start = (long)length; - /* Insert all strings in the hash table (except for the last two bytes). - * s->lookahead stays null, so s->ins_h will be recomputed at the next - * call of fill_window. - */ - s->ins_h = s->window[0]; - UPDATE_HASH(s, s->ins_h, s->window[1]); - for (n = 0; n <= length - MIN_MATCH; n++) { - INSERT_STRING(s, n, hash_head); + /* insert dictionary into window and hash */ + avail = strm->avail_in; + next = strm->next_in; + strm->avail_in = dictLength; + strm->next_in = (Bytef *)dictionary; + fill_window(s); + while (s->lookahead >= MIN_MATCH) { + str = s->strstart; + n = s->lookahead - (MIN_MATCH-1); + do { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + } while (--n); + s->strstart = str; + s->lookahead = MIN_MATCH-1; + fill_window(s); } - if (hash_head) hash_head = 0; /* to make compiler happy */ + s->strstart += s->lookahead; + s->block_start = (long)s->strstart; + s->insert = s->lookahead; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + strm->next_in = next; + strm->avail_in = avail; + s->wrap = wrap; return Z_OK; } /* ========================================================================= */ -int ZEXPORT deflateReset (strm) +int ZEXPORT deflateResetKeep (strm) z_streamp strm; { deflate_state *s; @@ -380,11 +419,22 @@ int ZEXPORT deflateReset (strm) s->last_flush = Z_NO_FLUSH; _tr_init(s); - lm_init(s); return Z_OK; } +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + int ret; + + ret = deflateResetKeep(strm); + if (ret == Z_OK) + lm_init(strm->state); + return ret; +} + /* ========================================================================= */ int ZEXPORT deflateSetHeader (strm, head) z_streamp strm; @@ -396,15 +446,43 @@ int ZEXPORT deflateSetHeader (strm, head) return Z_OK; } +/* ========================================================================= */ +int ZEXPORT deflatePending (strm, pending, bits) + unsigned *pending; + int *bits; + z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (pending != Z_NULL) + *pending = strm->state->pending; + if (bits != Z_NULL) + *bits = strm->state->bi_valid; + return Z_OK; +} + /* ========================================================================= */ int ZEXPORT deflatePrime (strm, bits, value) z_streamp strm; int bits; int value; { + deflate_state *s; + int put; + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - strm->state->bi_valid = bits; - strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); + s = strm->state; + if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; + if (put > bits) + put = bits; + s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); + s->bi_valid += put; + _tr_flush_bits(s); + value >>= put; + bits -= put; + } while (bits); return Z_OK; } @@ -562,19 +640,22 @@ local void putShortMSB (s, b) local void flush_pending(strm) z_streamp strm; { - unsigned len = strm->state->pending; + unsigned len; + deflate_state *s = strm->state; + _tr_flush_bits(s); + len = s->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; - zmemcpy(strm->next_out, strm->state->pending_out, len); + zmemcpy(strm->next_out, s->pending_out, len); strm->next_out += len; - strm->state->pending_out += len; + s->pending_out += len; strm->total_out += len; strm->avail_out -= len; - strm->state->pending -= len; - if (strm->state->pending == 0) { - strm->state->pending_out = strm->state->pending_buf; + s->pending -= len; + if (s->pending == 0) { + s->pending_out = s->pending_buf; } } @@ -801,7 +882,7 @@ int ZEXPORT deflate (strm, flush) * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUF_ERROR. */ - } else if (strm->avail_in == 0 && flush <= old_flush && + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } @@ -850,6 +931,7 @@ int ZEXPORT deflate (strm, flush) if (s->lookahead == 0) { s->strstart = 0; s->block_start = 0L; + s->insert = 0; } } } @@ -945,12 +1027,12 @@ int ZEXPORT deflateCopy (dest, source) ss = source->state; - zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; - zmemcpy(ds, ss, sizeof(deflate_state)); + zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); @@ -966,8 +1048,8 @@ int ZEXPORT deflateCopy (dest, source) } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); - zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); - zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); @@ -1001,15 +1083,15 @@ local int read_buf(strm, buf, size) strm->avail_in -= len; + zmemcpy(buf, strm->next_in, len); if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, strm->next_in, len); + strm->adler = adler32(strm->adler, buf, len); } #ifdef GZIP else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, strm->next_in, len); + strm->adler = crc32(strm->adler, buf, len); } #endif - zmemcpy(buf, strm->next_in, len); strm->next_in += len; strm->total_in += len; @@ -1036,6 +1118,7 @@ local void lm_init (s) s->strstart = 0; s->block_start = 0L; s->lookahead = 0; + s->insert = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; @@ -1310,6 +1393,8 @@ local void fill_window(s) unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); @@ -1362,7 +1447,7 @@ local void fill_window(s) #endif more += wsize; } - if (s->strm->avail_in == 0) return; + if (s->strm->avail_in == 0) break; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && @@ -1381,12 +1466,24 @@ local void fill_window(s) s->lookahead += n; /* Initialize the hash value now that we have some input: */ - if (s->lookahead >= MIN_MATCH) { - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. @@ -1427,6 +1524,9 @@ local void fill_window(s) s->high_water += init; } } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); } /* =========================================================================== @@ -1506,8 +1606,14 @@ local block_state deflate_stored(s, flush) FLUSH_BLOCK(s, 0); } } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if ((long)s->strstart > s->block_start) + FLUSH_BLOCK(s, 0); + return block_done; } /* =========================================================================== @@ -1603,8 +1709,14 @@ local block_state deflate_fast(s, flush) } if (bflush) FLUSH_BLOCK(s, 0); } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } #ifndef FASTEST @@ -1728,8 +1840,14 @@ local block_state deflate_slow(s, flush) _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } #endif /* FASTEST */ @@ -1749,11 +1867,11 @@ local block_state deflate_rle(s, flush) for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes - * for the longest encodable run. + * for the longest run, plus one for the unrolled loop. */ - if (s->lookahead < MAX_MATCH) { + if (s->lookahead <= MAX_MATCH) { fill_window(s); - if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ @@ -1776,6 +1894,7 @@ local block_state deflate_rle(s, flush) if (s->match_length > s->lookahead) s->match_length = s->lookahead; } + Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ @@ -1796,8 +1915,14 @@ local block_state deflate_rle(s, flush) } if (bflush) FLUSH_BLOCK(s, 0); } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } /* =========================================================================== @@ -1829,6 +1954,12 @@ local block_state deflate_huff(s, flush) s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } diff --git a/lib/libz/deflate.h b/lib/libz/deflate.h index cbf0d1ea5d9..fbac44d908e 100644 --- a/lib/libz/deflate.h +++ b/lib/libz/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2010 Jean-loup Gailly + * Copyright (C) 1995-2012 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -48,6 +48,9 @@ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + #define INIT_STATE 42 #define EXTRA_STATE 69 #define NAME_STATE 73 @@ -188,7 +191,7 @@ typedef struct internal_state { int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ - /* Didn't use ct_data typedef below to supress compiler warning */ + /* Didn't use ct_data typedef below to suppress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ @@ -244,7 +247,7 @@ typedef struct internal_state { ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ uInt matches; /* number of string matches in current block */ - int last_eob_len; /* bit length of EOB code for last block */ + uInt insert; /* bytes at end of window left to insert */ #ifdef DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ @@ -294,6 +297,7 @@ void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); diff --git a/lib/libz/doc/algorithm.txt b/lib/libz/doc/algorithm.txt index 34960bddacc..c97f495020b 100644 --- a/lib/libz/doc/algorithm.txt +++ b/lib/libz/doc/algorithm.txt @@ -206,4 +206,4 @@ Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, pp. 337-343. ``DEFLATE Compressed Data Format Specification'' available in -http://www.ietf.org/rfc/rfc1951.txt +http://tools.ietf.org/html/rfc1951 diff --git a/lib/libz/gzguts.h b/lib/libz/gzguts.h index 0f8fb79f87d..ee3f281aa57 100644 --- a/lib/libz/gzguts.h +++ b/lib/libz/gzguts.h @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004, 2005, 2010 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -12,7 +12,7 @@ # endif #endif -#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +#ifdef HAVE_HIDDEN # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) #else # define ZLIB_INTERNAL @@ -27,13 +27,65 @@ #endif #include +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + #ifdef NO_DEFLATE /* for compatibility with old definition */ # define NO_GZCOMPRESS #endif -#ifdef _MSC_VER -# include -# define vsnprintf _vsnprintf +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif #endif #ifndef local @@ -52,7 +104,7 @@ # include # define zstrerror() gz_strwinerror((DWORD)GetLastError()) #else -# ifdef STDC +# ifndef NO_STRERROR # include # define zstrerror() strerror(errno) # else @@ -68,6 +120,13 @@ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); #endif +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + /* default i/o buffer size -- double this for output when reading */ #define GZBUFSIZE 8192 @@ -84,23 +143,25 @@ /* internal gzip file state data structure */ typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ /* used for both reading and writing */ int mode; /* see gzip modes above */ int fd; /* file descriptor */ char *path; /* path or fd for error messages */ - z_off64_t pos; /* current position in uncompressed data */ unsigned size; /* buffer size, zero if not allocated yet */ unsigned want; /* requested buffer size, default is GZBUFSIZE */ unsigned char *in; /* input buffer */ unsigned char *out; /* output buffer (double-sized when reading) */ - unsigned char *next; /* next output data to deliver or write */ + int direct; /* 0 if processing gzip, 1 if transparent */ /* just for reading */ - unsigned have; /* amount of output data unused at next */ - int eof; /* true if end of input file reached */ - z_off64_t start; /* where the gzip data started, for rewinding */ - z_off64_t raw; /* where the raw data started, for seeking */ int how; /* 0: get header, 1: copy, 2: decompress */ - int direct; /* true if last read direct, false if gzip */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ /* just for writing */ int level; /* compression level */ int strategy; /* compression strategy */ diff --git a/lib/libz/gzlib.c b/lib/libz/gzlib.c index 999455db7c4..33a8a5c72c6 100644 --- a/lib/libz/gzlib.c +++ b/lib/libz/gzlib.c @@ -1,5 +1,5 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004, 2010 Mark Adler + * Copyright (C) 2004, 2010, 2011, 2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -8,15 +8,19 @@ #include "gzguts.h" #include "zutil.h" +#if defined(_WIN32) && !defined(__BORLANDC__) +# define LSEEK _lseeki64 +#else #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 # define LSEEK lseek64 #else # define LSEEK lseek #endif +#endif /* Local functions */ local void gz_reset OF((gz_statep)); -local gzFile gz_open OF((const char *, int, const char *)); +local gzFile gz_open OF((const void *, int, const char *)); #if defined UNDER_CE @@ -74,25 +78,37 @@ char ZLIB_INTERNAL *gz_strwinerror (error) local void gz_reset(state) gz_statep state; { + state->x.have = 0; /* no output data available */ if (state->mode == GZ_READ) { /* for reading ... */ - state->have = 0; /* no output data available */ state->eof = 0; /* not at end of file */ + state->past = 0; /* have not read past end yet */ state->how = LOOK; /* look for gzip header */ - state->direct = 1; /* default for empty file */ } state->seek = 0; /* no seek request pending */ gz_error(state, Z_OK, NULL); /* clear error */ - state->pos = 0; /* no uncompressed data yet */ + state->x.pos = 0; /* no uncompressed data yet */ state->strm.avail_in = 0; /* no input data yet */ } /* Open a gzip file either by name or file descriptor. */ local gzFile gz_open(path, fd, mode) - const char *path; + const void *path; int fd; const char *mode; { gz_statep state; + size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif + + /* check input */ + if (path == NULL) + return NULL; /* allocate gzFile structure to return */ state = malloc(sizeof(gz_state)); @@ -106,6 +122,7 @@ local gzFile gz_open(path, fd, mode) state->mode = GZ_NONE; state->level = Z_DEFAULT_COMPRESSION; state->strategy = Z_DEFAULT_STRATEGY; + state->direct = 0; while (*mode) { if (*mode >= '0' && *mode <= '9') state->level = *mode - '0'; @@ -127,6 +144,16 @@ local gzFile gz_open(path, fd, mode) return NULL; case 'b': /* ignore -- will request binary anyway */ break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif case 'f': state->strategy = Z_FILTERED; break; @@ -138,6 +165,8 @@ local gzFile gz_open(path, fd, mode) break; case 'F': state->strategy = Z_FIXED; + case 'T': + state->direct = 1; default: /* could consider as an error, but just ignore */ ; } @@ -150,30 +179,67 @@ local gzFile gz_open(path, fd, mode) return NULL; } + /* can't force transparent read */ + if (state->mode == GZ_READ) { + if (state->direct) { + free(state); + return NULL; + } + state->direct = 1; /* for empty file */ + } + /* save the path name for error messages */ - state->path = malloc(strlen(path) + 1); +#ifdef _WIN32 + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (size_t)-1) + len = 0; + } + else +#endif + len = strlen(path); + state->path = malloc(len + 1); if (state->path == NULL) { free(state); return NULL; } - strcpy(state->path, path); +#ifdef _WIN32 + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif + strcpy(state->path, path); - /* open the file with the appropriate mode (or just use fd) */ - state->fd = fd != -1 ? fd : - open(path, + /* compute the flags for open() */ + oflag = #ifdef O_LARGEFILE - O_LARGEFILE | + O_LARGEFILE | #endif #ifdef O_BINARY - O_BINARY | + O_BINARY | #endif - (state->mode == GZ_READ ? - O_RDONLY : - (O_WRONLY | O_CREAT | ( - state->mode == GZ_WRITE ? - O_TRUNC : - O_APPEND))), - 0666); +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef _WIN32 + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open(path, oflag, 0666)); if (state->fd == -1) { free(state->path); free(state); @@ -227,6 +293,16 @@ gzFile ZEXPORT gzdopen(fd, mode) return gz; } +/* -- see zlib.h -- */ +#ifdef _WIN32 +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + /* -- see zlib.h -- */ int ZEXPORT gzbuffer(file, size) gzFile file; @@ -246,8 +322,8 @@ int ZEXPORT gzbuffer(file, size) return -1; /* check and set requested size */ - if (size == 0) - return -1; + if (size < 2) + size = 2; /* need two bytes to check magic header */ state->want = size; return 0; } @@ -264,7 +340,8 @@ int ZEXPORT gzrewind(file) state = (gz_statep)file; /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* back up and start over */ @@ -292,7 +369,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence) return -1; /* check that there's no error */ - if (state->err != Z_OK) + if (state->err != Z_OK && state->err != Z_BUF_ERROR) return -1; /* can only seek from start or relative to current position */ @@ -301,31 +378,32 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence) /* normalize offset to a SEEK_CUR specification */ if (whence == SEEK_SET) - offset -= state->pos; + offset -= state->x.pos; else if (state->seek) offset += state->skip; state->seek = 0; /* if within raw area while reading, just go there */ if (state->mode == GZ_READ && state->how == COPY && - state->pos + offset >= state->raw) { - ret = LSEEK(state->fd, offset - state->have, SEEK_CUR); + state->x.pos + offset >= 0) { + ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); if (ret == -1) return -1; - state->have = 0; + state->x.have = 0; state->eof = 0; + state->past = 0; state->seek = 0; gz_error(state, Z_OK, NULL); state->strm.avail_in = 0; - state->pos += offset; - return state->pos; + state->x.pos += offset; + return state->x.pos; } /* calculate skip amount, rewinding if needed for back seek when reading */ if (offset < 0) { if (state->mode != GZ_READ) /* writing -- can't go backwards */ return -1; - offset += state->pos; + offset += state->x.pos; if (offset < 0) /* before start of file! */ return -1; if (gzrewind(file) == -1) /* rewind, then skip to offset */ @@ -334,11 +412,11 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence) /* if reading, skip what's in output buffer (one less gzgetc() check) */ if (state->mode == GZ_READ) { - n = GT_OFF(state->have) || (z_off64_t)state->have > offset ? - (unsigned)offset : state->have; - state->have -= n; - state->next += n; - state->pos += n; + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? + (unsigned)offset : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; offset -= n; } @@ -347,7 +425,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence) state->seek = 1; state->skip = offset; } - return state->pos + offset; + return state->x.pos + offset; } /* -- see zlib.h -- */ @@ -376,7 +454,7 @@ z_off64_t ZEXPORT gztell64(file) return -1; /* return position */ - return state->pos + (state->seek ? state->skip : 0); + return state->x.pos + (state->seek ? state->skip : 0); } /* -- see zlib.h -- */ @@ -436,8 +514,7 @@ int ZEXPORT gzeof(file) return 0; /* return end-of-file state */ - return state->mode == GZ_READ ? - (state->eof && state->strm.avail_in == 0 && state->have == 0) : 0; + return state->mode == GZ_READ ? state->past : 0; } /* -- see zlib.h -- */ @@ -474,8 +551,10 @@ void ZEXPORT gzclearerr(file) return; /* clear error and end-of-file */ - if (state->mode == GZ_READ) + if (state->mode == GZ_READ) { state->eof = 0; + state->past = 0; + } gz_error(state, Z_OK, NULL); } @@ -497,6 +576,10 @@ void ZLIB_INTERNAL gz_error(state, err, msg) state->msg = NULL; } + /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ + if (err != Z_OK && err != Z_BUF_ERROR) + state->x.have = 0; + /* set error code, and if no message, then done */ state->err = err; if (msg == NULL) diff --git a/lib/libz/gzread.c b/lib/libz/gzread.c index 5c37babe4ec..bd2120524e6 100644 --- a/lib/libz/gzread.c +++ b/lib/libz/gzread.c @@ -1,5 +1,5 @@ /* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004, 2005, 2010 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -11,10 +11,9 @@ /* Local functions */ local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); local int gz_avail OF((gz_statep)); -local int gz_next4 OF((gz_statep, unsigned long *)); -local int gz_head OF((gz_statep)); +local int gz_look OF((gz_statep)); local int gz_decomp OF((gz_statep)); -local int gz_make OF((gz_statep)); +local int gz_fetch OF((gz_statep)); local int gz_skip OF((gz_statep, z_off64_t)); /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from @@ -49,67 +48,47 @@ local int gz_load(state, buf, len, have) error, 0 otherwise. Note that the eof flag is set when the end of the input file is reached, even though there may be unused data in the buffer. Once that data has been used, no more attempts will be made to read the file. - gz_avail() assumes that strm->avail_in == 0. */ + If strm->avail_in != 0, then the current data is moved to the beginning of + the input buffer, and then the remainder of the buffer is loaded with the + available data from the input file. */ local int gz_avail(state) gz_statep state; { + unsigned got; z_streamp strm = &(state->strm); - if (state->err != Z_OK) + if (state->err != Z_OK && state->err != Z_BUF_ERROR) return -1; if (state->eof == 0) { - if (gz_load(state, state->in, state->size, - (unsigned *)&(strm->avail_in)) == -1) + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in, *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } + if (gz_load(state, state->in + strm->avail_in, + state->size - strm->avail_in, &got) == -1) return -1; + strm->avail_in += got; strm->next_in = state->in; } return 0; } -/* Get next byte from input, or -1 if end or error. */ -#define NEXT() ((strm->avail_in == 0 && gz_avail(state) == -1) ? -1 : \ - (strm->avail_in == 0 ? -1 : \ - (strm->avail_in--, *(strm->next_in)++))) - -/* Get a four-byte little-endian integer and return 0 on success and the value - in *ret. Otherwise -1 is returned and *ret is not modified. */ -local int gz_next4(state, ret) - gz_statep state; - unsigned long *ret; -{ - int ch; - unsigned long val; - z_streamp strm = &(state->strm); - - val = NEXT(); - val += (unsigned)NEXT() << 8; - val += (unsigned long)NEXT() << 16; - ch = NEXT(); - if (ch == -1) - return -1; - val += (unsigned long)ch << 24; - *ret = val; - return 0; -} - -/* Look for gzip header, set up for inflate or copy. state->have must be zero. +/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. If this is the first time in, allocate required memory. state->how will be left unchanged if there is no more input data available, will be set to COPY if there is no gzip header and direct copying will be performed, or it will - be set to GZIP for decompression, and the gzip header will be skipped so - that the next available input data is the raw deflate stream. If direct - copying, then leftover input data from the input buffer will be copied to - the output buffer. In that case, all further file reads will be directly to - either the output buffer or a user buffer. If decompressing, the inflate - state and the check value will be initialized. gz_head() will return 0 on - success or -1 on failure. Failures may include read errors or gzip header - errors. */ -local int gz_head(state) + be set to GZIP for decompression. If direct copying, then leftover input + data from the input buffer will be copied to the output buffer. In that + case, all further file reads will be directly to either the output buffer or + a user buffer. If decompressing, the inflate state will be initialized. + gz_look() will return 0 on success or -1 on failure. */ +local int gz_look(state) gz_statep state; { z_streamp strm = &(state->strm); - int flags; - unsigned len; /* allocate read buffers and inflate memory */ if (state->size == 0) { @@ -132,7 +111,7 @@ local int gz_head(state) state->strm.opaque = Z_NULL; state->strm.avail_in = 0; state->strm.next_in = Z_NULL; - if (inflateInit2(&(state->strm), -15) != Z_OK) { /* raw inflate */ + if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ free(state->out); free(state->in); state->size = 0; @@ -141,83 +120,45 @@ local int gz_head(state) } } - /* get some data in the input buffer */ - if (strm->avail_in == 0) { + /* get at least the magic bytes in the input buffer */ + if (strm->avail_in < 2) { if (gz_avail(state) == -1) return -1; if (strm->avail_in == 0) return 0; } - /* look for the gzip magic header bytes 31 and 139 */ - if (strm->next_in[0] == 31) { - strm->avail_in--; - strm->next_in++; - if (strm->avail_in == 0 && gz_avail(state) == -1) - return -1; - if (strm->avail_in && strm->next_in[0] == 139) { - /* we have a gzip header, woo hoo! */ - strm->avail_in--; - strm->next_in++; - - /* skip rest of header */ - if (NEXT() != 8) { /* compression method */ - gz_error(state, Z_DATA_ERROR, "unknown compression method"); - return -1; - } - flags = NEXT(); - if (flags & 0xe0) { /* reserved flag bits */ - gz_error(state, Z_DATA_ERROR, "unknown header flags set"); - return -1; - } - NEXT(); /* modification time */ - NEXT(); - NEXT(); - NEXT(); - NEXT(); /* extra flags */ - NEXT(); /* operating system */ - if (flags & 4) { /* extra field */ - len = (unsigned)NEXT(); - len += (unsigned)NEXT() << 8; - while (len--) - if (NEXT() < 0) - break; - } - if (flags & 8) /* file name */ - while (NEXT() > 0) - ; - if (flags & 16) /* comment */ - while (NEXT() > 0) - ; - if (flags & 2) { /* header crc */ - NEXT(); - NEXT(); - } - /* an unexpected end of file is not checked for here -- it will be - noticed on the first request for uncompressed data */ - - /* set up for decompression */ - inflateReset(strm); - strm->adler = crc32(0L, Z_NULL, 0); - state->how = GZIP; - state->direct = 0; - return 0; - } - else { - /* not a gzip file -- save first byte (31) and fall to raw i/o */ - state->out[0] = 31; - state->have = 1; - } + /* look for gzip magic bytes -- if there, do gzip decoding (note: there is + a logical dilemma here when considering the case of a partially written + gzip file, to wit, if a single 31 byte is written, then we cannot tell + whether this is a single-byte file, or just a partially written gzip + file -- for here we assume that if a gzip file is being written, then + the header will be written in a single operation, so that reading a + single byte is sufficient indication that it is not a gzip file) */ + if (strm->avail_in > 1 && + strm->next_in[0] == 31 && strm->next_in[1] == 139) { + inflateReset(strm); + state->how = GZIP; + state->direct = 0; + return 0; } - /* doing raw i/o, save start of raw data for seeking, copy any leftover - input to output -- this assumes that the output buffer is larger than - the input buffer, which also assures space for gzungetc() */ - state->raw = state->pos; - state->next = state->out; + /* no gzip header -- if we were decoding gzip before, then this is trailing + garbage. Ignore the trailing garbage and finish. */ + if (state->direct == 0) { + strm->avail_in = 0; + state->eof = 1; + state->x.have = 0; + return 0; + } + + /* doing raw i/o, copy any leftover input to output -- this assumes that + the output buffer is larger than the input buffer, which also assures + space for gzungetc() */ + state->x.next = state->out; if (strm->avail_in) { - memcpy(state->next + state->have, strm->next_in, strm->avail_in); - state->have += strm->avail_in; + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; strm->avail_in = 0; } state->how = COPY; @@ -226,19 +167,15 @@ local int gz_head(state) } /* Decompress from input to the provided next_out and avail_out in the state. - If the end of the compressed data is reached, then verify the gzip trailer - check value and length (modulo 2^32). state->have and state->next are set - to point to the just decompressed data, and the crc is updated. If the - trailer is verified, state->how is reset to LOOK to look for the next gzip - stream or raw data, once state->have is depleted. Returns 0 on success, -1 - on failure. Failures may include invalid compressed data or a failed gzip - trailer verification. */ + On return, state->x.have and state->x.next point to the just decompressed + data. If the gzip stream completes, state->how is reset to LOOK to look for + the next gzip stream or raw data, once state->x.have is depleted. Returns 0 + on success, -1 on failure. */ local int gz_decomp(state) gz_statep state; { - int ret; + int ret = Z_OK; unsigned had; - unsigned long crc, len; z_streamp strm = &(state->strm); /* fill output buffer up to end of deflate stream */ @@ -248,15 +185,15 @@ local int gz_decomp(state) if (strm->avail_in == 0 && gz_avail(state) == -1) return -1; if (strm->avail_in == 0) { - gz_error(state, Z_DATA_ERROR, "unexpected end of file"); - return -1; + gz_error(state, Z_BUF_ERROR, "unexpected end of file"); + break; } /* decompress and handle errors */ ret = inflate(strm, Z_NO_FLUSH); if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { gz_error(state, Z_STREAM_ERROR, - "internal error: inflate stream corrupt"); + "internal error: inflate stream corrupt"); return -1; } if (ret == Z_MEM_ERROR) { @@ -265,67 +202,55 @@ local int gz_decomp(state) } if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ gz_error(state, Z_DATA_ERROR, - strm->msg == NULL ? "compressed data error" : strm->msg); + strm->msg == NULL ? "compressed data error" : strm->msg); return -1; } } while (strm->avail_out && ret != Z_STREAM_END); - /* update available output and crc check value */ - state->have = had - strm->avail_out; - state->next = strm->next_out - state->have; - strm->adler = crc32(strm->adler, state->next, state->have); + /* update available output */ + state->x.have = had - strm->avail_out; + state->x.next = strm->next_out - state->x.have; - /* check gzip trailer if at end of deflate stream */ - if (ret == Z_STREAM_END) { - if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) { - gz_error(state, Z_DATA_ERROR, "unexpected end of file"); - return -1; - } - if (crc != strm->adler) { - gz_error(state, Z_DATA_ERROR, "incorrect data check"); - return -1; - } - if (len != (strm->total_out & 0xffffffffL)) { - gz_error(state, Z_DATA_ERROR, "incorrect length check"); - return -1; - } - state->how = LOOK; /* ready for next stream, once have is 0 (leave - state->direct unchanged to remember how) */ - } + /* if the gzip stream completed successfully, look for another */ + if (ret == Z_STREAM_END) + state->how = LOOK; /* good decompression */ return 0; } -/* Make data and put in the output buffer. Assumes that state->have == 0. +/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. Data is either copied from the input file or decompressed from the input file depending on state->how. If state->how is LOOK, then a gzip header is - looked for (and skipped if found) to determine wither to copy or decompress. - Returns -1 on error, otherwise 0. gz_make() will leave state->have as COPY - or GZIP unless the end of the input file has been reached and all data has - been processed. */ -local int gz_make(state) + looked for to determine whether to copy or decompress. Returns -1 on error, + otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the + end of the input file has been reached and all data has been processed. */ +local int gz_fetch(state) gz_statep state; { z_streamp strm = &(state->strm); - if (state->how == LOOK) { /* look for gzip header */ - if (gz_head(state) == -1) - return -1; - if (state->have) /* got some data from gz_head() */ + do { + switch(state->how) { + case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ + if (gz_look(state) == -1) + return -1; + if (state->how == LOOK) + return 0; + break; + case COPY: /* -> COPY */ + if (gz_load(state, state->out, state->size << 1, &(state->x.have)) + == -1) + return -1; + state->x.next = state->out; return 0; - } - if (state->how == COPY) { /* straight copy */ - if (gz_load(state, state->out, state->size << 1, &(state->have)) == -1) - return -1; - state->next = state->out; - } - else if (state->how == GZIP) { /* decompress */ - strm->avail_out = state->size << 1; - strm->next_out = state->out; - if (gz_decomp(state) == -1) - return -1; - } + case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + } while (state->x.have == 0 && (!state->eof || strm->avail_in)); return 0; } @@ -339,12 +264,12 @@ local int gz_skip(state, len) /* skip over len bytes or reach end-of-file, whichever comes first */ while (len) /* skip over whatever is in output buffer */ - if (state->have) { - n = GT_OFF(state->have) || (z_off64_t)state->have > len ? - (unsigned)len : state->have; - state->have -= n; - state->next += n; - state->pos += n; + if (state->x.have) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? + (unsigned)len : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; len -= n; } @@ -355,7 +280,7 @@ local int gz_skip(state, len) /* need more data to skip -- load up output buffer */ else { /* get more output, looking for header if required */ - if (gz_make(state) == -1) + if (gz_fetch(state) == -1) return -1; } return 0; @@ -377,14 +302,15 @@ int ZEXPORT gzread(file, buf, len) state = (gz_statep)file; strm = &(state->strm); - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* since an int is returned, make sure len fits in one, otherwise return with an error (this avoids the flaw in the interface) */ if ((int)len < 0) { - gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); return -1; } @@ -403,24 +329,26 @@ int ZEXPORT gzread(file, buf, len) got = 0; do { /* first just try copying data from the output buffer */ - if (state->have) { - n = state->have > len ? len : state->have; - memcpy(buf, state->next, n); - state->next += n; - state->have -= n; + if (state->x.have) { + n = state->x.have > len ? len : state->x.have; + memcpy(buf, state->x.next, n); + state->x.next += n; + state->x.have -= n; } /* output buffer empty -- return if we're at the end of the input */ - else if (state->eof && strm->avail_in == 0) + else if (state->eof && strm->avail_in == 0) { + state->past = 1; /* tried to read past end */ break; + } /* need output data -- for small len or new stream load up our output buffer */ else if (state->how == LOOK || len < (state->size << 1)) { /* get more output, looking for header if required */ - if (gz_make(state) == -1) + if (gz_fetch(state) == -1) return -1; - continue; /* no progress yet -- go back to memcpy() above */ + continue; /* no progress yet -- go back to copy above */ /* the copy above assures that we will leave with space in the output buffer, allowing at least one gzungetc() to succeed */ } @@ -437,15 +365,15 @@ int ZEXPORT gzread(file, buf, len) strm->next_out = buf; if (gz_decomp(state) == -1) return -1; - n = state->have; - state->have = 0; + n = state->x.have; + state->x.have = 0; } /* update progress */ len -= n; buf = (char *)buf + n; got += n; - state->pos += n; + state->x.pos += n; } while (len); /* return number of bytes read into user buffer (will fit in int) */ @@ -453,6 +381,7 @@ int ZEXPORT gzread(file, buf, len) } /* -- see zlib.h -- */ +#undef gzgetc int ZEXPORT gzgetc(file) gzFile file; { @@ -465,15 +394,16 @@ int ZEXPORT gzgetc(file) return -1; state = (gz_statep)file; - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* try output buffer (no need to check for skip request) */ - if (state->have) { - state->have--; - state->pos++; - return *(state->next)++; + if (state->x.have) { + state->x.have--; + state->x.pos++; + return *(state->x.next)++; } /* nothing there -- try gzread() */ @@ -481,6 +411,12 @@ int ZEXPORT gzgetc(file) return ret < 1 ? -1 : buf[0]; } +int ZEXPORT gzgetc_(file) +gzFile file; +{ + return gzgetc(file); +} + /* -- see zlib.h -- */ int ZEXPORT gzungetc(c, file) int c; @@ -493,8 +429,9 @@ int ZEXPORT gzungetc(c, file) return -1; state = (gz_statep)file; - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* process a skip request */ @@ -509,32 +446,34 @@ int ZEXPORT gzungetc(c, file) return -1; /* if output buffer empty, put byte at end (allows more pushing) */ - if (state->have == 0) { - state->have = 1; - state->next = state->out + (state->size << 1) - 1; - state->next[0] = c; - state->pos--; + if (state->x.have == 0) { + state->x.have = 1; + state->x.next = state->out + (state->size << 1) - 1; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; return c; } /* if no room, give up (must have already done a gzungetc()) */ - if (state->have == (state->size << 1)) { - gz_error(state, Z_BUF_ERROR, "out of room to push characters"); + if (state->x.have == (state->size << 1)) { + gz_error(state, Z_DATA_ERROR, "out of room to push characters"); return -1; } /* slide output data if needed and insert byte before existing data */ - if (state->next == state->out) { - unsigned char *src = state->out + state->have; + if (state->x.next == state->out) { + unsigned char *src = state->out + state->x.have; unsigned char *dest = state->out + (state->size << 1); while (src > state->out) *--dest = *--src; - state->next = dest; + state->x.next = dest; } - state->have++; - state->next--; - state->next[0] = c; - state->pos--; + state->x.have++; + state->x.next--; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; return c; } @@ -554,8 +493,9 @@ char * ZEXPORT gzgets(file, buf, len) return NULL; state = (gz_statep)file; - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || state->err != Z_OK) + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) return NULL; /* process a skip request */ @@ -572,32 +512,31 @@ char * ZEXPORT gzgets(file, buf, len) left = (unsigned)len - 1; if (left) do { /* assure that something is in the output buffer */ - if (state->have == 0) { - if (gz_make(state) == -1) - return NULL; /* error */ - if (state->have == 0) { /* end of file */ - if (buf == str) /* got bupkus */ - return NULL; - break; /* got something -- return it */ - } + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ } /* look for end-of-line in current output buffer */ - n = state->have > left ? left : state->have; - eol = memchr(state->next, '\n', n); + n = state->x.have > left ? left : state->x.have; + eol = memchr(state->x.next, '\n', n); if (eol != NULL) - n = (unsigned)(eol - state->next) + 1; + n = (unsigned)(eol - state->x.next) + 1; /* copy through end-of-line, or remainder if not found */ - memcpy(buf, state->next, n); - state->have -= n; - state->next += n; - state->pos += n; + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; left -= n; buf += n; } while (left && eol == NULL); - /* found end-of-line or out of space -- terminate string and return it */ + /* return terminated string, or if nothing, end of file */ + if (buf == str) + return NULL; buf[0] = 0; return str; } @@ -613,16 +552,12 @@ int ZEXPORT gzdirect(file) return 0; state = (gz_statep)file; - /* check that we're reading */ - if (state->mode != GZ_READ) - return 0; - /* if the state is not known, but we can find out, then do so (this is mainly for right after a gzopen() or gzdopen()) */ - if (state->how == LOOK && state->have == 0) - (void)gz_head(state); + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); - /* return 1 if reading direct, 0 if decompressing a gzip stream */ + /* return 1 if transparent, 0 if processing a gzip stream */ return state->direct; } @@ -630,7 +565,7 @@ int ZEXPORT gzdirect(file) int ZEXPORT gzclose_r(file) gzFile file; { - int ret; + int ret, err; gz_statep state; /* get internal structure */ @@ -648,9 +583,10 @@ int ZEXPORT gzclose_r(file) free(state->out); free(state->in); } + err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; gz_error(state, Z_OK, NULL); free(state->path); ret = close(state->fd); free(state); - return ret ? Z_ERRNO : Z_OK; + return ret ? Z_ERRNO : err; } diff --git a/lib/libz/gzwrite.c b/lib/libz/gzwrite.c index 0f147315c79..20344a2d3e0 100644 --- a/lib/libz/gzwrite.c +++ b/lib/libz/gzwrite.c @@ -1,8 +1,10 @@ /* gzwrite.c -- zlib functions for writing gzip files - * Copyright (C) 2004, 2005, 2010 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ +/* $FreeBSD$ */ + #include "gzguts.h" #include @@ -19,44 +21,55 @@ local int gz_init(state) int ret; z_streamp strm = &(state->strm); - /* allocate input and output buffers */ + /* allocate input buffer */ state->in = malloc(state->want); - state->out = malloc(state->want); - if (state->in == NULL || state->out == NULL) { - if (state->out != NULL) - free(state->out); - if (state->in != NULL) - free(state->in); + if (state->in == NULL) { gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } - /* allocate deflate memory, set up for gzip compression */ - strm->zalloc = Z_NULL; - strm->zfree = Z_NULL; - strm->opaque = Z_NULL; - ret = deflateInit2(strm, state->level, Z_DEFLATED, - 15 + 16, 8, state->strategy); - if (ret != Z_OK) { - free(state->in); - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; + /* only need output buffer and deflate state if compressing */ + if (!state->direct) { + /* allocate output buffer */ + state->out = malloc(state->want); + if (state->out == NULL) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); + if (ret != Z_OK) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } } /* mark state as initialized */ state->size = state->want; - /* initialize write buffer */ - strm->avail_out = state->size; - strm->next_out = state->out; - state->next = strm->next_out; + /* initialize write buffer if compressing */ + if (!state->direct) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = strm->next_out; + } return 0; } /* Compress whatever is at avail_in and next_in and write to the output file. Return -1 if there is an error writing to the output file, otherwise 0. flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, - then the deflate() state is reset to start a new gzip stream. */ + then the deflate() state is reset to start a new gzip stream. If gz->direct + is true, then simply write to the output file without compressing, and + ignore flush. */ local int gz_comp(state, flush) gz_statep state; int flush; @@ -69,6 +82,17 @@ local int gz_comp(state, flush) if (state->size == 0 && gz_init(state) == -1) return -1; + /* write directly if requested */ + if (state->direct) { + got = write(state->fd, strm->next_in, strm->avail_in); + if (got < 0 || (unsigned)got != strm->avail_in) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in = 0; + return 0; + } + /* run deflate() on provided input until it produces no more output */ ret = Z_OK; do { @@ -76,8 +100,8 @@ local int gz_comp(state, flush) doing Z_FINISH then don't write until we get to Z_STREAM_END */ if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && (flush != Z_FINISH || ret == Z_STREAM_END))) { - have = (unsigned)(strm->next_out - state->next); - if (have && ((got = write(state->fd, state->next, have)) < 0 || + have = (unsigned)(strm->next_out - state->x.next); + if (have && ((got = write(state->fd, state->x.next, have)) < 0 || (unsigned)got != have)) { gz_error(state, Z_ERRNO, zstrerror()); return -1; @@ -86,7 +110,7 @@ local int gz_comp(state, flush) strm->avail_out = state->size; strm->next_out = state->out; } - state->next = strm->next_out; + state->x.next = strm->next_out; } /* compress */ @@ -132,7 +156,7 @@ local int gz_zero(state, len) } strm->avail_in = n; strm->next_in = state->in; - state->pos += n; + state->x.pos += n; if (gz_comp(state, Z_NO_FLUSH) == -1) return -1; len -= n; @@ -164,7 +188,7 @@ int ZEXPORT gzwrite(file, buf, len) /* since an int is returned, make sure len fits in one, otherwise return with an error (this avoids the flaw in the interface) */ if ((int)len < 0) { - gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); return 0; } @@ -194,7 +218,7 @@ int ZEXPORT gzwrite(file, buf, len) n = len; memcpy(strm->next_in + strm->avail_in, buf, n); strm->avail_in += n; - state->pos += n; + state->x.pos += n; buf = (char *)buf + n; len -= n; if (len && gz_comp(state, Z_NO_FLUSH) == -1) @@ -209,7 +233,7 @@ int ZEXPORT gzwrite(file, buf, len) /* directly compress user buffer to file */ strm->avail_in = len; strm->next_in = (voidp)buf; - state->pos += len; + state->x.pos += len; if (gz_comp(state, Z_NO_FLUSH) == -1) return 0; } @@ -250,15 +274,15 @@ int ZEXPORT gzputc(file, c) if (strm->avail_in == 0) strm->next_in = state->in; strm->next_in[strm->avail_in++] = c; - state->pos++; - return c; + state->x.pos++; + return c & 0xff; } /* no room in buffer or not initialized, use gz_write() */ buf[0] = c; if (gzwrite(file, buf, 1) != 1) return -1; - return c; + return c & 0xff; } /* -- see zlib.h -- */ @@ -275,7 +299,7 @@ int ZEXPORT gzputs(file, str) return ret == 0 && len != 0 ? -1 : ret; } -#ifdef STDC +#if defined(STDC) || defined(Z_HAVE_STDARG_H) #include /* -- see zlib.h -- */ @@ -317,19 +341,19 @@ int ZEXPORTVA gzprintf (gzFile file, const char *format, ...) va_start(va, format); #ifdef NO_vsnprintf # ifdef HAS_vsprintf_void - (void)vsprintf(state->in, format, va); + (void)vsprintf((char *)(state->in), format, va); va_end(va); for (len = 0; len < size; len++) if (state->in[len] == 0) break; # else - len = vsprintf(state->in, format, va); + len = vsprintf((char *)(state->in), format, va); va_end(va); # endif #else # ifdef HAS_vsnprintf_void - (void)vsnprintf(state->in, size, format, va); + (void)vsnprintf((char *)(state->in), size, format, va); va_end(va); - len = strlen(state->in); + len = strlen((char *)(state->in)); # else len = vsnprintf((char *)(state->in), size, format, va); va_end(va); @@ -343,11 +367,11 @@ int ZEXPORTVA gzprintf (gzFile file, const char *format, ...) /* update buffer and position, defer compression until needed */ strm->avail_in = (unsigned)len; strm->next_in = state->in; - state->pos += len; + state->x.pos += len; return len; } -#else /* !STDC */ +#else /* !STDC && !Z_HAVE_STDARG_H */ /* -- see zlib.h -- */ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, @@ -367,6 +391,10 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, state = (gz_statep)file; strm = &(state->strm); + /* check that can really pass pointer in ints */ + if (sizeof(int) != sizeof(void *)) + return 0; + /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return 0; @@ -391,22 +419,23 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, state->in[size - 1] = 0; #ifdef NO_snprintf # ifdef HAS_sprintf_void - sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, + sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); for (len = 0; len < size; len++) if (state->in[len] == 0) break; # else - len = sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #else # ifdef HAS_snprintf_void - snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, + snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen(state->in); + len = strlen((char *)(state->in)); # else - len = snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, + a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, + a19, a20); # endif #endif @@ -417,7 +446,7 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, /* update buffer and position, defer compression until needed */ strm->avail_in = (unsigned)len; strm->next_in = state->in; - state->pos += len; + state->x.pos += len; return len; } @@ -501,7 +530,7 @@ int ZEXPORT gzsetparams(file, level, strategy) int ZEXPORT gzclose_w(file) gzFile file; { - int ret = 0; + int ret = Z_OK; gz_statep state; /* get internal structure */ @@ -516,17 +545,24 @@ int ZEXPORT gzclose_w(file) /* check for seek request */ if (state->seek) { state->seek = 0; - ret += gz_zero(state, state->skip); + if (gz_zero(state, state->skip) == -1) + ret = state->err; } /* flush, free memory, and close file */ - ret += gz_comp(state, Z_FINISH); - (void)deflateEnd(&(state->strm)); - free(state->out); - free(state->in); + if (state->size) { + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); + } gz_error(state, Z_OK, NULL); free(state->path); - ret += close(state->fd); + if (close(state->fd) == -1) + ret = Z_ERRNO; free(state); - return ret ? Z_ERRNO : Z_OK; + return ret; } diff --git a/lib/libz/infback.c b/lib/libz/infback.c index af3a8c965d5..981aff17c2d 100644 --- a/lib/libz/infback.c +++ b/lib/libz/infback.c @@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2009 Mark Adler + * Copyright (C) 1995-2011 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -42,10 +42,19 @@ int stream_size; return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; +#endif } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif state = (struct inflate_state FAR *)ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; @@ -394,7 +403,6 @@ void FAR *out_desc; PULLBYTE(); } if (here.val < 16) { - NEEDBITS(here.bits); DROPBITS(here.bits); state->lens[state->have++] = here.val; } diff --git a/lib/libz/inffixed.h b/lib/libz/inffixed.h index 75ed4b5978d..d6283277694 100644 --- a/lib/libz/inffixed.h +++ b/lib/libz/inffixed.h @@ -2,9 +2,9 @@ * Generated automatically by makefixed(). */ - /* WARNING: this file should *not* be used by applications. It - is part of the implementation of the compression library and - is subject to change. Applications should only use zlib.h. + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. */ static const code lenfix[512] = { diff --git a/lib/libz/inflate.c b/lib/libz/inflate.c index a8431abeacf..47418a1e1e1 100644 --- a/lib/libz/inflate.c +++ b/lib/libz/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2010 Mark Adler + * Copyright (C) 1995-2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -100,7 +100,7 @@ local int updatewindow OF((z_streamp strm, unsigned out)); local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, unsigned len)); -int ZEXPORT inflateReset(strm) +int ZEXPORT inflateResetKeep(strm) z_streamp strm; { struct inflate_state FAR *state; @@ -109,15 +109,13 @@ z_streamp strm; state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; - strm->adler = 1; /* to support ill-conceived Java test suite */ + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; state->mode = HEAD; state->last = 0; state->havedict = 0; state->dmax = 32768U; state->head = Z_NULL; - state->wsize = 0; - state->whave = 0; - state->wnext = 0; state->hold = 0; state->bits = 0; state->lencode = state->distcode = state->next = state->codes; @@ -127,6 +125,19 @@ z_streamp strm; return Z_OK; } +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + int ZEXPORT inflateReset2(strm, windowBits) z_streamp strm; int windowBits; @@ -180,10 +191,19 @@ int stream_size; if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; +#endif } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif state = (struct inflate_state FAR *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; @@ -321,8 +341,8 @@ void makefixed() low = 0; for (;;) { if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, - state.lencode[low].val); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); if (++low == size) break; putchar(','); } @@ -499,11 +519,6 @@ unsigned out; bits -= bits & 7; \ } while (0) -/* Reverse the bytes in a 32-bit value */ -#define REVERSE(q) \ - ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is @@ -797,7 +812,7 @@ int flush; #endif case DICTID: NEEDBITS(32); - strm->adler = state->check = REVERSE(hold); + strm->adler = state->check = ZSWAP32(hold); INITBITS(); state->mode = DICT; case DICT: @@ -925,7 +940,6 @@ int flush; PULLBYTE(); } if (here.val < 16) { - NEEDBITS(here.bits); DROPBITS(here.bits); state->lens[state->have++] = here.val; } @@ -1170,7 +1184,7 @@ int flush; #ifdef GUNZIP state->flags ? hold : #endif - REVERSE(hold)) != state->check) { + ZSWAP32(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; @@ -1214,7 +1228,8 @@ int flush; */ inf_leave: RESTORE(); - if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) if (updatewindow(strm, out)) { state->mode = MEM; return Z_MEM_ERROR; @@ -1255,7 +1270,10 @@ const Bytef *dictionary; uInt dictLength; { struct inflate_state FAR *state; - unsigned long id; + unsigned long dictid; + unsigned char *next; + unsigned avail; + int ret; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; @@ -1263,29 +1281,27 @@ uInt dictLength; if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; - /* check for correct dictionary id */ + /* check for correct dictionary identifier */ if (state->mode == DICT) { - id = adler32(0L, Z_NULL, 0); - id = adler32(id, dictionary, dictLength); - if (id != state->check) + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) return Z_DATA_ERROR; } - /* copy dictionary to window */ - if (updatewindow(strm, strm->avail_out)) { + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + next = strm->next_out; + avail = strm->avail_out; + strm->next_out = (Bytef *)dictionary + dictLength; + strm->avail_out = 0; + ret = updatewindow(strm, dictLength); + strm->avail_out = avail; + strm->next_out = next; + if (ret) { state->mode = MEM; return Z_MEM_ERROR; } - if (dictLength > state->wsize) { - zmemcpy(state->window, dictionary + dictLength - state->wsize, - state->wsize); - state->whave = state->wsize; - } - else { - zmemcpy(state->window + state->wsize - dictLength, dictionary, - dictLength); - state->whave = dictLength; - } state->havedict = 1; Tracev((stderr, "inflate: dictionary set\n")); return Z_OK; @@ -1433,8 +1449,8 @@ z_streamp source; } /* copy state */ - zmemcpy(dest, source, sizeof(z_stream)); - zmemcpy(copy, state, sizeof(struct inflate_state)); + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { copy->lencode = copy->codes + (state->lencode - state->codes); diff --git a/lib/libz/inftrees.c b/lib/libz/inftrees.c index 11e9c52accb..abcd7c45ed3 100644 --- a/lib/libz/inftrees.c +++ b/lib/libz/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2010 Mark Adler + * Copyright (C) 1995-2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.5 Copyright 1995-2010 Mark Adler "; + " inflate 1.2.7 Copyright 1995-2012 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -62,7 +62,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 73, 195}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 78, 68}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, @@ -289,38 +289,14 @@ unsigned short FAR *work; } } - /* - Fill in rest of table for incomplete codes. This loop is similar to the - loop above in incrementing huff for table indices. It is assumed that - len is equal to curr + drop, so there is no loop needed to increment - through high index bits. When the current sub-table is filled, the loop - drops back to the root table to fill in any remaining entries there. - */ - here.op = (unsigned char)64; /* invalid code marker */ - here.bits = (unsigned char)(len - drop); - here.val = (unsigned short)0; - while (huff != 0) { - /* when done with sub-table, drop back to root table */ - if (drop != 0 && (huff & mask) != low) { - drop = 0; - len = root; - next = *table; - here.bits = (unsigned char)len; - } - - /* put invalid code marker in table */ - next[huff >> drop] = here; - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; } /* set return parameters */ diff --git a/lib/libz/example.c b/lib/libz/test/example.c similarity index 93% rename from lib/libz/example.c rename to lib/libz/test/example.c index 604736f15f6..f515a4853d6 100644 --- a/lib/libz/example.c +++ b/lib/libz/test/example.c @@ -1,5 +1,5 @@ /* example.c -- usage example of the zlib compression library - * Copyright (C) 1995-2006 Jean-loup Gailly. + * Copyright (C) 1995-2006, 2011 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -34,10 +34,6 @@ const char hello[] = "hello, hello!"; const char dictionary[] = "hello"; uLong dictId; /* Adler32 value of the dictionary */ -void test_compress OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_gzio OF((const char *fname, - Byte *uncompr, uLong uncomprLen)); void test_deflate OF((Byte *compr, uLong comprLen)); void test_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); @@ -53,6 +49,39 @@ void test_dict_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); int main OF((int argc, char *argv[])); + +#ifdef Z_SOLO + +void *myalloc OF((void *, unsigned, unsigned)); +void myfree OF((void *, void *)); + +void *myalloc(q, n, m) + void *q; + unsigned n, m; +{ + q = Z_NULL; + return calloc(n, m); +} + +void myfree(void *q, void *p) +{ + q = Z_NULL; + free(p); +} + +static alloc_func zalloc = myalloc; +static free_func zfree = myfree; + +#else /* !Z_SOLO */ + +static alloc_func zalloc = (alloc_func)0; +static free_func zfree = (free_func)0; + +void test_compress OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_gzio OF((const char *fname, + Byte *uncompr, uLong uncomprLen)); + /* =========================================================================== * Test compress() and uncompress() */ @@ -163,6 +192,8 @@ void test_gzio(fname, uncompr, uncomprLen) #endif } +#endif /* Z_SOLO */ + /* =========================================================================== * Test deflate() with small buffers */ @@ -174,8 +205,8 @@ void test_deflate(compr, comprLen) int err; uLong len = (uLong)strlen(hello)+1; - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); @@ -213,8 +244,8 @@ void test_inflate(compr, comprLen, uncompr, uncomprLen) strcpy((char*)uncompr, "garbage"); - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; @@ -252,8 +283,8 @@ void test_large_deflate(compr, comprLen, uncompr, uncomprLen) z_stream c_stream; /* compression stream */ int err; - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_BEST_SPEED); @@ -309,8 +340,8 @@ void test_large_inflate(compr, comprLen, uncompr, uncomprLen) strcpy((char*)uncompr, "garbage"); - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; @@ -349,8 +380,8 @@ void test_flush(compr, comprLen) int err; uInt len = (uInt)strlen(hello)+1; - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); @@ -388,8 +419,8 @@ void test_sync(compr, comprLen, uncompr, uncomprLen) strcpy((char*)uncompr, "garbage"); - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; @@ -430,15 +461,15 @@ void test_dict_deflate(compr, comprLen) z_stream c_stream; /* compression stream */ int err; - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_BEST_COMPRESSION); CHECK_ERR(err, "deflateInit"); err = deflateSetDictionary(&c_stream, - (const Bytef*)dictionary, sizeof(dictionary)); + (const Bytef*)dictionary, (int)sizeof(dictionary)); CHECK_ERR(err, "deflateSetDictionary"); dictId = c_stream.adler; @@ -469,8 +500,8 @@ void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) strcpy((char*)uncompr, "garbage"); - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; @@ -491,7 +522,7 @@ void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) exit(1); } err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, - sizeof(dictionary)); + (int)sizeof(dictionary)); } CHECK_ERR(err, "inflate with dict"); } @@ -540,10 +571,15 @@ int main(argc, argv) printf("out of memory\n"); exit(1); } + +#ifdef Z_SOLO + argc = strlen(argv[0]); +#else test_compress(compr, comprLen, uncompr, uncomprLen); test_gzio((argc > 1 ? argv[1] : TESTFILE), uncompr, uncomprLen); +#endif test_deflate(compr, comprLen); test_inflate(compr, comprLen, uncompr, uncomprLen); diff --git a/lib/libz/test/infcover.c b/lib/libz/test/infcover.c new file mode 100644 index 00000000000..fe3d9203a02 --- /dev/null +++ b/lib/libz/test/infcover.c @@ -0,0 +1,671 @@ +/* infcover.c -- test zlib's inflate routines with full code coverage + * Copyright (C) 2011 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* to use, do: ./configure --cover && make cover */ + +#include +#include +#include +#include +#include "zlib.h" + +/* get definition of internal structure so we can mess with it (see pull()), + and so we can call inflate_trees() (see cover5()) */ +#define ZLIB_INTERNAL +#include "inftrees.h" +#include "inflate.h" + +#define local static + +/* -- memory tracking routines -- */ + +/* + These memory tracking routines are provided to zlib and track all of zlib's + allocations and deallocations, check for LIFO operations, keep a current + and high water mark of total bytes requested, optionally set a limit on the + total memory that can be allocated, and when done check for memory leaks. + + They are used as follows: + + z_stream strm; + mem_setup(&strm) initializes the memory tracking and sets the + zalloc, zfree, and opaque members of strm to use + memory tracking for all zlib operations on strm + mem_limit(&strm, limit) sets a limit on the total bytes requested -- a + request that exceeds this limit will result in an + allocation failure (returns NULL) -- setting the + limit to zero means no limit, which is the default + after mem_setup() + mem_used(&strm, "msg") prints to stderr "msg" and the total bytes used + mem_high(&strm, "msg") prints to stderr "msg" and the high water mark + mem_done(&strm, "msg") ends memory tracking, releases all allocations + for the tracking as well as leaked zlib blocks, if + any. If there was anything unusual, such as leaked + blocks, non-FIFO frees, or frees of addresses not + allocated, then "msg" and information about the + problem is printed to stderr. If everything is + normal, nothing is printed. mem_done resets the + strm members to Z_NULL to use the default memory + allocation routines on the next zlib initialization + using strm. + */ + +/* these items are strung together in a linked list, one for each allocation */ +struct mem_item { + void *ptr; /* pointer to allocated memory */ + size_t size; /* requested size of allocation */ + struct mem_item *next; /* pointer to next item in list, or NULL */ +}; + +/* this structure is at the root of the linked list, and tracks statistics */ +struct mem_zone { + struct mem_item *first; /* pointer to first item in list, or NULL */ + size_t total, highwater; /* total allocations, and largest total */ + size_t limit; /* memory allocation limit, or 0 if no limit */ + int notlifo, rogue; /* counts of non-LIFO frees and rogue frees */ +}; + +/* memory allocation routine to pass to zlib */ +local void *mem_alloc(void *mem, unsigned count, unsigned size) +{ + void *ptr; + struct mem_item *item; + struct mem_zone *zone = mem; + size_t len = count * (size_t)size; + + /* induced allocation failure */ + if (zone == NULL || (zone->limit && zone->total + len > zone->limit)) + return NULL; + + /* perform allocation using the standard library, fill memory with a + non-zero value to make sure that the code isn't depending on zeros */ + ptr = malloc(len); + if (ptr == NULL) + return NULL; + memset(ptr, 0xa5, len); + + /* create a new item for the list */ + item = malloc(sizeof(struct mem_item)); + if (item == NULL) { + free(ptr); + return NULL; + } + item->ptr = ptr; + item->size = len; + + /* insert item at the beginning of the list */ + item->next = zone->first; + zone->first = item; + + /* update the statistics */ + zone->total += item->size; + if (zone->total > zone->highwater) + zone->highwater = zone->total; + + /* return the allocated memory */ + return ptr; +} + +/* memory free routine to pass to zlib */ +local void mem_free(void *mem, void *ptr) +{ + struct mem_item *item, *next; + struct mem_zone *zone = mem; + + /* if no zone, just do a free */ + if (zone == NULL) { + free(ptr); + return; + } + + /* point next to the item that matches ptr, or NULL if not found -- remove + the item from the linked list if found */ + next = zone->first; + if (next) { + if (next->ptr == ptr) + zone->first = next->next; /* first one is it, remove from list */ + else { + do { /* search the linked list */ + item = next; + next = item->next; + } while (next != NULL && next->ptr != ptr); + if (next) { /* if found, remove from linked list */ + item->next = next->next; + zone->notlifo++; /* not a LIFO free */ + } + + } + } + + /* if found, update the statistics and free the item */ + if (next) { + zone->total -= next->size; + free(next); + } + + /* if not found, update the rogue count */ + else + zone->rogue++; + + /* in any case, do the requested free with the standard library function */ + free(ptr); +} + +/* set up a controlled memory allocation space for monitoring, set the stream + parameters to the controlled routines, with opaque pointing to the space */ +local void mem_setup(z_stream *strm) +{ + struct mem_zone *zone; + + zone = malloc(sizeof(struct mem_zone)); + assert(zone != NULL); + zone->first = NULL; + zone->total = 0; + zone->highwater = 0; + zone->limit = 0; + zone->notlifo = 0; + zone->rogue = 0; + strm->opaque = zone; + strm->zalloc = mem_alloc; + strm->zfree = mem_free; +} + +/* set a limit on the total memory allocation, or 0 to remove the limit */ +local void mem_limit(z_stream *strm, size_t limit) +{ + struct mem_zone *zone = strm->opaque; + + zone->limit = limit; +} + +/* show the current total requested allocations in bytes */ +local void mem_used(z_stream *strm, char *prefix) +{ + struct mem_zone *zone = strm->opaque; + + fprintf(stderr, "%s: %lu allocated\n", prefix, zone->total); +} + +/* show the high water allocation in bytes */ +local void mem_high(z_stream *strm, char *prefix) +{ + struct mem_zone *zone = strm->opaque; + + fprintf(stderr, "%s: %lu high water mark\n", prefix, zone->highwater); +} + +/* release the memory allocation zone -- if there are any surprises, notify */ +local void mem_done(z_stream *strm, char *prefix) +{ + int count = 0; + struct mem_item *item, *next; + struct mem_zone *zone = strm->opaque; + + /* show high water mark */ + mem_high(strm, prefix); + + /* free leftover allocations and item structures, if any */ + item = zone->first; + while (item != NULL) { + free(item->ptr); + next = item->next; + free(item); + item = next; + count++; + } + + /* issue alerts about anything unexpected */ + if (count || zone->total) + fprintf(stderr, "** %s: %lu bytes in %d blocks not freed\n", + prefix, zone->total, count); + if (zone->notlifo) + fprintf(stderr, "** %s: %d frees not LIFO\n", prefix, zone->notlifo); + if (zone->rogue) + fprintf(stderr, "** %s: %d frees not recognized\n", + prefix, zone->rogue); + + /* free the zone and delete from the stream */ + free(zone); + strm->opaque = Z_NULL; + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; +} + +/* -- inflate test routines -- */ + +/* Decode a hexadecimal string, set *len to length, in[] to the bytes. This + decodes liberally, in that hex digits can be adjacent, in which case two in + a row writes a byte. Or they can delimited by any non-hex character, where + the delimiters are ignored except when a single hex digit is followed by a + delimiter in which case that single digit writes a byte. The returned + data is allocated and must eventually be freed. NULL is returned if out of + memory. If the length is not needed, then len can be NULL. */ +local unsigned char *h2b(const char *hex, unsigned *len) +{ + unsigned char *in; + unsigned next, val; + + in = malloc((strlen(hex) + 1) >> 1); + if (in == NULL) + return NULL; + next = 0; + val = 1; + do { + if (*hex >= '0' && *hex <= '9') + val = (val << 4) + *hex - '0'; + else if (*hex >= 'A' && *hex <= 'F') + val = (val << 4) + *hex - 'A' + 10; + else if (*hex >= 'a' && *hex <= 'f') + val = (val << 4) + *hex - 'a' + 10; + else if (val != 1 && val < 32) /* one digit followed by delimiter */ + val += 240; /* make it look like two digits */ + if (val > 255) { /* have two digits */ + in[next++] = val & 0xff; /* save the decoded byte */ + val = 1; /* start over */ + } + } while (*hex++); /* go through the loop with the terminating null */ + if (len != NULL) + *len = next; + in = reallocf(in, next); + return in; +} + +/* generic inflate() run, where hex is the hexadecimal input data, what is the + text to include in an error message, step is how much input data to feed + inflate() on each call, or zero to feed it all, win is the window bits + parameter to inflateInit2(), len is the size of the output buffer, and err + is the error code expected from the first inflate() call (the second + inflate() call is expected to return Z_STREAM_END). If win is 47, then + header information is collected with inflateGetHeader(). If a zlib stream + is looking for a dictionary, then an empty dictionary is provided. + inflate() is run until all of the input data is consumed. */ +local void inf(char *hex, char *what, unsigned step, int win, unsigned len, + int err) +{ + int ret; + unsigned have; + unsigned char *in, *out; + z_stream strm, copy; + gz_header head; + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, win); + if (ret != Z_OK) { + mem_done(&strm, what); + return; + } + out = malloc(len); assert(out != NULL); + if (win == 47) { + head.extra = out; + head.extra_max = len; + head.name = out; + head.name_max = len; + head.comment = out; + head.comm_max = len; + ret = inflateGetHeader(&strm, &head); assert(ret == Z_OK); + } + in = h2b(hex, &have); assert(in != NULL); + if (step == 0 || step > have) + step = have; + strm.avail_in = step; + have -= step; + strm.next_in = in; + do { + strm.avail_out = len; + strm.next_out = out; + ret = inflate(&strm, Z_NO_FLUSH); assert(err == 9 || ret == err); + if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_NEED_DICT) + break; + if (ret == Z_NEED_DICT) { + ret = inflateSetDictionary(&strm, in, 1); + assert(ret == Z_DATA_ERROR); + mem_limit(&strm, 1); + ret = inflateSetDictionary(&strm, out, 0); + assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + ((struct inflate_state *)strm.state)->mode = DICT; + ret = inflateSetDictionary(&strm, out, 0); + assert(ret == Z_OK); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_BUF_ERROR); + } + ret = inflateCopy(©, &strm); assert(ret == Z_OK); + ret = inflateEnd(©); assert(ret == Z_OK); + err = 9; /* don't care next time around */ + have += strm.avail_in; + strm.avail_in = step > have ? have : step; + have -= strm.avail_in; + } while (strm.avail_in); + free(in); + free(out); + ret = inflateReset2(&strm, -8); assert(ret == Z_OK); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, what); +} + +/* cover all of the lines in inflate.c up to inflate() */ +local void cover_support(void) +{ + int ret; + z_stream strm; + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); assert(ret == Z_OK); + mem_used(&strm, "inflate init"); + ret = inflatePrime(&strm, 5, 31); assert(ret == Z_OK); + ret = inflatePrime(&strm, -1, 0); assert(ret == Z_OK); + ret = inflateSetDictionary(&strm, Z_NULL, 0); + assert(ret == Z_STREAM_ERROR); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "prime"); + + inf("63 0", "force window allocation", 0, -15, 1, Z_OK); + inf("63 18 5", "force window replacement", 0, -8, 259, Z_OK); + inf("63 18 68 30 d0 0 0", "force split window update", 4, -8, 259, Z_OK); + inf("3 0", "use fixed blocks", 0, -15, 1, Z_STREAM_END); + inf("", "bad window size", 0, 1, 0, Z_STREAM_ERROR); + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit_(&strm, ZLIB_VERSION - 1, (int)sizeof(z_stream)); + assert(ret == Z_VERSION_ERROR); + mem_done(&strm, "wrong version"); + + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); assert(ret == Z_OK); + ret = inflateEnd(&strm); assert(ret == Z_OK); + fputs("inflate built-in memory routines\n", stderr); +} + +/* cover all inflate() header and trailer cases and code after inflate() */ +local void cover_wrap(void) +{ + int ret; + z_stream strm, copy; + unsigned char dict[257]; + + ret = inflate(Z_NULL, 0); assert(ret == Z_STREAM_ERROR); + ret = inflateEnd(Z_NULL); assert(ret == Z_STREAM_ERROR); + ret = inflateCopy(Z_NULL, Z_NULL); assert(ret == Z_STREAM_ERROR); + fputs("inflate bad parameters\n", stderr); + + inf("1f 8b 0 0", "bad gzip method", 0, 31, 0, Z_DATA_ERROR); + inf("1f 8b 8 80", "bad gzip flags", 0, 31, 0, Z_DATA_ERROR); + inf("77 85", "bad zlib method", 0, 15, 0, Z_DATA_ERROR); + inf("8 99", "set window size from header", 0, 0, 0, Z_OK); + inf("78 9c", "bad zlib window size", 0, 8, 0, Z_DATA_ERROR); + inf("78 9c 63 0 0 0 1 0 1", "check adler32", 0, 15, 1, Z_STREAM_END); + inf("1f 8b 8 1e 0 0 0 0 0 0 1 0 0 0 0 0 0", "bad header crc", 0, 47, 1, + Z_DATA_ERROR); + inf("1f 8b 8 2 0 0 0 0 0 0 1d 26 3 0 0 0 0 0 0 0 0 0", "check gzip length", + 0, 47, 0, Z_STREAM_END); + inf("78 90", "bad zlib header check", 0, 47, 0, Z_DATA_ERROR); + inf("8 b8 0 0 0 1", "need dictionary", 0, 8, 0, Z_NEED_DICT); + inf("78 9c 63 0", "compute adler32", 0, 15, 1, Z_OK); + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -8); + strm.avail_in = 2; + strm.next_in = (void *)"\x63"; + strm.avail_out = 1; + strm.next_out = (void *)&ret; + mem_limit(&strm, 1); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + memset(dict, 0, 257); + ret = inflateSetDictionary(&strm, dict, 257); + assert(ret == Z_OK); + mem_limit(&strm, (sizeof(struct inflate_state) << 1) + 256); + ret = inflatePrime(&strm, 16, 0); assert(ret == Z_OK); + strm.avail_in = 2; + strm.next_in = (void *)"\x80"; + ret = inflateSync(&strm); assert(ret == Z_DATA_ERROR); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_STREAM_ERROR); + strm.avail_in = 4; + strm.next_in = (void *)"\0\0\xff\xff"; + ret = inflateSync(&strm); assert(ret == Z_OK); + (void)inflateSyncPoint(&strm); + ret = inflateCopy(©, &strm); assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + ret = inflateUndermine(&strm, 1); assert(ret == Z_DATA_ERROR); + (void)inflateMark(&strm); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "miscellaneous, force memory errors"); +} + +/* input and output functions for inflateBack() */ +local unsigned pull(void *desc, unsigned char **buf) +{ + static unsigned int next = 0; + static unsigned char dat[] = {0x63, 0, 2, 0}; + struct inflate_state *state; + + if (desc == Z_NULL) { + next = 0; + return 0; /* no input (already provided at next_in) */ + } + state = (void *)((z_stream *)desc)->state; + if (state != Z_NULL) + state->mode = SYNC; /* force an otherwise impossible situation */ + return next < sizeof(dat) ? (*buf = dat + next++, 1) : 0; +} + +local int push(void *desc, unsigned char *buf, unsigned len) +{ + buf += len; + return desc != Z_NULL; /* force error if desc not null */ +} + +/* cover inflateBack() up to common deflate data cases and after those */ +local void cover_back(void) +{ + int ret; + z_stream strm; + unsigned char win[32768]; + + ret = inflateBackInit_(Z_NULL, 0, win, 0, 0); + assert(ret == Z_VERSION_ERROR); + ret = inflateBackInit(Z_NULL, 0, win); assert(ret == Z_STREAM_ERROR); + ret = inflateBack(Z_NULL, Z_NULL, Z_NULL, Z_NULL, Z_NULL); + assert(ret == Z_STREAM_ERROR); + ret = inflateBackEnd(Z_NULL); assert(ret == Z_STREAM_ERROR); + fputs("inflateBack bad parameters\n", stderr); + + mem_setup(&strm); + ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + strm.avail_in = 2; + strm.next_in = (void *)"\x03"; + ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL); + assert(ret == Z_STREAM_END); + /* force output error */ + strm.avail_in = 3; + strm.next_in = (void *)"\x63\x00"; + ret = inflateBack(&strm, pull, Z_NULL, push, &strm); + assert(ret == Z_BUF_ERROR); + /* force mode error by mucking with state */ + ret = inflateBack(&strm, pull, &strm, push, Z_NULL); + assert(ret == Z_STREAM_ERROR); + ret = inflateBackEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "inflateBack bad state"); + + ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + ret = inflateBackEnd(&strm); assert(ret == Z_OK); + fputs("inflateBack built-in memory routines\n", stderr); +} + +/* do a raw inflate of data in hexadecimal with both inflate and inflateBack */ +local int try(char *hex, char *id, int err) +{ + int ret; + unsigned len, size; + unsigned char *in, *out, *win; + char *prefix; + z_stream strm; + + /* convert to hex */ + in = h2b(hex, &len); + assert(in != NULL); + + /* allocate work areas */ + size = len << 3; + out = malloc(size); + assert(out != NULL); + win = malloc(32768); + assert(win != NULL); + prefix = malloc(strlen(id) + 6); + assert(prefix != NULL); + + /* first with inflate */ + strcpy(prefix, id); + strcat(prefix, "-late"); + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, err < 0 ? 47 : -15); + assert(ret == Z_OK); + strm.avail_in = len; + strm.next_in = in; + do { + strm.avail_out = size; + strm.next_out = out; + ret = inflate(&strm, Z_TREES); + assert(ret != Z_STREAM_ERROR && ret != Z_MEM_ERROR); + if (ret == Z_DATA_ERROR || ret == Z_NEED_DICT) + break; + } while (strm.avail_in || strm.avail_out == 0); + if (err) { + assert(ret == Z_DATA_ERROR); + assert(strcmp(id, strm.msg) == 0); + } + inflateEnd(&strm); + mem_done(&strm, prefix); + + /* then with inflateBack */ + if (err >= 0) { + strcpy(prefix, id); + strcat(prefix, "-back"); + mem_setup(&strm); + ret = inflateBackInit(&strm, 15, win); + assert(ret == Z_OK); + strm.avail_in = len; + strm.next_in = in; + ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL); + assert(ret != Z_STREAM_ERROR); + if (err) { + assert(ret == Z_DATA_ERROR); + assert(strcmp(id, strm.msg) == 0); + } + inflateBackEnd(&strm); + mem_done(&strm, prefix); + } + + /* clean up */ + free(prefix); + free(win); + free(out); + free(in); + return ret; +} + +/* cover deflate data cases in both inflate() and inflateBack() */ +local void cover_inflate(void) +{ + try("0 0 0 0 0", "invalid stored block lengths", 1); + try("3 0", "fixed", 0); + try("6", "invalid block type", 1); + try("1 1 0 fe ff 0", "stored", 0); + try("fc 0 0", "too many length or distance symbols", 1); + try("4 0 fe ff", "invalid code lengths set", 1); + try("4 0 24 49 0", "invalid bit length repeat", 1); + try("4 0 24 e9 ff ff", "invalid bit length repeat", 1); + try("4 0 24 e9 ff 6d", "invalid code -- missing end-of-block", 1); + try("4 80 49 92 24 49 92 24 71 ff ff 93 11 0", + "invalid literal/lengths set", 1); + try("4 80 49 92 24 49 92 24 f b4 ff ff c3 84", "invalid distances set", 1); + try("4 c0 81 8 0 0 0 0 20 7f eb b 0 0", "invalid literal/length code", 1); + try("2 7e ff ff", "invalid distance code", 1); + try("c c0 81 0 0 0 0 0 90 ff 6b 4 0", "invalid distance too far back", 1); + + /* also trailer mismatch just in inflate() */ + try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 1", "incorrect data check", -1); + try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1", + "incorrect length check", -1); + try("5 c0 21 d 0 0 0 80 b0 fe 6d 2f 91 6c", "pull 17", 0); + try("5 e0 81 91 24 cb b2 2c 49 e2 f 2e 8b 9a 47 56 9f fb fe ec d2 ff 1f", + "long code", 0); + try("ed c0 1 1 0 0 0 40 20 ff 57 1b 42 2c 4f", "length extra", 0); + try("ed cf c1 b1 2c 47 10 c4 30 fa 6f 35 1d 1 82 59 3d fb be 2e 2a fc f c", + "long distance and extra", 0); + try("ed c0 81 0 0 0 0 80 a0 fd a9 17 a9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6", "window end", 0); + inf("2 8 20 80 0 3 0", "inflate_fast TYPE return", 0, -15, 258, + Z_STREAM_END); + inf("63 18 5 40 c 0", "window wrap", 3, -8, 300, Z_OK); +} + +/* cover remaining lines in inftrees.c */ +local void cover_trees(void) +{ + int ret; + unsigned bits; + unsigned short lens[16], work[16]; + code *next, table[ENOUGH_DISTS]; + + /* we need to call inflate_table() directly in order to manifest not- + enough errors, since zlib insures that enough is always enough */ + for (bits = 0; bits < 15; bits++) + lens[bits] = (unsigned short)(bits + 1); + lens[15] = 15; + next = table; + bits = 15; + ret = inflate_table(DISTS, lens, 16, &next, &bits, work); + assert(ret == 1); + next = table; + bits = 1; + ret = inflate_table(DISTS, lens, 16, &next, &bits, work); + assert(ret == 1); + fputs("inflate_table not enough errors\n", stderr); +} + +/* cover remaining inffast.c decoding and window copying */ +local void cover_fast(void) +{ + inf("e5 e0 81 ad 6d cb b2 2c c9 01 1e 59 63 ae 7d ee fb 4d fd b5 35 41 68" + " ff 7f 0f 0 0 0", "fast length extra bits", 0, -8, 258, Z_DATA_ERROR); + inf("25 fd 81 b5 6d 59 b6 6a 49 ea af 35 6 34 eb 8c b9 f6 b9 1e ef 67 49" + " 50 fe ff ff 3f 0 0", "fast distance extra bits", 0, -8, 258, + Z_DATA_ERROR); + inf("3 7e 0 0 0 0 0", "fast invalid distance code", 0, -8, 258, + Z_DATA_ERROR); + inf("1b 7 0 0 0 0 0", "fast invalid literal/length code", 0, -8, 258, + Z_DATA_ERROR); + inf("d c7 1 ae eb 38 c 4 41 a0 87 72 de df fb 1f b8 36 b1 38 5d ff ff 0", + "fast 2nd level codes and too far back", 0, -8, 258, Z_DATA_ERROR); + inf("63 18 5 8c 10 8 0 0 0 0", "very common case", 0, -8, 259, Z_OK); + inf("63 60 60 18 c9 0 8 18 18 18 26 c0 28 0 29 0 0 0", + "contiguous and wrap around window", 6, -8, 259, Z_OK); + inf("63 0 3 0 0 0 0 0", "copy direct from output", 0, -8, 259, + Z_STREAM_END); +} + +int main(void) +{ + fprintf(stderr, "%s\n", zlibVersion()); + cover_support(); + cover_wrap(); + cover_back(); + cover_inflate(); + cover_trees(); + cover_fast(); + return 0; +} diff --git a/lib/libz/minigzip.c b/lib/libz/test/minigzip.c similarity index 73% rename from lib/libz/minigzip.c rename to lib/libz/test/minigzip.c index 9825ccc3a71..aa7ac7a0494 100644 --- a/lib/libz/minigzip.c +++ b/lib/libz/test/minigzip.c @@ -1,5 +1,5 @@ /* minigzip.c -- simulate gzip using the zlib compression library - * Copyright (C) 1995-2006, 2010 Jean-loup Gailly. + * Copyright (C) 1995-2006, 2010, 2011 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -138,6 +138,197 @@ static void pwinerror (s) # define local #endif +#ifdef Z_SOLO +/* for Z_SOLO, create simplified gz* functions using deflate and inflate */ + +#if defined(Z_HAVE_UNISTD_H) || defined(Z_LARGE) +# include /* for unlink() */ +#endif + +void *myalloc OF((void *, unsigned, unsigned)); +void myfree OF((void *, void *)); + +void *myalloc(q, n, m) + void *q; + unsigned n, m; +{ + q = Z_NULL; + return calloc(n, m); +} + +void myfree(q, p) + void *q, *p; +{ + q = Z_NULL; + free(p); +} + +typedef struct gzFile_s { + FILE *file; + int write; + int err; + char *msg; + z_stream strm; +} *gzFile; + +gzFile gzopen OF((const char *, const char *)); +gzFile gzdopen OF((int, const char *)); +gzFile gz_open OF((const char *, int, const char *)); + +gzFile gzopen(path, mode) +const char *path; +const char *mode; +{ + return gz_open(path, -1, mode); +} + +gzFile gzdopen(fd, mode) +int fd; +const char *mode; +{ + return gz_open(NULL, fd, mode); +} + +gzFile gz_open(path, fd, mode) + const char *path; + int fd; + const char *mode; +{ + gzFile gz; + int ret; + + gz = malloc(sizeof(struct gzFile_s)); + if (gz == NULL) + return NULL; + gz->write = strchr(mode, 'w') != NULL; + gz->strm.zalloc = myalloc; + gz->strm.zfree = myfree; + gz->strm.opaque = Z_NULL; + if (gz->write) + ret = deflateInit2(&(gz->strm), -1, 8, 15 + 16, 8, 0); + else { + gz->strm.next_in = 0; + gz->strm.avail_in = Z_NULL; + ret = inflateInit2(&(gz->strm), 15 + 16); + } + if (ret != Z_OK) { + free(gz); + return NULL; + } + gz->file = path == NULL ? fdopen(fd, gz->write ? "wb" : "rb") : + fopen(path, gz->write ? "wb" : "rb"); + if (gz->file == NULL) { + gz->write ? deflateEnd(&(gz->strm)) : inflateEnd(&(gz->strm)); + free(gz); + return NULL; + } + gz->err = 0; + gz->msg = ""; + return gz; +} + +int gzwrite OF((gzFile, const void *, unsigned)); + +int gzwrite(gz, buf, len) + gzFile gz; + const void *buf; + unsigned len; +{ + z_stream *strm; + unsigned char out[BUFLEN]; + + if (gz == NULL || !gz->write) + return 0; + strm = &(gz->strm); + strm->next_in = (void *)buf; + strm->avail_in = len; + do { + strm->next_out = out; + strm->avail_out = BUFLEN; + (void)deflate(strm, Z_NO_FLUSH); + fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); + } while (strm->avail_out == 0); + return len; +} + +int gzread OF((gzFile, void *, unsigned)); + +int gzread(gz, buf, len) + gzFile gz; + void *buf; + unsigned len; +{ + int ret; + unsigned got; + unsigned char in[1]; + z_stream *strm; + + if (gz == NULL || gz->write) + return 0; + if (gz->err) + return 0; + strm = &(gz->strm); + strm->next_out = (void *)buf; + strm->avail_out = len; + do { + got = fread(in, 1, 1, gz->file); + if (got == 0) + break; + strm->next_in = in; + strm->avail_in = 1; + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_DATA_ERROR) { + gz->err = Z_DATA_ERROR; + gz->msg = strm->msg; + return 0; + } + if (ret == Z_STREAM_END) + inflateReset(strm); + } while (strm->avail_out); + return len - strm->avail_out; +} + +int gzclose OF((gzFile)); + +int gzclose(gz) + gzFile gz; +{ + z_stream *strm; + unsigned char out[BUFLEN]; + + if (gz == NULL) + return Z_STREAM_ERROR; + strm = &(gz->strm); + if (gz->write) { + strm->next_in = Z_NULL; + strm->avail_in = 0; + do { + strm->next_out = out; + strm->avail_out = BUFLEN; + (void)deflate(strm, Z_FINISH); + fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); + } while (strm->avail_out == 0); + deflateEnd(strm); + } + else + inflateEnd(strm); + fclose(gz->file); + free(gz); + return Z_OK; +} + +const char *gzerror OF((gzFile, int *)); + +const char *gzerror(gz, err) + gzFile gz; + int *err; +{ + *err = gz->err; + return gz->msg; +} + +#endif + char *prog; void error OF((const char *msg)); diff --git a/lib/libz/trees.c b/lib/libz/trees.c index 56e9bb1c115..8c32b214b1d 100644 --- a/lib/libz/trees.c +++ b/lib/libz/trees.c @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2010 Jean-loup Gailly + * Copyright (C) 1995-2012 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -74,11 +74,6 @@ local const uch bl_order[BL_CODES] * probability, to avoid transmitting the lengths for unused bit length codes. */ -#define Buf_size (8 * 2*sizeof(char)) -/* Number of bits used within bi_buf. (bi_buf might be implemented on - * more than 16 bits on some systems.) - */ - /* =========================================================================== * Local data. These are initialized only once. */ @@ -399,7 +394,6 @@ void ZLIB_INTERNAL _tr_init(s) s->bi_buf = 0; s->bi_valid = 0; - s->last_eob_len = 8; /* enough lookahead for inflate */ #ifdef DEBUG s->compressed_len = 0L; s->bits_sent = 0L; @@ -882,16 +876,18 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ } +/* =========================================================================== + * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) + */ +void ZLIB_INTERNAL _tr_flush_bits(s) + deflate_state *s; +{ + bi_flush(s); +} + /* =========================================================================== * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. - * The current inflate code requires 9 bits of lookahead. If the - * last two codes for the previous block (real code plus EOB) were coded - * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - * the last real code. In this case we send two empty static blocks instead - * of one. (There are no problems if the previous block is stored or fixed.) - * To simplify the code, we assume the worst case of last real code encoded - * on one bit only. */ void ZLIB_INTERNAL _tr_align(s) deflate_state *s; @@ -902,20 +898,6 @@ void ZLIB_INTERNAL _tr_align(s) s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); - /* Of the 10 bits for the empty block, we have already sent - * (10 - bi_valid) bits. The lookahead for the last real code (before - * the EOB of the previous block) was thus at least one plus the length - * of the EOB plus what we have just sent of the empty static block. - */ - if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; -#endif - bi_flush(s); - } - s->last_eob_len = 7; } /* =========================================================================== @@ -1118,7 +1100,6 @@ local void compress_block(s, ltree, dtree) } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); - s->last_eob_len = ltree[END_BLOCK].Len; } /* =========================================================================== @@ -1226,7 +1207,6 @@ local void copy_block(s, buf, len, header) int header; /* true if block header must be written */ { bi_windup(s); /* align on byte boundary */ - s->last_eob_len = 8; /* enough lookahead for inflate */ if (header) { put_short(s, (ush)len); diff --git a/lib/libz/zconf.h b/lib/libz/zconf.h index 4efd6b2cc81..a6f6b7e502d 100644 --- a/lib/libz/zconf.h +++ b/lib/libz/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. + * Copyright (C) 1995-2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -15,6 +15,7 @@ * this permanently in zconf.h using "./configure --zprefix". */ #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET /* all linked symbols */ # define _dist_code z__dist_code @@ -27,9 +28,11 @@ # define adler32 z_adler32 # define adler32_combine z_adler32_combine # define adler32_combine64 z_adler32_combine64 -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 @@ -40,44 +43,52 @@ # define deflateInit2_ z_deflateInit2_ # define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams +# define deflatePending z_deflatePending # define deflatePrime z_deflatePrime # define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table -# define gz_error z_gz_error -# define gz_intmax z_gz_intmax -# define gz_strwinerror z_gz_strwinerror -# define gzbuffer z_gzbuffer -# define gzclearerr z_gzclearerr -# define gzclose z_gzclose -# define gzclose_r z_gzclose_r -# define gzclose_w z_gzclose_w -# define gzdirect z_gzdirect -# define gzdopen z_gzdopen -# define gzeof z_gzeof -# define gzerror z_gzerror -# define gzflush z_gzflush -# define gzgetc z_gzgetc -# define gzgets z_gzgets -# define gzoffset z_gzoffset -# define gzoffset64 z_gzoffset64 -# define gzopen z_gzopen -# define gzopen64 z_gzopen64 -# define gzprintf z_gzprintf -# define gzputc z_gzputc -# define gzputs z_gzputs -# define gzread z_gzread -# define gzrewind z_gzrewind -# define gzseek z_gzseek -# define gzseek64 z_gzseek64 -# define gzsetparams z_gzsetparams -# define gztell z_gztell -# define gztell64 z_gztell64 -# define gzungetc z_gzungetc -# define gzwrite z_gzwrite +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif # define inflate z_inflate # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd @@ -95,13 +106,18 @@ # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table -# define uncompress z_uncompress +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif # define zError z_zError -# define zcalloc z_zcalloc -# define zcfree z_zcfree +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif # define zlibCompileFlags z_zlibCompileFlags # define zlibVersion z_zlibVersion @@ -111,7 +127,9 @@ # define alloc_func z_alloc_func # define charf z_charf # define free_func z_free_func -# define gzFile z_gzFile +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif # define gz_header z_gz_header # define gz_headerp z_gz_headerp # define in_func z_in_func @@ -197,6 +215,12 @@ # endif #endif +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL @@ -243,6 +267,14 @@ # endif #endif +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -356,12 +388,45 @@ typedef uLong FAR uLongf; typedef Byte *voidp; #endif +/* ./configure may #define Z_U4 here */ + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# else +# if (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# else +# if (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +# endif +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + #if 0 /* was set to #if 0 by ./configure */ # define Z_HAVE_UNISTD_H #endif +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + #ifdef STDC -# include /* for off_t */ +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#ifdef _WIN32 +# include /* for wchar_t */ #endif /* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and @@ -370,21 +435,38 @@ typedef uLong FAR uLongf; * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as * equivalently requesting no 64-bit operations */ -#if -_LARGEFILE64_SOURCE - -1 == 1 +#if defined(LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 # undef _LARGEFILE64_SOURCE #endif -#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# ifndef z_off_t -# define z_off_t off_t +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif # endif #endif -#ifndef SEEK_SET +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ @@ -402,18 +484,14 @@ typedef uLong FAR uLongf; # define z_off_t long #endif -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +#if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# define z_off64_t z_off_t -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif #endif /* MVS linker does not support external names larger than 8 bytes */ diff --git a/lib/libz/zlib.3 b/lib/libz/zlib.3 index 27adc4cd10a..79d3402b39c 100644 --- a/lib/libz/zlib.3 +++ b/lib/libz/zlib.3 @@ -1,4 +1,4 @@ -.TH ZLIB 3 "19 Apr 2010" +.TH ZLIB 3 "2 May 2012" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS @@ -36,9 +36,9 @@ All functions of the compression library are documented in the file .IR zlib.h . The distribution source includes examples of use of the library in the files -.I example.c +.I test/example.c and -.IR minigzip.c, +.IR test/minigzip.c, as well as other examples in the .IR examples/ directory. @@ -65,7 +65,7 @@ A Python interface to written by A.M. Kuchling (amk@magnet.com), is available in Python 1.5 and later versions: .IP -http://www.python.org/doc/lib/module-zlib.html +http://docs.python.org/library/zlib.html .LP .I zlib is built into @@ -95,11 +95,11 @@ http://zlib.net/ The data format used by the zlib library is described by RFC (Request for Comments) 1950 to 1952 in the files: .IP -http://www.ietf.org/rfc/rfc1950.txt (for the zlib header and trailer format) +http://tools.ietf.org/html/rfc1950 (for the zlib header and trailer format) .br -http://www.ietf.org/rfc/rfc1951.txt (for the deflate compressed data format) +http://tools.ietf.org/html/rfc1951 (for the deflate compressed data format) .br -http://www.ietf.org/rfc/rfc1952.txt (for the gzip header and trailer format) +http://tools.ietf.org/html/rfc1952 (for the gzip header and trailer format) .LP Mark Nelson wrote an article about .I zlib @@ -125,8 +125,8 @@ before asking for help. Send questions and/or comments to zlib@gzip.org, or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). .SH AUTHORS -Version 1.2.5 -Copyright (C) 1995-2010 Jean-loup Gailly (jloup@gzip.org) +Version 1.2.7 +Copyright (C) 1995-2012 Jean-loup Gailly (jloup@gzip.org) and Mark Adler (madler@alumni.caltech.edu). .LP This software is provided "as-is," diff --git a/lib/libz/zlib.h b/lib/libz/zlib.h index bfbba83e8ee..3edf3acdb57 100644 --- a/lib/libz/zlib.h +++ b/lib/libz/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.5, April 19th, 2010 + version 1.2.7, May 2nd, 2012 - Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,8 +24,8 @@ The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). */ #ifndef ZLIB_H @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.5" -#define ZLIB_VERNUM 0x1250 +#define ZLIB_VERSION "1.2.7" +#define ZLIB_VERNUM 0x1270 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 5 +#define ZLIB_VER_REVISION 7 #define ZLIB_VER_SUBREVISION 0 /* @@ -83,15 +83,15 @@ typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ + z_const Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ + uLong total_in; /* total number of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ + uLong total_out; /* total number of bytes output so far */ - char *msg; /* last error message, NULL if no error */ + z_const char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ @@ -327,8 +327,9 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); Z_FINISH can be used immediately after deflateInit if all the compression is to be done in a single step. In this case, avail_out must be at least the - value returned by deflateBound (see below). If deflate does not return - Z_STREAM_END, then it must be called again as described above. + value returned by deflateBound (see below). Then deflate is guaranteed to + return Z_STREAM_END. If not enough output space is provided, deflate will + not return Z_STREAM_END, and it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). @@ -451,23 +452,29 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; - avail_out must be large enough to hold all the uncompressed data. (The size - of the uncompressed data may have been saved by the compressor for this - purpose.) The next operation on this stream must be inflateEnd to deallocate - the decompression state. The use of Z_FINISH is never required, but can be - used to inform inflate that a faster approach may be used for the single - inflate() call. + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation - is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK or Z_TREES is used. + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the adler32 checksum of the dictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the adler32 checksum of all output produced so far (that is, + strm->adler to the Adler-32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END @@ -478,7 +485,9 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); initializing with inflateInit2(). Any information contained in the gzip header is not retained, so applications that need that information should instead use raw inflate, see inflateInit2() below, or inflateBack() and - perform their own processing of the gzip header and trailer. + perform their own processing of the gzip header and trailer. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + producted so far. The CRC-32 is checked against the gzip trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has @@ -580,10 +589,15 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any call - of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly @@ -610,8 +624,8 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, @@ -688,9 +702,29 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(), and after deflateSetHeader(), if used. This would be used to allocate an output buffer for deflation in a single pass, and so would be - called before deflate(). + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. */ +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); @@ -703,8 +737,9 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, than or equal to 16, and that many of the least significant bits of value will be inserted in the output. - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, @@ -790,10 +825,11 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called - immediately after inflateInit2() or inflateReset() and before any call of - inflate() to set the dictionary. The application must insure that the - dictionary that was used for compression is provided. + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is @@ -805,17 +841,21 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been - found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the - success case, the application may save the current current value of total_in - which indicates where valid compressed data was found. In the error case, - the application may repeatedly call inflateSync, providing more input each - time, until success or end of the input data. + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, @@ -962,7 +1002,7 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not be + the parameters are invalid, Z_MEM_ERROR if the internal state could not be allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ @@ -1088,6 +1128,7 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); 27-31: 0 (reserved) */ +#ifndef Z_SOLO /* utility functions */ @@ -1149,10 +1190,11 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. */ - /* gzip file access functions */ /* @@ -1162,7 +1204,7 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, wrapper, documented in RFC 1952, wrapped around a deflate stream. */ -typedef voidp gzFile; /* opaque gzip file descriptor */ +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); @@ -1172,13 +1214,28 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) Also "a" - can be used instead of "w" to request that the gzip stream that will be - written be appended to the file. "+" will result in an error, since reading - and writing to the same gzip file is not supported. + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. gzopen returns NULL if the file could not be opened, if there was insufficient memory to allocate the gzFile state, or if an invalid mode was @@ -1197,7 +1254,11 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, mode);. The duplicated descriptor should be saved to avoid a leak, since - gzdopen does not close fd if it fails. + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. gzdopen returns NULL if there was insufficient memory to allocate the gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not @@ -1235,14 +1296,26 @@ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If - the input file was not in gzip format, gzread copies the given number of - bytes into the buffer. + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. After reaching the end of a gzip stream in the input, gzread will continue - to read, looking for another gzip stream, or failing that, reading the rest - of the input file directly without decompression. The entire input file - will be read if gzread is called until it returns less than the requested - len. + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. gzread returns the number of uncompressed bytes actually read, less than len for end of file, or -1 for error. @@ -1256,7 +1329,7 @@ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, error. */ -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); /* Converts, formats, and writes the arguments to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of @@ -1301,7 +1374,10 @@ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 - in case of end of file or error. + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); @@ -1397,9 +1473,7 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* Returns true (1) if file is being copied directly while reading, or false - (0) if file is a gzip stream being decompressed. This state can change from - false to true while reading the input file if the end of a gzip stream is - reached, but is followed by data that is not another gzip stream. + (0) if file is a gzip stream being decompressed. If the input file is empty, gzdirect() will return true, since the input does not contain a gzip stream. @@ -1408,6 +1482,13 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); cause buffers to be allocated to allow reading the file to determine if it is a gzip file. Therefore if gzbuffer() is used, it should be called before gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); @@ -1419,7 +1500,8 @@ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); must not be called more than once on the same allocation. gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a - file operation error, or Z_OK on success. + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. */ ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); @@ -1457,6 +1539,7 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); file that is being written concurrently. */ +#endif /* !Z_SOLO */ /* checksum functions */ @@ -1492,16 +1575,17 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the for the crc. Pre- and post-conditioning (one's - complement) is performed within this function so it shouldn't be done by the - application. + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. Usage example: @@ -1544,17 +1628,42 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); #define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) #define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) + ZLIB_VERSION, (int)sizeof(z_stream)) + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#endif /* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if @@ -1562,7 +1671,7 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, * functions are changed to 64 bits) -- in case these are set on systems * without large file support, _LFS64_LARGEFILE must also be true */ -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +#ifdef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); @@ -1571,14 +1680,23 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); #endif -#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0 -# define gzopen gzopen64 -# define gzseek gzseek64 -# define gztell gztell64 -# define gzoffset gzoffset64 -# define adler32_combine adler32_combine64 -# define crc32_combine crc32_combine64 -# ifdef _LARGEFILE64_SOURCE +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); @@ -1595,6 +1713,13 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); #endif +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + /* hack for buggy compilers */ #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; @@ -1603,8 +1728,14 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, /* undocumented functions */ ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif #ifdef __cplusplus } diff --git a/lib/libz/zopen.c b/lib/libz/zopen.c index 025899f0dc0..822a5e1c033 100644 --- a/lib/libz/zopen.c +++ b/lib/libz/zopen.c @@ -3,7 +3,7 @@ */ #include -__FBSDID("$FreeBSD$"); +__FBSDID("$FreeBSD: head/lib/libz/zopen.c 84228 2001-09-30 22:39:00Z dillon $"); #include #include @@ -23,6 +23,12 @@ xgzwrite(void *cookie, const char *data, int size) return gzwrite(cookie, (void*)data, size); } +static int +xgzclose(void *cookie) +{ + return gzclose(cookie); +} + FILE * zopen(const char *fname, const char *mode) { @@ -31,7 +37,7 @@ zopen(const char *fname, const char *mode) return NULL; if(*mode == 'r') - return (funopen(gz, xgzread, NULL, NULL, gzclose)); + return (funopen(gz, xgzread, NULL, NULL, xgzclose)); else - return (funopen(gz, NULL, xgzwrite, NULL, gzclose)); + return (funopen(gz, NULL, xgzwrite, NULL, xgzclose)); } diff --git a/lib/libz/zutil.c b/lib/libz/zutil.c index 898ed345b0e..65e0d3b72b0 100644 --- a/lib/libz/zutil.c +++ b/lib/libz/zutil.c @@ -1,11 +1,14 @@ /* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005, 2010 Jean-loup Gailly. + * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ @@ -85,27 +88,27 @@ uLong ZEXPORT zlibCompileFlags() #ifdef FASTEST flags += 1L << 21; #endif -#ifdef STDC +#if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifdef NO_vsnprintf - flags += 1L << 25; + flags += 1L << 25; # ifdef HAS_vsprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # else # ifdef HAS_vsnprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # endif #else - flags += 1L << 24; + flags += 1L << 24; # ifdef NO_snprintf - flags += 1L << 25; + flags += 1L << 25; # ifdef HAS_sprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # else # ifdef HAS_snprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # endif #endif @@ -181,6 +184,7 @@ void ZLIB_INTERNAL zmemzero(dest, len) } #endif +#ifndef Z_SOLO #ifdef SYS16BIT @@ -316,3 +320,5 @@ void ZLIB_INTERNAL zcfree (opaque, ptr) } #endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/lib/libz/zutil.h b/lib/libz/zutil.h index 258fa88799a..4e3dcc6ae9f 100644 --- a/lib/libz/zutil.h +++ b/lib/libz/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. + * Copyright (C) 1995-2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -13,7 +13,7 @@ #ifndef ZUTIL_H #define ZUTIL_H -#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +#ifdef HAVE_HIDDEN # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) #else # define ZLIB_INTERNAL @@ -21,7 +21,7 @@ #include "zlib.h" -#ifdef STDC +#if defined(STDC) && !defined(Z_SOLO) # if !(defined(_WIN32_WCE) && defined(_MSC_VER)) # include # endif @@ -29,6 +29,10 @@ # include #endif +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + #ifndef local # define local static #endif @@ -78,16 +82,18 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) # define OS_CODE 0x00 -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include # endif -# else /* MSC or DJGPP */ -# include # endif #endif @@ -107,18 +113,20 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #ifdef OS2 # define OS_CODE 0x06 -# ifdef M_I86 +# if defined(M_I86) && !defined(Z_SOLO) # include # endif #endif #if defined(MACOS) || defined(TARGET_OS_MAC) # define OS_CODE 0x07 -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif # endif # endif #endif @@ -153,14 +161,14 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # endif #endif -#if defined(__BORLANDC__) +#if defined(__BORLANDC__) && !defined(MSDOS) #pragma warn -8004 #pragma warn -8008 #pragma warn -8066 #endif /* provide prototypes for these when building zlib without LFS */ -#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 +#if !defined(_WIN32) && (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); #endif @@ -177,42 +185,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* functions */ -#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#if defined(__CYGWIN__) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#ifndef HAVE_VSNPRINTF -# ifdef MSDOS - /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), - but for now we just assume it doesn't. */ -# define NO_vsnprintf -# endif -# ifdef __TURBOC__ -# define NO_vsnprintf -# endif -# ifdef WIN32 - /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ -# if !defined(vsnprintf) && !defined(NO_vsnprintf) -# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) -# define vsnprintf _vsnprintf -# endif -# endif -# endif -# ifdef __SASC -# define NO_vsnprintf -# endif -#endif -#ifdef VMS -# define NO_vsnprintf -#endif - -#if defined(pyr) +#if defined(pyr) || defined(Z_SOLO) # define NO_MEMCPY #endif #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) @@ -261,14 +234,19 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define Tracecv(c,x) #endif - -voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, - unsigned size)); -void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + #endif /* ZUTIL_H */ diff --git a/lib/msun/man/cexp.3 b/lib/msun/man/cexp.3 index 407284cebf8..59bb1cdc36a 100644 --- a/lib/msun/man/cexp.3 +++ b/lib/msun/man/cexp.3 @@ -48,7 +48,7 @@ functions compute the complex exponential of .Fa z , also known as .Em cis Ns ( Ns -.Fa z Ns ) +.Fa z Ns ) . .Sh RETURN VALUES For real numbers .Fa x diff --git a/lib/msun/man/complex.3 b/lib/msun/man/complex.3 index a8d9f950e4e..4c4dd68054e 100644 --- a/lib/msun/man/complex.3 +++ b/lib/msun/man/complex.3 @@ -111,7 +111,7 @@ The functions described here conform to .St -isoC-99 . .Sh BUGS -The inverse trigonmetric and hyperbolic functions +The inverse trigonometric and hyperbolic functions .Fn cacos , .Fn cacosh , .Fn casin , diff --git a/lib/msun/src/math.h b/lib/msun/src/math.h index 9389ddaf793..cf345835e77 100644 --- a/lib/msun/src/math.h +++ b/lib/msun/src/math.h @@ -395,35 +395,15 @@ float significandf(float); * long double versions of ISO/POSIX math functions */ #if __ISO_C_VISIBLE >= 1999 -#if _DECLARE_C99_LDBL_MATH -long double acoshl(long double); -#endif long double acosl(long double); -#if _DECLARE_C99_LDBL_MATH -long double asinhl(long double); -#endif long double asinl(long double); long double atan2l(long double, long double); -#if _DECLARE_C99_LDBL_MATH -long double atanhl(long double); -#endif long double atanl(long double); long double cbrtl(long double); long double ceill(long double); long double copysignl(long double, long double) __pure2; -#if _DECLARE_C99_LDBL_MATH -long double coshl(long double); -#endif long double cosl(long double); -#if _DECLARE_C99_LDBL_MATH -long double erfcl(long double); -long double erfl(long double); -#endif long double exp2l(long double); -#if _DECLARE_C99_LDBL_MATH -long double expl(long double); -long double expm1l(long double); -#endif long double fabsl(long double) __pure2; long double fdiml(long double, long double); long double floorl(long double); @@ -435,20 +415,9 @@ long double frexpl(long double value, int *); /* fundamentally !__pure2 */ long double hypotl(long double, long double); int ilogbl(long double) __pure2; long double ldexpl(long double, int); -#if _DECLARE_C99_LDBL_MATH -long double lgammal(long double); -#endif long long llrintl(long double); long long llroundl(long double); -#if _DECLARE_C99_LDBL_MATH -long double log10l(long double); -long double log1pl(long double); -long double log2l(long double); -#endif long double logbl(long double); -#if _DECLARE_C99_LDBL_MATH -long double logl(long double); -#endif long lrintl(long double); long lroundl(long double); long double modfl(long double, long double *); /* fundamentally !__pure2 */ @@ -458,30 +427,54 @@ long double nextafterl(long double, long double); double nexttoward(double, long double); float nexttowardf(float, long double); long double nexttowardl(long double, long double); -#if _DECLARE_C99_LDBL_MATH -long double powl(long double, long double); -#endif long double remainderl(long double, long double); long double remquol(long double, long double, int *); long double rintl(long double); long double roundl(long double); long double scalblnl(long double, long); long double scalbnl(long double, int); -#if _DECLARE_C99_LDBL_MATH -long double sinhl(long double); -#endif long double sinl(long double); long double sqrtl(long double); -#if _DECLARE_C99_LDBL_MATH -long double tanhl(long double); -#endif long double tanl(long double); -#if _DECLARE_C99_LDBL_MATH -long double tgammal(long double); -#endif long double truncl(long double); #endif /* __ISO_C_VISIBLE >= 1999 */ __END_DECLS #endif /* !_MATH_H_ */ + +/* separate header for cmath */ +#ifndef _MATH_EXTRA_H_ +#if __ISO_C_VISIBLE >= 1999 +#if _DECLARE_C99_LDBL_MATH + +#define _MATH_EXTRA_H_ + +/* + * extra long double versions of math functions for C99 and cmath + */ +__BEGIN_DECLS + +long double acoshl(long double); +long double asinhl(long double); +long double atanhl(long double); +long double coshl(long double); +long double erfcl(long double); +long double erfl(long double); +long double expl(long double); +long double expm1l(long double); +long double lgammal(long double); +long double log10l(long double); +long double log1pl(long double); +long double log2l(long double); +long double logl(long double); +long double powl(long double, long double); +long double sinhl(long double); +long double tanhl(long double); +long double tgammal(long double); + +__END_DECLS + +#endif /* !_DECLARE_C99_LDBL_MATH */ +#endif /* __ISO_C_VISIBLE >= 1999 */ +#endif /* !_MATH_EXTRA_H_ */ diff --git a/libexec/rbootd/rbootd.8 b/libexec/rbootd/rbootd.8 index cdf0412b989..79c528dca92 100644 --- a/libexec/rbootd/rbootd.8 +++ b/libexec/rbootd/rbootd.8 @@ -126,7 +126,7 @@ The following signals have the specified effect when sent to the server process using the .Xr kill 1 command: -.Bl -tag -width SIGUSR1 -offset -compact +.Bl -tag -width SIGUSR1 -offset xxxxxxxx .It SIGHUP Drop all active connections and reconfigure. .It SIGUSR1 diff --git a/libexec/rshd/rshd.8 b/libexec/rshd/rshd.8 index cd4021a8104..27f39db078e 100644 --- a/libexec/rshd/rshd.8 +++ b/libexec/rshd/rshd.8 @@ -237,7 +237,6 @@ and is not preceded by a flag byte. .Xr gethostbyaddr 3 , .Xr rcmd 3 , .Xr ruserok 3 , -.Xr auth.conf 5 , .Xr hosts 5 , .Xr hosts.equiv 5 , .Xr login.conf 5 , diff --git a/libexec/rtld-elf/amd64/reloc.c b/libexec/rtld-elf/amd64/reloc.c index 9c755bc1ecc..7b002b2817c 100644 --- a/libexec/rtld-elf/amd64/reloc.c +++ b/libexec/rtld-elf/amd64/reloc.c @@ -132,7 +132,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags, * limited amounts of stack available so we cannot use alloca(). */ if (obj != obj_rtld) { - cache = calloc(obj->nchains, sizeof(SymCache)); + cache = calloc(obj->dynsymcount, sizeof(SymCache)); /* No need to check for NULL here */ } else cache = NULL; diff --git a/libexec/rtld-elf/arm/reloc.c b/libexec/rtld-elf/arm/reloc.c index aaad2daa164..005c468af74 100644 --- a/libexec/rtld-elf/arm/reloc.c +++ b/libexec/rtld-elf/arm/reloc.c @@ -328,7 +328,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags, * The dynamic loader may be called from a thread, we have * limited amounts of stack available so we cannot use alloca(). */ - cache = calloc(obj->nchains, sizeof(SymCache)); + cache = calloc(obj->dynsymcount, sizeof(SymCache)); /* No need to check for NULL here */ rellim = (const Elf_Rel *)((caddr_t)obj->rel + obj->relsize); diff --git a/libexec/rtld-elf/i386/reloc.c b/libexec/rtld-elf/i386/reloc.c index 5f4e24721d0..58073dbaa57 100644 --- a/libexec/rtld-elf/i386/reloc.c +++ b/libexec/rtld-elf/i386/reloc.c @@ -133,7 +133,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags, * limited amounts of stack available so we cannot use alloca(). */ if (obj != obj_rtld) { - cache = calloc(obj->nchains, sizeof(SymCache)); + cache = calloc(obj->dynsymcount, sizeof(SymCache)); /* No need to check for NULL here */ } else cache = NULL; diff --git a/libexec/rtld-elf/ia64/reloc.c b/libexec/rtld-elf/ia64/reloc.c index 01e20b8f9a7..1a41cb3cf8d 100644 --- a/libexec/rtld-elf/ia64/reloc.c +++ b/libexec/rtld-elf/ia64/reloc.c @@ -104,7 +104,7 @@ alloc_fptrs(Obj_Entry *obj, bool mapped) struct fptr **fptrs; size_t fbytes; - fbytes = obj->nchains * sizeof(struct fptr *); + fbytes = obj->dynsymcount * sizeof(struct fptr *); /* * Avoid malloc, if requested. Happens when relocating @@ -138,7 +138,7 @@ free_fptrs(Obj_Entry *obj, bool mapped) if (fptrs == NULL) return; - fbytes = obj->nchains * sizeof(struct fptr *); + fbytes = obj->dynsymcount * sizeof(struct fptr *); if (mapped) munmap(fptrs, fbytes); else @@ -348,7 +348,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags, const Elf_Rela *relalim; const Elf_Rela *rela; SymCache *cache; - int bytes = obj->nchains * sizeof(SymCache); + int bytes = obj->dynsymcount * sizeof(SymCache); int r = -1; /* diff --git a/libexec/rtld-elf/libmap.c b/libexec/rtld-elf/libmap.c index cf867030591..1efc8bc5de5 100644 --- a/libexec/rtld-elf/libmap.c +++ b/libexec/rtld-elf/libmap.c @@ -2,11 +2,13 @@ * $FreeBSD$ */ +#include #include #include #include #include #include +#include #include #include #include @@ -39,9 +41,17 @@ struct lmp { TAILQ_ENTRY(lmp) lmp_link; }; +static TAILQ_HEAD(lmc_list, lmc) lmc_head = TAILQ_HEAD_INITIALIZER(lmc_head); +struct lmc { + char *path; + TAILQ_ENTRY(lmc) next; +}; + static int lm_count; static void lmc_parse(char *, size_t); +static void lmc_parse_file(char *); +static void lmc_parse_dir(char *); static void lm_add(const char *, const char *, const char *); static void lm_free(struct lm_list *); static char *lml_find(struct lm_list *, const char *); @@ -61,37 +71,13 @@ static const char *quickbasename(const char *); int lm_init(char *libmap_override) { - struct stat st; - char *lm_map, *p; - int fd; + char *p; dbg("lm_init(\"%s\")", libmap_override); TAILQ_INIT(&lmp_head); - fd = open(_PATH_LIBMAP_CONF, O_RDONLY); - if (fd == -1) { - dbg("lm_init: open(\"%s\") failed, %s", _PATH_LIBMAP_CONF, - rtld_strerror(errno)); - goto override; - } - if (fstat(fd, &st) == -1) { - close(fd); - dbg("lm_init: fstat(\"%s\") failed, %s", _PATH_LIBMAP_CONF, - rtld_strerror(errno)); - goto override; - } - lm_map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (lm_map == (const char *)MAP_FAILED) { - close(fd); - dbg("lm_init: mmap(\"%s\") failed, %s", _PATH_LIBMAP_CONF, - rtld_strerror(errno)); - goto override; - } - close(fd); - lmc_parse(lm_map, st.st_size); - munmap(lm_map, st.st_size); + lmc_parse_file(_PATH_LIBMAP_CONF); -override: if (libmap_override) { /* * Do some character replacement to make $LIBMAP look @@ -115,15 +101,117 @@ override: return (lm_count == 0); } +static void +lmc_parse_file(char *path) +{ + struct lmc *p; + struct stat st; + int fd; + char *rpath; + char *lm_map; + + rpath = realpath(path, NULL); + if (rpath == NULL) + return; + + TAILQ_FOREACH(p, &lmc_head, next) { + if (strcmp(p->path, rpath) == 0) { + free(rpath); + return; + } + } + + fd = open(rpath, O_RDONLY); + if (fd == -1) { + dbg("lm_parse_file: open(\"%s\") failed, %s", rpath, + rtld_strerror(errno)); + free(rpath); + return; + } + if (fstat(fd, &st) == -1) { + close(fd); + dbg("lm_parse_file: fstat(\"%s\") failed, %s", rpath, + rtld_strerror(errno)); + free(rpath); + return; + } + lm_map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (lm_map == (const char *)MAP_FAILED) { + close(fd); + dbg("lm_parse_file: mmap(\"%s\") failed, %s", rpath, + rtld_strerror(errno)); + free(rpath); + return; + } + close(fd); + p = xmalloc(sizeof(struct lmc)); + p->path = rpath; + TAILQ_INSERT_HEAD(&lmc_head, p, next); + lmc_parse(lm_map, st.st_size); + munmap(lm_map, st.st_size); +} + +static void +lmc_parse_dir(char *idir) +{ + DIR *d; + struct dirent *dp; + struct lmc *p; + char conffile[MAXPATHLEN]; + char *ext; + char *rpath; + + rpath = realpath(idir, NULL); + if (rpath == NULL) + return; + + TAILQ_FOREACH(p, &lmc_head, next) { + if (strcmp(p->path, rpath) == 0) { + free(rpath); + return; + } + } + d = opendir(idir); + if (d == NULL) { + free(rpath); + return; + } + + p = xmalloc(sizeof(struct lmc)); + p->path = rpath; + TAILQ_INSERT_HEAD(&lmc_head, p, next); + + while ((dp = readdir(d)) != NULL) { + if (dp->d_ino == 0) + continue; + if (dp->d_type != DT_REG) + continue; + ext = strrchr(dp->d_name, '.'); + if (ext == NULL) + continue; + if (strcmp(ext, ".conf") != 0) + continue; + if (strlcpy(conffile, idir, MAXPATHLEN) >= MAXPATHLEN) + continue; /* too long */ + if (strlcat(conffile, "/", MAXPATHLEN) >= MAXPATHLEN) + continue; /* too long */ + if (strlcat(conffile, dp->d_name, MAXPATHLEN) >= MAXPATHLEN) + continue; /* too long */ + lmc_parse_file(conffile); + } + closedir(d); +} + static void lmc_parse(char *lm_p, size_t lm_len) { char *cp, *f, *t, *c, *p; char prog[MAXPATHLEN]; - char line[MAXPATHLEN + 2]; + /* allow includedir + full length path */ + char line[MAXPATHLEN + 13]; size_t cnt; int i; - + cnt = 0; p = NULL; while (cnt < lm_len) { @@ -181,7 +269,8 @@ lmc_parse(char *lm_p, size_t lm_len) while(rtld_isspace(*cp)) cp++; if (!iseol(*cp)) continue; - strcpy(prog, c); + if (strlcpy(prog, c, sizeof prog) >= sizeof prog) + continue; p = prog; continue; } @@ -207,7 +296,12 @@ lmc_parse(char *lm_p, size_t lm_len) if (!iseol(*cp)) continue; *cp = '\0'; - lm_add(p, f, t); + if (strcmp(f, "includedir") == 0) + lmc_parse_dir(t); + else if (strcmp(f, "include") == 0) + lmc_parse_file(t); + else + lm_add(p, f, t); } } @@ -232,9 +326,17 @@ void lm_fini (void) { struct lmp *lmp; + struct lmc *p; dbg("%s()", __func__); + while (!TAILQ_EMPTY(&lmc_head)) { + p = TAILQ_FIRST(&lmc_head); + TAILQ_REMOVE(&lmc_head, p, next); + free(p->path); + free(p); + } + while (!TAILQ_EMPTY(&lmp_head)) { lmp = TAILQ_FIRST(&lmp_head); TAILQ_REMOVE(&lmp_head, lmp, lmp_link); diff --git a/libexec/rtld-elf/map_object.c b/libexec/rtld-elf/map_object.c index d74ef155449..509a64f48bc 100644 --- a/libexec/rtld-elf/map_object.c +++ b/libexec/rtld-elf/map_object.c @@ -38,7 +38,7 @@ #include "debug.h" #include "rtld.h" -static Elf_Ehdr *get_elf_header (int, const char *); +static Elf_Ehdr *get_elf_header(int, const char *); static int convert_prot(int); /* Elf flags -> mmap protection */ static int convert_flags(int); /* Elf flags -> mmap flags */ @@ -121,7 +121,7 @@ map_object(int fd, const char *path, const struct stat *sb) if ((segs[nsegs]->p_align & (PAGE_SIZE - 1)) != 0) { _rtld_error("%s: PT_LOAD segment %d not page-aligned", path, nsegs); - return NULL; + goto error; } break; @@ -161,12 +161,12 @@ map_object(int fd, const char *path, const struct stat *sb) } if (phdyn == NULL) { _rtld_error("%s: object is not dynamically-linked", path); - return NULL; + goto error; } if (nsegs < 0) { _rtld_error("%s: too few PT_LOAD segments", path); - return NULL; + goto error; } /* @@ -183,13 +183,12 @@ map_object(int fd, const char *path, const struct stat *sb) if (mapbase == (caddr_t) -1) { _rtld_error("%s: mmap of entire address space failed: %s", path, rtld_strerror(errno)); - return NULL; + goto error; } if (base_addr != NULL && mapbase != base_addr) { _rtld_error("%s: mmap returned wrong address: wanted %p, got %p", path, base_addr, mapbase); - munmap(mapbase, mapsize); - return NULL; + goto error1; } for (i = 0; i <= nsegs; i++) { @@ -201,10 +200,10 @@ map_object(int fd, const char *path, const struct stat *sb) data_prot = convert_prot(segs[i]->p_flags); data_flags = convert_flags(segs[i]->p_flags) | MAP_FIXED; if (mmap(data_addr, data_vlimit - data_vaddr, data_prot, - data_flags, fd, data_offset) == (caddr_t) -1) { + data_flags | MAP_PREFAULT_READ, fd, data_offset) == (caddr_t) -1) { _rtld_error("%s: mmap of data failed: %s", path, rtld_strerror(errno)); - return NULL; + goto error1; } /* Do BSS setup */ @@ -221,7 +220,7 @@ map_object(int fd, const char *path, const struct stat *sb) mprotect(clear_page, PAGE_SIZE, data_prot|PROT_WRITE)) { _rtld_error("%s: mprotect failed: %s", path, rtld_strerror(errno)); - return NULL; + goto error1; } memset(clear_addr, 0, nclear); @@ -240,7 +239,7 @@ map_object(int fd, const char *path, const struct stat *sb) data_flags | MAP_ANON, -1, 0) == (caddr_t)-1) { _rtld_error("%s: mmap of bss failed: %s", path, rtld_strerror(errno)); - return NULL; + goto error1; } } } @@ -273,7 +272,7 @@ map_object(int fd, const char *path, const struct stat *sb) if (obj->phdr == NULL) { obj_free(obj); _rtld_error("%s: cannot allocate program header", path); - return NULL; + goto error1; } memcpy((char *)obj->phdr, (char *)hdr + hdr->e_phoff, phsize); obj->phdr_alloc = true; @@ -293,63 +292,72 @@ map_object(int fd, const char *path, const struct stat *sb) obj->relro_page = obj->relocbase + trunc_page(relro_page); obj->relro_size = round_page(relro_size); - return obj; + munmap(hdr, PAGE_SIZE); + return (obj); + +error1: + munmap(mapbase, mapsize); +error: + munmap(hdr, PAGE_SIZE); + return (NULL); } static Elf_Ehdr * -get_elf_header (int fd, const char *path) +get_elf_header(int fd, const char *path) { - static union { - Elf_Ehdr hdr; - char buf[PAGE_SIZE]; - } u; - ssize_t nbytes; + Elf_Ehdr *hdr; - if ((nbytes = pread(fd, u.buf, PAGE_SIZE, 0)) == -1) { - _rtld_error("%s: read error: %s", path, rtld_strerror(errno)); - return NULL; - } + hdr = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE | MAP_PREFAULT_READ, + fd, 0); + if (hdr == (Elf_Ehdr *)MAP_FAILED) { + _rtld_error("%s: read error: %s", path, rtld_strerror(errno)); + return (NULL); + } - /* Make sure the file is valid */ - if (nbytes < (ssize_t)sizeof(Elf_Ehdr) || !IS_ELF(u.hdr)) { - _rtld_error("%s: invalid file format", path); - return NULL; - } - if (u.hdr.e_ident[EI_CLASS] != ELF_TARG_CLASS - || u.hdr.e_ident[EI_DATA] != ELF_TARG_DATA) { - _rtld_error("%s: unsupported file layout", path); - return NULL; - } - if (u.hdr.e_ident[EI_VERSION] != EV_CURRENT - || u.hdr.e_version != EV_CURRENT) { - _rtld_error("%s: unsupported file version", path); - return NULL; - } - if (u.hdr.e_type != ET_EXEC && u.hdr.e_type != ET_DYN) { - _rtld_error("%s: unsupported file type", path); - return NULL; - } - if (u.hdr.e_machine != ELF_TARG_MACH) { - _rtld_error("%s: unsupported machine", path); - return NULL; - } + /* Make sure the file is valid */ + if (!IS_ELF(*hdr)) { + _rtld_error("%s: invalid file format", path); + goto error; + } + if (hdr->e_ident[EI_CLASS] != ELF_TARG_CLASS || + hdr->e_ident[EI_DATA] != ELF_TARG_DATA) { + _rtld_error("%s: unsupported file layout", path); + goto error; + } + if (hdr->e_ident[EI_VERSION] != EV_CURRENT || + hdr->e_version != EV_CURRENT) { + _rtld_error("%s: unsupported file version", path); + goto error; + } + if (hdr->e_type != ET_EXEC && hdr->e_type != ET_DYN) { + _rtld_error("%s: unsupported file type", path); + goto error; + } + if (hdr->e_machine != ELF_TARG_MACH) { + _rtld_error("%s: unsupported machine", path); + goto error; + } - /* - * We rely on the program header being in the first page. This is - * not strictly required by the ABI specification, but it seems to - * always true in practice. And, it simplifies things considerably. - */ - if (u.hdr.e_phentsize != sizeof(Elf_Phdr)) { - _rtld_error( - "%s: invalid shared object: e_phentsize != sizeof(Elf_Phdr)", path); - return NULL; - } - if (u.hdr.e_phoff + u.hdr.e_phnum * sizeof(Elf_Phdr) > (size_t)nbytes) { - _rtld_error("%s: program header too large", path); - return NULL; - } + /* + * We rely on the program header being in the first page. This is + * not strictly required by the ABI specification, but it seems to + * always true in practice. And, it simplifies things considerably. + */ + if (hdr->e_phentsize != sizeof(Elf_Phdr)) { + _rtld_error( + "%s: invalid shared object: e_phentsize != sizeof(Elf_Phdr)", path); + goto error; + } + if (hdr->e_phoff + hdr->e_phnum * sizeof(Elf_Phdr) > + (size_t)PAGE_SIZE) { + _rtld_error("%s: program header too large", path); + goto error; + } + return (hdr); - return (&u.hdr); +error: + munmap(hdr, PAGE_SIZE); + return (NULL); } void diff --git a/libexec/rtld-elf/powerpc/reloc.c b/libexec/rtld-elf/powerpc/reloc.c index 40a19ea213f..838cfe6f515 100644 --- a/libexec/rtld-elf/powerpc/reloc.c +++ b/libexec/rtld-elf/powerpc/reloc.c @@ -299,7 +299,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags, * limited amounts of stack available so we cannot use alloca(). */ if (obj != obj_rtld) { - cache = calloc(obj->nchains, sizeof(SymCache)); + cache = calloc(obj->dynsymcount, sizeof(SymCache)); /* No need to check for NULL here */ } else cache = NULL; diff --git a/libexec/rtld-elf/powerpc64/reloc.c b/libexec/rtld-elf/powerpc64/reloc.c index 92df83d1183..b13500f5b43 100644 --- a/libexec/rtld-elf/powerpc64/reloc.c +++ b/libexec/rtld-elf/powerpc64/reloc.c @@ -287,7 +287,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags, const Elf_Rela *relalim; const Elf_Rela *rela; SymCache *cache; - int bytes = obj->nchains * sizeof(SymCache); + int bytes = obj->dynsymcount * sizeof(SymCache); int r = -1; /* diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index 1def8549408..723ba7cb65f 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -1,7 +1,8 @@ /*- * Copyright 1996, 1997, 1998, 1999, 2000 John D. Polstra. * Copyright 2003 Alexander Kabaev . - * Copyright 2009, 2010, 2011 Konstantin Belousov . + * Copyright 2009-2012 Konstantin Belousov . + * Copyright 2012 John Marino . * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -116,6 +117,10 @@ static void objlist_push_head(Objlist *, Obj_Entry *); static void objlist_push_tail(Objlist *, Obj_Entry *); static void objlist_remove(Objlist *, Obj_Entry *); static void *path_enumerate(const char *, path_enum_proc, void *); +static int relocate_object_dag(Obj_Entry *root, bool bind_now, + Obj_Entry *rtldobj, int flags, RtldLockState *lockstate); +static int relocate_object(Obj_Entry *obj, bool bind_now, Obj_Entry *rtldobj, + int flags, RtldLockState *lockstate); static int relocate_objects(Obj_Entry *, bool, Obj_Entry *, int, RtldLockState *); static int resolve_objects_ifunc(Obj_Entry *first, bool bind_now, @@ -132,7 +137,8 @@ static int symlook_global(SymLook *, DoneList *); static void symlook_init_from_req(SymLook *, const SymLook *); static int symlook_list(SymLook *, const Objlist *, DoneList *); static int symlook_needed(SymLook *, const Needed_Entry *, DoneList *); -static int symlook_obj1(SymLook *, const Obj_Entry *); +static int symlook_obj1_sysv(SymLook *, const Obj_Entry *); +static int symlook_obj1_gnu(SymLook *, const Obj_Entry *); static void trace_loaded_objects(Obj_Entry *); static void unlink_object(Obj_Entry *); static void unload_object(Obj_Entry *); @@ -149,6 +155,9 @@ static int object_match_name(const Obj_Entry *, const char *); static void ld_utrace_log(int, void *, void *, size_t, int, const char *); static void rtld_fill_dl_phdr_info(const Obj_Entry *obj, struct dl_phdr_info *phdr_info); +static uint32_t gnu_hash(const char *); +static bool matched_symbol(SymLook *, const Obj_Entry *, Sym_Match_Result *, + const unsigned long); void r_debug_state(struct r_debug *, struct link_map *) __noinline; @@ -485,6 +494,9 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp) } digest_dynamic(obj_main, 0); + dbg("%s valid_hash_sysv %d valid_hash_gnu %d dynsymcount %d", + obj_main->path, obj_main->valid_hash_sysv, obj_main->valid_hash_gnu, + obj_main->dynsymcount); linkmap_add(obj_main); linkmap_add(&obj_rtld); @@ -822,6 +834,11 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath, Needed_Entry **needed_tail = &obj->needed; Needed_Entry **needed_filtees_tail = &obj->needed_filtees; Needed_Entry **needed_aux_filtees_tail = &obj->needed_aux_filtees; + const Elf_Hashelt *hashtab; + const Elf32_Word *hashval; + Elf32_Word bkt, nmaskwords; + int bloom_size32; + bool nmw_power2; int plttype = DT_REL; *dyn_rpath = NULL; @@ -911,12 +928,35 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath, case DT_HASH: { - const Elf_Hashelt *hashtab = (const Elf_Hashelt *) - (obj->relocbase + dynp->d_un.d_ptr); + hashtab = (const Elf_Hashelt *)(obj->relocbase + + dynp->d_un.d_ptr); obj->nbuckets = hashtab[0]; obj->nchains = hashtab[1]; obj->buckets = hashtab + 2; obj->chains = obj->buckets + obj->nbuckets; + obj->valid_hash_sysv = obj->nbuckets > 0 && obj->nchains > 0 && + obj->buckets != NULL; + } + break; + + case DT_GNU_HASH: + { + hashtab = (const Elf_Hashelt *)(obj->relocbase + + dynp->d_un.d_ptr); + obj->nbuckets_gnu = hashtab[0]; + obj->symndx_gnu = hashtab[1]; + nmaskwords = hashtab[2]; + bloom_size32 = (__ELF_WORD_SIZE / 32) * nmaskwords; + /* Number of bitmask words is required to be power of 2 */ + nmw_power2 = ((nmaskwords & (nmaskwords - 1)) == 0); + obj->maskwords_bm_gnu = nmaskwords - 1; + obj->shift2_gnu = hashtab[3]; + obj->bloom_gnu = (Elf_Addr *) (hashtab + 4); + obj->buckets_gnu = hashtab + 4 + bloom_size32; + obj->chain_zero_gnu = obj->buckets_gnu + obj->nbuckets_gnu - + obj->symndx_gnu; + obj->valid_hash_gnu = nmw_power2 && obj->nbuckets_gnu > 0 && + obj->buckets_gnu != NULL; } break; @@ -1093,6 +1133,22 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath, obj->pltrelasize = obj->pltrelsize; obj->pltrelsize = 0; } + + /* Determine size of dynsym table (equal to nchains of sysv hash) */ + if (obj->valid_hash_sysv) + obj->dynsymcount = obj->nchains; + else if (obj->valid_hash_gnu) { + obj->dynsymcount = 0; + for (bkt = 0; bkt < obj->nbuckets_gnu; bkt++) { + if (obj->buckets_gnu[bkt] == 0) + continue; + hashval = &obj->chain_zero_gnu[obj->buckets_gnu[bkt]]; + do + obj->dynsymcount++; + while ((*hashval++ & 1u) == 0); + } + obj->dynsymcount += obj->symndx_gnu; + } } static void @@ -1308,6 +1364,22 @@ elf_hash(const char *name) return h; } +/* + * The GNU hash function is the Daniel J. Bernstein hash clipped to 32 bits + * unsigned in case it's implemented with a wider type. + */ +static uint32_t +gnu_hash(const char *s) +{ + uint32_t h; + unsigned char c; + + h = 5381; + for (c = *s; c != '\0'; c = *++s) + h = h * 33 + c; + return (h & 0xffffffff); +} + /* * Find the library with the given name, and return its full pathname. * The returned string is dynamically allocated. Generates an error @@ -1384,7 +1456,7 @@ find_symdef(unsigned long symnum, const Obj_Entry *refobj, * If we have already found this symbol, get the information from * the cache. */ - if (symnum >= refobj->nchains) + if (symnum >= refobj->dynsymcount) return NULL; /* Bad object */ if (cache != NULL && cache[symnum].sym != NULL) { *defobj_out = cache[symnum].obj; @@ -1882,6 +1954,8 @@ do_load_object(int fd, const char *name, char *path, struct stat *sbp, object_add_name(obj, name); obj->path = path; digest_dynamic(obj, 0); + dbg("%s valid_hash_sysv %d valid_hash_gnu %d dynsymcount %d", obj->path, + obj->valid_hash_sysv, obj->valid_hash_gnu, obj->dynsymcount); if (obj->z_noopen && (flags & (RTLD_LO_DLOPEN | RTLD_LO_TRACE)) == RTLD_LO_DLOPEN) { dbg("refusing to load non-loadable \"%s\"", obj->path); @@ -2147,52 +2221,70 @@ objlist_remove(Objlist *list, Obj_Entry *obj) } /* - * Relocate newly-loaded shared objects. The argument is a pointer to - * the Obj_Entry for the first such object. All objects from the first - * to the end of the list of objects are relocated. Returns 0 on success, - * or -1 on failure. + * Relocate dag rooted in the specified object. + * Returns 0 on success, or -1 on failure. */ + static int -relocate_objects(Obj_Entry *first, bool bind_now, Obj_Entry *rtldobj, +relocate_object_dag(Obj_Entry *root, bool bind_now, Obj_Entry *rtldobj, + int flags, RtldLockState *lockstate) +{ + Objlist_Entry *elm; + int error; + + error = 0; + STAILQ_FOREACH(elm, &root->dagmembers, link) { + error = relocate_object(elm->obj, bind_now, rtldobj, flags, + lockstate); + if (error == -1) + break; + } + return (error); +} + +/* + * Relocate single object. + * Returns 0 on success, or -1 on failure. + */ +static int +relocate_object(Obj_Entry *obj, bool bind_now, Obj_Entry *rtldobj, int flags, RtldLockState *lockstate) { - Obj_Entry *obj; - for (obj = first; obj != NULL; obj = obj->next) { if (obj->relocated) - continue; + return (0); obj->relocated = true; if (obj != rtldobj) - dbg("relocating \"%s\"", obj->path); + dbg("relocating \"%s\"", obj->path); - if (obj->nbuckets == 0 || obj->nchains == 0 || obj->buckets == NULL || - obj->symtab == NULL || obj->strtab == NULL) { - _rtld_error("%s: Shared object has no run-time symbol table", - obj->path); - return -1; + if (obj->symtab == NULL || obj->strtab == NULL || + !(obj->valid_hash_sysv || obj->valid_hash_gnu)) { + _rtld_error("%s: Shared object has no run-time symbol table", + obj->path); + return (-1); } if (obj->textrel) { - /* There are relocations to the write-protected text segment. */ - if (mprotect(obj->mapbase, obj->textsize, - PROT_READ|PROT_WRITE|PROT_EXEC) == -1) { - _rtld_error("%s: Cannot write-enable text segment: %s", - obj->path, rtld_strerror(errno)); - return -1; - } + /* There are relocations to the write-protected text segment. */ + if (mprotect(obj->mapbase, obj->textsize, + PROT_READ|PROT_WRITE|PROT_EXEC) == -1) { + _rtld_error("%s: Cannot write-enable text segment: %s", + obj->path, rtld_strerror(errno)); + return (-1); + } } /* Process the non-PLT relocations. */ if (reloc_non_plt(obj, rtldobj, flags, lockstate)) - return -1; + return (-1); if (obj->textrel) { /* Re-protected the text segment. */ - if (mprotect(obj->mapbase, obj->textsize, - PROT_READ|PROT_EXEC) == -1) { - _rtld_error("%s: Cannot write-protect text segment: %s", - obj->path, rtld_strerror(errno)); - return -1; - } + if (mprotect(obj->mapbase, obj->textsize, + PROT_READ|PROT_EXEC) == -1) { + _rtld_error("%s: Cannot write-protect text segment: %s", + obj->path, rtld_strerror(errno)); + return (-1); + } } @@ -2201,18 +2293,19 @@ relocate_objects(Obj_Entry *first, bool bind_now, Obj_Entry *rtldobj, /* Process the PLT relocations. */ if (reloc_plt(obj) == -1) - return -1; + return (-1); /* Relocate the jump slots if we are doing immediate binding. */ if (obj->bind_now || bind_now) - if (reloc_jmpslots(obj, flags, lockstate) == -1) - return -1; + if (reloc_jmpslots(obj, flags, lockstate) == -1) + return (-1); if (obj->relro_size > 0) { - if (mprotect(obj->relro_page, obj->relro_size, PROT_READ) == -1) { - _rtld_error("%s: Cannot enforce relro protection: %s", - obj->path, rtld_strerror(errno)); - return -1; - } + if (mprotect(obj->relro_page, obj->relro_size, + PROT_READ) == -1) { + _rtld_error("%s: Cannot enforce relro protection: %s", + obj->path, rtld_strerror(errno)); + return (-1); + } } /* @@ -2222,9 +2315,30 @@ relocate_objects(Obj_Entry *first, bool bind_now, Obj_Entry *rtldobj, */ obj->magic = RTLD_MAGIC; obj->version = RTLD_VERSION; - } - return (0); + return (0); +} + +/* + * Relocate newly-loaded shared objects. The argument is a pointer to + * the Obj_Entry for the first such object. All objects from the first + * to the end of the list of objects are relocated. Returns 0 on success, + * or -1 on failure. + */ +static int +relocate_objects(Obj_Entry *first, bool bind_now, Obj_Entry *rtldobj, + int flags, RtldLockState *lockstate) +{ + Obj_Entry *obj; + int error; + + for (error = 0, obj = first; obj != NULL; obj = obj->next) { + error = relocate_object(obj, bind_now, rtldobj, flags, + lockstate); + if (error == -1) + break; + } + return (error); } /* @@ -2544,10 +2658,10 @@ dlopen_object(const char *name, int fd, Obj_Entry *refobj, int lo_flags, result = rtld_verify_versions(&obj->dagmembers); if (result != -1 && ld_tracing) goto trace; - if (result == -1 || (relocate_objects(obj, - (mode & RTLD_MODEMASK) == RTLD_NOW, &obj_rtld, + if (result == -1 || relocate_object_dag(obj, + (mode & RTLD_MODEMASK) == RTLD_NOW, &obj_rtld, (lo_flags & RTLD_LO_EARLY) ? SYMLOOK_EARLY : 0, - lockstate)) == -1) { + lockstate) == -1) { dlopen_cleanup(obj); obj = NULL; } else if (lo_flags & RTLD_LO_EARLY) { @@ -2838,7 +2952,7 @@ dladdr(const void *addr, Dl_info *info) * Walk the symbol list looking for the symbol whose address is * closest to the address sent in. */ - for (symoffset = 0; symoffset < obj->nchains; symoffset++) { + for (symoffset = 0; symoffset < obj->dynsymcount; symoffset++) { def = obj->symtab + symoffset; /* @@ -3409,7 +3523,17 @@ symlook_obj(SymLook *req, const Obj_Entry *obj) SymLook req1; int flags, res, mres; - mres = symlook_obj1(req, obj); + /* + * If there is at least one valid hash at this point, we prefer to + * use the faster GNU version if available. + */ + if (obj->valid_hash_gnu) + mres = symlook_obj1_gnu(req, obj); + else if (obj->valid_hash_sysv) + mres = symlook_obj1_sysv(req, obj); + else + return (EINVAL); + if (mres == 0) { if (obj->needed_filtees != NULL) { flags = (req->flags & SYMLOOK_EARLY) ? RTLD_LO_EARLY : 0; @@ -3439,28 +3563,15 @@ symlook_obj(SymLook *req, const Obj_Entry *obj) return (mres); } -static int -symlook_obj1(SymLook *req, const Obj_Entry *obj) +/* Symbol match routine common to both hash functions */ +static bool +matched_symbol(SymLook *req, const Obj_Entry *obj, Sym_Match_Result *result, + const unsigned long symnum) { - unsigned long symnum; - const Elf_Sym *vsymp; - Elf_Versym verndx; - int vcount; - - if (obj->buckets == NULL) - return (ESRCH); - - vsymp = NULL; - vcount = 0; - symnum = obj->buckets[req->hash % obj->nbuckets]; - - for (; symnum != STN_UNDEF; symnum = obj->chains[symnum]) { + Elf_Versym verndx; const Elf_Sym *symp; const char *strp; - if (symnum >= obj->nchains) - return (ESRCH); /* Bad object */ - symp = obj->symtab + symnum; strp = obj->strtab + symp->st_name; @@ -3468,103 +3579,183 @@ symlook_obj1(SymLook *req, const Obj_Entry *obj) case STT_FUNC: case STT_NOTYPE: case STT_OBJECT: + case STT_COMMON: case STT_GNU_IFUNC: - if (symp->st_value == 0) - continue; + if (symp->st_value == 0) + return (false); /* fallthrough */ case STT_TLS: - if (symp->st_shndx != SHN_UNDEF) - break; + if (symp->st_shndx != SHN_UNDEF) + break; #ifndef __mips__ - else if (((req->flags & SYMLOOK_IN_PLT) == 0) && - (ELF_ST_TYPE(symp->st_info) == STT_FUNC)) - break; + else if (((req->flags & SYMLOOK_IN_PLT) == 0) && + (ELF_ST_TYPE(symp->st_info) == STT_FUNC)) + break; /* fallthrough */ #endif default: - continue; + return (false); } if (req->name[0] != strp[0] || strcmp(req->name, strp) != 0) - continue; + return (false); if (req->ventry == NULL) { - if (obj->versyms != NULL) { - verndx = VER_NDX(obj->versyms[symnum]); - if (verndx > obj->vernum) { - _rtld_error("%s: symbol %s references wrong version %d", - obj->path, obj->strtab + symnum, verndx); - continue; + if (obj->versyms != NULL) { + verndx = VER_NDX(obj->versyms[symnum]); + if (verndx > obj->vernum) { + _rtld_error( + "%s: symbol %s references wrong version %d", + obj->path, obj->strtab + symnum, verndx); + return (false); + } + /* + * If we are not called from dlsym (i.e. this + * is a normal relocation from unversioned + * binary), accept the symbol immediately if + * it happens to have first version after this + * shared object became versioned. Otherwise, + * if symbol is versioned and not hidden, + * remember it. If it is the only symbol with + * this name exported by the shared object, it + * will be returned as a match by the calling + * function. If symbol is global (verndx < 2) + * accept it unconditionally. + */ + if ((req->flags & SYMLOOK_DLSYM) == 0 && + verndx == VER_NDX_GIVEN) { + result->sym_out = symp; + return (true); + } + else if (verndx >= VER_NDX_GIVEN) { + if ((obj->versyms[symnum] & VER_NDX_HIDDEN) + == 0) { + if (result->vsymp == NULL) + result->vsymp = symp; + result->vcount++; + } + return (false); + } } - /* - * If we are not called from dlsym (i.e. this is a normal - * relocation from unversioned binary), accept the symbol - * immediately if it happens to have first version after - * this shared object became versioned. Otherwise, if - * symbol is versioned and not hidden, remember it. If it - * is the only symbol with this name exported by the - * shared object, it will be returned as a match at the - * end of the function. If symbol is global (verndx < 2) - * accept it unconditionally. - */ - if ((req->flags & SYMLOOK_DLSYM) == 0 && - verndx == VER_NDX_GIVEN) { - req->sym_out = symp; - req->defobj_out = obj; - return (0); - } - else if (verndx >= VER_NDX_GIVEN) { - if ((obj->versyms[symnum] & VER_NDX_HIDDEN) == 0) { - if (vsymp == NULL) - vsymp = symp; - vcount ++; - } - continue; - } - } - req->sym_out = symp; - req->defobj_out = obj; - return (0); - } else { - if (obj->versyms == NULL) { + result->sym_out = symp; + return (true); + } + if (obj->versyms == NULL) { if (object_match_name(obj, req->ventry->name)) { - _rtld_error("%s: object %s should provide version %s for " - "symbol %s", obj_rtld.path, obj->path, - req->ventry->name, obj->strtab + symnum); - continue; + _rtld_error("%s: object %s should provide version %s " + "for symbol %s", obj_rtld.path, obj->path, + req->ventry->name, obj->strtab + symnum); + return (false); } - } else { + } else { verndx = VER_NDX(obj->versyms[symnum]); if (verndx > obj->vernum) { - _rtld_error("%s: symbol %s references wrong version %d", - obj->path, obj->strtab + symnum, verndx); - continue; + _rtld_error("%s: symbol %s references wrong version %d", + obj->path, obj->strtab + symnum, verndx); + return (false); } if (obj->vertab[verndx].hash != req->ventry->hash || strcmp(obj->vertab[verndx].name, req->ventry->name)) { - /* - * Version does not match. Look if this is a global symbol - * and if it is not hidden. If global symbol (verndx < 2) - * is available, use it. Do not return symbol if we are - * called by dlvsym, because dlvsym looks for a specific - * version and default one is not what dlvsym wants. - */ - if ((req->flags & SYMLOOK_DLSYM) || - (obj->versyms[symnum] & VER_NDX_HIDDEN) || - (verndx >= VER_NDX_GIVEN)) - continue; + /* + * Version does not match. Look if this is a + * global symbol and if it is not hidden. If + * global symbol (verndx < 2) is available, + * use it. Do not return symbol if we are + * called by dlvsym, because dlvsym looks for + * a specific version and default one is not + * what dlvsym wants. + */ + if ((req->flags & SYMLOOK_DLSYM) || + (verndx >= VER_NDX_GIVEN) || + (obj->versyms[symnum] & VER_NDX_HIDDEN)) + return (false); } - } - req->sym_out = symp; - req->defobj_out = obj; - return (0); } - } - if (vcount == 1) { - req->sym_out = vsymp; - req->defobj_out = obj; - return (0); - } - return (ESRCH); + result->sym_out = symp; + return (true); +} + +/* + * Search for symbol using SysV hash function. + * obj->buckets is known not to be NULL at this point; the test for this was + * performed with the obj->valid_hash_sysv assignment. + */ +static int +symlook_obj1_sysv(SymLook *req, const Obj_Entry *obj) +{ + unsigned long symnum; + Sym_Match_Result matchres; + + matchres.sym_out = NULL; + matchres.vsymp = NULL; + matchres.vcount = 0; + + for (symnum = obj->buckets[req->hash % obj->nbuckets]; + symnum != STN_UNDEF; symnum = obj->chains[symnum]) { + if (symnum >= obj->nchains) + return (ESRCH); /* Bad object */ + + if (matched_symbol(req, obj, &matchres, symnum)) { + req->sym_out = matchres.sym_out; + req->defobj_out = obj; + return (0); + } + } + if (matchres.vcount == 1) { + req->sym_out = matchres.vsymp; + req->defobj_out = obj; + return (0); + } + return (ESRCH); +} + +/* Search for symbol using GNU hash function */ +static int +symlook_obj1_gnu(SymLook *req, const Obj_Entry *obj) +{ + Elf_Addr bloom_word; + const Elf32_Word *hashval; + Elf32_Word bucket; + Sym_Match_Result matchres; + unsigned int h1, h2; + unsigned long symnum; + + matchres.sym_out = NULL; + matchres.vsymp = NULL; + matchres.vcount = 0; + + /* Pick right bitmask word from Bloom filter array */ + bloom_word = obj->bloom_gnu[(req->hash_gnu / __ELF_WORD_SIZE) & + obj->maskwords_bm_gnu]; + + /* Calculate modulus word size of gnu hash and its derivative */ + h1 = req->hash_gnu & (__ELF_WORD_SIZE - 1); + h2 = ((req->hash_gnu >> obj->shift2_gnu) & (__ELF_WORD_SIZE - 1)); + + /* Filter out the "definitely not in set" queries */ + if (((bloom_word >> h1) & (bloom_word >> h2) & 1) == 0) + return (ESRCH); + + /* Locate hash chain and corresponding value element*/ + bucket = obj->buckets_gnu[req->hash_gnu % obj->nbuckets_gnu]; + if (bucket == 0) + return (ESRCH); + hashval = &obj->chain_zero_gnu[bucket]; + do { + if (((*hashval ^ req->hash_gnu) >> 1) == 0) { + symnum = hashval - obj->chain_zero_gnu; + if (matched_symbol(req, obj, &matchres, symnum)) { + req->sym_out = matchres.sym_out; + req->defobj_out = obj; + return (0); + } + } + } while ((*hashval++ & 1) == 0); + if (matchres.vcount == 1) { + req->sym_out = matchres.vsymp; + req->defobj_out = obj; + return (0); + } + return (ESRCH); } static void @@ -4350,6 +4541,7 @@ symlook_init(SymLook *dst, const char *name) bzero(dst, sizeof(*dst)); dst->name = name; dst->hash = elf_hash(name); + dst->hash_gnu = gnu_hash(name); } static void @@ -4358,6 +4550,7 @@ symlook_init_from_req(SymLook *dst, const SymLook *src) dst->name = src->name; dst->hash = src->hash; + dst->hash_gnu = src->hash_gnu; dst->ventry = src->ventry; dst->flags = src->flags; dst->defobj_out = NULL; diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h index 6017957e80a..47389fe6efa 100644 --- a/libexec/rtld-elf/rtld.h +++ b/libexec/rtld-elf/rtld.h @@ -126,6 +126,12 @@ typedef struct Struct_Ver_Entry { const char *file; } Ver_Entry; +typedef struct Struct_Sym_Match_Result { + const Elf_Sym *sym_out; + const Elf_Sym *vsymp; + int vcount; +} Sym_Match_Result; + #define VER_INFO_HIDDEN 0x01 /* @@ -204,7 +210,16 @@ typedef struct Struct_Obj_Entry { const Elf_Hashelt *buckets; /* Hash table buckets array */ unsigned long nbuckets; /* Number of buckets */ const Elf_Hashelt *chains; /* Hash table chain array */ - unsigned long nchains; /* Number of chains */ + unsigned long nchains; /* Number of entries in chain array */ + + Elf32_Word nbuckets_gnu; /* Number of GNU hash buckets*/ + Elf32_Word symndx_gnu; /* 1st accessible symbol on dynsym table */ + Elf32_Word maskwords_bm_gnu; /* Bloom filter words - 1 (bitmask) */ + Elf32_Word shift2_gnu; /* Bloom filter shift count */ + Elf32_Word dynsymcount; /* Total entries in dynsym table */ + Elf_Addr *bloom_gnu; /* Bloom filter used by GNU hash func */ + const Elf_Hashelt *buckets_gnu; /* GNU hash table bucket array */ + const Elf_Hashelt *chain_zero_gnu; /* GNU hash table value array (Zeroed) */ char *rpath; /* Search path specified in object */ Needed_Entry *needed; /* Shared objects needed by this one (%) */ @@ -251,6 +266,8 @@ typedef struct Struct_Obj_Entry { bool irelative : 1; /* Object has R_MACHDEP_IRELATIVE relocs */ bool gnu_ifunc : 1; /* Object has references to STT_GNU_IFUNC */ bool crt_no_init : 1; /* Object' crt does not call _init/_fini */ + bool valid_hash_sysv : 1; /* A valid System V hash hash tag is available */ + bool valid_hash_gnu : 1; /* A valid GNU hash tag is available */ struct link_map linkmap; /* For GDB and dlinfo() */ Objlist dldags; /* Object belongs to these dlopened DAGs (%) */ @@ -310,6 +327,7 @@ struct Struct_RtldLockState { typedef struct Struct_SymLook { const char *name; unsigned long hash; + uint32_t hash_gnu; const Ver_Entry *ventry; int flags; const Obj_Entry *defobj_out; diff --git a/libexec/rtld-elf/sparc64/reloc.c b/libexec/rtld-elf/sparc64/reloc.c index ce0d9459d49..21fae5c0528 100644 --- a/libexec/rtld-elf/sparc64/reloc.c +++ b/libexec/rtld-elf/sparc64/reloc.c @@ -305,7 +305,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags, * limited amounts of stack available so we cannot use alloca(). */ if (obj != obj_rtld) { - cache = calloc(obj->nchains, sizeof(SymCache)); + cache = calloc(obj->dynsymcount, sizeof(SymCache)); /* No need to check for NULL here */ } else cache = NULL; diff --git a/libexec/tftpd/Makefile b/libexec/tftpd/Makefile index 84458298d6c..f005001bbb8 100644 --- a/libexec/tftpd/Makefile +++ b/libexec/tftpd/Makefile @@ -6,6 +6,8 @@ MAN= tftpd.8 SRCS= tftp-file.c tftp-io.c tftp-options.c tftp-transfer.c tftp-utils.c SRCS+= tftpd.c WFORMAT=0 -LDFLAGS= -lwrap + +DPADD= ${LIBWRAP} +LDADD= -lwrap .include diff --git a/libexec/tftpd/tftpd.8 b/libexec/tftpd/tftpd.8 index 6944f7b340e..c06cc61b4ad 100644 --- a/libexec/tftpd/tftpd.8 +++ b/libexec/tftpd/tftpd.8 @@ -238,20 +238,16 @@ option. .Pp The following RFC's are supported: .Rs -RFC 1350 -.%T The TFTP Protocol (Revision 2) +.%T RFC 1350: The TFTP Protocol (Revision 2) .Re .Rs -RFC 2347 -.%T TFTP Option Extension +.%T RFC 2347: TFTP Option Extension .Re .Rs -RFC 2348 -.%T TFTP Blocksize Option +.%T RFC 2348: TFTP Blocksize Option .Re .Rs -RFC 2349 -.%T TFTP Timeout Interval and Transfer Size Options +.%T RFC 2349: TFTP Timeout Interval and Transfer Size Options .Re .Pp The non-standard diff --git a/release/doc/en_US.ISO8859-1/hardware/article.sgml b/release/doc/en_US.ISO8859-1/hardware/article.sgml index 3b308a70dc6..be3c0fa73c1 100644 --- a/release/doc/en_US.ISO8859-1/hardware/article.sgml +++ b/release/doc/en_US.ISO8859-1/hardware/article.sgml @@ -898,6 +898,8 @@ &hwlist.bge; + &hwlist.bxe; + &hwlist.cas; &hwlist.cdce; @@ -1057,6 +1059,8 @@ &hwlist.bwi; + &hwlist.bwn; + [&arch.i386;, &arch.amd64;] Intel PRO/Wireless 2100 MiniPCI network adapter (&man.ipw.4; driver) diff --git a/release/doc/share/misc/dev.archlist.txt b/release/doc/share/misc/dev.archlist.txt index 6403b6f391b..4892bd813f3 100644 --- a/release/doc/share/misc/dev.archlist.txt +++ b/release/doc/share/misc/dev.archlist.txt @@ -52,6 +52,7 @@ bce i386,amd64 bge i386,pc98,sparc64,ia64,amd64 bktr i386,pc98 bt i386,amd64 +bxe i386,amd64 cdce i386,pc98,ia64,amd64,powerpc ciss i386,ia64,amd64 ce i386,pc98 diff --git a/release/picobsd/build/picobsd b/release/picobsd/build/picobsd index 60cc1c3c0bb..a6cf4caa341 100755 --- a/release/picobsd/build/picobsd +++ b/release/picobsd/build/picobsd @@ -164,6 +164,7 @@ create_includes_and_libraries2() { # opt_dir opt_target log "create_includes_and_libraries2() for ${SRC} $1" if [ ${OSVERSION} -ge 600000 ] ; then no="-DNO_CLEAN -DNO_PROFILE -DNO_GAMES -DNO_LIBC_R" # WITHOUT_CDDL=1" + no="$no -DWITHOUT_CLANG" else no="-DNOCLEAN -DNOPROFILE -DNOGAMES -DNOLIBC_R" fi @@ -882,7 +883,7 @@ fill_floppy_image() { log "Compress with kgzip and copy to floppy image" mkdir -p ${dst}/boot/kernel - # XXX update loader.conf + # XXX loader.conf does not work unless we also load the .4th files echo "hint.acpi.0.disabled=\"1\"" > ${dst}/boot/loader.conf echo "console=\"comconsole\"" >> ${dst}/boot/loader.conf cp -p /boot/loader ${dst}/boot/loader || fail $? no_space "copying bootloader" diff --git a/release/picobsd/tinyware/passwd/passwd.c b/release/picobsd/tinyware/passwd/passwd.c index d24165037a5..42ebd8c1fd4 100644 --- a/release/picobsd/tinyware/passwd/passwd.c +++ b/release/picobsd/tinyware/passwd/passwd.c @@ -64,10 +64,6 @@ int yp_errno = YP_TRUE; extern int yp_passwd( char * ); #endif -#ifdef KERBEROS -#include "krb.h" -#endif - #include "extern.h" static void usage(void); @@ -81,26 +77,12 @@ main(argc, argv) { int ch; char *uname; -#ifdef KERBEROS - char *iflag = 0, *rflag = 0, *uflag = 0; - char *k; -#endif #ifdef YP -#ifdef KERBEROS - char realm[REALM_SZ]; -#define OPTIONS "d:h:lysfoi:r:u:" -#else #define OPTIONS "d:h:lysfo" -#endif -#else -#ifdef KERBEROS - char realm[REALM_SZ]; -#define OPTIONS "li:r:u:" #else #define OPTIONS "l" #endif -#endif #ifdef YP int res = 0; @@ -113,17 +95,6 @@ main(argc, argv) case 'l': /* change local password file */ use_local_passwd = 1; break; -#ifdef KERBEROS - case 'i': - iflag = optarg; - break; - case 'r': - rflag = optarg; - break; - case 'u': - uflag = optarg; - break; -#endif /* KERBEROS */ #ifdef YP case 'y': /* Change NIS password */ __use_yp = 1; @@ -182,46 +153,29 @@ main(argc, argv) /* * If NIS is turned on in the password database, use it, else punt. */ -#ifdef KERBEROS - if (__use_yp || (iflag == NULL && rflag == NULL && uflag == NULL)) { -#endif - res = use_yp(uname, 0, 0); - if (res == USER_YP_ONLY) { - if (!use_local_passwd) { - exit(yp_passwd(uname)); - } else { + res = use_yp(uname, 0, 0); + if (res == USER_YP_ONLY) { + if (!use_local_passwd) { + exit(yp_passwd(uname)); + } else { /* * Reject -l flag if NIS is turned on and the user * doesn't exist in the local password database. */ - errx(1, "unknown local user: %s", uname); - } - } else if (res == USER_LOCAL_ONLY) { - /* - * Reject -y flag if user only exists locally. - */ - if (__use_yp) - errx(1, "unknown NIS user: %s", uname); - } else if (res == USER_YP_AND_LOCAL) { - if (!use_local_passwd && (yp_in_pw_file || __use_yp)) - exit(yp_passwd(uname)); + errx(1, "unknown local user: %s", uname); } -#ifdef KERBEROS + } else if (res == USER_LOCAL_ONLY) { + /* + * Reject -y flag if user only exists locally. + */ + if (__use_yp) + errx(1, "unknown NIS user: %s", uname); + } else if (res == USER_YP_AND_LOCAL) { + if (!use_local_passwd && (yp_in_pw_file || __use_yp)) + exit(yp_passwd(uname)); } -#endif #endif - if (!use_local_passwd) { -#ifdef KERBEROS - k = auth_getval("auth_list"); - if (k && strstr(k, "kerberos")) - if(krb_get_lrealm(realm, 0) == KSUCCESS) { - setuid(getuid()); - fprintf(stderr, "realm %s\n", realm); - exit(krb_passwd(argv[0], iflag, rflag, uflag)); - } -#endif - } exit(local_passwd(uname)); } @@ -230,21 +184,10 @@ usage() { #ifdef YP -#ifdef KERBEROS - fprintf(stderr, "%s\n%s\n", - "usage: passwd [-l] [-i instance] [-r realm] [-u fullname]", - " passwd [-l] [-y] [-o] [-d domain [-h host]] [user]"); -#else (void)fprintf(stderr, "usage: passwd [-l] [-y] [-o] [-d domain [-h host]] [user]\n"); -#endif #else -#ifdef KERBEROS - fprintf(stderr, - "usage: passwd [-l] [-i instance] [-r realm] [-u fullname] [user]\n"); -#else - (void)fprintf(stderr, "usage: passwd user\n"); -#endif + (void)fprintf(stderr, "usage: passwd [-l] user\n"); #endif exit(1); } diff --git a/sbin/Makefile b/sbin/Makefile index f9ba4cae65a..fcdb5672c53 100644 --- a/sbin/Makefile +++ b/sbin/Makefile @@ -20,6 +20,7 @@ SUBDIR=adjkerntz \ dump \ dumpfs \ dumpon \ + etherswitchcfg \ ffsinfo \ fsck \ fsck_ffs \ @@ -91,6 +92,11 @@ SUBDIR+= ipfw SUBDIR+= natd .endif +.if ${MK_NAND} != "no" +SUBDIR+= nandfs +SUBDIR+= newfs_nandfs +.endif + .if ${MK_PF} != "no" SUBDIR+= pfctl SUBDIR+= pflogd diff --git a/sbin/atacontrol/atacontrol.8 b/sbin/atacontrol/atacontrol.8 index 8f4a4fc94a6..1468a012c48 100644 --- a/sbin/atacontrol/atacontrol.8 +++ b/sbin/atacontrol/atacontrol.8 @@ -367,8 +367,8 @@ You should not set a spindown timeout on a disk with or syslog logging on it as the disk will be worn out spinning down and up all the time. .Sh SEE ALSO -.Xr ata 4 -.Xr cam 4 +.Xr ata 4 , +.Xr cam 4 , .Xr camcontrol 8 .Sh HISTORY The diff --git a/sbin/camcontrol/Makefile b/sbin/camcontrol/Makefile index 0cbde1226e3..68633757c3d 100644 --- a/sbin/camcontrol/Makefile +++ b/sbin/camcontrol/Makefile @@ -3,7 +3,7 @@ PROG= camcontrol SRCS= camcontrol.c util.c .if !defined(RELEASE_CRUNCH) -SRCS+= fwdownload.c modeedit.c +SRCS+= fwdownload.c modeedit.c progress.c .else CFLAGS+= -DMINIMALISTIC .endif diff --git a/sbin/camcontrol/camcontrol.8 b/sbin/camcontrol/camcontrol.8 index fdcec66cec6..66a45eb7af1 100644 --- a/sbin/camcontrol/camcontrol.8 +++ b/sbin/camcontrol/camcontrol.8 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 24, 2011 +.Dd June 4, 2012 .Dt CAMCONTROL 8 .Os .Sh NAME @@ -175,6 +175,7 @@ .Op Fl S .Op Fl X .Op Fl c +.Op Fl p .Aq all|off|bus Ns Op :target Ns Op :lun .Nm .Ic tags @@ -496,6 +497,8 @@ is specified, .Nm will print out the number of defects given in the READ DEFECT DATA header returned from the drive. +Some drives will report 0 defects if neither the primary or grown defect +lists are requested. .It Ic modepage Allows the user to display and optionally edit a SCSI mode page. The mode @@ -737,7 +740,7 @@ Set the partial pathway timeout value, in microseconds. See the .Tn ANSI .Tn SAS -Protcol Layer (SPL) +Protocol Layer (SPL) specification for more information on this field. .It Fl a Ar enable|disable Enable or disable SATA slumber phy power conditions. @@ -796,6 +799,8 @@ Enable CAM_DEBUG_XPT printfs. Enable CAM_DEBUG_CDB printfs. This will cause the kernel to print out the SCSI CDBs sent to the specified device(s). +.It Fl p +Enable CAM_DEBUG_PROBE printfs. .It all Enable debugging for all devices. .It off @@ -1106,7 +1111,7 @@ Do not ask for confirmation. Run in simulation mode. Packet sizes that will be sent are shown, but no actual packet is sent to the device. -No confimation is asked in simulation mode. +No confirmation is asked in simulation mode. .It Fl v Besides showing sense information in case of a failure, the verbose option causes diff --git a/sbin/camcontrol/camcontrol.c b/sbin/camcontrol/camcontrol.c index 0bbb511ed72..bae654329c8 100644 --- a/sbin/camcontrol/camcontrol.c +++ b/sbin/camcontrol/camcontrol.c @@ -123,6 +123,7 @@ typedef enum { CAM_ARG_DEBUG_CDB = 0x08000000, CAM_ARG_DEBUG_XPT = 0x10000000, CAM_ARG_DEBUG_PERIPH = 0x20000000, + CAM_ARG_DEBUG_PROBE = 0x40000000, } cam_argmask; struct camcontrol_opts { @@ -176,7 +177,7 @@ static struct camcontrol_opts option_table[] = { {"tags", CAM_CMD_TAG, CAM_ARG_NONE, "N:q"}, {"negotiate", CAM_CMD_RATE, CAM_ARG_NONE, negotiate_opts}, {"rate", CAM_CMD_RATE, CAM_ARG_NONE, negotiate_opts}, - {"debug", CAM_CMD_DEBUG, CAM_ARG_NONE, "IPTSXc"}, + {"debug", CAM_CMD_DEBUG, CAM_ARG_NONE, "IPTSXcp"}, {"format", CAM_CMD_FORMAT, CAM_ARG_NONE, "qrwy"}, {"idle", CAM_CMD_IDLE, CAM_ARG_NONE, "t:"}, {"standby", CAM_CMD_STANDBY, CAM_ARG_NONE, "t:"}, @@ -456,7 +457,7 @@ getdevtree(void) case DEV_MATCH_DEVICE: { struct device_match_result *dev_result; char vendor[16], product[48], revision[16]; - char tmpstr[256]; + char fw[5], tmpstr[256]; dev_result = &ccb.cdm.matches[i].result.device_result; @@ -495,6 +496,25 @@ getdevtree(void) sizeof(revision)); sprintf(tmpstr, "<%s %s>", product, revision); + } else if (dev_result->protocol == PROTO_SEMB) { + struct sep_identify_data *sid; + + sid = (struct sep_identify_data *) + &dev_result->ident_data; + cam_strvis(vendor, sid->vendor_id, + sizeof(sid->vendor_id), + sizeof(vendor)); + cam_strvis(product, sid->product_id, + sizeof(sid->product_id), + sizeof(product)); + cam_strvis(revision, sid->product_rev, + sizeof(sid->product_rev), + sizeof(revision)); + cam_strvis(fw, sid->firmware_rev, + sizeof(sid->firmware_rev), + sizeof(fw)); + sprintf(tmpstr, "<%s %s %s %s>", + vendor, product, revision, fw); } else { sprintf(tmpstr, "<>"); } @@ -1006,11 +1026,11 @@ camxferrate(struct cam_device *device) if (sas->valid & CTS_SAS_VALID_SPEED) speed = sas->bitrate; } else if (ccb->cts.transport == XPORT_ATA) { - struct ccb_trans_settings_ata *ata = + struct ccb_trans_settings_pata *pata = &ccb->cts.xport_specific.ata; - if (ata->valid & CTS_ATA_VALID_MODE) - speed = ata_mode2speed(ata->mode); + if (pata->valid & CTS_ATA_VALID_MODE) + speed = ata_mode2speed(pata->mode); } else if (ccb->cts.transport == XPORT_SATA) { struct ccb_trans_settings_sata *sata = &ccb->cts.xport_specific.sata; @@ -1053,16 +1073,16 @@ camxferrate(struct cam_device *device) fprintf(stdout, ")"); } } else if (ccb->cts.transport == XPORT_ATA) { - struct ccb_trans_settings_ata *ata = + struct ccb_trans_settings_pata *pata = &ccb->cts.xport_specific.ata; printf(" ("); - if (ata->valid & CTS_ATA_VALID_MODE) - printf("%s, ", ata_mode2string(ata->mode)); - if ((ata->valid & CTS_ATA_VALID_ATAPI) && ata->atapi != 0) - printf("ATAPI %dbytes, ", ata->atapi); - if (ata->valid & CTS_ATA_VALID_BYTECOUNT) - printf("PIO %dbytes", ata->bytecount); + if (pata->valid & CTS_ATA_VALID_MODE) + printf("%s, ", ata_mode2string(pata->mode)); + if ((pata->valid & CTS_ATA_VALID_ATAPI) && pata->atapi != 0) + printf("ATAPI %dbytes, ", pata->atapi); + if (pata->valid & CTS_ATA_VALID_BYTECOUNT) + printf("PIO %dbytes", pata->bytecount); printf(")"); } else if (ccb->cts.transport == XPORT_SATA) { struct ccb_trans_settings_sata *sata = @@ -1779,13 +1799,14 @@ readdefects(struct cam_device *device, int argc, char **argv, union ccb *ccb = NULL; struct scsi_read_defect_data_10 *rdd_cdb; u_int8_t *defect_list = NULL; - u_int32_t dlist_length = 65000; + u_int32_t max_dlist_length = SRDD10_MAX_LENGTH, dlist_length = 0; u_int32_t returned_length = 0; u_int32_t num_returned = 0; u_int8_t returned_format; unsigned int i; int c, error = 0; - int lists_specified = 0; + int lists_specified; + int get_length = 1; while ((c = getopt(argc, argv, combinedopt)) != -1) { switch(c){ @@ -1822,20 +1843,33 @@ readdefects(struct cam_device *device, int argc, char **argv, ccb = cam_getccb(device); /* - * Hopefully 65000 bytes is enough to hold the defect list. If it - * isn't, the disk is probably dead already. We'd have to go with - * 12 byte command (i.e. alloc_length is 32 bits instead of 16) - * to hold them all. + * Eventually we should probably support the 12 byte READ DEFECT + * DATA command. It supports a longer parameter list, which may be + * necessary on newer drives with lots of defects. According to + * the SBC-3 spec, drives are supposed to return an illegal request + * if they have more defect data than will fit in 64K. */ - defect_list = malloc(dlist_length); + defect_list = malloc(max_dlist_length); if (defect_list == NULL) { warnx("can't malloc memory for defect list"); error = 1; goto defect_bailout; } + /* + * We start off asking for just the header to determine how much + * defect data is available. Some Hitachi drives return an error + * if you ask for more data than the drive has. Once we know the + * length, we retry the command with the returned length. + */ + dlist_length = sizeof(struct scsi_read_defect_data_hdr_10); + rdd_cdb =(struct scsi_read_defect_data_10 *)&ccb->csio.cdb_io.cdb_bytes; +retry: + + lists_specified = 0; + /* * cam_getccb() zeros the CCB header only. So we need to zero the * payload portion of the ccb. @@ -1897,6 +1931,51 @@ readdefects(struct cam_device *device, int argc, char **argv, returned_length = scsi_2btoul(((struct scsi_read_defect_data_hdr_10 *)defect_list)->length); + if (get_length != 0) { + get_length = 0; + + if ((ccb->ccb_h.status & CAM_STATUS_MASK) == + CAM_SCSI_STATUS_ERROR) { + struct scsi_sense_data *sense; + int error_code, sense_key, asc, ascq; + + sense = &ccb->csio.sense_data; + scsi_extract_sense_len(sense, ccb->csio.sense_len - + ccb->csio.sense_resid, &error_code, &sense_key, + &asc, &ascq, /*show_errors*/ 1); + + /* + * If the drive is reporting that it just doesn't + * support the defect list format, go ahead and use + * the length it reported. Otherwise, the length + * may not be valid, so use the maximum. + */ + if ((sense_key == SSD_KEY_RECOVERED_ERROR) + && (asc == 0x1c) && (ascq == 0x00) + && (returned_length > 0)) { + dlist_length = returned_length + + sizeof(struct scsi_read_defect_data_hdr_10); + dlist_length = min(dlist_length, + SRDD10_MAX_LENGTH); + } else + dlist_length = max_dlist_length; + } else if ((ccb->ccb_h.status & CAM_STATUS_MASK) != + CAM_REQ_CMP){ + error = 1; + warnx("Error reading defect header"); + if (arglist & CAM_ARG_VERBOSE) + cam_error_print(device, ccb, CAM_ESF_ALL, + CAM_EPF_ALL, stderr); + goto defect_bailout; + } else { + dlist_length = returned_length + + sizeof(struct scsi_read_defect_data_hdr_10); + dlist_length = min(dlist_length, SRDD10_MAX_LENGTH); + } + + goto retry; + } + returned_format = ((struct scsi_read_defect_data_hdr_10 *) defect_list)->format; @@ -2621,6 +2700,10 @@ camdebug(int argc, char **argv, char *combinedopt) arglist |= CAM_ARG_DEBUG_CDB; ccb.cdbg.flags |= CAM_DEBUG_CDB; break; + case 'p': + arglist |= CAM_ARG_DEBUG_PROBE; + ccb.cdbg.flags |= CAM_DEBUG_PROBE; + break; default: break; } @@ -2650,7 +2733,7 @@ camdebug(int argc, char **argv, char *combinedopt) ccb.cdbg.flags = CAM_DEBUG_NONE; arglist &= ~(CAM_ARG_DEBUG_INFO|CAM_ARG_DEBUG_PERIPH| CAM_ARG_DEBUG_TRACE|CAM_ARG_DEBUG_SUBTRACE| - CAM_ARG_DEBUG_XPT); + CAM_ARG_DEBUG_XPT|CAM_ARG_DEBUG_PROBE); } else if (strncmp(tstr, "all", 3) != 0) { tmpstr = (char *)strtok(tstr, ":"); if ((tmpstr != NULL) && (*tmpstr != '\0')){ @@ -2872,21 +2955,45 @@ cts_print(struct cam_device *device, struct ccb_trans_settings *cts) "enabled" : "disabled"); } } + if (cts->transport == XPORT_FC) { + struct ccb_trans_settings_fc *fc = + &cts->xport_specific.fc; + + if (fc->valid & CTS_FC_VALID_WWNN) + fprintf(stdout, "%sWWNN: 0x%llx", pathstr, + (long long) fc->wwnn); + if (fc->valid & CTS_FC_VALID_WWPN) + fprintf(stdout, "%sWWPN: 0x%llx", pathstr, + (long long) fc->wwpn); + if (fc->valid & CTS_FC_VALID_PORT) + fprintf(stdout, "%sPortID: 0x%x", pathstr, fc->port); + if (fc->valid & CTS_FC_VALID_SPEED) + fprintf(stdout, "%stransfer speed: %d.%03dMB/s\n", + pathstr, fc->bitrate / 1000, fc->bitrate % 1000); + } + if (cts->transport == XPORT_SAS) { + struct ccb_trans_settings_sas *sas = + &cts->xport_specific.sas; + + if (sas->valid & CTS_SAS_VALID_SPEED) + fprintf(stdout, "%stransfer speed: %d.%03dMB/s\n", + pathstr, sas->bitrate / 1000, sas->bitrate % 1000); + } if (cts->transport == XPORT_ATA) { - struct ccb_trans_settings_ata *ata = + struct ccb_trans_settings_pata *pata = &cts->xport_specific.ata; - if ((ata->valid & CTS_ATA_VALID_MODE) != 0) { + if ((pata->valid & CTS_ATA_VALID_MODE) != 0) { fprintf(stdout, "%sATA mode: %s\n", pathstr, - ata_mode2string(ata->mode)); + ata_mode2string(pata->mode)); } - if ((ata->valid & CTS_ATA_VALID_ATAPI) != 0) { + if ((pata->valid & CTS_ATA_VALID_ATAPI) != 0) { fprintf(stdout, "%sATAPI packet length: %d\n", pathstr, - ata->atapi); + pata->atapi); } - if ((ata->valid & CTS_ATA_VALID_BYTECOUNT) != 0) { + if ((pata->valid & CTS_ATA_VALID_BYTECOUNT) != 0) { fprintf(stdout, "%sPIO transaction length: %d\n", - pathstr, ata->bytecount); + pathstr, pata->bytecount); } } if (cts->transport == XPORT_SATA) { @@ -2922,12 +3029,22 @@ cts_print(struct cam_device *device, struct ccb_trans_settings *cts) sata->caps); } } + if (cts->protocol == PROTO_ATA) { + struct ccb_trans_settings_ata *ata= + &cts->proto_specific.ata; + + if (ata->valid & CTS_ATA_VALID_TQ) { + fprintf(stdout, "%stagged queueing: %s\n", pathstr, + (ata->flags & CTS_ATA_FLAGS_TAG_ENB) ? + "enabled" : "disabled"); + } + } if (cts->protocol == PROTO_SCSI) { struct ccb_trans_settings_scsi *scsi= &cts->proto_specific.scsi; if (scsi->valid & CTS_SCSI_VALID_TQ) { - fprintf(stdout, "%stagged queueing is %s\n", pathstr, + fprintf(stdout, "%stagged queueing: %s\n", pathstr, (scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) ? "enabled" : "disabled"); } @@ -3013,6 +3130,26 @@ get_cgd_bailout: return(retval); } +/* return the type of disk (really the command type) */ +static const char * +get_disk_type(struct cam_device *device) +{ + struct ccb_getdev cgd; + + (void) memset(&cgd, 0x0, sizeof(cgd)); + get_cgd(device, &cgd); + switch(cgd.protocol) { + case PROTO_SCSI: + return "scsi"; + case PROTO_ATA: + case PROTO_ATAPI: + case PROTO_SATAPM: + return "ata"; + default: + return "unknown"; + } +} + static void cpi_print(struct ccb_pathinq *cpi) { @@ -3365,16 +3502,19 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, if (change_settings) { int didsettings = 0; struct ccb_trans_settings_spi *spi = NULL; - struct ccb_trans_settings_ata *ata = NULL; + struct ccb_trans_settings_pata *pata = NULL; struct ccb_trans_settings_sata *sata = NULL; + struct ccb_trans_settings_ata *ata = NULL; struct ccb_trans_settings_scsi *scsi = NULL; if (ccb->cts.transport == XPORT_SPI) spi = &ccb->cts.xport_specific.spi; if (ccb->cts.transport == XPORT_ATA) - ata = &ccb->cts.xport_specific.ata; + pata = &ccb->cts.xport_specific.ata; if (ccb->cts.transport == XPORT_SATA) sata = &ccb->cts.xport_specific.sata; + if (ccb->cts.protocol == PROTO_ATA) + ata = &ccb->cts.proto_specific.ata; if (ccb->cts.protocol == PROTO_SCSI) scsi = &ccb->cts.proto_specific.scsi; ccb->cts.xport_specific.valid = 0; @@ -3385,20 +3525,30 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, spi->flags &= ~CTS_SPI_FLAGS_DISC_ENB; else spi->flags |= CTS_SPI_FLAGS_DISC_ENB; + didsettings++; } - if (scsi && tag_enable != -1) { + if (tag_enable != -1) { if ((cpi.hba_inquiry & PI_TAG_ABLE) == 0) { warnx("HBA does not support tagged queueing, " "so you cannot modify tag settings"); retval = 1; goto ratecontrol_bailout; } - scsi->valid |= CTS_SCSI_VALID_TQ; - if (tag_enable == 0) - scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB; - else - scsi->flags |= CTS_SCSI_FLAGS_TAG_ENB; - didsettings++; + if (ata) { + ata->valid |= CTS_SCSI_VALID_TQ; + if (tag_enable == 0) + ata->flags &= ~CTS_ATA_FLAGS_TAG_ENB; + else + ata->flags |= CTS_ATA_FLAGS_TAG_ENB; + didsettings++; + } else if (scsi) { + scsi->valid |= CTS_SCSI_VALID_TQ; + if (tag_enable == 0) + scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB; + else + scsi->flags |= CTS_SCSI_FLAGS_TAG_ENB; + didsettings++; + } } if (spi && offset != -1) { if ((cpi.hba_inquiry & PI_SDTR_ABLE) == 0) { @@ -3445,6 +3595,12 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, retval = 1; goto ratecontrol_bailout; } + if (!user_settings) { + warnx("You can modify only user rate " + "settings for SATA"); + retval = 1; + goto ratecontrol_bailout; + } sata->revision = ata_speed2revision(syncrate * 100); if (sata->revision < 0) { warnx("Invalid rate %f", syncrate); @@ -3454,16 +3610,22 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, sata->valid |= CTS_SATA_VALID_REVISION; didsettings++; } - if ((ata || sata) && mode != -1) { + if ((pata || sata) && mode != -1) { if ((cpi.hba_inquiry & PI_SDTR_ABLE) == 0) { warnx("HBA is not capable of changing " "transfer rates"); retval = 1; goto ratecontrol_bailout; } - if (ata) { - ata->mode = mode; - ata->valid |= CTS_ATA_VALID_MODE; + if (!user_settings) { + warnx("You can modify only user mode " + "settings for ATA/SATA"); + retval = 1; + goto ratecontrol_bailout; + } + if (pata) { + pata->mode = mode; + pata->valid |= CTS_ATA_VALID_MODE; } else { sata->mode = mode; sata->valid |= CTS_SATA_VALID_MODE; @@ -3510,11 +3672,6 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, if (didsettings == 0) { goto ratecontrol_bailout; } - if (!user_settings && (ata || sata)) { - warnx("You can modify only user settings for ATA/SATA"); - retval = 1; - goto ratecontrol_bailout; - } ccb->ccb_h.func_code = XPT_SET_TRAN_SETTINGS; if (cam_send_ccb(device, ccb) < 0) { perror("error sending XPT_SET_TRAN_SETTINGS CCB"); @@ -3546,13 +3703,10 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, fprintf(stderr, "Test Unit Ready failed\n"); goto ratecontrol_bailout; } - /* - * If the user wants things quiet, there's no sense in - * getting the transfer settings, if we're not going - * to print them. - */ - if (quiet != 0) - goto ratecontrol_bailout; + } + if ((change_settings || send_tur) && !quiet && + (ccb->cts.transport == XPORT_ATA || + ccb->cts.transport == XPORT_SATA || send_tur)) { fprintf(stdout, "New parameters:\n"); retval = get_print_cts(device, user_settings, 0, NULL); } @@ -6122,7 +6276,8 @@ main(int argc, char **argv) break; case CAM_CMD_DOWNLOAD_FW: error = fwdownload(cam_dev, argc, argv, combinedopt, - arglist & CAM_ARG_VERBOSE, retry_count, timeout); + arglist & CAM_ARG_VERBOSE, retry_count, timeout, + get_disk_type(cam_dev)); break; #endif /* MINIMALISTIC */ case CAM_CMD_USAGE: diff --git a/sbin/camcontrol/camcontrol.h b/sbin/camcontrol/camcontrol.h index 189d74c856d..adc3243d7d0 100644 --- a/sbin/camcontrol/camcontrol.h +++ b/sbin/camcontrol/camcontrol.h @@ -41,7 +41,8 @@ struct get_hook }; int fwdownload(struct cam_device *device, int argc, char **argv, - char *combinedopt, int verbose, int retry_count, int timeout); + char *combinedopt, int verbose, int retry_count, int timeout, + const char */*type*/); void mode_sense(struct cam_device *device, int mode_page, int page_control, int dbd, int retry_count, int timeout, u_int8_t *data, int datalen); diff --git a/sbin/camcontrol/fwdownload.c b/sbin/camcontrol/fwdownload.c index abb3726fa29..3ffa53083b6 100644 --- a/sbin/camcontrol/fwdownload.c +++ b/sbin/camcontrol/fwdownload.c @@ -64,6 +64,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include "progress.h" + #include "camcontrol.h" #define CMD_TIMEOUT 50000 /* 50 seconds */ @@ -73,6 +75,7 @@ typedef enum { VENDOR_HP, VENDOR_IBM, VENDOR_PLEXTOR, + VENDOR_QUALSTAR, VENDOR_QUANTUM, VENDOR_SEAGATE, VENDOR_UNKNOWN @@ -93,17 +96,43 @@ static const struct fw_vendor vendors_list[] = { {VENDOR_HP, "HP", 0x8000, 0x07, 0x07, 0, 1}, {VENDOR_IBM, "IBM", 0x8000, 0x05, 0x05, 1, 0}, {VENDOR_PLEXTOR, "PLEXTOR", 0x2000, 0x04, 0x05, 0, 1}, + {VENDOR_QUALSTAR, "QUALSTAR", 0x2030, 0x05, 0x05, 0, 0}, {VENDOR_QUANTUM, "QUANTUM", 0x2000, 0x04, 0x05, 0, 1}, {VENDOR_SEAGATE, "SEAGATE", 0x8000, 0x07, 0x07, 0, 1}, + /* the next 2 are SATA disks going through SAS HBA */ + {VENDOR_SEAGATE, "ATA ST", 0x8000, 0x07, 0x07, 0, 1}, + {VENDOR_HITACHI, "ATA HDS", 0x8000, 0x05, 0x05, 1, 0}, {VENDOR_UNKNOWN, NULL, 0x0000, 0x00, 0x00, 0, 0} }; +#ifndef ATA_DOWNLOAD_MICROCODE +#define ATA_DOWNLOAD_MICROCODE 0x92 +#endif + +#define USE_OFFSETS_FEATURE 0x3 + +#ifndef LOW_SECTOR_SIZE +#define LOW_SECTOR_SIZE 512 +#endif + +#define ATA_MAKE_LBA(o, p) \ + ((((((o) / LOW_SECTOR_SIZE) >> 8) & 0xff) << 16) | \ + ((((o) / LOW_SECTOR_SIZE) & 0xff) << 8) | \ + ((((p) / LOW_SECTOR_SIZE) >> 8) & 0xff)) + +#define ATA_MAKE_SECTORS(p) (((p) / 512) & 0xff) + +#ifndef UNKNOWN_MAX_PKT_SIZE +#define UNKNOWN_MAX_PKT_SIZE 0x8000 +#endif + static const struct fw_vendor *fw_get_vendor(struct cam_device *cam_dev); static char *fw_read_img(const char *fw_img_path, const struct fw_vendor *vp, int *num_bytes); static int fw_download_img(struct cam_device *cam_dev, const struct fw_vendor *vp, char *buf, int img_size, - int sim_mode, int verbose, int retry_count, int timeout); + int sim_mode, int verbose, int retry_count, int timeout, + const char */*name*/, const char */*type*/); /* * Find entry in vendors list that belongs to @@ -173,6 +202,9 @@ fw_read_img(const char *fw_img_path, const struct fw_vendor *vp, int *num_bytes) (img_size % 512 == 80)) skip_bytes = 80; break; + case VENDOR_QUALSTAR: + skip_bytes = img_size % 1030; + break; default: break; } @@ -207,26 +239,57 @@ bailout1: static int fw_download_img(struct cam_device *cam_dev, const struct fw_vendor *vp, char *buf, int img_size, int sim_mode, int verbose, int retry_count, - int timeout) + int timeout, const char *imgname, const char *type) { struct scsi_write_buffer cdb; + progress_t progress; + int size; union ccb *ccb; int pkt_count = 0; + int max_pkt_size; u_int32_t pkt_size = 0; char *pkt_ptr = buf; u_int32_t offset; int last_pkt = 0; + int16_t *ptr; if ((ccb = cam_getccb(cam_dev)) == NULL) { warnx("Could not allocate CCB"); return (1); } - scsi_test_unit_ready(&ccb->csio, 0, NULL, MSG_SIMPLE_Q_TAG, - SSD_FULL_SIZE, 5000); + if (strcmp(type, "scsi") == 0) { + scsi_test_unit_ready(&ccb->csio, 0, NULL, MSG_SIMPLE_Q_TAG, + SSD_FULL_SIZE, 5000); + } else if (strcmp(type, "ata") == 0) { + /* cam_getccb cleans up the header, caller has to zero the payload */ + bzero(&(&ccb->ccb_h)[1], + sizeof(struct ccb_ataio) - sizeof(struct ccb_hdr)); + + ptr = (uint16_t *)malloc(sizeof(struct ata_params)); + + if (ptr == NULL) { + cam_freeccb(ccb); + warnx("can't malloc memory for identify\n"); + return(1); + } + bzero(ptr, sizeof(struct ata_params)); + cam_fill_ataio(&ccb->ataio, + 1, + NULL, + /*flags*/CAM_DIR_IN, + MSG_SIMPLE_Q_TAG, + /*data_ptr*/(uint8_t *)ptr, + /*dxfer_len*/sizeof(struct ata_params), + timeout ? timeout : 30 * 1000); + ata_28bit_cmd(&ccb->ataio, ATA_ATA_IDENTIFY, 0, 0, 0); + } else { + warnx("weird disk type '%s'", type); + return 1; + } /* Disable freezing the device queue. */ ccb->ccb_h.flags |= CAM_DEV_QFRZDIS; if (cam_send_ccb(cam_dev, ccb) < 0) { - warnx("Error sending test unit ready"); + warnx("Error sending identify/test unit ready"); if (verbose) cam_error_print(cam_dev, ccb, CAM_ESF_ALL, CAM_EPF_ALL, stderr); @@ -241,83 +304,102 @@ fw_download_img(struct cam_device *cam_dev, const struct fw_vendor *vp, cam_freeccb(ccb); return (1); } - pkt_size = vp->max_pkt_size; - if (verbose || sim_mode) { - fprintf(stdout, - "--------------------------------------------------\n"); - fprintf(stdout, - "PktNo. PktSize BytesRemaining LastPkt\n"); - fprintf(stdout, - "--------------------------------------------------\n"); + max_pkt_size = vp->max_pkt_size; + if (vp->max_pkt_size == 0 && strcmp(type, "ata") == 0) { + max_pkt_size = UNKNOWN_MAX_PKT_SIZE; } + pkt_size = vp->max_pkt_size; + progress_init(&progress, imgname, size = img_size); /* Download single fw packets. */ do { - if (img_size <= vp->max_pkt_size) { + if (img_size <= max_pkt_size) { last_pkt = 1; pkt_size = img_size; } - if (verbose || sim_mode) - fprintf(stdout, "%3u %5u (0x%05X) %7u (0x%06X) " - "%d\n", pkt_count, pkt_size, pkt_size, - img_size - pkt_size, img_size - pkt_size, - last_pkt); + progress_update(&progress, size - img_size); + progress_draw(&progress); bzero(&cdb, sizeof(cdb)); - cdb.opcode = WRITE_BUFFER; - cdb.control = 0; - /* Parameter list length. */ - scsi_ulto3b(pkt_size, &cdb.length[0]); - offset = vp->inc_cdb_offset ? (pkt_ptr - buf) : 0; - scsi_ulto3b(offset, &cdb.offset[0]); - cdb.byte2 = last_pkt ? vp->cdb_byte2_last : vp->cdb_byte2; - cdb.buffer_id = vp->inc_cdb_buffer_id ? pkt_count : 0; - /* Zero out payload of ccb union after ccb header. */ - bzero((u_char *)ccb + sizeof(struct ccb_hdr), - sizeof(struct ccb_scsiio) - sizeof(struct ccb_hdr)); - /* Copy previously constructed cdb into ccb_scsiio struct. */ - bcopy(&cdb, &ccb->csio.cdb_io.cdb_bytes[0], - sizeof(struct scsi_write_buffer)); - /* Fill rest of ccb_scsiio struct. */ + if (strcmp(type, "scsi") == 0) { + cdb.opcode = WRITE_BUFFER; + cdb.control = 0; + /* Parameter list length. */ + scsi_ulto3b(pkt_size, &cdb.length[0]); + offset = vp->inc_cdb_offset ? (pkt_ptr - buf) : 0; + scsi_ulto3b(offset, &cdb.offset[0]); + cdb.byte2 = last_pkt ? vp->cdb_byte2_last : vp->cdb_byte2; + cdb.buffer_id = vp->inc_cdb_buffer_id ? pkt_count : 0; + /* Zero out payload of ccb union after ccb header. */ + bzero((u_char *)ccb + sizeof(struct ccb_hdr), + sizeof(struct ccb_scsiio) - sizeof(struct ccb_hdr)); + /* Copy previously constructed cdb into ccb_scsiio struct. */ + bcopy(&cdb, &ccb->csio.cdb_io.cdb_bytes[0], + sizeof(struct scsi_write_buffer)); + /* Fill rest of ccb_scsiio struct. */ + if (!sim_mode) { + cam_fill_csio(&ccb->csio, /* ccb_scsiio */ + retry_count, /* retries */ + NULL, /* cbfcnp */ + CAM_DIR_OUT | CAM_DEV_QFRZDIS, /* flags */ + CAM_TAG_ACTION_NONE, /* tag_action */ + (u_char *)pkt_ptr, /* data_ptr */ + pkt_size, /* dxfer_len */ + SSD_FULL_SIZE, /* sense_len */ + sizeof(struct scsi_write_buffer), /* cdb_len */ + timeout ? timeout : CMD_TIMEOUT); /* timeout */ + } + } else if (strcmp(type, "ata") == 0) { + bzero(&(&ccb->ccb_h)[1], + sizeof(struct ccb_ataio) - sizeof(struct ccb_hdr)); + if (!sim_mode) { + uint32_t off; + + cam_fill_ataio(&ccb->ataio, + (last_pkt) ? 256 : retry_count, + NULL, + /*flags*/CAM_DIR_OUT | CAM_DEV_QFRZDIS, + CAM_TAG_ACTION_NONE, + /*data_ptr*/(uint8_t *)pkt_ptr, + /*dxfer_len*/pkt_size, + timeout ? timeout : 30 * 1000); + off = (uint32_t)(pkt_ptr - buf); + ata_28bit_cmd(&ccb->ataio, ATA_DOWNLOAD_MICROCODE, + USE_OFFSETS_FEATURE, + ATA_MAKE_LBA(off, pkt_size), + ATA_MAKE_SECTORS(pkt_size)); + } + } if (!sim_mode) { - cam_fill_csio(&ccb->csio, /* ccb_scsiio */ - retry_count, /* retries */ - NULL, /* cbfcnp */ - CAM_DIR_OUT | CAM_DEV_QFRZDIS, /* flags */ - CAM_TAG_ACTION_NONE, /* tag_action */ - (u_char *)pkt_ptr, /* data_ptr */ - pkt_size, /* dxfer_len */ - SSD_FULL_SIZE, /* sense_len */ - sizeof(struct scsi_write_buffer), /* cdb_len */ - timeout ? timeout : CMD_TIMEOUT); /* timeout */ /* Execute the command. */ if (cam_send_ccb(cam_dev, ccb) < 0) { warnx("Error writing image to device"); if (verbose) cam_error_print(cam_dev, ccb, CAM_ESF_ALL, - CAM_EPF_ALL, stderr); + CAM_EPF_ALL, stderr); goto bailout; } + if (ccb->ataio.res.status != 0 /*&& !last_pkt*/) { + cam_error_print(cam_dev, ccb, CAM_ESF_ALL, + CAM_EPF_ALL, stderr); + } } /* Prepare next round. */ pkt_count++; pkt_ptr += pkt_size; img_size -= pkt_size; } while(!last_pkt); - if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { - if (verbose) - cam_error_print(cam_dev, ccb, CAM_ESF_ALL, - CAM_EPF_ALL, stderr); - goto bailout; - } + progress_complete(&progress, size - img_size); cam_freeccb(ccb); return (0); bailout: + progress_complete(&progress, size - img_size); cam_freeccb(ccb); return (1); } int fwdownload(struct cam_device *device, int argc, char **argv, - char *combinedopt, int verbose, int retry_count, int timeout) + char *combinedopt, int verbose, int retry_count, int timeout, + const char *type) { const struct fw_vendor *vp; char *fw_img_path = NULL; @@ -345,12 +427,13 @@ fwdownload(struct cam_device *device, int argc, char **argv, } if (fw_img_path == NULL) - errx(1, - "you must specify a firmware image file using -f option"); + errx(1, "you must specify a firmware image file using -f option"); vp = fw_get_vendor(device); - if (vp == NULL || vp->type == VENDOR_UNKNOWN) - errx(1, "Unsupported device"); + if (vp == NULL) + errx(1, "NULL vendor"); + if (vp->type == VENDOR_UNKNOWN) + warnx("Unsupported device - flashing through an HBA?"); buf = fw_read_img(fw_img_path, vp, &img_size); if (buf == NULL) @@ -360,11 +443,6 @@ fwdownload(struct cam_device *device, int argc, char **argv, fprintf(stdout, "You are about to download firmware image (%s)" " into the following device:\n", fw_img_path); - if (scsidoinquiry(device, argc, argv, combinedopt, 0, - 5000) != 0) { - warnx("Error sending inquiry"); - goto fail; - } fprintf(stdout, "\nIt may damage your drive. "); if (!get_confirmation()) goto fail; @@ -373,10 +451,11 @@ fwdownload(struct cam_device *device, int argc, char **argv, fprintf(stdout, "Running in simulation mode\n"); if (fw_download_img(device, vp, buf, img_size, sim_mode, verbose, - retry_count, timeout) != 0) { + retry_count, timeout, fw_img_path, type) != 0) { fprintf(stderr, "Firmware download failed\n"); goto fail; - } else + } + else fprintf(stdout, "Firmware download successful\n"); free(buf); diff --git a/sbin/camcontrol/progress.c b/sbin/camcontrol/progress.c new file mode 100644 index 00000000000..dc6109f4880 --- /dev/null +++ b/sbin/camcontrol/progress.c @@ -0,0 +1,186 @@ +/* $NetBSD: progressbar.c,v 1.21 2009/04/12 10:18:52 lukem Exp $ */ + +/*- + * Copyright (c) 1997-2009 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Luke Mewburn. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +__FBSDID("$FreeBSD$"); + +#include "progress.h" + +static const char * const suffixes[] = { + "", /* 2^0 (byte) */ + "KiB", /* 2^10 Kibibyte */ + "MiB", /* 2^20 Mebibyte */ + "GiB", /* 2^30 Gibibyte */ + "TiB", /* 2^40 Tebibyte */ + "PiB", /* 2^50 Pebibyte */ + "EiB", /* 2^60 Exbibyte */ +}; + +#define NSUFFIXES (sizeof(suffixes) / sizeof(suffixes[0])) +#define SECSPERHOUR (60 * 60) +#define DEFAULT_TTYWIDTH 80 + +/* initialise progress meter structure */ +int +progress_init(progress_t *prog, const char *prefix, uint64_t total) +{ + struct winsize winsize; + int oerrno = errno; + + (void) memset(prog, 0x0, sizeof(*prog)); + prog->size = total; + prog->prefix = strdup(prefix); + prog->start = time(NULL); + if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize) != -1 && + winsize.ws_col != 0) { + prog->ttywidth = winsize.ws_col; + } else { + prog->ttywidth = DEFAULT_TTYWIDTH; + } + errno = oerrno; + return 1; +} + +/* update the values in the progress meter */ +int +progress_update(progress_t *prog, uint64_t done) +{ + prog->done = done; + prog->percent = (prog->done * 100) / prog->size; + prog->now = time(NULL); + prog->elapsed = prog->now - prog->start; + if (done == 0 || prog->elapsed == 0 || prog->done / prog->elapsed == 0) { + prog->eta = 0; + } else { + prog->eta = prog->size / (prog->done / prog->elapsed) - prog->elapsed; + } + return 1; +} + +/* update the values in the progress meter */ +int +progress_reset_size(progress_t *prog, uint64_t size) +{ + prog->size = size; + return 1; +} + +/* make it look pretty at the end - display done bytes (usually total) */ +int +progress_complete(progress_t *prog, uint64_t done) +{ + progress_update(prog, done); + progress_draw(prog); + printf("\n"); + return 1; +} + +/* draw the progress meter */ +int +progress_draw(progress_t *prog) +{ +#define BAROVERHEAD 45 /* non `*' portion of progress bar */ + /* + * stars should contain at least + * sizeof(buf) - BAROVERHEAD entries + */ + static const char stars[] = +"*****************************************************************************" +"*****************************************************************************" +"*****************************************************************************"; + unsigned bytesabbrev; + unsigned bpsabbrev; + int64_t secs; + uint64_t bytespersec; + uint64_t abbrevsize; + int64_t secsleft; + size_t barlength; + size_t starc; + char hours[12]; + char buf[256]; + int len; + + barlength = MIN(sizeof(buf) - 1, (unsigned)prog->ttywidth) - BAROVERHEAD - strlen(prog->prefix); + starc = (barlength * prog->percent) / 100; + abbrevsize = prog->done; + for (bytesabbrev = 0; abbrevsize >= 100000 && bytesabbrev < NSUFFIXES; bytesabbrev++) { + abbrevsize >>= 10; + } + if (bytesabbrev == NSUFFIXES) { + bytesabbrev--; + } + bytespersec = 0; + if (prog->done > 0) { + bytespersec = prog->done; + if (prog->elapsed > 0) { + bytespersec /= prog->elapsed; + } + } + for (bpsabbrev = 1; bytespersec >= 1024000 && bpsabbrev < NSUFFIXES; bpsabbrev++) { + bytespersec >>= 10; + } + if (prog->done == 0 || prog->elapsed <= 0 || prog->done > prog->size) { + secsleft = 0; + } else { + secsleft = prog->eta; + } + if ((secs = secsleft / SECSPERHOUR) > 0) { + (void) snprintf(hours, sizeof(hours), "%2lld:", (long long)secs); + } else { + (void) snprintf(hours, sizeof(hours), " "); + } + secs = secsleft % SECSPERHOUR; + len = snprintf(buf, sizeof(buf), + "\r%s %3lld%% |%.*s%*s| %5lld %-3s %3lld.%02d %.2sB/s %s%02d:%02d ETA", + (prog->prefix) ? prog->prefix : "", + (long long)prog->percent, + (int)starc, stars, (int)(barlength - starc), "", + (long long)abbrevsize, + suffixes[bytesabbrev], + (long long)(bytespersec / 1024), + (int)((bytespersec % 1024) * 100 / 1024), + suffixes[bpsabbrev], + hours, + (int)secs / 60, (int)secs % 60); + return (int)write(STDOUT_FILENO, buf, len); +} diff --git a/sbin/camcontrol/progress.h b/sbin/camcontrol/progress.h new file mode 100644 index 00000000000..a457c328eb2 --- /dev/null +++ b/sbin/camcontrol/progress.h @@ -0,0 +1,60 @@ +/* $NetBSD: progressbar.c,v 1.21 2009/04/12 10:18:52 lukem Exp $ */ + +/*- + * Copyright (c) 1997-2012 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Luke Mewburn. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef PROGRESS_H_ +#define PROGRESS_H_ 20100228 + +#include + +#include + +/* structure used to display a progress meter */ +typedef struct progress_t { + char *prefix; /* any prefix explanation */ + uint64_t size; /* total of bytes/units to be counted */ + uint64_t done; /* number of units counted to date */ + uint64_t percent; /* cache the percentage complete */ + time_t start; /* time we started this */ + time_t now; /* time now */ + time_t eta; /* estimated # of secs until completion */ + int64_t elapsed; /* cached # of elapsed seconds */ + int32_t ttywidth; /* width of tty in columns */ +} progress_t; + +int progress_init(progress_t */*meter*/, const char */*prefix*/, uint64_t /*size*/); +int progress_update(progress_t */*meter*/, uint64_t /*done*/); +int progress_draw(progress_t */*meter*/); +int progress_reset_size(progress_t */*meter*/, uint64_t /*size*/); +int progress_complete(progress_t */*meter*/, uint64_t /*done*/); + +#endif diff --git a/sbin/devd/devd.cc b/sbin/devd/devd.cc index 6eefec80501..453d3df35b8 100644 --- a/sbin/devd/devd.cc +++ b/sbin/devd/devd.cc @@ -807,7 +807,7 @@ create_socket(const char *name) unlink(name); if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) err(1, "fcntl"); - if (bind(fd, (struct sockaddr *) & sun, slen) < 0) + if (::bind(fd, (struct sockaddr *) & sun, slen) < 0) err(1, "bind"); listen(fd, 4); chown(name, 0, 0); /* XXX - root.wheel */ diff --git a/sbin/devd/parse.y b/sbin/devd/parse.y index 28b8a908adb..6334b4e5a27 100644 --- a/sbin/devd/parse.y +++ b/sbin/devd/parse.y @@ -29,6 +29,7 @@ * $FreeBSD$ */ +#include #include "devd.h" #include #include diff --git a/sbin/devfs/devfs.8 b/sbin/devfs/devfs.8 index aa2f81abd23..8c41b13f37d 100644 --- a/sbin/devfs/devfs.8 +++ b/sbin/devfs/devfs.8 @@ -52,7 +52,7 @@ most of the commands related to the rule subsystem must be preceded by the .Cm rule keyword. The following flags are common to all keywords: -.Bl -tag -offset indent +.Bl -tag -width 15n .It Fl m Ar mount-point Operate on .Ar mount-point , @@ -88,7 +88,7 @@ Rule manipulation commands follow the .Cm rule keyword. The following flags are common to all of the rule manipulation commands: -.Bl -tag -offset indent +.Bl -tag -width 15n .It Fl s Ar ruleset Operate on the ruleset with the number .Ar ruleset . @@ -98,7 +98,7 @@ specified mount-point. .El .Pp The following commands are recognized: -.Bl -tag -offset indent +.Bl -tag -width 15n .It Cm rule add Oo Ar rulenum Oc Ar rulespec Add the rule described by .Ar rulespec @@ -156,7 +156,7 @@ is ignored. The following conditions are recognized. Conditions are ANDed together when matching a device; if OR is desired, multiple rules can be written. -.Bl -tag -offset indent +.Bl -tag -width 15n .It Cm path Ar pattern Matches any node with a path that matches .Ar pattern , @@ -175,7 +175,7 @@ and The following actions are recognized. Although there is no explicit delimiter between conditions and actions, they may not be intermixed. -.Bl -tag -offset indent +.Bl -tag -width 15n .It Cm group Ar gid Set the GID of the node to .Ar gid , @@ -238,7 +238,7 @@ will return the same information regardless of the mount-point specified with The mount-point is only relevant when changing what its current ruleset is or when using one of the apply commands. .Sh FILES -.Bl -tag -compact +.Bl -tag -width "Pa /usr/share/examples/etc/devfs.conf" -compact .It Pa /etc/defaults/devfs.rules Default .Nm diff --git a/sbin/dump/dump.8 b/sbin/dump/dump.8 index a96995d8ed5..c5726f257bf 100644 --- a/sbin/dump/dump.8 +++ b/sbin/dump/dump.8 @@ -51,16 +51,6 @@ .Ar filesystem .Nm .Fl W | Fl w -.Pp -.Nm rdump -is an alternate name for -.Nm . -.Pp -.in \" XXX -(The -.Bx 4.3 -option syntax is implemented for backward compatibility, but -is not documented here.) .Sh DESCRIPTION The .Nm @@ -97,6 +87,14 @@ as either its device-special file or its mount point (if that is in a standard entry in .Pa /etc/fstab ) . .Pp +.Nm +may also be invoked as +.Nm rdump . +The +.Bx 4.3 +option syntax is implemented for backward compatibility, but +is not documented here. +.Pp The following options are supported by .Nm : .Bl -tag -width Ds diff --git a/sbin/etherswitchcfg/Makefile b/sbin/etherswitchcfg/Makefile new file mode 100644 index 00000000000..b5cf39ab8da --- /dev/null +++ b/sbin/etherswitchcfg/Makefile @@ -0,0 +1,9 @@ +# @(#)Makefile 5.4 (Berkeley) 6/5/91 +# $FreeBSD$ + +PROG= etherswitchcfg +MAN= etherswitchcfg.8 +SRCS= etherswitchcfg.c ifmedia.c +CFLAGS+= -I${.CURDIR}/../../sys + +.include diff --git a/sbin/etherswitchcfg/etherswitchcfg.8 b/sbin/etherswitchcfg/etherswitchcfg.8 new file mode 100644 index 00000000000..4f3bc92494a --- /dev/null +++ b/sbin/etherswitchcfg/etherswitchcfg.8 @@ -0,0 +1,115 @@ +.\" $FreeBSD$ +.Dd December 15, 2011 +.Dt ETHERSWITCHCFG 8 +.Os +.Sh NAME +.Nm etherswitchcfg +.Nd configure a built-in Ethernet switch +.Sh SYNOPSIS +.Nm +.Op Fl "f control file" +.Ar info +.Nm +.Op Fl "f control file" +.Ar phy +.Ar phy.register[=value] +.Nm +.Op Fl "f control file" +.Ar port%d +.Ar command parameter +.Nm +.Op Fl "f control file" +.Ar reg +.Ar register[=value] +.Nm +.Op Fl "f control file" +.Ar vlangroup%d +.Ar command parameter +.Sh DESCRIPTION +The +.Nm +utility is used to configure an Ethernet switch built into the system. +.Nm +accepts a number of options: +.Bl -tag -width ".Fl f" -compact +.It Fl "f control file" +Specifies the +.Xr etherswitch 4 +control file that represents the switch to be configured. +It defaults to +.Li /dev/etherswitch0 . +.It Fl m +When reporting port information, also list available media options for +that port. +.It Fl v +Produce more verbose output. +Without this flag, lines that represent inactive or empty configuration +options are omitted. +.El +.Ss phy +The phy command provides access to the registers of the PHYs attached +to or integrated into the switch controller. +PHY registers are specified as phy.register, +where +.Ar phy +is usually the port number, and +.Ar register +is the register number. +Both can be provided as decimal, octal or hexadecimal numbers in any of the formats +understood by +.Xr strtol 4 . +To set the register value, use the form instance.register=value. +.Ss port +The port command selects one of the ports of the switch. +It supports the following commands: +.Bl -tag -width ".Ar vlangroup number" -compact +.It Ar vlangroup number +Sets the VLAN group number that is used to process incoming frames that are not tagged. +.It Ar media mediaspec +Specifies the physical media configuration to be configured for a port. +.It Ar mediaopt mediaoption +Specifies a list of media options for a port. See +.Xr ifconfig 8 +for details on +.Ar media +and +.Ar mediaopt . +.El +.Ss reg +The reg command provides access to the registers of the switch controller. +.Ss vlangroup +The vlangroup command selects one of the VLAN groups for configuration. +It supports the following commands: +.Bl -tag -width ".Ar vlangroup" -compact +.It Ar vlan VID +Sets the VLAN ID (802.1q VID) for this VLAN group. +Frames transmitted on tagged member ports of this group will be tagged +with this VID. +Incoming frames carrying this tag will be forwarded according to the +configuration of this VLAN group. +.It Ar members port,... +Configures which ports are to be a member of this VLAN group. +The port numbers are given as a comma-separated list. +Each port can optionally be followed by +.Dq t +to indicate that frames on this port are tagged. +.El +.Sh FILES +.Bl -tag -width /dev/etherswitch? -compact +.It Pa /dev/etherswitch? +Control file for the ethernet switch driver. +.El +.Sh EXAMPLES +Configure VLAN group 1 with a VID of 2 and makes ports 0 and 5 members, +while excluding all other ports. +Port 5 will send and receive tagged frames, while port 0 will be untagged. +Incoming untagged frames on port 0 are assigned to vlangroup1. +.Dl # etherswitchcfg vlangroup1 vlan 2 members 0,5t port0 vlangroup 1 +.Sh SEE ALSO +.Xr etherswitch 4 +.Sh HISTORY +.Nm +first appeared in +.Fx 10.0 . +.Sh AUTHORS +.An Stefan Bethke diff --git a/sbin/etherswitchcfg/etherswitchcfg.c b/sbin/etherswitchcfg/etherswitchcfg.c new file mode 100644 index 00000000000..e6129f3e4ad --- /dev/null +++ b/sbin/etherswitchcfg/etherswitchcfg.c @@ -0,0 +1,511 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int get_media_subtype(int, const char *); +int get_media_mode(int, const char *); +int get_media_options(int, const char *); +int lookup_media_word(struct ifmedia_description *, const char *); +void print_media_word(int, int); +void print_media_word_ifconfig(int); + +/* some constants */ +#define IEEE802DOT1Q_VID_MAX 4094 +#define IFMEDIAREQ_NULISTENTRIES 256 + +enum cmdmode { + MODE_NONE = 0, + MODE_PORT, + MODE_VLANGROUP, + MODE_REGISTER, + MODE_PHYREG +}; + +struct cfg { + int fd; + int verbose; + int mediatypes; + const char *controlfile; + etherswitch_info_t info; + enum cmdmode mode; + int unit; +}; + +struct cmds { + enum cmdmode mode; + const char *name; + int args; + void (*f)(struct cfg *, char *argv[]); +}; +struct cmds cmds[]; + + +static void usage(void); + +static int +read_register(struct cfg *cfg, int r) +{ + struct etherswitch_reg er; + + er.reg = r; + if (ioctl(cfg->fd, IOETHERSWITCHGETREG, &er) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHGETREG)"); + return (er.val); +} + +static void +write_register(struct cfg *cfg, int r, int v) +{ + struct etherswitch_reg er; + + er.reg = r; + er.val = v; + if (ioctl(cfg->fd, IOETHERSWITCHSETREG, &er) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHSETREG)"); +} + +static int +read_phyregister(struct cfg *cfg, int phy, int reg) +{ + struct etherswitch_phyreg er; + + er.phy = phy; + er.reg = reg; + if (ioctl(cfg->fd, IOETHERSWITCHGETPHYREG, &er) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHGETPHYREG)"); + return (er.val); +} + +static void +write_phyregister(struct cfg *cfg, int phy, int reg, int val) +{ + struct etherswitch_phyreg er; + + er.phy = phy; + er.reg = reg; + er.val = val; + if (ioctl(cfg->fd, IOETHERSWITCHSETPHYREG, &er) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHSETPHYREG)"); +} + +static void +set_port_vlangroup(struct cfg *cfg, char *argv[]) +{ + int v; + etherswitch_port_t p; + + v = strtol(argv[1], NULL, 0); + if (v < 0 || v >= cfg->info.es_nvlangroups) + errx(EX_USAGE, "vlangroup must be between 0 and %d", cfg->info.es_nvlangroups-1); + p.es_port = cfg->unit; + if (ioctl(cfg->fd, IOETHERSWITCHGETPORT, &p) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHGETPORT)"); + p.es_vlangroup = v; + if (ioctl(cfg->fd, IOETHERSWITCHSETPORT, &p) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHSETPORT)"); +} + +static void +set_port_media(struct cfg *cfg, char *argv[]) +{ + etherswitch_port_t p; + int ifm_ulist[IFMEDIAREQ_NULISTENTRIES]; + int subtype; + + bzero(&p, sizeof(p)); + p.es_port = cfg->unit; + p.es_ifmr.ifm_ulist = ifm_ulist; + p.es_ifmr.ifm_count = IFMEDIAREQ_NULISTENTRIES; + if (ioctl(cfg->fd, IOETHERSWITCHGETPORT, &p) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHGETPORT)"); + subtype = get_media_subtype(IFM_TYPE(ifm_ulist[0]), argv[1]); + p.es_ifr.ifr_media = (p.es_ifmr.ifm_current & IFM_IMASK) | + IFM_TYPE(ifm_ulist[0]) | subtype; + if (ioctl(cfg->fd, IOETHERSWITCHSETPORT, &p) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHSETPORT)"); +} + +static void +set_port_mediaopt(struct cfg *cfg, char *argv[]) +{ + etherswitch_port_t p; + int ifm_ulist[IFMEDIAREQ_NULISTENTRIES]; + int options; + + bzero(&p, sizeof(p)); + p.es_port = cfg->unit; + p.es_ifmr.ifm_ulist = ifm_ulist; + p.es_ifmr.ifm_count = IFMEDIAREQ_NULISTENTRIES; + if (ioctl(cfg->fd, IOETHERSWITCHGETPORT, &p) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHGETPORT)"); + options = get_media_options(IFM_TYPE(ifm_ulist[0]), argv[1]); + if (options == -1) + errx(EX_USAGE, "invalid media options \"%s\"", argv[1]); + if (options & IFM_HDX) { + p.es_ifr.ifr_media &= ~IFM_FDX; + options &= ~IFM_HDX; + } + p.es_ifr.ifr_media |= options; + if (ioctl(cfg->fd, IOETHERSWITCHSETPORT, &p) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHSETPORT)"); +} + +static void +set_vlangroup_vid(struct cfg *cfg, char *argv[]) +{ + int v; + etherswitch_vlangroup_t vg; + + v = strtol(argv[1], NULL, 0); + if (v < 0 || v >= IEEE802DOT1Q_VID_MAX) + errx(EX_USAGE, "vlan must be between 0 and %d", IEEE802DOT1Q_VID_MAX); + vg.es_vlangroup = cfg->unit; + if (ioctl(cfg->fd, IOETHERSWITCHGETVLANGROUP, &vg) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHGETVLANGROUP)"); + vg.es_vid = v; + if (ioctl(cfg->fd, IOETHERSWITCHSETVLANGROUP, &vg) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHSETVLANGROUP)"); +} + +static void +set_vlangroup_members(struct cfg *cfg, char *argv[]) +{ + etherswitch_vlangroup_t vg; + int member, untagged; + char *c, *d; + int v; + + member = untagged = 0; + if (strcmp(argv[1], "none") != 0) { + for (c=argv[1]; *c; c=d) { + v = strtol(c, &d, 0); + if (d == c) + break; + if (v < 0 || v >= cfg->info.es_nports) + errx(EX_USAGE, "Member port must be between 0 and %d", cfg->info.es_nports-1); + if (d[0] == ',' || d[0] == '\0' || + ((d[0] == 't' || d[0] == 'T') && (d[1] == ',' || d[1] == '\0'))) { + if (d[0] == 't' || d[0] == 'T') { + untagged &= ~ETHERSWITCH_PORTMASK(v); + d++; + } else + untagged |= ETHERSWITCH_PORTMASK(v); + member |= ETHERSWITCH_PORTMASK(v); + d++; + } else + errx(EX_USAGE, "Invalid members specification \"%s\"", d); + } + } + vg.es_vlangroup = cfg->unit; + if (ioctl(cfg->fd, IOETHERSWITCHGETVLANGROUP, &vg) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHGETVLANGROUP)"); + vg.es_member_ports = member; + vg.es_untagged_ports = untagged; + if (ioctl(cfg->fd, IOETHERSWITCHSETVLANGROUP, &vg) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHSETVLANGROUP)"); +} + +static int +set_register(struct cfg *cfg, char *arg) +{ + int a, v; + char *c; + + a = strtol(arg, &c, 0); + if (c==arg) + return (1); + if (*c == '=') { + v = strtol(c+1, NULL, 0); + write_register(cfg, a, v); + } + printf("\treg 0x%04x=0x%04x\n", a, read_register(cfg, a)); + return (0); +} + +static int +set_phyregister(struct cfg *cfg, char *arg) +{ + int phy, reg, val; + char *c, *d; + + phy = strtol(arg, &c, 0); + if (c==arg) + return (1); + if (*c != '.') + return (1); + d = c+1; + reg = strtol(d, &c, 0); + if (d == c) + return (1); + if (*c == '=') { + val = strtol(c+1, NULL, 0); + write_phyregister(cfg, phy, reg, val); + } + printf("\treg %d.0x%02x=0x%04x\n", phy, reg, read_phyregister(cfg, phy, reg)); + return (0); +} + +static void +print_port(struct cfg *cfg, int port) +{ + etherswitch_port_t p; + int ifm_ulist[IFMEDIAREQ_NULISTENTRIES]; + int i; + + bzero(&p, sizeof(p)); + p.es_port = port; + p.es_ifmr.ifm_ulist = ifm_ulist; + p.es_ifmr.ifm_count = IFMEDIAREQ_NULISTENTRIES; + if (ioctl(cfg->fd, IOETHERSWITCHGETPORT, &p) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHGETPORT)"); + printf("port%d:\n", port); + printf("\tvlangroup: %d\n", p.es_vlangroup); + printf("\tmedia: "); + print_media_word(p.es_ifmr.ifm_current, 1); + if (p.es_ifmr.ifm_active != p.es_ifmr.ifm_current) { + putchar(' '); + putchar('('); + print_media_word(p.es_ifmr.ifm_active, 0); + putchar(')'); + } + putchar('\n'); + printf("\tstatus: %s\n", (p.es_ifmr.ifm_status & IFM_ACTIVE) != 0 ? "active" : "no carrier"); + if (cfg->mediatypes) { + printf("\tsupported media:\n"); + if (p.es_ifmr.ifm_count > IFMEDIAREQ_NULISTENTRIES) + p.es_ifmr.ifm_count = IFMEDIAREQ_NULISTENTRIES; + for (i=0; ifd, IOETHERSWITCHGETVLANGROUP, &vg) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHGETVLANGROUP)"); + if (cfg->verbose == 0 && vg.es_member_ports == 0) + return; + printf("vlangroup%d:\n", vlangroup); + printf("\tvlan: %d\n", vg.es_vid); + printf("\tmembers "); + comma = 0; + if (vg.es_member_ports != 0) + for (i=0; iinfo.es_nports; i++) { + if ((vg.es_member_ports & ETHERSWITCH_PORTMASK(i)) != 0) { + if (comma) + printf(","); + printf("%d", i); + if ((vg.es_untagged_ports & ETHERSWITCH_PORTMASK(i)) == 0) + printf("t"); + comma = 1; + } + } + else + printf("none"); + printf("\n"); +} + +static void +print_info(struct cfg *cfg) +{ + const char *c; + int i; + + c = strrchr(cfg->controlfile, '/'); + if (c != NULL) + c = c + 1; + else + c = cfg->controlfile; + if (cfg->verbose) + printf("%s: %s with %d ports and %d VLAN groups\n", + c, cfg->info.es_name, cfg->info.es_nports, cfg->info.es_nvlangroups); + for (i=0; iinfo.es_nports; i++) { + print_port(cfg, i); + } + for (i=0; iinfo.es_nvlangroups; i++) { + print_vlangroup(cfg, i); + } +} + +static void +usage(void) +{ + fprintf(stderr, "usage: etherswitchctl\n"); + exit(EX_USAGE); +} + +static void +newmode(struct cfg *cfg, enum cmdmode mode) +{ + if (mode == cfg->mode) + return; + switch (cfg->mode) { + case MODE_NONE: + break; + case MODE_PORT: + print_port(cfg, cfg->unit); + break; + case MODE_VLANGROUP: + print_vlangroup(cfg, cfg->unit); + break; + case MODE_REGISTER: + case MODE_PHYREG: + break; + } + cfg->mode = mode; +} + +int +main(int argc, char *argv[]) +{ + int ch; + struct cfg cfg; + int i; + + bzero(&cfg, sizeof(cfg)); + cfg.controlfile = "/dev/etherswitch0"; + while ((ch = getopt(argc, argv, "f:mv?")) != -1) + switch(ch) { + case 'f': + cfg.controlfile = optarg; + break; + case 'm': + cfg.mediatypes++; + break; + case 'v': + cfg.verbose++; + break; + case '?': + /* FALLTHROUGH */ + default: + usage(); + } + argc -= optind; + argv += optind; + cfg.fd = open(cfg.controlfile, O_RDONLY); + if (cfg.fd < 0) + err(EX_UNAVAILABLE, "Can't open control file: %s", cfg.controlfile); + if (ioctl(cfg.fd, IOETHERSWITCHGETINFO, &cfg.info) != 0) + err(EX_OSERR, "ioctl(IOETHERSWITCHGETINFO)"); + if (argc == 0) { + print_info(&cfg); + return (0); + } + cfg.mode = MODE_NONE; + while (argc > 0) { + switch(cfg.mode) { + case MODE_NONE: + if (strcmp(argv[0], "info") == 0) { + print_info(&cfg); + } else if (sscanf(argv[0], "port%d", &cfg.unit) == 1) { + if (cfg.unit < 0 || cfg.unit >= cfg.info.es_nports) + errx(EX_USAGE, "port unit must be between 0 and %d", cfg.info.es_nports); + newmode(&cfg, MODE_PORT); + } else if (sscanf(argv[0], "vlangroup%d", &cfg.unit) == 1) { + if (cfg.unit < 0 || cfg.unit >= cfg.info.es_nvlangroups) + errx(EX_USAGE, "port unit must be between 0 and %d", cfg.info.es_nvlangroups); + newmode(&cfg, MODE_VLANGROUP); + } else if (strcmp(argv[0], "phy") == 0) { + newmode(&cfg, MODE_PHYREG); + } else if (strcmp(argv[0], "reg") == 0) { + newmode(&cfg, MODE_REGISTER); + } else { + errx(EX_USAGE, "Unknown command \"%s\"", argv[0]); + } + break; + case MODE_PORT: + case MODE_VLANGROUP: + for(i=0; cmds[i].name != NULL; i++) { + if (cfg.mode == cmds[i].mode && strcmp(argv[0], cmds[i].name) == 0 + && argc >= cmds[i].args) { + (cmds[i].f)(&cfg, argv); + argc -= cmds[i].args; + argv += cmds[i].args; + break; + } + } + if (cmds[i].name == NULL) { + newmode(&cfg, MODE_NONE); + continue; + } + break; + case MODE_REGISTER: + if (set_register(&cfg, argv[0]) != 0) { + newmode(&cfg, MODE_NONE); + continue; + } + break; + case MODE_PHYREG: + if (set_phyregister(&cfg, argv[0]) != 0) { + newmode(&cfg, MODE_NONE); + continue; + } + break; + } + argc--; + argv++; + } + /* switch back to command mode to print configuration for last command */ + newmode(&cfg, MODE_NONE); + close(cfg.fd); + return (0); +} + +struct cmds cmds[] = { + { MODE_PORT, "vlangroup", 1, set_port_vlangroup }, + { MODE_PORT, "media", 1, set_port_media }, + { MODE_PORT, "mediaopt", 1, set_port_mediaopt }, + { MODE_VLANGROUP, "vlan", 1, set_vlangroup_vid }, + { MODE_VLANGROUP, "members", 1, set_vlangroup_members }, + { 0, NULL, 0, NULL } +}; diff --git a/sbin/etherswitchcfg/ifmedia.c b/sbin/etherswitchcfg/ifmedia.c new file mode 100644 index 00000000000..258c3d5b9ed --- /dev/null +++ b/sbin/etherswitchcfg/ifmedia.c @@ -0,0 +1,812 @@ +/* $NetBSD: ifconfig.c,v 1.34 1997/04/21 01:17:58 lukem Exp $ */ +/* $FreeBSD$ */ + +/* + * Copyright (c) 1997 Jason R. Thorpe. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed for the NetBSD Project + * by Jason R. Thorpe. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/* + * based on sbin/ifconfig/ifmedia.c r221954 + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +void domediaopt(const char *, int, int); +int get_media_subtype(int, const char *); +int get_media_mode(int, const char *); +int get_media_options(int, const char *); +int lookup_media_word(struct ifmedia_description *, const char *); +void print_media_word(int, int); +void print_media_word_ifconfig(int); + +#if 0 +static struct ifmedia_description *get_toptype_desc(int); +static struct ifmedia_type_to_subtype *get_toptype_ttos(int); +static struct ifmedia_description *get_subtype_desc(int, + struct ifmedia_type_to_subtype *ttos); + +#define IFM_OPMODE(x) \ + ((x) & (IFM_IEEE80211_ADHOC | IFM_IEEE80211_HOSTAP | \ + IFM_IEEE80211_IBSS | IFM_IEEE80211_WDS | IFM_IEEE80211_MONITOR | \ + IFM_IEEE80211_MBSS)) +#define IFM_IEEE80211_STA 0 + +static void +media_status(int s) +{ + struct ifmediareq ifmr; + int *media_list, i; + + (void) memset(&ifmr, 0, sizeof(ifmr)); + (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name)); + + if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) { + /* + * Interface doesn't support SIOC{G,S}IFMEDIA. + */ + return; + } + + if (ifmr.ifm_count == 0) { + warnx("%s: no media types?", name); + return; + } + + media_list = (int *)malloc(ifmr.ifm_count * sizeof(int)); + if (media_list == NULL) + err(1, "malloc"); + ifmr.ifm_ulist = media_list; + + if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) + err(1, "SIOCGIFMEDIA"); + + printf("\tmedia: "); + print_media_word(ifmr.ifm_current, 1); + if (ifmr.ifm_active != ifmr.ifm_current) { + putchar(' '); + putchar('('); + print_media_word(ifmr.ifm_active, 0); + putchar(')'); + } + + putchar('\n'); + + if (ifmr.ifm_status & IFM_AVALID) { + printf("\tstatus: "); + switch (IFM_TYPE(ifmr.ifm_active)) { + case IFM_ETHER: + case IFM_ATM: + if (ifmr.ifm_status & IFM_ACTIVE) + printf("active"); + else + printf("no carrier"); + break; + + case IFM_FDDI: + case IFM_TOKEN: + if (ifmr.ifm_status & IFM_ACTIVE) + printf("inserted"); + else + printf("no ring"); + break; + + case IFM_IEEE80211: + if (ifmr.ifm_status & IFM_ACTIVE) { + /* NB: only sta mode associates */ + if (IFM_OPMODE(ifmr.ifm_active) == IFM_IEEE80211_STA) + printf("associated"); + else + printf("running"); + } else + printf("no carrier"); + break; + } + putchar('\n'); + } + + if (ifmr.ifm_count > 0 && supmedia) { + printf("\tsupported media:\n"); + for (i = 0; i < ifmr.ifm_count; i++) { + printf("\t\t"); + print_media_word_ifconfig(media_list[i]); + putchar('\n'); + } + } + + free(media_list); +} + +struct ifmediareq * +ifmedia_getstate(int s) +{ + static struct ifmediareq *ifmr = NULL; + int *mwords; + + if (ifmr == NULL) { + ifmr = (struct ifmediareq *)malloc(sizeof(struct ifmediareq)); + if (ifmr == NULL) + err(1, "malloc"); + + (void) memset(ifmr, 0, sizeof(struct ifmediareq)); + (void) strncpy(ifmr->ifm_name, name, + sizeof(ifmr->ifm_name)); + + ifmr->ifm_count = 0; + ifmr->ifm_ulist = NULL; + + /* + * We must go through the motions of reading all + * supported media because we need to know both + * the current media type and the top-level type. + */ + + if (ioctl(s, SIOCGIFMEDIA, (caddr_t)ifmr) < 0) { + err(1, "SIOCGIFMEDIA"); + } + + if (ifmr->ifm_count == 0) + errx(1, "%s: no media types?", name); + + mwords = (int *)malloc(ifmr->ifm_count * sizeof(int)); + if (mwords == NULL) + err(1, "malloc"); + + ifmr->ifm_ulist = mwords; + if (ioctl(s, SIOCGIFMEDIA, (caddr_t)ifmr) < 0) + err(1, "SIOCGIFMEDIA"); + } + + return ifmr; +} + +static void +setifmediacallback(int s, void *arg) +{ + struct ifmediareq *ifmr = (struct ifmediareq *)arg; + static int did_it = 0; + + if (!did_it) { + ifr.ifr_media = ifmr->ifm_current; + if (ioctl(s, SIOCSIFMEDIA, (caddr_t)&ifr) < 0) + err(1, "SIOCSIFMEDIA (media)"); + free(ifmr->ifm_ulist); + free(ifmr); + did_it = 1; + } +} + +static void +setmedia(const char *val, int d, int s, const struct afswtch *afp) +{ + struct ifmediareq *ifmr; + int subtype; + + ifmr = ifmedia_getstate(s); + + /* + * We are primarily concerned with the top-level type. + * However, "current" may be only IFM_NONE, so we just look + * for the top-level type in the first "supported type" + * entry. + * + * (I'm assuming that all supported media types for a given + * interface will be the same top-level type..) + */ + subtype = get_media_subtype(IFM_TYPE(ifmr->ifm_ulist[0]), val); + + strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); + ifr.ifr_media = (ifmr->ifm_current & IFM_IMASK) | + IFM_TYPE(ifmr->ifm_ulist[0]) | subtype; + + ifmr->ifm_current = ifr.ifr_media; + callback_register(setifmediacallback, (void *)ifmr); +} + +static void +setmediaopt(const char *val, int d, int s, const struct afswtch *afp) +{ + + domediaopt(val, 0, s); +} + +static void +unsetmediaopt(const char *val, int d, int s, const struct afswtch *afp) +{ + + domediaopt(val, 1, s); +} + +static void +domediaopt(const char *val, int clear, int s) +{ + struct ifmediareq *ifmr; + int options; + + ifmr = ifmedia_getstate(s); + + options = get_media_options(IFM_TYPE(ifmr->ifm_ulist[0]), val); + + strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); + ifr.ifr_media = ifmr->ifm_current; + if (clear) + ifr.ifr_media &= ~options; + else { + if (options & IFM_HDX) { + ifr.ifr_media &= ~IFM_FDX; + options &= ~IFM_HDX; + } + ifr.ifr_media |= options; + } + ifmr->ifm_current = ifr.ifr_media; + callback_register(setifmediacallback, (void *)ifmr); +} + +static void +setmediainst(const char *val, int d, int s, const struct afswtch *afp) +{ + struct ifmediareq *ifmr; + int inst; + + ifmr = ifmedia_getstate(s); + + inst = atoi(val); + if (inst < 0 || inst > (int)IFM_INST_MAX) + errx(1, "invalid media instance: %s", val); + + strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); + ifr.ifr_media = (ifmr->ifm_current & ~IFM_IMASK) | inst << IFM_ISHIFT; + + ifmr->ifm_current = ifr.ifr_media; + callback_register(setifmediacallback, (void *)ifmr); +} + +static void +setmediamode(const char *val, int d, int s, const struct afswtch *afp) +{ + struct ifmediareq *ifmr; + int mode; + + ifmr = ifmedia_getstate(s); + + mode = get_media_mode(IFM_TYPE(ifmr->ifm_ulist[0]), val); + + strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); + ifr.ifr_media = (ifmr->ifm_current & ~IFM_MMASK) | mode; + + ifmr->ifm_current = ifr.ifr_media; + callback_register(setifmediacallback, (void *)ifmr); +} +#endif + +/********************************************************************** + * A good chunk of this is duplicated from sys/net/ifmedia.c + **********************************************************************/ + +static struct ifmedia_description ifm_type_descriptions[] = + IFM_TYPE_DESCRIPTIONS; + +static struct ifmedia_description ifm_subtype_ethernet_descriptions[] = + IFM_SUBTYPE_ETHERNET_DESCRIPTIONS; + +static struct ifmedia_description ifm_subtype_ethernet_aliases[] = + IFM_SUBTYPE_ETHERNET_ALIASES; + +static struct ifmedia_description ifm_subtype_ethernet_option_descriptions[] = + IFM_SUBTYPE_ETHERNET_OPTION_DESCRIPTIONS; + +static struct ifmedia_description ifm_subtype_tokenring_descriptions[] = + IFM_SUBTYPE_TOKENRING_DESCRIPTIONS; + +static struct ifmedia_description ifm_subtype_tokenring_aliases[] = + IFM_SUBTYPE_TOKENRING_ALIASES; + +static struct ifmedia_description ifm_subtype_tokenring_option_descriptions[] = + IFM_SUBTYPE_TOKENRING_OPTION_DESCRIPTIONS; + +static struct ifmedia_description ifm_subtype_fddi_descriptions[] = + IFM_SUBTYPE_FDDI_DESCRIPTIONS; + +static struct ifmedia_description ifm_subtype_fddi_aliases[] = + IFM_SUBTYPE_FDDI_ALIASES; + +static struct ifmedia_description ifm_subtype_fddi_option_descriptions[] = + IFM_SUBTYPE_FDDI_OPTION_DESCRIPTIONS; + +static struct ifmedia_description ifm_subtype_ieee80211_descriptions[] = + IFM_SUBTYPE_IEEE80211_DESCRIPTIONS; + +static struct ifmedia_description ifm_subtype_ieee80211_aliases[] = + IFM_SUBTYPE_IEEE80211_ALIASES; + +static struct ifmedia_description ifm_subtype_ieee80211_option_descriptions[] = + IFM_SUBTYPE_IEEE80211_OPTION_DESCRIPTIONS; + +struct ifmedia_description ifm_subtype_ieee80211_mode_descriptions[] = + IFM_SUBTYPE_IEEE80211_MODE_DESCRIPTIONS; + +struct ifmedia_description ifm_subtype_ieee80211_mode_aliases[] = + IFM_SUBTYPE_IEEE80211_MODE_ALIASES; + +static struct ifmedia_description ifm_subtype_atm_descriptions[] = + IFM_SUBTYPE_ATM_DESCRIPTIONS; + +static struct ifmedia_description ifm_subtype_atm_aliases[] = + IFM_SUBTYPE_ATM_ALIASES; + +static struct ifmedia_description ifm_subtype_atm_option_descriptions[] = + IFM_SUBTYPE_ATM_OPTION_DESCRIPTIONS; + +static struct ifmedia_description ifm_subtype_shared_descriptions[] = + IFM_SUBTYPE_SHARED_DESCRIPTIONS; + +static struct ifmedia_description ifm_subtype_shared_aliases[] = + IFM_SUBTYPE_SHARED_ALIASES; + +static struct ifmedia_description ifm_shared_option_descriptions[] = + IFM_SHARED_OPTION_DESCRIPTIONS; + +static struct ifmedia_description ifm_shared_option_aliases[] = + IFM_SHARED_OPTION_ALIASES; + +struct ifmedia_type_to_subtype { + struct { + struct ifmedia_description *desc; + int alias; + } subtypes[5]; + struct { + struct ifmedia_description *desc; + int alias; + } options[4]; + struct { + struct ifmedia_description *desc; + int alias; + } modes[3]; +}; + +/* must be in the same order as IFM_TYPE_DESCRIPTIONS */ +static struct ifmedia_type_to_subtype ifmedia_types_to_subtypes[] = { + { + { + { &ifm_subtype_shared_descriptions[0], 0 }, + { &ifm_subtype_shared_aliases[0], 1 }, + { &ifm_subtype_ethernet_descriptions[0], 0 }, + { &ifm_subtype_ethernet_aliases[0], 1 }, + { NULL, 0 }, + }, + { + { &ifm_shared_option_descriptions[0], 0 }, + { &ifm_shared_option_aliases[0], 1 }, + { &ifm_subtype_ethernet_option_descriptions[0], 0 }, + { NULL, 0 }, + }, + { + { NULL, 0 }, + }, + }, + { + { + { &ifm_subtype_shared_descriptions[0], 0 }, + { &ifm_subtype_shared_aliases[0], 1 }, + { &ifm_subtype_tokenring_descriptions[0], 0 }, + { &ifm_subtype_tokenring_aliases[0], 1 }, + { NULL, 0 }, + }, + { + { &ifm_shared_option_descriptions[0], 0 }, + { &ifm_shared_option_aliases[0], 1 }, + { &ifm_subtype_tokenring_option_descriptions[0], 0 }, + { NULL, 0 }, + }, + { + { NULL, 0 }, + }, + }, + { + { + { &ifm_subtype_shared_descriptions[0], 0 }, + { &ifm_subtype_shared_aliases[0], 1 }, + { &ifm_subtype_fddi_descriptions[0], 0 }, + { &ifm_subtype_fddi_aliases[0], 1 }, + { NULL, 0 }, + }, + { + { &ifm_shared_option_descriptions[0], 0 }, + { &ifm_shared_option_aliases[0], 1 }, + { &ifm_subtype_fddi_option_descriptions[0], 0 }, + { NULL, 0 }, + }, + { + { NULL, 0 }, + }, + }, + { + { + { &ifm_subtype_shared_descriptions[0], 0 }, + { &ifm_subtype_shared_aliases[0], 1 }, + { &ifm_subtype_ieee80211_descriptions[0], 0 }, + { &ifm_subtype_ieee80211_aliases[0], 1 }, + { NULL, 0 }, + }, + { + { &ifm_shared_option_descriptions[0], 0 }, + { &ifm_shared_option_aliases[0], 1 }, + { &ifm_subtype_ieee80211_option_descriptions[0], 0 }, + { NULL, 0 }, + }, + { + { &ifm_subtype_ieee80211_mode_descriptions[0], 0 }, + { &ifm_subtype_ieee80211_mode_aliases[0], 0 }, + { NULL, 0 }, + }, + }, + { + { + { &ifm_subtype_shared_descriptions[0], 0 }, + { &ifm_subtype_shared_aliases[0], 1 }, + { &ifm_subtype_atm_descriptions[0], 0 }, + { &ifm_subtype_atm_aliases[0], 1 }, + { NULL, 0 }, + }, + { + { &ifm_shared_option_descriptions[0], 0 }, + { &ifm_shared_option_aliases[0], 1 }, + { &ifm_subtype_atm_option_descriptions[0], 0 }, + { NULL, 0 }, + }, + { + { NULL, 0 }, + }, + }, +}; + +int +get_media_subtype(int type, const char *val) +{ + struct ifmedia_description *desc; + struct ifmedia_type_to_subtype *ttos; + int rval, i; + + /* Find the top-level interface type. */ + for (desc = ifm_type_descriptions, ttos = ifmedia_types_to_subtypes; + desc->ifmt_string != NULL; desc++, ttos++) + if (type == desc->ifmt_word) + break; + if (desc->ifmt_string == NULL) + errx(1, "unknown media type 0x%x", type); + + for (i = 0; ttos->subtypes[i].desc != NULL; i++) { + rval = lookup_media_word(ttos->subtypes[i].desc, val); + if (rval != -1) + return (rval); + } + errx(1, "unknown media subtype: %s", val); + /*NOTREACHED*/ +} + +int +get_media_mode(int type, const char *val) +{ + struct ifmedia_description *desc; + struct ifmedia_type_to_subtype *ttos; + int rval, i; + + /* Find the top-level interface type. */ + for (desc = ifm_type_descriptions, ttos = ifmedia_types_to_subtypes; + desc->ifmt_string != NULL; desc++, ttos++) + if (type == desc->ifmt_word) + break; + if (desc->ifmt_string == NULL) + errx(1, "unknown media mode 0x%x", type); + + for (i = 0; ttos->modes[i].desc != NULL; i++) { + rval = lookup_media_word(ttos->modes[i].desc, val); + if (rval != -1) + return (rval); + } + return -1; +} + +int +get_media_options(int type, const char *val) +{ + struct ifmedia_description *desc; + struct ifmedia_type_to_subtype *ttos; + char *optlist, *optptr; + int option = 0, i, rval = 0; + + /* We muck with the string, so copy it. */ + optlist = strdup(val); + if (optlist == NULL) + err(1, "strdup"); + + /* Find the top-level interface type. */ + for (desc = ifm_type_descriptions, ttos = ifmedia_types_to_subtypes; + desc->ifmt_string != NULL; desc++, ttos++) + if (type == desc->ifmt_word) + break; + if (desc->ifmt_string == NULL) + errx(1, "unknown media type 0x%x", type); + + /* + * Look up the options in the user-provided comma-separated + * list. + */ + optptr = optlist; + for (; (optptr = strtok(optptr, ",")) != NULL; optptr = NULL) { + for (i = 0; ttos->options[i].desc != NULL; i++) { + option = lookup_media_word(ttos->options[i].desc, optptr); + if (option != -1) + break; + } + if (option == 0) + errx(1, "unknown option: %s", optptr); + rval |= option; + } + + free(optlist); + return (rval); +} + +int +lookup_media_word(struct ifmedia_description *desc, const char *val) +{ + + for (; desc->ifmt_string != NULL; desc++) + if (strcasecmp(desc->ifmt_string, val) == 0) + return (desc->ifmt_word); + + return (-1); +} + +static struct ifmedia_description *get_toptype_desc(int ifmw) +{ + struct ifmedia_description *desc; + + for (desc = ifm_type_descriptions; desc->ifmt_string != NULL; desc++) + if (IFM_TYPE(ifmw) == desc->ifmt_word) + break; + + return desc; +} + +static struct ifmedia_type_to_subtype *get_toptype_ttos(int ifmw) +{ + struct ifmedia_description *desc; + struct ifmedia_type_to_subtype *ttos; + + for (desc = ifm_type_descriptions, ttos = ifmedia_types_to_subtypes; + desc->ifmt_string != NULL; desc++, ttos++) + if (IFM_TYPE(ifmw) == desc->ifmt_word) + break; + + return ttos; +} + +static struct ifmedia_description *get_subtype_desc(int ifmw, + struct ifmedia_type_to_subtype *ttos) +{ + int i; + struct ifmedia_description *desc; + + for (i = 0; ttos->subtypes[i].desc != NULL; i++) { + if (ttos->subtypes[i].alias) + continue; + for (desc = ttos->subtypes[i].desc; + desc->ifmt_string != NULL; desc++) { + if (IFM_SUBTYPE(ifmw) == desc->ifmt_word) + return desc; + } + } + + return NULL; +} + +static struct ifmedia_description *get_mode_desc(int ifmw, + struct ifmedia_type_to_subtype *ttos) +{ + int i; + struct ifmedia_description *desc; + + for (i = 0; ttos->modes[i].desc != NULL; i++) { + if (ttos->modes[i].alias) + continue; + for (desc = ttos->modes[i].desc; + desc->ifmt_string != NULL; desc++) { + if (IFM_MODE(ifmw) == desc->ifmt_word) + return desc; + } + } + + return NULL; +} + +void +print_media_word(int ifmw, int print_toptype) +{ + struct ifmedia_description *desc; + struct ifmedia_type_to_subtype *ttos; + int seen_option = 0, i; + + /* Find the top-level interface type. */ + desc = get_toptype_desc(ifmw); + ttos = get_toptype_ttos(ifmw); + if (desc->ifmt_string == NULL) { + printf(""); + return; + } else if (print_toptype) { + printf("%s", desc->ifmt_string); + } + + /* + * Don't print the top-level type; it's not like we can + * change it, or anything. + */ + + /* Find subtype. */ + desc = get_subtype_desc(ifmw, ttos); + if (desc == NULL) { + printf(""); + return; + } + + if (print_toptype) + putchar(' '); + + printf("%s", desc->ifmt_string); + + if (print_toptype) { + desc = get_mode_desc(ifmw, ttos); + if (desc != NULL && strcasecmp("autoselect", desc->ifmt_string)) + printf(" mode %s", desc->ifmt_string); + } + + /* Find options. */ + for (i = 0; ttos->options[i].desc != NULL; i++) { + if (ttos->options[i].alias) + continue; + for (desc = ttos->options[i].desc; + desc->ifmt_string != NULL; desc++) { + if (ifmw & desc->ifmt_word) { + if (seen_option == 0) + printf(" <"); + printf("%s%s", seen_option++ ? "," : "", + desc->ifmt_string); + } + } + } + printf("%s", seen_option ? ">" : ""); + + if (print_toptype && IFM_INST(ifmw) != 0) + printf(" instance %d", IFM_INST(ifmw)); +} + +void +print_media_word_ifconfig(int ifmw) +{ + struct ifmedia_description *desc; + struct ifmedia_type_to_subtype *ttos; + int seen_option = 0, i; + + /* Find the top-level interface type. */ + desc = get_toptype_desc(ifmw); + ttos = get_toptype_ttos(ifmw); + if (desc->ifmt_string == NULL) { + printf(""); + return; + } + + /* + * Don't print the top-level type; it's not like we can + * change it, or anything. + */ + + /* Find subtype. */ + desc = get_subtype_desc(ifmw, ttos); + if (desc == NULL) { + printf(""); + return; + } + + printf("media %s", desc->ifmt_string); + + desc = get_mode_desc(ifmw, ttos); + if (desc != NULL) + printf(" mode %s", desc->ifmt_string); + + /* Find options. */ + for (i = 0; ttos->options[i].desc != NULL; i++) { + if (ttos->options[i].alias) + continue; + for (desc = ttos->options[i].desc; + desc->ifmt_string != NULL; desc++) { + if (ifmw & desc->ifmt_word) { + if (seen_option == 0) + printf(" mediaopt "); + printf("%s%s", seen_option++ ? "," : "", + desc->ifmt_string); + } + } + } + + if (IFM_INST(ifmw) != 0) + printf(" instance %d", IFM_INST(ifmw)); +} + +/********************************************************************** + * ...until here. + **********************************************************************/ diff --git a/sbin/fsck_ffs/suj.c b/sbin/fsck_ffs/suj.c index b784519062b..8819476278a 100644 --- a/sbin/fsck_ffs/suj.c +++ b/sbin/fsck_ffs/suj.c @@ -1789,6 +1789,20 @@ cg_trunc(struct suj_cg *sc) } } +static void +cg_adj_blk(struct suj_cg *sc) +{ + struct suj_ino *sino; + int i; + + for (i = 0; i < SUJ_HASHSIZE; i++) { + LIST_FOREACH(sino, &sc->sc_inohash[i], si_next) { + if (sino->si_blkadj) + ino_adjblks(sino); + } + } +} + /* * Free any partially allocated blocks and then resolve inode block * counts. @@ -2720,6 +2734,7 @@ suj_check(const char *filesys) printf("** Processing journal entries.\n"); cg_apply(cg_trunc); cg_apply(cg_check_blk); + cg_apply(cg_adj_blk); cg_apply(cg_check_ino); } if (preen == 0 && (jrecs > 0 || jbytes > 0) && reply("WRITE CHANGES") == 0) diff --git a/sbin/fsck_msdosfs/main.c b/sbin/fsck_msdosfs/main.c index 9ec15ca2b50..e9baf84b626 100644 --- a/sbin/fsck_msdosfs/main.c +++ b/sbin/fsck_msdosfs/main.c @@ -138,6 +138,7 @@ ask(int def, const char *fmt, ...) va_start(ap, fmt); vsnprintf(prompt, sizeof(prompt), fmt, ap); + va_end(ap); if (alwaysyes || rdonly) { printf("%s? %s\n", prompt, rdonly ? "no" : "yes"); return !rdonly; diff --git a/sbin/geom/class/eli/geli.8 b/sbin/geom/class/eli/geli.8 index a97b6e9d6ad..3cb1f211769 100644 --- a/sbin/geom/class/eli/geli.8 +++ b/sbin/geom/class/eli/geli.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 4, 2012 +.Dd June 18, 2012 .Dt GELI 8 .Os .Sh NAME @@ -186,14 +186,15 @@ one of the following algorithms: or .Nm HMAC/SHA512 . .It -Can create a key from a couple of components (user entered passphrase, random -bits from a file, etc.). +Can create a User Key from up to two, piecewise components: a passphrase +entered via prompt or read from one or more passfiles; a keyfile read from +one or more files. .It Allows encryption of the root partition. The user will be asked for the passphrase before the root file system is mounted. .It -The passphrase of the user is strengthened with: +Strengthens the passphrase component of the User Key with: .Rs .%A B. Kaliski .%T "PKCS #5: Password-Based Cryptography Specification, Version 2.0." @@ -201,7 +202,7 @@ The passphrase of the user is strengthened with: .%N 2898 .Re .It -Allows the use of two independent keys (e.g., a +Allows the use of two independent User Keys (e.g., a .Qq "user key" and a .Qq "company key" ) . @@ -210,8 +211,8 @@ It is fast - .Nm performs simple sector-to-sector encryption. .It -Allows Master Keys to be backed up and restored, -so that if a user has to quickly destroy his keys, +Allows the encrypted Master Key to be backed up and restored, +so that if a user has to quickly destroy key material, it is possible to get the data back by restoring keys from backup. .It @@ -219,8 +220,8 @@ Providers can be configured to automatically detach on last close (so users do not have to remember to detach providers after unmounting the file systems). .It -Allows attaching a provider with a random, one-time key - useful for swap -partitions and temporary file systems. +Allows attaching a provider with a random, one-time Master Key - +useful for swap partitions and temporary file systems. .It Allows verification of data integrity (data authentication). .It @@ -233,7 +234,8 @@ indicates an action to be performed: .Bl -tag -width ".Cm configure" .It Cm init Initialize the provider which needs to be encrypted. -Here you can set up the cryptographic algorithm to use, key length, etc. +Here you can set up the cryptographic algorithm to use, Data Key length, +etc. The last sector of the provider is used to store metadata. The .Cm init @@ -289,37 +291,58 @@ and The default and recommended algorithm is .Nm AES-XTS . .It Fl i Ar iterations -Number of iterations to use with PKCS#5v2. +Number of iterations to use with PKCS#5v2 when processing User Key +passphrase component. If this option is not specified, .Nm will find the number of iterations which is equal to 2 seconds of crypto work. If 0 is given, PKCS#5v2 will not be used. +PKCS#5v2 processing is performed once, after all parts of the passphrase +component have been read. .It Fl J Ar newpassfile -Specifies a file which contains the passphrase or its part. +Specifies a file which contains the passphrase component of the User Key +(or part of it). If .Ar newpassfile is given as -, standard input will be used. Only the first line (excluding new-line character) is taken from the given file. -This argument can be specified multiple times. +This argument can be specified multiple times, which has the effect of +reassembling a single passphrase split across multiple files. +Cannot be combined with the +.Fl P +option. .It Fl K Ar newkeyfile -Specifies a file which contains part of the key. +Specifies a file which contains the keyfile component of the User Key +(or part of it). If .Ar newkeyfile is given as -, standard input will be used. -This argument can be specified multiple times. +This argument can be specified multiple times, which has the effect of +reassembling a single keyfile split across multiple keyfile parts. .It Fl l Ar keylen -Key length to use with the given cryptographic algorithm. -If not given, the default key length for the given algorithm is used, which is: -128 for -.Nm AES-XTS , -.Nm AES-CBC , -.Nm Blowfish-CBC -and -.Nm Camellia-CBC -and 192 for -.Nm 3DES-CBC . +Data Key length to use with the given cryptographic algorithm. +If the length is not specified, the selected algorithm uses its +.Em default +key length. +.Bl -ohang -offset indent +.It Nm AES-XTS +.Em 128 , +256 +.It Nm AES-CBC , Nm Camilla-CBC +.Em 128 , +192, +256 +.It Nm Blowfish-CBC +.Em 128 ++ n * 32, for n=[0..10] +.It Nm 3DES-CBC +.Em 192 +.El .It Fl P -Do not use passphrase as the key component. +Do not use a passphrase as a component of the User Key. +Cannot be combined with the +.Fl J +option. .It Fl s Ar sectorsize Change decrypted provider's sector size. Increasing the sector size allows increased performance, @@ -337,9 +360,9 @@ Note that using older metadata version may limit numer of features available. .El .It Cm attach Attach the given provider. -The master key will be decrypted using the given -passphrase/keyfile and a new GEOM provider will be created using the given -provider's name with an +The encrypted Master Key will be loaded from the metadata and decrypted +using the given passphrase/keyfile and a new GEOM provider will be created +using the given provider's name with an .Qq .eli suffix. .Pp @@ -357,28 +380,33 @@ option for the .Cm detach subcommand. .It Fl j Ar passfile -Specifies a file which contains the passphrase or its part. +Specifies a file which contains the passphrase component of the User Key +(or part of it). For more information see the description of the .Fl J option for the .Cm init subcommand. .It Fl k Ar keyfile -Specifies a file which contains part of the key. +Specifies a file which contains the keyfile component of the User Key +(or part of it). For more information see the description of the .Fl K option for the .Cm init subcommand. .It Fl p -Do not use passphrase as the key component. +Do not use a passphrase as a component of the User Key. +Cannot be combined with the +.Fl j +option. .It Fl r Attach read-only provider. It will not be opened for writing. .El .It Cm detach Detach the given providers, which means remove the devfs entry -and clear the keys from memory. +and clear the Master Key and Data Keys from memory. .Pp Additional options include: .Bl -tag -width ".Fl f" @@ -391,7 +419,7 @@ while it is open, but will be automatically detached when it is closed for the last time even if it was only opened for reading. .El .It Cm onetime -Attach the given providers with random, one-time keys. +Attach the given providers with a random, one-time (ephemeral) Master Key. The command can be used to encrypt swap partitions or temporary file systems. .Pp Additional options include: @@ -415,7 +443,7 @@ For more information, see the description of the .Cm attach subcommand. .It Fl l Ar keylen -Key length to use with the given cryptographic algorithm. +Data Key length to use with the given cryptographic algorithm. For more information, see the description of the .Cm init subcommand. @@ -439,15 +467,18 @@ subcommand. Remove the BOOT flag from the given providers. .El .It Cm setkey -Change or setup (if not yet initialized) selected key. -There is one master key, which can be encrypted with two independent user keys. +Install a copy of the Master Key into the selected slot, encrypted with +a new User Key. +If the selected slot is populated, replace the existing copy. +A provider has one Master Key, which can be stored in one or both slots, +each encrypted with an independent User Key. With the .Cm init subcommand, only key number 0 is initialized. -The key can always be changed: for an attached provider, +The User Key can be changed at any time: for an attached provider, for a detached provider, or on the backup file. When a provider is attached, the user does not have to provide -an old passphrase/keyfile. +an existing passphrase/keyfile. .Pp Additional options include: .Bl -tag -width ".Fl J Ar newpassfile" @@ -458,44 +489,54 @@ To be able to use this option with the .Cm setkey subcommand, only one key has to be defined and this key must be changed. .It Fl j Ar passfile -Specifies a file which contains the old passphrase or its part. +Specifies a file which contains the passphrase component of a current User Key +(or part of it). .It Fl J Ar newpassfile -Specifies a file which contains the new passphrase or its part. +Specifies a file which contains the passphrase component of the new User Key +(or part of it). .It Fl k Ar keyfile -Specifies a file which contains part of the old key. +Specifies a file which contains the keyfile component of a current User Key +(or part of it). .It Fl K Ar newkeyfile -Specifies a file which contains part of the new key. +Specifies a file which contains the keyfile component of the new User Key +(or part of it). .It Fl n Ar keyno -Specifies the number of the key to change (could be 0 or 1). +Specifies the index number of the Master Key copy to change (could be 0 or 1). If the provider is attached and no key number is given, the key used for attaching the provider will be changed. If the provider is detached (or we are operating on a backup file) -and no key number is given, the key decrypted with the passphrase/keyfile -will be changed. +and no key number is given, the first Master Key copy to be successfully +decrypted with the provided User Key passphrase/keyfile will be changed. .It Fl p -Do not use passphrase as the old key component. +Do not use a passphrase as a component of the current User Key. +Cannot be combined with the +.Fl j +option. .It Fl P -Do not use passphrase as the new key component. +Do not use a passphrase as a component of the new User Key. +Cannot be combined with the +.Fl J +option. .El .It Cm delkey -Destroy (overwrite with random data) the selected key. +Destroy (overwrite with random data) the selected Master Key copy. If one is destroying keys for an attached provider, the provider -will not be detached even if all keys are destroyed. +will not be detached even if all copies of the Master Key are destroyed. It can even be rescued with the .Cm setkey -subcommand. +subcommand because the Master Key is still in memory. .Pp Additional options include: .Bl -tag -width ".Fl a Ar keyno" .It Fl a -Destroy all keys (does not need +Destroy all copies of the Master Key (does not need .Fl f option). .It Fl f Force key destruction. -This option is needed to destroy the last key. +This option is needed to destroy the last copy of the Master Key. .It Fl n Ar keyno -Specifies the key number. +Specifies the index number of the Master Key copy. If the provider is attached and no key number is given, the key used for attaching the provider will be destroyed. If provider is detached (or we are operating on a backup file) the key number @@ -503,8 +544,8 @@ has to be given. .El .It Cm kill This command should be used only in emergency situations. -It will destroy all the keys on a given provider and will detach it forcibly -(if it is attached). +It will destroy all copies of the Master Key on a given provider and will +detach it forcibly (if it is attached). This is absolutely a one-way command - if you do not have a metadata backup, your data is gone for good. In case the provider was attached with the @@ -542,8 +583,8 @@ and .El .It Cm suspend Suspend device by waiting for all inflight requests to finish, clearing all -sensitive information (like keys) from kernel memory, and blocking all -further I/O requests until the +sensitive information (like the Master Key and Data Keys) from kernel memory, +and blocking all further I/O requests until the .Cm resume subcommand is executed. This functionality is useful for laptops: when one wants to suspend a @@ -553,8 +594,8 @@ on an encrypted device, unmounting the file system, and detaching the device, the .Cm suspend subcommand can be used. -Any access to the encrypted device will be blocked until the keys are -recovered through the +Any access to the encrypted device will be blocked until the Master Key is +reloaded through the .Cm resume subcommand. Thus there is no need to close nor unmount anything. @@ -584,21 +625,26 @@ utility is stored is bad idea. Additional options include: .Bl -tag -width ".Fl j Ar passfile" .It Fl j Ar passfile -Specifies a file which contains the passphrase or its part. +Specifies a file which contains the passphrase component of the User Key +(or part of it). For more information see the description of the .Fl J option for the .Cm init subcommand. .It Fl k Ar keyfile -Specifies a file which contains part of the key. +Specifies a file which contains the keyfile component of the User Key +(or part of it). For more information see the description of the .Fl K option for the .Cm init subcommand. .It Fl p -Do not use passphrase as the key component. +Do not use a passphrase as a component of the User Key. +Cannot be combined with the +.Fl j +option. .El .It Cm resize Inform @@ -626,6 +672,9 @@ If GEOM providers are specified, the subcommand will print metadata version used by each of them. .It Cm clear Clear metadata from the given providers. +.Em WARNING : +This will erase with zeros the encrypted Master Key copies stored in the +metadata. .It Cm dump Dump metadata stored on the given providers. .It Cm list @@ -647,6 +696,36 @@ Additional options include: .It Fl v Be more verbose. .El +.Sh KEY SUMMARY +.Ss Master Key +Upon +.Cm init , +the +.Nm +utility generates a random Master Key for the provider. +The Master Key never changes during the lifetime of the provider. +Each copy of the provider metadata, active or backed up to a file, can store +up to two, independently-encrypted copies of the Master Key. +.Ss User Key +Each stored copy of the Master Key is encrypted with a User Key, which +is generated by the +.Nm +utility from a passphrase and/or a keyfile. +The +.Nm +utility first reads all parts of the keyfile in the order specified on the +command line, then reads all parts of the stored passphrase in the order +specified on the command line. +If no passphrase parts are specified, the system prompts the user to enter +the passphrase. +The passphrase is optionally strengthened by PKCS#5v2. +The User Key is a digest computed over the concatenated keyfile and passphrase. +.Ss Data Key +During operation, one or more Data Keys are deterministically derived by +the kernel from the Master Key and cached in memory. +The number of Data Keys used by a given provider, and the way they are +derived, depend on the GELI version and whether the provider is configured to +use data authentication. .Sh SYSCTL VARIABLES The following .Xr sysctl 8 @@ -677,7 +756,7 @@ If set to 0, attaching providers on boot will be disabled. This variable should be set in .Pa /boot/loader.conf . .It Va kern.geom.eli.overwrites : No 5 -Specifies how many times the Master-Key will be overwritten +Specifies how many times the Master Key will be overwritten with random values when it is destroyed. After this operation it is filled with zeros. .It Va kern.geom.eli.visible_passphrase : No 0 @@ -692,7 +771,6 @@ This variable should be set in Specifies how many kernel threads should be used for doing software cryptography. Its purpose is to increase performance on SMP systems. -If hardware acceleration is available, only one thread will be started. If set to 0, a CPU-pinned thread will be started for every active CPU. .It Va kern.geom.eli.batch : No 0 When set to 1, can speed-up crypto operations by using batching. @@ -700,18 +778,19 @@ Batching reduces the number of interrupts by responding to a group of crypto requests with one interrupt. The crypto card and the driver has to support this feature. .It Va kern.geom.eli.key_cache_limit : No 8192 -Specifies how many encryption keys to cache. +Specifies how many Data Keys to cache. The default limit (8192 keys) will allow caching of all keys for a 4TB provider with 512 byte sectors and will take around 1MB of memory. .It Va kern.geom.eli.key_cache_hits -Reports how many times we were looking up a key and it was already in cache. -This sysctl is not updated for providers that need less keys than the limit -specified in +Reports how many times we were looking up a Data Key and it was already in +cache. +This sysctl is not updated for providers that need fewer Data Keys than +the limit specified in .Va kern.geom.eli.key_cache_limit . .It Va kern.geom.eli.key_cache_misses -Reports how many times we were looking up a key and it was not in cache. -This sysctl is not updated for providers that need fewer keys than the limit +Reports how many times we were looking up a Data Key and it was not in cache. +This sysctl is not updated for providers that need fewer Data Keys than the limit specified in .Va kern.geom.eli.key_cache_limit . .El @@ -739,7 +818,7 @@ Enter passphrase: # geli detach da2.eli .Ed .Pp -Create an encrypted provider, but use two keys: +Create an encrypted provider, but use two User Keys: one for your employee and one for you as the company's security officer (so it's not a tragedy if the employee .Qq accidentally @@ -761,7 +840,7 @@ forget their passphrases, so backup the Master Key with your own random key: # dd if=/dev/random of=/mnt/pendrive/keys/`hostname` bs=64 count=1 # geli init -P -K /mnt/pendrive/keys/`hostname` /dev/ad0s1e # geli backup /dev/ad0s1e /mnt/pendrive/backups/`hostname` -(use key number 0, so the encrypted Master Key will be overwritten by this) +(use key number 0, so the encrypted Master Key will be re-encrypted by this) # geli setkey -n 0 -k /mnt/pendrive/keys/`hostname` /dev/ad0s1e (allow the user to enter his passphrase) Enter new passphrase: @@ -777,8 +856,8 @@ Encrypted swap partition setup: .Pp The example below shows how to configure two providers which will be attached on boot (before the root file system is mounted). -One of them is using passphrase and three keyfiles and the other is using only a -keyfile: +One of them is using passphrase and three keyfile parts and the other is +using only a keyfile in one part: .Bd -literal -offset indent # dd if=/dev/random of=/dev/da0 bs=1m # dd if=/dev/random of=/boot/keys/da0.key0 bs=32k count=1 @@ -925,6 +1004,9 @@ will not protect your data against replay attacks. It is recommended to write to the whole provider before first use, in order to make sure that all sectors and their corresponding checksums are properly initialized into a consistent state. +One can safely ignore data authentication errors that occur immediately +after the first time a provider is attached and before it is +initialized in this way. .Sh SEE ALSO .Xr crypto 4 , .Xr gbde 4 , diff --git a/sbin/geom/class/part/geom_part.c b/sbin/geom/class/part/geom_part.c index 8296517ff7b..8a57ca44ebf 100644 --- a/sbin/geom/class/part/geom_part.c +++ b/sbin/geom/class/part/geom_part.c @@ -507,6 +507,8 @@ gpart_autofill(struct gctl_req *req) grade = ~0ULL; a_first = ALIGNUP(first + offset, alignment); last = ALIGNDOWN(last + offset, alignment); + if (a_first < start) + a_first = start; while ((pp = find_provider(gp, first)) != NULL) { s = find_provcfg(pp, "start"); lba = (off_t)strtoimax(s, NULL, 0); @@ -536,7 +538,8 @@ gpart_autofill(struct gctl_req *req) s = find_provcfg(pp, "end"); first = (off_t)strtoimax(s, NULL, 0) + 1; - a_first = ALIGNUP(first + offset, alignment); + if (first > a_first) + a_first = ALIGNUP(first + offset, alignment); } if (a_first <= last) { /* Free space [first-last] */ diff --git a/sbin/geom/class/part/gpart.8 b/sbin/geom/class/part/gpart.8 index b52da967568..2e745c40fca 100644 --- a/sbin/geom/class/part/gpart.8 +++ b/sbin/geom/class/part/gpart.8 @@ -650,7 +650,7 @@ for MBR, for GPT. .It Cm ms-ldm-metadata A partition that contains Logical Disk Manager (LDM) database. -The scheme-specifig type is +The scheme-specific type is .Qq Li "!5808c8aa-7e8f-42e0-85d2-e1e90434cfb3" for GPT. .El @@ -971,7 +971,7 @@ By default mirrored volumes are shown as partitions with type .Sx "PARTITION TYPES" section). If this variable set to 1 each component of the mirrored volume will be -present as independet partition. +present as independent partition. .Em NOTE : This may break a mirrored volume and lead to data damage. .El diff --git a/sbin/geom/class/raid/geom_raid.c b/sbin/geom/class/raid/geom_raid.c index 2f1629532e7..d3383bc8bff 100644 --- a/sbin/geom/class/raid/geom_raid.c +++ b/sbin/geom/class/raid/geom_raid.c @@ -48,11 +48,12 @@ struct g_command class_commands[] = { { "label", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, + { 'o', "fmtopt", G_VAL_OPTIONAL, G_TYPE_STRING }, { 'S', "size", G_VAL_OPTIONAL, G_TYPE_NUMBER }, { 's', "strip", G_VAL_OPTIONAL, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-fv] [-S size] [-s stripsize] format label level prov ..." + "[-fv] [-o fmtopt] [-S size] [-s stripsize] format label level prov ..." }, { "add", G_FLAG_VERBOSE, NULL, { diff --git a/sbin/geom/class/raid/graid.8 b/sbin/geom/class/raid/graid.8 index e9fd5a4df78..e062658c0fd 100644 --- a/sbin/geom/class/raid/graid.8 +++ b/sbin/geom/class/raid/graid.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 19, 2012 +.Dd May 6, 2012 .Dt GRAID 8 .Os .Sh NAME @@ -34,6 +34,7 @@ .Nm .Cm label .Op Fl f +.Op Fl o Ar fmtopt .Op Fl S Ar size .Op Fl s Ar strip .Ar format @@ -84,7 +85,7 @@ utility is used to manage software RAID configurations, supported by the GEOM RAID class. GEOM RAID class uses on-disk metadata to provide access to software-RAID volumes defined by different RAID BIOSes. -Depending on RAID BIOS type and it's metadata format, different subsets of +Depending on RAID BIOS type and its metadata format, different subsets of configurations and features are supported. To allow booting from RAID volume, the metadata format should match the RAID BIOS type and its capabilities. @@ -119,6 +120,8 @@ Additional options include: .It Fl f Enforce specified configuration creation if it is officially unsupported, but technically can be created. +.It Fl o Ar fmtopt +Specifies metadata format options. .It Fl S Ar size Use .Ar size @@ -200,6 +203,23 @@ The GEOM RAID class follows a modular design, allowing different metadata formats to be used. Support is currently implemented for the following formats: .Bl -tag -width "Intel" +.It DDF +The format defined by the SNIA Common RAID Disk Data Format v2.0 specification. +Used by some Adaptec RAID BIOSes and some hardware RAID controllers. +Because of high format flexibility different implementations support +different set of features and have different on-disk metadata layouts. +To provide compatibility, the GEOM RAID class mimics capabilities +of the first detected DDF array. +Respecting that, it may support different number of disks per volume, +volumes per array, partitions per disk, etc. +The following configurations are supported: RAID0 (2+ disks), RAID1 (2+ disks), +RAID1E (3+ disks), RAID3 (3+ disks), RAID4 (3+ disks), RAID5 (3+ disks), +RAID5E (4+ disks), RAID5EE (4+ disks), RAID5R (3+ disks), RAID6 (4+ disks), +RAIDMDF (4+ disks), RAID10 (4+ disks), SINGLE (1 disk), CONCAT (2+ disks). +.Pp +Format supports two options "BE" and "LE", that mean big-endian byte order +defined by specification (default) and little-endian used by some Adaptec +controllers. .It Intel The format used by Intel RAID BIOS. Supports up to two volumes per array. @@ -241,9 +261,11 @@ own risk: RAID1 (3+ disks), RAID10 (6+ disks). .Sh SUPPORTED RAID LEVELS The GEOM RAID class follows a modular design, allowing different RAID levels to be used. -Support for the following RAID levels is currently implemented: RAID0, RAID1, -RAID1E, RAID5, RAID10, SINGLE, CONCAT. -RAID5 support is read-only and only for volumes in optimal state. +Full support for the following RAID levels is currently implemented: +RAID0, RAID1, RAID1E, RAID10, SINGLE, CONCAT. +The following RAID levels supported as read-only for volumes in optimal +state (without using redundancy): RAID4, RAID5, RAID5E, RAID5EE, RAID5R, +RAID6, RAIDMDF. .Sh RAID LEVEL MIGRATION The GEOM RAID class has no support for RAID level migration, allowed by some metadata formats. @@ -254,6 +276,33 @@ corruption! .Sh 2TiB BARRIERS Promise metadata format does not support disks above 2TiB. NVIDIA metadata format does not support volumes above 2TiB. +.Sh SYSCTL VARIABLES +The following +.Xr sysctl 8 +variable can be used to control the behavior of the +.Nm RAID +GEOM class. +.Bl -tag -width indent +.It Va kern.geom.raid.aggressive_spare : No 0 +Use any disks without metadata connected to controllers of the vendor +matching to volume metadata format as spare. +Use it with much care to not lose data if connecting unrelated disk! +.It Va kern.geom.raid.clean_time : No 5 +Mark volume as clean when idle for the specified number of seconds. +.It Va kern.geom.raid.debug : No 0 +Debug level of the +.Nm RAID +GEOM class. +.It Va kern.geom.raid.idle_threshold : No 1000000 +Time in microseconds to consider a volume idle for rebuild purposes. +.It Va kern.geom.raid.name_format : No 0 +Providers name format: 0 -- raid/r{num}, 1 -- raid/{label}. +.It Va kern.geom.raid.read_err_thresh : No 10 +Number of read errors equated to disk failure. +Write errors are always considered as disk failures. +.It Va kern.geom.raid.start_timeout : No 30 +Time to wait for missing array components on startup. +.El .Sh EXIT STATUS Exit status is 0 on success, and non-zero if the command fails. .Sh SEE ALSO diff --git a/sbin/geom/class/virstor/gvirstor.8 b/sbin/geom/class/virstor/gvirstor.8 index cd7cb2f5fdc..cdb50b1d0f5 100644 --- a/sbin/geom/class/virstor/gvirstor.8 +++ b/sbin/geom/class/virstor/gvirstor.8 @@ -113,7 +113,7 @@ Adds new components to existing virtual device with the given The specified virstor device must exist and be active .Pq i.e. module loaded, device present in Pa /dev . This action can be safely performed while the virstor device is in use -.Pq Qo hot Qc operation +.Pq Qo hot Qc operation . .It Cm remove Removes components from existing virtual device with the given .Ar name . @@ -268,7 +268,8 @@ change once it is set, and that the sizes of individual physical storage components will always remain constant during their existence. For alternative ways to implement virtual or resizable file systems see .Xr zfs 1M , -.Xr gconcat 8 and +.Xr gconcat 8 +and .Xr growfs 8 . .Pp Note that diff --git a/sbin/growfs/Makefile b/sbin/growfs/Makefile index a875ce554c1..f464ed7d77a 100644 --- a/sbin/growfs/Makefile +++ b/sbin/growfs/Makefile @@ -6,12 +6,18 @@ #GFSDBG= +.PATH: ${.CURDIR}/../mount + PROG= growfs -SRCS= growfs.c +SRCS= growfs.c getmntopts.c MAN= growfs.8 +CFLAGS+=-I${.CURDIR}/../mount .if defined(GFSDBG) SRCS+= debug.c .endif +DPADD= ${LIBUTIL} +LDADD= -lutil + .include diff --git a/sbin/growfs/growfs.8 b/sbin/growfs/growfs.8 index 819e0bd683f..92508dac978 100644 --- a/sbin/growfs/growfs.8 +++ b/sbin/growfs/growfs.8 @@ -37,7 +37,7 @@ .\" $TSHeader: src/sbin/growfs/growfs.8,v 1.3 2000/12/12 19:31:00 tomsoft Exp $ .\" $FreeBSD$ .\" -.Dd June 29, 2011 +.Dd April 30, 2012 .Dt GROWFS 8 .Os .Sh NAME @@ -47,41 +47,20 @@ .Nm .Op Fl Ny .Op Fl s Ar size -.Ar special +.Ar special | filesystem .Sh DESCRIPTION The .Nm -utility extends the -.Xr newfs 8 -program. -Before starting +utility makes it possible to expand an UFS file system. +Before running .Nm -the disk must be labeled to a bigger size using -.Xr bsdlabel 8 . -If you wish to grow a file system beyond the boundary of -the slice it resides in, you must re-size the slice using -.Xr gpart 8 -before running -.Nm . +the partition or slice containing the file system must be extended using +.Xr gpart 8 . If you are using volumes you must enlarge them by using .Xr gvinum 8 . The .Nm utility extends the size of the file system on the specified special file. -Currently -.Nm -can only enlarge unmounted file systems. -Do not try enlarging a mounted file system, your system may panic and you will -not be able to use the file system any longer. -Most of the -.Xr newfs 8 -options cannot be changed by -.Nm . -In fact, you can only increase the size of the file system. -Use -.Xr tunefs 8 -for other changes. -.Pp The following options are available: .Bl -tag -width indent .It Fl N @@ -103,6 +82,13 @@ So use this option with great care! Determines the .Ar size of the file system after enlarging in sectors. +.Ar Size +is the number of 512 byte sectors unless suffixed with a +.Cm b , k , m , g , +or +.Cm t +which +denotes byte, kilobyte, megabyte, gigabyte and terabyte respectively. This value defaults to the size of the raw partition specified in .Ar special (in other words, @@ -110,19 +96,18 @@ This value defaults to the size of the raw partition specified in will enlarge the file system to the size of the entire partition). .El .Sh EXAMPLES -.Dl growfs -s 4194304 /dev/vinum/testvol +.Dl growfs -s 2G /dev/ada0p1 .Pp will enlarge -.Pa /dev/vinum/testvol +.Pa /dev/ada0p1 up to 2GB if there is enough space in -.Pa /dev/vinum/testvol . +.Pa /dev/ada0p1 . .Sh SEE ALSO -.Xr bsdlabel 8 , .Xr dumpfs 8 , .Xr ffsinfo 8 , .Xr fsck 8 , +.Xr fsdb 8 , .Xr gpart 8 , -.Xr gvinum 8 , .Xr newfs 8 , .Xr tunefs 8 .Sh HISTORY @@ -134,61 +119,11 @@ utility first appeared in .An Christoph Herrmann Aq chm@FreeBSD.org .An Thomas-Henning von Kamptz Aq tomsoft@FreeBSD.org .An The GROWFS team Aq growfs@Tomsoft.COM +.An Edward Tomasz Napierala Aq trasz@FreeBSD.org .Sh BUGS -The -.Nm -utility works starting with -.Fx -3.x. -There may be cases on -.Fx -3.x only, when -.Nm -does not recognize properly whether or not the file system is mounted and -exits with an error message. -Then please use -.Nm -.Fl y -if you are sure that the file system is not mounted. -It is also recommended to always use -.Xr fsck 8 -after enlarging (just to be on the safe side). -.Pp -For enlarging beyond certain limits, it is essential to have some free blocks -available in the first cylinder group. -If that space is not available in the first cylinder group, a critical data -structure has to be relocated into one of the new available cylinder groups. -On -.Fx -3.x this will cause problems with -.Xr fsck 8 -afterwards. -So -.Xr fsck 8 -needs to be patched if you want to use -.Nm -for -.Fx -3.x. -This patch is already integrated in -.Fx -starting with -.Fx 4.4 . -To avoid an unexpected relocation of that structure it is possible to use -.Nm ffsinfo -.Fl g Ar 0 -.Fl l Ar 4 -on the first cylinder group to verify that -.Em nbfree -in the CYLINDER SUMMARY (internal cs) of the CYLINDER GROUP -.Em cgr0 -has enough blocks. -As a rule of thumb for default file system parameters one block is needed for -every 2 GB of total file system size. -.Pp Normally .Nm -writes this critical structure to disk and reads it again later for doing more +writes cylinder group summary to disk and reads it again later for doing more updates. This read operation will provide unexpected data when using .Fl N . diff --git a/sbin/growfs/growfs.c b/sbin/growfs/growfs.c index 7d04345111d..81cafead5fa 100644 --- a/sbin/growfs/growfs.c +++ b/sbin/growfs/growfs.c @@ -1,11 +1,15 @@ /* - * Copyright (c) 2000 Christoph Herrmann, Thomas-Henning von Kamptz * Copyright (c) 1980, 1989, 1993 The Regents of the University of California. + * Copyright (c) 2000 Christoph Herrmann, Thomas-Henning von Kamptz + * Copyright (c) 2012 The FreeBSD Foundation * All rights reserved. * * This code is derived from software contributed to Berkeley by * Christoph Herrmann and Thomas-Henning von Kamptz, Munich and Frankfurt. * + * Portions of this software were developed by Edward Tomasz Napierala + * under sponsorship from the FreeBSD Foundation. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -53,13 +57,18 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include #include #include #include +#include +#include #include +#include #include #include #include @@ -67,6 +76,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include "debug.h" @@ -109,7 +119,7 @@ static void updjcg(int, time_t, int, int, unsigned int); static void updcsloc(time_t, int, int, unsigned int); static void frag_adjust(ufs2_daddr_t, int); static void updclst(int); -static void get_dev_size(int, int *); +static void mount_reload(const struct statfs *stfs); /* * Here we actually start growing the file system. We basically read the @@ -177,6 +187,7 @@ growfs(int fsi, int fso, unsigned int Nflag) /* * Dump out summary information about file system. */ +#ifdef FS_DEBUG #define B2MBFACTOR (1 / (1024.0 * 1024.0)) printf("growfs: %.1fMB (%jd sectors) block size %d, fragment size %d\n", (float)sblock.fs_size * sblock.fs_fsize * B2MBFACTOR, @@ -188,6 +199,7 @@ growfs(int fsi, int fso, unsigned int Nflag) if (sblock.fs_flags & FS_DOSOFTDEP) printf("\twith soft updates\n"); #undef B2MBFACTOR +#endif /* FS_DEBUG */ /* * Now build the cylinders group blocks and @@ -774,7 +786,7 @@ updjcg(int cylno, time_t modtime, int fsi, int fso, unsigned int Nflag) /* * Here we update the location of the cylinder summary. We have two possible - * ways of growing the cylinder summary. + * ways of growing the cylinder summary: * (1) We can try to grow the summary in the current location, and relocate * possibly used blocks within the current cylinder group. * (2) Alternatively we can relocate the whole cylinder summary to the first @@ -791,7 +803,6 @@ updcsloc(time_t modtime, int fsi, int fso, unsigned int Nflag) DBG_FUNC("updcsloc") struct csum *cs; int ocscg, ncscg; - int blocks; ufs2_daddr_t d; int lcs = 0; int block; @@ -808,8 +819,6 @@ updcsloc(time_t modtime, int fsi, int fso, unsigned int Nflag) } ocscg = dtog(&osblock, osblock.fs_csaddr); cs = fscs + ocscg; - blocks = 1 + howmany(sblock.fs_cssize, sblock.fs_bsize) - - howmany(osblock.fs_cssize, osblock.fs_bsize); /* * Read original cylinder group from disk, and make a copy. @@ -1238,24 +1247,104 @@ charsperline(void) return (columns); } -/* - * Get the size of the partition. - */ -static void -get_dev_size(int fd, int *size) +static int +is_dev(const char *name) { - int sectorsize; - off_t mediasize; + struct stat devstat; - if (ioctl(fd, DIOCGSECTORSIZE, §orsize) == -1) - err(1,"DIOCGSECTORSIZE"); - if (ioctl(fd, DIOCGMEDIASIZE, &mediasize) == -1) - err(1,"DIOCGMEDIASIZE"); + if (stat(name, &devstat) != 0) + return (0); + if (!S_ISCHR(devstat.st_mode)) + return (0); + return (1); +} - if (sectorsize <= 0) - errx(1, "bogus sectorsize: %d", sectorsize); +/* + * Return mountpoint on which the device is currently mounted. + */ +static const struct statfs * +dev_to_statfs(const char *dev) +{ + struct stat devstat, mntdevstat; + struct statfs *mntbuf, *statfsp; + char device[MAXPATHLEN]; + char *mntdevname; + int i, mntsize; - *size = mediasize / sectorsize; + /* + * First check the mounted filesystems. + */ + if (stat(dev, &devstat) != 0) + return (NULL); + if (!S_ISCHR(devstat.st_mode) && !S_ISBLK(devstat.st_mode)) + return (NULL); + + mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); + for (i = 0; i < mntsize; i++) { + statfsp = &mntbuf[i]; + mntdevname = statfsp->f_mntfromname; + if (*mntdevname != '/') { + strcpy(device, _PATH_DEV); + strcat(device, mntdevname); + mntdevname = device; + } + if (stat(mntdevname, &mntdevstat) == 0 && + mntdevstat.st_rdev == devstat.st_rdev) + return (statfsp); + } + + return (NULL); +} + +static const char * +mountpoint_to_dev(const char *mountpoint) +{ + struct statfs *mntbuf, *statfsp; + struct fstab *fs; + int i, mntsize; + + /* + * First check the mounted filesystems. + */ + mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); + for (i = 0; i < mntsize; i++) { + statfsp = &mntbuf[i]; + + if (strcmp(statfsp->f_mntonname, mountpoint) == 0) + return (statfsp->f_mntfromname); + } + + /* + * Check the fstab. + */ + fs = getfsfile(mountpoint); + if (fs != NULL) + return (fs->fs_spec); + + return (NULL); +} + +static const char * +getdev(const char *name) +{ + static char device[MAXPATHLEN]; + const char *cp, *dev; + + if (is_dev(name)) + return (name); + + cp = strrchr(name, '/'); + if (cp == 0) { + snprintf(device, sizeof(device), "%s%s", _PATH_DEV, name); + if (is_dev(device)) + return (device); + } + + dev = mountpoint_to_dev(name); + if (dev != NULL && is_dev(dev)) + return (dev); + + return (NULL); } /* @@ -1283,17 +1372,13 @@ int main(int argc, char **argv) { DBG_FUNC("main") - char *device, *special; - int ch; - unsigned int size = 0; - size_t len; - unsigned int Nflag = 0; - int ExpertFlag = 0; - struct stat st; - int i, fsi, fso; - u_int32_t p_size; - char reply[5]; - int j; + const char *device; + const struct statfs *statfsp; + uint64_t size = 0; + off_t mediasize; + int error, i, j, fsi, fso, ch, Nflag = 0, yflag = 0; + char *p, reply[5], oldsizebuf[6], newsizebuf[6]; + void *testbuf; DBG_ENTER; @@ -1303,14 +1388,27 @@ main(int argc, char **argv) Nflag = 1; break; case 's': - size = (size_t)atol(optarg); - if (size < 1) - usage(); + size = (off_t)strtoumax(optarg, &p, 0); + if (p == NULL || *p == '\0') + size *= DEV_BSIZE; + else if (*p == 'b' || *p == 'B') + ; /* do nothing */ + else if (*p == 'k' || *p == 'K') + size <<= 10; + else if (*p == 'm' || *p == 'M') + size <<= 20; + else if (*p == 'g' || *p == 'G') + size <<= 30; + else if (*p == 't' || *p == 'T') { + size <<= 30; + size <<= 10; + } else + errx(1, "unknown suffix on -s argument"); break; case 'v': /* for compatibility to newfs */ break; case 'y': - ExpertFlag = 1; + yflag = 1; break; case '?': /* FALLTHROUGH */ @@ -1324,71 +1422,29 @@ main(int argc, char **argv) if (argc != 1) usage(); - device = *argv; - /* - * Now try to guess the (raw)device name. + * Now try to guess the device name. */ - if (0 == strrchr(device, '/')) { - /* - * No path prefix was given, so try in that order: - * /dev/r%s - * /dev/%s - * /dev/vinum/r%s - * /dev/vinum/%s. - * - * FreeBSD now doesn't distinguish between raw and block - * devices any longer, but it should still work this way. - */ - len = strlen(device) + strlen(_PATH_DEV) + 2 + strlen("vinum/"); - special = (char *)malloc(len); - if (special == NULL) - errx(1, "malloc failed"); - snprintf(special, len, "%sr%s", _PATH_DEV, device); - if (stat(special, &st) == -1) { - snprintf(special, len, "%s%s", _PATH_DEV, device); - if (stat(special, &st) == -1) { - snprintf(special, len, "%svinum/r%s", - _PATH_DEV, device); - if (stat(special, &st) == -1) { - /* For now this is the 'last resort' */ - snprintf(special, len, "%svinum/%s", - _PATH_DEV, device); - } - } - } - device = special; - } + device = getdev(*argv); + if (device == NULL) + errx(1, "cannot find special device for %s", *argv); - /* - * Try to access our devices for writing ... - */ - if (Nflag) { - fso = -1; - } else { - fso = open(device, O_WRONLY); - if (fso < 0) - err(1, "%s", device); - } + statfsp = dev_to_statfs(device); - /* - * ... and reading. - */ fsi = open(device, O_RDONLY); if (fsi < 0) err(1, "%s", device); /* - * Try to guess the slice if not specified. This code should guess - * the right thing and avoid to bother the user with the task - * of specifying the option -v on vinum volumes. + * Try to guess the slice size if not specified. */ - get_dev_size(fsi, &p_size); + if (ioctl(fsi, DIOCGMEDIASIZE, &mediasize) == -1) + err(1,"DIOCGMEDIASIZE"); /* * Check if that partition is suitable for growing a file system. */ - if (p_size < 1) + if (mediasize < 1) errx(1, "partition is unavailable"); /* @@ -1414,16 +1470,36 @@ main(int argc, char **argv) /* * Determine size to grow to. Default to the device size. */ - sblock.fs_size = dbtofsb(&osblock, p_size); - if (size != 0) { - if (size > p_size) - errx(1, "there is not enough space (%d < %d)", - p_size, size); - sblock.fs_size = dbtofsb(&osblock, size); + if (size == 0) + size = mediasize; + else { + if (size > (uint64_t)mediasize) { + humanize_number(oldsizebuf, sizeof(oldsizebuf), size, + "B", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); + humanize_number(newsizebuf, sizeof(newsizebuf), + mediasize, + "B", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); + + errx(1, "requested size %s is larger " + "than the available %s", oldsizebuf, newsizebuf); + } } + if (size <= (uint64_t)(osblock.fs_size * osblock.fs_fsize)) { + humanize_number(oldsizebuf, sizeof(oldsizebuf), + osblock.fs_size * osblock.fs_fsize, + "B", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); + humanize_number(newsizebuf, sizeof(newsizebuf), size, + "B", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); + + errx(1, "requested size %s is not larger than the current " + "filesystem size %s", newsizebuf, oldsizebuf); + } + + sblock.fs_size = dbtofsb(&osblock, size / DEV_BSIZE); + /* - * Are we really growing ? + * Are we really growing? */ if (osblock.fs_size >= sblock.fs_size) { errx(1, "we are not growing (%jd->%jd)", @@ -1433,7 +1509,7 @@ main(int argc, char **argv) /* * Check if we find an active snapshot. */ - if (ExpertFlag == 0) { + if (yflag == 0) { for (j = 0; j < FSMAXSNAP; j++) { if (sblock.fs_snapinum[j]) { errx(1, "active snapshot found in file system; " @@ -1445,10 +1521,23 @@ main(int argc, char **argv) } } - if (ExpertFlag == 0 && Nflag == 0) { - printf("We strongly recommend you to make a backup " + if (yflag == 0 && Nflag == 0) { + if (statfsp != NULL && (statfsp->f_flags & MNT_RDONLY) == 0) + errx(1, "%s is mounted read-write on %s", + statfsp->f_mntfromname, statfsp->f_mntonname); + printf("It's strongly recommended to make a backup " "before growing the file system.\n" - "Did you backup your data (Yes/No)? "); + "OK to grow filesystem on %s", device); + if (statfsp != NULL) + printf(", mounted on %s,", statfsp->f_mntonname); + humanize_number(oldsizebuf, sizeof(oldsizebuf), + osblock.fs_size * osblock.fs_fsize, + "B", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); + humanize_number(newsizebuf, sizeof(newsizebuf), + sblock.fs_size * sblock.fs_fsize, + "B", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); + printf(" from %s to %s? [Yes/No] ", oldsizebuf, newsizebuf); + fflush(stdout); fgets(reply, (int)sizeof(reply), stdin); if (strcmp(reply, "Yes\n")){ printf("\nNothing done\n"); @@ -1456,15 +1545,30 @@ main(int argc, char **argv) } } - printf("New file system size is %jd frags\n", (intmax_t)sblock.fs_size); + /* + * Try to access our device for writing. If it's not mounted, + * or mounted read-only, simply open it; otherwise, use UFS + * suspension mechanism. + */ + if (Nflag) { + fso = -1; + } else { + fso = open(device, O_WRONLY); + if (fso < 0) + err(1, "%s", device); + } /* - * Try to access our new last block in the file system. Even if we - * later on realize we have to abort our operation, on that block - * there should be no data, so we can't destroy something yet. + * Try to access our new last block in the file system. */ - wtfs((ufs2_daddr_t)p_size - 1, (size_t)DEV_BSIZE, (void *)&sblock, - fso, Nflag); + testbuf = malloc(sblock.fs_fsize); + if (testbuf == NULL) + err(1, "malloc"); + rdfs((ufs2_daddr_t)((size - sblock.fs_fsize) / DEV_BSIZE), + sblock.fs_fsize, testbuf, fsi); + wtfs((ufs2_daddr_t)((size - sblock.fs_fsize) / DEV_BSIZE), + sblock.fs_fsize, testbuf, fso, Nflag); + free(testbuf); /* * Now calculate new superblock values and check for reasonable @@ -1520,8 +1624,13 @@ main(int argc, char **argv) growfs(fsi, fso, Nflag); close(fsi); - if (fso > -1) - close(fso); + if (fso > -1) { + error = close(fso); + if (error != 0) + err(1, "close"); + } + if (statfsp != NULL) + mount_reload(statfsp); DBG_CLOSE; @@ -1539,7 +1648,7 @@ usage(void) DBG_ENTER; - fprintf(stderr, "usage: growfs [-Ny] [-s size] special\n"); + fprintf(stderr, "usage: growfs [-Ny] [-s size] special | filesystem\n"); DBG_LEAVE; exit(1); @@ -1586,3 +1695,26 @@ updclst(int block) DBG_LEAVE; return; } + +static void +mount_reload(const struct statfs *stfs) +{ + char errmsg[255]; + struct iovec *iov; + int iovlen; + + iov = NULL; + iovlen = 0; + *errmsg = '\0'; + build_iovec(&iov, &iovlen, "fstype", __DECONST(char *, "ffs"), 4); + build_iovec(&iov, &iovlen, "fspath", __DECONST(char *, stfs->f_mntonname), (size_t)-1); + build_iovec(&iov, &iovlen, "errmsg", errmsg, sizeof(errmsg)); + build_iovec(&iov, &iovlen, "update", NULL, 0); + build_iovec(&iov, &iovlen, "reload", NULL, 0); + + if (nmount(iov, iovlen, stfs->f_flags) < 0) { + errmsg[sizeof(errmsg) - 1] = '\0'; + err(9, "%s: cannot reload filesystem%s%s", stfs->f_mntonname, + *errmsg != '\0' ? ": " : "", errmsg); + } +} diff --git a/sbin/gvinum/gvinum.8 b/sbin/gvinum/gvinum.8 index 1300bf391e9..4753d798864 100644 --- a/sbin/gvinum/gvinum.8 +++ b/sbin/gvinum/gvinum.8 @@ -58,7 +58,8 @@ All subdisks in the plex must be up for a parity check. .It Ic concat Oo Fl fv Oc Oo Fl n Ar name Oc Ar drives Create a concatenated volume from the specified drives. -If no name is specified, a unique name will be set by gvinum. +If no name is specified, a unique name will be set by +.Ic gvinum . .It Ic create Oo Fl f Oc Op Ar description-file Create a volume as described in .Ar description-file . @@ -148,8 +149,8 @@ Normally this would be done by entering the EOF character. .It Ic raid5 Oo Fl fv Oc Oo Fl s Ar stripesize Oc Oo Fl n Ar name Oc Ar drives Create a RAID-5 volume from the specified drives. -If no name is specified,a unique name will be set by -.Ic gvinum. +If no name is specified, a unique name will be set by +.Ic gvinum . This organization requires at least three drives. .It Ic rename Oo Fl r Oc Ar drive | subdisk | plex | volume newname Change the name of the specified object. @@ -202,8 +203,9 @@ Terminate access to the objects, or stop if no parameters are specified. .It Ic stripe Oo Fl fv Oc Oo Fl n Ar name Oc Ar drives Create a striped volume from the specified drives. If no name is specified, -a unique name will be set by Ic gvinum. This organization requires at least two -drives. +a unique name will be set by +.Ic gvinum . +This organization requires at least two drives. .El .Sh DESCRIPTION The @@ -278,7 +280,8 @@ objects .El .Sh EXAMPLES To create a mirror on disks /dev/ad1 and /dev/ad2, create a filesystem, mount, -unmount and then stop Ic gvinum: +unmount and then stop +.Ic gvinum : .Pp .Dl "gvinum mirror /dev/ad1 /dev/ad2" .Dl "newfs /dev/gvinum/gvinumvolume0" diff --git a/sbin/hastctl/hastctl.8 b/sbin/hastctl/hastctl.8 index 31353ca58ae..9266fc01cbb 100644 --- a/sbin/hastctl/hastctl.8 +++ b/sbin/hastctl/hastctl.8 @@ -211,7 +211,7 @@ nodeB# application_start .Xr ggatel 8 , .Xr hastd 8 , .Xr mount 8 , -.Xr newfs 8 . +.Xr newfs 8 .Sh AUTHORS The .Nm diff --git a/sbin/hastd/hast.conf.5 b/sbin/hastd/hast.conf.5 index 0a0921adeb5..d78f539500c 100644 --- a/sbin/hastd/hast.conf.5 +++ b/sbin/hastd/hast.conf.5 @@ -37,7 +37,7 @@ .Xr hastd 8 daemon and the .Xr hastctl 8 -utility. +utility .Sh DESCRIPTION The .Nm @@ -439,7 +439,7 @@ resource tank { .Xr gethostname 3 , .Xr geom 4 , .Xr hastctl 8 , -.Xr hastd 8 . +.Xr hastd 8 .Sh AUTHORS The .Nm diff --git a/sbin/hastd/hast.h b/sbin/hastd/hast.h index 94e572426dd..263e9841094 100644 --- a/sbin/hastd/hast.h +++ b/sbin/hastd/hast.h @@ -244,6 +244,5 @@ void yy_config_free(struct hastd_config *config); void yyerror(const char *); int yylex(void); -int yyparse(void); #endif /* !_HAST_H_ */ diff --git a/sbin/hastd/hastd.8 b/sbin/hastd/hastd.8 index 5cbe70ad805..457b837f4be 100644 --- a/sbin/hastd/hastd.8 +++ b/sbin/hastd/hastd.8 @@ -223,7 +223,7 @@ nodeA# mount -o noatime /dev/hast/shared /shared .Xr hastctl 8 , .Xr mount 8 , .Xr newfs 8 , -.Xr g_bio 9 . +.Xr g_bio 9 .Sh AUTHORS The .Nm diff --git a/sbin/hastd/parse.y b/sbin/hastd/parse.y index 2c16f34f674..a20b61aa1f5 100644 --- a/sbin/hastd/parse.y +++ b/sbin/hastd/parse.y @@ -77,296 +77,9 @@ static int depth1_metaflush; extern void yyrestart(FILE *); -static int -isitme(const char *name) -{ - char buf[MAXHOSTNAMELEN]; - char *pos; - size_t bufsize; - - /* - * First check if the given name matches our full hostname. - */ - if (gethostname(buf, sizeof(buf)) < 0) { - pjdlog_errno(LOG_ERR, "gethostname() failed"); - return (-1); - } - if (strcmp(buf, name) == 0) - return (1); - - /* - * Now check if it matches first part of the host name. - */ - pos = strchr(buf, '.'); - if (pos != NULL && (size_t)(pos - buf) == strlen(name) && - strncmp(buf, name, pos - buf) == 0) { - return (1); - } - - /* - * At the end check if name is equal to our host's UUID. - */ - bufsize = sizeof(buf); - if (sysctlbyname("kern.hostuuid", buf, &bufsize, NULL, 0) < 0) { - pjdlog_errno(LOG_ERR, "sysctlbyname(kern.hostuuid) failed"); - return (-1); - } - if (strcasecmp(buf, name) == 0) - return (1); - - /* - * Looks like this isn't about us. - */ - return (0); -} - -static bool -family_supported(int family) -{ - int sock; - - sock = socket(family, SOCK_STREAM, 0); - if (sock == -1 && errno == EPROTONOSUPPORT) - return (false); - if (sock >= 0) - (void)close(sock); - return (true); -} - -static int -node_names(char **namesp) -{ - static char names[MAXHOSTNAMELEN * 3]; - char buf[MAXHOSTNAMELEN]; - char *pos; - size_t bufsize; - - if (gethostname(buf, sizeof(buf)) < 0) { - pjdlog_errno(LOG_ERR, "gethostname() failed"); - return (-1); - } - - /* First component of the host name. */ - pos = strchr(buf, '.'); - if (pos != NULL && pos != buf) { - (void)strlcpy(names, buf, MIN((size_t)(pos - buf + 1), - sizeof(names))); - (void)strlcat(names, ", ", sizeof(names)); - } - - /* Full host name. */ - (void)strlcat(names, buf, sizeof(names)); - (void)strlcat(names, ", ", sizeof(names)); - - /* Host UUID. */ - bufsize = sizeof(buf); - if (sysctlbyname("kern.hostuuid", buf, &bufsize, NULL, 0) < 0) { - pjdlog_errno(LOG_ERR, "sysctlbyname(kern.hostuuid) failed"); - return (-1); - } - (void)strlcat(names, buf, sizeof(names)); - - *namesp = names; - - return (0); -} - -void -yyerror(const char *str) -{ - - pjdlog_error("Unable to parse configuration file at line %d near '%s': %s", - lineno, yytext, str); -} - -struct hastd_config * -yy_config_parse(const char *config, bool exitonerror) -{ - int ret; - - curres = NULL; - mynode = false; - depth = 0; - lineno = 0; - - depth0_timeout = HAST_TIMEOUT; - depth0_replication = HAST_REPLICATION_FULLSYNC; - depth0_checksum = HAST_CHECKSUM_NONE; - depth0_compression = HAST_COMPRESSION_HOLE; - strlcpy(depth0_control, HAST_CONTROL, sizeof(depth0_control)); - strlcpy(depth0_pidfile, HASTD_PIDFILE, sizeof(depth0_pidfile)); - TAILQ_INIT(&depth0_listen); - strlcpy(depth0_listen_tcp4, HASTD_LISTEN_TCP4, - sizeof(depth0_listen_tcp4)); - strlcpy(depth0_listen_tcp6, HASTD_LISTEN_TCP6, - sizeof(depth0_listen_tcp6)); - depth0_exec[0] = '\0'; - depth0_metaflush = 1; - - lconfig = calloc(1, sizeof(*lconfig)); - if (lconfig == NULL) { - pjdlog_error("Unable to allocate memory for configuration."); - if (exitonerror) - exit(EX_TEMPFAIL); - return (NULL); - } - - TAILQ_INIT(&lconfig->hc_listen); - TAILQ_INIT(&lconfig->hc_resources); - - yyin = fopen(config, "r"); - if (yyin == NULL) { - pjdlog_errno(LOG_ERR, "Unable to open configuration file %s", - config); - yy_config_free(lconfig); - if (exitonerror) - exit(EX_OSFILE); - return (NULL); - } - yyrestart(yyin); - ret = yyparse(); - fclose(yyin); - if (ret != 0) { - yy_config_free(lconfig); - if (exitonerror) - exit(EX_CONFIG); - return (NULL); - } - - /* - * Let's see if everything is set up. - */ - if (lconfig->hc_controladdr[0] == '\0') { - strlcpy(lconfig->hc_controladdr, depth0_control, - sizeof(lconfig->hc_controladdr)); - } - if (lconfig->hc_pidfile[0] == '\0') { - strlcpy(lconfig->hc_pidfile, depth0_pidfile, - sizeof(lconfig->hc_pidfile)); - } - if (!TAILQ_EMPTY(&depth0_listen)) - TAILQ_CONCAT(&lconfig->hc_listen, &depth0_listen, hl_next); - if (TAILQ_EMPTY(&lconfig->hc_listen)) { - struct hastd_listen *lst; - - if (family_supported(AF_INET)) { - lst = calloc(1, sizeof(*lst)); - if (lst == NULL) { - pjdlog_error("Unable to allocate memory for listen address."); - yy_config_free(lconfig); - if (exitonerror) - exit(EX_TEMPFAIL); - return (NULL); - } - (void)strlcpy(lst->hl_addr, depth0_listen_tcp4, - sizeof(lst->hl_addr)); - TAILQ_INSERT_TAIL(&lconfig->hc_listen, lst, hl_next); - } else { - pjdlog_debug(1, - "No IPv4 support in the kernel, not listening on IPv4 address."); - } - if (family_supported(AF_INET6)) { - lst = calloc(1, sizeof(*lst)); - if (lst == NULL) { - pjdlog_error("Unable to allocate memory for listen address."); - yy_config_free(lconfig); - if (exitonerror) - exit(EX_TEMPFAIL); - return (NULL); - } - (void)strlcpy(lst->hl_addr, depth0_listen_tcp6, - sizeof(lst->hl_addr)); - TAILQ_INSERT_TAIL(&lconfig->hc_listen, lst, hl_next); - } else { - pjdlog_debug(1, - "No IPv6 support in the kernel, not listening on IPv6 address."); - } - if (TAILQ_EMPTY(&lconfig->hc_listen)) { - pjdlog_error("No address to listen on."); - yy_config_free(lconfig); - if (exitonerror) - exit(EX_TEMPFAIL); - return (NULL); - } - } - TAILQ_FOREACH(curres, &lconfig->hc_resources, hr_next) { - PJDLOG_ASSERT(curres->hr_provname[0] != '\0'); - PJDLOG_ASSERT(curres->hr_localpath[0] != '\0'); - PJDLOG_ASSERT(curres->hr_remoteaddr[0] != '\0'); - - if (curres->hr_replication == -1) { - /* - * Replication is not set at resource-level. - * Use global or default setting. - */ - curres->hr_replication = depth0_replication; - } - if (curres->hr_replication == HAST_REPLICATION_MEMSYNC) { - pjdlog_warning("Replication mode \"%s\" is not implemented, falling back to \"%s\".", - "memsync", "fullsync"); - curres->hr_replication = HAST_REPLICATION_FULLSYNC; - } - if (curres->hr_checksum == -1) { - /* - * Checksum is not set at resource-level. - * Use global or default setting. - */ - curres->hr_checksum = depth0_checksum; - } - if (curres->hr_compression == -1) { - /* - * Compression is not set at resource-level. - * Use global or default setting. - */ - curres->hr_compression = depth0_compression; - } - if (curres->hr_timeout == -1) { - /* - * Timeout is not set at resource-level. - * Use global or default setting. - */ - curres->hr_timeout = depth0_timeout; - } - if (curres->hr_exec[0] == '\0') { - /* - * Exec is not set at resource-level. - * Use global or default setting. - */ - strlcpy(curres->hr_exec, depth0_exec, - sizeof(curres->hr_exec)); - } - if (curres->hr_metaflush == -1) { - /* - * Metaflush is not set at resource-level. - * Use global or default setting. - */ - curres->hr_metaflush = depth0_metaflush; - } - } - - return (lconfig); -} - -void -yy_config_free(struct hastd_config *config) -{ - struct hastd_listen *lst; - struct hast_resource *res; - - while ((lst = TAILQ_FIRST(&depth0_listen)) != NULL) { - TAILQ_REMOVE(&depth0_listen, lst, hl_next); - free(lst); - } - while ((lst = TAILQ_FIRST(&config->hc_listen)) != NULL) { - TAILQ_REMOVE(&config->hc_listen, lst, hl_next); - free(lst); - } - while ((res = TAILQ_FIRST(&config->hc_resources)) != NULL) { - TAILQ_REMOVE(&config->hc_resources, res, hr_next); - free(res); - } - free(config); -} +static int isitme(const char *name); +static bool family_supported(int family); +static int node_names(char **namesp); %} %token CONTROL PIDFILE LISTEN REPLICATION CHECKSUM COMPRESSION METAFLUSH @@ -1004,3 +717,296 @@ source_statement: SOURCE STR free($2); } ; + +%% + +static int +isitme(const char *name) +{ + char buf[MAXHOSTNAMELEN]; + char *pos; + size_t bufsize; + + /* + * First check if the given name matches our full hostname. + */ + if (gethostname(buf, sizeof(buf)) < 0) { + pjdlog_errno(LOG_ERR, "gethostname() failed"); + return (-1); + } + if (strcmp(buf, name) == 0) + return (1); + + /* + * Now check if it matches first part of the host name. + */ + pos = strchr(buf, '.'); + if (pos != NULL && (size_t)(pos - buf) == strlen(name) && + strncmp(buf, name, pos - buf) == 0) { + return (1); + } + + /* + * At the end check if name is equal to our host's UUID. + */ + bufsize = sizeof(buf); + if (sysctlbyname("kern.hostuuid", buf, &bufsize, NULL, 0) < 0) { + pjdlog_errno(LOG_ERR, "sysctlbyname(kern.hostuuid) failed"); + return (-1); + } + if (strcasecmp(buf, name) == 0) + return (1); + + /* + * Looks like this isn't about us. + */ + return (0); +} + +static bool +family_supported(int family) +{ + int sock; + + sock = socket(family, SOCK_STREAM, 0); + if (sock == -1 && errno == EPROTONOSUPPORT) + return (false); + if (sock >= 0) + (void)close(sock); + return (true); +} + +static int +node_names(char **namesp) +{ + static char names[MAXHOSTNAMELEN * 3]; + char buf[MAXHOSTNAMELEN]; + char *pos; + size_t bufsize; + + if (gethostname(buf, sizeof(buf)) < 0) { + pjdlog_errno(LOG_ERR, "gethostname() failed"); + return (-1); + } + + /* First component of the host name. */ + pos = strchr(buf, '.'); + if (pos != NULL && pos != buf) { + (void)strlcpy(names, buf, MIN((size_t)(pos - buf + 1), + sizeof(names))); + (void)strlcat(names, ", ", sizeof(names)); + } + + /* Full host name. */ + (void)strlcat(names, buf, sizeof(names)); + (void)strlcat(names, ", ", sizeof(names)); + + /* Host UUID. */ + bufsize = sizeof(buf); + if (sysctlbyname("kern.hostuuid", buf, &bufsize, NULL, 0) < 0) { + pjdlog_errno(LOG_ERR, "sysctlbyname(kern.hostuuid) failed"); + return (-1); + } + (void)strlcat(names, buf, sizeof(names)); + + *namesp = names; + + return (0); +} + +void +yyerror(const char *str) +{ + + pjdlog_error("Unable to parse configuration file at line %d near '%s': %s", + lineno, yytext, str); +} + +struct hastd_config * +yy_config_parse(const char *config, bool exitonerror) +{ + int ret; + + curres = NULL; + mynode = false; + depth = 0; + lineno = 0; + + depth0_timeout = HAST_TIMEOUT; + depth0_replication = HAST_REPLICATION_FULLSYNC; + depth0_checksum = HAST_CHECKSUM_NONE; + depth0_compression = HAST_COMPRESSION_HOLE; + strlcpy(depth0_control, HAST_CONTROL, sizeof(depth0_control)); + strlcpy(depth0_pidfile, HASTD_PIDFILE, sizeof(depth0_pidfile)); + TAILQ_INIT(&depth0_listen); + strlcpy(depth0_listen_tcp4, HASTD_LISTEN_TCP4, + sizeof(depth0_listen_tcp4)); + strlcpy(depth0_listen_tcp6, HASTD_LISTEN_TCP6, + sizeof(depth0_listen_tcp6)); + depth0_exec[0] = '\0'; + depth0_metaflush = 1; + + lconfig = calloc(1, sizeof(*lconfig)); + if (lconfig == NULL) { + pjdlog_error("Unable to allocate memory for configuration."); + if (exitonerror) + exit(EX_TEMPFAIL); + return (NULL); + } + + TAILQ_INIT(&lconfig->hc_listen); + TAILQ_INIT(&lconfig->hc_resources); + + yyin = fopen(config, "r"); + if (yyin == NULL) { + pjdlog_errno(LOG_ERR, "Unable to open configuration file %s", + config); + yy_config_free(lconfig); + if (exitonerror) + exit(EX_OSFILE); + return (NULL); + } + yyrestart(yyin); + ret = yyparse(); + fclose(yyin); + if (ret != 0) { + yy_config_free(lconfig); + if (exitonerror) + exit(EX_CONFIG); + return (NULL); + } + + /* + * Let's see if everything is set up. + */ + if (lconfig->hc_controladdr[0] == '\0') { + strlcpy(lconfig->hc_controladdr, depth0_control, + sizeof(lconfig->hc_controladdr)); + } + if (lconfig->hc_pidfile[0] == '\0') { + strlcpy(lconfig->hc_pidfile, depth0_pidfile, + sizeof(lconfig->hc_pidfile)); + } + if (!TAILQ_EMPTY(&depth0_listen)) + TAILQ_CONCAT(&lconfig->hc_listen, &depth0_listen, hl_next); + if (TAILQ_EMPTY(&lconfig->hc_listen)) { + struct hastd_listen *lst; + + if (family_supported(AF_INET)) { + lst = calloc(1, sizeof(*lst)); + if (lst == NULL) { + pjdlog_error("Unable to allocate memory for listen address."); + yy_config_free(lconfig); + if (exitonerror) + exit(EX_TEMPFAIL); + return (NULL); + } + (void)strlcpy(lst->hl_addr, depth0_listen_tcp4, + sizeof(lst->hl_addr)); + TAILQ_INSERT_TAIL(&lconfig->hc_listen, lst, hl_next); + } else { + pjdlog_debug(1, + "No IPv4 support in the kernel, not listening on IPv4 address."); + } + if (family_supported(AF_INET6)) { + lst = calloc(1, sizeof(*lst)); + if (lst == NULL) { + pjdlog_error("Unable to allocate memory for listen address."); + yy_config_free(lconfig); + if (exitonerror) + exit(EX_TEMPFAIL); + return (NULL); + } + (void)strlcpy(lst->hl_addr, depth0_listen_tcp6, + sizeof(lst->hl_addr)); + TAILQ_INSERT_TAIL(&lconfig->hc_listen, lst, hl_next); + } else { + pjdlog_debug(1, + "No IPv6 support in the kernel, not listening on IPv6 address."); + } + if (TAILQ_EMPTY(&lconfig->hc_listen)) { + pjdlog_error("No address to listen on."); + yy_config_free(lconfig); + if (exitonerror) + exit(EX_TEMPFAIL); + return (NULL); + } + } + TAILQ_FOREACH(curres, &lconfig->hc_resources, hr_next) { + PJDLOG_ASSERT(curres->hr_provname[0] != '\0'); + PJDLOG_ASSERT(curres->hr_localpath[0] != '\0'); + PJDLOG_ASSERT(curres->hr_remoteaddr[0] != '\0'); + + if (curres->hr_replication == -1) { + /* + * Replication is not set at resource-level. + * Use global or default setting. + */ + curres->hr_replication = depth0_replication; + } + if (curres->hr_replication == HAST_REPLICATION_MEMSYNC) { + pjdlog_warning("Replication mode \"%s\" is not implemented, falling back to \"%s\".", + "memsync", "fullsync"); + curres->hr_replication = HAST_REPLICATION_FULLSYNC; + } + if (curres->hr_checksum == -1) { + /* + * Checksum is not set at resource-level. + * Use global or default setting. + */ + curres->hr_checksum = depth0_checksum; + } + if (curres->hr_compression == -1) { + /* + * Compression is not set at resource-level. + * Use global or default setting. + */ + curres->hr_compression = depth0_compression; + } + if (curres->hr_timeout == -1) { + /* + * Timeout is not set at resource-level. + * Use global or default setting. + */ + curres->hr_timeout = depth0_timeout; + } + if (curres->hr_exec[0] == '\0') { + /* + * Exec is not set at resource-level. + * Use global or default setting. + */ + strlcpy(curres->hr_exec, depth0_exec, + sizeof(curres->hr_exec)); + } + if (curres->hr_metaflush == -1) { + /* + * Metaflush is not set at resource-level. + * Use global or default setting. + */ + curres->hr_metaflush = depth0_metaflush; + } + } + + return (lconfig); +} + +void +yy_config_free(struct hastd_config *config) +{ + struct hastd_listen *lst; + struct hast_resource *res; + + while ((lst = TAILQ_FIRST(&depth0_listen)) != NULL) { + TAILQ_REMOVE(&depth0_listen, lst, hl_next); + free(lst); + } + while ((lst = TAILQ_FIRST(&config->hc_listen)) != NULL) { + TAILQ_REMOVE(&config->hc_listen, lst, hl_next); + free(lst); + } + while ((res = TAILQ_FIRST(&config->hc_resources)) != NULL) { + TAILQ_REMOVE(&config->hc_resources, res, hr_next); + free(res); + } + free(config); +} diff --git a/sbin/hastd/primary.c b/sbin/hastd/primary.c index 81d08eb648a..88159cb6bec 100644 --- a/sbin/hastd/primary.c +++ b/sbin/hastd/primary.c @@ -543,6 +543,27 @@ primary_connect(struct hast_resource *res, struct proto_conn **connp) return (0); } + +/* + * Function instructs GEOM_GATE to handle reads directly from within the kernel. + */ +static void +enable_direct_reads(struct hast_resource *res) +{ + struct g_gate_ctl_modify ggiomodify; + + bzero(&ggiomodify, sizeof(ggiomodify)); + ggiomodify.gctl_version = G_GATE_VERSION; + ggiomodify.gctl_unit = res->hr_ggateunit; + ggiomodify.gctl_modify = GG_MODIFY_READPROV | GG_MODIFY_READOFFSET; + strlcpy(ggiomodify.gctl_readprov, res->hr_localpath, + sizeof(ggiomodify.gctl_readprov)); + ggiomodify.gctl_readoffset = res->hr_localoff; + if (ioctl(res->hr_ggatefd, G_GATE_CMD_MODIFY, &ggiomodify) == 0) + pjdlog_debug(1, "Direct reads enabled."); + else + pjdlog_errno(LOG_WARNING, "Failed to enable direct reads"); +} static int init_remote(struct hast_resource *res, struct proto_conn **inp, @@ -692,6 +713,8 @@ init_remote(struct hast_resource *res, struct proto_conn **inp, res->hr_secondary_localcnt = nv_get_uint64(nvin, "localcnt"); res->hr_secondary_remotecnt = nv_get_uint64(nvin, "remotecnt"); res->hr_syncsrc = nv_get_uint8(nvin, "syncsrc"); + if (res->hr_syncsrc == HAST_SYNCSRC_PRIMARY) + enable_direct_reads(res); if (nv_exists(nvin, "virgin")) { /* * Secondary was reinitialized, bump localcnt if it is 0 as @@ -990,36 +1013,33 @@ reqlog(int loglevel, int debuglevel, struct g_gate_ctl_io *ggio, const char *fmt { char msg[1024]; va_list ap; - int len; va_start(ap, fmt); - len = vsnprintf(msg, sizeof(msg), fmt, ap); + (void)vsnprintf(msg, sizeof(msg), fmt, ap); va_end(ap); - if ((size_t)len < sizeof(msg)) { - switch (ggio->gctl_cmd) { - case BIO_READ: - (void)snprintf(msg + len, sizeof(msg) - len, - "READ(%ju, %ju).", (uintmax_t)ggio->gctl_offset, - (uintmax_t)ggio->gctl_length); - break; - case BIO_DELETE: - (void)snprintf(msg + len, sizeof(msg) - len, - "DELETE(%ju, %ju).", (uintmax_t)ggio->gctl_offset, - (uintmax_t)ggio->gctl_length); - break; - case BIO_FLUSH: - (void)snprintf(msg + len, sizeof(msg) - len, "FLUSH."); - break; - case BIO_WRITE: - (void)snprintf(msg + len, sizeof(msg) - len, - "WRITE(%ju, %ju).", (uintmax_t)ggio->gctl_offset, - (uintmax_t)ggio->gctl_length); - break; - default: - (void)snprintf(msg + len, sizeof(msg) - len, - "UNKNOWN(%u).", (unsigned int)ggio->gctl_cmd); - break; - } + switch (ggio->gctl_cmd) { + case BIO_READ: + (void)snprlcat(msg, sizeof(msg), "READ(%ju, %ju).", + (uintmax_t)ggio->gctl_offset, + (uintmax_t)ggio->gctl_length); + break; + case BIO_DELETE: + (void)snprlcat(msg, sizeof(msg), "DELETE(%ju, %ju).", + (uintmax_t)ggio->gctl_offset, + (uintmax_t)ggio->gctl_length); + break; + case BIO_FLUSH: + (void)snprlcat(msg, sizeof(msg), "FLUSH."); + break; + case BIO_WRITE: + (void)snprlcat(msg, sizeof(msg), "WRITE(%ju, %ju).", + (uintmax_t)ggio->gctl_offset, + (uintmax_t)ggio->gctl_length); + break; + default: + (void)snprlcat(msg, sizeof(msg), "UNKNOWN(%u).", + (unsigned int)ggio->gctl_cmd); + break; } pjdlog_common(loglevel, debuglevel, -1, "%s", msg); } @@ -1792,13 +1812,14 @@ sync_thread(void *arg __unused) struct timeval tstart, tend, tdiff; unsigned int ii, ncomp, ncomps; off_t offset, length, synced; - bool dorewind; + bool dorewind, directreads; int syncext; ncomps = HAST_NCOMPONENTS; dorewind = true; synced = 0; offset = -1; + directreads = false; for (;;) { mtx_lock(&sync_lock); @@ -1870,6 +1891,8 @@ sync_thread(void *arg __unused) event_send(res, EVENT_SYNCDONE); } mtx_lock(&metadata_lock); + if (res->hr_syncsrc == HAST_SYNCSRC_SECONDARY) + directreads = true; res->hr_syncsrc = HAST_SYNCSRC_UNDEF; res->hr_primary_localcnt = res->hr_secondary_remotecnt; @@ -1883,6 +1906,10 @@ sync_thread(void *arg __unused) mtx_unlock(&metadata_lock); } rw_unlock(&hio_remote_lock[ncomp]); + if (directreads) { + directreads = false; + enable_direct_reads(res); + } continue; } pjdlog_debug(2, "sync: Taking free request."); diff --git a/sbin/hastd/proto_common.c b/sbin/hastd/proto_common.c index 59b1e39bb2f..843366bda22 100644 --- a/sbin/hastd/proto_common.c +++ b/sbin/hastd/proto_common.c @@ -181,7 +181,7 @@ proto_descriptor_recv(int sock, int *fdp) return (errno); cmsg = CMSG_FIRSTHDR(&msg); - if (cmsg->cmsg_level != SOL_SOCKET || + if (cmsg == NULL || cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS) { return (EINVAL); } diff --git a/sbin/hastd/synch.h b/sbin/hastd/synch.h index 36e19278921..65360fd493e 100644 --- a/sbin/hastd/synch.h +++ b/sbin/hastd/synch.h @@ -168,7 +168,7 @@ cv_timedwait(pthread_cond_t *cv, pthread_mutex_t *lock, int timeout) return (false); } - error = clock_gettime(CLOCK_MONOTONIC, &ts); + error = clock_gettime(CLOCK_MONOTONIC, &ts); PJDLOG_ASSERT(error == 0); ts.tv_sec += timeout; error = pthread_cond_timedwait(cv, lock, &ts); diff --git a/sbin/ifconfig/af_inet6.c b/sbin/ifconfig/af_inet6.c index 0731238bf9b..d74b0d21492 100644 --- a/sbin/ifconfig/af_inet6.c +++ b/sbin/ifconfig/af_inet6.c @@ -509,8 +509,6 @@ static struct cmd inet6_cmds[] = { DEF_CMD("-ifdisabled", -ND6_IFF_IFDISABLED, setnd6flags), DEF_CMD("nud", ND6_IFF_PERFORMNUD, setnd6flags), DEF_CMD("-nud", -ND6_IFF_PERFORMNUD, setnd6flags), - DEF_CMD("prefer_source",ND6_IFF_PREFER_SOURCE, setnd6flags), - DEF_CMD("-prefer_source",-ND6_IFF_PREFER_SOURCE,setnd6flags), DEF_CMD("auto_linklocal",ND6_IFF_AUTO_LINKLOCAL,setnd6flags), DEF_CMD("-auto_linklocal",-ND6_IFF_AUTO_LINKLOCAL,setnd6flags), DEF_CMD_ARG("pltime", setip6pltime), diff --git a/sbin/ifconfig/af_nd6.c b/sbin/ifconfig/af_nd6.c index eed00eaf404..654e2d97fe0 100644 --- a/sbin/ifconfig/af_nd6.c +++ b/sbin/ifconfig/af_nd6.c @@ -148,12 +148,14 @@ nd6_status(int s) memset(&nd, 0, sizeof(nd)); strncpy(nd.ifname, ifr.ifr_name, sizeof(nd.ifname)); if ((s6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { - warn("socket(AF_INET6, SOCK_DGRAM)"); + if (errno != EPROTONOSUPPORT) + warn("socket(AF_INET6, SOCK_DGRAM)"); return; } error = ioctl(s6, SIOCGIFINFO_IN6, &nd); if (error) { - warn("ioctl(SIOCGIFINFO_IN6)"); + if (errno != EPFNOSUPPORT) + warn("ioctl(SIOCGIFINFO_IN6)"); close(s6); return; } diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8 index 0cd24b3aa4c..f22cc50598c 100644 --- a/sbin/ifconfig/ifconfig.8 +++ b/sbin/ifconfig/ifconfig.8 @@ -28,7 +28,7 @@ .\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94 .\" $FreeBSD$ .\" -.Dd April 3, 2012 +.Dd July 9, 2012 .Dt IFCONFIG 8 .Os .Sh NAME @@ -372,16 +372,32 @@ This is useful for devices which have multiple physical layer interfaces .It Cm name Ar name Set the interface name to .Ar name . -.It Cm rxcsum , txcsum +.It Cm rxcsum , txcsum , rxcsum6 , txcsum6 If the driver supports user-configurable checksum offloading, enable receive (or transmit) checksum offloading on the interface. +The feature can be turned on selectively per protocol family. +Use +.Cm rxcsum6 , txcsum6 +for +.Xr ip6 4 +or +.Cm rxcsum , txcsum +otherwise. Some drivers may not be able to enable these flags independently of each other, so setting one may also set the other. The driver will offload as much checksum work as it can reliably support, the exact level of offloading varies between drivers. -.It Fl rxcsum , txcsum +.It Fl rxcsum , txcsum , rxcsum6 , txcsum6 If the driver supports user-configurable checksum offloading, disable receive (or transmit) checksum offloading on the interface. +The feature can be turned off selectively per protocol family. +Use +.Fl rxcsum6 , txcsum6 +for +.Xr ip6 4 +or +.Fl rxcsum , txcsum +otherwise. These settings may not always be independent of each other. .It Cm tso If the driver supports @@ -400,6 +416,22 @@ It will always disable TSO for .Xr ip 4 and .Xr ip6 4 . +.It Cm tso6 , tso4 +If the driver supports +.Xr tcp 4 +segmentation offloading for +.Xr ip6 4 +or +.Xr ip 4 +use one of these to selectively enabled it only for one protocol family. +.It Fl tso6 , tso4 +If the driver supports +.Xr tcp 4 +segmentation offloading for +.Xr ip6 4 +or +.Xr ip 4 +use one of these to selectively disable it only for one protocol family. .It Cm lro If the driver supports .Xr tcp 4 @@ -684,12 +716,6 @@ Set a flag to enable Neighbor Unreachability Detection. .It Cm -nud Clear a flag .Cm nud . -.It Cm prefer_source -Set a flag to prefer addresses on the interface as candidates of the -source address for outgoing packets. -.It Cm -prefer_source -Clear a flag -.Cm prefer_source . .El .Pp The following parameters are specific to cloning @@ -1979,6 +2005,12 @@ Enable or disable forwarding packets by a mesh interface. By default .Cm meshforward is enabled. +.It Cm meshgate +This attribute specifies whether or not the mesh STA activates mesh gate +announcements. +By default +.Cm meshgate +is disabled. .It Cm meshmetric Ar protocol Set the specified .Ar protocol @@ -2013,7 +2045,7 @@ Send broadcast path requests every two seconds. Nodes on the mesh without a path to this root mesh station with try to discover a path to us. .It Cm PROACTIVE -Send broadcast path requests every two seconds and every node must reply with +Send broadcast path requests every two seconds and every node must reply with a path reply even if it already has a path to this root mesh station. .It Cm RANN Send broadcast root announcement (RANN) frames. diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c index 5eb71eadc0c..870acdd0445 100644 --- a/sbin/ifconfig/ifconfig.c +++ b/sbin/ifconfig/ifconfig.c @@ -916,7 +916,8 @@ unsetifdescr(const char *val, int value, int s, const struct afswtch *afp) #define IFCAPBITS \ "\020\1RXCSUM\2TXCSUM\3NETCONS\4VLAN_MTU\5VLAN_HWTAGGING\6JUMBO_MTU\7POLLING" \ "\10VLAN_HWCSUM\11TSO4\12TSO6\13LRO\14WOL_UCAST\15WOL_MCAST\16WOL_MAGIC" \ -"\21VLAN_HWFILTER\23VLAN_HWTSO\24LINKSTATE\25NETMAP" +"\17TOE4\20TOE6\21VLAN_HWFILTER\23VLAN_HWTSO\24LINKSTATE\25NETMAP" \ +"\26RXCSUM_IPV6\27TXCSUM_IPV6" /* * Print the status of the interface. If an address family was @@ -1193,6 +1194,10 @@ static struct cmd basic_cmds[] = { DEF_CMD("-monitor", -IFF_MONITOR, setifflags), DEF_CMD("staticarp", IFF_STATICARP, setifflags), DEF_CMD("-staticarp", -IFF_STATICARP, setifflags), + DEF_CMD("rxcsum6", IFCAP_RXCSUM_IPV6, setifcap), + DEF_CMD("-rxcsum6", -IFCAP_RXCSUM_IPV6, setifcap), + DEF_CMD("txcsum6", IFCAP_TXCSUM_IPV6, setifcap), + DEF_CMD("-txcsum6", -IFCAP_TXCSUM_IPV6, setifcap), DEF_CMD("rxcsum", IFCAP_RXCSUM, setifcap), DEF_CMD("-rxcsum", -IFCAP_RXCSUM, setifcap), DEF_CMD("txcsum", IFCAP_TXCSUM, setifcap), @@ -1201,8 +1206,14 @@ static struct cmd basic_cmds[] = { DEF_CMD("-netcons", -IFCAP_NETCONS, setifcap), DEF_CMD("polling", IFCAP_POLLING, setifcap), DEF_CMD("-polling", -IFCAP_POLLING, setifcap), + DEF_CMD("tso6", IFCAP_TSO6, setifcap), + DEF_CMD("-tso6", -IFCAP_TSO6, setifcap), + DEF_CMD("tso4", IFCAP_TSO4, setifcap), + DEF_CMD("-tso4", -IFCAP_TSO4, setifcap), DEF_CMD("tso", IFCAP_TSO, setifcap), DEF_CMD("-tso", -IFCAP_TSO, setifcap), + DEF_CMD("toe", IFCAP_TOE, setifcap), + DEF_CMD("-toe", -IFCAP_TOE, setifcap), DEF_CMD("lro", IFCAP_LRO, setifcap), DEF_CMD("-lro", -IFCAP_LRO, setifcap), DEF_CMD("wol", IFCAP_WOL, setifcap), diff --git a/sbin/ifconfig/ifieee80211.c b/sbin/ifconfig/ifieee80211.c index 3ecdf0ebd0c..c2b767894a1 100644 --- a/sbin/ifconfig/ifieee80211.c +++ b/sbin/ifconfig/ifieee80211.c @@ -1882,6 +1882,12 @@ DECL_CMD_FUNC(set80211meshforward, val, d) set80211(s, IEEE80211_IOC_MESH_FWRD, d, 0, NULL); } +static +DECL_CMD_FUNC(set80211meshgate, val, d) +{ + set80211(s, IEEE80211_IOC_MESH_GATE, d, 0, NULL); +} + static DECL_CMD_FUNC(set80211meshpeering, val, d) { @@ -4014,6 +4020,8 @@ list_mesh(int s) ether_ntoa((const struct ether_addr *)rt->imr_nexthop), rt->imr_nhops, rt->imr_metric, rt->imr_lifetime, rt->imr_lastmseq, + (rt->imr_flags & IEEE80211_MESHRT_FLAGS_DISCOVER) ? + 'D' : (rt->imr_flags & IEEE80211_MESHRT_FLAGS_VALID) ? 'V' : '!', (rt->imr_flags & IEEE80211_MESHRT_FLAGS_PROXY) ? @@ -4832,6 +4840,12 @@ end: else LINE_CHECK("-meshforward"); } + if (get80211val(s, IEEE80211_IOC_MESH_GATE, &val) != -1) { + if (val) + LINE_CHECK("meshgate"); + else + LINE_CHECK("-meshgate"); + } if (get80211len(s, IEEE80211_IOC_MESH_PR_METRIC, data, 12, &len) != -1) { data[len] = '\0'; @@ -5271,6 +5285,8 @@ static struct cmd ieee80211_cmds[] = { DEF_CMD_ARG("meshttl", set80211meshttl), DEF_CMD("meshforward", 1, set80211meshforward), DEF_CMD("-meshforward", 0, set80211meshforward), + DEF_CMD("meshgate", 1, set80211meshgate), + DEF_CMD("-meshgate", 0, set80211meshgate), DEF_CMD("meshpeering", 1, set80211meshpeering), DEF_CMD("-meshpeering", 0, set80211meshpeering), DEF_CMD_ARG("meshmetric", set80211meshmetric), diff --git a/sbin/ifconfig/iflagg.c b/sbin/ifconfig/iflagg.c index ed39868e1bd..a4747298019 100644 --- a/sbin/ifconfig/iflagg.c +++ b/sbin/ifconfig/iflagg.c @@ -40,7 +40,8 @@ setlaggport(const char *val, int d, int s, const struct afswtch *afp) strlcpy(rp.rp_ifname, name, sizeof(rp.rp_ifname)); strlcpy(rp.rp_portname, val, sizeof(rp.rp_portname)); - if (ioctl(s, SIOCSLAGGPORT, &rp)) + /* Don't choke if the port is already in this lagg. */ + if (ioctl(s, SIOCSLAGGPORT, &rp) && errno != EEXIST) err(1, "SIOCSLAGGPORT"); } diff --git a/sbin/init/init.c b/sbin/init/init.c index 8fd93bdfec5..c19b0700b74 100644 --- a/sbin/init/init.c +++ b/sbin/init/init.c @@ -646,8 +646,6 @@ single_user(void) if (Reboot) { /* Instead of going single user, let's reboot the machine */ sync(); - alarm(2); - pause(); reboot(howto); _exit(0); } diff --git a/sbin/ipfw/ipfw.8 b/sbin/ipfw/ipfw.8 index 11d4d2242ea..7f3815765d3 100644 --- a/sbin/ipfw/ipfw.8 +++ b/sbin/ipfw/ipfw.8 @@ -1,7 +1,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 9, 2012 +.Dd July 9, 2012 .Dt IPFW 8 .Os .Sh NAME @@ -560,7 +560,22 @@ is set to 0 (default), one can use .Xr bpf 4 attached to the .Li ipfw0 -pseudo interface. There is no overhead if no +pseudo interface. +This pseudo interface can be created after a boot +manually by using the following command: +.Bd -literal -offset indent +# ifconfig ipfw0 create +.Ed +.Pp +Or, automatically at boot time by adding the following +line to the +.Xr rc.conf 5 +file: +.Bd -literal -offset indent +firewall_logif="YES" +.Ed +.Pp +There is no overhead if no .Xr bpf 4 is attached to the pseudo interface. .Pp @@ -1535,9 +1550,9 @@ Matches packets with the corresponding IP protocol. .It Cm recv | xmit | via Brq Ar ifX | Ar if Ns Cm * | Ar table Ns Pq Ar number Ns Op , Ns Ar value | Ar ipno | Ar any Matches packets received, transmitted or going through, respectively, the interface specified by exact name -.Ns No ( Ar ifX Ns No ), +.Po Ar ifX Pc , by device name -.Ns No ( Ar if Ns Ar * Ns No ), +.Po Ar if* Pc , by IP address, or through some interface. .Pp The @@ -1733,7 +1748,7 @@ connected networks instead of all source addresses. Lookup tables are useful to handle large sparse sets of addresses or other search keys (e.g. ports, jail IDs, interface names). In the rest of this section we will use the term ``address''. -There may be up to 4096 different lookup tables, numbered 0 to 4095. +There may be up to 65535 different lookup tables, numbered 0 to 65534. .Pp Each entry is represented by an .Ar addr Ns Op / Ns Ar masklen @@ -2218,19 +2233,20 @@ Specifies the weight to be used for flows matching this queue. The weight must be in the range 1..100, and defaults to 1. .El .Pp -The following parameters can be configured for a scheduler: +The following case-insensitive parameters can be configured for a +scheduler: .Pp .Bl -tag -width indent -compact -.It Cm type Ar {fifo | wf2qp | rr | qfq} +.It Cm type Ar {fifo | wf2q+ | rr | qfq} specifies the scheduling algorithm to use. .Bl -tag -width indent -compact -.It cm fifo +.It Cm fifo is just a FIFO scheduler (which means that all packets are stored in the same queue as they arrive to the scheduler). FIFO has O(1) per-packet time complexity, with very low constants (estimate 60-80ns on a 2GHz desktop machine) but gives no service guarantees. -.It Cm wf2qp +.It Cm wf2q+ implements the WF2Q+ algorithm, which is a Weighted Fair Queueing algorithm which permits flows to share bandwidth according to their weights. Note that weights are not priorities; even a flow diff --git a/sbin/iscontrol/iscsi.conf.5 b/sbin/iscontrol/iscsi.conf.5 index 751a594c52e..1e2c7f027a2 100644 --- a/sbin/iscontrol/iscsi.conf.5 +++ b/sbin/iscontrol/iscsi.conf.5 @@ -76,7 +76,7 @@ currently only 1. is the name by which the target is known, not to be confused with target address, either obtained via the target administrator, or from a -.Em discovery session. +.Em discovery session . .It Cm InitiatorName if not specified, defaults to .Sy iqn.2005-01.il.ac.huji.cs: @@ -146,7 +146,7 @@ see This value can only be reduced. .It Cm sockbufsize sets the receiver and transmitter socket buffer size to -.Em size, +.Em size , in kilobytes. The default is 128. .El diff --git a/sbin/mca/Makefile b/sbin/mca/Makefile index e025a23e423..261672578a7 100644 --- a/sbin/mca/Makefile +++ b/sbin/mca/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ PROG= mca -WARNS?= 4 MAN= mca.8 .include diff --git a/sbin/mca/mca.c b/sbin/mca/mca.c index f774ac6ce4c..ed7bcff5fcc 100644 --- a/sbin/mca/mca.c +++ b/sbin/mca/mca.c @@ -55,10 +55,10 @@ __FBSDID("$FreeBSD$"); #define HW_MCA_MAX_CPUID 255 -static char hw_mca_count[] = "hw.mca.count"; -static char hw_mca_first[] = "hw.mca.first"; -static char hw_mca_last[] = "hw.mca.last"; -static char hw_mca_recid[] = "hw.mca.%lu.%u"; +static const char hw_mca_count[] = "hw.mca.count"; +static const char hw_mca_first[] = "hw.mca.first"; +static const char hw_mca_last[] = "hw.mca.last"; +static const char hw_mca_recid[] = "hw.mca.%d.%u"; static char default_dumpfile[] = "/var/log/mca.log"; @@ -162,7 +162,9 @@ show_cpu(struct mca_cpu_record *cpu) char var[16]; struct mca_cpu_mod *mod; struct mca_cpu_cpuid *cpuid; +#ifdef notyet struct mca_cpu_psi *psi; +#endif int i, n; printf(" \n"); @@ -200,8 +202,10 @@ show_cpu(struct mca_cpu_record *cpu) show_value(6, var, "0x%016llx", (long long)cpuid->cpuid[i]); } - psi = (struct mca_cpu_psi*)(cpuid + 1); - /* TODO: Dump PSI */ +#ifdef notyet + psi = (struct mca_cpu_psi*)(cpuid + 1); +#endif + /* TODO: Dump PSI */ printf(" \n"); } diff --git a/sbin/md5/md5.1 b/sbin/md5/md5.1 index bc8ece4fb59..0dfb145669d 100644 --- a/sbin/md5/md5.1 +++ b/sbin/md5/md5.1 @@ -3,7 +3,7 @@ .Dt MD5 1 .Os .Sh NAME -.Nm md5 , sha1 , sha256, rmd160 +.Nm md5 , sha1 , sha256 , rmd160 .Nd calculate a message-digest fingerprint (checksum) for a file .Sh SYNOPSIS .Nm md5 diff --git a/sbin/md5/md5.c b/sbin/md5/md5.c index 2e0a0d09f33..29d50bb708f 100644 --- a/sbin/md5/md5.c +++ b/sbin/md5/md5.c @@ -372,6 +372,6 @@ static void usage(Algorithm_t *alg) { - fprintf(stderr, "usage: %s [-pqrtx] [-s string] [files ...]\n", alg->progname); + fprintf(stderr, "usage: %s [-pqrtx] [-c string] [-s string] [files ...]\n", alg->progname); exit(1); } diff --git a/sbin/mdconfig/Makefile b/sbin/mdconfig/Makefile index f4d8adcfde8..be8b1b556dd 100644 --- a/sbin/mdconfig/Makefile +++ b/sbin/mdconfig/Makefile @@ -2,7 +2,6 @@ PROG= mdconfig MAN= mdconfig.8 -MLINKS= mdconfig.8 vnconfig.8 DPADD= ${LIBUTIL} ${LIBGEOM} ${LIBBSDXML} ${LIBSBUF} LDADD= -lutil -lgeom -lbsdxml -lsbuf diff --git a/sbin/mdconfig/mdconfig.8 b/sbin/mdconfig/mdconfig.8 index e4fa9564bda..89f150e8d1a 100644 --- a/sbin/mdconfig/mdconfig.8 +++ b/sbin/mdconfig/mdconfig.8 @@ -41,7 +41,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 21, 2012 +.Dd June 27, 2012 .Dt MDCONFIG 8 .Os .Sh NAME @@ -64,6 +64,11 @@ .Fl u Ar unit .Op Fl o Oo Cm no Oc Ns Ar force .Nm +.Fl r +.Fl u Ar unit +.Fl s Ar size +.Op Fl o Oo Cm no Oc Ns Ar force +.Nm .Fl l .Op Fl n .Op Fl v @@ -85,6 +90,8 @@ This will configure and attach a memory disk with the parameters specified and attach it to the system. .It Fl d Detach a memory disk from the system and release all resources. +.It Fl r +Resize a memory disk. .It Fl t Ar type Select the type of the memory disk. .Bl -tag -width "malloc" @@ -128,7 +135,7 @@ If the .Fl v option is specified, show all details. .It Fl n -When printing +When printing .Xr md 4 device names, print only the unit number without the .Xr md 4 @@ -148,7 +155,7 @@ and .Fl t Ar swap options are implied if not specified. .It Fl S Ar sectorsize -Sectorsize to use for malloc backed device. +Sectorsize to use for the memory disk, in bytes. .It Fl x Ar sectors/track See the description of the .Fl y @@ -235,10 +242,11 @@ chmod 1777 /tmp .Ed .Pp Create a 5MB file-backed disk -.Ns ( Fl a +.Po Fl a and .Fl t Ar vnode -are implied): +are implied +.Pc : .Bd -literal -offset indent dd if=/dev/zero of=somebackingfile bs=1k count=5k mdconfig -f somebackingfile -u 0 @@ -250,10 +258,11 @@ mount /dev/md0c /mnt Create an .Xr md 4 device out of an ISO 9660 CD image file -.Ns ( Fl a +.Po Fl a and .Fl t Ar vnode -are implied), using the first available +are implied +.Pc , using the first available .Xr md 4 device, and then mount the new memory disk: .Bd -literal -offset indent diff --git a/sbin/mdconfig/mdconfig.c b/sbin/mdconfig/mdconfig.c index 122fc7d09c0..55d1567ca97 100644 --- a/sbin/mdconfig/mdconfig.c +++ b/sbin/mdconfig/mdconfig.c @@ -54,7 +54,7 @@ #include static struct md_ioctl mdio; -static enum {UNSET, ATTACH, DETACH, LIST} action = UNSET; +static enum {UNSET, ATTACH, DETACH, RESIZE, LIST} action = UNSET; static int nflag; static void usage(void); @@ -81,6 +81,7 @@ usage(void) " [-s size] [-S sectorsize] [-u unit]\n" " [-x sectors/track] [-y heads/cylinder]\n" " mdconfig -d -u unit [-o [no]force]\n" +" mdconfig -r -u unit -s size [-o [no]force]\n" " mdconfig -l [-v] [-n] [-u unit]\n" " mdconfig file\n"); fprintf(stderr, "\t\ttype = {malloc, preload, vnode, swap}\n"); @@ -96,7 +97,7 @@ main(int argc, char **argv) { int ch, fd, i, vflag; char *p; - char *fflag = NULL, *tflag = NULL, *uflag = NULL; + char *fflag = NULL, *sflag = NULL, *tflag = NULL, *uflag = NULL; bzero(&mdio, sizeof(mdio)); mdio.md_file = malloc(PATH_MAX); @@ -108,25 +109,32 @@ main(int argc, char **argv) if (argc == 1) usage(); - while ((ch = getopt(argc, argv, "ab:df:lno:s:S:t:u:vx:y:")) != -1) { + while ((ch = getopt(argc, argv, "ab:df:lno:rs:S:t:u:vx:y:")) != -1) { switch (ch) { case 'a': if (action != UNSET && action != ATTACH) - errx(1, - "-a is mutually exclusive with -d and -l"); + errx(1, "-a is mutually exclusive " + "with -d, -r, and -l"); action = ATTACH; break; case 'd': if (action != UNSET && action != DETACH) - errx(1, - "-d is mutually exclusive with -a and -l"); + errx(1, "-d is mutually exclusive " + "with -a, -r, and -l"); action = DETACH; mdio.md_options |= MD_AUTOUNIT; break; + case 'r': + if (action != UNSET && action != RESIZE) + errx(1, "-r is mutually exclusive " + "with -a, -d, and -l"); + action = RESIZE; + mdio.md_options |= MD_AUTOUNIT; + break; case 'l': if (action != UNSET && action != LIST) - errx(1, - "-l is mutually exclusive with -a and -d"); + errx(1, "-l is mutually exclusive " + "with -a, -r, and -d"); action = LIST; mdio.md_options |= MD_AUTOUNIT; break; @@ -188,6 +196,9 @@ main(int argc, char **argv) mdio.md_sectorsize = strtoul(optarg, &p, 0); break; case 's': + if (sflag != NULL) + errx(1, "-s can be passed only once"); + sflag = optarg; mdio.md_mediasize = (off_t)strtoumax(optarg, &p, 0); if (p == NULL || *p == '\0') mdio.md_mediasize *= DEV_BSIZE; @@ -242,7 +253,7 @@ main(int argc, char **argv) mdio.md_type = MD_VNODE; mdio.md_options |= MD_CLUSTER | MD_AUTOUNIT | MD_COMPRESS; - } else if (mdio.md_mediasize != 0) { + } else if (sflag != NULL) { /* Imply ``-t swap'' */ mdio.md_type = MD_SWAP; mdio.md_options |= MD_CLUSTER | MD_AUTOUNIT | @@ -276,15 +287,15 @@ main(int argc, char **argv) } if ((mdio.md_type == MD_MALLOC || mdio.md_type == MD_SWAP) && - mdio.md_mediasize == 0) + sflag == NULL) errx(1, "must specify -s for -t malloc or -t swap"); if (mdio.md_type == MD_VNODE && mdio.md_file[0] == '\0') errx(1, "must specify -f for -t vnode"); } else { if (mdio.md_sectorsize != 0) errx(1, "-S can only be used with -a"); - if (mdio.md_mediasize != 0) - errx(1, "-s can only be used with -a"); + if (action != RESIZE && sflag != NULL) + errx(1, "-s can only be used with -a and -r"); if (mdio.md_fwsectors != 0) errx(1, "-x can only be used with -a"); if (mdio.md_fwheads != 0) @@ -295,13 +306,20 @@ main(int argc, char **argv) errx(1, "-t can only be used with -a"); if (argc > 0) errx(1, "file can only be used with -a"); - if (action != DETACH && (mdio.md_options & ~MD_AUTOUNIT) != 0) - errx(1, "-o can only be used with -a and -d"); + if ((action != DETACH && action != RESIZE) && + (mdio.md_options & ~MD_AUTOUNIT) != 0) + errx(1, "-o can only be used with -a, -d, and -r"); if (action == DETACH && (mdio.md_options & ~(MD_FORCE | MD_AUTOUNIT)) != 0) errx(1, "only -o [no]force can be used with -d"); + if (action == RESIZE && + (mdio.md_options & ~(MD_FORCE | MD_RESERVE | MD_AUTOUNIT)) != 0) + errx(1, "only -o [no]force and -o [no]reserve can be used with -r"); } + if (action == RESIZE && sflag == NULL) + errx(1, "must specify -s for -r"); + if (action != LIST && vflag == OPT_VERBOSE) errx(1, "-v can only be used with -l"); @@ -333,6 +351,12 @@ main(int argc, char **argv) i = ioctl(fd, MDIOCDETACH, &mdio); if (i < 0) err(1, "ioctl(/dev/%s)", MDCTL_NAME); + } else if (action == RESIZE) { + if (mdio.md_options & MD_AUTOUNIT) + errx(1, "-r requires -u"); + i = ioctl(fd, MDIOCRESIZE, &mdio); + if (i < 0) + err(1, "ioctl(/dev/%s)", MDCTL_NAME); } else if (action == LIST) { if (mdio.md_options & MD_AUTOUNIT) { /* @@ -342,7 +366,6 @@ main(int argc, char **argv) md_list(NULL, OPT_LIST | vflag); } else return (md_query(uflag)); - } else usage(); close(fd); diff --git a/sbin/mount/mount.8 b/sbin/mount/mount.8 index fdfd75c031a..e1673780f8d 100644 --- a/sbin/mount/mount.8 +++ b/sbin/mount/mount.8 @@ -448,7 +448,7 @@ However, for the following file system types: .Cm smbfs , .Cm udf , and -.Cm unionfs , +.Cm unionfs . .Nm will not call .Xr nmount 2 diff --git a/sbin/nandfs/Makefile b/sbin/nandfs/Makefile new file mode 100644 index 00000000000..8474b09c522 --- /dev/null +++ b/sbin/nandfs/Makefile @@ -0,0 +1,10 @@ +# $FreeBSD$ + +PROG= nandfs +SRCS= nandfs.c lssnap.c mksnap.c rmsnap.c +MAN= nandfs.8 + +DPADD= ${LIBNANDFS} +LDADD= -lnandfs + +.include diff --git a/sbin/nandfs/lssnap.c b/sbin/nandfs/lssnap.c new file mode 100644 index 00000000000..fbee3cd7e55 --- /dev/null +++ b/sbin/nandfs/lssnap.c @@ -0,0 +1,112 @@ +/*- + * Copyright (c) 2012 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Semihalf under sponsorship + * from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); +#include + +#include +#include +#include +#include + +#include +#include + +#include "nandfs.h" + +#define NCPINFO 512 + +static void +lssnap_usage(void) +{ + + fprintf(stderr, "usage:\n"); + fprintf(stderr, "\tlssnap node\n"); +} + +static void +print_cpinfo(struct nandfs_cpinfo *cpinfo) +{ + struct tm tm; + time_t t; + char timebuf[128]; + + t = (time_t)cpinfo->nci_create; + localtime_r(&t, &tm); + strftime(timebuf, sizeof(timebuf), "%F %T", &tm); + + printf("%20llu %s\n", (unsigned long long)cpinfo->nci_cno, timebuf); +} + +int +nandfs_lssnap(int argc, char **argv) +{ + struct nandfs_cpinfo *cpinfos; + struct nandfs fs; + uint64_t next; + int error, nsnap, i; + + if (argc != 1) { + lssnap_usage(); + return (EX_USAGE); + } + + cpinfos = malloc(sizeof(*cpinfos) * NCPINFO); + if (cpinfos == NULL) { + fprintf(stderr, "cannot allocate memory\n"); + return (-1); + } + + nandfs_init(&fs, argv[0]); + error = nandfs_open(&fs); + if (error == -1) { + fprintf(stderr, "nandfs_open: %s\n", nandfs_errmsg(&fs)); + goto out; + } + + for (next = 1; next != 0; next = cpinfos[nsnap - 1].nci_next) { + nsnap = nandfs_get_snap(&fs, next, cpinfos, NCPINFO); + if (nsnap < 1) + break; + + for (i = 0; i < nsnap; i++) + print_cpinfo(&cpinfos[i]); + } + + if (nsnap == -1) + fprintf(stderr, "nandfs_get_snap: %s\n", nandfs_errmsg(&fs)); + +out: + nandfs_close(&fs); + nandfs_destroy(&fs); + free(cpinfos); + return (error); +} diff --git a/sbin/nandfs/mksnap.c b/sbin/nandfs/mksnap.c new file mode 100644 index 00000000000..cd2d1309313 --- /dev/null +++ b/sbin/nandfs/mksnap.c @@ -0,0 +1,80 @@ +/*- + * Copyright (c) 2012 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Semihalf under sponsorship + * from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); +#include + +#include +#include + +#include +#include + +#include "nandfs.h" + +static void +mksnap_usage(void) +{ + + fprintf(stderr, "usage:\n"); + fprintf(stderr, "\tmksnap node\n"); +} + +int +nandfs_mksnap(int argc, char **argv) +{ + struct nandfs fs; + uint64_t cpno; + int error; + + if (argc != 1) { + mksnap_usage(); + return (EX_USAGE); + } + + nandfs_init(&fs, argv[0]); + error = nandfs_open(&fs); + if (error == -1) { + fprintf(stderr, "nandfs_open: %s\n", nandfs_errmsg(&fs)); + goto out; + } + + error = nandfs_make_snap(&fs, &cpno); + if (error == -1) + fprintf(stderr, "nandfs_make_snap: %s\n", nandfs_errmsg(&fs)); + else + printf("%jd\n", cpno); + +out: + nandfs_close(&fs); + nandfs_destroy(&fs); + return (error); +} diff --git a/sbin/nandfs/nandfs.8 b/sbin/nandfs/nandfs.8 new file mode 100644 index 00000000000..e54f9f81ef6 --- /dev/null +++ b/sbin/nandfs/nandfs.8 @@ -0,0 +1,74 @@ +.\" +.\" Copyright (c) 2012 The FreeBSD Foundation +.\" All rights reserved. +.\" +.\" This software was developed by Semihalf under sponsorship +.\" from the FreeBSD Foundation. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd February 28, 2012 +.Dt NANDFS 8 +.Os +.Sh NAME +.Nm nandfs +.Nd manage mounted NAND FS +.Sh SYNOPSIS +.Nm +.Cm lssnap +.Ar node +.Nm +.Cm mksnap +.Ar node +.Nm +.Cm rmsnap +.Ar snapshot node +.Sh DESCRIPTION +The +.Nm +utility allows to manage snapshots of a mounted NAND FS. +.Sh EXAMPLES +Create a snapshot of filesystem mounted on +.Em /nand . +.Bd -literal -offset 2n +.Li # Ic nandfs mksnap /nand +1 +.Ed +.Pp +List snapshots of filesystem mounted on +.Em /nand . +.Bd -literal -offset 2n +.Li # Ic nandfs lssnap /nand +1 2012-02-28 18:49:45 ss 138 2 +.Ed +.Pp +Remove snapshot 1 of filesystem mounted on +.Em /nand . +.Bd -literal -offset 2n +.Li # Ic nandfs rmsnap 1 /nand +.Ed +.Sh AUTHORS +This utility and manual page were written by +.An Mateusz Guzik . diff --git a/sbin/nandfs/nandfs.c b/sbin/nandfs/nandfs.c new file mode 100644 index 00000000000..f7ddda16105 --- /dev/null +++ b/sbin/nandfs/nandfs.c @@ -0,0 +1,74 @@ +/*- + * Copyright (c) 2012 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Semihalf under sponsorship + * from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include "nandfs.h" + +static void +usage(void) +{ + + fprintf(stderr, "usage: nandfs [lssnap | mksnap | rmsnap ] " + "node\n"); + exit(1); +} + +int +main(int argc, char **argv) +{ + int error = 0; + char *cmd; + + if (argc < 2) + usage(); + + cmd = argv[1]; + argc -= 2; + argv += 2; + + if (strcmp(cmd, "lssnap") == 0) + error = nandfs_lssnap(argc, argv); + else if (strcmp(cmd, "mksnap") == 0) + error = nandfs_mksnap(argc, argv); + else if (strcmp(cmd, "rmsnap") == 0) + error = nandfs_rmsnap(argc, argv); + else + usage(); + + return (error); +} diff --git a/sbin/nandfs/nandfs.h b/sbin/nandfs/nandfs.h new file mode 100644 index 00000000000..f544cc254be --- /dev/null +++ b/sbin/nandfs/nandfs.h @@ -0,0 +1,40 @@ +/*- + * Copyright (c) 2012 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Semihalf under sponsorship + * from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef NANDFS_H +#define NANDFS_H + +int nandfs_lssnap(int, char **); +int nandfs_mksnap(int, char **); +int nandfs_rmsnap(int, char **); + +#endif /* !NANDFS_H */ diff --git a/sbin/nandfs/rmsnap.c b/sbin/nandfs/rmsnap.c new file mode 100644 index 00000000000..df2cbd562f1 --- /dev/null +++ b/sbin/nandfs/rmsnap.c @@ -0,0 +1,87 @@ +/*- + * Copyright (c) 2012 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Semihalf under sponsorship + * from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); +#include + +#include +#include +#include +#include + +#include +#include + +#include "nandfs.h" + +static void +rmsnap_usage(void) +{ + + fprintf(stderr, "usage:\n"); + fprintf(stderr, "\trmsnap snap node\n"); +} + +int +nandfs_rmsnap(int argc, char **argv) +{ + struct nandfs fs; + uint64_t cpno; + int error; + + if (argc != 2) { + rmsnap_usage(); + return (EX_USAGE); + } + + cpno = strtoll(argv[0], (char **)NULL, 10); + if (cpno == 0) { + fprintf(stderr, "%s must be a number greater than 0\n", + argv[0]); + return (EX_USAGE); + } + + nandfs_init(&fs, argv[1]); + error = nandfs_open(&fs); + if (error == -1) { + fprintf(stderr, "nandfs_open: %s\n", nandfs_errmsg(&fs)); + goto out; + } + + error = nandfs_delete_snap(&fs, cpno); + if (error == -1) + fprintf(stderr, "nandfs_delete_snap: %s\n", nandfs_errmsg(&fs)); + +out: + nandfs_close(&fs); + nandfs_destroy(&fs); + return (error); +} diff --git a/sbin/natd/natd.8 b/sbin/natd/natd.8 index 0729e2ccd91..b4b37ed1fb5 100644 --- a/sbin/natd/natd.8 +++ b/sbin/natd/natd.8 @@ -130,9 +130,9 @@ According to RFC 1918, unregistered source addresses are 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. .It Fl redirect_port Ar proto Xo .Ar targetIP Ns : Ns Xo -.Ar targetPORT Ns Op - Ns Ar targetPORT Xc -.Op Ar aliasIP Ns : Ns Xo -.Ar aliasPORT Ns Op - Ns Ar aliasPORT Xc +.Ar targetPORT Ns Oo - Ns Ar targetPORT Oc Xc +.Oo Ar aliasIP Ns : Oc Ns Xo +.Ar aliasPORT Ns Oo - Ns Ar aliasPORT Oc Xc .Oo Ar remoteIP Ns Oo : Ns .Ar remotePORT Ns Op - Ns Ar remotePORT .Oc Oc @@ -247,10 +247,8 @@ to appear from the specified .Ar targetIP Ns : Ns Xo .Ar targetPORT Ns Oo , Ns .Ar ...\& -.Oc Oc -.Xc -.Xc -.Op Ar aliasIP Ns : Ns Xo +.Oc Xc Oc Xc +.Oo Ar aliasIP Ns : Oc Ns Xo .Ar aliasPORT .Xc .Oo Ar remoteIP Ns @@ -787,7 +785,7 @@ ipfw add allow ip from any to any .Pp Here the packet from internal network to Internet goes out via .Ql sis0 -(rule number 2000) and gets catched by the +(rule number 2000) and gets caught by the .Ic globalport socket (3000). After that, either a match is found in a translation table diff --git a/sbin/newfs_nandfs/Makefile b/sbin/newfs_nandfs/Makefile new file mode 100644 index 00000000000..1d990eddf52 --- /dev/null +++ b/sbin/newfs_nandfs/Makefile @@ -0,0 +1,9 @@ +# $FreeBSD$ + +PROG= newfs_nandfs +MAN= newfs_nandfs.8 + +LDADD+= -lgeom +DPADD+= ${LIBGEOM} + +.include diff --git a/sbin/newfs_nandfs/newfs_nandfs.8 b/sbin/newfs_nandfs/newfs_nandfs.8 new file mode 100644 index 00000000000..c6a6f1b7958 --- /dev/null +++ b/sbin/newfs_nandfs/newfs_nandfs.8 @@ -0,0 +1,76 @@ +.\" +.\" Copyright (c) 2010 Semihalf +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd April 11, 2009 +.Dt NEWFS_NANDFS 8 +.Os +.Sh NAME +.Nm newfs_nandfs +.Nd construct a new NAND FS file system +.Sh SYNOPSIS +.Nm +.Op Fl b Ar blocsize +.Op Fl B Ar blocks-per-segment +.Op Fl L Ar label +.Op Fl m Ar reserved-segment-percent +.Ar device +.Sh DESCRIPTION +The +.Nm +utility creates a NAND FS file system on device. +.Pp +The options are as follow: +.Bl -tag -width indent +.It Fl b Ar blocksize +Size of block (1024 if not specified). +.It Fl B Ar blocks_per_segment +Number of blocks per segment (2048 if not specified). +.It Fl L Ar label +Volume label (up to 16 characters). +.It Fl m Ar reserved_block_percent +Percentage of reserved blocks (5 if not specified). +.El +.Sh EXIT STATUS +Exit status is 0 on success and 1 on error. +.Sh EXAMPLES +Create a file system, using default parameters, on +.Pa /dev/ad0s1 : +.Bd -literal -offset indent +newfs_nandfs /dev/ad0s1 +.Ed +.Sh SEE ALSO +.Xr disktab 5 , +.Xr disklabel 8 , +.Xr fdisk 8 , +.Xr newfs 8 +.Sh HISTORY +The +.Nm +utility first appeared in +.Fx 10.0 . +.Sh AUTHOR +.An Grzegorz Bernacki diff --git a/sbin/newfs_nandfs/newfs_nandfs.c b/sbin/newfs_nandfs/newfs_nandfs.c new file mode 100644 index 00000000000..c99667482b6 --- /dev/null +++ b/sbin/newfs_nandfs/newfs_nandfs.c @@ -0,0 +1,1176 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define DEBUG +#undef DEBUG +#ifdef DEBUG +#define debug(fmt, args...) do { \ + printf("nandfs:" fmt "\n", ##args); } while (0) +#else +#define debug(fmt, args...) +#endif + +#define NANDFS_FIRST_BLOCK nandfs_first_block() +#define NANDFS_FIRST_CNO 1 +#define NANDFS_BLOCK_BAD 1 +#define NANDFS_BLOCK_GOOD 0 + +struct file_info { + uint64_t ino; + const char *name; + uint32_t mode; + uint64_t size; + uint8_t nblocks; + uint32_t *blocks; + struct nandfs_inode *inode; +}; + +struct file_info user_files[] = +{ + {NANDFS_ROOT_INO, NULL, S_IFDIR | 0755, 0, 1, NULL, NULL}, +}; + +struct file_info ifile = {NANDFS_IFILE_INO, NULL, 0, 0, -1, NULL, NULL}; +struct file_info sufile = {NANDFS_SUFILE_INO, NULL, 0, 0, -1, NULL, NULL}; +struct file_info cpfile = {NANDFS_CPFILE_INO, NULL, 0, 0, -1, NULL, NULL}; +struct file_info datfile = {NANDFS_DAT_INO, NULL, 0, 0, -1, NULL, NULL}; + +struct nandfs_block { + LIST_ENTRY(nandfs_block) block_link; + uint32_t number; + uint64_t offset; + void *data; +}; + +static LIST_HEAD(, nandfs_block) block_head = LIST_HEAD_INITIALIZER(&block_head); + +/* Storage geometry */ +static off_t mediasize; +static ssize_t sectorsize; +static uint64_t nsegments; +static uint64_t erasesize; +static uint64_t segsize; + +struct nandfs_fsdata fsdata; +struct nandfs_super_block super_block; + +static int is_nand; + +/* Nandfs parameters */ +static size_t blocksize = NANDFS_DEF_BLOCKSIZE; +static long blocks_per_segment; +static long rsv_segment_percent = 5; +static time_t nandfs_time; +static uint32_t bad_segments_count = 0; +static uint32_t *bad_segments = NULL; +static uint8_t fsdata_blocks_state[NANDFS_NFSAREAS]; + +u_char *volumelabel = NULL; + +struct nandfs_super_root *sr; + +uint32_t nuserfiles; +uint32_t seg_segsum_size; +uint32_t seg_nblocks; +uint32_t seg_endblock; + +#define SIZE_TO_BLOCK(size) (((size) + (blocksize - 1)) / blocksize) + +static uint32_t +nandfs_first_block(void) +{ + uint32_t i, first_free, start_bad_segments = 0; + + for (i = 0; i < bad_segments_count; i++) { + if (i == bad_segments[i]) + start_bad_segments++; + else + break; + } + + first_free = SIZE_TO_BLOCK(NANDFS_DATA_OFFSET_BYTES(erasesize) + + (start_bad_segments * segsize)); + + if (first_free < (uint32_t)blocks_per_segment) + return (blocks_per_segment); + else + return (first_free); +} + +static void +usage(void) +{ + + fprintf(stderr, + "usage: newfs_nandfs [ -options ] device\n" + "where the options are:\n" + "\t-b block-size\n" + "\t-B blocks-per-segment\n" + "\t-L volume label\n" + "\t-m reserved-segments-percentage\n"); + exit(1); +} + +static int +nandfs_log2(unsigned n) +{ + unsigned count; + + /* + * N.B. this function will return 0 if supplied 0. + */ + for (count = 0; n/2; count++) + n /= 2; + return count; +} + +/* from NetBSD's src/sys/net/if_ethersubr.c */ +static uint32_t +crc32_le(uint32_t crc, const uint8_t *buf, size_t len) +{ + static const uint32_t crctab[] = { + 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, + 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, + 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c + }; + size_t i; + + crc = crc ^ ~0U; + + for (i = 0; i < len; i++) { + crc ^= buf[i]; + crc = (crc >> 4) ^ crctab[crc & 0xf]; + crc = (crc >> 4) ^ crctab[crc & 0xf]; + } + + return (crc ^ ~0U); +} + +static void * +get_block(uint32_t block_nr, uint64_t offset) +{ + struct nandfs_block *block, *new_block; + + LIST_FOREACH(block, &block_head, block_link) { + if (block->number == block_nr) + return block->data; + } + + debug("allocating block %x\n", block_nr); + + new_block = malloc(sizeof(*block)); + if (!new_block) + err(1, "cannot allocate block"); + + new_block->number = block_nr; + new_block->offset = offset; + new_block->data = malloc(blocksize); + if (!new_block->data) + err(1, "cannot allocate block data"); + + memset(new_block->data, 0, blocksize); + + LIST_INSERT_HEAD(&block_head, new_block, block_link); + + return (new_block->data); +} + +static int +nandfs_seg_usage_blk_offset(uint64_t seg, uint64_t *blk, uint64_t *offset) +{ + uint64_t off; + uint16_t seg_size; + + seg_size = sizeof(struct nandfs_segment_usage); + + off = roundup(sizeof(struct nandfs_sufile_header), seg_size); + off += (seg * seg_size); + + *blk = off / blocksize; + *offset = (off % blocksize) / seg_size; + return (0); +} + +static uint32_t +segment_size(void) +{ + u_int size; + + size = sizeof(struct nandfs_segment_summary ); + size += seg_nblocks * sizeof(struct nandfs_binfo_v); + + if (size > blocksize) + err(1, "segsum info bigger that blocksize"); + + return (size); +} + + +static void +prepare_blockgrouped_file(uint32_t block) +{ + struct nandfs_block_group_desc *desc; + uint32_t i, entries; + + desc = (struct nandfs_block_group_desc *)get_block(block, 0); + entries = blocksize / sizeof(struct nandfs_block_group_desc); + for (i = 0; i < entries; i++) + desc[i].bg_nfrees = blocksize * 8; +} + +static void +alloc_blockgrouped_file(uint32_t block, uint32_t entry) +{ + struct nandfs_block_group_desc *desc; + uint32_t desc_nr; + uint32_t *bitmap; + + desc = (struct nandfs_block_group_desc *)get_block(block, 0); + bitmap = (uint32_t *)get_block(block + 1, 1); + + bitmap += (entry >> 5); + if (*bitmap & (1 << (entry % 32))) { + printf("nandfs: blockgrouped entry %d already allocated\n", + entry); + } + *bitmap |= (1 << (entry % 32)); + + desc_nr = entry / (blocksize * 8); + desc[desc_nr].bg_nfrees--; +} + + +static uint64_t +count_su_blocks(void) +{ + uint64_t maxblk, blk, offset, i; + + maxblk = blk = 0; + + for (i = 0; i < bad_segments_count; i++) { + nandfs_seg_usage_blk_offset(bad_segments[i], &blk, &offset); + debug("bad segment at block:%jx off: %jx", blk, offset); + if (blk > maxblk) + maxblk = blk; + } + + debug("bad segment needs %#jx", blk); + if (blk >= NDADDR) { + printf("nandfs: file too big (%jd > %d)\n", blk, NDADDR); + exit(2); + } + + sufile.size = (blk + 1) * blocksize; + return (blk + 1); +} + +static void +count_seg_blocks(void) +{ + uint32_t i; + + for (i = 0; i < nuserfiles; i++) + if (user_files[i].nblocks) { + seg_nblocks += user_files[i].nblocks; + user_files[i].blocks = malloc(user_files[i].nblocks * sizeof(uint32_t)); + } + + ifile.nblocks = 2 + + SIZE_TO_BLOCK(sizeof(struct nandfs_inode) * (NANDFS_USER_INO + 1)); + ifile.blocks = malloc(ifile.nblocks * sizeof(uint32_t)); + seg_nblocks += ifile.nblocks; + + cpfile.nblocks = + SIZE_TO_BLOCK((NANDFS_CPFILE_FIRST_CHECKPOINT_OFFSET + 1) * + sizeof(struct nandfs_checkpoint)); + cpfile.blocks = malloc(cpfile.nblocks * sizeof(uint32_t)); + seg_nblocks += cpfile.nblocks; + + if (!bad_segments) { + sufile.nblocks = + SIZE_TO_BLOCK((NANDFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET + 1) * + sizeof(struct nandfs_segment_usage)); + } else { + debug("bad blocks found: extra space for sufile"); + sufile.nblocks = count_su_blocks(); + } + + sufile.blocks = malloc(sufile.nblocks * sizeof(uint32_t)); + seg_nblocks += sufile.nblocks; + + datfile.nblocks = 2 + + SIZE_TO_BLOCK((seg_nblocks) * sizeof(struct nandfs_dat_entry)); + datfile.blocks = malloc(datfile.nblocks * sizeof(uint32_t)); + seg_nblocks += datfile.nblocks; +} + +static void +assign_file_blocks(uint64_t start_block) +{ + uint32_t i, j; + + for (i = 0; i < nuserfiles; i++) + for (j = 0; j < user_files[i].nblocks; j++) { + debug("user file %d at block %d at %#jx", + i, j, (uintmax_t)start_block); + user_files[i].blocks[j] = start_block++; + } + + for (j = 0; j < ifile.nblocks; j++) { + debug("ifile block %d at %#jx", j, (uintmax_t)start_block); + ifile.blocks[j] = start_block++; + } + + for (j = 0; j < cpfile.nblocks; j++) { + debug("cpfile block %d at %#jx", j, (uintmax_t)start_block); + cpfile.blocks[j] = start_block++; + } + + for (j = 0; j < sufile.nblocks; j++) { + debug("sufile block %d at %#jx", j, (uintmax_t)start_block); + sufile.blocks[j] = start_block++; + } + + for (j = 0; j < datfile.nblocks; j++) { + debug("datfile block %d at %#jx", j, (uintmax_t)start_block); + datfile.blocks[j] = start_block++; + } + + /* add one for superroot */ + debug("sr at block %#jx", (uintmax_t)start_block); + sr = (struct nandfs_super_root *)get_block(start_block++, 0); + seg_endblock = start_block; +} + +static void +save_datfile(void) +{ + + prepare_blockgrouped_file(datfile.blocks[0]); +} + +static uint64_t +update_datfile(uint64_t block) +{ + struct nandfs_dat_entry *dat; + static uint64_t vblock = 0; + uint64_t allocated, i, off; + + if (vblock == 0) { + alloc_blockgrouped_file(datfile.blocks[0], vblock); + vblock++; + } + allocated = vblock; + i = vblock / (blocksize / sizeof(*dat)); + off = vblock % (blocksize / sizeof(*dat)); + vblock++; + + dat = (struct nandfs_dat_entry *)get_block(datfile.blocks[2 + i], 2 + i); + + alloc_blockgrouped_file(datfile.blocks[0], allocated); + dat[off].de_blocknr = block; + dat[off].de_start = NANDFS_FIRST_CNO; + dat[off].de_end = UINTMAX_MAX; + + return (allocated); +} + +static union nandfs_binfo * +update_block_info(union nandfs_binfo *binfo, struct file_info *file) +{ + nandfs_daddr_t vblock; + uint32_t i; + + for (i = 0; i < file->nblocks; i++) { + debug("%s: blk %x", __func__, i); + if (file->ino != NANDFS_DAT_INO) { + vblock = update_datfile(file->blocks[i]); + binfo->bi_v.bi_vblocknr = vblock; + binfo->bi_v.bi_blkoff = i; + binfo->bi_v.bi_ino = file->ino; + file->inode->i_db[i] = vblock; + } else { + binfo->bi_dat.bi_blkoff = i; + binfo->bi_dat.bi_ino = file->ino; + file->inode->i_db[i] = datfile.blocks[i]; + } + binfo++; + } + + return (binfo); +} + +static void +save_segsum(struct nandfs_segment_summary *ss) +{ + union nandfs_binfo *binfo; + struct nandfs_block *block; + uint32_t sum_bytes, i; + uint8_t crc_data, crc_skip; + + sum_bytes = segment_size(); + ss->ss_magic = NANDFS_SEGSUM_MAGIC; + ss->ss_bytes = sizeof(struct nandfs_segment_summary); + ss->ss_flags = NANDFS_SS_LOGBGN | NANDFS_SS_LOGEND | NANDFS_SS_SR; + ss->ss_seq = 1; + ss->ss_create = nandfs_time; + + ss->ss_next = nandfs_first_block() + blocks_per_segment; + /* nblocks = segment blocks + segsum block + superroot */ + ss->ss_nblocks = seg_nblocks + 2; + ss->ss_nbinfos = seg_nblocks; + ss->ss_sumbytes = sum_bytes; + + crc_skip = sizeof(ss->ss_datasum) + sizeof(ss->ss_sumsum); + ss->ss_sumsum = crc32_le(0, (uint8_t *)ss + crc_skip, + sum_bytes - crc_skip); + crc_data = 0; + + binfo = (union nandfs_binfo *)(ss + 1); + for (i = 0; i < nuserfiles; i++) { + if (user_files[i].nblocks) + binfo = update_block_info(binfo, &user_files[i]); + } + + binfo = update_block_info(binfo, &ifile); + binfo = update_block_info(binfo, &cpfile); + binfo = update_block_info(binfo, &sufile); + update_block_info(binfo, &datfile); + + /* save superroot crc */ + crc_skip = sizeof(sr->sr_sum); + sr->sr_sum = crc32_le(0, (uint8_t *)sr + crc_skip, + NANDFS_SR_BYTES - crc_skip); + + /* segment checksup */ + crc_skip = sizeof(ss->ss_datasum); + LIST_FOREACH(block, &block_head, block_link) { + if (block->number < NANDFS_FIRST_BLOCK) + continue; + if (block->number == NANDFS_FIRST_BLOCK) + crc_data = crc32_le(0, + (uint8_t *)block->data + crc_skip, + blocksize - crc_skip); + else + crc_data = crc32_le(crc_data, (uint8_t *)block->data, + blocksize); + } + ss->ss_datasum = crc_data; +} + +static void +create_fsdata(void) +{ + + memset(&fsdata, 0, sizeof(struct nandfs_fsdata)); + + fsdata.f_magic = NANDFS_FSDATA_MAGIC; + fsdata.f_nsegments = nsegments; + fsdata.f_erasesize = erasesize; + fsdata.f_first_data_block = NANDFS_FIRST_BLOCK; + fsdata.f_blocks_per_segment = blocks_per_segment; + fsdata.f_r_segments_percentage = rsv_segment_percent; + fsdata.f_rev_level = NANDFS_CURRENT_REV; + fsdata.f_sbbytes = NANDFS_SB_BYTES; + fsdata.f_bytes = NANDFS_FSDATA_CRC_BYTES; + fsdata.f_ctime = nandfs_time; + fsdata.f_log_block_size = nandfs_log2(blocksize) - 10; + fsdata.f_errors = 1; + fsdata.f_inode_size = sizeof(struct nandfs_inode); + fsdata.f_dat_entry_size = sizeof(struct nandfs_dat_entry); + fsdata.f_checkpoint_size = sizeof(struct nandfs_checkpoint); + fsdata.f_segment_usage_size = sizeof(struct nandfs_segment_usage); + + uuidgen(&fsdata.f_uuid, 1); + + if (volumelabel) + memcpy(fsdata.f_volume_name, volumelabel, 16); + + fsdata.f_sum = crc32_le(0, (const uint8_t *)&fsdata, + NANDFS_FSDATA_CRC_BYTES); +} + +static void +save_fsdata(void *data) +{ + + memcpy(data, &fsdata, sizeof(fsdata)); +} + +static void +create_super_block(void) +{ + + memset(&super_block, 0, sizeof(struct nandfs_super_block)); + + super_block.s_magic = NANDFS_SUPER_MAGIC; + super_block.s_last_cno = NANDFS_FIRST_CNO; + super_block.s_last_pseg = NANDFS_FIRST_BLOCK; + super_block.s_last_seq = 1; + super_block.s_free_blocks_count = + (nsegments - bad_segments_count) * blocks_per_segment; + super_block.s_mtime = 0; + super_block.s_wtime = nandfs_time; + super_block.s_state = NANDFS_VALID_FS; + + super_block.s_sum = crc32_le(0, (const uint8_t *)&super_block, + NANDFS_SB_BYTES); +} + +static void +save_super_block(void *data) +{ + + memcpy(data, &super_block, sizeof(super_block)); +} + +static void +save_super_root(void) +{ + + sr->sr_bytes = NANDFS_SR_BYTES; + sr->sr_flags = 0; + sr->sr_nongc_ctime = nandfs_time; + datfile.inode = &sr->sr_dat; + cpfile.inode = &sr->sr_cpfile; + sufile.inode = &sr->sr_sufile; +} + +static struct nandfs_dir_entry * +add_de(void *block, struct nandfs_dir_entry *de, uint64_t ino, + const char *name, uint8_t type) +{ + uint16_t reclen; + + /* modify last de */ + de->rec_len = NANDFS_DIR_REC_LEN(de->name_len); + de = (void *)((uint8_t *)de + de->rec_len); + + reclen = blocksize - ((uintptr_t)de - (uintptr_t)block); + if (reclen < NANDFS_DIR_REC_LEN(strlen(name))) { + printf("nandfs: too many dir entries for one block\n"); + return (NULL); + } + + de->inode = ino; + de->rec_len = reclen; + de->name_len = strlen(name); + de->file_type = type; + memset(de->name, 0, + (strlen(name) + NANDFS_DIR_PAD - 1) & ~NANDFS_DIR_ROUND); + memcpy(de->name, name, strlen(name)); + + return (de); +} + +static struct nandfs_dir_entry * +make_dir(void *block, uint64_t ino, uint64_t parent_ino) +{ + struct nandfs_dir_entry *de = (struct nandfs_dir_entry *)block; + + /* create '..' entry */ + de->inode = parent_ino; + de->rec_len = NANDFS_DIR_REC_LEN(2); + de->name_len = 2; + de->file_type = DT_DIR; + memset(de->name, 0, NANDFS_DIR_NAME_LEN(2)); + memcpy(de->name, "..", 2); + + /* create '.' entry */ + de = (void *)((uint8_t *)block + NANDFS_DIR_REC_LEN(2)); + de->inode = ino; + de->rec_len = blocksize - NANDFS_DIR_REC_LEN(2); + de->name_len = 1; + de->file_type = DT_DIR; + memset(de->name, 0, NANDFS_DIR_NAME_LEN(1)); + memcpy(de->name, ".", 1); + + return (de); +} + +static void +save_root_dir(void) +{ + struct file_info *root = &user_files[0]; + struct nandfs_dir_entry *de; + uint32_t i; + void *block; + + block = get_block(root->blocks[0], 0); + + de = make_dir(block, root->ino, root->ino); + for (i = 1; i < nuserfiles; i++) + de = add_de(block, de, user_files[i].ino, user_files[i].name, + IFTODT(user_files[i].mode)); + + root->size = ((uintptr_t)de - (uintptr_t)block) + + NANDFS_DIR_REC_LEN(de->name_len); +} + +static void +save_sufile(void) +{ + struct nandfs_sufile_header *header; + struct nandfs_segment_usage *su; + uint64_t blk, i, off; + void *block; + int start; + + /* + * At the beginning just zero-out everything + */ + for (i = 0; i < sufile.nblocks; i++) + get_block(sufile.blocks[i], 0); + + start = 0; + + block = get_block(sufile.blocks[start], 0); + header = (struct nandfs_sufile_header *)block; + header->sh_ncleansegs = nsegments - bad_segments_count - 1; + header->sh_ndirtysegs = 1; + header->sh_last_alloc = 1; + + su = (struct nandfs_segment_usage *)header; + off = NANDFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET; + /* Allocate data segment */ + su[off].su_lastmod = nandfs_time; + /* nblocks = segment blocks + segsum block + superroot */ + su[off].su_nblocks = seg_nblocks + 2; + su[off].su_flags = NANDFS_SEGMENT_USAGE_DIRTY; + off++; + /* Allocate next segment */ + su[off].su_lastmod = nandfs_time; + su[off].su_nblocks = 0; + su[off].su_flags = NANDFS_SEGMENT_USAGE_DIRTY; + for (i = 0; i < bad_segments_count; i++) { + nandfs_seg_usage_blk_offset(bad_segments[i], &blk, &off); + debug("storing bad_segments[%jd]=%x at %jx off %jx\n", i, + bad_segments[i], blk, off); + block = get_block(sufile.blocks[blk], + off * sizeof(struct nandfs_segment_usage *)); + su = (struct nandfs_segment_usage *)block; + su[off].su_lastmod = nandfs_time; + su[off].su_nblocks = 0; + su[off].su_flags = NANDFS_SEGMENT_USAGE_ERROR; + } +} + +static void +save_cpfile(void) +{ + struct nandfs_cpfile_header *header; + struct nandfs_checkpoint *cp, *initial_cp; + int i, entries = blocksize / sizeof(struct nandfs_checkpoint); + uint64_t cno; + + header = (struct nandfs_cpfile_header *)get_block(cpfile.blocks[0], 0); + header->ch_ncheckpoints = 1; + header->ch_nsnapshots = 0; + + cp = (struct nandfs_checkpoint *)header; + + /* fill first checkpoint data*/ + initial_cp = &cp[NANDFS_CPFILE_FIRST_CHECKPOINT_OFFSET]; + initial_cp->cp_flags = 0; + initial_cp->cp_checkpoints_count = 0; + initial_cp->cp_cno = NANDFS_FIRST_CNO; + initial_cp->cp_create = nandfs_time; + initial_cp->cp_nblk_inc = seg_endblock - 1; + initial_cp->cp_blocks_count = seg_nblocks; + memset(&initial_cp->cp_snapshot_list, 0, + sizeof(struct nandfs_snapshot_list)); + + ifile.inode = &initial_cp->cp_ifile_inode; + + /* mark rest of cp as invalid */ + cno = NANDFS_FIRST_CNO + 1; + i = NANDFS_CPFILE_FIRST_CHECKPOINT_OFFSET + 1; + for (; i < entries; i++) { + cp[i].cp_cno = cno++; + cp[i].cp_flags = NANDFS_CHECKPOINT_INVALID; + } +} + +static void +init_inode(struct nandfs_inode *inode, struct file_info *file) +{ + + inode->i_blocks = file->nblocks; + inode->i_ctime = nandfs_time; + inode->i_mtime = nandfs_time; + inode->i_mode = file->mode & 0xffff; + inode->i_links_count = 1; + + if (file->size > 0) + inode->i_size = file->size; + else + inode->i_size = 0; + + if (file->ino == NANDFS_USER_INO) + inode->i_flags = SF_NOUNLINK|UF_NOUNLINK; + else + inode->i_flags = 0; +} + +static void +save_ifile(void) +{ + struct nandfs_inode *inode; + struct file_info *file; + uint64_t ino, blk, off; + uint32_t i; + + prepare_blockgrouped_file(ifile.blocks[0]); + for (i = 0; i <= NANDFS_USER_INO; i++) + alloc_blockgrouped_file(ifile.blocks[0], i); + + for (i = 0; i < nuserfiles; i++) { + file = &user_files[i]; + ino = file->ino; + blk = ino / (blocksize / sizeof(*inode)); + off = ino % (blocksize / sizeof(*inode)); + inode = + (struct nandfs_inode *)get_block(ifile.blocks[2 + blk], 2 + blk); + file->inode = &inode[off]; + init_inode(file->inode, file); + } + + init_inode(ifile.inode, &ifile); + init_inode(cpfile.inode, &cpfile); + init_inode(sufile.inode, &sufile); + init_inode(datfile.inode, &datfile); +} + +static int +create_fs(void) +{ + uint64_t start_block; + uint32_t segsum_size; + char *data; + int i; + + nuserfiles = (sizeof(user_files) / sizeof(user_files[0])); + + /* Count and assign blocks */ + count_seg_blocks(); + segsum_size = segment_size(); + start_block = NANDFS_FIRST_BLOCK + SIZE_TO_BLOCK(segsum_size); + assign_file_blocks(start_block); + + /* Create super root structure */ + save_super_root(); + + /* Create root directory */ + save_root_dir(); + + /* Fill in file contents */ + save_sufile(); + save_cpfile(); + save_ifile(); + save_datfile(); + + /* Save fsdata and superblocks */ + create_fsdata(); + create_super_block(); + + for (i = 0; i < NANDFS_NFSAREAS; i++) { + if (fsdata_blocks_state[i] != NANDFS_BLOCK_GOOD) + continue; + + data = get_block((i * erasesize)/blocksize, 0); + save_fsdata(data); + + data = get_block((i * erasesize + NANDFS_SBLOCK_OFFSET_BYTES) / + blocksize, 0); + if (blocksize > NANDFS_SBLOCK_OFFSET_BYTES) + data += NANDFS_SBLOCK_OFFSET_BYTES; + save_super_block(data); + memset(data + sizeof(struct nandfs_super_block), 0xff, + (blocksize - sizeof(struct nandfs_super_block) - + NANDFS_SBLOCK_OFFSET_BYTES)); + } + + /* Save segment summary and CRCs */ + save_segsum(get_block(NANDFS_FIRST_BLOCK, 0)); + + return (0); +} + +static void +write_fs(int fda) +{ + struct nandfs_block *block; + char *data; + u_int ret; + + /* Overwrite next block with ff if not nand device */ + if (!is_nand) { + data = get_block(seg_endblock, 0); + memset(data, 0xff, blocksize); + } + + LIST_FOREACH(block, &block_head, block_link) { + lseek(fda, block->number * blocksize, SEEK_SET); + ret = write(fda, block->data, blocksize); + if (ret != blocksize) + err(1, "cannot write filesystem data"); + } +} + +static void +check_parameters(void) +{ + int i; + + /* check blocksize */ + if ((blocksize < NANDFS_MIN_BLOCKSIZE) || (blocksize > MAXBSIZE) || + ((blocksize - 1) & blocksize)) { + errx(1, "Bad blocksize (%zu). Must be in range [%u-%u] " + "and a power of two.", blocksize, NANDFS_MIN_BLOCKSIZE, + MAXBSIZE); + } + + /* check blocks per segments */ + if ((blocks_per_segment < NANDFS_SEG_MIN_BLOCKS) || + ((blocksize - 1) & blocksize)) + errx(1, "Bad blocks per segment (%lu). Must be greater than " + "%u and a power of two.", blocks_per_segment, + NANDFS_SEG_MIN_BLOCKS); + + /* check reserved segment percentage */ + if ((rsv_segment_percent < 1) && (rsv_segment_percent > 99)) + errx(1, "Bad reserved segment percentage. " + "Must in range 1..99."); + + /* check volume label */ + i = 0; + if (volumelabel) { + while (isalnum(volumelabel[++i])) + ; + + if (volumelabel[i] != '\0') { + errx(1, "bad volume label. " + "Valid characters are alphanumerics."); + } + + if (strlen(volumelabel) >= 16) + errx(1, "Bad volume label. Length is longer than %d.", + 16); + } + + nandfs_time = time(NULL); +} + +static void +print_parameters(void) +{ + + printf("filesystem parameters:\n"); + printf("blocksize: %#zx sectorsize: %#zx\n", blocksize, sectorsize); + printf("erasesize: %#jx mediasize: %#jx\n", erasesize, mediasize); + printf("segment size: %#jx blocks per segment: %#x\n", segsize, + (uint32_t)blocks_per_segment); +} + +/* + * Exit with error if file system is mounted. + */ +static void +check_mounted(const char *fname, mode_t mode) +{ + struct statfs *mp; + const char *s1, *s2; + size_t len; + int n, r; + + if (!(n = getmntinfo(&mp, MNT_NOWAIT))) + err(1, "getmntinfo"); + + len = strlen(_PATH_DEV); + s1 = fname; + if (!strncmp(s1, _PATH_DEV, len)) + s1 += len; + + r = S_ISCHR(mode) && s1 != fname && *s1 == 'r'; + + for (; n--; mp++) { + s2 = mp->f_mntfromname; + + if (!strncmp(s2, _PATH_DEV, len)) + s2 += len; + if ((r && s2 != mp->f_mntfromname && !strcmp(s1 + 1, s2)) || + !strcmp(s1, s2)) + errx(1, "%s is mounted on %s", fname, mp->f_mntonname); + } +} + +static void +calculate_geometry(int fd) +{ + struct chip_param_io chip_params; + char ident[DISK_IDENT_SIZE]; + char medianame[MAXPATHLEN]; + + /* Check storage type */ + g_get_ident(fd, ident, DISK_IDENT_SIZE); + g_get_name(ident, medianame, MAXPATHLEN); + debug("device name: %s", medianame); + + is_nand = (strstr(medianame, "gnand") != NULL); + debug("is_nand = %d", is_nand); + + sectorsize = g_sectorsize(fd); + debug("sectorsize: %#zx", sectorsize); + + /* Get storage size */ + mediasize = g_mediasize(fd); + debug("mediasize: %#jx", mediasize); + + /* Get storage erase unit size */ + if (!is_nand) + erasesize = NANDFS_DEF_ERASESIZE; + else if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) + errx(1, "Cannot ioctl(NAND_IO_GET_CHIP_PARAM)"); + else + erasesize = chip_params.page_size * chip_params.pages_per_block; + + debug("erasesize: %#jx", (uintmax_t)erasesize); + + if (blocks_per_segment == 0) { + if (erasesize >= NANDFS_MIN_SEGSIZE) + blocks_per_segment = erasesize / blocksize; + else + blocks_per_segment = NANDFS_MIN_SEGSIZE / blocksize; + } + + /* Calculate number of segments */ + segsize = blocksize * blocks_per_segment; + nsegments = ((mediasize - NANDFS_NFSAREAS * erasesize) / segsize) - 2; + debug("segsize: %#jx", segsize); + debug("nsegments: %#jx", nsegments); +} + +static void +erase_device(int fd) +{ + int rest, failed; + uint64_t i, nblocks; + off_t offset; + + failed = 0; + for (i = 0; i < NANDFS_NFSAREAS; i++) { + debug("Deleting %jx\n", i * erasesize); + if (g_delete(fd, i * erasesize, erasesize)) { + printf("cannot delete %jx\n", i * erasesize); + fsdata_blocks_state[i] = NANDFS_BLOCK_BAD; + failed++; + } else + fsdata_blocks_state[i] = NANDFS_BLOCK_GOOD; + } + + if (failed == NANDFS_NFSAREAS) { + printf("%d first blocks not usable. Unable to create " + "filesystem.\n", failed); + exit(1); + } + + for (i = 0; i < nsegments; i++) { + offset = NANDFS_NFSAREAS * erasesize + i * segsize; + if (g_delete(fd, offset, segsize)) { + printf("cannot delete segment %jx (offset %jd)\n", + i, offset); + bad_segments_count++; + bad_segments = realloc(bad_segments, + bad_segments_count * sizeof(uint32_t)); + bad_segments[bad_segments_count - 1] = i; + } + } + + if (bad_segments_count == nsegments) { + printf("no valid segments\n"); + exit(1); + } + + /* Delete remaining blocks at the end of device */ + rest = mediasize % segsize; + nblocks = rest / erasesize; + for (i = 0; i < nblocks; i++) { + offset = (segsize * nsegments) + (i * erasesize); + if (g_delete(fd, offset, erasesize)) { + printf("cannot delete space after last segment " + "- probably a bad block\n"); + } + } +} + +static void +erase_initial(int fd) +{ + char buf[512]; + u_int i; + + memset(buf, 0xff, sizeof(buf)); + + lseek(fd, 0, SEEK_SET); + for (i = 0; i < NANDFS_NFSAREAS * erasesize; i += sizeof(buf)) + write(fd, buf, sizeof(buf)); +} + +static void +create_nandfs(int fd) +{ + + create_fs(); + + write_fs(fd); +} + +static void +print_summary(void) +{ + + printf("filesystem created succesfully\n"); + printf("total segments: %#jx valid segments: %#jx\n", nsegments, + nsegments - bad_segments_count); + printf("total space: %ju MB free: %ju MB\n", + (nsegments * + blocks_per_segment * blocksize) / (1024 * 1024), + ((nsegments - bad_segments_count) * + blocks_per_segment * blocksize) / (1024 * 1024)); +} + +int +main(int argc, char *argv[]) +{ + struct stat sb; + char buf[MAXPATHLEN]; + const char opts[] = "b:B:L:m:"; + const char *fname; + int ch, fd; + + while ((ch = getopt(argc, argv, opts)) != -1) { + switch (ch) { + case 'b': + blocksize = strtol(optarg, (char **)NULL, 10); + if (blocksize == 0) + usage(); + break; + case 'B': + blocks_per_segment = strtol(optarg, (char **)NULL, 10); + if (blocks_per_segment == 0) + usage(); + break; + case 'L': + volumelabel = optarg; + break; + case 'm': + rsv_segment_percent = strtol(optarg, (char **)NULL, 10); + if (rsv_segment_percent == 0) + usage(); + break; + default: + usage(); + } + } + + argc -= optind; + argv += optind; + if (argc < 1 || argc > 2) + usage(); + + /* construct proper device path */ + fname = *argv++; + if (!strchr(fname, '/')) { + snprintf(buf, sizeof(buf), "%s%s", _PATH_DEV, fname); + if (!(fname = strdup(buf))) + err(1, NULL); + } + + fd = g_open(fname, 1); + if (fd == -1) + err(1, "Cannot open %s", fname); + + if (fstat(fd, &sb) == -1) + err(1, "Cannot stat %s", fname); + if (!S_ISCHR(sb.st_mode)) + warnx("%s is not a character device", fname); + + check_mounted(fname, sb.st_mode); + + calculate_geometry(fd); + + check_parameters(); + + print_parameters(); + + if (is_nand) + erase_device(fd); + else + erase_initial(fd); + + create_nandfs(fd); + + print_summary(); + + g_close(fd); + + return (0); +} + + diff --git a/sbin/ping/ping.c b/sbin/ping/ping.c index baf7faaf4d5..f8f62d1f864 100644 --- a/sbin/ping/ping.c +++ b/sbin/ping/ping.c @@ -832,7 +832,7 @@ main(int argc, char *const *argv) timeout.tv_sec++; } if (timeout.tv_sec < 0) - timeout.tv_sec = timeout.tv_usec = 0; + timerclear(&timeout); n = select(s + 1, &rfds, NULL, NULL, &timeout); if (n < 0) continue; /* Must be EINTR. */ diff --git a/sbin/restore/restore.8 b/sbin/restore/restore.8 index 94ca8784f43..d17496cce5e 100644 --- a/sbin/restore/restore.8 +++ b/sbin/restore/restore.8 @@ -68,16 +68,6 @@ .Op Fl f Ar file | Fl P Ar pipecommand .Op Fl s Ar fileno .Op Ar -.Pp -.Nm rrestore -is an alternate name for -.Nm . -.Pp -.in \" XXX -(The -.Bx 4.3 -option syntax is implemented for backward compatibility, but -is not documented here.) .Sh DESCRIPTION The .Nm @@ -104,6 +94,14 @@ flag is specified (see below), the appearance of a directory name refers to the files and (recursively) subdirectories of that directory. .Pp +.Nm +may also be invoked as +.Nm rrestore . +The +.Bx 4.3 +option syntax is implemented for backward compatibility, but +is not documented here. +.Pp Exactly one of the following flags is required: .Bl -tag -width Ds .It Fl i diff --git a/sbin/restore/utilities.c b/sbin/restore/utilities.c index 6b984e40974..89c2b09298c 100644 --- a/sbin/restore/utilities.c +++ b/sbin/restore/utilities.c @@ -411,6 +411,7 @@ panic(const char *fmt, ...) va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); + va_end(ap); if (yflag) return; if (reply("abort") == GOOD) { diff --git a/sbin/setkey/setkey.8 b/sbin/setkey/setkey.8 index 6046bad268e..8f7bae139c0 100644 --- a/sbin/setkey/setkey.8 +++ b/sbin/setkey/setkey.8 @@ -130,7 +130,7 @@ are treated as comment lines. .Ar src Ar dst Ar protocol Ar spi .Op Ar extensions .Ar algorithm ... -.Li ; +.Li \&; .Xc Add an SAD entry. .Li add @@ -141,7 +141,7 @@ including when the key length does not match the specified algorithm. .Li get .Op Fl 46n .Ar src Ar dst Ar protocol Ar spi -.Li ; +.Li \&; .Xc Show an SAD entry. .\" @@ -149,7 +149,7 @@ Show an SAD entry. .Li delete .Op Fl 46n .Ar src Ar dst Ar protocol Ar spi -.Li ; +.Li \&; .Xc Remove an SAD entry. .\" @@ -157,14 +157,14 @@ Remove an SAD entry. .Li deleteall .Op Fl 46n .Ar src Ar dst Ar protocol -.Li ; +.Li \&; .Xc Remove all SAD entries that match the specification. .\" .It Xo .Li flush .Op Ar protocol -.Li ; +.Li \&; .Xc Clear all SAD entries matched by the options. .Fl F @@ -173,7 +173,7 @@ on the command line achieves the same functionality. .It Xo .Li dump .Op Ar protocol -.Li ; +.Li \&; .Xc Dumps all SAD entries matched by the options. .Fl D @@ -183,7 +183,7 @@ on the command line achieves the same functionality. .Li spdadd .Op Fl 46n .Ar src_range Ar dst_range Ar upperspec Ar policy -.Li ; +.Li \&; .Xc Add an SPD entry. .\" @@ -191,13 +191,13 @@ Add an SPD entry. .Li spddelete .Op Fl 46n .Ar src_range Ar dst_range Ar upperspec Fl P Ar direction -.Li ; +.Li \&; .Xc Delete an SPD entry. .\" .It Xo .Li spdflush -.Li ; +.Li \&; .Xc Clear all SPD entries. .Fl FP @@ -205,7 +205,7 @@ on the command line achieves the same functionality. .\" .It Xo .Li spddump -.Li ; +.Li \&; .Xc Dumps all SPD entries. .Fl DP @@ -442,7 +442,7 @@ protocols other than TCP, UDP and ICMP may not be suitable to use with IPsec. .Ar policy is expressed in one of the following three formats: .Pp -.Bl -tag -compact +.Bl -tag -width 2n -compact .It Fl P Ar direction Li discard .It Fl P Ar direction Li none .It Xo Fl P Ar direction Li ipsec @@ -553,7 +553,9 @@ For example, if an IP header was followed by an AH header followed by an ESP header followed by an upper layer protocol header, the rule would be: +.Pp .Dl esp/transport//require ah/transport//require ; +.Pp The rule order is very important. .Pp Note that diff --git a/sbin/shutdown/shutdown.c b/sbin/shutdown/shutdown.c index 6e662a8b6f4..05d73a97a7a 100644 --- a/sbin/shutdown/shutdown.c +++ b/sbin/shutdown/shutdown.c @@ -356,7 +356,6 @@ perform_shutdown(void) syslog(LOG_NOTICE, "%s by %s: %s", doreboot ? "reboot" : dohalt ? "halt" : dopower ? "power-down" : "shutdown", whom, mbuf); - (void)sleep(2); (void)printf("\r\nSystem shutdown time has arrived\007\007\r\n"); if (killflg) { diff --git a/secure/lib/libcrypt/crypt-des.c b/secure/lib/libcrypt/crypt-des.c index 9adff936f3a..6bb9bc03c76 100644 --- a/secure/lib/libcrypt/crypt-des.c +++ b/secure/lib/libcrypt/crypt-des.c @@ -606,7 +606,7 @@ crypt_des(const char *key, const char *setting) q = (u_char *)keybuf; while (q - (u_char *)keybuf - 8) { *q++ = *key << 1; - if (*(q - 1)) + if (*key != '\0') key++; } if (des_setkey((char *)keybuf)) diff --git a/secure/lib/libcrypto/Makefile.inc b/secure/lib/libcrypto/Makefile.inc index 24b8d88c30a..fe31ea0c861 100644 --- a/secure/lib/libcrypto/Makefile.inc +++ b/secure/lib/libcrypto/Makefile.inc @@ -3,8 +3,8 @@ .include # OpenSSL version used for manual page generation -OPENSSL_VER= 0.9.8q -OPENSSL_DATE= 2010-12-02 +OPENSSL_VER= 0.9.8x +OPENSSL_DATE= 2012-05-10 LCRYPTO_SRC= ${.CURDIR}/../../../crypto/openssl LCRYPTO_DOC= ${.CURDIR}/../../../crypto/openssl/doc diff --git a/secure/lib/libcrypto/man/ASN1_OBJECT_new.3 b/secure/lib/libcrypto/man/ASN1_OBJECT_new.3 index a1e248e8bfc..e7fe8f35af6 100644 --- a/secure/lib/libcrypto/man/ASN1_OBJECT_new.3 +++ b/secure/lib/libcrypto/man/ASN1_OBJECT_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ASN1_OBJECT_new 3" -.TH ASN1_OBJECT_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ASN1_OBJECT_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ASN1_STRING_length.3 b/secure/lib/libcrypto/man/ASN1_STRING_length.3 index 5472c30e75e..fbe78082aa6 100644 --- a/secure/lib/libcrypto/man/ASN1_STRING_length.3 +++ b/secure/lib/libcrypto/man/ASN1_STRING_length.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ASN1_STRING_length 3" -.TH ASN1_STRING_length 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ASN1_STRING_length 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ASN1_STRING_new.3 b/secure/lib/libcrypto/man/ASN1_STRING_new.3 index 04b6e8adb1b..0a93ba097c7 100644 --- a/secure/lib/libcrypto/man/ASN1_STRING_new.3 +++ b/secure/lib/libcrypto/man/ASN1_STRING_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ASN1_STRING_new 3" -.TH ASN1_STRING_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ASN1_STRING_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ASN1_STRING_print_ex.3 b/secure/lib/libcrypto/man/ASN1_STRING_print_ex.3 index a56f6aae5c8..af0c593d551 100644 --- a/secure/lib/libcrypto/man/ASN1_STRING_print_ex.3 +++ b/secure/lib/libcrypto/man/ASN1_STRING_print_ex.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ASN1_STRING_print_ex 3" -.TH ASN1_STRING_print_ex 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ASN1_STRING_print_ex 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ASN1_generate_nconf.3 b/secure/lib/libcrypto/man/ASN1_generate_nconf.3 index 6be122a412d..5eb6838283d 100644 --- a/secure/lib/libcrypto/man/ASN1_generate_nconf.3 +++ b/secure/lib/libcrypto/man/ASN1_generate_nconf.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ASN1_generate_nconf 3" -.TH ASN1_generate_nconf 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ASN1_generate_nconf 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_ctrl.3 b/secure/lib/libcrypto/man/BIO_ctrl.3 index d58eb62ffb2..345721edafd 100644 --- a/secure/lib/libcrypto/man/BIO_ctrl.3 +++ b/secure/lib/libcrypto/man/BIO_ctrl.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_ctrl 3" -.TH BIO_ctrl 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_ctrl 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_f_base64.3 b/secure/lib/libcrypto/man/BIO_f_base64.3 index 936ea902245..2c9b0ca9411 100644 --- a/secure/lib/libcrypto/man/BIO_f_base64.3 +++ b/secure/lib/libcrypto/man/BIO_f_base64.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_f_base64 3" -.TH BIO_f_base64 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_f_base64 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_f_buffer.3 b/secure/lib/libcrypto/man/BIO_f_buffer.3 index ebc0c1636f1..2b99232be7c 100644 --- a/secure/lib/libcrypto/man/BIO_f_buffer.3 +++ b/secure/lib/libcrypto/man/BIO_f_buffer.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_f_buffer 3" -.TH BIO_f_buffer 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_f_buffer 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_f_cipher.3 b/secure/lib/libcrypto/man/BIO_f_cipher.3 index 2a7f8850cb6..d0fedf10134 100644 --- a/secure/lib/libcrypto/man/BIO_f_cipher.3 +++ b/secure/lib/libcrypto/man/BIO_f_cipher.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_f_cipher 3" -.TH BIO_f_cipher 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_f_cipher 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_f_md.3 b/secure/lib/libcrypto/man/BIO_f_md.3 index 0f44132b737..b5f4917c6c4 100644 --- a/secure/lib/libcrypto/man/BIO_f_md.3 +++ b/secure/lib/libcrypto/man/BIO_f_md.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_f_md 3" -.TH BIO_f_md 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_f_md 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_f_null.3 b/secure/lib/libcrypto/man/BIO_f_null.3 index 06f6cc78dfe..789bcd9e690 100644 --- a/secure/lib/libcrypto/man/BIO_f_null.3 +++ b/secure/lib/libcrypto/man/BIO_f_null.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_f_null 3" -.TH BIO_f_null 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_f_null 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_f_ssl.3 b/secure/lib/libcrypto/man/BIO_f_ssl.3 index 8e956309b9d..08f8f5eecd2 100644 --- a/secure/lib/libcrypto/man/BIO_f_ssl.3 +++ b/secure/lib/libcrypto/man/BIO_f_ssl.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_f_ssl 3" -.TH BIO_f_ssl 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_f_ssl 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_find_type.3 b/secure/lib/libcrypto/man/BIO_find_type.3 index ff8eb3aaf6e..c9d3410fa31 100644 --- a/secure/lib/libcrypto/man/BIO_find_type.3 +++ b/secure/lib/libcrypto/man/BIO_find_type.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_find_type 3" -.TH BIO_find_type 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_find_type 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_new.3 b/secure/lib/libcrypto/man/BIO_new.3 index 3457baeb2b7..dbff0789219 100644 --- a/secure/lib/libcrypto/man/BIO_new.3 +++ b/secure/lib/libcrypto/man/BIO_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_new 3" -.TH BIO_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_push.3 b/secure/lib/libcrypto/man/BIO_push.3 index 9d433728c1c..cc7f73f9f10 100644 --- a/secure/lib/libcrypto/man/BIO_push.3 +++ b/secure/lib/libcrypto/man/BIO_push.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_push 3" -.TH BIO_push 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_push 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_read.3 b/secure/lib/libcrypto/man/BIO_read.3 index d2d585a4e43..1b2ada5324d 100644 --- a/secure/lib/libcrypto/man/BIO_read.3 +++ b/secure/lib/libcrypto/man/BIO_read.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_read 3" -.TH BIO_read 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_read 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_accept.3 b/secure/lib/libcrypto/man/BIO_s_accept.3 index 17426b74c40..e3dc63ba30d 100644 --- a/secure/lib/libcrypto/man/BIO_s_accept.3 +++ b/secure/lib/libcrypto/man/BIO_s_accept.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_accept 3" -.TH BIO_s_accept 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_s_accept 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_bio.3 b/secure/lib/libcrypto/man/BIO_s_bio.3 index f4aa8a18c67..e122223fc38 100644 --- a/secure/lib/libcrypto/man/BIO_s_bio.3 +++ b/secure/lib/libcrypto/man/BIO_s_bio.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_bio 3" -.TH BIO_s_bio 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_s_bio 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_connect.3 b/secure/lib/libcrypto/man/BIO_s_connect.3 index e55cd73af6b..824406cca6a 100644 --- a/secure/lib/libcrypto/man/BIO_s_connect.3 +++ b/secure/lib/libcrypto/man/BIO_s_connect.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_connect 3" -.TH BIO_s_connect 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_s_connect 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_fd.3 b/secure/lib/libcrypto/man/BIO_s_fd.3 index e7104291ad0..27a15f0dfca 100644 --- a/secure/lib/libcrypto/man/BIO_s_fd.3 +++ b/secure/lib/libcrypto/man/BIO_s_fd.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_fd 3" -.TH BIO_s_fd 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_s_fd 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_file.3 b/secure/lib/libcrypto/man/BIO_s_file.3 index fc036ddf7b6..1f8f37ec109 100644 --- a/secure/lib/libcrypto/man/BIO_s_file.3 +++ b/secure/lib/libcrypto/man/BIO_s_file.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_file 3" -.TH BIO_s_file 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_s_file 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_mem.3 b/secure/lib/libcrypto/man/BIO_s_mem.3 index c9ec1e3293e..53a9e8372cb 100644 --- a/secure/lib/libcrypto/man/BIO_s_mem.3 +++ b/secure/lib/libcrypto/man/BIO_s_mem.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_mem 3" -.TH BIO_s_mem 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_s_mem 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_null.3 b/secure/lib/libcrypto/man/BIO_s_null.3 index 3f60757223d..33778d5d8ad 100644 --- a/secure/lib/libcrypto/man/BIO_s_null.3 +++ b/secure/lib/libcrypto/man/BIO_s_null.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_null 3" -.TH BIO_s_null 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_s_null 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_s_socket.3 b/secure/lib/libcrypto/man/BIO_s_socket.3 index 1261339e68b..85d4562ba7b 100644 --- a/secure/lib/libcrypto/man/BIO_s_socket.3 +++ b/secure/lib/libcrypto/man/BIO_s_socket.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_s_socket 3" -.TH BIO_s_socket 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_s_socket 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_set_callback.3 b/secure/lib/libcrypto/man/BIO_set_callback.3 index fb856334e16..a47e7c72864 100644 --- a/secure/lib/libcrypto/man/BIO_set_callback.3 +++ b/secure/lib/libcrypto/man/BIO_set_callback.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_set_callback 3" -.TH BIO_set_callback 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_set_callback 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BIO_should_retry.3 b/secure/lib/libcrypto/man/BIO_should_retry.3 index 22f6049ceca..ab3274d84da 100644 --- a/secure/lib/libcrypto/man/BIO_should_retry.3 +++ b/secure/lib/libcrypto/man/BIO_should_retry.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BIO_should_retry 3" -.TH BIO_should_retry 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BIO_should_retry 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_BLINDING_new.3 b/secure/lib/libcrypto/man/BN_BLINDING_new.3 index a5a459130ff..3b33223d2b9 100644 --- a/secure/lib/libcrypto/man/BN_BLINDING_new.3 +++ b/secure/lib/libcrypto/man/BN_BLINDING_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_BLINDING_new 3" -.TH BN_BLINDING_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_BLINDING_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_CTX_new.3 b/secure/lib/libcrypto/man/BN_CTX_new.3 index bae185d9c96..a30920c5048 100644 --- a/secure/lib/libcrypto/man/BN_CTX_new.3 +++ b/secure/lib/libcrypto/man/BN_CTX_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_CTX_new 3" -.TH BN_CTX_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_CTX_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_CTX_start.3 b/secure/lib/libcrypto/man/BN_CTX_start.3 index 4eb96a5ba07..4256c941e5f 100644 --- a/secure/lib/libcrypto/man/BN_CTX_start.3 +++ b/secure/lib/libcrypto/man/BN_CTX_start.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_CTX_start 3" -.TH BN_CTX_start 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_CTX_start 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_add.3 b/secure/lib/libcrypto/man/BN_add.3 index 7cd7273ec13..73b77ab1801 100644 --- a/secure/lib/libcrypto/man/BN_add.3 +++ b/secure/lib/libcrypto/man/BN_add.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_add 3" -.TH BN_add 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_add 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_add_word.3 b/secure/lib/libcrypto/man/BN_add_word.3 index 486f63ef7ed..11639686d6f 100644 --- a/secure/lib/libcrypto/man/BN_add_word.3 +++ b/secure/lib/libcrypto/man/BN_add_word.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_add_word 3" -.TH BN_add_word 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_add_word 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_bn2bin.3 b/secure/lib/libcrypto/man/BN_bn2bin.3 index fee9e6dc1a4..db1e40885b2 100644 --- a/secure/lib/libcrypto/man/BN_bn2bin.3 +++ b/secure/lib/libcrypto/man/BN_bn2bin.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_bn2bin 3" -.TH BN_bn2bin 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_bn2bin 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_cmp.3 b/secure/lib/libcrypto/man/BN_cmp.3 index 484e696cb2a..77a2c674067 100644 --- a/secure/lib/libcrypto/man/BN_cmp.3 +++ b/secure/lib/libcrypto/man/BN_cmp.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_cmp 3" -.TH BN_cmp 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_cmp 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_copy.3 b/secure/lib/libcrypto/man/BN_copy.3 index f9cd1c150e5..02518ec04ce 100644 --- a/secure/lib/libcrypto/man/BN_copy.3 +++ b/secure/lib/libcrypto/man/BN_copy.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_copy 3" -.TH BN_copy 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_copy 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_generate_prime.3 b/secure/lib/libcrypto/man/BN_generate_prime.3 index 18a6d37ed2b..4efe83e18a4 100644 --- a/secure/lib/libcrypto/man/BN_generate_prime.3 +++ b/secure/lib/libcrypto/man/BN_generate_prime.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_generate_prime 3" -.TH BN_generate_prime 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_generate_prime 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_mod_inverse.3 b/secure/lib/libcrypto/man/BN_mod_inverse.3 index 4a2e642e717..229d56515fe 100644 --- a/secure/lib/libcrypto/man/BN_mod_inverse.3 +++ b/secure/lib/libcrypto/man/BN_mod_inverse.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_mod_inverse 3" -.TH BN_mod_inverse 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_mod_inverse 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_mod_mul_montgomery.3 b/secure/lib/libcrypto/man/BN_mod_mul_montgomery.3 index 90b7d5a6867..d8a3a4d3cfb 100644 --- a/secure/lib/libcrypto/man/BN_mod_mul_montgomery.3 +++ b/secure/lib/libcrypto/man/BN_mod_mul_montgomery.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_mod_mul_montgomery 3" -.TH BN_mod_mul_montgomery 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_mod_mul_montgomery 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_mod_mul_reciprocal.3 b/secure/lib/libcrypto/man/BN_mod_mul_reciprocal.3 index d846d34e218..5ca285e9569 100644 --- a/secure/lib/libcrypto/man/BN_mod_mul_reciprocal.3 +++ b/secure/lib/libcrypto/man/BN_mod_mul_reciprocal.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_mod_mul_reciprocal 3" -.TH BN_mod_mul_reciprocal 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_mod_mul_reciprocal 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_new.3 b/secure/lib/libcrypto/man/BN_new.3 index a6838d7c737..8e829384231 100644 --- a/secure/lib/libcrypto/man/BN_new.3 +++ b/secure/lib/libcrypto/man/BN_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_new 3" -.TH BN_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_num_bytes.3 b/secure/lib/libcrypto/man/BN_num_bytes.3 index e820563b0ec..2c40a40b688 100644 --- a/secure/lib/libcrypto/man/BN_num_bytes.3 +++ b/secure/lib/libcrypto/man/BN_num_bytes.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_num_bytes 3" -.TH BN_num_bytes 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_num_bytes 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_rand.3 b/secure/lib/libcrypto/man/BN_rand.3 index 72031824aee..70fb7ec0db2 100644 --- a/secure/lib/libcrypto/man/BN_rand.3 +++ b/secure/lib/libcrypto/man/BN_rand.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_rand 3" -.TH BN_rand 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_rand 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_set_bit.3 b/secure/lib/libcrypto/man/BN_set_bit.3 index a68db1f9789..ff0cb381e10 100644 --- a/secure/lib/libcrypto/man/BN_set_bit.3 +++ b/secure/lib/libcrypto/man/BN_set_bit.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_set_bit 3" -.TH BN_set_bit 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_set_bit 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_swap.3 b/secure/lib/libcrypto/man/BN_swap.3 index eac81134d39..52ee55be1f3 100644 --- a/secure/lib/libcrypto/man/BN_swap.3 +++ b/secure/lib/libcrypto/man/BN_swap.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_swap 3" -.TH BN_swap 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_swap 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/BN_zero.3 b/secure/lib/libcrypto/man/BN_zero.3 index d07fc2f829b..864335098a4 100644 --- a/secure/lib/libcrypto/man/BN_zero.3 +++ b/secure/lib/libcrypto/man/BN_zero.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BN_zero 3" -.TH BN_zero 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH BN_zero 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/CONF_modules_free.3 b/secure/lib/libcrypto/man/CONF_modules_free.3 index 9fd6d03e6ed..eabe9e866be 100644 --- a/secure/lib/libcrypto/man/CONF_modules_free.3 +++ b/secure/lib/libcrypto/man/CONF_modules_free.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CONF_modules_free 3" -.TH CONF_modules_free 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH CONF_modules_free 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/CONF_modules_load_file.3 b/secure/lib/libcrypto/man/CONF_modules_load_file.3 index b7e6064210b..e2ef88998e4 100644 --- a/secure/lib/libcrypto/man/CONF_modules_load_file.3 +++ b/secure/lib/libcrypto/man/CONF_modules_load_file.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CONF_modules_load_file 3" -.TH CONF_modules_load_file 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH CONF_modules_load_file 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/CRYPTO_set_ex_data.3 b/secure/lib/libcrypto/man/CRYPTO_set_ex_data.3 index 955b949a2fb..8f122d5f29a 100644 --- a/secure/lib/libcrypto/man/CRYPTO_set_ex_data.3 +++ b/secure/lib/libcrypto/man/CRYPTO_set_ex_data.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CRYPTO_set_ex_data 3" -.TH CRYPTO_set_ex_data 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH CRYPTO_set_ex_data 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DH_generate_key.3 b/secure/lib/libcrypto/man/DH_generate_key.3 index cff53009d11..799e1eb24eb 100644 --- a/secure/lib/libcrypto/man/DH_generate_key.3 +++ b/secure/lib/libcrypto/man/DH_generate_key.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DH_generate_key 3" -.TH DH_generate_key 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DH_generate_key 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DH_generate_parameters.3 b/secure/lib/libcrypto/man/DH_generate_parameters.3 index 374c05f7e90..49fc85275a8 100644 --- a/secure/lib/libcrypto/man/DH_generate_parameters.3 +++ b/secure/lib/libcrypto/man/DH_generate_parameters.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DH_generate_parameters 3" -.TH DH_generate_parameters 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DH_generate_parameters 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DH_get_ex_new_index.3 b/secure/lib/libcrypto/man/DH_get_ex_new_index.3 index e74c6ce5c6d..cee258720a9 100644 --- a/secure/lib/libcrypto/man/DH_get_ex_new_index.3 +++ b/secure/lib/libcrypto/man/DH_get_ex_new_index.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DH_get_ex_new_index 3" -.TH DH_get_ex_new_index 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DH_get_ex_new_index 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DH_new.3 b/secure/lib/libcrypto/man/DH_new.3 index e1697136e8a..0ef235caf93 100644 --- a/secure/lib/libcrypto/man/DH_new.3 +++ b/secure/lib/libcrypto/man/DH_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DH_new 3" -.TH DH_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DH_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DH_set_method.3 b/secure/lib/libcrypto/man/DH_set_method.3 index c5bf32ccc5d..981d996585e 100644 --- a/secure/lib/libcrypto/man/DH_set_method.3 +++ b/secure/lib/libcrypto/man/DH_set_method.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DH_set_method 3" -.TH DH_set_method 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DH_set_method 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DH_size.3 b/secure/lib/libcrypto/man/DH_size.3 index 5f8c60e62e7..fbfb1d6419e 100644 --- a/secure/lib/libcrypto/man/DH_size.3 +++ b/secure/lib/libcrypto/man/DH_size.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DH_size 3" -.TH DH_size 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DH_size 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_SIG_new.3 b/secure/lib/libcrypto/man/DSA_SIG_new.3 index 4f489126450..7f329047c0d 100644 --- a/secure/lib/libcrypto/man/DSA_SIG_new.3 +++ b/secure/lib/libcrypto/man/DSA_SIG_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_SIG_new 3" -.TH DSA_SIG_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DSA_SIG_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_do_sign.3 b/secure/lib/libcrypto/man/DSA_do_sign.3 index f6da96b3190..f6ee9fb894c 100644 --- a/secure/lib/libcrypto/man/DSA_do_sign.3 +++ b/secure/lib/libcrypto/man/DSA_do_sign.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_do_sign 3" -.TH DSA_do_sign 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DSA_do_sign 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_dup_DH.3 b/secure/lib/libcrypto/man/DSA_dup_DH.3 index b13e50eec9f..c329d452b65 100644 --- a/secure/lib/libcrypto/man/DSA_dup_DH.3 +++ b/secure/lib/libcrypto/man/DSA_dup_DH.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_dup_DH 3" -.TH DSA_dup_DH 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DSA_dup_DH 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_generate_key.3 b/secure/lib/libcrypto/man/DSA_generate_key.3 index 2777dc84c73..a2a73ddfc2d 100644 --- a/secure/lib/libcrypto/man/DSA_generate_key.3 +++ b/secure/lib/libcrypto/man/DSA_generate_key.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_generate_key 3" -.TH DSA_generate_key 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DSA_generate_key 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_generate_parameters.3 b/secure/lib/libcrypto/man/DSA_generate_parameters.3 index e5fcb267b7b..1482b545f85 100644 --- a/secure/lib/libcrypto/man/DSA_generate_parameters.3 +++ b/secure/lib/libcrypto/man/DSA_generate_parameters.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_generate_parameters 3" -.TH DSA_generate_parameters 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DSA_generate_parameters 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_get_ex_new_index.3 b/secure/lib/libcrypto/man/DSA_get_ex_new_index.3 index fd418ddb416..30c2a2860bb 100644 --- a/secure/lib/libcrypto/man/DSA_get_ex_new_index.3 +++ b/secure/lib/libcrypto/man/DSA_get_ex_new_index.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_get_ex_new_index 3" -.TH DSA_get_ex_new_index 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DSA_get_ex_new_index 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_new.3 b/secure/lib/libcrypto/man/DSA_new.3 index b53c2a474e4..8d9d0edfe93 100644 --- a/secure/lib/libcrypto/man/DSA_new.3 +++ b/secure/lib/libcrypto/man/DSA_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_new 3" -.TH DSA_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DSA_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_set_method.3 b/secure/lib/libcrypto/man/DSA_set_method.3 index 9094acd63a6..3be5145079b 100644 --- a/secure/lib/libcrypto/man/DSA_set_method.3 +++ b/secure/lib/libcrypto/man/DSA_set_method.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_set_method 3" -.TH DSA_set_method 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DSA_set_method 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_sign.3 b/secure/lib/libcrypto/man/DSA_sign.3 index 5931f9c15ed..496ff0d9a57 100644 --- a/secure/lib/libcrypto/man/DSA_sign.3 +++ b/secure/lib/libcrypto/man/DSA_sign.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_sign 3" -.TH DSA_sign 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DSA_sign 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/DSA_size.3 b/secure/lib/libcrypto/man/DSA_size.3 index 1aa39625808..0f270c2848f 100644 --- a/secure/lib/libcrypto/man/DSA_size.3 +++ b/secure/lib/libcrypto/man/DSA_size.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA_size 3" -.TH DSA_size 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DSA_size 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_GET_LIB.3 b/secure/lib/libcrypto/man/ERR_GET_LIB.3 index 694b0e1c943..65c40684648 100644 --- a/secure/lib/libcrypto/man/ERR_GET_LIB.3 +++ b/secure/lib/libcrypto/man/ERR_GET_LIB.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_GET_LIB 3" -.TH ERR_GET_LIB 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ERR_GET_LIB 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_clear_error.3 b/secure/lib/libcrypto/man/ERR_clear_error.3 index 4b93a2d9eb7..e922f594c6c 100644 --- a/secure/lib/libcrypto/man/ERR_clear_error.3 +++ b/secure/lib/libcrypto/man/ERR_clear_error.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_clear_error 3" -.TH ERR_clear_error 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ERR_clear_error 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_error_string.3 b/secure/lib/libcrypto/man/ERR_error_string.3 index bf66a06dd15..e72af5c3ee0 100644 --- a/secure/lib/libcrypto/man/ERR_error_string.3 +++ b/secure/lib/libcrypto/man/ERR_error_string.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_error_string 3" -.TH ERR_error_string 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ERR_error_string 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_get_error.3 b/secure/lib/libcrypto/man/ERR_get_error.3 index b59ee3ffe55..6f6cbac9f79 100644 --- a/secure/lib/libcrypto/man/ERR_get_error.3 +++ b/secure/lib/libcrypto/man/ERR_get_error.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_get_error 3" -.TH ERR_get_error 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ERR_get_error 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_load_crypto_strings.3 b/secure/lib/libcrypto/man/ERR_load_crypto_strings.3 index 089c5aed613..50e87ec6f40 100644 --- a/secure/lib/libcrypto/man/ERR_load_crypto_strings.3 +++ b/secure/lib/libcrypto/man/ERR_load_crypto_strings.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_load_crypto_strings 3" -.TH ERR_load_crypto_strings 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ERR_load_crypto_strings 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_load_strings.3 b/secure/lib/libcrypto/man/ERR_load_strings.3 index 47f534b7002..9a01722e33d 100644 --- a/secure/lib/libcrypto/man/ERR_load_strings.3 +++ b/secure/lib/libcrypto/man/ERR_load_strings.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_load_strings 3" -.TH ERR_load_strings 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ERR_load_strings 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_print_errors.3 b/secure/lib/libcrypto/man/ERR_print_errors.3 index fa7516a0ee8..2ce4accaeee 100644 --- a/secure/lib/libcrypto/man/ERR_print_errors.3 +++ b/secure/lib/libcrypto/man/ERR_print_errors.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_print_errors 3" -.TH ERR_print_errors 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ERR_print_errors 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_put_error.3 b/secure/lib/libcrypto/man/ERR_put_error.3 index 9c403c91062..df071589a2b 100644 --- a/secure/lib/libcrypto/man/ERR_put_error.3 +++ b/secure/lib/libcrypto/man/ERR_put_error.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_put_error 3" -.TH ERR_put_error 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ERR_put_error 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_remove_state.3 b/secure/lib/libcrypto/man/ERR_remove_state.3 index 55e717d312f..1e599569676 100644 --- a/secure/lib/libcrypto/man/ERR_remove_state.3 +++ b/secure/lib/libcrypto/man/ERR_remove_state.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_remove_state 3" -.TH ERR_remove_state 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ERR_remove_state 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ERR_set_mark.3 b/secure/lib/libcrypto/man/ERR_set_mark.3 index 72934b88e21..d9e10aa11da 100644 --- a/secure/lib/libcrypto/man/ERR_set_mark.3 +++ b/secure/lib/libcrypto/man/ERR_set_mark.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERR_set_mark 3" -.TH ERR_set_mark 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ERR_set_mark 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_BytesToKey.3 b/secure/lib/libcrypto/man/EVP_BytesToKey.3 index 9473bc3a39b..831bcd9fc87 100644 --- a/secure/lib/libcrypto/man/EVP_BytesToKey.3 +++ b/secure/lib/libcrypto/man/EVP_BytesToKey.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_BytesToKey 3" -.TH EVP_BytesToKey 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH EVP_BytesToKey 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_DigestInit.3 b/secure/lib/libcrypto/man/EVP_DigestInit.3 index e7c79a46502..f7d5ea78f1e 100644 --- a/secure/lib/libcrypto/man/EVP_DigestInit.3 +++ b/secure/lib/libcrypto/man/EVP_DigestInit.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_DigestInit 3" -.TH EVP_DigestInit 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH EVP_DigestInit 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_EncryptInit.3 b/secure/lib/libcrypto/man/EVP_EncryptInit.3 index 15e656ab632..56c8c2350f5 100644 --- a/secure/lib/libcrypto/man/EVP_EncryptInit.3 +++ b/secure/lib/libcrypto/man/EVP_EncryptInit.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_EncryptInit 3" -.TH EVP_EncryptInit 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH EVP_EncryptInit 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_OpenInit.3 b/secure/lib/libcrypto/man/EVP_OpenInit.3 index 0ba61eca8f1..b909a2dea45 100644 --- a/secure/lib/libcrypto/man/EVP_OpenInit.3 +++ b/secure/lib/libcrypto/man/EVP_OpenInit.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_OpenInit 3" -.TH EVP_OpenInit 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH EVP_OpenInit 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_PKEY_new.3 b/secure/lib/libcrypto/man/EVP_PKEY_new.3 index e8350f4228e..7828f4ed980 100644 --- a/secure/lib/libcrypto/man/EVP_PKEY_new.3 +++ b/secure/lib/libcrypto/man/EVP_PKEY_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_PKEY_new 3" -.TH EVP_PKEY_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH EVP_PKEY_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 b/secure/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 index f9d31f2eec0..f072b5b3ef7 100644 --- a/secure/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 +++ b/secure/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_PKEY_set1_RSA 3" -.TH EVP_PKEY_set1_RSA 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH EVP_PKEY_set1_RSA 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_SealInit.3 b/secure/lib/libcrypto/man/EVP_SealInit.3 index 1bba814c044..23012120317 100644 --- a/secure/lib/libcrypto/man/EVP_SealInit.3 +++ b/secure/lib/libcrypto/man/EVP_SealInit.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_SealInit 3" -.TH EVP_SealInit 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH EVP_SealInit 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_SignInit.3 b/secure/lib/libcrypto/man/EVP_SignInit.3 index 49ad5501f50..97044c41998 100644 --- a/secure/lib/libcrypto/man/EVP_SignInit.3 +++ b/secure/lib/libcrypto/man/EVP_SignInit.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_SignInit 3" -.TH EVP_SignInit 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH EVP_SignInit 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/EVP_VerifyInit.3 b/secure/lib/libcrypto/man/EVP_VerifyInit.3 index a62203862e5..3b0160c3779 100644 --- a/secure/lib/libcrypto/man/EVP_VerifyInit.3 +++ b/secure/lib/libcrypto/man/EVP_VerifyInit.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EVP_VerifyInit 3" -.TH EVP_VerifyInit 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH EVP_VerifyInit 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OBJ_nid2obj.3 b/secure/lib/libcrypto/man/OBJ_nid2obj.3 index cfc733b40bf..ed23da2a60d 100644 --- a/secure/lib/libcrypto/man/OBJ_nid2obj.3 +++ b/secure/lib/libcrypto/man/OBJ_nid2obj.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OBJ_nid2obj 3" -.TH OBJ_nid2obj 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH OBJ_nid2obj 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OPENSSL_Applink.3 b/secure/lib/libcrypto/man/OPENSSL_Applink.3 index 416d4c3f8b0..6ae7e31a359 100644 --- a/secure/lib/libcrypto/man/OPENSSL_Applink.3 +++ b/secure/lib/libcrypto/man/OPENSSL_Applink.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OPENSSL_Applink 3" -.TH OPENSSL_Applink 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH OPENSSL_Applink 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OPENSSL_VERSION_NUMBER.3 b/secure/lib/libcrypto/man/OPENSSL_VERSION_NUMBER.3 index a8292607c2a..bbf0a5f0234 100644 --- a/secure/lib/libcrypto/man/OPENSSL_VERSION_NUMBER.3 +++ b/secure/lib/libcrypto/man/OPENSSL_VERSION_NUMBER.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OPENSSL_VERSION_NUMBER 3" -.TH OPENSSL_VERSION_NUMBER 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH OPENSSL_VERSION_NUMBER 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OPENSSL_config.3 b/secure/lib/libcrypto/man/OPENSSL_config.3 index 87ce97b07a8..47fc966b3a1 100644 --- a/secure/lib/libcrypto/man/OPENSSL_config.3 +++ b/secure/lib/libcrypto/man/OPENSSL_config.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OPENSSL_config 3" -.TH OPENSSL_config 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH OPENSSL_config 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OPENSSL_ia32cap.3 b/secure/lib/libcrypto/man/OPENSSL_ia32cap.3 index 0114c90f9b6..c8bacb984d0 100644 --- a/secure/lib/libcrypto/man/OPENSSL_ia32cap.3 +++ b/secure/lib/libcrypto/man/OPENSSL_ia32cap.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OPENSSL_ia32cap 3" -.TH OPENSSL_ia32cap 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH OPENSSL_ia32cap 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OPENSSL_load_builtin_modules.3 b/secure/lib/libcrypto/man/OPENSSL_load_builtin_modules.3 index 2cacde26aa2..200a8e68d84 100644 --- a/secure/lib/libcrypto/man/OPENSSL_load_builtin_modules.3 +++ b/secure/lib/libcrypto/man/OPENSSL_load_builtin_modules.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OPENSSL_load_builtin_modules 3" -.TH OPENSSL_load_builtin_modules 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH OPENSSL_load_builtin_modules 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/OpenSSL_add_all_algorithms.3 b/secure/lib/libcrypto/man/OpenSSL_add_all_algorithms.3 index 399d2dd6596..55333850976 100644 --- a/secure/lib/libcrypto/man/OpenSSL_add_all_algorithms.3 +++ b/secure/lib/libcrypto/man/OpenSSL_add_all_algorithms.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OpenSSL_add_all_algorithms 3" -.TH OpenSSL_add_all_algorithms 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH OpenSSL_add_all_algorithms 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/PKCS12_create.3 b/secure/lib/libcrypto/man/PKCS12_create.3 index 81544773b3f..b9b45b3e847 100644 --- a/secure/lib/libcrypto/man/PKCS12_create.3 +++ b/secure/lib/libcrypto/man/PKCS12_create.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS12_create 3" -.TH PKCS12_create 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH PKCS12_create 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/PKCS12_parse.3 b/secure/lib/libcrypto/man/PKCS12_parse.3 index 44df00162c9..346bb7e1431 100644 --- a/secure/lib/libcrypto/man/PKCS12_parse.3 +++ b/secure/lib/libcrypto/man/PKCS12_parse.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS12_parse 3" -.TH PKCS12_parse 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH PKCS12_parse 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/PKCS7_decrypt.3 b/secure/lib/libcrypto/man/PKCS7_decrypt.3 index 5e81459120d..51ec943a568 100644 --- a/secure/lib/libcrypto/man/PKCS7_decrypt.3 +++ b/secure/lib/libcrypto/man/PKCS7_decrypt.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS7_decrypt 3" -.TH PKCS7_decrypt 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH PKCS7_decrypt 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/PKCS7_encrypt.3 b/secure/lib/libcrypto/man/PKCS7_encrypt.3 index 95079309926..1ded608ac8e 100644 --- a/secure/lib/libcrypto/man/PKCS7_encrypt.3 +++ b/secure/lib/libcrypto/man/PKCS7_encrypt.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS7_encrypt 3" -.TH PKCS7_encrypt 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH PKCS7_encrypt 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/PKCS7_sign.3 b/secure/lib/libcrypto/man/PKCS7_sign.3 index 89a2c17fe0d..4a74d959089 100644 --- a/secure/lib/libcrypto/man/PKCS7_sign.3 +++ b/secure/lib/libcrypto/man/PKCS7_sign.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS7_sign 3" -.TH PKCS7_sign 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH PKCS7_sign 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/PKCS7_verify.3 b/secure/lib/libcrypto/man/PKCS7_verify.3 index 397725f74f8..f8825e9cf4e 100644 --- a/secure/lib/libcrypto/man/PKCS7_verify.3 +++ b/secure/lib/libcrypto/man/PKCS7_verify.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS7_verify 3" -.TH PKCS7_verify 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH PKCS7_verify 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RAND_add.3 b/secure/lib/libcrypto/man/RAND_add.3 index 23f4d362265..0cfc3e9464b 100644 --- a/secure/lib/libcrypto/man/RAND_add.3 +++ b/secure/lib/libcrypto/man/RAND_add.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND_add 3" -.TH RAND_add 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RAND_add 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RAND_bytes.3 b/secure/lib/libcrypto/man/RAND_bytes.3 index 1da3eb68685..94de1d059cb 100644 --- a/secure/lib/libcrypto/man/RAND_bytes.3 +++ b/secure/lib/libcrypto/man/RAND_bytes.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND_bytes 3" -.TH RAND_bytes 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RAND_bytes 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RAND_cleanup.3 b/secure/lib/libcrypto/man/RAND_cleanup.3 index 13f245f55b8..a2478fcf538 100644 --- a/secure/lib/libcrypto/man/RAND_cleanup.3 +++ b/secure/lib/libcrypto/man/RAND_cleanup.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND_cleanup 3" -.TH RAND_cleanup 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RAND_cleanup 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RAND_egd.3 b/secure/lib/libcrypto/man/RAND_egd.3 index 58784a9d727..810ff25bdb1 100644 --- a/secure/lib/libcrypto/man/RAND_egd.3 +++ b/secure/lib/libcrypto/man/RAND_egd.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND_egd 3" -.TH RAND_egd 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RAND_egd 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RAND_load_file.3 b/secure/lib/libcrypto/man/RAND_load_file.3 index b0edd2ba76c..7f070d85734 100644 --- a/secure/lib/libcrypto/man/RAND_load_file.3 +++ b/secure/lib/libcrypto/man/RAND_load_file.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND_load_file 3" -.TH RAND_load_file 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RAND_load_file 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RAND_set_rand_method.3 b/secure/lib/libcrypto/man/RAND_set_rand_method.3 index 722925da2d3..28f368cd085 100644 --- a/secure/lib/libcrypto/man/RAND_set_rand_method.3 +++ b/secure/lib/libcrypto/man/RAND_set_rand_method.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND_set_rand_method 3" -.TH RAND_set_rand_method 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RAND_set_rand_method 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_blinding_on.3 b/secure/lib/libcrypto/man/RSA_blinding_on.3 index 61aabbf03a1..97a6fa4c8db 100644 --- a/secure/lib/libcrypto/man/RSA_blinding_on.3 +++ b/secure/lib/libcrypto/man/RSA_blinding_on.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_blinding_on 3" -.TH RSA_blinding_on 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_blinding_on 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_check_key.3 b/secure/lib/libcrypto/man/RSA_check_key.3 index 4fba01dd891..a43391ec3c6 100644 --- a/secure/lib/libcrypto/man/RSA_check_key.3 +++ b/secure/lib/libcrypto/man/RSA_check_key.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_check_key 3" -.TH RSA_check_key 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_check_key 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_generate_key.3 b/secure/lib/libcrypto/man/RSA_generate_key.3 index d71fe32ef7e..1ceb5373dca 100644 --- a/secure/lib/libcrypto/man/RSA_generate_key.3 +++ b/secure/lib/libcrypto/man/RSA_generate_key.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_generate_key 3" -.TH RSA_generate_key 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_generate_key 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_get_ex_new_index.3 b/secure/lib/libcrypto/man/RSA_get_ex_new_index.3 index f0ea95a8264..3496e8ed375 100644 --- a/secure/lib/libcrypto/man/RSA_get_ex_new_index.3 +++ b/secure/lib/libcrypto/man/RSA_get_ex_new_index.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_get_ex_new_index 3" -.TH RSA_get_ex_new_index 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_get_ex_new_index 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_new.3 b/secure/lib/libcrypto/man/RSA_new.3 index 331128e57c2..5b3a0c65e0f 100644 --- a/secure/lib/libcrypto/man/RSA_new.3 +++ b/secure/lib/libcrypto/man/RSA_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_new 3" -.TH RSA_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_padding_add_PKCS1_type_1.3 b/secure/lib/libcrypto/man/RSA_padding_add_PKCS1_type_1.3 index 86fc5dd4618..26c558af38f 100644 --- a/secure/lib/libcrypto/man/RSA_padding_add_PKCS1_type_1.3 +++ b/secure/lib/libcrypto/man/RSA_padding_add_PKCS1_type_1.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_padding_add_PKCS1_type_1 3" -.TH RSA_padding_add_PKCS1_type_1 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_padding_add_PKCS1_type_1 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_print.3 b/secure/lib/libcrypto/man/RSA_print.3 index 5337147599c..df154d09180 100644 --- a/secure/lib/libcrypto/man/RSA_print.3 +++ b/secure/lib/libcrypto/man/RSA_print.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_print 3" -.TH RSA_print 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_print 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_private_encrypt.3 b/secure/lib/libcrypto/man/RSA_private_encrypt.3 index 94471c6fb29..520476ae433 100644 --- a/secure/lib/libcrypto/man/RSA_private_encrypt.3 +++ b/secure/lib/libcrypto/man/RSA_private_encrypt.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_private_encrypt 3" -.TH RSA_private_encrypt 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_private_encrypt 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_public_encrypt.3 b/secure/lib/libcrypto/man/RSA_public_encrypt.3 index 5edece848a5..b0c617c9429 100644 --- a/secure/lib/libcrypto/man/RSA_public_encrypt.3 +++ b/secure/lib/libcrypto/man/RSA_public_encrypt.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_public_encrypt 3" -.TH RSA_public_encrypt 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_public_encrypt 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_set_method.3 b/secure/lib/libcrypto/man/RSA_set_method.3 index e74674643ed..a3e6f763374 100644 --- a/secure/lib/libcrypto/man/RSA_set_method.3 +++ b/secure/lib/libcrypto/man/RSA_set_method.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_set_method 3" -.TH RSA_set_method 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_set_method 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_sign.3 b/secure/lib/libcrypto/man/RSA_sign.3 index fc7f12a5ed6..254b925869c 100644 --- a/secure/lib/libcrypto/man/RSA_sign.3 +++ b/secure/lib/libcrypto/man/RSA_sign.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_sign 3" -.TH RSA_sign 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_sign 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_sign_ASN1_OCTET_STRING.3 b/secure/lib/libcrypto/man/RSA_sign_ASN1_OCTET_STRING.3 index feb01c7ce94..50b2f888c09 100644 --- a/secure/lib/libcrypto/man/RSA_sign_ASN1_OCTET_STRING.3 +++ b/secure/lib/libcrypto/man/RSA_sign_ASN1_OCTET_STRING.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_sign_ASN1_OCTET_STRING 3" -.TH RSA_sign_ASN1_OCTET_STRING 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_sign_ASN1_OCTET_STRING 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/RSA_size.3 b/secure/lib/libcrypto/man/RSA_size.3 index ab5fcdb0fa1..1a911cccbfb 100644 --- a/secure/lib/libcrypto/man/RSA_size.3 +++ b/secure/lib/libcrypto/man/RSA_size.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA_size 3" -.TH RSA_size 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA_size 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/SMIME_read_PKCS7.3 b/secure/lib/libcrypto/man/SMIME_read_PKCS7.3 index 530f16eb174..dded93455a8 100644 --- a/secure/lib/libcrypto/man/SMIME_read_PKCS7.3 +++ b/secure/lib/libcrypto/man/SMIME_read_PKCS7.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SMIME_read_PKCS7 3" -.TH SMIME_read_PKCS7 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SMIME_read_PKCS7 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/SMIME_write_PKCS7.3 b/secure/lib/libcrypto/man/SMIME_write_PKCS7.3 index 9f29d92b36c..86935e387d1 100644 --- a/secure/lib/libcrypto/man/SMIME_write_PKCS7.3 +++ b/secure/lib/libcrypto/man/SMIME_write_PKCS7.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SMIME_write_PKCS7 3" -.TH SMIME_write_PKCS7 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SMIME_write_PKCS7 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/X509_NAME_ENTRY_get_object.3 b/secure/lib/libcrypto/man/X509_NAME_ENTRY_get_object.3 index 0aaaa105c1f..91ecb4de26a 100644 --- a/secure/lib/libcrypto/man/X509_NAME_ENTRY_get_object.3 +++ b/secure/lib/libcrypto/man/X509_NAME_ENTRY_get_object.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509_NAME_ENTRY_get_object 3" -.TH X509_NAME_ENTRY_get_object 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH X509_NAME_ENTRY_get_object 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/X509_NAME_add_entry_by_txt.3 b/secure/lib/libcrypto/man/X509_NAME_add_entry_by_txt.3 index db94069420c..c355a6ff89b 100644 --- a/secure/lib/libcrypto/man/X509_NAME_add_entry_by_txt.3 +++ b/secure/lib/libcrypto/man/X509_NAME_add_entry_by_txt.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509_NAME_add_entry_by_txt 3" -.TH X509_NAME_add_entry_by_txt 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH X509_NAME_add_entry_by_txt 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/X509_NAME_get_index_by_NID.3 b/secure/lib/libcrypto/man/X509_NAME_get_index_by_NID.3 index 2e324765d28..ff673b56628 100644 --- a/secure/lib/libcrypto/man/X509_NAME_get_index_by_NID.3 +++ b/secure/lib/libcrypto/man/X509_NAME_get_index_by_NID.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509_NAME_get_index_by_NID 3" -.TH X509_NAME_get_index_by_NID 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH X509_NAME_get_index_by_NID 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/X509_NAME_print_ex.3 b/secure/lib/libcrypto/man/X509_NAME_print_ex.3 index 0e4f2159c38..99f0c51da77 100644 --- a/secure/lib/libcrypto/man/X509_NAME_print_ex.3 +++ b/secure/lib/libcrypto/man/X509_NAME_print_ex.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509_NAME_print_ex 3" -.TH X509_NAME_print_ex 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH X509_NAME_print_ex 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/X509_new.3 b/secure/lib/libcrypto/man/X509_new.3 index 72cf6f90fa5..0c115e54039 100644 --- a/secure/lib/libcrypto/man/X509_new.3 +++ b/secure/lib/libcrypto/man/X509_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509_new 3" -.TH X509_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH X509_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/bio.3 b/secure/lib/libcrypto/man/bio.3 index a43fa95601f..6bbc5653c12 100644 --- a/secure/lib/libcrypto/man/bio.3 +++ b/secure/lib/libcrypto/man/bio.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "bio 3" -.TH bio 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH bio 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/blowfish.3 b/secure/lib/libcrypto/man/blowfish.3 index 85526473bc5..3f194b98b53 100644 --- a/secure/lib/libcrypto/man/blowfish.3 +++ b/secure/lib/libcrypto/man/blowfish.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "blowfish 3" -.TH blowfish 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH blowfish 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/bn.3 b/secure/lib/libcrypto/man/bn.3 index a22f61f2120..8d06742ea68 100644 --- a/secure/lib/libcrypto/man/bn.3 +++ b/secure/lib/libcrypto/man/bn.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "bn 3" -.TH bn 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH bn 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/bn_internal.3 b/secure/lib/libcrypto/man/bn_internal.3 index 9646e4aa547..39bc4a4ac26 100644 --- a/secure/lib/libcrypto/man/bn_internal.3 +++ b/secure/lib/libcrypto/man/bn_internal.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "bn_internal 3" -.TH bn_internal 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH bn_internal 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/buffer.3 b/secure/lib/libcrypto/man/buffer.3 index c468cc34056..45b94d574d7 100644 --- a/secure/lib/libcrypto/man/buffer.3 +++ b/secure/lib/libcrypto/man/buffer.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "buffer 3" -.TH buffer 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH buffer 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/crypto.3 b/secure/lib/libcrypto/man/crypto.3 index 8175f2fad3f..636b33f5b15 100644 --- a/secure/lib/libcrypto/man/crypto.3 +++ b/secure/lib/libcrypto/man/crypto.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "crypto 3" -.TH crypto 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH crypto 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_ASN1_OBJECT.3 b/secure/lib/libcrypto/man/d2i_ASN1_OBJECT.3 index 68de02b89d0..81f9da6e3db 100644 --- a/secure/lib/libcrypto/man/d2i_ASN1_OBJECT.3 +++ b/secure/lib/libcrypto/man/d2i_ASN1_OBJECT.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_ASN1_OBJECT 3" -.TH d2i_ASN1_OBJECT 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH d2i_ASN1_OBJECT 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_DHparams.3 b/secure/lib/libcrypto/man/d2i_DHparams.3 index 0d8d30fa497..88afc09ceab 100644 --- a/secure/lib/libcrypto/man/d2i_DHparams.3 +++ b/secure/lib/libcrypto/man/d2i_DHparams.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_DHparams 3" -.TH d2i_DHparams 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH d2i_DHparams 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_DSAPublicKey.3 b/secure/lib/libcrypto/man/d2i_DSAPublicKey.3 index 69e8d7e4d6a..fab2524f55c 100644 --- a/secure/lib/libcrypto/man/d2i_DSAPublicKey.3 +++ b/secure/lib/libcrypto/man/d2i_DSAPublicKey.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_DSAPublicKey 3" -.TH d2i_DSAPublicKey 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH d2i_DSAPublicKey 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_PKCS8PrivateKey.3 b/secure/lib/libcrypto/man/d2i_PKCS8PrivateKey.3 index e658a3ec1d9..9abe4bc92a0 100644 --- a/secure/lib/libcrypto/man/d2i_PKCS8PrivateKey.3 +++ b/secure/lib/libcrypto/man/d2i_PKCS8PrivateKey.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_PKCS8PrivateKey 3" -.TH d2i_PKCS8PrivateKey 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH d2i_PKCS8PrivateKey 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_RSAPublicKey.3 b/secure/lib/libcrypto/man/d2i_RSAPublicKey.3 index 64f441443ff..8a79866cd7e 100644 --- a/secure/lib/libcrypto/man/d2i_RSAPublicKey.3 +++ b/secure/lib/libcrypto/man/d2i_RSAPublicKey.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_RSAPublicKey 3" -.TH d2i_RSAPublicKey 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH d2i_RSAPublicKey 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_X509.3 b/secure/lib/libcrypto/man/d2i_X509.3 index f0580f14b46..52eb312ea0b 100644 --- a/secure/lib/libcrypto/man/d2i_X509.3 +++ b/secure/lib/libcrypto/man/d2i_X509.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_X509 3" -.TH d2i_X509 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH d2i_X509 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_X509_ALGOR.3 b/secure/lib/libcrypto/man/d2i_X509_ALGOR.3 index 4c4e29824d5..bd70e21cd31 100644 --- a/secure/lib/libcrypto/man/d2i_X509_ALGOR.3 +++ b/secure/lib/libcrypto/man/d2i_X509_ALGOR.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_X509_ALGOR 3" -.TH d2i_X509_ALGOR 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH d2i_X509_ALGOR 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_X509_CRL.3 b/secure/lib/libcrypto/man/d2i_X509_CRL.3 index 8b4de84313d..1c9e66f340f 100644 --- a/secure/lib/libcrypto/man/d2i_X509_CRL.3 +++ b/secure/lib/libcrypto/man/d2i_X509_CRL.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_X509_CRL 3" -.TH d2i_X509_CRL 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH d2i_X509_CRL 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_X509_NAME.3 b/secure/lib/libcrypto/man/d2i_X509_NAME.3 index 074c1444bed..ee6877179cc 100644 --- a/secure/lib/libcrypto/man/d2i_X509_NAME.3 +++ b/secure/lib/libcrypto/man/d2i_X509_NAME.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_X509_NAME 3" -.TH d2i_X509_NAME 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH d2i_X509_NAME 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_X509_REQ.3 b/secure/lib/libcrypto/man/d2i_X509_REQ.3 index 8cffc57c726..8a67d3ce0e9 100644 --- a/secure/lib/libcrypto/man/d2i_X509_REQ.3 +++ b/secure/lib/libcrypto/man/d2i_X509_REQ.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_X509_REQ 3" -.TH d2i_X509_REQ 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH d2i_X509_REQ 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/d2i_X509_SIG.3 b/secure/lib/libcrypto/man/d2i_X509_SIG.3 index f7e20b51992..5aa80caad40 100644 --- a/secure/lib/libcrypto/man/d2i_X509_SIG.3 +++ b/secure/lib/libcrypto/man/d2i_X509_SIG.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_X509_SIG 3" -.TH d2i_X509_SIG 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH d2i_X509_SIG 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/des.3 b/secure/lib/libcrypto/man/des.3 index 510fd182a04..bb4f9ade15a 100644 --- a/secure/lib/libcrypto/man/des.3 +++ b/secure/lib/libcrypto/man/des.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "des 3" -.TH des 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH des 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/dh.3 b/secure/lib/libcrypto/man/dh.3 index 19bc67678ed..4271a3ccb33 100644 --- a/secure/lib/libcrypto/man/dh.3 +++ b/secure/lib/libcrypto/man/dh.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "dh 3" -.TH dh 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH dh 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/dsa.3 b/secure/lib/libcrypto/man/dsa.3 index 80259da8325..acdbbdc8c56 100644 --- a/secure/lib/libcrypto/man/dsa.3 +++ b/secure/lib/libcrypto/man/dsa.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "dsa 3" -.TH dsa 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH dsa 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ecdsa.3 b/secure/lib/libcrypto/man/ecdsa.3 index d048a877a2a..6e467e6a3f3 100644 --- a/secure/lib/libcrypto/man/ecdsa.3 +++ b/secure/lib/libcrypto/man/ecdsa.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ecdsa 3" -.TH ecdsa 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ecdsa 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/engine.3 b/secure/lib/libcrypto/man/engine.3 index 215fceded4e..7870e17bad1 100644 --- a/secure/lib/libcrypto/man/engine.3 +++ b/secure/lib/libcrypto/man/engine.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "engine 3" -.TH engine 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH engine 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/err.3 b/secure/lib/libcrypto/man/err.3 index 5e2fc04eacf..62528dba1fd 100644 --- a/secure/lib/libcrypto/man/err.3 +++ b/secure/lib/libcrypto/man/err.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "err 3" -.TH err 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH err 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/evp.3 b/secure/lib/libcrypto/man/evp.3 index d7a40f5e0a0..4127137c50b 100644 --- a/secure/lib/libcrypto/man/evp.3 +++ b/secure/lib/libcrypto/man/evp.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "evp 3" -.TH evp 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH evp 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/hmac.3 b/secure/lib/libcrypto/man/hmac.3 index 7b90627f460..683226e847b 100644 --- a/secure/lib/libcrypto/man/hmac.3 +++ b/secure/lib/libcrypto/man/hmac.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "hmac 3" -.TH hmac 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH hmac 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/lh_stats.3 b/secure/lib/libcrypto/man/lh_stats.3 index aeefa31c1be..3cf9362e6b1 100644 --- a/secure/lib/libcrypto/man/lh_stats.3 +++ b/secure/lib/libcrypto/man/lh_stats.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "lh_stats 3" -.TH lh_stats 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH lh_stats 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/lhash.3 b/secure/lib/libcrypto/man/lhash.3 index bec634fdcda..b53637bf18d 100644 --- a/secure/lib/libcrypto/man/lhash.3 +++ b/secure/lib/libcrypto/man/lhash.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "lhash 3" -.TH lhash 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH lhash 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/md5.3 b/secure/lib/libcrypto/man/md5.3 index c80bcef81c9..33363807212 100644 --- a/secure/lib/libcrypto/man/md5.3 +++ b/secure/lib/libcrypto/man/md5.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "md5 3" -.TH md5 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH md5 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/mdc2.3 b/secure/lib/libcrypto/man/mdc2.3 index 13f03fd0a35..9208d5d5a3c 100644 --- a/secure/lib/libcrypto/man/mdc2.3 +++ b/secure/lib/libcrypto/man/mdc2.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "mdc2 3" -.TH mdc2 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH mdc2 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/pem.3 b/secure/lib/libcrypto/man/pem.3 index 470a74f707e..d026ece469d 100644 --- a/secure/lib/libcrypto/man/pem.3 +++ b/secure/lib/libcrypto/man/pem.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "pem 3" -.TH pem 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH pem 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/rand.3 b/secure/lib/libcrypto/man/rand.3 index c5f654daa50..4811a71be90 100644 --- a/secure/lib/libcrypto/man/rand.3 +++ b/secure/lib/libcrypto/man/rand.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "rand 3" -.TH rand 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH rand 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/rc4.3 b/secure/lib/libcrypto/man/rc4.3 index fbcbf3cd4ac..3734d1d3e5d 100644 --- a/secure/lib/libcrypto/man/rc4.3 +++ b/secure/lib/libcrypto/man/rc4.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "rc4 3" -.TH rc4 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH rc4 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ripemd.3 b/secure/lib/libcrypto/man/ripemd.3 index abde3f81aed..c7fb2b6324a 100644 --- a/secure/lib/libcrypto/man/ripemd.3 +++ b/secure/lib/libcrypto/man/ripemd.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ripemd 3" -.TH ripemd 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ripemd 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/rsa.3 b/secure/lib/libcrypto/man/rsa.3 index 6bc5672f795..48277919f2f 100644 --- a/secure/lib/libcrypto/man/rsa.3 +++ b/secure/lib/libcrypto/man/rsa.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "rsa 3" -.TH rsa 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH rsa 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/sha.3 b/secure/lib/libcrypto/man/sha.3 index b9120fa9351..a56c29a9b16 100644 --- a/secure/lib/libcrypto/man/sha.3 +++ b/secure/lib/libcrypto/man/sha.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "sha 3" -.TH sha 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH sha 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/threads.3 b/secure/lib/libcrypto/man/threads.3 index 590766884dd..cc5a4137bb3 100644 --- a/secure/lib/libcrypto/man/threads.3 +++ b/secure/lib/libcrypto/man/threads.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "threads 3" -.TH threads 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH threads 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ui.3 b/secure/lib/libcrypto/man/ui.3 index a009b9e743e..61d81817192 100644 --- a/secure/lib/libcrypto/man/ui.3 +++ b/secure/lib/libcrypto/man/ui.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ui 3" -.TH ui 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ui 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/ui_compat.3 b/secure/lib/libcrypto/man/ui_compat.3 index 5251803bac6..2632a0ca5d5 100644 --- a/secure/lib/libcrypto/man/ui_compat.3 +++ b/secure/lib/libcrypto/man/ui_compat.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ui_compat 3" -.TH ui_compat 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ui_compat 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libcrypto/man/x509.3 b/secure/lib/libcrypto/man/x509.3 index fc20561e973..f9502ae3bbf 100644 --- a/secure/lib/libcrypto/man/x509.3 +++ b/secure/lib/libcrypto/man/x509.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "x509 3" -.TH x509 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH x509 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CIPHER_get_name.3 b/secure/lib/libssl/man/SSL_CIPHER_get_name.3 index 0a28e0a924d..d4632bd9910 100644 --- a/secure/lib/libssl/man/SSL_CIPHER_get_name.3 +++ b/secure/lib/libssl/man/SSL_CIPHER_get_name.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CIPHER_get_name 3" -.TH SSL_CIPHER_get_name 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CIPHER_get_name 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_COMP_add_compression_method.3 b/secure/lib/libssl/man/SSL_COMP_add_compression_method.3 index 2039b1c917d..38ca6a925f2 100644 --- a/secure/lib/libssl/man/SSL_COMP_add_compression_method.3 +++ b/secure/lib/libssl/man/SSL_COMP_add_compression_method.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_COMP_add_compression_method 3" -.TH SSL_COMP_add_compression_method 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_COMP_add_compression_method 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_add_extra_chain_cert.3 b/secure/lib/libssl/man/SSL_CTX_add_extra_chain_cert.3 index 5c09f4e07f2..981c5b5bb77 100644 --- a/secure/lib/libssl/man/SSL_CTX_add_extra_chain_cert.3 +++ b/secure/lib/libssl/man/SSL_CTX_add_extra_chain_cert.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_add_extra_chain_cert 3" -.TH SSL_CTX_add_extra_chain_cert 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_add_extra_chain_cert 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_add_session.3 b/secure/lib/libssl/man/SSL_CTX_add_session.3 index e74d1c9bfda..480d7dea352 100644 --- a/secure/lib/libssl/man/SSL_CTX_add_session.3 +++ b/secure/lib/libssl/man/SSL_CTX_add_session.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_add_session 3" -.TH SSL_CTX_add_session 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_add_session 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_ctrl.3 b/secure/lib/libssl/man/SSL_CTX_ctrl.3 index 5fc2c539b0b..82726cae645 100644 --- a/secure/lib/libssl/man/SSL_CTX_ctrl.3 +++ b/secure/lib/libssl/man/SSL_CTX_ctrl.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_ctrl 3" -.TH SSL_CTX_ctrl 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_ctrl 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_flush_sessions.3 b/secure/lib/libssl/man/SSL_CTX_flush_sessions.3 index e1505be06a0..915aae6fe08 100644 --- a/secure/lib/libssl/man/SSL_CTX_flush_sessions.3 +++ b/secure/lib/libssl/man/SSL_CTX_flush_sessions.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_flush_sessions 3" -.TH SSL_CTX_flush_sessions 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_flush_sessions 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_free.3 b/secure/lib/libssl/man/SSL_CTX_free.3 index 2a19b238189..a397b7774ad 100644 --- a/secure/lib/libssl/man/SSL_CTX_free.3 +++ b/secure/lib/libssl/man/SSL_CTX_free.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_free 3" -.TH SSL_CTX_free 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_free 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_get_ex_new_index.3 b/secure/lib/libssl/man/SSL_CTX_get_ex_new_index.3 index 45e37ad310a..698e3eaaa80 100644 --- a/secure/lib/libssl/man/SSL_CTX_get_ex_new_index.3 +++ b/secure/lib/libssl/man/SSL_CTX_get_ex_new_index.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_get_ex_new_index 3" -.TH SSL_CTX_get_ex_new_index 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_get_ex_new_index 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_get_verify_mode.3 b/secure/lib/libssl/man/SSL_CTX_get_verify_mode.3 index 18250112c12..709a4ecb1d0 100644 --- a/secure/lib/libssl/man/SSL_CTX_get_verify_mode.3 +++ b/secure/lib/libssl/man/SSL_CTX_get_verify_mode.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_get_verify_mode 3" -.TH SSL_CTX_get_verify_mode 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_get_verify_mode 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_load_verify_locations.3 b/secure/lib/libssl/man/SSL_CTX_load_verify_locations.3 index 9aecb8fa7de..7b6185a43da 100644 --- a/secure/lib/libssl/man/SSL_CTX_load_verify_locations.3 +++ b/secure/lib/libssl/man/SSL_CTX_load_verify_locations.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_load_verify_locations 3" -.TH SSL_CTX_load_verify_locations 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_load_verify_locations 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_new.3 b/secure/lib/libssl/man/SSL_CTX_new.3 index c10d335bee0..194195fe4dc 100644 --- a/secure/lib/libssl/man/SSL_CTX_new.3 +++ b/secure/lib/libssl/man/SSL_CTX_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_new 3" -.TH SSL_CTX_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_sess_number.3 b/secure/lib/libssl/man/SSL_CTX_sess_number.3 index 45ca9f625fa..b2a32616239 100644 --- a/secure/lib/libssl/man/SSL_CTX_sess_number.3 +++ b/secure/lib/libssl/man/SSL_CTX_sess_number.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_sess_number 3" -.TH SSL_CTX_sess_number 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_sess_number 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_sess_set_cache_size.3 b/secure/lib/libssl/man/SSL_CTX_sess_set_cache_size.3 index e9cfa96ba52..0b626528158 100644 --- a/secure/lib/libssl/man/SSL_CTX_sess_set_cache_size.3 +++ b/secure/lib/libssl/man/SSL_CTX_sess_set_cache_size.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_sess_set_cache_size 3" -.TH SSL_CTX_sess_set_cache_size 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_sess_set_cache_size 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_sess_set_get_cb.3 b/secure/lib/libssl/man/SSL_CTX_sess_set_get_cb.3 index 5b12c7e0bbe..90309575e3c 100644 --- a/secure/lib/libssl/man/SSL_CTX_sess_set_get_cb.3 +++ b/secure/lib/libssl/man/SSL_CTX_sess_set_get_cb.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_sess_set_get_cb 3" -.TH SSL_CTX_sess_set_get_cb 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_sess_set_get_cb 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_sessions.3 b/secure/lib/libssl/man/SSL_CTX_sessions.3 index b8f4666b990..29ae238afff 100644 --- a/secure/lib/libssl/man/SSL_CTX_sessions.3 +++ b/secure/lib/libssl/man/SSL_CTX_sessions.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_sessions 3" -.TH SSL_CTX_sessions 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_sessions 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_cert_store.3 b/secure/lib/libssl/man/SSL_CTX_set_cert_store.3 index f53d4bcafa9..13c67bb3c63 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_cert_store.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_cert_store.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_cert_store 3" -.TH SSL_CTX_set_cert_store 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_cert_store 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_cert_verify_callback.3 b/secure/lib/libssl/man/SSL_CTX_set_cert_verify_callback.3 index 57d3f9066a9..015e67939cb 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_cert_verify_callback.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_cert_verify_callback.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_cert_verify_callback 3" -.TH SSL_CTX_set_cert_verify_callback 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_cert_verify_callback 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_cipher_list.3 b/secure/lib/libssl/man/SSL_CTX_set_cipher_list.3 index c6e1de213d2..535c0f3d0bf 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_cipher_list.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_cipher_list.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_cipher_list 3" -.TH SSL_CTX_set_cipher_list 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_cipher_list 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_client_CA_list.3 b/secure/lib/libssl/man/SSL_CTX_set_client_CA_list.3 index 6240f799f2d..997f33ec53a 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_client_CA_list.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_client_CA_list.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_client_CA_list 3" -.TH SSL_CTX_set_client_CA_list 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_client_CA_list 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_client_cert_cb.3 b/secure/lib/libssl/man/SSL_CTX_set_client_cert_cb.3 index b5df4578ced..d996f696f5c 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_client_cert_cb.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_client_cert_cb.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_client_cert_cb 3" -.TH SSL_CTX_set_client_cert_cb 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_client_cert_cb 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_default_passwd_cb.3 b/secure/lib/libssl/man/SSL_CTX_set_default_passwd_cb.3 index 5dc40f5e067..d5360e7fef9 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_default_passwd_cb.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_default_passwd_cb.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_default_passwd_cb 3" -.TH SSL_CTX_set_default_passwd_cb 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_default_passwd_cb 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_generate_session_id.3 b/secure/lib/libssl/man/SSL_CTX_set_generate_session_id.3 index c57f6340cf2..84ca4ce004d 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_generate_session_id.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_generate_session_id.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_generate_session_id 3" -.TH SSL_CTX_set_generate_session_id 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_generate_session_id 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_info_callback.3 b/secure/lib/libssl/man/SSL_CTX_set_info_callback.3 index f01f8e39c26..791efe32855 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_info_callback.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_info_callback.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_info_callback 3" -.TH SSL_CTX_set_info_callback 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_info_callback 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_max_cert_list.3 b/secure/lib/libssl/man/SSL_CTX_set_max_cert_list.3 index d9d5762d664..3d3386823f5 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_max_cert_list.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_max_cert_list.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_max_cert_list 3" -.TH SSL_CTX_set_max_cert_list 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_max_cert_list 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_mode.3 b/secure/lib/libssl/man/SSL_CTX_set_mode.3 index 5418b96a6c1..7e98b6b5e3a 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_mode.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_mode.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_mode 3" -.TH SSL_CTX_set_mode 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_mode 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_msg_callback.3 b/secure/lib/libssl/man/SSL_CTX_set_msg_callback.3 index 1ef26bab993..345d18dd504 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_msg_callback.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_msg_callback.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_msg_callback 3" -.TH SSL_CTX_set_msg_callback 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_msg_callback 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_options.3 b/secure/lib/libssl/man/SSL_CTX_set_options.3 index b2e2cb4f212..31ea482777b 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_options.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_options.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_options 3" -.TH SSL_CTX_set_options 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_options 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_quiet_shutdown.3 b/secure/lib/libssl/man/SSL_CTX_set_quiet_shutdown.3 index c60e048a643..dbe6db32478 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_quiet_shutdown.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_quiet_shutdown.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_quiet_shutdown 3" -.TH SSL_CTX_set_quiet_shutdown 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_quiet_shutdown 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_session_cache_mode.3 b/secure/lib/libssl/man/SSL_CTX_set_session_cache_mode.3 index 37dfbb03062..334e3be8557 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_session_cache_mode.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_session_cache_mode.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_session_cache_mode 3" -.TH SSL_CTX_set_session_cache_mode 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_session_cache_mode 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_session_id_context.3 b/secure/lib/libssl/man/SSL_CTX_set_session_id_context.3 index 20348ff67f5..141b30c90f6 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_session_id_context.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_session_id_context.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_session_id_context 3" -.TH SSL_CTX_set_session_id_context 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_session_id_context 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_ssl_version.3 b/secure/lib/libssl/man/SSL_CTX_set_ssl_version.3 index e7167314582..fa561a4b41c 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_ssl_version.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_ssl_version.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_ssl_version 3" -.TH SSL_CTX_set_ssl_version 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_ssl_version 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_timeout.3 b/secure/lib/libssl/man/SSL_CTX_set_timeout.3 index 2144d169d93..3fd90c62d8f 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_timeout.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_timeout.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_timeout 3" -.TH SSL_CTX_set_timeout 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_timeout 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_tmp_dh_callback.3 b/secure/lib/libssl/man/SSL_CTX_set_tmp_dh_callback.3 index e11f10bc72f..b707e436241 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_tmp_dh_callback.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_tmp_dh_callback.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_tmp_dh_callback 3" -.TH SSL_CTX_set_tmp_dh_callback 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_tmp_dh_callback 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_tmp_rsa_callback.3 b/secure/lib/libssl/man/SSL_CTX_set_tmp_rsa_callback.3 index 6a1fd71b347..a57f4630cdd 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_tmp_rsa_callback.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_tmp_rsa_callback.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_tmp_rsa_callback 3" -.TH SSL_CTX_set_tmp_rsa_callback 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_tmp_rsa_callback 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_set_verify.3 b/secure/lib/libssl/man/SSL_CTX_set_verify.3 index 1971e21de08..ef63f4f1297 100644 --- a/secure/lib/libssl/man/SSL_CTX_set_verify.3 +++ b/secure/lib/libssl/man/SSL_CTX_set_verify.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_set_verify 3" -.TH SSL_CTX_set_verify 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_set_verify 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_CTX_use_certificate.3 b/secure/lib/libssl/man/SSL_CTX_use_certificate.3 index 358dd6c5422..d7f947524b8 100644 --- a/secure/lib/libssl/man/SSL_CTX_use_certificate.3 +++ b/secure/lib/libssl/man/SSL_CTX_use_certificate.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_CTX_use_certificate 3" -.TH SSL_CTX_use_certificate 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_CTX_use_certificate 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_SESSION_free.3 b/secure/lib/libssl/man/SSL_SESSION_free.3 index 64d9b844c26..193337549c7 100644 --- a/secure/lib/libssl/man/SSL_SESSION_free.3 +++ b/secure/lib/libssl/man/SSL_SESSION_free.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_SESSION_free 3" -.TH SSL_SESSION_free 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_SESSION_free 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_SESSION_get_ex_new_index.3 b/secure/lib/libssl/man/SSL_SESSION_get_ex_new_index.3 index 553e43c7b3a..8b0ce3e75d5 100644 --- a/secure/lib/libssl/man/SSL_SESSION_get_ex_new_index.3 +++ b/secure/lib/libssl/man/SSL_SESSION_get_ex_new_index.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_SESSION_get_ex_new_index 3" -.TH SSL_SESSION_get_ex_new_index 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_SESSION_get_ex_new_index 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_SESSION_get_time.3 b/secure/lib/libssl/man/SSL_SESSION_get_time.3 index bdbbb7a63fc..b7a49af2038 100644 --- a/secure/lib/libssl/man/SSL_SESSION_get_time.3 +++ b/secure/lib/libssl/man/SSL_SESSION_get_time.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_SESSION_get_time 3" -.TH SSL_SESSION_get_time 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_SESSION_get_time 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_accept.3 b/secure/lib/libssl/man/SSL_accept.3 index 0c3a6d57f5d..59b4d3f8bc2 100644 --- a/secure/lib/libssl/man/SSL_accept.3 +++ b/secure/lib/libssl/man/SSL_accept.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_accept 3" -.TH SSL_accept 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_accept 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_alert_type_string.3 b/secure/lib/libssl/man/SSL_alert_type_string.3 index 2735e4b7117..c596eed1546 100644 --- a/secure/lib/libssl/man/SSL_alert_type_string.3 +++ b/secure/lib/libssl/man/SSL_alert_type_string.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_alert_type_string 3" -.TH SSL_alert_type_string 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_alert_type_string 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_clear.3 b/secure/lib/libssl/man/SSL_clear.3 index 25bca221efd..0a7b3b46e36 100644 --- a/secure/lib/libssl/man/SSL_clear.3 +++ b/secure/lib/libssl/man/SSL_clear.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_clear 3" -.TH SSL_clear 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_clear 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -165,10 +165,16 @@ for a description of the method's properties. \&\fISSL_clear()\fR resets the \s-1SSL\s0 object to allow for another connection. The reset operation however keeps several settings of the last sessions (some of these settings were made automatically during the last -handshake). It only makes sense when opening a new session (or reusing -an old one) with the same peer that shares these settings. -\&\fISSL_clear()\fR is not a short form for the sequence -\&\fISSL_free\fR\|(3); \fISSL_new\fR\|(3); . +handshake). It only makes sense for a new connection with the exact +same peer that shares these settings, and may fail if that peer +changes its settings between connections. Use the sequence +\&\fISSL_get_session\fR\|(3); +\&\fISSL_new\fR\|(3); +\&\fISSL_set_session\fR\|(3); +\&\fISSL_free\fR\|(3) +instead to avoid such failures +(or simply \fISSL_free\fR\|(3); \fISSL_new\fR\|(3) +if session reuse is not desired). .SH "RETURN VALUES" .IX Header "RETURN VALUES" The following return values can occur: diff --git a/secure/lib/libssl/man/SSL_connect.3 b/secure/lib/libssl/man/SSL_connect.3 index a51b65cdd7d..fe0a88487b0 100644 --- a/secure/lib/libssl/man/SSL_connect.3 +++ b/secure/lib/libssl/man/SSL_connect.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_connect 3" -.TH SSL_connect 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_connect 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_do_handshake.3 b/secure/lib/libssl/man/SSL_do_handshake.3 index 664c22fc5bb..974e7ea1312 100644 --- a/secure/lib/libssl/man/SSL_do_handshake.3 +++ b/secure/lib/libssl/man/SSL_do_handshake.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_do_handshake 3" -.TH SSL_do_handshake 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_do_handshake 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_free.3 b/secure/lib/libssl/man/SSL_free.3 index d0353659866..3bd5b6a7f9e 100644 --- a/secure/lib/libssl/man/SSL_free.3 +++ b/secure/lib/libssl/man/SSL_free.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_free 3" -.TH SSL_free 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_free 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_SSL_CTX.3 b/secure/lib/libssl/man/SSL_get_SSL_CTX.3 index 5f063e133c7..57ce8601c63 100644 --- a/secure/lib/libssl/man/SSL_get_SSL_CTX.3 +++ b/secure/lib/libssl/man/SSL_get_SSL_CTX.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_SSL_CTX 3" -.TH SSL_get_SSL_CTX 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_SSL_CTX 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_ciphers.3 b/secure/lib/libssl/man/SSL_get_ciphers.3 index 56ea6e8581f..c55441ab94e 100644 --- a/secure/lib/libssl/man/SSL_get_ciphers.3 +++ b/secure/lib/libssl/man/SSL_get_ciphers.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_ciphers 3" -.TH SSL_get_ciphers 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_ciphers 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_client_CA_list.3 b/secure/lib/libssl/man/SSL_get_client_CA_list.3 index 3ae3739bc7a..f4f74d318a8 100644 --- a/secure/lib/libssl/man/SSL_get_client_CA_list.3 +++ b/secure/lib/libssl/man/SSL_get_client_CA_list.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_client_CA_list 3" -.TH SSL_get_client_CA_list 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_client_CA_list 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_current_cipher.3 b/secure/lib/libssl/man/SSL_get_current_cipher.3 index d08981ef6c6..36ad709fa73 100644 --- a/secure/lib/libssl/man/SSL_get_current_cipher.3 +++ b/secure/lib/libssl/man/SSL_get_current_cipher.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_current_cipher 3" -.TH SSL_get_current_cipher 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_current_cipher 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_default_timeout.3 b/secure/lib/libssl/man/SSL_get_default_timeout.3 index 4c1d965d0c1..cba0a867c4d 100644 --- a/secure/lib/libssl/man/SSL_get_default_timeout.3 +++ b/secure/lib/libssl/man/SSL_get_default_timeout.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_default_timeout 3" -.TH SSL_get_default_timeout 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_default_timeout 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_error.3 b/secure/lib/libssl/man/SSL_get_error.3 index 12896828602..21c4bfa16b5 100644 --- a/secure/lib/libssl/man/SSL_get_error.3 +++ b/secure/lib/libssl/man/SSL_get_error.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_error 3" -.TH SSL_get_error 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_error 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_ex_data_X509_STORE_CTX_idx.3 b/secure/lib/libssl/man/SSL_get_ex_data_X509_STORE_CTX_idx.3 index a81f4defbfc..36f7ebaa5a2 100644 --- a/secure/lib/libssl/man/SSL_get_ex_data_X509_STORE_CTX_idx.3 +++ b/secure/lib/libssl/man/SSL_get_ex_data_X509_STORE_CTX_idx.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_ex_data_X509_STORE_CTX_idx 3" -.TH SSL_get_ex_data_X509_STORE_CTX_idx 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_ex_data_X509_STORE_CTX_idx 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_ex_new_index.3 b/secure/lib/libssl/man/SSL_get_ex_new_index.3 index 4896c63b79c..b96f349a337 100644 --- a/secure/lib/libssl/man/SSL_get_ex_new_index.3 +++ b/secure/lib/libssl/man/SSL_get_ex_new_index.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_ex_new_index 3" -.TH SSL_get_ex_new_index 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_ex_new_index 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_fd.3 b/secure/lib/libssl/man/SSL_get_fd.3 index ac7f7eacbde..900cf7fd44f 100644 --- a/secure/lib/libssl/man/SSL_get_fd.3 +++ b/secure/lib/libssl/man/SSL_get_fd.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_fd 3" -.TH SSL_get_fd 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_fd 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_peer_cert_chain.3 b/secure/lib/libssl/man/SSL_get_peer_cert_chain.3 index 8ac8a6927c8..53888bef50c 100644 --- a/secure/lib/libssl/man/SSL_get_peer_cert_chain.3 +++ b/secure/lib/libssl/man/SSL_get_peer_cert_chain.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_peer_cert_chain 3" -.TH SSL_get_peer_cert_chain 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_peer_cert_chain 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_peer_certificate.3 b/secure/lib/libssl/man/SSL_get_peer_certificate.3 index 26a51d879e2..423eae0e2e1 100644 --- a/secure/lib/libssl/man/SSL_get_peer_certificate.3 +++ b/secure/lib/libssl/man/SSL_get_peer_certificate.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_peer_certificate 3" -.TH SSL_get_peer_certificate 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_peer_certificate 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_rbio.3 b/secure/lib/libssl/man/SSL_get_rbio.3 index 630a26efc01..695082b8563 100644 --- a/secure/lib/libssl/man/SSL_get_rbio.3 +++ b/secure/lib/libssl/man/SSL_get_rbio.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_rbio 3" -.TH SSL_get_rbio 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_rbio 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_session.3 b/secure/lib/libssl/man/SSL_get_session.3 index 3e4d91319a2..cd4dd8d3881 100644 --- a/secure/lib/libssl/man/SSL_get_session.3 +++ b/secure/lib/libssl/man/SSL_get_session.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_session 3" -.TH SSL_get_session 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_session 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_verify_result.3 b/secure/lib/libssl/man/SSL_get_verify_result.3 index 5ce0d4cbd86..70d10529523 100644 --- a/secure/lib/libssl/man/SSL_get_verify_result.3 +++ b/secure/lib/libssl/man/SSL_get_verify_result.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_verify_result 3" -.TH SSL_get_verify_result 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_verify_result 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_get_version.3 b/secure/lib/libssl/man/SSL_get_version.3 index b52d5563320..38241110d96 100644 --- a/secure/lib/libssl/man/SSL_get_version.3 +++ b/secure/lib/libssl/man/SSL_get_version.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_get_version 3" -.TH SSL_get_version 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_get_version 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_library_init.3 b/secure/lib/libssl/man/SSL_library_init.3 index abed9589dee..42c355f5100 100644 --- a/secure/lib/libssl/man/SSL_library_init.3 +++ b/secure/lib/libssl/man/SSL_library_init.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_library_init 3" -.TH SSL_library_init 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_library_init 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_load_client_CA_file.3 b/secure/lib/libssl/man/SSL_load_client_CA_file.3 index 154b3e7f6fa..ac186b1f1f4 100644 --- a/secure/lib/libssl/man/SSL_load_client_CA_file.3 +++ b/secure/lib/libssl/man/SSL_load_client_CA_file.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_load_client_CA_file 3" -.TH SSL_load_client_CA_file 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_load_client_CA_file 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_new.3 b/secure/lib/libssl/man/SSL_new.3 index b20687d3c0d..b1baf7fb914 100644 --- a/secure/lib/libssl/man/SSL_new.3 +++ b/secure/lib/libssl/man/SSL_new.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_new 3" -.TH SSL_new 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_new 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_pending.3 b/secure/lib/libssl/man/SSL_pending.3 index fb98f0e37d2..a4c13857cb3 100644 --- a/secure/lib/libssl/man/SSL_pending.3 +++ b/secure/lib/libssl/man/SSL_pending.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_pending 3" -.TH SSL_pending 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_pending 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_read.3 b/secure/lib/libssl/man/SSL_read.3 index 69383c511ee..59d48047a5e 100644 --- a/secure/lib/libssl/man/SSL_read.3 +++ b/secure/lib/libssl/man/SSL_read.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_read 3" -.TH SSL_read 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_read 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_rstate_string.3 b/secure/lib/libssl/man/SSL_rstate_string.3 index 694b38fa780..b388713884b 100644 --- a/secure/lib/libssl/man/SSL_rstate_string.3 +++ b/secure/lib/libssl/man/SSL_rstate_string.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_rstate_string 3" -.TH SSL_rstate_string 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_rstate_string 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_session_reused.3 b/secure/lib/libssl/man/SSL_session_reused.3 index b6f2b0f90e8..b3cfb2952d5 100644 --- a/secure/lib/libssl/man/SSL_session_reused.3 +++ b/secure/lib/libssl/man/SSL_session_reused.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_session_reused 3" -.TH SSL_session_reused 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_session_reused 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_set_bio.3 b/secure/lib/libssl/man/SSL_set_bio.3 index 57b8d300e62..99b8e2ba6ee 100644 --- a/secure/lib/libssl/man/SSL_set_bio.3 +++ b/secure/lib/libssl/man/SSL_set_bio.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_set_bio 3" -.TH SSL_set_bio 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_set_bio 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_set_connect_state.3 b/secure/lib/libssl/man/SSL_set_connect_state.3 index 1b681a06526..07e6a9bb9e6 100644 --- a/secure/lib/libssl/man/SSL_set_connect_state.3 +++ b/secure/lib/libssl/man/SSL_set_connect_state.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_set_connect_state 3" -.TH SSL_set_connect_state 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_set_connect_state 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_set_fd.3 b/secure/lib/libssl/man/SSL_set_fd.3 index 3f9fddbde30..b868ec5f056 100644 --- a/secure/lib/libssl/man/SSL_set_fd.3 +++ b/secure/lib/libssl/man/SSL_set_fd.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_set_fd 3" -.TH SSL_set_fd 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_set_fd 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_set_session.3 b/secure/lib/libssl/man/SSL_set_session.3 index 7e8c70c70c7..c51f11ead99 100644 --- a/secure/lib/libssl/man/SSL_set_session.3 +++ b/secure/lib/libssl/man/SSL_set_session.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_set_session 3" -.TH SSL_set_session 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_set_session 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_set_shutdown.3 b/secure/lib/libssl/man/SSL_set_shutdown.3 index 9b211dec03e..59cfd32d30b 100644 --- a/secure/lib/libssl/man/SSL_set_shutdown.3 +++ b/secure/lib/libssl/man/SSL_set_shutdown.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_set_shutdown 3" -.TH SSL_set_shutdown 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_set_shutdown 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_set_verify_result.3 b/secure/lib/libssl/man/SSL_set_verify_result.3 index 1cffb238ea3..97c16500338 100644 --- a/secure/lib/libssl/man/SSL_set_verify_result.3 +++ b/secure/lib/libssl/man/SSL_set_verify_result.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_set_verify_result 3" -.TH SSL_set_verify_result 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_set_verify_result 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_shutdown.3 b/secure/lib/libssl/man/SSL_shutdown.3 index d7943597b66..4f74730cfee 100644 --- a/secure/lib/libssl/man/SSL_shutdown.3 +++ b/secure/lib/libssl/man/SSL_shutdown.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_shutdown 3" -.TH SSL_shutdown 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_shutdown 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_state_string.3 b/secure/lib/libssl/man/SSL_state_string.3 index f9e3cf17af1..46df7b784cd 100644 --- a/secure/lib/libssl/man/SSL_state_string.3 +++ b/secure/lib/libssl/man/SSL_state_string.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_state_string 3" -.TH SSL_state_string 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_state_string 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_want.3 b/secure/lib/libssl/man/SSL_want.3 index e61762d5736..63b13bc7dd2 100644 --- a/secure/lib/libssl/man/SSL_want.3 +++ b/secure/lib/libssl/man/SSL_want.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_want 3" -.TH SSL_want 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_want 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/SSL_write.3 b/secure/lib/libssl/man/SSL_write.3 index 2883ff8eed1..2bd34730292 100644 --- a/secure/lib/libssl/man/SSL_write.3 +++ b/secure/lib/libssl/man/SSL_write.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SSL_write 3" -.TH SSL_write 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SSL_write 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/d2i_SSL_SESSION.3 b/secure/lib/libssl/man/d2i_SSL_SESSION.3 index 233247ba430..25631b27ba9 100644 --- a/secure/lib/libssl/man/d2i_SSL_SESSION.3 +++ b/secure/lib/libssl/man/d2i_SSL_SESSION.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "d2i_SSL_SESSION 3" -.TH d2i_SSL_SESSION 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH d2i_SSL_SESSION 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/lib/libssl/man/ssl.3 b/secure/lib/libssl/man/ssl.3 index 61e9bf820ae..8759443ae3a 100644 --- a/secure/lib/libssl/man/ssl.3 +++ b/secure/lib/libssl/man/ssl.3 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ssl 3" -.TH ssl 3 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ssl 3 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/CA.pl.1 b/secure/usr.bin/openssl/man/CA.pl.1 index 7c3c4eb5ced..9b8a3b8e98e 100644 --- a/secure/usr.bin/openssl/man/CA.pl.1 +++ b/secure/usr.bin/openssl/man/CA.pl.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CA.PL 1" -.TH CA.PL 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH CA.PL 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/asn1parse.1 b/secure/usr.bin/openssl/man/asn1parse.1 index 3fd727b05e8..c630c49c5f8 100644 --- a/secure/usr.bin/openssl/man/asn1parse.1 +++ b/secure/usr.bin/openssl/man/asn1parse.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ASN1PARSE 1" -.TH ASN1PARSE 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ASN1PARSE 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/ca.1 b/secure/usr.bin/openssl/man/ca.1 index 15095cfb0b0..df41661ee77 100644 --- a/secure/usr.bin/openssl/man/ca.1 +++ b/secure/usr.bin/openssl/man/ca.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CA 1" -.TH CA 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH CA 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/ciphers.1 b/secure/usr.bin/openssl/man/ciphers.1 index 46f1f9711d9..6a4e76cc361 100644 --- a/secure/usr.bin/openssl/man/ciphers.1 +++ b/secure/usr.bin/openssl/man/ciphers.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CIPHERS 1" -.TH CIPHERS 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH CIPHERS 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/crl.1 b/secure/usr.bin/openssl/man/crl.1 index 5ed5e4b20e1..cf49f2af424 100644 --- a/secure/usr.bin/openssl/man/crl.1 +++ b/secure/usr.bin/openssl/man/crl.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CRL 1" -.TH CRL 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH CRL 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/crl2pkcs7.1 b/secure/usr.bin/openssl/man/crl2pkcs7.1 index 55083e1b7f9..59b20e1d153 100644 --- a/secure/usr.bin/openssl/man/crl2pkcs7.1 +++ b/secure/usr.bin/openssl/man/crl2pkcs7.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "CRL2PKCS7 1" -.TH CRL2PKCS7 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH CRL2PKCS7 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/dgst.1 b/secure/usr.bin/openssl/man/dgst.1 index d7def5d5491..fd40ca46eff 100644 --- a/secure/usr.bin/openssl/man/dgst.1 +++ b/secure/usr.bin/openssl/man/dgst.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DGST 1" -.TH DGST 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DGST 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/dhparam.1 b/secure/usr.bin/openssl/man/dhparam.1 index 0a6128931d9..a638a6b3540 100644 --- a/secure/usr.bin/openssl/man/dhparam.1 +++ b/secure/usr.bin/openssl/man/dhparam.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DHPARAM 1" -.TH DHPARAM 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DHPARAM 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/dsa.1 b/secure/usr.bin/openssl/man/dsa.1 index e93e28a232b..3761f700dcb 100644 --- a/secure/usr.bin/openssl/man/dsa.1 +++ b/secure/usr.bin/openssl/man/dsa.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSA 1" -.TH DSA 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DSA 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/dsaparam.1 b/secure/usr.bin/openssl/man/dsaparam.1 index b37bf6d1cc9..76e1a43c39c 100644 --- a/secure/usr.bin/openssl/man/dsaparam.1 +++ b/secure/usr.bin/openssl/man/dsaparam.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "DSAPARAM 1" -.TH DSAPARAM 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH DSAPARAM 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/ec.1 b/secure/usr.bin/openssl/man/ec.1 index 56c0b7abe30..8af4d8d90f1 100644 --- a/secure/usr.bin/openssl/man/ec.1 +++ b/secure/usr.bin/openssl/man/ec.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EC 1" -.TH EC 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH EC 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/ecparam.1 b/secure/usr.bin/openssl/man/ecparam.1 index eb5332dda4d..dea8a2e9d75 100644 --- a/secure/usr.bin/openssl/man/ecparam.1 +++ b/secure/usr.bin/openssl/man/ecparam.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ECPARAM 1" -.TH ECPARAM 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ECPARAM 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/enc.1 b/secure/usr.bin/openssl/man/enc.1 index 83308137b70..9e82bcc52c7 100644 --- a/secure/usr.bin/openssl/man/enc.1 +++ b/secure/usr.bin/openssl/man/enc.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ENC 1" -.TH ENC 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ENC 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/errstr.1 b/secure/usr.bin/openssl/man/errstr.1 index b498d2fa6c2..37eb645fd89 100644 --- a/secure/usr.bin/openssl/man/errstr.1 +++ b/secure/usr.bin/openssl/man/errstr.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "ERRSTR 1" -.TH ERRSTR 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH ERRSTR 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/gendsa.1 b/secure/usr.bin/openssl/man/gendsa.1 index e2718175976..089ee898b72 100644 --- a/secure/usr.bin/openssl/man/gendsa.1 +++ b/secure/usr.bin/openssl/man/gendsa.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "GENDSA 1" -.TH GENDSA 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH GENDSA 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/genrsa.1 b/secure/usr.bin/openssl/man/genrsa.1 index 56d5dec43ab..701ffb559e3 100644 --- a/secure/usr.bin/openssl/man/genrsa.1 +++ b/secure/usr.bin/openssl/man/genrsa.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "GENRSA 1" -.TH GENRSA 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH GENRSA 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/nseq.1 b/secure/usr.bin/openssl/man/nseq.1 index e212c0c80cf..c42b2736fdc 100644 --- a/secure/usr.bin/openssl/man/nseq.1 +++ b/secure/usr.bin/openssl/man/nseq.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "NSEQ 1" -.TH NSEQ 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH NSEQ 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/ocsp.1 b/secure/usr.bin/openssl/man/ocsp.1 index be1011b38a4..0e11a6d5f7e 100644 --- a/secure/usr.bin/openssl/man/ocsp.1 +++ b/secure/usr.bin/openssl/man/ocsp.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OCSP 1" -.TH OCSP 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH OCSP 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/openssl.1 b/secure/usr.bin/openssl/man/openssl.1 index 8f6a7c34c41..9b64fb65195 100644 --- a/secure/usr.bin/openssl/man/openssl.1 +++ b/secure/usr.bin/openssl/man/openssl.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "OPENSSL 1" -.TH OPENSSL 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH OPENSSL 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/passwd.1 b/secure/usr.bin/openssl/man/passwd.1 index e88cebed188..de375d78810 100644 --- a/secure/usr.bin/openssl/man/passwd.1 +++ b/secure/usr.bin/openssl/man/passwd.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PASSWD 1" -.TH PASSWD 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH PASSWD 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/pkcs12.1 b/secure/usr.bin/openssl/man/pkcs12.1 index 805d58c23af..bc695f66456 100644 --- a/secure/usr.bin/openssl/man/pkcs12.1 +++ b/secure/usr.bin/openssl/man/pkcs12.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS12 1" -.TH PKCS12 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH PKCS12 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/pkcs7.1 b/secure/usr.bin/openssl/man/pkcs7.1 index 1f2619a1128..b29ac1ef197 100644 --- a/secure/usr.bin/openssl/man/pkcs7.1 +++ b/secure/usr.bin/openssl/man/pkcs7.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS7 1" -.TH PKCS7 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH PKCS7 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/pkcs8.1 b/secure/usr.bin/openssl/man/pkcs8.1 index 36535de134e..117228930f9 100644 --- a/secure/usr.bin/openssl/man/pkcs8.1 +++ b/secure/usr.bin/openssl/man/pkcs8.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "PKCS8 1" -.TH PKCS8 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH PKCS8 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/rand.1 b/secure/usr.bin/openssl/man/rand.1 index 9e501d0995b..bbed7339d7f 100644 --- a/secure/usr.bin/openssl/man/rand.1 +++ b/secure/usr.bin/openssl/man/rand.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RAND 1" -.TH RAND 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RAND 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/req.1 b/secure/usr.bin/openssl/man/req.1 index 8267f353b50..e23d2864e97 100644 --- a/secure/usr.bin/openssl/man/req.1 +++ b/secure/usr.bin/openssl/man/req.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "REQ 1" -.TH REQ 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH REQ 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/rsa.1 b/secure/usr.bin/openssl/man/rsa.1 index 60b4dc866c5..96ca9ad97ab 100644 --- a/secure/usr.bin/openssl/man/rsa.1 +++ b/secure/usr.bin/openssl/man/rsa.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSA 1" -.TH RSA 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSA 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/rsautl.1 b/secure/usr.bin/openssl/man/rsautl.1 index be70710fa03..0636a24c5a3 100644 --- a/secure/usr.bin/openssl/man/rsautl.1 +++ b/secure/usr.bin/openssl/man/rsautl.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "RSAUTL 1" -.TH RSAUTL 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH RSAUTL 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/s_client.1 b/secure/usr.bin/openssl/man/s_client.1 index 86053651043..9da80bc5f4a 100644 --- a/secure/usr.bin/openssl/man/s_client.1 +++ b/secure/usr.bin/openssl/man/s_client.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "S_CLIENT 1" -.TH S_CLIENT 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH S_CLIENT 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/s_server.1 b/secure/usr.bin/openssl/man/s_server.1 index 0e9eb14b33d..67fac181c74 100644 --- a/secure/usr.bin/openssl/man/s_server.1 +++ b/secure/usr.bin/openssl/man/s_server.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "S_SERVER 1" -.TH S_SERVER 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH S_SERVER 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/s_time.1 b/secure/usr.bin/openssl/man/s_time.1 index 3838925bfb7..5f0dff3192f 100644 --- a/secure/usr.bin/openssl/man/s_time.1 +++ b/secure/usr.bin/openssl/man/s_time.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "S_TIME 1" -.TH S_TIME 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH S_TIME 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/sess_id.1 b/secure/usr.bin/openssl/man/sess_id.1 index 8ab621b3481..b70b2925e4c 100644 --- a/secure/usr.bin/openssl/man/sess_id.1 +++ b/secure/usr.bin/openssl/man/sess_id.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SESS_ID 1" -.TH SESS_ID 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SESS_ID 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/smime.1 b/secure/usr.bin/openssl/man/smime.1 index 1abe463e0f9..2c3f91b3f88 100644 --- a/secure/usr.bin/openssl/man/smime.1 +++ b/secure/usr.bin/openssl/man/smime.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SMIME 1" -.TH SMIME 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SMIME 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/speed.1 b/secure/usr.bin/openssl/man/speed.1 index 99dc0cda442..97537188505 100644 --- a/secure/usr.bin/openssl/man/speed.1 +++ b/secure/usr.bin/openssl/man/speed.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SPEED 1" -.TH SPEED 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SPEED 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/spkac.1 b/secure/usr.bin/openssl/man/spkac.1 index 28ebfa53c4e..7e1601cc28f 100644 --- a/secure/usr.bin/openssl/man/spkac.1 +++ b/secure/usr.bin/openssl/man/spkac.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "SPKAC 1" -.TH SPKAC 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH SPKAC 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/verify.1 b/secure/usr.bin/openssl/man/verify.1 index 9e81860cc56..76359fa054a 100644 --- a/secure/usr.bin/openssl/man/verify.1 +++ b/secure/usr.bin/openssl/man/verify.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "VERIFY 1" -.TH VERIFY 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH VERIFY 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/version.1 b/secure/usr.bin/openssl/man/version.1 index 0ea1798fa98..05d03b34ddd 100644 --- a/secure/usr.bin/openssl/man/version.1 +++ b/secure/usr.bin/openssl/man/version.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "VERSION 1" -.TH VERSION 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH VERSION 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/x509.1 b/secure/usr.bin/openssl/man/x509.1 index e3708b2e359..9b22df5c876 100644 --- a/secure/usr.bin/openssl/man/x509.1 +++ b/secure/usr.bin/openssl/man/x509.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509 1" -.TH X509 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH X509 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/secure/usr.bin/openssl/man/x509v3_config.1 b/secure/usr.bin/openssl/man/x509v3_config.1 index e9935c1b968..5ea2a9670cb 100644 --- a/secure/usr.bin/openssl/man/x509v3_config.1 +++ b/secure/usr.bin/openssl/man/x509v3_config.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) +.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.22) .\" .\" Standard preamble: .\" ======================================================================== @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "X509V3_CONFIG 1" -.TH X509V3_CONFIG 1 "2010-12-02" "0.9.8q" "OpenSSL" +.TH X509V3_CONFIG 1 "2012-05-10" "0.9.8x" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff --git a/share/Makefile b/share/Makefile index 5ccf165930c..e39da7f2792 100644 --- a/share/Makefile +++ b/share/Makefile @@ -8,6 +8,7 @@ SUBDIR= ${_colldef} \ ${_dict} \ ${_doc} \ + dtrace \ ${_examples} \ ${_i18n} \ ${_man} \ diff --git a/share/dtrace/Makefile b/share/dtrace/Makefile new file mode 100644 index 00000000000..71f1e4eeeec --- /dev/null +++ b/share/dtrace/Makefile @@ -0,0 +1,21 @@ +# $FreeBSD$ +# +# Hand installing our scripts and optionally (based on MK_CDDL) installing +# the DTraceToolkit. +# + +.include + +SUBDIR= ${_toolkit} + +.if ${MK_CDDL} != "no" +_toolkit= toolkit +.endif + +SCRIPTS= nfsclienttime + +SCRIPTSDIR= ${SHAREDIR}/dtrace/ + +NO_OBJ= + +.include diff --git a/share/dtrace/README b/share/dtrace/README new file mode 100644 index 00000000000..e446ceecf07 --- /dev/null +++ b/share/dtrace/README @@ -0,0 +1,11 @@ +$FreeBSD$ + +This directory contains scripts for use with the DTrace system. The +toolkit/ directory contains the latest vendor import of Brendan +Gregg's DTraceToolkit while all the other files and directories +contain code generated by the FreeBSD Project for use with DTrace on +FreeBSD. + +NOTE: Do not add new scripts to the DTraceToolkit contained in this +directory. New DTraceToolkit scripts should be send to the maintainer +of the toolkit and then brought back into FreeBSD via future vendor imports. diff --git a/usr.bin/yacc/yyfix.sh b/share/dtrace/nfsclienttime old mode 100644 new mode 100755 similarity index 51% rename from usr.bin/yacc/yyfix.sh rename to share/dtrace/nfsclienttime index a8110c96745..335f067b385 --- a/usr.bin/yacc/yyfix.sh +++ b/share/dtrace/nfsclienttime @@ -1,8 +1,11 @@ -#!/bin/sh - +#!/bin/sh # -# Copyright (c) 1990 The Regents of the University of California. +# Copyright (c) 2012 Robert N. M. Watson # All rights reserved. # +# This software was developed at the University of Cambridge Computer +# Laboratory with support from a grant from Google, Inc. +# # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: @@ -11,14 +14,11 @@ # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. -# 4. Neither the name of the University nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. # -# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) @@ -29,46 +29,46 @@ # # $FreeBSD$ # -# @(#)yyfix.sh 5.2 (Berkeley) 5/12/90 +# This script measures all time spent waiting on RPC replies for each +# system call, and then generates a histogram of those times sorted by +# system call name. +# +# Currently only supports NFSv3 +# +# Usage: nfsclienttime +# +# Press Ctrl-C to exit and display statistics. # -OLDYACC="yyexca yyact yypact yypgo yyr1 yyr2 yychk yydef" -NEWYACC="yylhs yylen yydefred yydgoto yysindex yyrindex yygindex \ - yytable yycheck" -if [ $# -eq 0 ]; then - echo "usage: $0 file [tables]" >&2 - exit 1 -fi +/usr/sbin/dtrace -n ' +#pragma D option quiet -file=$1 ->$file -shift +dtrace:::BEGIN +{ + printf("Collecting data...press Ctrl-C to exit.\n"); +} -if [ $# -eq 0 ] ; then - if grep yylhs y.tab.c > /dev/null ; then - if grep yyname y.tab.c > /dev/null ; then - NEWYACC="$NEWYACC yyname" - fi - if grep yyrule y.tab.c > /dev/null ; then - NEWYACC="$NEWYACC yyrule" - fi - set $NEWYACC - else - set $OLDYACC - fi -fi +syscall:::entry +{ -for i -do -ed - y.tab.c << END -/^\(.*\)$i[ ]*\[]/s//extern \1 $i[];\\ -\1 $i []/ -.ka -/}/kb -'br $file -'a,.w $file -'a,.d -w -q -END -done + self->count = 0; +} + +nfsclient:nfs3::start +{ + + self->timestamp = timestamp; +} + +nfsclient:nfs3::done +{ + + self->count += (timestamp - self->timestamp); +} + +syscall:::return +/self->count != 0/ { + + @syscalls[probefunc] = quantize(self->count); +} +' diff --git a/share/dtrace/toolkit/Makefile b/share/dtrace/toolkit/Makefile new file mode 100644 index 00000000000..0eb7ff21bc5 --- /dev/null +++ b/share/dtrace/toolkit/Makefile @@ -0,0 +1,17 @@ +#$FreeBSD$ +# +# Install scripts from the DTraceToolkit +# +DTRACETOOLKIT= ../../../cddl/contrib/dtracetoolkit + +SCRIPTS= ${DTRACETOOLKIT}/execsnoop \ + ${DTRACETOOLKIT}/hotuser \ + ${DTRACETOOLKIT}/hotkernel \ + ${DTRACETOOLKIT}/opensnoop \ + ${DTRACETOOLKIT}/procsystime \ + +SCRIPTSDIR= ${SHAREDIR}/dtrace/toolkit + +NO_OBJ= + +.include diff --git a/share/examples/csh/dot.cshrc b/share/examples/csh/dot.cshrc index 17951d4c419..5b30791864b 100644 --- a/share/examples/csh/dot.cshrc +++ b/share/examples/csh/dot.cshrc @@ -4,8 +4,12 @@ # # Sets SSH_AUTH_SOCK to the user's ssh-agent socket path if running +# +# This has a couple caveats, the most notable being that if a user +# has multiple ssh-agent(1) processes running, this will very likely +# set SSH_AUTH_SOCK to point to the wrong file/domain socket. if (${?SSH_AUTH_SOCK} != "1") then - setenv SSH_AUTH_SOCK `sockstat | grep "${USER}" | cut -d ' ' -f 6` + setenv SSH_AUTH_SOCK `sockstat -u | awk '/^${USER}.+ ssh-agent/ { print $6 }' endif # Change only root's prompt diff --git a/share/examples/etc/README.examples b/share/examples/etc/README.examples index ba2cf00dc90..f7bf4ceb8cf 100644 --- a/share/examples/etc/README.examples +++ b/share/examples/etc/README.examples @@ -9,7 +9,6 @@ This directory contains the following files: amd.map - filesystem automounter lookup resolution map (see amd(8)) apmd.conf - configuration file for apmd(8) -auth.conf - authentication capability database (see auth.conf(5)) bsd-style-copyright - copyright style for bsd system crontab - system scheduled command table (see crontab(5)) csh.cshrc - sample .cshrc (see csh(1)) diff --git a/share/examples/mdoc/example.4 b/share/examples/mdoc/example.4 index a5fa1a67a99..c39e4865a9a 100644 --- a/share/examples/mdoc/example.4 +++ b/share/examples/mdoc/example.4 @@ -34,7 +34,6 @@ .Nd "example device driver manual page" .Sh SYNOPSIS To compile the -.Ns Nm driver into the kernel, place the following lines in the kernel configuration file: @@ -44,7 +43,6 @@ kernel configuration file: .Ed .Pp Alternatively, to load the -.Ns Nm driver as a module at boot time, place the following line in .Xr loader.conf 5 : diff --git a/share/examples/pf/faq-example1 b/share/examples/pf/faq-example1 index 91942f616d4..e9b240fbd90 100644 --- a/share/examples/pf/faq-example1 +++ b/share/examples/pf/faq-example1 @@ -26,7 +26,7 @@ set skip on lo scrub in # nat/rdr -nat on $ext_if from !($ext_if) -> ($ext_if:0) +nat on $ext_if inet from !($ext_if) -> ($ext_if:0) nat-anchor "ftp-proxy/*" rdr-anchor "ftp-proxy/*" diff --git a/share/examples/pf/pf.conf b/share/examples/pf/pf.conf index 299999df804..d97b4ede16e 100644 --- a/share/examples/pf/pf.conf +++ b/share/examples/pf/pf.conf @@ -16,7 +16,7 @@ #nat-anchor "ftp-proxy/*" #rdr-anchor "ftp-proxy/*" -#nat on $ext_if from !($ext_if) -> ($ext_if:0) +#nat on $ext_if inet from !($ext_if) -> ($ext_if:0) #rdr pass on $int_if proto tcp to port ftp -> 127.0.0.1 port 8021 #no rdr on $ext_if proto tcp from to any port smtp #rdr pass on $ext_if proto tcp from any to any port smtp \ diff --git a/share/examples/scsi_target/scsi_target.c b/share/examples/scsi_target/scsi_target.c index 6f665af03c4..1a7a0615a29 100644 --- a/share/examples/scsi_target/scsi_target.c +++ b/share/examples/scsi_target/scsi_target.c @@ -88,7 +88,7 @@ static void handle_read(void); /* static int work_atio(struct ccb_accept_tio *); */ static void queue_io(struct ccb_scsiio *); static int run_queue(struct ccb_accept_tio *); -static int work_inot(struct ccb_immed_notify *); +static int work_inot(struct ccb_immediate_notify *); static struct ccb_scsiio * get_ctio(void); /* static void free_ccb(union ccb *); */ @@ -387,7 +387,7 @@ init_ccbs() warn("malloc INOT"); return (-1); } - inot->ccb_h.func_code = XPT_IMMED_NOTIFY; + inot->ccb_h.func_code = XPT_IMMEDIATE_NOTIFY; send_ccb((union ccb *)inot, /*priority*/1); } @@ -495,8 +495,8 @@ request_loop() /* Start one more transfer. */ retval = work_atio(&ccb->atio); break; - case XPT_IMMED_NOTIFY: - retval = work_inot(&ccb->cin); + case XPT_IMMEDIATE_NOTIFY: + retval = work_inot(&ccb->cin1); break; default: warnx("Unhandled ccb type %#x on workq", @@ -651,7 +651,7 @@ work_atio(struct ccb_accept_tio *atio) warnx("ATIO with %u bytes sense received", atio->sense_len); } - sense = &atio->sense_data; + sense = (struct scsi_sense_data_fixed *)&atio->sense_data; tcmd_sense(ctio->init_id, ctio, sense->flags, sense->add_sense_code, sense->add_sense_code_qual); send_ccb((union ccb *)ctio, /*priority*/1); @@ -772,16 +772,14 @@ run_queue(struct ccb_accept_tio *atio) } static int -work_inot(struct ccb_immed_notify *inot) +work_inot(struct ccb_immediate_notify *inot) { cam_status status; - int sense; if (debug) warnx("Working on INOT %p", inot); status = inot->ccb_h.status; - sense = (status & CAM_AUTOSNS_VALID) != 0; status &= CAM_STATUS_MASK; switch (status) { @@ -794,7 +792,7 @@ work_inot(struct ccb_immed_notify *inot) abort_all_pending(); break; case CAM_MESSAGE_RECV: - switch (inot->message_args[0]) { + switch (inot->arg) { case MSG_TASK_COMPLETE: case MSG_INITIATOR_DET_ERR: case MSG_ABORT_TASK_SET: @@ -805,7 +803,7 @@ work_inot(struct ccb_immed_notify *inot) case MSG_ABORT_TASK: case MSG_CLEAR_TASK_SET: default: - warnx("INOT message %#x", inot->message_args[0]); + warnx("INOT message %#x", inot->arg); break; } break; @@ -817,17 +815,6 @@ work_inot(struct ccb_immed_notify *inot) break; } - /* If there is sense data, use it */ - if (sense != 0) { - struct scsi_sense_data_fixed *sense; - - sense = (struct scsi_sense_data_fixed *)&inot->sense_data; - tcmd_sense(inot->initiator_id, NULL, sense->flags, - sense->add_sense_code, sense->add_sense_code_qual); - if (debug) - warnx("INOT has sense: %#x", sense->flags); - } - /* Requeue on SIM */ TAILQ_REMOVE(&work_queue, &inot->ccb_h, periph_links.tqe); send_ccb((union ccb *)inot, /*priority*/1); diff --git a/share/examples/ses/Makefile.inc b/share/examples/ses/Makefile.inc index 5ff1cd43048..2b1e85874d1 100644 --- a/share/examples/ses/Makefile.inc +++ b/share/examples/ses/Makefile.inc @@ -32,7 +32,6 @@ # mjacob@feral.com # -CFLAGS+= -I/usr/include/cam/scsi -DSESINC="" BINDIR?= /usr/sbin CLEANFILES+= ${MAN} diff --git a/share/examples/ses/srcs/eltsub.c b/share/examples/ses/srcs/eltsub.c index 8500fff041a..9500423c120 100644 --- a/share/examples/ses/srcs/eltsub.c +++ b/share/examples/ses/srcs/eltsub.c @@ -33,10 +33,13 @@ */ #include +#include +#include #include #include #include -#include SESINC +#include +#include #include "eltsub.h" @@ -46,79 +49,82 @@ geteltnm(int type) static char rbuf[132]; switch (type) { - case SESTYP_UNSPECIFIED: + case ELMTYP_UNSPECIFIED: sprintf(rbuf, "Unspecified"); break; - case SESTYP_DEVICE: - sprintf(rbuf, "Device"); + case ELMTYP_DEVICE: + sprintf(rbuf, "Device Slot"); break; - case SESTYP_POWER: - sprintf(rbuf, "Power supply"); + case ELMTYP_POWER: + sprintf(rbuf, "Power Supply"); break; - case SESTYP_FAN: - sprintf(rbuf, "Cooling element"); + case ELMTYP_FAN: + sprintf(rbuf, "Cooling"); break; - case SESTYP_THERM: - sprintf(rbuf, "Temperature sensors"); + case ELMTYP_THERM: + sprintf(rbuf, "Temperature Sensors"); break; - case SESTYP_DOORLOCK: + case ELMTYP_DOORLOCK: sprintf(rbuf, "Door Lock"); break; - case SESTYP_ALARM: + case ELMTYP_ALARM: sprintf(rbuf, "Audible alarm"); break; - case SESTYP_ESCC: - sprintf(rbuf, "Enclosure services controller electronics"); + case ELMTYP_ESCC: + sprintf(rbuf, "Enclosure Eervices Controller Electronics"); break; - case SESTYP_SCC: - sprintf(rbuf, "SCC controller electronics"); + case ELMTYP_SCC: + sprintf(rbuf, "SCC Controller Electronics"); break; - case SESTYP_NVRAM: - sprintf(rbuf, "Nonvolatile cache"); + case ELMTYP_NVRAM: + sprintf(rbuf, "Nonvolatile Cache"); break; - case SESTYP_UPS: - sprintf(rbuf, "Uninterruptible power supply"); + case ELMTYP_INV_OP_REASON: + sprintf(rbuf, "Invalid Operation Reason"); break; - case SESTYP_DISPLAY: + case ELMTYP_UPS: + sprintf(rbuf, "Uninterruptible Power Supply"); + break; + case ELMTYP_DISPLAY: sprintf(rbuf, "Display"); break; - case SESTYP_KEYPAD: - sprintf(rbuf, "Key pad entry device"); + case ELMTYP_KEYPAD: + sprintf(rbuf, "Key Pad Entry"); break; - case SESTYP_ENCLOSURE: + case ELMTYP_ENCLOSURE: sprintf(rbuf, "Enclosure"); break; - case SESTYP_SCSIXVR: - sprintf(rbuf, "SCSI port/transceiver"); + case ELMTYP_SCSIXVR: + sprintf(rbuf, "SCSI Port/Transceiver"); break; - case SESTYP_LANGUAGE: + case ELMTYP_LANGUAGE: sprintf(rbuf, "Language"); break; - case SESTYP_COMPORT: + case ELMTYP_COMPORT: sprintf(rbuf, "Communication Port"); break; - case SESTYP_VOM: + case ELMTYP_VOM: sprintf(rbuf, "Voltage Sensor"); break; - case SESTYP_AMMETER: + case ELMTYP_AMMETER: sprintf(rbuf, "Current Sensor"); break; - case SESTYP_SCSI_TGT: - sprintf(rbuf, "SCSI target port"); + case ELMTYP_SCSI_TGT: + sprintf(rbuf, "SCSI Target Port"); break; - case SESTYP_SCSI_INI: - sprintf(rbuf, "SCSI initiator port"); + case ELMTYP_SCSI_INI: + sprintf(rbuf, "SCSI Initiator Port"); break; - case SESTYP_SUBENC: - sprintf(rbuf, "Simple sub-enclosure"); + case ELMTYP_SUBENC: + sprintf(rbuf, "Simple Subenclosure"); break; - case SESTYP_ARRAY: - sprintf(rbuf, "Array device"); + case ELMTYP_ARRAY_DEV: + sprintf(rbuf, "Array Device Slot"); break; - case SESTYP_SASEXPANDER: + case ELMTYP_SAS_EXP: sprintf(rbuf, "SAS Expander"); break; - case SESTYP_SASCONNECTOR: + case ELMTYP_SAS_CONN: sprintf(rbuf, "SAS Connector"); break; default: @@ -134,31 +140,34 @@ scode2ascii(u_char code) static char rbuf[32]; switch (code & 0xf) { case SES_OBJSTAT_UNSUPPORTED: - sprintf(rbuf, "status not supported"); + sprintf(rbuf, "Unsupported"); break; case SES_OBJSTAT_OK: - sprintf(rbuf, "ok"); + sprintf(rbuf, "OK"); break; case SES_OBJSTAT_CRIT: - sprintf(rbuf, "critical"); + sprintf(rbuf, "Critical"); break; case SES_OBJSTAT_NONCRIT: - sprintf(rbuf, "non-critical"); + sprintf(rbuf, "Noncritical"); break; case SES_OBJSTAT_UNRECOV: - sprintf(rbuf, "unrecoverable"); + sprintf(rbuf, "Unrecoverable"); break; case SES_OBJSTAT_NOTINSTALLED: - sprintf(rbuf, "not installed"); + sprintf(rbuf, "Not Installed"); break; case SES_OBJSTAT_UNKNOWN: - sprintf(rbuf, "unknown status"); + sprintf(rbuf, "Unknown"); break; case SES_OBJSTAT_NOTAVAIL: - sprintf(rbuf, "status not available"); + sprintf(rbuf, "Not Available"); + break; + case SES_OBJSTAT_NOACCESS: + sprintf(rbuf, "No Access Allowed"); break; default: - sprintf(rbuf, "unknown status code %x", code & 0xf); + sprintf(rbuf, "", code & 0xf); break; } return (rbuf); @@ -171,7 +180,7 @@ stat2ascii(int eletype __unused, u_char *cstat) static char ebuf[256], *scode; scode = scode2ascii(cstat[0]); - sprintf(ebuf, "Status=%s (bytes=0x%02x 0x%02x 0x%02x 0x%02x)", + sprintf(ebuf, "status: %s (0x%02x 0x%02x 0x%02x 0x%02x)", scode, cstat[0], cstat[1], cstat[2], cstat[3]); return (ebuf); } diff --git a/share/examples/ses/srcs/getencstat.c b/share/examples/ses/srcs/getencstat.c index 3514fe4e77c..9048f73553a 100644 --- a/share/examples/ses/srcs/getencstat.c +++ b/share/examples/ses/srcs/getencstat.c @@ -33,20 +33,25 @@ */ #include +#include +#include #include #include #include #include #include -#include SESINC +#include +#include #include "eltsub.h" int main(int a, char **v) { - ses_object *objp; - ses_objstat ob; + encioc_element_t *objp; + encioc_elm_status_t ob; + encioc_elm_desc_t objd; + encioc_elm_devnames_t objdn; int fd, nobj, f, i, verbose, quiet, errors; u_char estat; @@ -73,13 +78,13 @@ main(int a, char **v) perror(*v); continue; } - if (ioctl(fd, SESIOC_GETNOBJ, (caddr_t) &nobj) < 0) { - perror("SESIOC_GETNOBJ"); + if (ioctl(fd, ENCIOC_GETNELM, (caddr_t) &nobj) < 0) { + perror("ENCIOC_GETNELM"); (void) close(fd); continue; } - if (ioctl(fd, SESIOC_GETENCSTAT, (caddr_t) &estat) < 0) { - perror("SESIOC_GETENCSTAT"); + if (ioctl(fd, ENCIOC_GETENCSTAT, (caddr_t) &estat) < 0) { + perror("ENCIOC_GETENCSTAT"); (void) close(fd); continue; } @@ -113,38 +118,64 @@ main(int a, char **v) } } fprintf(stdout, ">\n"); - objp = calloc(nobj, sizeof (ses_object)); + objp = calloc(nobj, sizeof (encioc_element_t)); if (objp == NULL) { perror("calloc"); (void) close(fd); continue; } - if (ioctl(fd, SESIOC_GETOBJMAP, (caddr_t) objp) < 0) { - perror("SESIOC_GETOBJMAP"); + if (ioctl(fd, ENCIOC_GETELMMAP, (caddr_t) objp) < 0) { + perror("ENCIOC_GETELMMAP"); (void) close(fd); continue; } for (i = 0; i < nobj; i++) { - ob.obj_id = objp[i].obj_id; - if (ioctl(fd, SESIOC_GETOBJSTAT, (caddr_t) &ob) < 0) { - perror("SESIOC_GETOBJSTAT"); + ob.elm_idx = objp[i].elm_idx; + if (ioctl(fd, ENCIOC_GETELMSTAT, (caddr_t) &ob) < 0) { + perror("ENCIOC_GETELMSTAT"); (void) close(fd); break; } - if ((ob.cstat[0] & 0xf) == SES_OBJSTAT_OK) { - if (verbose) { - fprintf(stdout, - "Element 0x%x: %s OK (%s)\n", - ob.obj_id, - geteltnm(objp[i].object_type), - stat2ascii(objp[i].object_type, - ob.cstat)); - } + bzero(&objd, sizeof(objd)); + objd.elm_idx = objp[i].elm_idx; + objd.elm_desc_len = UINT16_MAX; + objd.elm_desc_str = calloc(UINT16_MAX, sizeof(char)); + if (objd.elm_desc_str == NULL) { + perror("calloc"); + (void) close(fd); continue; } - fprintf(stdout, "Element 0x%x: %s, %s\n", - ob.obj_id, geteltnm(objp[i].object_type), - stat2ascii(objp[i].object_type, ob.cstat)); + if (ioctl(fd, ENCIOC_GETELMDESC, (caddr_t)&objd) < 0) { + perror("ENCIOC_GETELMDESC"); + (void) close(fd); + break; + } + bzero(&objdn, sizeof(objdn)); + objdn.elm_idx = objp[i].elm_idx; + objdn.elm_names_size = 128; + objdn.elm_devnames = calloc(128, sizeof(char)); + if (objdn.elm_devnames == NULL) { + perror("calloc"); + (void) close(fd); + break; + } + /* + * This ioctl isn't critical and has a good chance + * of returning -1. + */ + (void)ioctl(fd, ENCIOC_GETELMDEVNAMES, (caddr_t)&objdn); + fprintf(stdout, "Element 0x%x: %s", ob.elm_idx, + geteltnm(objp[i].elm_type)); + fprintf(stdout, ", %s", + stat2ascii(objp[i].elm_type, ob.cstat)); + if (objd.elm_desc_len > 0) + fprintf(stdout, ", descriptor: '%s'", + objd.elm_desc_str); + if (objdn.elm_names_len > 0) + fprintf(stdout, ", dev: '%s'", + objdn.elm_devnames); + fprintf(stdout, "\n"); + free(objdn.elm_devnames); } free(objp); (void) close(fd); diff --git a/share/examples/ses/srcs/getnobj.c b/share/examples/ses/srcs/getnobj.c index 17a26c62bd9..92d3458dec6 100644 --- a/share/examples/ses/srcs/getnobj.c +++ b/share/examples/ses/srcs/getnobj.c @@ -33,12 +33,15 @@ */ #include +#include +#include #include #include #include #include #include -#include SESINC +#include +#include int main(int argc, char **argv) diff --git a/share/examples/ses/srcs/getobjmap.c b/share/examples/ses/srcs/getobjmap.c index 9798b4c87ba..fbcc12e63f3 100644 --- a/share/examples/ses/srcs/getobjmap.c +++ b/share/examples/ses/srcs/getobjmap.c @@ -33,11 +33,14 @@ */ #include +#include +#include #include #include #include #include -#include SESINC +#include +#include #include "eltsub.h" diff --git a/share/examples/ses/srcs/getobjstat.c b/share/examples/ses/srcs/getobjstat.c index 99fb1854238..d49f6f97d2f 100644 --- a/share/examples/ses/srcs/getobjstat.c +++ b/share/examples/ses/srcs/getobjstat.c @@ -32,11 +32,14 @@ * mjacob@feral.com */ #include +#include +#include #include #include #include #include -#include SESINC +#include +#include int main(int a, char **v) diff --git a/share/examples/ses/srcs/inienc.c b/share/examples/ses/srcs/inienc.c index 7d6cc220b51..f418787b303 100644 --- a/share/examples/ses/srcs/inienc.c +++ b/share/examples/ses/srcs/inienc.c @@ -33,11 +33,14 @@ */ #include +#include +#include #include #include #include #include -#include SESINC +#include +#include int main(int a, char **v) diff --git a/share/examples/ses/srcs/sesd.c b/share/examples/ses/srcs/sesd.c index 0793077d210..88627e9ad5a 100644 --- a/share/examples/ses/srcs/sesd.c +++ b/share/examples/ses/srcs/sesd.c @@ -32,6 +32,8 @@ * mjacob@feral.com */ #include +#include +#include #include #include #include @@ -39,7 +41,8 @@ #include #include #include -#include SESINC +#include +#include #define ALLSTAT (SES_ENCSTAT_UNRECOV | SES_ENCSTAT_CRITICAL | \ SES_ENCSTAT_NONCRITICAL | SES_ENCSTAT_INFO) @@ -54,7 +57,7 @@ main(int a, char **v) static const char *usage = "usage: %s [ -d ] [ -t pollinterval ] device [ device ]\n"; int fd, polltime, dev, devbase, nodaemon; - ses_encstat stat, *carray; + encioc_enc_status_t stat, *carray; if (a < 2) { fprintf(stderr, usage, *v); @@ -83,7 +86,7 @@ main(int a, char **v) return (1); } for (dev = devbase; dev < a; dev++) - carray[dev] = (ses_encstat) -1; + carray[dev] = (encioc_enc_status_t) -1; /* * Check to make sure we can open all devices @@ -94,8 +97,8 @@ main(int a, char **v) perror(v[dev]); return (1); } - if (ioctl(fd, SESIOC_INIT, NULL) < 0) { - fprintf(stderr, "%s: SESIOC_INIT fails- %s\n", + if (ioctl(fd, ENCIOC_INIT, NULL) < 0) { + fprintf(stderr, "%s: ENCIOC_INIT fails- %s\n", v[dev], strerror(errno)); return (1); } @@ -122,9 +125,9 @@ main(int a, char **v) /* * Get the actual current enclosure status. */ - if (ioctl(fd, SESIOC_GETENCSTAT, (caddr_t) &stat) < 0) { + if (ioctl(fd, ENCIOC_GETENCSTAT, (caddr_t) &stat) < 0) { syslog(LOG_ERR, - "%s: SESIOC_GETENCSTAT- %m", v[dev]); + "%s: ENCIOC_GETENCSTAT- %m", v[dev]); (void) close(fd); continue; } diff --git a/share/examples/ses/srcs/setencstat.c b/share/examples/ses/srcs/setencstat.c index 127f68fa4cf..87a7fa26304 100644 --- a/share/examples/ses/srcs/setencstat.c +++ b/share/examples/ses/srcs/setencstat.c @@ -33,18 +33,21 @@ */ #include +#include +#include #include #include #include #include -#include SESINC +#include +#include int main(int a, char **v) { int fd; long val; - ses_encstat stat; + encioc_enc_status_t stat; if (a != 3) { fprintf(stderr, "usage: %s device enclosure_status\n", *v); @@ -57,9 +60,9 @@ main(int a, char **v) } val = strtol(v[2], NULL, 0); - stat = (ses_encstat) val; - if (ioctl(fd, SESIOC_SETENCSTAT, (caddr_t) &stat) < 0) { - perror("SESIOC_SETENCSTAT"); + stat = (encioc_enc_status_t)val; + if (ioctl(fd, ENCIOC_SETENCSTAT, (caddr_t) &stat) < 0) { + perror("ENCIOC_SETENCSTAT"); } (void) close(fd); return (0); diff --git a/share/examples/ses/srcs/setobjstat.c b/share/examples/ses/srcs/setobjstat.c index 08fdb7b4822..26a5dd19ebc 100644 --- a/share/examples/ses/srcs/setobjstat.c +++ b/share/examples/ses/srcs/setobjstat.c @@ -33,18 +33,21 @@ */ #include +#include +#include #include #include #include #include -#include SESINC +#include +#include int main(int a, char **v) { int fd; int i; - ses_objstat obj; + encioc_elm_status_t obj; long cvt; char *x; @@ -64,7 +67,7 @@ usage: if (x == v[2]) { goto usage; } - obj.obj_id = cvt; + obj.elm_idx = cvt; for (i = 0; i < 4; i++) { x = v[3 + i]; cvt = strtol(v[3 + i], &x, 0); @@ -73,8 +76,8 @@ usage: } obj.cstat[i] = cvt; } - if (ioctl(fd, SESIOC_SETOBJSTAT, (caddr_t) &obj) < 0) { - perror("SESIOC_SETOBJSTAT"); + if (ioctl(fd, ENCIOC_SETELMSTAT, (caddr_t) &obj) < 0) { + perror("ENCIOC_SETELMSTAT"); } (void) close(fd); return (0); diff --git a/share/man/man3/ATOMIC_VAR_INIT.3 b/share/man/man3/ATOMIC_VAR_INIT.3 index 1f85d3b1e85..e2fc5c0e7cc 100644 --- a/share/man/man3/ATOMIC_VAR_INIT.3 +++ b/share/man/man3/ATOMIC_VAR_INIT.3 @@ -139,7 +139,7 @@ It sets the atomic variable .Fa object to its desired .Fa value -and returs the original contents of the atomic variable. +and returns the original contents of the atomic variable. .Pp The .Fn atomic_compare_exchange_strong @@ -203,7 +203,7 @@ The .Fn atomic_fetch_sub macro subtracts the value .Fa operand -to atomic variable +from atomic variable .Fa object and returns the original contents of the atomic variable. .Pp diff --git a/share/man/man3/pthread.3 b/share/man/man3/pthread.3 index caa7f7412e3..9c80f709c8e 100644 --- a/share/man/man3/pthread.3 +++ b/share/man/man3/pthread.3 @@ -452,7 +452,7 @@ Set the thread-specific value for the specified key. .Fa "void \*[lp]*child\*[rp]\*[lp]void\*[rp]" .Fc .Xc -Register fork handlers +Register fork handlers. .It Xo .Ft void .Fn pthread_cleanup_pop "int execute" diff --git a/share/man/man3/pthread_condattr.3 b/share/man/man3/pthread_condattr.3 index e232ef6a37e..d7f8f6b18e8 100644 --- a/share/man/man3/pthread_condattr.3 +++ b/share/man/man3/pthread_condattr.3 @@ -35,7 +35,7 @@ .Nm pthread_condattr_getclock , .Nm pthread_condattr_setclock , .Nm pthread_condattr_getpshared , -.Nm pthread_condattr_setpshared , +.Nm pthread_condattr_setpshared .Nd condition attribute operations .Sh LIBRARY .Lb libpthread diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index dffe304045f..972200daf00 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -4,6 +4,7 @@ MAN= aac.4 \ acpi.4 \ ${_acpi_asus.4} \ + ${_acpi_asus_wmi.4} \ ${_acpi_dock.4} \ ${_acpi_fujitsu.4} \ ${_acpi_hp.4} \ @@ -36,6 +37,7 @@ MAN= aac.4 \ ${_amdsbwd.4} \ ${_amdsmb.4} \ ${_amdtemp.4} \ + ${_bxe.4} \ amr.4 \ an.4 \ ${_apic.4} \ @@ -116,6 +118,7 @@ MAN= aac.4 \ enc.4 \ epair.4 \ esp.4 \ + est.4 \ et.4 \ eventtimers.4 \ exca.4 \ @@ -126,6 +129,7 @@ MAN= aac.4 \ fdt.4 \ fdtbus.4 \ ffclock.4 \ + filemon.4 \ firewire.4 \ fpa.4 \ fwe.4 \ @@ -250,6 +254,8 @@ MAN= aac.4 \ mwlfw.4 \ mxge.4 \ my.4 \ + nand.4 \ + nandsim.4 \ natm.4 \ natmip.4 \ ncr.4 \ @@ -520,6 +526,7 @@ MAN= aac.4 \ ${_vxge.4} \ watchdog.4 \ wb.4 \ + ${_wbwd.4} \ wi.4 \ witness.4 \ wlan.4 \ @@ -542,8 +549,11 @@ MAN= aac.4 \ MLINKS= ae.4 if_ae.4 MLINKS+=age.4 if_age.4 MLINKS+=agp.4 agpgart.4 +MLINKS+=alc.4 if_alc.4 MLINKS+=ale.4 if_ale.4 MLINKS+=altq.4 ALTQ.4 +MLINKS+=ath.4 if_ath.4 +MLINKS+=ath_pci.4 if_ath_pci.4 MLINKS+=an.4 if_an.4 MLINKS+=aue.4 if_aue.4 MLINKS+=axe.4 if_axe.4 @@ -553,9 +563,14 @@ MLINKS+=bge.4 if_bge.4 MLINKS+=bktr.4 brooktree.4 MLINKS+=bridge.4 if_bridge.4 MLINKS+=bwi.4 if_bwi.4 +MLINKS+=bwn.4 if_bwn.4 +MLINKS+=${_bxe.4} ${_if_bxe.4} MLINKS+=cas.4 if_cas.4 +MLINKS+=cdce.4 if_cdce.4 MLINKS+=crypto.4 cryptodev.4 MLINKS+=cue.4 if_cue.4 +MLINKS+=cxgb.4 if_cxgb.4 +MLINKS+=cxgbe.4 if_cxgbe.4 MLINKS+=dc.4 if_dc.4 MLINKS+=de.4 if_de.4 MLINKS+=disc.4 if_disc.4 @@ -601,14 +616,19 @@ MLINKS+=ixgbe.4 if_ixgbe.4 MLINKS+=jme.4 if_jme.4 MLINKS+=kue.4 if_kue.4 MLINKS+=lagg.4 trunk.4 +MLINKS+=lagg.4 if_lagg.4 MLINKS+=le.4 if_le.4 MLINKS+=lge.4 if_lge.4 +MLINKS+=lmc.4 if_lmc.4 MLINKS+=lo.4 loop.4 MLINKS+=lp.4 plip.4 MLINKS+=malo.4 if_malo.4 MLINKS+=md.4 vn.4 MLINKS+=mem.4 kmem.4 MLINKS+=mn.4 if_mn.4 +MLINKS+=mos.4 if_mos.4 +MLINKS+=msk.4 if_msk.4 +MLINKS+=mwl.4 if_mwl.4 MLINKS+=mxge.4 if_mxge.4 MLINKS+=my.4 if_my.4 MLINKS+=${_ndis.4} ${_if_ndis.4} @@ -628,11 +648,13 @@ MLINKS+=re.4 if_re.4 MLINKS+=rl.4 if_rl.4 MLINKS+=rue.4 if_rue.4 MLINKS+=rum.4 if_rum.4 +MLINKS+=run.4 if_run.4 MLINKS+=scsi.4 CAM.4 \ scsi.4 cam.4 \ scsi.4 scbus.4 \ scsi.4 SCSI.4 MLINKS+=sf.4 if_sf.4 +MLINKS+=sge.4 if_sge.4 MLINKS+=sis.4 if_sis.4 MLINKS+=sk.4 if_sk.4 MLINKS+=smp.4 SMP.4 @@ -664,6 +686,7 @@ MLINKS+=vge.4 if_vge.4 MLINKS+=vlan.4 if_vlan.4 MLINKS+=vpo.4 imm.4 MLINKS+=vr.4 if_vr.4 +MLINKS+=vte.4 if_vte.4 MLINKS+=${_vtnet.4} ${_if_vtnet.4} MLINKS+=${_vxge.4} ${_if_vxge.4} MLINKS+=watchdog.4 SW_WATCHDOG.4 @@ -676,6 +699,7 @@ MLINKS+=zyd.4 if_zyd.4 .if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" _acpi_asus.4= acpi_asus.4 +_acpi_asus_wmi.4= acpi_asus_wmi.4 _acpi_dock.4= acpi_dock.4 _acpi_fujitsu.4=acpi_fujitsu.4 _acpi_hp.4= acpi_hp.4 @@ -694,6 +718,7 @@ _amdsmb.4= amdsmb.4 _amdtemp.4= amdtemp.4 _asmc.4= asmc.4 _atp.4= atp.4 +_bxe.4= bxe.4 _coretemp.4= coretemp.4 _cpuctl.4= cpuctl.4 _dpms.4= dpms.4 @@ -703,6 +728,7 @@ _hptmv.4= hptmv.4 _hptrr.4= hptrr.4 _i8254.4= i8254.4 _ichwd.4= ichwd.4 +_if_bxe.4= if_bxe.4 _if_ndis.4= if_ndis.4 _if_nfe.4= if_nfe.4 _if_nve.4= if_nve.4 @@ -733,6 +759,7 @@ _spkr.4= spkr.4 _tpm.4= tpm.4 _urtw.4= urtw.4 _viawd.4= viawd.4 +_wbwd.4= wbwd.4 _wpi.4= wpi.4 _xen.4= xen.4 _xnb.4= xnb.4 @@ -743,6 +770,9 @@ MLINKS+=lindev.4 full.4 .if ${MACHINE_CPUARCH} == "amd64" _qlxgb.4= qlxgb.4 _sfxge.4= sfxge.4 + +MLINKS+=qlxgb.4 if_qlxgb.4 +MLINKS+=sfxge.4 if_sfxge.4 .endif .if ${MACHINE_CPUARCH} == "powerpc" diff --git a/share/man/man4/acpi.4 b/share/man/man4/acpi.4 index faedb066465..9d571288116 100644 --- a/share/man/man4/acpi.4 +++ b/share/man/man4/acpi.4 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 22, 2012 +.Dd May 4, 2012 .Dt ACPI 4 .Os .Sh NAME @@ -198,6 +198,11 @@ entry for access after boot. Enables loading of a custom ACPI DSDT. .It Va acpi_dsdt_name Name of the DSDT table to load, if loading is enabled. +.It Va debug.acpi.cpu_unordered +Do not use the MADT to match ACPI Processor objects to CPUs. +This is needed on a few systems with a buggy BIOS that does not use +consistent processor IDs. +Default is 0 (disabled). .It Va debug.acpi.disabled Selectively disables portions of ACPI for debugging purposes. .It Va debug.acpi.interpreter_slack diff --git a/share/man/man4/acpi_asus.4 b/share/man/man4/acpi_asus.4 index f3b99daf522..1921adc771a 100644 --- a/share/man/man4/acpi_asus.4 +++ b/share/man/man4/acpi_asus.4 @@ -157,6 +157,7 @@ Defaults for these variables can be set in which is parsed at boot-time. .Sh SEE ALSO .Xr acpi 4 , +.Xr acpi_asus_wmi 4 , .Xr acpi_video 4 , .Xr sysctl.conf 5 , .Xr sysctl 8 diff --git a/share/man/man4/acpi_asus_wmi.4 b/share/man/man4/acpi_asus_wmi.4 new file mode 100644 index 00000000000..129894be128 --- /dev/null +++ b/share/man/man4/acpi_asus_wmi.4 @@ -0,0 +1,90 @@ +.\" +.\" Copyright (c) 2012 Alexander Motin +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd July 2, 2012 +.Dt ACPI_ASUS_WMI 4 +.Os +.Sh NAME +.Nm acpi_asus_wmi +.Nd Asus Laptop WMI Extras +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following line in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device acpi_asus_wmi" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following line in +.Xr loader.conf 5 : +.Bd -literal -offset indent +acpi_asus_wmi_load="YES" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides support for the extra WMI-controlled gadgets, such as hotkeys +and leds, found on Asus laptops. +It allows one to use the +.Xr sysctl 8 +interface to manipulate the brightness of the LCD panel and keyboard backlight, +power on/off different internal components, such as WiFi, Bluetooth, camera, +cardreader, etc, read some sensors. +Hotkey events are passed to +.Xr devd 8 +for easy handling in userspace with the default configuration in +.Pa /etc/devd/asus.conf . +Some hotkey events, such as keyboard backlight and touchpad control, are +handled inside the driver. +.Sh SYSCTL VARIABLES +The following sysctls are currently implemented: +.Bl -tag -width indent +.It Va dev.acpi_asus_wmi.0.handle_keys +Specifies whether driver should handle some harwdare keys, such as keyboard +backlight, internally. +.El +.Pp +Number of other variables under the same sysctl branch are model-specific. +.Pp +Defaults for these variables can be set in +.Xr sysctl.conf 5 , +which is parsed at boot-time. +.Sh SEE ALSO +.Xr acpi 4 , +.Xr acpi_asus 4 , +.Xr acpi_video 4 , +.Xr sysctl.conf 5 , +.Xr devd 8 , +.Xr sysctl 8 +.Sh HISTORY +The +.Nm +driver first appeared in +.Fx 10.0 . +.Sh AUTHORS +.An Alexander Motin Aq mav@FreeBSD.org . diff --git a/share/man/man4/acpi_hp.4 b/share/man/man4/acpi_hp.4 index dbb0ca01e04..028d19a491c 100644 --- a/share/man/man4/acpi_hp.4 +++ b/share/man/man4/acpi_hp.4 @@ -261,7 +261,7 @@ device driver first appeared in The .Nm driver was written by -.An Michael Gmelin Aq freebsd@grem.de +.An Michael Gmelin Aq freebsd@grem.de . .Pp It has been inspired by hp-wmi driver, which implements a subset of these features (hotkeys) on Linux. @@ -275,7 +275,7 @@ http://www.microsoft.com/whdc/system/pnppwr/wmi/wmi-acpi.mspx .El .Pp This manual page was written by -.An Michael Gmelin Aq freebsd@grem.de +.An Michael Gmelin Aq freebsd@grem.de . .Sh BUGS This driver is experimental and has only been tested on i386 on an HP Compaq 8510p which featured all supported wireless devices (WWAN/BT/WLAN). diff --git a/share/man/man4/acpi_ibm.4 b/share/man/man4/acpi_ibm.4 index 376b64d109c..4aa6d9fa5c0 100644 --- a/share/man/man4/acpi_ibm.4 +++ b/share/man/man4/acpi_ibm.4 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 8, 2010 +.Dd June 24, 2012 .Dt ACPI_IBM 4 .Os .Sh NAME @@ -335,6 +335,17 @@ Built-in battery .It UltraBay battery .El +.It Va dev.acpi_ibm.0.handlerevents +.Xr devd 8 +events handled by +.Nm +when +.Va events +is set to 1. +Events are specified as a whitespace-separated list of event code in +hexadecimal or decimal form. +Note that the event maybe handled twice (eg. Brightness up/down) if ACPI BIOS +already handled the event. .El .Pp Defaults for these sysctls can be set in @@ -436,6 +447,19 @@ then fi exit 0 .Ed +.Pp +The following example specify that event code 0x04 (Suspend to RAM), +0x10 (Brightness up) and 0x11 (Brightness down) are handled by +.Nm . +.Bd -literal -offset indent +sysctl dev.acpi_ibm.0.handlerevents='0x04 0x10 0x11' +.Ed +.Pp +in +.Xr sysctl.conf 5 : +.Bd -literal -offset indent +dev.acpi_ibm.0.handlerevents=0x04\\ 0x10\\ 0x11 +.Ed .Sh SEE ALSO .Xr acpi 4 , .Xr led 4 , diff --git a/share/man/man4/acpi_panasonic.4 b/share/man/man4/acpi_panasonic.4 index d02a16e3ffd..5458a3162ea 100644 --- a/share/man/man4/acpi_panasonic.4 +++ b/share/man/man4/acpi_panasonic.4 @@ -68,7 +68,7 @@ sound mute state via .Ss Hotkeys There are 9 hotkeys available on the supported hardware: .Pp -.Bl -tag -compact -offset indent +.Bl -tag -width 10n -compact -offset indent .It Sy Fn+F1 Make LCD backlight darker. .It Sy Fn+F2 @@ -105,7 +105,7 @@ When notified to .Xr devd 8 , the hotkey event provides the following information: .Pp -.Bl -tag -compact -offset indent +.Bl -tag -width 10n -compact -offset indent .It system .Qq Li ACPI .It subsystem @@ -119,7 +119,7 @@ Event code (see below). .El .Pp Event codes to be generated are assigned as follows: -.Bl -tag -offset indent +.Bl -tag -width 10n -offset indent .It 0x81-0x86, 0x89 .Sy Fn+F pressed. diff --git a/share/man/man4/acpi_wmi.4 b/share/man/man4/acpi_wmi.4 index 12ecdfaf62f..28bd0da2ec8 100644 --- a/share/man/man4/acpi_wmi.4 +++ b/share/man/man4/acpi_wmi.4 @@ -85,12 +85,12 @@ device driver first appeared in The .Nm driver was written by -.An Michael Gmelin Aq freebsd@grem.de +.An Michael Gmelin Aq freebsd@grem.de . .Pp -Work has been inspired by the Linux acpi-wmi driver written by Carlos Corbacho +Work has been inspired by the Linux acpi-wmi driver written by Carlos Corbacho. .Pp See http://www.microsoft.com/whdc/system/pnppwr/wmi/wmi-acpi.mspx for the specification of ACPI-WMI. .Pp This manual page was written by -.An Michael Gmelin Aq freebsd@grem.de +.An Michael Gmelin Aq freebsd@grem.de . diff --git a/share/man/man4/ahci.4 b/share/man/man4/ahci.4 index 622875c8e93..0b1cd13c305 100644 --- a/share/man/man4/ahci.4 +++ b/share/man/man4/ahci.4 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 6, 2011 +.Dd June 18, 2012 .Dt AHCI 4 .Os .Sh NAME @@ -51,8 +51,9 @@ The following tunables are settable from the .Xr loader 8 : .Bl -ohang .It Va hint.ahci. Ns Ar X Ns Va .msi -controls Message Signaled Interrupts (MSI) usage by the specified controller -.Bl -tag -compact +controls Message Signaled Interrupts (MSI) usage by the specified controller. +.Pp +.Bl -tag -width 4n -offset indent -compact .It 0 MSI disabled; .It 1 @@ -72,7 +73,8 @@ controls SATA interface Power Management for the specified channel, allowing some power to be saved at the cost of additional command latency. Possible values: -.Bl -tag -compact +.Pp +.Bl -tag -width 4n -offset indent -compact .It 0 interface Power Management is disabled (default); .It 1 @@ -86,6 +88,7 @@ driver initiates PARTIAL PM state transition 1ms after port becomes idle; .It 5 driver initiates SLUMBER PM state transition 125ms after port becomes idle. .El +.Pp Some controllers, such as ICH8, do not implement modes 2 and 3 with NCQ used. Because of artificial entering latency, performance degradation in modes 4 and 5 is much smaller then in modes 2 and 3. @@ -98,7 +101,8 @@ setting to nonzero value limits maximum SATA revision (speed). Values 1, 2 and 3 are respectively 1.5, 3 and 6Gbps. .It Va hw.ahci.force setting to nonzero value forces driver attach to some known AHCI-capable -chips even if they are configured for legacy IDE emulation. Default is 1. +chips even if they are configured for legacy IDE emulation. +Default is 1. .El .Sh DESCRIPTION This driver provides the diff --git a/share/man/man4/ata.4 b/share/man/man4/ata.4 index d2ac57aaabc..939c8b1ecc3 100644 --- a/share/man/man4/ata.4 +++ b/share/man/man4/ata.4 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd August 17, 2011 +.Dd June 18, 2012 .Dt ATA 4 .Os .Sh NAME @@ -89,8 +89,12 @@ subsystem module. The following tunables are settable from the .Xr loader 8 : .Bl -ohang +.It Va hw.ahci.force +set to nonzero value for forcing drivers to attach to some known AHCI-capable +chips even if they are configured for legacy IDE emulation (the default is 1, +force the attach). .It Va hw.ata.ata_dma_check_80pin -set to 0 to disable the 80pin cable check (the default is 1, check the cable) +set to 0 to disable the 80pin cable check (the default is 1, check the cable). .It Va hint.atapci.X.msi set to 1 to allow Message Signalled Interrupts (MSI) to be used by the specified PCI ATA controller, if supported. @@ -102,7 +106,8 @@ limits the initial ATA mode for every device on the specified channel. controls SATA interface Power Management for the specified channel, allowing some power savings at the cost of additional command latency. Possible values: -.Bl -tag -compact +.Pp +.Bl -tag -width 4n -offset indent -compact .It 0 Interface Power Management is disabled. This is the default value. @@ -113,6 +118,7 @@ The host initiates a PARTIAL PM state transition every time a port becomes idle. .It 3 host initiates SLUMBER PM state transition every time port becomes idle. .El +.Pp Modes 2 and 3 are only supported for AHCI. .El .Sh DESCRIPTION diff --git a/share/man/man4/ath.4 b/share/man/man4/ath.4 index e145853ac50..8ae8cd7bebb 100644 --- a/share/man/man4/ath.4 +++ b/share/man/man4/ath.4 @@ -186,7 +186,7 @@ ifconfig wlan0 meshid my_mesh mode 11a inet 192.168.0.10/24 .Ed .Pp Create two virtual 802.11a host-based access points, one with -with WEP enabled and one with no security, and bridge them to +WEP enabled and one with no security, and bridge them to the fxp0 (wired) device: .Bd -literal -offset indent ifconfig wlan0 create wlandev ath0 wlanmode hostap \e @@ -221,7 +221,7 @@ data frames failed. This should not happen. .It "ath%d: unable to setup a beacon xmit queue!" The request to the HAL to set up the transmit queue for 802.11 beacon frames -frames failed. +failed. This should not happen. .It "ath%d: 802.11 address: %s" The MAC address programmed in the EEPROM is displayed. diff --git a/share/man/man4/atp.4 b/share/man/man4/atp.4 index ed7b4d3ab92..10bb41f35c4 100644 --- a/share/man/man4/atp.4 +++ b/share/man/man4/atp.4 @@ -171,10 +171,10 @@ consoles as well as in X change it to: .Xr loader.conf 5 , .Xr xorg.conf 5 Pq Pa ports/x11/xorg , .Xr moused 8 , -.Xr sysctl 8 . +.Xr sysctl 8 .Sh AUTHORS .An -nosplit The .Nm driver was written by -.An Rohit Grover Aq rgrover1@gmail.com +.An Rohit Grover Aq rgrover1@gmail.com . diff --git a/share/man/man4/bce.4 b/share/man/man4/bce.4 index 090c47775a9..28fdf6aeffa 100644 --- a/share/man/man4/bce.4 +++ b/share/man/man4/bce.4 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 7, 2009 +.Dd June 4, 2012 .Dt BCE 4 .Os .Sh NAME @@ -200,9 +200,73 @@ variables and .Xr loader 8 tunables: .Bl -tag -width indent +.It Va hw.bce.verbose +Enable/Disable verbose logging and output to the console. +Useful for debugging (default 0). .It Va hw.bce.msi_enable -Whether or not MSI support is enabled in the driver. -The default value is 1. +Enable/Disable MSI support (default 1). +.It Va hw.bce.tso_enable +Enable/Disable TSO support (default 1). +.It Va hw.bce.strict_rx_mtu +Enable/Disable strict RX frame size checking (default 0). +.It Va hw.bce.hdr_split +Enable/Disable frame header/payload splitting (default 1). +.It Va hw.bce.rx_pages +Set the number of memory pages assigned to recieve packets by the driver. +Due to alignment issues, this value can only be of the set +1, 2, 4 or 8 (default 2). +.It Va hw.bce.tx_pages +Set the number of memory pages assigned to transmit packets +by the driver. +Due to alignment issues, this value can only be of the set +1, 2, 4 or 8 (default 2). +.It Va hw.bce.rx_ticks +Time in microsecond ticks to wait before generating a status +block updates due to RX processing activity. +Values from 0-100 are valid. +A value of 0 disables this status block update. +Cannot be set to 0 if hw.bce.rx_quick_cons_trip is also 0 +(default 18). +.It Va hw.bce.rx_ticks_int +Time in microsecond ticks to wait during RX interrupt +processing before generating a status block update. +Values from 0-100 are valid. +Valid values are in the range from 0-100. +A value of 0 disables this status block update (default 18). +.It Va hw.bce.rx_quick_cons_trip +Number of RX Quick BD Chain entries that must be completed +before a status block is generated. +Values from 0-256 are valid. +A value of 0 disables this status block update. +Cannot be set to 0 if hw.bce.rx_ticks is also 0 (default 6). +.It Va hw.bce.rx_quick_cons_trip_int +Number of RX quick BD entries that must be completed before +a status block is generated duing interrupt processing. +Values from 0-256 are valid. +A value of 0 disables this status block update (default 6). +.It Va hw.bce.tx_ticks +Time in microsecond ticks to wait before a status block +update is generated due to TX activitiy. +Values from 0-100 are valid. +A value of 0 disables this status block update. +Cannot be set to 0 if hw.bce.tx_quick_cons_trip is also 0 +(default 80). +.It Va hw.bce.tx_ticks_int +Time in microsecond ticks to wait in interrupt processing +before a status block update is generated due to TX activity +Values from 0-100 are valid. +A value of 0 disables this status block update (default 80). +.It Va hw.bce.tx_cons_trip +How many TX Quick BD Chain entries that must be completed +before a status block is generated. +Values from 0-100 are valid. +A value of 0 disables this status block update. +Cannot be set to 0 if hw.bce.tx_ticks is also 0 (default 20). +.It Va hw.bce.tx_cons_trip_int +How many TX Quick BD Chain entries that must be completed +before a status block is generated during an interrupt. +Values from 0-100 are valid. +A value of 0 disables this status block update (default 20). .El .Sh DIAGNOSTICS .Bl -diag @@ -346,6 +410,10 @@ with the cable connection, or a driver logic problem has occurred.. A controller hardware failure has occurred. If the problem continues replace the controller. .El +.Sh SUPPORT +For general information and support, +go to the Broadcom NIC Open Source Developer Resource Site: +.Pa http://www.broadcom.com/support/ethernet_nic/open_source.php . .Sh SEE ALSO .Xr altq 4 , .Xr arp 4 , diff --git a/share/man/man4/bpf.4 b/share/man/man4/bpf.4 index a3179204467..4095f5e6294 100644 --- a/share/man/man4/bpf.4 +++ b/share/man/man4/bpf.4 @@ -642,7 +642,7 @@ struct bpf_xhdr { uint32_t bh_caplen; /* length of captured portion */ uint32_t bh_datalen; /* original length of packet */ u_short bh_hdrlen; /* length of bpf header (this struct - plus alignment padding */ + plus alignment padding) */ }; struct bpf_hdr { @@ -650,7 +650,7 @@ struct bpf_hdr { uint32_t bh_caplen; /* length of captured portion */ uint32_t bh_datalen; /* original length of packet */ u_short bh_hdrlen; /* length of bpf header (this struct - plus alignment padding */ + plus alignment padding) */ }; .Ed .Pp diff --git a/share/man/man4/bridge.4 b/share/man/man4/bridge.4 index 09e1dadf39b..1fadc5747b4 100644 --- a/share/man/man4/bridge.4 +++ b/share/man/man4/bridge.4 @@ -410,7 +410,8 @@ Note that .Fx 6.1, 6.2, 6.3, 7.0, 7.1, and 7.2 have a bug in the EtherIP protocol. For more details and workaround, see -.Xr gif 4 manual page. +.Xr gif 4 +manual page. .Sh SEE ALSO .Xr gif 4 , .Xr ipf 4 , diff --git a/share/man/man4/bxe.4 b/share/man/man4/bxe.4 new file mode 100644 index 00000000000..588900f3021 --- /dev/null +++ b/share/man/man4/bxe.4 @@ -0,0 +1,138 @@ +.\" Copyright (c) 2012 Edward Tomasz Napierala +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd June 25, 2012 +.Dt BXE 4 +.Os +.Sh NAME +.Nm bxe +.Nd "Broadcom BCM57710/BCM57711/BCM57711E 10Gb Ethernet adapter driver" +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device bxe" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following line in +.Xr loader.conf 5 : +.Bd -literal -offset indent +if_bxe_load="YES" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides support for PCIe 10GbE Ethernet adapters based on +BCM5771x chips. +The driver supports Jumbo Frames, VLAN tagging, IP, UDP and TCP checksum +offload, MSI-X, TCP Segmentation Offload (TSO), Large Receive Offload (LRO), +and Receive Side Steering (RSS). +.Pp +For more information on configuring this device, see +.Xr ifconfig 8 . +.Sh HARDWARE +The +.Nm +driver provides support for various NICs based on the Broadcom BCM5771x +family of 10GbE Ethernet controller chips, including the +following: +.Pp +.Bl -bullet -compact +.It +Broadcom NetXtreme II BCM57710 10GbE +.It +Broadcom NetXtreme II BCM57711 10GbE +.It +Broadcom NetXtreme II BCM57711E 10GbE +.El +.Sh SYSCTL VARIABLES +The following variables are available as both +.Xr sysctl 8 +variables and +.Xr loader 8 +tunables: +.Bl -tag -width indent +.It Va hw.bxe.dcc_enable +Enable HP Flex-10 support. +Allowed values are 0 to disable and 1 to enable. +The default value is 0. +.It Va hw.bxe.tso_enable +Enable TCP Segmentation Offload. +The default value is 1. +.It Va hw.bxe.int_mode +Set interrupt mode. +Allowed values are 0 for IRQ, 1 for MSI/IRQ and 2 for MSI-X/MSI/IRQ. +The default value is 2. +.It Va hw.bxe.queue_count +Specify the number of queues that will be used when a multi-queue +RSS mode is selected using bxe_multi_mode. +Allowed values are 0 for Auto or 1 to 16 for fixed number of queues. +The default value is 0. +.It Va hw.bxe.multi_mode +Enable Receive Side Steering. +Allowed values are 0, which disables all multi-queue/packet sorting +algorithms, and 1, which assigns incoming frames to receive queues +according to RSS. +The default value is 0. +.It Va hw.bxe.rx_ticks +Control interrupt coalescing for received frames. +The first frame always causes an interrupt, but subsequent frames +are coalesced until the RX/TX ticks timer value expires and another +interrupt occurs. +The default value is 25. +.It Va hw.bxe.tx_ticks +Control interrupt coalescing for trasmitted frames. +The first frame always causes an interrupt, but subsequent frames +are coalesced until the RX/TX ticks timer value expires and another +interrupt occurs. +The default value is 50. +.It Va hw.bxe.mrrs +Allows to set the PCIe maximum read request size. +Allowed values are -1 for Auto, 0 for 128B, 1 for 256B, 2 for 512B, +and 3 for 1kB. +The default value is -1. +.El +.Sh SEE ALSO +.Xr altq 4 , +.Xr arp 4 , +.Xr netintro 4 , +.Xr ng_ether 4 , +.Xr vlan 4 , +.Xr ifconfig 8 +.Sh HISTORY +The +.Nm +device driver first appeared in +.Fx 9.0 . +.Sh AUTHORS +The +.Nm +driver was written by +.An Gary Zambrano Aq zambrano@broadcom.com +and +.An David Christensen Aq davidch@broadcom.com . diff --git a/share/man/man4/capsicum.4 b/share/man/man4/capsicum.4 index 980ab79152e..39619f9b73b 100644 --- a/share/man/man4/capsicum.4 +++ b/share/man/man4/capsicum.4 @@ -55,7 +55,7 @@ A process mode, entered by invoking in which access to global OS namespaces (such as the file system and PID namespaces) is restricted; only explicitly delegated rights, referenced by memory mappings or file descriptors, may be used. -Once set, the flag is inherited by future children proceses, and may not be +Once set, the flag is inherited by future children processes, and may not be cleared. .It capabilities File descriptors that wrap other file descriptors, masking operations that can diff --git a/share/man/man4/carp.4 b/share/man/man4/carp.4 index a7348248738..6a45703f79f 100644 --- a/share/man/man4/carp.4 +++ b/share/man/man4/carp.4 @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 22, 2012 +.Dd May 30, 2012 .Dt CARP 4 .Os .Sh NAME @@ -42,8 +42,8 @@ addresses are always available. .Pp To use .Nm , -the administrator needs to configure at minimum a common virtual host ID -(vhid) and attach at least one IP address to this vhid on each machine which +the administrator needs to configure at a minimum a common virtual host ID +(vhid), and attach at least one IP address to this vhid on each machine which is to take part in the virtual group. Additional parameters can also be set on a per-vhid basis: .Cm advbase @@ -72,13 +72,13 @@ Both and .Cm advskew are put inside CARP advertisements. -These configurations can be done using +These values can be configured using .Xr ifconfig 8 , or through the .Dv SIOCSVH .Xr ioctl 2 . .Pp -CARP virtual hosts can be configured on multicast capable interfaces: Ethernet, +CARP virtual hosts can be configured on multicast-capable interfaces: Ethernet, layer 2 VLAN, FDDI and Token Ring. An arbitrary number of virtual host IDs can be configured on an interface. An arbitrary number of IPv4 or IPv6 addresses can be attached to a particular @@ -91,7 +91,7 @@ elections independently. .Pp Additionally, there are a number of global parameters which can be set using .Xr sysctl 8 : -.Bl -tag -width ".Va net.inet.carp.preempt" +.Bl -tag -width ".Va net.inet.carp.ifdown_demotion_factor" .It Va net.inet.carp.allow Accept incoming .Nm @@ -103,14 +103,17 @@ When enabled, a vhid in a backup state would preempt a master that is announcing itself with a lower advskew. Disabled by default. .It Va net.inet.carp.log -Value of 0 disables any logging. -Value of 1 enables logging state changes of +Determines what events relating to +.Nm +vhids are logged. +A value of 0 disables any logging. +A value of 1 enables logging state changes of .Nm vhids. Values above 1 enable logging of bad .Nm packets. -Default value is 1. +The default value is 1. .It Va net.inet.carp.demotion This value shows current level of CARP demotion. The value is added to the actual advskew sent in announcements for @@ -123,44 +126,48 @@ running a vhid goes down, or while the .Xr pfsync 4 interface is not synchronized. The demotion value is writable, so that user may alter it -depending on some external conditions, for example on status of some +depending on some external conditions, for example on the status of some daemon utility. -However, altering the value should be performed with care, do +However, altering the value should be performed with care, so as to not conflict with subsystems that adjust demotion factor automatically: .Nm and .Xr pfsync 4 . .It Va net.inet.carp.ifdown_demotion_factor -Value added to +This value is added to .Va net.inet.carp.demotion -when interface running a vhid goes down. -Default value is 240 (maximum advskew value). +when an interface running a vhid goes down. +The default value is 240 (the maximum advskew value). .It Va net.inet.carp.senderr_demotion_factor -Value added to +This value is added to .Va net.inet.carp.demotion when .Nm experiences errors sending its announcements. -Default value is 240 (maximum advskew value). +The default value is 240 (the maximum advskew value). .El .\".Sh ARP level load balancing -.\"The +.\"A .\".Nm -.\"has limited abilities for load balancing the incoming connections -.\"between hosts in Ethernet network. -.\"For load balancing operation, one needs several CARP interfaces that +.\"interface has limited abilities for load balancing incoming connections +.\"between hosts in an Ethernet network. +.\"For load-balancing operation, one needs several CARP interfaces that .\"are configured to the same IP address, but to a different vhids. .\"Once an ARP request is received, the CARP protocol will use a hashing .\"function against the source IP address in the ARP request to determine -.\"which vhid should this request belong to. -.\"If the corresponding CARP interface is in master state, the ARP request -.\"will be replied, otherwise it will be ignored. +.\"which vhid the request will be assigned to. +.\"If the corresponding CARP interface is the current +.\"master interface, a reply will +.\"be sent to the ARP request; +.\"otherwise it will be ignored. .\"See the .\".Sx EXAMPLES .\"section for a practical example of load balancing. .\".Pp -.\"The ARP load balancing has some limitations. +.\"The ARP load balancing implemented in +.\".Nm +.\"has some limitations. .\"First, ARP balancing only works on the local network segment. .\"It cannot balance traffic that crosses a router, because the .\"router itself will always be balanced to the same virtual host. @@ -170,10 +177,11 @@ Default value is 240 (maximum advskew value). .\"is dangerous, because this creates a race condition between .\"balanced routers and a host they are serving. .\"Imagine an incoming packet creating state on the first router, being -.\"forwarded to its destination, and destination replying faster +.\"forwarded to its destination, and the destination replying faster .\"than the state information is packed and synced with the second router. .\"If the reply would be load balanced to second router, it will be -.\"dropped due to no state. +.\"dropped since the second router has not yet received information about +.\"the connection state. .Sh STATE CHANGE NOTIFICATIONS Sometimes it is useful to get notified about .Nm @@ -183,11 +191,12 @@ This can be accomplished by using hooks. Master/slave events are signalled under system .Dv CARP . -Subsystem specifies vhid and name of interface, where event occurred. -Type of the message displays new state of vhid. +The subsystem specifies the vhid and name of the interface where +the master/slave event occurred. +The type of the message displays the new state of the vhid. Please see .Xr devd.conf 5 -and +and the .Sx EXAMPLES section for more information. .Sh EXAMPLES @@ -195,8 +204,8 @@ For firewalls and routers with multiple interfaces, it is desirable to failover all of the addresses running .Nm together, when one of the physical interfaces goes down. -This is achieved by the preempt option. -Enable it on both host A and B: +This is achieved by the use of the preempt option. +Enable it on both hosts A and B: .Pp .Dl sysctl net.inet.carp.preempt=1 .Pp @@ -295,7 +304,6 @@ The device was imported into .Fx 5.4 . In -.Fx 10.0 -the +.Fx 10.0 , .Nm was significantly rewritten, and is no longer a pseudo-interface. diff --git a/share/man/man4/ch.4 b/share/man/man4/ch.4 index b45ecaa0d53..d097d54ab6e 100644 --- a/share/man/man4/ch.4 +++ b/share/man/man4/ch.4 @@ -187,7 +187,7 @@ u_int cp_ndrives; /* number of drives */ This call can be used by applications to query the dimensions of the jukebox before using the .Dv CHIGSTATUS -ioctl to query the jukebox' status. +ioctl to query the jukebox status. .It Dv CHIOIELEM Perform the .Sy INITIALIZE ELEMENT STATUS @@ -230,7 +230,8 @@ base address and number of elements for which information is to be returned in the array of .Vt changer_element_status structures pointed to by the -.Va cesr_element_status field . +.Va cesr_element_status +field. The application must allocate enough memory for .Va cesr_element_count diff --git a/share/man/man4/cpuctl.4 b/share/man/man4/cpuctl.4 index 9e3a2aaf783..ed80f8aae1c 100644 --- a/share/man/man4/cpuctl.4 +++ b/share/man/man4/cpuctl.4 @@ -124,8 +124,8 @@ For additional information refer to .Sh RETURN VALUES .Bl -tag -width Er .It Bq Er ENXIO -The operation requested is not supported by the device (e.g. unsupported -architecture or the CPU is disabled) +The operation requested is not supported by the device (e.g., unsupported +architecture or the CPU is disabled). .It Bq Er EINVAL Incorrect request was supplied, or microcode image is not correct. .It Bq Er ENOMEM diff --git a/share/man/man4/cpufreq.4 b/share/man/man4/cpufreq.4 index d4a2a3fad07..850660e1b11 100644 --- a/share/man/man4/cpufreq.4 +++ b/share/man/man4/cpufreq.4 @@ -286,6 +286,7 @@ then it should set all elements to .Dv CPUFREQ_VAL_UNKNOWN . .Sh SEE ALSO .Xr acpi 4 , +.Xr est 4 , .Xr timecounters 4 , .Xr powerd 8 , .Xr sysctl 8 diff --git a/share/man/man4/cxgbe.4 b/share/man/man4/cxgbe.4 index 88d42e3f3b3..882bcf7072b 100644 --- a/share/man/man4/cxgbe.4 +++ b/share/man/man4/cxgbe.4 @@ -1,4 +1,4 @@ -.\" Copyright (c) 2011, Chelsio Inc +.\" Copyright (c) 2011-2012, Chelsio Inc .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -145,10 +145,9 @@ dev.cxgbe.X.holdoff_tmr_idx sysctl. The packet-count index value to use to delay interrupts. The packet-count list has the values 1, 8, 16, and 32 by default and the index selects a value from this list. -The default value is 2 for both 10Gb and 1Gb ports, which means 16 -packets (or the holdoff timer going off) before an interrupt is -generated. --1 disables packet counting. +The default value is -1 for both 10Gb and 1Gb ports, which means packet +counting is disabled and interrupts are generated based solely on the +holdoff timer value. Different cxgbe interfaces can be assigned different values via the dev.cxgbe.X.holdoff_pktc_idx sysctl. This sysctl works only when the interface has never been marked up (as done by @@ -221,7 +220,7 @@ email all the specific information related to the issue to The .Nm device driver first appeared in -.Fx 9.0 +.Fx 9.0 . .Sh AUTHORS .An -nosplit The diff --git a/share/man/man4/dcons.4 b/share/man/man4/dcons.4 index d3a49c2c92b..91bb4b45916 100644 --- a/share/man/man4/dcons.4 +++ b/share/man/man4/dcons.4 @@ -104,7 +104,7 @@ If you want to use as a .Xr gdb 1 port, add the following line into -.Xr loader.conf 5 +.Xr loader.conf 5 : .Bd -literal -offset indent dcons_gdb="1" .Ed diff --git a/share/man/man4/ddb.4 b/share/man/man4/ddb.4 index c174b51ba56..cefa7dd4f6a 100644 --- a/share/man/man4/ddb.4 +++ b/share/man/man4/ddb.4 @@ -1031,14 +1031,14 @@ Number of allocations requests to the given zone. .Pp The very same information might be gathered in the userspace with the help of -.Dq Nm vmstat Fl z +.Dq Nm vmstat Fl z . .\" .Pp .It Ic show Cm unpcb Ar addr Shows UNIX domain socket private control block .Vt struct unpcb present at the address -.Ar addr +.Ar addr . .\" .Pp .It Ic show Cm vmochk @@ -1305,7 +1305,7 @@ command may be used to define a script by name. Scripts consist of a series of .Nm commands separated with the -.Ic ; +.Ql \&; character. For example: .Bd -literal -offset indent diff --git a/share/man/man4/divert.4 b/share/man/man4/divert.4 index d0e67857b1c..d22275ec630 100644 --- a/share/man/man4/divert.4 +++ b/share/man/man4/divert.4 @@ -21,7 +21,7 @@ kernel configuration file: .Ed .Pp Alternatively, to load -.Ns Nm +the driver as a module at boot time, add the following lines into the .Xr loader.conf 5 file: diff --git a/share/man/man4/epair.4 b/share/man/man4/epair.4 index 899bd5fce68..85e2ea014eb 100644 --- a/share/man/man4/epair.4 +++ b/share/man/man4/epair.4 @@ -33,7 +33,7 @@ .Os .Sh NAME .Nm epair -.Nd A pair of virtual back-to-back connected Ethernet interfaces. +.Nd A pair of virtual back-to-back connected Ethernet interfaces .Sh SYNOPSIS To compile this driver into the kernel, place the following line in your diff --git a/share/man/man4/est.4 b/share/man/man4/est.4 new file mode 100644 index 00000000000..f1b5832af73 --- /dev/null +++ b/share/man/man4/est.4 @@ -0,0 +1,98 @@ +.\" +.\" Copyright (c) 2012 Sean Bruno +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd June 12, 2012 +.Dt EST 4 +.Os +.Sh NAME +.Nm est +.Nd Enhanced Speedstep Technology +.Sh SYNOPSIS +To compile this capability into your kernel +place the following line in your kernel +configuration file: +.Bd -ragged -offset indent +.Cd "device cpufreq" +.Ed +.Sh DESCRIPTION +The +.Nm +interface provides support for the Intel Enhanced Speedstep Technology. +.Pp +Note that +.Nm +capabilities are automatically loaded by the +.Xr cpufreq 4 +driver. +.Sh LOADER TUNABLES +The +.Nm +interface is intended to allow +.Xr cpufreq 4 +to access and implement Intel Enhanced SpeedStep Technology via +.Xr acpi 4 +and the acpi_perf interface accessors. +If the default settings are not optimal, the following sysctls can be +used to modify or monitor +.Nm +behavior. +.Bl -tag -width indent +.It hw.est.msr_info +Attempt to infer information from direct probing of the msr. +Should only be used in diagnostic cases +.Pq default 0 +.It hw.est.strict +Validate frequency requested is accepted by the cpu when set. +It appears that this will only work on single core cpus. +.Pq default 0 +.El +.Sh DIAGNOSTICS +.Bl -diag +.It "est%d: on cpu%d" +.Pp +Indicates normal startup of this interface. +.It "est: CPU supports Enhanced Speedstep, but is not recognized." +.It "est: cpu_vendor GenuineIntel, msr 471c471c0600471c" +.It "device_attach: est%d attach returned 6" +.Pp +Indicates all attempts to attach to this interface have failed. +This usually indicates an improper BIOS setting restricting O/S +control of the CPU speeds. +Consult your BIOS documentation for more details. +.El +.Sh COMPATIBILITY +.Nm +is only found on supported Intel CPUs. +.Sh SEE ALSO +.Xr cpufreq 4 +.Rs +.%T "Intel 64 and IA-32 Architectures Software Developer Manuals" +.%U "http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html" +.Re +.Sh AUTHORS +This manual page was written by +.An Sean Bruno Aq sbruno@FreeBSD.org . diff --git a/share/man/man4/fdt.4 b/share/man/man4/fdt.4 index cd3312bd0af..12542d05ac3 100644 --- a/share/man/man4/fdt.4 +++ b/share/man/man4/fdt.4 @@ -143,8 +143,10 @@ The primary option for enabling support in the kernel. It covers all low-level and infrastructure parts of .Nm kernel support, which primarily are the -.Xr fdtbus 4 and -.Xr simplebus 4 drivers, as well as helper routines and libraries. +.Xr fdtbus 4 +and +.Xr simplebus 4 +drivers, as well as helper routines and libraries. .It Va makeoptions FDT_DTS_FILE=.dts Specifies a preferred (default) device tree source (DTS) file for a given kernel. The indicated DTS file will be converted (compiled) into a binary form @@ -163,7 +165,7 @@ specified in order to embed it into the kernel image). .Sh SEE ALSO .Xr fdtbus 4 , .Xr openfirm 4 , -.Xr simplebus 4 , +.Xr simplebus 4 .Sh STANDARDS IEEE Std 1275: IEEE Standard for Boot (Initialization Configuration) Firmware: Core Requirements and Practices diff --git a/share/man/man4/fdtbus.4 b/share/man/man4/fdtbus.4 index 0956c477766..7141655b706 100644 --- a/share/man/man4/fdtbus.4 +++ b/share/man/man4/fdtbus.4 @@ -51,7 +51,8 @@ represents peripherals typically found on a highly integrated chip The .Nm driver provides generic, common infrastructure for all -.Xr fdt 4 oriented device drivers, and its main responsibilities are the +.Xr fdt 4 +oriented device drivers, and its main responsibilities are the following: .Bl -bullet .It @@ -66,7 +67,7 @@ Managing SYS_RES_MEMORY, SYS_RES_IOPORT resources. .Sh SEE ALSO .Xr fdt 4 , .Xr openfirm 4 , -.Xr simplebus 4 , +.Xr simplebus 4 .Sh STANDARDS IEEE Std 1275: IEEE Standard for Boot (Initialization Configuration) Firmware: Core Requirements and Practices diff --git a/share/man/man4/filemon.4 b/share/man/man4/filemon.4 new file mode 100644 index 00000000000..0726e5a7f41 --- /dev/null +++ b/share/man/man4/filemon.4 @@ -0,0 +1,178 @@ +.\" Copyright (c) 2012 +.\" David E. O'Brien . All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgment: +.\" This product includes software developed by David E. O'Brien and +.\" contributors. +.\" 4. Neither the name of the author nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANT ABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd May 30, 2012 +.Dt FILEMON 4 +.Os +.Sh NAME +.Nm filemon +.Nd the filemon device +.Sh SYNOPSIS +.In dev/filemon/filemon.h +.Sh DESCRIPTION +The +.Nm +device allows a process to collect file operations data of its children. +The device +.Pa /dev/filemon +responds to two +.Xr ioctl 2 +calls. +.Pp +System calls are denoted using the following single letters: +.Pp +.Bl -tag -width indent -compact +.It Ql C +.Xr chdir 2 +.It Ql D +.Xr unlink 2 +.It Ql E +.Xr exec 2 +.It Ql F +.Xr fork 2 , +.Xr vfork 2 +.It Ql L +.Xr link 2 , +.Xr linkat 2 , +.Xr symlink 2 , +.Xr symlinkat 2 +.It Ql M +.Xr rename 2 +.It Ql R +.Xr open 2 +for read +.It Ql S +.Xr stat 2 +.It Ql W +.Xr open 2 +for write +.It Ql X +.Xr _exit 2 +.El +.Pp +Note that +.Ql R +following +.Ql W +records can represent a single +.Xr open 2 +for R/W, +or two separate +.Xr open 2 +calls, one for +.Ql R +and one for +.Ql W . +Note that only successful system calls are captured. +.Sh IOCTLS +User mode programs communicate with the +.Nm +driver through a number of ioctls which are described below. +Each takes a single argument. +.Bl -tag -width ".Dv FILEMON_SET_PID" +.It Dv FILEMON_SET_FD +Write the internal tracing buffer to the supplied open file descriptor. +.It Dv FILEMON_SET_PID +Child process ID to trace. +.El +.Sh RETURN VALUES +.\" .Rv -std ioctl +The +.Fn ioctl +function returns the value 0 if successful; +otherwise the value \-1 is returned and the global variable +.Va errno +is set to indicate the error. +.Sh FILES +.Bl -tag -width ".Pa /dev/filemon" +.It Pa /dev/filemon +.El +.Sh EXAMPLES +.Bd -literal +#include +#include +#include +#include +#include +#include +#include + +static void +open_filemon(void) +{ + pid_t child; + int fm_fd, fm_log; + + if ((fm_fd = open("/dev/filemon", O_RDWR)) == -1) + err(1, "open(\e"/dev/filemon\e", O_RDWR)"); + if ((fm_log = open("filemon.out", + O_CREAT | O_WRONLY | O_TRUNC, DEFFILEMODE)) == -1) + err(1, "open(filemon.out)"); + + if (ioctl(fm_fd, FILEMON_SET_FD, &fm_log) == -1) + err(1, "Cannot set filemon log file descriptor"); + /* Set up these two fd's to close on exec. */ + (void)fcntl(fm_fd, F_SETFD, FD_CLOEXEC); + (void)fcntl(fm_log, F_SETFD, FD_CLOEXEC); + + if ((child = fork()) == 0) { + child = getpid(); + if (ioctl(fm_fd, FILEMON_SET_PID, &child) == -1) + err(1, "Cannot set filemon PID"); + /* Do something here. */ + return 0; + } else { + wait(&child); + close(fm_fd); + } + return 0; +} +.Ed +.Pp +Creates a file named +.Pa filemon.out +and configures the +.Nm +device to write the +.Nm +buffer contents to it. +.Sh SEE ALSO +.Xr dtrace 1 , +.Xr ktrace 1 , +.Xr truss 1 , +.Xr ioctl 2 +.Sh HISTORY +A +.Nm +device appeared in +.Fx 9.1 . diff --git a/share/man/man4/firewire.4 b/share/man/man4/firewire.4 index 9f909f28e67..9ec5dfa6437 100644 --- a/share/man/man4/firewire.4 +++ b/share/man/man4/firewire.4 @@ -31,7 +31,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 1, 2006 +.Dd May 11, 2012 .Dt FIREWIRE 4 .Os .Sh NAME @@ -82,12 +82,20 @@ manager, are dynamically assigned, after bus reset is initiated. On the .Nm bus, every device is identified by an EUI 64 address. +.Pp +Debugging over the firewire interace is possible with the +.Xr dcons 4 +driver. +Please see +.Pa http://wiki.freebsd.org/DebugWithDcons +for details on how to setup debugging with firewire. .Sh FILES -.Bl -tag -compact +.Bl -tag -width "Pa /dev/fwmem0.0" -compact .It Pa /dev/fw0.0 .It Pa /dev/fwmem0.0 .El .Sh SEE ALSO +.Xr dcons 4 , .Xr fwe 4 , .Xr fwip 4 , .Xr fwohci 4 , diff --git a/share/man/man4/gdb.4 b/share/man/man4/gdb.4 index b92958b209b..3a502c875be 100644 --- a/share/man/man4/gdb.4 +++ b/share/man/man4/gdb.4 @@ -508,7 +508,7 @@ pointed to by the local variable .It Ic checkmem Check unallocated memory for modifications. This assumes that the kernel has been compiled with -.Cd "options DIAGNOSTIC" +.Cd "options DIAGNOSTIC" . This causes the contents of free memory to be set to .Li 0xdeadc0de . .It Ic dmesg @@ -595,7 +595,7 @@ run the link at more than 9600 bps. Firewire connections do not have this problem. .Pp The debugging macros -.Dq "just growed" . +.Dq "just grown" . In general, the person who wrote them did so while looking for a specific problem, so they may not be general enough, and they may behave badly when used in ways for which they were not intended, even if those ways make sense. diff --git a/share/man/man4/gre.4 b/share/man/man4/gre.4 index 827c93ec720..da33fd30a50 100644 --- a/share/man/man4/gre.4 +++ b/share/man/man4/gre.4 @@ -37,16 +37,14 @@ .Nd encapsulating network device .Sh SYNOPSIS To compile the -.Ns Nm -device into the kernel, place the following line in the kernel +driver into the kernel, place the following line in the kernel configuration file: .Bd -ragged -offset indent .Cd "device gre" .Ed .Pp Alternatively, to load the -.Ns Nm -device as a module at boot time, place the following line in +driver as a module at boot time, place the following line in .Xr loader.conf 5 : .Bd -literal -offset indent if_gre_load="YES" diff --git a/share/man/man4/hptrr.4 b/share/man/man4/hptrr.4 index 847d86db7c0..0cbd2fdf3eb 100644 --- a/share/man/man4/hptrr.4 +++ b/share/man/man4/hptrr.4 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 8, 2009 +.Dd June 6, 2012 .Dt HPTRR 4 .Os .Sh NAME @@ -50,8 +50,11 @@ hptrr_load="YES" The following tunables are settable from the loader: .Bl -ohang .It Va hw.hptrr.attach_generic -set to 0 to deny driver attach to chips with generic Marvell (non-HighPoint) -PCI identification. These chips are also supported by ata(4). +set to 1 to permit driver attach to chips with generic Marvell (non-HighPoint) +PCI identification. These chips are also supported by +.Xr ata 4 +and +.Xr mvs 4 . Some vendors are using same chips, but without providing RAID BIOS. .El .Sh DESCRIPTION @@ -112,6 +115,7 @@ This driver supersedes the older rr232x driver. .Xr ata 4 , .Xr cam 4 , .Xr hptmv 4 , +.Xr mvs 4 , .Xr loader 8 .Sh HISTORY The diff --git a/share/man/man4/igb.4 b/share/man/man4/igb.4 index 169d057559f..f487048e310 100644 --- a/share/man/man4/igb.4 +++ b/share/man/man4/igb.4 @@ -31,7 +31,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 11, 2011 +.Dd May 12, 2012 .Dt IGB 4 .Os .Sh NAME @@ -160,6 +160,14 @@ The minimum is 80, and the maximum is 4096. .It Va hw.igb.enable_aim If set to 1, enable Adaptive Interrupt Moderation. The default is to enable Adaptive Interrupt Moderation. +.It Va kern.ipc.nmbclusters +The maximum number of mbuf clusters allowed. +If the system has more than one igb card or jumbo frames are +enabled, this value will need to be increased. +.It Va kern.ipc.nmbjumbo9k +The maximum number of mbuf 9k jumbo clusters allowed. +Increasing this to allow for at least 8192 extra clusters +per interface can allow for an mtu of 8192. .El .Sh FILES .Bl -tag -width /dev/led/igb* diff --git a/share/man/man4/io.4 b/share/man/man4/io.4 index a3561dbabd9..fa1c3f1d25c 100644 --- a/share/man/man4/io.4 +++ b/share/man/man4/io.4 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 01, 2010 +.Dd June 1, 2010 .Dt IO 4 .Os .Sh NAME diff --git a/share/man/man4/ip.4 b/share/man/man4/ip.4 index cf16d654392..d921c15f27a 100644 --- a/share/man/man4/ip.4 +++ b/share/man/man4/ip.4 @@ -32,7 +32,7 @@ .\" @(#)ip.4 8.2 (Berkeley) 11/30/93 .\" $FreeBSD$ .\" -.Dd November 14, 2011 +.Dd June 15, 2012 .Dt IP 4 .Os .Sh NAME @@ -165,7 +165,7 @@ The .Vt cmsghdr fields have the following values: .Bd -literal -cmsg_len = sizeof(struct in_addr) +cmsg_len = CMSG_LEN(sizeof(struct in_addr)) cmsg_level = IPPROTO_IP cmsg_type = IP_RECVDSTADDR .Ed @@ -184,7 +184,7 @@ structure followed by the address. The cmsghdr fields should have the following values: .Bd -literal -cmsg_len = sizeof(struct in_addr) +cmsg_len = CMSG_LEN(sizeof(struct in_addr)) cmsg_level = IPPROTO_IP cmsg_type = IP_SENDSRCADDR .Ed @@ -215,7 +215,8 @@ before transmission. This is in contrast to the default behavior of the system, which is to transmit undirected broadcasts via the first network interface with the -.Dv IFF_BROADCAST flag set. +.Dv IFF_BROADCAST +flag set. .Pp This option allows applications to choose which interface is used to transmit an undirected broadcast @@ -226,7 +227,7 @@ configured with the broadcast address 192.168.2.255: .Bd -literal char msg[512]; struct sockaddr_in sin; -u_char onesbcast = 1; /* 0 = disable (default), 1 = enable */ +int onesbcast = 1; /* 0 = disable (default), 1 = enable */ setsockopt(s, IPPROTO_IP, IP_ONESBCAST, &onesbcast, sizeof(onesbcast)); sin.sin_addr.s_addr = inet_addr("192.168.2.255"); @@ -235,12 +236,14 @@ sendto(s, msg, sizeof(msg), 0, &sin, sizeof(sin)); .Ed .Pp It is the application's responsibility to set the -.Dv IP_TTL option +.Dv IP_TTL +option to an appropriate value in order to prevent broadcast storms. The application must have sufficient credentials to set the .Dv SO_BROADCAST socket level option, otherwise the -.Dv IP_ONESBCAST option has no effect. +.Dv IP_ONESBCAST +option has no effect. .Pp If the .Dv IP_BINDANY @@ -276,13 +279,36 @@ that contains a cmsghdr structure followed by the .Tn TTL . The cmsghdr fields have the following values: .Bd -literal -cmsg_len = sizeof(u_char) +cmsg_len = CMSG_LEN(sizeof(u_char)) cmsg_level = IPPROTO_IP cmsg_type = IP_RECVTTL .Ed .\" .Pp If the +.Dv IP_RECVTOS +option is enabled on a +.Dv SOCK_DGRAM +socket, the +.Xr recvmsg 2 +call will return the +.Tn IP +.Tn TOS +(type of service) field for a +.Tn UDP +datagram. +The msg_control field in the msghdr structure points to a buffer +that contains a cmsghdr structure followed by the +.Tn TOS . +The cmsghdr fields have the following values: +.Bd -literal +cmsg_len = CMSG_LEN(sizeof(u_char)) +cmsg_level = IPPROTO_IP +cmsg_type = IP_RECVTOS +.Ed +.\" +.Pp +If the .Dv IP_RECVIF option is enabled on a .Dv SOCK_DGRAM @@ -304,7 +330,7 @@ The .Vt cmsghdr fields have the following values: .Bd -literal -cmsg_len = sizeof(struct sockaddr_dl) +cmsg_len = CMSG_LEN(sizeof(struct sockaddr_dl)) cmsg_level = IPPROTO_IP cmsg_type = IP_RECVIF .Ed @@ -851,4 +877,5 @@ Before packets received on raw IP sockets had the .Va ip_hl subtracted from the -.Va ip_len field. +.Va ip_len +field. diff --git a/share/man/man4/ipfirewall.4 b/share/man/man4/ipfirewall.4 index e1c9a8affce..f19d024e9bd 100644 --- a/share/man/man4/ipfirewall.4 +++ b/share/man/man4/ipfirewall.4 @@ -9,15 +9,14 @@ .Nd IP packet filter and traffic accounting .Sh SYNOPSIS To compile -.Ns Nm +the driver into the kernel, place the following option in the kernel configuration file: .Bd -ragged -offset indent .Cd "options IPFIREWALL" .Ed .Pp -Other kernel options related to -.Ns Nm +Other related kernel options which may also be useful are: .Bd -ragged -offset indent .Cd "options IPFIREWALL_DEFAULT_TO_ACCEPT" @@ -27,7 +26,7 @@ which may also be useful are: .Ed .Pp To load -.Ns Nm +the driver as a module at boot time, add the following line into the .Xr loader.conf 5 file: diff --git a/share/man/man4/ipmi.4 b/share/man/man4/ipmi.4 index 08dd0b0c88d..25dc341aed1 100644 --- a/share/man/man4/ipmi.4 +++ b/share/man/man4/ipmi.4 @@ -130,7 +130,7 @@ Send a message to the interface. Possible error values: .Bl -tag -width Er .It Bq Er EFAULT -An address supplied was invalid +An address supplied was invalid. .It Bq Er ENOMEM Buffers could not be allowed for the command, out of memory. .El @@ -146,7 +146,7 @@ Get the slave LUN for source messages. .Ss Unimplemented Ioctls .Bl -tag -width indent .It Dv IPMICTL_REGISTER_FOR_CMD Pq Vt "struct ipmi_cmdspec" -Register to receive a specific command +Register to receive a specific command. Possible error values: .Bl -tag -width Er .It Bq Er EFAULT @@ -157,7 +157,7 @@ The network function/command is already in use. Could not allocate memory. .El .It Dv IPMICTL_UNREGISTER_FOR_CMD Pq Vt "struct ipmi_cmdspec" -Unregister to receive a specific command +Unregister to receive a specific command. Possible error values: .Bl -tag -width Er .It Bq Er EFAULT diff --git a/share/man/man4/ipw.4 b/share/man/man4/ipw.4 index 21ec44ca376..9becdfa3a51 100644 --- a/share/man/man4/ipw.4 +++ b/share/man/man4/ipw.4 @@ -147,9 +147,9 @@ This should not happen. .Xr wlan_tkip 4 , .Xr wlan_wep 4 , .Xr ifconfig 8 , -.Xr wpa_supplicant 8 . +.Xr wpa_supplicant 8 .Sh AUTHORS The original .Nm driver was written by -.An Damien Bergamini Aq damien.bergamini@free.fr +.An Damien Bergamini Aq damien.bergamini@free.fr . diff --git a/share/man/man4/isci.4 b/share/man/man4/isci.4 index 0179a763430..1d9353d1ea2 100644 --- a/share/man/man4/isci.4 +++ b/share/man/man4/isci.4 @@ -98,7 +98,8 @@ to the kernel configuration file. The .Nm driver first appeared in -.Fx 8.3 and 9.1 . +.Fx 8.3 +and 9.1. .Sh AUTHORS .An -nosplit The diff --git a/share/man/man4/isp.4 b/share/man/man4/isp.4 index 914fec44c0e..23fd4b1f244 100644 --- a/share/man/man4/isp.4 +++ b/share/man/man4/isp.4 @@ -64,7 +64,7 @@ Ultra2 LVD (for the ISP1080 and ISP1280), and Ultra3 LVD (for the ISP12160). .Pp Fibre Channel support uses FCP SCSI profile for -.Tn FibreChannel . +.Tn FibreChannel , and utilizes Class 3 and Class 2 connections (Qlogic 2100 is Class 3 only, minor patches to the Qlogic 2200 to force Class 2 mode). Support is available for Public and Private loops, and for diff --git a/share/man/man4/iwn.4 b/share/man/man4/iwn.4 index 2c47f6ff81b..5fe055e0349 100644 --- a/share/man/man4/iwn.4 +++ b/share/man/man4/iwn.4 @@ -179,4 +179,4 @@ This should not happen. The original .Nm driver was written by -.An Damien Bergamini Aq damien.bergamini@free.fr +.An Damien Bergamini Aq damien.bergamini@free.fr . diff --git a/share/man/man4/mac_lomac.4 b/share/man/man4/mac_lomac.4 index 0cf99c97f29..273a585d0cc 100644 --- a/share/man/man4/mac_lomac.4 +++ b/share/man/man4/mac_lomac.4 @@ -63,7 +63,7 @@ which protects the integrity of system objects and subjects by means of an information flow policy coupled with the subject demotion via floating labels. In LOMAC, all system subjects and objects are assigned integrity labels, made -up of one or more hierarchical grades, depending on the their types. +up of one or more hierarchical grades, depending on their types. Together, these label elements permit all labels to be placed in a partial order, with information flow protections and demotion decisions based on a dominance operator diff --git a/share/man/man4/mac_none.4 b/share/man/man4/mac_none.4 index 8f4602935ac..ed13ca6f6dc 100644 --- a/share/man/man4/mac_none.4 +++ b/share/man/man4/mac_none.4 @@ -45,7 +45,7 @@ configuration file: .Cd "options MAC_NONE" .Ed .Pp -Alternately, to load the sample module at boot time, place the following line +Alternately, to load the none module at boot time, place the following line in your kernel configuration file: .Bd -ragged -offset indent .Cd "options MAC" @@ -59,7 +59,7 @@ mac_none_load="YES" .Sh DESCRIPTION The .Nm -policy module implements a sample MAC policy that has no effect on +policy module implements a none MAC policy that has no effect on access control in the system. Unlike .Xr mac_stub 4 , diff --git a/share/man/man4/mac_stub.4 b/share/man/man4/mac_stub.4 index 79326df3649..89491f1605c 100644 --- a/share/man/man4/mac_stub.4 +++ b/share/man/man4/mac_stub.4 @@ -37,7 +37,7 @@ .Nm mac_stub .Nd "MAC policy stub module" .Sh SYNOPSIS -To compile the sample policy +To compile the stub policy into your kernel, place the following lines in your kernel configuration file: .Bd -ragged -offset indent @@ -45,7 +45,7 @@ configuration file: .Cd "options MAC_STUB" .Ed .Pp -Alternately, to load the sample module at boot time, place the following line +Alternately, to load the stub module at boot time, place the following line in your kernel configuration file: .Bd -ragged -offset indent .Cd "options MAC" @@ -59,7 +59,7 @@ mac_stub_load="YES" .Sh DESCRIPTION The .Nm -policy module implements a sample MAC policy that has no effect on +policy module implements a stub MAC policy that has no effect on access control in the system. Unlike .Xr mac_none 4 , diff --git a/share/man/man4/man4.i386/sbni.4 b/share/man/man4/man4.i386/sbni.4 index 31cf610b009..779deba287d 100644 --- a/share/man/man4/man4.i386/sbni.4 +++ b/share/man/man4/man4.i386/sbni.4 @@ -97,7 +97,7 @@ bits 4-5 value, otherwise baud rate is set to 2Mb .Sh FILES The sources for the driver reside in: .Pp -.Bl -tag -compact +.Bl -tag -width ".Pa /sys/dev/sbni/if_sbni.c" -compact .It Pa /sys/dev/sbni/if_sbni.c .It Pa /sys/dev/sbni/if_sbnireg.h .It Pa /sys/dev/sbni/if_sbnivar.h diff --git a/share/man/man4/mk48txx.4 b/share/man/man4/mk48txx.4 index 66f9519f028..303ccc960cf 100644 --- a/share/man/man4/mk48txx.4 +++ b/share/man/man4/mk48txx.4 @@ -123,7 +123,7 @@ function. The offset into the control registers of the .Tn Mostek chip, -which is set by the the +which is set by the .Fn mk48txx_attach function. .It Fa sc_year0 diff --git a/share/man/man4/mps.4 b/share/man/man4/mps.4 index dbf35cd459f..2fbb669ee29 100644 --- a/share/man/man4/mps.4 +++ b/share/man/man4/mps.4 @@ -34,7 +34,7 @@ .\" $Id: //depot/SpectraBSD/head/share/man/man4/mps.4#6 $ .\" $FreeBSD$ .\" -.Dd February 7, 2012 +.Dd June 30, 2012 .Dt MPS 4 .Os .Sh NAME @@ -166,7 +166,7 @@ variable, where X is the adapter number, either in or via .Xr sysctl 8 . The following bits have the described effects: -.Bl -tag -offset indent +.Bl -tag -width 6n -offset indent .It 0x01 Enable informational prints. .It 0x02 @@ -205,11 +205,8 @@ This man page was written by This driver has a couple of known shortcomings: .Bl -bullet -compact .It -Not endian safe. -It only works on little endian machines (e.g. amd64 and i386). -.It No userland utility available (e.g. -.Xr mptutil 8) +.Xr mptutil 8 ) . .It The driver probes devices sequentially. If your system has a large number of devices, the probe will take a while. diff --git a/share/man/man4/mpt.4 b/share/man/man4/mpt.4 index 4983759fb50..9d62d17c63d 100644 --- a/share/man/man4/mpt.4 +++ b/share/man/man4/mpt.4 @@ -124,15 +124,15 @@ Dell PowerEdge 1750 thru 2850 IBM eServer xSeries 335 .El .Pp -These systems also contain Integrated Raid Mirroring and Integrated -Raid Mirroring Enhanced which this driver also supports. +These systems also contain Integrated RAID Mirroring and Integrated +RAID Mirroring Enhanced which this driver also supports. .Pp The .Tn SAS controller chips are also present on many new AMD/Opteron based systems, like the Sun 4100. Note that this controller can drive both SAS and SATA -drives or a mix of them at the same time. The Integrated Raid Mirroring +drives or a mix of them at the same time. The Integrated RAID Mirroring available for these controllers is poorly supported at best. .Pp The diff --git a/share/man/man4/mvs.4 b/share/man/man4/mvs.4 index a7bbe80c601..5c8d8ccd1df 100644 --- a/share/man/man4/mvs.4 +++ b/share/man/man4/mvs.4 @@ -67,7 +67,8 @@ controls SATA interface Power Management for the specified channel, allowing some power to be saved at the cost of additional command latency. Possible values: -.Bl -tag -compact +.Pp +.Bl -tag -width 4n -offset indent -compact .It 0 interface Power Management is disabled (default); .It 1 diff --git a/share/man/man4/mwl.4 b/share/man/man4/mwl.4 index 62dc29e6eb5..910ae083649 100644 --- a/share/man/man4/mwl.4 +++ b/share/man/man4/mwl.4 @@ -144,7 +144,7 @@ ifconfig wlan0 create wlandev mwl0 wlanmode mesh ifconfig wlan0 meshid my_mesh mode 11a inet 192.168.0.10/24 .Ed .Pp -Create two virtual 802.11a host-based access points, one with +Create two virtual 802.11a host-based access points, one with WEP enabled and one with no security, and bridge them to the fxp0 (wired) device: .Bd -literal -offset indent diff --git a/share/man/man4/nand.4 b/share/man/man4/nand.4 new file mode 100644 index 00000000000..d23e292fac7 --- /dev/null +++ b/share/man/man4/nand.4 @@ -0,0 +1,140 @@ +.\" +.\" Copyright (c) 2012 The FreeBSD Foundation +.\" All rights reserved. +.\" +.\" This documentation was written by Semihalf under sponsorship from +.\" the FreeBSD Foundation. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd March 8, 2012 +.Dt NAND 4 +.Os +.Sh NAME +.Nm nand +.Nd NAND Flash framework +.Sh SYNOPSIS +.Cd "device nand" +.Sh DESCRIPTION +The +.Fx +.Nm +framework consists of a set of interfaces that aim to provide an extensible, +object oriented environement for NAND controllers and NAND Flash memory chips +from various hardware vendors, and to allow for uniform and flexible +management of the NAND devices. It comprises of the following major +components: +.Bl -bullet +.It +NAND Flash controller (NFC) interface. +.Pp +Defines methods which allow to send commands as well as send/receive data +between the controller and a NAND chip. Back-end drivers for specific NAND +controllers plug into this interface and implement low-level routines for a +given NAND controller. +.Pp +This layer implements basic functionality of a NAND Flash controller. It +allows to send command and address to chip, drive CS (chip select line), as +well as read/write to the selected NAND chip. This layer is independent of +NAND chip devices actually connected to the controller. +.It +NAND chip interface. +.Pp +Provides basic operations like read page, program page, erase block. Currently +three generic classes of drivers are available, which provide support for the +following chips: +.Bl -bullet +.It +large page +.It +small page +.It +ONFI-compliant +.El +.Pp +This layer implements basic operations to be performed on a NAND chip, like +read, program, erase, get status etc. Since these operations use specific +commands (depending on the vendor), each chip has potentially its own +implementation of the commands set. +.Pp +The framework is extensible so it is also possible to create a custom command +set for a non standard chip support. +.It +NANDbus. +.Pp +This layer is responsible for enumerating NAND chips in the system and +establishing the hierarchy between chips and their supervising controllers. +.Pp +Its main purpose is detecting type of NAND chips connected to a given chip +select (CS line). It also allows manages locking access to the NAND +controller. NANDbus passes requests from an active chip to the chip +controller. +.It +NAND character / GEOM device. +.Pp +For each NAND chip found in a system a character and GEOM devices are created +which allows to read / write directly to a device, as well as perform other +specific operations (like via ioctl). +.Pp +There are two GEOM devices created for each NAND chip: +.Bl -bullet +.It +raw device +.It +normal device +.El +.Pp +Raw device allows to bypass ECC checking when reading/writing to it, while +normal device always uses ECC algorithm to validate the read data. +.Pp +NAND character devices will be created for each NAND chip detected while +probing the NAND controller. +.El +.Sh SEE ALSO +.Xr libnandfs 3 , +.Xr gnand 4 , +.Xr nandsim 4 , +.Xr nandfs 5 , +.Xr makefs 8 , +.Xr mount_nandfs 8 , +.Xr nandfs 8 , +.Xr nandsim 8 , +.Xr nandtool 8 , +.Xr newfs_nandfs 8 , +.Xr umount_nandfs 8 +.Sh STANDARDS +Open NAND Flash Interface Working Group +.Pq Vt ONFI . +.Sh HISTORY +The +.Nm +framework support first appeared in +.Fx 10.0 . +.Sh AUTHOR +The +.Nm +framework was designed and developed by +.An Grzegorz Bernacki . +This manual page was written by +.An Rafal Jaworowski . diff --git a/share/man/man4/nandsim.4 b/share/man/man4/nandsim.4 new file mode 100644 index 00000000000..ebb54527f50 --- /dev/null +++ b/share/man/man4/nandsim.4 @@ -0,0 +1,92 @@ +.\" +.\" Copyright (c) 2012 The FreeBSD Foundation +.\" All rights reserved. +.\" +.\" This documentation was written by Semihalf under sponsorship from +.\" the FreeBSD Foundation. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd March 8, 2012 +.Dt NANDSIM 4 +.Os +.Sh NAME +.Nm nandsim +.Nd NAND Flash simulator driver +.Sh SYNOPSIS +.Cd "device nand" +.Cd "device nandsim" +.Cd "options ALQ" +.Sh DESCRIPTION +The +.Nm +is part of the +.Fx +NAND framework +.Xr nand 4 +and can be characterized with the following highlights: +.Bl -bullet +.It +plugs into the +.Xr nand 4 +framework APIs as if it were a hardware controller (hanging on the nexus bus) +with real NAND chips connected to it +.It +physically part of the kernel code (either statically linked into the kernel +image or built as a module) +.It +controlled with a user space program +.Xr nandsim 8 +.El +.Pp +From the user perspective, the +.Nm +allows for imitating ONFI-compliant NAND Flash devices as if they were +attached to the system via a virtual controller. +.Pp +Some +.Nm +features rely on the ability to log contents to a file, which is achieved +through the +.Xr alq 9 +facility. +.Sh SEE ALSO +.Xr nand 4 , +.Xr nandsim.conf 5 , +.Xr nandsim 8 +.Sh STANDARDS +Open NAND Flash Interface Working Group +.Pq Vt ONFI . +.Sh HISTORY +The +.Nm +support first appeared in +.Fx 10.0 . +.Sh AUTHOR +The +.Nm +kernel driver was developed by +.An Grzegorz Bernacki . +This manual page was written by +.An Rafal Jaworowski . diff --git a/share/man/man4/net80211.4 b/share/man/man4/net80211.4 index 20d71fe39f0..3773b989879 100644 --- a/share/man/man4/net80211.4 +++ b/share/man/man4/net80211.4 @@ -366,7 +366,7 @@ Valid values are: 0 (do not promote, use legacy), 1 (promote to HT20), and -2 (promote to HT40), +2 (promote to HT40). .It Dv IEEE80211_IOC_HTPROTMODE Return, in .Va i_val , @@ -447,7 +447,7 @@ Return the number of SSIDs supported in .Va i_val . .It Dv IEEE80211_IOC_NUMWEPKEYS Return the number of WEP keys supported in -.Va i_val +.Va i_val . .It Dv IEEE80211_IOC_POWERSAVE Return the current powersaving mode in .Va i_val . @@ -923,8 +923,8 @@ using the value in .Va i_val . .It Dv IEEE80211_IOC_DTIM_PERIOD Set the period (in beacon intervals) between DTIM events to the value in -This request causes a running interface to be restarted. .Va i_val . +This request causes a running interface to be restarted. .It Dv IEEE80211_IOC_DWDS Set whether or not Dynamic WDS support is enabled using the value in .Va i_val . diff --git a/share/man/man4/netmap.4 b/share/man/man4/netmap.4 index 8edcb028b92..9ac9fd0e83a 100644 --- a/share/man/man4/netmap.4 +++ b/share/man/man4/netmap.4 @@ -46,7 +46,7 @@ uses memory mapped buffers and metadata which is in charge of validating information through .Pa ioctl() and -.Pa select()/poll(). +.Pa select()/poll() . .Nm can exploit the parallelism in multiqueue devices and multicore systems. diff --git a/share/man/man4/ng_etf.4 b/share/man/man4/ng_etf.4 index bc42726cbf3..adc3fba54a5 100644 --- a/share/man/man4/ng_etf.4 +++ b/share/man/man4/ng_etf.4 @@ -135,7 +135,6 @@ nghook -a etf: newproto & # Filter two random ethertypes to that hook. ngctl 'msg etf: setfilter { matchhook="newproto" ethertype=${MATCH1} } ngctl 'msg etf: setfilter { matchhook="newproto" ethertype=${MATCH2} } -DONE .Ed .Sh SHUTDOWN This node shuts down upon receipt of a diff --git a/share/man/man4/ng_ksocket.4 b/share/man/man4/ng_ksocket.4 index e74f61a2e43..3a9fcd0aad8 100644 --- a/share/man/man4/ng_ksocket.4 +++ b/share/man/man4/ng_ksocket.4 @@ -34,7 +34,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 09, 2012 +.Dd January 9, 2012 .Dt NG_KSOCKET 4 .Os .Sh NAME diff --git a/share/man/man4/ng_nat.4 b/share/man/man4/ng_nat.4 index 9a3e9bc94fb..b2cff1f3005 100644 --- a/share/man/man4/ng_nat.4 +++ b/share/man/man4/ng_nat.4 @@ -61,7 +61,7 @@ After both hooks have been connected and aliasing address was configured, a node is ready for aliasing operation. .It Dv NGM_NAT_SET_MODE Pq Li setmode Set node's operation mode using supplied -.Vt "struct ng_nat_mode". +.Vt "struct ng_nat_mode" . .Bd -literal struct ng_nat_mode { uint32_t flags; @@ -193,7 +193,7 @@ are also ignored after was used (they are effectively replaced by server pool). .It Dv NGM_NAT_LIST_REDIRECTS Pq Li listredirects Return list of configured static redirects as -.Vt "struct ng_nat_list_redirects". +.Vt "struct ng_nat_list_redirects" . .Bd -literal struct ng_nat_listrdrs_entry { uint32_t id; /* Anything except zero */ diff --git a/share/man/man4/ng_netflow.4 b/share/man/man4/ng_netflow.4 index ca002012230..5985c442f2d 100644 --- a/share/man/man4/ng_netflow.4 +++ b/share/man/man4/ng_netflow.4 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 2, 2011 +.Dd June 16, 2012 .Dt NG_NETFLOW 4 .Os .Sh NAME @@ -112,7 +112,18 @@ The hook number is passed as an argument. Sets data link type on the .Va iface Ns Ar N hook. -Currently, supported types are raw IP datagrams and Ethernet. +Currently, supported types are +.Cm DLT_RAW +(raw IP datagrams) and +.Cm DLT_EN10MB +(Ethernet). +DLT_ definitions can be found in +.In net/bpf.h +header. +Currently used values are 1 for +.Cm DLT_EN10MB +and 12 for +.Cm DLT_RAW . This message type uses .Vt "struct ng_netflow_setdlt" as an argument: @@ -180,18 +191,36 @@ struct ng_netflow_setconfig { #define NG_NETFLOW_CONF_EGRESS 2 #define NG_NETFLOW_CONF_ONCE 4 #define NG_NETFLOW_CONF_THISONCE 8 +#define NG_NETFLOW_CONF_NOSRCLOOKUP 16 +#define NG_NETFLOW_CONF_NODSTLOOKUP 32 }; .Ed .Pp Configuration is a bitmask of several options. Option NG_NETFLOW_CONF_INGRESS enabled by default enables ingress NetFlow generation (for data coming from -ifaceX hook). Option NG_NETFLOW_CONF_EGRESS enables egress NetFlow (for data -coming from outX hook). Option NG_NETFLOW_CONF_ONCE defines that packet should -be accounted only once if it several times passes via netflow node. Option -NG_NETFLOW_CONF_THISONCE defines that packet should be accounted only once -if it several times passes via exactly this netflow node. Last two options are -important to avoid duplicate accounting when both ingress and egress NetFlow -are enabled. +ifaceX hook). +Option +.Va NG_NETFLOW_CONF_EGRESS +enables egress NetFlow (for data coming from outX hook). +Option +.Va NG_NETFLOW_CONF_ONCE +defines that packet should be accounted only once if it several times passes +via netflow node. +Option +.Va NG_NETFLOW_CONF_THISONCE +defines that packet should be accounted only once if it several times passes +via exactly this netflow node. +These two options are important to avoid duplicate accounting when both ingress +and egress NetFlow are enabled. +Option +.Va NG_NETFLOW_CONF_NOSRCLOOKUP +skips radix lookup on flow source address used to fill in network mask. +Option +.Va NG_NETFLOW_CONF_NODSTLOOKUP +skips radix lookup on destination (which fills egress interface id, destination +mask and gateway). +If one doesn't need data provided by lookups, he/she can disable them, to reduce +load on routers. .It Dv NGM_NETFLOW_SETTEMPLATE Sets various timeouts to announce data flow templates (NetFlow v9-specific). This message requires @@ -218,7 +247,7 @@ struct ng_netflow_settemtu { }; .Ed .Pp -Default is 1500 bytes +Default is 1500 bytes. .It Dv NGM_NETFLOW_SHOW This control message asks a node to dump the entire contents of the flow cache. It is called from @@ -284,7 +313,7 @@ node in this example is connected to The latter sends us a copy of IP packets, which we analyze and free. On .Va fxp0: -we do not use tee, but send packets back to ether node. +we do not use tee, but send packets back to either node. .Bd -literal -offset indent /usr/sbin/ngctl -f- <<-SEQ # connect ng0's tee to iface0 hook diff --git a/share/man/man4/ng_patch.4 b/share/man/man4/ng_patch.4 index e223c396637..b1ddf4aebd7 100644 --- a/share/man/man4/ng_patch.4 +++ b/share/man/man4/ng_patch.4 @@ -140,7 +140,7 @@ node allows to modify TTL and TOS/DSCP fields in IP packets. Suppose you have two adjacent simplex links to remote network (e.g.\& satellite), so that the packets expiring in between will generate unwanted ICMP-replies which have to go forth, not back. -Thus you need to raise TTL of every packet entering link link by 2 +Thus you need to raise TTL of every packet entering link by 2 to ensure the TTL will not reach zero there. So you setup .Xr ipfw 8 diff --git a/share/man/man4/ng_socket.4 b/share/man/man4/ng_socket.4 index 22c6638a0ac..84ddd1561bc 100644 --- a/share/man/man4/ng_socket.4 +++ b/share/man/man4/ng_socket.4 @@ -93,7 +93,8 @@ socket must also be created using and associated with a .Nm node. -.Dv NG_DATA sockets do not automatically +.Dv NG_DATA +sockets do not automatically have nodes associated with them; they are bound to a specific node via the .Xr connect 2 system call. diff --git a/share/man/man4/pcm.4 b/share/man/man4/pcm.4 index 1ac5844a17b..c92b1e68a09 100644 --- a/share/man/man4/pcm.4 +++ b/share/man/man4/pcm.4 @@ -390,7 +390,7 @@ Quality values are 100dB stopband, 8 taps and 85% bandwidth. Continuation of the bandlimited SINC interpolator, with 100dB stopband, 36 taps and 90% bandwidth as quality values. .It 4 -Continuation of the bandlimited SINC inteprolator, with 100dB stopband, 164 +Continuation of the bandlimited SINC interprolator, with 100dB stopband, 164 taps and 97% bandwidth as quality values. .El .It Va hw.snd.feeder_rate_round @@ -519,7 +519,7 @@ By default only 2 channels are enabled. Available options include: .Bl -tag -width 2n .It s16le:1.0 -Mono +Mono. .It s16le:2.0 Stereo, 2 channels (left, right). .It s16le:2.1 diff --git a/share/man/man4/pcn.4 b/share/man/man4/pcn.4 index 82720c92527..b86e4fb4f11 100644 --- a/share/man/man4/pcn.4 +++ b/share/man/man4/pcn.4 @@ -104,7 +104,7 @@ The driver supports the following media options: .Bl -tag -width full-duplex .It full-duplex -Force full duplex operation +Force full duplex operation. .It half-duplex Force half duplex operation. .El diff --git a/share/man/man4/psm.4 b/share/man/man4/psm.4 index caf01357cbb..ffcd1d51d70 100644 --- a/share/man/man4/psm.4 +++ b/share/man/man4/psm.4 @@ -725,7 +725,7 @@ psm0: syncmask:xx, syncbits:yy .Pp The first line shows the command byte value of the keyboard controller just before the auxiliary port is probed. -It usually is 4D, 45, 47 or 65, depending on how the motherboard BIOS +It usually is 40, 45, 47 or 65, depending on how the motherboard BIOS initialized the keyboard controller upon power-up. .Pp The second line shows the result of the keyboard controller's diff --git a/share/man/man4/ral.4 b/share/man/man4/ral.4 index f2e0e5fe9d2..f2a2bd18590 100644 --- a/share/man/man4/ral.4 +++ b/share/man/man4/ral.4 @@ -1,5 +1,4 @@ -.\" Copyright (c) 2005, 2006 -.\" Damien Bergamini +.\" Copyright (c) 2005-2010 Damien Bergamini .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -15,12 +14,12 @@ .\" .\" $FreeBSD$ .\" -.Dd July 8, 2009 +.Dd May 10, 2012 .Dt RAL 4 .Os .Sh NAME .Nm ral -.Nd "Ralink Technology IEEE 802.11 wireless network driver" +.Nd "Ralink Technology IEEE 802.11a/g/n wireless network device" .Sh SYNOPSIS To compile this driver into the kernel, place the following lines in your @@ -42,31 +41,43 @@ if_ral_load="YES" .Sh DESCRIPTION The .Nm -driver supports PCI/CardBus wireless adapters based on the Ralink Technology -RT2500, RT2501, and RT2600 chipsets. +driver supports PCI/PCIe/CardBus wireless adapters based on the Ralink RT2500, +RT2501, RT2600, RT2700, RT2800 and RT3090 chipsets. .Pp The RT2500 chipset is the first generation of 802.11b/g adapters from Ralink. -It consists of two integrated chips, a RT2560 MAC/BBP and a RT2525 radio +It consists of two integrated chips, an RT2560 MAC/BBP and an RT2525 radio transceiver. .Pp -The RT2501 chipset is the second generation of 802.11b/g adapters from Ralink. -It consists of two integrated chips, a RT2561 MAC/BBP and a RT2527 radio +The RT2501 chipset is the second generation of 802.11a/b/g adapters from +Ralink. +It consists of two integrated chips, an RT2561 MAC/BBP and an RT2527 radio transceiver. This chipset provides support for the IEEE 802.11e standard with multiple hardware transmission queues and allows scatter/gather for efficient DMA operations. .Pp -The RT2600 chipset consists of two integrated chips, a RT2661 MAC/BBP and a +The RT2600 chipset consists of two integrated chips, an RT2661 MAC/BBP and an RT2529 radio transceiver. This chipset uses the MIMO (multiple-input multiple-output) technology with -multiple antennas to extend the operating range of the adapter and to achieve -higher throughput. -MIMO is the basis of the forthcoming IEEE 802.11n standard. +multiple radio transceivers to extend the operating range of the adapter and +to achieve higher throughput. +However, the RT2600 chipset does not support any of the 802.11n features. .Pp -The transmit speed is user-selectable or can be adapted automatically by the -driver depending on the received signal strength and on the number of hardware -transmission retries. +The RT2700 chipset is a low-cost version of the RT2800 chipset. +It supports a single transmit path and two receiver paths (1T2R). +It consists of two integrated chips, an RT2760 or RT2790 (PCIe) MAC/BBP and +an RT2720 (2.4GHz) or RT2750 (2.4GHz/5GHz) radio transceiver. .Pp +The RT2800 chipset is the first generation of 802.11n adapters from Ralink. +It consists of two integrated chips, an RT2860 or RT2890 (PCIe) MAC/BBP and +an RT2820 (2.4GHz) or RT2850 (2.4GHz/5GHz) radio transceiver. +The RT2800 chipset supports two transmit paths and up to three receiver +paths (2T2R/2T3R). +It can achieve speeds up to 144Mbps (20MHz bandwidth) and 300Mbps (40MHz +bandwidth.) +.Pp +The RT3090 chipset is the first generation of single-chip 802.11n adapters +from Ralink. .Nm supports .Cm station , @@ -92,13 +103,16 @@ Multiple interfaces may be operated together with a .Cm hostap interface to construct a wireless repeater device. +.Pp +The transmit speed is user-selectable or can be adapted automatically by the +driver depending on the number of hardware transmission retries. For more information on configuring this device, see .Xr ifconfig 8 . .Sh HARDWARE The .Nm -driver supports PCI/CardBus wireless adapters based on the Ralink Technology -RT2500, RT2501, and RT2600 chipsets, including: +driver supports PCI/PCIe/CardBus wireless adapters based on Ralink Technology +chipsets, including: .Pp .Bl -column -compact ".Li Atlantis Land A02-PCM-W54" "RT2561S" "CardBus" .It Em Card Ta Em MAC/BBP Ta Em Bus @@ -188,9 +202,6 @@ RT2500, RT2501, and RT2600 chipsets, including: .It "Zonet ZEW1500" Ta RT2560 Ta CardBus .It "Zonet ZEW1600" Ta RT2560 Ta PCI .El -.Pp -An up to date list can be found at -.Pa http://damien.bergamini.free.fr/ral/list.html . .Sh EXAMPLES Join an existing BSS network (i.e., connect to an access point): .Pp @@ -238,7 +249,7 @@ This should not happen. .Xr wlan_xauth 4 , .Xr hostapd 8 , .Xr ifconfig 8 , -.Xr wpa_supplicant 8 . +.Xr wpa_supplicant 8 .Rs .%T "Ralink Technology" .%U http://www.ralinktech.com/ @@ -248,12 +259,37 @@ The .Nm driver first appeared in .Ox 3.7 . +Support for the RT2501 and RT2600 chipsets was added in +.Ox 3.9 . +Support for the RT2800 chipset was added in +.Ox 4.3 . +Support for the RT2700 chipset was added in +.Ox 4.4 . +Support for the RT3090 chipset was added in +.Ox 4.9 . .Sh AUTHORS The original .Nm driver was written by -.An Damien Bergamini Aq damien@FreeBSD.org . -.Sh BUGS -Host AP mode doesn't support client power save. -Clients using power save mode will experience +.An Damien Bergamini Aq damien@openbsd.org . +.Sh CAVEATS +The +.Nm +driver does not make use of the hardware cryptographic engine. +.Pp +The +.Nm +driver does not support any of the 802.11n capabilities offered by +the RT2700 and RT2800 chipsets. +Additional work is required in before those features can be supported. +.Pp +Host AP mode doesn't support power saving. +Clients attempting to use power saving mode may experience significant packet loss (disabling power saving on the client will fix this). +.Pp +Some PCI +.Nm +adapters seem to strictly require a system supporting PCI 2.2 or greater and +will likely not work in systems based on older revisions of the PCI +specification. +Check the board's PCI version before purchasing the card. diff --git a/share/man/man4/rl.4 b/share/man/man4/rl.4 index 33db9666546..4cbf6e942b6 100644 --- a/share/man/man4/rl.4 +++ b/share/man/man4/rl.4 @@ -119,7 +119,7 @@ The driver supports the following media options: .Bl -tag -width xxxxxxxxxxxxxxxxxxxx .It full-duplex -Force full duplex operation +Force full duplex operation. .It half-duplex Force half duplex operation. .El diff --git a/share/man/man4/run.4 b/share/man/man4/run.4 index 5f895e1a29d..3aeb3db6003 100644 --- a/share/man/man4/run.4 +++ b/share/man/man4/run.4 @@ -16,7 +16,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 12, 2011 +.Dd July 9, 2012 .Dt RUN 4 .Os .Sh NAME @@ -112,7 +112,7 @@ driver supports the following wireless adapters: .Bl -tag -width Ds -offset indent -compact .It Airlink101 AWLL6090 .It ASUS USB-N11 -.It ASUS USB-N13 +.It ASUS USB-N13 ver. A1 .It ASUS WL-160N .It Belkin F5D8051 ver 3000 .It Belkin F5D8053 @@ -122,6 +122,8 @@ driver supports the following wireless adapters: .It Buffalo WLI-UC-G300N .It Buffalo WLI-UC-G301N .It Buffalo WLI-UC-GN +.It Buffalo WLI-UC-GNM +.It Buffalo WLI-UC-GNM2 .It Corega CG-WLUSB2GNL .It Corega CG-WLUSB2GNR .It Corega CG-WLUSB300AGN @@ -142,6 +144,7 @@ driver supports the following wireless adapters: .It Hercules HWNU-300 .It Linksys WUSB54GC v3 .It Linksys WUSB600N +.It Logitec LAN-W150N/U2 .It Mvix Nubbin MS-811N .It Planex GW-USMicroN .It Planex GW-US300MiniS @@ -208,7 +211,7 @@ This should not happen. .Xr wlan_xauth 4 , .Xr ifconfig 8 , .Xr hostapd 8 , -.Xr wpa_supplicant 8 . +.Xr wpa_supplicant 8 .Pp Ralink Technology: .Pa http://www.ralinktech.com/ diff --git a/share/man/man4/scsi.4 b/share/man/man4/scsi.4 index ad52663c070..fa5e05d589b 100644 --- a/share/man/man4/scsi.4 +++ b/share/man/man4/scsi.4 @@ -24,7 +24,7 @@ .\" SUCH DAMAGE. .\" .\" $FreeBSD$ -.Dd March 4, 2010 +.Dd June 7, 2012 .Dt CAM 4 .Os .Sh NAME @@ -43,6 +43,7 @@ .Cd "options CAM_DEBUG_BUS=-1" .Cd "options CAM_DEBUG_TARGET=-1" .Cd "options CAM_DEBUG_LUN=-1" +.Cd "options CAM_DEBUG_COMPILE=CAM_DEBUG_INFO|CAM_DEBUG_CDB|CAM_DEBUG_PROBE" .Cd "options CAM_DEBUG_FLAGS=CAM_DEBUG_INFO|CAM_DEBUG_CDB" .Cd "options CAM_MAX_HIGHPOWER=4" .Cd "options SCSI_NO_SENSE_STRINGS" @@ -72,12 +73,11 @@ There are a number of generic kernel configuration options for the subsystem: .Bl -tag -width SCSI_NO_SENSE_STRINGS .It Dv CAMDEBUG -This option enables the +This option compiles in all the .Nm debugging printf code. This will not actually cause any debugging information to be printed out when included by itself. -Enabling printouts requires additional configuration. See below for details. .It Dv "CAM_MAX_HIGHPOWER=4" This sets the maximum allowable number of concurrent "high power" commands. @@ -248,54 +248,53 @@ see other .Nm device entries. .Sh DIAGNOSTICS -When the kernel is compiled with options CAMDEBUG, an XPT_DEBUG CCB can be -used to enable various amounts of tracing information on any -specific device. -Devices not being traced will not produce trace information. -There are currently four debugging flags that may be turned on: +An XPT_DEBUG CCB can be used to enable various amounts of tracing information +on any specific bus/device from the list of options compiled into the kernel. +There are currently seven debugging flags that may be compiled in and used: .Bl -tag -width CAM_DEBUG_SUBTRACE .It Dv CAM_DEBUG_INFO -This debugging flag enables general informational printfs for the device +This flag enables general informational printfs for the device or devices in question. .It Dv CAM_DEBUG_TRACE -This debugging flag enables function-level command flow tracing. +This flag enables function-level command flow tracing. i.e.\& kernel printfs will happen at the entrance and exit of various functions. .It Dv CAM_DEBUG_SUBTRACE -This debugging flag enables debugging output internal to various functions. +This flag enables debugging output internal to various functions. .It Dv CAM_DEBUG_CDB -This debugging flag will cause the kernel to print out all +This flag will cause the kernel to print out all +.Tn ATA +and .Tn SCSI commands sent to a particular device or devices. +.It Dv CAM_DEBUG_XPT +This flag will enable command scheduler tracing. +.It Dv CAM_DEBUG_PERIPH +This flag will enable peripheral drivers messages. +.It Dv CAM_DEBUG_PROBE +This flag will enable devices probe process tracing. .El .Pp Some of these flags, most notably .Dv CAM_DEBUG_TRACE and -.Dv CAM_DEBUG_SUBTRACE -will produce kernel printfs in EXTREME numbers, -and because of that, they are not especially useful. -There are not many things logged at the -.Dv CAM_DEBUG_INFO -level, so it is not especially useful. -The most useful debugging flag is the -.Dv CAM_DEBUG_CDB -flag. +.Dv CAM_DEBUG_SUBTRACE , +will produce kernel printfs in EXTREME numbers. +.Pp Users can enable debugging from their kernel config file, by using the following kernel config options: -.Bl -tag -width CAM_DEBUG_TARGET +.Bl -tag -width CAM_DEBUG_COMPILE .It Dv CAMDEBUG -This enables +This builds into the kernel all possible .Nm debugging. -Without this option, users will not even be able -to turn on debugging from userland via -.Xr camcontrol 8 . -.It Dv CAM_DEBUG_FLAGS -This allows the user to set the various debugging flags described above -in a kernel config file. +.It Dv CAM_DEBUG_COMPILE +This allows to specify support for which debugging flags described above +should be built into the kernel. Flags may be ORed together if the user wishes to see printfs for multiple debugging levels. +.It Dv CAM_DEBUG_FLAGS +This allows to set the various debugging flags from a kernel config file. .It Dv CAM_DEBUG_BUS Specify a bus to debug. To debug all busses, set this to -1. @@ -307,17 +306,9 @@ Specify a lun to debug. To debug all luns, set this to -1. .El .Pp -When specifying a bus, target or lun to debug, you -.Em MUST -specify all three bus/target/lun options above. -Using wildcards, you -should be able to enable debugging on most anything. -.Pp -Users may also enable debugging printfs on the fly, if the -.Dv CAMDEBUG -option is their config file, by using the +Users may also enable debugging on the fly by using the .Xr camcontrol 8 -utility. +utility, if wanted options built into the kernel. See .Xr camcontrol 8 for details. diff --git a/share/man/man4/send.4 b/share/man/man4/send.4 index 9cfcd530cb2..3f90eafe44f 100644 --- a/share/man/man4/send.4 +++ b/share/man/man4/send.4 @@ -38,10 +38,7 @@ .Ft int .Fn socket PF_INET6 SOCK_RAW IPPROTO_SEND .Pp -To enable -.Ns Nm -support, load the kernel side SeND as a module. -To load it at boot time, add the following line to +To load the driver as a module at boot time, place the following line in .Xr loader.conf 5 : .Bd -literal -offset indent send_load="YES" diff --git a/share/man/man4/ses.4 b/share/man/man4/ses.4 index 3d9528517bc..42ec529ee5c 100644 --- a/share/man/man4/ses.4 +++ b/share/man/man4/ses.4 @@ -101,7 +101,7 @@ Set the status of a particular object. Get the associated help text for an object (not yet implemented). .Nm devices often have descriptive text for an object which can tell -you things like location (e.g, "left power supply"). +you things like location (e.g., "left power supply"). .It Dv SESIOC_INIT Initialize the enclosure. .El diff --git a/share/man/man4/siftr.4 b/share/man/man4/siftr.4 index 08d20e37b40..ab92f77b94e 100644 --- a/share/man/man4/siftr.4 +++ b/share/man/man4/siftr.4 @@ -38,14 +38,14 @@ .Nd Statistical Information For TCP Research .Sh SYNOPSIS To load -.Ns Nm +the driver as a module at run-time, run the following command as root: .Bd -literal -offset indent kldload siftr .Ed .Pp Alternatively, to load -.Ns Nm +the driver as a module at boot time, add the following line into the .Xr loader.conf 5 file: @@ -53,13 +53,16 @@ file: siftr_load="YES" .Ed .Sh DESCRIPTION +The .Nm -.Ns ( Em S Ns tatistical +.Po +.Em S Ns tatistical .Em I Ns nformation .Em F Ns or .Em T Ns CP -.Em R Ns esearch ) -is a kernel module that logs a range of statistics on active TCP connections to +.Em R Ns esearch +.Pc +kernel module logs a range of statistics on active TCP connections to a log file. It provides the ability to make highly granular measurements of TCP connection state, aimed at system administrators, developers and researchers. @@ -91,7 +94,7 @@ utilises the .Xr sysctl 8 interface to export its configuration variables to user-space. The following variables are available: -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va net.inet.siftr.enabled controls whether the module performs its measurements or not. @@ -104,7 +107,7 @@ packet filtering hooks are only inserted when .Va net.inet.siftr.enabled is set to 1. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va net.inet.siftr.ppl controls how many inbound/outbound packets for a given TCP connection will cause a log message to be generated for the connection. @@ -113,13 +116,13 @@ every packet of every TCP connection. The value can be set to any integer in the range [1,2^32], and can be changed at any time, even while the module is enabled. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va net.inet.siftr.logfile controls the path to the file that the module writes its log messages to. By default, the file /var/log/siftr.log is used. The path can be changed at any time, even while the module is enabled. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va net.inet.siftr.genhashes controls whether a hash is generated for each TCP packet seen by .Nm . @@ -137,7 +140,7 @@ All messages are written in plain ASCII text. Note: The .Qq \e present in the example log messages in this section indicates a -line continuation and is not part of the actual log message +line continuation and is not part of the actual log message. .Pp The first type of log message is written to the file when the module is enabled and starts collecting data from the running kernel. The text below @@ -150,36 +153,36 @@ sysname=FreeBSD sysver=604000 ipmode=4 .Ed .Pp Field descriptions are as follows: -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va enable_time_secs time at which the module was enabled, in seconds since the UNIX epoch. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va enable_time_usecs time at which the module was enabled, in microseconds since enable_time_secs. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va siftrver version of .Nm . .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va hz tick rate of the kernel in ticks per second. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va tcp_rtt_scale -smoothed RTT estimate scaling factor +smoothed RTT estimate scaling factor. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va sysname -operating system name +operating system name. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va sysver -operating system version +operating system version. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va ipmode IP mode as defined at compile time. An ipmode of "4" means IPv6 is not supported and IP addresses are logged in @@ -202,7 +205,7 @@ o,0xbec491a5,1238556193.463551,172.16.7.28,22,172.16.2.5,55931, \\ .Ed .Pp Field descriptions are as follows: -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 1 Direction of packet that triggered the log message. Either @@ -211,77 +214,77 @@ for in, or .Qq o for out. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 2 Hash of the packet that triggered the log message. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 3 Time at which the packet that triggered the log message was processed by the .Xr pfil 9 hook function, in seconds and microseconds since the UNIX epoch. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 4 The IPv4 or IPv6 address of the local host, in dotted quad (IPv4 packet) or colon-separated hex (IPv6 packet) notation. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 5 The TCP port that the local host is communicating via. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 6 The IPv4 or IPv6 address of the foreign host, in dotted quad (IPv4 packet) or colon-separated hex (IPv6 packet) notation. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 7 The TCP port that the foreign host is communicating via. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 8 The slow start threshold for the flow, in bytes. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 9 The current congestion window for the flow, in bytes. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 10 The current bandwidth-controlled window for the flow, in bytes. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 11 The current sending window for the flow, in bytes. The post scaled value is reported, except during the initial handshake (first few packets), during which time the unscaled value is reported. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 12 The current receive window for the flow, in bytes. The post scaled value is always reported. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 13 The current window scaling factor for the sending window. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 14 The current window scaling factor for the receiving window. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 15 The current state of the TCP finite state machine, as defined in .Aq Pa netinet/tcp_fsm.h . .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 16 The maximum segment size for the flow, in bytes. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 17 The current smoothed RTT estimate for the flow, in units of TCP_RTT_SCALE * HZ, where TCP_RTT_SCALE is a define found in tcp_var.h, and HZ is the kernel's tick @@ -289,46 +292,46 @@ timer. Divide by TCP_RTT_SCALE * HZ to get the RTT in secs. TCP_RTT_SCALE and HZ are reported in the enable log message. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 18 SACK enabled indicator. 1 if SACK enabled, 0 otherwise. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 19 The current state of the TCP flags for the flow. See .Aq Pa netinet/tcp_var.h for information about the various flags. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 20 The current retransmission timeout length for the flow, in units of HZ, where HZ is the kernel's tick timer. Divide by HZ to get the timeout length in seconds. HZ is reported in the enable log message. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 21 The current size of the socket send buffer in bytes. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 22 The current number of bytes in the socket send buffer. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 23 The current size of the socket receive buffer in bytes. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 24 The current number of bytes in the socket receive buffer. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 25 The current number of unacknowledged bytes in-flight. Bytes acknowledged via SACK are not excluded from this count. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va 26 The current number of segments in the reassembly queue. .El @@ -350,82 +353,82 @@ flow_list=172.16.7.28;22-172.16.2.5;55931, .Ed .Pp Field descriptions are as follows: -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va disable_time_secs Time at which the module was disabled, in seconds since the UNIX epoch. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va disable_time_usecs Time at which the module was disabled, in microseconds since disable_time_secs. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va num_inbound_tcp_pkts Number of TCP packets that traversed up the network stack. This only includes inbound TCP packets during the periods when .Nm was enabled. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va num_outbound_tcp_pkts Number of TCP packets that traversed down the network stack. This only includes outbound TCP packets during the periods when .Nm was enabled. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va total_tcp_pkts The summation of num_inbound_tcp_pkts and num_outbound_tcp_pkts. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va num_inbound_skipped_pkts_malloc Number of inbound packets that were not processed because of failed malloc() calls. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va num_outbound_skipped_pkts_malloc Number of outbound packets that were not processed because of failed malloc() calls. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va num_inbound_skipped_pkts_mtx Number of inbound packets that were not processed because of failure to add the packet to the packet processing queue. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va num_outbound_skipped_pkts_mtx Number of outbound packets that were not processed because of failure to add the packet to the packet processing queue. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va num_inbound_skipped_pkts_tcb Number of inbound packets that were not processed because of failure to find the TCP control block associated with the packet. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va num_outbound_skipped_pkts_tcb Number of outbound packets that were not processed because of failure to find the TCP control block associated with the packet. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va num_inbound_skipped_pkts_icb Number of inbound packets that were not processed because of failure to find the IP control block associated with the packet. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va num_outbound_skipped_pkts_icb Number of outbound packets that were not processed because of failure to find the IP control block associated with the packet. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va total_skipped_tcp_pkts The summation of all skipped packet counters. .El -.Bl -tag -offset indent +.Bl -tag -offset indent -width Va .It Va flow_list A CSV list of TCP flows that triggered data log messages to be generated since the module was loaded. Each flow entry in the CSV list is formatted as .Qq local_ip;local_port-foreign_ip;foreign_port . -If there are no entries in the list (i.e. no data log messages were generated), +If there are no entries in the list (i.e., no data log messages were generated), the value will be blank. If there is at least one entry in the list, a trailing comma will always be present. @@ -498,10 +501,10 @@ the system to trigger a dump of the state of the TCP control block for that flow. With the PPL set to 1, we are in effect sampling each TCP flow's control block state as frequently as flow packets enter/leave the system. -For example, setting PPL to 2 halves the sampling rate i.e. every second flow +For example, setting PPL to 2 halves the sampling rate i.e., every second flow packet (inbound OR outbound) causes a dump of the control block state. .Pp -The distinction between interrogating individual packets vs interrogating the +The distinction between interrogating individual packets versus interrogating the control block is important, because .Nm does not remove the need for packet capturing tools like @@ -543,7 +546,7 @@ If one thread holds the lock, the other must wait before it can obtain it. This does introduce some additional bounded delay into the kernel's packet processing code path. .Pp -In some cases (e.g. low memory, connection termination), TCP packets that enter +In some cases (e.g., low memory, connection termination), TCP packets that enter the .Nm .Xr pfil 9 diff --git a/share/man/man4/siis.4 b/share/man/man4/siis.4 index 8bf03dd3ea1..366c3ccc539 100644 --- a/share/man/man4/siis.4 +++ b/share/man/man4/siis.4 @@ -57,12 +57,13 @@ controls SATA interface Power Management for the specified channel, allowing some power to be saved at the cost of additional command latency. Possible values: -.Bl -tag -compact +.Bl -tag -width 2n -offset indent .It 0 interface Power Management is disabled (default); .It 1 device is allowed to initiate PM state change, host is passive. .El +.Pp Note that interface Power Management is not compatible with device presence detection. A manual bus reset is needed on device hot-plug. @@ -107,6 +108,7 @@ given precedence as the more functional of the two. The .Nm driver supports the following controller chips: +.Pp .Bl -bullet -compact .It SiI3124 (PCI-X 133MHz/64bit, 4 ports) diff --git a/share/man/man4/simplebus.4 b/share/man/man4/simplebus.4 index 72bc0e81efb..6834b38be01 100644 --- a/share/man/man4/simplebus.4 +++ b/share/man/man4/simplebus.4 @@ -60,11 +60,12 @@ configuration data retrieved from the nodes properties in Note the .Nm does not manage device resources and passes through any requests to the -.Xr fdtbus 4 layer. +.Xr fdtbus 4 +layer. .Sh SEE ALSO .Xr fdt 4 , .Xr fdtbus 4 , -.Xr openfirm 4 , +.Xr openfirm 4 .Sh STANDARDS Power.org Standard for Embedded Power Architecture Platform Requirements .Pq Vt ePAPR . diff --git a/share/man/man4/sis.4 b/share/man/man4/sis.4 index 365b0a250d1..414f0d8d726 100644 --- a/share/man/man4/sis.4 +++ b/share/man/man4/sis.4 @@ -113,7 +113,7 @@ The driver supports the following media options: .Bl -tag -width full-duplex .It full-duplex -Force full duplex operation +Force full duplex operation. .It half-duplex Force half duplex operation. .El diff --git a/share/man/man4/sk.4 b/share/man/man4/sk.4 index 71e30c90a40..4710f58e329 100644 --- a/share/man/man4/sk.4 +++ b/share/man/man4/sk.4 @@ -127,7 +127,7 @@ The driver supports the following media options: .Bl -tag -width xxxxxxxxxxxxxxxxxxxx .It full-duplex -Force full duplex operation +Force full duplex operation. .It half-duplex Force half duplex operation. .El diff --git a/share/man/man4/snd_hda.4 b/share/man/man4/snd_hda.4 index 6f7e8bdee6d..91e599d65da 100644 --- a/share/man/man4/snd_hda.4 +++ b/share/man/man4/snd_hda.4 @@ -184,7 +184,7 @@ or as a set of space-separated pairs. .It Va hint.pcm.%d.rec.autosrc Controls automatic recording source feature: -.Bl -tag -compact +.Bl -tag -width 2n -compact .It 0 disabled, .It 1 @@ -235,10 +235,10 @@ first pin in that association. .Pp The sequence numbers 14 and 15 has a special meaning for input associations. Their presence in association defines it as multiplexed or mixed respectively. -If none of them present and there are more then one pin in association, +If none of them are present and there are more than one pin in association, the association will provide multichannel input. .Pp -For multichannel input/output assotiations sequence numbers encode +For multichannel input/output associations sequence numbers encode channel pairs positions: 0 - Front, 1 - Center/LFE, 2 - Back, 3 - Front Wide Center, 4 - Side. Standard combinations are: (0) - Stereo; (0, 2), (0, 4) - Quadro; @@ -368,7 +368,7 @@ Original pin configuration written by BIOS. .It Va dev.hdaa.%d.reconfig Setting this to a non-zero value makes driver to destroy existing pcm devices and process new pins configuration set via -.Va dev.hdaa.%d.nid%d_config. +.Va dev.hdaa.%d.nid%d_config . .It Va dev.pcm.%d.play.32bit , dev.pcm.%d.rec.32bit HDA controller uses 32bit representation for all samples of more then 16 bits. These variables allow to specify how many bits of these 32 should be @@ -586,7 +586,7 @@ subclass 3 (HDA), compatible with Intel HDA specification. .Pp The .Nm -driver supports more then two hundred different controllers and CODECs. +driver supports more than two hundred different controllers and CODECs. There is no sense to list all of them here, as in most cases specific CODEC configuration and wiring are more important then type of the CODEC itself. .Sh SEE ALSO diff --git a/share/man/man4/snd_hdspe.4 b/share/man/man4/snd_hdspe.4 index a403a178dd2..676b945b800 100644 --- a/share/man/man4/snd_hdspe.4 +++ b/share/man/man4/snd_hdspe.4 @@ -29,7 +29,7 @@ .Os .Sh NAME .Nm snd_hdspe -.Nd "RME HDSPe brigde device driver" +.Nd "RME HDSPe bridge device driver" .Sh SYNOPSIS To compile this driver into the kernel, place the following lines in your kernel configuration file: diff --git a/share/man/man4/splash.4 b/share/man/man4/splash.4 index 4b5f22426b5..2a9a2970c05 100644 --- a/share/man/man4/splash.4 +++ b/share/man/man4/splash.4 @@ -234,8 +234,7 @@ first example above. .Pp To load a binary ASCII drawing and display this while booting, include the following into your -.Pa /boot/loader.conf -: +.Pa /boot/loader.conf : .Bd -literal -offset indent splash_txt_load="YES" bitmap_load="YES" diff --git a/share/man/man4/ste.4 b/share/man/man4/ste.4 index 02644ae32c0..22982b1db22 100644 --- a/share/man/man4/ste.4 +++ b/share/man/man4/ste.4 @@ -103,7 +103,7 @@ The driver supports the following media options: .Bl -tag -width xxxxxxxxxxxxxxxxxxxx .It full-duplex -Force full duplex operation +Force full duplex operation. .It half-duplex Force half duplex operation. .El @@ -136,7 +136,7 @@ Maximum number of time to delay RX interrupts. The valid range is 0 to 209712 in units of 1us, the default is 150 (150us). The value 0 effectively disables the RX interrupt moderation. -The resolution of of timer is about 3.2us so finer tuning than +The resolution of timer is about 3.2us so finer tuning than 3.2us wouldn't be available. The interface does not need to be brought down and up again before a change takes effect. diff --git a/share/man/man4/termios.4 b/share/man/man4/termios.4 index 2a69d7b508c..b9148845de0 100644 --- a/share/man/man4/termios.4 +++ b/share/man/man4/termios.4 @@ -197,7 +197,8 @@ signal, or if the process group of the reading process is orphaned, the .Xr read 2 returns -1 with -.Va errno set to +.Va errno +set to .Er EIO and no signal is sent. diff --git a/share/man/man4/ti.4 b/share/man/man4/ti.4 index 2ef606c30b2..f4154591907 100644 --- a/share/man/man4/ti.4 +++ b/share/man/man4/ti.4 @@ -144,7 +144,7 @@ or modes. .It 1000baseSX Set 1000Mbps (Gigabit Ethernet) operation. -Only full +Only .Ar full-duplex mode is supported at this speed. .El @@ -154,7 +154,7 @@ The driver supports the following media options: .Bl -tag -width xxxxxxxxxxxxxxxxxxxx .It full-duplex -Force full duplex operation +Force full-duplex operation. .It half-duplex Force half duplex operation. .El @@ -240,14 +240,14 @@ when either of the thresholds is exceeded. A value of 0 means that this parameter is ignored and receive BDs will only be returned when the receive max coalesced BDs value is reached. -The default valus is 170. +The default value is 170. .It Va dev.ti.%d.rx_max_coal_bds This value, receive max coalesced BDs, controls the number of receive buffer descriptors that will be coalesced before the NIC updates the receive return ring producer index. If this value is set to 0 it will disable receive buffer descriptor coalescing. -The default valus is 64. +The default value is 64. .It Va dev.ti.%d.ti_tx_coal_ticks This value, send coalesced ticks, controls the number of clock ticks (of 1 microseconds each) that must elapse before the NIC DMAs @@ -263,9 +263,9 @@ The default value is 2000. This value, send max coalesced BDs, controls the number of send buffer descriptors that will be coalesced before the NIC updates the send consumer index. -If this valus is set to 0 it will disable send buffer descriptor +If this value is set to 0 it will disable send buffer descriptor coalescing. -The default valus is 32. +The default value is 32. .It Va dev.ti.%d.tx_buf_ratio This value controls the ratio of the remaining memory in the NIC that should be devoted to transmit buffer vs. receive buffer. @@ -348,7 +348,7 @@ Write to the requested memory region on the Tigon board. The argument is .Vt "struct tg_mem" . .It Dv ALT_READ_TG_REG -Read the requested register on the Tigon board. +Read the requested register from the Tigon board. The argument is .Vt "struct tg_reg" . .It Dv ALT_WRITE_TG_REG diff --git a/share/man/man4/tl.4 b/share/man/man4/tl.4 index eb8351d49bf..0716ce08029 100644 --- a/share/man/man4/tl.4 +++ b/share/man/man4/tl.4 @@ -82,9 +82,9 @@ option is only available on those PHYs that support autonegotiation. Also, the PHY will not advertise those modes that have been explicitly disabled using the following media options. .It 10baseT/UTP -Set 10Mbps operation +Set 10Mbps operation. .It 100baseTX -Set 100Mbps (Fast Ethernet) operation +Set 100Mbps (Fast Ethernet) operation. .It 10base5/AUI Enable AUI/BNC interface (useful only with the built-in PHY). .El @@ -94,7 +94,7 @@ The driver supports the following media options: .Bl -tag -width xxxxxxxxxxxxxxxxxxxx .It full-duplex -Force full duplex operation +Force full duplex operation. .It half-duplex Force half duplex operation. .It hw-loopback diff --git a/share/man/man4/tws.4 b/share/man/man4/tws.4 index 9ce154e1f26..3f2ab6608f8 100644 --- a/share/man/man4/tws.4 +++ b/share/man/man4/tws.4 @@ -74,13 +74,13 @@ prompt before booting the kernel or stored in .Xr loader.conf 5 . .Bl -tag -width "hw.tws.use_32bit_sgls" .It Va hw.tws.cam_depth -The maximium queued CAM SIM requests for one controller. +The maximum queued CAM SIM requests for one controller. The default value is 256. .It Va hw.tws.enable_msi This tunable enables MSI support on the controller if set to a non-zero value. The default value is 0. .It Va hw.tws.queue_depth -The maximium queued requests for one controller. +The maximum queued requests for one controller. .It Va hw.tws.use_32bit_sgls Limit the driver to use only 32-bit SG elements regardless whether the operating system is running in 64-bit mode. diff --git a/share/man/man4/uhso.4 b/share/man/man4/uhso.4 index 26d169badbc..cc2e9ae0537 100644 --- a/share/man/man4/uhso.4 +++ b/share/man/man4/uhso.4 @@ -100,7 +100,7 @@ mode to modem mode. This behavior can be disabled by setting .Va hw.usb.uhso.auto_switch to 0 using -.Xr sysctl 8 +.Xr sysctl 8 . .Sh FILES .Bl -tag -width "XXXXXX" .It Pa /dev/cuaU?.? diff --git a/share/man/man4/ulpt.4 b/share/man/man4/ulpt.4 index cd92bfdf54c..cd3b300fe89 100644 --- a/share/man/man4/ulpt.4 +++ b/share/man/man4/ulpt.4 @@ -56,8 +56,8 @@ driver provides support for USB printers that follow the printer bi- or uni-directional protocol. The bits in the minor number select various features of the driver. .Bl -column "Minor Bit" "Functionxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -offset indent -.Em "Minor Bit Function" -64 "Do not initialize (reset) the device on the port." +.It Em "Minor Bit" Ta Em "Function" +.It "64" Ta "Do not initialize (reset) the device on the port." .El .Pp Some printers cannot handle the reset on open; in case of problems try the diff --git a/share/man/man4/umcs.4 b/share/man/man4/umcs.4 index 8ccd2ca38d2..fc96ad2ad91 100644 --- a/share/man/man4/umcs.4 +++ b/share/man/man4/umcs.4 @@ -68,7 +68,7 @@ driver which makes it behave like a Different ports on device are presented as sub-units, like .Pa /dev/ttyU0.1 and -.Pa /dev/ttyU0.2 +.Pa /dev/ttyU0.2 . .Sh HARDWARE The .Nm diff --git a/share/man/man4/usb.4 b/share/man/man4/usb.4 index f3f8104616a..d3a236fa13a 100644 --- a/share/man/man4/usb.4 +++ b/share/man/man4/usb.4 @@ -58,7 +58,7 @@ devices in host and device side mode. The .Nm driver has three layers: -.Bl -tag +.Bl -tag -width 6n -offset indent .It USB Controller (Bus) .It USB Device .It USB Driver @@ -85,7 +85,7 @@ The .Tn USB is a system where external devices can be connected to a PC. The most common USB speeds are: -.Bl -tag +.Bl -tag -width 6n -offset indent .It Low Speed (1.5MBit/sec) .It Full Speed (12MBit/sec) .It High Speed (480MBit/sec) diff --git a/share/man/man4/uslcom.4 b/share/man/man4/uslcom.4 index a2a2dcc6784..14c78ff1e84 100644 --- a/share/man/man4/uslcom.4 +++ b/share/man/man4/uslcom.4 @@ -41,7 +41,7 @@ uslcom_load="YES" .Sh DESCRIPTION The .Nm -driver supports Silicon Laboratories CP2101/CP2102 based serial adapters. +driver supports Silicon Laboratories CP2101/CP2102 based USB serial adapters. .Sh HARDWARE The following devices should work with the .Nm diff --git a/share/man/man4/vge.4 b/share/man/man4/vge.4 index 5d488504e20..f8fd8f77499 100644 --- a/share/man/man4/vge.4 +++ b/share/man/man4/vge.4 @@ -177,7 +177,7 @@ tunables: Maximum number of time to delay interrupts. The valid range is 0 to 5100 in units of 1us, the default is 150 (150us). -The resolution of of timer is about 20us so finer tuning than +The resolution of timer is about 20us so finer tuning than 20us wouldn't be available. The interface should be brought down and up again before a change takes effect. diff --git a/share/man/man4/vlan.4 b/share/man/man4/vlan.4 index 4ef65cbf13f..4717d2ae562 100644 --- a/share/man/man4/vlan.4 +++ b/share/man/man4/vlan.4 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 25, 2011 +.Dd June 4, 2012 .Dt VLAN 4 .Os .Sh NAME @@ -33,7 +33,7 @@ .Nd "IEEE 802.1Q VLAN network interface" .Sh SYNOPSIS To compile this driver into the kernel, -place the following lines in your +place the following line in your kernel configuration file: .Bd -ragged -offset indent .Cd "device vlan" @@ -79,16 +79,16 @@ to a properly configured switch port. The VLAN tag should match one of those set up in the switched network. .Pp -Initially .Nm -assumes the same minimum length for tagged and untagged frames. -This mode is selected by the +initially assumes the same minimum length for tagged and untagged frames. +This mode is selected by setting the .Xr sysctl 8 variable .Va net.link.vlan.soft_pad -set to 0 (default). -However, there are network devices that fail to adjust frame length, -should it fall below the allowed minimum due to untagging. +to 0 +.Pq default . +However, there are network devices that fail to adjust frame length +when it falls below the allowed minimum due to untagging. Such devices should be able to interoperate with .Nm after changing the value of @@ -97,7 +97,7 @@ to 1. In the latter mode, .Nm will pad short frames before tagging them -so that their length stays not less than the minimum value +so that their length is not less than the minimum value after untagging by the non-compliant devices. .Sh HARDWARE The @@ -111,7 +111,7 @@ receive and transmit long frames (up to 1522 bytes including an Ethernet header and FCS). The capabilities may be user-controlled by the respective parameters to .Xr ifconfig 8 , -.Cm vlanhwtag +.Cm vlanhwtag , and .Cm vlanmtu . However, a physical interface is not obliged to react to them: @@ -119,8 +119,8 @@ It may have either capability enabled permanently without a way to turn it off. The whole issue is very specific to a particular device and its driver. .Pp -By now, the list of physical interfaces able of full VLAN processing -in the hardware is limited to the following devices: +At present, these devices are capable of full VLAN processing +in hardware: .Xr ae 4 , .Xr age 4 , .Xr alc 4 , @@ -146,11 +146,10 @@ in the hardware is limited to the following devices: and .Xr vge 4 . .Pp -The rest of the Ethernet interfaces can run -VLANs using software emulation in the +Other Ethernet interfaces can run VLANs using software emulation in the .Nm driver. -However, some of them lack the capability +However, some lack the capability of transmitting and receiving long frames. Assigning such an interface as the parent to .Nm @@ -163,9 +162,8 @@ connectivity problems due to massive, inadequate .Xr icmp 4 filtering that breaks the Path MTU Discovery mechanism. .Pp -The following interfaces support long frames for -.Nm -natively: +These interfaces natively support long frames for +.Nm : .Xr axe 4 , .Xr bfe 4 , .Xr cas 4 , @@ -198,7 +196,7 @@ for use and calculates the appropriate frame MTU based on the capabilities of the parent interface. Some other interfaces not listed above may handle long frames, -but they do not advertise this ability of theirs. +but they do not advertise this ability. The MTU setting on .Nm can be corrected manually if used in conjunction with such a parent interface. diff --git a/share/man/man4/vr.4 b/share/man/man4/vr.4 index cd49f4be74f..1390cc998de 100644 --- a/share/man/man4/vr.4 +++ b/share/man/man4/vr.4 @@ -109,7 +109,7 @@ The driver supports the following media options: .Bl -tag -width xxxxxxxxxxxxxxxxxxxx .It full-duplex -Force full duplex operation +Force full duplex operation. .It half-duplex Force half duplex operation. .El diff --git a/share/man/man4/watchdog.4 b/share/man/man4/watchdog.4 index b0a52b17990..4d953d6957e 100644 --- a/share/man/man4/watchdog.4 +++ b/share/man/man4/watchdog.4 @@ -38,6 +38,7 @@ The .Nm facility is used for controlling hardware and software watchdogs. .Pp +The device .Pa /dev/fido responds to a single .Xr ioctl 2 diff --git a/share/man/man4/wb.4 b/share/man/man4/wb.4 index 038af892f22..22a670651ac 100644 --- a/share/man/man4/wb.4 +++ b/share/man/man4/wb.4 @@ -108,7 +108,7 @@ The driver supports the following media options: .Bl -tag -width xxxxxxxxxxxxxxxxxxxx .It full-duplex -Force full duplex operation +Force full duplex operation. .It half-duplex Force half duplex operation. .El diff --git a/share/man/man4/witness.4 b/share/man/man4/witness.4 index c0014fa79d1..ffd9f8fe0c1 100644 --- a/share/man/man4/witness.4 +++ b/share/man/man4/witness.4 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 18, 2001 +.Dd May 30, 2012 .Dt WITNESS 4 .Os .Sh NAME @@ -52,11 +52,8 @@ violation occurs. The .Nm code also checks various other conditions such as verifying that one -does not recurse on a non-recursive lock. -For sleep locks, -.Nm -verifies that a new process would not be switched to when a lock is released -or a lock is blocked on during an acquire while any spin locks are held. +does not recurse on a non-recursive lock, +or attempt an upgrade on a shared lock held by another thread. If any of these checks fail, then the kernel will panic. .Pp The flag that controls whether or not the kernel debugger is entered when a @@ -97,7 +94,7 @@ specifies the level of witness involvement in the system. A value of 1 specifies that witness is enabled. A value of 0 specifies that witness is disabled, but that can be enabled again. This will maintain a small amount of overhead in the system. -A value of -1 specifies that witness is disabled permanently and that +A value of -1 specifies that witness is disabled permanently and cannot be enabled again. The sysctl .Va debug.witness.watch @@ -114,10 +111,22 @@ and .Xr ddb 4 are compiled into the kernel: .Bl -ohang -.It Ic show locks -Outputs the list of locks held by the current thread to the kernel console +.It Ic show locks Op thread +Outputs the list of locks held by a thread to the kernel console along with the filename and line number at which each lock was last acquired -by this thread. +by the thread. +The optional +.Ar thread +argument may be either a TID, +PID, +or pointer to a thread structure. +If +.Ar thread +is not specified, +then the locks held by the current thread are displayed. +.It Ic show all locks +Outputs the list of locks held by all threads in the system to the +kernel console. .It Ic show witness Dump the current order list to the kernel console. The code first displays the lock order tree for all of the sleep locks. @@ -136,9 +145,3 @@ code first appeared in .Bsx 5.0 and was imported from there into .Fx 5.0 . -.Sh BUGS -The -.Nm -code currently does not handle recursion of shared -.Xr sx 9 -locks properly. diff --git a/share/man/man4/wpi.4 b/share/man/man4/wpi.4 index efcfdbaa09b..f1bc15ed674 100644 --- a/share/man/man4/wpi.4 +++ b/share/man/man4/wpi.4 @@ -56,7 +56,7 @@ The .Nm driver provides support for the .Tn Intel -3945ABG Wireless network adapter +3945ABG Wireless network adapter. .Nm supports .Cm station , @@ -124,7 +124,7 @@ Data transmission is not possible in this state. .Xr wlan_tkip 4 , .Xr wlan_wep 4 , .Xr ifconfig 8 , -.Xr wpa_supplicant 8 . +.Xr wpa_supplicant 8 .Sh AUTHORS .An -nosplit The original diff --git a/share/man/man4/xl.4 b/share/man/man4/xl.4 index 9c8e8b0a5fd..d10d270be01 100644 --- a/share/man/man4/xl.4 +++ b/share/man/man4/xl.4 @@ -115,7 +115,7 @@ The driver supports the following media options: .Bl -tag -width xxxxxxxxxxxxxxxxxxxx .It full-duplex -Force full duplex operation +Force full duplex operation. .It half-duplex Force half duplex operation. .El diff --git a/share/man/man4/xnb.4 b/share/man/man4/xnb.4 index d4ebae842ce..9c65636a6c8 100644 --- a/share/man/man4/xnb.4 +++ b/share/man/man4/xnb.4 @@ -83,7 +83,7 @@ get traffic statistics. Runs a builtin suite of unit tests and displays the results. Does not affect the operation of the driver in any way. Note that the test suite simulates error conditions; this will result in -error messages being printed to the system system log. +error messages being printed to the system log. .El .Sh SEE ALSO .Xr arp 4 , @@ -104,7 +104,7 @@ driver was written by .Aq alans@spectralogic.com and .An John Suykerbuyk -.Aq johns@spectralogic.com +.Aq johns@spectralogic.com . .Sh CAVEATS Packets sent through Xennet pass over shared memory, so the protocol includes no form of link-layer checksum or CRC. @@ -127,7 +127,7 @@ to the OS. .Pp For this reason, it is recommended that if .Nm -is bridged to a physcal interface, then transmit checksum offloading should be +is bridged to a physical interface, then transmit checksum offloading should be disabled on the netfront. The Xennet protocol does not have any mechanism for the netback to request the netfront to do this; the operator must do it manually. diff --git a/share/man/man5/Makefile b/share/man/man5/Makefile index b05c1eb924d..c7a3c592d04 100644 --- a/share/man/man5/Makefile +++ b/share/man/man5/Makefile @@ -85,6 +85,10 @@ MLINKS+=resolver.5 resolv.conf.5 MAN+= hesiod.conf.5 .endif +.if ${MK_NAND} != "no" +MAN+= nandfs.5 +.endif + .if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" _boot.config.5= boot.config.5 .endif diff --git a/share/man/man5/devfs.conf.5 b/share/man/man5/devfs.conf.5 index 9d837263f1a..f459696bed0 100644 --- a/share/man/man5/devfs.conf.5 +++ b/share/man/man5/devfs.conf.5 @@ -91,7 +91,7 @@ as explained in .Xr chmod 1 . .El .Sh FILES -.Bl -tag -compact +.Bl -tag -compact -width Pa .It Pa /etc/devfs.conf .It Pa /usr/share/examples/etc/devfs.conf .El diff --git a/share/man/man5/devfs.rules.5 b/share/man/man5/devfs.rules.5 index 8a7b3d665ab..603189e2e01 100644 --- a/share/man/man5/devfs.rules.5 +++ b/share/man/man5/devfs.rules.5 @@ -82,7 +82,7 @@ file: devfs_system_ruleset="localrules" .Ed .Sh FILES -.Bl -tag -compact +.Bl -tag -compact -width Pa .It Pa /etc/defaults/devfs.rules Default .Nm diff --git a/share/man/man5/device.hints.5 b/share/man/man5/device.hints.5 index 9dcaccd71be..16d462738e2 100644 --- a/share/man/man5/device.hints.5 +++ b/share/man/man5/device.hints.5 @@ -162,7 +162,7 @@ hint.acpi.0.disabled="1" .Xr kenv 1 , .Xr loader.conf 5 , .Xr loader 8 , -.Xr resource_int_value 9 . +.Xr resource_int_value 9 .Sh HISTORY The .Nm diff --git a/share/man/man5/libmap.conf.5 b/share/man/man5/libmap.conf.5 index 6959ce2aaa9..784d5d05323 100644 --- a/share/man/man5/libmap.conf.5 +++ b/share/man/man5/libmap.conf.5 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 31, 2004 +.Dd April 28, 2012 .Dt LIBMAP.CONF 5 .Os .Sh NAME @@ -43,6 +43,27 @@ left hand side containing the mapping candidate and the right hand side containing the mapping. Dependencies are matched against candidates and replaced with the mappings. .Pp +Two special directives are available: +.Bl -tag -width indent +.It Cm include Ar file +Parse the contents of +.Ar file +before continuing with the current file. +.It Cm includedir Ar dir +Parse the contents of every file in +.Ar dir +that ends in +.Pa .conf +before continuing with the current file. +.El +.Pp +Any file or directory encountered while processing +.Cm include +or +.Cm includedir +directives will be parsed exactly once, even if it is encountered +multiple times. +.Pp Constrained mappings may be specified by enclosing the name of the executable or library in brackets. All mappings following a constraint will only be evaluated for that constraint. diff --git a/share/man/man5/make.conf.5 b/share/man/man5/make.conf.5 index d9967ea317e..1f5e390a9f1 100644 --- a/share/man/man5/make.conf.5 +++ b/share/man/man5/make.conf.5 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 11, 2011 +.Dd May 2, 2012 .Dt MAKE.CONF 5 .Os .Sh NAME @@ -318,7 +318,7 @@ The hostname of the sup server to use when doing .It Va SUP_UPDATE .Pq Vt bool Set this to use -.Xr cvsup 1 +.Xr csup 1 to update your .Pa src , ports , doc and @@ -575,7 +575,7 @@ files at build time. The value should include the full path to the .Pa .mc file(s), e.g., -.Pa /etc/mail/foo.mc +.Pa /etc/mail/foo.mc , .Pa /etc/mail/bar.mc . .It Va SENDMAIL_ALIASES .Pq Vt str diff --git a/share/man/man5/nandfs.5 b/share/man/man5/nandfs.5 new file mode 100644 index 00000000000..2ef3259f591 --- /dev/null +++ b/share/man/man5/nandfs.5 @@ -0,0 +1,128 @@ +.\" +.\" Copyright (c) 2010 Semihalf +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd Nov 11, 2010 +.Dt NANDFS 5 +.Os +.Sh NAME +.Nm nandfs +.Nd NAND Flash file system +.Sh SYNOPSIS +To compile support for the +.Nm , +place the following in your kernel configuration file: +.Bd -ragged -offset indent +.Cd "options NANDFS" +.Ed +.Pp +Even though the NAND FS can be used with any storage media, it has been +optimized and designed towards NAND Flash devices, so typically the following +driver is used: +.Bd -ragged -offset indent +.Cd "device nand" +.Ed +.Sh DESCRIPTION +The +.Nm +driver enables +.Fx +with support for NAND-oriented file system. +.Pp +It is a log-structured style file system with the following major features and +characteristics: +.Bl -bullet +.It +Hard links, symbolic links support +.It +Block journaling +.It +Copy-On-Write +.It +Snapshots (continuous, taken automatically, simultaneously mountable) +.It +Quick crash recovery at mount time +.It +64-bit data structures; supports many files, large files and volumes +.It +POSIX file permissions +.It +Checksum / ECC +.El +.Sh EXAMPLES +The most common usage is mounting the file system: +.Pp +.Dl "mount -t nandfs /dev/ /mnt" +.Pp +or: +.Dl "mount_nandfs /dev/ /mnt" +.Pp +where +.Ar gnandN +is the GEOM device representing a Flash partition (slice) containing the +.Nm +structure, and +.Pa /mnt +is a mount point. +.Pp +It is possible to define an entry in +.Pa /etc/fstab +for the +.Nm : +.Bd -literal +/dev/gnand0 /flash nandfs rw 0 0 +.Ed +.Pp +This will mount a +.Nm +partition at the specified mount point during system boot. +.Sh SEE ALSO +.Xr gnand 4 , +.Xr nand 4 , +.Xr mount_nandfs 8 , +.Xr nandfs 8 , +.Xr nandsim 8 , +.Xr nandtool 8 , +.Xr umount_nandfs 8 +.Sh HISTORY +The NAND FS concepts are based on NILFS principles and initial implementation +was derived from early NILFS NetBSD code (read only). Since then the NAND FS +code diverged significantly and is by no means compatible with NILFS. +.Pp +The NAND Flash file system first appeared in +.Fx 10.0 . +.Sh AUTHOR +The NAND FS was written by +.An Grzegorz Bernacki with the help of +.An Mateusz Guzik , +based on the NetBSD code created by +.An Reinoud Zandijk . +Additional help and support by +.An Lukasz Plachno , +.An Jan Sieka and +.An Lukasz Wojcik . +This manual page was written by +.An Rafal Jaworowski . diff --git a/share/man/man5/nsmb.conf.5 b/share/man/man5/nsmb.conf.5 index 2548a05f8c9..30fbecd7cc3 100644 --- a/share/man/man5/nsmb.conf.5 +++ b/share/man/man5/nsmb.conf.5 @@ -96,7 +96,6 @@ Possible keywords may include: .Bl -tag -width ".Pa /etc/nsmb.conf" .It Pa /etc/nsmb.conf The default remote mount-point configuration file. -.Pa "~/nsmb.conf" .It Pa ~/nsmb.conf The user specific remote mount-point configuration file. .El diff --git a/share/man/man5/passwd.5 b/share/man/man5/passwd.5 index 228c4e33a32..c49b0f73b01 100644 --- a/share/man/man5/passwd.5 +++ b/share/man/man5/passwd.5 @@ -35,7 +35,7 @@ .\" From: @(#)passwd.5 8.1 (Berkeley) 6/5/93 .\" $FreeBSD$ .\" -.Dd May 8, 2007 +.Dd June 23, 2012 .Dt PASSWD 5 .Os .Sh NAME @@ -203,7 +203,8 @@ field is the number of seconds from the epoch, .Dv UTC , until the password for the account must be changed. -This field may be left empty to turn off the password aging feature. +This field may be left empty to turn off the password aging feature; +a value of zero is equivalent to leaving the field empty. .Pp The .Ar expire @@ -211,7 +212,8 @@ field is the number of seconds from the epoch, .Dv UTC , until the account expires. -This field may be left empty to turn off the account aging feature. +This field may be left empty to turn off the account aging feature; +a value of zero is equivalent to leaving the field empty. .Pp The .Ar gecos @@ -271,7 +273,8 @@ as it is done for system accounts, is to set its .Ar shell to -.Xr nologin 8 . +.Pa /sbin/nologin +.Pq see Xr nologin 8 . .Sh HESIOD SUPPORT If .Sq Li dns @@ -363,7 +366,7 @@ fields, the specified numbers will override the information retrieved from the Hesiod domain or the .Tn NIS maps. -As well, if the +Likewise, if the .Ar gecos , .Ar dir or @@ -399,7 +402,8 @@ The additional fields .Ar change and .Ar expire -are added, but are turned off by default. +are added, but are turned off by default +.Pq setting these fields to zero is equivalent to leaving them blank . Class is currently not implemented, but change and expire are; to set them, use the current day in seconds from the epoch + whatever number of seconds of offset you want. diff --git a/share/man/man5/periodic.conf.5 b/share/man/man5/periodic.conf.5 index 4ab009c18a9..1f9eec8dbed 100644 --- a/share/man/man5/periodic.conf.5 +++ b/share/man/man5/periodic.conf.5 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 7, 2012 +.Dd May 30, 2012 .Dt PERIODIC.CONF 5 .Os .Sh NAME @@ -504,6 +504,12 @@ Set to .Dq Li YES to compare the modes and modification times of setuid executables with the previous day's values. +.It Va daily_status_security_chkportsum_enable +.Pq Vt bool +Set to +.Dq Li YES +to verify checksums of all installed packages against the known checksums in +.Pa /var/db/pkg . .It Va daily_status_security_neggrpperm_enable .Pq Vt bool Set to diff --git a/share/man/man5/portsnap.conf.5 b/share/man/man5/portsnap.conf.5 index b936d98038b..90225b29382 100644 --- a/share/man/man5/portsnap.conf.5 +++ b/share/man/man5/portsnap.conf.5 @@ -47,7 +47,8 @@ specifies the source from which snapshots should be fetched. This is equivalent to the .Fl s Ar server option to -.Xr portsnap 8 , and will be ignored if the command-line +.Xr portsnap 8 , +and will be ignored if the command-line option is used. .Pp A line of the form @@ -58,7 +59,8 @@ belonging to an RSA keypair which is trusted to sign updates. This is equivalent to the .Fl k Ar KEY option to -.Xr portsnap 8 , and will be ignored if the command-line +.Xr portsnap 8 , +and will be ignored if the command-line option is used. .Pp A line of the form @@ -68,7 +70,8 @@ snapshot of the ports tree. This is equivalent to the .Fl d Ar workdir option to -.Xr portsnap 8 , and will be ignored if the command-line option +.Xr portsnap 8 , +and will be ignored if the command-line option is used. .Pp A line of the form @@ -82,7 +85,8 @@ commands. This is equivalent to the .Fl p Ar portsdir option to -.Xr portsnap 8 , and will be ignored if the command-line option +.Xr portsnap 8 , +and will be ignored if the command-line option is used. .Pp If more than one line of any of the above forms is included in diff --git a/share/man/man5/rc.conf.5 b/share/man/man5/rc.conf.5 index a45ee0132b7..02e1cb64b22 100644 --- a/share/man/man5/rc.conf.5 +++ b/share/man/man5/rc.conf.5 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 27, 2012 +.Dd July 9, 2012 .Dt RC.CONF 5 .Os .Sh NAME @@ -386,7 +386,7 @@ is used to set the hostname via DHCP, this variable should be set to an empty string. If this value remains unset when the system is done booting your console login will display the default hostname of -.Dq Amnesiac. +.Dq Amnesiac . .It Va nisdomainname .Pq Vt str The NIS domain name of this host, or @@ -501,6 +501,16 @@ to enable firewall event logging. This is equivalent to the .Dv IPFIREWALL_VERBOSE kernel option. +.It Va firewall_logif +.Pq Vt bool +Set to +.Dq Li YES +to create pseudo interface +.Li ipfw0 +for logging. +For more details, see +.Xr ipfw 8 +manual page. .It Va firewall_flags .Pq Vt str Flags passed to @@ -1299,6 +1309,7 @@ ifconfig_ed0_name="net0" ifconfig_net0="inet 192.0.2.1 netmask 0xffffff00" .Ed .It Va ipv6_enable +.Pq Vt bool This variable is deprecated. Use .Va ifconfig_ Ns Ao Ar interface Ac Ns _ipv6 @@ -1306,7 +1317,6 @@ and .Va ipv6_activate_all_interfaces if necessary. .Pp -.Pq Vt bool If the variable is .Dq Li YES , .Dq Li inet6 accept_rtadv @@ -1317,12 +1327,12 @@ and the is defined as .Dq Li YES . .It Va ipv6_prefer +.Pq Vt bool This variable is deprecated. Use .Va ip6addrctl_policy instead. .Pp -.Pq Vt bool If the variable is .Dq Li YES , the default address selection policy table set by @@ -2086,6 +2096,19 @@ If is set to .Dq Li YES this is the path to Kerberos 5 Password-Changing Daemon. +.It Va kfd_enable +.Pq Vt bool +Set to +.Dq Li YES +to start +.Xr kfd 8 , +the Kerberos 5 ticket forwarding daemon, at the boot time. +.It Va kfd_program +.Pq Vt str +Path to +.Xr kfd 8 +(default +.Pa /usr/libexec/kfd ) . .It Va rwhod_enable .Pq Vt bool If set to @@ -3273,9 +3296,10 @@ is enabled, and a daemon is started for a non-default port, the .Va "moused_" Ns Ar XXX Ns Va "_flags" set of options has precedence over and replaces the default -.Va moused_flags (where +.Va moused_flags +(where .Ar XXX -is the name of the non-default port, i.e.\& +is the name of the non-default port, i.e.,\& .Ar ums0 ) . By setting .Va "moused_" Ns Ar XXX Ns Va "_flags" diff --git a/share/man/man5/src.conf.5 b/share/man/man5/src.conf.5 index e209a2646d5..789f6cf8a2e 100644 --- a/share/man/man5/src.conf.5 +++ b/share/man/man5/src.conf.5 @@ -1,7 +1,7 @@ .\" DO NOT EDIT-- this file is automatically generated. -.\" from FreeBSD: head/tools/build/options/makeman 221733 2011-05-10 13:01:11Z ru +.\" from FreeBSD: head/tools/build/options/makeman 236279 2012-05-30 02:37:20Z gjb .\" $FreeBSD$ -.Dd March 25, 2012 +.Dd July 2, 2012 .Dt SRC.CONF 5 .Os .Sh NAME @@ -207,9 +207,9 @@ and Set to enable the http statistics interface for named. This requires ports/textproc/libxml2 to be installed in /usr/local. .It Va WITHOUT_BINUTILS -.\" from FreeBSD: head/tools/build/options/WITHOUT_BINUTILS 222090 2011-05-19 05:13:25Z imp +.\" from FreeBSD: head/tools/build/options/WITHOUT_BINUTILS 235342 2012-05-12 16:12:36Z gjb Set to not install binutils (as, c++-filt, gconv, gnu-ar, gnu-randlib, -ld, nm, objcopy, objdump, readelf, size and strip) +ld, nm, objcopy, objdump, readelf, size and strip). .Bf -symbolic The option does not generally work for build targets, unless some alternative toolchain is enabled. @@ -289,14 +289,12 @@ amd64/amd64, i386/i386, pc98/i386, powerpc/powerpc and powerpc/powerpc64. .\" from FreeBSD: head/tools/build/options/WITH_CLANG_EXTRAS 231057 2012-02-05 23:56:22Z dim Set to build additional clang and llvm tools, such as bugpoint. .It Va WITH_CLANG_IS_CC -.\" from FreeBSD: head/tools/build/options/WITH_CLANG_IS_CC 232322 2012-02-29 22:58:51Z dim +.\" from FreeBSD: head/tools/build/options/WITH_CLANG_IS_CC 235342 2012-05-12 16:12:36Z gjb Set to install the Clang C/C++ compiler as -.Pa /usr/bin/cc -, +.Pa /usr/bin/cc , .Pa /usr/bin/c++ and -.Pa /usr/bin/cpp -. +.Pa /usr/bin/cpp . .It Va WITHOUT_CPP .\" from FreeBSD: head/tools/build/options/WITHOUT_CPP 156932 2006-03-21 07:50:50Z ru Set to not build @@ -367,6 +365,11 @@ Set this if you do not want to link and .Pa /sbin dynamically. +.It Va WITHOUT_ED_CRYPTO +.\" from FreeBSD: head/tools/build/options/WITHOUT_ED_CRYPTO 235660 2012-05-19 20:05:27Z marcel +Set to build +.Xr ed 1 +without support for encryption/decryption. .It Va WITHOUT_EXAMPLES .\" from FreeBSD: head/tools/build/options/WITHOUT_EXAMPLES 156938 2006-03-21 09:06:24Z ru Set to avoid installing examples to @@ -434,6 +437,9 @@ When set, it also enforces the following options: .It .Va WITHOUT_GNU_SUPPORT .El +.It Va WITH_GNU_SORT +.\" from FreeBSD: head/tools/build/options/WITH_GNU_SORT 237629 2012-06-27 05:59:01Z gabor +Install GNU-licensed sort as 'sort' instead of BSD sort. .It Va WITHOUT_GNU_SUPPORT .\" from FreeBSD: head/tools/build/options/WITHOUT_GNU_SUPPORT 156932 2006-03-21 07:50:50Z ru Set to build some programs without optional GNU support. @@ -508,6 +514,16 @@ Set this if you do not want to install optional libraries. For example when creating a .Xr nanobsd 8 image. +.It Va WITH_INSTALL_AS_USER +.\" from FreeBSD: head/tools/build/options/WITH_INSTALL_AS_USER 238021 2012-07-02 20:24:01Z marcel +Set to make install targets succeed for non-root users by installing +files with owner and group attributes set to that of the user running +the +.Xr make 1 +command. +The user still has to set the +.Va DESTDIR +variable to point to a directory where the user has write permissions. .It Va WITHOUT_IPFILTER .\" from FreeBSD: head/tools/build/options/WITHOUT_IPFILTER 156932 2006-03-21 07:50:50Z ru Set to not build IP Filter package. @@ -666,6 +682,11 @@ and related programs. Set to not build .Xr lpr 1 and related programs. +.It Va WITHOUT_LS_COLORS +.\" from FreeBSD: head/tools/build/options/WITHOUT_LS_COLORS 235660 2012-05-19 20:05:27Z marcel +Set to build +.Xr ls 1 +without support for colors to distinguish file types. .It Va WITHOUT_MAIL .\" from FreeBSD: head/tools/build/options/WITHOUT_MAIL 183242 2008-09-21 22:02:26Z sam Set to not build any mail support (MUA or MTA). @@ -708,6 +729,9 @@ Set to not build utilities for manual pages, .Xr whatis 1 , .Xr manctl 8 , and related support files. +.It Va WITH_NAND +.\" from FreeBSD: head/tools/build/options/WITH_NAND 235537 2012-05-17 10:11:18Z gber +Set to build the NAND Flash components. .It Va WITHOUT_NCP .\" from FreeBSD: head/tools/build/options/WITHOUT_NCP 156932 2006-03-21 07:50:50Z ru Set to not build programs, libraries, and kernel modules @@ -825,6 +849,11 @@ When set, it also enforces the following options: .It .Va WITHOUT_AUTHPF .El +.It Va WITHOUT_PKGBOOTSTRAP +.\" from FreeBSD: head/tools/build/options/WITHOUT_PKGBOOTSTRAP 238023 2012-07-02 20:26:11Z marcel +Set to not build +.Xr pkg 1 +bootstrap tool .It Va WITHOUT_PKGTOOLS .\" from FreeBSD: head/tools/build/options/WITHOUT_PKGTOOLS 183242 2008-09-21 22:02:26Z sam Set to not build @@ -891,6 +920,13 @@ as a set-user-ID root program. Set to not build the .Bx 4.4 legacy docs. +.It Va WITH_SHARED_TOOLCHAIN +.\" from FreeBSD: head/tools/build/options/WITH_SHARED_TOOLCHAIN 235342 2012-05-12 16:12:36Z gjb +Set to build the toolchain binaries shared. +The set includes +.Xr cc 1 , +.Xr make 1 +and necessary utilities like assembler, linker and library archive manager. .It Va WITHOUT_SOURCELESS .\" from FreeBSD: head/tools/build/options/WITHOUT_SOURCELESS 230972 2012-02-04 00:54:43Z rmh Set to not build kernel modules that include sourceless code (either microcode or native code for host CPU). @@ -1007,11 +1043,11 @@ protocols (usable only via 802.1X). .\" from FreeBSD: head/tools/build/options/WITHOUT_ZFS 168409 2007-04-06 02:13:30Z pjd Set to not build ZFS file system. .It Va WITHOUT_ZONEINFO -.\" from FreeBSD: head/tools/build/options/WITHOUT_ZONEINFO 171994 2007-08-27 20:01:08Z remko -Set to not build the timezone database +.\" from FreeBSD: head/tools/build/options/WITHOUT_ZONEINFO 235342 2012-05-12 16:12:36Z gjb +Set to not build the timezone database. .El .Sh FILES -.Bl -tag -compact +.Bl -tag -compact -width Pa .It Pa /etc/src.conf .It Pa /usr/share/mk/bsd.own.mk .El diff --git a/share/man/man7/build.7 b/share/man/man7/build.7 index f16895875fe..7cd8d911eba 100644 --- a/share/man/man7/build.7 +++ b/share/man/man7/build.7 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 29, 2011 +.Dd July 2, 2012 .Dt BUILD 7 .Os .Sh NAME @@ -39,6 +39,11 @@ normally .Pa /usr/doc , and .Pa /usr/ports . +These directories may be initially empty or non-existent until updated with +.Xr csup 1 , +.Xr svn 1 , +or +.Xr portsnap 8 . Directory .Pa /usr/src contains the @@ -489,7 +494,7 @@ on built objects. .It Va NO_SHARE If set, the build does not descend into the .Pa /usr/src/share -subdirectory (i.e. manpages, locale data files, timezone data files and +subdirectory (i.e., manpages, locale data files, timezone data files and other .Pa /usr/src/share files will not be rebuild from their sources). @@ -594,14 +599,17 @@ make TARGET=sparc64 DESTDIR=/clients/sparc64 installworld .Ed .Sh SEE ALSO .Xr cc 1 , +.Xr csup 1 , .Xr install 1 , .Xr make 1 , +.Xr svn 1 , .Xr make.conf 5 , .Xr src.conf 5 , .Xr ports 7 , .Xr release 7 , .Xr config 8 , .Xr mergemaster 8 , +.Xr portsnap 8 , .Xr reboot 8 , .Xr shutdown 8 .Sh AUTHORS diff --git a/share/man/man7/c99.7 b/share/man/man7/c99.7 index 8c7d5e270d9..e12d000476f 100644 --- a/share/man/man7/c99.7 +++ b/share/man/man7/c99.7 @@ -103,7 +103,7 @@ The ISO C standard was later extended with an amendment as ISO/IEC 9899 AM1 in 1995. This contained, for example, the wide-character support in wchar.h and wctype.h. -Two corregenda were also published: Technical Corrigendum 1 as +Two corrigenda were also published: Technical Corrigendum 1 as ISO/IEC 9899 TCOR1 in 1995 and Technical Corrigendum 2 as ISO/IEC 9899 TCOR1 in 1996. The continuous development and growth made it necessary to work out a new diff --git a/share/man/man7/development.7 b/share/man/man7/development.7 index af8db3a75d2..ea7df383077 100644 --- a/share/man/man7/development.7 +++ b/share/man/man7/development.7 @@ -23,7 +23,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 21, 2002 +.Dd May 2, 2012 .Dt DEVELOPMENT 7 .Os .Sh NAME @@ -89,7 +89,7 @@ I recommend a partition of at least 5GB. .Pp On the master server, use -.Xr cvsup 1 Pq Pa ports/net/cvsup +.Xr csup 1 to automatically pull down and maintain the .Fx @@ -108,23 +108,23 @@ The job should look something like this (please randomize the time of day!). Note that you can use the -.Xr cvsup 1 +.Xr csup 1 configuration file example directly from .Pa /usr/share/examples without modification by supplying appropriate arguments to -.Xr cvsup 1 . +.Xr csup 1 . .Bd -literal -offset 4n -33 6 * * * /usr/local/bin/cvsup -g -r 20 -L 2 -h cvsup.freebsd.org /usr/share/examples/cvsup/cvs-supfile +33 6 * * * /usr/bin/csup -r 20 -L 2 -h cvsup.freebsd.org /usr/share/examples/cvsup/cvs-supfile .Ed .Pp Run the -.Xr cvsup 1 +.Xr csup 1 manually the first time to pull down the archive. It could take all day depending on how fast your connection is! You will run all -.Xr cvsup 1 +.Xr csup 1 and .Xr cvs 1 operations as @@ -555,7 +555,7 @@ Since the main tree is based on CVS, the former is convenient. .Pp First, you need to modify your -.Xr cvsup 1 +.Xr csup 1 environment to avoid it modifying the local changes you have committed to the repository. It is important to remove the @@ -568,7 +568,7 @@ subdirectory to your .Pa refuse file. For more information, see -.Xr cvsup 1 . +.Xr csup 1 . .Pp The .Fx @@ -598,13 +598,13 @@ For more information on using CVS, see .Pp .Sy WARNING! The -.Xr cvsup 1 +.Xr csup 1 utility may blow away changes made on a local branch in some situations. This has been reported to occur when the master CVS repository is directly manipulated or an RCS file is changed. At this point, -.Xr cvsup 1 +.Xr csup 1 notices that the client and server have entirely different RCS files, so it does a full replace instead of trying to send just deltas. @@ -619,7 +619,7 @@ Bottom line is, if you value your local branch then you should back it up before every update. .Sh UPDATING VIA CVS The advantage of using -.Xr cvsup 1 +.Xr csup 1 to maintain an updated copy of the CVS repository instead of using it to maintain source trees directly is that you can then pick and choose when you bring your source tree (or pieces of your diff --git a/share/man/man7/release.7 b/share/man/man7/release.7 index a725fc627e4..2a794c8f211 100644 --- a/share/man/man7/release.7 +++ b/share/man/man7/release.7 @@ -221,7 +221,7 @@ hardware guide, and installation instructions. Other documentation (e.g. the Handbook) is built during the .Cm base.txz target invoked by -.Cm packagesystem. +.Cm packagesystem . .El .Sh ENVIRONMENT Optional variables: @@ -283,7 +283,7 @@ Typically, one only needs to set .Va TARGET . .El .Sh FILES -.Bl -tag -compact +.Bl -tag -compact -width Pa .It Pa /usr/doc/Makefile .It Pa /usr/doc/share/mk/doc.project.mk .It Pa /usr/ports/Mk/bsd.port.mk diff --git a/share/man/man7/tuning.7 b/share/man/man7/tuning.7 index 76b3439241b..b859c2802ec 100644 --- a/share/man/man7/tuning.7 +++ b/share/man/man7/tuning.7 @@ -23,7 +23,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 16, 2010 +.Dd May 11, 2012 .Dt TUNING 7 .Os .Sh NAME @@ -148,15 +148,15 @@ If you do not use ports all that much and do not intend to keep system source .Pq Pa /usr/src on the machine, you can get away with -a 1 gigabyte +a 1 GB .Pa /usr partition. However, if you install a lot of ports (especially window managers and Linux-emulated binaries), we recommend -at least a 2 gigabyte +at least a 2 GB .Pa /usr and if you also intend to keep system source -on the machine, we recommend a 3 gigabyte +on the machine, we recommend a 3 GB .Pa /usr . Do not underestimate the amount of space you will need in this partition, it can creep up and @@ -218,22 +218,22 @@ and .Em cylinders/group . .Pp .Fx -performs best when using 8K or 16K file system block sizes. -The default file system block size is 16K, +performs best when using 16K or 32K file system block sizes. +The default file system block size is 32K, which provides best performance for most applications, with the exception of those that perform random access on large files (such as database server software). Such applications tend to perform better with a smaller block size, although modern disk characteristics are such that the performance gain from using a smaller block size may not be worth consideration. -Using a block size larger than 16K +Using a block size larger than 32K can cause fragmentation of the buffer cache and lead to lower performance. .Pp The defaults may be unsuitable for a file system that requires a very large number of i-nodes or is intended to hold a large number of very small files. -Such a file system should be created with an 8K or 4K block size. +Such a file system should be created with an 4K, 8K, or 16K block size. This also requires you to specify a smaller fragment size. We recommend always using a fragment size that is 1/8 @@ -256,13 +256,13 @@ Do not use this option unless you are actually storing large files on the partition, because if you overcompensate you can wind up with a file system that has lots of free space remaining but cannot accommodate any more files. -Using 32768, 65536, or 262144 bytes/i-node is recommended. +Using 65536, 131072, or 262144 bytes/i-node is recommended. You can go higher but it will have only incremental effects on .Xr fsck 8 recovery times. For example, -.Dq Li "newfs -i 32768 ..." . +.Dq Li "newfs -i 65536 ..." . .Pp .Xr tunefs 8 may be used to further tune a file system. @@ -447,7 +447,7 @@ the content of mapped buffer to the reader. Increasing this value to a higher setting, such as `25165824' might improve performance on systems where space for mapping pipe buffers is quickly exhausted. -This exhaustion is not fatal; however, and it will only cause pipes to +This exhaustion is not fatal; however, and it will only cause pipes to fall back to using double-copy. .Pp The @@ -525,8 +525,8 @@ sysctl governs VFS read-ahead and is expressed as the number of blocks to pre-read if the heuristics algorithm decides that the reads are issued sequentially. It is used by the UFS, ext2fs and msdosfs file systems. -With the default UFS block size of 16 KiB, a setting of 32 will allow -speculatively reading up to 512 KiB. +With the default UFS block size of 32 KiB, a setting of 64 will allow +speculatively reading up to 2 MiB. This setting may be increased to get around disk I/O latencies, especially where these latencies are large such as in virtual machine emulated environments. diff --git a/share/man/man8/picobsd.8 b/share/man/man8/picobsd.8 index 07373f67b5b..f4c403ef888 100644 --- a/share/man/man8/picobsd.8 +++ b/share/man/man8/picobsd.8 @@ -54,7 +54,7 @@ The most important options for common operations are .Fl src , .Fl init , .Fl n and -.Fl v. +.Fl v . .Bl -tag -width indent .\" .It Fl -all_in_mfs @@ -94,7 +94,10 @@ subtree as necessary to subsequently build images. .\" .It Fl -iso -Generate an ISO image, picobsd.iso, in addition to the disk image picobsd.bin +Generate an ISO image, +.Pa picobsd.iso , +in addition to the disk image +.Pa picobsd.bin . .\" .It Fl -modules Also build kernel modules. diff --git a/share/man/man8/rc.8 b/share/man/man8/rc.8 index 56a33ce5b8f..a92c88b6bd5 100644 --- a/share/man/man8/rc.8 +++ b/share/man/man8/rc.8 @@ -253,7 +253,7 @@ The boot does not stop if such a script terminates with a non-zero status, but a script can stop the boot if necessary by invoking the .Fn stop_boot function (from -.Xr rc.subr 8 ). +.Xr rc.subr 8 ) . .El .Pp Each script should contain @@ -452,7 +452,7 @@ before starting the daemon. Following tradition, all startup files reside in .Pa /etc . .Sh FILES -.Bl -tag -compact +.Bl -tag -compact -width Pa .It Pa /etc/rc .It Pa /etc/rc.conf .It Pa /etc/rc.conf.local diff --git a/share/man/man9/BUF_ISLOCKED.9 b/share/man/man9/BUF_ISLOCKED.9 index d55f2f5d005..597038881fc 100644 --- a/share/man/man9/BUF_ISLOCKED.9 +++ b/share/man/man9/BUF_ISLOCKED.9 @@ -52,7 +52,7 @@ It can return: .It Dv LK_EXCLUSIVE An exclusive lock is held by curthread. .It Dv LK_EXCLOTHER -An exclusive lock is held by someone other than curthread +An exclusive lock is held by someone other than curthread. .It Dv LK_SHARED A shared lock is held. .It Li 0 diff --git a/share/man/man9/DB_COMMAND.9 b/share/man/man9/DB_COMMAND.9 index d45205757d9..179f3f3181a 100644 --- a/share/man/man9/DB_COMMAND.9 +++ b/share/man/man9/DB_COMMAND.9 @@ -32,7 +32,7 @@ .Nm DB_COMMAND , .Nm DB_SHOW_COMMAND , .Nm DB_SHOW_ALL_COMMAND -.Nd Extends the ddb command set. +.Nd Extends the ddb command set .Sh SYNOPSIS .In ddb/ddb.h .Fo DB_COMMAND @@ -71,7 +71,7 @@ The general command syntax: .Ar address Ns Op Li , Ns Ar count , translates into the following parameters for .Fa command_function : -.Bl -tag +.Bl -tag -width Fa -offset indent .It Fa addr The address passed to the command as an argument. .It Fa have_addr diff --git a/share/man/man9/DECLARE_GEOM_CLASS.9 b/share/man/man9/DECLARE_GEOM_CLASS.9 index a47ea8e89e8..01f074d86fc 100644 --- a/share/man/man9/DECLARE_GEOM_CLASS.9 +++ b/share/man/man9/DECLARE_GEOM_CLASS.9 @@ -49,7 +49,7 @@ modules GEOM classes and it is the only official way for class registration. The arguments to .Fn DECLARE_GEOM_CLASS are: -.Bl -tag -offset indent +.Bl -tag -offset indent -width Fa .It Fa class The .Vt g_class diff --git a/share/man/man9/EVENTHANDLER.9 b/share/man/man9/EVENTHANDLER.9 index ed83018d763..4a1666087c9 100644 --- a/share/man/man9/EVENTHANDLER.9 +++ b/share/man/man9/EVENTHANDLER.9 @@ -23,7 +23,7 @@ .\" SUCH DAMAGE. .\" $FreeBSD$ .\" -.Dd January 7, 2005 +.Dd May 11, 2012 .Dt EVENTHANDLER 9 .Os .Sh NAME @@ -197,6 +197,8 @@ Callbacks invoked when an interface is cloned. Callbacks invoked when a new network interface appears. .It Vt ifnet_departure_event Callbacks invoked when a network interface is taken down. +.It Vt bpf_track +Callbacks invoked when a BPF listener attaches to/detaches from network interface. .It Vt power_profile_change Callbacks invoked when the power profile of the system changes. .It Vt process_exec diff --git a/share/man/man9/VOP_GETACL.9 b/share/man/man9/VOP_GETACL.9 index d2303408101..6dbaca225ba 100644 --- a/share/man/man9/VOP_GETACL.9 +++ b/share/man/man9/VOP_GETACL.9 @@ -79,7 +79,7 @@ Otherwise, an appropriate error code is returned. .It Bq Er EINVAL The ACL type passed is invalid for this vnode. .It Bq Er EACCES -The the caller does not have the appropriate privilege. +The caller does not have the appropriate privilege. .It Bq Er ENOMEM Sufficient memory is not available to fulfill the request. .It Bq Er EOPNOTSUPP diff --git a/share/man/man9/VOP_GETEXTATTR.9 b/share/man/man9/VOP_GETEXTATTR.9 index cf00d26f48f..998ed2c4651 100644 --- a/share/man/man9/VOP_GETEXTATTR.9 +++ b/share/man/man9/VOP_GETEXTATTR.9 @@ -71,7 +71,7 @@ will be .Dv NULL when .Fa size -is not, and vise versa. +is not, and vice versa. .It Fa cred The user credentials to use in authorizing the request. .It Fa td @@ -102,7 +102,7 @@ Otherwise, an appropriate error code is returned. .It Bq Er ENOATTR The requested attribute was not defined for this vnode. .It Bq Er EACCES -The the caller does not have the appropriate privilege. +The caller does not have the appropriate privilege. .It Bq Er ENXIO The request was not valid in this file system for the specified vnode and attribute name. @@ -113,7 +113,7 @@ The uio structure refers to an invalid userspace address. .It Bq Er EINVAL The .Fa name , -.Fa namespace, +.Fa namespace , or .Fa uio argument is invalid. diff --git a/share/man/man9/VOP_GETPAGES.9 b/share/man/man9/VOP_GETPAGES.9 index e490862045f..b165162f394 100644 --- a/share/man/man9/VOP_GETPAGES.9 +++ b/share/man/man9/VOP_GETPAGES.9 @@ -115,7 +115,7 @@ The page could not be written because of an error on the underlying storage medium or protocol. .It Dv VM_PAGER_FAIL Treated identically to -.Dv VM_PAGER_ERROR +.Dv VM_PAGER_ERROR . .It Dv VM_PAGER_AGAIN The page was not handled by this request. .El diff --git a/share/man/man9/VOP_GETVOBJECT.9 b/share/man/man9/VOP_GETVOBJECT.9 index 2490da710b5..47741d1225b 100644 --- a/share/man/man9/VOP_GETVOBJECT.9 +++ b/share/man/man9/VOP_GETVOBJECT.9 @@ -53,7 +53,7 @@ The vnode of the file. The VM object being returned, or .Dv NULL if the caller wants to test for the existence -of the VM object). +of the VM object. .El .Pp .Xr VFS 9 diff --git a/share/man/man9/VOP_SETACL.9 b/share/man/man9/VOP_SETACL.9 index 482d2898034..b587771270d 100644 --- a/share/man/man9/VOP_SETACL.9 +++ b/share/man/man9/VOP_SETACL.9 @@ -84,7 +84,7 @@ Otherwise, an appropriate error code is returned. .It Bq Er EINVAL The ACL type passed is invalid for this vnode, or the ACL data is invalid. .It Bq Er EACCES -The the caller does not have the appropriate privilege. +The caller does not have the appropriate privilege. .It Bq Er ENOMEM Sufficient memory is not available to fulfill the request. .It Bq Er EOPNOTSUPP diff --git a/share/man/man9/VOP_SETEXTATTR.9 b/share/man/man9/VOP_SETEXTATTR.9 index 4bc53877b5a..edae937b5af 100644 --- a/share/man/man9/VOP_SETEXTATTR.9 +++ b/share/man/man9/VOP_SETEXTATTR.9 @@ -91,12 +91,12 @@ Otherwise, an appropriate error code is returned. .Sh ERRORS .Bl -tag -width Er .It Bq Er EACCES -The the caller does not have the appropriate privilege. +The caller does not have the appropriate privilege. .It Bq Er ENXIO The request was not valid in this file system for the specified vnode and attribute name. .It Bq Er ENOMEM -Insufficient memory available to fulfill request +Insufficient memory available to fulfill the request. .It Bq Er EFAULT The uio structure refers to an invalid userspace address. .It Bq Er EINVAL diff --git a/share/man/man9/acl.9 b/share/man/man9/acl.9 index 21640bd7b86..c6c71591801 100644 --- a/share/man/man9/acl.9 +++ b/share/man/man9/acl.9 @@ -210,7 +210,7 @@ The following values are valid: .Xr vaccess_acl_nfs4 9 , .Xr vaccess_acl_posix1e 9 , .Xr VFS 9 , -.Xr vnaccess 9 , +.Xr vaccess 9 , .Xr VOP_ACLCHECK 9 , .Xr VOP_GETACL 9 , .Xr VOP_SETACL 9 diff --git a/share/man/man9/bpf.9 b/share/man/man9/bpf.9 index 5a3ac07ad27..ebf26cb593a 100644 --- a/share/man/man9/bpf.9 +++ b/share/man/man9/bpf.9 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 13, 2006 +.Dd May 11, 2012 .Dt BPF 9 .Os .\" @@ -246,9 +246,31 @@ The function returns 0 when the program is not a valid filter program. .\" +.Sh EVENT HANDLERS +.Nm +invokes +.Fa bpf_track +.Xr EVENTHANDLER 9 +event each time listener attaches to or detaches from an interface. +Pointer to +.Pq Vt "struct ifnet *" +is passed as the first argument, interface +.Fa dlt +follows. Last argument indicates listener is attached (1) or +detached (0). +Note that handler is invoked with +.Nm +global lock held, which implies restriction on sleeping and calling +.Nm +subsystem inside +.Xr EVENTHANDLER 9 +dispatcher. +Note that handler is not called for write-only listeners. +.\" .Sh SEE ALSO .Xr tcpdump 1 , -.Xr bpf 4 +.Xr bpf 4 , +.Xr EVENTHANDLER 9 .\" .Sh HISTORY The Enet packet filter was created in 1980 by Mike Accetta and diff --git a/share/man/man9/bus_generic_print_child.9 b/share/man/man9/bus_generic_print_child.9 index 80a04ff3d50..388c0a0fb35 100644 --- a/share/man/man9/bus_generic_print_child.9 +++ b/share/man/man9/bus_generic_print_child.9 @@ -51,7 +51,7 @@ foo0: on bar0 bus_generic_print_child itself calls two functions .Fn bus_print_child_header and -.Fn bus_print_child_footer +.Fn bus_print_child_footer . The former prints "foo0: " and the latter "on bar0". These routines should be used if possible in your own code if .Fn bus_generic_print_child diff --git a/share/man/man9/bus_release_resource.9 b/share/man/man9/bus_release_resource.9 index 68187ccc787..35e70d994a1 100644 --- a/share/man/man9/bus_release_resource.9 +++ b/share/man/man9/bus_release_resource.9 @@ -71,7 +71,7 @@ value must be the same as the one returned by .It .Fa r is the pointer to -.Va struct res , +.Va struct resource , i.e., the resource itself, returned by .Xr bus_alloc_resource 9 . diff --git a/share/man/man9/bus_space.9 b/share/man/man9/bus_space.9 index 59c360724ce..6bf03b45209 100644 --- a/share/man/man9/bus_space.9 +++ b/share/man/man9/bus_space.9 @@ -1380,7 +1380,8 @@ functions may be executed in any order. They may also be executed out of order with respect to other pending read and write operations unless order is enforced by use of the -.Fn bus_space_barrier function . +.Fn bus_space_barrier +function. There is no way to insert barriers between reads or writes of individual bus space locations executed by the .Fn bus_space_copy_region_N @@ -1610,7 +1611,7 @@ Access to these types of memory regions should be with the .Fn bus_space_*_stream_N functions. .Pp -.Bl -tag -compact +.Bl -tag -compact -width Fn .It Fn bus_space_read_stream_1 .It Fn bus_space_read_stream_2 .It Fn bus_space_read_stream_4 diff --git a/share/man/man9/byteorder.9 b/share/man/man9/byteorder.9 index 20e31362a36..e5737f6afe7 100644 --- a/share/man/man9/byteorder.9 +++ b/share/man/man9/byteorder.9 @@ -158,7 +158,7 @@ in big/little endian format. The .Fn hto* and -.Fn toh* +.Fn *toh functions first appeared in .Fx 5.0 , and were originally developed by the diff --git a/share/man/man9/cd.9 b/share/man/man9/cd.9 index 59f796dc3d2..f5b748b4f96 100644 --- a/share/man/man9/cd.9 +++ b/share/man/man9/cd.9 @@ -57,7 +57,7 @@ This can lead to drives requiring special handling in the driver. The following is a list of quirks that the driver recognize. .Bl -tag -width CD_Q_BCD_TRACKS .It Dv CD_Q_NO_TOUCH -This flag tell the driver not to probe the drive at attach time to see if +This flag tells the driver not to probe the drive at attach time to see if there is a disk in the drive and find out what size it is. This flag is currently unimplemented in the CAM .Nm diff --git a/share/man/man9/devclass_get_maxunit.9 b/share/man/man9/devclass_get_maxunit.9 index c3be62785c2..40a2d792981 100644 --- a/share/man/man9/devclass_get_maxunit.9 +++ b/share/man/man9/devclass_get_maxunit.9 @@ -49,7 +49,7 @@ The function returns -1 if .Fa dc is -.Dv NULL; +.Dv NULL , otherwise it returns the next unit number in .Fa dc's diff --git a/share/man/man9/device_find_child.9 b/share/man/man9/device_find_child.9 index a23b2b2a145..391f44b7bb9 100644 --- a/share/man/man9/device_find_child.9 +++ b/share/man/man9/device_find_child.9 @@ -41,7 +41,7 @@ .Fn device_find_child "device_t dev" "const char *classname" "int unit" .Sh DESCRIPTION This function looks for a specific child of -.Dv dev . +.Dv dev with the given .Fa classname and diff --git a/share/man/man9/disk.9 b/share/man/man9/disk.9 index 46435122506..d3838881b71 100644 --- a/share/man/man9/disk.9 +++ b/share/man/man9/disk.9 @@ -145,6 +145,16 @@ Optional: if configured with .Xr dumpon 8 , this function is invoked from a very restricted system state after a kernel panic to record a copy of the system RAM to the disk. +.It Vt "disk_getattr_t *" Va d_getattr +Optional: if this method is provided, it gives the disk driver the +opportunity to override the default GEOM response to BIO_GETATTR requests. +This function should return -1 if the attribute is not handled, 0 if the +attribute is handled, or an errno to be passed to g_io_deliver(). +.It Vt "disk_gone_t *" Va d_gone +Optional: if this method is provided, it will be called after disk_gone() +is called, once GEOM has finished its cleanup process. +Once this callback is called, it is safe for the disk driver to free all of +its resources, as it will not be receiving further calls from GEOM. .El .Ss Mandatory Media Properties The following fields identify the size and granularity of the disk device. @@ -180,7 +190,23 @@ Please see .Pa src/sys/geom/notes for details. .It Vt char Va d_ident[DISK_IDENT_SIZE] -This field can and should be used to store disk's serial number. +This field can and should be used to store disk's serial number if the +d_getattr method described above isn't implemented, or if it does not +support the GEOM::ident attribute. +.It Vt char Va d_descr[DISK_IDENT_SIZE] +This field can be used to store the disk vendor and product description. +.It Vt uint16_t Va d_hba_vendor +This field can be used to store the PCI vendor ID for the HBA connected to +the disk. +.It Vt uint16_t Va d_hba_device +This field can be used to store the PCI device ID for the HBA connected to +the disk. +.It Vt uint16_t Va d_hba_subvendor +This field can be used to store the PCI subvendor ID for the HBA connected to +the disk. +.It Vt uint16_t Va d_hba_subdevice +This field can be used to store the PCI subdevice ID for the HBA connected to +the disk. .El .Ss Driver Private Data This field may be used by the device driver to store a pointer to diff --git a/share/man/man9/eventtimers.9 b/share/man/man9/eventtimers.9 index 2ed15d0f805..2f528bfd1ae 100644 --- a/share/man/man9/eventtimers.9 +++ b/share/man/man9/eventtimers.9 @@ -86,7 +86,7 @@ struct eventtimer { Event timers are responsible for generating interrupts at specified time or periodically, to run different time-based events. Subsystem consists of three main parts: -.Bl -tag +.Bl -tag -width "Consumers" .It Drivers Manage hardware to generate requested time events. .It Consumers @@ -107,7 +107,7 @@ Driver API is built around eventtimer structure. To register its functionality driver allocates that structure and calls .Fn et_register . Driver should fill following fields there: -.Bl -tag +.Bl -tag -width Va .It Va et_name Unique name of the event timer for management purposes. .It Va et_flags diff --git a/share/man/man9/fail.9 b/share/man/man9/fail.9 index 5505d137048..6a3d815d6c7 100644 --- a/share/man/man9/fail.9 +++ b/share/man/man9/fail.9 @@ -166,7 +166,7 @@ A pid can optionally be specified. The fail point term is only executed when invoked by a process with a matching p_pid. .Sh EXAMPLES -.Bl -tag +.Bl -tag -width Sy .It Sy sysctl debug.fail_point.foobar="2.1%return(5)" 21/1000ths of the time, execute .Fa code diff --git a/share/man/man9/firmware.9 b/share/man/man9/firmware.9 index 9987e09c2ac..0f4fa9af67e 100644 --- a/share/man/man9/firmware.9 +++ b/share/man/man9/firmware.9 @@ -101,11 +101,13 @@ they want as an argument. If a matching image is not already registered, the firmware subsystem will try to load it using the mechanisms specified below (typically, a kernel module with -.Nm the same name +.Nm +the same name as the image). .Sh API DESCRIPTION The kernel -.Nm firmware API +.Nm +firmware API is made of the following functions: .Pp .Fn firmware_register @@ -225,7 +227,7 @@ in the module, the imagename and version of each firmware image. If you need to embed firmware images into a system, you should write appropriate entries in the file, e.g. this example is from -.Nm sys/arm/xscale/ixp425/files.ixp425: +.Nm sys/arm/xscale/ixp425/files.ixp425 : .Bd -literal ixp425_npe_fw.c optional npe_fw \\ compile-with "${AWK} -f $S/tools/fw_stub.awk \\ diff --git a/share/man/man9/hashinit.9 b/share/man/man9/hashinit.9 index d186dcfe18e..b72cd755119 100644 --- a/share/man/man9/hashinit.9 +++ b/share/man/man9/hashinit.9 @@ -29,7 +29,7 @@ .Dt HASHINIT 9 .Os .Sh NAME -.Nm hashinit , hashinit_flags, hashdestroy , phashinit +.Nm hashinit , hashinit_flags , hashdestroy , phashinit .Nd manage kernel hash tables .Sh SYNOPSIS .In sys/malloc.h diff --git a/share/man/man9/ieee80211_proto.9 b/share/man/man9/ieee80211_proto.9 index 88412eb3533..6b0da064d81 100644 --- a/share/man/man9/ieee80211_proto.9 +++ b/share/man/man9/ieee80211_proto.9 @@ -238,4 +238,4 @@ work will be initiated outside the driver. The state machine concept was part of the original .Nm ieee80211 code base that first appeared in -.Nx 1.5 , +.Nx 1.5 . diff --git a/share/man/man9/ifnet.9 b/share/man/man9/ifnet.9 index dd4fdf53e66..1059c889c62 100644 --- a/share/man/man9/ifnet.9 +++ b/share/man/man9/ifnet.9 @@ -637,7 +637,7 @@ interfaces registered at the interface list. .Aq D This interface blocks transmission of packets and discards incoming packets after BPF processing. -Used to monitor network trafic but not interact +Used to monitor network traffic but not interact with the network in question. .It Dv IFF_STATICARP .Aq D diff --git a/share/man/man9/kqueue.9 b/share/man/man9/kqueue.9 index 555fe545e61..29ae5f7a76a 100644 --- a/share/man/man9/kqueue.9 +++ b/share/man/man9/kqueue.9 @@ -260,8 +260,7 @@ is not required, but is commonly used. If used, the .Vt knlist must be initialized with either -.Fn knlist_init -, +.Fn knlist_init , .Fn knlist_init_mtx or .Fn knlist_init_rw_reader . diff --git a/share/man/man9/lock.9 b/share/man/man9/lock.9 index 0e5cfb15373..bbcf5e81082 100644 --- a/share/man/man9/lock.9 +++ b/share/man/man9/lock.9 @@ -230,7 +230,7 @@ and The .Fn lockmgr_disown function switches the owner from the current thread to be -.Dv LK_KERNPROC, +.Dv LK_KERNPROC , if the lock is already held. .Pp The diff --git a/share/man/man9/locking.9 b/share/man/man9/locking.9 index 00478bf753f..6ec6592e2fb 100644 --- a/share/man/man9/locking.9 +++ b/share/man/man9/locking.9 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 3, 2010 +.Dd May 25, 2012 .Dt LOCKING 9 .Os .Sh NAME @@ -37,11 +37,19 @@ kernel is written to run across multiple CPUs and as such requires several different synchronization primitives to allow the developers to safely access and manipulate the many data types required. .Ss Mutexes -Mutexes (also called "sleep mutexes") are the most commonly used +Mutexes (also erroneously called "sleep mutexes") are the most commonly used synchronization primitive in the kernel. -Thread acquires (locks) a mutex before accessing data shared with other +A thread acquires (locks) a mutex before accessing data shared with other threads (including interrupt threads), and releases (unlocks) it afterwards. -If the mutex cannot be acquired, the thread requesting it will sleep. +If the mutex cannot be acquired, the thread requesting it will wait. +Mutexes are by default adaptive, meaning that +if the owner of a contended mutex is currently running on another CPU, +then a thread attempting to acquire the mutex will briefly spin +in the hope that the owner is only briefly holding it, +and might release it shortly. +If the owner does not do so, the waiting thread proceeds to yield the processor, +allowing other threads to run. +If the owner is not currently actually running then the spin step is skipped. Mutexes fully support priority propagation. .Pp See @@ -49,9 +57,10 @@ See for details. .Ss Spin mutexes Spin mutexes are variation of basic mutexes; the main difference between -the two is that spin mutexes never sleep - instead, they spin, waiting -for the thread holding the lock, which runs on another CPU, to release it. -Differently from ordinary mutex, spin mutexes disable interrupts when acquired. +the two is that spin mutexes never yield the processor - instead, they spin, +waiting for the thread holding the lock, +(which must be running on another CPU), to release it. +Spin mutexes disable interrupts while the held so as to not get pre-empted. Since disabling interrupts is expensive, they are also generally slower. Spin mutexes should be used only when necessary, e.g. to protect data shared with interrupt filter code (see @@ -122,7 +131,7 @@ and read-mostly locks. They don't support priority propagation. They should be considered to be closely related to .Xr sleep 9 . -In fact it could in some cases be +They could in some cases be considered a conditional sleep. .Pp See @@ -146,8 +155,8 @@ A thread must hold the mutex before calling the .Fn cv_wait* , functions. When a thread waits on a condition, the mutex -is atomically released before the thread is blocked, then reacquired -before the function call returns. +is atomically released before the thread thread yields the processor, +then reacquired before the function call returns. .Pp See .Xr condvar 9 @@ -255,14 +264,14 @@ Many of these rules are checked using the .Xr witness 4 code. .Ss Bounded vs. unbounded sleep -The following primitives perform bounded sleep: mutexes, pool mutexes, -reader/writer locks and read-mostly locks. +The following primitives perform bounded sleep: + mutexes, pool mutexes, reader/writer locks and read-mostly locks. .Pp -The following primitives block (perform unbounded sleep): shared/exclusive locks, -counting semaphores, condition variables, sleep/wakeup and lockmanager locks. +The following primitives may perform an unbounded sleep: +shared/exclusive locks, counting semaphores, condition variables, sleep/wakeup and lockmanager locks. .Pp -It is an error to do any operation that could result in any kind of sleep while -holding spin mutex. +It is an error to do any operation that could result in yielding the processor +while holding a spin mutex. .Pp As a general rule, it is an error to do any operation that could result in unbounded sleep while holding any primitive from the 'bounded sleep' group. @@ -280,25 +289,26 @@ This is often a bad idea because it generally relies on the programmer having good knowledge of all of the call graph above the place where .Fn mtx_sleep is being called and assumptions the calling code has made. -Because the lock gets dropped during sleep, one one must re-test all +Because the lock gets dropped during sleep, one must re-test all the assumptions that were made before, all the way up the call graph to the place where the lock was acquired. .Pp -It is an error to do any operation that could result in any kind of sleep when -running inside an interrupt filter. +It is an error to do any operation that could result in yielding of +the processor when running inside an interrupt filter. .Pp It is an error to do any operation that could result in unbounded sleep when running inside an interrupt thread. .Ss Interaction table The following table shows what you can and can not do while holding one of the synchronization primitives discussed: -.Bl -column ".Ic xxxxxxxxxxxxxxxxxxx" ".Xr XXXXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXX" -offset indent -.It Em "You have: You want:" Ta spin mtx Ta mutex Ta sx Ta rwlock Ta rmlock Ta sleep +.Bl -column ".Ic xxxxxxxxxxxxxxxx" ".Xr XXXXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXX" -offset indent +.It Em " You want:" Ta spin-mtx Ta mutex Ta rwlock Ta rmlock Ta sx Ta sleep +.It Em "You have: " Ta ------ Ta ------ Ta ------ Ta ------ Ta ------ Ta ------ .It spin mtx Ta \&ok-1 Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no-3 -.It mutex Ta \&ok Ta \&ok-1 Ta \&no Ta \&ok Ta \&ok Ta \&no-3 -.It sx Ta \&ok Ta \&ok Ta \&ok-2 Ta \&ok Ta \&ok Ta \&ok-4 -.It rwlock Ta \&ok Ta \&ok Ta \&no Ta \&ok-2 Ta \&ok Ta \&no-3 -.It rmlock Ta \&ok Ta \&ok Ta \&ok-5 Ta \&ok Ta \&ok-2 Ta \&ok-5 +.It mutex Ta \&ok Ta \&ok-1 Ta \&ok Ta \&ok Ta \&no Ta \&no-3 +.It rwlock Ta \&ok Ta \&ok Ta \&ok-2 Ta \&ok Ta \&no Ta \&no-3 +.It rmlock Ta \&ok Ta \&ok Ta \&ok Ta \&ok-2 Ta \&no-5 Ta \&no-5 +.It sx Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&no-2 Ta \&ok-4 .El .Pp .Em *1 @@ -315,8 +325,7 @@ and reacquire it on wakeup (e.g. .Fn mtx_sleep , .Fn rw_sleep and -.Fn msleep_spin -). +.Fn msleep_spin ) . .Pp .Em *4 Though one can sleep holding an sx lock, one can also use @@ -358,6 +367,6 @@ These functions appeared in .Bsx 4.1 through -.Fx 7.0 +.Fx 7.0 . .Sh BUGS There are too many locking primitives to choose from. diff --git a/share/man/man9/mbuf.9 b/share/man/man9/mbuf.9 index b029c5219ce..5c940290886 100644 --- a/share/man/man9/mbuf.9 +++ b/share/man/man9/mbuf.9 @@ -403,7 +403,8 @@ for details. Associate externally managed data with .Fa mbuf . Any internal data contained in the mbuf will be discarded, and the -.Dv M_EXT flag will be set. +.Dv M_EXT +flag will be set. The .Fa buf and @@ -722,7 +723,8 @@ are contiguous and lay in the data area of .Fa mbuf , so they are accessible with .Fn mtod mbuf type . -.Fa len must be smaller than, or equal to, the size of an +.Fa len +must be smaller than, or equal to, the size of an .Vt mbuf cluster . Return a pointer to an intermediate .Vt mbuf diff --git a/share/man/man9/mod_cc.9 b/share/man/man9/mod_cc.9 index 75e2db039b5..d753a3c125d 100644 --- a/share/man/man9/mod_cc.9 +++ b/share/man/man9/mod_cc.9 @@ -287,7 +287,7 @@ The CCF_CWND_LIMITED flag is relevant in .Va ack_received and is set when the connection's ability to send data is currently constrained by the value of the congestion window. -Algorithms should use the abscence of this flag being set to avoid accumulating +Algorithms should use the absence of this flag being set to avoid accumulating a large difference between the congestion window and send window. .Sh SEE ALSO .Xr cc_chd 4 , diff --git a/share/man/man9/namei.9 b/share/man/man9/namei.9 index 1ba475a4fe2..dc9ef8edd01 100644 --- a/share/man/man9/namei.9 +++ b/share/man/man9/namei.9 @@ -316,7 +316,7 @@ If successful, .Fn namei will return 0, otherwise it will return an error. .Sh FILES -.Bl -tag +.Bl -tag -width Pa .It Pa src/sys/kern/vfs_lookup.c .El .Sh ERRORS diff --git a/share/man/man9/netisr.9 b/share/man/man9/netisr.9 index bb64b0eb2c8..4377e02d03c 100644 --- a/share/man/man9/netisr.9 +++ b/share/man/man9/netisr.9 @@ -78,7 +78,7 @@ and may also manage queue limits and statistics using the .Fn netisr_getqdrops , .Fn netisr_getqlimit , and -.Fn netisr_setqlimit. +.Fn netisr_setqlimit . .Pp .Nm supports multi-processor execution of handlers, and relies on a combination diff --git a/share/man/man9/pci.9 b/share/man/man9/pci.9 index 4089ee8430e..adc78b53f09 100644 --- a/share/man/man9/pci.9 +++ b/share/man/man9/pci.9 @@ -488,7 +488,7 @@ The .Fn pci_count_msi function returns the maximum number of MSI messages supported by the device -.Fa dev. +.Fa dev . If the device does not support MSI, then .Fn pci_count_msi @@ -567,7 +567,8 @@ is set to the number of messages allocated and returns zero. For MSI-X messages, the resource ID for each -.Dv SYS_RES_IRQ resource identifies the index in the MSI-X table of the +.Dv SYS_RES_IRQ +resource identifies the index in the MSI-X table of the corresponding message. A resource ID of one maps to the first index of the MSI-X table; a resource ID two identifies the second index in the table, etc. @@ -608,7 +609,7 @@ A driver may use a different distribution of available messages to table entries via the .Fn pci_remap_msix function. -Note that this function must be called after a succesful call to +Note that this function must be called after a successful call to .Fn pci_alloc_msix but before any of the .Dv SYS_RES_IRQ @@ -649,7 +650,8 @@ above for .Fn pci_alloc_msix . MSI-X table entries that with a vector of zero will not have an associated -.Dv SYS_RES_IRQ resource. +.Dv SYS_RES_IRQ +resource. Additionally, if any of the original messages allocated by .Fn pci_alloc_msix diff --git a/share/man/man9/rmlock.9 b/share/man/man9/rmlock.9 index 893eb2534f0..78083458072 100644 --- a/share/man/man9/rmlock.9 +++ b/share/man/man9/rmlock.9 @@ -26,7 +26,7 @@ .\" $FreeBSD$ .\" .\" Based on rwlock.9 man page -.Dd November 16, 2011 +.Dd June 8, 2012 .Dt RMLOCK 9 .Os .Sh NAME @@ -41,7 +41,7 @@ .Nm rm_wunlock , .Nm rm_wowned , .Nm RM_SYSINIT -.Nd kernel reader/writer lock optimized for mostly read access patterns +.Nd kernel reader/writer lock optimized for read-mostly access patterns .Sh SYNOPSIS .In sys/param.h .In sys/lock.h @@ -67,7 +67,7 @@ .In sys/kernel.h .Fn RM_SYSINIT "name" "struct rmlock *rm" "const char *desc" "int opts" .Sh DESCRIPTION -Mostly reader locks allow shared access to protected data by multiple threads, +Read-mostly locks allow shared access to protected data by multiple threads, or exclusive access by a single thread. The threads with shared access are known as .Em readers @@ -76,83 +76,82 @@ A thread with exclusive access is known as a .Em writer since it can modify protected data. .Pp -Read mostly locks are designed to be efficient for locks almost exclusively +Read-mostly locks are designed to be efficient for locks almost exclusively used as reader locks and as such should be used for protecting data that rarely changes. -Acquiring an exclusive lock after the lock had been locked for shared access +Acquiring an exclusive lock after the lock has been locked for shared access is an expensive operation. .Pp -Although reader/writer locks look very similar to -.Xr sx 9 -locks, their usage pattern is different. -Reader/writer locks can be treated as mutexes (see -.Xr mutex 9 ) -with shared/exclusive semantics unless initialized with -.Dv RM_SLEEPABLE . +Normal read-mostly locks are similar to +.Xr rwlock 9 +locks and follow the same lock ordering rules as +.Xr rwlock 9 +locks. +Read-mostly locks have full priority propagation like mutexes. Unlike -.Xr sx 9 , -an -.Nm -can be locked while holding a non-spin mutex, and an -.Nm -cannot be held while sleeping, again unless initialized with -.Dv RM_SLEEPABLE . -The -.Nm -locks have full priority propagation like mutexes. -The +.Xr rwlock 9 , +read-mostly locks propagate priority to both readers and writers. +This is implemented via the .Va rm_priotracker -structure argument supplied in +structure argument supplied to .Fn rm_rlock and -.Fn rm_runlock -is used to keep track of the read owner(s). -Another important property is that shared holders of -.Nm -can recurse if the lock has been initialized with the -.Dv LO_RECURSABLE -option, however exclusive locks are not allowed to recurse. +.Fn rm_runlock . +Readers can recurse if the lock is initialized with the +.Dv RM_RECURSE +option; +however, writers are never allowed to recurse. +.Pp +Sleepable read-mostly locks are created by passing +.Dv RM_SLEEPABLE +to +.Fn rm_init_flags . +Unlike normal read-mostly locks, +sleepable read-mostly locks follow the same lock ordering rules as +.Xr sx 9 +locks. +Sleepable read-mostly locks do not propagate priority to writers, +but they do propagate priority to readers. +Writers are permitted to sleep while holding a read-mostly lock, +but readers are not. +Unlike other sleepable locks such as +.Xr sx 9 +locks, +readers must use try operations on other sleepable locks to avoid sleeping. .Ss Macros and Functions .Bl -tag -width indent .It Fn rm_init "struct rmlock *rm" "const char *name" -Initialize structure located at -.Fa rm -as mostly reader lock, described by -.Fa name . -The name description is used solely for debugging purposes. +Initialize the read-mostly lock +.Fa rm . +The +.Fa name +description is used solely for debugging purposes. This function must be called before any other operations on the lock. .It Fn rm_init_flags "struct rmlock *rm" "const char *name" "int opts" -Initialize the rm lock just like the -.Fn rm_init -function, but specifying a set of optional flags to alter the -behaviour of -.Fa rm , -through the +Similar to +.Fn rm_init , +initialize the read-mostly lock +.Fa rm +with a set of optional flags. +The .Fa opts -argument. -It contains one or more of the following flags: +arguments contains one or more of the following flags: .Bl -tag -width ".Dv RM_NOWITNESS" .It Dv RM_NOWITNESS Instruct .Xr witness 4 to ignore this lock. .It Dv RM_RECURSE -Allow threads to recursively acquire exclusive locks for +Allow threads to recursively acquire shared locks for .Fa rm . .It Dv RM_SLEEPABLE -Allow writers to sleep while holding the lock. -Readers must not sleep while holding the lock and can avoid to sleep on -taking the lock by using -.Fn rm_try_rlock -instead of -.Fn rm_rlock . +Create a sleepable read-mostly lock. .El .It Fn rm_rlock "struct rmlock *rm" "struct rm_priotracker* tracker" Lock .Fa rm -as a reader. -Using +as a reader using .Fa tracker to track read owners of a lock for priority propagation. This data structure is only used internally by @@ -161,28 +160,32 @@ and must persist until .Fn rm_runlock has been called. This data structure can be allocated on the stack since -rmlocks cannot be held while sleeping. +readers cannot sleep. If any thread holds this lock exclusively, the current thread blocks, and its priority is propagated to the exclusive holder. If the lock was initialized with the -.Dv LO_RECURSABLE +.Dv RM_RECURSE option the .Fn rm_rlock -function can be called when the thread has already acquired reader +function can be called when the current thread has already acquired reader access on .Fa rm . -This is called -.Dq "recursing on a lock" . .It Fn rm_try_rlock "struct rmlock *rm" "struct rm_priotracker* tracker" Try to lock .Fa rm as a reader. .Fn rm_try_rlock will return 0 if the lock cannot be acquired immediately; -otherwise the lock will be acquired and a non-zero value will be returned. +otherwise, +the lock will be acquired and a non-zero value will be returned. Note that .Fn rm_try_rlock may fail even while the lock is not currently held by a writer. +If the lock was initialized with the +.Dv RM_RECURSE +option, +.Fn rm_try_rlock +will succeed if the current thread has already acquired reader access. .It Fn rm_wlock "struct rmlock *rm" Lock .Fa rm diff --git a/share/man/man9/rtalloc.9 b/share/man/man9/rtalloc.9 index ab5379a8803..ea22f8717d4 100644 --- a/share/man/man9/rtalloc.9 +++ b/share/man/man9/rtalloc.9 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 14, 2011 +.Dd July 4, 2012 .Dt RTALLOC 9 .Os .Sh NAME @@ -52,6 +52,7 @@ .Fn RT_UNLOCK "struct rt_entry *rt" .Fn RT_ADDREF "struct rt_entry *rt" .Fn RT_REMREF "struct rt_entry *rt" +.Fn RO_RTFREE "struct route *ro" .Ft void .Fn rtfree "struct rt_entry *rt" .Ft "struct rtentry *" @@ -203,6 +204,14 @@ Its usage is contrary to .Fn RT_ADDREF . .Pp The +.Fn RO_RTFREE +macro is used to free route entry that is referenced by struct route. +At certain circumstances the latter may not hold a reference on rtentry, +and +.Fn RO_RTFREE +treats such routes correctly. +.Pp +The .Fn rtfree function does the actual free of the routing table entry, and shouldn't be called directly by facilities, that just perform routing table lookups. diff --git a/share/man/man9/rwlock.9 b/share/man/man9/rwlock.9 index f7da699a458..45fc3bd804d 100644 --- a/share/man/man9/rwlock.9 +++ b/share/man/man9/rwlock.9 @@ -114,12 +114,10 @@ cannot be held while sleeping. The .Nm locks have priority propagation like mutexes, but priority -can be propagated only to an exclusive holder. -This limitation comes from the fact that shared owners +can be propagated only to writers. +This limitation comes from the fact that readers are anonymous. -Another important property is that shared holders of -.Nm -can recurse, +Another important property is that readers can always recurse, and exclusive locks can be made recursive selectively. .Ss Macros and Functions .Bl -tag -width indent diff --git a/share/man/man9/spl.9 b/share/man/man9/spl.9 index 08fd4d46607..3bfa556d4b7 100644 --- a/share/man/man9/spl.9 +++ b/share/man/man9/spl.9 @@ -112,8 +112,7 @@ The system automatically arranges for interrupts in the .Em xxx group to be called at a priority >= -.Ns spl Ns Em xxx -\&(). +.Em spl Ns Fn xxx .Pp The function .Fn splx @@ -221,7 +220,8 @@ the system. The historical number scheme can be considered as a simple linearly ordered set of interrupt priority groups. .Pp -.Fx 5.0 eliminated spl entirely in favor of locking primitives which scale +.Fx 5.0 +eliminated spl entirely in favor of locking primitives which scale to more than one processor. .Sh AUTHORS This manual page was written by diff --git a/share/man/man9/store.9 b/share/man/man9/store.9 index e3297e1fb13..d333eff0331 100644 --- a/share/man/man9/store.9 +++ b/share/man/man9/store.9 @@ -76,13 +76,13 @@ Stores a byte of data to the user-space address Stores a word of data to the user-space address .Pa base . .It Fn suword16 -Stores 16 bits of of data to the user-space address +Stores 16 bits of data to the user-space address .Pa base . .It Fn suword32 -Stores 32 bits of of data to the user-space address +Stores 32 bits of data to the user-space address .Pa base . .It Fn suword64 -Stores 64 bits of of data to the user-space address +Stores 64 bits of data to the user-space address .Pa base . .It Fn suswintr Stores a short word of data to the user-space address diff --git a/share/man/man9/sysctl.9 b/share/man/man9/sysctl.9 index d58573b247a..5399b5681d0 100644 --- a/share/man/man9/sysctl.9 +++ b/share/man/man9/sysctl.9 @@ -107,7 +107,7 @@ This is a 64-bit signed integer. This is an opaque data structure. .It Dv CTLTYPE_STRUCT Alias for -.Dv CTLTYPE_OPAQUE. +.Dv CTLTYPE_OPAQUE . .It Dv CTLTYPE_UINT This is an unsigned integer. .It Dv CTLTYPE_LONG diff --git a/share/man/man9/taskqueue.9 b/share/man/man9/taskqueue.9 index 319aa2f23bf..f1a43b609cf 100644 --- a/share/man/man9/taskqueue.9 +++ b/share/man/man9/taskqueue.9 @@ -189,8 +189,8 @@ The count is cleared, and the old value returned in the reference parameter .Fa pendp , -if it is non- -.Dv NULL . +if it is +.Pf non- Dv NULL . If the task is currently running, .Dv EBUSY is returned, otherwise 0. diff --git a/share/man/man9/usbdi.9 b/share/man/man9/usbdi.9 index c04c946e310..03cc3057b82 100644 --- a/share/man/man9/usbdi.9 +++ b/share/man/man9/usbdi.9 @@ -435,7 +435,7 @@ The value of this field is given in milliseconds and is independent of device speed. . Depending on the endpoint type, this field has different meaning: -.Bl -tag +.Bl -tag -width "UE_ISOCHRONOUS" .It UE_INTERRUPT "0" use the default interrupt interval based on endpoint descriptor. "Else" use the given value for polling rate. @@ -461,7 +461,7 @@ timeout of 250ms will be used. .Fa frames field sets the maximum number of frames. If zero is specified it will yield the following results: -.Bl -tag +.Bl -tag -width "UE_INTERRUPT" .It UE_BULK xfer->nframes = 1; .It UE_INTERRUPT @@ -487,7 +487,7 @@ be used when setting up the given USB transfer. .Fa flags field has type "struct usb_xfer_flags" and allows one to set initial flags an USB transfer. Valid flags are: -.Bl -tag +.Bl -tag -width "force_short_xfer" .It force_short_xfer This flag forces the last transmitted USB packet to be short. A short packet has a length of less than "xfer->max_packet_size", which @@ -507,7 +507,7 @@ This flag causes a failing USB transfer to remain first in the PIPE queue except in the case of "xfer->error" equal to "USB_ERR_CANCELLED". No other USB transfers in the affected PIPE queue will be started until either: -.Bl -tag +.Bl -tag -width "1" .It 1 The failing USB transfer is stopped using "usbd_transfer_stop()". .It 2 @@ -524,7 +524,7 @@ executed on the USB control endpoint. . This flag can be changed during operation. .Pp -"BOF" is short for "Block On Failure" +"BOF" is short for "Block On Failure". .Pp NOTE: This flag should be set on all BULK and INTERRUPT USB transfers which use an endpoint that can be shared between userland and kernel. @@ -574,7 +574,7 @@ flag can not be changed during operation. . . .It stall_pipe -.Bl -tag +.Bl -tag -width "Device Side Mode" .It Device Side Mode Setting this flag will cause STALL pids to be sent to the endpoint belonging to this transfer before the transfer is started. diff --git a/share/man/man9/vm_page_aflag.9 b/share/man/man9/vm_page_aflag.9 index 8ef5d8703c9..4500bd2d69c 100644 --- a/share/man/man9/vm_page_aflag.9 +++ b/share/man/man9/vm_page_aflag.9 @@ -27,7 +27,7 @@ .\" $FreeBSD$ .\" .Dd August 31, 2011 -.Dt VM_PAGE_FLAG 9 +.Dt VM_PAGE_AFLAG 9 .Os .Sh NAME .Nm vm_page_aflag_clear , vm_page_aflag_set , vm_page_reference diff --git a/share/misc/bsd-family-tree b/share/misc/bsd-family-tree index 43ab9d643f7..eba25d03fe3 100644 --- a/share/misc/bsd-family-tree +++ b/share/misc/bsd-family-tree @@ -253,7 +253,7 @@ FreeBSD 5.2 | | | | *--FreeBSD | | | | | | 9.0 | | | | DragonFly 3.0.1 | v FreeBSD | | | | - | 8.3 | | | | + | 8.3 | | OpenBSD 5.1 | | | | | | FreeBSD 10 -current | NetBSD -current OpenBSD -current | | | | | | @@ -546,6 +546,7 @@ OpenBSD 5.0 2011-11-01 [OBD] FreeBSD 9.0 2012-01-12 [FBD] DragonFly 3.0.1 2012-02-21 [DFB] FreeBSD 8.3 2012-04-18 [FBD] +OpenBSD 5.1 2012-05-01 [OBD] Bibliography ------------------------ diff --git a/share/misc/committers-doc.dot b/share/misc/committers-doc.dot index 9908dfa6449..f3f43e3e4eb 100644 --- a/share/misc/committers-doc.dot +++ b/share/misc/committers-doc.dot @@ -32,15 +32,19 @@ node [color=grey62, style=filled, bgcolor=black]; ache [label="Andrey Chernov\nache@FreeBSD.org\n1997/06/13\n2010/12/11"] bmah [label="Bruce A. Mah\nbmah@FreeBSD.org\n2000/08/22\n2009/09/13"] bvs [label="Vitaly Bogdanov\nbvs@FreeBSD.org\n2005/10/03\n2010/12/11"] +ceri [label="Ceri Davies\nceri@FreeBSD.org\n2002/03/17\n2012/02/29"] den [label="Denis Peplin\nden@FreeBSD.org\n2003/09/13\n2009/07/09"] garys [label="Gary W. Swearingen\ngarys@FreeBSD.org\n2005/08/21\n2008/03/02"] jcamou [label="Jesus R. Camou\njcamou@FreeBSD.org\n2005/03/02\n2008/12/20"] jesusr [label="Jesus Rodriguez Cuesta\njesusr@FreeBSD.org\n1998/12/10\n2010/12/11"] jim [label="Jim Mock\njim@FreeBSD.org\n1999/08/11\n2003/12/15"] josef [label="Josef El-Rayes\njosef@FreeBSD.org\n2004/01/15\n2008/03/29"] +marcel [label="Marcel Moolenaar\nmarcel@FreeBSD.org\n1999/07/03\n2012/04/25"] mheinen [label="Martin Heinen\nmheinen@FreeBSD.org\n2002/10/04\n2006/04/26"] +murray [label="Murray Stokely\nmurray@FreeBSD.org\n2000/04/05\n2012/04/25"] nik [label="Nik Clayton\nnik@FreeBSD.org\n1998/02/26\n2008/12/20"] pgj [label="Gabor Pali\npgj@FreeBSD.org\n2008/04/21\n2010/12/01"] +roam [label="Peter Pentchev\nroam@FreeBSD.org\n2003/02/14\n2012/02/29"] node [color=lightblue2, style=filled, bgcolor=black]; @@ -51,7 +55,6 @@ bcr [label="Benedict Reuschling\nbcr@FreeBSD.org\n2009/12/24"] blackend [label="Marc Fonvieille\nblackend@FreeBSD.org\n2002/06/16"] brd [label="Brad Davis\nbrd@FreeBSD.org\n2005/06/01"] brueffer [label="Christian Brueffer\nbrueffer@FreeBSD.org\n2003/01/13"] -ceri [label="Ceri Davies\nceri@FreeBSD.org\n2002/03/17"] chinsan [label="Chinsan Huang\nchinsan@FreeBSD.org\n2006/09/20"] danger [label="Daniel Gerzo\ndanger@FreeBSD.org\n2006/08/20"] delphij [label="Xin Li\ndelphij@FreeBSD.org\n2004/09/14"] @@ -60,27 +63,26 @@ ganbold [label="Ganbold Tsagaankhuu\nganbold@FreeBSD.org\n2008/02/26"] gavin [label="Gavin Atkinson\ngavin@FreeBSD.org\n2011/07/18"] gjb [label="Glen Barber\ngjb@FreeBSD.org\n2010/09/01"] hrs [label="Hiroki Sato\nhrs@FreeBSD.org\n2000/07/06"] +issyl0 [label="Isabell Long\nissyl0@FreeBSD.org\n2012/04/25"] jkois [label="Johann Kois\njkois@FreeBSD.org\n2004/11/11"] joel [label="Joel Dahl\njoel@FreeBSD.org\n2005/04/05"] keramida [label="Giorgos Keramidas\nkeramida@FreeBSD.org\n2001/10/12"] linimon [label="Mark Linimon\nlinimon@FreeBSD.org\n2004/03/31"] loader [label="Fukang Chen\nloader@FreeBSD.org\n2007/07/30"] manolis [label="Manolis Kiagias\nmanolis@FreeBSD.org\n2008/05/24"] -marcel [label="Marcel Moolenaar\nmarcel@FreeBSD.org\n1999/07/03"] marck [label="Dmitry Morozovsky\nmarck@FreeBSD.org\n2004/08/10"] maxim [label="Maxim Konovalov\nmaxim@FreeBSD.org\n2002/02/07"] miwi [label="Martin Wilke\nmiwi@FreeBSD.org\n2007/10/26"] -murray [label="Murray Stokely\nmurray@FreeBSD.org\n2000/04/05"] pav [label="Pav Lucistnik\npav@FreeBSD.org\n2005/08/12"] pluknet [label="Sergey Kandaurov\npluknet@FreeBSD.org\n2012/02/14"] remko [label="Remko Lodder\nremko@FreeBSD.org\n2004/10/16"] rene [label="Rene Ladan\nrene@FreeBSD.org\n2008/11/03"] -roam [label="Peter Pentchev\nroam@FreeBSD.org\n2003/02/14"] ryusuke [label="Ryusuke Suzuki\nryusuke@FreeBSD.org\n2009/12/21"] simon [label="Simon L. Nielsen\nsimon@FreeBSD.org\n2003/07/20"] taras [label="Taras Korenko\ntaras@FreeBSD.org\n2010/06/25"] trhodes [label="Tom Rhodes\ntrhodes@FreeBSD.org\n2002/03/25"] wblock [label="Warren Block\nwblock@FreeBSD.org\n2011/09/12"] +zeising [label="Niclas Zeising\nzeising@FreeBSD.org\n2012/07/03"] # Here are the mentor/mentee relationships. # Group together all the mentees for a particular mentor. @@ -107,6 +109,7 @@ delphij -> loader gabor -> pgj gabor -> manolis gabor -> taras +gabor -> issyl0 gjb -> wblock @@ -121,6 +124,8 @@ jkois -> bcr jkois -> gavin jkois -> gjb +joel -> zeising + keramida -> blackend keramida -> danger keramida -> gabor diff --git a/share/misc/committers-ports.dot b/share/misc/committers-ports.dot index 2e897f2a976..5b4819dd4b0 100644 --- a/share/misc/committers-ports.dot +++ b/share/misc/committers-ports.dot @@ -59,8 +59,8 @@ az [label="Andrej Zverev\naz@FreeBSD.org\n2005/10/03"] bapt [label="Baptiste Daroussin\nbapt@FreeBSD.org\n2010/07/27"] beat [label="Beat Gaetzi\nbeat@FreeBSD.org\n2009/01/28"] beech [label="Beech Rintoul\nbeech@FreeBSD.org\n2007/05/30"] -bland [label="Alexander Nedotsukov\nbland@FreeBSD.org\n2003/08/14"] bf [label="Brendan Fabeny\nbf@FreeBSD.org\n2010/06/02"] +bland [label="Alexander Nedotsukov\nbland@FreeBSD.org\n2003/08/14"] brix [label="Henrik Brix Andersen\nbrix@FreeBSD.org\n2007/10/31"] brooks [label="Brooks Davies\nbrooks@FreeBSD.org\n2004/05/03"] bsam [label="Boris Samorodov\nbsam@FreeBSD.org\n2006/07/20"] @@ -93,6 +93,7 @@ gabor [label="Gabor Kovesdan\ngabor@FreeBSD.org\n2006/12/05"] gahr [label="Pietro Cerutti\ngahr@FreeBSD.org\n2008/02/20"] garga [label="Renato Botelho\ngarga@FreeBSD.org\n2005/07/11"] gerald [label="Gerald Pfeifer\ngerald@FreeBSD.org\n2002/04/03"] +gjb [label="Glen Barber\ngjb@FreeBSD.org\n2012/06/19"] glarkin [label="Greg Larkin\nglarkin@FreeBSD.org\n2008/07/17"] glewis [label="Greg Lewis\nglewis@FreeBSD.org\n2002/04/08"] hq [label="Herve Quiroz\nhq@FreeBSD.org\n2004/08/05"] @@ -100,6 +101,7 @@ ijliao [label="Ying-Chieh Liao\nijliao@FreeBSD.org\n2001/01/20"] itetcu [label="Ion-Mihai Tetcu\nitetcu@FreeBSD.org\n2006/06/07"] jacula [label="Giuseppe Pilichi\njacula@FreeBSD.org\n2010/04/05"] jadawin [label="Philippe Audeoud\njadawin@FreeBSD.org\n2008/03/02"] +jase [label="Jase Thew\njase@FreeBSD.org\n2012/05/30"] jgh [label="Jason Helfman\njgh@FreeBSD.org\n2011/12/16"] jkim [label="Jung-uk Kim\njkim@FreeBSD.org\n2007/09/12"] jlaffaye [label="Julien Laffaye\njlaffaye@FreeBSD.org\n2011/06/06"] @@ -111,11 +113,11 @@ jpaetzel [label="Josh Paetzel\njpaetzel@FreeBSD.org\n2008/09/05"] jsa [label="Joseph S. Atkinson\njsa@FreeBSD.org\n2010/07/15"] jylefort [label="Jean-Yves Lefort\njylefort@FreeBSD.org\n2005/04/12"] kevlo [label="Kevin Lo\nkevlo@FreeBSD.org\n2003/02/21"] -knu [label="Akinori Musha\nknu@FreeBSD.org\n2000/03/22"] -krion [label="Kirill Ponomarew\nkrion@FreeBSD.org\n2003/07/20"] kmoore [label="Kris Moore\nkmoore@FreeBSD.org\n2009/04/14"] -kwm [label="Koop Mast\nkwm@FreeBSD.org\n2004/09/14"] +knu [label="Akinori Musha\nknu@FreeBSD.org\n2000/03/22"] koitsu [label="Jeremy Chadwick\nkoitsu@FreeBSD.org\n2006/11/10"] +krion [label="Kirill Ponomarew\nkrion@FreeBSD.org\n2003/07/20"] +kwm [label="Koop Mast\nkwm@FreeBSD.org\n2004/09/14"] laszlof [label="Frank Laszlo\nlaszlof@FreeBSD.org\n2006/11/07"] lawrance [label="Sam Lawrance\nlawrance@FreeBSD.org\n2005/04/11\n2007/02/21"] lbr [label="Lars Balker Rasmussen\nlbr@FreeBSD.org\n2006/04/30"] @@ -138,6 +140,7 @@ martymac [label="Ganael Laplanche\nmartymac@FreeBSD.org\n2010/09/24"] mat [label="Mathieu Arnold\nmat@FreeBSD.org\n2003/08/15"] matthew [label="Matthew Seaman\nmatthew@FreeBSD.org\n2012/02/07"] mezz [label="Jeremy Messenger\nmezz@FreeBSD.org\n2004/04/30"] +mharo [label="Michael Haro\nmharo@FreeBSD.org\n1999/04/13"] miwi [label="Martin Wilke\nmiwi@FreeBSD.org\n2006/06/04"] mm [label="Martin Matuska\nmm@FreeBSD.org\n2007/04/04"] mnag [label="Marcus Alves Grando\nmnag@FreeBSD.org\n2005/09/15"] @@ -149,14 +152,14 @@ nork [label="Norikatsu Shigemura\nnork@FreeBSD.org\n2002/04/01"] novel [label="Roman Bogorodskiy\nnovel@FreeBSD.org\n2005/03/07"] nox [label="Juergen Lock\nnox@FreeBSD.org\n2006/12/22"] obrien [label="David E. O'Brien\nobrien@FreeBSD.org\n1996/10/29"] -mharo [label="Michael Haro\nmharo@FreeBSD.org\n1999/04/13"] +olivierd [label="Olivier Duchateau\nolivierd@FreeBSD.org\n2012/05/29"] osa [label="Sergey A. Osokin\nosa@FreeBSD.org\n2003/06/04"] pat [label="Patrick Li\npat@FreeBSD.org\n2001/11/14"] pav [label="Pav Lucistnik\npav@FreeBSD.org\n2003/11/12"] pawel [label="Pawel Pekala\npawel@FreeBSD.org\n2011/03/11"] pgj [label="Gabor Pali\npgj@FreeBSD.org\n2009/04/12"] -philip [label="Philip Paeps\nphilip@FreeBSD.org\n2005/10/19"] pgollucci [label="Philip M. Gollucci\npgollucci@FreeBSD.org\n2008/07/21"] +philip [label="Philip Paeps\nphilip@FreeBSD.org\n2005/10/19"] rafan [label="Rong-En Fan\nrafan@FreeBSD.org\n2006/06/23"] rakuco [label="Raphael Kubo da Costa\nrakuco@FreeBSD.org\n2011/08/22"] rene [label="Rene Ladan\nrene@FreeBSD.org\n2010/04/11"] @@ -178,22 +181,24 @@ stas [label="Stanislav Sedov\nstas@FreeBSD.org\n2006/09/18"] stefan [label="Stefan Walter\nstefan@FreeBSD.org\n2006/05/07"] stephen [label="Stephen Montgomery-Smith\nstephen@FreeBSD.org\n2011/06/13"] sunpoet [label="Po-Chuan Hsieh\nsunpoet@FreeBSD.org\n2010/09/21"] -sylvio [label="Sylvio Cesar Teixeira\nsylvio@FreeBSD.org\n2009/10/29"] swills [label="Steve Wills\nswills@FreeBSD.org\n2010/09/03"] +sylvio [label="Sylvio Cesar Teixeira\nsylvio@FreeBSD.org\n2009/10/29"] tabthorpe [label="Thomas Abthorpe\ntabthorpe@FreeBSD.org\n2007/08/20"] tdb [label="Tim Bishop\ntdb@FreeBSD.org\n2005/11/30"] +thierry [label="Thierry Thomas\nthierry@FreeBSD.org\n2004/03/15"] timur [label="Timur Bakeyev\ntimur@FreeBSD.org\n2007/06/07"] +tj [label="Tom Judge\ntj@FreeBSD.org\n2012/05/28"] +tmclaugh [label="Tom McLaughlin\ntmclaugh@FreeBSD.org\n2005/09/15"] tota [label="TAKATSU Tomonari\ntota@FreeBSD.org\n2009/03/30"] trasz [label="Edward Tomasz Napierala\ntrasz@FreeBSD.org\n2007/04/12"] trhodes [label="Tom Rhodes\ntrhodes@FreeBSD.org\n2004/07/06"] -thierry [label="Thierry Thomas\nthierry@FreeBSD.org\n2004/03/15"] -tmclaugh [label="Tom McLaughlin\ntmclaugh@FreeBSD.org\n2005/09/15"] uqs [label="Ulrich Spoerlein\nuqs@FreeBSD.org\n2012/01/19"] vd [label="Vasil Dimov\nvd@FreeBSD.org\n2006/01/19"] wen [label="Wen Heping\nwen@FreeBSD.org\n2010/12/13"] wxs [label="Wesley Shields\nwxs@FreeBSD.org\n2008/01/03"] xride [label="Soeren Straarup\nxride@FreeBSD.org\n2006/09/27"] yzlin [label="Yi-Jheng Lin\nyzlin@FreeBSD.org\n2009/07/19"] +zeising [label="Niclas Zeising\nzeising@FreeBSD.org\n2012/07/03"] zi [label="Ryan Steinmetz\nzi@FreeBSD.org\n2011/07/14"] znerd [label="Ernst de Haan\nznerd@FreeBSD.org\n2001/11/15"] @@ -242,9 +247,14 @@ clement -> lawrance clsung -> lwhsu clsung -> tabthorpe +crees -> gjb crees -> jgh crees -> madpilot +culot -> jase + +db -> tj + decke -> sperber delphij -> nemoliu @@ -253,6 +263,8 @@ delphij -> rafan demon -> mat eadler -> ak +eadler -> gjb +eadler -> tj edwin -> cperciva edwin -> erwin @@ -277,6 +289,8 @@ fjoe -> flo fjoe -> krion fjoe -> osa +flo -> jase + flz -> garga flz -> johans flz -> laszlof @@ -332,6 +346,7 @@ krion -> sem krion -> sergei kwm -> jsa +kwm -> zeising lawrance -> itetcu @@ -371,6 +386,7 @@ miwi -> makc miwi -> mandree miwi -> mva miwi -> nox +miwi -> olivierd miwi -> pawel miwi -> rm miwi -> sbz @@ -379,6 +395,7 @@ miwi -> sylvio miwi -> tabthorpe miwi -> trasz miwi -> wen +miwi -> zeising mnag -> jmelo @@ -413,6 +430,7 @@ rafan -> chinsan rene -> crees rene -> jgh +rene -> olivierd sahil -> culot sahil -> eadler diff --git a/share/misc/committers-src.dot b/share/misc/committers-src.dot index c3f00d571b7..c0e600e2236 100644 --- a/share/misc/committers-src.dot +++ b/share/misc/committers-src.dot @@ -39,6 +39,7 @@ billf [label="Bill Fumerola\nbillf@FreeBSD.org\n1998/11/11\n2008/11/10"] bmah [label="Bruce A. Mah\nbmah@FreeBSD.org\n2002/01/29\n2009/09/13"] bmilekic [label="Bosko Milekic\nbmilekic@FreeBSD.org\n2000/09/21\n2008/11/10"] bushman [label="Michael Bushkov\nbushman@FreeBSD.org\n2007/03/10\n2010/04/29"] +ceri [label="Ceri Davies\nceri@FreeBSD.org\n2006/11/07\n2012/03/07"] cjc [label="Crist J. Clark\ncjc@FreeBSD.org\n2001/06/01\n2006/12/29"] dds [label="Diomidis Spinellis\ndds@FreeBSD.org\n2003/06/20\n2010/09/22"] dhartmei [label="Daniel Hartmeier\ndhartmei@FreeBSD.org\n2004/04/06\n2008/12/08"] @@ -58,20 +59,21 @@ jtc [label="J.T. Conklin\njtc@FreeBSD.org\n1993/06/12\n????/??/??"] kbyanc [label="Kelly Yancey\nkbyanc@FreeBSD.org\n2000/07/11\n2006/07/25"] keichii [label="Michael Wu\nkeichii@FreeBSD.org\n2001/03/07\n2006/04/28"] linimon [label="Mark Linimon\nlinimon@FreeBSD.org\n2006/09/30\n2008/05/04"] +lulf [label="Ulf Lilleengen\nlulf@FreeBSD.org\n2007/10/24\n2012/01/19"] mb [label="Maxim Bolotin\nmb@FreeBSD.org\n2000/04/06\n2003/03/08"] marks [label="Mark Santcroos\nmarks@FreeBSD.org\n2004/03/18\n2008/09/29"] mike [label="Mike Barcroft\nmike@FreeBSD.org\n2001/07/17\n2006/04/28"] msmith [label="Mike Smith\nmsmith@FreeBSD.org\n????/??/??\n2003/12/15"] murray [label="Murray Stokely\nmurray@FreeBSD.org\n2000/04/05\n2010/07/25"] +mux [label="Maxime Henrion\nmux@FreeBSD.org\n2002/03/03\n2011/06/22"] nate [label="Nate Willams\nnate@FreeBSD.org\n1993/06/12\n2003/12/15"] njl [label="Nate Lawson\nnjl@FreeBSD.org\n2002/08/07\n2008/02/16"] non [label="Noriaki Mitsnaga\nnon@FreeBSD.org\n2000/06/19\n2007/03/06"] onoe [label="Atsushi Onoe\nonoe@FreeBSD.org\n2000/07/21\n2008/11/10"] +randi [label="Randi Harper\nrandi@FreeBSD.org\n2010/04/20\n2012/05/10"] rgrimes [label="Rod Grimes\nrgrimes@FreeBSD.org\n1993/06/12\n2003/03/08"] rink [label="Rink Springer\nrink@FreeBSD.org\n2006/01/16\n2010/11/04"] robert [label="Robert Drehmel\nrobert@FreeBSD.org\n2001/08/23\n2006/05/13"] -rmh [label="Robert Millan\nrmh@FreeBSD.org\n2011/09/18"] -rpaulo [label="Rui Paulo\nrpaulo@FreeBSD.org\n2007/09/25\n2010/12/03"] sah [label="Sam Hopkins\nsah@FreeBSD.org\n2004/12/15\n2008/11/10"] shafeeq [label="Shafeeq Sinnamohideen\nshafeeq@FreeBSD.org\n2000/06/19\n2006/04/06"] sheldonh [label="Sheldon Hearn\nsheldonh@FreeBSD.org\n1999/06/14\n2006/05/13"] @@ -82,6 +84,7 @@ tmm [label="Thomas Moestl\ntmm@FreeBSD.org\n2001/03/07\n2006/07/12"] toshi [label="Toshihiko Arai\ntoshi@FreeBSD.org\n2000/07/06\n2003/03/08"] tshiozak [label="Takuya SHIOZAKI\ntshiozak@FreeBSD.org\n2001/04/25\n2003/03/08"] uch [label="UCHIYAMA Yasushi\nuch@FreeBSD.org\n2000/06/21\n2002/04/24"] +yar [label="Yar Tikhiy\nyar@FreeBSD.org\n2001/03/25\n2012/05/23"] node [color=lightblue2, style=filled, bgcolor=black]; @@ -112,7 +115,6 @@ brueffer [label="Christian Brueffer\nbrueffer@FreeBSD.org\n2006/02/28"] bruno [label="Bruno Ducrot\nbruno@FreeBSD.org\n2005/07/18"] bschmidt [label="Bernhard Schmidt\nbschmidt@FreeBSD.org\n2010/02/06"] bz [label="Bjoern A. Zeeb\nbz@FreeBSD.org\n2004/07/27"] -ceri [label="Ceri Davies\nceri@FreeBSD.org\n2006/11/07"] cognet [label="Olivier Houchard\ncognet@FreeBSD.org\n2002/10/09"] cokane [label="Coleman Kane\ncokane@FreeBSD.org\n2000/06/19"] cperciva [label="Colin Percival\ncperciva@FreeBSD.org\n2004/01/20"] @@ -128,6 +130,7 @@ dg [label="David Greenman\ndg@FreeBSD.org\n1993/06/14"] dim [label="Dimitry Andric\ndim@FreeBSD.org\n2010/08/30"] dougb [label="Doug Barton\ndougb@FreeBSD.org\n2000/10/26"] dteske [label="Devin Teske\ndteske@FreeBSD.org\n2012/04/10"] +dumbbell [label="Jean-Sebastien Pedron\ndumbbell@FreeBSD.org\n2004/11/29"] dwmalone [label="David Malone\ndwmalone@FreeBSD.org\n2000/07/11"] ed [label="Ed Schouten\ned@FreeBSD.org\n2008/05/22"] edwin [label="Edwin Groothuis\nedwin@FreeBSD.org\n2007/06/25"] @@ -176,6 +179,7 @@ jon [label="Jonathan Chen\njon@FreeBSD.org\n2000/10/17"] jonathan [label="Jonathan Anderson\njonathan@FreeBSD.org\n2010/10/07"] jpaetzel [label="Josh Paetzel\njpaetzel@FreeBSD.org\n2011/01/21"] julian [label="Julian Elischer\njulian@FreeBSD.org\n1993/??/??"] +jwd [label="John De Boskey\njwd@FreeBSD.org\n2000/05/19"] kaiw [label="Kai Wang\nkaiw@FreeBSD.org\n2007/09/26"] kan [label="Alexander Kabaev\nkan@FreeBSD.org\n2002/07/21"] kargl [label="Steven G. Kargl\nkargl@FreeBSD.org\n2011/01/17"] @@ -185,7 +189,6 @@ kib [label="Konstantin Belousov\nkib@FreeBSD.org\n2006/06/03"] kmacy [label="Kip Macy\nkmacy@FreeBSD.org\n2005/06/01"] le [label="Lukas Ertl\nle@FreeBSD.org\n2004/02/02"] lstewart [label="Lawrence Stewart\nlstewart@FreeBSD.org\n2008/10/06"] -lulf [label="Ulf Lilleengen\nlulf@FreeBSD.org\n2007/10/24"] marcel [label="Marcel Moolenaar\nmarcel@FreeBSD.org\n1999/07/03"] marius [label="Marius Strobl\nmarius@FreeBSD.org\n2004/04/17"] markm [label="Mark Murray\nmarkm@FreeBSD.org\n199?/??/??"] @@ -197,10 +200,10 @@ mdf [label="Matthew Fleming\nmdf@FreeBSD.org\n2010/06/04"] mdodd [label="Matthew N. Dodd\nmdodd@FreeBSD.org\n1999/07/27"] melifaro [label="Alexander V. Chernikov\nmelifaro@FreeBSD.org\n2011/10/04"] mjacob [label="Matt Jacob\nmjacob@FreeBSD.org\n1997/08/13"] +mjg [label="Mateusz Guzik\nmjg@FreeBSD.org\n2012/06/04"] mlaier [label="Max Laier\nmlaier@FreeBSD.org\n2004/02/10"] monthadar [label="Monthadar Al Jaberi\nmonthadar@FreeBSD.org\n2012/04/02"] mr [label="Michael Reifenberger\nmr@FreeBSD.org\n2001/09/30"] -mux [label="Maxime Henrion\nmux@FreeBSD.org\n2002/03/03"] neel [label="Neel Natu\nneel@FreeBSD.org\n2009/09/20"] netchild [label="Alexander Leidinger\nnetchild@FreeBSD.org\n2005/03/31"] nork [label="Norikatsu Shigemura\nnork@FreeBSD.org\n2009/06/09"] @@ -211,7 +214,7 @@ olli [label="Oliver Fromme\nolli@FreeBSD.org\n2008/02/14"] peadar [label="Peter Edwards\npeadar@FreeBSD.org\n2004/03/08"] peter [label="Peter Wemm\npeter@FreeBSD.org\n????/??/??"] pfg [label="Pedro Giffuni\npfg@FreeBSD.org\n2011/12/01"] -philip [label="Philip Paeps\nphilip@FreBSD.org\n2004/01/21"] +philip [label="Philip Paeps\nphilip@FreeBSD.org\n2004/01/21"] phk [label="Poul-Henning Kamp\nphk@FreeBSD.org\n1994/02/21"] pho [label="Peter Holm\npho@FreeBSD.org\n2008/11/16"] pjd [label="Pawel Jakub Dawidek\npjd@FreeBSD.org\n2004/02/02"] @@ -219,14 +222,15 @@ pluknet [label="Sergey Kandaurov\npluknet@FreeBSD.org\n2010/10/05"] ps [label="Paul Saab\nps@FreeBSD.org\n2000/02/23"] qingli [label="Qing Li\nqingli@FreeBSD.org\n2005/04/13"] rafan [label="Rong-En Fan\nrafan@FreeBSD.org\n2007/01/31"] -randi [label="Randi Harper\nrandi@FreeBSD.org\n2010/04/20"] ray [label="Aleksandr Rybalko\nray@FreeBSD.org\n2011/05/25"] rdivacky [label="Roman Divacky\nrdivacky@FreeBSD.org\n2008/03/13"] remko [label="Remko Lodder\nremko@FreeBSD.org\n2007/02/23"] rik [label="Roman Kurakin\nrik@FreeBSD.org\n2003/12/18"] rmacklem [label="Rick Macklem\nrmacklem@FreeBSD.org\n2009/03/27"] +rmh [label="Robert Millan\nrmh@FreeBSD.org\n2011/09/18"] rnoland [label="Robert Noland\nrnoland@FreeBSD.org\n2008/09/15"] roberto [label="Ollivier Robert\nroberto@FreeBSD.org\n1995/02/22"] +rpaulo [label="Rui Paulo\nrpaulo@FreeBSD.org\n2007/09/25"] rrs [label="Randall R Stewart\nrrs@FreeBSD.org\n2007/02/08"] rse [label="Ralf S. Engelschall\nrse@FreeBSD.org\n1997/07/31"] rstone [label="Ryan Stone\nrstone@FreeBSD.org\n2010/04/19"] @@ -264,7 +268,6 @@ wes [label="Wes Peters\nwes@FreeBSD.org\n1998/11/25"] wilko [label="Wilko Bulte\nwilko@FreeBSD.org\n2000/01/13"] wollman [label="Garrett Wollman\nwollman@FreeBSD.org\n????/??/??"] wsalamon [label="Wayne Salamon\nwsalamon@FreeBSD.org\n2005/06/25"] -yar [label="Yar Tikhiy\nyar@FreeBSD.org\n2001/03/25"] yongari [label="Pyun YongHyeon\nyongari@FreeBSD.org\n2004/08/01"] zack [label="Zack Kirsch\nzack@FreeBSD.org\n2010/11/05"] zec [label="Marko Zec\nzec@FreeBSD.org\n2008/06/22"] @@ -433,10 +436,12 @@ jhb -> avg jhb -> jeff jhb -> kbyanc jhb -> rnoland +jhb -> pfg jkh -> imp jkh -> jlemon jkh -> joerg +jkh -> jwd jkh -> phk jkh -> wes jkh -> yar @@ -506,6 +511,7 @@ msmith -> scottl murray -> delphij mux -> cognet +mux -> dumbbell netchild -> ariff @@ -539,6 +545,8 @@ pjd -> trociny rgrimes -> markm +rmacklem -> jwd + rpaulo -> avg rpaulo -> bschmidt rpaulo -> dim @@ -596,6 +604,7 @@ thompsa -> weongyo thompsa -> eri trasz -> jh +trasz -> mjg ume -> jinmei ume -> suz diff --git a/share/misc/organization.dot b/share/misc/organization.dot index 891097dee53..79313595f1a 100644 --- a/share/misc/organization.dot +++ b/share/misc/organization.dot @@ -26,12 +26,12 @@ _misc [label="Miscellaneous Hats"] # Development teams go here alphabetically sorted core [label="Core Team\ncore@FreeBSD.org\nwilko, brooks, keramida, imp,\ngnn, wes, hrs, murray,\nrwatson"] -coresecretary [label="Core Team Secretary\ncore-secretary@FreeBSD.org\njoel"] +coresecretary [label="Core Team Secretary\ncore-secretary@FreeBSD.org\ngavin"] doccommitters [label="Doc/www Committers\ndoc-committers@FreeBSD.org"] -doceng [label="Documentation Engineering Team\ndoceng@FreeBSD.org\nnik, blackend, hrs,\nkeramida"] +doceng [label="Documentation Engineering Team\ndoceng@FreeBSD.org\ngjb, blackend,\ngabor, hrs"] portscommitters [label="Ports Committers\nports-committers@FreeBSD.org"] -portmgr [label="Port Management Team\nportmgr@FreeBSD.org\nmarcus, kris, erwin,\nlinimon, pav, krion"] -portmgrsecretary [label="Port Management Team Secretary\nportmgr-secretary@FreeBSD.org\nerwin"] +portmgr [label="Port Management Team\nportmgr@FreeBSD.org\ntabthorpe, marcus, bapt, beat,\nerwin, linimon, pav,\nitetcu, flz, miwi"] +portmgrsecretary [label="Port Management Team Secretary\nportmgr-secretary@FreeBSD.org\ntabthorpe"] re [label="Primary Release Engineering Team\nre@FreeBSD.org\nmux, bmah, hrs, kensmith,\nmurray, rwatson, dwhite"] realpha [label="FreeBSD/alpha Release Engineering Team\nre-alpha@FreeBSD.org\nwilko, murray, rwatson"] reamd64 [label="FreeBSD/amd64 Release Engineering Team\nre-amd64@FreeBSD.org\nobrien"] @@ -40,7 +40,7 @@ reia64 [label="FreeBSD/ia64 Release Engineering Team\nre-ia64@FreeBSD.org\nmarce repc98 [label="FreeBSD/pc98 Release Engineering Team\nre-pc98@FreeBSD.org\nnyan"] reppc [label="FreeBSD/ppc Release Engineering Team\nre-ppc@FreeBSD.org\ngrehan"] resparc64 [label="FreeBSD/sparc64 Release Engineering Team\nre-sparc64@FreeBSD.org\njake, phk, tmm, obrien,\nkensmith, murray, rwatson"] -secteam [label="Security Team\nsecteam@FreeBSD.org\nmnag, remko, gnn, simon, philip,\ncperciva, csjp, des,\nnectar, rwatson"] +secteam [label="Security Team\nsecteam@FreeBSD.org\nsimon, qingli, delphij,\nremko, philip, stas, cperciva,\ncsjp, rwatson, miwi, bz"] secteamsecretary [label="Security Team Secretary\nsecteam-secretary@FreeBSD.org\nremko"] securityofficer [label="Security Officer Team\nsecurity-officer@FreeBSD.org\ncperciva, simon, nectar"] srccommitters [label="Src Committers\nsrc-committers@FreeBSD.org"] diff --git a/share/mk/bsd.README b/share/mk/bsd.README index 51cfb3970fe..f09142e838e 100644 --- a/share/mk/bsd.README +++ b/share/mk/bsd.README @@ -228,7 +228,7 @@ LDADD Additional loader objects. Usually used for libraries. For example, to load with the compatibility and utility libraries, use: - LDFILES=-lutil -lcompat + LDADD=-lutil -lcompat LDFLAGS Additional loader flags. @@ -261,7 +261,7 @@ DPADD Additional dependencies for the program. Usually used for libraries. For example, to depend on the compatibility and utility libraries use: - SRCLIB=${LIBCOMPAT} ${LIBUTIL} + DPADD=${LIBCOMPAT} ${LIBUTIL} There is a predefined identifier for each (non-profiled, non-shared) library and object. Library file names are @@ -352,6 +352,10 @@ SRCS List of source files to build the library. Suffix types to .c files of the same name. (This is not the default for versions of make.) +SHLIB_LDSCRIPT Template file to generate shared library linker script. + Unless used, a simple symlink is created to the real + shared object. + The include file includes the file named "../Makefile.inc" if it exists, as well as the include file . diff --git a/share/mk/bsd.crunchgen.mk b/share/mk/bsd.crunchgen.mk index 540c6d21dc6..80d337f8b16 100644 --- a/share/mk/bsd.crunchgen.mk +++ b/share/mk/bsd.crunchgen.mk @@ -105,7 +105,7 @@ $(CONF): Makefile .MAKEFLAGS:= ${.MAKEFLAGS:N-P} .ORDER: $(OUTPUTS) objs $(OUTPUTS): $(CONF) - MAKEOBJDIRPREFIX=${CRUNCHOBJS} crunchgen -fq -m $(OUTMK) \ + MAKE=${MAKE} MAKEOBJDIRPREFIX=${CRUNCHOBJS} crunchgen -fq -m $(OUTMK) \ -c $(OUTC) $(CONF) $(PROG): $(OUTPUTS) objs diff --git a/share/mk/bsd.lib.mk b/share/mk/bsd.lib.mk index a4abe2f231e..efaf9dcae0b 100644 --- a/share/mk/bsd.lib.mk +++ b/share/mk/bsd.lib.mk @@ -74,7 +74,7 @@ PO_FLAG=-pg ${CC} ${PICFLAG} -DPIC ${SHARED_CFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET} ${CTFCONVERT_CMD} -.cc.o: +.cc.o .C.o .cpp.o .cxx.o: ${CXX} ${STATIC_CXXFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET} .cc.po .C.po .cpp.po .cxx.po: @@ -271,6 +271,25 @@ _libinstall: ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \ ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR} .if defined(SHLIB_LINK) +# ${_SHLIBDIRPREFIX} and ${_LDSCRIPTROOT} are both needed when cross-building +# and when building 32 bits library shims. ${_SHLIBDIRPREFIX} is the directory +# prefix where shared objects will be installed. ${_LDSCRIPTROOT} is the +# directory prefix that will be used in generated ld(1) scripts. They cannot +# be coalesced because of the way ld(1) handles the sysroot prefix (used in the +# cross-toolchain): +# - 64 bits libs are located under sysroot, so ${_LDSCRIPTROOT} must be empty. +# - 32 bits shims are not, so ${_LDSCRIPTROOT} is used to specify their full +# path. Note that ld(1) scripts are generated both during buildworld and +# installworld; in the later case ${_LDSCRIPTROOT} must be obviously empty. +# On the other hand, the use of ${_SHLIBDIRPREFIX} is more consistent since it +# does not involve the logic of a tool we do not own. +.if defined(SHLIB_LDSCRIPT) && !empty(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT}) + sed -e 's,@@SHLIB@@,${_LDSCRIPTROOT}${SHLIBDIR}/${SHLIB_NAME},g' \ + -e 's,@@LIBDIR@@,${_LDSCRIPTROOT}${LIBDIR},g' \ + ${.CURDIR}/${SHLIB_LDSCRIPT} > lib${LIB}.ld + ${INSTALL} -S -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ + ${_INSTALLFLAGS} lib${LIB}.ld ${DESTDIR}${LIBDIR}/${SHLIB_LINK} +.else .if ${SHLIBDIR} == ${LIBDIR} ln -fs ${SHLIB_NAME} ${DESTDIR}${LIBDIR}/${SHLIB_LINK} .else @@ -281,8 +300,9 @@ _libinstall: rm -f ${DESTDIR}${LIBDIR}/${SHLIB_NAME} .endif .endif -.endif -.endif +.endif # SHLIB_LDSCRIPT +.endif # SHLIB_LINK +.endif # SHIB_NAME .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no" ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${LIBDIR} @@ -350,6 +370,9 @@ clean: .endif .if defined(SHLIB_NAME) .if defined(SHLIB_LINK) +.if defined(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT}) + rm -f lib${LIB}.ld +.endif rm -f ${SHLIB_LINK} .endif .if defined(LIB) && !empty(LIB) diff --git a/share/mk/bsd.libnames.mk b/share/mk/bsd.libnames.mk index 564074eb395..5e41c5c4c40 100644 --- a/share/mk/bsd.libnames.mk +++ b/share/mk/bsd.libnames.mk @@ -135,6 +135,7 @@ LIBPANEL?= ${DESTDIR}${LIBDIR}/libpanel.a LIBPCAP?= ${DESTDIR}${LIBDIR}/libpcap.a LIBPMC?= ${DESTDIR}${LIBDIR}/libpmc.a LIBPROC?= ${DESTDIR}${LIBDIR}/libproc.a +LIBPROCSTAT?= ${DESTDIR}${LIBDIR}/libprocstat.a LIBPTHREAD?= ${DESTDIR}${LIBDIR}/libpthread.a LIBRADIUS?= ${DESTDIR}${LIBDIR}/libradius.a LIBREADLINE?= ${DESTDIR}${LIBDIR}/libreadline.a diff --git a/share/mk/bsd.own.mk b/share/mk/bsd.own.mk index 55d6ba26207..ba4a8967284 100644 --- a/share/mk/bsd.own.mk +++ b/share/mk/bsd.own.mk @@ -334,6 +334,7 @@ __DEFAULT_YES_OPTIONS = \ CXX \ DICT \ DYNAMICROOT \ + ED_CRYPTO \ EXAMPLES \ FLOPPY \ FORTH \ @@ -366,6 +367,7 @@ __DEFAULT_YES_OPTIONS = \ LOCALES \ LOCATE \ LPR \ + LS_COLORS \ MAIL \ MAILWRAPPER \ MAKE \ @@ -383,6 +385,7 @@ __DEFAULT_YES_OPTIONS = \ OPENSSL \ PAM \ PF \ + PKGBOOTSTRAP \ PKGTOOLS \ PMC \ PORTSNAP \ @@ -421,11 +424,15 @@ __DEFAULT_NO_OPTIONS = \ CLANG_EXTRAS \ CLANG_IS_CC \ CTF \ + GNU_SORT \ HESIOD \ ICONV \ IDEA \ + INSTALL_AS_USER \ LIBCPLUSPLUS \ - OFED + NAND \ + OFED \ + SHARED_TOOLCHAIN # # Default behaviour of some options depends on the architecture. Unfortunately @@ -441,8 +448,7 @@ __T=${TARGET_ARCH} __T=${MACHINE_ARCH} .endif # Clang is only for x86 and powerpc right now, by default. -# XXX: Temporarily disabled for 32-bit powerpc, due to a binutils bug. -.if ${__T} == "amd64" || ${__T} == "i386" || ${__T} == "powerpc64" +.if ${__T} == "amd64" || ${__T} == "i386" || ${__T:Mpowerpc*} __DEFAULT_YES_OPTIONS+=CLANG .else __DEFAULT_NO_OPTIONS+=CLANG @@ -635,12 +641,23 @@ MK_${vv:H}:= ${MK_${vv:T}} .if ${MK_CTF} != "no" CTFCONVERT_CMD= ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} -.elif ${MAKE_VERSION} >= 5201111300 +.elif defined(MAKE_VERSION) && ${MAKE_VERSION} >= 5201111300 CTFCONVERT_CMD= .else CTFCONVERT_CMD= @: .endif +.if ${MK_INSTALL_AS_USER} != "no" +_uid!= id -un +.if ${_uid} != 0 +_gid!= id -gn +.for x in BIN CONF DOC INFO KMOD LIB MAN NLS SHARE +$xOWN= ${_uid} +$xGRP= ${_gid} +.endfor +.endif +.endif + .endif # !_WITHOUT_SRCCONF .endif # !target(____) diff --git a/share/mk/bsd.sys.mk b/share/mk/bsd.sys.mk index f0237501777..28c1a1814a6 100644 --- a/share/mk/bsd.sys.mk +++ b/share/mk/bsd.sys.mk @@ -61,7 +61,8 @@ CWARNFLAGS+= -Wno-uninitialized CWARNFLAGS+= -Wno-pointer-sign # Clang has more warnings enabled by default, and when using -Wall, so if WARNS # is set to low values, these have to be disabled explicitly. -.if ${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang" +.if (${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang") && \ + !defined(EARLY_BUILD) .if ${WARNS} <= 6 CWARNFLAGS+= -Wno-empty-body -Wno-string-plus-int .endif # WARNS <= 6 @@ -88,7 +89,8 @@ WFORMAT= 1 .if ${WFORMAT} > 0 #CWARNFLAGS+= -Wformat-nonliteral -Wformat-security -Wno-format-extra-args CWARNFLAGS+= -Wformat=2 -Wno-format-extra-args -.if ${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang" +.if (${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang") && \ + !defined(EARLY_BUILD) .if ${WARNS} <= 3 CWARNFLAGS+= -Wno-format-nonliteral .endif # WARNS <= 3 @@ -109,7 +111,8 @@ CWARNFLAGS+= -Wno-format CWARNFLAGS+= -Wno-unknown-pragmas .endif # IGNORE_PRAGMA -.if ${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang" +.if (${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang") && \ + !defined(EARLY_BUILD) CLANG_NO_IAS= -no-integrated-as CLANG_OPT_SMALL= -mstack-alignment=8 -mllvm -inline-threshold=3\ -mllvm -enable-load-pre=false -mllvm -simplifycfg-dup-ret diff --git a/share/skel/dot.cshrc b/share/skel/dot.cshrc index 5fa23197914..b6658259cdd 100644 --- a/share/skel/dot.cshrc +++ b/share/skel/dot.cshrc @@ -3,13 +3,14 @@ # .cshrc - csh resource script, read at beginning of execution by each shell # # see also csh(1), environ(7). +# more examples available at /usr/share/examples/csh/ # alias h history 25 alias j jobs -l -alias la ls -a +alias la ls -aF alias lf ls -FA -alias ll ls -lA +alias ll ls -lAF # A righteous umask umask 22 @@ -17,18 +18,29 @@ umask 22 set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin $HOME/bin) setenv EDITOR vi -setenv PAGER more +setenv PAGER less setenv BLOCKSIZE K if ($?prompt) then # An interactive shell -- set some stuff up + if ($uid == 0) then + set user = root + endif + set prompt = "%n@%m:%/ %# " + set promptchars = "%#" + set filec - set history = 100 - set savehist = 100 + set history = 1000 + set savehist = (1000 merge) + set autolist = ambiguous + # Use history to aid expansion + set autoexpand + set autorehash set mail = (/var/mail/$USER) if ( $?tcsh ) then bindkey "^W" backward-delete-word bindkey -k up history-search-backward bindkey -k down history-search-forward endif + endif diff --git a/share/syscons/keymaps/INDEX.keymaps b/share/syscons/keymaps/INDEX.keymaps index 95681f49507..04b4fa2a23c 100644 --- a/share/syscons/keymaps/INDEX.keymaps +++ b/share/syscons/keymaps/INDEX.keymaps @@ -378,6 +378,8 @@ ru.koi8-r.win.kbd:pt:Russo koi8-r (winkeys) ru.koi8-r.win.kbd:es:Ruso koi8-r (winkeys) ru.koi8-r.win.kbd:uk:òÏÓ¦ÊÓØËÁ koi8-r (winkeys) +spanish.dvorak.kbd:en:Spanish Dvorak + spanish.iso.kbd:en:Spanish ISO-8859-1 spanish.iso.kbd:de:Spanisch ISO-8859-1 spanish.iso.kbd:fr:Espagnol ISO-8859-1 diff --git a/share/syscons/keymaps/Makefile b/share/syscons/keymaps/Makefile index 3eefc2c0385..883ffbac727 100644 --- a/share/syscons/keymaps/Makefile +++ b/share/syscons/keymaps/Makefile @@ -36,6 +36,7 @@ FILES= INDEX.keymaps \ ru.cp866.kbd ru.iso5.kbd \ si.iso.kbd \ sk.iso2.kbd \ + spanish.dvorak.kbd \ spanish.iso.kbd spanish.iso.acc.kbd spanish.iso15.acc.kbd \ swedish.iso.kbd swedish.cp850.kbd \ swissfrench.iso.kbd swissfrench.iso.acc.kbd swissfrench.cp850.kbd \ diff --git a/share/syscons/keymaps/spanish.dvorak.kbd b/share/syscons/keymaps/spanish.dvorak.kbd new file mode 100644 index 00000000000..022a87d7174 --- /dev/null +++ b/share/syscons/keymaps/spanish.dvorak.kbd @@ -0,0 +1,139 @@ +# $FreeBSD$ +# alt +# scan cntrl alt alt cntrl lock +# code base shift cntrl shift alt shift cntrl shift state +# ------------------------------------------------------------------ + 000 nop nop nop nop nop nop nop nop O + 001 esc esc esc esc esc esc debug esc O + 002 '1' '!' nop nop '|' '!' nop nop O + 003 '2' '"' nop nop '@' '"' nop nop O + 004 '3' 183 nop nop '#' '#' nop nop O + 005 '4' '$' nop nop '~' '~' nop nop O + 006 '5' '%' nop nop '5' '%' nop nop O + 007 '6' '&' nop nop 172 172 nop nop O + 008 '7' '/' nop nop '7' '/' nop nop O + 009 '8' '(' nop nop '8' '(' nop nop O + 010 '9' ')' nop nop '9' ')' nop nop O + 011 '0' '=' nop nop '0' '=' nop nop O + 012 ''' '?' nop nop ''' '?' nop nop O + 013 161 191 nop nop 161 191 nop nop O + 014 bs bs del del bs bs del del O + 015 ht btab nop nop ht btab nop nop O + 016 '.' ':' nop nop '.' ':' nop nop O + 017 ',' ';' nop nop ',' ';' nop nop O + 018 241 209 nop nop '~' '~' nop nop O + 019 'p' 'P' dle dle 'p' 'P' dle dle C + 020 'y' 'Y' em em 'y' 'Y' em em C + 021 'f' 'F' ack ack 'f' 'F' ack ack C + 022 'g' 'G' bel bel 'g' 'G' bel bel C + 023 'c' 'C' etx etx 'c' 'C' etx etx C + 024 'h' 'H' bs bs 'h' 'H' bs bs C + 025 'l' 'L' ff ff 'l' 'L' ff ff C + 026 dgra dcir esc esc '[' '[' esc esc O + 027 '+' '*' gs gs ']' ']' gs gs O + 028 cr cr nl nl cr cr nl nl O + 029 lctrl lctrl lctrl lctrl lctrl lctrl lctrl lctrl O + 030 'a' 'A' soh soh 'a' 'A' soh soh C + 031 'o' 'O' si si 243 211 si si C + 032 'e' 'E' enq enq 164 164 enq enq C + 033 'u' 'U' nak nak 250 218 nak nak C + 034 'i' 'I' ht ht 237 205 ht ht C + 035 'd' 'D' eot eot 'd' 'D' eot eot C + 036 'r' 'R' dc2 dc2 'r' 'R' dc2 dc2 C + 037 't' 'T' dc4 dc4 't' 'T' dc4 dc4 C + 038 'n' 'N' so so 'n' 'N' so so C + 039 's' 'S' dc3 dc3 's' 'S' dc3 dc3 C + 040 dacu duml nop nop '{' '{' nop nop O + 041 '\' '|' fs fs '\' '|' fs fs O + 042 lshift lshift lshift lshift lshift lshift lshift lshift O + 043 231 199 rs rs '}' '}' rs rs O + 044 '-' '_' us us '-' '_' us us O + 045 'q' 'Q' dc1 dc1 'q' 'Q' dc1 dc1 C + 046 'j' 'J' nl nl 'j' 'J' nl nl C + 047 'k' 'K' vt vt 'k' 'K' vt vt C + 048 'x' 'X' can can 'x' 'X' can can C + 049 'b' 'B' stx stx 'b' 'B' stx stx C + 050 'm' 'M' cr cr 'm' 'M' cr cr C + 051 'w' 'W' etb etb 'w' 'W' etb etb C + 052 'v' 'V' syn syn 'v' 'V' syn syn C + 053 'z' 'Z' sub sub 'z' 'Z' sub sub C + 054 rshift rshift rshift rshift rshift rshift rshift rshift O + 055 '*' '*' '*' '*' '*' '*' '*' '*' O + 056 lalt lalt lalt lalt lalt lalt lalt lalt O + 057 ' ' ' ' nul ' ' ' ' ' ' susp ' ' O + 058 clock clock clock clock clock clock clock clock O + 059 fkey01 fkey13 fkey25 fkey37 scr01 scr11 scr01 scr11 O + 060 fkey02 fkey14 fkey26 fkey38 scr02 scr12 scr02 scr12 O + 061 fkey03 fkey15 fkey27 fkey39 scr03 scr13 scr03 scr13 O + 062 fkey04 fkey16 fkey28 fkey40 scr04 scr14 scr04 scr14 O + 063 fkey05 fkey17 fkey29 fkey41 scr05 scr15 scr05 scr15 O + 064 fkey06 fkey18 fkey30 fkey42 scr06 scr16 scr06 scr16 O + 065 fkey07 fkey19 fkey31 fkey43 scr07 scr07 scr07 scr07 O + 066 fkey08 fkey20 fkey32 fkey44 scr08 scr08 scr08 scr08 O + 067 fkey09 fkey21 fkey33 fkey45 scr09 scr09 scr09 scr09 O + 068 fkey10 fkey22 fkey34 fkey46 scr10 scr10 scr10 scr10 O + 069 nlock nlock nlock nlock nlock nlock nlock nlock O + 070 slock slock slock slock slock slock slock slock O + 071 fkey49 '7' '7' '7' '7' '7' '7' '7' N + 072 fkey50 '8' '8' '8' '8' '8' '8' '8' N + 073 fkey51 '9' '9' '9' '9' '9' '9' '9' N + 074 fkey52 '-' '-' '-' '-' '-' '-' '-' N + 075 fkey53 '4' '4' '4' '4' '4' '4' '4' N + 076 fkey54 '5' '5' '5' '5' '5' '5' '5' N + 077 fkey55 '6' '6' '6' '6' '6' '6' '6' N + 078 fkey56 '+' '+' '+' '+' '+' '+' '+' N + 079 fkey57 '1' '1' '1' '1' '1' '1' '1' N + 080 fkey58 '2' '2' '2' '2' '2' '2' '2' N + 081 fkey59 '3' '3' '3' '3' '3' '3' '3' N + 082 fkey60 '0' '0' '0' '0' '0' '0' '0' N + 083 del '.' '.' '.' '.' '.' boot boot N + 084 nop nop nop nop nop nop nop nop O + 085 nop nop nop nop nop nop nop nop O + 086 '<' '>' nop nop '<' '>' nop nop O + 087 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O + 088 fkey12 fkey24 fkey36 fkey48 scr12 scr12 scr12 scr12 O + 089 cr cr nl nl cr cr nl nl O + 090 rctrl rctrl rctrl rctrl rctrl rctrl rctrl rctrl O + 091 '/' '/' '/' '/' '/' '/' '/' '/' N + 092 nscr pscr debug debug nop nop nop nop O + 093 ralt ralt ralt ralt ralt ralt ralt ralt O + 094 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 O + 095 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 O + 096 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 O + 097 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 O + 098 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 O + 099 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 O + 100 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 O + 101 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 O + 102 fkey60 paste fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 O + 103 fkey61 fkey61 fkey61 fkey61 fkey61 fkey61 boot fkey61 O + 104 slock saver slock saver susp nop susp nop O + 105 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 O + 106 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 O + 107 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 O + 108 nop nop nop nop nop nop nop nop O + + dgra '`' ( 'a' 224 ) ( 'A' 192 ) ( 'e' 232 ) ( 'E' 200 ) + ( 'i' 236 ) ( 'I' 204 ) ( 'o' 242 ) ( 'O' 210 ) + ( 'u' 249 ) ( 'U' 217 ) + dacu 180 ( 'a' 225 ) ( 'A' 193 ) ( 'e' 233 ) ( 'E' 201 ) + ( 'i' 237 ) ( 'I' 205 ) ( 'o' 243 ) ( 'O' 211 ) + ( 'u' 250 ) ( 'U' 218 ) ( 'y' 253 ) ( 'Y' 221 ) + dcir '^' ( 'a' 226 ) ( 'A' 194 ) ( 'e' 234 ) ( 'E' 202 ) + ( 'i' 238 ) ( 'I' 206 ) ( 'o' 244 ) ( 'O' 212 ) + ( 'u' 251 ) ( 'U' 219 ) + dtil '~' ( 'a' 227 ) ( 'A' 195 ) ( 'n' 241 ) ( 'N' 209 ) + ( 'o' 245 ) ( 'O' 213 ) + dmac 000 + dbre 000 + ddot 000 + duml 168 ( 'a' 228 ) ( 'A' 196 ) ( 'e' 235 ) ( 'E' 203 ) + ( 'i' 239 ) ( 'I' 207 ) ( 'o' 246 ) ( 'O' 214 ) + ( 'u' 252 ) ( 'U' 220 ) ( 'y' 255 ) + dsla 000 + drin 176 ( 'a' 229 ) ( 'A' 197 ) + dced 184 ( 'c' 231 ) ( 'C' 199 ) + dapo 000 + ddac 000 + dogo 000 + dcar 000 diff --git a/share/termcap/termcap.5 b/share/termcap/termcap.5 index 1fae963c347..1f9c7eabe94 100644 --- a/share/termcap/termcap.5 +++ b/share/termcap/termcap.5 @@ -1821,7 +1821,7 @@ from the status line can be given as .Sy \&ts and .Sy \&fs . -.Pf ( Xr \&fs +.Pf ( Sy \&fs must leave the cursor position in the same place that it was before .Sy \&ts . If necessary, the @@ -2067,7 +2067,7 @@ for ^C. .Pp Other specific terminal problems may be corrected by adding more capabilities of the form -.Sy x Em x . +.Sy x Ns Em x . .Ss Similar Terminals If there are two very similar terminals, one can be defined as being just like the other with certain exceptions. diff --git a/sys/amd64/acpica/acpi_machdep.c b/sys/amd64/acpica/acpi_machdep.c index 25dd173240a..f57bdc20968 100644 --- a/sys/amd64/acpica/acpi_machdep.c +++ b/sys/amd64/acpica/acpi_machdep.c @@ -44,8 +44,6 @@ __FBSDID("$FreeBSD$"); #include -SYSCTL_DECL(_debug_acpi); - int acpi_resume_beep; TUNABLE_INT("debug.acpi.resume_beep", &acpi_resume_beep); SYSCTL_INT(_debug_acpi, OID_AUTO, resume_beep, CTLFLAG_RW, &acpi_resume_beep, diff --git a/sys/amd64/acpica/acpi_switch.S b/sys/amd64/acpica/acpi_switch.S deleted file mode 100644 index 11e53564ccf..00000000000 --- a/sys/amd64/acpica/acpi_switch.S +++ /dev/null @@ -1,177 +0,0 @@ -/*- - * Copyright (c) 2001 Takanori Watanabe - * Copyright (c) 2001 Mitsuru IWASAKI - * Copyright (c) 2008-2012 Jung-uk Kim - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include -#include - -#include "acpi_wakedata.h" -#include "assym.s" - -#define WAKEUP_CTX(member) wakeup_ ## member - wakeup_ctx(%rsi) - -ENTRY(acpi_restorecpu) - /* Switch to KPML4phys. */ - movq %rdi, %cr3 - - /* Restore GDT. */ - lgdt WAKEUP_CTX(gdt) - jmp 1f -1: - - /* Fetch PCB. */ - movq WAKEUP_CTX(pcb), %rdi - - /* Force kernel segment registers. */ - movl $KDSEL, %eax - movw %ax, %ds - movw %ax, %es - movw %ax, %ss - movl $KUF32SEL, %eax - movw %ax, %fs - movl $KUG32SEL, %eax - movw %ax, %gs - - movl $MSR_FSBASE, %ecx - movl PCB_FSBASE(%rdi), %eax - movl 4 + PCB_FSBASE(%rdi), %edx - wrmsr - movl $MSR_GSBASE, %ecx - movl PCB_GSBASE(%rdi), %eax - movl 4 + PCB_GSBASE(%rdi), %edx - wrmsr - movl $MSR_KGSBASE, %ecx - movl PCB_KGSBASE(%rdi), %eax - movl 4 + PCB_KGSBASE(%rdi), %edx - wrmsr - - /* Restore EFER. */ - movl $MSR_EFER, %ecx - movl WAKEUP_CTX(efer), %eax - wrmsr - - /* Restore fast syscall stuff. */ - movl $MSR_STAR, %ecx - movl WAKEUP_CTX(star), %eax - movl 4 + WAKEUP_CTX(star), %edx - wrmsr - movl $MSR_LSTAR, %ecx - movl WAKEUP_CTX(lstar), %eax - movl 4 + WAKEUP_CTX(lstar), %edx - wrmsr - movl $MSR_CSTAR, %ecx - movl WAKEUP_CTX(cstar), %eax - movl 4 + WAKEUP_CTX(cstar), %edx - wrmsr - movl $MSR_SF_MASK, %ecx - movl WAKEUP_CTX(sfmask), %eax - wrmsr - - /* Restore CR0 except for FPU mode. */ - movq PCB_CR0(%rdi), %rax - andq $~(CR0_EM | CR0_TS), %rax - movq %rax, %cr0 - - /* Restore CR2 and CR4. */ - movq PCB_CR2(%rdi), %rax - movq %rax, %cr2 - movq PCB_CR4(%rdi), %rax - movq %rax, %cr4 - - /* Restore descriptor tables. */ - lidt PCB_IDT(%rdi) - lldt PCB_LDT(%rdi) - -#define SDT_SYSTSS 9 -#define SDT_SYSBSY 11 - - /* Clear "task busy" bit and reload TR. */ - movq PCPU(TSS), %rax - andb $(~SDT_SYSBSY | SDT_SYSTSS), 5(%rax) - movw PCB_TR(%rdi), %ax - ltr %ax - -#undef SDT_SYSTSS -#undef SDT_SYSBSY - - /* Restore debug registers. */ - movq PCB_DR0(%rdi), %rax - movq %rax, %dr0 - movq PCB_DR1(%rdi), %rax - movq %rax, %dr1 - movq PCB_DR2(%rdi), %rax - movq %rax, %dr2 - movq PCB_DR3(%rdi), %rax - movq %rax, %dr3 - movq PCB_DR6(%rdi), %rax - movq %rax, %dr6 - movq PCB_DR7(%rdi), %rax - movq %rax, %dr7 - - /* Restore FPU state. */ - fninit - movq WAKEUP_CTX(fpusave), %rbx - movq WAKEUP_CTX(xsmask), %rax - testq %rax, %rax - jz 1f - movq %rax, %rdx - shrq $32, %rdx - movl $XCR0, %ecx -/* xsetbv */ - .byte 0x0f, 0x01, 0xd1 -/* xrstor (%rbx) */ - .byte 0x0f, 0xae, 0x2b - jmp 2f -1: - fxrstor (%rbx) -2: - - /* Reload CR0. */ - movq PCB_CR0(%rdi), %rax - movq %rax, %cr0 - - /* Restore other callee saved registers. */ - movq PCB_R15(%rdi), %r15 - movq PCB_R14(%rdi), %r14 - movq PCB_R13(%rdi), %r13 - movq PCB_R12(%rdi), %r12 - movq PCB_RBP(%rdi), %rbp - movq PCB_RSP(%rdi), %rsp - movq PCB_RBX(%rdi), %rbx - - /* Restore return address. */ - movq PCB_RIP(%rdi), %rax - movq %rax, (%rsp) - - /* Indicate the CPU is resumed. */ - xorl %eax, %eax - movl %eax, WAKEUP_CTX(cpu) - - ret -END(acpi_restorecpu) diff --git a/sys/amd64/acpica/acpi_wakecode.S b/sys/amd64/acpica/acpi_wakecode.S index 82d0ab21e5a..c4b0dcdfd50 100644 --- a/sys/amd64/acpica/acpi_wakecode.S +++ b/sys/amd64/acpica/acpi_wakecode.S @@ -219,10 +219,14 @@ wakeup_64: mov $bootdata64 - bootgdt, %eax mov %ax, %ds - /* Restore arguments and return. */ - movq wakeup_kpml4 - wakeup_start(%rbx), %rdi - movq wakeup_ctx - wakeup_start(%rbx), %rsi - movq wakeup_retaddr - wakeup_start(%rbx), %rax + /* Restore arguments. */ + movq wakeup_pcb - wakeup_start(%rbx), %rdi + movq wakeup_ret - wakeup_start(%rbx), %rax + + /* Restore GDT. */ + lgdt wakeup_gdt - wakeup_start(%rbx) + + /* Jump to return address. */ jmp *%rax .data @@ -268,34 +272,11 @@ bootgdtdesc: .long bootgdt - wakeup_start /* Offset plus %ds << 4 */ ALIGN_DATA -wakeup_retaddr: - .quad 0 -wakeup_kpml4: - .quad 0 - -wakeup_ctx: - .quad 0 wakeup_pcb: .quad 0 -wakeup_fpusave: +wakeup_ret: .quad 0 wakeup_gdt: .word 0 .quad 0 - - ALIGN_DATA -wakeup_efer: - .quad 0 -wakeup_star: - .quad 0 -wakeup_lstar: - .quad 0 -wakeup_cstar: - .quad 0 -wakeup_sfmask: - .quad 0 -wakeup_xsmask: - .quad 0 -wakeup_cpu: - .long 0 dummy: diff --git a/sys/amd64/amd64/cpu_switch.S b/sys/amd64/amd64/cpu_switch.S index aff9d17f6c0..1254f3f507e 100644 --- a/sys/amd64/amd64/cpu_switch.S +++ b/sys/amd64/amd64/cpu_switch.S @@ -122,8 +122,7 @@ done_store_dr: 1: movq %rdx,%rcx movl xsave_mask,%eax movl xsave_mask+4,%edx -/* xsave (%r8) */ - .byte 0x41,0x0f,0xae,0x20 + xsave (%r8) movq %rcx,%rdx 2: smsw %ax orb $CR0_TS,%al @@ -357,6 +356,30 @@ ENTRY(savectx) rdmsr movl %eax,PCB_KGSBASE(%rdi) movl %edx,PCB_KGSBASE+4(%rdi) + movl $MSR_EFER,%ecx + rdmsr + movl %eax,PCB_EFER(%rdi) + movl %edx,PCB_EFER+4(%rdi) + movl $MSR_STAR,%ecx + rdmsr + movl %eax,PCB_STAR(%rdi) + movl %edx,PCB_STAR+4(%rdi) + movl $MSR_LSTAR,%ecx + rdmsr + movl %eax,PCB_LSTAR(%rdi) + movl %edx,PCB_LSTAR+4(%rdi) + movl $MSR_CSTAR,%ecx + rdmsr + movl %eax,PCB_CSTAR(%rdi) + movl %edx,PCB_CSTAR+4(%rdi) + movl $MSR_SF_MASK,%ecx + rdmsr + movl %eax,PCB_SFMASK(%rdi) + movl %edx,PCB_SFMASK+4(%rdi) + movl xsave_mask,%eax + movl %eax,PCB_XSMASK(%rdi) + movl xsave_mask+4,%eax + movl %eax,PCB_XSMASK+4(%rdi) sgdt PCB_GDT(%rdi) sidt PCB_IDT(%rdi) @@ -369,6 +392,140 @@ ENTRY(savectx) ret END(savectx) +/* + * resumectx(pcb) + * Resuming processor state from pcb. + */ +ENTRY(resumectx) + /* Switch to KPML4phys. */ + movq KPML4phys,%rax + movq %rax,%cr3 + + /* Force kernel segment registers. */ + movl $KDSEL,%eax + movw %ax,%ds + movw %ax,%es + movw %ax,%ss + movl $KUF32SEL,%eax + movw %ax,%fs + movl $KUG32SEL,%eax + movw %ax,%gs + + movl $MSR_FSBASE,%ecx + movl PCB_FSBASE(%rdi),%eax + movl 4 + PCB_FSBASE(%rdi),%edx + wrmsr + movl $MSR_GSBASE,%ecx + movl PCB_GSBASE(%rdi),%eax + movl 4 + PCB_GSBASE(%rdi),%edx + wrmsr + movl $MSR_KGSBASE,%ecx + movl PCB_KGSBASE(%rdi),%eax + movl 4 + PCB_KGSBASE(%rdi),%edx + wrmsr + + /* Restore EFER. */ + movl $MSR_EFER,%ecx + movl PCB_EFER(%rdi),%eax + wrmsr + + /* Restore fast syscall stuff. */ + movl $MSR_STAR,%ecx + movl PCB_STAR(%rdi),%eax + movl 4 + PCB_STAR(%rdi),%edx + wrmsr + movl $MSR_LSTAR,%ecx + movl PCB_LSTAR(%rdi),%eax + movl 4 + PCB_LSTAR(%rdi),%edx + wrmsr + movl $MSR_CSTAR,%ecx + movl PCB_CSTAR(%rdi),%eax + movl 4 + PCB_CSTAR(%rdi),%edx + wrmsr + movl $MSR_SF_MASK,%ecx + movl PCB_SFMASK(%rdi),%eax + wrmsr + + /* Restore CR0 except for FPU mode. */ + movq PCB_CR0(%rdi),%rax + andq $~(CR0_EM | CR0_TS),%rax + movq %rax,%cr0 + + /* Restore CR2, CR4 and CR3. */ + movq PCB_CR2(%rdi),%rax + movq %rax,%cr2 + movq PCB_CR4(%rdi),%rax + movq %rax,%cr4 + movq PCB_CR3(%rdi),%rax + movq %rax,%cr3 + + /* Restore descriptor tables. */ + lidt PCB_IDT(%rdi) + lldt PCB_LDT(%rdi) + +#define SDT_SYSTSS 9 +#define SDT_SYSBSY 11 + + /* Clear "task busy" bit and reload TR. */ + movq PCPU(TSS),%rax + andb $(~SDT_SYSBSY | SDT_SYSTSS),5(%rax) + movw PCB_TR(%rdi),%ax + ltr %ax + +#undef SDT_SYSTSS +#undef SDT_SYSBSY + + /* Restore debug registers. */ + movq PCB_DR0(%rdi),%rax + movq %rax,%dr0 + movq PCB_DR1(%rdi),%rax + movq %rax,%dr1 + movq PCB_DR2(%rdi),%rax + movq %rax,%dr2 + movq PCB_DR3(%rdi),%rax + movq %rax,%dr3 + movq PCB_DR6(%rdi),%rax + movq %rax,%dr6 + movq PCB_DR7(%rdi),%rax + movq %rax,%dr7 + + /* Restore FPU state. */ + fninit + movq PCB_FPUSUSPEND(%rdi),%rbx + movq PCB_XSMASK(%rdi),%rax + testq %rax,%rax + jz 1f + movq %rax,%rdx + shrq $32,%rdx + movl $XCR0,%ecx + xsetbv + xrstor (%rbx) + jmp 2f +1: + fxrstor (%rbx) +2: + + /* Reload CR0. */ + movq PCB_CR0(%rdi),%rax + movq %rax,%cr0 + + /* Restore other callee saved registers. */ + movq PCB_R15(%rdi),%r15 + movq PCB_R14(%rdi),%r14 + movq PCB_R13(%rdi),%r13 + movq PCB_R12(%rdi),%r12 + movq PCB_RBP(%rdi),%rbp + movq PCB_RSP(%rdi),%rsp + movq PCB_RBX(%rdi),%rbx + + /* Restore return address. */ + movq PCB_RIP(%rdi),%rax + movq %rax,(%rsp) + + xorl %eax,%eax + ret +END(resumectx) + /* * Wrapper around fpusave to care about TS0_CR. */ diff --git a/sys/amd64/amd64/db_disasm.c b/sys/amd64/amd64/db_disasm.c index a6dbf694fd6..46144e0954a 100644 --- a/sys/amd64/amd64/db_disasm.c +++ b/sys/amd64/amd64/db_disasm.c @@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$"); * Instruction disassembler. */ #include +#include #include #include @@ -47,7 +48,9 @@ __FBSDID("$FreeBSD$"); #define DBLR 5 #define EXTR 6 #define SDEP 7 -#define NONE 8 +#define ADEP 8 +#define ESC 9 +#define NONE 10 /* * REX prefix and bits @@ -67,6 +70,7 @@ __FBSDID("$FreeBSD$"); #define Eb 4 /* address, byte size */ #define R 5 /* register, in 'reg' field */ #define Rw 6 /* word register, in 'reg' field */ +#define Rq 39 /* quad register, in 'reg' field */ #define Ri 7 /* register in instruction */ #define S 8 /* segment reg, in 'reg' field */ #define Si 9 /* segment reg, in instruction */ @@ -120,6 +124,45 @@ struct finst { (or pointer to table) */ }; +static const struct inst db_inst_0f388x[] = { +/*80*/ { "", TRUE, SDEP, op2(E, Rq), "invept" }, +/*81*/ { "", TRUE, SDEP, op2(E, Rq), "invvpid" }, +/*82*/ { "", FALSE, NONE, 0, 0 }, +/*83*/ { "", FALSE, NONE, 0, 0 }, +/*84*/ { "", FALSE, NONE, 0, 0 }, +/*85*/ { "", FALSE, NONE, 0, 0 }, +/*86*/ { "", FALSE, NONE, 0, 0 }, +/*87*/ { "", FALSE, NONE, 0, 0 }, + +/*88*/ { "", FALSE, NONE, 0, 0 }, +/*89*/ { "", FALSE, NONE, 0, 0 }, +/*8a*/ { "", FALSE, NONE, 0, 0 }, +/*8b*/ { "", FALSE, NONE, 0, 0 }, +/*8c*/ { "", FALSE, NONE, 0, 0 }, +/*8d*/ { "", FALSE, NONE, 0, 0 }, +/*8e*/ { "", FALSE, NONE, 0, 0 }, +/*8f*/ { "", FALSE, NONE, 0, 0 }, +}; + +static const struct inst * const db_inst_0f38[] = { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + db_inst_0f388x, + 0, + 0, + 0, + 0, + 0, + 0, + 0 +}; + static const char * const db_Grp6[] = { "sldt", "str", @@ -160,8 +203,8 @@ static const char * const db_Grp9[] = { "", "", "", - "", - "" + "vmptrld", + "vmptrst" }; static const char * const db_Grp15[] = { @@ -169,9 +212,9 @@ static const char * const db_Grp15[] = { "fxrstor", "ldmxcsr", "stmxcsr", - "", - "", - "", + "xsave", + "xrstor", + "xsaveopt", "clflush" }; @@ -236,7 +279,7 @@ static const struct inst db_inst_0f3x[] = { /*36*/ { "", FALSE, NONE, 0, 0 }, /*37*/ { "getsec",FALSE, NONE, 0, 0 }, -/*38*/ { "", FALSE, NONE, 0, 0 }, +/*38*/ { "", FALSE, ESC, 0, db_inst_0f38 }, /*39*/ { "", FALSE, NONE, 0, 0 }, /*3a*/ { "", FALSE, NONE, 0, 0 }, /*3b*/ { "", FALSE, NONE, 0, 0 }, @@ -266,6 +309,26 @@ static const struct inst db_inst_0f4x[] = { /*4f*/ { "cmovnle",TRUE, NONE, op2(E, R), 0 }, }; +static const struct inst db_inst_0f7x[] = { +/*70*/ { "", FALSE, NONE, 0, 0 }, +/*71*/ { "", FALSE, NONE, 0, 0 }, +/*72*/ { "", FALSE, NONE, 0, 0 }, +/*73*/ { "", FALSE, NONE, 0, 0 }, +/*74*/ { "", FALSE, NONE, 0, 0 }, +/*75*/ { "", FALSE, NONE, 0, 0 }, +/*76*/ { "", FALSE, NONE, 0, 0 }, +/*77*/ { "", FALSE, NONE, 0, 0 }, + +/*78*/ { "vmread", TRUE, NONE, op2(Rq, E), 0 }, +/*79*/ { "vmwrite",TRUE, NONE, op2(E, Rq), 0 }, +/*7a*/ { "", FALSE, NONE, 0, 0 }, +/*7b*/ { "", FALSE, NONE, 0, 0 }, +/*7c*/ { "", FALSE, NONE, 0, 0 }, +/*7d*/ { "", FALSE, NONE, 0, 0 }, +/*7e*/ { "", FALSE, NONE, 0, 0 }, +/*7f*/ { "", FALSE, NONE, 0, 0 }, +}; + static const struct inst db_inst_0f8x[] = { /*80*/ { "jo", FALSE, NONE, op1(Dl), 0 }, /*81*/ { "jno", FALSE, NONE, op1(Dl), 0 }, @@ -373,7 +436,7 @@ static const struct inst * const db_inst_0f[] = { db_inst_0f4x, 0, 0, - 0, + db_inst_0f7x, db_inst_0f8x, db_inst_0f9x, db_inst_0fax, @@ -582,7 +645,7 @@ static const struct inst db_inst_table[256] = { /*0c*/ { "or", FALSE, BYTE, op2(I, A), 0 }, /*0d*/ { "or", FALSE, LONG, op2(I, A), 0 }, /*0e*/ { "push", FALSE, NONE, op1(Si), 0 }, -/*0f*/ { "", FALSE, NONE, 0, 0 }, +/*0f*/ { "", FALSE, ESC, 0, db_inst_0f }, /*10*/ { "adc", TRUE, BYTE, op2(R, E), 0 }, /*11*/ { "adc", TRUE, LONG, op2(R, E), 0 }, @@ -738,8 +801,8 @@ static const struct inst db_inst_table[256] = { /*96*/ { "xchg", FALSE, LONG, op2(A, Ri), 0 }, /*97*/ { "xchg", FALSE, LONG, op2(A, Ri), 0 }, -/*98*/ { "cbw", FALSE, SDEP, 0, "cwde" }, /* cbw/cwde */ -/*99*/ { "cwd", FALSE, SDEP, 0, "cdq" }, /* cwd/cdq */ +/*98*/ { "cwde", FALSE, SDEP, 0, "cbw" }, +/*99*/ { "cdq", FALSE, SDEP, 0, "cwd" }, /*9a*/ { "lcall", FALSE, NONE, op1(OS), 0 }, /*9b*/ { "wait", FALSE, NONE, 0, 0 }, /*9c*/ { "pushf", FALSE, LONG, 0, 0 }, @@ -822,7 +885,7 @@ static const struct inst db_inst_table[256] = { /*e0*/ { "loopne",FALSE, NONE, op1(Db), 0 }, /*e1*/ { "loope", FALSE, NONE, op1(Db), 0 }, /*e2*/ { "loop", FALSE, NONE, op1(Db), 0 }, -/*e3*/ { "jcxz", FALSE, SDEP, op1(Db), "jecxz" }, +/*e3*/ { "jrcxz", FALSE, ADEP, op1(Db), "jecxz" }, /*e4*/ { "in", FALSE, BYTE, op2(Ib, A), 0 }, /*e5*/ { "in", FALSE, LONG, op2(Ib, A) , 0 }, /*e6*/ { "out", FALSE, BYTE, op2(A, Ib), 0 }, @@ -1208,14 +1271,6 @@ db_disasm(loc, altfmt) if (prefix) { get_value_inc(inst, loc, 1, FALSE); } - if (rep == TRUE) { - if (inst == 0x90) { - db_printf("pause\n"); - return (loc); - } - db_printf("repe "); /* XXX repe VS rep */ - rep = FALSE; - } } while (prefix); if (inst >= 0xd8 && inst <= 0xdf) { @@ -1224,9 +1279,10 @@ db_disasm(loc, altfmt) return (loc); } - if (inst == 0x0f) { + ip = &db_inst_table[inst]; + while (ip->i_size == ESC) { get_value_inc(inst, loc, 1, FALSE); - ip = db_inst_0f[inst>>4]; + ip = ((const struct inst * const *)ip->i_extra)[inst>>4]; if (ip == 0) { ip = &db_bad_inst; } @@ -1234,8 +1290,6 @@ db_disasm(loc, altfmt) ip = &ip[inst&0xf]; } } - else - ip = &db_inst_table[inst]; if (ip->i_has_modrm) { get_value_inc(regmodrm, loc, 1, FALSE); @@ -1269,6 +1323,26 @@ db_disasm(loc, altfmt) /* Special cases that don't fit well in the tables. */ if (ip->i_extra == db_Grp7 && f_mod(rex, regmodrm) == 3) { switch (regmodrm) { + case 0xc1: + i_name = "vmcall"; + i_size = NONE; + i_mode = 0; + break; + case 0xc2: + i_name = "vmlaunch"; + i_size = NONE; + i_mode = 0; + break; + case 0xc3: + i_name = "vmresume"; + i_size = NONE; + i_mode = 0; + break; + case 0xc4: + i_name = "vmxoff"; + i_size = NONE; + i_mode = 0; + break; case 0xc8: i_name = "monitor"; i_size = NONE; @@ -1279,11 +1353,26 @@ db_disasm(loc, altfmt) i_size = NONE; i_mode = 0; break; + case 0xd0: + i_name = "xgetbv"; + i_size = NONE; + i_mode = 0; + break; + case 0xd1: + i_name = "xsetbv"; + i_size = NONE; + i_mode = 0; + break; case 0xf8: i_name = "swapgs"; i_size = NONE; i_mode = 0; break; + case 0xf9: + i_name = "rdtscp"; + i_size = NONE; + i_mode = 0; + break; } } if (ip->i_extra == db_Grp15 && f_mod(rex, regmodrm) == 3) { @@ -1292,8 +1381,42 @@ db_disasm(loc, altfmt) i_mode = 0; } + /* Handle instructions identified by mandatory prefixes. */ + if (rep == TRUE) { + if (inst == 0x90) { + i_name = "pause"; + i_size = NONE; + i_mode = 0; + rep = FALSE; + } else if (ip->i_extra == db_Grp9 && f_mod(rex, regmodrm) != 3 && + f_reg(rex, regmodrm) == 0x6) { + i_name = "vmxon"; + rep = FALSE; + } + } + if (size == WORD) { + if (ip->i_extra == db_Grp9 && f_mod(rex, regmodrm) != 3 && + f_reg(rex, regmodrm) == 0x6) { + i_name = "vmclear"; + } + } + if (rex & REX_W) { + if (strcmp(i_name, "cwde") == 0) + i_name = "cdqe"; + else if (strcmp(i_name, "cmpxchg8b") == 0) + i_name = "cmpxchg16b"; + } + + if (rep == TRUE) + db_printf("repe "); /* XXX repe VS rep */ + if (i_size == SDEP) { - if (size == WORD) + if (size == LONG) + db_printf("%s", i_name); + else + db_printf("%s", (const char *)ip->i_extra); + } else if (i_size == ADEP) { + if (short_addr == FALSE) db_printf("%s", i_name); else db_printf("%s", (const char *)ip->i_extra); @@ -1366,6 +1489,10 @@ db_disasm(loc, altfmt) db_printf("%s", db_reg[rex != 0 ? 1 : 0][WORD][f_reg(rex, regmodrm)]); break; + case Rq: + db_printf("%s", db_reg[rex != 0 ? 1 : 0][QUAD][f_reg(rex, regmodrm)]); + break; + case Ri: db_printf("%s", db_reg[0][QUAD][f_rm(rex, inst)]); break; diff --git a/sys/amd64/amd64/fpu.c b/sys/amd64/amd64/fpu.c index a7e14e434e8..7d76b58c305 100644 --- a/sys/amd64/amd64/fpu.c +++ b/sys/amd64/amd64/fpu.c @@ -82,9 +82,7 @@ xrstor(char *addr, uint64_t mask) low = mask; hi = mask >> 32; - /* xrstor (%rdi) */ - __asm __volatile(".byte 0x0f,0xae,0x2f" : : - "a" (low), "d" (hi), "D" (addr)); + __asm __volatile("xrstor %0" : : "m" (*addr), "a" (low), "d" (hi)); } static __inline void @@ -94,20 +92,8 @@ xsave(char *addr, uint64_t mask) low = mask; hi = mask >> 32; - /* xsave (%rdi) */ - __asm __volatile(".byte 0x0f,0xae,0x27" : : - "a" (low), "d" (hi), "D" (addr) : "memory"); -} - -static __inline void -xsetbv(uint32_t reg, uint64_t val) -{ - uint32_t low, hi; - - low = val; - hi = val >> 32; - __asm __volatile(".byte 0x0f,0x01,0xd1" : : - "c" (reg), "a" (low), "d" (hi)); + __asm __volatile("xsave %0" : "=m" (*addr) : "a" (low), "d" (hi) : + "memory"); } #else /* !(__GNUCLIKE_ASM && !lint) */ @@ -120,14 +106,14 @@ void fnstsw(caddr_t addr); void fxsave(caddr_t addr); void fxrstor(caddr_t addr); void ldmxcsr(u_int csr); -void start_emulating(void); -void stop_emulating(void); void xrstor(char *addr, uint64_t mask); void xsave(char *addr, uint64_t mask); -void xsetbv(uint32_t reg, uint64_t val); #endif /* __GNUCLIKE_ASM && !lint */ +#define start_emulating() load_cr0(rcr0() | CR0_TS) +#define stop_emulating() clts() + #define GET_FPU_CW(thread) ((thread)->td_pcb->pcb_save->sv_env.en_cw) #define GET_FPU_SW(thread) ((thread)->td_pcb->pcb_save->sv_env.en_sw) @@ -138,7 +124,7 @@ CTASSERT(sizeof(struct savefpu_ymm) == 832); /* * This requirement is to make it easier for asm code to calculate * offset of the fpu save area from the pcb address. FPU save area - * must by 64-bytes aligned. + * must be 64-byte aligned. */ CTASSERT(sizeof(struct pcb) % XSAVE_AREA_ALIGN == 0); @@ -235,7 +221,7 @@ fpuinit(void) if (use_xsave) { load_cr4(rcr4() | CR4_XSAVE); - xsetbv(XCR0, xsave_mask); + load_xcr(XCR0, xsave_mask); } /* diff --git a/sys/amd64/amd64/genassym.c b/sys/amd64/amd64/genassym.c index 3796aa8adc7..174927a756a 100644 --- a/sys/amd64/amd64/genassym.c +++ b/sys/amd64/amd64/genassym.c @@ -157,6 +157,13 @@ ASSYM(PCB_TSSP, offsetof(struct pcb, pcb_tssp)); ASSYM(PCB_SAVEFPU, offsetof(struct pcb, pcb_save)); ASSYM(PCB_SAVEFPU_SIZE, sizeof(struct savefpu)); ASSYM(PCB_USERFPU, sizeof(struct pcb)); +ASSYM(PCB_EFER, offsetof(struct pcb, pcb_efer)); +ASSYM(PCB_STAR, offsetof(struct pcb, pcb_star)); +ASSYM(PCB_LSTAR, offsetof(struct pcb, pcb_lstar)); +ASSYM(PCB_CSTAR, offsetof(struct pcb, pcb_cstar)); +ASSYM(PCB_SFMASK, offsetof(struct pcb, pcb_sfmask)); +ASSYM(PCB_XSMASK, offsetof(struct pcb, pcb_xsmask)); +ASSYM(PCB_FPUSUSPEND, offsetof(struct pcb, pcb_fpususpend)); ASSYM(PCB_SIZE, sizeof(struct pcb)); ASSYM(PCB_FULL_IRET, PCB_FULL_IRET); ASSYM(PCB_DBREGS, PCB_DBREGS); diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index acb948a3ca7..8044fe5dda9 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -74,6 +74,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -206,6 +207,8 @@ struct pcpu __pcpu[MAXCPU]; struct mtx icu_lock; +struct mem_range_softc mem_range_softc; + struct mtx dt_lock; /* lock for GDT and LDT */ static void @@ -296,12 +299,10 @@ cpu_startup(dummy) cpu_setregs(); -#ifdef SMP /* * Add BSP as an interrupt target. */ intr_add_cpu(0); -#endif } /* diff --git a/sys/amd64/amd64/mem.c b/sys/amd64/amd64/mem.c index b86f5ddd4e7..abbbb2106be 100644 --- a/sys/amd64/amd64/mem.c +++ b/sys/amd64/amd64/mem.c @@ -72,8 +72,6 @@ __FBSDID("$FreeBSD$"); */ MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors"); -struct mem_range_softc mem_range_softc; - /* ARGSUSED */ int memrw(struct cdev *dev, struct uio *uio, int flags) diff --git a/sys/amd64/amd64/minidump_machdep.c b/sys/amd64/amd64/minidump_machdep.c index 057d81d6fb6..9be642e6c77 100644 --- a/sys/amd64/amd64/minidump_machdep.c +++ b/sys/amd64/amd64/minidump_machdep.c @@ -37,9 +37,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#ifdef SW_WATCHDOG #include -#endif #include #include #include @@ -177,9 +175,9 @@ blk_write(struct dumperinfo *di, char *ptr, vm_paddr_t pa, size_t sz) report_progress(progress, dumpsize); counter &= (1<<24) - 1; } -#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); -#endif + if (ptr) { error = dump_write(di, ptr, 0, dumplo, len); if (error) diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c index 4b0e5014b43..86057e50909 100644 --- a/sys/amd64/amd64/mp_machdep.c +++ b/sys/amd64/amd64/mp_machdep.c @@ -100,7 +100,6 @@ void *dpcpu; struct pcb stoppcbs[MAXCPU]; struct pcb **susppcbs; -void **suspfpusave; /* Variables needed for SMP tlb shootdown. */ vm_offset_t smp_tlb_addr1; @@ -1025,6 +1024,60 @@ start_ap(int apic_id) /* used as a watchpoint to signal AP startup */ cpus = mp_naps; + ipi_startup(apic_id, vector); + + /* Wait up to 5 seconds for it to start. */ + for (ms = 0; ms < 5000; ms++) { + if (mp_naps > cpus) + return 1; /* return SUCCESS */ + DELAY(1000); + } + return 0; /* return FAILURE */ +} + +#ifdef COUNT_XINVLTLB_HITS +u_int xhits_gbl[MAXCPU]; +u_int xhits_pg[MAXCPU]; +u_int xhits_rng[MAXCPU]; +static SYSCTL_NODE(_debug, OID_AUTO, xhits, CTLFLAG_RW, 0, ""); +SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, global, CTLFLAG_RW, &xhits_gbl, + sizeof(xhits_gbl), "IU", ""); +SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, page, CTLFLAG_RW, &xhits_pg, + sizeof(xhits_pg), "IU", ""); +SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, range, CTLFLAG_RW, &xhits_rng, + sizeof(xhits_rng), "IU", ""); + +u_int ipi_global; +u_int ipi_page; +u_int ipi_range; +u_int ipi_range_size; +SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_global, CTLFLAG_RW, &ipi_global, 0, ""); +SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_page, CTLFLAG_RW, &ipi_page, 0, ""); +SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_range, CTLFLAG_RW, &ipi_range, 0, ""); +SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_range_size, CTLFLAG_RW, + &ipi_range_size, 0, ""); + +u_int ipi_masked_global; +u_int ipi_masked_page; +u_int ipi_masked_range; +u_int ipi_masked_range_size; +SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_masked_global, CTLFLAG_RW, + &ipi_masked_global, 0, ""); +SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_masked_page, CTLFLAG_RW, + &ipi_masked_page, 0, ""); +SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_masked_range, CTLFLAG_RW, + &ipi_masked_range, 0, ""); +SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_masked_range_size, CTLFLAG_RW, + &ipi_masked_range_size, 0, ""); +#endif /* COUNT_XINVLTLB_HITS */ + +/* + * Init and startup IPI. + */ +void +ipi_startup(int apic_id, int vector) +{ + /* * first we do an INIT/RESET IPI this INIT IPI might be run, reseting * and running the target CPU. OR this INIT IPI might be latched (P5 @@ -1075,52 +1128,8 @@ start_ap(int apic_id) vector, apic_id); lapic_ipi_wait(-1); DELAY(200); /* wait ~200uS */ - - /* Wait up to 5 seconds for it to start. */ - for (ms = 0; ms < 5000; ms++) { - if (mp_naps > cpus) - return 1; /* return SUCCESS */ - DELAY(1000); - } - return 0; /* return FAILURE */ } -#ifdef COUNT_XINVLTLB_HITS -u_int xhits_gbl[MAXCPU]; -u_int xhits_pg[MAXCPU]; -u_int xhits_rng[MAXCPU]; -static SYSCTL_NODE(_debug, OID_AUTO, xhits, CTLFLAG_RW, 0, ""); -SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, global, CTLFLAG_RW, &xhits_gbl, - sizeof(xhits_gbl), "IU", ""); -SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, page, CTLFLAG_RW, &xhits_pg, - sizeof(xhits_pg), "IU", ""); -SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, range, CTLFLAG_RW, &xhits_rng, - sizeof(xhits_rng), "IU", ""); - -u_int ipi_global; -u_int ipi_page; -u_int ipi_range; -u_int ipi_range_size; -SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_global, CTLFLAG_RW, &ipi_global, 0, ""); -SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_page, CTLFLAG_RW, &ipi_page, 0, ""); -SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_range, CTLFLAG_RW, &ipi_range, 0, ""); -SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_range_size, CTLFLAG_RW, - &ipi_range_size, 0, ""); - -u_int ipi_masked_global; -u_int ipi_masked_page; -u_int ipi_masked_range; -u_int ipi_masked_range_size; -SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_masked_global, CTLFLAG_RW, - &ipi_masked_global, 0, ""); -SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_masked_page, CTLFLAG_RW, - &ipi_masked_page, 0, ""); -SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_masked_range, CTLFLAG_RW, - &ipi_masked_range, 0, ""); -SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_masked_range_size, CTLFLAG_RW, - &ipi_masked_range_size, 0, ""); -#endif /* COUNT_XINVLTLB_HITS */ - /* * Send an IPI to specified CPU handling the bitmap logic. */ @@ -1458,15 +1467,17 @@ cpususpend_handler(void) cpu = PCPU_GET(cpuid); if (savectx(susppcbs[cpu])) { - ctx_fpusave(suspfpusave[cpu]); + ctx_fpusave(susppcbs[cpu]->pcb_fpususpend); wbinvd(); - CPU_SET_ATOMIC(cpu, &stopped_cpus); + CPU_SET_ATOMIC(cpu, &suspended_cpus); } else { pmap_init_pat(); - load_cr3(susppcbs[cpu]->pcb_cr3); initializecpu(); PCPU_SET(switchtime, 0); PCPU_SET(switchticks, ticks); + + /* Indicate that we are resumed */ + CPU_CLR_ATOMIC(cpu, &suspended_cpus); } /* Wait for resume */ @@ -1474,7 +1485,6 @@ cpususpend_handler(void) ia32_pause(); CPU_CLR_ATOMIC(cpu, &started_cpus); - CPU_CLR_ATOMIC(cpu, &stopped_cpus); /* Resume MCA and local APIC */ mca_resume(); diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index ff4f96ba330..9e1ae3dde56 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -117,6 +117,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -167,6 +168,39 @@ __FBSDID("$FreeBSD$"); #define pa_index(pa) ((pa) >> PDRSHIFT) #define pa_to_pvh(pa) (&pv_table[pa_index(pa)]) +#define NPV_LIST_LOCKS MAXCPU + +#define PHYS_TO_PV_LIST_LOCK(pa) \ + (&pv_list_locks[pa_index(pa) % NPV_LIST_LOCKS]) + +#define CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa) do { \ + struct rwlock **_lockp = (lockp); \ + struct rwlock *_new_lock; \ + \ + _new_lock = PHYS_TO_PV_LIST_LOCK(pa); \ + if (_new_lock != *_lockp) { \ + if (*_lockp != NULL) \ + rw_wunlock(*_lockp); \ + *_lockp = _new_lock; \ + rw_wlock(*_lockp); \ + } \ +} while (0) + +#define CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m) \ + CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, VM_PAGE_TO_PHYS(m)) + +#define RELEASE_PV_LIST_LOCK(lockp) do { \ + struct rwlock **_lockp = (lockp); \ + \ + if (*_lockp != NULL) { \ + rw_wunlock(*_lockp); \ + *_lockp = NULL; \ + } \ +} while (0) + +#define VM_PAGE_TO_PV_LIST_LOCK(m) \ + PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m)) + struct pmap kernel_pmap_store; vm_offset_t virtual_avail; /* VA of first avail page (after kernel bss) */ @@ -198,10 +232,23 @@ u_int64_t KPML4phys; /* phys addr of kernel level 4 */ static u_int64_t DMPDphys; /* phys addr of direct mapped level 2 */ static u_int64_t DMPDPphys; /* phys addr of direct mapped level 3 */ +/* + * Isolate the global pv list lock from data and other locks to prevent false + * sharing within the cache. + */ +static struct { + struct rwlock lock; + char padding[CACHE_LINE_SIZE - sizeof(struct rwlock)]; +} pvh_global __aligned(CACHE_LINE_SIZE); + +#define pvh_global_lock pvh_global.lock + /* * Data for the pv entry allocation mechanism */ -static long pv_entry_count; +static TAILQ_HEAD(pch, pv_chunk) pv_chunks = TAILQ_HEAD_INITIALIZER(pv_chunks); +static struct mtx pv_chunks_mutex; +static struct rwlock pv_list_locks[NPV_LIST_LOCKS]; static struct md_page *pv_table; /* @@ -215,11 +262,19 @@ caddr_t CADDR1 = 0; */ static caddr_t crashdumpmap; +static void free_pv_chunk(struct pv_chunk *pc); static void free_pv_entry(pmap_t pmap, pv_entry_t pv); -static pv_entry_t get_pv_entry(pmap_t locked_pmap, boolean_t try); -static void pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); -static boolean_t pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); -static void pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); +static pv_entry_t get_pv_entry(pmap_t pmap, struct rwlock **lockp); +static int popcnt_pc_map_elem(uint64_t elem); +static vm_page_t reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp); +static void reserve_pv_entries(pmap_t pmap, int needed, + struct rwlock **lockp); +static void pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa, + struct rwlock **lockp); +static boolean_t pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa, + struct rwlock **lockp); +static void pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa, + struct rwlock **lockp); static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va); static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va); @@ -227,12 +282,14 @@ static int pmap_pvh_wired_mappings(struct md_page *pvh, int count); static int pmap_change_attr_locked(vm_offset_t va, vm_size_t size, int mode); static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); +static boolean_t pmap_demote_pde_locked(pmap_t pmap, pd_entry_t *pde, + vm_offset_t va, struct rwlock **lockp); static boolean_t pmap_demote_pdpe(pmap_t pmap, pdp_entry_t *pdpe, vm_offset_t va); static boolean_t pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, - vm_prot_t prot); + vm_prot_t prot, struct rwlock **lockp); static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, - vm_page_t m, vm_prot_t prot, vm_page_t mpte); + vm_page_t m, vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp); static void pmap_fill_ptp(pt_entry_t *firstpte, pt_entry_t newpte); static void pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte); static boolean_t pmap_is_modified_pvh(struct md_page *pvh); @@ -240,30 +297,32 @@ static boolean_t pmap_is_referenced_pvh(struct md_page *pvh); static void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode); static vm_page_t pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va); static void pmap_pde_attr(pd_entry_t *pde, int cache_bits); -static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); +static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, + struct rwlock **lockp); static boolean_t pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot); static void pmap_pte_attr(pt_entry_t *pte, int cache_bits); static int pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, - vm_page_t *free); + vm_page_t *free, struct rwlock **lockp); static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, - vm_offset_t sva, pd_entry_t ptepde, vm_page_t *free); + vm_offset_t sva, pd_entry_t ptepde, vm_page_t *free, + struct rwlock **lockp); static void pmap_remove_pt_page(pmap_t pmap, vm_page_t mpte); static void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, vm_page_t *free); -static void pmap_remove_entry(struct pmap *pmap, vm_page_t m, - vm_offset_t va); -static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m); static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, - vm_page_t m); + vm_page_t m, struct rwlock **lockp); static void pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde); static void pmap_update_pde_invalidate(vm_offset_t va, pd_entry_t newpde); -static vm_page_t pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags); -static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags); +static vm_page_t _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, + struct rwlock **lockp); +static vm_page_t pmap_allocpde(pmap_t pmap, vm_offset_t va, + struct rwlock **lockp); +static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, + struct rwlock **lockp); -static vm_page_t _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags); static int _pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t* free); static int pmap_unuse_pt(pmap_t, vm_offset_t, pd_entry_t, vm_page_t *); @@ -580,6 +639,11 @@ pmap_bootstrap(vm_paddr_t *firstaddr) CPU_FILL(&kernel_pmap->pm_active); /* don't allow deactivation */ TAILQ_INIT(&kernel_pmap->pm_pvchunk); + /* + * Initialize the global pv list lock. + */ + rw_init(&pvh_global_lock, "pmap pv global"); + /* * Reserve some special page table entries/VA space for temporary * mapping of pages. @@ -743,6 +807,17 @@ pmap_init(void) pagesizes[1] = NBPDR; } + /* + * Initialize the pv chunk list mutex. + */ + mtx_init(&pv_chunks_mutex, "pmap pv chunk list", NULL, MTX_DEF); + + /* + * Initialize the pool of pv list locks. + */ + for (i = 0; i < NPV_LIST_LOCKS; i++) + rw_init(&pv_list_locks[i], "pmap pv list"); + /* * Calculate the size of the pv head table for superpages. */ @@ -1625,8 +1700,10 @@ pmap_pinit(pmap_t pmap) } /* - * this routine is called if the page table page is not - * mapped correctly. + * This routine is called if the desired page table page does not exist. + * + * If page table page allocation fails, this routine may sleep before + * returning NULL. It sleeps only if a lock pointer was given. * * Note: If a page allocation fails at page table level two or three, * one or two pages may be held during the wait, only to be released @@ -1634,25 +1711,23 @@ pmap_pinit(pmap_t pmap) * race conditions. */ static vm_page_t -_pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags) +_pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, struct rwlock **lockp) { vm_page_t m, pdppg, pdpg; - KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT || - (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK, - ("_pmap_allocpte: flags is neither M_NOWAIT nor M_WAITOK")); - PMAP_LOCK_ASSERT(pmap, MA_OWNED); + /* * Allocate a page table page. */ if ((m = vm_page_alloc(NULL, ptepindex, VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) { - if (flags & M_WAITOK) { + if (lockp != NULL) { + RELEASE_PV_LIST_LOCK(lockp); PMAP_UNLOCK(pmap); - vm_page_unlock_queues(); + rw_runlock(&pvh_global_lock); VM_WAIT; - vm_page_lock_queues(); + rw_rlock(&pvh_global_lock); PMAP_LOCK(pmap); } @@ -1693,7 +1768,7 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags) if ((*pml4 & PG_V) == 0) { /* Have to allocate a new pdp, recurse */ if (_pmap_allocpte(pmap, NUPDE + NUPDPE + pml4index, - flags) == NULL) { + lockp) == NULL) { --m->wire_count; atomic_subtract_int(&cnt.v_wire_count, 1); vm_page_free_zero(m); @@ -1726,7 +1801,7 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags) if ((*pml4 & PG_V) == 0) { /* Have to allocate a new pd, recurse */ if (_pmap_allocpte(pmap, NUPDE + pdpindex, - flags) == NULL) { + lockp) == NULL) { --m->wire_count; atomic_subtract_int(&cnt.v_wire_count, 1); vm_page_free_zero(m); @@ -1740,7 +1815,7 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags) if ((*pdp & PG_V) == 0) { /* Have to allocate a new pd, recurse */ if (_pmap_allocpte(pmap, NUPDE + pdpindex, - flags) == NULL) { + lockp) == NULL) { --m->wire_count; atomic_subtract_int(&cnt.v_wire_count, 1); @@ -1766,15 +1841,12 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags) } static vm_page_t -pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags) +pmap_allocpde(pmap_t pmap, vm_offset_t va, struct rwlock **lockp) { vm_pindex_t pdpindex, ptepindex; pdp_entry_t *pdpe; vm_page_t pdpg; - KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT || - (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK, - ("pmap_allocpde: flags is neither M_NOWAIT nor M_WAITOK")); retry: pdpe = pmap_pdpe(pmap, va); if (pdpe != NULL && (*pdpe & PG_V) != 0) { @@ -1785,24 +1857,20 @@ retry: /* Allocate a pd page. */ ptepindex = pmap_pde_pindex(va); pdpindex = ptepindex >> NPDPEPGSHIFT; - pdpg = _pmap_allocpte(pmap, NUPDE + pdpindex, flags); - if (pdpg == NULL && (flags & M_WAITOK)) + pdpg = _pmap_allocpte(pmap, NUPDE + pdpindex, lockp); + if (pdpg == NULL && lockp != NULL) goto retry; } return (pdpg); } static vm_page_t -pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags) +pmap_allocpte(pmap_t pmap, vm_offset_t va, struct rwlock **lockp) { vm_pindex_t ptepindex; pd_entry_t *pd; vm_page_t m; - KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT || - (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK, - ("pmap_allocpte: flags is neither M_NOWAIT nor M_WAITOK")); - /* * Calculate pagetable page index */ @@ -1818,7 +1886,7 @@ retry: * normal 4K page. */ if (pd != NULL && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) { - if (!pmap_demote_pde(pmap, pd, va)) { + if (!pmap_demote_pde_locked(pmap, pd, va, lockp)) { /* * Invalidation of the 2MB page mapping may have caused * the deallocation of the underlying PD page. @@ -1839,8 +1907,8 @@ retry: * Here if the pte page isn't mapped, or if it has been * deallocated. */ - m = _pmap_allocpte(pmap, ptepindex, flags); - if (m == NULL && (flags & M_WAITOK)) + m = _pmap_allocpte(pmap, ptepindex, lockp); + if (m == NULL && lockp != NULL) goto retry; } return (m); @@ -1993,7 +2061,7 @@ static __inline struct pv_chunk * pv_to_chunk(pv_entry_t pv) { - return (struct pv_chunk *)((uintptr_t)pv & ~(uintptr_t)PAGE_MASK); + return ((struct pv_chunk *)((uintptr_t)pv & ~(uintptr_t)PAGE_MASK)); } #define PV_PMAP(pv) (pv_to_chunk(pv)->pc_pmap) @@ -2002,10 +2070,7 @@ pv_to_chunk(pv_entry_t pv) #define PC_FREE1 0xfffffffffffffffful #define PC_FREE2 0x000000fffffffffful -static uint64_t pc_freemask[_NPCM] = { PC_FREE0, PC_FREE1, PC_FREE2 }; - -SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0, - "Current number of pv entries"); +static const uint64_t pc_freemask[_NPCM] = { PC_FREE0, PC_FREE1, PC_FREE2 }; #ifdef PV_STATS static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail; @@ -2019,80 +2084,159 @@ SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0, SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0, "Number of times tried to get a chunk page but failed."); -static long pv_entry_frees, pv_entry_allocs; +static long pv_entry_frees, pv_entry_allocs, pv_entry_count; static int pv_entry_spare; SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0, "Current number of pv entry frees"); SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0, "Current number of pv entry allocs"); +SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0, + "Current number of pv entries"); SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0, "Current number of spare pv entries"); - -static int pmap_collect_inactive, pmap_collect_active; - -SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_inactive, CTLFLAG_RD, &pmap_collect_inactive, 0, - "Current number times pmap_collect called on inactive queue"); -SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_active, CTLFLAG_RD, &pmap_collect_active, 0, - "Current number times pmap_collect called on active queue"); #endif /* * We are in a serious low memory condition. Resort to * drastic measures to free some pages so we can allocate - * another pv entry chunk. This is normally called to - * unmap inactive pages, and if necessary, active pages. + * another pv entry chunk. + * + * Returns NULL if PV entries were reclaimed from the specified pmap. * * We do not, however, unmap 2mpages because subsequent accesses will * allocate per-page pv entries until repromotion occurs, thereby * exacerbating the shortage of free pv entries. */ -static void -pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) +static vm_page_t +reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp) { + struct pch new_tail; + struct pv_chunk *pc; + struct md_page *pvh; pd_entry_t *pde; pmap_t pmap; pt_entry_t *pte, tpte; - pv_entry_t next_pv, pv; + pv_entry_t pv; vm_offset_t va; - vm_page_t m, free; - - TAILQ_FOREACH(m, &vpq->pl, pageq) { - if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy) - continue; - TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) { - va = pv->pv_va; - pmap = PV_PMAP(pv); + vm_page_t free, m, m_pc; + uint64_t inuse; + int bit, field, freed; + + rw_assert(&pvh_global_lock, RA_LOCKED); + PMAP_LOCK_ASSERT(locked_pmap, MA_OWNED); + KASSERT(lockp != NULL, ("reclaim_pv_chunk: lockp is NULL")); + pmap = NULL; + free = m_pc = NULL; + TAILQ_INIT(&new_tail); + mtx_lock(&pv_chunks_mutex); + while ((pc = TAILQ_FIRST(&pv_chunks)) != NULL && free == NULL) { + TAILQ_REMOVE(&pv_chunks, pc, pc_lru); + mtx_unlock(&pv_chunks_mutex); + if (pmap != pc->pc_pmap) { + if (pmap != NULL) { + pmap_invalidate_all(pmap); + if (pmap != locked_pmap) + PMAP_UNLOCK(pmap); + } + pmap = pc->pc_pmap; /* Avoid deadlock and lock recursion. */ - if (pmap > locked_pmap) + if (pmap > locked_pmap) { + RELEASE_PV_LIST_LOCK(lockp); PMAP_LOCK(pmap); - else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap)) + } else if (pmap != locked_pmap && + !PMAP_TRYLOCK(pmap)) { + pmap = NULL; + TAILQ_INSERT_TAIL(&new_tail, pc, pc_lru); + mtx_lock(&pv_chunks_mutex); continue; - pmap_resident_count_dec(pmap, 1); - pde = pmap_pde(pmap, va); - KASSERT((*pde & PG_PS) == 0, ("pmap_collect: found" - " a 2mpage in page %p's pv list", m)); - pte = pmap_pde_to_pte(pde, va); - tpte = pte_load_clear(pte); - KASSERT((tpte & PG_W) == 0, - ("pmap_collect: wired pte %#lx", tpte)); - if (tpte & PG_A) - vm_page_aflag_set(m, PGA_REFERENCED); - if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) - vm_page_dirty(m); - free = NULL; - pmap_unuse_pt(pmap, va, *pde, &free); - pmap_invalidate_page(pmap, va); - pmap_free_zero_pages(free); - TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - free_pv_entry(pmap, pv); - if (pmap != locked_pmap) - PMAP_UNLOCK(pmap); + } } - if (TAILQ_EMPTY(&m->md.pv_list) && - TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list)) - vm_page_aflag_clear(m, PGA_WRITEABLE); + + /* + * Destroy every non-wired, 4 KB page mapping in the chunk. + */ + freed = 0; + for (field = 0; field < _NPCM; field++) { + for (inuse = ~pc->pc_map[field] & pc_freemask[field]; + inuse != 0; inuse &= ~(1UL << bit)) { + bit = bsfq(inuse); + pv = &pc->pc_pventry[field * 64 + bit]; + va = pv->pv_va; + pde = pmap_pde(pmap, va); + if ((*pde & PG_PS) != 0) + continue; + pte = pmap_pde_to_pte(pde, va); + if ((*pte & PG_W) != 0) + continue; + tpte = pte_load_clear(pte); + if ((tpte & PG_G) != 0) + pmap_invalidate_page(pmap, va); + m = PHYS_TO_VM_PAGE(tpte & PG_FRAME); + if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) + vm_page_dirty(m); + if ((tpte & PG_A) != 0) + vm_page_aflag_set(m, PGA_REFERENCED); + CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m); + TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); + if (TAILQ_EMPTY(&m->md.pv_list) && + (m->flags & PG_FICTITIOUS) == 0) { + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + if (TAILQ_EMPTY(&pvh->pv_list)) { + vm_page_aflag_clear(m, + PGA_WRITEABLE); + } + } + pc->pc_map[field] |= 1UL << bit; + pmap_unuse_pt(pmap, va, *pde, &free); + freed++; + } + } + if (freed == 0) { + TAILQ_INSERT_TAIL(&new_tail, pc, pc_lru); + mtx_lock(&pv_chunks_mutex); + continue; + } + /* Every freed mapping is for a 4 KB page. */ + pmap_resident_count_dec(pmap, freed); + PV_STAT(atomic_add_long(&pv_entry_frees, freed)); + PV_STAT(atomic_add_int(&pv_entry_spare, freed)); + PV_STAT(atomic_subtract_long(&pv_entry_count, freed)); + TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); + if (pc->pc_map[0] == PC_FREE0 && pc->pc_map[1] == PC_FREE1 && + pc->pc_map[2] == PC_FREE2) { + PV_STAT(atomic_subtract_int(&pv_entry_spare, _NPCPV)); + PV_STAT(atomic_subtract_int(&pc_chunk_count, 1)); + PV_STAT(atomic_add_int(&pc_chunk_frees, 1)); + /* Entire chunk is free; return it. */ + m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc)); + dump_drop_page(m_pc->phys_addr); + mtx_lock(&pv_chunks_mutex); + break; + } + TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list); + TAILQ_INSERT_TAIL(&new_tail, pc, pc_lru); + mtx_lock(&pv_chunks_mutex); + /* One freed pv entry in locked_pmap is sufficient. */ + if (pmap == locked_pmap) + break; } + TAILQ_CONCAT(&pv_chunks, &new_tail, pc_lru); + mtx_unlock(&pv_chunks_mutex); + if (pmap != NULL) { + pmap_invalidate_all(pmap); + if (pmap != locked_pmap) + PMAP_UNLOCK(pmap); + } + if (m_pc == NULL && free != NULL) { + m_pc = free; + free = m_pc->right; + /* Recycle a freed page table page. */ + m_pc->wire_count = 1; + atomic_add_int(&cnt.v_wire_count, 1); + } + pmap_free_zero_pages(free); + return (m_pc); } /* @@ -2101,15 +2245,14 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) static void free_pv_entry(pmap_t pmap, pv_entry_t pv) { - vm_page_t m; struct pv_chunk *pc; int idx, field, bit; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_LOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); - PV_STAT(pv_entry_frees++); - PV_STAT(pv_entry_spare++); - pv_entry_count--; + PV_STAT(atomic_add_long(&pv_entry_frees, 1)); + PV_STAT(atomic_add_int(&pv_entry_spare, 1)); + PV_STAT(atomic_subtract_long(&pv_entry_count, 1)); pc = pv_to_chunk(pv); idx = pv - &pc->pc_pventry[0]; field = idx / 64; @@ -2125,9 +2268,20 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv) return; } TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); - PV_STAT(pv_entry_spare -= _NPCPV); - PV_STAT(pc_chunk_count--); - PV_STAT(pc_chunk_frees++); + free_pv_chunk(pc); +} + +static void +free_pv_chunk(struct pv_chunk *pc) +{ + vm_page_t m; + + mtx_lock(&pv_chunks_mutex); + TAILQ_REMOVE(&pv_chunks, pc, pc_lru); + mtx_unlock(&pv_chunks_mutex); + PV_STAT(atomic_subtract_int(&pv_entry_spare, _NPCPV)); + PV_STAT(atomic_subtract_int(&pc_chunk_count, 1)); + PV_STAT(atomic_add_int(&pc_chunk_frees, 1)); /* entire chunk is free, return it */ m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc)); dump_drop_page(m->phys_addr); @@ -2136,22 +2290,24 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv) } /* - * get a new pv_entry, allocating a block from the system - * when needed. + * Returns a new PV entry, allocating a new PV chunk from the system when + * needed. If this PV chunk allocation fails and a PV list lock pointer was + * given, a PV chunk is reclaimed from an arbitrary pmap. Otherwise, NULL is + * returned. + * + * The given PV list lock may be released. */ static pv_entry_t -get_pv_entry(pmap_t pmap, boolean_t try) +get_pv_entry(pmap_t pmap, struct rwlock **lockp) { - struct vpgqueues *pq; int bit, field; pv_entry_t pv; struct pv_chunk *pc; vm_page_t m; + rw_assert(&pvh_global_lock, RA_LOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); - PV_STAT(pv_entry_allocs++); - pq = NULL; + PV_STAT(atomic_add_long(&pv_entry_allocs, 1)); retry: pc = TAILQ_FIRST(&pmap->pm_pvchunk); if (pc != NULL) { @@ -2171,51 +2327,129 @@ retry: TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list); } - pv_entry_count++; - PV_STAT(pv_entry_spare--); + PV_STAT(atomic_add_long(&pv_entry_count, 1)); + PV_STAT(atomic_subtract_int(&pv_entry_spare, 1)); return (pv); } } /* No free items, allocate another chunk */ - m = vm_page_alloc(NULL, 0, (pq == &vm_page_queues[PQ_ACTIVE] ? - VM_ALLOC_SYSTEM : VM_ALLOC_NORMAL) | VM_ALLOC_NOOBJ | + m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED); if (m == NULL) { - if (try) { + if (lockp == NULL) { PV_STAT(pc_chunk_tryfail++); return (NULL); } - /* - * Reclaim pv entries: At first, destroy mappings to inactive - * pages. After that, if a pv chunk entry is still needed, - * destroy mappings to active pages. - */ - if (pq == NULL) { - PV_STAT(pmap_collect_inactive++); - pq = &vm_page_queues[PQ_INACTIVE]; - } else if (pq == &vm_page_queues[PQ_INACTIVE]) { - PV_STAT(pmap_collect_active++); - pq = &vm_page_queues[PQ_ACTIVE]; - } else - panic("get_pv_entry: allocation failed"); - pmap_collect(pmap, pq); - goto retry; + m = reclaim_pv_chunk(pmap, lockp); + if (m == NULL) + goto retry; } - PV_STAT(pc_chunk_count++); - PV_STAT(pc_chunk_allocs++); + PV_STAT(atomic_add_int(&pc_chunk_count, 1)); + PV_STAT(atomic_add_int(&pc_chunk_allocs, 1)); dump_add_page(m->phys_addr); pc = (void *)PHYS_TO_DMAP(m->phys_addr); pc->pc_pmap = pmap; pc->pc_map[0] = PC_FREE0 & ~1ul; /* preallocated bit 0 */ pc->pc_map[1] = PC_FREE1; pc->pc_map[2] = PC_FREE2; + mtx_lock(&pv_chunks_mutex); + TAILQ_INSERT_TAIL(&pv_chunks, pc, pc_lru); + mtx_unlock(&pv_chunks_mutex); pv = &pc->pc_pventry[0]; TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list); - pv_entry_count++; - PV_STAT(pv_entry_spare += _NPCPV - 1); + PV_STAT(atomic_add_long(&pv_entry_count, 1)); + PV_STAT(atomic_add_int(&pv_entry_spare, _NPCPV - 1)); return (pv); } +/* + * Returns the number of one bits within the given PV chunk map element. + */ +static int +popcnt_pc_map_elem(uint64_t elem) +{ + int count; + + /* + * This simple method of counting the one bits performs well because + * the given element typically contains more zero bits than one bits. + */ + count = 0; + for (; elem != 0; elem &= elem - 1) + count++; + return (count); +} + +/* + * Ensure that the number of spare PV entries in the specified pmap meets or + * exceeds the given count, "needed". + * + * The given PV list lock may be released. + */ +static void +reserve_pv_entries(pmap_t pmap, int needed, struct rwlock **lockp) +{ + struct pch new_tail; + struct pv_chunk *pc; + int avail, free; + vm_page_t m; + + rw_assert(&pvh_global_lock, RA_LOCKED); + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + KASSERT(lockp != NULL, ("reserve_pv_entries: lockp is NULL")); + + /* + * Newly allocated PV chunks must be stored in a private list until + * the required number of PV chunks have been allocated. Otherwise, + * reclaim_pv_chunk() could recycle one of these chunks. In + * contrast, these chunks must be added to the pmap upon allocation. + */ + TAILQ_INIT(&new_tail); +retry: + avail = 0; + TAILQ_FOREACH(pc, &pmap->pm_pvchunk, pc_list) { + if ((cpu_feature2 & CPUID2_POPCNT) == 0) { + free = popcnt_pc_map_elem(pc->pc_map[0]); + free += popcnt_pc_map_elem(pc->pc_map[1]); + free += popcnt_pc_map_elem(pc->pc_map[2]); + } else { + free = popcntq(pc->pc_map[0]); + free += popcntq(pc->pc_map[1]); + free += popcntq(pc->pc_map[2]); + } + if (free == 0) + break; + avail += free; + if (avail >= needed) + break; + } + for (; avail < needed; avail += _NPCPV) { + m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | + VM_ALLOC_WIRED); + if (m == NULL) { + m = reclaim_pv_chunk(pmap, lockp); + if (m == NULL) + goto retry; + } + PV_STAT(atomic_add_int(&pc_chunk_count, 1)); + PV_STAT(atomic_add_int(&pc_chunk_allocs, 1)); + dump_add_page(m->phys_addr); + pc = (void *)PHYS_TO_DMAP(m->phys_addr); + pc->pc_pmap = pmap; + pc->pc_map[0] = PC_FREE0; + pc->pc_map[1] = PC_FREE1; + pc->pc_map[2] = PC_FREE2; + TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list); + TAILQ_INSERT_TAIL(&new_tail, pc, pc_lru); + PV_STAT(atomic_add_int(&pv_entry_spare, _NPCPV)); + } + if (!TAILQ_EMPTY(&new_tail)) { + mtx_lock(&pv_chunks_mutex); + TAILQ_CONCAT(&pv_chunks, &new_tail, pc_lru); + mtx_unlock(&pv_chunks_mutex); + } +} + /* * First find and then remove the pv entry for the specified pmap and virtual * address from the specified pv list. Returns the pv entry if found and NULL @@ -2227,7 +2461,7 @@ pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va) { pv_entry_t pv; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_LOCKED); TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) { if (pmap == PV_PMAP(pv) && va == pv->pv_va) { TAILQ_REMOVE(&pvh->pv_list, pv, pv_list); @@ -2243,20 +2477,26 @@ pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va) * entries for each of the 4KB page mappings. */ static void -pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa, + struct rwlock **lockp) { struct md_page *pvh; + struct pv_chunk *pc; pv_entry_t pv; vm_offset_t va_last; vm_page_t m; + int bit, field; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_LOCKED); + PMAP_LOCK_ASSERT(pmap, MA_OWNED); KASSERT((pa & PDRMASK) == 0, ("pmap_pv_demote_pde: pa is not 2mpage aligned")); + CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa); /* * Transfer the 2mpage's pv entry for this mapping to the first - * page's pv list. + * page's pv list. Once this transfer begins, the pv list lock + * must not be released until the last pv entry is reinstantiated. */ pvh = pa_to_pvh(pa); va = trunc_2mpage(va); @@ -2265,14 +2505,37 @@ pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) m = PHYS_TO_VM_PAGE(pa); TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); /* Instantiate the remaining NPTEPG - 1 pv entries. */ + PV_STAT(atomic_add_long(&pv_entry_allocs, NPTEPG - 1)); va_last = va + NBPDR - PAGE_SIZE; - do { - m++; - KASSERT((m->oflags & VPO_UNMANAGED) == 0, - ("pmap_pv_demote_pde: page %p is not managed", m)); - va += PAGE_SIZE; - pmap_insert_entry(pmap, va, m); - } while (va < va_last); + for (;;) { + pc = TAILQ_FIRST(&pmap->pm_pvchunk); + KASSERT(pc->pc_map[0] != 0 || pc->pc_map[1] != 0 || + pc->pc_map[2] != 0, ("pmap_pv_demote_pde: missing spare")); + for (field = 0; field < _NPCM; field++) { + while (pc->pc_map[field]) { + bit = bsfq(pc->pc_map[field]); + pc->pc_map[field] &= ~(1ul << bit); + pv = &pc->pc_pventry[field * 64 + bit]; + va += PAGE_SIZE; + pv->pv_va = va; + m++; + KASSERT((m->oflags & VPO_UNMANAGED) == 0, + ("pmap_pv_demote_pde: page %p is not managed", m)); + TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); + if (va == va_last) + goto out; + } + } + TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); + TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list); + } +out: + if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 && pc->pc_map[2] == 0) { + TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); + TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list); + } + PV_STAT(atomic_add_long(&pv_entry_count, NPTEPG - 1)); + PV_STAT(atomic_subtract_int(&pv_entry_spare, NPTEPG - 1)); } /* @@ -2281,23 +2544,25 @@ pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) * for the 2MB page mapping. */ static void -pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa, + struct rwlock **lockp) { struct md_page *pvh; pv_entry_t pv; vm_offset_t va_last; vm_page_t m; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_LOCKED); KASSERT((pa & PDRMASK) == 0, ("pmap_pv_promote_pde: pa is not 2mpage aligned")); + CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa); /* - * Transfer the first page's pv entry for this mapping to the - * 2mpage's pv list. Aside from avoiding the cost of a call - * to get_pv_entry(), a transfer avoids the possibility that - * get_pv_entry() calls pmap_collect() and that pmap_collect() - * removes one of the mappings that is being promoted. + * Transfer the first page's pv entry for this mapping to the 2mpage's + * pv list. Aside from avoiding the cost of a call to get_pv_entry(), + * a transfer avoids the possibility that get_pv_entry() calls + * reclaim_pv_chunk() and that reclaim_pv_chunk() removes one of the + * mappings that is being promoted. */ m = PHYS_TO_VM_PAGE(pa); va = trunc_2mpage(va); @@ -2329,48 +2594,22 @@ pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va) free_pv_entry(pmap, pv); } -static void -pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) -{ - struct md_page *pvh; - - mtx_assert(&vm_page_queue_mtx, MA_OWNED); - pmap_pvh_free(&m->md, pmap, va); - if (TAILQ_EMPTY(&m->md.pv_list) && (m->flags & PG_FICTITIOUS) == 0) { - pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); - if (TAILQ_EMPTY(&pvh->pv_list)) - vm_page_aflag_clear(m, PGA_WRITEABLE); - } -} - /* - * Create a pv entry for page at pa for - * (pmap, va). - */ -static void -pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m) -{ - pv_entry_t pv; - - PMAP_LOCK_ASSERT(pmap, MA_OWNED); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); - pv = get_pv_entry(pmap, FALSE); - pv->pv_va = va; - TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); -} - -/* - * Conditionally create a pv entry. + * Conditionally create the PV entry for a 4KB page mapping if the required + * memory can be allocated without resorting to reclamation. */ static boolean_t -pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m) +pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m, + struct rwlock **lockp) { pv_entry_t pv; + rw_assert(&pvh_global_lock, RA_LOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); - if ((pv = get_pv_entry(pmap, TRUE)) != NULL) { + /* Pass NULL instead of the lock pointer to disable reclamation. */ + if ((pv = get_pv_entry(pmap, NULL)) != NULL) { pv->pv_va = va; + CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m); TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); return (TRUE); } else @@ -2378,17 +2617,22 @@ pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m) } /* - * Create the pv entry for a 2MB page mapping. + * Conditionally create the PV entry for a 2MB page mapping if the required + * memory can be allocated without resorting to reclamation. */ static boolean_t -pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa, + struct rwlock **lockp) { struct md_page *pvh; pv_entry_t pv; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); - if ((pv = get_pv_entry(pmap, TRUE)) != NULL) { + rw_assert(&pvh_global_lock, RA_LOCKED); + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + /* Pass NULL instead of the lock pointer to disable reclamation. */ + if ((pv = get_pv_entry(pmap, NULL)) != NULL) { pv->pv_va = va; + CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa); pvh = pa_to_pvh(pa); TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list); return (TRUE); @@ -2416,6 +2660,20 @@ pmap_fill_ptp(pt_entry_t *firstpte, pt_entry_t newpte) */ static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) +{ + struct rwlock *lock; + boolean_t rv; + + lock = NULL; + rv = pmap_demote_pde_locked(pmap, pde, va, &lock); + if (lock != NULL) + rw_wunlock(lock); + return (rv); +} + +static boolean_t +pmap_demote_pde_locked(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, + struct rwlock **lockp) { pd_entry_t newpde, oldpde; pt_entry_t *firstpte, newpte; @@ -2451,7 +2709,8 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) DMAP_MAX_ADDRESS ? VM_ALLOC_INTERRUPT : VM_ALLOC_NORMAL) | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED)) == NULL) { free = NULL; - pmap_remove_pde(pmap, pde, trunc_2mpage(va), &free); + pmap_remove_pde(pmap, pde, trunc_2mpage(va), &free, + lockp); pmap_invalidate_page(pmap, trunc_2mpage(va)); pmap_free_zero_pages(free); CTR2(KTR_PMAP, "pmap_demote_pde: failure for va %#lx" @@ -2490,6 +2749,17 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) if ((*firstpte & PG_PTE_PROMOTE) != (newpte & PG_PTE_PROMOTE)) pmap_fill_ptp(firstpte, newpte); + /* + * The spare PV entries must be reserved prior to demoting the + * mapping, that is, prior to changing the PDE. Otherwise, the state + * of the PDE and the PV lists will be inconsistent, which can result + * in reclaim_pv_chunk() attempting to remove a PV entry from the + * wrong PV list and pmap_pv_demote_pde() failing to find the expected + * PV entry for the 2MB page mapping that is being demoted. + */ + if ((oldpde & PG_MANAGED) != 0) + reserve_pv_entries(pmap, NPTEPG - 1, lockp); + /* * Demote the mapping. This pmap is locked. The old PDE has * PG_A set. If the old PDE has PG_RW set, it also has PG_M @@ -2509,18 +2779,12 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) pmap_invalidate_page(pmap, (vm_offset_t)vtopte(va)); /* - * Demote the pv entry. This depends on the earlier demotion - * of the mapping. Specifically, the (re)creation of a per- - * page pv entry might trigger the execution of pmap_collect(), - * which might reclaim a newly (re)created per-page pv entry - * and destroy the associated mapping. In order to destroy - * the mapping, the PDE must have already changed from mapping - * the 2mpage to referencing the page table page. + * Demote the PV entry. */ if ((oldpde & PG_MANAGED) != 0) - pmap_pv_demote_pde(pmap, va, oldpde & PG_PS_FRAME); + pmap_pv_demote_pde(pmap, va, oldpde & PG_PS_FRAME, lockp); - pmap_pde_demotions++; + atomic_add_long(&pmap_pde_demotions, 1); CTR2(KTR_PMAP, "pmap_demote_pde: success for va %#lx" " in pmap %p", va, pmap); return (TRUE); @@ -2531,7 +2795,7 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) */ static int pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, - vm_page_t *free) + vm_page_t *free, struct rwlock **lockp) { struct md_page *pvh; pd_entry_t oldpde; @@ -2553,6 +2817,7 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, pmap_invalidate_page(kernel_pmap, sva); pmap_resident_count_dec(pmap, NBPDR / PAGE_SIZE); if (oldpde & PG_MANAGED) { + CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, oldpde & PG_PS_FRAME); pvh = pa_to_pvh(oldpde & PG_PS_FRAME); pmap_pvh_free(pvh, pmap, sva); eva = sva + NBPDR; @@ -2568,7 +2833,7 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, } } if (pmap == kernel_pmap) { - if (!pmap_demote_pde(pmap, pdq, sva)) + if (!pmap_demote_pde_locked(pmap, pdq, sva, lockp)) panic("pmap_remove_pde: failed demotion"); } else { mpte = pmap_lookup_pt_page(pmap, sva); @@ -2590,8 +2855,9 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, */ static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, - pd_entry_t ptepde, vm_page_t *free) + pd_entry_t ptepde, vm_page_t *free, struct rwlock **lockp) { + struct md_page *pvh; pt_entry_t oldpte; vm_page_t m; @@ -2606,7 +2872,14 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, vm_page_dirty(m); if (oldpte & PG_A) vm_page_aflag_set(m, PGA_REFERENCED); - pmap_remove_entry(pmap, m, va); + CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m); + pmap_pvh_free(&m->md, pmap, va); + if (TAILQ_EMPTY(&m->md.pv_list) && + (m->flags & PG_FICTITIOUS) == 0) { + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + if (TAILQ_EMPTY(&pvh->pv_list)) + vm_page_aflag_clear(m, PGA_WRITEABLE); + } } return (pmap_unuse_pt(pmap, va, ptepde, free)); } @@ -2617,6 +2890,7 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, static void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, vm_page_t *free) { + struct rwlock *lock; pt_entry_t *pte; PMAP_LOCK_ASSERT(pmap, MA_OWNED); @@ -2625,7 +2899,10 @@ pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, vm_page_t *free) pte = pmap_pde_to_pte(pde, va); if ((*pte & PG_V) == 0) return; - pmap_remove_pte(pmap, pte, va, *pde, free); + lock = NULL; + pmap_remove_pte(pmap, pte, va, *pde, free, &lock); + if (lock != NULL) + rw_wunlock(lock); pmap_invalidate_page(pmap, va); } @@ -2638,6 +2915,7 @@ pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, vm_page_t *free) void pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) { + struct rwlock *lock; vm_offset_t va, va_next; pml4_entry_t *pml4e; pdp_entry_t *pdpe; @@ -2654,7 +2932,7 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) anyvalid = 0; - vm_page_lock_queues(); + rw_rlock(&pvh_global_lock); PMAP_LOCK(pmap); /* @@ -2670,6 +2948,7 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) } } + lock = NULL; for (; sva < eva; sva = va_next) { if (pmap->pm_stats.resident_count == 0) @@ -2722,9 +3001,10 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) */ if ((ptpaddr & PG_G) == 0) anyvalid = 1; - pmap_remove_pde(pmap, pde, sva, &free); + pmap_remove_pde(pmap, pde, sva, &free, &lock); continue; - } else if (!pmap_demote_pde(pmap, pde, sva)) { + } else if (!pmap_demote_pde_locked(pmap, pde, sva, + &lock)) { /* The large page mapping was destroyed. */ continue; } else @@ -2753,7 +3033,8 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) anyvalid = 1; else if (va == va_next) va = sva; - if (pmap_remove_pte(pmap, pte, sva, ptpaddr, &free)) { + if (pmap_remove_pte(pmap, pte, sva, ptpaddr, &free, + &lock)) { sva += PAGE_SIZE; break; } @@ -2761,10 +3042,12 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) if (va != va_next) pmap_invalidate_range(pmap, va, sva); } + if (lock != NULL) + rw_wunlock(lock); out: if (anyvalid) pmap_invalidate_all(pmap); - vm_page_unlock_queues(); + rw_runlock(&pvh_global_lock); PMAP_UNLOCK(pmap); pmap_free_zero_pages(free); } @@ -2796,7 +3079,7 @@ pmap_remove_all(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_all: page %p is not managed", m)); free = NULL; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); if ((m->flags & PG_FICTITIOUS) != 0) goto small_mappings; pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); @@ -2835,7 +3118,7 @@ small_mappings: PMAP_UNLOCK(pmap); } vm_page_aflag_clear(m, PGA_WRITEABLE); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); pmap_free_zero_pages(free); } @@ -2956,12 +3239,12 @@ resume: } else { if (!pv_lists_locked) { pv_lists_locked = TRUE; - if (!mtx_trylock(&vm_page_queue_mtx)) { + if (!rw_try_rlock(&pvh_global_lock)) { if (anychanged) pmap_invalidate_all( pmap); PMAP_UNLOCK(pmap); - vm_page_lock_queues(); + rw_rlock(&pvh_global_lock); goto resume; } } @@ -3012,7 +3295,7 @@ retry: if (anychanged) pmap_invalidate_all(pmap); if (pv_lists_locked) - vm_page_unlock_queues(); + rw_runlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -3024,7 +3307,8 @@ retry: * identical characteristics. */ static void -pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) +pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, + struct rwlock **lockp) { pd_entry_t newpde; pt_entry_t *firstpte, oldpte, pa, *pte; @@ -3042,7 +3326,7 @@ pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) setpde: newpde = *firstpte; if ((newpde & ((PG_FRAME & PDRMASK) | PG_A | PG_V)) != (PG_A | PG_V)) { - pmap_pde_p_failures++; + atomic_add_long(&pmap_pde_p_failures, 1); CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#lx" " in pmap %p", va, pmap); return; @@ -3067,7 +3351,7 @@ setpde: setpte: oldpte = *pte; if ((oldpte & (PG_FRAME | PG_A | PG_V)) != pa) { - pmap_pde_p_failures++; + atomic_add_long(&pmap_pde_p_failures, 1); CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#lx" " in pmap %p", va, pmap); return; @@ -3086,7 +3370,7 @@ setpte: " in pmap %p", oldpteva, pmap); } if ((oldpte & PG_PTE_PROMOTE) != (newpde & PG_PTE_PROMOTE)) { - pmap_pde_p_failures++; + atomic_add_long(&pmap_pde_p_failures, 1); CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#lx" " in pmap %p", va, pmap); return; @@ -3111,7 +3395,7 @@ setpte: * Promote the pv entries. */ if ((newpde & PG_MANAGED) != 0) - pmap_pv_promote_pde(pmap, va, newpde & PG_PS_FRAME); + pmap_pv_promote_pde(pmap, va, newpde & PG_PS_FRAME, lockp); /* * Propagate the PAT index to its proper position. @@ -3127,7 +3411,7 @@ setpte: else pde_store(pde, PG_PS | newpde); - pmap_pde_promotions++; + atomic_add_long(&pmap_pde_promotions, 1); CTR2(KTR_PMAP, "pmap_promote_pde: success for va %#lx" " in pmap %p", va, pmap); } @@ -3148,6 +3432,7 @@ void pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, vm_prot_t prot, boolean_t wired) { + struct rwlock *lock; pd_entry_t *pde; pt_entry_t *pte; pt_entry_t newpte, origpte; @@ -3161,13 +3446,31 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, KASSERT(va < UPT_MIN_ADDRESS || va >= UPT_MAX_ADDRESS, ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%lx)", va)); + KASSERT((m->oflags & VPO_UNMANAGED) != 0 || va < kmi.clean_sva || + va >= kmi.clean_eva, + ("pmap_enter: managed mapping within the clean submap")); KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0 || VM_OBJECT_LOCKED(m->object), ("pmap_enter: page %p is not busy", m)); + pa = VM_PAGE_TO_PHYS(m); + newpte = (pt_entry_t)(pa | pmap_cache_bits(m->md.pat_mode, 0) | PG_V); + if ((m->oflags & VPO_UNMANAGED) == 0) + newpte |= PG_MANAGED; + if ((prot & VM_PROT_WRITE) != 0) + newpte |= PG_RW; + if ((prot & VM_PROT_EXECUTE) == 0) + newpte |= pg_nx; + if (wired) + newpte |= PG_W; + if (va < VM_MAXUSER_ADDRESS) + newpte |= PG_U; + if (pmap == kernel_pmap) + newpte |= PG_G; - mpte = NULL; + mpte = om = NULL; - vm_page_lock_queues(); + lock = NULL; + rw_rlock(&pvh_global_lock); PMAP_LOCK(pmap); /* @@ -3175,7 +3478,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, * resident, we are creating it here. */ if (va < VM_MAXUSER_ADDRESS) - mpte = pmap_allocpte(pmap, va, M_WAITOK); + mpte = pmap_allocpte(pmap, va, &lock); pde = pmap_pde(pmap, va); if (pde != NULL && (*pde & PG_V) != 0) { @@ -3185,8 +3488,6 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, } else panic("pmap_enter: invalid page directory va=%#lx", va); - pa = VM_PAGE_TO_PHYS(m); - om = NULL; origpte = *pte; opa = origpte & PG_FRAME; @@ -3211,15 +3512,11 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, if (mpte) mpte->wire_count--; - if (origpte & PG_MANAGED) { + if ((origpte & PG_MANAGED) != 0) om = m; - pa |= PG_MANAGED; - } goto validate; } - pv = NULL; - /* * Mapping has changed, invalidate old range and fall through to * handle validating new mapping. @@ -3227,10 +3524,8 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, if (opa) { if (origpte & PG_W) pmap->pm_stats.wired_count--; - if (origpte & PG_MANAGED) { + if ((origpte & PG_MANAGED) != 0) om = PHYS_TO_VM_PAGE(opa); - pv = pmap_pvh_remove(&om->md, pmap, va); - } if (mpte != NULL) { mpte->wire_count--; KASSERT(mpte->wire_count > 0, @@ -3241,60 +3536,41 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, pmap_resident_count_inc(pmap, 1); /* - * Enter on the PV list if part of our managed memory. - */ - if ((m->oflags & VPO_UNMANAGED) == 0) { - KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva, - ("pmap_enter: managed mapping within the clean submap")); - if (pv == NULL) - pv = get_pv_entry(pmap, FALSE); - pv->pv_va = va; - TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); - pa |= PG_MANAGED; - } else if (pv != NULL) - free_pv_entry(pmap, pv); - - /* - * Increment counters + * Increment the counters. */ if (wired) pmap->pm_stats.wired_count++; -validate: /* - * Now validate mapping with desired protection/wiring. + * Enter on the PV list if part of our managed memory. */ - newpte = (pt_entry_t)(pa | pmap_cache_bits(m->md.pat_mode, 0) | PG_V); - if ((prot & VM_PROT_WRITE) != 0) { - newpte |= PG_RW; - if ((newpte & PG_MANAGED) != 0) - vm_page_aflag_set(m, PGA_WRITEABLE); + if ((newpte & PG_MANAGED) != 0) { + pv = get_pv_entry(pmap, &lock); + pv->pv_va = va; + CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, pa); + TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); } - if ((prot & VM_PROT_EXECUTE) == 0) - newpte |= pg_nx; - if (wired) - newpte |= PG_W; - if (va < VM_MAXUSER_ADDRESS) - newpte |= PG_U; - if (pmap == kernel_pmap) - newpte |= PG_G; + +validate: /* - * if the mapping or permission bits are different, we need - * to update the pte. + * Update the PTE only if the mapping or protection/wiring bits are + * different. */ - if ((origpte & ~(PG_M|PG_A)) != newpte) { + if ((origpte & ~(PG_M | PG_A)) != newpte) { newpte |= PG_A; if ((access & VM_PROT_WRITE) != 0) newpte |= PG_M; + if ((newpte & (PG_MANAGED | PG_RW)) == (PG_MANAGED | PG_RW)) + vm_page_aflag_set(m, PGA_WRITEABLE); if (origpte & PG_V) { invlva = FALSE; origpte = pte_load_store(pte, newpte); if (origpte & PG_A) { if (origpte & PG_MANAGED) vm_page_aflag_set(om, PGA_REFERENCED); - if (opa != VM_PAGE_TO_PHYS(m) || ((origpte & - PG_NX) == 0 && (newpte & PG_NX))) + if (opa != pa || ((origpte & PG_NX) == 0 && + (newpte & PG_NX) != 0)) invlva = TRUE; } if ((origpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) { @@ -3303,11 +3579,15 @@ validate: if ((newpte & PG_RW) == 0) invlva = TRUE; } - if ((origpte & PG_MANAGED) != 0 && - TAILQ_EMPTY(&om->md.pv_list) && - ((om->flags & PG_FICTITIOUS) != 0 || - TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list))) - vm_page_aflag_clear(om, PGA_WRITEABLE); + if (opa != pa && (origpte & PG_MANAGED) != 0) { + CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, opa); + pmap_pvh_free(&om->md, pmap, va); + if ((om->aflags & PGA_WRITEABLE) != 0 && + TAILQ_EMPTY(&om->md.pv_list) && + ((om->flags & PG_FICTITIOUS) != 0 || + TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list))) + vm_page_aflag_clear(om, PGA_WRITEABLE); + } if (invlva) pmap_invalidate_page(pmap, va); } else @@ -3321,9 +3601,11 @@ validate: if ((mpte == NULL || mpte->wire_count == NPTEPG) && pg_ps_enabled && (m->flags & PG_FICTITIOUS) == 0 && vm_reserv_level_iffullpop(m) == 0) - pmap_promote_pde(pmap, pde, va); + pmap_promote_pde(pmap, pde, va, &lock); - vm_page_unlock_queues(); + if (lock != NULL) + rw_wunlock(lock); + rw_runlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -3334,14 +3616,15 @@ validate: * (3) a pv entry cannot be allocated without reclaiming another pv entry. */ static boolean_t -pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) +pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, + struct rwlock **lockp) { pd_entry_t *pde, newpde; vm_page_t free, mpde; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_LOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); - if ((mpde = pmap_allocpde(pmap, va, M_NOWAIT)) == NULL) { + if ((mpde = pmap_allocpde(pmap, va, NULL)) == NULL) { CTR2(KTR_PMAP, "pmap_enter_pde: failure for va %#lx" " in pmap %p", va, pmap); return (FALSE); @@ -3364,7 +3647,8 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) /* * Abort this mapping if its PV entry could not be created. */ - if (!pmap_pv_insert_pde(pmap, va, VM_PAGE_TO_PHYS(m))) { + if (!pmap_pv_insert_pde(pmap, va, VM_PAGE_TO_PHYS(m), + lockp)) { free = NULL; if (pmap_unwire_pte_hold(pmap, va, mpde, &free)) { pmap_invalidate_page(pmap, va); @@ -3390,7 +3674,7 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) */ pde_store(pde, newpde); - pmap_pde_mappings++; + atomic_add_long(&pmap_pde_mappings, 1); CTR2(KTR_PMAP, "pmap_enter_pde: success for va %#lx" " in pmap %p", va, pmap); return (TRUE); @@ -3412,6 +3696,7 @@ void pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, vm_page_t m_start, vm_prot_t prot) { + struct rwlock *lock; vm_offset_t va; vm_page_t m, mpte; vm_pindex_t diff, psize; @@ -3420,21 +3705,24 @@ pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, psize = atop(end - start); mpte = NULL; m = m_start; - vm_page_lock_queues(); + lock = NULL; + rw_rlock(&pvh_global_lock); PMAP_LOCK(pmap); while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { va = start + ptoa(diff); if ((va & PDRMASK) == 0 && va + NBPDR <= end && (VM_PAGE_TO_PHYS(m) & PDRMASK) == 0 && pg_ps_enabled && vm_reserv_level_iffullpop(m) == 0 && - pmap_enter_pde(pmap, va, m, prot)) + pmap_enter_pde(pmap, va, m, prot, &lock)) m = &m[NBPDR / PAGE_SIZE - 1]; else mpte = pmap_enter_quick_locked(pmap, va, m, prot, - mpte); + mpte, &lock); m = TAILQ_NEXT(m, listq); } - vm_page_unlock_queues(); + if (lock != NULL) + rw_wunlock(lock); + rw_runlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -3450,17 +3738,21 @@ pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, void pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) { + struct rwlock *lock; - vm_page_lock_queues(); + lock = NULL; + rw_rlock(&pvh_global_lock); PMAP_LOCK(pmap); - (void)pmap_enter_quick_locked(pmap, va, m, prot, NULL); - vm_page_unlock_queues(); + (void)pmap_enter_quick_locked(pmap, va, m, prot, NULL, &lock); + if (lock != NULL) + rw_wunlock(lock); + rw_runlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, - vm_prot_t prot, vm_page_t mpte) + vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp) { vm_page_t free; pt_entry_t *pte; @@ -3469,7 +3761,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva || (m->oflags & VPO_UNMANAGED) != 0, ("pmap_enter_quick_locked: managed mapping within the clean submap")); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_LOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); /* @@ -3494,7 +3786,9 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, /* * If the page table page is mapped, we just increment - * the hold count, and activate it. + * the hold count, and activate it. Otherwise, we + * attempt to allocate a page table page. If this + * attempt fails, we don't retry. Instead, we give up. */ if (ptepa && (*ptepa & PG_V) != 0) { if (*ptepa & PG_PS) @@ -3502,8 +3796,11 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, mpte = PHYS_TO_VM_PAGE(*ptepa & PG_FRAME); mpte->wire_count++; } else { - mpte = _pmap_allocpte(pmap, ptepindex, - M_NOWAIT); + /* + * Pass NULL instead of the PV list lock + * pointer, because we don't intend to sleep. + */ + mpte = _pmap_allocpte(pmap, ptepindex, NULL); if (mpte == NULL) return (mpte); } @@ -3526,7 +3823,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, * Enter on the PV list if part of our managed memory. */ if ((m->oflags & VPO_UNMANAGED) == 0 && - !pmap_try_insert_pv_entry(pmap, va, m)) { + !pmap_try_insert_pv_entry(pmap, va, m, lockp)) { if (mpte != NULL) { free = NULL; if (pmap_unwire_pte_hold(pmap, va, mpte, &free)) { @@ -3629,7 +3926,7 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object, PMAP_LOCK(pmap); for (pa = ptepa | pmap_cache_bits(pat_mode, 1); pa < ptepa + size; pa += NBPDR) { - pdpg = pmap_allocpde(pmap, addr, M_NOWAIT); + pdpg = pmap_allocpde(pmap, addr, NULL); if (pdpg == NULL) { /* * The creation of mappings below is only an @@ -3647,7 +3944,7 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object, pde_store(pde, pa | PG_PS | PG_M | PG_A | PG_U | PG_RW | PG_V); pmap_resident_count_inc(pmap, NBPDR / PAGE_SIZE); - pmap_pde_mappings++; + atomic_add_long(&pmap_pde_mappings, 1); } else { /* Continue on if the PDE is already valid. */ pdpg->wire_count--; @@ -3673,9 +3970,9 @@ pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired) { pd_entry_t *pde; pt_entry_t *pte; - boolean_t are_queues_locked; + boolean_t pv_lists_locked; - are_queues_locked = FALSE; + pv_lists_locked = FALSE; /* * Wiring is not a hardware characteristic so there is no need to @@ -3686,11 +3983,11 @@ retry: pde = pmap_pde(pmap, va); if ((*pde & PG_PS) != 0) { if (!wired != ((*pde & PG_W) == 0)) { - if (!are_queues_locked) { - are_queues_locked = TRUE; - if (!mtx_trylock(&vm_page_queue_mtx)) { + if (!pv_lists_locked) { + pv_lists_locked = TRUE; + if (!rw_try_rlock(&pvh_global_lock)) { PMAP_UNLOCK(pmap); - vm_page_lock_queues(); + rw_rlock(&pvh_global_lock); goto retry; } } @@ -3708,8 +4005,8 @@ retry: atomic_clear_long(pte, PG_W); } out: - if (are_queues_locked) - vm_page_unlock_queues(); + if (pv_lists_locked) + rw_runlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -3725,6 +4022,7 @@ void pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len, vm_offset_t src_addr) { + struct rwlock *lock; vm_page_t free; vm_offset_t addr; vm_offset_t end_addr = src_addr + len; @@ -3733,7 +4031,8 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len, if (dst_addr != src_addr) return; - vm_page_lock_queues(); + lock = NULL; + rw_rlock(&pvh_global_lock); if (dst_pmap < src_pmap) { PMAP_LOCK(dst_pmap); PMAP_LOCK(src_pmap); @@ -3777,7 +4076,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len, continue; if (srcptepaddr & PG_PS) { - dstmpde = pmap_allocpde(dst_pmap, addr, M_NOWAIT); + dstmpde = pmap_allocpde(dst_pmap, addr, NULL); if (dstmpde == NULL) break; pde = (pd_entry_t *) @@ -3785,7 +4084,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len, pde = &pde[pmap_pde_index(addr)]; if (*pde == 0 && ((srcptepaddr & PG_MANAGED) == 0 || pmap_pv_insert_pde(dst_pmap, addr, srcptepaddr & - PG_PS_FRAME))) { + PG_PS_FRAME, &lock))) { *pde = srcptepaddr & ~PG_W; pmap_resident_count_inc(dst_pmap, NBPDR / PAGE_SIZE); } else @@ -3815,14 +4114,15 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len, dstmpte->pindex == pmap_pde_pindex(addr)) dstmpte->wire_count++; else if ((dstmpte = pmap_allocpte(dst_pmap, - addr, M_NOWAIT)) == NULL) + addr, NULL)) == NULL) goto out; dst_pte = (pt_entry_t *) PHYS_TO_DMAP(VM_PAGE_TO_PHYS(dstmpte)); dst_pte = &dst_pte[pmap_pte_index(addr)]; if (*dst_pte == 0 && pmap_try_insert_pv_entry(dst_pmap, addr, - PHYS_TO_VM_PAGE(ptetemp & PG_FRAME))) { + PHYS_TO_VM_PAGE(ptetemp & PG_FRAME), + &lock)) { /* * Clear the wired, modified, and * accessed (referenced) bits @@ -3849,7 +4149,9 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len, } } out: - vm_page_unlock_queues(); + if (lock != NULL) + rw_wunlock(lock); + rw_runlock(&pvh_global_lock); PMAP_UNLOCK(src_pmap); PMAP_UNLOCK(dst_pmap); } @@ -3923,6 +4225,7 @@ boolean_t pmap_page_exists_quick(pmap_t pmap, vm_page_t m) { struct md_page *pvh; + struct rwlock *lock; pv_entry_t pv; int loops = 0; boolean_t rv; @@ -3930,7 +4233,9 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_page_exists_quick: page %p is not managed", m)); rv = FALSE; - vm_page_lock_queues(); + rw_rlock(&pvh_global_lock); + lock = VM_PAGE_TO_PV_LIST_LOCK(m); + rw_rlock(lock); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { if (PV_PMAP(pv) == pmap) { rv = TRUE; @@ -3952,7 +4257,8 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) break; } } - vm_page_unlock_queues(); + rw_runlock(lock); + rw_runlock(&pvh_global_lock); return (rv); } @@ -3970,13 +4276,13 @@ pmap_page_wired_mappings(vm_page_t m) count = 0; if ((m->oflags & VPO_UNMANAGED) != 0) return (count); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); count = pmap_pvh_wired_mappings(&m->md, count); if ((m->flags & PG_FICTITIOUS) == 0) { count = pmap_pvh_wired_mappings(pa_to_pvh(VM_PAGE_TO_PHYS(m)), count); } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (count); } @@ -3992,7 +4298,7 @@ pmap_pvh_wired_mappings(struct md_page *pvh, int count) pt_entry_t *pte; pv_entry_t pv; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) { pmap = PV_PMAP(pv); PMAP_LOCK(pmap); @@ -4011,15 +4317,19 @@ pmap_pvh_wired_mappings(struct md_page *pvh, int count) boolean_t pmap_page_is_mapped(vm_page_t m) { + struct rwlock *lock; boolean_t rv; if ((m->oflags & VPO_UNMANAGED) != 0) return (FALSE); - vm_page_lock_queues(); + rw_rlock(&pvh_global_lock); + lock = VM_PAGE_TO_PV_LIST_LOCK(m); + rw_rlock(lock); rv = !TAILQ_EMPTY(&m->md.pv_list) || ((m->flags & PG_FICTITIOUS) == 0 && !TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list)); - vm_page_unlock_queues(); + rw_runlock(lock); + rw_runlock(&pvh_global_lock); return (rv); } @@ -4041,21 +4351,23 @@ pmap_remove_pages(pmap_t pmap) pv_entry_t pv; struct md_page *pvh; struct pv_chunk *pc, *npc; - int field, idx; + struct rwlock *lock; int64_t bit; uint64_t inuse, bitmask; - int allfree; + int allfree, field, freed, idx; if (pmap != PCPU_GET(curpmap)) { printf("warning: pmap_remove_pages called with non-current pmap\n"); return; } - vm_page_lock_queues(); + lock = NULL; + rw_rlock(&pvh_global_lock); PMAP_LOCK(pmap); TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) { allfree = 1; + freed = 0; for (field = 0; field < _NPCM; field++) { - inuse = (~(pc->pc_map[field])) & pc_freemask[field]; + inuse = ~pc->pc_map[field] & pc_freemask[field]; while (inuse != 0) { bit = bsfq(inuse); bitmask = 1UL << bit; @@ -4109,10 +4421,9 @@ pmap_remove_pages(pmap_t pmap) vm_page_dirty(m); } + CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m); + /* Mark free */ - PV_STAT(pv_entry_frees++); - PV_STAT(pv_entry_spare++); - pv_entry_count--; pc->pc_map[field] |= bitmask; if ((tpte & PG_PS) != 0) { pmap_resident_count_dec(pmap, NBPDR / PAGE_SIZE); @@ -4120,7 +4431,8 @@ pmap_remove_pages(pmap_t pmap) TAILQ_REMOVE(&pvh->pv_list, pv, pv_list); if (TAILQ_EMPTY(&pvh->pv_list)) { for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++) - if (TAILQ_EMPTY(&mt->md.pv_list)) + if ((mt->aflags & PGA_WRITEABLE) != 0 && + TAILQ_EMPTY(&mt->md.pv_list)) vm_page_aflag_clear(mt, PGA_WRITEABLE); } mpte = pmap_lookup_pt_page(pmap, pv->pv_va); @@ -4136,7 +4448,8 @@ pmap_remove_pages(pmap_t pmap) } else { pmap_resident_count_dec(pmap, 1); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - if (TAILQ_EMPTY(&m->md.pv_list) && + if ((m->aflags & PGA_WRITEABLE) != 0 && + TAILQ_EMPTY(&m->md.pv_list) && (m->flags & PG_FICTITIOUS) == 0) { pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); if (TAILQ_EMPTY(&pvh->pv_list)) @@ -4144,21 +4457,21 @@ pmap_remove_pages(pmap_t pmap) } } pmap_unuse_pt(pmap, pv->pv_va, ptepde, &free); + freed++; } } + PV_STAT(atomic_add_long(&pv_entry_frees, freed)); + PV_STAT(atomic_add_int(&pv_entry_spare, freed)); + PV_STAT(atomic_subtract_long(&pv_entry_count, freed)); if (allfree) { - PV_STAT(pv_entry_spare -= _NPCPV); - PV_STAT(pc_chunk_count--); - PV_STAT(pc_chunk_frees++); TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); - m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc)); - dump_drop_page(m->phys_addr); - vm_page_unwire(m, 0); - vm_page_free(m); + free_pv_chunk(pc); } } + if (lock != NULL) + rw_wunlock(lock); pmap_invalidate_all(pmap); - vm_page_unlock_queues(); + rw_runlock(&pvh_global_lock); PMAP_UNLOCK(pmap); pmap_free_zero_pages(free); } @@ -4186,11 +4499,11 @@ pmap_is_modified(vm_page_t m) if ((m->oflags & VPO_BUSY) == 0 && (m->aflags & PGA_WRITEABLE) == 0) return (FALSE); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); rv = pmap_is_modified_pvh(&m->md) || ((m->flags & PG_FICTITIOUS) == 0 && pmap_is_modified_pvh(pa_to_pvh(VM_PAGE_TO_PHYS(m)))); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (rv); } @@ -4207,7 +4520,7 @@ pmap_is_modified_pvh(struct md_page *pvh) pmap_t pmap; boolean_t rv; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); rv = FALSE; TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) { pmap = PV_PMAP(pv); @@ -4258,11 +4571,11 @@ pmap_is_referenced(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_referenced: page %p is not managed", m)); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); rv = pmap_is_referenced_pvh(&m->md) || ((m->flags & PG_FICTITIOUS) == 0 && pmap_is_referenced_pvh(pa_to_pvh(VM_PAGE_TO_PHYS(m)))); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (rv); } @@ -4278,7 +4591,7 @@ pmap_is_referenced_pvh(struct md_page *pvh) pmap_t pmap; boolean_t rv; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); rv = FALSE; TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) { pmap = PV_PMAP(pv); @@ -4317,7 +4630,7 @@ pmap_remove_write(vm_page_t m) if ((m->oflags & VPO_BUSY) == 0 && (m->aflags & PGA_WRITEABLE) == 0) return; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); if ((m->flags & PG_FICTITIOUS) != 0) goto small_mappings; pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); @@ -4335,8 +4648,9 @@ small_mappings: pmap = PV_PMAP(pv); PMAP_LOCK(pmap); pde = pmap_pde(pmap, pv->pv_va); - KASSERT((*pde & PG_PS) == 0, ("pmap_clear_write: found" - " a 2mpage in page %p's pv list", m)); + KASSERT((*pde & PG_PS) == 0, + ("pmap_remove_write: found a 2mpage in page %p's pv list", + m)); pte = pmap_pde_to_pte(pde, pv->pv_va); retry: oldpte = *pte; @@ -4351,7 +4665,7 @@ retry: PMAP_UNLOCK(pmap); } vm_page_aflag_clear(m, PGA_WRITEABLE); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* @@ -4379,7 +4693,7 @@ pmap_ts_referenced(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_ts_referenced: page %p is not managed", m)); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); if ((m->flags & PG_FICTITIOUS) != 0) goto small_mappings; pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); @@ -4437,7 +4751,7 @@ small_mappings: } while ((pv = pvn) != NULL && pv != pvf); } out: - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (rtval); } @@ -4467,7 +4781,7 @@ pmap_clear_modify(vm_page_t m) */ if ((m->aflags & PGA_WRITEABLE) == 0) return; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); if ((m->flags & PG_FICTITIOUS) != 0) goto small_mappings; pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); @@ -4516,7 +4830,7 @@ small_mappings: } PMAP_UNLOCK(pmap); } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* @@ -4536,7 +4850,7 @@ pmap_clear_reference(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_reference: page %p is not managed", m)); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); if ((m->flags & PG_FICTITIOUS) != 0) goto small_mappings; pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); @@ -4576,7 +4890,7 @@ small_mappings: } PMAP_UNLOCK(pmap); } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index ffacb87be29..75e15e0ef45 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -972,4 +972,15 @@ amd64_syscall(struct thread *td, int traced) syscallname(td->td_proc, sa.code))); syscallret(td, error, &sa); + + /* + * If the user-supplied value of %rip is not a canonical + * address, then some CPUs will trigger a ring 0 #GP during + * the sysret instruction. However, the fault handler would + * execute in ring 0 with the user's %gs and %rsp which would + * not be safe. Instead, use the full return path which + * catches the problem safely. + */ + if (td->td_frame->tf_rip >= VM_MAXUSER_ADDRESS) + set_pcb_flags(td->td_pcb, PCB_FULL_IRET); } diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC index 396e412d001..271a3341512 100644 --- a/sys/amd64/conf/GENERIC +++ b/sys/amd64/conf/GENERIC @@ -28,6 +28,7 @@ options SCHED_ULE # ULE scheduler options PREEMPTION # Enable kernel thread preemption options INET # InterNETworking options INET6 # IPv6 communications protocols +options TCP_OFFLOAD # TCP offload options SCTP # Stream Control Transmission Protocol options FFS # Berkeley Fast Filesystem options SOFTUPDATES # Enable FFS soft updates support @@ -44,6 +45,7 @@ options CD9660 # ISO 9660 Filesystem options PROCFS # Process filesystem (requires PSEUDOFS) options PSEUDOFS # Pseudo-filesystem framework options GEOM_PART_GPT # GUID Partition Tables. +options GEOM_RAID # Soft RAID functionality. options GEOM_LABEL # Provides labelization options COMPAT_FREEBSD32 # Compatible with i386 binaries options COMPAT_FREEBSD4 # Compatible with FreeBSD4 @@ -66,6 +68,7 @@ options CAPABILITIES # Capsicum capabilities options MAC # TrustedBSD MAC Framework options KDTRACE_FRAME # Ensure frames are compiled in options KDTRACE_HOOKS # Kernel DTrace hooks +options DDB_CTF # Kernel ELF linker loads CTF data options INCLUDE_CONFIG_FILE # Include this file in kernel # Debugging support. Always need this: @@ -75,7 +78,6 @@ options KDB_TRACE # Print a stack trace for a panic. # For full debugger support use this instead: options DDB # Support DDB. options GDB # Support remote GDB. -options DDB_CTF # kernel ELF linker loads CTF data options DEADLKRES # Enable the deadlock resolver options INVARIANTS # Enable calls of extra sanity checking options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS @@ -150,6 +152,7 @@ device iir # Intel Integrated RAID device ips # IBM (Adaptec) ServeRAID device mly # Mylex AcceleRAID/eXtremeRAID device twa # 3ware 9000 series PATA/SATA RAID +device tws # LSI 3ware 9750 SATA+SAS 6Gb/s RAID controller # RAID controllers device aac # Adaptec FSA RAID @@ -160,7 +163,6 @@ device mlx # Mylex DAC960 family #XXX pointer/int warnings #device pst # Promise Supertrak SX6000 device twe # 3ware ATA RAID -device tws # LSI 3ware 9750 SATA+SAS 6Gb/s RAID controller # atkbdc0 controls both the keyboard and the PS/2 mouse device atkbdc # AT keyboard controller @@ -272,6 +274,8 @@ device ath # Atheros NIC's device ath_pci # Atheros pci/cardbus glue device ath_hal # pci/cardbus chip support options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors +options AH_AR5416_INTERRUPT_MITIGATION # AR5416 interrupt mitigation +options ATH_ENABLE_11N # Enable 802.11n support for AR5416 and later device ath_rate_sample # SampleRate tx rate control for ath #device bwi # Broadcom BCM430x/BCM431x wireless NICs. #device bwn # Broadcom BCM43xx wireless NICs. diff --git a/sys/amd64/include/atomic.h b/sys/amd64/include/atomic.h index e167b54f979..99a94b77bb1 100644 --- a/sys/amd64/include/atomic.h +++ b/sys/amd64/include/atomic.h @@ -81,8 +81,9 @@ int atomic_cmpset_long(volatile u_long *dst, u_long expect, u_long src); u_int atomic_fetchadd_int(volatile u_int *p, u_int v); u_long atomic_fetchadd_long(volatile u_long *p, u_long v); -#define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \ -u_##TYPE atomic_load_acq_##TYPE(volatile u_##TYPE *p); \ +#define ATOMIC_LOAD(TYPE, LOP) \ +u_##TYPE atomic_load_acq_##TYPE(volatile u_##TYPE *p) +#define ATOMIC_STORE(TYPE) \ void atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v) #else /* !KLD_MODULE && __GNUCLIKE_ASM */ @@ -210,37 +211,43 @@ atomic_fetchadd_long(volatile u_long *p, u_long v) return (v); } +/* + * We assume that a = b will do atomic loads and stores. Due to the + * IA32 memory model, a simple store guarantees release semantics. + * + * However, loads may pass stores, so for atomic_load_acq we have to + * ensure a Store/Load barrier to do the load in SMP kernels. We use + * "lock cmpxchg" as recommended by the AMD Software Optimization + * Guide, and not mfence. For UP kernels, however, the cache of the + * single processor is always consistent, so we only need to take care + * of the compiler. + */ +#define ATOMIC_STORE(TYPE) \ +static __inline void \ +atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ +{ \ + __asm __volatile("" : : : "memory"); \ + *p = v; \ +} \ +struct __hack + #if defined(_KERNEL) && !defined(SMP) -/* - * We assume that a = b will do atomic loads and stores. However, on a - * PentiumPro or higher, reads may pass writes, so for that case we have - * to use a serializing instruction (i.e. with LOCK) to do the load in - * SMP kernels. For UP kernels, however, the cache of the single processor - * is always consistent, so we only need to take care of compiler. - */ -#define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \ +#define ATOMIC_LOAD(TYPE, LOP) \ static __inline u_##TYPE \ atomic_load_acq_##TYPE(volatile u_##TYPE *p) \ { \ u_##TYPE tmp; \ \ tmp = *p; \ - __asm __volatile ("" : : : "memory"); \ + __asm __volatile("" : : : "memory"); \ return (tmp); \ -} \ - \ -static __inline void \ -atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ -{ \ - __asm __volatile ("" : : : "memory"); \ - *p = v; \ } \ struct __hack #else /* !(_KERNEL && !SMP) */ -#define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \ +#define ATOMIC_LOAD(TYPE, LOP) \ static __inline u_##TYPE \ atomic_load_acq_##TYPE(volatile u_##TYPE *p) \ { \ @@ -253,19 +260,6 @@ atomic_load_acq_##TYPE(volatile u_##TYPE *p) \ : "memory", "cc"); \ \ return (res); \ -} \ - \ -/* \ - * The XCHG instruction asserts LOCK automagically. \ - */ \ -static __inline void \ -atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ -{ \ - __asm __volatile(SOP \ - : "=m" (*p), /* 0 */ \ - "+r" (v) /* 1 */ \ - : "m" (*p) /* 2 */ \ - : "memory"); \ } \ struct __hack @@ -293,13 +287,19 @@ ATOMIC_ASM(clear, long, "andq %1,%0", "ir", ~v); ATOMIC_ASM(add, long, "addq %1,%0", "ir", v); ATOMIC_ASM(subtract, long, "subq %1,%0", "ir", v); -ATOMIC_STORE_LOAD(char, "cmpxchgb %b0,%1", "xchgb %b1,%0"); -ATOMIC_STORE_LOAD(short,"cmpxchgw %w0,%1", "xchgw %w1,%0"); -ATOMIC_STORE_LOAD(int, "cmpxchgl %0,%1", "xchgl %1,%0"); -ATOMIC_STORE_LOAD(long, "cmpxchgq %0,%1", "xchgq %1,%0"); +ATOMIC_LOAD(char, "cmpxchgb %b0,%1"); +ATOMIC_LOAD(short, "cmpxchgw %w0,%1"); +ATOMIC_LOAD(int, "cmpxchgl %0,%1"); +ATOMIC_LOAD(long, "cmpxchgq %0,%1"); + +ATOMIC_STORE(char); +ATOMIC_STORE(short); +ATOMIC_STORE(int); +ATOMIC_STORE(long); #undef ATOMIC_ASM -#undef ATOMIC_STORE_LOAD +#undef ATOMIC_LOAD +#undef ATOMIC_STORE #ifndef WANT_FUNCTIONS diff --git a/sys/amd64/include/cpufunc.h b/sys/amd64/include/cpufunc.h index c616a3e9477..09d04dbb0c0 100644 --- a/sys/amd64/include/cpufunc.h +++ b/sys/amd64/include/cpufunc.h @@ -106,6 +106,13 @@ clflush(u_long addr) __asm __volatile("clflush %0" : : "m" (*(char *)addr)); } +static __inline void +clts(void) +{ + + __asm __volatile("clts"); +} + static __inline void disable_intr(void) { @@ -273,6 +280,15 @@ outw(u_int port, u_short data) __asm __volatile("outw %0, %w1" : : "a" (data), "Nd" (port)); } +static __inline u_long +popcntq(u_long mask) +{ + u_long result; + + __asm __volatile("popcntq %1,%0" : "=r" (result) : "rm" (mask)); + return (result); +} + static __inline void mfence(void) { @@ -409,6 +425,25 @@ rcr4(void) return (data); } +static __inline u_long +rxcr(u_int reg) +{ + u_int low, high; + + __asm __volatile("xgetbv" : "=a" (low), "=d" (high) : "c" (reg)); + return (low | ((uint64_t)high << 32)); +} + +static __inline void +load_xcr(u_int reg, u_long val) +{ + u_int low, high; + + low = val; + high = val >> 32; + __asm __volatile("xsetbv" : : "c" (reg), "a" (low), "d" (high)); +} + /* * Global TLB flush (except for thise for pages marked PG_G) */ @@ -691,6 +726,9 @@ intr_restore(register_t rflags) int breakpoint(void); u_int bsfl(u_int mask); u_int bsrl(u_int mask); +void clflush(u_long addr); +void clts(void); +void cpuid_count(u_int ax, u_int cx, u_int *p); void disable_intr(void); void do_cpuid(u_int ax, u_int *p); void enable_intr(void); diff --git a/sys/amd64/include/elf.h b/sys/amd64/include/elf.h index ded4e44f0bb..d69c6b44bd1 100644 --- a/sys/amd64/include/elf.h +++ b/sys/amd64/include/elf.h @@ -94,6 +94,7 @@ __ElfType(Auxinfo); #define AT_NCPUS 19 /* Number of CPUs. */ #define AT_PAGESIZES 20 /* Pagesizes. */ #define AT_PAGESIZESLEN 21 /* Number of pagesizes. */ +#define AT_TIMEKEEP 22 /* Pointer to timehands. */ #define AT_STACKPROT 23 /* Initial stack protection. */ #define AT_COUNT 24 /* Count of defined aux entry types. */ diff --git a/sys/amd64/include/in_cksum.h b/sys/amd64/include/in_cksum.h index adfde8f22d1..156035e8918 100644 --- a/sys/amd64/include/in_cksum.h +++ b/sys/amd64/include/in_cksum.h @@ -43,6 +43,7 @@ #define in_cksum(m, len) in_cksum_skip(m, len, 0) +#if defined(IPVERSION) && (IPVERSION == 4) /* * It it useful to have an Internet checksum routine which is inlineable * and optimized specifically for the task of computing IP header checksums @@ -69,9 +70,12 @@ in_cksum_update(struct ip *ip) } while(0) #endif +#endif #ifdef _KERNEL +#if defined(IPVERSION) && (IPVERSION == 4) u_int in_cksum_hdr(const struct ip *ip); +#endif u_short in_addword(u_short sum, u_short b); u_short in_pseudo(u_int sum, u_int b, u_int c); u_short in_cksum_skip(struct mbuf *m, int len, int skip); diff --git a/sys/amd64/include/intr_machdep.h b/sys/amd64/include/intr_machdep.h index 700e35f89b1..9d066b17ac2 100644 --- a/sys/amd64/include/intr_machdep.h +++ b/sys/amd64/include/intr_machdep.h @@ -140,9 +140,7 @@ int elcr_probe(void); enum intr_trigger elcr_read_trigger(u_int irq); void elcr_resume(void); void elcr_write_trigger(u_int irq, enum intr_trigger trigger); -#ifdef SMP void intr_add_cpu(u_int cpu); -#endif int intr_add_handler(const char *name, int vector, driver_filter_t filter, driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep); diff --git a/sys/amd64/include/pcb.h b/sys/amd64/include/pcb.h index 61f651bb624..22cbbe2a290 100644 --- a/sys/amd64/include/pcb.h +++ b/sys/amd64/include/pcb.h @@ -91,9 +91,20 @@ struct pcb { /* local tss, with i/o bitmap; NULL for common */ struct amd64tss *pcb_tssp; + /* model specific registers */ + register_t pcb_efer; + register_t pcb_star; + register_t pcb_lstar; + register_t pcb_cstar; + register_t pcb_sfmask; + register_t pcb_xsmask; + + /* fpu context for suspend/resume */ + void *pcb_fpususpend; + struct savefpu *pcb_save; - uint64_t pcb_pad[2]; + uint64_t pcb_pad[3]; }; #ifdef _KERNEL @@ -130,7 +141,8 @@ clear_pcb_flags(struct pcb *pcb, const u_int flags) } void makectx(struct trapframe *, struct pcb *); -int savectx(struct pcb *); +int savectx(struct pcb *) __returns_twice; +void resumectx(struct pcb *); #endif diff --git a/sys/amd64/include/pmap.h b/sys/amd64/include/pmap.h index 1b8108a3e3c..71045ae8822 100644 --- a/sys/amd64/include/pmap.h +++ b/sys/amd64/include/pmap.h @@ -295,7 +295,7 @@ struct pv_chunk { pmap_t pc_pmap; TAILQ_ENTRY(pv_chunk) pc_list; uint64_t pc_map[_NPCM]; /* bitmap; 1 = free */ - uint64_t pc_spare[2]; + TAILQ_ENTRY(pv_chunk) pc_lru; struct pv_entry pc_pventry[_NPCPV]; }; @@ -309,6 +309,7 @@ extern vm_offset_t virtual_avail; extern vm_offset_t virtual_end; #define pmap_page_get_memattr(m) ((vm_memattr_t)(m)->md.pat_mode) +#define pmap_page_is_write_mapped(m) (((m)->aflags & PGA_WRITEABLE) != 0) #define pmap_unmapbios(va, sz) pmap_unmapdev((va), (sz)) void pmap_bootstrap(vm_paddr_t *); diff --git a/sys/amd64/include/smp.h b/sys/amd64/include/smp.h index de686b76a44..16d87ea24cc 100644 --- a/sys/amd64/include/smp.h +++ b/sys/amd64/include/smp.h @@ -59,6 +59,7 @@ void cpu_add(u_int apic_id, char boot_cpu); void cpustop_handler(void); void cpususpend_handler(void); void init_secondary(void); +void ipi_startup(int apic_id, int vector); void ipi_all_but_self(u_int ipi); void ipi_bitmap_handler(struct trapframe frame); void ipi_cpu(int cpu, u_int ipi); diff --git a/sys/amd64/include/vdso.h b/sys/amd64/include/vdso.h new file mode 100644 index 00000000000..b81c455a92a --- /dev/null +++ b/sys/amd64/include/vdso.h @@ -0,0 +1,6 @@ +/*- + * This file is in the public domain. + */ +/* $FreeBSD$ */ + +#include diff --git a/sys/amd64/include/vmparam.h b/sys/amd64/include/vmparam.h index 0c656023fd4..e06fa399cac 100644 --- a/sys/amd64/include/vmparam.h +++ b/sys/amd64/include/vmparam.h @@ -54,7 +54,7 @@ */ #define MAXTSIZ (128UL*1024*1024) /* max text size */ #ifndef DFLDSIZ -#define DFLDSIZ (128UL*1024*1024) /* initial data size limit */ +#define DFLDSIZ (32768UL*1024*1024) /* initial data size limit */ #endif #ifndef MAXDSIZ #define MAXDSIZ (32768UL*1024*1024) /* max data size */ diff --git a/sys/amd64/linux32/linux.h b/sys/amd64/linux32/linux.h index 4eb14250e59..2c269d33e6c 100644 --- a/sys/amd64/linux32/linux.h +++ b/sys/amd64/linux32/linux.h @@ -42,6 +42,7 @@ extern u_char linux_debug_map[]; #define ldebug(name) isclr(linux_debug_map, LINUX_SYS_linux_ ## name) #define ARGS(nm, fmt) "linux(%ld): "#nm"("fmt")\n", (long)td->td_proc->p_pid #define LMSG(fmt) "linux(%ld): "fmt"\n", (long)td->td_proc->p_pid +#define LINUX_DTRACE linuxulator32 #ifdef MALLOC_DECLARE MALLOC_DECLARE(M_LINUX); diff --git a/sys/amd64/linux32/linux32_dummy.c b/sys/amd64/linux32/linux32_dummy.c index 9abc0ee4ac9..95bf3ec88e9 100644 --- a/sys/amd64/linux32/linux32_dummy.c +++ b/sys/amd64/linux32/linux32_dummy.c @@ -29,14 +29,23 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_compat.h" +#include "opt_kdtrace.h" + #include +#include +#include #include #include #include #include +#include #include +/* DTrace init */ +LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE); + DUMMY(stime); DUMMY(olduname); DUMMY(syslog); diff --git a/sys/amd64/linux32/linux32_proto.h b/sys/amd64/linux32/linux32_proto.h index c8e0d3f8729..204944571f4 100644 --- a/sys/amd64/linux32/linux32_proto.h +++ b/sys/amd64/linux32/linux32_proto.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 234359 2012-04-16 23:16:18Z jkim + * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 236026 2012-05-25 21:50:48Z ed */ #ifndef _LINUX_SYSPROTO_H_ @@ -60,8 +60,8 @@ struct linux_unlink_args { }; struct linux_execve_args { char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; - char argp_l_[PADL_(u_int32_t *)]; u_int32_t * argp; char argp_r_[PADR_(u_int32_t *)]; - char envp_l_[PADL_(u_int32_t *)]; u_int32_t * envp; char envp_r_[PADR_(u_int32_t *)]; + char argp_l_[PADL_(uint32_t *)]; uint32_t * argp; char argp_r_[PADR_(uint32_t *)]; + char envp_l_[PADL_(uint32_t *)]; uint32_t * envp; char envp_r_[PADR_(uint32_t *)]; }; struct linux_chdir_args { char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; diff --git a/sys/amd64/linux32/linux32_syscall.h b/sys/amd64/linux32/linux32_syscall.h index bba5e2d58fd..5a411f87c92 100644 --- a/sys/amd64/linux32/linux32_syscall.h +++ b/sys/amd64/linux32/linux32_syscall.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 234359 2012-04-16 23:16:18Z jkim + * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 236026 2012-05-25 21:50:48Z ed */ #define LINUX_SYS_exit 1 diff --git a/sys/amd64/linux32/linux32_syscalls.c b/sys/amd64/linux32/linux32_syscalls.c index 178ab1117bc..ebde8997d9c 100644 --- a/sys/amd64/linux32/linux32_syscalls.c +++ b/sys/amd64/linux32/linux32_syscalls.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 234359 2012-04-16 23:16:18Z jkim + * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 236026 2012-05-25 21:50:48Z ed */ const char *linux_syscallnames[] = { diff --git a/sys/amd64/linux32/linux32_sysent.c b/sys/amd64/linux32/linux32_sysent.c index ba7e0e31487..1ece240658a 100644 --- a/sys/amd64/linux32/linux32_sysent.c +++ b/sys/amd64/linux32/linux32_sysent.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 234359 2012-04-16 23:16:18Z jkim + * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 236026 2012-05-25 21:50:48Z ed */ #include "opt_compat.h" diff --git a/sys/amd64/linux32/linux32_systrace_args.c b/sys/amd64/linux32/linux32_systrace_args.c index 16d93350b16..0b020a7350e 100644 --- a/sys/amd64/linux32/linux32_systrace_args.c +++ b/sys/amd64/linux32/linux32_systrace_args.c @@ -94,8 +94,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) case 11: { struct linux_execve_args *p = params; uarg[0] = (intptr_t) p->path; /* char * */ - uarg[1] = (intptr_t) p->argp; /* u_int32_t * */ - uarg[2] = (intptr_t) p->envp; /* u_int32_t * */ + uarg[1] = (intptr_t) p->argp; /* uint32_t * */ + uarg[2] = (intptr_t) p->envp; /* uint32_t * */ *n_args = 3; break; } @@ -2401,10 +2401,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "char *"; break; case 1: - p = "u_int32_t *"; + p = "uint32_t *"; break; case 2: - p = "u_int32_t *"; + p = "uint32_t *"; break; default: break; diff --git a/sys/amd64/linux32/syscalls.master b/sys/amd64/linux32/syscalls.master index a71e02d72d8..c3a10afeb0a 100644 --- a/sys/amd64/linux32/syscalls.master +++ b/sys/amd64/linux32/syscalls.master @@ -54,8 +54,8 @@ l_int mode); } 9 AUE_LINK STD { int linux_link(char *path, char *to); } 10 AUE_UNLINK STD { int linux_unlink(char *path); } -11 AUE_EXECVE STD { int linux_execve(char *path, u_int32_t *argp, \ - u_int32_t *envp); } +11 AUE_EXECVE STD { int linux_execve(char *path, uint32_t *argp, \ + uint32_t *envp); } 12 AUE_CHDIR STD { int linux_chdir(char *path); } 13 AUE_NULL STD { int linux_time(l_time_t *tm); } 14 AUE_MKNOD STD { int linux_mknod(char *path, l_int mode, \ diff --git a/sys/arm/arm/bcopyinout_xscale.S b/sys/arm/arm/bcopyinout_xscale.S index d1017c3eb8c..68c2701f594 100644 --- a/sys/arm/arm/bcopyinout_xscale.S +++ b/sys/arm/arm/bcopyinout_xscale.S @@ -333,10 +333,10 @@ ENTRY(copyin) str r6, [r1], #0x04 str r7, [r1], #0x04 .Lcopyin_bad1: - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lcopyin_bad1_loop16 - adds r2, r2, #0x10 + adds r2, r2, #0x10 ldmeqfd sp!, {r4-r7} RETeq /* Return now if done */ subs r2, r2, #0x04 @@ -394,10 +394,10 @@ ENTRY(copyin) str r6, [r1], #0x04 str r7, [r1], #0x04 .Lcopyin_bad2: - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lcopyin_bad2_loop16 - adds r2, r2, #0x10 + adds r2, r2, #0x10 ldmeqfd sp!, {r4-r7} RETeq /* Return now if done */ subs r2, r2, #0x04 @@ -455,10 +455,10 @@ ENTRY(copyin) str r6, [r1], #0x04 str r7, [r1], #0x04 .Lcopyin_bad3: - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lcopyin_bad3_loop16 - adds r2, r2, #0x10 + adds r2, r2, #0x10 ldmeqfd sp!, {r4-r7} RETeq /* Return now if done */ subs r2, r2, #0x04 @@ -785,10 +785,10 @@ ENTRY(copyout) strt r6, [r1], #0x04 strt r7, [r1], #0x04 .Lcopyout_bad1: - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lcopyout_bad1_loop16 - adds r2, r2, #0x10 + adds r2, r2, #0x10 ldmeqfd sp!, {r4-r7} RETeq /* Return now if done */ subs r2, r2, #0x04 @@ -846,10 +846,10 @@ ENTRY(copyout) strt r6, [r1], #0x04 strt r7, [r1], #0x04 .Lcopyout_bad2: - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lcopyout_bad2_loop16 - adds r2, r2, #0x10 + adds r2, r2, #0x10 ldmeqfd sp!, {r4-r7} RETeq /* Return now if done */ subs r2, r2, #0x04 @@ -907,10 +907,10 @@ ENTRY(copyout) strt r6, [r1], #0x04 strt r7, [r1], #0x04 .Lcopyout_bad3: - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lcopyout_bad3_loop16 - adds r2, r2, #0x10 + adds r2, r2, #0x10 ldmeqfd sp!, {r4-r7} RETeq /* Return now if done */ subs r2, r2, #0x04 diff --git a/sys/arm/arm/bootconfig.c b/sys/arm/arm/bootconfig.c index 0a5d3057a2c..3e9397e6667 100644 --- a/sys/arm/arm/bootconfig.c +++ b/sys/arm/arm/bootconfig.c @@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$"); #include -/* +/* * Function to identify and process different types of boot argument */ diff --git a/sys/arm/arm/busdma_machdep.c b/sys/arm/arm/busdma_machdep.c index f2fe377fc15..7deffed2406 100644 --- a/sys/arm/arm/busdma_machdep.c +++ b/sys/arm/arm/busdma_machdep.c @@ -156,7 +156,7 @@ struct bus_dmamap { static STAILQ_HEAD(, bus_dmamap) bounce_map_waitinglist; static STAILQ_HEAD(, bus_dmamap) bounce_map_callbacklist; -static TAILQ_HEAD(,bus_dmamap) dmamap_freelist = +static TAILQ_HEAD(,bus_dmamap) dmamap_freelist = TAILQ_HEAD_INITIALIZER(dmamap_freelist); #define BUSDMA_STATIC_MAPS 500 @@ -210,7 +210,7 @@ arm_dmamap_freelist_init(void *dummy) { int i; - for (i = 0; i < BUSDMA_STATIC_MAPS; i++) + for (i = 0; i < BUSDMA_STATIC_MAPS; i++) TAILQ_INSERT_HEAD(&dmamap_freelist, &map_pool[i], freelist); } @@ -231,7 +231,7 @@ _bus_dma_can_bounce(vm_offset_t lowaddr, vm_offset_t highaddr) int i; for (i = 0; phys_avail[i] && phys_avail[i + 1]; i += 2) { if ((lowaddr >= phys_avail[i] && lowaddr <= phys_avail[i + 1]) - || (lowaddr < phys_avail[i] && + || (lowaddr < phys_avail[i] && highaddr > phys_avail[i])) return (1); } @@ -313,7 +313,7 @@ _busdma_alloc_dmamap(void) return (map); } -static __inline void +static __inline void _busdma_free_dmamap(bus_dmamap_t map) { if (map->flags & DMAMAP_ALLOCATED) @@ -633,7 +633,7 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, *vaddr = tmpaddr; } else newmap->origbuffer = newmap->allocbuffer = NULL; - } else + } else newmap->origbuffer = newmap->allocbuffer = NULL; return (0); } @@ -844,7 +844,7 @@ bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs, if (seg >= 0 && curaddr == lastaddr && (segs[seg].ds_len + sgsize) <= dmat->maxsegsz && (dmat->boundary == 0 || - (segs[seg].ds_addr & bmask) == + (segs[seg].ds_addr & bmask) == (curaddr & bmask))) { segs[seg].ds_len += sgsize; goto segdone; @@ -941,7 +941,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m0, for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { error = bus_dmamap_load_buffer(dmat, - dm_segments, map, m->m_data, m->m_len, + dm_segments, map, m->m_data, m->m_len, pmap_kernel(), flags, &lastaddr, &nsegs); map->len += m->m_len; } @@ -951,7 +951,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m0, } if (error) { - /* + /* * force "no valid mappings" on error in callback. */ (*callback)(callback_arg, dm_segments, 0, 0, error); @@ -1057,7 +1057,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, struct uio *uio, } if (error) { - /* + /* * force "no valid mappings" on error in callback. */ (*callback)(callback_arg, dm_segments, 0, 0, error); @@ -1092,7 +1092,7 @@ bus_dmamap_sync_buf(void *buf, int len, bus_dmasync_op_t op) { char _tmp_cl[arm_dcache_align], _tmp_clend[arm_dcache_align]; register_t s; - int partial; + int partial; if ((op & BUS_DMASYNC_PREWRITE) && !(op & BUS_DMASYNC_PREREAD)) { cpu_dcache_wb_range((vm_offset_t)buf, len); @@ -1116,7 +1116,7 @@ bus_dmamap_sync_buf(void *buf, int len, bus_dmasync_op_t op) ~arm_dcache_align_mask), (vm_offset_t)buf & arm_dcache_align_mask); if (((vm_offset_t)buf + len) & arm_dcache_align_mask) - memcpy(_tmp_clend, + memcpy(_tmp_clend, (void *)((vm_offset_t)buf + len), arm_dcache_align - (((vm_offset_t)(buf) + len) & arm_dcache_align_mask)); @@ -1126,11 +1126,11 @@ bus_dmamap_sync_buf(void *buf, int len, bus_dmasync_op_t op) if (partial) { if ((vm_offset_t)buf & arm_dcache_align_mask) memcpy((void *)((vm_offset_t)buf & - ~arm_dcache_align_mask), _tmp_cl, + ~arm_dcache_align_mask), _tmp_cl, (vm_offset_t)buf & arm_dcache_align_mask); if (((vm_offset_t)buf + len) & arm_dcache_align_mask) - memcpy((void *)((vm_offset_t)buf + len), - _tmp_clend, arm_dcache_align - + memcpy((void *)((vm_offset_t)buf + len), + _tmp_clend, arm_dcache_align - (((vm_offset_t)(buf) + len) & arm_dcache_align_mask)); intr_restore(s); @@ -1146,7 +1146,7 @@ _bus_dmamap_sync_bp(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) STAILQ_FOREACH(bpage, &map->bpages, links) { if (op & BUS_DMASYNC_PREWRITE) { bcopy((void *)bpage->datavaddr, - (void *)(bpage->vaddr_nocache != 0 ? + (void *)(bpage->vaddr_nocache != 0 ? bpage->vaddr_nocache : bpage->vaddr), bpage->datacount); if (bpage->vaddr_nocache == 0) { @@ -1164,7 +1164,7 @@ _bus_dmamap_sync_bp(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) cpu_l2cache_inv_range(bpage->vaddr, bpage->datacount); } - bcopy((void *)(bpage->vaddr_nocache != 0 ? + bcopy((void *)(bpage->vaddr_nocache != 0 ? bpage->vaddr_nocache : bpage->vaddr), (void *)bpage->datavaddr, bpage->datacount); dmat->bounce_zone->total_bounced++; @@ -1179,7 +1179,7 @@ _bus_dma_buf_is_in_bp(bus_dmamap_t map, void *buf, int len) STAILQ_FOREACH(bpage, &map->bpages, links) { if ((vm_offset_t)buf >= bpage->datavaddr && - (vm_offset_t)buf + len <= bpage->datavaddr + + (vm_offset_t)buf + len <= bpage->datavaddr + bpage->datacount) return (1); } diff --git a/sys/arm/arm/cpufunc.c b/sys/arm/arm/cpufunc.c index 4b62e9846df..b29dfd9d227 100644 --- a/sys/arm/arm/cpufunc.c +++ b/sys/arm/arm/cpufunc.c @@ -222,7 +222,7 @@ struct cpu_functions arm8_cpufuncs = { arm8_context_switch, /* context_switch */ arm8_setup /* cpu setup */ -}; +}; #endif /* CPU_ARM8 */ #ifdef CPU_ARM9 @@ -328,7 +328,7 @@ struct cpu_functions armv5_ec_cpufuncs = { (void *)cpufunc_nullop, /* l2cache_wbinv_range */ (void *)cpufunc_nullop, /* l2cache_inv_range */ (void *)cpufunc_nullop, /* l2cache_wb_range */ - + /* Other functions */ cpufunc_nullop, /* flush_prefetchbuf */ @@ -530,7 +530,7 @@ struct cpu_functions sa110_cpufuncs = { sa110_context_switch, /* context_switch */ sa110_setup /* cpu setup */ -}; +}; #endif /* CPU_SA110 */ #if defined(CPU_SA1100) || defined(CPU_SA1110) @@ -591,7 +591,7 @@ struct cpu_functions sa11x0_cpufuncs = { sa11x0_context_switch, /* context_switch */ sa11x0_setup /* cpu setup */ -}; +}; #endif /* CPU_SA1100 || CPU_SA1110 */ #ifdef CPU_IXP12X0 @@ -652,7 +652,7 @@ struct cpu_functions ixp12x0_cpufuncs = { ixp12x0_context_switch, /* context_switch */ ixp12x0_setup /* cpu setup */ -}; +}; #endif /* CPU_IXP12X0 */ #if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ @@ -841,7 +841,7 @@ struct cpu_functions fa526_cpufuncs = { fa526_context_switch, /* context_switch */ fa526_setup /* cpu setup */ -}; +}; #endif /* CPU_FA526 || CPU_FA626TE */ @@ -1099,7 +1099,7 @@ set_cpufuncs() cpu_reset_needs_v4_MMU_disable = 1; /* V4 or higher */ get_cachetype_cp15(); arm10_dcache_sets_inc = 1U << arm_dcache_l2_linesize; - arm10_dcache_sets_max = + arm10_dcache_sets_max = (1U << (arm_dcache_l2_linesize + arm_dcache_l2_nsets)) - arm10_dcache_sets_inc; arm10_dcache_index_inc = 1U << (32 - arm_dcache_l2_assoc); @@ -1353,7 +1353,7 @@ early_abort_fixup(arg) int loop; int count; int *registers = &frame->tf_r0; - + DFC_PRINTF(("LDM/STM\n")); DFC_DISASSEMBLE(fault_pc); if (fault_instruction & (1 << 21)) { @@ -1533,7 +1533,7 @@ late_abort_fixup(arg) offset = fault_instruction & 0x0f; if (offset == base) return ABORT_FIXUP_FAILED; - + /* * Register offset - hard we have to * cope with shifts ! @@ -1647,8 +1647,8 @@ static u_int parse_cpu_options(char *, struct cpu_option *, u_int); static u_int parse_cpu_options(args, optlist, cpuctrl) char *args; - struct cpu_option *optlist; - u_int cpuctrl; + struct cpu_option *optlist; + u_int cpuctrl; { int integer; @@ -1811,7 +1811,7 @@ arm8_setup(args) ctrl = cpuctrl; cpu_control(0xffffffff, cpuctrl); - /* Set the clock/test register */ + /* Set the clock/test register */ if (setclock) arm8_clock_config(0x7f, clocktest); } @@ -1891,7 +1891,7 @@ arm10_setup(args) int cpuctrl, cpuctrlmask; cpuctrl = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_SYST_ENABLE - | CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE + | CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE | CPU_CONTROL_WBUF_ENABLE | CPU_CONTROL_BPRD_ENABLE; cpuctrlmask = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_SYST_ENABLE | CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE @@ -2031,7 +2031,7 @@ sa110_setup(args) /* cpu_control(cpuctrlmask, cpuctrl);*/ cpu_control(0xffffffff, cpuctrl); - /* + /* * enable clockswitching, note that this doesn't read or write to r0, * r0 is just to make it valid asm */ @@ -2089,7 +2089,7 @@ sa11x0_setup(args) cpuctrl |= CPU_CONTROL_VECRELOC; /* Clear out the cache */ cpu_idcache_wbinv_all(); - /* Set the control register */ + /* Set the control register */ ctrl = cpuctrl; cpu_control(0xffffffff, cpuctrl); } @@ -2198,7 +2198,7 @@ ixp12x0_setup(args) /* Clear out the cache */ cpu_idcache_wbinv_all(); - /* Set the control register */ + /* Set the control register */ ctrl = cpuctrl; /* cpu_control(0xffffffff, cpuctrl); */ cpu_control(cpuctrlmask, cpuctrl); @@ -2292,5 +2292,5 @@ xscale_setup(args) __asm __volatile("mcr p15, 0, %0, c1, c0, 1" : : "r" (auxctl)); } -#endif /* CPU_XSCALE_80200 || CPU_XSCALE_80321 || CPU_XSCALE_PXA2X0 || CPU_XSCALE_IXP425 +#endif /* CPU_XSCALE_80200 || CPU_XSCALE_80321 || CPU_XSCALE_PXA2X0 || CPU_XSCALE_IXP425 CPU_XSCALE_80219 */ diff --git a/sys/arm/arm/cpufunc_asm.S b/sys/arm/arm/cpufunc_asm.S index d9cc70d5495..99b40f4fc37 100644 --- a/sys/arm/arm/cpufunc_asm.S +++ b/sys/arm/arm/cpufunc_asm.S @@ -34,14 +34,14 @@ * * RiscBSD kernel project * - * cpufunc.S + * cpufunc.S * * Assembly functions for CPU / MMU / TLB specific operations * * Created : 30/01/97 * */ - + #include __FBSDID("$FreeBSD$"); @@ -86,13 +86,13 @@ ENTRY(cpufunc_faultaddress) * Generic functions to write the internal coprocessor registers * * - * Currently these registers are + * Currently these registers are * c1 - CPU Control * c3 - Domain Access Control * * All other registers are CPU architecture specific */ - + #if 0 /* See below. */ ENTRY(cpufunc_control) mcr p15, 0, r0, c1, c0, 0 @@ -107,12 +107,12 @@ ENTRY(cpufunc_domains) * Generic functions to read/modify/write the internal coprocessor registers * * - * Currently these registers are + * Currently these registers are * c1 - CPU Control * * All other registers are CPU architecture specific */ - + ENTRY(cpufunc_control) mrc p15, 0, r3, c1, c0, 0 /* Read the control register */ bic r2, r3, r0 /* Clear bits */ diff --git a/sys/arm/arm/cpufunc_asm_arm10.S b/sys/arm/arm/cpufunc_asm_arm10.S index d1d55ff254a..22da6aadc95 100644 --- a/sys/arm/arm/cpufunc_asm_arm10.S +++ b/sys/arm/arm/cpufunc_asm_arm10.S @@ -31,7 +31,7 @@ * ARM10 assembly functions for CPU / MMU / TLB specific operations * */ - + #include __FBSDID("$FreeBSD$"); @@ -255,7 +255,7 @@ ENTRY(arm10_context_switch) /* * Parameters for the cache cleaning code. Note that the order of these - * four variables is assumed in the code above. Hence the reason for + * four variables is assumed in the code above. Hence the reason for * declaring them in the assembler file. */ .align 0 diff --git a/sys/arm/arm/cpufunc_asm_arm11.S b/sys/arm/arm/cpufunc_asm_arm11.S index 1ea495767a7..81914db2a5e 100644 --- a/sys/arm/arm/cpufunc_asm_arm11.S +++ b/sys/arm/arm/cpufunc_asm_arm11.S @@ -33,7 +33,7 @@ * XXX We make no attempt at present to take advantage of the v6 memroy * architecture or physically tagged cache. */ - + #include __FBSDID("$FreeBSD$"); diff --git a/sys/arm/arm/cpufunc_asm_arm7tdmi.S b/sys/arm/arm/cpufunc_asm_arm7tdmi.S index d301efc1f7f..fed6f16f923 100644 --- a/sys/arm/arm/cpufunc_asm_arm7tdmi.S +++ b/sys/arm/arm/cpufunc_asm_arm7tdmi.S @@ -34,7 +34,7 @@ * ARM7TDMI assembly functions for CPU / MMU / TLB specific operations * */ - + #include __FBSDID("$FreeBSD$"); diff --git a/sys/arm/arm/cpufunc_asm_arm8.S b/sys/arm/arm/cpufunc_asm_arm8.S index febe8f0a545..9f23548ffdc 100644 --- a/sys/arm/arm/cpufunc_asm_arm8.S +++ b/sys/arm/arm/cpufunc_asm_arm8.S @@ -35,7 +35,7 @@ * ARM8 assembly functions for CPU / MMU / TLB specific operations * */ - + #include __FBSDID("$FreeBSD$"); diff --git a/sys/arm/arm/cpufunc_asm_arm9.S b/sys/arm/arm/cpufunc_asm_arm9.S index 0734b03ee68..291d3f7bdbf 100644 --- a/sys/arm/arm/cpufunc_asm_arm9.S +++ b/sys/arm/arm/cpufunc_asm_arm9.S @@ -30,7 +30,7 @@ * * ARM9 assembly functions for CPU / MMU / TLB specific operations */ - + #include __FBSDID("$FreeBSD$"); @@ -242,7 +242,7 @@ ENTRY(arm9_context_switch) /* * Parameters for the cache cleaning code. Note that the order of these - * four variables is assumed in the code above. Hence the reason for + * four variables is assumed in the code above. Hence the reason for * declaring them in the assembler file. */ .align 0 diff --git a/sys/arm/arm/cpufunc_asm_armv4.S b/sys/arm/arm/cpufunc_asm_armv4.S index ccdcce213c8..1b8797dc97f 100644 --- a/sys/arm/arm/cpufunc_asm_armv4.S +++ b/sys/arm/arm/cpufunc_asm_armv4.S @@ -36,7 +36,7 @@ * ARM9 assembly functions for CPU / MMU / TLB specific operations * */ - + #include __FBSDID("$FreeBSD$"); diff --git a/sys/arm/arm/cpufunc_asm_armv5.S b/sys/arm/arm/cpufunc_asm_armv5.S index 53e38e0516c..2faa5f48f93 100644 --- a/sys/arm/arm/cpufunc_asm_armv5.S +++ b/sys/arm/arm/cpufunc_asm_armv5.S @@ -32,7 +32,7 @@ * These routines can be used by any core that supports the set/index * operations. */ - + #include __FBSDID("$FreeBSD$"); @@ -224,7 +224,7 @@ ENTRY(armv5_dcache_wbinv_all) /* * Parameters for the cache cleaning code. Note that the order of these - * four variables is assumed in the code above. Hence the reason for + * four variables is assumed in the code above. Hence the reason for * declaring them in the assembler file. */ .align 0 diff --git a/sys/arm/arm/cpufunc_asm_sa1.S b/sys/arm/arm/cpufunc_asm_sa1.S index 7279e65077e..0bdd6e7a768 100644 --- a/sys/arm/arm/cpufunc_asm_sa1.S +++ b/sys/arm/arm/cpufunc_asm_sa1.S @@ -35,7 +35,7 @@ * SA-1 assembly functions for CPU / MMU / TLB specific operations * */ - + #include __FBSDID("$FreeBSD$"); @@ -58,7 +58,7 @@ ENTRY(sa1_setttb) #else ldr r3, .Lblock_userspace_access ldr r2, [r3] - orr r1, r2, #1 + orr r1, r2, #1 str r1, [r3] #endif stmfd sp!, {r0-r3, lr} @@ -67,7 +67,7 @@ ENTRY(sa1_setttb) mcr p15, 0, r0, c7, c5, 0 /* invalidate I$ and BTB */ mcr p15, 0, r0, c7, c10, 4 /* drain write and fill buffer */ - /* Write the TTB */ + /* Write the TTB */ mcr p15, 0, r0, c2, c0, 0 /* If we have updated the TTB we must flush the TLB */ diff --git a/sys/arm/arm/cpufunc_asm_xscale.S b/sys/arm/arm/cpufunc_asm_xscale.S index b4700e4a481..3601b9a3059 100644 --- a/sys/arm/arm/cpufunc_asm_xscale.S +++ b/sys/arm/arm/cpufunc_asm_xscale.S @@ -71,7 +71,7 @@ * * XScale assembly functions for CPU / MMU / TLB specific operations */ - + #include __FBSDID("$FreeBSD$"); @@ -138,7 +138,7 @@ ENTRY(xscale_setttb) #else ldr r3, .Lblock_userspace_access ldr r2, [r3] - orr r1, r2, #1 + orr r1, r2, #1 str r1, [r3] #endif stmfd sp!, {r0-r3, lr} @@ -150,7 +150,7 @@ ENTRY(xscale_setttb) ldmfd sp!, {r0-r3, lr} - /* Write the TTB */ + /* Write the TTB */ mcr p15, 0, r0, c2, c0, 0 /* If we have updated the TTB we must flush the TLB */ diff --git a/sys/arm/arm/cpufunc_asm_xscale_c3.S b/sys/arm/arm/cpufunc_asm_xscale_c3.S index 8975fb5c06c..9a003d0e4aa 100644 --- a/sys/arm/arm/cpufunc_asm_xscale_c3.S +++ b/sys/arm/arm/cpufunc_asm_xscale_c3.S @@ -72,7 +72,7 @@ * * XScale core 3 assembly functions for CPU / MMU / TLB specific operations */ - + #include __FBSDID("$FreeBSD$"); @@ -339,7 +339,7 @@ ENTRY(xscalec3_setttb) #else ldr r3, .Lblock_userspace_access ldr r2, [r3] - orr r1, r2, #1 + orr r1, r2, #1 str r1, [r3] #endif stmfd sp!, {r0-r3, lr} @@ -354,7 +354,7 @@ ENTRY(xscalec3_setttb) #ifdef ARM_USE_L2_CACHE orr r0, r0, #0x18 /* cache the page table in L2 */ #endif - /* Write the TTB */ + /* Write the TTB */ mcr p15, 0, r0, c2, c0, 0 /* If we have updated the TTB we must flush the TLB */ diff --git a/sys/arm/arm/db_disasm.c b/sys/arm/arm/db_disasm.c index 52ff7d70023..d7581fd9c00 100644 --- a/sys/arm/arm/db_disasm.c +++ b/sys/arm/arm/db_disasm.c @@ -50,7 +50,7 @@ static u_int db_disasm_read_word(u_int); static void db_disasm_printaddr(u_int); static const disasm_interface_t db_disasm_interface = { - db_disasm_read_word, + db_disasm_read_word, db_disasm_printaddr, db_printf }; diff --git a/sys/arm/arm/db_interface.c b/sys/arm/arm/db_interface.c index 5ec9110282e..69066508767 100644 --- a/sys/arm/arm/db_interface.c +++ b/sys/arm/arm/db_interface.c @@ -6,24 +6,24 @@ * Mach Operating System * Copyright (c) 1991,1990 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * @@ -325,7 +325,7 @@ branch_taken(u_int insn, db_addr_t pc) break; default: break; /* XXX */ - } + } } return (addr + offset); diff --git a/sys/arm/arm/db_trace.c b/sys/arm/arm/db_trace.c index a83f49d5d58..d6e1c3a0f4b 100644 --- a/sys/arm/arm/db_trace.c +++ b/sys/arm/arm/db_trace.c @@ -7,24 +7,24 @@ * Mach Operating System * Copyright (c) 1991,1990 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. */ @@ -55,7 +55,7 @@ __FBSDID("$FreeBSD$"); * a structure to represent them is a good idea. * * Here's the diagram from the APCS. Increasing address is _up_ the page. - * + * * save code pointer [fp] <- fp points to here * return link value [fp, #-4] * return sp value [fp, #-8] @@ -72,21 +72,20 @@ __FBSDID("$FreeBSD$"); * [saved a2 value] * [saved a1 value] * - * The save code pointer points twelve bytes beyond the start of the - * code sequence (usually a single STM) that created the stack frame. - * We have to disassemble it if we want to know which of the optional + * The save code pointer points twelve bytes beyond the start of the + * code sequence (usually a single STM) that created the stack frame. + * We have to disassemble it if we want to know which of the optional * fields are actually present. */ static void -db_stack_trace_cmd(db_expr_t addr, db_expr_t count) +db_stack_trace_cmd(db_expr_t addr, db_expr_t count, boolean_t kernel_only) { u_int32_t *frame, *lastframe; c_db_sym_t sym; const char *name; db_expr_t value; db_expr_t offset; - boolean_t kernel_only = TRUE; int scp_offset; frame = (u_int32_t *)addr; @@ -196,8 +195,11 @@ db_trace_thread(struct thread *thr, int count) { struct pcb *ctx; - ctx = kdb_thr_ctx(thr); - db_stack_trace_cmd(ctx->un_32.pcb32_r11, -1); + if (thr != curthread) { + ctx = kdb_thr_ctx(thr); + db_stack_trace_cmd(ctx->un_32.pcb32_r11, -1, TRUE); + } else + db_trace_self(); return (0); } @@ -207,5 +209,5 @@ db_trace_self(void) db_addr_t addr; addr = (db_addr_t)__builtin_frame_address(0); - db_stack_trace_cmd(addr, -1); + db_stack_trace_cmd(addr, -1, FALSE); } diff --git a/sys/arm/arm/disassem.c b/sys/arm/arm/disassem.c index 9aa63d886eb..f05fb3fbdfc 100644 --- a/sys/arm/arm/disassem.c +++ b/sys/arm/arm/disassem.c @@ -131,9 +131,9 @@ static const struct arm32_insn arm32_i[] = { { 0x0c500000, 0x04400000, "strb", "daW" }, { 0x0c500000, 0x04500000, "ldrb", "daW" }, { 0x0e1f0000, 0x080d0000, "stm", "YnWl" },/* separate out r13 base */ - { 0x0e1f0000, 0x081d0000, "ldm", "YnWl" },/* separate out r13 base */ + { 0x0e1f0000, 0x081d0000, "ldm", "YnWl" },/* separate out r13 base */ { 0x0e100000, 0x08000000, "stm", "XnWl" }, - { 0x0e100000, 0x08100000, "ldm", "XnWl" }, + { 0x0e100000, 0x08100000, "ldm", "XnWl" }, { 0x0e1000f0, 0x00100090, "ldrb", "de" }, { 0x0e1000f0, 0x00000090, "strb", "de" }, { 0x0e1000f0, 0x001000d0, "ldrsb", "de" }, @@ -329,7 +329,7 @@ disasm(const disasm_interface_t *di, vm_offset_t loc, int altfmt) di->di_printf("#0x%08x", (insn & 0xff) << (32 - rotate) | (insn & 0xff) >> rotate); - } else { + } else { disasm_register_shift(di, insn); } break; diff --git a/sys/arm/arm/dump_machdep.c b/sys/arm/arm/dump_machdep.c index cbff96b996e..e8ba5768f9a 100644 --- a/sys/arm/arm/dump_machdep.c +++ b/sys/arm/arm/dump_machdep.c @@ -197,7 +197,7 @@ cb_dumpdata(struct md_pa *mdp, int seqnr, void *arg) #ifdef SW_WATCHDOG wdog_kern_pat(WD_LASTVAL); #endif - error = dump_write(di, + error = dump_write(di, (void *)(pa - (pa & L1_ADDR_BITS)),0, dumplo, sz); if (error) break; diff --git a/sys/arm/arm/elf_trampoline.c b/sys/arm/arm/elf_trampoline.c index 403c012e49b..121bd56bdb7 100644 --- a/sys/arm/arm/elf_trampoline.c +++ b/sys/arm/arm/elf_trampoline.c @@ -202,7 +202,7 @@ _startC(void) "orr %0, %0, %1\n" "mrc p15, 0, %1, c1, c0, 0\n" "bic %1, %1, #1\n" /* Disable MMU */ - "orr %1, %1, #(4 | 8)\n" /* Add DC enable, + "orr %1, %1, #(4 | 8)\n" /* Add DC enable, WBUF enable */ "orr %1, %1, #0x1000\n" /* Add IC enable */ "orr %1, %1, #(0x800)\n" /* BPRD enable */ @@ -397,7 +397,7 @@ inflate_kernel(void *kernel, void *startaddr) #endif void * -load_kernel(unsigned int kstart, unsigned int curaddr,unsigned int func_end, +load_kernel(unsigned int kstart, unsigned int curaddr,unsigned int func_end, int d) { Elf32_Ehdr *eh; @@ -436,7 +436,7 @@ load_kernel(unsigned int kstart, unsigned int curaddr,unsigned int func_end, if (phdr[j].p_type == PT_LOAD && shdr[i].sh_offset >= phdr[j].p_offset && - (shdr[i].sh_offset + + (shdr[i].sh_offset + shdr[i].sh_size <= phdr[j].p_offset + phdr[j].p_filesz)) { @@ -445,7 +445,7 @@ load_kernel(unsigned int kstart, unsigned int curaddr,unsigned int func_end, j = eh->e_phnum; } } - if (shdr[i].sh_offset != 0 && + if (shdr[i].sh_offset != 0 && shdr[i].sh_size != 0) { symtabindex = i; symstrindex = shdr[i].sh_link; @@ -457,7 +457,7 @@ load_kernel(unsigned int kstart, unsigned int curaddr,unsigned int func_end, ssym = lastaddr; if (d) { memcpy((void *)func_end, (void *)( - shdr[symtabindex].sh_offset + kstart), + shdr[symtabindex].sh_offset + kstart), shdr[symtabindex].sh_size); memcpy((void *)(func_end + shdr[symtabindex].sh_size), @@ -469,7 +469,7 @@ load_kernel(unsigned int kstart, unsigned int curaddr,unsigned int func_end, sizeof(shdr[symtabindex].sh_size)); lastaddr += sizeof(shdr[symstrindex].sh_size); lastaddr += shdr[symstrindex].sh_size; - lastaddr = roundup(lastaddr, + lastaddr = roundup(lastaddr, sizeof(shdr[symstrindex].sh_size)); } @@ -488,13 +488,13 @@ load_kernel(unsigned int kstart, unsigned int curaddr,unsigned int func_end, (void*)(kstart + phdr[i].p_offset), phdr[i].p_filesz); /* Clean space from oversized segments, eg: bss. */ if (phdr[i].p_filesz < phdr[i].p_memsz) - bzero((void *)(phdr[i].p_vaddr - KERNVIRTADDR + + bzero((void *)(phdr[i].p_vaddr - KERNVIRTADDR + curaddr + phdr[i].p_filesz), phdr[i].p_memsz - phdr[i].p_filesz); } /* Now grab the symbol tables. */ if (symtabindex >= 0 && symstrindex >= 0) { - *(Elf_Size *)lastaddr = + *(Elf_Size *)lastaddr = shdr[symtabindex].sh_size; lastaddr += sizeof(shdr[symtabindex].sh_size); memcpy((void*)lastaddr, @@ -511,7 +511,7 @@ load_kernel(unsigned int kstart, unsigned int curaddr,unsigned int func_end, shdr[symtabindex].sh_size), shdr[symstrindex].sh_size); lastaddr += shdr[symstrindex].sh_size; - lastaddr = roundup(lastaddr, + lastaddr = roundup(lastaddr, sizeof(shdr[symstrindex].sh_size)); *(Elf_Addr *)curaddr = MAGIC_TRAMP_NUMBER; *((Elf_Addr *)curaddr + 1) = ssym - curaddr + KERNVIRTADDR; @@ -572,10 +572,10 @@ setup_pagetables(unsigned int pt_addr, vm_paddr_t physstart, vm_paddr_t physend, "sub pc, pc, #4\n" : "=r" (tmp) : "r" (pd), "r" (domain)); - /* + /* * XXX: This is the most stupid workaround I've ever wrote. * For some reason, the KB9202 won't boot the kernel unless - * we access an address which is not in the + * we access an address which is not in the * 0x20000000 - 0x20ffffff range. I hope I'll understand * what's going on later. */ @@ -596,7 +596,7 @@ __start(void) curaddr = (void*)((unsigned int)curaddr & 0xfff00000); #ifdef KZIP if (*kernel == 0x1f && kernel[1] == 0x8b) { - pt_addr = (((int)&_end + KERNSIZE + 0x100) & + pt_addr = (((int)&_end + KERNSIZE + 0x100) & ~(L1_TABLE_SIZE - 1)) + L1_TABLE_SIZE; #ifdef CPU_ARM9 @@ -609,7 +609,7 @@ __start(void) /* Gzipped kernel */ dst = inflate_kernel(kernel, &_end); kernel = (char *)&_end; - altdst = 4 + load_kernel((unsigned int)kernel, + altdst = 4 + load_kernel((unsigned int)kernel, (unsigned int)curaddr, (unsigned int)&func_end + 800 , 0); if (altdst > dst) @@ -627,8 +627,8 @@ __start(void) :"=r" (pt_addr)); } else #endif - dst = 4 + load_kernel((unsigned int)&kernel_start, - (unsigned int)curaddr, + dst = 4 + load_kernel((unsigned int)&kernel_start, + (unsigned int)curaddr, (unsigned int)&func_end, 0); dst = (void *)(((vm_offset_t)dst & ~3)); pt_addr = ((unsigned int)dst &~(L1_TABLE_SIZE - 1)) + L1_TABLE_SIZE; @@ -637,8 +637,8 @@ __start(void) sp = pt_addr + L1_TABLE_SIZE + 8192; sp = sp &~3; dst = (void *)(sp + 4); - memcpy((void *)dst, (void *)&load_kernel, (unsigned int)&func_end - + memcpy((void *)dst, (void *)&load_kernel, (unsigned int)&func_end - (unsigned int)&load_kernel + 800); - do_call(dst, kernel, dst + (unsigned int)(&func_end) - + do_call(dst, kernel, dst + (unsigned int)(&func_end) - (unsigned int)(&load_kernel) + 800, sp); } diff --git a/sys/arm/arm/exception.S b/sys/arm/arm/exception.S index 30df0b19e55..23c6dca84bc 100644 --- a/sys/arm/arm/exception.S +++ b/sys/arm/arm/exception.S @@ -189,7 +189,7 @@ Laddress_exception_msg: * This function uses PULLFRAMEFROMSVCANDEXIT and * DO_AST * only be called if the exception handler used PUSHFRAMEINSVC - * + * */ exception_exit: diff --git a/sys/arm/arm/gdb_machdep.c b/sys/arm/arm/gdb_machdep.c index eefb046ef90..11b9c0d2d91 100644 --- a/sys/arm/arm/gdb_machdep.c +++ b/sys/arm/arm/gdb_machdep.c @@ -54,8 +54,12 @@ gdb_cpu_getreg(int regnum, size_t *regsz) *regsz = gdb_cpu_regsz(regnum); if (kdb_thread == curthread) { - if (regnum < 15) + if (regnum < 13) return (&kdb_frame->tf_r0 + regnum); + if (regnum == 13) + return (&kdb_frame->tf_svc_sp); + if (regnum == 14) + return (&kdb_frame->tf_svc_lr); if (regnum == 15) return (&kdb_frame->tf_pc); if (regnum == 25) @@ -70,8 +74,8 @@ gdb_cpu_getreg(int regnum, size_t *regsz) case 12: return (&kdb_thrctx->un_32.pcb32_r12); case 13: stacktest = kdb_thrctx->un_32.pcb32_sp + 5 * 4; return (&stacktest); - case 15: - /* + case 15: + /* * On context switch, the PC is not put in the PCB, but * we can retrieve it from the stack. */ diff --git a/sys/arm/arm/identcpu.c b/sys/arm/arm/identcpu.c index 322fc898b4e..f996f1ad605 100644 --- a/sys/arm/arm/identcpu.c +++ b/sys/arm/arm/identcpu.c @@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -59,7 +60,7 @@ __FBSDID("$FreeBSD$"); char machine[] = "arm"; SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD, - machine, 0, "Machine class"); + machine, 0, "Machine class"); static const char * const generic_steppings[16] = { "rev 0", "rev 1", "rev 2", "rev 3", @@ -135,7 +136,7 @@ static const char * const pxa2x0_steppings[16] = { }; /* Steppings for PXA255/26x. - * rev 5: PXA26x B0, rev 6: PXA255 A0 + * rev 5: PXA26x B0, rev 6: PXA255 A0 */ static const char * const pxa255_steppings[16] = { "rev 0", "rev 1", "rev 2", "step A-0", @@ -455,7 +456,7 @@ identify_arm_cpu(void) printf(" %dKB/%dB %d-way %s Data cache\n", arm_pdcache_size / 1024, arm_pdcache_line_size, arm_pdcache_ways, - wtnames[arm_pcache_type]); + wtnames[arm_pcache_type]); } } diff --git a/sys/arm/arm/in_cksum.c b/sys/arm/arm/in_cksum.c index 4222bc893c3..3bce6501839 100644 --- a/sys/arm/arm/in_cksum.c +++ b/sys/arm/arm/in_cksum.c @@ -149,4 +149,4 @@ u_int in_cksum_hdr(const struct ip *ip) union l_util l_util; REDUCE16; return (~sum & 0xffff); -} +} diff --git a/sys/arm/arm/intr.c b/sys/arm/arm/intr.c index 18160648967..e79e44c70aa 100644 --- a/sys/arm/arm/intr.c +++ b/sys/arm/arm/intr.c @@ -40,7 +40,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include #include @@ -62,7 +62,7 @@ void arm_handler_execute(struct trapframe *, int); void (*arm_post_filter)(void *) = NULL; void -arm_setup_irqhandler(const char *name, driver_filter_t *filt, +arm_setup_irqhandler(const char *name, driver_filter_t *filt, void (*hand)(void*), void *arg, int irq, int flags, void **cookiep) { struct intr_event *event; @@ -78,7 +78,7 @@ arm_setup_irqhandler(const char *name, driver_filter_t *filt, if (error) return; intr_events[irq] = event; - last_printed += + last_printed += snprintf(intrnames + last_printed, MAXCOMLEN + 1, "irq%d: %s", irq, name); diff --git a/sys/arm/arm/irq_dispatch.S b/sys/arm/arm/irq_dispatch.S index 3995731d84c..6e510dd33d7 100644 --- a/sys/arm/arm/irq_dispatch.S +++ b/sys/arm/arm/irq_dispatch.S @@ -103,7 +103,7 @@ ASENTRY_NP(irq_entry) .global _C_LABEL(intrnames), _C_LABEL(sintrnames) .global _C_LABEL(intrcnt), _C_LABEL(sintrcnt) -_C_LABEL(intrnames): +_C_LABEL(intrnames): .space NIRQ * (MAXCOMLEN + 1) _C_LABEL(intrcnt): .space NIRQ * 4 diff --git a/sys/arm/arm/locore.S b/sys/arm/arm/locore.S index 3a19733e50b..b6e049e5726 100644 --- a/sys/arm/arm/locore.S +++ b/sys/arm/arm/locore.S @@ -37,17 +37,12 @@ #include #include #include + __FBSDID("$FreeBSD$"); /* What size should this really be ? It is only used by initarm() */ #define INIT_ARM_STACK_SIZE 2048 -/* - * This is for kvm_mkdb, and should be the address of the beginning - * of the kernel text segment (not necessarily the same as kernbase). - */ - - #define CPWAIT_BRANCH \ sub pc, pc, #4 @@ -56,6 +51,10 @@ __FBSDID("$FreeBSD$"); mov tmp, tmp /* wait for it to complete */ ;\ CPWAIT_BRANCH /* branch to next insn */ +/* + * This is for kvm_mkdb, and should be the address of the beginning + * of the kernel text segment (not necessarily the same as kernbase). + */ .text .align 0 .globl kernbase @@ -63,22 +62,25 @@ __FBSDID("$FreeBSD$"); .globl physaddr .set physaddr,PHYSADDR -ENTRY_NP(btext) - /* - * On entry: - * r0 - metadata pointer or 0 + * On entry for FreeBSD boot ABI: + * r0 - metadata pointer or 0 (boothowto on AT91's boot2) * r1 - if (r0 == 0) then metadata pointer + * On entry for Linux boot ABI: + * r0 - 0 + * r1 - machine type (passed as arg2 to initarm) + * r2 - Pointer to a tagged list or dtb image (phys addr) (passed as arg1 initarm) + * + * For both types of boot we gather up the args, put them in a struct arm_boot_params + * structure and pass that to initarm. */ +ENTRY_NP(btext) ASENTRY_NP(_start) + mov r9, r0 /* 0 or boot mode from boot2 */ + mov r8, r1 /* Save Machine type */ + mov ip, r2 /* Save meta data */ + mov fp, r3 /* Future expantion */ - /* Move metadata ptr to r12 (ip) */ - mov ip, r0 - ldr r0, =0 - cmp ip, r0 - bne 1f - mov ip, r1 -1: /* Make sure interrupts are disabled. */ mrs r7, cpsr orr r7, r7, #(I32_bit|F32_bit) @@ -93,25 +95,25 @@ ASENTRY_NP(_start) */ mrc p15, 0, r2, c1, c0, 0 ands r2, r2, #CPU_CONTROL_MMU_ENABLE - ldreq r8, =PHYSADDR - ldrne r8, =LOADERRAMADDR - cmp r7, r8 + ldreq r6, =PHYSADDR + ldrne r6, =LOADERRAMADDR + cmp r7, r6 bls flash_lower cmp r7, pc bhi from_ram b do_copy flash_lower: - cmp r8, pc + cmp r6, pc bls from_ram do_copy: - ldr r9, =KERNBASE + ldr r7, =KERNBASE adr r1, _start ldr r0, Lreal_start ldr r2, Lend sub r2, r2, r0 - sub r0, r0, r9 - add r0, r0, r8 + sub r0, r0, r7 + add r0, r0, r6 mov r4, r0 bl memcpy ldr r0, Lram_offset @@ -188,8 +190,14 @@ mmu_done: ldr pc, .Lvirt_done virt_done: - mov r0, ip /* Load argument: metadata ptr */ - + mov r1, #20 /* loader info size is 20 bytes also second arg */ + subs sp, sp, r1 /* allocate arm_boot_params struct on stack */ + mov r0, sp /* loader info pointer is first arg */ + str r1, [r0] /* Store length of loader info */ + str r9, [r0, #4] /* Store r0 from boot loader */ + str r8, [r0, #8] /* Store r1 from boot loader */ + str ip, [r0, #12] /* store r2 from boot loader */ + str fp, [r0, #16] /* store r3 from boot loader */ mov fp, #0 /* trace back starts here */ bl _C_LABEL(initarm) /* Off we go */ @@ -231,11 +239,6 @@ mmu_init_table: .word _end .word svcstk + INIT_ARM_STACK_SIZE -#if defined(FLASHADDR) && defined(LOADERRAMADDR) -.L_arm_memcpy: - .word _C_LABEL(_arm_memcpy) -#endif - .Lvirt_done: .word virt_done .Lmainreturned: diff --git a/sys/arm/arm/machdep.c b/sys/arm/arm/machdep.c index abd04a7f657..07f892afd36 100644 --- a/sys/arm/arm/machdep.c +++ b/sys/arm/arm/machdep.c @@ -80,6 +80,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -92,6 +93,8 @@ __FBSDID("$FreeBSD$"); #include #include +static struct trapframe proc0_tf; + uint32_t cpu_reset_address = 0; int cold = 1; vm_offset_t vector_page; @@ -108,6 +111,20 @@ extern int *end; extern vm_offset_t ksym_start, ksym_end; #endif +#if defined(LINUX_BOOT_ABI) +#define LBABI_MAX_BANKS 10 + +uint32_t board_id; +struct arm_lbabi_tag *atag_list; +uint32_t revision; +uint64_t serial; +char linux_command_line[LBABI_MAX_COMMAND_LINE + 1]; +char atags[LBABI_MAX_COMMAND_LINE * 2]; +uint32_t memstart[LBABI_MAX_BANKS]; +uint32_t memsize[LBABI_MAX_BANKS]; +uint32_t membanks; +#endif + void sendsig(catcher, ksi, mask) sig_t catcher; @@ -139,14 +156,14 @@ sendsig(catcher, ksi, mask) /* Allocate and validate space for the signal handler context. */ if ((td->td_pflags & TDP_ALTSTACK) != 0 && !(onstack) && SIGISMEMBER(psp->ps_sigonstack, sig)) { - fp = (struct sigframe *)(td->td_sigstk.ss_sp + + fp = (struct sigframe *)(td->td_sigstk.ss_sp + td->td_sigstk.ss_size); #if defined(COMPAT_43) td->td_sigstk.ss_flags |= SS_ONSTACK; #endif } else fp = (struct sigframe *)td->td_frame->tf_usr_sp; - + /* make room on the stack */ fp--; @@ -156,7 +173,7 @@ sendsig(catcher, ksi, mask) get_mcontext(td, &frame.sf_uc.uc_mcontext, 0); frame.sf_si = ksi->ksi_info; frame.sf_uc.uc_sigmask = *mask; - frame.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK ) + frame.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK ) ? ((onstack) ? SS_ONSTACK : 0) : SS_DISABLE; frame.sf_uc.uc_stack = td->td_sigstk; mtx_unlock(&psp->ps_mtx); @@ -449,7 +466,7 @@ ptrace_single_step(struct thread *td) ("Didn't clear single step")); p = td->td_proc; PROC_UNLOCK(p); - error = ptrace_read_int(td, td->td_frame->tf_pc + 4, + error = ptrace_read_int(td, td->td_frame->tf_pc + 4, &td->td_md.md_ptrace_instr); if (error) goto out; @@ -660,11 +677,52 @@ makectx(struct trapframe *tf, struct pcb *pcb) pcb->un_32.pcb32_sp = tf->tf_usr_sp; } +/* + * Make a standard dump_avail array. Can't make the phys_avail + * since we need to do that after we call pmap_bootstrap, but this + * is needed before pmap_boostrap. + * + * ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before + * calling pmap_bootstrap. + */ +void +arm_dump_avail_init(vm_offset_t ramsize, size_t max) +{ +#ifdef LINUX_BOOT_ABI + /* + * Linux boot loader passes us the actual banks of memory, so use them + * to construct the dump_avail array. + */ + if (membanks > 0) + { + int i, j; + + if (max < (membanks + 1) * 2) + panic("dump_avail[%d] too small for %d banks\n", + max, membanks); + for (j = 0, i = 0; i < membanks; i++) { + dump_avail[j++] = round_page(memstart[i]); + dump_avail[j++] = trunc_page(memstart[i] + memsize[i]); + } + dump_avail[j++] = 0; + dump_avail[j++] = 0; + return; + } +#endif + if (max < 4) + panic("dump_avail too small\n"); + + dump_avail[0] = round_page(PHYSADDR); + dump_avail[1] = trunc_page(PHYSADDR + ramsize); + dump_avail[2] = 0; + dump_avail[3] = 0; +} + /* * Fake up a boot descriptor table */ vm_offset_t -fake_preload_metadata(void) +fake_preload_metadata(struct arm_boot_params *abp __unused) { #ifdef DDB vm_offset_t zstart = 0, zend = 0; @@ -674,9 +732,9 @@ fake_preload_metadata(void) static uint32_t fake_preload[35]; fake_preload[i++] = MODINFO_NAME; - fake_preload[i++] = strlen("elf kernel") + 1; - strcpy((char*)&fake_preload[i++], "elf kernel"); - i += 2; + fake_preload[i++] = strlen("kernel") + 1; + strcpy((char*)&fake_preload[i++], "kernel"); + i += 1; fake_preload[i++] = MODINFO_TYPE; fake_preload[i++] = strlen("elf kernel") + 1; strcpy((char*)&fake_preload[i++], "elf kernel"); @@ -709,3 +767,151 @@ fake_preload_metadata(void) return (lastaddr); } + +#if defined(LINUX_BOOT_ABI) +vm_offset_t +linux_parse_boot_param(struct arm_boot_params *abp) +{ + struct arm_lbabi_tag *walker; + + /* + * Linux boot ABI: r0 = 0, r1 is the board type (!= 0) and r2 + * is atags or dtb pointer. If all of these aren't satisfied, + * then punt. + */ + if (!(abp->abp_r0 == 0 && abp->abp_r1 != 0 && abp->abp_r2 != 0)) + return 0; + + board_id = abp->abp_r1; + walker = (struct arm_lbabi_tag *) + (abp->abp_r2 + KERNVIRTADDR - KERNPHYSADDR); + + /* xxx - Need to also look for binary device tree */ + if (ATAG_TAG(walker) != ATAG_CORE) + return 0; + + atag_list = walker; + while (ATAG_TAG(walker) != ATAG_NONE) { + switch (ATAG_TAG(walker)) { + case ATAG_CORE: + break; + case ATAG_MEM: + if (membanks < LBABI_MAX_BANKS) { + memstart[membanks] = walker->u.tag_mem.start; + memsize[membanks] = walker->u.tag_mem.size; + } + membanks++; + break; + case ATAG_INITRD2: + break; + case ATAG_SERIAL: + serial = walker->u.tag_sn.low | + ((uint64_t)walker->u.tag_sn.high << 32); + break; + case ATAG_REVISION: + revision = walker->u.tag_rev.rev; + break; + case ATAG_CMDLINE: + /* XXX open question: Parse this for boothowto? */ + bcopy(walker->u.tag_cmd.command, linux_command_line, + ATAG_SIZE(walker)); + break; + default: + break; + } + walker = ATAG_NEXT(walker); + } + + /* Save a copy for later */ + bcopy(atag_list, atags, + (char *)walker - (char *)atag_list + ATAG_SIZE(walker)); + + return fake_preload_metadata(abp); +} +#endif + +#if defined(FREEBSD_BOOT_LOADER) +vm_offset_t +freebsd_parse_boot_param(struct arm_boot_params *abp) +{ + vm_offset_t lastaddr = 0; + void *mdp; + void *kmdp; + + /* + * Mask metadata pointer: it is supposed to be on page boundary. If + * the first argument (mdp) doesn't point to a valid address the + * bootloader must have passed us something else than the metadata + * ptr, so we give up. Also give up if we cannot find metadta section + * the loader creates that we get all this data out of. + */ + + if ((mdp = (void *)(abp->abp_r0 & ~PAGE_MASK)) == NULL) + return 0; + preload_metadata = mdp; + kmdp = preload_search_by_type("elf kernel"); + if (kmdp == NULL) + return 0; + + boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int); + kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *); + lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t); +#ifdef DDB + ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t); + ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t); +#endif + preload_addr_relocate = KERNVIRTADDR - KERNPHYSADDR; + return lastaddr; +} +#endif + +vm_offset_t +default_parse_boot_param(struct arm_boot_params *abp) +{ + vm_offset_t lastaddr; + +#if defined(LINUX_BOOT_ABI) + if ((lastaddr = linux_parse_boot_param(abp)) != 0) + return lastaddr; +#endif +#if defined(FREEBSD_BOOT_LOADER) + if ((lastaddr = freebsd_parse_boot_param(abp)) != 0) + return lastaddr; +#endif + /* Fall back to hardcoded metadata. */ + lastaddr = fake_preload_metadata(abp); + + return lastaddr; +} + +/* + * Stub version of the boot parameter parsing routine. We are + * called early in initarm, before even VM has been initialized. + * This routine needs to preserve any data that the boot loader + * has passed in before the kernel starts to grow past the end + * of the BSS, traditionally the place boot-loaders put this data. + * + * Since this is called so early, things that depend on the vm system + * being setup (including access to some SoC's serial ports), about + * all that can be done in this routine is to copy the arguments. + * + * This is the default boot parameter parsing routine. Individual + * kernels/boards can override this weak function with one of their + * own. We just fake metadata... + */ +__weak_reference(default_parse_boot_param, parse_boot_param); + +/* + * Initialize proc0 + */ +void +init_proc0(vm_offset_t kstack) +{ + proc_linkup0(&proc0, &thread0); + thread0.td_kstack = kstack; + thread0.td_pcb = (struct pcb *) + (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; + thread0.td_pcb->pcb_flags = 0; + thread0.td_frame = &proc0_tf; + pcpup->pc_curpcb = thread0.td_pcb; +} diff --git a/sys/arm/arm/mem.c b/sys/arm/arm/mem.c index 2a710d49629..e2e8588903f 100644 --- a/sys/arm/arm/mem.c +++ b/sys/arm/arm/mem.c @@ -101,7 +101,7 @@ memrw(struct cdev *dev, struct uio *uio, int flags) v &= ~PAGE_MASK; for (i = 0; dump_avail[i] || dump_avail[i + 1]; i += 2) { - if (v >= dump_avail[i] && + if (v >= dump_avail[i] && v < dump_avail[i + 1]) { address_valid = 1; break; @@ -129,11 +129,11 @@ memrw(struct cdev *dev, struct uio *uio, int flags) addr = trunc_page(uio->uio_offset); eaddr = round_page(uio->uio_offset + c); - for (; addr < eaddr; addr += PAGE_SIZE) + for (; addr < eaddr; addr += PAGE_SIZE) if (pmap_extract(kernel_pmap, addr) == 0) return (EFAULT); if (!kernacc((caddr_t)(int)uio->uio_offset, c, - uio->uio_rw == UIO_READ ? + uio->uio_rw == UIO_READ ? VM_PROT_READ : VM_PROT_WRITE)) #ifdef ARM_USE_SMALL_ALLOC if (addr <= VM_MAXUSER_ADDRESS || diff --git a/sys/arm/arm/nexus.c b/sys/arm/arm/nexus.c index bbde900734c..04cf1bfa8f6 100644 --- a/sys/arm/arm/nexus.c +++ b/sys/arm/arm/nexus.c @@ -121,7 +121,7 @@ nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags, if ((rman_get_flags(res) & RF_SHAREABLE) == 0) flags |= INTR_EXCL; - arm_setup_irqhandler(device_get_nameunit(child), + arm_setup_irqhandler(device_get_nameunit(child), filt, intr, arg, rman_get_start(res), flags, cookiep); return (0); } @@ -160,7 +160,7 @@ nexus_print_child(device_t bus, device_t child) int retval = 0; retval += bus_print_child_header(bus, child); - retval += printf(" on motherboard\n"); /* XXX "motherboard", ick */ + retval += printf("\n"); return (retval); } diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c index b6d8c768dfe..6a7ebfd0feb 100644 --- a/sys/arm/arm/pmap.c +++ b/sys/arm/arm/pmap.c @@ -177,7 +177,7 @@ __FBSDID("$FreeBSD$"); #define dprintf printf int pmap_debug_level = 0; -#define PMAP_INLINE +#define PMAP_INLINE #else /* PMAP_DEBUG */ #define PDEBUG(_lev_,_stat_) /* Nothing */ #define dprintf(x, arg...) @@ -852,7 +852,7 @@ pmap_get_l2_bucket(pmap_t pm, vm_offset_t va) * bucket/page table in place. * * Note that if a new L2 bucket/page was allocated, the caller *must* - * increment the bucket occupancy counter appropriately *before* + * increment the bucket occupancy counter appropriately *before* * releasing the pmap's lock to ensure no other thread or cpu deallocates * the bucket/page in the meantime. */ @@ -903,7 +903,7 @@ again_l2table: */ pm->pm_l2[L2_IDX(l1idx)] = l2; } - } + } l2b = &l2->l2_bucket[L2_BUCKET(l1idx)]; @@ -1100,7 +1100,7 @@ pmap_l2ptp_ctor(void *mem, int size, void *arg, int flags) if ((pte & L2_S_CACHE_MASK) != pte_l2_s_cache_mode_pt) { /* - * Page tables must have the cache-mode set to + * Page tables must have the cache-mode set to * Write-Thru. */ *ptep = (pte & ~L2_S_CACHE_MASK) | pte_l2_s_cache_mode_pt; @@ -1415,7 +1415,7 @@ pmap_fix_cache(struct vm_page *pg, pmap_t pm, vm_offset_t va) * We use `maskbits' rather than `clearbits' because we're always passing * constants and the latter would require an extra inversion at run-time. */ -static int +static int pmap_clearbit(struct vm_page *pg, u_int maskbits) { struct l2_bucket *l2b; @@ -1473,10 +1473,10 @@ pmap_clearbit(struct vm_page *pg, u_int maskbits) if (maskbits & (PVF_WRITE|PVF_MOD)) { if ((pv->pv_flags & PVF_NC)) { - /* + /* * Entry is not cacheable: * - * Don't turn caching on again if this is a + * Don't turn caching on again if this is a * modified emulation. This would be * inconsitent with the settings created by * pmap_fix_cache(). Otherwise, it's safe @@ -1493,7 +1493,7 @@ pmap_clearbit(struct vm_page *pg, u_int maskbits) } else if (opte & L2_S_PROT_W) { vm_page_dirty(pg); - /* + /* * Entry is writable/cacheable: check if pmap * is current if it is flush it, otherwise it * won't be in the cache @@ -1760,7 +1760,7 @@ pmap_remove_pv(struct vm_page *pg, pmap_t pm, vm_offset_t va) * => caller should hold lock on vm_page [so that attrs can be adjusted] * => caller should NOT adjust pmap's wire_count * => we return the old flags - * + * * Modify a physical-virtual mapping in the pv table */ static u_int @@ -1845,7 +1845,7 @@ pmap_init(void) /* * init the pv free list */ - pvzone = uma_zcreate("PV ENTRY", sizeof (struct pv_entry), NULL, NULL, + pvzone = uma_zcreate("PV ENTRY", sizeof (struct pv_entry), NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM | UMA_ZONE_NOFREE); /* * Now it is safe to enable pv_table recording. @@ -1951,7 +1951,7 @@ pmap_fault_fixup(pmap_t pm, vm_offset_t va, vm_prot_t ftype, int user) vm_page_dirty(pg); pv->pv_flags |= PVF_REF | PVF_MOD; - /* + /* * Re-enable write permissions for the page. No need to call * pmap_fix_cache(), since this is just a * modified-emulation fault, and the PVF_WRITE bit isn't @@ -2249,7 +2249,7 @@ pmap_set_pt_cache_mode(pd_entry_t *kl1, vm_offset_t va) } static void -pmap_alloc_specials(vm_offset_t *availp, int pages, vm_offset_t *vap, +pmap_alloc_specials(vm_offset_t *availp, int pages, vm_offset_t *vap, pt_entry_t **ptep) { vm_offset_t va = *availp; @@ -2338,7 +2338,7 @@ pmap_bootstrap(vm_offset_t firstaddr, vm_offset_t lastaddr, struct pv_addr *l1pt if ((l2 = kernel_pmap->pm_l2[L2_IDX(l1idx)]) == NULL) { if (l2next == PMAP_STATIC_L2_SIZE) panic("pmap_bootstrap: out of static L2s"); - kernel_pmap->pm_l2[L2_IDX(l1idx)] = l2 = + kernel_pmap->pm_l2[L2_IDX(l1idx)] = l2 = &static_l2[l2next++]; } @@ -2407,7 +2407,7 @@ pmap_bootstrap(vm_offset_t firstaddr, vm_offset_t lastaddr, struct pv_addr *l1pt */ #define SYSMAP(c, p, v, n) \ v = (c)va; va += ((n)*PAGE_SIZE); p = pte; pte += (n); - + pmap_alloc_specials(&virtual_avail, 1, &csrcp, &csrc_pte); pmap_set_pt_cache_mode(kernel_l1pt, (vm_offset_t)csrc_pte); pmap_alloc_specials(&virtual_avail, 1, &cdstp, &cdst_pte); @@ -2561,7 +2561,7 @@ pmap_grow_l2_bucket(pmap_t pm, vm_offset_t va) l2 = (struct l2_dtable *)nva; nva += sizeof(struct l2_dtable); - if ((nva & PAGE_MASK) < (pmap_kernel_l2dtable_kva & + if ((nva & PAGE_MASK) < (pmap_kernel_l2dtable_kva & PAGE_MASK)) { /* * The new l2_dtable straddles a page boundary. @@ -2809,7 +2809,7 @@ pmap_kenter_internal(vm_offset_t va, vm_offset_t pa, int flags) if (opte == 0) l2b->l2b_occupancy++; } - *pte = L2_S_PROTO | pa | L2_S_PROT(PTE_KERNEL, + *pte = L2_S_PROTO | pa | L2_S_PROT(PTE_KERNEL, VM_PROT_READ | VM_PROT_WRITE); if (flags & KENTER_CACHE) *pte |= pte_l2_s_cache_mode; @@ -2822,7 +2822,7 @@ pmap_kenter_internal(vm_offset_t va, vm_offset_t pa, int flags) * * The pvzone is used to delay the recording of kernel * mappings until the VM is running. - * + * * This expects the physical memory to have vm_page_array entry. */ if (pvzone != NULL && (m = vm_phys_paddr_to_vm_page(pa))) { @@ -2906,7 +2906,7 @@ pmap_kremove(vm_offset_t va) PMAP_LOCK(pmap_kernel()); if (pvzone != NULL && (m = vm_phys_paddr_to_vm_page(pa)) && (pve = pmap_remove_pv(m, pmap_kernel(), va))) - pmap_free_pv_entry(pve); + pmap_free_pv_entry(pve); PMAP_UNLOCK(pmap_kernel()); vm_page_unlock_queues(); va = va & ~PAGE_MASK; @@ -2943,7 +2943,7 @@ pmap_map(vm_offset_t *virt, vm_offset_t start, vm_offset_t end, int prot) PDEBUG(1, printf("pmap_map: virt = %08x, start = %08x, end = %08x, " "prot = %d\n", (uint32_t) *virt, (uint32_t) start, (uint32_t) end, prot)); - + while (start < end) { pmap_kenter(va, start); va += PAGE_SIZE; @@ -2987,7 +2987,7 @@ pmap_qenter(vm_offset_t va, vm_page_t *m, int count) for (i = 0; i < count; i++) { pmap_wb_page(m[i]); - pmap_kenter_internal(va, VM_PAGE_TO_PHYS(m[i]), + pmap_kenter_internal(va, VM_PAGE_TO_PHYS(m[i]), KENTER_CACHE); va += PAGE_SIZE; } @@ -3343,7 +3343,7 @@ pmap_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, nflags |= PVF_WIRED; PDEBUG(1, printf("pmap_enter: pmap = %08x, va = %08x, m = %08x, prot = %x, " "wired = %x\n", (uint32_t) pmap, va, (uint32_t) m, prot, wired)); - + if (pmap == pmap_kernel()) { l2b = pmap_get_l2_bucket(pmap, va); if (l2b == NULL) @@ -3365,7 +3365,7 @@ do_l2b_alloc: } ptep = &l2b->l2b_kva[l2pte_index(va)]; - + opte = *ptep; npte = pa; oflags = 0; @@ -3528,8 +3528,7 @@ do_l2b_alloc: if (opte == 0) { l2b->l2b_occupancy++; pmap->pm_stats.resident_count++; - } - + } /* * If this is just a wiring change, the two PTEs will be @@ -3545,7 +3544,7 @@ do_l2b_alloc: * is current */ PTE_SYNC(ptep); - if (L1_IDX(va) != L1_IDX(vector_page) && + if (L1_IDX(va) != L1_IDX(vector_page) && l2pte_valid(npte)) { /* * This mapping is likely to be accessed as @@ -3650,7 +3649,7 @@ pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired) ptep = &l2b->l2b_kva[l2pte_index(va)]; pte = *ptep; pg = PHYS_TO_VM_PAGE(l2pte_pa(pte)); - if (pg) + if (pg) pmap_modify_pv(pg, pmap, va, PVF_WIRED, wired ? PVF_WIRED : 0); vm_page_unlock_queues(); PMAP_UNLOCK(pmap); @@ -3695,7 +3694,7 @@ pmap_extract(pmap_t pm, vm_offset_t va) */ KASSERT(pm == pmap_kernel(), ("huh")); /* XXX: what to do about the bits > 32 ? */ - if (l1pd & L1_S_SUPERSEC) + if (l1pd & L1_S_SUPERSEC) pa = (l1pd & L1_SUP_FRAME) | (va & L1_SUP_OFFSET); else pa = (l1pd & L1_S_FRAME) | (va & L1_S_OFFSET); @@ -3763,7 +3762,7 @@ retry: */ KASSERT(pmap == pmap_kernel(), ("huh")); /* XXX: what to do about the bits > 32 ? */ - if (l1pd & L1_S_SUPERSEC) + if (l1pd & L1_S_SUPERSEC) pa = (l1pd & L1_SUP_FRAME) | (va & L1_SUP_OFFSET); else pa = (l1pd & L1_S_FRAME) | (va & L1_S_OFFSET); @@ -3840,7 +3839,7 @@ pmap_pinit(pmap_t pmap) pmap_enter(pmap, vector_page, VM_PROT_READ, PHYS_TO_VM_PAGE(systempage.pv_pa), VM_PROT_READ, 1); - } + } return (1); } @@ -4000,7 +3999,7 @@ pmap_remove(pmap_t pm, vm_offset_t sva, vm_offset_t eva) /* * pmap_zero_page() - * + * * Zero a given physical page by mapping it at a page hook point. * In doing the zero page op, the page we zero is mapped cachable, as with * StrongARM accesses to non-cached pages are non-burst making writing @@ -4137,7 +4136,7 @@ pmap_use_minicache(vm_offset_t va, vm_size_t size) #endif /* ARM_MMU_XSCALE == 1 */ /* - * pmap_zero_page zeros the specified hardware page by mapping + * pmap_zero_page zeros the specified hardware page by mapping * the page into KVM and using bzero to clear its contents. */ void @@ -4148,7 +4147,7 @@ pmap_zero_page(vm_page_t m) /* - * pmap_zero_page_area zeros the specified hardware page by mapping + * pmap_zero_page_area zeros the specified hardware page by mapping * the page into KVM and using bzero to clear its contents. * * off and size may not cover an area beyond a single hardware page. @@ -4162,7 +4161,7 @@ pmap_zero_page_area(vm_page_t m, int off, int size) /* - * pmap_zero_page_idle zeros the specified hardware page by mapping + * pmap_zero_page_idle zeros the specified hardware page by mapping * the page into KVM and using bzero to clear its contents. This * is intended to be called from the vm_pagezero process only and * outside of Giant. @@ -4225,7 +4224,7 @@ pmap_clean_page(struct pv_entry *pv, boolean_t is_src) if (npv->pv_pmap == pmap_kernel() || npv->pv_pmap == pm) { flags |= npv->pv_flags; /* - * The page is mapped non-cacheable in + * The page is mapped non-cacheable in * this map. No need to flush the cache. */ if (npv->pv_flags & PVF_NC) { @@ -4377,7 +4376,7 @@ pmap_copy_page(vm_page_t src, vm_page_t dst) cpu_dcache_wbinv_all(); cpu_l2cache_wbinv_all(); if (_arm_memcpy && PAGE_SIZE >= _min_memcpy_size && - _arm_memcpy((void *)VM_PAGE_TO_PHYS(dst), + _arm_memcpy((void *)VM_PAGE_TO_PHYS(dst), (void *)VM_PAGE_TO_PHYS(src), PAGE_SIZE, IS_PHYSICAL) == 0) return; #ifdef ARM_USE_SMALL_ALLOC @@ -4524,7 +4523,7 @@ pmap_clear_reference(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_reference: page %p is not managed", m)); - if (m->md.pvh_attrs & PVF_REF) + if (m->md.pvh_attrs & PVF_REF) pmap_clearbit(m, PVF_REF); } @@ -4557,9 +4556,59 @@ pmap_remove_write(vm_page_t m) int pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa) { - printf("pmap_mincore()\n"); - - return (0); + struct l2_bucket *l2b; + pt_entry_t *ptep, pte; + vm_paddr_t pa; + vm_page_t m; + int val; + boolean_t managed; + + PMAP_LOCK(pmap); +retry: + l2b = pmap_get_l2_bucket(pmap, addr); + if (l2b == NULL) { + val = 0; + goto out; + } + ptep = &l2b->l2b_kva[l2pte_index(addr)]; + pte = *ptep; + if (!l2pte_valid(pte)) { + val = 0; + goto out; + } + val = MINCORE_INCORE; + if (pte & L2_S_PROT_W) + val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER; + managed = false; + pa = l2pte_pa(pte); + m = PHYS_TO_VM_PAGE(pa); + if (m != NULL && !(m->oflags & VPO_UNMANAGED)) + managed = true; + if (managed) { + /* + * the ARM pmap tries to maintain a per-mapping + * reference bit. The trouble is that it's kept in + * the PV entry, not the PTE, so it's costly to access + * here. You would need to acquire the page queues + * lock, call pmap_find_pv(), and introduce a custom + * version of vm_page_pa_tryrelock() that releases and + * reacquires the page queues lock. In the end, I + * doubt it's worthwhile. This may falsely report + * the given address as referenced. + */ + if ((m->md.pvh_attrs & PVF_REF) != 0) + val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER; + } + if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) != + (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) && managed) { + /* Ensure that "PHYS_TO_VM_PAGE(pa)->object" doesn't change. */ + if (vm_page_pa_tryrelock(pmap, pa, locked_pa)) + goto retry; + } else +out: + PA_UNLOCK_COND(*locked_pa); + PMAP_UNLOCK(pmap); + return (val); } @@ -4660,7 +4709,7 @@ pmap_link_l2pt(vm_offset_t l1pt, vm_offset_t va, struct pv_addr *l2pv) proto = L1_S_DOM(PMAP_DOMAIN_KERNEL) | L1_C_PROTO; -#ifdef VERBOSE_INIT_ARM +#ifdef VERBOSE_INIT_ARM printf("pmap_link_l2pt: pa=0x%x va=0x%x\n", l2pv->pv_pa, l2pv->pv_va); #endif @@ -4729,7 +4778,7 @@ pmap_map_chunk(vm_offset_t l1pt, vm_offset_t va, vm_offset_t pa, { pd_entry_t *pde = (pd_entry_t *) l1pt; pt_entry_t *pte, f1, f2s, f2l; - vm_size_t resid; + vm_size_t resid; int i; resid = (size + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1); @@ -4737,7 +4786,7 @@ pmap_map_chunk(vm_offset_t l1pt, vm_offset_t va, vm_offset_t pa, if (l1pt == 0) panic("pmap_map_chunk: no L1 table provided"); -#ifdef VERBOSE_INIT_ARM +#ifdef VERBOSE_INIT_ARM printf("pmap_map_chunk: pa=0x%x va=0x%x size=0x%x resid=0x%x " "prot=0x%x cache=%d\n", pa, va, size, resid, prot, cache); #endif diff --git a/sys/arm/arm/support.S b/sys/arm/arm/support.S index 2c88f229946..d4c6fb45748 100644 --- a/sys/arm/arm/support.S +++ b/sys/arm/arm/support.S @@ -389,9 +389,9 @@ ENTRY(bcmp) ENTRY(bcopy) /* switch the source and destination registers */ - eor r0, r1, r0 - eor r1, r0, r1 - eor r0, r1, r0 + eor r0, r1, r0 + eor r1, r0, r1 + eor r0, r1, r0 ENTRY(memmove) /* Do the buffers overlap? */ cmp r0, r1 @@ -420,7 +420,7 @@ ENTRY(memmove) /* We have aligned source and destination */ subs r2, r2, #8 blt .Lmemmove_fl12 /* less than 12 bytes (4 from above) */ - subs r2, r2, #0x14 + subs r2, r2, #0x14 blt .Lmemmove_fl32 /* less than 32 bytes (12 from above) */ stmdb sp!, {r4} /* borrow r4 */ @@ -431,23 +431,23 @@ ENTRY(memmove) stmia r0!, {r3, r4, r12, lr} ldmia r1!, {r3, r4, r12, lr} stmia r0!, {r3, r4, r12, lr} - subs r2, r2, #0x20 + subs r2, r2, #0x20 bge .Lmemmove_floop32 cmn r2, #0x10 ldmgeia r1!, {r3, r4, r12, lr} /* blat a remaining 16 bytes */ stmgeia r0!, {r3, r4, r12, lr} - subge r2, r2, #0x10 + subge r2, r2, #0x10 ldmia sp!, {r4} /* return r4 */ .Lmemmove_fl32: - adds r2, r2, #0x14 + adds r2, r2, #0x14 /* blat 12 bytes at a time */ .Lmemmove_floop12: ldmgeia r1!, {r3, r12, lr} stmgeia r0!, {r3, r12, lr} - subges r2, r2, #0x0c + subges r2, r2, #0x0c bge .Lmemmove_floop12 .Lmemmove_fl12: @@ -502,9 +502,9 @@ ENTRY(memmove) cmp r12, #2 bgt .Lmemmove_fsrcul3 beq .Lmemmove_fsrcul2 - cmp r2, #0x0c + cmp r2, #0x0c blt .Lmemmove_fsrcul1loop4 - sub r2, r2, #0x0c + sub r2, r2, #0x0c stmdb sp!, {r4, r5} .Lmemmove_fsrcul1loop16: @@ -532,10 +532,10 @@ ENTRY(memmove) orr r12, r12, lr, lsl #24 #endif stmia r0!, {r3-r5, r12} - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lmemmove_fsrcul1loop16 ldmia sp!, {r4, r5} - adds r2, r2, #0x0c + adds r2, r2, #0x0c blt .Lmemmove_fsrcul1l4 .Lmemmove_fsrcul1loop4: @@ -559,9 +559,9 @@ ENTRY(memmove) b .Lmemmove_fl4 .Lmemmove_fsrcul2: - cmp r2, #0x0c + cmp r2, #0x0c blt .Lmemmove_fsrcul2loop4 - sub r2, r2, #0x0c + sub r2, r2, #0x0c stmdb sp!, {r4, r5} .Lmemmove_fsrcul2loop16: @@ -589,10 +589,10 @@ ENTRY(memmove) orr r12, r12, lr, lsl #16 #endif stmia r0!, {r3-r5, r12} - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lmemmove_fsrcul2loop16 ldmia sp!, {r4, r5} - adds r2, r2, #0x0c + adds r2, r2, #0x0c blt .Lmemmove_fsrcul2l4 .Lmemmove_fsrcul2loop4: @@ -616,9 +616,9 @@ ENTRY(memmove) b .Lmemmove_fl4 .Lmemmove_fsrcul3: - cmp r2, #0x0c + cmp r2, #0x0c blt .Lmemmove_fsrcul3loop4 - sub r2, r2, #0x0c + sub r2, r2, #0x0c stmdb sp!, {r4, r5} .Lmemmove_fsrcul3loop16: @@ -646,10 +646,10 @@ ENTRY(memmove) orr r12, r12, lr, lsl #8 #endif stmia r0!, {r3-r5, r12} - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lmemmove_fsrcul3loop16 ldmia sp!, {r4, r5} - adds r2, r2, #0x0c + adds r2, r2, #0x0c blt .Lmemmove_fsrcul3l4 .Lmemmove_fsrcul3loop4: @@ -697,18 +697,18 @@ ENTRY(memmove) stmdb r0!, {r3, r4, r12, lr} ldmdb r1!, {r3, r4, r12, lr} stmdb r0!, {r3, r4, r12, lr} - subs r2, r2, #0x20 + subs r2, r2, #0x20 bge .Lmemmove_bloop32 .Lmemmove_bl32: - cmn r2, #0x10 + cmn r2, #0x10 ldmgedb r1!, {r3, r4, r12, lr} /* blat a remaining 16 bytes */ stmgedb r0!, {r3, r4, r12, lr} - subge r2, r2, #0x10 - adds r2, r2, #0x14 + subge r2, r2, #0x10 + adds r2, r2, #0x14 ldmgedb r1!, {r3, r12, lr} /* blat a remaining 12 bytes */ stmgedb r0!, {r3, r12, lr} - subge r2, r2, #0x0c + subge r2, r2, #0x0c ldmia sp!, {r4, lr} .Lmemmove_bl12: @@ -760,9 +760,9 @@ ENTRY(memmove) cmp r12, #2 blt .Lmemmove_bsrcul1 beq .Lmemmove_bsrcul2 - cmp r2, #0x0c + cmp r2, #0x0c blt .Lmemmove_bsrcul3loop4 - sub r2, r2, #0x0c + sub r2, r2, #0x0c stmdb sp!, {r4, r5, lr} .Lmemmove_bsrcul3loop16: @@ -790,10 +790,10 @@ ENTRY(memmove) orr r4, r4, r3, lsr #24 #endif stmdb r0!, {r4, r5, r12, lr} - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lmemmove_bsrcul3loop16 ldmia sp!, {r4, r5, lr} - adds r2, r2, #0x0c + adds r2, r2, #0x0c blt .Lmemmove_bsrcul3l4 .Lmemmove_bsrcul3loop4: @@ -817,9 +817,9 @@ ENTRY(memmove) b .Lmemmove_bl4 .Lmemmove_bsrcul2: - cmp r2, #0x0c + cmp r2, #0x0c blt .Lmemmove_bsrcul2loop4 - sub r2, r2, #0x0c + sub r2, r2, #0x0c stmdb sp!, {r4, r5, lr} .Lmemmove_bsrcul2loop16: @@ -847,10 +847,10 @@ ENTRY(memmove) orr r4, r4, r3, lsr #16 #endif stmdb r0!, {r4, r5, r12, lr} - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lmemmove_bsrcul2loop16 ldmia sp!, {r4, r5, lr} - adds r2, r2, #0x0c + adds r2, r2, #0x0c blt .Lmemmove_bsrcul2l4 .Lmemmove_bsrcul2loop4: @@ -874,9 +874,9 @@ ENTRY(memmove) b .Lmemmove_bl4 .Lmemmove_bsrcul1: - cmp r2, #0x0c + cmp r2, #0x0c blt .Lmemmove_bsrcul1loop4 - sub r2, r2, #0x0c + sub r2, r2, #0x0c stmdb sp!, {r4, r5, lr} .Lmemmove_bsrcul1loop32: @@ -904,10 +904,10 @@ ENTRY(memmove) orr r4, r4, r3, lsr #8 #endif stmdb r0!, {r4, r5, r12, lr} - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lmemmove_bsrcul1loop32 ldmia sp!, {r4, r5, lr} - adds r2, r2, #0x0c + adds r2, r2, #0x0c blt .Lmemmove_bsrcul1l4 .Lmemmove_bsrcul1loop4: @@ -976,7 +976,7 @@ ENTRY(memcpy) /* We have aligned source and destination */ subs r2, r2, #8 blt .Lmemcpy_l12 /* less than 12 bytes (4 from above) */ - subs r2, r2, #0x14 + subs r2, r2, #0x14 blt .Lmemcpy_l32 /* less than 32 bytes (12 from above) */ stmdb sp!, {r4} /* borrow r4 */ @@ -987,23 +987,23 @@ ENTRY(memcpy) stmia r0!, {r3, r4, r12, lr} ldmia r1!, {r3, r4, r12, lr} stmia r0!, {r3, r4, r12, lr} - subs r2, r2, #0x20 + subs r2, r2, #0x20 bge .Lmemcpy_loop32 cmn r2, #0x10 ldmgeia r1!, {r3, r4, r12, lr} /* blat a remaining 16 bytes */ stmgeia r0!, {r3, r4, r12, lr} - subge r2, r2, #0x10 + subge r2, r2, #0x10 ldmia sp!, {r4} /* return r4 */ .Lmemcpy_l32: - adds r2, r2, #0x14 + adds r2, r2, #0x14 /* blat 12 bytes at a time */ .Lmemcpy_loop12: ldmgeia r1!, {r3, r12, lr} stmgeia r0!, {r3, r12, lr} - subges r2, r2, #0x0c + subges r2, r2, #0x0c bge .Lmemcpy_loop12 .Lmemcpy_l12: @@ -1061,9 +1061,9 @@ ENTRY(memcpy) cmp r12, #2 bgt .Lmemcpy_srcul3 beq .Lmemcpy_srcul2 - cmp r2, #0x0c + cmp r2, #0x0c blt .Lmemcpy_srcul1loop4 - sub r2, r2, #0x0c + sub r2, r2, #0x0c stmdb sp!, {r4, r5} .Lmemcpy_srcul1loop16: @@ -1077,10 +1077,10 @@ ENTRY(memcpy) mov r12, r12, lsr #8 orr r12, r12, lr, lsl #24 stmia r0!, {r3-r5, r12} - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lmemcpy_srcul1loop16 ldmia sp!, {r4, r5} - adds r2, r2, #0x0c + adds r2, r2, #0x0c blt .Lmemcpy_srcul1l4 .Lmemcpy_srcul1loop4: @@ -1096,9 +1096,9 @@ ENTRY(memcpy) b .Lmemcpy_l4 .Lmemcpy_srcul2: - cmp r2, #0x0c + cmp r2, #0x0c blt .Lmemcpy_srcul2loop4 - sub r2, r2, #0x0c + sub r2, r2, #0x0c stmdb sp!, {r4, r5} .Lmemcpy_srcul2loop16: @@ -1112,10 +1112,10 @@ ENTRY(memcpy) mov r12, r12, lsr #16 orr r12, r12, lr, lsl #16 stmia r0!, {r3-r5, r12} - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lmemcpy_srcul2loop16 ldmia sp!, {r4, r5} - adds r2, r2, #0x0c + adds r2, r2, #0x0c blt .Lmemcpy_srcul2l4 .Lmemcpy_srcul2loop4: @@ -1131,9 +1131,9 @@ ENTRY(memcpy) b .Lmemcpy_l4 .Lmemcpy_srcul3: - cmp r2, #0x0c + cmp r2, #0x0c blt .Lmemcpy_srcul3loop4 - sub r2, r2, #0x0c + sub r2, r2, #0x0c stmdb sp!, {r4, r5} .Lmemcpy_srcul3loop16: @@ -1147,10 +1147,10 @@ ENTRY(memcpy) mov r12, r12, lsr #24 orr r12, r12, lr, lsl #8 stmia r0!, {r3-r5, r12} - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lmemcpy_srcul3loop16 ldmia sp!, {r4, r5} - adds r2, r2, #0x0c + adds r2, r2, #0x0c blt .Lmemcpy_srcul3l4 .Lmemcpy_srcul3loop4: @@ -1404,10 +1404,10 @@ ENTRY(memcpy) str r6, [r3], #0x04 str r7, [r3], #0x04 .Lmemcpy_bad1: - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lmemcpy_bad1_loop16 - adds r2, r2, #0x10 + adds r2, r2, #0x10 ldmeqfd sp!, {r4-r7} RETeq /* Return now if done */ subs r2, r2, #0x04 @@ -1465,10 +1465,10 @@ ENTRY(memcpy) str r6, [r3], #0x04 str r7, [r3], #0x04 .Lmemcpy_bad2: - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lmemcpy_bad2_loop16 - adds r2, r2, #0x10 + adds r2, r2, #0x10 ldmeqfd sp!, {r4-r7} RETeq /* Return now if done */ subs r2, r2, #0x04 @@ -1526,10 +1526,10 @@ ENTRY(memcpy) str r6, [r3], #0x04 str r7, [r3], #0x04 .Lmemcpy_bad3: - subs r2, r2, #0x10 + subs r2, r2, #0x10 bge .Lmemcpy_bad3_loop16 - adds r2, r2, #0x10 + adds r2, r2, #0x10 ldmeqfd sp!, {r4-r7} RETeq /* Return now if done */ subs r2, r2, #0x04 diff --git a/sys/arm/arm/swtch.S b/sys/arm/arm/swtch.S index 762fc28a014..a293c5cc96f 100644 --- a/sys/arm/arm/swtch.S +++ b/sys/arm/arm/swtch.S @@ -262,7 +262,7 @@ ENTRY(cpu_switch) strd r12, [r2, #(PCB_R12)] #endif str pc, [r2, #(PCB_PC)] - + /* * NOTE: We can now use r8-r13 until it is time to restore * them for the new process. @@ -291,7 +291,7 @@ ENTRY(cpu_switch) mrs r3, cpsr /* - * We can do that, since + * We can do that, since * PSR_SVC32_MODE|PSR_UND32_MODE == MSR_UND32_MODE */ orr r8, r3, #(PSR_UND32_MODE) @@ -399,7 +399,7 @@ ENTRY(cpu_switch) movne lr, pc ldrne pc, [r10, #CF_TLB_FLUSHID_SE] /* - * We can do that, since + * We can do that, since * PSR_SVC32_MODE|PSR_UND32_MODE == MSR_UND32_MODE */ @@ -422,7 +422,7 @@ ENTRY(cpu_switch) mrs r3, cpsr /* - * We can do that, since + * We can do that, since * PSR_SVC32_MODE|PSR_UND32_MODE == MSR_UND32_MODE */ orr r2, r3, #(PSR_UND32_MODE) @@ -451,7 +451,7 @@ ENTRY(cpu_switch) #ifdef ARMFPE add r0, r7, #(USER_SIZE) & 0x00ff - add r0, r0, #(USER_SIZE) & 0xff00 + add r0, r0, #(USER_SIZE) & 0xff00 bl _C_LABEL(arm_fpe_core_changecontext) #endif diff --git a/sys/arm/arm/sys_machdep.c b/sys/arm/arm/sys_machdep.c index 5fe7b5c03d7..f673dc6135e 100644 --- a/sys/arm/arm/sys_machdep.c +++ b/sys/arm/arm/sys_machdep.c @@ -132,10 +132,10 @@ sysarch(td, uap) #endif switch (uap->op) { - case ARM_SYNC_ICACHE : + case ARM_SYNC_ICACHE: error = arm32_sync_icache(td, uap->parms); break; - case ARM_DRAIN_WRITEBUF : + case ARM_DRAIN_WRITEBUF: error = arm32_drain_writebuf(td, uap->parms); break; case ARM_SET_TP: diff --git a/sys/arm/arm/trap.c b/sys/arm/arm/trap.c index e56f0ffded8..0d915dae001 100644 --- a/sys/arm/arm/trap.c +++ b/sys/arm/arm/trap.c @@ -128,7 +128,7 @@ void undefinedinstruction(trapframe_t *); #include #include - + extern char fusubailout[]; #ifdef DEBUG @@ -388,7 +388,7 @@ data_abort_handler(trapframe_t *tf) * responsible to determine if it was a write. */ if (IS_PERMISSION_FAULT(fsr)) { - ftype = VM_PROT_WRITE; + ftype = VM_PROT_WRITE; } else { u_int insn = ReadWord(tf->tf_pc); @@ -396,13 +396,13 @@ data_abort_handler(trapframe_t *tf) ((insn & 0x0e1000b0) == 0x000000b0) || /* STRH/STRD */ ((insn & 0x0a100000) == 0x08000000)) /* STM/CDT */ { - ftype = VM_PROT_WRITE; + ftype = VM_PROT_WRITE; } else if ((insn & 0x0fb00ff0) == 0x01000090) /* SWP */ - ftype = VM_PROT_READ | VM_PROT_WRITE; + ftype = VM_PROT_READ | VM_PROT_WRITE; else - ftype = VM_PROT_READ; + ftype = VM_PROT_READ; } /* @@ -734,9 +734,7 @@ prefetch_abort_handler(trapframe_t *tf) if (__predict_true(tf->tf_spsr & F32_bit) == 0) enable_interrupts(F32_bit); } - - /* See if the cpu state needs to be fixed up */ switch (prefetch_abort_fixup(tf, &ksig)) { case ABORT_FIXUP_RETURN: @@ -947,15 +945,15 @@ swi_handler(trapframe_t *frame) /* * Enable interrupts if they were enabled before the exception. * Since all syscalls *should* come from user mode it will always - * be safe to enable them, but check anyway. - */ + * be safe to enable them, but check anyway. + */ if (td->td_md.md_spinlock_count == 0) { if (__predict_true(frame->tf_spsr & I32_bit) == 0) enable_interrupts(I32_bit); if (__predict_true(frame->tf_spsr & F32_bit) == 0) enable_interrupts(F32_bit); } - + syscall(td, frame, insn); } diff --git a/sys/arm/arm/undefined.c b/sys/arm/arm/undefined.c index fa02023c656..fcb612d1b21 100644 --- a/sys/arm/arm/undefined.c +++ b/sys/arm/arm/undefined.c @@ -194,8 +194,8 @@ undefinedinstruction(trapframe_t *frame) fault_pc = frame->tf_pc; - /* - * Get the current thread/proc structure or thread0/proc0 if there is + /* + * Get the current thread/proc structure or thread0/proc0 if there is * none. */ td = curthread == NULL ? &thread0 : curthread; diff --git a/sys/arm/arm/vectors.S b/sys/arm/arm/vectors.S index c91b437e8b8..95ee5d19010 100644 --- a/sys/arm/arm/vectors.S +++ b/sys/arm/arm/vectors.S @@ -3,7 +3,7 @@ /*- * Copyright (C) 1994-1997 Mark Brinicombe * Copyright (C) 1994 Brini - * All rights reserved. + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -18,10 +18,10 @@ * This product includes software developed by Brini. * 4. The name of Brini may not be used to endorse or promote products * derived from this software without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL BRINI BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; diff --git a/sys/arm/arm/vm_machdep.c b/sys/arm/arm/vm_machdep.c index 54e561e872e..114c6832934 100644 --- a/sys/arm/arm/vm_machdep.c +++ b/sys/arm/arm/vm_machdep.c @@ -152,11 +152,11 @@ cpu_fork(register struct thread *td1, register struct proc *p2, void cpu_thread_swapin(struct thread *td) { -} +} -void +void cpu_thread_swapout(struct thread *td) -{ +{ } /* @@ -177,7 +177,7 @@ sf_buf_free(struct sf_buf *sf) if (sf_buf_alloc_want > 0) wakeup(&sf_buf_freelist); } - mtx_unlock(&sf_buf_lock); + mtx_unlock(&sf_buf_lock); #endif } @@ -187,11 +187,11 @@ sf_buf_free(struct sf_buf *sf) */ static void sf_buf_init(void *arg) -{ +{ struct sf_buf *sf_bufs; vm_offset_t sf_base; int i; - + nsfbufs = NSFBUFS; TUNABLE_INT_FETCH("kern.ipc.nsfbufs", &nsfbufs); @@ -204,7 +204,7 @@ sf_buf_init(void *arg) sf_bufs[i].kva = sf_base + i * PAGE_SIZE; TAILQ_INSERT_TAIL(&sf_buf_freelist, &sf_bufs[i], free_entry); } - sf_buf_alloc_want = 0; + sf_buf_alloc_want = 0; mtx_init(&sf_buf_lock, "sf_buf", NULL, MTX_DEF); } #endif @@ -246,7 +246,7 @@ sf_buf_alloc(struct vm_page *m, int flags) /* - * If we got a signal, don't risk going back to sleep. + * If we got a signal, don't risk going back to sleep. */ if (error) goto done; @@ -319,7 +319,7 @@ cpu_set_syscall_retval(struct thread *td, int error) /* * Initialize machine state (pcb and trap frame) for a new thread about to - * upcall. Put enough state in the new thread's PCB to get it to go back + * upcall. Put enough state in the new thread's PCB to get it to go back * userret(), where we can intercept it again to set the return (upcall) * Address and stack, along with those from upcals that are from other sources * such as those generated in thread_userret() itself. @@ -387,7 +387,7 @@ cpu_thread_exit(struct thread *td) void cpu_thread_alloc(struct thread *td) { - td->td_pcb = (struct pcb *)(td->td_kstack + td->td_kstack_pages * + td->td_pcb = (struct pcb *)(td->td_kstack + td->td_kstack_pages * PAGE_SIZE) - 1; td->td_frame = (struct trapframe *) ((u_int)td->td_kstack + USPACE_SVC_STACK_TOP - sizeof(struct pcb)) - 1; @@ -395,7 +395,7 @@ cpu_thread_alloc(struct thread *td) #ifndef CPU_XSCALE_CORE3 pmap_use_minicache(td->td_kstack, td->td_kstack_pages * PAGE_SIZE); #endif -#endif +#endif } void @@ -429,8 +429,8 @@ cpu_set_fork_handler(struct thread *td, void (*func)(void *), void *arg) /* * Software interrupt handler for queued VM system processing. - */ -void + */ +void swi_vm(void *dummy) { @@ -445,14 +445,14 @@ cpu_exit(struct thread *td) #define BITS_PER_INT (8 * sizeof(int)) vm_offset_t arm_nocache_startaddr; -static int arm_nocache_allocated[ARM_NOCACHE_KVA_SIZE / (PAGE_SIZE * +static int arm_nocache_allocated[ARM_NOCACHE_KVA_SIZE / (PAGE_SIZE * BITS_PER_INT)]; /* - * Functions to map and unmap memory non-cached into KVA the kernel won't try + * Functions to map and unmap memory non-cached into KVA the kernel won't try * to allocate. The goal is to provide uncached memory to busdma, to honor - * BUS_DMA_COHERENT. - * We can allocate at most ARM_NOCACHE_KVA_SIZE bytes. + * BUS_DMA_COHERENT. + * We can allocate at most ARM_NOCACHE_KVA_SIZE bytes. * The allocator is rather dummy, each page is represented by a bit in * a bitfield, 0 meaning the page is not allocated, 1 meaning it is. * As soon as it finds enough contiguous pages to satisfy the request, @@ -465,7 +465,7 @@ arm_remap_nocache(void *addr, vm_size_t size) size = round_page(size); for (i = 0; i < ARM_NOCACHE_KVA_SIZE / PAGE_SIZE; i++) { - if (!(arm_nocache_allocated[i / BITS_PER_INT] & (1 << (i % + if (!(arm_nocache_allocated[i / BITS_PER_INT] & (1 << (i % BITS_PER_INT)))) { for (j = i; j < i + (size / (PAGE_SIZE)); j++) if (arm_nocache_allocated[j / BITS_PER_INT] & @@ -488,7 +488,7 @@ arm_remap_nocache(void *addr, vm_size_t size) cpu_l2cache_wbinv_range(vaddr, PAGE_SIZE); pmap_kenter_nocache(tomap, physaddr); cpu_tlb_flushID_SE(vaddr); - arm_nocache_allocated[i / BITS_PER_INT] |= 1 << (i % + arm_nocache_allocated[i / BITS_PER_INT] |= 1 << (i % BITS_PER_INT); } return (ret); @@ -506,7 +506,7 @@ arm_unmap_nocache(void *addr, vm_size_t size) size = round_page(size); i = (raddr - arm_nocache_startaddr) / (PAGE_SIZE); for (; size > 0; size -= PAGE_SIZE, i++) { - arm_nocache_allocated[i / BITS_PER_INT] &= ~(1 << (i % + arm_nocache_allocated[i / BITS_PER_INT] &= ~(1 << (i % BITS_PER_INT)); pmap_kremove(raddr); raddr += PAGE_SIZE; @@ -515,9 +515,9 @@ arm_unmap_nocache(void *addr, vm_size_t size) #ifdef ARM_USE_SMALL_ALLOC -static TAILQ_HEAD(,arm_small_page) pages_normal = +static TAILQ_HEAD(,arm_small_page) pages_normal = TAILQ_HEAD_INITIALIZER(pages_normal); -static TAILQ_HEAD(,arm_small_page) pages_wt = +static TAILQ_HEAD(,arm_small_page) pages_wt = TAILQ_HEAD_INITIALIZER(pages_wt); static TAILQ_HEAD(,arm_small_page) free_pgdesc = TAILQ_HEAD_INITIALIZER(free_pgdesc); @@ -561,12 +561,12 @@ arm_init_smallalloc(void) vm_offset_t to_map = 0, mapaddr; int i; - /* + /* * We need to use dump_avail and not phys_avail, since we want to * map the whole memory and not just the memory available to the VM * to be able to do a pa => va association for any address. */ - + for (i = 0; dump_avail[i + 1]; i+= 2) { to_map += (dump_avail[i + 1] & S_FRAME) + S_SIZE - (dump_avail[i] & S_FRAME); @@ -579,10 +579,10 @@ arm_init_smallalloc(void) while (size > 0) { #ifdef ARM_HAVE_SUPERSECTIONS pmap_kenter_supersection(mapaddr, - (dump_avail[i] & L1_SUP_FRAME) + did, + (dump_avail[i] & L1_SUP_FRAME) + did, SECTION_CACHE); #else - pmap_kenter_section(mapaddr, + pmap_kenter_section(mapaddr, (dump_avail[i] & L1_S_FRAME) + did, SECTION_CACHE); #endif mapaddr += S_SIZE; @@ -661,7 +661,7 @@ uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0) bzero(ret, PAGE_SIZE); return (ret); - } + } TAILQ_REMOVE(head, sp, pg_list); TAILQ_INSERT_HEAD(&free_pgdesc, sp, pg_list); ret = sp->addr; @@ -690,7 +690,7 @@ uma_small_free(void *mem, int size, u_int8_t flags) sp->addr = mem; pmap_get_pde_pte(kernel_pmap, (vm_offset_t)mem, &pd, &pt); - if ((*pd & pte_l1_s_cache_mask) == + if ((*pd & pte_l1_s_cache_mask) == pte_l1_s_cache_mode_pt && pte_l1_s_cache_mode_pt != pte_l1_s_cache_mode) TAILQ_INSERT_HEAD(&pages_wt, sp, pg_list); diff --git a/sys/arm/at91/at91.c b/sys/arm/at91/at91.c index 3d55fd34fbe..da3aa72b050 100644 --- a/sys/arm/at91/at91.c +++ b/sys/arm/at91/at91.c @@ -54,13 +54,7 @@ static void at91_eoi(void *); extern const struct pmap_devmap at91_devmap[]; -uint32_t at91_chip_id; - -#ifdef AT91C_MASTER_CLOCK -uint32_t at91_master_clock = AT91C_MASTER_CLOCK; -#else uint32_t at91_master_clock; -#endif static int at91_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags, @@ -69,16 +63,16 @@ at91_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags, vm_paddr_t pa, endpa; pa = trunc_page(bpa); - if (pa >= 0xfff00000) { - *bshp = pa - 0xf0000000 + 0xd0000000; + if (pa >= AT91_PA_BASE + 0xff00000) { + *bshp = pa - AT91_PA_BASE + AT91_BASE; return (0); } - if (pa >= 0xdff00000) + if (pa >= AT91_BASE + 0xff00000) return (0); endpa = round_page(bpa + size); *bshp = (vm_offset_t)pmap_mapdev(pa, endpa - pa); - + return (0); } @@ -104,7 +98,7 @@ at91_bs_subregion(void *t, bus_space_handle_t bsh, bus_size_t offset, } static void -at91_barrier(void *t, bus_space_handle_t bsh, bus_size_t size, bus_size_t b, +at91_barrier(void *t, bus_space_handle_t bsh, bus_size_t size, bus_size_t b, int a) { } @@ -269,17 +263,19 @@ at91_attach(device_t dev) sc->sc_mem_rman.rm_descr = "AT91 Memory"; if (rman_init(&sc->sc_mem_rman) != 0) panic("at91_attach: failed to set up memory rman"); - for ( pdevmap = at91_devmap; pdevmap->pd_va != 0; pdevmap++) { + for (pdevmap = at91_devmap; pdevmap->pd_va != 0; pdevmap++) { if (rman_manage_region(&sc->sc_mem_rman, pdevmap->pd_va, pdevmap->pd_va + pdevmap->pd_size - 1) != 0) panic("at91_attach: failed to set up memory rman"); } - /* Our device list will be added automatically by the cpu device + /* + * Our device list will be added automatically by the cpu device * e.g. at91rm9200.c when it is identified. To ensure that the - * CPU and PMC are attached first any other "identified" devices - * call BUS_ADD_CHILD(9) with an "order" of at least 2. */ + * CPU and PMC are attached first any other "identified" devices + * call BUS_ADD_CHILD(9) with an "order" of at least 2. + */ bus_generic_probe(dev); bus_generic_attach(dev); @@ -363,13 +359,13 @@ at91_release_resource(device_t dev, device_t child, int type, static int at91_setup_intr(device_t dev, device_t child, - struct resource *ires, int flags, driver_filter_t *filt, - driver_intr_t *intr, void *arg, void **cookiep) + struct resource *ires, int flags, driver_filter_t *filt, + driver_intr_t *intr, void *arg, void **cookiep) { struct at91_softc *sc = device_get_softc(dev); int error; - if (rman_get_start(ires) == sc->sc_irq_system && filt == NULL) + if (rman_get_start(ires) == AT91_IRQ_SYSTEM && filt == NULL) panic("All system interrupt ISRs must be FILTER"); error = BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, filt, intr, arg, cookiep); @@ -387,7 +383,7 @@ at91_teardown_intr(device_t dev, device_t child, struct resource *res, { struct at91_softc *sc = device_get_softc(dev); - bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_IDCR, + bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_IDCR, 1 << rman_get_start(res)); return (BUS_TEARDOWN_INTR(device_get_parent(dev), child, res, cookie)); } @@ -403,7 +399,7 @@ at91_activate_resource(device_t bus, device_t child, int type, int rid, if (type == SYS_RES_MEMORY) { error = bus_space_map(rman_get_bustag(r), rman_get_bushandle(r), rman_get_size(r), 0, &p); - if (error) + if (error) return (error); rman_set_bushandle(r, p); } @@ -438,7 +434,7 @@ void arm_mask_irq(uintptr_t nb) { - bus_space_write_4(at91_softc->sc_st, + bus_space_write_4(at91_softc->sc_st, at91_softc->sc_aic_sh, IC_IDCR, 1 << nb); } @@ -464,7 +460,7 @@ void arm_unmask_irq(uintptr_t nb) { - bus_space_write_4(at91_softc->sc_st, + bus_space_write_4(at91_softc->sc_st, at91_softc->sc_aic_sh, IC_IECR, 1 << nb); bus_space_write_4(at91_softc->sc_st, at91_softc->sc_aic_sh, IC_EOICR, 0); @@ -477,6 +473,41 @@ at91_eoi(void *unused) IC_EOICR, 0); } +void +at91_add_child(device_t dev, int prio, const char *name, int unit, + bus_addr_t addr, bus_size_t size, int irq0, int irq1, int irq2) +{ + device_t kid; + struct at91_ivar *ivar; + + kid = device_add_child_ordered(dev, prio, name, unit); + if (kid == NULL) { + printf("Can't add child %s%d ordered\n", name, unit); + return; + } + ivar = malloc(sizeof(*ivar), M_DEVBUF, M_NOWAIT | M_ZERO); + if (ivar == NULL) { + device_delete_child(dev, kid); + printf("Can't add alloc ivar\n"); + return; + } + device_set_ivars(kid, ivar); + resource_list_init(&ivar->resources); + if (irq0 != -1) { + bus_set_resource(kid, SYS_RES_IRQ, 0, irq0, 1); + if (irq0 != AT91_IRQ_SYSTEM) + at91_pmc_clock_add(device_get_nameunit(kid), irq0, 0); + } + if (irq1 != 0) + bus_set_resource(kid, SYS_RES_IRQ, 1, irq1, 1); + if (irq2 != 0) + bus_set_resource(kid, SYS_RES_IRQ, 2, irq2, 1); + if (addr != 0 && addr < AT91_BASE) + addr += AT91_BASE; + if (addr != 0) + bus_set_resource(kid, SYS_RES_MEMORY, 0, addr, size); +} + static device_method_t at91_methods[] = { DEVMETHOD(device_probe, at91_probe), DEVMETHOD(device_attach, at91_attach), diff --git a/sys/arm/at91/at91_machdep.c b/sys/arm/at91/at91_machdep.c index a7eb5f6f81e..15e404ffc60 100644 --- a/sys/arm/at91/at91_machdep.c +++ b/sys/arm/at91/at91_machdep.c @@ -70,6 +70,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -89,13 +90,16 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include -#define KERNEL_PT_SYS 0 /* Page table for mapping proc0 zero page */ +/* Page table for mapping proc0 zero page */ +#define KERNEL_PT_SYS 0 #define KERNEL_PT_KERN 1 #define KERNEL_PT_KERN_NUM 22 -#define KERNEL_PT_AFKERNEL KERNEL_PT_KERN + KERNEL_PT_KERN_NUM /* L2 table for mapping after kernel */ +/* L2 table for mapping after kernel */ +#define KERNEL_PT_AFKERNEL KERNEL_PT_KERN + KERNEL_PT_KERN_NUM #define KERNEL_PT_AFKERNEL_NUM 5 /* this should be evenly divisable by PAGE_SIZE / L2_TABLE_SIZE_REAL (or 4) */ @@ -112,10 +116,6 @@ extern u_int undefined_handler_address; struct pv_addr kernel_pt_table[NUM_KERNEL_PTS]; -extern void *_end; - -extern int *end; - struct pcpu __pcpu; struct pcpu *pcpup = &__pcpu; @@ -123,7 +123,6 @@ struct pcpu *pcpup = &__pcpu; vm_paddr_t phys_avail[10]; vm_paddr_t dump_avail[4]; -vm_offset_t physical_pages; struct pv_addr systempage; struct pv_addr msgbufpv; @@ -132,11 +131,6 @@ struct pv_addr undstack; struct pv_addr abtstack; struct pv_addr kernelstack; -static void *boot_arg1; -static void *boot_arg2; - -static struct trapframe proc0_tf; - /* Static device mappings. */ const struct pmap_devmap at91_devmap[] = { /* @@ -155,7 +149,8 @@ const struct pmap_devmap at91_devmap[] = { VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, - /* We can't just map the OHCI registers VA == PA, because + /* + * We can't just map the OHCI registers VA == PA, because * AT91xx_xxx_BASE belongs to the userland address space. * We could just choose a different virtual address, but a better * solution would probably be to just use pmap_mapdev() to allocate @@ -185,8 +180,10 @@ const struct pmap_devmap at91_devmap[] = { VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, - /* The next two should be good for the 9260, 9261 and 9G20 since - * addresses mapping is the same. */ + /* + * The next two should be good for the 9260, 9261 and 9G20 since + * addresses mapping is the same. + */ { /* Internal Memory 1MB */ AT91SAM9G20_OHCI_BASE, @@ -206,12 +203,24 @@ const struct pmap_devmap at91_devmap[] = { { 0, 0, 0, 0, 0, } }; +#ifdef LINUX_BOOT_ABI +extern int membanks; +extern int memstart[]; +extern int memsize[]; +#endif + long at91_ramsize(void) { - uint32_t *SDRAMC = (uint32_t *)(AT91_BASE + AT91RM92_SDRAMC_BASE); - uint32_t cr, mr; + uint32_t cr, mr, *SDRAMC; int banks, rows, cols, bw; +#ifdef LINUX_BOOT_ABI + /* + * If we found any ATAGs that were for memory, return the first bank. + */ + if (membanks > 0) + return (memsize[0]); +#endif if (at91_is_rm92()) { SDRAMC = (uint32_t *)(AT91_BASE + AT91RM92_SDRAMC_BASE); @@ -222,8 +231,10 @@ at91_ramsize(void) cols = (cr & AT91RM92_SDRAMC_CR_NC_MASK) + 8; bw = (mr & AT91RM92_SDRAMC_MR_DBW_16) ? 1 : 2; } else { - /* This should be good for the 9260, 9261 and 9G20 as addresses - * and registers are the same */ + /* + * This should be good for the 9260, 9261, 9G20, 9G35 and 9X25 + * as addresses and registers are the same. + */ SDRAMC = (uint32_t *)(AT91_BASE + AT91SAM9G20_SDRAMC_BASE); cr = SDRAMC[AT91SAM9G20_SDRAMC_CR / 4]; mr = SDRAMC[AT91SAM9G20_SDRAMC_MR / 4]; @@ -236,8 +247,180 @@ at91_ramsize(void) return (1 << (cols + rows + banks + bw)); } +static const char *soc_type_name[] = { + [AT91_T_CAP9] = "at91cap9", + [AT91_T_RM9200] = "at91rm9200", + [AT91_T_SAM9260] = "at91sam9260", + [AT91_T_SAM9261] = "at91sam9261", + [AT91_T_SAM9263] = "at91sam9263", + [AT91_T_SAM9G10] = "at91sam9g10", + [AT91_T_SAM9G20] = "at91sam9g20", + [AT91_T_SAM9G45] = "at91sam9g45", + [AT91_T_SAM9N12] = "at91sam9n12", + [AT91_T_SAM9RL] = "at91sam9rl", + [AT91_T_SAM9X5] = "at91sam9x5", + [AT91_T_NONE] = "UNKNOWN" +}; + +static const char *soc_subtype_name[] = { + [AT91_ST_NONE] = "UNKNOWN", + [AT91_ST_RM9200_BGA] = "at91rm9200_bga", + [AT91_ST_RM9200_PQFP] = "at91rm9200_pqfp", + [AT91_ST_SAM9XE] = "at91sam9xe", + [AT91_ST_SAM9G45] = "at91sam9g45", + [AT91_ST_SAM9M10] = "at91sam9m10", + [AT91_ST_SAM9G46] = "at91sam9g46", + [AT91_ST_SAM9M11] = "at91sam9m11", + [AT91_ST_SAM9G15] = "at91sam9g15", + [AT91_ST_SAM9G25] = "at91sam9g25", + [AT91_ST_SAM9G35] = "at91sam9g35", + [AT91_ST_SAM9X25] = "at91sam9x25", + [AT91_ST_SAM9X35] = "at91sam9x35", +}; + +struct at91_soc_info soc_data; + +/* + * Read the SoC ID from the CIDR register and try to match it against the + * values we know. If we find a good one, we return true. If not, we + * return false. When we find a good one, we also find the subtype + * and CPU family. + */ +static int +at91_try_id(uint32_t dbgu_base) +{ + uint32_t socid; + + soc_data.cidr = *(volatile uint32_t *)(AT91_BASE + dbgu_base + + DBGU_C1R); + socid = soc_data.cidr & ~AT91_CPU_VERSION_MASK; + + soc_data.type = AT91_T_NONE; + soc_data.subtype = AT91_ST_NONE; + soc_data.family = (soc_data.cidr & AT91_CPU_FAMILY_MASK) >> 20; + soc_data.exid = *(volatile uint32_t *)(AT91_BASE + dbgu_base + + DBGU_C2R); + + switch (socid) { + case AT91_CPU_CAP9: + soc_data.type = AT91_T_CAP9; + break; + case AT91_CPU_RM9200: + soc_data.type = AT91_T_RM9200; + break; + case AT91_CPU_SAM9XE128: + case AT91_CPU_SAM9XE256: + case AT91_CPU_SAM9XE512: + case AT91_CPU_SAM9260: + soc_data.type = AT91_T_SAM9260; + if (soc_data.family == AT91_FAMILY_SAM9XE) + soc_data.subtype = AT91_ST_SAM9XE; + break; + case AT91_CPU_SAM9261: + soc_data.type = AT91_T_SAM9261; + break; + case AT91_CPU_SAM9263: + soc_data.type = AT91_T_SAM9263; + break; + case AT91_CPU_SAM9G10: + soc_data.type = AT91_T_SAM9G10; + break; + case AT91_CPU_SAM9G20: + soc_data.type = AT91_T_SAM9G20; + break; + case AT91_CPU_SAM9G45: + soc_data.type = AT91_T_SAM9G45; + break; + case AT91_CPU_SAM9N12: + soc_data.type = AT91_T_SAM9N12; + break; + case AT91_CPU_SAM9RL64: + soc_data.type = AT91_T_SAM9RL; + break; + case AT91_CPU_SAM9X5: + soc_data.type = AT91_T_SAM9X5; + break; + default: + return (0); + } + + switch (soc_data.type) { + case AT91_T_SAM9G45: + switch (soc_data.exid) { + case AT91_EXID_SAM9G45: + soc_data.subtype = AT91_ST_SAM9G45; + break; + case AT91_EXID_SAM9G46: + soc_data.subtype = AT91_ST_SAM9G46; + break; + case AT91_EXID_SAM9M10: + soc_data.subtype = AT91_ST_SAM9M10; + break; + case AT91_EXID_SAM9M11: + soc_data.subtype = AT91_ST_SAM9M11; + break; + } + break; + case AT91_T_SAM9X5: + switch (soc_data.exid) { + case AT91_EXID_SAM9G15: + soc_data.subtype = AT91_ST_SAM9G15; + break; + case AT91_EXID_SAM9G25: + soc_data.subtype = AT91_ST_SAM9G25; + break; + case AT91_EXID_SAM9G35: + soc_data.subtype = AT91_ST_SAM9G35; + break; + case AT91_EXID_SAM9X25: + soc_data.subtype = AT91_ST_SAM9X25; + break; + case AT91_EXID_SAM9X35: + soc_data.subtype = AT91_ST_SAM9X35; + break; + } + break; + default: + break; + } + /* + * Disable interrupts + */ + *(volatile uint32_t *)(AT91_BASE + dbgu_base + USART_IDR) = 0xffffffff; + + /* + * Save the name for later... + */ + snprintf(soc_data.name, sizeof(soc_data.name), "%s%s%s", + soc_type_name[soc_data.type], + soc_data.subtype == AT91_ST_NONE ? "" : " subtype ", + soc_data.subtype == AT91_ST_NONE ? "" : + soc_subtype_name[soc_data.subtype]); + return (1); +} + +static void +at91_soc_id(void) +{ + + if (!at91_try_id(AT91_DBGU0)) + at91_try_id(AT91_DBGU1); +} + +#ifdef ARM_MANY_BOARD +/* likely belongs in arm/arm/machdep.c, but since board_init is still at91 only... */ +SET_DECLARE(arm_board_set, const struct arm_board); + +/* Not yet fully functional, but enough to build ATMEL config */ +static long +board_init(void) +{ + return -1; +} +#endif + void * -initarm(void *arg, void *arg2) +initarm(struct arm_boot_params *abp) { struct pv_addr kernel_l1pt; struct pv_addr dpcpu; @@ -248,10 +431,8 @@ initarm(void *arg, void *arg2) uint32_t memsize; vm_offset_t lastaddr; - boot_arg1 = arg; - boot_arg2 = arg2; + lastaddr = parse_boot_param(abp); set_cpufuncs(); - lastaddr = fake_preload_metadata(); pcpu_init(pcpup, 0, sizeof(struct pcpu)); PCPU_SET(curthread, &thread0); @@ -260,13 +441,13 @@ initarm(void *arg, void *arg2) freemempos = (lastaddr + PAGE_MASK) & ~PAGE_MASK; /* Define a macro to simplify memory allocation */ -#define valloc_pages(var, np) \ - alloc_pages((var).pv_va, (np)); \ +#define valloc_pages(var, np) \ + alloc_pages((var).pv_va, (np)); \ (var).pv_pa = (var).pv_va + (KERNPHYSADDR - KERNVIRTADDR); -#define alloc_pages(var, np) \ - (var) = freemempos; \ - freemempos += (np * PAGE_SIZE); \ +#define alloc_pages(var, np) \ + (var) = freemempos; \ + freemempos += (np * PAGE_SIZE); \ memset((char *)(var), 0, ((np) * PAGE_SIZE)); while (((freemempos - L1_TABLE_SIZE) & (L1_TABLE_SIZE - 1)) != 0) @@ -284,7 +465,6 @@ initarm(void *arg, void *arg2) kernel_pt_table[loop].pv_va - KERNVIRTADDR + KERNPHYSADDR; } - i++; } /* * Allocate a page for the system page mapped to V0x00000000 @@ -361,11 +541,12 @@ initarm(void *arg, void *arg2) cpu_tlb_flushID(); cpu_domains(DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)); - cninit(); + at91_soc_id(); - /* Get chip id so device drivers know about differences */ - at91_chip_id = *(volatile uint32_t *) - (AT91_BASE + AT91_DBGU_BASE + DBGU_C1R); + /* Initialize all the clocks, so that the console can work */ + at91_pmc_init_clock(); + + cninit(); memsize = board_init(); physmem = memsize / PAGE_SIZE; @@ -405,30 +586,13 @@ initarm(void *arg, void *arg2) undefined_handler_address = (u_int)undefinedinstruction_bounce; undefined_init(); - proc_linkup0(&proc0, &thread0); - thread0.td_kstack = kernelstack.pv_va; - thread0.td_pcb = (struct pcb *) - (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; - thread0.td_pcb->pcb_flags = 0; - thread0.td_frame = &proc0_tf; - pcpup->pc_curpcb = thread0.td_pcb; + init_proc0(kernelstack.pv_va); arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL); pmap_curmaxkvaddr = afterkern + L1_S_SIZE * (KERNEL_PT_KERN_NUM - 1); - - /* - * ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before - * calling pmap_bootstrap. - */ - dump_avail[0] = PHYSADDR; - dump_avail[1] = PHYSADDR + memsize; - dump_avail[2] = 0; - dump_avail[3] = 0; - - pmap_bootstrap(freemempos, - KERNVIRTADDR + 3 * memsize, - &kernel_l1pt); + arm_dump_avail_init(memsize, sizeof(dump_avail)/sizeof(dump_avail[0])); + pmap_bootstrap(freemempos, KERNVIRTADDR + 3 * memsize, &kernel_l1pt); msgbufp = (void*)msgbufpv.pv_va; msgbufinit(msgbufp, msgbufsize); mutex_init(); @@ -447,3 +611,42 @@ initarm(void *arg, void *arg2) return ((void *)(kernelstack.pv_va + USPACE_SVC_STACK_TOP - sizeof(struct pcb))); } + +/* + * These functions are handled elsewhere, so make them nops here. + */ +void +cpu_startprofclock(void) +{ + +} + +void +cpu_stopprofclock(void) +{ + +} + +void +cpu_initclocks(void) +{ + +} + +void +DELAY(int n) +{ + + if (soc_data.delay) + soc_data.delay(n); +} + +void +cpu_reset(void) +{ + + if (soc_data.reset) + soc_data.reset(); + while (1) + continue; +} diff --git a/sys/arm/at91/at91_mci.c b/sys/arm/at91/at91_mci.c index 56cff68f262..f69477ecc78 100644 --- a/sys/arm/at91/at91_mci.c +++ b/sys/arm/at91/at91_mci.c @@ -155,8 +155,8 @@ at91_mci_init(device_t dev) #ifndef AT91_MCI_SLOT_B WR4(sc, MCI_SDCR, 0); /* SLOT A, 1 bit bus */ #else - /* XXX Really should add second "unit" but nobody using using - * a two slot card that we know of. XXX */ + /* XXX Really should add second "unit" but nobody using using + * a two slot card that we know of. -- except they are... XXX */ WR4(sc, MCI_SDCR, 1); /* SLOT B, 1 bit bus */ #endif } @@ -313,23 +313,17 @@ static int at91_mci_is_mci1rev2xx(void) { - switch (AT91_CPU(at91_chip_id)) { - case AT91_CPU_SAM9260: - case AT91_CPU_SAM9263: -#ifdef notyet - case AT91_CPU_CAP9: -#endif - case AT91_CPU_SAM9G10: - case AT91_CPU_SAM9G20: -#ifdef notyet - case AT91_CPU_SAM9RL: -#endif - case AT91_CPU_SAM9XE128: - case AT91_CPU_SAM9XE256: - case AT91_CPU_SAM9XE512: + switch (soc_data.type) { + case AT91_T_SAM9260: + case AT91_T_SAM9263: + case AT91_T_CAP9: + case AT91_T_SAM9G10: + case AT91_T_SAM9G20: + case AT91_T_SAM9RL: return(1); + default: + return (0); } - return (0); } static void diff --git a/sys/arm/at91/at91_pio.c b/sys/arm/at91/at91_pio.c index eabd11a37f0..ae5f91e7828 100644 --- a/sys/arm/at91/at91_pio.c +++ b/sys/arm/at91/at91_pio.c @@ -143,9 +143,10 @@ at91_pio_attach(device_t dev) if (err) goto out; - device_printf(dev, "ABSR: %#x OSR: %#x PSR:%#x ODSR: %#x\n", - RD4(sc, PIO_ABSR), RD4(sc, PIO_OSR), RD4(sc, PIO_PSR), - RD4(sc, PIO_ODSR)); + if (bootverbose) + device_printf(dev, "ABSR: %#x OSR: %#x PSR:%#x ODSR: %#x\n", + RD4(sc, PIO_ABSR), RD4(sc, PIO_OSR), RD4(sc, PIO_PSR), + RD4(sc, PIO_ODSR)); AT91_PIO_LOCK_INIT(sc); /* diff --git a/sys/arm/at91/at91_pio_rm9200.h b/sys/arm/at91/at91_pio_rm9200.h index fa4fae3d42a..809262ff14d 100644 --- a/sys/arm/at91/at91_pio_rm9200.h +++ b/sys/arm/at91/at91_pio_rm9200.h @@ -161,13 +161,13 @@ #define AT91C_PD1_ETX1 (AT91C_PIO_PD1) // Ethernet MAC Transmit Data 1 #define AT91C_PD10_PCK3 (AT91C_PIO_PD10) // PMC Programmable Clock Output 3 #define AT91C_PD10_TPS1 (AT91C_PIO_PD10) // ETM ARM9 pipeline status 1 -#define AT91C_PD11_ (AT91C_PIO_PD11) // +#define AT91C_PD11_ (AT91C_PIO_PD11) // #define AT91C_PD11_TPS2 (AT91C_PIO_PD11) // ETM ARM9 pipeline status 2 -#define AT91C_PD12_ (AT91C_PIO_PD12) // +#define AT91C_PD12_ (AT91C_PIO_PD12) // #define AT91C_PD12_TPK0 (AT91C_PIO_PD12) // ETM Trace Packet 0 -#define AT91C_PD13_ (AT91C_PIO_PD13) // +#define AT91C_PD13_ (AT91C_PIO_PD13) // #define AT91C_PD13_TPK1 (AT91C_PIO_PD13) // ETM Trace Packet 1 -#define AT91C_PD14_ (AT91C_PIO_PD14) // +#define AT91C_PD14_ (AT91C_PIO_PD14) // #define AT91C_PD14_TPK2 (AT91C_PIO_PD14) // ETM Trace Packet 2 #define AT91C_PD15_TD0 (AT91C_PIO_PD15) // SSC Transmit data #define AT91C_PD15_TPK3 (AT91C_PIO_PD15) // ETM Trace Packet 3 diff --git a/sys/arm/at91/at91_pioreg.h b/sys/arm/at91/at91_pioreg.h index e3f2ea3d489..3d7a5cc48f4 100644 --- a/sys/arm/at91/at91_pioreg.h +++ b/sys/arm/at91/at91_pioreg.h @@ -28,6 +28,7 @@ #ifndef ARM_AT91_AT91_PIOREG_H #define ARM_AT91_AT91_PIOREG_H +#ifndef ATMEL_ENV /* Registers */ #define PIO_PER 0x00 /* PIO Enable Register */ #define PIO_PDR 0x04 /* PIO Disable Register */ @@ -65,6 +66,7 @@ #define PIO_OWDR 0xa4 /* PIO Output Write Disable Register */ #define PIO_OWSR 0xa8 /* PIO Output Write Status Register */ /* 0xac reserved */ +#endif #define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 #define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 diff --git a/sys/arm/at91/at91_pit.c b/sys/arm/at91/at91_pit.c index 693dae86ecf..853dddcfa34 100644 --- a/sys/arm/at91/at91_pit.c +++ b/sys/arm/at91/at91_pit.c @@ -48,6 +48,10 @@ __FBSDID("$FreeBSD$"); #include #include +#ifndef PIT_PRESCALE +#define PIT_PRESCALE (16) +#endif + static struct pit_softc { struct resource *mem_res; /* Memory resource */ void *intrhand; /* Interrupt handle */ @@ -55,6 +59,8 @@ static struct pit_softc { } *sc; static uint32_t timecount = 0; +static unsigned at91_pit_get_timecount(struct timecounter *tc); +static int pit_intr(void *arg); static inline uint32_t RD4(struct pit_softc *sc, bus_size_t off) @@ -70,15 +76,31 @@ WR4(struct pit_softc *sc, bus_size_t off, uint32_t val) bus_write_4(sc->mem_res, off, val); } -static unsigned at91pit_get_timecount(struct timecounter *tc); -static int pit_intr(void *arg); +void +at91_pit_delay(int us) +{ + int32_t cnt, last, piv; + uint64_t pit_freq; + const uint64_t mhz = 1E6; -#ifndef PIT_PRESCALE -#define PIT_PRESCALE (16) -#endif + last = PIT_PIV(RD4(sc, PIT_PIIR)); -static struct timecounter at91pit_timecounter = { - at91pit_get_timecount, /* get_timecount */ + /* Max delay ~= 260s. @ 133Mhz */ + pit_freq = at91_master_clock / PIT_PRESCALE; + cnt = ((pit_freq * us) + (mhz -1)) / mhz; + cnt = (cnt <= 0) ? 1 : cnt; + + while (cnt > 0) { + piv = PIT_PIV(RD4(sc, PIT_PIIR)); + cnt -= piv - last ; + if (piv < last) + cnt -= PIT_PIV(~0u) - last; + last = piv; + } +} + +static struct timecounter at91_pit_timecounter = { + at91_pit_get_timecount, /* get_timecount */ NULL, /* no poll_pps */ 0xffffffff, /* counter mask */ 0 / PIT_PRESCALE, /* frequency */ @@ -87,18 +109,15 @@ static struct timecounter at91pit_timecounter = { }; static int -at91pit_probe(device_t dev) +at91_pit_probe(device_t dev) { - if (at91_is_sam9() || at91_is_sam9xe()) { - device_set_desc(dev, "AT91SAM9 PIT"); - return (0); - } - return (ENXIO); + device_set_desc(dev, "AT91SAM9 PIT"); + return (0); } static int -at91pit_attach(device_t dev) +at91_pit_attach(device_t dev) { void *ih; int rid, err = 0; @@ -129,8 +148,8 @@ at91pit_attach(device_t dev) err = bus_setup_intr(dev, irq, INTR_TYPE_CLK, pit_intr, NULL, NULL, &ih); - at91pit_timecounter.tc_frequency = at91_master_clock / PIT_PRESCALE; - tc_init(&at91pit_timecounter); + at91_pit_timecounter.tc_frequency = at91_master_clock / PIT_PRESCALE; + tc_init(&at91_pit_timecounter); /* Enable the PIT here. */ WR4(sc, PIT_MR, PIT_PIV(at91_master_clock / PIT_PRESCALE / hz) | @@ -139,21 +158,21 @@ out: return (err); } -static device_method_t at91pit_methods[] = { - DEVMETHOD(device_probe, at91pit_probe), - DEVMETHOD(device_attach, at91pit_attach), +static device_method_t at91_pit_methods[] = { + DEVMETHOD(device_probe, at91_pit_probe), + DEVMETHOD(device_attach, at91_pit_attach), DEVMETHOD_END }; -static driver_t at91pit_driver = { +static driver_t at91_pit_driver = { "at91_pit", - at91pit_methods, + at91_pit_methods, sizeof(struct pit_softc), }; -static devclass_t at91pit_devclass; +static devclass_t at91_pit_devclass; -DRIVER_MODULE(at91_pit, atmelarm, at91pit_driver, at91pit_devclass, NULL, +DRIVER_MODULE(at91_pit, atmelarm, at91_pit_driver, at91_pit_devclass, NULL, NULL); static int @@ -175,7 +194,7 @@ pit_intr(void *arg) } static unsigned -at91pit_get_timecount(struct timecounter *tc) +at91_pit_get_timecount(struct timecounter *tc) { uint32_t piir, icnt; @@ -183,47 +202,3 @@ at91pit_get_timecount(struct timecounter *tc) icnt = piir >> 20; /* Overflows */ return (timecount + PIT_PIV(piir) + PIT_PIV(RD4(sc, PIT_MR)) * icnt); } - -void -DELAY(int us) -{ - int32_t cnt, last, piv; - uint64_t pit_freq; - const uint64_t mhz = 1E6; - - last = PIT_PIV(RD4(sc, PIT_PIIR)); - - /* Max delay ~= 260s. @ 133Mhz */ - pit_freq = at91_master_clock / PIT_PRESCALE; - cnt = ((pit_freq * us) + (mhz -1)) / mhz; - cnt = (cnt <= 0) ? 1 : cnt; - - while (cnt > 0) { - piv = PIT_PIV(RD4(sc, PIT_PIIR)); - cnt -= piv - last ; - if (piv < last) - cnt -= PIT_PIV(~0u) - last; - last = piv; - } -} - -/* - * The 3 next functions must be implement with the future PLL code. - */ -void -cpu_startprofclock(void) -{ - -} - -void -cpu_stopprofclock(void) -{ - -} - -void -cpu_initclocks(void) -{ - -} diff --git a/sys/arm/at91/at91_pitreg.h b/sys/arm/at91/at91_pitreg.h index 333271eee83..5e87e397255 100644 --- a/sys/arm/at91/at91_pitreg.h +++ b/sys/arm/at91/at91_pitreg.h @@ -25,10 +25,10 @@ /* $FreeBSD$ */ -#ifndef ARM_AT91_AT91PITREG_H -#define ARM_AT91_AT91PITREG_H +#ifndef ARM_AT91_AT91_PITREG_H +#define ARM_AT91_AT91_PITREG_H -#define PIT_MR 0x0 +#define PIT_MR 0x0 #define PIT_SR 0x4 #define PIT_PIVR 0x8 #define PIT_PIIR 0xc @@ -42,4 +42,6 @@ /* PIT_SR */ #define PIT_PITS_DONE 1 /* interrupt done */ -#endif /* ARM_AT91_AT91PITREG_H */ +void at91_pit_delay(int us); + +#endif /* ARM_AT91_AT91_PITREG_H */ diff --git a/sys/arm/at91/at91_pmc.c b/sys/arm/at91/at91_pmc.c index 125e241a1b7..799a87b8f95 100644 --- a/sys/arm/at91/at91_pmc.c +++ b/sys/arm/at91/at91_pmc.c @@ -55,13 +55,15 @@ static struct at91_pmc_softc { bus_space_handle_t sc_sh; struct resource *mem_res; /* Memory resource */ device_t dev; - unsigned int main_clock_hz; - uint32_t pllb_init; } *pmc_softc; +static uint32_t pllb_init; + MALLOC_DECLARE(M_PMC); MALLOC_DEFINE(M_PMC, "at91_pmc_clocks", "AT91 PMC Clock descriptors"); +#define AT91_PMC_BASE 0xffffc00 + static void at91_pmc_set_pllb_mode(struct at91_pmc_clock *, int); static void at91_pmc_set_sys_mode(struct at91_pmc_clock *, int); static void at91_pmc_set_periph_mode(struct at91_pmc_clock *, int); @@ -147,22 +149,15 @@ static struct at91_pmc_clock *clock_list[16+32] = { &cpu }; -#if !defined(AT91C_MAIN_CLOCK) -static const unsigned int at91_mainf_tbl[] = { - 3000000, 3276800, 3686400, 3840000, 4000000, - 4433619, 4915200, 5000000, 5242880, 6000000, - 6144000, 6400000, 6553600, 7159090, 7372800, - 7864320, 8000000, 9830400, 10000000, 11059200, - 12000000, 12288000, 13560000, 14318180, 14745600, - 16000000, 17344700, 18432000, 20000000 -}; -#define MAINF_TBL_LEN (sizeof(at91_mainf_tbl) / sizeof(*at91_mainf_tbl)) -#endif - static inline uint32_t RD4(struct at91_pmc_softc *sc, bus_size_t off) { + if (sc == NULL) { + uint32_t *p = (uint32_t *)(AT91_BASE + AT91_PMC_BASE + off); + + return *p; + } return (bus_read_4(sc->mem_res, off)); } @@ -170,7 +165,12 @@ static inline void WR4(struct at91_pmc_softc *sc, bus_size_t off, uint32_t val) { - bus_write_4(sc->mem_res, off, val); + if (sc == NULL) { + uint32_t *p = (uint32_t *)(AT91_BASE + AT91_PMC_BASE + off); + + *p = val; + } else + bus_write_4(sc->mem_res, off, val); } void @@ -181,7 +181,7 @@ at91_pmc_set_pllb_mode(struct at91_pmc_clock *clk, int on) if (on) { on = PMC_IER_LOCKB; - value = sc->pllb_init; + value = pllb_init; } else value = 0; @@ -401,31 +401,85 @@ fail: return (0); } -static void -at91_pmc_init_clock(struct at91_pmc_softc *sc, unsigned int main_clock) +#if !defined(AT91C_MAIN_CLOCK) +static const unsigned int at91_main_clock_tbl[] = { + 3000000, 3276800, 3686400, 3840000, 4000000, + 4433619, 4915200, 5000000, 5242880, 6000000, + 6144000, 6400000, 6553600, 7159090, 7372800, + 7864320, 8000000, 9830400, 10000000, 11059200, + 12000000, 12288000, 13560000, 14318180, 14745600, + 16000000, 17344700, 18432000, 20000000 +}; +#define MAIN_CLOCK_TBL_LEN (sizeof(at91_main_clock_tbl) / sizeof(*at91_main_clock_tbl)) +#endif + +static unsigned int +at91_pmc_sense_main_clock(void) { +#if !defined(AT91C_MAIN_CLOCK) + unsigned int ckgr_val; + unsigned int diff, matchdiff, freq; + int i; + + ckgr_val = (RD4(NULL, CKGR_MCFR) & CKGR_MCFR_MAINF_MASK) << 11; + + /* + * Clocks up to 50MHz can be connected to some models. If + * the frequency is >= 21MHz, assume that the slow clock can + * measure it correctly, and that any error can be adequately + * compensated for by roudning to the nearest 500Hz. Users + * with fast, or odd-ball clocks will need to set + * AT91C_MAIN_CLOCK in the kernel config file. + */ + if (ckgr_val >= 21000000) + return ((ckgr_val + 250) / 500 * 500); + + /* + * Try to find the standard frequency that match best. + */ + freq = at91_main_clock_tbl[0]; + matchdiff = abs(ckgr_val - at91_main_clock_tbl[0]); + for (i = 1; i < MAIN_CLOCK_TBL_LEN; i++) { + diff = abs(ckgr_val - at91_main_clock_tbl[i]); + if (diff < matchdiff) { + freq = at91_main_clock_tbl[i]; + matchdiff = diff; + } + } + return (freq); +#else + return (AT91C_MAIN_CLOCK); +#endif +} + +void +at91_pmc_init_clock(void) +{ + struct at91_pmc_softc *sc = NULL; + unsigned int main_clock; uint32_t mckr; uint32_t mdiv; + main_clock = at91_pmc_sense_main_clock(); + if (at91_is_sam9() || at91_is_sam9xe()) { uhpck.pmc_mask = PMC_SCER_UHP_SAM9; udpck.pmc_mask = PMC_SCER_UDP_SAM9; } mckr = RD4(sc, PMC_MCKR); - sc->main_clock_hz = main_clock; main_ck.hz = main_clock; at91_pmc_pll_rate(&plla, RD4(sc, CKGR_PLLAR)); - if (at91_cpu_is(AT91_CPU_SAM9G45) && (mckr & PMC_MCKR_PLLADIV2)) + if (at91_cpu_is(AT91_T_SAM9G45) && (mckr & PMC_MCKR_PLLADIV2)) plla.hz /= 2; /* * Initialize the usb clock. This sets up pllb, but disables the * actual clock. */ - sc->pllb_init = at91_pmc_pll_calc(&pllb, 48000000 * 2) | 0x10000000; - at91_pmc_pll_rate(&pllb, sc->pllb_init); + pllb_init = at91_pmc_pll_calc(&pllb, 48000000 * 2) | 0x10000000; + at91_pmc_pll_rate(&pllb, pllb_init); #if 0 /* Turn off USB clocks */ @@ -458,16 +512,14 @@ at91_pmc_init_clock(struct at91_pmc_softc *sc, unsigned int main_clock) mck.hz /= (1 + mdiv); /* Only found on SAM9G20 */ - if (at91_cpu_is(AT91_CPU_SAM9G20)) + if (at91_cpu_is(AT91_T_SAM9G20)) cpu.hz /= (mckr & PMC_MCKR_PDIV) ? 2 : 1; at91_master_clock = mck.hz; - device_printf(sc->dev, - "Primary: %d Hz PLLA: %d MHz CPU: %d MHz MCK: %d MHz\n", - sc->main_clock_hz, - plla.hz / 1000000, - cpu.hz / 1000000, mck.hz / 1000000); + /* These clocks refrenced by "special" names */ + at91_pmc_clock_alias("ohci0", "ohci_clk"); + at91_pmc_clock_alias("udp0", "udp_clk"); /* Turn off "Progamable" clocks */ WR4(sc, PMC_SCDR, PMC_SCER_PCK0 | PMC_SCER_PCK1 | PMC_SCER_PCK2 | @@ -519,36 +571,9 @@ at91_pmc_probe(device_t dev) return (0); } -#if !defined(AT91C_MAIN_CLOCK) -static unsigned int -at91_pmc_sense_mainf(struct at91_pmc_softc *sc) -{ - unsigned int ckgr_val; - unsigned int diff, matchdiff; - int i, match; - - ckgr_val = (RD4(sc, CKGR_MCFR) & CKGR_MCFR_MAINF_MASK) << 11; - - /* - * Try to find the standard frequency that match best. - */ - match = 0; - matchdiff = abs(ckgr_val - at91_mainf_tbl[0]); - for (i = 1; i < MAINF_TBL_LEN; i++) { - diff = abs(ckgr_val - at91_mainf_tbl[i]); - if (diff < matchdiff) { - match = i; - matchdiff = diff; - } - } - return (at91_mainf_tbl[match]); -} -#endif - static int at91_pmc_attach(device_t dev) { - unsigned int mainf; int err; pmc_softc = device_get_softc(dev); @@ -559,16 +584,16 @@ at91_pmc_attach(device_t dev) /* * Configure main clock frequency. */ -#if !defined(AT91C_MAIN_CLOCK) - mainf = at91_pmc_sense_mainf(pmc_softc); -#else - mainf = AT91C_MAIN_CLOCK; -#endif - at91_pmc_init_clock(pmc_softc, mainf); + at91_pmc_init_clock(); - /* These clocks refrenced by "special" names */ - at91_pmc_clock_alias("ohci0", "ohci_clk"); - at91_pmc_clock_alias("udp0", "udp_clk"); + /* + * Display info about clocks previously computed + */ + device_printf(dev, + "Primary: %d Hz PLLA: %d MHz CPU: %d MHz MCK: %d MHz\n", + main_ck.hz, + plla.hz / 1000000, + cpu.hz / 1000000, mck.hz / 1000000); return (0); } diff --git a/sys/arm/at91/at91_pmcvar.h b/sys/arm/at91/at91_pmcvar.h index 22255d698a1..1593a85e74e 100644 --- a/sys/arm/at91/at91_pmcvar.h +++ b/sys/arm/at91/at91_pmcvar.h @@ -28,7 +28,7 @@ #ifndef ARM_AT91_AT91_PMCVAR_H #define ARM_AT91_AT91_PMCVAR_H -struct at91_pmc_clock +struct at91_pmc_clock { char *name; uint32_t hz; @@ -55,7 +55,7 @@ struct at91_pmc_clock uint32_t (*set_outb)(int); }; -struct at91_pmc_clock * at91_pmc_clock_add(const char *name, uint32_t irq, +struct at91_pmc_clock *at91_pmc_clock_add(const char *name, uint32_t irq, struct at91_pmc_clock *parent); struct at91_pmc_clock *at91_pmc_clock_ref(const char *name); void at91_pmc_clock_deref(struct at91_pmc_clock *); diff --git a/sys/arm/at91/at91_reset.S b/sys/arm/at91/at91_reset.S index e3b1d007256..28703cc0f48 100644 --- a/sys/arm/at91/at91_reset.S +++ b/sys/arm/at91/at91_reset.S @@ -1,31 +1,31 @@ #include #include +#include #include __FBSDID("$FreeBSD$"); -#define SDRAM_TR (AT91SAM9G20_BASE + \ +#define SDRAM_TR (AT91_BASE + \ AT91SAM9G20_SDRAMC_BASE + AT91SAM9G20_SDRAMC_TR) -#define SDRAM_LPR (AT91SAM9G20_BASE + \ +#define SDRAM_LPR (AT91_BASE + \ AT91SAM9G20_SDRAMC_BASE + AT91SAM9G20_SDRAMC_LPR) -#define RSTC_RCR (AT91SAM9G20_BASE + \ +#define RSTC_RCR (AT91_BASE + \ AT91SAM9G20_RSTC_BASE + RST_CR) -/* +/* * From AT91SAM9G20 Datasheet errata 44:3.5: * * When User Reset occurs durring SDRAM read acces, eh SDRAM clock is turned * off while data are ready to be read on the data bus. The SDRAM maintains - * the data until the clock restarts. - * - * If the User reset is programed to assert a general reset, the data + * the data until the clock restarts. + * * If the User reset is programed to assert a general reset, the data * maintained by the SDRAM leads to a data bus conflict and adversly affects * the boot memories connected to the EBI: * + NAND Flash boot functionality, if the system boots out of internal ROM. - * + NOR Flash boot, if the system boots on an external memory connected to + * + NOR Flash boot, if the system boots on an external memory connected to * the EBI CS0. * - * Assembly code is mandatory for the following sequnce as ARM + * Assembly code is mandatory for the following sequnce as ARM * instructions need to be piplined. * */ @@ -39,12 +39,12 @@ ENTRY(cpu_reset_sam9g20) /* Change Refresh to block all data access */ ldr r0, =SDRAM_TR - ldr r1, =1 + ldr r1, =1 str r1, [r0] /* Prepare power down command */ ldr r0, =SDRAM_LPR - ldr r1, =2 + ldr r1, =2 /* Prepare proc_reset and periph reset */ ldr r2, =RSTC_RCR diff --git a/sys/arm/at91/at91_rst.c b/sys/arm/at91/at91_rst.c index 76cc43c4340..0879072061a 100644 --- a/sys/arm/at91/at91_rst.c +++ b/sys/arm/at91/at91_rst.c @@ -42,50 +42,70 @@ __FBSDID("$FreeBSD$"); #define RST_TIMEOUT (5) /* Seconds to hold NRST for hard reset */ #define RST_TICK (20) /* sample NRST at hz/RST_TICK intervals */ -static int rst_intr(void *arg); +static int at91_rst_intr(void *arg); -static struct rst_softc { +static struct at91_rst_softc { struct resource *mem_res; /* Memory resource */ struct resource *irq_res; /* IRQ resource */ void *intrhand; /* Interrupt handle */ struct callout tick_ch; /* Tick callout */ device_t sc_dev; u_int shutdown; /* Shutdown in progress */ -} *rst_sc; +} *at91_rst_sc; static inline uint32_t -RD4(struct rst_softc *sc, bus_size_t off) +RD4(struct at91_rst_softc *sc, bus_size_t off) { return (bus_read_4(sc->mem_res, off)); } static inline void -WR4(struct rst_softc *sc, bus_size_t off, uint32_t val) +WR4(struct at91_rst_softc *sc, bus_size_t off, uint32_t val) { bus_write_4(sc->mem_res, off, val); } +void cpu_reset_sam9g20(void) __attribute__((weak)); +void cpu_reset_sam9g20(void) {} + +void +at91_rst_cpu_reset(void) +{ + + if (at91_rst_sc) { + cpu_reset_sam9g20(); /* May be null */ + + WR4(at91_rst_sc, RST_MR, + RST_MR_ERSTL(0xd) | RST_MR_URSTEN | RST_MR_KEY); + + WR4(at91_rst_sc, RST_CR, + RST_CR_PROCRST | + RST_CR_PERRST | + RST_CR_EXTRST | + RST_CR_KEY); + } + while(1) + continue; +} + static int at91_rst_probe(device_t dev) { - if (at91_is_sam9() || at91_is_sam9xe()) { - device_set_desc(dev, "AT91SAM9 Reset Controller"); - return (0); - } - return (ENXIO); + device_set_desc(dev, "AT91SAM9 Reset Controller"); + return (0); } static int at91_rst_attach(device_t dev) { - struct rst_softc *sc; + struct at91_rst_softc *sc; const char *cause; int rid, err; - rst_sc = sc = device_get_softc(dev); + at91_rst_sc = sc = device_get_softc(dev); sc->sc_dev = dev; callout_init(&sc->tick_ch, 0); @@ -109,11 +129,11 @@ at91_rst_attach(device_t dev) /* Activate the interrupt. */ err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_MPSAFE, - rst_intr, NULL, sc, &sc->intrhand); + at91_rst_intr, NULL, sc, &sc->intrhand); if (err) device_printf(dev, "could not establish interrupt handler.\n"); - WR4(rst_sc, RST_MR, RST_MR_ERSTL(0xd) | RST_MR_URSIEN | RST_MR_KEY); + WR4(at91_rst_sc, RST_MR, RST_MR_ERSTL(0xd) | RST_MR_URSIEN | RST_MR_KEY); switch (RD4(sc, RST_SR) & RST_SR_RST_MASK) { case RST_SR_RST_POW: @@ -137,16 +157,14 @@ at91_rst_attach(device_t dev) } device_printf(dev, "Reset cause: %s.\n", cause); - /* cpu_reset_addr = cpu_reset; */ - out: return (err); } static void -rst_tick(void *argp) +at91_rst_tick(void *argp) { - struct rst_softc *sc = argp; + struct at91_rst_softc *sc = argp; if (sc->shutdown++ >= RST_TIMEOUT * RST_TICK) { /* User released the button in morre than RST_TIMEOUT */ @@ -157,18 +175,18 @@ rst_tick(void *argp) device_printf(sc->sc_dev, "shutting down...\n"); shutdown_nice(0); } else { - callout_reset(&sc->tick_ch, hz/RST_TICK, rst_tick, sc); + callout_reset(&sc->tick_ch, hz/RST_TICK, at91_rst_tick, sc); } } static int -rst_intr(void *argp) +at91_rst_intr(void *argp) { - struct rst_softc *sc = argp; + struct at91_rst_softc *sc = argp; if (RD4(sc, RST_SR) & RST_SR_URSTS) { if (sc->shutdown == 0) - callout_reset(&sc->tick_ch, hz/RST_TICK, rst_tick, sc); + callout_reset(&sc->tick_ch, hz/RST_TICK, at91_rst_tick, sc); return (FILTER_HANDLED); } return (FILTER_STRAY); @@ -183,34 +201,10 @@ static device_method_t at91_rst_methods[] = { static driver_t at91_rst_driver = { "at91_rst", at91_rst_methods, - sizeof(struct rst_softc), + sizeof(struct at91_rst_softc), }; static devclass_t at91_rst_devclass; DRIVER_MODULE(at91_rst, atmelarm, at91_rst_driver, at91_rst_devclass, NULL, NULL); - -void cpu_reset_sam9g20(void) __attribute__((weak)); -void cpu_reset_sam9g20(void) {} - -void -cpu_reset(void) -{ - - if (rst_sc) { - cpu_reset_sam9g20(); /* May be null */ - - WR4(rst_sc, RST_MR, - RST_MR_ERSTL(0xd) | RST_MR_URSTEN | RST_MR_KEY); - - WR4(rst_sc, RST_CR, - RST_CR_PROCRST | - RST_CR_PERRST | - RST_CR_EXTRST | - RST_CR_KEY); - } - - for(;;) - ; -} diff --git a/sys/arm/at91/at91_rstreg.h b/sys/arm/at91/at91_rstreg.h index f075b2cf53e..ee64f140ff6 100644 --- a/sys/arm/at91/at91_rstreg.h +++ b/sys/arm/at91/at91_rstreg.h @@ -25,8 +25,8 @@ /* $FreeBSD$ */ -#ifndef ARM_AT91_AT91RSTREG_H -#define ARM_AT91_AT91RSTREG_H +#ifndef ARM_AT91_AT91_RSTREG_H +#define ARM_AT91_AT91_RSTREG_H #define RST_CR 0x0 /* Control Register */ #define RST_SR 0x4 /* Status Register */ @@ -56,4 +56,8 @@ #define RST_MR_ERSTL(x) ((x)<<8) /* External reset length */ #define RST_MR_KEY (0xa5<<24) -#endif /* ARM_AT91_AT91RSTREG_H */ +#ifndef __ASSEMBLER__ +void at91_rst_cpu_reset(void); +#endif + +#endif /* ARM_AT91_AT91_RSTREG_H */ diff --git a/sys/arm/at91/at91_spi.c b/sys/arm/at91/at91_spi.c index e5bf52f4e0f..a81e0be64fc 100644 --- a/sys/arm/at91/at91_spi.c +++ b/sys/arm/at91/at91_spi.c @@ -1,5 +1,7 @@ /*- - * Copyright (c) 2006 M. Warner Losh. All rights reserved. + * Copyright (c) 2006 M. Warner Losh. + * Copyright (c) 2011-2012 Ian Lepore. + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,17 +33,20 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include -#include #include +#include + #include #include #include #include + #include "spibus_if.h" struct at91_spi_softc @@ -50,29 +55,38 @@ struct at91_spi_softc void *intrhand; /* Interrupt handle */ struct resource *irq_res; /* IRQ resource */ struct resource *mem_res; /* Memory resource */ - bus_dma_tag_t dmatag; /* bus dma tag for mbufs */ + bus_dma_tag_t dmatag; /* bus dma tag for transfers */ bus_dmamap_t map[4]; /* Maps for the transaction */ - int rxdone; + struct sx xfer_mtx; /* Enforce one transfer at a time */ + uint32_t xfer_done; /* interrupt<->mainthread signaling */ }; +#define CS_TO_MR(cs) ((~(1 << (cs)) & 0x0f) << 16) + static inline uint32_t RD4(struct at91_spi_softc *sc, bus_size_t off) { - return bus_read_4(sc->mem_res, off); + + return (bus_read_4(sc->mem_res, off)); } static inline void WR4(struct at91_spi_softc *sc, bus_size_t off, uint32_t val) { + bus_write_4(sc->mem_res, off, val); } /* bus entry points */ -static int at91_spi_probe(device_t dev); static int at91_spi_attach(device_t dev); static int at91_spi_detach(device_t dev); +static int at91_spi_probe(device_t dev); +static int at91_spi_transfer(device_t dev, device_t child, + struct spi_command *cmd); /* helper routines */ +static void at91_getaddr(void *arg, bus_dma_segment_t *segs, int nsegs, + int error); static int at91_spi_activate(device_t dev); static void at91_spi_deactivate(device_t dev); static void at91_spi_intr(void *arg); @@ -80,43 +94,63 @@ static void at91_spi_intr(void *arg); static int at91_spi_probe(device_t dev) { - device_set_desc(dev, "SPI"); + + device_set_desc(dev, "AT91 SPI"); return (0); } static int at91_spi_attach(device_t dev) { - struct at91_spi_softc *sc = device_get_softc(dev); - int err, i; + struct at91_spi_softc *sc; + int err; + uint32_t csr; + + sc = device_get_softc(dev); sc->dev = dev; + sx_init(&sc->xfer_mtx, device_get_nameunit(dev)); + + /* + * Allocate resources. + */ err = at91_spi_activate(dev); if (err) goto out; /* - * Allocate DMA tags and maps + * Set up the hardware. */ - err = bus_dma_tag_create(bus_get_dma_tag(dev), 1, 0, - BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 2058, 1, - 2048, BUS_DMA_ALLOCNOW, NULL, NULL, &sc->dmatag); - if (err != 0) - goto out; - for (i = 0; i < 4; i++) { - err = bus_dmamap_create(sc->dmatag, 0, &sc->map[i]); - if (err != 0) - goto out; - } - // reset the SPI + WR4(sc, SPI_CR, SPI_CR_SWRST); + /* "Software Reset must be Written Twice" erratum */ WR4(sc, SPI_CR, SPI_CR_SWRST); WR4(sc, SPI_IDR, 0xffffffff); WR4(sc, SPI_MR, (0xf << 24) | SPI_MR_MSTR | SPI_MR_MODFDIS | - (0xE << 16)); + CS_TO_MR(0)); + + /* + * For now, run the bus at the slowest speed possible as otherwise we + * may encounter data corruption on transmit as seen with ETHERNUT5 + * and AT45DB321D even though both board and slave device can take + * more. + * This also serves as a work-around for the "NPCSx rises if no data + * data is to be transmitted" erratum. The ideal workaround for the + * latter is to take the chip select control away from the peripheral + * and manage it directly as a GPIO line. The easy solution is to + * slow down the bus so dramatically that it just never gets starved + * as may be seen when the OCHI controller is running and consuming + * memory and APB bandwidth. + * Also, currently we lack a way for lettting both the board and the + * slave devices take their maximum supported SPI clocks into account. + */ + csr = SPI_CSR_CPOL | (4 << 16) | (0xff << 8); + WR4(sc, SPI_CSR0, csr); + WR4(sc, SPI_CSR1, csr); + WR4(sc, SPI_CSR2, csr); + WR4(sc, SPI_CSR3, csr); - WR4(sc, SPI_CSR0, SPI_CSR_CPOL | (4 << 16) | (2 << 8)); WR4(sc, SPI_CR, SPI_CR_SPIEN); WR4(sc, PDC_PTCR, PDC_PTCR_TXTDIS); @@ -143,6 +177,7 @@ out: static int at91_spi_detach(device_t dev) { + return (EBUSY); /* XXX */ } @@ -150,26 +185,41 @@ static int at91_spi_activate(device_t dev) { struct at91_spi_softc *sc; - int rid, err = ENOMEM; + int err, i, rid; sc = device_get_softc(dev); + err = ENOMEM; + rid = 0; sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); if (sc->mem_res == NULL) - goto errout; + goto out; + rid = 0; sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); if (sc->irq_res == NULL) - goto errout; + goto out; err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_MPSAFE, NULL, at91_spi_intr, sc, &sc->intrhand); if (err != 0) - goto errout; - return (0); -errout: - at91_spi_deactivate(dev); + goto out; + + err = bus_dma_tag_create(bus_get_dma_tag(dev), 1, 0, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 2048, 1, + 2048, BUS_DMA_ALLOCNOW, NULL, NULL, &sc->dmatag); + if (err != 0) + goto out; + + for (i = 0; i < 4; i++) { + err = bus_dmamap_create(sc->dmatag, 0, &sc->map[i]); + if (err != 0) + goto out; + } +out: + if (err != 0) + at91_spi_deactivate(dev); return (err); } @@ -177,26 +227,37 @@ static void at91_spi_deactivate(device_t dev) { struct at91_spi_softc *sc; + int i; sc = device_get_softc(dev); + bus_generic_detach(dev); + + for (i = 0; i < 4; i++) + if (sc->map[i]) + bus_dmamap_destroy(sc->dmatag, sc->map[i]); + + if (sc->dmatag) + bus_dma_tag_destroy(sc->dmatag); + if (sc->intrhand) bus_teardown_intr(dev, sc->irq_res, sc->intrhand); - sc->intrhand = 0; - bus_generic_detach(sc->dev); - if (sc->mem_res) - bus_release_resource(dev, SYS_RES_IOPORT, - rman_get_rid(sc->mem_res), sc->mem_res); - sc->mem_res = 0; + sc->intrhand = NULL; if (sc->irq_res) bus_release_resource(dev, SYS_RES_IRQ, rman_get_rid(sc->irq_res), sc->irq_res); - sc->irq_res = 0; - return; + sc->irq_res = NULL; + + if (sc->mem_res) + bus_release_resource(dev, SYS_RES_MEMORY, + rman_get_rid(sc->mem_res), sc->mem_res); + sc->mem_res = NULL; } static void -at91_getaddr(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +at91_getaddr(void *arg, bus_dma_segment_t *segs, int nsegs __unused, + int error) { + if (error != 0) return; *(bus_addr_t *)arg = segs[0].ds_addr; @@ -206,80 +267,130 @@ static int at91_spi_transfer(device_t dev, device_t child, struct spi_command *cmd) { struct at91_spi_softc *sc; - int i, j, rxdone, err, mode[4]; bus_addr_t addr; + int err, i, j, mode[4]; + + KASSERT(cmd->tx_cmd_sz == cmd->rx_cmd_sz, + ("%s: TX/RX command sizes should be equal", __func__)); + KASSERT(cmd->tx_data_sz == cmd->rx_data_sz, + ("%s: TX/RX data sizes should be equal", __func__)); sc = device_get_softc(dev); - WR4(sc, PDC_PTCR, PDC_PTCR_TXTDIS | PDC_PTCR_RXTDIS); i = 0; - if (bus_dmamap_load(sc->dmatag, sc->map[i], cmd->tx_cmd, - cmd->tx_cmd_sz, at91_getaddr, &addr, 0) != 0) + + sx_xlock(&sc->xfer_mtx); + + /* + * Disable transfers while we set things up. + */ + WR4(sc, PDC_PTCR, PDC_PTCR_TXTDIS | PDC_PTCR_RXTDIS); + +#ifdef SPI_CHIPSEL_SUPPORT + if (cmd->cs < 0 || cmd->cs > 3) { + device_printf(dev, + "Invalid chip select %d requested by %s\n", cmd->cs, + device_get_nameunit(child)); + err = EINVAL; + goto out; + } +#ifdef SPI_CHIP_SELECT_HIGH_SUPPORT + if (at91_is_rm92() && cmd->cs == 0 && + (cmd->flags & SPI_CHIP_SELECT_HIGH) != 0) { + device_printf(dev, + "Invalid chip select high requested by %s\n", + device_get_nameunit(child)); + err = EINVAL; + goto out; + } +#endif + WR4(sc, SPI_MR, (RD4(sc, SPI_MR) & ~0x000f0000) | CS_TO_MR(cmd->cs)); +#endif + + /* + * Set up the TX side of the transfer. + */ + if ((err = bus_dmamap_load(sc->dmatag, sc->map[i], cmd->tx_cmd, + cmd->tx_cmd_sz, at91_getaddr, &addr, 0)) != 0) goto out; WR4(sc, PDC_TPR, addr); WR4(sc, PDC_TCR, cmd->tx_cmd_sz); bus_dmamap_sync(sc->dmatag, sc->map[i], BUS_DMASYNC_PREWRITE); mode[i++] = BUS_DMASYNC_POSTWRITE; if (cmd->tx_data_sz > 0) { - if (bus_dmamap_load(sc->dmatag, sc->map[i], cmd->tx_data, - cmd->tx_data_sz, at91_getaddr, &addr, 0) != 0) + if ((err = bus_dmamap_load(sc->dmatag, sc->map[i], + cmd->tx_data, cmd->tx_data_sz, at91_getaddr, &addr, 0)) != + 0) goto out; WR4(sc, PDC_TNPR, addr); WR4(sc, PDC_TNCR, cmd->tx_data_sz); bus_dmamap_sync(sc->dmatag, sc->map[i], BUS_DMASYNC_PREWRITE); mode[i++] = BUS_DMASYNC_POSTWRITE; } - if (bus_dmamap_load(sc->dmatag, sc->map[i], cmd->rx_cmd, - cmd->tx_cmd_sz, at91_getaddr, &addr, 0) != 0) + + /* + * Set up the RX side of the transfer. + */ + if ((err = bus_dmamap_load(sc->dmatag, sc->map[i], cmd->rx_cmd, + cmd->rx_cmd_sz, at91_getaddr, &addr, 0)) != 0) goto out; WR4(sc, PDC_RPR, addr); - WR4(sc, PDC_RCR, cmd->tx_cmd_sz); + WR4(sc, PDC_RCR, cmd->rx_cmd_sz); bus_dmamap_sync(sc->dmatag, sc->map[i], BUS_DMASYNC_PREREAD); mode[i++] = BUS_DMASYNC_POSTREAD; if (cmd->rx_data_sz > 0) { - if (bus_dmamap_load(sc->dmatag, sc->map[i], cmd->rx_data, - cmd->tx_data_sz, at91_getaddr, &addr, 0) != 0) + if ((err = bus_dmamap_load(sc->dmatag, sc->map[i], + cmd->rx_data, cmd->rx_data_sz, at91_getaddr, &addr, 0)) != + 0) goto out; WR4(sc, PDC_RNPR, addr); WR4(sc, PDC_RNCR, cmd->rx_data_sz); bus_dmamap_sync(sc->dmatag, sc->map[i], BUS_DMASYNC_PREREAD); mode[i++] = BUS_DMASYNC_POSTREAD; } - WR4(sc, SPI_IER, SPI_SR_ENDRX); - WR4(sc, PDC_PTCR, PDC_PTCR_TXTEN | PDC_PTCR_RXTEN); - rxdone = sc->rxdone; - do { - err = tsleep(&sc->rxdone, PCATCH | PZERO, "spi", hz); - } while (rxdone == sc->rxdone && err != EINTR); + /* + * Start the transfer, wait for it to complete. + */ + sc->xfer_done = 0; + WR4(sc, SPI_IER, SPI_SR_RXBUFF); + WR4(sc, PDC_PTCR, PDC_PTCR_TXTEN | PDC_PTCR_RXTEN); + do + err = tsleep(&sc->xfer_done, PCATCH | PZERO, "at91_spi", hz); + while (sc->xfer_done == 0 && err != EINTR); + + /* + * Stop the transfer and clean things up. + */ WR4(sc, PDC_PTCR, PDC_PTCR_TXTDIS | PDC_PTCR_RXTDIS); - if (err == 0) { - for (j = 0; j < i; j++) + if (err == 0) + for (j = 0; j < i; j++) bus_dmamap_sync(sc->dmatag, sc->map[j], mode[j]); - } - for (j = 0; j < i; j++) - bus_dmamap_unload(sc->dmatag, sc->map[j]); - return (err); out: for (j = 0; j < i; j++) bus_dmamap_unload(sc->dmatag, sc->map[j]); - return (EIO); + + sx_xunlock(&sc->xfer_mtx); + + return (err); } static void at91_spi_intr(void *arg) { - struct at91_spi_softc *sc = (struct at91_spi_softc*)arg; + struct at91_spi_softc *sc; uint32_t sr; + sc = (struct at91_spi_softc*)arg; + sr = RD4(sc, SPI_SR) & RD4(sc, SPI_IMR); - if (sr & SPI_SR_ENDRX) { - sc->rxdone++; - WR4(sc, SPI_IDR, SPI_SR_ENDRX); - wakeup(&sc->rxdone); + if ((sr & SPI_SR_RXBUFF) != 0) { + sc->xfer_done = 1; + WR4(sc, SPI_IDR, SPI_SR_RXBUFF); + wakeup(&sc->xfer_done); } - if (sr & ~SPI_SR_ENDRX) { + if ((sr & ~SPI_SR_RXBUFF) != 0) { device_printf(sc->dev, "Unexpected ISR %#x\n", sr); - WR4(sc, SPI_IDR, sr & ~SPI_SR_ENDRX); + WR4(sc, SPI_IDR, sr & ~SPI_SR_RXBUFF); } } @@ -293,7 +404,8 @@ static device_method_t at91_spi_methods[] = { /* spibus interface */ DEVMETHOD(spibus_transfer, at91_spi_transfer), - { 0, 0 } + + DEVMETHOD_END }; static driver_t at91_spi_driver = { @@ -302,4 +414,5 @@ static driver_t at91_spi_driver = { sizeof(struct at91_spi_softc), }; -DRIVER_MODULE(at91_spi, atmelarm, at91_spi_driver, at91_spi_devclass, 0, 0); +DRIVER_MODULE(at91_spi, atmelarm, at91_spi_driver, at91_spi_devclass, NULL, + NULL); diff --git a/sys/arm/at91/at91_spireg.h b/sys/arm/at91/at91_spireg.h index c57edab1c1f..251564f3d28 100644 --- a/sys/arm/at91/at91_spireg.h +++ b/sys/arm/at91/at91_spireg.h @@ -54,6 +54,8 @@ #define SPI_SR_ENDTX 0x00020 #define SPI_SR_RXBUFF 0x00040 #define SPI_SR_TXBUFE 0x00080 +#define SPI_SR_NSSR 0x00100 +#define SPI_SR_TXEMPTY 0x00200 #define SPI_SR_SPIENS 0x10000 #define SPI_IER 0x14 /* IER: Interrupt Enable Regsiter */ #define SPI_IDR 0x18 /* IDR: Interrupt Disable Regsiter */ diff --git a/sys/arm/at91/at91_ssc.c b/sys/arm/at91/at91_ssc.c index 12ae90ae305..8a32f55d42b 100644 --- a/sys/arm/at91/at91_ssc.c +++ b/sys/arm/at91/at91_ssc.c @@ -214,7 +214,7 @@ at91_ssc_intr(void *xsc) return; } -static int +static int at91_ssc_open(struct cdev *dev, int oflags, int devtype, struct thread *td) { struct at91_ssc_softc *sc; diff --git a/sys/arm/at91/at91_st.c b/sys/arm/at91/at91_st.c index ac20bc18340..7ac8175ca2a 100644 --- a/sys/arm/at91/at91_st.c +++ b/sys/arm/at91/at91_st.c @@ -43,23 +43,32 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include -static struct at91st_softc { - bus_space_tag_t sc_st; - bus_space_handle_t sc_sh; - device_t sc_dev; +static struct at91_st_softc { + struct resource * sc_irq_res; + struct resource * sc_mem_res; + void * sc_intrhand; eventhandler_tag sc_wet; /* watchdog event handler tag */ } *timer_softc; -#define RD4(off) \ - bus_space_read_4(timer_softc->sc_st, timer_softc->sc_sh, (off)) -#define WR4(off, val) \ - bus_space_write_4(timer_softc->sc_st, timer_softc->sc_sh, (off), (val)) +static inline uint32_t +RD4(bus_size_t off) +{ -static void at91st_watchdog(void *, u_int, int *); + return (bus_read_4(timer_softc->sc_mem_res, off)); +} + +static inline void +WR4(bus_size_t off, uint32_t val) +{ + + bus_write_4(timer_softc->sc_mem_res, off, val); +} + +static void at91_st_watchdog(void *, u_int, int *); +static void at91_st_initclocks(device_t , struct at91_st_softc *); static inline int st_crtr(void) @@ -72,10 +81,10 @@ st_crtr(void) return (cur1); } -static unsigned at91st_get_timecount(struct timecounter *tc); +static unsigned at91_st_get_timecount(struct timecounter *tc); -static struct timecounter at91st_timecounter = { - at91st_get_timecount, /* get_timecount */ +static struct timecounter at91_st_timecounter = { + at91_st_get_timecount, /* get_timecount */ NULL, /* no poll_pps */ 0xfffffu, /* counter_mask */ 32768, /* frequency */ @@ -83,93 +92,6 @@ static struct timecounter at91st_timecounter = { 1000 /* quality */ }; -static int -at91st_probe(device_t dev) -{ - - device_set_desc(dev, "ST"); - return (0); -} - -static int -at91st_attach(device_t dev) -{ - struct at91_softc *sc = device_get_softc(device_get_parent(dev)); - - timer_softc = device_get_softc(dev); - timer_softc->sc_st = sc->sc_st; - timer_softc->sc_dev = dev; - if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91RM92_ST_BASE, - AT91RM92_ST_SIZE, &timer_softc->sc_sh) != 0) - panic("couldn't subregion timer registers"); - /* - * Real time counter increments every clock cycle, need to set before - * initializing clocks so that DELAY works. - */ - WR4(ST_RTMR, 1); - /* Disable all interrupts */ - WR4(ST_IDR, 0xffffffff); - /* disable watchdog timer */ - WR4(ST_WDMR, 0); - - timer_softc->sc_wet = EVENTHANDLER_REGISTER(watchdog_list, - at91st_watchdog, dev, 0); - device_printf(dev, - "watchdog registered, timeout intervall max. 64 sec\n"); - return (0); -} - -static device_method_t at91st_methods[] = { - DEVMETHOD(device_probe, at91st_probe), - DEVMETHOD(device_attach, at91st_attach), - {0, 0}, -}; - -static driver_t at91st_driver = { - "at91_st", - at91st_methods, - sizeof(struct at91st_softc), -}; -static devclass_t at91st_devclass; - -DRIVER_MODULE(at91_st, atmelarm, at91st_driver, at91st_devclass, 0, 0); - -static unsigned -at91st_get_timecount(struct timecounter *tc) -{ - return (st_crtr()); -} - -/* - * t below is in a weird unit. The watchdog is set to 2^t - * nanoseconds. Since our watchdog timer can't really do that too - * well, we approximate it by assuming that the timeout interval for - * the lsb is 2^22 ns, which is 4.194ms. This is an overestimation of - * the actual time (3.906ms), but close enough for watchdogging. - * These approximations, though a violation of the spec, improve the - * performance of the application which typically specifies things as - * WD_TO_32SEC. In that last case, we'd wait 32s before the wdog - * reset. The spec says we should wait closer to 34s, but given how - * it is likely to be used, and the extremely coarse nature time - * interval, I think this is the best solution. - */ -static void -at91st_watchdog(void *argp, u_int cmd, int *error) -{ - uint32_t wdog; - int t; - - t = cmd & WD_INTERVAL; - if (t >= 22 && t <= 37) { - wdog = (1 << (t - 22)) | ST_WDMR_RSTEN; - *error = 0; - } else { - wdog = 0; - } - WR4(ST_WDMR, wdog); - WR4(ST_CR, ST_CR_WDRST); -} - static int clock_intr(void *arg) { @@ -183,43 +105,8 @@ clock_intr(void *arg) return (FILTER_STRAY); } -void -cpu_initclocks(void) -{ - int rel_value; - struct resource *irq; - int rid = 0; - void *ih; - device_t dev = timer_softc->sc_dev; - - rel_value = 32768 / hz; - if (rel_value < 1) - rel_value = 1; - if (32768 % hz) { - printf("Cannot get %d Hz clock; using %dHz\n", hz, 32768 / rel_value); - hz = 32768 / rel_value; - tick = 1000000 / hz; - } - /* Disable all interrupts. */ - WR4(ST_IDR, 0xffffffff); - /* The system timer shares the system irq (1) */ - irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 1, 1, 1, - RF_ACTIVE | RF_SHAREABLE); - if (!irq) - panic("Unable to allocate irq for the system timer"); - else - bus_setup_intr(dev, irq, INTR_TYPE_CLK, - clock_intr, NULL, NULL, &ih); - - WR4(ST_PIMR, rel_value); - - /* Enable PITS interrupts. */ - WR4(ST_IER, ST_SR_PITS); - tc_init(&at91st_timecounter); -} - -void -DELAY(int n) +static void +at91_st_delay(int n) { uint32_t start, end, cur; @@ -238,8 +125,8 @@ DELAY(int n) } } -void -cpu_reset(void) +static void +at91_st_cpu_reset(void) { /* * Reset the CPU by programmig the watchdog timer to reset the @@ -252,12 +139,165 @@ cpu_reset(void) continue; } -void -cpu_startprofclock(void) +static int +at91_st_probe(device_t dev) { + + device_set_desc(dev, "ST"); + return (0); } -void -cpu_stopprofclock(void) +static void +at91_st_deactivate(device_t dev) { + struct at91_st_softc *sc = timer_softc; + + if (sc->sc_intrhand) + bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_intrhand); + sc->sc_intrhand = NULL; + + if (sc->sc_irq_res) + bus_release_resource(dev, SYS_RES_IRQ, + rman_get_rid(sc->sc_irq_res), sc->sc_irq_res); + sc->sc_irq_res = NULL; + + if (sc->sc_mem_res) + bus_release_resource(dev, SYS_RES_MEMORY, + rman_get_rid(sc->sc_mem_res), sc->sc_mem_res); + sc->sc_mem_res = NULL; +} + +static int +at91_st_activate(device_t dev) +{ + int rid; + int err; + struct at91_st_softc *sc = timer_softc; + + rid = 0; + sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, + RF_ACTIVE); + err = ENOMEM; + if (sc->sc_mem_res == NULL) + goto out; + /* Disable all interrupts */ + WR4(ST_IDR, 0xffffffff); + + /* The system timer shares the system irq (1) */ + rid = 0; + sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + RF_ACTIVE | RF_SHAREABLE); + if (sc->sc_irq_res == NULL) { + printf("Unable to allocate irq for the system timer"); + goto out; + } + err = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_CLK, clock_intr, + NULL, NULL, &sc->sc_intrhand); +out: + if (err != 0) + at91_st_deactivate(dev); + return (err); +} + +static int +at91_st_attach(device_t dev) +{ + int err; + + timer_softc = device_get_softc(dev); + err = at91_st_activate(dev); + if (err) + return err; + + soc_data.delay = at91_st_delay; + soc_data.reset = at91_st_cpu_reset; // XXX kinda late to be setting this... + + timer_softc->sc_wet = EVENTHANDLER_REGISTER(watchdog_list, + at91_st_watchdog, dev, 0); + + device_printf(dev, + "watchdog registered, timeout intervall max. 64 sec\n"); + + at91_st_initclocks(dev, timer_softc); + return (0); +} + +static device_method_t at91_st_methods[] = { + DEVMETHOD(device_probe, at91_st_probe), + DEVMETHOD(device_attach, at91_st_attach), + {0, 0}, +}; + +static driver_t at91_st_driver = { + "at91_st", + at91_st_methods, + sizeof(struct at91_st_softc), +}; +static devclass_t at91_st_devclass; + +DRIVER_MODULE(at91_st, atmelarm, at91_st_driver, at91_st_devclass, 0, 0); + +static unsigned +at91_st_get_timecount(struct timecounter *tc) +{ + return (st_crtr()); +} + +/* + * t below is in a weird unit. The watchdog is set to 2^t + * nanoseconds. Since our watchdog timer can't really do that too + * well, we approximate it by assuming that the timeout interval for + * the lsb is 2^22 ns, which is 4.194ms. This is an overestimation of + * the actual time (3.906ms), but close enough for watchdogging. + * These approximations, though a violation of the spec, improve the + * performance of the application which typically specifies things as + * WD_TO_32SEC. In that last case, we'd wait 32s before the wdog + * reset. The spec says we should wait closer to 34s, but given how + * it is likely to be used, and the extremely coarse nature time + * interval, I think this is the best solution. + */ +static void +at91_st_watchdog(void *argp, u_int cmd, int *error) +{ + uint32_t wdog; + int t; + + t = cmd & WD_INTERVAL; + if (t >= 22 && t <= 37) { + wdog = (1 << (t - 22)) | ST_WDMR_RSTEN; + *error = 0; + } else { + wdog = 0; + } + WR4(ST_WDMR, wdog); + WR4(ST_CR, ST_CR_WDRST); +} + +static void +at91_st_initclocks(device_t dev, struct at91_st_softc *sc) +{ + int rel_value; + + /* + * Real time counter increments every clock cycle, need to set before + * initializing clocks so that DELAY works. + */ + WR4(ST_RTMR, 1); + /* disable watchdog timer */ + WR4(ST_WDMR, 0); + + rel_value = 32768 / hz; + if (rel_value < 1) + rel_value = 1; + if (32768 % hz) { + device_printf(dev, "Cannot get %d Hz clock; using %dHz\n", hz, + 32768 / rel_value); + hz = 32768 / rel_value; + tick = 1000000 / hz; + } + WR4(ST_PIMR, rel_value); + + /* Enable PITS interrupts. */ + WR4(ST_IER, ST_SR_PITS); + tc_init(&at91_st_timecounter); } diff --git a/sys/arm/at91/at91_twi.c b/sys/arm/at91/at91_twi.c index a76c313b205..523f23e8465 100644 --- a/sys/arm/at91/at91_twi.c +++ b/sys/arm/at91/at91_twi.c @@ -284,7 +284,6 @@ at91_twi_rst_card(device_t dev, u_char speed, u_char addr, u_char *oldaddr) WR4(sc, TWI_CR, TWI_CR_SWRST); WR4(sc, TWI_CR, TWI_CR_MSEN | TWI_CR_SVDIS); WR4(sc, TWI_CWGR, sc->cwgr); - printf("setting cwgr to %#x\n", sc->cwgr); AT91_TWI_UNLOCK(sc); return 0; diff --git a/sys/arm/at91/at91_wdtreg.h b/sys/arm/at91/at91_wdtreg.h index 56e8f1b30a3..1c8dd892c14 100644 --- a/sys/arm/at91/at91_wdtreg.h +++ b/sys/arm/at91/at91_wdtreg.h @@ -23,7 +23,7 @@ * SUCH DAMAGE. */ -/* +/* * $FreeBSD$ */ diff --git a/sys/arm/at91/at91board.h b/sys/arm/at91/at91board.h index 69d04cef7c6..16763d57ea3 100644 --- a/sys/arm/at91/at91board.h +++ b/sys/arm/at91/at91board.h @@ -33,9 +33,4 @@ */ long at91_ramsize(void); -/* - * These routines are expected to be provided by the board files. - */ -long board_init(void); - #endif /* _ARM_AT91_AT91BOARD_H_ */ diff --git a/sys/arm/at91/at91reg.h b/sys/arm/at91/at91reg.h index 692d36c5a4c..e0aaa81bbb6 100644 --- a/sys/arm/at91/at91reg.h +++ b/sys/arm/at91/at91reg.h @@ -35,6 +35,9 @@ /* Where builtin peripherals start in KVM */ #define AT91_BASE 0xd0000000 +/* Where builtin peripherals start PA */ +#define AT91_PA_BASE 0xf0000000 + /* A few things that we count on being the same * throught the whole family of SOCs */ @@ -43,32 +46,45 @@ #define AT91_SYS_BASE 0xffff000 #define AT91_SYS_SIZE 0x1000 -#if defined(AT91SAM9G45) || defined(AT91SAM9263) -#define AT91_DBGU_BASE 0xfffee00 -#else -#define AT91_DBGU_BASE 0xffff200 -#endif +#define AT91_DBGU0 0x0ffff200 /* Most */ +#define AT91_DBGU1 0x0fffee00 /* SAM9263, CAP9, and SAM9G45 */ + #define AT91_DBGU_SIZE 0x200 #define DBGU_C1R (64) /* Chip ID1 Register */ #define DBGU_C2R (68) /* Chip ID2 Register */ #define DBGU_FNTR (72) /* Force NTRST Register */ #define AT91_CPU_VERSION_MASK 0x0000001f -#define AT91_CPU_RM9200 0x09290780 -#define AT91_CPU_SAM9260 0x019803a0 -#define AT91_CPU_SAM9261 0x019703a0 -#define AT91_CPU_SAM9263 0x019607a0 -#define AT91_CPU_SAM9G10 0x819903a0 -#define AT91_CPU_SAM9G20 0x019905a0 -#define AT91_CPU_SAM9G45 0x819b05a0 +#define AT91_CPU_FAMILY_MASK 0x0ff00000 + +#define AT91_CPU_RM9200 0x09290780 +#define AT91_CPU_SAM9260 0x019803a0 +#define AT91_CPU_SAM9261 0x019703a0 +#define AT91_CPU_SAM9263 0x019607a0 +#define AT91_CPU_SAM9G10 0x819903a0 +#define AT91_CPU_SAM9G20 0x019905a0 +#define AT91_CPU_SAM9G45 0x819b05a0 +#define AT91_CPU_SAM9N12 0x819a07a0 +#define AT91_CPU_SAM9RL64 0x019b03a0 +#define AT91_CPU_SAM9X5 0x819a05a0 + #define AT91_CPU_SAM9XE128 0x329973a0 #define AT91_CPU_SAM9XE256 0x329a93a0 #define AT91_CPU_SAM9XE512 0x329aa3a0 -#define AT91_ARCH(chipid) ((chipid >> 20) & 0xff) -#define AT91_CPU(chipid) (chipid & ~AT91_CPU_VERSION_MASK) -#define AT91_ARCH_SAM9 (0x19) -#define AT91_ARCH_SAM9XE (0x29) -#define AT91_ARCH_RM92 (0x92) +#define AT91_CPU_CAP9 0x039a03a0 + +#define AT91_EXID_SAM9M11 0x00000001 +#define AT91_EXID_SAM9M10 0x00000002 +#define AT91_EXID_SAM9G46 0x00000003 +#define AT91_EXID_SAM9G45 0x00000004 + +#define AT91_EXID_SAM9G15 0x00000000 +#define AT91_EXID_SAM9G35 0x00000001 +#define AT91_EXID_SAM9X35 0x00000002 +#define AT91_EXID_SAM9G25 0x00000003 +#define AT91_EXID_SAM9X25 0x00000004 + +#define AT91_IRQ_SYSTEM 1 #endif /* _AT91REG_H_ */ diff --git a/sys/arm/at91/at91rm9200.c b/sys/arm/at91/at91rm9200.c index 9a0fae5a3a3..22c331e622c 100644 --- a/sys/arm/at91/at91rm9200.c +++ b/sys/arm/at91/at91rm9200.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -49,8 +50,6 @@ struct at91rm92_softc { bus_space_handle_t sc_sh; bus_space_handle_t sc_sys_sh; bus_space_handle_t sc_aic_sh; - bus_space_handle_t sc_dbg_sh; - bus_space_handle_t sc_matrix_sh; }; /* * Standard priority levels for the system. 0 is lowest and 7 is highest. @@ -135,41 +134,6 @@ static const struct cpu_devs at91_devs[] = { 0, 0, 0, 0, 0 } }; -static void -at91_add_child(device_t dev, int prio, const char *name, int unit, - bus_addr_t addr, bus_size_t size, int irq0, int irq1, int irq2) -{ - device_t kid; - struct at91_ivar *ivar; - - kid = device_add_child_ordered(dev, prio, name, unit); - if (kid == NULL) { - printf("Can't add child %s%d ordered\n", name, unit); - return; - } - ivar = malloc(sizeof(*ivar), M_DEVBUF, M_NOWAIT | M_ZERO); - if (ivar == NULL) { - device_delete_child(dev, kid); - printf("Can't add alloc ivar\n"); - return; - } - device_set_ivars(kid, ivar); - resource_list_init(&ivar->resources); - if (irq0 != -1) { - bus_set_resource(kid, SYS_RES_IRQ, 0, irq0, 1); - if (irq0 != AT91RM92_IRQ_SYSTEM) - at91_pmc_clock_add(device_get_nameunit(kid), irq0, 0); - } - if (irq1 != 0) - bus_set_resource(kid, SYS_RES_IRQ, 1, irq1, 1); - if (irq2 != 0) - bus_set_resource(kid, SYS_RES_IRQ, 2, irq2, 1); - if (addr != 0 && addr < AT91RM92_BASE) - addr += AT91RM92_BASE; - if (addr != 0) - bus_set_resource(kid, SYS_RES_MEMORY, 0, addr, size); -} - static void at91_cpu_add_builtin_children(device_t dev) { @@ -189,7 +153,7 @@ at91_pll_outb(int freq) if (freq > 155000000) return (0x0000); - else + else return (0x8000); } @@ -197,7 +161,7 @@ static void at91_identify(driver_t *drv, device_t parent) { - if (at91_cpu_is(AT91_CPU_RM9200)) { + if (at91_cpu_is(AT91_T_RM9200)) { at91_add_child(parent, 0, "at91rm920", 0, 0, 0, -1, 0, 0); at91_cpu_add_builtin_children(parent); } @@ -207,11 +171,8 @@ static int at91_probe(device_t dev) { - if (at91_cpu_is(AT91_CPU_RM9200)) { - device_set_desc(dev, "AT91RM9200"); - return (0); - } - return (ENXIO); + device_set_desc(dev, soc_data.name); + return (0); } static int @@ -231,20 +192,15 @@ at91_attach(device_t dev) AT91RM92_SYS_SIZE, &sc->sc_sys_sh) != 0) panic("Enable to map system registers"); - if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91RM92_DBGU_BASE, - AT91RM92_DBGU_SIZE, &sc->sc_dbg_sh) != 0) - panic("Enable to map DBGU registers"); - if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91RM92_AIC_BASE, AT91RM92_AIC_SIZE, &sc->sc_aic_sh) != 0) panic("Enable to map system registers"); /* XXX Hack to tell atmelarm about the AIC */ at91sc->sc_aic_sh = sc->sc_aic_sh; - at91sc->sc_irq_system = AT91RM92_IRQ_SYSTEM; for (i = 0; i < 32; i++) { - bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_SVR + + bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_SVR + i * 4, i); /* Priority. */ bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_SMR + i * 4, @@ -267,9 +223,6 @@ at91_attach(device_t dev) /* Disable all interrupts for the SDRAM controller */ bus_space_write_4(sc->sc_st, sc->sc_sys_sh, 0xfa8, 0xffffffff); - /* Disable all interrupts for DBGU */ - bus_space_write_4(sc->sc_st, sc->sc_dbg_sh, 0x0c, 0xffffffff); - /* Update USB device port clock info */ clk = at91_pmc_clock_ref("udpck"); clk->pmc_mask = PMC_SCER_UDP; diff --git a/sys/arm/at91/at91rm92reg.h b/sys/arm/at91/at91rm92reg.h index 8241646a3dd..66fad34b57e 100644 --- a/sys/arm/at91/at91rm92reg.h +++ b/sys/arm/at91/at91rm92reg.h @@ -34,9 +34,9 @@ #define RM9200_PLL_A_MIN_OUT_FREQ 80000000 /* 80 MHz */ #define RM9200_PLL_A_MAX_OUT_FREQ 180000000 /* 180 MHz */ #define RM9200_PLL_A_MUL_SHIFT 16 -#define RM9200_PLL_A_MUL_MASK 0x7FF +#define RM9200_PLL_A_MUL_MASK 0x7FF #define RM9200_PLL_A_DIV_SHIFT 0 -#define RM9200_PLL_A_DIV_MASK 0xFF +#define RM9200_PLL_A_DIV_MASK 0xFF /* * PLL B input frequency spec sheet says it must be between 1MHz and 32MHz, @@ -51,10 +51,11 @@ #define RM9200_PLL_B_MIN_OUT_FREQ 30000000 /* 30 MHz */ #define RM9200_PLL_B_MAX_OUT_FREQ 240000000 /* 240 MHz */ #define RM9200_PLL_B_MUL_SHIFT 16 -#define RM9200_PLL_B_MUL_MASK 0x7FF +#define RM9200_PLL_B_MUL_MASK 0x7FF #define RM9200_PLL_B_DIV_SHIFT 0 -#define RM9200_PLL_B_DIV_MASK 0xFF -/* +#define RM9200_PLL_B_DIV_MASK 0xFF + +/* * Memory map, from datasheet : * 0x00000000 - 0x0ffffffff : Internal Memories * 0x10000000 - 0x1ffffffff : Chip Select 0 @@ -69,7 +70,6 @@ * 0xf0000000 - 0xfffffffff : Peripherals */ -#define AT91RM92_BASE 0xd0000000 /* Usart */ #define AT91RM92_USART_SIZE 0x4000 @@ -91,146 +91,6 @@ #define AT91RM92_SYS_BASE 0xffff000 #define AT91RM92_SYS_SIZE 0x1000 -#if 0 -/* Interrupt Controller */ -#define IC_SMR (0) /* Source mode register */ -#define IC_SVR (128) /* Source vector register */ -#define IC_IVR (256) /* IRQ vector register */ -#define IC_FVR (260) /* FIQ vector register */ -#define IC_ISR (264) /* Interrupt status register */ -#define IC_IPR (268) /* Interrupt pending register */ -#define IC_IMR (272) /* Interrupt status register */ -#define IC_CISR (276) /* Core interrupt status register */ -#define IC_IECR (288) /* Interrupt enable command register */ -#define IC_IDCR (292) /* Interrupt disable command register */ -#define IC_ICCR (296) /* Interrupt clear command register */ -#define IC_ISCR (300) /* Interrupt set command register */ -#define IC_EOICR (304) /* End of interrupt command register */ -#define IC_SPU (308) /* Spurious vector register */ -#define IC_DCR (312) /* Debug control register */ -#define IC_FFER (320) /* Fast forcing enable register */ -#define IC_FFDR (324) /* Fast forcing disable register */ -#define IC_FFSR (328) /* Fast forcing status register */ - - -#define PIOA_PER (0x400) /* PIO Enable Register */ -#define PIOA_PDR (0x400 + 4) /* PIO Disable Register */ -#define PIOA_PSR (0x400 + 8) /* PIO status register */ -#define PIOA_OER (0x400 + 16) /* Output enable register */ -#define PIOA_ODR (0x400 + 20) /* Output disable register */ -#define PIOA_OSR (0x400 + 24) /* Output status register */ -#define PIOA_IFER (0x400 + 32) /* Input filter enable register */ -#define PIOA_IFDR (0x400 + 36) /* Input filter disable register */ -#define PIOA_IFSR (0x400 + 40) /* Input filter status register */ -#define PIOA_SODR (0x400 + 48) /* Set output data register */ -#define PIOA_CODR (0x400 + 52) /* Clear output data register */ -#define PIOA_ODSR (0x400 + 56) /* Output data status register */ -#define PIOA_PDSR (0x400 + 60) /* Pin data status register */ -#define PIOA_IER (0x400 + 64) /* Interrupt enable register */ -#define PIOA_IDR (0x400 + 68) /* Interrupt disable register */ -#define PIOA_IMR (0x400 + 72) /* Interrupt mask register */ -#define PIOA_ISR (0x400 + 76) /* Interrupt status register */ -#define PIOA_MDER (0x400 + 80) /* Multi driver enable register */ -#define PIOA_MDDR (0x400 + 84) /* Multi driver disable register */ -#define PIOA_MDSR (0x400 + 88) /* Multi driver status register */ -#define PIOA_PPUDR (0x400 + 96) /* Pull-up disable register */ -#define PIOA_PPUER (0x400 + 100) /* Pull-up enable register */ -#define PIOA_PPUSR (0x400 + 104) /* Pad pull-up status register */ -#define PIOA_ASR (0x400 + 112) /* Select A register */ -#define PIOA_BSR (0x400 + 116) /* Select B register */ -#define PIOA_ABSR (0x400 + 120) /* AB Select status register */ -#define PIOA_OWER (0x400 + 160) /* Output Write enable register */ -#define PIOA_OWDR (0x400 + 164) /* Output write disable register */ -#define PIOA_OWSR (0x400 + 168) /* Output write status register */ -#define PIOB_PER (0x400) /* PIO Enable Register */ -#define PIOB_PDR (0x600 + 4) /* PIO Disable Register */ -#define PIOB_PSR (0x600 + 8) /* PIO status register */ -#define PIOB_OER (0x600 + 16) /* Output enable register */ -#define PIOB_ODR (0x600 + 20) /* Output disable register */ -#define PIOB_OSR (0x600 + 24) /* Output status register */ -#define PIOB_IFER (0x600 + 32) /* Input filter enable register */ -#define PIOB_IFDR (0x600 + 36) /* Input filter disable register */ -#define PIOB_IFSR (0x600 + 40) /* Input filter status register */ -#define PIOB_SODR (0x600 + 48) /* Set output data register */ -#define PIOB_CODR (0x600 + 52) /* Clear output data register */ -#define PIOB_ODSR (0x600 + 56) /* Output data status register */ -#define PIOB_PDSR (0x600 + 60) /* Pin data status register */ -#define PIOB_IER (0x600 + 64) /* Interrupt enable register */ -#define PIOB_IDR (0x600 + 68) /* Interrupt disable register */ -#define PIOB_IMR (0x600 + 72) /* Interrupt mask register */ -#define PIOB_ISR (0x600 + 76) /* Interrupt status register */ -#define PIOB_MDER (0x600 + 80) /* Multi driver enable register */ -#define PIOB_MDDR (0x600 + 84) /* Multi driver disable register */ -#define PIOB_MDSR (0x600 + 88) /* Multi driver status register */ -#define PIOB_PPUDR (0x600 + 96) /* Pull-up disable register */ -#define PIOB_PPUER (0x600 + 100) /* Pull-up enable register */ -#define PIOB_PPUSR (0x600 + 104) /* Pad pull-up status register */ -#define PIOB_ASR (0x600 + 112) /* Select A register */ -#define PIOB_BSR (0x600 + 116) /* Select B register */ -#define PIOB_ABSR (0x600 + 120) /* AB Select status register */ -#define PIOB_OWER (0x600 + 160) /* Output Write enable register */ -#define PIOB_OWDR (0x600 + 164) /* Output write disable register */ -#define PIOB_OWSR (0x600 + 168) /* Output write status register */ -#define PIOC_PER (0x800) /* PIO Enable Register */ -#define PIOC_PDR (0x800 + 4) /* PIO Disable Register */ -#define PIOC_PSR (0x800 + 8) /* PIO status register */ -#define PIOC_OER (0x800 + 16) /* Output enable register */ -#define PIOC_ODR (0x800 + 20) /* Output disable register */ -#define PIOC_OSR (0x800 + 24) /* Output status register */ -#define PIOC_IFER (0x800 + 32) /* Input filter enable register */ -#define PIOC_IFDR (0x800 + 36) /* Input filter disable register */ -#define PIOC_IFSR (0x800 + 40) /* Input filter status register */ -#define PIOC_SODR (0x800 + 48) /* Set output data register */ -#define PIOC_CODR (0x800 + 52) /* Clear output data register */ -#define PIOC_ODSR (0x800 + 56) /* Output data status register */ -#define PIOC_PDSR (0x800 + 60) /* Pin data status register */ -#define PIOC_IER (0x800 + 64) /* Interrupt enable register */ -#define PIOC_IDR (0x800 + 68) /* Interrupt disable register */ -#define PIOC_IMR (0x800 + 72) /* Interrupt mask register */ -#define PIOC_ISR (0x800 + 76) /* Interrupt status register */ -#define PIOC_MDER (0x800 + 80) /* Multi driver enable register */ -#define PIOC_MDDR (0x800 + 84) /* Multi driver disable register */ -#define PIOC_MDSR (0x800 + 88) /* Multi driver status register */ -#define PIOC_PPUDR (0x800 + 96) /* Pull-up disable register */ -#define PIOC_PPUER (0x800 + 100) /* Pull-up enable register */ -#define PIOC_PPUSR (0x800 + 104) /* Pad pull-up status register */ -#define PIOC_ASR (0x800 + 112) /* Select A register */ -#define PIOC_BSR (0x800 + 116) /* Select B register */ -#define PIOC_ABSR (0x800 + 120) /* AB Select status register */ -#define PIOC_OWER (0x800 + 160) /* Output Write enable register */ -#define PIOC_OWDR (0x800 + 164) /* Output write disable register */ -#define PIOC_OWSR (0x800 + 168) /* Output write status register */ -#define PIOD_PER (0xa00) /* PIO Enable Register */ -#define PIOD_PDR (0xa00 + 4) /* PIO Disable Register */ -#define PIOD_PSR (0xa00 + 8) /* PIO status register */ -#define PIOD_OER (0xa00 + 16) /* Output enable register */ -#define PIOD_ODR (0xa00 + 20) /* Output disable register */ -#define PIOD_OSR (0xa00 + 24) /* Output status register */ -#define PIOD_IFER (0xa00 + 32) /* Input filter enable register */ -#define PIOD_IFDR (0xa00 + 36) /* Input filter disable register */ -#define PIOD_IFSR (0xa00 + 40) /* Input filter status register */ -#define PIOD_SODR (0xa00 + 48) /* Set output data register */ -#define PIOD_CODR (0xa00 + 52) /* Clear output data register */ -#define PIOD_ODSR (0xa00 + 56) /* Output data status register */ -#define PIOD_PDSR (0xa00 + 60) /* Pin data status register */ -#define PIOD_IER (0xa00 + 64) /* Interrupt enable register */ -#define PIOD_IDR (0xa00 + 68) /* Interrupt disable register */ -#define PIOD_IMR (0xa00 + 72) /* Interrupt mask register */ -#define PIOD_ISR (0xa00 + 76) /* Interrupt status register */ -#define PIOD_MDER (0xa00 + 80) /* Multi driver enable register */ -#define PIOD_MDDR (0xa00 + 84) /* Multi driver disable register */ -#define PIOD_MDSR (0xa00 + 88) /* Multi driver status register */ -#define PIOD_PPUDR (0xa00 + 96) /* Pull-up disable register */ -#define PIOD_PPUER (0xa00 + 100) /* Pull-up enable register */ -#define PIOD_PPUSR (0xa00 + 104) /* Pad pull-up status register */ -#define PIOD_ASR (0xa00 + 112) /* Select A register */ -#define PIOD_BSR (0xa00 + 116) /* Select B register */ -#define PIOD_ABSR (0xa00 + 120) /* AB Select status register */ -#define PIOD_OWER (0xa00 + 160) /* Output Write enable register */ -#define PIOD_OWDR (0xa00 + 164) /* Output write disable register */ -#define PIOD_OWSR (0xa00 + 168) /* Output write status register */ - -#endif /* * PIO */ @@ -252,7 +112,7 @@ /* IRQs : */ /* - * 0: AIC + * 0: AIC * 1: System peripheral (System timer, RTC, DBGU) * 2: PIO Controller A * 3: PIO Controller B @@ -403,10 +263,6 @@ #define AT91RM92_CF_PA_BASE 0x51400000 #define AT91RM92_CF_SIZE 0x00100000 -#ifndef AT91C_MASTER_CLOCK -#define AT91C_MASTER_CLOCK 60000000 -#endif - /* SDRAMC */ #define AT91RM92_SDRAMC_BASE 0xfffff90 diff --git a/sys/arm/at91/at91sam9260.c b/sys/arm/at91/at91sam9260.c index cbc5a2778ba..2eee2e577d5 100644 --- a/sys/arm/at91/at91sam9260.c +++ b/sys/arm/at91/at91sam9260.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -49,7 +50,6 @@ struct at91sam9_softc { bus_space_handle_t sc_sh; bus_space_handle_t sc_sys_sh; bus_space_handle_t sc_aic_sh; - bus_space_handle_t sc_dbg_sh; bus_space_handle_t sc_matrix_sh; }; @@ -128,41 +128,6 @@ static const struct cpu_devs at91_devs[] = { 0, 0, 0, 0, 0 } }; -static void -at91_add_child(device_t dev, int prio, const char *name, int unit, - bus_addr_t addr, bus_size_t size, int irq0, int irq1, int irq2) -{ - device_t kid; - struct at91_ivar *ivar; - - kid = device_add_child_ordered(dev, prio, name, unit); - if (kid == NULL) { - printf("Can't add child %s%d ordered\n", name, unit); - return; - } - ivar = malloc(sizeof(*ivar), M_DEVBUF, M_NOWAIT | M_ZERO); - if (ivar == NULL) { - device_delete_child(dev, kid); - printf("Can't add alloc ivar\n"); - return; - } - device_set_ivars(kid, ivar); - resource_list_init(&ivar->resources); - if (irq0 != -1) { - bus_set_resource(kid, SYS_RES_IRQ, 0, irq0, 1); - if (irq0 != AT91SAM9260_IRQ_SYSTEM) - at91_pmc_clock_add(device_get_nameunit(kid), irq0, 0); - } - if (irq1 != 0) - bus_set_resource(kid, SYS_RES_IRQ, 1, irq1, 1); - if (irq2 != 0) - bus_set_resource(kid, SYS_RES_IRQ, 2, irq2, 1); - if (addr != 0 && addr < AT91SAM9260_BASE) - addr += AT91SAM9260_BASE; - if (addr != 0) - bus_set_resource(kid, SYS_RES_MEMORY, 0, addr, size); -} - static void at91_cpu_add_builtin_children(device_t dev) { @@ -197,39 +162,17 @@ static void at91_identify(driver_t *drv, device_t parent) { - switch (AT91_CPU(at91_chip_id)) { - case AT91_CPU_SAM9260: - case AT91_CPU_SAM9XE128: - case AT91_CPU_SAM9XE256: - case AT91_CPU_SAM9XE512: + if (soc_data.type == AT91_T_SAM9260) { at91_add_child(parent, 0, "at91sam9260", 0, 0, 0, -1, 0, 0); at91_cpu_add_builtin_children(parent); - break; } } static int at91_probe(device_t dev) { - const char *desc; - switch (AT91_CPU(at91_chip_id)) { - case AT91_CPU_SAM9260: - desc = "AT91SAM9260"; - break; - case AT91_CPU_SAM9XE128: - desc = "AT91SAM9XE128"; - break; - case AT91_CPU_SAM9XE256: - desc = "AT91SAM9XE256"; - break; - case AT91_CPU_SAM9XE512: - desc = "AT91SAM9XE512"; - break; - default: - return (ENXIO); - } - device_set_desc(dev, desc); + device_set_desc(dev, soc_data.name); return (0); } @@ -250,17 +193,12 @@ at91_attach(device_t dev) AT91SAM9260_SYS_SIZE, &sc->sc_sys_sh) != 0) panic("Enable to map system registers"); - if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91SAM9260_DBGU_BASE, - AT91SAM9260_DBGU_SIZE, &sc->sc_dbg_sh) != 0) - panic("Enable to map DBGU registers"); - if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91SAM9260_AIC_BASE, AT91SAM9260_AIC_SIZE, &sc->sc_aic_sh) != 0) panic("Enable to map system registers"); /* XXX Hack to tell atmelarm about the AIC */ at91sc->sc_aic_sh = sc->sc_aic_sh; - at91sc->sc_irq_system = AT91SAM9260_IRQ_SYSTEM; for (i = 0; i < 32; i++) { bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_SVR + @@ -280,15 +218,12 @@ at91_attach(device_t dev) bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_IDCR, 0xffffffff); bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_ICCR, 0xffffffff); - /* Disable all interrupts for DBGU */ - bus_space_write_4(sc->sc_st, sc->sc_dbg_sh, 0x0c, 0xffffffff); - if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91SAM9260_MATRIX_BASE, AT91SAM9260_MATRIX_SIZE, &sc->sc_matrix_sh) != 0) panic("Enable to map matrix registers"); - /* activate NAND*/ + /* activate NAND */ i = bus_space_read_4(sc->sc_st, sc->sc_matrix_sh, AT91SAM9260_EBICSA); bus_space_write_4(sc->sc_st, sc->sc_matrix_sh, diff --git a/sys/arm/at91/at91sam9260reg.h b/sys/arm/at91/at91sam9260reg.h index c790c2cf9e4..e04afb8241c 100644 --- a/sys/arm/at91/at91sam9260reg.h +++ b/sys/arm/at91/at91sam9260reg.h @@ -28,19 +28,15 @@ #ifndef AT91SAM9260REG_H_ #define AT91SAM9260REG_H_ -#ifndef AT91SAM9260_MASTER_CLOCK -#define AT91SAM9260_MASTER_CLOCK ((18432000 * 43)/6) -#endif - /* Chip Specific limits */ #define SAM9260_PLL_A_MIN_IN_FREQ 1000000 /* 1 Mhz */ #define SAM9260_PLL_A_MAX_IN_FREQ 32000000 /* 32 Mhz */ #define SAM9260_PLL_A_MIN_OUT_FREQ 80000000 /* 80 Mhz */ #define SAM9260_PLL_A_MAX_OUT_FREQ 240000000 /* 240 Mhz */ #define SAM9260_PLL_A_MUL_SHIFT 16 -#define SAM9260_PLL_A_MUL_MASK 0x3FF +#define SAM9260_PLL_A_MUL_MASK 0x3FF #define SAM9260_PLL_A_DIV_SHIFT 0 -#define SAM9260_PLL_A_DIV_MASK 0xFF +#define SAM9260_PLL_A_DIV_MASK 0xFF #define SAM9260_PLL_B_MIN_IN_FREQ 1000000 /* 1 Mhz */ #define SAM9260_PLL_B_MAX_IN_FREQ 5000000 /* 5 Mhz */ @@ -49,9 +45,9 @@ #define SAM9260_PLL_B_MUL_SHIFT 16 #define SAM9260_PLL_B_MUL_MASK 0x3FF #define SAM9260_PLL_B_DIV_SHIFT 0 -#define SAM9260_PLL_B_DIV_MASK 0xFF +#define SAM9260_PLL_B_DIV_MASK 0xFF -/* +/* * Memory map, from datasheet : * 0x00000000 - 0x0ffffffff : Internal Memories * 0x10000000 - 0x1ffffffff : Chip Select 0 @@ -76,9 +72,6 @@ #define AT91_CHIPSELECT_7 0x80000000 -#define AT91SAM9260_BASE 0xd0000000 - - #define AT91SAM9260_EMAC_BASE 0xffc4000 #define AT91SAM9260_EMAC_SIZE 0x4000 @@ -160,7 +153,7 @@ #define AT91RM92_PMC_SIZE 0x100 /* IRQs : */ /* - * 0: AIC + * 0: AIC * 1: System peripheral (System timer, RTC, DBGU) * 2: PIO Controller A * 3: PIO Controller B diff --git a/sys/arm/at91/at91sam9g20.c b/sys/arm/at91/at91sam9g20.c index 61d9ac4e609..9146fdafed4 100644 --- a/sys/arm/at91/at91sam9g20.c +++ b/sys/arm/at91/at91sam9g20.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -49,7 +50,6 @@ struct at91sam9_softc { bus_space_handle_t sc_sh; bus_space_handle_t sc_sys_sh; bus_space_handle_t sc_aic_sh; - bus_space_handle_t sc_dbg_sh; bus_space_handle_t sc_matrix_sh; }; @@ -128,41 +128,6 @@ static const struct cpu_devs at91_devs[] = { 0, 0, 0, 0, 0 } }; -static void -at91_add_child(device_t dev, int prio, const char *name, int unit, - bus_addr_t addr, bus_size_t size, int irq0, int irq1, int irq2) -{ - device_t kid; - struct at91_ivar *ivar; - - kid = device_add_child_ordered(dev, prio, name, unit); - if (kid == NULL) { - printf("Can't add child %s%d ordered\n", name, unit); - return; - } - ivar = malloc(sizeof(*ivar), M_DEVBUF, M_NOWAIT | M_ZERO); - if (ivar == NULL) { - device_delete_child(dev, kid); - printf("Can't add alloc ivar\n"); - return; - } - device_set_ivars(kid, ivar); - resource_list_init(&ivar->resources); - if (irq0 != -1) { - bus_set_resource(kid, SYS_RES_IRQ, 0, irq0, 1); - if (irq0 != AT91SAM9G20_IRQ_SYSTEM) - at91_pmc_clock_add(device_get_nameunit(kid), irq0, 0); - } - if (irq1 != 0) - bus_set_resource(kid, SYS_RES_IRQ, 1, irq1, 1); - if (irq2 != 0) - bus_set_resource(kid, SYS_RES_IRQ, 2, irq2, 1); - if (addr != 0 && addr < AT91SAM9G20_BASE) - addr += AT91SAM9G20_BASE; - if (addr != 0) - bus_set_resource(kid, SYS_RES_MEMORY, 0, addr, size); -} - static void at91_cpu_add_builtin_children(device_t dev) { @@ -204,7 +169,7 @@ static void at91_identify(driver_t *drv, device_t parent) { - if (at91_cpu_is(AT91_CPU_SAM9G20)) { + if (at91_cpu_is(AT91_T_SAM9G20)) { at91_add_child(parent, 0, "at91sam", 9, 0, 0, -1, 0, 0); at91_cpu_add_builtin_children(parent); } @@ -214,11 +179,8 @@ static int at91_probe(device_t dev) { - if (at91_cpu_is(AT91_CPU_SAM9G20)) { - device_set_desc(dev, "AT91SAM9G20"); - return (0); - } - return (ENXIO); + device_set_desc(dev, soc_data.name); + return (0); } static int @@ -234,7 +196,7 @@ at91_attach(device_t dev) sc->sc_sh = at91sc->sc_sh; sc->dev = dev; - /* + /* * XXX These values work for the RM9200, SAM926[01], and SAM9G20 * will have to fix this when we want to support anything else. XXX */ @@ -242,20 +204,15 @@ at91_attach(device_t dev) AT91SAM9G20_SYS_SIZE, &sc->sc_sys_sh) != 0) panic("Enable to map system registers"); - if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91SAM9G20_DBGU_BASE, - AT91SAM9G20_DBGU_SIZE, &sc->sc_dbg_sh) != 0) - panic("Enable to map DBGU registers"); - if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91SAM9G20_AIC_BASE, AT91SAM9G20_AIC_SIZE, &sc->sc_aic_sh) != 0) panic("Enable to map system registers"); /* XXX Hack to tell atmelarm about the AIC */ at91sc->sc_aic_sh = sc->sc_aic_sh; - at91sc->sc_irq_system = AT91SAM9G20_IRQ_SYSTEM; for (i = 0; i < 32; i++) { - bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_SVR + + bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_SVR + i * 4, i); /* Priority. */ bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_SMR + i * 4, @@ -272,9 +229,6 @@ at91_attach(device_t dev) bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_IDCR, 0xffffffff); bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_ICCR, 0xffffffff); - /* Disable all interrupts for DBGU */ - bus_space_write_4(sc->sc_st, sc->sc_dbg_sh, 0x0c, 0xffffffff); - if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91SAM9G20_MATRIX_BASE, AT91SAM9G20_MATRIX_SIZE, &sc->sc_matrix_sh) != 0) @@ -284,7 +238,7 @@ at91_attach(device_t dev) i = bus_space_read_4(sc->sc_st, sc->sc_matrix_sh, AT91SAM9G20_EBICSA); bus_space_write_4(sc->sc_st, sc->sc_matrix_sh, - AT91SAM9G20_EBICSA, + AT91SAM9G20_EBICSA, i | AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA); diff --git a/sys/arm/at91/at91sam9g20reg.h b/sys/arm/at91/at91sam9g20reg.h index 71683e91c46..ab686c39824 100644 --- a/sys/arm/at91/at91sam9g20reg.h +++ b/sys/arm/at91/at91sam9g20reg.h @@ -29,30 +29,26 @@ #ifndef AT91SAM9G20REG_H_ #define AT91SAM9G20REG_H_ -#ifndef AT91SAM9G20_MASTER_CLOCK -#define AT91SAM9G20_MASTER_CLOCK ((18432000 * 43)/6) -#endif - /* Chip Specific limits */ #define SAM9G20_PLL_A_MIN_IN_FREQ 2000000 /* 2 Mhz */ #define SAM9G20_PLL_A_MAX_IN_FREQ 32000000 /* 32 Mhz */ #define SAM9G20_PLL_A_MIN_OUT_FREQ 400000000 /* 400 Mhz */ #define SAM9G20_PLL_A_MAX_OUT_FREQ 800000000 /* 800 Mhz */ #define SAM9G20_PLL_A_MUL_SHIFT 16 -#define SAM9G20_PLL_A_MUL_MASK 0xFF +#define SAM9G20_PLL_A_MUL_MASK 0xFF #define SAM9G20_PLL_A_DIV_SHIFT 0 -#define SAM9G20_PLL_A_DIV_MASK 0xFF +#define SAM9G20_PLL_A_DIV_MASK 0xFF #define SAM9G20_PLL_B_MIN_IN_FREQ 2000000 /* 2 Mhz */ #define SAM9G20_PLL_B_MAX_IN_FREQ 32000000 /* 32 Mhz */ #define SAM9G20_PLL_B_MIN_OUT_FREQ 30000000 /* 30 Mhz */ #define SAM9G20_PLL_B_MAX_OUT_FREQ 100000000 /* 100 Mhz */ #define SAM9G20_PLL_B_MUL_SHIFT 16 -#define SAM9G20_PLL_B_MUL_MASK 0x3F +#define SAM9G20_PLL_B_MUL_MASK 0x3F #define SAM9G20_PLL_B_DIV_SHIFT 0 -#define SAM9G20_PLL_B_DIV_MASK 0xFF +#define SAM9G20_PLL_B_DIV_MASK 0xFF -/* +/* * Memory map, from datasheet : * 0x00000000 - 0x0ffffffff : Internal Memories * 0x10000000 - 0x1ffffffff : Chip Select 0 @@ -77,9 +73,6 @@ #define AT91_CHIPSELECT_7 0x80000000 -#define AT91SAM9G20_BASE 0xd0000000 - - #define AT91SAM9G20_EMAC_BASE 0xffc4000 #define AT91SAM9G20_EMAC_SIZE 0x4000 @@ -161,7 +154,7 @@ #define AT91RM92_PMC_SIZE 0x100 /* IRQs : */ /* - * 0: AIC + * 0: AIC * 1: System peripheral (System timer, RTC, DBGU) * 2: PIO Controller A * 3: PIO Controller B @@ -238,7 +231,7 @@ #define AT91SAM9G20_WDT_SIZE 0x10 #define AT91SAM9G20_PIT_BASE 0xffffd30 -#define AT91SAM9G20_PIT_SIZE 10 +#define AT91SAM9G20_PIT_SIZE 0x10 #define AT91SAM9G20_SMC_BASE 0xfffec00 #define AT91SAM9G20_SMC_SIZE 0x200 diff --git a/sys/arm/at91/at91sam9x25.c b/sys/arm/at91/at91sam9x25.c new file mode 100644 index 00000000000..0c10078092d --- /dev/null +++ b/sys/arm/at91/at91sam9x25.c @@ -0,0 +1,286 @@ +/*- + * Copyright (c) 2005 Olivier Houchard. All rights reserved. + * Copyright (c) 2010 Greg Ansley. All rights reserved. + * Copyright (c) 2012 M. Warner Losh.. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +struct at91sam9x25_softc { + device_t dev; + bus_space_tag_t sc_st; + bus_space_handle_t sc_sh; + bus_space_handle_t sc_sys_sh; + bus_space_handle_t sc_aic_sh; +}; + +/* + * Standard priority levels for the system. 0 is lowest and 7 is highest. + * These values are the ones Atmel uses for its Linux port + */ +static const int at91_irq_prio[32] = +{ + 7, /* Advanced Interrupt Controller (FIQ) */ + 7, /* System Peripherals */ + 1, /* Parallel IO Controller A and B */ + 1, /* Parallel IO Controller C and D */ + 4, /* Soft Modem */ + 5, /* USART 0 */ + 5, /* USART 1 */ + 5, /* USART 2 */ + 5, /* USART 3 */ + 6, /* Two-Wire Interface 0 */ + 6, /* Two-Wire Interface 1 */ + 6, /* Two-Wire Interface 2 */ + 0, /* Multimedia Card Interface 0 */ + 5, /* Serial Peripheral Interface 0 */ + 5, /* Serial Peripheral Interface 1 */ + 5, /* UART 0 */ + 5, /* UART 1 */ + 0, /* Timer Counter 0, 1, 2, 3, 4 and 5 */ + 0, /* Pulse Width Modulation Controller */ + 0, /* ADC Controller */ + 0, /* DMA Controller 0 */ + 0, /* DMA Controller 1 */ + 2, /* USB Host High Speed port */ + 2, /* USB Device High speed port */ + 3, /* Ethernet MAC 0 */ + 3, /* LDC Controller or Image Sensor Interface */ + 0, /* Multimedia Card Interface 1 */ + 3, /* Ethernet MAC 1 */ + 4, /* Synchronous Serial Interface */ + 4, /* CAN Controller 0 */ + 4, /* CAN Controller 1 */ + 0, /* Advanced Interrupt Controller (IRQ0) */ +}; + +#define DEVICE(_name, _id, _unit) \ + { \ + _name, _unit, \ + AT91SAM9X25_ ## _id ##_BASE, \ + AT91SAM9X25_ ## _id ## _SIZE, \ + AT91SAM9X25_IRQ_ ## _id \ + } + +static const struct cpu_devs at91_devs[] = +{ + DEVICE("at91_pmc", PMC, 0), + DEVICE("at91_wdt", WDT, 0), + DEVICE("at91_rst", RSTC, 0), + DEVICE("at91_pit", PIT, 0), + DEVICE("at91_pio", PIOA, 0), + DEVICE("at91_pio", PIOB, 1), + DEVICE("at91_pio", PIOC, 2), + DEVICE("at91_pio", PIOD, 3), + DEVICE("at91_twi", TWI0, 0), + DEVICE("at91_twi", TWI1, 1), + DEVICE("at91_twi", TWI2, 2), + DEVICE("at91_mci", HSMCI0, 0), + DEVICE("at91_mci", HSMCI1, 1), + DEVICE("uart", DBGU, 0), + DEVICE("uart", USART0, 1), + DEVICE("uart", USART1, 2), + DEVICE("uart", USART2, 3), + DEVICE("uart", USART3, 4), + DEVICE("spi", SPI0, 0), + DEVICE("spi", SPI1, 1), + DEVICE("macb", EMAC0, 0), + DEVICE("macb", EMAC1, 0), + DEVICE("nand", NAND, 0), + DEVICE("ohci", OHCI, 0), + DEVICE("ehci", EHCI, 0), + { 0, 0, 0, 0, 0 } +}; + +static void +at91_cpu_add_builtin_children(device_t dev) +{ + int i; + const struct cpu_devs *walker; + + for (i = 1, walker = at91_devs; walker->name; i++, walker++) { + at91_add_child(dev, i, walker->name, walker->unit, + walker->mem_base, walker->mem_len, walker->irq0, + walker->irq1, walker->irq2); + } +} + +static uint32_t +at91_pll_outa(int freq) +{ + + switch (freq / 10000000) { + case 747 ... 801: return ((1 << 29) | (0 << 14)); + case 697 ... 746: return ((1 << 29) | (1 << 14)); + case 647 ... 696: return ((1 << 29) | (2 << 14)); + case 597 ... 646: return ((1 << 29) | (3 << 14)); + case 547 ... 596: return ((1 << 29) | (1 << 14)); + case 497 ... 546: return ((1 << 29) | (2 << 14)); + case 447 ... 496: return ((1 << 29) | (3 << 14)); + case 397 ... 446: return ((1 << 29) | (4 << 14)); + default: return (1 << 29); + } +} + +static uint32_t +at91_pll_outb(int freq) +{ + + return (0); +} + +static void +at91_identify(driver_t *drv, device_t parent) +{ + + if (soc_data.type == AT91_T_SAM9X5 && soc_data.subtype == AT91_ST_SAM9X25) { + at91_add_child(parent, 0, "at91sam9x25", 0, 0, 0, -1, 0, 0); + at91_cpu_add_builtin_children(parent); + } +} + +static int +at91_probe(device_t dev) +{ + + device_set_desc(dev, "AT91SAM9X25"); + return (0); +} + +static int +at91_attach(device_t dev) +{ + struct at91_pmc_clock *clk; + struct at91sam9x25_softc *sc = device_get_softc(dev); + int i; + + struct at91_softc *at91sc = device_get_softc(device_get_parent(dev)); + + sc->sc_st = at91sc->sc_st; + sc->sc_sh = at91sc->sc_sh; + sc->dev = dev; + + /* + * XXX These values work for the RM9200, SAM926[01], and SAM9X25 + * will have to fix this when we want to support anything else. XXX + */ + if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91SAM9X25_SYS_BASE, + AT91SAM9X25_SYS_SIZE, &sc->sc_sys_sh) != 0) + panic("Enable to map system registers"); + + if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91SAM9X25_AIC_BASE, + AT91SAM9X25_AIC_SIZE, &sc->sc_aic_sh) != 0) + panic("Enable to map system registers"); + + /* XXX Hack to tell atmelarm about the AIC */ + at91sc->sc_aic_sh = sc->sc_aic_sh; + + for (i = 0; i < 32; i++) { + bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_SVR + + i * 4, i); + /* Priority. */ + bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_SMR + i * 4, + at91_irq_prio[i]); + if (i < 8) + bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_EOICR, + 1); + } + + bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_SPU, 32); + /* No debug. */ + bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_DCR, 0); + /* Disable and clear all interrupts. */ + bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_IDCR, 0xffffffff); + bus_space_write_4(sc->sc_st, sc->sc_aic_sh, IC_ICCR, 0xffffffff); + + /* Update USB device port clock info */ + clk = at91_pmc_clock_ref("udpck"); + clk->pmc_mask = PMC_SCER_UDP_SAM9; + at91_pmc_clock_deref(clk); + + /* Update USB host port clock info */ + clk = at91_pmc_clock_ref("uhpck"); + clk->pmc_mask = PMC_SCER_UHP_SAM9; + at91_pmc_clock_deref(clk); + + /* Each SOC has different PLL contraints */ + clk = at91_pmc_clock_ref("plla"); + clk->pll_min_in = SAM9X25_PLL_A_MIN_IN_FREQ; /* 2 MHz */ + clk->pll_max_in = SAM9X25_PLL_A_MAX_IN_FREQ; /* 32 MHz */ + clk->pll_min_out = SAM9X25_PLL_A_MIN_OUT_FREQ; /* 400 MHz */ + clk->pll_max_out = SAM9X25_PLL_A_MAX_OUT_FREQ; /* 800 MHz */ + clk->pll_mul_shift = SAM9X25_PLL_A_MUL_SHIFT; + clk->pll_mul_mask = SAM9X25_PLL_A_MUL_MASK; + clk->pll_div_shift = SAM9X25_PLL_A_DIV_SHIFT; + clk->pll_div_mask = SAM9X25_PLL_A_DIV_MASK; + clk->set_outb = at91_pll_outa; + at91_pmc_clock_deref(clk); + + clk = at91_pmc_clock_ref("pllb"); + clk->pll_min_in = SAM9X25_PLL_B_MIN_IN_FREQ; /* 2 MHz */ + clk->pll_max_in = SAM9X25_PLL_B_MAX_IN_FREQ; /* 32 MHz */ + clk->pll_min_out = SAM9X25_PLL_B_MIN_OUT_FREQ; /* 30 MHz */ + clk->pll_max_out = SAM9X25_PLL_B_MAX_OUT_FREQ; /* 100 MHz */ + clk->pll_mul_shift = SAM9X25_PLL_B_MUL_SHIFT; + clk->pll_mul_mask = SAM9X25_PLL_B_MUL_MASK; + clk->pll_div_shift = SAM9X25_PLL_B_DIV_SHIFT; + clk->pll_div_mask = SAM9X25_PLL_B_DIV_MASK; + clk->set_outb = at91_pll_outb; + at91_pmc_clock_deref(clk); + return (0); +} + +static device_method_t at91sam9x25_methods[] = { + DEVMETHOD(device_probe, at91_probe), + DEVMETHOD(device_attach, at91_attach), + DEVMETHOD(device_identify, at91_identify), + {0, 0}, +}; + +static driver_t at91sam9x25_driver = { + "at91sam9x25", + at91sam9x25_methods, + sizeof(struct at91sam9x25_softc), +}; + +static devclass_t at91sam9x25_devclass; + +DRIVER_MODULE(at91sam9x25, atmelarm, at91sam9x25_driver, at91sam9x25_devclass, 0, 0); diff --git a/sys/arm/at91/at91sam9x25reg.h b/sys/arm/at91/at91sam9x25reg.h new file mode 100644 index 00000000000..d497e2bd774 --- /dev/null +++ b/sys/arm/at91/at91sam9x25reg.h @@ -0,0 +1,316 @@ +/*- + * Copyright (c) 2009 Sylvestre Gallon. All rights reserved. + * Copyright (c) 2010 Greg Ansley. All rights reserved. + * Copyright (c) 2012 M. Warener Losh. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $FreeBSD$ */ + +#ifndef AT91SAM9X25REG_H_ +#define AT91SAM9X25REG_H_ + +#ifndef AT91SAM9X25_MASTER_CLOCK +#define AT91SAM9X25_MASTER_CLOCK ((18432000 * 43)/6) +#endif + +/* Chip Specific limits */ +#define SAM9X25_PLL_A_MIN_IN_FREQ 2000000 /* 2 Mhz */ +#define SAM9X25_PLL_A_MAX_IN_FREQ 32000000 /* 32 Mhz */ +#define SAM9X25_PLL_A_MIN_OUT_FREQ 400000000 /* 400 Mhz */ +#define SAM9X25_PLL_A_MAX_OUT_FREQ 800000000 /* 800 Mhz */ +#define SAM9X25_PLL_A_MUL_SHIFT 16 +#define SAM9X25_PLL_A_MUL_MASK 0xFF +#define SAM9X25_PLL_A_DIV_SHIFT 0 +#define SAM9X25_PLL_A_DIV_MASK 0xFF + +#define SAM9X25_PLL_B_MIN_IN_FREQ 2000000 /* 2 Mhz */ +#define SAM9X25_PLL_B_MAX_IN_FREQ 32000000 /* 32 Mhz */ +#define SAM9X25_PLL_B_MIN_OUT_FREQ 30000000 /* 30 Mhz */ +#define SAM9X25_PLL_B_MAX_OUT_FREQ 100000000 /* 100 Mhz */ +#define SAM9X25_PLL_B_MUL_SHIFT 16 +#define SAM9X25_PLL_B_MUL_MASK 0x3F +#define SAM9X25_PLL_B_DIV_SHIFT 0 +#define SAM9X25_PLL_B_DIV_MASK 0xFF + +/* + * Memory map, from datasheet : + * 0x00000000 - 0x0ffffffff : Internal Memories + * 0x10000000 - 0x1ffffffff : Chip Select 0 + * 0x20000000 - 0x2ffffffff : Chip Select 1 DDR2/LPDDR/SDR/LPSDR + * 0x30000000 - 0x3ffffffff : Chip Select 2 + * 0x40000000 - 0x4ffffffff : Chip Select 3 NAND Flash + * 0x50000000 - 0x5ffffffff : Chip Select 4 + * 0x60000000 - 0x6ffffffff : Chip Select 5 + * 0x70000000 - 0xeffffffff : Undefined (Abort) + * 0xf0000000 - 0xfffffffff : Peripherals + */ + +#define AT91_CHIPSELECT_0 0x10000000 +#define AT91_CHIPSELECT_1 0x20000000 +#define AT91_CHIPSELECT_2 0x30000000 +#define AT91_CHIPSELECT_3 0x40000000 +#define AT91_CHIPSELECT_4 0x50000000 +#define AT91_CHIPSELECT_5 0x60000000 + +#define AT91SAM9X25_EMAC_SIZE 0x4000 +#define AT91SAM9X25_EMAC0_BASE 0x802c000 +#define AT91SAM9X25_EMAC0_SIZE AT91SAM9X25_EMAC_SIZE +#define AT91SAM9X25_EMAC1_BASE 0x8030000 +#define AT91SAM9X25_EMAC1_SIZE AT91SAM9X25_EMAC_SIZE + +#define AT91SAM9X25_RSTC_BASE 0xffffe00 +#define AT91SAM9X25_RSTC_SIZE 0x10 + +/* USART*/ + +#define AT91SAM9X25_USART_SIZE 0x4000 +#define AT91SAM9X25_USART0_BASE 0x801c000 +#define AT91SAM9X25_USART0_PDC 0x801c100 +#define AT91SAM9X25_USART0_SIZE AT91SAM9X25_USART_SIZE +#define AT91SAM9X25_USART1_BASE 0x8020000 +#define AT91SAM9X25_USART1_PDC 0x8020100 +#define AT91SAM9X25_USART1_SIZE AT91SAM9X25_USART_SIZE +#define AT91SAM9X25_USART2_BASE 0x8024000 +#define AT91SAM9X25_USART2_PDC 0x8024100 +#define AT91SAM9X25_USART2_SIZE AT91SAM9X25_USART_SIZE +#define AT91SAM9X25_USART3_BASE 0x8028000 +#define AT91SAM9X25_USART3_PDC 0x8028100 +#define AT91SAM9X25_USART3_SIZE AT91SAM9X25_USART_SIZE + +/*TC*/ +#define AT91SAM9X25_TC0_BASE 0x8008000 +#define AT91SAM9X25_TC0_SIZE 0x4000 +#define AT91SAM9X25_TC0C0_BASE 0x8008000 +#define AT91SAM9X25_TC0C1_BASE 0x8008040 +#define AT91SAM9X25_TC0C2_BASE 0x8008080 + +#define AT91SAM9X25_TC1_BASE 0x800c000 +#define AT91SAM9X25_TC1_SIZE 0x4000 + +/*SPI*/ + +#define AT91SAM9X25_SPI0_BASE 0x0000000 + +#define AT91SAM9X25_SPI0_SIZE 0x4000 + +#define AT91SAM9X25_SPI1_BASE 0x0004000 +#define AT91SAM9X25_SPI1_SIZE 0x4000 + +/* System Registers */ +#define AT91SAM9X25_SYS_BASE 0xffff000 +#define AT91SAM9X25_SYS_SIZE 0x1000 + +#define AT91SAM9X25_MATRIX_BASE 0xfffde00 +#define AT91SAM9X25_MATRIX_SIZE 0x200 + +#define AT91SAM9X25_DBGU_BASE 0xffff200 +#define AT91SAM9X25_DBGU_SIZE 0x200 + +/* + * PIO + */ +#define AT91SAM9X25_PIOA_BASE 0xffff400 +#define AT91SAM9X25_PIOA_SIZE 0x200 +#define AT91SAM9X25_PIOB_BASE 0xffff600 +#define AT91SAM9X25_PIOB_SIZE 0x200 +#define AT91SAM9X25_PIOC_BASE 0xffff800 +#define AT91SAM9X25_PIOC_SIZE 0x200 +#define AT91SAM9X25_PIOD_BASE 0xffffa00 +#define AT91SAM9X25_PIOD_SIZE 0x200 + +#define AT91RM92_PMC_BASE 0xffffc00 +#define AT91RM92_PMC_SIZE 0x100 +/* IRQs : + * 0: AIC + * 1: System peripheral (System timer, RTC, DBGU) + * 2: PIO Controller A,B + * 3: PIO Controller C,D + * 4: SMD Soft Modem + * 5: USART 0 + * 6: USART 1 + * 7: USART 2 + * 8: USART 3 + * 9: Two-wirte interface + * 10: Two-wirte interface + * 11: Two-wirte interface + * 12: HSMCI Interface + * 13: SPI 0 + * 14: SPI 1 + * 15: UART0 + * 16: UART1 + * 17: Timer Counter 0,1 + * 18: PWM + * 19: ADC + * 20: DMAC 0 + * 21: DMAC 1 + * 22: UHPHS - USB Host controller + * 23: UDPHS - USB Device Controller + * 24: EMAC0 + * 25: LCD controller or Image Sensor Interface + * 26: HSMCI1 + * 27: EMAC1 + * 28: SSC + * 29: CAN0 + * 30: CAN1 + * 31: AIC IRQ0 + */ + +#define AT91SAM9X25_IRQ_AIC 0 +#define AT91SAM9X25_IRQ_SYSTEM 1 +#define AT91SAM9X25_IRQ_PIOAB 2 +#define AT91SAM9X25_IRQ_PIOCD 3 +#define AT91SAM9X25_IRQ_SMD 4 +#define AT91SAM9X25_IRQ_USART0 5 +#define AT91SAM9X25_IRQ_USART1 6 +#define AT91SAM9X25_IRQ_USART2 7 +#define AT91SAM9X25_IRQ_USART3 8 +#define AT91SAM9X25_IRQ_TWI0 9 +#define AT91SAM9X25_IRQ_TWI1 10 +#define AT91SAM9X25_IRQ_TWI2 11 +#define AT91SAM9X25_IRQ_HSMCI0 12 +#define AT91SAM9X25_IRQ_SPI0 13 +#define AT91SAM9X25_IRQ_SPI1 14 +#define AT91SAM9X25_IRQ_UART0 15 +#define AT91SAM9X25_IRQ_UART1 16 +#define AT91SAM9X25_IRQ_TC01 17 +#define AT91SAM9X25_IRQ_PWM 18 +#define AT91SAM9X25_IRQ_ADC 19 +#define AT91SAM9X25_IRQ_DMAC0 20 +#define AT91SAM9X25_IRQ_DMAC1 21 +#define AT91SAM9X25_IRQ_UHPHS 22 +#define AT91SAM9X25_IRQ_UDPHS 23 +#define AT91SAM9X25_IRQ_EMAC0 24 +#define AT91SAM9X25_IRQ_HSMCI1 26 +#define AT91SAM9X25_IRQ_EMAC1 27 +#define AT91SAM9X25_IRQ_SSC 28 +#define AT91SAM9X25_IRQ_CAN0 29 +#define AT91SAM9X25_IRQ_CAN1 30 +#define AT91SAM9X25_IRQ_AICBASE 31 + +/* Alias */ +#define AT91SAM9X25_IRQ_DBGU AT91SAM9X25_IRQ_SYSTEM +#define AT91SAM9X25_IRQ_PMC AT91SAM9X25_IRQ_SYSTEM +#define AT91SAM9X25_IRQ_WDT AT91SAM9X25_IRQ_SYSTEM +#define AT91SAM9X25_IRQ_PIT AT91SAM9X25_IRQ_SYSTEM +#define AT91SAM9X25_IRQ_RSTC AT91SAM9X25_IRQ_SYSTEM +#define AT91SAM9X25_IRQ_OHCI AT91SAM9X25_IRQ_UHPHS +#define AT91SAM9X25_IRQ_EHCI AT91SAM9X25_IRQ_UHPHS +#define AT91SAM9X25_IRQ_PIOA AT91SAM9X25_IRQ_PIOAB +#define AT91SAM9X25_IRQ_PIOB AT91SAM9X25_IRQ_PIOAB +#define AT91SAM9X25_IRQ_PIOC AT91SAM9X25_IRQ_PIOCD +#define AT91SAM9X25_IRQ_PIOD AT91SAM9X25_IRQ_PIOCD +#define AT91SAM9X25_IRQ_NAND (-1) + +#define AT91SAM9X25_AIC_BASE 0xffff000 +#define AT91SAM9X25_AIC_SIZE 0x200 + +/* Timer */ + +#define AT91SAM9X25_WDT_BASE 0xffffd40 +#define AT91SAM9X25_WDT_SIZE 0x10 + +#define AT91SAM9X25_PIT_BASE 0xffffd30 +#define AT91SAM9X25_PIT_SIZE 0x10 + +#define AT91SAM9X25_SMC_BASE 0xfffea00 +#define AT91SAM9X25_SMC_SIZE 0x200 + +#define AT91SAM9X25_PMC_BASE 0xffffc00 +#define AT91SAM9X25_PMC_SIZE 0x100 + +#define AT91SAM9X25_UDPHS_BASE 0x803c000 +#define AT91SAM9X25_UDPHS_SIZE 0x4000 + +#define AT91SAM9X25_HSMCI_SIZE 0x4000 +#define AT91SAM9X25_HSMCI0_BASE 0x0008000 +#define AT91SAM9X25_HSMCI0_SIZE AT91SAM9X25_HSMCI_SIZE +#define AT91SAM9X25_HSMCI1_BASE 0x000c000 +#define AT91SAM9X25_HSMCI1_SIZE AT91SAM9X25_HSMCI_SIZE + +#define AT91SAM9X25_TWI_SIZE 0x4000 +#define AT91SAM9X25_TWI0_BASE 0xffaC000 +#define AT91SAM9X25_TWI0_SIZE AT91SAM9X25_TWI_SIZE +#define AT91SAM9X25_TWI1_BASE 0xffaC000 +#define AT91SAM9X25_TWI1_SIZE AT91SAM9X25_TWI_SIZE +#define AT91SAM9X25_TWI2_BASE 0xffaC000 +#define AT91SAM9X25_TWI2_SIZE AT91SAM9X25_TWI_SIZE + +/* XXX Needs to be carfully coordinated with + * other * soc's so phyical and vm address + * mapping are unique. XXX + */ +#define AT91SAM9X25_OHCI_BASE 0xdfc00000 /* SAME as 9c40 */ +#define AT91SAM9X25_OHCI_PA_BASE 0x00600000 +#define AT91SAM9X25_OHCI_SIZE 0x00100000 + +#define AT91SAM9X25_EHCI_BASE 0xdfd00000 +#define AT91SAM9X25_EHCI_PA_BASE 0x00700000 +#define AT91SAM9X25_EHCI_SIZE 0x00100000 + +#define AT91SAM9X25_NAND_BASE 0xe0000000 +#define AT91SAM9X25_NAND_PA_BASE 0x40000000 +#define AT91SAM9X25_NAND_SIZE 0x10000000 + + +/* SDRAMC */ +#define AT91SAM9X25_SDRAMC_BASE 0xfffea00 /* SAME as SMC? */ +#define AT91SAM9X25_SDRAMC_MR 0x00 +#define AT91SAM9X25_SDRAMC_MR_MODE_NORMAL 0 +#define AT91SAM9X25_SDRAMC_MR_MODE_NOP 1 +#define AT91SAM9X25_SDRAMC_MR_MODE_PRECHARGE 2 +#define AT91SAM9X25_SDRAMC_MR_MODE_LOAD_MODE_REGISTER 3 +#define AT91SAM9X25_SDRAMC_MR_MODE_REFRESH 4 +#define AT91SAM9X25_SDRAMC_TR 0x04 +#define AT91SAM9X25_SDRAMC_CR 0x08 +#define AT91SAM9X25_SDRAMC_CR_NC_8 0x0 +#define AT91SAM9X25_SDRAMC_CR_NC_9 0x1 +#define AT91SAM9X25_SDRAMC_CR_NC_10 0x2 +#define AT91SAM9X25_SDRAMC_CR_NC_11 0x3 +#define AT91SAM9X25_SDRAMC_CR_NC_MASK 0x00000003 +#define AT91SAM9X25_SDRAMC_CR_NR_11 0x0 +#define AT91SAM9X25_SDRAMC_CR_NR_12 0x4 +#define AT91SAM9X25_SDRAMC_CR_NR_13 0x8 +#define AT91SAM9X25_SDRAMC_CR_NR_RES 0xc +#define AT91SAM9X25_SDRAMC_CR_NR_MASK 0x0000000c +#define AT91SAM9X25_SDRAMC_CR_NB_2 0x00 +#define AT91SAM9X25_SDRAMC_CR_NB_4 0x10 +#define AT91SAM9X25_SDRAMC_CR_DBW_16 0x80 +#define AT91SAM9X25_SDRAMC_CR_NB_MASK 0x00000010 +#define AT91SAM9X25_SDRAMC_CR_NCAS_MASK 0x00000060 +#define AT91SAM9X25_SDRAMC_CR_TWR_MASK 0x00000780 +#define AT91SAM9X25_SDRAMC_CR_TRC_MASK 0x00007800 +#define AT91SAM9X25_SDRAMC_CR_TRP_MASK 0x00078000 +#define AT91SAM9X25_SDRAMC_CR_TRCD_MASK 0x00780000 +#define AT91SAM9X25_SDRAMC_CR_TRAS_MASK 0x07800000 +#define AT91SAM9X25_SDRAMC_CR_TXSR_MASK 0x78000000 +#define AT91SAM9X25_SDRAMC_HSR 0x0c +#define AT91SAM9X25_SDRAMC_LPR 0x10 +#define AT91SAM9X25_SDRAMC_IER 0x14 +#define AT91SAM9X25_SDRAMC_IDR 0x18 +#define AT91SAM9X25_SDRAMC_IMR 0x1c +#define AT91SAM9X25_SDRAMC_ISR 0x20 +#define AT91SAM9X25_SDRAMC_MDR 0x24 + +#endif /* AT91SAM9X25REG_H_*/ + diff --git a/sys/arm/at91/at91var.h b/sys/arm/at91/at91var.h index 9bd0265fc83..614687c83cd 100644 --- a/sys/arm/at91/at91var.h +++ b/sys/arm/at91/at91var.h @@ -40,7 +40,6 @@ struct at91_softc { bus_space_handle_t sc_aic_sh; struct rman sc_irq_rman; struct rman sc_mem_rman; - uint32_t sc_irq_system; }; struct at91_ivar { @@ -59,7 +58,64 @@ struct cpu_devs const char *parent_clk; }; -extern uint32_t at91_chip_id; +enum at91_soc_type { + AT91_T_NONE = 0, + AT91_T_CAP9, + AT91_T_RM9200, + AT91_T_SAM9260, + AT91_T_SAM9261, + AT91_T_SAM9263, + AT91_T_SAM9G10, + AT91_T_SAM9G20, + AT91_T_SAM9G45, + AT91_T_SAM9N12, + AT91_T_SAM9RL, + AT91_T_SAM9X5, +}; + +enum at91_soc_subtype { + AT91_ST_NONE = 0, + /* AT91RM9200 */ + AT91_ST_RM9200_BGA, + AT91_ST_RM9200_PQFP, + /* AT91SAM9260 */ + AT91_ST_SAM9XE, + /* AT91SAM9G45 */ + AT91_ST_SAM9G45, + AT91_ST_SAM9M10, + AT91_ST_SAM9G46, + AT91_ST_SAM9M11, + /* AT91SAM9X5 */ + AT91_ST_SAM9G15, + AT91_ST_SAM9G25, + AT91_ST_SAM9G35, + AT91_ST_SAM9X25, + AT91_ST_SAM9X35, +}; + +enum at91_soc_family { + AT91_FAMILY_SAM9 = 0x19, + AT91_FAMILY_SAM9XE = 0x29, + AT91_FAMILY_RM92 = 0x92, +}; + +#define AT91_SOC_NAME_MAX 50 + +typedef void (*DELAY_t)(int); +typedef void (*cpu_reset_t)(void); + +struct at91_soc_info { + enum at91_soc_type type; + enum at91_soc_subtype subtype; + enum at91_soc_family family; + uint32_t cidr; + uint32_t exid; + char name[AT91_SOC_NAME_MAX]; + DELAY_t delay; + cpu_reset_t reset; +}; + +extern struct at91_soc_info soc_data; static inline int at91_is_rm92(void); static inline int at91_is_sam9(void); @@ -70,31 +126,35 @@ static inline int at91_is_rm92(void) { - return (AT91_ARCH(at91_chip_id) == AT91_ARCH_RM92); + return (soc_data.type == AT91_T_RM9200); } static inline int at91_is_sam9(void) { - return (AT91_ARCH(at91_chip_id) == AT91_ARCH_SAM9); + return (soc_data.family == AT91_FAMILY_SAM9); } static inline int at91_is_sam9xe(void) { - return (AT91_ARCH(at91_chip_id) == AT91_ARCH_SAM9XE); + return (soc_data.family == AT91_FAMILY_SAM9XE); } static inline int at91_cpu_is(u_int cpu) { - return (AT91_CPU(at91_chip_id) == cpu); + return (soc_data.type == cpu); } +void at91_add_child(device_t dev, int prio, const char *name, int unit, + bus_addr_t addr, bus_size_t size, int irq0, int irq1, int irq2); + extern uint32_t at91_irq_system; extern uint32_t at91_master_clock; +void at91_pmc_init_clock(void); #endif /* _AT91VAR_H_ */ diff --git a/sys/arm/at91/board_bwct.c b/sys/arm/at91/board_bwct.c index d82ffc1c2b5..63f39104ab5 100644 --- a/sys/arm/at91/board_bwct.c +++ b/sys/arm/at91/board_bwct.c @@ -29,12 +29,13 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include #include -long +BOARD_INIT long board_init(void) { /* @@ -64,3 +65,5 @@ board_init(void) return (at91_ramsize()); } + +ARM_BOARD(NONE, "BWCT special"); diff --git a/sys/arm/at91/board_ethernut5.c b/sys/arm/at91/board_ethernut5.c new file mode 100644 index 00000000000..a09c335c12d --- /dev/null +++ b/sys/arm/at91/board_ethernut5.c @@ -0,0 +1,149 @@ +/*- + * Copyright (c) 2012 Marius Strobl + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Ethernut 5 board support + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +BOARD_INIT long +board_init(void) +{ + + /* + * DBGU + */ + /* DRXD */ + at91_pio_use_periph_a(AT91SAM9260_PIOB_BASE, AT91C_PIO_PB14, 0); + /* DTXD */ + at91_pio_use_periph_a(AT91SAM9260_PIOB_BASE, AT91C_PIO_PB15, 1); + + /* + * EMAC + */ + /* ETX0 */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA12, 0); + /* ETX1 */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA13, 0); + /* ERX0 */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA14, 0); + /* ERX1 */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA15, 0); + /* ETXEN */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA16, 0); + /* ERXDV */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA17, 0); + /* ERXER */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA18, 0); + /* ETXCK */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA19, 0); + /* EMDC */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA20, 0); + /* EMDIO */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA21, 0); + + /* + * MMC + */ + /* MCDA0 */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA6, 1); + /* MCCDA */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA7, 1); + /* MCCK */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA8, 1); + /* MCDA1 */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA9, 1); + /* MCDA2 */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA10, 1); + /* MCDA3 */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA11, 1); + + /* + * SPI0 + */ + /* MISO */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA0, 0); + /* MOSI */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA1, 0); + /* SPCK */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA2, 0); + /* NPCS0 */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA3, 0); + + /* + * TWI + */ + /* TWD */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA23, 1); + /* TWCK */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA24, 1); + + /* + * USART0 + */ + /* TXD0 */ + at91_pio_use_periph_a(AT91SAM9260_PIOB_BASE, AT91C_PIO_PB4, 1); + /* RXD0 */ + at91_pio_use_periph_a(AT91SAM9260_PIOB_BASE, AT91C_PIO_PB5, 0); + /* DSR0 */ + at91_pio_use_periph_a(AT91SAM9260_PIOB_BASE, AT91C_PIO_PB22, 0); + /* DCD0 */ + at91_pio_use_periph_a(AT91SAM9260_PIOB_BASE, AT91C_PIO_PB23, 0); + /* DTR0 */ + at91_pio_use_periph_a(AT91SAM9260_PIOB_BASE, AT91C_PIO_PB24, 1); + /* RI0 */ + at91_pio_use_periph_a(AT91SAM9260_PIOB_BASE, AT91C_PIO_PB25, 0); + /* RTS0 */ + at91_pio_use_periph_a(AT91SAM9260_PIOB_BASE, AT91C_PIO_PB26, 1); + /* CTS0 */ + at91_pio_use_periph_a(AT91SAM9260_PIOB_BASE, AT91C_PIO_PB27, 0); + + /* + * USART2 + */ + /* RTS2 */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA4, 1); + /* CTS2 */ + at91_pio_use_periph_a(AT91SAM9260_PIOA_BASE, AT91C_PIO_PA5, 0); + /* TXD2 */ + at91_pio_use_periph_a(AT91SAM9260_PIOB_BASE, AT91C_PIO_PB8, 1); + /* RXD2 */ + at91_pio_use_periph_a(AT91SAM9260_PIOB_BASE, AT91C_PIO_PB9, 0); + + return (at91_ramsize()); +} + +ARM_BOARD(NONE, "Ethernut 5") diff --git a/sys/arm/at91/board_hl200.c b/sys/arm/at91/board_hl200.c index f1a24394f54..07db749ec61 100644 --- a/sys/arm/at91/board_hl200.c +++ b/sys/arm/at91/board_hl200.c @@ -29,12 +29,13 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include #include -long +BOARD_INIT long board_init(void) { /* @@ -61,3 +62,5 @@ board_init(void) return (at91_ramsize()); } + +ARM_BOARD(NONE, "HOTe 200"); diff --git a/sys/arm/at91/board_hl201.c b/sys/arm/at91/board_hl201.c index f4497ec4b2b..8ba69804456 100644 --- a/sys/arm/at91/board_hl201.c +++ b/sys/arm/at91/board_hl201.c @@ -29,12 +29,13 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include #include -long +BOARD_INIT long board_init(void) { /* Setup Ethernet Pins */ @@ -65,3 +66,5 @@ board_init(void) return (at91_ramsize()); } + +ARM_BOARD(NONE, "HOTe 201"); diff --git a/sys/arm/at91/board_kb920x.c b/sys/arm/at91/board_kb920x.c index e79879d6d66..a577f87efa6 100644 --- a/sys/arm/at91/board_kb920x.c +++ b/sys/arm/at91/board_kb920x.c @@ -29,13 +29,14 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include #include #include -long +BOARD_INIT long board_init(void) { /* @@ -70,3 +71,5 @@ board_init(void) return (at91_ramsize()); } + +ARM_BOARD(KB9200, "Kwikbyte KB920x") diff --git a/sys/arm/at91/board_qila9g20.c b/sys/arm/at91/board_qila9g20.c index eee7d89dc27..4c94b2ba51b 100644 --- a/sys/arm/at91/board_qila9g20.c +++ b/sys/arm/at91/board_qila9g20.c @@ -24,7 +24,7 @@ */ /* Calao Systems QIL-9G20-Cxx - * http://www.calao-systems.com + * http://www.calao-systems.com */ #include @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -44,7 +45,7 @@ __FBSDID("$FreeBSD$"); #define AT91SAM9G20_LED_SIZE AT91SAM9G20_PIO_SIZE #define AT91SAM9G20_IRQ_LED AT91SAM9G20_IRQ_PIOA -long +BOARD_INIT long board_init(void) { @@ -103,3 +104,5 @@ board_init(void) return (at91_ramsize()); } + +ARM_BOARD(QIL_A9G20, "Calico System QIL-9G20-Cxx"); diff --git a/sys/arm/at91/board_sam9g20ek.c b/sys/arm/at91/board_sam9g20ek.c index a79a509e845..918aea047a0 100644 --- a/sys/arm/at91/board_sam9g20ek.c +++ b/sys/arm/at91/board_sam9g20ek.c @@ -23,13 +23,9 @@ * SUCH DAMAGE. */ -/* +/* * This board file can be used for both: - * Atmel AT91SAM9260-B Development Card and - * Atmel AT91SAM9G20-EK Rev. B Development Card - * - * Since the AT91SAM9260 and AT91SAM9G20 have identical memory maps and - * pin configurations we can use the same file for both. + * Atmel SAM9G20-EK Development Card */ #include @@ -37,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -45,7 +42,7 @@ __FBSDID("$FreeBSD$"); #include //#include -long +BOARD_INIT long board_init(void) { /* PIOB's A periph: Turn USART 0's TX/RX pins */ @@ -73,7 +70,7 @@ board_init(void) at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA24_TWCK, 1); #if 1 - /* + /* * Turn off Clock to DataFlash, conflicts with MCI clock. */ at91_pio_use_gpio(AT91SAM9G20_PIOA_BASE,AT91C_PIO_PA2); @@ -126,3 +123,5 @@ board_init(void) return (at91_ramsize()); } + +ARM_BOARD(AT91SAM9G20, "Atmel SAM9G20-EK Development Card"); diff --git a/sys/arm/at91/board_sam9x25ek.c b/sys/arm/at91/board_sam9x25ek.c new file mode 100644 index 00000000000..a9874ff9ce9 --- /dev/null +++ b/sys/arm/at91/board_sam9x25ek.c @@ -0,0 +1,128 @@ +/*- + * Copyright (c) 2009 Greg Ansley. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * This board file can be used for both: + * SAM9X26EK board + */ + +#include +__FBSDID("$FreeBSD$"); +#include +#include + +#include +#include +#include +#include +#include +#include +#include +//#include + +BOARD_INIT long +board_init(void) +{ +#if 0 + /* PIOB's A periph: Turn USART 0's TX/RX pins */ + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB14_DRXD, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB15_DTXD, 1); + + /* PIOB's A periph: Turn USART 0's TX/RX pins */ + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB4_TXD0, 1); + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB5_RXD0, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB22_DSR0, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB23_DCD0, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB24_DTR0, 1); + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB25_RI0, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB26_RTS0, 1); + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB27_CTS0, 0); + + /* PIOB's A periph: Turn USART 1's TX/RX pins */ + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB6_TXD1, 1); + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB7_RXD1, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB28_RTS1, 1); + at91_pio_use_periph_a(AT91SAM9G20_PIOB_BASE, AT91C_PB29_CTS1, 0); + + /* TWI Two-wire Serial Data */ + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA23_TWD, 1); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA24_TWCK, 1); + +#if 1 + /* + * Turn off Clock to DataFlash, conflicts with MCI clock. + */ + at91_pio_use_gpio(AT91SAM9G20_PIOA_BASE,AT91C_PIO_PA2); + at91_pio_gpio_input(AT91SAM9G20_PIOA_BASE,AT91C_PIO_PA2); + + /* Turn off chip select to DataFlash */ + at91_pio_gpio_output(AT91SAM9G20_PIOC_BASE,AT91C_PIO_PC11, 0); + at91_pio_gpio_set(AT91SAM9G20_PIOC_BASE,AT91C_PIO_PC11); + at91_pio_use_gpio(AT91SAM9G20_PIOC_BASE,AT91C_PIO_PC11); + + /* Multimedia Card */ + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA0_MCDB0, 1); + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA1_MCCDB, 1); + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA3_MCDB3, 1); + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA4_MCDB2, 1); + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA5_MCDB1, 1); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA8_MCCK, 1); + at91_pio_use_gpio(AT91SAM9G20_PIOC_BASE, AT91C_PIO_PC9); +#else + /* SPI0 to DataFlash */ + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE, AT91C_PIO_PA0, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE, AT91C_PIO_PA1, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE, AT91C_PIO_PA2, 0); + at91_pio_use_periph_b(AT91SAM9G20_PIOC_BASE, AT91C_PIO_PC11,0); + + at91_pio_gpio_input(AT91SAM9G20_PIOA_BASE,AT91C_PIO_PA8); + at91_pio_use_gpio(AT91SAM9G20_PIOA_BASE,AT91C_PIO_PA8); +#endif + + /* EMAC */ + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA12_ETX0 , 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA13_ETX1, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA14_ERX0, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA15_ERX1, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA16_ETXEN, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA17_ERXDV, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA18_ERXER, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA19_ETXCK, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA20_EMDC, 0); + at91_pio_use_periph_a(AT91SAM9G20_PIOA_BASE,AT91C_PA21_EMDIO, 0); + + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA10_ETX2_0, 0); + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA11_ETX3_0, 0); + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA22_ETXER, 0); + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA25_ERX2, 0); + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA26_ERX3, 0); + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA27_ERXCK, 0); + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA28_ECRS, 0); + at91_pio_use_periph_b(AT91SAM9G20_PIOA_BASE,AT91C_PA29_ECOL, 0); +#endif + return (at91_ramsize()); +} + +ARM_BOARD(AT91SAM9X5EK, "Atmel AT91SAM9x-EK Evaluation Board"); diff --git a/sys/arm/at91/board_tsc4370.c b/sys/arm/at91/board_tsc4370.c index 6529eb8b7da..8139a4a9a58 100644 --- a/sys/arm/at91/board_tsc4370.c +++ b/sys/arm/at91/board_tsc4370.c @@ -29,12 +29,13 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include #include -long +BOARD_INIT long board_init(void) { /* @@ -73,3 +74,5 @@ board_init(void) return (at91_ramsize()); } + +ARM_BOARD(NONE, "TSC4370 Controller Board"); diff --git a/sys/arm/at91/files.at91 b/sys/arm/at91/files.at91 index 4aa0b0ce412..081690102e7 100644 --- a/sys/arm/at91/files.at91 +++ b/sys/arm/at91/files.at91 @@ -8,25 +8,38 @@ arm/at91/at91_mci.c optional at91_mci arm/at91/at91_nand.c optional nand arm/at91/at91_pio.c standard arm/at91/at91_pmc.c standard +arm/at91/at91_pit.c optional at91sam9 +arm/at91/at91_reset.S optional at91sam9 +arm/at91/at91_rst.c optional at91sam9 arm/at91/at91_rtc.c optional at91_rtc arm/at91/at91_spi.c optional at91_spi \ dependency "spibus_if.h" arm/at91/at91_ssc.c optional at91_ssc -arm/at91/at91_st.c standard +arm/at91/at91_st.c optional at91rm9200 arm/at91/at91_tc.c optional at91_tc arm/at91/at91_twi.c optional at91_twi +arm/at91/at91_wdt.c optional at91_wdt arm/at91/if_ate.c optional ate +arm/at91/if_macb.c optional macb arm/at91/uart_bus_at91usart.c optional uart arm/at91/uart_cpu_at91rm9200usart.c optional uart arm/at91/uart_dev_at91usart.c optional uart # # All the "systems on a chip" we support # -arm/at91/at91rm9200.c standard +arm/at91/at91rm9200.c optional at91rm9200 +arm/at91/at91sam9260.c optional at91sam9260 +arm/at91/at91sam9g20.c optional at91sam9g20 +arm/at91/at91sam9x25.c optional at91sam9x25 # # All the boards we support # arm/at91/board_bwct.c optional at91_board_bwct +arm/at91/board_ethernut5.c optional at91_board_ethernut5 arm/at91/board_hl200.c optional at91_board_hl200 +arm/at91/board_hl201.c optional at91_board_hl201 arm/at91/board_kb920x.c optional at91_board_kb920x +arm/at91/board_qila9g20.c optional at91_board_qila9g20 +arm/at91/board_sam9g20ek.c optional at91_board_sam9g20ek +arm/at91/board_sam9x25ek.c optional at91_board_sam9x25ek arm/at91/board_tsc4370.c optional at91_board_tsc4370 diff --git a/sys/arm/at91/files.at91sam9 b/sys/arm/at91/files.at91sam9 deleted file mode 100644 index 21fae6bf171..00000000000 --- a/sys/arm/at91/files.at91sam9 +++ /dev/null @@ -1,36 +0,0 @@ -# $FreeBSD$ -arm/arm/cpufunc_asm_arm9.S standard -arm/arm/irq_dispatch.S standard -arm/at91/at91_machdep.c standard -arm/at91/at91.c standard -arm/at91/at91_mci.c optional at91_mci -arm/at91/at91_nand.c optional nand -arm/at91/at91_pio.c standard -arm/at91/at91_pmc.c standard -arm/at91/at91_pit.c standard -arm/at91/at91_reset.S standard -arm/at91/at91_rst.c standard -arm/at91/at91_spi.c optional at91_spi \ - dependency "spibus_if.h" -arm/at91/at91_ssc.c optional at91_ssc -arm/at91/at91_tc.c optional at91_tc -arm/at91/at91_twi.c optional at91_twi -arm/at91/at91_wdt.c optional at91_wdt -arm/at91/if_ate.c optional ate -arm/at91/if_macb.c optional macb -arm/at91/uart_bus_at91usart.c optional uart -arm/at91/uart_cpu_at91rm9200usart.c optional uart -arm/at91/uart_dev_at91usart.c optional uart -dev/usb/controller/ohci_atmelarm.c optional ohci -# -# All the "systems on a chip" we support -# -arm/at91/at91sam9g20.c optional at91sam9g20 -arm/at91/at91sam9260.c optional at91sam9260 -# -# -# All the boards we support -# -arm/at91/board_hl201.c optional at91_board_hl201 -arm/at91/board_sam9g20ek.c optional at91_board_sam9g20ek -arm/at91/board_qila9g20.c optional at91_board_qila9g20 diff --git a/sys/arm/at91/if_macb.c b/sys/arm/at91/if_macb.c index b985f26327d..ac280a1918e 100644 --- a/sys/arm/at91/if_macb.c +++ b/sys/arm/at91/if_macb.c @@ -730,7 +730,7 @@ macb_rx(struct macb_softc *sc) m = sc->rx_desc[sc->rx_cons].buff; - bus_dmamap_sync(sc->dmatag_ring_rx, + bus_dmamap_sync(sc->dmatag_ring_rx, sc->rx_desc[sc->rx_cons].dmamap, BUS_DMASYNC_POSTREAD); if (macb_new_rxbuf(sc, sc->rx_cons) != 0) { ifp->if_iqdrops++; @@ -739,7 +739,7 @@ macb_rx(struct macb_softc *sc) do { rxdesc->flags = DATA_SIZE; MACB_DESC_INC(sc->rx_cons, MACB_MAX_RX_BUFFERS); - if ((rxdesc->flags & RD_EOF) != 0) + if ((rxdesc->flags & RD_EOF) != 0) break; rxdesc = &(sc->desc_rx[sc->rx_cons]); } while (sc->rx_cons != first); @@ -776,7 +776,7 @@ macb_rx(struct macb_softc *sc) if (nsegs > 1) { sc->macb_cdata.rxtail->m_len = (rxbytes - ((nsegs - 1) * DATA_SIZE)) + 2; - } + } m = sc->macb_cdata.rxhead; m->m_flags |= M_PKTHDR; @@ -1102,7 +1102,7 @@ set_filter(struct macb_softc *sc) int count; uint32_t multicast_filter[2]; - ifp = sc->ifp; + ifp = sc->ifp; config = read_4(sc, EMAC_NCFGR); @@ -1132,7 +1132,7 @@ set_filter(struct macb_softc *sc) if (ifma->ifma_addr->sa_family != AF_LINK) continue; count++; - set_mac_filter(multicast_filter, + set_mac_filter(multicast_filter, LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); } if (count) { @@ -1501,7 +1501,7 @@ macb_miibus_statchg(device_t dev) mii = device_get_softc(sc->miibus); - sc->flags &= ~MACB_FLAG_LINK; + sc->flags &= ~MACB_FLAG_LINK; config = read_4(sc, EMAC_NCFGR); diff --git a/sys/arm/at91/std.at91 b/sys/arm/at91/std.at91 index b2b9dd6ec1e..0c950b05475 100644 --- a/sys/arm/at91/std.at91 +++ b/sys/arm/at91/std.at91 @@ -1,6 +1,9 @@ # $FreeBSD$ -files "../at91/files.at91" +files "../at91/files.at91" cpu CPU_ARM9 makeoptions CONF_CFLAGS=-mcpu=arm9 options PHYSADDR=0x20000000 + +# For now, just do the AT91RM9200 +device at91rm9200 diff --git a/sys/arm/at91/std.at91sam9 b/sys/arm/at91/std.at91sam9 index ab1fa9547a9..75c3276fb38 100644 --- a/sys/arm/at91/std.at91sam9 +++ b/sys/arm/at91/std.at91sam9 @@ -1,9 +1,9 @@ # $FreeBSD$ -files "../at91/files.at91sam9" +files "../at91/files.at91" cpu CPU_ARM9 -makeoptions CONF_CFLAGS="-mcpu=arm9" +makeoptions CONF_CFLAGS=-mcpu=arm9 options PHYSADDR=0x20000000 -device at91sam9g20 -device at91sam9260 +# bring in the sam specific timers and such +device at91sam9 diff --git a/sys/arm/at91/std.atmel b/sys/arm/at91/std.atmel new file mode 100644 index 00000000000..c278cf0ca1a --- /dev/null +++ b/sys/arm/at91/std.atmel @@ -0,0 +1,15 @@ +# $FreeBSD$ + +files "../at91/files.at91" +cpu CPU_ARM9 +makeoptions CONF_CFLAGS=-mcpu=arm9 +options PHYSADDR=0x20000000 + +# Supported SoCs for the at91 platform +device at91rm9200 +device at91sam9260 +device at91sam9g20 +device at91sam9x25 + +# bring in the sam specific timers and such +device at91sam9 diff --git a/sys/arm/at91/std.ethernut5 b/sys/arm/at91/std.ethernut5 new file mode 100644 index 00000000000..876b59a90ca --- /dev/null +++ b/sys/arm/at91/std.ethernut5 @@ -0,0 +1,11 @@ +# $FreeBSD$ +include "../at91/std.at91sam9" + +options STARTUP_PAGETABLE_ADDR=0x20800000 +makeoptions KERNPHYSADDR=0x20000000 +makeoptions KERNVIRTADDR=0xc0000000 +options KERNPHYSADDR=0x20000000 +options KERNVIRTADDR=0xc0000000 + +device at91_board_ethernut5 +device at91sam9260 diff --git a/sys/arm/at91/std.hl200 b/sys/arm/at91/std.hl200 index 3f99b49be88..f48f7236716 100644 --- a/sys/arm/at91/std.hl200 +++ b/sys/arm/at91/std.hl200 @@ -6,6 +6,5 @@ makeoptions KERNPHYSADDR=0x20100000 options KERNPHYSADDR=0x20100000 makeoptions KERNVIRTADDR=0xc0100000 options KERNVIRTADDR=0xc0100000 -options AT91C_MASTER_CLOCK=45000000 device at91_board_hl200 diff --git a/sys/arm/at91/std.hl201 b/sys/arm/at91/std.hl201 index 2d7d9260506..ff27308e85a 100644 --- a/sys/arm/at91/std.hl201 +++ b/sys/arm/at91/std.hl201 @@ -6,6 +6,6 @@ makeoptions KERNPHYSADDR=0x20000000 makeoptions KERNVIRTADDR=0xc0000000 options KERNPHYSADDR=0x20000000 options KERNVIRTADDR=0xc0000000 -options AT91C_MASTER_CLOCK=132000000 device at91_board_hl201 +device at91sam9g20 diff --git a/sys/arm/at91/std.kb920x b/sys/arm/at91/std.kb920x index 26d0443f28f..85c8d038bf7 100644 --- a/sys/arm/at91/std.kb920x +++ b/sys/arm/at91/std.kb920x @@ -6,6 +6,5 @@ makeoptions KERNPHYSADDR=0x20000000 options KERNPHYSADDR=0x20000000 makeoptions KERNVIRTADDR=0xc0000000 options KERNVIRTADDR=0xc0000000 -options AT91C_MASTER_CLOCK=60000000 device at91_board_kb920x diff --git a/sys/arm/at91/std.qila9g20 b/sys/arm/at91/std.qila9g20 index 007cdf5f8ba..e2043b66aa7 100644 --- a/sys/arm/at91/std.qila9g20 +++ b/sys/arm/at91/std.qila9g20 @@ -6,6 +6,6 @@ makeoptions KERNPHYSADDR=0x20000000 makeoptions KERNVIRTADDR=0xc0000000 options KERNPHYSADDR=0x20000000 options KERNVIRTADDR=0xc0000000 -options AT91C_MASTER_CLOCK=((12000000*133)/12) device at91_board_qila9g20 +device at91sam9g20 diff --git a/sys/arm/at91/std.sam9g20ek b/sys/arm/at91/std.sam9g20ek index c5509c5ced6..cdbecdada0c 100644 --- a/sys/arm/at91/std.sam9g20ek +++ b/sys/arm/at91/std.sam9g20ek @@ -7,9 +7,5 @@ makeoptions KERNVIRTADDR=0xc0000000 options KERNPHYSADDR=0x20000000 options KERNVIRTADDR=0xc0000000 -#SAM9G20 w/ 18.432 Mhz Clock -#options AT91C_MASTER_CLOCK=((18432000*43)/6) -#SAM9260 w/ 18.432 Mhz Clock -#options AT91C_MASTER_CLOCK=((18432000*97)/18) - device at91_board_sam9g20ek +device at91sam9g20 diff --git a/sys/arm/at91/std.sam9x25ek b/sys/arm/at91/std.sam9x25ek new file mode 100644 index 00000000000..32b1f3bf217 --- /dev/null +++ b/sys/arm/at91/std.sam9x25ek @@ -0,0 +1,11 @@ +#$FreeBSD$ +include "../at91/std.at91sam9" + +options STARTUP_PAGETABLE_ADDR=0x20800000 +makeoptions KERNPHYSADDR=0x20000000 +makeoptions KERNVIRTADDR=0xc0000000 +options KERNPHYSADDR=0x20000000 +options KERNVIRTADDR=0xc0000000 + +device at91_board_sam9x25ek +device at91sam9x25 diff --git a/sys/arm/at91/uart_bus_at91usart.c b/sys/arm/at91/uart_bus_at91usart.c index c5e3f829ba4..b042537fd7f 100644 --- a/sys/arm/at91/uart_bus_at91usart.c +++ b/sys/arm/at91/uart_bus_at91usart.c @@ -42,33 +42,32 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include "uart_if.h" -static int usart_at91rm92_probe(device_t dev); +static int usart_at91_probe(device_t dev); extern struct uart_class at91_usart_class; -static device_method_t usart_at91rm92_methods[] = { +static device_method_t usart_at91_methods[] = { /* Device interface */ - DEVMETHOD(device_probe, usart_at91rm92_probe), + DEVMETHOD(device_probe, usart_at91_probe), DEVMETHOD(device_attach, uart_bus_attach), DEVMETHOD(device_detach, uart_bus_detach), { 0, 0 } }; -static driver_t usart_at91rm92_driver = { +static driver_t usart_at91_driver = { uart_driver_name, - usart_at91rm92_methods, + usart_at91_methods, sizeof(struct uart_softc), }; extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs; static int -usart_at91rm92_probe(device_t dev) +usart_at91_probe(device_t dev) { struct uart_softc *sc; @@ -104,4 +103,4 @@ usart_at91rm92_probe(device_t dev) } -DRIVER_MODULE(uart, atmelarm, usart_at91rm92_driver, uart_devclass, 0, 0); +DRIVER_MODULE(uart, atmelarm, usart_at91_driver, uart_devclass, 0, 0); diff --git a/sys/arm/at91/uart_cpu_at91rm9200usart.c b/sys/arm/at91/uart_cpu_at91rm9200usart.c index 79889939fa4..cb39bf9560a 100644 --- a/sys/arm/at91/uart_cpu_at91rm9200usart.c +++ b/sys/arm/at91/uart_cpu_at91rm9200usart.c @@ -69,11 +69,11 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) di->ops = uart_getops(class); di->bas.chan = 0; di->bas.bst = &at91_bs_tag; - /* + /* * XXX: Not pretty, but will work because we map the needed addresses * early. */ - di->bas.bsh = AT91RM92_BASE + AT91RM92_DBGU_BASE; + di->bas.bsh = AT91_BASE + AT91RM92_DBGU_BASE; di->baudrate = 115200; di->bas.regshft = 0; di->bas.rclk = 0; diff --git a/sys/arm/at91/uart_dev_at91usart.c b/sys/arm/at91/uart_dev_at91usart.c index d1a52bac40a..80f28e99db3 100644 --- a/sys/arm/at91/uart_dev_at91usart.c +++ b/sys/arm/at91/uart_dev_at91usart.c @@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include @@ -55,16 +54,17 @@ __FBSDID("$FreeBSD$"); */ struct at91_usart_rx { bus_addr_t pa; - uint8_t buffer[USART_BUFFER_SIZE]; + uint8_t *buffer; bus_dmamap_t map; }; struct at91_usart_softc { struct uart_softc base; - bus_dma_tag_t dmatag; /* bus dma tag for mbufs */ + bus_dma_tag_t tx_tag; bus_dmamap_t tx_map; uint32_t flags; -#define HAS_TIMEOUT 1 +#define HAS_TIMEOUT 1 + bus_dma_tag_t rx_tag; struct at91_usart_rx ping_pong[2]; struct at91_usart_rx *ping; struct at91_usart_rx *pong; @@ -95,7 +95,7 @@ static void at91_usart_init(struct uart_bas *bas, int, int, int, int); static void at91_usart_term(struct uart_bas *bas); static void at91_usart_putc(struct uart_bas *bas, int); static int at91_usart_rxready(struct uart_bas *bas); -static int at91_usart_getc(struct uart_bas *bas, struct mtx *mtx); +static int at91_usart_getc(struct uart_bas *bas, struct mtx *hwmtx); extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs; @@ -106,7 +106,7 @@ at91_usart_param(struct uart_bas *bas, int baudrate, int databits, uint32_t mr; /* - * Assume 3-write RS-232 configuration. + * Assume 3-wire RS-232 configuration. * XXX Not sure how uart will present the other modes to us, so * XXX they are unimplemented. maybe ioctl? */ @@ -209,6 +209,7 @@ static struct uart_ops at91_usart_ops = { static int at91_usart_probe(struct uart_bas *bas) { + /* We know that this is always here */ return (0); } @@ -236,6 +237,7 @@ at91_usart_init(struct uart_bas *bas, int baudrate, int databits, int stopbits, static void at91_usart_term(struct uart_bas *bas) { + /* XXX */ } @@ -247,7 +249,7 @@ static void at91_usart_putc(struct uart_bas *bas, int c) { - while (!(RD4(bas, USART_CSR) & USART_CSR_TXRDY)) + while (!(RD4(bas, USART_CSR) & USART_CSR_TXRDY)) continue; WR4(bas, USART_THR, c); } @@ -266,14 +268,18 @@ at91_usart_rxready(struct uart_bas *bas) * Block waiting for a character. */ static int -at91_usart_getc(struct uart_bas *bas, struct mtx *mtx) +at91_usart_getc(struct uart_bas *bas, struct mtx *hwmtx) { int c; - while (!(RD4(bas, USART_CSR) & USART_CSR_RXRDY)) - continue; - c = RD4(bas, USART_RHR); - c &= 0xff; + uart_lock(hwmtx); + while (!(RD4(bas, USART_CSR) & USART_CSR_RXRDY)) { + uart_unlock(hwmtx); + DELAY(4); + uart_lock(hwmtx); + } + c = RD4(bas, USART_RHR) & 0xff; + uart_unlock(hwmtx); return (c); } @@ -290,7 +296,7 @@ static int at91_usart_bus_transmit(struct uart_softc *); static kobj_method_t at91_usart_methods[] = { KOBJMETHOD(uart_probe, at91_usart_bus_probe), - KOBJMETHOD(uart_attach, at91_usart_bus_attach), + KOBJMETHOD(uart_attach, at91_usart_bus_attach), KOBJMETHOD(uart_flush, at91_usart_bus_flush), KOBJMETHOD(uart_getsig, at91_usart_bus_getsig), KOBJMETHOD(uart_ioctl, at91_usart_bus_ioctl), @@ -299,8 +305,8 @@ static kobj_method_t at91_usart_methods[] = { KOBJMETHOD(uart_receive, at91_usart_bus_receive), KOBJMETHOD(uart_setsig, at91_usart_bus_setsig), KOBJMETHOD(uart_transmit, at91_usart_bus_transmit), - - { 0, 0 } + + KOBJMETHOD_END }; int @@ -316,6 +322,7 @@ at91_usart_bus_probe(struct uart_softc *sc) static void at91_getaddr(void *arg, bus_dma_segment_t *segs, int nsegs, int error) { + if (error != 0) return; *(bus_addr_t *)arg = segs[0].ds_addr; @@ -344,41 +351,53 @@ at91_usart_bus_attach(struct uart_softc *sc) WR4(&sc->sc_bas, USART_IDR, 0xffffffff); /* - * Allocate DMA tags and maps + * Allocate transmit DMA tag and map. We allow a transmit buffer + * to be any size, but it must map to a single contiguous physical + * extent. */ err = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, - USART_BUFFER_SIZE, 1, USART_BUFFER_SIZE, BUS_DMA_ALLOCNOW, NULL, - NULL, &atsc->dmatag); + BUS_SPACE_MAXSIZE_32BIT, 1, BUS_SPACE_MAXSIZE_32BIT, 0, NULL, + NULL, &atsc->tx_tag); if (err != 0) goto errout; - err = bus_dmamap_create(atsc->dmatag, 0, &atsc->tx_map); + err = bus_dmamap_create(atsc->tx_tag, 0, &atsc->tx_map); if (err != 0) goto errout; + if (atsc->flags & HAS_TIMEOUT) { + /* + * Allocate receive DMA tags, maps, and buffers. + * The receive buffers should be aligned to arm_dcache_align, + * otherwise partial cache line flushes on every receive + * interrupt are pretty much guaranteed. + */ + err = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), + arm_dcache_align, 0, BUS_SPACE_MAXADDR_32BIT, + BUS_SPACE_MAXADDR, NULL, NULL, sc->sc_rxfifosz, 1, + sc->sc_rxfifosz, BUS_DMA_ALLOCNOW, NULL, NULL, + &atsc->rx_tag); + if (err != 0) + goto errout; for (i = 0; i < 2; i++) { - err = bus_dmamap_create(atsc->dmatag, 0, - &atsc->ping_pong[i].map); + err = bus_dmamem_alloc(atsc->rx_tag, + (void **)&atsc->ping_pong[i].buffer, + BUS_DMA_NOWAIT, &atsc->ping_pong[i].map); if (err != 0) goto errout; - err = bus_dmamap_load(atsc->dmatag, + err = bus_dmamap_load(atsc->rx_tag, atsc->ping_pong[i].map, atsc->ping_pong[i].buffer, sc->sc_rxfifosz, at91_getaddr, &atsc->ping_pong[i].pa, 0); if (err != 0) goto errout; - bus_dmamap_sync(atsc->dmatag, atsc->ping_pong[i].map, + bus_dmamap_sync(atsc->rx_tag, atsc->ping_pong[i].map, BUS_DMASYNC_PREREAD); } atsc->ping = &atsc->ping_pong[0]; atsc->pong = &atsc->ping_pong[1]; } - /* - * Prime the pump with the RX buffer. We use two 64 byte bounce - * buffers here to avoid data overflow. - */ - /* Turn on rx and tx */ cr = USART_CR_RSTSTA | USART_CR_RSTRX | USART_CR_RSTTX; WR4(&sc->sc_bas, USART_CR, cr); @@ -397,8 +416,11 @@ at91_usart_bus_attach(struct uart_softc *sc) WR4(&sc->sc_bas, PDC_RNCR, sc->sc_rxfifosz); WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_RXTEN); - /* Set the receive timeout to be 1.5 character times. */ - WR4(&sc->sc_bas, USART_RTOR, 12); + /* + * Set the receive timeout to be 1.5 character times + * assuming 8N1. + */ + WR4(&sc->sc_bas, USART_RTOR, 15); WR4(&sc->sc_bas, USART_CR, USART_CR_STTTO); WR4(&sc->sc_bas, USART_IER, USART_CSR_TIMEOUT | USART_CSR_RXBUFF | USART_CSR_ENDRX); @@ -407,7 +429,6 @@ at91_usart_bus_attach(struct uart_softc *sc) } WR4(&sc->sc_bas, USART_IER, USART_CSR_RXBRK); errout: - // XXX bad return (err); } @@ -416,14 +437,17 @@ at91_usart_bus_transmit(struct uart_softc *sc) { bus_addr_t addr; struct at91_usart_softc *atsc; + int err; + err = 0; atsc = (struct at91_usart_softc *)sc; - if (bus_dmamap_load(atsc->dmatag, atsc->tx_map, sc->sc_txbuf, - sc->sc_txdatasz, at91_getaddr, &addr, 0) != 0) - return (EAGAIN); - bus_dmamap_sync(atsc->dmatag, atsc->tx_map, BUS_DMASYNC_PREWRITE); - uart_lock(sc->sc_hwmtx); + if (bus_dmamap_load(atsc->tx_tag, atsc->tx_map, sc->sc_txbuf, + sc->sc_txdatasz, at91_getaddr, &addr, 0) != 0) { + err = EAGAIN; + goto errout; + } + bus_dmamap_sync(atsc->tx_tag, atsc->tx_map, BUS_DMASYNC_PREWRITE); sc->sc_txbusy = 1; /* * Setup the PDC to transfer the data and interrupt us when it @@ -433,9 +457,11 @@ at91_usart_bus_transmit(struct uart_softc *sc) WR4(&sc->sc_bas, PDC_TCR, sc->sc_txdatasz); WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_TXTEN); WR4(&sc->sc_bas, USART_IER, USART_CSR_ENDTX); +errout: uart_unlock(sc->sc_hwmtx); - return (0); + return (err); } + static int at91_usart_bus_setsig(struct uart_softc *sc, int sig) { @@ -465,12 +491,14 @@ at91_usart_bus_setsig(struct uart_softc *sc, int sig) uart_unlock(sc->sc_hwmtx); return (0); } + static int at91_usart_bus_receive(struct uart_softc *sc) { return (0); } + static int at91_usart_bus_param(struct uart_softc *sc, int baudrate, int databits, int stopbits, int parity) @@ -488,33 +516,31 @@ at91_rx_put(struct uart_softc *sc, int key) if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) kdb_alt_break(key, &sc->sc_altbrk); #endif - uart_rx_put(sc, key); + uart_rx_put(sc, key); } static int at91_usart_bus_ipend(struct uart_softc *sc) { - int csr = RD4(&sc->sc_bas, USART_CSR); - int ipend = 0, i, len; struct at91_usart_softc *atsc; struct at91_usart_rx *p; + int i, ipend, len; + uint32_t csr; - atsc = (struct at91_usart_softc *)sc; - if (csr & USART_CSR_ENDTX) { - bus_dmamap_sync(atsc->dmatag, atsc->tx_map, - BUS_DMASYNC_POSTWRITE); - bus_dmamap_unload(atsc->dmatag, atsc->tx_map); - } + ipend = 0; + atsc = (struct at91_usart_softc *)sc; uart_lock(sc->sc_hwmtx); - if (csr & USART_CSR_TXRDY) { - if (sc->sc_txbusy) - ipend |= SER_INT_TXIDLE; - WR4(&sc->sc_bas, USART_IDR, USART_CSR_TXRDY); - } + csr = RD4(&sc->sc_bas, USART_CSR); if (csr & USART_CSR_ENDTX) { + bus_dmamap_sync(atsc->tx_tag, atsc->tx_map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(atsc->tx_tag, atsc->tx_map); + } + if (csr & (USART_CSR_TXRDY | USART_CSR_ENDTX)) { if (sc->sc_txbusy) ipend |= SER_INT_TXIDLE; - WR4(&sc->sc_bas, USART_IDR, USART_CSR_ENDTX); + WR4(&sc->sc_bas, USART_IDR, csr & (USART_CSR_TXRDY | + USART_CSR_ENDTX)); } /* @@ -523,90 +549,103 @@ at91_usart_bus_ipend(struct uart_softc *sc) * and do all the work elsewhere. I need to look at the CSR * bits right now and do things based on them to avoid races. */ - if ((atsc->flags & HAS_TIMEOUT) && (csr & USART_CSR_RXBUFF)) { - // Have a buffer overflow. Copy all data from both - // ping and pong. Insert overflow character. Reset - // ping and pong and re-enable the PDC to receive - // characters again. - bus_dmamap_sync(atsc->dmatag, atsc->ping->map, - BUS_DMASYNC_POSTREAD); - bus_dmamap_sync(atsc->dmatag, atsc->pong->map, - BUS_DMASYNC_POSTREAD); - for (i = 0; i < sc->sc_rxfifosz; i++) - at91_rx_put(sc, atsc->ping->buffer[i]); - for (i = 0; i < sc->sc_rxfifosz; i++) - at91_rx_put(sc, atsc->pong->buffer[i]); - uart_rx_put(sc, UART_STAT_OVERRUN); - csr &= ~(USART_CSR_ENDRX | USART_CSR_TIMEOUT); - WR4(&sc->sc_bas, PDC_RPR, atsc->ping->pa); - WR4(&sc->sc_bas, PDC_RCR, sc->sc_rxfifosz); - WR4(&sc->sc_bas, PDC_RNPR, atsc->pong->pa); - WR4(&sc->sc_bas, PDC_RNCR, sc->sc_rxfifosz); - WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_RXTEN); - ipend |= SER_INT_RXREADY; - } - if ((atsc->flags & HAS_TIMEOUT) && (csr & USART_CSR_ENDRX)) { - // Shuffle data from 'ping' of ping pong buffer, but - // leave current 'pong' in place, as it has become the - // new 'ping'. We need to copy data and setup the old - // 'ping' as the new 'pong' when we're done. - bus_dmamap_sync(atsc->dmatag, atsc->ping->map, - BUS_DMASYNC_POSTREAD); - for (i = 0; i < sc->sc_rxfifosz; i++) - at91_rx_put(sc, atsc->ping->buffer[i]); - p = atsc->ping; - atsc->ping = atsc->pong; - atsc->pong = p; - WR4(&sc->sc_bas, PDC_RNPR, atsc->pong->pa); - WR4(&sc->sc_bas, PDC_RNCR, sc->sc_rxfifosz); - ipend |= SER_INT_RXREADY; - } - if ((atsc->flags & HAS_TIMEOUT) && (csr & USART_CSR_TIMEOUT)) { - // We have one partial buffer. We need to stop the - // PDC, get the number of characters left and from - // that compute number of valid characters. We then - // need to reset ping and pong and reenable the PDC. - // Not sure if there's a race here at fast baud rates - // we need to worry about. - WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_RXTDIS); - bus_dmamap_sync(atsc->dmatag, atsc->ping->map, - BUS_DMASYNC_POSTREAD); - len = sc->sc_rxfifosz - RD4(&sc->sc_bas, PDC_RCR); - for (i = 0; i < len; i++) - at91_rx_put(sc, atsc->ping->buffer[i]); - WR4(&sc->sc_bas, PDC_RPR, atsc->ping->pa); - WR4(&sc->sc_bas, PDC_RCR, sc->sc_rxfifosz); - WR4(&sc->sc_bas, USART_CR, USART_CR_STTTO); - WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_RXTEN); - ipend |= SER_INT_RXREADY; - } - if (!(atsc->flags & HAS_TIMEOUT) && (csr & USART_CSR_RXRDY)) { - // We have another charater in a device that doesn't support - // timeouts, so we do it one character at a time. + if (atsc->flags & HAS_TIMEOUT) { + if (csr & USART_CSR_RXBUFF) { + /* + * We have a buffer overflow. Copy all data from both + * ping and pong. Insert overflow character. Reset + * ping and pong and re-enable the PDC to receive + * characters again. + */ + bus_dmamap_sync(atsc->rx_tag, atsc->ping->map, + BUS_DMASYNC_POSTREAD); + bus_dmamap_sync(atsc->rx_tag, atsc->pong->map, + BUS_DMASYNC_POSTREAD); + for (i = 0; i < sc->sc_rxfifosz; i++) + at91_rx_put(sc, atsc->ping->buffer[i]); + for (i = 0; i < sc->sc_rxfifosz; i++) + at91_rx_put(sc, atsc->pong->buffer[i]); + uart_rx_put(sc, UART_STAT_OVERRUN); + bus_dmamap_sync(atsc->rx_tag, atsc->ping->map, + BUS_DMASYNC_PREREAD); + bus_dmamap_sync(atsc->rx_tag, atsc->pong->map, + BUS_DMASYNC_PREREAD); + WR4(&sc->sc_bas, PDC_RPR, atsc->ping->pa); + WR4(&sc->sc_bas, PDC_RCR, sc->sc_rxfifosz); + WR4(&sc->sc_bas, PDC_RNPR, atsc->pong->pa); + WR4(&sc->sc_bas, PDC_RNCR, sc->sc_rxfifosz); + WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_RXTEN); + ipend |= SER_INT_RXREADY; + } else if (csr & USART_CSR_ENDRX) { + /* + * Shuffle data from ping of ping pong buffer, but + * leave current pong in place, as it has become the + * new ping. We need to copy data and setup the old + * ping as the new pong when we're done. + */ + bus_dmamap_sync(atsc->rx_tag, atsc->ping->map, + BUS_DMASYNC_POSTREAD); + for (i = 0; i < sc->sc_rxfifosz; i++) + at91_rx_put(sc, atsc->ping->buffer[i]); + p = atsc->ping; + atsc->ping = atsc->pong; + atsc->pong = p; + bus_dmamap_sync(atsc->rx_tag, atsc->pong->map, + BUS_DMASYNC_PREREAD); + WR4(&sc->sc_bas, PDC_RNPR, atsc->pong->pa); + WR4(&sc->sc_bas, PDC_RNCR, sc->sc_rxfifosz); + ipend |= SER_INT_RXREADY; + } else if (csr & USART_CSR_TIMEOUT) { + /* + * We have one partial buffer. We need to stop the + * PDC, get the number of characters left and from + * that compute number of valid characters. We then + * need to reset ping and pong and reenable the PDC. + * Not sure if there's a race here at fast baud rates + * we need to worry about. + */ + WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_RXTDIS); + bus_dmamap_sync(atsc->rx_tag, atsc->ping->map, + BUS_DMASYNC_POSTREAD); + len = sc->sc_rxfifosz - RD4(&sc->sc_bas, PDC_RCR); + for (i = 0; i < len; i++) + at91_rx_put(sc, atsc->ping->buffer[i]); + bus_dmamap_sync(atsc->rx_tag, atsc->ping->map, + BUS_DMASYNC_PREREAD); + WR4(&sc->sc_bas, PDC_RPR, atsc->ping->pa); + WR4(&sc->sc_bas, PDC_RCR, sc->sc_rxfifosz); + WR4(&sc->sc_bas, USART_CR, USART_CR_STTTO); + WR4(&sc->sc_bas, PDC_PTCR, PDC_PTCR_RXTEN); + ipend |= SER_INT_RXREADY; + } + } else if (csr & USART_CSR_RXRDY) { + /* + * We have another charater in a device that doesn't support + * timeouts, so we do it one character at a time. + */ at91_rx_put(sc, RD4(&sc->sc_bas, USART_RHR) & 0xff); ipend |= SER_INT_RXREADY; } if (csr & USART_CSR_RXBRK) { - unsigned int cr = USART_CR_RSTSTA; - ipend |= SER_INT_BREAK; - WR4(&sc->sc_bas, USART_CR, cr); + WR4(&sc->sc_bas, USART_CR, USART_CR_RSTSTA); } uart_unlock(sc->sc_hwmtx); return (ipend); } + static int at91_usart_bus_flush(struct uart_softc *sc, int what) { + return (0); } static int at91_usart_bus_getsig(struct uart_softc *sc) { - uint32_t new, sig; - uint8_t csr; + uint32_t csr, new, sig; uart_lock(sc->sc_hwmtx); csr = RD4(&sc->sc_bas, USART_CSR); @@ -628,6 +667,7 @@ at91_usart_bus_getsig(struct uart_softc *sc) static int at91_usart_bus_ioctl(struct uart_softc *sc, int request, intptr_t data) { + switch (request) { case UART_IOCTL_BREAK: case UART_IOCTL_IFLOW: @@ -637,7 +677,7 @@ at91_usart_bus_ioctl(struct uart_softc *sc, int request, intptr_t data) /* only if we know our master clock rate */ if (DEFAULT_RCLK != 0) WR4(&sc->sc_bas, USART_BRGR, - BAUD2DIVISOR(*(int *)data)); + BAUD2DIVISOR(*(int *)data)); return (0); } return (EINVAL); diff --git a/sys/arm/conf/ATMEL b/sys/arm/conf/ATMEL new file mode 100644 index 00000000000..0c4c9e03bab --- /dev/null +++ b/sys/arm/conf/ATMEL @@ -0,0 +1,167 @@ +# Kernel configuration to test compile all the atmel bits with one +# configuration. This kernel will not (presently) boot. Do not copy +# it to create your own custom config file. +# +# $FreeBSD$ + +ident ATMEL + +include "../at91/std.atmel" + +# Arbitrary values for testing purposes. +options STARTUP_PAGETABLE_ADDR=0x20800000 +makeoptions KERNPHYSADDR=0x20000000 +makeoptions KERNVIRTADDR=0xc0000000 +options KERNPHYSADDR=0x20000000 +options KERNVIRTADDR=0xc0000000 + +makeoptions MODULES_OVERRIDE="" + +# list all boards here, but not just yet (no multiboard in mainline). +options ARM_MANY_BOARD +device at91_board_bwct +device at91_board_ethernut5 +device at91_board_hl200 +device at91_board_hl201 +device at91_board_kb920x +device at91_board_qila9g20 +device at91_board_sam9g20ek +device at91_board_sam9x25ek +device at91_board_tsc4370 + +#makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols + +options SCHED_4BSD # 4BSD scheduler +#options PREEMPTION # Enable kernel thread preemption +options INET # InterNETworking +options INET6 # IPv6 communications protocols +options SCTP # Stream Control Transmission Protocol +options FFS # Berkeley Fast Filesystem +options SOFTUPDATES # Enable FFS soft updates support +options UFS_ACL # Support for access control lists +options UFS_DIRHASH # Improve performance on big directories +options UFS_GJOURNAL # Enable gjournal-based UFS journaling +options MD_ROOT # MD is a potential root device +options NFSCL # New Network Filesystem Client +options NFSD # New Network Filesystem Server +options NFSLOCKD # Network Lock Manager +options NFS_ROOT # NFS usable as /, requires NFSCL +options MSDOSFS # MSDOS Filesystem +options CD9660 # ISO 9660 Filesystem +options PROCFS # Process filesystem (requires PSEUDOFS) +options PSEUDOFS # Pseudo-filesystem framework +options GEOM_PART_GPT # GUID Partition Tables. +options GEOM_LABEL # Provides labelization +options COMPAT_FREEBSD5 # Compatible with FreeBSD5 +options COMPAT_FREEBSD6 # Compatible with FreeBSD6 +options COMPAT_FREEBSD7 # Compatible with FreeBSD7 +options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI +options KTRACE # ktrace(1) support +options STACK # stack(9) support +options SYSVSHM # SYSV-style shared memory +options SYSVMSG # SYSV-style message queues +options SYSVSEM # SYSV-style semaphores +options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions +options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed. +#options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4) +#options AUDIT # Security event auditing +#options CAPABILITY_MODE # Capsicum capability mode +#options CAPABILITIES # Capsicum capabilities +#options MAC # TrustedBSD MAC Framework +#options INCLUDE_CONFIG_FILE # Include this file in kernel + +# required for netbooting +options BOOTP +options BOOTP_COMPAT +options BOOTP_NFSROOT +options BOOTP_NFSV3 +options BOOTP_WIRED_TO=ate0 + +# alternatively, boot from a MMC/SD memory card +#options ROOTDEVNAME=\"ufs:/dev/mmcsd0a\" + +# kernel/memory size reduction +options MUTEX_NOINLINE +options NO_FFS_SNAPSHOT +options NO_SWAPPING +options NO_SYSCTL_DESCR +options RWLOCK_NOINLINE + +# Debugging support. Always need this: +options KDB # Enable kernel debugger support. +# For minimum debugger support (stable branch) use: +options KDB_TRACE # Print a stack trace for a panic. +# For full debugger support use this instead: +options DDB # Support DDB. +options GDB # Support remote GDB. +#options DEADLKRES # Enable the deadlock resolver +#options INVARIANTS # Enable calls of extra sanity checking +#options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS +#options WITNESS # Enable checks to detect deadlocks and cycles +#options WITNESS_SKIPSPIN # Don't run witness on spinlocks for speed +#options MALLOC_DEBUG_MAXZONES=8 # Separate malloc(9) zones + +# The `bpf' device enables the Berkeley Packet Filter. +# Be aware of the administrative consequences of enabling this! +# Note that 'bpf' is required for DHCP. +device bpf # Berkeley packet filter + +# Ethernet +device mii # Minimal MII support +device ate # Atmel AT91 Ethernet friver + +# I2C +device at91_twi # Atmel AT91 Two-wire Interface +device iic # I2C generic I/O device driver +device iicbus # I2C bus system +device pcf8563 # NXP PCF8563 clock/calendar + +# MMC/SD +device at91_mci # Atmel AT91 Multimedia Card Interface +options AT91_MCI_HAS_4WIRE +device mmc # MMC/SD bus +device mmcsd # MMC/SD memory card + +# DataFlash +device at91_spi # Atmel AT91 Serial Peripheral Interface +device spibus # SPI bus +device at45d # Atmel AT45D +device geom_map # GEOM partition mapping + +# Pseudo devices. +device loop # Network loopback +device random # Entropy device +device ether # Ethernet support +device vlan # 802.1Q VLAN support +device tun # Packet tunnel. +device md # Memory "disks" +device gif # IPv6 and IPv4 tunneling +device faith # IPv6-to-IPv4 relaying (translation) +#device firmware # firmware assist module + +# SCSI peripherals +device scbus # SCSI bus (required for ATA/SCSI) +device ch # SCSI media changers +device da # Direct Access (disks) +device sa # Sequential Access (tape etc) +device cd # CD +device pass # Passthrough device (direct ATA/SCSI access) +device ses # Enclosure Services (SES and SAF-TE) +device ctl # CAM Target Layer + +# Serial (COM) ports +device uart # Multi-uart driver +options ALT_BREAK_TO_DEBUGGER + +# USB support +options USB_DEBUG # enable debug msgs +device ohci # OHCI PCI->USB interface +device usb # USB Bus (required) +device umass # Disks/Mass storage - Requires scbus and da + +# watchdog +device at91_wdt # Atmel AT91 Watchdog Timer + +device at91_rtc +device at91_ssc +#device at91_tc # missing? diff --git a/sys/arm/conf/AVILA b/sys/arm/conf/AVILA index 3a7930d3fcd..55333dc575c 100644 --- a/sys/arm/conf/AVILA +++ b/sys/arm/conf/AVILA @@ -12,8 +12,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ diff --git a/sys/arm/conf/BWCT b/sys/arm/conf/BWCT index 079c32a4e7b..4c6a1f163fb 100644 --- a/sys/arm/conf/BWCT +++ b/sys/arm/conf/BWCT @@ -11,8 +11,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ @@ -21,11 +21,9 @@ ident BWCT options VERBOSE_INIT_ARM -options AT91_BWCT include "../at91/std.bwct" #To statically compile in device wiring instead of /boot/device.hints -#hints "hints.at91rm9200" hints "BWCT.hints" makeoptions MODULES_OVERRIDE="" diff --git a/sys/arm/conf/CAMBRIA b/sys/arm/conf/CAMBRIA index f8dcf2ab8bf..c1b5c40376e 100644 --- a/sys/arm/conf/CAMBRIA +++ b/sys/arm/conf/CAMBRIA @@ -12,8 +12,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ diff --git a/sys/arm/conf/CNS11XXNAS b/sys/arm/conf/CNS11XXNAS index 60895b01725..98b74e9e457 100644 --- a/sys/arm/conf/CNS11XXNAS +++ b/sys/arm/conf/CNS11XXNAS @@ -12,8 +12,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ diff --git a/sys/arm/conf/CRB b/sys/arm/conf/CRB index 9efbc083554..f0ed5ccb7b5 100644 --- a/sys/arm/conf/CRB +++ b/sys/arm/conf/CRB @@ -11,8 +11,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ diff --git a/sys/arm/conf/DB-78XXX b/sys/arm/conf/DB-78XXX index 218bea983ca..f3e62f5b61a 100644 --- a/sys/arm/conf/DB-78XXX +++ b/sys/arm/conf/DB-78XXX @@ -17,6 +17,7 @@ options SCHED_4BSD #4BSD scheduler options INET #InterNETworking options INET6 #IPv6 communications protocols options FFS #Berkeley Fast Filesystem +options NANDFS #NAND Filesystem options NFSCL #New Network Filesystem Client options NFSLOCKD #Network Lock Manager options NFS_ROOT #NFS usable as /, requires NFSCL @@ -82,6 +83,10 @@ device ds133x # SATA device mvs +# NAND +device nand + # Flattened Device Tree options FDT +options FDT_DTB_STATIC makeoptions FDT_DTS_FILE=db78100.dts diff --git a/sys/arm/conf/DB-88F6XXX b/sys/arm/conf/DB-88F6XXX index 7081117bc16..cf508ad7725 100644 --- a/sys/arm/conf/DB-88F6XXX +++ b/sys/arm/conf/DB-88F6XXX @@ -17,6 +17,7 @@ options SCHED_4BSD #4BSD scheduler options INET #InterNETworking options INET6 #IPv6 communications protocols options FFS #Berkeley Fast Filesystem +options NANDFS #NAND Filesystem options NFSCL #New Network Filesystem Client options NFSLOCKD #Network Lock Manager options NFS_ROOT #NFS usable as /, requires NFSCL @@ -85,6 +86,10 @@ device iicbus # SATA device mvs +# NAND +device nand + # Flattened Device Tree options FDT +options FDT_DTB_STATIC makeoptions FDT_DTS_FILE=db88f6281.dts diff --git a/sys/arm/conf/EP80219 b/sys/arm/conf/EP80219 index cd306c21b61..676247a0201 100644 --- a/sys/arm/conf/EP80219 +++ b/sys/arm/conf/EP80219 @@ -11,8 +11,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ diff --git a/sys/arm/conf/ETHERNUT5 b/sys/arm/conf/ETHERNUT5 new file mode 100644 index 00000000000..65490b04dfc --- /dev/null +++ b/sys/arm/conf/ETHERNUT5 @@ -0,0 +1,158 @@ +# Kernel configuration for Ethernut 5 boards +# +# For more information on this file, please read the config(5) manual page, +# and/or the handbook section on Kernel Configuration Files: +# +# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html +# +# The handbook is also available locally in /usr/share/doc/handbook +# if you've installed the doc distribution, otherwise always see the +# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the +# latest information. +# +# An exhaustive list of options and more detailed explanations of the +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first +# in NOTES. +# +# $FreeBSD$ + +ident ETHERNUT5 + +include "../at91/std.ethernut5" + +# To statically compile in device wiring instead of /boot/device.hints +hints "ETHERNUT5.hints" + +#makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols + +options SCHED_4BSD # 4BSD scheduler +#options PREEMPTION # Enable kernel thread preemption +options INET # InterNETworking +#options INET6 # IPv6 communications protocols +#options SCTP # Stream Control Transmission Protocol +options FFS # Berkeley Fast Filesystem +options SOFTUPDATES # Enable FFS soft updates support +#options UFS_ACL # Support for access control lists +options UFS_DIRHASH # Improve performance on big directories +#options UFS_GJOURNAL # Enable gjournal-based UFS journaling +#options MD_ROOT # MD is a potential root device +options NFSCL # New Network Filesystem Client +#options NFSD # New Network Filesystem Server +options NFSLOCKD # Network Lock Manager +options NFS_ROOT # NFS usable as /, requires NFSCL +#options MSDOSFS # MSDOS Filesystem +#options CD9660 # ISO 9660 Filesystem +#options PROCFS # Process filesystem (requires PSEUDOFS) +#options PSEUDOFS # Pseudo-filesystem framework +#options GEOM_PART_GPT # GUID Partition Tables. +#options GEOM_LABEL # Provides labelization +#options COMPAT_FREEBSD5 # Compatible with FreeBSD5 +#options COMPAT_FREEBSD6 # Compatible with FreeBSD6 +#options COMPAT_FREEBSD7 # Compatible with FreeBSD7 +options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI +options KTRACE # ktrace(1) support +#options STACK # stack(9) support +options SYSVSHM # SYSV-style shared memory +options SYSVMSG # SYSV-style message queues +options SYSVSEM # SYSV-style semaphores +options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions +options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed. +#options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4) +#options AUDIT # Security event auditing +#options CAPABILITY_MODE # Capsicum capability mode +#options CAPABILITIES # Capsicum capabilities +#options MAC # TrustedBSD MAC Framework +#options INCLUDE_CONFIG_FILE # Include this file in kernel + +# required for netbooting +options BOOTP +options BOOTP_COMPAT +options BOOTP_NFSROOT +options BOOTP_NFSV3 +options BOOTP_WIRED_TO=ate0 + +# alternatively, boot from a MMC/SD memory card +#options ROOTDEVNAME=\"ufs:/dev/mmcsd0a\" + +# kernel/memory size reduction +options MUTEX_NOINLINE +options NO_FFS_SNAPSHOT +options NO_SWAPPING +options NO_SYSCTL_DESCR +options RWLOCK_NOINLINE + +# Debugging support. Always need this: +#options KDB # Enable kernel debugger support. +# For minimum debugger support (stable branch) use: +#options KDB_TRACE # Print a stack trace for a panic. +# For full debugger support use this instead: +#options DDB # Support DDB. +#options GDB # Support remote GDB. +#options DEADLKRES # Enable the deadlock resolver +#options INVARIANTS # Enable calls of extra sanity checking +#options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS +#options WITNESS # Enable checks to detect deadlocks and cycles +#options WITNESS_SKIPSPIN # Don't run witness on spinlocks for speed +#options MALLOC_DEBUG_MAXZONES=8 # Separate malloc(9) zones + +# The `bpf' device enables the Berkeley Packet Filter. +# Be aware of the administrative consequences of enabling this! +# Note that 'bpf' is required for DHCP. +device bpf # Berkeley packet filter + +# Ethernet +device mii # Minimal MII support +device ate # Atmel AT91 Ethernet friver + +# I2C +device at91_twi # Atmel AT91 Two-wire Interface +device iic # I2C generic I/O device driver +device iicbus # I2C bus system +device pcf8563 # NXP PCF8563 clock/calendar + +# MMC/SD +device at91_mci # Atmel AT91 Multimedia Card Interface +options AT91_MCI_HAS_4WIRE +device mmc # MMC/SD bus +device mmcsd # MMC/SD memory card + +# DataFlash +device at91_spi # Atmel AT91 Serial Peripheral Interface +device spibus # SPI bus +device at45d # Atmel AT45D +device geom_map # GEOM partition mapping + +# Pseudo devices. +device loop # Network loopback +device random # Entropy device +device ether # Ethernet support +#device vlan # 802.1Q VLAN support +#device tun # Packet tunnel. +#device md # Memory "disks" +#device gif # IPv6 and IPv4 tunneling +#device faith # IPv6-to-IPv4 relaying (translation) +#device firmware # firmware assist module + +# SCSI peripherals +#device scbus # SCSI bus (required for ATA/SCSI) +#device ch # SCSI media changers +#device da # Direct Access (disks) +#device sa # Sequential Access (tape etc) +#device cd # CD +#device pass # Passthrough device (direct ATA/SCSI access) +#device ses # Enclosure Services (SES and SAF-TE) +#device ctl # CAM Target Layer + +# Serial (COM) ports +device uart # Multi-uart driver +options ALT_BREAK_TO_DEBUGGER + +# USB support +#options USB_DEBUG # enable debug msgs +device ohci # OHCI PCI->USB interface +device usb # USB Bus (required) +#device umass # Disks/Mass storage - Requires scbus and da + +# watchdog +device at91_wdt # Atmel AT91 Watchdog Timer diff --git a/sys/arm/conf/ETHERNUT5.hints b/sys/arm/conf/ETHERNUT5.hints new file mode 100644 index 00000000000..6ab41a1cd64 --- /dev/null +++ b/sys/arm/conf/ETHERNUT5.hints @@ -0,0 +1,51 @@ +# $FreeBSD$ + +# Atmel AT45DB21D +hint.at45d.0.at="spibus0" +hint.at45d.0.addr=0x00 +# user 132 kbytes +hint.map.0.at="flash/spi0" +hint.map.0.start=0x00000000 +hint.map.0.end=0x00020fff +hint.map.0.name="user" +hint.map.0.readonly=1 +# setup 132 kbytes +hint.map.1.at="flash/spi0" +hint.map.1.start=0x00021000 +hint.map.1.end=0x00041fff +hint.map.1.name="setup" +hint.map.1.readonly=1 +# uboot 528 kbytes +hint.map.2.at="flash/spi0" +hint.map.2.start=0x00042000 +hint.map.2.end=0x000c5fff +hint.map.2.name="uboot" +hint.map.2.readonly=1 +# kernel 2640 kbytes +hint.map.3.at="flash/spi0" +hint.map.3.start=0x000c6000 +hint.map.3.end=0x00359fff +hint.map.3.name="kernel" +#hint.map.3.readonly=1 +# nutos 528 kbytes +hint.map.4.at="flash/spi0" +hint.map.4.start=0x0035a000 +hint.map.4.end=0x003ddfff +hint.map.4.name="nutos" +hint.map.4.readonly=1 +# env 132 kbytes +hint.map.5.at="flash/spi0" +hint.map.5.start=0x003de000 +hint.map.5.end=0x003fefff +hint.map.5.name="env" +hint.map.5.readonly=1 +# env 132 kbytes +hint.map.6.at="flash/spi0" +hint.map.6.start=0x003ff000 +hint.map.6.end=0x0041ffff +hint.map.6.name="nutoscfg" +hint.map.6.readonly=1 + +# NXP PCF8563 clock/calendar +hint.pcf8563_rtc.0.at="iicbus0" +hint.pcf8563_rtc.0.addr=0xa2 diff --git a/sys/arm/conf/GUMSTIX b/sys/arm/conf/GUMSTIX index 61ffe0b8d08..11fe6a96b7a 100644 --- a/sys/arm/conf/GUMSTIX +++ b/sys/arm/conf/GUMSTIX @@ -12,8 +12,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ diff --git a/sys/arm/conf/GUMSTIX-QEMU b/sys/arm/conf/GUMSTIX-QEMU index 394d337450d..0968b8a043f 100644 --- a/sys/arm/conf/GUMSTIX-QEMU +++ b/sys/arm/conf/GUMSTIX-QEMU @@ -11,82 +11,15 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ +include GUMSTIX + ident GUMSTIX-QEMU -cpu CPU_XSCALE_PXA2X0 - -# This probably wants to move somewhere else. Maybe we can create a basic -# PXA2X0 config, then make a GUMSTIX config that includes the basic one, -# adds the smc and smcphy devices and pulls in this hints file. -hints "GUMSTIX.hints" - -options PHYSADDR=0xa0000000 -options KERNPHYSADDR=0xa0200000 -options KERNVIRTADDR=0xc0200000 # Used in ldscript.arm - -options STARTUP_PAGETABLE_ADDR=0xa0000000 -include "../xscale/pxa/std.pxa" -makeoptions MODULES_OVERRIDE="" - -makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols -options HZ=100 -#options DEVICE_POLLING options QEMU_WORKAROUNDS nooptions ARM_CACHE_LOCK_ENABLE # QEMU does not implement this - -options SCHED_4BSD #4BSD scheduler -options INET #InterNETworking -#options INET6 #IPv6 communications protocols -options FFS #Berkeley Fast Filesystem -options SOFTUPDATES #Enable FFS soft updates support -options UFS_ACL #Support for access control lists -options UFS_DIRHASH #Improve performance on big directories -options NFSCL #New Network Filesystem Client -#options NFSD #New Network Filesystem Server -options NFS_ROOT #NFS usable as /, requires NFSCL -#options MSDOSFS #MSDOS Filesystem -#options CD9660 #ISO 9660 Filesystem -#options PROCFS #Process filesystem (requires PSEUDOFS) -options PSEUDOFS #Pseudo-filesystem framework -options COMPAT_43 #Compatible with BSD 4.3 [KEEP THIS!] -options SCSI_DELAY=5000 #Delay (in ms) before probing SCSI -options KTRACE #ktrace(1) support -options SYSVSHM #SYSV-style shared memory -options SYSVMSG #SYSV-style message queues -options SYSVSEM #SYSV-style semaphores -options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions -options KBD_INSTALL_CDEV # install a CDEV entry in /dev -options BOOTP -options BOOTP_NFSROOT -options BOOTP_WIRED_TO=smc0 -options BOOTP_COMPAT -options BOOTP_NFSV3 -options BOOTP_BLOCKSIZE=4096 -options PREEMPTION -device loop -device ether -device mii -device mii_bitbang -device smc -device smcphy -device uart -device uart_ns8250 - -# Debugging for use in -current -options KDB -options DDB #Enable the kernel debugger -#options DEADLKRES #Enable the deadlock resolver -#options INVARIANTS #Enable calls of extra sanity checking -#options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS -#options WITNESS #Enable checks to detect deadlocks and cycles -#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed -#options DIAGNOSTIC - -device md -device random # Entropy device diff --git a/sys/arm/conf/HL200 b/sys/arm/conf/HL200 index f91502d8e57..415cbc92632 100644 --- a/sys/arm/conf/HL200 +++ b/sys/arm/conf/HL200 @@ -11,8 +11,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ diff --git a/sys/arm/conf/HL201 b/sys/arm/conf/HL201 index 253614ee478..1baa3578244 100644 --- a/sys/arm/conf/HL201 +++ b/sys/arm/conf/HL201 @@ -11,8 +11,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ diff --git a/sys/arm/conf/IQ31244 b/sys/arm/conf/IQ31244 index ee204e36531..019d8050a3a 100644 --- a/sys/arm/conf/IQ31244 +++ b/sys/arm/conf/IQ31244 @@ -11,8 +11,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ diff --git a/sys/arm/conf/KB920X b/sys/arm/conf/KB920X index 8bb9b7b0402..d102f5f2c54 100644 --- a/sys/arm/conf/KB920X +++ b/sys/arm/conf/KB920X @@ -12,8 +12,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ @@ -24,7 +24,7 @@ include "../at91/std.kb920x" # The AT91 platform doesn't use /boot/loader, so we have to statically wire # hints. hints "KB920X.hints" -#makeoptions MODULES_OVERRIDE="" +makeoptions MODULES_OVERRIDE="" makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols options DDB @@ -137,6 +137,7 @@ device wlan_wep # 802.11 WEP support device wlan_ccmp # 802.11 CCMP support device wlan_tkip # 802.11 TKIP support device wlan_amrr # AMRR transmit rate control algorithm + options IEEE80211_SUPPORT_MESH options AH_SUPPORT_AR5416 diff --git a/sys/arm/conf/LN2410SBC b/sys/arm/conf/LN2410SBC index ec1d1d07e7d..50bb83e2a11 100644 --- a/sys/arm/conf/LN2410SBC +++ b/sys/arm/conf/LN2410SBC @@ -11,8 +11,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ diff --git a/sys/arm/conf/NSLU b/sys/arm/conf/NSLU index 5cbaf92136a..0980e4d4a80 100644 --- a/sys/arm/conf/NSLU +++ b/sys/arm/conf/NSLU @@ -11,8 +11,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ diff --git a/sys/arm/conf/QILA9G20 b/sys/arm/conf/QILA9G20 index b843f0d8dab..5a17594d97d 100644 --- a/sys/arm/conf/QILA9G20 +++ b/sys/arm/conf/QILA9G20 @@ -1,5 +1,5 @@ -# Kernel configuration for Calao Syatems QIL-A9G20 development card -# http://www.calao-systems.com +# Kernel configuration for Calao Syatems QIL-A9G20 development card +# http://www.calao-systems.com # # For more information on this file, please read the handbook section on # Kernel Configuration Files: @@ -12,8 +12,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ @@ -93,11 +93,11 @@ option AT91_ATE_USE_RMII device at91_twi # TWI: Two Wire Interface (EEPROM) device at91_wdt # WDT: Watchdog timer -# NOTE: SPI DataFlash and mci/mmc/mmcsd have hardware +# NOTE: SPI DataFlash and mci/mmc/mmcsd have hardware # confilict on this card. Use one or the other. # see board_sam9g20ek.c -# SPI: Data Flash +# SPI: Data Flash #device at91_spi # SPI: #device spibus #device at45d # at45db642 and maybe others diff --git a/sys/arm/conf/QILA9G20.hints b/sys/arm/conf/QILA9G20.hints index cf391f5fa5d..6dd430eb409 100644 --- a/sys/arm/conf/QILA9G20.hints +++ b/sys/arm/conf/QILA9G20.hints @@ -1,9 +1,9 @@ # $FreeBSD$ -# Kernel configuration hits for Calao Syatems QIL-A9G20 development card -# http://www.calao-systems.com +# Kernel configuration hits for Calao Syatems QIL-A9G20 development card +# http://www.calao-systems.com # STMicroelctrtronics M41T94 Real-Time Clock -# on SPI0 NPCS0 +# on SPI0 NPCS0 # STMicroelctrtronics M95640 8k x 8 EEPROM # on SPI0 NPCS1 diff --git a/sys/arm/conf/SAM9G20EK b/sys/arm/conf/SAM9G20EK index ff8200eec6b..57406951fe5 100644 --- a/sys/arm/conf/SAM9G20EK +++ b/sys/arm/conf/SAM9G20EK @@ -1,4 +1,4 @@ -# Kernel configuration for Atmel AT91SAM9G20EK Rev B. development card +# Kernel configuration for Atmel AT91SAM9G20EK Rev B. development card # # For more information on this file, please read the handbook section on # Kernel Configuration Files: @@ -11,8 +11,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ @@ -92,11 +92,11 @@ option AT91_ATE_USE_RMII device at91_twi # TWI: Two Wire Interface (EEPROM) device at91_wdt # WDT: Watchdog timer -# NOTE: SPI DataFlash and mci/mmc/mmcsd have hardware +# NOTE: SPI DataFlash and mci/mmc/mmcsd have hardware # confilict on this card. Use one or the other. # see board_sam9g20ek.c -# SPI: Data Flash +# SPI: Data Flash #device at91_spi # SPI: #device spibus #device at45d # at45db642 and maybe others diff --git a/sys/arm/conf/SAM9G20EK.hints b/sys/arm/conf/SAM9G20EK.hints index 166efdb5013..fe0b5340fe6 100644 --- a/sys/arm/conf/SAM9G20EK.hints +++ b/sys/arm/conf/SAM9G20EK.hints @@ -1,7 +1,7 @@ # $FreeBSD$ # -# EEPROM +# EEPROM hint.icee.0.at="iicbus0" hint.icee.0.addr=0xa0 hint.icee.0.type=16 diff --git a/sys/arm/conf/SAM9X25EK b/sys/arm/conf/SAM9X25EK new file mode 100644 index 00000000000..3b5b2d7dee6 --- /dev/null +++ b/sys/arm/conf/SAM9X25EK @@ -0,0 +1,154 @@ +# Kernel configuration for Atmel AT91SAM9G20EK Rev B. development card +# +# For more information on this file, please read the handbook section on +# Kernel Configuration Files: +# +# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html +# +# The handbook is also available locally in /usr/share/doc/handbook +# if you've installed the doc distribution, otherwise always see the +# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the +# latest information. +# +# An exhaustive list of options and more detailed explanations of the +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first +# in NOTES. +# +# $FreeBSD$ + +# NOUNIVERSE: disable building in make universe +ident SAM9X25EK + +include "../at91/std.sam9x25ek" + +#To statically compile in device wiring instead of /boot/device.hints +hints "SAM9G20EK.hints" +makeoptions MODULES_OVERRIDE="" + +makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols +options DDB +options KDB + +options SCHED_4BSD #4BSD scheduler +options INET #InterNETworking +#options INET6 #IPv6 communications protocols +options FFS #Berkeley Fast Filesystem +#options SOFTUPDATES #Enable FFS soft updates support +#options UFS_ACL #Support for access control lists +#options UFS_DIRHASH #Improve performance on big directories +#options MD_ROOT #MD is a potential root device +#options MD_ROOT_SIZE=4096 # 3MB ram disk +options NFSCL #New Network Filesystem Client +#options NFSD #New Network Filesystem Server +#options NFSLOCKD #Network Lock Manager +#options NFS_ROOT #NFS usable as /, requires NFSCL +#options BOOTP_NFSROOT +#options BOOTP +#options BOOTP_NFSV3 +#options BOOTP_WIRED_TO=ate0 +#options BOOTP_COMPAT + +options ROOTDEVNAME=\"ufs:/dev/mmcsd0s1a\" + +options ALT_BREAK_TO_DEBUGGER + +#options MSDOSFS #MSDOS Filesystem +#options CD9660 #ISO 9660 Filesystem +#options PROCFS #Process filesystem (requires PSEUDOFS) +#options PSEUDOFS #Pseudo-filesystem framework +#options SCSI_DELAY=5000 #Delay (in ms) before probing SCSI +#options KTRACE #ktrace(1) support +options SYSVSHM #SYSV-style shared memory +options SYSVMSG #SYSV-style message queues +options SYSVSEM #SYSV-style semaphores +options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions +#options SYSCTL_OMIT_DESCR +options MUTEX_NOINLINE +options RWLOCK_NOINLINE +options NO_FFS_SNAPSHOT +options NO_SWAPPING + +# Debugging for use in -current +#options INVARIANTS #Enable calls of extra sanity checking +#options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS +#options WITNESS #Enable checks to detect deadlocks and cycles +#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed +#options DIAGNOSTIC + +device random +device pty +device loop +device bpf +device ether +device md + +device uart # Serial Ports + +# Ethernet +#device ate # Ethernet Driver +device macb # Alternate Ethernet driver +device mii +option AT91_ATE_USE_RMII + +#device at91_twi # TWI: Two Wire Interface (EEPROM) +device at91_wdt # WDT: Watchdog timer + +# NOTE: SPI DataFlash and mci/mmc/mmcsd have hardware +# confilict on this card. Use one or the other. +# see board_sam9g20ek.c + +# SPI: Data Flash +#device at91_spi # SPI: +#device spibus +#device at45d # at45db642 and maybe others + +# MMC/SD +device at91_mci +device mmc +device mmcsd +#option AT91_MCI_SLOT_B +option AT91_MCI_HAS_4WIRE + +# iic +device iic +device iicbus +device icee + +# SCSI peripherals +device scbus # SCSI bus (required for SCSI) +device da # Direct Access (disks) +device cd # CD +device pass # Passthrough device (direct SCSI access) + +# USB support +#device ohci # OHCI localbus->USB interface +#device usb # USB Bus (required) +#device umass # Disks/Mass storage - Requires scbus and da +#device uhid # "Human Interface Devices" +#device ulpt # Printer +#device udbp # USB Double Bulk Pipe devices + +# USB Ethernet, requires miibus +device miibus +#device aue # ADMtek USB Ethernet +#device axe # ASIX Electronics USB Ethernet +#device cdce # Generic USB over Ethernet +#device cue # CATC USB Ethernet +#device kue # Kawasaki LSI USB Ethernet +#device rue # RealTek RTL8150 USB Ethernet +#device udav # Davicom DM9601E USB + +# USB Wireless +#device rum # Ralink Technology RT2501USB wireless NICs +#device uath # Atheros AR5523 wireless NICs +#device ural # Ralink Technology RT2500USB wireless NICs +#device zyd # ZyDAS zd1211/zd1211b wireless NICs + +# Wireless NIC cards +#device wlan # 802.11 support +#device wlan_wep # 802.11 WEP support +#device wlan_ccmp # 802.11 CCMP support +#device wlan_tkip # 802.11 TKIP support +#device wlan_amrr # AMRR transmit rate control algorithm + diff --git a/sys/arm/conf/SAM9X25EK.hints b/sys/arm/conf/SAM9X25EK.hints new file mode 100644 index 00000000000..166efdb5013 --- /dev/null +++ b/sys/arm/conf/SAM9X25EK.hints @@ -0,0 +1,10 @@ +# $FreeBSD$ +# + +# EEPROM +hint.icee.0.at="iicbus0" +hint.icee.0.addr=0xa0 +hint.icee.0.type=16 +hint.icee.0.size=65536 +hint.icee.0.rd_sz=256 +hint.icee.0.wr_sz=256 diff --git a/sys/arm/conf/SHEEVAPLUG b/sys/arm/conf/SHEEVAPLUG index 29d37f4b39f..e7ac524acad 100644 --- a/sys/arm/conf/SHEEVAPLUG +++ b/sys/arm/conf/SHEEVAPLUG @@ -17,6 +17,7 @@ options SCHED_4BSD #4BSD scheduler options INET #InterNETworking options INET6 #IPv6 communications protocols options FFS #Berkeley Fast Filesystem +options NANDFS #NAND Filesystem options NFSCL #New Network Filesystem Client options NFSLOCKD #Network Lock Manager options NFS_ROOT #NFS usable as /, requires NFSCL @@ -72,6 +73,9 @@ device scbus device pass device da +# NAND +device nand + # Flattened Device Tree options FDT options FDT_DTB_STATIC diff --git a/sys/arm/conf/SIMICS b/sys/arm/conf/SIMICS index 84ff983cde0..8988d2728b6 100644 --- a/sys/arm/conf/SIMICS +++ b/sys/arm/conf/SIMICS @@ -11,8 +11,8 @@ # latest information. # # An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD$ diff --git a/sys/arm/conf/genboardid.awk b/sys/arm/conf/genboardid.awk new file mode 100644 index 00000000000..440989c14d4 --- /dev/null +++ b/sys/arm/conf/genboardid.awk @@ -0,0 +1,55 @@ +#!/bin/awk +# $FreeBSD$ + +#- +# Copyright (c) 2012 M. Warner Losh. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +# +# Generate FreeBSD's board ID's defines from Linux's +# arm board list. +# +# You can grab a new copy any time with: +# fetch -o sys/arm/conf/mach-types http://www.arm.linux.org.uk/developer/machines/download.php +# +BEGIN { nr = 0; boardid[nr] = "ARM_BOARD_ID_NONE"; num[nr++] = 0; } +/^#/ { next; } +/^[ ]*$/ { next; } + +NF == 4 { + boardid[nr] = "ARM_BOARD_ID_"$3; + num[nr] = $4; + nr++ +} + +END { + printf("/* Arm board ID file generated automatically from Linux's mach-types file. */\n\n"); + printf("#ifndef _SYS_ARM_ARM_BOARDID_H\n"); + printf("#define _SYS_ARM_ARM_BOARDID_H\n\n"); + for (i = 0; i < nr; i++) { + printf("#define %-30s %d\n", boardid[i], num[i]); + } + printf("\n#endif /* _SYS_ARM_ARM_BOARDID_H */\n"); +} + diff --git a/sys/arm/conf/mach-types b/sys/arm/conf/mach-types new file mode 100644 index 00000000000..17549336804 --- /dev/null +++ b/sys/arm/conf/mach-types @@ -0,0 +1,4146 @@ +# Database of machine macros and numbers +# +# This file is linux/arch/arm/tools/mach-types +# +# Up to date versions of this file can be obtained from: +# +# http://www.arm.linux.org.uk/developer/machines/download.php +# +# Please do not send patches to this file; it is automatically generated! +# To add an entry into this database, please see Documentation/arm/README, +# or visit: +# +# http://www.arm.linux.org.uk/developer/machines/?action=new +# +# Last update: Thu May 10 18:35:23 2012 +# +# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number +# +ebsa110 ARCH_EBSA110 EBSA110 0 +riscpc ARCH_RPC RISCPC 1 +nexuspci ARCH_NEXUSPCI NEXUSPCI 3 +ebsa285 ARCH_EBSA285 EBSA285 4 +netwinder ARCH_NETWINDER NETWINDER 5 +cats ARCH_CATS CATS 6 +tbox ARCH_TBOX TBOX 7 +co285 ARCH_CO285 CO285 8 +clps7110 ARCH_CLPS7110 CLPS7110 9 +archimedes ARCH_ARC ARCHIMEDES 10 +a5k ARCH_A5K A5K 11 +etoile ARCH_ETOILE ETOILE 12 +lacie_nas ARCH_LACIE_NAS LACIE_NAS 13 +clps7500 ARCH_CLPS7500 CLPS7500 14 +shark ARCH_SHARK SHARK 15 +brutus SA1100_BRUTUS BRUTUS 16 +personal_server ARCH_PERSONAL_SERVER PERSONAL_SERVER 17 +itsy SA1100_ITSY ITSY 18 +l7200 ARCH_L7200 L7200 19 +pleb SA1100_PLEB PLEB 20 +integrator ARCH_INTEGRATOR INTEGRATOR 21 +h3600 SA1100_H3600 H3600 22 +ixp1200 ARCH_IXP1200 IXP1200 23 +p720t ARCH_P720T P720T 24 +assabet SA1100_ASSABET ASSABET 25 +victor SA1100_VICTOR VICTOR 26 +lart SA1100_LART LART 27 +ranger SA1100_RANGER RANGER 28 +graphicsclient SA1100_GRAPHICSCLIENT GRAPHICSCLIENT 29 +xp860 SA1100_XP860 XP860 30 +cerf SA1100_CERF CERF 31 +nanoengine SA1100_NANOENGINE NANOENGINE 32 +fpic SA1100_FPIC FPIC 33 +extenex1 SA1100_EXTENEX1 EXTENEX1 34 +sherman SA1100_SHERMAN SHERMAN 35 +accelent_sa SA1100_ACCELENT ACCELENT_SA 36 +accelent_l7200 ARCH_L7200_ACCELENT ACCELENT_L7200 37 +netport SA1100_NETPORT NETPORT 38 +pangolin SA1100_PANGOLIN PANGOLIN 39 +yopy SA1100_YOPY YOPY 40 +coolidge SA1100_COOLIDGE COOLIDGE 41 +huw_webpanel SA1100_HUW_WEBPANEL HUW_WEBPANEL 42 +spotme ARCH_SPOTME SPOTME 43 +freebird ARCH_FREEBIRD FREEBIRD 44 +ti925 ARCH_TI925 TI925 45 +riscstation ARCH_RISCSTATION RISCSTATION 46 +cavy SA1100_CAVY CAVY 47 +jornada720 SA1100_JORNADA720 JORNADA720 48 +omnimeter SA1100_OMNIMETER OMNIMETER 49 +edb7211 ARCH_EDB7211 EDB7211 50 +citygo SA1100_CITYGO CITYGO 51 +pfs168 SA1100_PFS168 PFS168 52 +spot SA1100_SPOT SPOT 53 +flexanet SA1100_FLEXANET FLEXANET 54 +webpal ARCH_WEBPAL WEBPAL 55 +linpda SA1100_LINPDA LINPDA 56 +anakin ARCH_ANAKIN ANAKIN 57 +mvi SA1100_MVI MVI 58 +jupiter SA1100_JUPITER JUPITER 59 +psionw ARCH_PSIONW PSIONW 60 +aln SA1100_ALN ALN 61 +epxa ARCH_CAMELOT CAMELOT 62 +gds2200 SA1100_GDS2200 GDS2200 63 +netbook SA1100_PSION_SERIES7 PSION_SERIES7 64 +xfile SA1100_XFILE XFILE 65 +accelent_ep9312 ARCH_ACCELENT_EP9312 ACCELENT_EP9312 66 +ic200 ARCH_IC200 IC200 67 +creditlart SA1100_CREDITLART CREDITLART 68 +htm SA1100_HTM HTM 69 +iq80310 ARCH_IQ80310 IQ80310 70 +freebot SA1100_FREEBOT FREEBOT 71 +entel ARCH_ENTEL ENTEL 72 +enp3510 ARCH_ENP3510 ENP3510 73 +trizeps SA1100_TRIZEPS TRIZEPS 74 +nesa SA1100_NESA NESA 75 +venus ARCH_VENUS VENUS 76 +tardis ARCH_TARDIS TARDIS 77 +mercury ARCH_MERCURY MERCURY 78 +empeg SA1100_EMPEG EMPEG 79 +adi_evb ARCH_I80200FCC I80200FCC 80 +itt_cpb SA1100_ITT_CPB ITT_CPB 81 +svc SA1100_SVC SVC 82 +alpha2 SA1100_ALPHA2 ALPHA2 84 +alpha1 SA1100_ALPHA1 ALPHA1 85 +netarm ARCH_NETARM NETARM 86 +simpad SA1100_SIMPAD SIMPAD 87 +pda1 ARCH_PDA1 PDA1 88 +lubbock ARCH_LUBBOCK LUBBOCK 89 +aniko ARCH_ANIKO ANIKO 90 +clep7212 ARCH_CLEP7212 CLEP7212 91 +cs89712 ARCH_CS89712 CS89712 92 +weararm SA1100_WEARARM WEARARM 93 +possio_px SA1100_POSSIO_PX POSSIO_PX 94 +sidearm SA1100_SIDEARM SIDEARM 95 +stork SA1100_STORK STORK 96 +shannon SA1100_SHANNON SHANNON 97 +ace ARCH_ACE ACE 98 +ballyarm SA1100_BALLYARM BALLYARM 99 +simputer SA1100_SIMPUTER SIMPUTER 100 +nexterm SA1100_NEXTERM NEXTERM 101 +sa1100_elf SA1100_SA1100_ELF SA1100_ELF 102 +gator SA1100_GATOR GATOR 103 +granite ARCH_GRANITE GRANITE 104 +consus SA1100_CONSUS CONSUS 105 +aaed2000 ARCH_AAED2000 AAED2000 106 +cdb89712 ARCH_CDB89712 CDB89712 107 +graphicsmaster SA1100_GRAPHICSMASTER GRAPHICSMASTER 108 +adsbitsy SA1100_ADSBITSY ADSBITSY 109 +pxa_idp ARCH_PXA_IDP PXA_IDP 110 +plce ARCH_PLCE PLCE 111 +pt_system3 SA1100_PT_SYSTEM3 PT_SYSTEM3 112 +murphy ARCH_MEDALB MEDALB 113 +eagle ARCH_EAGLE EAGLE 114 +dsc21 ARCH_DSC21 DSC21 115 +dsc24 ARCH_DSC24 DSC24 116 +ti5472 ARCH_TI5472 TI5472 117 +autcpu12 ARCH_AUTCPU12 AUTCPU12 118 +uengine ARCH_UENGINE UENGINE 119 +bluestem SA1100_BLUESTEM BLUESTEM 120 +xingu8 ARCH_XINGU8 XINGU8 121 +bushstb ARCH_BUSHSTB BUSHSTB 122 +epsilon1 SA1100_EPSILON1 EPSILON1 123 +balloon SA1100_BALLOON BALLOON 124 +puppy ARCH_PUPPY PUPPY 125 +elroy SA1100_ELROY ELROY 126 +gms720 ARCH_GMS720 GMS720 127 +s24x ARCH_S24X S24X 128 +jtel_clep7312 ARCH_JTEL_CLEP7312 JTEL_CLEP7312 129 +cx821xx ARCH_CX821XX CX821XX 130 +edb7312 ARCH_EDB7312 EDB7312 131 +bsa1110 SA1100_BSA1110 BSA1110 132 +powerpin ARCH_POWERPIN POWERPIN 133 +openarm ARCH_OPENARM OPENARM 134 +whitechapel SA1100_WHITECHAPEL WHITECHAPEL 135 +h3100 SA1100_H3100 H3100 136 +h3800 SA1100_H3800 H3800 137 +blue_v1 ARCH_BLUE_V1 BLUE_V1 138 +pxa_cerf ARCH_PXA_CERF PXA_CERF 139 +arm7tevb ARCH_ARM7TEVB ARM7TEVB 140 +d7400 SA1100_D7400 D7400 141 +piranha ARCH_PIRANHA PIRANHA 142 +sbcamelot SA1100_SBCAMELOT SBCAMELOT 143 +kings SA1100_KINGS KINGS 144 +smdk2400 ARCH_SMDK2400 SMDK2400 145 +collie SA1100_COLLIE COLLIE 146 +idr ARCH_IDR IDR 147 +badge4 SA1100_BADGE4 BADGE4 148 +webnet ARCH_WEBNET WEBNET 149 +d7300 SA1100_D7300 D7300 150 +cep SA1100_CEP CEP 151 +fortunet ARCH_FORTUNET FORTUNET 152 +vc547x ARCH_VC547X VC547X 153 +filewalker SA1100_FILEWALKER FILEWALKER 154 +netgateway SA1100_NETGATEWAY NETGATEWAY 155 +symbol2800 SA1100_SYMBOL2800 SYMBOL2800 156 +suns SA1100_SUNS SUNS 157 +frodo SA1100_FRODO FRODO 158 +ms301 SA1100_MACH_TYTE_MS301 MACH_TYTE_MS301 159 +mx1ads ARCH_MX1ADS MX1ADS 160 +h7201 ARCH_H7201 H7201 161 +h7202 ARCH_H7202 H7202 162 +amico ARCH_AMICO AMICO 163 +iam SA1100_IAM IAM 164 +tt530 SA1100_TT530 TT530 165 +sam2400 ARCH_SAM2400 SAM2400 166 +jornada56x SA1100_JORNADA56X JORNADA56X 167 +active SA1100_ACTIVE ACTIVE 168 +iq80321 ARCH_IQ80321 IQ80321 169 +wid SA1100_WID WID 170 +sabinal ARCH_SABINAL SABINAL 171 +ixp425_matacumbe ARCH_IXP425_MATACUMBE IXP425_MATACUMBE 172 +miniprint SA1100_MINIPRINT MINIPRINT 173 +adm510x ARCH_ADM510X ADM510X 174 +svs200 SA1100_SVS200 SVS200 175 +atg_tcu ARCH_ATG_TCU ATG_TCU 176 +jornada820 SA1100_JORNADA820 JORNADA820 177 +s3c44b0 ARCH_S3C44B0 S3C44B0 178 +margis2 ARCH_MARGIS2 MARGIS2 179 +ks8695 ARCH_KS8695 KS8695 180 +brh ARCH_BRH BRH 181 +s3c2410 ARCH_S3C2410 S3C2410 182 +possio_px30 ARCH_POSSIO_PX30 POSSIO_PX30 183 +s3c2800 ARCH_S3C2800 S3C2800 184 +fleetwood SA1100_FLEETWOOD FLEETWOOD 185 +omaha ARCH_OMAHA OMAHA 186 +ta7 ARCH_TA7 TA7 187 +nova SA1100_NOVA NOVA 188 +hmk ARCH_HMK HMK 189 +karo ARCH_KARO KARO 190 +fester SA1100_FESTER FESTER 191 +gpi ARCH_GPI GPI 192 +smdk2410 ARCH_SMDK2410 SMDK2410 193 +i519 ARCH_I519 I519 194 +nexio SA1100_NEXIO NEXIO 195 +bitbox SA1100_BITBOX BITBOX 196 +g200 SA1100_G200 G200 197 +gill SA1100_GILL GILL 198 +pxa_mercury ARCH_PXA_MERCURY PXA_MERCURY 199 +ceiva ARCH_CEIVA CEIVA 200 +fret SA1100_FRET FRET 201 +emailphone SA1100_EMAILPHONE EMAILPHONE 202 +h3900 ARCH_H3900 H3900 203 +pxa1 ARCH_PXA1 PXA1 204 +koan369 SA1100_KOAN369 KOAN369 205 +cogent ARCH_COGENT COGENT 206 +esl_simputer ARCH_ESL_SIMPUTER ESL_SIMPUTER 207 +esl_simputer_clr ARCH_ESL_SIMPUTER_CLR ESL_SIMPUTER_CLR 208 +esl_simputer_bw ARCH_ESL_SIMPUTER_BW ESL_SIMPUTER_BW 209 +hhp_cradle ARCH_HHP_CRADLE HHP_CRADLE 210 +he500 ARCH_HE500 HE500 211 +inhandelf2 SA1100_INHANDELF2 INHANDELF2 212 +inhandftip SA1100_INHANDFTIP INHANDFTIP 213 +dnp1110 SA1100_DNP1110 DNP1110 214 +pnp1110 SA1100_PNP1110 PNP1110 215 +csb226 ARCH_CSB226 CSB226 216 +arnold SA1100_ARNOLD ARNOLD 217 +voiceblue MACH_VOICEBLUE VOICEBLUE 218 +jz8028 ARCH_JZ8028 JZ8028 219 +h5400 ARCH_H5400 H5400 220 +forte SA1100_FORTE FORTE 221 +acam SA1100_ACAM ACAM 222 +abox SA1100_ABOX ABOX 223 +atmel ARCH_ATMEL ATMEL 224 +sitsang ARCH_SITSANG SITSANG 225 +cpu1110lcdnet SA1100_CPU1110LCDNET CPU1110LCDNET 226 +mpl_vcma9 ARCH_MPL_VCMA9 MPL_VCMA9 227 +opus_a1 ARCH_OPUS_A1 OPUS_A1 228 +daytona ARCH_DAYTONA DAYTONA 229 +killbear SA1100_KILLBEAR KILLBEAR 230 +yoho ARCH_YOHO YOHO 231 +jasper ARCH_JASPER JASPER 232 +dsc25 ARCH_DSC25 DSC25 233 +omap_innovator MACH_OMAP_INNOVATOR OMAP_INNOVATOR 234 +mnci ARCH_RAMSES RAMSES 235 +s28x ARCH_S28X S28X 236 +mport3 ARCH_MPORT3 MPORT3 237 +pxa_eagle250 ARCH_PXA_EAGLE250 PXA_EAGLE250 238 +pdb ARCH_PDB PDB 239 +blue_2g SA1100_BLUE_2G BLUE_2G 240 +bluearch SA1100_BLUEARCH BLUEARCH 241 +ixdp2400 ARCH_IXDP2400 IXDP2400 242 +ixdp2800 ARCH_IXDP2800 IXDP2800 243 +explorer SA1100_EXPLORER EXPLORER 244 +ixdp425 ARCH_IXDP425 IXDP425 245 +chimp ARCH_CHIMP CHIMP 246 +stork_nest ARCH_STORK_NEST STORK_NEST 247 +stork_egg ARCH_STORK_EGG STORK_EGG 248 +wismo SA1100_WISMO WISMO 249 +ezlinx ARCH_EZLINX EZLINX 250 +at91rm9200 ARCH_AT91RM9200 AT91RM9200 251 +adtech_orion ARCH_ADTECH_ORION ADTECH_ORION 252 +neptune ARCH_NEPTUNE NEPTUNE 253 +hackkit SA1100_HACKKIT HACKKIT 254 +pxa_wins30 ARCH_PXA_WINS30 PXA_WINS30 255 +lavinna SA1100_LAVINNA LAVINNA 256 +pxa_uengine ARCH_PXA_UENGINE PXA_UENGINE 257 +innokom ARCH_INNOKOM INNOKOM 258 +bms ARCH_BMS BMS 259 +ixcdp1100 ARCH_IXCDP1100 IXCDP1100 260 +prpmc1100 ARCH_PRPMC1100 PRPMC1100 261 +at91rm9200dk ARCH_AT91RM9200DK AT91RM9200DK 262 +armstick ARCH_ARMSTICK ARMSTICK 263 +armonie ARCH_ARMONIE ARMONIE 264 +mport1 ARCH_MPORT1 MPORT1 265 +s3c5410 ARCH_S3C5410 S3C5410 266 +zcp320a ARCH_ZCP320A ZCP320A 267 +i_box ARCH_I_BOX I_BOX 268 +stlc1502 ARCH_STLC1502 STLC1502 269 +siren ARCH_SIREN SIREN 270 +greenlake ARCH_GREENLAKE GREENLAKE 271 +argus ARCH_ARGUS ARGUS 272 +combadge SA1100_COMBADGE COMBADGE 273 +rokepxa ARCH_ROKEPXA ROKEPXA 274 +cintegrator ARCH_CINTEGRATOR CINTEGRATOR 275 +guidea07 ARCH_GUIDEA07 GUIDEA07 276 +tat257 ARCH_TAT257 TAT257 277 +igp2425 ARCH_IGP2425 IGP2425 278 +bluegrama ARCH_BLUEGRAMMA BLUEGRAMMA 279 +ipod ARCH_IPOD IPOD 280 +adsbitsyx ARCH_ADSBITSYX ADSBITSYX 281 +trizeps2 ARCH_TRIZEPS2 TRIZEPS2 282 +viper ARCH_VIPER VIPER 283 +adsbitsyplus SA1100_ADSBITSYPLUS ADSBITSYPLUS 284 +adsagc SA1100_ADSAGC ADSAGC 285 +stp7312 ARCH_STP7312 STP7312 286 +nx_phnx MACH_NX_PHNX NX_PHNX 287 +wep_ep250 ARCH_WEP_EP250 WEP_EP250 288 +inhandelf3 ARCH_INHANDELF3 INHANDELF3 289 +adi_coyote ARCH_ADI_COYOTE ADI_COYOTE 290 +iyonix ARCH_IYONIX IYONIX 291 +damicam1 ARCH_DAMICAM_SA1110 DAMICAM_SA1110 292 +meg03 ARCH_MEG03 MEG03 293 +pxa_whitechapel ARCH_PXA_WHITECHAPEL PXA_WHITECHAPEL 294 +nwsc ARCH_NWSC NWSC 295 +nwlarm ARCH_NWLARM NWLARM 296 +ixp425_mguard ARCH_IXP425_MGUARD IXP425_MGUARD 297 +pxa_netdcu4 ARCH_PXA_NETDCU4 PXA_NETDCU4 298 +ixdp2401 ARCH_IXDP2401 IXDP2401 299 +ixdp2801 ARCH_IXDP2801 IXDP2801 300 +zodiac ARCH_ZODIAC ZODIAC 301 +armmodul ARCH_ARMMODUL ARMMODUL 302 +ketop SA1100_KETOP KETOP 303 +av7200 ARCH_AV7200 AV7200 304 +arch_ti925 ARCH_ARCH_TI925 ARCH_TI925 305 +acq200 ARCH_ACQ200 ACQ200 306 +pt_dafit SA1100_PT_DAFIT PT_DAFIT 307 +ihba ARCH_IHBA IHBA 308 +quinque ARCH_QUINQUE QUINQUE 309 +nimbraone ARCH_NIMBRAONE NIMBRAONE 310 +nimbra29x ARCH_NIMBRA29X NIMBRA29X 311 +nimbra210 ARCH_NIMBRA210 NIMBRA210 312 +hhp_d95xx ARCH_HHP_D95XX HHP_D95XX 313 +labarm ARCH_LABARM LABARM 314 +m825xx ARCH_M825XX M825XX 315 +m7100 SA1100_M7100 M7100 316 +nipc2 ARCH_NIPC2 NIPC2 317 +fu7202 ARCH_FU7202 FU7202 318 +adsagx ARCH_ADSAGX ADSAGX 319 +pxa_pooh ARCH_PXA_POOH PXA_POOH 320 +bandon ARCH_BANDON BANDON 321 +pcm7210 ARCH_PCM7210 PCM7210 322 +nms9200 ARCH_NMS9200 NMS9200 323 +logodl ARCH_LOGODL LOGODL 324 +m7140 SA1100_M7140 M7140 325 +korebot ARCH_KOREBOT KOREBOT 326 +iq31244 ARCH_IQ31244 IQ31244 327 +koan393 SA1100_KOAN393 KOAN393 328 +inhandftip3 ARCH_INHANDFTIP3 INHANDFTIP3 329 +gonzo ARCH_GONZO GONZO 330 +bast ARCH_BAST BAST 331 +scanpass ARCH_SCANPASS SCANPASS 332 +ep7312_pooh ARCH_EP7312_POOH EP7312_POOH 333 +ta7s ARCH_TA7S TA7S 334 +ta7v ARCH_TA7V TA7V 335 +icarus SA1100_ICARUS ICARUS 336 +h1900 ARCH_H1900 H1900 337 +gemini SA1100_GEMINI GEMINI 338 +axim ARCH_AXIM AXIM 339 +audiotron ARCH_AUDIOTRON AUDIOTRON 340 +h2200 ARCH_H2200 H2200 341 +loox600 ARCH_LOOX600 LOOX600 342 +niop ARCH_NIOP NIOP 343 +dm310 ARCH_DM310 DM310 344 +seedpxa_c2 ARCH_SEEDPXA_C2 SEEDPXA_C2 345 +ixp4xx_mguardpci ARCH_IXP4XX_MGUARD_PCI IXP4XX_MGUARD_PCI 346 +h1940 ARCH_H1940 H1940 347 +scorpio ARCH_SCORPIO SCORPIO 348 +viva ARCH_VIVA VIVA 349 +pxa_xcard ARCH_PXA_XCARD PXA_XCARD 350 +csb335 ARCH_CSB335 CSB335 351 +ixrd425 ARCH_IXRD425 IXRD425 352 +iq80315 ARCH_IQ80315 IQ80315 353 +nmp7312 ARCH_NMP7312 NMP7312 354 +cx861xx ARCH_CX861XX CX861XX 355 +enp2611 ARCH_ENP2611 ENP2611 356 +xda SA1100_XDA XDA 357 +csir_ims ARCH_CSIR_IMS CSIR_IMS 358 +ixp421_dnaeeth ARCH_IXP421_DNAEETH IXP421_DNAEETH 359 +pocketserv9200 ARCH_POCKETSERV9200 POCKETSERV9200 360 +toto ARCH_TOTO TOTO 361 +s3c2440 ARCH_S3C2440 S3C2440 362 +ks8695p ARCH_KS8695P KS8695P 363 +se4000 ARCH_SE4000 SE4000 364 +quadriceps ARCH_QUADRICEPS QUADRICEPS 365 +bronco ARCH_BRONCO BRONCO 366 +esl_wireless_tab ARCH_ESL_WIRELESS_TAB ESL_WIRELESS_TAB 367 +esl_sofcomp ARCH_ESL_SOFCOMP ESL_SOFCOMP 368 +s5c7375 ARCH_S5C7375 S5C7375 369 +spearhead ARCH_SPEARHEAD SPEARHEAD 370 +pantera ARCH_PANTERA PANTERA 371 +prayoglite ARCH_PRAYOGLITE PRAYOGLITE 372 +gumstix ARCH_GUMSTIX GUMSTIX 373 +rcube ARCH_RCUBE RCUBE 374 +rea_olv ARCH_REA_OLV REA_OLV 375 +pxa_iphone ARCH_PXA_IPHONE PXA_IPHONE 376 +s3c3410 ARCH_S3C3410 S3C3410 377 +espd_4510b ARCH_ESPD_4510B ESPD_4510B 378 +mp1x ARCH_MP1X MP1X 379 +at91rm9200tb ARCH_AT91RM9200TB AT91RM9200TB 380 +adsvgx ARCH_ADSVGX ADSVGX 381 +omap_h2 MACH_OMAP_H2 OMAP_H2 382 +pelee ARCH_PELEE PELEE 383 +e740 MACH_E740 E740 384 +iq80331 ARCH_IQ80331 IQ80331 385 +versatile_pb ARCH_VERSATILE_PB VERSATILE_PB 387 +kev7a400 MACH_KEV7A400 KEV7A400 388 +lpd7a400 MACH_LPD7A400 LPD7A400 389 +lpd7a404 MACH_LPD7A404 LPD7A404 390 +fujitsu_camelot ARCH_FUJITSU_CAMELOT FUJITSU_CAMELOT 391 +janus2m ARCH_JANUS2M JANUS2M 392 +embtf MACH_EMBTF EMBTF 393 +hpm MACH_HPM HPM 394 +smdk2410tk MACH_SMDK2410TK SMDK2410TK 395 +smdk2410aj MACH_SMDK2410AJ SMDK2410AJ 396 +streetracer MACH_STREETRACER STREETRACER 397 +eframe MACH_EFRAME EFRAME 398 +csb337 MACH_CSB337 CSB337 399 +pxa_lark MACH_PXA_LARK PXA_LARK 400 +pxa_pnp2110 MACH_PNP2110 PNP2110 401 +tcc72x MACH_TCC72X TCC72X 402 +altair MACH_ALTAIR ALTAIR 403 +kc3 MACH_KC3 KC3 404 +sinteftd MACH_SINTEFTD SINTEFTD 405 +mainstone MACH_MAINSTONE MAINSTONE 406 +aday4x MACH_ADAY4X ADAY4X 407 +lite300 MACH_LITE300 LITE300 408 +s5c7376 MACH_S5C7376 S5C7376 409 +mt02 MACH_MT02 MT02 410 +mport3s MACH_MPORT3S MPORT3S 411 +ra_alpha MACH_RA_ALPHA RA_ALPHA 412 +xcep MACH_XCEP XCEP 413 +arcom_vulcan MACH_ARCOM_VULCAN ARCOM_VULCAN 414 +stargate MACH_STARGATE STARGATE 415 +armadilloj MACH_ARMADILLOJ ARMADILLOJ 416 +elroy_jack MACH_ELROY_JACK ELROY_JACK 417 +backend MACH_BACKEND BACKEND 418 +s5linbox MACH_S5LINBOX S5LINBOX 419 +nomadik MACH_NOMADIK NOMADIK 420 +ia_cpu_9200 MACH_IA_CPU_9200 IA_CPU_9200 421 +at91_bja1 MACH_AT91_BJA1 AT91_BJA1 422 +corgi MACH_CORGI CORGI 423 +poodle MACH_POODLE POODLE 424 +ten MACH_TEN TEN 425 +roverp5p MACH_ROVERP5P ROVERP5P 426 +sc2700 MACH_SC2700 SC2700 427 +ex_eagle MACH_EX_EAGLE EX_EAGLE 428 +nx_pxa12 MACH_NX_PXA12 NX_PXA12 429 +nx_pxa5 MACH_NX_PXA5 NX_PXA5 430 +blackboard2 MACH_BLACKBOARD2 BLACKBOARD2 431 +i819 MACH_I819 I819 432 +ixmb995e MACH_IXMB995E IXMB995E 433 +skyrider MACH_SKYRIDER SKYRIDER 434 +skyhawk MACH_SKYHAWK SKYHAWK 435 +enterprise MACH_ENTERPRISE ENTERPRISE 436 +dep2410 MACH_DEP2410 DEP2410 437 +armcore MACH_ARMCORE ARMCORE 438 +hobbit MACH_HOBBIT HOBBIT 439 +h7210 MACH_H7210 H7210 440 +pxa_netdcu5 MACH_PXA_NETDCU5 PXA_NETDCU5 441 +acc MACH_ACC ACC 442 +esl_sarva MACH_ESL_SARVA ESL_SARVA 443 +xm250 MACH_XM250 XM250 444 +t6tc1xb MACH_T6TC1XB T6TC1XB 445 +ess710 MACH_ESS710 ESS710 446 +mx31ads MACH_MX31ADS MX31ADS 447 +himalaya MACH_HIMALAYA HIMALAYA 448 +bolfenk MACH_BOLFENK BOLFENK 449 +at91rm9200kr MACH_AT91RM9200KR AT91RM9200KR 450 +edb9312 MACH_EDB9312 EDB9312 451 +omap_generic MACH_OMAP_GENERIC OMAP_GENERIC 452 +aximx3 MACH_AXIMX3 AXIMX3 453 +eb67xdip MACH_EB67XDIP EB67XDIP 454 +webtxs MACH_WEBTXS WEBTXS 455 +hawk MACH_HAWK HAWK 456 +ccat91sbc001 MACH_CCAT91SBC001 CCAT91SBC001 457 +expresso MACH_EXPRESSO EXPRESSO 458 +h4000 MACH_H4000 H4000 459 +dino MACH_DINO DINO 460 +ml675k MACH_ML675K ML675K 461 +edb9301 MACH_EDB9301 EDB9301 462 +edb9315 MACH_EDB9315 EDB9315 463 +reciva_tt MACH_RECIVA_TT RECIVA_TT 464 +cstcb01 MACH_CSTCB01 CSTCB01 465 +cstcb1 MACH_CSTCB1 CSTCB1 466 +shadwell MACH_SHADWELL SHADWELL 467 +goepel263 MACH_GOEPEL263 GOEPEL263 468 +acq100 MACH_ACQ100 ACQ100 469 +mx1fs2 MACH_MX1FS2 MX1FS2 470 +hiptop_g1 MACH_HIPTOP_G1 HIPTOP_G1 471 +sparky MACH_SPARKY SPARKY 472 +ns9750 MACH_NS9750 NS9750 473 +phoenix MACH_PHOENIX PHOENIX 474 +vr1000 MACH_VR1000 VR1000 475 +deisterpxa MACH_DEISTERPXA DEISTERPXA 476 +bcm1160 MACH_BCM1160 BCM1160 477 +pcm022 MACH_PCM022 PCM022 478 +adsgcx MACH_ADSGCX ADSGCX 479 +dreadnaught MACH_DREADNAUGHT DREADNAUGHT 480 +dm320 MACH_DM320 DM320 481 +markov MACH_MARKOV MARKOV 482 +cos7a400 MACH_COS7A400 COS7A400 483 +milano MACH_MILANO MILANO 484 +ue9328 MACH_UE9328 UE9328 485 +uex255 MACH_UEX255 UEX255 486 +ue2410 MACH_UE2410 UE2410 487 +a620 MACH_A620 A620 488 +ocelot MACH_OCELOT OCELOT 489 +cheetah MACH_CHEETAH CHEETAH 490 +omap_perseus2 MACH_OMAP_PERSEUS2 OMAP_PERSEUS2 491 +zvue MACH_ZVUE ZVUE 492 +roverp1 MACH_ROVERP1 ROVERP1 493 +asidial2 MACH_ASIDIAL2 ASIDIAL2 494 +s3c24a0 MACH_S3C24A0 S3C24A0 495 +e800 MACH_E800 E800 496 +e750 MACH_E750 E750 497 +s3c5500 MACH_S3C5500 S3C5500 498 +smdk5500 MACH_SMDK5500 SMDK5500 499 +signalsync MACH_SIGNALSYNC SIGNALSYNC 500 +nbc MACH_NBC NBC 501 +kodiak MACH_KODIAK KODIAK 502 +netbookpro MACH_NETBOOKPRO NETBOOKPRO 503 +hw90200 MACH_HW90200 HW90200 504 +condor MACH_CONDOR CONDOR 505 +cup MACH_CUP CUP 506 +kite MACH_KITE KITE 507 +scb9328 MACH_SCB9328 SCB9328 508 +omap_h3 MACH_OMAP_H3 OMAP_H3 509 +omap_h4 MACH_OMAP_H4 OMAP_H4 510 +n10 MACH_N10 N10 511 +montejade MACH_MONTAJADE MONTAJADE 512 +sg560 MACH_SG560 SG560 513 +dp1000 MACH_DP1000 DP1000 514 +omap_osk MACH_OMAP_OSK OMAP_OSK 515 +rg100v3 MACH_RG100V3 RG100V3 516 +mx2ads MACH_MX2ADS MX2ADS 517 +pxa_kilo MACH_PXA_KILO PXA_KILO 518 +ixp4xx_eagle MACH_IXP4XX_EAGLE IXP4XX_EAGLE 519 +tosa MACH_TOSA TOSA 520 +mb2520f MACH_MB2520F MB2520F 521 +emc1000 MACH_EMC1000 EMC1000 522 +tidsc25 MACH_TIDSC25 TIDSC25 523 +akcpmxl MACH_AKCPMXL AKCPMXL 524 +av3xx MACH_AV3XX AV3XX 525 +avila MACH_AVILA AVILA 526 +pxa_mpm10 MACH_PXA_MPM10 PXA_MPM10 527 +pxa_kyanite MACH_PXA_KYANITE PXA_KYANITE 528 +sgold MACH_SGOLD SGOLD 529 +oscar MACH_OSCAR OSCAR 530 +epxa4usb2 MACH_EPXA4USB2 EPXA4USB2 531 +xsengine MACH_XSENGINE XSENGINE 532 +ip600 MACH_IP600 IP600 533 +mcan2 MACH_MCAN2 MCAN2 534 +ddi_blueridge MACH_DDI_BLUERIDGE DDI_BLUERIDGE 535 +skyminder MACH_SKYMINDER SKYMINDER 536 +lpd79520 MACH_LPD79520 LPD79520 537 +edb9302 MACH_EDB9302 EDB9302 538 +hw90340 MACH_HW90340 HW90340 539 +cip_box MACH_CIP_BOX CIP_BOX 540 +ivpn MACH_IVPN IVPN 541 +rsoc2 MACH_RSOC2 RSOC2 542 +husky MACH_HUSKY HUSKY 543 +boxer MACH_BOXER BOXER 544 +shepherd MACH_SHEPHERD SHEPHERD 545 +aml42800aa MACH_AML42800AA AML42800AA 546 +lpc2294 MACH_LPC2294 LPC2294 548 +switchgrass MACH_SWITCHGRASS SWITCHGRASS 549 +ens_cmu MACH_ENS_CMU ENS_CMU 550 +mm6_sdb MACH_MM6_SDB MM6_SDB 551 +saturn MACH_SATURN SATURN 552 +i30030evb MACH_I30030EVB I30030EVB 553 +mxc27530evb MACH_MXC27530EVB MXC27530EVB 554 +smdk2800 MACH_SMDK2800 SMDK2800 555 +mtwilson MACH_MTWILSON MTWILSON 556 +ziti MACH_ZITI ZITI 557 +grandfather MACH_GRANDFATHER GRANDFATHER 558 +tengine MACH_TENGINE TENGINE 559 +s3c2460 MACH_S3C2460 S3C2460 560 +pdm MACH_PDM PDM 561 +h4700 MACH_H4700 H4700 562 +h6300 MACH_H6300 H6300 563 +rz1700 MACH_RZ1700 RZ1700 564 +a716 MACH_A716 A716 565 +estk2440a MACH_ESTK2440A ESTK2440A 566 +atwixp425 MACH_ATWIXP425 ATWIXP425 567 +csb336 MACH_CSB336 CSB336 568 +rirm2 MACH_RIRM2 RIRM2 569 +cx23518 MACH_CX23518 CX23518 570 +cx2351x MACH_CX2351X CX2351X 571 +computime MACH_COMPUTIME COMPUTIME 572 +izarus MACH_IZARUS IZARUS 573 +pxa_rts MACH_RTS RTS 574 +se5100 MACH_SE5100 SE5100 575 +s3c2510 MACH_S3C2510 S3C2510 576 +csb437tl MACH_CSB437TL CSB437TL 577 +slauson MACH_SLAUSON SLAUSON 578 +pearlriver MACH_PEARLRIVER PEARLRIVER 579 +tdc_p210 MACH_TDC_P210 TDC_P210 580 +sg580 MACH_SG580 SG580 581 +wrsbcarm7 MACH_WRSBCARM7 WRSBCARM7 582 +ipd MACH_IPD IPD 583 +pxa_dnp2110 MACH_PXA_DNP2110 PXA_DNP2110 584 +xaeniax MACH_XAENIAX XAENIAX 585 +somn4250 MACH_SOMN4250 SOMN4250 586 +pleb2 MACH_PLEB2 PLEB2 587 +cornwallis MACH_CORNWALLIS CORNWALLIS 588 +gurney_drv MACH_GURNEY_DRV GURNEY_DRV 589 +chaffee MACH_CHAFFEE CHAFFEE 590 +rms101 MACH_RMS101 RMS101 591 +rx3715 MACH_RX3715 RX3715 592 +swift MACH_SWIFT SWIFT 593 +roverp7 MACH_ROVERP7 ROVERP7 594 +pr818s MACH_PR818S PR818S 595 +trxpro MACH_TRXPRO TRXPRO 596 +nslu2 MACH_NSLU2 NSLU2 597 +e400 MACH_E400 E400 598 +trab MACH_TRAB TRAB 599 +cmc_pu2 MACH_CMC_PU2 CMC_PU2 600 +fulcrum MACH_FULCRUM FULCRUM 601 +netgate42x MACH_NETGATE42X NETGATE42X 602 +str710 MACH_STR710 STR710 603 +ixdpg425 MACH_IXDPG425 IXDPG425 604 +tomtomgo MACH_TOMTOMGO TOMTOMGO 605 +versatile_ab MACH_VERSATILE_AB VERSATILE_AB 606 +edb9307 MACH_EDB9307 EDB9307 607 +sg565 MACH_SG565 SG565 608 +lpd79524 MACH_LPD79524 LPD79524 609 +lpd79525 MACH_LPD79525 LPD79525 610 +rms100 MACH_RMS100 RMS100 611 +kb9200 MACH_KB9200 KB9200 612 +sx1 MACH_SX1 SX1 613 +hms39c7092 MACH_HMS39C7092 HMS39C7092 614 +armadillo MACH_ARMADILLO ARMADILLO 615 +ipcu MACH_IPCU IPCU 616 +loox720 MACH_LOOX720 LOOX720 617 +ixdp465 MACH_IXDP465 IXDP465 618 +ixdp2351 MACH_IXDP2351 IXDP2351 619 +adsvix MACH_ADSVIX ADSVIX 620 +dm270 MACH_DM270 DM270 621 +socltplus MACH_SOCLTPLUS SOCLTPLUS 622 +ecia MACH_ECIA ECIA 623 +cm4008 MACH_CM4008 CM4008 624 +p2001 MACH_P2001 P2001 625 +twister MACH_TWISTER TWISTER 626 +mudshark MACH_MUDSHARK MUDSHARK 627 +hb2 MACH_HB2 HB2 628 +iq80332 MACH_IQ80332 IQ80332 629 +sendt MACH_SENDT SENDT 630 +mx2jazz MACH_MX2JAZZ MX2JAZZ 631 +multiio MACH_MULTIIO MULTIIO 632 +hrdisplay MACH_HRDISPLAY HRDISPLAY 633 +mxc27530ads MACH_MXC27530ADS MXC27530ADS 634 +trizeps3 MACH_TRIZEPS3 TRIZEPS3 635 +zefeerdza MACH_ZEFEERDZA ZEFEERDZA 636 +zefeerdzb MACH_ZEFEERDZB ZEFEERDZB 637 +zefeerdzg MACH_ZEFEERDZG ZEFEERDZG 638 +zefeerdzn MACH_ZEFEERDZN ZEFEERDZN 639 +zefeerdzq MACH_ZEFEERDZQ ZEFEERDZQ 640 +gtwx5715 MACH_GTWX5715 GTWX5715 641 +astro_jack MACH_ASTRO_JACK ASTRO_JACK 643 +tip03 MACH_TIP03 TIP03 644 +a9200ec MACH_A9200EC A9200EC 645 +pnx0105 MACH_PNX0105 PNX0105 646 +adcpoecpu MACH_ADCPOECPU ADCPOECPU 647 +csb637 MACH_CSB637 CSB637 648 +mb9200 MACH_MB9200 MB9200 650 +kulun MACH_KULUN KULUN 651 +snapper MACH_SNAPPER SNAPPER 652 +optima MACH_OPTIMA OPTIMA 653 +dlhsbc MACH_DLHSBC DLHSBC 654 +x30 MACH_X30 X30 655 +n30 MACH_N30 N30 656 +manga_ks8695 MACH_MANGA_KS8695 MANGA_KS8695 657 +ajax MACH_AJAX AJAX 658 +nec_mp900 MACH_NEC_MP900 NEC_MP900 659 +vvtk1000 MACH_VVTK1000 VVTK1000 661 +kafa MACH_KAFA KAFA 662 +vvtk3000 MACH_VVTK3000 VVTK3000 663 +pimx1 MACH_PIMX1 PIMX1 664 +ollie MACH_OLLIE OLLIE 665 +skymax MACH_SKYMAX SKYMAX 666 +jazz MACH_JAZZ JAZZ 667 +tel_t3 MACH_TEL_T3 TEL_T3 668 +aisino_fcr255 MACH_AISINO_FCR255 AISINO_FCR255 669 +btweb MACH_BTWEB BTWEB 670 +dbg_lh79520 MACH_DBG_LH79520 DBG_LH79520 671 +cm41xx MACH_CM41XX CM41XX 672 +ts72xx MACH_TS72XX TS72XX 673 +nggpxa MACH_NGGPXA NGGPXA 674 +csb535 MACH_CSB535 CSB535 675 +csb536 MACH_CSB536 CSB536 676 +pxa_trakpod MACH_PXA_TRAKPOD PXA_TRAKPOD 677 +praxis MACH_PRAXIS PRAXIS 678 +lh75411 MACH_LH75411 LH75411 679 +otom MACH_OTOM OTOM 680 +nexcoder_2440 MACH_NEXCODER_2440 NEXCODER_2440 681 +loox410 MACH_LOOX410 LOOX410 682 +westlake MACH_WESTLAKE WESTLAKE 683 +nsb MACH_NSB NSB 684 +esl_sarva_stn MACH_ESL_SARVA_STN ESL_SARVA_STN 685 +esl_sarva_tft MACH_ESL_SARVA_TFT ESL_SARVA_TFT 686 +esl_sarva_iad MACH_ESL_SARVA_IAD ESL_SARVA_IAD 687 +esl_sarva_acc MACH_ESL_SARVA_ACC ESL_SARVA_ACC 688 +typhoon MACH_TYPHOON TYPHOON 689 +cnav MACH_CNAV CNAV 690 +a730 MACH_A730 A730 691 +netstar MACH_NETSTAR NETSTAR 692 +supercon MACH_PHASEFALE_SUPERCON PHASEFALE_SUPERCON 693 +shiva1100 MACH_SHIVA1100 SHIVA1100 694 +etexsc MACH_ETEXSC ETEXSC 695 +ixdpg465 MACH_IXDPG465 IXDPG465 696 +a9m2410 MACH_A9M2410 A9M2410 697 +a9m2440 MACH_A9M2440 A9M2440 698 +a9m9750 MACH_A9M9750 A9M9750 699 +a9m9360 MACH_A9M9360 A9M9360 700 +unc90 MACH_UNC90 UNC90 701 +eco920 MACH_ECO920 ECO920 702 +satview MACH_SATVIEW SATVIEW 703 +roadrunner MACH_ROADRUNNER ROADRUNNER 704 +at91rm9200ek MACH_AT91RM9200EK AT91RM9200EK 705 +gp32 MACH_GP32 GP32 706 +gem MACH_GEM GEM 707 +i858 MACH_I858 I858 708 +hx2750 MACH_HX2750 HX2750 709 +mxc91131evb MACH_MXC91131EVB MXC91131EVB 710 +p700 MACH_P700 P700 711 +cpe MACH_CPE CPE 712 +spitz MACH_SPITZ SPITZ 713 +nimbra340 MACH_NIMBRA340 NIMBRA340 714 +lpc22xx MACH_LPC22XX LPC22XX 715 +omap_comet3 MACH_COMET3 COMET3 716 +omap_comet4 MACH_COMET4 COMET4 717 +csb625 MACH_CSB625 CSB625 718 +fortunet2 MACH_FORTUNET2 FORTUNET2 719 +s5h2200 MACH_S5H2200 S5H2200 720 +optorm920 MACH_OPTORM920 OPTORM920 721 +adsbitsyxb MACH_ADSBITSYXB ADSBITSYXB 722 +adssphere MACH_ADSSPHERE ADSSPHERE 723 +adsportal MACH_ADSPORTAL ADSPORTAL 724 +ln2410sbc MACH_LN2410SBC LN2410SBC 725 +cb3rufc MACH_CB3RUFC CB3RUFC 726 +mp2usb MACH_MP2USB MP2USB 727 +ntnp425c MACH_NTNP425C NTNP425C 728 +colibri MACH_COLIBRI COLIBRI 729 +pcm7220 MACH_PCM7220 PCM7220 730 +gateway7001 MACH_GATEWAY7001 GATEWAY7001 731 +pcm027 MACH_PCM027 PCM027 732 +cmpxa MACH_CMPXA CMPXA 733 +anubis MACH_ANUBIS ANUBIS 734 +ite8152 MACH_ITE8152 ITE8152 735 +lpc3xxx MACH_LPC3XXX LPC3XXX 736 +puppeteer MACH_PUPPETEER PUPPETEER 737 +e570 MACH_E570 E570 739 +x50 MACH_X50 X50 740 +recon MACH_RECON RECON 741 +xboardgp8 MACH_XBOARDGP8 XBOARDGP8 742 +fpic2 MACH_FPIC2 FPIC2 743 +akita MACH_AKITA AKITA 744 +a81 MACH_A81 A81 745 +svm_sc25x MACH_SVM_SC25X SVM_SC25X 746 +vt020 MACH_VADATECH020 VADATECH020 747 +tli MACH_TLI TLI 748 +edb9315lc MACH_EDB9315LC EDB9315LC 749 +passec MACH_PASSEC PASSEC 750 +ds_tiger MACH_DS_TIGER DS_TIGER 751 +e310 MACH_E310 E310 752 +e330 MACH_E330 E330 753 +rt3000 MACH_RT3000 RT3000 754 +nokia770 MACH_NOKIA770 NOKIA770 755 +pnx0106 MACH_PNX0106 PNX0106 756 +hx21xx MACH_HX21XX HX21XX 757 +faraday MACH_FARADAY FARADAY 758 +sbc9312 MACH_SBC9312 SBC9312 759 +batman MACH_BATMAN BATMAN 760 +jpd201 MACH_JPD201 JPD201 761 +mipsa MACH_MIPSA MIPSA 762 +kacom MACH_KACOM KACOM 763 +swarcocpu MACH_SWARCOCPU SWARCOCPU 764 +swarcodsl MACH_SWARCODSL SWARCODSL 765 +blueangel MACH_BLUEANGEL BLUEANGEL 766 +hairygrama MACH_HAIRYGRAMA HAIRYGRAMA 767 +banff MACH_BANFF BANFF 768 +carmeva MACH_CARMEVA CARMEVA 769 +sam255 MACH_SAM255 SAM255 770 +ppm10 MACH_PPM10 PPM10 771 +edb9315a MACH_EDB9315A EDB9315A 772 +sunset MACH_SUNSET SUNSET 773 +stargate2 MACH_STARGATE2 STARGATE2 774 +intelmote2 MACH_INTELMOTE2 INTELMOTE2 775 +trizeps4 MACH_TRIZEPS4 TRIZEPS4 776 +mainstone2 MACH_MAINSTONE2 MAINSTONE2 777 +ez_ixp42x MACH_EZ_IXP42X EZ_IXP42X 778 +tapwave_zodiac MACH_TAPWAVE_ZODIAC TAPWAVE_ZODIAC 779 +universalmeter MACH_UNIVERSALMETER UNIVERSALMETER 780 +hicoarm9 MACH_HICOARM9 HICOARM9 781 +pnx4008 MACH_PNX4008 PNX4008 782 +kws6000 MACH_KWS6000 KWS6000 783 +portux920t MACH_PORTUX920T PORTUX920T 784 +ez_x5 MACH_EZ_X5 EZ_X5 785 +omap_rudolph MACH_OMAP_RUDOLPH OMAP_RUDOLPH 786 +cpuat91 MACH_CPUAT91 CPUAT91 787 +rea9200 MACH_REA9200 REA9200 788 +acts_pune_sa1110 MACH_ACTS_PUNE_SA1110 ACTS_PUNE_SA1110 789 +ixp425 MACH_IXP425 IXP425 790 +i30030ads MACH_I30030ADS I30030ADS 791 +perch MACH_PERCH PERCH 792 +eis05r1 MACH_EIS05R1 EIS05R1 793 +pepperpad MACH_PEPPERPAD PEPPERPAD 794 +sb3010 MACH_SB3010 SB3010 795 +rm9200 MACH_RM9200 RM9200 796 +dma03 MACH_DMA03 DMA03 797 +road_s101 MACH_ROAD_S101 ROAD_S101 798 +iq81340sc MACH_IQ81340SC IQ81340SC 799 +iq_nextgen_b MACH_IQ_NEXTGEN_B IQ_NEXTGEN_B 800 +iq81340mc MACH_IQ81340MC IQ81340MC 801 +iq_nextgen_d MACH_IQ_NEXTGEN_D IQ_NEXTGEN_D 802 +iq_nextgen_e MACH_IQ_NEXTGEN_E IQ_NEXTGEN_E 803 +mallow_at91 MACH_MALLOW_AT91 MALLOW_AT91 804 +cybertracker_i MACH_CYBERTRACKER_I CYBERTRACKER_I 805 +gesbc931x MACH_GESBC931X GESBC931X 806 +centipad MACH_CENTIPAD CENTIPAD 807 +armsoc MACH_ARMSOC ARMSOC 808 +se4200 MACH_SE4200 SE4200 809 +ems197a MACH_EMS197A EMS197A 810 +micro9 MACH_MICRO9 MICRO9 811 +micro9l MACH_MICRO9L MICRO9L 812 +uc5471dsp MACH_UC5471DSP UC5471DSP 813 +sj5471eng MACH_SJ5471ENG SJ5471ENG 814 +none MACH_CMPXA26X CMPXA26X 815 +nc1 MACH_NC NC 816 +omap_palmte MACH_OMAP_PALMTE OMAP_PALMTE 817 +ajax52x MACH_AJAX52X AJAX52X 818 +siriustar MACH_SIRIUSTAR SIRIUSTAR 819 +iodata_hdlg MACH_IODATA_HDLG IODATA_HDLG 820 +at91rm9200utl MACH_AT91RM9200UTL AT91RM9200UTL 821 +biosafe MACH_BIOSAFE BIOSAFE 822 +mp1000 MACH_MP1000 MP1000 823 +parsy MACH_PARSY PARSY 824 +ccxp270 MACH_CCXP CCXP 825 +omap_gsample MACH_OMAP_GSAMPLE OMAP_GSAMPLE 826 +realview_eb MACH_REALVIEW_EB REALVIEW_EB 827 +samoa MACH_SAMOA SAMOA 828 +palmt3 MACH_PALMT3 PALMT3 829 +i878 MACH_I878 I878 830 +borzoi MACH_BORZOI BORZOI 831 +gecko MACH_GECKO GECKO 832 +ds101 MACH_DS101 DS101 833 +omap_palmtt2 MACH_OMAP_PALMTT2 OMAP_PALMTT2 834 +palmld MACH_PALMLD PALMLD 835 +cc9c MACH_CC9C CC9C 836 +sbc1670 MACH_SBC1670 SBC1670 837 +ixdp28x5 MACH_IXDP28X5 IXDP28X5 838 +omap_palmtt MACH_OMAP_PALMTT OMAP_PALMTT 839 +ml696k MACH_ML696K ML696K 840 +arcom_zeus MACH_ARCOM_ZEUS ARCOM_ZEUS 841 +osiris MACH_OSIRIS OSIRIS 842 +maestro MACH_MAESTRO MAESTRO 843 +palmte2 MACH_PALMTE2 PALMTE2 844 +ixbbm MACH_IXBBM IXBBM 845 +mx27ads MACH_MX27ADS MX27ADS 846 +ax8004 MACH_AX8004 AX8004 847 +at91sam9261ek MACH_AT91SAM9261EK AT91SAM9261EK 848 +loft MACH_LOFT LOFT 849 +magpie MACH_MAGPIE MAGPIE 850 +mx21ads MACH_MX21ADS MX21ADS 851 +mb87m3400 MACH_MB87M3400 MB87M3400 852 +mguard_delta MACH_MGUARD_DELTA MGUARD_DELTA 853 +davinci_dvdp MACH_DAVINCI_DVDP DAVINCI_DVDP 854 +htcuniversal MACH_HTCUNIVERSAL HTCUNIVERSAL 855 +tpad MACH_TPAD TPAD 856 +roverp3 MACH_ROVERP3 ROVERP3 857 +jornada928 MACH_JORNADA928 JORNADA928 858 +mv88fxx81 MACH_MV88FXX81 MV88FXX81 859 +stmp36xx MACH_STMP36XX STMP36XX 860 +sxni79524 MACH_SXNI79524 SXNI79524 861 +ams_delta MACH_AMS_DELTA AMS_DELTA 862 +uranium MACH_URANIUM URANIUM 863 +ucon MACH_UCON UCON 864 +nas100d MACH_NAS100D NAS100D 865 +l083 MACH_L083_1000 L083_1000 866 +ezx MACH_EZX EZX 867 +pnx5220 MACH_PNX5220 PNX5220 868 +butte MACH_BUTTE BUTTE 869 +srm2 MACH_SRM2 SRM2 870 +dsbr MACH_DSBR DSBR 871 +crystalball MACH_CRYSTALBALL CRYSTALBALL 872 +tinypxa27x MACH_TINYPXA27X TINYPXA27X 873 +herbie MACH_HERBIE HERBIE 874 +magician MACH_MAGICIAN MAGICIAN 875 +cm4002 MACH_CM4002 CM4002 876 +b4 MACH_B4 B4 877 +maui MACH_MAUI MAUI 878 +cybertracker_g MACH_CYBERTRACKER_G CYBERTRACKER_G 879 +nxdkn MACH_NXDKN NXDKN 880 +mio8390 MACH_MIO8390 MIO8390 881 +omi_board MACH_OMI_BOARD OMI_BOARD 882 +mx21civ MACH_MX21CIV MX21CIV 883 +mahi_cdac MACH_MAHI_CDAC MAHI_CDAC 884 +palmtx MACH_PALMTX PALMTX 885 +s3c2413 MACH_S3C2413 S3C2413 887 +samsys_ep0 MACH_SAMSYS_EP0 SAMSYS_EP0 888 +wg302v1 MACH_WG302V1 WG302V1 889 +wg302v2 MACH_WG302V2 WG302V2 890 +eb42x MACH_EB42X EB42X 891 +iq331es MACH_IQ331ES IQ331ES 892 +cosydsp MACH_COSYDSP COSYDSP 893 +uplat7d_proto MACH_UPLAT7D UPLAT7D 894 +ptdavinci MACH_PTDAVINCI PTDAVINCI 895 +mbus MACH_MBUS MBUS 896 +nadia2vb MACH_NADIA2VB NADIA2VB 897 +r1000 MACH_R1000 R1000 898 +hw90250 MACH_HW90250 HW90250 899 +omap_2430sdp MACH_OMAP_2430SDP OMAP_2430SDP 900 +davinci_evm MACH_DAVINCI_EVM DAVINCI_EVM 901 +omap_tornado MACH_OMAP_TORNADO OMAP_TORNADO 902 +olocreek MACH_OLOCREEK OLOCREEK 903 +palmz72 MACH_PALMZ72 PALMZ72 904 +nxdb500 MACH_NXDB500 NXDB500 905 +apf9328 MACH_APF9328 APF9328 906 +omap_wipoq MACH_OMAP_WIPOQ OMAP_WIPOQ 907 +omap_twip MACH_OMAP_TWIP OMAP_TWIP 908 +treo650 MACH_TREO650 TREO650 909 +acumen MACH_ACUMEN ACUMEN 910 +xp100 MACH_XP100 XP100 911 +fs2410 MACH_FS2410 FS2410 912 +pxa270_cerf MACH_PXA270_CERF PXA270_CERF 913 +sq2ftlpalm MACH_SQ2FTLPALM SQ2FTLPALM 914 +bsemserver MACH_BSEMSERVER BSEMSERVER 915 +netclient MACH_NETCLIENT NETCLIENT 916 +palmt5 MACH_PALMT5 PALMT5 917 +palmtc MACH_PALMTC PALMTC 918 +omap_apollon MACH_OMAP_APOLLON OMAP_APOLLON 919 +mxc30030evb MACH_MXC30030EVB MXC30030EVB 920 +rea_cpu2 MACH_REA_2D REA_2D 921 +eti3e524 MACH_TI3E524 TI3E524 922 +ateb9200 MACH_ATEB9200 ATEB9200 923 +auckland MACH_AUCKLAND AUCKLAND 924 +ak3220m MACH_AK3320M AK3320M 925 +duramax MACH_DURAMAX DURAMAX 926 +n35 MACH_N35 N35 927 +pronghorn MACH_PRONGHORN PRONGHORN 928 +fundy MACH_FUNDY FUNDY 929 +logicpd_pxa270 MACH_LOGICPD_PXA270 LOGICPD_PXA270 930 +cpu777 MACH_CPU777 CPU777 931 +simicon9201 MACH_SIMICON9201 SIMICON9201 932 +leap2_hpm MACH_LEAP2_HPM LEAP2_HPM 933 +cm922txa10 MACH_CM922TXA10 CM922TXA10 934 +sandgate MACH_PXA PXA 935 +sandgate2 MACH_SANDGATE2 SANDGATE2 936 +sandgate2g MACH_SANDGATE2G SANDGATE2G 937 +sandgate2p MACH_SANDGATE2P SANDGATE2P 938 +fred_jack MACH_FRED_JACK FRED_JACK 939 +ttg_color1 MACH_TTG_COLOR1 TTG_COLOR1 940 +nxeb500hmi MACH_NXEB500HMI NXEB500HMI 941 +netdcu8 MACH_NETDCU8 NETDCU8 942 +ng_fvx538 MACH_NG_FVX538 NG_FVX538 944 +ng_fvs338 MACH_NG_FVS338 NG_FVS338 945 +pnx4103 MACH_PNX4103 PNX4103 946 +hesdb MACH_HESDB HESDB 947 +xsilo MACH_XSILO XSILO 948 +espresso MACH_ESPRESSO ESPRESSO 949 +emlc MACH_EMLC EMLC 950 +sisteron MACH_SISTERON SISTERON 951 +rx1950 MACH_RX1950 RX1950 952 +tsc_venus MACH_TSC_VENUS TSC_VENUS 953 +ds101j MACH_DS101J DS101J 954 +mxc30030ads MACH_MXC30030ADS MXC30030ADS 955 +fujitsu_wimaxsoc MACH_FUJITSU_WIMAXSOC FUJITSU_WIMAXSOC 956 +dualpcmodem MACH_DUALPCMODEM DUALPCMODEM 957 +gesbc9312 MACH_GESBC9312 GESBC9312 958 +htcapache MACH_HTCAPACHE HTCAPACHE 959 +ixdp435 MACH_IXDP435 IXDP435 960 +catprovt100 MACH_CATPROVT100 CATPROVT100 961 +picotux1xx MACH_PICOTUX1XX PICOTUX1XX 962 +picotux2xx MACH_PICOTUX2XX PICOTUX2XX 963 +dsmg600 MACH_DSMG600 DSMG600 964 +empc2 MACH_EMPC2 EMPC2 965 +ventura MACH_VENTURA VENTURA 966 +phidget_sbc MACH_PHIDGET_SBC PHIDGET_SBC 967 +ij3k MACH_IJ3K IJ3K 968 +pisgah MACH_PISGAH PISGAH 969 +omap_fsample MACH_OMAP_FSAMPLE OMAP_FSAMPLE 970 +sg720 MACH_SG720 SG720 971 +redfox MACH_REDFOX REDFOX 972 +mysh_ep9315_1 MACH_MYSH_EP9315_1 MYSH_EP9315_1 973 +tpf106 MACH_TPF106 TPF106 974 +at91rm9200kg MACH_AT91RM9200KG AT91RM9200KG 975 +rcmt2 MACH_SLEDB SLEDB 976 +ontrack MACH_ONTRACK ONTRACK 977 +pm1200 MACH_PM1200 PM1200 978 +ess24562 MACH_ESS24XXX ESS24XXX 979 +coremp7 MACH_COREMP7 COREMP7 980 +nexcoder_6446 MACH_NEXCODER_6446 NEXCODER_6446 981 +stvc8380 MACH_STVC8380 STVC8380 982 +teklynx MACH_TEKLYNX TEKLYNX 983 +carbonado MACH_CARBONADO CARBONADO 984 +sysmos_mp730 MACH_SYSMOS_MP730 SYSMOS_MP730 985 +snapper_cl15 MACH_SNAPPER_CL15 SNAPPER_CL15 986 +pgigim MACH_PGIGIM PGIGIM 987 +ptx9160p2 MACH_PTX9160P2 PTX9160P2 988 +dcore1 MACH_DCORE1 DCORE1 989 +victorpxa MACH_VICTORPXA VICTORPXA 990 +mx2dtb MACH_MX2DTB MX2DTB 991 +pxa_irex_er0100 MACH_PXA_IREX_ER0100 PXA_IREX_ER0100 992 +omap_palmz71 MACH_OMAP_PALMZ71 OMAP_PALMZ71 993 +bartec_deg MACH_BARTEC_DEG BARTEC_DEG 994 +hw50251 MACH_HW50251 HW50251 995 +ibox MACH_IBOX IBOX 996 +atlaslh7a404 MACH_ATLASLH7A404 ATLASLH7A404 997 +pt2026 MACH_PT2026 PT2026 998 +htcalpine MACH_HTCALPINE HTCALPINE 999 +bartec_vtu MACH_BARTEC_VTU BARTEC_VTU 1000 +vcoreii MACH_VCOREII VCOREII 1001 +pdnb3 MACH_PDNB3 PDNB3 1002 +htcbeetles MACH_HTCBEETLES HTCBEETLES 1003 +s3c6400 MACH_S3C6400 S3C6400 1004 +s3c2443 MACH_S3C2443 S3C2443 1005 +omap_ldk MACH_OMAP_LDK OMAP_LDK 1006 +smdk2460 MACH_SMDK2460 SMDK2460 1007 +smdk2440 MACH_SMDK2440 SMDK2440 1008 +smdk2412 MACH_SMDK2412 SMDK2412 1009 +webbox MACH_WEBBOX WEBBOX 1010 +cwwndp MACH_CWWNDP CWWNDP 1011 +i839 MACH_DRAGON DRAGON 1012 +opendo_cpu_board MACH_OPENDO_CPU_BOARD OPENDO_CPU_BOARD 1013 +ccm2200 MACH_CCM2200 CCM2200 1014 +etwarm MACH_ETWARM ETWARM 1015 +m93030 MACH_M93030 M93030 1016 +cc7u MACH_CC7U CC7U 1017 +mtt_ranger MACH_MTT_RANGER MTT_RANGER 1018 +nexus MACH_NEXUS NEXUS 1019 +desman MACH_DESMAN DESMAN 1020 +bkde303 MACH_BKDE303 BKDE303 1021 +smdk2413 MACH_SMDK2413 SMDK2413 1022 +aml_m7200 MACH_AML_M7200 AML_M7200 1023 +aml_m5900 MACH_AML_M5900 AML_M5900 1024 +sg640 MACH_SG640 SG640 1025 +edg79524 MACH_EDG79524 EDG79524 1026 +ai2410 MACH_AI2410 AI2410 1027 +ixp465 MACH_IXP465 IXP465 1028 +balloon3 MACH_BALLOON3 BALLOON3 1029 +heins MACH_HEINS HEINS 1030 +mpluseva MACH_MPLUSEVA MPLUSEVA 1031 +rt042 MACH_RT042 RT042 1032 +cwiem MACH_CWIEM CWIEM 1033 +cm_x270 MACH_CM_X270 CM_X270 1034 +cm_x255 MACH_CM_X255 CM_X255 1035 +esh_at91 MACH_ESH_AT91 ESH_AT91 1036 +sandgate3 MACH_SANDGATE3 SANDGATE3 1037 +primo MACH_PRIMO PRIMO 1038 +gemstone MACH_GEMSTONE GEMSTONE 1039 +pronghorn_metro MACH_PRONGHORNMETRO PRONGHORNMETRO 1040 +sidewinder MACH_SIDEWINDER SIDEWINDER 1041 +picomod1 MACH_PICOMOD1 PICOMOD1 1042 +sg590 MACH_SG590 SG590 1043 +akai9307 MACH_AKAI9307 AKAI9307 1044 +fontaine MACH_FONTAINE FONTAINE 1045 +wombat MACH_WOMBAT WOMBAT 1046 +acq300 MACH_ACQ300 ACQ300 1047 +mod272 MACH_MOD_270 MOD_270 1048 +vmc_vc0820 MACH_VC0820 VC0820 1049 +ani_aim MACH_ANI_AIM ANI_AIM 1050 +jellyfish MACH_JELLYFISH JELLYFISH 1051 +amanita MACH_AMANITA AMANITA 1052 +vlink MACH_VLINK VLINK 1053 +dexflex MACH_DEXFLEX DEXFLEX 1054 +eigen_ttq MACH_EIGEN_TTQ EIGEN_TTQ 1055 +arcom_titan MACH_ARCOM_TITAN ARCOM_TITAN 1056 +tabla MACH_TABLA TABLA 1057 +mdirac3 MACH_MDIRAC3 MDIRAC3 1058 +mrhfbp2 MACH_MRHFBP2 MRHFBP2 1059 +at91rm9200rb MACH_AT91RM9200RB AT91RM9200RB 1060 +ani_apm MACH_ANI_APM ANI_APM 1061 +ella1 MACH_ELLA1 ELLA1 1062 +inhand_pxa27x MACH_INHAND_PXA27X INHAND_PXA27X 1063 +inhand_pxa25x MACH_INHAND_PXA25X INHAND_PXA25X 1064 +empos_xm MACH_EMPOS_XM EMPOS_XM 1065 +empos MACH_EMPOS EMPOS 1066 +empos_tiny MACH_EMPOS_TINY EMPOS_TINY 1067 +empos_sm MACH_EMPOS_SM EMPOS_SM 1068 +egret MACH_EGRET EGRET 1069 +ostrich MACH_OSTRICH OSTRICH 1070 +n50 MACH_N50 N50 1071 +ecbat91 MACH_ECBAT91 ECBAT91 1072 +stareast MACH_STAREAST STAREAST 1073 +dspg_dw MACH_DSPG_DW DSPG_DW 1074 +onearm MACH_ONEARM ONEARM 1075 +mrg110_6 MACH_MRG110_6 MRG110_6 1076 +wrt300nv2 MACH_WRT300NV2 WRT300NV2 1077 +xm_bulverde MACH_XM_BULVERDE XM_BULVERDE 1078 +msm6100 MACH_MSM6100 MSM6100 1079 +eti_b1 MACH_ETI_B1 ETI_B1 1080 +za9l_series MACH_ZILOG_ZA9L ZILOG_ZA9L 1081 +bit2440 MACH_BIT2440 BIT2440 1082 +nbi MACH_NBI NBI 1083 +smdk2443 MACH_SMDK2443 SMDK2443 1084 +vdavinci MACH_VDAVINCI VDAVINCI 1085 +atc6 MACH_ATC6 ATC6 1086 +multmdw MACH_MULTMDW MULTMDW 1087 +mba2440 MACH_MBA2440 MBA2440 1088 +ecsd MACH_ECSD ECSD 1089 +palmz31 MACH_PALMZ31 PALMZ31 1090 +fsg MACH_FSG FSG 1091 +razor101 MACH_RAZOR101 RAZOR101 1092 +opera_tdm MACH_OPERA_TDM OPERA_TDM 1093 +comcerto MACH_COMCERTO COMCERTO 1094 +tb0319 MACH_TB0319 TB0319 1095 +kws8000 MACH_KWS8000 KWS8000 1096 +b2 MACH_B2 B2 1097 +lcl54 MACH_LCL54 LCL54 1098 +at91sam9260ek MACH_AT91SAM9260EK AT91SAM9260EK 1099 +glantank MACH_GLANTANK GLANTANK 1100 +n2100 MACH_N2100 N2100 1101 +n4100 MACH_N4100 N4100 1102 +rsc4 MACH_VERTICAL_RSC4 VERTICAL_RSC4 1103 +sg8100 MACH_SG8100 SG8100 1104 +im42xx MACH_IM42XX IM42XX 1105 +ftxx MACH_FTXX FTXX 1106 +lwfusion MACH_LWFUSION LWFUSION 1107 +qt2410 MACH_QT2410 QT2410 1108 +kixrp435 MACH_KIXRP435 KIXRP435 1109 +ccw9c MACH_CCW9C CCW9C 1110 +dabhs MACH_DABHS DABHS 1111 +gzmx MACH_GZMX GZMX 1112 +ipnw100ap MACH_IPNW100AP IPNW100AP 1113 +cc9p9360dev MACH_CC9P9360DEV CC9P9360DEV 1114 +cc9p9750dev MACH_CC9P9750DEV CC9P9750DEV 1115 +cc9p9360val MACH_CC9P9360VAL CC9P9360VAL 1116 +cc9p9750val MACH_CC9P9750VAL CC9P9750VAL 1117 +nx70v MACH_NX70V NX70V 1118 +at91rm9200df MACH_AT91RM9200DF AT91RM9200DF 1119 +se_pilot2 MACH_SE_PILOT2 SE_PILOT2 1120 +mtcn_t800 MACH_MTCN_T800 MTCN_T800 1121 +vcmx212 MACH_VCMX212 VCMX212 1122 +lynx MACH_LYNX LYNX 1123 +at91sam9260id MACH_AT91SAM9260ID AT91SAM9260ID 1124 +hw86052 MACH_HW86052 HW86052 1125 +pilz_pmi3 MACH_PILZ_PMI3 PILZ_PMI3 1126 +edb9302a MACH_EDB9302A EDB9302A 1127 +edb9307a MACH_EDB9307A EDB9307A 1128 +ct_dfs MACH_CT_DFS CT_DFS 1129 +pilz_pmi4 MACH_PILZ_PMI4 PILZ_PMI4 1130 +xceednp_ixp MACH_XCEEDNP_IXP XCEEDNP_IXP 1131 +smdk2442b MACH_SMDK2442B SMDK2442B 1132 +xnode MACH_XNODE XNODE 1133 +aidx270 MACH_AIDX270 AIDX270 1134 +rema MACH_REMA REMA 1135 +bps1000 MACH_BPS1000 BPS1000 1136 +hw90350 MACH_HW90350 HW90350 1137 +omap_3430sdp MACH_OMAP_3430SDP OMAP_3430SDP 1138 +bluetouch MACH_BLUETOUCH BLUETOUCH 1139 +vstms MACH_VSTMS VSTMS 1140 +xsbase270 MACH_XSBASE270 XSBASE270 1141 +at91sam9260ek_cn MACH_AT91SAM9260EK_CN AT91SAM9260EK_CN 1142 +adsturboxb MACH_ADSTURBOXB ADSTURBOXB 1143 +oti4110 MACH_OTI4110 OTI4110 1144 +hme_pxa MACH_HME_PXA HME_PXA 1145 +deisterdca MACH_DEISTERDCA DEISTERDCA 1146 +ces_ssem2 MACH_CES_SSEM2 CES_SSEM2 1147 +ces_mtr MACH_CES_MTR CES_MTR 1148 +tds_avng_sbc MACH_TDS_AVNG_SBC TDS_AVNG_SBC 1149 +everest MACH_EVEREST EVEREST 1150 +pnx4010 MACH_PNX4010 PNX4010 1151 +oxnas MACH_OXNAS OXNAS 1152 +fiori MACH_FIORI FIORI 1153 +ml1200 MACH_ML1200 ML1200 1154 +pecos MACH_PECOS PECOS 1155 +nb2xxx MACH_NB2XXX NB2XXX 1156 +hw6900 MACH_HW6900 HW6900 1157 +cdcs_quoll MACH_CDCS_QUOLL CDCS_QUOLL 1158 +quicksilver MACH_QUICKSILVER QUICKSILVER 1159 +uplat926 MACH_UPLAT926 UPLAT926 1160 +dep2410_dep2410 MACH_DEP2410_THOMAS DEP2410_THOMAS 1161 +dtk2410 MACH_DTK2410 DTK2410 1162 +chili MACH_CHILI CHILI 1163 +demeter MACH_DEMETER DEMETER 1164 +dionysus MACH_DIONYSUS DIONYSUS 1165 +as352x MACH_AS352X AS352X 1166 +service MACH_SERVICE SERVICE 1167 +cs_e9301 MACH_CS_E9301 CS_E9301 1168 +micro9m MACH_MICRO9M MICRO9M 1169 +ia_mospck MACH_IA_MOSPCK IA_MOSPCK 1170 +ql201b MACH_QL201B QL201B 1171 +bbm MACH_BBM BBM 1174 +exxx MACH_EXXX EXXX 1175 +wma11b MACH_WMA11B WMA11B 1176 +pelco_atlas MACH_PELCO_ATLAS PELCO_ATLAS 1177 +g500 MACH_G500 G500 1178 +bug MACH_BUG BUG 1179 +mx33ads MACH_MX33ADS MX33ADS 1180 +chub MACH_CHUB CHUB 1181 +neo1973_gta01 MACH_NEO1973_GTA01 NEO1973_GTA01 1182 +w90n740 MACH_W90N740 W90N740 1183 +medallion_sa2410 MACH_MEDALLION_SA2410 MEDALLION_SA2410 1184 +ia_cpu_9200_2 MACH_IA_CPU_9200_2 IA_CPU_9200_2 1185 +dimmrm9200 MACH_DIMMRM9200 DIMMRM9200 1186 +pm9261 MACH_PM9261 PM9261 1187 +ml7304 MACH_ML7304 ML7304 1189 +ucp250 MACH_UCP250 UCP250 1190 +intboard MACH_INTBOARD INTBOARD 1191 +gulfstream MACH_GULFSTREAM GULFSTREAM 1192 +labquest MACH_LABQUEST LABQUEST 1193 +vcmx313 MACH_VCMX313 VCMX313 1194 +urg200 MACH_URG200 URG200 1195 +cpux255lcdnet MACH_CPUX255LCDNET CPUX255LCDNET 1196 +netdcu9 MACH_NETDCU9 NETDCU9 1197 +netdcu10 MACH_NETDCU10 NETDCU10 1198 +dspg_dga MACH_DSPG_DGA DSPG_DGA 1199 +dspg_dvw MACH_DSPG_DVW DSPG_DVW 1200 +solos MACH_SOLOS SOLOS 1201 +at91sam9263ek MACH_AT91SAM9263EK AT91SAM9263EK 1202 +osstbox MACH_OSSTBOX OSSTBOX 1203 +kbat9261 MACH_KBAT9261 KBAT9261 1204 +ct1100 MACH_CT1100 CT1100 1205 +akcppxa MACH_AKCPPXA AKCPPXA 1206 +ochaya1020 MACH_OCHAYA1020 OCHAYA1020 1207 +hitrack MACH_HITRACK HITRACK 1208 +syme1 MACH_SYME1 SYME1 1209 +syhl1 MACH_SYHL1 SYHL1 1210 +empca400 MACH_EMPCA400 EMPCA400 1211 +em7210 MACH_EM7210 EM7210 1212 +htchermes MACH_HTCHERMES HTCHERMES 1213 +eti_c1 MACH_ETI_C1 ETI_C1 1214 +ac100 MACH_AC100 AC100 1216 +sneetch MACH_SNEETCH SNEETCH 1217 +studentmate MACH_STUDENTMATE STUDENTMATE 1218 +zir2410 MACH_ZIR2410 ZIR2410 1219 +zir2413 MACH_ZIR2413 ZIR2413 1220 +dlonip3 MACH_DLONIP3 DLONIP3 1221 +instream MACH_INSTREAM INSTREAM 1222 +ambarella MACH_AMBARELLA AMBARELLA 1223 +nevis MACH_NEVIS NEVIS 1224 +htc_trinity MACH_HTC_TRINITY HTC_TRINITY 1225 +ql202b MACH_QL202B QL202B 1226 +vpac270 MACH_VPAC270 VPAC270 1227 +rd129 MACH_RD129 RD129 1228 +htcwizard MACH_HTCWIZARD HTCWIZARD 1229 +treo680 MACH_TREO680 TREO680 1230 +tecon_tmezon MACH_TECON_TMEZON TECON_TMEZON 1231 +zylonite MACH_ZYLONITE ZYLONITE 1233 +gene1270 MACH_GENE1270 GENE1270 1234 +zir2412 MACH_ZIR2412 ZIR2412 1235 +mx31lite MACH_MX31LITE MX31LITE 1236 +t700wx MACH_T700WX T700WX 1237 +vf100 MACH_VF100 VF100 1238 +nsb2 MACH_NSB2 NSB2 1239 +nxhmi_bb MACH_NXHMI_BB NXHMI_BB 1240 +nxhmi_re MACH_NXHMI_RE NXHMI_RE 1241 +n4100pro MACH_N4100PRO N4100PRO 1242 +sam9260 MACH_SAM9260 SAM9260 1243 +omap_treo600 MACH_OMAP_TREO600 OMAP_TREO600 1244 +indy2410 MACH_INDY2410 INDY2410 1245 +nelt_a MACH_NELT_A NELT_A 1246 +n311 MACH_N311 N311 1248 +at91sam9260vgk MACH_AT91SAM9260VGK AT91SAM9260VGK 1249 +at91leppe MACH_AT91LEPPE AT91LEPPE 1250 +at91lepccn MACH_AT91LEPCCN AT91LEPCCN 1251 +apc7100 MACH_APC7100 APC7100 1252 +stargazer MACH_STARGAZER STARGAZER 1253 +sonata MACH_SONATA SONATA 1254 +schmoogie MACH_SCHMOOGIE SCHMOOGIE 1255 +aztool MACH_AZTOOL AZTOOL 1256 +mioa701 MACH_MIOA701 MIOA701 1257 +sxni9260 MACH_SXNI9260 SXNI9260 1258 +mxc27520evb MACH_MXC27520EVB MXC27520EVB 1259 +armadillo5x0 MACH_ARMADILLO5X0 ARMADILLO5X0 1260 +mb9260 MACH_MB9260 MB9260 1261 +mb9263 MACH_MB9263 MB9263 1262 +ipac9302 MACH_IPAC9302 IPAC9302 1263 +cc9p9360js MACH_CC9P9360JS CC9P9360JS 1264 +gallium MACH_GALLIUM GALLIUM 1265 +msc2410 MACH_MSC2410 MSC2410 1266 +ghi270 MACH_GHI270 GHI270 1267 +davinci_leonardo MACH_DAVINCI_LEONARDO DAVINCI_LEONARDO 1268 +oiab MACH_OIAB OIAB 1269 +smdk6400 MACH_SMDK6400 SMDK6400 1270 +nokia_n800 MACH_NOKIA_N800 NOKIA_N800 1271 +greenphone MACH_GREENPHONE GREENPHONE 1272 +compex42x MACH_COMPEXWP18 COMPEXWP18 1273 +xmate MACH_XMATE XMATE 1274 +energizer MACH_ENERGIZER ENERGIZER 1275 +ime1 MACH_IME1 IME1 1276 +sweda_tms MACH_SWEDATMS SWEDATMS 1277 +ntnp435c MACH_NTNP435C NTNP435C 1278 +spectro2 MACH_SPECTRO2 SPECTRO2 1279 +h6039 MACH_H6039 H6039 1280 +ep80219 MACH_EP80219 EP80219 1281 +samoa_ii MACH_SAMOA_II SAMOA_II 1282 +cwmxl MACH_CWMXL CWMXL 1283 +as9200 MACH_AS9200 AS9200 1284 +sfx1149 MACH_SFX1149 SFX1149 1285 +navi010 MACH_NAVI010 NAVI010 1286 +multmdp MACH_MULTMDP MULTMDP 1287 +scb9520 MACH_SCB9520 SCB9520 1288 +htcathena MACH_HTCATHENA HTCATHENA 1289 +xp179 MACH_XP179 XP179 1290 +h4300 MACH_H4300 H4300 1291 +goramo_mlr MACH_GORAMO_MLR GORAMO_MLR 1292 +mxc30020evb MACH_MXC30020EVB MXC30020EVB 1293 +adsbitsyg5 MACH_ADSBITSYG5 ADSBITSYG5 1294 +adsportalplus MACH_ADSPORTALPLUS ADSPORTALPLUS 1295 +mmsp2plus MACH_MMSP2PLUS MMSP2PLUS 1296 +em_x270 MACH_EM_X270 EM_X270 1297 +tpp302 MACH_TPP302 TPP302 1298 +tpp104 MACH_TPM104 TPM104 1299 +tpm102 MACH_TPM102 TPM102 1300 +tpm109 MACH_TPM109 TPM109 1301 +fbxo1 MACH_FBXO1 FBXO1 1302 +hxd8 MACH_HXD8 HXD8 1303 +neo1973_gta02 MACH_NEO1973_GTA02 NEO1973_GTA02 1304 +emtest MACH_EMTEST EMTEST 1305 +ad6900 MACH_AD6900 AD6900 1306 +europa MACH_EUROPA EUROPA 1307 +metroconnect MACH_METROCONNECT METROCONNECT 1308 +ez_s2410 MACH_EZ_S2410 EZ_S2410 1309 +ez_s2440 MACH_EZ_S2440 EZ_S2440 1310 +ez_ep9312 MACH_EZ_EP9312 EZ_EP9312 1311 +ez_ep9315 MACH_EZ_EP9315 EZ_EP9315 1312 +ez_x7 MACH_EZ_X7 EZ_X7 1313 +godotdb MACH_GODOTDB GODOTDB 1314 +mistral MACH_MISTRAL MISTRAL 1315 +msm MACH_MSM MSM 1316 +ct5910 MACH_CT5910 CT5910 1317 +ct5912 MACH_CT5912 CT5912 1318 +argonst_mp MACH_HYNET_INE HYNET_INE 1319 +hynet_app MACH_HYNET_APP HYNET_APP 1320 +msm7200 MACH_MSM7200 MSM7200 1321 +msm7600 MACH_MSM7600 MSM7600 1322 +ceb255 MACH_CEB255 CEB255 1323 +ciel MACH_CIEL CIEL 1324 +slm5650 MACH_SLM5650 SLM5650 1325 +at91sam9rlek MACH_AT91SAM9RLEK AT91SAM9RLEK 1326 +comtech_router MACH_COMTECH_ROUTER COMTECH_ROUTER 1327 +sbc2410x MACH_SBC2410X SBC2410X 1328 +at4x0bd MACH_AT4X0BD AT4X0BD 1329 +cbifr MACH_CBIFR CBIFR 1330 +arcom_quantum MACH_ARCOM_QUANTUM ARCOM_QUANTUM 1331 +matrix520 MACH_MATRIX520 MATRIX520 1332 +matrix510 MACH_MATRIX510 MATRIX510 1333 +matrix500 MACH_MATRIX500 MATRIX500 1334 +m501 MACH_M501 M501 1335 +aaeon1270 MACH_AAEON1270 AAEON1270 1336 +matrix500ev MACH_MATRIX500EV MATRIX500EV 1337 +pac500 MACH_PAC500 PAC500 1338 +pnx8181 MACH_PNX8181 PNX8181 1339 +colibri320 MACH_COLIBRI320 COLIBRI320 1340 +aztoolbb MACH_AZTOOLBB AZTOOLBB 1341 +aztoolg2 MACH_AZTOOLG2 AZTOOLG2 1342 +dvlhost MACH_DVLHOST DVLHOST 1343 +zir9200 MACH_ZIR9200 ZIR9200 1344 +zir9260 MACH_ZIR9260 ZIR9260 1345 +cocopah MACH_COCOPAH COCOPAH 1346 +nds MACH_NDS NDS 1347 +rosencrantz MACH_ROSENCRANTZ ROSENCRANTZ 1348 +fttx_odsc MACH_FTTX_ODSC FTTX_ODSC 1349 +classe_r6904 MACH_CLASSE_R6904 CLASSE_R6904 1350 +cam60 MACH_CAM60 CAM60 1351 +mxc30031ads MACH_MXC30031ADS MXC30031ADS 1352 +datacall MACH_DATACALL DATACALL 1353 +at91eb01 MACH_AT91EB01 AT91EB01 1354 +rty MACH_RTY RTY 1355 +dwl2100 MACH_DWL2100 DWL2100 1356 +vinsi MACH_VINSI VINSI 1357 +db88f5281 MACH_DB88F5281 DB88F5281 1358 +csb726 MACH_CSB726 CSB726 1359 +tik27 MACH_TIK27 TIK27 1360 +mx_uc7420 MACH_MX_UC7420 MX_UC7420 1361 +rirm3 MACH_RIRM3 RIRM3 1362 +pelco_odyssey MACH_PELCO_ODYSSEY PELCO_ODYSSEY 1363 +adx_abox MACH_ADX_ABOX ADX_ABOX 1365 +adx_tpid MACH_ADX_TPID ADX_TPID 1366 +minicheck MACH_MINICHECK MINICHECK 1367 +idam MACH_IDAM IDAM 1368 +mario_mx MACH_MARIO_MX MARIO_MX 1369 +vi1888 MACH_VI1888 VI1888 1370 +zr4230 MACH_ZR4230 ZR4230 1371 +t1_ix_blue MACH_T1_IX_BLUE T1_IX_BLUE 1372 +syhq2 MACH_SYHQ2 SYHQ2 1373 +computime_r3 MACH_COMPUTIME_R3 COMPUTIME_R3 1374 +oratis MACH_ORATIS ORATIS 1375 +mikko MACH_MIKKO MIKKO 1376 +holon MACH_HOLON HOLON 1377 +olip8 MACH_OLIP8 OLIP8 1378 +ghi270hg MACH_GHI270HG GHI270HG 1379 +davinci_dm6467_evm MACH_DAVINCI_DM6467_EVM DAVINCI_DM6467_EVM 1380 +davinci_dm355_evm MACH_DAVINCI_DM355_EVM DAVINCI_DM355_EVM 1381 +blackriver MACH_BLACKRIVER BLACKRIVER 1383 +sandgate_wp MACH_SANDGATEWP SANDGATEWP 1384 +cdotbwsg MACH_CDOTBWSG CDOTBWSG 1385 +quark963 MACH_QUARK963 QUARK963 1386 +csb735 MACH_CSB735 CSB735 1387 +littleton MACH_LITTLETON LITTLETON 1388 +mio_p550 MACH_MIO_P550 MIO_P550 1389 +motion2440 MACH_MOTION2440 MOTION2440 1390 +imm500 MACH_IMM500 IMM500 1391 +homematic MACH_HOMEMATIC HOMEMATIC 1392 +ermine MACH_ERMINE ERMINE 1393 +kb9202b MACH_KB9202B KB9202B 1394 +hs1xx MACH_HS1XX HS1XX 1395 +studentmate2440 MACH_STUDENTMATE2440 STUDENTMATE2440 1396 +arvoo_l1_z1 MACH_ARVOO_L1_Z1 ARVOO_L1_Z1 1397 +dep2410k MACH_DEP2410K DEP2410K 1398 +xxsvideo MACH_XXSVIDEO XXSVIDEO 1399 +im4004 MACH_IM4004 IM4004 1400 +ochaya1050 MACH_OCHAYA1050 OCHAYA1050 1401 +lep9261 MACH_LEP9261 LEP9261 1402 +svenmeb MACH_SVENMEB SVENMEB 1403 +fortunet2ne MACH_FORTUNET2NE FORTUNET2NE 1404 +nxhx MACH_NXHX NXHX 1406 +realview_pb11mp MACH_REALVIEW_PB11MP REALVIEW_PB11MP 1407 +ids500 MACH_IDS500 IDS500 1408 +ors_n725 MACH_ORS_N725 ORS_N725 1409 +hsdarm MACH_HSDARM HSDARM 1410 +sha_pon003 MACH_SHA_PON003 SHA_PON003 1411 +sha_pon004 MACH_SHA_PON004 SHA_PON004 1412 +sha_pon007 MACH_SHA_PON007 SHA_PON007 1413 +sha_pon011 MACH_SHA_PON011 SHA_PON011 1414 +h6042 MACH_H6042 H6042 1415 +h6043 MACH_H6043 H6043 1416 +looxc550 MACH_LOOXC550 LOOXC550 1417 +cnty_titan MACH_CNTY_TITAN CNTY_TITAN 1418 +app3xx MACH_APP3XX APP3XX 1419 +sideoatsgrama MACH_SIDEOATSGRAMA SIDEOATSGRAMA 1420 +treo700p MACH_TREO700P TREO700P 1421 +treo700w MACH_TREO700W TREO700W 1422 +treo750 MACH_TREO750 TREO750 1423 +treo755p MACH_TREO755P TREO755P 1424 +ezreganut9200 MACH_EZREGANUT9200 EZREGANUT9200 1425 +sarge MACH_SARGE SARGE 1426 +a696 MACH_A696 A696 1427 +turtle1916 MACH_TURTLE TURTLE 1428 +mx27_3ds MACH_MX27_3DS MX27_3DS 1430 +bishop MACH_BISHOP BISHOP 1431 +pxx MACH_PXX PXX 1432 +redwood MACH_REDWOOD REDWOOD 1433 +omap_2430dlp MACH_OMAP_2430DLP OMAP_2430DLP 1436 +omap_2430osk MACH_OMAP_2430OSK OMAP_2430OSK 1437 +sardine MACH_SARDINE SARDINE 1438 +halibut MACH_HALIBUT HALIBUT 1439 +trout MACH_TROUT TROUT 1440 +goldfish MACH_GOLDFISH GOLDFISH 1441 +gesbc2440 MACH_GESBC2440 GESBC2440 1442 +nomad MACH_NOMAD NOMAD 1443 +rosalind MACH_ROSALIND ROSALIND 1444 +cc9p9215 MACH_CC9P9215 CC9P9215 1445 +cc9p9210 MACH_CC9P9210 CC9P9210 1446 +cc9p9215js MACH_CC9P9215JS CC9P9215JS 1447 +cc9p9210js MACH_CC9P9210JS CC9P9210JS 1448 +nasffe MACH_NASFFE NASFFE 1449 +tn2x0bd MACH_TN2X0BD TN2X0BD 1450 +gwmpxa MACH_GWMPXA GWMPXA 1451 +exyplus MACH_EXYPLUS EXYPLUS 1452 +jadoo21 MACH_JADOO21 JADOO21 1453 +looxn560 MACH_LOOXN560 LOOXN560 1454 +bonsai MACH_BONSAI BONSAI 1455 +adsmilgato MACH_ADSMILGATO ADSMILGATO 1456 +gba MACH_GBA GBA 1457 +h6044 MACH_H6044 H6044 1458 +app MACH_APP APP 1459 +tct_hammer MACH_TCT_HAMMER TCT_HAMMER 1460 +herald MACH_HERALD HERALD 1461 +artemis MACH_ARTEMIS ARTEMIS 1462 +htctitan MACH_HTCTITAN HTCTITAN 1463 +qranium MACH_QRANIUM QRANIUM 1464 +adx_wsc2 MACH_ADX_WSC2 ADX_WSC2 1465 +adx_medcom MACH_ADX_MEDCOM ADX_MEDCOM 1466 +bboard MACH_BBOARD BBOARD 1467 +cambria MACH_CAMBRIA CAMBRIA 1468 +mt7xxx MACH_MT7XXX MT7XXX 1469 +matrix512 MACH_MATRIX512 MATRIX512 1470 +matrix522 MACH_MATRIX522 MATRIX522 1471 +ipac5010 MACH_IPAC5010 IPAC5010 1472 +sakura MACH_SAKURA SAKURA 1473 +grocx MACH_GROCX GROCX 1474 +pm9263 MACH_PM9263 PM9263 1475 +sim_one MACH_SIM_ONE SIM_ONE 1476 +acq132 MACH_ACQ132 ACQ132 1477 +datr MACH_DATR DATR 1478 +actux1 MACH_ACTUX1 ACTUX1 1479 +actux2 MACH_ACTUX2 ACTUX2 1480 +actux3 MACH_ACTUX3 ACTUX3 1481 +flexit MACH_FLEXIT FLEXIT 1482 +bh2x0bd MACH_BH2X0BD BH2X0BD 1483 +atb2002 MACH_ATB2002 ATB2002 1484 +xenon MACH_XENON XENON 1485 +fm607 MACH_FM607 FM607 1486 +matrix514 MACH_MATRIX514 MATRIX514 1487 +matrix524 MACH_MATRIX524 MATRIX524 1488 +inpod MACH_INPOD INPOD 1489 +jive MACH_JIVE JIVE 1490 +tll_mx21 MACH_TLL_MX21 TLL_MX21 1491 +sbc2800 MACH_SBC2800 SBC2800 1492 +cc7ucamry MACH_CC7UCAMRY CC7UCAMRY 1493 +ubisys_p9_sc15 MACH_UBISYS_P9_SC15 UBISYS_P9_SC15 1494 +ubisys_p9_ssc2d10 MACH_UBISYS_P9_SSC2D10 UBISYS_P9_SSC2D10 1495 +ubisys_p9_rcu3 MACH_UBISYS_P9_RCU3 UBISYS_P9_RCU3 1496 +aml_m8000 MACH_AML_M8000 AML_M8000 1497 +snapper_270 MACH_SNAPPER_270 SNAPPER_270 1498 +omap_bbx MACH_OMAP_BBX OMAP_BBX 1499 +ucn2410 MACH_UCN2410 UCN2410 1500 +sam9_l9260 MACH_SAM9_L9260 SAM9_L9260 1501 +eti_c2 MACH_ETI_C2 ETI_C2 1502 +avalanche MACH_AVALANCHE AVALANCHE 1503 +realview_pb1176 MACH_REALVIEW_PB1176 REALVIEW_PB1176 1504 +dp1500 MACH_DP1500 DP1500 1505 +apple_iphone MACH_APPLE_IPHONE APPLE_IPHONE 1506 +yl9200 MACH_YL9200 YL9200 1507 +rd88f5182 MACH_RD88F5182 RD88F5182 1508 +kurobox_pro MACH_KUROBOX_PRO KUROBOX_PRO 1509 +se_poet MACH_SE_POET SE_POET 1510 +mx31_3ds MACH_MX31_3DS MX31_3DS 1511 +r270 MACH_R270 R270 1512 +armour21 MACH_ARMOUR21 ARMOUR21 1513 +dt2 MACH_DT2 DT2 1514 +vt4 MACH_VT4 VT4 1515 +tyco320 MACH_TYCO320 TYCO320 1516 +adma MACH_ADMA ADMA 1517 +wp188 MACH_WP188 WP188 1518 +corsica MACH_CORSICA CORSICA 1519 +bigeye MACH_BIGEYE BIGEYE 1520 +tll5000 MACH_TLL5000 TLL5000 1522 +bebot MACH_BEBOT BEBOT 1523 +qong MACH_QONG QONG 1524 +tcompact MACH_TCOMPACT TCOMPACT 1525 +puma5 MACH_PUMA5 PUMA5 1526 +elara MACH_ELARA ELARA 1527 +ellington MACH_ELLINGTON ELLINGTON 1528 +xda_atom MACH_XDA_ATOM XDA_ATOM 1529 +energizer2 MACH_ENERGIZER2 ENERGIZER2 1530 +odin MACH_ODIN ODIN 1531 +actux4 MACH_ACTUX4 ACTUX4 1532 +esl_omap MACH_ESL_OMAP ESL_OMAP 1533 +omap2evm MACH_OMAP2EVM OMAP2EVM 1534 +omap3evm MACH_OMAP3EVM OMAP3EVM 1535 +adx_pcu57 MACH_ADX_PCU57 ADX_PCU57 1536 +monaco MACH_MONACO MONACO 1537 +levante MACH_LEVANTE LEVANTE 1538 +tmxipx425 MACH_TMXIPX425 TMXIPX425 1539 +leep MACH_LEEP LEEP 1540 +raad MACH_RAAD RAAD 1541 +dns323 MACH_DNS323 DNS323 1542 +ap1000 MACH_AP1000 AP1000 1543 +a9sam6432 MACH_A9SAM6432 A9SAM6432 1544 +shiny MACH_SHINY SHINY 1545 +omap3_beagle MACH_OMAP3_BEAGLE OMAP3_BEAGLE 1546 +csr_bdb2 MACH_CSR_BDB2 CSR_BDB2 1547 +nokia_n810 MACH_NOKIA_N810 NOKIA_N810 1548 +c270 MACH_C270 C270 1549 +sentry MACH_SENTRY SENTRY 1550 +pcm038 MACH_PCM038 PCM038 1551 +anc300 MACH_ANC300 ANC300 1552 +htckaiser MACH_HTCKAISER HTCKAISER 1553 +sbat100 MACH_SBAT100 SBAT100 1554 +modunorm MACH_MODUNORM MODUNORM 1555 +pelos_twarm MACH_PELOS_TWARM PELOS_TWARM 1556 +flank MACH_FLANK FLANK 1557 +sirloin MACH_SIRLOIN SIRLOIN 1558 +brisket MACH_BRISKET BRISKET 1559 +chuck MACH_CHUCK CHUCK 1560 +otter MACH_OTTER OTTER 1561 +davinci_ldk MACH_DAVINCI_LDK DAVINCI_LDK 1562 +phreedom MACH_PHREEDOM PHREEDOM 1563 +sg310 MACH_SG310 SG310 1564 +ts209 MACH_TS209 TS209 1565 +at91cap9adk MACH_AT91CAP9ADK AT91CAP9ADK 1566 +tion9315 MACH_TION9315 TION9315 1567 +mast MACH_MAST MAST 1568 +pfw MACH_PFW PFW 1569 +yl_p2440 MACH_YL_P2440 YL_P2440 1570 +zsbc32 MACH_ZSBC32 ZSBC32 1571 +omap_pace2 MACH_OMAP_PACE2 OMAP_PACE2 1572 +imx_pace2 MACH_IMX_PACE2 IMX_PACE2 1573 +mx31moboard MACH_MX31MOBOARD MX31MOBOARD 1574 +mx37_3ds MACH_MX37_3DS MX37_3DS 1575 +rcc MACH_RCC RCC 1576 +dmp MACH_ARM9 ARM9 1577 +vision_ep9307 MACH_VISION_EP9307 VISION_EP9307 1578 +scly1000 MACH_SCLY1000 SCLY1000 1579 +fontel_ep MACH_FONTEL_EP FONTEL_EP 1580 +voiceblue3g MACH_VOICEBLUE3G VOICEBLUE3G 1581 +tt9200 MACH_TT9200 TT9200 1582 +digi2410 MACH_DIGI2410 DIGI2410 1583 +terastation_pro2 MACH_TERASTATION_PRO2 TERASTATION_PRO2 1584 +linkstation_pro MACH_LINKSTATION_PRO LINKSTATION_PRO 1585 +motorola_a780 MACH_MOTOROLA_A780 MOTOROLA_A780 1587 +motorola_e6 MACH_MOTOROLA_E6 MOTOROLA_E6 1588 +motorola_e2 MACH_MOTOROLA_E2 MOTOROLA_E2 1589 +motorola_e680 MACH_MOTOROLA_E680 MOTOROLA_E680 1590 +ur2410 MACH_UR2410 UR2410 1591 +tas9261 MACH_TAS9261 TAS9261 1592 +davinci_hermes_hd MACH_HERMES_HD HERMES_HD 1593 +davinci_perseo_hd MACH_PERSEO_HD PERSEO_HD 1594 +stargazer2 MACH_STARGAZER2 STARGAZER2 1595 +e350 MACH_E350 E350 1596 +wpcm450 MACH_WPCM450 WPCM450 1597 +cartesio MACH_CARTESIO CARTESIO 1598 +toybox MACH_TOYBOX TOYBOX 1599 +tx27 MACH_TX27 TX27 1600 +ts409 MACH_TS409 TS409 1601 +p300 MACH_P300 P300 1602 +xdacomet MACH_XDACOMET XDACOMET 1603 +dexflex2 MACH_DEXFLEX2 DEXFLEX2 1604 +ow MACH_OW OW 1605 +armebs3 MACH_ARMEBS3 ARMEBS3 1606 +u3 MACH_U3 U3 1607 +smdk2450 MACH_SMDK2450 SMDK2450 1608 +rsi_ews MACH_RSI_EWS RSI_EWS 1609 +tnb MACH_TNB TNB 1610 +toepath MACH_TOEPATH TOEPATH 1611 +kb9263 MACH_KB9263 KB9263 1612 +mt7108 MACH_MT7108 MT7108 1613 +smtr2440 MACH_SMTR2440 SMTR2440 1614 +manao MACH_MANAO MANAO 1615 +cm_x300 MACH_CM_X300 CM_X300 1616 +gulfstream_kp MACH_GULFSTREAM_KP GULFSTREAM_KP 1617 +lanreadyfn522 MACH_LANREADYFN522 LANREADYFN522 1618 +arma37 MACH_ARMA37 ARMA37 1619 +mendel MACH_MENDEL MENDEL 1620 +pelco_iliad MACH_PELCO_ILIAD PELCO_ILIAD 1621 +unit2p MACH_UNIT2P UNIT2P 1622 +inc20otter MACH_INC20OTTER INC20OTTER 1623 +at91sam9g20ek MACH_AT91SAM9G20EK AT91SAM9G20EK 1624 +sc_ge2 MACH_STORCENTER STORCENTER 1625 +smdk6410 MACH_SMDK6410 SMDK6410 1626 +u300 MACH_U300 U300 1627 +u500 MACH_U500 U500 1628 +ds9260 MACH_DS9260 DS9260 1629 +riverrock MACH_RIVERROCK RIVERROCK 1630 +scibath MACH_SCIBATH SCIBATH 1631 +at91sam7se MACH_AT91SAM7SE512EK AT91SAM7SE512EK 1632 +wrt350n_v2 MACH_WRT350N_V2 WRT350N_V2 1633 +multimedia MACH_MULTIMEDIA MULTIMEDIA 1634 +marvin MACH_MARVIN MARVIN 1635 +x500 MACH_X500 X500 1636 +awlug4lcu MACH_AWLUG4LCU AWLUG4LCU 1637 +palermoc MACH_PALERMOC PALERMOC 1638 +omap_ldp MACH_OMAP_LDP OMAP_LDP 1639 +ip500 MACH_IP500 IP500 1640 +ase2 MACH_ASE2 ASE2 1642 +mx35evb MACH_MX35EVB MX35EVB 1643 +aml_m8050 MACH_AML_M8050 AML_M8050 1644 +mx35_3ds MACH_MX35_3DS MX35_3DS 1645 +mars MACH_MARS MARS 1646 +neuros_osd2 MACH_NEUROS_OSD2 NEUROS_OSD2 1647 +badger MACH_BADGER BADGER 1648 +trizeps4wl MACH_TRIZEPS4WL TRIZEPS4WL 1649 +trizeps5 MACH_TRIZEPS5 TRIZEPS5 1650 +marlin MACH_MARLIN MARLIN 1651 +ts78xx MACH_TS78XX TS78XX 1652 +hpipaq214 MACH_HPIPAQ214 HPIPAQ214 1653 +at572d940dcm MACH_AT572D940DCM AT572D940DCM 1654 +ne1board MACH_NE1BOARD NE1BOARD 1655 +zante MACH_ZANTE ZANTE 1656 +sffsdr MACH_SFFSDR SFFSDR 1657 +tw2662 MACH_TW2662 TW2662 1658 +vf10xx MACH_VF10XX VF10XX 1659 +zoran43xx MACH_ZORAN43XX ZORAN43XX 1660 +sonix926 MACH_SONIX926 SONIX926 1661 +celestialsemi MACH_CELESTIALSEMI CELESTIALSEMI 1662 +cc9m2443js MACH_CC9M2443JS CC9M2443JS 1663 +tw5334 MACH_TW5334 TW5334 1664 +omap_htcartemis MACH_HTCARTEMIS HTCARTEMIS 1665 +nal_hlite MACH_NAL_HLITE NAL_HLITE 1666 +htcvogue MACH_HTCVOGUE HTCVOGUE 1667 +smartweb MACH_SMARTWEB SMARTWEB 1668 +mv86xx MACH_MV86XX MV86XX 1669 +mv87xx MACH_MV87XX MV87XX 1670 +songyoungho MACH_SONGYOUNGHO SONGYOUNGHO 1671 +younghotema MACH_YOUNGHOTEMA YOUNGHOTEMA 1672 +pcm037 MACH_PCM037 PCM037 1673 +mmvp MACH_MMVP MMVP 1674 +mmap MACH_MMAP MMAP 1675 +ptid2410 MACH_PTID2410 PTID2410 1676 +james_926 MACH_JAMES_926 JAMES_926 1677 +fm6000 MACH_FM6000 FM6000 1678 +db88f6281_bp MACH_DB88F6281_BP DB88F6281_BP 1680 +rd88f6192_nas MACH_RD88F6192_NAS RD88F6192_NAS 1681 +rd88f6281 MACH_RD88F6281 RD88F6281 1682 +db78x00_bp MACH_DB78X00_BP DB78X00_BP 1683 +smdk2416 MACH_SMDK2416 SMDK2416 1685 +oce_spider_si MACH_OCE_SPIDER_SI OCE_SPIDER_SI 1686 +oce_spider_sk MACH_OCE_SPIDER_SK OCE_SPIDER_SK 1687 +rovern6 MACH_ROVERN6 ROVERN6 1688 +pelco_evolution MACH_PELCO_EVOLUTION PELCO_EVOLUTION 1689 +wbd111 MACH_WBD111 WBD111 1690 +elaracpe MACH_ELARACPE ELARACPE 1691 +mabv3 MACH_MABV3 MABV3 1692 +mv2120 MACH_MV2120 MV2120 1693 +csb737 MACH_CSB737 CSB737 1695 +mx51_3ds MACH_MX51_3DS MX51_3DS 1696 +g900 MACH_G900 G900 1697 +apf27 MACH_APF27 APF27 1698 +ggus2000 MACH_GGUS2000 GGUS2000 1699 +omap_2430_mimic MACH_OMAP_2430_MIMIC OMAP_2430_MIMIC 1700 +imx27lite MACH_IMX27LITE IMX27LITE 1701 +almex MACH_ALMEX ALMEX 1702 +control MACH_CONTROL CONTROL 1703 +mba2410 MACH_MBA2410 MBA2410 1704 +volcano MACH_VOLCANO VOLCANO 1705 +zenith MACH_ZENITH ZENITH 1706 +muchip MACH_MUCHIP MUCHIP 1707 +magellan MACH_MAGELLAN MAGELLAN 1708 +usb_a9260 MACH_USB_A9260 USB_A9260 1709 +usb_a9263 MACH_USB_A9263 USB_A9263 1710 +qil_a9260 MACH_QIL_A9260 QIL_A9260 1711 +cme9210 MACH_CME9210 CME9210 1712 +hczh4 MACH_HCZH4 HCZH4 1713 +spearbasic MACH_SPEARBASIC SPEARBASIC 1714 +dep2440 MACH_DEP2440 DEP2440 1715 +hdl_gxr MACH_HDL_GXR HDL_GXR 1716 +hdl_gt MACH_HDL_GT HDL_GT 1717 +hdl_4g MACH_HDL_4G HDL_4G 1718 +s3c6000 MACH_S3C6000 S3C6000 1719 +mmsp2_mdk MACH_MMSP2_MDK MMSP2_MDK 1720 +mpx220 MACH_MPX220 MPX220 1721 +kzm_arm11_01 MACH_KZM_ARM11_01 KZM_ARM11_01 1722 +htc_polaris MACH_HTC_POLARIS HTC_POLARIS 1723 +htc_kaiser MACH_HTC_KAISER HTC_KAISER 1724 +lg_ks20 MACH_LG_KS20 LG_KS20 1725 +hhgps MACH_HHGPS HHGPS 1726 +nokia_n810_wimax MACH_NOKIA_N810_WIMAX NOKIA_N810_WIMAX 1727 +insight MACH_INSIGHT INSIGHT 1728 +sapphire MACH_SAPPHIRE SAPPHIRE 1729 +csb637xo MACH_CSB637XO CSB637XO 1730 +evisiong MACH_EVISIONG EVISIONG 1731 +stmp37xx MACH_STMP37XX STMP37XX 1732 +stmp378x MACH_STMP378X STMP378X 1733 +tnt MACH_TNT TNT 1734 +tbxt MACH_TBXT TBXT 1735 +playmate MACH_PLAYMATE PLAYMATE 1736 +pns10 MACH_PNS10 PNS10 1737 +eznavi MACH_EZNAVI EZNAVI 1738 +ps4000 MACH_PS4000 PS4000 1739 +ezx_a780 MACH_EZX_A780 EZX_A780 1740 +ezx_e680 MACH_EZX_E680 EZX_E680 1741 +ezx_a1200 MACH_EZX_A1200 EZX_A1200 1742 +ezx_e6 MACH_EZX_E6 EZX_E6 1743 +ezx_e2 MACH_EZX_E2 EZX_E2 1744 +ezx_a910 MACH_EZX_A910 EZX_A910 1745 +cwmx31 MACH_CWMX31 CWMX31 1746 +sl2312 MACH_SL2312 SL2312 1747 +blenny MACH_BLENNY BLENNY 1748 +ds107 MACH_DS107 DS107 1749 +dsx07 MACH_DSX07 DSX07 1750 +picocom1 MACH_PICOCOM1 PICOCOM1 1751 +lynx_wolverine MACH_LYNX_WOLVERINE LYNX_WOLVERINE 1752 +ubisys_p9_sc19 MACH_UBISYS_P9_SC19 UBISYS_P9_SC19 1753 +kratos_low MACH_KRATOS_LOW KRATOS_LOW 1754 +m700 MACH_M700 M700 1755 +edmini_v2 MACH_EDMINI_V2 EDMINI_V2 1756 +zipit2 MACH_ZIPIT2 ZIPIT2 1757 +hslfemtocell MACH_HSLFEMTOCELL HSLFEMTOCELL 1758 +daintree_at91 MACH_DAINTREE_AT91 DAINTREE_AT91 1759 +sg560usb MACH_SG560USB SG560USB 1760 +omap3_pandora MACH_OMAP3_PANDORA OMAP3_PANDORA 1761 +usr8200 MACH_USR8200 USR8200 1762 +s1s65k MACH_S1S65K S1S65K 1763 +s2s65a MACH_S2S65A S2S65A 1764 +icore MACH_ICORE ICORE 1765 +mss2 MACH_MSS2 MSS2 1766 +belmont MACH_BELMONT BELMONT 1767 +asusp525 MACH_ASUSP525 ASUSP525 1768 +lb88rc8480 MACH_LB88RC8480 LB88RC8480 1769 +hipxa MACH_HIPXA HIPXA 1770 +mx25_3ds MACH_MX25_3DS MX25_3DS 1771 +m800 MACH_M800 M800 1772 +omap3530_lv_som MACH_OMAP3530_LV_SOM OMAP3530_LV_SOM 1773 +prima_evb MACH_PRIMA_EVB PRIMA_EVB 1774 +mx31bt1 MACH_MX31BT1 MX31BT1 1775 +atlas4_evb MACH_ATLAS4_EVB ATLAS4_EVB 1776 +mx31cicada MACH_MX31CICADA MX31CICADA 1777 +mi424wr MACH_MI424WR MI424WR 1778 +axs_ultrax MACH_AXS_ULTRAX AXS_ULTRAX 1779 +at572d940deb MACH_AT572D940DEB AT572D940DEB 1780 +davinci_da830_evm MACH_DAVINCI_DA830_EVM DAVINCI_DA830_EVM 1781 +ep9302 MACH_EP9302 EP9302 1782 +at572d940hfek MACH_AT572D940HFEB AT572D940HFEB 1783 +cybook3 MACH_CYBOOK3 CYBOOK3 1784 +wdg002 MACH_WDG002 WDG002 1785 +sg560adsl MACH_SG560ADSL SG560ADSL 1786 +nextio_n2800_ica MACH_NEXTIO_N2800_ICA NEXTIO_N2800_ICA 1787 +dove_db MACH_DOVE_DB DOVE_DB 1788 +vandihud MACH_VANDIHUD VANDIHUD 1790 +magx_e8 MACH_MAGX_E8 MAGX_E8 1791 +magx_z6 MACH_MAGX_Z6 MAGX_Z6 1792 +magx_v8 MACH_MAGX_V8 MAGX_V8 1793 +magx_u9 MACH_MAGX_U9 MAGX_U9 1794 +toughcf08 MACH_TOUGHCF08 TOUGHCF08 1795 +zw4400 MACH_ZW4400 ZW4400 1796 +marat91 MACH_MARAT91 MARAT91 1797 +overo MACH_OVERO OVERO 1798 +at2440evb MACH_AT2440EVB AT2440EVB 1799 +neocore926 MACH_NEOCORE926 NEOCORE926 1800 +wnr854t MACH_WNR854T WNR854T 1801 +imx27 MACH_IMX27 IMX27 1802 +moose_db MACH_MOOSE_DB MOOSE_DB 1803 +fab4 MACH_FAB4 FAB4 1804 +htcdiamond MACH_HTCDIAMOND HTCDIAMOND 1805 +fiona MACH_FIONA FIONA 1806 +mxc30030_x MACH_MXC30030_X MXC30030_X 1807 +bmp1000 MACH_BMP1000 BMP1000 1808 +logi9200 MACH_LOGI9200 LOGI9200 1809 +tqma31 MACH_TQMA31 TQMA31 1810 +ccw9p9215js MACH_CCW9P9215JS CCW9P9215JS 1811 +rd88f5181l_ge MACH_RD88F5181L_GE RD88F5181L_GE 1812 +sifmain MACH_SIFMAIN SIFMAIN 1813 +sam9_l9261 MACH_SAM9_L9261 SAM9_L9261 1814 +cc9m2443 MACH_CC9M2443 CC9M2443 1815 +xaria300 MACH_XARIA300 XARIA300 1816 +it9200 MACH_IT9200 IT9200 1817 +rd88f5181l_fxo MACH_RD88F5181L_FXO RD88F5181L_FXO 1818 +kriss_sensor MACH_KRISS_SENSOR KRISS_SENSOR 1819 +pilz_pmi5 MACH_PILZ_PMI5 PILZ_PMI5 1820 +jade MACH_JADE JADE 1821 +ks8695_softplc MACH_KS8695_SOFTPLC KS8695_SOFTPLC 1822 +gprisc3 MACH_GPRISC3 GPRISC3 1823 +stamp9g20 MACH_STAMP9G20 STAMP9G20 1824 +smdk6430 MACH_SMDK6430 SMDK6430 1825 +smdkc100 MACH_SMDKC100 SMDKC100 1826 +tavorevb MACH_TAVOREVB TAVOREVB 1827 +saar MACH_SAAR SAAR 1828 +deister_eyecam MACH_DEISTER_EYECAM DEISTER_EYECAM 1829 +at91sam9m10g45ek MACH_AT91SAM9M10G45EK AT91SAM9M10G45EK 1830 +linkstation_produo MACH_LINKSTATION_PRODUO LINKSTATION_PRODUO 1831 +hit_b0 MACH_HIT_B0 HIT_B0 1832 +adx_rmu MACH_ADX_RMU ADX_RMU 1833 +xg_cpe_main MACH_XG_CPE_MAIN XG_CPE_MAIN 1834 +edb9407a MACH_EDB9407A EDB9407A 1835 +dtb9608 MACH_DTB9608 DTB9608 1836 +em104v1 MACH_EM104V1 EM104V1 1837 +demo MACH_DEMO DEMO 1838 +logi9260 MACH_LOGI9260 LOGI9260 1839 +mx31_exm32 MACH_MX31_EXM32 MX31_EXM32 1840 +usb_a9g20 MACH_USB_A9G20 USB_A9G20 1841 +picproje2008 MACH_PICPROJE2008 PICPROJE2008 1842 +cs_e9315 MACH_CS_E9315 CS_E9315 1843 +qil_a9g20 MACH_QIL_A9G20 QIL_A9G20 1844 +sha_pon020 MACH_SHA_PON020 SHA_PON020 1845 +nad MACH_NAD NAD 1846 +sbc35_a9260 MACH_SBC35_A9260 SBC35_A9260 1847 +sbc35_a9g20 MACH_SBC35_A9G20 SBC35_A9G20 1848 +davinci_beginning MACH_DAVINCI_BEGINNING DAVINCI_BEGINNING 1849 +uwc MACH_UWC UWC 1850 +mxlads MACH_MXLADS MXLADS 1851 +htcnike MACH_HTCNIKE HTCNIKE 1852 +deister_pxa270 MACH_DEISTER_PXA270 DEISTER_PXA270 1853 +cme9210js MACH_CME9210JS CME9210JS 1854 +cc9p9360 MACH_CC9P9360 CC9P9360 1855 +mocha MACH_MOCHA MOCHA 1856 +wapd170ag MACH_WAPD170AG WAPD170AG 1857 +linkstation_mini MACH_LINKSTATION_MINI LINKSTATION_MINI 1858 +afeb9260 MACH_AFEB9260 AFEB9260 1859 +w90x900 MACH_W90X900 W90X900 1860 +w90x700 MACH_W90X700 W90X700 1861 +kt300ip MACH_KT300IP KT300IP 1862 +kt300ip_g20 MACH_KT300IP_G20 KT300IP_G20 1863 +srcm MACH_SRCM SRCM 1864 +wlnx_9260 MACH_WLNX_9260 WLNX_9260 1865 +openmoko_gta03 MACH_OPENMOKO_GTA03 OPENMOKO_GTA03 1866 +osprey2 MACH_OSPREY2 OSPREY2 1867 +kbio9260 MACH_KBIO9260 KBIO9260 1868 +ginza MACH_GINZA GINZA 1869 +a636n MACH_A636N A636N 1870 +imx27ipcam MACH_IMX27IPCAM IMX27IPCAM 1871 +nemoc MACH_NEMOC NEMOC 1872 +geneva MACH_GENEVA GENEVA 1873 +htcpharos MACH_HTCPHAROS HTCPHAROS 1874 +neonc MACH_NEONC NEONC 1875 +nas7100 MACH_NAS7100 NAS7100 1876 +teuphone MACH_TEUPHONE TEUPHONE 1877 +annax_eth2 MACH_ANNAX_ETH2 ANNAX_ETH2 1878 +csb733 MACH_CSB733 CSB733 1879 +bk3 MACH_BK3 BK3 1880 +omap_em32 MACH_OMAP_EM32 OMAP_EM32 1881 +et9261cp MACH_ET9261CP ET9261CP 1882 +jasperc MACH_JASPERC JASPERC 1883 +issi_arm9 MACH_ISSI_ARM9 ISSI_ARM9 1884 +ued MACH_UED UED 1885 +esiblade MACH_ESIBLADE ESIBLADE 1886 +eye02 MACH_EYE02 EYE02 1887 +imx27kbd MACH_IMX27KBD IMX27KBD 1888 +kixvp435 MACH_KIXVP435 KIXVP435 1890 +kixnp435 MACH_KIXNP435 KIXNP435 1891 +africa MACH_AFRICA AFRICA 1892 +nh233 MACH_NH233 NH233 1893 +rd88f6183ap_ge MACH_RD88F6183AP_GE RD88F6183AP_GE 1894 +bcm4760 MACH_BCM4760 BCM4760 1895 +eddy_v2 MACH_EDDY_V2 EDDY_V2 1896 +realview_pba8 MACH_REALVIEW_PBA8 REALVIEW_PBA8 1897 +hid_a7 MACH_HID_A7 HID_A7 1898 +hero MACH_HERO HERO 1899 +omap_poseidon MACH_OMAP_POSEIDON OMAP_POSEIDON 1900 +realview_pbx MACH_REALVIEW_PBX REALVIEW_PBX 1901 +micro9s MACH_MICRO9S MICRO9S 1902 +mako MACH_MAKO MAKO 1903 +xdaflame MACH_XDAFLAME XDAFLAME 1904 +phidget_sbc2 MACH_PHIDGET_SBC2 PHIDGET_SBC2 1905 +limestone MACH_LIMESTONE LIMESTONE 1906 +iprobe_c32 MACH_IPROBE_C32 IPROBE_C32 1907 +rut100 MACH_RUT100 RUT100 1908 +asusp535 MACH_ASUSP535 ASUSP535 1909 +htcraphael MACH_HTCRAPHAEL HTCRAPHAEL 1910 +sygdg1 MACH_SYGDG1 SYGDG1 1911 +sygdg2 MACH_SYGDG2 SYGDG2 1912 +seoul MACH_SEOUL SEOUL 1913 +salerno MACH_SALERNO SALERNO 1914 +ucn_s3c64xx MACH_UCN_S3C64XX UCN_S3C64XX 1915 +msm7201a MACH_MSM7201A MSM7201A 1916 +lpr1 MACH_LPR1 LPR1 1917 +armadillo500fx MACH_ARMADILLO500FX ARMADILLO500FX 1918 +g3evm MACH_G3EVM G3EVM 1919 +z3_dm355 MACH_Z3_DM355 Z3_DM355 1920 +w90p910evb MACH_W90P910EVB W90P910EVB 1921 +w90p920evb MACH_W90P920EVB W90P920EVB 1922 +w90p950evb MACH_W90P950EVB W90P950EVB 1923 +w90n960evb MACH_W90N960EVB W90N960EVB 1924 +camhd MACH_CAMHD CAMHD 1925 +mvc100 MACH_MVC100 MVC100 1926 +electrum_200 MACH_ELECTRUM_200 ELECTRUM_200 1927 +htcjade MACH_HTCJADE HTCJADE 1928 +memphis MACH_MEMPHIS MEMPHIS 1929 +imx27sbc MACH_IMX27SBC IMX27SBC 1930 +lextar MACH_LEXTAR LEXTAR 1931 +mv88f6281gtw_ge MACH_MV88F6281GTW_GE MV88F6281GTW_GE 1932 +ncp MACH_NCP NCP 1933 +z32an_series MACH_Z32AN Z32AN 1934 +tmq_capd MACH_TMQ_CAPD TMQ_CAPD 1935 +omap3_wl MACH_OMAP3_WL OMAP3_WL 1936 +chumby MACH_CHUMBY CHUMBY 1937 +atsarm9 MACH_ATSARM9 ATSARM9 1938 +davinci_dm365_evm MACH_DAVINCI_DM365_EVM DAVINCI_DM365_EVM 1939 +bahamas MACH_BAHAMAS BAHAMAS 1940 +das MACH_DAS DAS 1941 +minidas MACH_MINIDAS MINIDAS 1942 +vk1000 MACH_VK1000 VK1000 1943 +centro MACH_CENTRO CENTRO 1944 +ctera_2bay MACH_CTERA_2BAY CTERA_2BAY 1945 +edgeconnect MACH_EDGECONNECT EDGECONNECT 1946 +nd27000 MACH_ND27000 ND27000 1947 +cobra MACH_GEMALTO_COBRA GEMALTO_COBRA 1948 +ingelabs_comet MACH_INGELABS_COMET INGELABS_COMET 1949 +pollux_wiz MACH_POLLUX_WIZ POLLUX_WIZ 1950 +blackstone MACH_BLACKSTONE BLACKSTONE 1951 +topaz MACH_TOPAZ TOPAZ 1952 +aixle MACH_AIXLE AIXLE 1953 +mw998 MACH_MW998 MW998 1954 +nokia_rx51 MACH_NOKIA_RX51 NOKIA_RX51 1955 +vsc5605ev MACH_VSC5605EV VSC5605EV 1956 +nt98700dk MACH_NT98700DK NT98700DK 1957 +icontact MACH_ICONTACT ICONTACT 1958 +swarco_frcpu MACH_SWARCO_FRCPU SWARCO_FRCPU 1959 +swarco_scpu MACH_SWARCO_SCPU SWARCO_SCPU 1960 +bbox_p16 MACH_BBOX_P16 BBOX_P16 1961 +bstd MACH_BSTD BSTD 1962 +sbc2440ii MACH_SBC2440II SBC2440II 1963 +pcm034 MACH_PCM034 PCM034 1964 +neso MACH_NESO NESO 1965 +wlnx_9g20 MACH_WLNX_9G20 WLNX_9G20 1966 +omap_zoom2 MACH_OMAP_ZOOM2 OMAP_ZOOM2 1967 +totemnova MACH_TOTEMNOVA TOTEMNOVA 1968 +c5000 MACH_C5000 C5000 1969 +unipo_at91sam9263 MACH_UNIPO_AT91SAM9263 UNIPO_AT91SAM9263 1970 +ethernut5 MACH_ETHERNUT5 ETHERNUT5 1971 +arm11 MACH_ARM11 ARM11 1972 +cpuat9260 MACH_CPUAT9260 CPUAT9260 1973 +cpupxa255 MACH_CPUPXA255 CPUPXA255 1974 +eukrea_cpuimx27 MACH_EUKREA_CPUIMX27 EUKREA_CPUIMX27 1975 +cheflux MACH_CHEFLUX CHEFLUX 1976 +eb_cpux9k2 MACH_EB_CPUX9K2 EB_CPUX9K2 1977 +opcotec MACH_OPCOTEC OPCOTEC 1978 +yt MACH_YT YT 1979 +motoq MACH_MOTOQ MOTOQ 1980 +bsb1 MACH_BSB1 BSB1 1981 +acs5k MACH_ACS5K ACS5K 1982 +milan MACH_MILAN MILAN 1983 +quartzv2 MACH_QUARTZV2 QUARTZV2 1984 +rsvp MACH_RSVP RSVP 1985 +rmp200 MACH_RMP200 RMP200 1986 +snapper_9260 MACH_SNAPPER_9260 SNAPPER_9260 1987 +dsm320 MACH_DSM320 DSM320 1988 +adsgcm MACH_ADSGCM ADSGCM 1989 +ase2_400 MACH_ASE2_400 ASE2_400 1990 +pizza MACH_PIZZA PIZZA 1991 +spot_ngpl MACH_SPOT_NGPL SPOT_NGPL 1992 +armata MACH_ARMATA ARMATA 1993 +exeda MACH_EXEDA EXEDA 1994 +mx31sf005 MACH_MX31SF005 MX31SF005 1995 +f5d8231_4_v2 MACH_F5D8231_4_V2 F5D8231_4_V2 1996 +q2440 MACH_Q2440 Q2440 1997 +qq2440 MACH_QQ2440 QQ2440 1998 +mini2440 MACH_MINI2440 MINI2440 1999 +colibri300 MACH_COLIBRI300 COLIBRI300 2000 +jades MACH_JADES JADES 2001 +spark MACH_SPARK SPARK 2002 +benzina MACH_BENZINA BENZINA 2003 +blaze MACH_BLAZE BLAZE 2004 +linkstation_ls_hgl MACH_LINKSTATION_LS_HGL LINKSTATION_LS_HGL 2005 +htckovsky MACH_HTCKOVSKY HTCKOVSKY 2006 +sony_prs505 MACH_SONY_PRS505 SONY_PRS505 2007 +hanlin_v3 MACH_HANLIN_V3 HANLIN_V3 2008 +sapphira MACH_SAPPHIRA SAPPHIRA 2009 +dack_sda_01 MACH_DACK_SDA_01 DACK_SDA_01 2010 +armbox MACH_ARMBOX ARMBOX 2011 +harris_rvp MACH_HARRIS_RVP HARRIS_RVP 2012 +ribaldo MACH_RIBALDO RIBALDO 2013 +agora MACH_AGORA AGORA 2014 +omap3_mini MACH_OMAP3_MINI OMAP3_MINI 2015 +a9sam6432_b MACH_A9SAM6432_B A9SAM6432_B 2016 +usg2410 MACH_USG2410 USG2410 2017 +pc72052_i10_revb MACH_PC72052_I10_REVB PC72052_I10_REVB 2018 +mx35_exm32 MACH_MX35_EXM32 MX35_EXM32 2019 +topas910 MACH_TOPAS910 TOPAS910 2020 +hyena MACH_HYENA HYENA 2021 +pospax MACH_POSPAX POSPAX 2022 +hdl_gx MACH_HDL_GX HDL_GX 2023 +ctera_4bay MACH_CTERA_4BAY CTERA_4BAY 2024 +ctera_plug_c MACH_CTERA_PLUG_C CTERA_PLUG_C 2025 +crwea_plug_i MACH_CRWEA_PLUG_I CRWEA_PLUG_I 2026 +egauge2 MACH_EGAUGE2 EGAUGE2 2027 +didj MACH_DIDJ DIDJ 2028 +m_s3c2443 MACH_MEISTER MEISTER 2029 +htcblackstone MACH_HTCBLACKSTONE HTCBLACKSTONE 2030 +cpuat9g20 MACH_CPUAT9G20 CPUAT9G20 2031 +smdk6440 MACH_SMDK6440 SMDK6440 2032 +omap_35xx_mvp MACH_OMAP_35XX_MVP OMAP_35XX_MVP 2033 +ctera_plug_i MACH_CTERA_PLUG_I CTERA_PLUG_I 2034 +pvg610_100 MACH_PVG610 PVG610 2035 +hprw6815 MACH_HPRW6815 HPRW6815 2036 +omap3_oswald MACH_OMAP3_OSWALD OMAP3_OSWALD 2037 +nas4220b MACH_NAS4220B NAS4220B 2038 +htcraphael_cdma MACH_HTCRAPHAEL_CDMA HTCRAPHAEL_CDMA 2039 +htcdiamond_cdma MACH_HTCDIAMOND_CDMA HTCDIAMOND_CDMA 2040 +scaler MACH_SCALER SCALER 2041 +zylonite2 MACH_ZYLONITE2 ZYLONITE2 2042 +aspenite MACH_ASPENITE ASPENITE 2043 +teton MACH_TETON TETON 2044 +ttc_dkb MACH_TTC_DKB TTC_DKB 2045 +bishop2 MACH_BISHOP2 BISHOP2 2046 +ippv5 MACH_IPPV5 IPPV5 2047 +farm926 MACH_FARM926 FARM926 2048 +mmccpu MACH_MMCCPU MMCCPU 2049 +sgmsfl MACH_SGMSFL SGMSFL 2050 +tt8000 MACH_TT8000 TT8000 2051 +zrn4300lp MACH_ZRN4300LP ZRN4300LP 2052 +mptc MACH_MPTC MPTC 2053 +h6051 MACH_H6051 H6051 2054 +pvg610_101 MACH_PVG610_101 PVG610_101 2055 +stamp9261_pc_evb MACH_STAMP9261_PC_EVB STAMP9261_PC_EVB 2056 +pelco_odysseus MACH_PELCO_ODYSSEUS PELCO_ODYSSEUS 2057 +tny_a9260 MACH_TNY_A9260 TNY_A9260 2058 +tny_a9g20 MACH_TNY_A9G20 TNY_A9G20 2059 +aesop_mp2530f MACH_AESOP_MP2530F AESOP_MP2530F 2060 +dx900 MACH_DX900 DX900 2061 +cpodc2 MACH_CPODC2 CPODC2 2062 +tilt_8925 MACH_TILT_8925 TILT_8925 2063 +davinci_dm357_evm MACH_DAVINCI_DM357_EVM DAVINCI_DM357_EVM 2064 +swordfish MACH_SWORDFISH SWORDFISH 2065 +corvus MACH_CORVUS CORVUS 2066 +taurus MACH_TAURUS TAURUS 2067 +axm MACH_AXM AXM 2068 +axc MACH_AXC AXC 2069 +baby MACH_BABY BABY 2070 +mp200 MACH_MP200 MP200 2071 +pcm043 MACH_PCM043 PCM043 2072 +hanlin_v3c MACH_HANLIN_V3C HANLIN_V3C 2073 +kbk9g20 MACH_KBK9G20 KBK9G20 2074 +adsturbog5 MACH_ADSTURBOG5 ADSTURBOG5 2075 +avenger_lite1 MACH_AVENGER_LITE1 AVENGER_LITE1 2076 +suc82x MACH_SUC SUC 2077 +at91sam7s256 MACH_AT91SAM7S256 AT91SAM7S256 2078 +mendoza MACH_MENDOZA MENDOZA 2079 +kira MACH_KIRA KIRA 2080 +mx1hbm MACH_MX1HBM MX1HBM 2081 +quatro43xx MACH_QUATRO43XX QUATRO43XX 2082 +quatro4230 MACH_QUATRO4230 QUATRO4230 2083 +nsb400 MACH_NSB400 NSB400 2084 +drp255 MACH_DRP255 DRP255 2085 +thoth MACH_THOTH THOTH 2086 +firestone MACH_FIRESTONE FIRESTONE 2087 +asusp750 MACH_ASUSP750 ASUSP750 2088 +ctera_dl MACH_CTERA_DL CTERA_DL 2089 +socr MACH_SOCR SOCR 2090 +htcoxygen MACH_HTCOXYGEN HTCOXYGEN 2091 +heroc MACH_HEROC HEROC 2092 +zeno6800 MACH_ZENO6800 ZENO6800 2093 +sc2mcs MACH_SC2MCS SC2MCS 2094 +gene100 MACH_GENE100 GENE100 2095 +as353x MACH_AS353X AS353X 2096 +sheevaplug MACH_SHEEVAPLUG SHEEVAPLUG 2097 +at91sam9g20 MACH_AT91SAM9G20 AT91SAM9G20 2098 +mv88f6192gtw_fe MACH_MV88F6192GTW_FE MV88F6192GTW_FE 2099 +cc9200 MACH_CC9200 CC9200 2100 +sm9200 MACH_SM9200 SM9200 2101 +tp9200 MACH_TP9200 TP9200 2102 +snapperdv MACH_SNAPPERDV SNAPPERDV 2103 +avengers_lite MACH_AVENGERS_LITE AVENGERS_LITE 2104 +avengers_lite1 MACH_AVENGERS_LITE1 AVENGERS_LITE1 2105 +omap3axon MACH_OMAP3AXON OMAP3AXON 2106 +ma8xx MACH_MA8XX MA8XX 2107 +mp201ek MACH_MP201EK MP201EK 2108 +davinci_tux MACH_DAVINCI_TUX DAVINCI_TUX 2109 +mpa1600 MACH_MPA1600 MPA1600 2110 +pelco_troy MACH_PELCO_TROY PELCO_TROY 2111 +nsb667 MACH_NSB667 NSB667 2112 +rovers5_4mpix MACH_ROVERS5_4MPIX ROVERS5_4MPIX 2113 +twocom MACH_TWOCOM TWOCOM 2114 +ubisys_p9_rcu3r2 MACH_UBISYS_P9_RCU3R2 UBISYS_P9_RCU3R2 2115 +hero_espresso MACH_HERO_ESPRESSO HERO_ESPRESSO 2116 +afeusb MACH_AFEUSB AFEUSB 2117 +t830 MACH_T830 T830 2118 +spd8020_cc MACH_SPD8020_CC SPD8020_CC 2119 +om_3d7k MACH_OM_3D7K OM_3D7K 2120 +picocom2 MACH_PICOCOM2 PICOCOM2 2121 +uwg4mx27 MACH_UWG4MX27 UWG4MX27 2122 +uwg4mx31 MACH_UWG4MX31 UWG4MX31 2123 +cherry MACH_CHERRY CHERRY 2124 +mx51_babbage MACH_MX51_BABBAGE MX51_BABBAGE 2125 +s3c2440turkiye MACH_S3C2440TURKIYE S3C2440TURKIYE 2126 +tx37 MACH_TX37 TX37 2127 +sbc2800_9g20 MACH_SBC2800_9G20 SBC2800_9G20 2128 +benzglb MACH_BENZGLB BENZGLB 2129 +benztd MACH_BENZTD BENZTD 2130 +cartesio_plus MACH_CARTESIO_PLUS CARTESIO_PLUS 2131 +solrad_g20 MACH_SOLRAD_G20 SOLRAD_G20 2132 +mx27wallace MACH_MX27WALLACE MX27WALLACE 2133 +fmzwebmodul MACH_FMZWEBMODUL FMZWEBMODUL 2134 +rd78x00_masa MACH_RD78X00_MASA RD78X00_MASA 2135 +smallogger MACH_SMALLOGGER SMALLOGGER 2136 +ccw9p9215 MACH_CCW9P9215 CCW9P9215 2137 +dm355_leopard MACH_DM355_LEOPARD DM355_LEOPARD 2138 +ts219 MACH_TS219 TS219 2139 +tny_a9263 MACH_TNY_A9263 TNY_A9263 2140 +apollo MACH_APOLLO APOLLO 2141 +at91cap9stk MACH_AT91CAP9STK AT91CAP9STK 2142 +spc300 MACH_SPC300 SPC300 2143 +eko MACH_EKO EKO 2144 +ccw9m2443 MACH_CCW9M2443 CCW9M2443 2145 +ccw9m2443js MACH_CCW9M2443JS CCW9M2443JS 2146 +m2m_router_device MACH_M2M_ROUTER_DEVICE M2M_ROUTER_DEVICE 2147 +str9104nas MACH_STAR9104NAS STAR9104NAS 2148 +pca100 MACH_PCA100 PCA100 2149 +z3_dm365_mod_01 MACH_Z3_DM365_MOD_01 Z3_DM365_MOD_01 2150 +hipox MACH_HIPOX HIPOX 2151 +omap3_piteds MACH_OMAP3_PITEDS OMAP3_PITEDS 2152 +bm150r MACH_BM150R BM150R 2153 +tbone MACH_TBONE TBONE 2154 +merlin MACH_MERLIN MERLIN 2155 +falcon MACH_FALCON FALCON 2156 +davinci_da850_evm MACH_DAVINCI_DA850_EVM DAVINCI_DA850_EVM 2157 +s5p6440 MACH_S5P6440 S5P6440 2158 +at91sam9g10ek MACH_AT91SAM9G10EK AT91SAM9G10EK 2159 +omap_4430sdp MACH_OMAP_4430SDP OMAP_4430SDP 2160 +lpc313x MACH_LPC313X LPC313X 2161 +magx_zn5 MACH_MAGX_ZN5 MAGX_ZN5 2162 +magx_em30 MACH_MAGX_EM30 MAGX_EM30 2163 +magx_ve66 MACH_MAGX_VE66 MAGX_VE66 2164 +meesc MACH_MEESC MEESC 2165 +otc570 MACH_OTC570 OTC570 2166 +bcu2412 MACH_BCU2412 BCU2412 2167 +beacon MACH_BEACON BEACON 2168 +actia_tgw MACH_ACTIA_TGW ACTIA_TGW 2169 +e4430 MACH_E4430 E4430 2170 +ql300 MACH_QL300 QL300 2171 +btmavb101 MACH_BTMAVB101 BTMAVB101 2172 +btmawb101 MACH_BTMAWB101 BTMAWB101 2173 +sq201 MACH_SQ201 SQ201 2174 +quatro45xx MACH_QUATRO45XX QUATRO45XX 2175 +openpad MACH_OPENPAD OPENPAD 2176 +tx25 MACH_TX25 TX25 2177 +omap3_torpedo MACH_OMAP3_TORPEDO OMAP3_TORPEDO 2178 +htcraphael_k MACH_HTCRAPHAEL_K HTCRAPHAEL_K 2179 +lal43 MACH_LAL43 LAL43 2181 +htcraphael_cdma500 MACH_HTCRAPHAEL_CDMA500 HTCRAPHAEL_CDMA500 2182 +anw6410 MACH_ANW6410 ANW6410 2183 +htcprophet MACH_HTCPROPHET HTCPROPHET 2185 +cfa_10022 MACH_CFA_10022 CFA_10022 2186 +imx27_visstrim_m10 MACH_IMX27_VISSTRIM_M10 IMX27_VISSTRIM_M10 2187 +px2imx27 MACH_PX2IMX27 PX2IMX27 2188 +stm3210e_eval MACH_STM3210E_EVAL STM3210E_EVAL 2189 +dvs10 MACH_DVS10 DVS10 2190 +portuxg20 MACH_PORTUXG20 PORTUXG20 2191 +arm_spv MACH_ARM_SPV ARM_SPV 2192 +smdkc110 MACH_SMDKC110 SMDKC110 2193 +cabespresso MACH_CABESPRESSO CABESPRESSO 2194 +hmc800 MACH_HMC800 HMC800 2195 +sholes MACH_SHOLES SHOLES 2196 +btmxc31 MACH_BTMXC31 BTMXC31 2197 +dt501 MACH_DT501 DT501 2198 +ktx MACH_KTX KTX 2199 +omap3517evm MACH_OMAP3517EVM OMAP3517EVM 2200 +netspace_v2 MACH_NETSPACE_V2 NETSPACE_V2 2201 +netspace_max_v2 MACH_NETSPACE_MAX_V2 NETSPACE_MAX_V2 2202 +d2net_v2 MACH_D2NET_V2 D2NET_V2 2203 +net2big_v2 MACH_NET2BIG_V2 NET2BIG_V2 2204 +net4big_v2 MACH_NET4BIG_V2 NET4BIG_V2 2205 +net5big_v2 MACH_NET5BIG_V2 NET5BIG_V2 2206 +endb2443 MACH_ENDB2443 ENDB2443 2207 +inetspace_v2 MACH_INETSPACE_V2 INETSPACE_V2 2208 +tros MACH_TROS TROS 2209 +pelco_homer MACH_PELCO_HOMER PELCO_HOMER 2210 +ofsp8 MACH_OFSP8 OFSP8 2211 +at91sam9g45ekes MACH_AT91SAM9G45EKES AT91SAM9G45EKES 2212 +guf_cupid MACH_GUF_CUPID GUF_CUPID 2213 +eab1r MACH_EAB1R EAB1R 2214 +desirec MACH_DESIREC DESIREC 2215 +cordoba MACH_CORDOBA CORDOBA 2216 +irvine MACH_IRVINE IRVINE 2217 +sff772 MACH_SFF772 SFF772 2218 +pelco_milano MACH_PELCO_MILANO PELCO_MILANO 2219 +pc7302 MACH_PC7302 PC7302 2220 +bip6000 MACH_BIP6000 BIP6000 2221 +silvermoon MACH_SILVERMOON SILVERMOON 2222 +vc0830 MACH_VC0830 VC0830 2223 +dt430 MACH_DT430 DT430 2224 +ji42pf MACH_JI42PF JI42PF 2225 +gnet_ksm MACH_GNET_KSM GNET_KSM 2226 +gnet_sgm MACH_GNET_SGM GNET_SGM 2227 +gnet_sgr MACH_GNET_SGR GNET_SGR 2228 +omap3_icetekevm MACH_OMAP3_ICETEKEVM OMAP3_ICETEKEVM 2229 +pnp MACH_PNP PNP 2230 +ctera_2bay_k MACH_CTERA_2BAY_K CTERA_2BAY_K 2231 +ctera_2bay_u MACH_CTERA_2BAY_U CTERA_2BAY_U 2232 +sas_c MACH_SAS_C SAS_C 2233 +vma2315 MACH_VMA2315 VMA2315 2234 +vcs MACH_VCS VCS 2235 +spear600 MACH_SPEAR600 SPEAR600 2236 +spear300 MACH_SPEAR300 SPEAR300 2237 +spear1300 MACH_SPEAR1300 SPEAR1300 2238 +lilly1131 MACH_LILLY1131 LILLY1131 2239 +arvoo_ax301 MACH_ARVOO_AX301 ARVOO_AX301 2240 +mapphone MACH_MAPPHONE MAPPHONE 2241 +legend MACH_LEGEND LEGEND 2242 +salsa MACH_SALSA SALSA 2243 +lounge MACH_LOUNGE LOUNGE 2244 +vision MACH_VISION VISION 2245 +vmb20 MACH_VMB20 VMB20 2246 +hy2410 MACH_HY2410 HY2410 2247 +hy9315 MACH_HY9315 HY9315 2248 +bullwinkle MACH_BULLWINKLE BULLWINKLE 2249 +arm_ultimator2 MACH_ARM_ULTIMATOR2 ARM_ULTIMATOR2 2250 +vs_v210 MACH_VS_V210 VS_V210 2252 +vs_v212 MACH_VS_V212 VS_V212 2253 +hmt MACH_HMT HMT 2254 +km_kirkwood MACH_KM_KIRKWOOD KM_KIRKWOOD 2255 +vesper MACH_VESPER VESPER 2256 +str9 MACH_STR9 STR9 2257 +omap3_wl_ff MACH_OMAP3_WL_FF OMAP3_WL_FF 2258 +simcom MACH_SIMCOM SIMCOM 2259 +mcwebio MACH_MCWEBIO MCWEBIO 2260 +omap3_phrazer MACH_OMAP3_PHRAZER OMAP3_PHRAZER 2261 +darwin MACH_DARWIN DARWIN 2262 +oratiscomu MACH_ORATISCOMU ORATISCOMU 2263 +rtsbc20 MACH_RTSBC20 RTSBC20 2264 +sgh_i780 MACH_I780 I780 2265 +gemini324 MACH_GEMINI324 GEMINI324 2266 +oratislan MACH_ORATISLAN ORATISLAN 2267 +oratisalog MACH_ORATISALOG ORATISALOG 2268 +oratismadi MACH_ORATISMADI ORATISMADI 2269 +oratisot16 MACH_ORATISOT16 ORATISOT16 2270 +oratisdesk MACH_ORATISDESK ORATISDESK 2271 +vexpress MACH_VEXPRESS VEXPRESS 2272 +sintexo MACH_SINTEXO SINTEXO 2273 +cm3389 MACH_CM3389 CM3389 2274 +omap3_cio MACH_OMAP3_CIO OMAP3_CIO 2275 +sgh_i900 MACH_SGH_I900 SGH_I900 2276 +bst100 MACH_BST100 BST100 2277 +passion MACH_PASSION PASSION 2278 +indesign_at91sam MACH_INDESIGN_AT91SAM INDESIGN_AT91SAM 2279 +c4_badger MACH_C4_BADGER C4_BADGER 2280 +c4_viper MACH_C4_VIPER C4_VIPER 2281 +d2net MACH_D2NET D2NET 2282 +bigdisk MACH_BIGDISK BIGDISK 2283 +notalvision MACH_NOTALVISION NOTALVISION 2284 +omap3_kboc MACH_OMAP3_KBOC OMAP3_KBOC 2285 +cyclone MACH_CYCLONE CYCLONE 2286 +ninja MACH_NINJA NINJA 2287 +at91sam9g20ek_2mmc MACH_AT91SAM9G20EK_2MMC AT91SAM9G20EK_2MMC 2288 +bcmring MACH_BCMRING BCMRING 2289 +resol_dl2 MACH_RESOL_DL2 RESOL_DL2 2290 +ifosw MACH_IFOSW IFOSW 2291 +htcrhodium MACH_HTCRHODIUM HTCRHODIUM 2292 +htctopaz MACH_HTCTOPAZ HTCTOPAZ 2293 +matrix504 MACH_MATRIX504 MATRIX504 2294 +mrfsa MACH_MRFSA MRFSA 2295 +sc_p270 MACH_SC_P270 SC_P270 2296 +atlas5_evb MACH_ATLAS5_EVB ATLAS5_EVB 2297 +pelco_lobox MACH_PELCO_LOBOX PELCO_LOBOX 2298 +dilax_pcu200 MACH_DILAX_PCU200 DILAX_PCU200 2299 +leonardo MACH_LEONARDO LEONARDO 2300 +zoran_approach7 MACH_ZORAN_APPROACH7 ZORAN_APPROACH7 2301 +dp6xx MACH_DP6XX DP6XX 2302 +bcm2153_vesper MACH_BCM2153_VESPER BCM2153_VESPER 2303 +mahimahi MACH_MAHIMAHI MAHIMAHI 2304 +clickc MACH_CLICKC CLICKC 2305 +zb_gateway MACH_ZB_GATEWAY ZB_GATEWAY 2306 +tazcard MACH_TAZCARD TAZCARD 2307 +tazdev MACH_TAZDEV TAZDEV 2308 +annax_cb_arm MACH_ANNAX_CB_ARM ANNAX_CB_ARM 2309 +annax_dm3 MACH_ANNAX_DM3 ANNAX_DM3 2310 +cerebric MACH_CEREBRIC CEREBRIC 2311 +orca MACH_ORCA ORCA 2312 +pc9260 MACH_PC9260 PC9260 2313 +ems285a MACH_EMS285A EMS285A 2314 +gec2410 MACH_GEC2410 GEC2410 2315 +gec2440 MACH_GEC2440 GEC2440 2316 +mw903 MACH_ARCH_MW903 ARCH_MW903 2317 +mw2440 MACH_MW2440 MW2440 2318 +ecac2378 MACH_ECAC2378 ECAC2378 2319 +tazkiosk MACH_TAZKIOSK TAZKIOSK 2320 +whiterabbit_mch MACH_WHITERABBIT_MCH WHITERABBIT_MCH 2321 +sbox9263 MACH_SBOX9263 SBOX9263 2322 +smdk6442 MACH_SMDK6442 SMDK6442 2324 +openrd_base MACH_OPENRD_BASE OPENRD_BASE 2325 +incredible MACH_INCREDIBLE INCREDIBLE 2326 +incrediblec MACH_INCREDIBLEC INCREDIBLEC 2327 +heroct MACH_HEROCT HEROCT 2328 +mmnet1000 MACH_MMNET1000 MMNET1000 2329 +devkit8000 MACH_DEVKIT8000 DEVKIT8000 2330 +devkit9000 MACH_DEVKIT9000 DEVKIT9000 2331 +mx31txtr MACH_MX31TXTR MX31TXTR 2332 +u380 MACH_U380 U380 2333 +oamp3_hualu MACH_HUALU_BOARD HUALU_BOARD 2334 +npcmx50 MACH_NPCMX50 NPCMX50 2335 +mx51_efikamx MACH_MX51_EFIKAMX MX51_EFIKAMX 2336 +mx51_lange52 MACH_MX51_LANGE52 MX51_LANGE52 2337 +riom MACH_RIOM RIOM 2338 +comcas MACH_COMCAS COMCAS 2339 +wsi_mx27 MACH_WSI_MX27 WSI_MX27 2340 +cm_t35 MACH_CM_T35 CM_T35 2341 +net2big MACH_NET2BIG NET2BIG 2342 +motorola_a1600 MACH_MOTOROLA_A1600 MOTOROLA_A1600 2343 +igep0020 MACH_IGEP0020 IGEP0020 2344 +igep0010 MACH_IGEP0010 IGEP0010 2345 +mv6281gtwge2 MACH_MV6281GTWGE2 MV6281GTWGE2 2346 +scat100 MACH_SCAT100 SCAT100 2347 +sanmina MACH_SANMINA SANMINA 2348 +momento MACH_MOMENTO MOMENTO 2349 +nuc9xx MACH_NUC9XX NUC9XX 2350 +nuc910evb MACH_NUC910EVB NUC910EVB 2351 +nuc920evb MACH_NUC920EVB NUC920EVB 2352 +nuc950evb MACH_NUC950EVB NUC950EVB 2353 +nuc945evb MACH_NUC945EVB NUC945EVB 2354 +nuc960evb MACH_NUC960EVB NUC960EVB 2355 +nuc932evb MACH_NUC932EVB NUC932EVB 2356 +nuc900 MACH_NUC900 NUC900 2357 +sd1soc MACH_SD1SOC SD1SOC 2358 +ln2440bc MACH_LN2440BC LN2440BC 2359 +rsbc MACH_RSBC RSBC 2360 +openrd_client MACH_OPENRD_CLIENT OPENRD_CLIENT 2361 +hpipaq11x MACH_HPIPAQ11X HPIPAQ11X 2362 +wayland MACH_WAYLAND WAYLAND 2363 +acnbsx102 MACH_ACNBSX102 ACNBSX102 2364 +hwat91 MACH_HWAT91 HWAT91 2365 +at91sam9263cs MACH_AT91SAM9263CS AT91SAM9263CS 2366 +csb732 MACH_CSB732 CSB732 2367 +u8500 MACH_U8500 U8500 2368 +huqiu MACH_HUQIU HUQIU 2369 +mx51_efikasb MACH_MX51_EFIKASB MX51_EFIKASB 2370 +pmt1g MACH_PMT1G PMT1G 2371 +htcelf MACH_HTCELF HTCELF 2372 +armadillo420 MACH_ARMADILLO420 ARMADILLO420 2373 +armadillo440 MACH_ARMADILLO440 ARMADILLO440 2374 +u_chip_dual_arm MACH_U_CHIP_DUAL_ARM U_CHIP_DUAL_ARM 2375 +csr_bdb3 MACH_CSR_BDB3 CSR_BDB3 2376 +dolby_cat1018 MACH_DOLBY_CAT1018 DOLBY_CAT1018 2377 +hy9307 MACH_HY9307 HY9307 2378 +aspire_easystore MACH_A_ES A_ES 2379 +davinci_irif MACH_DAVINCI_IRIF DAVINCI_IRIF 2380 +agama9263 MACH_AGAMA9263 AGAMA9263 2381 +marvell_jasper MACH_MARVELL_JASPER MARVELL_JASPER 2382 +flint MACH_FLINT FLINT 2383 +tavorevb3 MACH_TAVOREVB3 TAVOREVB3 2384 +sch_m490 MACH_SCH_M490 SCH_M490 2386 +rbl01 MACH_RBL01 RBL01 2387 +omnifi MACH_OMNIFI OMNIFI 2388 +otavalo MACH_OTAVALO OTAVALO 2389 +htc_excalibur_s620 MACH_HTC_EXCALIBUR_S620 HTC_EXCALIBUR_S620 2391 +htc_opal MACH_HTC_OPAL HTC_OPAL 2392 +touchbook MACH_TOUCHBOOK TOUCHBOOK 2393 +latte MACH_LATTE LATTE 2394 +xa200 MACH_XA200 XA200 2395 +nimrod MACH_NIMROD NIMROD 2396 +cc9p9215_3g MACH_CC9P9215_3G CC9P9215_3G 2397 +cc9p9215_3gjs MACH_CC9P9215_3GJS CC9P9215_3GJS 2398 +tk71 MACH_TK71 TK71 2399 +comham3525 MACH_COMHAM3525 COMHAM3525 2400 +mx31erebus MACH_MX31EREBUS MX31EREBUS 2401 +mcardmx27 MACH_MCARDMX27 MCARDMX27 2402 +paradise MACH_PARADISE PARADISE 2403 +tide MACH_TIDE TIDE 2404 +wzl2440 MACH_WZL2440 WZL2440 2405 +sdrdemo MACH_SDRDEMO SDRDEMO 2406 +ethercan2 MACH_ETHERCAN2 ETHERCAN2 2407 +ecmimg20 MACH_ECMIMG20 ECMIMG20 2408 +omap_dragon MACH_OMAP_DRAGON OMAP_DRAGON 2409 +halo MACH_HALO HALO 2410 +huangshan MACH_HUANGSHAN HUANGSHAN 2411 +vl_ma2sc MACH_VL_MA2SC VL_MA2SC 2412 +raumfeld_rc MACH_RAUMFELD_RC RAUMFELD_RC 2413 +raumfeld_connector MACH_RAUMFELD_CONNECTOR RAUMFELD_CONNECTOR 2414 +raumfeld_speaker MACH_RAUMFELD_SPEAKER RAUMFELD_SPEAKER 2415 +multibus_master MACH_MULTIBUS_MASTER MULTIBUS_MASTER 2416 +multibus_pbk MACH_MULTIBUS_PBK MULTIBUS_PBK 2417 +tnetv107x MACH_TNETV107X TNETV107X 2418 +snake MACH_SNAKE SNAKE 2419 +cwmx27 MACH_CWMX27 CWMX27 2420 +sch_m480 MACH_SCH_M480 SCH_M480 2421 +platypus MACH_PLATYPUS PLATYPUS 2422 +pss2 MACH_PSS2 PSS2 2423 +davinci_apm150 MACH_DAVINCI_APM150 DAVINCI_APM150 2424 +str9100 MACH_STR9100 STR9100 2425 +net5big MACH_NET5BIG NET5BIG 2426 +seabed9263 MACH_SEABED9263 SEABED9263 2427 +mx51_m2id MACH_MX51_M2ID MX51_M2ID 2428 +octvocplus_eb MACH_OCTVOCPLUS_EB OCTVOCPLUS_EB 2429 +klk_firefox MACH_KLK_FIREFOX KLK_FIREFOX 2430 +klk_wirma_module MACH_KLK_WIRMA_MODULE KLK_WIRMA_MODULE 2431 +klk_wirma_mmi MACH_KLK_WIRMA_MMI KLK_WIRMA_MMI 2432 +supersonic MACH_SUPERSONIC SUPERSONIC 2433 +liberty MACH_LIBERTY LIBERTY 2434 +mh355 MACH_MH355 MH355 2435 +pc7802 MACH_PC7802 PC7802 2436 +gnet_sgc MACH_GNET_SGC GNET_SGC 2437 +einstein15 MACH_EINSTEIN15 EINSTEIN15 2438 +cmpd MACH_CMPD CMPD 2439 +davinci_hase1 MACH_DAVINCI_HASE1 DAVINCI_HASE1 2440 +lgeincitephone MACH_LGEINCITEPHONE LGEINCITEPHONE 2441 +ea313x MACH_EA313X EA313X 2442 +fwbd_39064 MACH_FWBD_39064 FWBD_39064 2443 +fwbd_390128 MACH_FWBD_390128 FWBD_390128 2444 +pelco_moe MACH_PELCO_MOE PELCO_MOE 2445 +minimix27 MACH_MINIMIX27 MINIMIX27 2446 +omap3_thunder MACH_OMAP3_THUNDER OMAP3_THUNDER 2447 +passionc MACH_PASSIONC PASSIONC 2448 +mx27amata MACH_MX27AMATA MX27AMATA 2449 +bgat1 MACH_BGAT1 BGAT1 2450 +buzz MACH_BUZZ BUZZ 2451 +mb9g20 MACH_MB9G20 MB9G20 2452 +yushan MACH_YUSHAN YUSHAN 2453 +lizard MACH_LIZARD LIZARD 2454 +omap3polycom MACH_OMAP3POLYCOM OMAP3POLYCOM 2455 +smdkv210 MACH_SMDKV210 SMDKV210 2456 +bravo MACH_BRAVO BRAVO 2457 +siogentoo1 MACH_SIOGENTOO1 SIOGENTOO1 2458 +siogentoo2 MACH_SIOGENTOO2 SIOGENTOO2 2459 +sm3k MACH_SM3K SM3K 2460 +acer_tempo_f900 MACH_ACER_TEMPO_F900 ACER_TEMPO_F900 2461 +glittertind MACH_GLITTERTIND GLITTERTIND 2463 +omap_zoom3 MACH_OMAP_ZOOM3 OMAP_ZOOM3 2464 +omap_3630sdp MACH_OMAP_3630SDP OMAP_3630SDP 2465 +cybook2440 MACH_CYBOOK2440 CYBOOK2440 2466 +torino_s MACH_TORINO_S TORINO_S 2467 +havana MACH_HAVANA HAVANA 2468 +beaumont_11 MACH_BEAUMONT_11 BEAUMONT_11 2469 +vanguard MACH_VANGUARD VANGUARD 2470 +s5pc110_draco MACH_S5PC110_DRACO S5PC110_DRACO 2471 +cartesio_two MACH_CARTESIO_TWO CARTESIO_TWO 2472 +aster MACH_ASTER ASTER 2473 +voguesv210 MACH_VOGUESV210 VOGUESV210 2474 +acm500x MACH_ACM500X ACM500X 2475 +km9260 MACH_KM9260 KM9260 2476 +nideflexg1 MACH_NIDEFLEXG1 NIDEFLEXG1 2477 +ctera_plug_io MACH_CTERA_PLUG_IO CTERA_PLUG_IO 2478 +smartq7 MACH_SMARTQ7 SMARTQ7 2479 +at91sam9g10ek2 MACH_AT91SAM9G10EK2 AT91SAM9G10EK2 2480 +asusp527 MACH_ASUSP527 ASUSP527 2481 +at91sam9g20mpm2 MACH_AT91SAM9G20MPM2 AT91SAM9G20MPM2 2482 +topasa900 MACH_TOPASA900 TOPASA900 2483 +electrum_100 MACH_ELECTRUM_100 ELECTRUM_100 2484 +mx51grb MACH_MX51GRB MX51GRB 2485 +xea300 MACH_XEA300 XEA300 2486 +htcstartrek MACH_HTCSTARTREK HTCSTARTREK 2487 +lima MACH_LIMA LIMA 2488 +csb740 MACH_CSB740 CSB740 2489 +usb_s8815 MACH_USB_S8815 USB_S8815 2490 +watson_efm_plugin MACH_WATSON_EFM_PLUGIN WATSON_EFM_PLUGIN 2491 +milkyway MACH_MILKYWAY MILKYWAY 2492 +g4evm MACH_G4EVM G4EVM 2493 +picomod6 MACH_PICOMOD6 PICOMOD6 2494 +omapl138_hawkboard MACH_OMAPL138_HAWKBOARD OMAPL138_HAWKBOARD 2495 +ip6000 MACH_IP6000 IP6000 2496 +ip6010 MACH_IP6010 IP6010 2497 +utm400 MACH_UTM400 UTM400 2498 +omap3_zybex MACH_OMAP3_ZYBEX OMAP3_ZYBEX 2499 +wireless_space MACH_WIRELESS_SPACE WIRELESS_SPACE 2500 +sx560 MACH_SX560 SX560 2501 +ts41x MACH_TS41X TS41X 2502 +elphel10373 MACH_ELPHEL10373 ELPHEL10373 2503 +rhobot MACH_RHOBOT RHOBOT 2504 +mx51_refresh MACH_MX51_REFRESH MX51_REFRESH 2505 +ls9260 MACH_LS9260 LS9260 2506 +shank MACH_SHANK SHANK 2507 +qsd8x50_st1 MACH_QSD8X50_ST1 QSD8X50_ST1 2508 +at91sam9m10ekes MACH_AT91SAM9M10EKES AT91SAM9M10EKES 2509 +hiram MACH_HIRAM HIRAM 2510 +phy3250 MACH_PHY3250 PHY3250 2511 +ea3250 MACH_EA3250 EA3250 2512 +fdi3250 MACH_FDI3250 FDI3250 2513 +at91sam9263nit MACH_AT91SAM9263NIT AT91SAM9263NIT 2515 +ccmx51 MACH_CCMX51 CCMX51 2516 +ccmx51js MACH_CCMX51JS CCMX51JS 2517 +ccwmx51 MACH_CCWMX51 CCWMX51 2518 +ccwmx51js MACH_CCWMX51JS CCWMX51JS 2519 +mini6410 MACH_MINI6410 MINI6410 2520 +tiny6410 MACH_TINY6410 TINY6410 2521 +nano6410 MACH_NANO6410 NANO6410 2522 +at572d940hfnldb MACH_AT572D940HFNLDB AT572D940HFNLDB 2523 +htcleo MACH_HTCLEO HTCLEO 2524 +avp13 MACH_AVP13 AVP13 2525 +xxsvideod MACH_XXSVIDEOD XXSVIDEOD 2526 +vpnext MACH_VPNEXT VPNEXT 2527 +swarco_itc3 MACH_SWARCO_ITC3 SWARCO_ITC3 2528 +tx51 MACH_TX51 TX51 2529 +dolby_cat1021 MACH_DOLBY_CAT1021 DOLBY_CAT1021 2530 +mx28evk MACH_MX28EVK MX28EVK 2531 +phoenix260 MACH_PHOENIX260 PHOENIX260 2532 +uvaca_stork MACH_UVACA_STORK UVACA_STORK 2533 +smartq5 MACH_SMARTQ5 SMARTQ5 2534 +all3078 MACH_ALL3078 ALL3078 2535 +ctera_2bay_ds MACH_CTERA_2BAY_DS CTERA_2BAY_DS 2536 +siogentoo3 MACH_SIOGENTOO3 SIOGENTOO3 2537 +epb5000 MACH_EPB5000 EPB5000 2538 +hy9263 MACH_HY9263 HY9263 2539 +acer_tempo_m900 MACH_ACER_TEMPO_M900 ACER_TEMPO_M900 2540 +acer_tempo_dx650 MACH_ACER_TEMPO_DX900 ACER_TEMPO_DX900 2541 +acer_tempo_x960 MACH_ACER_TEMPO_X960 ACER_TEMPO_X960 2542 +acer_eten_v900 MACH_ACER_ETEN_V900 ACER_ETEN_V900 2543 +acer_eten_x900 MACH_ACER_ETEN_X900 ACER_ETEN_X900 2544 +bonnell MACH_BONNELL BONNELL 2545 +oht_mx27 MACH_OHT_MX27 OHT_MX27 2546 +htcquartz MACH_HTCQUARTZ HTCQUARTZ 2547 +davinci_dm6467tevm MACH_DAVINCI_DM6467TEVM DAVINCI_DM6467TEVM 2548 +c3ax03 MACH_C3AX03 C3AX03 2549 +mxt_td60 MACH_MXT_TD60 MXT_TD60 2550 +esyx MACH_ESYX ESYX 2551 +dove_db2 MACH_DOVE_DB2 DOVE_DB2 2552 +bulldog MACH_BULLDOG BULLDOG 2553 +derell_me2000 MACH_DERELL_ME2000 DERELL_ME2000 2554 +bcmring_base MACH_BCMRING_BASE BCMRING_BASE 2555 +bcmring_evm MACH_BCMRING_EVM BCMRING_EVM 2556 +bcmring_evm_jazz MACH_BCMRING_EVM_JAZZ BCMRING_EVM_JAZZ 2557 +bcmring_sp MACH_BCMRING_SP BCMRING_SP 2558 +bcmring_sv MACH_BCMRING_SV BCMRING_SV 2559 +bcmring_sv_jazz MACH_BCMRING_SV_JAZZ BCMRING_SV_JAZZ 2560 +bcmring_tablet MACH_BCMRING_TABLET BCMRING_TABLET 2561 +bcmring_vp MACH_BCMRING_VP BCMRING_VP 2562 +bcmring_evm_seikor MACH_BCMRING_EVM_SEIKOR BCMRING_EVM_SEIKOR 2563 +bcmring_sp_wqvga MACH_BCMRING_SP_WQVGA BCMRING_SP_WQVGA 2564 +bcmring_custom MACH_BCMRING_CUSTOM BCMRING_CUSTOM 2565 +acer_s200 MACH_ACER_S200 ACER_S200 2566 +bt270 MACH_BT270 BT270 2567 +iseo MACH_ISEO ISEO 2568 +cezanne MACH_CEZANNE CEZANNE 2569 +lucca MACH_LUCCA LUCCA 2570 +supersmart MACH_SUPERSMART SUPERSMART 2571 +arm11_board MACH_CS_MISANO CS_MISANO 2572 +magnolia2 MACH_MAGNOLIA2 MAGNOLIA2 2573 +emxx MACH_EMXX EMXX 2574 +outlaw MACH_OUTLAW OUTLAW 2575 +riot_bei2 MACH_RIOT_BEI2 RIOT_BEI2 2576 +riot_gx2 MACH_RIOT_VOX RIOT_VOX 2577 +riot_x37 MACH_RIOT_X37 RIOT_X37 2578 +mega25mx MACH_MEGA25MX MEGA25MX 2579 +benzina2 MACH_BENZINA2 BENZINA2 2580 +ignite MACH_IGNITE IGNITE 2581 +foggia MACH_FOGGIA FOGGIA 2582 +arezzo MACH_AREZZO AREZZO 2583 +leica_skywalker MACH_LEICA_SKYWALKER LEICA_SKYWALKER 2584 +jacinto2_jamr MACH_JACINTO2_JAMR JACINTO2_JAMR 2585 +gts_nova MACH_GTS_NOVA GTS_NOVA 2586 +p3600 MACH_P3600 P3600 2587 +dlt2 MACH_DLT2 DLT2 2588 +df3120 MACH_DF3120 DF3120 2589 +ecucore_9g20 MACH_ECUCORE_9G20 ECUCORE_9G20 2590 +nautel_am35xx MACH_NAUTEL_LPC3240 NAUTEL_LPC3240 2591 +glacier MACH_GLACIER GLACIER 2592 +phrazer_bulldog MACH_PHRAZER_BULLDOG PHRAZER_BULLDOG 2593 +omap3_bulldog MACH_OMAP3_BULLDOG OMAP3_BULLDOG 2594 +pca101 MACH_PCA101 PCA101 2595 +buzzc MACH_BUZZC BUZZC 2596 +sasie2 MACH_SASIE2 SASIE2 2597 +smartmeter_dl MACH_SMARTMETER_DL SMARTMETER_DL 2599 +wzl6410 MACH_WZL6410 WZL6410 2600 +wzl6410m MACH_WZL6410M WZL6410M 2601 +wzl6410f MACH_WZL6410F WZL6410F 2602 +wzl6410i MACH_WZL6410I WZL6410I 2603 +spacecom1 MACH_SPACECOM1 SPACECOM1 2604 +pingu920 MACH_PINGU920 PINGU920 2605 +bravoc MACH_BRAVOC BRAVOC 2606 +vdssw MACH_VDSSW VDSSW 2608 +romulus MACH_ROMULUS ROMULUS 2609 +omap_magic MACH_OMAP_MAGIC OMAP_MAGIC 2610 +eltd100 MACH_ELTD100 ELTD100 2611 +capc7117 MACH_CAPC7117 CAPC7117 2612 +swan MACH_SWAN SWAN 2613 +veu MACH_VEU VEU 2614 +rm2 MACH_RM2 RM2 2615 +tt2100 MACH_TT2100 TT2100 2616 +venice MACH_VENICE VENICE 2617 +pc7323 MACH_PC7323 PC7323 2618 +masp MACH_MASP MASP 2619 +fujitsu_tvstbsoc0 MACH_FUJITSU_TVSTBSOC FUJITSU_TVSTBSOC 2620 +fujitsu_tvstbsoc1 MACH_FUJITSU_TVSTBSOC1 FUJITSU_TVSTBSOC1 2621 +lexikon MACH_LEXIKON LEXIKON 2622 +mini2440v2 MACH_MINI2440V2 MINI2440V2 2623 +icontrol MACH_ICONTROL ICONTROL 2624 +gplugd MACH_GPLUGD GPLUGD 2625 +qsd8x50a_st1_1 MACH_QSD8X50A_ST1_1 QSD8X50A_ST1_1 2626 +qsd8x50a_st1_5 MACH_QSD8X50A_ST1_5 QSD8X50A_ST1_5 2627 +bee MACH_BEE BEE 2628 +mx23evk MACH_MX23EVK MX23EVK 2629 +ap4evb MACH_AP4EVB AP4EVB 2630 +stockholm MACH_STOCKHOLM STOCKHOLM 2631 +lpc_h3131 MACH_LPC_H3131 LPC_H3131 2632 +stingray MACH_STINGRAY STINGRAY 2633 +kraken MACH_KRAKEN KRAKEN 2634 +gw2388 MACH_GW2388 GW2388 2635 +jadecpu MACH_JADECPU JADECPU 2636 +carlisle MACH_CARLISLE CARLISLE 2637 +lux_sf9 MACH_LUX_SF9 LUX_SF9 2638 +nemid_tb MACH_NEMID_TB NEMID_TB 2639 +terrier MACH_TERRIER TERRIER 2640 +turbot MACH_TURBOT TURBOT 2641 +sanddab MACH_SANDDAB SANDDAB 2642 +mx35_cicada MACH_MX35_CICADA MX35_CICADA 2643 +ghi2703d MACH_GHI2703D GHI2703D 2644 +lux_sfx9 MACH_LUX_SFX9 LUX_SFX9 2645 +lux_sf9g MACH_LUX_SF9G LUX_SF9G 2646 +lux_edk9 MACH_LUX_EDK9 LUX_EDK9 2647 +hw90240 MACH_HW90240 HW90240 2648 +dm365_leopard MACH_DM365_LEOPARD DM365_LEOPARD 2649 +mityomapl138 MACH_MITYOMAPL138 MITYOMAPL138 2650 +scat110 MACH_SCAT110 SCAT110 2651 +acer_a1 MACH_ACER_A1 ACER_A1 2652 +cmcontrol MACH_CMCONTROL CMCONTROL 2653 +pelco_lamar MACH_PELCO_LAMAR PELCO_LAMAR 2654 +rfp43 MACH_RFP43 RFP43 2655 +sk86r0301 MACH_SK86R0301 SK86R0301 2656 +ctpxa MACH_CTPXA CTPXA 2657 +epb_arm9_a MACH_EPB_ARM9_A EPB_ARM9_A 2658 +guruplug MACH_GURUPLUG GURUPLUG 2659 +spear310 MACH_SPEAR310 SPEAR310 2660 +spear320 MACH_SPEAR320 SPEAR320 2661 +robotx MACH_ROBOTX ROBOTX 2662 +lsxhl MACH_LSXHL LSXHL 2663 +smartlite MACH_SMARTLITE SMARTLITE 2664 +cws2 MACH_CWS2 CWS2 2665 +m619 MACH_M619 M619 2666 +smartview MACH_SMARTVIEW SMARTVIEW 2667 +lsa_salsa MACH_LSA_SALSA LSA_SALSA 2668 +kizbox MACH_KIZBOX KIZBOX 2669 +htccharmer MACH_HTCCHARMER HTCCHARMER 2670 +guf_neso_lt MACH_GUF_NESO_LT GUF_NESO_LT 2671 +pm9g45 MACH_PM9G45 PM9G45 2672 +htcpanther MACH_HTCPANTHER HTCPANTHER 2673 +htcpanther_cdma MACH_HTCPANTHER_CDMA HTCPANTHER_CDMA 2674 +reb01 MACH_REB01 REB01 2675 +aquila MACH_AQUILA AQUILA 2676 +spark_sls_hw2 MACH_SPARK_SLS_HW2 SPARK_SLS_HW2 2677 +esata_sheevaplug MACH_ESATA_SHEEVAPLUG ESATA_SHEEVAPLUG 2678 +msm7x30_surf MACH_MSM7X30_SURF MSM7X30_SURF 2679 +micro2440 MACH_MICRO2440 MICRO2440 2680 +am2440 MACH_AM2440 AM2440 2681 +tq2440 MACH_TQ2440 TQ2440 2682 +ea2478devkit MACH_EA2478DEVKIT EA2478DEVKIT 2683 +ak880x MACH_AK880X AK880X 2684 +cobra3530 MACH_COBRA3530 COBRA3530 2685 +pmppb MACH_PMPPB PMPPB 2686 +u6715 MACH_U6715 U6715 2687 +axar1500_sender MACH_AXAR1500_SENDER AXAR1500_SENDER 2688 +g30_dvb MACH_G30_DVB G30_DVB 2689 +vc088x MACH_VC088X VC088X 2690 +mioa702 MACH_MIOA702 MIOA702 2691 +hpmin MACH_HPMIN HPMIN 2692 +ak880xak MACH_AK880XAK AK880XAK 2693 +arm926tomap850 MACH_ARM926TOMAP850 ARM926TOMAP850 2694 +lkevm MACH_LKEVM LKEVM 2695 +mw6410 MACH_MW6410 MW6410 2696 +terastation_wxl MACH_TERASTATION_WXL TERASTATION_WXL 2697 +cpu8000e MACH_CPU8000E CPU8000E 2698 +tokyo MACH_TOKYO TOKYO 2700 +msm7201a_surf MACH_MSM7201A_SURF MSM7201A_SURF 2701 +msm7201a_ffa MACH_MSM7201A_FFA MSM7201A_FFA 2702 +msm7x25_surf MACH_MSM7X25_SURF MSM7X25_SURF 2703 +msm7x25_ffa MACH_MSM7X25_FFA MSM7X25_FFA 2704 +msm7x27_surf MACH_MSM7X27_SURF MSM7X27_SURF 2705 +msm7x27_ffa MACH_MSM7X27_FFA MSM7X27_FFA 2706 +msm7x30_ffa MACH_MSM7X30_FFA MSM7X30_FFA 2707 +qsd8x50_surf MACH_QSD8X50_SURF QSD8X50_SURF 2708 +qsd8x50_comet MACH_QSD8X50_COMET QSD8X50_COMET 2709 +qsd8x50_ffa MACH_QSD8X50_FFA QSD8X50_FFA 2710 +qsd8x50a_surf MACH_QSD8X50A_SURF QSD8X50A_SURF 2711 +qsd8x50a_ffa MACH_QSD8X50A_FFA QSD8X50A_FFA 2712 +adx_xgcp10 MACH_ADX_XGCP10 ADX_XGCP10 2713 +mcgwumts2a MACH_MCGWUMTS2A MCGWUMTS2A 2714 +mobikt MACH_MOBIKT MOBIKT 2715 +mx53_evk MACH_MX53_EVK MX53_EVK 2716 +igep0030 MACH_IGEP0030 IGEP0030 2717 +axell_h40_h50_ctrl MACH_AXELL_H40_H50_CTRL AXELL_H40_H50_CTRL 2718 +dtcommod MACH_DTCOMMOD DTCOMMOD 2719 +gould MACH_GOULD GOULD 2720 +siberia MACH_SIBERIA SIBERIA 2721 +sbc3530 MACH_SBC3530 SBC3530 2722 +qarm MACH_QARM QARM 2723 +mips MACH_MIPS MIPS 2724 +mx27grb MACH_MX27GRB MX27GRB 2725 +sbc8100 MACH_SBC8100 SBC8100 2726 +saarb MACH_SAARB SAARB 2727 +omap3mini MACH_OMAP3MINI OMAP3MINI 2728 +cnmbook7se MACH_CNMBOOK7SE CNMBOOK7SE 2729 +catan MACH_CATAN CATAN 2730 +harmony MACH_HARMONY HARMONY 2731 +tonga MACH_TONGA TONGA 2732 +cybook_orizon MACH_CYBOOK_ORIZON CYBOOK_ORIZON 2733 +htcrhodiumcdma MACH_HTCRHODIUMCDMA HTCRHODIUMCDMA 2734 +epc_g45 MACH_EPC_G45 EPC_G45 2735 +epc_lpc3250 MACH_EPC_LPC3250 EPC_LPC3250 2736 +mxc91341evb MACH_MXC91341EVB MXC91341EVB 2737 +rtw1000 MACH_RTW1000 RTW1000 2738 +bobcat MACH_BOBCAT BOBCAT 2739 +trizeps6 MACH_TRIZEPS6 TRIZEPS6 2740 +msm7x30_fluid MACH_MSM7X30_FLUID MSM7X30_FLUID 2741 +nedap9263 MACH_NEDAP9263 NEDAP9263 2742 +netgear_ms2110 MACH_NETGEAR_MS2110 NETGEAR_MS2110 2743 +bmx MACH_BMX BMX 2744 +netstream MACH_NETSTREAM NETSTREAM 2745 +vpnext_rcu MACH_VPNEXT_RCU VPNEXT_RCU 2746 +vpnext_mpu MACH_VPNEXT_MPU VPNEXT_MPU 2747 +bcmring_tablet_v1 MACH_BCMRING_TABLET_V1 BCMRING_TABLET_V1 2748 +sgarm10 MACH_SGARM10 SGARM10 2749 +cm_t3517 MACH_CM_T3517 CM_T3517 2750 +dig297 MACH_OMAP3_CPS OMAP3_CPS 2751 +axar1500_receiver MACH_AXAR1500_RECEIVER AXAR1500_RECEIVER 2752 +wbd222 MACH_WBD222 WBD222 2753 +mt65xx MACH_MT65XX MT65XX 2754 +msm8x60_surf MACH_MSM8X60_SURF MSM8X60_SURF 2755 +msm8x60_sim MACH_MSM8X60_SIM MSM8X60_SIM 2756 +tcc8000_sdk MACH_TCC8000_SDK TCC8000_SDK 2758 +nanos MACH_NANOS NANOS 2759 +stamp9g10 MACH_STAMP9G10 STAMP9G10 2760 +stamp9g45 MACH_STAMP9G45 STAMP9G45 2761 +h6053 MACH_H6053 H6053 2762 +smint01 MACH_SMINT01 SMINT01 2763 +prtlvt2 MACH_PRTLVT2 PRTLVT2 2764 +ap420 MACH_AP420 AP420 2765 +davinci_dm365_fc MACH_DAVINCI_DM365_FC DAVINCI_DM365_FC 2767 +msm8x55_surf MACH_MSM8X55_SURF MSM8X55_SURF 2768 +msm8x55_ffa MACH_MSM8X55_FFA MSM8X55_FFA 2769 +esl_vamana MACH_ESL_VAMANA ESL_VAMANA 2770 +sbc35 MACH_SBC35 SBC35 2771 +mpx6446 MACH_MPX6446 MPX6446 2772 +oreo_controller MACH_OREO_CONTROLLER OREO_CONTROLLER 2773 +kopin_models MACH_KOPIN_MODELS KOPIN_MODELS 2774 +ttc_vision2 MACH_TTC_VISION2 TTC_VISION2 2775 +cns3420vb MACH_CNS3420VB CNS3420VB 2776 +lpc_evo MACH_LPC2 LPC2 2777 +olympus MACH_OLYMPUS OLYMPUS 2778 +vortex MACH_VORTEX VORTEX 2779 +s5pc200 MACH_S5PC200 S5PC200 2780 +ecucore_9263 MACH_ECUCORE_9263 ECUCORE_9263 2781 +smdkc200 MACH_SMDKC200 SMDKC200 2782 +emsiso_sx27 MACH_EMSISO_SX27 EMSISO_SX27 2783 +apx_som9g45_ek MACH_APX_SOM9G45_EK APX_SOM9G45_EK 2784 +songshan MACH_SONGSHAN SONGSHAN 2785 +tianshan MACH_TIANSHAN TIANSHAN 2786 +vpx500 MACH_VPX500 VPX500 2787 +am3517sam MACH_AM3517SAM AM3517SAM 2788 +skat91_sim508 MACH_SKAT91_SIM508 SKAT91_SIM508 2789 +skat91_s3e MACH_SKAT91_S3E SKAT91_S3E 2790 +omap4_panda MACH_OMAP4_PANDA OMAP4_PANDA 2791 +df7220 MACH_DF7220 DF7220 2792 +nemini MACH_NEMINI NEMINI 2793 +t8200 MACH_T8200 T8200 2794 +apf51 MACH_APF51 APF51 2795 +dr_rc_unit MACH_DR_RC_UNIT DR_RC_UNIT 2796 +bordeaux MACH_BORDEAUX BORDEAUX 2797 +catania_b MACH_CATANIA_B CATANIA_B 2798 +mx51_ocean MACH_MX51_OCEAN MX51_OCEAN 2799 +ti8168evm MACH_TI8168EVM TI8168EVM 2800 +neocoreomap MACH_NEOCOREOMAP NEOCOREOMAP 2801 +withings_wbp MACH_WITHINGS_WBP WITHINGS_WBP 2802 +dbps MACH_DBPS DBPS 2803 +pcbfp0001 MACH_PCBFP0001 PCBFP0001 2805 +speedy MACH_SPEEDY SPEEDY 2806 +chrysaor MACH_CHRYSAOR CHRYSAOR 2807 +tango MACH_TANGO TANGO 2808 +synology_dsx11 MACH_SYNOLOGY_DSX11 SYNOLOGY_DSX11 2809 +hanlin_v3ext MACH_HANLIN_V3EXT HANLIN_V3EXT 2810 +hanlin_v5 MACH_HANLIN_V5 HANLIN_V5 2811 +hanlin_v3plus MACH_HANLIN_V3PLUS HANLIN_V3PLUS 2812 +iriver_story MACH_IRIVER_STORY IRIVER_STORY 2813 +irex_iliad MACH_IREX_ILIAD IREX_ILIAD 2814 +irex_dr1000 MACH_IREX_DR1000 IREX_DR1000 2815 +teton_bga MACH_TETON_BGA TETON_BGA 2816 +snapper9g45 MACH_SNAPPER9G45 SNAPPER9G45 2817 +tam3517 MACH_TAM3517 TAM3517 2818 +pdc100 MACH_PDC100 PDC100 2819 +eukrea_cpuimx25sd MACH_EUKREA_CPUIMX25SD EUKREA_CPUIMX25SD 2820 +eukrea_cpuimx35sd MACH_EUKREA_CPUIMX35SD EUKREA_CPUIMX35SD 2821 +eukrea_cpuimx51sd MACH_EUKREA_CPUIMX51SD EUKREA_CPUIMX51SD 2822 +eukrea_cpuimx51 MACH_EUKREA_CPUIMX51 EUKREA_CPUIMX51 2823 +p565 MACH_P565 P565 2824 +acer_a4 MACH_ACER_A4 ACER_A4 2825 +davinci_dm368_bip MACH_DAVINCI_DM368_BIP DAVINCI_DM368_BIP 2826 +eshare MACH_ESHARE ESHARE 2827 +wlbargn MACH_WLBARGN WLBARGN 2829 +bm170 MACH_BM170 BM170 2830 +netspace_mini_v2 MACH_NETSPACE_MINI_V2 NETSPACE_MINI_V2 2831 +netspace_plug_v2 MACH_NETSPACE_PLUG_V2 NETSPACE_PLUG_V2 2832 +siemens_l1 MACH_SIEMENS_L1 SIEMENS_L1 2833 +elv_lcu1 MACH_ELV_LCU1 ELV_LCU1 2834 +mcu1 MACH_MCU1 MCU1 2835 +omap3_tao3530 MACH_OMAP3_TAO3530 OMAP3_TAO3530 2836 +omap3_pcutouch MACH_OMAP3_PCUTOUCH OMAP3_PCUTOUCH 2837 +smdkc210 MACH_SMDKC210 SMDKC210 2838 +omap3_braillo MACH_OMAP3_BRAILLO OMAP3_BRAILLO 2839 +spyplug MACH_SPYPLUG SPYPLUG 2840 +ginger MACH_GINGER GINGER 2841 +tny_t3530 MACH_TNY_T3530 TNY_T3530 2842 +pcaal1 MACH_PCAAL1 PCAAL1 2843 +spade MACH_SPADE SPADE 2844 +mxc25_topaz MACH_MXC25_TOPAZ MXC25_TOPAZ 2845 +t5325 MACH_T5325 T5325 2846 +gw2361 MACH_GW2361 GW2361 2847 +elog MACH_ELOG ELOG 2848 +income MACH_INCOME INCOME 2849 +bcm589x MACH_BCM589X BCM589X 2850 +etna MACH_ETNA ETNA 2851 +hawks MACH_HAWKS HAWKS 2852 +meson MACH_MESON MESON 2853 +xsbase255 MACH_XSBASE255 XSBASE255 2854 +pvm2030 MACH_PVM2030 PVM2030 2855 +mioa502 MACH_MIOA502 MIOA502 2856 +vvbox_sdorig2 MACH_VVBOX_SDORIG2 VVBOX_SDORIG2 2857 +vvbox_sdlite2 MACH_VVBOX_SDLITE2 VVBOX_SDLITE2 2858 +vvbox_sdpro4 MACH_VVBOX_SDPRO4 VVBOX_SDPRO4 2859 +htc_spv_m700 MACH_HTC_SPV_M700 HTC_SPV_M700 2860 +mx257sx MACH_MX257SX MX257SX 2861 +goni MACH_GONI GONI 2862 +msm8x55_svlte_ffa MACH_MSM8X55_SVLTE_FFA MSM8X55_SVLTE_FFA 2863 +msm8x55_svlte_surf MACH_MSM8X55_SVLTE_SURF MSM8X55_SVLTE_SURF 2864 +quickstep MACH_QUICKSTEP QUICKSTEP 2865 +dmw96 MACH_DMW96 DMW96 2866 +hammerhead MACH_HAMMERHEAD HAMMERHEAD 2867 +trident MACH_TRIDENT TRIDENT 2868 +lightning MACH_LIGHTNING LIGHTNING 2869 +iconnect MACH_ICONNECT ICONNECT 2870 +autobot MACH_AUTOBOT AUTOBOT 2871 +coconut MACH_COCONUT COCONUT 2872 +durian MACH_DURIAN DURIAN 2873 +cayenne MACH_CAYENNE CAYENNE 2874 +fuji MACH_FUJI FUJI 2875 +synology_6282 MACH_SYNOLOGY_6282 SYNOLOGY_6282 2876 +em1sy MACH_EM1SY EM1SY 2877 +m502 MACH_M502 M502 2878 +matrix518 MACH_MATRIX518 MATRIX518 2879 +tiny_gurnard MACH_TINY_GURNARD TINY_GURNARD 2880 +spear1310 MACH_SPEAR1310 SPEAR1310 2881 +bv07 MACH_BV07 BV07 2882 +mxt_td61 MACH_MXT_TD61 MXT_TD61 2883 +openrd_ultimate MACH_OPENRD_ULTIMATE OPENRD_ULTIMATE 2884 +devixp MACH_DEVIXP DEVIXP 2885 +miccpt MACH_MICCPT MICCPT 2886 +mic256 MACH_MIC256 MIC256 2887 +as1167 MACH_AS1167 AS1167 2888 +omap3_ibiza MACH_OMAP3_IBIZA OMAP3_IBIZA 2889 +u5500 MACH_U5500 U5500 2890 +davinci_picto MACH_DAVINCI_PICTO DAVINCI_PICTO 2891 +mecha MACH_MECHA MECHA 2892 +bubba3 MACH_BUBBA3 BUBBA3 2893 +pupitre MACH_PUPITRE PUPITRE 2894 +tegra_vogue MACH_TEGRA_VOGUE TEGRA_VOGUE 2896 +tegra_e1165 MACH_TEGRA_E1165 TEGRA_E1165 2897 +simplenet MACH_SIMPLENET SIMPLENET 2898 +ec4350tbm MACH_EC4350TBM EC4350TBM 2899 +pec_tc MACH_PEC_TC PEC_TC 2900 +pec_hc2 MACH_PEC_HC2 PEC_HC2 2901 +esl_mobilis_a MACH_ESL_MOBILIS_A ESL_MOBILIS_A 2902 +esl_mobilis_b MACH_ESL_MOBILIS_B ESL_MOBILIS_B 2903 +esl_wave_a MACH_ESL_WAVE_A ESL_WAVE_A 2904 +esl_wave_b MACH_ESL_WAVE_B ESL_WAVE_B 2905 +unisense_mmm MACH_UNISENSE_MMM UNISENSE_MMM 2906 +blueshark MACH_BLUESHARK BLUESHARK 2907 +e10 MACH_E10 E10 2908 +app3k_robin MACH_APP3K_ROBIN APP3K_ROBIN 2909 +pov15hd MACH_POV15HD POV15HD 2910 +stella MACH_STELLA STELLA 2911 +linkstation_lschl MACH_LINKSTATION_LSCHL LINKSTATION_LSCHL 2913 +netwalker MACH_NETWALKER NETWALKER 2914 +acsx106 MACH_ACSX106 ACSX106 2915 +atlas5_c1 MACH_ATLAS5_C1 ATLAS5_C1 2916 +nsb3ast MACH_NSB3AST NSB3AST 2917 +gnet_slc MACH_GNET_SLC GNET_SLC 2918 +af4000 MACH_AF4000 AF4000 2919 +ark9431 MACH_ARK9431 ARK9431 2920 +fs_s5pc100 MACH_FS_S5PC100 FS_S5PC100 2921 +omap3505nova8 MACH_OMAP3505NOVA8 OMAP3505NOVA8 2922 +omap3621_edp1 MACH_OMAP3621_EDP1 OMAP3621_EDP1 2923 +oratisaes MACH_ORATISAES ORATISAES 2924 +smdkv310 MACH_SMDKV310 SMDKV310 2925 +siemens_l0 MACH_SIEMENS_L0 SIEMENS_L0 2926 +ventana MACH_VENTANA VENTANA 2927 +wm8505_7in_netbook MACH_WM8505_7IN_NETBOOK WM8505_7IN_NETBOOK 2928 +ec4350sdb MACH_EC4350SDB EC4350SDB 2929 +mimas MACH_MIMAS MIMAS 2930 +titan MACH_TITAN TITAN 2931 +craneboard MACH_CRANEBOARD CRANEBOARD 2932 +es2440 MACH_ES2440 ES2440 2933 +najay_a9263 MACH_NAJAY_A9263 NAJAY_A9263 2934 +htctornado MACH_HTCTORNADO HTCTORNADO 2935 +dimm_mx257 MACH_DIMM_MX257 DIMM_MX257 2936 +jigen301 MACH_JIGEN JIGEN 2937 +smdk6450 MACH_SMDK6450 SMDK6450 2938 +meno_qng MACH_MENO_QNG MENO_QNG 2939 +ns2416 MACH_NS2416 NS2416 2940 +rpc353 MACH_RPC353 RPC353 2941 +tq6410 MACH_TQ6410 TQ6410 2942 +sky6410 MACH_SKY6410 SKY6410 2943 +dynasty MACH_DYNASTY DYNASTY 2944 +vivo MACH_VIVO VIVO 2945 +bury_bl7582 MACH_BURY_BL7582 BURY_BL7582 2946 +bury_bps5270 MACH_BURY_BPS5270 BURY_BPS5270 2947 +basi MACH_BASI BASI 2948 +tn200 MACH_TN200 TN200 2949 +c2mmi MACH_C2MMI C2MMI 2950 +meson_6236m MACH_MESON_6236M MESON_6236M 2951 +meson_8626m MACH_MESON_8626M MESON_8626M 2952 +tube MACH_TUBE TUBE 2953 +messina MACH_MESSINA MESSINA 2954 +mx50_arm2 MACH_MX50_ARM2 MX50_ARM2 2955 +cetus9263 MACH_CETUS9263 CETUS9263 2956 +brownstone MACH_BROWNSTONE BROWNSTONE 2957 +vmx25 MACH_VMX25 VMX25 2958 +vmx51 MACH_VMX51 VMX51 2959 +abacus MACH_ABACUS ABACUS 2960 +cm4745 MACH_CM4745 CM4745 2961 +oratislink MACH_ORATISLINK ORATISLINK 2962 +davinci_dm365_dvr MACH_DAVINCI_DM365_DVR DAVINCI_DM365_DVR 2963 +netviz MACH_NETVIZ NETVIZ 2964 +flexibity MACH_FLEXIBITY FLEXIBITY 2965 +wlan_computer MACH_WLAN_COMPUTER WLAN_COMPUTER 2966 +lpc24xx MACH_LPC24XX LPC24XX 2967 +spica MACH_SPICA SPICA 2968 +gpsdisplay MACH_GPSDISPLAY GPSDISPLAY 2969 +bipnet MACH_BIPNET BIPNET 2970 +overo_ctu_inertial MACH_OVERO_CTU_INERTIAL OVERO_CTU_INERTIAL 2971 +davinci_dm355_mmm MACH_DAVINCI_DM355_MMM DAVINCI_DM355_MMM 2972 +pc9260_v2 MACH_PC9260_V2 PC9260_V2 2973 +ptx7545 MACH_PTX7545 PTX7545 2974 +tm_efdc MACH_TM_EFDC TM_EFDC 2975 +omap3_waldo1 MACH_OMAP3_WALDO1 OMAP3_WALDO1 2977 +flyer MACH_FLYER FLYER 2978 +tornado3240 MACH_TORNADO3240 TORNADO3240 2979 +soli_01 MACH_SOLI_01 SOLI_01 2980 +omapl138_europalc MACH_OMAPL138_EUROPALC OMAPL138_EUROPALC 2981 +helios_v1 MACH_HELIOS_V1 HELIOS_V1 2982 +netspace_lite_v2 MACH_NETSPACE_LITE_V2 NETSPACE_LITE_V2 2983 +ssc MACH_SSC SSC 2984 +premierwave_en MACH_PREMIERWAVE_EN PREMIERWAVE_EN 2985 +wasabi MACH_WASABI WASABI 2986 +mx50_rdp MACH_MX50_RDP MX50_RDP 2988 +universal_c210 MACH_UNIVERSAL_C210 UNIVERSAL_C210 2989 +real6410 MACH_REAL6410 REAL6410 2990 +spx_sakura MACH_SPX_SAKURA SPX_SAKURA 2991 +ij3k_2440 MACH_IJ3K_2440 IJ3K_2440 2992 +omap3_bc10 MACH_OMAP3_BC10 OMAP3_BC10 2993 +thebe MACH_THEBE THEBE 2994 +rv082 MACH_RV082 RV082 2995 +armlguest MACH_ARMLGUEST ARMLGUEST 2996 +tjinc1000 MACH_TJINC1000 TJINC1000 2997 +dockstar MACH_DOCKSTAR DOCKSTAR 2998 +ax8008 MACH_AX8008 AX8008 2999 +gnet_sgce MACH_GNET_SGCE GNET_SGCE 3000 +pxwnas_500_1000 MACH_PXWNAS_500_1000 PXWNAS_500_1000 3001 +ea20 MACH_EA20 EA20 3002 +awm2 MACH_AWM2 AWM2 3003 +ti8148evm MACH_TI8148EVM TI8148EVM 3004 +seaboard MACH_SEABOARD SEABOARD 3005 +linkstation_chlv2 MACH_LINKSTATION_CHLV2 LINKSTATION_CHLV2 3006 +tera_pro2_rack MACH_TERA_PRO2_RACK TERA_PRO2_RACK 3007 +rubys MACH_RUBYS RUBYS 3008 +aquarius MACH_AQUARIUS AQUARIUS 3009 +mx53_ard MACH_MX53_ARD MX53_ARD 3010 +mx53_smd MACH_MX53_SMD MX53_SMD 3011 +lswxl MACH_LSWXL LSWXL 3012 +dove_avng_v3 MACH_DOVE_AVNG_V3 DOVE_AVNG_V3 3013 +sdi_ess_9263 MACH_SDI_ESS_9263 SDI_ESS_9263 3014 +jocpu550 MACH_JOCPU550 JOCPU550 3015 +msm8x60_rumi3 MACH_MSM8X60_RUMI3 MSM8X60_RUMI3 3016 +msm8x60_ffa MACH_MSM8X60_FFA MSM8X60_FFA 3017 +yanomami MACH_YANOMAMI YANOMAMI 3018 +gta04 MACH_GTA04 GTA04 3019 +cm_a510 MACH_CM_A510 CM_A510 3020 +omap3_rfs200 MACH_OMAP3_RFS200 OMAP3_RFS200 3021 +kx33xx MACH_KX33XX KX33XX 3022 +ptx7510 MACH_PTX7510 PTX7510 3023 +top9000 MACH_TOP9000 TOP9000 3024 +teenote MACH_TEENOTE TEENOTE 3025 +ts3 MACH_TS3 TS3 3026 +a0 MACH_A0 A0 3027 +fsm9xxx_surf MACH_FSM9XXX_SURF FSM9XXX_SURF 3028 +fsm9xxx_ffa MACH_FSM9XXX_FFA FSM9XXX_FFA 3029 +frrhwcdma60w MACH_FRRHWCDMA60W FRRHWCDMA60W 3030 +remus MACH_REMUS REMUS 3031 +at91cap7xdk MACH_AT91CAP7XDK AT91CAP7XDK 3032 +at91cap7stk MACH_AT91CAP7STK AT91CAP7STK 3033 +kt_sbc_sam9_1 MACH_KT_SBC_SAM9_1 KT_SBC_SAM9_1 3034 +armada_xp_db MACH_ARMADA_XP_DB ARMADA_XP_DB 3036 +spdm MACH_SPDM SPDM 3037 +gtib MACH_GTIB GTIB 3038 +dgm3240 MACH_DGM3240 DGM3240 3039 +htcmega MACH_HTCMEGA HTCMEGA 3041 +tricorder MACH_TRICORDER TRICORDER 3042 +tx28 MACH_TX28 TX28 3043 +bstbrd MACH_BSTBRD BSTBRD 3044 +pwb3090 MACH_PWB3090 PWB3090 3045 +idea6410 MACH_IDEA6410 IDEA6410 3046 +qbc9263 MACH_QBC9263 QBC9263 3047 +borabora MACH_BORABORA BORABORA 3048 +valdez MACH_VALDEZ VALDEZ 3049 +ls9g20 MACH_LS9G20 LS9G20 3050 +mios_v1 MACH_MIOS_V1 MIOS_V1 3051 +s5pc110_crespo MACH_S5PC110_CRESPO S5PC110_CRESPO 3052 +controltek9g20 MACH_CONTROLTEK9G20 CONTROLTEK9G20 3053 +tin307 MACH_TIN307 TIN307 3054 +tin510 MACH_TIN510 TIN510 3055 +ep3505 MACH_EP3517 EP3517 3056 +bluecheese MACH_BLUECHEESE BLUECHEESE 3057 +tem3x30 MACH_TEM3X30 TEM3X30 3058 +harvest_desoto MACH_HARVEST_DESOTO HARVEST_DESOTO 3059 +msm8x60_qrdc MACH_MSM8X60_QRDC MSM8X60_QRDC 3060 +spear900 MACH_SPEAR900 SPEAR900 3061 +pcontrol_g20 MACH_PCONTROL_G20 PCONTROL_G20 3062 +rdstor MACH_RDSTOR RDSTOR 3063 +usdloader MACH_USDLOADER USDLOADER 3064 +tsoploader MACH_TSOPLOADER TSOPLOADER 3065 +kronos MACH_KRONOS KRONOS 3066 +ffcore MACH_FFCORE FFCORE 3067 +mone MACH_MONE MONE 3068 +unit2s MACH_UNIT2S UNIT2S 3069 +acer_a5 MACH_ACER_A5 ACER_A5 3070 +etherpro_isp MACH_ETHERPRO_ISP ETHERPRO_ISP 3071 +stretchs7000 MACH_STRETCHS7000 STRETCHS7000 3072 +p87_smartsim MACH_P87_SMARTSIM P87_SMARTSIM 3073 +tulip MACH_TULIP TULIP 3074 +sunflower MACH_SUNFLOWER SUNFLOWER 3075 +rib MACH_RIB RIB 3076 +clod MACH_CLOD CLOD 3077 +rump MACH_RUMP RUMP 3078 +tenderloin MACH_TENDERLOIN TENDERLOIN 3079 +shortloin MACH_SHORTLOIN SHORTLOIN 3080 +antares MACH_ANTARES ANTARES 3082 +wb40n MACH_WB40N WB40N 3083 +herring MACH_HERRING HERRING 3084 +naxy400 MACH_NAXY400 NAXY400 3085 +naxy1200 MACH_NAXY1200 NAXY1200 3086 +vpr200 MACH_VPR200 VPR200 3087 +bug20 MACH_BUG20 BUG20 3088 +goflexnet MACH_GOFLEXNET GOFLEXNET 3089 +torbreck MACH_TORBRECK TORBRECK 3090 +saarb_mg1 MACH_SAARB_MG1 SAARB_MG1 3091 +callisto MACH_CALLISTO CALLISTO 3092 +multhsu MACH_MULTHSU MULTHSU 3093 +saluda MACH_SALUDA SALUDA 3094 +pemp_omap3_apollo MACH_PEMP_OMAP3_APOLLO PEMP_OMAP3_APOLLO 3095 +vc0718 MACH_VC0718 VC0718 3096 +mvblx MACH_MVBLX MVBLX 3097 +inhand_apeiron MACH_INHAND_APEIRON INHAND_APEIRON 3098 +inhand_fury MACH_INHAND_FURY INHAND_FURY 3099 +inhand_siren MACH_INHAND_SIREN INHAND_SIREN 3100 +hdnvp MACH_HDNVP HDNVP 3101 +softwinner MACH_SOFTWINNER SOFTWINNER 3102 +prima2_evb MACH_PRIMA2_EVB PRIMA2_EVB 3103 +nas6210 MACH_NAS6210 NAS6210 3104 +unisdev MACH_UNISDEV UNISDEV 3105 +sbca11 MACH_SBCA11 SBCA11 3106 +saga MACH_SAGA SAGA 3107 +ns_k330 MACH_NS_K330 NS_K330 3108 +tanna MACH_TANNA TANNA 3109 +imate8502 MACH_IMATE8502 IMATE8502 3110 +aspen MACH_ASPEN ASPEN 3111 +daintree_cwac MACH_DAINTREE_CWAC DAINTREE_CWAC 3112 +zmx25 MACH_ZMX25 ZMX25 3113 +maple1 MACH_MAPLE1 MAPLE1 3114 +qsd8x72_surf MACH_QSD8X72_SURF QSD8X72_SURF 3115 +qsd8x72_ffa MACH_QSD8X72_FFA QSD8X72_FFA 3116 +abilene MACH_ABILENE ABILENE 3117 +eigen_ttr MACH_EIGEN_TTR EIGEN_TTR 3118 +iomega_ix2_200 MACH_IOMEGA_IX2_200 IOMEGA_IX2_200 3119 +coretec_vcx7400 MACH_CORETEC_VCX7400 CORETEC_VCX7400 3120 +santiago MACH_SANTIAGO SANTIAGO 3121 +mx257sol MACH_MX257SOL MX257SOL 3122 +strasbourg MACH_STRASBOURG STRASBOURG 3123 +msm8x60_fluid MACH_MSM8X60_FLUID MSM8X60_FLUID 3124 +smartqv5 MACH_SMARTQV5 SMARTQV5 3125 +smartqv3 MACH_SMARTQV3 SMARTQV3 3126 +smartqv7 MACH_SMARTQV7 SMARTQV7 3127 +paz00 MACH_PAZ00 PAZ00 3128 +acmenetusfoxg20 MACH_ACMENETUSFOXG20 ACMENETUSFOXG20 3129 +fwbd_0404 MACH_FWBD_0404 FWBD_0404 3131 +hdgu MACH_HDGU HDGU 3132 +pyramid MACH_PYRAMID PYRAMID 3133 +epiphan MACH_EPIPHAN EPIPHAN 3134 +omap_bender MACH_OMAP_BENDER OMAP_BENDER 3135 +gurnard MACH_GURNARD GURNARD 3136 +gtl_it5100 MACH_GTL_IT5100 GTL_IT5100 3137 +bcm2708 MACH_BCM2708 BCM2708 3138 +mx51_ggc MACH_MX51_GGC MX51_GGC 3139 +sharespace MACH_SHARESPACE SHARESPACE 3140 +haba_knx_explorer MACH_HABA_KNX_EXPLORER HABA_KNX_EXPLORER 3141 +simtec_kirkmod MACH_SIMTEC_KIRKMOD SIMTEC_KIRKMOD 3142 +crux MACH_CRUX CRUX 3143 +mx51_bravo MACH_MX51_BRAVO MX51_BRAVO 3144 +charon MACH_CHARON CHARON 3145 +picocom3 MACH_PICOCOM3 PICOCOM3 3146 +picocom4 MACH_PICOCOM4 PICOCOM4 3147 +serrano MACH_SERRANO SERRANO 3148 +doubleshot MACH_DOUBLESHOT DOUBLESHOT 3149 +evsy MACH_EVSY EVSY 3150 +huashan MACH_HUASHAN HUASHAN 3151 +lausanne MACH_LAUSANNE LAUSANNE 3152 +emerald MACH_EMERALD EMERALD 3153 +tqma35 MACH_TQMA35 TQMA35 3154 +marvel MACH_MARVEL MARVEL 3155 +manuae MACH_MANUAE MANUAE 3156 +chacha MACH_CHACHA CHACHA 3157 +lemon MACH_LEMON LEMON 3158 +csc MACH_CSC CSC 3159 +gira_knxip_router MACH_GIRA_KNXIP_ROUTER GIRA_KNXIP_ROUTER 3160 +t20 MACH_T20 T20 3161 +hdmini MACH_HDMINI HDMINI 3162 +sciphone_g2 MACH_SCIPHONE_G2 SCIPHONE_G2 3163 +express MACH_EXPRESS EXPRESS 3164 +express_kt MACH_EXPRESS_KT EXPRESS_KT 3165 +maximasp MACH_MAXIMASP MAXIMASP 3166 +nitrogen_imx51 MACH_NITROGEN_IMX51 NITROGEN_IMX51 3167 +nitrogen_imx53 MACH_NITROGEN_IMX53 NITROGEN_IMX53 3168 +sunfire MACH_SUNFIRE SUNFIRE 3169 +arowana MACH_AROWANA AROWANA 3170 +tegra_daytona MACH_TEGRA_DAYTONA TEGRA_DAYTONA 3171 +tegra_swordfish MACH_TEGRA_SWORDFISH TEGRA_SWORDFISH 3172 +edison MACH_EDISON EDISON 3173 +svp8500v1 MACH_SVP8500V1 SVP8500V1 3174 +svp8500v2 MACH_SVP8500V2 SVP8500V2 3175 +svp5500 MACH_SVP5500 SVP5500 3176 +b5500 MACH_B5500 B5500 3177 +s5500 MACH_S5500 S5500 3178 +icon MACH_ICON ICON 3179 +elephant MACH_ELEPHANT ELEPHANT 3180 +shooter MACH_SHOOTER SHOOTER 3182 +spade_lte MACH_SPADE_LTE SPADE_LTE 3183 +philhwani MACH_PHILHWANI PHILHWANI 3184 +gsncomm MACH_GSNCOMM GSNCOMM 3185 +strasbourg_a2 MACH_STRASBOURG_A2 STRASBOURG_A2 3186 +mmm MACH_MMM MMM 3187 +davinci_dm365_bv MACH_DAVINCI_DM365_BV DAVINCI_DM365_BV 3188 +ag5evm MACH_AG5EVM AG5EVM 3189 +sc575plc MACH_SC575PLC SC575PLC 3190 +sc575hmi MACH_SC575IPC SC575IPC 3191 +omap3_tdm3730 MACH_OMAP3_TDM3730 OMAP3_TDM3730 3192 +top9000_eval MACH_TOP9000_EVAL TOP9000_EVAL 3194 +top9000_su MACH_TOP9000_SU TOP9000_SU 3195 +utm300 MACH_UTM300 UTM300 3196 +tsunagi MACH_TSUNAGI TSUNAGI 3197 +ts75xx MACH_TS75XX TS75XX 3198 +ts47xx MACH_TS47XX TS47XX 3200 +da850_k5 MACH_DA850_K5 DA850_K5 3201 +ax502 MACH_AX502 AX502 3202 +igep0032 MACH_IGEP0032 IGEP0032 3203 +antero MACH_ANTERO ANTERO 3204 +synergy MACH_SYNERGY SYNERGY 3205 +ics_if_voip MACH_ICS_IF_VOIP ICS_IF_VOIP 3206 +wlf_cragg_6410 MACH_WLF_CRAGG_6410 WLF_CRAGG_6410 3207 +punica MACH_PUNICA PUNICA 3208 +trimslice MACH_TRIMSLICE TRIMSLICE 3209 +mx27_wmultra MACH_MX27_WMULTRA MX27_WMULTRA 3210 +mackerel MACH_MACKEREL MACKEREL 3211 +fa9x27 MACH_FA9X27 FA9X27 3213 +ns2816tb MACH_NS2816TB NS2816TB 3214 +ns2816_ntpad MACH_NS2816_NTPAD NS2816_NTPAD 3215 +ns2816_ntnb MACH_NS2816_NTNB NS2816_NTNB 3216 +kaen MACH_KAEN KAEN 3217 +nv1000 MACH_NV1000 NV1000 3218 +nuc950ts MACH_NUC950TS NUC950TS 3219 +nokia_rm680 MACH_NOKIA_RM680 NOKIA_RM680 3220 +ast2200 MACH_AST2200 AST2200 3221 +lead MACH_LEAD LEAD 3222 +unino1 MACH_UNINO1 UNINO1 3223 +greeco MACH_GREECO GREECO 3224 +verdi MACH_VERDI VERDI 3225 +dm6446_adbox MACH_DM6446_ADBOX DM6446_ADBOX 3226 +quad_salsa MACH_QUAD_SALSA QUAD_SALSA 3227 +abb_gma_1_1 MACH_ABB_GMA_1_1 ABB_GMA_1_1 3228 +svcid MACH_SVCID SVCID 3229 +msm8960_sim MACH_MSM8960_SIM MSM8960_SIM 3230 +msm8960_rumi3 MACH_MSM8960_RUMI3 MSM8960_RUMI3 3231 +icon_g MACH_ICON_G ICON_G 3232 +mb3 MACH_MB3 MB3 3233 +gsia18s MACH_GSIA18S GSIA18S 3234 +pivicc MACH_PIVICC PIVICC 3235 +pcm048 MACH_PCM048 PCM048 3236 +dds MACH_DDS DDS 3237 +chalten_xa1 MACH_CHALTEN_XA1 CHALTEN_XA1 3238 +ts48xx MACH_TS48XX TS48XX 3239 +tonga2_tfttimer MACH_TONGA2_TFTTIMER TONGA2_TFTTIMER 3240 +whistler MACH_WHISTLER WHISTLER 3241 +asl_phoenix MACH_ASL_PHOENIX ASL_PHOENIX 3242 +at91sam9263otlite MACH_AT91SAM9263OTLITE AT91SAM9263OTLITE 3243 +ddplug MACH_DDPLUG DDPLUG 3244 +d2plug MACH_D2PLUG D2PLUG 3245 +kzm9d MACH_KZM9D KZM9D 3246 +verdi_lte MACH_VERDI_LTE VERDI_LTE 3247 +nanozoom MACH_NANOZOOM NANOZOOM 3248 +dm3730_som_lv MACH_DM3730_SOM_LV DM3730_SOM_LV 3249 +dm3730_torpedo MACH_DM3730_TORPEDO DM3730_TORPEDO 3250 +anchovy MACH_ANCHOVY ANCHOVY 3251 +re2rev20 MACH_RE2REV20 RE2REV20 3253 +re2rev21 MACH_RE2REV21 RE2REV21 3254 +cns21xx MACH_CNS21XX CNS21XX 3255 +rider MACH_RIDER RIDER 3257 +nsk330 MACH_NSK330 NSK330 3258 +cns2133evb MACH_CNS2133EVB CNS2133EVB 3259 +z3_816x_mod MACH_Z3_816X_MOD Z3_816X_MOD 3260 +z3_814x_mod MACH_Z3_814X_MOD Z3_814X_MOD 3261 +beect MACH_BEECT BEECT 3262 +dma_thunderbug MACH_DMA_THUNDERBUG DMA_THUNDERBUG 3263 +omn_at91sam9g20 MACH_OMN_AT91SAM9G20 OMN_AT91SAM9G20 3264 +mx25_e2s_uc MACH_MX25_E2S_UC MX25_E2S_UC 3265 +mione MACH_MIONE MIONE 3266 +top9000_tcu MACH_TOP9000_TCU TOP9000_TCU 3267 +top9000_bsl MACH_TOP9000_BSL TOP9000_BSL 3268 +kingdom MACH_KINGDOM KINGDOM 3269 +armadillo460 MACH_ARMADILLO460 ARMADILLO460 3270 +lq2 MACH_LQ2 LQ2 3271 +sweda_tms2 MACH_SWEDA_TMS2 SWEDA_TMS2 3272 +mx53_loco MACH_MX53_LOCO MX53_LOCO 3273 +acer_a8 MACH_ACER_A8 ACER_A8 3275 +acer_gauguin MACH_ACER_GAUGUIN ACER_GAUGUIN 3276 +guppy MACH_GUPPY GUPPY 3277 +mx61_ard MACH_MX61_ARD MX61_ARD 3278 +tx53 MACH_TX53 TX53 3279 +omapl138_case_a3 MACH_OMAPL138_CASE_A3 OMAPL138_CASE_A3 3280 +uemd MACH_UEMD UEMD 3281 +ccwmx51mut MACH_CCWMX51MUT CCWMX51MUT 3282 +rockhopper MACH_ROCKHOPPER ROCKHOPPER 3283 +encore MACH_ENCORE ENCORE 3284 +hkdkc100 MACH_HKDKC100 HKDKC100 3285 +ts42xx MACH_TS42XX TS42XX 3286 +aebl MACH_AEBL AEBL 3287 +wario MACH_WARIO WARIO 3288 +gfs_spm MACH_GFS_SPM GFS_SPM 3289 +cm_t3730 MACH_CM_T3730 CM_T3730 3290 +isc3 MACH_ISC3 ISC3 3291 +rascal MACH_RASCAL RASCAL 3292 +hrefv60 MACH_HREFV60 HREFV60 3293 +tpt_2_0 MACH_TPT_2_0 TPT_2_0 3294 +pydtd MACH_PYRAMID_TD PYRAMID_TD 3295 +splendor MACH_SPLENDOR SPLENDOR 3296 +guf_vincell MACH_GUF_PLANET GUF_PLANET 3297 +msm8x60_qt MACH_MSM8X60_QT MSM8X60_QT 3298 +htc_hd_mini MACH_HTC_HD_MINI HTC_HD_MINI 3299 +athene MACH_ATHENE ATHENE 3300 +deep_r_ek_1 MACH_DEEP_R_EK_1 DEEP_R_EK_1 3301 +vivow_ct MACH_VIVOW_CT VIVOW_CT 3302 +nery_1000 MACH_NERY_1000 NERY_1000 3303 +rfl109145_ssrv MACH_RFL109145_SSRV RFL109145_SSRV 3304 +nmh MACH_NMH NMH 3305 +wn802t MACH_WN802T WN802T 3306 +dragonet MACH_DRAGONET DRAGONET 3307 +geneva_b4 MACH_GENEVA_B GENEVA_B 3308 +at91sam9263desk16l MACH_AT91SAM9263DESK16L AT91SAM9263DESK16L 3309 +bcmhana_sv MACH_BCMHANA_SV BCMHANA_SV 3310 +bcmhana_tablet MACH_BCMHANA_TABLET BCMHANA_TABLET 3311 +koi MACH_KOI KOI 3312 +ts4800 MACH_TS4800 TS4800 3313 +tqma9263 MACH_TQMA9263 TQMA9263 3314 +holiday MACH_HOLIDAY HOLIDAY 3315 +dma_6410 MACH_DMA6410 DMA6410 3316 +pcats_overlay MACH_PCATS_OVERLAY PCATS_OVERLAY 3317 +hwgw6410 MACH_HWGW6410 HWGW6410 3318 +shenzhou MACH_SHENZHOU SHENZHOU 3319 +cwme9210 MACH_CWME9210 CWME9210 3320 +cwme9210js MACH_CWME9210JS CWME9210JS 3321 +pgs_v1 MACH_PGS_SITARA PGS_SITARA 3322 +colibri_tegra2 MACH_COLIBRI_TEGRA2 COLIBRI_TEGRA2 3323 +w21 MACH_W21 W21 3324 +polysat1 MACH_POLYSAT1 POLYSAT1 3325 +dataway MACH_DATAWAY DATAWAY 3326 +cobral138 MACH_COBRAL138 COBRAL138 3327 +roverpcs8 MACH_ROVERPCS8 ROVERPCS8 3328 +marvelc MACH_MARVELC MARVELC 3329 +navefihid MACH_NAVEFIHID NAVEFIHID 3330 +dm365_cv100 MACH_DM365_CV100 DM365_CV100 3331 +able MACH_ABLE ABLE 3332 +legacy MACH_LEGACY LEGACY 3333 +icong MACH_ICONG ICONG 3334 +rover_g8 MACH_ROVER_G8 ROVER_G8 3335 +t5388p MACH_T5388P T5388P 3336 +dingo MACH_DINGO DINGO 3337 +goflexhome MACH_GOFLEXHOME GOFLEXHOME 3338 +lanreadyfn511 MACH_LANREADYFN511 LANREADYFN511 3340 +omap3_baia MACH_OMAP3_BAIA OMAP3_BAIA 3341 +omap3smartdisplay MACH_OMAP3SMARTDISPLAY OMAP3SMARTDISPLAY 3342 +xilinx MACH_XILINX XILINX 3343 +a2f MACH_A2F A2F 3344 +sky25 MACH_SKY25 SKY25 3345 +ccmx53 MACH_CCMX53 CCMX53 3346 +ccmx53js MACH_CCMX53JS CCMX53JS 3347 +ccwmx53 MACH_CCWMX53 CCWMX53 3348 +ccwmx53js MACH_CCWMX53JS CCWMX53JS 3349 +frisms MACH_FRISMS FRISMS 3350 +msm7x27a_ffa MACH_MSM7X27A_FFA MSM7X27A_FFA 3351 +msm7x27a_surf MACH_MSM7X27A_SURF MSM7X27A_SURF 3352 +msm7x27a_rumi3 MACH_MSM7X27A_RUMI3 MSM7X27A_RUMI3 3353 +dimmsam9g20 MACH_DIMMSAM9G20 DIMMSAM9G20 3354 +dimm_imx28 MACH_DIMM_IMX28 DIMM_IMX28 3355 +amk_a4 MACH_AMK_A4 AMK_A4 3356 +gnet_sgme MACH_GNET_SGME GNET_SGME 3357 +shooter_u MACH_SHOOTER_U SHOOTER_U 3358 +vmx53 MACH_VMX53 VMX53 3359 +rhino MACH_RHINO RHINO 3360 +armlex4210 MACH_ARMLEX4210 ARMLEX4210 3361 +swarcoextmodem MACH_SWARCOEXTMODEM SWARCOEXTMODEM 3362 +snowball MACH_SNOWBALL SNOWBALL 3363 +pcm049 MACH_PCM049 PCM049 3364 +vigor MACH_VIGOR VIGOR 3365 +oslo_amundsen MACH_OSLO_AMUNDSEN OSLO_AMUNDSEN 3366 +gsl_diamond MACH_GSL_DIAMOND GSL_DIAMOND 3367 +cv2201 MACH_CV2201 CV2201 3368 +cv2202 MACH_CV2202 CV2202 3369 +cv2203 MACH_CV2203 CV2203 3370 +vit_ibox MACH_VIT_IBOX VIT_IBOX 3371 +dm6441_esp MACH_DM6441_ESP DM6441_ESP 3372 +at91sam9x5ek MACH_AT91SAM9X5EK AT91SAM9X5EK 3373 +libra MACH_LIBRA LIBRA 3374 +easycrrh MACH_EASYCRRH EASYCRRH 3375 +tripel MACH_TRIPEL TRIPEL 3376 +endian_mini MACH_ENDIAN_MINI ENDIAN_MINI 3377 +xilinx_ep107 MACH_XILINX_EP107 XILINX_EP107 3378 +nuri MACH_NURI NURI 3379 +janus MACH_JANUS JANUS 3380 +ddnas MACH_DDNAS DDNAS 3381 +tag MACH_TAG TAG 3382 +tagw MACH_TAGW TAGW 3383 +nitrogen_vm_imx51 MACH_NITROGEN_VM_IMX51 NITROGEN_VM_IMX51 3384 +viprinet MACH_VIPRINET VIPRINET 3385 +bockw MACH_BOCKW BOCKW 3386 +eva2000 MACH_EVA2000 EVA2000 3387 +steelyard MACH_STEELYARD STEELYARD 3388 +ea2468devkit MACH_LPC2468OEM LPC2468OEM 3389 +sdh001 MACH_MACH_SDH001 MACH_SDH001 3390 +fe2478mblox MACH_LPC2478MICROBLOX LPC2478MICROBLOX 3391 +nsslsboard MACH_NSSLSBOARD NSSLSBOARD 3392 +geneva_b5 MACH_GENEVA_B5 GENEVA_B5 3393 +spear1340 MACH_SPEAR1340 SPEAR1340 3394 +rexmas MACH_REXMAS REXMAS 3395 +msm8960_cdp MACH_MSM8960_CDP MSM8960_CDP 3396 +msm8960_mtp MACH_MSM8960_MDP MSM8960_MDP 3397 +msm8960_fluid MACH_MSM8960_FLUID MSM8960_FLUID 3398 +msm8960_apq MACH_MSM8960_APQ MSM8960_APQ 3399 +helios_v2 MACH_HELIOS_V2 HELIOS_V2 3400 +mif10p MACH_MIF10P MIF10P 3401 +iam28 MACH_IAM28 IAM28 3402 +picasso MACH_PICASSO PICASSO 3403 +mr301a MACH_MR301A MR301A 3404 +notle MACH_NOTLE NOTLE 3405 +eelx2 MACH_EELX2 EELX2 3406 +moon MACH_MOON MOON 3407 +ruby MACH_RUBY RUBY 3408 +goldengate MACH_GOLDENGATE GOLDENGATE 3409 +ctbu_gen2 MACH_CTBU_GEN2 CTBU_GEN2 3410 +kmp_am17_01 MACH_KMP_AM17_01 KMP_AM17_01 3411 +wtplug MACH_WTPLUG WTPLUG 3412 +mx27su2 MACH_MX27SU2 MX27SU2 3413 +nb31 MACH_NB31 NB31 3414 +hjsdu MACH_HJSDU HJSDU 3415 +td3_rev1 MACH_TD3_REV1 TD3_REV1 3416 +eag_ci4000 MACH_EAG_CI4000 EAG_CI4000 3417 +net5big_nand_v2 MACH_NET5BIG_NAND_V2 NET5BIG_NAND_V2 3418 +cpx2 MACH_CPX2 CPX2 3419 +net2big_nand_v2 MACH_NET2BIG_NAND_V2 NET2BIG_NAND_V2 3420 +ecuv5 MACH_ECUV5 ECUV5 3421 +hsgx6d MACH_HSGX6D HSGX6D 3422 +dawad7 MACH_DAWAD7 DAWAD7 3423 +sam9repeater MACH_SAM9REPEATER SAM9REPEATER 3424 +gt_i5700 MACH_GT_I5700 GT_I5700 3425 +ctera_plug_c2 MACH_CTERA_PLUG_C2 CTERA_PLUG_C2 3426 +marvelct MACH_MARVELCT MARVELCT 3427 +ag11005 MACH_AG11005 AG11005 3428 +omap_tabletblaze MACH_OMAP_BLAZE OMAP_BLAZE 3429 +vangogh MACH_VANGOGH VANGOGH 3430 +matrix505 MACH_MATRIX505 MATRIX505 3431 +oce_nigma MACH_OCE_NIGMA OCE_NIGMA 3432 +t55 MACH_T55 T55 3433 +bio3k MACH_BIO3K BIO3K 3434 +expressct MACH_EXPRESSCT EXPRESSCT 3435 +cardhu MACH_CARDHU CARDHU 3436 +aruba MACH_ARUBA ARUBA 3437 +bonaire MACH_BONAIRE BONAIRE 3438 +nuc700evb MACH_NUC700EVB NUC700EVB 3439 +nuc710evb MACH_NUC710EVB NUC710EVB 3440 +nuc740evb MACH_NUC740EVB NUC740EVB 3441 +nuc745evb MACH_NUC745EVB NUC745EVB 3442 +transcede MACH_TRANSCEDE TRANSCEDE 3443 +mora MACH_MORA MORA 3444 +nda_evm MACH_NDA_EVM NDA_EVM 3445 +timu MACH_TIMU TIMU 3446 +expressh MACH_EXPRESSH EXPRESSH 3447 +veridis_a300 MACH_VERIDIS_A300 VERIDIS_A300 3448 +dm368_leopard MACH_DM368_LEOPARD DM368_LEOPARD 3449 +omap_mcop MACH_OMAP_MCOP OMAP_MCOP 3450 +tritip MACH_TRITIP TRITIP 3451 +sm1k MACH_SM1K SM1K 3452 +monch MACH_MONCH MONCH 3453 +curacao MACH_CURACAO CURACAO 3454 +origen MACH_ORIGEN ORIGEN 3455 +epc10 MACH_EPC10 EPC10 3456 +sgh_i740 MACH_SGH_I740 SGH_I740 3457 +tuna MACH_TUNA TUNA 3458 +mx51_tulip MACH_MX51_TULIP MX51_TULIP 3459 +mx51_aster7 MACH_MX51_ASTER7 MX51_ASTER7 3460 +acro37xbrd MACH_ACRO37XBRD ACRO37XBRD 3461 +elke MACH_ELKE ELKE 3462 +sbc6000x MACH_SBC6000X SBC6000X 3463 +r1801e MACH_R1801E R1801E 3464 +h1600 MACH_H1600 H1600 3465 +mini210 MACH_MINI210 MINI210 3466 +mini8168 MACH_MINI8168 MINI8168 3467 +pc7308 MACH_PC7308 PC7308 3468 +ge863_pro3_evk MACH_GE863 GE863 3469 +kmm2m01 MACH_KMM2M01 KMM2M01 3470 +mx51erebus MACH_MX51EREBUS MX51EREBUS 3471 +wm8650refboard MACH_WM8650REFBOARD WM8650REFBOARD 3472 +tuxrail MACH_TUXRAIL TUXRAIL 3473 +arthur MACH_ARTHUR ARTHUR 3474 +doorboy MACH_DOORBOY DOORBOY 3475 +xarina MACH_XARINA XARINA 3476 +roverx7 MACH_ROVERX7 ROVERX7 3477 +sdvr MACH_SDVR SDVR 3478 +acer_maya MACH_ACER_MAYA ACER_MAYA 3479 +pico MACH_PICO PICO 3480 +cwmx233 MACH_CWMX233 CWMX233 3481 +cwam1808 MACH_CWAM1808 CWAM1808 3482 +cwdm365 MACH_CWDM365 CWDM365 3483 +mx51_moray MACH_MX51_MORAY MX51_MORAY 3484 +thales_cbc MACH_THALES_CBC THALES_CBC 3485 +bluepoint MACH_BLUEPOINT BLUEPOINT 3486 +dir665 MACH_DIR665 DIR665 3487 +acmerover1 MACH_ACMEROVER1 ACMEROVER1 3488 +shooter_ct MACH_SHOOTER_CT SHOOTER_CT 3489 +bliss MACH_BLISS BLISS 3490 +blissc MACH_BLISSC BLISSC 3491 +thales_adc MACH_THALES_ADC THALES_ADC 3492 +ubisys_p9d_evp MACH_UBISYS_P9D_EVP UBISYS_P9D_EVP 3493 +atdgp318 MACH_ATDGP318 ATDGP318 3494 +dma210u MACH_DMA210U DMA210U 3495 +em_t3 MACH_EM_T3 EM_T3 3496 +htx3250 MACH_HTX3250 HTX3250 3497 +g50 MACH_G50 G50 3498 +eco5 MACH_ECO5 ECO5 3499 +wintergrasp MACH_WINTERGRASP WINTERGRASP 3500 +puro MACH_PURO PURO 3501 +shooter_k MACH_SHOOTER_K SHOOTER_K 3502 +nspire MACH_NSPIRE NSPIRE 3503 +mickxx MACH_MICKXX MICKXX 3504 +lxmb MACH_LXMB LXMB 3505 +tmdxscbp6618x MACH_TMDXSCBP6616X TMDXSCBP6616X 3506 +adam MACH_ADAM ADAM 3507 +b1004 MACH_B1004 B1004 3508 +oboea MACH_OBOEA OBOEA 3509 +a1015 MACH_A1015 A1015 3510 +robin_vbdt30 MACH_ROBIN_VBDT30 ROBIN_VBDT30 3511 +tegra_enterprise MACH_TEGRA_ENTERPRISE TEGRA_ENTERPRISE 3512 +rfl108200_mk10 MACH_RFL108200_MK10 RFL108200_MK10 3513 +rfl108300_mk16 MACH_RFL108300_MK16 RFL108300_MK16 3514 +rover_v7 MACH_ROVER_V7 ROVER_V7 3515 +miphone MACH_MIPHONE MIPHONE 3516 +femtobts MACH_FEMTOBTS FEMTOBTS 3517 +monopoli MACH_MONOPOLI MONOPOLI 3518 +boss MACH_BOSS BOSS 3519 +davinci_dm368_vtam MACH_DAVINCI_DM368_VTAM DAVINCI_DM368_VTAM 3520 +clcon MACH_CLCON CLCON 3521 +nokia_rm696 MACH_NOKIA_RM696 NOKIA_RM696 3522 +tahiti MACH_TAHITI TAHITI 3523 +fighter MACH_FIGHTER FIGHTER 3524 +sgh_i710 MACH_SGH_I710 SGH_I710 3525 +integreproscb MACH_INTEGREPROSCB INTEGREPROSCB 3526 +monza MACH_MONZA MONZA 3527 +calimain MACH_CALIMAIN CALIMAIN 3528 +mx6q_sabreauto MACH_MX6Q_SABREAUTO MX6Q_SABREAUTO 3529 +gma01x MACH_GMA01X GMA01X 3530 +sbc51 MACH_SBC51 SBC51 3531 +fit MACH_FIT FIT 3532 +steelhead MACH_STEELHEAD STEELHEAD 3533 +panther MACH_PANTHER PANTHER 3534 +msm8960_liquid MACH_MSM8960_LIQUID MSM8960_LIQUID 3535 +lexikonct MACH_LEXIKONCT LEXIKONCT 3536 +ns2816_stb MACH_NS2816_STB NS2816_STB 3537 +sei_mm2_lpc3250 MACH_SEI_MM2_LPC3250 SEI_MM2_LPC3250 3538 +cmimx53 MACH_CMIMX53 CMIMX53 3539 +sandwich MACH_SANDWICH SANDWICH 3540 +chief MACH_CHIEF CHIEF 3541 +pogo_e02 MACH_POGO_E02 POGO_E02 3542 +mikrap_x168 MACH_MIKRAP_X168 MIKRAP_X168 3543 +htcmozart MACH_HTCMOZART HTCMOZART 3544 +htcgold MACH_HTCGOLD HTCGOLD 3545 +mt72xx MACH_MT72XX MT72XX 3546 +mx51_ivy MACH_MX51_IVY MX51_IVY 3547 +mx51_lvd MACH_MX51_LVD MX51_LVD 3548 +omap3_wiser2 MACH_OMAP3_WISER2 OMAP3_WISER2 3549 +dreamplug MACH_DREAMPLUG DREAMPLUG 3550 +cobas_c_111 MACH_COBAS_C_111 COBAS_C_111 3551 +cobas_u_411 MACH_COBAS_U_411 COBAS_U_411 3552 +hssd MACH_HSSD HSSD 3553 +iom35x MACH_IOM35X IOM35X 3554 +psom_omap MACH_PSOM_OMAP PSOM_OMAP 3555 +iphone_2g MACH_IPHONE_2G IPHONE_2G 3556 +iphone_3g MACH_IPHONE_3G IPHONE_3G 3557 +ipod_touch_1g MACH_IPOD_TOUCH_1G IPOD_TOUCH_1G 3558 +pharos_tpc MACH_PHAROS_TPC PHAROS_TPC 3559 +mx53_hydra MACH_MX53_HYDRA MX53_HYDRA 3560 +ns2816_dev_board MACH_NS2816_DEV_BOARD NS2816_DEV_BOARD 3561 +iphone_3gs MACH_IPHONE_3GS IPHONE_3GS 3562 +iphone_4 MACH_IPHONE_4 IPHONE_4 3563 +ipod_touch_4g MACH_IPOD_TOUCH_4G IPOD_TOUCH_4G 3564 +dragon_e1100 MACH_DRAGON_E1100 DRAGON_E1100 3565 +topside MACH_TOPSIDE TOPSIDE 3566 +irisiii MACH_IRISIII IRISIII 3567 +deto_macarm9 MACH_DETO_MACARM9 DETO_MACARM9 3568 +eti_d1 MACH_ETI_D1 ETI_D1 3569 +som3530sdk MACH_SOM3530SDK SOM3530SDK 3570 +oc_engine MACH_OC_ENGINE OC_ENGINE 3571 +apq8064_sim MACH_APQ8064_SIM APQ8064_SIM 3572 +alps MACH_ALPS ALPS 3575 +tny_t3730 MACH_TNY_T3730 TNY_T3730 3576 +geryon_nfe MACH_GERYON_NFE GERYON_NFE 3577 +ns2816_ref_board MACH_NS2816_REF_BOARD NS2816_REF_BOARD 3578 +silverstone MACH_SILVERSTONE SILVERSTONE 3579 +mtt2440 MACH_MTT2440 MTT2440 3580 +ynicdb MACH_YNICDB YNICDB 3581 +bct MACH_BCT BCT 3582 +tuscan MACH_TUSCAN TUSCAN 3583 +xbt_sam9g45 MACH_XBT_SAM9G45 XBT_SAM9G45 3584 +enbw_cmc MACH_ENBW_CMC ENBW_CMC 3585 +msm8x60_dragon MACH_APQ8060_DRAGON APQ8060_DRAGON 3586 +ch104mx257 MACH_CH104MX257 CH104MX257 3587 +openpri MACH_OPENPRI OPENPRI 3588 +am335xevm MACH_AM335XEVM AM335XEVM 3589 +picodmb MACH_PICODMB PICODMB 3590 +waluigi MACH_WALUIGI WALUIGI 3591 +punicag7 MACH_PUNICAG7 PUNICAG7 3592 +ipad_1g MACH_IPAD_1G IPAD_1G 3593 +appletv_2g MACH_APPLETV_2G APPLETV_2G 3594 +mach_ecog45 MACH_MACH_ECOG45 MACH_ECOG45 3595 +ait_cam_enc_4xx MACH_AIT_CAM_ENC_4XX AIT_CAM_ENC_4XX 3596 +runnymede MACH_RUNNYMEDE RUNNYMEDE 3597 +play MACH_PLAY PLAY 3598 +hw90260 MACH_HW90260 HW90260 3599 +tagh MACH_TAGH TAGH 3600 +filbert MACH_FILBERT FILBERT 3601 +getinge_netcomv3 MACH_GETINGE_NETCOMV3 GETINGE_NETCOMV3 3602 +cw20 MACH_CW20 CW20 3603 +cinema MACH_CINEMA CINEMA 3604 +cinema_tea MACH_CINEMA_TEA CINEMA_TEA 3605 +cinema_coffee MACH_CINEMA_COFFEE CINEMA_COFFEE 3606 +cinema_juice MACH_CINEMA_JUICE CINEMA_JUICE 3607 +linux_pad MACH_THEPAD THEPAD 3608 +mx53_mirage2 MACH_MX53_MIRAGE2 MX53_MIRAGE2 3609 +mx53_efikasb MACH_MX53_EFIKASB MX53_EFIKASB 3610 +stm_b2000 MACH_STM_B2000 STM_B2000 3612 +m28evk MACH_M28EVK M28EVK 3613 +pda MACH_PDA PDA 3614 +meraki_mr58 MACH_MERAKI_MR58 MERAKI_MR58 3615 +kota2 MACH_KOTA2 KOTA2 3616 +letcool MACH_LETCOOL LETCOOL 3617 +mx27iat MACH_MX27IAT MX27IAT 3618 +apollo_td MACH_APOLLO_TD APOLLO_TD 3619 +arena MACH_ARENA ARENA 3620 +gsngateway MACH_GSNGATEWAY GSNGATEWAY 3621 +lf2000 MACH_LF2000 LF2000 3622 +bonito MACH_BONITO BONITO 3623 +asymptote MACH_ASYMPTOTE ASYMPTOTE 3624 +bst2brd MACH_BST2BRD BST2BRD 3625 +tx335s MACH_TX335S TX335S 3626 +pelco_tesla MACH_PELCO_TESLA PELCO_TESLA 3627 +rrhtestplat MACH_RRHTESTPLAT RRHTESTPLAT 3628 +vidtonic_pro MACH_VIDTONIC_PRO VIDTONIC_PRO 3629 +pl_apollo MACH_PL_APOLLO PL_APOLLO 3630 +pl_phoenix MACH_PL_PHOENIX PL_PHOENIX 3631 +m28cu3 MACH_M28CU3 M28CU3 3632 +vvbox_hd MACH_VVBOX_HD VVBOX_HD 3633 +coreware_sam9260_ MACH_COREWARE_SAM9260_ COREWARE_SAM9260_ 3634 +marmaduke MACH_MARMADUKE MARMADUKE 3635 +amg_xlcore_camera MACH_AMG_XLCORE_CAMERA AMG_XLCORE_CAMERA 3636 +omap3_egf MACH_OMAP3_EGF OMAP3_EGF 3637 +smdk4212 MACH_SMDK4212 SMDK4212 3638 +dnp9200 MACH_DNP9200 DNP9200 3639 +tf101 MACH_TF101 TF101 3640 +omap3silvio MACH_OMAP3SILVIO OMAP3SILVIO 3641 +picasso2 MACH_PICASSO2 PICASSO2 3642 +vangogh2 MACH_VANGOGH2 VANGOGH2 3643 +olpc_xo_1_75 MACH_OLPC_XO_1_75 OLPC_XO_1_75 3644 +gx400 MACH_GX400 GX400 3645 +gs300 MACH_GS300 GS300 3646 +acer_a9 MACH_ACER_A9 ACER_A9 3647 +vivow_evm MACH_VIVOW_EVM VIVOW_EVM 3648 +veloce_cxq MACH_VELOCE_CXQ VELOCE_CXQ 3649 +veloce_cxm MACH_VELOCE_CXM VELOCE_CXM 3650 +p1852 MACH_P1852 P1852 3651 +naxy100 MACH_NAXY100 NAXY100 3652 +taishan MACH_TAISHAN TAISHAN 3653 +touchlink MACH_TOUCHLINK TOUCHLINK 3654 +stm32f103ze MACH_STM32F103ZE STM32F103ZE 3655 +mcx MACH_MCX MCX 3656 +stm_nmhdk_fli7610 MACH_STM_NMHDK_FLI7610 STM_NMHDK_FLI7610 3657 +top28x MACH_TOP28X TOP28X 3658 +okl4vp_microvisor MACH_OKL4VP_MICROVISOR OKL4VP_MICROVISOR 3659 +pop MACH_POP POP 3660 +layer MACH_LAYER LAYER 3661 +trondheim MACH_TRONDHEIM TRONDHEIM 3662 +eva MACH_EVA EVA 3663 +trust_taurus MACH_TRUST_TAURUS TRUST_TAURUS 3664 +ns2816_huashan MACH_NS2816_HUASHAN NS2816_HUASHAN 3665 +ns2816_yangcheng MACH_NS2816_YANGCHENG NS2816_YANGCHENG 3666 +p852 MACH_P852 P852 3667 +flea3 MACH_FLEA3 FLEA3 3668 +bowfin MACH_BOWFIN BOWFIN 3669 +mv88de3100 MACH_MV88DE3100 MV88DE3100 3670 +pia_am35x MACH_PIA_AM35X PIA_AM35X 3671 +cedar MACH_CEDAR CEDAR 3672 +picasso_e MACH_PICASSO_E PICASSO_E 3673 +samsung_e60 MACH_SAMSUNG_E60 SAMSUNG_E60 3674 +msm9615_cdp MACH_MDM9615 MDM9615 3675 +sdvr_mini MACH_SDVR_MINI SDVR_MINI 3676 +omap3_ij3k MACH_OMAP3_IJ3K OMAP3_IJ3K 3677 +modasmc1 MACH_MODASMC1 MODASMC1 3678 +apq8064_rumi3 MACH_APQ8064_RUMI3 APQ8064_RUMI3 3679 +matrix506 MACH_MATRIX506 MATRIX506 3680 +msm9615_mtp MACH_MSM9615_MTP MSM9615_MTP 3681 +dm36x_spawndc MACH_DM36X_SPAWNDC DM36X_SPAWNDC 3682 +sff792 MACH_SFF792 SFF792 3683 +am335xiaevm MACH_AM335XIAEVM AM335XIAEVM 3684 +g3c2440 MACH_G3C2440 G3C2440 3685 +tion270 MACH_TION270 TION270 3686 +w22q7arm02 MACH_W22Q7ARM02 W22Q7ARM02 3687 +omap_cat MACH_OMAP_CAT OMAP_CAT 3688 +at91sam9n12ek MACH_AT91SAM9N12EK AT91SAM9N12EK 3689 +morrison MACH_MORRISON MORRISON 3690 +svdu MACH_SVDU SVDU 3691 +lpp01 MACH_LPP01 LPP01 3692 +ubc283 MACH_UBC283 UBC283 3693 +zeppelin MACH_ZEPPELIN ZEPPELIN 3694 +motus MACH_MOTUS MOTUS 3695 +neomainboard MACH_NEOMAINBOARD NEOMAINBOARD 3696 +devkit3250 MACH_DEVKIT3250 DEVKIT3250 3697 +devkit7000 MACH_DEVKIT7000 DEVKIT7000 3698 +fmc_uic MACH_FMC_UIC FMC_UIC 3699 +fmc_dcm MACH_FMC_DCM FMC_DCM 3700 +batwm MACH_BATWM BATWM 3701 +atlas6cb MACH_ATLAS6CB ATLAS6CB 3702 +quattro_f MACH_QUATTROF QUATTROF 3703 +quattro_u MACH_QUATTROU QUATTROU 3704 +blue MACH_BLUE BLUE 3705 +colorado MACH_COLORADO COLORADO 3706 +popc MACH_POPC POPC 3707 +promwad_jade MACH_PROMWAD_JADE PROMWAD_JADE 3708 +amp MACH_AMP AMP 3709 +gnet_amp MACH_GNET_AMP GNET_AMP 3710 +toques MACH_TOQUES TOQUES 3711 +apx4devkit MACH_APX4DEVKIT APX4DEVKIT 3712 +dct_storm MACH_DCT_STORM DCT_STORM 3713 +dm8168z3 MACH_Z3 Z3 3714 +owl MACH_OWL OWL 3715 +cogent_csb1741 MACH_COGENT_CSB1741 COGENT_CSB1741 3716 +omap3_kiko MACH_OMAP3 OMAP3 3717 +adillustra610 MACH_ADILLUSTRA610 ADILLUSTRA610 3718 +ecafe_na04 MACH_ECAFE_NA04 ECAFE_NA04 3719 +popct MACH_POPCT POPCT 3720 +omap3_helena MACH_OMAP3_HELENA OMAP3_HELENA 3721 +ach MACH_ACH ACH 3722 +module_dtb MACH_MODULE_DTB MODULE_DTB 3723 +ratebox MACH_RACKBOX RACKBOX 3724 +oslo_elisabeth MACH_OSLO_ELISABETH OSLO_ELISABETH 3725 +tt01 MACH_TT01 TT01 3726 +msm8930_cdp MACH_MSM8930_CDP MSM8930_CDP 3727 +msm8930_mtp MACH_MSM8930_MTP MSM8930_MTP 3728 +msm8930_fluid MACH_MSM8930_FLUID MSM8930_FLUID 3729 +ltu11 MACH_LTU11 LTU11 3730 +am1808_spawnco MACH_AM1808_SPAWNCO AM1808_SPAWNCO 3731 +flx6410 MACH_FLX6410 FLX6410 3732 +mx6q_qsb MACH_MX6Q_QSB MX6Q_QSB 3733 +mx53_plt424 MACH_MX53_PLT424 MX53_PLT424 3734 +jasmine MACH_JASMINE JASMINE 3735 +l138_owlboard_plus MACH_L138_OWLBOARD_PLUS L138_OWLBOARD_PLUS 3736 +wr21 MACH_WR21 WR21 3737 +peaboy MACH_PEABOY PEABOY 3739 +mx28_plato MACH_MX28_PLATO MX28_PLATO 3740 +kacom2 MACH_KACOM2 KACOM2 3741 +slco MACH_SLCO SLCO 3742 +imx51pico MACH_IMX51PICO IMX51PICO 3743 +glink1 MACH_GLINK1 GLINK1 3744 +diamond MACH_DIAMOND DIAMOND 3745 +d9000 MACH_D9000 D9000 3746 +w5300e01 MACH_W5300E01 W5300E01 3747 +im6000 MACH_IM6000 IM6000 3748 +mx51_fred51 MACH_MX51_FRED51 MX51_FRED51 3749 +stm32f2 MACH_STM32F2 STM32F2 3750 +ville MACH_VILLE VILLE 3751 +ptip_murnau MACH_PTIP_MURNAU PTIP_MURNAU 3752 +ptip_classic MACH_PTIP_CLASSIC PTIP_CLASSIC 3753 +mx53grb MACH_MX53GRB MX53GRB 3754 +gagarin MACH_GAGARIN GAGARIN 3755 +msm7627a_qrd1 MACH_MSM7X27A_QRD1 MSM7X27A_QRD1 3756 +nas2big MACH_NAS2BIG NAS2BIG 3757 +superfemto MACH_SUPERFEMTO SUPERFEMTO 3758 +teufel MACH_TEUFEL TEUFEL 3759 +dinara MACH_DINARA DINARA 3760 +vanquish MACH_VANQUISH VANQUISH 3761 +zipabox1 MACH_ZIPABOX1 ZIPABOX1 3762 +u9540 MACH_U9540 U9540 3763 +jet MACH_JET JET 3764 +smdk4412 MACH_SMDK4412 SMDK4412 3765 +elite MACH_ELITE ELITE 3766 +spear320_hmi MACH_SPEAR320_HMI SPEAR320_HMI 3767 +ontario MACH_ONTARIO ONTARIO 3768 +mx6q_sabrelite MACH_MX6Q_SABRELITE MX6Q_SABRELITE 3769 +vc200 MACH_VC200 VC200 3770 +msm7625a_ffa MACH_MSM7625A_FFA MSM7625A_FFA 3771 +msm7625a_surf MACH_MSM7625A_SURF MSM7625A_SURF 3772 +benthossbp MACH_BENTHOSSBP BENTHOSSBP 3773 +smdk5210 MACH_SMDK5210 SMDK5210 3774 +empq2300 MACH_EMPQ2300 EMPQ2300 3775 +minipos MACH_MINIPOS MINIPOS 3776 +omap5_sevm MACH_OMAP5_SEVM OMAP5_SEVM 3777 +shelter MACH_SHELTER SHELTER 3778 +omap3_devkit8500 MACH_OMAP3_DEVKIT8500 OMAP3_DEVKIT8500 3779 +edgetd MACH_EDGETD EDGETD 3780 +copperyard MACH_COPPERYARD COPPERYARD 3781 +edge_test MACH_EDGE EDGE 3782 +edge_u MACH_EDGE_U EDGE_U 3783 +edge_td MACH_EDGE_TD EDGE_TD 3784 +wdss MACH_WDSS WDSS 3785 +dl_pb25 MACH_DL_PB25 DL_PB25 3786 +dss11 MACH_DSS11 DSS11 3787 +cpa MACH_CPA CPA 3788 +aptp2000 MACH_APTP2000 APTP2000 3789 +marzen MACH_MARZEN MARZEN 3790 +st_turbine MACH_ST_TURBINE ST_TURBINE 3791 +gtl_it3300 MACH_GTL_IT3300 GTL_IT3300 3792 +mx6_mule MACH_MX6_MULE MX6_MULE 3793 +v7pxa_dt MACH_V7PXA_DT V7PXA_DT 3794 +v7mmp_dt MACH_V7MMP_DT V7MMP_DT 3795 +dragon7 MACH_DRAGON7 DRAGON7 3796 +krome MACH_KROME KROME 3797 +oratisdante MACH_ORATISDANTE ORATISDANTE 3798 +fathom MACH_FATHOM FATHOM 3799 +dns325 MACH_DNS325 DNS325 3800 +sarnen MACH_SARNEN SARNEN 3801 +ubisys_g1 MACH_UBISYS_G1 UBISYS_G1 3802 +mx53_pf1 MACH_MX53_PF1 MX53_PF1 3803 +asanti MACH_ASANTI ASANTI 3804 +volta MACH_VOLTA VOLTA 3805 +potenza MACH_S5P6450 S5P6450 3806 +knight MACH_KNIGHT KNIGHT 3807 +beaglebone MACH_BEAGLEBONE BEAGLEBONE 3808 +becker MACH_BECKER BECKER 3809 +fc360 MACH_FC360 FC360 3810 +pmi2_xls MACH_PMI2_XLS PMI2_XLS 3811 +taranto MACH_TARANTO TARANTO 3812 +plutux MACH_PLUTUX PLUTUX 3813 +ipmp_medcom MACH_IPMP_MEDCOM IPMP_MEDCOM 3814 +absolut MACH_ABSOLUT ABSOLUT 3815 +awpb3 MACH_AWPB3 AWPB3 3816 +nfp32xx_dt MACH_NFP32XX_DT NFP32XX_DT 3817 +dl_pb53 MACH_DL_PB53 DL_PB53 3818 +acu_ii MACH_ACU_II ACU_II 3819 +avalon MACH_AVALON AVALON 3820 +sphinx MACH_SPHINX SPHINX 3821 +titan_t MACH_TITAN_T TITAN_T 3822 +harvest_boris MACH_HARVEST_BORIS HARVEST_BORIS 3823 +mach_msm7x30_m3s MACH_MACH_MSM7X30_M3S MACH_MSM7X30_M3S 3824 +smdk5250 MACH_SMDK5250 SMDK5250 3825 +imxt_lite MACH_IMXT_LITE IMXT_LITE 3826 +imxt_std MACH_IMXT_STD IMXT_STD 3827 +imxt_log MACH_IMXT_LOG IMXT_LOG 3828 +imxt_nav MACH_IMXT_NAV IMXT_NAV 3829 +imxt_full MACH_IMXT_FULL IMXT_FULL 3830 +ag09015 MACH_AG09015 AG09015 3831 +am3517_mt_ventoux MACH_AM3517_MT_VENTOUX AM3517_MT_VENTOUX 3832 +dp1arm9 MACH_DP1ARM9 DP1ARM9 3833 +picasso_m MACH_PICASSO_M PICASSO_M 3834 +video_gadget MACH_VIDEO_GADGET VIDEO_GADGET 3835 +mtt_om3x MACH_MTT_OM3X MTT_OM3X 3836 +mx6q_arm2 MACH_MX6Q_ARM2 MX6Q_ARM2 3837 +picosam9g45 MACH_PICOSAM9G45 PICOSAM9G45 3838 +vpm_dm365 MACH_VPM_DM365 VPM_DM365 3839 +bonfire MACH_BONFIRE BONFIRE 3840 +mt2p2d MACH_MT2P2D MT2P2D 3841 +sigpda01 MACH_SIGPDA01 SIGPDA01 3842 +cn27 MACH_CN27 CN27 3843 +mx25_cwtap MACH_MX25_CWTAP MX25_CWTAP 3844 +apf28 MACH_APF28 APF28 3845 +pelco_maxwell MACH_PELCO_MAXWELL PELCO_MAXWELL 3846 +ge_phoenix MACH_GE_PHOENIX GE_PHOENIX 3847 +empc_a500 MACH_EMPC_A500 EMPC_A500 3848 +ims_arm9 MACH_IMS_ARM9 IMS_ARM9 3849 +mini2416 MACH_MINI2416 MINI2416 3850 +mini2450 MACH_MINI2450 MINI2450 3851 +mini310 MACH_MINI310 MINI310 3852 +spear_hurricane MACH_SPEAR_HURRICANE SPEAR_HURRICANE 3853 +mt7208 MACH_MT7208 MT7208 3854 +lpc178x MACH_LPC178X LPC178X 3855 +farleys MACH_FARLEYS FARLEYS 3856 +efm32gg_dk3750 MACH_EFM32GG_DK3750 EFM32GG_DK3750 3857 +zeus_board MACH_ZEUS_BOARD ZEUS_BOARD 3858 +cc51 MACH_CC51 CC51 3859 +fxi_c210 MACH_FXI_C210 FXI_C210 3860 +msm8627_cdp MACH_MSM8627_CDP MSM8627_CDP 3861 +msm8627_mtp MACH_MSM8627_MTP MSM8627_MTP 3862 +armadillo800eva MACH_ARMADILLO800EVA ARMADILLO800EVA 3863 +primou MACH_PRIMOU PRIMOU 3864 +primoc MACH_PRIMOC PRIMOC 3865 +primoct MACH_PRIMOCT PRIMOCT 3866 +a9500 MACH_A9500 A9500 3867 +pue_td MACH_PULSE_TD PULSE_TD 3868 +pluto MACH_PLUTO PLUTO 3869 +acfx100 MACH_ACFX100 ACFX100 3870 +msm8625_rumi3 MACH_MSM8625_RUMI3 MSM8625_RUMI3 3871 +valente MACH_VALENTE VALENTE 3872 +crfs_rfeye MACH_CRFS_RFEYE CRFS_RFEYE 3873 +rfeye MACH_RFEYE RFEYE 3874 +phidget_sbc3 MACH_PHIDGET_SBC3 PHIDGET_SBC3 3875 +tcw_mika MACH_TCW_MIKA TCW_MIKA 3876 +imx28_egf MACH_IMX28_EGF IMX28_EGF 3877 +valente_wx MACH_VALENTE_WX VALENTE_WX 3878 +huangshans MACH_HUANGSHANS HUANGSHANS 3879 +bosphorus1 MACH_BOSPHORUS1 BOSPHORUS1 3880 +prima MACH_PRIMA PRIMA 3881 +meson3_skt MACH_M3_SKT M3_SKT 3882 +meson3_ref MACH_M3_REF M3_REF 3883 +evita_ulk MACH_EVITA_ULK EVITA_ULK 3884 +merisc600 MACH_MERISC600 MERISC600 3885 +dolak MACH_DOLAK DOLAK 3886 +sbc53 MACH_SBC53 SBC53 3887 +elite_ulk MACH_ELITE_ULK ELITE_ULK 3888 +pov2 MACH_POV2 POV2 3889 +ipod_touch_2g MACH_IPOD_TOUCH_2G IPOD_TOUCH_2G 3890 +da850_pqab MACH_DA850_PQAB DA850_PQAB 3891 +fermi MACH_FERMI FERMI 3892 +ccardwmx28 MACH_CCARDWMX28 CCARDWMX28 3893 +ccardmx28 MACH_CCARDMX28 CCARDMX28 3894 +fs20_fcm2050 MACH_FS20_FCM2050 FS20_FCM2050 3895 +kinetis MACH_KINETIS KINETIS 3896 +kai MACH_KAI KAI 3897 +bcthb2 MACH_BCTHB2 BCTHB2 3898 +inels3_cu MACH_INELS3_CU INELS3_CU 3899 +da850_juniper MACH_JUNIPER JUNIPER 3900 +da850_apollo MACH_DA850_APOLLO DA850_APOLLO 3901 +tracnas MACH_TRACNAS TRACNAS 3902 +mityarm335x MACH_MITYARM335X MITYARM335X 3903 +xcgz7x MACH_XCGZ7X XCGZ7X 3904 +cubox MACH_CUBOX CUBOX 3905 +terminator MACH_TERMINATOR TERMINATOR 3906 +eye03 MACH_EYE03 EYE03 3907 +kota3 MACH_KOTA3 KOTA3 3908 +mx53_nitrogen_k MACH_MX5 MX5 3909 +pscpe MACH_PSCPE PSCPE 3910 +akt1100 MACH_AKT1100 AKT1100 3911 +pcaaxl2 MACH_PCAAXL2 PCAAXL2 3912 +primodd_ct MACH_PRIMODD_CT PRIMODD_CT 3913 +nsbc MACH_NSBC NSBC 3914 +meson2_skt MACH_MESON2_SKT MESON2_SKT 3915 +meson2_ref MACH_MESON2_REF MESON2_REF 3916 +ccardwmx28js MACH_CCARDWMX28JS CCARDWMX28JS 3917 +ccardmx28js MACH_CCARDMX28JS CCARDMX28JS 3918 +indico MACH_INDICO INDICO 3919 +msm8960dt MACH_MSM8960DT MSM8960DT 3920 +primods MACH_PRIMODS PRIMODS 3921 +beluga_m1388 MACH_BELUGA_M1388 BELUGA_M1388 3922 +primotd MACH_PRIMOTD PRIMOTD 3923 +varan_master MACH_VARAN_MASTER VARAN_MASTER 3924 +primodd MACH_PRIMODD PRIMODD 3925 +jetduo MACH_JETDUO JETDUO 3926 +mx53_umobo MACH_MX53_UMOBO MX53_UMOBO 3927 +trats MACH_TRATS TRATS 3928 +starcraft MACH_STARCRAFT STARCRAFT 3929 +qseven_tegra2 MACH_QSEVEN_TEGRA2 QSEVEN_TEGRA2 3930 +lichee_sun4i_devbd MACH_LICHEE_SUN4I_DEVBD LICHEE_SUN4I_DEVBD 3931 +movenow MACH_MOVENOW MOVENOW 3932 +golf_u MACH_GOLF_U GOLF_U 3933 +msm7627a_evb MACH_MSM7627A_EVB MSM7627A_EVB 3934 +rambo MACH_RAMBO RAMBO 3935 +golfu MACH_GOLFU GOLFU 3936 +mango310 MACH_MANGO310 MANGO310 3937 +dns343 MACH_DNS343 DNS343 3938 +var_som_om44 MACH_VAR_SOM_OM44 VAR_SOM_OM44 3939 +naon MACH_NAON NAON 3940 +vp4000 MACH_VP4000 VP4000 3941 +impcard MACH_IMPCARD IMPCARD 3942 +smoovcam MACH_SMOOVCAM SMOOVCAM 3943 +cobham3725 MACH_COBHAM3725 COBHAM3725 3944 +cobham3730 MACH_COBHAM3730 COBHAM3730 3945 +cobham3703 MACH_COBHAM3703 COBHAM3703 3946 +quetzal MACH_QUETZAL QUETZAL 3947 +apq8064_cdp MACH_APQ8064_CDP APQ8064_CDP 3948 +apq8064_mtp MACH_APQ8064_MTP APQ8064_MTP 3949 +apq8064_fluid MACH_APQ8064_FLUID APQ8064_FLUID 3950 +apq8064_liquid MACH_APQ8064_LIQUID APQ8064_LIQUID 3951 +mango210 MACH_MANGO210 MANGO210 3952 +mango100 MACH_MANGO100 MANGO100 3953 +mango24 MACH_MANGO24 MANGO24 3954 +mango64 MACH_MANGO64 MANGO64 3955 +nsa320 MACH_NSA320 NSA320 3956 +elv_ccu2 MACH_ELV_CCU2 ELV_CCU2 3957 +triton_x00 MACH_TRITON_X00 TRITON_X00 3958 +triton_1500_2000 MACH_TRITON_1500_2000 TRITON_1500_2000 3959 +pogoplugv4 MACH_POGOPLUGV4 POGOPLUGV4 3960 +venus_cl MACH_VENUS_CL VENUS_CL 3961 +vulcano_g20 MACH_VULCANO_G20 VULCANO_G20 3962 +sgs_i9100 MACH_SGS_I9100 SGS_I9100 3963 +stsv2 MACH_STSV2 STSV2 3964 +csb1724 MACH_CSB1724 CSB1724 3965 +omapl138_lcdk MACH_OMAPL138_LCDK OMAPL138_LCDK 3966 +jel_dd MACH_JEWEL_DD JEWEL_DD 3967 +pvd_mx25 MACH_PVD_MX25 PVD_MX25 3968 +meson6_skt MACH_MESON6_SKT MESON6_SKT 3969 +meson6_ref MACH_MESON6_REF MESON6_REF 3970 +pxm MACH_PXM PXM 3971 +stuttgart MACH_S3 S3 3972 +pogoplugv3 MACH_POGOPLUGV3 POGOPLUGV3 3973 +mlp89626 MACH_MLP89626 MLP89626 3974 +iomegahmndce MACH_IOMEGAHMNDCE IOMEGAHMNDCE 3975 +pogoplugv3pci MACH_POGOPLUGV3PCI POGOPLUGV3PCI 3976 +bntv250 MACH_BNTV250 BNTV250 3977 +mx53_qseven MACH_MX53_QSEVEN MX53_QSEVEN 3978 +gtl_it1100 MACH_GTL_IT1100 GTL_IT1100 3979 +mx6q_sabresd MACH_MX6Q_SABRESD MX6Q_SABRESD 3980 +mt4 MACH_MT4 MT4 3981 +jumbo_d MACH_JUMBO_D JUMBO_D 3982 +jumbo_i MACH_JUMBO_I JUMBO_I 3983 +fs20_dmp MACH_FS20_DMP FS20_DMP 3984 +dns320 MACH_DNS320 DNS320 3985 +mx28bacos MACH_MX28BACOS MX28BACOS 3986 +tl80 MACH_TL80 TL80 3987 +polatis_nic_1001 MACH_POLATIS_NIC_1001 POLATIS_NIC_1001 3988 +tely MACH_TELY TELY 3989 +u8520 MACH_U8520 U8520 3990 +manta MACH_MANTA MANTA 3991 +spear1340_lcad MACH_SPEAR_EM_S900 SPEAR_EM_S900 3992 +mpq8064_cdp MACH_MPQ8064_CDP MPQ8064_CDP 3993 +mpq8064_hrd MACH_MPQ8064_STB MPQ8064_STB 3994 +mpq8064_dtv MACH_MPQ8064_DTV MPQ8064_DTV 3995 +dm368som MACH_DM368SOM DM368SOM 3996 +gprisb2 MACH_GPRISB2 GPRISB2 3997 +chammid MACH_CHAMMID CHAMMID 3998 +seoul2 MACH_SEOUL2 SEOUL2 3999 +omap4_nooktablet MACH_OMAP4_NOOKTABLET OMAP4_NOOKTABLET 4000 +aalto MACH_AALTO AALTO 4001 +metro MACH_METRO METRO 4002 +cydm3730 MACH_CYDM3730 CYDM3730 4003 +tqma53 MACH_TQMA53 TQMA53 4004 +msm7627a_qrd3 MACH_MSM7627A_QRD3 MSM7627A_QRD3 4005 +mx28_canby MACH_MX28_CANBY MX28_CANBY 4006 +tiger MACH_TIGER TIGER 4007 +pcats_9307_type_a MACH_PCATS_9307_TYPE_A PCATS_9307_TYPE_A 4008 +pcats_9307_type_o MACH_PCATS_9307_TYPE_O PCATS_9307_TYPE_O 4009 +pcats_9307_type_r MACH_PCATS_9307_TYPE_R PCATS_9307_TYPE_R 4010 +streamplug MACH_STREAMPLUG STREAMPLUG 4011 +icechicken_dev MACH_ICECHICKEN_DEV ICECHICKEN_DEV 4012 +hedgehog MACH_HEDGEHOG HEDGEHOG 4013 +yusend_obc MACH_YUSEND_OBC YUSEND_OBC 4014 +imxninja MACH_IMXNINJA IMXNINJA 4015 +omap4_jarod MACH_OMAP4_JAROD OMAP4_JAROD 4016 +eco5_pk MACH_ECO5_PK ECO5_PK 4017 +qj2440 MACH_QJ2440 QJ2440 4018 +mx6q_mercury MACH_MX6Q_MERCURY MX6Q_MERCURY 4019 +cm6810 MACH_CM6810 CM6810 4020 +omap4_torpedo MACH_OMAP4_TORPEDO OMAP4_TORPEDO 4021 +nsa310 MACH_NSA310 NSA310 4022 +tmx536 MACH_TMX536 TMX536 4023 +ktt20 MACH_KTT20 KTT20 4024 +dragonix MACH_DRAGONIX DRAGONIX 4025 +lungching MACH_LUNGCHING LUNGCHING 4026 +bulogics MACH_BULOGICS BULOGICS 4027 +mx535_sx MACH_MX535_SX MX535_SX 4028 +ngui3250 MACH_NGUI3250 NGUI3250 4029 +salutec_dac MACH_SALUTEC_DAC SALUTEC_DAC 4030 +loco MACH_LOCO LOCO 4031 +ctera_plug_usi MACH_CTERA_PLUG_USI CTERA_PLUG_USI 4032 +scepter MACH_SCEPTER SCEPTER 4033 +sga MACH_SGA SGA 4034 +p_81_j5 MACH_P_81_J5 P_81_J5 4035 +p_81_o4 MACH_P_81_O4 P_81_O4 4036 +msm8625_surf MACH_MSM8625_SURF MSM8625_SURF 4037 +carallon_shark MACH_CARALLON_SHARK CARALLON_SHARK 4038 +lsgc_icam MACH_LSGCICAM LSGCICAM 4039 +ordog MACH_ORDOG ORDOG 4040 +puente_io MACH_PUENTE_IO PUENTE_IO 4041 +msm8625_evb MACH_MSM8625_EVB MSM8625_EVB 4042 +ev_am1707 MACH_EV_AM1707 EV_AM1707 4043 +ev_am1707e2 MACH_EV_AM1707E2 EV_AM1707E2 4044 +ev_am3517e2 MACH_EV_AM3517E2 EV_AM3517E2 4045 +calabria MACH_CALABRIA CALABRIA 4046 +ev_imx287 MACH_EV_IMX287 EV_IMX287 4047 +erau MACH_ERAU ERAU 4048 +sichuan MACH_SICHUAN SICHUAN 4049 +sopdm MACH_WIRMA3 WIRMA3 4050 +davinci_da850 MACH_DAVINCI_DA850 DAVINCI_DA850 4051 +omap138_trunarc MACH_OMAP138_TRUNARC OMAP138_TRUNARC 4052 +bcm4761 MACH_BCM4761 BCM4761 4053 +picasso_e2 MACH_PICASSO_E2 PICASSO_E2 4054 +picasso_mf MACH_PICASSO_MF PICASSO_MF 4055 +miro MACH_MIRO MIRO 4056 +at91sam9g20ewon3 MACH_AT91SAM9G20EWON3 AT91SAM9G20EWON3 4057 +yoyo MACH_YOYO YOYO 4058 +windjkl MACH_WINDJKL WINDJKL 4059 +monarudo MACH_MONARUDO MONARUDO 4060 +batan MACH_BATAN BATAN 4061 +tadao MACH_TADAO TADAO 4062 +baso MACH_BASO BASO 4063 +mahon MACH_MAHON MAHON 4064 +villec2 MACH_VILLEC2 VILLEC2 4065 +asi1230 MACH_ASI1230 ASI1230 4066 +alaska MACH_ALASKA ALASKA 4067 +swarco_shdsl2 MACH_SWARCO_SHDSL2 SWARCO_SHDSL2 4068 +oxrtu MACH_OXRTU OXRTU 4069 +omap5_panda MACH_OMAP5_PANDA OMAP5_PANDA 4070 +imx286 MACH_MX28XDI MX28XDI 4071 +c8000 MACH_C8000 C8000 4072 +bje_display3_5 MACH_BJE_DISPLAY3_5 BJE_DISPLAY3_5 4073 +picomod7 MACH_PICOMOD7 PICOMOD7 4074 +picocom5 MACH_PICOCOM5 PICOCOM5 4075 +qblissa8 MACH_QBLISSA8 QBLISSA8 4076 +armstonea8 MACH_ARMSTONEA8 ARMSTONEA8 4077 +netdcu14 MACH_NETDCU14 NETDCU14 4078 +at91sam9x5_epiphan MACH_AT91SAM9X5_EPIPHAN AT91SAM9X5_EPIPHAN 4079 +p2u MACH_P2U P2U 4080 +doris MACH_DORIS DORIS 4081 +j49 MACH_J49 J49 4082 +vdss2e MACH_VDSS2E VDSS2E 4083 +vc300 MACH_VC300 VC300 4084 +ns115_pad_test MACH_NS115_PAD_TEST NS115_PAD_TEST 4085 +ns115_pad_ref MACH_NS115_PAD_REF NS115_PAD_REF 4086 +ns115_phone_test MACH_NS115_PHONE_TEST NS115_PHONE_TEST 4087 +ns115_phone_ref MACH_NS115_PHONE_REF NS115_PHONE_REF 4088 +golfc MACH_GOLFC GOLFC 4089 +xerox_olympus MACH_XEROX_OLYMPUS XEROX_OLYMPUS 4090 +mx6sl_arm2 MACH_MX6SL_ARM2 MX6SL_ARM2 4091 +csb1701_csb1726 MACH_CSB1701_CSB1726 CSB1701_CSB1726 4092 +at91sam9xeek MACH_AT91SAM9XEEK AT91SAM9XEEK 4093 +ebv210 MACH_EBV210 EBV210 4094 +msm7627a_qrd7 MACH_MSM7627A_QRD7 MSM7627A_QRD7 4095 +svthin MACH_SVTHIN SVTHIN 4096 +duovero MACH_DUOVERO DUOVERO 4097 +chupacabra MACH_CHUPACABRA CHUPACABRA 4098 +scorpion MACH_SCORPION SCORPION 4099 +davinci_he_hmi10 MACH_DAVINCI_HE_HMI10 DAVINCI_HE_HMI10 4100 +topkick MACH_TOPKICK TOPKICK 4101 +m3_auguestrush MACH_M3_AUGUESTRUSH M3_AUGUESTRUSH 4102 +ipc335x MACH_IPC335X IPC335X 4103 +sun4i MACH_SUN4I SUN4I 4104 +imx233_olinuxino MACH_IMX233_OLINUXINO IMX233_OLINUXINO 4105 +k2_wl MACH_K2_WL K2_WL 4106 +k2_ul MACH_K2_UL K2_UL 4107 +k2_cl MACH_K2_CL K2_CL 4108 +minbari_w MACH_MINBARI_W MINBARI_W 4109 +minbari_m MACH_MINBARI_M MINBARI_M 4110 +k035 MACH_K035 K035 4111 +ariel MACH_ARIEL ARIEL 4112 +arielsaarc MACH_ARIELSAARC ARIELSAARC 4113 +arieldkb MACH_ARIELDKB ARIELDKB 4114 +armadillo810 MACH_ARMADILLO810 ARMADILLO810 4115 +tam335x MACH_TAM335X TAM335X 4116 +grouper MACH_GROUPER GROUPER 4117 +mpcsa21_9g20 MACH_MPCSA21_9G20 MPCSA21_9G20 4118 +m6u_cpu MACH_M6U_CPU M6U_CPU 4119 +davinci_dp10 MACH_DAVINCI_DP10 DAVINCI_DP10 4120 +ginkgo MACH_GINKGO GINKGO 4121 +cgt_qmx6 MACH_CGT_QMX6 CGT_QMX6 4122 +profpga MACH_PROFPGA PROFPGA 4123 +acfx100oc MACH_ACFX100OC ACFX100OC 4124 +acfx100nb MACH_ACFX100NB ACFX100NB 4125 +capricorn MACH_CAPRICORN CAPRICORN 4126 +pisces MACH_PISCES PISCES 4127 +aries MACH_ARIES ARIES 4128 +cancer MACH_CANCER CANCER 4129 +leo MACH_LEO LEO 4130 +virgo MACH_VIRGO VIRGO 4131 +sagittarius MACH_SAGITTARIUS SAGITTARIUS 4132 +devil MACH_DEVIL DEVIL 4133 +ballantines MACH_BALLANTINES BALLANTINES 4134 +omap3_procerusvpu MACH_OMAP3_PROCERUSVPU OMAP3_PROCERUSVPU 4135 +my27 MACH_MY27 MY27 4136 +sun6i MACH_SUN6I SUN6I 4137 +sun5i MACH_SUN5I SUN5I 4138 +mx512_mx MACH_MX512_MX MX512_MX 4139 +kzm9g MACH_KZM9G KZM9G 4140 +vdstbn MACH_VDSTBN VDSTBN 4141 +cfa10036 MACH_CFA10036 CFA10036 4142 +cfa10049 MACH_CFA10049 CFA10049 4143 +pcm051 MACH_PCM051 PCM051 4144 +vybrid_vf7xx MACH_VYBRID_VF7XX VYBRID_VF7XX 4145 +vybrid_vf6xx MACH_VYBRID_VF6XX VYBRID_VF6XX 4146 +vybrid_vf5xx MACH_VYBRID_VF5XX VYBRID_VF5XX 4147 +vybrid_vf4xx MACH_VYBRID_VF4XX VYBRID_VF4XX 4148 +aria_g25 MACH_ARIA_G25 ARIA_G25 4149 +bcm21553 MACH_BCM21553 BCM21553 4150 +smdk5410 MACH_SMDK5410 SMDK5410 4151 +lpc18xx MACH_LPC18XX LPC18XX 4152 +oratisparty MACH_ORATISPARTY ORATISPARTY 4153 +qseven MACH_QSEVEN QSEVEN 4154 +gmv_generic MACH_GMV_GENERIC GMV_GENERIC 4155 +th_link_eth MACH_TH_LINK_ETH TH_LINK_ETH 4156 +tn_muninn MACH_TN_MUNINN TN_MUNINN 4157 +rampage MACH_RAMPAGE RAMPAGE 4158 +visstrim_mv10 MACH_VISSTRIM_MV10 VISSTRIM_MV10 4159 +monacotdu MACH_MONACO_TDU MONACO_TDU 4160 +monacoul MACH_MONACO_UL MONACO_UL 4161 +enrc2u MACH_ENRC2_U ENRC2_U 4162 +evitareul MACH_EVITA_UL EVITA_UL 4163 +mx28_wilma MACH_MX28_WILMA MX28_WILMA 4164 +monacou MACH_MONACO_U MONACO_U 4165 +msm8625_ffa MACH_MSM8625_FFA MSM8625_FFA 4166 +vpu101 MACH_VPU101 VPU101 4167 +operaul MACH_OPERA_UL OPERA_UL 4168 +baileys MACH_BAILEYS BAILEYS 4169 +familybox MACH_FAMILYBOX FAMILYBOX 4170 +ensemble_mx35 MACH_ENSEMBLE_MX35 ENSEMBLE_MX35 4171 +sc_sps_1 MACH_SC_SPS_1 SC_SPS_1 4172 +ucsimply_sam9260 MACH_UCSIMPLY_SAM9260 UCSIMPLY_SAM9260 4173 +unicorn MACH_UNICORN UNICORN 4174 +m9g45a MACH_M9G45A M9G45A 4175 +mtwebif MACH_MTWEBIF MTWEBIF 4176 +playstone MACH_PLAYSTONE PLAYSTONE 4177 +chelsea MACH_CHELSEA CHELSEA 4178 +bayern MACH_BAYERN BAYERN 4179 +mitwo MACH_MITWO MITWO 4180 +mx25_noah MACH_MX25_NOAH MX25_NOAH 4181 +stm_b2020 MACH_STM_B2020 STM_B2020 4182 +annax_src MACH_ANNAX_SRC ANNAX_SRC 4183 +ionics_stratus MACH_IONICS_STRATUS IONICS_STRATUS 4184 +hugo MACH_HUGO HUGO 4185 +em300 MACH_EM300 EM300 4186 +mmp3_qseven MACH_MMP3_QSEVEN MMP3_QSEVEN 4187 +bosphorus2 MACH_BOSPHORUS2 BOSPHORUS2 4188 +tt2200 MACH_TT2200 TT2200 4189 +ocelot3 MACH_OCELOT3 OCELOT3 4190 +tek_cobra MACH_TEK_COBRA TEK_COBRA 4191 +protou MACH_PROTOU PROTOU 4192 diff --git a/sys/arm/econa/econa_machdep.c b/sys/arm/econa/econa_machdep.c index 0262446cf65..de18fd12eb1 100644 --- a/sys/arm/econa/econa_machdep.c +++ b/sys/arm/econa/econa_machdep.c @@ -103,10 +103,6 @@ extern u_int undefined_handler_address; struct pv_addr kernel_pt_table[NUM_KERNEL_PTS]; -extern void *_end; - -extern int *end; - struct pcpu __pcpu; struct pcpu *pcpup = &__pcpu; @@ -114,7 +110,6 @@ struct pcpu *pcpup = &__pcpu; vm_paddr_t phys_avail[10]; vm_paddr_t dump_avail[4]; -vm_offset_t physical_pages; struct pv_addr systempage; struct pv_addr msgbufpv; @@ -123,11 +118,6 @@ struct pv_addr undstack; struct pv_addr abtstack; struct pv_addr kernelstack; -static void *boot_arg1; -static void *boot_arg2; - -static struct trapframe proc0_tf; - /* Static device mappings. */ static const struct pmap_devmap econa_devmap[] = { { @@ -186,7 +176,7 @@ static const struct pmap_devmap econa_devmap[] = { void * -initarm(void *arg, void *arg2) +initarm(struct arm_boot_params *abp) { struct pv_addr kernel_l1pt; volatile uint32_t * ddr = (uint32_t *)0x4000000C; @@ -198,13 +188,9 @@ initarm(void *arg, void *arg2) uint32_t memsize; int mem_info; - - boot_arg1 = arg; - boot_arg2 = arg2; boothowto = RB_VERBOSE; - + lastaddr = parse_boot_param(abp); set_cpufuncs(); - lastaddr = fake_preload_metadata(); pcpu_init(pcpup, 0, sizeof(struct pcpu)); PCPU_SET(curthread, &thread0); @@ -238,7 +224,6 @@ initarm(void *arg, void *arg2) kernel_pt_table[loop].pv_va - KERNVIRTADDR + KERNPHYSADDR; } - i++; } /* * Allocate a page for the system page mapped to V0x00000000 @@ -347,30 +332,13 @@ initarm(void *arg, void *arg2) undefined_handler_address = (u_int)undefinedinstruction_bounce; undefined_init(); - proc_linkup0(&proc0, &thread0); - thread0.td_kstack = kernelstack.pv_va; - thread0.td_pcb = (struct pcb *) - (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; - thread0.td_pcb->pcb_flags = 0; - thread0.td_frame = &proc0_tf; - pcpup->pc_curpcb = thread0.td_pcb; + init_proc0(kernelstack.pv_va); arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL); pmap_curmaxkvaddr = afterkern + L1_S_SIZE * (KERNEL_PT_KERN_NUM - 1); - - /* - * ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before - * calling pmap_bootstrap. - */ - dump_avail[0] = PHYSADDR; - dump_avail[1] = PHYSADDR + memsize; - dump_avail[2] = 0; - dump_avail[3] = 0; - - pmap_bootstrap(freemempos, - KERNVIRTADDR + 3 * memsize, - &kernel_l1pt); + arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0])); + pmap_bootstrap(freemempos, KERNVIRTADDR + 3 * memsize, &kernel_l1pt); msgbufp = (void*)msgbufpv.pv_va; msgbufinit(msgbufp, msgbufsize); diff --git a/sys/arm/include/_stdint.h b/sys/arm/include/_stdint.h index 2a4f75afb4e..50861284d8b 100644 --- a/sys/arm/include/_stdint.h +++ b/sys/arm/include/_stdint.h @@ -149,12 +149,6 @@ /* Limit of size_t. */ #define SIZE_MAX UINT32_MAX -#ifndef WCHAR_MIN /* Also possibly defined in */ -/* Limits of wchar_t. */ -#define WCHAR_MIN INT32_MIN -#define WCHAR_MAX INT32_MAX -#endif - /* Limits of wint_t. */ #define WINT_MIN INT32_MIN #define WINT_MAX INT32_MAX diff --git a/sys/arm/include/_types.h b/sys/arm/include/_types.h index 338c19c1113..7915d0b7caf 100644 --- a/sys/arm/include/_types.h +++ b/sys/arm/include/_types.h @@ -105,6 +105,16 @@ typedef __uint32_t __vm_paddr_t; typedef __uint64_t __vm_pindex_t; typedef __uint32_t __vm_size_t; +#ifdef __ARM_EABI__ +typedef unsigned int __wchar_t; +#define __WCHAR_MIN 0 /* min value for a wchar_t */ +#define __WCHAR_MAX __UINT_MAX /* max value for a wchar_t */ +#else +typedef int __wchar_t; +#define __WCHAR_MIN __INT_MIN /* min value for a wchar_t */ +#define __WCHAR_MAX __INT_MAX /* max value for a wchar_t */ +#endif + /* * Unusual type definitions. */ diff --git a/sys/arm/include/armreg.h b/sys/arm/include/armreg.h index 4867692dd31..0057298db9e 100644 --- a/sys/arm/include/armreg.h +++ b/sys/arm/include/armreg.h @@ -327,7 +327,7 @@ /* * ARM Instructions * - * 3 3 2 2 2 + * 3 3 2 2 2 * 1 0 9 8 7 0 * +-------+-------------------------------------------------------+ * | cond | instruction dependant | diff --git a/sys/arm/include/asmacros.h b/sys/arm/include/asmacros.h index f06841f8e51..da612df1f65 100644 --- a/sys/arm/include/asmacros.h +++ b/sys/arm/include/asmacros.h @@ -92,7 +92,7 @@ * This should only be used if the processor is not currently in SVC32 * mode. The processor mode is switched to SVC mode and the trap frame is * stored. The SVC lr field is used to store the previous value of - * lr in SVC mode. + * lr in SVC mode. * * NOTE: r13 and r14 are stored separately as a work around for the * SA110 rev 2 STM^ bug diff --git a/sys/arm/include/atags.h b/sys/arm/include/atags.h new file mode 100644 index 00000000000..0eb6369a34f --- /dev/null +++ b/sys/arm/include/atags.h @@ -0,0 +1,129 @@ +/*- + * Copyright (c) 2012 M. Warner Losh. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef __MACHINE_ATAGS_H__ +#define __MACHINE_ATAGS_H__ + +/* + * Linux boot ABI compatable ATAG definitions. All these structures + * assume tight packing, but since they are all uint32_t's, I've not + * bothered to do the usual alignment dance. + */ + +#define LBABI_MAX_COMMAND_LINE 1024 + +struct arm_lbabi_header +{ + uint32_t size; /* Size of this node, including header */ + uint32_t tag; /* Node type */ +}; + +#define ATAG_NONE 0x00000000 /* End of atags list */ +#define ATAG_CORE 0x54410001 /* List must start with ATAG_CORE */ +#define ATAG_MEM 0x54410002 /* Multiple ATAG_MEM nodes possible */ +#define ATAG_VIDEOTEXT 0x54410003 /* Video parameters */ +#define ATAG_RAMDISK 0x54410004 /* Describes the ramdisk parameters */ +#define ATAG_INITRD 0x54410005 /* Deprecated ramdisk -- used va not pa */ +#define ATAG_INITRD2 0x54420005 /* compressed ramdisk image */ +#define ATAG_SERIAL 0x54410006 /* 64-bits of serial number */ +#define ATAG_REVISION 0x54410007 /* Board revision */ +#define ATAG_VIDEOLFB 0x54410008 /* vesafb framebuffer */ +#define ATAG_CMDLINE 0x54410009 /* Command line */ + +/* + * ATAG_CORE data + */ +struct arm_lbabi_core +{ + uint32_t flags; /* bit 0 == read-only */ + uint32_t pagesize; + uint32_t rootdev; +}; + +/* + * ATAG_MEM data -- Can be more than one to describe different + * banks. + */ +struct arm_lbabi_mem32 +{ + uint32_t size; + uint32_t start; /* start of physical memory */ +}; + +/* + * ATAG_INITRD2 - Compressed ramdisk image details + */ +struct arm_lbabi_initrd +{ + uint32_t start; /* pa of start */ + uint32_t size; /* How big the ram disk is */ +}; + +/* + * ATAG_SERIAL - serial number + */ +struct arm_lbabi_serial_number +{ + uint32_t low; + uint32_t high; +}; + +/* + * ATAG_REVISION - board revision + */ +struct arm_lbabi_revision +{ + uint32_t rev; +}; + +/* + * ATAG_CMDLINE - Command line from uboot + */ +struct arm_lbabi_command_line +{ + char command[1]; /* Minimum command length */ +}; + +struct arm_lbabi_tag +{ + struct arm_lbabi_header tag_hdr; + union { + struct arm_lbabi_core tag_core; + struct arm_lbabi_mem32 tag_mem; + struct arm_lbabi_initrd tag_initrd; + struct arm_lbabi_serial_number tag_sn; + struct arm_lbabi_revision tag_rev; + struct arm_lbabi_command_line tag_cmd; + } u; +}; + +#define ATAG_TAG(a) (a)->tag_hdr.tag +#define ATAG_SIZE(a) (a)->tag_hdr.size +#define ATAG_NEXT(a) (struct arm_lbabi_tag *)((char *)(a) + ATAG_SIZE(a)) + +#endif /* __MACHINE_ATAGS_H__ */ diff --git a/sys/arm/include/atomic.h b/sys/arm/include/atomic.h index 9f162201d52..a64fc4aefa7 100644 --- a/sys/arm/include/atomic.h +++ b/sys/arm/include/atomic.h @@ -285,7 +285,6 @@ atomic_fetchadd_32(volatile uint32_t *p, uint32_t v) return (start); } - #endif /* _KERNEL */ static __inline int diff --git a/sys/arm/include/blockio.h b/sys/arm/include/blockio.h index 05c35ae0e84..01db600217e 100644 --- a/sys/arm/include/blockio.h +++ b/sys/arm/include/blockio.h @@ -14,7 +14,7 @@ * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. diff --git a/sys/arm/include/board.h b/sys/arm/include/board.h new file mode 100644 index 00000000000..534997249b5 --- /dev/null +++ b/sys/arm/include/board.h @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2012 Warner Losh. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $FreeBSD$ */ + +#ifndef _ARM_INCLUDE_BOARD_H_ +#define _ARM_INCLUDE_BOARD_H_ + +#include + +typedef long (arm_board_init_fn)(void); + +struct arm_board { + int board_id; /* Board ID from the boot loader */ + const char *board_name; /* Human readable name */ + arm_board_init_fn *board_init; /* Board initialize code */ +}; + +#if defined(ARM_MANY_BOARD) + +#include "board_id.h" + +#define ARM_BOARD(id, name) \ + static struct arm_board this_board = { \ + .board_id = ARM_BOARD_ID_ ## id, \ + .board_name = name, \ + .board_init = board_init, \ + }; \ + DATA_SET(arm_boards, this_board); +#define BOARD_INIT static + +#else /* !ARM_MANY_BOARD */ + +#define ARM_BOARD(id, name) +extern arm_board_init_fn board_init; +#define BOARD_INIT + +#endif /* ARM_MANY_BOARD */ + +#endif /* _ARM_INCLUDE_BOARD_H_ */ diff --git a/sys/arm/include/cpu.h b/sys/arm/include/cpu.h index f9e94592973..9dae977c27f 100644 --- a/sys/arm/include/cpu.h +++ b/sys/arm/include/cpu.h @@ -6,8 +6,8 @@ #include -void cpu_halt(void); -void swi_vm(void *); +void cpu_halt(void); +void swi_vm(void *); #ifdef _KERNEL static __inline uint64_t @@ -25,8 +25,8 @@ get_cyclecount(void) #define TRAPF_PC(tfp) ((tfp)->tf_pc) -#define cpu_getstack(td) ((td)->td_frame->tf_usr_sp) -#define cpu_setstack(td, sp) ((td)->td_frame->tf_usr_sp = (sp)) +#define cpu_getstack(td) ((td)->td_frame->tf_usr_sp) +#define cpu_setstack(td, sp) ((td)->td_frame->tf_usr_sp = (sp)) #define cpu_spinwait() /* nothing */ #define ARM_NVEC 8 @@ -34,12 +34,20 @@ get_cyclecount(void) extern vm_offset_t vector_page; +struct arm_boot_params { + register_t abp_size; /* Size of this structure */ + register_t abp_r0; /* r0 from the boot loader */ + register_t abp_r1; /* r1 from the boot loader */ + register_t abp_r2; /* r2 from the boot loader */ + register_t abp_r3; /* r3 from the boot loader */ +}; + void arm_vector_init(vm_offset_t, int); void fork_trampoline(void); void identify_arm_cpu(void); -void *initarm(void *, void *); +void *initarm(struct arm_boot_params *); extern char btext[]; extern char etext[]; -int badaddr_read (void *, size_t, void *); +int badaddr_read(void *, size_t, void *); #endif /* !MACHINE_CPU_H */ diff --git a/sys/arm/include/cpufunc.h b/sys/arm/include/cpufunc.h index b06783650a0..dbba8b1734c 100644 --- a/sys/arm/include/cpufunc.h +++ b/sys/arm/include/cpufunc.h @@ -315,7 +315,7 @@ void sa11x0_drain_readbuf (void); void sa11x0_context_switch (void); void sa11x0_cpu_sleep (int mode); - + void sa11x0_setup (char *string); #endif @@ -471,7 +471,7 @@ extern unsigned armv5_dcache_index_inc; defined(CPU_FA526) || defined(CPU_FA626TE) || \ defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) || \ defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342) - + void armv4_tlb_flushID (void); void armv4_tlb_flushI (void); void armv4_tlb_flushD (void); @@ -526,7 +526,7 @@ void xscale_cache_flushD_rng (vm_offset_t start, vm_size_t end); void xscale_context_switch (void); void xscale_setup (char *string); -#endif /* CPU_XSCALE_80200 || CPU_XSCALE_80321 || CPU_XSCALE_PXA2X0 || CPU_XSCALE_IXP425 +#endif /* CPU_XSCALE_80200 || CPU_XSCALE_80321 || CPU_XSCALE_PXA2X0 || CPU_XSCALE_IXP425 CPU_XSCALE_80219 */ #ifdef CPU_XSCALE_81342 @@ -628,7 +628,7 @@ extern int arm_picache_ways; extern int arm_pdcache_size; /* and unified */ extern int arm_pdcache_line_size; -extern int arm_pdcache_ways; +extern int arm_pdcache_ways; extern int arm_pcache_type; extern int arm_pcache_unified; diff --git a/sys/arm/include/elf.h b/sys/arm/include/elf.h index d3f8873f86d..91086f85785 100644 --- a/sys/arm/include/elf.h +++ b/sys/arm/include/elf.h @@ -82,6 +82,7 @@ __ElfType(Auxinfo); #define AT_NCPUS 19 /* Number of CPUs. */ #define AT_PAGESIZES 20 /* Pagesizes. */ #define AT_PAGESIZESLEN 21 /* Number of pagesizes. */ +#define AT_TIMEKEEP 22 /* Pointer to timehands. */ #define AT_STACKPROT 23 /* Initial stack protection. */ #define AT_COUNT 24 /* Count of defined aux entry types. */ @@ -99,8 +100,8 @@ __ElfType(Auxinfo); #define ELF_TARG_MACH EM_ARM #define ELF_TARG_VER 1 -/* - * Magic number for the elf trampoline, chosen wisely to be an immediate +/* + * Magic number for the elf trampoline, chosen wisely to be an immediate * value. */ #define MAGIC_TRAMP_NUMBER 0x5c000003 diff --git a/sys/arm/include/endian.h b/sys/arm/include/endian.h index 8e3b952e76c..1d792ea8989 100644 --- a/sys/arm/include/endian.h +++ b/sys/arm/include/endian.h @@ -78,7 +78,7 @@ __bswap64(__uint64_t _x) return ((_x >> 56) | ((_x >> 40) & 0xff00) | ((_x >> 24) & 0xff0000) | ((_x >> 8) & 0xff000000) | ((_x << 8) & ((__uint64_t)0xff << 32)) | - ((_x << 24) & ((__uint64_t)0xff << 40)) | + ((_x << 24) & ((__uint64_t)0xff << 40)) | ((_x << 40) & ((__uint64_t)0xff << 48)) | ((_x << 56))); } diff --git a/sys/arm/include/fdt.h b/sys/arm/include/fdt.h index c7290aca129..7285e977def 100644 --- a/sys/arm/include/fdt.h +++ b/sys/arm/include/fdt.h @@ -44,7 +44,7 @@ /* Max interrupt number */ #define FDT_INTR_MAX NIRQ -/* Map phandle/intpin pair to global IRQ number */ +/* Map phandle/intpin pair to global IRQ number */ #define FDT_MAP_IRQ(node, pin) (pin) /* @@ -57,6 +57,7 @@ struct mem_region { vm_size_t mr_size; }; +int fdt_localbus_devmap(phandle_t, struct pmap_devmap *, int, int *); int fdt_pci_devmap(phandle_t, struct pmap_devmap *devmap, vm_offset_t, vm_offset_t); diff --git a/sys/arm/include/fp.h b/sys/arm/include/fp.h index ada720303c7..25effd69346 100644 --- a/sys/arm/include/fp.h +++ b/sys/arm/include/fp.h @@ -77,7 +77,7 @@ struct fpe_sp_state { * Type for a saved FP context, if we want to translate the context to a * user-readable form */ - + typedef struct { u_int32_t fpsr; fp_extended_precision_t regs[8]; diff --git a/sys/arm/include/frame.h b/sys/arm/include/frame.h index 0a038293eeb..a24eccce022 100644 --- a/sys/arm/include/frame.h +++ b/sys/arm/include/frame.h @@ -148,7 +148,7 @@ struct switchframe { u_int sf_r7; u_int sf_pc; }; - + /* * Stack frame. Used during stack traces (db_trace.c) */ @@ -162,5 +162,3 @@ struct frame { #endif /* !_LOCORE */ #endif /* _MACHINE_FRAME_H_ */ - -/* End of frame.h */ diff --git a/sys/arm/include/ieee.h b/sys/arm/include/ieee.h index 059d0dc3070..8ce9fd1085e 100644 --- a/sys/arm/include/ieee.h +++ b/sys/arm/include/ieee.h @@ -124,7 +124,7 @@ struct ieee_double { u_int dbl_sign:1; #if _IEEE_WORD_ORDER == _BIG_ENDIAN u_int dbl_fracl; -#endif +#endif #endif }; diff --git a/sys/arm/include/in_cksum.h b/sys/arm/include/in_cksum.h index 8862f282f0a..0767a15ba36 100644 --- a/sys/arm/include/in_cksum.h +++ b/sys/arm/include/in_cksum.h @@ -46,7 +46,9 @@ u_short in_cksum(struct mbuf *m, int len); u_short in_addword(u_short sum, u_short b); u_short in_cksum_skip(struct mbuf *m, int len, int skip); u_int do_cksum(const void *, int); +#if defined(IPVERSION) && (IPVERSION == 4) u_int in_cksum_hdr(const struct ip *); +#endif static __inline u_short in_pseudo(u_int sum, u_int b, u_int c) @@ -54,7 +56,7 @@ in_pseudo(u_int sum, u_int b, u_int c) __asm __volatile("adds %0, %0, %1\n" "adcs %0, %0, %2\n" "adc %0, %0, #0\n" - : "+r" (sum) + : "+r" (sum) : "r" (b), "r" (c)); sum = (sum & 0xffff) + (sum >> 16); if (sum > 0xffff) diff --git a/sys/arm/include/intr.h b/sys/arm/include/intr.h index 6dc0247d9a5..bf6a15acb6e 100644 --- a/sys/arm/include/intr.h +++ b/sys/arm/include/intr.h @@ -59,8 +59,8 @@ int arm_get_next_irq(int); void arm_mask_irq(uintptr_t); void arm_unmask_irq(uintptr_t); -void arm_setup_irqhandler(const char *, int (*)(void*), void (*)(void*), - void *, int, int, void **); +void arm_setup_irqhandler(const char *, int (*)(void*), void (*)(void*), + void *, int, int, void **); int arm_remove_irqhandler(int, void *); extern void (*arm_post_filter)(void *); #endif /* _MACHINE_INTR_H */ diff --git a/sys/arm/include/katelib.h b/sys/arm/include/katelib.h index ef69fe37238..472585a757a 100644 --- a/sys/arm/include/katelib.h +++ b/sys/arm/include/katelib.h @@ -43,7 +43,7 @@ * * This should not really be a separate header file. Eventually I will merge * this into other header files once I have decided where the declarations - * should go. + * should go. * * Created : 18/09/94 * diff --git a/sys/arm/include/kdb.h b/sys/arm/include/kdb.h index 74529227036..3195945207f 100644 --- a/sys/arm/include/kdb.h +++ b/sys/arm/include/kdb.h @@ -46,11 +46,14 @@ kdb_cpu_set_singlestep(void) static __inline void kdb_cpu_sync_icache(unsigned char *addr, size_t size) { + + cpu_icache_sync_all(); } static __inline void kdb_cpu_trap(int type, int code) { + cpu_idcache_wbinv_all(); } diff --git a/sys/arm/include/machdep.h b/sys/arm/include/machdep.h index 85c4114b0e5..7c5f56f6acc 100644 --- a/sys/arm/include/machdep.h +++ b/sys/arm/include/machdep.h @@ -6,10 +6,21 @@ /* misc prototypes used by the many arm machdeps */ void arm_lock_cache_line(vm_offset_t); -vm_offset_t fake_preload_metadata(void); +void init_proc0(vm_offset_t kstack); void halt(void); void data_abort_handler(trapframe_t *); void prefetch_abort_handler(trapframe_t *); void undefinedinstruction_bounce(trapframe_t *); +/* Early boot related helper functions */ +struct arm_boot_params; +vm_offset_t default_parse_boot_param(struct arm_boot_params *abp); +vm_offset_t freebsd_parse_boot_param(struct arm_boot_params *abp); +vm_offset_t linux_parse_boot_param(struct arm_boot_params *abp); +vm_offset_t fake_preload_metadata(struct arm_boot_params *abp); +vm_offset_t parse_boot_param(struct arm_boot_params *abp); + +/* Setup standard arrays */ +void arm_dump_avail_init( vm_offset_t memsize, size_t max); + #endif /* !_MACHINE_MACHDEP_H_ */ diff --git a/sys/arm/include/param.h b/sys/arm/include/param.h index 96a70388f1f..bb76c5f05d5 100644 --- a/sys/arm/include/param.h +++ b/sys/arm/include/param.h @@ -56,9 +56,13 @@ #define MACHINE "arm" #endif #ifndef MACHINE_ARCH +#ifdef __ARMEB__ +#define MACHINE_ARCH "armeb" +#else #define MACHINE_ARCH "arm" #endif -#define MID_MACHINE MID_ARM6 +#endif +#define MID_MACHINE MID_ARM6 #if defined(SMP) || defined(KLD_MODULE) #ifndef MAXCPU @@ -74,7 +78,7 @@ * ALIGNED_POINTER is a boolean macro that checks whether an address * is valid to fetch data elements of type t from on this architecture. * This does not reflect the optimal alignment, just the possibility - * (within reasonable limits). + * (within reasonable limits). */ #define ALIGNED_POINTER(p, t) ((((unsigned)(p)) & (sizeof(t)-1)) == 0) diff --git a/sys/arm/include/pcb.h b/sys/arm/include/pcb.h index 4a5f330b8a5..ce9ab97e6bc 100644 --- a/sys/arm/include/pcb.h +++ b/sys/arm/include/pcb.h @@ -94,7 +94,7 @@ void makectx(struct trapframe *tf, struct pcb *pcb); #ifdef _KERNEL -void savectx(struct pcb *); +void savectx(struct pcb *) __returns_twice; #endif /* _KERNEL */ #endif /* !_MACHINE_PCB_H_ */ diff --git a/sys/arm/include/pmap.h b/sys/arm/include/pmap.h index 5f499a1dc90..85ea31a840f 100644 --- a/sys/arm/include/pmap.h +++ b/sys/arm/include/pmap.h @@ -58,7 +58,7 @@ #define PTE_NOCACHE 0 #define PTE_CACHE 1 #define PTE_PAGETABLE 2 - + #ifndef LOCORE #include @@ -78,6 +78,7 @@ #define pmap_page_get_memattr(m) VM_MEMATTR_DEFAULT #define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list)) +#define pmap_page_is_write_mapped(m) (((m)->aflags & PGA_WRITEABLE) != 0) #define pmap_page_set_memattr(m, ma) (void)0 /* @@ -413,7 +414,7 @@ extern pt_entry_t pte_l2_s_cache_mode_pt; extern pt_entry_t pte_l2_s_prot_u; extern pt_entry_t pte_l2_s_prot_w; extern pt_entry_t pte_l2_s_prot_mask; - + extern pt_entry_t pte_l1_s_proto; extern pt_entry_t pte_l1_c_proto; extern pt_entry_t pte_l2_s_proto; diff --git a/sys/arm/include/pmc_mdep.h b/sys/arm/include/pmc_mdep.h index 185fbd1744c..6153df0f7eb 100644 --- a/sys/arm/include/pmc_mdep.h +++ b/sys/arm/include/pmc_mdep.h @@ -50,9 +50,23 @@ union pmc_md_pmc { struct pmc_md_xscale_pmc pm_xscale; }; -#define PMC_TRAPFRAME_TO_PC(TF) ((TF)->tf_pc) -#define PMC_TRAPFRAME_TO_FP(TF) ((TF)->tf_usr_lr) -#define PMC_TRAPFRAME_TO_SP(TF) ((TF)->tf_usr_sp) +#define PMC_IN_KERNEL_STACK(S,START,END) \ + ((S) >= (START) && (S) < (END)) +#define PMC_IN_KERNEL(va) (((va) >= USRSTACK) && \ + ((va) < VM_MAX_KERNEL_ADDRESS)) + +#define PMC_IN_USERSPACE(va) ((va) <= VM_MAXUSER_ADDRESS) + +#define PMC_TRAPFRAME_TO_PC(TF) ((TF)->tf_pc) +#define PMC_TRAPFRAME_TO_FP(TF) ((TF)->tf_r11) +#define PMC_TRAPFRAME_TO_SVC_SP(TF) ((TF)->tf_svc_sp) +#define PMC_TRAPFRAME_TO_USR_SP(TF) ((TF)->tf_usr_sp) + +/* Build a fake kernel trapframe from current instruction pointer. */ +#define PMC_FAKE_TRAPFRAME(TF) \ + do { \ + __asm __volatile("mov %0, pc" : "=r" ((TF)->tf_pc)); \ + } while (0) /* * Prototypes diff --git a/sys/arm/include/profile.h b/sys/arm/include/profile.h index b640bf77614..0c5a7672dea 100644 --- a/sys/arm/include/profile.h +++ b/sys/arm/include/profile.h @@ -38,7 +38,7 @@ #define _MACHINE_PROFILE_H_ /* - * Config generates something to tell the compiler to align functions on 32 + * Config generates something to tell the compiler to align functions on 32 * byte boundaries. A strict alignment is good for keeping the tables small. */ #define FUNCTION_ALIGNMENT 16 diff --git a/sys/arm/include/pte.h b/sys/arm/include/pte.h index 292983a9cd0..5921d200ef6 100644 --- a/sys/arm/include/pte.h +++ b/sys/arm/include/pte.h @@ -58,7 +58,7 @@ typedef uint32_t pt_entry_t; /* page table entry */ * was allocated for a PT then the other 3KB would also get mapped * whenever the 1KB was mapped. */ - + #define PT_RSIZE 0x0400 /* Real page table size */ #define PT_SIZE 0x1000 #define PD_SIZE 0x4000 @@ -315,7 +315,7 @@ typedef uint32_t pt_entry_t; /* page table entry */ * * Cache attributes with L2 present, S = 0 * T E X C B L1 i-cache L1 d-cache L1 DC WP L2 cacheable write coalesce - * 0 0 0 0 0 N N - N N + * 0 0 0 0 0 N N - N N * 0 0 0 0 1 N N - N Y * 0 0 0 1 0 Y Y WT N Y * 0 0 0 1 1 Y Y WB Y Y @@ -342,7 +342,7 @@ typedef uint32_t pt_entry_t; /* page table entry */ * * Cache attributes with L2 present, S = 1 * T E X C B L1 i-cache L1 d-cache L1 DC WP L2 cacheable write coalesce - * 0 0 0 0 0 N N - N N + * 0 0 0 0 0 N N - N N * 0 0 0 0 1 N N - N Y * 0 0 0 1 0 Y Y - N Y * 0 0 0 1 1 Y Y WT Y Y diff --git a/sys/arm/include/resource.h b/sys/arm/include/resource.h index 90dd5cdea2d..723d1458e51 100644 --- a/sys/arm/include/resource.h +++ b/sys/arm/include/resource.h @@ -12,7 +12,7 @@ * no representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. - * + * * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF diff --git a/sys/arm/include/stack.h b/sys/arm/include/stack.h index 32ff5a99b33..0a5ebfe7bd5 100644 --- a/sys/arm/include/stack.h +++ b/sys/arm/include/stack.h @@ -5,24 +5,24 @@ * Mach Operating System * Copyright (c) 1991,1990 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * diff --git a/sys/arm/include/vdso.h b/sys/arm/include/vdso.h new file mode 100644 index 00000000000..d6aa162a322 --- /dev/null +++ b/sys/arm/include/vdso.h @@ -0,0 +1,34 @@ +/*- + * Copyright 2012 Konstantin Belousov . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _ARM_VDSO_H +#define _ARM_VDSO_H + +#define VDSO_TIMEHANDS_MD \ + uint32_t th_res[8]; + +#endif diff --git a/sys/arm/include/vmparam.h b/sys/arm/include/vmparam.h index f85fa58cfeb..edff00b9831 100644 --- a/sys/arm/include/vmparam.h +++ b/sys/arm/include/vmparam.h @@ -104,7 +104,7 @@ #define VM_MIN_ADDRESS (0x00001000) #ifdef ARM_USE_SMALL_ALLOC -/* +/* * ARM_KERN_DIRECTMAP is used to make sure there's enough space between * VM_MAXUSER_ADDRESS and KERNBASE to map the whole memory. * It has to be a compile-time constant, even if arm_init_smallalloc(), diff --git a/sys/arm/mv/discovery/discovery.c b/sys/arm/mv/discovery/discovery.c index 1220c8db676..3968b78d4cc 100644 --- a/sys/arm/mv/discovery/discovery.c +++ b/sys/arm/mv/discovery/discovery.c @@ -43,6 +43,30 @@ __FBSDID("$FreeBSD$"); #include #include +/* + * Virtual address space layout: + * ----------------------------- + * 0x0000_0000 - 0xBFFF_FFFF : User Process (3 GB) + * 0xC000_0000 - virtual_avail : Kernel Reserved (text, data, page tables, + * : stack etc.) + * virtual-avail - 0xEFFF_FFFF : KVA (virtual_avail is typically < 0xc0a0_0000) + * 0xF000_0000 - 0xF0FF_FFFF : No-Cache allocation area (16 MB) + * 0xF100_0000 - 0xF10F_FFFF : SoC Integrated devices registers range (1 MB) + * 0xF110_0000 - 0xF11F_FFFF : PCI-Express I/O space (1MB) + * 0xF120_0000 - 0xF12F_FFFF : PCI I/O space (1MB) + * 0xF130_0000 - 0xF52F_FFFF : PCI-Express memory space (64MB) + * 0xF530_0000 - 0xF92F_FFFF : PCI memory space (64MB) + * 0xF930_0000 - 0xF93F_FFFF : Device Bus: BOOT (1 MB) + * 0xF940_0000 - 0xF94F_FFFF : Device Bus: CS0 (1 MB) + * 0xF950_0000 - 0xFB4F_FFFF : Device Bus: CS1 (32 MB) + * 0xFB50_0000 - 0xFB5F_FFFF : Device Bus: CS2 (1 MB) + * 0xFB60_0000 - 0xFFFE_FFFF : Unused (~74MB) + * 0xFFFF_0000 - 0xFFFF_0FFF : 'High' vectors page (4 kB) + * 0xFFFF_1000 - 0xFFFF_1FFF : ARM_TP_ADDRESS/RAS page (4 kB) + * 0xFFFF_2000 - 0xFFFF_FFFF : Unused (56 kB) + */ + + struct resource_spec mv_gpio_res[] = { { SYS_RES_MEMORY, 0, RF_ACTIVE }, { SYS_RES_IRQ, 0, RF_ACTIVE }, diff --git a/sys/arm/mv/files.mv b/sys/arm/mv/files.mv index 7c1ef4972ff..7f15deb5af0 100644 --- a/sys/arm/mv/files.mv +++ b/sys/arm/mv/files.mv @@ -22,6 +22,7 @@ arm/mv/bus_space.c standard arm/mv/common.c standard arm/mv/gpio.c standard arm/mv/ic.c standard +arm/mv/mv_localbus.c standard arm/mv/mv_machdep.c standard arm/mv/mv_pci.c optional pci arm/mv/mv_sata.c optional ata | atamvsata @@ -30,6 +31,7 @@ arm/mv/twsi.c optional iicbus dev/cesa/cesa.c optional cesa dev/mge/if_mge.c optional mge +dev/nand/nfc_mv.c optional nand dev/mvs/mvs_soc.c optional mvs dev/uart/uart_dev_ns8250.c optional uart dev/usb/controller/ehci_mv.c optional ehci diff --git a/sys/arm/mv/mv_localbus.c b/sys/arm/mv/mv_localbus.c new file mode 100644 index 00000000000..09f9348ba8d --- /dev/null +++ b/sys/arm/mv/mv_localbus.c @@ -0,0 +1,490 @@ +/*- + * Copyright (c) 2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_platform.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include "dev/fdt/fdt_common.h" +#include "ofw_bus_if.h" + +#include + +#ifdef DEBUG +#define debugf(fmt, args...) do { printf("%s(): ", __func__); \ + printf(fmt,##args); } while (0) +#else +#define debugf(fmt, args...) +#endif + +#define MV_LOCALBUS_MAX_BANKS 8 +#define MV_LOCALBUS_MAX_BANK_CELLS 4 + +static MALLOC_DEFINE(M_LOCALBUS, "localbus", "localbus devices information"); + +struct localbus_bank { + vm_offset_t va; /* VA of the bank */ + vm_paddr_t pa; /* physical address of the bank */ + vm_size_t size; /* bank size */ + uint8_t mapped; /* device memory has mapping */ +}; + +struct localbus_softc { + device_t sc_dev; + bus_space_handle_t sc_bsh; + bus_space_tag_t sc_bst; + int sc_rid; + + struct localbus_bank *sc_banks; +}; + +struct localbus_devinfo { + struct ofw_bus_devinfo di_ofw; + struct resource_list di_res; + int di_bank; +}; + +struct localbus_va_entry { + int8_t bank; + vm_offset_t va; + vm_size_t size; +}; + +/* + * Prototypes. + */ +static int localbus_probe(device_t); +static int localbus_attach(device_t); +static int localbus_print_child(device_t, device_t); + +static struct resource *localbus_alloc_resource(device_t, device_t, int, + int *, u_long, u_long, u_long, u_int); +static struct resource_list *localbus_get_resource_list(device_t, device_t); + +static ofw_bus_get_devinfo_t localbus_get_devinfo; + +/* + * Bus interface definition. + */ +static device_method_t localbus_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, localbus_probe), + DEVMETHOD(device_attach, localbus_attach), + DEVMETHOD(device_detach, bus_generic_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + DEVMETHOD(device_suspend, bus_generic_suspend), + DEVMETHOD(device_resume, bus_generic_resume), + + /* Bus interface */ + DEVMETHOD(bus_print_child, localbus_print_child), + DEVMETHOD(bus_alloc_resource, localbus_alloc_resource), + DEVMETHOD(bus_release_resource, bus_generic_release_resource), + DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), + DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), + DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), + DEVMETHOD(bus_get_resource_list, localbus_get_resource_list), + + /* OFW bus interface */ + DEVMETHOD(ofw_bus_get_devinfo, localbus_get_devinfo), + DEVMETHOD(ofw_bus_get_compat, ofw_bus_gen_get_compat), + DEVMETHOD(ofw_bus_get_model, ofw_bus_gen_get_model), + DEVMETHOD(ofw_bus_get_name, ofw_bus_gen_get_name), + DEVMETHOD(ofw_bus_get_node, ofw_bus_gen_get_node), + DEVMETHOD(ofw_bus_get_type, ofw_bus_gen_get_type), + + { 0, 0 } +}; + +static driver_t localbus_driver = { + "localbus", + localbus_methods, + sizeof(struct localbus_softc) +}; + +const struct localbus_va_entry localbus_virtmap[] = { + { 0, MV_DEV_BOOT_BASE, MV_DEV_BOOT_SIZE }, + { 1, MV_DEV_CS0_BASE, MV_DEV_CS0_SIZE }, + { 2, MV_DEV_CS1_BASE, MV_DEV_CS1_SIZE }, + { 3, MV_DEV_CS2_BASE, MV_DEV_CS2_SIZE }, + + { -1, 0, 0 } +}; + +static struct localbus_bank localbus_banks[MV_LOCALBUS_MAX_BANKS]; + +devclass_t localbus_devclass; + +DRIVER_MODULE(localbus, fdtbus, localbus_driver, localbus_devclass, 0, 0); + +static int +fdt_localbus_reg_decode(phandle_t node, struct localbus_softc *sc, + struct localbus_devinfo *di) +{ + u_long start, end, count; + pcell_t *reg, *regptr; + pcell_t addr_cells, size_cells; + int tuple_size, tuples; + int i, rv, bank; + + if (fdt_addrsize_cells(OF_parent(node), &addr_cells, &size_cells) != 0) + return (ENXIO); + + tuple_size = sizeof(pcell_t) * (addr_cells + size_cells); + tuples = OF_getprop_alloc(node, "reg", tuple_size, (void **)®); + debugf("addr_cells = %d, size_cells = %d\n", addr_cells, size_cells); + debugf("tuples = %d, tuple size = %d\n", tuples, tuple_size); + if (tuples <= 0) + /* No 'reg' property in this node. */ + return (0); + + regptr = reg; + for (i = 0; i < tuples; i++) { + + bank = fdt_data_get((void *)regptr, 1); + + if (bank >= MV_LOCALBUS_MAX_BANKS) { + device_printf(sc->sc_dev, "bank number [%d] out of " + "range\n", bank); + continue; + } + + /* + * If device doesn't have virtual to physical mapping don't add + * resources + */ + if (!(sc->sc_banks[bank].mapped)) { + device_printf(sc->sc_dev, "device [%d]: missing memory " + "mapping\n", bank); + continue; + } + + di->di_bank = bank; + regptr += 1; + + /* Get address/size. */ + rv = fdt_data_to_res(regptr, addr_cells - 1, size_cells, &start, + &count); + if (rv != 0) { + resource_list_free(&di->di_res); + goto out; + } + + /* Check if enough amount of memory is mapped */ + if (sc->sc_banks[bank].size < count) { + device_printf(sc->sc_dev, "device [%d]: not enough " + "memory reserved\n", bank); + continue; + } + + regptr += addr_cells - 1 + size_cells; + + /* Calculate address range relative to VA base. */ + start = sc->sc_banks[bank].va + start; + end = start + count - 1; + + debugf("reg addr bank = %d, start = %lx, end = %lx, " + "count = %lx\n", bank, start, end, count); + + /* Use bank (CS) cell as rid. */ + resource_list_add(&di->di_res, SYS_RES_MEMORY, di->di_bank, + start, end, count); + } + rv = 0; +out: + free(reg, M_OFWPROP); + return (rv); +} + +static int +localbus_probe(device_t dev) +{ + + if (!ofw_bus_is_compatible_strict(dev, "mrvl,lbc")) + return (ENXIO); + + device_set_desc(dev, "Marvell device bus"); + + return (BUS_PROBE_DEFAULT); +} + +static int +localbus_attach(device_t dev) +{ + device_t dev_child; + struct localbus_softc *sc; + struct localbus_devinfo *di; + phandle_t dt_node, dt_child; + + sc = device_get_softc(dev); + sc->sc_dev = dev; + sc->sc_banks = localbus_banks; + + /* + * Walk localbus and add direct subordinates as our children. + */ + dt_node = ofw_bus_get_node(dev); + for (dt_child = OF_child(dt_node); dt_child != 0; + dt_child = OF_peer(dt_child)) { + + /* Check and process 'status' property. */ + if (!(fdt_is_enabled(dt_child))) + continue; + + if (!(fdt_pm_is_enabled(dt_child))) + continue; + + di = malloc(sizeof(*di), M_LOCALBUS, M_WAITOK | M_ZERO); + if (ofw_bus_gen_setup_devinfo(&di->di_ofw, dt_child) != 0) { + free(di, M_LOCALBUS); + device_printf(dev, "could not set up devinfo\n"); + continue; + } + + resource_list_init(&di->di_res); + if (fdt_localbus_reg_decode(dt_child, sc, di)) { + device_printf(dev, "could not process 'reg' " + "property\n"); + ofw_bus_gen_destroy_devinfo(&di->di_ofw); + free(di, M_LOCALBUS); + continue; + } + + /* Add newbus device for this FDT node */ + dev_child = device_add_child(dev, NULL, -1); + if (dev_child == NULL) { + device_printf(dev, "could not add child: %s\n", + di->di_ofw.obd_name); + resource_list_free(&di->di_res); + ofw_bus_gen_destroy_devinfo(&di->di_ofw); + free(di, M_LOCALBUS); + continue; + } +#ifdef DEBUG + device_printf(dev, "added child: %s\n\n", di->di_ofw.obd_name); +#endif + device_set_ivars(dev_child, di); + } + + return (bus_generic_attach(dev)); +} + +static int +localbus_print_child(device_t dev, device_t child) +{ + struct localbus_devinfo *di; + struct resource_list *rl; + int rv; + + di = device_get_ivars(child); + rl = &di->di_res; + + rv = 0; + rv += bus_print_child_header(dev, child); + rv += resource_list_print_type(rl, "mem", SYS_RES_MEMORY, "%#lx"); + rv += resource_list_print_type(rl, "irq", SYS_RES_IRQ, "%ld"); + rv += bus_print_child_footer(dev, child); + + return (rv); +} + +static struct resource * +localbus_alloc_resource(device_t bus, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + struct localbus_devinfo *di; + struct resource_list_entry *rle; + + /* + * Request for the default allocation with a given rid: use resource + * list stored in the local device info. + */ + if ((start == 0UL) && (end == ~0UL)) { + if ((di = device_get_ivars(child)) == NULL) + return (NULL); + + if (type == SYS_RES_IOPORT) + type = SYS_RES_MEMORY; + + rid = &di->di_bank; + rle = resource_list_find(&di->di_res, type, *rid); + if (rle == NULL) { + device_printf(bus, "no default resources for " + "rid = %d, type = %d\n", *rid, type); + return (NULL); + } + start = rle->start; + end = rle->end; + count = rle->count; + } + + return (bus_generic_alloc_resource(bus, child, type, rid, start, end, + count, flags)); +} + + +static struct resource_list * +localbus_get_resource_list(device_t bus, device_t child) +{ + struct localbus_devinfo *di; + + di = device_get_ivars(child); + return (&di->di_res); +} + +static const struct ofw_bus_devinfo * +localbus_get_devinfo(device_t bus, device_t child) +{ + struct localbus_devinfo *di; + + di = device_get_ivars(child); + return (&di->di_ofw); +} + +int +fdt_localbus_devmap(phandle_t dt_node, struct pmap_devmap *fdt_devmap, + int banks_max_num, int *banks_added) +{ + pcell_t ranges[MV_LOCALBUS_MAX_BANKS * MV_LOCALBUS_MAX_BANK_CELLS]; + pcell_t *rangesptr; + uint32_t tuple_size, bank; + vm_paddr_t offset; + vm_size_t size; + int dev_num, addr_cells, size_cells, par_addr_cells, va_index, i, j, k; + + if ((fdt_addrsize_cells(dt_node, &addr_cells, &size_cells)) != 0) + return (EINVAL); + + par_addr_cells = fdt_parent_addr_cells(dt_node); + if (par_addr_cells > 2) { + /* + * Localbus devmap initialization error: unsupported parent + * #addr-cells + */ + return (ERANGE); + } + + tuple_size = (addr_cells + par_addr_cells + size_cells); + if (tuple_size > MV_LOCALBUS_MAX_BANK_CELLS) + return (ERANGE); + + tuple_size *= sizeof(pcell_t); + + dev_num = OF_getprop(dt_node, "ranges", ranges, sizeof(ranges)); + if (dev_num <= 0) + return (EINVAL); + + /* Calculate number of devices attached to bus */ + dev_num = dev_num / tuple_size; + + /* + * If number of ranges > max number of localbus devices, + * additional entries will not be processed + */ + dev_num = MIN(dev_num, banks_max_num); + + rangesptr = &ranges[0]; + j = 0; + + /* Process data from FDT */ + for (i = 0; i < dev_num; i++) { + + /* First field is bank number */ + bank = fdt_data_get((void *)rangesptr, 1); + rangesptr += 1; + + if (bank < 0 || bank > MV_LOCALBUS_MAX_BANKS) { + /* Bank out of range */ + rangesptr += ((addr_cells - 1) + par_addr_cells + + size_cells); + continue; + } + + /* Find virtmap entry for this bank */ + va_index = -1; + for (k = 0; localbus_virtmap[k].bank >= 0; k++) { + if (localbus_virtmap[k].bank == bank) { + va_index = k; + break; + } + } + + /* Check if virtmap entry was found */ + if (va_index == -1) { + rangesptr += ((addr_cells - 1) + par_addr_cells + + size_cells); + continue; + } + + /* Remaining child's address fields are unused */ + rangesptr += (addr_cells - 1); + + /* Parent address offset */ + offset = fdt_data_get((void *)rangesptr, par_addr_cells); + rangesptr += par_addr_cells; + + /* Last field is size */ + size = fdt_data_get((void *)rangesptr, size_cells); + rangesptr += size_cells; + + if (size > localbus_virtmap[va_index].size) { + /* Not enough space reserved in virtual memory map */ + continue; + } + + fdt_devmap[j].pd_va = localbus_virtmap[va_index].va; + fdt_devmap[j].pd_pa = offset; + fdt_devmap[j].pd_size = size; + fdt_devmap[j].pd_prot = VM_PROT_READ | VM_PROT_WRITE; + fdt_devmap[j].pd_cache = PTE_NOCACHE; + + /* Copy data to structure used by localbus driver */ + localbus_banks[bank].va = fdt_devmap[j].pd_va; + localbus_banks[bank].pa = fdt_devmap[j].pd_pa; + localbus_banks[bank].size = fdt_devmap[j].pd_size; + localbus_banks[bank].mapped = 1; + + j++; + } + + *banks_added = j; + return (0); +} diff --git a/sys/arm/mv/mv_machdep.c b/sys/arm/mv/mv_machdep.c index 9afd29af278..0c12aea916a 100644 --- a/sys/arm/mv/mv_machdep.c +++ b/sys/arm/mv/mv_machdep.c @@ -115,16 +115,11 @@ extern unsigned char _edata[]; extern unsigned char __bss_start[]; extern unsigned char _end[]; -#ifdef DDB -extern vm_offset_t ksym_start, ksym_end; -#endif - extern u_int data_abort_handler_address; extern u_int prefetch_abort_handler_address; extern u_int undefined_handler_address; extern vm_offset_t pmap_bootstrap_lastaddr; -extern int *end; struct pv_addr kernel_pt_table[KERNEL_PT_MAX]; struct pcpu __pcpu; @@ -134,7 +129,6 @@ struct pcpu *pcpup = &__pcpu; vm_paddr_t phys_avail[10]; vm_paddr_t dump_avail[4]; -vm_offset_t physical_pages; vm_offset_t pmap_bootstrap_lastaddr; const struct pmap_devmap *pmap_devmap_bootstrap_table; @@ -145,8 +139,6 @@ struct pv_addr undstack; struct pv_addr abtstack; struct pv_addr kernelstack; -static struct trapframe proc0_tf; - static struct mem_region availmem_regions[FDT_MEM_REGIONS]; static int availmem_regions_sz; @@ -287,7 +279,7 @@ physmap_init(void) availmem_regions[i].mr_start + availmem_regions[i].mr_size, availmem_regions[i].mr_size); - /* + /* * We should not map the page at PA 0x0000000, the VM can't * handle it, as pmap_extract() == 0 means failure. */ @@ -306,7 +298,7 @@ physmap_init(void) } void * -initarm(void *mdp, void *unused __unused) +initarm(struct arm_boot_params *abp) { struct pv_addr kernel_l1pt; struct pv_addr dpcpu; @@ -314,44 +306,21 @@ initarm(void *mdp, void *unused __unused) uint32_t memsize, l2size; void *kmdp; u_int l1pagetable; - int i = 0, j = 0; + int i = 0, j = 0, err_devmap = 0; - kmdp = NULL; - lastaddr = 0; + lastaddr = parse_boot_param(abp); memsize = 0; - dtbp = (vm_offset_t)NULL; - set_cpufuncs(); /* - * Mask metadata pointer: it is supposed to be on page boundary. If - * the first argument (mdp) doesn't point to a valid address the - * bootloader must have passed us something else than the metadata - * ptr... In this case we want to fall back to some built-in settings. + * Find the dtb passed in by the boot loader. */ - mdp = (void *)((uint32_t)mdp & ~PAGE_MASK); - - /* Parse metadata and fetch parameters */ - if (mdp != NULL) { - preload_metadata = mdp; - kmdp = preload_search_by_type("elf kernel"); - if (kmdp != NULL) { - boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int); - kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *); - dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t); - lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND, - vm_offset_t); -#ifdef DDB - ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t); - ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t); -#endif - } - - preload_addr_relocate = KERNVIRTADDR - KERNPHYSADDR; - } else { - /* Fall back to hardcoded metadata. */ - lastaddr = fake_preload_metadata(); - } + kmdp = preload_search_by_type("elf kernel"); + if (kmdp != NULL) + dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t); + else + dtbp = (vm_offset_t)NULL; + #if defined(FDT_DTB_STATIC) /* @@ -496,8 +465,7 @@ initarm(void *mdp, void *unused __unused) VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); /* Map pmap_devmap[] entries */ - if (platform_devmap_init() != 0) - while (1); + err_devmap = platform_devmap_init(); pmap_devmap_bootstrap(l1pagetable, pmap_devmap_bootstrap_table); cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL * 2)) | @@ -524,18 +492,23 @@ initarm(void *mdp, void *unused __unused) physmem = memsize / PAGE_SIZE; debugf("initarm: console initialized\n"); - debugf(" arg1 mdp = 0x%08x\n", (uint32_t)mdp); + debugf(" arg1 kmdp = 0x%08x\n", (uint32_t)kmdp); debugf(" boothowto = 0x%08x\n", boothowto); printf(" dtbp = 0x%08x\n", (uint32_t)dtbp); print_kernel_section_addr(); print_kenv(); + if (err_devmap != 0) + printf("WARNING: could not fully configure devmap, error=%d\n", + err_devmap); + /* * Re-initialise decode windows */ if (soc_decode_win() != 0) printf("WARNING: could not re-initialise decode windows! " "Running with existing settings...\n"); + /* * Pages were allocated during the secondary bootstrap for the * stacks for different CPU modes. @@ -570,22 +543,10 @@ initarm(void *mdp, void *unused __unused) undefined_handler_address = (u_int)undefinedinstruction_bounce; undefined_init(); - proc_linkup0(&proc0, &thread0); - thread0.td_kstack = kernelstack.pv_va; - thread0.td_kstack_pages = KSTACK_PAGES; - thread0.td_pcb = (struct pcb *) - (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; - thread0.td_pcb->pcb_flags = 0; - thread0.td_frame = &proc0_tf; - pcpup->pc_curpcb = thread0.td_pcb; + init_proc0(kernelstack.pv_va); arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL); - - dump_avail[0] = 0; - dump_avail[1] = memsize; - dump_avail[2] = 0; - dump_avail[3] = 0; - + arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0])); pmap_bootstrap(freemempos, pmap_bootstrap_lastaddr, &kernel_l1pt); msgbufp = (void *)msgbufpv.pv_va; msgbufinit(msgbufp, msgbufsize); @@ -733,25 +694,34 @@ moveon: return (0); } -#define FDT_DEVMAP_MAX (1 + 2 + 1 + 1) +#define FDT_DEVMAP_MAX (MV_WIN_CPU_MAX + 1) static struct pmap_devmap fdt_devmap[FDT_DEVMAP_MAX] = { { 0, 0, 0, 0, 0, } }; +/* + * XXX: When device entry in devmap has pd_size smaller than section size, + * system will freeze during initialization + */ + /* * Construct pmap_devmap[] with DT-derived config data. */ + static int platform_devmap_init(void) { phandle_t root, child; + pcell_t bank_count; u_long base, size; - int i; + int i, num_mapped; + + i = 0; + pmap_devmap_bootstrap_table = &fdt_devmap[0]; /* * IMMR range. */ - i = 0; fdt_devmap[i].pd_va = fdt_immr_va; fdt_devmap[i].pd_pa = fdt_immr_pa; fdt_devmap[i].pd_size = fdt_immr_size; @@ -760,12 +730,12 @@ platform_devmap_init(void) i++; /* - * PCI range(s). + * PCI range(s) and localbus. */ if ((root = OF_finddevice("/")) == -1) return (ENXIO); - for (child = OF_child(root); child != 0; child = OF_peer(child)) + for (child = OF_child(root); child != 0; child = OF_peer(child)) { if (fdt_is_type(child, "pci")) { /* * Check space: each PCI node will consume 2 devmap @@ -773,7 +743,6 @@ platform_devmap_init(void) */ if (i + 1 >= FDT_DEVMAP_MAX) { return (ENOMEM); - break; } /* @@ -786,6 +755,29 @@ platform_devmap_init(void) i += 2; } + if (fdt_is_compatible(child, "mrvl,lbc")) { + /* Check available space */ + if (OF_getprop(child, "bank-count", (void *)&bank_count, + sizeof(bank_count)) <= 0) + /* If no property, use default value */ + bank_count = 1; + else + bank_count = fdt32_to_cpu(bank_count); + + if ((i + bank_count) >= FDT_DEVMAP_MAX) + return (ENOMEM); + + /* Add all localbus ranges to device map */ + num_mapped = 0; + + if (fdt_localbus_devmap(child, &fdt_devmap[i], + (int)bank_count, &num_mapped) != 0) + return (ENXIO); + + i += num_mapped; + } + } + /* * CESA SRAM range. */ @@ -795,7 +787,7 @@ platform_devmap_init(void) if ((child = fdt_find_compatible(root, "mrvl,cesa-sram", 0)) == 0) /* No CESA SRAM node. */ - goto out; + return (0); moveon: if (i >= FDT_DEVMAP_MAX) return (ENOMEM); @@ -809,8 +801,6 @@ moveon: fdt_devmap[i].pd_prot = VM_PROT_READ | VM_PROT_WRITE; fdt_devmap[i].pd_cache = PTE_NOCACHE; -out: - pmap_devmap_bootstrap_table = &fdt_devmap[0]; return (0); } diff --git a/sys/arm/mv/mvwin.h b/sys/arm/mv/mvwin.h index e1e135f2b7f..933b07ecbf4 100644 --- a/sys/arm/mv/mvwin.h +++ b/sys/arm/mv/mvwin.h @@ -46,7 +46,7 @@ #define MV_PCIE_IO_PHYS_BASE (MV_PHYS_BASE + MV_SIZE) #define MV_PCIE_IO_BASE MV_PCIE_IO_PHYS_BASE #define MV_PCIE_IO_SIZE (1024 * 1024) -#define MV_PCI_IO_PHYS_BASE (MV_PCIE_IO_PHYS_BASE + MV_PCIE_IO_SIZE) +#define MV_PCI_IO_PHYS_BASE (MV_PCIE_IO_PHYS_BASE + MV_PCIE_IO_SIZE) #define MV_PCI_IO_BASE MV_PCI_IO_PHYS_BASE #define MV_PCI_IO_SIZE (1024 * 1024) @@ -57,20 +57,17 @@ #define MV_PCI_MEM_BASE MV_PCI_MEM_PHYS_BASE #define MV_PCI_MEM_SIZE (64 * 1024 * 1024) -/* XXX DEV_BOOT, CSx are board specific, should be defined per platform */ +#define MV_DEV_BOOT_BASE 0xF9300000 +#define MV_DEV_BOOT_SIZE (1024 * 1024) /* 1 MB */ -/* 512KB NOR FLASH */ -#define MV_DEV_BOOT_PHYS_BASE (MV_PCI_MEM_PHYS_BASE + MV_PCI_MEM_SIZE) -#define MV_DEV_BOOT_SIZE (512 * 1024) -/* CS0: 7-seg LED */ -#define MV_DEV_CS0_PHYS_BASE 0xFA000000 -#define MV_DEV_CS0_SIZE (1024 * 1024) /* XXX u-boot has 2MB */ -/* CS1: 32MB NOR FLASH */ -#define MV_DEV_CS1_PHYS_BASE (MV_DEV_CS0_PHYS_BASE + MV_DEV_CS0_SIZE) -#define MV_DEV_CS1_SIZE (32 * 1024 * 1024) -/* CS2: 32MB NAND FLASH */ -#define MV_DEV_CS2_PHYS_BASE (MV_DEV_CS1_PHYS_BASE + MV_DEV_CS1_SIZE) -#define MV_DEV_CS2_SIZE 1024 /* XXX u-boot has 1MB */ +#define MV_DEV_CS0_BASE 0xF9400000 +#define MV_DEV_CS0_SIZE (1024 * 1024) /* 1 MB */ + +#define MV_DEV_CS1_BASE 0xF9500000 +#define MV_DEV_CS1_SIZE (32 * 1024 * 1024) /* 32 MB */ + +#define MV_DEV_CS2_BASE 0xFB500000 +#define MV_DEV_CS2_SIZE (1024 * 1024) /* 1 MB */ #define MV_CESA_SRAM_PHYS_BASE 0xFD000000 #define MV_CESA_SRAM_BASE MV_CESA_SRAM_PHYS_BASE /* VA == PA mapping */ @@ -107,8 +104,6 @@ #define MV_PCIE12_BASE (MV_PCIE_BASE + 0x48000) #define MV_PCIE13_BASE (MV_PCIE_BASE + 0x4C000) -#define MV_DEV_CS0_BASE MV_DEV_CS0_PHYS_BASE - /* * Decode windows definitions and macros */ diff --git a/sys/arm/mv/std.mv b/sys/arm/mv/std.mv index 62101026045..6cf235c2cb0 100644 --- a/sys/arm/mv/std.mv +++ b/sys/arm/mv/std.mv @@ -3,3 +3,4 @@ files "../mv/files.mv" cpu CPU_ARM9E makeoptions CONF_CFLAGS="-march=armv5te" +options FREEBSD_BOOT_LOADER diff --git a/sys/arm/s3c2xx0/s3c2410reg.h b/sys/arm/s3c2xx0/s3c2410reg.h index 31bb857f48d..89298ea15ee 100644 --- a/sys/arm/s3c2xx0/s3c2410reg.h +++ b/sys/arm/s3c2xx0/s3c2410reg.h @@ -36,7 +36,7 @@ * Samsung S3C2410X processor is ARM920T based integrated CPU * * Reference: - * S3C2410X User's Manual + * S3C2410X User's Manual */ #ifndef _ARM_S3C2XX0_S3C2410REG_H_ #define _ARM_S3C2XX0_S3C2410REG_H_ diff --git a/sys/arm/s3c2xx0/s3c2440reg.h b/sys/arm/s3c2xx0/s3c2440reg.h index 418557dd8c0..f3cda608d47 100644 --- a/sys/arm/s3c2xx0/s3c2440reg.h +++ b/sys/arm/s3c2xx0/s3c2440reg.h @@ -30,7 +30,7 @@ * Samsung S3C2440X processor is ARM920T based integrated CPU * * Reference: - * S3C2440A/S3C2442B User's Manual + * S3C2440A/S3C2442B User's Manual */ #ifndef _ARM_S3C2XX0_S3C2440REG_H_ #define _ARM_S3C2XX0_S3C2440REG_H_ diff --git a/sys/arm/s3c2xx0/s3c24x0.c b/sys/arm/s3c2xx0/s3c24x0.c index 7550cb1aac9..cddd435b613 100644 --- a/sys/arm/s3c2xx0/s3c24x0.c +++ b/sys/arm/s3c2xx0/s3c24x0.c @@ -283,7 +283,7 @@ s3c24x0_config_intr(device_t dev, int irq, enum intr_trigger trig, s3c2xx0_softc->sc_gpio_ioh, reg, value); return (0); -} +} static struct resource * s3c24x0_alloc_resource(device_t bus, device_t child, int type, int *rid, @@ -356,7 +356,7 @@ s3c24x0_alloc_resource(device_t bus, device_t child, int type, int *rid, rman_release_resource(res); return (NULL); } - } + } break; } @@ -751,19 +751,19 @@ arm_mask_irq(uintptr_t irq) mask = bus_space_read_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTMSK); mask |= (1 << irq); - bus_space_write_4(&s3c2xx0_bs_tag, + bus_space_write_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTMSK, mask); } else if (irq < S3C24X0_EXTIRQ_MIN) { mask = bus_space_read_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTSUBMSK); mask |= (1 << (irq - S3C24X0_SUBIRQ_MIN)); - bus_space_write_4(&s3c2xx0_bs_tag, + bus_space_write_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTSUBMSK, mask); } else { mask = bus_space_read_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_gpio_ioh, GPIO_EINTMASK); mask |= (1 << (irq - S3C24X0_EXTIRQ_MIN)); - bus_space_write_4(&s3c2xx0_bs_tag, + bus_space_write_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_intctl_ioh, GPIO_EINTMASK, mask); } } @@ -787,13 +787,13 @@ arm_unmask_irq(uintptr_t irq) mask = bus_space_read_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTSUBMSK); mask &= ~(1 << (irq - S3C24X0_SUBIRQ_MIN)); - bus_space_write_4(&s3c2xx0_bs_tag, + bus_space_write_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTSUBMSK, mask); } else { mask = bus_space_read_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_gpio_ioh, GPIO_EINTMASK); mask &= ~(1 << (irq - S3C24X0_EXTIRQ_MIN)); - bus_space_write_4(&s3c2xx0_bs_tag, + bus_space_write_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_intctl_ioh, GPIO_EINTMASK, mask); } } diff --git a/sys/arm/s3c2xx0/s3c24x0_machdep.c b/sys/arm/s3c2xx0/s3c24x0_machdep.c index 31ae74c96a5..4f14c5c3e29 100644 --- a/sys/arm/s3c2xx0/s3c24x0_machdep.c +++ b/sys/arm/s3c2xx0/s3c24x0_machdep.c @@ -38,7 +38,7 @@ * * Machine dependant functions for kernel setup * - * This file needs a lot of work. + * This file needs a lot of work. * * Created : 17/09/94 */ @@ -118,10 +118,6 @@ extern u_int undefined_handler_address; struct pv_addr kernel_pt_table[NUM_KERNEL_PTS]; -extern void *_end; - -extern int *end; - struct pcpu __pcpu; struct pcpu *pcpup = &__pcpu; @@ -129,7 +125,6 @@ struct pcpu *pcpup = &__pcpu; vm_paddr_t phys_avail[10]; vm_paddr_t dump_avail[4]; -vm_offset_t physical_pages; struct pv_addr systempage; struct pv_addr msgbufpv; @@ -138,8 +133,6 @@ struct pv_addr undstack; struct pv_addr abtstack; struct pv_addr kernelstack; -static struct trapframe proc0_tf; - #define _A(a) ((a) & ~L1_S_OFFSET) #define _S(s) (((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1)) @@ -152,42 +145,42 @@ static const struct pmap_devmap s3c24x0_devmap[] = { _A(S3C24X0_CLKMAN_BASE), _A(S3C24X0_CLKMAN_PA_BASE), _S(S3C24X0_CLKMAN_SIZE), - VM_PROT_READ|VM_PROT_WRITE, + VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, { _A(S3C24X0_GPIO_BASE), _A(S3C24X0_GPIO_PA_BASE), _S(S3C2410_GPIO_SIZE), - VM_PROT_READ|VM_PROT_WRITE, + VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, { _A(S3C24X0_INTCTL_BASE), _A(S3C24X0_INTCTL_PA_BASE), _S(S3C24X0_INTCTL_SIZE), - VM_PROT_READ|VM_PROT_WRITE, + VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, { _A(S3C24X0_TIMER_BASE), _A(S3C24X0_TIMER_PA_BASE), _S(S3C24X0_TIMER_SIZE), - VM_PROT_READ|VM_PROT_WRITE, + VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, { _A(S3C24X0_UART0_BASE), _A(S3C24X0_UART0_PA_BASE), _S(S3C24X0_UART_PA_BASE(3) - S3C24X0_UART0_PA_BASE), - VM_PROT_READ|VM_PROT_WRITE, + VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, { _A(S3C24X0_WDT_BASE), _A(S3C24X0_WDT_PA_BASE), _S(S3C24X0_WDT_SIZE), - VM_PROT_READ|VM_PROT_WRITE, + VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, { @@ -205,10 +198,6 @@ static const struct pmap_devmap s3c24x0_devmap[] = { #define ioreg_read32(a) (*(volatile uint32_t *)(a)) #define ioreg_write32(a,v) (*(volatile uint32_t *)(a)=(v)) -#ifdef DDB -extern vm_offset_t ksym_start, ksym_end; -#endif - struct arm32_dma_range s3c24x0_range = { .dr_sysbase = 0, .dr_busbase = 0, @@ -234,7 +223,7 @@ bus_dma_get_range_nb(void) } void * -initarm(void *arg, void *arg2) +initarm(struct arm_boot_params *abp) { struct pv_addr kernel_l1pt; int loop; @@ -246,13 +235,11 @@ initarm(void *arg, void *arg2) int i; uint32_t memsize; + boothowto = 0; /* Likely not needed */ + lastaddr = parse_boot_param(abp); i = 0; - - boothowto = 0; - set_cpufuncs(); cpufuncs.cf_sleep = s3c24x0_sleep; - lastaddr = fake_preload_metadata(); pcpu_init(pcpup, 0, sizeof(struct pcpu)); PCPU_SET(curthread, &thread0); @@ -283,7 +270,7 @@ initarm(void *arg, void *arg2) kernel_pt_table[loop].pv_va = freemempos - (loop % (PAGE_SIZE / L2_TABLE_SIZE_REAL)) * L2_TABLE_SIZE_REAL; - kernel_pt_table[loop].pv_pa = + kernel_pt_table[loop].pv_pa = kernel_pt_table[loop].pv_va - KERNVIRTADDR + KERNPHYSADDR; } @@ -317,7 +304,7 @@ initarm(void *arg, void *arg2) pmap_map_chunk(l1pagetable, KERNBASE, PHYSADDR, (((uint32_t)(lastaddr) - KERNBASE) + PAGE_SIZE) & ~(PAGE_SIZE - 1), VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); - afterkern = round_page((lastaddr + L1_S_SIZE) & ~(L1_S_SIZE + afterkern = round_page((lastaddr + L1_S_SIZE) & ~(L1_S_SIZE - 1)); for (i = 0; i < KERNEL_PT_AFKERNEL_NUM; i++) { pmap_link_l2pt(l1pagetable, afterkern + i * L1_S_SIZE, @@ -406,30 +393,14 @@ initarm(void *arg, void *arg2) prefetch_abort_handler_address = (u_int)prefetch_abort_handler; undefined_handler_address = (u_int)undefinedinstruction_bounce; undefined_init(); - - proc_linkup(&proc0, &thread0); - thread0.td_kstack = kernelstack.pv_va; - thread0.td_pcb = (struct pcb *) - (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; - thread0.td_pcb->pcb_flags = 0; - thread0.td_frame = &proc0_tf; - pcpup->pc_curpcb = thread0.td_pcb; + + init_proc0(kernelstack.pv_va); arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL); pmap_curmaxkvaddr = afterkern + 0x100000 * (KERNEL_PT_KERN_NUM - 1); - /* - * ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before - * calling pmap_bootstrap. - */ - dump_avail[0] = PHYSADDR; - dump_avail[1] = PHYSADDR + memsize; - dump_avail[2] = 0; - dump_avail[3] = 0; - - pmap_bootstrap(freemempos, - KERNVIRTADDR + 3 * memsize, - &kernel_l1pt); + arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0])); + pmap_bootstrap(freemempos, KERNVIRTADDR + 3 * memsize, &kernel_l1pt); msgbufp = (void*)msgbufpv.pv_va; msgbufinit(msgbufp, msgbufsize); mutex_init(); diff --git a/sys/arm/s3c2xx0/s3c24x0reg.h b/sys/arm/s3c2xx0/s3c24x0reg.h index 3e93e6cf19f..e60ce8870f8 100644 --- a/sys/arm/s3c2xx0/s3c24x0reg.h +++ b/sys/arm/s3c2xx0/s3c24x0reg.h @@ -36,7 +36,7 @@ * Samsung S3C2410X/2400 processor is ARM920T based integrated CPU * * Reference: - * S3C2410X User's Manual + * S3C2410X User's Manual * S3C2400 User's Manual */ #ifndef _ARM_S3C2XX0_S3C24X0REG_H_ @@ -691,7 +691,7 @@ #define SPCON_CPOL (1<<2) #define SPCON_IDLELOW_RISING (0|0) #define SPCON_IDLELOW_FALLING (0|SPCON_CPHA) -#define SPCON_IDLEHIGH_FALLING (SPCON_CPOL|0) +#define SPCON_IDLEHIGH_FALLING (SPCON_CPOL|0) #define SPCON_IDLEHIGH_RISING (SPCON_CPOL|SPCON_CPHA) #define SPCON_MSTR (1<<3) #define SPCON_ENSCK (1<<4) diff --git a/sys/arm/sa11x0/assabet_machdep.c b/sys/arm/sa11x0/assabet_machdep.c index 61c50564bf4..3a3e0f97733 100644 --- a/sys/arm/sa11x0/assabet_machdep.c +++ b/sys/arm/sa11x0/assabet_machdep.c @@ -40,7 +40,7 @@ * * Machine dependant functions for kernel setup * - * This file needs a lot of work. + * This file needs a lot of work. * * Created : 17/09/94 */ @@ -119,14 +119,10 @@ extern u_int undefined_handler_address; struct pv_addr kernel_pt_table[NUM_KERNEL_PTS]; -extern void *_end; - extern vm_offset_t sa1110_uart_vaddr; extern vm_offset_t sa1_cache_clean_addr; -extern int *end; - struct pcpu __pcpu; struct pcpu *pcpup = &__pcpu; @@ -140,14 +136,12 @@ vm_paddr_t dump_avail[4]; vm_paddr_t physical_start; vm_paddr_t physical_end; vm_paddr_t physical_freestart; -vm_offset_t physical_pages; struct pv_addr systempage; struct pv_addr irqstack; struct pv_addr undstack; struct pv_addr abtstack; struct pv_addr kernelstack; -static struct trapframe proc0_tf; /* Static device mappings. */ static const struct pmap_devmap assabet_devmap[] = { @@ -201,7 +195,7 @@ cpu_reset() #define CPU_SA110_CACHE_CLEAN_SIZE (0x4000 * 2) void * -initarm(void *arg, void *arg2) +initarm(struct arm_boot_params *abp) { struct pcpu *pc; struct pv_addr kernel_l1pt; @@ -216,10 +210,10 @@ initarm(void *arg, void *arg2) uint32_t memsize = 32 * 1024 * 1024; sa1110_uart_vaddr = SACOM1_VBASE; - boothowto = RB_VERBOSE | RB_SINGLE; + boothowto = RB_VERBOSE | RB_SINGLE; /* Default value */ + lastaddr = parse_boot_param(abp); cninit(); set_cpufuncs(); - lastaddr = fake_preload_metadata(); physmem = memsize / PAGE_SIZE; pc = &__pcpu; pcpu_init(pc, 0, sizeof(struct pcpu)); @@ -258,7 +252,7 @@ initarm(void *arg, void *arg2) kernel_pt_table[loop].pv_pa = freemempos + (loop % (PAGE_SIZE / L2_TABLE_SIZE_REAL)) * L2_TABLE_SIZE_REAL; - kernel_pt_table[loop].pv_va = + kernel_pt_table[loop].pv_va = kernel_pt_table[loop].pv_pa; } } @@ -344,7 +338,7 @@ initarm(void *arg, void *arg2) VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); /* Map the statically mapped devices. */ pmap_devmap_bootstrap(l1pagetable, assabet_devmap); - pmap_map_chunk(l1pagetable, sa1_cache_clean_addr, 0xf0000000, + pmap_map_chunk(l1pagetable, sa1_cache_clean_addr, 0xf0000000, CPU_SA110_CACHE_CLEAN_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); data_abort_handler_address = (u_int)data_abort_handler; @@ -387,12 +381,7 @@ initarm(void *arg, void *arg2) /* Set stack for exception handlers */ - proc_linkup0(&proc0, &thread0); - thread0.td_kstack = kernelstack.pv_va; - thread0.td_pcb = (struct pcb *) - (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; - thread0.td_pcb->pcb_flags = 0; - thread0.td_frame = &proc0_tf; + init_proc0(kernelstack.pv_va); /* Enable MMU, I-cache, D-cache, write buffer. */ diff --git a/sys/arm/sa11x0/sa11x0.c b/sys/arm/sa11x0/sa11x0.c index 7b83f95c9d4..cae7873ff7a 100644 --- a/sys/arm/sa11x0/sa11x0.c +++ b/sys/arm/sa11x0/sa11x0.c @@ -88,12 +88,12 @@ struct sa11x0_softc *sa11x0_softc; /* There can be only one. */ static int sa1110_setup_intr(device_t dev, device_t child, - struct resource *ires, int flags, driver_filter_t *filt, + struct resource *ires, int flags, driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep) { int saved_cpsr; - if (flags & INTR_TYPE_TTY) + if (flags & INTR_TYPE_TTY) rman_set_start(ires, 15); else if (flags & INTR_TYPE_CLK) { if (rman_get_start(ires) == 0) @@ -101,10 +101,10 @@ sa1110_setup_intr(device_t dev, device_t child, else rman_set_start(ires, 27); } - saved_cpsr = SetCPSR(I32_bit, I32_bit); + saved_cpsr = SetCPSR(I32_bit, I32_bit); SetCPSR(I32_bit, saved_cpsr & I32_bit); - BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, filt, + BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, filt, intr, arg, cookiep); return (0); } diff --git a/sys/arm/sa11x0/sa11x0_gpioreg.h b/sys/arm/sa11x0/sa11x0_gpioreg.h index c43a6c1ebd8..92c5bfe02c9 100644 --- a/sys/arm/sa11x0/sa11x0_gpioreg.h +++ b/sys/arm/sa11x0/sa11x0_gpioreg.h @@ -32,7 +32,7 @@ */ /* - * SA-11x0 GPIO Register + * SA-11x0 GPIO Register */ #define SAGPIO_NPORTS 8 diff --git a/sys/arm/sa11x0/sa11x0_io_asm.S b/sys/arm/sa11x0/sa11x0_io_asm.S index 7a821f3e065..00b59bfe6c0 100644 --- a/sys/arm/sa11x0/sa11x0_io_asm.S +++ b/sys/arm/sa11x0/sa11x0_io_asm.S @@ -208,7 +208,7 @@ ENTRY(sa11x0_bs_rr_2) movle pc, lr sa11x0_bs_rr_2_loop: - ldrh r1, [r0], #0x0002 + ldrh r1, [r0], #0x0002 strh r1, [r3], #0x0002 subs r2, r2, #0x00000001 bgt sa11x0_bs_rr_2_loop @@ -222,7 +222,7 @@ sa11x0_bs_rr_2_loop: ENTRY(sa11x0_bs_wr_2) add r0, r1, r2 ldr r2, [sp, #0] - cmp r2, #0x00000000 + cmp r2, #0x00000000 movle pc, lr sa11x0_bs_wr_2_loop: diff --git a/sys/arm/sa11x0/sa11x0_irq.S b/sys/arm/sa11x0/sa11x0_irq.S index 1cacc2ddf84..4494f6a8d17 100644 --- a/sys/arm/sa11x0/sa11x0_irq.S +++ b/sys/arm/sa11x0/sa11x0_irq.S @@ -120,7 +120,7 @@ ENTRY(sa11x0_activateirqs) mov pc, lr .global _C_LABEL(intrnames), _C_LABEL(sintrnames) -_C_LABEL(intrnames): +_C_LABEL(intrnames): _C_LABEL(sintrnames): .int 0 diff --git a/sys/arm/sa11x0/sa11x0_ost.c b/sys/arm/sa11x0/sa11x0_ost.c index 21991e532e4..f8b2a6bcffb 100644 --- a/sys/arm/sa11x0/sa11x0_ost.c +++ b/sys/arm/sa11x0/sa11x0_ost.c @@ -56,7 +56,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include @@ -127,7 +127,7 @@ saost_attach(device_t dev) saost_sc = sc; - if(bus_space_map(sa->sc_iot, sc->sc_baseaddr, 8, 0, + if(bus_space_map(sa->sc_iot, sc->sc_baseaddr, 8, 0, &sc->sc_ioh)) panic("%s: Cannot map registers", device_get_name(dev)); diff --git a/sys/arm/sa11x0/sa11x0_ostreg.h b/sys/arm/sa11x0/sa11x0_ostreg.h index 92039aec902..26be03a698a 100644 --- a/sys/arm/sa11x0/sa11x0_ostreg.h +++ b/sys/arm/sa11x0/sa11x0_ostreg.h @@ -32,7 +32,7 @@ */ /* - * SA-11x0 OS Timer Register + * SA-11x0 OS Timer Register */ /* OS Timer Match Register */ diff --git a/sys/arm/sa11x0/sa11x0_var.h b/sys/arm/sa11x0/sa11x0_var.h index 8c5929a9e3e..b1ca7f90bcc 100644 --- a/sys/arm/sa11x0/sa11x0_var.h +++ b/sys/arm/sa11x0/sa11x0_var.h @@ -58,7 +58,7 @@ typedef void *sa11x0_chipset_tag_t; extern struct bus_space sa11x0_bs_tag; -void *sa11x0_intr_establish(sa11x0_chipset_tag_t, int, int, int, +void *sa11x0_intr_establish(sa11x0_chipset_tag_t, int, int, int, int (*)(void *), void *); void sa11x0_intr_disestablish(sa11x0_chipset_tag_t, void *); diff --git a/sys/arm/sa11x0/uart_dev_sa1110.c b/sys/arm/sa11x0/uart_dev_sa1110.c index f057453b019..59a12907d0c 100644 --- a/sys/arm/sa11x0/uart_dev_sa1110.c +++ b/sys/arm/sa11x0/uart_dev_sa1110.c @@ -179,12 +179,12 @@ sa1110_bus_transmit(struct uart_softc *sc) while (!(uart_getreg(&sc->sc_bas, SACOM_CR3) & CR3_TIE)) uart_setreg(&sc->sc_bas, SACOM_CR3, - uart_getreg(&sc->sc_bas, SACOM_CR3) | CR3_TIE); + uart_getreg(&sc->sc_bas, SACOM_CR3) | CR3_TIE); #endif sc->sc_txbusy = 1; uart_setreg(&sc->sc_bas, SACOM_CR3, uart_getreg(&sc->sc_bas, SACOM_CR3) - | CR3_TIE); + | CR3_TIE); for (i = 0; i < sc->sc_txdatasz; i++) { while (!(uart_getreg(&sc->sc_bas, SACOM_SR1) & SR1_TNF)); @@ -252,7 +252,7 @@ sa1110_bus_ipend(struct uart_softc *sc) ipend |= SER_INT_RXREADY; mask &= ~CR3_RIE; } - uart_setreg(&sc->sc_bas, SACOM_CR3, CR3_RXE | mask); + uart_setreg(&sc->sc_bas, SACOM_CR3, CR3_RXE | mask); return (ipend); } static int diff --git a/sys/arm/xscale/i80321/ep80219_machdep.c b/sys/arm/xscale/i80321/ep80219_machdep.c index 49305c5915b..fe781cc4fc7 100644 --- a/sys/arm/xscale/i80321/ep80219_machdep.c +++ b/sys/arm/xscale/i80321/ep80219_machdep.c @@ -40,7 +40,7 @@ * * Machine dependant functions for kernel setup * - * This file needs a lot of work. + * This file needs a lot of work. * * Created : 17/09/94 */ @@ -115,10 +115,6 @@ extern u_int undefined_handler_address; struct pv_addr kernel_pt_table[NUM_KERNEL_PTS]; -extern void *_end; - -extern int *end; - struct pcpu __pcpu; struct pcpu *pcpup = &__pcpu; @@ -126,7 +122,6 @@ struct pcpu *pcpup = &__pcpu; vm_paddr_t phys_avail[10]; vm_paddr_t dump_avail[4]; -vm_offset_t physical_pages; struct pv_addr systempage; struct pv_addr msgbufpv; @@ -136,15 +131,13 @@ struct pv_addr abtstack; struct pv_addr kernelstack; struct pv_addr minidataclean; -static struct trapframe proc0_tf; - /* #define IQ80321_OBIO_BASE 0xfe800000UL */ /* #define IQ80321_OBIO_SIZE 0x00100000UL */ /* Static device mappings. */ static const struct pmap_devmap ep80219_devmap[] = { - /* + /* * Map the on-board devices VA == PA so that we can access them * with the MMU on or off. */ @@ -152,7 +145,7 @@ static const struct pmap_devmap ep80219_devmap[] = { IQ80321_OBIO_BASE, IQ80321_OBIO_BASE, IQ80321_OBIO_SIZE, - VM_PROT_READ|VM_PROT_WRITE, + VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, { @@ -161,7 +154,7 @@ static const struct pmap_devmap ep80219_devmap[] = { VERDE_OUT_XLATE_IO_WIN_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, - }, + }, { IQ80321_80321_VBASE, VERDE_PMMR_BASE, @@ -181,7 +174,7 @@ static const struct pmap_devmap ep80219_devmap[] = { extern vm_offset_t xscale_cache_clean_addr; void * -initarm(void *arg, void *arg2) +initarm(struct arm_boot_params *abp) { struct pv_addr kernel_l1pt; struct pv_addr dpcpu; @@ -194,8 +187,8 @@ initarm(void *arg, void *arg2) vm_offset_t lastaddr; uint32_t memsize, memstart; + lastaddr = parse_boot_param(abp); set_cpufuncs(); - lastaddr = fake_preload_metadata(); pcpu_init(pcpup, 0, sizeof(struct pcpu)); PCPU_SET(curthread, &thread0); @@ -224,10 +217,9 @@ initarm(void *arg, void *arg2) kernel_pt_table[loop].pv_pa = freemempos + (loop % (PAGE_SIZE / L2_TABLE_SIZE_REAL)) * L2_TABLE_SIZE_REAL; - kernel_pt_table[loop].pv_va = + kernel_pt_table[loop].pv_va = kernel_pt_table[loop].pv_pa + 0x20000000; } - i++; } freemem_pt = freemempos; freemempos = 0xa0100000; @@ -294,13 +286,13 @@ initarm(void *arg, void *arg2) (((uint32_t)(lastaddr) - KERNBASE - 0x200000) + L1_S_SIZE) & ~(L1_S_SIZE - 1), VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); freemem_after = ((int)lastaddr + PAGE_SIZE) & ~(PAGE_SIZE - 1); - afterkern = round_page(((vm_offset_t)lastaddr + L1_S_SIZE) & ~(L1_S_SIZE + afterkern = round_page(((vm_offset_t)lastaddr + L1_S_SIZE) & ~(L1_S_SIZE - 1)); for (i = 0; i < KERNEL_PT_AFKERNEL_NUM; i++) { pmap_link_l2pt(l1pagetable, afterkern + i * 0x00100000, &kernel_pt_table[KERNEL_PT_AFKERNEL + i]); } - pmap_map_entry(l1pagetable, afterkern, minidataclean.pv_pa, + pmap_map_entry(l1pagetable, afterkern, minidataclean.pv_pa, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); @@ -309,7 +301,7 @@ initarm(void *arg, void *arg2) arm_add_smallalloc_pages((void *)(freemem_after), (void*)(freemem_after + PAGE_SIZE), afterkern - (freemem_after + PAGE_SIZE), 0); - + } #endif @@ -341,7 +333,7 @@ initarm(void *arg, void *arg2) * of the stack memory. */ - + set_stackptr(PSR_IRQ32_MODE, irqstack.pv_va + IRQ_STACK_SIZE * PAGE_SIZE); set_stackptr(PSR_ABT32_MODE, @@ -379,13 +371,7 @@ initarm(void *arg, void *arg2) undefined_handler_address = (u_int)undefinedinstruction_bounce; undefined_init(); - proc_linkup0(&proc0, &thread0); - thread0.td_kstack = kernelstack.pv_va; - thread0.td_pcb = (struct pcb *) - (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; - thread0.td_pcb->pcb_flags = 0; - thread0.td_frame = &proc0_tf; - pcpup->pc_curpcb = thread0.td_pcb; + init_proc0(kernelstack.pv_va); /* Enable MMU, I-cache, D-cache, write buffer. */ @@ -395,7 +381,7 @@ initarm(void *arg, void *arg2) dump_avail[1] = 0xa0000000 + memsize; dump_avail[2] = 0; dump_avail[3] = 0; - pmap_bootstrap(pmap_curmaxkvaddr, + pmap_bootstrap(pmap_curmaxkvaddr, 0xd0000000, &kernel_l1pt); msgbufp = (void*)msgbufpv.pv_va; msgbufinit(msgbufp, msgbufsize); diff --git a/sys/arm/xscale/i80321/i80321.c b/sys/arm/xscale/i80321/i80321.c index 053fe7811ce..e65f38df587 100644 --- a/sys/arm/xscale/i80321/i80321.c +++ b/sys/arm/xscale/i80321/i80321.c @@ -225,9 +225,9 @@ i80321_attach(struct i80321_softc *sc) static __inline uint32_t i80321_iintsrc_read(void) -{ - uint32_t iintsrc; - +{ + uint32_t iintsrc; + __asm __volatile("mrc p6, 0, %0, c8, c0, 0" : "=r" (iintsrc)); diff --git a/sys/arm/xscale/i80321/i80321_aau.c b/sys/arm/xscale/i80321/i80321_aau.c index f72a7c903cb..288411b7197 100644 --- a/sys/arm/xscale/i80321/i80321_aau.c +++ b/sys/arm/xscale/i80321/i80321_aau.c @@ -111,14 +111,14 @@ i80321_aau_attach(device_t dev) mtx_init(&softc->mtx, "AAU mtx", NULL, MTX_SPIN); softc->sc_st = sc->sc_st; - if (bus_space_subregion(softc->sc_st, sc->sc_sh, VERDE_AAU_BASE, + if (bus_space_subregion(softc->sc_st, sc->sc_sh, VERDE_AAU_BASE, VERDE_AAU_SIZE, &softc->sc_aau_sh) != 0) panic("%s: unable to subregion AAU registers", device_get_name(dev)); if (bus_dma_tag_create(NULL, sizeof(i80321_aaudesc_t), 0, - BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, + BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, AAU_RING_SIZE * sizeof(i80321_aaudesc_t), - 1, sizeof(i80321_aaudesc_t), BUS_DMA_ALLOCNOW, busdma_lock_mutex, + 1, sizeof(i80321_aaudesc_t), BUS_DMA_ALLOCNOW, busdma_lock_mutex, &Giant, &softc->dmatag)) panic("Couldn't create a dma tag"); if (bus_dmamem_alloc(softc->dmatag, (void **)&aaudescs, @@ -186,7 +186,7 @@ aau_bzero(void *dst, int len, int flags) desc->next_desc = 0; desc->count = len; desc->descr_ctrl = 2 << 1 | 1 << 31; /* Fill, enable dest write */ - bus_dmamap_sync(sc->dmatag, sc->aauring[0].map, + bus_dmamap_sync(sc->dmatag, sc->aauring[0].map, BUS_DMASYNC_PREWRITE); } else { test_virt_addr(dst, len); @@ -218,8 +218,8 @@ aau_bzero(void *dst, int len, int flags) if (tmplen <= 0 && descnb > 0) { sc->aauring[descnb - 1].desc->next_desc = 0; - bus_dmamap_sync(sc->dmatag, - sc->aauring[descnb - 1].map, + bus_dmamap_sync(sc->dmatag, + sc->aauring[descnb - 1].map, BUS_DMASYNC_PREWRITE); } continue; @@ -241,15 +241,15 @@ aau_bzero(void *dst, int len, int flags) if (tmplen > 0) { desc->next_desc = sc->aauring[descnb + 1]. phys_addr; - bus_dmamap_sync(sc->dmatag, - sc->aauring[descnb].map, + bus_dmamap_sync(sc->dmatag, + sc->aauring[descnb].map, BUS_DMASYNC_PREWRITE); desc = sc->aauring[descnb + 1].desc; descnb++; } else { desc->next_desc = 0; - bus_dmamap_sync(sc->dmatag, - sc->aauring[descnb].map, + bus_dmamap_sync(sc->dmatag, + sc->aauring[descnb].map, BUS_DMASYNC_PREWRITE); } diff --git a/sys/arm/xscale/i80321/i80321_dma.c b/sys/arm/xscale/i80321/i80321_dma.c index 4ec6d1642ee..abf7dcc970e 100644 --- a/sys/arm/xscale/i80321/i80321_dma.c +++ b/sys/arm/xscale/i80321/i80321_dma.c @@ -115,13 +115,13 @@ i80321_dma_attach(device_t dev) mtx_init(&softc->mtx, "DMA engine mtx", NULL, MTX_SPIN); softc->sc_st = sc->sc_st; if (bus_space_subregion(softc->sc_st, sc->sc_sh, unit == 0 ? - VERDE_DMA_BASE0 : VERDE_DMA_BASE1, VERDE_DMA_SIZE, + VERDE_DMA_BASE0 : VERDE_DMA_BASE1, VERDE_DMA_SIZE, &softc->sc_dma_sh) != 0) panic("%s: unable to subregion DMA registers", device_get_name(dev)); if (bus_dma_tag_create(NULL, sizeof(i80321_dmadesc_t), - 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, - DMA_RING_SIZE * sizeof(i80321_dmadesc_t), 1, + 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, + DMA_RING_SIZE * sizeof(i80321_dmadesc_t), 1, sizeof(i80321_dmadesc_t), BUS_DMA_ALLOCNOW, busdma_lock_mutex, &Giant, &softc->dmatag)) panic("Couldn't create a dma tag"); @@ -131,7 +131,7 @@ i80321_dma_attach(device_t dev) panic("Couldn't alloc dma memory"); for (int i = 0; i < DMA_RING_SIZE; i++) { if (i > 0) - if (bus_dmamap_create(softc->dmatag, 0, + if (bus_dmamap_create(softc->dmatag, 0, &softc->dmaring[i].map)) panic("Couldn't alloc dmamap"); softc->dmaring[i].desc = &dmadescs[i]; @@ -213,11 +213,11 @@ dma_memcpy(void *dst, void *src, int len, int flags) desc->local_addr = (vm_paddr_t)dst; desc->count = len; desc->descr_ctrl = 1 << 6; /* Local memory to local memory. */ - bus_dmamap_sync(sc->dmatag, - sc->dmaring[0].map, + bus_dmamap_sync(sc->dmatag, + sc->dmaring[0].map, BUS_DMASYNC_PREWRITE); } else { - if (!virt_addr_is_valid(dst, len, 1, !(flags & DST_IS_USER)) || + if (!virt_addr_is_valid(dst, len, 1, !(flags & DST_IS_USER)) || !virt_addr_is_valid(src, len, 0, !(flags & SRC_IS_USER))) { mtx_lock_spin(&sc->mtx); sc->flags &= ~BUSY; @@ -275,8 +275,8 @@ dma_memcpy(void *dst, void *src, int len, int flags) if (tmplen <= 0 && descnb > 0) { sc->dmaring[descnb - 1].desc->next_desc = 0; - bus_dmamap_sync(sc->dmatag, - sc->dmaring[descnb - 1].map, + bus_dmamap_sync(sc->dmatag, + sc->dmaring[descnb - 1].map, BUS_DMASYNC_PREWRITE); } continue; @@ -301,8 +301,8 @@ dma_memcpy(void *dst, void *src, int len, int flags) if (tmplen > 0) { desc->next_desc = sc->dmaring[descnb + 1]. phys_addr; - bus_dmamap_sync(sc->dmatag, - sc->dmaring[descnb].map, + bus_dmamap_sync(sc->dmatag, + sc->dmaring[descnb].map, BUS_DMASYNC_PREWRITE); desc = sc->dmaring[descnb + 1].desc; descnb++; diff --git a/sys/arm/xscale/i80321/i80321_intr.h b/sys/arm/xscale/i80321/i80321_intr.h index 4e432dad1e3..bde0bac9724 100644 --- a/sys/arm/xscale/i80321/i80321_intr.h +++ b/sys/arm/xscale/i80321/i80321_intr.h @@ -33,7 +33,7 @@ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. - * + * * $FreeBSD$ * */ diff --git a/sys/arm/xscale/i80321/i80321_pci.c b/sys/arm/xscale/i80321/i80321_pci.c index 36c90d683dc..dfb4c468116 100644 --- a/sys/arm/xscale/i80321/i80321_pci.c +++ b/sys/arm/xscale/i80321/i80321_pci.c @@ -79,7 +79,7 @@ static int i80321_pci_attach(device_t dev) { - uint32_t busno; + uint32_t busno; struct i80321_pci_softc *sc = device_get_softc(dev); sc->sc_st = i80321_softc->sc_st; @@ -100,16 +100,16 @@ i80321_pci_attach(device_t dev) sc->sc_io_rman.rm_type = RMAN_ARRAY; sc->sc_io_rman.rm_descr = "I80321 PCI I/O Ports"; if (rman_init(&sc->sc_io_rman) != 0 || - rman_manage_region(&sc->sc_io_rman, - sc->sc_io, - sc->sc_io + + rman_manage_region(&sc->sc_io_rman, + sc->sc_io, + sc->sc_io + VERDE_OUT_XLATE_IO_WIN_SIZE) != 0) { panic("i80321_pci_probe: failed to set up I/O rman"); } sc->sc_mem_rman.rm_type = RMAN_ARRAY; sc->sc_mem_rman.rm_descr = "I80321 PCI Memory"; if (rman_init(&sc->sc_mem_rman) != 0 || - rman_manage_region(&sc->sc_mem_rman, + rman_manage_region(&sc->sc_mem_rman, 0, VERDE_OUT_XLATE_MEM_WIN_SIZE) != 0) { panic("i80321_pci_probe: failed to set up memory rman"); } @@ -325,7 +325,7 @@ i80321_pci_alloc_resource(device_t bus, device_t child, int type, int *rid, rman_release_resource(rv); return (NULL); } - } + } } return (rv); } @@ -340,7 +340,7 @@ i80321_pci_activate_resource(device_t bus, device_t child, int type, int rid, if (type == SYS_RES_MEMORY) { error = bus_space_map(rman_get_bustag(r), rman_get_bushandle(r), rman_get_size(r), 0, &p); - if (error) + if (error) return (error); rman_set_bushandle(r, p); @@ -350,8 +350,8 @@ i80321_pci_activate_resource(device_t bus, device_t child, int type, int rid, static int i80321_pci_setup_intr(device_t dev, device_t child, - struct resource *ires, int flags, driver_filter_t *filt, - driver_intr_t *intr, void *arg, void **cookiep) + struct resource *ires, int flags, driver_filter_t *filt, + driver_intr_t *intr, void *arg, void **cookiep) { return (BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, filt, intr, arg, cookiep)); diff --git a/sys/arm/xscale/i80321/i80321_space.c b/sys/arm/xscale/i80321/i80321_space.c index f741e895ea1..ebb0306a577 100644 --- a/sys/arm/xscale/i80321/i80321_space.c +++ b/sys/arm/xscale/i80321/i80321_space.c @@ -279,7 +279,7 @@ i80321_io_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend, panic("i80321_io_bs_alloc(): not implemented"); } -void +void i80321_io_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size) { @@ -299,7 +299,7 @@ i80321_mem_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags, endpa = round_page(bpa + size); *bshp = (vm_offset_t)pmap_mapdev(pa, endpa - pa); - + return (0); } @@ -324,7 +324,7 @@ i80321_mem_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend, panic("i80321_mem_bs_alloc(): not implemented"); } -void +void i80321_mem_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size) { diff --git a/sys/arm/xscale/i80321/i80321_timer.c b/sys/arm/xscale/i80321/i80321_timer.c index 78492b81f1a..98c1805df6e 100644 --- a/sys/arm/xscale/i80321/i80321_timer.c +++ b/sys/arm/xscale/i80321/i80321_timer.c @@ -62,7 +62,7 @@ __FBSDID("$FreeBSD$"); #include #ifdef CPU_XSCALE_81342 -#define ICU_INT_TIMER0 (8) /* XXX: Can't include i81342reg.h because +#define ICU_INT_TIMER0 (8) /* XXX: Can't include i81342reg.h because definitions overrides the ones from i80321reg.h */ #endif @@ -79,7 +79,7 @@ static unsigned i80321_timer_get_timecount(struct timecounter *tc); static uint32_t counts_per_hz; -#if defined(XSCALE_DISABLE_CCNT) || defined(CPU_XSCALE_81342) +#if defined(XSCALE_DISABLE_CCNT) || defined(CPU_XSCALE_81342) static uint32_t offset; static uint32_t last = -1; #endif @@ -383,17 +383,17 @@ cpu_initclocks(void) oldirqstate = disable_interrupts(I32_bit); - irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, + irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, #ifdef CPU_XSCALE_81342 ICU_INT_TIMER0, ICU_INT_TIMER0, #else - ICU_INT_TMR0, ICU_INT_TMR0, + ICU_INT_TMR0, ICU_INT_TMR0, #endif 1, RF_ACTIVE); if (!irq) panic("Unable to setup the clock irq handler.\n"); else - bus_setup_intr(dev, irq, INTR_TYPE_CLK, clockhandler, NULL, + bus_setup_intr(dev, irq, INTR_TYPE_CLK, clockhandler, NULL, NULL, &ihl); tmr0_write(0); /* stop timer */ tisr_write(TISR_TMR0); /* clear interrupt */ diff --git a/sys/arm/xscale/i80321/i80321reg.h b/sys/arm/xscale/i80321/i80321reg.h index 5804e990dd4..53617f95658 100644 --- a/sys/arm/xscale/i80321/i80321reg.h +++ b/sys/arm/xscale/i80321/i80321reg.h @@ -38,8 +38,8 @@ * */ -#ifndef _ARM_XSCALE_I80321REG_H_ -#define _ARM_XSCALE_I80321REG_H_ +#ifndef _ARM_XSCALE_I80321REG_H_ +#define _ARM_XSCALE_I80321REG_H_ /* * Register definitions for the Intel 80321 (``Verde'') I/O processor, @@ -102,7 +102,7 @@ #if defined(CPU_XSCALE_80321) #define VERDE_AAU_BASE 0x0800 #define VERDE_AAU_SIZE 0x0100 -#endif +#endif #define VERDE_I2C_BASE 0x1680 #define VERDE_I2C_BASE0 (VERDE_I2C_BASE + 0x00) diff --git a/sys/arm/xscale/i80321/iq31244_7seg.c b/sys/arm/xscale/i80321/iq31244_7seg.c index 3ac090d8d97..3737094b217 100644 --- a/sys/arm/xscale/i80321/iq31244_7seg.c +++ b/sys/arm/xscale/i80321/iq31244_7seg.c @@ -206,7 +206,7 @@ static const uint8_t digitmap[] = { SEG_D|SEG_E, }; -static uint8_t +static uint8_t iq80321_7seg_xlate(char c) { uint8_t rv; @@ -336,7 +336,7 @@ static const uint8_t snakemap[][2] = { static SYSCTL_NODE(_hw, OID_AUTO, sevenseg, CTLFLAG_RD, 0, "7 seg"); static int freq = 20; -SYSCTL_INT(_hw_sevenseg, OID_AUTO, freq, CTLFLAG_RW, &freq, 0, +SYSCTL_INT(_hw_sevenseg, OID_AUTO, freq, CTLFLAG_RW, &freq, 0, "7 Seg update frequency"); static void iq31244_7seg_snake(void) diff --git a/sys/arm/xscale/i80321/iq31244_machdep.c b/sys/arm/xscale/i80321/iq31244_machdep.c index 15b143da9a0..e9f3fae095f 100644 --- a/sys/arm/xscale/i80321/iq31244_machdep.c +++ b/sys/arm/xscale/i80321/iq31244_machdep.c @@ -40,7 +40,7 @@ * * Machine dependant functions for kernel setup * - * This file needs a lot of work. + * This file needs a lot of work. * * Created : 17/09/94 */ @@ -115,10 +115,6 @@ extern u_int undefined_handler_address; struct pv_addr kernel_pt_table[NUM_KERNEL_PTS]; -extern void *_end; - -extern int *end; - struct pcpu __pcpu; struct pcpu *pcpup = &__pcpu; @@ -126,7 +122,6 @@ struct pcpu *pcpup = &__pcpu; vm_paddr_t phys_avail[10]; vm_paddr_t dump_avail[4]; -vm_offset_t physical_pages; struct pv_addr systempage; struct pv_addr msgbufpv; @@ -136,13 +131,11 @@ struct pv_addr abtstack; struct pv_addr kernelstack; struct pv_addr minidataclean; -static struct trapframe proc0_tf; - #define IQ80321_OBIO_BASE 0xfe800000UL #define IQ80321_OBIO_SIZE 0x00100000UL /* Static device mappings. */ static const struct pmap_devmap iq80321_devmap[] = { - /* + /* * Map the on-board devices VA == PA so that we can access them * with the MMU on or off. */ @@ -150,7 +143,7 @@ static const struct pmap_devmap iq80321_devmap[] = { IQ80321_OBIO_BASE, IQ80321_OBIO_BASE, IQ80321_OBIO_SIZE, - VM_PROT_READ|VM_PROT_WRITE, + VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, { @@ -160,7 +153,7 @@ static const struct pmap_devmap iq80321_devmap[] = { VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, - + { IQ80321_80321_VBASE, VERDE_PMMR_BASE, @@ -182,7 +175,7 @@ static const struct pmap_devmap iq80321_devmap[] = { extern vm_offset_t xscale_cache_clean_addr; void * -initarm(void *arg, void *arg2) +initarm(struct arm_boot_params *abp) { struct pv_addr kernel_l1pt; struct pv_addr dpcpu; @@ -195,8 +188,8 @@ initarm(void *arg, void *arg2) vm_offset_t lastaddr; uint32_t memsize, memstart; + lastaddr = parse_boot_param(abp); set_cpufuncs(); - lastaddr = fake_preload_metadata(); pcpu_init(pcpup, 0, sizeof(struct pcpu)); PCPU_SET(curthread, &thread0); @@ -225,7 +218,7 @@ initarm(void *arg, void *arg2) kernel_pt_table[loop].pv_pa = freemempos + (loop % (PAGE_SIZE / L2_TABLE_SIZE_REAL)) * L2_TABLE_SIZE_REAL; - kernel_pt_table[loop].pv_va = + kernel_pt_table[loop].pv_va = kernel_pt_table[loop].pv_pa + 0x20000000; } } @@ -292,13 +285,13 @@ initarm(void *arg, void *arg2) (((uint32_t)(lastaddr) - KERNBASE - 0x200000) + L1_S_SIZE) & ~(L1_S_SIZE - 1), VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); freemem_after = ((int)lastaddr + PAGE_SIZE) & ~(PAGE_SIZE - 1); - afterkern = round_page(((vm_offset_t)lastaddr + L1_S_SIZE) & ~(L1_S_SIZE + afterkern = round_page(((vm_offset_t)lastaddr + L1_S_SIZE) & ~(L1_S_SIZE - 1)); for (i = 0; i < KERNEL_PT_AFKERNEL_NUM; i++) { pmap_link_l2pt(l1pagetable, afterkern + i * 0x00100000, &kernel_pt_table[KERNEL_PT_AFKERNEL + i]); } - pmap_map_entry(l1pagetable, afterkern, minidataclean.pv_pa, + pmap_map_entry(l1pagetable, afterkern, minidataclean.pv_pa, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); @@ -307,7 +300,7 @@ initarm(void *arg, void *arg2) arm_add_smallalloc_pages((void *)(freemem_after), (void*)(freemem_after + PAGE_SIZE), afterkern - (freemem_after + PAGE_SIZE), 0); - + } #endif @@ -339,7 +332,7 @@ initarm(void *arg, void *arg2) * of the stack memory. */ - + set_stackptr(PSR_IRQ32_MODE, irqstack.pv_va + IRQ_STACK_SIZE * PAGE_SIZE); set_stackptr(PSR_ABT32_MODE, @@ -377,13 +370,7 @@ initarm(void *arg, void *arg2) undefined_handler_address = (u_int)undefinedinstruction_bounce; undefined_init(); - proc_linkup0(&proc0, &thread0); - thread0.td_kstack = kernelstack.pv_va; - thread0.td_pcb = (struct pcb *) - (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; - thread0.td_pcb->pcb_flags = 0; - thread0.td_frame = &proc0_tf; - pcpup->pc_curpcb = thread0.td_pcb; + init_proc0(kernelstack.pv_va); /* Enable MMU, I-cache, D-cache, write buffer. */ @@ -401,7 +388,7 @@ initarm(void *arg, void *arg2) dump_avail[2] = 0; dump_avail[3] = 0; - pmap_bootstrap(pmap_curmaxkvaddr, + pmap_bootstrap(pmap_curmaxkvaddr, 0xd0000000, &kernel_l1pt); msgbufp = (void*)msgbufpv.pv_va; msgbufinit(msgbufp, msgbufsize); diff --git a/sys/arm/xscale/i80321/iq80321.c b/sys/arm/xscale/i80321/iq80321.c index 7a875bf702a..f43f8e40995 100644 --- a/sys/arm/xscale/i80321/iq80321.c +++ b/sys/arm/xscale/i80321/iq80321.c @@ -324,7 +324,7 @@ arm_unmask_irq(uintptr_t nb) void cpu_reset() -{ +{ (void) disable_interrupts(I32_bit|F32_bit); *(__volatile uint32_t *)(IQ80321_80321_VBASE + VERDE_ATU_BASE + ATU_PCSR) = PCSR_RIB | PCSR_RPB; @@ -351,7 +351,7 @@ iq80321_alloc_resource(device_t dev, device_t child, int type, int *rid, static int iq80321_setup_intr(device_t dev, device_t child, - struct resource *ires, int flags, driver_filter_t *filt, + struct resource *ires, int flags, driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep) { int error; diff --git a/sys/arm/xscale/i80321/obio.c b/sys/arm/xscale/i80321/obio.c index f6ed79143b6..566d6cd11ce 100644 --- a/sys/arm/xscale/i80321/obio.c +++ b/sys/arm/xscale/i80321/obio.c @@ -120,7 +120,7 @@ obio_alloc_resource(device_t bus, device_t child, int type, int *rid, rv = rman_reserve_resource(rm, start, end, count, flags, child); - if (rv == NULL) + if (rv == NULL) return (NULL); if (type == SYS_RES_IRQ) return (rv); diff --git a/sys/arm/xscale/i8134x/crb_machdep.c b/sys/arm/xscale/i8134x/crb_machdep.c index b368c1988c7..2fa7ca128c7 100644 --- a/sys/arm/xscale/i8134x/crb_machdep.c +++ b/sys/arm/xscale/i8134x/crb_machdep.c @@ -40,7 +40,7 @@ * * Machine dependant functions for kernel setup * - * This file needs a lot of work. + * This file needs a lot of work. * * Created : 17/09/94 */ @@ -117,7 +117,6 @@ extern u_int prefetch_abort_handler_address; extern u_int undefined_handler_address; struct pv_addr kernel_pt_table[NUM_KERNEL_PTS]; -extern int *end; struct pcpu __pcpu; struct pcpu *pcpup = &__pcpu; @@ -126,7 +125,6 @@ struct pcpu *pcpup = &__pcpu; vm_paddr_t phys_avail[10]; vm_paddr_t dump_avail[4]; -vm_offset_t physical_pages; struct pv_addr systempage; struct pv_addr msgbufpv; @@ -135,8 +133,6 @@ struct pv_addr undstack; struct pv_addr abtstack; struct pv_addr kernelstack; -static struct trapframe proc0_tf; - /* Static device mappings. */ static const struct pmap_devmap iq81342_devmap[] = { { @@ -164,7 +160,7 @@ static const struct pmap_devmap iq81342_devmap[] = { VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE, }, - { + { 0, 0, 0, @@ -178,7 +174,7 @@ static const struct pmap_devmap iq81342_devmap[] = { extern vm_offset_t xscale_cache_clean_addr; void * -initarm(void *arg, void *arg2) +initarm(struct arm_boot_params *abp) { struct pv_addr kernel_l1pt; struct pv_addr dpcpu; @@ -191,8 +187,8 @@ initarm(void *arg, void *arg2) vm_offset_t lastaddr; uint32_t memsize, memstart; + lastaddr = parse_boot_param(abp); set_cpufuncs(); - lastaddr = fake_preload_metadata(); pcpu_init(pcpup, 0, sizeof(struct pcpu)); PCPU_SET(curthread, &thread0); @@ -221,7 +217,7 @@ initarm(void *arg, void *arg2) kernel_pt_table[loop].pv_pa = freemempos + (loop % (PAGE_SIZE / L2_TABLE_SIZE_REAL)) * L2_TABLE_SIZE_REAL; - kernel_pt_table[loop].pv_va = + kernel_pt_table[loop].pv_va = kernel_pt_table[loop].pv_pa + 0xc0000000; } } @@ -280,7 +276,7 @@ initarm(void *arg, void *arg2) (((uint32_t)(lastaddr) - KERNBASE - 0x200000) + L1_S_SIZE) & ~(L1_S_SIZE - 1), VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); freemem_after = ((int)lastaddr + PAGE_SIZE) & ~(PAGE_SIZE - 1); - afterkern = round_page(((vm_offset_t)lastaddr + L1_S_SIZE) & ~(L1_S_SIZE + afterkern = round_page(((vm_offset_t)lastaddr + L1_S_SIZE) & ~(L1_S_SIZE - 1)); for (i = 0; i < KERNEL_PT_AFKERNEL_NUM; i++) { pmap_link_l2pt(l1pagetable, afterkern + i * 0x00100000, @@ -293,7 +289,7 @@ initarm(void *arg, void *arg2) arm_add_smallalloc_pages((void *)(freemem_after), (void*)(freemem_after + PAGE_SIZE), afterkern - (freemem_after + PAGE_SIZE), 0); - + } #endif @@ -321,7 +317,7 @@ initarm(void *arg, void *arg2) * of the stack memory. */ - + set_stackptr(PSR_IRQ32_MODE, irqstack.pv_va + IRQ_STACK_SIZE * PAGE_SIZE); set_stackptr(PSR_ABT32_MODE, @@ -353,13 +349,7 @@ initarm(void *arg, void *arg2) undefined_handler_address = (u_int)undefinedinstruction_bounce; undefined_init(); - proc_linkup0(&proc0, &thread0); - thread0.td_kstack = kernelstack.pv_va; - thread0.td_pcb = (struct pcb *) - (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; - thread0.td_pcb->pcb_flags = 0; - thread0.td_frame = &proc0_tf; - pcpup->pc_curpcb = thread0.td_pcb; + init_proc0(kernelstack.pv_va); arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL); @@ -373,7 +363,7 @@ initarm(void *arg, void *arg2) dump_avail[2] = 0; dump_avail[3] = 0; - pmap_bootstrap(pmap_curmaxkvaddr, + pmap_bootstrap(pmap_curmaxkvaddr, 0xd0000000, &kernel_l1pt); msgbufp = (void*)msgbufpv.pv_va; msgbufinit(msgbufp, msgbufsize); diff --git a/sys/arm/xscale/i8134x/i81342.c b/sys/arm/xscale/i8134x/i81342.c index 44ec3fd6392..2bfab78ccc1 100644 --- a/sys/arm/xscale/i8134x/i81342.c +++ b/sys/arm/xscale/i8134x/i81342.c @@ -425,8 +425,8 @@ i81342_alloc_resource(device_t dev, device_t child, int type, int *rid, } static int -i81342_setup_intr(device_t dev, device_t child, struct resource *ires, - int flags, driver_filter_t *filt, driver_intr_t *intr, void *arg, +i81342_setup_intr(device_t dev, device_t child, struct resource *ires, + int flags, driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep) { int error; diff --git a/sys/arm/xscale/i8134x/i81342_mcu.c b/sys/arm/xscale/i8134x/i81342_mcu.c index 045fe96d3c2..7a3d2bf946d 100644 --- a/sys/arm/xscale/i8134x/i81342_mcu.c +++ b/sys/arm/xscale/i8134x/i81342_mcu.c @@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$"); #include void -i81342_sdram_bounds(bus_space_tag_t bt, bus_space_handle_t bh, +i81342_sdram_bounds(bus_space_tag_t bt, bus_space_handle_t bh, vm_paddr_t *start, vm_size_t *size) { uint32_t reg; diff --git a/sys/arm/xscale/i8134x/i81342_pci.c b/sys/arm/xscale/i8134x/i81342_pci.c index 17cc7cda32a..8bbcdba3bc5 100644 --- a/sys/arm/xscale/i8134x/i81342_pci.c +++ b/sys/arm/xscale/i8134x/i81342_pci.c @@ -180,7 +180,7 @@ i81342_pci_attach(device_t dev) sc->sc_io_rman.rm_type = RMAN_ARRAY; sc->sc_io_rman.rm_descr = "I81342 PCI I/O Ports"; if (rman_init(&sc->sc_io_rman) != 0 || - rman_manage_region(&sc->sc_io_rman, + rman_manage_region(&sc->sc_io_rman, sc->sc_is_atux ? IOP34X_PCIX_OIOBAR_VADDR : IOP34X_PCIE_OIOBAR_VADDR, (sc->sc_is_atux ? IOP34X_PCIX_OIOBAR_VADDR : @@ -190,7 +190,7 @@ i81342_pci_attach(device_t dev) sc->sc_mem_rman.rm_type = RMAN_ARRAY; sc->sc_mem_rman.rm_descr = "I81342 PCI Memory"; if (rman_init(&sc->sc_mem_rman) != 0 || - rman_manage_region(&sc->sc_mem_rman, + rman_manage_region(&sc->sc_mem_rman, 0, 0xffffffff) != 0) { panic("i81342_pci_attach: failed to set up memory rman"); } @@ -198,12 +198,12 @@ i81342_pci_attach(device_t dev) sc->sc_irq_rman.rm_descr = "i81342 PCI IRQs"; if (sc->sc_is_atux) { if (rman_init(&sc->sc_irq_rman) != 0 || - rman_manage_region(&sc->sc_irq_rman, ICU_INT_XINT0, + rman_manage_region(&sc->sc_irq_rman, ICU_INT_XINT0, ICU_INT_XINT3) != 0) panic("i83142_pci_attach: failed to set up IRQ rman"); } else { if (rman_init(&sc->sc_irq_rman) != 0 || - rman_manage_region(&sc->sc_irq_rman, ICU_INT_ATUE_MA, + rman_manage_region(&sc->sc_irq_rman, ICU_INT_ATUE_MA, ICU_INT_ATUE_MD) != 0) panic("i81342_pci_attach: failed to set up IRQ rman"); @@ -242,7 +242,7 @@ i81342_pci_conf_setup(struct i81342_pci_softc *sc, int bus, int slot, int func, *addr = (1 << (slot + 16)) | (slot << 11) | (func << 8) | reg; else - *addr = (bus << 16) | (slot << 11) | (func << 11) | + *addr = (bus << 16) | (slot << 11) | (func << 11) | reg | 1; } else { *addr = (bus << 24) | (slot << 19) | (func << 16) | reg; @@ -297,7 +297,7 @@ i81342_pci_read_config(device_t dev, u_int bus, u_int slot, u_int func, } static void -i81342_pci_write_config(device_t dev, u_int bus, u_int slot, u_int func, +i81342_pci_write_config(device_t dev, u_int bus, u_int slot, u_int func, u_int reg, u_int32_t data, int bytes) { struct i81342_pci_softc *sc = device_get_softc(dev); @@ -372,7 +372,7 @@ i81342_pci_alloc_resource(device_t bus, device_t child, int type, int *rid, rman_release_resource(rv); return (NULL); } - } + } } return (rv); diff --git a/sys/arm/xscale/i8134x/i81342_space.c b/sys/arm/xscale/i8134x/i81342_space.c index 50865f17e64..5b08ef62403 100644 --- a/sys/arm/xscale/i8134x/i81342_space.c +++ b/sys/arm/xscale/i8134x/i81342_space.c @@ -260,7 +260,7 @@ i81342_io_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend, panic("i81342_io_bs_alloc(): not implemented"); } -void +void i81342_io_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size) { @@ -337,7 +337,7 @@ i81342_mem_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend, panic("i81342_mem_bs_alloc(): not implemented"); } -void +void i81342_mem_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size) { diff --git a/sys/arm/xscale/i8134x/i81342reg.h b/sys/arm/xscale/i8134x/i81342reg.h index 5001d9628c6..c3429703ddf 100644 --- a/sys/arm/xscale/i8134x/i81342reg.h +++ b/sys/arm/xscale/i8134x/i81342reg.h @@ -29,7 +29,7 @@ #ifndef I83142_REG_H_ #define I83142_REG_H_ /* Physical Memory Map */ -/* +/* * 0x000000000 - 0x07FFFFFFF SDRAM * 0x090100000 - 0x0901FFFFF ATUe Outbound IO Window * 0x0F0000000 - 0x0F1FFFFFF Flash @@ -62,7 +62,7 @@ #define IOP34X_ADMA_IE (1 << 0) /* Interrupt enable */ #define IOP34X_ADMA_TR (1 << 1) /* Transfert Direction */ -/* +/* * Source Destination * 00 Host I/O Interface Local Memory * 01 Local Memory Host I/O Interface diff --git a/sys/arm/xscale/i8134x/iq81342_7seg.c b/sys/arm/xscale/i8134x/iq81342_7seg.c index cc0d8713705..4fda6411d37 100644 --- a/sys/arm/xscale/i8134x/iq81342_7seg.c +++ b/sys/arm/xscale/i8134x/iq81342_7seg.c @@ -207,7 +207,7 @@ static const uint8_t digitmap[] = { ~(SEG_D|SEG_E), }; -static uint8_t +static uint8_t iq81342_7seg_xlate(char c) { uint8_t rv; @@ -337,7 +337,7 @@ static const uint8_t snakemap[][2] = { static SYSCTL_NODE(_hw, OID_AUTO, sevenseg, CTLFLAG_RD, 0, "7 seg"); static int freq = 20; -SYSCTL_INT(_hw_sevenseg, OID_AUTO, freq, CTLFLAG_RW, &freq, 0, +SYSCTL_INT(_hw_sevenseg, OID_AUTO, freq, CTLFLAG_RW, &freq, 0, "7 Seg update frequency"); static void iq81342_7seg_snake(void) diff --git a/sys/arm/xscale/i8134x/obio.c b/sys/arm/xscale/i8134x/obio.c index 534f0e7a54d..b8bccce43a1 100644 --- a/sys/arm/xscale/i8134x/obio.c +++ b/sys/arm/xscale/i8134x/obio.c @@ -127,7 +127,7 @@ obio_alloc_resource(device_t bus, device_t child, int type, int *rid, rv = rman_reserve_resource(rm, start, end, count, flags, child); - if (rv == NULL) + if (rv == NULL) return (NULL); if (type == SYS_RES_IRQ) return (rv); diff --git a/sys/arm/xscale/i8134x/uart_cpu_i81342.c b/sys/arm/xscale/i8134x/uart_cpu_i81342.c index 02e7050f78f..2cb2902a9d1 100644 --- a/sys/arm/xscale/i8134x/uart_cpu_i81342.c +++ b/sys/arm/xscale/i8134x/uart_cpu_i81342.c @@ -55,7 +55,7 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) di->ops = uart_getops(&uart_ns8250_class); di->bas.chan = 0; di->bas.bst = &obio_bs_tag; - di->bas.regshft = 2; + di->bas.regshft = 2; di->bas.rclk = 33334000; di->baudrate = 115200; di->databits = 8; diff --git a/sys/arm/xscale/ixp425/avila_ata.c b/sys/arm/xscale/ixp425/avila_ata.c index 3c9efe88ea4..e6307142051 100644 --- a/sys/arm/xscale/ixp425/avila_ata.c +++ b/sys/arm/xscale/ixp425/avila_ata.c @@ -304,7 +304,7 @@ ata_avila_release_resource(device_t dev, device_t child, int type, int rid, } static int -ata_avila_setup_intr(device_t dev, device_t child, struct resource *irq, +ata_avila_setup_intr(device_t dev, device_t child, struct resource *irq, int flags, driver_filter_t *filt, driver_intr_t *function, void *argument, void **cookiep) { diff --git a/sys/arm/xscale/ixp425/avila_gpio.c b/sys/arm/xscale/ixp425/avila_gpio.c index c3deda9f608..dc4e33a9437 100644 --- a/sys/arm/xscale/ixp425/avila_gpio.c +++ b/sys/arm/xscale/ixp425/avila_gpio.c @@ -102,7 +102,7 @@ static struct avila_gpio_pin avila_gpio_pins[] = { /* * Helpers */ -static void avila_gpio_pin_configure(struct avila_gpio_softc *sc, +static void avila_gpio_pin_configure(struct avila_gpio_softc *sc, struct gpio_pin *pin, uint32_t flags); static int avila_gpio_pin_flags(struct avila_gpio_softc *sc, uint32_t pin); diff --git a/sys/arm/xscale/ixp425/avila_machdep.c b/sys/arm/xscale/ixp425/avila_machdep.c index a047964aebf..6c8751053f2 100644 --- a/sys/arm/xscale/ixp425/avila_machdep.c +++ b/sys/arm/xscale/ixp425/avila_machdep.c @@ -40,7 +40,7 @@ * * Machine dependant functions for kernel setup * - * This file needs a lot of work. + * This file needs a lot of work. * * Created : 17/09/94 */ @@ -119,10 +119,6 @@ extern u_int undefined_handler_address; struct pv_addr kernel_pt_table[NUM_KERNEL_PTS]; -extern void *_end; - -extern int *end; - struct pcpu __pcpu; struct pcpu *pcpup = &__pcpu; @@ -130,7 +126,6 @@ struct pcpu *pcpup = &__pcpu; vm_paddr_t phys_avail[10]; vm_paddr_t dump_avail[4]; -vm_offset_t physical_pages; struct pv_addr systempage; struct pv_addr msgbufpv; @@ -140,8 +135,6 @@ struct pv_addr abtstack; struct pv_addr kernelstack; struct pv_addr minidataclean; -static struct trapframe proc0_tf; - /* Static device mappings. */ static const struct pmap_devmap ixp425_devmap[] = { /* Physical/Virtual address for I/O space */ @@ -225,7 +218,7 @@ static const struct pmap_devmap ixp435_devmap[] = { extern vm_offset_t xscale_cache_clean_addr; void * -initarm(void *arg, void *arg2) +initarm(struct arm_boot_params *abp) { #define next_chunk2(a,b) (((a) + (b)) &~ ((b)-1)) #define next_page(a) next_chunk2(a,PAGE_SIZE) @@ -240,8 +233,8 @@ initarm(void *arg, void *arg2) vm_offset_t lastaddr; uint32_t memsize; + lastaddr = parse_boot_param(abp); set_cpufuncs(); /* NB: sets cputype */ - lastaddr = fake_preload_metadata(); pcpu_init(pcpup, 0, sizeof(struct pcpu)); PCPU_SET(curthread, &thread0); @@ -285,7 +278,7 @@ initarm(void *arg, void *arg2) kernel_pt_table[loop].pv_pa = freemempos + (loop % (PAGE_SIZE / L2_TABLE_SIZE_REAL)) * L2_TABLE_SIZE_REAL; - kernel_pt_table[loop].pv_va = + kernel_pt_table[loop].pv_va = kernel_pt_table[loop].pv_pa + (KERNVIRTADDR - KERNPHYSADDR); } @@ -366,7 +359,7 @@ initarm(void *arg, void *arg2) pmap_link_l2pt(l1pagetable, afterkern + i * 0x00100000, &kernel_pt_table[KERNEL_PT_AFKERNEL + i]); } - pmap_map_entry(l1pagetable, afterkern, minidataclean.pv_pa, + pmap_map_entry(l1pagetable, afterkern, minidataclean.pv_pa, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); #ifdef ARM_USE_SMALL_ALLOC @@ -374,7 +367,7 @@ initarm(void *arg, void *arg2) arm_add_smallalloc_pages((void *)(freemem_after), (void*)(freemem_after + PAGE_SIZE), afterkern - (freemem_after + PAGE_SIZE), 0); - + } #endif @@ -443,22 +436,12 @@ initarm(void *arg, void *arg2) undefined_handler_address = (u_int)undefinedinstruction_bounce; undefined_init(); - proc_linkup0(&proc0, &thread0); - thread0.td_kstack = kernelstack.pv_va; - thread0.td_pcb = (struct pcb *) - (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; - thread0.td_pcb->pcb_flags = 0; - thread0.td_frame = &proc0_tf; - pcpup->pc_curpcb = thread0.td_pcb; + init_proc0(kernelstack.pv_va); arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL); pmap_curmaxkvaddr = afterkern + PAGE_SIZE; - dump_avail[0] = PHYSADDR; - dump_avail[1] = PHYSADDR + memsize; - dump_avail[2] = 0; - dump_avail[3] = 0; - + arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0])); pmap_bootstrap(pmap_curmaxkvaddr, 0xd0000000, &kernel_l1pt); msgbufp = (void*)msgbufpv.pv_va; msgbufinit(msgbufp, msgbufsize); diff --git a/sys/arm/xscale/ixp425/cambria_exp_space.c b/sys/arm/xscale/ixp425/cambria_exp_space.c index 506bf5c8a13..30dfac5582a 100644 --- a/sys/arm/xscale/ixp425/cambria_exp_space.c +++ b/sys/arm/xscale/ixp425/cambria_exp_space.c @@ -249,7 +249,7 @@ cambria_exp_bus_init(struct ixp425_softc *sc) cs3 = EXP_BUS_READ_4(sc, EXP_TIMING_CS3_OFFSET); /* XXX force slowest possible timings and byte mode */ EXP_BUS_WRITE_4(sc, EXP_TIMING_CS3_OFFSET, - cs3 | (EXP_T1|EXP_T2|EXP_T3|EXP_T4|EXP_T5) | + cs3 | (EXP_T1|EXP_T2|EXP_T3|EXP_T4|EXP_T5) | EXP_BYTE_EN | EXP_WR_EN | EXP_BYTE_RD16 | EXP_CS_EN); /* XXX force GPIO 3+4 for GPS+RS485 uarts */ diff --git a/sys/arm/xscale/ixp425/if_npe.c b/sys/arm/xscale/ixp425/if_npe.c index 9ac78a26dd3..5063ac61ad0 100644 --- a/sys/arm/xscale/ixp425/if_npe.c +++ b/sys/arm/xscale/ixp425/if_npe.c @@ -89,8 +89,8 @@ __FBSDID("$FreeBSD$"); #include "miibus_if.h" -/* - * XXX: For the main bus dma tag. Can go away if the new method to get the +/* + * XXX: For the main bus dma tag. Can go away if the new method to get the * dma tag from the parent got MFC'd into RELENG_6. */ extern struct ixp425_softc *ixp425_softc; @@ -302,7 +302,7 @@ npe_probe(device_t dev) int unit = device_get_unit(dev); int npeid; - if (unit > 2 || + if (unit > 2 || (ixp4xx_read_feature_bits() & (unit == 0 ? EXP_FCTRL_ETH0 : EXP_FCTRL_ETH1)) == 0) return EINVAL; @@ -496,7 +496,7 @@ npe_dma_setup(struct npe_softc *sc, struct npedma *dma, } /* DMA tag and map for the NPE buffers */ - error = bus_dma_tag_create(ixp425_softc->sc_dmat, sizeof(uint32_t), 0, + error = bus_dma_tag_create(ixp425_softc->sc_dmat, sizeof(uint32_t), 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, nbuf * sizeof(struct npehwbuf), 1, nbuf * sizeof(struct npehwbuf), 0, @@ -1445,7 +1445,7 @@ npestop(struct npe_softc *sc) /* * The MAC core rx/tx disable may leave the MAC hardware in an - * unpredictable state. A hw reset is executed before resetting + * unpredictable state. A hw reset is executed before resetting * all the MAC parameters to a known value. */ WR4(sc, NPE_MAC_CORE_CNTRL, NPE_CORE_RESET); diff --git a/sys/arm/xscale/ixp425/if_npereg.h b/sys/arm/xscale/ixp425/if_npereg.h index 6f14ef4f392..a7422c71a40 100644 --- a/sys/arm/xscale/ixp425/if_npereg.h +++ b/sys/arm/xscale/ixp425/if_npereg.h @@ -32,7 +32,7 @@ /* * Copyright (c) 2001-2005, Intel Corporation. * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -44,8 +44,8 @@ * 3. Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * - * + * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -253,19 +253,19 @@ struct npestats { /* NB: shorthands for mii bus mdio routines */ #define NPE_MAC_MDIO_CMD NPE_MAC_MDIO_CMD_1 #define NPE_MAC_MDIO_STS NPE_MAC_MDIO_STS_1 - + #define NPE_MII_GO (1<<31) #define NPE_MII_WRITE (1<<26) -#define NPE_MII_TIMEOUT_10TH_SECS 5 +#define NPE_MII_TIMEOUT_10TH_SECS 5 #define NPE_MII_10TH_SEC_IN_MILLIS 100 #define NPE_MII_READ_FAIL (1<<31) - + #define NPE_MII_PHY_DEF_DELAY 300 /* max delay before link up, etc. */ #define NPE_MII_PHY_NO_DELAY 0x0 /* do not delay */ #define NPE_MII_PHY_NULL 0xff /* PHY is not present */ #define NPE_MII_PHY_DEF_ADDR 0x0 /* default PHY's logical address */ -/* Register definition */ +/* Register definition */ #define NPE_MII_CTRL_REG 0x0 /* Control Register */ #define NPE_MII_STAT_REG 0x1 /* Status Register */ #define NPE_MII_PHY_ID1_REG 0x2 /* PHY identifier 1 Register */ diff --git a/sys/arm/xscale/ixp425/ixp425.c b/sys/arm/xscale/ixp425/ixp425.c index 1b56642f192..efe9aa3edea 100644 --- a/sys/arm/xscale/ixp425/ixp425.c +++ b/sys/arm/xscale/ixp425/ixp425.c @@ -177,7 +177,7 @@ ixp425_set_gpio(struct ixp425_softc *sc, int pin, int type) gpiotr | GPIO_TYPE(pin, type)); /* configure gpio line as an input */ - GPIO_CONF_WRITE_4(sc, IXP425_GPIO_GPOER, + GPIO_CONF_WRITE_4(sc, IXP425_GPIO_GPOER, GPIO_CONF_READ_4(sc, IXP425_GPIO_GPOER) | (1<sc_dmat)) panic("%s: failed to create dma tag", __func__); @@ -534,7 +534,7 @@ ixp425_alloc_resource(device_t dev, device_t child, int type, int *rid, device_printf(child, "%s: assign 0x%lx:0x%lx%s\n", __func__, start, end - start, - vtrans->isa4x ? " A4X" : + vtrans->isa4x ? " A4X" : vtrans->isslow ? " SLOW" : ""); } } else @@ -602,7 +602,7 @@ ixp425_activate_resource(device_t dev, device_t child, int type, int rid, static int ixp425_deactivate_resource(device_t bus, device_t child, int type, int rid, - struct resource *r) + struct resource *r) { /* NB: no private resources, just deactive */ return (rman_deactivate_resource(r)); @@ -635,8 +635,8 @@ update_masks(uint32_t mask, uint32_t mask2) static int ixp425_setup_intr(device_t dev, device_t child, - struct resource *res, int flags, driver_filter_t *filt, - driver_intr_t *intr, void *arg, void **cookiep) + struct resource *res, int flags, driver_filter_t *filt, + driver_intr_t *intr, void *arg, void **cookiep) { uint32_t mask, mask2; int error; diff --git a/sys/arm/xscale/ixp425/ixp425_iic.c b/sys/arm/xscale/ixp425/ixp425_iic.c index 342a6a50052..bb66236b696 100644 --- a/sys/arm/xscale/ixp425/ixp425_iic.c +++ b/sys/arm/xscale/ixp425/ixp425_iic.c @@ -100,7 +100,7 @@ ixpiic_callback(device_t dev, int index, caddr_t data) return (0); } -static int +static int ixpiic_getscl(device_t dev) { struct ixpiic_softc *sc = ixpiic_sc; @@ -114,7 +114,7 @@ ixpiic_getscl(device_t dev) return (reg & GPIO_I2C_SCL_BIT); } -static int +static int ixpiic_getsda(device_t dev) { struct ixpiic_softc *sc = ixpiic_sc; @@ -128,7 +128,7 @@ ixpiic_getsda(device_t dev) return (reg & GPIO_I2C_SDA_BIT); } -static void +static void ixpiic_setsda(device_t dev, int val) { struct ixpiic_softc *sc = ixpiic_sc; @@ -143,7 +143,7 @@ ixpiic_setsda(device_t dev, int val) DELAY(I2C_DELAY); } -static void +static void ixpiic_setscl(device_t dev, int val) { struct ixpiic_softc *sc = ixpiic_sc; diff --git a/sys/arm/xscale/ixp425/ixp425_npe.c b/sys/arm/xscale/ixp425/ixp425_npe.c index 53f588dca17..da8384d7963 100644 --- a/sys/arm/xscale/ixp425/ixp425_npe.c +++ b/sys/arm/xscale/ixp425/ixp425_npe.c @@ -30,7 +30,7 @@ /*- * Copyright (c) 2001-2005, Intel Corporation. * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -42,8 +42,8 @@ * 3. Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * - * + * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -135,7 +135,7 @@ static struct ixpnpe_softc *npes[NPE_MAX]; /* * masks used to extract address info from State information context - * register addresses as read from microcode image + * register addresses as read from microcode image */ #define IX_NPEDL_MASK_STATE_ADDR_CTXT_REG 0x0000000F #define IX_NPEDL_MASK_STATE_ADDR_CTXT_NUM 0x000000F0 @@ -332,7 +332,7 @@ ixpnpe_attach(device_t dev, int npeid) NULL, ixpnpe_intr, sc, &sc->sc_ih); /* * Enable output fifo interrupts (NB: must also set OFIFO Write Enable) - */ + */ npe_reg_write(sc, IX_NPECTL, npe_reg_read(sc, IX_NPECTL) | (IX_NPECTL_OFE | IX_NPECTL_OFWE)); @@ -347,7 +347,7 @@ ixpnpe_detach(struct ixpnpe_softc *sc) if (--sc->sc_nrefs == 0) { npes[sc->sc_npeid] = NULL; - /* disable output fifo interrupts */ + /* disable output fifo interrupts */ npe_reg_write(sc, IX_NPECTL, npe_reg_read(sc, IX_NPECTL) &~ (IX_NPECTL_OFE | IX_NPECTL_OFWE)); @@ -671,7 +671,7 @@ npe_load_stateinfo(struct ixpnpe_softc *sc, const IxNpeDlNpeMgrStateInfoBlock *bp, int verify) { int i, nentries, error; - + npe_cpu_step_save(sc); /* for each state-info context register entry in block */ @@ -683,7 +683,7 @@ npe_load_stateinfo(struct ixpnpe_softc *sc, uint32_t addrInfo = bp->ctxtRegEntry[i].addressInfo; uint32_t reg = (addrInfo & IX_NPEDL_MASK_STATE_ADDR_CTXT_REG); - uint32_t cNum = (addrInfo & IX_NPEDL_MASK_STATE_ADDR_CTXT_NUM) >> + uint32_t cNum = (addrInfo & IX_NPEDL_MASK_STATE_ADDR_CTXT_NUM) >> IX_NPEDL_OFFSET_STATE_ADDR_CTXT_NUM; /* error-check Context Register No. and Context Number values */ @@ -692,13 +692,13 @@ npe_load_stateinfo(struct ixpnpe_softc *sc, "invalid Context Register %u\n", reg); error = EINVAL; break; - } + } if (!(0 <= cNum && cNum < IX_NPEDL_CTXT_NUM_MAX)) { device_printf(sc->sc_dev, "invalid Context Number %u\n", cNum); error = EINVAL; break; - } + } /* NOTE that there is no STEVT register for Context 0 */ if (cNum == 0 && reg == IX_NPEDL_CTXT_REG_STEVT) { device_printf(sc->sc_dev, @@ -735,7 +735,7 @@ npe_load_image(struct ixpnpe_softc *sc, /* * Read Download Map, checking each block type and calling - * appropriate function to perform download + * appropriate function to perform download */ error = 0; downloadMap = (const IxNpeDlNpeMgrDownloadMap *) imageCodePtr; @@ -844,7 +844,7 @@ npe_cpu_reset(struct ixpnpe_softc *sc) (ixNpeConfigCtrlRegVal & IX_NPEDL_PARITY_BIT_MASK)); DPRINTFn(2, sc->sc_dev, "%s: dis parity int, CTL => 0x%x\n", __func__, ixNpeConfigCtrlRegVal & IX_NPEDL_PARITY_BIT_MASK); - + npe_cpu_step_save(sc); /* @@ -873,7 +873,7 @@ npe_cpu_reset(struct ixpnpe_softc *sc) DPRINTF(sc->sc_dev, "%s: cannot step (1), error %u\n", __func__, error); npe_cpu_step_restore(sc); - return error; + return error; } } @@ -888,10 +888,10 @@ npe_cpu_reset(struct ixpnpe_softc *sc) DPRINTF(sc->sc_dev, "%s: cannot step (2), error %u\n", __func__, error); npe_cpu_step_restore(sc); - return error; + return error; } - /* + /* * Reset the physical registers in the NPE register file: * Note: no need to save/restore REGMAP for Context 0 here * since all Context Store regs are reset in subsequent code. @@ -965,7 +965,7 @@ npe_cpu_reset(struct ixpnpe_softc *sc) error = npe_cpu_stop(sc); /* restore NPE configuration bus Control Register - Parity Settings */ - npe_reg_write(sc, IX_NPEDL_REG_OFFSET_CTL, + npe_reg_write(sc, IX_NPEDL_REG_OFFSET_CTL, (ixNpeConfigCtrlRegVal & IX_NPEDL_CONFIG_CTRL_REG_MASK)); DPRINTFn(2, sc->sc_dev, "%s: restore CTL => 0x%x\n", __func__, npe_reg_read(sc, IX_NPEDL_REG_OFFSET_CTL)); @@ -1189,10 +1189,10 @@ npe_cpu_step(struct ixpnpe_softc *sc, uint32_t npeInstruction, newWatchcount == oldWatchcount; tries++) { /* Watch Count register incr's when NPE completes an inst */ newWatchcount = npe_reg_read(sc, IX_NPEDL_REG_OFFSET_WC); - } + } return (tries < IX_NPE_DL_MAX_NUM_OF_RETRIES) ? 0 : EIO; #undef IX_NPE_DL_MAX_NUM_OF_RETRIES -} +} static void npe_cpu_step_restore(struct ixpnpe_softc *sc) @@ -1283,7 +1283,7 @@ npe_logical_reg_write(struct ixpnpe_softc *sc, uint32_t regAddr, uint32_t regVal } else { uint32_t npeInstruction; - switch (regSize) { + switch (regSize) { case IX_NPEDL_REG_SIZE_BYTE: npeInstruction = IX_NPEDL_INSTR_WR_REG_BYTE; regVal &= 0xff; @@ -1353,7 +1353,7 @@ npe_physical_reg_write(struct ixpnpe_softc *sc, /* regAddr = 0 or 4 */ regAddr = (regAddr & IX_NPEDL_MASK_PHYS_REG_ADDR_LOGICAL_ADDR) * sizeof(uint32_t); - error = npe_logical_reg_write(sc, regAddr, regValue, + error = npe_logical_reg_write(sc, regAddr, regValue, IX_NPEDL_REG_SIZE_WORD, 0, verify); } return error; diff --git a/sys/arm/xscale/ixp425/ixp425_npereg.h b/sys/arm/xscale/ixp425/ixp425_npereg.h index 6a22d05f79a..069e9d760f5 100644 --- a/sys/arm/xscale/ixp425/ixp425_npereg.h +++ b/sys/arm/xscale/ixp425/ixp425_npereg.h @@ -32,7 +32,7 @@ /*- * Copyright (c) 2001-2005, Intel Corporation. * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -44,8 +44,8 @@ * 3. Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * - * + * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -93,7 +93,7 @@ (((imageId) >> 0) & 0xff) /* - * Instruction and Data Memory Size (in words) for each NPE + * Instruction and Data Memory Size (in words) for each NPE */ #define IX_NPEDL_INS_MEMSIZE_WORDS_NPEA 4096 #define IX_NPEDL_INS_MEMSIZE_WORDS_NPEB 2048 @@ -135,7 +135,7 @@ #define IX_NPEDL_MASK_STAT_IFNE 0x00080000 /* IFNE bit */ /* - * EXCTL (Execution Control) Register commands + * EXCTL (Execution Control) Register commands */ #define IX_NPEDL_EXCTL_CMD_NPE_STEP 0x01 /* Step 1 instruction */ #define IX_NPEDL_EXCTL_CMD_NPE_START 0x02 /* Start execution */ @@ -164,7 +164,7 @@ #define IX_NPEDL_EXCTL_STATUS_ECS_K 0x00800000 /* pipeline Klean */ /* - * Executing Context Stack (ECS) level registers + * Executing Context Stack (ECS) level registers */ #define IX_NPEDL_ECS_BG_CTXT_REG_0 0x00 /* reg 0 @ bg ctx */ #define IX_NPEDL_ECS_BG_CTXT_REG_1 0x01 /* reg 1 @ bg ctx */ @@ -220,14 +220,14 @@ * Bit-Offsets from LSB of particular bit-fields in Execution Access registers. */ -#define IX_NPEDL_OFFSET_ECS_REG_0_NEXTPC 16 +#define IX_NPEDL_OFFSET_ECS_REG_0_NEXTPC 16 #define IX_NPEDL_OFFSET_ECS_REG_0_LDUR 8 #define IX_NPEDL_OFFSET_ECS_REG_1_CCTXT 16 #define IX_NPEDL_OFFSET_ECS_REG_1_SELCTXT 0 /* - * NPE core & co-processor instruction templates to load into NPE Instruction + * NPE core & co-processor instruction templates to load into NPE Instruction * Register, for read/write of NPE register file registers. */ @@ -268,7 +268,7 @@ * Write a 16-bit NPE internal logical register. * NPE Assembler instruction: "cprd32 d0 &&& DBG_RdInFIFO" */ -#define IX_NPEDL_INSTR_RD_FIFO 0x0F888220 +#define IX_NPEDL_INSTR_RD_FIFO 0x0F888220 /* * Reset Mailbox (MBST) register @@ -292,7 +292,7 @@ * Mask the bits of 16-bit data value (least-sig 5 bits) to be used in * SRC field of immediate-mode NPE instruction */ -#define IX_NPEDL_MASK_IMMED_INSTR_SRC_DATA 0x1F +#define IX_NPEDL_MASK_IMMED_INSTR_SRC_DATA 0x1F /** * Mask the bits of 16-bit data value (most-sig 11 bits) to be used in diff --git a/sys/arm/xscale/ixp425/ixp425_pci.c b/sys/arm/xscale/ixp425/ixp425_pci.c index ff54a21316a..c17eb1e45b0 100644 --- a/sys/arm/xscale/ixp425/ixp425_pci.c +++ b/sys/arm/xscale/ixp425/ixp425_pci.c @@ -132,10 +132,10 @@ ixppcib_attach(device_t dev) /* NB: PCI dma window is 64M so anything above must be bounced */ if (bus_dma_tag_create(NULL, 1, 0, IXP425_AHB_OFFSET + 64 * 1024 * 1024, - BUS_SPACE_MAXADDR, NULL, NULL, 0xffffffff, 0xff, 0xffffffff, 0, + BUS_SPACE_MAXADDR, NULL, NULL, 0xffffffff, 0xff, 0xffffffff, 0, NULL, NULL, &sc->sc_dmat)) panic("couldn't create the PCI dma tag !"); - /* + /* * The PCI bus can only address 64MB. However, due to the way our * implementation of busdma works, busdma can't tell if a device * is a PCI device or not. So defaults to the PCI dma tag, which @@ -155,7 +155,7 @@ ixppcib_attach(device_t dev) sc->sc_io_rman.rm_type = RMAN_ARRAY; sc->sc_io_rman.rm_descr = "IXP4XX PCI I/O Ports"; if (rman_init(&sc->sc_io_rman) != 0 || - rman_manage_region(&sc->sc_io_rman, 0, + rman_manage_region(&sc->sc_io_rman, 0, IXP425_PCI_IO_SIZE) != 0) { panic("ixppcib_probe: failed to set up I/O rman"); } @@ -259,7 +259,7 @@ ixppcib_write_ivar(device_t dev, device_t child, int which, uintptr_t value) static int ixppcib_setup_intr(device_t dev, device_t child, struct resource *ires, - int flags, driver_filter_t *filt, driver_intr_t *intr, void *arg, + int flags, driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep) { @@ -318,11 +318,11 @@ ixppcib_alloc_resource(device_t bus, device_t child, int type, int *rid, static int ixppcib_activate_resource(device_t bus, device_t child, int type, int rid, - struct resource *r) + struct resource *r) { struct ixppcib_softc *sc = device_get_softc(bus); - + switch (type) { case SYS_RES_IOPORT: rman_set_bustag(r, &sc->sc_pci_iot); @@ -340,7 +340,7 @@ ixppcib_activate_resource(device_t bus, device_t child, int type, int rid, static int ixppcib_deactivate_resource(device_t bus, device_t child, int type, int rid, - struct resource *r) + struct resource *r) { device_printf(bus, "%s called deactivate_resource (unexpected)\n", diff --git a/sys/arm/xscale/ixp425/ixp425_pci_space.c b/sys/arm/xscale/ixp425/ixp425_pci_space.c index 6ee2a1d3318..4b0ca8168dc 100644 --- a/sys/arm/xscale/ixp425/ixp425_pci_space.c +++ b/sys/arm/xscale/ixp425/ixp425_pci_space.c @@ -443,7 +443,7 @@ ixp425_pci_mem_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend, panic("ixp425_mem_bs_alloc(): not implemented\n"); } -void +void ixp425_pci_mem_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size) { panic("ixp425_mem_bs_free(): not implemented\n"); diff --git a/sys/arm/xscale/ixp425/ixp425_qmgr.c b/sys/arm/xscale/ixp425/ixp425_qmgr.c index f8792a85f8c..b6fe434564e 100644 --- a/sys/arm/xscale/ixp425/ixp425_qmgr.c +++ b/sys/arm/xscale/ixp425/ixp425_qmgr.c @@ -30,7 +30,7 @@ /*- * Copyright (c) 2001-2005, Intel Corporation. * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -42,8 +42,8 @@ * 3. Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * - * + * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -124,7 +124,7 @@ struct qmgrInfo { #if 0 /* NB: needed only for A0 parts */ u_int statusWordOffset; /* status word offset */ - uint32_t statusMask; /* status mask */ + uint32_t statusMask; /* status mask */ uint32_t statusCheckValue; /* status check value */ #endif }; @@ -257,7 +257,7 @@ ixpqmgr_attach(device_t dev) qi->cb = dummyCallback; qi->priority = IX_QMGR_Q_PRIORITY_0; /* default priority */ - /* + /* * There are two interrupt registers, 32 bits each. One * for the lower queues(0-31) and one for the upper * queues(32-63). Therefore need to mod by 32 i.e the @@ -280,17 +280,17 @@ ixpqmgr_attach(device_t dev) if (i < IX_QMGR_MIN_QUEUPP_QID) { /* AQM Q underflow/overflow status reg address, per queue */ qi->qUOStatRegAddr = IX_QMGR_QUEUOSTAT0_OFFSET + - ((i / IX_QMGR_QUEUOSTAT_NUM_QUE_PER_WORD) * + ((i / IX_QMGR_QUEUOSTAT_NUM_QUE_PER_WORD) * sizeof(uint32_t)); /* AQM Q underflow status bit masks for status reg per queue */ - qi->qUflowStatBitMask = + qi->qUflowStatBitMask = (IX_QMGR_UNDERFLOW_BIT_OFFSET + 1) << ((i & (IX_QMGR_QUEUOSTAT_NUM_QUE_PER_WORD - 1)) * (32 / IX_QMGR_QUEUOSTAT_NUM_QUE_PER_WORD)); /* AQM Q overflow status bit masks for status reg, per queue */ - qi->qOflowStatBitMask = + qi->qOflowStatBitMask = (IX_QMGR_OVERFLOW_BIT_OFFSET + 1) << ((i & (IX_QMGR_QUEUOSTAT_NUM_QUE_PER_WORD - 1)) * (32 / IX_QMGR_QUEUOSTAT_NUM_QUE_PER_WORD)); @@ -302,7 +302,7 @@ ixpqmgr_attach(device_t dev) /* AQM Q lower-group (0-31) status register bit offset */ qi->qStatBitsOffset = - (i & (IX_QMGR_QUELOWSTAT_NUM_QUE_PER_WORD - 1)) * + (i & (IX_QMGR_QUELOWSTAT_NUM_QUE_PER_WORD - 1)) * (32 / IX_QMGR_QUELOWSTAT_NUM_QUE_PER_WORD); } else { /* AQM Q upper-group (32-63), only */ qi->qUOStatRegAddr = 0; /* XXX */ @@ -405,7 +405,7 @@ ixpqmgr_qwrite(int qId, uint32_t entry) int qPtrs; /* - * Read the status twice because the status may + * Read the status twice because the status may * not be immediately ready after the write operation */ if ((status & qi->qOflowStatBitMask) || @@ -432,12 +432,12 @@ ixpqmgr_qwrite(int qId, uint32_t entry) DPRINTFn(2, sc->sc_dev, "%s(%u, 0x%x) Q full, no overflow status, qConfig 0x%x\n", __func__, qId, entry, qPtrs); - qPtrs = (qPtrs - (qPtrs >> 7)) & 0x7f; + qPtrs = (qPtrs - (qPtrs >> 7)) & 0x7f; if (qPtrs == 0) { /* - * The queue may be full at the time of the - * snapshot. Next access will check + * The queue may be full at the time of the + * snapshot. Next access will check * the overflow status again. */ qi->qWriteCount = qSize; @@ -460,7 +460,7 @@ ixpqmgr_qread(int qId, uint32_t *entry) *entry = aqm_reg_read(sc, off); /* - * Reset the current read count : next access to the read function + * Reset the current read count : next access to the read function * will force a underflow status check. */ qi->qReadCount = 0; @@ -499,7 +499,7 @@ ixpqmgr_qreadm(int qId, uint32_t n, uint32_t *p) *p = entry; /* - * Reset the current read count : next access to the read function + * Reset the current read count : next access to the read function * will force a underflow status check. */ qi->qReadCount = 0; @@ -667,7 +667,7 @@ ixpqmgr_rebuild(struct ixpqmgr_softc *sc) /* low priority q's */ for (q = 0; q < IX_QMGR_MIN_QUEUPP_QID; q++) { qi = &sc->qinfo[q]; - if (qi->priority == pri) { + if (qi->priority == pri) { /* * Build the priority table bitmask which match the * queues of the first half of the priority table. @@ -712,8 +712,8 @@ ixpqmgr_rebuild(struct ixpqmgr_softc *sc) * 0x00000001 31 * 0x00000000 32 * - * The C version of this function is used as a replacement - * for system not providing the equivalent of the CLZ + * The C version of this function is used as a replacement + * for system not providing the equivalent of the CLZ * assembly language instruction. * * Note that this version is big-endian @@ -819,7 +819,7 @@ aqm_calc_statuscheck(int qId, IxQMgrSourceId srcSel) { struct qmgrInfo *qi = &qinfo[qId]; uint32_t shiftVal; - + if (qId < IX_QMGR_MIN_QUEUPP_QID) { switch (srcSel) { case IX_QMGR_Q_SOURCE_ID_E: @@ -863,7 +863,7 @@ aqm_calc_statuscheck(int qId, IxQMgrSourceId srcSel) /* One nibble of status per queue so need to shift the * check value and mask out to the correct position. */ - shiftVal = (qId % IX_QMGR_QUELOWSTAT_NUM_QUE_PER_WORD) * + shiftVal = (qId % IX_QMGR_QUELOWSTAT_NUM_QUE_PER_WORD) * IX_QMGR_QUELOWSTAT_BITS_PER_Q; /* Calculate the which status word to check from the qId, @@ -970,7 +970,7 @@ aqm_qcfg(struct ixpqmgr_softc *sc, int qId, u_int ne, u_int nf) /* baseAddress, calculated relative to start address */ baseAddress = sc->aqmFreeSramAddress; - + /* base address must be word-aligned */ KASSERT((baseAddress % IX_QMGR_BASE_ADDR_16_WORD_ALIGN) == 0, ("address not word-aligned")); @@ -1007,7 +1007,7 @@ aqm_srcsel_write(struct ixpqmgr_softc *sc, int qId, int sourceId) if (off == IX_QMGR_INT0SRCSELREG0_OFFSET && qId == 0) { /* Queue 0 at INT0SRCSELREG should not corrupt the value bit-3 */ v |= 0x7; - } else { + } else { const uint32_t bpq = 32 / IX_QMGR_INTSRC_NUM_QUE_PER_WORD; uint32_t mask; int qshift; @@ -1065,7 +1065,7 @@ aqm_reset(struct ixpqmgr_softc *sc) IX_QMGR_INT0SRCSELREG_RESET_VALUE); aqm_reg_write(sc, IX_QMGR_INT0SRCSELREG3_OFFSET, IX_QMGR_INT0SRCSELREG_RESET_VALUE); - + /* Reset queue interrupt enable register 0..1 */ aqm_reg_write(sc, IX_QMGR_QUEIEREG0_OFFSET, IX_QMGR_QUEIEREG_RESET_VALUE); diff --git a/sys/arm/xscale/ixp425/ixp425_qmgr.h b/sys/arm/xscale/ixp425/ixp425_qmgr.h index f593fd19f5b..0eb6dc7ed7b 100644 --- a/sys/arm/xscale/ixp425/ixp425_qmgr.h +++ b/sys/arm/xscale/ixp425/ixp425_qmgr.h @@ -32,7 +32,7 @@ /*- * Copyright (c) 2001-2005, Intel Corporation. * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -44,8 +44,8 @@ * 3. Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * - * + * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -148,7 +148,7 @@ (((qId) * (IX_QMGR_QUEACC_SIZE * sizeof(uint32_t)))\ + IX_QMGR_QUEACC0_OFFSET) -/* +/* * Bit location of bit-3 of INT0SRCSELREG0 register to enabled * sticky interrupt register. */ diff --git a/sys/arm/xscale/ixp425/ixp425reg.h b/sys/arm/xscale/ixp425/ixp425reg.h index 570dbc3c980..a0d14728d35 100644 --- a/sys/arm/xscale/ixp425/ixp425reg.h +++ b/sys/arm/xscale/ixp425/ixp425reg.h @@ -65,7 +65,7 @@ * 4000 0000 --------------------------- * SDRAM * 0000 0000 --------------------------- - */ + */ /* * Virtual memory map for the Intel IXP425/IXP435 integrated devices @@ -613,7 +613,7 @@ #define PMNC_EVCNT2_SHIFT 16 #define PMNC_EVCNT3_SHIFT 24 -/* +/* * Queue Manager */ #define IXP425_QMGR_HWBASE 0x60000000UL diff --git a/sys/arm/xscale/ixp425/std.ixp425 b/sys/arm/xscale/ixp425/std.ixp425 index 69cc2a14896..87d254e8c7c 100644 --- a/sys/arm/xscale/ixp425/std.ixp425 +++ b/sys/arm/xscale/ixp425/std.ixp425 @@ -3,4 +3,3 @@ files "../xscale/ixp425/files.ixp425" include "../xscale/std.xscale" cpu CPU_XSCALE_IXP425 -makeoption ARM_BIG_ENDIAN diff --git a/sys/arm/xscale/ixp425/std.ixp435 b/sys/arm/xscale/ixp425/std.ixp435 index 2cc099a451e..a5a0ec7e739 100644 --- a/sys/arm/xscale/ixp425/std.ixp435 +++ b/sys/arm/xscale/ixp425/std.ixp435 @@ -5,4 +5,3 @@ files "../xscale/ixp425/files.ixp425" include "../xscale/std.xscale" cpu CPU_XSCALE_IXP435 cpu CPU_XSCALE_IXP425 -makeoption ARM_BIG_ENDIAN diff --git a/sys/arm/xscale/pxa/if_smc_smi.c b/sys/arm/xscale/pxa/if_smc_smi.c index 1896a0a3f8c..d7350413999 100644 --- a/sys/arm/xscale/pxa/if_smc_smi.c +++ b/sys/arm/xscale/pxa/if_smc_smi.c @@ -37,7 +37,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include #include diff --git a/sys/arm/xscale/pxa/pxa_machdep.c b/sys/arm/xscale/pxa/pxa_machdep.c index d2dc106a27f..d0e3f0caa45 100644 --- a/sys/arm/xscale/pxa/pxa_machdep.c +++ b/sys/arm/xscale/pxa/pxa_machdep.c @@ -40,7 +40,7 @@ * * Machine dependant functions for kernel setup * - * This file needs a lot of work. + * This file needs a lot of work. * * Created : 17/09/94 */ @@ -115,10 +115,6 @@ extern u_int undefined_handler_address; struct pv_addr kernel_pt_table[NUM_KERNEL_PTS]; -extern void *_end; - -extern int *end; - struct pcpu __pcpu; struct pcpu *pcpup = &__pcpu; @@ -126,7 +122,6 @@ struct pcpu *pcpup = &__pcpu; vm_paddr_t phys_avail[PXA2X0_SDRAM_BANKS * 2 + 4]; vm_paddr_t dump_avail[PXA2X0_SDRAM_BANKS * 2 + 4]; -vm_offset_t physical_pages; struct pv_addr systempage; struct pv_addr msgbufpv; @@ -136,14 +131,12 @@ struct pv_addr abtstack; struct pv_addr kernelstack; struct pv_addr minidataclean; -static struct trapframe proc0_tf; - static void pxa_probe_sdram(bus_space_tag_t, bus_space_handle_t, uint32_t *, uint32_t *); /* Static device mappings. */ static const struct pmap_devmap pxa_devmap[] = { - /* + /* * Map the on-board devices up into the KVA region so we don't muck * up user-space. */ @@ -162,7 +155,7 @@ static const struct pmap_devmap pxa_devmap[] = { extern vm_offset_t xscale_cache_clean_addr; void * -initarm(void *arg, void *arg2) +initarm(struct arm_boot_params *abp) { struct pv_addr kernel_l1pt; struct pv_addr dpcpu; @@ -176,9 +169,8 @@ initarm(void *arg, void *arg2) int i, j; uint32_t memsize[PXA2X0_SDRAM_BANKS], memstart[PXA2X0_SDRAM_BANKS]; + lastaddr = parse_boot_param(abp); set_cpufuncs(); - - lastaddr = fake_preload_metadata(); pcpu_init(pcpup, 0, sizeof(struct pcpu)); PCPU_SET(curthread, &thread0); @@ -207,10 +199,9 @@ initarm(void *arg, void *arg2) kernel_pt_table[loop].pv_pa = freemempos + (loop % (PAGE_SIZE / L2_TABLE_SIZE_REAL)) * L2_TABLE_SIZE_REAL; - kernel_pt_table[loop].pv_va = + kernel_pt_table[loop].pv_va = kernel_pt_table[loop].pv_pa + 0x20000000; } - i++; } freemem_pt = freemempos; freemempos = 0xa0100000; @@ -283,7 +274,7 @@ initarm(void *arg, void *arg2) pmap_link_l2pt(l1pagetable, afterkern + i * 0x00100000, &kernel_pt_table[KERNEL_PT_AFKERNEL + i]); } - pmap_map_entry(l1pagetable, afterkern, minidataclean.pv_pa, + pmap_map_entry(l1pagetable, afterkern, minidataclean.pv_pa, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); #ifdef ARM_USE_SMALL_ALLOC @@ -367,13 +358,7 @@ initarm(void *arg, void *arg2) undefined_handler_address = (u_int)undefinedinstruction_bounce; undefined_init(); - proc_linkup(&proc0, &thread0); - thread0.td_kstack = kernelstack.pv_va; - thread0.td_pcb = (struct pcb *) - (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; - thread0.td_pcb->pcb_flags = 0; - thread0.td_frame = &proc0_tf; - pcpup->pc_curpcb = thread0.td_pcb; + init_proc0(kernelstack.pv_va); /* Enable MMU, I-cache, D-cache, write buffer. */ arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL); diff --git a/sys/arm/xscale/pxa/pxareg.h b/sys/arm/xscale/pxa/pxareg.h index bdd70c0d156..34306cde664 100644 --- a/sys/arm/xscale/pxa/pxareg.h +++ b/sys/arm/xscale/pxa/pxareg.h @@ -16,7 +16,7 @@ * must display the following acknowledgement: * This product includes software developed for the NetBSD Project by * Genetec Corporation. - * 4. The name of Genetec Corporation may not be used to endorse or + * 4. The name of Genetec Corporation may not be used to endorse or * promote products derived from this software without specific prior * written permission. * @@ -139,7 +139,7 @@ /* width of interrupt controller */ #define ICU_LEN 32 /* but [0..7,15,16] is not used */ #define ICU_INT_HWMASK 0xffffff00 -#define PXA250_IRQ_MIN 8 /* 0..7 are not used by integrated +#define PXA250_IRQ_MIN 8 /* 0..7 are not used by integrated peripherals */ #define PXA270_IRQ_MIN 0 diff --git a/sys/arm/xscale/std.xscale b/sys/arm/xscale/std.xscale index 48c588f8833..336000b430d 100644 --- a/sys/arm/xscale/std.xscale +++ b/sys/arm/xscale/std.xscale @@ -1,2 +1,3 @@ # $FreeBSD$ +# machine arm armeb options ARM_CACHE_LOCK_ENABLE diff --git a/sys/boot/Makefile.sparc64 b/sys/boot/Makefile.sparc64 index 5723629ba47..1064a267db4 100644 --- a/sys/boot/Makefile.sparc64 +++ b/sys/boot/Makefile.sparc64 @@ -1,3 +1,4 @@ # $FreeBSD$ SUBDIR+= ofw +SUBDIR+= zfs diff --git a/sys/boot/arm/at91/boot0spi/main.c b/sys/boot/arm/at91/boot0spi/main.c index 9f1a2729bef..4d03b26fe0d 100644 --- a/sys/boot/arm/at91/boot0spi/main.c +++ b/sys/boot/arm/at91/boot0spi/main.c @@ -29,31 +29,26 @@ #include "at91rm9200_lowlevel.h" #include "spi_flash.h" -#define LOADER_OFFSET 0 -#define FPGA_OFFSET (15 * FLASH_PAGE_SIZE) -#define OFFSET FPGA_OFFSET +#define OFFSET 0 -int +void main(void) { int len, i, j, off, sec; char *addr = (char *)SDRAM_BASE + (1 << 20); /* download at + 1MB */ char *addr2 = (char *)SDRAM_BASE + (2 << 20); /* readback to + 2MB */ - char *addr3 = (char *)SDRAM_BASE + (3 << 20); /* extra copy at + 3MB */ SPI_InitFlash(); printf("Waiting for data\n"); while ((len = xmodem_rx(addr)) == -1) continue; - // Need extra copy at addr3 - memcpy(addr3, addr, (len + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE * FLASH_PAGE_SIZE); - printf("Writing %u bytes to flash at %u\n", len, OFFSET); + printf("Writing %u bytes at %u\n", len, OFFSET); for (i = 0; i < len; i+= FLASH_PAGE_SIZE) { + off = i + OFFSET; for (j = 0; j < 10; j++) { - off = i + OFFSET; SPI_WriteFlash(off, addr + i, FLASH_PAGE_SIZE); SPI_ReadFlash(off, addr2 + i, FLASH_PAGE_SIZE); - if (p_memcmp(addr3 + i, addr2 + i, FLASH_PAGE_SIZE) == 0) + if (p_memcmp(addr + i, addr2 + i, FLASH_PAGE_SIZE) == 0) break; } if (j >= 10) @@ -64,5 +59,4 @@ main(void) continue; printf("Done\n"); reset(); - return (1); } diff --git a/sys/boot/arm/at91/boot2/boot2.c b/sys/boot/arm/at91/boot2/boot2.c index e585adaf174..c3629a522c7 100644 --- a/sys/boot/arm/at91/boot2/boot2.c +++ b/sys/boot/arm/at91/boot2/boot2.c @@ -86,15 +86,15 @@ static const unsigned char flags[NOPT] = { RBX_VERBOSE }; +unsigned board_id; /* board type to pass to kernel, if set by board_* code */ unsigned dsk_start; static char cmd[512]; static char kname[1024]; static uint32_t opts; -static int dsk_meta; +static uint8_t dsk_meta; static void load(void); static int parse(void); -static int xfsread(ino_t, void *, size_t); static int dskread(void *, unsigned, unsigned); #ifdef FIXUP_BOOT_DRV static void fixup_boot_drv(caddr_t, int, int, int); @@ -110,7 +110,7 @@ static void fixup_boot_drv(caddr_t, int, int, int); #endif static inline int -xfsread(ino_t inode, void *buf, size_t nbyte) +xfsread(ufs_ino_t inode, void *buf, size_t nbyte) { if ((size_t)fsread(inode, buf, nbyte) != nbyte) return -1; @@ -153,7 +153,7 @@ int main(void) { int autoboot, c = 0; - ino_t ino; + ufs_ino_t ino; dmadat = (void *)(0x20000000 + (16 << 20)); board_init(); @@ -198,7 +198,7 @@ load(void) Elf32_Ehdr eh; static Elf32_Phdr ep[2]; caddr_t p; - ino_t ino; + ufs_ino_t ino; uint32_t addr; int i, j; #ifdef FIXUP_BOOT_DRV @@ -241,7 +241,7 @@ load(void) #ifdef FIXUP_BOOT_DRV fixup_boot_drv(staddr, klen, bootslice, bootpart); #endif - ((void(*)(int))addr)(opts & RBX_MASK); + ((void(*)(int, int, int, int))addr)(opts & RBX_MASK, board_id, 0, 0); } static int diff --git a/sys/boot/arm/at91/libat91/Makefile b/sys/boot/arm/at91/libat91/Makefile index 08585fd5780..a7fe96ff0d2 100644 --- a/sys/boot/arm/at91/libat91/Makefile +++ b/sys/boot/arm/at91/libat91/Makefile @@ -2,9 +2,11 @@ .include "${.CURDIR}/../Makefile.inc" +SOC?=at91rm9200 + LIB= at91 INTERNALLIB= -SRCS=at91rm9200_lowlevel.c delay.c eeprom.c emac.c emac_init.c getc.c \ +SRCS=${SOC}_lowlevel.c delay.c eeprom.c emac.c emac_init.c getc.c \ putchar.c printf.c reset.c spi_flash.c xmodem.c \ sd-card.c strcvt.c strlen.c strcmp.c memcpy.c strcpy.c \ memset.c memcmp.c diff --git a/sys/boot/arm/at91/libat91/at91rm9200.h b/sys/boot/arm/at91/libat91/at91rm9200.h index 4de14f28fdc..db767089ded 100644 --- a/sys/boot/arm/at91/libat91/at91rm9200.h +++ b/sys/boot/arm/at91/libat91/at91rm9200.h @@ -41,6 +41,8 @@ #ifndef AT91RM9200_H #define AT91RM9200_H +#define ATMEL_ENV + typedef volatile unsigned int AT91_REG;// Hardware register definition // ***************************************************************************** diff --git a/sys/boot/arm/at91/linker.cfg b/sys/boot/arm/at91/linker.cfg index 8aa09553095..2065ed71936 100644 --- a/sys/boot/arm/at91/linker.cfg +++ b/sys/boot/arm/at91/linker.cfg @@ -31,258 +31,26 @@ SECTIONS .text : { *(.text) - *(.text.*) - *(.stub) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - *(.gnu.linkonce.t.*) - *(.glue_7t) *(.glue_7) } - .interp : { *(.interp) } - .hash : { *(.hash) } - .dynsym : { *(.dynsym) } - .dynstr : { *(.dynstr) } - .gnu.version : { *(.gnu.version) } - .gnu.version_d : { *(.gnu.version_d) } - .gnu.version_r : { *(.gnu.version_r) } - .rel.init : { *(.rel.init) } - .rela.init : { *(.rela.init) } - .rel.text : - { - *(.rel.text) - *(.rel.text.*) - *(.rel.gnu.linkonce.t.*) - } - .rela.text : - { - *(.rela.text) - *(.rela.text.*) - *(.rela.gnu.linkonce.t.*) - } - .rel.fini : { *(.rel.fini) } - .rela.fini : { *(.rela.fini) } - .rel.rodata : - { - *(.rel.rodata) - *(.rel.rodata.*) - *(.rel.gnu.linkonce.r.*) - } - .rela.rodata : - { - *(.rela.rodata) - *(.rela.rodata.*) - *(.rela.gnu.linkonce.r.*) - } - .rel.data : - { - *(.rel.data) - *(.rel.data.*) - *(.rel.gnu.linkonce.d.*) - } - .rela.data : - { - *(.rela.data) - *(.rela.data.*) - *(.rela.gnu.linkonce.d.*) - } - .rel.ctors : { *(.rel.ctors) } - .rela.ctors : { *(.rela.ctors) } - .rel.dtors : { *(.rel.dtors) } - .rela.dtors : { *(.rela.dtors) } - .rel.got : { *(.rel.got) } - .rela.got : { *(.rela.got) } - .rel.sdata : - { - *(.rel.sdata) - *(.rel.sdata.*) - *(.rel.gnu.linkonce.s.*) - } - .rela.sdata : - { - *(.rela.sdata) - *(.rela.sdata.*) - *(.rela.gnu.linkonce.s.*) - } - .rel.sbss : - { - *(.rel.sbss) - *(.rel.sbss.*) - *(.rel.gnu.linkonce.sb.*) - } - .rela.sbss : - { - *(.rela.sbss) - *(.rela.sbss.*) - *(.rel.gnu.linkonce.sb.*) - } - .rel.sdata2 : - { - *(.rel.sdata2) - *(.rel.sdata2.*) - *(.rel.gnu.linkonce.s2.*) - } - .rela.sdata2 : - { - *(.rela.sdata2) - *(.rela.sdata2.*) - *(.rela.gnu.linkonce.s2.*) - } - .rel.sbss2 : - { - *(.rel.sbss2) - *(.rel.sbss2.*) - *(.rel.gnu.linkonce.sb2.*) - } - .rela.sbss2 : - { - *(.rela.sbss2) - *(.rela.sbss2.*) - *(.rela.gnu.linkonce.sb2.*) - } - .rel.bss : - { - *(.rel.bss) - *(.rel.bss.*) - *(.rel.gnu.linkonce.b.*) - } - .rela.bss : - { - *(.rela.bss) - *(.rela.bss.*) - *(.rela.gnu.linkonce.b.*) - } - .rel.plt : { *(.rel.plt) } - .rela.plt : { *(.rela.plt) } - .init : - { - KEEP (*(.init)) - } =0 - .plt : { *(.plt) } - .fini : - { - KEEP (*(.fini)) - } =0 PROVIDE (__etext = .); PROVIDE (_etext = .); PROVIDE (etext = .); - .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) } - .rodata1 : { *(.rodata1) } - .sdata2 : { *(.sdata2) *(.sdata2.*) *(.gnu.linkonce.s2.*) } - .sbss2 : { *(.sbss2) *(.sbss2.*) *(.gnu.linkonce.sb2.*) } .data : { __data_start = . ; *(.data) - *(.data.*) - *(.gnu.linkonce.d.*) - SORT(CONSTRUCTORS) - } - .data1 : { *(.data1) } - . = 0x21200000; - .eh_frame : { KEEP (*(.eh_frame)) } - .gcc_except_table : { *(.gcc_except_table) } - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - /* We don't want to include the .ctor section from - from the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } - .got : { *(.got.plt) *(.got) } - .dynamic : { *(.dynamic) } - /* We want the small data sections together, so single-instruction offsets - can access them all, and initialized data all before uninitialized, so - we can shorten the on-disk segment size. */ - .sdata : - { - *(.sdata) - *(.sdata.*) - *(.gnu.linkonce.s.*) } _edata = .; PROVIDE (edata = .); __bss_start = .; __bss_start__ = .; - .sbss : - { - PROVIDE (__sbss_start = .); - PROVIDE (___sbss_start = .); - *(.dynsbss) - *(.sbss) - *(.sbss.*) - *(.gnu.linkonce.sb.*) - *(.scommon) - PROVIDE (__sbss_end = .); - PROVIDE (___sbss_end = .); - } .bss : { - *(.dynbss) *(.bss) - *(.bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - /* Align here to ensure that the .bss section occupies space up to - _end. Align after .bss to ensure correct alignment even if the - .bss section disappears because there are no input sections. */ . = ALIGN(32 / 8); } . = ALIGN(32 / 8); _end = .; _bss_end__ = . ; __bss_end__ = . ; __end__ = . ; PROVIDE (end = .); - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - /* DWARF debug sections. - Symbols in the DWARF debugging sections are relative to the beginning - of the section so we begin them at 0. */ - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - /* These must appear regardless of . */ } diff --git a/sys/boot/arm/ixp425/boot2/boot2.c b/sys/boot/arm/ixp425/boot2/boot2.c index 3d356f09065..e5f49827394 100644 --- a/sys/boot/arm/ixp425/boot2/boot2.c +++ b/sys/boot/arm/ixp425/boot2/boot2.c @@ -98,7 +98,6 @@ static int disk_layout; static void load(void); static int parse(void); -static int xfsread(ino_t, void *, size_t); static int dskread(void *, unsigned, unsigned); static int drvread(void *, unsigned, unsigned); #ifdef FIXUP_BOOT_DRV @@ -114,7 +113,7 @@ static void fixup_boot_drv(caddr_t, int, int, int); #endif static inline int -xfsread(ino_t inode, void *buf, size_t nbyte) +xfsread(ufs_ino_t inode, void *buf, size_t nbyte) { if ((size_t)fsread(inode, buf, nbyte) != nbyte) return -1; @@ -158,7 +157,7 @@ main(void) { const char *bt; int autoboot, c = 0; - ino_t ino; + ufs_ino_t ino; dmadat = (void *)(0x1c0000); p_memset((char *)dmadat, 0, 32 * 1024); @@ -207,7 +206,7 @@ load(void) Elf32_Ehdr eh; static Elf32_Phdr ep[2]; caddr_t p; - ino_t ino; + ufs_ino_t ino; uint32_t addr; int i, j; #ifdef FIXUP_BOOT_DRV diff --git a/sys/boot/arm/uboot/Makefile b/sys/boot/arm/uboot/Makefile index 906fc871a88..b8a92d6ddf6 100644 --- a/sys/boot/arm/uboot/Makefile +++ b/sys/boot/arm/uboot/Makefile @@ -7,6 +7,9 @@ NEWVERSWHAT= "U-Boot loader" ${MACHINE_ARCH} BINDIR?= /boot INSTALLFLAGS= -b WARNS?= 1 +# Address at which ubldr will be loaded. +# This varies for different boards and SOCs. +UBLDR_LOADADDR?= 0x1000000 # Architecture-specific loader code SRCS= start.S conf.c vers.c @@ -15,6 +18,11 @@ LOADER_DISK_SUPPORT?= yes LOADER_UFS_SUPPORT?= yes LOADER_CD9660_SUPPORT?= no LOADER_EXT2FS_SUPPORT?= no +.if ${MK_NAND} != "no" +LOADER_NANDFS_SUPPORT?= yes +.else +LOADER_NANDFS_SUPPORT?= no +.endif LOADER_NET_SUPPORT?= yes LOADER_NFS_SUPPORT?= yes LOADER_TFTP_SUPPORT?= no @@ -38,6 +46,9 @@ CFLAGS+= -DLOADER_CD9660_SUPPORT .if ${LOADER_EXT2FS_SUPPORT} == "yes" CFLAGS+= -DLOADER_EXT2FS_SUPPORT .endif +.if ${LOADER_NANDFS_SUPPORT} == "yes" +CFLAGS+= -DLOADER_NANDFS_SUPPORT +.endif .if ${LOADER_GZIP_SUPPORT} == "yes" CFLAGS+= -DLOADER_GZIP_SUPPORT .endif @@ -77,7 +88,9 @@ CLEANFILES+= vers.c loader.help CFLAGS+= -ffreestanding -LDFLAGS= -nostdlib -static -T ${.CURDIR}/ldscript.${MACHINE_CPUARCH} +LDFLAGS= -nostdlib -static +LDFLAGS+= -T ldscript.generated +LDFLAGS+= -T ${.CURDIR}/ldscript.${MACHINE_CPUARCH} # Pull in common loader code .PATH: ${.CURDIR}/../../uboot/common @@ -102,6 +115,18 @@ loader.help: help.common help.uboot cat ${.ALLSRC} | \ awk -f ${.CURDIR}/../../common/merge_help.awk > ${.TARGET} +${PROG}: ldscript.generated ${.CURDIR}/ldscript.${MACHINE_CPUARCH} + +ldscript.generated:: + rm -f ldscript.generated.tmp + echo "UBLDR_LOADADDR = ${UBLDR_LOADADDR};" >ldscript.generated.tmp + if diff ldscript.generated ldscript.generated.tmp > /dev/null; then \ + true; \ + else \ + rm -f ldscript.generated; \ + mv ldscript.generated.tmp ldscript.generated; \ + fi + .PATH: ${.CURDIR}/../../forth FILES= loader.help diff --git a/sys/boot/arm/uboot/conf.c b/sys/boot/arm/uboot/conf.c index b7975651310..03dc64125e4 100644 --- a/sys/boot/arm/uboot/conf.c +++ b/sys/boot/arm/uboot/conf.c @@ -56,6 +56,9 @@ struct fs_ops *file_system[] = { #if defined(LOADER_EXT2FS_SUPPORT) &ext2fs_fsops, #endif +#if defined(LOADER_NANDFS_SUPPORT) + &nandfs_fsops, +#endif #if defined(LOADER_NFS_SUPPORT) &nfs_fsops, #endif diff --git a/sys/boot/arm/uboot/ldscript.arm b/sys/boot/arm/uboot/ldscript.arm index db8dc0c109c..b3be1191623 100644 --- a/sys/boot/arm/uboot/ldscript.arm +++ b/sys/boot/arm/uboot/ldscript.arm @@ -5,7 +5,7 @@ ENTRY(_start) SECTIONS { /* Read-only sections, merged into text segment: */ - . = 0x1000000 + SIZEOF_HEADERS; + . = UBLDR_LOADADDR + SIZEOF_HEADERS; .interp : { *(.interp) } .hash : { *(.hash) } .dynsym : { *(.dynsym) } diff --git a/sys/boot/arm/uboot/start.S b/sys/boot/arm/uboot/start.S index c53330cb257..65148c9c977 100644 --- a/sys/boot/arm/uboot/start.S +++ b/sys/boot/arm/uboot/start.S @@ -49,27 +49,20 @@ _start: * syscall() */ ENTRY(syscall) - /* Save caller's lr */ + /* Save caller's lr and r8 */ ldr ip, =saved_regs str lr, [ip, #4] - /* Save loader's r8 */ - ldr ip, =saved_regs str r8, [ip, #8] - /* Restore U-Boot's r8 */ - ldr ip, =saved_regs ldr r8, [ip, #0] /* Call into U-Boot */ ldr lr, =return_from_syscall ldr ip, =syscall_ptr ldr pc, [ip] - return_from_syscall: - /* Restore loader's r8 */ + /* Restore loader's r8 and lr */ ldr ip, =saved_regs ldr r8, [ip, #8] - /* Restore caller's lr */ - ldr ip, =saved_regs ldr lr, [ip, #4] /* Return to caller */ mov pc, lr diff --git a/sys/boot/arm/uboot/version b/sys/boot/arm/uboot/version index 38c7eb60c0b..486c4125cc0 100644 --- a/sys/boot/arm/uboot/version +++ b/sys/boot/arm/uboot/version @@ -3,6 +3,7 @@ $FreeBSD$ NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this file is important. Make sure the current version number is on line 6. +1.2: Extended with NAND FS support. 1.1: Flattened Device Tree blob support. 1.0: Added storage support. Booting from HDD, USB, etc. is now possible. 0.5: Initial U-Boot/arm version (netbooting only). diff --git a/sys/boot/common/boot.c b/sys/boot/common/boot.c index c6ab6812da7..8ea06dd577d 100644 --- a/sys/boot/common/boot.c +++ b/sys/boot/common/boot.c @@ -311,12 +311,12 @@ getrootmount(char *rootdev) if (getenv("vfs.root.mountfrom") != NULL) return(0); + error = 1; sprintf(lbuf, "%s/etc/fstab", rootdev); if ((fd = open(lbuf, O_RDONLY)) < 0) - return(1); + goto notfound; /* loop reading lines from /etc/fstab What was that about sscanf again? */ - error = 1; while (fgetstr(lbuf, sizeof(lbuf), fd) >= 0) { if ((lbuf[0] == 0) || (lbuf[0] == '#')) continue; @@ -377,6 +377,20 @@ getrootmount(char *rootdev) break; } close(fd); + +notfound: + if (error) { + const char *currdev; + + currdev = getenv("currdev"); + if (currdev != NULL && strncmp("zfs:", currdev, 4) == 0) { + cp = strdup(currdev); + cp[strlen(cp) - 1] = '\0'; + setenv("vfs.root.mountfrom", cp, 0); + error = 0; + } + } + return(error); } diff --git a/sys/boot/common/bootstrap.h b/sys/boot/common/bootstrap.h index d8b45514cfd..f6eab3d0829 100644 --- a/sys/boot/common/bootstrap.h +++ b/sys/boot/common/bootstrap.h @@ -26,6 +26,9 @@ * $FreeBSD$ */ +#ifndef _BOOTSTRAP_H_ +#define _BOOTSTRAP_H_ + #include #include #include @@ -314,6 +317,9 @@ struct arch_switch #else void (*arch_loadseg)(void *eh, void *ph, uint64_t delta); #endif + + /* Probe ZFS pool(s), if needed. */ + void (*arch_zfs_probe)(void); }; extern struct arch_switch archsw; @@ -323,3 +329,11 @@ void delay(int delay); void dev_cleanup(void); time_t time(time_t *tloc); + +#ifndef CTASSERT /* Allow lint to override */ +#define CTASSERT(x) _CTASSERT(x, __LINE__) +#define _CTASSERT(x, y) __CTASSERT(x, y) +#define __CTASSERT(x, y) typedef char __assert ## y[(x) ? 1 : -1] +#endif + +#endif /* !_BOOTSTRAP_H_ */ diff --git a/sys/boot/common/load_elf.c b/sys/boot/common/load_elf.c index bf095bb10dc..019307e4402 100644 --- a/sys/boot/common/load_elf.c +++ b/sys/boot/common/load_elf.c @@ -612,7 +612,7 @@ __elfN(parse_modmetadata)(struct preloaded_file *fp, elf_file_t ef) Elf_Addr v, p, p_stop; if (__elfN(lookup_symbol)(fp, ef, "__start_set_modmetadata_set", &sym) != 0) - return ENOENT; + return 0; p = sym.st_value + ef->off; if (__elfN(lookup_symbol)(fp, ef, "__stop_set_modmetadata_set", &sym) != 0) return ENOENT; diff --git a/sys/boot/common/load_elf_obj.c b/sys/boot/common/load_elf_obj.c index 54d9b103f64..2c8e184c457 100644 --- a/sys/boot/common/load_elf_obj.c +++ b/sys/boot/common/load_elf_obj.c @@ -369,7 +369,7 @@ __elfN(obj_parse_modmetadata)(struct preloaded_file *fp, elf_file_t ef) if (__elfN(obj_lookup_set)(fp, ef, "modmetadata_set", &p, &p_stop, &modcnt) != 0) - return ENOENT; + return 0; modcnt = 0; while (p < p_stop) { diff --git a/sys/boot/common/loader.8 b/sys/boot/common/loader.8 index 7e30bd314ea..36f260c0d27 100644 --- a/sys/boot/common/loader.8 +++ b/sys/boot/common/loader.8 @@ -423,7 +423,7 @@ variable take effect immediately. Defines the base i/o port used to access console UART (i386 and amd64 only). If the variable is not set, its assumed value is 0x3F8, which -corresponds to PC port COM1, unless overriden by +corresponds to PC port COM1, unless overridden by .Va BOOT_COMCONSOLE_PORT variable during the compilation of .Nm . diff --git a/sys/boot/common/ufsread.c b/sys/boot/common/ufsread.c index 18259571d13..c02010f5284 100644 --- a/sys/boot/common/ufsread.c +++ b/sys/boot/common/ufsread.c @@ -58,6 +58,8 @@ __FBSDID("$FreeBSD$"); #define cgbase(fs, c) ((ufs2_daddr_t)((fs)->fs_fpg * (c))) #endif +typedef uint32_t ufs_ino_t; + /* * We use 4k `virtual' blocks for filesystem data, whatever the actual * filesystem block size. FFS blocks are always a multiple of 4k. @@ -85,14 +87,14 @@ struct dmadat { }; static struct dmadat *dmadat; -static ino_t lookup(const char *); -static ssize_t fsread(ino_t, void *, size_t); +static ufs_ino_t lookup(const char *); +static ssize_t fsread(ufs_ino_t, void *, size_t); static uint8_t ls, dsk_meta; static uint32_t fs_off; static __inline uint8_t -fsfind(const char *name, ino_t * ino) +fsfind(const char *name, ufs_ino_t * ino) { static char buf[DEV_BSIZE]; struct direct *d; @@ -116,12 +118,12 @@ fsfind(const char *name, ino_t * ino) return 0; } -static ino_t +static ufs_ino_t lookup(const char *path) { static char name[MAXNAMLEN + 1]; const char *s; - ino_t ino; + ufs_ino_t ino; ssize_t n; uint8_t dt; @@ -163,7 +165,7 @@ static int sblock_try[] = SBLOCKSEARCH; #endif static ssize_t -fsread(ino_t inode, void *buf, size_t nbyte) +fsread(ufs_ino_t inode, void *buf, size_t nbyte) { #ifndef UFS2_ONLY static struct ufs1_dinode dp1; @@ -173,7 +175,7 @@ fsread(ino_t inode, void *buf, size_t nbyte) static struct ufs2_dinode dp2; #endif static struct fs fs; - static ino_t inomap; + static ufs_ino_t inomap; char *blkbuf; void *indbuf; char *s; diff --git a/sys/boot/fdt/dts/bindings-localbus.txt b/sys/boot/fdt/dts/bindings-localbus.txt new file mode 100644 index 00000000000..d960fefcf75 --- /dev/null +++ b/sys/boot/fdt/dts/bindings-localbus.txt @@ -0,0 +1,83 @@ +$FreeBSD$ + +Marvell Device bus (localbus) configuration. +============================================ + +1. Properties for localbus nodes + +1.1 ranges + +Property: ranges + +Value type: encoded as arbitrary number of localbus + nodes specifiers. + +Description: ranges property defines values used for mapping devices + connected to localbus, in Marvell devices it is used also for + setting decoding windows. + + a) child node address-cells: + - first cell: number of bank (chip select) + - second cell: (Marvell devices) Target ID for decoding + windows setup + + b) parent node address cells: + - address offset: used with parent's node base address to + specify base address of mapped device + + c) child node size-cells: + - size: defines amount of memory that should be reserved for + device + +1.2 bank-count + +Property: bank-count + +Value type: + +Description: The bank_count property defines maximum number of banks on + localbus node. Bank is most often interpreted as device chip + select, but may also describe another device (e.g. SPI flash). + +1.3 Example + + localbus@0 { + #address-cells = <2>; + #size-cells = <1>; + compatible = "mrvl,lbc"; + bank-count = <5>; + + /* This reflects CPU decode windows setup. */ + ranges = <0x0 0x2f 0xb2200000 0x00100000 + 0x1 0x3e 0xb2100000 0x00100000 + 0x2 0x3d 0xb0000000 0x02000000 + 0x3 0x3b 0xb2000000 0x00100000>; + }; + +2. Properties for localbus consumer nodes: + +2.1 reg + +Property: reg + +Value type: + +Description: A standard property required for localbus child nodes. Defines + the device memory region. + + a) first cell: number of bank (chip select) + + b) address offset: used with address offset from parent's ranges + for corresponding bank to specify base address of + the device + + c) size: defines size of the device memory region + +2.2 Example + + nor@0,0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "cfi-flash"; + reg = <0x0 0x0 0x00100000>; + }; diff --git a/sys/boot/fdt/dts/db78100.dts b/sys/boot/fdt/dts/db78100.dts index caebaf18e8b..8a9e91c0203 100644 --- a/sys/boot/fdt/dts/db78100.dts +++ b/sys/boot/fdt/dts/db78100.dts @@ -69,25 +69,23 @@ reg = <0x0 0x20000000>; // 512M at 0x0 }; - localbus@f1000000 { + localbus@0 { #address-cells = <2>; #size-cells = <1>; compatible = "mrvl,lbc"; - win-count = <14>; + bank-count = <5>; /* This reflects CPU decode windows setup. */ - ranges = <0x0 0x0f 0xf9300000 0x00100000 - 0x1 0x1e 0xfa000000 0x00100000 - 0x2 0x1d 0xfa100000 0x02000000 - 0x3 0x1b 0xfc100000 0x00000400>; + ranges = <0x0 0x2f 0xf9300000 0x00100000 + 0x1 0x3e 0xf9400000 0x00100000 + 0x2 0x3d 0xf9500000 0x02000000 + 0x3 0x3b 0xfb500000 0x00100000>; nor@0,0 { #address-cells = <1>; #size-cells = <1>; compatible = "cfi-flash"; reg = <0x0 0x0 0x00100000>; - bank-width = <2>; - device-width = <1>; }; led@1,0 { @@ -102,16 +100,13 @@ #size-cells = <1>; compatible = "cfi-flash"; reg = <0x2 0x0 0x02000000>; - bank-width = <2>; - device-width = <1>; }; nand@3,0 { #address-cells = <1>; #size-cells = <1>; + compatible = "mrvl,nfc"; reg = <0x3 0x0 0x00100000>; - bank-width = <2>; - device-width = <1>; }; }; diff --git a/sys/boot/fdt/dts/db88f6281.dts b/sys/boot/fdt/dts/db88f6281.dts index fd4cdad3547..55a27fc3033 100644 --- a/sys/boot/fdt/dts/db88f6281.dts +++ b/sys/boot/fdt/dts/db88f6281.dts @@ -72,48 +72,33 @@ reg = <0x0 0x20000000>; // 512M at 0x0 }; - localbus@f1000000 { + localbus@0 { #address-cells = <2>; #size-cells = <1>; compatible = "mrvl,lbc"; + bank-count = <3>; /* This reflects CPU decode windows setup. */ - ranges = <0x0 0x0f 0xf9300000 0x00100000 - 0x1 0x1e 0xfa000000 0x00100000 - 0x2 0x1d 0xfa100000 0x02000000 - 0x3 0x1b 0xfc100000 0x00000400>; + ranges = <0x0 0x2f 0xf9300000 0x00100000>; - nor@0,0 { + nand@0,0 { #address-cells = <1>; #size-cells = <1>; - compatible = "cfi-flash"; + compatible = "mrvl,nfc"; reg = <0x0 0x0 0x00100000>; bank-width = <2>; device-width = <1>; - }; - led@1,0 { - #address-cells = <1>; - #size-cells = <1>; - compatible = "led"; - reg = <0x1 0x0 0x00100000>; - }; + slice@0 { + reg = <0x0 0x200000>; + label = "u-boot"; + read-only; + }; - nor@2,0 { - #address-cells = <1>; - #size-cells = <1>; - compatible = "cfi-flash"; - reg = <0x2 0x0 0x02000000>; - bank-width = <2>; - device-width = <1>; - }; - - nand@3,0 { - #address-cells = <1>; - #size-cells = <1>; - reg = <0x3 0x0 0x00100000>; - bank-width = <2>; - device-width = <1>; + slice@200000 { + reg = <0x200000 0x7e00000>; + label = "root"; + }; }; }; @@ -305,4 +290,9 @@ 0x0 0x00100000>; }; }; + + chosen { + stdin = "serial0"; + stdout = "serial0"; + }; }; diff --git a/sys/boot/fdt/dts/p2041rdb.dts b/sys/boot/fdt/dts/p2041rdb.dts new file mode 100644 index 00000000000..aa5af072e76 --- /dev/null +++ b/sys/boot/fdt/dts/p2041rdb.dts @@ -0,0 +1,490 @@ +/* + * P2041RDB Device Tree Source + * + * Copyright 2011 Freescale Semiconductor Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Freescale Semiconductor nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* $FreeBSD$ */ + +/include/ "p2041si.dtsi" + +/ { + model = "fsl,P2041RDB"; + compatible = "fsl,P2041RDB"; + #address-cells = <2>; + #size-cells = <2>; + interrupt-parent = <&mpic>; + + aliases { + phy_rgmii_0 = &phy_rgmii_0; + phy_rgmii_1 = &phy_rgmii_1; + phy_sgmii_2 = &phy_sgmii_2; + phy_sgmii_3 = &phy_sgmii_3; + phy_sgmii_4 = &phy_sgmii_4; + phy_sgmii_1c = &phy_sgmii_1c; + phy_sgmii_1d = &phy_sgmii_1d; + phy_sgmii_1e = &phy_sgmii_1e; + phy_sgmii_1f = &phy_sgmii_1f; + phy_xgmii_2 = &phy_xgmii_2; + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x00000000 0x00000000 0x80000000>; + }; + + dcsr: dcsr@f00000000 { + ranges = <0x00000000 0xf 0x00000000 0x01008000>; + }; + + bman-portals@ff4000000 { + bman-portal@0 { + cpu-handle = <&cpu0>; + }; + bman-portal@4000 { + cpu-handle = <&cpu1>; + }; + bman-portal@8000 { + cpu-handle = <&cpu2>; + }; + bman-portal@c000 { + cpu-handle = <&cpu3>; + }; + bman-portal@10000 { + }; + bman-portal@14000 { + }; + bman-portal@18000 { + }; + bman-portal@1c000 { + }; + bman-portal@20000 { + }; + bman-portal@24000 { + }; + + buffer-pool@0 { + compatible = "fsl,p2041-bpool", "fsl,bpool"; + fsl,bpid = <0>; + fsl,bpool-cfg = <0 0x100 0 1 0 0x100>; + }; + }; + + qman-portals@ff4200000 { + qportal0: qman-portal@0 { + cpu-handle = <&cpu0>; + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal1: qman-portal@4000 { + cpu-handle = <&cpu1>; + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal2: qman-portal@8000 { + cpu-handle = <&cpu2>; + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal3: qman-portal@c000 { + cpu-handle = <&cpu3>; + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal4: qman-portal@10000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal5: qman-portal@14000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal6: qman-portal@18000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal7: qman-portal@1c000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal8: qman-portal@20000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal9: qman-portal@24000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + }; + + soc: soc@ffe000000 { + spi@110000 { + flash@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "spansion,s25sl12801"; + reg = <0>; + spi-max-frequency = <40000000>; /* input clock */ + partition@u-boot { + label = "u-boot"; + reg = <0x00000000 0x00100000>; + read-only; + }; + partition@kernel { + label = "kernel"; + reg = <0x00100000 0x00500000>; + read-only; + }; + partition@dtb { + label = "dtb"; + reg = <0x00600000 0x00100000>; + read-only; + }; + partition@fs { + label = "file system"; + reg = <0x00700000 0x00900000>; + }; + }; + }; + + i2c@118000 { + lm75b@48 { + compatible = "nxp,lm75a"; + reg = <0x48>; + }; + eeprom@50 { + compatible = "at24,24c256"; + reg = <0x50>; + }; + rtc@68 { + compatible = "pericom,pt7c4338"; + reg = <0x68>; + }; + }; + + i2c@118100 { + eeprom@50 { + compatible = "at24,24c256"; + reg = <0x50>; + }; + }; + + usb1: usb@211000 { + dr_mode = "host"; + }; + + pme: pme@316000 { + /* Commented out, use default allocation */ + /* fsl,pme-pdsr = <0x0 0x23000000 0x0 0x01000000>; */ + /* fsl,pme-sre = <0x0 0x24000000 0x0 0x00a00000>; */ + }; + + qman: qman@318000 { + /* Commented out, use default allocation */ + /* fsl,qman-fqd = <0x0 0x20000000 0x0 0x01000000>; */ + /* fsl,qman-pfdr = <0x0 0x21000000 0x0 0x01000000>; */ + }; + + bman: bman@31a000 { + /* Same as fsl,qman-*, use default allocation */ + /* fsl,bman-fbpr = <0x0 0x22000000 0x0 0x01000000>; */ + }; + + fman0: fman@400000 { + enet0: ethernet@e0000 { + tbi-handle = <&tbi0>; + phy-handle = <&phy_sgmii_2>; + phy-connection-type = "sgmii"; + }; + + mdio0: mdio@e1120 { + tbi0: tbi-phy@8 { + reg = <0x8>; + device_type = "tbi-phy"; + }; + + phy_rgmii_0: ethernet-phy@0 { + reg = <0x0>; + }; + phy_rgmii_1: ethernet-phy@1 { + reg = <0x1>; + }; + phy_sgmii_2: ethernet-phy@2 { + reg = <0x2>; + }; + phy_sgmii_3: ethernet-phy@3 { + reg = <0x3>; + }; + phy_sgmii_4: ethernet-phy@4 { + reg = <0x4>; + }; + phy_sgmii_1c: ethernet-phy@1c { + reg = <0x1c>; + }; + phy_sgmii_1d: ethernet-phy@1d { + reg = <0x1d>; + }; + phy_sgmii_1e: ethernet-phy@1e { + reg = <0x1e>; + }; + phy_sgmii_1f: ethernet-phy@1f { + reg = <0x1f>; + }; + }; + + enet1: ethernet@e2000 { + tbi-handle = <&tbi1>; + phy-handle = <&phy_sgmii_3>; + phy-connection-type = "sgmii"; + }; + + mdio@e3120 { + tbi1: tbi-phy@8 { + reg = <8>; + device_type = "tbi-phy"; + }; + }; + + enet2: ethernet@e4000 { + tbi-handle = <&tbi2>; + phy-handle = <&phy_sgmii_4>; + phy-connection-type = "sgmii"; + }; + + mdio@e5120 { + tbi2: tbi-phy@8 { + reg = <8>; + device_type = "tbi-phy"; + }; + }; + + enet3: ethernet@e6000 { + tbi-handle = <&tbi3>; + phy-handle = <&phy_rgmii_1>; + phy-connection-type = "rgmii"; + }; + + mdio@e7120 { + tbi3: tbi-phy@8 { + reg = <8>; + device_type = "tbi-phy"; + }; + }; + + enet4: ethernet@e8000 { + tbi-handle = <&tbi4>; + phy-handle = <&phy_rgmii_0>; + phy-connection-type = "rgmii"; + }; + + mdio@e9120 { + tbi4: tbi-phy@8 { + reg = <8>; + device_type = "tbi-phy"; + }; + }; + + enet5: ethernet@f0000 { + /* + * phy-handle will be updated by U-Boot to + * reflect the actual slot the XAUI card is in. + */ + phy-handle = <&phy_xgmii_2>; + phy-connection-type = "xgmii"; + }; + + mdio@f1000 { + /* XAUI card in slot 2 */ + phy_xgmii_2: ethernet-phy@0 { + reg = <0x0>; + }; + }; + }; + }; + + rapidio@ffe0c0000 { + reg = <0xf 0xfe0c0000 0 0x11000>; + + port1 { + ranges = <0 0 0xc 0x20000000 0 0x10000000>; + }; + port2 { + ranges = <0 0 0xc 0x30000000 0 0x10000000>; + }; + }; + + localbus@ffe124000 { + reg = <0xf 0xfe124000 0 0x1000>; + ranges = <0 0 0xf 0xb8000000 0x04000000>; + + flash@0,0 { + compatible = "cfi-flash"; + /* + * Map 64Mb of 128MB NOR flash memory. Since highest + * line of address of NOR flash memory are set by + * FPGA, memory are divided into two pages equal to + * 64MB. One of the pages can be accessed at once. + */ + reg = <0 0 0x04000000>; + bank-width = <2>; + device-width = <2>; + }; + }; + + pci0: pcie@ffe200000 { + reg = <0xf 0xfe200000 0 0x1000>; + ranges = <0x02000000 0 0x80000000 0x0 0x80000000 0x0 0x10000000 + 0x01000000 0 0x00000000 0x0 0xff000000 0x0 0x00010000>; + pcie@0 { + ranges = <0x02000000 0 0x80000000 + 0x02000000 0 0x80000000 + 0 0x10000000 + + 0x01000000 0 0x00000000 + 0x01000000 0 0xff000000 + 0 0x00010000>; + }; + }; + + pci1: pcie@ffe201000 { + reg = <0xf 0xfe201000 0 0x1000>; + ranges = <0x02000000 0x0 0x90000000 0x0 0x90000000 0x0 0x10000000 + 0x01000000 0x0 0x00000000 0x0 0xff010000 0x0 0x00010000>; + pcie@0 { + ranges = <0x02000000 0 0x90000000 + 0x02000000 0 0x90000000 + 0 0x10000000 + + 0x01000000 0 0x00000000 + 0x01000000 0 0xff010000 + 0 0x00010000>; + }; + }; + + pci2: pcie@ffe202000 { + reg = <0xf 0xfe202000 0 0x1000>; + ranges = <0x02000000 0 0xa0000000 0x0 0xa0000000 0 0x10000000 + 0x01000000 0 0x00000000 0x0 0xff020000 0 0x00010000>; + pcie@0 { + ranges = <0x02000000 0 0xa0000000 + 0x02000000 0 0xa0000000 + 0 0x10000000 + + 0x01000000 0 0x00000000 + 0x01000000 0 0xff020000 + 0 0x00010000>; + }; + }; + + fsl,dpaa { + compatible = "fsl,p2041-dpaa", "fsl,dpaa"; + + ethernet@0 { + compatible = "fsl,p2041-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet0>; + status = "okay"; + }; + ethernet@1 { + compatible = "fsl,p2041-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet1>; + status = "okay"; + }; + ethernet@2 { + compatible = "fsl,p2041-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet2>; + status = "okay"; + }; + ethernet@3 { + compatible = "fsl,p2041-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet3>; + status = "okay"; + }; + ethernet@4 { + compatible = "fsl,p2041-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet4>; + status = "okay"; + }; + ethernet@5 { + compatible = "fsl,p2041-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet5>; + status = "okay"; + }; + }; + + chosen { + stdin = "serial0"; + stdout = "serial0"; + }; +}; diff --git a/sys/boot/fdt/dts/p2041si.dtsi b/sys/boot/fdt/dts/p2041si.dtsi new file mode 100644 index 00000000000..9db01fa62ca --- /dev/null +++ b/sys/boot/fdt/dts/p2041si.dtsi @@ -0,0 +1,1296 @@ +/* + * P2041 Silicon Device Tree Source + * + * Copyright 2011 Freescale Semiconductor Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Freescale Semiconductor nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* $FreeBSD$ */ + +/dts-v1/; + +/ { + compatible = "fsl,P2041"; + #address-cells = <2>; + #size-cells = <2>; + interrupt-parent = <&mpic>; + + aliases { + ccsr = &soc; + dcsr = &dcsr; + + ethernet0 = &enet0; + ethernet1 = &enet1; + ethernet2 = &enet2; + ethernet3 = &enet3; + ethernet4 = &enet4; + ethernet5 = &enet5; + serial0 = &serial0; + serial1 = &serial1; + serial2 = &serial2; + serial3 = &serial3; + pci0 = &pci0; + pci1 = &pci1; + pci2 = &pci2; + usb0 = &usb0; + usb1 = &usb1; + dma0 = &dma0; + dma1 = &dma1; + bman = &bman; + qman = &qman; + pme = &pme; + rman = &rman; + sdhc = &sdhc; + msi0 = &msi0; + msi1 = &msi1; + msi2 = &msi2; + + crypto = &crypto; + sec_jr0 = &sec_jr0; + sec_jr1 = &sec_jr1; + sec_jr2 = &sec_jr2; + sec_jr3 = &sec_jr3; + rtic_a = &rtic_a; + rtic_b = &rtic_b; + rtic_c = &rtic_c; + rtic_d = &rtic_d; + sec_mon = &sec_mon; + + fman0 = &fman0; + fman0_oh0 = &fman0_oh0; + fman0_oh1 = &fman0_oh1; + fman0_oh2 = &fman0_oh2; + fman0_oh3 = &fman0_oh3; + fman0_oh4 = &fman0_oh4; + fman0_oh5 = &fman0_oh5; + fman0_oh6 = &fman0_oh6; + fman0_rx0 = &fman0_rx0; + fman0_rx1 = &fman0_rx1; + fman0_rx2 = &fman0_rx2; + fman0_rx3 = &fman0_rx3; + fman0_rx4 = &fman0_rx4; + fman0_rx5 = &fman0_rx5; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu0: PowerPC,e500mc@0 { + device_type = "cpu"; + reg = <0>; + bus-frequency = <749999996>; + next-level-cache = <&L2_0>; + L2_0: l2-cache { + next-level-cache = <&cpc>; + }; + }; + cpu1: PowerPC,e500mc@1 { + device_type = "cpu"; + reg = <1>; + next-level-cache = <&L2_1>; + L2_1: l2-cache { + next-level-cache = <&cpc>; + }; + }; + cpu2: PowerPC,e500mc@2 { + device_type = "cpu"; + reg = <2>; + next-level-cache = <&L2_2>; + L2_2: l2-cache { + next-level-cache = <&cpc>; + }; + }; + cpu3: PowerPC,e500mc@3 { + device_type = "cpu"; + reg = <3>; + next-level-cache = <&L2_3>; + L2_3: l2-cache { + next-level-cache = <&cpc>; + }; + }; + }; + + dcsr: dcsr@f00000000 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "fsl,dcsr", "simple-bus"; + + dcsr-epu@0 { + compatible = "fsl,dcsr-epu"; + interrupts = <52 2 0 0 + 84 2 0 0 + 85 2 0 0>; + interrupt-parent = <&mpic>; + reg = <0x0 0x1000>; + }; + dcsr-npc { + compatible = "fsl,dcsr-npc"; + reg = <0x1000 0x1000 0x1000000 0x8000>; + }; + dcsr-nxc@2000 { + compatible = "fsl,dcsr-nxc"; + reg = <0x2000 0x1000>; + }; + dcsr-corenet { + compatible = "fsl,dcsr-corenet"; + reg = <0x8000 0x1000 0xB0000 0x1000>; + }; + dcsr-dpaa@9000 { + compatible = "fsl,p2041-dcsr-dpaa", "fsl,dcsr-dpaa"; + reg = <0x9000 0x1000>; + }; + dcsr-ocn@11000 { + compatible = "fsl,p2041-dcsr-ocn", "fsl,dcsr-ocn"; + reg = <0x11000 0x1000>; + }; + dcsr-ddr@12000 { + compatible = "fsl,dcsr-ddr"; + dev-handle = <&ddr>; + reg = <0x12000 0x1000>; + }; + dcsr-nal@18000 { + compatible = "fsl,p2041-dcsr-nal", "fsl,dcsr-nal"; + reg = <0x18000 0x1000>; + }; + dcsr-rcpm@22000 { + compatible = "fsl,p2041-dcsr-rcpm", "fsl,dcsr-rcpm"; + reg = <0x22000 0x1000>; + }; + dcsr-cpu-sb-proxy@40000 { + compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy"; + cpu-handle = <&cpu0>; + reg = <0x40000 0x1000>; + }; + dcsr-cpu-sb-proxy@41000 { + compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy"; + cpu-handle = <&cpu1>; + reg = <0x41000 0x1000>; + }; + dcsr-cpu-sb-proxy@42000 { + compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy"; + cpu-handle = <&cpu2>; + reg = <0x42000 0x1000>; + }; + dcsr-cpu-sb-proxy@43000 { + compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy"; + cpu-handle = <&cpu3>; + reg = <0x43000 0x1000>; + }; + }; + + bman-portals@ff4000000 { + #address-cells = <0x1>; + #size-cells = <0x1>; + compatible = "bman-portals"; + ranges = <0x0 0xf 0xfde00000 0x200000>; + bman-portal@0 { + cell-index = <0x0>; + compatible = "fsl,p2041-bman-portal", "fsl,bman-portal"; + reg = <0x0 0x4000 0x100000 0x1000>; + interrupts = <105 2 0 0>; + }; + bman-portal@4000 { + cell-index = <0x1>; + compatible = "fsl,p2041-bman-portal", "fsl,bman-portal"; + reg = <0x4000 0x4000 0x101000 0x1000>; + interrupts = <107 2 0 0>; + }; + bman-portal@8000 { + cell-index = <2>; + compatible = "fsl,p2041-bman-portal", "fsl,bman-portal"; + reg = <0x8000 0x4000 0x102000 0x1000>; + interrupts = <109 2 0 0>; + }; + bman-portal@c000 { + cell-index = <0x3>; + compatible = "fsl,p2041-bman-portal", "fsl,bman-portal"; + reg = <0xc000 0x4000 0x103000 0x1000>; + interrupts = <111 2 0 0>; + }; + bman-portal@10000 { + cell-index = <0x4>; + compatible = "fsl,p2041-bman-portal", "fsl,bman-portal"; + reg = <0x10000 0x4000 0x104000 0x1000>; + interrupts = <113 2 0 0>; + }; + bman-portal@14000 { + cell-index = <0x5>; + compatible = "fsl,p2041-bman-portal", "fsl,bman-portal"; + reg = <0x14000 0x4000 0x105000 0x1000>; + interrupts = <115 2 0 0>; + }; + bman-portal@18000 { + cell-index = <0x6>; + compatible = "fsl,p2041-bman-portal", "fsl,bman-portal"; + reg = <0x18000 0x4000 0x106000 0x1000>; + interrupts = <117 2 0 0>; + }; + bman-portal@1c000 { + cell-index = <0x7>; + compatible = "fsl,p2041-bman-portal", "fsl,bman-portal"; + reg = <0x1c000 0x4000 0x107000 0x1000>; + interrupts = <119 2 0 0>; + }; + bman-portal@20000 { + cell-index = <0x8>; + compatible = "fsl,p2041-bman-portal", "fsl,bman-portal"; + reg = <0x20000 0x4000 0x108000 0x1000>; + interrupts = <121 2 0 0>; + }; + bman-portal@24000 { + cell-index = <0x9>; + compatible = "fsl,p2041-bman-portal", "fsl,bman-portal"; + reg = <0x24000 0x4000 0x109000 0x1000>; + interrupts = <123 2 0 0>; + }; + + buffer-pool@0 { + compatible = "fsl,p2041-bpool", "fsl,bpool"; + fsl,bpid = <0>; + fsl,bpool-cfg = <0 0x100 0 1 0 0x100>; + }; + }; + + qman-portals@ff4200000 { + #address-cells = <0x1>; + #size-cells = <0x1>; + compatible = "qman-portals"; + ranges = <0x0 0xf 0xfdc00000 0x200000>; + qportal0: qman-portal@0 { + cell-index = <0x0>; + compatible = "fsl,p2041-qman-portal", "fsl,qman-portal"; + reg = <0x0 0x4000 0x100000 0x1000>; + interrupts = <104 0x2 0 0>; + fsl,qman-channel-id = <0x0>; + }; + + qportal1: qman-portal@4000 { + cell-index = <0x1>; + compatible = "fsl,p2041-qman-portal", "fsl,qman-portal"; + reg = <0x4000 0x4000 0x101000 0x1000>; + interrupts = <106 0x2 0 0>; + fsl,qman-channel-id = <0x1>; + }; + + qportal2: qman-portal@8000 { + cell-index = <0x2>; + compatible = "fsl,p2041-qman-portal", "fsl,qman-portal"; + reg = <0x8000 0x4000 0x102000 0x1000>; + interrupts = <108 0x2 0 0>; + fsl,qman-channel-id = <0x2>; + }; + + qportal3: qman-portal@c000 { + cell-index = <0x3>; + compatible = "fsl,p2041-qman-portal", "fsl,qman-portal"; + reg = <0xc000 0x4000 0x103000 0x1000>; + interrupts = <110 0x2 0 0>; + fsl,qman-channel-id = <0x3>; + }; + + qportal4: qman-portal@10000 { + cell-index = <0x4>; + compatible = "fsl,p2041-qman-portal", "fsl,qman-portal"; + reg = <0x10000 0x4000 0x104000 0x1000>; + interrupts = <112 0x2 0 0>; + fsl,qman-channel-id = <0x4>; + }; + + qportal5: qman-portal@14000 { + cell-index = <0x5>; + compatible = "fsl,p2041-qman-portal", "fsl,qman-portal"; + reg = <0x14000 0x4000 0x105000 0x1000>; + interrupts = <114 0x2 0 0>; + fsl,qman-channel-id = <0x5>; + }; + + qportal6: qman-portal@18000 { + cell-index = <0x6>; + compatible = "fsl,p2041-qman-portal", "fsl,qman-portal"; + reg = <0x18000 0x4000 0x106000 0x1000>; + interrupts = <116 0x2 0 0>; + fsl,qman-channel-id = <0x6>; + }; + + qportal7: qman-portal@1c000 { + cell-index = <0x7>; + compatible = "fsl,p2041-qman-portal", "fsl,qman-portal"; + reg = <0x1c000 0x4000 0x107000 0x1000>; + interrupts = <118 0x2 0 0>; + fsl,qman-channel-id = <0x7>; + }; + + qportal8: qman-portal@20000 { + cell-index = <0x8>; + compatible = "fsl,p2041-qman-portal", "fsl,qman-portal"; + reg = <0x20000 0x4000 0x108000 0x1000>; + interrupts = <120 0x2 0 0>; + fsl,qman-channel-id = <0x8>; + }; + + qportal9: qman-portal@24000 { + cell-index = <0x9>; + compatible = "fsl,p2041-qman-portal", "fsl,qman-portal"; + reg = <0x24000 0x4000 0x109000 0x1000>; + interrupts = <122 0x2 0 0>; + fsl,qman-channel-id = <0x9>; + }; + + qpool1: qman-pool@1 { + cell-index = <1>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x21>; + }; + + qpool2: qman-pool@2 { + cell-index = <2>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x22>; + }; + + qpool3: qman-pool@3 { + cell-index = <3>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x23>; + }; + + qpool4: qman-pool@4 { + cell-index = <4>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x24>; + }; + + qpool5: qman-pool@5 { + cell-index = <5>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x25>; + }; + + qpool6: qman-pool@6 { + cell-index = <6>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x26>; + }; + + qpool7: qman-pool@7 { + cell-index = <7>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x27>; + }; + + qpool8: qman-pool@8 { + cell-index = <8>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x28>; + }; + + qpool9: qman-pool@9 { + cell-index = <9>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x29>; + }; + + qpool10: qman-pool@10 { + cell-index = <10>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2a>; + }; + + qpool11: qman-pool@11 { + cell-index = <11>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2b>; + }; + + qpool12: qman-pool@12 { + cell-index = <12>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2c>; + }; + + qpool13: qman-pool@13 { + cell-index = <13>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2d>; + }; + + qpool14: qman-pool@14 { + cell-index = <14>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2e>; + }; + + qpool15: qman-pool@15 { + cell-index = <15>; + compatible = "fsl,p2041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2f>; + }; + }; + + soc: soc@ffe000000 { + #address-cells = <1>; + #size-cells = <1>; + device_type = "soc"; + compatible = "simple-bus"; + + bus-frequency = <0>; // Filled out by kernel. + + ranges = <0x00000000 0xf 0xfe000000 0x1000000>; + reg = <0xf 0xfe000000 0 0x00001000>; + + soc-sram-error { + compatible = "fsl,soc-sram-error"; + interrupts = <16 2 1 29>; + }; + + corenet-law@0 { + compatible = "fsl,corenet-law"; + reg = <0x0 0x1000>; + fsl,num-laws = <32>; + }; + + ddr: memory-controller@8000 { + compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller"; + reg = <0x8000 0x1000>; + interrupts = <16 2 1 23>; + }; + + cpc: l3-cache-controller@10000 { + compatible = "fsl,p2041-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache"; + reg = <0x10000 0x1000>; + interrupts = <16 2 1 27>; + }; + + corenet-cf@18000 { + compatible = "fsl,corenet-cf"; + reg = <0x18000 0x1000>; + interrupts = <16 2 1 31>; + fsl,ccf-num-csdids = <32>; + fsl,ccf-num-snoopids = <32>; + }; + + iommu@20000 { + compatible = "fsl,pamu-v1.0", "fsl,pamu"; + reg = <0x20000 0x4000>; + interrupts = < + 24 2 0 0 + 16 2 1 30>; + }; + + mpic: pic@40000 { + clock-frequency = <0>; + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <4>; + reg = <0x40000 0x40000>; + compatible = "fsl,mpic", "chrp,open-pic"; + device_type = "open-pic"; + }; + + msi0: msi@41600 { + compatible = "fsl,mpic-msi"; + reg = <0x41600 0x200>; + msi-available-ranges = <0 0x100>; + interrupts = < + 0xe0 0 0 0 + 0xe1 0 0 0 + 0xe2 0 0 0 + 0xe3 0 0 0 + 0xe4 0 0 0 + 0xe5 0 0 0 + 0xe6 0 0 0 + 0xe7 0 0 0>; + }; + + msi1: msi@41800 { + compatible = "fsl,mpic-msi"; + reg = <0x41800 0x200>; + msi-available-ranges = <0 0x100>; + interrupts = < + 0xe8 0 0 0 + 0xe9 0 0 0 + 0xea 0 0 0 + 0xeb 0 0 0 + 0xec 0 0 0 + 0xed 0 0 0 + 0xee 0 0 0 + 0xef 0 0 0>; + }; + + msi2: msi@41a00 { + compatible = "fsl,mpic-msi"; + reg = <0x41a00 0x200>; + msi-available-ranges = <0 0x100>; + interrupts = < + 0xf0 0 0 0 + 0xf1 0 0 0 + 0xf2 0 0 0 + 0xf3 0 0 0 + 0xf4 0 0 0 + 0xf5 0 0 0 + 0xf6 0 0 0 + 0xf7 0 0 0>; + }; + + guts: global-utilities@e0000 { + compatible = "fsl,qoriq-device-config-1.0"; + reg = <0xe0000 0xe00>; + fsl,has-rstcr; + #sleep-cells = <1>; + fsl,liodn-bits = <12>; + }; + + pins: global-utilities@e0e00 { + compatible = "fsl,qoriq-pin-control-1.0"; + reg = <0xe0e00 0x200>; + #sleep-cells = <2>; + }; + + clockgen: global-utilities@e1000 { + compatible = "fsl,p2041-clockgen", "fsl,qoriq-clockgen-1.0"; + reg = <0xe1000 0x1000>; + clock-frequency = <0>; + }; + + rcpm: global-utilities@e2000 { + compatible = "fsl,qoriq-rcpm-1.0"; + reg = <0xe2000 0x1000>; + #sleep-cells = <1>; + }; + + sfp: sfp@e8000 { + compatible = "fsl,p2041-sfp", "fsl,qoriq-sfp-1.0"; + reg = <0xe8000 0x1000>; + }; + + serdes: serdes@ea000 { + compatible = "fsl,p2041-serdes"; + reg = <0xea000 0x1000>; + }; + + dma0: dma@100300 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "fsl,p2041-dma", "fsl,eloplus-dma"; + reg = <0x100300 0x4>; + ranges = <0x0 0x100100 0x200>; + cell-index = <0>; + dma-channel@0 { + compatible = "fsl,p2041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x0 0x80>; + cell-index = <0>; + interrupts = <28 2 0 0>; + }; + dma-channel@80 { + compatible = "fsl,p2041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x80 0x80>; + cell-index = <1>; + interrupts = <29 2 0 0>; + }; + dma-channel@100 { + compatible = "fsl,p2041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x100 0x80>; + cell-index = <2>; + interrupts = <30 2 0 0>; + }; + dma-channel@180 { + compatible = "fsl,p2041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x180 0x80>; + cell-index = <3>; + interrupts = <31 2 0 0>; + }; + }; + + dma1: dma@101300 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "fsl,p2041-dma", "fsl,eloplus-dma"; + reg = <0x101300 0x4>; + ranges = <0x0 0x101100 0x200>; + cell-index = <1>; + dma-channel@0 { + compatible = "fsl,p2041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x0 0x80>; + cell-index = <0>; + interrupts = <32 2 0 0>; + }; + dma-channel@80 { + compatible = "fsl,p2041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x80 0x80>; + cell-index = <1>; + interrupts = <33 2 0 0>; + }; + dma-channel@100 { + compatible = "fsl,p2041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x100 0x80>; + cell-index = <2>; + interrupts = <34 2 0 0>; + }; + dma-channel@180 { + compatible = "fsl,p2041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x180 0x80>; + cell-index = <3>; + interrupts = <35 2 0 0>; + }; + }; + + spi@110000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,p2041-espi", "fsl,mpc8536-espi"; + reg = <0x110000 0x1000>; + interrupts = <53 0x2 0 0>; + fsl,espi-num-chipselects = <4>; + }; + + sdhc: sdhc@114000 { + compatible = "fsl,p2041-esdhc", "fsl,esdhc"; + reg = <0x114000 0x1000>; + interrupts = <48 2 0 0>; + sdhci,auto-cmd12; + clock-frequency = <0>; + }; + + i2c@118000 { + #address-cells = <1>; + #size-cells = <0>; + cell-index = <0>; + compatible = "fsl-i2c"; + reg = <0x118000 0x100>; + interrupts = <38 2 0 0>; + dfsrr; + }; + + i2c@118100 { + #address-cells = <1>; + #size-cells = <0>; + cell-index = <1>; + compatible = "fsl-i2c"; + reg = <0x118100 0x100>; + interrupts = <38 2 0 0>; + dfsrr; + }; + + i2c@119000 { + #address-cells = <1>; + #size-cells = <0>; + cell-index = <2>; + compatible = "fsl-i2c"; + reg = <0x119000 0x100>; + interrupts = <39 2 0 0>; + dfsrr; + }; + + i2c@119100 { + #address-cells = <1>; + #size-cells = <0>; + cell-index = <3>; + compatible = "fsl-i2c"; + reg = <0x119100 0x100>; + interrupts = <39 2 0 0>; + dfsrr; + }; + + serial0: serial@11c500 { + cell-index = <0>; + device_type = "serial"; + compatible = "ns16550"; + reg = <0x11c500 0x100>; + clock-frequency = <0>; + interrupts = <36 2 0 0>; + }; + + serial1: serial@11c600 { + cell-index = <1>; + device_type = "serial"; + compatible = "ns16550"; + reg = <0x11c600 0x100>; + clock-frequency = <0>; + interrupts = <36 2 0 0>; + }; + + serial2: serial@11d500 { + cell-index = <2>; + device_type = "serial"; + compatible = "ns16550"; + reg = <0x11d500 0x100>; + clock-frequency = <0>; + interrupts = <37 2 0 0>; + }; + + serial3: serial@11d600 { + cell-index = <3>; + device_type = "serial"; + compatible = "ns16550"; + reg = <0x11d600 0x100>; + clock-frequency = <0>; + interrupts = <37 2 0 0>; + }; + + gpio0: gpio@130000 { + compatible = "fsl,p2041-gpio", "fsl,qoriq-gpio"; + reg = <0x130000 0x1000>; + interrupts = <55 2 0 0>; + #gpio-cells = <2>; + gpio-controller; + }; + + rman: rman@1e0000 { + compatible = "fsl,rman"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0x1e0000 0x20000>; + reg = <0x1e0000 0x20000>; + interrupts = <16 2 1 11>; /* err_irq */ + fsl,qman-channels-id = <0x62 0x63>; + + inbound-block@0 { + compatible = "fsl,rman-inbound-block"; + reg = <0x0 0x800>; + }; + global-cfg@b00 { + compatible = "fsl,rman-global-cfg"; + reg = <0xb00 0x500>; + }; + inbound-block@1000 { + compatible = "fsl,rman-inbound-block"; + reg = <0x1000 0x800>; + }; + inbound-block@2000 { + compatible = "fsl,rman-inbound-block"; + reg = <0x2000 0x800>; + }; + inbound-block@3000 { + compatible = "fsl,rman-inbound-block"; + reg = <0x3000 0x800>; + }; + }; + + usb0: usb@210000 { + compatible = "fsl,p2041-usb2-mph", + "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; + reg = <0x210000 0x1000>; + #address-cells = <1>; + #size-cells = <0>; + interrupts = <44 0x2 0 0>; + phy_type = "utmi"; + port0; + }; + + usb1: usb@211000 { + compatible = "fsl,p2041-usb2-dr", + "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; + reg = <0x211000 0x1000>; + #address-cells = <1>; + #size-cells = <0>; + interrupts = <45 0x2 0 0>; + phy_type = "utmi"; + }; + + sata@220000 { + compatible = "fsl,p2041-sata", "fsl,pq-sata-v2"; + reg = <0x220000 0x1000>; + interrupts = <68 0x2 0 0>; + }; + + sata@221000 { + compatible = "fsl,p2041-sata", "fsl,pq-sata-v2"; + reg = <0x221000 0x1000>; + interrupts = <69 0x2 0 0>; + }; + + crypto: crypto@300000 { + compatible = "fsl,sec-v4.2", "fsl,sec-v4.0"; + #address-cells = <1>; + #size-cells = <1>; + reg = <0x300000 0x10000>; + ranges = <0 0x300000 0x10000>; + interrupts = <92 2 0 0>; + + sec_jr0: jr@1000 { + compatible = "fsl,sec-v4.2-job-ring", + "fsl,sec-v4.0-job-ring"; + reg = <0x1000 0x1000>; + interrupts = <88 2 0 0>; + }; + + sec_jr1: jr@2000 { + compatible = "fsl,sec-v4.2-job-ring", + "fsl,sec-v4.0-job-ring"; + reg = <0x2000 0x1000>; + interrupts = <89 2 0 0>; + }; + + sec_jr2: jr@3000 { + compatible = "fsl,sec-v4.2-job-ring", + "fsl,sec-v4.0-job-ring"; + reg = <0x3000 0x1000>; + interrupts = <90 2 0 0>; + }; + + sec_jr3: jr@4000 { + compatible = "fsl,sec-v4.2-job-ring", + "fsl,sec-v4.0-job-ring"; + reg = <0x4000 0x1000>; + interrupts = <91 2 0 0>; + }; + + rtic@6000 { + compatible = "fsl,sec-v4.2-rtic", + "fsl,sec-v4.0-rtic"; + #address-cells = <1>; + #size-cells = <1>; + reg = <0x6000 0x100>; + ranges = <0x0 0x6100 0xe00>; + + rtic_a: rtic-a@0 { + compatible = "fsl,sec-v4.2-rtic-memory", + "fsl,sec-v4.0-rtic-memory"; + reg = <0x00 0x20 0x100 0x80>; + }; + + rtic_b: rtic-b@20 { + compatible = "fsl,sec-v4.2-rtic-memory", + "fsl,sec-v4.0-rtic-memory"; + reg = <0x20 0x20 0x200 0x80>; + }; + + rtic_c: rtic-c@40 { + compatible = "fsl,sec-v4.2-rtic-memory", + "fsl,sec-v4.0-rtic-memory"; + reg = <0x40 0x20 0x300 0x80>; + }; + + rtic_d: rtic-d@60 { + compatible = "fsl,sec-v4.2-rtic-memory", + "fsl,sec-v4.0-rtic-memory"; + reg = <0x60 0x20 0x500 0x80>; + }; + }; + }; + + sec_mon: sec_mon@314000 { + compatible = "fsl,sec-v4.2-mon", "fsl,sec-v4.0-mon"; + reg = <0x314000 0x1000>; + interrupts = <93 2 0 0>; + }; + + pme: pme@316000 { + compatible = "fsl,pme"; + reg = <0x316000 0x10000>; + /* fsl,pme-pdsr = <0x0 0x23000000 0x0 0x01000000>; */ + /* fsl,pme-sre = <0x0 0x24000000 0x0 0x00a00000>; */ + interrupts = <16 2 1 5>; + }; + + qman: qman@318000 { + compatible = "fsl,p2041-qman", "fsl,qman"; + reg = <0x318000 0x1000>; + interrupts = <16 2 1 3>; + /* Commented out, use default allocation */ + /* fsl,qman-fqd = <0x0 0x20000000 0x0 0x01000000>; */ + /* fsl,qman-pfdr = <0x0 0x21000000 0x0 0x01000000>; */ + }; + + bman: bman@31a000 { + compatible = "fsl,p2041-bman", "fsl,bman"; + reg = <0x31a000 0x1000>; + interrupts = <16 2 1 2>; + /* Same as fsl,qman-*, use default allocation */ + /* fsl,bman-fbpr = <0x0 0x22000000 0x0 0x01000000>; */ + }; + + fman0: fman@400000 { + #address-cells = <1>; + #size-cells = <1>; + cell-index = <0>; + compatible = "fsl,p2041-fman", "fsl,fman", "simple-bus"; + ranges = <0 0x400000 0x100000>; + reg = <0x400000 0x100000>; + clock-frequency = <0>; + interrupts = < + 96 2 0 0 + 16 2 1 1>; + + cc@0 { + compatible = "fsl,p2041-fman-cc", "fsl,fman-cc"; + }; + + parser@c7000 { + compatible = "fsl,p2041-fman-parser", "fsl,fman-parser"; + reg = <0xc7000 0x1000>; + }; + + keygen@c1000 { + compatible = "fsl,p2041-fman-keygen", "fsl,fman-keygen"; + reg = <0xc1000 0x1000>; + }; + + policer@c0000 { + compatible = "fsl,p2041-fman-policer", "fsl,fman-policer"; + reg = <0xc0000 0x1000>; + }; + + muram@0 { + compatible = "fsl,p2041-fman-muram", "fsl,fman-muram"; + reg = <0x0 0x28000>; + }; + + bmi@80000 { + compatible = "fsl,p2041-fman-bmi", "fsl,fman-bmi"; + reg = <0x80000 0x400>; + }; + + qmi@80400 { + compatible = "fsl,p2041-fman-qmi", "fsl,fman-qmi"; + reg = <0x80400 0x400>; + }; + + fman0_rx0: port@88000 { + cell-index = <0>; + compatible = "fsl,p2041-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x88000 0x1000>; + }; + fman0_rx1: port@89000 { + cell-index = <1>; + compatible = "fsl,p2041-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x89000 0x1000>; + }; + fman0_rx2: port@8a000 { + cell-index = <2>; + compatible = "fsl,p2041-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x8a000 0x1000>; + }; + fman0_rx3: port@8b000 { + cell-index = <3>; + compatible = "fsl,p2041-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x8b000 0x1000>; + }; + fman0_rx4: port@8c000 { + cell-index = <4>; + compatible = "fsl,p2041-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x8c000 0x1000>; + }; + fman0_rx5: port@90000 { + cell-index = <0>; + compatible = "fsl,p2041-fman-port-10g-rx", "fsl,fman-port-10g-rx"; + reg = <0x90000 0x1000>; + }; + + fman0_tx5: port@b0000 { + cell-index = <0>; + compatible = "fsl,p2041-fman-port-10g-tx", "fsl,fman-port-10g-tx"; + reg = <0xb0000 0x1000>; + fsl,qman-channel-id = <0x40>; + }; + fman0_tx0: port@a8000 { + cell-index = <0>; + compatible = "fsl,p2041-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xa8000 0x1000>; + fsl,qman-channel-id = <0x41>; + }; + fman0_tx1: port@a9000 { + cell-index = <1>; + compatible = "fsl,p2041-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xa9000 0x1000>; + fsl,qman-channel-id = <0x42>; + }; + fman0_tx2: port@aa000 { + cell-index = <2>; + compatible = "fsl,p2041-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xaa000 0x1000>; + fsl,qman-channel-id = <0x43>; + }; + fman0_tx3: port@ab000 { + cell-index = <3>; + compatible = "fsl,p2041-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xab000 0x1000>; + fsl,qman-channel-id = <0x44>; + }; + fman0_tx4: port@ac000 { + cell-index = <4>; + compatible = "fsl,p2041-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xac000 0x1000>; + fsl,qman-channel-id = <0x45>; + }; + + fman0_oh0: port@81000 { + cell-index = <0>; + compatible = "fsl,p2041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x81000 0x1000>; + fsl,qman-channel-id = <0x46>; + }; + fman0_oh1: port@82000 { + cell-index = <1>; + compatible = "fsl,p2041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x82000 0x1000>; + fsl,qman-channel-id = <0x47>; + }; + fman0_oh2: port@83000 { + cell-index = <2>; + compatible = "fsl,p2041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x83000 0x1000>; + fsl,qman-channel-id = <0x48>; + }; + fman0_oh3: port@84000 { + cell-index = <3>; + compatible = "fsl,p2041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x84000 0x1000>; + fsl,qman-channel-id = <0x49>; + }; + fman0_oh4: port@85000 { + cell-index = <4>; + compatible = "fsl,p2041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x85000 0x1000>; + fsl,qman-channel-id = <0x4a>; + }; + fman0_oh5: port@86000 { + cell-index = <5>; + compatible = "fsl,p2041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x86000 0x1000>; + fsl,qman-channel-id = <0x4b>; + }; + fman0_oh6: port@87000 { + cell-index = <6>; + compatible = "fsl,p2041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x87000 0x1000>; + }; + + enet0: ethernet@e0000 { + cell-index = <0>; + compatible = "fsl,p2041-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe0000 0x1000>; + fsl,port-handles = <&fman0_rx0 &fman0_tx0>; + }; + + mdio0: mdio@e1120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-mdio"; + reg = <0xe1120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet1: ethernet@e2000 { + cell-index = <1>; + compatible = "fsl,p2041-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe2000 0x1000>; + fsl,port-handles = <&fman0_rx1 &fman0_tx1>; + }; + + mdio@e3120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe3120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet2: ethernet@e4000 { + cell-index = <2>; + compatible = "fsl,p2041-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe4000 0x1000>; + fsl,port-handles = <&fman0_rx2 &fman0_tx2>; + }; + + mdio@e5120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe5120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet3: ethernet@e6000 { + cell-index = <3>; + compatible = "fsl,p2041-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe6000 0x1000>; + fsl,port-handles = <&fman0_rx3 &fman0_tx3>; + }; + + mdio@e7120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe7120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet4: ethernet@e8000 { + cell-index = <4>; + compatible = "fsl,p2041-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe8000 0x1000>; + fsl,port-handles = <&fman0_rx4 &fman0_tx4>; + }; + + mdio@e9120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe9120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet5: ethernet@f0000 { + cell-index = <0>; + compatible = "fsl,p2041-fman-10g-mac", "fsl,fman-10g-mac"; + reg = <0xf0000 0x1000>; + fsl,port-handles = <&fman0_rx5 &fman0_tx5>; + }; + + mdio@f1000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-xmdio"; + reg = <0xf1000 0x1000>; + interrupts = <100 1 0 0>; + }; + }; + }; + + rapidio@ffe0c0000 { + compatible = "fsl,srio"; + interrupts = <16 2 1 11>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + + port1 { + #address-cells = <2>; + #size-cells = <2>; + cell-index = <1>; + }; + + port2 { + #address-cells = <2>; + #size-cells = <2>; + cell-index = <2>; + }; + }; + + localbus@ffe124000 { + compatible = "fsl,p2041-elbc", "fsl,elbc", "simple-bus"; + interrupts = <25 2 0 0>; + #address-cells = <2>; + #size-cells = <1>; + }; + + pci0: pcie@ffe200000 { + compatible = "fsl,p2041-pcie", "fsl,qoriq-pcie-v2.2"; + device_type = "pci"; + status = "disabled"; + #size-cells = <2>; + #address-cells = <3>; + bus-range = <0x0 0xff>; + clock-frequency = <33333333>; + fsl,msi = <&msi0>; + interrupts = <16 2 1 15>; + pcie@0 { + reg = <0 0 0 0 0>; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + device_type = "pci"; + interrupts = <16 2 1 15>; + interrupt-map-mask = <0xf800 0 0 7>; + interrupt-map = < + /* IDSEL 0x0 */ + 0000 0 0 1 &mpic 40 1 0 0 + 0000 0 0 2 &mpic 1 1 0 0 + 0000 0 0 3 &mpic 2 1 0 0 + 0000 0 0 4 &mpic 3 1 0 0 + >; + }; + }; + + pci1: pcie@ffe201000 { + compatible = "fsl,p2041-pcie", "fsl,qoriq-pcie-v2.2"; + device_type = "pci"; + status = "okay"; + #size-cells = <2>; + #address-cells = <3>; + bus-range = <0 0xff>; + clock-frequency = <33333333>; + fsl,msi = <&msi1>; + interrupts = <16 2 1 14>; + pcie@0 { + reg = <0 0 0 0 0>; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + device_type = "pci"; + interrupts = <16 2 1 14>; + interrupt-map-mask = <0xf800 0 0 7>; + interrupt-map = < + /* IDSEL 0x0 */ + 0000 0 0 1 &mpic 41 1 0 0 + 0000 0 0 2 &mpic 5 1 0 0 + 0000 0 0 3 &mpic 6 1 0 0 + 0000 0 0 4 &mpic 7 1 0 0 + >; + }; + }; + + pci2: pcie@ffe202000 { + compatible = "fsl,p2041-pcie", "fsl,qoriq-pcie-v2.2"; + device_type = "pci"; + status = "disabled"; + #size-cells = <2>; + #address-cells = <3>; + bus-range = <0x0 0xff>; + clock-frequency = <33333333>; + fsl,msi = <&msi2>; + interrupts = <16 2 1 13>; + pcie@0 { + reg = <0 0 0 0 0>; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + device_type = "pci"; + interrupts = <16 2 1 13>; + interrupt-map-mask = <0xf800 0 0 7>; + interrupt-map = < + /* IDSEL 0x0 */ + 0000 0 0 1 &mpic 42 1 0 0 + 0000 0 0 2 &mpic 9 1 0 0 + 0000 0 0 3 &mpic 10 1 0 0 + 0000 0 0 4 &mpic 11 1 0 0 + >; + }; + }; +}; diff --git a/sys/boot/fdt/dts/p3041ds.dts b/sys/boot/fdt/dts/p3041ds.dts index 01875d95a0b..70787e43276 100644 --- a/sys/boot/fdt/dts/p3041ds.dts +++ b/sys/boot/fdt/dts/p3041ds.dts @@ -33,7 +33,7 @@ */ /* $FreeBSD$ */ -/dts-v1/; +/include/ "p3041si.dtsi" / { model = "fsl,P3041DS"; @@ -43,305 +43,155 @@ interrupt-parent = <&mpic>; aliases { - ccsr = &soc; - - serial0 = &serial0; - serial1 = &serial1; - serial2 = &serial2; - serial3 = &serial3; - pci0 = &pci0; - pci1 = &pci1; - pci2 = &pci2; - pci3 = &pci3; - usb0 = &usb0; - usb1 = &usb1; - dma0 = &dma0; - dma1 = &dma1; - sdhc = &sdhc; - msi0 = &msi0; - msi1 = &msi1; - msi2 = &msi2; - - crypto = &crypto; - sec_jr0 = &sec_jr0; - sec_jr1 = &sec_jr1; - sec_jr2 = &sec_jr2; - sec_jr3 = &sec_jr3; - rtic_a = &rtic_a; - rtic_b = &rtic_b; - rtic_c = &rtic_c; - rtic_d = &rtic_d; - sec_mon = &sec_mon; - }; - - cpus { - #address-cells = <1>; - #size-cells = <0>; - - cpu0: PowerPC,e500mc@0 { - device_type = "cpu"; - reg = <0>; - next-level-cache = <&L2_0>; - L2_0: l2-cache { - next-level-cache = <&cpc>; - }; - }; - cpu1: PowerPC,e500mc@1 { - device_type = "cpu"; - reg = <1>; - next-level-cache = <&L2_1>; - L2_1: l2-cache { - next-level-cache = <&cpc>; - }; - }; - cpu2: PowerPC,e500mc@2 { - device_type = "cpu"; - reg = <2>; - next-level-cache = <&L2_2>; - L2_2: l2-cache { - next-level-cache = <&cpc>; - }; - }; - cpu3: PowerPC,e500mc@3 { - device_type = "cpu"; - reg = <3>; - next-level-cache = <&L2_3>; - L2_3: l2-cache { - next-level-cache = <&cpc>; - }; - }; + phy_rgmii_0 = &phy_rgmii_0; + phy_rgmii_1 = &phy_rgmii_1; + phy_sgmii_1c = &phy_sgmii_1c; + phy_sgmii_1d = &phy_sgmii_1d; + phy_sgmii_1e = &phy_sgmii_1e; + phy_sgmii_1f = &phy_sgmii_1f; + phy_xgmii_1 = &phy_xgmii_1; + phy_xgmii_2 = &phy_xgmii_2; + emi1_rgmii = &hydra_mdio_rgmii; + emi1_sgmii = &hydra_mdio_sgmii; + emi2_xgmii = &hydra_mdio_xgmii; }; memory { device_type = "memory"; + reg = <0x00000000 0x00000000 0x00000000 0x80000000>; + }; + + dcsr: dcsr@f00000000 { + ranges = <0x00000000 0xf 0x00000000 0x01008000>; + }; + + bman-portals@ff4000000 { + bman-portal@0 { + cpu-handle = <&cpu0>; + }; + bman-portal@4000 { + cpu-handle = <&cpu1>; + }; + bman-portal@8000 { + cpu-handle = <&cpu2>; + }; + bman-portal@c000 { + cpu-handle = <&cpu3>; + }; + bman-portal@10000 { + }; + bman-portal@14000 { + }; + bman-portal@18000 { + }; + bman-portal@1c000 { + }; + bman-portal@20000 { + }; + bman-portal@24000 { + }; + + buffer-pool@0 { + compatible = "fsl,p3041-bpool", "fsl,bpool"; + fsl,bpid = <0>; + fsl,bpool-cfg = <0 0x100 0 1 0 0x100>; + }; + }; + + qman-portals@ff4200000 { + qportal0: qman-portal@0 { + cpu-handle = <&cpu0>; + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal1: qman-portal@4000 { + cpu-handle = <&cpu1>; + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal2: qman-portal@8000 { + cpu-handle = <&cpu2>; + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal3: qman-portal@c000 { + cpu-handle = <&cpu3>; + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal4: qman-portal@10000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal5: qman-portal@14000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal6: qman-portal@18000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal7: qman-portal@1c000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal8: qman-portal@20000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal9: qman-portal@24000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; }; soc: soc@ffe000000 { - #address-cells = <1>; - #size-cells = <1>; - device_type = "soc"; - compatible = "simple-bus"; - ranges = <0x00000000 0xf 0xfe000000 0x1000000>; - reg = <0xf 0xfe000000 0 0x00001000>; - - soc-sram-error { - compatible = "fsl,soc-sram-error"; - interrupts = <16 2 1 29>; - }; - - corenet-law@0 { - compatible = "fsl,corenet-law"; - reg = <0x0 0x1000>; - fsl,num-laws = <32>; - }; - - memory-controller@8000 { - compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller"; - reg = <0x8000 0x1000>; - interrupts = <16 2 1 23>; - }; - - cpc: l3-cache-controller@10000 { - compatible = "fsl,p3041-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache"; - reg = <0x10000 0x1000>; - interrupts = <16 2 1 27>; - }; - - corenet-cf@18000 { - compatible = "fsl,corenet-cf"; - reg = <0x18000 0x1000>; - interrupts = <16 2 1 31>; - fsl,ccf-num-csdids = <32>; - fsl,ccf-num-snoopids = <32>; - }; - - iommu@20000 { - compatible = "fsl,pamu-v1.0", "fsl,pamu"; - reg = <0x20000 0x4000>; - interrupts = < - 24 2 0 0 - 16 2 1 30>; - }; - - mpic: pic@40000 { - clock-frequency = <0>; - interrupt-controller; - #address-cells = <0>; - #interrupt-cells = <4>; - reg = <0x40000 0x40000>; - compatible = "fsl,mpic", "chrp,open-pic"; - device_type = "open-pic"; - }; - - msi0: msi@41600 { - compatible = "fsl,mpic-msi"; - reg = <0x41600 0x200>; - msi-available-ranges = <0 0x100>; - interrupts = < - 0xe0 0 0 0 - 0xe1 0 0 0 - 0xe2 0 0 0 - 0xe3 0 0 0 - 0xe4 0 0 0 - 0xe5 0 0 0 - 0xe6 0 0 0 - 0xe7 0 0 0>; - }; - - msi1: msi@41800 { - compatible = "fsl,mpic-msi"; - reg = <0x41800 0x200>; - msi-available-ranges = <0 0x100>; - interrupts = < - 0xe8 0 0 0 - 0xe9 0 0 0 - 0xea 0 0 0 - 0xeb 0 0 0 - 0xec 0 0 0 - 0xed 0 0 0 - 0xee 0 0 0 - 0xef 0 0 0>; - }; - - msi2: msi@41a00 { - compatible = "fsl,mpic-msi"; - reg = <0x41a00 0x200>; - msi-available-ranges = <0 0x100>; - interrupts = < - 0xf0 0 0 0 - 0xf1 0 0 0 - 0xf2 0 0 0 - 0xf3 0 0 0 - 0xf4 0 0 0 - 0xf5 0 0 0 - 0xf6 0 0 0 - 0xf7 0 0 0>; - }; - - guts: global-utilities@e0000 { - compatible = "fsl,qoriq-device-config-1.0"; - reg = <0xe0000 0xe00>; - fsl,has-rstcr; - #sleep-cells = <1>; - fsl,liodn-bits = <12>; - }; - - pins: global-utilities@e0e00 { - compatible = "fsl,qoriq-pin-control-1.0"; - reg = <0xe0e00 0x200>; - #sleep-cells = <2>; - }; - - clockgen: global-utilities@e1000 { - compatible = "fsl,p3041-clockgen", "fsl,qoriq-clockgen-1.0"; - reg = <0xe1000 0x1000>; - clock-frequency = <0>; - }; - - rcpm: global-utilities@e2000 { - compatible = "fsl,qoriq-rcpm-1.0"; - reg = <0xe2000 0x1000>; - #sleep-cells = <1>; - }; - - sfp: sfp@e8000 { - compatible = "fsl,p3041-sfp", "fsl,qoriq-sfp-1.0"; - reg = <0xe8000 0x1000>; - }; - - serdes: serdes@ea000 { - compatible = "fsl,p3041-serdes"; - reg = <0xea000 0x1000>; - }; - - dma0: dma@100300 { - #address-cells = <1>; - #size-cells = <1>; - compatible = "fsl,p3041-dma", "fsl,eloplus-dma"; - reg = <0x100300 0x4>; - ranges = <0x0 0x100100 0x200>; - cell-index = <0>; - dma-channel@0 { - compatible = "fsl,p3041-dma-channel", - "fsl,eloplus-dma-channel"; - reg = <0x0 0x80>; - cell-index = <0>; - interrupts = <28 2 0 0>; - }; - dma-channel@80 { - compatible = "fsl,p3041-dma-channel", - "fsl,eloplus-dma-channel"; - reg = <0x80 0x80>; - cell-index = <1>; - interrupts = <29 2 0 0>; - }; - dma-channel@100 { - compatible = "fsl,p3041-dma-channel", - "fsl,eloplus-dma-channel"; - reg = <0x100 0x80>; - cell-index = <2>; - interrupts = <30 2 0 0>; - }; - dma-channel@180 { - compatible = "fsl,p3041-dma-channel", - "fsl,eloplus-dma-channel"; - reg = <0x180 0x80>; - cell-index = <3>; - interrupts = <31 2 0 0>; - }; - }; - - dma1: dma@101300 { - #address-cells = <1>; - #size-cells = <1>; - compatible = "fsl,p3041-dma", "fsl,eloplus-dma"; - reg = <0x101300 0x4>; - ranges = <0x0 0x101100 0x200>; - cell-index = <1>; - dma-channel@0 { - compatible = "fsl,p3041-dma-channel", - "fsl,eloplus-dma-channel"; - reg = <0x0 0x80>; - cell-index = <0>; - interrupts = <32 2 0 0>; - }; - dma-channel@80 { - compatible = "fsl,p3041-dma-channel", - "fsl,eloplus-dma-channel"; - reg = <0x80 0x80>; - cell-index = <1>; - interrupts = <33 2 0 0>; - }; - dma-channel@100 { - compatible = "fsl,p3041-dma-channel", - "fsl,eloplus-dma-channel"; - reg = <0x100 0x80>; - cell-index = <2>; - interrupts = <34 2 0 0>; - }; - dma-channel@180 { - compatible = "fsl,p3041-dma-channel", - "fsl,eloplus-dma-channel"; - reg = <0x180 0x80>; - cell-index = <3>; - interrupts = <35 2 0 0>; - }; - }; - spi@110000 { - #address-cells = <1>; - #size-cells = <0>; - compatible = "fsl,p3041-espi", "fsl,mpc8536-espi"; - reg = <0x110000 0x1000>; - interrupts = <53 0x2 0 0>; - fsl,espi-num-chipselects = <4>; - flash@0 { #address-cells = <1>; #size-cells = <1>; compatible = "spansion,s25sl12801"; reg = <0>; - spi-max-frequency = <40000000>; /* input clock */ + spi-max-frequency = <35000000>; /* input clock */ partition@u-boot { label = "u-boot"; reg = <0x00000000 0x00100000>; @@ -364,32 +214,7 @@ }; }; - sdhc: sdhc@114000 { - compatible = "fsl,p3041-esdhc", "fsl,esdhc"; - reg = <0x114000 0x1000>; - interrupts = <48 2 0 0>; - sdhci,auto-cmd12; - clock-frequency = <0>; - }; - - i2c@118000 { - #address-cells = <1>; - #size-cells = <0>; - cell-index = <0>; - compatible = "fsl-i2c"; - reg = <0x118000 0x100>; - interrupts = <38 2 0 0>; - dfsrr; - }; - i2c@118100 { - #address-cells = <1>; - #size-cells = <0>; - cell-index = <1>; - compatible = "fsl-i2c"; - reg = <0x118100 0x100>; - interrupts = <38 2 0 0>; - dfsrr; eeprom@51 { compatible = "at24,24c256"; reg = <0x51>; @@ -400,24 +225,7 @@ }; }; - i2c@119000 { - #address-cells = <1>; - #size-cells = <0>; - cell-index = <2>; - compatible = "fsl-i2c"; - reg = <0x119000 0x100>; - interrupts = <39 2 0 0>; - dfsrr; - }; - i2c@119100 { - #address-cells = <1>; - #size-cells = <0>; - cell-index = <3>; - compatible = "fsl-i2c"; - reg = <0x119100 0x100>; - interrupts = <39 2 0 0>; - dfsrr; rtc@68 { compatible = "dallas,ds3232"; reg = <0x68>; @@ -425,329 +233,355 @@ }; }; - serial0: serial@11c500 { - cell-index = <0>; - device_type = "serial"; - compatible = "ns16550"; - reg = <0x11c500 0x100>; - clock-frequency = <0>; - interrupts = <36 2 0 0>; + pme: pme@316000 { + /* Commented out, use default allocation */ + /* fsl,pme-pdsr = <0x0 0x23000000 0x0 0x01000000>; */ + /* fsl,pme-sre = <0x0 0x24000000 0x0 0x00a00000>; */ }; - serial1: serial@11c600 { - cell-index = <1>; - device_type = "serial"; - compatible = "ns16550"; - reg = <0x11c600 0x100>; - clock-frequency = <0>; - interrupts = <36 2 0 0>; + qman: qman@318000 { + /* Commented out, use default allocation */ + /* fsl,qman-fqd = <0x0 0x20000000 0x0 0x01000000>; */ + /* fsl,qman-pfdr = <0x0 0x21000000 0x0 0x01000000>; */ }; - serial2: serial@11d500 { - cell-index = <2>; - device_type = "serial"; - compatible = "ns16550"; - reg = <0x11d500 0x100>; - clock-frequency = <0>; - interrupts = <37 2 0 0>; + bman: bman@31a000 { + /* Same as fsl,qman-*, use default allocation */ + /* fsl,bman-fbpr = <0x0 0x22000000 0x0 0x01000000>; */ }; - serial3: serial@11d600 { - cell-index = <3>; - device_type = "serial"; - compatible = "ns16550"; - reg = <0x11d600 0x100>; - clock-frequency = <0>; - interrupts = <37 2 0 0>; - }; - - gpio0: gpio@130000 { - compatible = "fsl,p3041-gpio", "fsl,qoriq-gpio"; - reg = <0x130000 0x1000>; - interrupts = <55 2 0 0>; - #gpio-cells = <2>; - gpio-controller; - }; - - usb0: usb@210000 { - compatible = "fsl,p3041-usb2-mph", - "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; - reg = <0x210000 0x1000>; - #address-cells = <1>; - #size-cells = <0>; - interrupts = <44 0x2 0 0>; - phy_type = "utmi"; - port0; - }; - - usb1: usb@211000 { - compatible = "fsl,p3041-usb2-dr", - "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; - reg = <0x211000 0x1000>; - #address-cells = <1>; - #size-cells = <0>; - interrupts = <45 0x2 0 0>; - dr_mode = "host"; - phy_type = "utmi"; - }; - - sata@220000 { - compatible = "fsl,p3041-sata", "fsl,pq-sata-v2"; - reg = <0x220000 0x1000>; - interrupts = <68 0x2 0 0>; - }; - - sata@221000 { - compatible = "fsl,p3041-sata", "fsl,pq-sata-v2"; - reg = <0x221000 0x1000>; - interrupts = <69 0x2 0 0>; - }; - - crypto: crypto@300000 { - compatible = "fsl,sec-v4.2", "fsl,sec-v4.0"; - #address-cells = <1>; - #size-cells = <1>; - reg = <0x300000 0x10000>; - ranges = <0 0x300000 0x10000>; - interrupts = <92 2 0 0>; - - sec_jr0: jr@1000 { - compatible = "fsl,sec-v4.2-job-ring", - "fsl,sec-v4.0-job-ring"; - reg = <0x1000 0x1000>; - interrupts = <88 2 0 0>; + fman0: fman@400000 { + enet0: ethernet@e0000 { + tbi-handle = <&tbi0>; + phy-handle = <&phy_rgmii_0>; + phy-connection-type = "rgmii"; }; - sec_jr1: jr@2000 { - compatible = "fsl,sec-v4.2-job-ring", - "fsl,sec-v4.0-job-ring"; - reg = <0x2000 0x1000>; - interrupts = <89 2 0 0>; + mdio0: mdio@e1120 { + tbi0: tbi-phy@8 { + reg = <0x8>; + device_type = "tbi-phy"; + }; + + /* + * Virtual MDIO for the two on-board RGMII + * ports. The fsl,hydra-mdio-muxval property + * is already correct. + */ + hydra_mdio_rgmii: hydra-mdio-rgmii { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,hydra-mdio"; + fsl,mdio-handle = <&mdio0>; + fsl,hydra-mdio-muxval = <0x00>; + status = "disabled"; + + phy_rgmii_0: ethernet-phy@0 { + reg = <0x0>; + }; + phy_rgmii_1: ethernet-phy@1 { + reg = <0x1>; + }; + }; + + /* + * Virtual MDIO for the four-port SGMII card. + * The fsl,hydra-mdio-muxval property will be + * fixed-up by U-Boot based on the slot that + * the SGMII card is in. + * + * Note: we do not support DTSEC5 connected to + * SGMII, so this is the only SGMII node. + */ + hydra_mdio_sgmii: hydra-mdio-sgmii { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,hydra-mdio"; + fsl,mdio-handle = <&mdio0>; + fsl,hydra-mdio-muxval = <0x00>; + status = "disabled"; + + phy_sgmii_1c: ethernet-phy@1c { + reg = <0x1c>; + }; + phy_sgmii_1d: ethernet-phy@1d { + reg = <0x1d>; + }; + phy_sgmii_1e: ethernet-phy@1e { + reg = <0x1e>; + }; + phy_sgmii_1f: ethernet-phy@1f { + reg = <0x1f>; + }; + }; }; - sec_jr2: jr@3000 { - compatible = "fsl,sec-v4.2-job-ring", - "fsl,sec-v4.0-job-ring"; - reg = <0x3000 0x1000>; - interrupts = <90 2 0 0>; + enet1: ethernet@e2000 { + tbi-handle = <&tbi1>; + phy-handle = <&phy_sgmii_1d>; + phy-connection-type = "sgmii"; }; - sec_jr3: jr@4000 { - compatible = "fsl,sec-v4.2-job-ring", - "fsl,sec-v4.0-job-ring"; - reg = <0x4000 0x1000>; - interrupts = <91 2 0 0>; + mdio@e3120 { + tbi1: tbi-phy@8 { + reg = <8>; + device_type = "tbi-phy"; + }; }; - rtic@6000 { - compatible = "fsl,sec-v4.2-rtic", - "fsl,sec-v4.0-rtic"; + enet2: ethernet@e4000 { + tbi-handle = <&tbi2>; + phy-handle = <&phy_sgmii_1e>; + phy-connection-type = "sgmii"; + }; + + mdio@e5120 { + tbi2: tbi-phy@8 { + reg = <8>; + device_type = "tbi-phy"; + }; + }; + + enet3: ethernet@e6000 { + tbi-handle = <&tbi3>; + phy-handle = <&phy_sgmii_1f>; + phy-connection-type = "sgmii"; + }; + + mdio@e7120 { #address-cells = <1>; - #size-cells = <1>; - reg = <0x6000 0x100>; - ranges = <0x0 0x6100 0xe00>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe7120 0xee0>; + interrupts = <100 1 0 0>; - rtic_a: rtic-a@0 { - compatible = "fsl,sec-v4.2-rtic-memory", - "fsl,sec-v4.0-rtic-memory"; - reg = <0x00 0x20 0x100 0x80>; + tbi3: tbi-phy@8 { + reg = <8>; + device_type = "tbi-phy"; + }; + }; + + enet4: ethernet@e8000 { + tbi-handle = <&tbi4>; + phy-handle = <&phy_rgmii_1>; + phy-connection-type = "rgmii"; + }; + + mdio@e9120 { + tbi4: tbi-phy@8 { + reg = <8>; + device_type = "tbi-phy"; + }; + }; + + enet5: ethernet@f0000 { + /* + * phy-handle will be updated by U-Boot to + * reflect the actual slot the XAUI card is in. + */ + phy-handle = <&phy_xgmii_1>; + phy-connection-type = "xgmii"; + }; + + /* + * We only support one XAUI card, so the MDIO muxing + * is set by U-Boot, and Linux never touches it. + * Therefore, we don't need a virtual MDIO node. + * However, the phy address depends on the slot, so + * only one of the ethernet-phy nodes below will be + * used. + */ + hydra_mdio_xgmii: mdio@f1000 { + status = "disabled"; + + /* XAUI card in slot 1 */ + phy_xgmii_1: ethernet-phy@4 { + reg = <0x4>; }; - rtic_b: rtic-b@20 { - compatible = "fsl,sec-v4.2-rtic-memory", - "fsl,sec-v4.0-rtic-memory"; - reg = <0x20 0x20 0x200 0x80>; - }; - - rtic_c: rtic-c@40 { - compatible = "fsl,sec-v4.2-rtic-memory", - "fsl,sec-v4.0-rtic-memory"; - reg = <0x40 0x20 0x300 0x80>; - }; - - rtic_d: rtic-d@60 { - compatible = "fsl,sec-v4.2-rtic-memory", - "fsl,sec-v4.0-rtic-memory"; - reg = <0x60 0x20 0x500 0x80>; + /* XAUI card in slot 2 */ + phy_xgmii_2: ethernet-phy@0 { + reg = <0x0>; }; }; }; + }; - sec_mon: sec_mon@314000 { - compatible = "fsl,sec-v4.2-mon", "fsl,sec-v4.0-mon"; - reg = <0x314000 0x1000>; - interrupts = <93 2 0 0>; + rapidio@ffe0c0000 { + reg = <0xf 0xfe0c0000 0 0x11000>; + + port1 { + ranges = <0 0 0xc 0x20000000 0 0x10000000>; + }; + port2 { + ranges = <0 0 0xc 0x30000000 0 0x10000000>; }; }; localbus@ffe124000 { - compatible = "fsl,p3041-elbc", "fsl,elbc", "simple-bus"; reg = <0xf 0xfe124000 0 0x1000>; - interrupts = <25 2 0 0>; - #address-cells = <2>; - #size-cells = <1>; - - ranges = <0 0 0xf 0xe8000000 0x08000000 - 3 0 0xf 0xffdf0000 0x00008000>; + ranges = <0 0 0xf 0xb8000000 0x04000000>; flash@0,0 { compatible = "cfi-flash"; - reg = <0 0 0x08000000>; + /* + * Map 64Mb of 128MB NOR flash memory. Since highest + * line of address of NOR flash memory are set by + * FPGA, memory are divided into two pages equal to + * 64MB. One of the pages can be accessed at once. + */ + reg = <0 0 0x04000000>; bank-width = <2>; device-width = <2>; }; + nand@2,0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "fsl,elbc-fcm-nand"; + reg = <0x2 0x0 0x40000>; + + partition@0 { + label = "NAND U-Boot Image"; + reg = <0x0 0x02000000>; + read-only; + }; + + partition@2000000 { + label = "NAND Root File System"; + reg = <0x02000000 0x10000000>; + }; + + partition@12000000 { + label = "NAND Compressed RFS Image"; + reg = <0x12000000 0x08000000>; + }; + + partition@1a000000 { + label = "NAND Linux Kernel Image"; + reg = <0x1a000000 0x04000000>; + }; + + partition@1e000000 { + label = "NAND DTB Image"; + reg = <0x1e000000 0x01000000>; + }; + + partition@1f000000 { + label = "NAND Writable User area"; + reg = <0x1f000000 0x21000000>; + }; + }; + board-control@3,0 { - compatible = "fsl,p3041ds-pixis"; - reg = <3 0 0x20>; + compatible = "fsl,p3041ds-fpga", "fsl,fpga-ngpixis"; + reg = <3 0 0x30>; }; }; pci0: pcie@ffe200000 { - compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2"; - device_type = "pci"; - #size-cells = <2>; - #address-cells = <3>; reg = <0xf 0xfe200000 0 0x1000>; - bus-range = <0x0 0xff>; - ranges = <0x02000000 0 0xe0000000 0xc 0x00000000 0x0 0x20000000 - 0x01000000 0 0x00000000 0xf 0xf8000000 0x0 0x00010000>; - clock-frequency = <0x1fca055>; - fsl,msi = <&msi0>; - interrupts = <16 2 1 15>; + ranges = <0x02000000 0 0x80000000 0x0 0x80000000 0x0 0x10000000 + 0x01000000 0 0x00000000 0x0 0xff000000 0x0 0x00010000>; pcie@0 { - reg = <0 0 0 0 0>; - #interrupt-cells = <1>; - #size-cells = <2>; - #address-cells = <3>; - device_type = "pci"; - interrupts = <16 2 1 15>; - interrupt-map-mask = <0xf800 0 0 7>; - interrupt-map = < - /* IDSEL 0x0 */ - 0000 0 0 1 &mpic 40 1 0 0 - 0000 0 0 2 &mpic 1 1 0 0 - 0000 0 0 3 &mpic 2 1 0 0 - 0000 0 0 4 &mpic 3 1 0 0 - >; - ranges = <0x02000000 0 0xe0000000 - 0x02000000 0 0xe0000000 - 0 0x20000000 + ranges = <0x02000000 0 0x80000000 + 0x02000000 0 0x80000000 + 0 0x10000000 0x01000000 0 0x00000000 - 0x01000000 0 0x00000000 + 0x01000000 0 0xff000000 0 0x00010000>; }; }; pci1: pcie@ffe201000 { - compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2"; - device_type = "pci"; - #size-cells = <2>; - #address-cells = <3>; reg = <0xf 0xfe201000 0 0x1000>; - bus-range = <0 0xff>; - ranges = <0x02000000 0x0 0xe0000000 0xc 0x20000000 0x0 0x20000000 - 0x01000000 0x0 0x00000000 0xf 0xf8010000 0x0 0x00010000>; - clock-frequency = <0x1fca055>; - fsl,msi = <&msi1>; - interrupts = <16 2 1 14>; + ranges = <0x02000000 0x0 0x90000000 0x0 0x90000000 0x0 0x10000000 + 0x01000000 0x0 0x00000000 0x0 0xff010000 0x0 0x00010000>; pcie@0 { - reg = <0 0 0 0 0>; - #interrupt-cells = <1>; - #size-cells = <2>; - #address-cells = <3>; - device_type = "pci"; - interrupts = <16 2 1 14>; - interrupt-map-mask = <0xf800 0 0 7>; - interrupt-map = < - /* IDSEL 0x0 */ - 0000 0 0 1 &mpic 41 1 0 0 - 0000 0 0 2 &mpic 5 1 0 0 - 0000 0 0 3 &mpic 6 1 0 0 - 0000 0 0 4 &mpic 7 1 0 0 - >; - ranges = <0x02000000 0 0xe0000000 - 0x02000000 0 0xe0000000 - 0 0x20000000 + ranges = <0x02000000 0 0x90000000 + 0x02000000 0 0x90000000 + 0 0x10000000 0x01000000 0 0x00000000 - 0x01000000 0 0x00000000 + 0x01000000 0 0xff010000 0 0x00010000>; }; }; pci2: pcie@ffe202000 { - compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2"; - device_type = "pci"; - #size-cells = <2>; - #address-cells = <3>; reg = <0xf 0xfe202000 0 0x1000>; - bus-range = <0x0 0xff>; - ranges = <0x02000000 0 0xe0000000 0xc 0x40000000 0 0x20000000 - 0x01000000 0 0x00000000 0xf 0xf8020000 0 0x00010000>; - clock-frequency = <0x1fca055>; - fsl,msi = <&msi2>; - interrupts = <16 2 1 13>; + ranges = <0x02000000 0 0xa0000000 0x0 0xa0000000 0 0x10000000 + 0x01000000 0 0x00000000 0x0 0xff020000 0 0x00010000>; pcie@0 { - reg = <0 0 0 0 0>; - #interrupt-cells = <1>; - #size-cells = <2>; - #address-cells = <3>; - device_type = "pci"; - interrupts = <16 2 1 13>; - interrupt-map-mask = <0xf800 0 0 7>; - interrupt-map = < - /* IDSEL 0x0 */ - 0000 0 0 1 &mpic 42 1 0 0 - 0000 0 0 2 &mpic 9 1 0 0 - 0000 0 0 3 &mpic 10 1 0 0 - 0000 0 0 4 &mpic 11 1 0 0 - >; - ranges = <0x02000000 0 0xe0000000 - 0x02000000 0 0xe0000000 - 0 0x20000000 + ranges = <0x02000000 0 0xa0000000 + 0x02000000 0 0xa0000000 + 0 0x10000000 0x01000000 0 0x00000000 - 0x01000000 0 0x00000000 + 0x01000000 0 0xff020000 0 0x00010000>; }; }; pci3: pcie@ffe203000 { - compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2"; - device_type = "pci"; - #size-cells = <2>; - #address-cells = <3>; reg = <0xf 0xfe203000 0 0x1000>; - bus-range = <0x0 0xff>; - ranges = <0x02000000 0 0xe0000000 0xc 0x60000000 0 0x20000000 - 0x01000000 0 0x00000000 0xf 0xf8030000 0 0x00010000>; - clock-frequency = <0x1fca055>; - fsl,msi = <&msi2>; - interrupts = <16 2 1 12>; + ranges = <0x02000000 0 0xb0000000 0x0 0xb0000000 0 0x08000000 + 0x01000000 0 0x00000000 0x0 0xff030000 0 0x00010000>; pcie@0 { - reg = <0 0 0 0 0>; - #interrupt-cells = <1>; - #size-cells = <2>; - #address-cells = <3>; - device_type = "pci"; - interrupts = <16 2 1 12>; - interrupt-map-mask = <0xf800 0 0 7>; - interrupt-map = < - /* IDSEL 0x0 */ - 0000 0 0 1 &mpic 43 1 0 0 - 0000 0 0 2 &mpic 0 1 0 0 - 0000 0 0 3 &mpic 4 1 0 0 - 0000 0 0 4 &mpic 8 1 0 0 - >; - ranges = <0x02000000 0 0xe0000000 - 0x02000000 0 0xe0000000 - 0 0x20000000 + ranges = <0x02000000 0 0xb0000000 + 0x02000000 0 0xb0000000 + 0 0x08000000 0x01000000 0 0x00000000 - 0x01000000 0 0x00000000 + 0x01000000 0 0xff030000 0 0x00010000>; }; }; + + fsl,dpaa { + compatible = "fsl,p3041-dpaa", "fsl,dpaa"; + + ethernet@0 { + compatible = "fsl,p3041-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet0>; + status="okay"; + }; + ethernet@1 { + compatible = "fsl,p3041-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet1>; + status = "disabled"; + }; + ethernet@2 { + compatible = "fsl,p3041-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet2>; + status = "disabled"; + }; + ethernet@3 { + compatible = "fsl,p3041-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet3>; + status = "disabled"; + }; + ethernet@4 { + compatible = "fsl,p3041-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet4>; + status = "okay"; + }; + ethernet@5 { + compatible = "fsl,p3041-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet5>; + status = "disabled"; + }; + }; + + chosen { + stdin = "serial0"; + stdout = "serial0"; + }; }; diff --git a/sys/boot/fdt/dts/p3041si.dtsi b/sys/boot/fdt/dts/p3041si.dtsi new file mode 100644 index 00000000000..3335e48d470 --- /dev/null +++ b/sys/boot/fdt/dts/p3041si.dtsi @@ -0,0 +1,1339 @@ +/* + * P3041 Silicon Device Tree Source + * + * Copyright 2010-2011 Freescale Semiconductor Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Freescale Semiconductor nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* $FreeBSD$ */ + +/dts-v1/; + +/ { + compatible = "fsl,P3041"; + #address-cells = <2>; + #size-cells = <2>; + interrupt-parent = <&mpic>; + + aliases { + ccsr = &soc; + dcsr = &dcsr; + + ethernet0 = &enet0; + ethernet1 = &enet1; + ethernet2 = &enet2; + ethernet3 = &enet3; + ethernet4 = &enet4; + ethernet5 = &enet5; + serial0 = &serial0; + serial1 = &serial1; + serial2 = &serial2; + serial3 = &serial3; + pci0 = &pci0; + pci1 = &pci1; + pci2 = &pci2; + pci3 = &pci3; + usb0 = &usb0; + usb1 = &usb1; + dma0 = &dma0; + dma1 = &dma1; + bman = &bman; + qman = &qman; + pme = &pme; + rman = &rman; + sdhc = &sdhc; + msi0 = &msi0; + msi1 = &msi1; + msi2 = &msi2; + + crypto = &crypto; + sec_jr0 = &sec_jr0; + sec_jr1 = &sec_jr1; + sec_jr2 = &sec_jr2; + sec_jr3 = &sec_jr3; + rtic_a = &rtic_a; + rtic_b = &rtic_b; + rtic_c = &rtic_c; + rtic_d = &rtic_d; + sec_mon = &sec_mon; + + fman0 = &fman0; + fman0_oh0 = &fman0_oh0; + fman0_oh1 = &fman0_oh1; + fman0_oh2 = &fman0_oh2; + fman0_oh3 = &fman0_oh3; + fman0_oh4 = &fman0_oh4; + fman0_oh5 = &fman0_oh5; + fman0_oh6 = &fman0_oh6; + fman0_rx0 = &fman0_rx0; + fman0_rx1 = &fman0_rx1; + fman0_rx2 = &fman0_rx2; + fman0_rx3 = &fman0_rx3; + fman0_rx4 = &fman0_rx4; + fman0_rx5 = &fman0_rx5; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu0: PowerPC,e500mc@0 { + device_type = "cpu"; + reg = <0>; + bus-frequency = <749999996>; + next-level-cache = <&L2_0>; + L2_0: l2-cache { + next-level-cache = <&cpc>; + }; + }; + cpu1: PowerPC,e500mc@1 { + device_type = "cpu"; + reg = <1>; + next-level-cache = <&L2_1>; + L2_1: l2-cache { + next-level-cache = <&cpc>; + }; + }; + cpu2: PowerPC,e500mc@2 { + device_type = "cpu"; + reg = <2>; + next-level-cache = <&L2_2>; + L2_2: l2-cache { + next-level-cache = <&cpc>; + }; + }; + cpu3: PowerPC,e500mc@3 { + device_type = "cpu"; + reg = <3>; + next-level-cache = <&L2_3>; + L2_3: l2-cache { + next-level-cache = <&cpc>; + }; + }; + }; + + dcsr: dcsr@f00000000 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "fsl,dcsr", "simple-bus"; + + dcsr-epu@0 { + compatible = "fsl,dcsr-epu"; + interrupts = <52 2 0 0 + 84 2 0 0 + 85 2 0 0>; + interrupt-parent = <&mpic>; + reg = <0x0 0x1000>; + }; + dcsr-npc { + compatible = "fsl,dcsr-npc"; + reg = <0x1000 0x1000 0x1000000 0x8000>; + }; + dcsr-nxc@2000 { + compatible = "fsl,dcsr-nxc"; + reg = <0x2000 0x1000>; + }; + dcsr-corenet { + compatible = "fsl,dcsr-corenet"; + reg = <0x8000 0x1000 0xB0000 0x1000>; + }; + dcsr-dpaa@9000 { + compatible = "fsl,p43041-dcsr-dpaa", "fsl,dcsr-dpaa"; + reg = <0x9000 0x1000>; + }; + dcsr-ocn@11000 { + compatible = "fsl,p43041-dcsr-ocn", "fsl,dcsr-ocn"; + reg = <0x11000 0x1000>; + }; + dcsr-ddr@12000 { + compatible = "fsl,dcsr-ddr"; + dev-handle = <&ddr>; + reg = <0x12000 0x1000>; + }; + dcsr-nal@18000 { + compatible = "fsl,p43041-dcsr-nal", "fsl,dcsr-nal"; + reg = <0x18000 0x1000>; + }; + dcsr-rcpm@22000 { + compatible = "fsl,p43041-dcsr-rcpm", "fsl,dcsr-rcpm"; + reg = <0x22000 0x1000>; + }; + dcsr-cpu-sb-proxy@40000 { + compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy"; + cpu-handle = <&cpu0>; + reg = <0x40000 0x1000>; + }; + dcsr-cpu-sb-proxy@41000 { + compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy"; + cpu-handle = <&cpu1>; + reg = <0x41000 0x1000>; + }; + dcsr-cpu-sb-proxy@42000 { + compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy"; + cpu-handle = <&cpu2>; + reg = <0x42000 0x1000>; + }; + dcsr-cpu-sb-proxy@43000 { + compatible = "fsl,dcsr-e500mc-sb-proxy", "fsl,dcsr-cpu-sb-proxy"; + cpu-handle = <&cpu3>; + reg = <0x43000 0x1000>; + }; + }; + + bman-portals@ff4000000 { + #address-cells = <0x1>; + #size-cells = <0x1>; + compatible = "bman-portals"; + ranges = <0x0 0xf 0xfde00000 0x200000>; + bman-portal@0 { + cell-index = <0x0>; + compatible = "fsl,p3041-bman-portal", "fsl,bman-portal"; + reg = <0x0 0x4000 0x100000 0x1000>; + interrupts = <105 2 0 0>; + }; + bman-portal@4000 { + cell-index = <0x1>; + compatible = "fsl,p3041-bman-portal", "fsl,bman-portal"; + reg = <0x4000 0x4000 0x101000 0x1000>; + interrupts = <107 2 0 0>; + }; + bman-portal@8000 { + cell-index = <2>; + compatible = "fsl,p3041-bman-portal", "fsl,bman-portal"; + reg = <0x8000 0x4000 0x102000 0x1000>; + interrupts = <109 2 0 0>; + }; + bman-portal@c000 { + cell-index = <0x3>; + compatible = "fsl,p3041-bman-portal", "fsl,bman-portal"; + reg = <0xc000 0x4000 0x103000 0x1000>; + interrupts = <111 2 0 0>; + }; + bman-portal@10000 { + cell-index = <0x4>; + compatible = "fsl,p3041-bman-portal", "fsl,bman-portal"; + reg = <0x10000 0x4000 0x104000 0x1000>; + interrupts = <113 2 0 0>; + }; + bman-portal@14000 { + cell-index = <0x5>; + compatible = "fsl,p3041-bman-portal", "fsl,bman-portal"; + reg = <0x14000 0x4000 0x105000 0x1000>; + interrupts = <115 2 0 0>; + }; + bman-portal@18000 { + cell-index = <0x6>; + compatible = "fsl,p3041-bman-portal", "fsl,bman-portal"; + reg = <0x18000 0x4000 0x106000 0x1000>; + interrupts = <117 2 0 0>; + }; + bman-portal@1c000 { + cell-index = <0x7>; + compatible = "fsl,p3041-bman-portal", "fsl,bman-portal"; + reg = <0x1c000 0x4000 0x107000 0x1000>; + interrupts = <119 2 0 0>; + }; + bman-portal@20000 { + cell-index = <0x8>; + compatible = "fsl,p3041-bman-portal", "fsl,bman-portal"; + reg = <0x20000 0x4000 0x108000 0x1000>; + interrupts = <121 2 0 0>; + }; + bman-portal@24000 { + cell-index = <0x9>; + compatible = "fsl,p3041-bman-portal", "fsl,bman-portal"; + reg = <0x24000 0x4000 0x109000 0x1000>; + interrupts = <123 2 0 0>; + }; + + buffer-pool@0 { + compatible = "fsl,p3041-bpool", "fsl,bpool"; + fsl,bpid = <0>; + fsl,bpool-cfg = <0 0x100 0 1 0 0x100>; + }; + }; + + qman-portals@ff4200000 { + #address-cells = <0x1>; + #size-cells = <0x1>; + compatible = "qman-portals"; + ranges = <0x0 0xf 0xfdc00000 0x200000>; + qportal0: qman-portal@0 { + cell-index = <0x0>; + compatible = "fsl,p3041-qman-portal", "fsl,qman-portal"; + reg = <0x0 0x4000 0x100000 0x1000>; + interrupts = <104 0x2 0 0>; + fsl,qman-channel-id = <0x0>; + }; + + qportal1: qman-portal@4000 { + cell-index = <0x1>; + compatible = "fsl,p3041-qman-portal", "fsl,qman-portal"; + reg = <0x4000 0x4000 0x101000 0x1000>; + interrupts = <106 0x2 0 0>; + fsl,qman-channel-id = <0x1>; + }; + + qportal2: qman-portal@8000 { + cell-index = <0x2>; + compatible = "fsl,p3041-qman-portal", "fsl,qman-portal"; + reg = <0x8000 0x4000 0x102000 0x1000>; + interrupts = <108 0x2 0 0>; + fsl,qman-channel-id = <0x2>; + }; + + qportal3: qman-portal@c000 { + cell-index = <0x3>; + compatible = "fsl,p3041-qman-portal", "fsl,qman-portal"; + reg = <0xc000 0x4000 0x103000 0x1000>; + interrupts = <110 0x2 0 0>; + fsl,qman-channel-id = <0x3>; + }; + + qportal4: qman-portal@10000 { + cell-index = <0x4>; + compatible = "fsl,p3041-qman-portal", "fsl,qman-portal"; + reg = <0x10000 0x4000 0x104000 0x1000>; + interrupts = <112 0x2 0 0>; + fsl,qman-channel-id = <0x4>; + }; + + qportal5: qman-portal@14000 { + cell-index = <0x5>; + compatible = "fsl,p3041-qman-portal", "fsl,qman-portal"; + reg = <0x14000 0x4000 0x105000 0x1000>; + interrupts = <114 0x2 0 0>; + fsl,qman-channel-id = <0x5>; + }; + + qportal6: qman-portal@18000 { + cell-index = <0x6>; + compatible = "fsl,p3041-qman-portal", "fsl,qman-portal"; + reg = <0x18000 0x4000 0x106000 0x1000>; + interrupts = <116 0x2 0 0>; + fsl,qman-channel-id = <0x6>; + }; + + qportal7: qman-portal@1c000 { + cell-index = <0x7>; + compatible = "fsl,p3041-qman-portal", "fsl,qman-portal"; + reg = <0x1c000 0x4000 0x107000 0x1000>; + interrupts = <118 0x2 0 0>; + fsl,qman-channel-id = <0x7>; + }; + + qportal8: qman-portal@20000 { + cell-index = <0x8>; + compatible = "fsl,p3041-qman-portal", "fsl,qman-portal"; + reg = <0x20000 0x4000 0x108000 0x1000>; + interrupts = <120 0x2 0 0>; + fsl,qman-channel-id = <0x8>; + }; + + qportal9: qman-portal@24000 { + cell-index = <0x9>; + compatible = "fsl,p3041-qman-portal", "fsl,qman-portal"; + reg = <0x24000 0x4000 0x109000 0x1000>; + interrupts = <122 0x2 0 0>; + fsl,qman-channel-id = <0x9>; + }; + + qpool1: qman-pool@1 { + cell-index = <1>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x21>; + }; + + qpool2: qman-pool@2 { + cell-index = <2>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x22>; + }; + + qpool3: qman-pool@3 { + cell-index = <3>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x23>; + }; + + qpool4: qman-pool@4 { + cell-index = <4>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x24>; + }; + + qpool5: qman-pool@5 { + cell-index = <5>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x25>; + }; + + qpool6: qman-pool@6 { + cell-index = <6>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x26>; + }; + + qpool7: qman-pool@7 { + cell-index = <7>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x27>; + }; + + qpool8: qman-pool@8 { + cell-index = <8>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x28>; + }; + + qpool9: qman-pool@9 { + cell-index = <9>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x29>; + }; + + qpool10: qman-pool@10 { + cell-index = <10>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2a>; + }; + + qpool11: qman-pool@11 { + cell-index = <11>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2b>; + }; + + qpool12: qman-pool@12 { + cell-index = <12>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2c>; + }; + + qpool13: qman-pool@13 { + cell-index = <13>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2d>; + }; + + qpool14: qman-pool@14 { + cell-index = <14>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2e>; + }; + + qpool15: qman-pool@15 { + cell-index = <15>; + compatible = "fsl,p3041-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2f>; + }; + }; + + soc: soc@ffe000000 { + #address-cells = <1>; + #size-cells = <1>; + device_type = "soc"; + compatible = "simple-bus"; + + bus-frequency = <0>; // Filled out by kernel. + + ranges = <0x00000000 0xf 0xfe000000 0x1000000>; + reg = <0xf 0xfe000000 0 0x00001000>; + + soc-sram-error { + compatible = "fsl,soc-sram-error"; + interrupts = <16 2 1 29>; + }; + + corenet-law@0 { + compatible = "fsl,corenet-law"; + reg = <0x0 0x1000>; + fsl,num-laws = <32>; + }; + + ddr: memory-controller@8000 { + compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller"; + reg = <0x8000 0x1000>; + interrupts = <16 2 1 23>; + }; + + cpc: l3-cache-controller@10000 { + compatible = "fsl,p3041-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache"; + reg = <0x10000 0x1000>; + interrupts = <16 2 1 27>; + }; + + corenet-cf@18000 { + compatible = "fsl,corenet-cf"; + reg = <0x18000 0x1000>; + interrupts = <16 2 1 31>; + fsl,ccf-num-csdids = <32>; + fsl,ccf-num-snoopids = <32>; + }; + + iommu@20000 { + compatible = "fsl,pamu-v1.0", "fsl,pamu"; + reg = <0x20000 0x4000>; + interrupts = < + 24 2 0 0 + 16 2 1 30>; + }; + + mpic: pic@40000 { + clock-frequency = <0>; + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <4>; + reg = <0x40000 0x40000>; + compatible = "fsl,mpic", "chrp,open-pic"; + device_type = "open-pic"; + }; + + msi0: msi@41600 { + compatible = "fsl,mpic-msi"; + reg = <0x41600 0x200>; + msi-available-ranges = <0 0x100>; + interrupts = < + 0xe0 0 0 0 + 0xe1 0 0 0 + 0xe2 0 0 0 + 0xe3 0 0 0 + 0xe4 0 0 0 + 0xe5 0 0 0 + 0xe6 0 0 0 + 0xe7 0 0 0>; + }; + + msi1: msi@41800 { + compatible = "fsl,mpic-msi"; + reg = <0x41800 0x200>; + msi-available-ranges = <0 0x100>; + interrupts = < + 0xe8 0 0 0 + 0xe9 0 0 0 + 0xea 0 0 0 + 0xeb 0 0 0 + 0xec 0 0 0 + 0xed 0 0 0 + 0xee 0 0 0 + 0xef 0 0 0>; + }; + + msi2: msi@41a00 { + compatible = "fsl,mpic-msi"; + reg = <0x41a00 0x200>; + msi-available-ranges = <0 0x100>; + interrupts = < + 0xf0 0 0 0 + 0xf1 0 0 0 + 0xf2 0 0 0 + 0xf3 0 0 0 + 0xf4 0 0 0 + 0xf5 0 0 0 + 0xf6 0 0 0 + 0xf7 0 0 0>; + }; + + guts: global-utilities@e0000 { + compatible = "fsl,qoriq-device-config-1.0"; + reg = <0xe0000 0xe00>; + fsl,has-rstcr; + #sleep-cells = <1>; + fsl,liodn-bits = <12>; + }; + + pins: global-utilities@e0e00 { + compatible = "fsl,qoriq-pin-control-1.0"; + reg = <0xe0e00 0x200>; + #sleep-cells = <2>; + }; + + clockgen: global-utilities@e1000 { + compatible = "fsl,p3041-clockgen", "fsl,qoriq-clockgen-1.0"; + reg = <0xe1000 0x1000>; + clock-frequency = <0>; + }; + + rcpm: global-utilities@e2000 { + compatible = "fsl,qoriq-rcpm-1.0"; + reg = <0xe2000 0x1000>; + #sleep-cells = <1>; + }; + + sfp: sfp@e8000 { + compatible = "fsl,p3041-sfp", "fsl,qoriq-sfp-1.0"; + reg = <0xe8000 0x1000>; + }; + + serdes: serdes@ea000 { + compatible = "fsl,p3041-serdes"; + reg = <0xea000 0x1000>; + }; + + dma0: dma@100300 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "fsl,p3041-dma", "fsl,eloplus-dma"; + reg = <0x100300 0x4>; + ranges = <0x0 0x100100 0x200>; + cell-index = <0>; + dma-channel@0 { + compatible = "fsl,p3041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x0 0x80>; + cell-index = <0>; + interrupts = <28 2 0 0>; + }; + dma-channel@80 { + compatible = "fsl,p3041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x80 0x80>; + cell-index = <1>; + interrupts = <29 2 0 0>; + }; + dma-channel@100 { + compatible = "fsl,p3041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x100 0x80>; + cell-index = <2>; + interrupts = <30 2 0 0>; + }; + dma-channel@180 { + compatible = "fsl,p3041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x180 0x80>; + cell-index = <3>; + interrupts = <31 2 0 0>; + }; + }; + + dma1: dma@101300 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "fsl,p3041-dma", "fsl,eloplus-dma"; + reg = <0x101300 0x4>; + ranges = <0x0 0x101100 0x200>; + cell-index = <1>; + dma-channel@0 { + compatible = "fsl,p3041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x0 0x80>; + cell-index = <0>; + interrupts = <32 2 0 0>; + }; + dma-channel@80 { + compatible = "fsl,p3041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x80 0x80>; + cell-index = <1>; + interrupts = <33 2 0 0>; + }; + dma-channel@100 { + compatible = "fsl,p3041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x100 0x80>; + cell-index = <2>; + interrupts = <34 2 0 0>; + }; + dma-channel@180 { + compatible = "fsl,p3041-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x180 0x80>; + cell-index = <3>; + interrupts = <35 2 0 0>; + }; + }; + + spi@110000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,p3041-espi", "fsl,mpc8536-espi"; + reg = <0x110000 0x1000>; + interrupts = <53 0x2 0 0>; + fsl,espi-num-chipselects = <4>; + }; + + sdhc: sdhc@114000 { + compatible = "fsl,p3041-esdhc", "fsl,esdhc"; + reg = <0x114000 0x1000>; + interrupts = <48 2 0 0>; + sdhci,auto-cmd12; + clock-frequency = <0>; + }; + + i2c@118000 { + #address-cells = <1>; + #size-cells = <0>; + cell-index = <0>; + compatible = "fsl-i2c"; + reg = <0x118000 0x100>; + interrupts = <38 2 0 0>; + dfsrr; + }; + + i2c@118100 { + #address-cells = <1>; + #size-cells = <0>; + cell-index = <1>; + compatible = "fsl-i2c"; + reg = <0x118100 0x100>; + interrupts = <38 2 0 0>; + dfsrr; + }; + + i2c@119000 { + #address-cells = <1>; + #size-cells = <0>; + cell-index = <2>; + compatible = "fsl-i2c"; + reg = <0x119000 0x100>; + interrupts = <39 2 0 0>; + dfsrr; + }; + + i2c@119100 { + #address-cells = <1>; + #size-cells = <0>; + cell-index = <3>; + compatible = "fsl-i2c"; + reg = <0x119100 0x100>; + interrupts = <39 2 0 0>; + dfsrr; + }; + + serial0: serial@11c500 { + cell-index = <0>; + device_type = "serial"; + compatible = "ns16550"; + reg = <0x11c500 0x100>; + clock-frequency = <0>; + interrupts = <36 2 0 0>; + }; + + serial1: serial@11c600 { + cell-index = <1>; + device_type = "serial"; + compatible = "ns16550"; + reg = <0x11c600 0x100>; + clock-frequency = <0>; + interrupts = <36 2 0 0>; + }; + + serial2: serial@11d500 { + cell-index = <2>; + device_type = "serial"; + compatible = "ns16550"; + reg = <0x11d500 0x100>; + clock-frequency = <0>; + interrupts = <37 2 0 0>; + }; + + serial3: serial@11d600 { + cell-index = <3>; + device_type = "serial"; + compatible = "ns16550"; + reg = <0x11d600 0x100>; + clock-frequency = <0>; + interrupts = <37 2 0 0>; + }; + + gpio0: gpio@130000 { + compatible = "fsl,p3041-gpio", "fsl,qoriq-gpio"; + reg = <0x130000 0x1000>; + interrupts = <55 2 0 0>; + #gpio-cells = <2>; + gpio-controller; + }; + + rman: rman@1e0000 { + compatible = "fsl,rman"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0x1e0000 0x20000>; + reg = <0x1e0000 0x20000>; + interrupts = <16 2 1 11>; /* err_irq */ + fsl,qman-channels-id = <0x62 0x63>; + + inbound-block@0 { + compatible = "fsl,rman-inbound-block"; + reg = <0x0 0x800>; + }; + global-cfg@b00 { + compatible = "fsl,rman-global-cfg"; + reg = <0xb00 0x500>; + }; + inbound-block@1000 { + compatible = "fsl,rman-inbound-block"; + reg = <0x1000 0x800>; + }; + inbound-block@2000 { + compatible = "fsl,rman-inbound-block"; + reg = <0x2000 0x800>; + }; + inbound-block@3000 { + compatible = "fsl,rman-inbound-block"; + reg = <0x3000 0x800>; + }; + }; + + usb0: usb@210000 { + compatible = "fsl,p3041-usb2-mph", + "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; + reg = <0x210000 0x1000>; + #address-cells = <1>; + #size-cells = <0>; + interrupts = <44 0x2 0 0>; + phy_type = "utmi"; + port0; + }; + + usb1: usb@211000 { + compatible = "fsl,p3041-usb2-dr", + "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; + reg = <0x211000 0x1000>; + #address-cells = <1>; + #size-cells = <0>; + interrupts = <45 0x2 0 0>; + dr_mode = "host"; + phy_type = "utmi"; + }; + + sata@220000 { + compatible = "fsl,p3041-sata", "fsl,pq-sata-v2"; + reg = <0x220000 0x1000>; + interrupts = <68 0x2 0 0>; + }; + + sata@221000 { + compatible = "fsl,p3041-sata", "fsl,pq-sata-v2"; + reg = <0x221000 0x1000>; + interrupts = <69 0x2 0 0>; + }; + + crypto: crypto@300000 { + compatible = "fsl,sec-v4.2", "fsl,sec-v4.0"; + #address-cells = <1>; + #size-cells = <1>; + reg = <0x300000 0x10000>; + ranges = <0 0x300000 0x10000>; + interrupts = <92 2 0 0>; + + sec_jr0: jr@1000 { + compatible = "fsl,sec-v4.2-job-ring", + "fsl,sec-v4.0-job-ring"; + reg = <0x1000 0x1000>; + interrupts = <88 2 0 0>; + }; + + sec_jr1: jr@2000 { + compatible = "fsl,sec-v4.2-job-ring", + "fsl,sec-v4.0-job-ring"; + reg = <0x2000 0x1000>; + interrupts = <89 2 0 0>; + }; + + sec_jr2: jr@3000 { + compatible = "fsl,sec-v4.2-job-ring", + "fsl,sec-v4.0-job-ring"; + reg = <0x3000 0x1000>; + interrupts = <90 2 0 0>; + }; + + sec_jr3: jr@4000 { + compatible = "fsl,sec-v4.2-job-ring", + "fsl,sec-v4.0-job-ring"; + reg = <0x4000 0x1000>; + interrupts = <91 2 0 0>; + }; + + rtic@6000 { + compatible = "fsl,sec-v4.2-rtic", + "fsl,sec-v4.0-rtic"; + #address-cells = <1>; + #size-cells = <1>; + reg = <0x6000 0x100>; + ranges = <0x0 0x6100 0xe00>; + + rtic_a: rtic-a@0 { + compatible = "fsl,sec-v4.2-rtic-memory", + "fsl,sec-v4.0-rtic-memory"; + reg = <0x00 0x20 0x100 0x80>; + }; + + rtic_b: rtic-b@20 { + compatible = "fsl,sec-v4.2-rtic-memory", + "fsl,sec-v4.0-rtic-memory"; + reg = <0x20 0x20 0x200 0x80>; + }; + + rtic_c: rtic-c@40 { + compatible = "fsl,sec-v4.2-rtic-memory", + "fsl,sec-v4.0-rtic-memory"; + reg = <0x40 0x20 0x300 0x80>; + }; + + rtic_d: rtic-d@60 { + compatible = "fsl,sec-v4.2-rtic-memory", + "fsl,sec-v4.0-rtic-memory"; + reg = <0x60 0x20 0x500 0x80>; + }; + }; + }; + + sec_mon: sec_mon@314000 { + compatible = "fsl,sec-v4.2-mon", "fsl,sec-v4.0-mon"; + reg = <0x314000 0x1000>; + interrupts = <93 2 0 0>; + }; + + pme: pme@316000 { + compatible = "fsl,pme"; + reg = <0x316000 0x10000>; + /* fsl,pme-pdsr = <0x0 0x23000000 0x0 0x01000000>; */ + /* fsl,pme-sre = <0x0 0x24000000 0x0 0x00a00000>; */ + interrupts = <16 2 1 5>; + }; + + qman: qman@318000 { + compatible = "fsl,p3041-qman", "fsl,qman"; + reg = <0x318000 0x1000>; + interrupts = <16 2 1 3>; + /* Commented out, use default allocation */ + /* fsl,qman-fqd = <0x0 0x20000000 0x0 0x01000000>; */ + /* fsl,qman-pfdr = <0x0 0x21000000 0x0 0x01000000>; */ + }; + + bman: bman@31a000 { + compatible = "fsl,p3041-bman", "fsl,bman"; + reg = <0x31a000 0x1000>; + interrupts = <16 2 1 2>; + /* Same as fsl,qman-*, use default allocation */ + /* fsl,bman-fbpr = <0x0 0x22000000 0x0 0x01000000>; */ + }; + + fman0: fman@400000 { + #address-cells = <1>; + #size-cells = <1>; + cell-index = <0>; + compatible = "fsl,p3041-fman", "fsl,fman", "simple-bus"; + ranges = <0 0x400000 0x100000>; + reg = <0x400000 0x100000>; + clock-frequency = <0>; + interrupts = < + 96 2 0 0 + 16 2 1 1>; + + cc@0 { + compatible = "fsl,p3041-fman-cc", "fsl,fman-cc"; + }; + + parser@c7000 { + compatible = "fsl,p3041-fman-parser", "fsl,fman-parser"; + reg = <0xc7000 0x1000>; + }; + + keygen@c1000 { + compatible = "fsl,p3041-fman-keygen", "fsl,fman-keygen"; + reg = <0xc1000 0x1000>; + }; + + policer@c0000 { + compatible = "fsl,p3041-fman-policer", "fsl,fman-policer"; + reg = <0xc0000 0x1000>; + }; + + muram@0 { + compatible = "fsl,p3041-fman-muram", "fsl,fman-muram"; + reg = <0x0 0x28000>; + }; + + bmi@80000 { + compatible = "fsl,p3041-fman-bmi", "fsl,fman-bmi"; + reg = <0x80000 0x400>; + }; + + qmi@80400 { + compatible = "fsl,p3041-fman-qmi", "fsl,fman-qmi"; + reg = <0x80400 0x400>; + }; + + fman0_rx0: port@88000 { + cell-index = <0>; + compatible = "fsl,p3041-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x88000 0x1000>; + }; + fman0_rx1: port@89000 { + cell-index = <1>; + compatible = "fsl,p3041-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x89000 0x1000>; + }; + fman0_rx2: port@8a000 { + cell-index = <2>; + compatible = "fsl,p3041-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x8a000 0x1000>; + }; + fman0_rx3: port@8b000 { + cell-index = <3>; + compatible = "fsl,p3041-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x8b000 0x1000>; + }; + fman0_rx4: port@8c000 { + cell-index = <4>; + compatible = "fsl,p3041-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x8c000 0x1000>; + }; + fman0_rx5: port@90000 { + cell-index = <0>; + compatible = "fsl,p3041-fman-port-10g-rx", "fsl,fman-port-10g-rx"; + reg = <0x90000 0x1000>; + }; + + fman0_tx5: port@b0000 { + cell-index = <0>; + compatible = "fsl,p3041-fman-port-10g-tx", "fsl,fman-port-10g-tx"; + reg = <0xb0000 0x1000>; + fsl,qman-channel-id = <0x40>; + }; + fman0_tx0: port@a8000 { + cell-index = <0>; + compatible = "fsl,p3041-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xa8000 0x1000>; + fsl,qman-channel-id = <0x41>; + }; + fman0_tx1: port@a9000 { + cell-index = <1>; + compatible = "fsl,p3041-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xa9000 0x1000>; + fsl,qman-channel-id = <0x42>; + }; + fman0_tx2: port@aa000 { + cell-index = <2>; + compatible = "fsl,p3041-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xaa000 0x1000>; + fsl,qman-channel-id = <0x43>; + }; + fman0_tx3: port@ab000 { + cell-index = <3>; + compatible = "fsl,p3041-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xab000 0x1000>; + fsl,qman-channel-id = <0x44>; + }; + fman0_tx4: port@ac000 { + cell-index = <4>; + compatible = "fsl,p3041-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xac000 0x1000>; + fsl,qman-channel-id = <0x45>; + }; + + fman0_oh0: port@81000 { + cell-index = <0>; + compatible = "fsl,p3041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x81000 0x1000>; + fsl,qman-channel-id = <0x46>; + }; + fman0_oh1: port@82000 { + cell-index = <1>; + compatible = "fsl,p3041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x82000 0x1000>; + fsl,qman-channel-id = <0x47>; + }; + fman0_oh2: port@83000 { + cell-index = <2>; + compatible = "fsl,p3041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x83000 0x1000>; + fsl,qman-channel-id = <0x48>; + }; + fman0_oh3: port@84000 { + cell-index = <3>; + compatible = "fsl,p3041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x84000 0x1000>; + fsl,qman-channel-id = <0x49>; + }; + fman0_oh4: port@85000 { + cell-index = <4>; + compatible = "fsl,p3041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x85000 0x1000>; + fsl,qman-channel-id = <0x4a>; + }; + fman0_oh5: port@86000 { + cell-index = <5>; + compatible = "fsl,p3041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x86000 0x1000>; + fsl,qman-channel-id = <0x4b>; + }; + fman0_oh6: port@87000 { + cell-index = <6>; + compatible = "fsl,p3041-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x87000 0x1000>; + }; + + enet0: ethernet@e0000 { + cell-index = <0>; + compatible = "fsl,p3041-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe0000 0x1000>; + fsl,port-handles = <&fman0_rx0 &fman0_tx0>; + ptimer-handle = <&ptp_timer0>; + }; + + mdio0: mdio@e1120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-mdio"; + reg = <0xe1120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet1: ethernet@e2000 { + cell-index = <1>; + compatible = "fsl,p3041-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe2000 0x1000>; + fsl,port-handles = <&fman0_rx1 &fman0_tx1>; + ptimer-handle = <&ptp_timer0>; + }; + + mdio@e3120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe3120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet2: ethernet@e4000 { + cell-index = <2>; + compatible = "fsl,p3041-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe4000 0x1000>; + fsl,port-handles = <&fman0_rx2 &fman0_tx2>; + ptimer-handle = <&ptp_timer0>; + }; + + mdio@e5120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe5120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet3: ethernet@e6000 { + cell-index = <3>; + compatible = "fsl,p3041-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe6000 0x1000>; + fsl,port-handles = <&fman0_rx3 &fman0_tx3>; + }; + + mdio@e7120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe7120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet4: ethernet@e8000 { + cell-index = <4>; + compatible = "fsl,p3041-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe8000 0x1000>; + fsl,port-handles = <&fman0_rx4 &fman0_tx4>; + ptimer-handle = <&ptp_timer0>; + }; + + mdio@e9120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe9120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet5: ethernet@f0000 { + cell-index = <0>; + compatible = "fsl,p3041-fman-10g-mac", "fsl,fman-10g-mac"; + reg = <0xf0000 0x1000>; + fsl,port-handles = <&fman0_rx5 &fman0_tx5>; + }; + + mdio@f1000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-xmdio"; + reg = <0xf1000 0x1000>; + interrupts = <100 1 0 0>; + }; + + ptp_timer0: rtc@fe000 { + compatible = "fsl,fman-rtc"; + reg = <0xfe000 0x1000>; + }; + }; + }; + + rapidio@ffe0c0000 { + compatible = "fsl,srio"; + interrupts = <16 2 1 11>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + + port1 { + #address-cells = <2>; + #size-cells = <2>; + cell-index = <1>; + }; + + port2 { + #address-cells = <2>; + #size-cells = <2>; + cell-index = <2>; + }; + }; + + localbus@ffe124000 { + compatible = "fsl,p3041-rev1.0-elbc", "simple-bus", "fsl,elbc"; + interrupts = < + 25 2 0 0 + 16 2 1 19 + >; + #address-cells = <2>; + #size-cells = <1>; + }; + + pci0: pcie@ffe200000 { + compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2"; + device_type = "pci"; + status = "okay"; + #size-cells = <2>; + #address-cells = <3>; + bus-range = <0x0 0xff>; + clock-frequency = <0x1fca055>; + fsl,msi = <&msi0>; + interrupts = <16 2 1 15>; + + pcie@0 { + reg = <0 0 0 0 0>; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + device_type = "pci"; + interrupts = <16 2 1 15>; + interrupt-map-mask = <0xf800 0 0 7>; + interrupt-map = < + /* IDSEL 0x0 */ + 0000 0 0 1 &mpic 40 1 0 0 + 0000 0 0 2 &mpic 1 1 0 0 + 0000 0 0 3 &mpic 2 1 0 0 + 0000 0 0 4 &mpic 3 1 0 0 + >; + }; + }; + + pci1: pcie@ffe201000 { + compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2"; + device_type = "pci"; + status = "disabled"; + #size-cells = <2>; + #address-cells = <3>; + bus-range = <0 0xff>; + clock-frequency = <0x1fca055>; + fsl,msi = <&msi1>; + interrupts = <16 2 1 14>; + pcie@0 { + reg = <0 0 0 0 0>; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + device_type = "pci"; + interrupts = <16 2 1 14>; + interrupt-map-mask = <0xf800 0 0 7>; + interrupt-map = < + /* IDSEL 0x0 */ + 0000 0 0 1 &mpic 41 1 0 0 + 0000 0 0 2 &mpic 5 1 0 0 + 0000 0 0 3 &mpic 6 1 0 0 + 0000 0 0 4 &mpic 7 1 0 0 + >; + }; + }; + + pci2: pcie@ffe202000 { + compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2"; + device_type = "pci"; + status = "okay"; + #size-cells = <2>; + #address-cells = <3>; + bus-range = <0x0 0xff>; + clock-frequency = <0x1fca055>; + fsl,msi = <&msi2>; + interrupts = <16 2 1 13>; + pcie@0 { + reg = <0 0 0 0 0>; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + device_type = "pci"; + interrupts = <16 2 1 13>; + interrupt-map-mask = <0xf800 0 0 7>; + interrupt-map = < + /* IDSEL 0x0 */ + 0000 0 0 1 &mpic 42 1 0 0 + 0000 0 0 2 &mpic 9 1 0 0 + 0000 0 0 3 &mpic 10 1 0 0 + 0000 0 0 4 &mpic 11 1 0 0 + >; + }; + }; + + pci3: pcie@ffe203000 { + compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2"; + device_type = "pci"; + status = "disabled"; + #size-cells = <2>; + #address-cells = <3>; + bus-range = <0x0 0xff>; + clock-frequency = <0x1fca055>; + fsl,msi = <&msi2>; + interrupts = <16 2 1 12>; + pcie@0 { + reg = <0 0 0 0 0>; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + device_type = "pci"; + interrupts = <16 2 1 12>; + interrupt-map-mask = <0xf800 0 0 7>; + interrupt-map = < + /* IDSEL 0x0 */ + 0000 0 0 1 &mpic 43 1 0 0 + 0000 0 0 2 &mpic 0 1 0 0 + 0000 0 0 3 &mpic 4 1 0 0 + 0000 0 0 4 &mpic 8 1 0 0 + >; + }; + }; +}; diff --git a/sys/boot/fdt/dts/p5020ds.dts b/sys/boot/fdt/dts/p5020ds.dts new file mode 100644 index 00000000000..cb070457924 --- /dev/null +++ b/sys/boot/fdt/dts/p5020ds.dts @@ -0,0 +1,583 @@ +/* + * P5020DS Device Tree Source + * + * Copyright 2010-2011 Freescale Semiconductor Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Freescale Semiconductor nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* $FreeBSD$ */ + +/include/ "p5020si.dtsi" + +/ { + model = "fsl,P5020DS"; + compatible = "fsl,P5020DS"; + #address-cells = <2>; + #size-cells = <2>; + interrupt-parent = <&mpic>; + + aliases { + phy_rgmii_0 = &phy_rgmii_0; + phy_rgmii_1 = &phy_rgmii_1; + phy_sgmii_1c = &phy_sgmii_1c; + phy_sgmii_1d = &phy_sgmii_1d; + phy_sgmii_1e = &phy_sgmii_1e; + phy_sgmii_1f = &phy_sgmii_1f; + phy_xgmii_1 = &phy_xgmii_1; + phy_xgmii_2 = &phy_xgmii_2; + emi1_rgmii = &hydra_mdio_rgmii; + emi1_sgmii = &hydra_mdio_sgmii; + emi2_xgmii = &hydra_mdio_xgmii; + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x00000000 0x00000000 0x80000000>; + }; + + dcsr: dcsr@f00000000 { + ranges = <0x00000000 0xf 0x00000000 0x01008000>; + }; + + bman-portals@ff4000000 { + bman-portal@0 { + cpu-handle = <&cpu0>; + }; + bman-portal@4000 { + cpu-handle = <&cpu1>; + }; + bman-portal@8000 { + }; + bman-portal@c000 { + }; + bman-portal@10000 { + }; + bman-portal@14000 { + }; + bman-portal@18000 { + }; + bman-portal@1c000 { + }; + bman-portal@20000 { + }; + bman-portal@24000 { + }; + + buffer-pool@0 { + compatible = "fsl,p5020-bpool", "fsl,bpool"; + fsl,bpid = <0>; + fsl,bpool-cfg = <0 0x100 0 1 0 0x100>; + }; + }; + + qman-portals@ff4200000 { + qportal0: qman-portal@0 { + cpu-handle = <&cpu0>; + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal1: qman-portal@4000 { + cpu-handle = <&cpu1>; + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal2: qman-portal@8000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal3: qman-portal@c000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal4: qman-portal@10000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal5: qman-portal@14000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal6: qman-portal@18000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal7: qman-portal@1c000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal8: qman-portal@20000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + + qportal9: qman-portal@24000 { + fsl,qman-pool-channels = <&qpool1 &qpool2 &qpool3 + &qpool4 &qpool5 &qpool6 + &qpool7 &qpool8 &qpool9 + &qpool10 &qpool11 &qpool12 + &qpool13 &qpool14 &qpool15>; + }; + }; + + soc: soc@ffe000000 { + spi@110000 { + flash@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "spansion,s25sl12801"; + reg = <0>; + spi-max-frequency = <40000000>; /* input clock */ + partition@u-boot { + label = "u-boot"; + reg = <0x00000000 0x00100000>; + read-only; + }; + partition@kernel { + label = "kernel"; + reg = <0x00100000 0x00500000>; + read-only; + }; + partition@dtb { + label = "dtb"; + reg = <0x00600000 0x00100000>; + read-only; + }; + partition@fs { + label = "file system"; + reg = <0x00700000 0x00900000>; + }; + }; + }; + + i2c@118100 { + eeprom@51 { + compatible = "at24,24c256"; + reg = <0x51>; + }; + eeprom@52 { + compatible = "at24,24c256"; + reg = <0x52>; + }; + }; + + i2c@119100 { + rtc@68 { + compatible = "dallas,ds3232"; + reg = <0x68>; + interrupts = <0x1 0x1 0 0>; + }; + }; + + pme: pme@316000 { + /* Commented out, use default allocation */ + /* fsl,pme-pdsr = <0x0 0x23000000 0x0 0x01000000>; */ + /* fsl,pme-sre = <0x0 0x24000000 0x0 0x00a00000>; */ + }; + + qman: qman@318000 { + /* Commented out, use default allocation */ + /* fsl,qman-fqd = <0x0 0x20000000 0x0 0x01000000>; */ + /* fsl,qman-pfdr = <0x0 0x21000000 0x0 0x01000000>; */ + }; + + bman: bman@31a000 { + /* Same as fsl,qman-*, use default allocation */ + /* fsl,bman-fbpr = <0x0 0x22000000 0x0 0x01000000>; */ + }; + + fman0: fman@400000 { + enet0: ethernet@e0000 { + tbi-handle = <&tbi0>; + phy-handle = <&phy_rgmii_0>; + phy-connection-type = "rgmii"; + }; + + mdio0: mdio@e1120 { + tbi0: tbi-phy@8 { + reg = <0x8>; + device_type = "tbi-phy"; + }; + + /* + * Virtual MDIO for the two on-board RGMII + * ports. The fsl,hydra-mdio-muxval property + * is already correct. + */ + hydra_mdio_rgmii: hydra-mdio-rgmii { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,hydra-mdio"; + fsl,mdio-handle = <&mdio0>; + fsl,hydra-mdio-muxval = <0x00>; + status = "disabled"; + + phy_rgmii_0: ethernet-phy@0 { + reg = <0x0>; + }; + phy_rgmii_1: ethernet-phy@1 { + reg = <0x1>; + }; + }; + + /* + * Virtual MDIO for the four-port SGMII card. + * The fsl,hydra-mdio-muxval property will be + * fixed-up by U-Boot based on the slot that + * the SGMII card is in. + * + * Note: we do not support DTSEC5 connected to + * SGMII, so this is the only SGMII node. + */ + hydra_mdio_sgmii: hydra-mdio-sgmii { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,hydra-mdio"; + fsl,mdio-handle = <&mdio0>; + fsl,hydra-mdio-muxval = <0x00>; + status = "disabled"; + + phy_sgmii_1c: ethernet-phy@1c { + reg = <0x1c>; + }; + phy_sgmii_1d: ethernet-phy@1d { + reg = <0x1d>; + }; + phy_sgmii_1e: ethernet-phy@1e { + reg = <0x1e>; + }; + phy_sgmii_1f: ethernet-phy@1f { + reg = <0x1f>; + }; + }; + }; + + enet1: ethernet@e2000 { + tbi-handle = <&tbi1>; + phy-handle = <&phy_sgmii_1d>; + phy-connection-type = "sgmii"; + }; + + mdio@e3120 { + tbi1: tbi-phy@8 { + reg = <8>; + device_type = "tbi-phy"; + }; + }; + + enet2: ethernet@e4000 { + tbi-handle = <&tbi2>; + phy-handle = <&phy_sgmii_1e>; + phy-connection-type = "sgmii"; + }; + + mdio@e5120 { + tbi2: tbi-phy@8 { + reg = <8>; + device_type = "tbi-phy"; + }; + }; + + enet3: ethernet@e6000 { + tbi-handle = <&tbi3>; + phy-handle = <&phy_sgmii_1f>; + phy-connection-type = "sgmii"; + }; + + mdio@e7120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe7120 0xee0>; + interrupts = <100 1 0 0>; + + tbi3: tbi-phy@8 { + reg = <8>; + device_type = "tbi-phy"; + }; + }; + + enet4: ethernet@e8000 { + tbi-handle = <&tbi4>; + phy-handle = <&phy_rgmii_1>; + phy-connection-type = "rgmii"; + }; + + mdio@e9120 { + tbi4: tbi-phy@8 { + reg = <8>; + device_type = "tbi-phy"; + }; + }; + + enet5: ethernet@f0000 { + /* + * phy-handle will be updated by U-Boot to + * reflect the actual slot the XAUI card is in. + */ + phy-handle = <&phy_xgmii_1>; + phy-connection-type = "xgmii"; + }; + + /* + * We only support one XAUI card, so the MDIO muxing + * is set by U-Boot, and Linux never touches it. + * Therefore, we don't need a virtual MDIO node. + * However, the phy address depends on the slot, so + * only one of the ethernet-phy nodes below will be + * used. + */ + hydra_mdio_xgmii: mdio@f1000 { + status = "disabled"; + + /* XAUI card in slot 1 */ + phy_xgmii_1: ethernet-phy@4 { + reg = <0x4>; + }; + + /* XAUI card in slot 2 */ + phy_xgmii_2: ethernet-phy@0 { + reg = <0x0>; + }; + }; + }; + }; + + rapidio@ffe0c0000 { + reg = <0xf 0xfe0c0000 0 0x11000>; + + port1 { + ranges = <0 0 0xc 0x20000000 0 0x10000000>; + }; + port2 { + ranges = <0 0 0xc 0x30000000 0 0x10000000>; + }; + }; + + localbus@ffe124000 { + reg = <0xf 0xfe124000 0 0x1000>; + ranges = <0 0 0xf 0xb8000000 0x04000000>; + + flash@0,0 { + compatible = "cfi-flash"; + /* + * Map 64Mb of 128MB NOR flash memory. Since highest + * line of address of NOR flash memory are set by + * FPGA, memory are divided into two pages equal to + * 64MB. One of the pages can be accessed at once. + */ + reg = <0 0 0x04000000>; + bank-width = <2>; + device-width = <2>; + }; + + nand@2,0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "fsl,elbc-fcm-nand"; + reg = <0x2 0x0 0x40000>; + + partition@0 { + label = "NAND U-Boot Image"; + reg = <0x0 0x02000000>; + read-only; + }; + + partition@2000000 { + label = "NAND Root File System"; + reg = <0x02000000 0x10000000>; + }; + + partition@12000000 { + label = "NAND Compressed RFS Image"; + reg = <0x12000000 0x08000000>; + }; + + partition@1a000000 { + label = "NAND Linux Kernel Image"; + reg = <0x1a000000 0x04000000>; + }; + + partition@1e000000 { + label = "NAND DTB Image"; + reg = <0x1e000000 0x01000000>; + }; + + partition@1f000000 { + label = "NAND Writable User area"; + reg = <0x1f000000 0x21000000>; + }; + }; + + board-control@3,0 { + compatible = "fsl,p5020ds-fpga", "fsl,fpga-ngpixis"; + reg = <3 0 0x30>; + }; + }; + + pci0: pcie@ffe200000 { + reg = <0xf 0xfe200000 0 0x1000>; + ranges = <0x02000000 0 0x80000000 0x0 0x80000000 0x0 0x10000000 + 0x01000000 0 0x00000000 0x0 0xff000000 0x0 0x00010000>; + pcie@0 { + ranges = <0x02000000 0 0x80000000 + 0x02000000 0 0x80000000 + 0 0x10000000 + + 0x01000000 0 0x00000000 + 0x01000000 0 0xff000000 + 0 0x00010000>; + }; + }; + + pci1: pcie@ffe201000 { + reg = <0xf 0xfe201000 0 0x1000>; + ranges = <0x02000000 0x0 0x90000000 0x0 0x90000000 0x0 0x10000000 + 0x01000000 0x0 0x00000000 0x0 0xff010000 0x0 0x00010000>; + pcie@0 { + ranges = <0x02000000 0 0x90000000 + 0x02000000 0 0x90000000 + 0 0x10000000 + + 0x01000000 0 0x00000000 + 0x01000000 0 0xff010000 + 0 0x00010000>; + }; + }; + + pci2: pcie@ffe202000 { + reg = <0xf 0xfe202000 0 0x1000>; + ranges = <0x02000000 0 0xa0000000 0x0 0xa0000000 0 0x10000000 + 0x01000000 0 0x00000000 0x0 0xff020000 0 0x00010000>; + pcie@0 { + ranges = <0x02000000 0 0xa0000000 + 0x02000000 0 0xa0000000 + 0 0x10000000 + + 0x01000000 0 0x00000000 + 0x01000000 0 0xff020000 + 0 0x00010000>; + }; + }; + + pci3: pcie@ffe203000 { + reg = <0xf 0xfe203000 0 0x1000>; + ranges = <0x02000000 0 0xb0000000 0x0 0xb0000000 0 0x08000000 + 0x01000000 0 0x00000000 0x0 0xff030000 0 0x00010000>; + pcie@0 { + ranges = <0x02000000 0 0xb0000000 + 0x02000000 0 0xb0000000 + 0 0x08000000 + + 0x01000000 0 0x00000000 + 0x01000000 0 0xff030000 + 0 0x00010000>; + }; + }; + + fsl,dpaa { + compatible = "fsl,p5020-dpaa", "fsl,dpaa"; + + ethernet@0 { + compatible = "fsl,p5020-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet0>; + status = "okay"; + }; + ethernet@1 { + compatible = "fsl,p5020-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet1>; + status = "disabled"; + }; + ethernet@2 { + compatible = "fsl,p5020-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet2>; + status = "disabled"; + }; + ethernet@3 { + compatible = "fsl,p5020-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet3>; + status = "disabled"; + }; + ethernet@4 { + compatible = "fsl,p5020-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet4>; + status = "okay"; + }; + ethernet@5 { + compatible = "fsl,p5020-dpa-ethernet", "fsl,dpa-ethernet"; + fsl,qman-channel = <&qpool1>; + fsl,fman-mac = <&enet5>; + status = "disabled"; + }; + }; + + chosen { + stdin = "serial0"; + stdout = "serial0"; + }; +}; diff --git a/sys/boot/fdt/dts/p5020si.dtsi b/sys/boot/fdt/dts/p5020si.dtsi new file mode 100644 index 00000000000..27699cbc7e0 --- /dev/null +++ b/sys/boot/fdt/dts/p5020si.dtsi @@ -0,0 +1,1389 @@ +/* + * P5020 Silicon Device Tree Source + * + * Copyright 2010-2011 Freescale Semiconductor Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Freescale Semiconductor nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* $FreeBSD$ */ + +/dts-v1/; + +/ { + compatible = "fsl,P5020"; + #address-cells = <2>; + #size-cells = <2>; + interrupt-parent = <&mpic>; + + aliases { + ccsr = &soc; + dcsr = &dcsr; + + ethernet0 = &enet0; + ethernet1 = &enet1; + ethernet2 = &enet2; + ethernet3 = &enet3; + ethernet4 = &enet4; + ethernet5 = &enet5; + serial0 = &serial0; + serial1 = &serial1; + serial2 = &serial2; + serial3 = &serial3; + pci0 = &pci0; + pci1 = &pci1; + pci2 = &pci2; + pci3 = &pci3; + usb0 = &usb0; + usb1 = &usb1; + dma0 = &dma0; + dma1 = &dma1; + bman = &bman; + qman = &qman; + pme = &pme; + rman = &rman; + sdhc = &sdhc; + msi0 = &msi0; + msi1 = &msi1; + msi2 = &msi2; + + crypto = &crypto; + sec_jr0 = &sec_jr0; + sec_jr1 = &sec_jr1; + sec_jr2 = &sec_jr2; + sec_jr3 = &sec_jr3; + rtic_a = &rtic_a; + rtic_b = &rtic_b; + rtic_c = &rtic_c; + rtic_d = &rtic_d; + sec_mon = &sec_mon; + + raideng = &raideng; + raideng_jr0 = &raideng_jr0; + raideng_jr1 = &raideng_jr1; + raideng_jr2 = &raideng_jr2; + raideng_jr3 = &raideng_jr3; + + fman0 = &fman0; + fman0_oh0 = &fman0_oh0; + fman0_oh1 = &fman0_oh1; + fman0_oh2 = &fman0_oh2; + fman0_oh3 = &fman0_oh3; + fman0_oh4 = &fman0_oh4; + fman0_oh5 = &fman0_oh5; + fman0_oh6 = &fman0_oh6; + fman0_rx0 = &fman0_rx0; + fman0_rx1 = &fman0_rx1; + fman0_rx2 = &fman0_rx2; + fman0_rx3 = &fman0_rx3; + fman0_rx4 = &fman0_rx4; + fman0_rx5 = &fman0_rx5; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu0: PowerPC,e5500@0 { + device_type = "cpu"; + reg = <0>; + bus-frequency = <799999998>; + next-level-cache = <&L2_0>; + L2_0: l2-cache { + next-level-cache = <&cpc>; + }; + }; + cpu1: PowerPC,e5500@1 { + device_type = "cpu"; + reg = <1>; + next-level-cache = <&L2_1>; + L2_1: l2-cache { + next-level-cache = <&cpc>; + }; + }; + }; + + dcsr: dcsr@f00000000 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "fsl,dcsr", "simple-bus"; + + dcsr-epu@0 { + compatible = "fsl,dcsr-epu"; + interrupts = <52 2 0 0 + 84 2 0 0 + 85 2 0 0>; + interrupt-parent = <&mpic>; + reg = <0x0 0x1000>; + }; + dcsr-npc { + compatible = "fsl,dcsr-npc"; + reg = <0x1000 0x1000 0x1000000 0x8000>; + }; + dcsr-nxc@2000 { + compatible = "fsl,dcsr-nxc"; + reg = <0x2000 0x1000>; + }; + dcsr-corenet { + compatible = "fsl,dcsr-corenet"; + reg = <0x8000 0x1000 0xB0000 0x1000>; + }; + dcsr-dpaa@9000 { + compatible = "fsl,p5020-dcsr-dpaa", "fsl,dcsr-dpaa"; + reg = <0x9000 0x1000>; + }; + dcsr-ocn@11000 { + compatible = "fsl,p5020-dcsr-ocn", "fsl,dcsr-ocn"; + reg = <0x11000 0x1000>; + }; + dcsr-ddr@12000 { + compatible = "fsl,dcsr-ddr"; + dev-handle = <&ddr1>; + reg = <0x12000 0x1000>; + }; + dcsr-ddr@13000 { + compatible = "fsl,dcsr-ddr"; + dev-handle = <&ddr2>; + reg = <0x13000 0x1000>; + }; + dcsr-nal@18000 { + compatible = "fsl,p5020-dcsr-nal", "fsl,dcsr-nal"; + reg = <0x18000 0x1000>; + }; + dcsr-rcpm@22000 { + compatible = "fsl,p5020-dcsr-rcpm", "fsl,dcsr-rcpm"; + reg = <0x22000 0x1000>; + }; + dcsr-cpu-sb-proxy@40000 { + compatible = "fsl,dcsr-e5500-sb-proxy", "fsl,dcsr-cpu-sb-proxy"; + cpu-handle = <&cpu0>; + reg = <0x40000 0x1000>; + }; + dcsr-cpu-sb-proxy@41000 { + compatible = "fsl,dcsr-e5500-sb-proxy", "fsl,dcsr-cpu-sb-proxy"; + cpu-handle = <&cpu1>; + reg = <0x41000 0x1000>; + }; + }; + + bman-portals@ff4000000 { + #address-cells = <0x1>; + #size-cells = <0x1>; + compatible = "bman-portals"; + ranges = <0x0 0xf 0xfde00000 0x200000>; + bman-portal@0 { + cell-index = <0x0>; + compatible = "fsl,p5020-bman-portal", "fsl,bman-portal"; + reg = <0x0 0x4000 0x100000 0x1000>; + interrupts = <105 2 0 0>; + }; + bman-portal@4000 { + cell-index = <0x1>; + compatible = "fsl,p5020-bman-portal", "fsl,bman-portal"; + reg = <0x4000 0x4000 0x101000 0x1000>; + interrupts = <107 2 0 0>; + }; + bman-portal@8000 { + cell-index = <2>; + compatible = "fsl,p5020-bman-portal", "fsl,bman-portal"; + reg = <0x8000 0x4000 0x102000 0x1000>; + interrupts = <109 2 0 0>; + }; + bman-portal@c000 { + cell-index = <0x3>; + compatible = "fsl,p5020-bman-portal", "fsl,bman-portal"; + reg = <0xc000 0x4000 0x103000 0x1000>; + interrupts = <111 2 0 0>; + }; + bman-portal@10000 { + cell-index = <0x4>; + compatible = "fsl,p5020-bman-portal", "fsl,bman-portal"; + reg = <0x10000 0x4000 0x104000 0x1000>; + interrupts = <113 2 0 0>; + }; + bman-portal@14000 { + cell-index = <0x5>; + compatible = "fsl,p5020-bman-portal", "fsl,bman-portal"; + reg = <0x14000 0x4000 0x105000 0x1000>; + interrupts = <115 2 0 0>; + }; + bman-portal@18000 { + cell-index = <0x6>; + compatible = "fsl,p5020-bman-portal", "fsl,bman-portal"; + reg = <0x18000 0x4000 0x106000 0x1000>; + interrupts = <117 2 0 0>; + }; + bman-portal@1c000 { + cell-index = <0x7>; + compatible = "fsl,p5020-bman-portal", "fsl,bman-portal"; + reg = <0x1c000 0x4000 0x107000 0x1000>; + interrupts = <119 2 0 0>; + }; + bman-portal@20000 { + cell-index = <0x8>; + compatible = "fsl,p5020-bman-portal", "fsl,bman-portal"; + reg = <0x20000 0x4000 0x108000 0x1000>; + interrupts = <121 2 0 0>; + }; + bman-portal@24000 { + cell-index = <0x9>; + compatible = "fsl,p5020-bman-portal", "fsl,bman-portal"; + reg = <0x24000 0x4000 0x109000 0x1000>; + interrupts = <123 2 0 0>; + }; + + buffer-pool@0 { + compatible = "fsl,p5020-bpool", "fsl,bpool"; + fsl,bpid = <0>; + fsl,bpool-cfg = <0 0x100 0 1 0 0x100>; + }; + }; + + qman-portals@ff4200000 { + #address-cells = <0x1>; + #size-cells = <0x1>; + compatible = "qman-portals"; + ranges = <0x0 0xf 0xfdc00000 0x200000>; + qportal0: qman-portal@0 { + cell-index = <0x0>; + compatible = "fsl,p5020-qman-portal", "fsl,qman-portal"; + reg = <0x0 0x4000 0x100000 0x1000>; + interrupts = <104 0x2 0 0>; + fsl,qman-channel-id = <0x0>; + }; + + qportal1: qman-portal@4000 { + cell-index = <0x1>; + compatible = "fsl,p5020-qman-portal", "fsl,qman-portal"; + reg = <0x4000 0x4000 0x101000 0x1000>; + interrupts = <106 0x2 0 0>; + fsl,qman-channel-id = <0x1>; + }; + + qportal2: qman-portal@8000 { + cell-index = <0x2>; + compatible = "fsl,p5020-qman-portal", "fsl,qman-portal"; + reg = <0x8000 0x4000 0x102000 0x1000>; + interrupts = <108 0x2 0 0>; + fsl,qman-channel-id = <0x2>; + }; + + qportal3: qman-portal@c000 { + cell-index = <0x3>; + compatible = "fsl,p5020-qman-portal", "fsl,qman-portal"; + reg = <0xc000 0x4000 0x103000 0x1000>; + interrupts = <110 0x2 0 0>; + fsl,qman-channel-id = <0x3>; + }; + + qportal4: qman-portal@10000 { + cell-index = <0x4>; + compatible = "fsl,p5020-qman-portal", "fsl,qman-portal"; + reg = <0x10000 0x4000 0x104000 0x1000>; + interrupts = <112 0x2 0 0>; + fsl,qman-channel-id = <0x4>; + }; + + qportal5: qman-portal@14000 { + cell-index = <0x5>; + compatible = "fsl,p5020-qman-portal", "fsl,qman-portal"; + reg = <0x14000 0x4000 0x105000 0x1000>; + interrupts = <114 0x2 0 0>; + fsl,qman-channel-id = <0x5>; + }; + + qportal6: qman-portal@18000 { + cell-index = <0x6>; + compatible = "fsl,p5020-qman-portal", "fsl,qman-portal"; + reg = <0x18000 0x4000 0x106000 0x1000>; + interrupts = <116 0x2 0 0>; + fsl,qman-channel-id = <0x6>; + }; + + qportal7: qman-portal@1c000 { + cell-index = <0x7>; + compatible = "fsl,p5020-qman-portal", "fsl,qman-portal"; + reg = <0x1c000 0x4000 0x107000 0x1000>; + interrupts = <118 0x2 0 0>; + fsl,qman-channel-id = <0x7>; + }; + + qportal8: qman-portal@20000 { + cell-index = <0x8>; + compatible = "fsl,p5020-qman-portal", "fsl,qman-portal"; + reg = <0x20000 0x4000 0x108000 0x1000>; + interrupts = <120 0x2 0 0>; + fsl,qman-channel-id = <0x8>; + }; + + qportal9: qman-portal@24000 { + cell-index = <0x9>; + compatible = "fsl,p5020-qman-portal", "fsl,qman-portal"; + reg = <0x24000 0x4000 0x109000 0x1000>; + interrupts = <122 0x2 0 0>; + fsl,qman-channel-id = <0x9>; + }; + + qpool1: qman-pool@1 { + cell-index = <1>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x21>; + }; + + qpool2: qman-pool@2 { + cell-index = <2>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x22>; + }; + + qpool3: qman-pool@3 { + cell-index = <3>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x23>; + }; + + qpool4: qman-pool@4 { + cell-index = <4>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x24>; + }; + + qpool5: qman-pool@5 { + cell-index = <5>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x25>; + }; + + qpool6: qman-pool@6 { + cell-index = <6>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x26>; + }; + + qpool7: qman-pool@7 { + cell-index = <7>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x27>; + }; + + qpool8: qman-pool@8 { + cell-index = <8>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x28>; + }; + + qpool9: qman-pool@9 { + cell-index = <9>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x29>; + }; + + qpool10: qman-pool@10 { + cell-index = <10>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2a>; + }; + + qpool11: qman-pool@11 { + cell-index = <11>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2b>; + }; + + qpool12: qman-pool@12 { + cell-index = <12>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2c>; + }; + + qpool13: qman-pool@13 { + cell-index = <13>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2d>; + }; + + qpool14: qman-pool@14 { + cell-index = <14>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2e>; + }; + + qpool15: qman-pool@15 { + cell-index = <15>; + compatible = "fsl,p5020-qman-pool-channel", "fsl,qman-pool-channel"; + fsl,qman-channel-id = <0x2f>; + }; + }; + + soc: soc@ffe000000 { + #address-cells = <1>; + #size-cells = <1>; + device_type = "soc"; + compatible = "simple-bus"; + + bus-frequency = <0>; // Filled out by kernel. + + ranges = <0x00000000 0xf 0xfe000000 0x1000000>; + reg = <0xf 0xfe000000 0 0x00001000>; + + soc-sram-error { + compatible = "fsl,soc-sram-error"; + interrupts = <16 2 1 29>; + }; + + corenet-law@0 { + compatible = "fsl,corenet-law"; + reg = <0x0 0x1000>; + fsl,num-laws = <32>; + }; + + ddr1: memory-controller@8000 { + compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller"; + reg = <0x8000 0x1000>; + interrupts = <16 2 1 23>; + }; + + ddr2: memory-controller@9000 { + compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller"; + reg = <0x9000 0x1000>; + interrupts = <16 2 1 22>; + }; + + cpc: l3-cache-controller@10000 { + compatible = "fsl,p5020-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache"; + reg = <0x10000 0x1000 + 0x11000 0x1000>; + interrupts = <16 2 1 27 + 16 2 1 26>; + }; + + corenet-cf@18000 { + compatible = "fsl,corenet-cf"; + reg = <0x18000 0x1000>; + interrupts = <16 2 1 31>; + fsl,ccf-num-csdids = <32>; + fsl,ccf-num-snoopids = <32>; + }; + + iommu@20000 { + compatible = "fsl,pamu-v1.0", "fsl,pamu"; + reg = <0x20000 0x4000>; + interrupts = < + 24 2 0 0 + 16 2 1 30>; + }; + + mpic: pic@40000 { + clock-frequency = <0>; + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <4>; + reg = <0x40000 0x40000>; + compatible = "fsl,mpic", "chrp,open-pic"; + device_type = "open-pic"; + }; + + msi0: msi@41600 { + compatible = "fsl,mpic-msi"; + reg = <0x41600 0x200>; + msi-available-ranges = <0 0x100>; + interrupts = < + 0xe0 0 0 0 + 0xe1 0 0 0 + 0xe2 0 0 0 + 0xe3 0 0 0 + 0xe4 0 0 0 + 0xe5 0 0 0 + 0xe6 0 0 0 + 0xe7 0 0 0>; + }; + + msi1: msi@41800 { + compatible = "fsl,mpic-msi"; + reg = <0x41800 0x200>; + msi-available-ranges = <0 0x100>; + interrupts = < + 0xe8 0 0 0 + 0xe9 0 0 0 + 0xea 0 0 0 + 0xeb 0 0 0 + 0xec 0 0 0 + 0xed 0 0 0 + 0xee 0 0 0 + 0xef 0 0 0>; + }; + + msi2: msi@41a00 { + compatible = "fsl,mpic-msi"; + reg = <0x41a00 0x200>; + msi-available-ranges = <0 0x100>; + interrupts = < + 0xf0 0 0 0 + 0xf1 0 0 0 + 0xf2 0 0 0 + 0xf3 0 0 0 + 0xf4 0 0 0 + 0xf5 0 0 0 + 0xf6 0 0 0 + 0xf7 0 0 0>; + }; + + guts: global-utilities@e0000 { + compatible = "fsl,qoriq-device-config-1.0"; + reg = <0xe0000 0xe00>; + fsl,has-rstcr; + #sleep-cells = <1>; + fsl,liodn-bits = <12>; + }; + + pins: global-utilities@e0e00 { + compatible = "fsl,qoriq-pin-control-1.0"; + reg = <0xe0e00 0x200>; + #sleep-cells = <2>; + }; + + clockgen: global-utilities@e1000 { + compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0"; + reg = <0xe1000 0x1000>; + clock-frequency = <0>; + }; + + rcpm: global-utilities@e2000 { + compatible = "fsl,qoriq-rcpm-1.0"; + reg = <0xe2000 0x1000>; + #sleep-cells = <1>; + }; + + sfp: sfp@e8000 { + compatible = "fsl,p5020-sfp", "fsl,qoriq-sfp-1.0"; + reg = <0xe8000 0x1000>; + }; + + serdes: serdes@ea000 { + compatible = "fsl,p5020-serdes"; + reg = <0xea000 0x1000>; + }; + + dma0: dma@100300 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "fsl,p5020-dma", "fsl,eloplus-dma"; + reg = <0x100300 0x4>; + ranges = <0x0 0x100100 0x200>; + cell-index = <0>; + dma-channel@0 { + compatible = "fsl,p5020-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x0 0x80>; + cell-index = <0>; + interrupts = <28 2 0 0>; + }; + dma-channel@80 { + compatible = "fsl,p5020-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x80 0x80>; + cell-index = <1>; + interrupts = <29 2 0 0>; + }; + dma-channel@100 { + compatible = "fsl,p5020-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x100 0x80>; + cell-index = <2>; + interrupts = <30 2 0 0>; + }; + dma-channel@180 { + compatible = "fsl,p5020-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x180 0x80>; + cell-index = <3>; + interrupts = <31 2 0 0>; + }; + }; + + dma1: dma@101300 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "fsl,p5020-dma", "fsl,eloplus-dma"; + reg = <0x101300 0x4>; + ranges = <0x0 0x101100 0x200>; + cell-index = <1>; + dma-channel@0 { + compatible = "fsl,p5020-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x0 0x80>; + cell-index = <0>; + interrupts = <32 2 0 0>; + }; + dma-channel@80 { + compatible = "fsl,p5020-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x80 0x80>; + cell-index = <1>; + interrupts = <33 2 0 0>; + }; + dma-channel@100 { + compatible = "fsl,p5020-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x100 0x80>; + cell-index = <2>; + interrupts = <34 2 0 0>; + }; + dma-channel@180 { + compatible = "fsl,p5020-dma-channel", + "fsl,eloplus-dma-channel"; + reg = <0x180 0x80>; + cell-index = <3>; + interrupts = <35 2 0 0>; + }; + }; + + spi@110000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,p5020-espi", "fsl,mpc8536-espi"; + reg = <0x110000 0x1000>; + interrupts = <53 0x2 0 0>; + fsl,espi-num-chipselects = <4>; + }; + + sdhc: sdhc@114000 { + compatible = "fsl,p5020-esdhc", "fsl,esdhc"; + reg = <0x114000 0x1000>; + interrupts = <48 2 0 0>; + sdhci,auto-cmd12; + clock-frequency = <0>; + }; + + i2c@118000 { + #address-cells = <1>; + #size-cells = <0>; + cell-index = <0>; + compatible = "fsl-i2c"; + reg = <0x118000 0x100>; + interrupts = <38 2 0 0>; + dfsrr; + }; + + i2c@118100 { + #address-cells = <1>; + #size-cells = <0>; + cell-index = <1>; + compatible = "fsl-i2c"; + reg = <0x118100 0x100>; + interrupts = <38 2 0 0>; + dfsrr; + }; + + i2c@119000 { + #address-cells = <1>; + #size-cells = <0>; + cell-index = <2>; + compatible = "fsl-i2c"; + reg = <0x119000 0x100>; + interrupts = <39 2 0 0>; + dfsrr; + }; + + i2c@119100 { + #address-cells = <1>; + #size-cells = <0>; + cell-index = <3>; + compatible = "fsl-i2c"; + reg = <0x119100 0x100>; + interrupts = <39 2 0 0>; + dfsrr; + }; + + serial0: serial@11c500 { + cell-index = <0>; + device_type = "serial"; + compatible = "ns16550"; + reg = <0x11c500 0x100>; + clock-frequency = <0>; + interrupts = <36 2 0 0>; + }; + + serial1: serial@11c600 { + cell-index = <1>; + device_type = "serial"; + compatible = "ns16550"; + reg = <0x11c600 0x100>; + clock-frequency = <0>; + interrupts = <36 2 0 0>; + }; + + serial2: serial@11d500 { + cell-index = <2>; + device_type = "serial"; + compatible = "ns16550"; + reg = <0x11d500 0x100>; + clock-frequency = <0>; + interrupts = <37 2 0 0>; + }; + + serial3: serial@11d600 { + cell-index = <3>; + device_type = "serial"; + compatible = "ns16550"; + reg = <0x11d600 0x100>; + clock-frequency = <0>; + interrupts = <37 2 0 0>; + }; + + gpio0: gpio@130000 { + compatible = "fsl,p5020-gpio", "fsl,qoriq-gpio"; + reg = <0x130000 0x1000>; + interrupts = <55 2 0 0>; + #gpio-cells = <2>; + gpio-controller; + }; + + rman: rman@1e0000 { + compatible = "fsl,rman"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0x1e0000 0x20000>; + reg = <0x1e0000 0x20000>; + interrupts = <16 2 1 11>; /* err_irq */ + fsl,qman-channels-id = <0x62 0x63>; + + inbound-block@0 { + compatible = "fsl,rman-inbound-block"; + reg = <0x0 0x800>; + }; + global-cfg@b00 { + compatible = "fsl,rman-global-cfg"; + reg = <0xb00 0x500>; + }; + inbound-block@1000 { + compatible = "fsl,rman-inbound-block"; + reg = <0x1000 0x800>; + }; + inbound-block@2000 { + compatible = "fsl,rman-inbound-block"; + reg = <0x2000 0x800>; + }; + inbound-block@3000 { + compatible = "fsl,rman-inbound-block"; + reg = <0x3000 0x800>; + }; + }; + + usb0: usb@210000 { + compatible = "fsl,p5020-usb2-mph", + "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; + reg = <0x210000 0x1000>; + #address-cells = <1>; + #size-cells = <0>; + interrupts = <44 0x2 0 0>; + phy_type = "utmi"; + port0; + }; + + usb1: usb@211000 { + compatible = "fsl,p5020-usb2-dr", + "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; + reg = <0x211000 0x1000>; + #address-cells = <1>; + #size-cells = <0>; + interrupts = <45 0x2 0 0>; + dr_mode = "host"; + phy_type = "utmi"; + }; + + sata@220000 { + compatible = "fsl,p5020-sata", "fsl,pq-sata-v2"; + reg = <0x220000 0x1000>; + interrupts = <68 0x2 0 0>; + }; + + sata@221000 { + compatible = "fsl,p5020-sata", "fsl,pq-sata-v2"; + reg = <0x221000 0x1000>; + interrupts = <69 0x2 0 0>; + }; + + crypto: crypto@300000 { + compatible = "fsl,sec-v4.2", "fsl,sec-v4.0"; + #address-cells = <1>; + #size-cells = <1>; + reg = <0x300000 0x10000>; + ranges = <0 0x300000 0x10000>; + interrupts = <92 2 0 0>; + + sec_jr0: jr@1000 { + compatible = "fsl,sec-v4.2-job-ring", + "fsl,sec-v4.0-job-ring"; + reg = <0x1000 0x1000>; + interrupts = <88 2 0 0>; + }; + + sec_jr1: jr@2000 { + compatible = "fsl,sec-v4.2-job-ring", + "fsl,sec-v4.0-job-ring"; + reg = <0x2000 0x1000>; + interrupts = <89 2 0 0>; + }; + + sec_jr2: jr@3000 { + compatible = "fsl,sec-v4.2-job-ring", + "fsl,sec-v4.0-job-ring"; + reg = <0x3000 0x1000>; + interrupts = <90 2 0 0>; + }; + + sec_jr3: jr@4000 { + compatible = "fsl,sec-v4.2-job-ring", + "fsl,sec-v4.0-job-ring"; + reg = <0x4000 0x1000>; + interrupts = <91 2 0 0>; + }; + + rtic@6000 { + compatible = "fsl,sec-v4.2-rtic", + "fsl,sec-v4.0-rtic"; + #address-cells = <1>; + #size-cells = <1>; + reg = <0x6000 0x100>; + ranges = <0x0 0x6100 0xe00>; + + rtic_a: rtic-a@0 { + compatible = "fsl,sec-v4.2-rtic-memory", + "fsl,sec-v4.0-rtic-memory"; + reg = <0x00 0x20 0x100 0x80>; + }; + + rtic_b: rtic-b@20 { + compatible = "fsl,sec-v4.2-rtic-memory", + "fsl,sec-v4.0-rtic-memory"; + reg = <0x20 0x20 0x200 0x80>; + }; + + rtic_c: rtic-c@40 { + compatible = "fsl,sec-v4.2-rtic-memory", + "fsl,sec-v4.0-rtic-memory"; + reg = <0x40 0x20 0x300 0x80>; + }; + + rtic_d: rtic-d@60 { + compatible = "fsl,sec-v4.2-rtic-memory", + "fsl,sec-v4.0-rtic-memory"; + reg = <0x60 0x20 0x500 0x80>; + }; + }; + }; + + sec_mon: sec_mon@314000 { + compatible = "fsl,sec-v4.2-mon", "fsl,sec-v4.0-mon"; + reg = <0x314000 0x1000>; + interrupts = <93 2 0 0>; + }; + + raideng: raideng@320000 { + compatible = "fsl,raideng-v1.0"; + #address-cells = <1>; + #size-cells = <1>; + reg = <0x320000 0x10000>; + ranges = <0 0x320000 0x10000>; + + raideng_jq0@1000 { + compatible = "fsl,raideng-v1.0-job-queue"; + #address-cells = <1>; + #size-cells = <1>; + reg = <0x1000 0x1000>; + ranges = <0x0 0x1000 0x1000>; + + raideng_jr0: jr@0 { + compatible = "fsl,raideng-v1.0-job-ring", "fsl,raideng-v1.0-hp-ring"; + reg = <0x0 0x400>; + interrupts = <139 2 0 0>; + interrupt-parent = <&mpic>; + }; + + raideng_jr1: jr@400 { + compatible = "fsl,raideng-v1.0-job-ring", "fsl,raideng-v1.0-lp-ring"; + reg = <0x400 0x400>; + interrupts = <140 2 0 0>; + interrupt-parent = <&mpic>; + }; + }; + + raideng_jq1@2000 { + compatible = "fsl,raideng-v1.0-job-queue"; + #address-cells = <1>; + #size-cells = <1>; + reg = <0x2000 0x1000>; + ranges = <0x0 0x2000 0x1000>; + + raideng_jr2: jr@0 { + compatible = "fsl,raideng-v1.0-job-ring", "fsl,raideng-v1.0-hp-ring"; + reg = <0x0 0x400>; + interrupts = <141 2 0 0>; + interrupt-parent = <&mpic>; + }; + + raideng_jr3: jr@400 { + compatible = "fsl,raideng-v1.0-job-ring", "fsl,raideng-v1.0-lp-ring"; + reg = <0x400 0x400>; + interrupts = <142 2 0 0>; + interrupt-parent = <&mpic>; + }; + }; + }; + + pme: pme@316000 { + compatible = "fsl,pme"; + reg = <0x316000 0x10000>; + /* fsl,pme-pdsr = <0x0 0x23000000 0x0 0x01000000>; */ + /* fsl,pme-sre = <0x0 0x24000000 0x0 0x00a00000>; */ + interrupts = <16 2 1 5>; + }; + + qman: qman@318000 { + compatible = "fsl,p5020-qman", "fsl,qman"; + reg = <0x318000 0x1000>; + interrupts = <16 2 1 3>; + /* Commented out, use default allocation */ + /* fsl,qman-fqd = <0x0 0x20000000 0x0 0x01000000>; */ + /* fsl,qman-pfdr = <0x0 0x21000000 0x0 0x01000000>; */ + }; + + bman: bman@31a000 { + compatible = "fsl,p5020-bman", "fsl,bman"; + reg = <0x31a000 0x1000>; + interrupts = <16 2 1 2>; + /* Same as fsl,qman-*, use default allocation */ + /* fsl,bman-fbpr = <0x0 0x22000000 0x0 0x01000000>; */ + }; + + fman0: fman@400000 { + #address-cells = <1>; + #size-cells = <1>; + cell-index = <0>; + compatible = "fsl,p5020-fman", "fsl,fman", "simple-bus"; + ranges = <0 0x400000 0x100000>; + reg = <0x400000 0x100000>; + clock-frequency = <0>; + interrupts = < + 96 2 0 0 + 16 2 1 1>; + + cc@0 { + compatible = "fsl,p5020-fman-cc", "fsl,fman-cc"; + }; + + parser@c7000 { + compatible = "fsl,p5020-fman-parser", "fsl,fman-parser"; + reg = <0xc7000 0x1000>; + }; + + keygen@c1000 { + compatible = "fsl,p5020-fman-keygen", "fsl,fman-keygen"; + reg = <0xc1000 0x1000>; + }; + + policer@c0000 { + compatible = "fsl,p5020-fman-policer", "fsl,fman-policer"; + reg = <0xc0000 0x1000>; + }; + + muram@0 { + compatible = "fsl,p5020-fman-muram", "fsl,fman-muram"; + reg = <0x0 0x28000>; + }; + + bmi@80000 { + compatible = "fsl,p5020-fman-bmi", "fsl,fman-bmi"; + reg = <0x80000 0x400>; + }; + + qmi@80400 { + compatible = "fsl,p5020-fman-qmi", "fsl,fman-qmi"; + reg = <0x80400 0x400>; + }; + + fman0_rx0: port@88000 { + cell-index = <0>; + compatible = "fsl,p5020-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x88000 0x1000>; + }; + fman0_rx1: port@89000 { + cell-index = <1>; + compatible = "fsl,p5020-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x89000 0x1000>; + }; + fman0_rx2: port@8a000 { + cell-index = <2>; + compatible = "fsl,p5020-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x8a000 0x1000>; + }; + fman0_rx3: port@8b000 { + cell-index = <3>; + compatible = "fsl,p5020-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x8b000 0x1000>; + }; + fman0_rx4: port@8c000 { + cell-index = <4>; + compatible = "fsl,p5020-fman-port-1g-rx", "fsl,fman-port-1g-rx"; + reg = <0x8c000 0x1000>; + }; + fman0_rx5: port@90000 { + cell-index = <0>; + compatible = "fsl,p5020-fman-port-10g-rx", "fsl,fman-port-10g-rx"; + reg = <0x90000 0x1000>; + }; + + fman0_tx5: port@b0000 { + cell-index = <0>; + compatible = "fsl,p5020-fman-port-10g-tx", "fsl,fman-port-10g-tx"; + reg = <0xb0000 0x1000>; + fsl,qman-channel-id = <0x40>; + }; + fman0_tx0: port@a8000 { + cell-index = <0>; + compatible = "fsl,p5020-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xa8000 0x1000>; + fsl,qman-channel-id = <0x41>; + }; + fman0_tx1: port@a9000 { + cell-index = <1>; + compatible = "fsl,p5020-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xa9000 0x1000>; + fsl,qman-channel-id = <0x42>; + }; + fman0_tx2: port@aa000 { + cell-index = <2>; + compatible = "fsl,p5020-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xaa000 0x1000>; + fsl,qman-channel-id = <0x43>; + }; + fman0_tx3: port@ab000 { + cell-index = <3>; + compatible = "fsl,p5020-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xab000 0x1000>; + fsl,qman-channel-id = <0x44>; + }; + fman0_tx4: port@ac000 { + cell-index = <4>; + compatible = "fsl,p5020-fman-port-1g-tx", "fsl,fman-port-1g-tx"; + reg = <0xac000 0x1000>; + fsl,qman-channel-id = <0x45>; + }; + + fman0_oh0: port@81000 { + cell-index = <0>; + compatible = "fsl,p5020-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x81000 0x1000>; + fsl,qman-channel-id = <0x46>; + }; + fman0_oh1: port@82000 { + cell-index = <1>; + compatible = "fsl,p5020-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x82000 0x1000>; + fsl,qman-channel-id = <0x47>; + }; + fman0_oh2: port@83000 { + cell-index = <2>; + compatible = "fsl,p5020-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x83000 0x1000>; + fsl,qman-channel-id = <0x48>; + }; + fman0_oh3: port@84000 { + cell-index = <3>; + compatible = "fsl,p5020-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x84000 0x1000>; + fsl,qman-channel-id = <0x49>; + }; + fman0_oh4: port@85000 { + cell-index = <4>; + compatible = "fsl,p5020-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x85000 0x1000>; + fsl,qman-channel-id = <0x4a>; + }; + fman0_oh5: port@86000 { + cell-index = <5>; + compatible = "fsl,p5020-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x86000 0x1000>; + fsl,qman-channel-id = <0x4b>; + }; + fman0_oh6: port@87000 { + cell-index = <6>; + compatible = "fsl,p5020-fman-port-oh", "fsl,fman-port-oh"; + reg = <0x87000 0x1000>; + }; + + enet0: ethernet@e0000 { + cell-index = <0>; + compatible = "fsl,p5020-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe0000 0x1000>; + fsl,port-handles = <&fman0_rx0 &fman0_tx0>; + ptimer-handle = <&ptp_timer0>; + }; + + mdio0: mdio@e1120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-mdio"; + reg = <0xe1120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet1: ethernet@e2000 { + cell-index = <1>; + compatible = "fsl,p5020-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe2000 0x1000>; + fsl,port-handles = <&fman0_rx1 &fman0_tx1>; + ptimer-handle = <&ptp_timer0>; + }; + + mdio@e3120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe3120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet2: ethernet@e4000 { + cell-index = <2>; + compatible = "fsl,p5020-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe4000 0x1000>; + fsl,port-handles = <&fman0_rx2 &fman0_tx2>; + ptimer-handle = <&ptp_timer0>; + }; + + mdio@e5120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe5120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet3: ethernet@e6000 { + cell-index = <3>; + compatible = "fsl,p5020-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe6000 0x1000>; + fsl,port-handles = <&fman0_rx3 &fman0_tx3>; + ptimer-handle = <&ptp_timer0>; + }; + + mdio@e7120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe7120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet4: ethernet@e8000 { + cell-index = <4>; + compatible = "fsl,p5020-fman-1g-mac", "fsl,fman-1g-mac"; + reg = <0xe8000 0x1000>; + fsl,port-handles = <&fman0_rx4 &fman0_tx4>; + ptimer-handle = <&ptp_timer0>; + }; + + mdio@e9120 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-tbi"; + reg = <0xe9120 0xee0>; + interrupts = <100 1 0 0>; + }; + + enet5: ethernet@f0000 { + cell-index = <0>; + compatible = "fsl,p5020-fman-10g-mac", "fsl,fman-10g-mac"; + reg = <0xf0000 0x1000>; + fsl,port-handles = <&fman0_rx5 &fman0_tx5>; + }; + + mdio@f1000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,fman-xmdio"; + reg = <0xf1000 0x1000>; + interrupts = <100 1 0 0>; + }; + + ptp_timer0: rtc@fe000 { + compatible = "fsl,fman-rtc"; + reg = <0xfe000 0x1000>; + }; + }; + }; + + rapidio@ffe0c0000 { + compatible = "fsl,srio"; + interrupts = <16 2 1 11>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + + port1 { + #address-cells = <2>; + #size-cells = <2>; + cell-index = <1>; + }; + + port2 { + #address-cells = <2>; + #size-cells = <2>; + cell-index = <2>; + }; + }; + + localbus@ffe124000 { + compatible = "fsl,p5020-rev1.0-elbc", "simple-bus", "fsl,elbc"; + interrupts = < + 25 2 0 0 + 16 2 1 19 + >; + #address-cells = <2>; + #size-cells = <1>; + }; + + pci0: pcie@ffe200000 { + compatible = "fsl,p5020-pcie", "fsl,qoriq-pcie-v2.2"; + device_type = "pci"; + status = "okay"; + #size-cells = <2>; + #address-cells = <3>; + cell-index = <0>; + bus-range = <0x0 0xff>; + clock-frequency = <0x1fca055>; + fsl,msi = <&msi0>; + interrupts = <16 2 1 15>; + + pcie@0 { + reg = <0 0 0 0 0>; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + device_type = "pci"; + interrupts = <16 2 1 15>; + interrupt-map-mask = <0xf800 0 0 7>; + interrupt-map = < + /* IDSEL 0x0 */ + 0000 0 0 1 &mpic 40 1 0 0 + 0000 0 0 2 &mpic 1 1 0 0 + 0000 0 0 3 &mpic 2 1 0 0 + 0000 0 0 4 &mpic 3 1 0 0 + >; + }; + }; + + pci1: pcie@ffe201000 { + compatible = "fsl,p5020-pcie", "fsl,qoriq-pcie-v2.2"; + device_type = "pci"; + status = "disabled"; + #size-cells = <2>; + #address-cells = <3>; + cell-index = <1>; + bus-range = <0 0xff>; + clock-frequency = <0x1fca055>; + fsl,msi = <&msi1>; + interrupts = <16 2 1 14>; + pcie@0 { + reg = <0 0 0 0 0>; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + device_type = "pci"; + interrupts = <16 2 1 14>; + interrupt-map-mask = <0xf800 0 0 7>; + interrupt-map = < + /* IDSEL 0x0 */ + 0000 0 0 1 &mpic 41 1 0 0 + 0000 0 0 2 &mpic 5 1 0 0 + 0000 0 0 3 &mpic 6 1 0 0 + 0000 0 0 4 &mpic 7 1 0 0 + >; + }; + }; + + pci2: pcie@ffe202000 { + compatible = "fsl,p5020-pcie", "fsl,qoriq-pcie-v2.2"; + device_type = "pci"; + status = "okay"; + #size-cells = <2>; + #address-cells = <3>; + cell-index = <2>; + bus-range = <0x0 0xff>; + clock-frequency = <0x1fca055>; + fsl,msi = <&msi2>; + interrupts = <16 2 1 13>; + pcie@0 { + reg = <0 0 0 0 0>; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + device_type = "pci"; + interrupts = <16 2 1 13>; + interrupt-map-mask = <0xf800 0 0 7>; + interrupt-map = < + /* IDSEL 0x0 */ + 0000 0 0 1 &mpic 42 1 0 0 + 0000 0 0 2 &mpic 9 1 0 0 + 0000 0 0 3 &mpic 10 1 0 0 + 0000 0 0 4 &mpic 11 1 0 0 + >; + }; + }; + + pci3: pcie@ffe203000 { + compatible = "fsl,p5020-pcie", "fsl,qoriq-pcie-v2.2"; + device_type = "pci"; + status = "disabled"; + #size-cells = <2>; + #address-cells = <3>; + cell-index = <3>; + bus-range = <0x0 0xff>; + clock-frequency = <0x1fca055>; + fsl,msi = <&msi2>; + interrupts = <16 2 1 12>; + pcie@0 { + reg = <0 0 0 0 0>; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + device_type = "pci"; + interrupts = <16 2 1 12>; + interrupt-map-mask = <0xf800 0 0 7>; + interrupt-map = < + /* IDSEL 0x0 */ + 0000 0 0 1 &mpic 43 1 0 0 + 0000 0 0 2 &mpic 0 1 0 0 + 0000 0 0 3 &mpic 4 1 0 0 + 0000 0 0 4 &mpic 8 1 0 0 + >; + }; + }; +}; diff --git a/sys/boot/fdt/dts/sheevaplug.dts b/sys/boot/fdt/dts/sheevaplug.dts index cbfde624665..3d347da19df 100644 --- a/sys/boot/fdt/dts/sheevaplug.dts +++ b/sys/boot/fdt/dts/sheevaplug.dts @@ -71,48 +71,33 @@ reg = <0x0 0x20000000>; // 512M at 0x0 }; - localbus@f1000000 { + localbus@0 { #address-cells = <2>; #size-cells = <1>; compatible = "mrvl,lbc"; + bank-count = <3>; /* This reflects CPU decode windows setup. */ - ranges = <0x0 0x0f 0xf9300000 0x00100000 - 0x1 0x1e 0xfa000000 0x00100000 - 0x2 0x1d 0xfa100000 0x02000000 - 0x3 0x1b 0xfc100000 0x00000400>; + ranges = <0x0 0x2f 0xf9300000 0x00100000>; - nor@0,0 { + nand@0,0 { #address-cells = <1>; #size-cells = <1>; - compatible = "cfi-flash"; + compatible = "mrvl,nfc"; reg = <0x0 0x0 0x00100000>; bank-width = <2>; device-width = <1>; - }; - led@1,0 { - #address-cells = <1>; - #size-cells = <1>; - compatible = "led"; - reg = <0x1 0x0 0x00100000>; - }; + slice@0 { + reg = <0x0 0x200000>; + label = "u-boot"; + read-only; + }; - nor@2,0 { - #address-cells = <1>; - #size-cells = <1>; - compatible = "cfi-flash"; - reg = <0x2 0x0 0x02000000>; - bank-width = <2>; - device-width = <1>; - }; - - nand@3,0 { - #address-cells = <1>; - #size-cells = <1>; - reg = <0x3 0x0 0x00100000>; - bank-width = <2>; - device-width = <1>; + slice@200000 { + reg = <0x200000 0x1fe00000>; + label = "root"; + }; }; }; diff --git a/sys/boot/fdt/fdt_loader_cmd.c b/sys/boot/fdt/fdt_loader_cmd.c index b053db03622..b52d92f972a 100644 --- a/sys/boot/fdt/fdt_loader_cmd.c +++ b/sys/boot/fdt/fdt_loader_cmd.c @@ -57,11 +57,17 @@ __FBSDID("$FreeBSD$"); #define STR(number) #number #define STRINGIFY(number) STR(number) -#define COPYOUT(s,d,l) archsw.arch_copyout((vm_offset_t)(s), d, l) +#define COPYOUT(s,d,l) archsw.arch_copyout(s, d, l) +#define COPYIN(s,d,l) archsw.arch_copyin(s, d, l) #define FDT_STATIC_DTB_SYMBOL "fdt_static_dtb" +/* Local copy of FDT */ static struct fdt_header *fdtp = NULL; +/* Size of FDT blob */ +static size_t fdtp_size = 0; +/* Location of FDT in kernel or module */ +static vm_offset_t fdtp_va = 0; static int fdt_cmd_nyi(int argc, char *argv[]); @@ -98,21 +104,19 @@ static const struct cmdtab commands[] = { static char cwd[FDT_CWD_LEN] = "/"; static vm_offset_t -fdt_find_static_dtb(void) +fdt_find_static_dtb() { + Elf_Dyn dyn; Elf_Sym sym; - vm_offset_t dyntab, esym; + vm_offset_t dyntab, esym, strtab, symtab, fdt_start; uint64_t offs; struct preloaded_file *kfp; struct file_metadata *md; - Elf_Sym *symtab; - Elf_Dyn *dyn; - char *strtab, *strp; - int i, sym_count; + char *strp; + int sym_count; - symtab = NULL; - dyntab = esym = 0; - strtab = strp = NULL; + symtab = strtab = dyntab = esym = 0; + strp = NULL; offs = __elfN(relocation_offset); @@ -123,28 +127,29 @@ fdt_find_static_dtb(void) md = file_findmetadata(kfp, MODINFOMD_ESYM); if (md == NULL) return (0); - COPYOUT(md->md_data, &esym, sizeof(esym)); + bcopy(md->md_data, &esym, sizeof(esym)); + // esym is already offset md = file_findmetadata(kfp, MODINFOMD_DYNAMIC); if (md == NULL) return (0); - COPYOUT(md->md_data, &dyntab, sizeof(dyntab)); - + bcopy(md->md_data, &dyntab, sizeof(dyntab)); dyntab += offs; /* Locate STRTAB and DYNTAB */ - for (dyn = (Elf_Dyn *)dyntab; dyn->d_tag != DT_NULL; dyn++) { - if (dyn->d_tag == DT_STRTAB) { - strtab = (char *)(uintptr_t)(dyn->d_un.d_ptr + offs); - continue; - } else if (dyn->d_tag == DT_SYMTAB) { - symtab = (Elf_Sym *)(uintptr_t) - (dyn->d_un.d_ptr + offs); - continue; + for (;;) { + COPYOUT(dyntab, &dyn, sizeof(dyn)); + if (dyn.d_tag == DT_STRTAB) { + strtab = (vm_offset_t)(dyn.d_un.d_ptr) + offs; + } else if (dyn.d_tag == DT_SYMTAB) { + symtab = (vm_offset_t)(dyn.d_un.d_ptr) + offs; + } else if (dyn.d_tag == DT_NULL) { + break; } + dyntab += sizeof(dyn); } - if (symtab == NULL || strtab == NULL) { + if (symtab == 0 || strtab == 0) { /* * No symtab? No strtab? That should not happen here, * and should have been verified during __elfN(loadimage). @@ -153,7 +158,7 @@ fdt_find_static_dtb(void) return (0); } - sym_count = (int)((Elf_Sym *)esym - symtab) / sizeof(Elf_Sym); + sym_count = (int)(esym - symtab) / sizeof(Elf_Sym); /* * The most efficent way to find a symbol would be to calculate a @@ -165,26 +170,27 @@ fdt_find_static_dtb(void) * we are eliminating symbols type of which is not STT_NOTYPE, or(and) * those which binding attribute is not STB_GLOBAL. */ - for (i = 0; i < sym_count; i++) { - COPYOUT(symtab + i, &sym, sizeof(sym)); + fdt_start = 0; + while (sym_count > 0 && fdt_start == 0) { + COPYOUT(symtab, &sym, sizeof(sym)); + symtab += sizeof(sym); + --sym_count; if (ELF_ST_BIND(sym.st_info) != STB_GLOBAL || ELF_ST_TYPE(sym.st_info) != STT_NOTYPE) continue; - - strp = strdupout((vm_offset_t)(strtab + sym.st_name)); - if (strcmp(strp, FDT_STATIC_DTB_SYMBOL) == 0) { - /* Found a match ! */ - free(strp); - return ((vm_offset_t)(sym.st_value + offs)); - } + strp = strdupout(strtab + sym.st_name); + if (strcmp(strp, FDT_STATIC_DTB_SYMBOL) == 0) + fdt_start = (vm_offset_t)sym.st_value + offs; free(strp); } - return (0); + printf("fdt_start: 0x%08jX\n", (intmax_t)fdt_start); + return (fdt_start); } static int fdt_setup_fdtp() { + struct fdt_header header; struct preloaded_file *bfp; int err; @@ -193,15 +199,26 @@ fdt_setup_fdtp() */ bfp = file_findfile(NULL, "dtb"); if (bfp == NULL) { - if ((fdtp = (struct fdt_header *)fdt_find_static_dtb()) == 0) { + if ((fdtp_va = fdt_find_static_dtb()) == 0) { command_errmsg = "no device tree blob found!"; + printf("%s\n", command_errmsg); return (CMD_ERROR); } } else { /* Dynamic blob has precedence over static. */ - fdtp = (struct fdt_header *)bfp->f_addr; + fdtp_va = bfp->f_addr; } + COPYOUT(fdtp_va, &header, sizeof(header)); + fdtp_size = fdt_totalsize(&header); + fdtp = malloc(fdtp_size); + if (fdtp == NULL) { + command_errmsg = "can't allocate memory for device tree copy"; + printf("%s\n", command_errmsg); + return (CMD_ERROR); + } + COPYOUT(fdtp_va, fdtp, fdtp_size); + /* * Validate the blob. */ @@ -317,6 +334,8 @@ fixup_cpubusfreqs(unsigned long cpufreq, unsigned long busfreq) /* We want to modify every subnode of /cpus */ o = fdt_path_offset(fdtp, "/cpus"); + if (o < 0) + return; /* maxo should contain offset of node next to /cpus */ depth = 0; @@ -545,7 +564,7 @@ fixup_stdout(const char *env) /* * Locate the blob, fix it up and return its location. */ -void * +vm_offset_t fdt_fixup(void) { const char *env; @@ -561,7 +580,7 @@ fdt_fixup(void) err = fdt_setup_fdtp(); if (err) { sprintf(command_errbuf, "No valid device tree blob found!"); - return (NULL); + return (0); } /* Create /chosen node (if not exists) */ @@ -616,7 +635,9 @@ fdt_fixup(void) fdt_setprop(fdtp, chosen, "fixup-applied", NULL, 0); success: - return (fdtp); + /* Overwrite the FDT with the fixed version. */ + COPYIN(fdtp, fdtp_va, fdtp_size); + return (fdtp_va); } int @@ -634,7 +655,7 @@ command_fdt_internal(int argc, char *argv[]) /* * Check if uboot env vars were parsed already. If not, do it now. */ - if (fdt_fixup() == NULL) + if (fdt_fixup() == 0) return (CMD_ERROR); /* @@ -1151,6 +1172,8 @@ fdt_modprop(int nodeoff, char *propname, void *value, char mode) else sprintf(command_errbuf, "Could not add/modify property!\n"); + } else { + COPYIN(fdtp, fdtp_va, fdtp_size); } return (rv); } @@ -1371,6 +1394,8 @@ fdt_cmd_rm(int argc, char *argv[]) if (rv) { sprintf(command_errbuf, "could not delete node"); return (CMD_ERROR); + } else { + COPYIN(fdtp, fdtp_va, fdtp_size); } return (CMD_OK); } @@ -1401,6 +1426,8 @@ fdt_cmd_mknode(int argc, char *argv[]) sprintf(command_errbuf, "Could not add node!\n"); return (CMD_ERROR); + } else { + COPYIN(fdtp, fdtp_va, fdtp_size); } return (CMD_OK); } diff --git a/sys/boot/forth/beastie.4th b/sys/boot/forth/beastie.4th index 75d6e02a1b5..fa455cec2da 100644 --- a/sys/boot/forth/beastie.4th +++ b/sys/boot/forth/beastie.4th @@ -1,6 +1,6 @@ \ Copyright (c) 2003 Scott Long \ Copyright (c) 2003 Aleksander Fafula -\ Copyright (c) 2006-2011 Devin Teske +\ Copyright (c) 2006-2011 Devin Teske \ All rights reserved. \ \ Redistribution and use in source and binary forms, with or without diff --git a/sys/boot/forth/beastie.4th.8 b/sys/boot/forth/beastie.4th.8 index 51087697e41..814867d8703 100644 --- a/sys/boot/forth/beastie.4th.8 +++ b/sys/boot/forth/beastie.4th.8 @@ -29,7 +29,7 @@ .Os .Sh NAME .Nm beastie.4th -.Nd FreeBSD ASCII art boot module. +.Nd FreeBSD ASCII art boot module .Sh DESCRIPTION The file that goes by the name of .Nm @@ -168,4 +168,4 @@ set of commands was written by .An Scott Long Aq scottl@FreeBSD.org , .An Aleksander Fafula Aq alex@fafula.com and -.An Devin Teske Aq devinteske@hotmail.com . +.An Devin Teske Aq dteske@freebsd.org . diff --git a/sys/boot/forth/brand.4th b/sys/boot/forth/brand.4th index bc641749adf..367ab934e6e 100644 --- a/sys/boot/forth/brand.4th +++ b/sys/boot/forth/brand.4th @@ -1,4 +1,4 @@ -\ Copyright (c) 2006-2011 Devin Teske +\ Copyright (c) 2006-2011 Devin Teske \ All rights reserved. \ \ Redistribution and use in source and binary forms, with or without diff --git a/sys/boot/forth/brand.4th.8 b/sys/boot/forth/brand.4th.8 index 1a1cc84a7fa..10e8c55b13a 100644 --- a/sys/boot/forth/brand.4th.8 +++ b/sys/boot/forth/brand.4th.8 @@ -29,7 +29,7 @@ .Os .Sh NAME .Nm brand.4th -.Nd FreeBSD ASCII art boot module. +.Nd FreeBSD ASCII art boot module .Sh DESCRIPTION The file that goes by the name of .Nm @@ -122,4 +122,4 @@ The .Nm set of commands was written by .An -nosplit -.An Devin Teske Aq devinteske@hotmail.com . +.An Devin Teske Aq dteske@freebsd.org . diff --git a/sys/boot/forth/check-password.4th b/sys/boot/forth/check-password.4th index 0a1fa5d74e6..005edf18a37 100644 --- a/sys/boot/forth/check-password.4th +++ b/sys/boot/forth/check-password.4th @@ -1,4 +1,4 @@ -\ Copyright (c) 2006-2011 Devin Teske +\ Copyright (c) 2006-2011 Devin Teske \ All rights reserved. \ \ Redistribution and use in source and binary forms, with or without diff --git a/sys/boot/forth/check-password.4th.8 b/sys/boot/forth/check-password.4th.8 index ec2323ec0a8..1b1d42ef3dc 100644 --- a/sys/boot/forth/check-password.4th.8 +++ b/sys/boot/forth/check-password.4th.8 @@ -29,7 +29,7 @@ .Os .Sh NAME .Nm check-password.4th -.Nd FreeBSD password-checking boot module. +.Nd FreeBSD password-checking boot module .Sh DESCRIPTION The file that goes by the name of .Nm @@ -120,4 +120,4 @@ The .Nm set of commands was written by .An -nosplit -.An Devin Teske Aq devinteske@hotmail.com . +.An Devin Teske Aq dteske@freebsd.org . diff --git a/sys/boot/forth/color.4th b/sys/boot/forth/color.4th index 4d435938786..d16e1b32db8 100644 --- a/sys/boot/forth/color.4th +++ b/sys/boot/forth/color.4th @@ -1,4 +1,4 @@ -\ Copyright (c) 2011 Devin Teske +\ Copyright (c) 2011 Devin Teske \ All rights reserved. \ \ Redistribution and use in source and binary forms, with or without diff --git a/sys/boot/forth/color.4th.8 b/sys/boot/forth/color.4th.8 index 5a734dd8d11..6c24989afe3 100644 --- a/sys/boot/forth/color.4th.8 +++ b/sys/boot/forth/color.4th.8 @@ -29,7 +29,7 @@ .Os .Sh NAME .Nm color.4th -.Nd FreeBSD color-detection boot module. +.Nd FreeBSD color-detection boot module .Sh DESCRIPTION The file that goes by the name of .Nm @@ -114,4 +114,4 @@ The .Nm set of commands was written by .An -nosplit -.An Devin Teske Aq devinteske@hotmail.com . +.An Devin Teske Aq dteske@freebsd.org . diff --git a/sys/boot/forth/delay.4th b/sys/boot/forth/delay.4th index 3068e653ff4..69b8781ba4e 100644 --- a/sys/boot/forth/delay.4th +++ b/sys/boot/forth/delay.4th @@ -1,4 +1,4 @@ -\ Copyright (c) 2008-2011 Devin Teske +\ Copyright (c) 2008-2011 Devin Teske \ All rights reserved. \ \ Redistribution and use in source and binary forms, with or without diff --git a/sys/boot/forth/delay.4th.8 b/sys/boot/forth/delay.4th.8 index 3fe5b5b1754..1e4e71d25fa 100644 --- a/sys/boot/forth/delay.4th.8 +++ b/sys/boot/forth/delay.4th.8 @@ -29,7 +29,7 @@ .Os .Sh NAME .Nm delay.4th -.Nd FreeBSD debugging boot module. +.Nd FreeBSD debugging boot module .Sh DESCRIPTION The file that goes by the name of .Nm @@ -123,4 +123,4 @@ The .Nm set of commands was written by .An -nosplit -.An Devin Teske Aq devinteske@hotmail.com . +.An Devin Teske Aq dteske@freebsd.org . diff --git a/sys/boot/forth/menu-commands.4th b/sys/boot/forth/menu-commands.4th index 22994941f7b..3f365370b15 100644 --- a/sys/boot/forth/menu-commands.4th +++ b/sys/boot/forth/menu-commands.4th @@ -1,4 +1,4 @@ -\ Copyright (c) 2006-2011 Devin Teske +\ Copyright (c) 2006-2011 Devin Teske \ All rights reserved. \ \ Redistribution and use in source and binary forms, with or without diff --git a/sys/boot/forth/menu.4th b/sys/boot/forth/menu.4th index daac6c836f8..bf203f47f05 100644 --- a/sys/boot/forth/menu.4th +++ b/sys/boot/forth/menu.4th @@ -1,6 +1,6 @@ \ Copyright (c) 2003 Scott Long \ Copyright (c) 2003 Aleksander Fafula -\ Copyright (c) 2006-2011 Devin Teske +\ Copyright (c) 2006-2011 Devin Teske \ All rights reserved. \ \ Redistribution and use in source and binary forms, with or without diff --git a/sys/boot/forth/menu.4th.8 b/sys/boot/forth/menu.4th.8 index c3b2fcb8f46..e94ee86b673 100644 --- a/sys/boot/forth/menu.4th.8 +++ b/sys/boot/forth/menu.4th.8 @@ -29,7 +29,7 @@ .Os .Sh NAME .Nm menu.4th -.Nd FreeBSD dynamic menu boot module. +.Nd FreeBSD dynamic menu boot module .Sh DESCRIPTION The file that goes by the name of .Nm @@ -320,4 +320,4 @@ The .Nm set of commands was written by .An -nosplit -.An Devin Teske Aq devinteske@hotmail.com . +.An Devin Teske Aq dteske@freebsd.org . diff --git a/sys/boot/forth/shortcuts.4th b/sys/boot/forth/shortcuts.4th index 55a369b0aa3..ff64162587f 100644 --- a/sys/boot/forth/shortcuts.4th +++ b/sys/boot/forth/shortcuts.4th @@ -1,4 +1,4 @@ -\ Copyright (c) 2008-2011 Devin Teske +\ Copyright (c) 2008-2011 Devin Teske \ All rights reserved. \ \ Redistribution and use in source and binary forms, with or without diff --git a/sys/boot/forth/version.4th b/sys/boot/forth/version.4th index c59f825ef29..8fa0b9836cd 100644 --- a/sys/boot/forth/version.4th +++ b/sys/boot/forth/version.4th @@ -1,4 +1,4 @@ -\ Copyright (c) 2006-2011 Devin Teske +\ Copyright (c) 2006-2011 Devin Teske \ All rights reserved. \ \ Redistribution and use in source and binary forms, with or without diff --git a/sys/boot/forth/version.4th.8 b/sys/boot/forth/version.4th.8 index fff22682f55..c080a5d633b 100644 --- a/sys/boot/forth/version.4th.8 +++ b/sys/boot/forth/version.4th.8 @@ -29,7 +29,7 @@ .Os .Sh NAME .Nm version.4th -.Nd FreeBSD version string boot module. +.Nd FreeBSD version string boot module .Sh DESCRIPTION The file that goes by the name of .Nm @@ -123,4 +123,4 @@ The .Nm set of commands was written by .An -nosplit -.An Devin Teske Aq devinteske@hotmail.com . +.An Devin Teske Aq dteske@freebsd.org . diff --git a/sys/boot/i386/boot2/boot2.c b/sys/boot/i386/boot2/boot2.c index d5ac39e6387..fbafc5fb287 100644 --- a/sys/boot/i386/boot2/boot2.c +++ b/sys/boot/i386/boot2/boot2.c @@ -129,8 +129,8 @@ static struct dsk { int init; } dsk; static char cmd[512], cmddup[512], knamebuf[1024]; -static const char *kname = NULL; -static uint32_t opts = 0; +static const char *kname; +static uint32_t opts; static int comspeed = SIOSPD; static struct bootinfo bootinfo; static uint8_t ioctrl = IO_KEYBOARD; @@ -138,7 +138,6 @@ static uint8_t ioctrl = IO_KEYBOARD; void exit(int); static void load(void); static int parse(void); -static int xfsread(ino_t, void *, size_t); static int dskread(void *, unsigned, unsigned); static void printf(const char *,...); static void putchar(int); @@ -170,7 +169,7 @@ strcmp(const char *s1, const char *s2) #include "ufsread.c" static inline int -xfsread(ino_t inode, void *buf, size_t nbyte) +xfsread(ufs_ino_t inode, void *buf, size_t nbyte) { if ((size_t)fsread(inode, buf, nbyte) != nbyte) { printf("Invalid %s\n", "format"); @@ -222,7 +221,7 @@ int main(void) { uint8_t autoboot; - ino_t ino; + ufs_ino_t ino; size_t nbyte; dmadat = (void *)(roundup2(__base + (int32_t)&_end, 0x10000) - __base); @@ -307,7 +306,7 @@ load(void) static Elf32_Phdr ep[2]; static Elf32_Shdr es[2]; caddr_t p; - ino_t ino; + ufs_ino_t ino; uint32_t addr; int i, j; diff --git a/sys/boot/i386/btx/btx/Makefile b/sys/boot/i386/btx/btx/Makefile index 2b4abe6ab12..236d2693e1e 100644 --- a/sys/boot/i386/btx/btx/Makefile +++ b/sys/boot/i386/btx/btx/Makefile @@ -12,6 +12,7 @@ BOOT_BTX_FLAGS=0x0 .endif CFLAGS+=-DBTX_FLAGS=${BOOT_BTX_FLAGS} +CFLAGS+=-I${.CURDIR}/../../common .if defined(BTX_SERIAL) BOOT_COMCONSOLE_PORT?= 0x3f8 diff --git a/sys/boot/i386/btx/btx/btx.S b/sys/boot/i386/btx/btx/btx.S index e762e4baab5..bf4400e62e7 100644 --- a/sys/boot/i386/btx/btx/btx.S +++ b/sys/boot/i386/btx/btx/btx.S @@ -15,6 +15,8 @@ * $FreeBSD$ */ +#include + /* * Memory layout. */ @@ -205,7 +207,7 @@ init.8: xorl %ecx,%ecx # Zero movl $MEM_USR,%edx # User base address movzwl %ss:BDA_MEM,%eax # Get free memory shll $0xa,%eax # To bytes - subl $0x1000,%eax # Less arg space + subl $ARGSPACE,%eax # Less arg space subl %edx,%eax # Less base movb $SEL_UDATA,%cl # User data selector pushl %ecx # Set SS diff --git a/sys/boot/i386/btx/btxldr/Makefile b/sys/boot/i386/btx/btxldr/Makefile index 56333e7f35e..b76468be018 100644 --- a/sys/boot/i386/btx/btxldr/Makefile +++ b/sys/boot/i386/btx/btxldr/Makefile @@ -6,6 +6,7 @@ NO_MAN= SRCS= btxldr.S CFLAGS+=-DLOADER_ADDRESS=${LOADER_ADDRESS} +CFLAGS+=-I${.CURDIR}/../../common .if defined(BTXLDR_VERBOSE) CFLAGS+=-DBTXLDR_VERBOSE diff --git a/sys/boot/i386/btx/btxldr/btxldr.S b/sys/boot/i386/btx/btxldr/btxldr.S index d4176eb9c3b..848b930b790 100644 --- a/sys/boot/i386/btx/btxldr/btxldr.S +++ b/sys/boot/i386/btx/btxldr/btxldr.S @@ -15,6 +15,8 @@ * $FreeBSD$ */ +#include + #define RBX_MUTE 0x10 /* -m */ #define OPT_SET(opt) (1 << (opt)) @@ -89,7 +91,7 @@ start: cld # String ops inc call hexout # stack call putstr # pointer movl $m_args,%esi # Format string - leal 0x4(%esp,1),%ebx # First argument + leal 0x4(%esp),%ebx # First argument movl $0x6,%ecx # Count start.1: movl (%ebx),%eax # Get argument and addl $0x4,%ebx # bump pointer @@ -97,24 +99,28 @@ start.1: movl (%ebx),%eax # Get argument and loop start.1 # Till done call putstr # End message #endif - movl $0x48,%ecx # Allocate space - subl %ecx,%ebp # for bootinfo - movl 0x18(%esp,1),%esi # Source: bootinfo + movl BA_BOOTINFO+4(%esp),%esi # Source: bootinfo cmpl $0x0, %esi # If the bootinfo pointer je start_null_bi # is null, don't copy it + movl BI_SIZE(%esi),%ecx # Allocate space + subl %ecx,%ebp # for bootinfo movl %ebp,%edi # Destination rep # Copy movsb # it - movl %ebp,0x18(%esp,1) # Update pointer + movl %ebp,BA_BOOTINFO+4(%esp) # Update pointer + movl %edi,%ebp # Restore base pointer #ifdef BTXLDR_VERBOSE movl $m_rel_bi,%esi # Display movl %ebp,%eax # bootinfo call hexout # relocation call putstr # message #endif -start_null_bi: movl $0x18,%ecx # Allocate space - subl %ecx,%ebp # for arguments - leal 0x4(%esp,1),%esi # Source +start_null_bi: movl $BOOTARGS_SIZE,%ecx # Fixed size of arguments + testl $KARGS_FLAGS_EXTARG, BA_BOOTFLAGS+4(%esp) # Check for extra data + jz start_fixed # Skip if the flag is not set + addl BOOTARGS_SIZE+4(%esp),%ecx # Add size of variable args +start_fixed: subl $ARGOFF,%ebp # Place args at fixed offset + leal 0x4(%esp),%esi # Source movl %ebp,%edi # Destination rep # Copy movsb # them diff --git a/sys/boot/i386/btx/lib/Makefile b/sys/boot/i386/btx/lib/Makefile index 8fab66a541a..856d86806bc 100644 --- a/sys/boot/i386/btx/lib/Makefile +++ b/sys/boot/i386/btx/lib/Makefile @@ -3,7 +3,8 @@ PROG= crt0.o INTERNALPROG= NO_MAN= -SRCS= btxcsu.s btxsys.s btxv86.s +SRCS= btxcsu.S btxsys.s btxv86.s +CFLAGS+=-I${.CURDIR}/../../common LDFLAGS=-Wl,-r .include diff --git a/sys/boot/i386/btx/lib/btxcsu.s b/sys/boot/i386/btx/lib/btxcsu.S similarity index 94% rename from sys/boot/i386/btx/lib/btxcsu.s rename to sys/boot/i386/btx/lib/btxcsu.S index 6a006596295..c46f8097dbe 100644 --- a/sys/boot/i386/btx/lib/btxcsu.s +++ b/sys/boot/i386/btx/lib/btxcsu.S @@ -15,6 +15,8 @@ # $FreeBSD$ +#include + # # BTX C startup code (ELF). # @@ -24,10 +26,6 @@ # .global _start # -# Constants. -# - .set ARGADJ,0xfa0 # Argument adjustment -# # Client entry point. # _start: cld diff --git a/sys/boot/i386/cdboot/Makefile b/sys/boot/i386/cdboot/Makefile index 7656a5b8257..f352d693b65 100644 --- a/sys/boot/i386/cdboot/Makefile +++ b/sys/boot/i386/cdboot/Makefile @@ -4,10 +4,16 @@ PROG= cdboot STRIP= BINMODE=${NOBINMODE} NO_MAN= -SRCS= ${PROG}.s +SRCS= ${PROG}.S + +CFLAGS+=-I${.CURDIR}/../common ORG= 0x7c00 LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary .include + +# XXX: clang integrated-as doesn't grok .codeNN directives yet +CFLAGS.cdboot.S= ${CLANG_NO_IAS} +CFLAGS+= ${CFLAGS.${.IMPSRC:T}} diff --git a/sys/boot/i386/cdboot/cdboot.s b/sys/boot/i386/cdboot/cdboot.S similarity index 99% rename from sys/boot/i386/cdboot/cdboot.s rename to sys/boot/i386/cdboot/cdboot.S index 7d2a840a921..46d633c7231 100644 --- a/sys/boot/i386/cdboot/cdboot.s +++ b/sys/boot/i386/cdboot/cdboot.S @@ -40,6 +40,8 @@ # off of. # +#include + # # Memory locations. # @@ -62,11 +64,6 @@ .set AOUT_ENTRY,0x14 # entry point .set AOUT_HEADER,MEM_PAGE_SIZE # size of the a.out header # -# Flags for kargs->bootflags -# - .set KARGS_FLAGS_CD,0x1 # flag to indicate booting from - # CD loader -# # Segment selectors. # .set SEL_SDATA,0x8 # Supervisor data diff --git a/sys/boot/i386/common/bootargs.h b/sys/boot/i386/common/bootargs.h new file mode 100644 index 00000000000..4768d68ae18 --- /dev/null +++ b/sys/boot/i386/common/bootargs.h @@ -0,0 +1,69 @@ +/*- + * Copyright (c) 2012 Andriy Gapon + * All rights reserved. + * + * Redistribution and use in source and binary forms are freely + * permitted provided that the above copyright notice and this + * paragraph and the following disclaimer are duplicated in all + * such forms. + * + * This software is provided "AS IS" and without any express or + * implied warranties, including, without limitation, the implied + * warranties of merchantability and fitness for a particular + * purpose. + * + * $FreeBSD$ + */ + +#ifndef _BOOT_I386_ARGS_H_ +#define _BOOT_I386_ARGS_H_ + +#define KARGS_FLAGS_CD 0x1 +#define KARGS_FLAGS_PXE 0x2 +#define KARGS_FLAGS_ZFS 0x4 +#define KARGS_FLAGS_EXTARG 0x8 /* variably sized extended argument */ + +#define BOOTARGS_SIZE 24 /* sizeof(struct bootargs) */ +#define BA_BOOTFLAGS 8 /* offsetof(struct bootargs, bootflags) */ +#define BA_BOOTINFO 20 /* offsetof(struct bootargs, bootinfo) */ +#define BI_SIZE 48 /* offsetof(struct bootinfo, bi_size) */ + +/* + * We reserve some space above BTX allocated stack for the arguments + * and certain data that could hang off them. Currently only struct bootinfo + * is supported in that category. The bootinfo is placed at the top + * of the arguments area and the actual arguments are placed at ARGOFF offset + * from the top and grow towards the top. Hopefully we have enough space + * for bootinfo and the arguments to not run into each other. + * Arguments area below ARGOFF is reserved for future use. + */ +#define ARGSPACE 0x1000 /* total size of the BTX args area */ +#define ARGOFF 0x800 /* actual args offset within the args area */ +#define ARGADJ (ARGSPACE - ARGOFF) + +#ifndef __ASSEMBLER__ + +struct bootargs +{ + uint32_t howto; + uint32_t bootdev; + uint32_t bootflags; + union { + struct { + uint32_t pxeinfo; + uint32_t reserved; + }; + uint64_t zfspool; + }; + uint32_t bootinfo; + + /* + * If KARGS_FLAGS_EXTARG is set in bootflags, then the above fields + * are followed by a uint32_t field that specifies a size of the + * extended arguments (including the size field). + */ +}; + +#endif /*__ASSEMBLER__*/ + +#endif /* !_BOOT_I386_ARGS_H_ */ diff --git a/sys/boot/i386/efi/reloc.c b/sys/boot/i386/efi/reloc.c index 24eed0aaab4..96f9241a6e4 100644 --- a/sys/boot/i386/efi/reloc.c +++ b/sys/boot/i386/efi/reloc.c @@ -30,16 +30,7 @@ __FBSDID("$FreeBSD$"); #include #include #include - -/* - * XXX: we can't include sys/systm.h. - */ -#ifndef CTASSERT /* Allow lint to override */ -#define CTASSERT(x) _CTASSERT(x, __LINE__) -#define _CTASSERT(x, y) __CTASSERT(x, y) -#define __CTASSERT(x, y) typedef char __assert ## y[(x) ? 1 : -1] -#endif - +#include /* * A simple relocator for IA32 EFI binaries. diff --git a/sys/boot/i386/gptboot/gptboot.c b/sys/boot/i386/gptboot/gptboot.c index 8cb41361946..b9763782c08 100644 --- a/sys/boot/i386/gptboot/gptboot.c +++ b/sys/boot/i386/gptboot/gptboot.c @@ -90,14 +90,13 @@ static struct bootinfo bootinfo; void exit(int); static void load(void); static int parse(char *, int *); -static int xfsread(ino_t, void *, size_t); static int dskread(void *, daddr_t, unsigned); static uint32_t memsize(void); #include "ufsread.c" static inline int -xfsread(ino_t inode, void *buf, size_t nbyte) +xfsread(ufs_ino_t inode, void *buf, size_t nbyte) { if ((size_t)fsread(inode, buf, nbyte) != nbyte) { @@ -138,7 +137,7 @@ main(void) { char cmd[512], cmdtmp[512]; int autoboot, dskupdated; - ino_t ino; + ufs_ino_t ino; dmadat = (void *)(roundup2(__base + (int32_t)&_end, 0x10000) - __base); v86.ctl = V86_FLAGS; @@ -247,7 +246,7 @@ load(void) static Elf32_Phdr ep[2]; static Elf32_Shdr es[2]; caddr_t p; - ino_t ino; + ufs_ino_t ino; uint32_t addr, x; int fmt, i, j; diff --git a/sys/boot/i386/libi386/Makefile b/sys/boot/i386/libi386/Makefile index 94a20c8f3f6..c968746e5df 100644 --- a/sys/boot/i386/libi386/Makefile +++ b/sys/boot/i386/libi386/Makefile @@ -9,6 +9,8 @@ SRCS= biosacpi.c bioscd.c biosdisk.c biosmem.c biospnp.c \ elf64_freebsd.c \ i386_copy.c i386_module.c nullconsole.c pxe.c pxetramp.s \ smbios.c time.c vidconsole.c amd64_tramp.S spinconsole.c +.PATH: ${.CURDIR}/../../zfs +SRCS+= devicename_stubs.c # Enable PXE TFTP or NFS support, not both. .if defined(LOADER_TFTP_SUPPORT) diff --git a/sys/boot/i386/libi386/biosdisk.c b/sys/boot/i386/libi386/biosdisk.c index 533ce446687..23bbef7047c 100644 --- a/sys/boot/i386/libi386/biosdisk.c +++ b/sys/boot/i386/libi386/biosdisk.c @@ -55,7 +55,6 @@ __FBSDID("$FreeBSD$"); #define BIOS_NUMDRIVES 0x475 #define BIOSDISK_SECSIZE 512 #define BUFSIZE (1 * BIOSDISK_SECSIZE) -#define MAXBDDEV MAXDEV #define DT_ATAPI 0x10 /* disk type for ATAPI floppies */ #define WDMAJOR 0 /* major numbers for devices we frontend for */ diff --git a/sys/boot/i386/libi386/biospnp.c b/sys/boot/i386/libi386/biospnp.c index 8573e854121..30e55fc893d 100644 --- a/sys/boot/i386/libi386/biospnp.c +++ b/sys/boot/i386/libi386/biospnp.c @@ -276,6 +276,7 @@ biospnp_call(int func, const char *fmt, ...) break; } } + va_end(ap); /* BIOS segment last */ *(u_int16_t *)argp = pnp_Icheck->pnp_rmds; diff --git a/sys/boot/i386/libi386/devicename.c b/sys/boot/i386/libi386/devicename.c index d6f3ac1cb89..534af4cb965 100644 --- a/sys/boot/i386/libi386/devicename.c +++ b/sys/boot/i386/libi386/devicename.c @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include #include "bootstrap.h" #include "libi386.h" +#include "../zfs/libzfs.h" static int i386_parsedev(struct i386_devdesc **dev, const char *devspec, const char **path); @@ -171,7 +172,6 @@ i386_parsedev(struct i386_devdesc **dev, const char *devspec, const char **path) case DEVT_CD: case DEVT_NET: - case DEVT_ZFS: unit = 0; if (*np && (*np != ':')) { @@ -192,7 +192,11 @@ i386_parsedev(struct i386_devdesc **dev, const char *devspec, const char **path) if (path != NULL) *path = (*cp == 0) ? cp : cp + 1; break; - + case DEVT_ZFS: + err = zfs_parsedev((struct zfs_devdesc *)idev, np, path); + if (err != 0) + goto fail; + break; default: err = EINVAL; goto fail; @@ -247,9 +251,10 @@ i386_fmtdev(void *vdev) break; case DEVT_NET: - case DEVT_ZFS: sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit); break; + case DEVT_ZFS: + return(zfs_fmtdev(vdev)); } return(buf); } diff --git a/sys/boot/i386/libi386/libi386.h b/sys/boot/i386/libi386/libi386.h index b8842bada29..3edeb9247cd 100644 --- a/sys/boot/i386/libi386/libi386.h +++ b/sys/boot/i386/libi386/libi386.h @@ -30,7 +30,8 @@ /* * i386 fully-qualified device descriptor. * Note, this must match the 'struct devdesc' declaration - * in bootstrap.h. + * in bootstrap.h and also with struct zfs_devdesc for zfs + * support. */ struct i386_devdesc { @@ -49,6 +50,12 @@ struct i386_devdesc { void *data; } bioscd; + struct + { + void *data; + uint64_t pool_guid; + uint64_t root_guid; + } zfs; } d_kind; }; @@ -58,7 +65,8 @@ int i386_setcurrdev(struct env_var *ev, int flags, const void *value); extern struct devdesc currdev; /* our current device */ -#define MAXDEV 31 /* maximum number of distinct devices */ +#define MAXDEV 31 /* maximum number of distinct devices */ +#define MAXBDDEV MAXDEV /* exported devices XXX rename? */ extern struct devsw bioscd; diff --git a/sys/boot/i386/loader/Makefile b/sys/boot/i386/loader/Makefile index 9128e628568..d3f01b63e30 100644 --- a/sys/boot/i386/loader/Makefile +++ b/sys/boot/i386/loader/Makefile @@ -20,9 +20,7 @@ LIBFIREWIRE= ${.OBJDIR}/../libfirewire/libfirewire.a # Set by zfsloader Makefile .if defined(LOADER_ZFS_SUPPORT) CFLAGS+= -DLOADER_ZFS_SUPPORT -LIBZFS= ${.OBJDIR}/../../zfs/libzfsboot.a -.else -LIBZFS= +LIBZFSBOOT= ${.OBJDIR}/../../zfs/libzfsboot.a .endif # Enable PXE TFTP or NFS support, not both. @@ -55,6 +53,9 @@ CFLAGS+= -DLOADER_GZIP_SUPPORT .if !defined(LOADER_NO_GPT_SUPPORT) CFLAGS+= -DLOADER_GPT_SUPPORT .endif +.if defined(LOADER_NANDFS_SUPPORT) +CFLAGS+= -DLOADER_NANDFS_SUPPORT +.endif # Always add MI sources .PATH: ${.CURDIR}/../../common @@ -119,8 +120,8 @@ FILES+= menu.rc # XXX crt0.o needs to be first for pxeboot(8) to work OBJS= ${BTXCRT} -DPADD= ${LIBFICL} ${LIBFIREWIRE} ${LIBZFS} ${LIBI386} ${LIBSTAND} -LDADD= ${LIBFICL} ${LIBFIREWIRE} ${LIBZFS} ${LIBI386} ${LIBSTAND} +DPADD= ${LIBFICL} ${LIBFIREWIRE} ${LIBZFSBOOT} ${LIBI386} ${LIBSTAND} +LDADD= ${LIBFICL} ${LIBFIREWIRE} ${LIBZFSBOOT} ${LIBI386} ${LIBSTAND} .include diff --git a/sys/boot/i386/loader/conf.c b/sys/boot/i386/loader/conf.c index bd14f47079d..dda2eac829a 100644 --- a/sys/boot/i386/loader/conf.c +++ b/sys/boot/i386/loader/conf.c @@ -30,6 +30,9 @@ __FBSDID("$FreeBSD$"); #include #include #include "libi386/libi386.h" +#if defined(LOADER_ZFS_SUPPORT) +#include "../zfs/libzfs.h" +#endif /* * We could use linker sets for some or all of these, but @@ -50,10 +53,6 @@ __FBSDID("$FreeBSD$"); extern struct devsw fwohci; #endif -#if defined(LOADER_ZFS_SUPPORT) -extern struct devsw zfs_dev; -#endif - /* Exported for libstand */ struct devsw *devsw[] = { &bioscd, @@ -70,15 +69,14 @@ struct devsw *devsw[] = { NULL }; -#if defined(LOADER_ZFS_SUPPORT) -extern struct fs_ops zfs_fsops; -#endif - struct fs_ops *file_system[] = { &ufs_fsops, &ext2fs_fsops, &dosfs_fsops, &cd9660_fsops, +#if defined(LOADER_NANDFS_SUPPORT) + &nandfs_fsops, +#endif &splitfs_fsops, #if defined(LOADER_ZFS_SUPPORT) &zfs_fsops, diff --git a/sys/boot/i386/loader/main.c b/sys/boot/i386/loader/main.c index 75d5dbcb6ec..08cf16b09fe 100644 --- a/sys/boot/i386/loader/main.c +++ b/sys/boot/i386/loader/main.c @@ -33,34 +33,28 @@ __FBSDID("$FreeBSD$"); */ #include +#include #include #include #include #include #include "bootstrap.h" +#include "common/bootargs.h" #include "libi386/libi386.h" #include "btxv86.h" -#define KARGS_FLAGS_CD 0x1 -#define KARGS_FLAGS_PXE 0x2 -#define KARGS_FLAGS_ZFS 0x4 +#ifdef LOADER_ZFS_SUPPORT +#include "../zfs/libzfs.h" +#endif + +CTASSERT(sizeof(struct bootargs) == BOOTARGS_SIZE); +CTASSERT(offsetof(struct bootargs, bootinfo) == BA_BOOTINFO); +CTASSERT(offsetof(struct bootargs, bootflags) == BA_BOOTFLAGS); +CTASSERT(offsetof(struct bootinfo, bi_size) == BI_SIZE); /* Arguments passed in from the boot1/boot2 loader */ -static struct -{ - u_int32_t howto; - u_int32_t bootdev; - u_int32_t bootflags; - union { - struct { - u_int32_t pxeinfo; - u_int32_t res2; - }; - uint64_t zfspool; - }; - u_int32_t bootinfo; -} *kargs; +static struct bootargs *kargs; static u_int32_t initial_howto; static u_int32_t initial_bootdev; @@ -72,6 +66,9 @@ static void extract_currdev(void); static int isa_inb(int port); static void isa_outb(int port, int value); void exit(int code); +#ifdef LOADER_ZFS_SUPPORT +static void i386_zfs_probe(void); +#endif /* from vers.c */ extern char bootprog_name[], bootprog_rev[], bootprog_date[], bootprog_maker[]; @@ -163,6 +160,9 @@ main(void) archsw.arch_readin = i386_readin; archsw.arch_isainb = isa_inb; archsw.arch_isaoutb = isa_outb; +#ifdef LOADER_ZFS_SUPPORT + archsw.arch_zfs_probe = i386_zfs_probe; +#endif /* * March through the device switch probing for things. @@ -206,8 +206,11 @@ main(void) static void extract_currdev(void) { - struct i386_devdesc new_currdev; - int biosdev = -1; + struct i386_devdesc new_currdev; +#ifdef LOADER_ZFS_SUPPORT + struct zfs_boot_args *zargs; +#endif + int biosdev = -1; /* Assume we are booting from a BIOS disk by default */ new_currdev.d_dev = &biosdisk; @@ -228,6 +231,24 @@ extract_currdev(void) new_currdev.d_kind.biosdisk.partition = 0; biosdev = -1; } +#ifdef LOADER_ZFS_SUPPORT + } else if ((kargs->bootflags & KARGS_FLAGS_ZFS) != 0) { + zargs = NULL; + /* check for new style extended argument */ + if ((kargs->bootflags & KARGS_FLAGS_EXTARG) != 0) + zargs = (struct zfs_boot_args *)(kargs + 1); + + if (zargs != NULL && zargs->size >= sizeof(*zargs)) { + /* sufficient data is provided */ + new_currdev.d_kind.zfs.pool_guid = zargs->pool; + new_currdev.d_kind.zfs.root_guid = zargs->root; + } else { + /* old style zfsboot block */ + new_currdev.d_kind.zfs.pool_guid = kargs->zfspool; + new_currdev.d_kind.zfs.root_guid = 0; + } + new_currdev.d_dev = &zfs_dev; +#endif } else if ((initial_bootdev & B_MAGICMASK) != B_DEVMAGIC) { /* The passed-in boot device is bad */ new_currdev.d_kind.biosdisk.slice = -1; @@ -248,7 +269,7 @@ extract_currdev(void) biosdev = 0x80 + B_UNIT(initial_bootdev); /* assume harddisk */ } new_currdev.d_type = new_currdev.d_dev->dv_type; - + /* * If we are booting off of a BIOS disk and we didn't succeed in determining * which one we booted off of, just use disk0: as a reasonable default. @@ -259,33 +280,11 @@ extract_currdev(void) "Guessed BIOS device 0x%x not found by probes, defaulting to disk0:\n", biosdev); new_currdev.d_unit = 0; } + env_setenv("currdev", EV_VOLATILE, i386_fmtdev(&new_currdev), i386_setcurrdev, env_nounset); env_setenv("loaddev", EV_VOLATILE, i386_fmtdev(&new_currdev), env_noset, env_nounset); - -#ifdef LOADER_ZFS_SUPPORT - /* - * If we were started from a ZFS-aware boot2, we can work out - * which ZFS pool we are booting from. - */ - if (kargs->bootflags & KARGS_FLAGS_ZFS) { - /* - * Dig out the pool guid and convert it to a 'unit number' - */ - uint64_t guid; - int unit; - char devname[32]; - extern int zfs_guid_to_unit(uint64_t); - - guid = kargs->zfspool; - unit = zfs_guid_to_unit(guid); - if (unit >= 0) { - sprintf(devname, "zfs%d", unit); - setenv("currdev", devname, 1); - } - } -#endif } COMMAND_SET(reboot, "reboot", "reboot the system", command_reboot); @@ -352,3 +351,30 @@ isa_outb(int port, int value) } } +#ifdef LOADER_ZFS_SUPPORT +static void +i386_zfs_probe(void) +{ + char devname[32]; + int unit, slice; + + /* + * Open all the disks we can find and see if we can reconstruct + * ZFS pools from them. Bogusly assumes that the disks are named + * diskN, diskNpM or diskNsM. + */ + for (unit = 0; unit < MAXBDDEV; unit++) { + sprintf(devname, "disk%d:", unit); + if (zfs_probe_dev(devname, NULL) == ENXIO) + continue; + for (slice = 1; slice <= 128; slice++) { + sprintf(devname, "disk%dp%d:", unit, slice); + zfs_probe_dev(devname, NULL); + } + for (slice = 1; slice <= 4; slice++) { + sprintf(devname, "disk%ds%d:", unit, slice); + zfs_probe_dev(devname, NULL); + } + } +} +#endif diff --git a/sys/boot/i386/pxeldr/Makefile b/sys/boot/i386/pxeldr/Makefile index f4fd65d128e..af3a436b5d7 100644 --- a/sys/boot/i386/pxeldr/Makefile +++ b/sys/boot/i386/pxeldr/Makefile @@ -23,6 +23,8 @@ CFLAGS+=-DPROBE_KEYBOARD CFLAGS+=-DALWAYS_SERIAL .endif +CFLAGS+=-I${.CURDIR}/../common + LOADERBIN= ${.OBJDIR}/../loader/loader.bin CLEANFILES+= ${BOOT}.tmp diff --git a/sys/boot/i386/pxeldr/pxeldr.S b/sys/boot/i386/pxeldr/pxeldr.S index 897e8383b72..b91fb9b8c4b 100644 --- a/sys/boot/i386/pxeldr/pxeldr.S +++ b/sys/boot/i386/pxeldr/pxeldr.S @@ -26,6 +26,7 @@ */ #include +#include /* * Memory locations. @@ -49,11 +50,6 @@ .set AOUT_SYMBOLS,0x10 # symbol table .set AOUT_ENTRY,0x14 # entry point .set AOUT_HEADER,MEM_PAGE_SIZE # size of the a.out header -/* - * Flags for kargs->bootflags - */ - .set KARGS_FLAGS_PXE,0x2 # flag to indicate booting from - # PXE loader /* * Segment selectors. */ diff --git a/sys/boot/i386/zfsboot/zfsboot.c b/sys/boot/i386/zfsboot/zfsboot.c index a6be3ee3a9a..c92b11e4881 100644 --- a/sys/boot/i386/zfsboot/zfsboot.c +++ b/sys/boot/i386/zfsboot/zfsboot.c @@ -41,9 +41,9 @@ __FBSDID("$FreeBSD$"); #include "drv.h" #include "util.h" #include "cons.h" +#include "bootargs.h" -/* Hint to loader that we came from ZFS */ -#define KARGS_FLAGS_ZFS 0x4 +#include "libzfs.h" #define PATH_DOTCONFIG "/boot.config" #define PATH_CONFIG "/boot/config" @@ -63,8 +63,6 @@ __FBSDID("$FreeBSD$"); #define TYPE_MAXHARD TYPE_DA #define TYPE_FD 2 -#define MAXBDDEV 31 - extern uint32_t _end; #ifdef GPT @@ -95,9 +93,12 @@ static const unsigned char dev_maj[NDEV] = {30, 4, 2}; static char cmd[512]; static char cmddup[512]; static char kname[1024]; +static char rootname[256]; static int comspeed = SIOSPD; static struct bootinfo bootinfo; static uint32_t bootdev; +static struct zfs_boot_args zfsargs; +static struct zfsmount zfsmount; vm_offset_t high_heap_base; uint32_t bios_basemem, bios_extmem, high_heap_size; @@ -174,7 +175,7 @@ zfs_read(spa_t *spa, const dnode_phys_t *dnode, off_t *offp, void *start, size_t /* * Current ZFS pool */ -spa_t *spa; +static spa_t *spa; /* * A wrapper for dskread that doesn't have to worry about whether the @@ -213,7 +214,7 @@ static int xfsread(const dnode_phys_t *dnode, off_t *offp, void *buf, size_t nbyte) { if ((size_t)zfs_read(spa, dnode, offp, buf, nbyte) != nbyte) { - printf("Invalid %s\n", "format"); + printf("Invalid format\n"); return -1; } return 0; @@ -533,10 +534,12 @@ main(void) } } - zfs_mount_pool(spa); - - if (zfs_lookup(spa, PATH_CONFIG, &dn) == 0 || - zfs_lookup(spa, PATH_DOTCONFIG, &dn) == 0) { + if (zfs_spa_init(spa) != 0 || zfs_mount(spa, 0, &zfsmount) != 0) { + printf("%s: failed to mount default pool %s\n", + BOOTPROG, spa->spa_name); + autoboot = 0; + } else if (zfs_lookup(&zfsmount, PATH_CONFIG, &dn) == 0 || + zfs_lookup(&zfsmount, PATH_DOTCONFIG, &dn) == 0) { off = 0; zfs_read(spa, &dn, &off, cmd, sizeof(cmd)); } @@ -571,11 +574,17 @@ main(void) /* Present the user with the boot2 prompt. */ for (;;) { - if (!autoboot || !OPT_CHECK(RBX_QUIET)) - printf("\nFreeBSD/x86 boot\n" - "Default: %s:%s\n" - "boot: ", - spa->spa_name, kname); + if (!autoboot || !OPT_CHECK(RBX_QUIET)) { + printf("\nFreeBSD/x86 boot\n"); + if (zfs_rlookup(spa, zfsmount.rootobj, rootname) != 0) + printf("Default: %s:<0x%llx>:%s\n" + "boot: ", + spa->spa_name, zfsmount.rootobj, kname); + else + printf("Default: %s:%s:%s\n" + "boot: ", + spa->spa_name, rootname, kname); + } if (ioctrl & IO_SERIAL) sio_flush(); if (!autoboot || keyhit(5)) @@ -611,7 +620,8 @@ load(void) uint32_t addr, x; int fmt, i, j; - if (zfs_lookup(spa, kname, &dn)) { + if (zfs_lookup(&zfsmount, kname, &dn)) { + printf("\nCan't find %s\n", kname); return; } off = 0; @@ -685,12 +695,16 @@ load(void) } bootinfo.bi_esymtab = VTOP(p); bootinfo.bi_kernelname = VTOP(kname); + zfsargs.size = sizeof(zfsargs); + zfsargs.pool = zfsmount.spa->spa_guid; + zfsargs.root = zfsmount.rootobj; __exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK), bootdev, - KARGS_FLAGS_ZFS, + KARGS_FLAGS_ZFS | KARGS_FLAGS_EXTARG, (uint32_t) spa->spa_guid, (uint32_t) (spa->spa_guid >> 32), - VTOP(&bootinfo)); + VTOP(&bootinfo), + zfsargs); } static int @@ -742,7 +756,7 @@ parse(void) } if (c == '?') { dnode_phys_t dn; - if (zfs_lookup(spa, arg, &dn) == 0) { + if (zfs_lookup(&zfsmount, arg, &dn) == 0) { zap_list(spa, &dn); } return -1; @@ -764,17 +778,32 @@ parse(void) q = (char *) strchr(arg, ':'); if (q) { spa_t *newspa; + uint64_t newroot; *q++ = 0; newspa = spa_find_by_name(arg); if (newspa) { + arg = q; spa = newspa; - zfs_mount_pool(spa); + newroot = 0; + q = (char *) strchr(arg, ':'); + if (q) { + *q++ = 0; + if (zfs_lookup_dataset(spa, arg, &newroot)) { + printf("\nCan't find dataset %s in ZFS pool %s\n", + arg, spa->spa_name); + return -1; + } + arg = q; + } + if (zfs_mount(spa, newroot, &zfsmount)) { + printf("\nCan't mount ZFS dataset\n"); + return -1; + } } else { printf("\nCan't find ZFS pool %s\n", arg); return -1; } - arg = q; } if ((i = ep - arg)) { if ((size_t)i >= sizeof(kname)) diff --git a/sys/boot/ofw/libofw/Makefile b/sys/boot/ofw/libofw/Makefile index 945d6508988..751ebfda75b 100644 --- a/sys/boot/ofw/libofw/Makefile +++ b/sys/boot/ofw/libofw/Makefile @@ -6,6 +6,8 @@ INTERNALLIB= SRCS= devicename.c elf_freebsd.c ofw_console.c ofw_copy.c ofw_disk.c \ ofw_memory.c ofw_module.c ofw_net.c ofw_reboot.c \ ofw_time.c openfirm.c +.PATH: ${.CURDIR}/../../zfs +SRCS+= devicename_stubs.c CFLAGS+= -I${.CURDIR}/../../../../lib/libstand/ diff --git a/sys/boot/ofw/libofw/devicename.c b/sys/boot/ofw/libofw/devicename.c index 3cae23ce202..bbacb84c454 100644 --- a/sys/boot/ofw/libofw/devicename.c +++ b/sys/boot/ofw/libofw/devicename.c @@ -28,7 +28,10 @@ __FBSDID("$FreeBSD$"); #include + +#include "bootstrap.h" #include "libofw.h" +#include "../zfs/libzfs.h" static int ofw_parsedev(struct ofw_devdesc **, const char *, const char **); @@ -76,8 +79,10 @@ ofw_parsedev(struct ofw_devdesc **dev, const char *devspec, const char **path) phandle_t handle; const char *p; const char *s; + char *ep; char name[256]; char type[64]; + int err; int len; int i; @@ -87,9 +92,10 @@ ofw_parsedev(struct ofw_devdesc **dev, const char *devspec, const char **path) len = s - devspec; bcopy(devspec, name, len); name[len] = '\0'; - if ((handle = OF_finddevice(name)) == -1) - break; - if (OF_getprop(handle, "device_type", type, sizeof(type)) == -1) + if ((handle = OF_finddevice(name)) == -1) { + bcopy(name, type, len); + type[len] = '\0'; + } else if (OF_getprop(handle, "device_type", type, sizeof(type)) == -1) continue; for (i = 0; (dv = devsw[i]) != NULL; i++) { if (strncmp(dv->dv_name, type, strlen(dv->dv_name)) == 0) @@ -109,6 +115,15 @@ found: strcpy(idev->d_path, name); idev->d_dev = dv; idev->d_type = dv->dv_type; + if (idev->d_type == DEVT_ZFS) { + p = devspec + strlen(dv->dv_name); + err = zfs_parsedev((struct zfs_devdesc *)idev, p, path); + if (err != 0) { + free(idev); + return (err); + } + } + if (dev == NULL) { free(idev); } else { diff --git a/sys/boot/ofw/libofw/libofw.h b/sys/boot/ofw/libofw/libofw.h index 5f6d7ad5e6b..87e90959c9e 100644 --- a/sys/boot/ofw/libofw/libofw.h +++ b/sys/boot/ofw/libofw/libofw.h @@ -33,7 +33,13 @@ struct ofw_devdesc { int d_type; int d_unit; ihandle_t d_handle; - char d_path[256]; + union { + char d_path[256]; + struct { + uint64_t pool_guid; + uint64_t root_guid; + }; + }; }; extern int ofw_getdev(void **vdev, const char *devspec, const char **path); diff --git a/sys/boot/ofw/libofw/ofw_disk.c b/sys/boot/ofw/libofw/ofw_disk.c index aaad196eefd..9b2e11cbfbd 100644 --- a/sys/boot/ofw/libofw/ofw_disk.c +++ b/sys/boot/ofw/libofw/ofw_disk.c @@ -31,7 +31,6 @@ __FBSDID("$FreeBSD$"); */ #include -#include #include @@ -43,8 +42,8 @@ __FBSDID("$FreeBSD$"); #include "libofw.h" static int ofwd_init(void); -static int ofwd_strategy(void *devdata, int flag, daddr_t dblk, - size_t size, char *buf, size_t *rsize); +static int ofwd_strategy(void *devdata, int flag, daddr_t dblk, + size_t size, char *buf, size_t *rsize); static int ofwd_open(struct open_file *f, ...); static int ofwd_close(struct open_file *f); static int ofwd_ioctl(struct open_file *f, u_long cmd, void *data); @@ -61,120 +60,109 @@ struct devsw ofwdisk = { ofwd_print }; -struct opened_dev { - ihandle_t handle; - u_int count; - SLIST_ENTRY(opened_dev) link; -}; - -SLIST_HEAD(, opened_dev) opened_devs = SLIST_HEAD_INITIALIZER(opened_devs); +/* + * We're not guaranteed to be able to open a device more than once and there + * is no OFW standard method to determine whether a device is already opened. + * Opening a device multiple times simultaneously happens to work with most + * OFW block device drivers but triggers a trap with at least the driver for + * the on-board controllers of Sun Fire V100 and Ultra 1. Upper layers and MI + * code expect to be able to open a device more than once however. Given that + * different partitions of the same device might be opened at the same time as + * done by ZFS, we can't generally just keep track of the opened devices and + * reuse the instance handle when asked to open an already opened device. So + * the best we can do is to cache the lastly used device path and close and + * open devices in ofwd_strategy() as needed. + */ +static struct ofw_devdesc *kdp; static int ofwd_init(void) { - return 0; + return (0); } static int -ofwd_strategy(void *devdata, int flag, daddr_t dblk, size_t size, char *buf, - size_t *rsize) +ofwd_strategy(void *devdata, int flag __unused, daddr_t dblk, size_t size, + char *buf, size_t *rsize) { struct ofw_devdesc *dp = (struct ofw_devdesc *)devdata; daddr_t pos; int n; + if (dp != kdp) { + if (kdp != NULL) { +#if !defined(__powerpc__) + OF_close(kdp->d_handle); +#endif + kdp = NULL; + } + if ((dp->d_handle = OF_open(dp->d_path)) == -1) + return (ENOENT); + kdp = dp; + } + pos = dblk * 512; do { if (OF_seek(dp->d_handle, pos) < 0) - return EIO; + return (EIO); n = OF_read(dp->d_handle, buf, size); if (n < 0 && n != -2) - return EIO; + return (EIO); } while (n == -2); *rsize = size; - return 0; + return (0); } static int ofwd_open(struct open_file *f, ...) { - char path[256]; struct ofw_devdesc *dp; - struct opened_dev *odp; va_list vl; va_start(vl, f); dp = va_arg(vl, struct ofw_devdesc *); va_end(vl); - /* - * We're not guaranteed to be able to open a device more than once - * simultaneously and there is no OFW standard method to determine - * whether a device is already opened. Opening a device more than - * once happens to work with most OFW block device drivers but - * triggers a trap with at least the driver for the on-board SCSI - * controller in Sun Ultra 1. Upper layers and MI code expect to - * be able to open a device more than once however. As a workaround - * keep track of the opened devices and reuse the instance handle - * when asked to open an already opened device. - */ - SLIST_FOREACH(odp, &opened_devs, link) { - if (OF_instance_to_path(odp->handle, path, sizeof(path)) == -1) - continue; - if (strcmp(path, dp->d_path) == 0) { - odp->count++; - dp->d_handle = odp->handle; - return 0; + + if (dp != kdp) { + if (kdp != NULL) { + OF_close(kdp->d_handle); + kdp = NULL; } + if ((dp->d_handle = OF_open(dp->d_path)) == -1) { + printf("%s: Could not open %s\n", __func__, + dp->d_path); + return (ENOENT); + } + kdp = dp; } - odp = malloc(sizeof(struct opened_dev)); - if (odp == NULL) { - printf("ofwd_open: malloc failed\n"); - return ENOMEM; - } - if ((odp->handle = OF_open(dp->d_path)) == -1) { - printf("ofwd_open: Could not open %s\n", dp->d_path); - free(odp); - return ENOENT; - } - odp->count = 1; - SLIST_INSERT_HEAD(&opened_devs, odp, link); - dp->d_handle = odp->handle; - return 0; + return (0); } static int ofwd_close(struct open_file *f) { struct ofw_devdesc *dev = f->f_devdata; - struct opened_dev *odp; - SLIST_FOREACH(odp, &opened_devs, link) { - if (odp->handle == dev->d_handle) { - odp->count--; - if (odp->count == 0) { - SLIST_REMOVE(&opened_devs, odp, opened_dev, - link); - #if !defined(__powerpc__) - OF_close(odp->handle); - #endif - free(odp); - } - break; - } + if (dev == kdp) { +#if !defined(__powerpc__) + OF_close(dev->d_handle); +#endif + kdp = NULL; } - return 0; + return (0); } static int -ofwd_ioctl(struct open_file *f, u_long cmd, void *data) +ofwd_ioctl(struct open_file *f __unused, u_long cmd __unused, + void *data __unused) { return (EINVAL); } static void -ofwd_print(int verbose) +ofwd_print(int verbose __unused) { } diff --git a/sys/boot/pc98/boot2/boot2.c b/sys/boot/pc98/boot2/boot2.c index 393a460f98d..95384bd67b4 100644 --- a/sys/boot/pc98/boot2/boot2.c +++ b/sys/boot/pc98/boot2/boot2.c @@ -140,7 +140,6 @@ static uint8_t ioctrl = IO_KEYBOARD; void exit(int); static void load(void); static int parse(void); -static int xfsread(ino_t, void *, size_t); static int dskread(void *, unsigned, unsigned); static void printf(const char *,...); static void putchar(int); @@ -172,7 +171,7 @@ strcmp(const char *s1, const char *s2) #include "ufsread.c" static inline int -xfsread(ino_t inode, void *buf, size_t nbyte) +xfsread(ufs_ino_t inode, void *buf, size_t nbyte) { if ((size_t)fsread(inode, buf, nbyte) != nbyte) { printf("Invalid %s\n", "format"); @@ -351,7 +350,7 @@ main(void) int i; #endif uint8_t autoboot; - ino_t ino; + ufs_ino_t ino; size_t nbyte; dmadat = (void *)(roundup2(__base + (int32_t)&_end, 0x10000) - __base); @@ -446,7 +445,7 @@ load(void) static Elf32_Phdr ep[2]; static Elf32_Shdr es[2]; caddr_t p; - ino_t ino; + ufs_ino_t ino; uint32_t addr; int i, j; diff --git a/sys/boot/pc98/btx/btx/Makefile b/sys/boot/pc98/btx/btx/Makefile index d90e51f1722..22cd5d67866 100644 --- a/sys/boot/pc98/btx/btx/Makefile +++ b/sys/boot/pc98/btx/btx/Makefile @@ -12,6 +12,7 @@ BOOT_BTX_FLAGS=0x0 .endif CFLAGS+=-DBTX_FLAGS=${BOOT_BTX_FLAGS} +CFLAGS+=-I${.CURDIR}/../../../i386/common .if defined(BTX_SERIAL) BOOT_COMCONSOLE_PORT?= 0x238 diff --git a/sys/boot/pc98/btx/btx/btx.S b/sys/boot/pc98/btx/btx/btx.S index 95788d4f8fa..ceed5a69e50 100644 --- a/sys/boot/pc98/btx/btx/btx.S +++ b/sys/boot/pc98/btx/btx/btx.S @@ -15,6 +15,8 @@ * $FreeBSD$ */ +#include + /* * Memory layout. */ @@ -205,7 +207,7 @@ init.8: xorl %ecx,%ecx # Zero andl $0x7,%eax incl %eax shll $0x11,%eax # To bytes - subl $0x1000,%eax # Less arg space + subl $ARGSPACE,%eax # Less arg space subl %edx,%eax # Less base movb $SEL_UDATA,%cl # User data selector pushl %ecx # Set SS diff --git a/sys/boot/pc98/btx/btxldr/Makefile b/sys/boot/pc98/btx/btxldr/Makefile index 56333e7f35e..aef1685ebf2 100644 --- a/sys/boot/pc98/btx/btxldr/Makefile +++ b/sys/boot/pc98/btx/btxldr/Makefile @@ -6,6 +6,7 @@ NO_MAN= SRCS= btxldr.S CFLAGS+=-DLOADER_ADDRESS=${LOADER_ADDRESS} +CFLAGS+=-I${.CURDIR}/../../../i386/common .if defined(BTXLDR_VERBOSE) CFLAGS+=-DBTXLDR_VERBOSE diff --git a/sys/boot/pc98/btx/btxldr/btxldr.S b/sys/boot/pc98/btx/btxldr/btxldr.S index 2104605b743..683d6c8e6e4 100644 --- a/sys/boot/pc98/btx/btxldr/btxldr.S +++ b/sys/boot/pc98/btx/btxldr/btxldr.S @@ -20,6 +20,8 @@ * real thing should probably be more flexible, and in C. */ +#include + /* * Memory locations. */ @@ -105,7 +107,7 @@ gdcwait.2: inb $0x60,%al call hexout # stack call putstr # pointer movl $m_args,%esi # Format string - leal 0x4(%esp,1),%ebx # First argument + leal 0x4(%esp),%ebx # First argument movl $0x6,%ecx # Count start.1: movl (%ebx),%eax # Get argument and addl $0x4,%ebx # bump pointer @@ -113,24 +115,28 @@ start.1: movl (%ebx),%eax # Get argument and loop start.1 # Till done call putstr # End message #endif - movl $0x48,%ecx # Allocate space - subl %ecx,%ebp # for bootinfo - movl 0x18(%esp,1),%esi # Source: bootinfo + movl BA_BOOTINFO+4(%esp),%esi # Source: bootinfo cmpl $0x0, %esi # If the bootinfo pointer je start_null_bi # is null, don't copy it + movl BI_SIZE(%esi),%ecx # Allocate space + subl %ecx,%ebp # for bootinfo movl %ebp,%edi # Destination rep # Copy movsb # it - movl %ebp,0x18(%esp,1) # Update pointer + movl %ebp,BA_BOOTINFO+4(%esp) # Update pointer + movl %edi,%ebp # Restore base pointer #ifdef BTXLDR_VERBOSE movl $m_rel_bi,%esi # Display movl %ebp,%eax # bootinfo call hexout # relocation call putstr # message #endif -start_null_bi: movl $0x18,%ecx # Allocate space - subl %ecx,%ebp # for arguments - leal 0x4(%esp,1),%esi # Source +start_null_bi: movl $BOOTARGS_SIZE,%ecx # Fixed size of arguments + testl $KARGS_FLAGS_EXTARG, BA_BOOTFLAGS+4(%esp) # Check for extra data + jz start_fixed # Skip if the flag is not set + addl BOOTARGS_SIZE+4(%esp),%ecx # Add size of variable args +start_fixed: subl $ARGOFF,%ebp # Place args at fixed offset + leal 0x4(%esp),%esi # Source movl %ebp,%edi # Destination rep # Copy movsb # them diff --git a/sys/boot/pc98/btx/lib/Makefile b/sys/boot/pc98/btx/lib/Makefile index 8fab66a541a..151fc8fc8a1 100644 --- a/sys/boot/pc98/btx/lib/Makefile +++ b/sys/boot/pc98/btx/lib/Makefile @@ -3,7 +3,8 @@ PROG= crt0.o INTERNALPROG= NO_MAN= -SRCS= btxcsu.s btxsys.s btxv86.s +SRCS= btxcsu.S btxsys.s btxv86.s +CFLAGS+=-I${.CURDIR}/../../../i386/common LDFLAGS=-Wl,-r .include diff --git a/sys/boot/pc98/btx/lib/btxcsu.s b/sys/boot/pc98/btx/lib/btxcsu.S similarity index 94% rename from sys/boot/pc98/btx/lib/btxcsu.s rename to sys/boot/pc98/btx/lib/btxcsu.S index 6a006596295..8af6ad626aa 100644 --- a/sys/boot/pc98/btx/lib/btxcsu.s +++ b/sys/boot/pc98/btx/lib/btxcsu.S @@ -19,15 +19,13 @@ # BTX C startup code (ELF). # +#include + # # Globals. # .global _start # -# Constants. -# - .set ARGADJ,0xfa0 # Argument adjustment -# # Client entry point. # _start: cld diff --git a/sys/boot/pc98/cdboot/Makefile b/sys/boot/pc98/cdboot/Makefile index ce11d7bb60a..eec1328fb3a 100644 --- a/sys/boot/pc98/cdboot/Makefile +++ b/sys/boot/pc98/cdboot/Makefile @@ -4,7 +4,9 @@ PROG= cdboot STRIP= BINMODE=${NOBINMODE} NO_MAN= -SRCS= ${PROG}.s +SRCS= ${PROG}.S + +CFLAGS+=-I${.CURDIR}/../../i386/common ORG= 0x0000 diff --git a/sys/boot/pc98/cdboot/cdboot.s b/sys/boot/pc98/cdboot/cdboot.S similarity index 99% rename from sys/boot/pc98/cdboot/cdboot.s rename to sys/boot/pc98/cdboot/cdboot.S index b6efeef6467..a6508e2ffdf 100644 --- a/sys/boot/pc98/cdboot/cdboot.s +++ b/sys/boot/pc98/cdboot/cdboot.S @@ -30,6 +30,8 @@ # $FreeBSD$ +#include + # # Basically, we first create a set of boot arguments to pass to the loaded # binary. Then we attempt to load /boot/loader from the CD we were booted @@ -82,11 +84,6 @@ .set AOUT_ENTRY,0x14 # entry point .set AOUT_HEADER,MEM_PAGE_SIZE # size of the a.out header # -# Flags for kargs->bootflags -# - .set KARGS_FLAGS_CD,0x1 # flag to indicate booting from - # CD loader -# # Segment selectors. # .set SEL_SDATA,0x8 # Supervisor data diff --git a/sys/boot/pc98/libpc98/Makefile b/sys/boot/pc98/libpc98/Makefile index 6c6ce892fdd..0de2e0836ba 100644 --- a/sys/boot/pc98/libpc98/Makefile +++ b/sys/boot/pc98/libpc98/Makefile @@ -10,6 +10,8 @@ SRCS= bioscd.c biosdisk.c biosmem.c biospnp.c \ comconsole.c devicename.c elf32_freebsd.c \ i386_copy.c i386_module.c nullconsole.c pc98_sys.c pxe.c pxetramp.s \ time.c vidconsole.c +.PATH: ${.CURDIR}/../../zfs +SRCS+= devicename_stubs.c # Enable PXE TFTP or NFS support, not both. .if defined(LOADER_TFTP_SUPPORT) diff --git a/sys/boot/pc98/libpc98/biosdisk.c b/sys/boot/pc98/libpc98/biosdisk.c index c2e7d6618cd..dc98145fc1b 100644 --- a/sys/boot/pc98/libpc98/biosdisk.c +++ b/sys/boot/pc98/libpc98/biosdisk.c @@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$"); #define BIOS_NUMDRIVES 0x475 #define BIOSDISK_SECSIZE 512 #define BUFSIZE (1 * BIOSDISK_SECSIZE) -#define MAXBDDEV MAXDEV #define DT_ATAPI 0x10 /* disk type for ATAPI floppies */ #define WDMAJOR 0 /* major numbers for devices we frontend for */ diff --git a/sys/boot/pc98/loader/main.c b/sys/boot/pc98/loader/main.c index 15b132f11f4..27a8c9752ba 100644 --- a/sys/boot/pc98/loader/main.c +++ b/sys/boot/pc98/loader/main.c @@ -33,29 +33,25 @@ __FBSDID("$FreeBSD$"); */ #include +#include #include #include #include #include #include "bootstrap.h" +#include "common/bootargs.h" #include "libi386/libi386.h" #include "libpc98/libpc98.h" #include "btxv86.h" -#define KARGS_FLAGS_CD 0x1 -#define KARGS_FLAGS_PXE 0x2 +CTASSERT(sizeof(struct bootargs) == BOOTARGS_SIZE); +CTASSERT(offsetof(struct bootargs, bootinfo) == BA_BOOTINFO); +CTASSERT(offsetof(struct bootargs, bootflags) == BA_BOOTFLAGS); +CTASSERT(offsetof(struct bootinfo, bi_size) == BI_SIZE); /* Arguments passed in from the boot1/boot2 loader */ -static struct -{ - u_int32_t howto; - u_int32_t bootdev; - u_int32_t bootflags; - u_int32_t pxeinfo; - u_int32_t res2; - u_int32_t bootinfo; -} *kargs; +static struct bootargs *kargs; static u_int32_t initial_howto; static u_int32_t initial_bootdev; diff --git a/sys/boot/powerpc/boot1.chrp/boot1.c b/sys/boot/powerpc/boot1.chrp/boot1.c index 5ad405bbb48..ff99ce65783 100644 --- a/sys/boot/powerpc/boot1.chrp/boot1.c +++ b/sys/boot/powerpc/boot1.chrp/boot1.c @@ -45,7 +45,6 @@ static char bootargs[128]; static ofwh_t bootdev; static struct fs fs; -static ino_t inomap; static char blkbuf[BSIZEMAX]; static unsigned int fsblks; @@ -492,7 +491,7 @@ load(const char *fname) Elf32_Ehdr eh; Elf32_Phdr ph; caddr_t p; - ino_t ino; + ufs_ino_t ino; int i; if ((ino = lookup(fname)) == 0) { diff --git a/sys/boot/sparc64/Makefile b/sys/boot/sparc64/Makefile index fdc87fde92d..a7680390908 100644 --- a/sys/boot/sparc64/Makefile +++ b/sys/boot/sparc64/Makefile @@ -1,5 +1,5 @@ # $FreeBSD$ -SUBDIR= boot1 loader +SUBDIR= boot1 loader zfsboot zfsloader .include diff --git a/sys/boot/sparc64/boot1/Makefile b/sys/boot/sparc64/boot1/Makefile index dec3e092a7c..048c0830b35 100644 --- a/sys/boot/sparc64/boot1/Makefile +++ b/sys/boot/sparc64/boot1/Makefile @@ -3,22 +3,23 @@ PROG= boot1.elf INTERNALPROG= NO_MAN= -FILES= boot1 +FILES?= boot1 SRCS= _start.s boot1.c +CLEANFILES=${FILES} boot1.aout BOOTBLOCKBASE= 0x4000 -CFLAGS= -mcmodel=medlow -Os -I${.CURDIR}/../../common +CFLAGS+=-mcmodel=medlow -Os -I${.CURDIR}/../../common LDFLAGS=-Ttext ${BOOTBLOCKBASE} -Wl,-N # Construct boot1. sunlabel expects it to contain zeroed-out space for the # label, and to be of the correct size. -boot1: boot1.aout +${FILES}: boot1.aout + @set -- `ls -l boot1.aout`; x=$$((7680-$$5)); \ + echo "$$x bytes available"; test $$x -ge 0 dd if=/dev/zero of=${.TARGET} bs=512 count=16 dd if=boot1.aout of=${.TARGET} bs=512 oseek=1 conv=notrunc -CLEANFILES= boot1.aout - boot1.aout: boot1.elf elf2aout -o ${.TARGET} ${.ALLSRC} diff --git a/sys/boot/sparc64/boot1/boot1.c b/sys/boot/sparc64/boot1/boot1.c index 6b9fa30ace4..4bafe06f2cb 100644 --- a/sys/boot/sparc64/boot1/boot1.c +++ b/sys/boot/sparc64/boot1/boot1.c @@ -20,11 +20,13 @@ __FBSDID("$FreeBSD$"); #include #include + #include #include -#define _PATH_LOADER "/boot/loader" -#define _PATH_KERNEL "/boot/kernel/kernel" +#define _PATH_LOADER "/boot/loader" +#define _PATH_KERNEL "/boot/kernel/kernel" +#define READ_BUF_SIZE 8192 typedef int putc_func_t(char c, void *arg); typedef int32_t ofwh_t; @@ -45,17 +47,21 @@ static ofwh_t bootdev; static uint32_t fs_off; int main(int ac, char **av); - static void exit(int) __dead2; -static void load(const char *); -static int dskread(void *, u_int64_t, int); - static void usage(void); +#ifdef ZFSBOOT +static void loadzfs(void); +static int zbread(char *buf, off_t off, size_t bytes); +#else +static void load(const char *); +#endif + static void bcopy(const void *src, void *dst, size_t len); static void bzero(void *b, size_t len); static int mount(const char *device); +static int dskread(void *buf, u_int64_t lba, int nblk); static void panic(const char *fmt, ...) __dead2; static int printf(const char *fmt, ...); @@ -312,8 +318,6 @@ strcmp(const char *s1, const char *s2) return ((u_char)*s1 - (u_char)*s2); } -#include "ufsread.c" - int main(int ac, char **av) { @@ -335,14 +339,22 @@ main(int ac, char **av) } } - printf(" \n>> FreeBSD/sparc64 boot block\n" - " Boot path: %s\n" - " Boot loader: %s\n", bootpath, path); +#ifdef ZFSBOOT + printf(" \n>> FreeBSD/sparc64 ZFS boot block\n Boot path: %s\n", + bootpath); +#else + printf(" \n>> FreeBSD/sparc64 boot block\n Boot path: %s\n" + " Boot loader: %s\n", "", bootpath, path); +#endif if (mount(bootpath) == -1) panic("mount"); +#ifdef ZFSBOOT + loadzfs(); +#else load(path); +#endif return (1); } @@ -361,31 +373,92 @@ exit(int code) ofw_exit(); } -static struct dmadat __dmadat; +#ifdef ZFSBOOT + +#define VDEV_BOOT_OFFSET (2 * 256 * 1024) +static char zbuf[READ_BUF_SIZE]; static int -mount(const char *device) +zbread(char *buf, off_t off, size_t bytes) { + size_t len; + off_t poff; + off_t soff; + char *p; + unsigned int nb; + unsigned int lb; - dmadat = &__dmadat; - if ((bootdev = ofw_open(device)) == -1) { - printf("mount: can't open device\n"); - return (-1); + p = buf; + soff = VDEV_BOOT_OFFSET + off; + lb = (soff + bytes + DEV_BSIZE - 1) / DEV_BSIZE; + poff = soff; + while (poff < soff + bytes) { + nb = lb - poff / DEV_BSIZE; + if (nb > READ_BUF_SIZE / DEV_BSIZE) + nb = READ_BUF_SIZE / DEV_BSIZE; + if (dskread(zbuf, poff / DEV_BSIZE, nb)) + break; + if ((poff / DEV_BSIZE + nb) * DEV_BSIZE > soff + bytes) + len = soff + bytes - poff; + else + len = (poff / DEV_BSIZE + nb) * DEV_BSIZE - poff; + memcpy(p, zbuf + poff % DEV_BSIZE, len); + p += len; + poff += len; } - if (fsread(0, NULL, 0)) { - printf("mount: can't read superblock\n"); - return (-1); - } - return (0); + return (poff - soff); } +static void +loadzfs(void) +{ + Elf64_Ehdr eh; + Elf64_Phdr ph; + caddr_t p; + int i; + + if (zbread((char *)&eh, 0, sizeof(eh)) != sizeof(eh)) { + printf("Can't read elf header\n"); + return; + } + if (!IS_ELF(eh)) { + printf("Not an ELF file\n"); + return; + } + for (i = 0; i < eh.e_phnum; i++) { + fs_off = eh.e_phoff + i * eh.e_phentsize; + if (zbread((char *)&ph, fs_off, sizeof(ph)) != sizeof(ph)) { + printf("Can't read program header %d\n", i); + return; + } + if (ph.p_type != PT_LOAD) + continue; + fs_off = ph.p_offset; + p = (caddr_t)ph.p_vaddr; + if (zbread(p, fs_off, ph.p_filesz) != ph.p_filesz) { + printf("Can't read content of section %d\n", i); + return; + } + if (ph.p_filesz != ph.p_memsz) + bzero(p + ph.p_filesz, ph.p_memsz - ph.p_filesz); + } + ofw_close(bootdev); + (*(void (*)(int, int, int, int, ofwfp_t))eh.e_entry)(0, 0, 0, 0, ofw); +} + +#else + +#include "ufsread.c" + +static struct dmadat __dmadat; + static void load(const char *fname) { Elf64_Ehdr eh; Elf64_Phdr ph; caddr_t p; - ino_t ino; + ufs_ino_t ino; int i; if ((ino = lookup(fname)) == 0) { @@ -421,6 +494,26 @@ load(const char *fname) (*(void (*)(int, int, int, int, ofwfp_t))eh.e_entry)(0, 0, 0, 0, ofw); } +#endif /* ZFSBOOT */ + +static int +mount(const char *device) +{ + + if ((bootdev = ofw_open(device)) == -1) { + printf("mount: can't open device\n"); + return (-1); + } +#ifndef ZFSBOOT + dmadat = &__dmadat; + if (fsread(0, NULL, 0)) { + printf("mount: can't read superblock\n"); + return (-1); + } +#endif + return (0); +} + static int dskread(void *buf, u_int64_t lba, int nblk) { diff --git a/sys/boot/sparc64/loader/Makefile b/sys/boot/sparc64/loader/Makefile index d32fbabdfca..0a3b7530348 100644 --- a/sys/boot/sparc64/loader/Makefile +++ b/sys/boot/sparc64/loader/Makefile @@ -3,8 +3,8 @@ .include MK_SSP= no -PROG= loader -NEWVERSWHAT= "bootstrap loader" sparc64 +PROG?= loader +NEWVERSWHAT?= "bootstrap loader" sparc64 INSTALLFLAGS= -b # Architecture-specific loader code @@ -13,12 +13,17 @@ SRCS= locore.S main.c metadata.c vers.c LOADER_DISK_SUPPORT?= yes LOADER_UFS_SUPPORT?= yes LOADER_CD9660_SUPPORT?= yes +LOADER_ZFS_SUPPORT?= no LOADER_NET_SUPPORT?= yes LOADER_NFS_SUPPORT?= yes LOADER_TFTP_SUPPORT?= yes LOADER_GZIP_SUPPORT?= yes LOADER_BZIP2_SUPPORT?= no +LOADER_DEBUG?= no +.if ${LOADER_DEBUG} == "yes" +CFLAGS+= -DLOADER_DEBUG +.endif .if ${LOADER_DISK_SUPPORT} == "yes" CFLAGS+= -DLOADER_DISK_SUPPORT .endif @@ -28,6 +33,12 @@ CFLAGS+= -DLOADER_UFS_SUPPORT .if ${LOADER_CD9660_SUPPORT} == "yes" CFLAGS+= -DLOADER_CD9660_SUPPORT .endif +.if ${LOADER_ZFS_SUPPORT} == "yes" +CFLAGS+= -DLOADER_ZFS_SUPPORT +CFLAGS+= -I${.CURDIR}/../../zfs +CFLAGS+= -I${.CURDIR}/../../../cddl/boot/zfs +LIBZFSBOOT= ${.OBJDIR}/../../zfs/libzfsboot.a +.endif .if ${LOADER_GZIP_SUPPORT} == "yes" CFLAGS+= -DLOADER_GZIP_SUPPORT .endif @@ -47,7 +58,8 @@ CFLAGS+= -DLOADER_TFTP_SUPPORT .if ${MK_FORTH} != "no" # Enable BootForth BOOT_FORTH= yes -CFLAGS+= -DBOOT_FORTH -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/sparc64 +CFLAGS+= -DBOOT_FORTH -I${.CURDIR}/../../ficl +CFLAGS+= -I${.CURDIR}/../../ficl/sparc64 LIBFICL= ${.OBJDIR}/../../ficl/libficl.a .endif @@ -72,11 +84,12 @@ CFLAGS+= -I${.CURDIR}/../../ofw/libofw/ # where to get libstand from CFLAGS+= -I${.CURDIR}/../../../../lib/libstand/ -DPADD= ${LIBFICL} ${LIBOFW} ${LIBSTAND} -LDADD= ${LIBFICL} ${LIBOFW} -lstand +DPADD= ${LIBFICL} ${LIBZFSBOOT} ${LIBOFW} ${LIBSTAND} +LDADD= ${LIBFICL} ${LIBZFSBOOT} ${LIBOFW} -lstand -vers.c: ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version - sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version ${NEWVERSWHAT} +vers.c: ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/../loader/version + sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/../loader/version \ + ${NEWVERSWHAT} loader.help: help.common help.sparc64 cat ${.ALLSRC} | \ diff --git a/sys/boot/sparc64/loader/main.c b/sys/boot/sparc64/loader/main.c index be0819f3525..4cbea174653 100644 --- a/sys/boot/sparc64/loader/main.c +++ b/sys/boot/sparc64/loader/main.c @@ -51,6 +51,10 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef LOADER_ZFS_SUPPORT +#include +#include "../zfs/libzfs.h" +#endif #include #include @@ -71,11 +75,7 @@ __FBSDID("$FreeBSD$"); #include "libofw.h" #include "dev_net.h" -#ifndef CTASSERT -#define CTASSERT(x) _CTASSERT(x, __LINE__) -#define _CTASSERT(x, y) __CTASSERT(x, y) -#define __CTASSERT(x, y) typedef char __assert ## y[(x) ? 1 : -1] -#endif +#define MAXDEV 31 extern char bootprog_name[], bootprog_rev[], bootprog_date[], bootprog_maker[]; @@ -141,6 +141,7 @@ static u_int tlb_locked; static vm_offset_t curkva = 0; static vm_offset_t heapva; +static char bootpath[64]; static phandle_t root; /* @@ -153,6 +154,9 @@ struct devsw *devsw[] = { #endif #ifdef LOADER_NET_SUPPORT &netdev, +#endif +#ifdef LOADER_ZFS_SUPPORT + &zfs_dev, #endif 0 }; @@ -166,6 +170,7 @@ struct file_format *file_formats[] = { &sparc64_elf, 0 }; + struct fs_ops *file_system[] = { #ifdef LOADER_UFS_SUPPORT &ufs_fsops, @@ -173,6 +178,9 @@ struct fs_ops *file_system[] = { #ifdef LOADER_CD9660_SUPPORT &cd9660_fsops, #endif +#ifdef LOADER_ZFS_SUPPORT + &zfs_fsops, +#endif #ifdef LOADER_ZIP_SUPPORT &zipfs_fsops, #endif @@ -721,10 +729,58 @@ tlb_init_sun4u(void) panic("%s: can't allocate TLB store", __func__); } +#ifdef LOADER_ZFS_SUPPORT +static void +sparc64_zfs_probe(void) +{ + struct vtoc8 vtoc; + struct zfs_devdesc zfs_currdev; + char devname[32]; + uint64_t guid; + int fd, part, unit; + + /* Get the GUID of the ZFS pool on the boot device. */ + guid = 0; + zfs_probe_dev(bootpath, &guid); + + for (unit = 0; unit < MAXDEV; unit++) { + /* Find freebsd-zfs slices in the VTOC. */ + sprintf(devname, "disk%d:", unit); + fd = open(devname, O_RDONLY); + if (fd == -1) + continue; + lseek(fd, 0, SEEK_SET); + if (read(fd, &vtoc, sizeof(vtoc)) != sizeof(vtoc)) { + close(fd); + continue; + } + close(fd); + + for (part = 0; part < 8; part++) { + if (part == 2 || vtoc.part[part].tag != + VTOC_TAG_FREEBSD_ZFS) + continue; + sprintf(devname, "disk%d:%c", unit, part + 'a'); + if (zfs_probe_dev(devname, NULL) == ENXIO) + break; + } + } + + if (guid != 0) { + zfs_currdev.pool_guid = guid; + zfs_currdev.root_guid = 0; + zfs_currdev.d_dev = &zfs_dev; + zfs_currdev.d_type = zfs_currdev.d_dev->dv_type; + (void)strncpy(bootpath, zfs_fmtdev(&zfs_currdev), + sizeof(bootpath) - 1); + bootpath[sizeof(bootpath) - 1] = '\0'; + } +} +#endif /* LOADER_ZFS_SUPPORT */ + int main(int (*openfirm)(void *)) { - char bootpath[64]; char compatible[32]; struct devsw **dp; @@ -738,6 +794,9 @@ main(int (*openfirm)(void *)) archsw.arch_copyout = ofw_copyout; archsw.arch_readin = sparc64_readin; archsw.arch_autoload = sparc64_autoload; +#ifdef LOADER_ZFS_SUPPORT + archsw.arch_zfs_probe = sparc64_zfs_probe; +#endif if (init_heap() == (vm_offset_t)-1) OF_exit(); @@ -755,14 +814,6 @@ main(int (*openfirm)(void *)) mmu_ops->tlb_init(); - /* - * Initialize devices. - */ - for (dp = devsw; *dp != 0; dp++) { - if ((*dp)->dv_init != 0) - (*dp)->dv_init(); - } - /* * Set up the current device. */ @@ -780,11 +831,23 @@ main(int (*openfirm)(void *)) * needs to be altered. */ if (bootpath[strlen(bootpath) - 2] == ':' && - bootpath[strlen(bootpath) - 1] == 'f') { + bootpath[strlen(bootpath) - 1] == 'f' && + strstr(bootpath, "cdrom") != NULL) { bootpath[strlen(bootpath) - 1] = 'a'; printf("Boot path set to %s\n", bootpath); } + /* + * Initialize devices. + */ + for (dp = devsw; *dp != 0; dp++) + if ((*dp)->dv_init != 0) + (*dp)->dv_init(); + + /* + * Now that sparc64_zfs_probe() might have altered bootpath, + * export it. + */ env_setenv("currdev", EV_VOLATILE, bootpath, ofw_setcurrdev, env_nounset); env_setenv("loaddev", EV_VOLATILE, bootpath, @@ -800,6 +863,18 @@ main(int (*openfirm)(void *)) return (1); } +COMMAND_SET(heap, "heap", "show heap usage", command_heap); + +static int +command_heap(int argc, char *argv[]) +{ + + mallocstats(); + printf("heap base at %p, top at %p, upper limit at %p\n", heapva, + sbrk(0), heapva + HEAPSZ); + return(CMD_OK); +} + COMMAND_SET(reboot, "reboot", "reboot the system", command_reboot); static int diff --git a/sys/boot/sparc64/zfsboot/Makefile b/sys/boot/sparc64/zfsboot/Makefile new file mode 100644 index 00000000000..9e58c27eb06 --- /dev/null +++ b/sys/boot/sparc64/zfsboot/Makefile @@ -0,0 +1,9 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../boot1 + +PROGNAME= zfsboot +CFLAGS+= -DZFSBOOT +FILES= zfsboot + +.include "${.CURDIR}/../boot1/Makefile" diff --git a/sys/boot/sparc64/zfsloader/Makefile b/sys/boot/sparc64/zfsloader/Makefile new file mode 100644 index 00000000000..1ed28082924 --- /dev/null +++ b/sys/boot/sparc64/zfsloader/Makefile @@ -0,0 +1,9 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../loader + +PROG= zfsloader +NEWVERSWHAT= "ZFS enabled bootstrap loader" sparc64 +LOADER_ZFS_SUPPORT=yes + +.include "${.CURDIR}/../loader/Makefile" diff --git a/sys/boot/uboot/common/metadata.c b/sys/boot/uboot/common/metadata.c index 7b6e1fceff8..40accc0ef7e 100644 --- a/sys/boot/uboot/common/metadata.c +++ b/sys/boot/uboot/common/metadata.c @@ -42,7 +42,7 @@ __FBSDID("$FreeBSD$"); #include "glue.h" #if defined(LOADER_FDT_SUPPORT) -extern int fdt_fixup(void); +extern vm_offset_t fdt_fixup(void); #endif /* @@ -72,6 +72,7 @@ static int md_getboothowto(char *kargs) { char *cp; + char *p; int howto; int active; int i; @@ -132,10 +133,12 @@ md_getboothowto(char *kargs) if (getenv(howto_names[i].ev) != NULL) howto |= howto_names[i].mask; } - if (!strcmp(getenv("console"), "comconsole")) - howto |= RB_SERIAL; - if (!strcmp(getenv("console"), "nullconsole")) - howto |= RB_MUTE; + if ((p = getenv("console"))) { + if (!strcmp(p, "comconsole")) + howto |= RB_SERIAL; + if (!strcmp(p, "nullconsole")) + howto |= RB_MUTE; + } return(howto); } @@ -334,7 +337,7 @@ md_load(char *args, vm_offset_t *modulep) #if defined(LOADER_FDT_SUPPORT) /* Handle device tree blob */ dtbp = fdt_fixup(); - if (dtbp != (vm_offset_t)NULL) + if (dtbp != 0) file_addmetadata(kfp, MODINFOMD_DTBP, sizeof dtbp, &dtbp); else pager_output("WARNING! Trying to fire up the kernel, but no " diff --git a/sys/boot/uboot/lib/api_public.h b/sys/boot/uboot/lib/api_public.h index b0140c5a68c..95374797250 100644 --- a/sys/boot/uboot/lib/api_public.h +++ b/sys/boot/uboot/lib/api_public.h @@ -132,6 +132,7 @@ typedef unsigned long lbastart_t; #define DT_STOR_SCSI 0x0020 #define DT_STOR_USB 0x0040 #define DT_STOR_MMC 0x0080 +#define DT_STOR_NAND 0x0100 #define DEV_STA_CLOSED 0x0000 /* invalid, closed */ #define DEV_STA_OPEN 0x0001 /* open i.e. active */ diff --git a/sys/boot/uboot/lib/copy.c b/sys/boot/uboot/lib/copy.c index e5e462612a5..71b7a94bbb9 100644 --- a/sys/boot/uboot/lib/copy.c +++ b/sys/boot/uboot/lib/copy.c @@ -29,32 +29,64 @@ __FBSDID("$FreeBSD$"); #include +#include + +#include "api_public.h" +#include "glue.h" /* * MD primitives supporting placement of module data - * - * XXX should check load address/size against memory top. */ +void * +uboot_vm_translate(vm_offset_t o) { + struct sys_info *si; + static uintptr_t start = 0; + static size_t size = 0; + int i; + + if (size == 0) { + if ((si = ub_get_sys_info()) == NULL) + panic("could not retrieve system info"); + + /* Find start/size of largest DRAM block. */ + for (i = 0; i < si->mr_no; i++) { + if (si->mr[i].flags == MR_ATTR_DRAM + && si->mr[i].size > size) { + start = si->mr[i].start; + size = si->mr[i].size; + } + } + + if (size <= 0) + panic("No suitable DRAM?\n"); + /* + printf("Loading into memory region 0x%08X-0x%08X (%d MiB)\n", + start, start + size, size / 1024 / 1024); + */ + } + if (o > size) + panic("Address 0x%08jX bigger than size 0x%08X\n", + (intmax_t)o, size); + return (void *)(start + o); +} + ssize_t uboot_copyin(const void *src, vm_offset_t dest, const size_t len) { - - bcopy(src, (void *)dest, len); + bcopy(src, uboot_vm_translate(dest), len); return (len); } ssize_t uboot_copyout(const vm_offset_t src, void *dest, const size_t len) { - - bcopy((void *)src, dest, len); + bcopy(uboot_vm_translate(src), dest, len); return (len); } ssize_t uboot_readin(const int fd, vm_offset_t dest, const size_t len) { - - return (read(fd, (void *) dest, len)); + return (read(fd, uboot_vm_translate(dest), len)); } diff --git a/sys/boot/uboot/lib/devicename.c b/sys/boot/uboot/lib/devicename.c index 27ea5ccd1fd..e4b176f59bc 100644 --- a/sys/boot/uboot/lib/devicename.c +++ b/sys/boot/uboot/lib/devicename.c @@ -131,6 +131,10 @@ uboot_parsedev(struct uboot_devdesc **dev, const char *devspec, *(cp + 1) != ':') { pnum = strtol(cp + 1, &cp, 10); ptype = PTYPE_GPT; + } else if (*cp == 's' && *(cp + 1) && + *(cp + 1) != ':') { + pnum = strtol(cp + 1, &cp, 10); + ptype = PTYPE_MBR; } else { pnum = *cp - 'a'; ptype = PTYPE_BSDLABEL; @@ -218,6 +222,9 @@ uboot_fmtdev(void *vdev) else if (dev->d_kind.disk.ptype == PTYPE_GPT) cp += sprintf(cp, "p%i", dev->d_kind.disk.pnum); + else if (dev->d_kind.disk.ptype == PTYPE_MBR) + cp += sprintf(cp, "s%i", + dev->d_kind.disk.pnum); } strcat(cp, ":"); diff --git a/sys/boot/uboot/lib/disk.c b/sys/boot/uboot/lib/disk.c index a570d9a4302..a7e4f5f7ab8 100644 --- a/sys/boot/uboot/lib/disk.c +++ b/sys/boot/uboot/lib/disk.c @@ -397,6 +397,94 @@ out: return (err); } +static int +stor_open_mbr(struct open_dev *od, struct uboot_devdesc *dev) +{ + char *buf = NULL; + struct dos_partition *dp; + int err, i, part; + + od->od_nparts = 0; + od->od_partitions = NULL; + + /* Block size must be at least 512 bytes. */ + if (od->od_bsize < 512) + return (ENXIO); + + /* Read MBR */ + buf = malloc(od->od_bsize); + if (!buf) { + stor_printf("could not allocate memory for MBR\n"); + return (ENOMEM); + } + err = stor_readdev(dev, 0, 1, buf); + if (err) { + stor_printf("MBR read error=%d\n", err); + err = EIO; + goto out; + } + + /* Check the slice table magic. */ + if (le16toh(*((uint16_t *)(buf + DOSMAGICOFFSET))) != DOSMAGIC) { + err = ENXIO; + goto out; + } + + /* Save information about partitions. */ + dp = (struct dos_partition *)(buf + DOSPARTOFF); + od->od_partitions = calloc(NDOSPART, sizeof(struct gpt_part)); + if (!od->od_partitions) { + stor_printf("could not allocate memory for MBR partitions\n"); + err = ENOMEM; + goto out; + } + + part = 0; + for (i = 0; i < NDOSPART; i++) { + u_int32_t start = le32dec(&dp[i].dp_start); + u_int32_t size = le32dec(&dp[i].dp_size); + uuid_t *u = NULL; + + /* Map MBR partition types to GPT partition types. */ + switch (dp[i].dp_typ) { + case DOSPTYP_386BSD: + u = &freebsd_ufs; + break; + /* XXX Other types XXX */ + } + + if (u) { + od->od_partitions[part].gp_type = *u; + od->od_partitions[part].gp_index = i + 1; + od->od_partitions[part].gp_start = start; + od->od_partitions[part].gp_end = start + size; + part += 1; + } + } + od->od_nparts = part; + + if (od->od_nparts == 0) { + err = EINVAL; + goto out; + } + + dev->d_disk.ptype = PTYPE_MBR; + + /* XXX Be smarter here? XXX */ + if (dev->d_disk.pnum == 0) + dev->d_disk.pnum = od->od_partitions[0].gp_index; + + for (i = 0; i < od->od_nparts; i++) + if (od->od_partitions[i].gp_index == dev->d_disk.pnum) + od->od_bstart = od->od_partitions[i].gp_start; + +out: + if (err && od->od_partitions) + free(od->od_partitions); + free(buf); + return (err); +} + static int stor_open_bsdlabel(struct open_dev *od, struct uboot_devdesc *dev) { @@ -443,7 +531,7 @@ stor_readdev(struct uboot_devdesc *dev, daddr_t blk, size_t size, char *buf) lbasize_t real_size; int err, handle; - debugf("reading size=%d @ 0x%08x\n", size, (uint32_t)buf); + debugf("reading blk=%d size=%d @ 0x%08x\n", (int)blk, size, (uint32_t)buf); handle = stor_info[dev->d_unit]; err = ub_dev_read(handle, buf, size, blk, &real_size); @@ -495,7 +583,10 @@ stor_opendev(struct open_dev **odp, struct uboot_devdesc *dev) od->od_bsize = di->di_stor.block_size; od->od_bstart = 0; - if ((err = stor_open_gpt(od, dev)) != 0) + err = stor_open_gpt(od, dev); + if (err != 0) + err = stor_open_mbr(od, dev); + if (err != 0) err = stor_open_bsdlabel(od, dev); if (err != 0) @@ -517,6 +608,8 @@ stor_closedev(struct uboot_devdesc *dev) od = (struct open_dev *)dev->d_disk.data; if (dev->d_disk.ptype == PTYPE_GPT && od->od_nparts != 0) free(od->od_partitions); + if (dev->d_disk.ptype == PTYPE_MBR && od->od_nparts != 0) + free(od->od_partitions); free(od); dev->d_disk.data = NULL; diff --git a/sys/boot/uboot/lib/elf_freebsd.c b/sys/boot/uboot/lib/elf_freebsd.c index 222c3145372..bbde80c8144 100644 --- a/sys/boot/uboot/lib/elf_freebsd.c +++ b/sys/boot/uboot/lib/elf_freebsd.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include #include "bootstrap.h" +#include "libuboot.h" extern vm_offset_t md_load(char *, vm_offset_t *); @@ -69,6 +70,7 @@ __elfN(uboot_exec)(struct preloaded_file *fp) vm_offset_t mdp; Elf_Ehdr *e; int error; + void (*entry)(void *); if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) return (EFTYPE); @@ -78,11 +80,12 @@ __elfN(uboot_exec)(struct preloaded_file *fp) if ((error = md_load(fp->f_args, &mdp)) != 0) return (error); - printf("Kernel entry at 0x%x ...\n", e->e_entry); + entry = uboot_vm_translate(e->e_entry); + printf("Kernel entry at 0x%x...\n", (unsigned)entry); dev_cleanup(); - (*(void (*)())e->e_entry)((void *)mdp); + (*entry)((void *)mdp); panic("exec returned"); } diff --git a/sys/boot/uboot/lib/glue.c b/sys/boot/uboot/lib/glue.c index f154dc64462..df12a7db01e 100644 --- a/sys/boot/uboot/lib/glue.c +++ b/sys/boot/uboot/lib/glue.c @@ -407,6 +407,9 @@ ub_stor_type(int type) if (type & DT_STOR_MMC) return ("MMC"); + if (type & DT_STOR_NAND) + return ("NAND"); + return ("Unknown"); } diff --git a/sys/boot/uboot/lib/libuboot.h b/sys/boot/uboot/lib/libuboot.h index 7c8050cb209..16f4331c051 100644 --- a/sys/boot/uboot/lib/libuboot.h +++ b/sys/boot/uboot/lib/libuboot.h @@ -45,6 +45,7 @@ struct uboot_devdesc #define PTYPE_BSDLABEL 1 #define PTYPE_GPT 2 +#define PTYPE_MBR 3 /* * Default network packet alignment in memory @@ -59,6 +60,7 @@ extern int devs_no; extern struct netif_driver uboot_net; extern struct devsw uboot_storage; +void *uboot_vm_translate(vm_offset_t); ssize_t uboot_copyin(const void *src, vm_offset_t dest, const size_t len); ssize_t uboot_copyout(const vm_offset_t src, void *dest, const size_t len); ssize_t uboot_readin(const int fd, vm_offset_t dest, const size_t len); diff --git a/sys/boot/userboot/libstand/Makefile b/sys/boot/userboot/libstand/Makefile index 7bb46388005..fa54b016450 100644 --- a/sys/boot/userboot/libstand/Makefile +++ b/sys/boot/userboot/libstand/Makefile @@ -42,7 +42,7 @@ CFLAGS+= -msoft-float -D_STANDALONE .endif # standalone components and stuff we have modified locally -SRCS+= zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c gets.c \ +SRCS+= gzguts.h zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c gets.c \ globals.c pager.c printf.c strdup.c strerror.c strtol.c random.c \ sbrk.c twiddle.c zalloc.c zalloc_malloc.c @@ -125,23 +125,28 @@ libstand_bzlib_private.h: bzlib_private.h # decompression functionality from libz .PATH: ${.CURDIR}/../../../../lib/libz CFLAGS+=-DHAVE_MEMCPY -I${.CURDIR}/../../../../lib/libz -SRCS+= adler32.c crc32.c libstand_zutil.h +SRCS+= adler32.c crc32.c libstand_zutil.h libstand_gzguts.h .for file in infback.c inffast.c inflate.c inftrees.c zutil.c SRCS+= _${file} CLEANFILES+= _${file} _${file}: ${file} - sed "s|zutil\.h|libstand_zutil.h|" ${.ALLSRC} > ${.TARGET} + sed -e "s|zutil\.h|libstand_zutil.h|" \ + -e "s|gzguts\.h|libstand_gzguts.h|" ${.ALLSRC} > ${.TARGET} .endfor # depend on stand.h being able to be included multiple times -CLEANFILES+= libstand_zutil.h -libstand_zutil.h: zutil.h - sed -e 's||"stand.h"|' \ +.for file in zutil.h gzguts.h +CLEANFILES+= libstand_${file} +libstand_${file}: ${file} + sed -e 's||"stand.h"|' \ + -e 's||"stand.h"|' \ -e 's||"stand.h"|' \ + -e 's||"stand.h"|' \ -e 's||"stand.h"|' \ ${.ALLSRC} > ${.TARGET} +.endfor # io routines SRCS+= closeall.c dev.c ioctl.c nullfs.c stat.c \ diff --git a/sys/boot/zfs/devicename_stubs.c b/sys/boot/zfs/devicename_stubs.c new file mode 100644 index 00000000000..41bf907e0cf --- /dev/null +++ b/sys/boot/zfs/devicename_stubs.c @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2012 Andriy Gapon + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include "libzfs.h" + +__attribute__((weak)) +int +zfs_parsedev(struct zfs_devdesc *dev, const char *devspec, const char **path) +{ + return (EINVAL); +} + +__attribute__((weak)) +char * +zfs_fmtdev(void *vdev) +{ + static char buf[128]; + + return (buf); +} diff --git a/sys/boot/zfs/libzfs.h b/sys/boot/zfs/libzfs.h new file mode 100644 index 00000000000..5c114dbded0 --- /dev/null +++ b/sys/boot/zfs/libzfs.h @@ -0,0 +1,66 @@ +/*- + * Copyright (c) 2012 Andriy Gapon + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _BOOT_LIBZFS_H_ +#define _BOOT_LIBZFS_H_ + +#define ZFS_MAXNAMELEN 256 + +/* + * ZFS fully-qualified device descriptor. + * Note, this must match the 'struct devdesc' declaration in bootstrap.h. + * Arch-specific device descriptors should be binary compatible with this + * structure if they are to support ZFS. + */ +struct zfs_devdesc +{ + struct devsw *d_dev; + int d_type; + int d_unit; + void *d_opendata; + uint64_t pool_guid; + uint64_t root_guid; +}; + +struct zfs_boot_args +{ + uint32_t size; + uint32_t reserved; + uint64_t pool; + uint64_t root; +}; + +int zfs_parsedev(struct zfs_devdesc *dev, const char *devspec, + const char **path); +char *zfs_fmtdev(void *vdev); +int zfs_probe_dev(const char *devname, uint64_t *pool_guid); + +extern struct devsw zfs_dev; +extern struct fs_ops zfs_fsops; + +#endif /*_BOOT_LIBZFS_H_*/ diff --git a/sys/boot/zfs/zfs.c b/sys/boot/zfs/zfs.c index e313fdea380..cffb19ec8b5 100644 --- a/sys/boot/zfs/zfs.c +++ b/sys/boot/zfs/zfs.c @@ -43,9 +43,9 @@ __FBSDID("$FreeBSD$"); #include #include -#include "zfsimpl.c" +#include "libzfs.h" -#define MAXBDDEV 31 +#include "zfsimpl.c" static int zfs_open(const char *path, struct open_file *f); static int zfs_write(struct open_file *f, void *buf, size_t size, size_t *resid); @@ -85,35 +85,20 @@ struct file { static int zfs_open(const char *upath, struct open_file *f) { - spa_t *spa = (spa_t *) f->f_devdata; + struct zfsmount *mount = (struct zfsmount *)f->f_devdata; struct file *fp; int rc; if (f->f_dev != &zfs_dev) return (EINVAL); - rc = zfs_mount_pool(spa); - if (rc) - return (rc); - /* allocate file system specific data structure */ fp = malloc(sizeof(struct file)); bzero(fp, sizeof(struct file)); f->f_fsdata = (void *)fp; - if (spa->spa_root_objset.os_type != DMU_OST_ZFS) { - printf("Unexpected object set type %llu\n", - spa->spa_root_objset.os_type); - rc = EIO; - goto out; - } - - rc = zfs_lookup(spa, upath, &fp->f_dnode); - if (rc) - goto out; - + rc = zfs_lookup(mount, upath, &fp->f_dnode); fp->f_seekp = 0; -out: if (rc) { f->f_fsdata = NULL; free(fp); @@ -142,7 +127,7 @@ zfs_close(struct open_file *f) static int zfs_read(struct open_file *f, void *start, size_t size, size_t *resid /* out */) { - spa_t *spa = (spa_t *) f->f_devdata; + const spa_t *spa = ((struct zfsmount *)f->f_devdata)->spa; struct file *fp = (struct file *)f->f_fsdata; struct stat sb; size_t n; @@ -216,7 +201,7 @@ zfs_seek(struct open_file *f, off_t offset, int where) static int zfs_stat(struct open_file *f, struct stat *sb) { - spa_t *spa = (spa_t *) f->f_devdata; + const spa_t *spa = ((struct zfsmount *)f->f_devdata)->spa; struct file *fp = (struct file *)f->f_fsdata; return (zfs_dnode_stat(spa, &fp->f_dnode, sb)); @@ -225,7 +210,7 @@ zfs_stat(struct open_file *f, struct stat *sb) static int zfs_readdir(struct open_file *f, struct dirent *d) { - spa_t *spa = (spa_t *) f->f_devdata; + const spa_t *spa = ((struct zfsmount *)f->f_devdata)->spa; struct file *fp = (struct file *)f->f_fsdata; mzap_ent_phys_t mze; struct stat sb; @@ -381,64 +366,31 @@ vdev_read(vdev_t *vdev, void *priv, off_t offset, void *buf, size_t size) } } -/* - * Convert a pool guid to a 'unit number' suitable for use with zfs_dev_open. - */ -int -zfs_guid_to_unit(uint64_t guid) +static int +zfs_dev_init(void) { - spa_t *spa; - int unit; - - unit = 0; - STAILQ_FOREACH(spa, &zfs_pools, spa_link) { - if (spa->spa_guid == guid) - return unit; - unit++; - } - return (-1); + zfs_init(); + if (archsw.arch_zfs_probe == NULL) + return (ENXIO); + archsw.arch_zfs_probe(); + return (0); } -static int -zfs_dev_init(void) +int +zfs_probe_dev(const char *devname, uint64_t *pool_guid) { - char devname[512]; - int unit, slice; + spa_t *spa; int fd; + int ret; - /* - * Open all the disks we can find and see if we can reconstruct - * ZFS pools from them. Bogusly assumes that the disks are named - * diskN, diskNpM or diskNsM. - */ - zfs_init(); - for (unit = 0; unit < MAXBDDEV; unit++) { - sprintf(devname, "disk%d:", unit); - fd = open(devname, O_RDONLY); - if (fd == -1) - continue; - - /* - * If we find a vdev, the zfs code will eat the fd, otherwise - * we close it. - */ - if (vdev_probe(vdev_read, (void*) (uintptr_t) fd, 0)) - close(fd); - - for (slice = 1; slice <= 128; slice++) { - sprintf(devname, "disk%dp%d:", unit, slice); - fd = open(devname, O_RDONLY); - if (fd == -1) { - sprintf(devname, "disk%ds%d:", unit, slice); - fd = open(devname, O_RDONLY); - if (fd == -1) - continue; - } - if (vdev_probe(vdev_read, (void*) (uintptr_t) fd, 0)) - close(fd); - } - } - + fd = open(devname, O_RDONLY); + if (fd == -1) + return (ENXIO); + ret = vdev_probe(vdev_read, (void *)(uintptr_t)fd, &spa); + if (ret != 0) + close(fd); + else if (pool_guid != NULL) + *pool_guid = spa->spa_guid; return (0); } @@ -450,54 +402,52 @@ zfs_dev_print(int verbose) { spa_t *spa; char line[80]; - int unit; if (verbose) { spa_all_status(); return; } - unit = 0; STAILQ_FOREACH(spa, &zfs_pools, spa_link) { - sprintf(line, " zfs%d: %s\n", unit, spa->spa_name); + sprintf(line, " zfs:%s\n", spa->spa_name); pager_output(line); - unit++; } } /* * Attempt to open the pool described by (dev) for use by (f). */ -static int +static int zfs_dev_open(struct open_file *f, ...) { va_list args; - struct devdesc *dev; - int unit, i; + struct zfs_devdesc *dev; + struct zfsmount *mount; spa_t *spa; + int rv; va_start(args, f); - dev = va_arg(args, struct devdesc*); + dev = va_arg(args, struct zfs_devdesc *); va_end(args); - /* - * We mostly ignore the stuff that devopen sends us. For now, - * use the unit to find a pool - later we will override the - * devname parsing so that we can name a pool and a fs within - * the pool. - */ - unit = dev->d_unit; - - i = 0; - STAILQ_FOREACH(spa, &zfs_pools, spa_link) { - if (i == unit) - break; - i++; - } - if (!spa) { + spa = spa_find_by_guid(dev->pool_guid); + if (!spa) return (ENXIO); + rv = zfs_spa_init(spa); + if (rv != 0) + return (rv); + mount = malloc(sizeof(*mount)); + rv = zfs_mount(spa, dev->root_guid, mount); + if (rv != 0) { + free(mount); + return (rv); } - - f->f_devdata = spa; + if (mount->objset.os_type != DMU_OST_ZFS) { + printf("Unexpected object set type %ju\n", + (uintmax_t)mount->objset.os_type); + free(mount); + return (EIO); + } + f->f_devdata = mount; free(dev); return (0); } @@ -506,6 +456,7 @@ static int zfs_dev_close(struct open_file *f) { + free(f->f_devdata); f->f_devdata = NULL; return (0); } @@ -518,13 +469,102 @@ zfs_dev_strategy(void *devdata, int rw, daddr_t dblk, size_t size, char *buf, si } struct devsw zfs_dev = { - .dv_name = "zfs", - .dv_type = DEVT_ZFS, + .dv_name = "zfs", + .dv_type = DEVT_ZFS, .dv_init = zfs_dev_init, - .dv_strategy = zfs_dev_strategy, - .dv_open = zfs_dev_open, - .dv_close = zfs_dev_close, + .dv_strategy = zfs_dev_strategy, + .dv_open = zfs_dev_open, + .dv_close = zfs_dev_close, .dv_ioctl = noioctl, .dv_print = zfs_dev_print, .dv_cleanup = NULL }; + +int +zfs_parsedev(struct zfs_devdesc *dev, const char *devspec, const char **path) +{ + static char rootname[ZFS_MAXNAMELEN]; + static char poolname[ZFS_MAXNAMELEN]; + spa_t *spa; + const char *end; + const char *np; + const char *sep; + int rv; + + np = devspec; + if (*np != ':') + return (EINVAL); + np++; + end = strchr(np, ':'); + if (end == NULL) + return (EINVAL); + sep = strchr(np, '/'); + if (sep == NULL || sep >= end) + sep = end; + memcpy(poolname, np, sep - np); + poolname[sep - np] = '\0'; + if (sep < end) { + sep++; + memcpy(rootname, sep, end - sep); + rootname[end - sep] = '\0'; + } + else + rootname[0] = '\0'; + + spa = spa_find_by_name(poolname); + if (!spa) + return (ENXIO); + rv = zfs_spa_init(spa); + if (rv != 0) + return (rv); + dev->pool_guid = spa->spa_guid; + if (rootname[0] != '\0') { + rv = zfs_lookup_dataset(spa, rootname, &dev->root_guid); + if (rv != 0) + return (rv); + } else + dev->root_guid = 0; + if (path != NULL) + *path = (*end == '\0') ? end : end + 1; + dev->d_dev = &zfs_dev; + dev->d_type = zfs_dev.dv_type; + return (0); +} + +char * +zfs_fmtdev(void *vdev) +{ + static char rootname[ZFS_MAXNAMELEN]; + static char buf[2 * ZFS_MAXNAMELEN + 8]; + struct zfs_devdesc *dev = (struct zfs_devdesc *)vdev; + spa_t *spa; + + buf[0] = '\0'; + if (dev->d_type != DEVT_ZFS) + return (buf); + + spa = spa_find_by_guid(dev->pool_guid); + if (spa == NULL) { + printf("ZFS: can't find pool by guid\n"); + return (buf); + } + if (zfs_spa_init(spa) != 0) { + printf("ZFS: can't init pool\n"); + return (buf); + } + if (dev->root_guid == 0 && zfs_get_root(spa, &dev->root_guid)) { + printf("ZFS: can't find root filesystem\n"); + return (buf); + } + if (zfs_rlookup(spa, dev->root_guid, rootname)) { + printf("ZFS: can't find filesystem by guid\n"); + return (buf); + } + + if (rootname[0] == '\0') + sprintf(buf, "%s:%s:", dev->d_dev->dv_name, spa->spa_name); + else + sprintf(buf, "%s:%s/%s:", dev->d_dev->dv_name, spa->spa_name, + rootname); + return (buf); +} diff --git a/sys/boot/zfs/zfsimpl.c b/sys/boot/zfs/zfsimpl.c index 55c6e2815d1..dd90c6c3fd1 100644 --- a/sys/boot/zfs/zfsimpl.c +++ b/sys/boot/zfs/zfsimpl.c @@ -32,15 +32,30 @@ __FBSDID("$FreeBSD$"); */ #include +#include #include "zfsimpl.h" #include "zfssubr.c" + +struct zfsmount { + const spa_t *spa; + objset_phys_t objset; + uint64_t rootobj; +}; + /* * List of all vdevs, chained through v_alllink. */ static vdev_list_t zfs_vdevs; + /* + * List of ZFS features supported for read + */ +static const char *features_for_read[] = { + NULL +}; + /* * List of all pools, chained through spa_link. */ @@ -55,7 +70,7 @@ static char *zfs_temp_buf, *zfs_temp_end, *zfs_temp_ptr; #define TEMP_SIZE (1024 * 1024) -static int zio_read(spa_t *spa, const blkptr_t *bp, void *buf); +static int zio_read(const spa_t *spa, const blkptr_t *bp, void *buf); static void zfs_init(void) @@ -190,6 +205,57 @@ nvlist_find(const unsigned char *nvlist, const char *name, int type, return (EIO); } +static int +nvlist_check_features_for_read(const unsigned char *nvlist) +{ + const unsigned char *p, *pair; + int junk; + int encoded_size, decoded_size; + int rc; + + rc = 0; + + p = nvlist; + xdr_int(&p, &junk); + xdr_int(&p, &junk); + + pair = p; + xdr_int(&p, &encoded_size); + xdr_int(&p, &decoded_size); + while (encoded_size && decoded_size) { + int namelen, pairtype; + const char *pairname; + int i, found; + + found = 0; + + xdr_int(&p, &namelen); + pairname = (const char*) p; + p += roundup(namelen, 4); + xdr_int(&p, &pairtype); + + for (i = 0; features_for_read[i] != NULL; i++) { + if (!memcmp(pairname, features_for_read[i], namelen)) { + found = 1; + break; + } + } + + if (!found) { + printf("ZFS: unsupported feature: %s\n", pairname); + rc = EIO; + } + + p = pair + encoded_size; + + pair = p; + xdr_int(&p, &encoded_size); + xdr_int(&p, &decoded_size); + } + + return (rc); +} + /* * Return the next nvlist in an nvlist array. */ @@ -283,7 +349,7 @@ nvlist_print(const unsigned char *nvlist, unsigned int indent) case DATA_TYPE_UINT64: { uint64_t val; xdr_uint64_t(&p, &val); - printf(" = 0x%llx\n", val); + printf(" = 0x%jx\n", (uintmax_t)val); break; } @@ -343,7 +409,7 @@ vdev_read_phys(vdev_t *vdev, const blkptr_t *bp, void *buf, psize = size; } - /*printf("ZFS: reading %d bytes at 0x%llx to %p\n", psize, offset, buf);*/ + /*printf("ZFS: reading %d bytes at 0x%jx to %p\n", psize, (uintmax_t)offset, buf);*/ rc = vdev->v_phys_read(vdev, vdev->v_read_priv, offset, buf, psize); if (rc) return (rc); @@ -626,8 +692,6 @@ spa_find_by_guid(uint64_t guid) return (0); } -#ifdef BOOT2 - static spa_t * spa_find_by_name(const char *name) { @@ -640,8 +704,6 @@ spa_find_by_name(const char *name) return (0); } -#endif - static spa_t * spa_create(uint64_t guid) { @@ -784,6 +846,7 @@ vdev_probe(vdev_phys_read_t *read, void *read_priv, spa_t **spap) uint64_t is_log; const char *pool_name; const unsigned char *vdevs; + const unsigned char *features; int i, rc, is_newer; char *upbuf; const struct uberblock *up; @@ -818,12 +881,19 @@ vdev_probe(vdev_phys_read_t *read, void *read_priv, spa_t **spap) return (EIO); } - if (val > SPA_VERSION) { + if (!SPA_VERSION_IS_SUPPORTED(val)) { printf("ZFS: unsupported ZFS version %u (should be %u)\n", (unsigned) val, (unsigned) SPA_VERSION); return (EIO); } + /* Check ZFS features for read */ + if (nvlist_find(nvlist, + ZPOOL_CONFIG_FEATURES_FOR_READ, + DATA_TYPE_NVLIST, 0, &features) == 0 + && nvlist_check_features_for_read(features) != 0) + return (EIO); + if (nvlist_find(nvlist, ZPOOL_CONFIG_POOL_STATE, DATA_TYPE_UINT64, 0, &val)) { @@ -977,7 +1047,7 @@ ilog2(int n) } static int -zio_read_gang(spa_t *spa, const blkptr_t *bp, void *buf) +zio_read_gang(const spa_t *spa, const blkptr_t *bp, void *buf) { blkptr_t gbh_bp; zio_gbh_phys_t zio_gb; @@ -1014,7 +1084,7 @@ zio_read_gang(spa_t *spa, const blkptr_t *bp, void *buf) } static int -zio_read(spa_t *spa, const blkptr_t *bp, void *buf) +zio_read(const spa_t *spa, const blkptr_t *bp, void *buf) { int cpfunc = BP_GET_COMPRESS(bp); uint64_t align, size; @@ -1074,7 +1144,7 @@ zio_read(spa_t *spa, const blkptr_t *bp, void *buf) } static int -dnode_read(spa_t *spa, const dnode_phys_t *dnode, off_t offset, void *buf, size_t buflen) +dnode_read(const spa_t *spa, const dnode_phys_t *dnode, off_t offset, void *buf, size_t buflen) { int ibshift = dnode->dn_indblkshift - SPA_BLKPTRSHIFT; int bsize = dnode->dn_datablkszsec << SPA_MINBLOCKSHIFT; @@ -1137,7 +1207,7 @@ dnode_read(spa_t *spa, const dnode_phys_t *dnode, off_t offset, void *buf, size_ * scratch buffer contains the directory contents. */ static int -mzap_lookup(spa_t *spa, const dnode_phys_t *dnode, const char *name, uint64_t *value) +mzap_lookup(const dnode_phys_t *dnode, const char *name, uint64_t *value) { const mzap_phys_t *mz; const mzap_ent_phys_t *mze; @@ -1218,7 +1288,7 @@ fzap_leaf_value(const zap_leaf_t *zl, const zap_leaf_chunk_t *zc) * buffer contains the directory header. */ static int -fzap_lookup(spa_t *spa, const dnode_phys_t *dnode, const char *name, uint64_t *value) +fzap_lookup(const spa_t *spa, const dnode_phys_t *dnode, const char *name, uint64_t *value) { int bsize = dnode->dn_datablkszsec << SPA_MINBLOCKSHIFT; zap_phys_t zh = *(zap_phys_t *) zap_scratch; @@ -1296,7 +1366,7 @@ fzap_lookup(spa_t *spa, const dnode_phys_t *dnode, const char *name, uint64_t *v * Lookup a name in a zap object and return its value as a uint64_t. */ static int -zap_lookup(spa_t *spa, const dnode_phys_t *dnode, const char *name, uint64_t *value) +zap_lookup(const spa_t *spa, const dnode_phys_t *dnode, const char *name, uint64_t *value) { int rc; uint64_t zap_type; @@ -1308,7 +1378,7 @@ zap_lookup(spa_t *spa, const dnode_phys_t *dnode, const char *name, uint64_t *va zap_type = *(uint64_t *) zap_scratch; if (zap_type == ZBT_MICRO) - return mzap_lookup(spa, dnode, name, value); + return mzap_lookup(dnode, name, value); else if (zap_type == ZBT_HEADER) return fzap_lookup(spa, dnode, name, value); printf("ZFS: invalid zap_type=%d\n", (int)zap_type); @@ -1322,7 +1392,7 @@ zap_lookup(spa_t *spa, const dnode_phys_t *dnode, const char *name, uint64_t *va * the directory contents. */ static int -mzap_list(spa_t *spa, const dnode_phys_t *dnode) +mzap_list(const dnode_phys_t *dnode) { const mzap_phys_t *mz; const mzap_ent_phys_t *mze; @@ -1340,7 +1410,7 @@ mzap_list(spa_t *spa, const dnode_phys_t *dnode) for (i = 0; i < chunks; i++) { mze = &mz->mz_chunk[i]; if (mze->mze_name[0]) - //printf("%-32s 0x%llx\n", mze->mze_name, mze->mze_value); + //printf("%-32s 0x%jx\n", mze->mze_name, (uintmax_t)mze->mze_value); printf("%s\n", mze->mze_name); } @@ -1352,7 +1422,7 @@ mzap_list(spa_t *spa, const dnode_phys_t *dnode) * the directory header. */ static int -fzap_list(spa_t *spa, const dnode_phys_t *dnode) +fzap_list(const spa_t *spa, const dnode_phys_t *dnode) { int bsize = dnode->dn_datablkszsec << SPA_MINBLOCKSHIFT; zap_phys_t zh = *(zap_phys_t *) zap_scratch; @@ -1391,7 +1461,7 @@ fzap_list(spa_t *spa, const dnode_phys_t *dnode) namelen = zc->l_entry.le_name_length; if (namelen > sizeof(name)) namelen = sizeof(name); - + /* * Paste the name back together. */ @@ -1414,7 +1484,7 @@ fzap_list(spa_t *spa, const dnode_phys_t *dnode) */ value = fzap_leaf_value(&zl, zc); - printf("%s 0x%llx\n", name, value); + printf("%s 0x%jx\n", name, (uintmax_t)value); } } @@ -1425,7 +1495,7 @@ fzap_list(spa_t *spa, const dnode_phys_t *dnode) * List a zap directory. */ static int -zap_list(spa_t *spa, const dnode_phys_t *dnode) +zap_list(const spa_t *spa, const dnode_phys_t *dnode) { uint64_t zap_type; size_t size = dnode->dn_datablkszsec * 512; @@ -1435,7 +1505,7 @@ zap_list(spa_t *spa, const dnode_phys_t *dnode) zap_type = *(uint64_t *) zap_scratch; if (zap_type == ZBT_MICRO) - return mzap_list(spa, dnode); + return mzap_list(dnode); else return fzap_list(spa, dnode); } @@ -1443,7 +1513,7 @@ zap_list(spa_t *spa, const dnode_phys_t *dnode) #endif static int -objset_get_dnode(spa_t *spa, const objset_phys_t *os, uint64_t objnum, dnode_phys_t *dnode) +objset_get_dnode(const spa_t *spa, const objset_phys_t *os, uint64_t objnum, dnode_phys_t *dnode) { off_t offset; @@ -1452,24 +1522,278 @@ objset_get_dnode(spa_t *spa, const objset_phys_t *os, uint64_t objnum, dnode_phy dnode, sizeof(dnode_phys_t)); } +static int +mzap_rlookup(const spa_t *spa, const dnode_phys_t *dnode, char *name, uint64_t value) +{ + const mzap_phys_t *mz; + const mzap_ent_phys_t *mze; + size_t size; + int chunks, i; + + /* + * Microzap objects use exactly one block. Read the whole + * thing. + */ + size = dnode->dn_datablkszsec * 512; + + mz = (const mzap_phys_t *) zap_scratch; + chunks = size / MZAP_ENT_LEN - 1; + + for (i = 0; i < chunks; i++) { + mze = &mz->mz_chunk[i]; + if (value == mze->mze_value) { + strcpy(name, mze->mze_name); + return (0); + } + } + + return (ENOENT); +} + +static void +fzap_name_copy(const zap_leaf_t *zl, const zap_leaf_chunk_t *zc, char *name) +{ + size_t namelen; + const zap_leaf_chunk_t *nc; + char *p; + + namelen = zc->l_entry.le_name_length; + + nc = &ZAP_LEAF_CHUNK(zl, zc->l_entry.le_name_chunk); + p = name; + while (namelen > 0) { + size_t len; + len = namelen; + if (len > ZAP_LEAF_ARRAY_BYTES) + len = ZAP_LEAF_ARRAY_BYTES; + memcpy(p, nc->l_array.la_array, len); + p += len; + namelen -= len; + nc = &ZAP_LEAF_CHUNK(zl, nc->l_array.la_next); + } + + *p = '\0'; +} + +static int +fzap_rlookup(const spa_t *spa, const dnode_phys_t *dnode, char *name, uint64_t value) +{ + int bsize = dnode->dn_datablkszsec << SPA_MINBLOCKSHIFT; + zap_phys_t zh = *(zap_phys_t *) zap_scratch; + fat_zap_t z; + uint64_t *ptrtbl; + uint64_t hash; + int rc; + + if (zh.zap_magic != ZAP_MAGIC) + return (EIO); + + z.zap_block_shift = ilog2(bsize); + z.zap_phys = (zap_phys_t *) zap_scratch; + + /* + * Figure out where the pointer table is and read it in if necessary. + */ + if (zh.zap_ptrtbl.zt_blk) { + rc = dnode_read(spa, dnode, zh.zap_ptrtbl.zt_blk * bsize, + zap_scratch, bsize); + if (rc) + return (rc); + ptrtbl = (uint64_t *) zap_scratch; + } else { + ptrtbl = &ZAP_EMBEDDED_PTRTBL_ENT(&z, 0); + } + + hash = zap_hash(zh.zap_salt, name); + + zap_leaf_t zl; + zl.l_bs = z.zap_block_shift; + + off_t off = ptrtbl[hash >> (64 - zh.zap_ptrtbl.zt_shift)] << zl.l_bs; + zap_leaf_chunk_t *zc; + + rc = dnode_read(spa, dnode, off, zap_scratch, bsize); + if (rc) + return (rc); + + zl.l_phys = (zap_leaf_phys_t *) zap_scratch; + + /* + * Make sure this chunk matches our hash. + */ + if (zl.l_phys->l_hdr.lh_prefix_len > 0 + && zl.l_phys->l_hdr.lh_prefix + != hash >> (64 - zl.l_phys->l_hdr.lh_prefix_len)) + return (ENOENT); + + /* + * Hash within the chunk to find our entry. + */ + int shift = (64 - ZAP_LEAF_HASH_SHIFT(&zl) - zl.l_phys->l_hdr.lh_prefix_len); + int h = (hash >> shift) & ((1 << ZAP_LEAF_HASH_SHIFT(&zl)) - 1); + h = zl.l_phys->l_hash[h]; + if (h == 0xffff) + return (ENOENT); + zc = &ZAP_LEAF_CHUNK(&zl, h); + while (zc->l_entry.le_hash != hash) { + if (zc->l_entry.le_next == 0xffff) { + zc = 0; + break; + } + zc = &ZAP_LEAF_CHUNK(&zl, zc->l_entry.le_next); + } + if (fzap_leaf_value(&zl, zc) == value) { + fzap_name_copy(&zl, zc, name); + return (0); + } + + return (ENOENT); +} + +static int +zap_rlookup(const spa_t *spa, const dnode_phys_t *dnode, char *name, uint64_t value) +{ + int rc; + uint64_t zap_type; + size_t size = dnode->dn_datablkszsec * 512; + + rc = dnode_read(spa, dnode, 0, zap_scratch, size); + if (rc) + return (rc); + + zap_type = *(uint64_t *) zap_scratch; + if (zap_type == ZBT_MICRO) + return mzap_rlookup(spa, dnode, name, value); + else + return fzap_rlookup(spa, dnode, name, value); +} + +static int +zfs_rlookup(const spa_t *spa, uint64_t objnum, char *result) +{ + char name[256]; + char component[256]; + uint64_t dir_obj, parent_obj, child_dir_zapobj; + dnode_phys_t child_dir_zap, dataset, dir, parent; + dsl_dir_phys_t *dd; + dsl_dataset_phys_t *ds; + char *p; + int len; + + p = &name[sizeof(name) - 1]; + *p = '\0'; + + if (objset_get_dnode(spa, &spa->spa_mos, objnum, &dataset)) { + printf("ZFS: can't find dataset %ju\n", (uintmax_t)objnum); + return (EIO); + } + ds = (dsl_dataset_phys_t *)&dataset.dn_bonus; + dir_obj = ds->ds_dir_obj; + + for (;;) { + if (objset_get_dnode(spa, &spa->spa_mos, dir_obj, &dir) != 0) + return (EIO); + dd = (dsl_dir_phys_t *)&dir.dn_bonus; + + /* Actual loop condition. */ + parent_obj = dd->dd_parent_obj; + if (parent_obj == 0) + break; + + if (objset_get_dnode(spa, &spa->spa_mos, parent_obj, &parent) != 0) + return (EIO); + dd = (dsl_dir_phys_t *)&parent.dn_bonus; + child_dir_zapobj = dd->dd_child_dir_zapobj; + if (objset_get_dnode(spa, &spa->spa_mos, child_dir_zapobj, &child_dir_zap) != 0) + return (EIO); + if (zap_rlookup(spa, &child_dir_zap, component, dir_obj) != 0) + return (EIO); + + len = strlen(component); + p -= len; + memcpy(p, component, len); + --p; + *p = '/'; + + /* Actual loop iteration. */ + dir_obj = parent_obj; + } + + if (*p != '\0') + ++p; + strcpy(result, p); + + return (0); +} + +static int +zfs_lookup_dataset(const spa_t *spa, const char *name, uint64_t *objnum) +{ + char element[256]; + uint64_t dir_obj, child_dir_zapobj; + dnode_phys_t child_dir_zap, dir; + dsl_dir_phys_t *dd; + const char *p, *q; + + if (objset_get_dnode(spa, &spa->spa_mos, DMU_POOL_DIRECTORY_OBJECT, &dir)) + return (EIO); + if (zap_lookup(spa, &dir, DMU_POOL_ROOT_DATASET, &dir_obj)) + return (EIO); + + p = name; + for (;;) { + if (objset_get_dnode(spa, &spa->spa_mos, dir_obj, &dir)) + return (EIO); + dd = (dsl_dir_phys_t *)&dir.dn_bonus; + + while (*p == '/') + p++; + /* Actual loop condition #1. */ + if (*p == '\0') + break; + + q = strchr(p, '/'); + if (q) { + memcpy(element, p, q - p); + element[q - p] = '\0'; + p = q + 1; + } else { + strcpy(element, p); + p += strlen(p); + } + + child_dir_zapobj = dd->dd_child_dir_zapobj; + if (objset_get_dnode(spa, &spa->spa_mos, child_dir_zapobj, &child_dir_zap) != 0) + return (EIO); + + /* Actual loop condition #2. */ + if (zap_lookup(spa, &child_dir_zap, element, &dir_obj) != 0) + return (ENOENT); + } + + *objnum = dd->dd_head_dataset_obj; + return (0); +} + /* * Find the object set given the object number of its dataset object * and return its details in *objset */ static int -zfs_mount_dataset(spa_t *spa, uint64_t objnum, objset_phys_t *objset) +zfs_mount_dataset(const spa_t *spa, uint64_t objnum, objset_phys_t *objset) { dnode_phys_t dataset; dsl_dataset_phys_t *ds; if (objset_get_dnode(spa, &spa->spa_mos, objnum, &dataset)) { - printf("ZFS: can't find dataset %llu\n", objnum); + printf("ZFS: can't find dataset %ju\n", (uintmax_t)objnum); return (EIO); } ds = (dsl_dataset_phys_t *) &dataset.dn_bonus; if (zio_read(spa, &ds->ds_bp, objset)) { - printf("ZFS: can't read object set for dataset %llu\n", objnum); + printf("ZFS: can't read object set for dataset %ju\n", + (uintmax_t)objnum); return (EIO); } @@ -1481,11 +1805,13 @@ zfs_mount_dataset(spa_t *spa, uint64_t objnum, objset_phys_t *objset) * dataset if there is none and return its details in *objset */ static int -zfs_mount_root(spa_t *spa, objset_phys_t *objset) +zfs_get_root(const spa_t *spa, uint64_t *objid) { dnode_phys_t dir, propdir; uint64_t props, bootfs, root; + *objid = 0; + /* * Start with the MOS directory object. */ @@ -1501,8 +1827,10 @@ zfs_mount_root(spa_t *spa, objset_phys_t *objset) && objset_get_dnode(spa, &spa->spa_mos, props, &propdir) == 0 && zap_lookup(spa, &propdir, "bootfs", &bootfs) == 0 && bootfs != 0) - return zfs_mount_dataset(spa, bootfs, objset); - + { + *objid = bootfs; + return (0); + } /* * Lookup the root dataset directory */ @@ -1517,34 +1845,50 @@ zfs_mount_root(spa_t *spa, objset_phys_t *objset) * to find the dataset object and from that the object set itself. */ dsl_dir_phys_t *dd = (dsl_dir_phys_t *) &dir.dn_bonus; - return zfs_mount_dataset(spa, dd->dd_head_dataset_obj, objset); + *objid = dd->dd_head_dataset_obj; + return (0); } static int -zfs_mount_pool(spa_t *spa) +zfs_mount(const spa_t *spa, uint64_t rootobj, struct zfsmount *mount) { + mount->spa = spa; + /* - * Find the MOS and work our way in from there. + * Find the root object set if not explicitly provided */ - if (zio_read(spa, &spa->spa_uberblock.ub_rootbp, &spa->spa_mos)) { - printf("ZFS: can't read MOS\n"); + if (rootobj == 0 && zfs_get_root(spa, &rootobj)) { + printf("ZFS: can't find root filesystem\n"); return (EIO); } - /* - * Find the root object set - */ - if (zfs_mount_root(spa, &spa->spa_root_objset)) { - printf("Can't find root filesystem - giving up\n"); + if (zfs_mount_dataset(spa, rootobj, &mount->objset)) { + printf("ZFS: can't open root filesystem\n"); return (EIO); } + mount->rootobj = rootobj; + return (0); } static int -zfs_dnode_stat(spa_t *spa, dnode_phys_t *dn, struct stat *sb) +zfs_spa_init(spa_t *spa) +{ + + if (spa->spa_inited) + return (0); + if (zio_read(spa, &spa->spa_uberblock.ub_rootbp, &spa->spa_mos)) { + printf("ZFS: can't read MOS of pool %s\n", spa->spa_name); + return (EIO); + } + spa->spa_inited = 1; + return (0); +} + +static int +zfs_dnode_stat(const spa_t *spa, dnode_phys_t *dn, struct stat *sb) { if (dn->dn_bonustype != DMU_OT_SA) { @@ -1599,10 +1943,11 @@ zfs_dnode_stat(spa_t *spa, dnode_phys_t *dn, struct stat *sb) * Lookup a file and return its dnode. */ static int -zfs_lookup(spa_t *spa, const char *upath, dnode_phys_t *dnode) +zfs_lookup(const struct zfsmount *mount, const char *upath, dnode_phys_t *dnode) { int rc; uint64_t objnum, rootnum, parentnum; + const spa_t *spa; dnode_phys_t dn; const char *p, *q; char element[256]; @@ -1610,16 +1955,17 @@ zfs_lookup(spa_t *spa, const char *upath, dnode_phys_t *dnode) int symlinks_followed = 0; struct stat sb; - if (spa->spa_root_objset.os_type != DMU_OST_ZFS) { - printf("ZFS: unexpected object set type %llu\n", - spa->spa_root_objset.os_type); + spa = mount->spa; + if (mount->objset.os_type != DMU_OST_ZFS) { + printf("ZFS: unexpected object set type %ju\n", + (uintmax_t)mount->objset.os_type); return (EIO); } /* * Get the root directory dnode. */ - rc = objset_get_dnode(spa, &spa->spa_root_objset, MASTER_NODE_OBJ, &dn); + rc = objset_get_dnode(spa, &mount->objset, MASTER_NODE_OBJ, &dn); if (rc) return (rc); @@ -1627,7 +1973,7 @@ zfs_lookup(spa_t *spa, const char *upath, dnode_phys_t *dnode) if (rc) return (rc); - rc = objset_get_dnode(spa, &spa->spa_root_objset, rootnum, &dn); + rc = objset_get_dnode(spa, &mount->objset, rootnum, &dn); if (rc) return (rc); @@ -1660,7 +2006,7 @@ zfs_lookup(spa_t *spa, const char *upath, dnode_phys_t *dnode) return (rc); objnum = ZFS_DIRENT_OBJ(objnum); - rc = objset_get_dnode(spa, &spa->spa_root_objset, objnum, &dn); + rc = objset_get_dnode(spa, &mount->objset, objnum, &dn); if (rc) return (rc); @@ -1702,7 +2048,7 @@ zfs_lookup(spa_t *spa, const char *upath, dnode_phys_t *dnode) objnum = rootnum; else objnum = parentnum; - objset_get_dnode(spa, &spa->spa_root_objset, objnum, &dn); + objset_get_dnode(spa, &mount->objset, objnum, &dn); } } diff --git a/sys/cam/ata/ata_all.c b/sys/cam/ata/ata_all.c index 560eef4752e..5135efbcd7a 100644 --- a/sys/cam/ata/ata_all.c +++ b/sys/cam/ata/ata_all.c @@ -108,6 +108,16 @@ ata_op_string(struct ata_cmd *cmd) case 0x51: return ("CONFIGURE_STREAM"); case 0x60: return ("READ_FPDMA_QUEUED"); case 0x61: return ("WRITE_FPDMA_QUEUED"); + case 0x67: + if (cmd->features == 0xec) + return ("SEP_ATTN IDENTIFY"); + switch (cmd->lba_low) { + case 0x00: return ("SEP_ATTN READ BUFFER"); + case 0x02: return ("SEP_ATTN RECEIVE DIAGNOSTIC RESULTS"); + case 0x80: return ("SEP_ATTN WRITE BUFFER"); + case 0x82: return ("SEP_ATTN SEND DIAGNOSTIC"); + } + return ("SEP_ATTN"); case 0x70: return ("SEEK"); case 0x87: return ("CFA_TRANSLATE_SECTOR"); case 0x90: return ("EXECUTE_DEVICE_DIAGNOSTIC"); @@ -161,8 +171,8 @@ ata_op_string(struct ata_cmd *cmd) case 0xf2: return ("SECURITY_UNLOCK"); case 0xf3: return ("SECURITY_ERASE_PREPARE"); case 0xf4: return ("SECURITY_ERASE_UNIT"); - case 0xf5: return ("SECURITY_FREE_LOCK"); - case 0xf6: return ("SECURITY DISABLE PASSWORD"); + case 0xf5: return ("SECURITY_FREEZE_LOCK"); + case 0xf6: return ("SECURITY_DISABLE_PASSWORD"); case 0xf8: return ("READ_NATIVE_MAX_ADDRESS"); case 0xf9: return ("SET_MAX_ADDRESS"); } @@ -286,6 +296,21 @@ ata_print_ident(struct ata_params *ident_data) printf(" device\n"); } +void +semb_print_ident(struct sep_identify_data *ident_data) +{ + char vendor[9], product[17], revision[5], fw[5], in[7], ins[5]; + + cam_strvis(vendor, ident_data->vendor_id, 8, sizeof(vendor)); + cam_strvis(product, ident_data->product_id, 16, sizeof(product)); + cam_strvis(revision, ident_data->product_rev, 4, sizeof(revision)); + cam_strvis(fw, ident_data->firmware_rev, 4, sizeof(fw)); + cam_strvis(in, ident_data->interface_id, 6, sizeof(in)); + cam_strvis(ins, ident_data->interface_rev, 4, sizeof(ins)); + printf("<%s %s %s %s> SEMB %s %s device\n", + vendor, product, revision, fw, in, ins); +} + uint32_t ata_logical_sector_size(struct ata_params *ident_data) { @@ -695,3 +720,86 @@ ata_static_identify_match(caddr_t identbuffer, caddr_t table_entry) } return (-1); } + +void +semb_receive_diagnostic_results(struct ccb_ataio *ataio, + u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb*), + uint8_t tag_action, int pcv, uint8_t page_code, + uint8_t *data_ptr, uint16_t length, uint32_t timeout) +{ + + length = min(length, 1020); + length = (length + 3) & ~3; + cam_fill_ataio(ataio, + retries, + cbfcnp, + /*flags*/CAM_DIR_IN, + tag_action, + data_ptr, + length, + timeout); + ata_28bit_cmd(ataio, ATA_SEP_ATTN, + pcv ? page_code : 0, 0x02, length / 4); +} + +void +semb_send_diagnostic(struct ccb_ataio *ataio, + u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), + uint8_t tag_action, uint8_t *data_ptr, uint16_t length, uint32_t timeout) +{ + + length = min(length, 1020); + length = (length + 3) & ~3; + cam_fill_ataio(ataio, + retries, + cbfcnp, + /*flags*/length ? CAM_DIR_OUT : CAM_DIR_NONE, + tag_action, + data_ptr, + length, + timeout); + ata_28bit_cmd(ataio, ATA_SEP_ATTN, + length > 0 ? data_ptr[0] : 0, 0x82, length / 4); +} + +void +semb_read_buffer(struct ccb_ataio *ataio, + u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb*), + uint8_t tag_action, uint8_t page_code, + uint8_t *data_ptr, uint16_t length, uint32_t timeout) +{ + + length = min(length, 1020); + length = (length + 3) & ~3; + cam_fill_ataio(ataio, + retries, + cbfcnp, + /*flags*/CAM_DIR_IN, + tag_action, + data_ptr, + length, + timeout); + ata_28bit_cmd(ataio, ATA_SEP_ATTN, + page_code, 0x00, length / 4); +} + +void +semb_write_buffer(struct ccb_ataio *ataio, + u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), + uint8_t tag_action, uint8_t *data_ptr, uint16_t length, uint32_t timeout) +{ + + length = min(length, 1020); + length = (length + 3) & ~3; + cam_fill_ataio(ataio, + retries, + cbfcnp, + /*flags*/length ? CAM_DIR_OUT : CAM_DIR_NONE, + tag_action, + data_ptr, + length, + timeout); + ata_28bit_cmd(ataio, ATA_SEP_ATTN, + length > 0 ? data_ptr[0] : 0, 0x80, length / 4); +} + diff --git a/sys/cam/ata/ata_all.h b/sys/cam/ata/ata_all.h index 526fc194d0c..924fdfe5a6d 100644 --- a/sys/cam/ata/ata_all.h +++ b/sys/cam/ata/ata_all.h @@ -83,6 +83,20 @@ struct ata_res { u_int8_t sector_count_exp; }; +struct sep_identify_data { + uint8_t length; /* Enclosure descriptor length */ + uint8_t subenc_id; /* Sub-enclosure identifier */ + uint8_t logical_id[8]; /* Enclosure logical identifier (WWN) */ + uint8_t vendor_id[8]; /* Vendor identification string */ + uint8_t product_id[16]; /* Product identification string */ + uint8_t product_rev[4]; /* Product revision string */ + uint8_t channel_id; /* Channel identifier */ + uint8_t firmware_rev[4];/* Firmware revision */ + uint8_t interface_id[6];/* Interface spec ("S-E-S "/"SAF-TE")*/ + uint8_t interface_rev[4];/* Interface spec revision */ + uint8_t vend_spec[11]; /* Vendor specific information */ +}; + int ata_version(int ver); char * ata_op_string(struct ata_cmd *cmd); @@ -126,4 +140,26 @@ int ata_speed2revision(u_int speed); int ata_identify_match(caddr_t identbuffer, caddr_t table_entry); int ata_static_identify_match(caddr_t identbuffer, caddr_t table_entry); +void semb_print_ident(struct sep_identify_data *ident_data); + +void semb_receive_diagnostic_results(struct ccb_ataio *ataio, + u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb*), + uint8_t tag_action, int pcv, uint8_t page_code, + uint8_t *data_ptr, uint16_t allocation_length, uint32_t timeout); + +void semb_send_diagnostic(struct ccb_ataio *ataio, + u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), + uint8_t tag_action, uint8_t *data_ptr, uint16_t param_list_length, + uint32_t timeout); + +void semb_read_buffer(struct ccb_ataio *ataio, + u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb*), + uint8_t tag_action, uint8_t page_code, + uint8_t *data_ptr, uint16_t allocation_length, uint32_t timeout); + +void semb_write_buffer(struct ccb_ataio *ataio, + u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), + uint8_t tag_action, uint8_t *data_ptr, uint16_t param_list_length, + uint32_t timeout); + #endif diff --git a/sys/cam/ata/ata_da.c b/sys/cam/ata/ata_da.c index daf90b03862..ae40b3c31e9 100644 --- a/sys/cam/ata/ata_da.c +++ b/sys/cam/ata/ata_da.c @@ -436,9 +436,8 @@ adaopen(struct disk *dp) softc = (struct ada_softc *)periph->softc; softc->flags |= ADA_FLAG_OPEN; - CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, - ("adaopen: disk=%s%d (unit %d)\n", dp->d_name, dp->d_unit, - periph->unit_number)); + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH, + ("adaopen\n")); if ((softc->flags & ADA_FLAG_PACK_INVALID) != 0) { /* Invalidate our pack information. */ @@ -469,6 +468,10 @@ adaclose(struct disk *dp) } softc = (struct ada_softc *)periph->softc; + + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH, + ("adaclose\n")); + /* We only sync the cache if the drive is capable of it. */ if ((softc->flags & ADA_FLAG_CAN_FLUSHCACHE) != 0 && (softc->flags & ADA_FLAG_PACK_INVALID) == 0) { @@ -487,7 +490,7 @@ adaclose(struct disk *dp) ata_48bit_cmd(&ccb->ataio, ATA_FLUSHCACHE48, 0, 0, 0); else ata_28bit_cmd(&ccb->ataio, ATA_FLUSHCACHE, 0, 0, 0); - cam_periph_runccb(ccb, /*error_routine*/NULL, /*cam_flags*/0, + cam_periph_runccb(ccb, adaerror, /*cam_flags*/0, /*sense_flags*/0, softc->disk->d_devstat); if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) @@ -542,6 +545,8 @@ adastrategy(struct bio *bp) cam_periph_lock(periph); + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("adastrategy(%p)\n", bp)); + /* * If the device has been made invalid, error out */ @@ -579,6 +584,7 @@ adadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t len struct disk *dp; uint64_t lba; uint16_t count; + int error = 0; dp = arg; periph = dp->d_drv1; @@ -617,13 +623,16 @@ adadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t len } xpt_polled_action(&ccb); - if ((ccb.ataio.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { + error = cam_periph_error(&ccb, + 0, SF_NO_RECOVERY | SF_NO_RETRY, NULL); + if ((ccb.ccb_h.status & CAM_DEV_QFRZN) != 0) + cam_release_devq(ccb.ccb_h.path, /*relsim_flags*/0, + /*reduction*/0, /*timeout*/0, /*getcount_only*/0); + if (error != 0) printf("Aborting dump due to I/O error.\n"); - cam_periph_unlock(periph); - return(EIO); - } + cam_periph_unlock(periph); - return(0); + return (error); } if (softc->flags & ADA_FLAG_CAN_FLUSHCACHE) { @@ -631,7 +640,7 @@ adadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t len ccb.ccb_h.ccb_state = ADA_CCB_DUMP; cam_fill_ataio(&ccb.ataio, - 1, + 0, adadone, CAM_DIR_NONE, 0, @@ -645,18 +654,16 @@ adadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t len ata_28bit_cmd(&ccb.ataio, ATA_FLUSHCACHE, 0, 0, 0); xpt_polled_action(&ccb); - if ((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) - xpt_print(periph->path, "Synchronize cache failed\n"); - + error = cam_periph_error(&ccb, + 0, SF_NO_RECOVERY | SF_NO_RETRY, NULL); if ((ccb.ccb_h.status & CAM_DEV_QFRZN) != 0) - cam_release_devq(ccb.ccb_h.path, - /*relsim_flags*/0, - /*reduction*/0, - /*timeout*/0, - /*getcount_only*/0); + cam_release_devq(ccb.ccb_h.path, /*relsim_flags*/0, + /*reduction*/0, /*timeout*/0, /*getcount_only*/0); + if (error != 0) + xpt_print(periph->path, "Synchronize cache failed\n"); } cam_periph_unlock(periph); - return (0); + return (error); } static void @@ -742,6 +749,7 @@ static void adaasync(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg) { + struct ccb_getdev cgd; struct cam_periph *periph; struct ada_softc *softc; @@ -776,11 +784,49 @@ adaasync(void *callback_arg, u_int32_t code, "due to status 0x%x\n", status); break; } + case AC_GETDEV_CHANGED: + { + softc = (struct ada_softc *)periph->softc; + xpt_setup_ccb(&cgd.ccb_h, periph->path, CAM_PRIORITY_NORMAL); + cgd.ccb_h.func_code = XPT_GDEV_TYPE; + xpt_action((union ccb *)&cgd); + + if ((cgd.ident_data.capabilities1 & ATA_SUPPORT_DMA) && + (cgd.inq_flags & SID_DMA)) + softc->flags |= ADA_FLAG_CAN_DMA; + else + softc->flags &= ~ADA_FLAG_CAN_DMA; + if ((cgd.ident_data.satacapabilities & ATA_SUPPORT_NCQ) && + (cgd.inq_flags & SID_DMA) && (cgd.inq_flags & SID_CmdQue)) + softc->flags |= ADA_FLAG_CAN_NCQ; + else + softc->flags &= ~ADA_FLAG_CAN_NCQ; + if ((cgd.ident_data.support_dsm & ATA_SUPPORT_DSM_TRIM) && + (cgd.inq_flags & SID_DMA)) + softc->flags |= ADA_FLAG_CAN_TRIM; + else + softc->flags &= ~ADA_FLAG_CAN_TRIM; + + cam_periph_async(periph, code, path, arg); + break; + } + case AC_ADVINFO_CHANGED: + { + uintptr_t buftype; + + buftype = (uintptr_t)arg; + if (buftype == CDAI_TYPE_PHYS_PATH) { + struct ada_softc *softc; + + softc = periph->softc; + disk_attr_changed(softc->disk, "GEOM::physpath", + M_NOWAIT); + } + break; + } case AC_SENT_BDR: case AC_BUS_RESET: { - struct ccb_getdev cgd; - softc = (struct ada_softc *)periph->softc; cam_periph_async(periph, code, path, arg); if (softc->state != ADA_STATE_NORMAL) @@ -919,7 +965,7 @@ adaregister(struct cam_periph *periph, void *arg) bioq_init(&softc->bio_queue); bioq_init(&softc->trim_queue); - if (cgd->ident_data.capabilities1 & ATA_SUPPORT_DMA && + if ((cgd->ident_data.capabilities1 & ATA_SUPPORT_DMA) && (cgd->inq_flags & SID_DMA)) softc->flags |= ADA_FLAG_CAN_DMA; if (cgd->ident_data.support.command2 & ATA_SUPPORT_ADDRESS48) @@ -928,10 +974,11 @@ adaregister(struct cam_periph *periph, void *arg) softc->flags |= ADA_FLAG_CAN_FLUSHCACHE; if (cgd->ident_data.support.command1 & ATA_SUPPORT_POWERMGT) softc->flags |= ADA_FLAG_CAN_POWERMGT; - if (cgd->ident_data.satacapabilities & ATA_SUPPORT_NCQ && + if ((cgd->ident_data.satacapabilities & ATA_SUPPORT_NCQ) && (cgd->inq_flags & SID_DMA) && (cgd->inq_flags & SID_CmdQue)) softc->flags |= ADA_FLAG_CAN_NCQ; - if (cgd->ident_data.support_dsm & ATA_SUPPORT_DSM_TRIM) { + if ((cgd->ident_data.support_dsm & ATA_SUPPORT_DSM_TRIM) && + (cgd->inq_flags & SID_DMA)) { softc->flags |= ADA_FLAG_CAN_TRIM; softc->trim_max_ranges = TRIM_MAX_RANGES; if (cgd->ident_data.max_dsm_blocks != 0) { @@ -1088,8 +1135,9 @@ adaregister(struct cam_periph *periph, void *arg) * them and the only alternative would be to * not attach the device on failure. */ - xpt_register_async(AC_SENT_BDR | AC_BUS_RESET | AC_LOST_DEVICE, - adaasync, periph, periph->path); + xpt_register_async(AC_SENT_BDR | AC_BUS_RESET | AC_LOST_DEVICE | + AC_GETDEV_CHANGED | AC_ADVINFO_CHANGED, + adaasync, periph, periph->path); /* * Schedule a periodic event to occasionally send an @@ -1126,6 +1174,8 @@ adastart(struct cam_periph *periph, union ccb *start_ccb) struct ada_softc *softc = (struct ada_softc *)periph->softc; struct ccb_ataio *ataio = &start_ccb->ataio; + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("adastart\n")); + switch (softc->state) { case ADA_STATE_NORMAL: { @@ -1134,7 +1184,7 @@ adastart(struct cam_periph *periph, union ccb *start_ccb) /* Execute immediate CCB if waiting. */ if (periph->immediate_priority <= periph->pinfo.priority) { - CAM_DEBUG_PRINT(CAM_DEBUG_SUBTRACE, + CAM_DEBUG(periph->path, CAM_DEBUG_SUBTRACE, ("queuing for immediate ccb\n")); start_ccb->ccb_h.ccb_state = ADA_CCB_WAITING; SLIST_INSERT_HEAD(&periph->ccb_list, &start_ccb->ccb_h, @@ -1426,6 +1476,9 @@ adadone(struct cam_periph *periph, union ccb *done_ccb) softc = (struct ada_softc *)periph->softc; ataio = &done_ccb->ataio; + + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("adadone\n")); + switch (ataio->ccb_h.ccb_state & ADA_CCB_TYPE_MASK) { case ADA_CCB_BUFFER_IO: case ADA_CCB_TRIM: @@ -1665,6 +1718,7 @@ adaflush(void) { struct cam_periph *periph; struct ada_softc *softc; + int error; TAILQ_FOREACH(periph, &adadriver.units, unit_links) { union ccb ccb; @@ -1688,7 +1742,7 @@ adaflush(void) ccb.ccb_h.ccb_state = ADA_CCB_DUMP; cam_fill_ataio(&ccb.ataio, - 1, + 0, adadone, CAM_DIR_NONE, 0, @@ -1702,15 +1756,13 @@ adaflush(void) ata_28bit_cmd(&ccb.ataio, ATA_FLUSHCACHE, 0, 0, 0); xpt_polled_action(&ccb); - if ((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) - xpt_print(periph->path, "Synchronize cache failed\n"); - + error = cam_periph_error(&ccb, + 0, SF_NO_RECOVERY | SF_NO_RETRY, NULL); if ((ccb.ccb_h.status & CAM_DEV_QFRZN) != 0) - cam_release_devq(ccb.ccb_h.path, - /*relsim_flags*/0, - /*reduction*/0, - /*timeout*/0, - /*getcount_only*/0); + cam_release_devq(ccb.ccb_h.path, /*relsim_flags*/0, + /*reduction*/0, /*timeout*/0, /*getcount_only*/0); + if (error != 0) + xpt_print(periph->path, "Synchronize cache failed\n"); cam_periph_unlock(periph); } } @@ -1720,6 +1772,7 @@ adaspindown(uint8_t cmd, int flags) { struct cam_periph *periph; struct ada_softc *softc; + int error; TAILQ_FOREACH(periph, &adadriver.units, unit_links) { union ccb ccb; @@ -1744,7 +1797,7 @@ adaspindown(uint8_t cmd, int flags) ccb.ccb_h.ccb_state = ADA_CCB_DUMP; cam_fill_ataio(&ccb.ataio, - 1, + 0, adadone, CAM_DIR_NONE | flags, 0, @@ -1755,15 +1808,13 @@ adaspindown(uint8_t cmd, int flags) ata_28bit_cmd(&ccb.ataio, cmd, 0, 0, 0); xpt_polled_action(&ccb); - if ((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) - xpt_print(periph->path, "Spin-down disk failed\n"); - + error = cam_periph_error(&ccb, + 0, SF_NO_RECOVERY | SF_NO_RETRY, NULL); if ((ccb.ccb_h.status & CAM_DEV_QFRZN) != 0) - cam_release_devq(ccb.ccb_h.path, - /*relsim_flags*/0, - /*reduction*/0, - /*timeout*/0, - /*getcount_only*/0); + cam_release_devq(ccb.ccb_h.path, /*relsim_flags*/0, + /*reduction*/0, /*timeout*/0, /*getcount_only*/0); + if (error != 0) + xpt_print(periph->path, "Spin-down disk failed\n"); cam_periph_unlock(periph); } } diff --git a/sys/cam/ata/ata_pmp.c b/sys/cam/ata/ata_pmp.c index 13fc760ef2e..db671480d76 100644 --- a/sys/cam/ata/ata_pmp.c +++ b/sys/cam/ata/ata_pmp.c @@ -126,8 +126,13 @@ static void pmpdone(struct cam_periph *periph, #define PMP_DEFAULT_RETRY 1 #endif +#ifndef PMP_DEFAULT_HIDE_SPECIAL +#define PMP_DEFAULT_HIDE_SPECIAL 1 +#endif + static int pmp_retry_count = PMP_DEFAULT_RETRY; static int pmp_default_timeout = PMP_DEFAULT_TIMEOUT; +static int pmp_hide_special = PMP_DEFAULT_HIDE_SPECIAL; static SYSCTL_NODE(_kern_cam, OID_AUTO, pmp, CTLFLAG_RD, 0, "CAM Direct Access Disk driver"); @@ -137,6 +142,9 @@ TUNABLE_INT("kern.cam.pmp.retry_count", &pmp_retry_count); SYSCTL_INT(_kern_cam_pmp, OID_AUTO, default_timeout, CTLFLAG_RW, &pmp_default_timeout, 0, "Normal I/O timeout (in seconds)"); TUNABLE_INT("kern.cam.pmp.default_timeout", &pmp_default_timeout); +SYSCTL_INT(_kern_cam_pmp, OID_AUTO, hide_special, CTLFLAG_RW, + &pmp_hide_special, 0, "Hide extra ports"); +TUNABLE_INT("kern.cam.pmp.hide_special", &pmp_hide_special); static struct periph_driver pmpdriver = { @@ -421,7 +429,9 @@ pmpstart(struct cam_periph *periph, union ccb *start_ccb) softc = (struct pmp_softc *)periph->softc; ataio = &start_ccb->ataio; - + + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("pmpstart\n")); + if (softc->restart) { softc->restart = 0; softc->state = min(softc->state, PMP_STATE_PRECONFIG); @@ -552,7 +562,7 @@ pmpdone(struct cam_periph *periph, union ccb *done_ccb) softc = (struct pmp_softc *)periph->softc; ataio = &done_ccb->ataio; - CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("pmpdone\n")); + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("pmpdone\n")); priority = done_ccb->ccb_h.pinfo.priority; @@ -583,23 +593,33 @@ pmpdone(struct cam_periph *periph, union ccb *done_ccb) (ataio->res.lba_mid << 16) + (ataio->res.lba_low << 8) + ataio->res.sector_count; - /* This PMP declares 6 ports, while only 5 of them are real. - * Port 5 is enclosure management bridge port, which has implementation - * problems, causing probe faults. Hide it for now. */ - if (softc->pm_pid == 0x37261095 && softc->pm_ports == 6) - softc->pm_ports = 5; - /* This PMP declares 7 ports, while only 5 of them are real. - * Port 5 is some fake "Config Disk" with 640 sectors size, - * port 6 is enclosure management bridge port. - * Both fake ports has implementation problems, causing - * probe faults. Hide them for now. */ - if (softc->pm_pid == 0x47261095 && softc->pm_ports == 7) - softc->pm_ports = 5; - /* These PMPs declare one more port then actually have, - * for configuration purposes. Hide it for now. */ - if (softc->pm_pid == 0x57231095 || softc->pm_pid == 0x57331095 || - softc->pm_pid == 0x57341095 || softc->pm_pid == 0x57441095) - softc->pm_ports--; + if (pmp_hide_special) { + /* + * This PMP declares 6 ports, while only 5 of them + * are real. Port 5 is a SEMB port, probing which + * causes timeouts if external SEP is not connected + * to PMP over I2C. + */ + if (softc->pm_pid == 0x37261095 && softc->pm_ports == 6) + softc->pm_ports = 5; + + /* + * This PMP declares 7 ports, while only 5 of them + * are real. Port 5 is a fake "Config Disk" with + * 640 sectors size. Port 6 is a SEMB port. + */ + if (softc->pm_pid == 0x47261095 && softc->pm_ports == 7) + softc->pm_ports = 5; + + /* + * These PMPs have extra configuration port. + */ + if (softc->pm_pid == 0x57231095 || + softc->pm_pid == 0x57331095 || + softc->pm_pid == 0x57341095 || + softc->pm_pid == 0x57441095) + softc->pm_ports--; + } printf("%s%d: %d fan-out ports\n", periph->periph_name, periph->unit_number, softc->pm_ports); diff --git a/sys/cam/ata/ata_xpt.c b/sys/cam/ata/ata_xpt.c index 999236f495d..20f22ebad73 100644 --- a/sys/cam/ata/ata_xpt.c +++ b/sys/cam/ata/ata_xpt.c @@ -65,6 +65,7 @@ struct ata_quirk_entry { struct scsi_inquiry_pattern inq_pat; u_int8_t quirks; #define CAM_QUIRK_MAXTAGS 0x01 + u_int mintags; u_int maxtags; }; @@ -93,6 +94,9 @@ typedef enum { PROBE_FULL_INQUIRY, PROBE_PM_PID, PROBE_PM_PRV, + PROBE_IDENTIFY_SES, + PROBE_IDENTIFY_SAFTE, + PROBE_DONE, PROBE_INVALID } probe_action; @@ -110,6 +114,9 @@ static char *probe_action_text[] = { "PROBE_FULL_INQUIRY", "PROBE_PM_PID", "PROBE_PM_PRV", + "PROBE_IDENTIFY_SES", + "PROBE_IDENTIFY_SAFTE", + "PROBE_DONE", "PROBE_INVALID" }; @@ -117,7 +124,7 @@ static char *probe_action_text[] = { do { \ char **text; \ text = probe_action_text; \ - CAM_DEBUG((softc)->periph->path, CAM_DEBUG_INFO, \ + CAM_DEBUG((softc)->periph->path, CAM_DEBUG_PROBE, \ ("Probe %s to %s\n", text[(softc)->action], \ text[(newaction)])); \ (softc)->action = (newaction); \ @@ -149,7 +156,7 @@ static struct ata_quirk_entry ata_quirk_table[] = T_ANY, SIP_MEDIA_REMOVABLE|SIP_MEDIA_FIXED, /*vendor*/"*", /*product*/"*", /*revision*/"*" }, - /*quirks*/0, /*maxtags*/0 + /*quirks*/0, /*mintags*/0, /*maxtags*/0 }, }; @@ -160,9 +167,7 @@ static cam_status proberegister(struct cam_periph *periph, void *arg); static void probeschedule(struct cam_periph *probe_periph); static void probestart(struct cam_periph *periph, union ccb *start_ccb); -//static void proberequestdefaultnegotiation(struct cam_periph *periph); -//static int proberequestbackoff(struct cam_periph *periph, -// struct cam_ed *device); +static void proberequestdefaultnegotiation(struct cam_periph *periph); static void probedone(struct cam_periph *periph, union ccb *done_ccb); static void probecleanup(struct cam_periph *periph); static void ata_find_quirk(struct cam_ed *device); @@ -175,6 +180,7 @@ static struct cam_ed * ata_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id); static void ata_device_transport(struct cam_path *path); +static void ata_get_transfer_settings(struct ccb_trans_settings *cts); static void ata_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device, int async_update); @@ -247,6 +253,8 @@ proberegister(struct cam_periph *periph, void *arg) if (status != CAM_REQ_CMP) { return (status); } + CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("Probe started\n")); + /* * Ensure nobody slip in until probe finish. */ @@ -266,7 +274,8 @@ probeschedule(struct cam_periph *periph) ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs); if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) || - periph->path->device->protocol == PROTO_SATAPM) + periph->path->device->protocol == PROTO_SATAPM || + periph->path->device->protocol == PROTO_SEMB) PROBE_SET_ACTION(softc, PROBE_RESET); else PROBE_SET_ACTION(softc, PROBE_IDENTIFY); @@ -300,7 +309,8 @@ probestart(struct cam_periph *periph, union ccb *start_ccb) if (softc->restart) { softc->restart = 0; if ((path->device->flags & CAM_DEV_UNCONFIGURED) || - path->device->protocol == PROTO_SATAPM) + path->device->protocol == PROTO_SATAPM || + path->device->protocol == PROTO_SEMB) softc->action = PROBE_RESET; else softc->action = PROBE_IDENTIFY; @@ -406,6 +416,7 @@ negotiate: path->device->inq_flags &= ~SID_DMA; else path->device->inq_flags |= SID_DMA; + xpt_async(AC_GETDEV_CHANGED, path, NULL); cam_fill_ataio(ataio, 1, probedone, @@ -622,15 +633,36 @@ negotiate: 10 * 1000); ata_pm_read_cmd(ataio, 1, 15); break; - case PROBE_INVALID: - CAM_DEBUG(path, CAM_DEBUG_INFO, - ("probestart: invalid action state\n")); - default: + case PROBE_IDENTIFY_SES: + cam_fill_ataio(ataio, + 1, + probedone, + /*flags*/CAM_DIR_IN, + 0, + /*data_ptr*/(u_int8_t *)&softc->ident_data, + /*dxfer_len*/sizeof(softc->ident_data), + 30 * 1000); + ata_28bit_cmd(ataio, ATA_SEP_ATTN, 0xEC, 0x02, + sizeof(softc->ident_data) / 4); break; + case PROBE_IDENTIFY_SAFTE: + cam_fill_ataio(ataio, + 1, + probedone, + /*flags*/CAM_DIR_IN, + 0, + /*data_ptr*/(u_int8_t *)&softc->ident_data, + /*dxfer_len*/sizeof(softc->ident_data), + 30 * 1000); + ata_28bit_cmd(ataio, ATA_SEP_ATTN, 0xEC, 0x00, + sizeof(softc->ident_data) / 4); + break; + default: + panic("probestart: invalid action state 0x%x\n", softc->action); } xpt_action(start_ccb); } -#if 0 + static void proberequestdefaultnegotiation(struct cam_periph *periph) { @@ -640,130 +672,29 @@ proberequestdefaultnegotiation(struct cam_periph *periph) cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; cts.type = CTS_TYPE_USER_SETTINGS; xpt_action((union ccb *)&cts); - if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { + if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) return; - } + cts.xport_specific.valid = 0; cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS; cts.type = CTS_TYPE_CURRENT_SETTINGS; xpt_action((union ccb *)&cts); } -/* - * Backoff Negotiation Code- only pertinent for SPI devices. - */ -static int -proberequestbackoff(struct cam_periph *periph, struct cam_ed *device) -{ - struct ccb_trans_settings cts; - struct ccb_trans_settings_spi *spi; - - memset(&cts, 0, sizeof (cts)); - xpt_setup_ccb(&cts.ccb_h, periph->path, CAM_PRIORITY_NONE); - cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; - cts.type = CTS_TYPE_CURRENT_SETTINGS; - xpt_action((union ccb *)&cts); - if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { - if (bootverbose) { - xpt_print(periph->path, - "failed to get current device settings\n"); - } - return (0); - } - if (cts.transport != XPORT_SPI) { - if (bootverbose) { - xpt_print(periph->path, "not SPI transport\n"); - } - return (0); - } - spi = &cts.xport_specific.spi; - - /* - * We cannot renegotiate sync rate if we don't have one. - */ - if ((spi->valid & CTS_SPI_VALID_SYNC_RATE) == 0) { - if (bootverbose) { - xpt_print(periph->path, "no sync rate known\n"); - } - return (0); - } - - /* - * We'll assert that we don't have to touch PPR options- the - * SIM will see what we do with period and offset and adjust - * the PPR options as appropriate. - */ - - /* - * A sync rate with unknown or zero offset is nonsensical. - * A sync period of zero means Async. - */ - if ((spi->valid & CTS_SPI_VALID_SYNC_OFFSET) == 0 - || spi->sync_offset == 0 || spi->sync_period == 0) { - if (bootverbose) { - xpt_print(periph->path, "no sync rate available\n"); - } - return (0); - } - - if (device->flags & CAM_DEV_DV_HIT_BOTTOM) { - CAM_DEBUG(periph->path, CAM_DEBUG_INFO, - ("hit async: giving up on DV\n")); - return (0); - } - - - /* - * Jump sync_period up by one, but stop at 5MHz and fall back to Async. - * We don't try to remember 'last' settings to see if the SIM actually - * gets into the speed we want to set. We check on the SIM telling - * us that a requested speed is bad, but otherwise don't try and - * check the speed due to the asynchronous and handshake nature - * of speed setting. - */ - spi->valid = CTS_SPI_VALID_SYNC_RATE | CTS_SPI_VALID_SYNC_OFFSET; - for (;;) { - spi->sync_period++; - if (spi->sync_period >= 0xf) { - spi->sync_period = 0; - spi->sync_offset = 0; - CAM_DEBUG(periph->path, CAM_DEBUG_INFO, - ("setting to async for DV\n")); - /* - * Once we hit async, we don't want to try - * any more settings. - */ - device->flags |= CAM_DEV_DV_HIT_BOTTOM; - } else if (bootverbose) { - CAM_DEBUG(periph->path, CAM_DEBUG_INFO, - ("DV: period 0x%x\n", spi->sync_period)); - printf("setting period to 0x%x\n", spi->sync_period); - } - cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS; - cts.type = CTS_TYPE_CURRENT_SETTINGS; - xpt_action((union ccb *)&cts); - if ((cts.ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - break; - } - CAM_DEBUG(periph->path, CAM_DEBUG_INFO, - ("DV: failed to set period 0x%x\n", spi->sync_period)); - if (spi->sync_period == 0) { - return (0); - } - } - return (1); -} -#endif static void probedone(struct cam_periph *periph, union ccb *done_ccb) { struct ccb_trans_settings cts; struct ata_params *ident_buf; + struct scsi_inquiry_data *inq_buf; probe_softc *softc; struct cam_path *path; cam_status status; u_int32_t priority; u_int caps; - int found = 1; + int changed = 1, found = 1; + static const uint8_t fake_device_id_hdr[8] = + {0, SVPD_DEVICE_ID, 0, 12, + SVPD_ID_CODESET_BINARY, SVPD_ID_TYPE_NAA, 0, 8}; CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("probedone\n")); @@ -771,14 +702,12 @@ probedone(struct cam_periph *periph, union ccb *done_ccb) path = done_ccb->ccb_h.path; priority = done_ccb->ccb_h.pinfo.priority; ident_buf = &path->device->ident_data; + inq_buf = &path->device->inq_data; if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { - if (softc->restart) { - if (bootverbose) { - cam_error_print(done_ccb, - CAM_ESF_ALL, CAM_EPF_ALL); - } - } else if (cam_periph_error(done_ccb, 0, 0, NULL) == ERESTART) + if (cam_periph_error(done_ccb, + 0, softc->restart ? (SF_NO_RECOVERY | SF_NO_RETRY) : 0, + NULL) == ERESTART) return; if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { /* Don't wedge the queue */ @@ -819,6 +748,18 @@ probedone(struct cam_periph *periph, union ccb *done_ccb) } else if (softc->action == PROBE_SETDMAAA && status == CAM_ATA_STATUS_ERROR) { goto noerror; + + /* + * SES and SAF-TE SEPs have different IDENTIFY commands, + * but SATA specification doesn't tell how to identify them. + * Until better way found, just try another if first fail. + */ + } else if (softc->action == PROBE_IDENTIFY_SES && + status == CAM_ATA_STATUS_ERROR) { + PROBE_SET_ACTION(softc, PROBE_IDENTIFY_SAFTE); + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; } /* @@ -833,6 +774,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb) */ device_fail: if ((path->device->flags & CAM_DEV_UNCONFIGURED) == 0) xpt_async(AC_LOST_DEVICE, path, NULL); + PROBE_SET_ACTION(softc, PROBE_INVALID); found = 0; goto done; } @@ -844,8 +786,8 @@ noerror: { int sign = (done_ccb->ataio.res.lba_high << 8) + done_ccb->ataio.res.lba_mid; - if (bootverbose) - xpt_print(path, "SIGNATURE: %04x\n", sign); + CAM_DEBUG(path, CAM_DEBUG_PROBE, + ("SIGNATURE: %04x\n", sign)); if (sign == 0x0000 && done_ccb->ccb_h.target_id != 15) { path->device->protocol = PROTO_ATA; @@ -862,6 +804,10 @@ noerror: xpt_action((union ccb *)&cts); path->device->protocol = PROTO_SATAPM; PROBE_SET_ACTION(softc, PROBE_PM_PID); + } else if (sign == 0xc33c && + done_ccb->ccb_h.target_id != 15) { + path->device->protocol = PROTO_SEMB; + PROBE_SET_ACTION(softc, PROBE_IDENTIFY_SES); } else if (sign == 0xeb14 && done_ccb->ccb_h.target_id != 15) { path->device->protocol = PROTO_SCSI; @@ -881,7 +827,6 @@ noerror: { struct ccb_pathinq cpi; int16_t *ptr; - int changed = 1; ident_buf = &softc->ident_data; for (ptr = (int16_t *)ident_buf; @@ -936,6 +881,11 @@ noerror: path->device->serial_num = NULL; path->device->serial_num_len = 0; } + if (path->device->device_id != NULL) { + free(path->device->device_id, M_CAMXPT); + path->device->device_id = NULL; + path->device->device_id_len = 0; + } path->device->serial_num = (u_int8_t *)malloc((sizeof(ident_buf->serial) + 1), M_CAMXPT, M_NOWAIT); @@ -948,11 +898,25 @@ noerror: path->device->serial_num_len = strlen(path->device->serial_num); } + if (ident_buf->enabled.extension & + ATA_SUPPORT_64BITWWN) { + path->device->device_id = + malloc(16, M_CAMXPT, M_NOWAIT); + if (path->device->device_id != NULL) { + path->device->device_id_len = 16; + bcopy(&fake_device_id_hdr, + path->device->device_id, 8); + bcopy(ident_buf->wwn, + path->device->device_id + 8, 8); + } + } path->device->flags |= CAM_DEV_IDENTIFY_DATA_VALID; + xpt_async(AC_GETDEV_CHANGED, path, NULL); } if (ident_buf->satacapabilities & ATA_SUPPORT_NCQ) { - path->device->mintags = path->device->maxtags = + path->device->mintags = 2; + path->device->maxtags = ATA_QUEUE_LEN(ident_buf->queue) + 1; } ata_find_quirk(path->device); @@ -973,11 +937,11 @@ noerror: cts.xport_specific.sata.tags = path->device->maxtags; cts.xport_specific.sata.valid = CTS_SATA_VALID_TAGS; xpt_action((union ccb *)&cts); - /* Reconfigure queues for tagged queueing. */ - xpt_start_tags(path); } } ata_device_transport(path); + if (changed) + proberequestdefaultnegotiation(periph); PROBE_SET_ACTION(softc, PROBE_SETMODE); xpt_release_ccb(done_ccb); xpt_schedule(periph, priority); @@ -1088,15 +1052,14 @@ notsata: xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path, done_ccb); } + PROBE_SET_ACTION(softc, PROBE_DONE); break; case PROBE_INQUIRY: case PROBE_FULL_INQUIRY: { - struct scsi_inquiry_data *inq_buf; u_int8_t periph_qual, len; path->device->flags |= CAM_DEV_INQUIRY_DATA_VALID; - inq_buf = &path->device->inq_data; periph_qual = SID_QUAL(inq_buf); @@ -1131,6 +1094,7 @@ notsata: xpt_action(done_ccb); xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path, done_ccb); } + PROBE_SET_ACTION(softc, PROBE_DONE); break; } case PROBE_PM_PID: @@ -1156,6 +1120,9 @@ notsata: snprintf(ident_buf->revision, sizeof(ident_buf->revision), "%04x", softc->pm_prv); path->device->flags |= CAM_DEV_IDENTIFY_DATA_VALID; + ata_device_transport(path); + if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) + proberequestdefaultnegotiation(periph); /* Set supported bits. */ bzero(&cts, sizeof(cts)); xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); @@ -1199,12 +1166,56 @@ notsata: xpt_action(done_ccb); xpt_async(AC_SCSI_AEN, done_ccb->ccb_h.path, done_ccb); } + PROBE_SET_ACTION(softc, PROBE_DONE); + break; + case PROBE_IDENTIFY_SES: + case PROBE_IDENTIFY_SAFTE: + if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) { + /* Check that it is the same device. */ + if (bcmp(&softc->ident_data, ident_buf, 53)) { + /* Device changed. */ + xpt_async(AC_LOST_DEVICE, path, NULL); + } else { + bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params)); + changed = 0; + } + } + if (changed) { + bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params)); + /* Clean up from previous instance of this device */ + if (path->device->device_id != NULL) { + free(path->device->device_id, M_CAMXPT); + path->device->device_id = NULL; + path->device->device_id_len = 0; + } + path->device->device_id = + malloc(16, M_CAMXPT, M_NOWAIT); + if (path->device->device_id != NULL) { + path->device->device_id_len = 16; + bcopy(&fake_device_id_hdr, + path->device->device_id, 8); + bcopy(((uint8_t*)ident_buf) + 2, + path->device->device_id + 8, 8); + } + + path->device->flags |= CAM_DEV_IDENTIFY_DATA_VALID; + } + ata_device_transport(path); + if (changed) + proberequestdefaultnegotiation(periph); + + if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) { + path->device->flags &= ~CAM_DEV_UNCONFIGURED; + xpt_acquire_device(path->device); + done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; + xpt_action(done_ccb); + xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path, + done_ccb); + } + PROBE_SET_ACTION(softc, PROBE_DONE); break; - case PROBE_INVALID: - CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_INFO, - ("probedone: invalid action state\n")); default: - break; + panic("probedone: invalid action state 0x%x\n", softc->action); } done: if (softc->restart) { @@ -1214,15 +1225,16 @@ done: return; } xpt_release_ccb(done_ccb); + CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("Probe completed\n")); while ((done_ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs))) { TAILQ_REMOVE(&softc->request_ccbs, &done_ccb->ccb_h, periph_links.tqe); done_ccb->ccb_h.status = found ? CAM_REQ_CMP : CAM_REQ_CMP_ERR; xpt_done(done_ccb); } + cam_periph_invalidate(periph); cam_release_devq(periph->path, RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_XPT + 1, FALSE); - cam_periph_invalidate(periph); cam_periph_release_locked(periph); } @@ -1248,8 +1260,10 @@ ata_find_quirk(struct cam_ed *device) quirk = (struct ata_quirk_entry *)match; device->quirk = quirk; - if (quirk->quirks & CAM_QUIRK_MAXTAGS) - device->mintags = device->maxtags = quirk->maxtags; + if (quirk->quirks & CAM_QUIRK_MAXTAGS) { + device->mintags = quirk->mintags; + device->maxtags = quirk->maxtags; + } } typedef struct { @@ -1473,12 +1487,17 @@ ata_scan_lun(struct cam_periph *periph, struct cam_path *path, } if ((old_periph = cam_periph_find(path, "aprobe")) != NULL) { - probe_softc *softc; + if ((old_periph->flags & CAM_PERIPH_INVALID) == 0) { + probe_softc *softc; - softc = (probe_softc *)old_periph->softc; - TAILQ_INSERT_TAIL(&softc->request_ccbs, &request_ccb->ccb_h, - periph_links.tqe); - softc->restart = 1; + softc = (probe_softc *)old_periph->softc; + TAILQ_INSERT_TAIL(&softc->request_ccbs, + &request_ccb->ccb_h, periph_links.tqe); + softc->restart = 1; + } else { + request_ccb->ccb_h.status = CAM_REQ_CMP_ERR; + xpt_done(request_ccb); + } } else { status = cam_periph_alloc(proberegister, NULL, probecleanup, probestart, "aprobe", @@ -1624,10 +1643,20 @@ ata_dev_advinfo(union ccb *start_ccb) device = start_ccb->ccb_h.path->device; cdai = &start_ccb->cdai; switch(cdai->buftype) { + case CDAI_TYPE_SCSI_DEVID: + if (cdai->flags & CDAI_FLAG_STORE) + return; + cdai->provsiz = device->device_id_len; + if (device->device_id_len == 0) + break; + amt = device->device_id_len; + if (cdai->provsiz > cdai->bufsiz) + amt = cdai->bufsiz; + memcpy(cdai->buf, device->device_id, amt); + break; case CDAI_TYPE_SERIAL_NUM: if (cdai->flags & CDAI_FLAG_STORE) - break; - start_ccb->ccb_h.status = CAM_REQ_CMP; + return; cdai->provsiz = device->serial_num_len; if (device->serial_num_len == 0) break; @@ -1636,8 +1665,45 @@ ata_dev_advinfo(union ccb *start_ccb) amt = cdai->bufsiz; memcpy(cdai->buf, device->serial_num, amt); break; - default: + case CDAI_TYPE_PHYS_PATH: + if (cdai->flags & CDAI_FLAG_STORE) { + if (device->physpath != NULL) + free(device->physpath, M_CAMXPT); + device->physpath_len = cdai->bufsiz; + /* Clear existing buffer if zero length */ + if (cdai->bufsiz == 0) + break; + device->physpath = malloc(cdai->bufsiz, M_CAMXPT, M_NOWAIT); + if (device->physpath == NULL) { + start_ccb->ccb_h.status = CAM_REQ_ABORTED; + return; + } + memcpy(device->physpath, cdai->buf, cdai->bufsiz); + } else { + cdai->provsiz = device->physpath_len; + if (device->physpath_len == 0) + break; + amt = device->physpath_len; + if (cdai->provsiz > cdai->bufsiz) + amt = cdai->bufsiz; + memcpy(cdai->buf, device->physpath, amt); + } break; + default: + return; + } + start_ccb->ccb_h.status = CAM_REQ_CMP; + + if (cdai->flags & CDAI_FLAG_STORE) { + int owned; + + owned = mtx_owned(start_ccb->ccb_h.path->bus->sim->mtx); + if (owned == 0) + mtx_lock(start_ccb->ccb_h.path->bus->sim->mtx); + xpt_async(AC_ADVINFO_CHANGED, start_ccb->ccb_h.path, + (void *)(uintptr_t)cdai->buftype); + if (owned == 0) + mtx_unlock(start_ccb->ccb_h.path->bus->sim->mtx); } } @@ -1664,10 +1730,7 @@ ata_action(union ccb *start_ccb) break; case XPT_GET_TRAN_SETTINGS: { - struct cam_sim *sim; - - sim = start_ccb->ccb_h.path->bus->sim; - (*(sim->sim_action))(sim, start_ccb); + ata_get_transfer_settings(&start_ccb->cts); break; } case XPT_SCSI_IO: @@ -1705,15 +1768,61 @@ ata_action(union ccb *start_ccb) } } +static void +ata_get_transfer_settings(struct ccb_trans_settings *cts) +{ + struct ccb_trans_settings_ata *ata; + struct ccb_trans_settings_scsi *scsi; + struct cam_ed *device; + struct cam_sim *sim; + + device = cts->ccb_h.path->device; + sim = cts->ccb_h.path->bus->sim; + (*(sim->sim_action))(sim, (union ccb *)cts); + + if (cts->protocol == PROTO_UNKNOWN || + cts->protocol == PROTO_UNSPECIFIED) { + cts->protocol = device->protocol; + cts->protocol_version = device->protocol_version; + } + + if (cts->protocol == PROTO_ATA) { + ata = &cts->proto_specific.ata; + if ((ata->valid & CTS_ATA_VALID_TQ) == 0) { + ata->valid |= CTS_ATA_VALID_TQ; + if (cts->type == CTS_TYPE_USER_SETTINGS || + (device->flags & CAM_DEV_TAG_AFTER_COUNT) != 0 || + (device->inq_flags & SID_CmdQue) != 0) + ata->flags |= CTS_ATA_FLAGS_TAG_ENB; + } + } + if (cts->protocol == PROTO_SCSI) { + scsi = &cts->proto_specific.scsi; + if ((scsi->valid & CTS_SCSI_VALID_TQ) == 0) { + scsi->valid |= CTS_SCSI_VALID_TQ; + if (cts->type == CTS_TYPE_USER_SETTINGS || + (device->flags & CAM_DEV_TAG_AFTER_COUNT) != 0 || + (device->inq_flags & SID_CmdQue) != 0) + scsi->flags |= CTS_SCSI_FLAGS_TAG_ENB; + } + } + + if (cts->transport == XPORT_UNKNOWN || + cts->transport == XPORT_UNSPECIFIED) { + cts->transport = device->transport; + cts->transport_version = device->transport_version; + } +} + static void ata_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device, int async_update) { struct ccb_pathinq cpi; - struct ccb_trans_settings cur_cts; + struct ccb_trans_settings_ata *ata; struct ccb_trans_settings_scsi *scsi; - struct ccb_trans_settings_scsi *cur_scsi; struct cam_sim *sim; + struct ata_params *ident_data; struct scsi_inquiry_data *inq_data; if (device == NULL) { @@ -1773,95 +1882,63 @@ ata_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device, } sim = cts->ccb_h.path->bus->sim; - - /* - * Nothing more of interest to do unless - * this is a device connected via the - * SCSI protocol. - */ - if (cts->protocol != PROTO_SCSI) { - if (async_update == FALSE) - (*(sim->sim_action))(sim, (union ccb *)cts); - return; - } - + ident_data = &device->ident_data; inq_data = &device->inq_data; - scsi = &cts->proto_specific.scsi; + if (cts->protocol == PROTO_ATA) + ata = &cts->proto_specific.ata; + else + ata = NULL; + if (cts->protocol == PROTO_SCSI) + scsi = &cts->proto_specific.scsi; + else + scsi = NULL; xpt_setup_ccb(&cpi.ccb_h, cts->ccb_h.path, CAM_PRIORITY_NONE); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); - /* SCSI specific sanity checking */ + /* Sanity checking */ if ((cpi.hba_inquiry & PI_TAG_ABLE) == 0 - || (INQ_DATA_TQ_ENABLED(inq_data)) == 0 + || (ata && (ident_data->satacapabilities & ATA_SUPPORT_NCQ) == 0) + || (scsi && (INQ_DATA_TQ_ENABLED(inq_data)) == 0) || (device->queue_flags & SCP_QUEUE_DQUE) != 0 || (device->mintags == 0)) { /* * Can't tag on hardware that doesn't support tags, * doesn't have it enabled, or has broken tag support. */ - scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB; - } - - if (async_update == FALSE) { - /* - * Perform sanity checking against what the - * controller and device can do. - */ - xpt_setup_ccb(&cur_cts.ccb_h, cts->ccb_h.path, CAM_PRIORITY_NONE); - cur_cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; - cur_cts.type = cts->type; - xpt_action((union ccb *)&cur_cts); - if ((cur_cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { - return; - } - cur_scsi = &cur_cts.proto_specific.scsi; - if ((scsi->valid & CTS_SCSI_VALID_TQ) == 0) { - scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB; - scsi->flags |= cur_scsi->flags & CTS_SCSI_FLAGS_TAG_ENB; - } - if ((cur_scsi->valid & CTS_SCSI_VALID_TQ) == 0) + if (ata) + ata->flags &= ~CTS_ATA_FLAGS_TAG_ENB; + if (scsi) scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB; } - if (cts->type == CTS_TYPE_CURRENT_SETTINGS - && (scsi->valid & CTS_SCSI_VALID_TQ) != 0) { - int device_tagenb; + /* Start/stop tags use. */ + if (cts->type == CTS_TYPE_CURRENT_SETTINGS && + ((ata && (ata->valid & CTS_ATA_VALID_TQ) != 0) || + (scsi && (scsi->valid & CTS_SCSI_VALID_TQ) != 0))) { + int nowt, newt = 0; - /* - * If we are transitioning from tags to no-tags or - * vice-versa, we need to carefully freeze and restart - * the queue so that we don't overlap tagged and non-tagged - * commands. We also temporarily stop tags if there is - * a change in transfer negotiation settings to allow - * "tag-less" negotiation. - */ - if ((device->flags & CAM_DEV_TAG_AFTER_COUNT) != 0 - || (device->inq_flags & SID_CmdQue) != 0) - device_tagenb = TRUE; - else - device_tagenb = FALSE; + nowt = ((device->flags & CAM_DEV_TAG_AFTER_COUNT) != 0 || + (device->inq_flags & SID_CmdQue) != 0); + if (ata) + newt = (ata->flags & CTS_ATA_FLAGS_TAG_ENB) != 0; + if (scsi) + newt = (scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) != 0; - if (((scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) != 0 - && device_tagenb == FALSE) - || ((scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) == 0 - && device_tagenb == TRUE)) { - - if ((scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) != 0) { - /* - * Delay change to use tags until after a - * few commands have gone to this device so - * the controller has time to perform transfer - * negotiations without tagged messages getting - * in the way. - */ - device->tag_delay_count = CAM_TAG_DELAY_COUNT; - device->flags |= CAM_DEV_TAG_AFTER_COUNT; - } else { - xpt_stop_tags(cts->ccb_h.path); - } - } + if (newt && !nowt) { + /* + * Delay change to use tags until after a + * few commands have gone to this device so + * the controller has time to perform transfer + * negotiations without tagged messages getting + * in the way. + */ + device->tag_delay_count = CAM_TAG_DELAY_COUNT; + device->flags |= CAM_DEV_TAG_AFTER_COUNT; + } else if (nowt && !newt) + xpt_stop_tags(cts->ccb_h.path); } + if (async_update == FALSE) (*(sim->sim_action))(sim, (union ccb *)cts); } @@ -1951,11 +2028,11 @@ ata_announce_periph(struct cam_periph *periph) /* Report connection speed */ speed = cpi.base_transfer_speed; if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_ATA) { - struct ccb_trans_settings_ata *ata = + struct ccb_trans_settings_pata *pata = &cts.xport_specific.ata; - if (ata->valid & CTS_ATA_VALID_MODE) - speed = ata_mode2speed(ata->mode); + if (pata->valid & CTS_ATA_VALID_MODE) + speed = ata_mode2speed(pata->mode); } if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SATA) { struct ccb_trans_settings_sata *sata = @@ -1974,16 +2051,16 @@ ata_announce_periph(struct cam_periph *periph) periph->unit_number, speed); /* Report additional information about connection */ if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_ATA) { - struct ccb_trans_settings_ata *ata = + struct ccb_trans_settings_pata *pata = &cts.xport_specific.ata; printf(" ("); - if (ata->valid & CTS_ATA_VALID_MODE) - printf("%s, ", ata_mode2string(ata->mode)); - if ((ata->valid & CTS_ATA_VALID_ATAPI) && ata->atapi != 0) - printf("ATAPI %dbytes, ", ata->atapi); - if (ata->valid & CTS_ATA_VALID_BYTECOUNT) - printf("PIO %dbytes", ata->bytecount); + if (pata->valid & CTS_ATA_VALID_MODE) + printf("%s, ", ata_mode2string(pata->mode)); + if ((pata->valid & CTS_ATA_VALID_ATAPI) && pata->atapi != 0) + printf("ATAPI %dbytes, ", pata->atapi); + if (pata->valid & CTS_ATA_VALID_BYTECOUNT) + printf("PIO %dbytes", pata->bytecount); printf(")"); } if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SATA) { diff --git a/sys/cam/cam.h b/sys/cam/cam.h index 7f99a9cedee..0f8d30e0f1c 100644 --- a/sys/cam/cam.h +++ b/sys/cam/cam.h @@ -108,6 +108,15 @@ typedef enum { CAM_RETRY_SELTO = 0x02 /* Retry Selection Timeouts */ } cam_flags; +enum { + SF_RETRY_UA = 0x01, /* Retry UNIT ATTENTION conditions. */ + SF_NO_PRINT = 0x02, /* Never print error status. */ + SF_QUIET_IR = 0x04, /* Be quiet about Illegal Request reponses */ + SF_PRINT_ALWAYS = 0x08, /* Always print error status. */ + SF_NO_RECOVERY = 0x10, /* Don't do active error recovery. */ + SF_NO_RETRY = 0x20 /* Don't do any retries. */ +}; + /* CAM Status field values */ typedef enum { CAM_REQ_INPROG, /* CCB request is in progress */ diff --git a/sys/cam/cam_ccb.h b/sys/cam/cam_ccb.h index 6eb3b5027d4..52d7496fb9d 100644 --- a/sys/cam/cam_ccb.h +++ b/sys/cam/cam_ccb.h @@ -242,6 +242,7 @@ typedef enum { PROTO_ATA, /* AT Attachment */ PROTO_ATAPI, /* AT Attachment Packetized Interface */ PROTO_SATAPM, /* SATA Port Multiplier */ + PROTO_SEMB, /* SATA Enclosure Management Bridge */ } cam_proto; typedef enum { @@ -843,6 +844,14 @@ struct ccb_trans_settings_scsi #define CTS_SCSI_FLAGS_TAG_ENB 0x01 }; +struct ccb_trans_settings_ata +{ + u_int valid; /* Which fields to honor */ +#define CTS_ATA_VALID_TQ 0x01 + u_int flags; +#define CTS_ATA_FLAGS_TAG_ENB 0x01 +}; + struct ccb_trans_settings_spi { u_int valid; /* Which fields to honor */ @@ -877,7 +886,7 @@ struct ccb_trans_settings_sas { u_int32_t bitrate; /* Mbps */ }; -struct ccb_trans_settings_ata { +struct ccb_trans_settings_pata { u_int valid; /* Which fields to honor */ #define CTS_ATA_VALID_MODE 0x01 #define CTS_ATA_VALID_BYTECOUNT 0x02 @@ -923,6 +932,7 @@ struct ccb_trans_settings { u_int transport_version; union { u_int valid; /* Which fields to honor */ + struct ccb_trans_settings_ata ata; struct ccb_trans_settings_scsi scsi; } proto_specific; union { @@ -930,7 +940,7 @@ struct ccb_trans_settings { struct ccb_trans_settings_spi spi; struct ccb_trans_settings_fc fc; struct ccb_trans_settings_sas sas; - struct ccb_trans_settings_ata ata; + struct ccb_trans_settings_pata ata; struct ccb_trans_settings_sata sata; } xport_specific; }; diff --git a/sys/cam/cam_debug.h b/sys/cam/cam_debug.h index 857fa43c12a..e072ec1c715 100644 --- a/sys/cam/cam_debug.h +++ b/sys/cam/cam_debug.h @@ -44,7 +44,35 @@ typedef enum { CAM_DEBUG_PROBE = 0x40 /* print out probe actions */ } cam_debug_flags; -#if defined(CAMDEBUG) && defined(_KERNEL) +#if defined(_KERNEL) + +#ifndef CAM_DEBUG_FLAGS +#define CAM_DEBUG_FLAGS CAM_DEBUG_NONE +#endif + +#ifndef CAM_DEBUG_COMPILE +#ifdef CAMDEBUG +#define CAM_DEBUG_COMPILE (-1) +#else +#define CAM_DEBUG_COMPILE (CAM_DEBUG_INFO | CAM_DEBUG_CDB | \ + CAM_DEBUG_PERIPH | CAM_DEBUG_PROBE | \ + CAM_DEBUG_FLAGS) +#endif +#endif + +#ifndef CAM_DEBUG_BUS +#define CAM_DEBUG_BUS (-1) +#endif +#ifndef CAM_DEBUG_TARGET +#define CAM_DEBUG_TARGET (-1) +#endif +#ifndef CAM_DEBUG_LUN +#define CAM_DEBUG_LUN (-1) +#endif + +#ifndef CAM_DEBUG_DELAY +#define CAM_DEBUG_DELAY 0 +#endif /* Path we want to debug */ extern struct cam_path *cam_dpath; @@ -52,48 +80,48 @@ extern struct cam_path *cam_dpath; extern u_int32_t cam_dflags; /* Printf delay value (to prevent scrolling) */ extern u_int32_t cam_debug_delay; - + /* Debugging macros. */ #define CAM_DEBUGGED(path, flag) \ - ((cam_dflags & (flag)) \ + (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ && (cam_dpath != NULL) \ && (xpt_path_comp(cam_dpath, path) >= 0) \ && (xpt_path_comp(cam_dpath, path) < 2)) #define CAM_DEBUG(path, flag, printfargs) \ - if ((cam_dflags & (flag)) \ + if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ && (cam_dpath != NULL) \ && (xpt_path_comp(cam_dpath, path) >= 0) \ && (xpt_path_comp(cam_dpath, path) < 2)) { \ xpt_print_path(path); \ - printf printfargs; \ + printf printfargs; \ if (cam_debug_delay != 0) \ DELAY(cam_debug_delay); \ } #define CAM_DEBUG_PRINT(flag, printfargs) \ - if (cam_dflags & (flag)) { \ + if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags)) { \ printf("cam_debug: "); \ - printf printfargs; \ + printf printfargs; \ if (cam_debug_delay != 0) \ DELAY(cam_debug_delay); \ } #define CAM_DEBUG_PATH_PRINT(flag, path, printfargs) \ - if (cam_dflags & (flag)) { \ + if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags)) { \ xpt_print(path, "cam_debug: "); \ - printf printfargs; \ + printf printfargs; \ if (cam_debug_delay != 0) \ DELAY(cam_debug_delay); \ } -#else /* !CAMDEBUG || !_KERNEL */ +#else /* !_KERNEL */ #define CAM_DEBUGGED(A, B) 0 #define CAM_DEBUG(A, B, C) #define CAM_DEBUG_PRINT(A, B) #define CAM_DEBUG_PATH_PRINT(A, B, C) -#endif /* CAMDEBUG && _KERNEL */ +#endif /* _KERNEL */ #endif /* _CAM_CAM_DEBUG_H */ diff --git a/sys/cam/cam_periph.c b/sys/cam/cam_periph.c index bf8d4ccb01a..d947732c30f 100644 --- a/sys/cam/cam_periph.c +++ b/sys/cam/cam_periph.c @@ -69,18 +69,22 @@ static void camperiphdone(struct cam_periph *periph, union ccb *done_ccb); static void camperiphfree(struct cam_periph *periph); static int camperiphscsistatuserror(union ccb *ccb, + union ccb **orig_ccb, cam_flags camflags, u_int32_t sense_flags, int *openings, u_int32_t *relsim_flags, u_int32_t *timeout, + int *print, const char **action_string); static int camperiphscsisenseerror(union ccb *ccb, + union ccb **orig_ccb, cam_flags camflags, u_int32_t sense_flags, int *openings, u_int32_t *relsim_flags, u_int32_t *timeout, + int *print, const char **action_string); static int nperiph_drivers; @@ -240,6 +244,7 @@ cam_periph_alloc(periph_ctor_t *periph_ctor, goto failure; init_level++; + CAM_DEBUG(periph->path, CAM_DEBUG_INFO, ("Periph created\n")); status = periph_ctor(periph, arg); @@ -252,7 +257,8 @@ failure: /* Initialized successfully */ break; case 3: - xpt_remove_periph(periph); + CAM_DEBUG(periph->path, CAM_DEBUG_INFO, ("Periph destroyed\n")); + xpt_remove_periph(periph, /*topology_lock_held*/ 0); /* FALLTHROUGH */ case 2: xpt_lock_buses(); @@ -267,7 +273,7 @@ failure: /* No cleanup to perform. */ break; default: - panic("cam_periph_alloc: Unkown init level"); + panic("%s: Unknown init level", __func__); } return(status); } @@ -434,6 +440,10 @@ cam_periph_hold(struct cam_periph *periph, int priority) cam_periph_release_locked(periph); return (error); } + if (periph->flags & CAM_PERIPH_INVALID) { + cam_periph_release_locked(periph); + return (ENXIO); + } } periph->flags |= CAM_PERIPH_LOCKED; @@ -572,6 +582,7 @@ void cam_periph_invalidate(struct cam_periph *periph) { + CAM_DEBUG(periph->path, CAM_DEBUG_INFO, ("Periph invalidated\n")); /* * We only call this routine the first time a peripheral is * invalidated. @@ -603,13 +614,39 @@ camperiphfree(struct cam_periph *periph) return; } - TAILQ_REMOVE(&(*p_drv)->units, periph, unit_links); - (*p_drv)->generation++; + /* + * The peripheral destructor semantics dictate calling with only the + * SIM mutex held. Since it might sleep, it should not be called + * with the topology lock held. + */ xpt_unlock_buses(); + /* + * We need to call the peripheral destructor prior to removing the + * peripheral from the list. Otherwise, we risk running into a + * scenario where the peripheral unit number may get reused + * (because it has been removed from the list), but some resources + * used by the peripheral are still hanging around. In particular, + * the devfs nodes used by some peripherals like the pass(4) driver + * aren't fully cleaned up until the destructor is run. If the + * unit number is reused before the devfs instance is fully gone, + * devfs will panic. + */ if (periph->periph_dtor != NULL) periph->periph_dtor(periph); - xpt_remove_periph(periph); + + /* + * The peripheral list is protected by the topology lock. + */ + xpt_lock_buses(); + + TAILQ_REMOVE(&(*p_drv)->units, periph, unit_links); + (*p_drv)->generation++; + + xpt_remove_periph(periph, /*topology_lock_held*/ 1); + + xpt_unlock_buses(); + CAM_DEBUG(periph->path, CAM_DEBUG_INFO, ("Periph destroyed\n")); if (periph->flags & CAM_PERIPH_NEW_DEV_FOUND) { union ccb ccb; @@ -1104,107 +1141,52 @@ cam_release_devq(struct cam_path *path, u_int32_t relsim_flags, } #define saved_ccb_ptr ppriv_ptr0 -#define recovery_depth ppriv_field1 -static void -camperiphsensedone(struct cam_periph *periph, union ccb *done_ccb) -{ - union ccb *saved_ccb = (union ccb *)done_ccb->ccb_h.saved_ccb_ptr; - cam_status status; - int frozen = 0; - int depth = done_ccb->ccb_h.recovery_depth; - - status = done_ccb->ccb_h.status; - if (status & CAM_DEV_QFRZN) { - frozen = 1; - /* - * Clear freeze flag now for case of retry, - * freeze will be dropped later. - */ - done_ccb->ccb_h.status &= ~CAM_DEV_QFRZN; - } - status &= CAM_STATUS_MASK; - switch (status) { - case CAM_REQ_CMP: - { - int error_code, sense_key, asc, ascq; - - scsi_extract_sense_len(&saved_ccb->csio.sense_data, - saved_ccb->csio.sense_len - - saved_ccb->csio.sense_resid, - &error_code, &sense_key, &asc, &ascq, - /*show_errors*/ 1); - /* - * If we manually retrieved sense into a CCB and got - * something other than "NO SENSE" send the updated CCB - * back to the client via xpt_done() to be processed via - * the error recovery code again. - */ - if ((sense_key != -1) - && (sense_key != SSD_KEY_NO_SENSE)) { - saved_ccb->ccb_h.status |= CAM_AUTOSNS_VALID; - } else { - saved_ccb->ccb_h.status &= ~CAM_STATUS_MASK; - saved_ccb->ccb_h.status |= CAM_AUTOSENSE_FAIL; - } - saved_ccb->csio.sense_resid = done_ccb->csio.resid; - bcopy(saved_ccb, done_ccb, sizeof(union ccb)); - xpt_free_ccb(saved_ccb); - break; - } - default: - bcopy(saved_ccb, done_ccb, sizeof(union ccb)); - xpt_free_ccb(saved_ccb); - done_ccb->ccb_h.status &= ~CAM_STATUS_MASK; - done_ccb->ccb_h.status |= CAM_AUTOSENSE_FAIL; - break; - } - periph->flags &= ~CAM_PERIPH_SENSE_INPROG; - /* - * If it is the end of recovery, drop freeze, taken due to - * CAM_DEV_QFREEZE flag, set on recovery request. - */ - if (depth == 0) { - cam_release_devq(done_ccb->ccb_h.path, - /*relsim_flags*/0, - /*openings*/0, - /*timeout*/0, - /*getcount_only*/0); - } - /* - * Copy frozen flag from recovery request if it is set there - * for some reason. - */ - if (frozen != 0) - done_ccb->ccb_h.status |= CAM_DEV_QFRZN; - (*done_ccb->ccb_h.cbfcnp)(periph, done_ccb); -} - static void camperiphdone(struct cam_periph *periph, union ccb *done_ccb) { - union ccb *saved_ccb, *save_ccb; + union ccb *saved_ccb; cam_status status; - int frozen = 0; struct scsi_start_stop_unit *scsi_cmd; - u_int32_t relsim_flags, timeout; + int error_code, sense_key, asc, ascq; + scsi_cmd = (struct scsi_start_stop_unit *) + &done_ccb->csio.cdb_io.cdb_bytes; status = done_ccb->ccb_h.status; - if (status & CAM_DEV_QFRZN) { - frozen = 1; - /* - * Clear freeze flag now for case of retry, - * freeze will be dropped later. - */ - done_ccb->ccb_h.status &= ~CAM_DEV_QFRZN; - } - timeout = 0; - relsim_flags = 0; - saved_ccb = (union ccb *)done_ccb->ccb_h.saved_ccb_ptr; - - switch (status & CAM_STATUS_MASK) { - case CAM_REQ_CMP: - { + if ((status & CAM_STATUS_MASK) != CAM_REQ_CMP) { + if (scsi_extract_sense_ccb(done_ccb, + &error_code, &sense_key, &asc, &ascq)) { + /* + * If the error is "invalid field in CDB", + * and the load/eject flag is set, turn the + * flag off and try again. This is just in + * case the drive in question barfs on the + * load eject flag. The CAM code should set + * the load/eject flag by default for + * removable media. + */ + if ((scsi_cmd->opcode == START_STOP_UNIT) && + ((scsi_cmd->how & SSS_LOEJ) != 0) && + (asc == 0x24) && (ascq == 0x00)) { + scsi_cmd->how &= ~SSS_LOEJ; + if (status & CAM_DEV_QFRZN) { + cam_release_devq(done_ccb->ccb_h.path, + 0, 0, 0, 0); + done_ccb->ccb_h.status &= + ~CAM_DEV_QFRZN; + } + xpt_action(done_ccb); + goto out; + } + } + if (cam_periph_error(done_ccb, + 0, SF_RETRY_UA | SF_NO_PRINT, NULL) == ERESTART) + goto out; + if (done_ccb->ccb_h.status & CAM_DEV_QFRZN) { + cam_release_devq(done_ccb->ccb_h.path, 0, 0, 0, 0); + done_ccb->ccb_h.status &= ~CAM_DEV_QFRZN; + } + } else { /* * If we have successfully taken a device from the not * ready to ready state, re-scan the device and re-get @@ -1212,147 +1194,24 @@ camperiphdone(struct cam_periph *periph, union ccb *done_ccb) * don't properly report their inquiry information unless * they are spun up. */ - scsi_cmd = (struct scsi_start_stop_unit *) - &done_ccb->csio.cdb_io.cdb_bytes; - - if (scsi_cmd->opcode == START_STOP_UNIT) - xpt_async(AC_INQ_CHANGED, - done_ccb->ccb_h.path, NULL); - goto final; + if (scsi_cmd->opcode == START_STOP_UNIT) + xpt_async(AC_INQ_CHANGED, done_ccb->ccb_h.path, NULL); } - case CAM_SCSI_STATUS_ERROR: - scsi_cmd = (struct scsi_start_stop_unit *) - &done_ccb->csio.cdb_io.cdb_bytes; - if (status & CAM_AUTOSNS_VALID) { - struct ccb_getdev cgd; - struct scsi_sense_data *sense; - int error_code, sense_key, asc, ascq, sense_len; - scsi_sense_action err_action; - sense = &done_ccb->csio.sense_data; - sense_len = done_ccb->csio.sense_len - - done_ccb->csio.sense_resid; - scsi_extract_sense_len(sense, sense_len, &error_code, - &sense_key, &asc, &ascq, - /*show_errors*/ 1); - /* - * Grab the inquiry data for this device. - */ - xpt_setup_ccb(&cgd.ccb_h, done_ccb->ccb_h.path, - CAM_PRIORITY_NORMAL); - cgd.ccb_h.func_code = XPT_GDEV_TYPE; - xpt_action((union ccb *)&cgd); - err_action = scsi_error_action(&done_ccb->csio, - &cgd.inq_data, 0); - /* - * If the error is "invalid field in CDB", - * and the load/eject flag is set, turn the - * flag off and try again. This is just in - * case the drive in question barfs on the - * load eject flag. The CAM code should set - * the load/eject flag by default for - * removable media. - */ - /* XXX KDM - * Should we check to see what the specific - * scsi status is?? Or does it not matter - * since we already know that there was an - * error, and we know what the specific - * error code was, and we know what the - * opcode is.. - */ - if ((scsi_cmd->opcode == START_STOP_UNIT) && - ((scsi_cmd->how & SSS_LOEJ) != 0) && - (asc == 0x24) && (ascq == 0x00) && - (done_ccb->ccb_h.retry_count > 0)) { - - scsi_cmd->how &= ~SSS_LOEJ; - xpt_action(done_ccb); - } else if ((done_ccb->ccb_h.retry_count > 1) - && ((err_action & SS_MASK) != SS_FAIL)) { - - /* - * In this case, the error recovery - * command failed, but we've got - * some retries left on it. Give - * it another try unless this is an - * unretryable error. - */ - /* set the timeout to .5 sec */ - relsim_flags = - RELSIM_RELEASE_AFTER_TIMEOUT; - timeout = 500; - xpt_action(done_ccb); - break; - } else { - /* - * Perform the final retry with the original - * CCB so that final error processing is - * performed by the owner of the CCB. - */ - goto final; - } - } else { - save_ccb = xpt_alloc_ccb_nowait(); - if (save_ccb == NULL) - goto final; - bcopy(done_ccb, save_ccb, sizeof(*save_ccb)); - periph->flags |= CAM_PERIPH_SENSE_INPROG; - /* - * Send a Request Sense to the device. We - * assume that we are in a contingent allegiance - * condition so we do not tag this request. - */ - scsi_request_sense(&done_ccb->csio, /*retries*/1, - camperiphsensedone, - &save_ccb->csio.sense_data, - save_ccb->csio.sense_len, - CAM_TAG_ACTION_NONE, - /*sense_len*/SSD_FULL_SIZE, - /*timeout*/5000); - done_ccb->ccb_h.pinfo.priority--; - done_ccb->ccb_h.flags |= CAM_DEV_QFREEZE; - done_ccb->ccb_h.saved_ccb_ptr = save_ccb; - done_ccb->ccb_h.recovery_depth++; - xpt_action(done_ccb); - } - break; - default: -final: - bcopy(saved_ccb, done_ccb, sizeof(*done_ccb)); - xpt_free_ccb(saved_ccb); + /* + * Perform the final retry with the original CCB so that final + * error processing is performed by the owner of the CCB. + */ + saved_ccb = (union ccb *)done_ccb->ccb_h.saved_ccb_ptr; + bcopy(saved_ccb, done_ccb, sizeof(*done_ccb)); + xpt_free_ccb(saved_ccb); + if (done_ccb->ccb_h.cbfcnp != camperiphdone) periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG; - xpt_action(done_ccb); - break; - } + xpt_action(done_ccb); - /* decrement the retry count */ - /* - * XXX This isn't appropriate in all cases. Restructure, - * so that the retry count is only decremented on an - * actual retry. Remeber that the orignal ccb had its - * retry count dropped before entering recovery, so - * doing it again is a bug. - */ - if (done_ccb->ccb_h.retry_count > 0) - done_ccb->ccb_h.retry_count--; - /* - * Drop freeze taken due to CAM_DEV_QFREEZE flag set on recovery - * request. - */ - cam_release_devq(done_ccb->ccb_h.path, - /*relsim_flags*/relsim_flags, - /*openings*/0, - /*timeout*/timeout, - /*getcount_only*/0); - /* Drop freeze taken, if this recovery request got error. */ - if (frozen != 0) { - cam_release_devq(done_ccb->ccb_h.path, - /*relsim_flags*/0, - /*openings*/0, - /*timeout*/0, - /*getcount_only*/0); - } +out: + /* Drop freeze taken due to CAM_DEV_QFREEZE flag set. */ + cam_release_devq(done_ccb->ccb_h.path, 0, 0, 0, 0); } /* @@ -1411,10 +1270,10 @@ cam_periph_freeze_after_event(struct cam_periph *periph, } static int -camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, - u_int32_t sense_flags, - int *openings, u_int32_t *relsim_flags, - u_int32_t *timeout, const char **action_string) +camperiphscsistatuserror(union ccb *ccb, union ccb **orig_ccb, + cam_flags camflags, u_int32_t sense_flags, + int *openings, u_int32_t *relsim_flags, + u_int32_t *timeout, int *print, const char **action_string) { int error; @@ -1427,14 +1286,13 @@ camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, break; case SCSI_STATUS_CMD_TERMINATED: case SCSI_STATUS_CHECK_COND: - if (bootverbose) - xpt_print(ccb->ccb_h.path, "SCSI status error\n"); - error = camperiphscsisenseerror(ccb, + error = camperiphscsisenseerror(ccb, orig_ccb, camflags, sense_flags, openings, relsim_flags, timeout, + print, action_string); break; case SCSI_STATUS_QUEUE_FULL: @@ -1489,9 +1347,7 @@ camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, } *timeout = 0; error = ERESTART; - if (bootverbose) { - xpt_print(ccb->ccb_h.path, "Queue full\n"); - } + *print = 0; break; } /* FALLTHROUGH */ @@ -1501,9 +1357,6 @@ camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, * Restart the queue after either another * command completes or a 1 second timeout. */ - if (bootverbose) { - xpt_print(ccb->ccb_h.path, "Device busy\n"); - } if (ccb->ccb_h.retry_count > 0) { ccb->ccb_h.retry_count--; error = ERESTART; @@ -1515,12 +1368,7 @@ camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, } break; case SCSI_STATUS_RESERV_CONFLICT: - xpt_print(ccb->ccb_h.path, "Reservation conflict\n"); - error = EIO; - break; default: - xpt_print(ccb->ccb_h.path, "SCSI status 0x%x\n", - ccb->csio.scsi_status); error = EIO; break; } @@ -1528,18 +1376,18 @@ camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, } static int -camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, - u_int32_t sense_flags, - int *openings, u_int32_t *relsim_flags, - u_int32_t *timeout, const char **action_string) +camperiphscsisenseerror(union ccb *ccb, union ccb **orig, + cam_flags camflags, u_int32_t sense_flags, + int *openings, u_int32_t *relsim_flags, + u_int32_t *timeout, int *print, const char **action_string) { struct cam_periph *periph; union ccb *orig_ccb = ccb; - int error; + int error, recoveryccb; periph = xpt_path_periph(ccb->ccb_h.path); - if (periph->flags & - (CAM_PERIPH_RECOVERY_INPROG | CAM_PERIPH_SENSE_INPROG)) { + recoveryccb = (ccb->ccb_h.cbfcnp == camperiphdone); + if ((periph->flags & CAM_PERIPH_RECOVERY_INPROG) && !recoveryccb) { /* * If error recovery is already in progress, don't attempt * to process this error, but requeue it unconditionally @@ -1554,6 +1402,7 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, * imperitive that we don't violate this assumption. */ error = ERESTART; + *print = 0; } else { scsi_sense_action err_action; struct ccb_getdev cgd; @@ -1565,17 +1414,35 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, cgd.ccb_h.func_code = XPT_GDEV_TYPE; xpt_action((union ccb *)&cgd); - if ((ccb->ccb_h.status & CAM_AUTOSNS_VALID) != 0) - err_action = scsi_error_action(&ccb->csio, - &cgd.inq_data, - sense_flags); - else if ((ccb->ccb_h.flags & CAM_DIS_AUTOSENSE) == 0) - err_action = SS_REQSENSE; - else - err_action = SS_RETRY|SSQ_DECREMENT_COUNT|EIO; - + err_action = scsi_error_action(&ccb->csio, &cgd.inq_data, + sense_flags); error = err_action & SS_ERRMASK; + /* + * Do not autostart sequential access devices + * to avoid unexpected tape loading. + */ + if ((err_action & SS_MASK) == SS_START && + SID_TYPE(&cgd.inq_data) == T_SEQUENTIAL) { + *action_string = "Will not autostart a " + "sequential access device"; + goto sense_error_done; + } + + /* + * Avoid recovery recursion if recovery action is the same. + */ + if ((err_action & SS_MASK) >= SS_START && recoveryccb) { + if (((err_action & SS_MASK) == SS_START && + ccb->csio.cdb_io.cdb_bytes[0] == START_STOP_UNIT) || + ((err_action & SS_MASK) == SS_TUR && + (ccb->csio.cdb_io.cdb_bytes[0] == TEST_UNIT_READY))) { + err_action = SS_RETRY|SSQ_DECREMENT_COUNT|EIO; + *relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT; + *timeout = 500; + } + } + /* * If the recovery action will consume a retry, * make sure we actually have retries available. @@ -1623,15 +1490,6 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, case SS_START: { int le; - if (SID_TYPE(&cgd.inq_data) == T_SEQUENTIAL) { - xpt_free_ccb(orig_ccb); - ccb->ccb_h.status |= CAM_DEV_QFRZN; - *action_string = "Will not autostart a " - "sequential access device"; - err_action = SS_FAIL; - error = EIO; - break; - } /* * Send a start unit command to the device, and @@ -1695,24 +1553,6 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, *timeout = 500; break; } - case SS_REQSENSE: - { - *action_string = "Requesting SCSI sense data"; - periph->flags |= CAM_PERIPH_SENSE_INPROG; - /* - * Send a Request Sense to the device. We - * assume that we are in a contingent allegiance - * condition so we do not tag this request. - */ - scsi_request_sense(&ccb->csio, /*retries*/1, - camperiphsensedone, - &orig_ccb->csio.sense_data, - orig_ccb->csio.sense_len, - CAM_TAG_ACTION_NONE, - /*sense_len*/SSD_FULL_SIZE, - /*timeout*/5000); - break; - } default: panic("Unhandled error action %x", err_action); } @@ -1729,14 +1569,12 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, ccb->ccb_h.pinfo.priority--; ccb->ccb_h.flags |= CAM_DEV_QFREEZE; ccb->ccb_h.saved_ccb_ptr = orig_ccb; - ccb->ccb_h.recovery_depth = 0; error = ERESTART; + *orig = orig_ccb; } sense_error_done: - if ((err_action & SSQ_PRINT_SENSE) != 0 - && (ccb->ccb_h.status & CAM_AUTOSNS_VALID) != 0) - cam_error_print(orig_ccb, CAM_ESF_ALL, CAM_EPF_ALL); + *print = ((err_action & SSQ_PRINT_SENSE) != 0); } return (error); } @@ -1750,87 +1588,35 @@ int cam_periph_error(union ccb *ccb, cam_flags camflags, u_int32_t sense_flags, union ccb *save_ccb) { + union ccb *orig_ccb; struct cam_periph *periph; const char *action_string; cam_status status; - int frozen; - int error, printed = 0; - int openings; - u_int32_t relsim_flags; - u_int32_t timeout = 0; + int frozen, error, openings, print, lost_device; + u_int32_t relsim_flags, timeout; + print = 1; periph = xpt_path_periph(ccb->ccb_h.path); action_string = NULL; status = ccb->ccb_h.status; frozen = (status & CAM_DEV_QFRZN) != 0; status &= CAM_STATUS_MASK; - openings = relsim_flags = 0; + openings = relsim_flags = timeout = lost_device = 0; + orig_ccb = ccb; switch (status) { case CAM_REQ_CMP: error = 0; + print = 0; break; case CAM_SCSI_STATUS_ERROR: - error = camperiphscsistatuserror(ccb, - camflags, - sense_flags, - &openings, - &relsim_flags, - &timeout, - &action_string); + error = camperiphscsistatuserror(ccb, &orig_ccb, + camflags, sense_flags, &openings, &relsim_flags, + &timeout, &print, &action_string); break; case CAM_AUTOSENSE_FAIL: - xpt_print(ccb->ccb_h.path, "AutoSense failed\n"); error = EIO; /* we have to kill the command */ break; - case CAM_ATA_STATUS_ERROR: - if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, "ATA status error\n"); - cam_error_print(ccb, CAM_ESF_ALL, CAM_EPF_ALL); - printed++; - } - /* FALLTHROUGH */ - case CAM_REQ_CMP_ERR: - if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, - "Request completed with CAM_REQ_CMP_ERR\n"); - printed++; - } - /* FALLTHROUGH */ - case CAM_CMD_TIMEOUT: - if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, "Command timed out\n"); - printed++; - } - /* FALLTHROUGH */ - case CAM_UNEXP_BUSFREE: - if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, "Unexpected Bus Free\n"); - printed++; - } - /* FALLTHROUGH */ - case CAM_UNCOR_PARITY: - if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, - "Uncorrected parity error\n"); - printed++; - } - /* FALLTHROUGH */ - case CAM_DATA_RUN_ERR: - if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, "Data overrun\n"); - printed++; - } - /* decrement the number of retries */ - if (ccb->ccb_h.retry_count > 0 && - (periph->flags & CAM_PERIPH_INVALID) == 0) { - ccb->ccb_h.retry_count--; - error = ERESTART; - } else { - action_string = "Retries exhausted"; - error = EIO; - } - break; case CAM_UA_ABORT: case CAM_UA_TERMIO: case CAM_MSG_REJECT_REC: @@ -1841,14 +1627,8 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, if ((camflags & CAM_RETRY_SELTO) != 0) { if (ccb->ccb_h.retry_count > 0 && (periph->flags & CAM_PERIPH_INVALID) == 0) { - ccb->ccb_h.retry_count--; error = ERESTART; - if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, - "Selection timeout\n"); - printed++; - } /* * Wait a bit to give the device @@ -1862,38 +1642,10 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, } /* FALLTHROUGH */ case CAM_DEV_NOT_THERE: - { - struct cam_path *newpath; - lun_id_t lun_id; - error = ENXIO; - - /* - * For a selection timeout, we consider all of the LUNs on - * the target to be gone. If the status is CAM_DEV_NOT_THERE, - * then we only get rid of the device(s) specified by the - * path in the original CCB. - */ - if (status == CAM_DEV_NOT_THERE) - lun_id = xpt_path_lun_id(ccb->ccb_h.path); - else - lun_id = CAM_LUN_WILDCARD; - - /* Should we do more if we can't create the path?? */ - if (xpt_create_path(&newpath, periph, - xpt_path_path_id(ccb->ccb_h.path), - xpt_path_target_id(ccb->ccb_h.path), - lun_id) != CAM_REQ_CMP) - break; - - /* - * Let peripheral drivers know that this device has gone - * away. - */ - xpt_async(AC_LOST_DEVICE, newpath, NULL); - xpt_free_path(newpath); + print = 0; + lost_device = 1; break; - } case CAM_REQ_INVALID: case CAM_PATH_INVALID: case CAM_NO_HBA: @@ -1913,26 +1665,17 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, * these events and should be unconditionally * retried. */ - if (bootverbose && printed == 0) { - xpt_print_path(ccb->ccb_h.path); - if (status == CAM_BDR_SENT) - printf("Bus Device Reset sent\n"); - else - printf("Bus Reset issued\n"); - printed++; - } - /* FALLTHROUGH */ case CAM_REQUEUE_REQ: - /* Unconditional requeue */ - if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, "Request requeued\n"); - printed++; - } - if ((periph->flags & CAM_PERIPH_INVALID) == 0) - error = ERESTART; - else { - action_string = "Retries exhausted"; + /* Unconditional requeue if device is still there */ + if (periph->flags & CAM_PERIPH_INVALID) { + action_string = "Periph was invalidated"; error = EIO; + } else if (sense_flags & SF_NO_RETRY) { + error = EIO; + action_string = "Retry was blocked"; + } else { + error = ERESTART; + print = 0; } break; case CAM_RESRC_UNAVAIL: @@ -1946,30 +1689,37 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, } relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT; /* FALLTHROUGH */ + case CAM_ATA_STATUS_ERROR: + case CAM_REQ_CMP_ERR: + case CAM_CMD_TIMEOUT: + case CAM_UNEXP_BUSFREE: + case CAM_UNCOR_PARITY: + case CAM_DATA_RUN_ERR: default: - /* decrement the number of retries */ - if (ccb->ccb_h.retry_count > 0 && - (periph->flags & CAM_PERIPH_INVALID) == 0) { - ccb->ccb_h.retry_count--; - error = ERESTART; - if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, "CAM status 0x%x\n", - status); - printed++; - } - } else { + if (periph->flags & CAM_PERIPH_INVALID) { + error = EIO; + action_string = "Periph was invalidated"; + } else if (ccb->ccb_h.retry_count == 0) { error = EIO; action_string = "Retries exhausted"; + } else if (sense_flags & SF_NO_RETRY) { + error = EIO; + action_string = "Retry was blocked"; + } else { + ccb->ccb_h.retry_count--; + error = ERESTART; } break; } - /* - * If we have and error and are booting verbosely, whine - * *unless* this was a non-retryable selection timeout. - */ - if (error != 0 && bootverbose && - !(status == CAM_SEL_TIMEOUT && (camflags & CAM_RETRY_SELTO) == 0)) { + if ((sense_flags & SF_PRINT_ALWAYS) || + CAM_DEBUGGED(ccb->ccb_h.path, CAM_DEBUG_INFO)) + print = 1; + else if (sense_flags & SF_NO_PRINT) + print = 0; + if (print) + cam_error_print(orig_ccb, CAM_ESF_ALL, CAM_EPF_ALL); + if (error != 0 && print) { if (error != ERESTART) { if (action_string == NULL) action_string = "Unretryable error"; @@ -1981,6 +1731,36 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, xpt_print(ccb->ccb_h.path, "Retrying command\n"); } + if (lost_device) { + struct cam_path *newpath; + lun_id_t lun_id; + + /* + * For a selection timeout, we consider all of the LUNs on + * the target to be gone. If the status is CAM_DEV_NOT_THERE, + * then we only get rid of the device(s) specified by the + * path in the original CCB. + */ + if (status == CAM_DEV_NOT_THERE) + lun_id = xpt_path_lun_id(ccb->ccb_h.path); + else + lun_id = CAM_LUN_WILDCARD; + + /* Should we do more if we can't create the path?? */ + if (xpt_create_path(&newpath, periph, + xpt_path_path_id(ccb->ccb_h.path), + xpt_path_target_id(ccb->ccb_h.path), + lun_id) == CAM_REQ_CMP) { + + /* + * Let peripheral drivers know that this + * device has gone away. + */ + xpt_async(AC_LOST_DEVICE, newpath, NULL); + xpt_free_path(newpath); + } + } + /* Attempt a retry */ if (error == ERESTART || error == 0) { if (frozen != 0) diff --git a/sys/cam/cam_periph.h b/sys/cam/cam_periph.h index 6c232ca74b4..b51fb681b2d 100644 --- a/sys/cam/cam_periph.h +++ b/sys/cam/cam_periph.h @@ -118,7 +118,6 @@ struct cam_periph { #define CAM_PERIPH_INVALID 0x08 #define CAM_PERIPH_NEW_DEV_FOUND 0x10 #define CAM_PERIPH_RECOVERY_INPROG 0x20 -#define CAM_PERIPH_SENSE_INPROG 0x40 #define CAM_PERIPH_FREE 0x80 u_int32_t immediate_priority; u_int32_t refcount; diff --git a/sys/cam/cam_sim.h b/sys/cam/cam_sim.h index 398d5403403..93e99a5ceda 100644 --- a/sys/cam/cam_sim.h +++ b/sys/cam/cam_sim.h @@ -106,6 +106,7 @@ struct cam_sim { #define CAM_SIM_MPSAFE 0x02 #define CAM_SIM_ON_DONEQ 0x04 #define CAM_SIM_POLLED 0x08 +#define CAM_SIM_BATCH 0x10 struct callout callout; struct cam_devq *devq; /* Device Queue to use for this SIM */ int refcount; /* References to the SIM. */ diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c index 0ee1cc4f0e7..3065c12df52 100644 --- a/sys/cam/cam_xpt.c +++ b/sys/cam/cam_xpt.c @@ -188,21 +188,15 @@ static struct cdevsw xpt_cdevsw = { }; /* Storage for debugging datastructures */ -#ifdef CAMDEBUG struct cam_path *cam_dpath; -#ifdef CAM_DEBUG_FLAGS u_int32_t cam_dflags = CAM_DEBUG_FLAGS; -#else -u_int32_t cam_dflags = CAM_DEBUG_NONE; -#endif TUNABLE_INT("kern.cam.dflags", &cam_dflags); SYSCTL_UINT(_kern_cam, OID_AUTO, dflags, CTLFLAG_RW, - &cam_dflags, 0, "Cam Debug Flags"); -u_int32_t cam_debug_delay; + &cam_dflags, 0, "Enabled debug flags"); +u_int32_t cam_debug_delay = CAM_DEBUG_DELAY; TUNABLE_INT("kern.cam.debug_delay", &cam_debug_delay); SYSCTL_UINT(_kern_cam, OID_AUTO, debug_delay, CTLFLAG_RW, - &cam_debug_delay, 0, "Cam Debug Flags"); -#endif + &cam_debug_delay, 0, "Delay in us after each debug message"); /* Our boot-time initialization hook */ static int cam_module_event_handler(module_t, int /*modeventtype_t*/, void *); @@ -1032,7 +1026,7 @@ xpt_add_periph(struct cam_periph *periph) } void -xpt_remove_periph(struct cam_periph *periph) +xpt_remove_periph(struct cam_periph *periph, int topology_lock_held) { struct cam_ed *device; @@ -1053,9 +1047,13 @@ xpt_remove_periph(struct cam_periph *periph) SLIST_REMOVE(periph_head, periph, cam_periph, periph_links); } - mtx_lock(&xsoftc.xpt_topo_lock); + if (topology_lock_held == 0) + mtx_lock(&xsoftc.xpt_topo_lock); + xsoftc.xpt_generation++; - mtx_unlock(&xsoftc.xpt_topo_lock); + + if (topology_lock_held == 0) + mtx_unlock(&xsoftc.xpt_topo_lock); } @@ -1080,6 +1078,9 @@ xpt_announce_periph(struct cam_periph *periph, char *announce_string) else if (path->device->protocol == PROTO_ATA || path->device->protocol == PROTO_SATAPM) ata_print_ident(&path->device->ident_data); + else if (path->device->protocol == PROTO_SEMB) + semb_print_ident( + (struct sep_identify_data *)&path->device->ident_data); else printf("Unknown protocol device\n"); if (bootverbose && path->device->serial_num_len > 0) { @@ -2469,9 +2470,7 @@ xpt_action(union ccb *start_ccb) void xpt_action_default(union ccb *start_ccb) { -#ifdef CAMDEBUG char cdb_str[(SCSI_MAX_CDBLEN * 3) + 1]; -#endif struct cam_path *path; path = start_ccb->ccb_h.path; @@ -2902,17 +2901,13 @@ xpt_action_default(union ccb *start_ccb) if ((crs->release_flags & RELSIM_ADJUST_OPENINGS) != 0) { - if (INQ_DATA_TQ_ENABLED(&dev->inq_data)) { - /* Don't ever go below one opening */ - if (crs->openings > 0) { - xpt_dev_ccbq_resize(path, - crs->openings); - - if (bootverbose) { - xpt_print(path, - "tagged openings now %d\n", - crs->openings); - } + /* Don't ever go below one opening */ + if (crs->openings > 0) { + xpt_dev_ccbq_resize(path, crs->openings); + if (bootverbose) { + xpt_print(path, + "number of openings is now %d\n", + crs->openings); } } } @@ -2981,16 +2976,17 @@ xpt_action_default(union ccb *start_ccb) break; } case XPT_DEBUG: { -#ifdef CAMDEBUG -#ifdef CAM_DEBUG_DELAY - cam_debug_delay = CAM_DEBUG_DELAY; -#endif + /* Check that all request bits are supported. */ + if (start_ccb->cdbg.flags & ~(CAM_DEBUG_COMPILE)) { + start_ccb->ccb_h.status = CAM_FUNC_NOTAVAIL; + break; + } + cam_dflags = start_ccb->cdbg.flags; if (cam_dpath != NULL) { xpt_free_path(cam_dpath); cam_dpath = NULL; } - if (cam_dflags != CAM_DEBUG_NONE) { if (xpt_create_path(&cam_dpath, xpt_periph, start_ccb->ccb_h.path_id, @@ -3008,9 +3004,6 @@ xpt_action_default(union ccb *start_ccb) cam_dpath = NULL; start_ccb->ccb_h.status = CAM_REQ_CMP; } -#else /* !CAMDEBUG */ - start_ccb->ccb_h.status = CAM_FUNC_NOTAVAIL; -#endif /* CAMDEBUG */ break; } case XPT_FREEZE_QUEUE: @@ -3227,13 +3220,8 @@ xpt_run_dev_allocq(struct cam_eb *bus) ("running device %p\n", device)); drvq = &device->drvq; - -#ifdef CAMDEBUG - if (drvq->entries <= 0) { - panic("xpt_run_dev_allocq: " - "Device on queue without any work to do"); - } -#endif + KASSERT(drvq->entries > 0, ("xpt_run_dev_allocq: " + "Device on queue without any work to do")); if ((work_ccb = xpt_get_ccb(device)) != NULL) { devq->alloc_openings--; devq->alloc_active++; @@ -4049,6 +4037,28 @@ xptpathid(const char *sim_name, int sim_unit, int sim_bus) return (pathid); } +static const char * +xpt_async_string(u_int32_t async_code) +{ + + switch (async_code) { + case AC_BUS_RESET: return ("AC_BUS_RESET"); + case AC_UNSOL_RESEL: return ("AC_UNSOL_RESEL"); + case AC_SCSI_AEN: return ("AC_SCSI_AEN"); + case AC_SENT_BDR: return ("AC_SENT_BDR"); + case AC_PATH_REGISTERED: return ("AC_PATH_REGISTERED"); + case AC_PATH_DEREGISTERED: return ("AC_PATH_DEREGISTERED"); + case AC_FOUND_DEVICE: return ("AC_FOUND_DEVICE"); + case AC_LOST_DEVICE: return ("AC_LOST_DEVICE"); + case AC_TRANSFER_NEG: return ("AC_TRANSFER_NEG"); + case AC_INQ_CHANGED: return ("AC_INQ_CHANGED"); + case AC_GETDEV_CHANGED: return ("AC_GETDEV_CHANGED"); + case AC_CONTRACT: return ("AC_CONTRACT"); + case AC_ADVINFO_CHANGED: return ("AC_ADVINFO_CHANGED"); + } + return ("AC_UNKNOWN"); +} + void xpt_async(u_int32_t async_code, struct cam_path *path, void *async_arg) { @@ -4057,8 +4067,8 @@ xpt_async(u_int32_t async_code, struct cam_path *path, void *async_arg) struct cam_ed *device, *next_device; mtx_assert(path->bus->sim->mtx, MA_OWNED); - - CAM_DEBUG(path, CAM_DEBUG_TRACE, ("xpt_async\n")); + CAM_DEBUG(path, CAM_DEBUG_TRACE | CAM_DEBUG_INFO, + ("xpt_async(%s)\n", xpt_async_string(async_code))); /* * Most async events come from a CAM interrupt context. In @@ -4332,7 +4342,8 @@ xpt_done(union ccb *done_ccb) TAILQ_INSERT_TAIL(&sim->sim_doneq, &done_ccb->ccb_h, sim_links.tqe); done_ccb->ccb_h.pinfo.index = CAM_DONEQ_INDEX; - if ((sim->flags & (CAM_SIM_ON_DONEQ | CAM_SIM_POLLED)) == 0) { + if ((sim->flags & (CAM_SIM_ON_DONEQ | CAM_SIM_POLLED | + CAM_SIM_BATCH)) == 0) { mtx_lock(&cam_simq_lock); first = TAILQ_EMPTY(&cam_simq); TAILQ_INSERT_TAIL(&cam_simq, sim, links); @@ -4344,6 +4355,25 @@ xpt_done(union ccb *done_ccb) } } +void +xpt_batch_start(struct cam_sim *sim) +{ + + KASSERT((sim->flags & CAM_SIM_BATCH) == 0, ("Batch flag already set")); + sim->flags |= CAM_SIM_BATCH; +} + +void +xpt_batch_done(struct cam_sim *sim) +{ + + KASSERT((sim->flags & CAM_SIM_BATCH) != 0, ("Batch flag was not set")); + sim->flags &= ~CAM_SIM_BATCH; + if (!TAILQ_EMPTY(&sim->sim_doneq) && + (sim->flags & CAM_SIM_ON_DONEQ) == 0) + camisr_runqueue(&sim->sim_doneq); +} + union ccb * xpt_alloc_ccb() { @@ -4696,6 +4726,7 @@ xpt_start_tags(struct cam_path *path) newopenings = min(device->maxtags, sim->max_tagged_dev_openings); xpt_dev_ccbq_resize(path, newopenings); + xpt_async(AC_GETDEV_CHANGED, path, NULL); xpt_setup_ccb(&crs.ccb_h, path, CAM_PRIORITY_NORMAL); crs.ccb_h.func_code = XPT_REL_SIMQ; crs.release_flags = RELSIM_RELEASE_AFTER_QEMPTY; @@ -4720,6 +4751,7 @@ xpt_stop_tags(struct cam_path *path) xpt_freeze_devq(path, /*count*/1); device->inq_flags &= ~SID_CmdQue; xpt_dev_ccbq_resize(path, sim->max_dev_openings); + xpt_async(AC_GETDEV_CHANGED, path, NULL); xpt_setup_ccb(&crs.ccb_h, path, CAM_PRIORITY_NORMAL); crs.ccb_h.func_code = XPT_REL_SIMQ; crs.release_flags = RELSIM_RELEASE_AFTER_QEMPTY; @@ -4744,9 +4776,7 @@ xpt_config(void *arg) * Now that interrupts are enabled, go find our devices */ -#ifdef CAMDEBUG - /* Setup debugging flags and path */ -#ifdef CAM_DEBUG_BUS + /* Setup debugging path */ if (cam_dflags != CAM_DEBUG_NONE) { /* * Locking is specifically omitted here. No SIMs have @@ -4763,10 +4793,6 @@ xpt_config(void *arg) } } else cam_dpath = NULL; -#else /* !CAM_DEBUG_BUS */ - cam_dpath = NULL; -#endif /* CAM_DEBUG_BUS */ -#endif /* CAMDEBUG */ periphdriver_init(1); xpt_hold_boot(); @@ -4839,7 +4865,8 @@ xpt_finishconfig_task(void *context, int pending) * attached. For any devices like that, announce the * passthrough driver so the user will see something. */ - xpt_for_all_devices(xptpassannouncefunc, NULL); + if (!bootverbose) + xpt_for_all_devices(xptpassannouncefunc, NULL); /* Release our hook so that the boot can continue. */ config_intrhook_disestablish(xsoftc.xpt_config_hook); @@ -4978,8 +5005,8 @@ camisr(void *dummy) while ((sim = TAILQ_FIRST(&queue)) != NULL) { TAILQ_REMOVE(&queue, sim, links); CAM_SIM_LOCK(sim); - sim->flags &= ~CAM_SIM_ON_DONEQ; camisr_runqueue(&sim->sim_doneq); + sim->flags &= ~CAM_SIM_ON_DONEQ; CAM_SIM_UNLOCK(sim); } mtx_lock(&cam_simq_lock); @@ -5042,10 +5069,16 @@ camisr_runqueue(void *V_queue) ccb_h->path->bus->sim->devq->send_openings++; runq = TRUE; - if (((dev->flags & CAM_DEV_REL_ON_COMPLETE) != 0 - && (ccb_h->status&CAM_STATUS_MASK) != CAM_REQUEUE_REQ) - || ((dev->flags & CAM_DEV_REL_ON_QUEUE_EMPTY) != 0 + if (((dev->flags & CAM_DEV_REL_ON_QUEUE_EMPTY) != 0 && (dev->ccbq.dev_active == 0))) { + dev->flags &= ~CAM_DEV_REL_ON_QUEUE_EMPTY; + xpt_release_devq(ccb_h->path, /*count*/1, + /*run_queue*/FALSE); + } + + if (((dev->flags & CAM_DEV_REL_ON_COMPLETE) != 0 + && (ccb_h->status&CAM_STATUS_MASK) != CAM_REQUEUE_REQ)) { + dev->flags &= ~CAM_DEV_REL_ON_COMPLETE; xpt_release_devq(ccb_h->path, /*count*/1, /*run_queue*/FALSE); } diff --git a/sys/cam/cam_xpt.h b/sys/cam/cam_xpt.h index 1d0e7f7d238..492fa3a4956 100644 --- a/sys/cam/cam_xpt.h +++ b/sys/cam/cam_xpt.h @@ -63,28 +63,6 @@ struct async_node { SLIST_HEAD(async_list, async_node); SLIST_HEAD(periph_list, cam_periph); -#if defined(CAM_DEBUG_FLAGS) && !defined(CAMDEBUG) -#error "You must have options CAMDEBUG to use options CAM_DEBUG_FLAGS" -#endif - -/* - * In order to enable the CAM_DEBUG_* options, the user must have CAMDEBUG - * enabled. Also, the user must have either none, or all of CAM_DEBUG_BUS, - * CAM_DEBUG_TARGET, and CAM_DEBUG_LUN specified. - */ -#if defined(CAM_DEBUG_BUS) || defined(CAM_DEBUG_TARGET) \ - || defined(CAM_DEBUG_LUN) -#ifdef CAMDEBUG -#if !defined(CAM_DEBUG_BUS) || !defined(CAM_DEBUG_TARGET) \ - || !defined(CAM_DEBUG_LUN) -#error "You must define all or none of CAM_DEBUG_BUS, CAM_DEBUG_TARGET \ - and CAM_DEBUG_LUN" -#endif /* !CAM_DEBUG_BUS || !CAM_DEBUG_TARGET || !CAM_DEBUG_LUN */ -#else /* !CAMDEBUG */ -#error "You must use options CAMDEBUG if you use the CAM_DEBUG_* options" -#endif /* CAMDEBUG */ -#endif /* CAM_DEBUG_BUS || CAM_DEBUG_TARGET || CAM_DEBUG_LUN */ - void xpt_action(union ccb *new_ccb); void xpt_action_default(union ccb *new_ccb); union ccb *xpt_alloc_ccb(void); diff --git a/sys/cam/cam_xpt_periph.h b/sys/cam/cam_xpt_periph.h index 867b1c1d381..d353283ad8c 100644 --- a/sys/cam/cam_xpt_periph.h +++ b/sys/cam/cam_xpt_periph.h @@ -42,7 +42,8 @@ void xpt_polled_action(union ccb *ccb); void xpt_release_ccb(union ccb *released_ccb); void xpt_schedule(struct cam_periph *perph, u_int32_t new_priority); int32_t xpt_add_periph(struct cam_periph *periph); -void xpt_remove_periph(struct cam_periph *periph); +void xpt_remove_periph(struct cam_periph *periph, + int topology_lock_held); void xpt_announce_periph(struct cam_periph *periph, char *announce_string); #endif diff --git a/sys/cam/cam_xpt_sim.h b/sys/cam/cam_xpt_sim.h index 323f786c813..67b895f2e75 100644 --- a/sys/cam/cam_xpt_sim.h +++ b/sys/cam/cam_xpt_sim.h @@ -51,6 +51,8 @@ void xpt_release_devq_rl(struct cam_path *path, cam_rl rl, u_int count, int run_queue); int xpt_sim_opened(struct cam_sim *sim); void xpt_done(union ccb *done_ccb); +void xpt_batch_start(struct cam_sim *sim); +void xpt_batch_done(struct cam_sim *sim); #endif #endif /* _CAM_CAM_XPT_SIM_H */ diff --git a/sys/cam/ctl/ctl.c b/sys/cam/ctl/ctl.c index 957ed8068bd..5b67b8f0a76 100644 --- a/sys/cam/ctl/ctl.c +++ b/sys/cam/ctl/ctl.c @@ -308,7 +308,6 @@ static struct scsi_control_page control_page_changeable = { /*aen_holdoff_period*/{0, 0} }; -SYSCTL_NODE(_kern_cam, OID_AUTO, ctl, CTLFLAG_RD, 0, "CAM Target Layer"); /* * XXX KDM move these into the softc. @@ -318,7 +317,12 @@ static int persis_offset; static uint8_t ctl_pause_rtr; static int ctl_is_single; static int index_to_aps_page; +int ctl_disable = 0; +SYSCTL_NODE(_kern_cam, OID_AUTO, ctl, CTLFLAG_RD, 0, "CAM Target Layer"); +SYSCTL_INT(_kern_cam_ctl, OID_AUTO, disable, CTLFLAG_RDTUN, &ctl_disable, 0, + "Disable CTL"); +TUNABLE_INT("kern.cam.ctl.disable", &ctl_disable); /* * Serial number (0x80), device id (0x83), and supported pages (0x00) @@ -949,6 +953,10 @@ ctl_init(void) ctl_pause_rtr = 0; rcv_sync_msg = 0; + /* If we're disabled, don't initialize. */ + if (ctl_disable != 0) + return; + control_softc = malloc(sizeof(*control_softc), M_DEVBUF, M_WAITOK); softc = control_softc; diff --git a/sys/cam/ctl/ctl_backend.c b/sys/cam/ctl/ctl_backend.c index 5234c4a3207..863e9c79ef7 100644 --- a/sys/cam/ctl/ctl_backend.c +++ b/sys/cam/ctl/ctl_backend.c @@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$"); #include extern struct ctl_softc *control_softc; +extern int ctl_disable; int ctl_backend_register(struct ctl_backend_driver *be) @@ -71,6 +72,10 @@ ctl_backend_register(struct ctl_backend_driver *be) ctl_softc = control_softc; + /* Don't continue if CTL is disabled */ + if (ctl_disable != 0) + return (0); + mtx_lock(&ctl_softc->ctl_lock); /* * Sanity check, make sure this isn't a duplicate registration. diff --git a/sys/cam/ctl/ctl_frontend_cam_sim.c b/sys/cam/ctl/ctl_frontend_cam_sim.c index 058c2c2cbeb..4a75202ab7e 100644 --- a/sys/cam/ctl/ctl_frontend_cam_sim.c +++ b/sys/cam/ctl/ctl_frontend_cam_sim.c @@ -119,6 +119,7 @@ struct cfcs_softc cfcs_softc; * amount of SCSI sense data that we will report to CAM. */ static int cfcs_max_sense = sizeof(struct scsi_sense_data); +extern int ctl_disable; SYSINIT(cfcs_init, SI_SUB_CONFIGURE, SI_ORDER_FOURTH, cfcs_init, NULL); SYSCTL_NODE(_kern_cam, OID_AUTO, ctl2cam, CTLFLAG_RD, 0, @@ -138,6 +139,10 @@ cfcs_init(void) #endif int retval; + /* Don't continue if CTL is disabled */ + if (ctl_disable != 0) + return (0); + softc = &cfcs_softc; retval = 0; bzero(softc, sizeof(*softc)); diff --git a/sys/cam/ctl/ctl_frontend_internal.c b/sys/cam/ctl/ctl_frontend_internal.c index 5231564dce4..46f9f33633d 100644 --- a/sys/cam/ctl/ctl_frontend_internal.c +++ b/sys/cam/ctl/ctl_frontend_internal.c @@ -187,6 +187,7 @@ struct cfi_softc { MALLOC_DEFINE(M_CTL_CFI, "ctlcfi", "CTL CFI"); static struct cfi_softc fetd_internal_softc; +extern int ctl_disable; void cfi_init(void); void cfi_shutdown(void) __unused; @@ -231,6 +232,10 @@ cfi_init(void) retval = 0; + /* If we're disabled, don't initialize */ + if (ctl_disable != 0) + return; + if (sizeof(struct cfi_lun_io) > CTL_PORT_PRIV_SIZE) { printf("%s: size of struct cfi_lun_io %zd > " "CTL_PORT_PRIV_SIZE %d\n", __func__, diff --git a/sys/cam/ctl/scsi_ctl.c b/sys/cam/ctl/scsi_ctl.c index f3ba03b9be3..ab51f01dd2b 100644 --- a/sys/cam/ctl/scsi_ctl.c +++ b/sys/cam/ctl/scsi_ctl.c @@ -227,12 +227,17 @@ static struct periph_driver ctlfe_driver = PERIPHDRIVER_DECLARE(ctl, ctlfe_driver); extern struct ctl_softc *control_softc; +extern int ctl_disable; int ctlfeinitialize(void) { cam_status status; + /* Don't initialize if we're disabled */ + if (ctl_disable != 0) + return (0); + STAILQ_INIT(&ctlfe_softc_list); mtx_init(&ctlfe_list_mtx, ctlfe_mtx_desc, NULL, MTX_DEF); @@ -263,6 +268,10 @@ ctlfeinit(void) { cam_status status; + /* Don't initialize if we're disabled */ + if (ctl_disable != 0) + return; + STAILQ_INIT(&ctlfe_softc_list); mtx_init(&ctlfe_list_mtx, ctlfe_mtx_desc, NULL, MTX_DEF); @@ -490,7 +499,7 @@ ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg) dev_chg = (struct ac_device_changed *)ac->contract_data; - printf("%s: WWPN %#jx port %u path %u target %u %s\n", + printf("%s: WWPN %#jx port 0x%06x path %u target %u %s\n", __func__, dev_chg->wwpn, dev_chg->port, xpt_path_path_id(path), dev_chg->target, (dev_chg->arrived == 0) ? "left" : "arrived"); @@ -558,7 +567,6 @@ ctlferegister(struct cam_periph *periph, void *arg) TAILQ_INIT(&softc->work_queue); softc->periph = periph; - softc->parent_softc = bus_softc; callout_init_mtx(&softc->dma_callout, sim->mtx, /*flags*/ 0); periph->softc = softc; @@ -582,7 +590,7 @@ ctlferegister(struct cam_periph *periph, void *arg) union ccb *new_ccb; new_ccb = (union ccb *)malloc(sizeof(*new_ccb), M_CTLFE, - M_NOWAIT); + M_ZERO|M_NOWAIT); if (new_ccb == NULL) { status = CAM_RESRC_UNAVAIL; break; @@ -616,7 +624,7 @@ ctlferegister(struct cam_periph *periph, void *arg) union ccb *new_ccb; new_ccb = (union ccb *)malloc(sizeof(*new_ccb), M_CTLFE, - M_NOWAIT); + M_ZERO|M_NOWAIT); if (new_ccb == NULL) { status = CAM_RESRC_UNAVAIL; break; @@ -628,12 +636,22 @@ ctlferegister(struct cam_periph *periph, void *arg) xpt_action(new_ccb); softc->inots_sent++; status = new_ccb->ccb_h.status; - if (status != CAM_REQ_INPROG) { - free(new_ccb, M_CTLFE); + if ((status & CAM_STATUS_MASK) != CAM_REQ_INPROG) { + /* + * Note that we don't free the CCB here. If the + * status is not CAM_REQ_INPROG, then we're + * probably talking to a SIM that says it is + * target-capable but doesn't support the + * XPT_IMMEDIATE_NOTIFY CCB. i.e. it supports the + * older API. In that case, it'll call xpt_done() + * on the CCB, and we need to free it in our done + * routine as a result. + */ break; } } - if (i == 0) { + if ((i == 0) + || (status != CAM_REQ_INPROG)) { xpt_print(periph->path, "%s: could not allocate immediate " "notify CCBs, status 0x%x\n", __func__, status); return (CAM_REQ_CMP_ERR); @@ -1460,12 +1478,29 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb) */ send_ctl_io = 0; break; + case CAM_REQ_INVALID: + case CAM_PROVIDE_FAIL: default: - xpt_print(periph->path, "%s: " - "unsupported CAM status 0x%x\n", - __func__, status); - send_ctl_io = 0; - break; + /* + * We should only get here if we're talking + * to a talking to a SIM that is target + * capable but supports the old API. In + * that case, we need to just free the CCB. + * If we actually send a notify acknowledge, + * it will send that back with an error as + * well. + */ + + if ((status != CAM_REQ_INVALID) + && (status != CAM_PROVIDE_FAIL)) + xpt_print(periph->path, "%s: " + "unsupported CAM status " + "0x%x\n", __func__, status); + + ctl_free_io(io); + ctlfe_free_ccb(periph, done_ccb); + + return; } if (send_ctl_io != 0) { ctl_queue(io); diff --git a/sys/cam/scsi/scsi_all.c b/sys/cam/scsi/scsi_all.c index 262260963e3..b5a41bb7a06 100644 --- a/sys/cam/scsi/scsi_all.c +++ b/sys/cam/scsi/scsi_all.c @@ -2834,11 +2834,10 @@ scsi_error_action(struct ccb_scsiio *csio, struct scsi_inquiry_data *inq_data, int error_code, sense_key, asc, ascq; scsi_sense_action action; - scsi_extract_sense_len(&csio->sense_data, csio->sense_len - - csio->sense_resid, &error_code, - &sense_key, &asc, &ascq, /*show_errors*/ 1); - - if ((error_code == SSD_DEFERRED_ERROR) + if (!scsi_extract_sense_ccb((union ccb *)csio, + &error_code, &sense_key, &asc, &ascq)) { + action = SS_RETRY | SSQ_DECREMENT_COUNT | SSQ_PRINT_SENSE | EIO; + } else if ((error_code == SSD_DEFERRED_ERROR) || (error_code == SSD_DESC_DEFERRED_ERROR)) { /* * XXX dufault@FreeBSD.org @@ -2901,11 +2900,17 @@ scsi_error_action(struct ccb_scsiio *csio, struct scsi_inquiry_data *inq_data, SSQ_PRINT_SENSE; } } + if ((action & SS_MASK) >= SS_START && + (sense_flags & SF_NO_RECOVERY)) { + action &= ~SS_MASK; + action |= SS_FAIL; + } else if ((action & SS_MASK) == SS_RETRY && + (sense_flags & SF_NO_RETRY)) { + action &= ~SS_MASK; + action |= SS_FAIL; + } + } -#ifdef _KERNEL - if (bootverbose) - sense_flags |= SF_PRINT_ALWAYS; -#endif if ((sense_flags & SF_PRINT_ALWAYS) != 0) action |= SSQ_PRINT_SENSE; else if ((sense_flags & SF_NO_PRINT) != 0) @@ -3059,6 +3064,10 @@ scsi_command_string(struct cam_device *device, struct ccb_scsiio *csio, sizeof(cdb_str))); } +#ifdef _KERNEL + xpt_free_ccb((union ccb *)cgd); +#endif + return(0); } @@ -4138,9 +4147,9 @@ scsi_sense_desc_sbuf(struct sbuf *sb, struct scsi_sense_data *sense, struct scsi_inquiry_data *inq_data, struct scsi_sense_desc_header *header) { - int i, found; + int i; - for (i = 0, found = 0; i < (sizeof(scsi_sense_printers) / + for (i = 0; i < (sizeof(scsi_sense_printers) / sizeof(scsi_sense_printers[0])); i++) { struct scsi_sense_desc_printer *printer; @@ -4611,6 +4620,36 @@ scsi_extract_sense(struct scsi_sense_data *sense_data, int *error_code, sense_key, asc, ascq, /*show_errors*/ 0); } +/* + * Extract basic sense information from SCSI I/O CCB structure. + */ +int +scsi_extract_sense_ccb(union ccb *ccb, + int *error_code, int *sense_key, int *asc, int *ascq) +{ + struct scsi_sense_data *sense_data; + + /* Make sure there are some sense data we can access. */ + if (ccb->ccb_h.func_code != XPT_SCSI_IO || + (ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_SCSI_STATUS_ERROR || + (ccb->csio.scsi_status != SCSI_STATUS_CHECK_COND) || + (ccb->ccb_h.status & CAM_AUTOSNS_VALID) == 0 || + (ccb->ccb_h.flags & CAM_SENSE_PHYS)) + return (0); + + if (ccb->ccb_h.flags & CAM_SENSE_PTR) + bcopy(&ccb->csio.sense_data, &sense_data, + sizeof(struct scsi_sense_data *)); + else + sense_data = &ccb->csio.sense_data; + scsi_extract_sense_len(sense_data, + ccb->csio.sense_len - ccb->csio.sense_resid, + error_code, sense_key, asc, ascq, 1); + if (*error_code == -1) + return (0); + return (1); +} + /* * Extract basic sense information. If show_errors is set, sense values * will be set to -1 if they are not present. @@ -5740,6 +5779,66 @@ scsi_send_diagnostic(struct ccb_scsiio *csio, u_int32_t retries, timeout); } +void +scsi_read_buffer(struct ccb_scsiio *csio, u_int32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb*), + uint8_t tag_action, int mode, + uint8_t buffer_id, u_int32_t offset, + uint8_t *data_ptr, uint32_t allocation_length, + uint8_t sense_len, uint32_t timeout) +{ + struct scsi_read_buffer *scsi_cmd; + + scsi_cmd = (struct scsi_read_buffer *)&csio->cdb_io.cdb_bytes; + memset(scsi_cmd, 0, sizeof(*scsi_cmd)); + scsi_cmd->opcode = READ_BUFFER; + scsi_cmd->byte2 = mode; + scsi_cmd->buffer_id = buffer_id; + scsi_ulto3b(offset, scsi_cmd->offset); + scsi_ulto3b(allocation_length, scsi_cmd->length); + + cam_fill_csio(csio, + retries, + cbfcnp, + /*flags*/CAM_DIR_IN, + tag_action, + data_ptr, + allocation_length, + sense_len, + sizeof(*scsi_cmd), + timeout); +} + +void +scsi_write_buffer(struct ccb_scsiio *csio, u_int32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint8_t tag_action, int mode, + uint8_t buffer_id, u_int32_t offset, + uint8_t *data_ptr, uint32_t param_list_length, + uint8_t sense_len, uint32_t timeout) +{ + struct scsi_write_buffer *scsi_cmd; + + scsi_cmd = (struct scsi_write_buffer *)&csio->cdb_io.cdb_bytes; + memset(scsi_cmd, 0, sizeof(*scsi_cmd)); + scsi_cmd->opcode = WRITE_BUFFER; + scsi_cmd->byte2 = mode; + scsi_cmd->buffer_id = buffer_id; + scsi_ulto3b(offset, scsi_cmd->offset); + scsi_ulto3b(param_list_length, scsi_cmd->length); + + cam_fill_csio(csio, + retries, + cbfcnp, + /*flags*/param_list_length ? CAM_DIR_OUT : CAM_DIR_NONE, + tag_action, + data_ptr, + param_list_length, + sense_len, + sizeof(*scsi_cmd), + timeout); +} + void scsi_start_stop(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), diff --git a/sys/cam/scsi/scsi_all.h b/sys/cam/scsi/scsi_all.h index ebee01c45a5..7275af45f89 100644 --- a/sys/cam/scsi/scsi_all.h +++ b/sys/cam/scsi/scsi_all.h @@ -74,9 +74,6 @@ typedef enum { SS_TUR = 0x040000, /* Send a Test Unit Ready command to the * device, then retry the original command. */ - SS_REQSENSE = 0x050000, /* Send a RequestSense command to the - * device, then retry the original command. - */ SS_MASK = 0xff0000 } scsi_sense_action; @@ -1267,6 +1264,8 @@ struct scsi_vpd_id_descriptor #define SCSI_PROTO_RDMA 0x04 #define SCSI_PROTO_iSCSI 0x05 #define SCSI_PROTO_SAS 0x06 +#define SCSI_PROTO_ADT 0x07 +#define SCSI_PROTO_ATA 0x08 #define SVPD_ID_PROTO_SHIFT 4 #define SVPD_ID_CODESET_BINARY 0x01 #define SVPD_ID_CODESET_ASCII 0x02 @@ -1400,6 +1399,13 @@ struct scsi_service_action_in uint8_t control; }; +struct scsi_diag_page { + uint8_t page_code; + uint8_t page_specific_flags; + uint8_t length[2]; + uint8_t params[0]; +}; + struct scsi_read_capacity { u_int8_t opcode; @@ -2174,12 +2180,6 @@ int scsi_sense_sbuf(struct ccb_scsiio *csio, struct sbuf *sb, char * scsi_sense_string(struct ccb_scsiio *csio, char *str, int str_len); void scsi_sense_print(struct ccb_scsiio *csio); -int scsi_interpret_sense(union ccb *ccb, - u_int32_t sense_flags, - u_int32_t *relsim_flags, - u_int32_t *reduction, - u_int32_t *timeout, - scsi_sense_action error_action); #else /* _KERNEL */ int scsi_command_string(struct cam_device *device, struct ccb_scsiio *csio, struct sbuf *sb); @@ -2191,21 +2191,8 @@ char * scsi_sense_string(struct cam_device *device, char *str, int str_len); void scsi_sense_print(struct cam_device *device, struct ccb_scsiio *csio, FILE *ofile); -int scsi_interpret_sense(struct cam_device *device, - union ccb *ccb, - u_int32_t sense_flags, - u_int32_t *relsim_flags, - u_int32_t *reduction, - u_int32_t *timeout, - scsi_sense_action error_action); #endif /* _KERNEL */ -#define SF_RETRY_UA 0x01 -#define SF_NO_PRINT 0x02 -#define SF_QUIET_IR 0x04 /* Be quiet about Illegal Request reponses */ -#define SF_PRINT_ALWAYS 0x08 - - const char * scsi_op_desc(u_int16_t opcode, struct scsi_inquiry_data *inq_data); char * scsi_cdb_string(u_int8_t *cdb_ptr, char *cdb_string, @@ -2352,6 +2339,20 @@ void scsi_send_diagnostic(struct ccb_scsiio *csio, u_int32_t retries, uint16_t param_list_length, uint8_t sense_len, uint32_t timeout); +void scsi_read_buffer(struct ccb_scsiio *csio, u_int32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb*), + uint8_t tag_action, int mode, + uint8_t buffer_id, u_int32_t offset, + uint8_t *data_ptr, uint32_t allocation_length, + uint8_t sense_len, uint32_t timeout); + +void scsi_write_buffer(struct ccb_scsiio *csio, u_int32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint8_t tag_action, int mode, + uint8_t buffer_id, u_int32_t offset, + uint8_t *data_ptr, uint32_t param_list_length, + uint8_t sense_len, uint32_t timeout); + void scsi_read_write(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), u_int8_t tag_action, int readop, u_int8_t byte2, @@ -2387,6 +2388,8 @@ int scsi_devid_match(uint8_t *rhs, size_t rhs_len, void scsi_extract_sense(struct scsi_sense_data *sense, int *error_code, int *sense_key, int *asc, int *ascq); +int scsi_extract_sense_ccb(union ccb *ccb, int *error_code, int *sense_key, + int *asc, int *ascq); void scsi_extract_sense_len(struct scsi_sense_data *sense, u_int sense_len, int *error_code, int *sense_key, int *asc, int *ascq, int show_errors); diff --git a/sys/cam/scsi/scsi_cd.c b/sys/cam/scsi/scsi_cd.c index 5e88a9784a5..7b24ddb9573 100644 --- a/sys/cam/scsi/scsi_cd.c +++ b/sys/cam/scsi/scsi_cd.c @@ -97,15 +97,13 @@ typedef enum { CD_FLAG_NEW_DISC = 0x0002, CD_FLAG_DISC_LOCKED = 0x0004, CD_FLAG_DISC_REMOVABLE = 0x0008, - CD_FLAG_TAGGED_QUEUING = 0x0010, CD_FLAG_CHANGER = 0x0040, CD_FLAG_ACTIVE = 0x0080, CD_FLAG_SCHED_ON_COMP = 0x0100, CD_FLAG_RETRY_UA = 0x0200, CD_FLAG_VALID_MEDIA = 0x0400, CD_FLAG_VALID_TOC = 0x0800, - CD_FLAG_SCTX_INIT = 0x1000, - CD_FLAG_OPEN = 0x2000 + CD_FLAG_SCTX_INIT = 0x1000 } cd_flags; typedef enum { @@ -295,6 +293,9 @@ PERIPHDRIVER_DECLARE(cd, cddriver); #ifndef CD_DEFAULT_RETRY #define CD_DEFAULT_RETRY 4 #endif +#ifndef CD_DEFAULT_TIMEOUT +#define CD_DEFAULT_TIMEOUT 30000 +#endif #ifndef CHANGER_MIN_BUSY_SECONDS #define CHANGER_MIN_BUSY_SECONDS 5 #endif @@ -303,6 +304,7 @@ PERIPHDRIVER_DECLARE(cd, cddriver); #endif static int cd_retry_count = CD_DEFAULT_RETRY; +static int cd_timeout = CD_DEFAULT_TIMEOUT; static int changer_min_busy_seconds = CHANGER_MIN_BUSY_SECONDS; static int changer_max_busy_seconds = CHANGER_MAX_BUSY_SECONDS; @@ -312,6 +314,9 @@ static SYSCTL_NODE(_kern_cam_cd, OID_AUTO, changer, CTLFLAG_RD, 0, SYSCTL_INT(_kern_cam_cd, OID_AUTO, retry_count, CTLFLAG_RW, &cd_retry_count, 0, "Normal I/O retry count"); TUNABLE_INT("kern.cam.cd.retry_count", &cd_retry_count); +SYSCTL_INT(_kern_cam_cd, OID_AUTO, timeout, CTLFLAG_RW, + &cd_timeout, 0, "Timeout, in us, for read operations"); +TUNABLE_INT("kern.cam.cd.timeout", &cd_timeout); SYSCTL_INT(_kern_cam_cd_changer, OID_AUTO, min_busy_seconds, CTLFLAG_RW, &changer_min_busy_seconds, 0, "Minimum changer scheduling quantum"); TUNABLE_INT("kern.cam.cd.changer.min_busy_seconds", &changer_min_busy_seconds); @@ -359,6 +364,20 @@ cdinit(void) } } +/* + * Callback from GEOM, called when it has finished cleaning up its + * resources. + */ +static void +cddiskgonecb(struct disk *dp) +{ + struct cam_periph *periph; + + periph = (struct cam_periph *)dp->d_drv1; + + cam_periph_release(periph); +} + static void cdoninvalidate(struct cam_periph *periph) { @@ -390,7 +409,7 @@ cdoninvalidate(struct cam_periph *periph) camq_remove(&softc->changer->devq, softc->pinfo.index); disk_gone(softc->disk); - xpt_print(periph->path, "lost device\n"); + xpt_print(periph->path, "lost device, %d refs\n", periph->refcount); } static void @@ -653,8 +672,6 @@ cdregister(struct cam_periph *periph, void *arg) bioq_init(&softc->bio_queue); if (SID_IS_REMOVABLE(&cgd->inq_data)) softc->flags |= CD_FLAG_DISC_REMOVABLE; - if ((cgd->inq_data.flags & SID_CmdQue) != 0) - softc->flags |= CD_FLAG_TAGGED_QUEUING; periph->softc = softc; softc->periph = periph; @@ -729,6 +746,7 @@ cdregister(struct cam_periph *periph, void *arg) softc->disk->d_open = cdopen; softc->disk->d_close = cdclose; softc->disk->d_strategy = cdstrategy; + softc->disk->d_gone = cddiskgonecb; softc->disk->d_ioctl = cdioctl; softc->disk->d_name = "cd"; cam_strvis(softc->disk->d_descr, cgd->inq_data.vendor, @@ -750,6 +768,19 @@ cdregister(struct cam_periph *periph, void *arg) softc->disk->d_hba_device = cpi.hba_device; softc->disk->d_hba_subvendor = cpi.hba_subvendor; softc->disk->d_hba_subdevice = cpi.hba_subdevice; + + /* + * Acquire a reference to the periph before we register with GEOM. + * We'll release this reference once GEOM calls us back (via + * dadiskgonecb()) telling us that our provider has been freed. + */ + if (cam_periph_acquire(periph) != CAM_REQ_CMP) { + xpt_print(periph->path, "%s: lost periph during " + "registration!\n", __func__); + cam_periph_lock(periph); + return (CAM_REQ_CMP_ERR); + } + disk_create(softc->disk, DISK_VERSION); cam_periph_lock(periph); @@ -1003,17 +1034,20 @@ cdopen(struct disk *dp) cam_periph_lock(periph); if (softc->flags & CD_FLAG_INVALID) { + cam_periph_release_locked(periph); cam_periph_unlock(periph); - cam_periph_release(periph); return(ENXIO); } if ((error = cam_periph_hold(periph, PRIBIO | PCATCH)) != 0) { + cam_periph_release_locked(periph); cam_periph_unlock(periph); - cam_periph_release(periph); return (error); } + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH, + ("cdopen\n")); + /* * Check for media, and set the appropriate flags. We don't bail * if we don't have media, but then we don't allow anything but the @@ -1024,14 +1058,7 @@ cdopen(struct disk *dp) CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("leaving cdopen\n")); cam_periph_unhold(periph); - /* Closes aren't symmetrical with opens, so fix up the refcounting. */ - if ((softc->flags & CD_FLAG_OPEN) == 0) { - softc->flags |= CD_FLAG_OPEN; - cam_periph_unlock(periph); - } else { - cam_periph_unlock(periph); - cam_periph_release(periph); - } + cam_periph_unlock(periph); return (0); } @@ -1049,7 +1076,14 @@ cdclose(struct disk *dp) softc = (struct cd_softc *)periph->softc; cam_periph_lock(periph); - cam_periph_hold(periph, PRIBIO); + if (cam_periph_hold(periph, PRIBIO) != 0) { + cam_periph_unlock(periph); + cam_periph_release(periph); + return (0); + } + + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH, + ("cdclose\n")); if ((softc->flags & CD_FLAG_DISC_REMOVABLE) != 0) cdprevent(periph, PR_ALLOW); @@ -1063,11 +1097,11 @@ cdclose(struct disk *dp) /* * We'll check the media and toc again at the next open(). */ - softc->flags &= ~(CD_FLAG_VALID_MEDIA|CD_FLAG_VALID_TOC|CD_FLAG_OPEN); + softc->flags &= ~(CD_FLAG_VALID_MEDIA|CD_FLAG_VALID_TOC); cam_periph_unhold(periph); + cam_periph_release_locked(periph); cam_periph_unlock(periph); - cam_periph_release(periph); return (0); } @@ -1395,7 +1429,8 @@ cdstrategy(struct bio *bp) } cam_periph_lock(periph); - CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("entering cdstrategy\n")); + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, + ("cdstrategy(%p)\n", bp)); softc = (struct cd_softc *)periph->softc; @@ -1481,8 +1516,9 @@ cdstart(struct cam_periph *periph, union ccb *start_ccb) bp->bio_bcount / softc->params.blksize, /* data_ptr */ bp->bio_data, /* dxfer_len */ bp->bio_bcount, - /* sense_len */ SSD_FULL_SIZE, - /* timeout */ 30000); + /* sense_len */ cd_retry_count ? + SSD_FULL_SIZE : SF_NO_PRINT, + /* timeout */ cd_timeout); /* Use READ CD command for audio tracks. */ if (softc->params.blksize == 2352) { start_ccb->csio.cdb_io.cdb_bytes[0] = READ_CD; @@ -1668,7 +1704,6 @@ cddone(struct cam_periph *periph, union ccb *done_ccb) return; } else if (error != 0) { - struct scsi_sense_data *sense; int asc, ascq; int sense_key, error_code; int have_sense; @@ -1691,20 +1726,12 @@ cddone(struct cam_periph *periph, union ccb *done_ccb) cgd.ccb_h.func_code = XPT_GDEV_TYPE; xpt_action((union ccb *)&cgd); - if (((csio->ccb_h.flags & CAM_SENSE_PHYS) != 0) - || ((csio->ccb_h.flags & CAM_SENSE_PTR) != 0) - || ((status & CAM_AUTOSNS_VALID) == 0)) - have_sense = FALSE; - else + if (scsi_extract_sense_ccb(done_ccb, + &error_code, &sense_key, &asc, &ascq)) have_sense = TRUE; + else + have_sense = FALSE; - if (have_sense) { - sense = &csio->sense_data; - scsi_extract_sense_len(sense, - csio->sense_len - csio->sense_resid, - &error_code, &sense_key, &asc, - &ascq, /*show_errors*/ 1); - } /* * Attach to anything that claims to be a * CDROM or WORM device, as long as it @@ -1861,12 +1888,11 @@ cdioctl(struct disk *dp, u_long cmd, void *addr, int flag, struct thread *td) return(ENXIO); cam_periph_lock(periph); - CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("entering cdioctl\n")); softc = (struct cd_softc *)periph->softc; - CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, - ("trying to do ioctl %#lx\n", cmd)); + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, + ("cdioctl(%#lx)\n", cmd)); if ((error = cam_periph_hold(periph, PRIBIO | PCATCH)) != 0) { cam_periph_unlock(periph); @@ -3131,7 +3157,7 @@ cderror(union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags) { struct cd_softc *softc; struct cam_periph *periph; - int error; + int error, error_code, sense_key, asc, ascq; periph = xpt_path_periph(ccb->ccb_h.path); softc = (struct cd_softc *)periph->softc; @@ -3145,19 +3171,10 @@ cderror(union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags) */ if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INVALID) { error = cd6byteworkaround(ccb); - } else if (((ccb->ccb_h.status & CAM_STATUS_MASK) == - CAM_SCSI_STATUS_ERROR) - && (ccb->ccb_h.status & CAM_AUTOSNS_VALID) - && (ccb->csio.scsi_status == SCSI_STATUS_CHECK_COND) - && ((ccb->ccb_h.flags & CAM_SENSE_PHYS) == 0) - && ((ccb->ccb_h.flags & CAM_SENSE_PTR) == 0)) { - int sense_key, error_code, asc, ascq; - - scsi_extract_sense_len(&ccb->csio.sense_data, - ccb->csio.sense_len - ccb->csio.sense_resid, &error_code, - &sense_key, &asc, &ascq, /*show_errors*/ 1); + } else if (scsi_extract_sense_ccb(ccb, + &error_code, &sense_key, &asc, &ascq)) { if (sense_key == SSD_KEY_ILLEGAL_REQUEST) - error = cd6byteworkaround(ccb); + error = cd6byteworkaround(ccb); } if (error == ERESTART) diff --git a/sys/cam/scsi/scsi_ch.c b/sys/cam/scsi/scsi_ch.c index 8b04b4ffc14..11ecb32b5c5 100644 --- a/sys/cam/scsi/scsi_ch.c +++ b/sys/cam/scsi/scsi_ch.c @@ -107,8 +107,7 @@ static const u_int32_t CH_TIMEOUT_SEND_VOLTAG = 10000; static const u_int32_t CH_TIMEOUT_INITIALIZE_ELEMENT_STATUS = 500000; typedef enum { - CH_FLAG_INVALID = 0x001, - CH_FLAG_OPEN = 0x002 + CH_FLAG_INVALID = 0x001 } ch_flags; typedef enum { @@ -211,7 +210,7 @@ PERIPHDRIVER_DECLARE(ch, chdriver); static struct cdevsw ch_cdevsw = { .d_version = D_VERSION, - .d_flags = 0, + .d_flags = D_TRACKCLOSE, .d_open = chopen, .d_close = chclose, .d_ioctl = chioctl, @@ -404,16 +403,11 @@ chopen(struct cdev *dev, int flags, int fmt, struct thread *td) cam_periph_lock(periph); if (softc->flags & CH_FLAG_INVALID) { + cam_periph_release_locked(periph); cam_periph_unlock(periph); - cam_periph_release(periph); return(ENXIO); } - if ((softc->flags & CH_FLAG_OPEN) == 0) - softc->flags |= CH_FLAG_OPEN; - else - cam_periph_release(periph); - if ((error = cam_periph_hold(periph, PRIBIO | PCATCH)) != 0) { cam_periph_unlock(periph); cam_periph_release(periph); @@ -424,9 +418,8 @@ chopen(struct cdev *dev, int flags, int fmt, struct thread *td) * Load information about this changer device into the softc. */ if ((error = chgetparams(periph)) != 0) { - softc->flags &= ~CH_FLAG_OPEN; + cam_periph_release_locked(periph); cam_periph_unlock(periph); - cam_periph_release(periph); return(error); } @@ -440,22 +433,11 @@ static int chclose(struct cdev *dev, int flag, int fmt, struct thread *td) { struct cam_periph *periph; - struct ch_softc *softc; - int error; - - error = 0; periph = (struct cam_periph *)dev->si_drv1; if (periph == NULL) return(ENXIO); - softc = (struct ch_softc *)periph->softc; - - cam_periph_lock(periph); - - softc->flags &= ~CH_FLAG_OPEN; - - cam_periph_unlock(periph); cam_periph_release(periph); return(0); diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c index 5eb0458f609..e842af64833 100644 --- a/sys/cam/scsi/scsi_da.c +++ b/sys/cam/scsi/scsi_da.c @@ -77,7 +77,6 @@ typedef enum { DA_FLAG_NEW_PACK = 0x002, DA_FLAG_PACK_LOCKED = 0x004, DA_FLAG_PACK_REMOVABLE = 0x008, - DA_FLAG_TAGGED_QUEUING = 0x010, DA_FLAG_NEED_OTAG = 0x020, DA_FLAG_WENT_IDLE = 0x040, DA_FLAG_RETRY_UA = 0x080, @@ -811,6 +810,27 @@ static struct da_quirk_entry da_quirk_table[] = { T_DIRECT, SIP_MEDIA_FIXED, "WDC WD??", "???PVT*", "*" }, /*quirks*/DA_Q_4K }, + { + /* + * Olympus FE-210 camera + */ + {T_DIRECT, SIP_MEDIA_REMOVABLE, "OLYMPUS", "FE210*", + "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + }, + { + /* + * LG UP3S MP3 player + */ + {T_DIRECT, SIP_MEDIA_REMOVABLE, "LG", "UP3S", + "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + }, + { + /* + * Laser MP3-2GA13 MP3 player + */ + {T_DIRECT, SIP_MEDIA_REMOVABLE, "USB 2.0", "(HS) Flash Disk", + "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + }, }; static disk_strategy_t dastrategy; @@ -921,9 +941,8 @@ daopen(struct disk *dp) softc = (struct da_softc *)periph->softc; softc->flags |= DA_FLAG_OPEN; - CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, - ("daopen: disk=%s%d (unit %d)\n", dp->d_name, dp->d_unit, - unit)); + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH, + ("daopen\n")); if ((softc->flags & DA_FLAG_PACK_INVALID) != 0) { /* Invalidate our pack information. */ @@ -963,14 +982,13 @@ daclose(struct disk *dp) { struct cam_periph *periph; struct da_softc *softc; - int error; periph = (struct cam_periph *)dp->d_drv1; if (periph == NULL) return (0); cam_periph_lock(periph); - if ((error = cam_periph_hold(periph, PRIBIO)) != 0) { + if (cam_periph_hold(periph, PRIBIO) != 0) { cam_periph_unlock(periph); cam_periph_release(periph); return (0); @@ -978,6 +996,9 @@ daclose(struct disk *dp) softc = (struct da_softc *)periph->softc; + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH, + ("daclose\n")); + if ((softc->quirks & DA_Q_NO_SYNC_CACHE) == 0 && (softc->flags & DA_FLAG_PACK_INVALID) == 0) { union ccb *ccb; @@ -993,30 +1014,9 @@ daclose(struct disk *dp) SSD_FULL_SIZE, 5 * 60 * 1000); - cam_periph_runccb(ccb, /*error_routine*/NULL, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA, + cam_periph_runccb(ccb, daerror, /*cam_flags*/0, + /*sense_flags*/SF_RETRY_UA | SF_QUIET_IR, softc->disk->d_devstat); - - if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { - if ((ccb->ccb_h.status & CAM_STATUS_MASK) == - CAM_SCSI_STATUS_ERROR) { - int asc, ascq; - int sense_key, error_code; - - scsi_extract_sense_len(&ccb->csio.sense_data, - ccb->csio.sense_len - ccb->csio.sense_resid, - &error_code, &sense_key, &asc, &ascq, - /*show_errors*/ 1); - if (sense_key != SSD_KEY_ILLEGAL_REQUEST) - scsi_sense_print(&ccb->csio); - } else { - xpt_print(periph->path, "Synchronize cache " - "failed, status == 0x%x, scsi status == " - "0x%x\n", ccb->csio.ccb_h.status, - ccb->csio.scsi_status); - } - } - xpt_release_ccb(ccb); } @@ -1087,7 +1087,9 @@ dastrategy(struct bio *bp) biofinish(bp, NULL, ENXIO); return; } - + + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dastrategy(%p)\n", bp)); + /* * Place it in the queue of disk activities for this disk */ @@ -1116,6 +1118,7 @@ dadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t leng u_int secsize; struct ccb_scsiio csio; struct disk *dp; + int error = 0; dp = arg; periph = dp->d_drv1; @@ -1134,7 +1137,7 @@ dadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t leng xpt_setup_ccb(&csio.ccb_h, periph->path, CAM_PRIORITY_NORMAL); csio.ccb_h.ccb_state = DA_CCB_DUMP; scsi_read_write(&csio, - /*retries*/1, + /*retries*/0, dadone, MSG_ORDERED_Q_TAG, /*read*/FALSE, @@ -1147,19 +1150,16 @@ dadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t leng /*sense_len*/SSD_FULL_SIZE, da_default_timeout * 1000); xpt_polled_action((union ccb *)&csio); - cam_periph_unlock(periph); - if ((csio.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { + error = cam_periph_error((union ccb *)&csio, + 0, SF_NO_RECOVERY | SF_NO_RETRY, NULL); + if ((csio.ccb_h.status & CAM_DEV_QFRZN) != 0) + cam_release_devq(csio.ccb_h.path, /*relsim_flags*/0, + /*reduction*/0, /*timeout*/0, /*getcount_only*/0); + if (error != 0) printf("Aborting dump due to I/O error.\n"); - if ((csio.ccb_h.status & CAM_STATUS_MASK) == - CAM_SCSI_STATUS_ERROR) - scsi_sense_print(&csio); - else - printf("status == 0x%x, scsi status == 0x%x\n", - csio.ccb_h.status, csio.scsi_status); - return(EIO); - } - return(0); + cam_periph_unlock(periph); + return (error); } /* @@ -1170,7 +1170,7 @@ dadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t leng xpt_setup_ccb(&csio.ccb_h, periph->path, CAM_PRIORITY_NORMAL); csio.ccb_h.ccb_state = DA_CCB_DUMP; scsi_synchronize_cache(&csio, - /*retries*/1, + /*retries*/0, /*cbfcnp*/dadone, MSG_SIMPLE_Q_TAG, /*begin_lba*/0,/* Cover the whole disk */ @@ -1179,28 +1179,16 @@ dadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t leng 5 * 60 * 1000); xpt_polled_action((union ccb *)&csio); - if ((csio.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { - if ((csio.ccb_h.status & CAM_STATUS_MASK) == - CAM_SCSI_STATUS_ERROR) { - int asc, ascq; - int sense_key, error_code; - - scsi_extract_sense_len(&csio.sense_data, - csio.sense_len - csio.sense_resid, - &error_code, &sense_key, &asc, &ascq, - /*show_errors*/ 1); - if (sense_key != SSD_KEY_ILLEGAL_REQUEST) - scsi_sense_print(&csio); - } else { - xpt_print(periph->path, "Synchronize cache " - "failed, status == 0x%x, scsi status == " - "0x%x\n", csio.ccb_h.status, - csio.scsi_status); - } - } + error = cam_periph_error((union ccb *)&csio, + 0, SF_NO_RECOVERY | SF_NO_RETRY | SF_QUIET_IR, NULL); + if ((csio.ccb_h.status & CAM_DEV_QFRZN) != 0) + cam_release_devq(csio.ccb_h.path, /*relsim_flags*/0, + /*reduction*/0, /*timeout*/0, /*getcount_only*/0); + if (error != 0) + xpt_print(periph->path, "Synchronize cache failed\n"); } cam_periph_unlock(periph); - return (0); + return (error); } static int @@ -1245,6 +1233,20 @@ dainit(void) } } +/* + * Callback from GEOM, called when it has finished cleaning up its + * resources. + */ +static void +dadiskgonecb(struct disk *dp) +{ + struct cam_periph *periph; + + periph = (struct cam_periph *)dp->d_drv1; + + cam_periph_release(periph); +} + static void daoninvalidate(struct cam_periph *periph) { @@ -1267,7 +1269,12 @@ daoninvalidate(struct cam_periph *periph) bioq_flush(&softc->bio_queue, NULL, ENXIO); bioq_flush(&softc->delete_queue, NULL, ENXIO); + /* + * Tell GEOM that we've gone away, we'll get a callback when it is + * done cleaning up its resources. + */ disk_gone(softc->disk); + xpt_print(periph->path, "lost device - %d outstanding, %d refs\n", softc->outstanding_cmds, periph->refcount); } @@ -1550,8 +1557,6 @@ daregister(struct cam_periph *periph, void *arg) bioq_init(&softc->delete_run_queue); if (SID_IS_REMOVABLE(&cgd->inq_data)) softc->flags |= DA_FLAG_PACK_REMOVABLE; - if ((cgd->inq_data.flags & SID_CmdQue) != 0) - softc->flags |= DA_FLAG_TAGGED_QUEUING; softc->unmap_max_ranges = UNMAP_MAX_RANGES; softc->unmap_max_lba = 1024*1024*2; @@ -1647,6 +1652,7 @@ daregister(struct cam_periph *periph, void *arg) softc->disk->d_strategy = dastrategy; softc->disk->d_dump = dadump; softc->disk->d_getattr = dagetattr; + softc->disk->d_gone = dadiskgonecb; softc->disk->d_name = "da"; softc->disk->d_drv1 = periph; if (cpi.maxio == 0) @@ -1669,6 +1675,19 @@ daregister(struct cam_periph *periph, void *arg) softc->disk->d_hba_device = cpi.hba_device; softc->disk->d_hba_subvendor = cpi.hba_subvendor; softc->disk->d_hba_subdevice = cpi.hba_subdevice; + + /* + * Acquire a reference to the periph before we register with GEOM. + * We'll release this reference once GEOM calls us back (via + * dadiskgonecb()) telling us that our provider has been freed. + */ + if (cam_periph_acquire(periph) != CAM_REQ_CMP) { + xpt_print(periph->path, "%s: lost periph during " + "registration!\n", __func__); + mtx_lock(periph->sim->mtx); + return (CAM_REQ_CMP_ERR); + } + disk_create(softc->disk, DISK_VERSION); mtx_lock(periph->sim->mtx); @@ -1703,6 +1722,8 @@ dastart(struct cam_periph *periph, union ccb *start_ccb) softc = (struct da_softc *)periph->softc; + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dastart\n")); + switch (softc->state) { case DA_STATE_NORMAL: { @@ -1711,7 +1732,7 @@ dastart(struct cam_periph *periph, union ccb *start_ccb) /* Execute immediate CCB if waiting. */ if (periph->immediate_priority <= periph->pinfo.priority) { - CAM_DEBUG_PRINT(CAM_DEBUG_SUBTRACE, + CAM_DEBUG(periph->path, CAM_DEBUG_SUBTRACE, ("queuing for immediate ccb\n")); start_ccb->ccb_h.ccb_state = DA_CCB_WAITING; SLIST_INSERT_HEAD(&periph->ccb_list, &start_ccb->ccb_h, @@ -2043,6 +2064,9 @@ dadone(struct cam_periph *periph, union ccb *done_ccb) softc = (struct da_softc *)periph->softc; priority = done_ccb->ccb_h.pinfo.priority; + + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone\n")); + csio = &done_ccb->csio; switch (csio->ccb_h.ccb_state & DA_CCB_TYPE_MASK) { case DA_CCB_BUFFER_IO: @@ -2263,7 +2287,6 @@ dadone(struct cam_periph *periph, union ccb *done_ccb) */ return; } else if (error != 0) { - struct scsi_sense_data *sense; int asc, ascq; int sense_key, error_code; int have_sense; @@ -2286,20 +2309,12 @@ dadone(struct cam_periph *periph, union ccb *done_ccb) cgd.ccb_h.func_code = XPT_GDEV_TYPE; xpt_action((union ccb *)&cgd); - if (((csio->ccb_h.flags & CAM_SENSE_PHYS) != 0) - || ((csio->ccb_h.flags & CAM_SENSE_PTR) != 0) - || ((status & CAM_AUTOSNS_VALID) == 0)) - have_sense = FALSE; - else + if (scsi_extract_sense_ccb(done_ccb, + &error_code, &sense_key, &asc, &ascq)) have_sense = TRUE; + else + have_sense = FALSE; - if (have_sense) { - sense = &csio->sense_data; - scsi_extract_sense_len(sense, - csio->sense_len - csio->sense_resid, - &error_code, &sense_key, &asc, - &ascq, /*show_errors*/ 1); - } /* * If we tried READ CAPACITY(16) and failed, * fallback to READ CAPACITY(10). @@ -2437,7 +2452,7 @@ daerror(union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags) { struct da_softc *softc; struct cam_periph *periph; - int error; + int error, error_code, sense_key, asc, ascq; periph = xpt_path_periph(ccb->ccb_h.path); softc = (struct da_softc *)periph->softc; @@ -2449,16 +2464,8 @@ daerror(union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags) error = 0; if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INVALID) { error = cmd6workaround(ccb); - } else if (((ccb->ccb_h.status & CAM_STATUS_MASK) == - CAM_SCSI_STATUS_ERROR) - && (ccb->ccb_h.status & CAM_AUTOSNS_VALID) - && (ccb->csio.scsi_status == SCSI_STATUS_CHECK_COND) - && ((ccb->ccb_h.flags & CAM_SENSE_PHYS) == 0) - && ((ccb->ccb_h.flags & CAM_SENSE_PTR) == 0)) { - int sense_key, error_code, asc, ascq; - - scsi_extract_sense(&ccb->csio.sense_data, - &error_code, &sense_key, &asc, &ascq); + } else if (scsi_extract_sense_ccb(ccb, + &error_code, &sense_key, &asc, &ascq)) { if (sense_key == SSD_KEY_ILLEGAL_REQUEST) error = cmd6workaround(ccb); /* @@ -2511,8 +2518,8 @@ daprevent(struct cam_periph *periph, int action) SSD_FULL_SIZE, 5000); - error = cam_periph_runccb(ccb, /*error_routine*/NULL, CAM_RETRY_SELTO, - SF_RETRY_UA, softc->disk->d_devstat); + error = cam_periph_runccb(ccb, daerror, CAM_RETRY_SELTO, + SF_RETRY_UA | SF_QUIET_IR, softc->disk->d_devstat); if (error == 0) { if (action == PR_ALLOW) @@ -2637,6 +2644,8 @@ dasetgeom(struct cam_periph *periph, uint32_t block_len, uint64_t maxsector, softc->disk->d_flags |= DISKFLAG_CANDELETE; else softc->disk->d_flags &= ~DISKFLAG_CANDELETE; + + disk_resize(softc->disk); } static void @@ -2669,6 +2678,7 @@ dashutdown(void * arg, int howto) { struct cam_periph *periph; struct da_softc *softc; + int error; TAILQ_FOREACH(periph, &dadriver.units, unit_links) { union ccb ccb; @@ -2690,7 +2700,7 @@ dashutdown(void * arg, int howto) ccb.ccb_h.ccb_state = DA_CCB_DUMP; scsi_synchronize_cache(&ccb.csio, - /*retries*/1, + /*retries*/0, /*cbfcnp*/dadone, MSG_SIMPLE_Q_TAG, /*begin_lba*/0, /* whole disk */ @@ -2700,32 +2710,13 @@ dashutdown(void * arg, int howto) xpt_polled_action(&ccb); - if ((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { - if (((ccb.ccb_h.status & CAM_STATUS_MASK) == - CAM_SCSI_STATUS_ERROR) - && (ccb.csio.scsi_status == SCSI_STATUS_CHECK_COND)){ - int error_code, sense_key, asc, ascq; - - scsi_extract_sense(&ccb.csio.sense_data, - &error_code, &sense_key, - &asc, &ascq); - - if (sense_key != SSD_KEY_ILLEGAL_REQUEST) - scsi_sense_print(&ccb.csio); - } else { - xpt_print(periph->path, "Synchronize " - "cache failed, status == 0x%x, scsi status " - "== 0x%x\n", ccb.ccb_h.status, - ccb.csio.scsi_status); - } - } - + error = cam_periph_error(&ccb, + 0, SF_NO_RECOVERY | SF_NO_RETRY | SF_QUIET_IR, NULL); if ((ccb.ccb_h.status & CAM_DEV_QFRZN) != 0) - cam_release_devq(ccb.ccb_h.path, - /*relsim_flags*/0, - /*reduction*/0, - /*timeout*/0, - /*getcount_only*/0); + cam_release_devq(ccb.ccb_h.path, /*relsim_flags*/0, + /*reduction*/0, /*timeout*/0, /*getcount_only*/0); + if (error != 0) + xpt_print(periph->path, "Synchronize cache failed\n"); cam_periph_unlock(periph); } } diff --git a/sys/cam/scsi/scsi_da.h b/sys/cam/scsi/scsi_da.h index 7605b1aa512..5799238196a 100644 --- a/sys/cam/scsi/scsi_da.h +++ b/sys/cam/scsi/scsi_da.h @@ -111,6 +111,7 @@ struct scsi_read_defect_data_10 u_int8_t reserved[4]; u_int8_t alloc_length[2]; +#define SRDD10_MAX_LENGTH 0xffff u_int8_t control; }; diff --git a/sys/cam/scsi/scsi_enc.c b/sys/cam/scsi/scsi_enc.c new file mode 100644 index 00000000000..fe2ec81deb8 --- /dev/null +++ b/sys/cam/scsi/scsi_enc.c @@ -0,0 +1,1023 @@ +/*- + * Copyright (c) 2000 Matthew Jacob + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification, immediately at the beginning of the file. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +MALLOC_DEFINE(M_SCSIENC, "SCSI ENC", "SCSI ENC buffers"); + +/* Enclosure type independent driver */ + +#define SEN_ID "UNISYS SUN_SEN" +#define SEN_ID_LEN 24 + +static d_open_t enc_open; +static d_close_t enc_close; +static d_ioctl_t enc_ioctl; +static periph_init_t enc_init; +static periph_ctor_t enc_ctor; +static periph_oninv_t enc_oninvalidate; +static periph_dtor_t enc_dtor; +static periph_start_t enc_start; + +static void enc_async(void *, uint32_t, struct cam_path *, void *); +static enctyp enc_type(struct ccb_getdev *); + +SYSCTL_NODE(_kern_cam, OID_AUTO, enc, CTLFLAG_RD, 0, + "CAM Enclosure Services driver"); + +static struct periph_driver encdriver = { + enc_init, "ses", + TAILQ_HEAD_INITIALIZER(encdriver.units), /* generation */ 0 +}; + +PERIPHDRIVER_DECLARE(enc, encdriver); + +static struct cdevsw enc_cdevsw = { + .d_version = D_VERSION, + .d_open = enc_open, + .d_close = enc_close, + .d_ioctl = enc_ioctl, + .d_name = "ses", + .d_flags = D_TRACKCLOSE, +}; + +static void +enc_init(void) +{ + cam_status status; + + /* + * Install a global async callback. This callback will + * receive async callbacks like "new device found". + */ + status = xpt_register_async(AC_FOUND_DEVICE, enc_async, NULL, NULL); + + if (status != CAM_REQ_CMP) { + printf("enc: Failed to attach master async callback " + "due to status 0x%x!\n", status); + } +} + +static void +enc_devgonecb(void *arg) +{ + struct cam_periph *periph; + + periph = (struct cam_periph *)arg; + + cam_periph_release(periph); +} + +static void +enc_oninvalidate(struct cam_periph *periph) +{ + struct enc_softc *enc; + + enc = periph->softc; + + enc->enc_flags |= ENC_FLAG_INVALID; + + /* If the sub-driver has an invalidate routine, call it */ + if (enc->enc_vec.softc_invalidate != NULL) + enc->enc_vec.softc_invalidate(enc); + + /* + * Unregister any async callbacks. + */ + xpt_register_async(0, enc_async, periph, periph->path); + + /* + * Shutdown our daemon. + */ + enc->enc_flags |= ENC_FLAG_SHUTDOWN; + if (enc->enc_daemon != NULL) { + /* Signal the ses daemon to terminate. */ + wakeup(enc->enc_daemon); + } + callout_drain(&enc->status_updater); + + destroy_dev_sched_cb(enc->enc_dev, enc_devgonecb, periph); + + xpt_print(periph->path, "lost device\n"); +} + +static void +enc_dtor(struct cam_periph *periph) +{ + struct enc_softc *enc; + + enc = periph->softc; + + xpt_print(periph->path, "removing device entry\n"); + + + /* If the sub-driver has a cleanup routine, call it */ + if (enc->enc_vec.softc_cleanup != NULL) + enc->enc_vec.softc_cleanup(enc); + + if (enc->enc_boot_hold_ch.ich_func != NULL) { + config_intrhook_disestablish(&enc->enc_boot_hold_ch); + enc->enc_boot_hold_ch.ich_func = NULL; + } + + ENC_FREE(enc); +} + +static void +enc_async(void *callback_arg, uint32_t code, struct cam_path *path, void *arg) +{ + struct cam_periph *periph; + + periph = (struct cam_periph *)callback_arg; + + switch(code) { + case AC_FOUND_DEVICE: + { + struct ccb_getdev *cgd; + cam_status status; + path_id_t path_id; + + cgd = (struct ccb_getdev *)arg; + if (arg == NULL) { + break; + } + + if (enc_type(cgd) == ENC_NONE) { + /* + * Schedule announcement of the ENC bindings for + * this device if it is managed by a SEP. + */ + path_id = xpt_path_path_id(path); + xpt_lock_buses(); + TAILQ_FOREACH(periph, &encdriver.units, unit_links) { + struct enc_softc *softc; + + softc = (struct enc_softc *)periph->softc; + if (xpt_path_path_id(periph->path) != path_id + || softc == NULL + || (softc->enc_flags & ENC_FLAG_INITIALIZED) + == 0 + || softc->enc_vec.device_found == NULL) + continue; + + softc->enc_vec.device_found(softc); + } + xpt_unlock_buses(); + return; + } + + status = cam_periph_alloc(enc_ctor, enc_oninvalidate, + enc_dtor, enc_start, "ses", CAM_PERIPH_BIO, + cgd->ccb_h.path, enc_async, AC_FOUND_DEVICE, cgd); + + if (status != CAM_REQ_CMP && status != CAM_REQ_INPROG) { + printf("enc_async: Unable to probe new device due to " + "status 0x%x\n", status); + } + break; + } + default: + cam_periph_async(periph, code, path, arg); + break; + } +} + +static int +enc_open(struct cdev *dev, int flags, int fmt, struct thread *td) +{ + struct cam_periph *periph; + struct enc_softc *softc; + int error = 0; + + periph = (struct cam_periph *)dev->si_drv1; + if (periph == NULL) { + return (ENXIO); + } + + if (cam_periph_acquire(periph) != CAM_REQ_CMP) + return (ENXIO); + + cam_periph_lock(periph); + + softc = (struct enc_softc *)periph->softc; + + if ((softc->enc_flags & ENC_FLAG_INITIALIZED) == 0) { + error = ENXIO; + goto out; + } + if (softc->enc_flags & ENC_FLAG_INVALID) { + error = ENXIO; + goto out; + } +out: + if (error != 0) + cam_periph_release_locked(periph); + + cam_periph_unlock(periph); + + return (error); +} + +static int +enc_close(struct cdev *dev, int flag, int fmt, struct thread *td) +{ + struct cam_periph *periph; + + periph = (struct cam_periph *)dev->si_drv1; + if (periph == NULL) + return (ENXIO); + + cam_periph_release(periph); + + return (0); +} + +static void +enc_start(struct cam_periph *p, union ccb *sccb) +{ + struct enc_softc *enc; + + enc = p->softc; + ENC_DLOG(enc, "%s enter imm=%d prio=%d\n", + __func__, p->immediate_priority, p->pinfo.priority); + if (p->immediate_priority <= p->pinfo.priority) { + SLIST_INSERT_HEAD(&p->ccb_list, &sccb->ccb_h, periph_links.sle); + p->immediate_priority = CAM_PRIORITY_NONE; + wakeup(&p->ccb_list); + } else + xpt_release_ccb(sccb); + ENC_DLOG(enc, "%s exit\n", __func__); +} + +void +enc_done(struct cam_periph *periph, union ccb *dccb) +{ + wakeup(&dccb->ccb_h.cbfcnp); +} + +int +enc_error(union ccb *ccb, uint32_t cflags, uint32_t sflags) +{ + struct enc_softc *softc; + struct cam_periph *periph; + + periph = xpt_path_periph(ccb->ccb_h.path); + softc = (struct enc_softc *)periph->softc; + + return (cam_periph_error(ccb, cflags, sflags, &softc->saved_ccb)); +} + +static int +enc_ioctl(struct cdev *dev, u_long cmd, caddr_t arg_addr, int flag, + struct thread *td) +{ + struct cam_periph *periph; + encioc_enc_status_t tmp; + encioc_string_t sstr; + encioc_elm_status_t elms; + encioc_elm_desc_t elmd; + encioc_elm_devnames_t elmdn; + encioc_element_t *uelm; + enc_softc_t *enc; + enc_cache_t *cache; + void *addr; + int error, i; + + + if (arg_addr) + addr = *((caddr_t *) arg_addr); + else + addr = NULL; + + periph = (struct cam_periph *)dev->si_drv1; + if (periph == NULL) + return (ENXIO); + + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("entering encioctl\n")); + + cam_periph_lock(periph); + enc = (struct enc_softc *)periph->softc; + cache = &enc->enc_cache; + + /* + * Now check to see whether we're initialized or not. + * This actually should never fail as we're not supposed + * to get past enc_open w/o successfully initializing + * things. + */ + if ((enc->enc_flags & ENC_FLAG_INITIALIZED) == 0) { + cam_periph_unlock(periph); + return (ENXIO); + } + cam_periph_unlock(periph); + + error = 0; + + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, + ("trying to do ioctl %#lx\n", cmd)); + + /* + * If this command can change the device's state, + * we must have the device open for writing. + * + * For commands that get information about the + * device- we don't need to lock the peripheral + * if we aren't running a command. The periph + * also can't go away while a user process has + * it open. + */ + switch (cmd) { + case ENCIOC_GETNELM: + case ENCIOC_GETELMMAP: + case ENCIOC_GETENCSTAT: + case ENCIOC_GETELMSTAT: + case ENCIOC_GETELMDESC: + case ENCIOC_GETELMDEVNAMES: + break; + default: + if ((flag & FWRITE) == 0) { + return (EBADF); + } + } + + /* + * XXX The values read here are only valid for the current + * configuration generation. We need these ioctls + * to also pass in/out a generation number. + */ + sx_slock(&enc->enc_cache_lock); + switch (cmd) { + case ENCIOC_GETNELM: + error = copyout(&cache->nelms, addr, sizeof (cache->nelms)); + break; + + case ENCIOC_GETELMMAP: + for (uelm = addr, i = 0; i != cache->nelms; i++) { + encioc_element_t kelm; + kelm.elm_idx = i; + kelm.elm_subenc_id = cache->elm_map[i].subenclosure; + kelm.elm_type = cache->elm_map[i].enctype; + error = copyout(&kelm, &uelm[i], sizeof(kelm)); + if (error) + break; + } + break; + + case ENCIOC_GETENCSTAT: + cam_periph_lock(periph); + error = enc->enc_vec.get_enc_status(enc, 1); + if (error) { + cam_periph_unlock(periph); + break; + } + tmp = cache->enc_status; + cam_periph_unlock(periph); + error = copyout(&tmp, addr, sizeof(tmp)); + cache->enc_status = tmp; + break; + + case ENCIOC_SETENCSTAT: + error = copyin(addr, &tmp, sizeof(tmp)); + if (error) + break; + cam_periph_lock(periph); + error = enc->enc_vec.set_enc_status(enc, tmp, 1); + cam_periph_unlock(periph); + break; + + case ENCIOC_GETSTRING: + case ENCIOC_SETSTRING: + if (enc->enc_vec.handle_string == NULL) { + error = EINVAL; + break; + } + error = copyin(addr, &sstr, sizeof(sstr)); + if (error) + break; + cam_periph_lock(periph); + error = enc->enc_vec.handle_string(enc, &sstr, cmd); + cam_periph_unlock(periph); + break; + + case ENCIOC_GETELMSTAT: + error = copyin(addr, &elms, sizeof(elms)); + if (error) + break; + if (elms.elm_idx >= cache->nelms) { + error = EINVAL; + break; + } + cam_periph_lock(periph); + error = enc->enc_vec.get_elm_status(enc, &elms, 1); + cam_periph_unlock(periph); + if (error) + break; + error = copyout(&elms, addr, sizeof(elms)); + break; + + case ENCIOC_GETELMDESC: + error = copyin(addr, &elmd, sizeof(elmd)); + if (error) + break; + if (elmd.elm_idx >= cache->nelms) { + error = EINVAL; + break; + } + if (enc->enc_vec.get_elm_desc != NULL) { + error = enc->enc_vec.get_elm_desc(enc, &elmd); + if (error) + break; + } else + elmd.elm_desc_len = 0; + error = copyout(&elmd, addr, sizeof(elmd)); + break; + + case ENCIOC_GETELMDEVNAMES: + if (enc->enc_vec.get_elm_devnames == NULL) { + error = EINVAL; + break; + } + error = copyin(addr, &elmdn, sizeof(elmdn)); + if (error) + break; + if (elmdn.elm_idx >= cache->nelms) { + error = EINVAL; + break; + } + cam_periph_lock(periph); + error = (*enc->enc_vec.get_elm_devnames)(enc, &elmdn); + cam_periph_unlock(periph); + if (error) + break; + error = copyout(&elmdn, addr, sizeof(elmdn)); + break; + + case ENCIOC_SETELMSTAT: + error = copyin(addr, &elms, sizeof(elms)); + if (error) + break; + + if (elms.elm_idx >= cache->nelms) { + error = EINVAL; + break; + } + cam_periph_lock(periph); + error = enc->enc_vec.set_elm_status(enc, &elms, 1); + cam_periph_unlock(periph); + + break; + + case ENCIOC_INIT: + + cam_periph_lock(periph); + error = enc->enc_vec.init_enc(enc); + cam_periph_unlock(periph); + break; + + default: + cam_periph_lock(periph); + error = cam_periph_ioctl(periph, cmd, arg_addr, enc_error); + cam_periph_unlock(periph); + break; + } + sx_sunlock(&enc->enc_cache_lock); + return (error); +} + +int +enc_runcmd(struct enc_softc *enc, char *cdb, int cdbl, char *dptr, int *dlenp) +{ + int error, dlen, tdlen; + ccb_flags ddf; + union ccb *ccb; + + CAM_DEBUG(enc->periph->path, CAM_DEBUG_TRACE, + ("entering enc_runcmd\n")); + if (dptr) { + if ((dlen = *dlenp) < 0) { + dlen = -dlen; + ddf = CAM_DIR_OUT; + } else { + ddf = CAM_DIR_IN; + } + } else { + dlen = 0; + ddf = CAM_DIR_NONE; + } + + if (cdbl > IOCDBLEN) { + cdbl = IOCDBLEN; + } + + ccb = cam_periph_getccb(enc->periph, 1); + if (enc->enc_type == ENC_SEMB_SES || enc->enc_type == ENC_SEMB_SAFT) { + tdlen = min(dlen, 1020); + tdlen = (tdlen + 3) & ~3; + cam_fill_ataio(&ccb->ataio, 0, enc_done, ddf, 0, dptr, tdlen, + 30 * 1000); + if (cdb[0] == RECEIVE_DIAGNOSTIC) + ata_28bit_cmd(&ccb->ataio, + ATA_SEP_ATTN, cdb[2], 0x02, tdlen / 4); + else if (cdb[0] == SEND_DIAGNOSTIC) + ata_28bit_cmd(&ccb->ataio, + ATA_SEP_ATTN, dlen > 0 ? dptr[0] : 0, + 0x82, tdlen / 4); + else if (cdb[0] == READ_BUFFER) + ata_28bit_cmd(&ccb->ataio, + ATA_SEP_ATTN, cdb[2], 0x00, tdlen / 4); + else + ata_28bit_cmd(&ccb->ataio, + ATA_SEP_ATTN, dlen > 0 ? dptr[0] : 0, + 0x80, tdlen / 4); + } else { + tdlen = dlen; + cam_fill_csio(&ccb->csio, 0, enc_done, ddf, MSG_SIMPLE_Q_TAG, + dptr, dlen, sizeof (struct scsi_sense_data), cdbl, + 60 * 1000); + bcopy(cdb, ccb->csio.cdb_io.cdb_bytes, cdbl); + } + + error = cam_periph_runccb(ccb, enc_error, ENC_CFLAGS, ENC_FLAGS, NULL); + if (error) { + if (dptr) { + *dlenp = dlen; + } + } else { + if (dptr) { + if (ccb->ccb_h.func_code == XPT_ATA_IO) + *dlenp = ccb->ataio.resid; + else + *dlenp = ccb->csio.resid; + *dlenp += tdlen - dlen; + } + } + xpt_release_ccb(ccb); + CAM_DEBUG(enc->periph->path, CAM_DEBUG_SUBTRACE, + ("exiting enc_runcmd: *dlenp = %d\n", *dlenp)); + return (error); +} + +void +enc_log(struct enc_softc *enc, const char *fmt, ...) +{ + va_list ap; + + printf("%s%d: ", enc->periph->periph_name, enc->periph->unit_number); + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); +} + +/* + * The code after this point runs on many platforms, + * so forgive the slightly awkward and nonconforming + * appearance. + */ + +/* + * Is this a device that supports enclosure services? + * + * It's a a pretty simple ruleset- if it is device type 0x0D (13), it's + * an ENC device. If it happens to be an old UNISYS SEN device, we can + * handle that too. + */ + +#define SAFTE_START 44 +#define SAFTE_END 50 +#define SAFTE_LEN SAFTE_END-SAFTE_START + +static enctyp +enc_type(struct ccb_getdev *cgd) +{ + int buflen; + unsigned char *iqd; + + if (cgd->protocol == PROTO_SEMB) { + iqd = (unsigned char *)&cgd->ident_data; + if (STRNCMP(iqd + 43, "S-E-S", 5) == 0) + return (ENC_SEMB_SES); + else if (STRNCMP(iqd + 43, "SAF-TE", 6) == 0) + return (ENC_SEMB_SAFT); + return (ENC_NONE); + + } else if (cgd->protocol != PROTO_SCSI) + return (ENC_NONE); + + iqd = (unsigned char *)&cgd->inq_data; + buflen = min(sizeof(cgd->inq_data), + SID_ADDITIONAL_LENGTH(&cgd->inq_data)); + if (buflen < 8+SEN_ID_LEN) + return (ENC_NONE); + + if ((iqd[0] & 0x1f) == T_ENCLOSURE) { + if (STRNCMP(&iqd[8], SEN_ID, SEN_ID_LEN) == 0) { + return (ENC_SEN); + } else if ((iqd[2] & 0x7) > 2) { + return (ENC_SES); + } else { + return (ENC_SES_SCSI2); + } + return (ENC_NONE); + } + +#ifdef ENC_ENABLE_PASSTHROUGH + if ((iqd[6] & 0x40) && (iqd[2] & 0x7) >= 2) { + /* + * PassThrough Device. + */ + return (ENC_ENC_PASSTHROUGH); + } +#endif + + /* + * The comparison is short for a reason- + * some vendors were chopping it short. + */ + + if (buflen < SAFTE_END - 2) { + return (ENC_NONE); + } + + if (STRNCMP((char *)&iqd[SAFTE_START], "SAF-TE", SAFTE_LEN - 2) == 0) { + return (ENC_SAFT); + } + return (ENC_NONE); +} + +/*================== Enclosure Monitoring/Processing Daemon ==================*/ +/** + * \brief Queue an update request for a given action, if needed. + * + * \param enc SES softc to queue the request for. + * \param action Action requested. + */ +void +enc_update_request(enc_softc_t *enc, uint32_t action) +{ + if ((enc->pending_actions & (0x1 << action)) == 0) { + enc->pending_actions |= (0x1 << action); + ENC_DLOG(enc, "%s: queing requested action %d\n", + __func__, action); + if (enc->current_action == ENC_UPDATE_NONE) + wakeup(enc->enc_daemon); + } else { + ENC_DLOG(enc, "%s: ignoring requested action %d - " + "Already queued\n", __func__, action); + } +} + +/** + * \brief Invoke the handler of the highest priority pending + * state in the SES state machine. + * + * \param enc The SES instance invoking the state machine. + */ +static void +enc_fsm_step(enc_softc_t *enc) +{ + union ccb *ccb; + uint8_t *buf; + struct enc_fsm_state *cur_state; + int error; + uint32_t xfer_len; + + ENC_DLOG(enc, "%s enter %p\n", __func__, enc); + + enc->current_action = ffs(enc->pending_actions) - 1; + enc->pending_actions &= ~(0x1 << enc->current_action); + + cur_state = &enc->enc_fsm_states[enc->current_action]; + + buf = NULL; + if (cur_state->buf_size != 0) { + cam_periph_unlock(enc->periph); + buf = malloc(cur_state->buf_size, M_SCSIENC, M_WAITOK|M_ZERO); + cam_periph_lock(enc->periph); + } + + error = 0; + ccb = NULL; + if (cur_state->fill != NULL) { + ccb = cam_periph_getccb(enc->periph, CAM_PRIORITY_NORMAL); + + error = cur_state->fill(enc, cur_state, ccb, buf); + if (error != 0) + goto done; + + error = cam_periph_runccb(ccb, cur_state->error, + ENC_CFLAGS, + ENC_FLAGS|SF_QUIET_IR, NULL); + } + + if (ccb != NULL) { + if (ccb->ccb_h.func_code == XPT_ATA_IO) + xfer_len = ccb->ataio.dxfer_len - ccb->ataio.resid; + else + xfer_len = ccb->csio.dxfer_len - ccb->csio.resid; + } else + xfer_len = 0; + + cam_periph_unlock(enc->periph); + cur_state->done(enc, cur_state, ccb, &buf, error, xfer_len); + cam_periph_lock(enc->periph); + +done: + ENC_DLOG(enc, "%s exit - result %d\n", __func__, error); + ENC_FREE_AND_NULL(buf); + if (ccb != NULL) + xpt_release_ccb(ccb); +} + +/** + * \invariant Called with cam_periph mutex held. + */ +static void +enc_status_updater(void *arg) +{ + enc_softc_t *enc; + + enc = arg; + if (enc->enc_vec.poll_status != NULL) + enc->enc_vec.poll_status(enc); +} + +static void +enc_daemon(void *arg) +{ + enc_softc_t *enc; + + enc = arg; + + cam_periph_lock(enc->periph); + while ((enc->enc_flags & ENC_FLAG_SHUTDOWN) == 0) { + if (enc->pending_actions == 0) { + struct intr_config_hook *hook; + + /* + * Reset callout and msleep, or + * issue timed task completion + * status command. + */ + enc->current_action = ENC_UPDATE_NONE; + + /* + * We've been through our state machine at least + * once. Allow the transition to userland. + */ + hook = &enc->enc_boot_hold_ch; + if (hook->ich_func != NULL) { + config_intrhook_disestablish(hook); + hook->ich_func = NULL; + } + + callout_reset(&enc->status_updater, 60*hz, + enc_status_updater, enc); + + cam_periph_sleep(enc->periph, enc->enc_daemon, + PUSER, "idle", 0); + } else { + enc_fsm_step(enc); + } + } + enc->enc_daemon = NULL; + cam_periph_unlock(enc->periph); + cam_periph_release(enc->periph); + kproc_exit(0); +} + +static int +enc_kproc_init(enc_softc_t *enc) +{ + int result; + + callout_init_mtx(&enc->status_updater, enc->periph->sim->mtx, 0); + + if (cam_periph_acquire(enc->periph) != CAM_REQ_CMP) + return (ENXIO); + + result = kproc_create(enc_daemon, enc, &enc->enc_daemon, /*flags*/0, + /*stackpgs*/0, "enc_daemon%d", + enc->periph->unit_number); + if (result == 0) { + /* Do an initial load of all page data. */ + cam_periph_lock(enc->periph); + enc->enc_vec.poll_status(enc); + cam_periph_unlock(enc->periph); + } else + cam_periph_release(enc->periph); + return (result); +} + +/** + * \brief Interrupt configuration hook callback associated with + * enc_boot_hold_ch. + * + * Since interrupts are always functional at the time of enclosure + * configuration, there is nothing to be done when the callback occurs. + * This hook is only registered to hold up boot processing while initial + * eclosure processing occurs. + * + * \param arg The enclosure softc, but currently unused in this callback. + */ +static void +enc_nop_confighook_cb(void *arg __unused) +{ +} + +static cam_status +enc_ctor(struct cam_periph *periph, void *arg) +{ + cam_status status = CAM_REQ_CMP_ERR; + int err; + enc_softc_t *enc; + struct ccb_getdev *cgd; + char *tname; + + cgd = (struct ccb_getdev *)arg; + if (periph == NULL) { + printf("enc_ctor: periph was NULL!!\n"); + goto out; + } + + if (cgd == NULL) { + printf("enc_ctor: no getdev CCB, can't register device\n"); + goto out; + } + + enc = ENC_MALLOCZ(sizeof(*enc)); + if (enc == NULL) { + printf("enc_ctor: Unable to probe new device. " + "Unable to allocate enc\n"); + goto out; + } + enc->periph = periph; + enc->current_action = ENC_UPDATE_INVALID; + + enc->enc_type = enc_type(cgd); + sx_init(&enc->enc_cache_lock, "enccache"); + + switch (enc->enc_type) { + case ENC_SES: + case ENC_SES_SCSI2: + case ENC_SES_PASSTHROUGH: + case ENC_SEMB_SES: + err = ses_softc_init(enc); + break; + case ENC_SAFT: + case ENC_SEMB_SAFT: + err = safte_softc_init(enc); + break; + case ENC_SEN: + case ENC_NONE: + default: + ENC_FREE(enc); + return (CAM_REQ_CMP_ERR); + } + + if (err) { + xpt_print(periph->path, "error %d initializing\n", err); + goto out; + } + + /* + * Hold off userland until we have made at least one pass + * through our state machine so that physical path data is + * present. + */ + if (enc->enc_vec.poll_status != NULL) { + enc->enc_boot_hold_ch.ich_func = enc_nop_confighook_cb; + enc->enc_boot_hold_ch.ich_arg = enc; + config_intrhook_establish(&enc->enc_boot_hold_ch); + } + + /* + * The softc field is set only once the enc is fully initialized + * so that we can rely on this field to detect partially + * initialized periph objects in the AC_FOUND_DEVICE handler. + */ + periph->softc = enc; + + cam_periph_unlock(periph); + if (enc->enc_vec.poll_status != NULL) { + err = enc_kproc_init(enc); + if (err) { + xpt_print(periph->path, + "error %d starting enc_daemon\n", err); + goto out; + } + } + + if (cam_periph_acquire(periph) != CAM_REQ_CMP) { + xpt_print(periph->path, "%s: lost periph during " + "registration!\n", __func__); + cam_periph_lock(periph); + + return (CAM_REQ_CMP_ERR); + } + + enc->enc_dev = make_dev(&enc_cdevsw, periph->unit_number, + UID_ROOT, GID_OPERATOR, 0600, "%s%d", + periph->periph_name, periph->unit_number); + + cam_periph_lock(periph); + enc->enc_dev->si_drv1 = periph; + + enc->enc_flags |= ENC_FLAG_INITIALIZED; + + /* + * Add an async callback so that we get notified if this + * device goes away. + */ + xpt_register_async(AC_LOST_DEVICE, enc_async, periph, periph->path); + + switch (enc->enc_type) { + default: + case ENC_NONE: + tname = "No ENC device"; + break; + case ENC_SES_SCSI2: + tname = "SCSI-2 ENC Device"; + break; + case ENC_SES: + tname = "SCSI-3 ENC Device"; + break; + case ENC_SES_PASSTHROUGH: + tname = "ENC Passthrough Device"; + break; + case ENC_SEN: + tname = "UNISYS SEN Device (NOT HANDLED YET)"; + break; + case ENC_SAFT: + tname = "SAF-TE Compliant Device"; + break; + case ENC_SEMB_SES: + tname = "SEMB SES Device"; + break; + case ENC_SEMB_SAFT: + tname = "SEMB SAF-TE Device"; + break; + } + xpt_announce_periph(periph, tname); + status = CAM_REQ_CMP; + +out: + if (status != CAM_REQ_CMP) + enc_dtor(periph); + return (status); +} + diff --git a/sys/cam/scsi/scsi_enc.h b/sys/cam/scsi/scsi_enc.h new file mode 100644 index 00000000000..a5345f23948 --- /dev/null +++ b/sys/cam/scsi/scsi_enc.h @@ -0,0 +1,219 @@ +/* $FreeBSD$ */ +/*- + * Copyright (c) 2000 by Matthew Jacob + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification, immediately at the beginning of the file. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * the GNU Public License ("GPL"). + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +#ifndef _SCSI_ENC_H_ +#define _SCSI_ENC_H_ + +#include + +#define ENCIOC ('s' - 040) +#define ENCIOC_GETNELM _IO(ENCIOC, 1) +#define ENCIOC_GETELMMAP _IO(ENCIOC, 2) +#define ENCIOC_GETENCSTAT _IO(ENCIOC, 3) +#define ENCIOC_SETENCSTAT _IO(ENCIOC, 4) +#define ENCIOC_GETELMSTAT _IO(ENCIOC, 5) +#define ENCIOC_SETELMSTAT _IO(ENCIOC, 6) +#define ENCIOC_GETTEXT _IO(ENCIOC, 7) +#define ENCIOC_INIT _IO(ENCIOC, 8) +#define ENCIOC_GETELMDESC _IO(ENCIOC, 9) +#define ENCIOC_GETELMDEVNAMES _IO(ENCIOC, 10) +#define ENCIOC_GETSTRING _IO(ENCIOC, 11) +#define ENCIOC_SETSTRING _IO(ENCIOC, 12) + +/* + * Platform Independent Definitions for enclosure devices. + */ +/* + * SCSI Based Environmental Services Application Defines + * + * Based almost entirely on SCSI-3 ENC Revision 8A specification, + * but slightly abstracted as the underlying device may in fact + * be a SAF-TE or vendor unique device. + */ +/* + * ENC Driver Operations: + * (The defines themselves are platform and access method specific) + * + * ENCIOC_GETNELM + * ENCIOC_GETELMMAP + * ENCIOC_GETENCSTAT + * ENCIOC_SETENCSTAT + * ENCIOC_GETELMSTAT + * ENCIOC_SETELMSTAT + * ENCIOC_INIT + * + * + * An application finds out how many elements an enclosure instance + * is managing by performing a ENCIOC_GETNELM operation. It then + * performs a ENCIOC_GETELMMAP to get the map that contains the + * elment identifiers for all elements (see encioc_element_t below). + * This information is static. + * + * The application may perform ENCIOC_GETELMSTAT operations to retrieve + * status on an element (see the enc_elm_status_t structure below), + * ENCIOC_SETELMSTAT operations to set status for an element. + * + * Similarly, overall enclosure status me be fetched or set via + * ENCIOC_GETENCSTAT or ENCIOC_SETENCSTAT operations (see encioc_enc_status_t + * below). + * + * Readers should note that there is nothing that requires either a set + * or a clear operation to actually latch and do anything in the target. + * + * A ENCIOC_INIT operation causes the enclosure to be initialized. + */ + +/* Element Types */ +typedef enum { + ELMTYP_UNSPECIFIED = 0x00, + ELMTYP_DEVICE = 0x01, + ELMTYP_POWER = 0x02, + ELMTYP_FAN = 0x03, + ELMTYP_THERM = 0x04, + ELMTYP_DOORLOCK = 0x05, + ELMTYP_ALARM = 0x06, + ELMTYP_ESCC = 0x07, /* Enclosure SCC */ + ELMTYP_SCC = 0x08, /* SCC */ + ELMTYP_NVRAM = 0x09, + ELMTYP_INV_OP_REASON = 0x0a, + ELMTYP_UPS = 0x0b, + ELMTYP_DISPLAY = 0x0c, + ELMTYP_KEYPAD = 0x0d, + ELMTYP_ENCLOSURE = 0x0e, + ELMTYP_SCSIXVR = 0x0f, + ELMTYP_LANGUAGE = 0x10, + ELMTYP_COMPORT = 0x11, + ELMTYP_VOM = 0x12, + ELMTYP_AMMETER = 0x13, + ELMTYP_SCSI_TGT = 0x14, + ELMTYP_SCSI_INI = 0x15, + ELMTYP_SUBENC = 0x16, + ELMTYP_ARRAY_DEV = 0x17, + ELMTYP_SAS_EXP = 0x18, /* SAS expander */ + ELMTYP_SAS_CONN = 0x19 /* SAS connector */ +} elm_type_t; + +typedef struct encioc_element { + /* Element Index */ + unsigned int elm_idx; + + /* ID of SubEnclosure containing Element*/ + unsigned int elm_subenc_id; + + /* Element Type */ + elm_type_t elm_type; +} encioc_element_t; + +/* + * Overall Enclosure Status + */ +typedef unsigned char encioc_enc_status_t; + +/* + * Element Status + */ +typedef struct encioc_elm_status { + unsigned int elm_idx; + unsigned char cstat[4]; +} encioc_elm_status_t; + +/* + * ENC String structure, for StringIn and StringOut commands; use this with + * the ENCIOC_GETSTRING and ENCIOC_SETSTRING ioctls. + */ +typedef struct encioc_string { + size_t bufsiz; /* IN/OUT: length of string provided/returned */ +#define ENC_STRING_MAX 0xffff + uint8_t *buf; /* IN/OUT: string */ +} encioc_string_t; + +/*============================================================================*/ + +/* + * SES v2 r20 6.1.10 (pg 39) - Element Descriptor diagnostic page + * Tables 21, 22, and 23 + */ +typedef struct encioc_elm_desc { + unsigned int elm_idx; /* IN: elment requested */ + uint16_t elm_desc_len; /* IN: buffer size; OUT: bytes written */ + char *elm_desc_str; /* IN/OUT: buffer for descriptor data */ +} encioc_elm_desc_t; + +/* + * ENCIOC_GETELMDEVNAMES: + * ioctl structure to get an element's device names, if available + */ +typedef struct encioc_elm_devnames { + unsigned int elm_idx; /* IN: element index */ + size_t elm_names_size;/* IN: size of elm_devnames */ + size_t elm_names_len; /* OUT: actual size returned */ + /* + * IN/OUT: comma separated list of peripheral driver + * instances servicing this element. + */ + char *elm_devnames; +} encioc_elm_devnames_t; + +/* ioctl structure for requesting FC info for a port */ +typedef struct encioc_elm_fc_port { + unsigned int elm_idx; + unsigned int port_idx; + struct ses_elm_fc_port port_data; +} encioc_elm_fc_port_t; + +/* ioctl structure for requesting SAS info for element phys */ +typedef struct encioc_elm_sas_device_phy { + unsigned int elm_idx; + unsigned int phy_idx; + struct ses_elm_sas_device_phy phy_data; +} enioc_elm_sas_phy_t; + +/* ioctl structure for requesting SAS info for an expander phy */ +typedef struct encioc_elm_sas_expander_phy { + unsigned int elm_idx; + unsigned int phy_idx; + struct ses_elm_sas_expander_phy phy_data; +} encioc_elm_sas_expander_phy_t; + +/* ioctl structure for requesting SAS info for a port phy */ +typedef struct encioc_elm_sas_port_phy { + unsigned int elm_idx; + unsigned int phy_idx; + struct ses_elm_sas_port_phy phy_data; +} enioc_elm_sas_port_phy_t; + +/* ioctl structure for requesting additional status for an element */ +typedef struct encioc_addl_status { + unsigned int elm_idx; + union ses_elm_addlstatus_descr_hdr addl_hdr; + union ses_elm_addlstatus_proto_hdr proto_hdr; +} enioc_addl_status_t; + +#endif /* _SCSI_ENC_H_ */ diff --git a/sys/cam/scsi/scsi_enc_internal.h b/sys/cam/scsi/scsi_enc_internal.h new file mode 100644 index 00000000000..865b8a143b8 --- /dev/null +++ b/sys/cam/scsi/scsi_enc_internal.h @@ -0,0 +1,230 @@ +/*- + * Copyright (c) 2000 Matthew Jacob + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification, immediately at the beginning of the file. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * This file contains definitions only intended for use within + * sys/cam/scsi/scsi_enc*.c, and not in other kernel components. + */ + +#ifndef __SCSI_ENC_INTERNAL_H__ +#define __SCSI_ENC_INTERNAL_H__ + +typedef struct enc_element { + uint32_t + enctype : 8, /* enclosure type */ + subenclosure : 8, /* subenclosure id */ + svalid : 1, /* enclosure information valid */ + overall_status_elem: 1,/* + * This object represents generic + * status about all objects of this + * type. + */ + priv : 14; /* private data, per object */ + uint8_t encstat[4]; /* state && stats */ + uint8_t *physical_path; /* Device physical path data. */ + u_int physical_path_len; /* Length of device path data. */ + void *elm_private; /* per-type object data */ +} enc_element_t; + +typedef enum { + ENC_NONE, + ENC_SES_SCSI2, + ENC_SES, + ENC_SES_PASSTHROUGH, + ENC_SEN, + ENC_SAFT, + ENC_SEMB_SES, + ENC_SEMB_SAFT +} enctyp; + +/* Platform Independent Driver Internal Definitions for enclosure devices. */ +typedef struct enc_softc enc_softc_t; + +struct enc_fsm_state; +typedef int fsm_fill_handler_t(enc_softc_t *ssc, + struct enc_fsm_state *state, + union ccb *ccb, + uint8_t *buf); +typedef int fsm_error_handler_t(union ccb *ccb, uint32_t cflags, + uint32_t sflags); +typedef int fsm_done_handler_t(enc_softc_t *ssc, + struct enc_fsm_state *state, union ccb *ccb, + uint8_t **bufp, int error, int xfer_len); + +struct enc_fsm_state { + const char *name; + int page_code; + size_t buf_size; + uint32_t timeout; + fsm_fill_handler_t *fill; + fsm_done_handler_t *done; + fsm_error_handler_t *error; +}; + +typedef int (enc_softc_init_t)(enc_softc_t *); +typedef void (enc_softc_invalidate_t)(enc_softc_t *); +typedef void (enc_softc_cleanup_t)(enc_softc_t *); +typedef int (enc_init_enc_t)(enc_softc_t *); +typedef int (enc_get_enc_status_t)(enc_softc_t *, int); +typedef int (enc_set_enc_status_t)(enc_softc_t *, encioc_enc_status_t, int); +typedef int (enc_get_elm_status_t)(enc_softc_t *, encioc_elm_status_t *, int); +typedef int (enc_set_elm_status_t)(enc_softc_t *, encioc_elm_status_t *, int); +typedef int (enc_get_elm_desc_t)(enc_softc_t *, encioc_elm_desc_t *); +typedef int (enc_get_elm_devnames_t)(enc_softc_t *, encioc_elm_devnames_t *); +typedef int (enc_handle_string_t)(enc_softc_t *, encioc_string_t *, int); +typedef void (enc_device_found_t)(enc_softc_t *); +typedef void (enc_poll_status_t)(enc_softc_t *); + +struct enc_vec { + enc_softc_invalidate_t *softc_invalidate; + enc_softc_cleanup_t *softc_cleanup; + enc_init_enc_t *init_enc; + enc_get_enc_status_t *get_enc_status; + enc_set_enc_status_t *set_enc_status; + enc_get_elm_status_t *get_elm_status; + enc_set_elm_status_t *set_elm_status; + enc_get_elm_desc_t *get_elm_desc; + enc_get_elm_devnames_t *get_elm_devnames; + enc_handle_string_t *handle_string; + enc_device_found_t *device_found; + enc_poll_status_t *poll_status; +}; + +typedef struct enc_cache { + enc_element_t *elm_map; /* objects */ + int nelms; /* number of objects */ + encioc_enc_status_t enc_status; /* overall status */ + void *private; /* per-type private data */ +} enc_cache_t; + +/* Enclosure instance toplevel structure */ +struct enc_softc { + enctyp enc_type; /* type of enclosure */ + struct enc_vec enc_vec; /* vector to handlers */ + void *enc_private; /* per-type private data */ + + /** + * "Published" configuration and state data available to + * external consumers. + */ + enc_cache_t enc_cache; + + /** + * Configuration and state data being actively updated + * by the enclosure daemon. + */ + enc_cache_t enc_daemon_cache; + + struct sx enc_cache_lock; + uint8_t enc_flags; +#define ENC_FLAG_INVALID 0x01 +#define ENC_FLAG_INITIALIZED 0x02 +#define ENC_FLAG_SHUTDOWN 0x04 + union ccb saved_ccb; + struct cdev *enc_dev; + struct cam_periph *periph; + + /* Bitmap of pending operations. */ + uint32_t pending_actions; + + /* The action on which the state machine is currently working. */ + uint32_t current_action; +#define ENC_UPDATE_NONE 0x00 +#define ENC_UPDATE_INVALID 0xff + + /* Callout for auto-updating enclosure status */ + struct callout status_updater; + + struct proc *enc_daemon; + + struct enc_fsm_state *enc_fsm_states; + + struct intr_config_hook enc_boot_hold_ch; +}; + +static inline enc_cache_t * +enc_other_cache(enc_softc_t *enc, enc_cache_t *primary) +{ + return (primary == &enc->enc_cache + ? &enc->enc_daemon_cache : &enc->enc_cache); +} + +/* SES Management mode page - SES2r20 Table 59 */ +struct ses_mgmt_mode_page { + struct scsi_mode_header_6 header; + struct scsi_mode_blk_desc blk_desc; + uint8_t byte0; /* ps : 1, spf : 1, page_code : 6 */ +#define SES_MGMT_MODE_PAGE_CODE 0x14 + uint8_t length; +#define SES_MGMT_MODE_PAGE_LEN 6 + uint8_t reserved[3]; + uint8_t byte5; /* reserved : 7, enbltc : 1 */ +#define SES_MGMT_TIMED_COMP_EN 0x1 + uint8_t max_comp_time[2]; +}; + +/* Enclosure core interface for sub-drivers */ +int enc_runcmd(struct enc_softc *, char *, int, char *, int *); +void enc_log(struct enc_softc *, const char *, ...); +void enc_done(struct cam_periph *, union ccb *); +int enc_error(union ccb *, uint32_t, uint32_t); +void enc_update_request(enc_softc_t *, uint32_t); + +/* SES Native interface */ +enc_softc_init_t ses_softc_init; + +/* SAF-TE interface */ +enc_softc_init_t safte_softc_init; + +/* Helper macros */ +MALLOC_DECLARE(M_SCSIENC); +#define ENC_CFLAGS CAM_RETRY_SELTO +#define ENC_FLAGS SF_NO_PRINT | SF_RETRY_UA +#define STRNCMP strncmp +#define PRINTF printf +#define ENC_LOG enc_log +#if defined(DEBUG) || defined(ENC_DEBUG) +#define ENC_DLOG enc_log +#else +#define ENC_DLOG if (0) enc_log +#endif +#define ENC_VLOG if (bootverbose) enc_log +#define ENC_MALLOC(amt) malloc(amt, M_SCSIENC, M_NOWAIT) +#define ENC_MALLOCZ(amt) malloc(amt, M_SCSIENC, M_ZERO|M_NOWAIT) +/* Cast away const avoiding GCC warnings. */ +#define ENC_FREE(ptr) free((void *)((uintptr_t)ptr), M_SCSIENC) +#define ENC_FREE_AND_NULL(ptr) do { \ + if (ptr != NULL) { \ + ENC_FREE(ptr); \ + ptr = NULL; \ + } \ +} while(0) +#define MEMZERO bzero +#define MEMCPY(dest, src, amt) bcopy(src, dest, amt) + +#endif /* __SCSI_ENC_INTERNAL_H__ */ diff --git a/sys/cam/scsi/scsi_enc_safte.c b/sys/cam/scsi/scsi_enc_safte.c new file mode 100644 index 00000000000..f661e511dd9 --- /dev/null +++ b/sys/cam/scsi/scsi_enc_safte.c @@ -0,0 +1,1137 @@ +/*- + * Copyright (c) 2000 Matthew Jacob + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification, immediately at the beginning of the file. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include + +/* + * SAF-TE Type Device Emulation + */ + +static int safte_set_enc_status(enc_softc_t *enc, uint8_t encstat, int slpflag); + +#define ALL_ENC_STAT (SES_ENCSTAT_CRITICAL | SES_ENCSTAT_UNRECOV | \ + SES_ENCSTAT_NONCRITICAL | SES_ENCSTAT_INFO) +/* + * SAF-TE specific defines- Mandatory ones only... + */ + +/* + * READ BUFFER ('get' commands) IDs- placed in offset 2 of cdb + */ +#define SAFTE_RD_RDCFG 0x00 /* read enclosure configuration */ +#define SAFTE_RD_RDESTS 0x01 /* read enclosure status */ +#define SAFTE_RD_RDDSTS 0x04 /* read drive slot status */ +#define SAFTE_RD_RDGFLG 0x05 /* read global flags */ + +/* + * WRITE BUFFER ('set' commands) IDs- placed in offset 0 of databuf + */ +#define SAFTE_WT_DSTAT 0x10 /* write device slot status */ +#define SAFTE_WT_SLTOP 0x12 /* perform slot operation */ +#define SAFTE_WT_FANSPD 0x13 /* set fan speed */ +#define SAFTE_WT_ACTPWS 0x14 /* turn on/off power supply */ +#define SAFTE_WT_GLOBAL 0x15 /* send global command */ + +#define SAFT_SCRATCH 64 +#define SCSZ 0x8000 + +typedef enum { + SAFTE_UPDATE_NONE, + SAFTE_UPDATE_READCONFIG, + SAFTE_UPDATE_READGFLAGS, + SAFTE_UPDATE_READENCSTATUS, + SAFTE_UPDATE_READSLOTSTATUS, + SAFTE_PROCESS_CONTROL_REQS, + SAFTE_NUM_UPDATE_STATES +} safte_update_action; + +static fsm_fill_handler_t safte_fill_read_buf_io; +static fsm_fill_handler_t safte_fill_control_request; +static fsm_done_handler_t safte_process_config; +static fsm_done_handler_t safte_process_gflags; +static fsm_done_handler_t safte_process_status; +static fsm_done_handler_t safte_process_slotstatus; +static fsm_done_handler_t safte_process_control_request; + +static struct enc_fsm_state enc_fsm_states[SAFTE_NUM_UPDATE_STATES] = +{ + { "SAFTE_UPDATE_NONE", 0, 0, 0, NULL, NULL, NULL }, + { + "SAFTE_UPDATE_READCONFIG", + SAFTE_RD_RDCFG, + SAFT_SCRATCH, + 60 * 1000, + safte_fill_read_buf_io, + safte_process_config, + enc_error + }, + { + "SAFTE_UPDATE_READGFLAGS", + SAFTE_RD_RDGFLG, + 16, + 60 * 1000, + safte_fill_read_buf_io, + safte_process_gflags, + enc_error + }, + { + "SAFTE_UPDATE_READENCSTATUS", + SAFTE_RD_RDESTS, + SCSZ, + 60 * 1000, + safte_fill_read_buf_io, + safte_process_status, + enc_error + }, + { + "SAFTE_UPDATE_READSLOTSTATUS", + SAFTE_RD_RDDSTS, + SCSZ, + 60 * 1000, + safte_fill_read_buf_io, + safte_process_slotstatus, + enc_error + }, + { + "SAFTE_PROCESS_CONTROL_REQS", + 0, + SCSZ, + 60 * 1000, + safte_fill_control_request, + safte_process_control_request, + enc_error + } +}; + +typedef struct safte_control_request { + int elm_idx; + uint8_t elm_stat[4]; + int result; + TAILQ_ENTRY(safte_control_request) links; +} safte_control_request_t; +TAILQ_HEAD(safte_control_reqlist, safte_control_request); +typedef struct safte_control_reqlist safte_control_reqlist_t; +enum { + SES_SETSTATUS_ENC_IDX = -1 +}; + +static void +safte_terminate_control_requests(safte_control_reqlist_t *reqlist, int result) +{ + safte_control_request_t *req; + + while ((req = TAILQ_FIRST(reqlist)) != NULL) { + TAILQ_REMOVE(reqlist, req, links); + req->result = result; + wakeup(req); + } +} + +struct scfg { + /* + * Cached Configuration + */ + uint8_t Nfans; /* Number of Fans */ + uint8_t Npwr; /* Number of Power Supplies */ + uint8_t Nslots; /* Number of Device Slots */ + uint8_t DoorLock; /* Door Lock Installed */ + uint8_t Ntherm; /* Number of Temperature Sensors */ + uint8_t Nspkrs; /* Number of Speakers */ + uint8_t Ntstats; /* Number of Thermostats */ + /* + * Cached Flag Bytes for Global Status + */ + uint8_t flag1; + uint8_t flag2; + /* + * What object index ID is where various slots start. + */ + uint8_t pwroff; + uint8_t slotoff; +#define SAFT_ALARM_OFFSET(cc) (cc)->slotoff - 1 + + encioc_enc_status_t adm_status; + encioc_enc_status_t enc_status; + encioc_enc_status_t slot_status; + + safte_control_reqlist_t requests; + safte_control_request_t *current_request; + int current_request_stage; + int current_request_stages; +}; + +#define SAFT_FLG1_ALARM 0x1 +#define SAFT_FLG1_GLOBFAIL 0x2 +#define SAFT_FLG1_GLOBWARN 0x4 +#define SAFT_FLG1_ENCPWROFF 0x8 +#define SAFT_FLG1_ENCFANFAIL 0x10 +#define SAFT_FLG1_ENCPWRFAIL 0x20 +#define SAFT_FLG1_ENCDRVFAIL 0x40 +#define SAFT_FLG1_ENCDRVWARN 0x80 + +#define SAFT_FLG2_LOCKDOOR 0x4 +#define SAFT_PRIVATE sizeof (struct scfg) + +static char *safte_2little = "Too Little Data Returned (%d) at line %d\n"; +#define SAFT_BAIL(r, x) \ + if ((r) >= (x)) { \ + ENC_LOG(enc, safte_2little, x, __LINE__);\ + return (EIO); \ + } + +int emulate_array_devices = 1; +SYSCTL_DECL(_kern_cam_enc); +SYSCTL_INT(_kern_cam_enc, OID_AUTO, emulate_array_devices, CTLFLAG_RW, + &emulate_array_devices, 0, "Emulate Array Devices for SAF-TE"); +TUNABLE_INT("kern.cam.enc.emulate_array_devices", &emulate_array_devices); + +static int +safte_fill_read_buf_io(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t *buf) +{ + + if (state->page_code != SAFTE_RD_RDCFG && + enc->enc_cache.nelms == 0) { + enc_update_request(enc, SAFTE_UPDATE_READCONFIG); + return (-1); + } + + if (enc->enc_type == ENC_SEMB_SAFT) { + semb_read_buffer(&ccb->ataio, /*retries*/5, + enc_done, MSG_SIMPLE_Q_TAG, + state->page_code, buf, state->buf_size, + state->timeout); + } else { + scsi_read_buffer(&ccb->csio, /*retries*/5, + enc_done, MSG_SIMPLE_Q_TAG, 1, + state->page_code, 0, buf, state->buf_size, + SSD_FULL_SIZE, state->timeout); + } + return (0); +} + +static int +safte_process_config(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + struct scfg *cfg; + uint8_t *buf = *bufp; + int i, r; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + if (error != 0) + return (error); + if (xfer_len < 6) { + ENC_LOG(enc, "too little data (%d) for configuration\n", + xfer_len); + return (EIO); + } + cfg->Nfans = buf[0]; + cfg->Npwr = buf[1]; + cfg->Nslots = buf[2]; + cfg->DoorLock = buf[3]; + cfg->Ntherm = buf[4]; + cfg->Nspkrs = buf[5]; + if (xfer_len >= 7) + cfg->Ntstats = buf[6] & 0x0f; + else + cfg->Ntstats = 0; + ENC_VLOG(enc, "Nfans %d Npwr %d Nslots %d Lck %d Ntherm %d Nspkrs %d " + "Ntstats %d\n", + cfg->Nfans, cfg->Npwr, cfg->Nslots, cfg->DoorLock, cfg->Ntherm, + cfg->Nspkrs, cfg->Ntstats); + + enc->enc_cache.nelms = cfg->Nfans + cfg->Npwr + cfg->Nslots + + cfg->DoorLock + cfg->Ntherm + cfg->Nspkrs + cfg->Ntstats + 1; + ENC_FREE_AND_NULL(enc->enc_cache.elm_map); + enc->enc_cache.elm_map = + ENC_MALLOCZ(enc->enc_cache.nelms * sizeof(enc_element_t)); + if (enc->enc_cache.elm_map == NULL) { + enc->enc_cache.nelms = 0; + return (ENOMEM); + } + + r = 0; + /* + * Note that this is all arranged for the convenience + * in later fetches of status. + */ + for (i = 0; i < cfg->Nfans; i++) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_FAN; + cfg->pwroff = (uint8_t) r; + for (i = 0; i < cfg->Npwr; i++) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_POWER; + for (i = 0; i < cfg->DoorLock; i++) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_DOORLOCK; + if (cfg->Nspkrs > 0) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_ALARM; + for (i = 0; i < cfg->Ntherm; i++) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_THERM; + for (i = 0; i <= cfg->Ntstats; i++) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_THERM; + cfg->slotoff = (uint8_t) r; + for (i = 0; i < cfg->Nslots; i++) + enc->enc_cache.elm_map[r++].enctype = + emulate_array_devices ? ELMTYP_ARRAY_DEV : + ELMTYP_DEVICE; + + enc_update_request(enc, SAFTE_UPDATE_READGFLAGS); + enc_update_request(enc, SAFTE_UPDATE_READENCSTATUS); + enc_update_request(enc, SAFTE_UPDATE_READSLOTSTATUS); + + return (0); +} + +static int +safte_process_gflags(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + struct scfg *cfg; + uint8_t *buf = *bufp; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + if (error != 0) + return (error); + SAFT_BAIL(3, xfer_len); + cfg->flag1 = buf[1]; + cfg->flag2 = buf[2]; + + cfg->adm_status = 0; + if (cfg->flag1 & SAFT_FLG1_GLOBFAIL) + cfg->adm_status |= SES_ENCSTAT_CRITICAL; + else if (cfg->flag1 & SAFT_FLG1_GLOBWARN) + cfg->adm_status |= SES_ENCSTAT_NONCRITICAL; + + return (0); +} + +static int +safte_process_status(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + struct scfg *cfg; + uint8_t *buf = *bufp; + int oid, r, i, nitems; + uint16_t tempflags; + enc_cache_t *cache = &enc->enc_cache; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + if (error != 0) + return (error); + + oid = r = 0; + cfg->enc_status = 0; + + for (nitems = i = 0; i < cfg->Nfans; i++) { + SAFT_BAIL(r, xfer_len); + /* + * 0 = Fan Operational + * 1 = Fan is malfunctioning + * 2 = Fan is not present + * 0x80 = Unknown or Not Reportable Status + */ + cache->elm_map[oid].encstat[1] = 0; /* resvd */ + cache->elm_map[oid].encstat[2] = 0; /* resvd */ + if (cfg->flag1 & SAFT_FLG1_ENCFANFAIL) + cache->elm_map[oid].encstat[3] |= 0x40; + else + cache->elm_map[oid].encstat[3] &= ~0x40; + switch ((int)buf[r]) { + case 0: + nitems++; + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; + if ((cache->elm_map[oid].encstat[3] & 0x37) == 0) + cache->elm_map[oid].encstat[3] |= 0x27; + break; + + case 1: + cache->elm_map[oid].encstat[0] = + SES_OBJSTAT_CRIT; + /* + * FAIL and FAN STOPPED synthesized + */ + cache->elm_map[oid].encstat[3] |= 0x10; + cache->elm_map[oid].encstat[3] &= ~0x07; + /* + * Enclosure marked with CRITICAL error + * if only one fan or no thermometers, + * else the NONCRITICAL error is set. + */ + if (cfg->Nfans == 1 || (cfg->Ntherm + cfg->Ntstats) == 0) + cfg->enc_status |= SES_ENCSTAT_CRITICAL; + else + cfg->enc_status |= SES_ENCSTAT_NONCRITICAL; + break; + case 2: + cache->elm_map[oid].encstat[0] = + SES_OBJSTAT_NOTINSTALLED; + cache->elm_map[oid].encstat[3] |= 0x10; + cache->elm_map[oid].encstat[3] &= ~0x07; + /* + * Enclosure marked with CRITICAL error + * if only one fan or no thermometers, + * else the NONCRITICAL error is set. + */ + if (cfg->Nfans == 1) + cfg->enc_status |= SES_ENCSTAT_CRITICAL; + else + cfg->enc_status |= SES_ENCSTAT_NONCRITICAL; + break; + case 0x80: + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; + cache->elm_map[oid].encstat[3] = 0; + cfg->enc_status |= SES_ENCSTAT_INFO; + break; + default: + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNSUPPORTED; + ENC_LOG(enc, "Unknown fan%d status 0x%x\n", i, + buf[r] & 0xff); + break; + } + cache->elm_map[oid++].svalid = 1; + r++; + } + + /* + * No matter how you cut it, no cooling elements when there + * should be some there is critical. + */ + if (cfg->Nfans && nitems == 0) + cfg->enc_status |= SES_ENCSTAT_CRITICAL; + + for (i = 0; i < cfg->Npwr; i++) { + SAFT_BAIL(r, xfer_len); + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; + cache->elm_map[oid].encstat[1] = 0; /* resvd */ + cache->elm_map[oid].encstat[2] = 0; /* resvd */ + cache->elm_map[oid].encstat[3] = 0x20; /* requested on */ + switch (buf[r]) { + case 0x00: /* pws operational and on */ + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; + break; + case 0x01: /* pws operational and off */ + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; + cache->elm_map[oid].encstat[3] = 0x10; + cfg->enc_status |= SES_ENCSTAT_INFO; + break; + case 0x10: /* pws is malfunctioning and commanded on */ + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_CRIT; + cache->elm_map[oid].encstat[3] = 0x61; + cfg->enc_status |= SES_ENCSTAT_NONCRITICAL; + break; + + case 0x11: /* pws is malfunctioning and commanded off */ + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NONCRIT; + cache->elm_map[oid].encstat[3] = 0x51; + cfg->enc_status |= SES_ENCSTAT_NONCRITICAL; + break; + case 0x20: /* pws is not present */ + cache->elm_map[oid].encstat[0] = + SES_OBJSTAT_NOTINSTALLED; + cache->elm_map[oid].encstat[3] = 0; + cfg->enc_status |= SES_ENCSTAT_INFO; + break; + case 0x21: /* pws is present */ + /* + * This is for enclosures that cannot tell whether the + * device is on or malfunctioning, but know that it is + * present. Just fall through. + */ + /* FALLTHROUGH */ + case 0x80: /* Unknown or Not Reportable Status */ + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; + cache->elm_map[oid].encstat[3] = 0; + cfg->enc_status |= SES_ENCSTAT_INFO; + break; + default: + ENC_LOG(enc, "unknown power supply %d status (0x%x)\n", + i, buf[r] & 0xff); + break; + } + enc->enc_cache.elm_map[oid++].svalid = 1; + r++; + } + + /* + * Copy Slot SCSI IDs + */ + for (i = 0; i < cfg->Nslots; i++) { + SAFT_BAIL(r, xfer_len); + if (cache->elm_map[cfg->slotoff + i].enctype == ELMTYP_DEVICE) + cache->elm_map[cfg->slotoff + i].encstat[1] = buf[r]; + r++; + } + + /* + * We always have doorlock status, no matter what, + * but we only save the status if we have one. + */ + SAFT_BAIL(r, xfer_len); + if (cfg->DoorLock) { + /* + * 0 = Door Locked + * 1 = Door Unlocked, or no Lock Installed + * 0x80 = Unknown or Not Reportable Status + */ + cache->elm_map[oid].encstat[1] = 0; + cache->elm_map[oid].encstat[2] = 0; + switch (buf[r]) { + case 0: + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; + cache->elm_map[oid].encstat[3] = 0; + break; + case 1: + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; + cache->elm_map[oid].encstat[3] = 1; + break; + case 0x80: + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; + cache->elm_map[oid].encstat[3] = 0; + cfg->enc_status |= SES_ENCSTAT_INFO; + break; + default: + cache->elm_map[oid].encstat[0] = + SES_OBJSTAT_UNSUPPORTED; + ENC_LOG(enc, "unknown lock status 0x%x\n", + buf[r] & 0xff); + break; + } + cache->elm_map[oid++].svalid = 1; + } + r++; + + /* + * We always have speaker status, no matter what, + * but we only save the status if we have one. + */ + SAFT_BAIL(r, xfer_len); + if (cfg->Nspkrs) { + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; + cache->elm_map[oid].encstat[1] = 0; + cache->elm_map[oid].encstat[2] = 0; + if (buf[r] == 0) { + cache->elm_map[oid].encstat[0] |= SESCTL_DISABLE; + cache->elm_map[oid].encstat[3] |= 0x40; + } + cache->elm_map[oid++].svalid = 1; + } + r++; + + /* + * Now, for "pseudo" thermometers, we have two bytes + * of information in enclosure status- 16 bits. Actually, + * the MSB is a single TEMP ALERT flag indicating whether + * any other bits are set, but, thanks to fuzzy thinking, + * in the SAF-TE spec, this can also be set even if no + * other bits are set, thus making this really another + * binary temperature sensor. + */ + + SAFT_BAIL(r + cfg->Ntherm, xfer_len); + tempflags = buf[r + cfg->Ntherm]; + SAFT_BAIL(r + cfg->Ntherm + 1, xfer_len); + tempflags |= (tempflags << 8) | buf[r + cfg->Ntherm + 1]; + + for (i = 0; i < cfg->Ntherm; i++) { + SAFT_BAIL(r, xfer_len); + /* + * Status is a range from -10 to 245 deg Celsius, + * which we need to normalize to -20 to -245 according + * to the latest SCSI spec, which makes little + * sense since this would overflow an 8bit value. + * Well, still, the base normalization is -20, + * not -10, so we have to adjust. + * + * So what's over and under temperature? + * Hmm- we'll state that 'normal' operating + * is 10 to 40 deg Celsius. + */ + + /* + * Actually.... All of the units that people out in the world + * seem to have do not come even close to setting a value that + * complies with this spec. + * + * The closest explanation I could find was in an + * LSI-Logic manual, which seemed to indicate that + * this value would be set by whatever the I2C code + * would interpolate from the output of an LM75 + * temperature sensor. + * + * This means that it is impossible to use the actual + * numeric value to predict anything. But we don't want + * to lose the value. So, we'll propagate the *uncorrected* + * value and set SES_OBJSTAT_NOTAVAIL. We'll depend on the + * temperature flags for warnings. + */ + if (tempflags & (1 << i)) { + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_CRIT; + cfg->enc_status |= SES_ENCSTAT_CRITICAL; + } else + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; + cache->elm_map[oid].encstat[1] = 0; + cache->elm_map[oid].encstat[2] = buf[r]; + cache->elm_map[oid].encstat[3] = 0; + cache->elm_map[oid++].svalid = 1; + r++; + } + + for (i = 0; i <= cfg->Ntstats; i++) { + cache->elm_map[oid].encstat[1] = 0; + if (tempflags & (1 << + ((i == cfg->Ntstats) ? 15 : (cfg->Ntherm + i)))) { + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_CRIT; + cache->elm_map[4].encstat[2] = 0xff; + /* + * Set 'over temperature' failure. + */ + cache->elm_map[oid].encstat[3] = 8; + cfg->enc_status |= SES_ENCSTAT_CRITICAL; + } else { + /* + * We used to say 'not available' and synthesize a + * nominal 30 deg (C)- that was wrong. Actually, + * Just say 'OK', and use the reserved value of + * zero. + */ + if ((cfg->Ntherm + cfg->Ntstats) == 0) + cache->elm_map[oid].encstat[0] = + SES_OBJSTAT_NOTAVAIL; + else + cache->elm_map[oid].encstat[0] = + SES_OBJSTAT_OK; + cache->elm_map[oid].encstat[2] = 0; + cache->elm_map[oid].encstat[3] = 0; + } + cache->elm_map[oid++].svalid = 1; + } + r += 2; + + cache->enc_status = + cfg->enc_status | cfg->slot_status | cfg->adm_status; + return (0); +} + +static int +safte_process_slotstatus(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + struct scfg *cfg; + uint8_t *buf = *bufp; + enc_cache_t *cache = &enc->enc_cache; + int oid, r, i; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + if (error != 0) + return (error); + cfg->slot_status = 0; + oid = cfg->slotoff; + for (r = i = 0; i < cfg->Nslots; i++, r += 4) { + SAFT_BAIL(r+3, xfer_len); + if (cache->elm_map[oid].enctype == ELMTYP_ARRAY_DEV) + cache->elm_map[oid].encstat[1] = 0; + cache->elm_map[oid].encstat[2] &= SESCTL_RQSID; + cache->elm_map[oid].encstat[3] = 0; + if ((buf[r+3] & 0x01) == 0) { /* no device */ + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NOTINSTALLED; + } else if (buf[r+0] & 0x02) { + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_CRIT; + cfg->slot_status |= SES_ENCSTAT_CRITICAL; + } else if (buf[r+0] & 0x40) { + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NONCRIT; + cfg->slot_status |= SES_ENCSTAT_NONCRITICAL; + } else { + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; + } + if (buf[r+3] & 0x2) { + if (buf[r+3] & 0x01) + cache->elm_map[oid].encstat[2] |= SESCTL_RQSRMV; + else + cache->elm_map[oid].encstat[2] |= SESCTL_RQSINS; + } + if ((buf[r+3] & 0x04) == 0) + cache->elm_map[oid].encstat[3] |= SESCTL_DEVOFF; + if (buf[r+0] & 0x02) + cache->elm_map[oid].encstat[3] |= SESCTL_RQSFLT; + if (buf[r+0] & 0x40) + cache->elm_map[oid].encstat[0] |= SESCTL_PRDFAIL; + if (cache->elm_map[oid].enctype == ELMTYP_ARRAY_DEV) { + if (buf[r+0] & 0x01) + cache->elm_map[oid].encstat[1] |= 0x80; + if (buf[r+0] & 0x04) + cache->elm_map[oid].encstat[1] |= 0x02; + if (buf[r+0] & 0x08) + cache->elm_map[oid].encstat[1] |= 0x04; + if (buf[r+0] & 0x10) + cache->elm_map[oid].encstat[1] |= 0x08; + if (buf[r+0] & 0x20) + cache->elm_map[oid].encstat[1] |= 0x10; + if (buf[r+1] & 0x01) + cache->elm_map[oid].encstat[1] |= 0x20; + if (buf[r+1] & 0x02) + cache->elm_map[oid].encstat[1] |= 0x01; + } + cache->elm_map[oid++].svalid = 1; + } + + cache->enc_status = + cfg->enc_status | cfg->slot_status | cfg->adm_status; + return (0); +} + +static int +safte_fill_control_request(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t *buf) +{ + struct scfg *cfg; + enc_element_t *ep, *ep1; + safte_control_request_t *req; + int i, idx, xfer_len; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + + if (enc->enc_cache.nelms == 0) { + enc_update_request(enc, SAFTE_UPDATE_READCONFIG); + return (-1); + } + + if (cfg->current_request == NULL) { + cfg->current_request = TAILQ_FIRST(&cfg->requests); + TAILQ_REMOVE(&cfg->requests, cfg->current_request, links); + cfg->current_request_stage = 0; + cfg->current_request_stages = 1; + } + req = cfg->current_request; + + idx = (int)req->elm_idx; + if (req->elm_idx == SES_SETSTATUS_ENC_IDX) { + cfg->adm_status = req->elm_stat[0] & ALL_ENC_STAT; + cfg->flag1 &= ~(SAFT_FLG1_GLOBFAIL|SAFT_FLG1_GLOBWARN); + if (req->elm_stat[0] & (SES_ENCSTAT_CRITICAL|SES_ENCSTAT_UNRECOV)) + cfg->flag1 |= SAFT_FLG1_GLOBFAIL; + else if (req->elm_stat[0] & SES_ENCSTAT_NONCRITICAL) + cfg->flag1 |= SAFT_FLG1_GLOBWARN; + buf[0] = SAFTE_WT_GLOBAL; + buf[1] = cfg->flag1; + buf[2] = cfg->flag2; + buf[3] = 0; + xfer_len = 16; + } else { + ep = &enc->enc_cache.elm_map[idx]; + + switch (ep->enctype) { + case ELMTYP_DEVICE: + case ELMTYP_ARRAY_DEV: + switch (cfg->current_request_stage) { + case 0: + ep->priv = 0; + if (req->elm_stat[0] & SESCTL_PRDFAIL) + ep->priv |= 0x40; + if (req->elm_stat[3] & SESCTL_RQSFLT) + ep->priv |= 0x02; + if (ep->enctype == ELMTYP_ARRAY_DEV) { + if (req->elm_stat[1] & 0x01) + ep->priv |= 0x200; + if (req->elm_stat[1] & 0x02) + ep->priv |= 0x04; + if (req->elm_stat[1] & 0x04) + ep->priv |= 0x08; + if (req->elm_stat[1] & 0x08) + ep->priv |= 0x10; + if (req->elm_stat[1] & 0x10) + ep->priv |= 0x20; + if (req->elm_stat[1] & 0x20) + ep->priv |= 0x100; + if (req->elm_stat[1] & 0x80) + ep->priv |= 0x01; + } + if (ep->priv == 0) + ep->priv |= 0x01; /* no errors */ + + buf[0] = SAFTE_WT_DSTAT; + for (i = 0; i < cfg->Nslots; i++) { + ep1 = &enc->enc_cache.elm_map[cfg->slotoff + i]; + buf[1 + (3 * i)] = ep1->priv; + buf[2 + (3 * i)] = ep1->priv >> 8; + } + xfer_len = cfg->Nslots * 3 + 1; +#define DEVON(x) (!(((x)[2] & SESCTL_RQSINS) | \ + ((x)[2] & SESCTL_RQSRMV) | \ + ((x)[3] & SESCTL_DEVOFF))) + if (DEVON(req->elm_stat) != DEVON(ep->encstat)) + cfg->current_request_stages++; +#define IDON(x) (!!((x)[2] & SESCTL_RQSID)) + if (IDON(req->elm_stat) != IDON(ep->encstat)) + cfg->current_request_stages++; + break; + case 1: + case 2: + buf[0] = SAFTE_WT_SLTOP; + buf[1] = idx - cfg->slotoff; + if (cfg->current_request_stage == 1 && + DEVON(req->elm_stat) != DEVON(ep->encstat)) { + if (DEVON(req->elm_stat)) + buf[2] = 0x01; + else + buf[2] = 0x02; + } else { + if (IDON(req->elm_stat)) + buf[2] = 0x04; + else + buf[2] = 0x00; + ep->encstat[2] &= ~SESCTL_RQSID; + ep->encstat[2] |= req->elm_stat[2] & + SESCTL_RQSID; + } + xfer_len = 64; + break; + default: + return (EINVAL); + } + break; + case ELMTYP_POWER: + cfg->current_request_stages = 2; + switch (cfg->current_request_stage) { + case 0: + if (req->elm_stat[3] & SESCTL_RQSTFAIL) { + cfg->flag1 |= SAFT_FLG1_ENCPWRFAIL; + } else { + cfg->flag1 &= ~SAFT_FLG1_ENCPWRFAIL; + } + buf[0] = SAFTE_WT_GLOBAL; + buf[1] = cfg->flag1; + buf[2] = cfg->flag2; + buf[3] = 0; + xfer_len = 16; + break; + case 1: + buf[0] = SAFTE_WT_ACTPWS; + buf[1] = idx - cfg->pwroff; + if (req->elm_stat[3] & SESCTL_RQSTON) + buf[2] = 0x01; + else + buf[2] = 0x00; + buf[3] = 0; + xfer_len = 16; + default: + return (EINVAL); + } + break; + case ELMTYP_FAN: + if ((req->elm_stat[3] & 0x7) != 0) + cfg->current_request_stages = 2; + switch (cfg->current_request_stage) { + case 0: + if (req->elm_stat[3] & SESCTL_RQSTFAIL) + cfg->flag1 |= SAFT_FLG1_ENCFANFAIL; + else + cfg->flag1 &= ~SAFT_FLG1_ENCFANFAIL; + buf[0] = SAFTE_WT_GLOBAL; + buf[1] = cfg->flag1; + buf[2] = cfg->flag2; + buf[3] = 0; + xfer_len = 16; + break; + case 1: + buf[0] = SAFTE_WT_FANSPD; + buf[1] = idx; + if (req->elm_stat[3] & SESCTL_RQSTON) { + if ((req->elm_stat[3] & 0x7) == 7) + buf[2] = 4; + else if ((req->elm_stat[3] & 0x7) >= 5) + buf[2] = 3; + else if ((req->elm_stat[3] & 0x7) >= 3) + buf[2] = 2; + else + buf[2] = 1; + } else + buf[2] = 0; + buf[3] = 0; + xfer_len = 16; + ep->encstat[3] = req->elm_stat[3] & 0x67; + default: + return (EINVAL); + } + break; + case ELMTYP_DOORLOCK: + if (req->elm_stat[3] & 0x1) + cfg->flag2 &= ~SAFT_FLG2_LOCKDOOR; + else + cfg->flag2 |= SAFT_FLG2_LOCKDOOR; + buf[0] = SAFTE_WT_GLOBAL; + buf[1] = cfg->flag1; + buf[2] = cfg->flag2; + buf[3] = 0; + xfer_len = 16; + break; + case ELMTYP_ALARM: + if ((req->elm_stat[0] & SESCTL_DISABLE) || + (req->elm_stat[3] & 0x40)) { + cfg->flag2 &= ~SAFT_FLG1_ALARM; + } else if ((req->elm_stat[3] & 0x0f) != 0) { + cfg->flag2 |= SAFT_FLG1_ALARM; + } else { + cfg->flag2 &= ~SAFT_FLG1_ALARM; + } + buf[0] = SAFTE_WT_GLOBAL; + buf[1] = cfg->flag1; + buf[2] = cfg->flag2; + buf[3] = 0; + xfer_len = 16; + ep->encstat[3] = req->elm_stat[3]; + break; + default: + return (EINVAL); + } + } + + if (enc->enc_type == ENC_SEMB_SAFT) { + semb_write_buffer(&ccb->ataio, /*retries*/5, + enc_done, MSG_SIMPLE_Q_TAG, + buf, xfer_len, state->timeout); + } else { + scsi_write_buffer(&ccb->csio, /*retries*/5, + enc_done, MSG_SIMPLE_Q_TAG, 1, + 0, 0, buf, xfer_len, + SSD_FULL_SIZE, state->timeout); + } + return (0); +} + +static int +safte_process_control_request(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + struct scfg *cfg; + safte_control_request_t *req; + int idx, type; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + + req = cfg->current_request; + if (req->result == 0) + req->result = error; + if (++cfg->current_request_stage >= cfg->current_request_stages) { + idx = req->elm_idx; + if (idx == SES_SETSTATUS_ENC_IDX) + type = -1; + else + type = enc->enc_cache.elm_map[idx].enctype; + if (type == ELMTYP_DEVICE || type == ELMTYP_ARRAY_DEV) + enc_update_request(enc, SAFTE_UPDATE_READSLOTSTATUS); + else + enc_update_request(enc, SAFTE_UPDATE_READENCSTATUS); + cfg->current_request = NULL; + wakeup(req); + } else { + enc_update_request(enc, SAFTE_PROCESS_CONTROL_REQS); + } + return (0); +} + +static void +safte_softc_invalidate(enc_softc_t *enc) +{ + struct scfg *cfg; + + cfg = enc->enc_private; + safte_terminate_control_requests(&cfg->requests, ENXIO); +} + +static void +safte_softc_cleanup(enc_softc_t *enc) +{ + + ENC_FREE_AND_NULL(enc->enc_cache.elm_map); + ENC_FREE_AND_NULL(enc->enc_private); + enc->enc_cache.nelms = 0; +} + +static int +safte_init_enc(enc_softc_t *enc) +{ + struct scfg *cfg; + int err; + static char cdb0[6] = { SEND_DIAGNOSTIC }; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + + err = enc_runcmd(enc, cdb0, 6, NULL, 0); + if (err) { + return (err); + } + DELAY(5000); + cfg->flag1 = 0; + cfg->flag2 = 0; + err = safte_set_enc_status(enc, 0, 1); + return (err); +} + +static int +safte_get_enc_status(enc_softc_t *enc, int slpflg) +{ + + return (0); +} + +static int +safte_set_enc_status(enc_softc_t *enc, uint8_t encstat, int slpflag) +{ + struct scfg *cfg; + safte_control_request_t req; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + + req.elm_idx = SES_SETSTATUS_ENC_IDX; + req.elm_stat[0] = encstat & 0xf; + req.result = 0; + + TAILQ_INSERT_TAIL(&cfg->requests, &req, links); + enc_update_request(enc, SAFTE_PROCESS_CONTROL_REQS); + cam_periph_sleep(enc->periph, &req, PUSER, "encstat", 0); + + return (req.result); +} + +static int +safte_get_elm_status(enc_softc_t *enc, encioc_elm_status_t *elms, int slpflg) +{ + int i = (int)elms->elm_idx; + + elms->cstat[0] = enc->enc_cache.elm_map[i].encstat[0]; + elms->cstat[1] = enc->enc_cache.elm_map[i].encstat[1]; + elms->cstat[2] = enc->enc_cache.elm_map[i].encstat[2]; + elms->cstat[3] = enc->enc_cache.elm_map[i].encstat[3]; + return (0); +} + +static int +safte_set_elm_status(enc_softc_t *enc, encioc_elm_status_t *elms, int slpflag) +{ + struct scfg *cfg; + safte_control_request_t req; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + + /* If this is clear, we don't do diddly. */ + if ((elms->cstat[0] & SESCTL_CSEL) == 0) + return (0); + + req.elm_idx = elms->elm_idx; + memcpy(&req.elm_stat, elms->cstat, sizeof(req.elm_stat)); + req.result = 0; + + TAILQ_INSERT_TAIL(&cfg->requests, &req, links); + enc_update_request(enc, SAFTE_PROCESS_CONTROL_REQS); + cam_periph_sleep(enc->periph, &req, PUSER, "encstat", 0); + + return (req.result); +} + +static void +safte_poll_status(enc_softc_t *enc) +{ + + enc_update_request(enc, SAFTE_UPDATE_READENCSTATUS); + enc_update_request(enc, SAFTE_UPDATE_READSLOTSTATUS); +} + +static struct enc_vec safte_enc_vec = +{ + .softc_invalidate = safte_softc_invalidate, + .softc_cleanup = safte_softc_cleanup, + .init_enc = safte_init_enc, + .get_enc_status = safte_get_enc_status, + .set_enc_status = safte_set_enc_status, + .get_elm_status = safte_get_elm_status, + .set_elm_status = safte_set_elm_status, + .poll_status = safte_poll_status +}; + +int +safte_softc_init(enc_softc_t *enc) +{ + struct scfg *cfg; + + enc->enc_vec = safte_enc_vec; + enc->enc_fsm_states = enc_fsm_states; + + if (enc->enc_private == NULL) { + enc->enc_private = ENC_MALLOCZ(SAFT_PRIVATE); + if (enc->enc_private == NULL) + return (ENOMEM); + } + cfg = enc->enc_private; + + enc->enc_cache.nelms = 0; + enc->enc_cache.enc_status = 0; + + TAILQ_INIT(&cfg->requests); + return (0); +} + diff --git a/sys/cam/scsi/scsi_enc_ses.c b/sys/cam/scsi/scsi_enc_ses.c new file mode 100644 index 00000000000..9b6fba30242 --- /dev/null +++ b/sys/cam/scsi/scsi_enc_ses.c @@ -0,0 +1,2816 @@ +/*- + * Copyright (c) 2000 Matthew Jacob + * Copyright (c) 2010 Spectra Logic Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification, immediately at the beginning of the file. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/** + * \file scsi_enc_ses.c + * + * Structures and routines specific && private to SES only + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include + +/* SES Native Type Device Support */ + +/* SES Diagnostic Page Codes */ +typedef enum { + SesSupportedPages = 0x0, + SesConfigPage = 0x1, + SesControlPage = 0x2, + SesStatusPage = SesControlPage, + SesHelpTxt = 0x3, + SesStringOut = 0x4, + SesStringIn = SesStringOut, + SesThresholdOut = 0x5, + SesThresholdIn = SesThresholdOut, + SesArrayControl = 0x6, /* Obsolete in SES v2 */ + SesArrayStatus = SesArrayControl, + SesElementDescriptor = 0x7, + SesShortStatus = 0x8, + SesEnclosureBusy = 0x9, + SesAddlElementStatus = 0xa +} SesDiagPageCodes; + +typedef struct ses_type { + const struct ses_elm_type_desc *hdr; + const char *text; +} ses_type_t; + +typedef struct ses_comstat { + uint8_t comstatus; + uint8_t comstat[3]; +} ses_comstat_t; + +typedef union ses_addl_data { + struct ses_elm_sas_device_phy *sasdev_phys; + struct ses_elm_sas_expander_phy *sasexp_phys; + struct ses_elm_sas_port_phy *sasport_phys; + struct ses_fcobj_port *fc_ports; +} ses_add_data_t; + +typedef struct ses_addl_status { + struct ses_elm_addlstatus_base_hdr *hdr; + union { + union ses_fcobj_hdr *fc; + union ses_elm_sas_hdr *sas; + } proto_hdr; + union ses_addl_data proto_data; /* array sizes stored in header */ +} ses_add_status_t; + +typedef struct ses_element { + uint8_t eip; /* eip bit is set */ + uint16_t descr_len; /* length of the descriptor */ + char *descr; /* descriptor for this object */ + struct ses_addl_status addl; /* additional status info */ +} ses_element_t; + +typedef struct ses_control_request { + int elm_idx; + ses_comstat_t elm_stat; + int result; + TAILQ_ENTRY(ses_control_request) links; +} ses_control_request_t; +TAILQ_HEAD(ses_control_reqlist, ses_control_request); +typedef struct ses_control_reqlist ses_control_reqlist_t; +enum { + SES_SETSTATUS_ENC_IDX = -1 +}; + +static void +ses_terminate_control_requests(ses_control_reqlist_t *reqlist, int result) +{ + ses_control_request_t *req; + + while ((req = TAILQ_FIRST(reqlist)) != NULL) { + TAILQ_REMOVE(reqlist, req, links); + req->result = result; + wakeup(req); + } +} + +enum ses_iter_index_values { + /** + * \brief Value of an initialized but invalid index + * in a ses_iterator object. + * + * This value is used for the individual_element_index of + * overal status elements and for all index types when + * an iterator is first initialized. + */ + ITERATOR_INDEX_INVALID = -1, + + /** + * \brief Value of an index in a ses_iterator object + * when the iterator has traversed past the last + * valid element.. + */ + ITERATOR_INDEX_END = INT_MAX +}; + +/** + * \brief Structure encapsulating all data necessary to traverse the + * elements of a SES configuration. + * + * The ses_iterator object simplifies the task of iterating through all + * elements detected via the SES configuration page by tracking the numerous + * element indexes that, instead of memoizing in the softc, we calculate + * on the fly during the traversal of the element objects. The various + * indexes are necessary due to the varying needs of matching objects in + * the different SES pages. Some pages (e.g. Status/Control) contain all + * elements, while others (e.g. Additional Element Status) only contain + * individual elements (no overal status elements) of particular types. + * + * To use an iterator, initialize it with ses_iter_init(), and then + * use ses_iter_next() to traverse the elements (including the first) in + * the configuration. Once an iterator is initiailized with ses_iter_init(), + * you may also seek to any particular element by either it's global or + * individual element index via the ses_iter_seek_to() function. You may + * also return an iterator to the position just before the first element + * (i.e. the same state as after an ses_iter_init()), with ses_iter_reset(). + */ +struct ses_iterator { + /** + * \brief Backlink to the overal software configuration structure. + * + * This is included for convenience so the iteration functions + * need only take a single, struct ses_iterator *, argument. + */ + enc_softc_t *enc; + + enc_cache_t *cache; + + /** + * \brief Index of the type of the current element within the + * ses_cache's ses_types array. + */ + int type_index; + + /** + * \brief The position (0 based) of this element relative to all other + * elements of this type. + * + * This index resets to zero every time the iterator transitions + * to elements of a new type in the configuration. + */ + int type_element_index; + + /** + * \brief The position (0 based) of this element relative to all + * other individual status elements in the configuration. + * + * This index ranges from 0 through the number of individual + * elements in the configuration. When the iterator returns + * an overall status element, individual_element_index is + * set to ITERATOR_INDEX_INVALID, to indicate that it does + * not apply to the current element. + */ + int individual_element_index; + + /** + * \brief The position (0 based) of this element relative to + * all elements in the configration. + * + * This index is appropriate for indexing into enc->ses_elm_map. + */ + int global_element_index; + + /** + * \brief The last valid individual element index of this + * iterator. + * + * When an iterator traverses an overal status element, the + * individual element index is reset to ITERATOR_INDEX_INVALID + * to prevent unintential use of the individual_element_index + * field. The saved_individual_element_index allows the iterator + * to restore it's position in the individual elements upon + * reaching the next individual element. + */ + int saved_individual_element_index; +}; + +typedef enum { + SES_UPDATE_NONE, + SES_UPDATE_PAGES, + SES_UPDATE_GETCONFIG, + SES_UPDATE_GETSTATUS, + SES_UPDATE_GETELMDESCS, + SES_UPDATE_GETELMADDLSTATUS, + SES_PROCESS_CONTROL_REQS, + SES_PUBLISH_PHYSPATHS, + SES_PUBLISH_CACHE, + SES_NUM_UPDATE_STATES +} ses_update_action; + +static enc_softc_cleanup_t ses_softc_cleanup; + +#define SCSZ 0x8000 + +static fsm_fill_handler_t ses_fill_rcv_diag_io; +static fsm_fill_handler_t ses_fill_control_request; +static fsm_done_handler_t ses_process_pages; +static fsm_done_handler_t ses_process_config; +static fsm_done_handler_t ses_process_status; +static fsm_done_handler_t ses_process_elm_descs; +static fsm_done_handler_t ses_process_elm_addlstatus; +static fsm_done_handler_t ses_process_control_request; +static fsm_done_handler_t ses_publish_physpaths; +static fsm_done_handler_t ses_publish_cache; + +static struct enc_fsm_state enc_fsm_states[SES_NUM_UPDATE_STATES] = +{ + { "SES_UPDATE_NONE", 0, 0, 0, NULL, NULL, NULL }, + { + "SES_UPDATE_PAGES", + SesSupportedPages, + SCSZ, + 60 * 1000, + ses_fill_rcv_diag_io, + ses_process_pages, + enc_error + }, + { + "SES_UPDATE_GETCONFIG", + SesConfigPage, + SCSZ, + 60 * 1000, + ses_fill_rcv_diag_io, + ses_process_config, + enc_error + }, + { + "SES_UPDATE_GETSTATUS", + SesStatusPage, + SCSZ, + 60 * 1000, + ses_fill_rcv_diag_io, + ses_process_status, + enc_error + }, + { + "SES_UPDATE_GETELMDESCS", + SesElementDescriptor, + SCSZ, + 60 * 1000, + ses_fill_rcv_diag_io, + ses_process_elm_descs, + enc_error + }, + { + "SES_UPDATE_GETELMADDLSTATUS", + SesAddlElementStatus, + SCSZ, + 60 * 1000, + ses_fill_rcv_diag_io, + ses_process_elm_addlstatus, + enc_error + }, + { + "SES_PROCESS_CONTROL_REQS", + SesControlPage, + SCSZ, + 60 * 1000, + ses_fill_control_request, + ses_process_control_request, + enc_error + }, + { + "SES_PUBLISH_PHYSPATHS", + 0, + 0, + 0, + NULL, + ses_publish_physpaths, + NULL + }, + { + "SES_PUBLISH_CACHE", + 0, + 0, + 0, + NULL, + ses_publish_cache, + NULL + } +}; + +typedef struct ses_cache { + /* Source for all the configuration data pointers */ + const struct ses_cfg_page *cfg_page; + + /* References into the config page. */ + const struct ses_enc_desc * const *subencs; + uint8_t ses_ntypes; + const ses_type_t *ses_types; + + /* Source for all the status pointers */ + const struct ses_status_page *status_page; + + /* Source for all the object descriptor pointers */ + const struct ses_elem_descr_page *elm_descs_page; + + /* Source for all the additional object status pointers */ + const struct ses_addl_elem_status_page *elm_addlstatus_page; + +} ses_cache_t; + +typedef struct ses_softc { + uint32_t ses_flags; +#define SES_FLAG_TIMEDCOMP 0x01 +#define SES_FLAG_ADDLSTATUS 0x02 + + ses_control_reqlist_t ses_requests; + ses_control_reqlist_t ses_pending_requests; +} ses_softc_t; + +/** + * \brief Reset a SES iterator to just before the first element + * in the configuration. + * + * \param iter The iterator object to reset. + * + * The indexes within a reset iterator are invalid and will only + * become valid upon completion of a ses_iter_seek_to() or a + * ses_iter_next(). + */ +static void +ses_iter_reset(struct ses_iterator *iter) +{ + /* + * Set our indexes to just before the first valid element + * of the first type (ITERATOR_INDEX_INVALID == -1). This + * simplifies the implementation of ses_iter_next(). + */ + iter->type_index = 0; + iter->type_element_index = ITERATOR_INDEX_INVALID; + iter->global_element_index = ITERATOR_INDEX_INVALID; + iter->individual_element_index = ITERATOR_INDEX_INVALID; + iter->saved_individual_element_index = ITERATOR_INDEX_INVALID; +} + +/** + * \brief Initialize the storage of a SES iterator and reset it to + * the position just before the first element of the + * configuration. + * + * \param enc The SES softc for the SES instance whose configuration + * will be enumerated by this iterator. + * \param iter The iterator object to initialize. + */ +static void +ses_iter_init(enc_softc_t *enc, enc_cache_t *cache, struct ses_iterator *iter) +{ + iter->enc = enc; + iter->cache = cache; + ses_iter_reset(iter); +} + +/** + * \brief Traverse the provided SES iterator to the next element + * within the configuraiton. + * + * \param iter The iterator to move. + * + * \return If a valid next element exists, a pointer to it's enc_element_t. + * Otherwise NULL. + */ +static enc_element_t * +ses_iter_next(struct ses_iterator *iter) +{ + ses_cache_t *ses_cache; + const ses_type_t *element_type; + + ses_cache = iter->cache->private; + + /* + * Note: Treat nelms as signed, so we will hit this case + * and immediately terminate the iteration if the + * configuration has 0 objects. + */ + if (iter->global_element_index >= (int)iter->cache->nelms - 1) { + + /* Elements exhausted. */ + iter->type_index = ITERATOR_INDEX_END; + iter->type_element_index = ITERATOR_INDEX_END; + iter->global_element_index = ITERATOR_INDEX_END; + iter->individual_element_index = ITERATOR_INDEX_END; + return (NULL); + } + + KASSERT((iter->type_index < ses_cache->ses_ntypes), + ("Corrupted element iterator. %d not less than %d", + iter->type_index, ses_cache->ses_ntypes)); + + element_type = &ses_cache->ses_types[iter->type_index]; + iter->global_element_index++; + iter->type_element_index++; + + /* + * There is an object for overal type status in addition + * to one for each allowed element, but only if the element + * count is non-zero. + */ + if (iter->type_element_index > element_type->hdr->etype_maxelt) { + + /* + * We've exhausted the elements of this type. + * This next element belongs to the next type. + */ + iter->type_index++; + iter->type_element_index = 0; + iter->saved_individual_element_index + = iter->individual_element_index; + iter->individual_element_index = ITERATOR_INDEX_INVALID; + } + + if (iter->type_element_index > 0) { + if (iter->type_element_index == 1) { + iter->individual_element_index + = iter->saved_individual_element_index; + } + iter->individual_element_index++; + } + + return (&iter->cache->elm_map[iter->global_element_index]); +} + +/** + * Element index types tracked by a SES iterator. + */ +typedef enum { + /** + * Index relative to all elements (overall and individual) + * in the system. + */ + SES_ELEM_INDEX_GLOBAL, + + /** + * \brief Index relative to all individual elements in the system. + * + * This index counts only individual elements, skipping overall + * status elements. This is the index space of the additional + * element status page (page 0xa). + */ + SES_ELEM_INDEX_INDIVIDUAL +} ses_elem_index_type_t; + +/** + * \brief Move the provided iterator forwards or backwards to the object + * having the give index. + * + * \param iter The iterator on which to perform the seek. + * \param element_index The index of the element to find. + * \param index_type The type (global or individual) of element_index. + * + * \return If the element is found, a pointer to it's enc_element_t. + * Otherwise NULL. + */ +static enc_element_t * +ses_iter_seek_to(struct ses_iterator *iter, int element_index, + ses_elem_index_type_t index_type) +{ + enc_element_t *element; + int *cur_index; + + if (index_type == SES_ELEM_INDEX_GLOBAL) + cur_index = &iter->global_element_index; + else + cur_index = &iter->individual_element_index; + + if (*cur_index == element_index) { + /* Already there. */ + return (&iter->cache->elm_map[iter->global_element_index]); + } + + ses_iter_reset(iter); + while ((element = ses_iter_next(iter)) != NULL + && *cur_index != element_index) + ; + + if (*cur_index != element_index) + return (NULL); + + return (element); +} + +#if 0 +static int ses_encode(enc_softc_t *, uint8_t *, int, int, + struct ses_comstat *); +#endif +static int ses_set_timed_completion(enc_softc_t *, uint8_t); +#if 0 +static int ses_putstatus(enc_softc_t *, int, struct ses_comstat *); +#endif + +static void ses_print_addl_data(enc_softc_t *, enc_element_t *); + +/*=========================== SES cleanup routines ===========================*/ + +static void +ses_cache_free_elm_addlstatus(enc_softc_t *enc, enc_cache_t *cache) +{ + ses_cache_t *ses_cache; + ses_cache_t *other_ses_cache; + enc_element_t *cur_elm; + enc_element_t *last_elm; + + ENC_DLOG(enc, "%s: enter\n", __func__); + ses_cache = cache->private; + if (ses_cache->elm_addlstatus_page == NULL) + return; + + for (cur_elm = cache->elm_map, + last_elm = &cache->elm_map[cache->nelms - 1]; + cur_elm <= last_elm; cur_elm++) { + ses_element_t *elmpriv; + + elmpriv = cur_elm->elm_private; + + /* Clear references to the additional status page. */ + bzero(&elmpriv->addl, sizeof(elmpriv->addl)); + } + + other_ses_cache = enc_other_cache(enc, cache)->private; + if (other_ses_cache->elm_addlstatus_page + != ses_cache->elm_addlstatus_page) + ENC_FREE(ses_cache->elm_addlstatus_page); + ses_cache->elm_addlstatus_page = NULL; +} + +static void +ses_cache_free_elm_descs(enc_softc_t *enc, enc_cache_t *cache) +{ + ses_cache_t *ses_cache; + ses_cache_t *other_ses_cache; + enc_element_t *cur_elm; + enc_element_t *last_elm; + + ENC_DLOG(enc, "%s: enter\n", __func__); + ses_cache = cache->private; + if (ses_cache->elm_descs_page == NULL) + return; + + for (cur_elm = cache->elm_map, + last_elm = &cache->elm_map[cache->nelms - 1]; + cur_elm <= last_elm; cur_elm++) { + ses_element_t *elmpriv; + + elmpriv = cur_elm->elm_private; + elmpriv->descr_len = 0; + elmpriv->descr = NULL; + } + + other_ses_cache = enc_other_cache(enc, cache)->private; + if (other_ses_cache->elm_descs_page + != ses_cache->elm_descs_page) + ENC_FREE(ses_cache->elm_descs_page); + ses_cache->elm_descs_page = NULL; +} + +static void +ses_cache_free_status(enc_softc_t *enc, enc_cache_t *cache) +{ + ses_cache_t *ses_cache; + ses_cache_t *other_ses_cache; + + ENC_DLOG(enc, "%s: enter\n", __func__); + ses_cache = cache->private; + if (ses_cache->status_page == NULL) + return; + + other_ses_cache = enc_other_cache(enc, cache)->private; + if (other_ses_cache->status_page != ses_cache->status_page) + ENC_FREE(ses_cache->status_page); + ses_cache->status_page = NULL; +} + +static void +ses_cache_free_elm_map(enc_softc_t *enc, enc_cache_t *cache) +{ + enc_element_t *cur_elm; + enc_element_t *last_elm; + + ENC_DLOG(enc, "%s: enter\n", __func__); + if (cache->elm_map == NULL) + return; + + ses_cache_free_elm_descs(enc, cache); + ses_cache_free_elm_addlstatus(enc, cache); + for (cur_elm = cache->elm_map, + last_elm = &cache->elm_map[cache->nelms - 1]; + cur_elm <= last_elm; cur_elm++) { + + ENC_FREE_AND_NULL(cur_elm->elm_private); + } + ENC_FREE_AND_NULL(cache->elm_map); + cache->nelms = 0; + ENC_DLOG(enc, "%s: exit\n", __func__); +} + +static void +ses_cache_free(enc_softc_t *enc, enc_cache_t *cache) +{ + ses_cache_t *other_ses_cache; + ses_cache_t *ses_cache; + + ENC_DLOG(enc, "%s: enter\n", __func__); + ses_cache_free_elm_addlstatus(enc, cache); + ses_cache_free_status(enc, cache); + ses_cache_free_elm_map(enc, cache); + + ses_cache = cache->private; + ses_cache->ses_ntypes = 0; + + other_ses_cache = enc_other_cache(enc, cache)->private; + if (other_ses_cache->subencs != ses_cache->subencs) + ENC_FREE(ses_cache->subencs); + ses_cache->subencs = NULL; + + if (other_ses_cache->ses_types != ses_cache->ses_types) + ENC_FREE(ses_cache->ses_types); + ses_cache->ses_types = NULL; + + if (other_ses_cache->cfg_page != ses_cache->cfg_page) + ENC_FREE(ses_cache->cfg_page); + ses_cache->cfg_page = NULL; + + ENC_DLOG(enc, "%s: exit\n", __func__); +} + +static void +ses_cache_clone(enc_softc_t *enc, enc_cache_t *src, enc_cache_t *dst) +{ + ses_cache_t *dst_ses_cache; + ses_cache_t *src_ses_cache; + enc_element_t *src_elm; + enc_element_t *dst_elm; + enc_element_t *last_elm; + + ses_cache_free(enc, dst); + src_ses_cache = src->private; + dst_ses_cache = dst->private; + + /* + * The cloned enclosure cache and ses specific cache are + * mostly identical to the source. + */ + *dst = *src; + *dst_ses_cache = *src_ses_cache; + + /* + * But the ses cache storage is still independent. Restore + * the pointer that was clobbered by the structure copy above. + */ + dst->private = dst_ses_cache; + + /* + * The element map is independent even though it starts out + * pointing to the same constant page data. + */ + dst->elm_map = ENC_MALLOCZ(dst->nelms * sizeof(enc_element_t)); + memcpy(dst->elm_map, src->elm_map, dst->nelms * sizeof(enc_element_t)); + for (dst_elm = dst->elm_map, src_elm = src->elm_map, + last_elm = &src->elm_map[src->nelms - 1]; + src_elm <= last_elm; src_elm++, dst_elm++) { + + dst_elm->elm_private = ENC_MALLOCZ(sizeof(ses_element_t)); + memcpy(dst_elm->elm_private, src_elm->elm_private, + sizeof(ses_element_t)); + } +} + +/* Structure accessors. These are strongly typed to avoid errors. */ + +int +ses_elm_sas_descr_type(union ses_elm_sas_hdr *obj) +{ + return ((obj)->base_hdr.byte1 >> 6); +} +int +ses_elm_addlstatus_proto(struct ses_elm_addlstatus_base_hdr *hdr) +{ + return ((hdr)->byte0 & 0xf); +} +int +ses_elm_addlstatus_eip(struct ses_elm_addlstatus_base_hdr *hdr) +{ + return ((hdr)->byte0 >> 4) & 0x1; +} +int +ses_elm_addlstatus_invalid(struct ses_elm_addlstatus_base_hdr *hdr) +{ + return ((hdr)->byte0 >> 7); +} +int +ses_elm_sas_type0_not_all_phys(union ses_elm_sas_hdr *hdr) +{ + return ((hdr)->type0_noneip.byte1 & 0x1); +} +int +ses_elm_sas_dev_phy_sata_dev(struct ses_elm_sas_device_phy *phy) +{ + return ((phy)->target_ports & 0x1); +} +int +ses_elm_sas_dev_phy_sata_port(struct ses_elm_sas_device_phy *phy) +{ + return ((phy)->target_ports >> 7); +} +int +ses_elm_sas_dev_phy_dev_type(struct ses_elm_sas_device_phy *phy) +{ + return (((phy)->byte0 >> 4) & 0x7); +} + +/** + * \brief Verify that the cached configuration data in our softc + * is valid for processing the page data corresponding to + * the provided page header. + * + * \param ses_cache The SES cache to validate. + * \param gen_code The 4 byte generation code from a SES diagnostic + * page header. + * + * \return non-zero if true, 0 if false. + */ +static int +ses_config_cache_valid(ses_cache_t *ses_cache, const uint8_t *gen_code) +{ + uint32_t cache_gc; + uint32_t cur_gc; + + if (ses_cache->cfg_page == NULL) + return (0); + + cache_gc = scsi_4btoul(ses_cache->cfg_page->hdr.gen_code); + cur_gc = scsi_4btoul(gen_code); + return (cache_gc == cur_gc); +} + +/** + * Function signature for consumers of the ses_devids_iter() interface. + */ +typedef void ses_devid_callback_t(enc_softc_t *, enc_element_t *, + struct scsi_vpd_id_descriptor *, void *); + +/** + * \brief Iterate over and create vpd device id records from the + * additional element status data for elm, passing that data + * to the provided callback. + * + * \param enc SES instance containing elm + * \param elm Element for which to extract device ID data. + * \param callback The callback function to invoke on each generated + * device id descriptor for elm. + * \param callback_arg Argument passed through to callback on each invocation. + */ +static void +ses_devids_iter(enc_softc_t *enc, enc_element_t *elm, + ses_devid_callback_t *callback, void *callback_arg) +{ + ses_element_t *elmpriv; + struct ses_addl_status *addl; + u_int i; + size_t devid_record_size; + + elmpriv = elm->elm_private; + addl = &(elmpriv->addl); + + /* + * Don't assume this object has additional status information, or + * that it is a SAS device, or that it is a device slot device. + */ + if (addl->hdr == NULL || addl->proto_hdr.sas == NULL + || addl->proto_data.sasdev_phys == NULL) + return; + + devid_record_size = SVPD_DEVICE_ID_DESC_HDR_LEN + + sizeof(struct scsi_vpd_id_naa_ieee_reg); + for (i = 0; i < addl->proto_hdr.sas->base_hdr.num_phys; i++) { + uint8_t devid_buf[devid_record_size]; + struct scsi_vpd_id_descriptor *devid; + uint8_t *phy_addr; + + devid = (struct scsi_vpd_id_descriptor *)devid_buf; + phy_addr = addl->proto_data.sasdev_phys[i].phy_addr; + devid->proto_codeset = (SCSI_PROTO_SAS << SVPD_ID_PROTO_SHIFT) + | SVPD_ID_CODESET_BINARY; + devid->id_type = SVPD_ID_PIV + | SVPD_ID_ASSOC_PORT + | SVPD_ID_TYPE_NAA; + devid->reserved = 0; + devid->length = sizeof(struct scsi_vpd_id_naa_ieee_reg); + memcpy(devid->identifier, phy_addr, devid->length); + + callback(enc, elm, devid, callback_arg); + } +} + +/** + * Function signature for consumers of the ses_paths_iter() interface. + */ +typedef void ses_path_callback_t(enc_softc_t *, enc_element_t *, + struct cam_path *, void *); + +/** + * Argument package passed through ses_devids_iter() by + * ses_paths_iter() to ses_path_iter_devid_callback(). + */ +typedef struct ses_path_iter_args { + ses_path_callback_t *callback; + void *callback_arg; +} ses_path_iter_args_t; + +/** + * ses_devids_iter() callback function used by ses_paths_iter() + * to map device ids to peripheral driver instances. + * + * \param enc SES instance containing elm + * \param elm Element on which device ID matching is active. + * \param periph A device ID corresponding to elm. + * \param arg Argument passed through to callback on each invocation. + */ +static void +ses_path_iter_devid_callback(enc_softc_t *enc, enc_element_t *elem, + struct scsi_vpd_id_descriptor *devid, + void *arg) +{ + struct ccb_dev_match cdm; + struct dev_match_pattern match_pattern; + struct dev_match_result match_result; + struct device_match_result *device_match; + struct device_match_pattern *device_pattern; + ses_path_iter_args_t *args; + + args = (ses_path_iter_args_t *)arg; + match_pattern.type = DEV_MATCH_DEVICE; + device_pattern = &match_pattern.pattern.device_pattern; + device_pattern->flags = DEV_MATCH_DEVID; + device_pattern->data.devid_pat.id_len = + offsetof(struct scsi_vpd_id_descriptor, identifier) + + devid->length; + memcpy(device_pattern->data.devid_pat.id, devid, + device_pattern->data.devid_pat.id_len); + + memset(&cdm, 0, sizeof(cdm)); + if (xpt_create_path(&cdm.ccb_h.path, /*periph*/NULL, CAM_XPT_PATH_ID, + CAM_TARGET_WILDCARD, + CAM_LUN_WILDCARD) != CAM_REQ_CMP) + return; + + cdm.ccb_h.func_code = XPT_DEV_MATCH; + cdm.num_patterns = 1; + cdm.patterns = &match_pattern; + cdm.pattern_buf_len = sizeof(match_pattern); + cdm.match_buf_len = sizeof(match_result); + cdm.matches = &match_result; + + xpt_action((union ccb *)&cdm); + xpt_free_path(cdm.ccb_h.path); + + if ((cdm.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP + || (cdm.status != CAM_DEV_MATCH_LAST + && cdm.status != CAM_DEV_MATCH_MORE) + || cdm.num_matches == 0) + return; + + device_match = &match_result.result.device_result; + if (xpt_create_path(&cdm.ccb_h.path, /*periph*/NULL, + device_match->path_id, + device_match->target_id, + device_match->target_lun) != CAM_REQ_CMP) + return; + + args->callback(enc, elem, cdm.ccb_h.path, args->callback_arg); + xpt_free_path(cdm.ccb_h.path); +} + +/** + * \brief Iterate over and find the matching periph objects for the + * specified element. + * + * \param enc SES instance containing elm + * \param elm Element for which to perform periph object matching. + * \param callback The callback function to invoke with each matching + * periph object. + * \param callback_arg Argument passed through to callback on each invocation. + */ +static void +ses_paths_iter(enc_softc_t *enc, enc_element_t *elm, + ses_path_callback_t *callback, void *callback_arg) +{ + ses_path_iter_args_t args; + + args.callback = callback; + args.callback_arg = callback_arg; + ses_devids_iter(enc, elm, ses_path_iter_devid_callback, &args); +} + +/** + * ses_paths_iter() callback function used by ses_get_elmdevname() + * to record periph driver instance strings corresponding to a SES + * element. + * + * \param enc SES instance containing elm + * \param elm Element on which periph matching is active. + * \param periph A periph instance that matches elm. + * \param arg Argument passed through to callback on each invocation. + */ +static void +ses_elmdevname_callback(enc_softc_t *enc, enc_element_t *elem, + struct cam_path *path, void *arg) +{ + struct sbuf *sb; + + sb = (struct sbuf *)arg; + cam_periph_list(path, sb); +} + +/** + * Argument package passed through ses_paths_iter() to + * ses_getcampath_callback. + */ +typedef struct ses_setphyspath_callback_args { + struct sbuf *physpath; + int num_set; +} ses_setphyspath_callback_args_t; + +/** + * \brief ses_paths_iter() callback to set the physical path on the + * CAM EDT entries corresponding to a given SES element. + * + * \param enc SES instance containing elm + * \param elm Element on which periph matching is active. + * \param periph A periph instance that matches elm. + * \param arg Argument passed through to callback on each invocation. + */ +static void +ses_setphyspath_callback(enc_softc_t *enc, enc_element_t *elm, + struct cam_path *path, void *arg) +{ + struct ccb_dev_advinfo cdai; + ses_setphyspath_callback_args_t *args; + char *old_physpath; + + args = (ses_setphyspath_callback_args_t *)arg; + old_physpath = malloc(MAXPATHLEN, M_SCSIENC, M_WAITOK|M_ZERO); + + xpt_setup_ccb(&cdai.ccb_h, path, CAM_PRIORITY_NORMAL); + cdai.ccb_h.func_code = XPT_DEV_ADVINFO; + cdai.buftype = CDAI_TYPE_PHYS_PATH; + cdai.flags = 0; + cdai.bufsiz = MAXPATHLEN; + cdai.buf = old_physpath; + xpt_action((union ccb *)&cdai); + if ((cdai.ccb_h.status & CAM_DEV_QFRZN) != 0) + cam_release_devq(cdai.ccb_h.path, 0, 0, 0, FALSE); + + if (strcmp(old_physpath, sbuf_data(args->physpath)) != 0) { + + xpt_setup_ccb(&cdai.ccb_h, path, CAM_PRIORITY_NORMAL); + cdai.ccb_h.func_code = XPT_DEV_ADVINFO; + cdai.buftype = CDAI_TYPE_PHYS_PATH; + cdai.flags |= CDAI_FLAG_STORE; + cdai.bufsiz = sbuf_len(args->physpath); + cdai.buf = sbuf_data(args->physpath); + xpt_action((union ccb *)&cdai); + if ((cdai.ccb_h.status & CAM_DEV_QFRZN) != 0) + cam_release_devq(cdai.ccb_h.path, 0, 0, 0, FALSE); + if (cdai.ccb_h.status == CAM_REQ_CMP) + args->num_set++; + } + free(old_physpath, M_SCSIENC); +} + +/** + * \brief Set a device's physical path string in CAM XPT. + * + * \param enc SES instance containing elm + * \param elm Element to publish physical path string for + * \param iter Iterator whose state corresponds to elm + * + * \return 0 on success, errno otherwise. + */ +static int +ses_set_physpath(enc_softc_t *enc, enc_element_t *elm, + struct ses_iterator *iter) +{ + struct ccb_dev_advinfo cdai; + ses_setphyspath_callback_args_t args; + int ret; + struct sbuf sb; + uint8_t *devid, *elmaddr; + ses_element_t *elmpriv; + + ret = EIO; + devid = NULL; + + /* + * Assemble the components of the physical path starting with + * the device ID of the enclosure itself. + */ + xpt_setup_ccb(&cdai.ccb_h, enc->periph->path, CAM_PRIORITY_NORMAL); + cdai.ccb_h.func_code = XPT_DEV_ADVINFO; + cdai.buftype = CDAI_TYPE_SCSI_DEVID; + cdai.bufsiz = CAM_SCSI_DEVID_MAXLEN; + cdai.buf = devid = ENC_MALLOCZ(cdai.bufsiz); + if (devid == NULL) { + ret = ENOMEM; + goto out; + } + xpt_action((union ccb *)&cdai); + if ((cdai.ccb_h.status & CAM_DEV_QFRZN) != 0) + cam_release_devq(cdai.ccb_h.path, 0, 0, 0, FALSE); + if (cdai.ccb_h.status != CAM_REQ_CMP) + goto out; + + elmaddr = scsi_get_devid((struct scsi_vpd_device_id *)cdai.buf, + cdai.provsiz, scsi_devid_is_naa_ieee_reg); + if (elmaddr == NULL) + goto out; + + if (sbuf_new(&sb, NULL, 128, SBUF_AUTOEXTEND) == NULL) { + ret = ENOMEM; + goto out; + } + /* Next, generate the physical path string */ + sbuf_printf(&sb, "id1,enc@n%jx/type@%x/slot@%x", + scsi_8btou64(elmaddr), iter->type_index, + iter->type_element_index); + /* Append the element descriptor if one exists */ + elmpriv = elm->elm_private; + if (elmpriv->descr != NULL && elmpriv->descr_len > 0) { + sbuf_cat(&sb, "/elmdesc@"); + sbuf_bcat(&sb, elmpriv->descr, elmpriv->descr_len); + } + sbuf_finish(&sb); + + /* + * Set this physical path on any CAM devices with a device ID + * descriptor that matches one created from the SES additional + * status data for this element. + */ + args.physpath= &sb; + args.num_set = 0; + ses_paths_iter(enc, elm, ses_setphyspath_callback, &args); + sbuf_delete(&sb); + + ret = args.num_set == 0 ? ENOENT : 0; + +out: + if (devid != NULL) + ENC_FREE(devid); + return (ret); +} + +/** + * \brief Helper to set the CDB fields appropriately. + * + * \param cdb Buffer containing the cdb. + * \param pagenum SES diagnostic page to query for. + * \param dir Direction of query. + */ +static void +ses_page_cdb(char *cdb, int bufsiz, SesDiagPageCodes pagenum, int dir) +{ + + /* Ref: SPC-4 r25 Section 6.20 Table 223 */ + if (dir == CAM_DIR_IN) { + cdb[0] = RECEIVE_DIAGNOSTIC; + cdb[1] = 1; /* Set page code valid bit */ + cdb[2] = pagenum; + } else { + cdb[0] = SEND_DIAGNOSTIC; + cdb[1] = 0x10; + cdb[2] = pagenum; + } + cdb[3] = bufsiz >> 8; /* high bits */ + cdb[4] = bufsiz & 0xff; /* low bits */ + cdb[5] = 0; +} + +/** + * \brief Discover whether this instance supports timed completion of a + * RECEIVE DIAGNOSTIC RESULTS command requesting the Enclosure Status + * page, and store the result in the softc, updating if necessary. + * + * \param enc SES instance to query and update. + * \param tc_en Value of timed completion to set (see \return). + * + * \return 1 if timed completion enabled, 0 otherwise. + */ +static int +ses_set_timed_completion(enc_softc_t *enc, uint8_t tc_en) +{ + int err; + union ccb *ccb; + struct cam_periph *periph; + struct ses_mgmt_mode_page *mgmt; + uint8_t *mode_buf; + size_t mode_buf_len; + ses_softc_t *ses; + + periph = enc->periph; + ses = enc->enc_private; + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); + + mode_buf_len = sizeof(struct ses_mgmt_mode_page); + mode_buf = ENC_MALLOCZ(mode_buf_len); + if (mode_buf == NULL) + goto out; + + scsi_mode_sense(&ccb->csio, /*retries*/4, enc_done, MSG_SIMPLE_Q_TAG, + /*dbd*/FALSE, SMS_PAGE_CTRL_CURRENT, SES_MGMT_MODE_PAGE_CODE, + mode_buf, mode_buf_len, SSD_FULL_SIZE, /*timeout*/60 * 1000); + + /* + * Ignore illegal request errors, as they are quite common and we + * will print something out in that case anyway. + */ + err = cam_periph_runccb(ccb, enc_error, ENC_CFLAGS, + ENC_FLAGS|SF_QUIET_IR, NULL); + if (ccb->ccb_h.status != CAM_REQ_CMP) { + ENC_LOG(enc, "Timed Completion Unsupported\n"); + goto release; + } + + /* Skip the mode select if the desired value is already set */ + mgmt = (struct ses_mgmt_mode_page *)mode_buf; + if ((mgmt->byte5 & SES_MGMT_TIMED_COMP_EN) == tc_en) + goto done; + + /* Value is not what we wanted, set it */ + if (tc_en) + mgmt->byte5 |= SES_MGMT_TIMED_COMP_EN; + else + mgmt->byte5 &= ~SES_MGMT_TIMED_COMP_EN; + /* SES2r20: a completion time of zero means as long as possible */ + bzero(&mgmt->max_comp_time, sizeof(mgmt->max_comp_time)); + + scsi_mode_select(&ccb->csio, 5, enc_done, MSG_SIMPLE_Q_TAG, + /*page_fmt*/FALSE, /*save_pages*/TRUE, mode_buf, mode_buf_len, + SSD_FULL_SIZE, /*timeout*/60 * 1000); + + err = cam_periph_runccb(ccb, enc_error, ENC_CFLAGS, ENC_FLAGS, NULL); + if (ccb->ccb_h.status != CAM_REQ_CMP) { + ENC_LOG(enc, "Timed Completion Set Failed\n"); + goto release; + } + +done: + if ((mgmt->byte5 & SES_MGMT_TIMED_COMP_EN) != 0) { + ENC_LOG(enc, "Timed Completion Enabled\n"); + ses->ses_flags |= SES_FLAG_TIMEDCOMP; + } else { + ENC_LOG(enc, "Timed Completion Disabled\n"); + ses->ses_flags &= ~SES_FLAG_TIMEDCOMP; + } +release: + ENC_FREE(mode_buf); + xpt_release_ccb(ccb); +out: + return (ses->ses_flags & SES_FLAG_TIMEDCOMP); +} + +/** + * \brief Process the list of supported pages and update flags. + * + * \param enc SES device to query. + * \param buf Buffer containing the config page. + * \param xfer_len Length of the config page in the buffer. + * + * \return 0 on success, errno otherwise. + */ +static int +ses_process_pages(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + ses_softc_t *ses; + struct scsi_diag_page *page; + int err, i, length; + + CAM_DEBUG(enc->periph->path, CAM_DEBUG_SUBTRACE, + ("entering %s(%p, %d)\n", __func__, bufp, xfer_len)); + ses = enc->enc_private; + err = -1; + + if (error != 0) { + err = error; + goto out; + } + if (xfer_len < sizeof(*page)) { + ENC_LOG(enc, "Unable to parse Diag Pages List Header\n"); + err = EIO; + goto out; + } + page = (struct scsi_diag_page *)*bufp; + length = scsi_2btoul(page->length); + if (length + offsetof(struct scsi_diag_page, params) > xfer_len) { + ENC_LOG(enc, "Diag Pages List Too Long\n"); + goto out; + } + ENC_DLOG(enc, "%s: page length %d, xfer_len %d\n", + __func__, length, xfer_len); + + err = 0; + for (i = 0; i < length; i++) { + if (page->params[i] == SesAddlElementStatus) { + ses->ses_flags |= SES_FLAG_ADDLSTATUS; + break; + } + } + +out: + ENC_DLOG(enc, "%s: exiting with err %d\n", __func__, err); + return (err); +} + +/** + * \brief Process the config page and update associated structures. + * + * \param enc SES device to query. + * \param buf Buffer containing the config page. + * \param xfer_len Length of the config page in the buffer. + * + * \return 0 on success, errno otherwise. + */ +static int +ses_process_config(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + struct ses_iterator iter; + ses_softc_t *ses; + enc_cache_t *enc_cache; + ses_cache_t *ses_cache; + uint8_t *buf; + int length; + int err; + int nelm; + int ntype; + struct ses_cfg_page *cfg_page; + struct ses_enc_desc *buf_subenc; + const struct ses_enc_desc **subencs; + const struct ses_enc_desc **cur_subenc; + const struct ses_enc_desc **last_subenc; + ses_type_t *ses_types; + ses_type_t *sestype; + const struct ses_elm_type_desc *cur_buf_type; + const struct ses_elm_type_desc *last_buf_type; + uint8_t *last_valid_byte; + enc_element_t *element; + const char *type_text; + + CAM_DEBUG(enc->periph->path, CAM_DEBUG_SUBTRACE, + ("entering %s(%p, %d)\n", __func__, bufp, xfer_len)); + ses = enc->enc_private; + enc_cache = &enc->enc_daemon_cache; + ses_cache = enc_cache->private; + buf = *bufp; + err = -1;; + + if (error != 0) { + err = error; + goto out; + } + if (xfer_len < sizeof(cfg_page->hdr)) { + ENC_LOG(enc, "Unable to parse SES Config Header\n"); + err = EIO; + goto out; + } + + cfg_page = (struct ses_cfg_page *)buf; + length = ses_page_length(&cfg_page->hdr); + if (length > xfer_len) { + ENC_LOG(enc, "Enclosure Config Page Too Long\n"); + goto out; + } + last_valid_byte = &buf[length - 1]; + + ENC_DLOG(enc, "%s: total page length %d, xfer_len %d\n", + __func__, length, xfer_len); + + err = 0; + if (ses_config_cache_valid(ses_cache, cfg_page->hdr.gen_code)) { + + /* Our cache is still valid. Proceed to fetching status. */ + goto out; + } + + /* Cache is no longer valid. Free old data to make way for new. */ + ses_cache_free(enc, enc_cache); + ENC_VLOG(enc, "Generation Code 0x%x has %d SubEnclosures\n", + scsi_4btoul(cfg_page->hdr.gen_code), + ses_cfg_page_get_num_subenc(cfg_page)); + + /* Take ownership of the buffer. */ + ses_cache->cfg_page = cfg_page; + *bufp = NULL; + + /* + * Now waltz through all the subenclosures summing the number of + * types available in each. + */ + subencs = ENC_MALLOCZ(ses_cfg_page_get_num_subenc(cfg_page) + * sizeof(*subencs)); + if (subencs == NULL) { + err = ENOMEM; + goto out; + } + /* + * Sub-enclosure data is const after construction (i.e. when + * accessed via our cache object. + * + * The cast here is not required in C++ but C99 is not so + * sophisticated (see C99 6.5.16.1(1)). + */ + ses_cache->subencs = subencs; + + buf_subenc = cfg_page->subencs; + cur_subenc = subencs; + last_subenc = &subencs[ses_cfg_page_get_num_subenc(cfg_page) - 1]; + ntype = 0; + while (cur_subenc <= last_subenc) { + + if (!ses_enc_desc_is_complete(buf_subenc, last_valid_byte)) { + ENC_LOG(enc, "Enclosure %d Beyond End of " + "Descriptors\n", cur_subenc - subencs); + err = EIO; + goto out; + } + + ENC_VLOG(enc, " SubEnclosure ID %d, %d Types With this ID, " + "Descriptor Length %d, offset %d\n", buf_subenc->subenc_id, + buf_subenc->num_types, buf_subenc->length, + &buf_subenc->byte0 - buf); + ENC_VLOG(enc, "WWN: %jx\n", + (uintmax_t)scsi_8btou64(buf_subenc->logical_id)); + + ntype += buf_subenc->num_types; + *cur_subenc = buf_subenc; + cur_subenc++; + buf_subenc = ses_enc_desc_next(buf_subenc); + } + + /* Process the type headers. */ + ses_types = ENC_MALLOCZ(ntype * sizeof(*ses_types)); + if (ses_types == NULL) { + err = ENOMEM; + goto out; + } + /* + * Type data is const after construction (i.e. when accessed via + * our cache object. + */ + ses_cache->ses_types = ses_types; + + cur_buf_type = (const struct ses_elm_type_desc *) + (&(*last_subenc)->length + (*last_subenc)->length + 1); + last_buf_type = cur_buf_type + ntype - 1; + type_text = (const uint8_t *)(last_buf_type + 1); + nelm = 0; + sestype = ses_types; + while (cur_buf_type <= last_buf_type) { + if (&cur_buf_type->etype_txt_len > last_valid_byte) { + ENC_LOG(enc, "Runt Enclosure Type Header %d\n", + sestype - ses_types); + err = EIO; + goto out; + } + sestype->hdr = cur_buf_type; + sestype->text = type_text; + type_text += cur_buf_type->etype_txt_len; + ENC_LOG(enc, " Type Desc[%d]: Type 0x%x, MaxElt %d, In Subenc " + "%d, Text Length %d: %.*s\n", sestype - ses_types, + sestype->hdr->etype_elm_type, sestype->hdr->etype_maxelt, + sestype->hdr->etype_subenc, sestype->hdr->etype_txt_len, + sestype->hdr->etype_txt_len, sestype->text); + + nelm += sestype->hdr->etype_maxelt + + /*overall status element*/1; + sestype++; + cur_buf_type++; + } + + /* Create the object map. */ + enc_cache->elm_map = ENC_MALLOCZ(nelm * sizeof(enc_element_t)); + if (enc_cache->elm_map == NULL) { + err = ENOMEM; + goto out; + } + ses_cache->ses_ntypes = (uint8_t)ntype; + enc_cache->nelms = nelm; + + ses_iter_init(enc, enc_cache, &iter); + while ((element = ses_iter_next(&iter)) != NULL) { + const struct ses_elm_type_desc *thdr; + + ENC_DLOG(enc, "%s: checking obj %d(%d,%d)\n", __func__, + iter.global_element_index, iter.type_index, nelm, + iter.type_element_index); + thdr = ses_cache->ses_types[iter.type_index].hdr; + element->subenclosure = thdr->etype_subenc; + element->enctype = thdr->etype_elm_type; + element->overall_status_elem = iter.type_element_index == 0; + element->elm_private = ENC_MALLOCZ(sizeof(ses_element_t)); + if (element->elm_private == NULL) { + err = ENOMEM; + goto out; + } + ENC_DLOG(enc, "%s: creating elmpriv %d(%d,%d) subenc %d " + "type 0x%x\n", __func__, iter.global_element_index, + iter.type_index, iter.type_element_index, + thdr->etype_subenc, thdr->etype_elm_type); + } + + err = 0; + +out: + if (err) + ses_softc_cleanup(enc); + else { + enc_update_request(enc, SES_UPDATE_GETSTATUS); + enc_update_request(enc, SES_UPDATE_GETELMDESCS); + if (ses->ses_flags & SES_FLAG_ADDLSTATUS) + enc_update_request(enc, SES_UPDATE_GETELMADDLSTATUS); + enc_update_request(enc, SES_PUBLISH_CACHE); + } + ENC_DLOG(enc, "%s: exiting with err %d\n", __func__, err); + return (err); +} + +/** + * \brief Update the status page and associated structures. + * + * \param enc SES softc to update for. + * \param buf Buffer containing the status page. + * \param bufsz Amount of data in the buffer. + * + * \return 0 on success, errno otherwise. + */ +static int +ses_process_status(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + struct ses_iterator iter; + enc_element_t *element; + ses_softc_t *ses; + enc_cache_t *enc_cache; + ses_cache_t *ses_cache; + uint8_t *buf; + int err = -1; + int length; + struct ses_status_page *page; + union ses_status_element *cur_stat; + union ses_status_element *last_stat; + + ses = enc->enc_private; + enc_cache = &enc->enc_daemon_cache; + ses_cache = enc_cache->private; + buf = *bufp; + + ENC_DLOG(enc, "%s: enter (%p, %p, %d)\n", __func__, enc, buf, xfer_len); + page = (struct ses_status_page *)buf; + length = ses_page_length(&page->hdr); + + if (error != 0) { + err = error; + goto out; + } + /* + * Make sure the length fits in the buffer. + * + * XXX all this means is that the page is larger than the space + * we allocated. Since we use a statically sized buffer, this + * could happen... Need to use dynamic discovery of the size. + */ + if (length > xfer_len) { + ENC_LOG(enc, "Enclosure Status Page Too Long\n"); + goto out; + } + /* Make sure the length contains at least one header and status */ + if (length < (sizeof(*page) + sizeof(*page->elements))) { + ENC_LOG(enc, "Enclosure Status Page Too Short\n"); + goto out; + } + + if (!ses_config_cache_valid(ses_cache, page->hdr.gen_code)) { + ENC_DLOG(enc, "%s: Generation count change detected\n", + __func__); + enc_update_request(enc, SES_UPDATE_GETCONFIG); + goto out; + } + + ses_cache_free_status(enc, enc_cache); + ses_cache->status_page = page; + *bufp = NULL; + + enc_cache->enc_status = page->hdr.page_specific_flags; + + /* + * Read in individual element status. The element order + * matches the order reported in the config page (i.e. the + * order of an unfiltered iteration of the config objects).. + */ + ses_iter_init(enc, enc_cache, &iter); + cur_stat = page->elements; + last_stat = (union ses_status_element *) + &buf[length - sizeof(*last_stat)]; + ENC_DLOG(enc, "%s: total page length %d, xfer_len %d\n", + __func__, length, xfer_len); + while (cur_stat <= last_stat + && (element = ses_iter_next(&iter)) != NULL) { + + ENC_DLOG(enc, "%s: obj %d(%d,%d) off=0x%tx status=%jx\n", + __func__, iter.global_element_index, iter.type_index, + iter.type_element_index, (uint8_t *)cur_stat - buf, + scsi_4btoul(cur_stat->bytes)); + + memcpy(&element->encstat, cur_stat, sizeof(element->encstat)); + element->svalid = 1; + cur_stat++; + } + + if (ses_iter_next(&iter) != NULL) { + ENC_LOG(enc, "Status page, length insufficient for " + "expected number of objects\n"); + } else { + if (cur_stat <= last_stat) + ENC_LOG(enc, "Status page, exhausted objects before " + "exhausing page\n"); + enc_update_request(enc, SES_PUBLISH_CACHE); + err = 0; + } +out: + ENC_DLOG(enc, "%s: exiting with error %d\n", __func__, err); + return (err); +} + +typedef enum { + /** + * The enclosure should not provide additional element + * status for this element type in page 0x0A. + * + * \note This status is returned for any types not + * listed SES3r02. Further types added in a + * future specification will be incorrectly + * classified. + */ + TYPE_ADDLSTATUS_NONE, + + /** + * The element type provides additional element status + * in page 0x0A. + */ + TYPE_ADDLSTATUS_MANDATORY, + + /** + * The element type may provide additional element status + * in page 0x0A, but i + */ + TYPE_ADDLSTATUS_OPTIONAL +} ses_addlstatus_avail_t; + +/** + * \brief Check to see whether a given type (as obtained via type headers) is + * supported by the additional status command. + * + * \param enc SES softc to check. + * \param typidx Type index to check for. + * + * \return An enumeration indicating if additional status is mandatory, + * optional, or not required for this type. + */ +static ses_addlstatus_avail_t +ses_typehasaddlstatus(enc_softc_t *enc, uint8_t typidx) +{ + enc_cache_t *enc_cache; + ses_cache_t *ses_cache; + + enc_cache = &enc->enc_daemon_cache; + ses_cache = enc_cache->private; + switch(ses_cache->ses_types[typidx].hdr->etype_elm_type) { + case ELMTYP_DEVICE: + case ELMTYP_ARRAY_DEV: + case ELMTYP_SAS_EXP: + return (TYPE_ADDLSTATUS_MANDATORY); + case ELMTYP_SCSI_INI: + case ELMTYP_SCSI_TGT: + case ELMTYP_ESCC: + return (TYPE_ADDLSTATUS_OPTIONAL); + default: + /* No additional status information available. */ + break; + } + return (TYPE_ADDLSTATUS_NONE); +} + +static int ses_get_elm_addlstatus_fc(enc_softc_t *, enc_cache_t *, + uint8_t *, int); +static int ses_get_elm_addlstatus_sas(enc_softc_t *, enc_cache_t *, uint8_t *, + int, int, int, int); + +/** + * \brief Parse the additional status element data for each object. + * + * \param enc The SES softc to update. + * \param buf The buffer containing the additional status + * element response. + * \param xfer_len Size of the buffer. + * + * \return 0 on success, errno otherwise. + */ +static int +ses_process_elm_addlstatus(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + struct ses_iterator iter, titer; + int eip; + int err; + int ignore_index = 0; + int length; + int offset; + enc_cache_t *enc_cache; + ses_cache_t *ses_cache; + uint8_t *buf; + ses_element_t *elmpriv; + const struct ses_page_hdr *hdr; + enc_element_t *element, *telement; + + enc_cache = &enc->enc_daemon_cache; + ses_cache = enc_cache->private; + buf = *bufp; + err = -1; + + if (error != 0) { + err = error; + goto out; + } + ses_cache_free_elm_addlstatus(enc, enc_cache); + ses_cache->elm_addlstatus_page = + (struct ses_addl_elem_status_page *)buf; + *bufp = NULL; + + /* + * The objects appear in the same order here as in Enclosure Status, + * which itself is ordered by the Type Descriptors from the Config + * page. However, it is necessary to skip elements that are not + * supported by this page when counting them. + */ + hdr = &ses_cache->elm_addlstatus_page->hdr; + length = ses_page_length(hdr); + ENC_DLOG(enc, "Additional Element Status Page Length 0x%x\n", length); + /* Make sure the length includes at least one header. */ + if (length < sizeof(*hdr)+sizeof(struct ses_elm_addlstatus_base_hdr)) { + ENC_LOG(enc, "Runt Additional Element Status Page\n"); + goto out; + } + if (length > xfer_len) { + ENC_LOG(enc, "Additional Element Status Page Too Long\n"); + goto out; + } + + if (!ses_config_cache_valid(ses_cache, hdr->gen_code)) { + ENC_DLOG(enc, "%s: Generation count change detected\n", + __func__); + enc_update_request(enc, SES_UPDATE_GETCONFIG); + goto out; + } + + offset = sizeof(struct ses_page_hdr); + ses_iter_init(enc, enc_cache, &iter); + while (offset < length + && (element = ses_iter_next(&iter)) != NULL) { + struct ses_elm_addlstatus_base_hdr *elm_hdr; + int proto_info_len; + ses_addlstatus_avail_t status_type; + + /* + * Additional element status is only provided for + * individual elements (i.e. overal status elements + * are excluded) and those of the types specified + * in the SES spec. + */ + status_type = ses_typehasaddlstatus(enc, iter.type_index); + if (iter.individual_element_index == ITERATOR_INDEX_INVALID + || status_type == TYPE_ADDLSTATUS_NONE) + continue; + + elm_hdr = (struct ses_elm_addlstatus_base_hdr *)&buf[offset]; + eip = ses_elm_addlstatus_eip(elm_hdr); + if (eip && !ignore_index) { + struct ses_elm_addlstatus_eip_hdr *eip_hdr; + int expected_index; + + eip_hdr = (struct ses_elm_addlstatus_eip_hdr *)elm_hdr; + expected_index = iter.individual_element_index; + titer = iter; + telement = ses_iter_seek_to(&titer, + eip_hdr->element_index, + SES_ELEM_INDEX_INDIVIDUAL); + if (telement != NULL && + (ses_typehasaddlstatus(enc, titer.type_index) != + TYPE_ADDLSTATUS_NONE || + titer.type_index > ELMTYP_SAS_CONN)) { + iter = titer; + element = telement; + } else + ignore_index = 1; + + if (iter.individual_element_index > expected_index + && status_type == TYPE_ADDLSTATUS_MANDATORY) { + ENC_LOG(enc, "%s: provided element " + "index %d skips mandatory status " + " element at index %d\n", + __func__, eip_hdr->element_index, + expected_index); + } + } + elmpriv = element->elm_private; + elmpriv->addl.hdr = elm_hdr; + ENC_DLOG(enc, "%s: global element index=%d, type index=%d " + "type element index=%d, offset=0x%x, " + "byte0=0x%x, length=0x%x\n", __func__, + iter.global_element_index, iter.type_index, + iter.type_element_index, offset, elmpriv->addl.hdr->byte0, + elmpriv->addl.hdr->length); + + /* Skip to after the length field */ + offset += sizeof(struct ses_elm_addlstatus_base_hdr); + + /* Make sure the descriptor is within bounds */ + if ((offset + elmpriv->addl.hdr->length) > length) { + ENC_LOG(enc, "Element %d Beyond End " + "of Additional Element Status Descriptors\n", + iter.global_element_index); + err = EIO; + goto out; + } + + /* Advance to the protocol data, skipping eip bytes if needed */ + offset += (eip * SES_EIP_HDR_EXTRA_LEN); + proto_info_len = elmpriv->addl.hdr->length + - (eip * SES_EIP_HDR_EXTRA_LEN); + + /* Errors in this block are ignored as they are non-fatal */ + switch(ses_elm_addlstatus_proto(elmpriv->addl.hdr)) { + case SPSP_PROTO_FC: + if (elmpriv->addl.hdr->length == 0) + break; + ses_get_elm_addlstatus_fc(enc, enc_cache, + &buf[offset], proto_info_len); + break; + case SPSP_PROTO_SAS: + if (elmpriv->addl.hdr->length <= 2) + break; + ses_get_elm_addlstatus_sas(enc, enc_cache, + &buf[offset], + proto_info_len, + eip, iter.type_index, + iter.global_element_index); + break; + default: + ENC_LOG(enc, "Element %d: Unknown Additional Element " + "Protocol 0x%x\n", iter.global_element_index, + ses_elm_addlstatus_proto(elmpriv->addl.hdr)); + goto out; + } + + offset += proto_info_len; + } + err = 0; +out: + if (err) + ses_cache_free_elm_addlstatus(enc, enc_cache); + enc_update_request(enc, SES_PUBLISH_PHYSPATHS); + enc_update_request(enc, SES_PUBLISH_CACHE); + return (err); +} + +static int +ses_process_control_request(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + ses_softc_t *ses; + + ses = enc->enc_private; + /* + * Possible errors: + * o Generation count wrong. + * o Some SCSI status error. + */ + ses_terminate_control_requests(&ses->ses_pending_requests, error); + enc_update_request(enc, SES_UPDATE_GETSTATUS); + return (0); +} + +static int +ses_publish_physpaths(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + struct ses_iterator iter; + enc_cache_t *enc_cache; + ses_cache_t *ses_cache; + enc_element_t *element; + + enc_cache = &enc->enc_daemon_cache; + ses_cache = enc_cache->private; + + ses_iter_init(enc, enc_cache, &iter); + while ((element = ses_iter_next(&iter)) != NULL) { + /* + * ses_set_physpath() returns success if we changed + * the physpath of any element. This allows us to + * only announce devices once regardless of how + * many times we process additional element status. + */ + if (ses_set_physpath(enc, element, &iter) == 0) + ses_print_addl_data(enc, element); + } + + return (0); +} + +static int +ses_publish_cache(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + + sx_xlock(&enc->enc_cache_lock); + ses_cache_clone(enc, /*src*/&enc->enc_daemon_cache, + /*dst*/&enc->enc_cache); + sx_xunlock(&enc->enc_cache_lock); + + return (0); +} + +/** + * \brief Parse the descriptors for each object. + * + * \param enc The SES softc to update. + * \param buf The buffer containing the descriptor list response. + * \param xfer_len Size of the buffer. + * + * \return 0 on success, errno otherwise. + */ +static int +ses_process_elm_descs(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) +{ + ses_softc_t *ses; + struct ses_iterator iter; + enc_element_t *element; + int err; + int offset; + u_long length, plength; + enc_cache_t *enc_cache; + ses_cache_t *ses_cache; + uint8_t *buf; + ses_element_t *elmpriv; + const struct ses_page_hdr *phdr; + const struct ses_elm_desc_hdr *hdr; + + ses = enc->enc_private; + enc_cache = &enc->enc_daemon_cache; + ses_cache = enc_cache->private; + buf = *bufp; + err = -1; + + if (error != 0) { + err = error; + goto out; + } + ses_cache_free_elm_descs(enc, enc_cache); + ses_cache->elm_descs_page = (struct ses_elem_descr_page *)buf; + *bufp = NULL; + + phdr = &ses_cache->elm_descs_page->hdr; + plength = ses_page_length(phdr); + if (xfer_len < sizeof(struct ses_page_hdr)) { + ENC_LOG(enc, "Runt Element Descriptor Page\n"); + goto out; + } + if (plength > xfer_len) { + ENC_LOG(enc, "Element Descriptor Page Too Long\n"); + goto out; + } + + if (!ses_config_cache_valid(ses_cache, phdr->gen_code)) { + ENC_VLOG(enc, "%s: Generation count change detected\n", + __func__); + enc_update_request(enc, SES_UPDATE_GETCONFIG); + goto out; + } + + offset = sizeof(struct ses_page_hdr); + + ses_iter_init(enc, enc_cache, &iter); + while (offset < plength + && (element = ses_iter_next(&iter)) != NULL) { + + if ((offset + sizeof(struct ses_elm_desc_hdr)) > plength) { + ENC_LOG(enc, "Element %d Descriptor Header Past " + "End of Buffer\n", iter.global_element_index); + goto out; + } + hdr = (struct ses_elm_desc_hdr *)&buf[offset]; + length = scsi_2btoul(hdr->length); + ENC_DLOG(enc, "%s: obj %d(%d,%d) length=%d off=%d\n", __func__, + iter.global_element_index, iter.type_index, + iter.type_element_index, length, offset); + if ((offset + sizeof(*hdr) + length) > plength) { + ENC_LOG(enc, "Element%d Descriptor Past " + "End of Buffer\n", iter.global_element_index); + goto out; + } + offset += sizeof(*hdr); + + if (length > 0) { + elmpriv = element->elm_private; + elmpriv->descr_len = length; + elmpriv->descr = &buf[offset]; + } + + /* skip over the descriptor itself */ + offset += length; + } + + err = 0; +out: + if (err == 0) { + if (ses->ses_flags & SES_FLAG_ADDLSTATUS) + enc_update_request(enc, SES_UPDATE_GETELMADDLSTATUS); + } + enc_update_request(enc, SES_PUBLISH_CACHE); + return (err); +} + +static int +ses_fill_rcv_diag_io(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t *buf) +{ + + if (enc->enc_type == ENC_SEMB_SES) { + semb_receive_diagnostic_results(&ccb->ataio, /*retries*/5, + enc_done, MSG_SIMPLE_Q_TAG, /*pcv*/1, + state->page_code, buf, state->buf_size, + state->timeout); + } else { + scsi_receive_diagnostic_results(&ccb->csio, /*retries*/5, + enc_done, MSG_SIMPLE_Q_TAG, /*pcv*/1, + state->page_code, buf, state->buf_size, + SSD_FULL_SIZE, state->timeout); + } + return (0); +} + +/** + * \brief Encode the object status into the response buffer, which is + * expected to contain the current enclosure status. This function + * turns off all the 'select' bits for the objects except for the + * object specified, then sends it back to the enclosure. + * + * \param enc SES enclosure the change is being applied to. + * \param buf Buffer containing the current enclosure status response. + * \param amt Length of the response in the buffer. + * \param req The control request to be applied to buf. + * + * \return 0 on success, errno otherwise. + */ +static int +ses_encode(enc_softc_t *enc, uint8_t *buf, int amt, ses_control_request_t *req) +{ + struct ses_iterator iter; + enc_element_t *element; + int offset; + struct ses_control_page_hdr *hdr; + + ses_iter_init(enc, &enc->enc_cache, &iter); + hdr = (struct ses_control_page_hdr *)buf; + if (req->elm_idx == -1) { + /* for enclosure status, at least 2 bytes are needed */ + if (amt < 2) + return EIO; + hdr->control_flags = + req->elm_stat.comstatus & SES_SET_STATUS_MASK; + ENC_DLOG(enc, "Set EncStat %x\n", hdr->control_flags); + return (0); + } + + element = ses_iter_seek_to(&iter, req->elm_idx, SES_ELEM_INDEX_GLOBAL); + if (element == NULL) + return (ENXIO); + + /* + * Seek to the type set that corresponds to the requested object. + * The +1 is for the overall status element for the type. + */ + offset = sizeof(struct ses_control_page_hdr) + + (iter.global_element_index * sizeof(struct ses_comstat)); + + /* Check for buffer overflow. */ + if (offset + sizeof(struct ses_comstat) > amt) + return (EIO); + + /* Set the status. */ + memcpy(&buf[offset], &req->elm_stat, sizeof(struct ses_comstat)); + + ENC_DLOG(enc, "Set Type 0x%x Obj 0x%x (offset %d) with %x %x %x %x\n", + iter.type_index, iter.global_element_index, offset, + req->elm_stat.comstatus, req->elm_stat.comstat[0], + req->elm_stat.comstat[1], req->elm_stat.comstat[2]); + + return (0); +} + +static int +ses_fill_control_request(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t *buf) +{ + ses_softc_t *ses; + enc_cache_t *enc_cache; + ses_cache_t *ses_cache; + struct ses_control_page_hdr *hdr; + ses_control_request_t *req; + size_t plength; + size_t offset; + + ses = enc->enc_private; + enc_cache = &enc->enc_daemon_cache; + ses_cache = enc_cache->private; + hdr = (struct ses_control_page_hdr *)buf; + + if (ses_cache->status_page == NULL) { + ses_terminate_control_requests(&ses->ses_requests, EIO); + return (EIO); + } + + plength = ses_page_length(&ses_cache->status_page->hdr); + memcpy(buf, ses_cache->status_page, plength); + + /* Disable the select bits in all status entries. */ + offset = sizeof(struct ses_control_page_hdr); + for (offset = sizeof(struct ses_control_page_hdr); + offset < plength; offset += sizeof(struct ses_comstat)) { + buf[offset] &= ~SESCTL_CSEL; + } + + /* And make sure the INVOP bit is clear. */ + hdr->control_flags &= ~SES_ENCSTAT_INVOP; + + /* Apply incoming requests. */ + while ((req = TAILQ_FIRST(&ses->ses_requests)) != NULL) { + + TAILQ_REMOVE(&ses->ses_requests, req, links); + req->result = ses_encode(enc, buf, plength, req); + if (req->result != 0) { + wakeup(req); + continue; + } + TAILQ_INSERT_TAIL(&ses->ses_pending_requests, req, links); + } + + if (TAILQ_EMPTY(&ses->ses_pending_requests) != 0) + return (ENOENT); + + /* Fill out the ccb */ + if (enc->enc_type == ENC_SEMB_SES) { + semb_send_diagnostic(&ccb->ataio, /*retries*/5, enc_done, + MSG_SIMPLE_Q_TAG, + buf, ses_page_length(&ses_cache->status_page->hdr), + state->timeout); + } else { + scsi_send_diagnostic(&ccb->csio, /*retries*/5, enc_done, + MSG_SIMPLE_Q_TAG, /*unit_offline*/0, + /*device_offline*/0, /*self_test*/0, + /*page_format*/1, /*self_test_code*/0, + buf, ses_page_length(&ses_cache->status_page->hdr), + SSD_FULL_SIZE, state->timeout); + } + return (0); +} + +static int +ses_get_elm_addlstatus_fc(enc_softc_t *enc, enc_cache_t *enc_cache, + uint8_t *buf, int bufsiz) +{ + ENC_LOG(enc, "FC Device Support Stubbed in Additional Status Page\n"); + return (ENODEV); +} + +#define SES_PRINT_PORTS(p, type) do { \ + sbuf_printf(sbp, " %s(", type); \ + if (((p) & SES_SASOBJ_DEV_PHY_PROTOMASK) == 0) \ + sbuf_printf(sbp, " None"); \ + else { \ + if ((p) & SES_SASOBJ_DEV_PHY_SMP) \ + sbuf_printf(sbp, " SMP"); \ + if ((p) & SES_SASOBJ_DEV_PHY_STP) \ + sbuf_printf(sbp, " STP"); \ + if ((p) & SES_SASOBJ_DEV_PHY_SSP) \ + sbuf_printf(sbp, " SSP"); \ + } \ + sbuf_printf(sbp, " )"); \ +} while(0) + +/** + * \brief Print the additional element status data for this object, for SAS + * type 0 objects. See SES2 r20 Section 6.1.13.3.2. + * + * \param sesname SES device name associated with the object. + * \param sbp Sbuf to print to. + * \param obj The object to print the data for. + * \param periph_name Peripheral string associated with the object. + */ +static void +ses_print_addl_data_sas_type0(char *sesname, struct sbuf *sbp, + enc_element_t *obj, char *periph_name) +{ + int i; + ses_element_t *elmpriv; + struct ses_addl_status *addl; + struct ses_elm_sas_device_phy *phy; + + elmpriv = obj->elm_private; + addl = &(elmpriv->addl); + if (addl->proto_hdr.sas == NULL) + return; + sbuf_printf(sbp, "%s: %s: SAS Device Slot Element:", + sesname, periph_name); + sbuf_printf(sbp, " %d Phys", addl->proto_hdr.sas->base_hdr.num_phys); + if (ses_elm_addlstatus_eip(addl->hdr)) + sbuf_printf(sbp, " at Slot %d", + addl->proto_hdr.sas->type0_eip.dev_slot_num); + if (ses_elm_sas_type0_not_all_phys(addl->proto_hdr.sas)) + sbuf_printf(sbp, ", Not All Phys"); + sbuf_printf(sbp, "\n"); + if (addl->proto_data.sasdev_phys == NULL) + return; + for (i = 0;i < addl->proto_hdr.sas->base_hdr.num_phys;i++) { + phy = &addl->proto_data.sasdev_phys[i]; + sbuf_printf(sbp, "%s: phy %d:", sesname, i); + if (ses_elm_sas_dev_phy_sata_dev(phy)) + /* Spec says all other fields are specific values */ + sbuf_printf(sbp, " SATA device\n"); + else { + sbuf_printf(sbp, " SAS device type %d id %d\n", + ses_elm_sas_dev_phy_dev_type(phy), phy->phy_id); + sbuf_printf(sbp, "%s: phy %d: protocols:", sesname, i); + SES_PRINT_PORTS(phy->initiator_ports, "Initiator"); + SES_PRINT_PORTS(phy->target_ports, "Target"); + sbuf_printf(sbp, "\n"); + } + sbuf_printf(sbp, "%s: phy %d: parent %jx addr %jx\n", + sesname, i, + (uintmax_t)scsi_8btou64(phy->parent_addr), + (uintmax_t)scsi_8btou64(phy->phy_addr)); + } +} +#undef SES_PRINT_PORTS + +/** + * \brief Report whether a given enclosure object is an expander. + * + * \param enc SES softc associated with object. + * \param obj Enclosure object to report for. + * + * \return 1 if true, 0 otherwise. + */ +static int +ses_obj_is_expander(enc_softc_t *enc, enc_element_t *obj) +{ + return (obj->enctype == ELMTYP_SAS_EXP); +} + +/** + * \brief Print the additional element status data for this object, for SAS + * type 1 objects. See SES2 r20 Sections 6.1.13.3.3 and 6.1.13.3.4. + * + * \param enc SES enclosure, needed for type identification. + * \param sesname SES device name associated with the object. + * \param sbp Sbuf to print to. + * \param obj The object to print the data for. + * \param periph_name Peripheral string associated with the object. + */ +static void +ses_print_addl_data_sas_type1(enc_softc_t *enc, char *sesname, + struct sbuf *sbp, enc_element_t *obj, char *periph_name) +{ + int i, num_phys; + ses_element_t *elmpriv; + struct ses_addl_status *addl; + struct ses_elm_sas_expander_phy *exp_phy; + struct ses_elm_sas_port_phy *port_phy; + + elmpriv = obj->elm_private; + addl = &(elmpriv->addl); + if (addl->proto_hdr.sas == NULL) + return; + sbuf_printf(sbp, "%s: %s: SAS ", sesname, periph_name); + if (ses_obj_is_expander(enc, obj)) { + num_phys = addl->proto_hdr.sas->base_hdr.num_phys; + sbuf_printf(sbp, "Expander: %d Phys", num_phys); + if (addl->proto_data.sasexp_phys == NULL) + return; + for (i = 0;i < num_phys;i++) { + exp_phy = &addl->proto_data.sasexp_phys[i]; + sbuf_printf(sbp, "%s: phy %d: connector %d other %d\n", + sesname, i, exp_phy->connector_index, + exp_phy->other_index); + } + } else { + num_phys = addl->proto_hdr.sas->base_hdr.num_phys; + sbuf_printf(sbp, "Port: %d Phys", num_phys); + if (addl->proto_data.sasport_phys == NULL) + return; + for (i = 0;i < num_phys;i++) { + port_phy = &addl->proto_data.sasport_phys[i]; + sbuf_printf(sbp, + "%s: phy %d: id %d connector %d other %d\n", + sesname, i, port_phy->phy_id, + port_phy->connector_index, port_phy->other_index); + sbuf_printf(sbp, "%s: phy %d: addr %jx\n", sesname, i, + (uintmax_t)scsi_8btou64(port_phy->phy_addr)); + } + } +} + +/** + * \brief Print the additional element status data for this object. + * + * \param enc SES softc associated with the object. + * \param obj The object to print the data for. + */ +static void +ses_print_addl_data(enc_softc_t *enc, enc_element_t *obj) +{ + ses_element_t *elmpriv; + struct ses_addl_status *addl; + struct sbuf sesname, name, out; + + elmpriv = obj->elm_private; + if (elmpriv == NULL) + return; + + addl = &(elmpriv->addl); + if (addl->hdr == NULL) + return; + + sbuf_new(&sesname, NULL, 16, SBUF_AUTOEXTEND); + sbuf_new(&name, NULL, 16, SBUF_AUTOEXTEND); + sbuf_new(&out, NULL, 512, SBUF_AUTOEXTEND); + ses_paths_iter(enc, obj, ses_elmdevname_callback, &name); + if (sbuf_len(&name) == 0) + sbuf_printf(&name, "(none)"); + sbuf_finish(&name); + sbuf_printf(&sesname, "%s%d", enc->periph->periph_name, + enc->periph->unit_number); + sbuf_finish(&sesname); + if (elmpriv->descr != NULL) + sbuf_printf(&out, "%s: %s: Element descriptor: '%s'\n", + sbuf_data(&sesname), sbuf_data(&name), elmpriv->descr); + switch(ses_elm_addlstatus_proto(addl->hdr)) { + case SPSP_PROTO_SAS: + switch(ses_elm_sas_descr_type(addl->proto_hdr.sas)) { + case SES_SASOBJ_TYPE_SLOT: + ses_print_addl_data_sas_type0(sbuf_data(&sesname), + &out, obj, sbuf_data(&name)); + break; + case SES_SASOBJ_TYPE_OTHER: + ses_print_addl_data_sas_type1(enc, sbuf_data(&sesname), + &out, obj, sbuf_data(&name)); + break; + default: + break; + } + break; + case SPSP_PROTO_FC: /* stubbed for now */ + break; + default: + break; + } + sbuf_finish(&out); + printf("%s", sbuf_data(&out)); + sbuf_delete(&out); + sbuf_delete(&name); + sbuf_delete(&sesname); +} + +/** + * \brief Update the softc with the additional element status data for this + * object, for SAS type 0 objects. + * + * \param enc SES softc to be updated. + * \param buf The additional element status response buffer. + * \param bufsiz Size of the response buffer. + * \param eip The EIP bit value. + * \param nobj Number of objects attached to the SES softc. + * + * \return 0 on success, errno otherwise. + */ +static int +ses_get_elm_addlstatus_sas_type0(enc_softc_t *enc, enc_cache_t *enc_cache, + uint8_t *buf, int bufsiz, int eip, int nobj) +{ + int err, offset, physz; + enc_element_t *obj; + ses_element_t *elmpriv; + struct ses_addl_status *addl; + + err = offset = 0; + + /* basic object setup */ + obj = &(enc_cache->elm_map[nobj]); + elmpriv = obj->elm_private; + addl = &(elmpriv->addl); + + addl->proto_hdr.sas = (union ses_elm_sas_hdr *)&buf[offset]; + + /* Don't assume this object has any phys */ + bzero(&addl->proto_data, sizeof(addl->proto_data)); + if (addl->proto_hdr.sas->base_hdr.num_phys == 0) + goto out; + + /* Skip forward to the phy list */ + if (eip) + offset += sizeof(struct ses_elm_sas_type0_eip_hdr); + else + offset += sizeof(struct ses_elm_sas_type0_base_hdr); + + /* Make sure the phy list fits in the buffer */ + physz = addl->proto_hdr.sas->base_hdr.num_phys; + physz *= sizeof(struct ses_elm_sas_device_phy); + if (physz > (bufsiz - offset + 4)) { + ENC_LOG(enc, "Element %d Device Phy List Beyond End Of Buffer\n", + nobj); + err = EIO; + goto out; + } + + /* Point to the phy list */ + addl->proto_data.sasdev_phys = + (struct ses_elm_sas_device_phy *)&buf[offset]; + +out: + return (err); +} + +/** + * \brief Update the softc with the additional element status data for this + * object, for SAS type 1 objects. + * + * \param enc SES softc to be updated. + * \param buf The additional element status response buffer. + * \param bufsiz Size of the response buffer. + * \param eip The EIP bit value. + * \param nobj Number of objects attached to the SES softc. + * + * \return 0 on success, errno otherwise. + */ +static int +ses_get_elm_addlstatus_sas_type1(enc_softc_t *enc, enc_cache_t *enc_cache, + uint8_t *buf, int bufsiz, int eip, int nobj) +{ + int err, offset, physz; + enc_element_t *obj; + ses_element_t *elmpriv; + struct ses_addl_status *addl; + + err = offset = 0; + + /* basic object setup */ + obj = &(enc_cache->elm_map[nobj]); + elmpriv = obj->elm_private; + addl = &(elmpriv->addl); + + addl->proto_hdr.sas = (union ses_elm_sas_hdr *)&buf[offset]; + + /* Don't assume this object has any phys */ + bzero(&addl->proto_data, sizeof(addl->proto_data)); + if (addl->proto_hdr.sas->base_hdr.num_phys == 0) + goto out; + + /* Process expanders differently from other type1 cases */ + if (ses_obj_is_expander(enc, obj)) { + offset += sizeof(struct ses_elm_sas_type1_expander_hdr); + physz = addl->proto_hdr.sas->base_hdr.num_phys * + sizeof(struct ses_elm_sas_expander_phy); + if (physz > (bufsiz - offset)) { + ENC_LOG(enc, "Element %d: Expander Phy List Beyond " + "End Of Buffer\n", nobj); + err = EIO; + goto out; + } + addl->proto_data.sasexp_phys = + (struct ses_elm_sas_expander_phy *)&buf[offset]; + } else { + offset += sizeof(struct ses_elm_sas_type1_nonexpander_hdr); + physz = addl->proto_hdr.sas->base_hdr.num_phys * + sizeof(struct ses_elm_sas_port_phy); + if (physz > (bufsiz - offset + 4)) { + ENC_LOG(enc, "Element %d: Port Phy List Beyond End " + "Of Buffer\n", nobj); + err = EIO; + goto out; + } + addl->proto_data.sasport_phys = + (struct ses_elm_sas_port_phy *)&buf[offset]; + } + +out: + return (err); +} + +/** + * \brief Update the softc with the additional element status data for this + * object, for SAS objects. + * + * \param enc SES softc to be updated. + * \param buf The additional element status response buffer. + * \param bufsiz Size of the response buffer. + * \param eip The EIP bit value. + * \param tidx Type index for this object. + * \param nobj Number of objects attached to the SES softc. + * + * \return 0 on success, errno otherwise. + */ +static int +ses_get_elm_addlstatus_sas(enc_softc_t *enc, enc_cache_t *enc_cache, + uint8_t *buf, int bufsiz, int eip, int tidx, + int nobj) +{ + int dtype, err; + ses_cache_t *ses_cache; + union ses_elm_sas_hdr *hdr; + + /* Need to be able to read the descriptor type! */ + if (bufsiz < sizeof(union ses_elm_sas_hdr)) { + err = EIO; + goto out; + } + + ses_cache = enc_cache->private; + + hdr = (union ses_elm_sas_hdr *)buf; + dtype = ses_elm_sas_descr_type(hdr); + switch(dtype) { + case SES_SASOBJ_TYPE_SLOT: + switch(ses_cache->ses_types[tidx].hdr->etype_elm_type) { + case ELMTYP_DEVICE: + case ELMTYP_ARRAY_DEV: + break; + default: + ENC_LOG(enc, "Element %d has Additional Status type 0, " + "invalid for SES element type 0x%x\n", nobj, + ses_cache->ses_types[tidx].hdr->etype_elm_type); + err = ENODEV; + goto out; + } + err = ses_get_elm_addlstatus_sas_type0(enc, enc_cache, + buf, bufsiz, eip, + nobj); + break; + case SES_SASOBJ_TYPE_OTHER: + switch(ses_cache->ses_types[tidx].hdr->etype_elm_type) { + case ELMTYP_SAS_EXP: + case ELMTYP_SCSI_INI: + case ELMTYP_SCSI_TGT: + case ELMTYP_ESCC: + break; + default: + ENC_LOG(enc, "Element %d has Additional Status type 1, " + "invalid for SES element type 0x%x\n", nobj, + ses_cache->ses_types[tidx].hdr->etype_elm_type); + err = ENODEV; + goto out; + } + err = ses_get_elm_addlstatus_sas_type1(enc, enc_cache, buf, + bufsiz, eip, nobj); + break; + default: + ENC_LOG(enc, "Element %d of type 0x%x has Additional Status " + "of unknown type 0x%x\n", nobj, + ses_cache->ses_types[tidx].hdr->etype_elm_type, dtype); + err = ENODEV; + break; + } + +out: + return (err); +} + +static void +ses_softc_invalidate(enc_softc_t *enc) +{ + ses_softc_t *ses; + + ses = enc->enc_private; + ses_terminate_control_requests(&ses->ses_requests, ENXIO); +} + +static void +ses_softc_cleanup(enc_softc_t *enc) +{ + + ses_cache_free(enc, &enc->enc_cache); + ses_cache_free(enc, &enc->enc_daemon_cache); + ENC_FREE_AND_NULL(enc->enc_private); + ENC_FREE_AND_NULL(enc->enc_cache.private); + ENC_FREE_AND_NULL(enc->enc_daemon_cache.private); +} + +static int +ses_init_enc(enc_softc_t *enc) +{ + return (0); +} + +static int +ses_get_enc_status(enc_softc_t *enc, int slpflag) +{ + /* Automatically updated, caller checks enc_cache->encstat itself */ + return (0); +} + +static int +ses_set_enc_status(enc_softc_t *enc, uint8_t encstat, int slpflag) +{ + ses_control_request_t req; + ses_softc_t *ses; + + ses = enc->enc_private; + req.elm_idx = SES_SETSTATUS_ENC_IDX; + req.elm_stat.comstatus = encstat & 0xf; + + TAILQ_INSERT_TAIL(&ses->ses_requests, &req, links); + enc_update_request(enc, SES_PROCESS_CONTROL_REQS); + cam_periph_sleep(enc->periph, &req, PUSER, "encstat", 0); + + return (req.result); +} + +static int +ses_get_elm_status(enc_softc_t *enc, encioc_elm_status_t *elms, int slpflag) +{ + unsigned int i = elms->elm_idx; + + memcpy(elms->cstat, &enc->enc_cache.elm_map[i].encstat, 4); + return (0); +} + +static int +ses_set_elm_status(enc_softc_t *enc, encioc_elm_status_t *elms, int slpflag) +{ + ses_control_request_t req; + ses_softc_t *ses; + + /* If this is clear, we don't do diddly. */ + if ((elms->cstat[0] & SESCTL_CSEL) == 0) + return (0); + + ses = enc->enc_private; + req.elm_idx = elms->elm_idx; + memcpy(&req.elm_stat, elms->cstat, sizeof(req.elm_stat)); + + TAILQ_INSERT_TAIL(&ses->ses_requests, &req, links); + enc_update_request(enc, SES_PROCESS_CONTROL_REQS); + cam_periph_sleep(enc->periph, &req, PUSER, "encstat", 0); + + return (req.result); +} + +static int +ses_get_elm_desc(enc_softc_t *enc, encioc_elm_desc_t *elmd) +{ + int i = (int)elmd->elm_idx; + ses_element_t *elmpriv; + + /* Assume caller has already checked obj_id validity */ + elmpriv = enc->enc_cache.elm_map[i].elm_private; + /* object might not have a descriptor */ + if (elmpriv == NULL || elmpriv->descr == NULL) { + elmd->elm_desc_len = 0; + return (0); + } + if (elmd->elm_desc_len > elmpriv->descr_len) + elmd->elm_desc_len = elmpriv->descr_len; + copyout(elmpriv->descr, elmd->elm_desc_str, elmd->elm_desc_len); + return (0); +} + +/** + * \brief Respond to ENCIOC_GETELMDEVNAME, providing a device name for the + * given object id if one is available. + * + * \param enc SES softc to examine. + * \param objdn ioctl structure to read/write device name info. + * + * \return 0 on success, errno otherwise. + */ +static int +ses_get_elm_devnames(enc_softc_t *enc, encioc_elm_devnames_t *elmdn) +{ + struct sbuf sb; + int len; + + len = elmdn->elm_names_size; + if (len < 0) + return (EINVAL); + + sbuf_new(&sb, elmdn->elm_devnames, len, 0); + + cam_periph_unlock(enc->periph); + ses_paths_iter(enc, &enc->enc_cache.elm_map[elmdn->elm_idx], + ses_elmdevname_callback, &sb); + sbuf_finish(&sb); + elmdn->elm_names_len = sbuf_len(&sb); + cam_periph_lock(enc->periph); + return (elmdn->elm_names_len > 0 ? 0 : ENODEV); +} + +/** + * \brief Send a string to the primary subenclosure using the String Out + * SES diagnostic page. + * + * \param enc SES enclosure to run the command on. + * \param sstr SES string structure to operate on + * \param ioc Ioctl being performed + * + * \return 0 on success, errno otherwise. + */ +static int +ses_handle_string(enc_softc_t *enc, encioc_string_t *sstr, int ioc) +{ + int amt, payload, ret; + char cdb[6]; + uint8_t *buf; + + /* Implement SES2r20 6.1.6 */ + if (sstr->bufsiz > 0xffff) + return (EINVAL); /* buffer size too large */ + + if (ioc == ENCIOC_SETSTRING) { + payload = sstr->bufsiz + 4; /* header for SEND DIAGNOSTIC */ + amt = 0 - payload; + buf = ENC_MALLOC(payload); + if (buf == NULL) + return ENOMEM; + + ses_page_cdb(cdb, payload, 0, CAM_DIR_OUT); + /* Construct the page request */ + buf[0] = SesStringOut; + buf[1] = 0; + buf[2] = sstr->bufsiz >> 8; + buf[3] = sstr->bufsiz & 0xff; + memcpy(&buf[4], sstr->buf, sstr->bufsiz); + } else if (ioc == ENCIOC_GETSTRING) { + payload = sstr->bufsiz; + amt = payload; + ses_page_cdb(cdb, payload, SesStringIn, CAM_DIR_IN); + buf = sstr->buf; + } else + return EINVAL; + + ret = enc_runcmd(enc, cdb, 6, buf, &amt); + if (ioc == ENCIOC_SETSTRING) + ENC_FREE(buf); + return ret; +} + +/** + * \invariant Called with cam_periph mutex held. + */ +static void +ses_poll_status(enc_softc_t *enc) +{ + ses_softc_t *ses; + + ses = enc->enc_private; + enc_update_request(enc, SES_UPDATE_GETSTATUS); + if (ses->ses_flags & SES_FLAG_ADDLSTATUS) + enc_update_request(enc, SES_UPDATE_GETELMADDLSTATUS); +} + +/** + * \brief Notification received when CAM detects a new device in the + * SCSI domain in which this SEP resides. + * + * \param enc SES enclosure instance. + */ +static void +ses_device_found(enc_softc_t *enc) +{ + ses_poll_status(enc); + enc_update_request(enc, SES_PUBLISH_PHYSPATHS); +} + +static struct enc_vec ses_enc_vec = +{ + .softc_invalidate = ses_softc_invalidate, + .softc_cleanup = ses_softc_cleanup, + .init_enc = ses_init_enc, + .get_enc_status = ses_get_enc_status, + .set_enc_status = ses_set_enc_status, + .get_elm_status = ses_get_elm_status, + .set_elm_status = ses_set_elm_status, + .get_elm_desc = ses_get_elm_desc, + .get_elm_devnames = ses_get_elm_devnames, + .handle_string = ses_handle_string, + .device_found = ses_device_found, + .poll_status = ses_poll_status +}; + +/** + * \brief Initialize a new SES instance. + * + * \param enc SES softc structure to set up the instance in. + * \param doinit Do the initialization (see main driver). + * + * \return 0 on success, errno otherwise. + */ +int +ses_softc_init(enc_softc_t *enc) +{ + ses_softc_t *ses_softc; + + CAM_DEBUG(enc->periph->path, CAM_DEBUG_SUBTRACE, + ("entering enc_softc_init(%p)\n", enc)); + + enc->enc_vec = ses_enc_vec; + enc->enc_fsm_states = enc_fsm_states; + + if (enc->enc_private == NULL) + enc->enc_private = ENC_MALLOCZ(sizeof(ses_softc_t)); + if (enc->enc_cache.private == NULL) + enc->enc_cache.private = ENC_MALLOCZ(sizeof(ses_cache_t)); + if (enc->enc_daemon_cache.private == NULL) + enc->enc_daemon_cache.private = + ENC_MALLOCZ(sizeof(ses_cache_t)); + + if (enc->enc_private == NULL + || enc->enc_cache.private == NULL + || enc->enc_daemon_cache.private == NULL) { + ENC_FREE_AND_NULL(enc->enc_private); + ENC_FREE_AND_NULL(enc->enc_cache.private); + ENC_FREE_AND_NULL(enc->enc_daemon_cache.private); + return (ENOMEM); + } + + ses_softc = enc->enc_private; + TAILQ_INIT(&ses_softc->ses_requests); + TAILQ_INIT(&ses_softc->ses_pending_requests); + + enc_update_request(enc, SES_UPDATE_PAGES); + + // XXX: Move this to the FSM so it doesn't hang init + if (0) (void) ses_set_timed_completion(enc, 1); + + return (0); +} + diff --git a/sys/cam/scsi/scsi_pass.c b/sys/cam/scsi/scsi_pass.c index a124468a56d..ffb8a80b592 100644 --- a/sys/cam/scsi/scsi_pass.c +++ b/sys/cam/scsi/scsi_pass.c @@ -55,7 +55,8 @@ __FBSDID("$FreeBSD$"); typedef enum { PASS_FLAG_OPEN = 0x01, PASS_FLAG_LOCKED = 0x02, - PASS_FLAG_INVALID = 0x04 + PASS_FLAG_INVALID = 0x04, + PASS_FLAG_INITIAL_PHYSPATH = 0x08 } pass_flags; typedef enum { @@ -111,7 +112,7 @@ PERIPHDRIVER_DECLARE(pass, passdriver); static struct cdevsw pass_cdevsw = { .d_version = D_VERSION, - .d_flags = 0, + .d_flags = D_TRACKCLOSE, .d_open = passopen, .d_close = passclose, .d_ioctl = passioctl, @@ -133,7 +134,18 @@ passinit(void) printf("pass: Failed to attach master async callback " "due to status 0x%x!\n", status); } - + +} + +static void +passdevgonecb(void *arg) +{ + struct cam_periph *periph; + + periph = (struct cam_periph *)arg; + + xpt_print(periph->path, "%s: devfs entry is gone\n", __func__); + cam_periph_release(periph); } static void @@ -150,6 +162,12 @@ passoninvalidate(struct cam_periph *periph) softc->flags |= PASS_FLAG_INVALID; + /* + * Tell devfs this device has gone away, and ask for a callback + * when it has cleaned up its state. + */ + destroy_dev_sched_cb(softc->dev, passdevgonecb, periph); + /* * XXX Return all queued I/O with ENXIO. * XXX Handle any transactions queued to the card @@ -176,11 +194,6 @@ passcleanup(struct cam_periph *periph) cam_periph_unlock(periph); taskqueue_drain(taskqueue_thread, &softc->add_physpath_task); - /* - * passcleanup() is indirectly a d_close method via passclose, - * so using destroy_dev(9) directly can result in deadlock. - */ - destroy_dev_sched(softc->dev); cam_periph_lock(periph); free(softc, M_DEVBUF); @@ -199,6 +212,12 @@ pass_add_physpath(void *context, int pending) */ periph = context; softc = periph->softc; + cam_periph_lock(periph); + if (periph->flags & CAM_PERIPH_INVALID) { + cam_periph_unlock(periph); + return; + } + cam_periph_unlock(periph); physpath = malloc(MAXPATHLEN, M_DEVBUF, M_WAITOK); if (xpt_getattr(physpath, MAXPATHLEN, "GEOM::physpath", periph->path) == 0 @@ -208,6 +227,19 @@ pass_add_physpath(void *context, int pending) softc->dev, softc->alias_dev, physpath); } free(physpath, M_DEVBUF); + + /* + * Now that we've made our alias, we no longer have to have a + * reference to the device. + */ + cam_periph_lock(periph); + if ((softc->flags & PASS_FLAG_INITIAL_PHYSPATH) == 0) { + softc->flags |= PASS_FLAG_INITIAL_PHYSPATH; + cam_periph_unlock(periph); + dev_rel(softc->dev); + } + else + cam_periph_unlock(periph); } static void @@ -281,12 +313,12 @@ passregister(struct cam_periph *periph, void *arg) cgd = (struct ccb_getdev *)arg; if (periph == NULL) { - printf("passregister: periph was NULL!!\n"); + printf("%s: periph was NULL!!\n", __func__); return(CAM_REQ_CMP_ERR); } if (cgd == NULL) { - printf("passregister: no getdev CCB, can't register device\n"); + printf("%s: no getdev CCB, can't register device\n", __func__); return(CAM_REQ_CMP_ERR); } @@ -294,8 +326,8 @@ passregister(struct cam_periph *periph, void *arg) M_DEVBUF, M_NOWAIT); if (softc == NULL) { - printf("passregister: Unable to probe new device. " - "Unable to allocate softc\n"); + printf("%s: Unable to probe new device. " + "Unable to allocate softc\n", __func__); return(CAM_REQ_CMP_ERR); } @@ -331,10 +363,31 @@ passregister(struct cam_periph *periph, void *arg) DEVSTAT_TYPE_PASS, DEVSTAT_PRIORITY_PASS); + /* + * Acquire a reference to the periph before we create the devfs + * instance for it. We'll release this reference once the devfs + * instance has been freed. + */ + if (cam_periph_acquire(periph) != CAM_REQ_CMP) { + xpt_print(periph->path, "%s: lost periph during " + "registration!\n", __func__); + mtx_lock(periph->sim->mtx); + return (CAM_REQ_CMP_ERR); + } + /* Register the device */ softc->dev = make_dev(&pass_cdevsw, periph->unit_number, UID_ROOT, GID_OPERATOR, 0600, "%s%d", periph->periph_name, periph->unit_number); + + /* + * Now that we have made the devfs instance, hold a reference to it + * until the task queue has run to setup the physical path alias. + * That way devfs won't get rid of the device before we add our + * alias. + */ + dev_ref(softc->dev); + mtx_lock(periph->sim->mtx); softc->dev->si_drv1 = periph; @@ -377,8 +430,8 @@ passopen(struct cdev *dev, int flags, int fmt, struct thread *td) softc = (struct pass_softc *)periph->softc; if (softc->flags & PASS_FLAG_INVALID) { + cam_periph_release_locked(periph); cam_periph_unlock(periph); - cam_periph_release(periph); return(ENXIO); } @@ -387,8 +440,8 @@ passopen(struct cdev *dev, int flags, int fmt, struct thread *td) */ error = securelevel_gt(td->td_ucred, 1); if (error) { + cam_periph_release_locked(periph); cam_periph_unlock(periph); - cam_periph_release(periph); return(error); } @@ -396,8 +449,8 @@ passopen(struct cdev *dev, int flags, int fmt, struct thread *td) * Only allow read-write access. */ if (((flags & FWRITE) == 0) || ((flags & FREAD) == 0)) { + cam_periph_release_locked(periph); cam_periph_unlock(periph); - cam_periph_release(periph); return(EPERM); } @@ -406,19 +459,12 @@ passopen(struct cdev *dev, int flags, int fmt, struct thread *td) */ if ((flags & O_NONBLOCK) != 0) { xpt_print(periph->path, "can't do nonblocking access\n"); + cam_periph_release_locked(periph); cam_periph_unlock(periph); - cam_periph_release(periph); return(EINVAL); } - if ((softc->flags & PASS_FLAG_OPEN) == 0) { - softc->flags |= PASS_FLAG_OPEN; - cam_periph_unlock(periph); - } else { - /* Device closes aren't symmertical, so fix up the refcount */ - cam_periph_unlock(periph); - cam_periph_release(periph); - } + cam_periph_unlock(periph); return (error); } @@ -427,18 +473,11 @@ static int passclose(struct cdev *dev, int flag, int fmt, struct thread *td) { struct cam_periph *periph; - struct pass_softc *softc; periph = (struct cam_periph *)dev->si_drv1; if (periph == NULL) return (ENXIO); - cam_periph_lock(periph); - - softc = (struct pass_softc *)periph->softc; - softc->flags &= ~PASS_FLAG_OPEN; - - cam_periph_unlock(periph); cam_periph_release(periph); return (0); @@ -638,9 +677,9 @@ passsendccb(struct cam_periph *periph, union ccb *ccb, union ccb *inccb) * that request. Otherwise, it's up to the user to perform any * error recovery. */ - cam_periph_runccb(ccb, - (ccb->ccb_h.flags & CAM_PASS_ERR_RECOVER) ? passerror : NULL, - /* cam_flags */ CAM_RETRY_SELTO, /* sense_flags */SF_RETRY_UA, + cam_periph_runccb(ccb, passerror, /* cam_flags */ CAM_RETRY_SELTO, + /* sense_flags */ ((ccb->ccb_h.flags & CAM_PASS_ERR_RECOVER) ? + SF_RETRY_UA : SF_NO_RECOVERY) | SF_NO_PRINT, softc->device_stats); if (need_unmap != 0) diff --git a/sys/cam/scsi/scsi_pt.c b/sys/cam/scsi/scsi_pt.c index 1abb45ed325..26f4d19ddf6 100644 --- a/sys/cam/scsi/scsi_pt.c +++ b/sys/cam/scsi/scsi_pt.c @@ -148,8 +148,8 @@ ptopen(struct cdev *dev, int flags, int fmt, struct thread *td) cam_periph_lock(periph); if (softc->flags & PT_FLAG_DEVICE_INVALID) { + cam_periph_release_locked(periph); cam_periph_unlock(periph); - cam_periph_release(periph); return(ENXIO); } @@ -182,8 +182,8 @@ ptclose(struct cdev *dev, int flag, int fmt, struct thread *td) cam_periph_lock(periph); softc->flags &= ~PT_FLAG_OPEN; + cam_periph_release_locked(periph); cam_periph_unlock(periph); - cam_periph_release(periph); return (0); } @@ -425,12 +425,14 @@ ptstart(struct cam_periph *periph, union ccb *start_ccb) softc = (struct pt_softc *)periph->softc; + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("ptstart\n")); + /* * See if there is a buf with work for us to do.. */ bp = bioq_first(&softc->bio_queue); if (periph->immediate_priority <= periph->pinfo.priority) { - CAM_DEBUG_PRINT(CAM_DEBUG_SUBTRACE, + CAM_DEBUG(periph->path, CAM_DEBUG_SUBTRACE, ("queuing for immediate ccb\n")); start_ccb->ccb_h.ccb_state = PT_CCB_WAITING; SLIST_INSERT_HEAD(&periph->ccb_list, &start_ccb->ccb_h, @@ -483,6 +485,9 @@ ptdone(struct cam_periph *periph, union ccb *done_ccb) struct ccb_scsiio *csio; softc = (struct pt_softc *)periph->softc; + + CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("ptdone\n")); + csio = &done_ccb->csio; switch (csio->ccb_h.ccb_state) { case PT_CCB_BUFFER_IO: diff --git a/sys/cam/scsi/scsi_sa.c b/sys/cam/scsi/scsi_sa.c index 42761bf5bac..45e1d148b43 100644 --- a/sys/cam/scsi/scsi_sa.c +++ b/sys/cam/scsi/scsi_sa.c @@ -1482,10 +1482,6 @@ saregister(struct cam_periph *periph, void *arg) softc->quirks = ((struct sa_quirk_entry *)match)->quirks; softc->last_media_blksize = ((struct sa_quirk_entry *)match)->prefblk; -#ifdef CAMDEBUG - xpt_print(periph->path, "found quirk entry %d\n", - (int) (((struct sa_quirk_entry *) match) - sa_quirk_table)); -#endif } else softc->quirks = SA_QUIRK_NONE; @@ -1798,13 +1794,11 @@ sadone(struct cam_periph *periph, union ccb *done_ccb) */ if (error || (softc->flags & SA_FLAG_ERR_PENDING)) cam_release_devq(done_ccb->ccb_h.path, 0, 0, 0, 0); -#ifdef CAMDEBUG if (error || bp->bio_resid) { CAM_DEBUG(periph->path, CAM_DEBUG_INFO, ("error %d resid %ld count %ld\n", error, bp->bio_resid, bp->bio_bcount)); } -#endif biofinish(bp, softc->device_stats, 0); break; } diff --git a/sys/cam/scsi/scsi_ses.c b/sys/cam/scsi/scsi_ses.c deleted file mode 100644 index 586e996dead..00000000000 --- a/sys/cam/scsi/scsi_ses.c +++ /dev/null @@ -1,2533 +0,0 @@ -/*- - * Copyright (c) 2000 Matthew Jacob - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -static MALLOC_DEFINE(M_SCSISES, "SCSI SES", "SCSI SES buffers"); - -/* - * Platform Independent Driver Internal Definitions for SES devices. - */ -typedef enum { - SES_NONE, - SES_SES_SCSI2, - SES_SES, - SES_SES_PASSTHROUGH, - SES_SEN, - SES_SAFT -} enctyp; - -struct ses_softc; -typedef struct ses_softc ses_softc_t; -typedef struct { - int (*softc_init)(ses_softc_t *, int); - int (*init_enc)(ses_softc_t *); - int (*get_encstat)(ses_softc_t *, int); - int (*set_encstat)(ses_softc_t *, ses_encstat, int); - int (*get_objstat)(ses_softc_t *, ses_objstat *, int); - int (*set_objstat)(ses_softc_t *, ses_objstat *, int); -} encvec; - -#define ENCI_SVALID 0x80 - -typedef struct { - uint32_t - enctype : 8, /* enclosure type */ - subenclosure : 8, /* subenclosure id */ - svalid : 1, /* enclosure information valid */ - priv : 15; /* private data, per object */ - uint8_t encstat[4]; /* state && stats */ -} encobj; - -#define SEN_ID "UNISYS SUN_SEN" -#define SEN_ID_LEN 24 - - -static enctyp ses_type(void *, int); - - -/* Forward reference to Enclosure Functions */ -static int ses_softc_init(ses_softc_t *, int); -static int ses_init_enc(ses_softc_t *); -static int ses_get_encstat(ses_softc_t *, int); -static int ses_set_encstat(ses_softc_t *, uint8_t, int); -static int ses_get_objstat(ses_softc_t *, ses_objstat *, int); -static int ses_set_objstat(ses_softc_t *, ses_objstat *, int); - -static int safte_softc_init(ses_softc_t *, int); -static int safte_init_enc(ses_softc_t *); -static int safte_get_encstat(ses_softc_t *, int); -static int safte_set_encstat(ses_softc_t *, uint8_t, int); -static int safte_get_objstat(ses_softc_t *, ses_objstat *, int); -static int safte_set_objstat(ses_softc_t *, ses_objstat *, int); - -/* - * Platform implementation defines/functions for SES internal kernel stuff - */ - -#define STRNCMP strncmp -#define PRINTF printf -#define SES_LOG ses_log -#ifdef DEBUG -#define SES_DLOG ses_log -#else -#define SES_DLOG if (0) ses_log -#endif -#define SES_VLOG if (bootverbose) ses_log -#define SES_MALLOC(amt) malloc(amt, M_SCSISES, M_NOWAIT) -#define SES_FREE(ptr, amt) free(ptr, M_SCSISES) -#define MEMZERO bzero -#define MEMCPY(dest, src, amt) bcopy(src, dest, amt) - -static int ses_runcmd(struct ses_softc *, char *, int, char *, int *); -static void ses_log(struct ses_softc *, const char *, ...); - -/* - * Gerenal FreeBSD kernel stuff. - */ - - -#define ccb_state ppriv_field0 -#define ccb_bp ppriv_ptr1 - -struct ses_softc { - enctyp ses_type; /* type of enclosure */ - encvec ses_vec; /* vector to handlers */ - void * ses_private; /* per-type private data */ - encobj * ses_objmap; /* objects */ - uint32_t ses_nobjects; /* number of objects */ - ses_encstat ses_encstat; /* overall status */ - uint8_t ses_flags; - union ccb ses_saved_ccb; - struct cdev *ses_dev; - struct cam_periph *periph; -}; -#define SES_FLAG_INVALID 0x01 -#define SES_FLAG_OPEN 0x02 -#define SES_FLAG_INITIALIZED 0x04 - -static d_open_t sesopen; -static d_close_t sesclose; -static d_ioctl_t sesioctl; -static periph_init_t sesinit; -static periph_ctor_t sesregister; -static periph_oninv_t sesoninvalidate; -static periph_dtor_t sescleanup; -static periph_start_t sesstart; - -static void sesasync(void *, uint32_t, struct cam_path *, void *); -static void sesdone(struct cam_periph *, union ccb *); -static int seserror(union ccb *, uint32_t, uint32_t); - -static struct periph_driver sesdriver = { - sesinit, "ses", - TAILQ_HEAD_INITIALIZER(sesdriver.units), /* generation */ 0 -}; - -PERIPHDRIVER_DECLARE(ses, sesdriver); - -static struct cdevsw ses_cdevsw = { - .d_version = D_VERSION, - .d_open = sesopen, - .d_close = sesclose, - .d_ioctl = sesioctl, - .d_name = "ses", - .d_flags = 0, -}; - -static void -sesinit(void) -{ - cam_status status; - - /* - * Install a global async callback. This callback will - * receive async callbacks like "new device found". - */ - status = xpt_register_async(AC_FOUND_DEVICE, sesasync, NULL, NULL); - - if (status != CAM_REQ_CMP) { - printf("ses: Failed to attach master async callback " - "due to status 0x%x!\n", status); - } -} - -static void -sesoninvalidate(struct cam_periph *periph) -{ - struct ses_softc *softc; - - softc = (struct ses_softc *)periph->softc; - - /* - * Unregister any async callbacks. - */ - xpt_register_async(0, sesasync, periph, periph->path); - - softc->ses_flags |= SES_FLAG_INVALID; - - xpt_print(periph->path, "lost device\n"); -} - -static void -sescleanup(struct cam_periph *periph) -{ - struct ses_softc *softc; - - softc = (struct ses_softc *)periph->softc; - - xpt_print(periph->path, "removing device entry\n"); - cam_periph_unlock(periph); - destroy_dev(softc->ses_dev); - cam_periph_lock(periph); - free(softc, M_SCSISES); -} - -static void -sesasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg) -{ - struct cam_periph *periph; - - periph = (struct cam_periph *)callback_arg; - - switch(code) { - case AC_FOUND_DEVICE: - { - cam_status status; - struct ccb_getdev *cgd; - int inq_len; - - cgd = (struct ccb_getdev *)arg; - if (arg == NULL) { - break; - } - - if (cgd->protocol != PROTO_SCSI) - break; - - inq_len = cgd->inq_data.additional_length + 4; - - /* - * PROBLEM: WE NEED TO LOOK AT BYTES 48-53 TO SEE IF THIS IS - * PROBLEM: IS A SAF-TE DEVICE. - */ - switch (ses_type(&cgd->inq_data, inq_len)) { - case SES_SES: - case SES_SES_SCSI2: - case SES_SES_PASSTHROUGH: - case SES_SEN: - case SES_SAFT: - break; - default: - return; - } - - status = cam_periph_alloc(sesregister, sesoninvalidate, - sescleanup, sesstart, "ses", CAM_PERIPH_BIO, - cgd->ccb_h.path, sesasync, AC_FOUND_DEVICE, cgd); - - if (status != CAM_REQ_CMP && status != CAM_REQ_INPROG) { - printf("sesasync: Unable to probe new device due to " - "status 0x%x\n", status); - } - break; - } - default: - cam_periph_async(periph, code, path, arg); - break; - } -} - -static cam_status -sesregister(struct cam_periph *periph, void *arg) -{ - struct ses_softc *softc; - struct ccb_getdev *cgd; - char *tname; - - cgd = (struct ccb_getdev *)arg; - if (periph == NULL) { - printf("sesregister: periph was NULL!!\n"); - return (CAM_REQ_CMP_ERR); - } - - if (cgd == NULL) { - printf("sesregister: no getdev CCB, can't register device\n"); - return (CAM_REQ_CMP_ERR); - } - - softc = SES_MALLOC(sizeof (struct ses_softc)); - if (softc == NULL) { - printf("sesregister: Unable to probe new device. " - "Unable to allocate softc\n"); - return (CAM_REQ_CMP_ERR); - } - bzero(softc, sizeof (struct ses_softc)); - periph->softc = softc; - softc->periph = periph; - - softc->ses_type = ses_type(&cgd->inq_data, sizeof (cgd->inq_data)); - - switch (softc->ses_type) { - case SES_SES: - case SES_SES_SCSI2: - case SES_SES_PASSTHROUGH: - softc->ses_vec.softc_init = ses_softc_init; - softc->ses_vec.init_enc = ses_init_enc; - softc->ses_vec.get_encstat = ses_get_encstat; - softc->ses_vec.set_encstat = ses_set_encstat; - softc->ses_vec.get_objstat = ses_get_objstat; - softc->ses_vec.set_objstat = ses_set_objstat; - break; - case SES_SAFT: - softc->ses_vec.softc_init = safte_softc_init; - softc->ses_vec.init_enc = safte_init_enc; - softc->ses_vec.get_encstat = safte_get_encstat; - softc->ses_vec.set_encstat = safte_set_encstat; - softc->ses_vec.get_objstat = safte_get_objstat; - softc->ses_vec.set_objstat = safte_set_objstat; - break; - case SES_SEN: - break; - case SES_NONE: - default: - free(softc, M_SCSISES); - return (CAM_REQ_CMP_ERR); - } - - cam_periph_unlock(periph); - softc->ses_dev = make_dev(&ses_cdevsw, periph->unit_number, - UID_ROOT, GID_OPERATOR, 0600, "%s%d", - periph->periph_name, periph->unit_number); - cam_periph_lock(periph); - softc->ses_dev->si_drv1 = periph; - - /* - * Add an async callback so that we get - * notified if this device goes away. - */ - xpt_register_async(AC_LOST_DEVICE, sesasync, periph, periph->path); - - switch (softc->ses_type) { - default: - case SES_NONE: - tname = "No SES device"; - break; - case SES_SES_SCSI2: - tname = "SCSI-2 SES Device"; - break; - case SES_SES: - tname = "SCSI-3 SES Device"; - break; - case SES_SES_PASSTHROUGH: - tname = "SES Passthrough Device"; - break; - case SES_SEN: - tname = "UNISYS SEN Device (NOT HANDLED YET)"; - break; - case SES_SAFT: - tname = "SAF-TE Compliant Device"; - break; - } - xpt_announce_periph(periph, tname); - return (CAM_REQ_CMP); -} - -static int -sesopen(struct cdev *dev, int flags, int fmt, struct thread *td) -{ - struct cam_periph *periph; - struct ses_softc *softc; - int error = 0; - - periph = (struct cam_periph *)dev->si_drv1; - if (periph == NULL) { - return (ENXIO); - } - - if (cam_periph_acquire(periph) != CAM_REQ_CMP) { - cam_periph_unlock(periph); - return (ENXIO); - } - - cam_periph_lock(periph); - - softc = (struct ses_softc *)periph->softc; - - if (softc->ses_flags & SES_FLAG_INVALID) { - error = ENXIO; - goto out; - } - if (softc->ses_flags & SES_FLAG_OPEN) { - error = EBUSY; - goto out; - } - if (softc->ses_vec.softc_init == NULL) { - error = ENXIO; - goto out; - } - - softc->ses_flags |= SES_FLAG_OPEN; - if ((softc->ses_flags & SES_FLAG_INITIALIZED) == 0) { - error = (*softc->ses_vec.softc_init)(softc, 1); - if (error) - softc->ses_flags &= ~SES_FLAG_OPEN; - else - softc->ses_flags |= SES_FLAG_INITIALIZED; - } - -out: - cam_periph_unlock(periph); - if (error) { - cam_periph_release(periph); - } - return (error); -} - -static int -sesclose(struct cdev *dev, int flag, int fmt, struct thread *td) -{ - struct cam_periph *periph; - struct ses_softc *softc; - int error; - - error = 0; - - periph = (struct cam_periph *)dev->si_drv1; - if (periph == NULL) - return (ENXIO); - - cam_periph_lock(periph); - - softc = (struct ses_softc *)periph->softc; - softc->ses_flags &= ~SES_FLAG_OPEN; - - cam_periph_unlock(periph); - cam_periph_release(periph); - - return (0); -} - -static void -sesstart(struct cam_periph *p, union ccb *sccb) -{ - if (p->immediate_priority <= p->pinfo.priority) { - SLIST_INSERT_HEAD(&p->ccb_list, &sccb->ccb_h, periph_links.sle); - p->immediate_priority = CAM_PRIORITY_NONE; - wakeup(&p->ccb_list); - } -} - -static void -sesdone(struct cam_periph *periph, union ccb *dccb) -{ - wakeup(&dccb->ccb_h.cbfcnp); -} - -static int -seserror(union ccb *ccb, uint32_t cflags, uint32_t sflags) -{ - struct ses_softc *softc; - struct cam_periph *periph; - - periph = xpt_path_periph(ccb->ccb_h.path); - softc = (struct ses_softc *)periph->softc; - - return (cam_periph_error(ccb, cflags, sflags, &softc->ses_saved_ccb)); -} - -static int -sesioctl(struct cdev *dev, u_long cmd, caddr_t arg_addr, int flag, struct thread *td) -{ - struct cam_periph *periph; - ses_encstat tmp; - ses_objstat objs; - ses_object *uobj; - struct ses_softc *ssc; - void *addr; - int error, i; - - - if (arg_addr) - addr = *((caddr_t *) arg_addr); - else - addr = NULL; - - periph = (struct cam_periph *)dev->si_drv1; - if (periph == NULL) - return (ENXIO); - - CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("entering sesioctl\n")); - - cam_periph_lock(periph); - ssc = (struct ses_softc *)periph->softc; - - /* - * Now check to see whether we're initialized or not. - * This actually should never fail as we're not supposed - * to get past ses_open w/o successfully initializing - * things. - */ - if ((ssc->ses_flags & SES_FLAG_INITIALIZED) == 0) { - cam_periph_unlock(periph); - return (ENXIO); - } - cam_periph_unlock(periph); - - error = 0; - - CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, - ("trying to do ioctl %#lx\n", cmd)); - - /* - * If this command can change the device's state, - * we must have the device open for writing. - * - * For commands that get information about the - * device- we don't need to lock the peripheral - * if we aren't running a command. The number - * of objects and the contents will stay stable - * after the first open that does initialization. - * The periph also can't go away while a user - * process has it open. - */ - switch (cmd) { - case SESIOC_GETNOBJ: - case SESIOC_GETOBJMAP: - case SESIOC_GETENCSTAT: - case SESIOC_GETOBJSTAT: - break; - default: - if ((flag & FWRITE) == 0) { - return (EBADF); - } - } - - switch (cmd) { - case SESIOC_GETNOBJ: - error = copyout(&ssc->ses_nobjects, addr, - sizeof (ssc->ses_nobjects)); - break; - - case SESIOC_GETOBJMAP: - for (uobj = addr, i = 0; i != ssc->ses_nobjects; i++) { - ses_object kobj; - kobj.obj_id = i; - kobj.subencid = ssc->ses_objmap[i].subenclosure; - kobj.object_type = ssc->ses_objmap[i].enctype; - error = copyout(&kobj, &uobj[i], sizeof (ses_object)); - if (error) { - break; - } - } - break; - - case SESIOC_GETENCSTAT: - cam_periph_lock(periph); - error = (*ssc->ses_vec.get_encstat)(ssc, 1); - if (error) { - cam_periph_unlock(periph); - break; - } - tmp = ssc->ses_encstat & ~ENCI_SVALID; - cam_periph_unlock(periph); - error = copyout(&tmp, addr, sizeof (ses_encstat)); - ssc->ses_encstat = tmp; - break; - - case SESIOC_SETENCSTAT: - error = copyin(addr, &tmp, sizeof (ses_encstat)); - if (error) - break; - cam_periph_lock(periph); - error = (*ssc->ses_vec.set_encstat)(ssc, tmp, 1); - cam_periph_unlock(periph); - break; - - case SESIOC_GETOBJSTAT: - error = copyin(addr, &objs, sizeof (ses_objstat)); - if (error) - break; - if (objs.obj_id >= ssc->ses_nobjects) { - error = EINVAL; - break; - } - cam_periph_lock(periph); - error = (*ssc->ses_vec.get_objstat)(ssc, &objs, 1); - cam_periph_unlock(periph); - if (error) - break; - error = copyout(&objs, addr, sizeof (ses_objstat)); - /* - * Always (for now) invalidate entry. - */ - ssc->ses_objmap[objs.obj_id].svalid = 0; - break; - - case SESIOC_SETOBJSTAT: - error = copyin(addr, &objs, sizeof (ses_objstat)); - if (error) - break; - - if (objs.obj_id >= ssc->ses_nobjects) { - error = EINVAL; - break; - } - cam_periph_lock(periph); - error = (*ssc->ses_vec.set_objstat)(ssc, &objs, 1); - cam_periph_unlock(periph); - - /* - * Always (for now) invalidate entry. - */ - ssc->ses_objmap[objs.obj_id].svalid = 0; - break; - - case SESIOC_INIT: - - cam_periph_lock(periph); - error = (*ssc->ses_vec.init_enc)(ssc); - cam_periph_unlock(periph); - break; - - default: - cam_periph_lock(periph); - error = cam_periph_ioctl(periph, cmd, arg_addr, seserror); - cam_periph_unlock(periph); - break; - } - return (error); -} - -#define SES_CFLAGS CAM_RETRY_SELTO -#define SES_FLAGS SF_NO_PRINT | SF_RETRY_UA -static int -ses_runcmd(struct ses_softc *ssc, char *cdb, int cdbl, char *dptr, int *dlenp) -{ - int error, dlen; - ccb_flags ddf; - union ccb *ccb; - - if (dptr) { - if ((dlen = *dlenp) < 0) { - dlen = -dlen; - ddf = CAM_DIR_OUT; - } else { - ddf = CAM_DIR_IN; - } - } else { - dlen = 0; - ddf = CAM_DIR_NONE; - } - - if (cdbl > IOCDBLEN) { - cdbl = IOCDBLEN; - } - - ccb = cam_periph_getccb(ssc->periph, 1); - cam_fill_csio(&ccb->csio, 0, sesdone, ddf, MSG_SIMPLE_Q_TAG, dptr, - dlen, sizeof (struct scsi_sense_data), cdbl, 60 * 1000); - bcopy(cdb, ccb->csio.cdb_io.cdb_bytes, cdbl); - - error = cam_periph_runccb(ccb, seserror, SES_CFLAGS, SES_FLAGS, NULL); - if (error) { - if (dptr) { - *dlenp = dlen; - } - } else { - if (dptr) { - *dlenp = ccb->csio.resid; - } - } - xpt_release_ccb(ccb); - return (error); -} - -static void -ses_log(struct ses_softc *ssc, const char *fmt, ...) -{ - va_list ap; - - printf("%s%d: ", ssc->periph->periph_name, ssc->periph->unit_number); - va_start(ap, fmt); - vprintf(fmt, ap); - va_end(ap); -} - -/* - * The code after this point runs on many platforms, - * so forgive the slightly awkward and nonconforming - * appearance. - */ - -/* - * Is this a device that supports enclosure services? - * - * It's a pretty simple ruleset- if it is device type 0x0D (13), it's - * an SES device. If it happens to be an old UNISYS SEN device, we can - * handle that too. - */ - -#define SAFTE_START 44 -#define SAFTE_END 50 -#define SAFTE_LEN SAFTE_END-SAFTE_START - -static enctyp -ses_type(void *buf, int buflen) -{ - unsigned char *iqd = buf; - - if (buflen < 8+SEN_ID_LEN) - return (SES_NONE); - - if ((iqd[0] & 0x1f) == T_ENCLOSURE) { - if (STRNCMP(&iqd[8], SEN_ID, SEN_ID_LEN) == 0) { - return (SES_SEN); - } else if ((iqd[2] & 0x7) > 2) { - return (SES_SES); - } else { - return (SES_SES_SCSI2); - } - return (SES_NONE); - } - -#ifdef SES_ENABLE_PASSTHROUGH - if ((iqd[6] & 0x40) && (iqd[2] & 0x7) >= 2) { - /* - * PassThrough Device. - */ - return (SES_SES_PASSTHROUGH); - } -#endif - - /* - * The comparison is short for a reason- - * some vendors were chopping it short. - */ - - if (buflen < SAFTE_END - 2) { - return (SES_NONE); - } - - if (STRNCMP((char *)&iqd[SAFTE_START], "SAF-TE", SAFTE_LEN - 2) == 0) { - return (SES_SAFT); - } - return (SES_NONE); -} - -/* - * SES Native Type Device Support - */ - -/* - * SES Diagnostic Page Codes - */ - -typedef enum { - SesConfigPage = 0x1, - SesControlPage, -#define SesStatusPage SesControlPage - SesHelpTxt, - SesStringOut, -#define SesStringIn SesStringOut - SesThresholdOut, -#define SesThresholdIn SesThresholdOut - SesArrayControl, -#define SesArrayStatus SesArrayControl - SesElementDescriptor, - SesShortStatus -} SesDiagPageCodes; - -/* - * minimal amounts - */ - -/* - * Minimum amount of data, starting from byte 0, to have - * the config header. - */ -#define SES_CFGHDR_MINLEN 12 - -/* - * Minimum amount of data, starting from byte 0, to have - * the config header and one enclosure header. - */ -#define SES_ENCHDR_MINLEN 48 - -/* - * Take this value, subtract it from VEnclen and you know - * the length of the vendor unique bytes. - */ -#define SES_ENCHDR_VMIN 36 - -/* - * SES Data Structures - */ - -typedef struct { - uint32_t GenCode; /* Generation Code */ - uint8_t Nsubenc; /* Number of Subenclosures */ -} SesCfgHdr; - -typedef struct { - uint8_t Subencid; /* SubEnclosure Identifier */ - uint8_t Ntypes; /* # of supported types */ - uint8_t VEnclen; /* Enclosure Descriptor Length */ -} SesEncHdr; - -typedef struct { - uint8_t encWWN[8]; /* XXX- Not Right Yet */ - uint8_t encVid[8]; - uint8_t encPid[16]; - uint8_t encRev[4]; - uint8_t encVen[1]; -} SesEncDesc; - -typedef struct { - uint8_t enc_type; /* type of element */ - uint8_t enc_maxelt; /* maximum supported */ - uint8_t enc_subenc; /* in SubEnc # N */ - uint8_t enc_tlen; /* Type Descriptor Text Length */ -} SesThdr; - -typedef struct { - uint8_t comstatus; - uint8_t comstat[3]; -} SesComStat; - -struct typidx { - int ses_tidx; - int ses_oidx; -}; - -struct sscfg { - uint8_t ses_ntypes; /* total number of types supported */ - - /* - * We need to keep a type index as well as an - * object index for each object in an enclosure. - */ - struct typidx *ses_typidx; - - /* - * We also need to keep track of the number of elements - * per type of element. This is needed later so that we - * can find precisely in the returned status data the - * status for the Nth element of the Kth type. - */ - uint8_t * ses_eltmap; -}; - - -/* - * (de)canonicalization defines - */ -#define sbyte(x, byte) ((((uint32_t)(x)) >> (byte * 8)) & 0xff) -#define sbit(x, bit) (((uint32_t)(x)) << bit) -#define sset8(outp, idx, sval) (((uint8_t *)(outp))[idx++]) = sbyte(sval, 0) - -#define sset16(outp, idx, sval) \ - (((uint8_t *)(outp))[idx++]) = sbyte(sval, 1), \ - (((uint8_t *)(outp))[idx++]) = sbyte(sval, 0) - - -#define sset24(outp, idx, sval) \ - (((uint8_t *)(outp))[idx++]) = sbyte(sval, 2), \ - (((uint8_t *)(outp))[idx++]) = sbyte(sval, 1), \ - (((uint8_t *)(outp))[idx++]) = sbyte(sval, 0) - - -#define sset32(outp, idx, sval) \ - (((uint8_t *)(outp))[idx++]) = sbyte(sval, 3), \ - (((uint8_t *)(outp))[idx++]) = sbyte(sval, 2), \ - (((uint8_t *)(outp))[idx++]) = sbyte(sval, 1), \ - (((uint8_t *)(outp))[idx++]) = sbyte(sval, 0) - -#define gbyte(x, byte) ((((uint32_t)(x)) & 0xff) << (byte * 8)) -#define gbit(lv, in, idx, shft, mask) lv = ((in[idx] >> shft) & mask) -#define sget8(inp, idx, lval) lval = (((uint8_t *)(inp))[idx++]) -#define gget8(inp, idx, lval) lval = (((uint8_t *)(inp))[idx]) - -#define sget16(inp, idx, lval) \ - lval = gbyte((((uint8_t *)(inp))[idx]), 1) | \ - (((uint8_t *)(inp))[idx+1]), idx += 2 - -#define gget16(inp, idx, lval) \ - lval = gbyte((((uint8_t *)(inp))[idx]), 1) | \ - (((uint8_t *)(inp))[idx+1]) - -#define sget24(inp, idx, lval) \ - lval = gbyte((((uint8_t *)(inp))[idx]), 2) | \ - gbyte((((uint8_t *)(inp))[idx+1]), 1) | \ - (((uint8_t *)(inp))[idx+2]), idx += 3 - -#define gget24(inp, idx, lval) \ - lval = gbyte((((uint8_t *)(inp))[idx]), 2) | \ - gbyte((((uint8_t *)(inp))[idx+1]), 1) | \ - (((uint8_t *)(inp))[idx+2]) - -#define sget32(inp, idx, lval) \ - lval = gbyte((((uint8_t *)(inp))[idx]), 3) | \ - gbyte((((uint8_t *)(inp))[idx+1]), 2) | \ - gbyte((((uint8_t *)(inp))[idx+2]), 1) | \ - (((uint8_t *)(inp))[idx+3]), idx += 4 - -#define gget32(inp, idx, lval) \ - lval = gbyte((((uint8_t *)(inp))[idx]), 3) | \ - gbyte((((uint8_t *)(inp))[idx+1]), 2) | \ - gbyte((((uint8_t *)(inp))[idx+2]), 1) | \ - (((uint8_t *)(inp))[idx+3]) - -#define SCSZ 0x2000 -#define CFLEN (256 + SES_ENCHDR_MINLEN) - -/* - * Routines specific && private to SES only - */ - -static int ses_getconfig(ses_softc_t *); -static int ses_getputstat(ses_softc_t *, int, SesComStat *, int, int); -static int ses_cfghdr(uint8_t *, int, SesCfgHdr *); -static int ses_enchdr(uint8_t *, int, uint8_t, SesEncHdr *); -static int ses_encdesc(uint8_t *, int, uint8_t, SesEncDesc *); -static int ses_getthdr(uint8_t *, int, int, SesThdr *); -static int ses_decode(char *, int, uint8_t *, int, int, SesComStat *); -static int ses_encode(char *, int, uint8_t *, int, int, SesComStat *); - -static int -ses_softc_init(ses_softc_t *ssc, int doinit) -{ - if (doinit == 0) { - struct sscfg *cc; - if (ssc->ses_nobjects) { - SES_FREE(ssc->ses_objmap, - ssc->ses_nobjects * sizeof (encobj)); - ssc->ses_objmap = NULL; - } - if ((cc = ssc->ses_private) != NULL) { - if (cc->ses_eltmap && cc->ses_ntypes) { - SES_FREE(cc->ses_eltmap, cc->ses_ntypes); - cc->ses_eltmap = NULL; - cc->ses_ntypes = 0; - } - if (cc->ses_typidx && ssc->ses_nobjects) { - SES_FREE(cc->ses_typidx, - ssc->ses_nobjects * sizeof (struct typidx)); - cc->ses_typidx = NULL; - } - SES_FREE(cc, sizeof (struct sscfg)); - ssc->ses_private = NULL; - } - ssc->ses_nobjects = 0; - return (0); - } - if (ssc->ses_private == NULL) { - ssc->ses_private = SES_MALLOC(sizeof (struct sscfg)); - } - if (ssc->ses_private == NULL) { - return (ENOMEM); - } - ssc->ses_nobjects = 0; - ssc->ses_encstat = 0; - return (ses_getconfig(ssc)); -} - -static int -ses_init_enc(ses_softc_t *ssc) -{ - return (0); -} - -static int -ses_get_encstat(ses_softc_t *ssc, int slpflag) -{ - SesComStat ComStat; - int status; - - if ((status = ses_getputstat(ssc, -1, &ComStat, slpflag, 1)) != 0) { - return (status); - } - ssc->ses_encstat = ComStat.comstatus | ENCI_SVALID; - return (0); -} - -static int -ses_set_encstat(ses_softc_t *ssc, uint8_t encstat, int slpflag) -{ - SesComStat ComStat; - int status; - - ComStat.comstatus = encstat & 0xf; - if ((status = ses_getputstat(ssc, -1, &ComStat, slpflag, 0)) != 0) { - return (status); - } - ssc->ses_encstat = encstat & 0xf; /* note no SVALID set */ - return (0); -} - -static int -ses_get_objstat(ses_softc_t *ssc, ses_objstat *obp, int slpflag) -{ - int i = (int)obp->obj_id; - - if (ssc->ses_objmap[i].svalid == 0) { - SesComStat ComStat; - int err = ses_getputstat(ssc, i, &ComStat, slpflag, 1); - if (err) - return (err); - ssc->ses_objmap[i].encstat[0] = ComStat.comstatus; - ssc->ses_objmap[i].encstat[1] = ComStat.comstat[0]; - ssc->ses_objmap[i].encstat[2] = ComStat.comstat[1]; - ssc->ses_objmap[i].encstat[3] = ComStat.comstat[2]; - ssc->ses_objmap[i].svalid = 1; - } - obp->cstat[0] = ssc->ses_objmap[i].encstat[0]; - obp->cstat[1] = ssc->ses_objmap[i].encstat[1]; - obp->cstat[2] = ssc->ses_objmap[i].encstat[2]; - obp->cstat[3] = ssc->ses_objmap[i].encstat[3]; - return (0); -} - -static int -ses_set_objstat(ses_softc_t *ssc, ses_objstat *obp, int slpflag) -{ - SesComStat ComStat; - int err; - /* - * If this is clear, we don't do diddly. - */ - if ((obp->cstat[0] & SESCTL_CSEL) == 0) { - return (0); - } - ComStat.comstatus = obp->cstat[0]; - ComStat.comstat[0] = obp->cstat[1]; - ComStat.comstat[1] = obp->cstat[2]; - ComStat.comstat[2] = obp->cstat[3]; - err = ses_getputstat(ssc, (int)obp->obj_id, &ComStat, slpflag, 0); - ssc->ses_objmap[(int)obp->obj_id].svalid = 0; - return (err); -} - -static int -ses_getconfig(ses_softc_t *ssc) -{ - struct sscfg *cc; - SesCfgHdr cf; - SesEncHdr hd; - SesEncDesc *cdp; - SesThdr thdr; - int err, amt, i, nobj, ntype, maxima; - char storage[CFLEN], *sdata; - static char cdb[6] = { - RECEIVE_DIAGNOSTIC, 0x1, SesConfigPage, SCSZ >> 8, SCSZ & 0xff, 0 - }; - - cc = ssc->ses_private; - if (cc == NULL) { - return (ENXIO); - } - - sdata = SES_MALLOC(SCSZ); - if (sdata == NULL) - return (ENOMEM); - - amt = SCSZ; - err = ses_runcmd(ssc, cdb, 6, sdata, &amt); - if (err) { - SES_FREE(sdata, SCSZ); - return (err); - } - amt = SCSZ - amt; - - if (ses_cfghdr((uint8_t *) sdata, amt, &cf)) { - SES_LOG(ssc, "Unable to parse SES Config Header\n"); - SES_FREE(sdata, SCSZ); - return (EIO); - } - if (amt < SES_ENCHDR_MINLEN) { - SES_LOG(ssc, "runt enclosure length (%d)\n", amt); - SES_FREE(sdata, SCSZ); - return (EIO); - } - - SES_VLOG(ssc, "GenCode %x %d Subenclosures\n", cf.GenCode, cf.Nsubenc); - - /* - * Now waltz through all the subenclosures toting up the - * number of types available in each. For this, we only - * really need the enclosure header. However, we get the - * enclosure descriptor for debug purposes, as well - * as self-consistency checking purposes. - */ - - maxima = cf.Nsubenc + 1; - cdp = (SesEncDesc *) storage; - for (ntype = i = 0; i < maxima; i++) { - MEMZERO((caddr_t)cdp, sizeof (*cdp)); - if (ses_enchdr((uint8_t *) sdata, amt, i, &hd)) { - SES_LOG(ssc, "Cannot Extract Enclosure Header %d\n", i); - SES_FREE(sdata, SCSZ); - return (EIO); - } - SES_VLOG(ssc, " SubEnclosure ID %d, %d Types With this ID, En" - "closure Length %d\n", hd.Subencid, hd.Ntypes, hd.VEnclen); - - if (ses_encdesc((uint8_t *)sdata, amt, i, cdp)) { - SES_LOG(ssc, "Can't get Enclosure Descriptor %d\n", i); - SES_FREE(sdata, SCSZ); - return (EIO); - } - SES_VLOG(ssc, " WWN: %02x%02x%02x%02x%02x%02x%02x%02x\n", - cdp->encWWN[0], cdp->encWWN[1], cdp->encWWN[2], - cdp->encWWN[3], cdp->encWWN[4], cdp->encWWN[5], - cdp->encWWN[6], cdp->encWWN[7]); - ntype += hd.Ntypes; - } - - /* - * Now waltz through all the types that are available, getting - * the type header so we can start adding up the number of - * objects available. - */ - for (nobj = i = 0; i < ntype; i++) { - if (ses_getthdr((uint8_t *)sdata, amt, i, &thdr)) { - SES_LOG(ssc, "Can't get Enclosure Type Header %d\n", i); - SES_FREE(sdata, SCSZ); - return (EIO); - } - SES_LOG(ssc, " Type Desc[%d]: Type 0x%x, MaxElt %d, In Subenc " - "%d, Text Length %d\n", i, thdr.enc_type, thdr.enc_maxelt, - thdr.enc_subenc, thdr.enc_tlen); - nobj += thdr.enc_maxelt; - } - - - /* - * Now allocate the object array and type map. - */ - - ssc->ses_objmap = SES_MALLOC(nobj * sizeof (encobj)); - cc->ses_typidx = SES_MALLOC(nobj * sizeof (struct typidx)); - cc->ses_eltmap = SES_MALLOC(ntype); - - if (ssc->ses_objmap == NULL || cc->ses_typidx == NULL || - cc->ses_eltmap == NULL) { - if (ssc->ses_objmap) { - SES_FREE(ssc->ses_objmap, (nobj * sizeof (encobj))); - ssc->ses_objmap = NULL; - } - if (cc->ses_typidx) { - SES_FREE(cc->ses_typidx, - (nobj * sizeof (struct typidx))); - cc->ses_typidx = NULL; - } - if (cc->ses_eltmap) { - SES_FREE(cc->ses_eltmap, ntype); - cc->ses_eltmap = NULL; - } - SES_FREE(sdata, SCSZ); - return (ENOMEM); - } - MEMZERO(ssc->ses_objmap, nobj * sizeof (encobj)); - MEMZERO(cc->ses_typidx, nobj * sizeof (struct typidx)); - MEMZERO(cc->ses_eltmap, ntype); - cc->ses_ntypes = (uint8_t) ntype; - ssc->ses_nobjects = nobj; - - /* - * Now waltz through the # of types again to fill in the types - * (and subenclosure ids) of the allocated objects. - */ - nobj = 0; - for (i = 0; i < ntype; i++) { - int j; - if (ses_getthdr((uint8_t *)sdata, amt, i, &thdr)) { - continue; - } - cc->ses_eltmap[i] = thdr.enc_maxelt; - for (j = 0; j < thdr.enc_maxelt; j++) { - cc->ses_typidx[nobj].ses_tidx = i; - cc->ses_typidx[nobj].ses_oidx = j; - ssc->ses_objmap[nobj].subenclosure = thdr.enc_subenc; - ssc->ses_objmap[nobj++].enctype = thdr.enc_type; - } - } - SES_FREE(sdata, SCSZ); - return (0); -} - -static int -ses_getputstat(ses_softc_t *ssc, int objid, SesComStat *sp, int slp, int in) -{ - struct sscfg *cc; - int err, amt, bufsiz, tidx, oidx; - char cdb[6], *sdata; - - cc = ssc->ses_private; - if (cc == NULL) { - return (ENXIO); - } - - /* - * If we're just getting overall enclosure status, - * we only need 2 bytes of data storage. - * - * If we're getting anything else, we know how much - * storage we need by noting that starting at offset - * 8 in returned data, all object status bytes are 4 - * bytes long, and are stored in chunks of types(M) - * and nth+1 instances of type M. - */ - if (objid == -1) { - bufsiz = 2; - } else { - bufsiz = (ssc->ses_nobjects * 4) + (cc->ses_ntypes * 4) + 8; - } - sdata = SES_MALLOC(bufsiz); - if (sdata == NULL) - return (ENOMEM); - - cdb[0] = RECEIVE_DIAGNOSTIC; - cdb[1] = 1; - cdb[2] = SesStatusPage; - cdb[3] = bufsiz >> 8; - cdb[4] = bufsiz & 0xff; - cdb[5] = 0; - amt = bufsiz; - err = ses_runcmd(ssc, cdb, 6, sdata, &amt); - if (err) { - SES_FREE(sdata, bufsiz); - return (err); - } - amt = bufsiz - amt; - - if (objid == -1) { - tidx = -1; - oidx = -1; - } else { - tidx = cc->ses_typidx[objid].ses_tidx; - oidx = cc->ses_typidx[objid].ses_oidx; - } - if (in) { - if (ses_decode(sdata, amt, cc->ses_eltmap, tidx, oidx, sp)) { - err = ENODEV; - } - } else { - if (ses_encode(sdata, amt, cc->ses_eltmap, tidx, oidx, sp)) { - err = ENODEV; - } else { - cdb[0] = SEND_DIAGNOSTIC; - cdb[1] = 0x10; - cdb[2] = 0; - cdb[3] = bufsiz >> 8; - cdb[4] = bufsiz & 0xff; - cdb[5] = 0; - amt = -bufsiz; - err = ses_runcmd(ssc, cdb, 6, sdata, &amt); - } - } - SES_FREE(sdata, bufsiz); - return (0); -} - - -/* - * Routines to parse returned SES data structures. - * Architecture and compiler independent. - */ - -static int -ses_cfghdr(uint8_t *buffer, int buflen, SesCfgHdr *cfp) -{ - if (buflen < SES_CFGHDR_MINLEN) { - return (-1); - } - gget8(buffer, 1, cfp->Nsubenc); - gget32(buffer, 4, cfp->GenCode); - return (0); -} - -static int -ses_enchdr(uint8_t *buffer, int amt, uint8_t SubEncId, SesEncHdr *chp) -{ - int s, off = 8; - for (s = 0; s < SubEncId; s++) { - if (off + 3 > amt) - return (-1); - off += buffer[off+3] + 4; - } - if (off + 3 > amt) { - return (-1); - } - gget8(buffer, off+1, chp->Subencid); - gget8(buffer, off+2, chp->Ntypes); - gget8(buffer, off+3, chp->VEnclen); - return (0); -} - -static int -ses_encdesc(uint8_t *buffer, int amt, uint8_t SubEncId, SesEncDesc *cdp) -{ - int s, e, enclen, off = 8; - for (s = 0; s < SubEncId; s++) { - if (off + 3 > amt) - return (-1); - off += buffer[off+3] + 4; - } - if (off + 3 > amt) { - return (-1); - } - gget8(buffer, off+3, enclen); - off += 4; - if (off >= amt) - return (-1); - - e = off + enclen; - if (e > amt) { - e = amt; - } - MEMCPY(cdp, &buffer[off], e - off); - return (0); -} - -static int -ses_getthdr(uint8_t *buffer, int amt, int nth, SesThdr *thp) -{ - int s, off = 8; - - if (amt < SES_CFGHDR_MINLEN) { - return (-1); - } - for (s = 0; s < buffer[1]; s++) { - if (off + 3 > amt) - return (-1); - off += buffer[off+3] + 4; - } - if (off + 3 > amt) { - return (-1); - } - off += buffer[off+3] + 4 + (nth * 4); - if (amt < (off + 4)) - return (-1); - - gget8(buffer, off++, thp->enc_type); - gget8(buffer, off++, thp->enc_maxelt); - gget8(buffer, off++, thp->enc_subenc); - gget8(buffer, off, thp->enc_tlen); - return (0); -} - -/* - * This function needs a little explanation. - * - * The arguments are: - * - * - * char *b, int amt - * - * These describes the raw input SES status data and length. - * - * uint8_t *ep - * - * This is a map of the number of types for each element type - * in the enclosure. - * - * int elt - * - * This is the element type being sought. If elt is -1, - * then overall enclosure status is being sought. - * - * int elm - * - * This is the ordinal Mth element of type elt being sought. - * - * SesComStat *sp - * - * This is the output area to store the status for - * the Mth element of type Elt. - */ - -static int -ses_decode(char *b, int amt, uint8_t *ep, int elt, int elm, SesComStat *sp) -{ - int idx, i; - - /* - * If it's overall enclosure status being sought, get that. - * We need at least 2 bytes of status data to get that. - */ - if (elt == -1) { - if (amt < 2) - return (-1); - gget8(b, 1, sp->comstatus); - sp->comstat[0] = 0; - sp->comstat[1] = 0; - sp->comstat[2] = 0; - return (0); - } - - /* - * Check to make sure that the Mth element is legal for type Elt. - */ - - if (elm >= ep[elt]) - return (-1); - - /* - * Starting at offset 8, start skipping over the storage - * for the element types we're not interested in. - */ - for (idx = 8, i = 0; i < elt; i++) { - idx += ((ep[i] + 1) * 4); - } - - /* - * Skip over Overall status for this element type. - */ - idx += 4; - - /* - * And skip to the index for the Mth element that we're going for. - */ - idx += (4 * elm); - - /* - * Make sure we haven't overflowed the buffer. - */ - if (idx+4 > amt) - return (-1); - - /* - * Retrieve the status. - */ - gget8(b, idx++, sp->comstatus); - gget8(b, idx++, sp->comstat[0]); - gget8(b, idx++, sp->comstat[1]); - gget8(b, idx++, sp->comstat[2]); -#if 0 - PRINTF("Get Elt 0x%x Elm 0x%x (idx %d)\n", elt, elm, idx-4); -#endif - return (0); -} - -/* - * This is the mirror function to ses_decode, but we set the 'select' - * bit for the object which we're interested in. All other objects, - * after a status fetch, should have that bit off. Hmm. It'd be easy - * enough to ensure this, so we will. - */ - -static int -ses_encode(char *b, int amt, uint8_t *ep, int elt, int elm, SesComStat *sp) -{ - int idx, i; - - /* - * If it's overall enclosure status being sought, get that. - * We need at least 2 bytes of status data to get that. - */ - if (elt == -1) { - if (amt < 2) - return (-1); - i = 0; - sset8(b, i, 0); - sset8(b, i, sp->comstatus & 0xf); -#if 0 - PRINTF("set EncStat %x\n", sp->comstatus); -#endif - return (0); - } - - /* - * Check to make sure that the Mth element is legal for type Elt. - */ - - if (elm >= ep[elt]) - return (-1); - - /* - * Starting at offset 8, start skipping over the storage - * for the element types we're not interested in. - */ - for (idx = 8, i = 0; i < elt; i++) { - idx += ((ep[i] + 1) * 4); - } - - /* - * Skip over Overall status for this element type. - */ - idx += 4; - - /* - * And skip to the index for the Mth element that we're going for. - */ - idx += (4 * elm); - - /* - * Make sure we haven't overflowed the buffer. - */ - if (idx+4 > amt) - return (-1); - - /* - * Set the status. - */ - sset8(b, idx, sp->comstatus); - sset8(b, idx, sp->comstat[0]); - sset8(b, idx, sp->comstat[1]); - sset8(b, idx, sp->comstat[2]); - idx -= 4; - -#if 0 - PRINTF("Set Elt 0x%x Elm 0x%x (idx %d) with %x %x %x %x\n", - elt, elm, idx, sp->comstatus, sp->comstat[0], - sp->comstat[1], sp->comstat[2]); -#endif - - /* - * Now make sure all other 'Select' bits are off. - */ - for (i = 8; i < amt; i += 4) { - if (i != idx) - b[i] &= ~0x80; - } - /* - * And make sure the INVOP bit is clear. - */ - b[2] &= ~0x10; - - return (0); -} - -/* - * SAF-TE Type Device Emulation - */ - -static int safte_getconfig(ses_softc_t *); -static int safte_rdstat(ses_softc_t *, int); -static int set_objstat_sel(ses_softc_t *, ses_objstat *, int); -static int wrbuf16(ses_softc_t *, uint8_t, uint8_t, uint8_t, uint8_t, int); -static void wrslot_stat(ses_softc_t *, int); -static int perf_slotop(ses_softc_t *, uint8_t, uint8_t, int); - -#define ALL_ENC_STAT (SES_ENCSTAT_CRITICAL | SES_ENCSTAT_UNRECOV | \ - SES_ENCSTAT_NONCRITICAL | SES_ENCSTAT_INFO) -/* - * SAF-TE specific defines- Mandatory ones only... - */ - -/* - * READ BUFFER ('get' commands) IDs- placed in offset 2 of cdb - */ -#define SAFTE_RD_RDCFG 0x00 /* read enclosure configuration */ -#define SAFTE_RD_RDESTS 0x01 /* read enclosure status */ -#define SAFTE_RD_RDDSTS 0x04 /* read drive slot status */ - -/* - * WRITE BUFFER ('set' commands) IDs- placed in offset 0 of databuf - */ -#define SAFTE_WT_DSTAT 0x10 /* write device slot status */ -#define SAFTE_WT_SLTOP 0x12 /* perform slot operation */ -#define SAFTE_WT_FANSPD 0x13 /* set fan speed */ -#define SAFTE_WT_ACTPWS 0x14 /* turn on/off power supply */ -#define SAFTE_WT_GLOBAL 0x15 /* send global command */ - - -#define SAFT_SCRATCH 64 -#define NPSEUDO_THERM 16 -#define NPSEUDO_ALARM 1 -struct scfg { - /* - * Cached Configuration - */ - uint8_t Nfans; /* Number of Fans */ - uint8_t Npwr; /* Number of Power Supplies */ - uint8_t Nslots; /* Number of Device Slots */ - uint8_t DoorLock; /* Door Lock Installed */ - uint8_t Ntherm; /* Number of Temperature Sensors */ - uint8_t Nspkrs; /* Number of Speakers */ - uint8_t Nalarm; /* Number of Alarms (at least one) */ - /* - * Cached Flag Bytes for Global Status - */ - uint8_t flag1; - uint8_t flag2; - /* - * What object index ID is where various slots start. - */ - uint8_t pwroff; - uint8_t slotoff; -#define SAFT_ALARM_OFFSET(cc) (cc)->slotoff - 1 -}; - -#define SAFT_FLG1_ALARM 0x1 -#define SAFT_FLG1_GLOBFAIL 0x2 -#define SAFT_FLG1_GLOBWARN 0x4 -#define SAFT_FLG1_ENCPWROFF 0x8 -#define SAFT_FLG1_ENCFANFAIL 0x10 -#define SAFT_FLG1_ENCPWRFAIL 0x20 -#define SAFT_FLG1_ENCDRVFAIL 0x40 -#define SAFT_FLG1_ENCDRVWARN 0x80 - -#define SAFT_FLG2_LOCKDOOR 0x4 -#define SAFT_PRIVATE sizeof (struct scfg) - -static char *safte_2little = "Too Little Data Returned (%d) at line %d\n"; -#define SAFT_BAIL(r, x, k, l) \ - if ((r) >= (x)) { \ - SES_LOG(ssc, safte_2little, x, __LINE__);\ - SES_FREE((k), (l)); \ - return (EIO); \ - } - - -static int -safte_softc_init(ses_softc_t *ssc, int doinit) -{ - int err, i, r; - struct scfg *cc; - - if (doinit == 0) { - if (ssc->ses_nobjects) { - if (ssc->ses_objmap) { - SES_FREE(ssc->ses_objmap, - ssc->ses_nobjects * sizeof (encobj)); - ssc->ses_objmap = NULL; - } - ssc->ses_nobjects = 0; - } - if (ssc->ses_private) { - SES_FREE(ssc->ses_private, SAFT_PRIVATE); - ssc->ses_private = NULL; - } - return (0); - } - - if (ssc->ses_private == NULL) { - ssc->ses_private = SES_MALLOC(SAFT_PRIVATE); - if (ssc->ses_private == NULL) { - return (ENOMEM); - } - MEMZERO(ssc->ses_private, SAFT_PRIVATE); - } - - ssc->ses_nobjects = 0; - ssc->ses_encstat = 0; - - if ((err = safte_getconfig(ssc)) != 0) { - return (err); - } - - /* - * The number of objects here, as well as that reported by the - * READ_BUFFER/GET_CONFIG call, are the over-temperature flags (15) - * that get reported during READ_BUFFER/READ_ENC_STATUS. - */ - cc = ssc->ses_private; - ssc->ses_nobjects = cc->Nfans + cc->Npwr + cc->Nslots + cc->DoorLock + - cc->Ntherm + cc->Nspkrs + NPSEUDO_THERM + NPSEUDO_ALARM; - ssc->ses_objmap = (encobj *) - SES_MALLOC(ssc->ses_nobjects * sizeof (encobj)); - if (ssc->ses_objmap == NULL) { - return (ENOMEM); - } - MEMZERO(ssc->ses_objmap, ssc->ses_nobjects * sizeof (encobj)); - - r = 0; - /* - * Note that this is all arranged for the convenience - * in later fetches of status. - */ - for (i = 0; i < cc->Nfans; i++) - ssc->ses_objmap[r++].enctype = SESTYP_FAN; - cc->pwroff = (uint8_t) r; - for (i = 0; i < cc->Npwr; i++) - ssc->ses_objmap[r++].enctype = SESTYP_POWER; - for (i = 0; i < cc->DoorLock; i++) - ssc->ses_objmap[r++].enctype = SESTYP_DOORLOCK; - for (i = 0; i < cc->Nspkrs; i++) - ssc->ses_objmap[r++].enctype = SESTYP_ALARM; - for (i = 0; i < cc->Ntherm; i++) - ssc->ses_objmap[r++].enctype = SESTYP_THERM; - for (i = 0; i < NPSEUDO_THERM; i++) - ssc->ses_objmap[r++].enctype = SESTYP_THERM; - ssc->ses_objmap[r++].enctype = SESTYP_ALARM; - cc->slotoff = (uint8_t) r; - for (i = 0; i < cc->Nslots; i++) - ssc->ses_objmap[r++].enctype = SESTYP_DEVICE; - return (0); -} - -static int -safte_init_enc(ses_softc_t *ssc) -{ - int err; - static char cdb0[6] = { SEND_DIAGNOSTIC }; - - err = ses_runcmd(ssc, cdb0, 6, NULL, 0); - if (err) { - return (err); - } - DELAY(5000); - err = wrbuf16(ssc, SAFTE_WT_GLOBAL, 0, 0, 0, 1); - return (err); -} - -static int -safte_get_encstat(ses_softc_t *ssc, int slpflg) -{ - return (safte_rdstat(ssc, slpflg)); -} - -static int -safte_set_encstat(ses_softc_t *ssc, uint8_t encstat, int slpflg) -{ - struct scfg *cc = ssc->ses_private; - if (cc == NULL) - return (0); - /* - * Since SAF-TE devices aren't necessarily sticky in terms - * of state, make our soft copy of enclosure status 'sticky'- - * that is, things set in enclosure status stay set (as implied - * by conditions set in reading object status) until cleared. - */ - ssc->ses_encstat &= ~ALL_ENC_STAT; - ssc->ses_encstat |= (encstat & ALL_ENC_STAT); - ssc->ses_encstat |= ENCI_SVALID; - cc->flag1 &= ~(SAFT_FLG1_ALARM|SAFT_FLG1_GLOBFAIL|SAFT_FLG1_GLOBWARN); - if ((encstat & (SES_ENCSTAT_CRITICAL|SES_ENCSTAT_UNRECOV)) != 0) { - cc->flag1 |= SAFT_FLG1_ALARM|SAFT_FLG1_GLOBFAIL; - } else if ((encstat & SES_ENCSTAT_NONCRITICAL) != 0) { - cc->flag1 |= SAFT_FLG1_GLOBWARN; - } - return (wrbuf16(ssc, SAFTE_WT_GLOBAL, cc->flag1, cc->flag2, 0, slpflg)); -} - -static int -safte_get_objstat(ses_softc_t *ssc, ses_objstat *obp, int slpflg) -{ - int i = (int)obp->obj_id; - - if ((ssc->ses_encstat & ENCI_SVALID) == 0 || - (ssc->ses_objmap[i].svalid) == 0) { - int err = safte_rdstat(ssc, slpflg); - if (err) - return (err); - } - obp->cstat[0] = ssc->ses_objmap[i].encstat[0]; - obp->cstat[1] = ssc->ses_objmap[i].encstat[1]; - obp->cstat[2] = ssc->ses_objmap[i].encstat[2]; - obp->cstat[3] = ssc->ses_objmap[i].encstat[3]; - return (0); -} - - -static int -safte_set_objstat(ses_softc_t *ssc, ses_objstat *obp, int slp) -{ - int idx, err; - encobj *ep; - struct scfg *cc; - - - SES_DLOG(ssc, "safte_set_objstat(%d): %x %x %x %x\n", - (int)obp->obj_id, obp->cstat[0], obp->cstat[1], obp->cstat[2], - obp->cstat[3]); - - /* - * If this is clear, we don't do diddly. - */ - if ((obp->cstat[0] & SESCTL_CSEL) == 0) { - return (0); - } - - err = 0; - /* - * Check to see if the common bits are set and do them first. - */ - if (obp->cstat[0] & ~SESCTL_CSEL) { - err = set_objstat_sel(ssc, obp, slp); - if (err) - return (err); - } - - cc = ssc->ses_private; - if (cc == NULL) - return (0); - - idx = (int)obp->obj_id; - ep = &ssc->ses_objmap[idx]; - - switch (ep->enctype) { - case SESTYP_DEVICE: - { - uint8_t slotop = 0; - /* - * XXX: I should probably cache the previous state - * XXX: of SESCTL_DEVOFF so that when it goes from - * XXX: true to false I can then set PREPARE FOR OPERATION - * XXX: flag in PERFORM SLOT OPERATION write buffer command. - */ - if (obp->cstat[2] & (SESCTL_RQSINS|SESCTL_RQSRMV)) { - slotop |= 0x2; - } - if (obp->cstat[2] & SESCTL_RQSID) { - slotop |= 0x4; - } - err = perf_slotop(ssc, (uint8_t) idx - (uint8_t) cc->slotoff, - slotop, slp); - if (err) - return (err); - if (obp->cstat[3] & SESCTL_RQSFLT) { - ep->priv |= 0x2; - } else { - ep->priv &= ~0x2; - } - if (ep->priv & 0xc6) { - ep->priv &= ~0x1; - } else { - ep->priv |= 0x1; /* no errors */ - } - wrslot_stat(ssc, slp); - break; - } - case SESTYP_POWER: - if (obp->cstat[3] & SESCTL_RQSTFAIL) { - cc->flag1 |= SAFT_FLG1_ENCPWRFAIL; - } else { - cc->flag1 &= ~SAFT_FLG1_ENCPWRFAIL; - } - err = wrbuf16(ssc, SAFTE_WT_GLOBAL, cc->flag1, - cc->flag2, 0, slp); - if (err) - return (err); - if (obp->cstat[3] & SESCTL_RQSTON) { - (void) wrbuf16(ssc, SAFTE_WT_ACTPWS, - idx - cc->pwroff, 0, 0, slp); - } else { - (void) wrbuf16(ssc, SAFTE_WT_ACTPWS, - idx - cc->pwroff, 0, 1, slp); - } - break; - case SESTYP_FAN: - if (obp->cstat[3] & SESCTL_RQSTFAIL) { - cc->flag1 |= SAFT_FLG1_ENCFANFAIL; - } else { - cc->flag1 &= ~SAFT_FLG1_ENCFANFAIL; - } - err = wrbuf16(ssc, SAFTE_WT_GLOBAL, cc->flag1, - cc->flag2, 0, slp); - if (err) - return (err); - if (obp->cstat[3] & SESCTL_RQSTON) { - uint8_t fsp; - if ((obp->cstat[3] & 0x7) == 7) { - fsp = 4; - } else if ((obp->cstat[3] & 0x7) == 6) { - fsp = 3; - } else if ((obp->cstat[3] & 0x7) == 4) { - fsp = 2; - } else { - fsp = 1; - } - (void) wrbuf16(ssc, SAFTE_WT_FANSPD, idx, fsp, 0, slp); - } else { - (void) wrbuf16(ssc, SAFTE_WT_FANSPD, idx, 0, 0, slp); - } - break; - case SESTYP_DOORLOCK: - if (obp->cstat[3] & 0x1) { - cc->flag2 &= ~SAFT_FLG2_LOCKDOOR; - } else { - cc->flag2 |= SAFT_FLG2_LOCKDOOR; - } - (void) wrbuf16(ssc, SAFTE_WT_GLOBAL, cc->flag1, - cc->flag2, 0, slp); - break; - case SESTYP_ALARM: - /* - * On all nonzero but the 'muted' bit, we turn on the alarm, - */ - obp->cstat[3] &= ~0xa; - if (obp->cstat[3] & 0x40) { - cc->flag2 &= ~SAFT_FLG1_ALARM; - } else if (obp->cstat[3] != 0) { - cc->flag2 |= SAFT_FLG1_ALARM; - } else { - cc->flag2 &= ~SAFT_FLG1_ALARM; - } - ep->priv = obp->cstat[3]; - (void) wrbuf16(ssc, SAFTE_WT_GLOBAL, cc->flag1, - cc->flag2, 0, slp); - break; - default: - break; - } - ep->svalid = 0; - return (0); -} - -static int -safte_getconfig(ses_softc_t *ssc) -{ - struct scfg *cfg; - int err, amt; - char *sdata; - static char cdb[10] = - { READ_BUFFER, 1, SAFTE_RD_RDCFG, 0, 0, 0, 0, 0, SAFT_SCRATCH, 0 }; - - cfg = ssc->ses_private; - if (cfg == NULL) - return (ENXIO); - - sdata = SES_MALLOC(SAFT_SCRATCH); - if (sdata == NULL) - return (ENOMEM); - - amt = SAFT_SCRATCH; - err = ses_runcmd(ssc, cdb, 10, sdata, &amt); - if (err) { - SES_FREE(sdata, SAFT_SCRATCH); - return (err); - } - amt = SAFT_SCRATCH - amt; - if (amt < 6) { - SES_LOG(ssc, "too little data (%d) for configuration\n", amt); - SES_FREE(sdata, SAFT_SCRATCH); - return (EIO); - } - SES_VLOG(ssc, "Nfans %d Npwr %d Nslots %d Lck %d Ntherm %d Nspkrs %d\n", - sdata[0], sdata[1], sdata[2], sdata[3], sdata[4], sdata[5]); - cfg->Nfans = sdata[0]; - cfg->Npwr = sdata[1]; - cfg->Nslots = sdata[2]; - cfg->DoorLock = sdata[3]; - cfg->Ntherm = sdata[4]; - cfg->Nspkrs = sdata[5]; - cfg->Nalarm = NPSEUDO_ALARM; - SES_FREE(sdata, SAFT_SCRATCH); - return (0); -} - -static int -safte_rdstat(ses_softc_t *ssc, int slpflg) -{ - int err, oid, r, i, hiwater, nitems, amt; - uint16_t tempflags; - size_t buflen; - uint8_t status, oencstat; - char *sdata, cdb[10]; - struct scfg *cc = ssc->ses_private; - - - /* - * The number of objects overstates things a bit, - * both for the bogus 'thermometer' entries and - * the drive status (which isn't read at the same - * time as the enclosure status), but that's okay. - */ - buflen = 4 * cc->Nslots; - if (ssc->ses_nobjects > buflen) - buflen = ssc->ses_nobjects; - sdata = SES_MALLOC(buflen); - if (sdata == NULL) - return (ENOMEM); - - cdb[0] = READ_BUFFER; - cdb[1] = 1; - cdb[2] = SAFTE_RD_RDESTS; - cdb[3] = 0; - cdb[4] = 0; - cdb[5] = 0; - cdb[6] = 0; - cdb[7] = (buflen >> 8) & 0xff; - cdb[8] = buflen & 0xff; - cdb[9] = 0; - amt = buflen; - err = ses_runcmd(ssc, cdb, 10, sdata, &amt); - if (err) { - SES_FREE(sdata, buflen); - return (err); - } - hiwater = buflen - amt; - - - /* - * invalidate all status bits. - */ - for (i = 0; i < ssc->ses_nobjects; i++) - ssc->ses_objmap[i].svalid = 0; - oencstat = ssc->ses_encstat & ALL_ENC_STAT; - ssc->ses_encstat = 0; - - - /* - * Now parse returned buffer. - * If we didn't get enough data back, - * that's considered a fatal error. - */ - oid = r = 0; - - for (nitems = i = 0; i < cc->Nfans; i++) { - SAFT_BAIL(r, hiwater, sdata, buflen); - /* - * 0 = Fan Operational - * 1 = Fan is malfunctioning - * 2 = Fan is not present - * 0x80 = Unknown or Not Reportable Status - */ - ssc->ses_objmap[oid].encstat[1] = 0; /* resvd */ - ssc->ses_objmap[oid].encstat[2] = 0; /* resvd */ - switch ((int)(uint8_t)sdata[r]) { - case 0: - nitems++; - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_OK; - /* - * We could get fancier and cache - * fan speeds that we have set, but - * that isn't done now. - */ - ssc->ses_objmap[oid].encstat[3] = 7; - break; - - case 1: - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_CRIT; - /* - * FAIL and FAN STOPPED synthesized - */ - ssc->ses_objmap[oid].encstat[3] = 0x40; - /* - * Enclosure marked with CRITICAL error - * if only one fan or no thermometers, - * else the NONCRITICAL error is set. - */ - if (cc->Nfans == 1 || cc->Ntherm == 0) - ssc->ses_encstat |= SES_ENCSTAT_CRITICAL; - else - ssc->ses_encstat |= SES_ENCSTAT_NONCRITICAL; - break; - case 2: - ssc->ses_objmap[oid].encstat[0] = - SES_OBJSTAT_NOTINSTALLED; - ssc->ses_objmap[oid].encstat[3] = 0; - /* - * Enclosure marked with CRITICAL error - * if only one fan or no thermometers, - * else the NONCRITICAL error is set. - */ - if (cc->Nfans == 1) - ssc->ses_encstat |= SES_ENCSTAT_CRITICAL; - else - ssc->ses_encstat |= SES_ENCSTAT_NONCRITICAL; - break; - case 0x80: - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; - ssc->ses_objmap[oid].encstat[3] = 0; - ssc->ses_encstat |= SES_ENCSTAT_INFO; - break; - default: - ssc->ses_objmap[oid].encstat[0] = - SES_OBJSTAT_UNSUPPORTED; - SES_LOG(ssc, "Unknown fan%d status 0x%x\n", i, - sdata[r] & 0xff); - break; - } - ssc->ses_objmap[oid++].svalid = 1; - r++; - } - - /* - * No matter how you cut it, no cooling elements when there - * should be some there is critical. - */ - if (cc->Nfans && nitems == 0) { - ssc->ses_encstat |= SES_ENCSTAT_CRITICAL; - } - - - for (i = 0; i < cc->Npwr; i++) { - SAFT_BAIL(r, hiwater, sdata, buflen); - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; - ssc->ses_objmap[oid].encstat[1] = 0; /* resvd */ - ssc->ses_objmap[oid].encstat[2] = 0; /* resvd */ - ssc->ses_objmap[oid].encstat[3] = 0x20; /* requested on */ - switch ((uint8_t)sdata[r]) { - case 0x00: /* pws operational and on */ - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_OK; - break; - case 0x01: /* pws operational and off */ - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_OK; - ssc->ses_objmap[oid].encstat[3] = 0x10; - ssc->ses_encstat |= SES_ENCSTAT_INFO; - break; - case 0x10: /* pws is malfunctioning and commanded on */ - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_CRIT; - ssc->ses_objmap[oid].encstat[3] = 0x61; - ssc->ses_encstat |= SES_ENCSTAT_NONCRITICAL; - break; - - case 0x11: /* pws is malfunctioning and commanded off */ - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_NONCRIT; - ssc->ses_objmap[oid].encstat[3] = 0x51; - ssc->ses_encstat |= SES_ENCSTAT_NONCRITICAL; - break; - case 0x20: /* pws is not present */ - ssc->ses_objmap[oid].encstat[0] = - SES_OBJSTAT_NOTINSTALLED; - ssc->ses_objmap[oid].encstat[3] = 0; - ssc->ses_encstat |= SES_ENCSTAT_INFO; - break; - case 0x21: /* pws is present */ - /* - * This is for enclosures that cannot tell whether the - * device is on or malfunctioning, but know that it is - * present. Just fall through. - */ - /* FALLTHROUGH */ - case 0x80: /* Unknown or Not Reportable Status */ - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; - ssc->ses_objmap[oid].encstat[3] = 0; - ssc->ses_encstat |= SES_ENCSTAT_INFO; - break; - default: - SES_LOG(ssc, "unknown power supply %d status (0x%x)\n", - i, sdata[r] & 0xff); - break; - } - ssc->ses_objmap[oid++].svalid = 1; - r++; - } - - /* - * Skip over Slot SCSI IDs - */ - r += cc->Nslots; - - /* - * We always have doorlock status, no matter what, - * but we only save the status if we have one. - */ - SAFT_BAIL(r, hiwater, sdata, buflen); - if (cc->DoorLock) { - /* - * 0 = Door Locked - * 1 = Door Unlocked, or no Lock Installed - * 0x80 = Unknown or Not Reportable Status - */ - ssc->ses_objmap[oid].encstat[1] = 0; - ssc->ses_objmap[oid].encstat[2] = 0; - switch ((uint8_t)sdata[r]) { - case 0: - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_OK; - ssc->ses_objmap[oid].encstat[3] = 0; - break; - case 1: - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_OK; - ssc->ses_objmap[oid].encstat[3] = 1; - break; - case 0x80: - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; - ssc->ses_objmap[oid].encstat[3] = 0; - ssc->ses_encstat |= SES_ENCSTAT_INFO; - break; - default: - ssc->ses_objmap[oid].encstat[0] = - SES_OBJSTAT_UNSUPPORTED; - SES_LOG(ssc, "unknown lock status 0x%x\n", - sdata[r] & 0xff); - break; - } - ssc->ses_objmap[oid++].svalid = 1; - } - r++; - - /* - * We always have speaker status, no matter what, - * but we only save the status if we have one. - */ - SAFT_BAIL(r, hiwater, sdata, buflen); - if (cc->Nspkrs) { - ssc->ses_objmap[oid].encstat[1] = 0; - ssc->ses_objmap[oid].encstat[2] = 0; - if (sdata[r] == 1) { - /* - * We need to cache tone urgency indicators. - * Someday. - */ - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_NONCRIT; - ssc->ses_objmap[oid].encstat[3] = 0x8; - ssc->ses_encstat |= SES_ENCSTAT_NONCRITICAL; - } else if (sdata[r] == 0) { - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_OK; - ssc->ses_objmap[oid].encstat[3] = 0; - } else { - ssc->ses_objmap[oid].encstat[0] = - SES_OBJSTAT_UNSUPPORTED; - ssc->ses_objmap[oid].encstat[3] = 0; - SES_LOG(ssc, "unknown spkr status 0x%x\n", - sdata[r] & 0xff); - } - ssc->ses_objmap[oid++].svalid = 1; - } - r++; - - for (i = 0; i < cc->Ntherm; i++) { - SAFT_BAIL(r, hiwater, sdata, buflen); - /* - * Status is a range from -10 to 245 deg Celsius, - * which we need to normalize to -20 to -245 according - * to the latest SCSI spec, which makes little - * sense since this would overflow an 8bit value. - * Well, still, the base normalization is -20, - * not -10, so we have to adjust. - * - * So what's over and under temperature? - * Hmm- we'll state that 'normal' operating - * is 10 to 40 deg Celsius. - */ - - /* - * Actually.... All of the units that people out in the world - * seem to have do not come even close to setting a value that - * complies with this spec. - * - * The closest explanation I could find was in an - * LSI-Logic manual, which seemed to indicate that - * this value would be set by whatever the I2C code - * would interpolate from the output of an LM75 - * temperature sensor. - * - * This means that it is impossible to use the actual - * numeric value to predict anything. But we don't want - * to lose the value. So, we'll propagate the *uncorrected* - * value and set SES_OBJSTAT_NOTAVAIL. We'll depend on the - * temperature flags for warnings. - */ - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_NOTAVAIL; - ssc->ses_objmap[oid].encstat[1] = 0; - ssc->ses_objmap[oid].encstat[2] = sdata[r]; - ssc->ses_objmap[oid].encstat[3] = 0; - ssc->ses_objmap[oid++].svalid = 1; - r++; - } - - /* - * Now, for "pseudo" thermometers, we have two bytes - * of information in enclosure status- 16 bits. Actually, - * the MSB is a single TEMP ALERT flag indicating whether - * any other bits are set, but, thanks to fuzzy thinking, - * in the SAF-TE spec, this can also be set even if no - * other bits are set, thus making this really another - * binary temperature sensor. - */ - - SAFT_BAIL(r, hiwater, sdata, buflen); - tempflags = sdata[r++]; - SAFT_BAIL(r, hiwater, sdata, buflen); - tempflags |= (tempflags << 8) | sdata[r++]; - - for (i = 0; i < NPSEUDO_THERM; i++) { - ssc->ses_objmap[oid].encstat[1] = 0; - if (tempflags & (1 << (NPSEUDO_THERM - i - 1))) { - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_CRIT; - ssc->ses_objmap[4].encstat[2] = 0xff; - /* - * Set 'over temperature' failure. - */ - ssc->ses_objmap[oid].encstat[3] = 8; - ssc->ses_encstat |= SES_ENCSTAT_CRITICAL; - } else { - /* - * We used to say 'not available' and synthesize a - * nominal 30 deg (C)- that was wrong. Actually, - * Just say 'OK', and use the reserved value of - * zero. - */ - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_OK; - ssc->ses_objmap[oid].encstat[2] = 0; - ssc->ses_objmap[oid].encstat[3] = 0; - } - ssc->ses_objmap[oid++].svalid = 1; - } - - /* - * Get alarm status. - */ - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_OK; - ssc->ses_objmap[oid].encstat[3] = ssc->ses_objmap[oid].priv; - ssc->ses_objmap[oid++].svalid = 1; - - /* - * Now get drive slot status - */ - cdb[2] = SAFTE_RD_RDDSTS; - amt = buflen; - err = ses_runcmd(ssc, cdb, 10, sdata, &amt); - if (err) { - SES_FREE(sdata, buflen); - return (err); - } - hiwater = buflen - amt; - for (r = i = 0; i < cc->Nslots; i++, r += 4) { - SAFT_BAIL(r+3, hiwater, sdata, buflen); - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_UNSUPPORTED; - ssc->ses_objmap[oid].encstat[1] = (uint8_t) i; - ssc->ses_objmap[oid].encstat[2] = 0; - ssc->ses_objmap[oid].encstat[3] = 0; - status = sdata[r+3]; - if ((status & 0x1) == 0) { /* no device */ - ssc->ses_objmap[oid].encstat[0] = - SES_OBJSTAT_NOTINSTALLED; - } else { - ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_OK; - } - if (status & 0x2) { - ssc->ses_objmap[oid].encstat[2] = 0x8; - } - if ((status & 0x4) == 0) { - ssc->ses_objmap[oid].encstat[3] = 0x10; - } - ssc->ses_objmap[oid++].svalid = 1; - } - /* see comment below about sticky enclosure status */ - ssc->ses_encstat |= ENCI_SVALID | oencstat; - SES_FREE(sdata, buflen); - return (0); -} - -static int -set_objstat_sel(ses_softc_t *ssc, ses_objstat *obp, int slp) -{ - int idx; - encobj *ep; - struct scfg *cc = ssc->ses_private; - - if (cc == NULL) - return (0); - - idx = (int)obp->obj_id; - ep = &ssc->ses_objmap[idx]; - - switch (ep->enctype) { - case SESTYP_DEVICE: - if (obp->cstat[0] & SESCTL_PRDFAIL) { - ep->priv |= 0x40; - } - /* SESCTL_RSTSWAP has no correspondence in SAF-TE */ - if (obp->cstat[0] & SESCTL_DISABLE) { - ep->priv |= 0x80; - /* - * Hmm. Try to set the 'No Drive' flag. - * Maybe that will count as a 'disable'. - */ - } - if (ep->priv & 0xc6) { - ep->priv &= ~0x1; - } else { - ep->priv |= 0x1; /* no errors */ - } - wrslot_stat(ssc, slp); - break; - case SESTYP_POWER: - /* - * Okay- the only one that makes sense here is to - * do the 'disable' for a power supply. - */ - if (obp->cstat[0] & SESCTL_DISABLE) { - (void) wrbuf16(ssc, SAFTE_WT_ACTPWS, - idx - cc->pwroff, 0, 0, slp); - } - break; - case SESTYP_FAN: - /* - * Okay- the only one that makes sense here is to - * set fan speed to zero on disable. - */ - if (obp->cstat[0] & SESCTL_DISABLE) { - /* remember- fans are the first items, so idx works */ - (void) wrbuf16(ssc, SAFTE_WT_FANSPD, idx, 0, 0, slp); - } - break; - case SESTYP_DOORLOCK: - /* - * Well, we can 'disable' the lock. - */ - if (obp->cstat[0] & SESCTL_DISABLE) { - cc->flag2 &= ~SAFT_FLG2_LOCKDOOR; - (void) wrbuf16(ssc, SAFTE_WT_GLOBAL, cc->flag1, - cc->flag2, 0, slp); - } - break; - case SESTYP_ALARM: - /* - * Well, we can 'disable' the alarm. - */ - if (obp->cstat[0] & SESCTL_DISABLE) { - cc->flag2 &= ~SAFT_FLG1_ALARM; - ep->priv |= 0x40; /* Muted */ - (void) wrbuf16(ssc, SAFTE_WT_GLOBAL, cc->flag1, - cc->flag2, 0, slp); - } - break; - default: - break; - } - ep->svalid = 0; - return (0); -} - -/* - * This function handles all of the 16 byte WRITE BUFFER commands. - */ -static int -wrbuf16(ses_softc_t *ssc, uint8_t op, uint8_t b1, uint8_t b2, - uint8_t b3, int slp) -{ - int err, amt; - char *sdata; - struct scfg *cc = ssc->ses_private; - static char cdb[10] = { WRITE_BUFFER, 1, 0, 0, 0, 0, 0, 0, 16, 0 }; - - if (cc == NULL) - return (0); - - sdata = SES_MALLOC(16); - if (sdata == NULL) - return (ENOMEM); - - SES_DLOG(ssc, "saf_wrbuf16 %x %x %x %x\n", op, b1, b2, b3); - - sdata[0] = op; - sdata[1] = b1; - sdata[2] = b2; - sdata[3] = b3; - MEMZERO(&sdata[4], 12); - amt = -16; - err = ses_runcmd(ssc, cdb, 10, sdata, &amt); - SES_FREE(sdata, 16); - return (err); -} - -/* - * This function updates the status byte for the device slot described. - * - * Since this is an optional SAF-TE command, there's no point in - * returning an error. - */ -static void -wrslot_stat(ses_softc_t *ssc, int slp) -{ - int i, amt; - encobj *ep; - char cdb[10], *sdata; - struct scfg *cc = ssc->ses_private; - - if (cc == NULL) - return; - - SES_DLOG(ssc, "saf_wrslot\n"); - cdb[0] = WRITE_BUFFER; - cdb[1] = 1; - cdb[2] = 0; - cdb[3] = 0; - cdb[4] = 0; - cdb[5] = 0; - cdb[6] = 0; - cdb[7] = 0; - cdb[8] = cc->Nslots * 3 + 1; - cdb[9] = 0; - - sdata = SES_MALLOC(cc->Nslots * 3 + 1); - if (sdata == NULL) - return; - MEMZERO(sdata, cc->Nslots * 3 + 1); - - sdata[0] = SAFTE_WT_DSTAT; - for (i = 0; i < cc->Nslots; i++) { - ep = &ssc->ses_objmap[cc->slotoff + i]; - SES_DLOG(ssc, "saf_wrslot %d <- %x\n", i, ep->priv & 0xff); - sdata[1 + (3 * i)] = ep->priv & 0xff; - } - amt = -(cc->Nslots * 3 + 1); - (void) ses_runcmd(ssc, cdb, 10, sdata, &amt); - SES_FREE(sdata, cc->Nslots * 3 + 1); -} - -/* - * This function issues the "PERFORM SLOT OPERATION" command. - */ -static int -perf_slotop(ses_softc_t *ssc, uint8_t slot, uint8_t opflag, int slp) -{ - int err, amt; - char *sdata; - struct scfg *cc = ssc->ses_private; - static char cdb[10] = - { WRITE_BUFFER, 1, 0, 0, 0, 0, 0, 0, SAFT_SCRATCH, 0 }; - - if (cc == NULL) - return (0); - - sdata = SES_MALLOC(SAFT_SCRATCH); - if (sdata == NULL) - return (ENOMEM); - MEMZERO(sdata, SAFT_SCRATCH); - - sdata[0] = SAFTE_WT_SLTOP; - sdata[1] = slot; - sdata[2] = opflag; - SES_DLOG(ssc, "saf_slotop slot %d op %x\n", slot, opflag); - amt = -SAFT_SCRATCH; - err = ses_runcmd(ssc, cdb, 10, sdata, &amt); - SES_FREE(sdata, SAFT_SCRATCH); - return (err); -} diff --git a/sys/cam/scsi/scsi_ses.h b/sys/cam/scsi/scsi_ses.h index a52d5171cca..ffc5493cc9f 100644 --- a/sys/cam/scsi/scsi_ses.h +++ b/sys/cam/scsi/scsi_ses.h @@ -29,107 +29,2131 @@ * */ -#define SESIOC ('s' - 040) -#define SESIOC_GETNOBJ _IO(SESIOC, 1) -#define SESIOC_GETOBJMAP _IO(SESIOC, 2) -#define SESIOC_GETENCSTAT _IO(SESIOC, 3) -#define SESIOC_SETENCSTAT _IO(SESIOC, 4) -#define SESIOC_GETOBJSTAT _IO(SESIOC, 5) -#define SESIOC_SETOBJSTAT _IO(SESIOC, 6) -#define SESIOC_GETTEXT _IO(SESIOC, 7) -#define SESIOC_INIT _IO(SESIOC, 8) +#ifndef _SCSI_SES_H_ +#define _SCSI_SES_H_ -/* - * Platform Independent Definitions for SES devices. - */ -/* - * SCSI Based Environmental Services Application Defines - * - * Based almost entirely on SCSI-3 SES Revision 8A specification, - * but slightly abstracted as the underlying device may in fact - * be a SAF-TE or vendor unique device. - */ -/* - * SES Driver Operations: - * (The defines themselves are platform and access method specific) - * - * SESIOC_GETNOBJ - * SESIOC_GETOBJMAP - * SESIOC_GETENCSTAT - * SESIOC_SETENCSTAT - * SESIOC_GETOBJSTAT - * SESIOC_SETOBJSTAT - * SESIOC_INIT - * - * - * An application finds out how many objects an SES instance - * is managing by performing a SESIOC_GETNOBJ operation. It then - * performs a SESIOC_GETOBJMAP to get the map that contains the - * object identifiers for all objects (see ses_object below). - * This information is static. - * - * The application may perform SESIOC_GETOBJSTAT operations to retrieve - * status on an object (see the ses_objstat structure below), SESIOC_SETOBJSTAT - * operations to set status for an object. - * - * Similarly overall enclosure status me be fetched or set via - * SESIOC_GETENCSTAT or SESIOC_SETENCSTAT operations (see ses_encstat below). - * - * Readers should note that there is nothing that requires either a set - * or a clear operation to actually latch and do anything in the target. - * - * A SESIOC_INIT operation causes the enclosure to be initialized. - */ +#include -typedef struct { - unsigned int obj_id; /* Object Identifier */ - unsigned char subencid; /* SubEnclosure ID */ - unsigned char object_type; /* Object Type */ -} ses_object; +/*========================== Field Extraction Macros =========================*/ +#define MK_ENUM(S, F, SUFFIX) S ## _ ## F ## SUFFIX -/* Object Types */ -#define SESTYP_UNSPECIFIED 0x00 -#define SESTYP_DEVICE 0x01 -#define SESTYP_POWER 0x02 -#define SESTYP_FAN 0x03 -#define SESTYP_THERM 0x04 -#define SESTYP_DOORLOCK 0x05 -#define SESTYP_ALARM 0x06 -#define SESTYP_ESCC 0x07 /* Enclosure SCC */ -#define SESTYP_SCC 0x08 /* SCC */ -#define SESTYP_NVRAM 0x09 -#define SESTYP_UPS 0x0b -#define SESTYP_DISPLAY 0x0c -#define SESTYP_KEYPAD 0x0d -#define SESTYP_ENCLOSURE 0x0e -#define SESTYP_SCSIXVR 0x0f -#define SESTYP_LANGUAGE 0x10 -#define SESTYP_COMPORT 0x11 -#define SESTYP_VOM 0x12 -#define SESTYP_AMMETER 0x13 -#define SESTYP_SCSI_TGT 0x14 -#define SESTYP_SCSI_INI 0x15 -#define SESTYP_SUBENC 0x16 -#define SESTYP_ARRAY 0x17 -#define SESTYP_SASEXPANDER 0x18 -#define SESTYP_SASCONNECTOR 0x19 +#define GEN_GETTER(LS, US, LF, UF) \ +static inline int \ +LS ## _get_ ## LF(struct LS *elem) { \ + return ((elem->bytes[MK_ENUM(US,UF,_BYTE)] & MK_ENUM(US,UF,_MASK)) \ + >> MK_ENUM(US,UF,_SHIFT)); \ +} +#define GEN_SETTER(LS, US, LF, UF) \ +static inline void \ +LS ## _set_ ## LF(struct LS *elem, int val) { \ + elem->bytes[MK_ENUM(US,UF,_BYTE)] &= ~MK_ENUM(US,UF,_MASK); \ + elem->bytes[MK_ENUM(US,UF,_BYTE)] |= \ + (val << MK_ENUM(US,UF,_SHIFT)) & MK_ENUM(US,UF,_MASK); \ +} + +#define GEN_HDR_GETTER(LS, US, LF, UF) \ +static inline int \ +LS ## _get_ ## LF(struct LS *page) { \ + return ((page->hdr.page_specific_flags & MK_ENUM(US,UF,_MASK)) \ + >> MK_ENUM(US,UF,_SHIFT)); \ +} + +#define GEN_HDR_SETTER(LS, US, LF, UF) \ +static inline void \ +LS ## _set_ ## LF(struct LS *page, int val) { \ + page->hdr.page_specific_flags &= ~MK_ENUM(US,UF,_MASK); \ + page->hdr.page_specific_flags |= \ + (val << MK_ENUM(US,UF,_SHIFT)) & MK_ENUM(US,UF,_MASK); \ +} + +#define GEN_ACCESSORS(LS, US, LF, UF) \ +GEN_GETTER(LS, US, LF, UF) \ +GEN_SETTER(LS, US, LF, UF) + +#define GEN_HDR_ACCESSORS(LS, US, LF, UF) \ +GEN_HDR_GETTER(LS, US, LF, UF) \ +GEN_HDR_SETTER(LS, US, LF, UF) + +/*=============== Common SCSI ENC Diagnostic Page Structures ===============*/ +struct ses_page_hdr { + uint8_t page_code; + uint8_t page_specific_flags; + uint8_t length[2]; + uint8_t gen_code[4]; +}; + +static inline size_t +ses_page_length(const struct ses_page_hdr *hdr) +{ + /* + * The page length as received only accounts for bytes that + * follow the length field, namely starting with the generation + * code field. + */ + return (scsi_2btoul(hdr->length) + + offsetof(struct ses_page_hdr, gen_code)); +} + +/*============= SCSI ENC Configuration Diagnostic Page Structures ============*/ +struct ses_enc_desc { + uint8_t byte0; + /* + * reserved0 : 1, + * rel_id : 3, relative enclosure process id + * reserved1 : 1, + * num_procs : 3; number of enclosure procesenc + */ + uint8_t subenc_id; /* Sub-enclosure Identifier */ + uint8_t num_types; /* # of supported types */ + uint8_t length; /* Enclosure Descriptor Length */ + uint8_t logical_id[8]; /* formerly wwn */ + uint8_t vendor_id[8]; + uint8_t product_id[16]; + uint8_t product_rev[4]; + uint8_t vendor_bytes[]; +}; + +static inline uint8_t * +ses_enc_desc_last_byte(struct ses_enc_desc *encdesc) +{ + return (&encdesc->length + encdesc->length + 1); +} + +static inline struct ses_enc_desc * +ses_enc_desc_next(struct ses_enc_desc *encdesc) +{ + return ((struct ses_enc_desc *)(ses_enc_desc_last_byte(encdesc) + 1)); +} + +static inline int +ses_enc_desc_is_complete(struct ses_enc_desc *encdesc, uint8_t *last_buf_byte) +{ + return (&encdesc->length <= last_buf_byte + && ses_enc_desc_last_byte(encdesc) <= last_buf_byte); +} + +struct ses_elm_type_desc { + uint8_t etype_elm_type; /* type of element */ + uint8_t etype_maxelt; /* maximum supported */ + uint8_t etype_subenc; /* in sub-enclosure #n */ + uint8_t etype_txt_len; /* Type Descriptor Text Length */ +}; + +struct ses_cfg_page { + struct ses_page_hdr hdr; + struct ses_enc_desc subencs[]; + /* type descriptors */ + /* type text */ +}; + +static inline int +ses_cfg_page_get_num_subenc(struct ses_cfg_page *page) +{ + return (page->hdr.page_specific_flags + 1); +} + + +/*================ SCSI SES Control Diagnostic Page Structures ==============*/ +struct ses_ctrl_common { + uint8_t bytes[1]; +}; + +enum ses_ctrl_common_field_data { + SES_CTRL_COMMON_SELECT_BYTE = 0, + SES_CTRL_COMMON_SELECT_MASK = 0x80, + SES_CTRL_COMMON_SELECT_SHIFT = 7, + + SES_CTRL_COMMON_PRDFAIL_BYTE = 0, + SES_CTRL_COMMON_PRDFAIL_MASK = 0x40, + SES_CTRL_COMMON_PRDFAIL_SHIFT = 6, + + SES_CTRL_COMMON_DISABLE_BYTE = 0, + SES_CTRL_COMMON_DISABLE_MASK = 0x20, + SES_CTRL_COMMON_DISABLE_SHIFT = 5, + + SES_CTRL_COMMON_RST_SWAP_BYTE = 0, + SES_CTRL_COMMON_RST_SWAP_MASK = 0x10, + SES_CTRL_COMMON_RST_SWAP_SHIFT = 4 +}; + +#define GEN_SES_CTRL_COMMON_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_common, SES_CTRL_COMMON, LCASE, UCASE) +GEN_SES_CTRL_COMMON_ACCESSORS(select, SELECT) +GEN_SES_CTRL_COMMON_ACCESSORS(prdfail, PRDFAIL) +GEN_SES_CTRL_COMMON_ACCESSORS(disable, DISABLE) +GEN_SES_CTRL_COMMON_ACCESSORS(rst_swap, RST_SWAP) +#undef GEN_SES_CTRL_COMMON_ACCESSORS + +/*------------------------ Device Slot Control Element ----------------------*/ +struct ses_ctrl_dev_slot { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_dev_slot_field_data { + SES_CTRL_DEV_SLOT_RQST_ACTIVE_BYTE = 1, + SES_CTRL_DEV_SLOT_RQST_ACTIVE_MASK = 0x80, + SES_CTRL_DEV_SLOT_RQST_ACTIVE_SHIFT = 7, + + SES_CTRL_DEV_SLOT_DO_NOT_REMOVE_BYTE = 1, + SES_CTRL_DEV_SLOT_DO_NOT_REMOVE_MASK = 0x40, + SES_CTRL_DEV_SLOT_DO_NOT_REMOVE_SHIFT = 6, + + SES_CTRL_DEV_SLOT_RQST_MISSING_BYTE = 1, + SES_CTRL_DEV_SLOT_RQST_MISSING_MASK = 0x10, + SES_CTRL_DEV_SLOT_RQST_MISSING_SHIFT = 4, + + SES_CTRL_DEV_SLOT_RQST_INSERT_BYTE = 1, + SES_CTRL_DEV_SLOT_RQST_INSERT_MASK = 0x08, + SES_CTRL_DEV_SLOT_RQST_INSERT_SHIFT = 3, + + SES_CTRL_DEV_SLOT_RQST_REMOVE_BYTE = 1, + SES_CTRL_DEV_SLOT_RQST_REMOVE_MASK = 0x04, + SES_CTRL_DEV_SLOT_RQST_REMOVE_SHIFT = 2, + + SES_CTRL_DEV_SLOT_RQST_IDENT_BYTE = 1, + SES_CTRL_DEV_SLOT_RQST_IDENT_MASK = 0x02, + SES_CTRL_DEV_SLOT_RQST_IDENT_SHIFT = 1, + + SES_CTRL_DEV_SLOT_RQST_FAULT_BYTE = 2, + SES_CTRL_DEV_SLOT_RQST_FAULT_MASK = 0x20, + SES_CTRL_DEV_SLOT_RQST_FAULT_SHIFT = 5, + + SES_CTRL_DEV_SLOT_DEVICE_OFF_BYTE = 2, + SES_CTRL_DEV_SLOT_DEVICE_OFF_MASK = 0x10, + SES_CTRL_DEV_SLOT_DEVICE_OFF_SHIFT = 4, + + SES_CTRL_DEV_SLOT_ENABLE_BYP_A_BYTE = 2, + SES_CTRL_DEV_SLOT_ENABLE_BYP_A_MASK = 0x08, + SES_CTRL_DEV_SLOT_ENABLE_BYP_A_SHIFT = 3, + + SES_CTRL_DEV_SLOT_ENABLE_BYP_B_BYTE = 2, + SES_CTRL_DEV_SLOT_ENABLE_BYP_B_MASK = 0x04, + SES_CTRL_DEV_SLOT_ENABLE_BYP_B_SHIFT = 2 +}; +#define GEN_SES_CTRL_DEV_SLOT_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_dev_slot, SES_CTRL_DEV_SLOT, LCASE, UCASE) + +GEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_active, RQST_ACTIVE) +GEN_SES_CTRL_DEV_SLOT_ACCESSORS(do_not_remove, DO_NOT_REMOVE) +GEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_missing, RQST_MISSING) +GEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_insert, RQST_INSERT) +GEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_remove, RQST_REMOVE) +GEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_fault, RQST_FAULT) +GEN_SES_CTRL_DEV_SLOT_ACCESSORS(device_off, DEVICE_OFF) +GEN_SES_CTRL_DEV_SLOT_ACCESSORS(enable_byp_a, ENABLE_BYP_A) +GEN_SES_CTRL_DEV_SLOT_ACCESSORS(enable_byp_b, ENABLE_BYP_B) +#undef GEN_SES_CTRL_DEV_SLOT_ACCESSORS + +/*--------------------- Array Device Slot Control Element --------------------*/ +struct ses_ctrl_array_dev_slot { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_array_dev_slot_field_data { + SES_CTRL_ARRAY_DEV_SLOT_RQST_OK_BYTE = 0, + SES_CTRL_ARRAY_DEV_SLOT_RQST_OK_MASK = 0x80, + SES_CTRL_ARRAY_DEV_SLOT_RQST_OK_SHIFT = 7, + + SES_CTRL_ARRAY_DEV_SLOT_RQST_RSVD_DEVICE_BYTE = 0, + SES_CTRL_ARRAY_DEV_SLOT_RQST_RSVD_DEVICE_MASK = 0x40, + SES_CTRL_ARRAY_DEV_SLOT_RQST_RSVD_DEVICE_SHIFT = 6, + + SES_CTRL_ARRAY_DEV_SLOT_RQST_HOT_SPARE_BYTE = 0, + SES_CTRL_ARRAY_DEV_SLOT_RQST_HOT_SPARE_MASK = 0x20, + SES_CTRL_ARRAY_DEV_SLOT_RQST_HOT_SPARE_SHIFT = 5, + + SES_CTRL_ARRAY_DEV_SLOT_RQST_CONS_CHECK_BYTE = 0, + SES_CTRL_ARRAY_DEV_SLOT_RQST_CONS_CHECK_MASK = 0x10, + SES_CTRL_ARRAY_DEV_SLOT_RQST_CONS_CHECK_SHIFT = 4, + + SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_CRIT_ARRAY_BYTE = 0, + SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_CRIT_ARRAY_MASK = 0x08, + SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_CRIT_ARRAY_SHIFT = 3, + + SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_FAILED_ARRAY_BYTE = 0, + SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_FAILED_ARRAY_MASK = 0x04, + SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_FAILED_ARRAY_SHIFT = 2, + + SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_BYTE = 0, + SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_MASK = 0x02, + SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_SHIFT = 1, + + SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_ABORT_BYTE = 0, + SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_ABORT_MASK = 0x01, + SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_ABORT_SHIFT = 0 + + /* + * The remaining fields are identical to the device + * slot element type. Access them through the device slot + * element type and its accessors. + */ +}; +#define GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_array_dev_slot, SES_CTRL_ARRAY_DEV_SLOT, \ + LCASE, UCASE) +GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_ok, RQST_OK) +GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_rsvd_device, RQST_RSVD_DEVICE) +GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_hot_spare, RQST_HOT_SPARE) +GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_cons_check, RQST_CONS_CHECK) +GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_in_crit_array, RQST_IN_CRIT_ARRAY) +GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_in_failed_array, + RQST_IN_FAILED_ARRAY) +GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_rebuild_remap, RQST_REBUILD_REMAP) +GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_rebuild_remap_abort, + RQST_REBUILD_REMAP_ABORT) +#undef GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS + +/*----------------------- Power Supply Control Element -----------------------*/ +struct ses_ctrl_power_supply { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_power_supply_field_data { + SES_CTRL_POWER_SUPPLY_RQST_IDENT_BYTE = 0, + SES_CTRL_POWER_SUPPLY_RQST_IDENT_MASK = 0x80, + SES_CTRL_POWER_SUPPLY_RQST_IDENT_SHIFT = 7, + + SES_CTRL_POWER_SUPPLY_RQST_FAIL_BYTE = 2, + SES_CTRL_POWER_SUPPLY_RQST_FAIL_MASK = 0x40, + SES_CTRL_POWER_SUPPLY_RQST_FAIL_SHIFT = 6, + + SES_CTRL_POWER_SUPPLY_RQST_ON_BYTE = 2, + SES_CTRL_POWER_SUPPLY_RQST_ON_MASK = 0x20, + SES_CTRL_POWER_SUPPLY_RQST_ON_SHIFT = 5 +}; + +#define GEN_SES_CTRL_POWER_SUPPLY_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_power_supply, SES_CTRL_POWER_SUPPLY, LCASE, UCASE) +GEN_SES_CTRL_POWER_SUPPLY_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_POWER_SUPPLY_ACCESSORS(rqst_fail, RQST_FAIL) +GEN_SES_CTRL_POWER_SUPPLY_ACCESSORS(rqst_on, RQST_ON) +#undef GEN_SES_CTRL_POWER_SUPPLY_ACCESSORS + +/*-------------------------- Cooling Control Element -------------------------*/ +struct ses_ctrl_cooling { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_cooling_field_data { + SES_CTRL_COOLING_RQST_IDENT_BYTE = 0, + SES_CTRL_COOLING_RQST_IDENT_MASK = 0x80, + SES_CTRL_COOLING_RQST_IDENT_SHIFT = 7, + + SES_CTRL_COOLING_RQST_FAIL_BYTE = 2, + SES_CTRL_COOLING_RQST_FAIL_MASK = 0x40, + SES_CTRL_COOLING_RQST_FAIL_SHIFT = 6, + + SES_CTRL_COOLING_RQST_ON_BYTE = 2, + SES_CTRL_COOLING_RQST_ON_MASK = 0x20, + SES_CTRL_COOLING_RQST_ON_SHIFT = 5, + + SES_CTRL_COOLING_RQSTED_SPEED_CODE_BYTE = 2, + SES_CTRL_COOLING_RQSTED_SPEED_CODE_MASK = 0x07, + SES_CTRL_COOLING_RQSTED_SPEED_CODE_SHIFT = 2, + SES_CTRL_COOLING_RQSTED_SPEED_CODE_UNCHANGED = 0x00, + SES_CTRL_COOLING_RQSTED_SPEED_CODE_LOWEST = 0x01, + SES_CTRL_COOLING_RQSTED_SPEED_CODE_HIGHEST = 0x07 +}; + +#define GEN_SES_CTRL_COOLING_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_cooling, SES_CTRL_COOLING, LCASE, UCASE) +GEN_SES_CTRL_COOLING_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_COOLING_ACCESSORS(rqst_fail, RQST_FAIL) +GEN_SES_CTRL_COOLING_ACCESSORS(rqst_on, RQST_ON) +GEN_SES_CTRL_COOLING_ACCESSORS(rqsted_speed_code, RQSTED_SPEED_CODE) +#undef GEN_SES_CTRL_COOLING_ACCESSORS + +/*-------------------- Temperature Sensor Control Element --------------------*/ +struct ses_ctrl_temp_sensor { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_temp_sensor_field_data { + SES_CTRL_TEMP_SENSOR_RQST_IDENT_BYTE = 0, + SES_CTRL_TEMP_SENSOR_RQST_IDENT_MASK = 0x80, + SES_CTRL_TEMP_SENSOR_RQST_IDENT_SHIFT = 7, + + SES_CTRL_TEMP_SENSOR_RQST_FAIL_BYTE = 0, + SES_CTRL_TEMP_SENSOR_RQST_FAIL_MASK = 0x40, + SES_CTRL_TEMP_SENSOR_RQST_FAIL_SHIFT = 6 +}; + +#define GEN_SES_CTRL_TEMP_SENSOR_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_temp_sensor, SES_CTRL_TEMP_SENSOR, LCASE, UCASE) +GEN_SES_CTRL_TEMP_SENSOR_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_TEMP_SENSOR_ACCESSORS(rqst_fail, RQST_FAIL) +#undef GEN_SES_CTRL_TEMP_SENSOR_ACCESSORS + +/*------------------------- Door Lock Control Element ------------------------*/ +struct ses_ctrl_door_lock { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_door_lock_field_data { + SES_CTRL_DOOR_LOCK_RQST_IDENT_BYTE = 0, + SES_CTRL_DOOR_LOCK_RQST_IDENT_MASK = 0x80, + SES_CTRL_DOOR_LOCK_RQST_IDENT_SHIFT = 7, + + SES_CTRL_DOOR_LOCK_RQST_FAIL_BYTE = 0, + SES_CTRL_DOOR_LOCK_RQST_FAIL_MASK = 0x40, + SES_CTRL_DOOR_LOCK_RQST_FAIL_SHIFT = 6, + + SES_CTRL_DOOR_LOCK_UNLOCK_BYTE = 2, + SES_CTRL_DOOR_LOCK_UNLOCK_MASK = 0x01, + SES_CTRL_DOOR_LOCK_UNLOCK_SHIFT = 0 +}; + +#define GEN_SES_CTRL_DOOR_LOCK_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_door_lock, SES_CTRL_DOOR_LOCK, LCASE, UCASE) +GEN_SES_CTRL_DOOR_LOCK_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_DOOR_LOCK_ACCESSORS(rqst_fail, RQST_FAIL) +GEN_SES_CTRL_DOOR_LOCK_ACCESSORS(unlock, UNLOCK) +#undef GEN_SES_CTRL_DOOR_LOCK_ACCESSORS + +/*----------------------- Audible Alarm Control Element ----------------------*/ +struct ses_ctrl_audible_alarm { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_audible_alarm_field_data { + SES_CTRL_AUDIBLE_ALARM_RQST_IDENT_BYTE = 0, + SES_CTRL_AUDIBLE_ALARM_RQST_IDENT_MASK = 0x80, + SES_CTRL_AUDIBLE_ALARM_RQST_IDENT_SHIFT = 7, + + SES_CTRL_AUDIBLE_ALARM_RQST_FAIL_BYTE = 0, + SES_CTRL_AUDIBLE_ALARM_RQST_FAIL_MASK = 0x40, + SES_CTRL_AUDIBLE_ALARM_RQST_FAIL_SHIFT = 6, + + SES_CTRL_AUDIBLE_ALARM_SET_MUTE_BYTE = 2, + SES_CTRL_AUDIBLE_ALARM_SET_MUTE_MASK = 0x40, + SES_CTRL_AUDIBLE_ALARM_SET_MUTE_SHIFT = 6, + + SES_CTRL_AUDIBLE_ALARM_SET_REMIND_BYTE = 2, + SES_CTRL_AUDIBLE_ALARM_SET_REMIND_MASK = 0x10, + SES_CTRL_AUDIBLE_ALARM_SET_REMIND_SHIFT = 4, + + SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_BYTE = 2, + SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_MASK = 0x0F, + SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_SHIFT = 0, + SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_INFO = 0x08, + SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_NON_CRIT = 0x04, + SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_CRIT = 0x02, + SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_UNRECOV = 0x01 +}; + +#define GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_audible_alarm, SES_CTRL_AUDIBLE_ALARM, LCASE, UCASE) +GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(rqst_fail, RQST_FAIL) +GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(set_mute, SET_MUTE) +GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(set_remind, SET_REMIND) +GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(tone_control, TONE_CONTROL) +#undef GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS + +/*--------- Enclosure Services Controller Electronics Control Element --------*/ +struct ses_ctrl_ecc_electronics { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_ecc_electronics_field_data { + SES_CTRL_ECC_ELECTRONICS_RQST_IDENT_BYTE = 0, + SES_CTRL_ECC_ELECTRONICS_RQST_IDENT_MASK = 0x80, + SES_CTRL_ECC_ELECTRONICS_RQST_IDENT_SHIFT = 7, + + SES_CTRL_ECC_ELECTRONICS_RQST_FAIL_BYTE = 0, + SES_CTRL_ECC_ELECTRONICS_RQST_FAIL_MASK = 0x40, + SES_CTRL_ECC_ELECTRONICS_RQST_FAIL_SHIFT = 6, + + SES_CTRL_ECC_ELECTRONICS_SELECT_ELEMENT_BYTE = 1, + SES_CTRL_ECC_ELECTRONICS_SELECT_ELEMENT_MASK = 0x01, + SES_CTRL_ECC_ELECTRONICS_SELECT_ELEMENT_SHIFT = 0 +}; + +#define GEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_ecc_electronics, SES_CTRL_ECC_ELECTRONICS, \ + LCASE, UCASE) +GEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS(rqst_fail, RQST_FAIL) +GEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS(select_element, SELECT_ELEMENT) +#undef GEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS + +/*----------- SCSI Services Controller Electronics Control Element -----------*/ +struct ses_ctrl_scc_electronics { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_scc_electronics_field_data { + SES_CTRL_SCC_ELECTRONICS_RQST_IDENT_BYTE = 0, + SES_CTRL_SCC_ELECTRONICS_RQST_IDENT_MASK = 0x80, + SES_CTRL_SCC_ELECTRONICS_RQST_IDENT_SHIFT = 7, + + SES_CTRL_SCC_ELECTRONICS_RQST_FAIL_BYTE = 0, + SES_CTRL_SCC_ELECTRONICS_RQST_FAIL_MASK = 0x40, + SES_CTRL_SCC_ELECTRONICS_RQST_FAIL_SHIFT = 6 +}; + +#define GEN_SES_CTRL_SCC_ELECTRONICS_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_scc_electronics, SES_CTRL_SCC_ELECTRONICS, \ + LCASE, UCASE) +GEN_SES_CTRL_SCC_ELECTRONICS_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_SCC_ELECTRONICS_ACCESSORS(rqst_fail, RQST_FAIL) +#undef GEN_SES_CTRL_SCC_ELECTRONICS_ACCESSORS + +/*--------------------- Nonvolatile Cache Control Element --------------------*/ +struct ses_ctrl_nv_cache { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_nv_cache_field_data { + SES_CTRL_NV_CACHE_RQST_IDENT_BYTE = 0, + SES_CTRL_NV_CACHE_RQST_IDENT_MASK = 0x80, + SES_CTRL_NV_CACHE_RQST_IDENT_SHIFT = 7, + + SES_CTRL_NV_CACHE_RQST_FAIL_BYTE = 0, + SES_CTRL_NV_CACHE_RQST_FAIL_MASK = 0x40, + SES_CTRL_NV_CACHE_RQST_FAIL_SHIFT = 6 +}; + +#define GEN_SES_CTRL_NV_CACHE_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_nv_cache, SES_CTRL_NV_CACHE, LCASE, UCASE) +GEN_SES_CTRL_NV_CACHE_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_NV_CACHE_ACCESSORS(rqst_fail, RQST_FAIL) +#undef GEN_SES_CTRL_NV_CACHE_ACCESSORS + +/*----------------- Invalid Operation Reason Control Element -----------------*/ +struct ses_ctrl_invalid_op_reason { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +/* There are no element specific fields currently defined in the spec. */ + +/*--------------- Uninterruptible Power Supply Control Element ---------------*/ +struct ses_ctrl_ups { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_ups_field_data { + SES_CTRL_UPS_RQST_IDENT_BYTE = 2, + SES_CTRL_UPS_RQST_IDENT_MASK = 0x80, + SES_CTRL_UPS_RQST_IDENT_SHIFT = 7, + + SES_CTRL_UPS_RQST_FAIL_BYTE = 2, + SES_CTRL_UPS_RQST_FAIL_MASK = 0x40, + SES_CTRL_UPS_RQST_FAIL_SHIFT = 6 +}; + +#define GEN_SES_CTRL_UPS_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_ups, SES_CTRL_UPS, LCASE, UCASE) +GEN_SES_CTRL_UPS_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_UPS_ACCESSORS(rqst_fail, RQST_FAIL) +#undef GEN_SES_CTRL_UPS_ACCESSORS + +/*-------------------------- Display Control Element -------------------------*/ +struct ses_ctrl_display { + struct ses_ctrl_common common; + uint8_t bytes[1]; + uint8_t display_character[2]; +}; + +enum ses_ctrl_display_field_data { + SES_CTRL_DISPLAY_RQST_IDENT_BYTE = 0, + SES_CTRL_DISPLAY_RQST_IDENT_MASK = 0x80, + SES_CTRL_DISPLAY_RQST_IDENT_SHIFT = 7, + + SES_CTRL_DISPLAY_RQST_FAIL_BYTE = 0, + SES_CTRL_DISPLAY_RQST_FAIL_MASK = 0x40, + SES_CTRL_DISPLAY_RQST_FAIL_SHIFT = 6, + + SES_CTRL_DISPLAY_DISPLAY_MODE_BYTE = 0, + SES_CTRL_DISPLAY_DISPLAY_MODE_MASK = 0x03, + SES_CTRL_DISPLAY_DISPLAY_MODE_SHIFT = 6, + SES_CTRL_DISPLAY_DISPLAY_MODE_UNCHANGED = 0x0, + SES_CTRL_DISPLAY_DISPLAY_MODE_ESP = 0x1, + SES_CTRL_DISPLAY_DISPLAY_MODE_DC_FIELD = 0x2 +}; + +#define GEN_SES_CTRL_DISPLAY_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_display, SES_CTRL_DISPLAY, LCASE, UCASE) +GEN_SES_CTRL_DISPLAY_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_DISPLAY_ACCESSORS(rqst_fail, RQST_FAIL) +GEN_SES_CTRL_DISPLAY_ACCESSORS(display_mode, DISPLAY_MODE) +#undef GEN_SES_CTRL_DISPLAY_ACCESSORS + +/*----------------------- Key Pad Entry Control Element ----------------------*/ +struct ses_ctrl_key_pad_entry { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_key_pad_entry_field_data { + SES_CTRL_KEY_PAD_ENTRY_RQST_IDENT_BYTE = 0, + SES_CTRL_KEY_PAD_ENTRY_RQST_IDENT_MASK = 0x80, + SES_CTRL_KEY_PAD_ENTRY_RQST_IDENT_SHIFT = 7, + + SES_CTRL_KEY_PAD_ENTRY_RQST_FAIL_BYTE = 0, + SES_CTRL_KEY_PAD_ENTRY_RQST_FAIL_MASK = 0x40, + SES_CTRL_KEY_PAD_ENTRY_RQST_FAIL_SHIFT = 6 +}; + +#define GEN_SES_CTRL_KEY_PAD_ENTRY_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_key_pad_entry, SES_CTRL_KEY_PAD_ENTRY, LCASE, UCASE) +GEN_SES_CTRL_KEY_PAD_ENTRY_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_KEY_PAD_ENTRY_ACCESSORS(rqst_fail, RQST_FAIL) +#undef GEN_SES_CTRL_KEY_PAD_ENTRY_ACCESSORS + +/*------------------------- Enclosure Control Element ------------------------*/ +struct ses_ctrl_enclosure { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_enclosure_field_data { + SES_CTRL_ENCLOSURE_RQST_IDENT_BYTE = 0, + SES_CTRL_ENCLOSURE_RQST_IDENT_MASK = 0x80, + SES_CTRL_ENCLOSURE_RQST_IDENT_SHIFT = 7, + + SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_BYTE = 1, + SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_MASK = 0xC0, + SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_SHIFT = 6, + SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_NONE = 0x0, + SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_AFTER_DELAY = 0x1, + SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_CANCEL = 0x2, + + SES_CTRL_ENCLOSURE_POWER_CYCLE_DELAY_BYTE = 1, + SES_CTRL_ENCLOSURE_POWER_CYCLE_DELAY_MASK = 0x3F, + SES_CTRL_ENCLOSURE_POWER_CYCLE_DELAY_SHIFT = 0, + SES_CTRL_ENCLOSURE_POWER_CYCLE_DELAY_MAX = 60,/*minutes*/ + + SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_BYTE = 2, + SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_MASK = 0xFC, + SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_SHIFT = 2, + SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_MAX_AUTO = 60, + SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_MANUAL = 63, + + SES_CTRL_ENCLOSURE_RQST_FAIL_BYTE = 2, + SES_CTRL_ENCLOSURE_RQST_FAIL_MASK = 0x02, + SES_CTRL_ENCLOSURE_RQST_FAIL_SHIFT = 1, + + SES_CTRL_ENCLOSURE_RQST_WARN_BYTE = 2, + SES_CTRL_ENCLOSURE_RQST_WARN_MASK = 0x01, + SES_CTRL_ENCLOSURE_RQST_WARN_SHIFT = 0 +}; + +#define GEN_SES_CTRL_ENCLOSURE_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_enclosure, SES_CTRL_ENCLOSURE, LCASE, UCASE) +GEN_SES_CTRL_ENCLOSURE_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_ENCLOSURE_ACCESSORS(power_cycle_rqst, POWER_CYCLE_RQST) +GEN_SES_CTRL_ENCLOSURE_ACCESSORS(power_cycle_delay, POWER_CYCLE_DELAY) +GEN_SES_CTRL_ENCLOSURE_ACCESSORS(power_off_duration, POWER_OFF_DURATION) +GEN_SES_CTRL_ENCLOSURE_ACCESSORS(rqst_fail, RQST_FAIL) +GEN_SES_CTRL_ENCLOSURE_ACCESSORS(rqst_warn, RQST_WARN) +#undef GEN_SES_CTRL_ENCLOSURE_ACCESSORS + +/*------------------- SCSI Port/Transceiver Control Element ------------------*/ +struct ses_ctrl_scsi_port_or_xcvr { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_scsi_port_or_xcvr_field_data { + SES_CTRL_SCSI_PORT_OR_XCVR_RQST_IDENT_BYTE = 0, + SES_CTRL_SCSI_PORT_OR_XCVR_RQST_IDENT_MASK = 0x80, + SES_CTRL_SCSI_PORT_OR_XCVR_RQST_IDENT_SHIFT = 7, + + SES_CTRL_SCSI_PORT_OR_XCVR_RQST_FAIL_BYTE = 0, + SES_CTRL_SCSI_PORT_OR_XCVR_RQST_FAIL_MASK = 0x40, + SES_CTRL_SCSI_PORT_OR_XCVR_RQST_FAIL_SHIFT = 6, + + SES_CTRL_SCSI_PORT_OR_XCVR_DISABLE_BYTE = 2, + SES_CTRL_SCSI_PORT_OR_XCVR_DISABLE_MASK = 0x10, + SES_CTRL_SCSI_PORT_OR_XCVR_DISABLE_SHIFT = 4 +}; + +#define GEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_scsi_port_or_xcvr, SES_CTRL_SCSI_PORT_OR_XCVR,\ + LCASE, UCASE) +GEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS(disable, DISABLE) +GEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS(rqst_fail, RQST_FAIL) +#undef GEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS + +/*------------------------- Language Control Element -------------------------*/ +struct ses_ctrl_language { + struct ses_ctrl_common common; + uint8_t bytes[1]; + uint8_t language_code[2]; +}; + +enum ses_ctrl_language_field_data { + SES_CTRL_LANGUAGE_RQST_IDENT_BYTE = 0, + SES_CTRL_LANGUAGE_RQST_IDENT_MASK = 0x80, + SES_CTRL_LANGUAGE_RQST_IDENT_SHIFT = 7 +}; + +#define GEN_SES_CTRL_LANGUAGE_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_language, SES_CTRL_LANGUAGE, LCASE, UCASE) +GEN_SES_CTRL_LANGUAGE_ACCESSORS(rqst_ident, RQST_IDENT) +#undef GEN_SES_CTRL_LANGUAGE_ACCESSORS + +/*-------------------- Communication Port Control Element --------------------*/ +struct ses_ctrl_comm_port { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_comm_port_field_data { + SES_CTRL_COMM_PORT_RQST_IDENT_BYTE = 0, + SES_CTRL_COMM_PORT_RQST_IDENT_MASK = 0x80, + SES_CTRL_COMM_PORT_RQST_IDENT_SHIFT = 7, + + SES_CTRL_COMM_PORT_RQST_FAIL_BYTE = 0, + SES_CTRL_COMM_PORT_RQST_FAIL_MASK = 0x40, + SES_CTRL_COMM_PORT_RQST_FAIL_SHIFT = 6, + + SES_CTRL_COMM_PORT_DISABLE_BYTE = 2, + SES_CTRL_COMM_PORT_DISABLE_MASK = 0x01, + SES_CTRL_COMM_PORT_DISABLE_SHIFT = 0 +}; + +#define GEN_SES_CTRL_COMM_PORT_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_comm_port, SES_CTRL_COMM_PORT, LCASE, UCASE) +GEN_SES_CTRL_COMM_PORT_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_COMM_PORT_ACCESSORS(rqst_fail, RQST_FAIL) +GEN_SES_CTRL_COMM_PORT_ACCESSORS(disable, DISABLE) +#undef GEN_SES_CTRL_COMM_PORT_ACCESSORS + +/*---------------------- Voltage Sensor Control Element ----------------------*/ +struct ses_ctrl_voltage_sensor { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_voltage_sensor_field_data { + SES_CTRL_VOLTAGE_SENSOR_RQST_IDENT_BYTE = 0, + SES_CTRL_VOLTAGE_SENSOR_RQST_IDENT_MASK = 0x80, + SES_CTRL_VOLTAGE_SENSOR_RQST_IDENT_SHIFT = 7, + + SES_CTRL_VOLTAGE_SENSOR_RQST_FAIL_BYTE = 0, + SES_CTRL_VOLTAGE_SENSOR_RQST_FAIL_MASK = 0x40, + SES_CTRL_VOLTAGE_SENSOR_RQST_FAIL_SHIFT = 6 +}; + +#define GEN_SES_CTRL_VOLTAGE_SENSOR_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_voltage_sensor, SES_CTRL_VOLTAGE_SENSOR, \ + LCASE, UCASE) +GEN_SES_CTRL_VOLTAGE_SENSOR_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_VOLTAGE_SENSOR_ACCESSORS(rqst_fail, RQST_FAIL) +#undef GEN_SES_CTRL_VOLTAGE_SENSOR_ACCESSORS + +/*---------------------- Current Sensor Control Element ----------------------*/ +struct ses_ctrl_current_sensor { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_current_sensor_field_data { + SES_CTRL_CURRENT_SENSOR_RQST_IDENT_BYTE = 0, + SES_CTRL_CURRENT_SENSOR_RQST_IDENT_MASK = 0x80, + SES_CTRL_CURRENT_SENSOR_RQST_IDENT_SHIFT = 7, + + SES_CTRL_CURRENT_SENSOR_RQST_FAIL_BYTE = 0, + SES_CTRL_CURRENT_SENSOR_RQST_FAIL_MASK = 0x40, + SES_CTRL_CURRENT_SENSOR_RQST_FAIL_SHIFT = 6 +}; + +#define GEN_SES_CTRL_CURRENT_SENSOR_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_current_sensor, SES_CTRL_CURRENT_SENSOR, \ + LCASE, UCASE) +GEN_SES_CTRL_CURRENT_SENSOR_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_CURRENT_SENSOR_ACCESSORS(rqst_fail, RQST_FAIL) +#undef GEN_SES_CTRL_CURRENT_SENSOR_ACCESSORS + +/*--------------------- SCSI Target Port Control Element ---------------------*/ +struct ses_ctrl_target_port { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_scsi_target_port_field_data { + SES_CTRL_TARGET_PORT_RQST_IDENT_BYTE = 0, + SES_CTRL_TARGET_PORT_RQST_IDENT_MASK = 0x80, + SES_CTRL_TARGET_PORT_RQST_IDENT_SHIFT = 7, + + SES_CTRL_TARGET_PORT_RQST_FAIL_BYTE = 0, + SES_CTRL_TARGET_PORT_RQST_FAIL_MASK = 0x40, + SES_CTRL_TARGET_PORT_RQST_FAIL_SHIFT = 6, + + SES_CTRL_TARGET_PORT_ENABLE_BYTE = 2, + SES_CTRL_TARGET_PORT_ENABLE_MASK = 0x01, + SES_CTRL_TARGET_PORT_ENABLE_SHIFT = 0 +}; + +#define GEN_SES_CTRL_TARGET_PORT_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_target_port, SES_CTRL_TARGET_PORT, LCASE, UCASE) +GEN_SES_CTRL_TARGET_PORT_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_TARGET_PORT_ACCESSORS(rqst_fail, RQST_FAIL) +GEN_SES_CTRL_TARGET_PORT_ACCESSORS(enable, ENABLE) +#undef GEN_SES_CTRL_TARGET_PORT_ACCESSORS + +/*-------------------- SCSI Initiator Port Control Element -------------------*/ +struct ses_ctrl_initiator_port { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_initiator_port_field_data { + SES_CTRL_INITIATOR_PORT_RQST_IDENT_BYTE = 0, + SES_CTRL_INITIATOR_PORT_RQST_IDENT_MASK = 0x80, + SES_CTRL_INITIATOR_PORT_RQST_IDENT_SHIFT = 7, + + SES_CTRL_INITIATOR_PORT_RQST_FAIL_BYTE = 0, + SES_CTRL_INITIATOR_PORT_RQST_FAIL_MASK = 0x40, + SES_CTRL_INITIATOR_PORT_RQST_FAIL_SHIFT = 6, + + SES_CTRL_INITIATOR_PORT_ENABLE_BYTE = 2, + SES_CTRL_INITIATOR_PORT_ENABLE_MASK = 0x01, + SES_CTRL_INITIATOR_PORT_ENABLE_SHIFT = 0 +}; + +#define GEN_SES_CTRL_INITIATOR_PORT_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_initiator_port, SES_CTRL_INITIATOR_PORT, \ + LCASE, UCASE) +GEN_SES_CTRL_INITIATOR_PORT_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_INITIATOR_PORT_ACCESSORS(rqst_fail, RQST_FAIL) +GEN_SES_CTRL_INITIATOR_PORT_ACCESSORS(enable, ENABLE) +#undef GEN_SES_CTRL_INITIATOR_PORT_ACCESSORS + +/*-------------------- Simple Subenclosure Control Element -------------------*/ +struct ses_ctrl_simple_subenc { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_simple_subenc_field_data { + SES_CTRL_SIMPlE_SUBSES_RQST_IDENT_BYTE = 0, + SES_CTRL_SIMPlE_SUBSES_RQST_IDENT_MASK = 0x80, + SES_CTRL_SIMPlE_SUBSES_RQST_IDENT_SHIFT = 7, + + SES_CTRL_SIMPlE_SUBSES_RQST_FAIL_BYTE = 0, + SES_CTRL_SIMPlE_SUBSES_RQST_FAIL_MASK = 0x40, + SES_CTRL_SIMPlE_SUBSES_RQST_FAIL_SHIFT = 6 +}; + +#define GEN_SES_CTRL_SIMPlE_SUBSES_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_simple_subenc, SES_CTRL_SIMPlE_SUBSES, \ + LCASE, UCASE) +GEN_SES_CTRL_SIMPlE_SUBSES_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_SIMPlE_SUBSES_ACCESSORS(rqst_fail, RQST_FAIL) +#undef GEN_SES_CTRL_SIMPlE_SUBSES_ACCESSORS + +/*----------------------- SAS Expander Control Element -----------------------*/ +struct ses_ctrl_sas_expander { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_sas_expander_field_data { + SES_CTRL_SAS_EXPANDER_RQST_IDENT_BYTE = 0, + SES_CTRL_SAS_EXPANDER_RQST_IDENT_MASK = 0x80, + SES_CTRL_SAS_EXPANDER_RQST_IDENT_SHIFT = 7, + + SES_CTRL_SAS_EXPANDER_RQST_FAIL_BYTE = 0, + SES_CTRL_SAS_EXPANDER_RQST_FAIL_MASK = 0x40, + SES_CTRL_SAS_EXPANDER_RQST_FAIL_SHIFT = 6 +}; + +#define GEN_SES_CTRL_SAS_EXPANDER_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_sas_expander, SES_CTRL_SAS_EXPANDER, LCASE, UCASE) +GEN_SES_CTRL_SAS_EXPANDER_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_SAS_EXPANDER_ACCESSORS(rqst_fail, RQST_FAIL) +#undef GEN_SES_CTRL_SAS_EXPANDER_ACCESSORS + +/*----------------------- SAS Connector Control Element ----------------------*/ +struct ses_ctrl_sas_connector { + struct ses_ctrl_common common; + uint8_t bytes[3]; +}; + +enum ses_ctrl_sas_connector_field_data { + SES_CTRL_SAS_CONNECTOR_RQST_IDENT_BYTE = 0, + SES_CTRL_SAS_CONNECTOR_RQST_IDENT_MASK = 0x80, + SES_CTRL_SAS_CONNECTOR_RQST_IDENT_SHIFT = 7, + + SES_CTRL_SAS_CONNECTOR_RQST_FAIL_BYTE = 2, + SES_CTRL_SAS_CONNECTOR_RQST_FAIL_MASK = 0x40, + SES_CTRL_SAS_CONNECTOR_RQST_FAIL_SHIFT = 6 +}; + +#define GEN_SES_CTRL_SAS_CONNECTOR_ACCESSORS(LCASE, UCASE) \ + GEN_ACCESSORS(ses_ctrl_sas_connector, SES_CTRL_SAS_CONNECTOR, \ + LCASE, UCASE) +GEN_SES_CTRL_SAS_CONNECTOR_ACCESSORS(rqst_ident, RQST_IDENT) +GEN_SES_CTRL_SAS_CONNECTOR_ACCESSORS(rqst_fail, RQST_FAIL) +#undef GEN_SES_CTRL_SAS_CONNECTOR_ACCESSORS + +/*------------------------- Universal Control Element ------------------------*/ +union ses_ctrl_element { + struct ses_ctrl_common common; + struct ses_ctrl_dev_slot dev_slot; + struct ses_ctrl_array_dev_slot array_dev_slot; + struct ses_ctrl_power_supply power_supply; + struct ses_ctrl_cooling cooling; + struct ses_ctrl_temp_sensor temp_sensor; + struct ses_ctrl_door_lock door_lock; + struct ses_ctrl_audible_alarm audible_alarm; + struct ses_ctrl_ecc_electronics ecc_electronics; + struct ses_ctrl_scc_electronics scc_electronics; + struct ses_ctrl_nv_cache nv_cache; + struct ses_ctrl_invalid_op_reason invalid_op_reason; + struct ses_ctrl_ups ups; + struct ses_ctrl_display display; + struct ses_ctrl_key_pad_entry key_pad_entry; + struct ses_ctrl_scsi_port_or_xcvr scsi_port_or_xcvr; + struct ses_ctrl_language language; + struct ses_ctrl_comm_port comm_port; + struct ses_ctrl_voltage_sensor voltage_sensor; + struct ses_ctrl_current_sensor current_sensor; + struct ses_ctrl_target_port target_port; + struct ses_ctrl_initiator_port initiator_port; + struct ses_ctrl_simple_subenc simple_subenc; + struct ses_ctrl_sas_expander sas_expander; + struct ses_ctrl_sas_connector sas_connector; +}; + +/*--------------------- SCSI SES Control Diagnostic Page ---------------------*/ +struct ses_ctrl_page { + struct ses_page_hdr hdr; + union ses_ctrl_element elements[]; +}; + +enum ses_ctrl_page_field_data { + SES_CTRL_PAGE_INFO_MASK = 0x08, + SES_CTRL_PAGE_INFO_SHIFT = 3, + + SES_CTRL_PAGE_NON_CRIT_MASK = 0x04, + SES_CTRL_PAGE_NON_CRIT_SHIFT = 2, + + SES_CTRL_PAGE_CRIT_MASK = 0x02, + SES_CTRL_PAGE_CRIT_SHIFT = 1, + + SES_CTRL_PAGE_UNRECOV_MASK = 0x01, + SES_CTRL_PAGE_UNRECOV_SHIFT = 0 +}; + +#define GEN_SES_CTRL_PAGE_ACCESSORS(LCASE, UCASE) \ + GEN_HDR_ACCESSORS(ses_ctrl_page, SES_CTRL_PAGE, LCASE, UCASE) + +GEN_SES_CTRL_PAGE_ACCESSORS(info, INFO) +GEN_SES_CTRL_PAGE_ACCESSORS(non_crit, NON_CRIT) +GEN_SES_CTRL_PAGE_ACCESSORS(crit, CRIT) +GEN_SES_CTRL_PAGE_ACCESSORS(unrecov, UNRECOV) +#undef GEN_SES_CTRL_PAGE_ACCESSORS + +/*================= SCSI SES Status Diagnostic Page Structures ===============*/ +struct ses_status_common { + uint8_t bytes[1]; +}; + +enum ses_status_common_field_data { + SES_STATUS_COMMON_PRDFAIL_BYTE = 0, + SES_STATUS_COMMON_PRDFAIL_MASK = 0x40, + SES_STATUS_COMMON_PRDFAIL_SHIFT = 6, + + SES_STATUS_COMMON_DISABLED_BYTE = 0, + SES_STATUS_COMMON_DISABLED_MASK = 0x20, + SES_STATUS_COMMON_DISABLED_SHIFT = 5, + + SES_STATUS_COMMON_SWAP_BYTE = 0, + SES_STATUS_COMMON_SWAP_MASK = 0x10, + SES_STATUS_COMMON_SWAP_SHIFT = 4, + + SES_STATUS_COMMON_ELEMENT_STATUS_CODE_BYTE = 0, + SES_STATUS_COMMON_ELEMENT_STATUS_CODE_MASK = 0x0F, + SES_STATUS_COMMON_ELEMENT_STATUS_CODE_SHIFT = 0 +}; + +#define GEN_SES_STATUS_COMMON_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_common, SES_STATUS_COMMON, LCASE, UCASE) + +GEN_SES_STATUS_COMMON_ACCESSORS(prdfail, PRDFAIL) +GEN_SES_STATUS_COMMON_ACCESSORS(disabled, DISABLED) +GEN_SES_STATUS_COMMON_ACCESSORS(swap, SWAP) +GEN_SES_STATUS_COMMON_ACCESSORS(element_status_code, ELEMENT_STATUS_CODE) +#undef GEN_SES_STATUS_COMMON_ACCESSORS + +/*------------------------- Device Slot Status Element -----------------------*/ +struct ses_status_dev_slot { + struct ses_status_common common; + uint8_t slot_address; + uint8_t bytes[2]; +}; + +enum ses_status_dev_slot_field_data { + SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_A_BYTE = 0, + SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_A_MASK = 0x80, + SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_A_SHIFT = 7, + + SES_STATUS_DEV_SLOT_DO_NOT_REMOVE_BYTE = 0, + SES_STATUS_DEV_SLOT_DO_NOT_REMOVE_MASK = 0x40, + SES_STATUS_DEV_SLOT_DO_NOT_REMOVE_SHIFT = 6, + + SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_A_BYTE = 0, + SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_A_MASK = 0x20, + SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_A_SHIFT = 5, + + SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_B_BYTE = 0, + SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_B_MASK = 0x10, + SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_B_SHIFT = 4, + + SES_STATUS_DEV_SLOT_INSERT_READY_BYTE = 0, + SES_STATUS_DEV_SLOT_INSERT_READY_MASK = 0x08, + SES_STATUS_DEV_SLOT_INSERT_READY_SHIFT = 3, + + SES_STATUS_DEV_SLOT_REMOVE_BYTE = 0, + SES_STATUS_DEV_SLOT_REMOVE_MASK = 0x04, + SES_STATUS_DEV_SLOT_REMOVE_SHIFT = 2, + + SES_STATUS_DEV_SLOT_IDENT_BYTE = 0, + SES_STATUS_DEV_SLOT_IDENT_MASK = 0x02, + SES_STATUS_DEV_SLOT_IDENT_SHIFT = 1, + + SES_STATUS_DEV_SLOT_REPORT_BYTE = 0, + SES_STATUS_DEV_SLOT_REPORT_MASK = 0x01, + SES_STATUS_DEV_SLOT_REPORT_SHIFT = 0, + + SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_B_BYTE = 1, + SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_B_MASK = 0x80, + SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_B_SHIFT = 7, + + SES_STATUS_DEV_SLOT_FAULT_SENSED_BYTE = 1, + SES_STATUS_DEV_SLOT_FAULT_SENSED_MASK = 0x40, + SES_STATUS_DEV_SLOT_FAULT_SENSED_SHIFT = 6, + + SES_STATUS_DEV_SLOT_FAULT_REQUESTED_BYTE = 1, + SES_STATUS_DEV_SLOT_FAULT_REQUESTED_MASK = 0x20, + SES_STATUS_DEV_SLOT_FAULT_REQUESTED_SHIFT = 5, + + SES_STATUS_DEV_SLOT_DEVICE_OFF_BYTE = 1, + SES_STATUS_DEV_SLOT_DEVICE_OFF_MASK = 0x10, + SES_STATUS_DEV_SLOT_DEVICE_OFF_SHIFT = 4, + + SES_STATUS_DEV_SLOT_BYPED_A_BYTE = 1, + SES_STATUS_DEV_SLOT_BYPED_A_MASK = 0x08, + SES_STATUS_DEV_SLOT_BYPED_A_SHIFT = 3, + + SES_STATUS_DEV_SLOT_BYPED_B_BYTE = 1, + SES_STATUS_DEV_SLOT_BYPED_B_MASK = 0x04, + SES_STATUS_DEV_SLOT_BYPED_B_SHIFT = 2, + + SES_STATUS_DEV_SLOT_DEVICE_BYPED_A_BYTE = 1, + SES_STATUS_DEV_SLOT_DEVICE_BYPED_A_MASK = 0x02, + SES_STATUS_DEV_SLOT_DEVICE_BYPED_A_SHIFT = 1, + + SES_STATUS_DEV_SLOT_DEVICE_BYPED_B_BYTE = 1, + SES_STATUS_DEV_SLOT_DEVICE_BYPED_B_MASK = 0x01, + SES_STATUS_DEV_SLOT_DEVICE_BYPED_B_SHIFT = 0 +}; +#define GEN_SES_STATUS_DEV_SLOT_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_dev_slot, SES_STATUS_DEV_SLOT, LCASE, UCASE) + +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(app_client_byped_a, APP_CLIENT_BYPED_A) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(do_not_remove, DO_NOT_REMOVE) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(enclosure_byped_a, ENCLOSURE_BYPED_A) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(enclosure_byped_b, ENCLOSURE_BYPED_B) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(insert_ready, INSERT_READY) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(remove, REMOVE) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(report, REPORT) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(app_client_byped_b, APP_CLIENT_BYPED_B) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(fault_sensed, FAULT_SENSED) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(fault_requested, FAULT_REQUESTED) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(device_off, DEVICE_OFF) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(byped_a, BYPED_A) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(byped_b, BYPED_B) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(device_byped_a, DEVICE_BYPED_A) +GEN_SES_STATUS_DEV_SLOT_ACCESSORS(device_byped_b, DEVICE_BYPED_B) +#undef GEN_SES_STATUS_DEV_SLOT_ACCESSORS + +/*---------------------- Array Device Slot Status Element --------------------*/ +struct ses_status_array_dev_slot { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_array_dev_slot_field_data { + SES_STATUS_ARRAY_DEV_SLOT_OK_BYTE = 0, + SES_STATUS_ARRAY_DEV_SLOT_OK_MASK = 0x80, + SES_STATUS_ARRAY_DEV_SLOT_OK_SHIFT = 7, + + SES_STATUS_ARRAY_DEV_SLOT_RSVD_DEVICE_BYTE = 0, + SES_STATUS_ARRAY_DEV_SLOT_RSVD_DEVICE_MASK = 0x40, + SES_STATUS_ARRAY_DEV_SLOT_RSVD_DEVICE_SHIFT = 6, + + SES_STATUS_ARRAY_DEV_SLOT_HOT_SPARE_BYTE = 0, + SES_STATUS_ARRAY_DEV_SLOT_HOT_SPARE_MASK = 0x20, + SES_STATUS_ARRAY_DEV_SLOT_HOT_SPARE_SHIFT = 5, + + SES_STATUS_ARRAY_DEV_SLOT_CONS_CHECK_BYTE = 0, + SES_STATUS_ARRAY_DEV_SLOT_CONS_CHECK_MASK = 0x10, + SES_STATUS_ARRAY_DEV_SLOT_CONS_CHECK_SHIFT = 4, + + SES_STATUS_ARRAY_DEV_SLOT_IN_CRIT_ARRAY_BYTE = 0, + SES_STATUS_ARRAY_DEV_SLOT_IN_CRIT_ARRAY_MASK = 0x08, + SES_STATUS_ARRAY_DEV_SLOT_IN_CRIT_ARRAY_SHIFT = 3, + + SES_STATUS_ARRAY_DEV_SLOT_IN_FAILED_ARRAY_BYTE = 0, + SES_STATUS_ARRAY_DEV_SLOT_IN_FAILED_ARRAY_MASK = 0x04, + SES_STATUS_ARRAY_DEV_SLOT_IN_FAILED_ARRAY_SHIFT = 2, + + SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_BYTE = 0, + SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_MASK = 0x02, + SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_SHIFT = 1, + + SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_ABORT_BYTE = 0, + SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_ABORT_MASK = 0x01, + SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_ABORT_SHIFT = 0 + + /* + * The remaining fields are identical to the device + * slot element type. Access them through the device slot + * element type and its accessors. + */ +}; +#define GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_array_dev_slot, SES_STATUS_ARRAY_DEV_SLOT, \ + LCASE, UCASE) +GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(ok, OK) +GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(rsvd_device, RSVD_DEVICE) +GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(hot_spare, HOT_SPARE) +GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(cons_check, CONS_CHECK) +GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(in_crit_array, IN_CRIT_ARRAY) +GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(in_failed_array, IN_FAILED_ARRAY) +GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(rebuild_remap, REBUILD_REMAP) +GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(rebuild_remap_abort, + REBUILD_REMAP_ABORT) +#undef GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS + +/*----------------------- Power Supply Status Element ------------------------*/ +struct ses_status_power_supply { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_power_supply_field_data { + SES_STATUS_POWER_SUPPLY_IDENT_BYTE = 0, + SES_STATUS_POWER_SUPPLY_IDENT_MASK = 0x80, + SES_STATUS_POWER_SUPPLY_IDENT_SHIFT = 7, + + SES_STATUS_POWER_SUPPLY_DC_OVER_VOLTAGE_BYTE = 1, + SES_STATUS_POWER_SUPPLY_DC_OVER_VOLTAGE_MASK = 0x08, + SES_STATUS_POWER_SUPPLY_DC_OVER_VOLTAGE_SHIFT = 3, + + SES_STATUS_POWER_SUPPLY_DC_UNDER_VOLTAGE_BYTE = 1, + SES_STATUS_POWER_SUPPLY_DC_UNDER_VOLTAGE_MASK = 0x04, + SES_STATUS_POWER_SUPPLY_DC_UNDER_VOLTAGE_SHIFT = 2, + + SES_STATUS_POWER_SUPPLY_DC_OVER_CURRENT_BYTE = 1, + SES_STATUS_POWER_SUPPLY_DC_OVER_CURRENT_MASK = 0x02, + SES_STATUS_POWER_SUPPLY_DC_OVER_CURRENT_SHIFT = 1, + + SES_STATUS_POWER_SUPPLY_HOT_SWAP_BYTE = 2, + SES_STATUS_POWER_SUPPLY_HOT_SWAP_MASK = 0x80, + SES_STATUS_POWER_SUPPLY_HOT_SWAP_SHIFT = 7, + + SES_STATUS_POWER_SUPPLY_FAIL_BYTE = 2, + SES_STATUS_POWER_SUPPLY_FAIL_MASK = 0x40, + SES_STATUS_POWER_SUPPLY_FAIL_SHIFT = 6, + + SES_STATUS_POWER_SUPPLY_REQUESTED_ON_BYTE = 2, + SES_STATUS_POWER_SUPPLY_REQUESTED_ON_MASK = 0x20, + SES_STATUS_POWER_SUPPLY_REQUESTED_ON_SHIFT = 5, + + SES_STATUS_POWER_SUPPLY_OFF_BYTE = 2, + SES_STATUS_POWER_SUPPLY_OFF_MASK = 0x10, + SES_STATUS_POWER_SUPPLY_OFF_SHIFT = 4, + + SES_STATUS_POWER_SUPPLY_OVERTMP_FAIL_BYTE = 2, + SES_STATUS_POWER_SUPPLY_OVERTMP_FAIL_MASK = 0x08, + SES_STATUS_POWER_SUPPLY_OVERTMP_FAIL_SHIFT = 3, + + SES_STATUS_POWER_SUPPLY_TEMP_WARN_BYTE = 2, + SES_STATUS_POWER_SUPPLY_TEMP_WARN_MASK = 0x04, + SES_STATUS_POWER_SUPPLY_TEMP_WARN_SHIFT = 2, + + SES_STATUS_POWER_SUPPLY_AC_FAIL_BYTE = 2, + SES_STATUS_POWER_SUPPLY_AC_FAIL_MASK = 0x02, + SES_STATUS_POWER_SUPPLY_AC_FAIL_SHIFT = 1, + + SES_STATUS_POWER_SUPPLY_DC_FAIL_BYTE = 2, + SES_STATUS_POWER_SUPPLY_DC_FAIL_MASK = 0x01, + SES_STATUS_POWER_SUPPLY_DC_FAIL_SHIFT = 0 +}; + +#define GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_power_supply, SES_STATUS_POWER_SUPPLY, LCASE, UCASE) +GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(dc_over_voltage, DC_OVER_VOLTAGE) +GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(dc_under_voltage, DC_UNDER_VOLTAGE) +GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(dc_over_current, DC_OVER_CURRENT) +GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(hot_swap, HOT_SWAP) +GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(requested_on, REQUESTED_ON) +GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(off, OFF) +GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(overtmp_fail, OVERTMP_FAIL) +GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(temp_warn, TEMP_WARN) +GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(ac_fail, AC_FAIL) +GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(dc_fail, DC_FAIL) +#undef GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS + +/*-------------------------- Cooling Status Element --------------------------*/ +struct ses_status_cooling { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_cooling_field_data { + SES_STATUS_COOLING_IDENT_BYTE = 0, + SES_STATUS_COOLING_IDENT_MASK = 0x80, + SES_STATUS_COOLING_IDENT_SHIFT = 7, + + SES_STATUS_COOLING_ACTUAL_FAN_SPEED_MSB_BYTE = 0, + SES_STATUS_COOLING_ACTUAL_FAN_SPEED_MSB_MASK = 0x07, + SES_STATUS_COOLING_ACTUAL_FAN_SPEED_MSB_SHIFT = 0, + + SES_STATUS_COOLING_ACTUAL_FAN_SPEED_LSB_BYTE = 1, + SES_STATUS_COOLING_ACTUAL_FAN_SPEED_LSB_MASK = 0xFF, + SES_STATUS_COOLING_ACTUAL_FAN_SPEED_LSB_SHIFT = 0, + + SES_STATUS_COOLING_HOT_SWAP_BYTE = 2, + SES_STATUS_COOLING_HOT_SWAP_MASK = 0x40, + SES_STATUS_COOLING_HOT_SWAP_SHIFT = 6, + + SES_STATUS_COOLING_FAIL_BYTE = 2, + SES_STATUS_COOLING_FAIL_MASK = 0x40, + SES_STATUS_COOLING_FAIL_SHIFT = 6, + + SES_STATUS_COOLING_REQUESTED_ON_BYTE = 2, + SES_STATUS_COOLING_REQUESTED_ON_MASK = 0x20, + SES_STATUS_COOLING_REQUESTED_ON_SHIFT = 5, + + SES_STATUS_COOLING_OFF_BYTE = 2, + SES_STATUS_COOLING_OFF_MASK = 0x20, + SES_STATUS_COOLING_OFF_SHIFT = 5, + + SES_STATUS_COOLING_ACTUAL_SPEED_CODE_BYTE = 2, + SES_STATUS_COOLING_ACTUAL_SPEED_CODE_MASK = 0x07, + SES_STATUS_COOLING_ACTUAL_SPEED_CODE_SHIFT = 2, + SES_STATUS_COOLING_ACTUAL_SPEED_CODE_STOPPED = 0x00, + SES_STATUS_COOLING_ACTUAL_SPEED_CODE_LOWEST = 0x01, + SES_STATUS_COOLING_ACTUAL_SPEED_CODE_HIGHEST = 0x07 +}; + +#define GEN_SES_STATUS_COOLING_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_cooling, SES_STATUS_COOLING, LCASE, UCASE) +GEN_SES_STATUS_COOLING_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_COOLING_ACCESSORS(actual_fan_speed_msb, ACTUAL_FAN_SPEED_MSB) +GEN_SES_STATUS_COOLING_ACCESSORS(actual_fan_speed_lsb, ACTUAL_FAN_SPEED_LSB) +GEN_SES_STATUS_COOLING_ACCESSORS(hot_swap, HOT_SWAP) +GEN_SES_STATUS_COOLING_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_COOLING_ACCESSORS(requested_on, REQUESTED_ON) +GEN_SES_STATUS_COOLING_ACCESSORS(off, OFF) +GEN_SES_STATUS_COOLING_ACCESSORS(actual_speed_code, ACTUAL_SPEED_CODE) +#undef GEN_SES_STATUS_COOLING_ACCESSORS + +static inline int +ses_status_cooling_get_actual_fan_speed(struct ses_status_cooling *elem) +{ + return (ses_status_cooling_get_actual_fan_speed_msb(elem) << 8 + | ses_status_cooling_get_actual_fan_speed_lsb(elem)); +} + +/*-------------------- Temperature Sensor Status Element ---------------------*/ +struct ses_status_temp_sensor { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_temp_sensor_field_data { + SES_STATUS_TEMP_SENSOR_IDENT_BYTE = 0, + SES_STATUS_TEMP_SENSOR_IDENT_MASK = 0x80, + SES_STATUS_TEMP_SENSOR_IDENT_SHIFT = 7, + + SES_STATUS_TEMP_SENSOR_FAIL_BYTE = 0, + SES_STATUS_TEMP_SENSOR_FAIL_MASK = 0x40, + SES_STATUS_TEMP_SENSOR_FAIL_SHIFT = 6, + + SES_STATUS_TEMP_SENSOR_TEMPERATURE_BYTE = 1, + SES_STATUS_TEMP_SENSOR_TEMPERATURE_MASK = 0xFF, + SES_STATUS_TEMP_SENSOR_TEMPERATURE_SHIFT = 0, + + SES_STATUS_TEMP_SENSOR_OT_FAILURE_BYTE = 2, + SES_STATUS_TEMP_SENSOR_OT_FAILURE_MASK = 0x08, + SES_STATUS_TEMP_SENSOR_OT_FAILURE_SHIFT = 3, + + SES_STATUS_TEMP_SENSOR_OT_WARNING_BYTE = 2, + SES_STATUS_TEMP_SENSOR_OT_WARNING_MASK = 0x04, + SES_STATUS_TEMP_SENSOR_OT_WARNING_SHIFT = 2, + + SES_STATUS_TEMP_SENSOR_UT_FAILURE_BYTE = 2, + SES_STATUS_TEMP_SENSOR_UT_FAILURE_MASK = 0x02, + SES_STATUS_TEMP_SENSOR_UT_FAILURE_SHIFT = 1, + + SES_STATUS_TEMP_SENSOR_UT_WARNING_BYTE = 2, + SES_STATUS_TEMP_SENSOR_UT_WARNING_MASK = 0x01, + SES_STATUS_TEMP_SENSOR_UT_WARNING_SHIFT = 0 +}; + +#define GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_temp_sensor, SES_STATUS_TEMP_SENSOR, LCASE, UCASE) +GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(temperature, TEMPERATURE) +GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ot_failure, OT_FAILURE) +GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ot_warning, OT_WARNING) +GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ut_failure, UT_FAILURE) +GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ut_warning, UT_WARNING) +#undef GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS + +/*------------------------- Door Lock Status Element -------------------------*/ +struct ses_status_door_lock { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_door_lock_field_data { + SES_STATUS_DOOR_LOCK_IDENT_BYTE = 0, + SES_STATUS_DOOR_LOCK_IDENT_MASK = 0x80, + SES_STATUS_DOOR_LOCK_IDENT_SHIFT = 7, + + SES_STATUS_DOOR_LOCK_FAIL_BYTE = 0, + SES_STATUS_DOOR_LOCK_FAIL_MASK = 0x40, + SES_STATUS_DOOR_LOCK_FAIL_SHIFT = 6, + + SES_STATUS_DOOR_LOCK_UNLOCKED_BYTE = 2, + SES_STATUS_DOOR_LOCK_UNLOCKED_MASK = 0x01, + SES_STATUS_DOOR_LOCK_UNLOCKED_SHIFT = 0 +}; + +#define GEN_SES_STATUS_DOOR_LOCK_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_door_lock, SES_STATUS_DOOR_LOCK, LCASE, UCASE) +GEN_SES_STATUS_DOOR_LOCK_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_DOOR_LOCK_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_DOOR_LOCK_ACCESSORS(unlocked, UNLOCKED) +#undef GEN_SES_STATUS_DOOR_LOCK_ACCESSORS + +/*----------------------- Audible Alarm Status Element -----------------------*/ +struct ses_status_audible_alarm { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_audible_alarm_field_data { + SES_STATUS_AUDIBLE_ALARM_IDENT_BYTE = 0, + SES_STATUS_AUDIBLE_ALARM_IDENT_MASK = 0x80, + SES_STATUS_AUDIBLE_ALARM_IDENT_SHIFT = 7, + + SES_STATUS_AUDIBLE_ALARM_FAIL_BYTE = 0, + SES_STATUS_AUDIBLE_ALARM_FAIL_MASK = 0x40, + SES_STATUS_AUDIBLE_ALARM_FAIL_SHIFT = 6, + + SES_STATUS_AUDIBLE_ALARM_RQST_MUTE_BYTE = 2, + SES_STATUS_AUDIBLE_ALARM_RQST_MUTE_MASK = 0x80, + SES_STATUS_AUDIBLE_ALARM_RQST_MUTE_SHIFT = 7, + + SES_STATUS_AUDIBLE_ALARM_MUTED_BYTE = 2, + SES_STATUS_AUDIBLE_ALARM_MUTED_MASK = 0x40, + SES_STATUS_AUDIBLE_ALARM_MUTED_SHIFT = 6, + + SES_STATUS_AUDIBLE_ALARM_REMIND_BYTE = 2, + SES_STATUS_AUDIBLE_ALARM_REMIND_MASK = 0x10, + SES_STATUS_AUDIBLE_ALARM_REMIND_SHIFT = 4, + + SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_BYTE = 2, + SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_MASK = 0x0F, + SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_SHIFT = 0, + SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_INFO = 0x08, + SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_NON_CRIT = 0x04, + SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_CRIT = 0x02, + SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_UNRECOV = 0x01 +}; + +#define GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_audible_alarm, SES_STATUS_AUDIBLE_ALARM, LCASE, UCASE) +GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(rqst_mute, RQST_MUTE) +GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(muted, MUTED) +GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(remind, REMIND) +GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(tone_indicator, TONE_INDICATOR) +#undef GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS + +/*---------- Enclosure Services Statusler Electronics Status Element ---------*/ +struct ses_status_ecc_electronics { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_ecc_electronics_field_data { + SES_STATUS_ECC_ELECTRONICS_IDENT_BYTE = 0, + SES_STATUS_ECC_ELECTRONICS_IDENT_MASK = 0x80, + SES_STATUS_ECC_ELECTRONICS_IDENT_SHIFT = 7, + + SES_STATUS_ECC_ELECTRONICS_FAIL_BYTE = 0, + SES_STATUS_ECC_ELECTRONICS_FAIL_MASK = 0x40, + SES_STATUS_ECC_ELECTRONICS_FAIL_SHIFT = 6, + + SES_STATUS_ECC_ELECTRONICS_REPORT_BYTE = 1, + SES_STATUS_ECC_ELECTRONICS_REPORT_MASK = 0x01, + SES_STATUS_ECC_ELECTRONICS_REPORT_SHIFT = 0, + + SES_STATUS_ECC_ELECTRONICS_HOT_SWAP_BYTE = 2, + SES_STATUS_ECC_ELECTRONICS_HOT_SWAP_MASK = 0x80, + SES_STATUS_ECC_ELECTRONICS_HOT_SWAP_SHIFT = 7 +}; + +#define GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_ecc_electronics, SES_STATUS_ECC_ELECTRONICS, \ + LCASE, UCASE) +GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(report, REPORT) +GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(hot_swap, HOT_SWAP) +#undef GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS + +/*------------ SCSI Services Statusler Electronics Status Element ------------*/ +struct ses_status_scc_electronics { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_scc_electronics_field_data { + SES_STATUS_SCC_ELECTRONICS_IDENT_BYTE = 0, + SES_STATUS_SCC_ELECTRONICS_IDENT_MASK = 0x80, + SES_STATUS_SCC_ELECTRONICS_IDENT_SHIFT = 7, + + SES_STATUS_SCC_ELECTRONICS_FAIL_BYTE = 0, + SES_STATUS_SCC_ELECTRONICS_FAIL_MASK = 0x40, + SES_STATUS_SCC_ELECTRONICS_FAIL_SHIFT = 6, + + SES_STATUS_SCC_ELECTRONICS_REPORT_BYTE = 1, + SES_STATUS_SCC_ELECTRONICS_REPORT_MASK = 0x01, + SES_STATUS_SCC_ELECTRONICS_REPORT_SHIFT = 0 +}; + +#define GEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_scc_electronics, SES_STATUS_SCC_ELECTRONICS, \ + LCASE, UCASE) +GEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS(report, REPORT) +#undef GEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS + +/*--------------------- Nonvolatile Cache Status Element ---------------------*/ +struct ses_status_nv_cache { + struct ses_status_common common; + uint8_t bytes[1]; + uint8_t cache_size[2]; +}; + +enum ses_status_nv_cache_field_data { + SES_STATUS_NV_CACHE_IDENT_BYTE = 0, + SES_STATUS_NV_CACHE_IDENT_MASK = 0x80, + SES_STATUS_NV_CACHE_IDENT_SHIFT = 7, + + SES_STATUS_NV_CACHE_FAIL_BYTE = 0, + SES_STATUS_NV_CACHE_FAIL_MASK = 0x40, + SES_STATUS_NV_CACHE_FAIL_SHIFT = 6, + + SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_BYTE = 0, + SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_MASK = 0x03, + SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_SHIFT = 0, + SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_BYTES = 0x0, + SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_KBYTES = 0x1, + SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_MBYTES = 0x2, + SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_GBYTES = 0x3 +}; + +#define GEN_SES_STATUS_NV_CACHE_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_nv_cache, SES_STATUS_NV_CACHE, LCASE, UCASE) +GEN_SES_STATUS_NV_CACHE_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_NV_CACHE_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_NV_CACHE_ACCESSORS(size_multiplier, SIZE_MULTIPLIER) +#undef GEN_SES_STATUS_NV_CACHE_ACCESSORS + +static inline uintmax_t +ses_status_nv_cache_get_cache_size(struct ses_status_nv_cache *elem) +{ + uintmax_t cache_size; + int multiplier; + + /* Multiplier is in units of 2^10 */ + cache_size = scsi_2btoul(elem->cache_size); + multiplier = 10 * ses_status_nv_cache_get_size_multiplier(elem); + return (cache_size << multiplier); +} + +/*----------------- Invalid Operation Reason Status Element ------------------*/ +struct ses_status_invalid_op_reason { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_invalid_op_field_data { + SES_STATUS_INVALID_OP_REASON_TYPE_BYTE = 0, + SES_STATUS_INVALID_OP_REASON_TYPE_MASK = 0xC0, + SES_STATUS_INVALID_OP_REASON_TYPE_SHIFT = 6, + SES_STATUS_INVALID_OP_REASON_TYPE_PC_ERROR = 0x00, + SES_STATUS_INVALID_OP_REASON_TYPE_PF_ERROR = 0x01, + SES_STATUS_INVALID_OP_REASON_TYPE_VS_ERROR = 0x03, + + SES_STATUS_INVALID_OP_REASON_PC_ERROR_PC_NOT_SUPPORTED_BYTE = 0, + SES_STATUS_INVALID_OP_REASON_PC_ERROR_PC_NOT_SUPPORTED_MASK = 0x01, + SES_STATUS_INVALID_OP_REASON_PC_ERROR_PC_NOT_SUPPORTED_SHIFT = 0, + + SES_STATUS_INVALID_OP_REASON_PF_ERROR_BIT_NUMBER_BYTE = 0, + SES_STATUS_INVALID_OP_REASON_PF_ERROR_BIT_NUMBER_MASK = 0x03, + SES_STATUS_INVALID_OP_REASON_PF_ERROR_BIT_NUMBER_SHIFT = 0 +}; + +#define GEN_SES_STATUS_INVALID_OP_REASON_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_invalid_op_reason, SES_STATUS_INVALID_OP_REASON, \ + LCASE, UCASE) +GEN_SES_STATUS_INVALID_OP_REASON_ACCESSORS(type, TYPE) +GEN_SES_STATUS_INVALID_OP_REASON_ACCESSORS(pc_error_pc_not_supported, + PC_ERROR_PC_NOT_SUPPORTED) +GEN_SES_STATUS_INVALID_OP_REASON_ACCESSORS(pf_error_bit_number, + PF_ERROR_BIT_NUMBER) +#undef GEN_SES_STATUS_INVALID_OP_ACCESSORS + +/*--------------- Uninterruptible Power Supply Status Element ----------------*/ +struct ses_status_ups { + struct ses_status_common common; + /* Minutes of remaining capacity. */ + uint8_t battery_status; + uint8_t bytes[2]; +}; + +enum ses_status_ups_field_data { + SES_STATUS_UPS_AC_LO_BYTE = 0, + SES_STATUS_UPS_AC_LO_MASK = 0x80, + SES_STATUS_UPS_AC_LO_SHIFT = 7, + + SES_STATUS_UPS_AC_HI_BYTE = 0, + SES_STATUS_UPS_AC_HI_MASK = 0x40, + SES_STATUS_UPS_AC_HI_SHIFT = 6, + + SES_STATUS_UPS_AC_QUAL_BYTE = 0, + SES_STATUS_UPS_AC_QUAL_MASK = 0x20, + SES_STATUS_UPS_AC_QUAL_SHIFT = 5, + + SES_STATUS_UPS_AC_FAIL_BYTE = 0, + SES_STATUS_UPS_AC_FAIL_MASK = 0x10, + SES_STATUS_UPS_AC_FAIL_SHIFT = 4, + + SES_STATUS_UPS_DC_FAIL_BYTE = 0, + SES_STATUS_UPS_DC_FAIL_MASK = 0x08, + SES_STATUS_UPS_DC_FAIL_SHIFT = 3, + + SES_STATUS_UPS_UPS_FAIL_BYTE = 0, + SES_STATUS_UPS_UPS_FAIL_MASK = 0x04, + SES_STATUS_UPS_UPS_FAIL_SHIFT = 2, + + SES_STATUS_UPS_WARN_BYTE = 0, + SES_STATUS_UPS_WARN_MASK = 0x02, + SES_STATUS_UPS_WARN_SHIFT = 1, + + SES_STATUS_UPS_INTF_FAIL_BYTE = 0, + SES_STATUS_UPS_INTF_FAIL_MASK = 0x01, + SES_STATUS_UPS_INTF_FAIL_SHIFT = 0, + + SES_STATUS_UPS_IDENT_BYTE = 0, + SES_STATUS_UPS_IDENT_MASK = 0x80, + SES_STATUS_UPS_IDENT_SHIFT = 7, + + SES_STATUS_UPS_FAIL_BYTE = 1, + SES_STATUS_UPS_FAIL_MASK = 0x40, + SES_STATUS_UPS_FAIL_SHIFT = 6, + + SES_STATUS_UPS_BATT_FAIL_BYTE = 1, + SES_STATUS_UPS_BATT_FAIL_MASK = 0x02, + SES_STATUS_UPS_BATT_FAIL_SHIFT = 1, + + SES_STATUS_UPS_BPF_BYTE = 1, + SES_STATUS_UPS_BPF_MASK = 0x01, + SES_STATUS_UPS_BPF_SHIFT = 0 +}; + +#define GEN_SES_STATUS_UPS_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_ups, SES_STATUS_UPS, LCASE, UCASE) +GEN_SES_STATUS_UPS_ACCESSORS(ac_lo, AC_LO) +GEN_SES_STATUS_UPS_ACCESSORS(ac_hi, AC_HI) +GEN_SES_STATUS_UPS_ACCESSORS(ac_qual, AC_QUAL) +GEN_SES_STATUS_UPS_ACCESSORS(ac_fail, AC_FAIL) +GEN_SES_STATUS_UPS_ACCESSORS(dc_fail, DC_FAIL) +GEN_SES_STATUS_UPS_ACCESSORS(ups_fail, UPS_FAIL) +GEN_SES_STATUS_UPS_ACCESSORS(warn, WARN) +GEN_SES_STATUS_UPS_ACCESSORS(intf_fail, INTF_FAIL) +GEN_SES_STATUS_UPS_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_UPS_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_UPS_ACCESSORS(batt_fail, BATT_FAIL) +GEN_SES_STATUS_UPS_ACCESSORS(bpf, BPF) +#undef GEN_SES_STATUS_UPS_ACCESSORS + +/*-------------------------- Display Status Element --------------------------*/ +struct ses_status_display { + struct ses_status_common common; + uint8_t bytes[1]; + uint8_t display_character[2]; +}; + +enum ses_status_display_field_data { + SES_STATUS_DISPLAY_IDENT_BYTE = 0, + SES_STATUS_DISPLAY_IDENT_MASK = 0x80, + SES_STATUS_DISPLAY_IDENT_SHIFT = 7, + + SES_STATUS_DISPLAY_FAIL_BYTE = 0, + SES_STATUS_DISPLAY_FAIL_MASK = 0x40, + SES_STATUS_DISPLAY_FAIL_SHIFT = 6, + + SES_STATUS_DISPLAY_DISPLAY_MODE_BYTE = 0, + SES_STATUS_DISPLAY_DISPLAY_MODE_MASK = 0x03, + SES_STATUS_DISPLAY_DISPLAY_MODE_SHIFT = 6, + SES_STATUS_DISPLAY_DISPLAY_MODE_DC_FIELD_UNSUPP = 0x0, + SES_STATUS_DISPLAY_DISPLAY_MODE_DC_FIELD_SUPP = 0x1, + SES_STATUS_DISPLAY_DISPLAY_MODE_DC_FIELD = 0x2 +}; + +#define GEN_SES_STATUS_DISPLAY_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_display, SES_STATUS_DISPLAY, LCASE, UCASE) +GEN_SES_STATUS_DISPLAY_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_DISPLAY_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_DISPLAY_ACCESSORS(display_mode, DISPLAY_MODE) +#undef GEN_SES_STATUS_DISPLAY_ACCESSORS + +/*----------------------- Key Pad Entry Status Element -----------------------*/ +struct ses_status_key_pad_entry { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_key_pad_entry_field_data { + SES_STATUS_KEY_PAD_ENTRY_IDENT_BYTE = 0, + SES_STATUS_KEY_PAD_ENTRY_IDENT_MASK = 0x80, + SES_STATUS_KEY_PAD_ENTRY_IDENT_SHIFT = 7, + + SES_STATUS_KEY_PAD_ENTRY_FAIL_BYTE = 0, + SES_STATUS_KEY_PAD_ENTRY_FAIL_MASK = 0x40, + SES_STATUS_KEY_PAD_ENTRY_FAIL_SHIFT = 6 +}; + +#define GEN_SES_STATUS_KEY_PAD_ENTRY_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_key_pad_entry, SES_STATUS_KEY_PAD_ENTRY, LCASE, UCASE) +GEN_SES_STATUS_KEY_PAD_ENTRY_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_KEY_PAD_ENTRY_ACCESSORS(fail, FAIL) +#undef GEN_SES_STATUS_KEY_PAD_ENTRY_ACCESSORS + +/*------------------------- Enclosure Status Element -------------------------*/ +struct ses_status_enclosure { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_enclosure_field_data { + SES_STATUS_ENCLOSURE_IDENT_BYTE = 0, + SES_STATUS_ENCLOSURE_IDENT_MASK = 0x80, + SES_STATUS_ENCLOSURE_IDENT_SHIFT = 7, + + SES_STATUS_ENCLOSURE_TIME_UNTIL_POWER_CYCLE_BYTE = 1, + SES_STATUS_ENCLOSURE_TIME_UNTIL_POWER_CYCLE_MASK = 0xFC, + SES_STATUS_ENCLOSURE_TIME_UNTIL_POWER_CYCLE_SHIFT = 2, + + SES_STATUS_ENCLOSURE_FAIL_BYTE = 1, + SES_STATUS_ENCLOSURE_FAIL_MASK = 0x02, + SES_STATUS_ENCLOSURE_FAIL_SHIFT = 1, + + SES_STATUS_ENCLOSURE_WARN_BYTE = 1, + SES_STATUS_ENCLOSURE_WARN_MASK = 0x01, + SES_STATUS_ENCLOSURE_WARN_SHIFT = 0, + + SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_BYTE = 2, + SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_MASK = 0xFC, + SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_SHIFT = 2, + SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_MAX_AUTO = 60, + SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_MANUAL = 63, + + SES_STATUS_ENCLOSURE_REQUESTED_FAIL_BYTE = 2, + SES_STATUS_ENCLOSURE_REQUESTED_FAIL_MASK = 0x02, + SES_STATUS_ENCLOSURE_REQUESTED_FAIL_SHIFT = 1, + + SES_STATUS_ENCLOSURE_REQUESTED_WARN_BYTE = 2, + SES_STATUS_ENCLOSURE_REQUESTED_WARN_MASK = 0x01, + SES_STATUS_ENCLOSURE_REQUESTED_WARN_SHIFT = 0 +}; + +#define GEN_SES_STATUS_ENCLOSURE_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_enclosure, SES_STATUS_ENCLOSURE, LCASE, UCASE) +GEN_SES_STATUS_ENCLOSURE_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_ENCLOSURE_ACCESSORS(time_until_power_cycle, + TIME_UNTIL_POWER_CYCLE) +GEN_SES_STATUS_ENCLOSURE_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_ENCLOSURE_ACCESSORS(warn, WARN) +GEN_SES_STATUS_ENCLOSURE_ACCESSORS(requested_power_off_duration, + REQUESTED_POWER_OFF_DURATION) +GEN_SES_STATUS_ENCLOSURE_ACCESSORS(requested_fail, REQUESTED_FAIL) +GEN_SES_STATUS_ENCLOSURE_ACCESSORS(requested_warn, REQUESTED_WARN) +#undef GEN_SES_STATUS_ENCLOSURE_ACCESSORS + +/*------------------- SCSI Port/Transceiver Status Element -------------------*/ +struct ses_status_scsi_port_or_xcvr { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_scsi_port_or_xcvr_field_data { + SES_STATUS_SCSI_PORT_OR_XCVR_IDENT_BYTE = 0, + SES_STATUS_SCSI_PORT_OR_XCVR_IDENT_MASK = 0x80, + SES_STATUS_SCSI_PORT_OR_XCVR_IDENT_SHIFT = 7, + + SES_STATUS_SCSI_PORT_OR_XCVR_FAIL_BYTE = 0, + SES_STATUS_SCSI_PORT_OR_XCVR_FAIL_MASK = 0x40, + SES_STATUS_SCSI_PORT_OR_XCVR_FAIL_SHIFT = 6, + + SES_STATUS_SCSI_PORT_OR_XCVR_REPORT_BYTE = 1, + SES_STATUS_SCSI_PORT_OR_XCVR_REPORT_MASK = 0x01, + SES_STATUS_SCSI_PORT_OR_XCVR_REPORT_SHIFT = 0, + + SES_STATUS_SCSI_PORT_OR_XCVR_DISABLED_BYTE = 2, + SES_STATUS_SCSI_PORT_OR_XCVR_DISABLED_MASK = 0x10, + SES_STATUS_SCSI_PORT_OR_XCVR_DISABLED_SHIFT = 4, + + SES_STATUS_SCSI_PORT_OR_XCVR_LOL_BYTE = 2, + SES_STATUS_SCSI_PORT_OR_XCVR_LOL_MASK = 0x02, + SES_STATUS_SCSI_PORT_OR_XCVR_LOL_SHIFT = 1, + + SES_STATUS_SCSI_PORT_OR_XCVR_XMIT_FAIL_BYTE = 2, + SES_STATUS_SCSI_PORT_OR_XCVR_XMIT_FAIL_MASK = 0x01, + SES_STATUS_SCSI_PORT_OR_XCVR_XMIT_FAIL_SHIFT = 0 +}; + +#define GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_scsi_port_or_xcvr, SES_STATUS_SCSI_PORT_OR_XCVR,\ + LCASE, UCASE) +GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(report, REPORT) +GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(disable, DISABLED) +GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(lol, LOL) +GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(xmit_fail, XMIT_FAIL) +#undef GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS + +/*------------------------- Language Status Element --------------------------*/ +struct ses_status_language { + struct ses_status_common common; + uint8_t bytes[1]; + uint8_t language_code[2]; +}; + +enum ses_status_language_field_data { + SES_STATUS_LANGUAGE_IDENT_BYTE = 0, + SES_STATUS_LANGUAGE_IDENT_MASK = 0x80, + SES_STATUS_LANGUAGE_IDENT_SHIFT = 7 +}; + +#define GEN_SES_STATUS_LANGUAGE_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_language, SES_STATUS_LANGUAGE, LCASE, UCASE) +GEN_SES_STATUS_LANGUAGE_ACCESSORS(ident, IDENT) +#undef GEN_SES_STATUS_LANGUAGE_ACCESSORS + +/*-------------------- Communication Port Status Element ---------------------*/ +struct ses_status_comm_port { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_comm_port_field_data { + SES_STATUS_COMM_PORT_IDENT_BYTE = 0, + SES_STATUS_COMM_PORT_IDENT_MASK = 0x80, + SES_STATUS_COMM_PORT_IDENT_SHIFT = 7, + + SES_STATUS_COMM_PORT_FAIL_BYTE = 0, + SES_STATUS_COMM_PORT_FAIL_MASK = 0x40, + SES_STATUS_COMM_PORT_FAIL_SHIFT = 6, + + SES_STATUS_COMM_PORT_DISABLED_BYTE = 2, + SES_STATUS_COMM_PORT_DISABLED_MASK = 0x01, + SES_STATUS_COMM_PORT_DISABLED_SHIFT = 0 +}; + +#define GEN_SES_STATUS_COMM_PORT_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_comm_port, SES_STATUS_COMM_PORT, LCASE, UCASE) +GEN_SES_STATUS_COMM_PORT_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_COMM_PORT_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_COMM_PORT_ACCESSORS(disabled, DISABLED) +#undef GEN_SES_STATUS_COMM_PORT_ACCESSORS + +/*---------------------- Voltage Sensor Status Element -----------------------*/ +struct ses_status_voltage_sensor { + struct ses_status_common common; + uint8_t bytes[1]; + uint8_t voltage[2]; +}; + +enum ses_status_voltage_sensor_field_data { + SES_STATUS_VOLTAGE_SENSOR_IDENT_BYTE = 0, + SES_STATUS_VOLTAGE_SENSOR_IDENT_MASK = 0x80, + SES_STATUS_VOLTAGE_SENSOR_IDENT_SHIFT = 7, + + SES_STATUS_VOLTAGE_SENSOR_FAIL_BYTE = 0, + SES_STATUS_VOLTAGE_SENSOR_FAIL_MASK = 0x40, + SES_STATUS_VOLTAGE_SENSOR_FAIL_SHIFT = 6, + + SES_STATUS_VOLTAGE_SENSOR_WARN_OVER_BYTE = 0, + SES_STATUS_VOLTAGE_SENSOR_WARN_OVER_MASK = 0x08, + SES_STATUS_VOLTAGE_SENSOR_WARN_OVER_SHIFT = 3, + + SES_STATUS_VOLTAGE_SENSOR_WARN_UNDER_BYTE = 0, + SES_STATUS_VOLTAGE_SENSOR_WARN_UNDER_MASK = 0x04, + SES_STATUS_VOLTAGE_SENSOR_WARN_UNDER_SHIFT = 2, + + SES_STATUS_VOLTAGE_SENSOR_CRIT_OVER_BYTE = 0, + SES_STATUS_VOLTAGE_SENSOR_CRIT_OVER_MASK = 0x02, + SES_STATUS_VOLTAGE_SENSOR_CRIT_OVER_SHIFT = 1, + + SES_STATUS_VOLTAGE_SENSOR_CRIT_UNDER_BYTE = 0, + SES_STATUS_VOLTAGE_SENSOR_CRIT_UNDER_MASK = 0x01, + SES_STATUS_VOLTAGE_SENSOR_CRIT_UNDER_SHIFT = 0 +}; + +#define GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_voltage_sensor, SES_STATUS_VOLTAGE_SENSOR, \ + LCASE, UCASE) +GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(warn_over, WARN_OVER) +GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(warn_under, WARN_UNDER) +GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(crit_over, CRIT_OVER) +GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(crit_under, CRIT_UNDER) +#undef GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS + +/*---------------------- Current Sensor Status Element -----------------------*/ +struct ses_status_current_sensor { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_current_sensor_field_data { + SES_STATUS_CURRENT_SENSOR_IDENT_BYTE = 0, + SES_STATUS_CURRENT_SENSOR_IDENT_MASK = 0x80, + SES_STATUS_CURRENT_SENSOR_IDENT_SHIFT = 7, + + SES_STATUS_CURRENT_SENSOR_FAIL_BYTE = 0, + SES_STATUS_CURRENT_SENSOR_FAIL_MASK = 0x40, + SES_STATUS_CURRENT_SENSOR_FAIL_SHIFT = 6, + + SES_STATUS_CURRENT_SENSOR_WARN_OVER_BYTE = 0, + SES_STATUS_CURRENT_SENSOR_WARN_OVER_MASK = 0x08, + SES_STATUS_CURRENT_SENSOR_WARN_OVER_SHIFT = 3, + + SES_STATUS_CURRENT_SENSOR_CRIT_OVER_BYTE = 0, + SES_STATUS_CURRENT_SENSOR_CRIT_OVER_MASK = 0x02, + SES_STATUS_CURRENT_SENSOR_CRIT_OVER_SHIFT = 1 +}; + +#define GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_current_sensor, SES_STATUS_CURRENT_SENSOR, \ + LCASE, UCASE) +GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(warn_over, WARN_OVER) +GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(crit_over, CRIT_OVER) +#undef GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS + +/*--------------------- SCSI Target Port Status Element ----------------------*/ +struct ses_status_target_port { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_scsi_target_port_field_data { + SES_STATUS_TARGET_PORT_IDENT_BYTE = 0, + SES_STATUS_TARGET_PORT_IDENT_MASK = 0x80, + SES_STATUS_TARGET_PORT_IDENT_SHIFT = 7, + + SES_STATUS_TARGET_PORT_FAIL_BYTE = 0, + SES_STATUS_TARGET_PORT_FAIL_MASK = 0x40, + SES_STATUS_TARGET_PORT_FAIL_SHIFT = 6, + + SES_STATUS_TARGET_PORT_REPORT_BYTE = 1, + SES_STATUS_TARGET_PORT_REPORT_MASK = 0x01, + SES_STATUS_TARGET_PORT_REPORT_SHIFT = 0, + + SES_STATUS_TARGET_PORT_ENABLED_BYTE = 2, + SES_STATUS_TARGET_PORT_ENABLED_MASK = 0x01, + SES_STATUS_TARGET_PORT_ENABLED_SHIFT = 0 +}; + +#define GEN_SES_STATUS_TARGET_PORT_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_target_port, SES_STATUS_TARGET_PORT, LCASE, UCASE) +GEN_SES_STATUS_TARGET_PORT_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_TARGET_PORT_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_TARGET_PORT_ACCESSORS(report, REPORT) +GEN_SES_STATUS_TARGET_PORT_ACCESSORS(enabled, ENABLED) +#undef GEN_SES_STATUS_TARGET_PORT_ACCESSORS + +/*-------------------- SCSI Initiator Port Status Element --------------------*/ +struct ses_status_initiator_port { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_scsi_initiator_port_field_data { + SES_STATUS_INITIATOR_PORT_IDENT_BYTE = 0, + SES_STATUS_INITIATOR_PORT_IDENT_MASK = 0x80, + SES_STATUS_INITIATOR_PORT_IDENT_SHIFT = 7, + + SES_STATUS_INITIATOR_PORT_FAIL_BYTE = 0, + SES_STATUS_INITIATOR_PORT_FAIL_MASK = 0x40, + SES_STATUS_INITIATOR_PORT_FAIL_SHIFT = 6, + + SES_STATUS_INITIATOR_PORT_REPORT_BYTE = 1, + SES_STATUS_INITIATOR_PORT_REPORT_MASK = 0x01, + SES_STATUS_INITIATOR_PORT_REPORT_SHIFT = 0, + + SES_STATUS_INITIATOR_PORT_ENABLED_BYTE = 2, + SES_STATUS_INITIATOR_PORT_ENABLED_MASK = 0x01, + SES_STATUS_INITIATOR_PORT_ENABLED_SHIFT = 0 +}; + +#define GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_initiator_port, SES_STATUS_INITIATOR_PORT, \ + LCASE, UCASE) +GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(fail, FAIL) +GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(report, REPORT) +GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(enabled, ENABLED) +#undef GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS + +/*-------------------- Simple Subenclosure Status Element --------------------*/ +struct ses_status_simple_subses { + struct ses_status_common common; + uint8_t bytes[2]; + uint8_t short_enclosure_status; +}; + +enum ses_status_simple_subses_field_data { + SES_STATUS_SIMPlE_SUBSES_IDENT_BYTE = 0, + SES_STATUS_SIMPlE_SUBSES_IDENT_MASK = 0x80, + SES_STATUS_SIMPlE_SUBSES_IDENT_SHIFT = 7, + + SES_STATUS_SIMPlE_SUBSES_FAIL_BYTE = 0, + SES_STATUS_SIMPlE_SUBSES_FAIL_MASK = 0x40, + SES_STATUS_SIMPlE_SUBSES_FAIL_SHIFT = 6 +}; + +#define GEN_SES_STATUS_SIMPlE_SUBSES_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_simple_subses, SES_STATUS_SIMPlE_SUBSES, \ + LCASE, UCASE) +GEN_SES_STATUS_SIMPlE_SUBSES_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_SIMPlE_SUBSES_ACCESSORS(fail, FAIL) +#undef GEN_SES_STATUS_SIMPlE_SUBSES_ACCESSORS + +/*----------------------- SAS Expander Status Element ------------------------*/ +struct ses_status_sas_expander { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_sas_expander_field_data { + SES_STATUS_SAS_EXPANDER_IDENT_BYTE = 0, + SES_STATUS_SAS_EXPANDER_IDENT_MASK = 0x80, + SES_STATUS_SAS_EXPANDER_IDENT_SHIFT = 7, + + SES_STATUS_SAS_EXPANDER_FAIL_BYTE = 0, + SES_STATUS_SAS_EXPANDER_FAIL_MASK = 0x40, + SES_STATUS_SAS_EXPANDER_FAIL_SHIFT = 6 +}; + +#define GEN_SES_STATUS_SAS_EXPANDER_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_sas_expander, SES_STATUS_SAS_EXPANDER, LCASE, UCASE) +GEN_SES_STATUS_SAS_EXPANDER_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_SAS_EXPANDER_ACCESSORS(fail, FAIL) +#undef GEN_SES_STATUS_SAS_EXPANDER_ACCESSORS + +/*----------------------- SAS Connector Status Element -----------------------*/ +struct ses_status_sas_connector { + struct ses_status_common common; + uint8_t bytes[3]; +}; + +enum ses_status_sas_connector_field_data { + SES_STATUS_SAS_CONNECTOR_IDENT_BYTE = 0, + SES_STATUS_SAS_CONNECTOR_IDENT_MASK = 0x80, + SES_STATUS_SAS_CONNECTOR_IDENT_SHIFT = 7, + + SES_STATUS_SAS_CONNECTOR_TYPE_BYTE = 0, + SES_STATUS_SAS_CONNECTOR_TYPE_MASK = 0x7F, + SES_STATUS_SAS_CONNECTOR_TYPE_SHIFT = 0, + + SES_STATUS_SAS_CONNECTOR_PHYS_LINK_BYTE = 1, + SES_STATUS_SAS_CONNECTOR_PHYS_LINK_MASK = 0xFF, + SES_STATUS_SAS_CONNECTOR_PHYS_LINK_SHIFT = 0, + SES_STATUS_SAS_CONNECTOR_PHYS_LINK_ALL = 0xFF, + + SES_STATUS_SAS_CONNECTOR_FAIL_BYTE = 2, + SES_STATUS_SAS_CONNECTOR_FAIL_MASK = 0x40, + SES_STATUS_SAS_CONNECTOR_FAIL_SHIFT = 6, +}; + +#define GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(LCASE, UCASE) \ + GEN_GETTER(ses_status_sas_connector, SES_STATUS_SAS_CONNECTOR, \ + LCASE, UCASE) +GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(ident, IDENT) +GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(type, TYPE) +GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(phys_link, PHYS_LINK) +GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(fail, FAIL) +#undef GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS + +/*------------------------- Universal Status Element -------------------------*/ +union ses_status_element { + struct ses_status_common common; + struct ses_status_dev_slot dev_slot; + struct ses_status_array_dev_slot array_dev_slot; + struct ses_status_power_supply power_supply; + struct ses_status_cooling cooling; + struct ses_status_temp_sensor temp_sensor; + struct ses_status_door_lock door_lock; + struct ses_status_audible_alarm audible_alarm; + struct ses_status_ecc_electronics ecc_electronics; + struct ses_status_scc_electronics scc_electronics; + struct ses_status_nv_cache nv_cache; + struct ses_status_invalid_op_reason invalid_op_reason; + struct ses_status_ups ups; + struct ses_status_display display; + struct ses_status_key_pad_entry key_pad_entry; + struct ses_status_scsi_port_or_xcvr scsi_port_or_xcvr; + struct ses_status_language language; + struct ses_status_comm_port comm_port; + struct ses_status_voltage_sensor voltage_sensor; + struct ses_status_current_sensor current_sensor; + struct ses_status_target_port target_port; + struct ses_status_initiator_port initiator_port; + struct ses_status_simple_subses simple_subses; + struct ses_status_sas_expander sas_expander; + struct ses_status_sas_connector sas_connector; + uint8_t bytes[4]; +}; + +/*===================== SCSI SES Status Diagnostic Page =====================*/ +struct ses_status_page { + struct ses_page_hdr hdr; + union ses_status_element elements[]; +}; + +enum ses_status_page_field_data { + SES_STATUS_PAGE_INVOP_MASK = 0x10, + SES_STATUS_PAGE_INVOP_SHIFT = 4, + + SES_STATUS_PAGE_INFO_MASK = 0x08, + SES_STATUS_PAGE_INFO_SHIFT = 3, + + SES_STATUS_PAGE_NON_CRIT_MASK = 0x04, + SES_STATUS_PAGE_NON_CRIT_SHIFT = 2, + + SES_STATUS_PAGE_CRIT_MASK = 0x02, + SES_STATUS_PAGE_CRIT_SHIFT = 1, + + SES_STATUS_PAGE_UNRECOV_MASK = 0x01, + SES_STATUS_PAGE_UNRECOV_SHIFT = 0, + + SES_STATUS_PAGE_CHANGED_MASK = SES_STATUS_PAGE_INVOP_MASK + | SES_STATUS_PAGE_INFO_MASK + | SES_STATUS_PAGE_NON_CRIT_MASK + | SES_STATUS_PAGE_CRIT_MASK + | SES_STATUS_PAGE_UNRECOV_MASK, + SES_STATUS_PAGE_CHANGED_SHIFT = 0, +}; + +#define GEN_SES_STATUS_PAGE_ACCESSORS(LCASE, UCASE) \ + GEN_HDR_ACCESSORS(ses_status_page, SES_STATUS_PAGE, LCASE, UCASE) + +GEN_SES_STATUS_PAGE_ACCESSORS(invop, INVOP) +GEN_SES_STATUS_PAGE_ACCESSORS(info, INFO) +GEN_SES_STATUS_PAGE_ACCESSORS(non_crit, NON_CRIT) +GEN_SES_STATUS_PAGE_ACCESSORS(crit, CRIT) +GEN_SES_STATUS_PAGE_ACCESSORS(unrecov, UNRECOV) +GEN_SES_STATUS_PAGE_ACCESSORS(changed, CHANGED) +#undef GEN_SES_STATUS_PAGE_ACCESSORS + +/*================ SCSI SES Element Descriptor Diagnostic Page ===============*/ +struct ses_elem_descr { + uint8_t reserved[2]; + uint8_t length[2]; + char description[]; +}; + +struct ses_elem_descr_page { + struct ses_page_hdr hdr; + struct ses_elem_descr descrs[]; +}; + +/*============ SCSI SES Additional Element Status Diagnostic Page ============*/ +struct ses_addl_elem_status_page { + struct ses_page_hdr hdr; +}; + +/*====================== Legacy (Deprecated) Structures ======================*/ +struct ses_control_page_hdr { + uint8_t page_code; + uint8_t control_flags; + uint8_t length[2]; + uint8_t gen_code[4]; +/* Followed by variable length array of descriptors. */ +}; + +struct ses_status_page_hdr { + uint8_t page_code; + uint8_t status_flags; + uint8_t length[2]; + uint8_t gen_code[4]; +/* Followed by variable length array of descriptors. */ +}; + +/* ses_page_hdr.reserved values */ /* - * Overall Enclosure Status + * Enclosure Status Diagnostic Page: + * uint8_t reserved : 3, + * invop : 1, + * info : 1, + * noncritical : 1, + * critical : 1, + * unrecov : 1; */ -typedef unsigned char ses_encstat; -#define SES_ENCSTAT_UNRECOV 0x1 -#define SES_ENCSTAT_CRITICAL 0x2 -#define SES_ENCSTAT_NONCRITICAL 0x4 -#define SES_ENCSTAT_INFO 0x8 +#define SES_ENCSTAT_UNRECOV 0x01 +#define SES_ENCSTAT_CRITICAL 0x02 +#define SES_ENCSTAT_NONCRITICAL 0x04 +#define SES_ENCSTAT_INFO 0x08 +#define SES_ENCSTAT_INVOP 0x10 +/* Status mask: All of the above OR'd together */ +#define SES_STATUS_MASK 0x1f +#define SES_SET_STATUS_MASK 0xf +/* Element Descriptor Diagnostic Page: unused */ +/* Additional Element Status Diagnostic Page: unused */ + -/* - * Object Status - */ -typedef struct { - unsigned int obj_id; - unsigned char cstat[4]; -} ses_objstat; /* Summary SES Status Defines, Common Status Codes */ #define SES_OBJSTAT_UNSUPPORTED 0 @@ -140,6 +2164,7 @@ typedef struct { #define SES_OBJSTAT_NOTINSTALLED 5 #define SES_OBJSTAT_UNKNOWN 6 #define SES_OBJSTAT_NOTAVAIL 7 +#define SES_OBJSTAT_NOACCESS 8 /* * For control pages, cstat[0] is the same for the @@ -181,3 +2206,236 @@ typedef union { unsigned int obj_id; char obj_text[1]; } ses_hlptxt; + +/*============================================================================*/ +struct ses_elm_desc_hdr { + uint8_t reserved[2]; + uint8_t length[2]; +}; + +/* + * SES v2 r20 6.1.13 - Element Additional Status diagnostic page + * Tables 26-28 (general), 29-32 (FC), 33-41 (SAS) + * + * Protocol identifier uses definitions in scsi_all.h; + * SPSP_PROTO_FC, SPSP_PROTO_SAS are the only ones used here. + */ + +struct ses_elm_fc_eip_hdr { + uint8_t num_phys; + uint8_t reserved[2]; + uint8_t dev_slot_num; + uint8_t node_name[8]; +}; + +struct ses_elm_fc_noneip_hdr { + uint8_t num_phys; + uint8_t reserved; + uint8_t node_name[8]; +}; + +struct ses_elm_fc_base_hdr { + uint8_t num_phys; +}; + +union ses_elm_fc_hdr { + struct ses_elm_fc_base_hdr base_hdr; + struct ses_elm_fc_eip_hdr eip_hdr; + struct ses_elm_fc_noneip_hdr noneip_hdr; +}; + +struct ses_elm_fc_port { + uint8_t port_loop_position; + uint8_t bypass_reason; +#define SES_FC_PORT_BYPASS_UNBYPASSED 0x00 + +#define SES_FC_PORT_BYPASS_LINKFAIL_RATE_TOO_HIGH 0x10 +#define SES_FC_PORT_BYPASS_SYNC_LOSS_RATE_TOO_HIGH 0x11 +#define SES_FC_PORT_BYPASS_SIGNAL_LOSS_RATE_TOO_HIGH 0x12 +#define SES_FC_PORT_BYPASS_SEQPROTO_ERR_RATE_TOO_HIGH 0x13 +#define SES_FC_PORT_BYPASS_INVAL_XMIT_RATE_TOO_HIGH 0x14 +#define SES_FC_PORT_BYPASS_CRC_ERR_RATE_TOO_HIGH 0x15 + +#define SES_FC_PORT_BYPASS_ERR_RATE_RESERVED_BEGIN 0x16 +#define SES_FC_PORT_BYPASS_ERR_RATE_RESERVED_END 0x1F + +#define SES_FC_PORT_BYPASS_LINKFAIL_COUNT_TOO_HIGH 0x20 +#define SES_FC_PORT_BYPASS_SYNC_LOSS_COUNT_TOO_HIGH 0x21 +#define SES_FC_PORT_BYPASS_SIGNAL_LOSS_COUNT_TOO_HIGH 0x22 +#define SES_FC_PORT_BYPASS_SEQPROTO_ERR_COUNT_TOO_HIGH 0x23 +#define SES_FC_PORT_BYPASS_INVAL_XMIT_COUNT_TOO_HIGH 0x24 +#define SES_FC_PORT_BYPASS_CRC_ERR_COUNT_TOO_HIGH 0x25 + +#define SES_FC_PORT_BYPASS_ERR_COUNT_RESERVED_BEGIN 0x26 +#define SES_FC_PORT_BYPASS_ERR_COUNT_RESERVED_END 0x2F + +#define SES_FC_PORT_BYPASS_RESERVED_BEGIN 0x30 +#define SES_FC_PORT_BYPASS_RESERVED_END 0xBF + +#define SES_FC_PORT_BYPASS_VENDOR_SPECIFIC_BEGIN 0xC0 +#define SES_FC_PORT_BYPASS_VENDOR_SPECIFIC_END 0xFF + uint8_t port_req_hard_addr; + uint8_t n_port_id[3]; + uint8_t n_port_name[8]; +}; + +struct ses_elm_sas_device_phy { + uint8_t byte0; + /* + * uint8_t reserved0 : 1, + * uint8_t device_type : 3, + * uint8_t reserved1 : 4; + */ + + uint8_t reserved0; + + /* Bit positions for initiator and target port protocols */ +#define SES_SASOBJ_DEV_PHY_SMP 0x2 +#define SES_SASOBJ_DEV_PHY_STP 0x4 +#define SES_SASOBJ_DEV_PHY_SSP 0x8 + /* Select all of the above protocols */ +#define SES_SASOBJ_DEV_PHY_PROTOMASK 0xe + uint8_t initiator_ports; + /* + * uint8_t reserved0 : 4, + * uint8_t ssp : 1, + * uint8_t stp : 1, + * uint8_t smp : 1, + * uint8_t reserved1 : 3; + */ + uint8_t target_ports; + /* + * uint8_t sata_port_selector : 1, + * uint8_t reserved : 3, + * uint8_t ssp : 1, + * uint8_t stp : 1, + * uint8_t smp : 1, + * uint8_t sata_device : 1; + */ + uint8_t parent_addr[8]; /* SAS address of parent */ + uint8_t phy_addr[8]; /* SAS address of this phy */ + uint8_t phy_id; + uint8_t reserved1[7]; +}; +#ifdef _KERNEL +int ses_elm_sas_dev_phy_sata_dev(struct ses_elm_sas_device_phy *); +int ses_elm_sas_dev_phy_sata_port(struct ses_elm_sas_device_phy *); +int ses_elm_sas_dev_phy_dev_type(struct ses_elm_sas_device_phy *); +#endif /* _KERNEL */ + +struct ses_elm_sas_expander_phy { + uint8_t connector_index; + uint8_t other_index; +}; + +struct ses_elm_sas_port_phy { + uint8_t phy_id; + uint8_t reserved; + uint8_t connector_index; + uint8_t other_index; + uint8_t phy_addr[8]; +}; + +struct ses_elm_sas_type0_base_hdr { + uint8_t num_phys; + uint8_t byte1; + /* + * uint8_t descriptor_type : 2, + * uint8_t reserved : 5, + * uint8_t not_all_phys : 1; + */ +#define SES_SASOBJ_TYPE0_NOT_ALL_PHYS(obj) \ + ((obj)->byte1 & 0x1) +}; + +struct ses_elm_sas_type0_eip_hdr { + struct ses_elm_sas_type0_base_hdr base; + uint8_t reserved; + uint8_t dev_slot_num; +}; + +struct ses_elm_sas_type1_expander_hdr { + uint8_t num_phys; + uint8_t byte1; + /* + * uint8_t descriptor_type : 2, + * uint8_t reserved : 6; + */ + uint8_t reserved[2]; + uint8_t sas_addr[8]; +}; + +struct ses_elm_sas_type1_nonexpander_hdr { + uint8_t num_phys; + uint8_t byte1; + /* + * uint8_t descriptor_type : 2, + * uint8_t reserved : 6; + */ + uint8_t reserved[2]; +}; + +/* NB: This is only usable for as long as the headers happen to match */ +struct ses_elm_sas_base_hdr { + uint8_t num_phys; + uint8_t byte1; + /* + * uint8_t descriptor_type : 2, + * uint8_t descr_specific : 6; + */ +#define SES_SASOBJ_TYPE_SLOT 0 +#define SES_SASOBJ_TYPE_OTHER 1 +}; + +union ses_elm_sas_hdr { + struct ses_elm_sas_base_hdr base_hdr; + struct ses_elm_sas_type0_base_hdr type0_noneip; + struct ses_elm_sas_type0_eip_hdr type0_eip; + struct ses_elm_sas_type1_expander_hdr type1_exp; + struct ses_elm_sas_type1_nonexpander_hdr type1_nonexp; +}; +int ses_elm_sas_type0_not_all_phys(union ses_elm_sas_hdr *); +int ses_elm_sas_descr_type(union ses_elm_sas_hdr *); + +struct ses_elm_addlstatus_base_hdr { + uint8_t byte0; + /* + * uint8_t invalid : 1, + * uint8_t reserved : 2, + * uint8_t eip : 1, + * uint8_t proto_id : 4; + */ + uint8_t length; +}; +int ses_elm_addlstatus_proto(struct ses_elm_addlstatus_base_hdr *); +int ses_elm_addlstatus_eip(struct ses_elm_addlstatus_base_hdr *); +int ses_elm_addlstatus_invalid(struct ses_elm_addlstatus_base_hdr *); + +struct ses_elm_addlstatus_eip_hdr { + struct ses_elm_addlstatus_base_hdr base; + uint8_t reserved; + uint8_t element_index; + /* NB: This define (currently) applies to all eip=1 headers */ +#define SES_EIP_HDR_EXTRA_LEN 2 +}; + +union ses_elm_addlstatus_descr_hdr { + struct ses_elm_addlstatus_base_hdr base; + struct ses_elm_addlstatus_eip_hdr eip; +}; + +union ses_elm_addlstatus_proto_hdr { + union ses_elm_fc_hdr fc; + union ses_elm_sas_hdr sas; +}; + +/*============================= Namespace Cleanup ============================*/ +#undef GEN_HDR_ACCESSORS +#undef GEN_ACCESSORS +#undef GEN_HDR_SETTER +#undef GEN_HDR_GETTER +#undef GEN_SETTER +#undef GEN_GETTER +#undef MK_ENUM + +#endif /* _SCSI_SES_H_ */ diff --git a/sys/cam/scsi/scsi_sg.c b/sys/cam/scsi/scsi_sg.c index b8d2a4822e4..e8ccecdbf40 100644 --- a/sys/cam/scsi/scsi_sg.c +++ b/sys/cam/scsi/scsi_sg.c @@ -61,9 +61,8 @@ __FBSDID("$FreeBSD$"); #include typedef enum { - SG_FLAG_OPEN = 0x01, - SG_FLAG_LOCKED = 0x02, - SG_FLAG_INVALID = 0x04 + SG_FLAG_LOCKED = 0x01, + SG_FLAG_INVALID = 0x02 } sg_flags; typedef enum { @@ -141,7 +140,7 @@ PERIPHDRIVER_DECLARE(sg, sgdriver); static struct cdevsw sg_cdevsw = { .d_version = D_VERSION, - .d_flags = D_NEEDGIANT, + .d_flags = D_NEEDGIANT | D_TRACKCLOSE, .d_open = sgopen, .d_close = sgclose, .d_ioctl = sgioctl, @@ -415,19 +414,12 @@ sgopen(struct cdev *dev, int flags, int fmt, struct thread *td) softc = (struct sg_softc *)periph->softc; if (softc->flags & SG_FLAG_INVALID) { + cam_periph_release_locked(periph); cam_periph_unlock(periph); - cam_periph_release(periph); return (ENXIO); } - if ((softc->flags & SG_FLAG_OPEN) == 0) { - softc->flags |= SG_FLAG_OPEN; - cam_periph_unlock(periph); - } else { - /* Device closes aren't symmetrical, fix up the refcount. */ - cam_periph_unlock(periph); - cam_periph_release(periph); - } + cam_periph_unlock(periph); return (error); } @@ -436,18 +428,11 @@ static int sgclose(struct cdev *dev, int flag, int fmt, struct thread *td) { struct cam_periph *periph; - struct sg_softc *softc; periph = (struct cam_periph *)dev->si_drv1; if (periph == NULL) return (ENXIO); - cam_periph_lock(periph); - - softc = (struct sg_softc *)periph->softc; - softc->flags &= ~SG_FLAG_OPEN; - - cam_periph_unlock(periph); cam_periph_release(periph); return (0); diff --git a/sys/cam/scsi/scsi_target.c b/sys/cam/scsi/scsi_target.c index 65f2388ddb1..c45e8d5e4db 100644 --- a/sys/cam/scsi/scsi_target.c +++ b/sys/cam/scsi/scsi_target.c @@ -266,7 +266,6 @@ targioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *t break; case TARGIOCDEBUG: { -#ifdef CAMDEBUG struct ccb_debug cdbg; /* If no periph available, disallow debugging changes */ @@ -287,9 +286,6 @@ targioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *t xpt_action((union ccb *)&cdbg); cam_periph_unlock(softc->periph); status = cdbg.ccb_h.status & CAM_STATUS_MASK; -#else - status = CAM_FUNC_NOTAVAIL; -#endif break; } default: diff --git a/sys/cam/scsi/scsi_xpt.c b/sys/cam/scsi/scsi_xpt.c index ce721806f18..dcc76a18e38 100644 --- a/sys/cam/scsi/scsi_xpt.c +++ b/sys/cam/scsi/scsi_xpt.c @@ -141,6 +141,7 @@ typedef enum { PROBE_INQUIRY_BASIC_DV1, PROBE_INQUIRY_BASIC_DV2, PROBE_DV_EXIT, + PROBE_DONE, PROBE_INVALID } probe_action; @@ -157,6 +158,7 @@ static char *probe_action_text[] = { "PROBE_INQUIRY_BASIC_DV1", "PROBE_INQUIRY_BASIC_DV2", "PROBE_DV_EXIT", + "PROBE_DONE", "PROBE_INVALID" }; @@ -164,7 +166,7 @@ static char *probe_action_text[] = { do { \ char **text; \ text = probe_action_text; \ - CAM_DEBUG((softc)->periph->path, CAM_DEBUG_INFO, \ + CAM_DEBUG((softc)->periph->path, CAM_DEBUG_PROBE, \ ("Probe %s to %s\n", text[(softc)->action], \ text[(newaction)])); \ (softc)->action = (newaction); \ @@ -534,6 +536,10 @@ static struct scsi_quirk_entry scsi_quirk_table[] = { T_ENCLOSURE, SIP_MEDIA_FIXED, "DP", "BACKPLANE", "*" }, CAM_QUIRK_NOLUNS, /*mintags*/0, /*maxtags*/0 }, + { + { T_DIRECT, SIP_MEDIA_REMOVABLE, "Garmin", "*", "*" }, + CAM_QUIRK_NORPTLUNS, /*mintags*/2, /*maxtags*/255 + }, { /* Default tagged queuing parameters for all devices */ { @@ -638,7 +644,7 @@ proberegister(struct cam_periph *periph, void *arg) if (status != CAM_REQ_CMP) { return (status); } - + CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("Probe started\n")); /* * Ensure we've waited at least a bus settle @@ -741,7 +747,7 @@ again: case PROBE_DV_EXIT: { scsi_test_unit_ready(csio, - /*retries*/10, + /*retries*/4, probedone, MSG_SIMPLE_Q_TAG, SSD_FULL_SIZE, @@ -977,11 +983,8 @@ again: probedone(periph, start_ccb); return; } - case PROBE_INVALID: - CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_INFO, - ("probestart: invalid action state\n")); default: - break; + panic("probestart: invalid action state 0x%x\n", softc->action); } xpt_action(start_ccb); } @@ -1061,7 +1064,7 @@ proberequestbackoff(struct cam_periph *periph, struct cam_ed *device) } if (device->flags & CAM_DEV_DV_HIT_BOTTOM) { - CAM_DEBUG(periph->path, CAM_DEBUG_INFO, + CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("hit async: giving up on DV\n")); return (0); } @@ -1081,7 +1084,7 @@ proberequestbackoff(struct cam_periph *periph, struct cam_ed *device) if (spi->sync_period >= 0xf) { spi->sync_period = 0; spi->sync_offset = 0; - CAM_DEBUG(periph->path, CAM_DEBUG_INFO, + CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("setting to async for DV\n")); /* * Once we hit async, we don't want to try @@ -1089,7 +1092,7 @@ proberequestbackoff(struct cam_periph *periph, struct cam_ed *device) */ device->flags |= CAM_DEV_DV_HIT_BOTTOM; } else if (bootverbose) { - CAM_DEBUG(periph->path, CAM_DEBUG_INFO, + CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("DV: period 0x%x\n", spi->sync_period)); printf("setting period to 0x%x\n", spi->sync_period); } @@ -1099,7 +1102,7 @@ proberequestbackoff(struct cam_periph *periph, struct cam_ed *device) if ((cts.ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { break; } - CAM_DEBUG(periph->path, CAM_DEBUG_INFO, + CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("DV: failed to set period 0x%x\n", spi->sync_period)); if (spi->sync_period == 0) { return (0); @@ -1246,6 +1249,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb) if ((path->device->flags & CAM_DEV_UNCONFIGURED) == 0) /* Send the async notification. */ xpt_async(AC_LOST_DEVICE, path, NULL); + PROBE_SET_ACTION(softc, PROBE_INVALID); xpt_release_ccb(done_ccb); break; @@ -1279,8 +1283,9 @@ probedone(struct cam_periph *periph, union ccb *done_ccb) /* * Reallocate and retry to cover all luns */ - CAM_DEBUG_PATH_PRINT(CAM_DEBUG_PROBE, path, - ("reallocating REPORT_LUNS for %u luns\n", nlun)); + CAM_DEBUG(path, CAM_DEBUG_PROBE, + ("Probe: reallocating REPORT_LUNS for %u luns\n", + nlun)); free(lp, M_CAMXPT); path->target->rpl_size = (nlun << 3) + 8; xpt_release_ccb(done_ccb); @@ -1303,8 +1308,8 @@ probedone(struct cam_periph *periph, union ccb *done_ccb) lun_id_t lun; int idx; - CAM_DEBUG_PATH_PRINT(CAM_DEBUG_PROBE, path, - ("%u luns reported\n", nlun)); + CAM_DEBUG(path, CAM_DEBUG_PROBE, + ("Probe: %u lun(s) reported\n", nlun)); CAM_GET_SIMPLE_LUN(lp, 0, lun); /* @@ -1326,8 +1331,8 @@ probedone(struct cam_periph *periph, union ccb *done_ccb) lp->luns[idx].lundata, 8); memcpy(lp->luns[idx].lundata, tlun, 8); - CAM_DEBUG_PATH_PRINT(CAM_DEBUG_PROBE, - path, ("lun 0 in position %u\n", idx)); + CAM_DEBUG(path, CAM_DEBUG_PROBE, + ("lun 0 in position %u\n", idx)); } else { /* * There is no lun 0 in our list. Destroy @@ -1591,14 +1596,11 @@ probe_device_check: break; } case PROBE_TUR_FOR_NEGOTIATION: - if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { - DELAY(500000); - if (cam_periph_error(done_ccb, 0, SF_RETRY_UA, - NULL) == ERESTART) - return; - } - /* FALLTHROUGH */ case PROBE_DV_EXIT: + if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { + cam_periph_error(done_ccb, 0, + SF_NO_PRINT | SF_NO_RECOVERY | SF_NO_RETRY, NULL); + } if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { /* Don't wedge the queue */ xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, @@ -1612,7 +1614,7 @@ probe_device_check: && done_ccb->ccb_h.target_lun == 0 && (path->device->inq_data.flags & SID_Sync) != 0 && (path->device->flags & CAM_DEV_IN_DV) == 0) { - CAM_DEBUG(periph->path, CAM_DEBUG_INFO, + CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("Begin Domain Validation\n")); path->device->flags |= CAM_DEV_IN_DV; xpt_release_ccb(done_ccb); @@ -1621,7 +1623,7 @@ probe_device_check: return; } if (softc->action == PROBE_DV_EXIT) { - CAM_DEBUG(periph->path, CAM_DEBUG_INFO, + CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("Leave Domain Validation\n")); } if (path->device->flags & CAM_DEV_UNCONFIGURED) { @@ -1637,6 +1639,7 @@ probe_device_check: xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path, done_ccb); } + PROBE_SET_ACTION(softc, PROBE_DONE); xpt_release_ccb(done_ccb); break; case PROBE_INQUIRY_BASIC_DV1: @@ -1645,6 +1648,10 @@ probe_device_check: struct scsi_inquiry_data *nbuf; struct ccb_scsiio *csio; + if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { + cam_periph_error(done_ccb, 0, + SF_NO_PRINT | SF_NO_RECOVERY | SF_NO_RETRY, NULL); + } if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { /* Don't wedge the queue */ xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, @@ -1676,7 +1683,7 @@ probe_device_check: return; } if (softc->action == PROBE_INQUIRY_BASIC_DV2) { - CAM_DEBUG(periph->path, CAM_DEBUG_INFO, + CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("Leave Domain Validation Successfully\n")); } if (path->device->flags & CAM_DEV_UNCONFIGURED) { @@ -1692,23 +1699,22 @@ probe_device_check: xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path, done_ccb); } + PROBE_SET_ACTION(softc, PROBE_DONE); xpt_release_ccb(done_ccb); break; } - case PROBE_INVALID: - CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_INFO, - ("probedone: invalid action state\n")); default: - break; + panic("probedone: invalid action state 0x%x\n", softc->action); } done_ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs); TAILQ_REMOVE(&softc->request_ccbs, &done_ccb->ccb_h, periph_links.tqe); done_ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(done_ccb); if (TAILQ_FIRST(&softc->request_ccbs) == NULL) { + CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("Probe completed\n")); + cam_periph_invalidate(periph); cam_release_devq(periph->path, RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_XPT + 1, FALSE); - cam_periph_invalidate(periph); cam_periph_release_locked(periph); } else { probeschedule(periph); @@ -1918,7 +1924,7 @@ scsi_scan_bus(struct cam_periph *periph, union ccb *request_ccb) xpt_done(request_ccb); return; } - CAM_DEBUG_PATH_PRINT(CAM_DEBUG_PROBE, request_ccb->ccb_h.path, + CAM_DEBUG(request_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("SCAN start for %p\n", scan_info)); scan_info->request_ccb = request_ccb; scan_info->cpi = &work_ccb->cpi; @@ -2031,8 +2037,8 @@ scsi_scan_bus(struct cam_periph *periph, union ccb *request_ccb) CAM_GET_SIMPLE_LUN(target->luns, scan_info->lunindex[target_id], lun_id); next_target = 0; - CAM_DEBUG_PATH_PRINT(CAM_DEBUG_PROBE, - request_ccb->ccb_h.path, + CAM_DEBUG(request_ccb->ccb_h.path, + CAM_DEBUG_PROBE, ("next lun to try at index %u is %u\n", scan_info->lunindex[target_id], lun_id)); scan_info->lunindex[target_id]++; @@ -2139,8 +2145,8 @@ scsi_scan_bus(struct cam_periph *periph, union ccb *request_ccb) xpt_free_ccb(request_ccb); xpt_free_ccb((union ccb *)scan_info->cpi); request_ccb = scan_info->request_ccb; - CAM_DEBUG_PATH_PRINT(CAM_DEBUG_PROBE, - request_ccb->ccb_h.path, + CAM_DEBUG(request_ccb->ccb_h.path, + CAM_DEBUG_TRACE, ("SCAN done for %p\n", scan_info)); free(scan_info, M_CAMXPT); request_ccb->ccb_h.status = CAM_REQ_CMP; @@ -2274,11 +2280,16 @@ scsi_scan_lun(struct cam_periph *periph, struct cam_path *path, } if ((old_periph = cam_periph_find(path, "probe")) != NULL) { - probe_softc *softc; + if ((old_periph->flags & CAM_PERIPH_INVALID) == 0) { + probe_softc *softc; - softc = (probe_softc *)old_periph->softc; - TAILQ_INSERT_TAIL(&softc->request_ccbs, &request_ccb->ccb_h, - periph_links.tqe); + softc = (probe_softc *)old_periph->softc; + TAILQ_INSERT_TAIL(&softc->request_ccbs, + &request_ccb->ccb_h, periph_links.tqe); + } else { + request_ccb->ccb_h.status = CAM_REQ_CMP_ERR; + xpt_done(request_ccb); + } } else { status = cam_periph_alloc(proberegister, NULL, probecleanup, probestart, "probe", diff --git a/sys/cddl/boot/zfs/zfsimpl.h b/sys/cddl/boot/zfs/zfsimpl.h index 9f24cc02e48..af1579635ba 100644 --- a/sys/cddl/boot/zfs/zfsimpl.h +++ b/sys/cddl/boot/zfs/zfsimpl.h @@ -53,6 +53,8 @@ * Use is subject to license terms. */ +#define MAXNAMELEN 256 + /* CRC64 table */ #define ZFS_CRC64_POLY 0xC96C5795D7870F42ULL /* ECMA-182, reflected form */ @@ -508,6 +510,7 @@ typedef enum { #define SPA_VERSION_26 26ULL #define SPA_VERSION_27 27ULL #define SPA_VERSION_28 28ULL +#define SPA_VERSION_5000 5000ULL /* * When bumping up SPA_VERSION, make sure GRUB ZFS understands the on-disk @@ -515,8 +518,8 @@ typedef enum { * and do the appropriate changes. Also bump the version number in * usr/src/grub/capability. */ -#define SPA_VERSION SPA_VERSION_28 -#define SPA_VERSION_STRING "28" +#define SPA_VERSION SPA_VERSION_5000 +#define SPA_VERSION_STRING "5000" /* * Symbolic names for the changes that caused a SPA_VERSION switch. @@ -567,6 +570,12 @@ typedef enum { #define SPA_VERSION_DEADLISTS SPA_VERSION_26 #define SPA_VERSION_FAST_SNAP SPA_VERSION_27 #define SPA_VERSION_MULTI_REPLACE SPA_VERSION_28 +#define SPA_VERSION_BEFORE_FEATURES SPA_VERSION_28 +#define SPA_VERSION_FEATURES SPA_VERSION_5000 + +#define SPA_VERSION_IS_SUPPORTED(v) \ + (((v) >= SPA_VERSION_INITIAL && (v) <= SPA_VERSION_BEFORE_FEATURES) || \ + ((v) >= SPA_VERSION_FEATURES && (v) <= SPA_VERSION)) /* * The following are configuration names used in the nvlist describing a pool's @@ -602,6 +611,7 @@ typedef enum { #define ZPOOL_CONFIG_HOSTNAME "hostname" #define ZPOOL_CONFIG_IS_LOG "is_log" #define ZPOOL_CONFIG_TIMESTAMP "timestamp" /* not stored on disk */ +#define ZPOOL_CONFIG_FEATURES_FOR_READ "features_for_read" /* * The persistent vdev state is stored as separate values rather than a single @@ -1327,5 +1337,5 @@ typedef struct spa { struct uberblock spa_uberblock; /* best uberblock so far */ vdev_list_t spa_vdevs; /* list of all toplevel vdevs */ objset_phys_t spa_mos; /* MOS for this pool */ - objset_phys_t spa_root_objset; /* current mounted ZPL objset */ + int spa_inited; /* initialized */ } spa_t; diff --git a/sys/cddl/contrib/opensolaris/common/nvpair/fnvpair.c b/sys/cddl/contrib/opensolaris/common/nvpair/fnvpair.c new file mode 100644 index 00000000000..acef4cbc308 --- /dev/null +++ b/sys/cddl/contrib/opensolaris/common/nvpair/fnvpair.c @@ -0,0 +1,498 @@ + +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +#include +#ifndef _KERNEL +#include +#else +#include +#include +#endif + +/* + * "Force" nvlist wrapper. + * + * These functions wrap the nvlist_* functions with assertions that assume + * the operation is successful. This allows the caller's code to be much + * more readable, especially for the fnvlist_lookup_* and fnvpair_value_* + * functions, which can return the requested value (rather than filling in + * a pointer). + * + * These functions use NV_UNIQUE_NAME, encoding NV_ENCODE_NATIVE, and allocate + * with KM_SLEEP. + * + * More wrappers should be added as needed -- for example + * nvlist_lookup_*_array and nvpair_value_*_array. + */ + +nvlist_t * +fnvlist_alloc(void) +{ + nvlist_t *nvl; + VERIFY3U(nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_SLEEP), ==, 0); + return (nvl); +} + +void +fnvlist_free(nvlist_t *nvl) +{ + nvlist_free(nvl); +} + +size_t +fnvlist_size(nvlist_t *nvl) +{ + size_t size; + VERIFY3U(nvlist_size(nvl, &size, NV_ENCODE_NATIVE), ==, 0); + return (size); +} + +/* + * Returns allocated buffer of size *sizep. Caller must free the buffer with + * fnvlist_pack_free(). + */ +char * +fnvlist_pack(nvlist_t *nvl, size_t *sizep) +{ + char *packed = 0; + VERIFY3U(nvlist_pack(nvl, &packed, sizep, NV_ENCODE_NATIVE, + KM_SLEEP), ==, 0); + return (packed); +} + +/*ARGSUSED*/ +void +fnvlist_pack_free(char *pack, size_t size) +{ +#ifdef _KERNEL + kmem_free(pack, size); +#else + free(pack); +#endif +} + +nvlist_t * +fnvlist_unpack(char *buf, size_t buflen) +{ + nvlist_t *rv; + VERIFY3U(nvlist_unpack(buf, buflen, &rv, KM_SLEEP), ==, 0); + return (rv); +} + +nvlist_t * +fnvlist_dup(nvlist_t *nvl) +{ + nvlist_t *rv; + VERIFY3U(nvlist_dup(nvl, &rv, KM_SLEEP), ==, 0); + return (rv); +} + +void +fnvlist_merge(nvlist_t *dst, nvlist_t *src) +{ + VERIFY3U(nvlist_merge(dst, src, KM_SLEEP), ==, 0); +} + +void +fnvlist_add_boolean(nvlist_t *nvl, const char *name) +{ + VERIFY3U(nvlist_add_boolean(nvl, name), ==, 0); +} + +void +fnvlist_add_boolean_value(nvlist_t *nvl, const char *name, boolean_t val) +{ + VERIFY3U(nvlist_add_boolean_value(nvl, name, val), ==, 0); +} + +void +fnvlist_add_byte(nvlist_t *nvl, const char *name, uchar_t val) +{ + VERIFY3U(nvlist_add_byte(nvl, name, val), ==, 0); +} + +void +fnvlist_add_int8(nvlist_t *nvl, const char *name, int8_t val) +{ + VERIFY3U(nvlist_add_int8(nvl, name, val), ==, 0); +} + +void +fnvlist_add_uint8(nvlist_t *nvl, const char *name, uint8_t val) +{ + VERIFY3U(nvlist_add_uint8(nvl, name, val), ==, 0); +} + +void +fnvlist_add_int16(nvlist_t *nvl, const char *name, int16_t val) +{ + VERIFY3U(nvlist_add_int16(nvl, name, val), ==, 0); +} + +void +fnvlist_add_uint16(nvlist_t *nvl, const char *name, uint16_t val) +{ + VERIFY3U(nvlist_add_uint16(nvl, name, val), ==, 0); +} + +void +fnvlist_add_int32(nvlist_t *nvl, const char *name, int32_t val) +{ + VERIFY3U(nvlist_add_int32(nvl, name, val), ==, 0); +} + +void +fnvlist_add_uint32(nvlist_t *nvl, const char *name, uint32_t val) +{ + VERIFY3U(nvlist_add_uint32(nvl, name, val), ==, 0); +} + +void +fnvlist_add_int64(nvlist_t *nvl, const char *name, int64_t val) +{ + VERIFY3U(nvlist_add_int64(nvl, name, val), ==, 0); +} + +void +fnvlist_add_uint64(nvlist_t *nvl, const char *name, uint64_t val) +{ + VERIFY3U(nvlist_add_uint64(nvl, name, val), ==, 0); +} + +void +fnvlist_add_string(nvlist_t *nvl, const char *name, const char *val) +{ + VERIFY3U(nvlist_add_string(nvl, name, val), ==, 0); +} + +void +fnvlist_add_nvlist(nvlist_t *nvl, const char *name, nvlist_t *val) +{ + VERIFY3U(nvlist_add_nvlist(nvl, name, val), ==, 0); +} + +void +fnvlist_add_nvpair(nvlist_t *nvl, nvpair_t *pair) +{ + VERIFY3U(nvlist_add_nvpair(nvl, pair), ==, 0); +} + +void +fnvlist_add_boolean_array(nvlist_t *nvl, const char *name, + boolean_t *val, uint_t n) +{ + VERIFY3U(nvlist_add_boolean_array(nvl, name, val, n), ==, 0); +} + +void +fnvlist_add_byte_array(nvlist_t *nvl, const char *name, uchar_t *val, uint_t n) +{ + VERIFY3U(nvlist_add_byte_array(nvl, name, val, n), ==, 0); +} + +void +fnvlist_add_int8_array(nvlist_t *nvl, const char *name, int8_t *val, uint_t n) +{ + VERIFY3U(nvlist_add_int8_array(nvl, name, val, n), ==, 0); +} + +void +fnvlist_add_uint8_array(nvlist_t *nvl, const char *name, uint8_t *val, uint_t n) +{ + VERIFY3U(nvlist_add_uint8_array(nvl, name, val, n), ==, 0); +} + +void +fnvlist_add_int16_array(nvlist_t *nvl, const char *name, int16_t *val, uint_t n) +{ + VERIFY3U(nvlist_add_int16_array(nvl, name, val, n), ==, 0); +} + +void +fnvlist_add_uint16_array(nvlist_t *nvl, const char *name, + uint16_t *val, uint_t n) +{ + VERIFY3U(nvlist_add_uint16_array(nvl, name, val, n), ==, 0); +} + +void +fnvlist_add_int32_array(nvlist_t *nvl, const char *name, int32_t *val, uint_t n) +{ + VERIFY3U(nvlist_add_int32_array(nvl, name, val, n), ==, 0); +} + +void +fnvlist_add_uint32_array(nvlist_t *nvl, const char *name, + uint32_t *val, uint_t n) +{ + VERIFY3U(nvlist_add_uint32_array(nvl, name, val, n), ==, 0); +} + +void +fnvlist_add_int64_array(nvlist_t *nvl, const char *name, int64_t *val, uint_t n) +{ + VERIFY3U(nvlist_add_int64_array(nvl, name, val, n), ==, 0); +} + +void +fnvlist_add_uint64_array(nvlist_t *nvl, const char *name, + uint64_t *val, uint_t n) +{ + VERIFY3U(nvlist_add_uint64_array(nvl, name, val, n), ==, 0); +} + +void +fnvlist_add_string_array(nvlist_t *nvl, const char *name, + char * const *val, uint_t n) +{ + VERIFY3U(nvlist_add_string_array(nvl, name, val, n), ==, 0); +} + +void +fnvlist_add_nvlist_array(nvlist_t *nvl, const char *name, + nvlist_t **val, uint_t n) +{ + VERIFY3U(nvlist_add_nvlist_array(nvl, name, val, n), ==, 0); +} + +void +fnvlist_remove(nvlist_t *nvl, const char *name) +{ + VERIFY3U(nvlist_remove_all(nvl, name), ==, 0); +} + +void +fnvlist_remove_nvpair(nvlist_t *nvl, nvpair_t *pair) +{ + VERIFY3U(nvlist_remove_nvpair(nvl, pair), ==, 0); +} + +nvpair_t * +fnvlist_lookup_nvpair(nvlist_t *nvl, const char *name) +{ + nvpair_t *rv; + VERIFY3U(nvlist_lookup_nvpair(nvl, name, &rv), ==, 0); + return (rv); +} + +/* returns B_TRUE if the entry exists */ +boolean_t +fnvlist_lookup_boolean(nvlist_t *nvl, const char *name) +{ + return (nvlist_lookup_boolean(nvl, name) == 0); +} + +boolean_t +fnvlist_lookup_boolean_value(nvlist_t *nvl, const char *name) +{ + boolean_t rv; + VERIFY3U(nvlist_lookup_boolean_value(nvl, name, &rv), ==, 0); + return (rv); +} + +uchar_t +fnvlist_lookup_byte(nvlist_t *nvl, const char *name) +{ + uchar_t rv; + VERIFY3U(nvlist_lookup_byte(nvl, name, &rv), ==, 0); + return (rv); +} + +int8_t +fnvlist_lookup_int8(nvlist_t *nvl, const char *name) +{ + int8_t rv; + VERIFY3U(nvlist_lookup_int8(nvl, name, &rv), ==, 0); + return (rv); +} + +int16_t +fnvlist_lookup_int16(nvlist_t *nvl, const char *name) +{ + int16_t rv; + VERIFY3U(nvlist_lookup_int16(nvl, name, &rv), ==, 0); + return (rv); +} + +int32_t +fnvlist_lookup_int32(nvlist_t *nvl, const char *name) +{ + int32_t rv; + VERIFY3U(nvlist_lookup_int32(nvl, name, &rv), ==, 0); + return (rv); +} + +int64_t +fnvlist_lookup_int64(nvlist_t *nvl, const char *name) +{ + int64_t rv; + VERIFY3U(nvlist_lookup_int64(nvl, name, &rv), ==, 0); + return (rv); +} + +uint8_t +fnvlist_lookup_uint8_t(nvlist_t *nvl, const char *name) +{ + uint8_t rv; + VERIFY3U(nvlist_lookup_uint8(nvl, name, &rv), ==, 0); + return (rv); +} + +uint16_t +fnvlist_lookup_uint16(nvlist_t *nvl, const char *name) +{ + uint16_t rv; + VERIFY3U(nvlist_lookup_uint16(nvl, name, &rv), ==, 0); + return (rv); +} + +uint32_t +fnvlist_lookup_uint32(nvlist_t *nvl, const char *name) +{ + uint32_t rv; + VERIFY3U(nvlist_lookup_uint32(nvl, name, &rv), ==, 0); + return (rv); +} + +uint64_t +fnvlist_lookup_uint64(nvlist_t *nvl, const char *name) +{ + uint64_t rv; + VERIFY3U(nvlist_lookup_uint64(nvl, name, &rv), ==, 0); + return (rv); +} + +char * +fnvlist_lookup_string(nvlist_t *nvl, const char *name) +{ + char *rv; + VERIFY3U(nvlist_lookup_string(nvl, name, &rv), ==, 0); + return (rv); +} + +nvlist_t * +fnvlist_lookup_nvlist(nvlist_t *nvl, const char *name) +{ + nvlist_t *rv; + VERIFY3U(nvlist_lookup_nvlist(nvl, name, &rv), ==, 0); + return (rv); +} + +boolean_t +fnvpair_value_boolean_value(nvpair_t *nvp) +{ + boolean_t rv; + VERIFY3U(nvpair_value_boolean_value(nvp, &rv), ==, 0); + return (rv); +} + +uchar_t +fnvpair_value_byte(nvpair_t *nvp) +{ + uchar_t rv; + VERIFY3U(nvpair_value_byte(nvp, &rv), ==, 0); + return (rv); +} + +int8_t +fnvpair_value_int8(nvpair_t *nvp) +{ + int8_t rv; + VERIFY3U(nvpair_value_int8(nvp, &rv), ==, 0); + return (rv); +} + +int16_t +fnvpair_value_int16(nvpair_t *nvp) +{ + int16_t rv; + VERIFY3U(nvpair_value_int16(nvp, &rv), ==, 0); + return (rv); +} + +int32_t +fnvpair_value_int32(nvpair_t *nvp) +{ + int32_t rv; + VERIFY3U(nvpair_value_int32(nvp, &rv), ==, 0); + return (rv); +} + +int64_t +fnvpair_value_int64(nvpair_t *nvp) +{ + int64_t rv; + VERIFY3U(nvpair_value_int64(nvp, &rv), ==, 0); + return (rv); +} + +uint8_t +fnvpair_value_uint8_t(nvpair_t *nvp) +{ + uint8_t rv; + VERIFY3U(nvpair_value_uint8(nvp, &rv), ==, 0); + return (rv); +} + +uint16_t +fnvpair_value_uint16(nvpair_t *nvp) +{ + uint16_t rv; + VERIFY3U(nvpair_value_uint16(nvp, &rv), ==, 0); + return (rv); +} + +uint32_t +fnvpair_value_uint32(nvpair_t *nvp) +{ + uint32_t rv; + VERIFY3U(nvpair_value_uint32(nvp, &rv), ==, 0); + return (rv); +} + +uint64_t +fnvpair_value_uint64(nvpair_t *nvp) +{ + uint64_t rv; + VERIFY3U(nvpair_value_uint64(nvp, &rv), ==, 0); + return (rv); +} + +char * +fnvpair_value_string(nvpair_t *nvp) +{ + char *rv; + VERIFY3U(nvpair_value_string(nvp, &rv), ==, 0); + return (rv); +} + +nvlist_t * +fnvpair_value_nvlist(nvpair_t *nvp) +{ + nvlist_t *rv; + VERIFY3U(nvpair_value_nvlist(nvp, &rv), ==, 0); + return (rv); +} diff --git a/sys/cddl/contrib/opensolaris/common/zfs/zfeature_common.c b/sys/cddl/contrib/opensolaris/common/zfs/zfeature_common.c new file mode 100644 index 00000000000..6dadd99368b --- /dev/null +++ b/sys/cddl/contrib/opensolaris/common/zfs/zfeature_common.c @@ -0,0 +1,155 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +#ifdef _KERNEL +#include +#else +#include +#include +#endif +#include +#include +#include +#include "zfeature_common.h" + +/* + * Set to disable all feature checks while opening pools, allowing pools with + * unsupported features to be opened. Set for testing only. + */ +boolean_t zfeature_checks_disable = B_FALSE; + +zfeature_info_t spa_feature_table[SPA_FEATURES]; + +/* + * Valid characters for feature guids. This list is mainly for aesthetic + * purposes and could be expanded in the future. There are different allowed + * characters in the guids reverse dns portion (before the colon) and its + * short name (after the colon). + */ +static int +valid_char(char c, boolean_t after_colon) +{ + return ((c >= 'a' && c <= 'z') || + (c >= '0' && c <= '9') || + c == (after_colon ? '_' : '.')); +} + +/* + * Every feature guid must contain exactly one colon which separates a reverse + * dns organization name from the feature's "short" name (e.g. + * "com.company:feature_name"). + */ +boolean_t +zfeature_is_valid_guid(const char *name) +{ + int i; + boolean_t has_colon = B_FALSE; + + i = 0; + while (name[i] != '\0') { + char c = name[i++]; + if (c == ':') { + if (has_colon) + return (B_FALSE); + has_colon = B_TRUE; + continue; + } + if (!valid_char(c, has_colon)) + return (B_FALSE); + } + + return (has_colon); +} + +boolean_t +zfeature_is_supported(const char *guid) +{ + if (zfeature_checks_disable) + return (B_TRUE); + + return (0 == zfeature_lookup_guid(guid, NULL)); +} + +int +zfeature_lookup_guid(const char *guid, zfeature_info_t **res) +{ + for (int i = 0; i < SPA_FEATURES; i++) { + zfeature_info_t *feature = &spa_feature_table[i]; + if (strcmp(guid, feature->fi_guid) == 0) { + if (res != NULL) + *res = feature; + return (0); + } + } + + return (ENOENT); +} + +int +zfeature_lookup_name(const char *name, zfeature_info_t **res) +{ + for (int i = 0; i < SPA_FEATURES; i++) { + zfeature_info_t *feature = &spa_feature_table[i]; + if (strcmp(name, feature->fi_uname) == 0) { + if (res != NULL) + *res = feature; + return (0); + } + } + + return (ENOENT); +} + +static void +zfeature_register(int fid, const char *guid, const char *name, const char *desc, + boolean_t readonly, boolean_t mos, zfeature_info_t **deps) +{ + zfeature_info_t *feature = &spa_feature_table[fid]; + static zfeature_info_t *nodeps[] = { NULL }; + + ASSERT(name != NULL); + ASSERT(desc != NULL); + ASSERT(!readonly || !mos); + ASSERT3U(fid, <, SPA_FEATURES); + ASSERT(zfeature_is_valid_guid(guid)); + + if (deps == NULL) + deps = nodeps; + + feature->fi_guid = guid; + feature->fi_uname = name; + feature->fi_desc = desc; + feature->fi_can_readonly = readonly; + feature->fi_mos = mos; + feature->fi_depends = deps; +} + +void +zpool_feature_init(void) +{ + zfeature_register(SPA_FEATURE_ASYNC_DESTROY, + "com.delphix:async_destroy", "async_destroy", + "Destroy filesystems asynchronously.", B_TRUE, B_FALSE, NULL); +} diff --git a/sys/cddl/contrib/opensolaris/common/zfs/zfeature_common.h b/sys/cddl/contrib/opensolaris/common/zfs/zfeature_common.h new file mode 100644 index 00000000000..b57eb43a58e --- /dev/null +++ b/sys/cddl/contrib/opensolaris/common/zfs/zfeature_common.h @@ -0,0 +1,70 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +#ifndef _ZFEATURE_COMMON_H +#define _ZFEATURE_COMMON_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct zfeature_info; + +typedef struct zfeature_info { + const char *fi_uname; /* User-facing feature name */ + const char *fi_guid; /* On-disk feature identifier */ + const char *fi_desc; /* Feature description */ + boolean_t fi_can_readonly; /* Can open pool readonly w/o support? */ + boolean_t fi_mos; /* Is the feature necessary to read the MOS? */ + struct zfeature_info **fi_depends; /* array; null terminated */ +} zfeature_info_t; + +typedef int (zfeature_func_t)(zfeature_info_t *fi, void *arg); + +#define ZFS_FEATURE_DEBUG + +static enum spa_feature { + SPA_FEATURE_ASYNC_DESTROY, + SPA_FEATURES +} spa_feature_t; + +extern zfeature_info_t spa_feature_table[SPA_FEATURES]; + +extern boolean_t zfeature_is_valid_guid(const char *); + +extern boolean_t zfeature_is_supported(const char *); +extern int zfeature_lookup_guid(const char *, zfeature_info_t **res); +extern int zfeature_lookup_name(const char *, zfeature_info_t **res); + +extern void zpool_feature_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _ZFEATURE_COMMON_H */ diff --git a/sys/cddl/contrib/opensolaris/common/zfs/zpool_prop.c b/sys/cddl/contrib/opensolaris/common/zfs/zpool_prop.c index add5bfb3a0b..72db8793711 100644 --- a/sys/cddl/contrib/opensolaris/common/zfs/zpool_prop.c +++ b/sys/cddl/contrib/opensolaris/common/zfs/zpool_prop.c @@ -21,7 +21,7 @@ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -79,8 +79,12 @@ zpool_prop_init(void) ZFS_TYPE_POOL, "", "SIZE"); zprop_register_number(ZPOOL_PROP_FREE, "free", 0, PROP_READONLY, ZFS_TYPE_POOL, "", "FREE"); + zprop_register_number(ZPOOL_PROP_FREEING, "freeing", 0, PROP_READONLY, + ZFS_TYPE_POOL, "", "FREEING"); zprop_register_number(ZPOOL_PROP_ALLOCATED, "allocated", 0, PROP_READONLY, ZFS_TYPE_POOL, "", "ALLOC"); + zprop_register_number(ZPOOL_PROP_EXPANDSZ, "expandsize", 0, + PROP_READONLY, ZFS_TYPE_POOL, "", "EXPANDSZ"); zprop_register_number(ZPOOL_PROP_CAPACITY, "capacity", 0, PROP_READONLY, ZFS_TYPE_POOL, "", "CAP"); zprop_register_number(ZPOOL_PROP_GUID, "guid", 0, PROP_READONLY, @@ -164,6 +168,26 @@ zpool_prop_default_numeric(zpool_prop_t prop) return (zpool_prop_table[prop].pd_numdefault); } +/* + * Returns true if this is a valid feature@ property. + */ +boolean_t +zpool_prop_feature(const char *name) +{ + static const char *prefix = "feature@"; + return (strncmp(name, prefix, strlen(prefix)) == 0); +} + +/* + * Returns true if this is a valid unsupported@ property. + */ +boolean_t +zpool_prop_unsupported(const char *name) +{ + static const char *prefix = "unsupported@"; + return (strncmp(name, prefix, strlen(prefix)) == 0); +} + int zpool_prop_string_to_index(zpool_prop_t prop, const char *string, uint64_t *index) diff --git a/sys/cddl/contrib/opensolaris/uts/common/Makefile.files b/sys/cddl/contrib/opensolaris/uts/common/Makefile.files index 2ab1d7b8ea9..30d4f79f43e 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/Makefile.files +++ b/sys/cddl/contrib/opensolaris/uts/common/Makefile.files @@ -21,6 +21,7 @@ # # Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012 by Delphix. All rights reserved. # # # This Makefile defines all file modules for the directory uts/common @@ -31,6 +32,7 @@ ZFS_COMMON_OBJS += \ arc.o \ bplist.o \ bpobj.o \ + bptree.o \ dbuf.o \ ddt.o \ ddt_zap.o \ @@ -52,6 +54,7 @@ ZFS_COMMON_OBJS += \ dsl_deleg.o \ dsl_prop.o \ dsl_scan.o \ + zfeature.o \ gzip.o \ lzjb.o \ metaslab.o \ @@ -94,11 +97,12 @@ ZFS_COMMON_OBJS += \ zrlock.o ZFS_SHARED_OBJS += \ - zfs_namecheck.o \ - zfs_deleg.o \ - zfs_prop.o \ + zfeature_common.o \ zfs_comutil.o \ + zfs_deleg.o \ zfs_fletcher.o \ + zfs_namecheck.o \ + zfs_prop.o \ zpool_prop.o \ zprop_common.o diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c index 0e5cc4d579d..ed60dda39c1 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c +++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c @@ -157,7 +157,7 @@ dtrace_optval_t dtrace_dof_maxsize = (256 * 1024); size_t dtrace_global_maxsize = (16 * 1024); size_t dtrace_actions_max = (16 * 1024); size_t dtrace_retain_max = 1024; -dtrace_optval_t dtrace_helper_actions_max = 32; +dtrace_optval_t dtrace_helper_actions_max = 128; dtrace_optval_t dtrace_helper_providers_max = 32; dtrace_optval_t dtrace_dstate_defsize = (1 * 1024 * 1024); size_t dtrace_strsize_default = 256; @@ -1913,6 +1913,75 @@ dtrace_aggregate_lquantize(uint64_t *lquanta, uint64_t nval, uint64_t incr) lquanta[levels + 1] += incr; } +static int +dtrace_aggregate_llquantize_bucket(uint16_t factor, uint16_t low, + uint16_t high, uint16_t nsteps, int64_t value) +{ + int64_t this = 1, last, next; + int base = 1, order; + + ASSERT(factor <= nsteps); + ASSERT(nsteps % factor == 0); + + for (order = 0; order < low; order++) + this *= factor; + + /* + * If our value is less than our factor taken to the power of the + * low order of magnitude, it goes into the zeroth bucket. + */ + if (value < (last = this)) + return (0); + + for (this *= factor; order <= high; order++) { + int nbuckets = this > nsteps ? nsteps : this; + + if ((next = this * factor) < this) { + /* + * We should not generally get log/linear quantizations + * with a high magnitude that allows 64-bits to + * overflow, but we nonetheless protect against this + * by explicitly checking for overflow, and clamping + * our value accordingly. + */ + value = this - 1; + } + + if (value < this) { + /* + * If our value lies within this order of magnitude, + * determine its position by taking the offset within + * the order of magnitude, dividing by the bucket + * width, and adding to our (accumulated) base. + */ + return (base + (value - last) / (this / nbuckets)); + } + + base += nbuckets - (nbuckets / factor); + last = this; + this = next; + } + + /* + * Our value is greater than or equal to our factor taken to the + * power of one plus the high magnitude -- return the top bucket. + */ + return (base); +} + +static void +dtrace_aggregate_llquantize(uint64_t *llquanta, uint64_t nval, uint64_t incr) +{ + uint64_t arg = *llquanta++; + uint16_t factor = DTRACE_LLQUANTIZE_FACTOR(arg); + uint16_t low = DTRACE_LLQUANTIZE_LOW(arg); + uint16_t high = DTRACE_LLQUANTIZE_HIGH(arg); + uint16_t nsteps = DTRACE_LLQUANTIZE_NSTEP(arg); + + llquanta[dtrace_aggregate_llquantize_bucket(factor, + low, high, nsteps, nval)] += incr; +} + /*ARGSUSED*/ static void dtrace_aggregate_avg(uint64_t *data, uint64_t nval, uint64_t arg) @@ -9853,6 +9922,35 @@ dtrace_ecb_aggregation_create(dtrace_ecb_t *ecb, dtrace_actdesc_t *desc) break; } + case DTRACEAGG_LLQUANTIZE: { + uint16_t factor = DTRACE_LLQUANTIZE_FACTOR(desc->dtad_arg); + uint16_t low = DTRACE_LLQUANTIZE_LOW(desc->dtad_arg); + uint16_t high = DTRACE_LLQUANTIZE_HIGH(desc->dtad_arg); + uint16_t nsteps = DTRACE_LLQUANTIZE_NSTEP(desc->dtad_arg); + int64_t v; + + agg->dtag_initial = desc->dtad_arg; + agg->dtag_aggregate = dtrace_aggregate_llquantize; + + if (factor < 2 || low >= high || nsteps < factor) + goto err; + + /* + * Now check that the number of steps evenly divides a power + * of the factor. (This assures both integer bucket size and + * linearity within each magnitude.) + */ + for (v = factor; v < nsteps; v *= factor) + continue; + + if ((v % nsteps) || (nsteps % factor)) + goto err; + + size = (dtrace_aggregate_llquantize_bucket(factor, + low, high, nsteps, INT64_MAX) + 2) * sizeof (uint64_t); + break; + } + case DTRACEAGG_AVG: agg->dtag_aggregate = dtrace_aggregate_avg; size = sizeof (uint64_t) * 2; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c index cb813927163..9dd4e0757f6 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c @@ -2794,9 +2794,11 @@ arc_read_done(zio_t *zio) callback_list = hdr->b_acb; ASSERT(callback_list != NULL); if (BP_SHOULD_BYTESWAP(zio->io_bp) && zio->io_error == 0) { + dmu_object_byteswap_t bswap = + DMU_OT_BYTESWAP(BP_GET_TYPE(zio->io_bp)); arc_byteswap_func_t *func = BP_GET_LEVEL(zio->io_bp) > 0 ? byteswap_uint64_array : - dmu_ot[BP_GET_TYPE(zio->io_bp)].ot_byteswap; + dmu_ot_byteswap[bswap].ob_func; func(buf->b_data, hdr->b_size); } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/bptree.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/bptree.c new file mode 100644 index 00000000000..8c5a7d40ef3 --- /dev/null +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/bptree.c @@ -0,0 +1,224 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * A bptree is a queue of root block pointers from destroyed datasets. When a + * dataset is destroyed its root block pointer is put on the end of the pool's + * bptree queue so the dataset's blocks can be freed asynchronously by + * dsl_scan_sync. This allows the delete operation to finish without traversing + * all the dataset's blocks. + * + * Note that while bt_begin and bt_end are only ever incremented in this code + * they are effectively reset to 0 every time the entire bptree is freed because + * the bptree's object is destroyed and re-created. + */ + +struct bptree_args { + bptree_phys_t *ba_phys; /* data in bonus buffer, dirtied if freeing */ + boolean_t ba_free; /* true if freeing during traversal */ + + bptree_itor_t *ba_func; /* function to call for each blockpointer */ + void *ba_arg; /* caller supplied argument to ba_func */ + dmu_tx_t *ba_tx; /* caller supplied tx, NULL if not freeing */ +} bptree_args_t; + +uint64_t +bptree_alloc(objset_t *os, dmu_tx_t *tx) +{ + uint64_t obj; + dmu_buf_t *db; + bptree_phys_t *bt; + + obj = dmu_object_alloc(os, DMU_OTN_UINT64_METADATA, + SPA_MAXBLOCKSIZE, DMU_OTN_UINT64_METADATA, + sizeof (bptree_phys_t), tx); + + /* + * Bonus buffer contents are already initialized to 0, but for + * readability we make it explicit. + */ + VERIFY3U(0, ==, dmu_bonus_hold(os, obj, FTAG, &db)); + dmu_buf_will_dirty(db, tx); + bt = db->db_data; + bt->bt_begin = 0; + bt->bt_end = 0; + bt->bt_bytes = 0; + bt->bt_comp = 0; + bt->bt_uncomp = 0; + dmu_buf_rele(db, FTAG); + + return (obj); +} + +int +bptree_free(objset_t *os, uint64_t obj, dmu_tx_t *tx) +{ + dmu_buf_t *db; + bptree_phys_t *bt; + + VERIFY3U(0, ==, dmu_bonus_hold(os, obj, FTAG, &db)); + bt = db->db_data; + ASSERT3U(bt->bt_begin, ==, bt->bt_end); + ASSERT3U(bt->bt_bytes, ==, 0); + ASSERT3U(bt->bt_comp, ==, 0); + ASSERT3U(bt->bt_uncomp, ==, 0); + dmu_buf_rele(db, FTAG); + + return (dmu_object_free(os, obj, tx)); +} + +void +bptree_add(objset_t *os, uint64_t obj, blkptr_t *bp, uint64_t birth_txg, + uint64_t bytes, uint64_t comp, uint64_t uncomp, dmu_tx_t *tx) +{ + dmu_buf_t *db; + bptree_phys_t *bt; + bptree_entry_phys_t bte; + + /* + * bptree objects are in the pool mos, therefore they can only be + * modified in syncing context. Furthermore, this is only modified + * by the sync thread, so no locking is necessary. + */ + ASSERT(dmu_tx_is_syncing(tx)); + + VERIFY3U(0, ==, dmu_bonus_hold(os, obj, FTAG, &db)); + bt = db->db_data; + + bte.be_birth_txg = birth_txg; + bte.be_bp = *bp; + bzero(&bte.be_zb, sizeof (bte.be_zb)); + dmu_write(os, obj, bt->bt_end * sizeof (bte), sizeof (bte), &bte, tx); + + dmu_buf_will_dirty(db, tx); + bt->bt_end++; + bt->bt_bytes += bytes; + bt->bt_comp += comp; + bt->bt_uncomp += uncomp; + dmu_buf_rele(db, FTAG); +} + +/* ARGSUSED */ +static int +bptree_visit_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, arc_buf_t *pbuf, + const zbookmark_t *zb, const dnode_phys_t *dnp, void *arg) +{ + int err; + struct bptree_args *ba = arg; + + if (bp == NULL) + return (0); + + err = ba->ba_func(ba->ba_arg, bp, ba->ba_tx); + if (err == 0 && ba->ba_free) { + ba->ba_phys->bt_bytes -= bp_get_dsize_sync(spa, bp); + ba->ba_phys->bt_comp -= BP_GET_PSIZE(bp); + ba->ba_phys->bt_uncomp -= BP_GET_UCSIZE(bp); + } + return (err); +} + +int +bptree_iterate(objset_t *os, uint64_t obj, boolean_t free, bptree_itor_t func, + void *arg, dmu_tx_t *tx) +{ + int err; + uint64_t i; + dmu_buf_t *db; + struct bptree_args ba; + + ASSERT(!free || dmu_tx_is_syncing(tx)); + + err = dmu_bonus_hold(os, obj, FTAG, &db); + if (err != 0) + return (err); + + if (free) + dmu_buf_will_dirty(db, tx); + + ba.ba_phys = db->db_data; + ba.ba_free = free; + ba.ba_func = func; + ba.ba_arg = arg; + ba.ba_tx = tx; + + err = 0; + for (i = ba.ba_phys->bt_begin; i < ba.ba_phys->bt_end; i++) { + bptree_entry_phys_t bte; + + ASSERT(!free || i == ba.ba_phys->bt_begin); + + err = dmu_read(os, obj, i * sizeof (bte), sizeof (bte), + &bte, DMU_READ_NO_PREFETCH); + if (err != 0) + break; + + err = traverse_dataset_destroyed(os->os_spa, &bte.be_bp, + bte.be_birth_txg, &bte.be_zb, TRAVERSE_POST, + bptree_visit_cb, &ba); + if (free) { + ASSERT(err == 0 || err == ERESTART); + if (err != 0) { + /* save bookmark for future resume */ + ASSERT3U(bte.be_zb.zb_objset, ==, + ZB_DESTROYED_OBJSET); + ASSERT3U(bte.be_zb.zb_level, ==, 0); + dmu_write(os, obj, i * sizeof (bte), + sizeof (bte), &bte, tx); + break; + } else { + ba.ba_phys->bt_begin++; + (void) dmu_free_range(os, obj, + i * sizeof (bte), sizeof (bte), tx); + } + } + } + + ASSERT(!free || err != 0 || ba.ba_phys->bt_begin == ba.ba_phys->bt_end); + + /* if all blocks are free there should be no used space */ + if (ba.ba_phys->bt_begin == ba.ba_phys->bt_end) { + ASSERT3U(ba.ba_phys->bt_bytes, ==, 0); + ASSERT3U(ba.ba_phys->bt_comp, ==, 0); + ASSERT3U(ba.ba_phys->bt_uncomp, ==, 0); + } + + dmu_buf_rele(db, FTAG); + + return (err); +} diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c index dc9f4823bbf..b75ee44c6c2 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c @@ -21,6 +21,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -227,7 +228,7 @@ dbuf_is_metadata(dmu_buf_impl_t *db) boolean_t is_metadata; DB_DNODE_ENTER(db); - is_metadata = dmu_ot[DB_DNODE(db)->dn_type].ot_metadata; + is_metadata = DMU_OT_IS_METADATA(DB_DNODE(db)->dn_type); DB_DNODE_EXIT(db); return (is_metadata); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/ddt.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/ddt.c index 0edf62e89c0..ef3d0f4467f 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/ddt.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/ddt.c @@ -21,6 +21,7 @@ /* * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -1067,11 +1068,9 @@ ddt_sync_table(ddt_t *ddt, dmu_tx_t *tx, uint64_t txg) ASSERT(spa->spa_uberblock.ub_version >= SPA_VERSION_DEDUP); if (spa->spa_ddt_stat_object == 0) { - spa->spa_ddt_stat_object = zap_create(ddt->ddt_os, - DMU_OT_DDT_STATS, DMU_OT_NONE, 0, tx); - VERIFY(zap_add(ddt->ddt_os, DMU_POOL_DIRECTORY_OBJECT, - DMU_POOL_DDT_STATS, sizeof (uint64_t), 1, - &spa->spa_ddt_stat_object, tx) == 0); + spa->spa_ddt_stat_object = zap_create_link(ddt->ddt_os, + DMU_OT_DDT_STATS, DMU_POOL_DIRECTORY_OBJECT, + DMU_POOL_DDT_STATS, tx); } while ((dde = avl_destroy_nodes(&ddt->ddt_tree, &cookie)) != NULL) { diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c index f7d471fa3fc..2204e9d8bac 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -45,60 +46,73 @@ #endif const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = { - { byteswap_uint8_array, TRUE, "unallocated" }, - { zap_byteswap, TRUE, "object directory" }, - { byteswap_uint64_array, TRUE, "object array" }, - { byteswap_uint8_array, TRUE, "packed nvlist" }, - { byteswap_uint64_array, TRUE, "packed nvlist size" }, - { byteswap_uint64_array, TRUE, "bpobj" }, - { byteswap_uint64_array, TRUE, "bpobj header" }, - { byteswap_uint64_array, TRUE, "SPA space map header" }, - { byteswap_uint64_array, TRUE, "SPA space map" }, - { byteswap_uint64_array, TRUE, "ZIL intent log" }, - { dnode_buf_byteswap, TRUE, "DMU dnode" }, - { dmu_objset_byteswap, TRUE, "DMU objset" }, - { byteswap_uint64_array, TRUE, "DSL directory" }, - { zap_byteswap, TRUE, "DSL directory child map"}, - { zap_byteswap, TRUE, "DSL dataset snap map" }, - { zap_byteswap, TRUE, "DSL props" }, - { byteswap_uint64_array, TRUE, "DSL dataset" }, - { zfs_znode_byteswap, TRUE, "ZFS znode" }, - { zfs_oldacl_byteswap, TRUE, "ZFS V0 ACL" }, - { byteswap_uint8_array, FALSE, "ZFS plain file" }, - { zap_byteswap, TRUE, "ZFS directory" }, - { zap_byteswap, TRUE, "ZFS master node" }, - { zap_byteswap, TRUE, "ZFS delete queue" }, - { byteswap_uint8_array, FALSE, "zvol object" }, - { zap_byteswap, TRUE, "zvol prop" }, - { byteswap_uint8_array, FALSE, "other uint8[]" }, - { byteswap_uint64_array, FALSE, "other uint64[]" }, - { zap_byteswap, TRUE, "other ZAP" }, - { zap_byteswap, TRUE, "persistent error log" }, - { byteswap_uint8_array, TRUE, "SPA history" }, - { byteswap_uint64_array, TRUE, "SPA history offsets" }, - { zap_byteswap, TRUE, "Pool properties" }, - { zap_byteswap, TRUE, "DSL permissions" }, - { zfs_acl_byteswap, TRUE, "ZFS ACL" }, - { byteswap_uint8_array, TRUE, "ZFS SYSACL" }, - { byteswap_uint8_array, TRUE, "FUID table" }, - { byteswap_uint64_array, TRUE, "FUID table size" }, - { zap_byteswap, TRUE, "DSL dataset next clones"}, - { zap_byteswap, TRUE, "scan work queue" }, - { zap_byteswap, TRUE, "ZFS user/group used" }, - { zap_byteswap, TRUE, "ZFS user/group quota" }, - { zap_byteswap, TRUE, "snapshot refcount tags"}, - { zap_byteswap, TRUE, "DDT ZAP algorithm" }, - { zap_byteswap, TRUE, "DDT statistics" }, - { byteswap_uint8_array, TRUE, "System attributes" }, - { zap_byteswap, TRUE, "SA master node" }, - { zap_byteswap, TRUE, "SA attr registration" }, - { zap_byteswap, TRUE, "SA attr layouts" }, - { zap_byteswap, TRUE, "scan translations" }, - { byteswap_uint8_array, FALSE, "deduplicated block" }, - { zap_byteswap, TRUE, "DSL deadlist map" }, - { byteswap_uint64_array, TRUE, "DSL deadlist map hdr" }, - { zap_byteswap, TRUE, "DSL dir clones" }, - { byteswap_uint64_array, TRUE, "bpobj subobj" }, + { DMU_BSWAP_UINT8, TRUE, "unallocated" }, + { DMU_BSWAP_ZAP, TRUE, "object directory" }, + { DMU_BSWAP_UINT64, TRUE, "object array" }, + { DMU_BSWAP_UINT8, TRUE, "packed nvlist" }, + { DMU_BSWAP_UINT64, TRUE, "packed nvlist size" }, + { DMU_BSWAP_UINT64, TRUE, "bpobj" }, + { DMU_BSWAP_UINT64, TRUE, "bpobj header" }, + { DMU_BSWAP_UINT64, TRUE, "SPA space map header" }, + { DMU_BSWAP_UINT64, TRUE, "SPA space map" }, + { DMU_BSWAP_UINT64, TRUE, "ZIL intent log" }, + { DMU_BSWAP_DNODE, TRUE, "DMU dnode" }, + { DMU_BSWAP_OBJSET, TRUE, "DMU objset" }, + { DMU_BSWAP_UINT64, TRUE, "DSL directory" }, + { DMU_BSWAP_ZAP, TRUE, "DSL directory child map"}, + { DMU_BSWAP_ZAP, TRUE, "DSL dataset snap map" }, + { DMU_BSWAP_ZAP, TRUE, "DSL props" }, + { DMU_BSWAP_UINT64, TRUE, "DSL dataset" }, + { DMU_BSWAP_ZNODE, TRUE, "ZFS znode" }, + { DMU_BSWAP_OLDACL, TRUE, "ZFS V0 ACL" }, + { DMU_BSWAP_UINT8, FALSE, "ZFS plain file" }, + { DMU_BSWAP_ZAP, TRUE, "ZFS directory" }, + { DMU_BSWAP_ZAP, TRUE, "ZFS master node" }, + { DMU_BSWAP_ZAP, TRUE, "ZFS delete queue" }, + { DMU_BSWAP_UINT8, FALSE, "zvol object" }, + { DMU_BSWAP_ZAP, TRUE, "zvol prop" }, + { DMU_BSWAP_UINT8, FALSE, "other uint8[]" }, + { DMU_BSWAP_UINT64, FALSE, "other uint64[]" }, + { DMU_BSWAP_ZAP, TRUE, "other ZAP" }, + { DMU_BSWAP_ZAP, TRUE, "persistent error log" }, + { DMU_BSWAP_UINT8, TRUE, "SPA history" }, + { DMU_BSWAP_UINT64, TRUE, "SPA history offsets" }, + { DMU_BSWAP_ZAP, TRUE, "Pool properties" }, + { DMU_BSWAP_ZAP, TRUE, "DSL permissions" }, + { DMU_BSWAP_ACL, TRUE, "ZFS ACL" }, + { DMU_BSWAP_UINT8, TRUE, "ZFS SYSACL" }, + { DMU_BSWAP_UINT8, TRUE, "FUID table" }, + { DMU_BSWAP_UINT64, TRUE, "FUID table size" }, + { DMU_BSWAP_ZAP, TRUE, "DSL dataset next clones"}, + { DMU_BSWAP_ZAP, TRUE, "scan work queue" }, + { DMU_BSWAP_ZAP, TRUE, "ZFS user/group used" }, + { DMU_BSWAP_ZAP, TRUE, "ZFS user/group quota" }, + { DMU_BSWAP_ZAP, TRUE, "snapshot refcount tags"}, + { DMU_BSWAP_ZAP, TRUE, "DDT ZAP algorithm" }, + { DMU_BSWAP_ZAP, TRUE, "DDT statistics" }, + { DMU_BSWAP_UINT8, TRUE, "System attributes" }, + { DMU_BSWAP_ZAP, TRUE, "SA master node" }, + { DMU_BSWAP_ZAP, TRUE, "SA attr registration" }, + { DMU_BSWAP_ZAP, TRUE, "SA attr layouts" }, + { DMU_BSWAP_ZAP, TRUE, "scan translations" }, + { DMU_BSWAP_UINT8, FALSE, "deduplicated block" }, + { DMU_BSWAP_ZAP, TRUE, "DSL deadlist map" }, + { DMU_BSWAP_UINT64, TRUE, "DSL deadlist map hdr" }, + { DMU_BSWAP_ZAP, TRUE, "DSL dir clones" }, + { DMU_BSWAP_UINT64, TRUE, "bpobj subobj" } +}; + +const dmu_object_byteswap_info_t dmu_ot_byteswap[DMU_BSWAP_NUMFUNCS] = { + { byteswap_uint8_array, "uint8" }, + { byteswap_uint16_array, "uint16" }, + { byteswap_uint32_array, "uint32" }, + { byteswap_uint64_array, "uint64" }, + { zap_byteswap, "zap" }, + { dnode_buf_byteswap, "dnode" }, + { dmu_objset_byteswap, "objset" }, + { zfs_znode_byteswap, "znode" }, + { zfs_oldacl_byteswap, "oldacl" }, + { zfs_acl_byteswap, "acl" } }; int @@ -175,7 +189,7 @@ dmu_set_bonustype(dmu_buf_t *db_fake, dmu_object_type_t type, dmu_tx_t *tx) DB_DNODE_ENTER(db); dn = DB_DNODE(db); - if (type > DMU_OT_NUMTYPES) { + if (!DMU_OT_IS_VALID(type)) { error = EINVAL; } else if (dn->dn_bonus != db) { error = EINVAL; @@ -1513,7 +1527,7 @@ void dmu_write_policy(objset_t *os, dnode_t *dn, int level, int wp, zio_prop_t *zp) { dmu_object_type_t type = dn ? dn->dn_type : DMU_OT_OBJSET; - boolean_t ismd = (level > 0 || dmu_ot[type].ot_metadata || + boolean_t ismd = (level > 0 || DMU_OT_IS_METADATA(type) || (wp & WP_SPILL)); enum zio_checksum checksum = os->os_checksum; enum zio_compress compress = os->os_compress; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c index 5b99b303563..0b8cc6267b8 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c @@ -20,11 +20,10 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. - */ -/* * Copyright 2011 Nexenta Systems, Inc. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. + * Copyright (c) 2012, Martin Matuska . All rights reserved. */ #include @@ -54,38 +53,15 @@ int zfs_send_corrupt_data = B_FALSE; static char *dmu_recv_tag = "dmu_recv_tag"; -/* - * The list of data whose inclusion in a send stream can be pending from - * one call to backup_cb to another. Multiple calls to dump_free() and - * dump_freeobjects() can be aggregated into a single DRR_FREE or - * DRR_FREEOBJECTS replay record. - */ -typedef enum { - PENDING_NONE, - PENDING_FREE, - PENDING_FREEOBJECTS -} pendop_t; - -struct backuparg { - dmu_replay_record_t *drr; - kthread_t *td; - struct file *fp; - offset_t *off; - objset_t *os; - zio_cksum_t zc; - uint64_t toguid; - int err; - pendop_t pending_op; -}; - static int -dump_bytes(struct backuparg *ba, void *buf, int len) +dump_bytes(dmu_sendarg_t *dsp, void *buf, int len) { + dsl_dataset_t *ds = dsp->dsa_os->os_dsl_dataset; struct uio auio; struct iovec aiov; ASSERT3U(len % 8, ==, 0); - fletcher_4_incremental_native(buf, len, &ba->zc); + fletcher_4_incremental_native(buf, len, &dsp->dsa_zc); aiov.iov_base = buf; aiov.iov_len = len; auio.uio_iov = &aiov; @@ -94,24 +70,31 @@ dump_bytes(struct backuparg *ba, void *buf, int len) auio.uio_segflg = UIO_SYSSPACE; auio.uio_rw = UIO_WRITE; auio.uio_offset = (off_t)-1; - auio.uio_td = ba->td; + auio.uio_td = dsp->dsa_td; #ifdef _KERNEL - if (ba->fp->f_type == DTYPE_VNODE) + if (dsp->dsa_fp->f_type == DTYPE_VNODE) bwillwrite(); - ba->err = fo_write(ba->fp, &auio, ba->td->td_ucred, 0, ba->td); + dsp->dsa_err = fo_write(dsp->dsa_fp, &auio, dsp->dsa_td->td_ucred, 0, + dsp->dsa_td); #else fprintf(stderr, "%s: returning EOPNOTSUPP\n", __func__); - ba->err = EOPNOTSUPP; + dsp->dsa_err = EOPNOTSUPP; #endif - *ba->off += len; - return (ba->err); + mutex_enter(&ds->ds_sendstream_lock); + *dsp->dsa_off += len; + mutex_exit(&ds->ds_sendstream_lock); + + return (dsp->dsa_err); } static int -dump_free(struct backuparg *ba, uint64_t object, uint64_t offset, +dump_free(dmu_sendarg_t *dsp, uint64_t object, uint64_t offset, uint64_t length) { - struct drr_free *drrf = &(ba->drr->drr_u.drr_free); + struct drr_free *drrf = &(dsp->dsa_drr->drr_u.drr_free); + + if (length != -1ULL && offset + length < offset) + length = -1ULL; /* * If there is a pending op, but it's not PENDING_FREE, push it out, @@ -120,13 +103,15 @@ dump_free(struct backuparg *ba, uint64_t object, uint64_t offset, * other DRR_FREE records. DRR_FREEOBJECTS records can only be * aggregated with other DRR_FREEOBJECTS records. */ - if (ba->pending_op != PENDING_NONE && ba->pending_op != PENDING_FREE) { - if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)) != 0) + if (dsp->dsa_pending_op != PENDING_NONE && + dsp->dsa_pending_op != PENDING_FREE) { + if (dump_bytes(dsp, dsp->dsa_drr, + sizeof (dmu_replay_record_t)) != 0) return (EINTR); - ba->pending_op = PENDING_NONE; + dsp->dsa_pending_op = PENDING_NONE; } - if (ba->pending_op == PENDING_FREE) { + if (dsp->dsa_pending_op == PENDING_FREE) { /* * There should never be a PENDING_FREE if length is -1 * (because dump_dnode is the only place where this @@ -144,34 +129,35 @@ dump_free(struct backuparg *ba, uint64_t object, uint64_t offset, return (0); } else { /* not a continuation. Push out pending record */ - if (dump_bytes(ba, ba->drr, + if (dump_bytes(dsp, dsp->dsa_drr, sizeof (dmu_replay_record_t)) != 0) return (EINTR); - ba->pending_op = PENDING_NONE; + dsp->dsa_pending_op = PENDING_NONE; } } /* create a FREE record and make it pending */ - bzero(ba->drr, sizeof (dmu_replay_record_t)); - ba->drr->drr_type = DRR_FREE; + bzero(dsp->dsa_drr, sizeof (dmu_replay_record_t)); + dsp->dsa_drr->drr_type = DRR_FREE; drrf->drr_object = object; drrf->drr_offset = offset; drrf->drr_length = length; - drrf->drr_toguid = ba->toguid; + drrf->drr_toguid = dsp->dsa_toguid; if (length == -1ULL) { - if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)) != 0) + if (dump_bytes(dsp, dsp->dsa_drr, + sizeof (dmu_replay_record_t)) != 0) return (EINTR); } else { - ba->pending_op = PENDING_FREE; + dsp->dsa_pending_op = PENDING_FREE; } return (0); } static int -dump_data(struct backuparg *ba, dmu_object_type_t type, +dump_data(dmu_sendarg_t *dsp, dmu_object_type_t type, uint64_t object, uint64_t offset, int blksz, const blkptr_t *bp, void *data) { - struct drr_write *drrw = &(ba->drr->drr_u.drr_write); + struct drr_write *drrw = &(dsp->dsa_drr->drr_u.drr_write); /* @@ -180,19 +166,20 @@ dump_data(struct backuparg *ba, dmu_object_type_t type, * the stream, since aggregation can't be done across operations * of different types. */ - if (ba->pending_op != PENDING_NONE) { - if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)) != 0) + if (dsp->dsa_pending_op != PENDING_NONE) { + if (dump_bytes(dsp, dsp->dsa_drr, + sizeof (dmu_replay_record_t)) != 0) return (EINTR); - ba->pending_op = PENDING_NONE; + dsp->dsa_pending_op = PENDING_NONE; } /* write a DATA record */ - bzero(ba->drr, sizeof (dmu_replay_record_t)); - ba->drr->drr_type = DRR_WRITE; + bzero(dsp->dsa_drr, sizeof (dmu_replay_record_t)); + dsp->dsa_drr->drr_type = DRR_WRITE; drrw->drr_object = object; drrw->drr_type = type; drrw->drr_offset = offset; drrw->drr_length = blksz; - drrw->drr_toguid = ba->toguid; + drrw->drr_toguid = dsp->dsa_toguid; drrw->drr_checksumtype = BP_GET_CHECKSUM(bp); if (zio_checksum_table[drrw->drr_checksumtype].ci_dedup) drrw->drr_checksumflags |= DRR_CHECKSUM_DEDUP; @@ -201,42 +188,43 @@ dump_data(struct backuparg *ba, dmu_object_type_t type, DDK_SET_COMPRESS(&drrw->drr_key, BP_GET_COMPRESS(bp)); drrw->drr_key.ddk_cksum = bp->blk_cksum; - if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)) != 0) + if (dump_bytes(dsp, dsp->dsa_drr, sizeof (dmu_replay_record_t)) != 0) return (EINTR); - if (dump_bytes(ba, data, blksz) != 0) + if (dump_bytes(dsp, data, blksz) != 0) return (EINTR); return (0); } static int -dump_spill(struct backuparg *ba, uint64_t object, int blksz, void *data) +dump_spill(dmu_sendarg_t *dsp, uint64_t object, int blksz, void *data) { - struct drr_spill *drrs = &(ba->drr->drr_u.drr_spill); + struct drr_spill *drrs = &(dsp->dsa_drr->drr_u.drr_spill); - if (ba->pending_op != PENDING_NONE) { - if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)) != 0) + if (dsp->dsa_pending_op != PENDING_NONE) { + if (dump_bytes(dsp, dsp->dsa_drr, + sizeof (dmu_replay_record_t)) != 0) return (EINTR); - ba->pending_op = PENDING_NONE; + dsp->dsa_pending_op = PENDING_NONE; } /* write a SPILL record */ - bzero(ba->drr, sizeof (dmu_replay_record_t)); - ba->drr->drr_type = DRR_SPILL; + bzero(dsp->dsa_drr, sizeof (dmu_replay_record_t)); + dsp->dsa_drr->drr_type = DRR_SPILL; drrs->drr_object = object; drrs->drr_length = blksz; - drrs->drr_toguid = ba->toguid; + drrs->drr_toguid = dsp->dsa_toguid; - if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t))) + if (dump_bytes(dsp, dsp->dsa_drr, sizeof (dmu_replay_record_t))) return (EINTR); - if (dump_bytes(ba, data, blksz)) + if (dump_bytes(dsp, data, blksz)) return (EINTR); return (0); } static int -dump_freeobjects(struct backuparg *ba, uint64_t firstobj, uint64_t numobjs) +dump_freeobjects(dmu_sendarg_t *dsp, uint64_t firstobj, uint64_t numobjs) { - struct drr_freeobjects *drrfo = &(ba->drr->drr_u.drr_freeobjects); + struct drr_freeobjects *drrfo = &(dsp->dsa_drr->drr_u.drr_freeobjects); /* * If there is a pending op, but it's not PENDING_FREEOBJECTS, @@ -245,13 +233,14 @@ dump_freeobjects(struct backuparg *ba, uint64_t firstobj, uint64_t numobjs) * aggregated with other DRR_FREE records. DRR_FREEOBJECTS records * can only be aggregated with other DRR_FREEOBJECTS records. */ - if (ba->pending_op != PENDING_NONE && - ba->pending_op != PENDING_FREEOBJECTS) { - if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)) != 0) + if (dsp->dsa_pending_op != PENDING_NONE && + dsp->dsa_pending_op != PENDING_FREEOBJECTS) { + if (dump_bytes(dsp, dsp->dsa_drr, + sizeof (dmu_replay_record_t)) != 0) return (EINTR); - ba->pending_op = PENDING_NONE; + dsp->dsa_pending_op = PENDING_NONE; } - if (ba->pending_op == PENDING_FREEOBJECTS) { + if (dsp->dsa_pending_op == PENDING_FREEOBJECTS) { /* * See whether this free object array can be aggregated * with pending one @@ -261,42 +250,43 @@ dump_freeobjects(struct backuparg *ba, uint64_t firstobj, uint64_t numobjs) return (0); } else { /* can't be aggregated. Push out pending record */ - if (dump_bytes(ba, ba->drr, + if (dump_bytes(dsp, dsp->dsa_drr, sizeof (dmu_replay_record_t)) != 0) return (EINTR); - ba->pending_op = PENDING_NONE; + dsp->dsa_pending_op = PENDING_NONE; } } /* write a FREEOBJECTS record */ - bzero(ba->drr, sizeof (dmu_replay_record_t)); - ba->drr->drr_type = DRR_FREEOBJECTS; + bzero(dsp->dsa_drr, sizeof (dmu_replay_record_t)); + dsp->dsa_drr->drr_type = DRR_FREEOBJECTS; drrfo->drr_firstobj = firstobj; drrfo->drr_numobjs = numobjs; - drrfo->drr_toguid = ba->toguid; + drrfo->drr_toguid = dsp->dsa_toguid; - ba->pending_op = PENDING_FREEOBJECTS; + dsp->dsa_pending_op = PENDING_FREEOBJECTS; return (0); } static int -dump_dnode(struct backuparg *ba, uint64_t object, dnode_phys_t *dnp) +dump_dnode(dmu_sendarg_t *dsp, uint64_t object, dnode_phys_t *dnp) { - struct drr_object *drro = &(ba->drr->drr_u.drr_object); + struct drr_object *drro = &(dsp->dsa_drr->drr_u.drr_object); if (dnp == NULL || dnp->dn_type == DMU_OT_NONE) - return (dump_freeobjects(ba, object, 1)); + return (dump_freeobjects(dsp, object, 1)); - if (ba->pending_op != PENDING_NONE) { - if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)) != 0) + if (dsp->dsa_pending_op != PENDING_NONE) { + if (dump_bytes(dsp, dsp->dsa_drr, + sizeof (dmu_replay_record_t)) != 0) return (EINTR); - ba->pending_op = PENDING_NONE; + dsp->dsa_pending_op = PENDING_NONE; } /* write an OBJECT record */ - bzero(ba->drr, sizeof (dmu_replay_record_t)); - ba->drr->drr_type = DRR_OBJECT; + bzero(dsp->dsa_drr, sizeof (dmu_replay_record_t)); + dsp->dsa_drr->drr_type = DRR_OBJECT; drro->drr_object = object; drro->drr_type = dnp->dn_type; drro->drr_bonustype = dnp->dn_bonustype; @@ -304,19 +294,19 @@ dump_dnode(struct backuparg *ba, uint64_t object, dnode_phys_t *dnp) drro->drr_bonuslen = dnp->dn_bonuslen; drro->drr_checksumtype = dnp->dn_checksum; drro->drr_compress = dnp->dn_compress; - drro->drr_toguid = ba->toguid; + drro->drr_toguid = dsp->dsa_toguid; - if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)) != 0) + if (dump_bytes(dsp, dsp->dsa_drr, sizeof (dmu_replay_record_t)) != 0) return (EINTR); - if (dump_bytes(ba, DN_BONUS(dnp), P2ROUNDUP(dnp->dn_bonuslen, 8)) != 0) + if (dump_bytes(dsp, DN_BONUS(dnp), P2ROUNDUP(dnp->dn_bonuslen, 8)) != 0) return (EINTR); /* free anything past the end of the file */ - if (dump_free(ba, object, (dnp->dn_maxblkid + 1) * + if (dump_free(dsp, object, (dnp->dn_maxblkid + 1) * (dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT), -1ULL)) return (EINTR); - if (ba->err) + if (dsp->dsa_err) return (EINTR); return (0); } @@ -330,7 +320,7 @@ static int backup_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, arc_buf_t *pbuf, const zbookmark_t *zb, const dnode_phys_t *dnp, void *arg) { - struct backuparg *ba = arg; + dmu_sendarg_t *dsp = arg; dmu_object_type_t type = bp ? BP_GET_TYPE(bp) : DMU_OT_NONE; int err = 0; @@ -343,10 +333,10 @@ backup_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, arc_buf_t *pbuf, } else if (bp == NULL && zb->zb_object == DMU_META_DNODE_OBJECT) { uint64_t span = BP_SPAN(dnp, zb->zb_level); uint64_t dnobj = (zb->zb_blkid * span) >> DNODE_SHIFT; - err = dump_freeobjects(ba, dnobj, span >> DNODE_SHIFT); + err = dump_freeobjects(dsp, dnobj, span >> DNODE_SHIFT); } else if (bp == NULL) { uint64_t span = BP_SPAN(dnp, zb->zb_level); - err = dump_free(ba, zb->zb_object, zb->zb_blkid * span, span); + err = dump_free(dsp, zb->zb_object, zb->zb_blkid * span, span); } else if (zb->zb_level > 0 || type == DMU_OT_OBJSET) { return (0); } else if (type == DMU_OT_DNODE) { @@ -365,7 +355,7 @@ backup_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, arc_buf_t *pbuf, for (i = 0; i < blksz >> DNODE_SHIFT; i++) { uint64_t dnobj = (zb->zb_blkid << (DNODE_BLOCK_SHIFT - DNODE_SHIFT)) + i; - err = dump_dnode(ba, dnobj, blk+i); + err = dump_dnode(dsp, dnobj, blk+i); if (err) break; } @@ -380,7 +370,7 @@ backup_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, arc_buf_t *pbuf, ZIO_FLAG_CANFAIL, &aflags, zb) != 0) return (EIO); - err = dump_spill(ba, zb->zb_object, blksz, abuf->b_data); + err = dump_spill(dsp, zb->zb_object, blksz, abuf->b_data); (void) arc_buf_remove_ref(abuf, &abuf); } else { /* it's a level-0 block of a regular object */ uint32_t aflags = ARC_WAIT; @@ -404,7 +394,7 @@ backup_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, arc_buf_t *pbuf, } } - err = dump_data(ba, type, zb->zb_object, zb->zb_blkid * blksz, + err = dump_data(dsp, type, zb->zb_object, zb->zb_blkid * blksz, blksz, bp, abuf->b_data); (void) arc_buf_remove_ref(abuf, &abuf); } @@ -414,13 +404,13 @@ backup_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, arc_buf_t *pbuf, } int -dmu_sendbackup(objset_t *tosnap, objset_t *fromsnap, boolean_t fromorigin, - struct file *fp, offset_t *off) +dmu_send(objset_t *tosnap, objset_t *fromsnap, boolean_t fromorigin, + int outfd, struct file *fp, offset_t *off) { dsl_dataset_t *ds = tosnap->os_dsl_dataset; dsl_dataset_t *fromds = fromsnap ? fromsnap->os_dsl_dataset : NULL; dmu_replay_record_t *drr; - struct backuparg ba; + dmu_sendarg_t *dsp; int err; uint64_t fromtxg = 0; @@ -461,8 +451,10 @@ dmu_sendbackup(objset_t *tosnap, objset_t *fromsnap, boolean_t fromorigin, #ifdef _KERNEL if (dmu_objset_type(tosnap) == DMU_OST_ZFS) { uint64_t version; - if (zfs_get_zplprop(tosnap, ZFS_PROP_VERSION, &version) != 0) + if (zfs_get_zplprop(tosnap, ZFS_PROP_VERSION, &version) != 0) { + kmem_free(drr, sizeof (dmu_replay_record_t)); return (EINVAL); + } if (version == ZPL_VERSION_SA) { DMU_SET_FEATUREFLAGS( drr->drr_u.drr_begin.drr_versioninfo, @@ -489,47 +481,60 @@ dmu_sendbackup(objset_t *tosnap, objset_t *fromsnap, boolean_t fromorigin, if (fromorigin) dsl_dataset_rele(fromds, FTAG); - ba.drr = drr; - ba.td = curthread; - ba.fp = fp; - ba.os = tosnap; - ba.off = off; - ba.toguid = ds->ds_phys->ds_guid; - ZIO_SET_CHECKSUM(&ba.zc, 0, 0, 0, 0); - ba.pending_op = PENDING_NONE; + dsp = kmem_zalloc(sizeof (dmu_sendarg_t), KM_SLEEP); - if (dump_bytes(&ba, drr, sizeof (dmu_replay_record_t)) != 0) { - kmem_free(drr, sizeof (dmu_replay_record_t)); - return (ba.err); + dsp->dsa_drr = drr; + dsp->dsa_outfd = outfd; + dsp->dsa_proc = curproc; + dsp->dsa_td = curthread; + dsp->dsa_fp = fp; + dsp->dsa_os = tosnap; + dsp->dsa_off = off; + dsp->dsa_toguid = ds->ds_phys->ds_guid; + ZIO_SET_CHECKSUM(&dsp->dsa_zc, 0, 0, 0, 0); + dsp->dsa_pending_op = PENDING_NONE; + + mutex_enter(&ds->ds_sendstream_lock); + list_insert_head(&ds->ds_sendstreams, dsp); + mutex_exit(&ds->ds_sendstream_lock); + + if (dump_bytes(dsp, drr, sizeof (dmu_replay_record_t)) != 0) { + err = dsp->dsa_err; + goto out; } err = traverse_dataset(ds, fromtxg, TRAVERSE_PRE | TRAVERSE_PREFETCH, - backup_cb, &ba); + backup_cb, dsp); - if (ba.pending_op != PENDING_NONE) - if (dump_bytes(&ba, drr, sizeof (dmu_replay_record_t)) != 0) + if (dsp->dsa_pending_op != PENDING_NONE) + if (dump_bytes(dsp, drr, sizeof (dmu_replay_record_t)) != 0) err = EINTR; if (err) { - if (err == EINTR && ba.err) - err = ba.err; - kmem_free(drr, sizeof (dmu_replay_record_t)); - return (err); + if (err == EINTR && dsp->dsa_err) + err = dsp->dsa_err; + goto out; } bzero(drr, sizeof (dmu_replay_record_t)); drr->drr_type = DRR_END; - drr->drr_u.drr_end.drr_checksum = ba.zc; - drr->drr_u.drr_end.drr_toguid = ba.toguid; + drr->drr_u.drr_end.drr_checksum = dsp->dsa_zc; + drr->drr_u.drr_end.drr_toguid = dsp->dsa_toguid; - if (dump_bytes(&ba, drr, sizeof (dmu_replay_record_t)) != 0) { - kmem_free(drr, sizeof (dmu_replay_record_t)); - return (ba.err); + if (dump_bytes(dsp, drr, sizeof (dmu_replay_record_t)) != 0) { + err = dsp->dsa_err; + goto out; } - kmem_free(drr, sizeof (dmu_replay_record_t)); +out: + mutex_enter(&ds->ds_sendstream_lock); + list_remove(&ds->ds_sendstreams, dsp); + mutex_exit(&ds->ds_sendstream_lock); - return (0); + kmem_free(drr, sizeof (dmu_replay_record_t)); + kmem_free(dsp, sizeof (dmu_sendarg_t)); + + return (err); } int @@ -1112,8 +1117,8 @@ restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro) void *data = NULL; if (drro->drr_type == DMU_OT_NONE || - drro->drr_type >= DMU_OT_NUMTYPES || - drro->drr_bonustype >= DMU_OT_NUMTYPES || + !DMU_OT_IS_VALID(drro->drr_type) || + !DMU_OT_IS_VALID(drro->drr_bonustype) || drro->drr_checksumtype >= ZIO_CHECKSUM_FUNCTIONS || drro->drr_compress >= ZIO_COMPRESS_FUNCTIONS || P2PHASE(drro->drr_blksz, SPA_MINBLOCKSIZE) || @@ -1178,7 +1183,9 @@ restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro) ASSERT3U(db->db_size, >=, drro->drr_bonuslen); bcopy(data, db->db_data, drro->drr_bonuslen); if (ra->byteswap) { - dmu_ot[drro->drr_bonustype].ot_byteswap(db->db_data, + dmu_object_byteswap_t byteswap = + DMU_OT_BYTESWAP(drro->drr_bonustype); + dmu_ot_byteswap[byteswap].ob_func(db->db_data, drro->drr_bonuslen); } dmu_buf_rele(db, FTAG); @@ -1221,7 +1228,7 @@ restore_write(struct restorearg *ra, objset_t *os, int err; if (drrw->drr_offset + drrw->drr_length < drrw->drr_offset || - drrw->drr_type >= DMU_OT_NUMTYPES) + !DMU_OT_IS_VALID(drrw->drr_type)) return (EINVAL); data = restore_read(ra, drrw->drr_length); @@ -1240,8 +1247,11 @@ restore_write(struct restorearg *ra, objset_t *os, dmu_tx_abort(tx); return (err); } - if (ra->byteswap) - dmu_ot[drrw->drr_type].ot_byteswap(data, drrw->drr_length); + if (ra->byteswap) { + dmu_object_byteswap_t byteswap = + DMU_OT_BYTESWAP(drrw->drr_type); + dmu_ot_byteswap[byteswap].ob_func(data, drrw->drr_length); + } dmu_write(os, drrw->drr_object, drrw->drr_offset, drrw->drr_length, data, tx); dmu_tx_commit(tx); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c index 023f90e12e3..bfe9e650642 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -53,6 +54,7 @@ typedef struct traverse_data { uint64_t td_objset; blkptr_t *td_rootbp; uint64_t td_min_txg; + zbookmark_t *td_resume; int td_flags; prefetch_data_t *td_pfd; blkptr_cb_t *td_func; @@ -128,6 +130,54 @@ traverse_zil(traverse_data_t *td, zil_header_t *zh) zil_free(zilog); } +typedef enum resume_skip { + RESUME_SKIP_ALL, + RESUME_SKIP_NONE, + RESUME_SKIP_CHILDREN +} resume_skip_t; + +/* + * Returns RESUME_SKIP_ALL if td indicates that we are resuming a traversal and + * the block indicated by zb does not need to be visited at all. Returns + * RESUME_SKIP_CHILDREN if we are resuming a post traversal and we reach the + * resume point. This indicates that this block should be visited but not its + * children (since they must have been visited in a previous traversal). + * Otherwise returns RESUME_SKIP_NONE. + */ +static resume_skip_t +resume_skip_check(traverse_data_t *td, const dnode_phys_t *dnp, + const zbookmark_t *zb) +{ + if (td->td_resume != NULL && !ZB_IS_ZERO(td->td_resume)) { + /* + * If we already visited this bp & everything below, + * don't bother doing it again. + */ + if (zbookmark_is_before(dnp, zb, td->td_resume)) + return (RESUME_SKIP_ALL); + + /* + * If we found the block we're trying to resume from, zero + * the bookmark out to indicate that we have resumed. + */ + ASSERT3U(zb->zb_object, <=, td->td_resume->zb_object); + if (bcmp(zb, td->td_resume, sizeof (*zb)) == 0) { + bzero(td->td_resume, sizeof (*zb)); + if (td->td_flags & TRAVERSE_POST) + return (RESUME_SKIP_CHILDREN); + } + } + return (RESUME_SKIP_NONE); +} + +static void +traverse_pause(traverse_data_t *td, const zbookmark_t *zb) +{ + ASSERT(td->td_resume != NULL); + ASSERT3U(zb->zb_level, ==, 0); + bcopy(zb, td->td_resume, sizeof (*td->td_resume)); +} + static int traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp, arc_buf_t *pbuf, blkptr_t *bp, const zbookmark_t *zb) @@ -137,8 +187,20 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp, arc_buf_t *buf = NULL; prefetch_data_t *pd = td->td_pfd; boolean_t hard = td->td_flags & TRAVERSE_HARD; + boolean_t pause = B_FALSE; - if (bp->blk_birth == 0) { + switch (resume_skip_check(td, dnp, zb)) { + case RESUME_SKIP_ALL: + return (0); + case RESUME_SKIP_CHILDREN: + goto post; + case RESUME_SKIP_NONE: + break; + default: + ASSERT(0); + } + + if (BP_IS_HOLE(bp)) { err = td->td_func(td->td_spa, NULL, NULL, pbuf, zb, dnp, td->td_arg); return (err); @@ -164,8 +226,10 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp, td->td_arg); if (err == TRAVERSE_VISIT_NO_CHILDREN) return (0); - if (err) - return (err); + if (err == ERESTART) + pause = B_TRUE; /* handle pausing at a common point */ + if (err != 0) + goto post; } if (BP_GET_LEVEL(bp) > 0) { @@ -253,9 +317,18 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp, if (buf) (void) arc_buf_remove_ref(buf, &buf); +post: if (err == 0 && lasterr == 0 && (td->td_flags & TRAVERSE_POST)) { err = td->td_func(td->td_spa, NULL, bp, pbuf, zb, dnp, td->td_arg); + if (err == ERESTART) + pause = B_TRUE; + } + + if (pause && td->td_resume != NULL) { + ASSERT3U(err, ==, ERESTART); + ASSERT(!hard); + traverse_pause(td, zb); } return (err != 0 ? err : lasterr); @@ -353,18 +426,23 @@ traverse_prefetch_thread(void *arg) * in syncing context). */ static int -traverse_impl(spa_t *spa, dsl_dataset_t *ds, blkptr_t *rootbp, - uint64_t txg_start, int flags, blkptr_cb_t func, void *arg) +traverse_impl(spa_t *spa, dsl_dataset_t *ds, uint64_t objset, blkptr_t *rootbp, + uint64_t txg_start, zbookmark_t *resume, int flags, + blkptr_cb_t func, void *arg) { traverse_data_t td; prefetch_data_t pd = { 0 }; zbookmark_t czb; int err; + ASSERT(ds == NULL || objset == ds->ds_object); + ASSERT(!(flags & TRAVERSE_PRE) || !(flags & TRAVERSE_POST)); + td.td_spa = spa; - td.td_objset = ds ? ds->ds_object : 0; + td.td_objset = objset; td.td_rootbp = rootbp; td.td_min_txg = txg_start; + td.td_resume = resume; td.td_func = func; td.td_arg = arg; td.td_pfd = &pd; @@ -416,8 +494,17 @@ int traverse_dataset(dsl_dataset_t *ds, uint64_t txg_start, int flags, blkptr_cb_t func, void *arg) { - return (traverse_impl(ds->ds_dir->dd_pool->dp_spa, ds, - &ds->ds_phys->ds_bp, txg_start, flags, func, arg)); + return (traverse_impl(ds->ds_dir->dd_pool->dp_spa, ds, ds->ds_object, + &ds->ds_phys->ds_bp, txg_start, NULL, flags, func, arg)); +} + +int +traverse_dataset_destroyed(spa_t *spa, blkptr_t *blkptr, + uint64_t txg_start, zbookmark_t *resume, int flags, + blkptr_cb_t func, void *arg) +{ + return (traverse_impl(spa, NULL, ZB_DESTROYED_OBJSET, + blkptr, txg_start, resume, flags, func, arg)); } /* @@ -434,8 +521,8 @@ traverse_pool(spa_t *spa, uint64_t txg_start, int flags, boolean_t hard = (flags & TRAVERSE_HARD); /* visit the MOS */ - err = traverse_impl(spa, NULL, spa_get_rootblkptr(spa), - txg_start, flags, func, arg); + err = traverse_impl(spa, NULL, 0, spa_get_rootblkptr(spa), + txg_start, NULL, flags, func, arg); if (err) return (err); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_tx.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_tx.c index b4579e278c8..3dd5f2c573d 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_tx.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_tx.c @@ -20,9 +20,8 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - */ -/* * Copyright 2011 Nexenta Systems, Inc. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -676,7 +675,7 @@ dmu_tx_hold_zap(dmu_tx_t *tx, uint64_t object, int add, const char *name) return; } - ASSERT3P(dmu_ot[dn->dn_type].ot_byteswap, ==, zap_byteswap); + ASSERT3P(DMU_OT_BYTESWAP(dn->dn_type), ==, DMU_BSWAP_ZAP); if (dn->dn_maxblkid == 0 && !add) { blkptr_t *bp; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c index ca2b69ab12f..f098e117a57 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -196,7 +197,7 @@ dnode_verify(dnode_t *dn) ASSERT(dn->dn_objset); ASSERT(dn->dn_handle->dnh_dnode == dn); - ASSERT(dn->dn_phys->dn_type < DMU_OT_NUMTYPES); + ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type)); if (!(zfs_flags & ZFS_DEBUG_DNODE_VERIFY)) return; @@ -215,7 +216,7 @@ dnode_verify(dnode_t *dn) ASSERT3U(1<dn_datablkshift, ==, dn->dn_datablksz); } ASSERT3U(dn->dn_nlevels, <=, 30); - ASSERT3U(dn->dn_type, <=, DMU_OT_NUMTYPES); + ASSERT(DMU_OT_IS_VALID(dn->dn_type)); ASSERT3U(dn->dn_nblkptr, >=, 1); ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR); ASSERT3U(dn->dn_bonuslen, <=, DN_MAX_BONUSLEN); @@ -281,8 +282,10 @@ dnode_byteswap(dnode_phys_t *dnp) */ int off = (dnp->dn_nblkptr-1) * sizeof (blkptr_t); size_t len = DN_MAX_BONUSLEN - off; - ASSERT3U(dnp->dn_bonustype, <, DMU_OT_NUMTYPES); - dmu_ot[dnp->dn_bonustype].ot_byteswap(dnp->dn_bonus + off, len); + ASSERT(DMU_OT_IS_VALID(dnp->dn_bonustype)); + dmu_object_byteswap_t byteswap = + DMU_OT_BYTESWAP(dnp->dn_bonustype); + dmu_ot_byteswap[byteswap].ob_func(dnp->dn_bonus + off, len); } /* Swap SPILL block if we have one */ @@ -410,7 +413,7 @@ dnode_create(objset_t *os, dnode_phys_t *dnp, dmu_buf_impl_t *db, dmu_zfetch_init(&dn->dn_zfetch, dn); - ASSERT(dn->dn_phys->dn_type < DMU_OT_NUMTYPES); + ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type)); mutex_enter(&os->os_lock); list_insert_head(&os->os_dnodes, dn); @@ -499,11 +502,11 @@ dnode_allocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, int ibs, ASSERT(bcmp(dn->dn_phys, &dnode_phys_zero, sizeof (dnode_phys_t)) == 0); ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE); ASSERT(ot != DMU_OT_NONE); - ASSERT3U(ot, <, DMU_OT_NUMTYPES); + ASSERT(DMU_OT_IS_VALID(ot)); ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) || (bonustype == DMU_OT_SA && bonuslen == 0) || (bonustype != DMU_OT_NONE && bonuslen != 0)); - ASSERT3U(bonustype, <, DMU_OT_NUMTYPES); + ASSERT(DMU_OT_IS_VALID(bonustype)); ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN); ASSERT(dn->dn_type == DMU_OT_NONE); ASSERT3U(dn->dn_maxblkid, ==, 0); @@ -571,7 +574,7 @@ dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) || (bonustype != DMU_OT_NONE && bonuslen != 0) || (bonustype == DMU_OT_SA && bonuslen == 0)); - ASSERT3U(bonustype, <, DMU_OT_NUMTYPES); + ASSERT(DMU_OT_IS_VALID(bonustype)); ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN); /* clean up any unreferenced dbufs */ diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode_sync.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode_sync.c index 32afe7d7473..fcabc748d1a 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode_sync.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode_sync.c @@ -18,8 +18,10 @@ * * CDDL HEADER END */ + /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -597,7 +599,7 @@ dnode_sync(dnode_t *dn, dmu_tx_t *tx) } if (dn->dn_next_bonustype[txgoff]) { - ASSERT(dn->dn_next_bonustype[txgoff] < DMU_OT_NUMTYPES); + ASSERT(DMU_OT_IS_VALID(dn->dn_next_bonustype[txgoff])); dnp->dn_bonustype = dn->dn_next_bonustype[txgoff]; dn->dn_next_bonustype[txgoff] = 0; } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c index ff49fa5ee74..c4452788124 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c @@ -20,7 +20,8 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. * Copyright (c) 2011 Pawel Jakub Dawidek . * All rights reserved. * Portions Copyright (c) 2011 Martin Matuska @@ -32,10 +33,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -101,7 +104,7 @@ dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx) if (BP_IS_HOLE(bp)) return; ASSERT(BP_GET_TYPE(bp) != DMU_OT_NONE); - ASSERT3U(BP_GET_TYPE(bp), <, DMU_OT_NUMTYPES); + ASSERT(DMU_OT_IS_VALID(BP_GET_TYPE(bp))); if (ds == NULL) { /* * Account for the meta-objset space in its placeholder @@ -118,7 +121,7 @@ dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx) mutex_enter(&ds->ds_dir->dd_lock); mutex_enter(&ds->ds_lock); delta = parent_delta(ds, used); - ds->ds_phys->ds_used_bytes += used; + ds->ds_phys->ds_referenced_bytes += used; ds->ds_phys->ds_compressed_bytes += compressed; ds->ds_phys->ds_uncompressed_bytes += uncompressed; ds->ds_phys->ds_unique_bytes += used; @@ -212,8 +215,8 @@ dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx, } } mutex_enter(&ds->ds_lock); - ASSERT3U(ds->ds_phys->ds_used_bytes, >=, used); - ds->ds_phys->ds_used_bytes -= used; + ASSERT3U(ds->ds_phys->ds_referenced_bytes, >=, used); + ds->ds_phys->ds_referenced_bytes -= used; ASSERT3U(ds->ds_phys->ds_compressed_bytes, >=, compressed); ds->ds_phys->ds_compressed_bytes -= compressed; ASSERT3U(ds->ds_phys->ds_uncompressed_bytes, >=, uncompressed); @@ -401,6 +404,8 @@ dsl_dataset_get_ref(dsl_pool_t *dp, uint64_t dsobj, void *tag, mutex_init(&ds->ds_lock, NULL, MUTEX_DEFAULT, NULL); mutex_init(&ds->ds_recvlock, NULL, MUTEX_DEFAULT, NULL); mutex_init(&ds->ds_opening_lock, NULL, MUTEX_DEFAULT, NULL); + mutex_init(&ds->ds_sendstream_lock, NULL, MUTEX_DEFAULT, NULL); + rw_init(&ds->ds_rwlock, 0, 0, 0); cv_init(&ds->ds_exclusive_cv, NULL, CV_DEFAULT, NULL); @@ -408,6 +413,9 @@ dsl_dataset_get_ref(dsl_pool_t *dp, uint64_t dsobj, void *tag, dsl_deadlist_open(&ds->ds_deadlist, mos, ds->ds_phys->ds_deadlist_obj); + list_create(&ds->ds_sendstreams, sizeof (dmu_sendarg_t), + offsetof(dmu_sendarg_t, dsa_link)); + if (err == 0) { err = dsl_dir_open_obj(dp, ds->ds_phys->ds_dir_obj, NULL, ds, &ds->ds_dir); @@ -802,8 +810,10 @@ dsl_dataset_create_sync_dd(dsl_dir_t *dd, dsl_dataset_t *origin, dsphys->ds_dir_obj = dd->dd_object; dsphys->ds_flags = flags; dsphys->ds_fsid_guid = unique_create(); - (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid, - sizeof (dsphys->ds_guid)); + do { + (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid, + sizeof (dsphys->ds_guid)); + } while (dsphys->ds_guid == 0); dsphys->ds_snapnames_zapobj = zap_create_norm(mos, U8_TEXTPREP_TOUPPER, DMU_OT_DSL_DS_SNAP_MAP, DMU_OT_NONE, 0, tx); @@ -818,8 +828,8 @@ dsl_dataset_create_sync_dd(dsl_dir_t *dd, dsl_dataset_t *origin, dsphys->ds_prev_snap_obj = origin->ds_object; dsphys->ds_prev_snap_txg = origin->ds_phys->ds_creation_txg; - dsphys->ds_used_bytes = - origin->ds_phys->ds_used_bytes; + dsphys->ds_referenced_bytes = + origin->ds_phys->ds_referenced_bytes; dsphys->ds_compressed_bytes = origin->ds_phys->ds_compressed_bytes; dsphys->ds_uncompressed_bytes = @@ -972,7 +982,6 @@ dmu_snapshots_destroy_nvl(nvlist_t *snaps, boolean_t defer, char *failed) for (pair = nvlist_next_nvpair(snaps, NULL); pair != NULL; pair = nvlist_next_nvpair(snaps, pair)) { dsl_dataset_t *ds; - int err; err = dsl_dataset_own(nvpair_name(pair), B_TRUE, dstg, &ds); if (err == 0) { @@ -1121,19 +1130,23 @@ dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer) goto out; /* - * remove the objects in open context, so that we won't - * have too much to do in syncing context. + * If async destruction is not enabled try to remove all objects + * while in the open context so that there is less work to do in + * the syncing context. */ - for (obj = 0; err == 0; err = dmu_object_next(os, &obj, FALSE, - ds->ds_phys->ds_prev_snap_txg)) { - /* - * Ignore errors, if there is not enough disk space - * we will deal with it in dsl_dataset_destroy_sync(). - */ - (void) dmu_free_object(os, obj); + if (!spa_feature_is_enabled(dsl_dataset_get_spa(ds), + &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY])) { + for (obj = 0; err == 0; err = dmu_object_next(os, &obj, FALSE, + ds->ds_phys->ds_prev_snap_txg)) { + /* + * Ignore errors, if there is not enough disk space + * we will deal with it in dsl_dataset_destroy_sync(). + */ + (void) dmu_free_object(os, obj); + } + if (err != ESRCH) + goto out; } - if (err != ESRCH) - goto out; /* * Only the ZIL knows how to free log blocks. @@ -1279,7 +1292,7 @@ dsl_dataset_recalc_head_uniq(dsl_dataset_t *ds) ASSERT(!dsl_dataset_is_snapshot(ds)); if (ds->ds_phys->ds_prev_snap_obj != 0) - mrs_used = ds->ds_prev->ds_phys->ds_used_bytes; + mrs_used = ds->ds_prev->ds_phys->ds_referenced_bytes; else mrs_used = 0; @@ -1287,7 +1300,7 @@ dsl_dataset_recalc_head_uniq(dsl_dataset_t *ds) ASSERT3U(dlused, <=, mrs_used); ds->ds_phys->ds_unique_bytes = - ds->ds_phys->ds_used_bytes - (mrs_used - dlused); + ds->ds_phys->ds_referenced_bytes - (mrs_used - dlused); if (spa_version(ds->ds_dir->dd_pool->dp_spa) >= SPA_VERSION_UNIQUE_ACCURATE) @@ -1646,6 +1659,30 @@ process_old_deadlist(dsl_dataset_t *ds, dsl_dataset_t *ds_prev, ds_next->ds_phys->ds_deadlist_obj); } +static int +old_synchronous_dataset_destroy(dsl_dataset_t *ds, dmu_tx_t *tx) +{ + int err; + struct killarg ka; + + /* + * Free everything that we point to (that's born after + * the previous snapshot, if we are a clone) + * + * NB: this should be very quick, because we already + * freed all the objects in open context. + */ + ka.ds = ds; + ka.tx = tx; + err = traverse_dataset(ds, + ds->ds_phys->ds_prev_snap_txg, TRAVERSE_POST, + kill_blkptr, &ka); + ASSERT3U(err, ==, 0); + ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0); + + return (err); +} + void dsl_dataset_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx) { @@ -1792,7 +1829,6 @@ dsl_dataset_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx) tx); dsl_dir_diduse_space(tx->tx_pool->dp_free_dir, DD_USED_HEAD, used, comp, uncomp, tx); - dsl_dir_dirty(tx->tx_pool->dp_free_dir, tx); /* Merge our deadlist into next's and free it. */ dsl_deadlist_merge(&ds_next->ds_deadlist, @@ -1868,32 +1904,54 @@ dsl_dataset_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx) } dsl_dataset_rele(ds_next, FTAG); } else { + zfeature_info_t *async_destroy = + &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY]; + /* * There's no next snapshot, so this is a head dataset. * Destroy the deadlist. Unless it's a clone, the * deadlist should be empty. (If it's a clone, it's * safe to ignore the deadlist contents.) */ - struct killarg ka; - dsl_deadlist_close(&ds->ds_deadlist); dsl_deadlist_free(mos, ds->ds_phys->ds_deadlist_obj, tx); ds->ds_phys->ds_deadlist_obj = 0; - /* - * Free everything that we point to (that's born after - * the previous snapshot, if we are a clone) - * - * NB: this should be very quick, because we already - * freed all the objects in open context. - */ - ka.ds = ds; - ka.tx = tx; - err = traverse_dataset(ds, ds->ds_phys->ds_prev_snap_txg, - TRAVERSE_POST, kill_blkptr, &ka); - ASSERT3U(err, ==, 0); - ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || - ds->ds_phys->ds_unique_bytes == 0); + if (!spa_feature_is_enabled(dp->dp_spa, async_destroy)) { + err = old_synchronous_dataset_destroy(ds, tx); + } else { + /* + * Move the bptree into the pool's list of trees to + * clean up and update space accounting information. + */ + uint64_t used, comp, uncomp; + + ASSERT(err == 0 || err == EBUSY); + if (!spa_feature_is_active(dp->dp_spa, async_destroy)) { + spa_feature_incr(dp->dp_spa, async_destroy, tx); + dp->dp_bptree_obj = bptree_alloc( + dp->dp_meta_objset, tx); + VERIFY(zap_add(dp->dp_meta_objset, + DMU_POOL_DIRECTORY_OBJECT, + DMU_POOL_BPTREE_OBJ, sizeof (uint64_t), 1, + &dp->dp_bptree_obj, tx) == 0); + } + + used = ds->ds_dir->dd_phys->dd_used_bytes; + comp = ds->ds_dir->dd_phys->dd_compressed_bytes; + uncomp = ds->ds_dir->dd_phys->dd_uncompressed_bytes; + + ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || + ds->ds_phys->ds_unique_bytes == used); + + bptree_add(dp->dp_meta_objset, dp->dp_bptree_obj, + &ds->ds_phys->ds_bp, ds->ds_phys->ds_prev_snap_txg, + used, comp, uncomp, tx); + dsl_dir_diduse_space(ds->ds_dir, DD_USED_HEAD, + -used, -comp, -uncomp, tx); + dsl_dir_diduse_space(dp->dp_free_dir, DD_USED_HEAD, + used, comp, uncomp, tx); + } if (ds->ds_prev != NULL) { if (spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) { @@ -2075,8 +2133,10 @@ dsl_dataset_snapshot_sync(void *arg1, void *arg2, dmu_tx_t *tx) bzero(dsphys, sizeof (dsl_dataset_phys_t)); dsphys->ds_dir_obj = ds->ds_dir->dd_object; dsphys->ds_fsid_guid = unique_create(); - (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid, - sizeof (dsphys->ds_guid)); + do { + (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid, + sizeof (dsphys->ds_guid)); + } while (dsphys->ds_guid == 0); dsphys->ds_prev_snap_obj = ds->ds_phys->ds_prev_snap_obj; dsphys->ds_prev_snap_txg = ds->ds_phys->ds_prev_snap_txg; dsphys->ds_next_snap_obj = ds->ds_object; @@ -2084,7 +2144,7 @@ dsl_dataset_snapshot_sync(void *arg1, void *arg2, dmu_tx_t *tx) dsphys->ds_creation_time = gethrestime_sec(); dsphys->ds_creation_txg = crtxg; dsphys->ds_deadlist_obj = ds->ds_phys->ds_deadlist_obj; - dsphys->ds_used_bytes = ds->ds_phys->ds_used_bytes; + dsphys->ds_referenced_bytes = ds->ds_phys->ds_referenced_bytes; dsphys->ds_compressed_bytes = ds->ds_phys->ds_compressed_bytes; dsphys->ds_uncompressed_bytes = ds->ds_phys->ds_uncompressed_bytes; dsphys->ds_flags = ds->ds_phys->ds_flags; @@ -2208,10 +2268,22 @@ get_clones_stat(dsl_dataset_t *ds, nvlist_t *nv) zap_cursor_advance(&zc)) { dsl_dataset_t *clone; char buf[ZFS_MAXNAMELEN]; + /* + * Even though we hold the dp_config_rwlock, the dataset + * may fail to open, returning ENOENT. If there is a + * thread concurrently attempting to destroy this + * dataset, it will have the ds_rwlock held for + * RW_WRITER. Our call to dsl_dataset_hold_obj() -> + * dsl_dataset_hold_ref() will fail its + * rw_tryenter(&ds->ds_rwlock, RW_READER), drop the + * dp_config_rwlock, and wait for the destroy progress + * and signal ds_exclusive_cv. If the destroy was + * successful, we will see that + * DSL_DATASET_IS_DESTROYED(), and return ENOENT. + */ if (dsl_dataset_hold_obj(ds->ds_dir->dd_pool, - za.za_first_integer, FTAG, &clone) != 0) { - goto fail; - } + za.za_first_integer, FTAG, &clone) != 0) + continue; dsl_dir_name(clone->ds_dir, buf); VERIFY(nvlist_add_boolean(val, buf) == 0); dsl_dataset_rele(clone, FTAG); @@ -2334,7 +2406,7 @@ dsl_dataset_space(dsl_dataset_t *ds, uint64_t *refdbytesp, uint64_t *availbytesp, uint64_t *usedobjsp, uint64_t *availobjsp) { - *refdbytesp = ds->ds_phys->ds_used_bytes; + *refdbytesp = ds->ds_phys->ds_referenced_bytes; *availbytesp = dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE); if (ds->ds_reserved > ds->ds_phys->ds_unique_bytes) *availbytesp += ds->ds_reserved - ds->ds_phys->ds_unique_bytes; @@ -2677,7 +2749,7 @@ dsl_dataset_promote_check(void *arg1, void *arg2, dmu_tx_t *tx) * Note however, if we stop before we reach the ORIGIN we get: * uN + kN + kN-1 + ... + kM - uM-1 */ - pa->used = origin_ds->ds_phys->ds_used_bytes; + pa->used = origin_ds->ds_phys->ds_referenced_bytes; pa->comp = origin_ds->ds_phys->ds_compressed_bytes; pa->uncomp = origin_ds->ds_phys->ds_uncompressed_bytes; for (snap = list_head(&pa->shared_snaps); snap; @@ -2711,7 +2783,7 @@ dsl_dataset_promote_check(void *arg1, void *arg2, dmu_tx_t *tx) * so we need to subtract out the clone origin's used space. */ if (pa->origin_origin) { - pa->used -= pa->origin_origin->ds_phys->ds_used_bytes; + pa->used -= pa->origin_origin->ds_phys->ds_referenced_bytes; pa->comp -= pa->origin_origin->ds_phys->ds_compressed_bytes; pa->uncomp -= pa->origin_origin->ds_phys->ds_uncompressed_bytes; } @@ -3227,8 +3299,8 @@ dsl_dataset_clone_swap_sync(void *arg1, void *arg2, dmu_tx_t *tx) dsl_deadlist_space(&csa->ohds->ds_deadlist, &odl_used, &odl_comp, &odl_uncomp); - dused = csa->cds->ds_phys->ds_used_bytes + cdl_used - - (csa->ohds->ds_phys->ds_used_bytes + odl_used); + dused = csa->cds->ds_phys->ds_referenced_bytes + cdl_used - + (csa->ohds->ds_phys->ds_referenced_bytes + odl_used); dcomp = csa->cds->ds_phys->ds_compressed_bytes + cdl_comp - (csa->ohds->ds_phys->ds_compressed_bytes + odl_comp); duncomp = csa->cds->ds_phys->ds_uncompressed_bytes + @@ -3257,8 +3329,8 @@ dsl_dataset_clone_swap_sync(void *arg1, void *arg2, dmu_tx_t *tx) } /* swap ds_*_bytes */ - SWITCH64(csa->ohds->ds_phys->ds_used_bytes, - csa->cds->ds_phys->ds_used_bytes); + SWITCH64(csa->ohds->ds_phys->ds_referenced_bytes, + csa->cds->ds_phys->ds_referenced_bytes); SWITCH64(csa->ohds->ds_phys->ds_compressed_bytes, csa->cds->ds_phys->ds_compressed_bytes); SWITCH64(csa->ohds->ds_phys->ds_uncompressed_bytes, @@ -3387,8 +3459,9 @@ dsl_dataset_check_quota(dsl_dataset_t *ds, boolean_t check_quota, * on-disk is over quota and there are no pending changes (which * may free up space for us). */ - if (ds->ds_phys->ds_used_bytes + inflight >= ds->ds_quota) { - if (inflight > 0 || ds->ds_phys->ds_used_bytes < ds->ds_quota) + if (ds->ds_phys->ds_referenced_bytes + inflight >= ds->ds_quota) { + if (inflight > 0 || + ds->ds_phys->ds_referenced_bytes < ds->ds_quota) error = ERESTART; else error = EDQUOT; @@ -3415,7 +3488,7 @@ dsl_dataset_set_quota_check(void *arg1, void *arg2, dmu_tx_t *tx) if (psa->psa_effective_value == 0) return (0); - if (psa->psa_effective_value < ds->ds_phys->ds_used_bytes || + if (psa->psa_effective_value < ds->ds_phys->ds_referenced_bytes || psa->psa_effective_value < ds->ds_reserved) return (ENOSPC); @@ -4169,8 +4242,8 @@ dsl_dataset_space_written(dsl_dataset_t *oldsnap, dsl_dataset_t *new, dsl_pool_t *dp = new->ds_dir->dd_pool; *usedp = 0; - *usedp += new->ds_phys->ds_used_bytes; - *usedp -= oldsnap->ds_phys->ds_used_bytes; + *usedp += new->ds_phys->ds_referenced_bytes; + *usedp -= oldsnap->ds_phys->ds_referenced_bytes; *compp = 0; *compp += new->ds_phys->ds_compressed_bytes; @@ -4186,9 +4259,13 @@ dsl_dataset_space_written(dsl_dataset_t *oldsnap, dsl_dataset_t *new, dsl_dataset_t *snap; uint64_t used, comp, uncomp; - err = dsl_dataset_hold_obj(dp, snapobj, FTAG, &snap); - if (err != 0) - break; + if (snapobj == new->ds_object) { + snap = new; + } else { + err = dsl_dataset_hold_obj(dp, snapobj, FTAG, &snap); + if (err != 0) + break; + } if (snap->ds_phys->ds_prev_snap_txg == oldsnap->ds_phys->ds_creation_txg) { @@ -4217,7 +4294,8 @@ dsl_dataset_space_written(dsl_dataset_t *oldsnap, dsl_dataset_t *new, * was not a snapshot of/before new. */ snapobj = snap->ds_phys->ds_prev_snap_obj; - dsl_dataset_rele(snap, FTAG); + if (snap != new) + dsl_dataset_rele(snap, FTAG); if (snapobj == 0) { err = EINVAL; break; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_deleg.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_deleg.c index 0b5fa0bcd76..8f9d2c5f892 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_deleg.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_deleg.c @@ -20,7 +20,7 @@ */ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ /* @@ -171,10 +171,8 @@ dsl_deleg_set_sync(void *arg1, void *arg2, dmu_tx_t *tx) VERIFY(nvpair_value_nvlist(whopair, &perms) == 0); if (zap_lookup(mos, zapobj, whokey, 8, 1, &jumpobj) != 0) { - jumpobj = zap_create(mos, DMU_OT_DSL_PERMS, - DMU_OT_NONE, 0, tx); - VERIFY(zap_update(mos, zapobj, - whokey, 8, 1, &jumpobj, tx) == 0); + jumpobj = zap_create_link(mos, DMU_OT_DSL_PERMS, + zapobj, whokey, tx); } while (permpair = nvlist_next_nvpair(perms, permpair)) { diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c index 7f7a3b945ef..d698e594e2f 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c @@ -20,7 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -40,6 +40,8 @@ #include #include #include +#include +#include int zfs_no_write_throttle = 0; int zfs_write_limit_shift = 3; /* 1/8th of physical memory */ @@ -125,20 +127,32 @@ dsl_pool_open_impl(spa_t *spa, uint64_t txg) } int -dsl_pool_open(spa_t *spa, uint64_t txg, dsl_pool_t **dpp) +dsl_pool_init(spa_t *spa, uint64_t txg, dsl_pool_t **dpp) { int err; dsl_pool_t *dp = dsl_pool_open_impl(spa, txg); + + err = dmu_objset_open_impl(spa, NULL, &dp->dp_meta_rootbp, + &dp->dp_meta_objset); + if (err != 0) + dsl_pool_close(dp); + else + *dpp = dp; + + return (err); +} + +int +dsl_pool_open(dsl_pool_t *dp) +{ + int err; dsl_dir_t *dd; dsl_dataset_t *ds; uint64_t obj; - rw_enter(&dp->dp_config_rwlock, RW_WRITER); - err = dmu_objset_open_impl(spa, NULL, &dp->dp_meta_rootbp, - &dp->dp_meta_objset); - if (err) - goto out; + ASSERT(!dmu_objset_is_dirty_anywhere(dp->dp_meta_objset)); + rw_enter(&dp->dp_config_rwlock, RW_WRITER); err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_ROOT_DATASET, sizeof (uint64_t), 1, &dp->dp_root_dir_obj); @@ -154,7 +168,7 @@ dsl_pool_open(spa_t *spa, uint64_t txg, dsl_pool_t **dpp) if (err) goto out; - if (spa_version(spa) >= SPA_VERSION_ORIGIN) { + if (spa_version(dp->dp_spa) >= SPA_VERSION_ORIGIN) { err = dsl_pool_open_special_dir(dp, ORIGIN_DIR_NAME, &dd); if (err) goto out; @@ -171,7 +185,7 @@ dsl_pool_open(spa_t *spa, uint64_t txg, dsl_pool_t **dpp) goto out; } - if (spa_version(spa) >= SPA_VERSION_DEADLISTS) { + if (spa_version(dp->dp_spa) >= SPA_VERSION_DEADLISTS) { err = dsl_pool_open_special_dir(dp, FREE_DIR_NAME, &dp->dp_free_dir); if (err) @@ -185,6 +199,15 @@ dsl_pool_open(spa_t *spa, uint64_t txg, dsl_pool_t **dpp) dp->dp_meta_objset, obj)); } + if (spa_feature_is_active(dp->dp_spa, + &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY])) { + err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, + DMU_POOL_BPTREE_OBJ, sizeof (uint64_t), 1, + &dp->dp_bptree_obj); + if (err != 0) + goto out; + } + err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_TMP_USERREFS, sizeof (uint64_t), 1, &dp->dp_tmp_userrefs_obj); @@ -193,15 +216,10 @@ dsl_pool_open(spa_t *spa, uint64_t txg, dsl_pool_t **dpp) if (err) goto out; - err = dsl_scan_init(dp, txg); + err = dsl_scan_init(dp, dp->dp_tx.tx_open_txg); out: rw_exit(&dp->dp_config_rwlock); - if (err) - dsl_pool_close(dp); - else - *dpp = dp; - return (err); } @@ -495,7 +513,7 @@ int dsl_pool_sync_context(dsl_pool_t *dp) { return (curthread == dp->dp_tx.tx_sync_thread || - spa_get_dsl(dp->dp_spa) == NULL); + spa_is_initializing(dp->dp_spa)); } uint64_t @@ -813,11 +831,8 @@ dsl_pool_user_hold_create_obj(dsl_pool_t *dp, dmu_tx_t *tx) ASSERT(dp->dp_tmp_userrefs_obj == 0); ASSERT(dmu_tx_is_syncing(tx)); - dp->dp_tmp_userrefs_obj = zap_create(mos, DMU_OT_USERREFS, - DMU_OT_NONE, 0, tx); - - VERIFY(zap_add(mos, DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_TMP_USERREFS, - sizeof (uint64_t), 1, &dp->dp_tmp_userrefs_obj, tx) == 0); + dp->dp_tmp_userrefs_obj = zap_create_link(mos, DMU_OT_USERREFS, + DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_TMP_USERREFS, tx); } static int diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_scan.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_scan.c index 56d41083673..5fc37e210ee 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_scan.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_scan.c @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -44,6 +45,7 @@ #include #include #include +#include #ifdef _KERNEL #include #endif @@ -56,18 +58,48 @@ static scan_cb_t dsl_scan_remove_cb; static dsl_syncfunc_t dsl_scan_cancel_sync; static void dsl_scan_sync_state(dsl_scan_t *, dmu_tx_t *tx); -int zfs_top_maxinflight = 32; /* maximum I/Os per top-level */ -int zfs_resilver_delay = 2; /* number of ticks to delay resilver */ -int zfs_scrub_delay = 4; /* number of ticks to delay scrub */ -int zfs_scan_idle = 50; /* idle window in clock ticks */ +unsigned int zfs_top_maxinflight = 32; /* maximum I/Os per top-level */ +unsigned int zfs_resilver_delay = 2; /* number of ticks to delay resilver */ +unsigned int zfs_scrub_delay = 4; /* number of ticks to delay scrub */ +unsigned int zfs_scan_idle = 50; /* idle window in clock ticks */ -int zfs_scan_min_time_ms = 1000; /* min millisecs to scrub per txg */ -int zfs_free_min_time_ms = 1000; /* min millisecs to free per txg */ -int zfs_resilver_min_time_ms = 3000; /* min millisecs to resilver per txg */ +unsigned int zfs_scan_min_time_ms = 1000; /* min millisecs to scrub per txg */ +unsigned int zfs_free_min_time_ms = 1000; /* min millisecs to free per txg */ +unsigned int zfs_resilver_min_time_ms = 3000; /* min millisecs to resilver + per txg */ boolean_t zfs_no_scrub_io = B_FALSE; /* set to disable scrub i/o */ boolean_t zfs_no_scrub_prefetch = B_FALSE; /* set to disable srub prefetching */ + +SYSCTL_DECL(_vfs_zfs); +TUNABLE_INT("vfs.zfs.top_maxinflight", &zfs_top_maxinflight); +SYSCTL_UINT(_vfs_zfs, OID_AUTO, top_maxinflight, CTLFLAG_RW, + &zfs_top_maxinflight, 0, "Maximum I/Os per top-level vdev"); +TUNABLE_INT("vfs.zfs.resilver_delay", &zfs_resilver_delay); +SYSCTL_UINT(_vfs_zfs, OID_AUTO, resilver_delay, CTLFLAG_RW, + &zfs_resilver_delay, 0, "Number of ticks to delay resilver"); +TUNABLE_INT("vfs.zfs.scrub_delay", &zfs_scrub_delay); +SYSCTL_UINT(_vfs_zfs, OID_AUTO, scrub_delay, CTLFLAG_RW, + &zfs_scrub_delay, 0, "Number of ticks to delay scrub"); +TUNABLE_INT("vfs.zfs.scan_idle", &zfs_scan_idle); +SYSCTL_UINT(_vfs_zfs, OID_AUTO, scan_idle, CTLFLAG_RW, + &zfs_scan_idle, 0, "Idle scan window in clock ticks"); +TUNABLE_INT("vfs.zfs.scan_min_time_ms", &zfs_scan_min_time_ms); +SYSCTL_UINT(_vfs_zfs, OID_AUTO, scan_min_time_ms, CTLFLAG_RW, + &zfs_scan_min_time_ms, 0, "Min millisecs to scrub per txg"); +TUNABLE_INT("vfs.zfs.free_min_time_ms", &zfs_free_min_time_ms); +SYSCTL_UINT(_vfs_zfs, OID_AUTO, free_min_time_ms, CTLFLAG_RW, + &zfs_free_min_time_ms, 0, "Min millisecs to free per txg"); +TUNABLE_INT("vfs.zfs.resilver_min_time_ms", &zfs_resilver_min_time_ms); +SYSCTL_UINT(_vfs_zfs, OID_AUTO, resilver_min_time_ms, CTLFLAG_RW, + &zfs_resilver_min_time_ms, 0, "Min millisecs to resilver per txg"); +TUNABLE_INT("vfs.zfs.no_scrub_io", &zfs_no_scrub_io); +SYSCTL_INT(_vfs_zfs, OID_AUTO, no_scrub_io, CTLFLAG_RW, + &zfs_no_scrub_io, 0, "Disable scrub I/O"); +TUNABLE_INT("vfs.zfs.no_scrub_prefetch", &zfs_no_scrub_prefetch); +SYSCTL_INT(_vfs_zfs, OID_AUTO, no_scrub_prefetch, CTLFLAG_RW, + &zfs_no_scrub_prefetch, 0, "Disable scrub prefetching"); + enum ddt_class zfs_scrub_ddt_class_max = DDT_CLASS_DUPLICATE; -int dsl_scan_delay_completion = B_FALSE; /* set to delay scan completion */ #define DSL_SCAN_IS_SCRUB_RESILVER(scn) \ ((scn)->scn_phys.scn_func == POOL_SCAN_SCRUB || \ @@ -382,55 +414,6 @@ dsl_read_nolock(zio_t *pio, spa_t *spa, const blkptr_t *bpp, priority, zio_flags, arc_flags, zb)); } -static boolean_t -bookmark_is_zero(const zbookmark_t *zb) -{ - return (zb->zb_objset == 0 && zb->zb_object == 0 && - zb->zb_level == 0 && zb->zb_blkid == 0); -} - -/* dnp is the dnode for zb1->zb_object */ -static boolean_t -bookmark_is_before(const dnode_phys_t *dnp, const zbookmark_t *zb1, - const zbookmark_t *zb2) -{ - uint64_t zb1nextL0, zb2thisobj; - - ASSERT(zb1->zb_objset == zb2->zb_objset); - ASSERT(zb2->zb_level == 0); - - /* - * A bookmark in the deadlist is considered to be after - * everything else. - */ - if (zb2->zb_object == DMU_DEADLIST_OBJECT) - return (B_TRUE); - - /* The objset_phys_t isn't before anything. */ - if (dnp == NULL) - return (B_FALSE); - - zb1nextL0 = (zb1->zb_blkid + 1) << - ((zb1->zb_level) * (dnp->dn_indblkshift - SPA_BLKPTRSHIFT)); - - zb2thisobj = zb2->zb_object ? zb2->zb_object : - zb2->zb_blkid << (DNODE_BLOCK_SHIFT - DNODE_SHIFT); - - if (zb1->zb_object == DMU_META_DNODE_OBJECT) { - uint64_t nextobj = zb1nextL0 * - (dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT) >> DNODE_SHIFT; - return (nextobj <= zb2thisobj); - } - - if (zb1->zb_object < zb2thisobj) - return (B_TRUE); - if (zb1->zb_object > zb2thisobj) - return (B_FALSE); - if (zb2->zb_object == DMU_META_DNODE_OBJECT) - return (B_FALSE); - return (zb1nextL0 <= zb2->zb_blkid); -} - static uint64_t dsl_scan_ds_maxtxg(dsl_dataset_t *ds) { @@ -453,7 +436,7 @@ static boolean_t dsl_scan_check_pause(dsl_scan_t *scn, const zbookmark_t *zb) { uint64_t elapsed_nanosecs; - int mintime; + unsigned int mintime; /* we never skip user/group accounting objects */ if (zb && (int64_t)zb->zb_object < 0) @@ -462,7 +445,7 @@ dsl_scan_check_pause(dsl_scan_t *scn, const zbookmark_t *zb) if (scn->scn_pausing) return (B_TRUE); /* we're already pausing */ - if (!bookmark_is_zero(&scn->scn_phys.scn_bookmark)) + if (!ZB_IS_ZERO(&scn->scn_phys.scn_bookmark)) return (B_FALSE); /* we're resuming */ /* We only know how to resume from level-0 blocks. */ @@ -617,13 +600,13 @@ dsl_scan_check_resume(dsl_scan_t *scn, const dnode_phys_t *dnp, /* * We never skip over user/group accounting objects (obj<0) */ - if (!bookmark_is_zero(&scn->scn_phys.scn_bookmark) && + if (!ZB_IS_ZERO(&scn->scn_phys.scn_bookmark) && (int64_t)zb->zb_object >= 0) { /* * If we already visited this bp & everything below (in * a prior txg sync), don't bother doing it again. */ - if (bookmark_is_before(dnp, zb, &scn->scn_phys.scn_bookmark)) + if (zbookmark_is_before(dnp, zb, &scn->scn_phys.scn_bookmark)) return (B_TRUE); /* @@ -816,22 +799,6 @@ dsl_scan_visitbp(blkptr_t *bp, const zbookmark_t *zb, if (bp->blk_birth <= scn->scn_phys.scn_cur_min_txg) return; - if (BP_GET_TYPE(bp) != DMU_OT_USERGROUP_USED) { - /* - * For non-user-accounting blocks, we need to read the - * new bp (from a deleted snapshot, found in - * check_existing_xlation). If we used the old bp, - * pointers inside this block from before we resumed - * would be untranslated. - * - * For user-accounting blocks, we need to read the old - * bp, because we will apply the entire space delta to - * it (original untranslated -> translations from - * deleted snap -> now). - */ - bp_toread = *bp; - } - if (dsl_scan_recurse(scn, ds, ostype, dnp, &bp_toread, zb, tx, &buf) != 0) return; @@ -1396,19 +1363,28 @@ dsl_scan_visit(dsl_scan_t *scn, dmu_tx_t *tx) zap_cursor_fini(&zc); } -static int -dsl_scan_free_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx) +static boolean_t +dsl_scan_free_should_pause(dsl_scan_t *scn) { - dsl_scan_t *scn = arg; uint64_t elapsed_nanosecs; elapsed_nanosecs = gethrtime() - scn->scn_sync_start_time; - - if (elapsed_nanosecs / NANOSEC > zfs_txg_timeout || + return (elapsed_nanosecs / NANOSEC > zfs_txg_timeout || (elapsed_nanosecs / MICROSEC > zfs_free_min_time_ms && txg_sync_waiting(scn->scn_dp)) || - spa_shutting_down(scn->scn_dp->dp_spa)) - return (ERESTART); + spa_shutting_down(scn->scn_dp->dp_spa)); +} + +static int +dsl_scan_free_block_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx) +{ + dsl_scan_t *scn = arg; + + if (!scn->scn_is_bptree || + (BP_GET_LEVEL(bp) == 0 && BP_GET_TYPE(bp) != DMU_OT_OBJSET)) { + if (dsl_scan_free_should_pause(scn)) + return (ERESTART); + } zio_nowait(zio_free_sync(scn->scn_zio_root, scn->scn_dp->dp_spa, dmu_tx_get_txg(tx), bp, 0)); @@ -1433,6 +1409,10 @@ dsl_scan_active(dsl_scan_t *scn) if (scn->scn_phys.scn_state == DSS_SCANNING) return (B_TRUE); + if (spa_feature_is_active(spa, + &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY])) { + return (B_TRUE); + } if (spa_version(scn->scn_dp->dp_spa) >= SPA_VERSION_DEADLISTS) { (void) bpobj_space(&scn->scn_dp->dp_free_bpobj, &used, &comp, &uncomp); @@ -1479,14 +1459,40 @@ dsl_scan_sync(dsl_pool_t *dp, dmu_tx_t *tx) * traversing it. */ if (spa_version(dp->dp_spa) >= SPA_VERSION_DEADLISTS) { + scn->scn_is_bptree = B_FALSE; scn->scn_zio_root = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED); err = bpobj_iterate(&dp->dp_free_bpobj, - dsl_scan_free_cb, scn, tx); + dsl_scan_free_block_cb, scn, tx); VERIFY3U(0, ==, zio_wait(scn->scn_zio_root)); + + if (err == 0 && spa_feature_is_active(spa, + &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY])) { + scn->scn_is_bptree = B_TRUE; + scn->scn_zio_root = zio_root(dp->dp_spa, NULL, + NULL, ZIO_FLAG_MUSTSUCCEED); + err = bptree_iterate(dp->dp_meta_objset, + dp->dp_bptree_obj, B_TRUE, dsl_scan_free_block_cb, + scn, tx); + VERIFY3U(0, ==, zio_wait(scn->scn_zio_root)); + if (err != 0) + return; + + /* disable async destroy feature */ + spa_feature_decr(spa, + &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY], tx); + ASSERT(!spa_feature_is_active(spa, + &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY])); + VERIFY3U(0, ==, zap_remove(dp->dp_meta_objset, + DMU_POOL_DIRECTORY_OBJECT, + DMU_POOL_BPTREE_OBJ, tx)); + VERIFY3U(0, ==, bptree_free(dp->dp_meta_objset, + dp->dp_bptree_obj, tx)); + dp->dp_bptree_obj = 0; + } if (scn->scn_visited_this_txg) { zfs_dbgmsg("freed %llu blocks in %llums from " - "free_bpobj txg %llu", + "free_bpobj/bptree txg %llu", (longlong_t)scn->scn_visited_this_txg, (longlong_t) (gethrtime() - scn->scn_sync_start_time) / MICROSEC, @@ -1601,6 +1607,8 @@ count_block(zfs_all_blkstats_t *zab, const blkptr_t *bp) for (i = 0; i < 4; i++) { int l = (i < 2) ? BP_GET_LEVEL(bp) : DN_MAX_LEVELS; int t = (i & 1) ? BP_GET_TYPE(bp) : DMU_OT_TOTAL; + if (t & DMU_OT_NEWTYPE) + t = DMU_OT_OTHER; zfs_blkstat_t *zb = &zab->zab_type[l][t]; int equal; @@ -1661,7 +1669,7 @@ dsl_scan_scrub_cb(dsl_pool_t *dp, boolean_t needs_io; int zio_flags = ZIO_FLAG_SCAN_THREAD | ZIO_FLAG_RAW | ZIO_FLAG_CANFAIL; int zio_priority; - int scan_delay = 0; + unsigned int scan_delay = 0; if (phys_birth <= scn->scn_phys.scn_min_txg || phys_birth >= scn->scn_phys.scn_max_txg) @@ -1718,7 +1726,8 @@ dsl_scan_scrub_cb(dsl_pool_t *dp, if (needs_io && !zfs_no_scrub_io) { vdev_t *rvd = spa->spa_root_vdev; - uint64_t maxinflight = rvd->vdev_children * zfs_top_maxinflight; + uint64_t maxinflight = rvd->vdev_children * + MAX(zfs_top_maxinflight, 1); void *data = zio_data_buf_alloc(size); mutex_enter(&spa->spa_scrub_lock); @@ -1732,7 +1741,7 @@ dsl_scan_scrub_cb(dsl_pool_t *dp, * then throttle our workload to limit the impact of a scan. */ if (ddi_get_lbolt64() - spa->spa_last_io <= zfs_scan_idle) - delay(scan_delay); + delay(MAX((int)scan_delay, 0)); zio_nowait(zio_read(NULL, spa, bp, data, size, dsl_scan_scrub_done, NULL, zio_priority, diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sa.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sa.c index 69374fb7956..173198d6d0c 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sa.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sa.c @@ -18,9 +18,11 @@ * * CDDL HEADER END */ + /* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Portions Copyright 2011 iXsystems, Inc + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -427,10 +429,9 @@ sa_add_layout_entry(objset_t *os, sa_attr_type_t *attrs, int attr_count, char attr_name[8]; if (sa->sa_layout_attr_obj == 0) { - sa->sa_layout_attr_obj = zap_create(os, - DMU_OT_SA_ATTR_LAYOUTS, DMU_OT_NONE, 0, tx); - VERIFY(zap_add(os, sa->sa_master_obj, SA_LAYOUTS, 8, 1, - &sa->sa_layout_attr_obj, tx) == 0); + sa->sa_layout_attr_obj = zap_create_link(os, + DMU_OT_SA_ATTR_LAYOUTS, + sa->sa_master_obj, SA_LAYOUTS, tx); } (void) snprintf(attr_name, sizeof (attr_name), @@ -1552,10 +1553,9 @@ sa_attr_register_sync(sa_handle_t *hdl, dmu_tx_t *tx) } if (sa->sa_reg_attr_obj == 0) { - sa->sa_reg_attr_obj = zap_create(hdl->sa_os, - DMU_OT_SA_ATTR_REGISTRATION, DMU_OT_NONE, 0, tx); - VERIFY(zap_add(hdl->sa_os, sa->sa_master_obj, - SA_REGISTRY, 8, 1, &sa->sa_reg_attr_obj, tx) == 0); + sa->sa_reg_attr_obj = zap_create_link(hdl->sa_os, + DMU_OT_SA_ATTR_REGISTRATION, + sa->sa_master_obj, SA_REGISTRY, tx); } for (i = 0; i != sa->sa_num_attrs; i++) { if (sa->sa_attr_table[i].sa_registered) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c index f467223fd92..c796533a908 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c @@ -21,7 +21,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ /* @@ -60,6 +60,7 @@ #include #include #include +#include #include #ifdef _KERNEL @@ -117,6 +118,7 @@ const zio_taskq_info_t zio_taskqs[ZIO_TYPES][ZIO_TASKQ_TYPES] = { { ZTI_ONE, ZTI_NULL, ZTI_ONE, ZTI_NULL }, }; +static dsl_syncfunc_t spa_sync_version; static dsl_syncfunc_t spa_sync_props; static boolean_t spa_has_active_shared_spare(spa_t *spa); static int spa_load_impl(spa_t *spa, uint64_t, nvlist_t *config, @@ -175,15 +177,18 @@ spa_prop_add_list(nvlist_t *nvl, zpool_prop_t prop, char *strval, static void spa_prop_get_config(spa_t *spa, nvlist_t **nvp) { + vdev_t *rvd = spa->spa_root_vdev; + dsl_pool_t *pool = spa->spa_dsl_pool; uint64_t size; uint64_t alloc; + uint64_t space; uint64_t cap, version; zprop_source_t src = ZPROP_SRC_NONE; spa_config_dirent_t *dp; ASSERT(MUTEX_HELD(&spa->spa_props_lock)); - if (spa->spa_root_vdev != NULL) { + if (rvd != NULL) { alloc = metaslab_class_get_alloc(spa_normal_class(spa)); size = metaslab_class_get_space(spa_normal_class(spa)); spa_prop_add_list(*nvp, ZPOOL_PROP_NAME, spa_name(spa), 0, src); @@ -191,6 +196,15 @@ spa_prop_get_config(spa_t *spa, nvlist_t **nvp) spa_prop_add_list(*nvp, ZPOOL_PROP_ALLOCATED, NULL, alloc, src); spa_prop_add_list(*nvp, ZPOOL_PROP_FREE, NULL, size - alloc, src); + + space = 0; + for (int c = 0; c < rvd->vdev_children; c++) { + vdev_t *tvd = rvd->vdev_child[c]; + space += tvd->vdev_max_asize - tvd->vdev_asize; + } + spa_prop_add_list(*nvp, ZPOOL_PROP_EXPANDSZ, NULL, space, + src); + spa_prop_add_list(*nvp, ZPOOL_PROP_READONLY, NULL, (spa_mode(spa) == FREAD), src); @@ -201,7 +215,7 @@ spa_prop_get_config(spa_t *spa, nvlist_t **nvp) ddt_get_pool_dedup_ratio(spa), src); spa_prop_add_list(*nvp, ZPOOL_PROP_HEALTH, NULL, - spa->spa_root_vdev->vdev_state, src); + rvd->vdev_state, src); version = spa_version(spa); if (version == zpool_prop_default_numeric(ZPOOL_PROP_VERSION)) @@ -211,6 +225,22 @@ spa_prop_get_config(spa_t *spa, nvlist_t **nvp) spa_prop_add_list(*nvp, ZPOOL_PROP_VERSION, NULL, version, src); } + if (pool != NULL) { + dsl_dir_t *freedir = pool->dp_free_dir; + + /* + * The $FREE directory was introduced in SPA_VERSION_DEADLISTS, + * when opening pools before this version freedir will be NULL. + */ + if (freedir != NULL) { + spa_prop_add_list(*nvp, ZPOOL_PROP_FREEING, NULL, + freedir->dd_phys->dd_used_bytes, src); + } else { + spa_prop_add_list(*nvp, ZPOOL_PROP_FREEING, + NULL, 0, src); + } + } + spa_prop_add_list(*nvp, ZPOOL_PROP_GUID, NULL, spa_guid(spa), src); if (spa->spa_comment != NULL) { @@ -350,25 +380,55 @@ spa_prop_validate(spa_t *spa, nvlist_t *props) nvpair_t *elem; int error = 0, reset_bootfs = 0; uint64_t objnum; + boolean_t has_feature = B_FALSE; elem = NULL; while ((elem = nvlist_next_nvpair(props, elem)) != NULL) { - zpool_prop_t prop; - char *propname, *strval; uint64_t intval; - objset_t *os; - char *slash, *check; - - propname = nvpair_name(elem); - - if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL) - return (EINVAL); + char *strval, *slash, *check, *fname; + const char *propname = nvpair_name(elem); + zpool_prop_t prop = zpool_name_to_prop(propname); switch (prop) { + case ZPROP_INVAL: + if (!zpool_prop_feature(propname)) { + error = EINVAL; + break; + } + + /* + * Sanitize the input. + */ + if (nvpair_type(elem) != DATA_TYPE_UINT64) { + error = EINVAL; + break; + } + + if (nvpair_value_uint64(elem, &intval) != 0) { + error = EINVAL; + break; + } + + if (intval != 0) { + error = EINVAL; + break; + } + + fname = strchr(propname, '@') + 1; + if (zfeature_lookup_name(fname, NULL) != 0) { + error = EINVAL; + break; + } + + has_feature = B_TRUE; + break; + case ZPOOL_PROP_VERSION: error = nvpair_value_uint64(elem, &intval); if (!error && - (intval < spa_version(spa) || intval > SPA_VERSION)) + (intval < spa_version(spa) || + intval > SPA_VERSION_BEFORE_FEATURES || + has_feature)) error = EINVAL; break; @@ -405,6 +465,7 @@ spa_prop_validate(spa_t *spa, nvlist_t *props) error = nvpair_value_string(elem, &strval); if (!error) { + objset_t *os; uint64_t compress; if (strval == NULL || strval[0] == '\0') { @@ -554,33 +615,58 @@ int spa_prop_set(spa_t *spa, nvlist_t *nvp) { int error; - nvpair_t *elem; + nvpair_t *elem = NULL; boolean_t need_sync = B_FALSE; - zpool_prop_t prop; if ((error = spa_prop_validate(spa, nvp)) != 0) return (error); - elem = NULL; while ((elem = nvlist_next_nvpair(nvp, elem)) != NULL) { - if ((prop = zpool_name_to_prop( - nvpair_name(elem))) == ZPROP_INVAL) - return (EINVAL); + zpool_prop_t prop = zpool_name_to_prop(nvpair_name(elem)); if (prop == ZPOOL_PROP_CACHEFILE || prop == ZPOOL_PROP_ALTROOT || prop == ZPOOL_PROP_READONLY) continue; + if (prop == ZPOOL_PROP_VERSION || prop == ZPROP_INVAL) { + uint64_t ver; + + if (prop == ZPOOL_PROP_VERSION) { + VERIFY(nvpair_value_uint64(elem, &ver) == 0); + } else { + ASSERT(zpool_prop_feature(nvpair_name(elem))); + ver = SPA_VERSION_FEATURES; + need_sync = B_TRUE; + } + + /* Save time if the version is already set. */ + if (ver == spa_version(spa)) + continue; + + /* + * In addition to the pool directory object, we might + * create the pool properties object, the features for + * read object, the features for write object, or the + * feature descriptions object. + */ + error = dsl_sync_task_do(spa_get_dsl(spa), NULL, + spa_sync_version, spa, &ver, 6); + if (error) + return (error); + continue; + } + need_sync = B_TRUE; break; } - if (need_sync) + if (need_sync) { return (dsl_sync_task_do(spa_get_dsl(spa), NULL, spa_sync_props, - spa, nvp, 3)); - else - return (0); + spa, nvp, 6)); + } + + return (0); } /* @@ -1619,7 +1705,7 @@ spa_load_verify_done(zio_t *zio) int error = zio->io_error; if (error) { - if ((BP_GET_LEVEL(bp) != 0 || dmu_ot[type].ot_metadata) && + if ((BP_GET_LEVEL(bp) != 0 || DMU_OT_IS_METADATA(type)) && type != DMU_OT_INTENT_LOG) atomic_add_64(&sle->sle_meta_count, 1); else @@ -1849,6 +1935,9 @@ spa_load(spa_t *spa, spa_load_state_t state, spa_import_type_t type, KM_SLEEP) == 0); } + nvlist_free(spa->spa_load_info); + spa->spa_load_info = fnvlist_alloc(); + gethrestime(&spa->spa_loaded_ts); error = spa_load_impl(spa, pool_guid, config, state, type, mosconfig, &ereport); @@ -1881,12 +1970,14 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, { int error = 0; nvlist_t *nvroot = NULL; + nvlist_t *label; vdev_t *rvd; uberblock_t *ub = &spa->spa_uberblock; uint64_t children, config_cache_txg = spa->spa_config_txg; int orig_mode = spa->spa_mode; int parse; uint64_t obj; + boolean_t missing_feat_write = B_FALSE; /* * If this is an untrusted config, access the pool in read-only mode. @@ -1966,19 +2057,78 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, /* * Find the best uberblock. */ - vdev_uberblock_load(NULL, rvd, ub); + vdev_uberblock_load(rvd, ub, &label); /* * If we weren't able to find a single valid uberblock, return failure. */ - if (ub->ub_txg == 0) + if (ub->ub_txg == 0) { + nvlist_free(label); return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, ENXIO)); + } /* - * If the pool is newer than the code, we can't open it. + * If the pool has an unsupported version we can't open it. */ - if (ub->ub_version > SPA_VERSION) + if (!SPA_VERSION_IS_SUPPORTED(ub->ub_version)) { + nvlist_free(label); return (spa_vdev_err(rvd, VDEV_AUX_VERSION_NEWER, ENOTSUP)); + } + + if (ub->ub_version >= SPA_VERSION_FEATURES) { + nvlist_t *features; + + /* + * If we weren't able to find what's necessary for reading the + * MOS in the label, return failure. + */ + if (label == NULL || nvlist_lookup_nvlist(label, + ZPOOL_CONFIG_FEATURES_FOR_READ, &features) != 0) { + nvlist_free(label); + return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, + ENXIO)); + } + + /* + * Update our in-core representation with the definitive values + * from the label. + */ + nvlist_free(spa->spa_label_features); + VERIFY(nvlist_dup(features, &spa->spa_label_features, 0) == 0); + } + + nvlist_free(label); + + /* + * Look through entries in the label nvlist's features_for_read. If + * there is a feature listed there which we don't understand then we + * cannot open a pool. + */ + if (ub->ub_version >= SPA_VERSION_FEATURES) { + nvlist_t *unsup_feat; + + VERIFY(nvlist_alloc(&unsup_feat, NV_UNIQUE_NAME, KM_SLEEP) == + 0); + + for (nvpair_t *nvp = nvlist_next_nvpair(spa->spa_label_features, + NULL); nvp != NULL; + nvp = nvlist_next_nvpair(spa->spa_label_features, nvp)) { + if (!zfeature_is_supported(nvpair_name(nvp))) { + VERIFY(nvlist_add_string(unsup_feat, + nvpair_name(nvp), "") == 0); + } + } + + if (!nvlist_empty(unsup_feat)) { + VERIFY(nvlist_add_nvlist(spa->spa_load_info, + ZPOOL_CONFIG_UNSUP_FEAT, unsup_feat) == 0); + nvlist_free(unsup_feat); + return (spa_vdev_err(rvd, VDEV_AUX_UNSUP_FEAT, + ENOTSUP)); + } + + nvlist_free(unsup_feat); + } /* * If the vdev guid sum doesn't match the uberblock, we have an @@ -2012,7 +2162,7 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, spa->spa_claim_max_txg = spa->spa_first_txg; spa->spa_prev_software_version = ub->ub_software_version; - error = dsl_pool_open(spa, spa->spa_first_txg, &spa->spa_dsl_pool); + error = dsl_pool_init(spa, spa->spa_first_txg, &spa->spa_dsl_pool); if (error) return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); spa->spa_meta_objset = spa->spa_dsl_pool->dp_meta_objset; @@ -2020,6 +2170,84 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, if (spa_dir_prop(spa, DMU_POOL_CONFIG, &spa->spa_config_object) != 0) return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); + if (spa_version(spa) >= SPA_VERSION_FEATURES) { + boolean_t missing_feat_read = B_FALSE; + nvlist_t *unsup_feat; + + if (spa_dir_prop(spa, DMU_POOL_FEATURES_FOR_READ, + &spa->spa_feat_for_read_obj) != 0) { + return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); + } + + if (spa_dir_prop(spa, DMU_POOL_FEATURES_FOR_WRITE, + &spa->spa_feat_for_write_obj) != 0) { + return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); + } + + if (spa_dir_prop(spa, DMU_POOL_FEATURE_DESCRIPTIONS, + &spa->spa_feat_desc_obj) != 0) { + return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); + } + + VERIFY(nvlist_alloc(&unsup_feat, NV_UNIQUE_NAME, KM_SLEEP) == + 0); + + if (!feature_is_supported(spa->spa_meta_objset, + spa->spa_feat_for_read_obj, spa->spa_feat_desc_obj, + unsup_feat)) + missing_feat_read = B_TRUE; + + if (spa_writeable(spa) || state == SPA_LOAD_TRYIMPORT) { + if (!feature_is_supported(spa->spa_meta_objset, + spa->spa_feat_for_write_obj, spa->spa_feat_desc_obj, + unsup_feat)) + missing_feat_write = B_TRUE; + } + + if (!nvlist_empty(unsup_feat)) { + VERIFY(nvlist_add_nvlist(spa->spa_load_info, + ZPOOL_CONFIG_UNSUP_FEAT, unsup_feat) == 0); + } + + nvlist_free(unsup_feat); + + if (!missing_feat_read) { + fnvlist_add_boolean(spa->spa_load_info, + ZPOOL_CONFIG_CAN_RDONLY); + } + + /* + * If the state is SPA_LOAD_TRYIMPORT, our objective is + * twofold: to determine whether the pool is available for + * import in read-write mode and (if it is not) whether the + * pool is available for import in read-only mode. If the pool + * is available for import in read-write mode, it is displayed + * as available in userland; if it is not available for import + * in read-only mode, it is displayed as unavailable in + * userland. If the pool is available for import in read-only + * mode but not read-write mode, it is displayed as unavailable + * in userland with a special note that the pool is actually + * available for open in read-only mode. + * + * As a result, if the state is SPA_LOAD_TRYIMPORT and we are + * missing a feature for write, we must first determine whether + * the pool can be opened read-only before returning to + * userland in order to know whether to display the + * abovementioned note. + */ + if (missing_feat_read || (missing_feat_write && + spa_writeable(spa))) { + return (spa_vdev_err(rvd, VDEV_AUX_UNSUP_FEAT, + ENOTSUP)); + } + } + + spa->spa_is_initializing = B_TRUE; + error = dsl_pool_open(spa->spa_dsl_pool); + spa->spa_is_initializing = B_FALSE; + if (error != 0) + return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); + if (!mosconfig) { uint64_t hostid; nvlist_t *policy = NULL, *nvconfig; @@ -2050,7 +2278,7 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, cmn_err(CE_WARN, "pool '%s' could not be " "loaded as it was last accessed by " "another system (host: %s hostid: 0x%lx). " - "See: http://www.sun.com/msg/ZFS-8000-EY", + "See: http://illumos.org/msg/ZFS-8000-EY", spa_name(spa), hostname, (unsigned long)hostid); return (EBADF); @@ -2237,7 +2465,7 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, nvlist_free(nvconfig); /* - * Now that we've validate the config, check the state of the + * Now that we've validated the config, check the state of the * root vdev. If it can't be opened, it indicates one or * more toplevel vdevs are faulted. */ @@ -2250,6 +2478,17 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, } } + if (missing_feat_write) { + ASSERT(state == SPA_LOAD_TRYIMPORT); + + /* + * At this point, we know that we can open the pool in + * read-only mode but not read-write mode. We now have enough + * information and can return to userland. + */ + return (spa_vdev_err(rvd, VDEV_AUX_UNSUP_FEAT, ENOTSUP)); + } + /* * We've successfully opened the pool, verify that we're ready * to start pushing transactions. @@ -2359,10 +2598,18 @@ spa_load_retry(spa_t *spa, spa_load_state_t state, int mosconfig) return (spa_load(spa, state, SPA_IMPORT_EXISTING, mosconfig)); } +/* + * If spa_load() fails this function will try loading prior txg's. If + * 'state' is SPA_LOAD_RECOVER and one of these loads succeeds the pool + * will be rewound to that txg. If 'state' is not SPA_LOAD_RECOVER this + * function will not rewind the pool and will return the same error as + * spa_load(). + */ static int spa_load_best(spa_t *spa, spa_load_state_t state, int mosconfig, uint64_t max_request, int rewind_flags) { + nvlist_t *loadinfo = NULL; nvlist_t *config = NULL; int load_error, rewind_error; uint64_t safe_rewind_txg; @@ -2391,9 +2638,18 @@ spa_load_best(spa_t *spa, spa_load_state_t state, int mosconfig, return (load_error); } - /* Price of rolling back is discarding txgs, including log */ - if (state == SPA_LOAD_RECOVER) + if (state == SPA_LOAD_RECOVER) { + /* Price of rolling back is discarding txgs, including log */ spa_set_log_state(spa, SPA_LOG_CLEAR); + } else { + /* + * If we aren't rolling back save the load info from our first + * import attempt so that we can restore it after attempting + * to rewind. + */ + loadinfo = spa->spa_load_info; + spa->spa_load_info = fnvlist_alloc(); + } spa->spa_load_max_txg = spa->spa_last_ubsync_txg; safe_rewind_txg = spa->spa_last_ubsync_txg - TXG_DEFER_SIZE; @@ -2417,7 +2673,20 @@ spa_load_best(spa_t *spa, spa_load_state_t state, int mosconfig, if (config && (rewind_error || state != SPA_LOAD_RECOVER)) spa_config_set(spa, config); - return (state == SPA_LOAD_RECOVER ? rewind_error : load_error); + if (state == SPA_LOAD_RECOVER) { + ASSERT3P(loadinfo, ==, NULL); + return (rewind_error); + } else { + /* Store the rewind info as part of the initial load info */ + fnvlist_add_nvlist(loadinfo, ZPOOL_CONFIG_REWIND_INFO, + spa->spa_load_info); + + /* Restore the initial load info */ + fnvlist_free(spa->spa_load_info); + spa->spa_load_info = loadinfo; + + return (load_error); + } } /* @@ -2696,8 +2965,50 @@ spa_add_l2cache(spa_t *spa, nvlist_t *config) } } +static void +spa_add_feature_stats(spa_t *spa, nvlist_t *config) +{ + nvlist_t *features; + zap_cursor_t zc; + zap_attribute_t za; + + ASSERT(spa_config_held(spa, SCL_CONFIG, RW_READER)); + VERIFY(nvlist_alloc(&features, NV_UNIQUE_NAME, KM_SLEEP) == 0); + + if (spa->spa_feat_for_read_obj != 0) { + for (zap_cursor_init(&zc, spa->spa_meta_objset, + spa->spa_feat_for_read_obj); + zap_cursor_retrieve(&zc, &za) == 0; + zap_cursor_advance(&zc)) { + ASSERT(za.za_integer_length == sizeof (uint64_t) && + za.za_num_integers == 1); + VERIFY3U(0, ==, nvlist_add_uint64(features, za.za_name, + za.za_first_integer)); + } + zap_cursor_fini(&zc); + } + + if (spa->spa_feat_for_write_obj != 0) { + for (zap_cursor_init(&zc, spa->spa_meta_objset, + spa->spa_feat_for_write_obj); + zap_cursor_retrieve(&zc, &za) == 0; + zap_cursor_advance(&zc)) { + ASSERT(za.za_integer_length == sizeof (uint64_t) && + za.za_num_integers == 1); + VERIFY3U(0, ==, nvlist_add_uint64(features, za.za_name, + za.za_first_integer)); + } + zap_cursor_fini(&zc); + } + + VERIFY(nvlist_add_nvlist(config, ZPOOL_CONFIG_FEATURE_STATS, + features) == 0); + nvlist_free(features); +} + int -spa_get_stats(const char *name, nvlist_t **config, char *altroot, size_t buflen) +spa_get_stats(const char *name, nvlist_t **config, + char *altroot, size_t buflen) { int error; spa_t *spa; @@ -2732,6 +3043,7 @@ spa_get_stats(const char *name, nvlist_t **config, char *altroot, size_t buflen) spa_add_spares(spa, *config); spa_add_l2cache(spa, *config); + spa_add_feature_stats(spa, *config); } } @@ -2952,6 +3264,7 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props, nvlist_t **spares, **l2cache; uint_t nspares, nl2cache; uint64_t version, obj; + boolean_t has_features; /* * If this pool already exists, return failure. @@ -2977,10 +3290,18 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props, return (error); } - if (nvlist_lookup_uint64(props, zpool_prop_to_name(ZPOOL_PROP_VERSION), - &version) != 0) + has_features = B_FALSE; + for (nvpair_t *elem = nvlist_next_nvpair(props, NULL); + elem != NULL; elem = nvlist_next_nvpair(props, elem)) { + if (zpool_prop_feature(nvpair_name(elem))) + has_features = B_TRUE; + } + + if (has_features || nvlist_lookup_uint64(props, + zpool_prop_to_name(ZPOOL_PROP_VERSION), &version) != 0) { version = SPA_VERSION; - ASSERT(version <= SPA_VERSION); + } + ASSERT(SPA_VERSION_IS_SUPPORTED(version)); spa->spa_first_txg = txg; spa->spa_uberblock.ub_txg = txg - 1; @@ -3056,8 +3377,10 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props, spa->spa_l2cache.sav_sync = B_TRUE; } + spa->spa_is_initializing = B_TRUE; spa->spa_dsl_pool = dp = dsl_pool_create(spa, zplprops, txg); spa->spa_meta_objset = dp->dp_meta_objset; + spa->spa_is_initializing = B_FALSE; /* * Create DDTs (dedup tables). @@ -3081,6 +3404,9 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props, cmn_err(CE_PANIC, "failed to add pool config"); } + if (spa_version(spa) >= SPA_VERSION_FEATURES) + spa_feature_create_zap_objects(spa, tx); + if (zap_add(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_CREATION_VERSION, sizeof (uint64_t), 1, &version, tx) != 0) { @@ -3272,7 +3598,7 @@ spa_import_rootpool(char *devpath, char *devid) } #endif if (config == NULL) { - cmn_err(CE_NOTE, "Can not read the pool label from '%s'", + cmn_err(CE_NOTE, "Cannot read the pool label from '%s'", devpath); return (EIO); } @@ -3592,6 +3918,8 @@ spa_tryimport(nvlist_t *tryconfig) state) == 0); VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_TIMESTAMP, spa->spa_uberblock.ub_timestamp) == 0); + VERIFY(nvlist_add_nvlist(config, ZPOOL_CONFIG_LOAD_INFO, + spa->spa_load_info) == 0); /* * If the bootfs property exists on this pool then we @@ -5317,7 +5645,7 @@ spa_sync_nvlist(spa_t *spa, uint64_t obj, nvlist_t *nv, dmu_tx_t *tx) * information. This avoids the dbuf_will_dirty() path and * saves us a pre-read to get data we don't actually care about. */ - bufsize = P2ROUNDUP(nvsize, SPA_CONFIG_BLOCKSIZE); + bufsize = P2ROUNDUP((uint64_t)nvsize, SPA_CONFIG_BLOCKSIZE); packed = kmem_alloc(bufsize, KM_SLEEP); VERIFY(nvlist_pack(nv, &packed, &nvsize, NV_ENCODE_XDR, @@ -5402,6 +5730,24 @@ spa_sync_config_object(spa_t *spa, dmu_tx_t *tx) spa_sync_nvlist(spa, spa->spa_config_object, config, tx); } +static void +spa_sync_version(void *arg1, void *arg2, dmu_tx_t *tx) +{ + spa_t *spa = arg1; + uint64_t version = *(uint64_t *)arg2; + + /* + * Setting the version is special cased when first creating the pool. + */ + ASSERT(tx->tx_txg != TXG_INITIAL); + + ASSERT(version <= SPA_VERSION); + ASSERT(version >= spa_version(spa)); + + spa->spa_uberblock.ub_version = version; + vdev_config_dirty(spa->spa_root_vdev); +} + /* * Set zpool properties. */ @@ -5411,32 +5757,38 @@ spa_sync_props(void *arg1, void *arg2, dmu_tx_t *tx) spa_t *spa = arg1; objset_t *mos = spa->spa_meta_objset; nvlist_t *nvp = arg2; - nvpair_t *elem; - uint64_t intval; - char *strval; - zpool_prop_t prop; - const char *propname; - zprop_type_t proptype; + nvpair_t *elem = NULL; mutex_enter(&spa->spa_props_lock); - elem = NULL; while ((elem = nvlist_next_nvpair(nvp, elem))) { + uint64_t intval; + char *strval, *fname; + zpool_prop_t prop; + const char *propname; + zprop_type_t proptype; + zfeature_info_t *feature; + switch (prop = zpool_name_to_prop(nvpair_name(elem))) { - case ZPOOL_PROP_VERSION: + case ZPROP_INVAL: /* - * Only set version for non-zpool-creation cases - * (set/import). spa_create() needs special care - * for version setting. + * We checked this earlier in spa_prop_validate(). */ - if (tx->tx_txg != TXG_INITIAL) { - VERIFY(nvpair_value_uint64(elem, - &intval) == 0); - ASSERT(intval <= SPA_VERSION); - ASSERT(intval >= spa_version(spa)); - spa->spa_uberblock.ub_version = intval; - vdev_config_dirty(spa->spa_root_vdev); - } + ASSERT(zpool_prop_feature(nvpair_name(elem))); + + fname = strchr(nvpair_name(elem), '@') + 1; + VERIFY3U(0, ==, zfeature_lookup_name(fname, &feature)); + + spa_feature_enable(spa, feature, tx); + break; + + case ZPOOL_PROP_VERSION: + VERIFY(nvpair_value_uint64(elem, &intval) == 0); + /* + * The version is synced seperatly before other + * properties and should be correct by now. + */ + ASSERT3U(spa_version(spa), >=, intval); break; case ZPOOL_PROP_ALTROOT: @@ -5473,14 +5825,10 @@ spa_sync_props(void *arg1, void *arg2, dmu_tx_t *tx) * Set pool property values in the poolprops mos object. */ if (spa->spa_pool_props_object == 0) { - VERIFY((spa->spa_pool_props_object = - zap_create(mos, DMU_OT_POOL_PROPS, - DMU_OT_NONE, 0, tx)) > 0); - - VERIFY(zap_update(mos, + spa->spa_pool_props_object = + zap_create_link(mos, DMU_OT_POOL_PROPS, DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_PROPS, - 8, 1, &spa->spa_pool_props_object, tx) - == 0); + tx); } /* normalize the property name */ @@ -5579,6 +5927,11 @@ spa_sync_upgrades(spa_t *spa, dmu_tx_t *tx) /* Keeping the freedir open increases spa_minref */ spa->spa_minref += 3; } + + if (spa->spa_ubsync.ub_version < SPA_VERSION_FEATURES && + spa->spa_uberblock.ub_version >= SPA_VERSION_FEATURES) { + spa_feature_create_zap_objects(spa, tx); + } } /* diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_config.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_config.c index a07223352d0..3dae0ba1eeb 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_config.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_config.c @@ -22,7 +22,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -35,6 +35,7 @@ #include #include #include +#include #ifdef _KERNEL #include #include @@ -407,6 +408,12 @@ spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg, int getstats) VERIFY(nvlist_add_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, nvroot) == 0); nvlist_free(nvroot); + /* + * Store what's necessary for reading the MOS in the label. + */ + VERIFY(nvlist_add_nvlist(config, ZPOOL_CONFIG_FEATURES_FOR_READ, + spa->spa_label_features) == 0); + if (getstats && spa_load_state(spa) == SPA_LOAD_NONE) { ddt_histogram_t *ddh; ddt_stat_t *dds; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c index 63424527b72..83c3d31fe31 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c @@ -20,7 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. */ @@ -48,6 +48,7 @@ #include #include #include "zfs_prop.h" +#include "zfeature_common.h" /* * SPA locking @@ -216,7 +217,7 @@ * Like spa_vdev_enter/exit, these are convenience wrappers -- the actual * locking is, always, based on spa_namespace_lock and spa_config_lock[]. * - * spa_rename() is also implemented within this file since is requires + * spa_rename() is also implemented within this file since it requires * manipulation of the namespace. */ @@ -487,8 +488,22 @@ spa_add(const char *name, nvlist_t *config, const char *altroot) VERIFY(nvlist_alloc(&spa->spa_load_info, NV_UNIQUE_NAME, KM_SLEEP) == 0); - if (config != NULL) + if (config != NULL) { + nvlist_t *features; + + if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_FEATURES_FOR_READ, + &features) == 0) { + VERIFY(nvlist_dup(features, &spa->spa_label_features, + 0) == 0); + } + VERIFY(nvlist_dup(config, &spa->spa_config, 0) == 0); + } + + if (spa->spa_label_features == NULL) { + VERIFY(nvlist_alloc(&spa->spa_label_features, NV_UNIQUE_NAME, + KM_SLEEP) == 0); + } return (spa); } @@ -525,6 +540,7 @@ spa_remove(spa_t *spa) list_destroy(&spa->spa_config_list); + nvlist_free(spa->spa_label_features); nvlist_free(spa->spa_load_info); spa_config_set(spa, NULL); @@ -1033,6 +1049,20 @@ spa_vdev_state_exit(spa_t *spa, vdev_t *vd, int error) * ========================================================================== */ +void +spa_activate_mos_feature(spa_t *spa, const char *feature) +{ + (void) nvlist_add_boolean(spa->spa_label_features, feature); + vdev_config_dirty(spa->spa_root_vdev); +} + +void +spa_deactivate_mos_feature(spa_t *spa, const char *feature) +{ + (void) nvlist_remove_all(spa->spa_label_features, feature); + vdev_config_dirty(spa->spa_root_vdev); +} + /* * Rename a spa_t. */ @@ -1183,12 +1213,22 @@ spa_generate_guid(spa_t *spa) void sprintf_blkptr(char *buf, const blkptr_t *bp) { - char *type = NULL; + char type[256]; char *checksum = NULL; char *compress = NULL; if (bp != NULL) { - type = dmu_ot[BP_GET_TYPE(bp)].ot_name; + if (BP_GET_TYPE(bp) & DMU_OT_NEWTYPE) { + dmu_object_byteswap_t bswap = + DMU_OT_BYTESWAP(BP_GET_TYPE(bp)); + (void) snprintf(type, sizeof (type), "bswap %s %s", + DMU_OT_IS_METADATA(BP_GET_TYPE(bp)) ? + "metadata" : "data", + dmu_ot_byteswap[bswap].ob_name); + } else { + (void) strlcpy(type, dmu_ot[BP_GET_TYPE(bp)].ot_name, + sizeof (type)); + } checksum = zio_checksum_table[BP_GET_CHECKSUM(bp)].ci_name; compress = zio_compress_table[BP_GET_COMPRESS(bp)].ci_name; } @@ -1270,6 +1310,12 @@ spa_get_dsl(spa_t *spa) return (spa->spa_dsl_pool); } +boolean_t +spa_is_initializing(spa_t *spa) +{ + return (spa->spa_is_initializing); +} + blkptr_t * spa_get_rootblkptr(spa_t *spa) { @@ -1553,6 +1599,7 @@ spa_init(int mode) vdev_cache_stat_init(); zfs_prop_init(); zpool_prop_init(); + zpool_feature_init(); spa_config_load(); l2arc_start(); } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/space_map.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/space_map.c index a8df1c70460..ef5fb620283 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/space_map.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/space_map.c @@ -173,7 +173,6 @@ again: void space_map_remove(space_map_t *sm, uint64_t start, uint64_t size) { - avl_index_t where; space_seg_t ssearch, *ss, *newseg; uint64_t end = start + size; int left_over, right_over; @@ -185,7 +184,7 @@ space_map_remove(space_map_t *sm, uint64_t start, uint64_t size) ssearch.ss_start = start; ssearch.ss_end = end; - ss = avl_find(&sm->sm_root, &ssearch, &where); + ss = avl_find(&sm->sm_root, &ssearch, NULL); /* Make sure we completely overlap with someone */ if (ss == NULL) { @@ -196,7 +195,7 @@ space_map_remove(space_map_t *sm, uint64_t start, uint64_t size) } VERIFY3U(ss->ss_start, <=, start); VERIFY3U(ss->ss_end, >=, end); - VERIFY(sm->sm_space - size <= sm->sm_size); + VERIFY(sm->sm_space - size < sm->sm_size); left_over = (ss->ss_start != start); right_over = (ss->ss_end != end); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/bptree.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/bptree.h new file mode 100644 index 00000000000..97150721187 --- /dev/null +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/bptree.h @@ -0,0 +1,64 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +#ifndef _SYS_BPTREE_H +#define _SYS_BPTREE_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct bptree_phys { + uint64_t bt_begin; + uint64_t bt_end; + uint64_t bt_bytes; + uint64_t bt_comp; + uint64_t bt_uncomp; +} bptree_phys_t; + +typedef struct bptree_entry_phys { + blkptr_t be_bp; + uint64_t be_birth_txg; /* only delete blocks born after this txg */ + zbookmark_t be_zb; /* holds traversal resume point if needed */ +} bptree_entry_phys_t; + +typedef int bptree_itor_t(void *arg, const blkptr_t *bp, dmu_tx_t *tx); + +uint64_t bptree_alloc(objset_t *os, dmu_tx_t *tx); +int bptree_free(objset_t *os, uint64_t obj, dmu_tx_t *tx); + +void bptree_add(objset_t *os, uint64_t obj, blkptr_t *bp, uint64_t birth_txg, + uint64_t bytes, uint64_t comp, uint64_t uncomp, dmu_tx_t *tx); + +int bptree_iterate(objset_t *os, uint64_t obj, boolean_t free, + bptree_itor_t func, void *arg, dmu_tx_t *tx); + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_BPTREE_H */ diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h index 585acf310d0..c6943e14bd9 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h @@ -18,12 +18,12 @@ * * CDDL HEADER END */ + /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. - */ -/* + * Copyright (c) 2012 by Delphix. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. */ /* Portions Copyright 2010 Robert Milkowski */ @@ -74,6 +74,53 @@ typedef struct objset objset_t; typedef struct dmu_tx dmu_tx_t; typedef struct dsl_dir dsl_dir_t; +typedef enum dmu_object_byteswap { + DMU_BSWAP_UINT8, + DMU_BSWAP_UINT16, + DMU_BSWAP_UINT32, + DMU_BSWAP_UINT64, + DMU_BSWAP_ZAP, + DMU_BSWAP_DNODE, + DMU_BSWAP_OBJSET, + DMU_BSWAP_ZNODE, + DMU_BSWAP_OLDACL, + DMU_BSWAP_ACL, + /* + * Allocating a new byteswap type number makes the on-disk format + * incompatible with any other format that uses the same number. + * + * Data can usually be structured to work with one of the + * DMU_BSWAP_UINT* or DMU_BSWAP_ZAP types. + */ + DMU_BSWAP_NUMFUNCS +} dmu_object_byteswap_t; + +#define DMU_OT_NEWTYPE 0x80 +#define DMU_OT_METADATA 0x40 +#define DMU_OT_BYTESWAP_MASK 0x3f + +/* + * Defines a uint8_t object type. Object types specify if the data + * in the object is metadata (boolean) and how to byteswap the data + * (dmu_object_byteswap_t). + */ +#define DMU_OT(byteswap, metadata) \ + (DMU_OT_NEWTYPE | \ + ((metadata) ? DMU_OT_METADATA : 0) | \ + ((byteswap) & DMU_OT_BYTESWAP_MASK)) + +#define DMU_OT_IS_VALID(ot) (((ot) & DMU_OT_NEWTYPE) ? \ + ((ot) & DMU_OT_BYTESWAP_MASK) < DMU_BSWAP_NUMFUNCS : \ + (ot) < DMU_OT_NUMTYPES) + +#define DMU_OT_IS_METADATA(ot) (((ot) & DMU_OT_NEWTYPE) ? \ + ((ot) & DMU_OT_METADATA) : \ + dmu_ot[(ot)].ot_metadata) + +#define DMU_OT_BYTESWAP(ot) (((ot) & DMU_OT_NEWTYPE) ? \ + ((ot) & DMU_OT_BYTESWAP_MASK) : \ + dmu_ot[(ot)].ot_byteswap) + typedef enum dmu_object_type { DMU_OT_NONE, /* general: */ @@ -138,7 +185,35 @@ typedef enum dmu_object_type { DMU_OT_DEADLIST_HDR, /* UINT64 */ DMU_OT_DSL_CLONES, /* ZAP */ DMU_OT_BPOBJ_SUBOBJ, /* UINT64 */ - DMU_OT_NUMTYPES + /* + * Do not allocate new object types here. Doing so makes the on-disk + * format incompatible with any other format that uses the same object + * type number. + * + * When creating an object which does not have one of the above types + * use the DMU_OTN_* type with the correct byteswap and metadata + * values. + * + * The DMU_OTN_* types do not have entries in the dmu_ot table, + * use the DMU_OT_IS_METDATA() and DMU_OT_BYTESWAP() macros instead + * of indexing into dmu_ot directly (this works for both DMU_OT_* types + * and DMU_OTN_* types). + */ + DMU_OT_NUMTYPES, + + /* + * Names for valid types declared with DMU_OT(). + */ + DMU_OTN_UINT8_DATA = DMU_OT(DMU_BSWAP_UINT8, B_FALSE), + DMU_OTN_UINT8_METADATA = DMU_OT(DMU_BSWAP_UINT8, B_TRUE), + DMU_OTN_UINT16_DATA = DMU_OT(DMU_BSWAP_UINT16, B_FALSE), + DMU_OTN_UINT16_METADATA = DMU_OT(DMU_BSWAP_UINT16, B_TRUE), + DMU_OTN_UINT32_DATA = DMU_OT(DMU_BSWAP_UINT32, B_FALSE), + DMU_OTN_UINT32_METADATA = DMU_OT(DMU_BSWAP_UINT32, B_TRUE), + DMU_OTN_UINT64_DATA = DMU_OT(DMU_BSWAP_UINT64, B_FALSE), + DMU_OTN_UINT64_METADATA = DMU_OT(DMU_BSWAP_UINT64, B_TRUE), + DMU_OTN_ZAP_DATA = DMU_OT(DMU_BSWAP_ZAP, B_FALSE), + DMU_OTN_ZAP_METADATA = DMU_OT(DMU_BSWAP_ZAP, B_TRUE), } dmu_object_type_t; typedef enum dmu_objset_type { @@ -220,6 +295,9 @@ typedef void dmu_buf_evict_func_t(struct dmu_buf *db, void *user_ptr); */ #define DMU_POOL_DIRECTORY_OBJECT 1 #define DMU_POOL_CONFIG "config" +#define DMU_POOL_FEATURES_FOR_WRITE "features_for_write" +#define DMU_POOL_FEATURES_FOR_READ "features_for_read" +#define DMU_POOL_FEATURE_DESCRIPTIONS "feature_descriptions" #define DMU_POOL_ROOT_DATASET "root_dataset" #define DMU_POOL_SYNC_BPOBJ "sync_bplist" #define DMU_POOL_ERRLOG_SCRUB "errlog_scrub" @@ -235,6 +313,7 @@ typedef void dmu_buf_evict_func_t(struct dmu_buf *db, void *user_ptr); #define DMU_POOL_CREATION_VERSION "creation_version" #define DMU_POOL_SCAN "scan" #define DMU_POOL_FREE_BPOBJ "free_bpobj" +#define DMU_POOL_BPTREE_OBJ "bptree_obj" /* * Allocate an object from this objset. The range of object numbers @@ -495,7 +574,7 @@ void dmu_tx_callback_register(dmu_tx_t *tx, dmu_tx_callback_func_t *dcb_func, /* * Free up the data blocks for a defined range of a file. If size is - * zero, the range from offset to end-of-file is freed. + * -1, the range from offset to end-of-file is freed. */ int dmu_free_range(objset_t *os, uint64_t object, uint64_t offset, uint64_t size, dmu_tx_t *tx); @@ -565,12 +644,18 @@ typedef struct dmu_object_info { typedef void arc_byteswap_func_t(void *buf, size_t size); typedef struct dmu_object_type_info { - arc_byteswap_func_t *ot_byteswap; + dmu_object_byteswap_t ot_byteswap; boolean_t ot_metadata; char *ot_name; } dmu_object_type_info_t; +typedef struct dmu_object_byteswap_info { + arc_byteswap_func_t *ob_func; + char *ob_name; +} dmu_object_byteswap_info_t; + extern const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES]; +extern const dmu_object_byteswap_info_t dmu_ot_byteswap[DMU_BSWAP_NUMFUNCS]; /* * Get information on a DMU object. @@ -706,8 +791,8 @@ typedef void (*dmu_traverse_cb_t)(objset_t *os, void *arg, struct blkptr *bp, void dmu_traverse_objset(objset_t *os, uint64_t txg_start, dmu_traverse_cb_t cb, void *arg); -int dmu_sendbackup(objset_t *tosnap, objset_t *fromsnap, boolean_t fromorigin, - struct file *fp, offset_t *off); +int dmu_send(objset_t *tosnap, objset_t *fromsnap, boolean_t fromorigin, + int outfd, struct file *fp, offset_t *off); int dmu_send_estimate(objset_t *tosnap, objset_t *fromsnap, boolean_t fromorigin, uint64_t *sizep); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_impl.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_impl.h index 2cb7f121cc0..e28112180bc 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_impl.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_impl.h @@ -21,6 +21,8 @@ /* * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. + * Copyright (c) 2012, Martin Matuska . All rights reserved. */ #ifndef _SYS_DMU_IMPL_H @@ -31,6 +33,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { @@ -265,6 +268,33 @@ static xuio_stats_t xuio_stats = { atomic_add_64(&xuio_stats.stat.value.ui64, (val)) #define XUIOSTAT_BUMP(stat) XUIOSTAT_INCR(stat, 1) +/* + * The list of data whose inclusion in a send stream can be pending from + * one call to backup_cb to another. Multiple calls to dump_free() and + * dump_freeobjects() can be aggregated into a single DRR_FREE or + * DRR_FREEOBJECTS replay record. + */ +typedef enum { + PENDING_NONE, + PENDING_FREE, + PENDING_FREEOBJECTS +} dmu_pendop_t; + +typedef struct dmu_sendarg { + list_node_t dsa_link; + dmu_replay_record_t *dsa_drr; + kthread_t *dsa_td; + struct file *dsa_fp; + int dsa_outfd; + struct proc *dsa_proc; + offset_t *dsa_off; + objset_t *dsa_os; + zio_cksum_t dsa_zc; + uint64_t dsa_toguid; + int dsa_err; + dmu_pendop_t dsa_pending_op; +} dmu_sendarg_t; + #ifdef __cplusplus } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_traverse.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_traverse.h index 5b326cd99c0..3cbf42f56a6 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_traverse.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_traverse.h @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #ifndef _SYS_DMU_TRAVERSE_H @@ -54,6 +55,9 @@ typedef int (blkptr_cb_t)(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, int traverse_dataset(struct dsl_dataset *ds, uint64_t txg_start, int flags, blkptr_cb_t func, void *arg); +int traverse_dataset_destroyed(spa_t *spa, blkptr_t *blkptr, + uint64_t txg_start, zbookmark_t *resume, int flags, + blkptr_cb_t func, void *arg); int traverse_pool(spa_t *spa, uint64_t txg_start, int flags, blkptr_cb_t func, void *arg); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h index 50b2e7bc928..e3affeb0eb8 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h @@ -22,7 +22,8 @@ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011 Pawel Jakub Dawidek . * All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. */ #ifndef _SYS_DSL_DATASET_H @@ -87,7 +88,12 @@ typedef struct dsl_dataset_phys { uint64_t ds_creation_time; /* seconds since 1970 */ uint64_t ds_creation_txg; uint64_t ds_deadlist_obj; /* DMU_OT_DEADLIST */ - uint64_t ds_used_bytes; + /* + * ds_referenced_bytes, ds_compressed_bytes, and ds_uncompressed_bytes + * include all blocks referenced by this dataset, including those + * shared with any other datasets. + */ + uint64_t ds_referenced_bytes; uint64_t ds_compressed_bytes; uint64_t ds_uncompressed_bytes; uint64_t ds_unique_bytes; /* only relevant to snapshots */ @@ -152,6 +158,9 @@ typedef struct dsl_dataset { uint64_t ds_reserved; /* cached refreservation */ uint64_t ds_quota; /* cached refquota */ + kmutex_t ds_sendstream_lock; + list_t ds_sendstreams; + /* Protected by ds_lock; keep at end of struct for better locality */ char ds_snapname[MAXNAMELEN]; } dsl_dataset_t; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_pool.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_pool.h index 57725b5ecd9..e2c12ab46d3 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_pool.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_pool.h @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #ifndef _SYS_DSL_POOL_H @@ -34,6 +35,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { @@ -48,7 +50,8 @@ struct dsl_scan; /* These macros are for indexing into the zfs_all_blkstats_t. */ #define DMU_OT_DEFERRED DMU_OT_NONE -#define DMU_OT_TOTAL DMU_OT_NUMTYPES +#define DMU_OT_OTHER DMU_OT_NUMTYPES /* place holder for DMU_OT() types */ +#define DMU_OT_TOTAL (DMU_OT_NUMTYPES + 1) typedef struct zfs_blkstat { uint64_t zb_count; @@ -85,6 +88,7 @@ typedef struct dsl_pool { uint64_t dp_write_limit; uint64_t dp_tmp_userrefs_obj; bpobj_t dp_free_bpobj; + uint64_t dp_bptree_obj; struct dsl_scan *dp_scan; @@ -110,7 +114,8 @@ typedef struct dsl_pool { zfs_all_blkstats_t *dp_blkstats; } dsl_pool_t; -int dsl_pool_open(spa_t *spa, uint64_t txg, dsl_pool_t **dpp); +int dsl_pool_init(spa_t *spa, uint64_t txg, dsl_pool_t **dpp); +int dsl_pool_open(dsl_pool_t *dp); void dsl_pool_close(dsl_pool_t *dp); dsl_pool_t *dsl_pool_create(spa_t *spa, nvlist_t *zplprops, uint64_t txg); void dsl_pool_sync(dsl_pool_t *dp, uint64_t txg); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_scan.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_scan.h index c79666e67de..5691f4d14d9 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_scan.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_scan.h @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #ifndef _SYS_DSL_SCAN_H @@ -79,6 +80,9 @@ typedef struct dsl_scan { uint64_t scn_sync_start_time; zio_t *scn_zio_root; + /* for freeing blocks */ + boolean_t scn_is_bptree; + /* for debugging / information */ uint64_t scn_visited_this_txg; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h index a2a76e3d621..ec6914e3314 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h @@ -20,7 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. */ @@ -94,7 +94,7 @@ struct dsl_pool; /* * Size of block to hold the configuration data (a packed nvlist) */ -#define SPA_CONFIG_BLOCKSIZE (1 << 14) +#define SPA_CONFIG_BLOCKSIZE (1ULL << 14) /* * The DVA size encodings for LSIZE and PSIZE support blocks up to 32MB. @@ -262,7 +262,7 @@ typedef struct blkptr { DVA_GET_ASIZE(&(bp)->blk_dva[2])) #define BP_GET_UCSIZE(bp) \ - ((BP_GET_LEVEL(bp) > 0 || dmu_ot[BP_GET_TYPE(bp)].ot_metadata) ? \ + ((BP_GET_LEVEL(bp) > 0 || DMU_OT_IS_METADATA(BP_GET_TYPE(bp))) ? \ BP_GET_PSIZE(bp) : BP_GET_LSIZE(bp)) #define BP_GET_NDVAS(bp) \ @@ -403,8 +403,8 @@ typedef struct blkptr { #include #define BP_GET_BUFC_TYPE(bp) \ - (((BP_GET_LEVEL(bp) > 0) || (dmu_ot[BP_GET_TYPE(bp)].ot_metadata)) ? \ - ARC_BUFC_METADATA : ARC_BUFC_DATA); + (((BP_GET_LEVEL(bp) > 0) || (DMU_OT_IS_METADATA(BP_GET_TYPE(bp)))) ? \ + ARC_BUFC_METADATA : ARC_BUFC_DATA) typedef enum spa_import_type { SPA_IMPORT_EXISTING, @@ -415,8 +415,8 @@ typedef enum spa_import_type { extern int spa_open(const char *pool, spa_t **, void *tag); extern int spa_open_rewind(const char *pool, spa_t **, void *tag, nvlist_t *policy, nvlist_t **config); -extern int spa_get_stats(const char *pool, nvlist_t **config, - char *altroot, size_t buflen); +extern int spa_get_stats(const char *pool, nvlist_t **config, char *altroot, + size_t buflen); extern int spa_create(const char *pool, nvlist_t *config, nvlist_t *props, const char *history_str, nvlist_t *zplprops); extern int spa_import_rootpool(char *devpath, char *devid); @@ -573,6 +573,7 @@ extern void spa_claim_notify(zio_t *zio); /* Accessor functions */ extern boolean_t spa_shutting_down(spa_t *spa); extern struct dsl_pool *spa_get_dsl(spa_t *spa); +extern boolean_t spa_is_initializing(spa_t *spa); extern blkptr_t *spa_get_rootblkptr(spa_t *spa); extern void spa_set_rootblkptr(spa_t *spa, const blkptr_t *bp); extern void spa_altroot(spa_t *, char *, size_t); @@ -604,6 +605,8 @@ extern uint64_t spa_delegation(spa_t *spa); extern objset_t *spa_meta_objset(spa_t *spa); /* Miscellaneous support routines */ +extern void spa_activate_mos_feature(spa_t *spa, const char *feature); +extern void spa_deactivate_mos_feature(spa_t *spa, const char *feature); extern int spa_rename(const char *oldname, const char *newname); extern spa_t *spa_by_guid(uint64_t pool_guid, uint64_t device_guid); extern boolean_t spa_guid_exists(uint64_t pool_guid, uint64_t device_guid); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h index 88d14773900..b4276743b11 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h @@ -20,7 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. */ @@ -127,6 +127,7 @@ struct spa { uint64_t spa_import_flags; /* import specific flags */ taskq_t *spa_zio_taskq[ZIO_TYPES][ZIO_TASKQ_TYPES]; dsl_pool_t *spa_dsl_pool; + boolean_t spa_is_initializing; /* true while opening pool */ metaslab_class_t *spa_normal_class; /* normal data class */ metaslab_class_t *spa_log_class; /* intent log data class */ uint64_t spa_first_txg; /* first txg after spa_open() */ @@ -144,6 +145,7 @@ struct spa { list_t spa_state_dirty_list; /* vdevs with dirty state */ spa_aux_vdev_t spa_spares; /* hot spares */ spa_aux_vdev_t spa_l2cache; /* L2ARC cache devices */ + nvlist_t *spa_label_features; /* Features for reading MOS */ uint64_t spa_config_object; /* MOS object for pool config */ uint64_t spa_config_generation; /* config generation number */ uint64_t spa_syncing_txg; /* txg currently syncing */ @@ -220,7 +222,10 @@ struct spa { boolean_t spa_autoreplace; /* autoreplace set in open */ int spa_vdev_locks; /* locks grabbed */ uint64_t spa_creation_version; /* version at pool creation */ - uint64_t spa_prev_software_version; + uint64_t spa_prev_software_version; /* See ub_software_version */ + uint64_t spa_feat_for_write_obj; /* required to write to pool */ + uint64_t spa_feat_for_read_obj; /* required to read from pool */ + uint64_t spa_feat_desc_obj; /* Feature descriptions */ /* * spa_refcnt & spa_config_lock must be the last elements * because refcount_t changes size based on compilation options. diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h index aa6559c801f..2329d5b85c6 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h @@ -18,6 +18,7 @@ * * CDDL HEADER END */ + /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012 by Delphix. All rights reserved. @@ -141,8 +142,8 @@ extern nvlist_t *vdev_config_generate(spa_t *spa, vdev_t *vd, struct uberblock; extern uint64_t vdev_label_offset(uint64_t psize, int l, uint64_t offset); extern int vdev_label_number(uint64_t psise, uint64_t offset); -extern nvlist_t *vdev_label_read_config(vdev_t *vd); -extern void vdev_uberblock_load(zio_t *zio, vdev_t *vd, struct uberblock *ub); +extern nvlist_t *vdev_label_read_config(vdev_t *vd, int label); +extern void vdev_uberblock_load(vdev_t *, struct uberblock *, nvlist_t **); typedef enum { VDEV_LABEL_CREATE, /* create/add a new device */ diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h index 992ce0cf276..7eed4a18867 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #ifndef _SYS_VDEV_IMPL_H @@ -55,7 +56,8 @@ typedef struct vdev_cache_entry vdev_cache_entry_t; /* * Virtual device operations */ -typedef int vdev_open_func_t(vdev_t *vd, uint64_t *size, uint64_t *ashift); +typedef int vdev_open_func_t(vdev_t *vd, uint64_t *size, uint64_t *max_size, + uint64_t *ashift); typedef void vdev_close_func_t(vdev_t *vd); typedef uint64_t vdev_asize_func_t(vdev_t *vd, uint64_t psize); typedef int vdev_io_start_func_t(zio_t *zio); @@ -118,6 +120,7 @@ struct vdev { uint64_t vdev_orig_guid; /* orig. guid prior to remove */ uint64_t vdev_asize; /* allocatable device capacity */ uint64_t vdev_min_asize; /* min acceptable asize */ + uint64_t vdev_max_asize; /* max acceptable asize */ uint64_t vdev_ashift; /* block alignment shift */ uint64_t vdev_state; /* see VDEV_STATE_* #defines */ uint64_t vdev_prevstate; /* used when reopening a vdev */ @@ -199,7 +202,7 @@ struct vdev { * For DTrace to work in userland (libzpool) context, these fields must * remain at the end of the structure. DTrace will use the kernel's * CTF definition for 'struct vdev', and since the size of a kmutex_t is - * larger in userland, the offsets for the rest fields would be + * larger in userland, the offsets for the rest of the fields would be * incorrect. */ kmutex_t vdev_dtl_lock; /* vdev_dtl_{map,resilver} */ @@ -254,6 +257,7 @@ typedef struct vdev_label { #define VDEV_LABEL_START_SIZE (2 * sizeof (vdev_label_t) + VDEV_BOOT_SIZE) #define VDEV_LABEL_END_SIZE (2 * sizeof (vdev_label_t)) #define VDEV_LABELS 4 +#define VDEV_BEST_LABEL VDEV_LABELS #define VDEV_ALLOC_LOAD 0 #define VDEV_ALLOC_ADD 1 diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zap.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zap.h index a1130bbbaaa..4d7b315597c 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zap.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zap.h @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #ifndef _SYS_ZAP_H @@ -132,6 +133,8 @@ uint64_t zap_create_norm(objset_t *ds, int normflags, dmu_object_type_t ot, uint64_t zap_create_flags(objset_t *os, int normflags, zap_flags_t flags, dmu_object_type_t ot, int leaf_blockshift, int indirect_blockshift, dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx); +uint64_t zap_create_link(objset_t *os, dmu_object_type_t ot, + uint64_t parent_obj, const char *name, dmu_tx_t *tx); /* * Create a new zapobj with no attributes from the given (unallocated) @@ -300,12 +303,6 @@ int zap_add_int_key(objset_t *os, uint64_t obj, int zap_lookup_int_key(objset_t *os, uint64_t obj, uint64_t key, uint64_t *valuep); -/* - * They name is a stringified version of key; increment its value by - * delta. Zero values will be zap_remove()-ed. - */ -int zap_increment_int(objset_t *os, uint64_t obj, uint64_t key, int64_t delta, - dmu_tx_t *tx); int zap_increment(objset_t *os, uint64_t obj, const char *name, int64_t delta, dmu_tx_t *tx); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfeature.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfeature.h new file mode 100644 index 00000000000..9ff1c93df7f --- /dev/null +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfeature.h @@ -0,0 +1,52 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +#ifndef _SYS_ZFEATURE_H +#define _SYS_ZFEATURE_H + +#include +#include +#include "zfeature_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern boolean_t feature_is_supported(objset_t *os, uint64_t obj, + uint64_t desc_obj, nvlist_t *unsup_feat); + +struct spa; +extern void spa_feature_create_zap_objects(struct spa *, dmu_tx_t *); +extern void spa_feature_enable(struct spa *, zfeature_info_t *, dmu_tx_t *); +extern void spa_feature_incr(struct spa *, zfeature_info_t *, dmu_tx_t *); +extern void spa_feature_decr(struct spa *, zfeature_info_t *, dmu_tx_t *); +extern boolean_t spa_feature_is_enabled(struct spa *, zfeature_info_t *); +extern boolean_t spa_feature_is_active(struct spa *, zfeature_info_t *); + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_ZFEATURE_H */ diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h index 4a4e843a1bb..80d9336383c 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h @@ -21,6 +21,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #ifndef _ZIO_H @@ -270,6 +271,14 @@ typedef struct zbookmark { #define ZB_ZIL_OBJECT (0ULL) #define ZB_ZIL_LEVEL (-2LL) +#define ZB_IS_ZERO(zb) \ + ((zb)->zb_objset == 0 && (zb)->zb_object == 0 && \ + (zb)->zb_level == 0 && (zb)->zb_blkid == 0) +#define ZB_IS_ROOT(zb) \ + ((zb)->zb_object == ZB_ROOT_OBJECT && \ + (zb)->zb_level == ZB_ROOT_LEVEL && \ + (zb)->zb_blkid == ZB_ROOT_BLKID) + typedef struct zio_prop { enum zio_checksum zp_checksum; enum zio_compress zp_compress; @@ -287,6 +296,7 @@ typedef void zio_cksum_finish_f(zio_cksum_report_t *rep, typedef void zio_cksum_free_f(void *cbdata, size_t size); struct zio_bad_cksum; /* defined in zio_checksum.h */ +struct dnode_phys; struct zio_cksum_report { struct zio_cksum_report *zcr_next; @@ -559,6 +569,10 @@ extern void zfs_ereport_post_checksum(spa_t *spa, vdev_t *vd, /* Called from spa_sync(), but primarily an injection handler */ extern void spa_handle_ignored_writes(spa_t *spa); +/* zbookmark functions */ +boolean_t zbookmark_is_before(const struct dnode_phys *dnp, + const zbookmark_t *zb1, const zbookmark_t *zb2); + #ifdef __cplusplus } #endif diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h index d90bd8bd592..9a58ac04869 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h @@ -61,7 +61,7 @@ enum zio_stage { ZIO_STAGE_READY = 1 << 15, /* RWFCI */ ZIO_STAGE_VDEV_IO_START = 1 << 16, /* RW--I */ - ZIO_STAGE_VDEV_IO_DONE = 1 << 17, /* RW--I */ + ZIO_STAGE_VDEV_IO_DONE = 1 << 17, /* RW--- */ ZIO_STAGE_VDEV_IO_ASSESS = 1 << 18, /* RW--I */ ZIO_STAGE_CHECKSUM_VERIFY = 1 << 19, /* R---- */ diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c index b5d6fda56bc..950f2f17be4 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c @@ -22,7 +22,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -67,12 +67,6 @@ static vdev_ops_t *vdev_ops_table[] = { NULL }; -/* maximum scrub/resilver I/O queue per leaf vdev */ -int zfs_scrub_limit = 10; - -TUNABLE_INT("vfs.zfs.scrub_limit", &zfs_scrub_limit); -SYSCTL_INT(_vfs_zfs, OID_AUTO, scrub_limit, CTLFLAG_RDTUN, &zfs_scrub_limit, 0, - "Maximum scrub/resilver I/O queue"); /* * Given a vdev type, return the appropriate ops vector. @@ -119,7 +113,7 @@ vdev_get_min_asize(vdev_t *vd) vdev_t *pvd = vd->vdev_parent; /* - * The our parent is NULL (inactive spare or cache) or is the root, + * If our parent is NULL (inactive spare or cache) or is the root, * just return our own asize. */ if (pvd == NULL) @@ -748,6 +742,7 @@ vdev_add_parent(vdev_t *cvd, vdev_ops_t *ops) mvd->vdev_asize = cvd->vdev_asize; mvd->vdev_min_asize = cvd->vdev_min_asize; + mvd->vdev_max_asize = cvd->vdev_max_asize; mvd->vdev_ashift = cvd->vdev_ashift; mvd->vdev_state = cvd->vdev_state; mvd->vdev_crtxg = cvd->vdev_crtxg; @@ -1119,7 +1114,8 @@ vdev_open(vdev_t *vd) spa_t *spa = vd->vdev_spa; int error; uint64_t osize = 0; - uint64_t asize, psize; + uint64_t max_osize = 0; + uint64_t asize, max_asize, psize; uint64_t ashift = 0; ASSERT(vd->vdev_open_thread == curthread || @@ -1150,7 +1146,7 @@ vdev_open(vdev_t *vd) return (ENXIO); } - error = vd->vdev_ops->vdev_op_open(vd, &osize, &ashift); + error = vd->vdev_ops->vdev_op_open(vd, &osize, &max_osize, &ashift); /* * Reset the vdev_reopening flag so that we actually close @@ -1208,6 +1204,7 @@ vdev_open(vdev_t *vd) } osize = P2ALIGN(osize, (uint64_t)sizeof (vdev_label_t)); + max_osize = P2ALIGN(max_osize, (uint64_t)sizeof (vdev_label_t)); if (vd->vdev_children == 0) { if (osize < SPA_MINDEVSIZE) { @@ -1217,6 +1214,8 @@ vdev_open(vdev_t *vd) } psize = osize; asize = osize - (VDEV_LABEL_START_SIZE + VDEV_LABEL_END_SIZE); + max_asize = max_osize - (VDEV_LABEL_START_SIZE + + VDEV_LABEL_END_SIZE); } else { if (vd->vdev_parent != NULL && osize < SPA_MINDEVSIZE - (VDEV_LABEL_START_SIZE + VDEV_LABEL_END_SIZE)) { @@ -1226,6 +1225,7 @@ vdev_open(vdev_t *vd) } psize = 0; asize = osize; + max_asize = max_osize; } vd->vdev_psize = psize; @@ -1245,6 +1245,7 @@ vdev_open(vdev_t *vd) * For testing purposes, a higher ashift can be requested. */ vd->vdev_asize = asize; + vd->vdev_max_asize = max_asize; vd->vdev_ashift = MAX(ashift, vd->vdev_ashift); } else { /* @@ -1255,6 +1256,7 @@ vdev_open(vdev_t *vd) VDEV_AUX_BAD_LABEL); return (EINVAL); } + vd->vdev_max_asize = max_asize; } /* @@ -1327,7 +1329,8 @@ vdev_validate(vdev_t *vd, boolean_t strict) uint64_t aux_guid = 0; nvlist_t *nvl; - if ((label = vdev_label_read_config(vd)) == NULL) { + if ((label = vdev_label_read_config(vd, VDEV_BEST_LABEL)) == + NULL) { vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, VDEV_AUX_BAD_LABEL); return (0); @@ -1968,14 +1971,14 @@ vdev_validate_aux(vdev_t *vd) if (!vdev_readable(vd)) return (0); - if ((label = vdev_label_read_config(vd)) == NULL) { + if ((label = vdev_label_read_config(vd, VDEV_BEST_LABEL)) == NULL) { vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, VDEV_AUX_CORRUPT_DATA); return (-1); } if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_VERSION, &version) != 0 || - version > SPA_VERSION || + !SPA_VERSION_IS_SUPPORTED(version) || nvlist_lookup_uint64(label, ZPOOL_CONFIG_GUID, &guid) != 0 || guid != vd->vdev_guid || nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_STATE, &state) != 0) { @@ -2478,6 +2481,7 @@ vdev_get_stats(vdev_t *vd, vdev_stat_t *vs) vs->vs_rsize = vdev_get_min_asize(vd); if (vd->vdev_ops->vdev_op_leaf) vs->vs_rsize += VDEV_LABEL_START_SIZE + VDEV_LABEL_END_SIZE; + vs->vs_esize = vd->vdev_max_asize - vd->vdev_asize; mutex_exit(&vd->vdev_stat_lock); /* diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c index d7417736b4e..759f0f84f1c 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -30,6 +31,7 @@ #include #include #include +#include #include /* @@ -102,8 +104,39 @@ vdev_disk_rele(vdev_t *vd) } } +static uint64_t +vdev_disk_get_space(vdev_t *vd, uint64_t capacity, uint_t blksz) +{ + ASSERT(vd->vdev_wholedisk); + + vdev_disk_t *dvd = vd->vdev_tsd; + dk_efi_t dk_ioc; + efi_gpt_t *efi; + uint64_t avail_space = 0; + int efisize = EFI_LABEL_SIZE * 2; + + dk_ioc.dki_data = kmem_alloc(efisize, KM_SLEEP); + dk_ioc.dki_lba = 1; + dk_ioc.dki_length = efisize; + dk_ioc.dki_data_64 = (uint64_t)(uintptr_t)dk_ioc.dki_data; + efi = dk_ioc.dki_data; + + if (ldi_ioctl(dvd->vd_lh, DKIOCGETEFI, (intptr_t)&dk_ioc, + FKIOCTL, kcred, NULL) == 0) { + uint64_t efi_altern_lba = LE_64(efi->efi_gpt_AlternateLBA); + + zfs_dbgmsg("vdev %s, capacity %llu, altern lba %llu", + vd->vdev_path, capacity, efi_altern_lba); + if (capacity > efi_altern_lba) + avail_space = (capacity - efi_altern_lba) * blksz; + } + kmem_free(dk_ioc.dki_data, efisize); + return (avail_space); +} + static int -vdev_disk_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) +vdev_disk_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize, + uint64_t *ashift) { spa_t *spa = vd->vdev_spa; vdev_disk_t *dvd; @@ -273,16 +306,6 @@ skip_open: return (EINVAL); } - /* - * If we own the whole disk, try to enable disk write caching. - * We ignore errors because it's OK if we can't do it. - */ - if (vd->vdev_wholedisk == 1) { - int wce = 1; - (void) ldi_ioctl(dvd->vd_lh, DKIOCSETWCE, (intptr_t)&wce, - FKIOCTL, kcred, NULL); - } - /* * Determine the device's minimum transfer size. * If the ioctl isn't supported, assume DEV_BSIZE. @@ -293,6 +316,25 @@ skip_open: *ashift = highbit(MAX(dkmext.dki_pbsize, SPA_MINBLOCKSIZE)) - 1; + if (vd->vdev_wholedisk == 1) { + uint64_t capacity = dkmext.dki_capacity - 1; + uint64_t blksz = dkmext.dki_lbsize; + int wce = 1; + + /* + * If we own the whole disk, try to enable disk write caching. + * We ignore errors because it's OK if we can't do it. + */ + (void) ldi_ioctl(dvd->vd_lh, DKIOCSETWCE, (intptr_t)&wce, + FKIOCTL, kcred, NULL); + + *max_psize = *psize + vdev_disk_get_space(vd, capacity, blksz); + zfs_dbgmsg("capacity change: vdev %s, psize %llu, " + "max_psize %llu", vd->vdev_path, *psize, *max_psize); + } else { + *max_psize = *psize; + } + /* * Clear the nowritecache bit, so that on a vdev_reopen() we will * try again. diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c index 832ffdf566e..f03a9234cac 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -47,7 +48,8 @@ vdev_file_rele(vdev_t *vd) } static int -vdev_file_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) +vdev_file_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize, + uint64_t *ashift) { vdev_file_t *vf; vnode_t *vp; @@ -125,7 +127,7 @@ skip_open: return (error); } - *psize = vattr.va_size; + *max_psize = *psize = vattr.va_size; *ashift = SPA_MINBLOCKSHIFT; return (0); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c index 47c7b4af009..b2aada7af37 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c @@ -21,6 +21,8 @@ /* * Copyright (c) 2006 Pawel Jakub Dawidek * All rights reserved. + * + * Portions Copyright (c) 2012 Martin Matuska */ #include @@ -405,7 +407,8 @@ vdev_geom_open_by_path(vdev_t *vd, int check_guid) } static int -vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) +vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize, + uint64_t *ashift) { struct g_provider *pp; struct g_consumer *cp; @@ -488,7 +491,7 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) /* * Determine the actual size of the device. */ - *psize = pp->mediasize; + *max_psize = *psize = pp->mediasize; /* * Determine the device's minimum transfer size. diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_label.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_label.c index c08ed8ba046..b9436472495 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_label.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_label.c @@ -18,8 +18,10 @@ * * CDDL HEADER END */ + /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ /* @@ -121,6 +123,8 @@ * txg Transaction group in which this label was written * pool_guid Unique identifier for this pool * vdev_tree An nvlist describing vdev tree. + * features_for_read + * An nvlist of the features necessary for reading the MOS. * * Each leaf device label also contains the following: * @@ -428,8 +432,13 @@ vdev_top_config_generate(spa_t *spa, nvlist_t *config) kmem_free(array, rvd->vdev_children * sizeof (uint64_t)); } +/* + * Returns the configuration from the label of the given vdev. If 'label' is + * VDEV_BEST_LABEL, each label of the vdev will be read until a valid + * configuration is found; otherwise, only the specified label will be read. + */ nvlist_t * -vdev_label_read_config(vdev_t *vd) +vdev_label_read_config(vdev_t *vd, int label) { spa_t *spa = vd->vdev_spa; nvlist_t *config = NULL; @@ -447,6 +456,8 @@ vdev_label_read_config(vdev_t *vd) retry: for (int l = 0; l < VDEV_LABELS; l++) { + if (label >= 0 && label < VDEV_LABELS && label != l) + continue; zio = zio_root(spa, NULL, NULL, flags); @@ -496,7 +507,7 @@ vdev_inuse(vdev_t *vd, uint64_t crtxg, vdev_labeltype_t reason, /* * Read the label, if any, and perform some basic sanity checks. */ - if ((label = vdev_label_read_config(vd)) == NULL) + if ((label = vdev_label_read_config(vd, VDEV_BEST_LABEL)) == NULL) return (B_FALSE); (void) nvlist_lookup_uint64(label, ZPOOL_CONFIG_CREATE_TXG, @@ -833,7 +844,7 @@ retry: * come back up, we fail to see the uberblock for txg + 1 because, say, * it was on a mirrored device and the replica to which we wrote txg + 1 * is now offline. If we then make some changes and sync txg + 1, and then - * the missing replica comes back, then for a new seconds we'll have two + * the missing replica comes back, then for a few seconds we'll have two * conflicting uberblocks on disk with the same txg. The solution is simple: * among uberblocks with equal txg, choose the one with the latest timestamp. */ @@ -853,46 +864,50 @@ vdev_uberblock_compare(uberblock_t *ub1, uberblock_t *ub2) return (0); } +struct ubl_cbdata { + uberblock_t *ubl_ubbest; /* Best uberblock */ + vdev_t *ubl_vd; /* vdev associated with the above */ + int ubl_label; /* Label associated with the above */ +}; + static void vdev_uberblock_load_done(zio_t *zio) { + vdev_t *vd = zio->io_vd; spa_t *spa = zio->io_spa; zio_t *rio = zio->io_private; uberblock_t *ub = zio->io_data; - uberblock_t *ubbest = rio->io_private; + struct ubl_cbdata *cbp = rio->io_private; - ASSERT3U(zio->io_size, ==, VDEV_UBERBLOCK_SIZE(zio->io_vd)); + ASSERT3U(zio->io_size, ==, VDEV_UBERBLOCK_SIZE(vd)); if (zio->io_error == 0 && uberblock_verify(ub) == 0) { mutex_enter(&rio->io_lock); if (ub->ub_txg <= spa->spa_load_max_txg && - vdev_uberblock_compare(ub, ubbest) > 0) - *ubbest = *ub; + vdev_uberblock_compare(ub, cbp->ubl_ubbest) > 0) { + /* + * Keep track of the vdev and label in which this + * uberblock was found. We will use this information + * later to obtain the config nvlist associated with + * this uberblock. + */ + *cbp->ubl_ubbest = *ub; + cbp->ubl_vd = vd; + cbp->ubl_label = vdev_label_number(vd->vdev_psize, + zio->io_offset); + } mutex_exit(&rio->io_lock); } zio_buf_free(zio->io_data, zio->io_size); } -void -vdev_uberblock_load(zio_t *zio, vdev_t *vd, uberblock_t *ubbest) +static void +vdev_uberblock_load_impl(zio_t *zio, vdev_t *vd, int flags, + struct ubl_cbdata *cbp) { - spa_t *spa = vd->vdev_spa; - vdev_t *rvd = spa->spa_root_vdev; - int flags = ZIO_FLAG_CONFIG_WRITER | ZIO_FLAG_CANFAIL | - ZIO_FLAG_SPECULATIVE | ZIO_FLAG_TRYHARD; - - if (vd == rvd) { - ASSERT(zio == NULL); - spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); - zio = zio_root(spa, NULL, ubbest, flags); - bzero(ubbest, sizeof (uberblock_t)); - } - - ASSERT(zio != NULL); - for (int c = 0; c < vd->vdev_children; c++) - vdev_uberblock_load(zio, vd->vdev_child[c], ubbest); + vdev_uberblock_load_impl(zio, vd->vdev_child[c], flags, cbp); if (vd->vdev_ops->vdev_op_leaf && vdev_readable(vd)) { for (int l = 0; l < VDEV_LABELS; l++) { @@ -905,11 +920,45 @@ vdev_uberblock_load(zio_t *zio, vdev_t *vd, uberblock_t *ubbest) } } } +} - if (vd == rvd) { - (void) zio_wait(zio); - spa_config_exit(spa, SCL_ALL, FTAG); +/* + * Reads the 'best' uberblock from disk along with its associated + * configuration. First, we read the uberblock array of each label of each + * vdev, keeping track of the uberblock with the highest txg in each array. + * Then, we read the configuration from the same label as the best uberblock. + */ +void +vdev_uberblock_load(vdev_t *rvd, uberblock_t *ub, nvlist_t **config) +{ + int i; + zio_t *zio; + spa_t *spa = rvd->vdev_spa; + struct ubl_cbdata cb; + int flags = ZIO_FLAG_CONFIG_WRITER | ZIO_FLAG_CANFAIL | + ZIO_FLAG_SPECULATIVE | ZIO_FLAG_TRYHARD; + + ASSERT(ub); + ASSERT(config); + + bzero(ub, sizeof (uberblock_t)); + *config = NULL; + + cb.ubl_ubbest = ub; + cb.ubl_vd = NULL; + + spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); + zio = zio_root(spa, NULL, &cb, flags); + vdev_uberblock_load_impl(zio, rvd, flags, &cb); + (void) zio_wait(zio); + if (cb.ubl_vd != NULL) { + for (i = cb.ubl_label % 2; i < VDEV_LABELS; i += 2) { + *config = vdev_label_read_config(cb.ubl_vd, i); + if (*config != NULL) + break; + } } + spa_config_exit(spa, SCL_ALL, FTAG); } /* diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c index 698c0275d34..a28ca3e3965 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c @@ -23,6 +23,10 @@ * Use is subject to license terms. */ +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + #include #include #include @@ -127,7 +131,8 @@ vdev_mirror_map_alloc(zio_t *zio) } static int -vdev_mirror_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift) +vdev_mirror_open(vdev_t *vd, uint64_t *asize, uint64_t *max_asize, + uint64_t *ashift) { int numerrors = 0; int lasterror = 0; @@ -149,6 +154,7 @@ vdev_mirror_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift) } *asize = MIN(*asize - 1, cvd->vdev_asize - 1) + 1; + *max_asize = MIN(*max_asize - 1, cvd->vdev_max_asize - 1) + 1; *ashift = MAX(*ashift, cvd->vdev_ashift); } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c index 6a5588d5921..3bd8c90e04c 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c @@ -23,6 +23,10 @@ * Use is subject to license terms. */ +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + /* * The 'missing' vdev is a special vdev type used only during import. It * signifies a placeholder in the root vdev for some vdev that we know is @@ -40,7 +44,8 @@ /* ARGSUSED */ static int -vdev_missing_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) +vdev_missing_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize, + uint64_t *ashift) { /* * Really this should just fail. But then the root vdev will be in the @@ -49,6 +54,7 @@ vdev_missing_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) * will fail the GUID sum check before ever trying to open the pool. */ *psize = 0; + *max_psize = 0; *ashift = 0; return (0); } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c index 4b0f5602c1d..030ea429300 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c @@ -21,6 +21,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -1441,7 +1442,8 @@ vdev_raidz_reconstruct(raidz_map_t *rm, int *t, int nt) } static int -vdev_raidz_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift) +vdev_raidz_open(vdev_t *vd, uint64_t *asize, uint64_t *max_asize, + uint64_t *ashift) { vdev_t *cvd; uint64_t nparity = vd->vdev_nparity; @@ -1469,10 +1471,12 @@ vdev_raidz_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift) } *asize = MIN(*asize - 1, cvd->vdev_asize - 1) + 1; + *max_asize = MIN(*max_asize - 1, cvd->vdev_max_asize - 1) + 1; *ashift = MAX(*ashift, cvd->vdev_ashift); } *asize *= vd->vdev_children; + *max_asize *= vd->vdev_children; if (numerrors > nparity) { vd->vdev_stat.vs_aux = VDEV_AUX_NO_REPLICAS; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_root.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_root.c index 879f78f3a5b..1abc79d330b 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_root.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_root.c @@ -23,6 +23,10 @@ * Use is subject to license terms. */ +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + #include #include #include @@ -50,7 +54,8 @@ too_many_errors(vdev_t *vd, int numerrors) } static int -vdev_root_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift) +vdev_root_open(vdev_t *vd, uint64_t *asize, uint64_t *max_asize, + uint64_t *ashift) { int lasterror = 0; int numerrors = 0; @@ -77,6 +82,7 @@ vdev_root_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift) } *asize = 0; + *max_asize = 0; *ashift = 0; return (0); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c index 288a4d99ab2..fa1d99fec95 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ /* @@ -946,6 +947,19 @@ fzap_prefetch(zap_name_t *zn) * Helper functions for consumers. */ +uint64_t +zap_create_link(objset_t *os, dmu_object_type_t ot, uint64_t parent_obj, + const char *name, dmu_tx_t *tx) +{ + uint64_t new_obj; + + VERIFY((new_obj = zap_create(os, ot, DMU_OT_NONE, 0, tx)) > 0); + VERIFY(zap_add(os, parent_obj, name, sizeof (uint64_t), 1, &new_obj, + tx) == 0); + + return (new_obj); +} + int zap_value_search(objset_t *os, uint64_t zapobj, uint64_t value, uint64_t mask, char *name) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap_micro.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap_micro.c index 6e506a4ee26..dfdce04922a 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap_micro.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap_micro.c @@ -20,7 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -472,7 +472,7 @@ zap_lockdir(objset_t *os, uint64_t obj, dmu_tx_t *tx, { dmu_object_info_t doi; dmu_object_info_from_db(db, &doi); - ASSERT(dmu_ot[doi.doi_type].ot_byteswap == zap_byteswap); + ASSERT3U(DMU_OT_BYTESWAP(doi.doi_type), ==, DMU_BSWAP_ZAP); } #endif @@ -596,7 +596,7 @@ mzap_create_impl(objset_t *os, uint64_t obj, int normflags, zap_flags_t flags, { dmu_object_info_t doi; dmu_object_info_from_db(db, &doi); - ASSERT(dmu_ot[doi.doi_type].ot_byteswap == zap_byteswap); + ASSERT3U(DMU_OT_BYTESWAP(doi.doi_type), ==, DMU_BSWAP_ZAP); } #endif diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfeature.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfeature.c new file mode 100644 index 00000000000..ba722088a40 --- /dev/null +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfeature.c @@ -0,0 +1,414 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +#include +#include +#include +#include +#include +#include +#include "zfeature_common.h" +#include + +/* + * ZFS Feature Flags + * ----------------- + * + * ZFS feature flags are used to provide fine-grained versioning to the ZFS + * on-disk format. Once enabled on a pool feature flags replace the old + * spa_version() number. + * + * Each new on-disk format change will be given a uniquely identifying string + * guid rather than a version number. This avoids the problem of different + * organizations creating new on-disk formats with the same version number. To + * keep feature guids unique they should consist of the reverse dns name of the + * organization which implemented the feature and a short name for the feature, + * separated by a colon (e.g. com.delphix:async_destroy). + * + * Reference Counts + * ---------------- + * + * Within each pool features can be in one of three states: disabled, enabled, + * or active. These states are differentiated by a reference count stored on + * disk for each feature: + * + * 1) If there is no reference count stored on disk the feature is disabled. + * 2) If the reference count is 0 a system administrator has enabled the + * feature, but the feature has not been used yet, so no on-disk + * format changes have been made. + * 3) If the reference count is greater than 0 the feature is active. + * The format changes required by the feature are currently on disk. + * Note that if the feature's format changes are reversed the feature + * may choose to set its reference count back to 0. + * + * Feature flags makes no differentiation between non-zero reference counts + * for an active feature (e.g. a reference count of 1 means the same thing as a + * reference count of 27834721), but feature implementations may choose to use + * the reference count to store meaningful information. For example, a new RAID + * implementation might set the reference count to the number of vdevs using + * it. If all those disks are removed from the pool the feature goes back to + * having a reference count of 0. + * + * It is the responsibility of the individual features to maintain a non-zero + * reference count as long as the feature's format changes are present on disk. + * + * Dependencies + * ------------ + * + * Each feature may depend on other features. The only effect of this + * relationship is that when a feature is enabled all of its dependencies are + * automatically enabled as well. Any future work to support disabling of + * features would need to ensure that features cannot be disabled if other + * enabled features depend on them. + * + * On-disk Format + * -------------- + * + * When feature flags are enabled spa_version() is set to SPA_VERSION_FEATURES + * (5000). In order for this to work the pool is automatically upgraded to + * SPA_VERSION_BEFORE_FEATURES (28) first, so all pre-feature flags on disk + * format changes will be in use. + * + * Information about features is stored in 3 ZAP objects in the pool's MOS. + * These objects are linked to by the following names in the pool directory + * object: + * + * 1) features_for_read: feature guid -> reference count + * Features needed to open the pool for reading. + * 2) features_for_write: feature guid -> reference count + * Features needed to open the pool for writing. + * 3) feature_descriptions: feature guid -> descriptive string + * A human readable string. + * + * All enabled features appear in either features_for_read or + * features_for_write, but not both. + * + * To open a pool in read-only mode only the features listed in + * features_for_read need to be supported. + * + * To open the pool in read-write mode features in both features_for_read and + * features_for_write need to be supported. + * + * Some features may be required to read the ZAP objects containing feature + * information. To allow software to check for compatibility with these features + * before the pool is opened their names must be stored in the label in a + * new "features_for_read" entry (note that features that are only required + * to write to a pool never need to be stored in the label since the + * features_for_write ZAP object can be read before the pool is written to). + * To save space in the label features must be explicitly marked as needing to + * be written to the label. Also, reference counts are not stored in the label, + * instead any feature whose reference count drops to 0 is removed from the + * label. + * + * Adding New Features + * ------------------- + * + * Features must be registered in zpool_feature_init() function in + * zfeature_common.c using the zfeature_register() function. This function + * has arguments to specify if the feature should be stored in the + * features_for_read or features_for_write ZAP object and if it needs to be + * written to the label when active. + * + * Once a feature is registered it will appear as a "feature@" + * property which can be set by an administrator. Feature implementors should + * use the spa_feature_is_enabled() and spa_feature_is_active() functions to + * query the state of a feature and the spa_feature_incr() and + * spa_feature_decr() functions to change an enabled feature's reference count. + * Reference counts may only be updated in the syncing context. + * + * Features may not perform enable-time initialization. Instead, any such + * initialization should occur when the feature is first used. This design + * enforces that on-disk changes be made only when features are used. Code + * should only check if a feature is enabled using spa_feature_is_enabled(), + * not by relying on any feature specific metadata existing. If a feature is + * enabled, but the feature's metadata is not on disk yet then it should be + * created as needed. + * + * As an example, consider the com.delphix:async_destroy feature. This feature + * relies on the existence of a bptree in the MOS that store blocks for + * asynchronous freeing. This bptree is not created when async_destroy is + * enabled. Instead, when a dataset is destroyed spa_feature_is_enabled() is + * called to check if async_destroy is enabled. If it is and the bptree object + * does not exist yet, the bptree object is created as part of the dataset + * destroy and async_destroy's reference count is incremented to indicate it + * has made an on-disk format change. Later, after the destroyed dataset's + * blocks have all been asynchronously freed there is no longer any use for the + * bptree object, so it is destroyed and async_destroy's reference count is + * decremented back to 0 to indicate that it has undone its on-disk format + * changes. + */ + +typedef enum { + FEATURE_ACTION_ENABLE, + FEATURE_ACTION_INCR, + FEATURE_ACTION_DECR, +} feature_action_t; + +/* + * Checks that the features active in the specified object are supported by + * this software. Adds each unsupported feature (name -> description) to + * the supplied nvlist. + */ +boolean_t +feature_is_supported(objset_t *os, uint64_t obj, uint64_t desc_obj, + nvlist_t *unsup_feat) +{ + boolean_t supported; + zap_cursor_t zc; + zap_attribute_t za; + + supported = B_TRUE; + for (zap_cursor_init(&zc, os, obj); + zap_cursor_retrieve(&zc, &za) == 0; + zap_cursor_advance(&zc)) { + ASSERT(za.za_integer_length == sizeof (uint64_t) && + za.za_num_integers == 1); + + if (za.za_first_integer != 0 && + !zfeature_is_supported(za.za_name)) { + supported = B_FALSE; + + if (unsup_feat != NULL) { + char *desc = ""; + char buf[MAXPATHLEN]; + + if (zap_lookup(os, desc_obj, za.za_name, + 1, sizeof (buf), buf) == 0) + desc = buf; + + VERIFY(nvlist_add_string(unsup_feat, za.za_name, + desc) == 0); + } + } + } + zap_cursor_fini(&zc); + + return (supported); +} + +static int +feature_get_refcount(objset_t *os, uint64_t read_obj, uint64_t write_obj, + zfeature_info_t *feature, uint64_t *res) +{ + int err; + uint64_t refcount; + uint64_t zapobj = feature->fi_can_readonly ? write_obj : read_obj; + + ASSERT(0 != zapobj); + + err = zap_lookup(os, zapobj, feature->fi_guid, sizeof (uint64_t), 1, + &refcount); + if (err != 0) { + if (err == ENOENT) + return (ENOTSUP); + else + return (err); + } + *res = refcount; + return (0); +} + +static int +feature_do_action(objset_t *os, uint64_t read_obj, uint64_t write_obj, + uint64_t desc_obj, zfeature_info_t *feature, feature_action_t action, + dmu_tx_t *tx) +{ + int error; + uint64_t refcount; + uint64_t zapobj = feature->fi_can_readonly ? write_obj : read_obj; + + ASSERT(0 != zapobj); + ASSERT(zfeature_is_valid_guid(feature->fi_guid)); + + error = zap_lookup(os, zapobj, feature->fi_guid, + sizeof (uint64_t), 1, &refcount); + + /* + * If we can't ascertain the status of the specified feature, an I/O + * error occurred. + */ + if (error != 0 && error != ENOENT) + return (error); + + switch (action) { + case FEATURE_ACTION_ENABLE: + /* + * If the feature is already enabled, ignore the request. + */ + if (error == 0) + return (0); + refcount = 0; + break; + case FEATURE_ACTION_INCR: + if (error == ENOENT) + return (ENOTSUP); + if (refcount == UINT64_MAX) + return (EOVERFLOW); + refcount++; + break; + case FEATURE_ACTION_DECR: + if (error == ENOENT) + return (ENOTSUP); + if (refcount == 0) + return (EOVERFLOW); + refcount--; + break; + default: + ASSERT(0); + break; + } + + if (action == FEATURE_ACTION_ENABLE) { + int i; + + for (i = 0; feature->fi_depends[i] != NULL; i++) { + zfeature_info_t *dep = feature->fi_depends[i]; + + error = feature_do_action(os, read_obj, write_obj, + desc_obj, dep, FEATURE_ACTION_ENABLE, tx); + if (error != 0) + return (error); + } + } + + error = zap_update(os, zapobj, feature->fi_guid, + sizeof (uint64_t), 1, &refcount, tx); + if (error != 0) + return (error); + + if (action == FEATURE_ACTION_ENABLE) { + error = zap_update(os, desc_obj, + feature->fi_guid, 1, strlen(feature->fi_desc) + 1, + feature->fi_desc, tx); + if (error != 0) + return (error); + } + + if (action == FEATURE_ACTION_INCR && refcount == 1 && feature->fi_mos) { + spa_activate_mos_feature(dmu_objset_spa(os), feature->fi_guid); + } + + if (action == FEATURE_ACTION_DECR && refcount == 0) { + spa_deactivate_mos_feature(dmu_objset_spa(os), + feature->fi_guid); + } + + return (0); +} + +void +spa_feature_create_zap_objects(spa_t *spa, dmu_tx_t *tx) +{ + /* + * We create feature flags ZAP objects in two instances: during pool + * creation and during pool upgrade. + */ + ASSERT(dsl_pool_sync_context(spa_get_dsl(spa)) || (!spa->spa_sync_on && + tx->tx_txg == TXG_INITIAL)); + + spa->spa_feat_for_read_obj = zap_create_link(spa->spa_meta_objset, + DMU_OTN_ZAP_METADATA, DMU_POOL_DIRECTORY_OBJECT, + DMU_POOL_FEATURES_FOR_READ, tx); + spa->spa_feat_for_write_obj = zap_create_link(spa->spa_meta_objset, + DMU_OTN_ZAP_METADATA, DMU_POOL_DIRECTORY_OBJECT, + DMU_POOL_FEATURES_FOR_WRITE, tx); + spa->spa_feat_desc_obj = zap_create_link(spa->spa_meta_objset, + DMU_OTN_ZAP_METADATA, DMU_POOL_DIRECTORY_OBJECT, + DMU_POOL_FEATURE_DESCRIPTIONS, tx); +} + +/* + * Enable any required dependencies, then enable the requested feature. + */ +void +spa_feature_enable(spa_t *spa, zfeature_info_t *feature, dmu_tx_t *tx) +{ + ASSERT3U(spa_version(spa), >=, SPA_VERSION_FEATURES); + VERIFY3U(0, ==, feature_do_action(spa->spa_meta_objset, + spa->spa_feat_for_read_obj, spa->spa_feat_for_write_obj, + spa->spa_feat_desc_obj, feature, FEATURE_ACTION_ENABLE, tx)); +} + +/* + * If the specified feature has not yet been enabled, this function returns + * ENOTSUP; otherwise, this function increments the feature's refcount (or + * returns EOVERFLOW if the refcount cannot be incremented). This function must + * be called from syncing context. + */ +void +spa_feature_incr(spa_t *spa, zfeature_info_t *feature, dmu_tx_t *tx) +{ + ASSERT3U(spa_version(spa), >=, SPA_VERSION_FEATURES); + VERIFY3U(0, ==, feature_do_action(spa->spa_meta_objset, + spa->spa_feat_for_read_obj, spa->spa_feat_for_write_obj, + spa->spa_feat_desc_obj, feature, FEATURE_ACTION_INCR, tx)); +} + +/* + * If the specified feature has not yet been enabled, this function returns + * ENOTSUP; otherwise, this function decrements the feature's refcount (or + * returns EOVERFLOW if the refcount is already 0). This function must + * be called from syncing context. + */ +void +spa_feature_decr(spa_t *spa, zfeature_info_t *feature, dmu_tx_t *tx) +{ + ASSERT3U(spa_version(spa), >=, SPA_VERSION_FEATURES); + VERIFY3U(0, ==, feature_do_action(spa->spa_meta_objset, + spa->spa_feat_for_read_obj, spa->spa_feat_for_write_obj, + spa->spa_feat_desc_obj, feature, FEATURE_ACTION_DECR, tx)); +} + +boolean_t +spa_feature_is_enabled(spa_t *spa, zfeature_info_t *feature) +{ + int err; + uint64_t refcount; + + if (spa_version(spa) < SPA_VERSION_FEATURES) + return (B_FALSE); + + err = feature_get_refcount(spa->spa_meta_objset, + spa->spa_feat_for_read_obj, spa->spa_feat_for_write_obj, + feature, &refcount); + ASSERT(err == 0 || err == ENOTSUP); + return (err == 0); +} + +boolean_t +spa_feature_is_active(spa_t *spa, zfeature_info_t *feature) +{ + int err; + uint64_t refcount; + + if (spa_version(spa) < SPA_VERSION_FEATURES) + return (B_FALSE); + + err = feature_get_refcount(spa->spa_meta_objset, + spa->spa_feat_for_read_obj, spa->spa_feat_for_write_obj, + feature, &refcount); + ASSERT(err == 0 || err == ENOTSUP); + return (err == 0 && refcount > 0); +} diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c index 05e9b66f677..73a4f752429 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c @@ -18,13 +18,15 @@ * * CDDL HEADER END */ + /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011-2012 Pawel Jakub Dawidek . * All rights reserved. * Portions Copyright 2011 Martin Matuska * Copyright 2011 Nexenta Systems, Inc. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. */ #include @@ -57,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -1155,6 +1158,8 @@ getzfsvfs(const char *dsname, zfsvfs_t **zfvp) /* * Find a zfsvfs_t for a mounted filesystem, or create our own, in which * case its z_vfs will be NULL, and it will be opened as the owner. + * If 'writer' is set, the z_teardown_lock will be held for RW_WRITER, + * which prevents all vnode ops from running. */ static int zfsvfs_hold(const char *name, void *tag, zfsvfs_t **zfvp, boolean_t writer) @@ -1218,7 +1223,7 @@ zfs_ioc_pool_create(zfs_cmd_t *zc) (void) nvlist_lookup_uint64(props, zpool_prop_to_name(ZPOOL_PROP_VERSION), &version); - if (version < SPA_VERSION_INITIAL || version > SPA_VERSION) { + if (!SPA_VERSION_IS_SUPPORTED(version)) { error = EINVAL; goto pool_props_bad; } @@ -1342,6 +1347,15 @@ zfs_ioc_pool_configs(zfs_cmd_t *zc) return (error); } +/* + * inputs: + * zc_name name of the pool + * + * outputs: + * zc_cookie real errno + * zc_nvlist_dst config nvlist + * zc_nvlist_dst_size size of config nvlist + */ static int zfs_ioc_pool_stats(zfs_cmd_t *zc) { @@ -1443,7 +1457,8 @@ zfs_ioc_pool_upgrade(zfs_cmd_t *zc) if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0) return (error); - if (zc->zc_cookie < spa_version(spa) || zc->zc_cookie > SPA_VERSION) { + if (zc->zc_cookie < spa_version(spa) || + !SPA_VERSION_IS_SUPPORTED(zc->zc_cookie)) { spa_close(spa, FTAG); return (EINVAL); } @@ -3933,7 +3948,8 @@ zfs_ioc_send(zfs_cmd_t *zc) } off = fp->f_offset; - error = dmu_sendbackup(tosnap, fromsnap, zc->zc_obj, fp, &off); + error = dmu_send(tosnap, fromsnap, zc->zc_obj, + zc->zc_cookie, fp, &off); if (off >= 0 && off <= MAXOFFSET_T) fp->f_offset = off; @@ -3945,6 +3961,49 @@ zfs_ioc_send(zfs_cmd_t *zc) return (error); } +/* + * inputs: + * zc_name name of snapshot on which to report progress + * zc_cookie file descriptor of send stream + * + * outputs: + * zc_cookie number of bytes written in send stream thus far + */ +static int +zfs_ioc_send_progress(zfs_cmd_t *zc) +{ + dsl_dataset_t *ds; + dmu_sendarg_t *dsp = NULL; + int error; + + if ((error = dsl_dataset_hold(zc->zc_name, FTAG, &ds)) != 0) + return (error); + + mutex_enter(&ds->ds_sendstream_lock); + + /* + * Iterate over all the send streams currently active on this dataset. + * If there's one which matches the specified file descriptor _and_ the + * stream was started by the current process, return the progress of + * that stream. + */ + for (dsp = list_head(&ds->ds_sendstreams); dsp != NULL; + dsp = list_next(&ds->ds_sendstreams, dsp)) { + if (dsp->dsa_outfd == zc->zc_cookie && + dsp->dsa_proc == curproc) + break; + } + + if (dsp != NULL) + zc->zc_cookie = *(dsp->dsa_off); + else + error = ENOENT; + + mutex_exit(&ds->ds_sendstream_lock); + dsl_dataset_rele(ds, FTAG); + return (error); +} + static int zfs_ioc_inject_fault(zfs_cmd_t *zc) { @@ -4079,6 +4138,22 @@ zfs_ioc_clear(zfs_cmd_t *zc) return (error); } +static int +zfs_ioc_pool_reopen(zfs_cmd_t *zc) +{ + spa_t *spa; + int error; + + error = spa_open(zc->zc_name, &spa, FTAG); + if (error) + return (error); + + spa_vdev_state_enter(spa, SCL_NONE); + vdev_reopen(spa->spa_root_vdev); + (void) spa_vdev_state_exit(spa, NULL, 0); + spa_close(spa, FTAG); + return (0); +} /* * inputs: * zc_name name of filesystem @@ -4946,7 +5021,11 @@ static zfs_ioc_vec_t zfs_ioc_vec[] = { { zfs_ioc_space_written, zfs_secpolicy_read, DATASET_NAME, B_FALSE, B_TRUE }, { zfs_ioc_space_snaps, zfs_secpolicy_read, DATASET_NAME, B_FALSE, - B_TRUE } + B_TRUE }, + { zfs_ioc_send_progress, zfs_secpolicy_read, DATASET_NAME, B_FALSE, + B_FALSE }, + { zfs_ioc_pool_reopen, zfs_secpolicy_config, POOL_NAME, B_TRUE, + B_TRUE }, }; int @@ -5386,7 +5465,7 @@ zfs_modevent(module_t mod, int type, void *unused __unused) tsd_create(&zfs_fsyncer_key, NULL); tsd_create(&rrw_tsd_key, NULL); - printf("ZFS storage pool version " SPA_VERSION_STRING "\n"); + printf("ZFS storage pool version: features support (" SPA_VERSION_STRING ")\n"); root_mount_rel(zfs_root_token); zfsdev_init(); @@ -5424,4 +5503,3 @@ DECLARE_MODULE(zfsctrl, zfs_mod, SI_SUB_VFS, SI_ORDER_ANY); MODULE_DEPEND(zfsctrl, opensolaris, 1, 1, 1); MODULE_DEPEND(zfsctrl, krpc, 1, 1, 1); MODULE_DEPEND(zfsctrl, acl_nfs4, 1, 1, 1); -MODULE_DEPEND(zfsctrl, acl_posix1e, 1, 1, 1); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c index 467b6a64e5e..01eddbd0e87 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c @@ -2278,7 +2278,7 @@ void zfs_init(void) { - printf("ZFS filesystem version " ZPL_VERSION_STRING "\n"); + printf("ZFS filesystem version: " ZPL_VERSION_STRING "\n"); /* * Initialize .zfs directory structures diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index de24310994a..8ff15ec2e13 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -838,6 +838,12 @@ zfs_write(vnode_t *vp, uio_t *uio, int ioflag, cred_t *cr, caller_context_t *ct) rl = zfs_range_lock(zp, woff, n, RL_WRITER); } + if (vn_rlimit_fsize(vp, uio, uio->uio_td)) { + zfs_range_unlock(rl); + ZFS_EXIT(zfsvfs); + return (EFBIG); + } + if (woff >= limit) { zfs_range_unlock(rl); ZFS_EXIT(zfsvfs); @@ -5696,9 +5702,6 @@ zfs_freebsd_write(ap) } */ *ap; { - if (vn_rlimit_fsize(ap->a_vp, ap->a_uio, ap->a_uio->uio_td)) - return (EFBIG); - return (zfs_write(ap->a_vp, ap->a_uio, ioflags(ap->a_ioflag), ap->a_cred, NULL)); } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c index 694302e6f19..ca402f6dc06 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c @@ -640,7 +640,7 @@ zio_write(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp, zp->zp_checksum < ZIO_CHECKSUM_FUNCTIONS && zp->zp_compress >= ZIO_COMPRESS_OFF && zp->zp_compress < ZIO_COMPRESS_FUNCTIONS && - zp->zp_type < DMU_OT_NUMTYPES && + DMU_OT_IS_VALID(zp->zp_type) && zp->zp_level < 32 && zp->zp_copies > 0 && zp->zp_copies <= spa_max_replication(spa) && @@ -924,7 +924,7 @@ zio_read_bp_init(zio_t *zio) zio_push_transform(zio, cbuf, psize, psize, zio_decompress); } - if (!dmu_ot[BP_GET_TYPE(bp)].ot_metadata && BP_GET_LEVEL(bp) == 0) + if (!DMU_OT_IS_METADATA(BP_GET_TYPE(bp)) && BP_GET_LEVEL(bp) == 0) zio->io_flags |= ZIO_FLAG_DONT_CACHE; if (BP_GET_TYPE(bp) == DMU_OT_DDT_ZAP) @@ -3015,3 +3015,45 @@ static zio_pipe_stage_t *zio_pipeline[] = { zio_checksum_verify, zio_done }; + +/* dnp is the dnode for zb1->zb_object */ +boolean_t +zbookmark_is_before(const dnode_phys_t *dnp, const zbookmark_t *zb1, + const zbookmark_t *zb2) +{ + uint64_t zb1nextL0, zb2thisobj; + + ASSERT(zb1->zb_objset == zb2->zb_objset); + ASSERT(zb2->zb_level == 0); + + /* + * A bookmark in the deadlist is considered to be after + * everything else. + */ + if (zb2->zb_object == DMU_DEADLIST_OBJECT) + return (B_TRUE); + + /* The objset_phys_t isn't before anything. */ + if (dnp == NULL) + return (B_FALSE); + + zb1nextL0 = (zb1->zb_blkid + 1) << + ((zb1->zb_level) * (dnp->dn_indblkshift - SPA_BLKPTRSHIFT)); + + zb2thisobj = zb2->zb_object ? zb2->zb_object : + zb2->zb_blkid << (DNODE_BLOCK_SHIFT - DNODE_SHIFT); + + if (zb1->zb_object == DMU_META_DNODE_OBJECT) { + uint64_t nextobj = zb1nextL0 * + (dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT) >> DNODE_SHIFT; + return (nextobj <= zb2thisobj); + } + + if (zb1->zb_object < zb2thisobj) + return (B_TRUE); + if (zb1->zb_object > zb2thisobj) + return (B_FALSE); + if (zb2->zb_object == DMU_META_DNODE_OBJECT) + return (B_FALSE); + return (zb1nextL0 <= zb2->zb_blkid); +} diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h b/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h index 1f0c37218aa..cad30d31c3a 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h +++ b/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h @@ -24,6 +24,10 @@ * Use is subject to license terms. */ +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + #ifndef _SYS_DTRACE_H #define _SYS_DTRACE_H @@ -481,6 +485,7 @@ typedef struct dtrace_difv { #define DTRACEAGG_STDDEV (DTRACEACT_AGGREGATION + 6) #define DTRACEAGG_QUANTIZE (DTRACEACT_AGGREGATION + 7) #define DTRACEAGG_LQUANTIZE (DTRACEACT_AGGREGATION + 8) +#define DTRACEAGG_LLQUANTIZE (DTRACEACT_AGGREGATION + 9) #define DTRACEACT_ISAGG(x) \ (DTRACEACT_CLASS(x) == DTRACEACT_AGGREGATION) @@ -515,6 +520,31 @@ typedef struct dtrace_difv { (int32_t)(((x) & DTRACE_LQUANTIZE_BASEMASK) >> \ DTRACE_LQUANTIZE_BASESHIFT) +#define DTRACE_LLQUANTIZE_FACTORSHIFT 48 +#define DTRACE_LLQUANTIZE_FACTORMASK ((uint64_t)UINT16_MAX << 48) +#define DTRACE_LLQUANTIZE_LOWSHIFT 32 +#define DTRACE_LLQUANTIZE_LOWMASK ((uint64_t)UINT16_MAX << 32) +#define DTRACE_LLQUANTIZE_HIGHSHIFT 16 +#define DTRACE_LLQUANTIZE_HIGHMASK ((uint64_t)UINT16_MAX << 16) +#define DTRACE_LLQUANTIZE_NSTEPSHIFT 0 +#define DTRACE_LLQUANTIZE_NSTEPMASK UINT16_MAX + +#define DTRACE_LLQUANTIZE_FACTOR(x) \ + (uint16_t)(((x) & DTRACE_LLQUANTIZE_FACTORMASK) >> \ + DTRACE_LLQUANTIZE_FACTORSHIFT) + +#define DTRACE_LLQUANTIZE_LOW(x) \ + (uint16_t)(((x) & DTRACE_LLQUANTIZE_LOWMASK) >> \ + DTRACE_LLQUANTIZE_LOWSHIFT) + +#define DTRACE_LLQUANTIZE_HIGH(x) \ + (uint16_t)(((x) & DTRACE_LLQUANTIZE_HIGHMASK) >> \ + DTRACE_LLQUANTIZE_HIGHSHIFT) + +#define DTRACE_LLQUANTIZE_NSTEP(x) \ + (uint16_t)(((x) & DTRACE_LLQUANTIZE_NSTEPMASK) >> \ + DTRACE_LLQUANTIZE_NSTEPSHIFT) + #define DTRACE_USTACK_NFRAMES(x) (uint32_t)((x) & UINT32_MAX) #define DTRACE_USTACK_STRSIZE(x) (uint32_t)((x) >> 32) #define DTRACE_USTACK_ARG(x, y) \ diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h b/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h index 0729bff27c2..f2d996ac918 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h +++ b/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h @@ -21,8 +21,10 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011 by Delphix. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. + * Copyright (c) 2012, Martin Matuska . All rights reserved. */ /* Portions Copyright 2010 Robert Milkowski */ @@ -169,6 +171,8 @@ typedef enum { ZPOOL_PROP_ALLOCATED, ZPOOL_PROP_READONLY, ZPOOL_PROP_COMMENT, + ZPOOL_PROP_EXPANDSZ, + ZPOOL_PROP_FREEING, ZPOOL_NUM_PROPS } zpool_prop_t; @@ -242,6 +246,8 @@ const char *zpool_prop_to_name(zpool_prop_t); const char *zpool_prop_default_string(zpool_prop_t); uint64_t zpool_prop_default_numeric(zpool_prop_t); boolean_t zpool_prop_readonly(zpool_prop_t); +boolean_t zpool_prop_feature(const char *); +boolean_t zpool_prop_unsupported(const char *name); int zpool_prop_index_to_string(zpool_prop_t, uint64_t, const char **); int zpool_prop_string_to_index(zpool_prop_t, const char *, uint64_t *); uint64_t zpool_prop_random_value(zpool_prop_t, uint64_t seed); @@ -349,6 +355,7 @@ typedef enum { #define SPA_VERSION_26 26ULL #define SPA_VERSION_27 27ULL #define SPA_VERSION_28 28ULL +#define SPA_VERSION_5000 5000ULL /* * When bumping up SPA_VERSION, make sure GRUB ZFS understands the on-disk @@ -356,8 +363,8 @@ typedef enum { * and do the appropriate changes. Also bump the version number in * usr/src/grub/capability. */ -#define SPA_VERSION SPA_VERSION_28 -#define SPA_VERSION_STRING "28" +#define SPA_VERSION SPA_VERSION_5000 +#define SPA_VERSION_STRING "5000" /* * Symbolic names for the changes that caused a SPA_VERSION switch. @@ -408,6 +415,12 @@ typedef enum { #define SPA_VERSION_DEADLISTS SPA_VERSION_26 #define SPA_VERSION_FAST_SNAP SPA_VERSION_27 #define SPA_VERSION_MULTI_REPLACE SPA_VERSION_28 +#define SPA_VERSION_BEFORE_FEATURES SPA_VERSION_28 +#define SPA_VERSION_FEATURES SPA_VERSION_5000 + +#define SPA_VERSION_IS_SUPPORTED(v) \ + (((v) >= SPA_VERSION_INITIAL && (v) <= SPA_VERSION_BEFORE_FEATURES) || \ + ((v) >= SPA_VERSION_FEATURES && (v) <= SPA_VERSION)) /* * ZPL version - rev'd whenever an incompatible on-disk format change @@ -505,6 +518,11 @@ typedef struct zpool_rewind_policy { #define ZPOOL_CONFIG_BOOTFS "bootfs" /* not stored on disk */ #define ZPOOL_CONFIG_MISSING_DEVICES "missing_vdevs" /* not stored on disk */ #define ZPOOL_CONFIG_LOAD_INFO "load_info" /* not stored on disk */ +#define ZPOOL_CONFIG_REWIND_INFO "rewind_info" /* not stored on disk */ +#define ZPOOL_CONFIG_UNSUP_FEAT "unsup_feat" /* not stored on disk */ +#define ZPOOL_CONFIG_CAN_RDONLY "can_rdonly" /* not stored on disk */ +#define ZPOOL_CONFIG_FEATURES_FOR_READ "features_for_read" +#define ZPOOL_CONFIG_FEATURE_STATS "feature_stats" /* not stored on disk */ /* * The persistent vdev state is stored as separate values rather than a single * 'vdev_state' entry. This is because a device can be in multiple states, such @@ -583,6 +601,7 @@ typedef enum vdev_aux { VDEV_AUX_BAD_LABEL, /* the label is OK but invalid */ VDEV_AUX_VERSION_NEWER, /* on-disk version is too new */ VDEV_AUX_VERSION_OLDER, /* on-disk version is too old */ + VDEV_AUX_UNSUP_FEAT, /* unsupported features */ VDEV_AUX_SPARED, /* hot spare used in another pool */ VDEV_AUX_ERR_EXCEEDED, /* too many errors */ VDEV_AUX_IO_FAILURE, /* experienced I/O failure */ @@ -673,6 +692,7 @@ typedef struct vdev_stat { uint64_t vs_space; /* total capacity */ uint64_t vs_dspace; /* deflated capacity */ uint64_t vs_rsize; /* replaceable dev size */ + uint64_t vs_esize; /* expandable dev size */ uint64_t vs_ops[ZIO_TYPES]; /* operation count */ uint64_t vs_bytes[ZIO_TYPES]; /* bytes read/written */ uint64_t vs_read_errors; /* read errors */ @@ -794,6 +814,8 @@ typedef unsigned long zfs_ioc_t; #define ZFS_IOC_POOL_REGUID _IOWR('Z', 60, struct zfs_cmd) #define ZFS_IOC_SPACE_WRITTEN _IOWR('Z', 61, struct zfs_cmd) #define ZFS_IOC_SPACE_SNAPS _IOWR('Z', 62, struct zfs_cmd) +#define ZFS_IOC_SEND_PROGRESS _IOWR('Z', 63, struct zfs_cmd) +#define ZFS_IOC_POOL_REOPEN _IOWR('Z', 64, struct zfs_cmd) /* * Internal SPA load state. Used by FMA diagnosis engine. diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/nvpair.h b/sys/cddl/contrib/opensolaris/uts/common/sys/nvpair.h index abf84cf593e..3062dd95aec 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/sys/nvpair.h +++ b/sys/cddl/contrib/opensolaris/uts/common/sys/nvpair.h @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #ifndef _SYS_NVPAIR_H @@ -274,6 +275,73 @@ int nvpair_value_hrtime(nvpair_t *, hrtime_t *); int nvpair_value_double(nvpair_t *, double *); #endif +nvlist_t *fnvlist_alloc(void); +void fnvlist_free(nvlist_t *); +size_t fnvlist_size(nvlist_t *); +char *fnvlist_pack(nvlist_t *, size_t *); +void fnvlist_pack_free(char *, size_t); +nvlist_t *fnvlist_unpack(char *, size_t); +nvlist_t *fnvlist_dup(nvlist_t *); +void fnvlist_merge(nvlist_t *, nvlist_t *); + +void fnvlist_add_boolean(nvlist_t *, const char *); +void fnvlist_add_boolean_value(nvlist_t *, const char *, boolean_t); +void fnvlist_add_byte(nvlist_t *, const char *, uchar_t); +void fnvlist_add_int8(nvlist_t *, const char *, int8_t); +void fnvlist_add_uint8(nvlist_t *, const char *, uint8_t); +void fnvlist_add_int16(nvlist_t *, const char *, int16_t); +void fnvlist_add_uint16(nvlist_t *, const char *, uint16_t); +void fnvlist_add_int32(nvlist_t *, const char *, int32_t); +void fnvlist_add_uint32(nvlist_t *, const char *, uint32_t); +void fnvlist_add_int64(nvlist_t *, const char *, int64_t); +void fnvlist_add_uint64(nvlist_t *, const char *, uint64_t); +void fnvlist_add_string(nvlist_t *, const char *, const char *); +void fnvlist_add_nvlist(nvlist_t *, const char *, nvlist_t *); +void fnvlist_add_nvpair(nvlist_t *, nvpair_t *); +void fnvlist_add_boolean_array(nvlist_t *, const char *, boolean_t *, uint_t); +void fnvlist_add_byte_array(nvlist_t *, const char *, uchar_t *, uint_t); +void fnvlist_add_int8_array(nvlist_t *, const char *, int8_t *, uint_t); +void fnvlist_add_uint8_array(nvlist_t *, const char *, uint8_t *, uint_t); +void fnvlist_add_int16_array(nvlist_t *, const char *, int16_t *, uint_t); +void fnvlist_add_uint16_array(nvlist_t *, const char *, uint16_t *, uint_t); +void fnvlist_add_int32_array(nvlist_t *, const char *, int32_t *, uint_t); +void fnvlist_add_uint32_array(nvlist_t *, const char *, uint32_t *, uint_t); +void fnvlist_add_int64_array(nvlist_t *, const char *, int64_t *, uint_t); +void fnvlist_add_uint64_array(nvlist_t *, const char *, uint64_t *, uint_t); +void fnvlist_add_string_array(nvlist_t *, const char *, char * const *, uint_t); +void fnvlist_add_nvlist_array(nvlist_t *, const char *, nvlist_t **, uint_t); + +void fnvlist_remove(nvlist_t *, const char *); +void fnvlist_remove_nvpair(nvlist_t *, nvpair_t *); + +nvpair_t *fnvlist_lookup_nvpair(nvlist_t *nvl, const char *name); +boolean_t fnvlist_lookup_boolean(nvlist_t *nvl, const char *name); +boolean_t fnvlist_lookup_boolean_value(nvlist_t *nvl, const char *name); +uchar_t fnvlist_lookup_byte(nvlist_t *nvl, const char *name); +int8_t fnvlist_lookup_int8(nvlist_t *nvl, const char *name); +int16_t fnvlist_lookup_int16(nvlist_t *nvl, const char *name); +int32_t fnvlist_lookup_int32(nvlist_t *nvl, const char *name); +int64_t fnvlist_lookup_int64(nvlist_t *nvl, const char *name); +uint8_t fnvlist_lookup_uint8_t(nvlist_t *nvl, const char *name); +uint16_t fnvlist_lookup_uint16(nvlist_t *nvl, const char *name); +uint32_t fnvlist_lookup_uint32(nvlist_t *nvl, const char *name); +uint64_t fnvlist_lookup_uint64(nvlist_t *nvl, const char *name); +char *fnvlist_lookup_string(nvlist_t *nvl, const char *name); +nvlist_t *fnvlist_lookup_nvlist(nvlist_t *nvl, const char *name); + +boolean_t fnvpair_value_boolean_value(nvpair_t *nvp); +uchar_t fnvpair_value_byte(nvpair_t *nvp); +int8_t fnvpair_value_int8(nvpair_t *nvp); +int16_t fnvpair_value_int16(nvpair_t *nvp); +int32_t fnvpair_value_int32(nvpair_t *nvp); +int64_t fnvpair_value_int64(nvpair_t *nvp); +uint8_t fnvpair_value_uint8_t(nvpair_t *nvp); +uint16_t fnvpair_value_uint16(nvpair_t *nvp); +uint32_t fnvpair_value_uint32(nvpair_t *nvp); +uint64_t fnvpair_value_uint64(nvpair_t *nvp); +char *fnvpair_value_string(nvpair_t *nvp); +nvlist_t *fnvpair_value_nvlist(nvpair_t *nvp); + #ifdef __cplusplus } #endif diff --git a/sys/cddl/dev/dtrace/amd64/dis_tables.c b/sys/cddl/dev/dtrace/amd64/dis_tables.c index 5a5bc25c02c..44b935fccc2 100644 --- a/sys/cddl/dev/dtrace/amd64/dis_tables.c +++ b/sys/cddl/dev/dtrace/amd64/dis_tables.c @@ -815,7 +815,7 @@ const instable_t dis_op0F[16][16] = { /* [10] */ TNSZ("movups",XMMO,16), TNSZ("movups",XMMOS,16),TNSZ("movlps",XMMO,8), TNSZ("movlps",XMMOS,8), /* [14] */ TNSZ("unpcklps",XMMO,16),TNSZ("unpckhps",XMMO,16),TNSZ("movhps",XMMOM,8),TNSZ("movhps",XMMOMS,8), /* [18] */ IND(dis_op0F18), INVALID, INVALID, INVALID, -/* [1C] */ INVALID, INVALID, INVALID, INVALID, +/* [1C] */ INVALID, INVALID, INVALID, TS("nopw", Mw), }, { /* [20] */ TSy("mov",SREG), TSy("mov",SREG), TSy("mov",SREG), TSy("mov",SREG), /* [24] */ TSx("mov",SREG), INVALID, TSx("mov",SREG), INVALID, @@ -1146,14 +1146,14 @@ const instable_t dis_distable[16][16] = { /* [1,C] */ TNS("sbbb",IA), TS("sbb",IA), TSx("push",SEG), TSx("pop",SEG), }, { /* [2,0] */ TNS("andb",RMw), TS("and",RMw), TNS("andb",MRw), TS("and",MRw), -/* [2,4] */ TNS("andb",IA), TS("and",IA), TNSx("%es:",OVERRIDE), TNSx("daa",NORM), +/* [2,4] */ TNS("andb",IA), TS("and",IA), TNS("%es:",OVERRIDE), TNSx("daa",NORM), /* [2,8] */ TNS("subb",RMw), TS("sub",RMw), TNS("subb",MRw), TS("sub",MRw), -/* [2,C] */ TNS("subb",IA), TS("sub",IA), TNSx("%cs:",OVERRIDE), TNSx("das",NORM), +/* [2,C] */ TNS("subb",IA), TS("sub",IA), TNS("%cs:",OVERRIDE), TNSx("das",NORM), }, { /* [3,0] */ TNS("xorb",RMw), TS("xor",RMw), TNS("xorb",MRw), TS("xor",MRw), -/* [3,4] */ TNS("xorb",IA), TS("xor",IA), TNSx("%ss:",OVERRIDE), TNSx("aaa",NORM), +/* [3,4] */ TNS("xorb",IA), TS("xor",IA), TNS("%ss:",OVERRIDE), TNSx("aaa",NORM), /* [3,8] */ TNS("cmpb",RMw), TS("cmp",RMw), TNS("cmpb",MRw), TS("cmp",MRw), -/* [3,C] */ TNS("cmpb",IA), TS("cmp",IA), TNSx("%ds:",OVERRIDE), TNSx("aas",NORM), +/* [3,C] */ TNS("cmpb",IA), TS("cmp",IA), TNS("%ds:",OVERRIDE), TNSx("aas",NORM), }, { /* [4,0] */ TSx("inc",R), TSx("inc",R), TSx("inc",R), TSx("inc",R), /* [4,4] */ TSx("inc",R), TSx("inc",R), TSx("inc",R), TSx("inc",R), diff --git a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c index d2a1cf1e7dd..48952314ecf 100644 --- a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c +++ b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c @@ -27,6 +27,10 @@ * Use is subject to license terms. */ +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + #include #include #include @@ -297,14 +301,15 @@ dtrace_safe_defer_signal(void) } /* - * If we've executed the original instruction, but haven't performed - * the jmp back to t->t_dtrace_npc or the clean up of any registers - * used to emulate %rip-relative instructions in 64-bit mode, do that - * here and take the signal right away. We detect this condition by - * seeing if the program counter is the range [scrpc + isz, astpc). + * If we have executed the original instruction, but we have performed + * neither the jmp back to t->t_dtrace_npc nor the clean up of any + * registers used to emulate %rip-relative instructions in 64-bit mode, + * we'll save ourselves some effort by doing that here and taking the + * signal right away. We detect this condition by seeing if the program + * counter is the range [scrpc + isz, astpc). */ - if (t->t_dtrace_astpc - rp->r_pc < - t->t_dtrace_astpc - t->t_dtrace_scrpc - isz) { + if (rp->r_pc >= t->t_dtrace_scrpc + isz && + rp->r_pc < t->t_dtrace_astpc) { #ifdef __amd64 /* * If there is a scratch register and we're on the @@ -446,7 +451,7 @@ dtrace_gethrtime() * (see nsec_scale calculations) taking into account 32-bit shift of * the higher half and finally add. */ - tsc = rdtsc() + tsc_skew[curcpu]; + tsc = rdtsc() - tsc_skew[curcpu]; lo = tsc; hi = tsc >> 32; return (((lo * nsec_scale) >> SCALE_SHIFT) + diff --git a/sys/cddl/dev/dtrace/i386/dis_tables.c b/sys/cddl/dev/dtrace/i386/dis_tables.c index 5a5bc25c02c..44b935fccc2 100644 --- a/sys/cddl/dev/dtrace/i386/dis_tables.c +++ b/sys/cddl/dev/dtrace/i386/dis_tables.c @@ -815,7 +815,7 @@ const instable_t dis_op0F[16][16] = { /* [10] */ TNSZ("movups",XMMO,16), TNSZ("movups",XMMOS,16),TNSZ("movlps",XMMO,8), TNSZ("movlps",XMMOS,8), /* [14] */ TNSZ("unpcklps",XMMO,16),TNSZ("unpckhps",XMMO,16),TNSZ("movhps",XMMOM,8),TNSZ("movhps",XMMOMS,8), /* [18] */ IND(dis_op0F18), INVALID, INVALID, INVALID, -/* [1C] */ INVALID, INVALID, INVALID, INVALID, +/* [1C] */ INVALID, INVALID, INVALID, TS("nopw", Mw), }, { /* [20] */ TSy("mov",SREG), TSy("mov",SREG), TSy("mov",SREG), TSy("mov",SREG), /* [24] */ TSx("mov",SREG), INVALID, TSx("mov",SREG), INVALID, @@ -1146,14 +1146,14 @@ const instable_t dis_distable[16][16] = { /* [1,C] */ TNS("sbbb",IA), TS("sbb",IA), TSx("push",SEG), TSx("pop",SEG), }, { /* [2,0] */ TNS("andb",RMw), TS("and",RMw), TNS("andb",MRw), TS("and",MRw), -/* [2,4] */ TNS("andb",IA), TS("and",IA), TNSx("%es:",OVERRIDE), TNSx("daa",NORM), +/* [2,4] */ TNS("andb",IA), TS("and",IA), TNS("%es:",OVERRIDE), TNSx("daa",NORM), /* [2,8] */ TNS("subb",RMw), TS("sub",RMw), TNS("subb",MRw), TS("sub",MRw), -/* [2,C] */ TNS("subb",IA), TS("sub",IA), TNSx("%cs:",OVERRIDE), TNSx("das",NORM), +/* [2,C] */ TNS("subb",IA), TS("sub",IA), TNS("%cs:",OVERRIDE), TNSx("das",NORM), }, { /* [3,0] */ TNS("xorb",RMw), TS("xor",RMw), TNS("xorb",MRw), TS("xor",MRw), -/* [3,4] */ TNS("xorb",IA), TS("xor",IA), TNSx("%ss:",OVERRIDE), TNSx("aaa",NORM), +/* [3,4] */ TNS("xorb",IA), TS("xor",IA), TNS("%ss:",OVERRIDE), TNSx("aaa",NORM), /* [3,8] */ TNS("cmpb",RMw), TS("cmp",RMw), TNS("cmpb",MRw), TS("cmp",MRw), -/* [3,C] */ TNS("cmpb",IA), TS("cmp",IA), TNSx("%ds:",OVERRIDE), TNSx("aas",NORM), +/* [3,C] */ TNS("cmpb",IA), TS("cmp",IA), TNS("%ds:",OVERRIDE), TNSx("aas",NORM), }, { /* [4,0] */ TSx("inc",R), TSx("inc",R), TSx("inc",R), TSx("inc",R), /* [4,4] */ TSx("inc",R), TSx("inc",R), TSx("inc",R), TSx("inc",R), diff --git a/sys/cddl/dev/dtrace/i386/dtrace_subr.c b/sys/cddl/dev/dtrace/i386/dtrace_subr.c index b52097be706..e8384bf66ed 100644 --- a/sys/cddl/dev/dtrace/i386/dtrace_subr.c +++ b/sys/cddl/dev/dtrace/i386/dtrace_subr.c @@ -27,6 +27,10 @@ * Use is subject to license terms. */ +/* + * Copyright (c) 2011, Joyent, Inc. All rights reserved. + */ + #include #include #include @@ -298,14 +302,15 @@ dtrace_safe_defer_signal(void) } /* - * If we've executed the original instruction, but haven't performed - * the jmp back to t->t_dtrace_npc or the clean up of any registers - * used to emulate %rip-relative instructions in 64-bit mode, do that - * here and take the signal right away. We detect this condition by - * seeing if the program counter is the range [scrpc + isz, astpc). + * If we have executed the original instruction, but we have performed + * neither the jmp back to t->t_dtrace_npc nor the clean up of any + * registers used to emulate %rip-relative instructions in 64-bit mode, + * we'll save ourselves some effort by doing that here and taking the + * signal right away. We detect this condition by seeing if the program + * counter is the range [scrpc + isz, astpc). */ - if (t->t_dtrace_astpc - rp->r_pc < - t->t_dtrace_astpc - t->t_dtrace_scrpc - isz) { + if (rp->r_pc >= t->t_dtrace_scrpc + isz && + rp->r_pc < t->t_dtrace_astpc) { #ifdef __amd64 /* * If there is a scratch register and we're on the @@ -447,7 +452,7 @@ dtrace_gethrtime() * (see nsec_scale calculations) taking into account 32-bit shift of * the higher half and finally add. */ - tsc = rdtsc() + tsc_skew[curcpu]; + tsc = rdtsc() - tsc_skew[curcpu]; lo = tsc; hi = tsc >> 32; return (((lo * nsec_scale) >> SCALE_SHIFT) + diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h index e263f0d9d4e..fccdef039f6 100644 --- a/sys/compat/freebsd32/freebsd32.h +++ b/sys/compat/freebsd32/freebsd32.h @@ -306,7 +306,7 @@ struct kinfo_proc32 { u_int ki_estcpu; u_int ki_slptime; u_int ki_swtime; - int ki_spareint1; + u_int ki_cow; u_int64_t ki_runtime; struct timeval32 ki_start; struct timeval32 ki_childtime; diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c index 81568ae19e5..ce8bd7ac2a7 100644 --- a/sys/compat/freebsd32/freebsd32_misc.c +++ b/sys/compat/freebsd32/freebsd32_misc.c @@ -1528,7 +1528,8 @@ freebsd32_getdirentries(struct thread *td, int32_t base32; int error; - error = kern_getdirentries(td, uap->fd, uap->buf, uap->count, &base); + error = kern_getdirentries(td, uap->fd, uap->buf, uap->count, &base, + NULL, UIO_USERSPACE); if (error) return (error); if (uap->basep != NULL) { diff --git a/sys/compat/freebsd32/freebsd32_proto.h b/sys/compat/freebsd32/freebsd32_proto.h index 48c6f2e0a9d..2bd582c53fa 100644 --- a/sys/compat/freebsd32/freebsd32_proto.h +++ b/sys/compat/freebsd32/freebsd32_proto.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 227776 2011-11-21 01:26:10Z lstewart + * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 236026 2012-05-25 21:50:48Z ed */ #ifndef _FREEBSD32_SYSPROTO_H_ @@ -54,11 +54,11 @@ struct freebsd32_sendmsg_args { }; struct freebsd32_recvfrom_args { char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)]; - char buf_l_[PADL_(u_int32_t)]; u_int32_t buf; char buf_r_[PADR_(u_int32_t)]; - char len_l_[PADL_(u_int32_t)]; u_int32_t len; char len_r_[PADR_(u_int32_t)]; + char buf_l_[PADL_(uint32_t)]; uint32_t buf; char buf_r_[PADR_(uint32_t)]; + char len_l_[PADL_(uint32_t)]; uint32_t len; char len_r_[PADR_(uint32_t)]; char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)]; - char from_l_[PADL_(u_int32_t)]; u_int32_t from; char from_r_[PADR_(u_int32_t)]; - char fromlenaddr_l_[PADL_(u_int32_t)]; u_int32_t fromlenaddr; char fromlenaddr_r_[PADR_(u_int32_t)]; + char from_l_[PADL_(uint32_t)]; uint32_t from; char from_r_[PADR_(uint32_t)]; + char fromlenaddr_l_[PADL_(uint32_t)]; uint32_t fromlenaddr; char fromlenaddr_r_[PADR_(uint32_t)]; }; struct ofreebsd32_sigpending_args { register_t dummy; @@ -74,8 +74,8 @@ struct freebsd32_ioctl_args { }; struct freebsd32_execve_args { char fname_l_[PADL_(char *)]; char * fname; char fname_r_[PADR_(char *)]; - char argv_l_[PADL_(u_int32_t *)]; u_int32_t * argv; char argv_r_[PADR_(u_int32_t *)]; - char envv_l_[PADL_(u_int32_t *)]; u_int32_t * envv; char envv_r_[PADR_(u_int32_t *)]; + char argv_l_[PADL_(uint32_t *)]; uint32_t * argv; char argv_r_[PADR_(uint32_t *)]; + char envv_l_[PADL_(uint32_t *)]; uint32_t * envv; char envv_r_[PADR_(uint32_t *)]; }; struct freebsd32_mprotect_args { char addr_l_[PADL_(const void *)]; const void * addr; char addr_r_[PADR_(const void *)]; @@ -175,9 +175,9 @@ struct freebsd32_sysctl_args { char name_l_[PADL_(int *)]; int * name; char name_r_[PADR_(int *)]; char namelen_l_[PADL_(u_int)]; u_int namelen; char namelen_r_[PADR_(u_int)]; char old_l_[PADL_(void *)]; void * old; char old_r_[PADR_(void *)]; - char oldlenp_l_[PADL_(u_int32_t *)]; u_int32_t * oldlenp; char oldlenp_r_[PADR_(u_int32_t *)]; + char oldlenp_l_[PADL_(uint32_t *)]; uint32_t * oldlenp; char oldlenp_r_[PADR_(uint32_t *)]; char new_l_[PADL_(void *)]; void * new; char new_r_[PADR_(void *)]; - char newlen_l_[PADL_(u_int32_t)]; u_int32_t newlen; char newlen_r_[PADR_(u_int32_t)]; + char newlen_l_[PADL_(uint32_t)]; uint32_t newlen; char newlen_r_[PADR_(uint32_t)]; }; struct freebsd32_futimes_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; @@ -232,15 +232,15 @@ struct freebsd32_preadv_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char iovp_l_[PADL_(struct iovec32 *)]; struct iovec32 * iovp; char iovp_r_[PADR_(struct iovec32 *)]; char iovcnt_l_[PADL_(u_int)]; u_int iovcnt; char iovcnt_r_[PADR_(u_int)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; }; struct freebsd32_pwritev_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char iovp_l_[PADL_(struct iovec32 *)]; struct iovec32 * iovp; char iovp_r_[PADR_(struct iovec32 *)]; char iovcnt_l_[PADL_(u_int)]; u_int iovcnt; char iovcnt_r_[PADR_(u_int)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; }; struct freebsd32_modstat_args { char modid_l_[PADL_(int)]; int modid; char modid_r_[PADR_(int)]; @@ -309,8 +309,8 @@ struct freebsd32_nmount_args { struct freebsd32_sendfile_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; char nbytes_l_[PADL_(size_t)]; size_t nbytes; char nbytes_r_[PADR_(size_t)]; char hdtr_l_[PADL_(struct sf_hdtr32 *)]; struct sf_hdtr32 * hdtr; char hdtr_r_[PADR_(struct sf_hdtr32 *)]; char sbytes_l_[PADL_(off_t *)]; off_t * sbytes; char sbytes_r_[PADR_(off_t *)]; @@ -404,16 +404,16 @@ struct freebsd32_pread_args { char buf_l_[PADL_(void *)]; void * buf; char buf_r_[PADR_(void *)]; char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; }; struct freebsd32_pwrite_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char buf_l_[PADL_(const void *)]; const void * buf; char buf_r_[PADR_(const void *)]; char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; }; struct freebsd32_mmap_args { char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)]; @@ -422,42 +422,42 @@ struct freebsd32_mmap_args { char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)]; char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char pos1_l_[PADL_(u_int32_t)]; u_int32_t pos1; char pos1_r_[PADR_(u_int32_t)]; - char pos2_l_[PADL_(u_int32_t)]; u_int32_t pos2; char pos2_r_[PADR_(u_int32_t)]; + char pos1_l_[PADL_(uint32_t)]; uint32_t pos1; char pos1_r_[PADR_(uint32_t)]; + char pos2_l_[PADL_(uint32_t)]; uint32_t pos2; char pos2_r_[PADR_(uint32_t)]; }; struct freebsd32_lseek_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; char whence_l_[PADL_(int)]; int whence; char whence_r_[PADR_(int)]; }; struct freebsd32_truncate_args { char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char length1_l_[PADL_(u_int32_t)]; u_int32_t length1; char length1_r_[PADR_(u_int32_t)]; - char length2_l_[PADL_(u_int32_t)]; u_int32_t length2; char length2_r_[PADR_(u_int32_t)]; + char length1_l_[PADL_(uint32_t)]; uint32_t length1; char length1_r_[PADR_(uint32_t)]; + char length2_l_[PADL_(uint32_t)]; uint32_t length2; char length2_r_[PADR_(uint32_t)]; }; struct freebsd32_ftruncate_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char length1_l_[PADL_(u_int32_t)]; u_int32_t length1; char length1_r_[PADR_(u_int32_t)]; - char length2_l_[PADL_(u_int32_t)]; u_int32_t length2; char length2_r_[PADR_(u_int32_t)]; + char length1_l_[PADL_(uint32_t)]; uint32_t length1; char length1_r_[PADR_(uint32_t)]; + char length2_l_[PADL_(uint32_t)]; uint32_t length2; char length2_r_[PADR_(uint32_t)]; }; #else struct freebsd32_pread_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char buf_l_[PADL_(void *)]; void * buf; char buf_r_[PADR_(void *)]; char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; }; struct freebsd32_pwrite_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char buf_l_[PADL_(const void *)]; const void * buf; char buf_r_[PADR_(const void *)]; char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; }; struct freebsd32_mmap_args { char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)]; @@ -465,69 +465,69 @@ struct freebsd32_mmap_args { char prot_l_[PADL_(int)]; int prot; char prot_r_[PADR_(int)]; char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)]; char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; - char pos1_l_[PADL_(u_int32_t)]; u_int32_t pos1; char pos1_r_[PADR_(u_int32_t)]; - char pos2_l_[PADL_(u_int32_t)]; u_int32_t pos2; char pos2_r_[PADR_(u_int32_t)]; + char pos1_l_[PADL_(uint32_t)]; uint32_t pos1; char pos1_r_[PADR_(uint32_t)]; + char pos2_l_[PADL_(uint32_t)]; uint32_t pos2; char pos2_r_[PADR_(uint32_t)]; }; struct freebsd32_lseek_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; char whence_l_[PADL_(int)]; int whence; char whence_r_[PADR_(int)]; }; struct freebsd32_truncate_args { char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; - char length1_l_[PADL_(u_int32_t)]; u_int32_t length1; char length1_r_[PADR_(u_int32_t)]; - char length2_l_[PADL_(u_int32_t)]; u_int32_t length2; char length2_r_[PADR_(u_int32_t)]; + char length1_l_[PADL_(uint32_t)]; uint32_t length1; char length1_r_[PADR_(uint32_t)]; + char length2_l_[PADL_(uint32_t)]; uint32_t length2; char length2_r_[PADR_(uint32_t)]; }; struct freebsd32_ftruncate_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; - char length1_l_[PADL_(u_int32_t)]; u_int32_t length1; char length1_r_[PADR_(u_int32_t)]; - char length2_l_[PADL_(u_int32_t)]; u_int32_t length2; char length2_r_[PADR_(u_int32_t)]; + char length1_l_[PADL_(uint32_t)]; uint32_t length1; char length1_r_[PADR_(uint32_t)]; + char length2_l_[PADL_(uint32_t)]; uint32_t length2; char length2_r_[PADR_(uint32_t)]; }; #endif #ifdef PAD64_REQUIRED struct freebsd32_cpuset_setid_args { char which_l_[PADL_(cpuwhich_t)]; cpuwhich_t which; char which_r_[PADR_(cpuwhich_t)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char id1_l_[PADL_(u_int32_t)]; u_int32_t id1; char id1_r_[PADR_(u_int32_t)]; - char id2_l_[PADL_(u_int32_t)]; u_int32_t id2; char id2_r_[PADR_(u_int32_t)]; + char id1_l_[PADL_(uint32_t)]; uint32_t id1; char id1_r_[PADR_(uint32_t)]; + char id2_l_[PADL_(uint32_t)]; uint32_t id2; char id2_r_[PADR_(uint32_t)]; char setid_l_[PADL_(cpusetid_t)]; cpusetid_t setid; char setid_r_[PADR_(cpusetid_t)]; }; #else struct freebsd32_cpuset_setid_args { char which_l_[PADL_(cpuwhich_t)]; cpuwhich_t which; char which_r_[PADR_(cpuwhich_t)]; - char id1_l_[PADL_(u_int32_t)]; u_int32_t id1; char id1_r_[PADR_(u_int32_t)]; - char id2_l_[PADL_(u_int32_t)]; u_int32_t id2; char id2_r_[PADR_(u_int32_t)]; + char id1_l_[PADL_(uint32_t)]; uint32_t id1; char id1_r_[PADR_(uint32_t)]; + char id2_l_[PADL_(uint32_t)]; uint32_t id2; char id2_r_[PADR_(uint32_t)]; char setid_l_[PADL_(cpusetid_t)]; cpusetid_t setid; char setid_r_[PADR_(cpusetid_t)]; }; #endif struct freebsd32_cpuset_getid_args { char level_l_[PADL_(cpulevel_t)]; cpulevel_t level; char level_r_[PADR_(cpulevel_t)]; char which_l_[PADL_(cpuwhich_t)]; cpuwhich_t which; char which_r_[PADR_(cpuwhich_t)]; - char id1_l_[PADL_(u_int32_t)]; u_int32_t id1; char id1_r_[PADR_(u_int32_t)]; - char id2_l_[PADL_(u_int32_t)]; u_int32_t id2; char id2_r_[PADR_(u_int32_t)]; + char id1_l_[PADL_(uint32_t)]; uint32_t id1; char id1_r_[PADR_(uint32_t)]; + char id2_l_[PADL_(uint32_t)]; uint32_t id2; char id2_r_[PADR_(uint32_t)]; char setid_l_[PADL_(cpusetid_t *)]; cpusetid_t * setid; char setid_r_[PADR_(cpusetid_t *)]; }; struct freebsd32_cpuset_getaffinity_args { char level_l_[PADL_(cpulevel_t)]; cpulevel_t level; char level_r_[PADR_(cpulevel_t)]; char which_l_[PADL_(cpuwhich_t)]; cpuwhich_t which; char which_r_[PADR_(cpuwhich_t)]; - char id1_l_[PADL_(u_int32_t)]; u_int32_t id1; char id1_r_[PADR_(u_int32_t)]; - char id2_l_[PADL_(u_int32_t)]; u_int32_t id2; char id2_r_[PADR_(u_int32_t)]; + char id1_l_[PADL_(uint32_t)]; uint32_t id1; char id1_r_[PADR_(uint32_t)]; + char id2_l_[PADL_(uint32_t)]; uint32_t id2; char id2_r_[PADR_(uint32_t)]; char cpusetsize_l_[PADL_(size_t)]; size_t cpusetsize; char cpusetsize_r_[PADR_(size_t)]; char mask_l_[PADL_(cpuset_t *)]; cpuset_t * mask; char mask_r_[PADR_(cpuset_t *)]; }; struct freebsd32_cpuset_setaffinity_args { char level_l_[PADL_(cpulevel_t)]; cpulevel_t level; char level_r_[PADR_(cpulevel_t)]; char which_l_[PADL_(cpuwhich_t)]; cpuwhich_t which; char which_r_[PADR_(cpuwhich_t)]; - char id1_l_[PADL_(u_int32_t)]; u_int32_t id1; char id1_r_[PADR_(u_int32_t)]; - char id2_l_[PADL_(u_int32_t)]; u_int32_t id2; char id2_r_[PADR_(u_int32_t)]; + char id1_l_[PADL_(uint32_t)]; uint32_t id1; char id1_r_[PADR_(uint32_t)]; + char id2_l_[PADL_(uint32_t)]; uint32_t id2; char id2_r_[PADR_(uint32_t)]; char cpusetsize_l_[PADL_(size_t)]; size_t cpusetsize; char cpusetsize_r_[PADR_(size_t)]; char mask_l_[PADL_(const cpuset_t *)]; const cpuset_t * mask; char mask_r_[PADR_(const cpuset_t *)]; }; struct freebsd32_fexecve_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; - char argv_l_[PADL_(u_int32_t *)]; u_int32_t * argv; char argv_r_[PADR_(u_int32_t *)]; - char envv_l_[PADL_(u_int32_t *)]; u_int32_t * envv; char envv_r_[PADR_(u_int32_t *)]; + char argv_l_[PADL_(uint32_t *)]; uint32_t * argv; char argv_r_[PADR_(uint32_t *)]; + char envv_l_[PADL_(uint32_t *)]; uint32_t * envv; char envv_r_[PADR_(uint32_t *)]; }; struct freebsd32_fstatat_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; @@ -812,8 +812,8 @@ struct freebsd4_freebsd32_fhstatfs_args { struct freebsd4_freebsd32_sendfile_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; char nbytes_l_[PADL_(size_t)]; size_t nbytes; char nbytes_r_[PADR_(size_t)]; char hdtr_l_[PADL_(struct sf_hdtr32 *)]; struct sf_hdtr32 * hdtr; char hdtr_r_[PADR_(struct sf_hdtr32 *)]; char sbytes_l_[PADL_(off_t *)]; off_t * sbytes; char sbytes_r_[PADR_(off_t *)]; @@ -854,16 +854,16 @@ struct freebsd6_freebsd32_pread_args { char buf_l_[PADL_(void *)]; void * buf; char buf_r_[PADR_(void *)]; char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; }; struct freebsd6_freebsd32_pwrite_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char buf_l_[PADL_(const void *)]; const void * buf; char buf_r_[PADR_(const void *)]; char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; }; struct freebsd6_freebsd32_mmap_args { char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)]; @@ -872,27 +872,27 @@ struct freebsd6_freebsd32_mmap_args { char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)]; char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char pos1_l_[PADL_(u_int32_t)]; u_int32_t pos1; char pos1_r_[PADR_(u_int32_t)]; - char pos2_l_[PADL_(u_int32_t)]; u_int32_t pos2; char pos2_r_[PADR_(u_int32_t)]; + char pos1_l_[PADL_(uint32_t)]; uint32_t pos1; char pos1_r_[PADR_(uint32_t)]; + char pos2_l_[PADL_(uint32_t)]; uint32_t pos2; char pos2_r_[PADR_(uint32_t)]; }; struct freebsd6_freebsd32_lseek_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char offset1_l_[PADL_(u_int32_t)]; u_int32_t offset1; char offset1_r_[PADR_(u_int32_t)]; - char offset2_l_[PADL_(u_int32_t)]; u_int32_t offset2; char offset2_r_[PADR_(u_int32_t)]; + char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)]; + char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)]; char whence_l_[PADL_(int)]; int whence; char whence_r_[PADR_(int)]; }; struct freebsd6_freebsd32_truncate_args { char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char length1_l_[PADL_(u_int32_t)]; u_int32_t length1; char length1_r_[PADR_(u_int32_t)]; - char length2_l_[PADL_(u_int32_t)]; u_int32_t length2; char length2_r_[PADR_(u_int32_t)]; + char length1_l_[PADL_(uint32_t)]; uint32_t length1; char length1_r_[PADR_(uint32_t)]; + char length2_l_[PADL_(uint32_t)]; uint32_t length2; char length2_r_[PADR_(uint32_t)]; }; struct freebsd6_freebsd32_ftruncate_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)]; - char length1_l_[PADL_(u_int32_t)]; u_int32_t length1; char length1_r_[PADR_(u_int32_t)]; - char length2_l_[PADL_(u_int32_t)]; u_int32_t length2; char length2_r_[PADR_(u_int32_t)]; + char length1_l_[PADL_(uint32_t)]; uint32_t length1; char length1_r_[PADR_(uint32_t)]; + char length2_l_[PADL_(uint32_t)]; uint32_t length2; char length2_r_[PADR_(uint32_t)]; }; #ifdef PAD64_REQUIRED #else diff --git a/sys/compat/freebsd32/freebsd32_syscall.h b/sys/compat/freebsd32/freebsd32_syscall.h index ad3d9860a7a..163df611352 100644 --- a/sys/compat/freebsd32/freebsd32_syscall.h +++ b/sys/compat/freebsd32/freebsd32_syscall.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 227776 2011-11-21 01:26:10Z lstewart + * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 236026 2012-05-25 21:50:48Z ed */ #define FREEBSD32_SYS_syscall 0 diff --git a/sys/compat/freebsd32/freebsd32_syscalls.c b/sys/compat/freebsd32/freebsd32_syscalls.c index faba8645856..8c92f62601f 100644 --- a/sys/compat/freebsd32/freebsd32_syscalls.c +++ b/sys/compat/freebsd32/freebsd32_syscalls.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 227776 2011-11-21 01:26:10Z lstewart + * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 236026 2012-05-25 21:50:48Z ed */ const char *freebsd32_syscallnames[] = { diff --git a/sys/compat/freebsd32/freebsd32_sysent.c b/sys/compat/freebsd32/freebsd32_sysent.c index 590ed41639d..87daff5a24f 100644 --- a/sys/compat/freebsd32/freebsd32_sysent.c +++ b/sys/compat/freebsd32/freebsd32_sysent.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 227776 2011-11-21 01:26:10Z lstewart + * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 236026 2012-05-25 21:50:48Z ed */ #include "opt_compat.h" diff --git a/sys/compat/freebsd32/freebsd32_systrace_args.c b/sys/compat/freebsd32/freebsd32_systrace_args.c index 13df961d1c2..c7a43d02d04 100644 --- a/sys/compat/freebsd32/freebsd32_systrace_args.c +++ b/sys/compat/freebsd32/freebsd32_systrace_args.c @@ -209,11 +209,11 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) case 29: { struct freebsd32_recvfrom_args *p = params; iarg[0] = p->s; /* int */ - uarg[1] = p->buf; /* u_int32_t */ - uarg[2] = p->len; /* u_int32_t */ + uarg[1] = p->buf; /* uint32_t */ + uarg[2] = p->len; /* uint32_t */ iarg[3] = p->flags; /* int */ - uarg[4] = p->from; /* u_int32_t */ - uarg[5] = p->fromlenaddr; /* u_int32_t */ + uarg[4] = p->from; /* uint32_t */ + uarg[5] = p->fromlenaddr; /* uint32_t */ *n_args = 6; break; } @@ -402,8 +402,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) case 59: { struct freebsd32_execve_args *p = params; uarg[0] = (intptr_t) p->fname; /* char * */ - uarg[1] = (intptr_t) p->argv; /* u_int32_t * */ - uarg[2] = (intptr_t) p->envv; /* u_int32_t * */ + uarg[1] = (intptr_t) p->argv; /* uint32_t * */ + uarg[2] = (intptr_t) p->envv; /* uint32_t * */ *n_args = 3; break; } @@ -996,9 +996,9 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) uarg[0] = (intptr_t) p->name; /* int * */ uarg[1] = p->namelen; /* u_int */ uarg[2] = (intptr_t) p->old; /* void * */ - uarg[3] = (intptr_t) p->oldlenp; /* u_int32_t * */ + uarg[3] = (intptr_t) p->oldlenp; /* uint32_t * */ uarg[4] = (intptr_t) p->new; /* void * */ - uarg[5] = p->newlen; /* u_int32_t */ + uarg[5] = p->newlen; /* uint32_t */ *n_args = 6; break; } @@ -1360,8 +1360,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) iarg[0] = p->fd; /* int */ uarg[1] = (intptr_t) p->iovp; /* struct iovec32 * */ uarg[2] = p->iovcnt; /* u_int */ - uarg[3] = p->offset1; /* u_int32_t */ - uarg[4] = p->offset2; /* u_int32_t */ + uarg[3] = p->offset1; /* uint32_t */ + uarg[4] = p->offset2; /* uint32_t */ *n_args = 5; break; } @@ -1371,8 +1371,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) iarg[0] = p->fd; /* int */ uarg[1] = (intptr_t) p->iovp; /* struct iovec32 * */ uarg[2] = p->iovcnt; /* u_int */ - uarg[3] = p->offset1; /* u_int32_t */ - uarg[4] = p->offset2; /* u_int32_t */ + uarg[3] = p->offset1; /* uint32_t */ + uarg[4] = p->offset2; /* uint32_t */ *n_args = 5; break; } @@ -1933,8 +1933,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) struct freebsd32_sendfile_args *p = params; iarg[0] = p->fd; /* int */ iarg[1] = p->s; /* int */ - uarg[2] = p->offset1; /* u_int32_t */ - uarg[3] = p->offset2; /* u_int32_t */ + uarg[2] = p->offset1; /* uint32_t */ + uarg[3] = p->offset2; /* uint32_t */ uarg[4] = p->nbytes; /* size_t */ uarg[5] = (intptr_t) p->hdtr; /* struct sf_hdtr32 * */ uarg[6] = (intptr_t) p->sbytes; /* off_t * */ @@ -2500,8 +2500,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) uarg[1] = (intptr_t) p->buf; /* void * */ uarg[2] = p->nbyte; /* size_t */ iarg[3] = p->pad; /* int */ - uarg[4] = p->offset1; /* u_int32_t */ - uarg[5] = p->offset2; /* u_int32_t */ + uarg[4] = p->offset1; /* uint32_t */ + uarg[5] = p->offset2; /* uint32_t */ *n_args = 6; break; } @@ -2512,8 +2512,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) uarg[1] = (intptr_t) p->buf; /* const void * */ uarg[2] = p->nbyte; /* size_t */ iarg[3] = p->pad; /* int */ - uarg[4] = p->offset1; /* u_int32_t */ - uarg[5] = p->offset2; /* u_int32_t */ + uarg[4] = p->offset1; /* uint32_t */ + uarg[5] = p->offset2; /* uint32_t */ *n_args = 6; break; } @@ -2526,8 +2526,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) iarg[3] = p->flags; /* int */ iarg[4] = p->fd; /* int */ iarg[5] = p->pad; /* int */ - uarg[6] = p->pos1; /* u_int32_t */ - uarg[7] = p->pos2; /* u_int32_t */ + uarg[6] = p->pos1; /* uint32_t */ + uarg[7] = p->pos2; /* uint32_t */ *n_args = 8; break; } @@ -2536,8 +2536,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) struct freebsd32_lseek_args *p = params; iarg[0] = p->fd; /* int */ iarg[1] = p->pad; /* int */ - uarg[2] = p->offset1; /* u_int32_t */ - uarg[3] = p->offset2; /* u_int32_t */ + uarg[2] = p->offset1; /* uint32_t */ + uarg[3] = p->offset2; /* uint32_t */ iarg[4] = p->whence; /* int */ *n_args = 5; break; @@ -2547,8 +2547,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) struct freebsd32_truncate_args *p = params; uarg[0] = (intptr_t) p->path; /* char * */ iarg[1] = p->pad; /* int */ - uarg[2] = p->length1; /* u_int32_t */ - uarg[3] = p->length2; /* u_int32_t */ + uarg[2] = p->length1; /* uint32_t */ + uarg[3] = p->length2; /* uint32_t */ *n_args = 4; break; } @@ -2557,8 +2557,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) struct freebsd32_ftruncate_args *p = params; iarg[0] = p->fd; /* int */ iarg[1] = p->pad; /* int */ - uarg[2] = p->length1; /* u_int32_t */ - uarg[3] = p->length2; /* u_int32_t */ + uarg[2] = p->length1; /* uint32_t */ + uarg[3] = p->length2; /* uint32_t */ *n_args = 4; break; } @@ -2569,8 +2569,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) iarg[0] = p->fd; /* int */ uarg[1] = (intptr_t) p->buf; /* void * */ uarg[2] = p->nbyte; /* size_t */ - uarg[3] = p->offset1; /* u_int32_t */ - uarg[4] = p->offset2; /* u_int32_t */ + uarg[3] = p->offset1; /* uint32_t */ + uarg[4] = p->offset2; /* uint32_t */ *n_args = 5; break; } @@ -2580,8 +2580,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) iarg[0] = p->fd; /* int */ uarg[1] = (intptr_t) p->buf; /* const void * */ uarg[2] = p->nbyte; /* size_t */ - uarg[3] = p->offset1; /* u_int32_t */ - uarg[4] = p->offset2; /* u_int32_t */ + uarg[3] = p->offset1; /* uint32_t */ + uarg[4] = p->offset2; /* uint32_t */ *n_args = 5; break; } @@ -2593,8 +2593,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) iarg[2] = p->prot; /* int */ iarg[3] = p->flags; /* int */ iarg[4] = p->fd; /* int */ - uarg[5] = p->pos1; /* u_int32_t */ - uarg[6] = p->pos2; /* u_int32_t */ + uarg[5] = p->pos1; /* uint32_t */ + uarg[6] = p->pos2; /* uint32_t */ *n_args = 7; break; } @@ -2602,8 +2602,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) case 478: { struct freebsd32_lseek_args *p = params; iarg[0] = p->fd; /* int */ - uarg[1] = p->offset1; /* u_int32_t */ - uarg[2] = p->offset2; /* u_int32_t */ + uarg[1] = p->offset1; /* uint32_t */ + uarg[2] = p->offset2; /* uint32_t */ iarg[3] = p->whence; /* int */ *n_args = 4; break; @@ -2612,8 +2612,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) case 479: { struct freebsd32_truncate_args *p = params; uarg[0] = (intptr_t) p->path; /* char * */ - uarg[1] = p->length1; /* u_int32_t */ - uarg[2] = p->length2; /* u_int32_t */ + uarg[1] = p->length1; /* uint32_t */ + uarg[2] = p->length2; /* uint32_t */ *n_args = 3; break; } @@ -2621,8 +2621,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) case 480: { struct freebsd32_ftruncate_args *p = params; iarg[0] = p->fd; /* int */ - uarg[1] = p->length1; /* u_int32_t */ - uarg[2] = p->length2; /* u_int32_t */ + uarg[1] = p->length1; /* uint32_t */ + uarg[2] = p->length2; /* uint32_t */ *n_args = 3; break; } @@ -2665,8 +2665,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) struct freebsd32_cpuset_setid_args *p = params; iarg[0] = p->which; /* cpuwhich_t */ iarg[1] = p->pad; /* int */ - uarg[2] = p->id1; /* u_int32_t */ - uarg[3] = p->id2; /* u_int32_t */ + uarg[2] = p->id1; /* uint32_t */ + uarg[3] = p->id2; /* uint32_t */ iarg[4] = p->setid; /* cpusetid_t */ *n_args = 5; break; @@ -2676,8 +2676,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) case 485: { struct freebsd32_cpuset_setid_args *p = params; iarg[0] = p->which; /* cpuwhich_t */ - uarg[1] = p->id1; /* u_int32_t */ - uarg[2] = p->id2; /* u_int32_t */ + uarg[1] = p->id1; /* uint32_t */ + uarg[2] = p->id2; /* uint32_t */ iarg[3] = p->setid; /* cpusetid_t */ *n_args = 4; break; @@ -2688,8 +2688,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) struct freebsd32_cpuset_getid_args *p = params; iarg[0] = p->level; /* cpulevel_t */ iarg[1] = p->which; /* cpuwhich_t */ - uarg[2] = p->id1; /* u_int32_t */ - uarg[3] = p->id2; /* u_int32_t */ + uarg[2] = p->id1; /* uint32_t */ + uarg[3] = p->id2; /* uint32_t */ uarg[4] = (intptr_t) p->setid; /* cpusetid_t * */ *n_args = 5; break; @@ -2699,8 +2699,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) struct freebsd32_cpuset_getaffinity_args *p = params; iarg[0] = p->level; /* cpulevel_t */ iarg[1] = p->which; /* cpuwhich_t */ - uarg[2] = p->id1; /* u_int32_t */ - uarg[3] = p->id2; /* u_int32_t */ + uarg[2] = p->id1; /* uint32_t */ + uarg[3] = p->id2; /* uint32_t */ uarg[4] = p->cpusetsize; /* size_t */ uarg[5] = (intptr_t) p->mask; /* cpuset_t * */ *n_args = 6; @@ -2711,8 +2711,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) struct freebsd32_cpuset_setaffinity_args *p = params; iarg[0] = p->level; /* cpulevel_t */ iarg[1] = p->which; /* cpuwhich_t */ - uarg[2] = p->id1; /* u_int32_t */ - uarg[3] = p->id2; /* u_int32_t */ + uarg[2] = p->id1; /* uint32_t */ + uarg[3] = p->id2; /* uint32_t */ uarg[4] = p->cpusetsize; /* size_t */ uarg[5] = (intptr_t) p->mask; /* const cpuset_t * */ *n_args = 6; @@ -2753,8 +2753,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) case 492: { struct freebsd32_fexecve_args *p = params; iarg[0] = p->fd; /* int */ - uarg[1] = (intptr_t) p->argv; /* u_int32_t * */ - uarg[2] = (intptr_t) p->envv; /* u_int32_t * */ + uarg[1] = (intptr_t) p->argv; /* uint32_t * */ + uarg[2] = (intptr_t) p->envv; /* uint32_t * */ *n_args = 3; break; } @@ -2943,7 +2943,7 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) case 514: { struct cap_new_args *p = params; iarg[0] = p->fd; /* int */ - uarg[1] = p->rights; /* u_int64_t */ + uarg[1] = p->rights; /* uint64_t */ *n_args = 2; break; } @@ -2951,7 +2951,7 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) case 515: { struct cap_getrights_args *p = params; iarg[0] = p->fd; /* int */ - uarg[1] = (intptr_t) p->rightsp; /* u_int64_t * */ + uarg[1] = (intptr_t) p->rightsp; /* uint64_t * */ *n_args = 2; break; } @@ -3380,19 +3380,19 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 1: - p = "u_int32_t"; + p = "uint32_t"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; case 3: p = "int"; break; case 4: - p = "u_int32_t"; + p = "uint32_t"; break; case 5: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -3679,10 +3679,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "char *"; break; case 1: - p = "u_int32_t *"; + p = "uint32_t *"; break; case 2: - p = "u_int32_t *"; + p = "uint32_t *"; break; default: break; @@ -4664,13 +4664,13 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "void *"; break; case 3: - p = "u_int32_t *"; + p = "uint32_t *"; break; case 4: p = "void *"; break; case 5: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -5217,10 +5217,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "u_int"; break; case 3: - p = "u_int32_t"; + p = "uint32_t"; break; case 4: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -5239,10 +5239,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "u_int"; break; case 3: - p = "u_int32_t"; + p = "uint32_t"; break; case 4: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -6162,10 +6162,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; case 3: - p = "u_int32_t"; + p = "uint32_t"; break; case 4: p = "size_t"; @@ -7135,10 +7135,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 4: - p = "u_int32_t"; + p = "uint32_t"; break; case 5: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -7160,10 +7160,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 4: - p = "u_int32_t"; + p = "uint32_t"; break; case 5: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -7191,10 +7191,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 6: - p = "u_int32_t"; + p = "uint32_t"; break; case 7: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -7210,10 +7210,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; case 3: - p = "u_int32_t"; + p = "uint32_t"; break; case 4: p = "int"; @@ -7232,10 +7232,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; case 3: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -7251,10 +7251,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; case 3: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -7274,10 +7274,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "size_t"; break; case 3: - p = "u_int32_t"; + p = "uint32_t"; break; case 4: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -7296,10 +7296,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "size_t"; break; case 3: - p = "u_int32_t"; + p = "uint32_t"; break; case 4: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -7324,10 +7324,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 5: - p = "u_int32_t"; + p = "uint32_t"; break; case 6: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -7340,10 +7340,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 1: - p = "u_int32_t"; + p = "uint32_t"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; case 3: p = "int"; @@ -7359,10 +7359,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "char *"; break; case 1: - p = "u_int32_t"; + p = "uint32_t"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -7375,10 +7375,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 1: - p = "u_int32_t"; + p = "uint32_t"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; default: break; @@ -7448,10 +7448,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; case 3: - p = "u_int32_t"; + p = "uint32_t"; break; case 4: p = "cpusetid_t"; @@ -7468,10 +7468,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "cpuwhich_t"; break; case 1: - p = "u_int32_t"; + p = "uint32_t"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; case 3: p = "cpusetid_t"; @@ -7491,10 +7491,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "cpuwhich_t"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; case 3: - p = "u_int32_t"; + p = "uint32_t"; break; case 4: p = "cpusetid_t *"; @@ -7513,10 +7513,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "cpuwhich_t"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; case 3: - p = "u_int32_t"; + p = "uint32_t"; break; case 4: p = "size_t"; @@ -7538,10 +7538,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "cpuwhich_t"; break; case 2: - p = "u_int32_t"; + p = "uint32_t"; break; case 3: - p = "u_int32_t"; + p = "uint32_t"; break; case 4: p = "size_t"; @@ -7620,10 +7620,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 1: - p = "u_int32_t *"; + p = "uint32_t *"; break; case 2: - p = "u_int32_t *"; + p = "uint32_t *"; break; default: break; @@ -7959,7 +7959,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 1: - p = "u_int64_t"; + p = "uint64_t"; break; default: break; @@ -7972,7 +7972,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 1: - p = "u_int64_t *"; + p = "uint64_t *"; break; default: break; diff --git a/sys/compat/freebsd32/syscalls.master b/sys/compat/freebsd32/syscalls.master index 11476ed5124..0891e419ac6 100644 --- a/sys/compat/freebsd32/syscalls.master +++ b/sys/compat/freebsd32/syscalls.master @@ -104,9 +104,9 @@ int flags); } 28 AUE_SENDMSG STD { int freebsd32_sendmsg(int s, struct msghdr32 *msg, \ int flags); } -29 AUE_RECVFROM STD { int freebsd32_recvfrom(int s, u_int32_t buf, \ - u_int32_t len, int flags, u_int32_t from, \ - u_int32_t fromlenaddr); } +29 AUE_RECVFROM STD { int freebsd32_recvfrom(int s, uint32_t buf, \ + uint32_t len, int flags, uint32_t from, \ + uint32_t fromlenaddr); } 30 AUE_ACCEPT NOPROTO { int accept(int s, caddr_t name, \ int *anamelen); } 31 AUE_GETPEERNAME NOPROTO { int getpeername(int fdes, caddr_t asa, \ @@ -152,7 +152,7 @@ 58 AUE_READLINK NOPROTO { ssize_t readlink(char *path, char *buf, \ size_t count); } 59 AUE_EXECVE STD { int freebsd32_execve(char *fname, \ - u_int32_t *argv, u_int32_t *envv); } + uint32_t *argv, uint32_t *envv); } 60 AUE_UMASK NOPROTO { int umask(int newmask); } umask \ umask_args int 61 AUE_CHROOT NOPROTO { int chroot(char *path); } @@ -325,10 +325,10 @@ 172 AUE_NULL UNIMPL nosys 173 AUE_PREAD COMPAT6 { ssize_t freebsd32_pread(int fd, void *buf, \ size_t nbyte, int pad, \ - u_int32_t offset1, u_int32_t offset2); } + uint32_t offset1, uint32_t offset2); } 174 AUE_PWRITE COMPAT6 { ssize_t freebsd32_pwrite(int fd, \ const void *buf, size_t nbyte, int pad, \ - u_int32_t offset1, u_int32_t offset2); } + uint32_t offset1, uint32_t offset2); } 175 AUE_NULL UNIMPL nosys 176 AUE_NTP_ADJTIME NOPROTO { int ntp_adjtime(struct timex *tp); } 177 AUE_NULL UNIMPL sfork (BSD/OS 2.x) @@ -363,21 +363,21 @@ char *buf, u_int count, int32_t *basep); } 197 AUE_MMAP COMPAT6 { caddr_t freebsd32_mmap(caddr_t addr, \ size_t len, int prot, int flags, int fd, \ - int pad, u_int32_t pos1, u_int32_t pos2); } + int pad, uint32_t pos1, uint32_t pos2); } 198 AUE_NULL NOPROTO { int nosys(void); } __syscall \ __syscall_args int 199 AUE_LSEEK COMPAT6 { off_t freebsd32_lseek(int fd, int pad, \ - u_int32_t offset1, u_int32_t offset2, \ + uint32_t offset1, uint32_t offset2, \ int whence); } 200 AUE_TRUNCATE COMPAT6 { int freebsd32_truncate(char *path, \ - int pad, u_int32_t length1, \ - u_int32_t length2); } + int pad, uint32_t length1, \ + uint32_t length2); } 201 AUE_FTRUNCATE COMPAT6 { int freebsd32_ftruncate(int fd, int pad, \ - u_int32_t length1, u_int32_t length2); } + uint32_t length1, uint32_t length2); } 202 AUE_SYSCTL STD { int freebsd32_sysctl(int *name, \ u_int namelen, void *old, \ - u_int32_t *oldlenp, void *new, \ - u_int32_t newlen); } + uint32_t *oldlenp, void *new, \ + uint32_t newlen); } 203 AUE_MLOCK NOPROTO { int mlock(const void *addr, \ size_t len); } 204 AUE_MUNLOCK NOPROTO { int munlock(const void *addr, \ @@ -513,11 +513,11 @@ 289 AUE_PREADV STD { ssize_t freebsd32_preadv(int fd, \ struct iovec32 *iovp, \ u_int iovcnt, \ - u_int32_t offset1, u_int32_t offset2); } + uint32_t offset1, uint32_t offset2); } 290 AUE_PWRITEV STD { ssize_t freebsd32_pwritev(int fd, \ struct iovec32 *iovp, \ u_int iovcnt, \ - u_int32_t offset1, u_int32_t offset2); } + uint32_t offset1, uint32_t offset2); } 291 AUE_NULL UNIMPL nosys 292 AUE_NULL UNIMPL nosys 293 AUE_NULL UNIMPL nosys @@ -591,7 +591,7 @@ struct timespec *interval); } 335 AUE_NULL NOPROTO { int utrace(const void *addr, size_t len); } 336 AUE_SENDFILE COMPAT4 { int freebsd32_sendfile(int fd, int s, \ - u_int32_t offset1, u_int32_t offset2, \ + uint32_t offset1, uint32_t offset2, \ size_t nbytes, struct sf_hdtr32 *hdtr, \ off_t *sbytes, int flags); } 337 AUE_NULL NOPROTO { int kldsym(int fileid, int cmd, \ @@ -694,7 +694,7 @@ 392 AUE_NULL NOPROTO { int uuidgen(struct uuid *store, \ int count); } 393 AUE_SENDFILE STD { int freebsd32_sendfile(int fd, int s, \ - u_int32_t offset1, u_int32_t offset2, \ + uint32_t offset1, uint32_t offset2, \ size_t nbytes, struct sf_hdtr32 *hdtr, \ off_t *sbytes, int flags); } 394 AUE_NULL UNIMPL mac_syscall @@ -847,42 +847,42 @@ 475 AUE_PREAD STD { ssize_t freebsd32_pread(int fd, \ void *buf,size_t nbyte, \ int pad, \ - u_int32_t offset1, u_int32_t offset2); } + uint32_t offset1, uint32_t offset2); } 476 AUE_PWRITE STD { ssize_t freebsd32_pwrite(int fd, \ const void *buf, size_t nbyte, \ int pad, \ - u_int32_t offset1, u_int32_t offset2); } + uint32_t offset1, uint32_t offset2); } 477 AUE_MMAP STD { caddr_t freebsd32_mmap(caddr_t addr, \ size_t len, int prot, int flags, int fd, \ int pad, \ - u_int32_t pos1, u_int32_t pos2); } + uint32_t pos1, uint32_t pos2); } 478 AUE_LSEEK STD { off_t freebsd32_lseek(int fd, \ int pad, \ - u_int32_t offset1, u_int32_t offset2, \ + uint32_t offset1, uint32_t offset2, \ int whence); } 479 AUE_TRUNCATE STD { int freebsd32_truncate(char *path, \ int pad, \ - u_int32_t length1, u_int32_t length2); } + uint32_t length1, uint32_t length2); } 480 AUE_FTRUNCATE STD { int freebsd32_ftruncate(int fd, \ int pad, \ - u_int32_t length1, u_int32_t length2); } + uint32_t length1, uint32_t length2); } #else 475 AUE_PREAD STD { ssize_t freebsd32_pread(int fd, \ void *buf,size_t nbyte, \ - u_int32_t offset1, u_int32_t offset2); } + uint32_t offset1, uint32_t offset2); } 476 AUE_PWRITE STD { ssize_t freebsd32_pwrite(int fd, \ const void *buf, size_t nbyte, \ - u_int32_t offset1, u_int32_t offset2); } + uint32_t offset1, uint32_t offset2); } 477 AUE_MMAP STD { caddr_t freebsd32_mmap(caddr_t addr, \ size_t len, int prot, int flags, int fd, \ - u_int32_t pos1, u_int32_t pos2); } + uint32_t pos1, uint32_t pos2); } 478 AUE_LSEEK STD { off_t freebsd32_lseek(int fd, \ - u_int32_t offset1, u_int32_t offset2, \ + uint32_t offset1, uint32_t offset2, \ int whence); } 479 AUE_TRUNCATE STD { int freebsd32_truncate(char *path, \ - u_int32_t length1, u_int32_t length2); } + uint32_t length1, uint32_t length2); } 480 AUE_FTRUNCATE STD { int freebsd32_ftruncate(int fd, \ - u_int32_t length1, u_int32_t length2); } + uint32_t length1, uint32_t length2); } #endif 481 AUE_KILL NOPROTO { int thr_kill2(pid_t pid, long id, int sig); } 482 AUE_SHMOPEN NOPROTO { int shm_open(const char *path, int flags, \ @@ -892,25 +892,25 @@ #ifdef PAD64_REQUIRED 485 AUE_NULL STD { int freebsd32_cpuset_setid(cpuwhich_t which, \ int pad, \ - u_int32_t id1, u_int32_t id2, \ + uint32_t id1, uint32_t id2, \ cpusetid_t setid); } #else 485 AUE_NULL STD { int freebsd32_cpuset_setid(cpuwhich_t which, \ - u_int32_t id1, u_int32_t id2, \ + uint32_t id1, uint32_t id2, \ cpusetid_t setid); } #endif 486 AUE_NULL STD { int freebsd32_cpuset_getid(cpulevel_t level, \ cpuwhich_t which, \ - u_int32_t id1, u_int32_t id2, \ + uint32_t id1, uint32_t id2, \ cpusetid_t *setid); } 487 AUE_NULL STD { int freebsd32_cpuset_getaffinity( \ cpulevel_t level, cpuwhich_t which, \ - u_int32_t id1, u_int32_t id2, \ + uint32_t id1, uint32_t id2, \ size_t cpusetsize, \ cpuset_t *mask); } 488 AUE_NULL STD { int freebsd32_cpuset_setaffinity( \ cpulevel_t level, cpuwhich_t which, \ - u_int32_t id1, u_int32_t id2, \ + uint32_t id1, uint32_t id2, \ size_t cpusetsize, \ const cpuset_t *mask); } 489 AUE_FACCESSAT NOPROTO { int faccessat(int fd, char *path, int amode, \ @@ -920,7 +920,7 @@ 491 AUE_FCHOWNAT NOPROTO { int fchownat(int fd, char *path, uid_t uid, \ gid_t gid, int flag); } 492 AUE_FEXECVE STD { int freebsd32_fexecve(int fd, \ - u_int32_t *argv, u_int32_t *envv); } + uint32_t *argv, uint32_t *envv); } 493 AUE_FSTATAT STD { int freebsd32_fstatat(int fd, char *path, \ struct stat *buf, int flag); } 494 AUE_FUTIMESAT STD { int freebsd32_futimesat(int fd, char *path, \ @@ -959,9 +959,9 @@ 512 AUE_SHMCTL NOSTD { int freebsd32_shmctl(int shmid, int cmd, \ struct shmid_ds32 *buf); } 513 AUE_LPATHCONF NOPROTO { int lpathconf(char *path, int name); } -514 AUE_CAP_NEW NOPROTO { int cap_new(int fd, u_int64_t rights); } +514 AUE_CAP_NEW NOPROTO { int cap_new(int fd, uint64_t rights); } 515 AUE_CAP_GETRIGHTS NOPROTO { int cap_getrights(int fd, \ - u_int64_t *rightsp); } + uint64_t *rightsp); } 516 AUE_CAP_ENTER NOPROTO { int cap_enter(void); } 517 AUE_CAP_GETMODE NOPROTO { int cap_getmode(u_int *modep); } 518 AUE_PDFORK UNIMPL pdfork diff --git a/sys/compat/linux/check_error.d b/sys/compat/linux/check_error.d new file mode 100644 index 00000000000..9e3c00a37db --- /dev/null +++ b/sys/compat/linux/check_error.d @@ -0,0 +1,144 @@ +#!/usr/sbin/dtrace -qs + +/*- + * Copyright (c) 2008-2012 Alexander Leidinger + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * Report error conditions: + * - emulation errors (unsupportet stuff, unknown stuff, ...) + * - kernel errors (resource shortage, ...) + * - programming errors (errors which can happen, but should not happen) + */ + +linuxulator*:dummy::not_implemented, +linuxulator*:emul:proc_exit:child_clear_tid_error, +linuxulator*:emul:proc_exit:futex_failed, +linuxulator*:emul:linux_schedtail:copyout_error, +linuxulator*:futex:futex_get:error, +linuxulator*:futex:futex_sleep:requeue_error, +linuxulator*:futex:futex_sleep:sleep_error, +linuxulator*:futex:futex_wait:copyin_error, +linuxulator*:futex:futex_wait:itimerfix_error, +linuxulator*:futex:futex_wait:sleep_error, +linuxulator*:futex:futex_atomic_op:missing_access_check, +linuxulator*:futex:futex_atomic_op:unimplemented_op, +linuxulator*:futex:futex_atomic_op:unimplemented_cmp, +linuxulator*:futex:linux_sys_futex:unimplemented_clockswitch, +linuxulator*:futex:linux_sys_futex:copyin_error, +linuxulator*:futex:linux_sys_futex:unhandled_efault, +linuxulator*:futex:linux_sys_futex:unimplemented_lock_pi, +linuxulator*:futex:linux_sys_futex:unimplemented_unlock_pi, +linuxulator*:futex:linux_sys_futex:unimplemented_trylock_pi, +linuxulator*:futex:linux_sys_futex:unimplemented_wait_requeue_pi, +linuxulator*:futex:linux_sys_futex:unimplemented_cmp_requeue_pi, +linuxulator*:futex:linux_sys_futex:unknown_operation, +linuxulator*:futex:linux_get_robust_list:copyout_error, +linuxulator*:futex:handle_futex_death:copyin_error, +linuxulator*:futex:fetch_robust_entry:copyin_error, +linuxulator*:futex:release_futexes:copyin_error, +linuxulator*:time:linux_clock_gettime:conversion_error, +linuxulator*:time:linux_clock_gettime:gettime_error, +linuxulator*:time:linux_clock_gettime:copyout_error, +linuxulator*:time:linux_clock_settime:conversion_error, +linuxulator*:time:linux_clock_settime:settime_error, +linuxulator*:time:linux_clock_settime:copyin_error, +linuxulator*:time:linux_clock_getres:conversion_error, +linuxulator*:time:linux_clock_getres:getres_error, +linuxulator*:time:linux_clock_getres:copyout_error, +linuxulator*:time:linux_nanosleep:conversion_error, +linuxulator*:time:linux_nanosleep:nanosleep_error, +linuxulator*:time:linux_nanosleep:copyout_error, +linuxulator*:time:linux_nanosleep:copyin_error, +linuxulator*:time:linux_clock_nanosleep:copyin_error, +linuxulator*:time:linux_clock_nanosleep:conversion_error, +linuxulator*:time:linux_clock_nanosleep:copyout_error, +linuxulator*:time:linux_clock_nanosleep:nanosleep_error, +linuxulator*:sysctl:handle_string:copyout_error, +linuxulator*:sysctl:linux_sysctl:copyin_error, +linuxulator*:mib:linux_sysctl_osname:sysctl_string_error, +linuxulator*:mib:linux_sysctl_osrelease:sysctl_string_error, +linuxulator*:mib:linux_sysctl_oss_version:sysctl_string_error, +linuxulator*:mib:linux_prison_create:vfs_copyopt_error, +linuxulator*:mib:linux_prison_check:vfs_copyopt_error, +linuxulator*:mib:linux_prison_check:vfs_getopt_error, +linuxulator*:mib:linux_prison_set:vfs_copyopt_error, +linuxulator*:mib:linux_prison_set:vfs_getopt_error, +linuxulator*:mib:linux_prison_get:vfs_setopt_error, +linuxulator*:mib:linux_prison_get:vfs_setopts_error +{ + printf("ERROR: %s in %s:%s:%s\n", probename, probeprov, probemod, probefunc); + stack(); + ustack(); +} + +linuxulator*:util:linux_driver_get_name_dev:nullcall, +linuxulator*:util:linux_driver_get_major_minor:nullcall, +linuxulator*:futex:linux_sys_futex:invalid_cmp_requeue_use, +linuxulator*:futex:linux_sys_futex:deprecated_requeue, +linuxulator*:futex:linux_set_robust_list:size_error, +linuxulator*:time:linux_clock_getres:nullcall +{ + printf("WARNING: %s:%s:%s:%s in application %s, maybe an application error?\n", probename, probeprov, probemod, probefunc, execname); + stack(); + ustack(); +} + +linuxulator*:util:linux_driver_get_major_minor:notfound +{ + printf("WARNING: Application %s failed to find %s in %s:%s:%s, this may or may not be a problem.\n", execname, stringof(args[0]), probename, probeprov, probemod); + stack(); + ustack(); +} + +linuxulator*:time:linux_to_native_clockid:unknown_clockid +{ + printf("INFO: Application %s tried to use unknown clockid %d. Please report this to freebsd-emulation@FreeBSD.org.\n", execname, arg0); +} + +linuxulator*:time:linux_to_native_clockid:unsupported_clockid, +linuxulator*:time:linux_clock_nanosleep:unsupported_clockid +{ + printf("WARNING: Application %s tried to use unsupported clockid (%d), this may or may not be a problem for the application.\nPatches to support this clockid are welcome on the freebsd-emulation@FreeBSD.org mailinglist.\n", execname, arg0); +} + +linuxulator*:time:linux_clock_nanosleep:unsupported_flags +{ + printf("WARNING: Application %s tried to use unsupported flags (%d), this may or may not be a problem for the application.\nPatches to support those flags are welcome on the freebsd-emulation@FreeBSD.org mailinglist.\n", execname, arg0); +} + +linuxulator*:sysctl:linux_sysctl:wrong_length +{ + printf("ERROR: Application %s issued a sysctl which failed the length restrictions.\nThe length passed is %d, the min length supported is 1 and the max length supported is %d.\n", execname, arg0, arg1); + stack(); + ustack(); +} + +linuxulator*:sysctl:linux_sysctl:unsupported_sysctl +{ + printf("ERROR: Application %s issued an unsupported sysctl (%s).\nPatches to support this sysctl are welcome on the freebsd-emulation@FreeBSD.org mailinglist.\n", execname, stringof(args[0])); +} diff --git a/sys/compat/linux/check_internal_locks.d b/sys/compat/linux/check_internal_locks.d new file mode 100644 index 00000000000..2bdef684fad --- /dev/null +++ b/sys/compat/linux/check_internal_locks.d @@ -0,0 +1,132 @@ +#!/usr/sbin/dtrace -qs + +/*- + * Copyright (c) 2008-2012 Alexander Leidinger + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/** + * Check if the internal locks are correctly acquired/released: + * - no recursive locking (mtx locks, write locks) + * - no unlocking of already unlocked one + * + * Print stacktrace if a lock is longer locked than about 10sec or more. + */ + +#pragma D option dynvarsize=32m +#pragma D option specsize=32m + +BEGIN +{ + check["emul_lock"] = 0; + check["emul_shared_rlock"] = 0; + check["emul_shared_wlock"] = 0; + check["futex_mtx"] = 0; +} + +linuxulator*:locks:emul_lock:locked, +linuxulator*:locks:emul_shared_wlock:locked, +linuxulator*:locks:futex_mtx:locked +/check[probefunc] > 0/ +{ + printf("ERROR: recursive lock of %s (%p),", probefunc, arg0); + printf(" or missing SDT probe in kernel. Stack trace follows:"); + stack(); +} + +linuxulator*:locks:emul_lock:locked, +linuxulator*:locks:emul_shared_rlock:locked, +linuxulator*:locks:emul_shared_wlock:locked, +linuxulator*:locks:futex_mtx:locked +{ + ++check[probefunc]; + @stats[probefunc] = count(); + + ts[probefunc] = timestamp; + spec[probefunc] = speculation(); +} + +linuxulator*:locks:emul_lock:unlock, +linuxulator*:locks:emul_shared_rlock:unlock, +linuxulator*:locks:emul_shared_wlock:unlock, +linuxulator*:locks:futex_mtx:unlock +/check[probefunc] == 0/ +{ + printf("ERROR: unlock attemt of unlocked %s (%p),", probefunc, arg0); + printf(" missing SDT probe in kernel, or dtrace program started"); + printf(" while the %s was already held (race condition).", probefunc); + printf(" Stack trace follows:"); + stack(); +} + +linuxulator*:locks:emul_lock:unlock, +linuxulator*:locks:emul_shared_rlock:unlock, +linuxulator*:locks:emul_shared_wlock:unlock, +linuxulator*:locks:futex_mtx:unlock +{ + discard(spec[probefunc]); + spec[probefunc] = 0; + --check[probefunc]; +} + +/* Timeout handling */ + +tick-10s +/spec["emul_lock"] != 0 && timestamp - ts["emul_lock"] >= 9999999000/ +{ + commit(spec["emul_lock"]); + spec["emul_lock"] = 0; +} + +tick-10s +/spec["emul_shared_wlock"] != 0 && timestamp - ts["emul_shared_wlock"] >= 9999999000/ +{ + commit(spec["emul_shared_wlock"]); + spec["emul_shared_wlock"] = 0; +} + +tick-10s +/spec["emul_shared_rlock"] != 0 && timestamp - ts["emul_shared_rlock"] >= 9999999000/ +{ + commit(spec["emul_shared_rlock"]); + spec["emul_shared_rlock"] = 0; +} + +tick-10s +/spec["futex_mtx"] != 0 && timestamp - ts["futex_mtx"] >= 9999999000/ +{ + commit(spec["futex_mtx"]); + spec["futex_mtx"] = 0; +} + + +/* Statistics */ + +END +{ + printf("Number of locks per type:"); + printa(@stats); +} diff --git a/sys/compat/linux/linux_dtrace.h b/sys/compat/linux/linux_dtrace.h new file mode 100644 index 00000000000..b6a2b33f764 --- /dev/null +++ b/sys/compat/linux/linux_dtrace.h @@ -0,0 +1,95 @@ +/*- + * Copyright (c) 2008-2012 Alexander Leidinger + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _LINUX_DTRACE_H_ +#define _LINUX_DTRACE_H_ + +/** + * DTrace support macros for the linuxulator. + * + * Some wrapper macros to make it more easy to handle the linuxulator + * providers and to allow to make the name depend upon the bitsize. + * + * Basically this is the same as the normal SDT macros in sys/sdt.h. The + * difference is that the provider name is automatically inserted, and + * we do not use a different name for the probe-description. + */ + +#define LIN_SDT_PROVIDER_DEFINE(x) SDT_PROVIDER_DEFINE(x) +#define LIN_SDT_PROVIDER_DECLARE(x) SDT_PROVIDER_DECLARE(x) + +#define _LIN_SDT_PROBE_DECLARE(a, b, c, d) SDT_PROBE_DECLARE(a, b, c, d) +#define LIN_SDT_PROBE_DECLARE(a, b, c) _LIN_SDT_PROBE_DECLARE( \ + LINUX_DTRACE, a, b, c) + +#define _LIN_SDT_PROBE_DEFINE0(a, b, c, d) SDT_PROBE_DEFINE(a, \ + b, c, d, d) +#define LIN_SDT_PROBE_DEFINE0(a, b, c) _LIN_SDT_PROBE_DEFINE0(\ + LINUX_DTRACE, a, b, c) +#define _LIN_SDT_PROBE_DEFINE1(a, b, c, d, e) SDT_PROBE_DEFINE1(a, \ + b, c, d, d, e) +#define LIN_SDT_PROBE_DEFINE1(a, b, c, d) _LIN_SDT_PROBE_DEFINE1(\ + LINUX_DTRACE, a, b, c, d) +#define _LIN_SDT_PROBE_DEFINE2(a, b, c, d, e, f) SDT_PROBE_DEFINE2(a, \ + b, c, d, d, e, f) +#define LIN_SDT_PROBE_DEFINE2(a, b, c, d, e) _LIN_SDT_PROBE_DEFINE2(\ + LINUX_DTRACE, a, b, c, d, e) +#define _LIN_SDT_PROBE_DEFINE3(a, b, c, d, e, f, g) SDT_PROBE_DEFINE3(a, \ + b, c, d, d, e, f, g) +#define LIN_SDT_PROBE_DEFINE3(a, b, c, d, e, f) _LIN_SDT_PROBE_DEFINE3(\ + LINUX_DTRACE, a, b, c, d, e, f) +#define _LIN_SDT_PROBE_DEFINE4(a, b, c, d, e, f, g, h) SDT_PROBE_DEFINE4(a, \ + b, c, d, d, e, f, g, h) +#define LIN_SDT_PROBE_DEFINE4(a, b, c, d, e, f, g) _LIN_SDT_PROBE_DEFINE4(\ + LINUX_DTRACE, a, b, c, d, e, f, g) +#define _LIN_SDT_PROBE_DEFINE5(a, b, c, d, e, f, g, h, i) \ + SDT_PROBE_DEFINE5(a, b, c, d, d, e, f, g, h, i) +#define LIN_SDT_PROBE_DEFINE5(a, b, c, d, e, f, g, h) _LIN_SDT_PROBE_DEFINE5(\ + LINUX_DTRACE, a, b, c, d, e, f, g, h) + +#define _LIN_SDT_PROBE_ARGTYPE(a, b, c, d, e, f) SDT_PROBE_ARGTYPE(a, b,\ + c, d, e, f) +#define LIN_SDT_PROBE_ARGTYPE(a, b, c, d, e) _LIN_SDT_PROBE_ARGTYPE( \ + LINUX_DTRACE, a, b, c, d, e) + +#define LIN_SDT_PROBE0(a, b, c) SDT_PROBE1(LINUX_DTRACE, a, b, \ + c, 0) +#define LIN_SDT_PROBE1(a, b, c, d) SDT_PROBE1(LINUX_DTRACE, a, b, \ + c, d) +#define LIN_SDT_PROBE2(a, b, c, d, e) SDT_PROBE2(LINUX_DTRACE, a, b, \ + c, d, e) +#define LIN_SDT_PROBE3(a, b, c, d, e, f) SDT_PROBE3(LINUX_DTRACE, a, b, \ + c, d, e, f) +#define LIN_SDT_PROBE4(a, b, c, d, e, f, g) SDT_PROBE4(LINUX_DTRACE, a, b, \ + c, d, e, f, g) +#define _LIN_SDT_PROBE5(a, b, c, d, e, f, g, h, i) SDT_PROBE(a, b, c, d, \ + e, f, g, h, i) +#define LIN_SDT_PROBE5(a, b, c, d, e, f, g, h) _LIN_SDT_PROBE5(LINUX_DTRACE, \ + a, b, c, d, e, f, g, h) + +#endif /* _LINUX_DTRACE_H_ */ diff --git a/sys/compat/linux/linux_emul.c b/sys/compat/linux/linux_emul.c index d6b2f71f5ce..6a1098d409f 100644 --- a/sys/compat/linux/linux_emul.c +++ b/sys/compat/linux/linux_emul.c @@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" +#include "opt_kdtrace.h" #include #include @@ -38,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -53,9 +55,64 @@ __FBSDID("$FreeBSD$"); #include #endif +#include #include #include +/** + * Special DTrace provider for the linuxulator. + * + * In this file we define the provider for the entire linuxulator. All + * modules (= files of the linuxulator) use it. + * + * We define a different name depending on the emulated bitsize, see + * ../..//linux{,32}/linux.h, e.g.: + * native bitsize = linuxulator + * amd64, 32bit emulation = linuxulator32 + */ +LIN_SDT_PROVIDER_DEFINE(LINUX_DTRACE); + +/** + * Special DTrace module "locks", it covers some linuxulator internal + * locks. + */ +LIN_SDT_PROBE_DEFINE1(locks, emul_lock, locked, "struct mtx *"); +LIN_SDT_PROBE_DEFINE1(locks, emul_lock, unlock, "struct mtx *"); +LIN_SDT_PROBE_DEFINE1(locks, emul_shared_rlock, locked, "struct sx *"); +LIN_SDT_PROBE_DEFINE1(locks, emul_shared_rlock, unlock, "struct sx *"); +LIN_SDT_PROBE_DEFINE1(locks, emul_shared_wlock, locked, "struct sx *"); +LIN_SDT_PROBE_DEFINE1(locks, emul_shared_wlock, unlock, "struct sx *"); + +/** + * DTrace probes in this module. + */ +LIN_SDT_PROBE_DEFINE2(emul, em_find, entry, "struct proc *", "int"); +LIN_SDT_PROBE_DEFINE0(emul, em_find, return); +LIN_SDT_PROBE_DEFINE3(emul, proc_init, entry, "struct thread *", "pid_t", + "int"); +LIN_SDT_PROBE_DEFINE0(emul, proc_init, create_thread); +LIN_SDT_PROBE_DEFINE0(emul, proc_init, fork); +LIN_SDT_PROBE_DEFINE0(emul, proc_init, exec); +LIN_SDT_PROBE_DEFINE0(emul, proc_init, return); +LIN_SDT_PROBE_DEFINE1(emul, proc_exit, entry, "struct proc *"); +LIN_SDT_PROBE_DEFINE0(emul, proc_exit, futex_failed); +LIN_SDT_PROBE_DEFINE3(emul, proc_exit, reparent, "pid_t", "pid_t", + "struct proc *"); +LIN_SDT_PROBE_DEFINE1(emul, proc_exit, child_clear_tid_error, "int"); +LIN_SDT_PROBE_DEFINE0(emul, proc_exit, return); +LIN_SDT_PROBE_DEFINE2(emul, proc_exec, entry, "struct proc *", + "struct image_params *"); +LIN_SDT_PROBE_DEFINE0(emul, proc_exec, return); +LIN_SDT_PROBE_DEFINE0(emul, linux_schedtail, entry); +LIN_SDT_PROBE_DEFINE1(emul, linux_schedtail, copyout_error, "int"); +LIN_SDT_PROBE_DEFINE0(emul, linux_schedtail, return); +LIN_SDT_PROBE_DEFINE1(emul, linux_set_tid_address, entry, "int *"); +LIN_SDT_PROBE_DEFINE0(emul, linux_set_tid_address, return); +LIN_SDT_PROBE_DEFINE2(emul, linux_kill_threads, entry, "struct thread *", + "int"); +LIN_SDT_PROBE_DEFINE1(emul, linux_kill_threads, kill, "pid_t"); +LIN_SDT_PROBE_DEFINE0(emul, linux_kill_threads, return); + struct sx emul_shared_lock; struct mtx emul_lock; @@ -65,6 +122,8 @@ em_find(struct proc *p, int locked) { struct linux_emuldata *em; + LIN_SDT_PROBE2(emul, em_find, entry, p, locked); + if (locked == EMUL_DOLOCK) EMUL_LOCK(&emul_lock); @@ -73,6 +132,7 @@ em_find(struct proc *p, int locked) if (em == NULL && locked == EMUL_DOLOCK) EMUL_UNLOCK(&emul_lock); + LIN_SDT_PROBE1(emul, em_find, return, em); return (em); } @@ -82,8 +142,10 @@ linux_proc_init(struct thread *td, pid_t child, int flags) struct linux_emuldata *em, *p_em; struct proc *p; + LIN_SDT_PROBE3(emul, proc_init, entry, td, child, flags); + if (child != 0) { - /* non-exec call */ + /* fork or create a thread */ em = malloc(sizeof *em, M_LINUX, M_WAITOK | M_ZERO); em->pid = child; em->pdeath_signal = 0; @@ -91,9 +153,12 @@ linux_proc_init(struct thread *td, pid_t child, int flags) em->robust_futexes = NULL; if (flags & LINUX_CLONE_THREAD) { /* handled later in the code */ + LIN_SDT_PROBE0(emul, proc_init, create_thread); } else { struct linux_emuldata_shared *s; + LIN_SDT_PROBE0(emul, proc_init, fork); + s = malloc(sizeof *s, M_LINUX, M_WAITOK | M_ZERO); s->refs = 1; s->group_pid = child; @@ -102,6 +167,9 @@ linux_proc_init(struct thread *td, pid_t child, int flags) em->shared = s; } } else { + /* exec */ + LIN_SDT_PROBE0(emul, proc_init, exec); + /* lookup the old one */ em = em_find(td->td_proc, EMUL_DOLOCK); KASSERT(em != NULL, ("proc_init: emuldata not found in exec case.\n")); @@ -136,8 +204,7 @@ linux_proc_init(struct thread *td, pid_t child, int flags) * rwlock held */ } - } - if (child != 0) { + EMUL_SHARED_WLOCK(&emul_shared_lock); LIST_INSERT_HEAD(&em->shared->threads, em, threads); EMUL_SHARED_WUNLOCK(&emul_shared_lock); @@ -149,6 +216,7 @@ linux_proc_init(struct thread *td, pid_t child, int flags) } else EMUL_UNLOCK(&emul_lock); + LIN_SDT_PROBE0(emul, proc_init, return); return (0); } @@ -164,6 +232,8 @@ linux_proc_exit(void *arg __unused, struct proc *p) if (__predict_true(p->p_sysent != &elf_linux_sysvec)) return; + LIN_SDT_PROBE1(emul, proc_exit, entry, p); + release_futexes(p); /* find the emuldata */ @@ -173,6 +243,9 @@ linux_proc_exit(void *arg __unused, struct proc *p) /* reparent all procs that are not a thread leader to initproc */ if (em->shared->group_pid != p->p_pid) { + LIN_SDT_PROBE3(emul, proc_exit, reparent, + em->shared->group_pid, p->p_pid, p); + child_clear_tid = em->child_clear_tid; EMUL_UNLOCK(&emul_lock); sx_xlock(&proctree_lock); @@ -208,7 +281,12 @@ linux_proc_exit(void *arg __unused, struct proc *p) error = copyout(&null, child_clear_tid, sizeof(null)); if (error) { + LIN_SDT_PROBE1(emul, proc_exit, + child_clear_tid_error, error); + free(em, M_LINUX); + + LIN_SDT_PROBE0(emul, proc_exit, return); return; } @@ -224,8 +302,10 @@ linux_proc_exit(void *arg __unused, struct proc *p) * this cannot happen at the moment and if this happens it * probably means there is a user space bug */ - if (error) + if (error) { + LIN_SDT_PROBE0(emul, proc_exit, futex_failed); printf(LMSG("futex stuff in proc_exit failed.\n")); + } } /* clean the stuff up */ @@ -250,6 +330,8 @@ linux_proc_exit(void *arg __unused, struct proc *p) EMUL_UNLOCK(&emul_lock); } sx_xunlock(&proctree_lock); + + LIN_SDT_PROBE0(emul, proc_exit, return); } /* @@ -260,6 +342,9 @@ linux_proc_exit(void *arg __unused, struct proc *p) void linux_proc_exec(void *arg __unused, struct proc *p, struct image_params *imgp) { + if (__predict_false(imgp->sysent == &elf_linux_sysvec)) { + LIN_SDT_PROBE2(emul, proc_exec, entry, p, imgp); + } if (__predict_false(imgp->sysent == &elf_linux_sysvec && p->p_sysent != &elf_linux_sysvec)) linux_proc_init(FIRST_THREAD_IN_PROC(p), p->p_pid, 0); @@ -297,6 +382,10 @@ linux_proc_exec(void *arg __unused, struct proc *p, struct image_params *imgp) free(em, M_LINUX); } + + if (__predict_false(imgp->sysent == &elf_linux_sysvec)) { + LIN_SDT_PROBE0(emul, proc_exec, return); + } } void @@ -309,6 +398,8 @@ linux_schedtail(struct thread *td) p = td->td_proc; + LIN_SDT_PROBE1(emul, linux_schedtail, entry, p); + /* find the emuldata */ em = em_find(p, EMUL_DOLOCK); @@ -316,10 +407,18 @@ linux_schedtail(struct thread *td) child_set_tid = em->child_set_tid; EMUL_UNLOCK(&emul_lock); - if (child_set_tid != NULL) + if (child_set_tid != NULL) { error = copyout(&p->p_pid, (int *)child_set_tid, sizeof(p->p_pid)); + if (error != 0) { + LIN_SDT_PROBE1(emul, linux_schedtail, copyout_error, + error); + } + } + + LIN_SDT_PROBE0(emul, linux_schedtail, return); + return; } @@ -328,10 +427,7 @@ linux_set_tid_address(struct thread *td, struct linux_set_tid_address_args *args { struct linux_emuldata *em; -#ifdef DEBUG - if (ldebug(set_tid_address)) - printf(ARGS(set_tid_address, "%p"), args->tidptr); -#endif + LIN_SDT_PROBE1(emul, linux_set_tid_address, entry, args->tidptr); /* find the emuldata */ em = em_find(td->td_proc, EMUL_DOLOCK); @@ -342,6 +438,8 @@ linux_set_tid_address(struct thread *td, struct linux_set_tid_address_args *args td->td_retval[0] = td->td_proc->p_pid; EMUL_UNLOCK(&emul_lock); + + LIN_SDT_PROBE0(emul, linux_set_tid_address, return); return 0; } @@ -351,6 +449,8 @@ linux_kill_threads(struct thread *td, int sig) struct linux_emuldata *em, *td_em, *tmp_em; struct proc *sp; + LIN_SDT_PROBE2(emul, linux_kill_threads, entry, td, sig); + td_em = em_find(td->td_proc, EMUL_DONTLOCK); KASSERT(td_em != NULL, ("linux_kill_threads: emuldata not found.\n")); @@ -364,9 +464,10 @@ linux_kill_threads(struct thread *td, int sig) if ((sp->p_flag & P_WEXIT) == 0) kern_psignal(sp, sig); PROC_UNLOCK(sp); -#ifdef DEBUG - printf(LMSG("linux_kill_threads: kill PID %d\n"), em->pid); -#endif + + LIN_SDT_PROBE1(emul, linux_kill_threads, kill, em->pid); } EMUL_SHARED_RUNLOCK(&emul_shared_lock); + + LIN_SDT_PROBE0(emul, linux_kill_threads, return); } diff --git a/sys/compat/linux/linux_emul.h b/sys/compat/linux/linux_emul.h index 3acde64b68c..f409a34da47 100644 --- a/sys/compat/linux/linux_emul.h +++ b/sys/compat/linux/linux_emul.h @@ -64,13 +64,42 @@ struct linux_emuldata { struct linux_emuldata *em_find(struct proc *, int locked); -#define EMUL_LOCK(l) mtx_lock(l) -#define EMUL_UNLOCK(l) mtx_unlock(l) +/* + * DTrace probes for locks should be fired after locking and before releasing + * to prevent races (to provide data/function stability in dtrace, see the + * output of "dtrace -v ..." and the corresponding dtrace docs). + */ +#define EMUL_LOCK(l) do { \ + mtx_lock(l); \ + LIN_SDT_PROBE1(locks, emul_lock, \ + locked, l); \ + } while (0) +#define EMUL_UNLOCK(l) do { \ + LIN_SDT_PROBE1(locks, emul_lock, \ + unlock, l); \ + mtx_unlock(l); \ + } while (0) -#define EMUL_SHARED_RLOCK(l) sx_slock(l) -#define EMUL_SHARED_RUNLOCK(l) sx_sunlock(l) -#define EMUL_SHARED_WLOCK(l) sx_xlock(l) -#define EMUL_SHARED_WUNLOCK(l) sx_xunlock(l) +#define EMUL_SHARED_RLOCK(l) do { \ + sx_slock(l); \ + LIN_SDT_PROBE1(locks, emul_shared_rlock, \ + locked, l); \ + } while (0) +#define EMUL_SHARED_RUNLOCK(l) do { \ + LIN_SDT_PROBE1(locks, emul_shared_rlock, \ + unlock, l); \ + sx_sunlock(l); \ + } while (0) +#define EMUL_SHARED_WLOCK(l) do { \ + sx_xlock(l); \ + LIN_SDT_PROBE1(locks, emul_shared_wlock, \ + locked, l); \ + } while (0) +#define EMUL_SHARED_WUNLOCK(l) do { \ + LIN_SDT_PROBE1(locks, emul_shared_wlock, \ + unlock, l); \ + sx_xunlock(l); \ + } while (0) /* for em_find use */ #define EMUL_DOLOCK 1 diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c index 67b1b389ddb..b0c2e4ad6b1 100644 --- a/sys/compat/linux/linux_file.c +++ b/sys/compat/linux/linux_file.c @@ -357,15 +357,16 @@ getdents_common(struct thread *td, struct linux_getdents64_args *args, return (EBADF); } + off = foffset_lock(fp, 0); vp = fp->f_vnode; vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type != VDIR) { VFS_UNLOCK_GIANT(vfslocked); + foffset_unlock(fp, off, 0); fdrop(fp, td); return (EINVAL); } - off = fp->f_offset; buflen = max(LINUX_DIRBLKSIZ, nbytes); buflen = min(buflen, MAXBSIZE); @@ -514,7 +515,6 @@ getdents_common(struct thread *td, struct linux_getdents64_args *args, goto eof; } - fp->f_offset = off; if (justone) nbytes = resid + linuxreclen; @@ -527,6 +527,7 @@ out: VOP_UNLOCK(vp, 0); VFS_UNLOCK_GIANT(vfslocked); + foffset_unlock(fp, off, 0); fdrop(fp, td); free(buf, M_TEMP); free(lbuf, M_TEMP); diff --git a/sys/compat/linux/linux_fork.c b/sys/compat/linux/linux_fork.c index 5d2ce5bdb0c..f71063ca3a9 100644 --- a/sys/compat/linux/linux_fork.c +++ b/sys/compat/linux/linux_fork.c @@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" +#include "opt_kdtrace.h" #include #include @@ -38,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -48,9 +50,17 @@ __FBSDID("$FreeBSD$"); #include #include #endif +#include #include #include +/* DTrace init */ +LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE); + +/* Linuxulator-global DTrace probes */ +LIN_SDT_PROBE_DECLARE(locks, emul_lock, locked); +LIN_SDT_PROBE_DECLARE(locks, emul_lock, unlock); + int linux_fork(struct thread *td, struct linux_fork_args *args) diff --git a/sys/compat/linux/linux_futex.c b/sys/compat/linux/linux_futex.c index 44d68f4260e..c87fd00521c 100644 --- a/sys/compat/linux/linux_futex.c +++ b/sys/compat/linux/linux_futex.c @@ -38,6 +38,7 @@ __KERNEL_RCSID(1, "$NetBSD: linux_futex.c,v 1.7 2006/07/24 19:01:49 manu Exp $") #endif #include "opt_compat.h" +#include "opt_kdtrace.h" #include #include @@ -51,6 +52,7 @@ __KERNEL_RCSID(1, "$NetBSD: linux_futex.c,v 1.7 2006/07/24 19:01:49 manu Exp $") #include #include #include +#include #include #include @@ -61,10 +63,131 @@ __KERNEL_RCSID(1, "$NetBSD: linux_futex.c,v 1.7 2006/07/24 19:01:49 manu Exp $") #include #include #endif +#include #include #include #include +/* DTrace init */ +LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE); + +/* Linuxulator-global DTrace probes */ +LIN_SDT_PROBE_DECLARE(locks, emul_lock, locked); +LIN_SDT_PROBE_DECLARE(locks, emul_lock, unlock); + +/** + * Futex part for the special DTrace module "locks". + */ +LIN_SDT_PROBE_DEFINE1(locks, futex_mtx, locked, "struct mtx *"); +LIN_SDT_PROBE_DEFINE1(locks, futex_mtx, unlock, "struct mtx *"); + +/** + * Per futex probes. + */ +LIN_SDT_PROBE_DEFINE1(futex, futex, create, "struct sx *"); +LIN_SDT_PROBE_DEFINE1(futex, futex, destroy, "struct sx *"); + +/** + * DTrace probes in this module. + */ +LIN_SDT_PROBE_DEFINE2(futex, futex_put, entry, "struct futex *", + "struct waiting_proc *"); +LIN_SDT_PROBE_DEFINE3(futex, futex_put, destroy, "uint32_t *", "uint32_t", + "int"); +LIN_SDT_PROBE_DEFINE3(futex, futex_put, unlock, "uint32_t *", "uint32_t", + "int"); +LIN_SDT_PROBE_DEFINE0(futex, futex_put, return); +LIN_SDT_PROBE_DEFINE3(futex, futex_get0, entry, "uint32_t *", "struct futex **", + "uint32_t"); +LIN_SDT_PROBE_DEFINE1(futex, futex_get0, umtx_key_get_error, "int"); +LIN_SDT_PROBE_DEFINE3(futex, futex_get0, shared, "uint32_t *", "uint32_t", + "int"); +LIN_SDT_PROBE_DEFINE1(futex, futex_get0, null, "uint32_t *"); +LIN_SDT_PROBE_DEFINE3(futex, futex_get0, new, "uint32_t *", "uint32_t", "int"); +LIN_SDT_PROBE_DEFINE1(futex, futex_get0, return, "int"); +LIN_SDT_PROBE_DEFINE3(futex, futex_get, entry, "uint32_t *", + "struct waiting_proc **", "struct futex **"); +LIN_SDT_PROBE_DEFINE0(futex, futex_get, error); +LIN_SDT_PROBE_DEFINE1(futex, futex_get, return, "int"); +LIN_SDT_PROBE_DEFINE3(futex, futex_sleep, entry, "struct futex *", + "struct waiting_proc **", "int"); +LIN_SDT_PROBE_DEFINE5(futex, futex_sleep, requeue_error, "int", "uint32_t *", + "struct waiting_proc *", "uint32_t *", "uint32_t"); +LIN_SDT_PROBE_DEFINE3(futex, futex_sleep, sleep_error, "int", "uint32_t *", + "struct waiting_proc *"); +LIN_SDT_PROBE_DEFINE1(futex, futex_sleep, return, "int"); +LIN_SDT_PROBE_DEFINE3(futex, futex_wake, entry, "struct futex *", "int", + "uint32_t"); +LIN_SDT_PROBE_DEFINE3(futex, futex_wake, iterate, "uint32_t", + "struct waiting_proc *", "uin32_t"); +LIN_SDT_PROBE_DEFINE1(futex, futex_wake, wakeup, "struct waiting_proc *"); +LIN_SDT_PROBE_DEFINE1(futex, futex_wake, return, "int"); +LIN_SDT_PROBE_DEFINE4(futex, futex_requeue, entry, "struct futex *", "int", + "struct futex *", "int"); +LIN_SDT_PROBE_DEFINE1(futex, futex_requeue, wakeup, "struct waiting_proc *"); +LIN_SDT_PROBE_DEFINE3(futex, futex_requeue, requeue, "uint32_t *", + "struct waiting_proc *", "uint32_t"); +LIN_SDT_PROBE_DEFINE1(futex, futex_requeue, return, "int"); +LIN_SDT_PROBE_DEFINE4(futex, futex_wait, entry, "struct futex *", + "struct waiting_proc **", "struct l_timespec *", "uint32_t"); +LIN_SDT_PROBE_DEFINE1(futex, futex_wait, copyin_error, "int"); +LIN_SDT_PROBE_DEFINE1(futex, futex_wait, itimerfix_error, "int"); +LIN_SDT_PROBE_DEFINE1(futex, futex_wait, sleep_error, "int"); +LIN_SDT_PROBE_DEFINE1(futex, futex_wait, return, "int"); +LIN_SDT_PROBE_DEFINE3(futex, futex_atomic_op, entry, "struct thread *", + "int", "uint32_t"); +LIN_SDT_PROBE_DEFINE4(futex, futex_atomic_op, decoded_op, "int", "int", "int", + "int"); +LIN_SDT_PROBE_DEFINE0(futex, futex_atomic_op, missing_access_check); +LIN_SDT_PROBE_DEFINE1(futex, futex_atomic_op, unimplemented_op, "int"); +LIN_SDT_PROBE_DEFINE1(futex, futex_atomic_op, unimplemented_cmp, "int"); +LIN_SDT_PROBE_DEFINE1(futex, futex_atomic_op, return, "int"); +LIN_SDT_PROBE_DEFINE2(futex, linux_sys_futex, entry, "struct thread *", + "struct linux_sys_futex_args *"); +LIN_SDT_PROBE_DEFINE0(futex, linux_sys_futex, unimplemented_clockswitch); +LIN_SDT_PROBE_DEFINE1(futex, linux_sys_futex, copyin_error, "int"); +LIN_SDT_PROBE_DEFINE0(futex, linux_sys_futex, invalid_cmp_requeue_use); +LIN_SDT_PROBE_DEFINE3(futex, linux_sys_futex, debug_wait, "uint32_t *", + "uint32_t", "uint32_t"); +LIN_SDT_PROBE_DEFINE4(futex, linux_sys_futex, debug_wait_value_neq, + "uint32_t *", "uint32_t", "int", "uint32_t"); +LIN_SDT_PROBE_DEFINE3(futex, linux_sys_futex, debug_wake, "uint32_t *", + "uint32_t", "uint32_t"); +LIN_SDT_PROBE_DEFINE5(futex, linux_sys_futex, debug_cmp_requeue, "uint32_t *", + "uint32_t", "uint32_t", "uint32_t *", "struct l_timespec *"); +LIN_SDT_PROBE_DEFINE2(futex, linux_sys_futex, debug_cmp_requeue_value_neq, + "uint32_t", "int"); +LIN_SDT_PROBE_DEFINE5(futex, linux_sys_futex, debug_wake_op, "uint32_t *", + "int", "uint32_t", "uint32_t *", "uint32_t"); +LIN_SDT_PROBE_DEFINE0(futex, linux_sys_futex, unhandled_efault); +LIN_SDT_PROBE_DEFINE0(futex, linux_sys_futex, unimplemented_lock_pi); +LIN_SDT_PROBE_DEFINE0(futex, linux_sys_futex, unimplemented_unlock_pi); +LIN_SDT_PROBE_DEFINE0(futex, linux_sys_futex, unimplemented_trylock_pi); +LIN_SDT_PROBE_DEFINE0(futex, linux_sys_futex, deprecated_requeue); +LIN_SDT_PROBE_DEFINE0(futex, linux_sys_futex, unimplemented_wait_requeue_pi); +LIN_SDT_PROBE_DEFINE0(futex, linux_sys_futex, unimplemented_cmp_requeue_pi); +LIN_SDT_PROBE_DEFINE1(futex, linux_sys_futex, unknown_operation, "int"); +LIN_SDT_PROBE_DEFINE1(futex, linux_sys_futex, return, "int"); +LIN_SDT_PROBE_DEFINE2(futex, linux_set_robust_list, entry, "struct thread *", + "struct linux_set_robust_list_args *"); +LIN_SDT_PROBE_DEFINE0(futex, linux_set_robust_list, size_error); +LIN_SDT_PROBE_DEFINE1(futex, linux_set_robust_list, return, "int"); +LIN_SDT_PROBE_DEFINE2(futex, linux_get_robust_list, entry, "struct thread *", + "struct linux_get_robust_list_args *"); +LIN_SDT_PROBE_DEFINE1(futex, linux_get_robust_list, copyout_error, "int"); +LIN_SDT_PROBE_DEFINE1(futex, linux_get_robust_list, return, "int"); +LIN_SDT_PROBE_DEFINE3(futex, handle_futex_death, entry, "struct proc *", + "uint32_t *", "int"); +LIN_SDT_PROBE_DEFINE1(futex, handle_futex_death, copyin_error, "int"); +LIN_SDT_PROBE_DEFINE1(futex, handle_futex_death, return, "int"); +LIN_SDT_PROBE_DEFINE3(futex, fetch_robust_entry, entry, + "struct linux_robust_list **", "struct linux_robust_list **", "int *"); +LIN_SDT_PROBE_DEFINE1(futex, fetch_robust_entry, copyin_error, "int"); +LIN_SDT_PROBE_DEFINE1(futex, fetch_robust_entry, return, "int"); +LIN_SDT_PROBE_DEFINE1(futex, release_futexes, entry, "struct proc *"); +LIN_SDT_PROBE_DEFINE1(futex, release_futexes, copyin_error, "int"); +LIN_SDT_PROBE_DEFINE0(futex, release_futexes, return); + static MALLOC_DEFINE(M_FUTEX, "futex", "Linux futexes"); static MALLOC_DEFINE(M_FUTEX_WP, "futex wp", "Linux futexes wp"); @@ -90,13 +213,30 @@ struct futex_list futex_list; #define FUTEX_LOCK(f) sx_xlock(&(f)->f_lck) #define FUTEX_UNLOCK(f) sx_xunlock(&(f)->f_lck) -#define FUTEX_INIT(f) sx_init_flags(&(f)->f_lck, "ftlk", SX_DUPOK) -#define FUTEX_DESTROY(f) sx_destroy(&(f)->f_lck) +#define FUTEX_INIT(f) do { \ + sx_init_flags(&(f)->f_lck, "ftlk", \ + SX_DUPOK); \ + LIN_SDT_PROBE1(futex, futex, create, \ + &(f)->f_lck); \ + } while (0) +#define FUTEX_DESTROY(f) do { \ + LIN_SDT_PROBE1(futex, futex, destroy, \ + &(f)->f_lck); \ + sx_destroy(&(f)->f_lck); \ + } while (0) #define FUTEX_ASSERT_LOCKED(f) sx_assert(&(f)->f_lck, SA_XLOCKED) struct mtx futex_mtx; /* protects the futex list */ -#define FUTEXES_LOCK mtx_lock(&futex_mtx) -#define FUTEXES_UNLOCK mtx_unlock(&futex_mtx) +#define FUTEXES_LOCK do { \ + mtx_lock(&futex_mtx); \ + LIN_SDT_PROBE1(locks, futex_mtx, \ + locked, &futex_mtx); \ + } while (0) +#define FUTEXES_UNLOCK do { \ + LIN_SDT_PROBE1(locks, futex_mtx, \ + unlock, &futex_mtx); \ + mtx_unlock(&futex_mtx); \ + } while (0) /* flags for futex_get() */ #define FUTEX_CREATE_WP 0x1 /* create waiting_proc */ @@ -123,6 +263,7 @@ int futex_xorl(int oparg, uint32_t *uaddr, int *oldval); static void futex_put(struct futex *f, struct waiting_proc *wp) { + LIN_SDT_PROBE2(futex, futex_put, entry, f, wp); FUTEX_ASSERT_LOCKED(f); if (wp != NULL) { @@ -137,18 +278,26 @@ futex_put(struct futex *f, struct waiting_proc *wp) FUTEXES_UNLOCK; FUTEX_UNLOCK(f); + LIN_SDT_PROBE3(futex, futex_put, destroy, f->f_uaddr, + f->f_refcount, f->f_key.shared); LINUX_CTR3(sys_futex, "futex_put destroy uaddr %p ref %d " "shared %d", f->f_uaddr, f->f_refcount, f->f_key.shared); umtx_key_release(&f->f_key); FUTEX_DESTROY(f); free(f, M_FUTEX); + + LIN_SDT_PROBE0(futex, futex_put, return); return; } + LIN_SDT_PROBE3(futex, futex_put, unlock, f->f_uaddr, f->f_refcount, + f->f_key.shared); LINUX_CTR3(sys_futex, "futex_put uaddr %p ref %d shared %d", f->f_uaddr, f->f_refcount, f->f_key.shared); FUTEXES_UNLOCK; FUTEX_UNLOCK(f); + + LIN_SDT_PROBE0(futex, futex_put, return); } static int @@ -158,12 +307,17 @@ futex_get0(uint32_t *uaddr, struct futex **newf, uint32_t flags) struct umtx_key key; int error; + LIN_SDT_PROBE3(futex, futex_get0, entry, uaddr, newf, flags); + *newf = tmpf = NULL; error = umtx_key_get(uaddr, TYPE_FUTEX, (flags & FUTEX_SHARED) ? AUTO_SHARE : THREAD_SHARE, &key); - if (error) + if (error) { + LIN_SDT_PROBE1(futex, futex_get0, umtx_key_get_error, error); + LIN_SDT_PROBE1(futex, futex_get0, return, error); return (error); + } retry: FUTEXES_LOCK; LIST_FOREACH(f, &futex_list, f_list) { @@ -176,6 +330,9 @@ retry: if (flags & FUTEX_DONTEXISTS) { FUTEXES_UNLOCK; umtx_key_release(&key); + + LIN_SDT_PROBE1(futex, futex_get0, return, + EINVAL); return (EINVAL); } @@ -189,8 +346,12 @@ retry: FUTEX_LOCK(f); *newf = f; + LIN_SDT_PROBE3(futex, futex_get0, shared, uaddr, + f->f_refcount, f->f_key.shared); LINUX_CTR3(sys_futex, "futex_get uaddr %p ref %d shared %d", uaddr, f->f_refcount, f->f_key.shared); + + LIN_SDT_PROBE1(futex, futex_get0, return, 0); return (0); } } @@ -198,7 +359,10 @@ retry: if (flags & FUTEX_DONTCREATE) { FUTEXES_UNLOCK; umtx_key_release(&key); + LIN_SDT_PROBE1(futex, futex_get0, null, uaddr); LINUX_CTR1(sys_futex, "futex_get uaddr %p null", uaddr); + + LIN_SDT_PROBE1(futex, futex_get0, return, 0); return (0); } @@ -223,9 +387,13 @@ retry: LIST_INSERT_HEAD(&futex_list, tmpf, f_list); FUTEXES_UNLOCK; + LIN_SDT_PROBE3(futex, futex_get0, new, uaddr, tmpf->f_refcount, + tmpf->f_key.shared); LINUX_CTR3(sys_futex, "futex_get uaddr %p ref %d shared %d new", uaddr, tmpf->f_refcount, tmpf->f_key.shared); *newf = tmpf; + + LIN_SDT_PROBE1(futex, futex_get0, return, 0); return (0); } @@ -235,14 +403,20 @@ futex_get(uint32_t *uaddr, struct waiting_proc **wp, struct futex **f, { int error; + LIN_SDT_PROBE3(futex, futex_get, entry, uaddr, wp, f); + if (flags & FUTEX_CREATE_WP) { *wp = malloc(sizeof(struct waiting_proc), M_FUTEX_WP, M_WAITOK); (*wp)->wp_flags = 0; } error = futex_get0(uaddr, f, flags); if (error) { + LIN_SDT_PROBE0(futex, futex_get, error); + if (flags & FUTEX_CREATE_WP) free(*wp, M_FUTEX_WP); + + LIN_SDT_PROBE1(futex, futex_get, return, error); return (error); } if (flags & FUTEX_CREATE_WP) { @@ -250,6 +424,7 @@ futex_get(uint32_t *uaddr, struct waiting_proc **wp, struct futex **f, (*wp)->wp_futex = *f; } + LIN_SDT_PROBE1(futex, futex_get, return, error); return (error); } @@ -259,23 +434,38 @@ futex_sleep(struct futex *f, struct waiting_proc *wp, int timeout) int error; FUTEX_ASSERT_LOCKED(f); + LIN_SDT_PROBE3(futex, futex_sleep, entry, f, wp, timeout); LINUX_CTR4(sys_futex, "futex_sleep enter uaddr %p wp %p timo %d ref %d", f->f_uaddr, wp, timeout, f->f_refcount); error = sx_sleep(wp, &f->f_lck, PCATCH, "futex", timeout); if (wp->wp_flags & FUTEX_WP_REQUEUED) { KASSERT(f != wp->wp_futex, ("futex != wp_futex")); - LINUX_CTR5(sys_futex, "futex_sleep out error %d uaddr %p w" + + if (error) { + LIN_SDT_PROBE5(futex, futex_sleep, requeue_error, error, + f->f_uaddr, wp, wp->wp_futex->f_uaddr, + wp->wp_futex->f_refcount); + } + + LINUX_CTR5(sys_futex, "futex_sleep out error %d uaddr %p wp" " %p requeued uaddr %p ref %d", error, f->f_uaddr, wp, wp->wp_futex->f_uaddr, wp->wp_futex->f_refcount); futex_put(f, NULL); f = wp->wp_futex; FUTEX_LOCK(f); - } else + } else { + if (error) { + LIN_SDT_PROBE3(futex, futex_sleep, sleep_error, error, + f->f_uaddr, wp); + } LINUX_CTR3(sys_futex, "futex_sleep out error %d uaddr %p wp %p", error, f->f_uaddr, wp); + } futex_put(f, wp); + + LIN_SDT_PROBE1(futex, futex_sleep, return, error); return (error); } @@ -285,11 +475,17 @@ futex_wake(struct futex *f, int n, uint32_t bitset) struct waiting_proc *wp, *wpt; int count = 0; - if (bitset == 0) + LIN_SDT_PROBE3(futex, futex_wake, entry, f, n, bitset); + + if (bitset == 0) { + LIN_SDT_PROBE1(futex, futex_wake, return, EINVAL); return (EINVAL); + } FUTEX_ASSERT_LOCKED(f); TAILQ_FOREACH_SAFE(wp, &f->f_waiting_proc, wp_list, wpt) { + LIN_SDT_PROBE3(futex, futex_wake, iterate, f->f_uaddr, wp, + f->f_refcount); LINUX_CTR3(sys_futex, "futex_wake uaddr %p wp %p ref %d", f->f_uaddr, wp, f->f_refcount); /* @@ -301,11 +497,13 @@ futex_wake(struct futex *f, int n, uint32_t bitset) wp->wp_flags |= FUTEX_WP_REMOVED; TAILQ_REMOVE(&f->f_waiting_proc, wp, wp_list); + LIN_SDT_PROBE1(futex, futex_wake, wakeup, wp); wakeup_one(wp); if (++count == n) break; } + LIN_SDT_PROBE1(futex, futex_wake, return, count); return (count); } @@ -315,6 +513,8 @@ futex_requeue(struct futex *f, int n, struct futex *f2, int n2) struct waiting_proc *wp, *wpt; int count = 0; + LIN_SDT_PROBE4(futex, futex_requeue, entry, f, n, f2, n2); + FUTEX_ASSERT_LOCKED(f); FUTEX_ASSERT_LOCKED(f2); @@ -324,8 +524,11 @@ futex_requeue(struct futex *f, int n, struct futex *f2, int n2) f->f_uaddr, wp); wp->wp_flags |= FUTEX_WP_REMOVED; TAILQ_REMOVE(&f->f_waiting_proc, wp, wp_list); + LIN_SDT_PROBE1(futex, futex_requeue, wakeup, wp); wakeup_one(wp); } else { + LIN_SDT_PROBE3(futex, futex_requeue, requeue, + f->f_uaddr, wp, f2->f_uaddr); LINUX_CTR3(sys_futex, "futex_requeue uaddr %p wp %p to %p", f->f_uaddr, wp, f2->f_uaddr); wp->wp_flags |= FUTEX_WP_REQUEUED; @@ -347,6 +550,7 @@ futex_requeue(struct futex *f, int n, struct futex *f2, int n2) } } + LIN_SDT_PROBE1(futex, futex_requeue, return, count); return (count); } @@ -359,26 +563,42 @@ futex_wait(struct futex *f, struct waiting_proc *wp, struct l_timespec *ts, int timeout_hz; int error; - if (bitset == 0) + LIN_SDT_PROBE4(futex, futex_wait, entry, f, wp, ts, bitset); + + if (bitset == 0) { + LIN_SDT_PROBE1(futex, futex_wait, return, EINVAL); return (EINVAL); + } + f->f_bitset = bitset; if (ts != NULL) { error = copyin(ts, &timeout, sizeof(timeout)); - if (error) + if (error) { + LIN_SDT_PROBE1(futex, futex_wait, copyin_error, error); + LIN_SDT_PROBE1(futex, futex_wait, return, error); return (error); + } TIMESPEC_TO_TIMEVAL(&tv, &timeout); error = itimerfix(&tv); - if (error) + if (error) { + LIN_SDT_PROBE1(futex, futex_wait, itimerfix_error, + error); + LIN_SDT_PROBE1(futex, futex_wait, return, error); return (error); + } timeout_hz = tvtohz(&tv); } else timeout_hz = 0; error = futex_sleep(f, wp, timeout_hz); + if (error) { + LIN_SDT_PROBE1(futex, futex_wait, sleep_error, error); + } if (error == EWOULDBLOCK) error = ETIMEDOUT; + LIN_SDT_PROBE1(futex, futex_wait, return, error); return (error); } @@ -391,16 +611,16 @@ futex_atomic_op(struct thread *td, int encoded_op, uint32_t *uaddr) int cmparg = (encoded_op << 20) >> 20; int oldval = 0, ret; + LIN_SDT_PROBE3(futex, futex_atomic_op, entry, td, encoded_op, uaddr); + if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) oparg = 1 << oparg; -#ifdef DEBUG - if (ldebug(sys_futex)) - printf("futex_atomic_op: op = %d, cmp = %d, oparg = %x, " - "cmparg = %x, uaddr = %p\n", - op, cmp, oparg, cmparg, uaddr); -#endif + LIN_SDT_PROBE4(futex, futex_atomic_op, decoded_op, op, cmp, oparg, + cmparg); + /* XXX: Linux verifies access here and returns EFAULT */ + LIN_SDT_PROBE0(futex, futex_atomic_op, missing_access_check); switch (op) { case FUTEX_OP_SET: @@ -419,29 +639,42 @@ futex_atomic_op(struct thread *td, int encoded_op, uint32_t *uaddr) ret = futex_xorl(oparg, uaddr, &oldval); break; default: + LIN_SDT_PROBE1(futex, futex_atomic_op, unimplemented_op, op); ret = -ENOSYS; break; } - if (ret) + if (ret) { + LIN_SDT_PROBE1(futex, futex_atomic_op, return, ret); return (ret); + } switch (cmp) { case FUTEX_OP_CMP_EQ: - return (oldval == cmparg); + ret = (oldval == cmparg); + break; case FUTEX_OP_CMP_NE: - return (oldval != cmparg); + ret = (oldval != cmparg); + break; case FUTEX_OP_CMP_LT: - return (oldval < cmparg); + ret = (oldval < cmparg); + break; case FUTEX_OP_CMP_GE: - return (oldval >= cmparg); + ret = (oldval >= cmparg); + break; case FUTEX_OP_CMP_LE: - return (oldval <= cmparg); + ret = (oldval <= cmparg); + break; case FUTEX_OP_CMP_GT: - return (oldval > cmparg); + ret = (oldval > cmparg); + break; default: - return (-ENOSYS); + LIN_SDT_PROBE1(futex, futex_atomic_op, unimplemented_cmp, cmp); + ret = -ENOSYS; } + + LIN_SDT_PROBE1(futex, futex_atomic_op, return, ret); + return (ret); } int @@ -454,6 +687,8 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) int error; uint32_t flags; + LIN_SDT_PROBE2(futex, linux_sys_futex, entry, td, args); + if (args->op & LINUX_FUTEX_PRIVATE_FLAG) { flags = 0; args->op &= ~LINUX_FUTEX_PRIVATE_FLAG; @@ -469,8 +704,12 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) clockrt = args->op & LINUX_FUTEX_CLOCK_REALTIME; args->op = args->op & ~LINUX_FUTEX_CLOCK_REALTIME; if (clockrt && args->op != LINUX_FUTEX_WAIT_BITSET && - args->op != LINUX_FUTEX_WAIT_REQUEUE_PI) + args->op != LINUX_FUTEX_WAIT_REQUEUE_PI) { + LIN_SDT_PROBE0(futex, linux_sys_futex, + unimplemented_clockswitch); + LIN_SDT_PROBE1(futex, linux_sys_futex, return, ENOSYS); return (ENOSYS); + } error = 0; f = f2 = NULL; @@ -481,31 +720,40 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) /* FALLTHROUGH */ case LINUX_FUTEX_WAIT_BITSET: - + LIN_SDT_PROBE3(futex, linux_sys_futex, debug_wait, args->uaddr, + args->val, args->val3); LINUX_CTR3(sys_futex, "WAIT uaddr %p val %d val3 %d", args->uaddr, args->val, args->val3); -#ifdef DEBUG - if (ldebug(sys_futex)) - printf(ARGS(sys_futex, - "futex_wait uaddr %p val %d val3 %d"), - args->uaddr, args->val, args->val3); -#endif + error = futex_get(args->uaddr, &wp, &f, flags | FUTEX_CREATE_WP); - if (error) + if (error) { + LIN_SDT_PROBE1(futex, linux_sys_futex, return, error); return (error); + } + error = copyin(args->uaddr, &val, sizeof(val)); if (error) { + LIN_SDT_PROBE1(futex, linux_sys_futex, copyin_error, + error); LINUX_CTR1(sys_futex, "WAIT copyin failed %d", error); futex_put(f, wp); + + LIN_SDT_PROBE1(futex, linux_sys_futex, return, error); return (error); } if (val != args->val) { + LIN_SDT_PROBE4(futex, linux_sys_futex, + debug_wait_value_neq, args->uaddr, args->val, val, + args->val3); LINUX_CTR4(sys_futex, "WAIT uaddr %p val %d != uval %d val3 %d", args->uaddr, args->val, val, args->val3); futex_put(f, wp); + + LIN_SDT_PROBE1(futex, linux_sys_futex, return, + EWOULDBLOCK); return (EWOULDBLOCK); } @@ -517,21 +765,22 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) /* FALLTHROUGH */ case LINUX_FUTEX_WAKE_BITSET: - + LIN_SDT_PROBE3(futex, linux_sys_futex, debug_wake, args->uaddr, + args->val, args->val3); LINUX_CTR3(sys_futex, "WAKE uaddr %p val % d val3 %d", args->uaddr, args->val, args->val3); -#ifdef DEBUG - if (ldebug(sys_futex)) - printf(ARGS(sys_futex, "futex_wake uaddr %p val %d val3 %d"), - args->uaddr, args->val, args->val3); -#endif error = futex_get(args->uaddr, NULL, &f, flags | FUTEX_DONTCREATE); - if (error) + if (error) { + LIN_SDT_PROBE1(futex, linux_sys_futex, return, error); return (error); + } + if (f == NULL) { td->td_retval[0] = 0; + + LIN_SDT_PROBE1(futex, linux_sys_futex, return, error); return (error); } td->td_retval[0] = futex_wake(f, args->val, args->val3); @@ -539,29 +788,30 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) break; case LINUX_FUTEX_CMP_REQUEUE: - + LIN_SDT_PROBE5(futex, linux_sys_futex, debug_cmp_requeue, + args->uaddr, args->val, args->val3, args->uaddr2, + args->timeout); LINUX_CTR5(sys_futex, "CMP_REQUEUE uaddr %p " "val %d val3 %d uaddr2 %p val2 %d", args->uaddr, args->val, args->val3, args->uaddr2, (int)(unsigned long)args->timeout); -#ifdef DEBUG - if (ldebug(sys_futex)) - printf(ARGS(sys_futex, "futex_cmp_requeue uaddr %p " - "val %d val3 %d uaddr2 %p val2 %d"), - args->uaddr, args->val, args->val3, args->uaddr2, - (int)(unsigned long)args->timeout); -#endif - /* * Linux allows this, we would not, it is an incorrect * usage of declared ABI, so return EINVAL. */ - if (args->uaddr == args->uaddr2) + if (args->uaddr == args->uaddr2) { + LIN_SDT_PROBE0(futex, linux_sys_futex, + invalid_cmp_requeue_use); + LIN_SDT_PROBE1(futex, linux_sys_futex, return, EINVAL); return (EINVAL); + } + error = futex_get(args->uaddr, NULL, &f, flags); - if (error) + if (error) { + LIN_SDT_PROBE1(futex, linux_sys_futex, return, error); return (error); + } /* * To avoid deadlocks return EINVAL if second futex @@ -574,21 +824,31 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) flags | FUTEX_DONTEXISTS); if (error) { futex_put(f, NULL); + + LIN_SDT_PROBE1(futex, linux_sys_futex, return, error); return (error); } error = copyin(args->uaddr, &val, sizeof(val)); if (error) { + LIN_SDT_PROBE1(futex, linux_sys_futex, copyin_error, + error); LINUX_CTR1(sys_futex, "CMP_REQUEUE copyin failed %d", error); futex_put(f2, NULL); futex_put(f, NULL); + + LIN_SDT_PROBE1(futex, linux_sys_futex, return, error); return (error); } if (val != args->val3) { + LIN_SDT_PROBE2(futex, linux_sys_futex, + debug_cmp_requeue_value_neq, args->val, val); LINUX_CTR2(sys_futex, "CMP_REQUEUE val %d != uval %d", args->val, val); futex_put(f2, NULL); futex_put(f, NULL); + + LIN_SDT_PROBE1(futex, linux_sys_futex, return, EAGAIN); return (EAGAIN); } @@ -599,26 +859,25 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) break; case LINUX_FUTEX_WAKE_OP: - + LIN_SDT_PROBE5(futex, linux_sys_futex, debug_wake_op, + args->uaddr, args->op, args->val, args->uaddr2, args->val3); LINUX_CTR5(sys_futex, "WAKE_OP " "uaddr %p op %d val %x uaddr2 %p val3 %x", args->uaddr, args->op, args->val, args->uaddr2, args->val3); -#ifdef DEBUG - if (ldebug(sys_futex)) - printf(ARGS(sys_futex, "futex_wake_op " - "uaddr %p op %d val %x uaddr2 %p val3 %x"), - args->uaddr, args->op, args->val, - args->uaddr2, args->val3); -#endif error = futex_get(args->uaddr, NULL, &f, flags); - if (error) + if (error) { + LIN_SDT_PROBE1(futex, linux_sys_futex, return, error); return (error); + } + if (args->uaddr != args->uaddr2) error = futex_get(args->uaddr2, NULL, &f2, flags); if (error) { futex_put(f, NULL); + + LIN_SDT_PROBE1(futex, linux_sys_futex, return, error); return (error); } @@ -634,11 +893,19 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) if (f2 != NULL) futex_put(f2, NULL); futex_put(f, NULL); + + LIN_SDT_PROBE1(futex, linux_sys_futex, return, + -op_ret); return (-op_ret); + } else { + LIN_SDT_PROBE0(futex, linux_sys_futex, + unhandled_efault); } if (f2 != NULL) futex_put(f2, NULL); futex_put(f, NULL); + + LIN_SDT_PROBE1(futex, linux_sys_futex, return, EFAULT); return (EFAULT); } @@ -666,6 +933,8 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) linux_msg(td, "linux_sys_futex: " "op LINUX_FUTEX_LOCK_PI not implemented\n"); + LIN_SDT_PROBE0(futex, linux_sys_futex, unimplemented_lock_pi); + LIN_SDT_PROBE1(futex, linux_sys_futex, return, ENOSYS); return (ENOSYS); case LINUX_FUTEX_UNLOCK_PI: @@ -673,6 +942,8 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) linux_msg(td, "linux_sys_futex: " "op LINUX_FUTEX_UNLOCK_PI not implemented\n"); + LIN_SDT_PROBE0(futex, linux_sys_futex, unimplemented_unlock_pi); + LIN_SDT_PROBE1(futex, linux_sys_futex, return, ENOSYS); return (ENOSYS); case LINUX_FUTEX_TRYLOCK_PI: @@ -680,6 +951,9 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) linux_msg(td, "linux_sys_futex: " "op LINUX_FUTEX_TRYLOCK_PI not implemented\n"); + LIN_SDT_PROBE0(futex, linux_sys_futex, + unimplemented_trylock_pi); + LIN_SDT_PROBE1(futex, linux_sys_futex, return, ENOSYS); return (ENOSYS); case LINUX_FUTEX_REQUEUE: @@ -696,7 +970,11 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) "linux_sys_futex: " "unsupported futex_requeue op\n"); em->flags |= LINUX_XDEPR_REQUEUEOP; + LIN_SDT_PROBE0(futex, linux_sys_futex, + deprecated_requeue); } + + LIN_SDT_PROBE1(futex, linux_sys_futex, return, EINVAL); return (EINVAL); case LINUX_FUTEX_WAIT_REQUEUE_PI: @@ -704,6 +982,9 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) linux_msg(td, "linux_sys_futex: " "op FUTEX_WAIT_REQUEUE_PI not implemented\n"); + LIN_SDT_PROBE0(futex, linux_sys_futex, + unimplemented_wait_requeue_pi); + LIN_SDT_PROBE1(futex, linux_sys_futex, return, ENOSYS); return (ENOSYS); case LINUX_FUTEX_CMP_REQUEUE_PI: @@ -711,14 +992,21 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) linux_msg(td, "linux_sys_futex: " "op LINUX_FUTEX_CMP_REQUEUE_PI not implemented\n"); + LIN_SDT_PROBE0(futex, linux_sys_futex, + unimplemented_cmp_requeue_pi); + LIN_SDT_PROBE1(futex, linux_sys_futex, return, ENOSYS); return (ENOSYS); default: linux_msg(td, "linux_sys_futex: unknown op %d\n", args->op); + LIN_SDT_PROBE1(futex, linux_sys_futex, unknown_operation, + args->op); + LIN_SDT_PROBE1(futex, linux_sys_futex, return, ENOSYS); return (ENOSYS); } + LIN_SDT_PROBE1(futex, linux_sys_futex, return, error); return (error); } @@ -727,19 +1015,19 @@ linux_set_robust_list(struct thread *td, struct linux_set_robust_list_args *args { struct linux_emuldata *em; -#ifdef DEBUG - if (ldebug(set_robust_list)) - printf(ARGS(set_robust_list, "head %p len %d"), - args->head, args->len); -#endif + LIN_SDT_PROBE2(futex, linux_set_robust_list, entry, td, args); - if (args->len != sizeof(struct linux_robust_list_head)) + if (args->len != sizeof(struct linux_robust_list_head)) { + LIN_SDT_PROBE0(futex, linux_set_robust_list, size_error); + LIN_SDT_PROBE1(futex, linux_set_robust_list, return, EINVAL); return (EINVAL); + } em = em_find(td->td_proc, EMUL_DOLOCK); em->robust_futexes = args->head; EMUL_UNLOCK(&emul_lock); + LIN_SDT_PROBE1(futex, linux_set_robust_list, return, 0); return (0); } @@ -751,10 +1039,7 @@ linux_get_robust_list(struct thread *td, struct linux_get_robust_list_args *args l_size_t len = sizeof(struct linux_robust_list_head); int error = 0; -#ifdef DEBUG - if (ldebug(get_robust_list)) - printf(ARGS(get_robust_list, "")); -#endif + LIN_SDT_PROBE2(futex, linux_get_robust_list, entry, td, args); if (!args->pid) { em = em_find(td->td_proc, EMUL_DONTLOCK); @@ -763,8 +1048,11 @@ linux_get_robust_list(struct thread *td, struct linux_get_robust_list_args *args struct proc *p; p = pfind(args->pid); - if (p == NULL) + if (p == NULL) { + LIN_SDT_PROBE1(futex, linux_get_robust_list, return, + ESRCH); return (ESRCH); + } em = em_find(p, EMUL_DONTLOCK); /* XXX: ptrace? */ @@ -772,6 +1060,9 @@ linux_get_robust_list(struct thread *td, struct linux_get_robust_list_args *args priv_check(td, PRIV_CRED_SETEUID) || p_candebug(td, p)) { PROC_UNLOCK(p); + + LIN_SDT_PROBE1(futex, linux_get_robust_list, return, + EPERM); return (EPERM); } head = em->robust_futexes; @@ -780,11 +1071,20 @@ linux_get_robust_list(struct thread *td, struct linux_get_robust_list_args *args } error = copyout(&len, args->len, sizeof(l_size_t)); - if (error) + if (error) { + LIN_SDT_PROBE1(futex, linux_get_robust_list, copyout_error, + error); + LIN_SDT_PROBE1(futex, linux_get_robust_list, return, EFAULT); return (EFAULT); + } error = copyout(head, args->head, sizeof(struct linux_robust_list_head)); + if (error) { + LIN_SDT_PROBE1(futex, linux_get_robust_list, copyout_error, + error); + } + LIN_SDT_PROBE1(futex, linux_get_robust_list, return, error); return (error); } @@ -795,15 +1095,24 @@ handle_futex_death(struct proc *p, uint32_t *uaddr, int pi) struct futex *f; int error; + LIN_SDT_PROBE3(futex, handle_futex_death, entry, p, uaddr, pi); + retry: - if (copyin(uaddr, &uval, 4)) + error = copyin(uaddr, &uval, 4); + if (error) { + LIN_SDT_PROBE1(futex, handle_futex_death, copyin_error, error); + LIN_SDT_PROBE1(futex, handle_futex_death, return, EFAULT); return (EFAULT); + } if ((uval & FUTEX_TID_MASK) == p->p_pid) { mval = (uval & FUTEX_WAITERS) | FUTEX_OWNER_DIED; nval = casuword32(uaddr, uval, mval); - if (nval == -1) + if (nval == -1) { + LIN_SDT_PROBE1(futex, handle_futex_death, return, + EFAULT); return (EFAULT); + } if (nval != uval) goto retry; @@ -811,8 +1120,11 @@ retry: if (!pi && (uval & FUTEX_WAITERS)) { error = futex_get(uaddr, NULL, &f, FUTEX_DONTCREATE | FUTEX_SHARED); - if (error) + if (error) { + LIN_SDT_PROBE1(futex, handle_futex_death, + return, error); return (error); + } if (f != NULL) { futex_wake(f, 1, FUTEX_BITSET_MATCH_ANY); futex_put(f, NULL); @@ -820,6 +1132,7 @@ retry: } } + LIN_SDT_PROBE1(futex, handle_futex_death, return, 0); return (0); } @@ -828,13 +1141,21 @@ fetch_robust_entry(struct linux_robust_list **entry, struct linux_robust_list **head, int *pi) { l_ulong uentry; + int error; - if (copyin((const void *)head, &uentry, sizeof(l_ulong))) + LIN_SDT_PROBE3(futex, fetch_robust_entry, entry, entry, head, pi); + + error = copyin((const void *)head, &uentry, sizeof(l_ulong)); + if (error) { + LIN_SDT_PROBE1(futex, fetch_robust_entry, copyin_error, error); + LIN_SDT_PROBE1(futex, fetch_robust_entry, return, EFAULT); return (EFAULT); + } *entry = (void *)(uentry & ~1UL); *pi = uentry & 1; + LIN_SDT_PROBE1(futex, fetch_robust_entry, return, 0); return (0); } @@ -847,31 +1168,49 @@ release_futexes(struct proc *p) unsigned int limit = 2048, pi, next_pi, pip; struct linux_emuldata *em; l_long futex_offset; - int rc; + int rc, error; + + LIN_SDT_PROBE1(futex, release_futexes, entry, p); em = em_find(p, EMUL_DONTLOCK); head = em->robust_futexes; - if (head == NULL) + if (head == NULL) { + LIN_SDT_PROBE0(futex, release_futexes, return); return; + } - if (fetch_robust_entry(&entry, PTRIN(&head->list.next), &pi)) + if (fetch_robust_entry(&entry, PTRIN(&head->list.next), &pi)) { + LIN_SDT_PROBE0(futex, release_futexes, return); return; + } - if (copyin(&head->futex_offset, &futex_offset, sizeof(futex_offset))) + error = copyin(&head->futex_offset, &futex_offset, + sizeof(futex_offset)); + if (error) { + LIN_SDT_PROBE1(futex, release_futexes, copyin_error, error); + LIN_SDT_PROBE0(futex, release_futexes, return); return; + } - if (fetch_robust_entry(&pending, PTRIN(&head->pending_list), &pip)) + if (fetch_robust_entry(&pending, PTRIN(&head->pending_list), &pip)) { + LIN_SDT_PROBE0(futex, release_futexes, return); return; + } while (entry != &head->list) { rc = fetch_robust_entry(&next_entry, PTRIN(&entry->next), &next_pi); if (entry != pending) - if (handle_futex_death(p, (uint32_t *)entry + futex_offset, pi)) + if (handle_futex_death(p, + (uint32_t *)entry + futex_offset, pi)) { + LIN_SDT_PROBE0(futex, release_futexes, return); return; - if (rc) + } + if (rc) { + LIN_SDT_PROBE0(futex, release_futexes, return); return; + } entry = next_entry; pi = next_pi; @@ -884,4 +1223,6 @@ release_futexes(struct proc *p) if (pending) handle_futex_death(p, (uint32_t *)pending + futex_offset, pip); + + LIN_SDT_PROBE0(futex, release_futexes, return); } diff --git a/sys/compat/linux/linux_mib.c b/sys/compat/linux/linux_mib.c index 16f9ac3c2d8..08566623f09 100644 --- a/sys/compat/linux/linux_mib.c +++ b/sys/compat/linux/linux_mib.c @@ -29,8 +29,12 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_compat.h" +#include "opt_kdtrace.h" + #include #include +#include #include #include #include @@ -41,15 +45,81 @@ __FBSDID("$FreeBSD$"); #include #include -#include "opt_compat.h" - #ifdef COMPAT_LINUX32 #include #else #include #endif +#include #include +/* DTrace init */ +LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE); + +/** + * DTrace probes in this module. + */ +LIN_SDT_PROBE_DEFINE0(mib, linux_sysctl_osname, entry); +LIN_SDT_PROBE_DEFINE1(mib, linux_sysctl_osname, sysctl_string_error, "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_sysctl_osname, return, "int"); + +LIN_SDT_PROBE_DEFINE0(mib, linux_sysctl_osrelease, entry); +LIN_SDT_PROBE_DEFINE1(mib, linux_sysctl_osrelease, sysctl_string_error, "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_sysctl_osrelease, return, "int"); +LIN_SDT_PROBE_DEFINE0(mib, linux_sysctl_oss_version, entry); +LIN_SDT_PROBE_DEFINE1(mib, linux_sysctl_oss_version, sysctl_string_error, + "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_sysctl_oss_version, return, "int"); +LIN_SDT_PROBE_DEFINE2(mib, linux_map_osrel, entry, "char *", "int *"); +LIN_SDT_PROBE_DEFINE1(mib, linux_map_osrel, return, "int"); +LIN_SDT_PROBE_DEFINE2(mib, linux_get_prison, entry, "struct prison *", + "struct prison **"); +LIN_SDT_PROBE_DEFINE1(mib, linux_get_prison, return, "struct linux_prison *"); +LIN_SDT_PROBE_DEFINE2(mib, linux_alloc_prison, entry, "struct prison *", + "struct linux_prison **"); +LIN_SDT_PROBE_DEFINE1(mib, linux_alloc_prison, return, "int"); +LIN_SDT_PROBE_DEFINE2(mib, linux_prison_create, entry, "void *", "void *"); +LIN_SDT_PROBE_DEFINE1(mib, linux_prison_create, vfs_copyopt_error, "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_prison_create, return, "int"); +LIN_SDT_PROBE_DEFINE2(mib, linux_prison_check, entry, "void *", "void *"); +LIN_SDT_PROBE_DEFINE1(mib, linux_prison_check, vfs_copyopt_error, "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_prison_check, vfs_getopt_error, "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_prison_check, return, "int"); +LIN_SDT_PROBE_DEFINE2(mib, linux_prison_set, entry, "void *", "void *"); +LIN_SDT_PROBE_DEFINE1(mib, linux_prison_set, vfs_copyopt_error, "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_prison_set, vfs_getopt_error, "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_prison_set, return, "int"); +LIN_SDT_PROBE_DEFINE2(mib, linux_prison_get, entry, "void *", "void *"); +LIN_SDT_PROBE_DEFINE1(mib, linux_prison_get, vfs_setopt_error, "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_prison_get, vfs_setopts_error, "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_prison_get, return, "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_prison_destructor, entry, "void *"); +LIN_SDT_PROBE_DEFINE0(mib, linux_prison_destructor, return); +LIN_SDT_PROBE_DEFINE0(mib, linux_osd_jail_register, entry); +LIN_SDT_PROBE_DEFINE0(mib, linux_osd_jail_register, return); +LIN_SDT_PROBE_DEFINE0(mib, linux_osd_jail_deregister, entry); +LIN_SDT_PROBE_DEFINE0(mib, linux_osd_jail_deregister, return); +LIN_SDT_PROBE_DEFINE2(mib, linux_get_osname, entry, "struct thread *", + "char *"); +LIN_SDT_PROBE_DEFINE0(mib, linux_get_osname, return); +LIN_SDT_PROBE_DEFINE2(mib, linux_set_osname, entry, "struct thread *", + "char *"); +LIN_SDT_PROBE_DEFINE1(mib, linux_set_osname, return, "int"); +LIN_SDT_PROBE_DEFINE2(mib, linux_get_osrelease, entry, "struct thread *", + "char *"); +LIN_SDT_PROBE_DEFINE0(mib, linux_get_osrelease, return); +LIN_SDT_PROBE_DEFINE1(mib, linux_kernver, entry, "struct thread *"); +LIN_SDT_PROBE_DEFINE1(mib, linux_kernver, return, "int"); +LIN_SDT_PROBE_DEFINE2(mib, linux_set_osrelease, entry, "struct thread *", + "char *"); +LIN_SDT_PROBE_DEFINE1(mib, linux_set_osrelease, return, "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_get_oss_version, entry, "struct thread *"); +LIN_SDT_PROBE_DEFINE1(mib, linux_get_oss_version, return, "int"); + +LIN_SDT_PROBE_DEFINE2(mib, linux_set_oss_version, entry, "struct thread *", + "int"); +LIN_SDT_PROBE_DEFINE1(mib, linux_set_oss_version, return, "int"); + struct linux_prison { char pr_osname[LINUX_MAX_UTSNAME]; char pr_osrelease[LINUX_MAX_UTSNAME]; @@ -79,11 +149,19 @@ linux_sysctl_osname(SYSCTL_HANDLER_ARGS) char osname[LINUX_MAX_UTSNAME]; int error; + LIN_SDT_PROBE0(mib, linux_sysctl_osname, entry); + linux_get_osname(req->td, osname); error = sysctl_handle_string(oidp, osname, LINUX_MAX_UTSNAME, req); - if (error || req->newptr == NULL) + if (error != 0 || req->newptr == NULL) { + LIN_SDT_PROBE1(mib, linux_sysctl_osname, sysctl_string_error, + error); + LIN_SDT_PROBE1(mib, linux_sysctl_osname, return, error); return (error); + } error = linux_set_osname(req->td, osname); + + LIN_SDT_PROBE1(mib, linux_sysctl_osname, return, error); return (error); } @@ -98,11 +176,19 @@ linux_sysctl_osrelease(SYSCTL_HANDLER_ARGS) char osrelease[LINUX_MAX_UTSNAME]; int error; + LIN_SDT_PROBE0(mib, linux_sysctl_osrelease, entry); + linux_get_osrelease(req->td, osrelease); error = sysctl_handle_string(oidp, osrelease, LINUX_MAX_UTSNAME, req); - if (error || req->newptr == NULL) + if (error != 0 || req->newptr == NULL) { + LIN_SDT_PROBE1(mib, linux_sysctl_osrelease, sysctl_string_error, + error); + LIN_SDT_PROBE1(mib, linux_sysctl_osrelease, return, error); return (error); + } error = linux_set_osrelease(req->td, osrelease); + + LIN_SDT_PROBE1(mib, linux_sysctl_osrelease, return, error); return (error); } @@ -117,11 +203,19 @@ linux_sysctl_oss_version(SYSCTL_HANDLER_ARGS) int oss_version; int error; + LIN_SDT_PROBE0(mib, linux_sysctl_oss_version, entry); + oss_version = linux_get_oss_version(req->td); error = sysctl_handle_int(oidp, &oss_version, 0, req); - if (error || req->newptr == NULL) + if (error != 0 || req->newptr == NULL) { + LIN_SDT_PROBE1(mib, linux_sysctl_oss_version, + sysctl_string_error, error); + LIN_SDT_PROBE1(mib, linux_sysctl_oss_version, return, error); return (error); + } error = linux_set_oss_version(req->td, oss_version); + + LIN_SDT_PROBE1(mib, linux_sysctl_oss_version, return, error); return (error); } @@ -139,25 +233,37 @@ linux_map_osrel(char *osrelease, int *osrel) char *sep, *eosrelease; int len, v0, v1, v2, v; + LIN_SDT_PROBE2(mib, linux_map_osrel, entry, osrelease, osrel); + len = strlen(osrelease); eosrelease = osrelease + len; v0 = strtol(osrelease, &sep, 10); - if (osrelease == sep || sep + 1 >= eosrelease || *sep != '.') + if (osrelease == sep || sep + 1 >= eosrelease || *sep != '.') { + LIN_SDT_PROBE1(mib, linux_map_osrel, return, EINVAL); return (EINVAL); + } osrelease = sep + 1; v1 = strtol(osrelease, &sep, 10); - if (osrelease == sep || sep + 1 >= eosrelease || *sep != '.') + if (osrelease == sep || sep + 1 >= eosrelease || *sep != '.') { + LIN_SDT_PROBE1(mib, linux_map_osrel, return, EINVAL); return (EINVAL); + } osrelease = sep + 1; v2 = strtol(osrelease, &sep, 10); - if (osrelease == sep || sep != eosrelease) + if (osrelease == sep || sep != eosrelease) { + LIN_SDT_PROBE1(mib, linux_map_osrel, return, EINVAL); return (EINVAL); + } v = v0 * 1000000 + v1 * 1000 + v2; - if (v < 1000000) + if (v < 1000000) { + LIN_SDT_PROBE1(mib, linux_map_osrel, return, EINVAL); return (EINVAL); + } *osrel = v; + + LIN_SDT_PROBE1(mib, linux_map_osrel, return, 0); return (0); } @@ -171,6 +277,8 @@ linux_find_prison(struct prison *spr, struct prison **prp) struct prison *pr; struct linux_prison *lpr; + LIN_SDT_PROBE2(mib, linux_get_prison, entry, spr, prp); + if (!linux_osd_jail_slot) /* In case osd_register failed. */ spr = &prison0; @@ -184,6 +292,8 @@ linux_find_prison(struct prison *spr, struct prison **prp) mtx_unlock(&pr->pr_mtx); } *prp = pr; + + LIN_SDT_PROBE1(mib, linux_get_prison, return, lpr); return (lpr); } @@ -198,6 +308,8 @@ linux_alloc_prison(struct prison *pr, struct linux_prison **lprp) struct linux_prison *lpr, *nlpr; int error; + LIN_SDT_PROBE2(mib, linux_alloc_prison, entry, pr, lprp); + /* If this prison already has Linux info, return that. */ error = 0; lpr = linux_find_prison(pr, &ppr); @@ -230,6 +342,8 @@ linux_alloc_prison(struct prison *pr, struct linux_prison **lprp) *lprp = lpr; else mtx_unlock(&pr->pr_mtx); + + LIN_SDT_PROBE1(mib, linux_alloc_prison, return, error); return (error); } @@ -241,16 +355,26 @@ linux_prison_create(void *obj, void *data) { struct prison *pr = obj; struct vfsoptlist *opts = data; - int jsys; + int jsys, error; - if (vfs_copyopt(opts, "linux", &jsys, sizeof(jsys)) == 0 && - jsys == JAIL_SYS_INHERIT) + LIN_SDT_PROBE2(mib, linux_prison_create, entry, obj, data); + + error = vfs_copyopt(opts, "linux", &jsys, sizeof(jsys)); + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_create, vfs_copyopt_error, + error); + } else if (jsys == JAIL_SYS_INHERIT) { + LIN_SDT_PROBE1(mib, linux_prison_create, return, 0); return (0); + } /* * Inherit a prison's initial values from its parent * (different from JAIL_SYS_INHERIT which also inherits changes). */ - return linux_alloc_prison(pr, NULL); + error = linux_alloc_prison(pr, NULL); + + LIN_SDT_PROBE1(mib, linux_prison_create, return, error); + return (error); } static int @@ -260,44 +384,81 @@ linux_prison_check(void *obj __unused, void *data) char *osname, *osrelease; int error, jsys, len, osrel, oss_version; + LIN_SDT_PROBE2(mib, linux_prison_check, entry, obj, data); + /* Check that the parameters are correct. */ error = vfs_copyopt(opts, "linux", &jsys, sizeof(jsys)); + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_check, vfs_copyopt_error, + error); + } if (error != ENOENT) { - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_check, return, error); return (error); - if (jsys != JAIL_SYS_NEW && jsys != JAIL_SYS_INHERIT) + } + if (jsys != JAIL_SYS_NEW && jsys != JAIL_SYS_INHERIT) { + LIN_SDT_PROBE1(mib, linux_prison_check, return, EINVAL); return (EINVAL); + } } error = vfs_getopt(opts, "linux.osname", (void **)&osname, &len); + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_check, vfs_getopt_error, + error); + } if (error != ENOENT) { - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_check, return, error); return (error); - if (len == 0 || osname[len - 1] != '\0') + } + if (len == 0 || osname[len - 1] != '\0') { + LIN_SDT_PROBE1(mib, linux_prison_check, return, EINVAL); return (EINVAL); + } if (len > LINUX_MAX_UTSNAME) { vfs_opterror(opts, "linux.osname too long"); + LIN_SDT_PROBE1(mib, linux_prison_check, return, + ENAMETOOLONG); return (ENAMETOOLONG); } } error = vfs_getopt(opts, "linux.osrelease", (void **)&osrelease, &len); + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_check, vfs_getopt_error, + error); + } if (error != ENOENT) { - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_check, return, error); return (error); - if (len == 0 || osrelease[len - 1] != '\0') + } + if (len == 0 || osrelease[len - 1] != '\0') { + LIN_SDT_PROBE1(mib, linux_prison_check, return, EINVAL); return (EINVAL); + } if (len > LINUX_MAX_UTSNAME) { vfs_opterror(opts, "linux.osrelease too long"); + LIN_SDT_PROBE1(mib, linux_prison_check, return, + ENAMETOOLONG); return (ENAMETOOLONG); } error = linux_map_osrel(osrelease, &osrel); if (error != 0) { vfs_opterror(opts, "linux.osrelease format error"); + LIN_SDT_PROBE1(mib, linux_prison_check, return, error); return (error); } } error = vfs_copyopt(opts, "linux.oss_version", &oss_version, sizeof(oss_version)); - return (error == ENOENT ? 0 : error); + if (error != 0) + LIN_SDT_PROBE1(mib, linux_prison_check, vfs_copyopt_error, error); + + if (error == ENOENT) + error = 0; + LIN_SDT_PROBE1(mib, linux_prison_check, return, error); + return (error); } static int @@ -309,22 +470,32 @@ linux_prison_set(void *obj, void *data) char *osname, *osrelease; int error, gotversion, jsys, len, oss_version; + LIN_SDT_PROBE2(mib, linux_prison_set, entry, obj, data); + /* Set the parameters, which should be correct. */ error = vfs_copyopt(opts, "linux", &jsys, sizeof(jsys)); + if (error != 0) + LIN_SDT_PROBE1(mib, linux_prison_set, vfs_copyopt_error, error); if (error == ENOENT) jsys = -1; error = vfs_getopt(opts, "linux.osname", (void **)&osname, &len); + if (error != 0) + LIN_SDT_PROBE1(mib, linux_prison_set, vfs_getopt_error, error); if (error == ENOENT) osname = NULL; else jsys = JAIL_SYS_NEW; error = vfs_getopt(opts, "linux.osrelease", (void **)&osrelease, &len); + if (error != 0) + LIN_SDT_PROBE1(mib, linux_prison_set, vfs_getopt_error, error); if (error == ENOENT) osrelease = NULL; else jsys = JAIL_SYS_NEW; error = vfs_copyopt(opts, "linux.oss_version", &oss_version, sizeof(oss_version)); + if (error != 0) + LIN_SDT_PROBE1(mib, linux_prison_set, vfs_copyopt_error, error); if (error == ENOENT) gotversion = 0; else { @@ -346,12 +517,15 @@ linux_prison_set(void *obj, void *data) error = linux_alloc_prison(pr, &lpr); if (error) { mtx_unlock(&pr->pr_mtx); + LIN_SDT_PROBE1(mib, linux_prison_set, return, error); return (error); } if (osrelease) { error = linux_map_osrel(osrelease, &lpr->pr_osrel); if (error) { mtx_unlock(&pr->pr_mtx); + LIN_SDT_PROBE1(mib, linux_prison_set, return, + error); return (error); } strlcpy(lpr->pr_osrelease, osrelease, @@ -363,6 +537,8 @@ linux_prison_set(void *obj, void *data) lpr->pr_oss_version = oss_version; mtx_unlock(&pr->pr_mtx); } + + LIN_SDT_PROBE1(mib, linux_prison_set, return, 0); return (0); } @@ -385,43 +561,74 @@ linux_prison_get(void *obj, void *data) static int version0; + LIN_SDT_PROBE2(mib, linux_prison_get, entry, obj, data); + /* See if this prison is the one with the Linux info. */ lpr = linux_find_prison(pr, &ppr); i = (ppr == pr) ? JAIL_SYS_NEW : JAIL_SYS_INHERIT; error = vfs_setopt(opts, "linux", &i, sizeof(i)); - if (error != 0 && error != ENOENT) - goto done; + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_get, vfs_setopt_error, error); + if (error != ENOENT) + goto done; + } if (i) { error = vfs_setopts(opts, "linux.osname", lpr->pr_osname); - if (error != 0 && error != ENOENT) - goto done; + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_get, vfs_setopts_error, + error); + if (error != ENOENT) + goto done; + } error = vfs_setopts(opts, "linux.osrelease", lpr->pr_osrelease); - if (error != 0 && error != ENOENT) - goto done; + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_get, vfs_setopts_error, + error); + if (error != ENOENT) + goto done; + } error = vfs_setopt(opts, "linux.oss_version", &lpr->pr_oss_version, sizeof(lpr->pr_oss_version)); - if (error != 0 && error != ENOENT) - goto done; + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_get, vfs_setopt_error, + error); + if(error != ENOENT) + goto done; + } } else { /* * If this prison is inheriting its Linux info, report * empty/zero parameters. */ error = vfs_setopts(opts, "linux.osname", ""); - if (error != 0 && error != ENOENT) - goto done; + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_get, vfs_setopts_error, + error); + if(error != ENOENT) + goto done; + } error = vfs_setopts(opts, "linux.osrelease", ""); - if (error != 0 && error != ENOENT) - goto done; + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_get, vfs_setopts_error, + error); + if(error != ENOENT) + goto done; + } error = vfs_setopt(opts, "linux.oss_version", &version0, sizeof(lpr->pr_oss_version)); - if (error != 0 && error != ENOENT) - goto done; + if (error != 0) { + LIN_SDT_PROBE1(mib, linux_prison_get, vfs_setopt_error, + error); + if(error != ENOENT) + goto done; + } } error = 0; done: mtx_unlock(&ppr->pr_mtx); + + LIN_SDT_PROBE1(mib, linux_prison_get, return, error); return (error); } @@ -429,7 +636,9 @@ static void linux_prison_destructor(void *data) { + LIN_SDT_PROBE1(mib, linux_prison_destructor, entry, data); free(data, M_PRISON); + LIN_SDT_PROBE0(mib, linux_prison_destructor, return); } void @@ -443,6 +652,8 @@ linux_osd_jail_register(void) [PR_METHOD_CHECK] = linux_prison_check }; + LIN_SDT_PROBE0(mib, linux_osd_jail_register, entry); + linux_osd_jail_slot = osd_jail_register(linux_prison_destructor, methods); if (linux_osd_jail_slot > 0) { @@ -452,14 +663,20 @@ linux_osd_jail_register(void) (void)linux_alloc_prison(pr, NULL); sx_xunlock(&allprison_lock); } + + LIN_SDT_PROBE0(mib, linux_osd_jail_register, return); } void linux_osd_jail_deregister(void) { + LIN_SDT_PROBE0(mib, linux_osd_jail_register, entry); + if (linux_osd_jail_slot) osd_jail_deregister(linux_osd_jail_slot); + + LIN_SDT_PROBE0(mib, linux_osd_jail_register, return); } void @@ -468,9 +685,13 @@ linux_get_osname(struct thread *td, char *dst) struct prison *pr; struct linux_prison *lpr; + LIN_SDT_PROBE2(mib, linux_get_osname, entry, td, dst); + lpr = linux_find_prison(td->td_ucred->cr_prison, &pr); bcopy(lpr->pr_osname, dst, LINUX_MAX_UTSNAME); mtx_unlock(&pr->pr_mtx); + + LIN_SDT_PROBE0(mib, linux_get_osname, return); } static int @@ -479,9 +700,13 @@ linux_set_osname(struct thread *td, char *osname) struct prison *pr; struct linux_prison *lpr; + LIN_SDT_PROBE2(mib, linux_set_osname, entry, td, osname); + lpr = linux_find_prison(td->td_ucred->cr_prison, &pr); strlcpy(lpr->pr_osname, osname, LINUX_MAX_UTSNAME); mtx_unlock(&pr->pr_mtx); + + LIN_SDT_PROBE1(mib, linux_set_osname, return, 0); return (0); } @@ -491,9 +716,13 @@ linux_get_osrelease(struct thread *td, char *dst) struct prison *pr; struct linux_prison *lpr; + LIN_SDT_PROBE2(mib, linux_get_osrelease, entry, td, dst); + lpr = linux_find_prison(td->td_ucred->cr_prison, &pr); bcopy(lpr->pr_osrelease, dst, LINUX_MAX_UTSNAME); mtx_unlock(&pr->pr_mtx); + + LIN_SDT_PROBE0(mib, linux_get_osrelease, return); } int @@ -503,9 +732,13 @@ linux_kernver(struct thread *td) struct linux_prison *lpr; int osrel; + LIN_SDT_PROBE1(mib, linux_kernver, entry, td); + lpr = linux_find_prison(td->td_ucred->cr_prison, &pr); osrel = lpr->pr_osrel; mtx_unlock(&pr->pr_mtx); + + LIN_SDT_PROBE1(mib, linux_kernver, return, osrel); return (osrel); } @@ -516,11 +749,15 @@ linux_set_osrelease(struct thread *td, char *osrelease) struct linux_prison *lpr; int error; + LIN_SDT_PROBE2(mib, linux_set_osrelease, entry, td, osrelease); + lpr = linux_find_prison(td->td_ucred->cr_prison, &pr); error = linux_map_osrel(osrelease, &lpr->pr_osrel); if (error == 0) strlcpy(lpr->pr_osrelease, osrelease, LINUX_MAX_UTSNAME); mtx_unlock(&pr->pr_mtx); + + LIN_SDT_PROBE1(mib, linux_set_osrelease, return, error); return (error); } @@ -531,9 +768,13 @@ linux_get_oss_version(struct thread *td) struct linux_prison *lpr; int version; + LIN_SDT_PROBE1(mib, linux_get_oss_version, entry, td); + lpr = linux_find_prison(td->td_ucred->cr_prison, &pr); version = lpr->pr_oss_version; mtx_unlock(&pr->pr_mtx); + + LIN_SDT_PROBE1(mib, linux_get_oss_version, return, version); return (version); } @@ -543,13 +784,18 @@ linux_set_oss_version(struct thread *td, int oss_version) struct prison *pr; struct linux_prison *lpr; + LIN_SDT_PROBE2(mib, linux_set_oss_version, entry, td, oss_version); + lpr = linux_find_prison(td->td_ucred->cr_prison, &pr); lpr->pr_oss_version = oss_version; mtx_unlock(&pr->pr_mtx); + + LIN_SDT_PROBE1(mib, linux_set_oss_version, return, 0); return (0); } #if defined(DEBUG) || defined(KTR) +/* XXX: can be removed when every ldebug(...) and KTR stuff are removed. */ u_char linux_debug_map[howmany(LINUX_SYS_MAXSYSCALL, sizeof(u_char))]; diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c index d8ce2a870cb..4365b10bdab 100644 --- a/sys/compat/linux/linux_misc.c +++ b/sys/compat/linux/linux_misc.c @@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" +#include "opt_kdtrace.h" #include #include @@ -53,6 +54,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -83,6 +85,7 @@ __FBSDID("$FreeBSD$"); #include #endif +#include #include #include #include @@ -91,6 +94,17 @@ __FBSDID("$FreeBSD$"); #include #include +/* DTrace init */ +LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE); + +/* Linuxulator-global DTrace probes */ +LIN_SDT_PROBE_DECLARE(locks, emul_lock, locked); +LIN_SDT_PROBE_DECLARE(locks, emul_lock, unlock); +LIN_SDT_PROBE_DECLARE(locks, emul_shared_rlock, locked); +LIN_SDT_PROBE_DECLARE(locks, emul_shared_rlock, unlock); +LIN_SDT_PROBE_DECLARE(locks, emul_shared_wlock, locked); +LIN_SDT_PROBE_DECLARE(locks, emul_shared_wlock, unlock); + int stclohz; /* Statistics clock frequency */ static unsigned int linux_to_bsd_resource[LINUX_RLIM_NLIMITS] = { diff --git a/sys/compat/linux/linux_sysctl.c b/sys/compat/linux/linux_sysctl.c index 9111dbec780..b2c10e1ccc1 100644 --- a/sys/compat/linux/linux_sysctl.c +++ b/sys/compat/linux/linux_sysctl.c @@ -30,12 +30,15 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" +#include "opt_kdtrace.h" #include +#include #include #include #include #include +#include #include #include #include @@ -48,6 +51,7 @@ __FBSDID("$FreeBSD$"); #include #endif +#include #include #define LINUX_CTL_KERN 1 @@ -65,23 +69,49 @@ __FBSDID("$FreeBSD$"); #define LINUX_KERN_OSREV 3 #define LINUX_KERN_VERSION 4 +/* DTrace init */ +LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE); + +/** + * DTrace probes in this module. + */ +LIN_SDT_PROBE_DEFINE2(sysctl, handle_string, entry, "struct l___sysctl_args *", + "char *"); +LIN_SDT_PROBE_DEFINE1(sysctl, handle_string, copyout_error, "int"); +LIN_SDT_PROBE_DEFINE1(sysctl, handle_string, return, "int"); +LIN_SDT_PROBE_DEFINE2(sysctl, linux_sysctl, entry, "struct l___sysctl_args *", + "struct thread *"); +LIN_SDT_PROBE_DEFINE1(sysctl, linux_sysctl, copyin_error, "int"); +LIN_SDT_PROBE_DEFINE2(sysctl, linux_sysctl, wrong_length, "int", "int"); +LIN_SDT_PROBE_DEFINE1(sysctl, linux_sysctl, unsupported_sysctl, "char *"); +LIN_SDT_PROBE_DEFINE1(sysctl, linux_sysctl, return, "int"); + static int handle_string(struct l___sysctl_args *la, char *value) { int error; + LIN_SDT_PROBE2(sysctl, handle_string, entry, la, value); + if (la->oldval != 0) { l_int len = strlen(value); error = copyout(value, PTRIN(la->oldval), len + 1); if (!error && la->oldlenp != 0) error = copyout(&len, PTRIN(la->oldlenp), sizeof(len)); - if (error) + if (error) { + LIN_SDT_PROBE1(sysctl, handle_string, copyout_error, + error); + LIN_SDT_PROBE1(sysctl, handle_string, return, error); return (error); + } } - if (la->newval != 0) + if (la->newval != 0) { + LIN_SDT_PROBE1(sysctl, handle_string, return, ENOTDIR); return (ENOTDIR); + } + LIN_SDT_PROBE1(sysctl, handle_string, return, 0); return (0); } @@ -91,18 +121,30 @@ linux_sysctl(struct thread *td, struct linux_sysctl_args *args) struct l___sysctl_args la; struct sbuf *sb; l_int *mib; + char *sysctl_string; int error, i; - error = copyin(args->args, &la, sizeof(la)); - if (error) - return (error); + LIN_SDT_PROBE2(sysctl, linux_sysctl, entry, td, args->args); - if (la.nlen <= 0 || la.nlen > LINUX_CTL_MAXNAME) + error = copyin(args->args, &la, sizeof(la)); + if (error) { + LIN_SDT_PROBE1(sysctl, linux_sysctl, copyin_error, error); + LIN_SDT_PROBE1(sysctl, linux_sysctl, return, error); + return (error); + } + + if (la.nlen <= 0 || la.nlen > LINUX_CTL_MAXNAME) { + LIN_SDT_PROBE2(sysctl, linux_sysctl, wrong_length, la.nlen, + LINUX_CTL_MAXNAME); + LIN_SDT_PROBE1(sysctl, linux_sysctl, return, ENOTDIR); return (ENOTDIR); + } mib = malloc(la.nlen * sizeof(l_int), M_TEMP, M_WAITOK); error = copyin(PTRIN(la.name), mib, la.nlen * sizeof(l_int)); if (error) { + LIN_SDT_PROBE1(sysctl, linux_sysctl, copyin_error, error); + LIN_SDT_PROBE1(sysctl, linux_sysctl, return, error); free(mib, M_TEMP); return (error); } @@ -116,6 +158,7 @@ linux_sysctl(struct thread *td, struct linux_sysctl_args *args) case LINUX_KERN_VERSION: error = handle_string(&la, version); free(mib, M_TEMP); + LIN_SDT_PROBE1(sysctl, linux_sysctl, return, error); return (error); default: break; @@ -128,16 +171,23 @@ linux_sysctl(struct thread *td, struct linux_sysctl_args *args) sb = sbuf_new(NULL, NULL, 20 + la.nlen * 5, SBUF_AUTOEXTEND); if (sb == NULL) { linux_msg(td, "sysctl is not implemented"); + LIN_SDT_PROBE1(sysctl, linux_sysctl, unsupported_sysctl, + "unknown sysctl, ENOMEM during lookup"); } else { sbuf_printf(sb, "sysctl "); for (i = 0; i < la.nlen; i++) sbuf_printf(sb, "%c%d", (i) ? ',' : '{', mib[i]); sbuf_printf(sb, "} is not implemented"); sbuf_finish(sb); + sysctl_string = sbuf_data(sb); linux_msg(td, "%s", sbuf_data(sb)); + LIN_SDT_PROBE1(sysctl, linux_sysctl, unsupported_sysctl, + sysctl_string); sbuf_delete(sb); } free(mib, M_TEMP); + + LIN_SDT_PROBE1(sysctl, linux_sysctl, return, ENOTDIR); return (ENOTDIR); } diff --git a/sys/compat/linux/linux_time.c b/sys/compat/linux/linux_time.c index 8800d674c31..13590252076 100644 --- a/sys/compat/linux/linux_time.c +++ b/sys/compat/linux/linux_time.c @@ -36,10 +36,13 @@ __KERNEL_RCSID(0, "$NetBSD: linux_time.c,v 1.14 2006/05/14 03:40:54 christos Exp #endif #include "opt_compat.h" +#include "opt_kdtrace.h" #include +#include #include #include +#include #include #include #include @@ -56,6 +59,63 @@ __KERNEL_RCSID(0, "$NetBSD: linux_time.c,v 1.14 2006/05/14 03:40:54 christos Exp #include #endif +#include + +/* DTrace init */ +LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE); + +/** + * DTrace probes in this module. + */ +LIN_SDT_PROBE_DEFINE2(time, native_to_linux_timespec, entry, + "struct l_timespec *", "struct timespec *"); +LIN_SDT_PROBE_DEFINE0(time, native_to_linux_timespec, return); +LIN_SDT_PROBE_DEFINE2(time, linux_to_native_timespec, entry, + "struct timespec *", "struct l_timespec *"); +LIN_SDT_PROBE_DEFINE1(time, linux_to_native_timespec, return, "int"); +LIN_SDT_PROBE_DEFINE2(time, linux_to_native_clockid, entry, "clockid_t *", + "clockid_t"); +LIN_SDT_PROBE_DEFINE1(time, linux_to_native_clockid, unsupported_clockid, + "clockid_t"); +LIN_SDT_PROBE_DEFINE1(time, linux_to_native_clockid, unknown_clockid, + "clockid_t"); +LIN_SDT_PROBE_DEFINE1(time, linux_to_native_clockid, return, "int"); +LIN_SDT_PROBE_DEFINE2(time, linux_clock_gettime, entry, "clockid_t", + "struct l_timespec *"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_gettime, conversion_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_gettime, gettime_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_gettime, copyout_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_gettime, return, "int"); +LIN_SDT_PROBE_DEFINE2(time, linux_clock_settime, entry, "clockid_t", + "struct l_timespec *"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_settime, conversion_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_settime, settime_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_settime, copyin_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_settime, return, "int"); +LIN_SDT_PROBE_DEFINE2(time, linux_clock_getres, entry, "clockid_t", + "struct l_timespec *"); +LIN_SDT_PROBE_DEFINE0(time, linux_clock_getres, nullcall); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_getres, conversion_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_getres, getres_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_getres, copyout_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_getres, return, "int"); +LIN_SDT_PROBE_DEFINE2(time, linux_nanosleep, entry, "const struct l_timespec *", + "struct l_timespec *"); +LIN_SDT_PROBE_DEFINE1(time, linux_nanosleep, conversion_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_nanosleep, nanosleep_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_nanosleep, copyout_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_nanosleep, copyin_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_nanosleep, return, "int"); +LIN_SDT_PROBE_DEFINE4(time, linux_clock_nanosleep, entry, "clockid_t", "int", + "struct l_timespec *", "struct l_timespec *"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, conversion_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, nanosleep_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, copyout_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, copyin_error, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, unsupported_flags, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, unsupported_clockid, "int"); +LIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, return, "int"); + static void native_to_linux_timespec(struct l_timespec *, struct timespec *); static int linux_to_native_timespec(struct timespec *, @@ -65,24 +125,38 @@ static int linux_to_native_clockid(clockid_t *, clockid_t); static void native_to_linux_timespec(struct l_timespec *ltp, struct timespec *ntp) { + + LIN_SDT_PROBE2(time, native_to_linux_timespec, entry, ltp, ntp); + ltp->tv_sec = ntp->tv_sec; ltp->tv_nsec = ntp->tv_nsec; + + LIN_SDT_PROBE0(time, native_to_linux_timespec, return); } static int linux_to_native_timespec(struct timespec *ntp, struct l_timespec *ltp) { - if (ltp->tv_sec < 0 || ltp->tv_nsec > (l_long)999999999L) + + LIN_SDT_PROBE2(time, linux_to_native_timespec, entry, ntp, ltp); + + if (ltp->tv_sec < 0 || ltp->tv_nsec > (l_long)999999999L) { + LIN_SDT_PROBE1(time, linux_to_native_timespec, return, EINVAL); return (EINVAL); + } ntp->tv_sec = ltp->tv_sec; ntp->tv_nsec = ltp->tv_nsec; + LIN_SDT_PROBE1(time, linux_to_native_timespec, return, 0); return (0); } static int linux_to_native_clockid(clockid_t *n, clockid_t l) { + + LIN_SDT_PROBE2(time, linux_to_native_clockid, entry, n, l); + switch (l) { case LINUX_CLOCK_REALTIME: *n = CLOCK_REALTIME; @@ -94,11 +168,20 @@ linux_to_native_clockid(clockid_t *n, clockid_t l) case LINUX_CLOCK_THREAD_CPUTIME_ID: case LINUX_CLOCK_REALTIME_HR: case LINUX_CLOCK_MONOTONIC_HR: + LIN_SDT_PROBE1(time, linux_to_native_clockid, + unsupported_clockid, l); + LIN_SDT_PROBE1(time, linux_to_native_clockid, return, EINVAL); + return (EINVAL); + break; default: + LIN_SDT_PROBE1(time, linux_to_native_clockid, + unknown_clockid, l); + LIN_SDT_PROBE1(time, linux_to_native_clockid, return, EINVAL); return (EINVAL); break; } + LIN_SDT_PROBE1(time, linux_to_native_clockid, return, 0); return (0); } @@ -110,15 +193,29 @@ linux_clock_gettime(struct thread *td, struct linux_clock_gettime_args *args) clockid_t nwhich = 0; /* XXX: GCC */ struct timespec tp; + LIN_SDT_PROBE2(time, linux_clock_gettime, entry, args->which, args->tp); + error = linux_to_native_clockid(&nwhich, args->which); - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(time, linux_clock_gettime, conversion_error, + error); + LIN_SDT_PROBE1(time, linux_clock_gettime, return, error); return (error); + } error = kern_clock_gettime(td, nwhich, &tp); - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(time, linux_clock_gettime, gettime_error, error); + LIN_SDT_PROBE1(time, linux_clock_gettime, return, error); return (error); + } native_to_linux_timespec(<s, &tp); - return (copyout(<s, args->tp, sizeof lts)); + error = copyout(<s, args->tp, sizeof lts); + if (error != 0) + LIN_SDT_PROBE1(time, linux_clock_gettime, copyout_error, error); + + LIN_SDT_PROBE1(time, linux_clock_gettime, return, error); + return (error); } int @@ -129,17 +226,35 @@ linux_clock_settime(struct thread *td, struct linux_clock_settime_args *args) int error; clockid_t nwhich = 0; /* XXX: GCC */ - error = linux_to_native_clockid(&nwhich, args->which); - if (error != 0) - return (error); - error = copyin(args->tp, <s, sizeof lts); - if (error != 0) - return (error); - error = linux_to_native_timespec(&ts, <s); - if (error != 0) - return (error); + LIN_SDT_PROBE2(time, linux_clock_settime, entry, args->which, args->tp); - return (kern_clock_settime(td, nwhich, &ts)); + error = linux_to_native_clockid(&nwhich, args->which); + if (error != 0) { + LIN_SDT_PROBE1(time, linux_clock_settime, conversion_error, + error); + LIN_SDT_PROBE1(time, linux_clock_settime, return, error); + return (error); + } + error = copyin(args->tp, <s, sizeof lts); + if (error != 0) { + LIN_SDT_PROBE1(time, linux_clock_settime, copyin_error, error); + LIN_SDT_PROBE1(time, linux_clock_settime, return, error); + return (error); + } + error = linux_to_native_timespec(&ts, <s); + if (error != 0) { + LIN_SDT_PROBE1(time, linux_clock_settime, conversion_error, + error); + LIN_SDT_PROBE1(time, linux_clock_settime, return, error); + return (error); + } + + error = kern_clock_settime(td, nwhich, &ts); + if (error != 0) + LIN_SDT_PROBE1(time, linux_clock_settime, settime_error, error); + + LIN_SDT_PROBE1(time, linux_clock_settime, return, error); + return (error); } int @@ -150,18 +265,35 @@ linux_clock_getres(struct thread *td, struct linux_clock_getres_args *args) int error; clockid_t nwhich = 0; /* XXX: GCC */ - if (args->tp == NULL) + LIN_SDT_PROBE2(time, linux_clock_getres, entry, args->which, args->tp); + + if (args->tp == NULL) { + LIN_SDT_PROBE0(time, linux_clock_getres, nullcall); + LIN_SDT_PROBE1(time, linux_clock_getres, return, 0); return (0); + } error = linux_to_native_clockid(&nwhich, args->which); - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(time, linux_clock_getres, conversion_error, + error); + LIN_SDT_PROBE1(time, linux_clock_getres, return, error); return (error); + } error = kern_clock_getres(td, nwhich, &ts); - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(time, linux_clock_getres, getres_error, error); + LIN_SDT_PROBE1(time, linux_clock_getres, return, error); return (error); + } native_to_linux_timespec(<s, &ts); - return (copyout(<s, args->tp, sizeof lts)); + error = copyout(<s, args->tp, sizeof lts); + if (error != 0) + LIN_SDT_PROBE1(time, linux_clock_getres, copyout_error, error); + + LIN_SDT_PROBE1(time, linux_clock_getres, return, error); + return (error); } int @@ -172,9 +304,14 @@ linux_nanosleep(struct thread *td, struct linux_nanosleep_args *args) struct timespec rqts, rmts; int error; + LIN_SDT_PROBE2(time, linux_nanosleep, entry, args->rqtp, args->rmtp); + error = copyin(args->rqtp, &lrqts, sizeof lrqts); - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(time, linux_nanosleep, copyin_error, error); + LIN_SDT_PROBE1(time, linux_nanosleep, return, error); return (error); + } if (args->rmtp != NULL) rmtp = &rmts; @@ -182,19 +319,30 @@ linux_nanosleep(struct thread *td, struct linux_nanosleep_args *args) rmtp = NULL; error = linux_to_native_timespec(&rqts, &lrqts); - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(time, linux_nanosleep, conversion_error, error); + LIN_SDT_PROBE1(time, linux_nanosleep, return, error); return (error); + } error = kern_nanosleep(td, &rqts, rmtp); - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(time, linux_nanosleep, nanosleep_error, error); + LIN_SDT_PROBE1(time, linux_nanosleep, return, error); return (error); + } if (args->rmtp != NULL) { native_to_linux_timespec(&lrmts, rmtp); error = copyout(&lrmts, args->rmtp, sizeof(lrmts)); - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(time, linux_nanosleep, copyout_error, + error); + LIN_SDT_PROBE1(time, linux_nanosleep, return, error); return (error); + } } + LIN_SDT_PROBE1(time, linux_nanosleep, return, 0); return (0); } @@ -206,15 +354,31 @@ linux_clock_nanosleep(struct thread *td, struct linux_clock_nanosleep_args *args struct timespec rqts, rmts; int error; - if (args->flags != 0) - return (EINVAL); /* XXX deal with TIMER_ABSTIME */ + LIN_SDT_PROBE4(time, linux_clock_nanosleep, entry, args->which, + args->flags, args->rqtp, args->rmtp); - if (args->which != LINUX_CLOCK_REALTIME) + if (args->flags != 0) { + /* XXX deal with TIMER_ABSTIME */ + LIN_SDT_PROBE1(time, linux_clock_nanosleep, unsupported_flags, + args->flags); + LIN_SDT_PROBE1(time, linux_clock_nanosleep, return, EINVAL); + return (EINVAL); /* XXX deal with TIMER_ABSTIME */ + } + + if (args->which != LINUX_CLOCK_REALTIME) { + LIN_SDT_PROBE1(time, linux_clock_nanosleep, unsupported_clockid, + args->which); + LIN_SDT_PROBE1(time, linux_clock_nanosleep, return, EINVAL); return (EINVAL); + } error = copyin(args->rqtp, &lrqts, sizeof lrqts); - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(time, linux_clock_nanosleep, copyin_error, + error); + LIN_SDT_PROBE1(time, linux_clock_nanosleep, return, error); return (error); + } if (args->rmtp != NULL) rmtp = &rmts; @@ -222,18 +386,31 @@ linux_clock_nanosleep(struct thread *td, struct linux_clock_nanosleep_args *args rmtp = NULL; error = linux_to_native_timespec(&rqts, &lrqts); - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(time, linux_clock_nanosleep, conversion_error, + error); + LIN_SDT_PROBE1(time, linux_clock_nanosleep, return, error); return (error); + } error = kern_nanosleep(td, &rqts, rmtp); - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(time, linux_clock_nanosleep, nanosleep_error, + error); + LIN_SDT_PROBE1(time, linux_clock_nanosleep, return, error); return (error); + } if (args->rmtp != NULL) { native_to_linux_timespec(&lrmts, rmtp); error = copyout(&lrmts, args->rmtp, sizeof lrmts ); - if (error != 0) + if (error != 0) { + LIN_SDT_PROBE1(time, linux_clock_nanosleep, + copyout_error, error); + LIN_SDT_PROBE1(time, linux_nanosleep, return, error); return (error); + } } + LIN_SDT_PROBE1(time, linux_clock_nanosleep, return, 0); return (0); } diff --git a/sys/compat/linux/linux_uid16.c b/sys/compat/linux/linux_uid16.c index 31950ffb228..b66fb5c1c25 100644 --- a/sys/compat/linux/linux_uid16.c +++ b/sys/compat/linux/linux_uid16.c @@ -28,14 +28,17 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" +#include "opt_kdtrace.h" #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -48,8 +51,53 @@ __FBSDID("$FreeBSD$"); #include #endif +#include #include +/* DTrace init */ +LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE); + +/** + * DTrace probes in this module. + */ +LIN_SDT_PROBE_DEFINE3(uid16, linux_chown16, entry, "char *", "l_uid16_t", + "l_gid16_t"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_chown16, conv_path, "char *"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_chown16, return, "int"); +LIN_SDT_PROBE_DEFINE3(uid16, linux_lchown16, entry, "char *", "l_uid16_t", + "l_gid16_t"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_lchown16, conv_path, "char *"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_lchown16, return, "int"); +LIN_SDT_PROBE_DEFINE2(uid16, linux_setgroups16, entry, "l_uint", "l_gid16_t *"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_setgroups16, copyin_error, "int"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_setgroups16, priv_check_cred_error, "int"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_setgroups16, return, "int"); +LIN_SDT_PROBE_DEFINE2(uid16, linux_getgroups16, entry, "l_uint", "l_gid16_t *"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_getgroups16, copyout_error, "int"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_getgroups16, return, "int"); +LIN_SDT_PROBE_DEFINE0(uid16, linux_getgid16, entry); +LIN_SDT_PROBE_DEFINE1(uid16, linux_getgid16, return, "int"); +LIN_SDT_PROBE_DEFINE0(uid16, linux_getuid16, entry); +LIN_SDT_PROBE_DEFINE1(uid16, linux_getuid16, return, "int"); +LIN_SDT_PROBE_DEFINE0(uid16, linux_getegid16, entry); +LIN_SDT_PROBE_DEFINE1(uid16, linux_getegid16, return, "int"); +LIN_SDT_PROBE_DEFINE0(uid16, linux_geteuid16, entry); +LIN_SDT_PROBE_DEFINE1(uid16, linux_geteuid16, return, "int"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_setgid16, entry, "l_gid16_t"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_setgid16, return, "int"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_setuid16, entry, "l_uid16_t"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_setuid16, return, "int"); +LIN_SDT_PROBE_DEFINE2(uid16, linux_setregid16, entry, "l_git16_t", "l_git16_t"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_setregid16, return, "int"); +LIN_SDT_PROBE_DEFINE2(uid16, linux_setreuid16, entry, "l_uid16_t", "l_uid16_t"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_setreuid16, return, "int"); +LIN_SDT_PROBE_DEFINE3(uid16, linux_setresgid16, entry, "l_gid16_t", "l_gid16_t", + "l_gid16_t"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_setresgid16, return, "int"); +LIN_SDT_PROBE_DEFINE3(uid16, linux_setresuid16, entry, "l_uid16_t", "l_uid16_t", + "l_uid16_t"); +LIN_SDT_PROBE_DEFINE1(uid16, linux_setresuid16, return, "int"); + DUMMY(setfsuid16); DUMMY(setfsgid16); DUMMY(getresuid16); @@ -65,13 +113,20 @@ linux_chown16(struct thread *td, struct linux_chown16_args *args) LCONVPATHEXIST(td, args->path, &path); -#ifdef DEBUG - if (ldebug(chown16)) - printf(ARGS(chown16, "%s, %d, %d"), path, args->uid, args->gid); -#endif + /* + * The DTrace probes have to be after the LCONVPATHEXIST, as + * LCONVPATHEXIST may return on its own and we do not want to + * have a stray entry without the corresponding return. + */ + LIN_SDT_PROBE3(uid16, linux_chown16, entry, args->path, args->uid, + args->gid); + LIN_SDT_PROBE1(uid16, linux_chown16, conv_path, path); + error = kern_chown(td, path, UIO_SYSSPACE, CAST_NOCHG(args->uid), CAST_NOCHG(args->gid)); LFREEPATH(path); + + LIN_SDT_PROBE1(uid16, linux_chown16, return, error); return (error); } @@ -83,14 +138,20 @@ linux_lchown16(struct thread *td, struct linux_lchown16_args *args) LCONVPATHEXIST(td, args->path, &path); -#ifdef DEBUG - if (ldebug(lchown16)) - printf(ARGS(lchown16, "%s, %d, %d"), path, args->uid, - args->gid); -#endif + /* + * The DTrace probes have to be after the LCONVPATHEXIST, as + * LCONVPATHEXIST may return on its own and we do not want to + * have a stray entry without the corresponding return. + */ + LIN_SDT_PROBE3(uid16, linux_lchown16, entry, args->path, args->uid, + args->gid); + LIN_SDT_PROBE1(uid16, linux_lchown16, conv_path, path); + error = kern_lchown(td, path, UIO_SYSSPACE, CAST_NOCHG(args->uid), CAST_NOCHG(args->gid)); LFREEPATH(path); + + LIN_SDT_PROBE1(uid16, linux_lchown16, return, error); return (error); } @@ -103,17 +164,19 @@ linux_setgroups16(struct thread *td, struct linux_setgroups16_args *args) int ngrp, error; struct proc *p; -#ifdef DEBUG - if (ldebug(setgroups16)) - printf(ARGS(setgroups16, "%d, *"), args->gidsetsize); -#endif + LIN_SDT_PROBE2(uid16, linux_setgroups16, entry, args->gidsetsize, + args->gidset); ngrp = args->gidsetsize; - if (ngrp < 0 || ngrp >= ngroups_max + 1) + if (ngrp < 0 || ngrp >= ngroups_max + 1) { + LIN_SDT_PROBE1(uid16, linux_setgroups16, return, EINVAL); return (EINVAL); + } linux_gidset = malloc(ngrp * sizeof(*linux_gidset), M_TEMP, M_WAITOK); error = copyin(args->gidset, linux_gidset, ngrp * sizeof(l_gid16_t)); if (error) { + LIN_SDT_PROBE1(uid16, linux_setgroups16, copyin_error, error); + LIN_SDT_PROBE1(uid16, linux_setgroups16, return, error); free(linux_gidset, M_TEMP); return (error); } @@ -131,6 +194,9 @@ linux_setgroups16(struct thread *td, struct linux_setgroups16_args *args) if ((error = priv_check_cred(oldcred, PRIV_CRED_SETGROUPS, 0)) != 0) { PROC_UNLOCK(p); crfree(newcred); + + LIN_SDT_PROBE1(uid16, linux_setgroups16, priv_check_cred_error, + error); goto out; } @@ -154,6 +220,8 @@ linux_setgroups16(struct thread *td, struct linux_setgroups16_args *args) error = 0; out: free(linux_gidset, M_TEMP); + + LIN_SDT_PROBE1(uid16, linux_setgroups16, return, error); return (error); } @@ -165,10 +233,8 @@ linux_getgroups16(struct thread *td, struct linux_getgroups16_args *args) gid_t *bsd_gidset; int bsd_gidsetsz, ngrp, error; -#ifdef DEBUG - if (ldebug(getgroups16)) - printf(ARGS(getgroups16, "%d, *"), args->gidsetsize); -#endif + LIN_SDT_PROBE2(uid16, linux_getgroups16, entry, args->gidsetsize, + args->gidset); cred = td->td_ucred; bsd_gidset = cred->cr_groups; @@ -182,11 +248,15 @@ linux_getgroups16(struct thread *td, struct linux_getgroups16_args *args) if ((ngrp = args->gidsetsize) == 0) { td->td_retval[0] = bsd_gidsetsz; + + LIN_SDT_PROBE1(uid16, linux_getgroups16, return, 0); return (0); } - if (ngrp < bsd_gidsetsz) + if (ngrp < bsd_gidsetsz) { + LIN_SDT_PROBE1(uid16, linux_getgroups16, return, EINVAL); return (EINVAL); + } ngrp = 0; linux_gidset = malloc(bsd_gidsetsz * sizeof(*linux_gidset), @@ -198,10 +268,15 @@ linux_getgroups16(struct thread *td, struct linux_getgroups16_args *args) error = copyout(linux_gidset, args->gidset, ngrp * sizeof(l_gid16_t)); free(linux_gidset, M_TEMP); - if (error) + if (error) { + LIN_SDT_PROBE1(uid16, linux_getgroups16, copyout_error, error); + LIN_SDT_PROBE1(uid16, linux_getgroups16, return, error); return (error); + } td->td_retval[0] = ngrp; + + LIN_SDT_PROBE1(uid16, linux_getgroups16, return, 0); return (0); } @@ -219,7 +294,11 @@ int linux_getgid16(struct thread *td, struct linux_getgid16_args *args) { + LIN_SDT_PROBE0(uid16, linux_getgid16, entry); + td->td_retval[0] = td->td_ucred->cr_rgid; + + LIN_SDT_PROBE1(uid16, linux_getgid16, return, 0); return (0); } @@ -227,7 +306,11 @@ int linux_getuid16(struct thread *td, struct linux_getuid16_args *args) { + LIN_SDT_PROBE0(uid16, linux_getuid16, entry); + td->td_retval[0] = td->td_ucred->cr_ruid; + + LIN_SDT_PROBE1(uid16, linux_getuid16, return, 0); return (0); } @@ -235,74 +318,124 @@ int linux_getegid16(struct thread *td, struct linux_getegid16_args *args) { struct getegid_args bsd; + int error; - return (sys_getegid(td, &bsd)); + LIN_SDT_PROBE0(uid16, linux_getegid16, entry); + + error = sys_getegid(td, &bsd); + + LIN_SDT_PROBE1(uid16, linux_getegid16, return, error); + return (error); } int linux_geteuid16(struct thread *td, struct linux_geteuid16_args *args) { struct geteuid_args bsd; + int error; - return (sys_geteuid(td, &bsd)); + LIN_SDT_PROBE0(uid16, linux_geteuid16, entry); + + error = sys_geteuid(td, &bsd); + + LIN_SDT_PROBE1(uid16, linux_geteuid16, return, error); + return (error); } int linux_setgid16(struct thread *td, struct linux_setgid16_args *args) { struct setgid_args bsd; + int error; + + LIN_SDT_PROBE1(uid16, linux_setgid16, entry, args->gid); bsd.gid = args->gid; - return (sys_setgid(td, &bsd)); + error = sys_setgid(td, &bsd); + + LIN_SDT_PROBE1(uid16, linux_setgid16, return, error); + return (error); } int linux_setuid16(struct thread *td, struct linux_setuid16_args *args) { struct setuid_args bsd; + int error; + + LIN_SDT_PROBE1(uid16, linux_setuid16, entry, args->uid); bsd.uid = args->uid; - return (sys_setuid(td, &bsd)); + error = sys_setuid(td, &bsd); + + LIN_SDT_PROBE1(uid16, linux_setuid16, return, error); + return (error); } int linux_setregid16(struct thread *td, struct linux_setregid16_args *args) { struct setregid_args bsd; + int error; + + LIN_SDT_PROBE2(uid16, linux_setregid16, entry, args->rgid, args->egid); bsd.rgid = CAST_NOCHG(args->rgid); bsd.egid = CAST_NOCHG(args->egid); - return (sys_setregid(td, &bsd)); + error = sys_setregid(td, &bsd); + + LIN_SDT_PROBE1(uid16, linux_setregid16, return, error); + return (error); } int linux_setreuid16(struct thread *td, struct linux_setreuid16_args *args) { struct setreuid_args bsd; + int error; + + LIN_SDT_PROBE2(uid16, linux_setreuid16, entry, args->ruid, args->euid); bsd.ruid = CAST_NOCHG(args->ruid); bsd.euid = CAST_NOCHG(args->euid); - return (sys_setreuid(td, &bsd)); + error = sys_setreuid(td, &bsd); + + LIN_SDT_PROBE1(uid16, linux_setreuid16, return, error); + return (error); } int linux_setresgid16(struct thread *td, struct linux_setresgid16_args *args) { struct setresgid_args bsd; + int error; + + LIN_SDT_PROBE3(uid16, linux_setresgid16, entry, args->rgid, args->egid, + args->sgid); bsd.rgid = CAST_NOCHG(args->rgid); bsd.egid = CAST_NOCHG(args->egid); bsd.sgid = CAST_NOCHG(args->sgid); - return (sys_setresgid(td, &bsd)); + error = sys_setresgid(td, &bsd); + + LIN_SDT_PROBE1(uid16, linux_setresgid16, return, error); + return (error); } int linux_setresuid16(struct thread *td, struct linux_setresuid16_args *args) { struct setresuid_args bsd; + int error; + + LIN_SDT_PROBE3(uid16, linux_setresuid16, entry, args->ruid, args->euid, + args->suid); bsd.ruid = CAST_NOCHG(args->ruid); bsd.euid = CAST_NOCHG(args->euid); bsd.suid = CAST_NOCHG(args->suid); - return (sys_setresuid(td, &bsd)); + error = sys_setresuid(td, &bsd); + + LIN_SDT_PROBE1(uid16, linux_setresuid16, return, error); + return (error); } diff --git a/sys/compat/linux/linux_util.c b/sys/compat/linux/linux_util.c index 3c26f88d698..76c210c591f 100644 --- a/sys/compat/linux/linux_util.c +++ b/sys/compat/linux/linux_util.c @@ -33,16 +33,19 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" +#include "opt_kdtrace.h" #include #include #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -56,8 +59,42 @@ __FBSDID("$FreeBSD$"); #include #endif +#include + const char linux_emul_path[] = "/compat/linux"; +/* DTrace init */ +LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE); + +/** + * DTrace probes in this module. + */ +LIN_SDT_PROBE_DEFINE5(util, linux_emul_convpath, entry, "const char *", + "enum uio_seg", "char **", "int", "int"); +LIN_SDT_PROBE_DEFINE1(util, linux_emul_convpath, return, "int"); +LIN_SDT_PROBE_DEFINE1(util, linux_msg, entry, "const char *"); +LIN_SDT_PROBE_DEFINE0(util, linux_msg, return); +LIN_SDT_PROBE_DEFINE2(util, linux_driver_get_name_dev, entry, "device_t", + "const char *"); +LIN_SDT_PROBE_DEFINE0(util, linux_driver_get_name_dev, nullcall); +LIN_SDT_PROBE_DEFINE1(util, linux_driver_get_name_dev, return, "char *"); +LIN_SDT_PROBE_DEFINE3(util, linux_driver_get_major_minor, entry, "char *", + "int *", "int *"); +LIN_SDT_PROBE_DEFINE0(util, linux_driver_get_major_minor, nullcall); +LIN_SDT_PROBE_DEFINE1(util, linux_driver_get_major_minor, notfound, "char *"); +LIN_SDT_PROBE_DEFINE3(util, linux_driver_get_major_minor, return, "int", + "int", "int"); +LIN_SDT_PROBE_DEFINE0(util, linux_get_char_devices, entry); +LIN_SDT_PROBE_DEFINE1(util, linux_get_char_devices, return, "char *"); +LIN_SDT_PROBE_DEFINE1(util, linux_free_get_char_devices, entry, "char *"); +LIN_SDT_PROBE_DEFINE0(util, linux_free_get_char_devices, return); +LIN_SDT_PROBE_DEFINE1(util, linux_device_register_handler, entry, + "struct linux_device_handler *"); +LIN_SDT_PROBE_DEFINE1(util, linux_device_register_handler, return, "int"); +LIN_SDT_PROBE_DEFINE1(util, linux_device_unregister_handler, entry, + "struct linux_device_handler *"); +LIN_SDT_PROBE_DEFINE1(util, linux_device_unregister_handler, return, "int"); + /* * Search an alternate path before passing pathname arguments on to * system calls. Useful for keeping a separate 'emulation tree'. @@ -66,17 +103,19 @@ const char linux_emul_path[] = "/compat/linux"; * named file, i.e. we check if the directory it should be in exists. */ int -linux_emul_convpath(td, path, pathseg, pbuf, cflag, dfd) - struct thread *td; - const char *path; - enum uio_seg pathseg; - char **pbuf; - int cflag; - int dfd; +linux_emul_convpath(struct thread *td, const char *path, enum uio_seg pathseg, + char **pbuf, int cflag, int dfd) { + int retval; - return (kern_alternate_path(td, linux_emul_path, path, pathseg, pbuf, - cflag, dfd)); + LIN_SDT_PROBE5(util, linux_emul_convpath, entry, path, pathseg, pbuf, + cflag, dfd); + + retval = kern_alternate_path(td, linux_emul_path, path, pathseg, pbuf, + cflag, dfd); + + LIN_SDT_PROBE1(util, linux_emul_convpath, return, retval); + return (retval); } void @@ -85,12 +124,16 @@ linux_msg(const struct thread *td, const char *fmt, ...) va_list ap; struct proc *p; + LIN_SDT_PROBE1(util, linux_msg, entry, fmt); + p = td->td_proc; printf("linux: pid %d (%s): ", (int)p->p_pid, p->p_comm); va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); printf("\n"); + + LIN_SDT_PROBE0(util, linux_msg, return); } struct device_element @@ -113,13 +156,23 @@ linux_driver_get_name_dev(device_t dev) struct device_element *de; const char *device_name = device_get_name(dev); - if (device_name == NULL) + LIN_SDT_PROBE2(util, linux_driver_get_name_dev, entry, dev, + device_name); + + if (device_name == NULL) { + LIN_SDT_PROBE0(util, linux_driver_get_name_dev, nullcall); + LIN_SDT_PROBE1(util, linux_driver_get_name_dev, return, NULL); return NULL; + } TAILQ_FOREACH(de, &devices, list) { - if (strcmp(device_name, de->entry.bsd_driver_name) == 0) + if (strcmp(device_name, de->entry.bsd_driver_name) == 0) { + LIN_SDT_PROBE1(util, linux_driver_get_name_dev, return, + de->entry.linux_driver_name); return (de->entry.linux_driver_name); + } } + LIN_SDT_PROBE1(util, linux_driver_get_name_dev, return, NULL); return NULL; } @@ -128,8 +181,15 @@ linux_driver_get_major_minor(const char *node, int *major, int *minor) { struct device_element *de; - if (node == NULL || major == NULL || minor == NULL) + LIN_SDT_PROBE3(util, linux_driver_get_major_minor, entry, node, major, + minor); + + if (node == NULL || major == NULL || minor == NULL) { + LIN_SDT_PROBE0(util, linux_driver_get_major_minor, nullcall); + LIN_SDT_PROBE3(util, linux_driver_get_major_minor, return, 1, + 0, 0); return 1; + } if (strlen(node) > strlen("pts/") && strncmp(node, "pts/", strlen("pts/")) == 0) { @@ -143,6 +203,9 @@ linux_driver_get_major_minor(const char *node, int *major, int *minor) devno = strtoul(node + strlen("pts/"), NULL, 10); *major = 136 + (devno / 256); *minor = devno % 256; + + LIN_SDT_PROBE3(util, linux_driver_get_major_minor, return, 0, + *major, *minor); return 0; } @@ -150,10 +213,15 @@ linux_driver_get_major_minor(const char *node, int *major, int *minor) if (strcmp(node, de->entry.bsd_device_name) == 0) { *major = de->entry.linux_major; *minor = de->entry.linux_minor; + + LIN_SDT_PROBE3(util, linux_driver_get_major_minor, + return, 0, *major, *minor); return 0; } } + LIN_SDT_PROBE1(util, linux_driver_get_major_minor, notfound, node); + LIN_SDT_PROBE3(util, linux_driver_get_major_minor, return, 1, 0, 0); return 1; } @@ -165,6 +233,8 @@ linux_get_char_devices() char formated[256]; int current_size = 0, string_size = 1024; + LIN_SDT_PROBE0(util, linux_get_char_devices, entry); + string = malloc(string_size, M_LINUX, M_WAITOK); string[0] = '\000'; last = ""; @@ -191,13 +261,19 @@ linux_get_char_devices() } } + LIN_SDT_PROBE1(util, linux_get_char_devices, return, string); return string; } void linux_free_get_char_devices(char *string) { + + LIN_SDT_PROBE1(util, linux_get_char_devices, entry, string); + free(string, M_LINUX); + + LIN_SDT_PROBE0(util, linux_get_char_devices, return); } static int linux_major_starting = 200; @@ -207,11 +283,15 @@ linux_device_register_handler(struct linux_device_handler *d) { struct device_element *de; - if (d == NULL) - return (EINVAL); + LIN_SDT_PROBE1(util, linux_device_register_handler, entry, d); - de = malloc(sizeof(*de), - M_LINUX, M_WAITOK); + if (d == NULL) { + LIN_SDT_PROBE1(util, linux_device_register_handler, return, + EINVAL); + return (EINVAL); + } + + de = malloc(sizeof(*de), M_LINUX, M_WAITOK); if (d->linux_major < 0) { d->linux_major = linux_major_starting++; } @@ -220,6 +300,7 @@ linux_device_register_handler(struct linux_device_handler *d) /* Add the element to the list, sorted on span. */ TAILQ_INSERT_TAIL(&devices, de, list); + LIN_SDT_PROBE1(util, linux_device_register_handler, return, 0); return (0); } @@ -228,16 +309,25 @@ linux_device_unregister_handler(struct linux_device_handler *d) { struct device_element *de; - if (d == NULL) + LIN_SDT_PROBE1(util, linux_device_unregister_handler, entry, d); + + if (d == NULL) { + LIN_SDT_PROBE1(util, linux_device_unregister_handler, return, + EINVAL); return (EINVAL); + } TAILQ_FOREACH(de, &devices, list) { if (bcmp(d, &de->entry, sizeof(*d)) == 0) { TAILQ_REMOVE(&devices, de, list); free(de, M_LINUX); + + LIN_SDT_PROBE1(util, linux_device_unregister_handler, + return, 0); return (0); } } + LIN_SDT_PROBE1(util, linux_device_unregister_handler, return, EINVAL); return (EINVAL); } diff --git a/sys/compat/linux/linux_util.h b/sys/compat/linux/linux_util.h index 2908a0fe4e2..6be0392f75a 100644 --- a/sys/compat/linux/linux_util.h +++ b/sys/compat/linux/linux_util.h @@ -68,15 +68,23 @@ int linux_emul_convpath(struct thread *, const char *, enum uio_seg, char **, in #define LFREEPATH(path) free(path, M_TEMP) #define DUMMY(s) \ +LIN_SDT_PROBE_DEFINE0(dummy, s, entry); \ +LIN_SDT_PROBE_DEFINE0(dummy, s, not_implemented); \ +LIN_SDT_PROBE_DEFINE1(dummy, s, return, "int"); \ int \ linux_ ## s(struct thread *td, struct linux_ ## s ## _args *args) \ { \ static pid_t pid; \ \ + LIN_SDT_PROBE0(dummy, s, entry); \ + \ if (pid != td->td_proc->p_pid) { \ linux_msg(td, "syscall %s not implemented", #s); \ + LIN_SDT_PROBE0(dummy, s, not_implemented); \ pid = td->td_proc->p_pid; \ }; \ + \ + LIN_SDT_PROBE1(dummy, s, return, ENOSYS); \ return (ENOSYS); \ } \ struct __hack diff --git a/sys/compat/linux/stats_timing.d b/sys/compat/linux/stats_timing.d new file mode 100644 index 00000000000..d0b6f73c654 --- /dev/null +++ b/sys/compat/linux/stats_timing.d @@ -0,0 +1,94 @@ +#!/usr/sbin/dtrace -qs + +/*- + * Copyright (c) 2008-2012 Alexander Leidinger + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/** + * Some statistics (all per provider): + * - number of calls to a function per executable binary (not per PID!) + * - allows to see where an optimization would be beneficial for a given + * application + * - graph of CPU time spend in functions per executable binary + * - together with the number of calls to this function this allows + * to determine if a kernel optimization would be beneficial / is + * possible for a given application + * - graph of longest running (CPU-time!) function in total + * - may help finding problem cases in the kernel code + * - timing statistics for the emul_lock + * - graph of longest held (CPU-time!) locks + */ + +#pragma D option dynvarsize=32m + +linuxulator*:::entry +{ + self->time[probefunc] = vtimestamp; + @calls[probeprov, execname, probefunc] = count(); +} + +linuxulator*:::return +/self->time[probefunc] != 0/ +{ + this->timediff = self->time[probefunc] - vtimestamp; + + @stats[probeprov, execname, probefunc] = quantize(this->timediff); + @longest[probeprov, probefunc] = max(this->timediff); + + self->time[probefunc] = 0; +} + +linuxulator*:::locked +{ + self->lock[arg0] = vtimestamp; +} + +linuxulator*:::unlock +/self->lock[arg0] != 0/ +{ + this->timediff = self->lock[arg0] - vtimestamp; + + @lockstats[probefunc] = quantize(this->timediff); + @longlock[probefunc] = max(this->timediff); + + self->lock[arg0] = 0; +} + +END +{ + printf("Number of calls per provider/application/kernel function:"); + printa(@calls); + printf("CPU-timing statistics per provider/application/kernel function (in ns):"); + printa(@stats); + printf("Longest running (CPU-time!) functions per provider (in ns):"); + printa(@longest); + printf("Lock CPU-timing statistics:"); + printa(@lockstats); + printf("Longest running (CPU-time!) locks:"); + printa(@longlock); +} + diff --git a/sys/compat/linux/trace_futexes.d b/sys/compat/linux/trace_futexes.d new file mode 100644 index 00000000000..bd9dac6b1c5 --- /dev/null +++ b/sys/compat/linux/trace_futexes.d @@ -0,0 +1,182 @@ +#!/usr/sbin/dtrace -qs + +/*- + * Copyright (c) 2011-2012 Alexander Leidinger + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/** + * Trace futex operations: + * - internal locks + * - size of the futex list + * - report error conditions (emulation errors, kernel errors, + * programming errors) + * - execution time (wallclock) of futex related functions + */ + +#pragma D option specsize=32m + +/* Error conditions */ +linuxulator*:futex:futex_get:error, +linuxulator*:futex:futex_sleep:requeue_error, +linuxulator*:futex:futex_sleep:sleep_error, +linuxulator*:futex:futex_wait:copyin_error, +linuxulator*:futex:futex_wait:itimerfix_error, +linuxulator*:futex:futex_wait:sleep_error, +linuxulator*:futex:futex_atomic_op:missing_access_check, +linuxulator*:futex:futex_atomic_op:unimplemented_op, +linuxulator*:futex:futex_atomic_op:unimplemented_cmp, +linuxulator*:futex:linux_sys_futex:unimplemented_clockswitch, +linuxulator*:futex:linux_sys_futex:copyin_error, +linuxulator*:futex:linux_sys_futex:unhandled_efault, +linuxulator*:futex:linux_sys_futex:unimplemented_lock_pi, +linuxulator*:futex:linux_sys_futex:unimplemented_unlock_pi, +linuxulator*:futex:linux_sys_futex:unimplemented_trylock_pi, +linuxulator*:futex:linux_sys_futex:unimplemented_wait_requeue_pi, +linuxulator*:futex:linux_sys_futex:unimplemented_cmp_requeue_pi, +linuxulator*:futex:linux_sys_futex:unknown_operation, +linuxulator*:futex:linux_get_robust_list:copyout_error, +linuxulator*:futex:handle_futex_death:copyin_error, +linuxulator*:futex:fetch_robust_entry:copyin_error, +linuxulator*:futex:release_futexes:copyin_error +{ + printf("ERROR: %s in %s:%s:%s\n", probename, probeprov, probemod, + probefunc); + stack(); + ustack(); +} + +linuxulator*:futex:linux_sys_futex:invalid_cmp_requeue_use, +linuxulator*:futex:linux_sys_futex:deprecated_requeue, +linuxulator*:futex:linux_set_robust_list:size_error +{ + printf("WARNING: %s:%s:%s:%s in application %s, maybe an application error?\n", + probename, probeprov, probemod, probefunc, execname); + stack(); + ustack(); +} + + +/* Per futex checks/statistics */ + +linuxulator*:futex:futex:create +{ + ++futex_count; + @max_futexes = max(futex_count); +} + +linuxulator*:futex:futex:destroy +/futex_count == 0/ +{ + printf("ERROR: Request to destroy a futex which was not created,\n"); + printf(" or this script was started after some futexes where\n"); + printf(" created. Stack trace:\n"); + stack(); + ustack(); +} + +linuxulator*:futex:futex:destroy +{ + --futex_count; +} + + +/* Internal locks */ + +linuxulator*:locks:futex_mtx:locked +{ + ++check[probefunc, arg0]; + @stats[probefunc] = count(); + + ts[probefunc] = timestamp; + spec[probefunc] = speculation(); + printf("Stacktrace of last lock operation of the %s:\n", probefunc); + stack(); +} + +linuxulator*:locks:futex_mtx:unlock +/check[probefunc, arg0] == 0/ +{ + printf("ERROR: unlock attemt of unlocked %s (%p),", probefunc, arg0); + printf(" missing SDT probe in kernel, or dtrace program started"); + printf(" while the %s was already held (race condition).", probefunc); + printf(" Stack trace follows:"); + stack(); +} + +linuxulator*:locks:futex_mtx:unlock +{ + discard(spec[probefunc]); + spec[probefunc] = 0; + --check[probefunc, arg0]; +} + +/* Timeout handling for internal locks */ + +tick-10s +/spec["futex_mtx"] != 0 && timestamp - ts["futex_mtx"] >= 9999999000/ +{ + commit(spec["futex_mtx"]); + spec["futex_mtx"] = 0; +} + + +/* Timing statistings */ + +linuxulator*:futex::entry +{ + self->time[probefunc] = timestamp; + @calls[probeprov, execname, probefunc] = count(); +} + +linuxulator*:futex::return +/self->time[probefunc] != 0/ +{ + this->timediff = self->time[probefunc] - timestamp; + + @timestats[probeprov, execname, probefunc] = quantize(this->timediff); + @longest[probeprov, probefunc] = max(this->timediff); + + self->time[probefunc] = 0; +} + + +/* Statistics */ + +END +{ + printf("Number of locks per type:"); + printa(@stats); + printf("Number of maximum number of futexes in the futex list:"); + printa(@max_futexes); + printf("Number of futexes still existing: %d", futex_count); + printf("Number of calls per provider/application/kernel function:"); + printa(@calls); + printf("Wallclock-timing statistics per provider/application/kernel function (in ns):"); + printa(@timestats); + printf("Longest running (wallclock!) functions per provider (in ns):"); + printa(@longest); +} diff --git a/sys/compat/ndis/subr_ntoskrnl.c b/sys/compat/ndis/subr_ntoskrnl.c index 863e35e02f1..02e8e45b173 100644 --- a/sys/compat/ndis/subr_ntoskrnl.c +++ b/sys/compat/ndis/subr_ntoskrnl.c @@ -3591,6 +3591,7 @@ DbgPrint(char *fmt, ...) if (bootverbose) { va_start(ap, fmt); vprintf(fmt, ap); + va_end(ap); } return (STATUS_SUCCESS); diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 889c53258e0..895a301d87b 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -545,6 +545,8 @@ options INET6 #IPv6 communications protocols options ROUTETABLES=2 # max 16. 1 is back compatible. +options TCP_OFFLOAD # TCP offload support. + # In order to enable IPSEC you MUST also add device crypto to # your kernel configuration options IPSEC #IP security (requires device crypto) @@ -1295,7 +1297,7 @@ device ch #SCSI media changers device da #SCSI direct access devices (aka disks) device sa #SCSI tapes device cd #SCSI CD-ROMs -device ses #SCSI Environmental Services (and SAF-TE) +device ses #Enclosure Services (SES and SAF-TE) device pt #SCSI processor device targ #SCSI Target Mode Code device targbh #SCSI Target Mode Blackhole Device @@ -1305,14 +1307,13 @@ device ctl #CAM Target Layer # CAM OPTIONS: # debugging options: -# -- NOTE -- If you specify one of the bus/target/lun options, you must -# specify them all! -# CAMDEBUG: When defined enables debugging macros -# CAM_DEBUG_BUS: Debug the given bus. Use -1 to debug all busses. -# CAM_DEBUG_TARGET: Debug the given target. Use -1 to debug all targets. -# CAM_DEBUG_LUN: Debug the given lun. Use -1 to debug all luns. -# CAM_DEBUG_FLAGS: OR together CAM_DEBUG_INFO, CAM_DEBUG_TRACE, -# CAM_DEBUG_SUBTRACE, and CAM_DEBUG_CDB +# CAMDEBUG Compile in all possible debugging. +# CAM_DEBUG_COMPILE Debug levels to compile in. +# CAM_DEBUG_FLAGS Debug levels to enable on boot. +# CAM_DEBUG_BUS Limit debugging to the given bus. +# CAM_DEBUG_TARGET Limit debugging to the given target. +# CAM_DEBUG_LUN Limit debugging to the given lun. +# CAM_DEBUG_DELAY Delay in us after printing each debug line. # # CAM_MAX_HIGHPOWER: Maximum number of concurrent high power (start unit) cmds # SCSI_NO_SENSE_STRINGS: When defined disables sense descriptions @@ -1323,10 +1324,12 @@ device ctl #CAM Target Layer # can be changed at boot and runtime with the # kern.cam.scsi_delay tunable/sysctl. options CAMDEBUG +options CAM_DEBUG_COMPILE=-1 +options CAM_DEBUG_FLAGS=(CAM_DEBUG_INFO|CAM_DEBUG_PROBE|CAM_DEBUG_PERIPH) options CAM_DEBUG_BUS=-1 options CAM_DEBUG_TARGET=-1 options CAM_DEBUG_LUN=-1 -options CAM_DEBUG_FLAGS=(CAM_DEBUG_INFO|CAM_DEBUG_TRACE|CAM_DEBUG_CDB) +options CAM_DEBUG_DELAY=1 options CAM_MAX_HIGHPOWER=4 options SCSI_NO_SENSE_STRINGS options SCSI_NO_OP_STRINGS @@ -1603,7 +1606,7 @@ options ISP_TARGET_MODE=1 # # ISP_INTERNAL_TARGET (trivial internal disk target, for testing) # -options ISP_DEFAULT_ROLES=2 +options ISP_DEFAULT_ROLES=0 # Options used in dev/sym/ (Symbios SCSI driver). #options SYM_SETUP_LP_PROBE_MAP #-Low Priority Probe Map (bits) diff --git a/sys/conf/files b/sys/conf/files index ecabaa873c5..2a569b2c9a3 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -134,7 +134,9 @@ cam/scsi/scsi_low_pisa.c optional ct | ncv | nsp | stg cam/scsi/scsi_pass.c optional pass cam/scsi/scsi_pt.c optional pt cam/scsi/scsi_sa.c optional sa -cam/scsi/scsi_ses.c optional ses +cam/scsi/scsi_enc.c optional ses +cam/scsi/scsi_enc_ses.c optional ses +cam/scsi/scsi_enc_safte.c optional ses cam/scsi/scsi_sg.c optional sg cam/scsi/scsi_targ_bh.c optional targbh cam/scsi/scsi_target.c optional targ @@ -159,9 +161,11 @@ cddl/compat/opensolaris/kern/opensolaris_vfs.c optional zfs compile-with "${Z cddl/compat/opensolaris/kern/opensolaris_zone.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/common/acl/acl_common.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/common/avl/avl.c optional zfs compile-with "${ZFS_C}" +cddl/contrib/opensolaris/common/nvpair/fnvpair.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/common/nvpair/nvpair.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/common/nvpair/nvpair_alloc_fixed.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/common/unicode/u8_textprep.c optional zfs compile-with "${ZFS_C}" +cddl/contrib/opensolaris/common/zfs/zfeature_common.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/common/zfs/zfs_comutil.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/common/zfs/zfs_deleg.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/common/zfs/zfs_fletcher.c optional zfs compile-with "${ZFS_C}" @@ -175,6 +179,7 @@ cddl/contrib/opensolaris/uts/common/fs/vnode.c optional zfs compile-with "${Z cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/uts/common/fs/zfs/bplist.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/uts/common/fs/zfs/bpobj.c optional zfs compile-with "${ZFS_C}" +cddl/contrib/opensolaris/uts/common/fs/zfs/bptree.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/uts/common/fs/zfs/ddt.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/uts/common/fs/zfs/ddt_zap.c optional zfs compile-with "${ZFS_C}" @@ -226,6 +231,7 @@ cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_root.c optional zfs compile-wi cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/uts/common/fs/zfs/zap_leaf.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/uts/common/fs/zfs/zap_micro.c optional zfs compile-with "${ZFS_C}" +cddl/contrib/opensolaris/uts/common/fs/zfs/zfeature.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_byteswap.c optional zfs compile-with "${ZFS_C}" cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c optional zfs compile-with "${ZFS_C}" @@ -570,6 +576,7 @@ dev/aac/aac_linux.c optional aac compat_linux dev/aac/aac_pci.c optional aac pci dev/acpi_support/acpi_wmi.c optional acpi_wmi acpi dev/acpi_support/acpi_asus.c optional acpi_asus acpi +dev/acpi_support/acpi_asus_wmi.c optional acpi_asus_wmi acpi dev/acpi_support/acpi_fujitsu.c optional acpi_fujitsu acpi dev/acpi_support/acpi_hp.c optional acpi_hp acpi dev/acpi_support/acpi_ibm.c optional acpi_ibm acpi @@ -710,6 +717,8 @@ dev/ath/if_ath_ahb.c optional ath_ahb \ # dev/ath/if_ath.c optional ath \ compile-with "${NORMAL_C} -I$S/dev/ath" +dev/ath/if_ath_beacon.c optional ath \ + compile-with "${NORMAL_C} -I$S/dev/ath" dev/ath/if_ath_debug.c optional ath \ compile-with "${NORMAL_C} -I$S/dev/ath" dev/ath/if_ath_keycache.c optional ath \ @@ -720,8 +729,14 @@ dev/ath/if_ath_tx.c optional ath \ compile-with "${NORMAL_C} -I$S/dev/ath" dev/ath/if_ath_tx_ht.c optional ath \ compile-with "${NORMAL_C} -I$S/dev/ath" +dev/ath/if_ath_tdma.c optional ath \ + compile-with "${NORMAL_C} -I$S/dev/ath" dev/ath/if_ath_sysctl.c optional ath \ compile-with "${NORMAL_C} -I$S/dev/ath" +dev/ath/if_ath_rx.c optional ath \ + compile-with "${NORMAL_C} -I$S/dev/ath" +dev/ath/if_ath_rx_edma.c optional ath \ + compile-with "${NORMAL_C} -I$S/dev/ath" dev/ath/ah_osdep.c optional ath \ compile-with "${NORMAL_C} -I$S/dev/ath" # @@ -1030,8 +1045,6 @@ dev/cs/if_cs_isa.c optional cs isa dev/cs/if_cs_pccard.c optional cs pccard dev/cxgb/cxgb_main.c optional cxgb pci \ compile-with "${NORMAL_C} -I$S/dev/cxgb" -dev/cxgb/cxgb_offload.c optional cxgb pci \ - compile-with "${NORMAL_C} -I$S/dev/cxgb" dev/cxgb/cxgb_sge.c optional cxgb pci \ compile-with "${NORMAL_C} -I$S/dev/cxgb" dev/cxgb/common/cxgb_mc5.c optional cxgb pci \ @@ -1183,6 +1196,8 @@ dev/e1000/e1000_82575.c optional em | igb \ compile-with "${NORMAL_C} -I$S/dev/e1000" dev/e1000/e1000_ich8lan.c optional em | igb \ compile-with "${NORMAL_C} -I$S/dev/e1000" +dev/e1000/e1000_i210.c optional em | igb \ + compile-with "${NORMAL_C} -I$S/dev/e1000" dev/e1000/e1000_api.c optional em | igb \ compile-with "${NORMAL_C} -I$S/dev/e1000" dev/e1000/e1000_mac.c optional em | igb \ @@ -1217,6 +1232,7 @@ dev/fatm/if_fatm.c optional fatm pci dev/fb/splash.c optional splash dev/fdt/fdt_common.c optional fdt dev/fdt/fdt_pci.c optional fdt pci +dev/fdt/fdt_slicer.c optional fdt cfi | fdt nand dev/fdt/fdt_static_dtb.S optional fdt fdt_dtb_static dev/fdt/fdtbus.c optional fdt dev/fdt/simplebus.c optional fdt @@ -1513,7 +1529,7 @@ dev/ixgb/if_ixgb.c optional ixgb dev/ixgb/ixgb_ee.c optional ixgb dev/ixgb/ixgb_hw.c optional ixgb dev/ixgbe/ixgbe.c optional ixgbe inet \ - compile-with "${NORMAL_C} -I$S/dev/ixgbe" + compile-with "${NORMAL_C} -I$S/dev/ixgbe -DSMP -DIXGBE_FDIR" dev/ixgbe/ixv.c optional ixgbe inet \ compile-with "${NORMAL_C} -I$S/dev/ixgbe" dev/ixgbe/ixgbe_phy.c optional ixgbe inet \ @@ -1660,6 +1676,21 @@ dev/mxge/mxge_ethp_z8e.c optional mxge pci dev/mxge/mxge_rss_eth_z8e.c optional mxge pci dev/mxge/mxge_rss_ethp_z8e.c optional mxge pci dev/my/if_my.c optional my +dev/nand/nand.c optional nand +dev/nand/nand_bbt.c optional nand +dev/nand/nand_cdev.c optional nand +dev/nand/nand_generic.c optional nand +dev/nand/nand_geom.c optional nand +dev/nand/nand_id.c optional nand +dev/nand/nandbus.c optional nand +dev/nand/nandbus_if.m optional nand +dev/nand/nand_if.m optional nand +dev/nand/nandsim.c optional nandsim nand +dev/nand/nandsim_chip.c optional nandsim nand +dev/nand/nandsim_ctrl.c optional nandsim nand +dev/nand/nandsim_log.c optional nandsim nand +dev/nand/nandsim_swap.c optional nandsim nand +dev/nand/nfc_if.m optional nand dev/ncv/ncr53c500.c optional ncv dev/ncv/ncr53c500_pccard.c optional ncv pccard dev/netmap/netmap.c optional netmap @@ -1759,6 +1790,7 @@ dev/puc/pucdata.c optional puc pci dev/quicc/quicc_core.c optional quicc dev/ral/rt2560.c optional ral dev/ral/rt2661.c optional ral +dev/ral/rt2860.c optional ral dev/ral/if_ral_pci.c optional ral pci rt2561fw.c optional rt2561fw | ralfw \ compile-with "${AWK} -f $S/tools/fw_stub.awk rt2561.fw:rt2561fw -mrt2561 -c${.TARGET}" \ @@ -2251,6 +2283,20 @@ fs/msdosfs/msdosfs_iconv.c optional msdosfs_iconv fs/msdosfs/msdosfs_lookup.c optional msdosfs fs/msdosfs/msdosfs_vfsops.c optional msdosfs fs/msdosfs/msdosfs_vnops.c optional msdosfs +fs/nandfs/bmap.c optional nandfs +fs/nandfs/nandfs_alloc.c optional nandfs +fs/nandfs/nandfs_bmap.c optional nandfs +fs/nandfs/nandfs_buffer.c optional nandfs +fs/nandfs/nandfs_cleaner.c optional nandfs +fs/nandfs/nandfs_cpfile.c optional nandfs +fs/nandfs/nandfs_dat.c optional nandfs +fs/nandfs/nandfs_dir.c optional nandfs +fs/nandfs/nandfs_ifile.c optional nandfs +fs/nandfs/nandfs_segment.c optional nandfs +fs/nandfs/nandfs_subr.c optional nandfs +fs/nandfs/nandfs_sufile.c optional nandfs +fs/nandfs/nandfs_vfsops.c optional nandfs +fs/nandfs/nandfs_vnops.c optional nandfs fs/nfs/nfs_commonkrpc.c optional nfscl | nfsd fs/nfs/nfs_commonsubs.c optional nfscl | nfsd fs/nfs/nfs_commonport.c optional nfscl | nfsd @@ -2352,6 +2398,7 @@ geom/geom_disk.c standard geom/geom_dump.c standard geom/geom_event.c standard geom/geom_fox.c optional geom_fox +geom/geom_flashmap.c optional fdt cfi | fdt nand geom/geom_io.c standard geom/geom_kern.c standard geom/geom_map.c optional geom_map @@ -2396,6 +2443,7 @@ geom/raid/g_raid.c optional geom_raid geom/raid/g_raid_ctl.c optional geom_raid geom/raid/g_raid_md_if.m optional geom_raid geom/raid/g_raid_tr_if.m optional geom_raid +geom/raid/md_ddf.c optional geom_raid geom/raid/md_intel.c optional geom_raid geom/raid/md_jmicron.c optional geom_raid geom/raid/md_nvidia.c optional geom_raid @@ -2521,12 +2569,14 @@ kern/kern_priv.c standard kern/kern_proc.c standard kern/kern_prot.c standard kern/kern_racct.c standard +kern/kern_rangelock.c standard kern/kern_rctl.c standard kern/kern_resource.c standard kern/kern_rmlock.c standard kern/kern_rwlock.c standard kern/kern_sdt.c optional kdtrace_hooks kern/kern_sema.c standard +kern/kern_sharedpage.c standard kern/kern_shutdown.c standard kern/kern_sig.c standard kern/kern_switch.c standard @@ -2553,7 +2603,7 @@ kern/sched_ule.c optional sched_ule kern/serdev_if.m standard kern/stack_protector.c standard \ compile-with "${NORMAL_C:N-fstack-protector*}" -kern/subr_acl_nfs4.c optional ufs_acl +kern/subr_acl_nfs4.c optional ufs_acl | zfs kern/subr_acl_posix1e.c optional ufs_acl kern/subr_autoconf.c standard kern/subr_blist.c standard @@ -2995,7 +3045,7 @@ netinet/tcp_hostcache.c optional inet | inet6 netinet/tcp_input.c optional inet | inet6 netinet/tcp_lro.c optional inet | inet6 netinet/tcp_output.c optional inet | inet6 -netinet/tcp_offload.c optional inet | inet6 +netinet/tcp_offload.c optional tcp_offload inet | tcp_offload inet6 netinet/tcp_reass.c optional inet | inet6 netinet/tcp_sack.c optional inet | inet6 netinet/tcp_subr.c optional inet | inet6 @@ -3682,3 +3732,20 @@ dev/xen/netback/netback.c optional xen | xenhvm dev/xen/netfront/netfront.c optional xen | xenhvm dev/xen/xenpci/xenpci.c optional xenpci dev/xen/xenpci/evtchn.c optional xenpci + +dev/etherswitch/mdio_if.m optional miiproxy +dev/etherswitch/mdio.c optional miiproxy +dev/etherswitch/miiproxy.c optional miiproxy + +dev/etherswitch/etherswitch.c optional etherswitch +dev/etherswitch/etherswitch_if.m optional etherswitch + +dev/etherswitch/rtl8366/rtl8366rb.c optional rtl8366rb + +dev/etherswitch/arswitch/arswitch.c optional arswitch +dev/etherswitch/arswitch/arswitch_reg.c optional arswitch +dev/etherswitch/arswitch/arswitch_phy.c optional arswitch +dev/etherswitch/arswitch/arswitch_8216.c optional arswitch +dev/etherswitch/arswitch/arswitch_8226.c optional arswitch +dev/etherswitch/arswitch/arswitch_8316.c optional arswitch +dev/etherswitch/arswitch/arswitch_7240.c optional arswitch diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64 index 1769a176a53..d0f2745043f 100644 --- a/sys/conf/files.amd64 +++ b/sys/conf/files.amd64 @@ -72,7 +72,6 @@ hptrr_lib.o optional hptrr \ no-implicit-rule # amd64/acpica/acpi_machdep.c optional acpi -amd64/acpica/acpi_switch.S optional acpi acpi_wakecode.o optional acpi \ dependency "$S/amd64/acpica/acpi_wakecode.S assym.s" \ compile-with "${NORMAL_S}" \ @@ -94,7 +93,6 @@ acpi_wakedata.h optional acpi \ no-obj no-implicit-rule before-depend \ clean "acpi_wakedata.h" # -amd64/acpica/acpi_wakeup.c optional acpi amd64/amd64/amd64_mem.c optional mem #amd64/amd64/apic_vector.S standard amd64/amd64/atomic.c standard @@ -459,6 +457,7 @@ dev/bvm/bvm_dbg.c optional bvmdebug # x86/acpica/OsdEnvironment.c optional acpi x86/acpica/acpi_apm.c optional acpi +x86/acpica/acpi_wakeup.c optional acpi x86/acpica/madt.c optional acpi x86/acpica/srat.c optional acpi x86/bios/smbios.c optional smbios diff --git a/sys/conf/files.arm b/sys/conf/files.arm index 5469c6b8d0e..d597296d849 100644 --- a/sys/conf/files.arm +++ b/sys/conf/files.arm @@ -78,3 +78,10 @@ libkern/umoddi3.c standard #XXX: We can't use these versions, as strcmp.c is included conf/files #libkern/arm/strcmp.S standard #libkern/arm/strncmp.S standard +# +kern/subr_dummy_vdso_tc.c standard +board_id.h standard \ + dependency "$S/arm/conf/genboardid.awk $S/arm/conf/mach-types" \ + compile-with "${AWK} -f $S/arm/conf/genboardid.awk $S/arm/conf/mach-types > board_id.h" \ + no-obj no-implicit-rule before-depend \ + clean "board_id.h" diff --git a/sys/conf/files.i386 b/sys/conf/files.i386 index 668850af251..f3de1637242 100644 --- a/sys/conf/files.i386 +++ b/sys/conf/files.i386 @@ -381,7 +381,6 @@ acpi_wakedata.h optional acpi \ no-obj no-implicit-rule before-depend \ clean "acpi_wakedata.h" # -i386/acpica/acpi_wakeup.c optional acpi i386/bios/apm.c optional apm i386/bios/mca_machdep.c optional mca i386/bios/smapi.c optional smapi @@ -505,6 +504,7 @@ compat/x86bios/x86bios.c optional x86bios | atkbd | dpms | vesa # x86/acpica/OsdEnvironment.c optional acpi x86/acpica/acpi_apm.c optional acpi +x86/acpica/acpi_wakeup.c optional acpi x86/acpica/madt.c optional acpi apic x86/acpica/srat.c optional acpi x86/bios/smbios.c optional smbios diff --git a/sys/conf/files.ia64 b/sys/conf/files.ia64 index f9a62afbacb..42fb98d4259 100644 --- a/sys/conf/files.ia64 +++ b/sys/conf/files.ia64 @@ -98,6 +98,7 @@ ia64/ia64/mp_machdep.c optional smp ia64/ia64/nexus.c standard ia64/ia64/pal.S standard ia64/ia64/physical.S standard +ia64/ia64/physmem.c standard ia64/ia64/pmap.c standard ia64/ia64/ptrace_machdep.c standard ia64/ia64/sal.c standard @@ -138,3 +139,4 @@ libkern/ia64/bswap16.S standard libkern/ia64/bswap32.S standard libkern/memmove.c standard libkern/memset.c standard +kern/subr_dummy_vdso_tc.c standard diff --git a/sys/conf/files.mips b/sys/conf/files.mips index 2ae3bc93805..a7d650be3d5 100644 --- a/sys/conf/files.mips +++ b/sys/conf/files.mips @@ -91,6 +91,7 @@ compat/freebsd32/freebsd32_misc.c optional compat_freebsd32 compat/freebsd32/freebsd32_syscalls.c optional compat_freebsd32 compat/freebsd32/freebsd32_sysent.c optional compat_freebsd32 kern/imgact_elf32.c optional compat_freebsd32 +kern/subr_dummy_vdso_tc.c standard mips/mips/freebsd32_machdep.c optional compat_freebsd32 kern/kern_clocksource.c standard diff --git a/sys/conf/files.powerpc b/sys/conf/files.powerpc index 5d9dec5ffd1..8484b2bb8ba 100644 --- a/sys/conf/files.powerpc +++ b/sys/conf/files.powerpc @@ -35,6 +35,7 @@ dev/iicbus/ad7417.c optional ad7417 powermac dev/iicbus/ds1775.c optional ds1775 powermac dev/iicbus/max6690.c optional max6690 powermac dev/kbd/kbd.c optional sc +dev/nand/nfc_fsl.c optional nand mpc85xx dev/ofw/openfirm.c optional aim | fdt dev/ofw/openfirmio.c optional aim | fdt dev/ofw/ofw_bus_if.m optional aim | fdt @@ -61,6 +62,7 @@ dev/tsec/if_tsec.c optional tsec dev/tsec/if_tsec_fdt.c optional tsec fdt dev/uart/uart_cpu_powerpc.c optional uart aim kern/kern_clocksource.c standard +kern/subr_dummy_vdso_tc.c standard kern/syscalls.c optional ktr libkern/ashldi3.c optional powerpc libkern/ashrdi3.c optional powerpc @@ -97,17 +99,18 @@ powerpc/aim/swtch64.S optional aim powerpc64 powerpc/aim/trap.c optional aim powerpc/aim/uma_machdep.c optional aim powerpc/aim/vm_machdep.c optional aim -powerpc/booke/clock.c optional e500 -powerpc/booke/copyinout.c optional e500 -powerpc/booke/interrupt.c optional e500 -powerpc/booke/locore.S optional e500 no-obj -powerpc/booke/machdep.c optional e500 -powerpc/booke/mp_cpudep.c optional e500 smp +powerpc/booke/clock.c optional booke +powerpc/booke/copyinout.c optional booke +powerpc/booke/interrupt.c optional booke +powerpc/booke/locore.S optional booke no-obj +powerpc/booke/machdep.c optional booke +powerpc/booke/machdep_e500.c optional booke_e500 +powerpc/booke/mp_cpudep.c optional booke smp powerpc/booke/platform_bare.c optional mpc85xx -powerpc/booke/pmap.c optional e500 -powerpc/booke/swtch.S optional e500 -powerpc/booke/trap.c optional e500 -powerpc/booke/vm_machdep.c optional e500 +powerpc/booke/pmap.c optional booke +powerpc/booke/swtch.S optional booke +powerpc/booke/trap.c optional booke +powerpc/booke/vm_machdep.c optional booke powerpc/cpufreq/dfs.c optional cpufreq powerpc/cpufreq/pcr.c optional cpufreq aim powerpc/fpu/fpu_add.c optional fpu_emu powerpc @@ -132,7 +135,6 @@ powerpc/mpc85xx/isa.c optional mpc85xx isa powerpc/mpc85xx/lbc.c optional mpc85xx powerpc/mpc85xx/mpc85xx.c optional mpc85xx powerpc/mpc85xx/nexus.c optional mpc85xx -powerpc/mpc85xx/openpic_fdt.c optional fdt powerpc/mpc85xx/pci_fdt.c optional pci mpc85xx powerpc/ofw/ofw_cpu.c optional aim powerpc/ofw/ofw_machdep.c optional aim @@ -194,6 +196,7 @@ powerpc/powerpc/mem.c optional mem powerpc/powerpc/mmu_if.m standard powerpc/powerpc/mp_machdep.c optional smp powerpc/powerpc/openpic.c standard +powerpc/powerpc/openpic_fdt.c optional fdt powerpc/powerpc/pic_if.m standard powerpc/powerpc/pmap_dispatch.c standard powerpc/powerpc/platform.c standard diff --git a/sys/conf/files.sparc64 b/sys/conf/files.sparc64 index 68c04135731..2907dd0408c 100644 --- a/sys/conf/files.sparc64 +++ b/sys/conf/files.sparc64 @@ -61,6 +61,7 @@ dev/syscons/scvtb.c optional sc dev/uart/uart_cpu_sparc64.c optional uart dev/uart/uart_kbd_sun.c optional uart sc kern/kern_clocksource.c standard +kern/subr_dummy_vdso_tc.c standard kern/syscalls.c optional ktr libkern/ffs.c standard libkern/ffsl.c standard diff --git a/sys/conf/kern.post.mk b/sys/conf/kern.post.mk index 5f878d85e54..d6aa2c54947 100644 --- a/sys/conf/kern.post.mk +++ b/sys/conf/kern.post.mk @@ -36,13 +36,44 @@ modules-${target}: .endif .endfor -# Handle out of tree ports +# Handle ports (as defined by the user) that build kernel modules .if !defined(NO_MODULES) && defined(PORTS_MODULES) -PORTSMODULESENV=SYSDIR=${SYSDIR} -.for __target in all install reinstall clean +# +# The ports tree needs some environment variables defined to match the new kernel +# +# Ports search for some dependencies in PATH, so add the location of the installed files +LOCALBASE?= /usr/local +# SRC_BASE is how the ports tree refers to the location of the base source files +.if !defined(SRC_BASE) +SRC_BASE!= realpath "${SYSDIR:H}/" +.endif +# OSVERSION is used by some ports to determine build options +.if !defined(OSRELDATE) +# Definition copied from src/Makefile.inc1 +OSRELDATE!= awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \ + ${MAKEOBJDIRPREFIX}${SRC_BASE}/include/osreldate.h +.endif +# Keep the related ports builds in the obj directory so that they are only rebuilt once per kernel build +WRKDIRPREFIX?= ${MAKEOBJDIRPREFIX}${SRC_BASE}/sys/${KERNCONF} +PORTSMODULESENV=\ + PATH=${PATH}:${LOCALBASE}/bin:${LOCALBASE}/sbin \ + SRC_BASE=${SRC_BASE} \ + OSVERSION=${OSRELDATE} \ + WRKDIRPREFIX=${WRKDIRPREFIX} + +# The WRKDIR needs to be cleaned before building, and trying to change the target +# with a :C pattern below results in install -> instclean +all: +.for __i in ${PORTS_MODULES} + @${ECHO} "===> Ports module ${__i} (all)" + cd $${PORTSDIR:-/usr/ports}/${__i}; ${PORTSMODULESENV} ${MAKE} -B clean all +.endfor + +.for __target in install reinstall clean ${__target}: ports-${__target} ports-${__target}: .for __i in ${PORTS_MODULES} + @${ECHO} "===> Ports module ${__i} (${__target})" cd $${PORTSDIR:-/usr/ports}/${__i}; ${PORTSMODULESENV} ${MAKE} -B ${__target:C/install/deinstall reinstall/:C/reinstall/deinstall reinstall/} .endfor .endfor @@ -239,8 +270,7 @@ kernel-install: .endif mkdir -p ${DESTDIR}${KODIR} ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_KO} ${DESTDIR}${KODIR} -.if defined(DEBUG) && !defined(INSTALL_NODEBUG) && \ - (defined(MK_KERNEL_SYMBOLS) && ${MK_KERNEL_SYMBOLS} != "no") +.if defined(DEBUG) && !defined(INSTALL_NODEBUG) && ${MK_KERNEL_SYMBOLS} != "no" ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_KO}.symbols ${DESTDIR}${KODIR} .endif .if defined(KERNEL_EXTRA_INSTALL) @@ -252,8 +282,7 @@ kernel-install: kernel-reinstall: @-chflags -R noschg ${DESTDIR}${KODIR} ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_KO} ${DESTDIR}${KODIR} -.if defined(DEBUG) && !defined(INSTALL_NODEBUG) && \ - (defined(MK_KERNEL_SYMBOLS) && ${MK_KERNEL_SYMBOLS} != "no") +.if defined(DEBUG) && !defined(INSTALL_NODEBUG) && ${MK_KERNEL_SYMBOLS} != "no" ${INSTALL} -p -m 555 -o ${KMODOWN} -g ${KMODGRP} ${KERNEL_KO}.symbols ${DESTDIR}${KODIR} .endif diff --git a/sys/conf/kmod.mk b/sys/conf/kmod.mk index 929cec6806f..ffa52c9277a 100644 --- a/sys/conf/kmod.mk +++ b/sys/conf/kmod.mk @@ -283,8 +283,7 @@ realinstall: _kmodinstall _kmodinstall: ${INSTALL} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \ ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${KMODDIR} -.if defined(DEBUG_FLAGS) && !defined(INSTALL_NODEBUG) && \ - (defined(MK_KERNEL_SYMBOLS) && ${MK_KERNEL_SYMBOLS} != "no") +.if defined(DEBUG_FLAGS) && !defined(INSTALL_NODEBUG) && ${MK_KERNEL_SYMBOLS} != "no" ${INSTALL} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \ ${_INSTALLFLAGS} ${PROG}.symbols ${DESTDIR}${KMODDIR} .endif @@ -354,7 +353,7 @@ MFILES?= dev/acpica/acpi_if.m dev/acpi_support/acpi_wmi_if.m \ kern/bus_if.m kern/clock_if.m \ kern/cpufreq_if.m kern/device_if.m kern/serdev_if.m \ libkern/iconv_converter_if.m opencrypto/cryptodev_if.m \ - pc98/pc98/canbus_if.m + pc98/pc98/canbus_if.m dev/etherswitch/mdio_if.m .for _srcsrc in ${MFILES} .for _ext in c h diff --git a/sys/conf/options b/sys/conf/options index 4c959676119..259f2d322bf 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -213,6 +213,7 @@ FDESCFS opt_dontuse.h FFS opt_dontuse.h HPFS opt_dontuse.h MSDOSFS opt_dontuse.h +NANDFS opt_dontuse.h NTFS opt_dontuse.h NULLFS opt_dontuse.h NWFS opt_dontuse.h @@ -305,6 +306,7 @@ MAXSSIZ opt_param.h # Generic SCSI options. CAM_MAX_HIGHPOWER opt_cam.h CAMDEBUG opt_cam.h +CAM_DEBUG_COMPILE opt_cam.h CAM_DEBUG_DELAY opt_cam.h CAM_DEBUG_BUS opt_cam.h CAM_DEBUG_TARGET opt_cam.h @@ -432,7 +434,7 @@ RADIX_MPATH opt_mpath.h ROUTETABLES opt_route.h SLIP_IFF_OPTS opt_slip.h TCPDEBUG -TCP_OFFLOAD_DISABLE opt_inet.h #Disable code to dispatch tcp offloading +TCP_OFFLOAD opt_inet.h # Enable code to dispatch TCP offloading TCP_SIGNATURE opt_inet.h VLAN_ARRAY opt_vlan.h XBONEHACK @@ -781,6 +783,7 @@ ATH_TX99_DIAG opt_ath.h ATH_ENABLE_11N opt_ath.h ATH_ENABLE_DFS opt_ath.h ATH_EEPROM_FIRMWARE opt_ath.h +ATH_ENABLE_RADIOTAP_VENDOR_EXT opt_ath.h # options for the Atheros hal AH_SUPPORT_AR5416 opt_ah.h diff --git a/sys/conf/options.arm b/sys/conf/options.arm index bbe7f121862..a1cca866793 100644 --- a/sys/conf/options.arm +++ b/sys/conf/options.arm @@ -3,9 +3,8 @@ ARM9_CACHE_WRITE_THROUGH opt_global.h ARM_CACHE_LOCK_ENABLE opt_global.h ARMFPE opt_global.h ARM_KERN_DIRECTMAP opt_vm.h +ARM_MANY_BOARD opt_global.h ARM_USE_SMALL_ALLOC opt_global.h -AT91C_MASTER_CLOCK opt_global.h -AT91C_MAIN_CLOCK opt_at91.h COUNTS_PER_SEC opt_timer.h CPU_SA1100 opt_global.h CPU_SA1110 opt_global.h @@ -18,13 +17,14 @@ CPU_XSCALE_IXP425 opt_global.h CPU_XSCALE_IXP435 opt_global.h CPU_XSCALE_PXA2X0 opt_global.h FLASHADDR opt_global.h +FREEBSD_BOOT_LOADER opt_global.h IXP4XX_FLASH_SIZE opt_global.h KERNPHYSADDR opt_global.h KERNVIRTADDR opt_global.h +LINUX_BOOT_ABI opt_global.h LOADERRAMADDR opt_global.h PHYSADDR opt_global.h QEMU_WORKAROUNDS opt_global.h -SKYEYE_WORKAROUNDS opt_global.h SOC_MV_DISCOVERY opt_global.h SOC_MV_KIRKWOOD opt_global.h SOC_MV_ORION opt_global.h @@ -33,10 +33,8 @@ XSCALE_CACHE_READ_WRITE_ALLOCATE opt_global.h XSACLE_DISABLE_CCNT opt_timer.h VERBOSE_INIT_ARM opt_global.h AT91_ATE_USE_RMII opt_at91.h -AT91_BWCT opt_at91.h -AT91_TSC opt_at91.h -AT91_KWIKBYTE opt_at91.h AT91_MCI_HAS_4WIRE opt_at91.h AT91_MCI_SLOT_B opt_at91.h +AT91C_MAIN_CLOCK opt_at91.h CPU_FA526 opt_global.h CPU_FA626TE opt_global.h diff --git a/sys/conf/options.mips b/sys/conf/options.mips index 237b472495a..71eb414acc9 100644 --- a/sys/conf/options.mips +++ b/sys/conf/options.mips @@ -65,7 +65,8 @@ OCTEON_BOARD_CAPK_0100ND opt_cvmx.h # # Options that control the Atheros SoC peripherals # -ARGE_DEBUG opt_global.h +ARGE_DEBUG opt_arge.h +ARGE_MDIO opt_arge.h # # Options that control the Ralink RT305xF Etherenet MAC. diff --git a/sys/conf/options.powerpc b/sys/conf/options.powerpc index 7e3358e7f6f..f82bb9d89cc 100644 --- a/sys/conf/options.powerpc +++ b/sys/conf/options.powerpc @@ -2,7 +2,9 @@ # Options specific to the powerpc platform kernels AIM opt_global.h -E500 opt_global.h +BOOKE opt_global.h +BOOKE_E500 opt_global.h +BOOKE_PPC4XX opt_global.h CELL POWERPC diff --git a/sys/contrib/dev/acpica/acpica_prep.sh b/sys/contrib/dev/acpica/acpica_prep.sh index e7157ce8222..3cbb12a5bf4 100755 --- a/sys/contrib/dev/acpica/acpica_prep.sh +++ b/sys/contrib/dev/acpica/acpica_prep.sh @@ -10,8 +10,8 @@ if [ ! $# -eq 1 ]; then fi src=$1 -wrk=`realpath ./_acpi_ca_unpack` -dst=`realpath ./acpi_ca_destination` +wrk="$(realpath .)/_acpi_ca_unpack" +dst="$(realpath .)/acpi_ca_destination" # files that should keep their full directory path fulldirs="common compiler components include os_specific" @@ -67,7 +67,8 @@ for H in ${src_headers}; do xargs sed -i "" -e "s|[\"<]$H[\">]|\|g" done for H in ${comp_headers}; do - find ${dst}/common ${dst}/compiler -name "*.[chly]" -type f | \ + find ${dst}/common ${dst}/compiler ${dst}/components \ + -name "*.[chly]" -type f | \ xargs sed -i "" -e "s|[\"<]$H[\">]|\|g" done for H in ${platform_headers}; do diff --git a/sys/contrib/dev/acpica/changes.txt b/sys/contrib/dev/acpica/changes.txt index e55e28628d3..21239371ccd 100644 --- a/sys/contrib/dev/acpica/changes.txt +++ b/sys/contrib/dev/acpica/changes.txt @@ -1,8 +1,134 @@ +---------------------------------------- +20 June 2012. Summary of changes for version 20120620: + +This release is available at https://www.acpica.org/downloads +The ACPI 5.0 specification is available at www.acpi.info + +1) ACPICA Kernel-resident Subsystem: + +Implemented support to expand the "implicit notify" feature to allow multiple +devices to be notified by a single GPE. This feature automatically generates a +runtime device notification in the absence of a BIOS-provided GPE control +method (_Lxx/_Exx) or a host-installed handler for the GPE. Implicit notify is +provided by ACPICA for Windows compatibility, and is a workaround for BIOS AML +code errors. See the description of the AcpiSetupGpeForWake interface in the +APCICA reference. Bob Moore, Rafael Wysocki. ACPICA BZ 918. + +Changed some comments and internal function names to simplify and ensure +correctness of the Linux code translation. No functional changes. + +Example Code and Data Size: These are the sizes for the OS-independent +acpica.lib produced by the Microsoft Visual C++ 9.0 32-bit compiler. The debug +version of the code includes the debug output trace mechanism and has a much +larger code and data size. + + Previous Release: + Non-Debug Version: 93.0K Code, 25.1K Data, 118.1K Total + Debug Version: 172.7K Code, 73.6K Data, 246.3K Total + Current Release: + Non-Debug Version: 93.1K Code, 25.1K Data, 118.2K Total + Debug Version: 172.9K Code, 73.6K Data, 246.5K Total + + +2) iASL Compiler/Disassembler and Tools: + +Disassembler: Added support to emit short, commented descriptions for the ACPI +predefined names in order to improve the readability of the disassembled +output. ACPICA BZ 959. Changes include: + 1) Emit descriptions for all standard predefined names (_INI, _STA, _PRW, +etc.) + 2) Emit generic descriptions for the special names (_Exx, _Qxx, etc.) + 3) Emit descriptions for the resource descriptor names (_MIN, _LEN, etc.) + +AcpiSrc: Fixed several long-standing Linux code translation issues. Argument +descriptions in function headers are now translated properly to lower case and +underscores. ACPICA BZ 961. Also fixes translation problems such as these: +(old -> new) + i_aSL -> iASL + 00-7_f -> 00-7F + 16_k -> 16K + local_fADT -> local_FADT + execute_oSI -> execute_OSI + +iASL: Fixed a problem where null bytes were inadvertently emitted into some +listing files. + +iASL: Added the existing debug options to the standard help screen. There are +no longer two different help screens. ACPICA BZ 957. + +AcpiHelp: Fixed some typos in the various predefined name descriptions. Also +expand some of the descriptions where appropriate. + +iASL: Fixed the -ot option (display compile times/statistics). Was not working +properly for standard output; only worked for the debug file case. + +---------------------------------------- +18 May 2012. Summary of changes for version 20120518: + + +1) ACPICA Core Subsystem: + +Added a new OSL interface, AcpiOsWaitEventsComplete. This interface is defined +to block until asynchronous events such as notifies and GPEs have completed. +Within ACPICA, it is only called before a notify or GPE handler is +removed/uninstalled. It also may be useful for the host OS within related +drivers such as the Embedded Controller driver. See the ACPICA reference for +additional information. ACPICA BZ 868. + +ACPI Tables: Added a new error message for a possible overflow failure during +the conversion of FADT 32-bit legacy register addresses to internal common 64- +bit GAS structure representation. The GAS has a one-byte "bit length" field, +thus limiting the register length to 255 bits. ACPICA BZ 953. + +Example Code and Data Size: These are the sizes for the OS-independent +acpica.lib produced by the Microsoft Visual C++ 9.0 32-bit compiler. The debug +version of the code includes the debug output trace mechanism and has a much +larger code and data size. + + Previous Release: + Non-Debug Version: 92.9K Code, 25.0K Data, 117.9K Total + Debug Version: 172.6K Code, 73.4K Data, 246.0K Total + Current Release: + Non-Debug Version: 93.0K Code, 25.1K Data, 118.1K Total + Debug Version: 172.7K Code, 73.6K Data, 246.3K Total + + +2) iASL Compiler/Disassembler and Tools: + +iASL: Added the ACPI 5.0 "PCC" keyword for use in the Register() ASL macro. +This keyword was added late in the ACPI 5.0 release cycle and was not +implemented until now. + +Disassembler: Added support for Operation Region externals. Adds missing +support for operation regions that are defined in another table, and +referenced locally via a Field or BankField ASL operator. Now generates the +correct External statement. + +Disassembler: Several additional fixes for the External() statement generation +related to some ASL operators. Also, order the External() statements +alphabetically in the disassembler output. Fixes the External() generation for +the Create* field, Alias, and Scope operators: + 1) Create* buffer field operators - fix type mismatch warning on disassembly + 2) Alias - implement missing External support + 3) Scope - fix to make sure all necessary externals are emitted. + +iASL: Improved pathname support. For include files, merge the prefix pathname +with the file pathname and eliminate unnecessary components. Convert +backslashes in all pathnames to forward slashes, for readability. Include file +pathname changes affect both #include and Include() type operators. + +iASL/DTC/Preprocessor: Gracefully handle early EOF. Handle an EOF at the end +of a valid line by inserting a newline and then returning the EOF during the +next call to GetNextLine. Prevents the line from being ignored due to EOF +condition. + +iASL: Implemented some changes to enhance the IDE support (-vi option.) Error +and Warning messages are now correctly recognized for both the source code +browser and the global error and warning counts. + ---------------------------------------- 20 April 2012. Summary of changes for version 20120420: -This release is available at www.acpica.org/downloads. -The ACPI 5.0 specification is available at www.acpi.info. 1) ACPICA Core Subsystem: @@ -68,8 +194,6 @@ several extraneous "unrecognized operator" messages. ---------------------------------------- 20 March 2012. Summary of changes for version 20120320: -This release is available at www.acpica.org/downloads. -The ACPI 5.0 specification is available at www.acpi.info. 1) ACPICA Core Subsystem: @@ -160,8 +284,6 @@ Versions supported: ---------------------------------------- 15 February 2012. Summary of changes for version 20120215: -This release is available at www.acpica.org/downloads. -The ACPI 5.0 specification is available at www.acpi.info. 1) ACPICA Core Subsystem: @@ -252,8 +374,6 @@ specification. ---------------------------------------- 11 January 2012. Summary of changes for version 20120111: -This release is available at www.acpica.org/downloads. -The ACPI 5.0 specification is available at www.acpi.info. 1) ACPICA Core Subsystem: diff --git a/sys/contrib/dev/acpica/common/adfile.c b/sys/contrib/dev/acpica/common/adfile.c index 50ebffd036d..99b032f508e 100644 --- a/sys/contrib/dev/acpica/common/adfile.c +++ b/sys/contrib/dev/acpica/common/adfile.c @@ -298,20 +298,24 @@ FlSplitInputPathname ( return (AE_NO_MEMORY); } - Substring = strrchr (DirectoryPath, '\\'); + /* Convert backslashes to slashes in the entire path */ + + UtConvertBackslashes (DirectoryPath); + + /* Backup to last slash or colon */ + + Substring = strrchr (DirectoryPath, '/'); if (!Substring) { - Substring = strrchr (DirectoryPath, '/'); - if (!Substring) - { - Substring = strrchr (DirectoryPath, ':'); - } + Substring = strrchr (DirectoryPath, ':'); } + /* Extract the simple filename */ + if (!Substring) { + Filename = FlStrdup (DirectoryPath); DirectoryPath[0] = 0; - Filename = FlStrdup (InputPath); } else { @@ -326,7 +330,6 @@ FlSplitInputPathname ( *OutDirectoryPath = DirectoryPath; *OutFilename = Filename; - return (AE_OK); } diff --git a/sys/contrib/dev/acpica/common/adwalk.c b/sys/contrib/dev/acpica/common/adwalk.c index 027366e4727..94ef450892d 100644 --- a/sys/contrib/dev/acpica/common/adwalk.c +++ b/sys/contrib/dev/acpica/common/adwalk.c @@ -521,6 +521,7 @@ AcpiDmFindOrphanDescending ( if ((OpInfo->Class != AML_CLASS_EXECUTE) && (OpInfo->Class != AML_CLASS_CREATE) && + (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) && (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) && !Op->Common.Node) { @@ -743,13 +744,23 @@ AcpiDmXrefDescendingOp ( if (OpInfo->Flags & AML_NAMED) { - if ((Op->Common.AmlOpcode == AML_ALIAS_OP) || - (Op->Common.AmlOpcode == AML_SCOPE_OP)) + /* + * Only these two operators (Alias, Scope) refer to an existing + * name, it is the first argument + */ + if (Op->Common.AmlOpcode == AML_ALIAS_OP) + { + ObjectType = ACPI_TYPE_ANY; + + NextOp = Op->Common.Value.Arg; + NextOp = NextOp->Common.Value.Arg; + if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) + { + Path = NextOp->Common.Value.String; + } + } + else if (Op->Common.AmlOpcode == AML_SCOPE_OP) { - /* - * Only these two operators refer to an existing name, - * first argument - */ Path = (char *) Op->Named.Path; } } @@ -757,6 +768,8 @@ AcpiDmXrefDescendingOp ( { /* Referenced Buffer Name is the first child */ + ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */ + NextOp = Op->Common.Value.Arg; if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) { @@ -783,6 +796,11 @@ AcpiDmXrefDescendingOp ( Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, WalkState, &Node); + if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL)) + { + Status = AE_NOT_FOUND; + } + if (ACPI_FAILURE (Status)) { if (Status == AE_NOT_FOUND) diff --git a/sys/contrib/dev/acpica/common/ahpredef.c b/sys/contrib/dev/acpica/common/ahpredef.c new file mode 100644 index 00000000000..91298c33232 --- /dev/null +++ b/sys/contrib/dev/acpica/common/ahpredef.c @@ -0,0 +1,323 @@ +/****************************************************************************** + * + * Module Name: ahpredef - Table of all known ACPI predefined names + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2012, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + */ + +#include +#include + +/* + * iASL only needs a partial table (short descriptions only). + * AcpiHelp needs the full table. + */ +#ifdef ACPI_ASL_COMPILER +#define AH_PREDEF(Name, ShortDesc, LongDesc) {Name, ShortDesc} +#else +#define AH_PREDEF(Name, ShortDesc, LongDesc) {Name, ShortDesc, LongDesc} +#endif + +/* + * Predefined ACPI names, with short description and return value. + * This table was extracted directly from the ACPI specification. + */ +const AH_PREDEFINED_NAME AslPredefinedInfo[] = +{ + AH_PREDEF ("_ACx", "Active Cooling", "Returns the active cooling policy threshold values"), + AH_PREDEF ("_ADR", "Address", "Returns the address of a device on its parent bus"), + AH_PREDEF ("_AEI", "ACPI Event Interrupts", "Returns a list of GPIO events to be used as ACPI events"), + AH_PREDEF ("_ALC", "Ambient Light Chromaticity", "Returns the ambient light color chromaticity"), + AH_PREDEF ("_ALI", "Ambient Light Illuminance", "Returns the ambient light brightness"), + AH_PREDEF ("_ALN", "Alignment", "Base alignment, Resource Descriptor field"), + AH_PREDEF ("_ALP", "Ambient Light Polling", "Returns the ambient light sensor polling frequency"), + AH_PREDEF ("_ALR", "Ambient Light Response", "Returns the ambient light brightness to display brightness mappings"), + AH_PREDEF ("_ALT", "Ambient Light Temperature", "Returns the ambient light color temperature"), + AH_PREDEF ("_ALx", "Active List", "Returns a list of active cooling device objects"), + AH_PREDEF ("_ART", "Active Cooling Relationship Table", "Returns thermal relationship information between platform devices and fan devices"), + AH_PREDEF ("_ASI", "Address Space Id", "Resource Descriptor field"), + AH_PREDEF ("_ASZ", "Access Size", "Resource Descriptor field"), + AH_PREDEF ("_ATT", "Type-Specific Attribute", "Resource Descriptor field"), + AH_PREDEF ("_BAS", "Base Address", "Range base address, Resource Descriptor field"), + AH_PREDEF ("_BBN", "BIOS Bus Number", "Returns the PCI bus number returned by the BIOS"), + AH_PREDEF ("_BCL", "Brightness Control Levels", "Returns a list of supported brightness control levels"), + AH_PREDEF ("_BCM", "Brightness Control Method", "Sets the brightness level of the display device"), + AH_PREDEF ("_BCT", "Battery Charge Time", "Returns time remaining to complete charging battery"), + AH_PREDEF ("_BDN", "BIOS Dock Name", "Returns the Dock ID returned by the BIOS"), + AH_PREDEF ("_BFS", "Back From Sleep", "Inform AML of a wake event"), + AH_PREDEF ("_BIF", "Battery Information", "Returns a Control Method Battery information block"), + AH_PREDEF ("_BIX", "Battery Information Extended", "Returns a Control Method Battery extended information block"), + AH_PREDEF ("_BLT", "Battery Level Threshold", "Set battery level threshold preferences"), + AH_PREDEF ("_BM_", "Bus Master", "Resource Descriptor field"), + AH_PREDEF ("_BMA", "Battery Measurement Averaging Interval", "Sets battery measurement averaging interval"), + AH_PREDEF ("_BMC", "Battery Maintenance Control", "Sets battery maintenance and control features"), + AH_PREDEF ("_BMD", "Battery Maintenance Data", "Returns battery maintenance, control, and state data"), + AH_PREDEF ("_BMS", "Battery Measurement Sampling Time", "Sets the battery measurement sampling time"), + AH_PREDEF ("_BQC", "Brightness Query Current", "Returns the current display brightness level"), + AH_PREDEF ("_BST", "Battery Status", "Returns a Control Method Battery status block"), + AH_PREDEF ("_BTM", "Battery Time", "Returns the battery runtime"), + AH_PREDEF ("_BTP", "Battery Trip Point", "Sets a Control Method Battery trip point"), + AH_PREDEF ("_CBA", "Configuration Base Address", "Sets the base address for a PCI Express host bridge"), + AH_PREDEF ("_CDM", "Clock Domain", "Returns a logical processor's clock domain identifier"), + AH_PREDEF ("_CID", "Compatible ID", "Returns a device's Plug and Play Compatible ID list"), + AH_PREDEF ("_CLS", "Class Code", "Returns PCI class code and subclass"), + AH_PREDEF ("_CPC", "Continuous Performance Control", "Returns a list of performance control interfaces"), + AH_PREDEF ("_CRS", "Current Resource Settings", "Returns the current resource settings for a device"), + AH_PREDEF ("_CRT", "Critical Temperature", "Returns the shutdown critical temperature"), + AH_PREDEF ("_CSD", "C-State Dependencies", "Returns a list of C-state dependencies"), + AH_PREDEF ("_CST", "C-States", "Returns a list of supported C-states"), + AH_PREDEF ("_CWS", "Clear Wake Alarm Status", "Clear the status of wake alarms"), + AH_PREDEF ("_DBT", "Debounce Timeout", "Timeout value, Resource Descriptor field"), + AH_PREDEF ("_DCK", "Dock Present", "Sets docking isolation. Presence indicates device is a docking station"), + AH_PREDEF ("_DCS", "Display Current Status", "Returns status of the display output device"), + AH_PREDEF ("_DDC", "Display Data Current", "Returns the EDID for the display output device"), + AH_PREDEF ("_DDN", "DOS Device Name", "Returns a device logical name"), + AH_PREDEF ("_DEC", "Decode", "Device decoding type, Resource Descriptor field"), + AH_PREDEF ("_DEP", "Dependencies", "Returns a list of operation region dependencies"), + AH_PREDEF ("_DGS", "Display Graphics State", "Return the current state of the output device"), + AH_PREDEF ("_DIS", "Disable Device", "Disables a device"), + AH_PREDEF ("_DLM", "Device Lock Mutex", "Defines mutex for OS/AML sharing"), + AH_PREDEF ("_DMA", "Direct Memory Access", "Returns a device's current resources for DMA transactions"), + AH_PREDEF ("_DOD", "Display Output Devices", "Enumerate all devices attached to the display adapter"), + AH_PREDEF ("_DOS", "Disable Output Switching", "Sets the display output switching mode"), + AH_PREDEF ("_DPL", "Device Selection Polarity", "Polarity of Device Selection signal, Resource Descriptor field"), + AH_PREDEF ("_DRS", "Drive Strength", "Drive Strength setting for GPIO connection, Resource Descriptor field"), + AH_PREDEF ("_DSM", "Device-Specific Method", "Executes device-specific functions"), + AH_PREDEF ("_DSS", "Device Set State", "Sets the display device state"), + AH_PREDEF ("_DSW", "Device Sleep Wake", "Sets the sleep and wake transition states for a device"), + AH_PREDEF ("_DTI", "Device Temperature Indication", "Conveys native device temperature to the platform"), + AH_PREDEF ("_Exx", "Edge-Triggered GPE", "Method executed as a result of a general-purpose event"), + AH_PREDEF ("_EC_", "Embedded Controller", "returns EC offset and query information"), + AH_PREDEF ("_EDL", "Eject Device List", "Returns a list of devices that are dependent on a device (docking)"), + AH_PREDEF ("_EJD", "Ejection Dependent Device", "Returns the name of dependent (parent) device (docking)"), + AH_PREDEF ("_EJx", "Eject Device", "Begin or cancel a device ejection request (docking)"), + AH_PREDEF ("_END", "Endianness", "Endian orientation, Resource Descriptor field"), + AH_PREDEF ("_EVT", "Event", "Event method for GPIO events"), + AH_PREDEF ("_FDE", "Floppy Disk Enumerate", "Returns floppy disk configuration information"), + AH_PREDEF ("_FDI", "Floppy Drive Information", "Returns a floppy drive information block"), + AH_PREDEF ("_FDM", "Floppy Drive Mode", "Sets a floppy drive speed"), + AH_PREDEF ("_FIF", "Fan Information", "Returns fan device information"), + AH_PREDEF ("_FIX", "Fixed Register Resource Provider", "Returns a list of devices that implement FADT register blocks"), + AH_PREDEF ("_FLC", "Flow Control", "Flow control, Resource Descriptor field"), + AH_PREDEF ("_FPS", "Fan Performance States", "Returns a list of supported fan performance states"), + AH_PREDEF ("_FSL", "Fan Set Level", "Control method that sets the fan device's speed level (performance state)"), + AH_PREDEF ("_FST", "Fan Status", "Returns current status information for a fan device"), + AH_PREDEF ("_GAI", "Get Averaging Interval", "Returns the power meter averaging interval"), + AH_PREDEF ("_GCP", "Get Capabilities", "Get device time capabilities"), + AH_PREDEF ("_GHL", "Get Hardware Limit", "Returns the hardware limit enforced by the power meter"), + AH_PREDEF ("_GL_", "Global Lock", "OS-defined Global Lock mutex object"), + AH_PREDEF ("_GLK", "Get Global Lock Requirement", "Returns a device's Global Lock requirement for device access"), + AH_PREDEF ("_GPD", "Get Post Data", "Returns the value of the VGA device that will be posted at boot"), + AH_PREDEF ("_GPE", "General Purpose Events", "Predefined scope (\\_GPE) or SCI number for EC"), + AH_PREDEF ("_GRA", "Granularity", "Address space granularity, Resource Descriptor field"), + AH_PREDEF ("_GRT", "Get Real Time", "Returns current time-of-day from a time/alarm device"), + AH_PREDEF ("_GSB", "Global System Interrupt Base", "Returns the GSB for a I/O APIC device"), + AH_PREDEF ("_GTF", "Get Task File", "Returns a list of ATA commands to restore a drive to default state"), + AH_PREDEF ("_GTM", "Get Timing Mode", "Returns a list of IDE controller timing information"), + AH_PREDEF ("_GTS", "Going To Sleep", "Inform AML of pending sleep"), + AH_PREDEF ("_GWS", "Get Wake Status", "Return status of wake alarms"), + AH_PREDEF ("_HE_", "High-Edge", "Interrupt triggering, Resource Descriptor field"), + AH_PREDEF ("_HID", "Hardware ID", "Returns a device's Plug and Play Hardware ID"), + AH_PREDEF ("_HOT", "Hot Temperature", "Returns the critical temperature for sleep (entry to S4)"), + AH_PREDEF ("_HPP", "Hot Plug Parameters", "Returns a list of hot-plug information for a PCI device"), + AH_PREDEF ("_HPX", "Hot Plug Parameter Extensions", "Returns a list of hot-plug information for a PCI device. Supersedes _HPP"), + AH_PREDEF ("_HRV", "Hardware Revision", "Returns a hardware revision value"), + AH_PREDEF ("_IFT", "IPMI Interface Type", "See the Intelligent Platform Management Interface Specification"), + AH_PREDEF ("_INI", "Initialize", "Performs device specific initialization"), + AH_PREDEF ("_INT", "Interrupts", "Interrupt mask bits, Resource Descriptor field"), + AH_PREDEF ("_IOR", "I/O Restriction", "Restriction type, Resource Descriptor field"), + AH_PREDEF ("_IRC", "Inrush Current", "Presence indicates that a device has a significant inrush current draw"), + AH_PREDEF ("_Lxx", "Level-Triggered GPE", "Control method executed as a result of a general-purpose event"), + AH_PREDEF ("_LCK", "Lock Device", "Locks or unlocks a device (docking)"), + AH_PREDEF ("_LEN", "Length", "Range length, Resource Descriptor field"), + AH_PREDEF ("_LID", "Lid Status", "Returns the open/closed status of the lid on a mobile system"), + AH_PREDEF ("_LIN", "Lines In Use", "Handshake lines, Resource Descriptor field"), + AH_PREDEF ("_LL_", "Low Level", "Interrupt polarity, Resource Descriptor field"), + AH_PREDEF ("_MAF", "Maximum Address Fixed", "Resource Descriptor field"), + AH_PREDEF ("_MAT", "Multiple APIC Table Entry", "Returns a list of MADT APIC structure entries"), + AH_PREDEF ("_MAX", "Maximum Base Address", "Resource Descriptor field"), + AH_PREDEF ("_MBM", "Memory Bandwidth Monitoring Data", "Returns bandwidth monitoring data for a memory device"), + AH_PREDEF ("_MEM", "Memory Attributes", "Resource Descriptor field"), + AH_PREDEF ("_MIF", "Minimum Address Fixed", "Resource Descriptor field"), + AH_PREDEF ("_MIN", "Minimum Base Address", "Resource Descriptor field"), + AH_PREDEF ("_MLS", "Multiple Language String", "Returns a device description in multiple languages"), + AH_PREDEF ("_MOD", "Mode", "Interrupt mode, Resource Descriptor field"), + AH_PREDEF ("_MSG", "Message", "Sets the system message waiting status indicator"), + AH_PREDEF ("_MSM", "Memory Set Monitoring", "Sets bandwidth monitoring parameters for a memory device"), + AH_PREDEF ("_MTP", "Memory Type", "Resource Descriptor field"), + AH_PREDEF ("_NTT", "Notification Temperature Threshold", "Returns a threshold for device temperature change that requires platform notification"), + AH_PREDEF ("_OFF", "Power Off", "Sets a power resource to the off state"), + AH_PREDEF ("_ON_", "Power On", "Sets a power resource to the on state"), + AH_PREDEF ("_OS_", "Operating System", "Returns a string that identifies the operating system"), + AH_PREDEF ("_OSC", "Operating System Capabilities", "Inform AML of host features and capabilities"), + AH_PREDEF ("_OSI", "Operating System Interfaces", "Returns supported interfaces, behaviors, and features"), + AH_PREDEF ("_OST", "OSPM Status Indication", "Inform AML of event processing status"), + AH_PREDEF ("_PAI", "Power Averaging Interval", "Sets the averaging interval for a power meter"), + AH_PREDEF ("_PAR", "Parity", "Parity bits, Resource Descriptor field"), + AH_PREDEF ("_PCL", "Power Consumer List", "Returns a list of devices powered by a power source"), + AH_PREDEF ("_PCT", "Performance Control", "Returns processor performance control and status registers"), + AH_PREDEF ("_PDC", "Processor Driver Capabilities", "Inform AML of processor driver capabilities"), + AH_PREDEF ("_PDL", "P-state Depth Limit", "Returns the lowest available performance P-state"), + AH_PREDEF ("_PHA", "Clock Phase", "Clock phase, Resource Descriptor field"), + AH_PREDEF ("_PIC", "Interrupt Model", "Inform AML of the interrupt model in use"), + AH_PREDEF ("_PIF", "Power Source Information", "Returns a Power Source information block"), + AH_PREDEF ("_PIN", "Pin List", "Pin list, Resource Descriptor field"), + AH_PREDEF ("_PLD", "Physical Device Location", "Returns a device's physical location information"), + AH_PREDEF ("_PMC", "Power Meter Capabilities", "Returns a list of Power Meter capabilities info"), + AH_PREDEF ("_PMD", "Power Metered Devices", "Returns a list of devices that are measured by the power meter device"), + AH_PREDEF ("_PMM", "Power Meter Measurement", "Returns the current value of the Power Meter"), + AH_PREDEF ("_POL", "Polarity", "Interrupt polarity, Resource Descriptor field"), + AH_PREDEF ("_PPC", "Performance Present Capabilites", "Returns a list of the performance states currently supported by the platform"), + AH_PREDEF ("_PPE", "Polling for Platform Error", "Returns the polling interval to retrieve Corrected Platform Error information"), + AH_PREDEF ("_PPI", "Pin Configuration", "Resource Descriptor field"), + AH_PREDEF ("_PR", "Processor", "Predefined scope for processor objects"), + AH_PREDEF ("_PR0", "Power Resources for D0", "Returns a list of dependent power resources to enter state D0 (fully on)"), + AH_PREDEF ("_PR1", "Power Resources for D1", "Returns a list of dependent power resources to enter state D1"), + AH_PREDEF ("_PR2", "Power Resources for D2", "Returns a list of dependent power resources to enter state D2"), + AH_PREDEF ("_PR3", "Power Resources for D3hot", "Returns a list of dependent power resources to enter state D3hot"), + AH_PREDEF ("_PRE", "Power Resources for Enumeration", "Returns a list of dependent power resources to enumerate devices on a bus"), + AH_PREDEF ("_PRL", "Power Source Redundancy List", "Returns a list of power source devices in the same redundancy grouping"), + AH_PREDEF ("_PRS", "Possible Resource Settings", "Returns a list of a device's possible resource settings"), + AH_PREDEF ("_PRT", "PCI Routing Table", "Returns a list of PCI interrupt mappings"), + AH_PREDEF ("_PRW", "Power Resources for Wake", "Returns a list of dependent power resources for waking"), + AH_PREDEF ("_PS0", "Power State 0", "Sets a device's power state to D0 (device fully on)"), + AH_PREDEF ("_PS1", "Power State 1", "Sets a device's power state to D1"), + AH_PREDEF ("_PS2", "Power State 2", "Sets a device's power state to D2"), + AH_PREDEF ("_PS3", "Power State 3", "Sets a device's power state to D3 (device off)"), + AH_PREDEF ("_PSC", "Power State Current", "Returns a device's current power state"), + AH_PREDEF ("_PSD", "Power State Dependencies", "Returns processor P-State dependencies"), + AH_PREDEF ("_PSE", "Power State for Enumeration", "Put a bus into enumeration power mode"), + AH_PREDEF ("_PSL", "Passive List", "Returns a list of passive cooling device objects"), + AH_PREDEF ("_PSR", "Power Source", "Returns the power source device currently in use"), + AH_PREDEF ("_PSS", "Performance Supported States", "Returns a list of supported processor performance states"), + AH_PREDEF ("_PSV", "Passive Temperature", "Returns the passive trip point temperature"), + AH_PREDEF ("_PSW", "Power State Wake", "Sets a device's wake function"), + AH_PREDEF ("_PTC", "Processor Throttling Control", "Returns throttling control and status registers"), + AH_PREDEF ("_PTP", "Power Trip Points", "Sets trip points for the Power Meter device"), + AH_PREDEF ("_PTS", "Prepare To Sleep", "Inform the platform of an impending sleep transition"), + AH_PREDEF ("_PUR", "Processor Utilization Request", "Returns the number of processors that the platform would like to idle"), + AH_PREDEF ("_PXM", "Device Proximity", "Returns a device's proximity domain identifier"), + AH_PREDEF ("_Qxx", "EC Query", "Embedded Controller query and SMBus Alarm control method"), + AH_PREDEF ("_RBO", "Register Bit Offset", "Resource Descriptor field"), + AH_PREDEF ("_RBW", "Register Bit Width", "Resource Descriptor field"), + AH_PREDEF ("_REG", "Region Availability", "Inform AML code of an operation region availability change"), + AH_PREDEF ("_REV", "Supported ACPI Revision", "Returns the revision of the ACPI specification that is implemented"), + AH_PREDEF ("_RMV", "Removal Status", "Returns a device's removal ability status (docking)"), + AH_PREDEF ("_RNG", "Range", "Memory range type, Resource Descriptor field"), + AH_PREDEF ("_ROM", "Read-Only Memory", "Returns a copy of the ROM data for a display device"), + AH_PREDEF ("_RT_", "Resource Type", "Resource Descriptor field"), + AH_PREDEF ("_RTV", "Relative Temperature Values", "Returns temperature value information"), + AH_PREDEF ("_RW_", "Read-Write Status", "Resource Descriptor field"), + AH_PREDEF ("_RXL", "Receive Buffer Size", "Serial channel buffer, Resource Descriptor field"), + AH_PREDEF ("_S0_", "S0 System State", "Returns values to enter the system into the S0 state"), + AH_PREDEF ("_S1_", "S1 System State", "Returns values to enter the system into the S1 state"), + AH_PREDEF ("_S2_", "S2 System State", "Returns values to enter the system into the S2 state"), + AH_PREDEF ("_S3_", "S3 System State", "Returns values to enter the system into the S3 state"), + AH_PREDEF ("_S4_", "S4 System State", "Returns values to enter the system into the S4 state"), + AH_PREDEF ("_S5_", "S5 System State", "Returns values to enter the system into the S5 state"), + AH_PREDEF ("_S1D", "S1 Device State", "Returns the highest D-state supported by a device when in the S1 state"), + AH_PREDEF ("_S2D", "S2 Device State", "Returns the highest D-state supported by a device when in the S2 state"), + AH_PREDEF ("_S3D", "S3 Device State", "Returns the highest D-state supported by a device when in the S3 state"), + AH_PREDEF ("_S4D", "S4 Device State", "Returns the highest D-state supported by a device when in the S4 state"), + AH_PREDEF ("_S0W", "S0 Device Wake State", "Returns the lowest D-state that the device can wake itself from S0"), + AH_PREDEF ("_S1W", "S1 Device Wake State", "Returns the lowest D-state for this device that can wake the system from S1"), + AH_PREDEF ("_S2W", "S2 Device Wake State", "Returns the lowest D-state for this device that can wake the system from S2"), + AH_PREDEF ("_S3W", "S3 Device Wake State", "Returns the lowest D-state for this device that can wake the system from S3"), + AH_PREDEF ("_S4W", "S4 Device Wake State", "Returns the lowest D-state for this device that can wake the system from S4"), + AH_PREDEF ("_SB_", "System Bus", "Predefined scope for device and bus objects"), + AH_PREDEF ("_SBS", "Smart Battery Subsystem", "Returns the subsystem configuration"), + AH_PREDEF ("_SCP", "Set Cooling Policy", "Sets the cooling policy (active or passive)"), + AH_PREDEF ("_SDD", "Set Device Data", "Sets data for a SATA device"), + AH_PREDEF ("_SEG", "PCI Segment", "Returns a device's PCI Segment Group number"), + AH_PREDEF ("_SHL", "Set Hardware Limit", "Sets the hardware limit enforced by the Power Meter"), + AH_PREDEF ("_SHR", "Sharable", "Interrupt share status, Resource Descriptor field"), + AH_PREDEF ("_SI_", "System Indicators", "Predefined scope"), + AH_PREDEF ("_SIZ", "Size", "DMA transfer size, Resource Descriptor field"), + AH_PREDEF ("_SLI", "System Locality Information", "Returns a list of NUMA system localities"), + AH_PREDEF ("_SLV", "Slave Mode", "Mode setting, Resource Descriptor field"), + AH_PREDEF ("_SPD", "Set Post Device", "Sets which video device will be posted at boot"), + AH_PREDEF ("_SPE", "Speed", "Connection speed, Resource Descriptor field"), + AH_PREDEF ("_SRS", "Set Resource Settings", "Sets a device's resource allocation"), + AH_PREDEF ("_SRT", "Set Real Time", "Sets the current time for a time/alarm device"), + AH_PREDEF ("_SRV", "IPMI Spec Revision", "See the Intelligent Platform Management Interface Specification"), + AH_PREDEF ("_SST", "System Status", "Sets the system status indicator"), + AH_PREDEF ("_STA", "Status", "Returns the current status of a Device or Power Resource"), + AH_PREDEF ("_STB", "Stop Bits", "Serial channel stop bits, Resource Descriptor field"), + AH_PREDEF ("_STM", "Set Timing Mode", "Sets an IDE controller transfer timings"), + AH_PREDEF ("_STP", "Set Expired Timer Wake Policy", "Sets expired timer policies of the wake alarm device"), + AH_PREDEF ("_STR", "Description String", "Returns a device's description string"), + AH_PREDEF ("_STV", "Set Timer Value", "Set timer values of the wake alarm device"), + AH_PREDEF ("_SUB", "Subsystem ID", "Returns the subsystem ID for a device"), + AH_PREDEF ("_SUN", "Slot User Number", "Returns the slot unique ID number"), + AH_PREDEF ("_SWS", "System Wake Source", "Returns the source event that caused the system to wake"), + AH_PREDEF ("_T_x", "Emitted by ASL Compiler", "Reserved for use by ASL compilers"), + AH_PREDEF ("_TC1", "Thermal Constant 1", "Returns TC1 for the passive cooling formula"), + AH_PREDEF ("_TC2", "Thermal Constant 2", "Returns TC2 for the passive cooling formula"), + AH_PREDEF ("_TDL", "T-State Depth Limit", "Returns the _TSS entry number of the lowest power throttling state"), + AH_PREDEF ("_TIP", "Expired Timer Wake Policy", "Returns timer policies of the wake alarm device"), + AH_PREDEF ("_TIV", "Timer Values", "Returns remaining time of the wake alarm device"), + AH_PREDEF ("_TMP", "Temperature", "Returns a thermal zone's current temperature"), + AH_PREDEF ("_TPC", "Throttling Present Capabilities", "Returns the current number of supported throttling states"), + AH_PREDEF ("_TPT", "Trip Point Temperature", "Inform AML that a device's embedded temperature sensor has crossed a temperature trip point"), + AH_PREDEF ("_TRA", "Translation", "Address translation offset, Resource Descriptor field"), + AH_PREDEF ("_TRS", "Translation Sparse", "Sparse/dense flag, Resource Descriptor field"), + AH_PREDEF ("_TRT", "Thermal Relationship Table", "Returns thermal relationships between platform devices"), + AH_PREDEF ("_TSD", "Throttling State Dependencies", "Returns a list of T-state dependencies"), + AH_PREDEF ("_TSF", "Type-Specific Flags", "Resource Descriptor field"), + AH_PREDEF ("_TSP", "Thermal Sampling Period", "Returns the thermal sampling period for passive cooling"), + AH_PREDEF ("_TSS", "Throttling Supported States", "Returns supported throttling state information"), + AH_PREDEF ("_TST", "Temperature Sensor Threshold", "Returns the minimum separation for a device's temperature trip points"), + AH_PREDEF ("_TTP", "Translation Type", "Translation/static flag, Resource Descriptor field"), + AH_PREDEF ("_TTS", "Transition To State", "Inform AML of an S-state transition"), + AH_PREDEF ("_TXL", "Transmit Buffer Size", "Serial Channel buffer, Resource Descriptor field"), + AH_PREDEF ("_TYP", "Type", "DMA channel type (speed), Resource Descriptor field"), + AH_PREDEF ("_TZ_", "Thermal Zone", "Predefined scope: ACPI 1.0"), + AH_PREDEF ("_TZD", "Thermal Zone Devices", "Returns a list of device names associated with a Thermal Zone"), + AH_PREDEF ("_TZM", "Thermal Zone Member", "Returns a reference to the thermal zone of which a device is a member"), + AH_PREDEF ("_TZP", "Thermal Zone Polling", "Returns a Thermal zone's polling frequency"), + AH_PREDEF ("_UID", "Unique ID", "Return a device's unique persistent ID"), + AH_PREDEF ("_UPC", "USB Port Capabilities", "Returns a list of USB port capabilities"), + AH_PREDEF ("_UPD", "User Presence Detect", "Returns user detection information"), + AH_PREDEF ("_UPP", "User Presence Polling", "Returns the recommended user presence polling interval"), + AH_PREDEF ("_VEN", "Vendor Data", "Resource Descriptor field"), + AH_PREDEF ("_VPO", "Video Post Options", "Returns the implemented video post options"), + AH_PREDEF ("_WAK", "Wake", "Inform AML that the system has just awakened"), + AH_PREDEF ("_Wxx", "Wake Event", "Method executed as a result of a wake event"), + AH_PREDEF (NULL, NULL, NULL) +}; diff --git a/sys/contrib/dev/acpica/common/dmextern.c b/sys/contrib/dev/acpica/common/dmextern.c index 6fca187d627..ab7c8dee76e 100644 --- a/sys/contrib/dev/acpica/common/dmextern.c +++ b/sys/contrib/dev/acpica/common/dmextern.c @@ -221,8 +221,10 @@ AcpiDmNormalizeParentPrefix ( */ ACPI_STRCAT (Fullpath, ParentPath); - /* Add dot separator (don't need dot if parent fullpath is a single "\") */ - + /* + * Add dot separator + * (don't need dot if parent fullpath is a single backslash) + */ if (ParentPath[1]) { ACPI_STRCAT (Fullpath, "."); @@ -454,12 +456,12 @@ AcpiDmAddToExternalList ( NewExternal->InternalPath = Path; - /* Link the new descriptor into the global list, ordered by string length */ + /* Link the new descriptor into the global list, alphabetically ordered */ NextExternal = AcpiGbl_ExternalList; while (NextExternal) { - if (NewExternal->Length <= NextExternal->Length) + if (AcpiUtStricmp (NewExternal->Path, NextExternal->Path) < 0) { if (PrevExternal) { @@ -508,7 +510,7 @@ AcpiDmAddExternalsToNamespace ( { ACPI_STATUS Status; ACPI_NAMESPACE_NODE *Node; - ACPI_OPERAND_OBJECT *MethodDesc; + ACPI_OPERAND_OBJECT *ObjDesc; ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList; @@ -527,13 +529,29 @@ AcpiDmAddExternalsToNamespace ( "while adding external to namespace [%s]", External->Path)); } - else if (External->Type == ACPI_TYPE_METHOD) + + else switch (External->Type) { + case ACPI_TYPE_METHOD: + /* For methods, we need to save the argument count */ - MethodDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD); - MethodDesc->Method.ParamCount = (UINT8) External->Value; - Node->Object = MethodDesc; + ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD); + ObjDesc->Method.ParamCount = (UINT8) External->Value; + Node->Object = ObjDesc; + break; + + case ACPI_TYPE_REGION: + + /* Regions require a region sub-object */ + + ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION); + ObjDesc->Region.Node = Node; + Node->Object = ObjDesc; + break; + + default: + break; } External = External->Next; diff --git a/sys/contrib/dev/acpica/common/dmrestag.c b/sys/contrib/dev/acpica/common/dmrestag.c index 1e2db9a35de..eaf412e1efa 100644 --- a/sys/contrib/dev/acpica/common/dmrestag.c +++ b/sys/contrib/dev/acpica/common/dmrestag.c @@ -73,6 +73,7 @@ AcpiDmGetResourceTag ( static char * AcpiGetTagPathname ( + ACPI_PARSE_OBJECT *Op, ACPI_NAMESPACE_NODE *BufferNode, ACPI_NAMESPACE_NODE *ResourceNode, UINT32 BitIndex); @@ -443,7 +444,6 @@ AcpiDmCheckResourceReference ( ACPI_NAMESPACE_NODE *BufferNode; ACPI_NAMESPACE_NODE *ResourceNode; const ACPI_OPCODE_INFO *OpInfo; - char *Pathname; UINT32 BitIndex; @@ -519,14 +519,7 @@ AcpiDmCheckResourceReference ( /* Translate the Index to a resource tag pathname */ - Pathname = AcpiGetTagPathname (BufferNode, ResourceNode, BitIndex); - if (Pathname) - { - /* Complete the conversion of the Index to a symbol */ - - IndexOp->Common.AmlOpcode = AML_INT_NAMEPATH_OP; - IndexOp->Common.Value.String = Pathname; - } + AcpiGetTagPathname (IndexOp, BufferNode, ResourceNode, BitIndex); } @@ -597,6 +590,7 @@ AcpiDmGetResourceNode ( static char * AcpiGetTagPathname ( + ACPI_PARSE_OBJECT *IndexOp, ACPI_NAMESPACE_NODE *BufferNode, ACPI_NAMESPACE_NODE *ResourceNode, UINT32 BitIndex) @@ -689,6 +683,15 @@ AcpiGetTagPathname ( AcpiNsInternalizeName (Pathname, &InternalPath); ACPI_FREE (Pathname); + + /* Update the Op with the symbol */ + + AcpiPsInitOp (IndexOp, AML_INT_NAMEPATH_OP); + IndexOp->Common.Value.String = InternalPath; + + /* We will need the tag later. Cheat by putting it in the Node field */ + + IndexOp->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Tag); return (InternalPath); } diff --git a/sys/contrib/dev/acpica/compiler/aslcompile.c b/sys/contrib/dev/acpica/compiler/aslcompile.c index 50eaf4ef26a..36842cbffd3 100644 --- a/sys/contrib/dev/acpica/compiler/aslcompile.c +++ b/sys/contrib/dev/acpica/compiler/aslcompile.c @@ -59,14 +59,18 @@ CmFlushSourceCode ( static void FlConsumeAnsiComment ( - ASL_FILE_INFO *FileInfo, + FILE *Handle, ASL_FILE_STATUS *Status); static void FlConsumeNewComment ( - ASL_FILE_INFO *FileInfo, + FILE *Handle, ASL_FILE_STATUS *Status); +static void +CmDumpAllEvents ( + void); + /******************************************************************************* * @@ -253,7 +257,8 @@ CmFlushSourceCode ( * * FUNCTION: FlConsume* * - * PARAMETERS: FileInfo - Points to an open input file + * PARAMETERS: Handle - Open input file + * Status - File current status struct * * RETURN: Number of lines consumed * @@ -263,14 +268,14 @@ CmFlushSourceCode ( static void FlConsumeAnsiComment ( - ASL_FILE_INFO *FileInfo, + FILE *Handle, ASL_FILE_STATUS *Status) { UINT8 Byte; BOOLEAN ClosingComment = FALSE; - while (fread (&Byte, 1, 1, FileInfo->Handle)) + while (fread (&Byte, 1, 1, Handle)) { /* Scan until comment close is found */ @@ -307,13 +312,13 @@ FlConsumeAnsiComment ( static void FlConsumeNewComment ( - ASL_FILE_INFO *FileInfo, + FILE *Handle, ASL_FILE_STATUS *Status) { UINT8 Byte; - while (fread (&Byte, 1, 1, FileInfo->Handle)) + while (fread (&Byte, 1, 1, Handle)) { Status->Offset++; @@ -332,7 +337,9 @@ FlConsumeNewComment ( * * FUNCTION: FlCheckForAscii * - * PARAMETERS: FileInfo - Points to an open input file + * PARAMETERS: Handle - Open input file + * Filename - Input filename + * DisplayErrors - TRUE if error messages desired * * RETURN: Status * @@ -347,7 +354,9 @@ FlConsumeNewComment ( ACPI_STATUS FlCheckForAscii ( - ASL_FILE_INFO *FileInfo) + FILE *Handle, + char *Filename, + BOOLEAN DisplayErrors) { UINT8 Byte; ACPI_SIZE BadBytes = 0; @@ -360,7 +369,7 @@ FlCheckForAscii ( /* Read the entire file */ - while (fread (&Byte, 1, 1, FileInfo->Handle)) + while (fread (&Byte, 1, 1, Handle)) { /* Ignore comment fields (allow non-ascii within) */ @@ -370,12 +379,12 @@ FlCheckForAscii ( if (Byte == '*') { - FlConsumeAnsiComment (FileInfo, &Status); + FlConsumeAnsiComment (Handle, &Status); } if (Byte == '/') { - FlConsumeNewComment (FileInfo, &Status); + FlConsumeNewComment (Handle, &Status); } /* Reset */ @@ -391,7 +400,7 @@ FlCheckForAscii ( if (!ACPI_IS_ASCII (Byte)) { - if (BadBytes < 10) + if ((BadBytes < 10) && (DisplayErrors)) { AcpiOsPrintf ( "Non-ASCII character [0x%2.2X] found in line %u, file offset 0x%.2X\n", @@ -413,20 +422,24 @@ FlCheckForAscii ( /* Seek back to the beginning of the source file */ - fseek (FileInfo->Handle, 0, SEEK_SET); + fseek (Handle, 0, SEEK_SET); /* Were there any non-ASCII characters in the file? */ if (BadBytes) { - AcpiOsPrintf ( - "%u non-ASCII characters found in input source text, could be a binary file\n", - BadBytes); - AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, FileInfo->Filename); + if (DisplayErrors) + { + AcpiOsPrintf ( + "%u non-ASCII characters found in input source text, could be a binary file\n", + BadBytes); + AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, Filename); + } + return (AE_BAD_CHARACTER); } - /* File is OK */ + /* File is OK (100% ASCII) */ return (AE_OK); } @@ -708,45 +721,65 @@ CmDoOutputFiles ( /******************************************************************************* * - * FUNCTION: CmDumpEvent + * FUNCTION: CmDumpAllEvents * - * PARAMETERS: Event - A compiler event struct + * PARAMETERS: None * * RETURN: None. * - * DESCRIPTION: Dump a compiler event struct + * DESCRIPTION: Dump all compiler events * ******************************************************************************/ static void -CmDumpEvent ( - ASL_EVENT_INFO *Event) +CmDumpAllEvents ( + void) { + ASL_EVENT_INFO *Event; UINT32 Delta; UINT32 USec; UINT32 MSec; + UINT32 i; - if (!Event->Valid) + + Event = AslGbl_Events; + + DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n"); + if (Gbl_CompileTimesFlag) { - return; + printf ("\nElapsed time for major events\n\n"); } - /* Delta will be in 100-nanosecond units */ - - Delta = (UINT32) (Event->EndTime - Event->StartTime); - - USec = Delta / 10; - MSec = Delta / 10000; - - /* Round milliseconds up */ - - if ((USec - (MSec * 1000)) >= 500) + for (i = 0; i < AslGbl_NextEvent; i++) { - MSec++; - } + if (Event->Valid) + { + /* Delta will be in 100-nanosecond units */ - DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n", - USec, MSec, Event->EventName); + Delta = (UINT32) (Event->EndTime - Event->StartTime); + + USec = Delta / 10; + MSec = Delta / 10000; + + /* Round milliseconds up */ + + if ((USec - (MSec * 1000)) >= 500) + { + MSec++; + } + + DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n", + USec, MSec, Event->EventName); + + if (Gbl_CompileTimesFlag) + { + printf ("%8u usec %8u msec - %s\n", + USec, MSec, Event->EventName); + } + } + + Event++; + } } @@ -777,20 +810,12 @@ CmCleanupAndExit ( AePrintErrorLog (ASL_FILE_STDOUT); } - DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n"); - for (i = 0; i < AslGbl_NextEvent; i++) - { - CmDumpEvent (&AslGbl_Events[i]); - } + /* Emit compile times if enabled */ + + CmDumpAllEvents (); if (Gbl_CompileTimesFlag) { - printf ("\nElapsed time for major events\n\n"); - for (i = 0; i < AslGbl_NextEvent; i++) - { - CmDumpEvent (&AslGbl_Events[i]); - } - printf ("\nMiscellaneous compile statistics\n\n"); printf ("%11u : %s\n", TotalParseNodes, "Parse nodes"); printf ("%11u : %s\n", Gbl_NsLookupCount, "Namespace searches"); diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.h b/sys/contrib/dev/acpica/compiler/aslcompiler.h index bb29468f760..03e1e149f50 100644 --- a/sys/contrib/dev/acpica/compiler/aslcompiler.h +++ b/sys/contrib/dev/acpica/compiler/aslcompiler.h @@ -166,7 +166,9 @@ CmCleanupAndExit ( ACPI_STATUS FlCheckForAscii ( - ASL_FILE_INFO *FileInfo); + FILE *Handle, + char *Filename, + BOOLEAN DisplayErrors); /* @@ -608,6 +610,11 @@ void FlAddIncludeDirectory ( char *Dir); +char * +FlMergePathnames ( + char *PrefixDir, + char *FilePathname); + void FlOpenIncludeFile ( ACPI_PARSE_OBJECT *Op); diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.l b/sys/contrib/dev/acpica/compiler/aslcompiler.l index 68391269d76..5b9ff122e18 100644 --- a/sys/contrib/dev/acpica/compiler/aslcompiler.l +++ b/sys/contrib/dev/acpica/compiler/aslcompiler.l @@ -523,6 +523,7 @@ NamePathTail [.]{NameSeg} "IPMI" { count (0); return (PARSEOP_REGIONSPACE_IPMI); } "GeneralPurposeIo" { count (0); return (PARSEOP_REGIONSPACE_GPIO); } /* ACPI 5.0 */ "GenericSerialBus" { count (0); return (PARSEOP_REGIONSPACE_GSBUS); } /* ACPI 5.0 */ +"PCC" { count (0); return (PARSEOP_REGIONSPACE_PCC); } /* ACPI 5.0 */ "FFixedHW" { count (0); return (PARSEOP_REGIONSPACE_FFIXEDHW); } /* ResourceTypeKeyword: Resource Usage - Resource Descriptors */ diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.y b/sys/contrib/dev/acpica/compiler/aslcompiler.y index 0c53c2375af..2688390f787 100644 --- a/sys/contrib/dev/acpica/compiler/aslcompiler.y +++ b/sys/contrib/dev/acpica/compiler/aslcompiler.y @@ -363,6 +363,7 @@ void * AslLocalAllocate (unsigned int Size); %token PARSEOP_REGIONSPACE_IO %token PARSEOP_REGIONSPACE_IPMI %token PARSEOP_REGIONSPACE_MEM +%token PARSEOP_REGIONSPACE_PCC %token PARSEOP_REGIONSPACE_PCI %token PARSEOP_REGIONSPACE_PCIBAR %token PARSEOP_REGIONSPACE_SMBUS @@ -2359,6 +2360,7 @@ RegionSpaceKeyword | PARSEOP_REGIONSPACE_IPMI {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_IPMI);} | PARSEOP_REGIONSPACE_GPIO {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_GPIO);} | PARSEOP_REGIONSPACE_GSBUS {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_GSBUS);} + | PARSEOP_REGIONSPACE_PCC {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_PCC);} | PARSEOP_REGIONSPACE_FFIXEDHW {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_FFIXEDHW);} ; diff --git a/sys/contrib/dev/acpica/compiler/aslerror.c b/sys/contrib/dev/acpica/compiler/aslerror.c index 9173d4659b3..6d858d860e7 100644 --- a/sys/contrib/dev/acpica/compiler/aslerror.c +++ b/sys/contrib/dev/acpica/compiler/aslerror.c @@ -315,12 +315,16 @@ AePrintException ( } else { + /* + * Less verbose version of the error message, enabled via the + * -vi switch. The format is compatible with MS Visual Studio. + */ fprintf (OutputFile, "%s", Enode->Filename); if (Enode->LineNumber) { - fprintf (OutputFile, "(%u) i:%6u : ", - Enode->LineNumber, Enode->LineNumber); + fprintf (OutputFile, "(%u) : ", + Enode->LineNumber); } } } @@ -335,9 +339,18 @@ AePrintException ( { /* Decode the message ID */ - fprintf (OutputFile, "%s %4.4d - ", - AslErrorLevel[Enode->Level], - Enode->MessageId + ((Enode->Level+1) * 1000)); + if (Gbl_VerboseErrors) + { + fprintf (OutputFile, "%s %4.4d -", + AslErrorLevel[Enode->Level], + Enode->MessageId + ((Enode->Level+1) * 1000)); + } + else /* IDE case */ + { + fprintf (OutputFile, "%s %4.4d:", + AslErrorLevelIde[Enode->Level], + Enode->MessageId + ((Enode->Level+1) * 1000)); + } MainMessage = AslMessages[Enode->MessageId]; ExtraMessage = Enode->Message; diff --git a/sys/contrib/dev/acpica/compiler/aslfiles.c b/sys/contrib/dev/acpica/compiler/aslfiles.c index e3d8a1a0b78..dfcbf9093ff 100644 --- a/sys/contrib/dev/acpica/compiler/aslfiles.c +++ b/sys/contrib/dev/acpica/compiler/aslfiles.c @@ -490,6 +490,107 @@ FlAddIncludeDirectory ( } +/******************************************************************************* + * + * FUNCTION: FlMergePathnames + * + * PARAMETERS: PrefixDir - Prefix directory pathname. Can be NULL or + * a zero length string. + * FilePathname - The include filename from the source ASL. + * + * RETURN: Merged pathname string + * + * DESCRIPTION: Merge two pathnames that (probably) have common elements, to + * arrive at a minimal length string. Merge can occur if the + * FilePathname is relative to the PrefixDir. + * + ******************************************************************************/ + +char * +FlMergePathnames ( + char *PrefixDir, + char *FilePathname) +{ + char *CommonPath; + char *Pathname; + char *LastElement; + + + DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n" + "Include: FilePathname - \"%s\"\n", + PrefixDir, FilePathname); + + /* + * If there is no prefix directory or if the file pathname is absolute, + * just return the original file pathname + */ + if (!PrefixDir || (!*PrefixDir) || + (*FilePathname == '/') || + (FilePathname[1] == ':')) + { + Pathname = ACPI_ALLOCATE (strlen (FilePathname) + 1); + strcpy (Pathname, FilePathname); + goto ConvertBackslashes; + } + + /* Need a local copy of the prefix directory path */ + + CommonPath = ACPI_ALLOCATE (strlen (PrefixDir) + 1); + strcpy (CommonPath, PrefixDir); + + /* + * Walk forward through the file path, and simultaneously backward + * through the prefix directory path until there are no more + * relative references at the start of the file path. + */ + while (*FilePathname && (!strncmp (FilePathname, "../", 3))) + { + /* Remove last element of the prefix directory path */ + + LastElement = strrchr (CommonPath, '/'); + if (!LastElement) + { + goto ConcatenatePaths; + } + + *LastElement = 0; /* Terminate CommonPath string */ + FilePathname += 3; /* Point to next path element */ + } + + /* + * Remove the last element of the prefix directory path (it is the same as + * the first element of the file pathname), and build the final merged + * pathname. + */ + LastElement = strrchr (CommonPath, '/'); + if (LastElement) + { + *LastElement = 0; + } + + /* Build the final merged pathname */ + +ConcatenatePaths: + Pathname = ACPI_ALLOCATE_ZEROED (strlen (CommonPath) + strlen (FilePathname) + 2); + if (LastElement && *CommonPath) + { + strcpy (Pathname, CommonPath); + strcat (Pathname, "/"); + } + strcat (Pathname, FilePathname); + ACPI_FREE (CommonPath); + + /* Convert all backslashes to normal slashes */ + +ConvertBackslashes: + UtConvertBackslashes (Pathname); + + DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n", + Pathname); + return (Pathname); +} + + /******************************************************************************* * * FUNCTION: FlOpenIncludeWithPrefix @@ -515,12 +616,9 @@ FlOpenIncludeWithPrefix ( /* Build the full pathname to the file */ - Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1); + Pathname = FlMergePathnames (PrefixDir, Filename); - strcpy (Pathname, PrefixDir); - strcat (Pathname, Filename); - - DbgPrint (ASL_PARSE_OUTPUT, "\nAttempt to open include file: path %s\n\n", + DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n", Pathname); /* Attempt to open the file, push if successful */ @@ -656,7 +754,7 @@ FlOpenInputFile ( /* Open the input ASL file, text mode */ - FlOpenFile (ASL_FILE_INPUT, InputFilename, "r"); + FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt"); AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle; return (AE_OK); @@ -740,7 +838,7 @@ FlOpenMiscOutputFiles ( /* Open the hex file, text mode */ - FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+"); + FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_HEX_OUTPUT); AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT); @@ -791,7 +889,7 @@ FlOpenMiscOutputFiles ( /* Open the listing file, text mode */ - FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+"); + FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_LISTING_OUTPUT); AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT); @@ -809,7 +907,7 @@ FlOpenMiscOutputFiles ( return (AE_ERROR); } - FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+b"); + FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t"); } /* All done for data table compiler */ @@ -854,7 +952,7 @@ FlOpenMiscOutputFiles ( /* Open the assembly code source file, text mode */ - FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+"); + FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT); AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT); @@ -874,7 +972,7 @@ FlOpenMiscOutputFiles ( /* Open the C code source file, text mode */ - FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+"); + FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t"); FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n"); AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT); @@ -895,7 +993,7 @@ FlOpenMiscOutputFiles ( /* Open the assembly include file, text mode */ - FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+"); + FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT); AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT); @@ -915,7 +1013,7 @@ FlOpenMiscOutputFiles ( /* Open the C include file, text mode */ - FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+"); + FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t"); FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n"); AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT); @@ -936,7 +1034,7 @@ FlOpenMiscOutputFiles ( /* Open the namespace file, text mode */ - FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+"); + FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT); AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT); diff --git a/sys/contrib/dev/acpica/compiler/asllookup.c b/sys/contrib/dev/acpica/compiler/asllookup.c index 26fa3054b29..40e9fe0dca9 100644 --- a/sys/contrib/dev/acpica/compiler/asllookup.c +++ b/sys/contrib/dev/acpica/compiler/asllookup.c @@ -1098,7 +1098,7 @@ LkNamespaceLocateBegin ( if (Message) { - sprintf (MsgBuffer, "Tag: %u bit%s, Field: %u bit%s", + sprintf (MsgBuffer, "Size mismatch, Tag: %u bit%s, Field: %u bit%s", TagBitLength, (TagBitLength > 1) ? "s" : "", FieldBitLength, (FieldBitLength > 1) ? "s" : ""); diff --git a/sys/contrib/dev/acpica/compiler/aslmain.c b/sys/contrib/dev/acpica/compiler/aslmain.c index b5d944eb883..c17fc95bc9d 100644 --- a/sys/contrib/dev/acpica/compiler/aslmain.c +++ b/sys/contrib/dev/acpica/compiler/aslmain.c @@ -63,7 +63,7 @@ Options ( void); static void -HelpMessage ( +FilenameHelp ( void); static void @@ -170,27 +170,36 @@ Options ( ACPI_OPTION ("-g", "Get ACPI tables and write to files (*.dat)"); printf ("\nHelp:\n"); - ACPI_OPTION ("-h", "Additional help and compiler debug options"); + ACPI_OPTION ("-h", "This message"); ACPI_OPTION ("-hc", "Display operators allowed in constant expressions"); + ACPI_OPTION ("-hf", "Display help for output filename generation"); ACPI_OPTION ("-hr", "Display ACPI reserved method names"); ACPI_OPTION ("-ht", "Display currently supported ACPI table names"); + + printf ("\nDebug Options:\n"); + ACPI_OPTION ("-bf -bt", "Create debug file (full or parse tree only) (*.txt)"); + ACPI_OPTION ("-f", "Ignore errors, force creation of AML output file(s)"); + ACPI_OPTION ("-n", "Parse only, no output generation"); + ACPI_OPTION ("-ot", "Display compile times and statistics"); + ACPI_OPTION ("-x ", "Set debug level for trace output"); + ACPI_OPTION ("-z", "Do not insert new compiler ID for DataTables"); } /******************************************************************************* * - * FUNCTION: HelpMessage + * FUNCTION: FilenameHelp * * PARAMETERS: None * * RETURN: None * - * DESCRIPTION: Display help message + * DESCRIPTION: Display help message for output filename generation * ******************************************************************************/ static void -HelpMessage ( +FilenameHelp ( void) { @@ -202,17 +211,6 @@ HelpMessage ( printf (" 2) The prefix of the AMLFileName in the ASL Definition Block\n"); printf (" 3) The prefix of the input filename\n"); printf ("\n"); - - Options (); - - printf ("\nCompiler/Disassembler Debug Options:\n"); - ACPI_OPTION ("-bb -bp -bt", "Create compiler debug/trace file (*.txt)"); - ACPI_OPTION ("", "Types: Parse/Tree/Both"); - ACPI_OPTION ("-f", "Ignore errors, force creation of AML output file(s)"); - ACPI_OPTION ("-n", "Parse only, no output generation"); - ACPI_OPTION ("-ot", "Display compile times"); - ACPI_OPTION ("-x ", "Set debug level for trace output"); - ACPI_OPTION ("-z", "Do not insert new compiler ID for DataTables"); } @@ -430,13 +428,7 @@ AslDoOptions ( case 'b': /* Debug output options */ switch (AcpiGbl_Optarg[0]) { - case 'b': - AslCompilerdebug = 1; /* same as yydebug */ - DtParserdebug = 1; - PrParserdebug = 1; - break; - - case 'p': + case 'f': AslCompilerdebug = 1; /* same as yydebug */ DtParserdebug = 1; PrParserdebug = 1; @@ -530,13 +522,17 @@ AslDoOptions ( switch (AcpiGbl_Optarg[0]) { case '^': - HelpMessage (); + Usage (); exit (0); case 'c': UtDisplayConstantOpcodes (); exit (0); + case 'f': + FilenameHelp (); + exit (0); + case 'r': /* reserved names */ @@ -765,9 +761,18 @@ AslDoOptions ( break; case 'i': - /* Less verbose error messages */ - + /* + * Support for integrated development environment(s). + * + * 1) No compiler signon + * 2) Send stderr messages to stdout + * 3) Less verbose error messages (single line only for each) + * 4) Error/warning messages are formatted appropriately to + * be recognized by MS Visual Studio + */ Gbl_VerboseErrors = FALSE; + Gbl_DoSignon = FALSE; + Gbl_Files[ASL_FILE_STDERR].Handle = stdout; break; case 'o': diff --git a/sys/contrib/dev/acpica/compiler/aslmap.c b/sys/contrib/dev/acpica/compiler/aslmap.c index 46d612c5b85..5278888830f 100644 --- a/sys/contrib/dev/acpica/compiler/aslmap.c +++ b/sys/contrib/dev/acpica/compiler/aslmap.c @@ -367,6 +367,7 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] = /* REGIONSPACE_IO */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_SYSTEM_IO, 0, 0), /* REGIONSPACE_IPMI */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_IPMI, 0, 0), /* REGIONSPACE_MEM */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_SYSTEM_MEMORY, 0, 0), +/* REGIONSPACE_PCC */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_PLATFORM_COMM, 0, 0), /* REGIONSPACE_PCI */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_PCI_CONFIG, 0, 0), /* REGIONSPACE_PCIBAR */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_PCI_BAR_TARGET, 0, 0), /* REGIONSPACE_SMBUS */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_SMBUS, 0, 0), diff --git a/sys/contrib/dev/acpica/compiler/aslmessages.h b/sys/contrib/dev/acpica/compiler/aslmessages.h index 45d50da1917..595e5f4c96d 100644 --- a/sys/contrib/dev/acpica/compiler/aslmessages.h +++ b/sys/contrib/dev/acpica/compiler/aslmessages.h @@ -402,7 +402,7 @@ char *AslMessages [] = { }; -char *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = { +const char *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = { "Warning ", "Warning ", "Warning ", @@ -411,6 +411,15 @@ char *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = { "Optimize" }; +const char *AslErrorLevelIde [ASL_NUM_REPORT_LEVELS] = { + "warning ", + "warning ", + "warning ", + "error ", + "remark ", + "optimize" +}; + #define ASL_ERROR_LEVEL_LENGTH 8 /* Length of strings above */ #endif /* ASL_EXCEPTIONS */ diff --git a/sys/contrib/dev/acpica/compiler/aslstartup.c b/sys/contrib/dev/acpica/compiler/aslstartup.c index 9c5ef15f3ff..4011bde599a 100644 --- a/sys/contrib/dev/acpica/compiler/aslstartup.c +++ b/sys/contrib/dev/acpica/compiler/aslstartup.c @@ -227,7 +227,7 @@ AslDetectSourceFileType ( /* Check for 100% ASCII source file (comments are ignored) */ - Status = FlCheckForAscii (Info); + Status = FlCheckForAscii (Info->Handle, Info->Filename, TRUE); if (ACPI_FAILURE (Status)) { printf ("Non-ascii input file - %s\n", Info->Filename); diff --git a/sys/contrib/dev/acpica/compiler/aslsupport.l b/sys/contrib/dev/acpica/compiler/aslsupport.l index 65dd19bf699..f63519cd3fd 100644 --- a/sys/contrib/dev/acpica/compiler/aslsupport.l +++ b/sys/contrib/dev/acpica/compiler/aslsupport.l @@ -92,19 +92,23 @@ static void AslDoLineDirective ( void) { - char c; + int c; char *Token; UINT32 LineNumber; char *Filename; + UINT32 i; /* Eat the entire line that contains the #line directive */ - while ((c = (char) input()) != '\n' && c != EOF) + Gbl_LineBufPtr = Gbl_CurrentLineBuffer; + + while ((c = input()) != '\n' && c != EOF) { - AslInsertLineBuffer (c); + *Gbl_LineBufPtr = c; + Gbl_LineBufPtr++; } - AslInsertLineBuffer (0); + *Gbl_LineBufPtr = 0; /* First argument is the actual line number */ @@ -114,10 +118,23 @@ AslDoLineDirective ( goto ResetAndExit; } - /* Convert line number. Subtract one to handle _this_ line */ + /* First argument is the line number */ LineNumber = (UINT32) UtDoConstant (Token); - FlSetLineNumber (LineNumber - 1); + + /* Emit the appropriate number of newlines */ + + Gbl_CurrentColumn = 0; + if (LineNumber > Gbl_CurrentLineNumber) + { + for (i = 0; i < (LineNumber - Gbl_CurrentLineNumber); i++) + { + FlWriteFile (ASL_FILE_SOURCE_OUTPUT, "\n", 1); + Gbl_CurrentColumn++; + } + } + + FlSetLineNumber (LineNumber); /* Second argument is the optional filename (in double quotes) */ @@ -132,7 +149,12 @@ AslDoLineDirective ( /* Third argument is not supported at this time */ ResetAndExit: - AslResetCurrentLineBuffer (); + + /* Reset globals for a new line */ + + Gbl_CurrentLineOffset += Gbl_CurrentColumn; + Gbl_CurrentColumn = 0; + Gbl_LineBufPtr = Gbl_CurrentLineBuffer; } @@ -408,8 +430,8 @@ static char AslDoComment ( void) { - char c; - char c1 = 0; + int c; + int c1 = 0; AslInsertLineBuffer ('/'); @@ -419,7 +441,7 @@ loop: /* Eat chars until end-of-comment */ - while ((c = (char) input()) != '*' && c != EOF) + while ((c = input()) != '*' && c != EOF) { AslInsertLineBuffer (c); c1 = c; @@ -446,7 +468,7 @@ loop: AslInsertLineBuffer (c); - if ((c1 = (char) input()) != '/' && c1 != EOF) + if ((c1 = input()) != '/' && c1 != EOF) { unput(c1); goto loop; @@ -489,13 +511,13 @@ static char AslDoCommentType2 ( void) { - char c; + int c; AslInsertLineBuffer ('/'); AslInsertLineBuffer ('/'); - while ((c = (char) input()) != '\n' && c != EOF) + while ((c = input()) != '\n' && c != EOF) { AslInsertLineBuffer (c); } @@ -531,7 +553,7 @@ AslDoStringLiteral ( char *StringBuffer = MsgBuffer; char *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE; char *CleanString; - char StringChar; + int StringChar; UINT32 State = ASL_NORMAL_CHAR; UINT32 i = 0; UINT8 Digit; @@ -544,7 +566,7 @@ AslDoStringLiteral ( * source line buffer. */ AslInsertLineBuffer ('\"'); - while ((StringChar = (char) input()) != EOF) + while ((StringChar = input()) != EOF) { AslInsertLineBuffer (StringChar); diff --git a/sys/contrib/dev/acpica/compiler/aslutils.c b/sys/contrib/dev/acpica/compiler/aslutils.c index 0fabba16f09..eb1d13df9bd 100644 --- a/sys/contrib/dev/acpica/compiler/aslutils.c +++ b/sys/contrib/dev/acpica/compiler/aslutils.c @@ -139,7 +139,7 @@ UtDisplaySupportedTables ( /******************************************************************************* * - * FUNCTION: AcpiPsDisplayConstantOpcodes + * FUNCTION: UtDisplayConstantOpcodes * * PARAMETERS: None * @@ -172,11 +172,11 @@ UtDisplayConstantOpcodes ( * * FUNCTION: UtLocalCalloc * - * PARAMETERS: Size - Bytes to be allocated + * PARAMETERS: Size - Bytes to be allocated * - * RETURN: Pointer to the allocated memory. Guaranteed to be valid. + * RETURN: Pointer to the allocated memory. Guaranteed to be valid. * - * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an + * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an * allocation failure, on the assumption that nothing more can be * accomplished. * @@ -211,9 +211,9 @@ UtLocalCalloc ( * * FUNCTION: UtBeginEvent * - * PARAMETERS: Name - Ascii name of this event + * PARAMETERS: Name - Ascii name of this event * - * RETURN: Event - Event number (integer index) + * RETURN: Event number (integer index) * * DESCRIPTION: Saves the current time with this event * @@ -244,7 +244,7 @@ UtBeginEvent ( * * FUNCTION: UtEndEvent * - * PARAMETERS: Event - Event number (integer index) + * PARAMETERS: Event - Event number (integer index) * * RETURN: None * @@ -254,7 +254,7 @@ UtBeginEvent ( void UtEndEvent ( - UINT8 Event) + UINT8 Event) { if (Event >= ASL_NUM_EVENTS) @@ -272,7 +272,7 @@ UtEndEvent ( * * FUNCTION: UtHexCharToValue * - * PARAMETERS: HexChar - Hex character in Ascii + * PARAMETERS: HexChar - Hex character in Ascii * * RETURN: The binary value of the hex character * @@ -303,12 +303,13 @@ UtHexCharToValue ( * * FUNCTION: UtConvertByteToHex * - * PARAMETERS: RawByte - Binary data - * Buffer - Pointer to where the hex bytes will be stored + * PARAMETERS: RawByte - Binary data + * Buffer - Pointer to where the hex bytes will be + * stored * * RETURN: Ascii hex byte is stored in Buffer. * - * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed + * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed * with "0x" * ******************************************************************************/ @@ -331,12 +332,13 @@ UtConvertByteToHex ( * * FUNCTION: UtConvertByteToAsmHex * - * PARAMETERS: RawByte - Binary data - * Buffer - Pointer to where the hex bytes will be stored + * PARAMETERS: RawByte - Binary data + * Buffer - Pointer to where the hex bytes will be + * stored * * RETURN: Ascii hex byte is stored in Buffer. * - * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed + * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed * with "0x" * ******************************************************************************/ @@ -358,13 +360,13 @@ UtConvertByteToAsmHex ( * * FUNCTION: DbgPrint * - * PARAMETERS: Type - Type of output - * Fmt - Printf format string - * ... - variable printf list + * PARAMETERS: Type - Type of output + * Fmt - Printf format string + * ... - variable printf list * * RETURN: None * - * DESCRIPTION: Conditional print statement. Prints to stderr only if the + * DESCRIPTION: Conditional print statement. Prints to stderr only if the * debug flag is set. * ******************************************************************************/ @@ -438,7 +440,7 @@ UtPrintFormattedName ( * * FUNCTION: UtSetParseOpName * - * PARAMETERS: Op + * PARAMETERS: Op - Parse op to be named. * * RETURN: None * @@ -460,7 +462,7 @@ UtSetParseOpName ( * * FUNCTION: UtDisplaySummary * - * PARAMETERS: FileID - ID of outpout file + * PARAMETERS: FileID - ID of outpout file * * RETURN: None * @@ -571,11 +573,11 @@ UtDisplaySummary ( /******************************************************************************* * - * FUNCTION: UtDisplaySummary + * FUNCTION: UtCheckIntegerRange * - * PARAMETERS: Op - Integer parse node - * LowValue - Smallest allowed value - * HighValue - Largest allowed value + * PARAMETERS: Op - Integer parse node + * LowValue - Smallest allowed value + * HighValue - Largest allowed value * * RETURN: Op if OK, otherwise NULL * @@ -626,11 +628,11 @@ UtCheckIntegerRange ( * * FUNCTION: UtGetStringBuffer * - * PARAMETERS: Length - Size of buffer requested + * PARAMETERS: Length - Size of buffer requested * - * RETURN: Pointer to the buffer. Aborts on allocation failure + * RETURN: Pointer to the buffer. Aborts on allocation failure * - * DESCRIPTION: Allocate a string buffer. Bypass the local + * DESCRIPTION: Allocate a string buffer. Bypass the local * dynamic memory manager for performance reasons (This has a * major impact on the speed of the compiler.) * @@ -661,8 +663,8 @@ UtGetStringBuffer ( * * FUNCTION: UtInternalizeName * - * PARAMETERS: ExternalName - Name to convert - * ConvertedName - Where the converted name is returned + * PARAMETERS: ExternalName - Name to convert + * ConvertedName - Where the converted name is returned * * RETURN: Status * @@ -714,8 +716,8 @@ UtInternalizeName ( * * FUNCTION: UtPadNameWithUnderscores * - * PARAMETERS: NameSeg - Input nameseg - * PaddedNameSeg - Output padded nameseg + * PARAMETERS: NameSeg - Input nameseg + * PaddedNameSeg - Output padded nameseg * * RETURN: Padded nameseg. * @@ -752,8 +754,8 @@ UtPadNameWithUnderscores ( * * FUNCTION: UtAttachNameseg * - * PARAMETERS: Op - Parent parse node - * Name - Full ExternalName + * PARAMETERS: Op - Parent parse node + * Name - Full ExternalName * * RETURN: None; Sets the NameSeg field in parent node * @@ -809,12 +811,12 @@ UtAttachNameseg ( * * FUNCTION: UtAttachNamepathToOwner * - * PARAMETERS: Op - Parent parse node - * NameOp - Node that contains the name + * PARAMETERS: Op - Parent parse node + * NameOp - Node that contains the name * * RETURN: Sets the ExternalName and Namepath in the parent node * - * DESCRIPTION: Store the name in two forms in the parent node: The original + * DESCRIPTION: Store the name in two forms in the parent node: The original * (external) name, and the internalized name that is used within * the ACPI namespace manager. * @@ -854,11 +856,11 @@ UtAttachNamepathToOwner ( * * FUNCTION: UtDoConstant * - * PARAMETERS: String - Hex, Octal, or Decimal string + * PARAMETERS: String - Hex, Octal, or Decimal string * * RETURN: Converted Integer * - * DESCRIPTION: Convert a string to an integer. With error checking. + * DESCRIPTION: Convert a string to an integer, with error checking. * ******************************************************************************/ @@ -889,10 +891,10 @@ UtDoConstant ( * * FUNCTION: UtStrtoul64 * - * PARAMETERS: String - Null terminated string - * Terminater - Where a pointer to the terminating byte is - * returned - * Base - Radix of the string + * PARAMETERS: String - Null terminated string + * Terminater - Where a pointer to the terminating byte + * is returned + * Base - Radix of the string * * RETURN: Converted value * @@ -1072,5 +1074,3 @@ ErrorExit: return (Status); } - - diff --git a/sys/contrib/dev/acpica/compiler/dtio.c b/sys/contrib/dev/acpica/compiler/dtio.c index 633ed2d9a58..1d08389d15c 100644 --- a/sys/contrib/dev/acpica/compiler/dtio.c +++ b/sys/contrib/dev/acpica/compiler/dtio.c @@ -427,7 +427,6 @@ DtGetNextLine ( { case DT_START_QUOTED_STRING: case DT_SLASH_ASTERISK_COMMENT: - case DT_SLASH_SLASH_COMMENT: AcpiOsPrintf ("**** EOF within comment/string %u\n", State); break; @@ -436,7 +435,22 @@ DtGetNextLine ( break; } - return (ASL_EOF); + /* Standalone EOF is OK */ + + if (i == 0) + { + return (ASL_EOF); + } + + /* + * Received an EOF in the middle of a line. Terminate the + * line with a newline. The next call to this function will + * return a standalone EOF. Thus, the upper parsing software + * never has to deal with an EOF within a valid line (or + * the last line does not get tossed on the floor.) + */ + c = '\n'; + State = DT_NORMAL_TEXT; } switch (State) diff --git a/sys/contrib/dev/acpica/compiler/dttemplate.c b/sys/contrib/dev/acpica/compiler/dttemplate.c index 0c35280b9bd..9e02a876a91 100644 --- a/sys/contrib/dev/acpica/compiler/dttemplate.c +++ b/sys/contrib/dev/acpica/compiler/dttemplate.c @@ -226,7 +226,7 @@ DtCreateAllTemplates ( } /* - * Create the "special ACPI tables: + * Create the special ACPI tables: * 1) DSDT/SSDT are AML tables, not data tables * 2) FACS and RSDP have non-standard headers */ diff --git a/sys/contrib/dev/acpica/compiler/prscan.c b/sys/contrib/dev/acpica/compiler/prscan.c index a47f07f3e58..233e45a38ad 100644 --- a/sys/contrib/dev/acpica/compiler/prscan.c +++ b/sys/contrib/dev/acpica/compiler/prscan.c @@ -654,7 +654,7 @@ PrDoDirective ( } DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID - "Start #include file %s\n", Gbl_CurrentLineNumber, + "Start #include file \"%s\"\n", Gbl_CurrentLineNumber, Token, Gbl_CurrentLineNumber); PrOpenIncludeFile (Token); diff --git a/sys/contrib/dev/acpica/compiler/prutils.c b/sys/contrib/dev/acpica/compiler/prutils.c index 0bbd8f5a3b2..8f9f24dc018 100644 --- a/sys/contrib/dev/acpica/compiler/prutils.c +++ b/sys/contrib/dev/acpica/compiler/prutils.c @@ -246,13 +246,11 @@ PrOpenIncludeFile ( ASL_INCLUDE_DIR *NextDir; - /* - * start the actual include file on the next line - */ + /* Start the actual include file on the next line */ + Gbl_CurrentLineOffset++; /* Attempt to open the include file */ - /* If the file specifies an absolute path, just open it */ if ((Filename[0] == '/') || @@ -330,13 +328,10 @@ PrOpenIncludeWithPrefix ( /* Build the full pathname to the file */ - Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1); + Pathname = FlMergePathnames (PrefixDir, Filename); - strcpy (Pathname, PrefixDir); - strcat (Pathname, Filename); - - DbgPrint (ASL_PARSE_OUTPUT, "\n" PR_PREFIX_ID - "Opening include file: path %s\n", + DbgPrint (ASL_PARSE_OUTPUT, PR_PREFIX_ID + "Include: Opening file - \"%s\"\n", Gbl_CurrentLineNumber, Pathname); /* Attempt to open the file, push if successful */ diff --git a/sys/contrib/dev/acpica/components/debugger/dbdisply.c b/sys/contrib/dev/acpica/components/debugger/dbdisply.c index 23f07d6382b..69fafe587c9 100644 --- a/sys/contrib/dev/acpica/components/debugger/dbdisply.c +++ b/sys/contrib/dev/acpica/components/debugger/dbdisply.c @@ -792,10 +792,12 @@ AcpiDbDisplayGpes ( ACPI_GPE_EVENT_INFO *GpeEventInfo; ACPI_GPE_REGISTER_INFO *GpeRegisterInfo; char *GpeType; + ACPI_GPE_NOTIFY_INFO *Notify; UINT32 GpeIndex; UINT32 Block = 0; UINT32 i; UINT32 j; + UINT32 Count; char Buffer[80]; ACPI_BUFFER RetBuf; ACPI_STATUS Status; @@ -916,7 +918,14 @@ AcpiDbDisplayGpes ( AcpiOsPrintf ("Handler"); break; case ACPI_GPE_DISPATCH_NOTIFY: - AcpiOsPrintf ("Notify"); + Count = 0; + Notify = GpeEventInfo->Dispatch.NotifyList; + while (Notify) + { + Count++; + Notify = Notify->Next; + } + AcpiOsPrintf ("Implicit Notify on %u devices", Count); break; default: AcpiOsPrintf ("UNKNOWN: %X", diff --git a/sys/contrib/dev/acpica/components/debugger/dbexec.c b/sys/contrib/dev/acpica/components/debugger/dbexec.c index 525d84a5fde..376aed82212 100644 --- a/sys/contrib/dev/acpica/components/debugger/dbexec.c +++ b/sys/contrib/dev/acpica/components/debugger/dbexec.c @@ -872,8 +872,8 @@ AcpiDbMethodThread ( if (Info->InitArgs) { - AcpiDbUInt32ToHexString (Info->NumCreated, Info->IndexOfThreadStr); - AcpiDbUInt32ToHexString ((UINT32) AcpiOsGetThreadId (), Info->IdOfThreadStr); + AcpiDbUint32ToHexString (Info->NumCreated, Info->IndexOfThreadStr); + AcpiDbUint32ToHexString ((UINT32) AcpiOsGetThreadId (), Info->IdOfThreadStr); } if (Info->Threads && (Info->NumCreated < Info->NumThreads)) @@ -1063,7 +1063,7 @@ AcpiDbCreateExecutionThreads ( AcpiGbl_DbMethodInfo.ArgTypes[1] = ACPI_TYPE_INTEGER; AcpiGbl_DbMethodInfo.ArgTypes[2] = ACPI_TYPE_INTEGER; - AcpiDbUInt32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr); + AcpiDbUint32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr); AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo); diff --git a/sys/contrib/dev/acpica/components/debugger/dbfileio.c b/sys/contrib/dev/acpica/components/debugger/dbfileio.c index a558e4266f7..f266fc19aee 100644 --- a/sys/contrib/dev/acpica/components/debugger/dbfileio.c +++ b/sys/contrib/dev/acpica/components/debugger/dbfileio.c @@ -51,6 +51,10 @@ #include #endif +#ifdef ACPI_ASL_COMPILER +#include +#endif + #if (defined ACPI_DEBUGGER || defined ACPI_DISASSEMBLER) #define _COMPONENT ACPI_CA_DEBUGGER @@ -309,6 +313,15 @@ AcpiDbReadTable ( AcpiOsPrintf ( "TableHeader length [0x%X] greater than the input file size [0x%X]\n", TableHeader.Length, FileSize); + +#ifdef ACPI_ASL_COMPILER + Status = FlCheckForAscii (fp, NULL, FALSE); + if (ACPI_SUCCESS (Status)) + { + AcpiOsPrintf ("File appears to be ASCII only, must be binary\n", + TableHeader.Length, FileSize); + } +#endif return (AE_BAD_HEADER); } diff --git a/sys/contrib/dev/acpica/components/debugger/dbutils.c b/sys/contrib/dev/acpica/components/debugger/dbutils.c index d41491fb9c2..6f5869a39fb 100644 --- a/sys/contrib/dev/acpica/components/debugger/dbutils.c +++ b/sys/contrib/dev/acpica/components/debugger/dbutils.c @@ -360,7 +360,7 @@ AcpiDbLocalNsLookup ( /******************************************************************************* * - * FUNCTION: AcpiDbUInt32ToHexString + * FUNCTION: AcpiDbUint32ToHexString * * PARAMETERS: Value - The value to be converted to string * Buffer - Buffer for result (not less than 11 bytes) @@ -375,7 +375,7 @@ AcpiDbLocalNsLookup ( ******************************************************************************/ void -AcpiDbUInt32ToHexString ( +AcpiDbUint32ToHexString ( UINT32 Value, char *Buffer) { diff --git a/sys/contrib/dev/acpica/components/disassembler/dmopcode.c b/sys/contrib/dev/acpica/components/disassembler/dmopcode.c index d0960108a36..395601eea7c 100644 --- a/sys/contrib/dev/acpica/components/disassembler/dmopcode.c +++ b/sys/contrib/dev/acpica/components/disassembler/dmopcode.c @@ -46,6 +46,7 @@ #include #include #include +#include #ifdef ACPI_DISASSEMBLER @@ -59,6 +60,218 @@ AcpiDmMatchKeyword ( ACPI_PARSE_OBJECT *Op); +/******************************************************************************* + * + * FUNCTION: AcpiDmPredefinedDescription + * + * PARAMETERS: Op - Name() parse object + * + * RETURN: None + * + * DESCRIPTION: Emit a description comment for a predefined ACPI name. + * Used for iASL compiler only. + * + ******************************************************************************/ + +void +AcpiDmPredefinedDescription ( + ACPI_PARSE_OBJECT *Op) +{ +#ifdef ACPI_ASL_COMPILER + const AH_PREDEFINED_NAME *Info; + char *NameString; + int LastCharIsDigit; + int LastCharsAreHex; + + + if (!Op) + { + return; + } + + /* Ensure that the comment field is emitted only once */ + + if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED) + { + return; + } + Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED; + + /* Predefined name must start with an underscore */ + + NameString = ACPI_CAST_PTR (char, &Op->Named.Name); + if (NameString[0] != '_') + { + return; + } + + /* + * Check for the special ACPI names: + * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a + * (where d=decimal_digit, x=hex_digit, a=anything) + * + * Convert these to the generic name for table lookup. + * Note: NameString is guaranteed to be upper case here. + */ + LastCharIsDigit = + (ACPI_IS_DIGIT (NameString[3])); /* d */ + LastCharsAreHex = + (ACPI_IS_XDIGIT (NameString[2]) && /* xx */ + ACPI_IS_XDIGIT (NameString[3])); + + switch (NameString[1]) + { + case 'A': + if ((NameString[2] == 'C') && (LastCharIsDigit)) + { + NameString = "_ACx"; + } + else if ((NameString[2] == 'L') && (LastCharIsDigit)) + { + NameString = "_ALx"; + } + break; + + case 'E': + if ((NameString[2] == 'J') && (LastCharIsDigit)) + { + NameString = "_EJx"; + } + else if (LastCharsAreHex) + { + NameString = "_Exx"; + } + break; + + case 'L': + if (LastCharsAreHex) + { + NameString = "_Lxx"; + } + break; + + case 'Q': + if (LastCharsAreHex) + { + NameString = "_Qxx"; + } + break; + + case 'T': + if (NameString[2] == '_') + { + NameString = "_T_x"; + } + break; + + case 'W': + if (LastCharsAreHex) + { + NameString = "_Wxx"; + } + break; + + default: + break; + } + + /* Match the name in the info table */ + + for (Info = AslPredefinedInfo; Info->Name; Info++) + { + if (ACPI_COMPARE_NAME (NameString, Info->Name)) + { + AcpiOsPrintf (" // %4.4s: %s", + NameString, ACPI_CAST_PTR (char, Info->Description)); + return; + } + } + +#endif + return; +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmFieldPredefinedDescription + * + * PARAMETERS: Op - Parse object + * + * RETURN: None + * + * DESCRIPTION: Emit a description comment for a resource descriptor tag + * (which is a predefined ACPI name.) Used for iASL compiler only. + * + ******************************************************************************/ + +void +AcpiDmFieldPredefinedDescription ( + ACPI_PARSE_OBJECT *Op) +{ +#ifdef ACPI_ASL_COMPILER + ACPI_PARSE_OBJECT *IndexOp; + char *Tag; + const ACPI_OPCODE_INFO *OpInfo; + const AH_PREDEFINED_NAME *Info; + + + if (!Op) + { + return; + } + + /* Ensure that the comment field is emitted only once */ + + if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED) + { + return; + } + Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED; + + /* + * Op must be one of the Create* operators: CreateField, CreateBitField, + * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField + */ + OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); + if (!(OpInfo->Flags & AML_CREATE)) + { + return; + } + + /* Second argument is the Index argument */ + + IndexOp = Op->Common.Value.Arg; + IndexOp = IndexOp->Common.Next; + + /* Index argument must be a namepath */ + + if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP) + { + return; + } + + /* Major cheat: We previously put the Tag ptr in the Node field */ + + Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node); + + /* Match the name in the info table */ + + for (Info = AslPredefinedInfo; Info->Name; Info++) + { + if (ACPI_COMPARE_NAME (Tag, Info->Name)) + { + AcpiOsPrintf (" // %4.4s: %s", Tag, + ACPI_CAST_PTR (char, Info->Description)); + return; + } + } + +#endif + return; +} + + /******************************************************************************* * * FUNCTION: AcpiDmMethodFlags diff --git a/sys/contrib/dev/acpica/components/disassembler/dmwalk.c b/sys/contrib/dev/acpica/components/disassembler/dmwalk.c index 39bc5ce82f6..333a5cb6deb 100644 --- a/sys/contrib/dev/acpica/components/disassembler/dmwalk.c +++ b/sys/contrib/dev/acpica/components/disassembler/dmwalk.c @@ -453,7 +453,7 @@ AcpiDmDescendingOp ( * keep track of the current column. */ Info->Count++; - if (Info->Count /*+Info->LastLevel*/ > 10) + if (Info->Count /* +Info->LastLevel */ > 10) { Info->Count = 0; AcpiOsPrintf ("\n"); @@ -533,6 +533,10 @@ AcpiDmDescendingOp ( AcpiDmMethodFlags (Op); AcpiOsPrintf (")"); + + /* Emit description comment for Method() with a predefined ACPI name */ + + AcpiDmPredefinedDescription (Op); break; @@ -603,7 +607,8 @@ AcpiDmDescendingOp ( default: - AcpiOsPrintf ("*** Unhandled named opcode %X\n", Op->Common.AmlOpcode); + AcpiOsPrintf ("*** Unhandled named opcode %X\n", + Op->Common.AmlOpcode); break; } } @@ -644,7 +649,8 @@ AcpiDmDescendingOp ( NextOp = NextOp->Common.Next; Info->Flags = ACPI_PARSEOP_PARAMLIST; - AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp, AcpiDmAscendingOp, Info); + AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp, + AcpiDmAscendingOp, Info); Info->Flags = 0; Info->Level = Level; @@ -686,12 +692,18 @@ AcpiDmDescendingOp ( if (Op->Common.DisasmOpcode == ACPI_DASM_RESOURCE) { /* - * We have a resource list. Don't need to output - * the buffer size Op. Open up a new block + * We have a resource list. Don't need to output + * the buffer size Op. Open up a new block */ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; NextOp = NextOp->Common.Next; - AcpiOsPrintf (")\n"); + AcpiOsPrintf (")"); + + /* Emit description comment for Name() with a predefined ACPI name */ + + AcpiDmPredefinedDescription (Op->Asl.Parent); + + AcpiOsPrintf ("\n"); AcpiDmIndent (Info->Level); AcpiOsPrintf ("{\n"); return (AE_OK); @@ -719,7 +731,7 @@ AcpiDmDescendingOp ( case AML_PACKAGE_OP: - /* The next op is the size or predicate parameter */ + /* The next op is the size parameter */ NextOp = AcpiPsGetDepthNext (NULL, Op); if (NextOp) @@ -772,6 +784,7 @@ AcpiDmAscendingOp ( void *Context) { ACPI_OP_WALK_INFO *Info = Context; + ACPI_PARSE_OBJECT *ParentOp; if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE) @@ -797,6 +810,19 @@ AcpiDmAscendingOp ( AcpiOsPrintf (")"); + if (Op->Common.AmlOpcode == AML_NAME_OP) + { + /* Emit description comment for Name() with a predefined ACPI name */ + + AcpiDmPredefinedDescription (Op); + } + else + { + /* For Create* operators, attempt to emit resource tag description */ + + AcpiDmFieldPredefinedDescription (Op); + } + /* Could be a nested operator, check if comma required */ if (!AcpiDmCommaIfListMember (Op)) @@ -911,7 +937,20 @@ AcpiDmAscendingOp ( */ if (Op->Common.Next) { - AcpiOsPrintf (")\n"); + AcpiOsPrintf (")"); + + /* Emit description comment for Name() with a predefined ACPI name */ + + ParentOp = Op->Common.Parent; + if (ParentOp) + { + ParentOp = ParentOp->Common.Parent; + if (ParentOp && ParentOp->Asl.AmlOpcode == AML_NAME_OP) + { + AcpiDmPredefinedDescription (ParentOp); + } + } + AcpiOsPrintf ("\n"); AcpiDmIndent (Level - 1); AcpiOsPrintf ("{\n"); } diff --git a/sys/contrib/dev/acpica/components/dispatcher/dsfield.c b/sys/contrib/dev/acpica/components/dispatcher/dsfield.c index ec3d5dd1bbd..8bf41dbe7a2 100644 --- a/sys/contrib/dev/acpica/components/dispatcher/dsfield.c +++ b/sys/contrib/dev/acpica/components/dispatcher/dsfield.c @@ -57,6 +57,18 @@ /* Local prototypes */ +#ifdef ACPI_ASL_COMPILER +#include + +static ACPI_STATUS +AcpiDsCreateExternalRegion ( + ACPI_STATUS LookupStatus, + ACPI_PARSE_OBJECT *Op, + char *Path, + ACPI_WALK_STATE *WalkState, + ACPI_NAMESPACE_NODE **Node); +#endif + static ACPI_STATUS AcpiDsGetFieldNames ( ACPI_CREATE_FIELD_INFO *Info, @@ -64,6 +76,69 @@ AcpiDsGetFieldNames ( ACPI_PARSE_OBJECT *Arg); +#ifdef ACPI_ASL_COMPILER +/******************************************************************************* + * + * FUNCTION: AcpiDsCreateExternalRegion (iASL Disassembler only) + * + * PARAMETERS: LookupStatus - Status from NsLookup operation + * Op - Op containing the Field definition and args + * Path - Pathname of the region + * ` WalkState - Current method state + * Node - Where the new region node is returned + * + * RETURN: Status + * + * DESCRIPTION: Add region to the external list if NOT_FOUND. Create a new + * region node/object. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiDsCreateExternalRegion ( + ACPI_STATUS LookupStatus, + ACPI_PARSE_OBJECT *Op, + char *Path, + ACPI_WALK_STATE *WalkState, + ACPI_NAMESPACE_NODE **Node) +{ + ACPI_STATUS Status; + ACPI_OPERAND_OBJECT *ObjDesc; + + + if (LookupStatus != AE_NOT_FOUND) + { + return (LookupStatus); + } + + /* + * Table disassembly: + * OperationRegion not found. Generate an External for it, and + * insert the name into the namespace. + */ + AcpiDmAddToExternalList (Op, Path, ACPI_TYPE_REGION, 0); + Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_REGION, + ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, WalkState, Node); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + /* Must create and install a region object for the new node */ + + ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION); + if (!ObjDesc) + { + return (AE_NO_MEMORY); + } + + ObjDesc->Region.Node = *Node; + Status = AcpiNsAttachObject (*Node, ObjDesc, ACPI_TYPE_REGION); + return (Status); +} +#endif + + /******************************************************************************* * * FUNCTION: AcpiDsCreateBufferField @@ -77,8 +152,8 @@ AcpiDsGetFieldNames ( * CreateBitFieldOp, * CreateByteFieldOp, * CreateWordFieldOp, - * CreateDWordFieldOp, - * CreateQWordFieldOp, + * CreateDwordFieldOp, + * CreateQwordFieldOp, * CreateFieldOp (all of which define a field in a buffer) * ******************************************************************************/ @@ -438,11 +513,16 @@ AcpiDsCreateField ( /* First arg is the name of the parent OpRegion (must already exist) */ Arg = Op->Common.Value.Arg; + if (!RegionNode) { Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name, ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode); +#ifdef ACPI_ASL_COMPILER + Status = AcpiDsCreateExternalRegion (Status, Arg, + Arg->Common.Value.Name, WalkState, &RegionNode); +#endif if (ACPI_FAILURE (Status)) { ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status); @@ -628,6 +708,10 @@ AcpiDsCreateBankField ( Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name, ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode); +#ifdef ACPI_ASL_COMPILER + Status = AcpiDsCreateExternalRegion (Status, Arg, + Arg->Common.Value.Name, WalkState, &RegionNode); +#endif if (ACPI_FAILURE (Status)) { ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status); diff --git a/sys/contrib/dev/acpica/components/dispatcher/dsopcode.c b/sys/contrib/dev/acpica/components/dispatcher/dsopcode.c index 2821a8d7e8c..16c3fe957d9 100644 --- a/sys/contrib/dev/acpica/components/dispatcher/dsopcode.c +++ b/sys/contrib/dev/acpica/components/dispatcher/dsopcode.c @@ -523,18 +523,18 @@ AcpiDsEvalTableRegionOperands ( /* - * This is where we evaluate the SignatureString and OemIDString - * and OemTableIDString of the DataTableRegion declaration + * This is where we evaluate the Signature string, OemId string, + * and OemTableId string of the Data Table Region declaration */ Node = Op->Common.Node; - /* NextOp points to SignatureString op */ + /* NextOp points to Signature string op */ NextOp = Op->Common.Value.Arg; /* - * Evaluate/create the SignatureString and OemIDString - * and OemTableIDString operands + * Evaluate/create the Signature string, OemId string, + * and OemTableId string operands */ Status = AcpiDsCreateOperands (WalkState, NextOp); if (ACPI_FAILURE (Status)) @@ -543,8 +543,8 @@ AcpiDsEvalTableRegionOperands ( } /* - * Resolve the SignatureString and OemIDString - * and OemTableIDString operands + * Resolve the Signature string, OemId string, + * and OemTableId string operands */ Status = AcpiExResolveOperands (Op->Common.AmlOpcode, ACPI_WALK_OPERANDS, WalkState); diff --git a/sys/contrib/dev/acpica/components/events/evgpe.c b/sys/contrib/dev/acpica/components/events/evgpe.c index 61b3e6cb05d..dbef70da08d 100644 --- a/sys/contrib/dev/acpica/components/events/evgpe.c +++ b/sys/contrib/dev/acpica/components/events/evgpe.c @@ -518,6 +518,7 @@ AcpiEvAsynchExecuteGpeMethod ( ACPI_STATUS Status; ACPI_GPE_EVENT_INFO *LocalGpeEventInfo; ACPI_EVALUATE_INFO *Info; + ACPI_GPE_NOTIFY_INFO *Notify; ACPI_FUNCTION_TRACE (EvAsynchExecuteGpeMethod); @@ -573,10 +574,18 @@ AcpiEvAsynchExecuteGpeMethod ( * completes. The notify handlers are NOT invoked synchronously * from this thread -- because handlers may in turn run other * control methods. + * + * June 2012: Expand implicit notify mechanism to support + * notifies on multiple device objects. */ - Status = AcpiEvQueueNotifyRequest ( - LocalGpeEventInfo->Dispatch.DeviceNode, - ACPI_NOTIFY_DEVICE_WAKE); + Notify = LocalGpeEventInfo->Dispatch.NotifyList; + while (ACPI_SUCCESS (Status) && Notify) + { + Status = AcpiEvQueueNotifyRequest (Notify->DeviceNode, + ACPI_NOTIFY_DEVICE_WAKE); + + Notify = Notify->Next; + } break; case ACPI_GPE_DISPATCH_METHOD: diff --git a/sys/contrib/dev/acpica/components/events/evgpeutil.c b/sys/contrib/dev/acpica/components/events/evgpeutil.c index 7b27b414a0e..7f7bb3c153c 100644 --- a/sys/contrib/dev/acpica/components/events/evgpeutil.c +++ b/sys/contrib/dev/acpica/components/events/evgpeutil.c @@ -391,6 +391,8 @@ AcpiEvDeleteGpeHandlers ( void *Context) { ACPI_GPE_EVENT_INFO *GpeEventInfo; + ACPI_GPE_NOTIFY_INFO *Notify; + ACPI_GPE_NOTIFY_INFO *Next; UINT32 i; UINT32 j; @@ -412,10 +414,27 @@ AcpiEvDeleteGpeHandlers ( if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) == ACPI_GPE_DISPATCH_HANDLER) { + /* Delete an installed handler block */ + ACPI_FREE (GpeEventInfo->Dispatch.Handler); GpeEventInfo->Dispatch.Handler = NULL; GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK; } + else if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) == + ACPI_GPE_DISPATCH_NOTIFY) + { + /* Delete the implicit notification device list */ + + Notify = GpeEventInfo->Dispatch.NotifyList; + while (Notify) + { + Next = Notify->Next; + ACPI_FREE (Notify); + Notify = Next; + } + GpeEventInfo->Dispatch.NotifyList = NULL; + GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK; + } } } diff --git a/sys/contrib/dev/acpica/components/events/evxface.c b/sys/contrib/dev/acpica/components/events/evxface.c index 5634ad757fb..4027dce11ee 100644 --- a/sys/contrib/dev/acpica/components/events/evxface.c +++ b/sys/contrib/dev/acpica/components/events/evxface.c @@ -280,11 +280,9 @@ AcpiRemoveNotifyHandler ( return_ACPI_STATUS (AE_BAD_PARAMETER); } -#ifdef _UNDER_DEVELOPMENT - /* Make sure all deferred tasks are completed */ + /* Make sure all deferred notify tasks are completed */ - AcpiOsWaitEventsComplete (NULL); -#endif + AcpiOsWaitEventsComplete (); Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); if (ACPI_FAILURE (Status)) @@ -802,6 +800,10 @@ AcpiRemoveGpeHandler ( return_ACPI_STATUS (AE_BAD_PARAMETER); } + /* Make sure all deferred GPE tasks are completed */ + + AcpiOsWaitEventsComplete (); + Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS); if (ACPI_FAILURE (Status)) { diff --git a/sys/contrib/dev/acpica/components/events/evxfgpe.c b/sys/contrib/dev/acpica/components/events/evxfgpe.c index c75b4c59cc8..3a43733fdd3 100644 --- a/sys/contrib/dev/acpica/components/events/evxfgpe.c +++ b/sys/contrib/dev/acpica/components/events/evxfgpe.c @@ -295,9 +295,10 @@ AcpiSetupGpeForWake ( ACPI_HANDLE GpeDevice, UINT32 GpeNumber) { - ACPI_STATUS Status = AE_BAD_PARAMETER; + ACPI_STATUS Status; ACPI_GPE_EVENT_INFO *GpeEventInfo; ACPI_NAMESPACE_NODE *DeviceNode; + ACPI_GPE_NOTIFY_INFO *NewNotify, *Notify; ACPI_CPU_FLAGS Flags; @@ -333,32 +334,79 @@ AcpiSetupGpeForWake ( return_ACPI_STATUS (AE_BAD_PARAMETER); } + NewNotify = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_NOTIFY_INFO)); + if (!NewNotify) + { + return_ACPI_STATUS (AE_NO_MEMORY); + } + Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); /* Ensure that we have a valid GPE number */ GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); - if (GpeEventInfo) + if (!GpeEventInfo) { - /* - * If there is no method or handler for this GPE, then the - * WakeDevice will be notified whenever this GPE fires (aka - * "implicit notify") Note: The GPE is assumed to be - * level-triggered (for windows compatibility). - */ - if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) == - ACPI_GPE_DISPATCH_NONE) - { - GpeEventInfo->Flags = - (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED); - GpeEventInfo->Dispatch.DeviceNode = DeviceNode; - } - - GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE; - Status = AE_OK; + Status = AE_BAD_PARAMETER; + goto UnlockAndExit; } + /* + * If there is no method or handler for this GPE, then the + * WakeDevice will be notified whenever this GPE fires. This is + * known as an "implicit notify". Note: The GPE is assumed to be + * level-triggered (for windows compatibility). + */ + if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) == + ACPI_GPE_DISPATCH_NONE) + { + /* + * This is the first device for implicit notify on this GPE. + * Just set the flags here, and enter the NOTIFY block below. + */ + GpeEventInfo->Flags = + (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED); + } + + /* + * If we already have an implicit notify on this GPE, add + * this device to the notify list. + */ + if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) == + ACPI_GPE_DISPATCH_NOTIFY) + { + /* Ensure that the device is not already in the list */ + + Notify = GpeEventInfo->Dispatch.NotifyList; + while (Notify) + { + if (Notify->DeviceNode == DeviceNode) + { + Status = AE_ALREADY_EXISTS; + goto UnlockAndExit; + } + Notify = Notify->Next; + } + + /* Add this device to the notify list for this GPE */ + + NewNotify->DeviceNode = DeviceNode; + NewNotify->Next = GpeEventInfo->Dispatch.NotifyList; + GpeEventInfo->Dispatch.NotifyList = NewNotify; + NewNotify = NULL; + } + + /* Mark the GPE as a possible wake event */ + + GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE; + Status = AE_OK; + +UnlockAndExit: AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); + if (NewNotify) + { + ACPI_FREE (NewNotify); + } return_ACPI_STATUS (Status); } diff --git a/sys/contrib/dev/acpica/components/executer/exconfig.c b/sys/contrib/dev/acpica/components/executer/exconfig.c index 3bfe1ba4d59..6dcc77724aa 100644 --- a/sys/contrib/dev/acpica/components/executer/exconfig.c +++ b/sys/contrib/dev/acpica/components/executer/exconfig.c @@ -179,7 +179,7 @@ AcpiExLoadTableOp ( ACPI_FUNCTION_TRACE (ExLoadTableOp); - /* Validate lengths for the SignatureString, OEMIDString, OEMTableID */ + /* Validate lengths for the Signature, OemId, and OemTableId strings */ if ((Operand[0]->String.Length > ACPI_NAME_SIZE) || (Operand[1]->String.Length > ACPI_OEM_ID_SIZE) || diff --git a/sys/contrib/dev/acpica/components/tables/tbfadt.c b/sys/contrib/dev/acpica/components/tables/tbfadt.c index c6ba47f0ed3..cbf842621cb 100644 --- a/sys/contrib/dev/acpica/components/tables/tbfadt.c +++ b/sys/contrib/dev/acpica/components/tables/tbfadt.c @@ -52,12 +52,13 @@ /* Local prototypes */ -static ACPI_INLINE void +static void AcpiTbInitGenericAddress ( ACPI_GENERIC_ADDRESS *GenericAddress, UINT8 SpaceId, UINT8 ByteWidth, - UINT64 Address); + UINT64 Address, + char *RegisterName); static void AcpiTbConvertFadt ( @@ -202,13 +203,30 @@ static ACPI_FADT_PM_INFO FadtPmInfoTable[] = * ******************************************************************************/ -static ACPI_INLINE void +static void AcpiTbInitGenericAddress ( ACPI_GENERIC_ADDRESS *GenericAddress, UINT8 SpaceId, UINT8 ByteWidth, - UINT64 Address) + UINT64 Address, + char *RegisterName) { + UINT8 BitWidth; + + + /* Bit width field in the GAS is only one byte long, 255 max */ + + BitWidth = (UINT8) (ByteWidth * 8); + + if (ByteWidth > 31) /* (31*8)=248 */ + { + ACPI_ERROR ((AE_INFO, + "%s - 32-bit FADT register is too long (%u bytes, %u bits) " + "to convert to GAS struct - 255 bits max, truncating", + RegisterName, ByteWidth, (ByteWidth * 8))); + + BitWidth = 255; + } /* * The 64-bit Address field is non-aligned in the byte packed @@ -219,7 +237,7 @@ AcpiTbInitGenericAddress ( /* All other fields are byte-wide */ GenericAddress->SpaceId = SpaceId; - GenericAddress->BitWidth = (UINT8) ACPI_MUL_8 (ByteWidth); + GenericAddress->BitWidth = BitWidth; GenericAddress->BitOffset = 0; GenericAddress->AccessWidth = 0; /* Access width ANY */ } @@ -484,7 +502,7 @@ AcpiTbConvertFadt ( */ AcpiTbInitGenericAddress (Address64, ACPI_ADR_SPACE_SYSTEM_IO, *ACPI_ADD_PTR (UINT8, &AcpiGbl_FADT, FadtInfoTable[i].Length), - (UINT64) Address32); + (UINT64) Address32, FadtInfoTable[i].Name); } } } @@ -700,7 +718,8 @@ AcpiTbSetupFadtRegisters ( AcpiTbInitGenericAddress (FadtPmInfoTable[i].Target, Source64->SpaceId, Pm1RegisterByteWidth, Source64->Address + - (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth)); + (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth), + "PmRegisters"); } } } diff --git a/sys/contrib/dev/acpica/components/utilities/utmisc.c b/sys/contrib/dev/acpica/components/utilities/utmisc.c index 281bb0f65d4..62eb8179421 100644 --- a/sys/contrib/dev/acpica/components/utilities/utmisc.c +++ b/sys/contrib/dev/acpica/components/utilities/utmisc.c @@ -53,6 +53,43 @@ ACPI_MODULE_NAME ("utmisc") +#if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP +/******************************************************************************* + * + * FUNCTION: UtConvertBackslashes + * + * PARAMETERS: Pathname - File pathname string to be converted + * + * RETURN: Modifies the input Pathname + * + * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within + * the entire input file pathname string. + * + ******************************************************************************/ + +void +UtConvertBackslashes ( + char *Pathname) +{ + + if (!Pathname) + { + return; + } + + while (*Pathname) + { + if (*Pathname == '\\') + { + *Pathname = '/'; + } + + Pathname++; + } +} +#endif + + /******************************************************************************* * * FUNCTION: AcpiUtValidateException @@ -1295,5 +1332,3 @@ AcpiUtWalkPackageTree ( return_ACPI_STATUS (AE_AML_INTERNAL); } - - diff --git a/sys/contrib/dev/acpica/include/acdebug.h b/sys/contrib/dev/acpica/include/acdebug.h index bcc505c8d51..f89cf378fa0 100644 --- a/sys/contrib/dev/acpica/include/acdebug.h +++ b/sys/contrib/dev/acpica/include/acdebug.h @@ -405,7 +405,7 @@ AcpiDbLocalNsLookup ( char *Name); void -AcpiDbUInt32ToHexString ( +AcpiDbUint32ToHexString ( UINT32 Value, char *Buffer); diff --git a/sys/contrib/dev/acpica/include/acdisasm.h b/sys/contrib/dev/acpica/include/acdisasm.h index 6618de62026..890b6743ed6 100644 --- a/sys/contrib/dev/acpica/include/acdisasm.h +++ b/sys/contrib/dev/acpica/include/acdisasm.h @@ -518,6 +518,14 @@ void AcpiDmMethodFlags ( ACPI_PARSE_OBJECT *Op); +void +AcpiDmPredefinedDescription ( + ACPI_PARSE_OBJECT *Op); + +void +AcpiDmFieldPredefinedDescription ( + ACPI_PARSE_OBJECT *Op); + void AcpiDmFieldFlags ( ACPI_PARSE_OBJECT *Op); diff --git a/sys/contrib/dev/acpica/include/acglobal.h b/sys/contrib/dev/acpica/include/acglobal.h index 79e53d07e2c..5535c1dc517 100644 --- a/sys/contrib/dev/acpica/include/acglobal.h +++ b/sys/contrib/dev/acpica/include/acglobal.h @@ -479,4 +479,14 @@ ACPI_EXTERN UINT32 AcpiGbl_SizeOfAcpiObjects; #endif /* ACPI_DEBUGGER */ + +/***************************************************************************** + * + * Info/help support + * + ****************************************************************************/ + +extern const AH_PREDEFINED_NAME AslPredefinedInfo[]; + + #endif /* __ACGLOBAL_H__ */ diff --git a/sys/contrib/dev/acpica/include/aclocal.h b/sys/contrib/dev/acpica/include/aclocal.h index 68ea95b7c8a..0f79fa2a00b 100644 --- a/sys/contrib/dev/acpica/include/aclocal.h +++ b/sys/contrib/dev/acpica/include/aclocal.h @@ -462,6 +462,15 @@ typedef struct acpi_gpe_handler_info } ACPI_GPE_HANDLER_INFO; +/* Notify info for implicit notify, multiple device objects */ + +typedef struct acpi_gpe_notify_info +{ + ACPI_NAMESPACE_NODE *DeviceNode; /* Device to be notified */ + struct acpi_gpe_notify_info *Next; + +} ACPI_GPE_NOTIFY_INFO; + /* * GPE dispatch info. At any time, the GPE can have at most one type * of dispatch - Method, Handler, or Implicit Notify. @@ -469,8 +478,8 @@ typedef struct acpi_gpe_handler_info typedef union acpi_gpe_dispatch_info { ACPI_NAMESPACE_NODE *MethodNode; /* Method node for this GPE level */ - struct acpi_gpe_handler_info *Handler; /* Installed GPE handler */ - ACPI_NAMESPACE_NODE *DeviceNode; /* Parent _PRW device for implicit notify */ + ACPI_GPE_HANDLER_INFO *Handler; /* Installed GPE handler */ + ACPI_GPE_NOTIFY_INFO *NotifyList; /* List of _PRW devices for implicit notifies */ } ACPI_GPE_DISPATCH_INFO; @@ -480,7 +489,7 @@ typedef union acpi_gpe_dispatch_info */ typedef struct acpi_gpe_event_info { - union acpi_gpe_dispatch_info Dispatch; /* Either Method or Handler */ + union acpi_gpe_dispatch_info Dispatch; /* Either Method, Handler, or NotifyList */ struct acpi_gpe_register_info *RegisterInfo; /* Backpointer to register info */ UINT8 Flags; /* Misc info about this GPE */ UINT8 GpeNumber; /* This GPE */ @@ -960,6 +969,7 @@ typedef struct acpi_parse_state #define ACPI_PARSEOP_IGNORE 0x01 #define ACPI_PARSEOP_PARAMLIST 0x02 #define ACPI_PARSEOP_EMPTY_TERMLIST 0x04 +#define ACPI_PARSEOP_PREDEF_CHECKED 0x08 #define ACPI_PARSEOP_SPECIAL 0x10 @@ -1311,4 +1321,20 @@ typedef struct acpi_debug_mem_block #define ACPI_NUM_MEM_LISTS 2 +/***************************************************************************** + * + * Info/help support + * + ****************************************************************************/ + +typedef struct ah_predefined_name +{ + char *Name; + char *Description; +#ifndef ACPI_ASL_COMPILER + char *Action; +#endif + +} AH_PREDEFINED_NAME; + #endif /* __ACLOCAL_H__ */ diff --git a/sys/contrib/dev/acpica/include/acobject.h b/sys/contrib/dev/acpica/include/acobject.h index f2f8a1cfb11..e0f4a525986 100644 --- a/sys/contrib/dev/acpica/include/acobject.h +++ b/sys/contrib/dev/acpica/include/acobject.h @@ -94,7 +94,7 @@ #define AOPOBJ_AML_CONSTANT 0x01 /* Integer is an AML constant */ #define AOPOBJ_STATIC_POINTER 0x02 /* Data is part of an ACPI table, don't delete */ -#define AOPOBJ_DATA_VALID 0x04 /* Object is intialized and data is valid */ +#define AOPOBJ_DATA_VALID 0x04 /* Object is initialized and data is valid */ #define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized, _REG was run */ #define AOPOBJ_SETUP_COMPLETE 0x10 /* Region setup is complete */ #define AOPOBJ_INVALID 0x20 /* Host OS won't allow a Region address */ @@ -124,7 +124,7 @@ typedef struct acpi_object_integer /* * Note: The String and Buffer object must be identical through the Pointer - * and length elements. There is code that depends on this. + * and Length elements. There is code that depends on this. * * Fields common to both Strings and Buffers */ @@ -389,7 +389,7 @@ typedef struct acpi_object_notify_handler ACPI_OBJECT_COMMON_HEADER ACPI_NAMESPACE_NODE *Node; /* Parent device */ UINT32 HandlerType; /* Type: Device/System/Both */ - ACPI_NOTIFY_HANDLER Handler; /* Handler addess */ + ACPI_NOTIFY_HANDLER Handler; /* Handler address */ void *Context; union acpi_operand_object *Next[2]; /* Device and System handler lists */ @@ -405,7 +405,7 @@ typedef struct acpi_object_addr_handler ACPI_NAMESPACE_NODE *Node; /* Parent device */ void *Context; ACPI_ADR_SPACE_SETUP Setup; - union acpi_operand_object *RegionList; /* regions using this handler */ + union acpi_operand_object *RegionList; /* Regions using this handler */ union acpi_operand_object *Next; } ACPI_OBJECT_ADDR_HANDLER; diff --git a/sys/contrib/dev/acpica/include/acpiosxf.h b/sys/contrib/dev/acpica/include/acpiosxf.h index 8106d8a8ecb..c7280e76f26 100644 --- a/sys/contrib/dev/acpica/include/acpiosxf.h +++ b/sys/contrib/dev/acpica/include/acpiosxf.h @@ -275,7 +275,7 @@ AcpiOsExecute ( void AcpiOsWaitEventsComplete ( - void *Context); + void); void AcpiOsSleep ( diff --git a/sys/contrib/dev/acpica/include/acpixf.h b/sys/contrib/dev/acpica/include/acpixf.h index ff391e8cb17..9e1bcf17b41 100644 --- a/sys/contrib/dev/acpica/include/acpixf.h +++ b/sys/contrib/dev/acpica/include/acpixf.h @@ -48,7 +48,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20120420 +#define ACPI_CA_VERSION 0x20120620 #include #include diff --git a/sys/contrib/dev/acpica/include/acpredef.h b/sys/contrib/dev/acpica/include/acpredef.h index c17a6d91454..c5b115eca37 100644 --- a/sys/contrib/dev/acpica/include/acpredef.h +++ b/sys/contrib/dev/acpica/include/acpredef.h @@ -512,14 +512,14 @@ static const ACPI_PREDEFINED_INFO PredefinedNames[] = {{"_TMP", 0, ACPI_RTYPE_INTEGER}}, {{"_TPC", 0, ACPI_RTYPE_INTEGER}}, {{"_TPT", 1, 0}}, - {{"_TRT", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 2Ref/6Int */ + {{"_TRT", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 2 Ref/6 Int */ {{{ACPI_PTYPE2, ACPI_RTYPE_REFERENCE, 2, ACPI_RTYPE_INTEGER}, 6, 0}}, - {{"_TSD", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5Int with count */ + {{"_TSD", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5 Int with count */ {{{ACPI_PTYPE2_COUNT,ACPI_RTYPE_INTEGER, 5,0}, 0,0}}, {{"_TSP", 0, ACPI_RTYPE_INTEGER}}, - {{"_TSS", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5Int */ + {{"_TSS", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5 Int */ {{{ACPI_PTYPE2, ACPI_RTYPE_INTEGER, 5,0}, 0,0}}, {{"_TST", 0, ACPI_RTYPE_INTEGER}}, diff --git a/sys/contrib/dev/acpica/include/actypes.h b/sys/contrib/dev/acpica/include/actypes.h index 4a5188544e7..53ebc91b086 100644 --- a/sys/contrib/dev/acpica/include/actypes.h +++ b/sys/contrib/dev/acpica/include/actypes.h @@ -731,8 +731,9 @@ typedef UINT8 ACPI_ADR_SPACE_TYPE; #define ACPI_ADR_SPACE_IPMI (ACPI_ADR_SPACE_TYPE) 7 #define ACPI_ADR_SPACE_GPIO (ACPI_ADR_SPACE_TYPE) 8 #define ACPI_ADR_SPACE_GSBUS (ACPI_ADR_SPACE_TYPE) 9 +#define ACPI_ADR_SPACE_PLATFORM_COMM (ACPI_ADR_SPACE_TYPE) 10 -#define ACPI_NUM_PREDEFINED_REGIONS 10 +#define ACPI_NUM_PREDEFINED_REGIONS 11 /* * Special Address Spaces diff --git a/sys/contrib/dev/acpica/include/acutils.h b/sys/contrib/dev/acpica/include/acutils.h index e9c9b95dda1..d720fcc92a1 100644 --- a/sys/contrib/dev/acpica/include/acutils.h +++ b/sys/contrib/dev/acpica/include/acutils.h @@ -429,7 +429,7 @@ AcpiUtDumpBuffer ( UINT8 *Buffer, UINT32 Count, UINT32 Display, - UINT32 componentId); + UINT32 ComponentId); void AcpiUtDumpBuffer2 ( @@ -703,6 +703,10 @@ AcpiUtShortDivide ( /* * utmisc */ +void +UtConvertBackslashes ( + char *Pathname); + const char * AcpiUtValidateException ( ACPI_STATUS Status); diff --git a/sys/contrib/dev/acpica/os_specific/service_layers/osunixxf.c b/sys/contrib/dev/acpica/os_specific/service_layers/osunixxf.c index 189bfcdd955..5be58a7e523 100644 --- a/sys/contrib/dev/acpica/os_specific/service_layers/osunixxf.c +++ b/sys/contrib/dev/acpica/os_specific/service_layers/osunixxf.c @@ -1241,3 +1241,24 @@ AcpiOsExecute ( } #endif /* ACPI_SINGLE_THREADED */ + + +/****************************************************************************** + * + * FUNCTION: AcpiOsWaitEventsComplete + * + * PARAMETERS: None + * + * RETURN: None + * + * DESCRIPTION: Wait for all asynchronous events to complete. This + * implementation does nothing. + * + *****************************************************************************/ + +void +AcpiOsWaitEventsComplete ( + void) +{ + return; +} diff --git a/sys/contrib/dev/iwn/iwlwifi-6000g2a-17.168.5.3.fw.uu b/sys/contrib/dev/iwn/iwlwifi-6000g2a-17.168.5.3.fw.uu new file mode 100644 index 00000000000..30b874425f1 --- /dev/null +++ b/sys/contrib/dev/iwn/iwlwifi-6000g2a-17.168.5.3.fw.uu @@ -0,0 +1,7833 @@ +Copyright (c) 2006-2011, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +begin-base64 644 iwlwifi-6000g2a.17.168.5.3.fw.uu +AAAAAElXTAo2MDAwZzJhIGZ3IHYxNy4xNjguNS4zIGJ1aWxkIDQyMzAxCgAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAwWoET2lAAABAAAAAAAAAAEAAAAASAIAICCADwAAQABpIAAAaSBAAGkg +AABpIEAAICCADwAA6ABpIAAAaSBAAGkgAABpIEAAICCADwAApPZpIAAAaSBAAGkgAABKIAAASiEA +AEoiAABKIwAASiQAAEolAABKJgAASicAAEogABBKIQAQSiIAEEojABBKJAAQSiUAEEomABBKJwAQ +SiAAIEohACBKIgAgSiMAIEokACBKJQAgSiYAIEonACBKIAAwSiEAMAokgD+BAABAQSycMEAsnDBC +JBw0CiKAP4AAWG8KIwA3xgpAB0omAHBpIEAASiYAcEomAHBKJgBwSiYAcAAWAHCAAFQcQHggIECH +AAAAAAAAAAAAAPwciLb8HEi2/BwItvwcyLX8HIi1/BxItfwcCLX8HMi0/ByItPwcSLT8HAi0/BzI +s/wciLP8HEiz4H7geATcON018OB4BNw03TPw4HgE3DDdMfDgeATcLN0v8OB4BNwo3S3w4HgE3CTd +K/DgeATcIN0p8OB4BNwc3Sfw4HgE3BjdJfDgeATcFN0j8OB4BNwQ3SHw4HgE3AzdH/DgeATcCN0c +8OB4BNwE3RnwNBQaMDAUGTAsFBgwKBQXMCQUFjAgFBUwHBQUMBgUEzAUFBIwEBQRMAwUEDACxwHG +sCRNM7AkHzPgfvHATg/P/89xoACsLxiBz3WgAMgfIN6auBihBdjQpUMdGBAA2DYI4BGNuNGljQfP +//HAHg/P/89xoACsLxiBz3WgAMgfIN6zuLq4GKFk2NClQx0YEADYBgjgEY240aVdB8//4HjgfuB4 +4H7geOB+4HjgfuB4CiJAgADZ7gABAC8mAPBKJkAATgAGAE8AIACKJf8P4HgKIkCAANnOAAEAbAAk +AC8mAPBcAAUAKwg1CEomQAAIcQDYAiG+gOAgxQdCeQHgAiG+gOAgxQdCeesH7/8B4C8tAQBAJUUA +AiZ88QAAIAAAKEAB6CBiAy8gAIAvIUsAAiG+gMAghgHCIYYA4H4RACAASiAAEEogQBAOIkIALyAL +Es4gRYCKJf8PCAAFAC8tAQBAJUUAAiZ88QAAIAAAKEABSiZAAOggIgMvIACALyFLAAIhvoDAIIYB +wiGGAEomAABCIP6QziCCAUQgfpDOIYIB4H65AAAA4HgKJIDwBSBEAOAgwQdEJP6AQSrEAIQAAgAv +JALxQiEBAUIgAwHoIKIEBBEEAgQRBQIEEQYCBBEHAgQbCAEEG0gBBBuIAQQbyAEsACUARCI+gTwA +IgBEIvyAQCHBAOAgwQdAI8MAqCCAAQERhAIBGwoBICDABwQRBAIEEQUCBBsIAdQH4f8EG0gBRCL8 +gAQRBALJB+//BBsIAUIhQQBCIEMAqCCAAQERhAIBGwoBICDABwomAPCKIL8PyiBkAOB/LyADAOB/ +iiD/D/wciLH8HEix/BwIseHD4cLhweHAB8AcHMAx4cDgfwHA8cDhxc9wgADIHU2Az3WAAEiaIIW3 +uri6BCGBDwMAAAAHuUV5LaBqC6ARANgAhc9xgAAQyVEggILPcIAA+LJMiBVqx3CAABDGYIBWeUGB +BvKVu2Cgq7oF8LW7YKCLuguNQaGjuAkF7/8LreB4osHxwIYMz/9Fwc91gADIHSeFMHAI9DCVFBQO +MTB2BPRZHYIQz3GAABwjMYEwcA70z3GAACwjPJEUFA0xMHUG9M9xgACUI0mpgOIM9M91gABIB8GN +gOYA2cogQQAl8iGtjuIE9AHYIfBBKA0CB31BKAEEp3nPd4AASAegj1MlRRFMJQCExrmN9gohwA/r +cs9wAADNG5/bOQQgAYokgw9RJYCRBvIA2AzcSwTP/892gACQyBYmTRGnjaCvyXUWJU0RAKUUFAAx +Rq3HcYAAkMUCtQCJB60AGUIBABtCAcTx4HgIyM9yoADIHw4aGIAJyA8aGIAKyBAaGIALEgE2Asgk +eBEaGIAMyC0aGIDgfvHA4cUB2M9xoADIHxOhGIGswUnAGYHPdYAAmKXPcYAAsCBKwACBobgAoQiF +4LgK8lEgwIEG9B4JwAVmD2AHFtiLcalwGgqgDiTaz3CAAOwHIIACiYDgE/QEiVEgAIAP8gvIBCCA +D/7//wMLGhgwC8iGuIy4j7iQuArwC8gFIIAPAQAA/AsaGDALyKy4CxoYMEYPz/+LcDDZkNoe23YJ +4A0YuyjAgeDKIcIPyiLCB8oggg8AAOocyiOCDwAA9wDKJCIAAAMiAcolIgDGCsAFgOAH9B4O4AAA +2AIJIA4G2BkD7/+swM9xgADsbuB/CGHgePHAngnABc9xgAAYGPAhAABAeIDZz3CgANAbMKDRwOB+ +8cByCu//D9nPdYAAoM4AFgBAABYAQFUlThQApd4O4BAEbclwmg7gECKVHpXPcYAA7AfaYNhgARCF +AEwlAIBAoRP0AoXwuMohwQ/KIsEHyiCBDwAA6RzKI4EPAAC8AFQCIQHKJGEAeQLP/+B4gOHKJE1w +4HjoIC0Cz3GgAFAMJYEBGFIA4H7gePHA5gnP/89wgADIHQOAGBCFAEwlAIEM9AohwA/rcoogTQNc +2wUCIAFKJAAAiiAHDr4IIAcA2c92gAC8pS2OgOEE8gyOEHEM9qYIIAeKIIcNiiCHDZoIIAcsjmTw +z3CgALAfG4DPd4AAmJcCp4ogSQZ+CCAHbtmKIAkGdgggByKHTI4Njs9xgAAQzmiRQKdwcM91gABw +sAGni/YIsQDZTR1CEAHZLKU1hTBww/cVpRCOBKURjoDgBPKA4gTyANgL8M9wgADIHQOACYBRIICA ++PMB2AKliiBJBhYIIAeO2YogCQYOCCAHIocChSCHgODKIGIAGLgFeQSFCiIAgIogCQbKImIAELrq +D+AGRXkMjoDgBfQChYDgeAhBBe4MYAcC2C0Bz/+iwfHAvgjv/5hyRcFBKAECB3lBKAIEJ3rGus91 +gACQxUll57ldZRP0FBQOMc9zgACQyGhyNnrggvFwBfTiktF3B/Iniue5p2r18wDYKPDGioDmB/SA +389wgABIB+Goz3eAABweBY8QdgT0gNgFrwrwz3eAAJQjCY8QdgT0gNgJr8aKNnsAHIADB4qHuQCt +z3CAAEgHQIggqAHYR6sM3I8Az//geKHB8cADEgI313IAAABAAdrCIooAF7rHcgAOAACDuuxzQKPs +cgCi+gugBChw0cDgf6HA4Hil4B/yCfaD4BXyhOAX8oXgG/TgfwHYveAP8gb2reAV9OB/AtjM4A/y +jCBDhw304H8G2OB/ANjgfwPY4H8E2OB/BdjgfwfYCNjgfuB48cDhxYogUg6eDuAGrdnPdYAA4DKp +cEAlgRtmDmAOLtoB2PUHr/9hHQIQ4HjxwG4Pj/+C4Ah2jfcKIcAP63L92Iu4c9tKJAAAmQfgALhz +z3eAAOAyF4cQdgf0z3CAAEAzyGCA4G3yGgsgCAXYGnCKIBIONg7gBslxRC6+GwAnQB5AkCGQCLpF +ec9ypAC4PZsaWAAikMoaWAAjkMsaWAAkkMQaWAAlkMYaWAAmkMcaWAAnkMIaWAAokMMaWAApkMUa +WAAqkKMaWADPcYAAyB0jgSiBUSEAgM9xpAC0RQDdDPJskEuQe3tlelMZmIBNkFQZmIAG8FMZWINU +GViDTpBWGZiAT5BYGZiAUJBVGZiAUZBXGZiAUpBaGZiAU5BcGZiAVJBZGZiAFZBbGRiAegkgCApw +16cAJoAfgABAM6CowQaP/+B48cDuC+//4cUOCoAEz3CAAMgdA4AYiIHgLfTPcYAAoM7PcoAAVFsA +gmCBYKAAghzbYKgEaQGiz3CAABQIA6FVIUAEA6IY2AKiVSHABQWiAYEA3VoZRAMEogKBrbgODqAF +AqGA4Af0ZgngAKlwSgzgDQbYYQaP/+B4huDxwADYD/TPcIAA2KXWC+//BtnPcYAAeKYAgYK4AKEB +2NHA4H7geIPg8cAA2An0z3CAANClrgvv/wPZAdjRwOB+4HjxwIHg4cUA2An0z3CAANOlAd2OC+// +qXGpcP0Fj//gePHAluDhxQDYjPfPdYAASJqpcG4L7/8E2QuNg7gLrQHY1QWP//HAmuDhxQDYjPfP +dYAASJoEbUoL7/8E2QuNgrgLrQHYsQWP//HApMGQ4ADZyiBCABP0i3AmC+//ENkAFAAxhODMIGKB +CPTPcIAAbLIfgPW4AvJMcAHYpMDRwOB+8cD6DI//CHfPcIAAyB0DgBiIhOAacUnyhOcA3YwAJQDK +IEUDz3aAALylQCYAE9IK7/8E2S6OsK5TIQAAEa5BKMAgoLkwcGIAJQACIEIAY7/xclYABgCA4g7y +z3GgANAPEBEAhmG6WGAQGRiAJREAhg94A/APjgDZUyCCIA8hgQAkeC8mB/DPcZ8AuP8QrhiBzyDi +B9Ag4QcYoRiBnrgYoRiBvrgYoQHYtQSP//HATgyP/xpwTCAAoaHBugAlAADYi3AE3ToK7/+pcQDA +z3agANAP13CaCVBvRfQX8CUWA5YlFgKWLyTHACUWAJZPfw99TCQAgwi9pX8L8hAWAJb9YfhgEB4Y +kCNtEnHq9yjwgufMJ+KTzCcil8olQhAg9M91gADYpUetJRYClgitSa0lFgKWZq2P50qtomkJ9M9w +gADjpb4J7/8N2Q3lnOcI9M9wgADwpaoJ7/8N2Q3lAiBBIwPwQiABIRAWAJY4YBAeGJAB2O0Dr/+h +wOHE/BzIvvwcSL7hwOHB4cLhw/wcCLH8HEix/ByIsfwcyLH8HAiy/BxIsvwciLL8HMiy/BwIv2ok +gBDhxGokwBDhxPHAz3CgANAbFIDPcYAASAYEIICPz1EE4QChEfL2uC8pAQAF8i8pgQ9AAAAAz3CA +AJwt8CBAAEB4Zg+P/9HAwcRrJMAQwcRrJIAQwcSfdAQUCzQEFAo0BBQJNAQUCDQEFAc0BBQGNAQU +BTQEFAQ0wcPBwsHBwcDBxEUsfhAKJkB+wcRrJIAUwcQgIECH4HiMIFyCAdjgf8IgCwDxwK4Kr/9K +JEAAz3aAAMgdFSYDEKCDQCYAFRB1wiQCAfAmDhGKIBUFJOYwJgUQTCUAgAryCiHAD+tyjtiNuLEC +4ABz2x5lyYa4YMV5KaBggwbYMCOBDwAAeAVGeGh0gCQVHiR40g5gEQCksQKP/+B48cA6Cq//iiAM +Cc91gABsBiSFMgnABgSFgOBF9M92gADYqBEWApYA34QqCAgAIYB/gADcoAKlJIgB24Dh66VspSHy +Gx7YkwwQBQAEJYEPwP8AAEEpBAbPcYAAEM4UEQYABS4+AQAhhH8/AP//BCRBARweWJAgkIwhgoYB +2cIhTgAqpeelJIDPdoAAFKXAuSa2z3aAAPQoKK5ArgKIZKUBrh/wBIWB4B305gzACADYBKUChSSI +gOET9CeFHOA2eCSIz3CAALwgGogQcQHZwHnPcIAA8CggoALYAvAB2AOlxQGv/wHY8cBWCa//iiAM +CqPBz3WAAGwGJIVKCOAGAN4EhYDgJ/SqC0AAAdgEpQKFBIiA4F4CAQDPcIAA8CgAgIDgTgICAM9w +oAAsIAOAz3KAADilIYIZYc9wgADgKACAOGBqCaAPAKKA4CYCAQB78ASFguBC9AqFgOAP9AwVBBAQ +FQUQCiHAD+tyz3AAAIoMEQHgAIojTgkihUeFQCEAB1Z4RohgwkaIARyCMEaIAhyCMEeIYcJHiAUc +gjAHiAYcAjCKIFMBng+gBqgRAQAChYtx2g+gDagQAADPcKAALCAjgM9wgAD0KCGg6grgAMWlA9gE +pc/wBIWD4Dn0QoUnhUAiAAc2eAWIUSBAgRLyA5LPcaAALCAjgc9zgAD0KGGDCrhieTBwBPcJ2Aul +i/AFhYDgDPQEioDgrfLPcIAAOKWOCKAPAICA4KXyBYWA4AXyBdgLpQHYCPDPcIAA8CgAgIDgl/QA +2LIOAAeT8ASFgeBs9M4NAAMihUeFQCEAB1Z4RYjguhjyg7pFqM9zgACQOsmDz3KAALyk2qL5g8WD +/mbboviDxIP+Ztyiw4N3g35m3aIFiFEgQIAs8pIOQA+A4BH0CiHADwKF63IcFQUQBBCEAM9wAACL +DMkHoACKI88Nhg5gDwLYEg5gDwjYIoUEiYLgCfQB2AClANgOpf4NYA9a2CKFBImB4AT0AdgBpQeF +HOEWeQWJhiD/jMoggg8AADBDxAtiBMohIgAChSeFHOA2eAWIhiD+hwXyAtgEpSnwBNgEpSfwJIWE +4QHYI/QPpc93oADIHzyHz3CAAPQoIaAGDqAGiiAMCs9wgAD0KAzZddoe234NYA0YuxWHz3GAAOgo +dgpgASCBBqXEpQTYA6UB2DEHb/+jwOB48cDGDm//iiCMCc91gABsBiSFug2ABgSFgOBA9CKFR4VA +IQAHVnhEiM9wgAC4BgCQEHIB3g70z3CAALoGQJDPcIAAFKUGkBByBPTEpQDYUfAEiYDgH/LPcIAA +8CgAgIDgGfTPcIAAOKUhgM9wgADkKACAhghgBjhggOAN9IogTA1KDaAGiiENBfYMIAcA2AHYL/DE +pQHYLfAEhYHgK/QChc9ygADIHSOCZIBooSOCZYAc4GmhJ4U2eCSIA4IA3jSwAtgE2VYL7//Jcs9z +gAAUpUKFB4VAIgEHFnkGkySJRILGDiAMyXPEpQPYA6UB2EUGT/8MFQQQEBUFEAohwA/rcs9wAACJ +DAEGoACKI80O4HjxwLINT//PdoAAbAYEhoDgocE69CSGpgygBoogjArPcYAA8CgB2AChANgPpgCm +AaaKIJMBhgygBoohGQMC3alw1gmgBAHZz3eAAMgdI4cwIYAPAAB0BSh0gCQVHQDZprgApKlwpgrv +/wTa4gsgEalwI4dIgTSRUyIAAB4OIAwB26SmaPAEhoLgMvQkhi4MoAaKIIwKz3GAALgGiiCMDB4M +oAYgkc9xgAC6BoogzAwODKAGIJEChgSIgOAY8gmGgOAU9M9ygAA4pQSCI4IOIIMPBwAgoTBzSPcH +2AumAdgMpgmmBPA4YAOiA9gz8ASGg+AP9CSGxgugBoogjAoLyAQggA////8DCxoYMATYIfAEhoTg +IvQkhqYLoAaKIIwKUyDAQM9xgADEW/4OIAAAoc9wgAC8pDiAz3CAAPSihCkICDAgQA5RIECABdjK +IKEBBKYB2CDwBIaF4AHfH/TPdYAAvKQYhQTZmdoe20DAi3DaCmANGLsYhemmhCgICAAhgH+AAMyi +KoChuSqgBtgEpgDYiQRv/6HABIaG4Nz1BtgDpgDY1/HxwA4MT//PdYAAbAYEhYDgpMEN9CSFAgug +BoogjAgChQSIgOAX9ALYBKUEhYHgT/QFhYDgP/TPcKAAsB8bgM9xgAB8XRILYA8ggYDgLvQA2DLw +AN7Fpc93oADIHxWHz3GAAOQoRg8gASCBz3GAAHxdBNrJcwChpBcHEM9wAAAUc0DABdhBwAHfQsdD +xslwBtmYdrh2ACeHDwcAIKF2CaAE2HbkpelwMfBWCaAEBdgE2ALwBdiA4AHaA/QB2CXwKYWB4RDy +TKULpQzwBIWC4Bz0JIVGCqAGiiCMCAmFgeAE9AHYD/CA4Ov1AoX6DmAEA4AIcc9wgAAkWdILAA8A +2E4IwAbd8QDYcQNv/6TA8cACC2//iiBMCc91gABsBiSF+gmgBqTBBIWA4Kn0AoVHhSSAVnjPcoAA +vCAEIYEPAAYAAIDhAdl6iiAQjgDAeXB2CfTPd4AAFKXml9iK8XYD8gDeBfDWitFx/fUB3oDmz3GA +APAowKEV9M9xgAC4BiCRMHMP9M9xgAC6BiCReIowcwn0z3GAALwGIIlWijByA/IA2QLwAdmA4WPy +HBAEAM9wgAA4pQQYAAHPcIAAmJcEEAUAz3CAABDOBYAFKH4BQCmAcpBwyiLOB8ogjg8AAIgMyiOO +DwAA+AJsAq4AyiHOD89wgADkKACATgwgBoBwgOAF9NIPAA5P8AvIBCCAD////wMLGhgwz3CAAGRd +AIgA3oDgxaUK9M9woAAsIBCAx3AHACChEqVIFQcQz3AAAOByQMAF2EHAAd9Cx0PG6XAG2QTaANuY +c7hzvg9gBNhzz3CAAGRdwKjkpelwHvAA2M9xgABkXQCpAtkjpRbwBIWB4AHeEfQFhYDgHfTPcIAA +OKUhgM9wgADkKACAqgsgBjhggOAF8gHY0QFv/6TAz3CAAGRdwKhOD2AEBdgA2ASlovEF2Aulig6g +BslwANnPcIAAZF0gqOnx8cA2CU//z3aAAGwGBIaA4G30AoYEiIDgFPLPcIAA8CgAgIDgDvTPcIAA +OKV+CWAPAICA4Abywg/gBgDYTwMAAM91oADIHzyFz3CAAPQoAYBHhgJ5AoZWeAeAEHGF9wHYBKYr +AwAAAIaA4AvyUSNAwAfyAtgVHRiQXg8gDx7YFYXPdoAAbAb+DyAPJoaA4P4CAQAVhc9xgADoKD4M +IAEggQamAoYnhhzgNngFiIYg/4wJ8s9wAAAwQ89xgAAQKQoNAAQChieGHOA2eAWIUSBAgLoCAQAA +hoDgBfIfhYDgrgICAMoMAASnAgAABIaB4JP0JIZSD2AGiiBMCs9xoAAsICOBQg9gBoogTAoChieG +HOA2eAUQhgAA3VEmAICvpj7yz3KAAPQoz3CAAJA6eIAkgHlhz3OAALyk/IO4qlwQBAAMEAUAACUF +AXQTBADieQIlBQH6gyQQBAACJMSDe4MFgGJ4yidBEwTyAd/4qoDhD/JALIMAcHGF908ngBAF8IDg +BfJPJ0AQD38YqkEpwAA4YLBwRPeCv/iqUSZAgC3yAIaA4A7yz3GgACwgJoEOhiJ4z3GAAPQoBaGg +pgbwAYaA4ALyoabmCwAEVg4AD4LgEvLrdU4OAA8MFgQQuHDPcAAAjAwKIcAPqXKVB2AAiiPTCFIO +IA8A2AKGJ4Yc4DZ4BYiGIP+MBPIC2ASmwfAE2ASmvfAEhoLgDPTPcAAAMEPPcYAAECmiCwAEBNgE +pgSGhOCw9CSGDg5gBoogTArPcKAALCAjgM9wgAD0KEAgEAc3oPINYAaKIIwNIoYcFgQQQCEABxYg +AAEFiFEgAIAA3R7ySiTAcKlyqXOoIIAB8CDAIAHjGmID30okQHEA26gggAHwIMAjAecbY1BzyPfP +coAA9CgYioK4GKrPcIAAOKWjoEyRQCRAAFBwB6ZH94YRAAZRIECABvIB2C4N4AYMpl/wbgugBguG +C8gEIIAP////AwsaGDCqCaAIq6aKIEwNVg1gBoohVAsHhiKGFnmKIEwNQg1gBieBAtgDpgKGz3KA +APAoJIiA4Q/0J4Yc4DZ4JIjPcIAAvCAaiBBxAdjAeACiLPAggoDhBfIB2AOmJvAnhjZ4HBAEAM9w +gAA4pQQYAAHPcIAAmJcEEAUAz3CAABDOBYAFKH4BQCmAcpBwyiLOB8ogjg8AAI0MyiOODwAARQX8 +BW4AyiHOD6SmEQYv/wHYDBYEEBAWBRAKIcAP63LPcAAAjgzZBWAAiiOVA/HAz3CAAPAoAICA4Bby +z3CAABwuAICA4BT0ngoABoDgC8jFIIIPAQAA/Ar0BSCADwAAADwLGhgwC8iQuAsaGDBSDAAG0cDg +fvHARg0P/891oAA4LgeFz3EAABQsqLgHpfoI4AYN2M92gABcLzCGB4UleAeliiAVDB4MYAaKIYsK +iiAVDBIMYAYwhs9wgABoIyyQz3CAAMgdHpAA3xBxC8jwpgvyBSCADwAAANQLGhgwC8iQuAXwBSCA +DwEAAPwLGhgwJglP/0oL4AAC2CkFD//xwJoJwACG4BT0z3GAAJiliiCVB7ILYAYogc9wgAB0WuYM +wA4aC+AACNi2COAGCdjRwOB+8cBmCcAAiuAU9M9xgACYpYoglQd+C2AGKIHPcIAAdFqyDMAO5grg +AAnYggjgBgnY0cDgfvHAMgnAAIfgFPTPcYAAmKWKINUHSgtgBiiBz3CAAHRafgzADrIK4AAF2E4I +4AYJ2NHA4H7xwP4IwACL4BT0z3GAAJiliiDVBxYLYAYogc9wgAB0WkoMwA5+CuAAAtgaCOAGCdjR +wOB+8cBr2PIKYAaKIQcFCgigAATYCiUAgMohwg/KIsIHyiCCDwAA3w7KI4IPAADXAQQEYgDKJGIA +0cDgfuB48cCuCw//z3GAAPw8CYEB4Amhz3GAAHQcAIEB4IHgAKEQ9AHYz3WgAMgfUR0YkCDe0KVD +HRgQANiKDOAQjbjRpc9wwABHaM92oADsJwamz3GAAFQyBIGB4BH0BoHPd4AAVLBAeBiPgOAX9M9w +AQAGAQamz3ASAAYEFvAKIcAP63LPcAAAhxmKI0UASiQAAGkDYAAKJQABz3ABAAcBBqbPcBIABwQG +pmCHz3IAAAIzgOPPcQAAgkwDhxnyRCh+AwAhjX+AAOxmxtiSuAamz3A5AAIzBqbPcDkAgkwGps9w +OQACZgamx9iVuBLwRCh+AwAhjX+AAKRnx9iSuAamRqYmps9wAAACZgamxtiVuAamXg5ABwHYz3Gq +AOAHE6EYj7YJYA0gh89wEACHcgamAY0QuAUggA8AAEJyBqYFjRC4BSCADwAAQnAGpgSNELgFIIAP +AACCcAamA40QuAUggA8AAMJwBqYCjRC4BSCADwAAAnEGpgmNELgFIIAPAABCcQamCI0QuAUggA8A +AIJxBqYHjRC4BSCADwAAwnEGpgaNELgFIIAPAAACcgamC40QuAUggA8AAIJzBqYKjRC4BSCADwAA +xnMGps9wAQBGagamz3WgAMgfpBUQEM9wgAAGdAamz3CAAAd0BqbPcIAAxnMGps9wQABCdAamz3CA +AMdzBqbPcAIARmoGps9wEADGagamWI8AjySPgOIB2sB60ghgEHmPJNgY2cYK4BAz2oHgE/LPcIAA +/DwkEAQADBcFEAohwA/rcs9wAACKGa0BYACKI0YPz3AQAMdqBqbPcBAAhnIGpgoPQBAKDkAQJNgB +2X4K4BAz2oHgE/LPcIAA/DwkEAQADBcFEAohwA/rcs9wAACqKGUBYACKI4cCpBUAEM9xgAD8PAIg +AAQIoc9wAgBHagamz3BlAMJuBqbPcIAAdBwAgM9xgAB0HEIgQIAAoQX0ANhRHRiQPQEP/+B44cUB +289ygADIBX6y4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HjgeOB44HjgeOB44HjgeAa4RSDNAM9woADsJ6agCoAA2wCxfrLgf8HF4HjxwIogygZyDyAGANnm +DoACogjAEC4OgBCA2c9woADQGzCg0cDgfuB48cAyCA//OnAacUojQCCgkCfwinUl8BUhwCQAEBQB +AhASAUAjUyAMJICvAAD7/y8jyCRx9td1AAD//x7yTCAAoMwlgZ8AAP7/FvJMIECgzCWBnwAA/f8Q +8kwggKAI8s9wAAD7/xB12fUdAA//13UAAPz/9/XPdoAAdBwAhgHggeAAphL0AdnPd6AAyB9RH1iQ +INgQp0MfWBAA2L4I4BCNuCDYEadALIAhTyBBAEAqACQleM9xoADsJwahAIZCIECAAKbP9c9xoADI +HADYEaHJ8fHAz3CAANgxAICB4Mohwg/KIsIHyiCCDwAArxPKI4IPAADLAcokIgCQByIAyiUCARoI +AADRwOB+8cCOCwAQIg0ADdHA4H7gePHAFg/P/s9wgADIHQOAocEogM9wgABEp89yDwAA/MC5Nnhk +gCCACrvJuUR7JXvPcacAFEhtoWWAAYAKu8m4ZHpFeA6hz3KAANQ5DYqGIP8BO2jPcIAAXJQsqC6K +QCAVA4Yh/wFDuS2oL4qGIf8BQ7lKCGAHLqhAwM9xgAB0HACBAeCB4AChEfQB2M91oADIH1EdGJAg +3tClQx0YEADYog+gEI240aXPcAgAhxDPdaAA7CcGpUojwCBKIAAgCiIAJAohACQyJZQkTCQAoXoA +CgAA3hTwQCCAIRB4BriBuBC/5XgGpUAhgSEweQa5gblALQAEJXgGpQHmz3CAAFAuIIBgeQbYEHbM +AAYAESSAo/XzinAaDuAEyXHYcIpw7gzgBMlxmHBALkABEHgQuIG4h7iMuAalgOYX8oHmGfSKIcQG +iiCECBHwCiHAD+tyz3AAALATiiMJDQokAAUZBiAASiUAALbZvdgacTpwAN8E2Z9xuHeoIMALYbkA +IQMEcHsAFAYwQCwCAQa7gbtALoABGmI1esdygACApwKSHHgQuGV4BqUCksC4OHjleBB/Y5IAIUAE +EHgGuHx7gbgQu2V4BqUDksC4OHgFIEABLyUIAITxQiNTIEwjAKDsBu3/QCJSIM9wCACGEAalz3CA +AHQcAIDPcYAAdBxCIECAAKEG9M9xoADIHADYEaFdBe/+ocDgePHAatgiDCAG+tkA2I249g7gCwYa +GDAMzIYg/4oI8s9wgADoNwCIgODUDAIE0cDgfs9xAwBADc9woACoIC2gz3GAABAIQIEBagChz3Cg +ADguBYAEIIAPwAAAANdwwAAAAArySNjPcZ8AuP8aoVuhadgYuBmhz3KAACRWBYIDgCCAx3EAAIgT +VQWgDkhwCHLPc4AAPFYFgwOAIIDPcKAAsB8bgNW4GWEQ4WhwMQWgDkJ58cAIcc9wgAB8L1CIz3CA +ABYvRCo+CzIgQg7nugnyxroKus9wgABcWgINoA5ZYdHA4H7gePHA4cXPdYAApFoFhQOAIIDPcIAA +fC9wiFKIRCs+CwAhgH+AABgvVXhAkKlwCrrKDKAOWWGKIJUKCgsgBiKFdQTP/uB4z3CAAFQvUJDP +c4AAjFoig2hwCrqdBKAOWWHgePHA4cXPcIAAfC9QiDKIz3WAAKRaRCo+CwAhgH+AABgvNXhAkCKF +qXAKum4MoA5ZYYoglQquCiAGIoUZBM/+4HjxwI4Lz/7PcYAAuF4hgaPBQsHPcYAAyB0VIRAAABAA +ILYQDgaA5i8ogQNOII0HV/IVbQAgkQ+AABDGBhGAIM9xgACQyBZ5AIEikY7lCBxEMMogYQAF8oty +ggov/wLBgOA28gDYz3GAAOgGQIEPIEADLyIKIAQigKAAoQf0gOLIC6IHyiAiCK94bgsgBBDZAN8E +GcQjiiEIAAAZQCCpcOlxGgqgBg/aABACILYSAAYEIIAEthoYAM9wgAAQybZ44KDhoM9wgABwxbR4 +4LAQJk6TLyiBA04gjQes9RED7/6jwPHA4cUIdQTw+gqADl4LoA6pcIDg+vUdA8/+4HijwUDAQcEF +FIEwANiB4ULCDfKC4Qfyg+EN9CHBANgPIEAAAxSBMA8gQAACFIEwDyBAAAYUgTCB4Q7yguEH8oPh +D/QhwQPhDyBAAAMUgTAD4Q8gQAACFIEwA+EPIEAACRSBMIHhDvQCFIEwCrlPIQIEAxSBMAy5JXoh +wQ65RXkleCDBgeEI9AcUgTAiwga5CLpFeSV44H+jwKPB4cVCwQkUgTBDwoPhQcAA2Ar2gOHI9goU +gTCA4cT2g+HD9gHYBxSCMAYUgzBQcwbyIsEwc8wiQoAD9AHYIcWB5RD0ChSBMCPDcHFK9gsUgjBQ +ccwjqoCE9oDiyiBpAIHgDfSKIckPz3CAAEAHIKCB5f/ZyiEiACGgwcXgf6PA8cCGCc/+z3aAAMQH +ABYFEEwlQII8AAYAz3eAAMxbAIahhgi4IIcFfTB1CfIQuYogSwVeCCAGpXmgpyCGz3CAAIBq8CBA +AEB4gODr86EBz/4KIcAP63LPcAAAhidj220BIABKJIAA4HiiweHFQsFBKAICB3pBKAEER3nPcoAA +kMXGuSpi57oS9AgUAzHPdYAAkMipcVZ5QIFQcAX0QpFwcgbyR4nnuvfzgNgD8AaJwcXgf6LA8cDW +CO/+uHBKJEAAkODKIsoHyiCKDwAAzhvKI4oPAAD8APQAKgDKIcoPQC1DAcdzgAAQxsaLjCYCkADY +DfLPcIAAkMgWII0DoIWgoSaLNngCkACyiHDtAM/+4HjgfuB48cAIyJW4CBoYMAnIm7gJGhgwC8iK +uI24kLgLGhgwz3CAAMgdA4AYiIHgDPQLyM9xAABILqy4CxoYMAYMYAYP2GfYOg/gBYohCADRwOB+ +4HjxwOHFCHU+iM9wgADoE0CAQCUAFAO5NXlZYaIPYA0K2o4P7/+pcHUAz/7gePHA4cXPcoAATDmE +EgAAgBIBAM91oADIHyR4LykBAM9wAwBADUUdGBDwIkAAQHiA2BUdGJA5AM/+8cClwUHAQsEMHAAx +EBxAMc9xgAD8kjQZwA8wGQAPLBnADigZgA4kGUAOz3CAAPySIBhAC89wgAD8khwYAAvPcIAA/JIY +GMAKz3CAAPySFBiACs9wgAD8khAYwAjPcIAA/JIMGIAIz3CAAPySCBhACM9xgACAkoAZAAh8GcAH +eBmAB3QZQAdwGQAHbBkAB2gZgAZkGUAGYBkABlwZwAVYGYAFVBlABVAZAAVMGcAESBmABEQZQARA +GQAE76HOoa2hjKEsGcACKBmAAiQZQAIgGQACHBnAARgZgAEUGUABEBkAAWOhaiAAA9gZAABqIMAC +1BkAAGoggALQGQAAaiBAAcgZAABqIAABxBkAAGogwADAGQAAaiCAALwZAABqIEAAuBkAAGogAAC0 +GQAAaiCAAcwZAABAwwHAAsFTJ801DBQGMFMlxDVTJsU117qpcyoM4AUQFAcwANnPcKAAtA88oM9x +oADIOy6BXg3gBX3YugqAA9oO4AAA2AjYANlKDiAGmbnPdYAASC4ghWB5ANiO4AbyIIVgeQDYiuAJ +9M9w4ADEMQDZpg0gBpa5nQSADeB48cDPcYAAeCkAgddwAIAAAAX02gwAAtHA4H4AgddwAEAAAA30 +z3GgALAfO4HqDOAFiiBMDDYMAALv8e/x8cDWDY/+z3KAAHgpgOHPdYAAWF0O8gCiAIWA4BP01glg +Bg3Yhg5gBwjYAdgApQvwAN7AopoJYAYN2EYOYAcI2MClAQaP/uB4z3GAAHwtAIEc2s9zgABsBkCg +QoNVIsAJAaGgEgAAjbigGgAAz3CAACQIpBoAAJwSAAFngwShVSJADQOhQCIAB3Z4BYig4Az0z3CA +ALgGAJBIdIAkRBMArB7bA/AY22KhVSJADXhgBaFVBaAMKHDgePHAGg2P/s9wgABIBkCAz3aAAOAP +oIYEIoMPDwAA4AQjgA8BAAAAMmhkeSd9oKaYdQQijg8AAABAz3WAANwP4IUDvmR+HXjHf+ClBCEB +AQQigg8AAACARXgGI00AArgEI4MPAgAAAOR+BHvGfQYlwBAvKAEATiBBBM9wgACMb/AgQgDPcIAA +yB3wIIAAtRAABlMgQIAVGlgwAdop9IbhGfTPc4AAHLEJk4DgDPIVGpgwSHHPc4AAgDwXgwHgF6MX +8AyTgOAT8gTZFRpYMPPxhOHMIWKAC/TPcIAAHLEOkIDgBfIG2RUaWDDl8c91oAAUBCqlz3OAAGwH +YIuB4wDYBfRphbjjgvcB2IDgCPTPcKAAiCA1eECgE/DmDaALBhqYMJoPQAWA4Av0ANmRuc9woADQ +GzGgVg3gDgHYSQSP/uB48cDaC4/+FRoYMM91oADUBxodGJAfFQCWAd4BGhgwBBKFMEwlAIfKIcIP +yiLCB8oggg8AAOscyiOCDwAAZAHgA+L/yiSCAxkVAZYD2CAdGJAUHZiTDxUDlgAWAEAAFgBAABYC +QQAWAEEAFg9ADx3YkPS/ViIAAhB4A/IC4BB4A+AEIIAPAAD8/xBx0PcWCIAFgOAq8s9woACwHx2A +1bjXcAAAABRAAA0ADxUBlkDhHh1YkB0VAJYeHViQrbgdHRiQ4g9ABYDgBfLODU//DPALyAUggA8B +AAD8CxoYMAvIrLgLGhgw2gygCwYamDNVA6/+ANjgePHA4cXPcIAASAaggGvYBCWNHw8AAODaCeAF +iiEHAS8oQQPuDu//TiBABAolAIDKIcIPyiLCB8oggg8AAN4OyiOCDwAAyQHkAuL/yiRiAH/YCrjP +caAA0BsToX/YEKEBA4/+4HjxwHoKj/4IduyICJDPcoAA4Ae1bwhzhiPzD0IrEQLHdYAAEMZghe27 +SHED8iRq67iKIMMvA/QeFpAQTY5RIgCAo/LjuDz067sU8v/YB61KJABxANqoIEADSGEAIoMPgACQ +zfZ7BKtIYQHiT3oAq17wTCEAoY/2CiHAD+tyz3AAAC0liiMLBEokQAA9Au//CiVABO64B40yIUEE +ACGCL4AAkM32egjyJKoE2QApQQQleAetPvAgqg8gQARk8EwgAKSV9owgw6/KIcIPyiLCB8oggg8A +AC4lyiOCDwAA5ALKJGIA5AHi/8olAgR6Ce//yXAIlu64BPICjgmtBPABjgitAIXruBfyANpHrUok +AHHPcYAAkM2oIIACOGL2eAQYAgQAGAIEAeJPegGOCK0CjgmtK/BMIQChyiHKD8ogig8AAC8lyiOK +DwAAAQM+B+r/yiLKBwiWACGBL4AAkM3uuAeN9nkK8gQZAgQE2QApQQQmeAet3vEAGQIEANkPIUEE +JngHrQGOCK1VAY/+4HjxwPYIj/7Pc4AABAdhg3lhz3OgAFAMYIPHcwAAACAie8y7cHDE91EjAMD0 +81EjAMDKICIAHvSB4hv0z3WgANAPEBUDloDg0/fPcoAAHBWfcCOCqCAAAwKKJRUPlsG402jYfwHg +AqrneSOiEB3YkAHY7QCP/vHA4cWswc9xgAAEJgqBz3WAAJilobgKoQKVIZUQuAV5AhxEMDC5BBxE +MCiFAtjPcqAAyB8TohqCSMFJwBuCSsBKD6AFiiDVA89wgADsByCAiiDVAzYPoAUiiQiF4LgI8lEg +wIE8DCEGyiChBc9wgAB8LzCIz3CAABQvRCk+CzQgQA5RIACByiABB8ohIQzKIoEPAACQAMojoQd8 +DmEMwCshBlkAr/6swPHAqgkgAAHYz3CAAGQuIIDruQ/yz3CAAMgdAIC6EAAGUSBAgQXyUSGAggfY +AvIF2CoOAADRwOB+8cDhxQvIkLgLGhgw7guv/qTBz3CAAHRaJYAjgSCBx3EAAAAQOghADgDbz3WA +AGQuSB3YEM9wAABwHEDAAthBwAHYQsBDwwbZBNqYc7hz2HNWDaADiif/DwCFi7gApUILIAYJ2LUH +b/6kwOB48cDhxQvIkLgLGhgwgguv/qTBz3CAAHRaJYAjgSCBx3EAAAAQzg8ADgHZz3WAAGQuSB1Y +EM9wAADYHEDAAthBwELBANhDwA/ZBNoIc5hwuHDYcOoMoAOKJ/8PAIWruACl0gogBgnYSQdv/qTA +8cDhxc91gABkLgCF67gF8gGFguAK9AvIBSCADwAAADwLGhgw/gqP/s9zoAA4LgeDw7iP4A/yHBME +AAohwA/rcs9wAADBG4ojxA3FBq//SiUAAM9wgABcIxSIieAN9DYLQAWA4Anyz3CAAKRaBYADgACA +KgjAAAGFguAL9M9wgAB0WpIOAA7GDCAAANgE8DoKIAYJ2K0GT/7xwCoOb/6KIhUFOnCB4M93gADI +HSCHAd3CJUETgeAk4QHYRmHAeCGHRCa+kSThQ2EE9EQjvoES8gohwA/rckArDQTPcAAAyxuKI4YD +CiRABCUGr/8FJYUTz3GAAGgjXpcskVBxB/TPcoAAVLBBglBxGfIiCgAAwgkgAKlwggkAAPAnQBO6 +EAEGqXAlud4OoADAueYPgA4LyJC4CxoYMO4Jj/5+DSAQAdjPcIAAjG+goKKghgygCQDYfgygCQLY +z3agAMAvqRYAlqsWAZYA3SV4BCCAjw8AAPwadRjyLykBAE4hgwfPcaAADC3wIcEAANpRIQCCDyLC +AAP0RX0D8AUgkCAGIICA7PXPcIAAaCMskB6XEHEM9M9wgABkLgCAhiD/gQb0fg8ABYDgKfRMIUCg +CvSlFgGWTyAAIYa4BnmlHliQEPDPcIAAaCMskB6XEHEI8qUWAJZFJUERJnilHhiQTCFAoAjyz3CA +AGgjLJAelxBxBfKmCmAQBdhMIUCgCPRFJUARpRYBliV4NvBPIAAhz3KAAFwvMYKGuAV5ANgRogGH +thANBoDlLyhBA04gggcf8o7iyiQidMogIgDoIKIEACCPD4AAEMYQ53Vqb2eMJ8OfyiMiAM8jwgPG +IcIAAeAQJY2QLyhBA04gggfj9aUWAJYleKUeGJCRBE/+8cA2DE/+z3GgACwg5oGwgc92gABcLw6G +AiUCEA2GEHJE90J4BqEG8ArYBqEWCQAG7aZtBG/+rqbxwAIMb/4D2s91gADIHRV9AIXPcYAAeKZ+ +CyANgCADAYogUwLiCqAFiiEIAgDeC/CELgQflSDCDydwNgugDMlxAeaC5gCFtveAIAMEz3GAAJg6 +RgsgDXjaFQRP/vHA4cXPdYAAyB0VfSCFz3KAAHimSHCAIQMBIgsgDQPaIIXPcIAAmDqAIQMEDgsg +DXja6QNP/uB48cChwc9wgADAXgCAjg4gBkDAi3AE2b3aHtvmCWAMGLtGD+AFCdihwNHA4H7gfuB4 +z3CAAFwv4H8PgOB4z3CAAGwv4H7PcIAATAfgfwCA4HgVB+AFCdjgePHAEgtv/gDYSiSAcOB4qCAA +Cc92gABgMFDcAiYBE1NoVHpZYc91gAAMWwDbYKEF3+Shz3cBALDw46GloUImARg6YmCiBtkkos9x +AQBE8SOipaIB4CUDT/7xwLoKT/7PcIAATAfAgM93gADJWwCPz30QdQjyiiAVA6IJoAWpccCvz3CA +AEBi8CBAA0B47QJP/vHAUgzv/wDYz3CAAGQuAIBRIACAC9jKIKEA6ggAANHA4H7gePHA4cULyJC4 +CxoYMKoOb/6kwc9wgAB0WiWAI4EggcdxAAAAEPYKAA4C2c91gABkLkgdWBDPcAAApBxAwEHBAdhC +wADbQ8MG2QTamHO4c9hwEgigA04gBwAAhYC4AKX+DeAFCdhxAm/+pMDgePHA4cULyJC4CxoYMD4O +b/6kwc9wgAB0WiWAI4EggcdxAAAAEIoKAA4D2M91gABkLkgdGBDPcAAADB1AwALYQcAB2ELAANhD +wA/ZBNoIc5hwuHBKJkAAog9gA04mBwAAhaC4AKWKDeAFCdgBAm/+pMDxwIYJT/4Ids91gABMB4og +lQJ6CKAFIIWKINUCwKVuCKAFyXHNAU/+8cALyAUggA8AAADUCxoYMKINT/7PcYAAZC4Agee4B/Kn +uAChVgvgDQDYz3CAAFwjFIiJ4An0z3CAAKRaBYADgACA6gqAABIN4AUJ2NHA4H7xwAHZz3CAAFwv +KaDPc4AAjFoFgwOAIIDPcKAAsB9dgGhw1bqiCSAOWWHPcIAA7AcggASJoLgEqdHA4H7Pc4AAjFoF +gwOAIIDPcKAAsB9dgGhw1bpxASAOWWHgeOB+4HgocgkAIAAA2eHF4cZAKQ0CJX1ALQMUiOKlewh1 +kPdTJX6QBvIBHVIQYbr78UEqjgDBukImTpAEHdAQ/fWA4gryLySJcOB4qCCAAQEdUhDgeMHG4H/B +xeB48cDhxc91gAC0oCCNjCHDjwrygOAG8s9wgADsV34IAA7/2ACtz3CAAFygANk1oM9wgAAYFSCg +z3GAABwuAIGiuHoPYAkAoQDYOgqv/whxfQBP/uB48cDhxQDdz3CAAMwHoKDPcIAAHC6goM9wgABM +pal0nbAwvJ6wGg+gA6lwqXC2CiAIqXFFAE/+4HjxwMIPL/4G2BUSDjYBEhA2FRoYMM91oAAUBAql +CYWA4AcSDzYn8gPYEKUEpc9wgACg0HYKoA4DGhgwktkDyJC5oBhAAIoKoAMA2AmFgOAP8igVBBAk +FQUQHtgKIcAP63KMuKkHb/+KI4QEBxrYMwEaGDTKpbEHL/4VGpgz8cDhxQh1QgvgBRLYz3CAAMgd +AIC6EAAGJbiiDqAAwLjWD+AGBNjmCWAMqXBeDcALgg5ACYogCwAaDmAFqXGFBw/+4HjxwAoPD/6h +wQh1KHaKIEQP/g1gBalxguXI96lwyXH2Da//ANqA4AT0E92E8M9yoABQDAWCz3aAALylEq4FghOu +CZaMIIiAKm1F8hL2h+Ah8owgxIFo9ILhLPTPcoAASJqmDG/+QCIAAkhxIPCMIMiASvKMIBCAWPQF +gglpheAE8gDdU/BiDGAGANkIdU3wgeFI9M9ygABImm4Mb/5AIoACC4qBuAuq7vELiYC4C6nq8YHh +OPRSDG/+i3AgwM9xgABImlMgAgCGIH8PSKkceAmp7PGO4Sb0z3CAAMgdA4AYiIHgIPLPcoAAfJdI +cBoMb/4G2UAiAAISDG/+BtkMkoG4DLLA8YThDvTPcoAAfJdAIgAF9gtv/gTZDJKAuAyysvET3QPw +HN2KIEQP5gxgBSmWqXBFBi/+ocDxwM9wgAB8lwyQ4LgE8uoNQAMG8FEgQIAYD0IDz3CAAEiaC4iB +4AjyguAJ9PYNQATRwOB+Cg9ABPzx/PHxwJYND/62CgAFgODPdYAAZC4A2Q70BBUEEAohwA/rcs9w +AAC9G4DbrQVv/0olAAAAFQQQUSQAgsohwQ/KIsEHyiCBDwAAwxvKI4EPAACDAIQFYf/KJSEAUSRA +gs92gABcIzP0z3CAAHwvMKgB2lGoUqgK2LIdAhAC2LMdAhAUjrAdRBCH4MwgIoIM9IgVABd0uBB4 +tB0EEBTYuB0EEAfwZNi0HQQQuB1EELYdQhC6HYIQViWAFVUlwR1yDOAMC9oAhYm4AKUB2EoL7/8B +pa4Jz/8UjonghAhB/89ygADIHQCCiiEVBSTgIGCGIH+OC/QBgiTgIGCGIH+OkAqhDcogIQDPcaAA +OC4Hgai4B6EUjofgBfR2C8//B/CI4AX0ZgnP/6YLz//dBA/+4HgIczhg1bvVuTBzNrjE9wIjQgAK +8M9ygAAQzkWCAeDJuCJ6emIWuOB/RXjgePHAOgwv/phyCHXPdoAA1Jr0JkAQz3eAAFSaUSBAgsog +QQDKJCJ0yiAiAOggYgL0JgIQUSJAggPyAeCQ4EYABgAtu8C7z3KAAHDFtHpAK4UCYJIEvYYl+BOJ +vQ8jQwBgsgDaFn9Ap0Gnw7mleQUhQwEUfmC2z3GAAPSaFXkAGQABAvCA2B0ED/7gfuB48cDhxc9x +gABkn0GJz3WAABgVgOLPc4AAHC4ggwbyAdgApYK5IKMJ8ADaQKWiuYDgIKPkCkIJANimDW//CHGa +CaABANjhAw/+8cDhxZhwA8igkAGAQOX0uMAlohAD5c9zoADUBw8TAoYEJY0fAAD8/5BygHVH9xXI +FSIBMBYRAAYaYhkTAYYCJYAQMHDX94ohDwrPcqAAyB8+ohDZLqIB2RUaWIAE8FEjAMAP9M9xoADU +BxkRAYYwcDf3z3CgAJgDvqBlAw/+CiHAD+tyQ9iMuM9zAADEFR0Db/+4dfHAqgoP/qnBz3CAAJDO +ABAVAA3MAN3PdqAAyB9RIECAz3CAAJDOQYADyA/yoBYBEPgWAxBiegIhlwB2EAIBLyfIJTpiBPCE +EBcB4nI6GMQFH4YQcsX3UHheD6AFAtkB2c9woADUBzSgM6AD2S2gERAAhs9xoADUB0DAQOAPGRiA +FBlYgwPIpBABAFEhAIIG8rIKwAsDyATwRx5Yk89xoADUBw0RAoZALwEkUHpFebgQmAByEAIBeYAC +IhIGuhACAQQQGQBBws9ygABwsEaCABARAYHiAdrAegy6QsLPcqAA1AeIGsAApBACALmgt7qkGIAA +USGAtbgYQgO6GEQDCPLPcqAASAhAIQAjB/BAIQAhz3KgAEwIAcMCxwNw5XsFI1MAJ2jPcwAA/P8k +e89xgACQziOBCCNBAM93oADUBxWnABrABAIhgCQPpwIhwgBbpwPaUKfPcoAA8DcVEgM2AIJwcB7y +z3CgADguBYAEIIAPwAAAANdwwAAAAA7y9dgFuM93nwC4/xqne6dp2Bi4GacB2APwANiB4AL0YKIH +yAIlVSDPcYAANKcEIIAPAQAA8Cy4AxIPNgSxD4euqQChQBcAEQKxEI9gFw8RVGjDv+V6D6nPcIAA +kM4BgEaxz3eAAJixQCcEGXV/EHnPcoAAHLFph1YixQJ5YSmnpBYBEDhg+BYBECJ4Q8AB2M9xoADU +CxChQSlANcC4F7gAIIEPAA4AAM9wgACQzgKAArgr4AQggA8AAPz/JXjscQChARIBNuxwIKDPcIAA +kM4igOxwIKgVyBQiAQAwiexwIKjscKCwFcjwJQEA7HAgoBXI8CQBAOxwILDscKCw7HCgoOxwoKAH +EgE27HAgoAPIIJBUEAABELkleOxxAKEDEgM2AYNRIACBD/Iyi3CLz3CAABDIdngAiIYgfwwceAS4 +JXgC8IDY7HEAqQPIAN8wiDMQgAAEuQV57HAgqAPImnc8kOxwILADEgM2z3CAAIRbnBMBAW+DJrnA +ucC7DLkNu2V5IKAVEgE2GncAIYAPgABEsaCoz3CAAMiwNng0eqCyApDAGkQDFSRBAKCheBoEAM9w +gADIHQSAGpDQGkQDRMDPcIAAkM4igIDhqAMuAMolzhPpdul1TCAAoLjyAYDPcaAAyB+WIEEPHqEQ +2A6hAdgVGRiAFPDPcaAA/EQdgTmBBCGDjwAAAAgT9AQgvo8ABgAADfRRIwDAKfTPcKAA9AcHgP+4 +6vNKJgAALvAA2vq4yiKCDwAAAQLYcvm4yiaCDwAAAgL8uMomgg8AAAECgOMK8s9ygACAPGWCiiYI +AgHjZaKyCMAPEPAB2M9xgABQWzYOIA4Aoc9xgAD8PAKBiiYIAgHgAqEFJY2R7gICAM9xoADUBw+B +EHgZEQKGWOBQcNX3D4EQeBkRAoZY4FBwxfeEEQAAsuA29w+BEHgZEQKGWOBQcGgADQAeGZiDHREA +hgcaGDAdEQCGSMAdEQKGBMhAoB0RAoZBoB0RAoZCoB0RAoZDoB0RAoZEoFYmABIeGRiAHREAhkAv +ASQQegUiUwAEEgE2hiDzD4wgDIAAEREBBBEZAA7yGtgN8M9xgAAEPAGBiiYQEQHgRQIgAAGhINha +cANwEHhyGQQATCAAoAP0A8jH8FEhgLUI8s9woABICEAhASMH8EAhASHPcKAATAgDcUXAAcBGwQLB +JXgFIxMgBsAH4M9xgACQziOBBCCADwAA/P8IIFYADCZApVoALQBHwFEgQMMw8s9wgACQzgGAz3Gg +AMgfliBBDx6hENgOoQHYFRkYgKIOoA9B2FEgQMMc8gHZz3CAAFBbIKDKDCAOAdjPcYAA/DwCgQHg +AqGKJwgSN/DPcYAABDwAgYomEhAB4AChvPDPcaAA/EQdgTmBBCGCjwAAAAgH9AQgvo8ABgAAGfIA +3/q4yieCHwAAAQL5uMongh8AAAICgOIK8s9zgACAPEWDiicIEgHiRaPGDoAPB/AD2c9woAAUBCWg +AN8FJc2TivQB2M9xoADUBxQZGIBVJkAUDxkYgFEiAML+9QbAz3GgANQHFaEFwgIhgCQAGsAED6EH +wgImgCAboQPYEKEowJzgCMeW9APIqXHIuQIllSUIiAy4JXgDEgE3ELkleOxxAKFAJFQgARrYMwTI +AxIBNgDfQMYDGhgwBBpYMCGAAJAAxjS5wLk0eAPgQOYEIIAPAAD8/x5mFRIBNgbwFSJAMBYQAAYC +fhUiQDAWEAAGEHZ39wPMz3GfALj/GKHPcKAA/EQ9gAQhvo8ABgAAX/RMIACgC/IEyFCIUyLBAIYi +/gNEusQYggAwqM9woADUBxQY2IMHyM9xoABILB2hz3CAAJDOIoBAIFAgEnFoBM3/AN4E8ADfqXZT +Jn6Qg/RRIEDDUPLPcIAAkM4BgM9xoADIH5YgQQ8eoRDYDqEB2BUZGIDGDKAPQdhRIEDDOvIB2c9w +gABQWyCg6gogDgHYz3GAAPw8AoEB4AKhiiYIAlnwCiHAD+tyPNiMuM9zAAC0E0okQAC1Ay//uHdM +IACgiiUQEAn0B8jPcqAASCyKJQgQHaL6uc9xgAAEPAfyAoGAvQHgAqGx8QOBgb0B4AOhrfHPcaAA +/EQdgTmBBCGDjwAAAAgH9AQgvo8ABgAAGvIA2vq4yiKCDwAAAQLYcvm4yiaCDwAAAgKA4wnyz3KA +AIA8ZYKKJggCAeNloqoMgA8J8APZz3CgABQEJaBKJgAABSWNEYDlF/LhvQzyA8gpiAHhKajPcYAA +BDwDgQHgA6EK8OC9CPLPcYAABDwCgQHgAqGpdgPIqXHIuQiIDLgleAMSATcQuSV47HHJdIQkApEA +oUAkVCAV8s9xoADUB4AZQAUDzMlyyLoQuEV47HIAouyhAdgUGRiAhgygD0AkVCADEgI2khIAAeq4 +BBIBNgb0khEDAVEjgII28qq4khoEAJIRAAGquO4IoAiSGQQAENnPcKAA0A8QGFiAJBAChs9xgACg +1CWRUHoCuUV5DBhYgBTZEBhYgM9xgACg1GeRRpEY2RC7ZXoMGJiAEBhYgM9xgACg1GmRSJEQu2V6 +DBiYgAbwz3CAAKDU6qjPcqAA1AvwooDmXfIG8AjZ7HAgoEAkVCDPcIAAkM4CgJJwN/fPcIAANKck +kJThwCGGDwAAkwDPcKAAaCzwIEEAz3CAAIRbAIAleA2iA9jPcaAA1AcSoX4IgAtRJUCSBvIKDq// +AMAK8APZz3CgANQHExhYgBQY2INMIACgEvLPcKAALCAwgAPAMHAB2MogJgAEIIFPIAAAAIDgzCEh +gPHzz3AAKAgABhoYMATAdg1gBQDZUSZAkLTyz3CgACwg76Cu8M9wgADUORKIUSAAgBzyUSAAwxjy +z3GAAMgdI4HPcIAA1DkPiBC4MiGBDwAAsAKfuIDhAdnAeQ+5JXjPcaAA/EQNoUwlAKAM8s9woAD0 +B2AYQAXPcYAABDwAgQHgAKHPcIAANKckkJThwCGGDwAAkwDPcKAAaCzwIEAAz3GAAIRbIIEA2s92 +oADUByV4z3GgANQLDaFMpoogBAJ6D+AEqXGCCiAOBMAZFgCWwOCkAA4ADcxRIECATPID3SAeWJNK +JEAAFB4YkQQSATYAFgBABxoYMAAWBUABGlgxBMqc4MoiwgfKIIIPAADcDsojgg8AAMoKXAAi/8oh +wg8ocJ4M4A4O2Q8WAJYEEgE2tBkEABMeWJMQiVMgwgCGIP4DRLjEGQIAUKnPcBIgAADWD2ADFRIC +NgTIz3GgACwgsBAAAS+BZOAwcMoghQ8SKAgAhffPcAAoCAAGGhgwAN8NzAQggA8AAAIIguAJ9AQS +ATaKIAQAbgggCZgRAQAVEgE2z3CAACyxNHjgsAPIHgkgBxqQlQev/anA4HjxwHYPj/0Id89xgABI +DQCJAN6A4KnBQMZH9AHdoKnPcYAAgLzPcKAAzCstoADYj7gLGhwwFRqCM04O4AeLcNoIQATPcAEA +qBFBwIog1ABCwM9wgAAsYwCIZMUC3REcAjAAwBIcQjMTHAIwz3CAABA+RcDPcIAAfD1GwM9wgAC0 +WwCAQ8Yg2QHaR8BIx4HAPdt6DaALF7sI2OYOIAUB2c9wgABwKLmgOQev/anA8cDGDo/9CHUacc9w +gADIHfAgQQMA3s93oAC0DyKgI6Dcp0iBUyIAACILIAY0kU4KgASA4AT0RgnADQTwdgnADeoJQAeA +5WAMIQbKIGEAz3CAAHAoGYBRIICABfK2DEAKCvAA2Z65z3CgAPxEIaDgeMGg3KdMIACgwA0iAMog +YgDPdYAAYA4AjYDgBvSKDYAMAdgArZUGj/3xwDIOr/0Icc92gAB8LxGO8I4Qd3zyco7PdYAADC9A +JYITRC8+Gyd1dX1ujYHjEK5EKD4LUvQyIkMOAdoAIYB/gAAYL4HjwiKBAFKuVXhAkIDiFfKU4soh +yw/KIssHyiCLDwAA2xvKI4sPAAA3AcokKwAEBuv+yiULAYDiz3WAAKRaqXAL8s93gABcI/SPieci +9IHjA/QKullhVg5ADYoglQqaDOAEIoWKIJUKjgzgBCKFMI7PcIAAFC9EKT4LNCBADlEgQIHPcIAA +ZC4AgBvyhbga8Gq64fEvcAtiz3WAAKRax3CAABgvCiLAgMoiYgBSrlV4QJCA4qlw0fOB4831zfGl +uM9xgABkLgChz3CAAFwjFIiH4A3yiOAV9M9wgADIHQGAuhAABlEgQIEL8s9xgABkLgCB4rjPIOIA +0CDhAAChZg8AAFUFj/3geM9wgADIHQOAz3GkABxACIDAuBN4wbgSoeB+4HjhxQDaSiQAdM91gABU +ms9zgADMmkhwqCAAA0AjAQIUeUCxFiUBEEChQaEB4EokwHMA2aggQALPcIAAcMU0eECwAeHPcIAA +5AZBoM9wgAB8l0yw4H/BxeB4BfBCecdwQAAAAM9ygAAQzkWCUHE391MgQwVwccAgjQ9AAAAAwCCN +AOB/IngG8GJ5AiCAD0AAAADPcoAAEM5lgnBxN/dTIEIFOmJQc4P3OGAH8AIggA9AAAAAYng4YOB+ +4cXPcIAAHBUgiAHbgOFhqCDyz3KgALAfeaJ+gkKAo4BQdQDZGPTPcoAAMBVAioDiA/QB2grwQYAC +I40A13VMAEBLefchqChygeID9GGgIqjgf8HFoqDv8YDgAdjCIAwAz3KAABwVAKoB2AGqANgCqgGi +AqIDouB/JKLgePHAlguP/Qh1KHdIdoogRw2OCuAEiiGVDZDlifcO2Olxggov/wDagOAD9BPdLfDP +coAAvKVIcGIJ7/0M2c9xgAAcFQCJgOAP8s9wgABssgCQhiD8AIwgAoAF9AWSZJJneAOhQiUAExIJ +4AXJcQolAJAL9M9wgABssgCQhiD8AIwgAoAED8H/eQOv/alw8cAOC4/9z3WAAMgdAYW6EAAGUSBA +gQjyz3CAAFwjFIiI4AjyAIW6EAAGUSBAgaDyz3GAAGyymBGAAIwgAoCY8gOBrgnv/iSBgeAIdhH0 +hg9ABIDgDfLPcIAAXCMUiIjgB/QmDWANAdjuDUAFEfCA5g/0Yg9ABIDgCPLPcIAAXCMUiIfgAtgD +8gDY/gxADa4OgAzPcYAAEM4GgUUgQAEGoQOFGIiE4DXyz3CAALylV4jPcIAAvCAaiBByz3GAAAw7 +BvK+FQAWUSAAgBn0z3KAAAQHAIIB4ACiz3CAACxbANpAoM9wgADIWkCgz3CAAEwGQKARgQHgEaEE +8BCBAeAQoQCFuhAABlEgQIEcCML9z3GAABgVAIGA4AvyANgAoc9xgAAcLgCBorhKCeAIAKHPdYAA +SJoLjVEgwIDcDIL9C41RIICAsAnCA5YPQAP2DkAEgODYDSIFyiCiBc9wgADUORGIgODEDSIFyiDi +BA0Cj/3xwJYJr/3/2s9wgADYqBEYmIAaGJiAAN7PcYAAbAbDoc9wgADsKECgAdrPcIAA8ChAoMyh +0KHRoc+hwKHBoQLdyXfPcIAAzKKELwgYACBCDkqCJ3AAIZB/gADYokYiwgBKoIIJYA1AIAAhYb2A +5SAYgiMB5yf3AtgA2XoO7/0E2lYO4AQB2HUBj/3geOHFz3KAAPAVIIoA3eC5ZNjKIEED4bnPc6AA +wB0GognyDNgAowGCA6ICggSiBPCgo6OipKLPcIAAyB0DgAmAUSBAgdEhooAF8gCDgLgAo+B/wcXg +ePHA4cUA3c9woADAHaCgqXCmCCAAqXHPcIAA8BWjoKSgEQGv/aag4HjxwJIIr/0IcYYIAACA4D3y +IN3PdqAAyB+wpjLYQx4YEADYgglgD424saawph7YQx4YEADYbglgD424saZ/Fg+WiiATBkEvDRTE +vVIPoAT42YogEwZGD6AE6XGKIBMGPg+gBKlxz3GAAAwWAYkB2hB1wiKKAIDlQKnH9gDYDaaB4gP0 +BNgBqXUAj/3gePHAAgiP/Rpxz3eAAPAVII9RIQCASfLPcYAADBYgiYDhzCAhoEHygeAG9M9wgABU +sKGAA/AA3Y7lA/eA5QL0AN3PcYAAVLAYiYDgBPSA5QT0AN4E8KKBBN6KIBMGsg6gBKlxiiBTBqoO +oATJcc9wgADIHQOAGIiD4MwgIoHMIOKBzCAigswgYoIH8oogEwaCDqAEt9kJ8AqXEHUJ9AuXEHbM +ICGgA/QA2CDwAdjPcaAAyB8Noc9wgAAMFgGIy7eqtwS+ELjFfQV9iiATBkIOoATO2YogEwY6DqAE +qXHPcKAAyB9/GFiDAdh9B0/9gODPcYAA8BUE9EAhAAME8EAhAAQAgM9xoADAHVEgAIAAgc8g4gDQ +IOEAAKHgfuB44H7geOB/ANjgfuB44H7geOB+4HjgfuB44H7geM9xgACIOw+BAeAPoRXIx3CAADix +LIgB4S95LKjPcIAA8BUCiBBxyfaKIAgABhoYMIrYkLgH8IogEAAGGhgwQtiYuOB+4H7gePHAhg5v +/STaqcGLds9xgADMXpoIr/3JcM9zgABgMCwTgYDPcIAAFi9EKT4LMiBADs91gABkLlEgwIFaFQAW +FvKB4CTyTgggAADYjgggAAHfAIW23IHBQMeGuAClAiMAAwYNIAwg2gnwgOAQ8gCFAN9Ax6a4AKXJ +cCTZvNoe254MYAsYu1od2BNlBm/9qcDgeAzaz3GAAGAwAuAPeEsZAoAA2EwZAoAvEYCAShmCgCwR +goBNGQKAAeAPeC8ZAoDPcIAAFi9EKj4LMiBADuB/ThkCgOB43djPcYAAmC8MqROJB+APeA2pUNgO +qW/YD6ma2BCpCdjgfxGp8cB+DW/9JNqtwc9xgAC8X6IPb/2EwM9wgABcIxSIh+DMAgIAz3aAAGAw +LBaCkC4WgJDPc4AADC9AI5EDQCPBAkQqPgsncxV7DovPdYAAZC6B4JwCIgAA389wgABoI89zgADI +HX6TDJBwcAf0AIWGIP+BeAIBAEoiACBKcwzwRCo+CwAhgH+AABgvdXgAkAHjACISIEQqPgsyIVMO +cnOx9x4WgJCIFQEXLHgMIkCuCiBALs/3CiHAD+tyz3AAANgbx9sKJIAEDQWv/golAAQKcOoNb/1K +cYDhyiHCD8oggg8AANkbyiOCDwAAyADKIsIH6fVMI4CgyiHCD8oiwgfKIIIPAADaG8ojgg8AAM0A +yiTCBMAEov7KJSIAQg1AAwINYAOYcCCFAiAAAVEhwIBKuIr0AtjPd6AAyB8Tp1oVARaD4SwWgJC4 +cCP0RCg+Cy9wMiECIMdwgAAYLwohgIDKIWIAFSBDALYVARdgkzBzEfQB2YHiwiFBADV4IJC3FQAX +EHEH9BuHXBUBFhBxsPL/2AMcAjBELT4LMiFALi9xx3GAABgvgODKIGIAFXkAkQq4QcBAKoAiOodC +wAAhAAFDwMlxQCTAMIIhQgymCiAMDdrKDe//DdgKDs//AIW23IXBhrgApQHYRMACJgATggogDCDa +hMAk2bzaHtsqCmALGLsD2FodGBAsFoCQRCg+CzIhQi4vcMdwgAAYLwojgIDKI2IAFSDBACCRgeK2 +HVwQAdnCIUEANXgAkLcdHBAbh1wdGBBW8IDgpAAMAFJwAxzCMwDZivcCIIAEUnAB4S95fPcDHEIw +gODF9gHhAxxCMCwWgJBEKD4LMiFBLi9wx3CAABgvgOHKIWIANXgAkAq4QcBAKoAiQsDPcIAApFoC +gMlxgiFCDEPAQCTAMMYJIAwN2uoM7/8N2CoNz/8AhbbchcGGuAClAdhEwAImABOiCSAMINqEwCTZ +vNoe20oJYAsYuwLYWh0YEATwIgzP/+kCb/2twOB48cCaCk/9mBACAAQigQ8AAAAIO3kEIoMPAAAA +ECV7z3GAAMgdpIHpulUlzhhVJU8amBCBAAjyhiH/A0S5L2eJv+lxGfBRIgCCwBUCEQzywrmAJQIa +P2Xojz1lMI1lf/B/RXkJ8MO5PHk/Zj5mMI7oj0V5iBjAA2V5iQJv/YwYQADxwOHFA8ikEAEAmBAC +AFEhAIByEAEBSHAG8h4MYAIA2gh1B/AB4RIMYAIA2qxoog5ADc9yoADIH/gSAQADyM9zgAAQxhCI +BbgAY+24BvQB2BOieIJZggbwAtgTonqCW4ICJUAQeGAQc8AibQANcQChDXBAoAAWAEAAFgBAA8jP +cqAA9AdwEAEBaLknonAQAQFouTB5/QFv/XAYRADxwH4JT/3PdqAAyB+gFgQQ+BYDEITgAN8i9AMS +ATakEQAA9Lh2EQIBBvLPcIAAkM6hgATwghENAQ3MUSAAgYQRAAEJ8gIlwRACJEMACCMDAATwhhED +ARtjaHFx8IHgSvQNEgE3A8jkuXgQAgEh8lEhQIDPcYAAyB0kgVQRAQEJ8n4QDQEifWJ9AiRDAyvw +gBADAc91gADwxAAjRABwiHZ9YJUAIw0BhBADAbtjG/CkEAEA9LkI8nCIz3GAAPDEdnlgkQTwghAD +Ac9xgADIHSSBgBANAVQRAQE9ZbtjhBANAbtjgBANAblhfhANAUJ9J/CC4CH0AxINNg3MeBUCEVEg +AIHPcIAAyB0EgFQQAQEJ8oAVABEieGJ4AiQDAAfwghUDEYQVABE7YxtjgBUNEUJ9BfDpc+ly6XXp +cQ3MUSBAgAfyA8h2EAIBYro6YgvwgONiusn2z3CAAMgdBIBGEAABGmL4FgAQXWUCfR+GEHWL96DY +D6b/pl+mAtgVHhiQgNgOpmUAb/1wePHA9g8P/c9xgADIHfAhAgBVIsUICIJVIkQKUSDAgIogCADK +ICEAwBoEAEokAHIA2agggA/PdYAAcGT8ii5l5H4vKIEDTiCDB89wgABYZm9gACVDAOCrRBKPAOR+ +Ly6BE04mjxfuYMiryIJRJsCQD/Idiobh0yCmAC8oAQBOII0Hz3CAAJRiqGAQ8M92gACYZC5mzmW8 +isR9WBKOAMR9Ly1BE04ljhfIYBCrAeFKJAByANuoIIEA3IrPcYAANGZvYc91gABYZuR+LyiBA04g +jwfvZQAlwAD8qEQSjwDkfi8ugRNOJo8X7mUkGIIDyIJRJsCQD/I9ioDj0yGhAC8pQQBOIY0Hz3GA +AJRiqWER8IDjA/LJawLwaHbOYTyKxHlYEo4AxHkvKUEATiGOB8llLBhCAAHjSiQAcQDYqCBABc9x +gACQYn2KCWEAJAwAAeBkeS8pQQBOIYMHz3GAAJRiaWEgrP0GD/3geOHF4cbPc6QAtEUpEwCGz3GA +AJA6yBkAACsTAIbMGQAAz3ClAAgMA4DkGQAADhMAhhB6MLjUGQAA0BmAAA8TAIbYGQAAz3CAAKiy +1Ii2iOgZgAN4iOwZQAMNkPAZwAAs4AIgggP0GYAAAiBCA2J4+BmAAPwZAADBxuB/wcXPcIAAMFsF +gAOAIIDPcIAAQJTgfymg4HjhxeHGmHDPcoAAEBYFgiCCZoLIuBC4yLkFIQGAAYLIuxC7yLgFIwUA +Z4ICgsi7ELvIuAUjBwBoggOCyLvIuBC7BSMGACTyABQOAC8oQQBOIIMHANgPIMAAEn0EIEMBpH5l +fgAcgAPagqR+xXt6onmCBCCOAQQgwAGke8V7eaJ4gqR7BCFBg2V4GKLf9cHG4H/BxeB48cBeDQ/9 +OnAFgaCByLgQuMi9BSUNkAGBJoHIuMi5ELkFIRAAAd4b8gQlgJMU8i8oAQBOIIIH8CGBIIDhAN8P +J48QCfIEJwAUQiAAgGB5yiBiAOZ9gOXbfuj1ZQUP/eB44H8A2KHB8cD6DA/9o8EIdUjAz3aAABAW +Gob7hjyGBH8kf6d/QcfqC2AEiiDYBIog2ATeC2AEqXGA5xf0gOVs9PoI4AQH2IDgZvIKIcAP63LP +cAAAjROKI8YPSiQAAO0Eb/4KJQABBBQBMYDhGfIgFAAxCyBAgA3yz3CAACQuYIDPcQAAKFwM2GB7 +A9oJ8IDgB/TPcIAAIC4ggGB5DNgGFAExgOEZ8iIUADELIECADfLPcIAAJC5ggM9xAAAoXA3YYHsE +2gnwgOAH9M9wgAAgLiCAYHkN2AQnUJML8koI4AQH2IogGAgqC2AECnET8IDlEfSKINgEGgtgBIoh +xwoGCOAEB9iKIBgEBgtgBOlxYggAALymCNxTBC/9o8DxwOoLD/0IdgDdiiDYA+YKYATJcc9wgAAQ +FlqAO4BEeQDaDyKCAwQiQwBCIwOAyiNiAC8mx/AB38ogQQMH8hyAJHiqDu//RXjpcAkED/3gePHA +ocEB2MYMr/9AwM9wgAAQFgqAUSAAgMogAgfKISIByiKCDwAAZwDKI2IPAAoiC8Ar4gWhwNHA4H7g +ePHAWgsP/RpwKHVId2h2OGNm2T3aSgogCxe6geAJ9ApwIgogC6lx6XDyCSALyXGRAw/94HjxwCYL +D/2mwSh1GnJgwADYARwCMAHYAhwCMAMcAjCLcI4IIAeBwYDlBfIEwQpwYH0FwgPAgOAO9AohwA/r +cs9wAACME+7biiTDDyUDb/64c0B4OQMv/abA8cDKCg/9osEB3c92gAAQFjqGG4YkeDyGBCEQAL4J +YASKIJgDTCAAoFUmTxcs8gPwu30EIECj/vMvKAEATiCRB/AnQBRcHkAUgODKIcEPyiLBB8oggQ8A +AI8TyiOBDwAAGgLKJAEEsAJh/solQQRAeIogmANmCWAEKnEA2A8gQAQGIBAgTg3v/wpwiiCYA04J +YAQ8hpUCL/2iwOB44H7gePHAJgkABM9wAQDYPoDgCvLPcYAAEBa4GQAAG4GRuBuhz3ABAFA+gOAI +8s9xgAAQFh6hG4GBuBuhz3AAAPhegOAJ8s9xgAAQFpQZAAAbgYi4G6HRwOB+4HjxwOHFocHPcoAA +RKfPdYAAEBYXhQDZDyEBABiFJHhCIACAyiBiAIHgAdsA2Q/0CNhgwAEcQjACHMIwAxzCMItwBNk+ +Du//iiMIAAjYANlmDu//KHIA2P0BL/2hwPHAdgkv/QjZz3Kt3u++fg0gAjpwMg8gACpwg+BI8s9w +gABAlAOQTiDPAYfnUAAGAM9wgABIDroNYAD0IMADAN4A3QTYGnAqcOlxyXIKJIAPrd7vvjYNIAKp +c0YPIAAqcIPgJvJCIEAggOAB5Sz3AeaE5qj3AeeH57gHxf8qcM9yrd7vvgYNIAIQ2b4OIAAqcIPg +DvLPca3e777yDCACKnAGD+//KnCD4MogIgApAQ/98cDKCC/9A9qmwRpwWgjgC4PBA8HPcIAAlA8U +FAcwAN7wIEUAz3CAAKAP8CBGAM91gADwBw7YxKVAwATYQcDPcK3e775CwATCCnCA244MIAKYc9IJ +IAAKcIPgQPIDw89wgADED0KF8CDBAMClgOEMFRAQwaUI8s93gADQD/AnwBCA4Ab0wKXBpQDZGfCE +KgwDHghgAC9wDiCBDwAAAAEgpQPAhCgMI/AnARAGCGAAL3AOIIEPAAAAASGlBIWB4A30AIUReIwg +B43C98ClMXmMIQeNw/fBpQDYVQAv/abA4HjxwO4P7/wE2qbBfg+gC4txz3AAABvSAN2pcVoMYACp +cgDBz3AAABzSSgxgAKlyAMHPcIAAqA0BwhUgQQAAkQLBBboeDWAARXkDwIDg3AAFAM92gADwB9LY +CLgZ2RYMYAAA2s9wAAAi0kAmARIOCmAABNrPcAAAI9JAJgET/glgAADaz3AAACDShMHyCWAAANqF +x89wAAAh0ulx4glgAADaAoYX2V4JYAtAJgISA4YX2VIJYAtAJgITBMAX2UYJYAuEwgXAF9k+CWAL +6XIChgDZ/g4gAIu5AqYDhgDZ8g4gAIu5A6YEwADZCLjmDiAAi7kIdwXAANkIuNYOIACLuSKGMXkZ +4QUpfgAjhi9yUHcxeRnhBSl+AC9xzCBFgIb3A8AB5RB1MgfO/wPAEHXG9wHZz3CAAPAHJKAA2B0H +7/ymwPHAqg7v/AnaqcEacDoOoAuLcULYCgxgAAjZ/gsv/SHACHFC2PoLYAAFuQwUBDAAwQpwBsIK +JYAPrd7vvn4KIAICw+INIAAKcIPgNPIAwQXCz3CAADQOAN/wIEAABMEKugQigg8PAAD8yblFecYK +YADpciDez3WgAMgf0KUF2EMdGBAA2DoPoA6NuNGlIBQEMADBCnAGwgolgA+t3u++HgogAgfDHg7v +/wpwg+DKIMIDXQbv/KnA4HjxwNYN7/wC2qXBmnCCDaALg8HPcAAAEdIH2WIKYAAA2s9wAAAS0gDZ +UgpgAADaz3AAABPSANlGCmAAANrPcAAAFNIA2TYKYAAA2s9wAAABRAfZKgpgAADaz3CgALQPcBAX +AAHZz3CgALQPPKAg3c92oADIH7CmBdhDHhgQANiKDqAOjbixprzY3gpgAADZw9jWCmAAANmKIEQI +zgpgAADZiiAECsIKYAAA2bXYugpgAOHZiiCEBrIKYADh2QPYQMAE30HHz3Wt3u++QsWKcATBA8Ie +25hzSiUAAEomAAAmCSACSicAAGYO7/+KcIPgvPLPdoAA8AcIFhYQDBYTEA7YQMBBx0LFinAEwQPC +HtuYc0olAABKJgAA6gggAkonAAAqDu//inCD4J7yCBYQEAwWFRAO2EDAQcdCxYpwBMEDwuHbiiRD +CEolAABKJgAAtgggAkonAAD2De//inCD4ITyCBYREAwWEhAD2EDAQcdCxYpwBMEDwuHbiiRDCEol +AABKJgAAfgggAkonAAC+De//inCD4GjyIoajhs9yoAC0D+pwHKIEw89ygADEDwIhAKTPdoAArA91 +egCiAiJAJc9ygADQD3V6AKLD2nV+QKbPdoAAuA91fkCmD/QKIcAP63LPcAAArROKI8oFSiQAAE0E +L/4KJQABgODKIcEPyiCBDwAArhPKI4EPAACeAsoiwQft8wIggCUZYQIhQYQP8gIgQiQMerILIAAv +cATCAiABIM9wgACUD1V4IKACJcAkuWACIYGED/ICJYIkDHqKCyAAL3AEwgIlASDPcIAAoA9VeCCg +ANi5A+/8pcDgePHApg0gAADYz3AAAA3SANn+DyAAANrPcAAADNIA2fIPIAAA2s9wAAAV0s9x8w// +/N4PIAAA2s9wAAAb0gDZ0g8gAADaz3AAAALSoNmaucIPIAAA2gnYjLgA2bYPIAAA2hTYjLj/2aoP +IAAA2gDYjLj/2Z4PIAAA2hHYjLj/2ZIPIAAA2gLYjrgA2YYPIAAA2gHYjrjPcQAA//92DyAAANrP +cAAAC9IA2WYPIAAA2s9wAAAN0gHZWg8gAADaz3AAABLSANlKDyAAANrPcAAAE9IA2T4PIAAA2s9w +AAAU0gDZLg8gAADaANjRwOB+8cDhxa3Bi3EuCqALAdoA3QTY/g8gACzZDtj2DyAAqXG12O4PIADh +2YoghAbiDyAA4dkAwIDgzCCigMwg4oDKIUIDA/QC2YPgzCCigMwgYoAD9IK5L3m6DyAAD9gA2LkC +7/ytwPHA4cWhwYtxygmgCwHaz3WAAFiWABQEMM9wgABMDalxEtpaDiAAANsAFAQwz3CAAEoNViVB +EgHaQg4gAALbz3CAAHANVSXBFBzaSg4gAADDANhhAu/8ocDxwMoJ7/wD2qPBunBuCaALi3EBwc9w +gABADgDf9CBNAALBz3CAAFgOgOX0IFQAz3CAAPAH4KDhoMwlopDKJsITAvQA3oHlzCXikMomYRAO +Ds//qnDPcq3e776WDeABqXHmDu//qnCD4HPyAMCA4MwgooFP9IDlzCVikEv0AsCA4Ef0z3CAAJQP +1XhacOCgz3CAAKAP1Xh6cOCgz3CAAMQP1XgacOCgz3CAANAP1Xg6cOCgz3CAAKwP1XjgoM9wgAC4 +D9V44KCqcKlxz3Ot3u++Hg3gAclyGgvv/6pwg+A58gDBABIAIIbhAdnAeQO51XnHcYAARKcAoQAT +ACAEoQAQACAbeAihABEAIBt4DKGqcMlxqXIKJIAPrd7vvtIM4AGKc/YPr/+qcIPgE/IAwM9xgADw +B0CBBL0GuLhgFSAABcdwgACApyGBQrAjsADYzQDv/KPA8cCSCO/8BNqkwR4IoAuLcQDAAcEEuDV4 +z3aAALQNEGbeDSAAAsEAwAHBBLjPdYAA9A01eBBlyg0gAAPBAMABwQS4NXgAZgbgEHi2DSAAANkA +wAHBBLg1eABlBuAQeKINIAAA2QDYmQDv/KTA8cChwfoIIAKLcgDAocDRwOB+4HihweHF4ca4cM9w +gABUsBAQBgDPcIAA2DEFgJhxgOChwYYk9w9z8s9wgADYWwCA0HAN9M9wgADgWwCAsHAH9M9wgADc +WwCAkHBh8gAcQDEgwgEUgTDw3lMiwADEelMhxwAkflR6QC6NAbR9umIVes9xgABEqUhh1H4Ic4Yj +/Q97ezpiQYpleEhzhiP9D3t73WUVJc0RvmHCjmV6yXOGI/0Pe3u5YSOJZX4oc4Yj/Q9MJACAe3tl +eRPyz3WqAOAHc4VRIwCABvJIpQmlKqXLpRDwCKVJpcqlK6UK8Am6RXjPcqcAFEgDogm5JX7Eos9x +gADYWwAZgAHPcIAA4FsAGEABz3CAANxbABgAAaHAwcbBxeB/ocDxwPoOj/xmCYADgOBYCMECAN4W +8FDcAicAE7NutH0mD2AMuGBCJwAYGg9gDLhgANkAJoAfgADuLyCoAebPd4AAYDCLF4CQEHam989w +gABcWvIOQAzPcYAAZC4AgaG4BQev/ACh8cCaDo/8z3EAggEAz3CgAKwvPKDPcIAAaDgAgIDgBfT2 +D0ADF/D2DEAAagxgBW/YgOAR9CDez3WgAMgf0KUK2EMdGBAA2GIPYA6NuNGlzgxAALUGj/zgeM9y +gABoOCCCBnngfyCi4HjPcoAAaDgggiV44H8AouB4BCiADwAAL7pCKcJ0UHpEKv4CAiBADhB4gOAE +8gHiUHqD4ECxA/aA4AP0ANgC8IDY4H7geEEFT/7xwN4Nj/w6cM92gAB0HACGAeCB4ACmEfQB2M91 +oADIH1EdGJAg3/ClQx0YEADYyg5gDo248aWSCSAFB9gacM91oADsJ+uFAgqgBipwC6UAhkIgQIAA +pgf0z3GgAMgcANgRoY4IIAUKcNUFr/zpcOB48cBqDY/8OnAodRpySgkgBQfYUSCAoFpwBvIuDWAH +yNhQIJAgTCCAoBzyC/ZMIACgEvJMIECgI/QV2BO4DvBMIACkE/JMIACoGfQ+DCAEKnAApRDwKdgS +uPAgQAQApQrwK9gSuPrxz3CgAOwnGYAApQ4IIAVKcFEFj/wKIcAP63LPcAAAihN62wokQAQtBe/9 +CiUABPHA2gyP/Ah3OnGA4hpzAN7N90h19CeAExUhgSNSD+//CnJhvYDlAeY29xEFj/zgePHArgyP +/KHBCHeA4hpxAN7P90h19CeAEx4IIACLcQDAFCCMI2G9gOUAtAHmNPflBK/8ocDxwHIMj/yhwVpw +z3WAAHQcAIUB4IHgGnEApRH0AdjPdqAAyB9RHhiQIN/wpkMeGBAA2F4NYA6NuPGmJgggBQfYOnDP +cKAAwC8zgPq5DvL8EAUACiHAD+tyiiCMCYojhwVhBO/9iiTCCzCAUSEAgA/0/BAFAAohwA/rcoog +zAmKI8cFQQTv/YokwguLcR4Lr/1KcAAUATEAGEAgAIVCIECAAKUH9M9xoADIHADYEaHaDuAEKnAZ +BK/8ocDgeFEkwIDxwAXy2g7P/wPwyggAANHA4H7geFEjwIDxwAXy8g7P/wPw4ggAANHA4H7geAhx +juAB2MIgDQAB2qkH4ARIc+B48cByC4/8OnAodRpyUg/gBAfYTCCAoFpwH/IO9kwgAKAV8kwgQKAo +9BXYE7gVIEAEoKAd8EwgAKQV8kwgAKgc9CpwygogBKlxEfAp2BK4FSBABKCgC/Ar2BK4FSBABKCg +BfDPcKAA7Ce5oB4O4ARKcF0Dj/wKIcAP63LPcAAAiRNJ2wokQAQ9A+/9CiUABOB48cDmCo/8CHc6 +cYDiGnMA3s33SHX0J4AT8CGBI1YP7/8KcmG9gOUB5jb3HQOP/OB48cC6Co/8CHeA4hpxAN7N90h1 +9CeAExoIIAD0IIEjYb2A5QHmN/f5Ao/84HjxwIoKj/w6cM91gAB0HACFAeCB4BpxAKUQ9AHYz3ag +AMgfUR4YkCDf8KZDHhgQANhyC2AOjbjxpjoO4AQH2M9zoADALzOD+rkO8vwTBQAKIcAP63KKIIwJ +iiOHBXkC7/2KJIIEMINRIQCAD/T8EwUACiHAD+tyiiDMCYojxwVZAu/9iiSCBC8iCARAKYEhgbkQ +ukV5z3KgAOwnJqIghUIhQYAgpQb0z3KgAMgcANkxouoMwAQ1Ao/8z3GAAMgdI4HPcoAAhAcyIYMP +AAD6AgGiMiGBDwAA+AJhskhwILII2XPaHttBAKAKGLvgePHAz3CAAMgdA4AJgFEgQIHKIGIAjAki +/8ohIgDPcYAAuAaKIIwMigjgAyCRzg1v/gHY0cDgfuB48cByCY/8CHUodiCFQiEBgMohYgCA4QDY +BfKeCWAMqXAB2CSFgObQIWIAzyEiANAhIQDPIWEAgOAkpdQIYgzKIEIDnQGP/OB48cAmCa/8iiIE +Ds92gABkn891gADAIUAmABTo3OoPIAsCJQETAYbPd4AAyB0ihr4fGBC/H1gQIZYEIIAPAAYAABYd +QpAgjoDgAdjAeBQdQpASHQKQANnPcIAAeRwyD+/+IKjyDEADgOAJ8l4NQAOA4AX0Cg1v/gDYKPDP +caAAsB87ga4PoAOKIEwMiiCTAaIPoAOf2QLY9gygAQHZIg8gDgLYI4dIgTSRUyIAAF4JYAkB24og +jA56D6ADqdkA2Z65z3CAAHgpIKDFAI/88cCw4OHFCHWD9rnlzPYKIcAP63LPcAAAmiEi25h1gQDv +/bhzQiUAHKkAr/wPeOB48cAqCK/8mHBBgeS6sIk68nKJz3eAABDG1W3GZ1TK9r4IEYUASSDAAAfy +z3aAABDItn7BjgLwAN7HcIAAEMi2eASICCMDAAgjgwMAI0ABSSDDAxZtdXjPc4AAkMkDY89wgAAQ +ybZ4z3WAAMgdpIW4hQGApXgEIIAPAAAACAZ7A/Bjgei7mBnAAADYC/KkEQAAAN2XvZG4lLikGQAA +qXBRJACAHPLPdYAAyB3EhcC6yIYEJo4fAEAAAD6+HubYekV7/ruYGcAADfKkEQIAhSABBIy6kbqk +GYAAnBkAAB3w/7sS8qQRAgCFIAEElriYuI26kbqcGQAApBmAACSFEIGeuBChC/CUuJa4nBkAACSF +EIGeuJ+4EKF9B0/84HjxwAoPb/wD2M91gABILiCFQHmA4FTyIIVgeQTYgOBQ8iCFYHkA2IfgB/KI +4Cfyi+AM8gDYLPDPdoAAUC4ghmB5AdiA4BnyFPDPdoAAUC4ghmB5AdiB4BHyIIZgeQHYg+AL8iCG +YHkB2ILgB/IghmB5AdiB4N/1AdgK8M9wgABQLiCAYHkB2IXgAdjAeIHgGPIghet2YHkA2Bpwz3CA +AFAuIIBgeQHYuHA32AohwA/JcoojTQWdBq/9CiQABLEGT/zPcIAAmKUogM9ygABsBi94geAL9ADb +z3CgALQPfKAC2AOiZKID8AHYBaItBaADiiDMCOB4z3CAAJilKIDPcoAAbAYveIHgBfQC2ASiA/AB +2AWiBQWgA4ogzAjgePHA8g1P/M92gADIBwCGgeAO8gohwA/rcs9wAACHJ4ojBARKJAAAEQav/bhz +z3WAAMQHIIWC4cwh4oHKIcIPyiCCDwAAiCfKI4IPAAARAcoiwgfp9YLhHfTPcoAAaLRCilEiAIAI +8s9ygACYpSASggCB4l30GLkQuAV5hSEMAH4MoAOKIIsAA9gApQDYTvDPcIAAmKUgEIAAgeAn9L4M +oAcA389wgACQBwCAIIZRIACAAIUQuRi4BXkH9M9wgABotASAgOAK9Ii5MgygA4ogiwAB2ACl4KYr +8Iu5IgygA4ogiwAI2PfxNgpAA4DgC8jFIIIPAQAA/Ar0BSCADwAAADwLGhgwC8iQuAsaGDAAhUCG +QCgBBhC6CLhFeQV5iiCLANoLoAOBuQLYAKYxBU/84HjPcIAAuKAogM9ygABsBi94geAF9ATYBKID +8AHYBaKtA6ADiiDMCOB48cCaDE/8z3CAAMQHABAEAM92gADIBwAWBRBMJACBzCVhgMoiwgfKIIIP +AACJJ8ojgg8AAEwBqASi/cohwg/PdYAAnAcAhQDZz3eAAES0DyEBAM9wgACYB0CAJnogF4EQgeFA +oBH0QCwBBkAtAAQleEAsAQIFeYogiwAqC6ADRSFBAQXYI/DC4c9ygAC0OAmCDPKMIcKBB/KMIYKC +BvKAuAbwRSDAAATwRSBAAQmiQCwABkAtAQQFeUAsAAIFeYogiwDiCqADgbkC2ACmiiBLBNIKoAMg +hYogSwTKCqADKIchBE/88cDPcAAACBxyC+ADocH/uA3yz3CgACwgEIAE2XzaPdtAwItwJgpgChe7 +ocDRwOB+gOAA2soggQAN8gHbz3KgALAfeaJ+ggIjQgBwccIibQBCeOB+FcjHcIAAOLE0iAHhL3mE +4TSoAxICNoz2z3ADAIQAoBoAAIogCAAGGhgwC/CKIBAABhoYMM9wAgGEAKAaAACKIAQAKQKgAwDZ +AdrPc6AAsB9Zo36DgOAF8iJ7cHCD9wDYAvBIcOB+4HjPcqAALCBwgoDgCvICI0IA13IAgAAABvdQ +cIb3ANgF8HBwfvcB2OB+8cDSCm/8mHClwSh3uHMA3gQjgA//AAAAGLoFem95CLn/2Ai4ZHgouAV5 +RXkI3fQkgAMneETAVghgDBAUADESFAIxYb1AKAEEBXlHeUTBEBQCMRQkgDOA5UCwAeYp91MlwgVA +pwAUDQEH2QfwEH0UJ0wQALRhuRQkQDC7e0+9AJCle4HhcHt4YDL3BCCADwAAAP8QuAV6QKehAm/8 +pcDgePHANggAAOoIAAD+CAAA0cDgfuB4z3GAAPQoQCEAA1UhwgVQcEb3ANkEGFAAUHC99+B+4Hjx +wFYLIAYA2F4Ob/0A2M9wgADsWjIPT/3PcIAAzFoqD0/9Fg2P/pIMAAgB2ADZugogA4DaSggADKoL +gAJWCkAMXgyAAaYPwAIA2LIJ7/4Icc9wgADwFQCIUSCAgAfyz3GgAMAdAIGguAChJg2ACuoPwAJ+ +D2AB/9hyD0AB0cDgfvHAgglv/Iog/w/PdaAAOC7HhQelz3CgAFQuC4DTuAYmAHAPAP//mgxgDRbZ +MgvAAcelvQFP/OB48cCeCiAGAdimDW/9AdhaDgAO0cDgfuB48cDhxQDdz3CAAOgGoKDPcIAAfJes +sAYJYAypcCYMT/1uDWALqXAWDsADQgkP/u4OQAGOCa/8qXBaCY/8aQFP/ADZz3CgAOwnK6DgfvHA +5ghv/APZz3aAAPAVYg1gDclwoI5EJUARheAN9AohwA/rcoogRw1620okQAD5AK/9QC0FEgGOg+DE +9mO4Aa5eDAABDQFP/PHAocGLcCINYA0B2UoMAAGhwNHA4H7gePHAgghv/ATZpMEGDWANi3DPdoAA +dBwAhgHggeAAphH0AdjPdaAAyB9RHRiQIN/wpUMdGBAA2F4JIA6NuPGlAIZCIECAAKYH9ADZz3Cg +AMgcMaDuCwABlQBv/KTA8cChwYtwrgxgDQHZ1gsAAaHA0cDgfuB48cChwYtwWgxgDQTZAMBRIECA +eA4iBsogogAAwFEggIA4DwILAMBRIMCApAqCBgDAUSAAgWwOQgYiD2AMAdjPcYCu4AHscCCgAcjs +cQChz3KAAICUiiSBfQDZqCAAAvAiQwDscGCgAeGmCyABANihwNHA4H7xwOHFo8EB2EDAz3WAABAW +qXDaC2ANXNk6hRuFJHg8hQR5gcB+CS//QcEBwDuFBHlBwXIOYAOKIFgEVSVAH/oJL/+pcc9wgACI +F+4JL/9AJQEbi3AGCiABBNlCCi//AcCyCM/+AIWA4AX0BYWA4JQLAf+hBy/8o8DxwCYPD/yhwc92 +gAAYHMlwAd2eC2ANqXGKIBcKDg5gAwESATZAjoogFwohjhC6/g1gA0V5QMWLcKoJIAEE2VUHL/yh +wPHA4cWhwYtwYgtgDQHZIMDPdYAAHBwApYogFwrKDWADARIBNoogFwq+DWADIIVA2c9wgAD0lvoK +YA1AwV4KAAGmD8AGEQcv/KHA4HjxwJYOD/zPdYAAQBwChSOFAd4QccB+qXAGC2ANA9kyCgABgOYD +8gKFAvAAhdUGL/wDpeB48cDhxc91gABgHKlwogpgDRDZABUEEEwkQIAO8kwkwIAR8gohwA/rco/Y +jbiP23UGb/24cwGFDLgEIIAPAQAA8AGlA8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4nbifuOxxAKEB +EgE27HAgoPYJIAEB2GUGD/zxwADYz3GAAAAAAKEBoQKhz3DQ/gAABKEAFgBAABYAQAAWAEAAFgBA +A8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4nbifuOxxAKEBEgE27HAgoJoJIAEC2O4PgALRwOB+4Hjx +wAAWAkChwUDCARSAMFEgAIAG8s9xgADclgXwz3GAAMSmQKFgiQHaB/AAFgBAFSGMAACkAeJ9eBBy ++fdRIwCACfIAFgBBA/AA2BUhjAAApAHiheK69wPM13AAAABAAdjCIAoAF7jHcAAOAACDuJ24n7js +cgCiARICNuxwQKA+CSABAomhwNHA4H7gePHA4cXPdYAABAipcEIJYA0I2QCFz3GgALgeAqEBhQOh +mggAAVEFD/yRAAAB8cCkwYtwHglgDRDZA8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4nbifuOxxAKEB +EgE27HAgoADAUSAAgAPABvQCwa4OIAEA2gXwKg1gAgHBhggAAaTA0cDgfgkAAAAFAAAA8cAuCAAB +9QIAC+B48cBmDC/8ANnPcKAA0A81oAAWAkEAFgFB6boDzBby13AAAABAAdjCIAoAF7gAII0PAA4A +AEAhAwPPcAAA/P9keKV4nbifuBPw13AAAABAAd3CJUoTF73HdQAOAABAIQMDz3AAAPz/ZHileOxz +AKMByOxzAKPscCCw7HMA2ACz6LpC8gNp47oEIIAPAAD8/wDbCfLPdaAAOAQA22itAdthuBB45LoM +8qFrCL1lfc92oAAQBLi2AuNve2K4EHgA3RTww2sYvuJr738Qv+V+4Wvvfwi/5X5lfs93oAAUBMun +BONvewHl2mjRdaz3AN4I8M91oAA4BGitAeNvewHmUyBNALF2t/flugjyAdvPcKAA0A8RGNiA5roJ +8gPYz3OgABQEEKMB2ASj47oG8gAWg0DscGCoYbnkugnygeHH9wAWA0HscGCwYrlEIoOBQSmAABX0 +AN4L8M91oAAABOyNABaNQOx14K0B5rJosXZH9+e69PUAFo9A9vGC4xT0ANsK8M91oADUA9yVABYN +Qex1wLUB4xt9sXNG9+e68/UAFg5B9/HiuhXygODKJA1w4HjoIO0D57oJ8s9woACYA32AABYAQAPw +ABYDQOxwYKAA2gbwABaDQOxwYKgB4lMhQAAQcrn3tg7gAAHYANjPcaAA0A8RGRiAz3GgABQEBKHP +cIAAcCgZgM9xoADQDyK4wLgVocECD/zgePHAVgoP/AAWhUAAFoBAABaAQAAWgEBMJQCEzPYKIcAP +63KKIN8EXdttAm/9SiRAAADZTCUAgM92gAB8HCmm0/cocgAWg0AVa891gAAQxgBlUSBAggv0AeKw +cg8hwQApprH3rg3AAF0CD/wKIcAP63KKIB8Fa9tKJAAAHQJv/QolAAHgePHA4cW0wYt1qXBSDiAN +FNkAwIHgBvSWDiADqXCYcB3wguAH9PoMIAOpcJhwFfCD4Ab0vgsgA6lwmHAP8ITgB/SmDCADqXCY +cAfwhuAf9DIMIAOpcJhwA8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4nbifuOxxAKEBEgE27HAgoFIN +4ACIcMEBL/y0wAohwA/rcnzYjbiKIx0PSiQAAHUBb/0KJQAB8cDhxaLBi3WpcK4NIA0C2UYOIAOp +cNIMwACJAS/8osDxwAYJD/wAFhBAocFMIICgyiHGD8oixgfKIIYPAACPDMojhg8AAIMFyiQGBCAB +Zv3KJSYAABwANIt1qXCOC+AABNmKIMwKzg8gAwpxhCgIKC93ACeOH4AA2KL6COALBG7PcIAAvKQY +gBJwEfIgFoAQgOAk8qlwBNmZ2h7bIg/gCRi7ANggHgIQGPDHd4AAzKIKh4G4CqfPcIAAbAYvgIDh +AdoF8kSgBNgG8ADZLKBJoCSgBdh2DUADsQAv/KHA4HjxwOHFz3GgALAfO4FGDyADiiDMDc9wgAB4 +KQCABCC+jwDAAAAI9M9wgAC0oACIjCDDjwXyxg+v/QHYz3WAAGSfqXCWDCANUtmeCwAHo4WKIEwO +Ag8gA6lxrgvAAIogjA7yDiADZNmCCyABqXAIcc9wgADsV5IIwAv+2c9wgAC0oEEAL/wgqOB48cDP +cIAATKVGDCANDdlyC8AA5grABdHA4H7gePHAkg/v+4ogzA6iwaIOIAOKIYUEi3AeDCANAtkDFJEw +TCGAoI/2BBSFMAohwA/rcs9wAACEDIojBQixBy/9CiRABAIUgDDPdoAAbAaEKQgoL3cgHgIQz3CA +APCi+WAoiUAgEgKA4QAUFDEAINMDHPKKIEwNOg4gA4ohhQqKIEwNLg4gAypx/glgAUIkgCEB2BG2 +/9ghHgIQQCYAGMoJ4AAE2WrwANgRtiEeQhTPdYAA3KBAJRAS/WWLcKlxgg6gCgLaQCUAEjILIA1C +JIEhACeAH4AA3KAIEAUAz3CAABDOBYBTJUEFEHHKIcYPyiLGB8oghg8AAIUMyiOGDwAAfgHoBib9 +yiRGBH4LIAcqcEokgHAA2aggQASEKQgIL3AyIgIggOII8ggVBRAwIAQgDCRAgSXyAeFAJgAYLgng +AATZAdkIG0IghhUAFoC4hh0YEJIKYAMocIogTA1WDSADHHmKIEwNSg0gAyKFiiBMDUINIAMqcXEG +7/uiwAohwA/rcs9wAACGDGUGL/2KI4YD4HgAFgBAzQHAAPHA4cXPdYAAOLOpcI4KIA0D2QGFz3Gg +AIAlDKEChQ2hAI1RIACAANiOuATyD6ED8BChmgnAAFEGz/vgePHAzg3v+wTZo8EA30LHAgsgDYtw +PtjGDCADARIBNj7YugwgAwQUATE+2LIMIAMGFAExA8zXcAAAAEAB2MIgCgAXuAAggQ8ADgAABhQA +MRt4E+AEIIAPAAD8/yV4nbifuOxxAKEBEgE27HAgoADB7HAgoAQUATHscCCwBhQBMexwILAGFAQx +USQAgA3yARIFNgohwA/rcs9wAABPJnkFL/1W2wHdz3EAACIiMgwgAz7YGg2gA6lwAsEleELAAMBR +IACAyiWiEMohgg8AADMzDAwiA8ogog/PcKAALCBAEBAAAvAB5wYUADEQd4AACgCC5QQUADGCxhb0 +G3gQeMlxPg6gA6ly7HEAqQQUADHJcRt4AeAQeCYOoAOpcuxxAKkI8MlxGg6gA6ly7HEAsQQUADFA +IEUAz3CgACwgEIAvJUgBAiAABNdwAQCghpoH5f8EHEQxCBQEMAohwA/rcs9wAABQJrUEL/1521IM +gAPPcKAALCAwgD7YZgsgAwIhAQQ/2FoLIAMCwU4I4AACwKUE7/ujwOB48cAAFoVApsFMJUCFABxC +MUT2TCUAgk32CiHAD+tyz3AAAGYZettdBC/9SiRAAAAWgEABHAIwABaAQAIcAjAAFoBAAxwCMItw +egngBYHBAsKA4g/0ABSFMAohwA/rcs9wAABnGYTbHQQv/Yokww8EwGB6BcEDwYDhC/QKIcAP63IA +FIUwz3AAAGgZiNvt8QHAgODiIEIAZg+AAKbA0cDgfvHAogvv+wnZz3aAAAg3HgggDclwAJbPdYAA +cLBRIACACPIB2EwdAhCWD2ADGNgJ8EwVgBCB4AX0AthMHQIQAJYihiK4wLhNHQIQz3CAAFQ3IKDP +caAALCBQgXKFAiLAAP+4A/RSpRCBA6XPcIAA5FkAgEIgAIDKIGIAgOAI9M9wgACUNwCAgOBsCYIC +CIaA4AX0z3CAABDOCJAVpQCWJbjAuEYPL/4D2bIOgABhA8/78cDuCu/7B9nPd4AAlDduD+AM6XAI +FwQQRiT+gwvyCiHAD+tyiiBNC3fbCQMv/UolAACgh+G9FvIUFwUQxofgvcwlIoDMJiKQDPQKIcAP +63IQvYogjQuC29kCL/0AJYQTz3AAADCnEqcA2FElAJETpyOHDvIOpwGHj+Avpwvyz3ABACjbEqcB +2BOnBfAup//YD6fmDEANFg6AAL0Cz/vgePHApcGLcNYO4AwF2QDAUSAAgBXyz3CAAMgdA4AYiIHg +DfQA2Jq4z3GgAMgfD6EBwKQZAADD2Bq4DqHSDYAApcDRwOB+5QOgBQDY4HjxwOHFABYAQILgz3WA +ANwHAKUH9ADZz3CfALj/PaCiDYAAIIWE4T4ADQAzJkFwgAA0XkAngHI0eAB4jglgA1TYUSBAgA/y +z3GAAGg4AIGBuIYPYA0AoQfw/glAAwPw+g5ABBkCz/vgePHACghACFINgADRwOB+4HjxwLYNoAgA +2M9xgAC8IBqJRghgDTiJ0cDgfuB48cDhxc91gADIHQCFuhAABlEgQIEN8gohwA/rcoXYjbiKI9wI +SiRAAIkBL/24c9IMAAoqCeALAdjPcIAAXCMUiIfgHvQBhboQAAZRIECBGPLyDU/9z3GAABDOBJAl +gQq4MHAO8gohwA/rcobYjbiKI5wLSiQAAD0BL/24cwYMz/xODeAKANi6DgADogyAAFkBz/vgePHA +eg6gCADYYggP/c9xgAC8IBqJkg8gDTiJ0cDgfuB48cCiwYtwBg3gDAjZAMCA4M9xgACoOAChB/IG +FAAxA7EEFAAxArFSDIAAosDRwOB+8cCCCO/7gdihwWDAANgBHAIwA8zPdYAAxAcCHAQwiiCLB3IP +4AJf2YogiwdmD+ACIIWKIIsHz3aAAMgHVg/gAiCGz3CgACwgQBARAACFgOAP8s9xgACQBwCBgbgA +oc9xgAC0OAOBAeADoQHYAvAC2BpwAMD6D+/7CnHPd4AAtDgDEgE3XpeB2GCFDgmgDQokAATPcKAA +LCAQgEAfQBRMIICgEadIHwAUWPLPd4AABDkAh4wgw48a8oogCwDWDuACiNnPcIAAFFoKCIALIIVA +hv/YAKcYuRC6iiCLALYO4AJFeQDYAKUApgCFheAD8gDYBfAAhoTg/fUB2C8mB/AP8r4LYAMS2IDg +CfTPcIAA/FklgCOBIIEyCIALAIWA4ATyANgG8ACGgOD89QHYLyYH8AX0fguAAoDgEPKKIAsAVg7g +ApfZz3CAAJAHAIAvKAEA8g9v/U4gwAeJB6/7ocDgePHAJg+v+4DYocEDEgE3YMDPc4AAxAdgg891 +gAC0OAIcRDAvpShySiAAIAEcAjQKCKANCiQABM9wgABwKGQQBQBRJYCADPQAFAQwCiHAD+tyz3AA +AHYnGQfv/I/bz3CAAMQHAICA4DICAgCWCAAKgOAmAgIAz3CAAJQ3AIBRIACBFgICAIogCg+qDeAC +ARIBNtoMQAnPd4AAaLTpcN4K4AyKIQsPBZeGIH8MHHhTIICAB/TPcYAAjAcBgYa4AaECj1EgQIBc +9M92gABguPzcAiYAE6oK4AwY2a6XQiUEFowkB4HN9wohwA/rcs9wAACBJ7jbfQbv/IolBwHA3AIm +ABN6CuAMiHHA3EAWhZDPcIAAjAdMJQCAAiYBEyWgDPIKIcAP63LPcAAAdye920EG7/yKJIMPQRaN +kEAlhRBMJYCIQCWBHziozfcKIcAP63LPcAAAeCfD2xkG7/yKJIMPwNwCJgATz3GAACC0ogxgCqhy +LpfPcIAAjAcgsBjwHBcEEYwkCIDM9wohwA/rcs9wAACLJ8zb2QXv/IolCADPcIAAZLfaCeAMiHED +j4DgaAAuAADZz3OAALS6z3WAADS7z3aAAFS5ABYCQEAjAAw1eECgABYCQUAlABw0eECwABaAQFJp +VHraYhCqEaoSqgAWgEAUqhWqFqoAFgBBz3KAAHC7NXoasgAWAEEB4RuyA48QcbQHxf/PcYAA5LrP +coAAZLuKCuAG6XAmCWADEtjWDWAEBNgByM9xgABkvM91gADIB8AZAIDPcIAAxAcghQCAELkYuAV5 +iLneC+ACiiCLAAHZz3CAAMQHIKAAHQAUogzv+wDAggmAAoDgwAmCDQMSATfPc4AAxAdgg4DYKHKq +DWANSiRAACLwBIUB4ASlz3CgANQDHJBiD8AAAMBmDO/7AtkDEgE3z3OAAMQHYIOA2Chydg1gDUok +gAAiD6AJAtiKIEoPYgvgAgDZsQSv+6HA4HjxwAohwA/rcs9wAAAwJYojjAeKJIMPeQTv/EolAADg +ePHA4cUg289xoADIHGmhABYAQM9yoAAQFAyiABYFQAHdTCUAgMohwQ/KIsEHyiCBDwAALCXKI4EP +AAAJATAE4fzKJEEDGBpAAWgZQAED2A+iuaFqoZIPQABJBI/78cDhxa3Bi3WpcFII4AwN2QDAHXhT +IAEARCk+DalwACGBf4AAiMRCC2AKDdpeD0AAFQSv+63A4HiBBmANANjgePHA4cWswYogkg2OCuAC +vtmLcAoI4AwM2QAUADGA4BT0QCSAMM91gADgMqlxQgpgCi7aAdhgHQIQF4WA4OAL4fvKICEAABQA +MYHgGPSKININRgrgAs/ZQCSAMM91gADgMkAlgRsKCmAKLtoB2DeFYR0CEIHhqAvB+9IOQACJA6/7 +rMDgePHA+gqv+xfZt8GOD6AMi3AjwEojQCBTINEAhiD+A0whAKRCKBIBDBxCNI/2CiHAD+tyctiN +uIojTg8KJMAEEQPv/AolQAQSwc92gAAQxkEpQANTIBAAIMBAKU0hUSAAgKBm3WWGIPcPX/SA4An0 +CiHAD+tyc9iNuIojDwHf8c9ygAAENMASAAa/4Ev3iiOPAfJo9H9fZ2CnBB9AFCKnAeDFuMAaGAAB +wALBKnLWDa/7Zm2A4DTyCnDiDyANKnENFIAwhSDBAA0cAjCKIP8PU8AAham4AKUSwIYg+w8ouA2t +SiQAdADYqCDAAv/a22BAKUEhEOM7Y0CrAeAqcA4PIA2Lcc9wgADIHfAgAQS2EQAGDyBABLYZGAAB +3wPwAt/CCyACKnAG8IDgyifBFMonIhKB57D0IIXPcIAAyB0DgBiIKHaB4IYm+x8R8ooOQAKA4CCF +GvLPcIAAXCMUiIfgFPRBKUADUSAAgA7yE8DouBLCCvKGIvsPQSoEAk2NkHIE8qi4U8ATwBLCBnlE +eCV4gOYApYYg+w8L8oDgyiBBBMohIQCICGEDyiLhAwwdghQA2M9xgAAQyRYhQQRAhQCh9boBoQX0 +ANiLuAGh9roF8gGBhSABDgGhtg7v/ItwDRSAMFEgQIEN8lgUADEFtYDgyiBCBMohIgA0CGIDyiLi +Aw0UgDBRIECAGvJQFAAxgOACtRTyAN4Q2BpwApURIICDyiBCBMohggMECGIDyiKCA0IgQCCA4AHm +MfcNFIAwUSAAgQbyKnAiCeAAVRSBMA0UgDBRIMCAG/I1wVYUAjEqcHYMb/0Sw4wgAoC4cA30CiHA +D+tydNiNuIojkgHVAO/8SiRAAFElwIHKJyIRyg8gDSpwA8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4 +nbifuOxxAKEBEgE27HAgoFIMYADpcJUAr/u3wPHANgiP+892gAAENMAWABa/4KTBSveKIlILMmg0 +edlhQKEA2kGhQqEB4MW4wB4YEEojQCCBwJ4MoAxqcQDYavCCwJIMoAwC2QLAi3I6D6/7A8EEIMAE +LyMHoFryAMLPd4AAEMY1aiFnLblTIRIAwBYBFgDYv+EPIIAAS/eKI1IOsmm0fd1lYKVBpQgdgBQB +4cW5wB5YEM9xgADoBkCBLyEKIAQhgKAAoQb0gOJECGIEyiAiCCDA7g+gABDZAMAA3YoiCAA1aPlh +orFAoalxmg4gAw/aAMCA2jVoP2fPcYAAyB1Ir/AhgwRJr7YTAQYEIUEEthtYAM9xgAAQyRZ5oKGh +oc9xgABwxRR5oLFAIEAgGnAhwBJwLAfN/wPM13AAAABAAdjCIAoAF7jHcAAOAACDuJ24n7jscQCh +ARIBNuxwIKA2C2AAanBFB2/7pMDgePHAz3KAAAQ0wBIBBr/hS/eKI9MGEmkUeFhgYKAA22GgYqAB +acW4agpgCsAaGACGCkAA0cDgfuB48cDhxQAWDUADzAHa13AAAABAAcjCIooAF7rHcgAOAABmC2AK +UyUBEFElQJDPcYAAkDoB2MogIQD9Bm/7AKHgePHAocGLcAYLoAwB2QAUBTBMJQCADPQKIcAP63KJ +2I24iiNfCp0Gr/xKJEAAz3CAAAyxCgpgAAMYQgGhwNHA4H7xwCYKgAbPcIAAyB0sEIQATCQAgQj0 +DoBRIECBBPKaCcABEfBMJECAC/LPcIAAXCMUEIUATCXAgcwlYoIF9KoPj/vRwOB+CiHAD+tyz3AA +AOwcMQav/F/b8cDODU/7ABYSQQAWAEHPcYAAEMZAKkAhMCEFAKLBTCIApEEtQANTIBEAj/cKIcAP +63J12I24iiOVDEokQADtBa/8SiUAAFElQIIN8gohwA/rcnbYjbiKI9UM0QWv/AokgATPcIAAEMgW +IIAEGnAGCqAMAtnPcIAA8MQWIIAE9gmgDALZQCqVIQAlgC+AAJDJ4gmgDBDZi3DaCaAMAdkAJYAv +gACQyd4P4AUQ2QEQgCCQ4I/2CiHAD+tyd9iNuIojFgVKJEAAZQWv/AolgAQA3xDYenAVJcAjz3GA +AJDJMCEUAAQkgq8AAAABBBwANUfyIcHPcIAA8GEuYAQkgC8GAAAAMbig4d1g0SThojLygOID8oHm +CvYEJIQvAAAAJAwkgI8AAAAkJvKC4EgADQCC4AX0gOIe8oLmHPSA4gPyzOEY9s9wgABQLiCAYHkG +2BB2EPdRJMCiEPLPcIAAyB3wIEAEuRAABgQgvo8ABgAABPQA2QPwAdkveQPwAd2pcQQkgC8BAADA +LrjPcoAANG4IYhB1AdjCIA0AgOHMICKAGPJCI0AggOAuB+3/AecCEIAgz3GAAOhhCGGB4BzyCiHA +D+tyediNuIojlgo58QohwA/PcIAAyB3wIEAE63KKI9YJuRAEBnjYjbhBBK/8CiUABQMQgCAIYYLg +CfIKIcAP63J62I24iiMWCxnxJgsgDUpwz3CAAPDEFiCABECQz3EAABgVCSJBAH4PIAAgsPEDb/ui +wOB48cAAFoFAz3CAAKRbIKgAFoRAABaBQM9wgACtWyCoABaAQFAkvoHKIcIPyiLCB8oggg8AANoU +yiOCDwAAaAe4A6L8yiUiAM9wgAC4BgCQgOAF8hoJwAwaCMAMFg8AANHA4H7geIkDYAwA2OB48cBK +C2/7ANlKJABy4HioIIACABYCQBUiQDAWGJgAAeEAFg1AABYOQHIIgAzPcKAAFASsoM9woADUC9yg +xg4AAHUDT/vxwP4Kb/sI2aLBARIONs91oAA4LhwVEBA6D2AMi3AAFAQwAN8EJL6P8P8AAMohwg/K +IsIHyiCCDwAApijKI4IPAABEBgADovzKJcIAUSRAgsohwg/KIsIHyiCCDwAApyjKI4IPAABHBtwC +ovzKJcIA56V6CGANP9gAwAQUATEHpcINYAyCuRwdABQ2DiAAARqYM9ECb/uiwPHAANieDSAABBKB +MAQShTAKIcAP63I42IojzwyRAq/8SiQAAPHA4cWhwYtwjg5gDATZAg8AAoDgB/LPcIAAXCMUiIng +DvIKIcAP63LPcAAA1Btb20okAABVAq/8CiUAAc91gADIHQGFuhAABlEgQIHKIcEPyiCBDwAA1hvK +I4EPAABcAMoiwQfm8wAUADGA4MP2juDJ9gohwA/rcs9wAADXG13b2PGiDs/8guAn9ACFuhAABs9y +gABoI1EgQIEK8j6VDJIwcBvyABQAMTBwF/IAFAAxDLIB2MoKr/0IcQvIkLgLGhgwC8gFIIAPAAAA +1AsaGDDODU/7DvALyK64r7gLGhgwvg1P+wAUATHPcIAAaCMssBINAADJAW/7ocDgePHASglP+892 +gABkLgCGz3WAAHwvUSBAgiT0ANgQrQHYEa1WJoAVsg1gDAvZViaAFVUmwR2uCCAKC9oQjc93gAAM +L0QoPgtAJ4ATMiBADoHgAdjCIAEAEq0Ahom4AKYV8BCNMY0wcAb0TiBBAC95Ma3Pd4AADC9WJoAV +RCk+CydwVg1gDAvZcY1AJ8ASRCs+CzIgQA6K4MohyQ/KIIkPAADRG8ojiQ8AAPsAogApAMoiyQeC +4Mohyw/KIIsPAADSG8ojiw8AAP0AggArAMoiyweB4AHZ0fZCIHwA4HioIEADRCs+CwAnQB41eE6I +CogQciXyAeEveR4NAAKA4Bvyz3CAAFwjFIiJ4BX0Hg3P/IXgCfIWDc/8guAF8g4Nz/yB4An0z3CA +AKRaBYADgACA7gmP/dYLAAB9AE/7CiHAD+tyz3AAANMbiiOEAEokAABBAK/8CiUAAeB4zQEgBQHY +4HgVBCAIAdjgePHA4g8P+892gADIHQGGuhAABlEgQIEP8gohwA/rcs9wAAC+G4ojBAlKJAAA+Qdv +/Lhzz3WAAGQuAIXPd4AAYDD03Ii4AKUCJwATJgxgDAXZHxeBkM9woADIHBqACrnKuBV4OGCZIAoA +TR0YEM9wgABcIxSIh+Ad9ACGuhAABlEgQIEX8ogVABfPcYAAEM4lgQq4MHDKIcIPyiCCDwAAvxvK +I4IPAAAyAcoiwge+9cYKgAkeDyALAtg+Ck/8hgtgCgDY8gyAAtoKAACBBw/74HixBCAIAdjgeEUH +IAwB2OB47QEgDQHY4HjxwKHBANlAwQAWAkAAFgBAgeIa8gPM13AAAABAAdjCIAoAF7jHcAAOAABF +IAADnbifuOxyAKIBEgI27HBAoOxwIKAf8MYNYAWLcAPMAdnXcAAAAEAB2MIgCgAXuMdwAA4AAIS4 +nbifuOxyAKIBEgI27HBAoOxwIKAAwuxwQKB+CiAAKHChwNHA4H7gePHAbg4v+wLZz3eAAMBbngtg +DOlwQIfPdqAA7CfPdYAAUC7gukvyK4ZEIoAAhiL/DiK6obkUurS5BSCDAGV5K6YEIIAPEAACAAQi +gg8QAAIAz3GAAMgFRXgLoSCFBN5geclwh+AL8iCFYHnJcIbgB/IghWB5AdiB4BH0AIfPcaAAyBxR +IECAB/IB2B6h7g6ABQXwANgeodYLQAUghWB5AdiF4DX0AIdRIMCAMfLPcKAARB3FoMOgxKAp8M9w +oADIHAHZPqALhoG4C6ayDoAFIIVgeQHYheAT9M9wgADIHQOACIBRIACAC/IA2ZS5z3CAAMgFK6AL +hpS4CPDPcIAAyAUA2SugC4a0uAumIgkAAMkFD/vgePHAz3CAAPATjgpgDALZCgkAANHA4H7gePHA +Rg0v+wDaCHUods9woADUCziAQiEBCIDhyiGMAEAmABIQcbAPxQwDzNdwAAAAQAHYwiAKABe4ACCB +DwAOAAAHbgQggA8AAPz/JXiduJ+47HEAoQESATbscCCgIr4G8OxxAKEE5WG+geYAhTr31ggAAEEF +D/vgePHA4cXPcqAA1AsD3bGiANtwogMSAjfXcgAAAEAB2sIiigAXusdyAA4AAEUiAgadup+67HNA +owLaFBqCMAUSAzbscmCiCxICNwHiCxqcMOxyAKIBEgI27HBAoOxwIKAB2M9xoADIHxOhWIHscECg +GYFaCAAAz3GgAMg7DoGIuA6hwQQP+wPM13AAAABAAdjCIAoAF7jHcAAOAABPIIEAnbmfuexwIKDP +cKAAFAQD2SWgARICNs9woADUC02gz3CgAEQdNaDgfuB4A9rPcaAAFARFoc9xoADUCw2hz3CgAEQd +VaDgfgPaz3GgABQERaHPcaAA1AsNoeB+A9rPcaAAFARFoc9xoAD8Cwypz3CgAEQdVaDgfuB+4Hjg +fuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geM9zoACoIDGDz3KAAPQoA4I4YAOiAdgSo+B+ +4HjxwHILL/u4cc9wgAC8pGAQBABKIAAgTCSAgMoixgfKIIYPAACRDMojhg8AAK0HjANm/Mohxg/P +cIAAbAYHgIQsCAgAIYF/gADcoEwlAIAWeceBPvTPcIAAfCl2Cu/8iiEPD89wgAAQKWYK7/wg2c9w +pQAIDKCAUyVNkBPygeUT8oLlFPIKIcAP63LPcAAAkgyKIx8FmHUlA2/8CiUABP/YBvD/2Ai4BPD/ +2BC4z3GAAMgFDKGtoc6hANmRuc9woADQGzGgIgxgCwHYH/DPc4AAyAUOg4DgG/TPcYAAUGPPcoAA +fCnPdYAA9CiKJMN/CnCoIMACD2EVJcMT54PwIg4AAeD+Zsej0QIP+zgTBAAKIcAP63LPcAAAkwyK +I58JnQJv/AolAATgeOHF4cbPcKAAFAQD2SOgFcjPcoAALLJhks9xgAAcscSKFCENAGi1ACCDD4AA +PLE44cCrYoIVeQaSYKEDEgM2wB0EEASCoBMBAIYhww8leKAbAADBxuB/wcXxwPoJD/sIdrYO4AEo +dYDg0SVikwHYA/QA2AS4z3WAADDOFHgJZYHhHWUK9DYIYAupcK4Kr/0BjQDYAK0BhSkCL/sApvHA +qgkP+6LBFRICNs92oAC8Lc9wgADIHU6mJIAA3UYREQENEhA3VSFGCkYgwCADEgM2DRocMKQTAACE +uKQbAAABk1UhSAmA4FUhxwiGG0QDCPLPcIAAHLL0IIAAgOAJ8gGD7rgF9FAgACAvIAggUyB+oFQD +AQDPcIAAkDpmEAAGz3GAAJA6AeBmGRgABBIBNqQZQAMBk4DgRfLPcIAAHLFUeIAQDweA5z300BAO +AVMmzpAV9HITDgHgk8J/uBOOAMJ/8H/gGMQDpBMOAIYm858F8mi/8H/gGMQD4BAOAXATAAHhkwJ+ +EHbCII4DwicOEHQTAAG4E44A+GDYYBB4kBkEAL4ZBAB0GUQDoLEQiwDeEKkBgwGhCIsIqRKLEqmW +vjDwD4b3uP/zz4b2vlMmwBIo8o7gTvfPcIAAkDqcEAAGtr7Pc4AAkDoB4JwbGAAa8GS4EHiQGQQA +BCaAHwAAAPAsuBCpdBlEA6CxobG+GUQDAYOoqYYg/w2EuAGhEosSqfa+RAIBAADY9b6WuKQZAAAS +8voPb/4A2AQSATakEQAABCCDDwIAAAAtuwUjAgQvIIggPvABgVEgAIFQ8nCJz3eAABDGFWsAZ096 +9rjSiUkiwgAI8s9wgAAQyHZ4AYgD8ADYx3KAABDIdnpEiggmjhAIJgAQSSDCAxZrVXjPcoAAkMkC +Ys9wgAAQyXZ4z3OAAMgdZIN4gwGAZXgEIIAPAAAACAZ6ANiWuJgZgAD0uEGBhiL/DSDygOJT8pgR +ggBAJwAJSmDPc4AA3KZAwiDAw7gcePQjAABX8AohwA/rcjTYjLjPcwAArQuKJIMPiQcv/EolAACY +EQMA6bucGUADJPKA4oC4pBkAACvymBGAAIYg/wNEuDImAgDPcIAAyB0DgIm6QMIgwxSAZHiGI/8D +hiD/DkS7eGAPeM9zgABwYvQjAAAh8FEjAIIJ8oDiCfKYEYIAQCcACUpgDPCA4gT0ANgIchHwmBGA +AMO4HHgyIAIQQMIgwM9zgACEpsO4HHj0IwAAhBkEAJgRAACIGYAAkBEBAb4IIAAA2gQSAzYDEg02 +z3agAMgfhBMBAYIbBAAZYTB5sBtEAPgWAhCwFQARQngAIE8Ez3CAAMgdRIBUEgABH2c/Z6AWDhDw +f9F3OgANAFCCmBUOEAsigIMX9HCLUI1wctEmIpIa8pgVjhDPc4AA8GHLY4Hj0vYFus9zgAAQxkJj +8boK8s9xgACQOq0RAAYB4K0ZGAAQ8DhgEHiGHQQQz3GAAJA6ZxEABg0aHDQB4GcZGABFBu/6osDg +eKHB8cDWDc/6CHVHwOi9KHDiACEASHYDuEAgkQUnwc9wgADwYQQlkh8GAAAAQSpCJCtgBCWAH8AA +AAA2uKl3emLPc4AAAG7GvwhjSmMaYkEtgBJSIAAAwLgDuBjgheLKII0PAQCJDdUgjgAvIAggBCWC +HwAAABjPcIAAAGXXcgAAAAgeACIA8CDAA6DhEgABAM9xQnvQXgUofgAKIMAOKnEFKT4ACiDADkwi +AKAkuAHgBPJTIAEAOGDtvQIogSPPcoAAyB1EglYSAgER8s9zgAA8ZmCTBSs+AAAhgH8AAP8/Lrg4 +YJUAIABYYBV5jQAgAFhhUSVAklIAIQAnxbflIgALADNoUyUCEM9wgAC4YvAggAAFKT4ACiDADgHg +BvCK5cAo4QDAKKIAz3GAAMgdI4HA2jSBpHmGIf8OIrk6etp6OQAgAFhgM2hTJcAQHHjPcoAAgGbw +IgAAFuEFKT4ACiDADs9xgADIHSSBAeBWEQEBFXkU2Np4OGAQeAjcuwTP+s9xoACwHzuBQSiCBdW4 +QSmDBdW5AnnPcIAAEM5iegWAyboFKL4AJ3HPcIAA7FoDgACA4H84YOB4z3GgALAfO4FBKIMF1bhB +KYIF1bkQcVtjSffPcoAAEM5FgllhAnkB4wLwAnlAK4AFmQfv/yV44HjxwOIOz/ruC+/6UNlFwEog +ACD+DS/+hsVMIAClBBUBFE73BcDXca3e774VIAAEIKBAIFAg8vUk3B8Ez/oKIcAP63LPcAAAixOK +IwcHmHPtAy/8CiUABOB48cCeC+/6mHCC4LhxyfcKIcAP63J92I24yQMv/Orbz3CAAMgd8CABAUwl +AIAocIAgCwlAIA8GM/RIgQDbQKBJgUokgHBBoFyJSKhdiUmoKhGCAEqoKxGCAEuoLBGCAEyoTZFH +sFeRSLBIgQQigg8ABgAAgOIB2sB6UqhbgaMYmACoIAADtJGEKwQPACBCDgHjtqqogcC9tKor8Ewl +QIAr9ECAAN1IoUGAAt5JoUiIXKlJiF2pSogqGYIAS4grGYIATIgsGYIAVohUsUeQTbFIkFexoxAA +BhuhhC0EHwAnQB4uCiAJqXFhvoDmAeU29xkDz/oKIcAP63KQ2I245QIv/IojhAfxwJoKz/rPdoAA +ZC5dFgEWXhYCFjBypMFI96wWABACIYMAeGCsHgAQgOEO8oDiDPRfFgAWOGBfHhgQYBYAFjhgYB4Y +EM93gABQBgCHgOAA3QPyYB5YE2AWABZDwkDAXxYAFkLBENm+2kHAi3Ae28II4AgYu14eWBNdHlgT +oKeFAu/6pMDgfuB48cAIcRYJIAKKIFkBQgqP/NHA4H7xwOoJz/qhwTpwKHVIdppzCiMAIQoiQCHI +dwogwCGKIBkC5gggAgvBLMCA4CgUBTAJ8ipwqXHJcgpz7g3gCJh3EPAAHEAxKnCpcclyinMKJMAE +CiWABNh3GgqgCQonAATdAe/6ocDgePHAjgnP+jpwz3aAAHQcAIYB4IHgz3WgAMgfAKYN9AHYUR0Y +kCDf8KVDHRgQANh6CqAMjbjxpaQVEBDPcIAAVDIGgM93gABUsEB4AYeA4CryJNgY2XoKoAwz2oHg +DvIEFwUQCiHAD+tyz3AAAHQZmttpAS/8CiRABCTYAdlSCqAMM9qB4A7yBBcFEAohwA/rcs9wAACr +KJ/bQQEv/AokQASkFQEQiiAYD/YP4AECIQEEAIZCIECAAKYE9ADYUR0YkC0Bz/rxwNYI7/qKIBgO +z3aAAAA4yg/gATKGz3CAAFQyBICA4An0z3EAAK0Lsg/gAYogGA498DKG5OHX9s91gADUWwCF2uBR +9oogWA6SD+ABBNlAhTKGiiCYDhC6gg/gAUV5BNga8NrhRgAKAM91gADUWwCF5ODd9oogWA5iD+AB +iiE/D0CFMoaKIJgOELpSD+ABRXmKID8PCg1ADCCFSBYAERC5ng7v/yV4EoYApZkAz/rgeM9wgADo +N0CI4LoI8s9xoACsLxmBirgZoVEiQIAH8s9xoACsLxmBjrgZoeB+z3GgAMg7HYGA4AjygtgUoc9w +AIARFA6h4H7geM9wgAD4siyIz3KAAHyXjCECgAqSQSgDAwvy67gJ9AW5x3GAABDGApEPIMAAArEA +2OB/DLLxwKYPr/pUaIYi+ANPIkMCUyHCAAUixADPcoAAcMUUeo/hiiMPDMogKQAJ9gCSAN0PJU0Q +iiPPD6Z4ALIA2UokAHTPdoAAVJrPcoAAzJrPdYAA0JqoIMAEFCJAAOSQZH+Qdwz0AN/ksBYmQBDg +oOGgQCUAGTV44KAB4ZUHj/rgePHAKg+P+kh2gOAB3UT2iiX/HxN4gOFE9rN9M3kUIQAAUgjv+jt5 +rHgAHkAeaQev+gHY4HjxwOHFCHIB3YDhyiHBD8oiwQfKIIEPAACbE8ojgQ8AAEgAyiQhABAH4fvK +JQEBgOJE9lN6iiX/H4DhRPYzebN9FCGAAPoPr/o7eax4HQev+i9w4HjxwOHFz3WAAHyXz3CAAMgd +I4BAhQCBEHIe9AKRQpUQchr0AoVeDe/7I4WMIAKAFPLPcoAA5AYhggDbDyMDAAW4ZnkhogAggQ+A +ABDGAIGquIi4AKEA2MEGr/oMtfHARg6v+oogSQZCDeABiiFECIoPAAzPdoAAcLAIcYTgzCEighH0 +z3CgACwgEIAA2kKmA6bPcIAAmJcCgNW4x3AAAIgTCaYNhoDgyiEiAQDdNglgDKlwhOAD9K2mQPAC +hoDgz3aAAAQ0HfKKIIkJiiXFEdoM4AGpccAWARa/4QXaS/cSaRR42GDPc4AAUAdgg6CgYaBCoAFp +xbjAHhgQBdgc8IogSQeKJQUTogzgAalxwBYAFr/gAtpL9zJoNHnZYc9zgABQB2CDoKFhoUKhAeDF +uMAeGBAC2KYJwAPVBY/68cDhxc9wAAD//891gACYlwOlz3CAAFRZkg1ACs9wgABsWYoNQAoA2SCl +BdgBpSKlLglgAgLYpQWP+uB4B9nPcqAA1AcaGliAgOAO8hkSAYYJIEMADxIBhgIgwIB5YQ8aWID2 +9eB+4HjxwOHFCHUVEgE2z3CAAByxNHgRiIDgEvIDyAGA7bgO8s9wgACMb/AgQADPcYAAAB0UeQCR +EOAAsVYMgAvCC+AFFcgDyAHZoBhAAM9xDwD//8YIIACpcB0Fj/rgePHAmgyv+gPaz3OgANQHExuY +gA8TDYYAFgBAABYBQKLBQMEgwJzgD/IKIcAP63I12Iy4z3MAAMQMmHOpBO/7SiUAAAAWDkDQfgAW +EEBWJgASUSAApcAgogAD4AQggA8AAPz/GRMOhkIgDwTRdzv3HWUPG1iDIBuYgBkTAIaI4JP3HxMA +hkHAIcCc4Mohwg/KIsIHNtjKI4IPAADhDM8gIgPM9QYL4AHa2AQggC8AAABATQSv+qLA4HjxwN4L +r/rI2oIkAzIIdSh2z3GAAPRe9g2v+otwAdrPcKAAFAREoM9ygACIOxWCANkB4OK9FaLKIEIgBfQO +D8//GnAVyM9xoABkLs9yoAA4LvAhAAAngtO4JHgEIJEDsPDqDs//z3aAAKDUGnDJcBIKIASLcQoK +oAzJcKLwA9/PcKAAFATwoOSgABYAQAcaGDAAFgVAARpYMQTKnOAe9Itw0g+gCw7ZJMHhvlMhwACG +If4DRLnEHEIwZMBEJo0UG/KO2FEmAJGQuKAcADBv8obYkLigHAAwa/AKIcAP63LPcAAA3A7PcwAA +ygpBA+/7SiRAAEwgAKAH8ozYkLigHAAwVfAFuMdwgAAQxkCASHSEJAyQDvJRIkCCB/KL2JC4oBwA +MAHdQ/CI2JC4+/FMiFBxyiCCDwAAkQDPICIE8fUBwfq5CPIB3ZDYkLigHAAwL/AikDMUgDARIQCA +FfIHyAQggA8AwAAA13AAwAAAC/QiwIDgyiCJDwAAjQCmB+n/zyApBArBjCH/jxHyz3CgACwgEIAi +eNdwAIAAAMoghQ8AAIcAfgfl/88gJQRMIACgzCUhkFj1z3CgABQE46BMIACgqXZe9VMmfpAH8s9w +oAAUBAmAgOBU9eG+M/JMIQCgAdoq8ipxLyhBAE4ggweU48olxRCF92h1gCXCFM9woABoLPAgQAOU +4w94yifFEIT3aHeAJ8IRz3WgABgs8CXNE7FwyiIiAIDiCvIA2A8gwAAGIQGA2vUB2APwANiA4CDz +AQKv+oAkAzLgePHAmgmP+hpwWgkgAjDYmHApuFEgAIDKIcIPyiLCB8oggg8AAOkUyiOCDwAAxwC0 +AeL7yiUiACzYbgkgAkAogSAB34ogDwoacBoJIAIw2JhwKbhRIACAF/KMJw+aMfIg3c92oADIH7Cm +AdhDHhgQANg+CmAMjbixpkIgQCCA4AHnI/fiCCACNNhPIAEFlbkaCSACNNjOCCACLNgIdcYIIAI0 +2PW4uHAY8gohwA/rcs9wAADrFOPbLQHv+0okAAAKIcAP63LPcAAA6hTU2xUB7/tKJQAAKQGv+kEt +ABTxwL4Ij/oIdwDeyXCaC2AEyXED2Ml1gOcacAryz3GAAExYE20UeOYIYAo4YIDnCvLPcYAA3FgT +bRR40ghgCjhgQiBAIIDgAeUn989wgABMpcl0nbAwvJ6wz3CAAMwHzg+gBcCgvQCP+vHAIg1AAYDg +EPLPcIAAZC4AgFEggIIK8s9wgABEWoYIQApiD+AJANjRwOB+8cCiCW/94cXPc4AAkDrPcYAATFtA +gfQTDQBQdQDYivf4EwEAMHIG9/wTAQAwcsP3Adh1AI/64HjxwM9xgABIBnzY9g6gASCBCiHAD+ty +z3AAANsO8NtKJAAAGQDv+wolAAHgePHAkgxAAYDgMPLPcIAAZC4AgFEggIIq8s9wgAB8L3CIUohE +Kz4LACGAf4AADC9VeA6IgeAA2Rr0z3KAAERaBYIDgGCAAoJieIDgyiBLAAXZC7kwcEr2BYIDgCCA +x3EAAAAoJghgCkhw0cDgfvHAWg9P+q7Bz3agANQHA90THliTDxYQlhkWAJbA4L73ABYAQAAWD0Dv +eJzgyiHCD8oiwgfKIIIPAABAAM8gIgPKI4IPAABlDMokwgBUB6L7yiUiAItwlgugCw7ZBhQBMQAU +ADFRIQCBwCCiAAPgC8MEIIAPAAD8/4DjViABAg7yz3KfALj/eqIsw3uiAsN+os9zAGwEAHmiGRYC +llBwPvcAIQAEDx4YkCAeWJPg2LoNoAHpcQHABCCADwAAAEABB2/6rsDxwJIOT/oIds9woABkLvAg +gAPPd6AAwC9TINAEFRIRNhUamDP12AW4eg7gAclxFcjPdaAAFAQKpQmFgOAAD8L/URcAlgsgAIT4 +9c9wAABkHg4OwAERIICD8PMJhYDg7vUVGlg09dgFuDoO4AEqcRXICqWBBk/64HjxwBYOT/rPcKAA +VC4rgAfd07kvKEEATiCPB89woADAL6UQEoYUEBGGz3agABQEqqayDCAIgNjz2AW4gNnuDeABn7kV +EhA29dgFuOIN4AGpcaqmFRpYMwTwA9gFpqmGgOUb8oDl+vNBLYCQCvIvJAlw4HioIIABABYAQOB4 +UyVNkAnyLyRJc+B4qCBAAQAWgEDgeKmG5/Hz2E4N4AEFuP+44fX12AW4hg3gAQpxKB4AFJTnFRoY +NMohxQOF9+lxgCHCAc9woAAYLPAgQgCU58ohxQOF9+lxgCHCBM9woABoLDV4BL9AoMd3gADMwhWH +NocFeReHuIcleAUlDZDKIcIPyiLCB8oggg8AAMIhyiOCDwAAywbKJEIDTAWi+8olIgCA2c9woADQ +GzCgz3CgAMAvpRiYhBQYWIQ5BU/68cDWDE/6osGkEQAAKHVRIACACtjKICEEmBUBEAQhvo8BAADA +dh0EEDH06LlBwRfyIcLPcIAA8GFKYAQhgA8GAAAAMbhYYAQhgg8CAAAB13ICAAAByiChAALwAdiB +4BDyguAJ8oPgANjKIOEBwCihAwrwz3CAAAyxAoAG8M9wgAAMsQGABXmYHUAQnhUAEZQdQBCSHQQQ +EI3PdqAA1AdAwIIVABGyHQQQANiAHQQQfh0EEAPIQZCA4pAVExEJ8hXIz3GAAByy9CEAAIDgEvIZ +FgCWuOBO9w3Mz3GAAIg7RiCAAg0aHDAXgQHg6QMgABehDxYQloDiCvIVyM9xgAAcsvQhAACA4AXy +SiFAIAbwA9gTHhiQSiEAIAcSDzYBEhI2ABYAQAcaGDAAFgVAARpYMQTKnODKIcIPyiCCDwAA3A7K +I4IPAADKCsoiwgdL9KlwIgigCw7ZTCFAoBD0BMgBkIDgIvLPcYAA/DwPgQHgD6ERgQHgEaEY8API +AZCA4BTyFcjPcYAA7LH0IQAAUyDAgAr0z3GAAPw8D4EB4A+hEIEB4BChAxIBNgGB7rgM8lQRAAFT +IMCACPTPcYAA/DwOgQHgDqECFQURTCUAgA/yAYXuuA3yCiHAD+tyLtiMuIoj3gZJA6/7SiRAAACV +sHDKIcwPyiLMBy/YyiOMDwAAngfPICwD7/YwjVMhwAAQrYYh/gOkFQAQRLn2uMQdQhAk9AcSATYC +IcIDgeIA2AbyAidCEIwiw48D9AHYgOAU9A3Mz3GAAIg7RiCAAg0aHDAWgQHgFqEPHhiUBxrYM3UC +IAABGpg0BxrYMwEamDQA2HQdBBBmC2AAqXDPcYAACG4KYXQVAREAIkYAz3GAABBu8CEBAC8miAGk +FQAQdB2EEQV5pB1AEATIAZCA4BXyTCFAoA70QZW4FYAQwHJglRpiUHq+HYQQwHMAIwUADvC+FQIR +CfBAlbgVgBDAchpiUHq+HYQQuHKQHYQQDCNAocohwg/KIsIHyiAiDM8gIgPKI4IPAADcByQCovvK +JMIEAMAQFYQQkHAM8gohwA/rcjHYjLiKI58HBQKv+wAUBTAPFgCW+Lm0HQQQB/K2FQARDx4YkJ3w +ABYPQfy1ABYAQUQnBxMdtQAWCEBMJwCBPB0AEgAWAEFAHQQQABYAQBGlABYAQUgdBBAa8hjYch0E +EAAWAEBMJwCCE6UAFgBBUB0EEAAWAEFUHQQQCPTpcIYg8w+MIAyADvIY2BbwENhyHQQQANvPcIAA +LLJnsBDYDPAe2HIdBBAAFgNAdqUAFgNBXB3EELh3hiX9DIwlAoIJ9ALgEHhyHQQQABYDQQLwANvh +uGAdxBAE8gAWA0EodIQkDJAE9ADbJPBMJwCAGfRRIACQ0SEighXyqLnPc4AAEMakHUAQQCxEATAj +AwH+uwXyi7mkHUAQANt6pXul5PEAFgNAeqUAFgNAe6UI2wIiggECemJ6uBWDEJi5pB1AEHhgEHhy +HQQQuhUAEWJ6UHpwHYQQ5XgctQ8WAJa2HQQQpBUAEAh0hCQakCTyUSBAgh/yA8gBkIDgG/IVyM9x +gAAcsRR5gBEAB4DgEfTQEQABahWPEAHgw7j4YA94ah0CEKoP4ACpcGodwhME8J4P4ACpcA8eGJRd +AG/6osDgePHAAghP+hpwKHXQiQDYpBkAAM93gADIHSSHEKEHyAQggA8AwAAA13AAwAAAFvQVyM9x +gAAcsRR5EYmA4A70z3CAAPDE1ngiiAiNEHHG9gpwlg+v/alxz/BRIACgevIEFQQQUSQAgTvyFcjP +coAAHLEUehEShQDPc4AAEMZVbkJjD3j2ujKNSSDAAAjyz3KAABDI1npBigPwANrHcIAAEMjWeASI +CCEBAAghgQCgcUkhwQMWbjV4RIfPcYAAkMkBYc9wgAAQydZ4WIIBgEV4BCCADwAAAAgGeQLwI4WY +HUAQBIcIgAQggA8AQAAAQSiCB1MkAAAe4lh4JXj+uJgdABAK8qQVABCMuKQdABBQ2JwdABBx8P+4 +EfKkFQAQjbikHQAQz3BAAVAAnB0AECSHEIGeuBChX/AA2KQdABAF2BS4nB0AECSHEIGeuJ+4EKFT +8FEgQKdC8gGFUSAAgTPyEo1UEoIwSSLCADVuz3OAABDGIWP2uQfyz3GAABDI1nkhiQLwANnHcoAA +EMjWekSKCCCAAAggQABJIMEDFm41eESHz3GAAJDJAWHPcIAAEMnWeFiCAYBFeAQggA8AAAAIBnkC +8COFmB1AEBXIz3KAAFSxFXogogDYBPAF2BS4nB0AEFEgAKUA2M8gYgTKICEApB0AEAPIAYDPcaAA +wB3suACB0CDiAM8g4QAAoQDYdB0EEO4OIACpcM9xgAAIbgphdBUBEVlhMHl0HUQQz3GAABBu8CEA +AKQVARAleJgVARBRIUCCpB0AEAvyCtl2HUQQeB1EEIC4pB0AEBLwENp2HYQQI4cogVEhwIAI8grZ +eB1EEIO4pB0AEATweB2EEPoK7/ypcKQVAhBEIn6CjBWBEBbyA4cUgCR4hiH/A0S5hiD/Djhgz3GA +AJhi9CESAM9xgABwYvQhEQAO8MO5z3CAALSmPHn0IFIAz3CAAISm9CBRAJgVBRDgusogQgQW9IgV +gBBRJQCCw7gceNEiIoUH8s9xgADcpvQhAAAG8M9xgACEpvQhAAAhhVEhwIDKICEAUSUAgoQdBBAk +8pgVgRDPcIAA8GF1bilgBCWADwYAAAAxuBlhz3CAABDGYGD7uBHyl7qkHYAQBNi4HQIQANiPuLod +BBDPcAxAqP4ZpQPwAdkDEgc2AhcAAYDgJPIVyM9zgAAcsvQjAwCA4wL0YZW4FYYQdBUEEQQlvo8B +AADAACYAAXhgEHi+HQQQDvQKIcAP63Is2Iy4iiOaAKkEb/uKJIMPYJXm8YHhHfKC4cwh4oDKIcIP +yiLCB8ogYgvPICIDyiOCDwAAkwbKJCIAeARi+8olAgHPcIAAEMjWeAOIBvDPcIAAEMjWeAKIjBUB +EA64JXiMHQAQBIcbgIDgCPTPcIAArFsAiIDgYfIVEgM2huNd8gCVr+DPcYAAgDyqAAwAz3CAAByx +dHgRiIDgS/SkFwAA7LhF9FEiAIA/9FEgAKA78p4VABHPcoAA6DyKuJ4dBBAA2BuhAJIB4BB4ALIB +yBmhmBUAEK64r7iwuJgdABAkh1uBLyqBAE4igQcjuQ7hDyBAAKQVARCYHQAQtLmkHUAQnhUBEae5 +nh1EEM9xgACgWwChqLiruJgdABAN2JgdAhAL8BDYCPAI2AbwBNgE8ALYAvAB2BuhmBUAEL4VARFO +DS//ANqkFQIQBCK+jwAAADCCHQQQUvKMFQEQnBUAEZQdQBCSHQQQ7LqAHUQUAxIDNgzyFNiQHQQQ +fh2EFHgTDgECIoAjEHgN8A7YkB0EEADYfh0EEHgTDgECIYAjEHiyHQQQz3CAAMiwAICGIH+PDvSY +FQ4QUSZAkgj0YZOA4wb0kbqSuqQdgBAQuAV6pB2AEAQhgQ8AAAAQRIdSIQEDEIIFeTCiRIcQggQg +gQ8AAAAQPXkleBCiFfCYFQEQsh0EEJQdQBCeFQERkh1EEL4VARGQHUQQANmAHUQQfh1EEIAVABF+ +FQIRghUBERpihBUAEVlhOGAQeIkCL/qwHQQQ4HjxwKIL7/zhxc9ygAC8WiCCg+FKAA0AMyZBcIAA +GF5AJ4ByNHgAeBIJIAoD2J4IIApA2ADZz3CAAAw7OaAP8M9zoACoIDGDAoIA3aKiOGDPcYAADDsZ +oQHYEqMB2c9wgAAMO0UCL/o4oPHAygkv+rhxz3KAABDGBbkwIkQAUSRAg6LBBvLPc4AA5CMF8M9z +gABoHkAjAgZAIwEHUSRAgsoiwgfKIIIPAADLIsojgg8AANsDwAFi+8ohwg/PdoAAkMlALY0Bpmbo +vkDGIMUE8sK9qmEP8FEmQJIH8kQlARxEuSpiiboF8FMlwRA8eSpjz3GAABDIFiFBASKJDrlFeSCg +nQEv+qLA4HjxwJhwuHEUec9wgADgYShghODKIsEHyiCBDwAArBPKI4EPAAAGA0QBYfvKIcEP0cDg +fuB48cD2CC/6B9jPcaAA1AcaGRiADhEChhUaGDDPcKAASCxeoB8RAIYHGpgwARoYMATKnODMIIKP +AACRAAbyABYAQAAWAEADzM9xnwC4/xihiiBGBKoPIAEBEgE2z3OAAAQ0wBMABgESAja/4AcSATZJ +93/esmi0fX1lwKVBpSKlAeDFuMAbGADdAC/6BMrxwLhxz3KAABDGBbkwIkQAUSRAgsoiwgfKIIIP +AADLIsojgg8AAMIDgABi+8ohwg9ALYEBz3KAAJDJIWJRIUCCiiIIBcoiYQPPcYAAEMgWIUEBIokO +uUV5IKDRwOB+4HgUeDhgz3GAAPBu4H8IYeB44H8B2M9wgAAgVuB/AIDgeM9xgAAwOeB/8CEAAPHA +mHAKIcAP63IKJcAHz3AAAJ8ZCQBv+0Pb4HjPcYAADDngf/AhAADxwJhwCiHAD+tyCiXAB83YBbjl +By/7TNvPcYAARDngf/AhAADxwJhwCiHAD+tyCiXAB89wAAChGb0HL/tV2+B4z3GAAIxaBYEDgM9z +gABkLkCAAoFCeEggAgDPcIAAfC9HEwEGAogieIgTAQdhuAUpPgBAKYBy4H9YYOB4z3GAAKRaBYED +gECAAoFCeOB/SCAAAOB4z3GAAPQGI4HgfyCgEYjgf8K44HjPcYAA7FpGgYDiiiH/DyCgBfIigiCg +AdgC8ALY4H7geIoh/w8goM9zgADsWkaDgOIS8iSCUSFAgAvyz3GAAIRZMHIH8s9xgACcWTByBvRA +glBz8fUC2AXwIoIgoAHY4H7xwLYLwACA4PAOYgnKICIA0cDgfvHAz3CAAHwvUIgyiEQqPgsAIYB/ +gAAMLzV4DoiB4Br0ZgvAAIDgFvLPcoAAyB0AgoohFQUk4CBghiB/jgr0AYIk4CBghiB/jkQMYQnK +ICEA0cDgfvHANg7P+c92gAA0p0SWlOLAIoYPAACTAM9xoABoLPAhkQCA4FXyL47PcIAAEMjPdYAA +yB02eCKIA4UA389yoAAsIDQQEAE8EhIADo6A4IQAKQDKIKkAjCIBpHgAJQAE2OWiUNhFIUECGNqC +CSAMINv4uAjYLvQD2M9xoAD0BwWhhNoNcECwQiIAKA1yALJAhg1wQKBClg1wQLADhUCADXBAoAOF +QpANcECwBpZAKQIlw7gMuIK4BXoNcECg5KEOjgHgDq6SDyAKCnAB2BXwANgA2s9xoADELEehSKGm +lgy9n70FJUMUZqFOrs9ygACIOzuCAeE7op0Fz/ngePHAQg3P+RpwhCgICAAhgX+AANyghhENBs9w +gABsBgKAoL2GGVgDBIiA4BHyA4GA4A30CiHAD+tyydgEuIojHAwKJAAERQUv+7h1AoGA4Bv0z3KA +ANioERIAhowgw48K8s9woACwHxuAAqEaGhiEFvDPcIAA7CgAGAAEHgpgCQDYDPBiCA//hCgIKAhx +ACGAf4AA3KJuDYAJDQXP+fHApgzP+RpwiiBMC6YLIAEKcUwgwKDPdoAATKWT9x6WOhYFEQohwA/r +chC4BSUFAM9wAACDDIojBQ+1BC/7CiQABEAoDyHfZyWXBJcQuSV4gOA58s9wgAAUb/AgAQRAKM0g +tH0AJYAfgACgWCCgI5cClxC50g/v/iV4CHEAJYAfgACUWOIMgAnPcIAACG/wIAEEACWAH4AAEFhH +lyCgI5cClxC6ELkleCaXng+v+0V5lg/P/ghxACWAH4AABFiqDIAJXpYdlgDZDyEBBBC6RXgGIECA +Ad0dtjC4HrYY9M9xgAAcLgCBoLgqCyAFAKHPcKAAsB87gM9wgACMpaKgltohoAzZHts6CuAHGLsQ +2s9xgADMBwCBACoCBEZ47QPv+QCh4HjxwIYLz/kA3892gABMpT6WDycPEB2WELkleAYg/oNA9M9x +gAAcLgCBgLgAoc9wgAC4Bs9xgAC8IACQWokQchv0z3CAALoGAJBYiRByE/TPcIAAvAYAiDaJEHEN +9AvIBCCAD/7//wMLGhgwC8iHuAsaGDDPcKAAsB87gM9wgACMpQDdoqAgoAzZltoe244J4AcYuwHY +qXHaC6AAgNo+lh2WELkleOV4HbYwuEUD7/ketvHA4cW6DKAAKHWA4MogQQOoDaEDyiFhADUDz/k1 +B8//8cC6Cs/5z3aAAMwHAN0L8BDYuHgLIQCA9A3i/8ogQgMB5YPlIIa294DhyiAhAGwNoQPKIQEA +8QLP+eB48cB6Cs/5ugjgCADez3CgANAbEYDvuAvyrgkgCgHYz3GAAIA8HYEB4B2hBshRIACAAxIN +NhvypBUAEPK4F/LPcYAACDkAgYDgEfLAoVEhgMX+889woADELMuA39gmCSAByXH+vlMmgRQe9AMS +ATagEQAA8LgA3b3yiiAIAAwaHDD62AIJIAGgEQEAAxIDNqQTAQD4uRDythMBAc9woACYAz6g2vCA +4ePzmBUAEOoL7/4A2t3xABYCQVyzABYAQR2zABYAQJhwD6MAFgBBQBsEAAAWAEARowAWAEFIGwQA +RCIAA4TgGfIY3nIbhAMAFg5AiODTowAWDkFQG4QDABYOQVQbhAMH9Eh2hibzH4wmDJAL8hjeE/AQ +3nIbhAPPd4AALLKntwvwHt5yG4QDABYPQPajABYPQVwbxANId4Yn/RyMJwKSCvQC5tB+chuEAwAW +D0FgG8QDBPBgG0QD4b4E8gAWD0EodIQkDJAE9ADYIfCA4Bj0USQAgNEhIoIS8vCLqLnPcIAAEMak +G0AABb/gYP64BfKLuaQbQAC6o7uj6PEAFgBAGqMAFgBAG6MI2HQTDQG+Ew8Bon8CJ40TAn24E4AA +mLkCfdhgEHhyGwQAsH26EwABcBtEA6QbQAAFelyzz3CgAJgDHoC2GwQANPD0uCHyB8jwiQDaMxGN +AAQggA8BAADwQSgOA89xoAA4LgeBDyKCAwHcRngHoRXIRg6gCwAsABDHdYAAEMYFvxDl/WXArQMS +ATaKIBAABhoYMPvYQg/gAKARAQADyKAQgADE4DAJgQsD2c9woAAUBCOghQDP+eB48cAWCM/5z3WA +AEiaAYXPcoAAEMlEIASDz3CAAPiyDIjVaMd2gAAQxmCGFnrhghTyUCOBBSCmTCQAgYYnAR7hogT0 +kbkgpgXwsbu2u2CmEg9ACwfwlrtgpoUnAR7hoguNorgdAO/5C63hxeHGz3CAAPiyDIiMIAKAz3KA +AEiaF/LKis9xgAAQybVox3WAABDGFnmA5gCFYYEF8pW4AKWruwTwtbgApYu7YaEA2Auqwcbgf8HF +ocHxwOHFUSAAggh1qAAhAELAIsPPcIAA8GEEJYIfBgAAADG6a2AEJYAfwAAAADa4emLPc4AAAG4I +Y0pjQS2DElIjAwDAuwO7GmIY44XiyiONDwEAiQ3VI44AcHFSACUAANjtvRgAIQACIcAAz3EcR8dx +BSh+AAogwA4D8CK4QS1BE8C5BLk0ealyxrpJIsIFVHnrvc9ygACgZDJiBfJBKgEBFCGCAAUqPgBB +KQByCNwrB4/5CiHAD+tyO9iMuAnbCbtKJAAA4Qbv+golAAHgePHAkg6P+c9wgAD4sgyIjCACgCry +NWjHcYAAEMbAgc9ygAAQyc93gABImuSXFnphglAmjRWGJ7sfoKGMJ0SQhiMBDmGiBPSRvaChDPCx +voHntr7AoQb0lr7AoYUjAQ5honoNQAsA2c9wgABImo0Gr/krqOB48cCKIE8LIg3gAIohBAM2CQAA +0cDgfuB48cAGDo/5z3WAAHwcSYWA4i/yB4WB4C/0Fo0A2WqFy4UPIQEAJHpCIgKAJHvKImIAgOMB +2yR+wHuA5gHe7IXAfuR5gOEB2cB5gOLMIyKAzCYikMwhIoAH8hWtANlmD6AHJ6UWjQHgD3iQ4Bat +A/QA2Bat/QWP+eB48cCODY/5z3aAAJilCIbguKzBTPJRIMCBSPRKC6//AN2OCWABFtiLcclwRgxg +CCTaAdjPcaAAyB8ToRiBz3eAAHwcScAZgZDaSsAGhzDZHttLwItwzgugBxi7obaopqGmvK6jp34M +IAAC2M9wgAAQzgWQgODE9qqnracF8B4O4AipcEaHAdnPc4AAvBwAg4HiwHmA4jhgAKMB2M9ygAC0 +HCCCwHg4YACiTQWv+azA4HjxwAvIBSCADwEAAPwLGhgwJgnP+cYIYAEI2BoMIAAA2NHA4H7PcIAA +fBzgfwiA4HjxwAHYz3GAAHwcA6HPcKAALCADgAShAoGB4NAMQfvRwOB+4HjxwIoMj/kAFgBAz3CA +ALAgBYBRIECBDfQKIcAP63KKIF8EkNuKJMMPpQTv+rhzABYAQM91gACgzgCl5G3pcNoI4AoP2VUl +ThTJcJII4AoilfYPT/4IFQUQUSUAhAv0CiHAD+tyiiCfBJjbZQTv+kokQADPcIAAVFsggECFQKEg +gBzaQKnPcYAAHAgjpRjZIqBVJcEVJaDhoCGFw6AkoADYWh0EEAKFrbjyC6//AqWA4Bf0z3CAABDO +JZCA4YogjwvH9tIK4ACr2TIJAAAG8MYK4ACw2b4IAAAOCuAHDdgVBI/54HjxwIogTwyqCuAAkNm+ +Ds//0cDgfvHAz3CAAOhiz3GAAHwcZgpgCDja2gngBwDY0cDgfuB48cC6Ds//ANmC4MwgYoDKIEIA +A/QB2A940cDgfs9xgAB8HAqBgOAF9A2BgOAD8gDYBfAGgYHg/fMB2OB/D3jgePHAz3CAAHwcIBAF +AEwlwICL9wohwA/rcoogXwVX21kD7/pKJIAAz3CAACBj8CBAAUB40cDgfuB48cD6Co/5z3CgALAf +u4AA3pa+BCWNH8D/AADdZRTlACWPH4AAAAByDq/+qXAIcc9wgAAUV4ILQAleDq/+2GUIcc9wgAAs +V3ILQAlODq/+6XAIcc9wgAD8Vl4LQAnPcIAAfBwBA6/54KDxwI4Kj/nPcKAAsB/7gADdlr0EJ48f +wP8AAL9nEOcAJ5AfgAAAAAoOr/7pcAhxz3CAAERXGgtgCb9nz3aAABDOBZYlhgq4+WHmDa/+DiBA +AAhxz3CAALRW9gpACdINr/7pcAhxz3CAAFxX5gpgCb9nBYYfZwWWCri2Da/+DiDAAwhxz3CAAMxW +xgpgCQJ1og2v/gpwCHHPcIAApFeyCkAJz3GAAHwcABkABAWWJYYKuLlhfg2v/g4gQAAIcc9wgADk +Vo4KQAktAo/54HjxwMYJj/nPdoAAfByghgDflr/9ZU4Nr/6pcAhxz3CAALxXYgpgCf1lOg2v/qlw +CHHPcIAAdFdOCkAJ9QGv+aCm8cCGCY/5z3CAAHwcwIAA35a//mYODa/+yXAIcc9wgADUVyIKYAn+ +Zs91gAAQzgWVJYUKuNlh7gyv/g4gQACYcM9wgACEVv4JYAmIcdYMr/7JcJhwz3CAAIxX6glgCYhx +z3CAAHwcwKAFhf5mHmYFlQq4sgyv/g4ggAMIcc9wgACcVsIJQAlpAY/54HjxwPoIr/kA2EokwHPg +eKggQAc1aMdxgAAQxuCBz3WAAHwcAN4PJg4QQS8DElEjAIBshQX0xntspQbwCyOAgwT0qL/goQHg +HQGP+eB48cCyCI/5CHXPdoAAfByKIE8Kpg+gACiGCIYQdUX3gOXKJQIQAvSopoogjwqKD6AAqXHt +AI/54HjxwHoIj/m6C8//geAM8gohwA/rcoognwWi24okww+dAO/6uHPPdYAAfBwjhYHhAoUP9IHg +ANkF8hSNgOAF8q4K7/8mpQzwI6UB2AalCPCA4Ab0Ad7WCqAHxqXCpc9wgAAQzgWQgOAYD8n/fQCP ++eB48cDhxUoL7/8Idc9xgAAQziWRgOFgAAwAgOAu8s9wgAD4skyIANnPc4AAfBwMgw8hgQALIECA +IPSMIgKAHPKGJfwQjCUCkA7yjCUClAfyiiDPDr4OoACu2Q7wDYMleA2jC4MFeSujNWrHcYAAEMYA +gai4AKEJAI/54cVKJMBzANuoIAAGAN3PcYAAfBwMgQ8lzRALIECDDfQLgQsgQIMJ9BVrx3CAABDG +IICIuSCgAePgf8HF8cCqC4/54HjgeOB44HhpIIABbyE/AGkgAAD38c9zgAAcLkCDgOFFeACjGvLP +cYAAvCDPcIAAuAYAkFqJEHIb9M9wgAC6BgCQWIkQchP0z3CAALwGAIg2iRBxDfQLyAQggA/+//8D +CxoYMAvIh7gLGhgw4H7xwM9wgADEBwCAgOAK8s9xgAC0OAuBAeALoX4PL/sC2NHA4H7xwM9zgADg +B2hwhgwgAATZBGt+DCAABNnRwOB+4cUA2UokwHXPc4AAOBXPcoAATDmoIIACFiNAAKGAAIAB4RUi +AACgoOB/wcUA2M9xgABsBwGpDQMgCwCp8cDhxQYO7/ww2LRo/g3v/DfYBX0YvZG9z3CAAGheNgxg +CJK9KLileM9xgAC0W60Gb/kAoeHFNWjPcoAAEMYhYs9ygADIHS25wLnwIkMAKINRIQCAz3GAAAyx +QYEI8jyLgOHFIoEPAAAKAgTyRSJCA0okAHQA26ggwAI2aHV5ACGND4AAkMlApQHjAN3Pc4AAEMgW +IwIAoKqhqgHZIqoD2SOqSiQAcalxqCCAAXphFnqkqgHh4H/BxeHFSiQAeADYqCAACADbz3WAAAAA +QIUPIwMACyLAgA/yQYULIsCAQNrPIuIHyiKBDwAA0ADPIuEHAvAA2s9zgABoExV7QKMB4OB/wcXP +cIAAMFsFgAOAIIDPcIAAQJQpoGEBb/wR2OB48cBCDW/5AdnPcIAAcCg5oIogxQ/PdaAAyB8ZHRiQ +KHAocihzpg/gAJhxPg7v+wDez3egANAP1afPdqAAwC96FgCWibiLuHoeGJD6D8AB4gqP/koPgAdA +2c9wnwC4/zKgNgqACoDZz3CgABQELKAdH1iQFg9ACcYNAAm2DGAJANimC8ADB9hIHRiQCg0ABu4J +wAHPdYAASC4ghWB5ANiL4AfyIIVgeQDYh+BUDoIBvgpAAOoKgAP2D4AHFYZSIAAAwLgghRt+YHkA +2IvgBvIghWB5ANiH4AT0Jg6AAY4NAAP6DwAIvgtAANINAAeOD4/7XgkAAfYKAAnqDo/+KgyABHIP +AAGOCwAG8g4ABfoKwAOGCE/+fg1ABD4JAAg6CQAIrgyv+wFuhQRP+eB48cASDE/5z3eAAMgdA4cI +gMC41gygCS8gACAA3c92oAC0R89woACMRLigANiTuHceGJAI2HceGJAA2J64Ux4YkOB4z3CAAMgA +EHhTHliTRx4YkM9wgABkAxB4SB4YkE8ggCNFIAANTyDGBzTYRB4YkBzYRR4YkM9wgADwFQGIRh4Y +kM9wgADUOWIO4AQQiEokgHDPcYAAMM6oIEADz3CAAAyxQYB0bXR7O2MCgEOjAeUEo891gABIWwCF +gOAD8mQeGJBDHpiRngqgCQHYA4cIgFEgAIBAhQ7yUyJBABK5RCIAAw64JXiGIv8DCrpFeBLwSHCG +IPMPCrgEIoEPAAAADAa5JXgEIoEPAAAAMAK5JXjPcYAAcDBhA2/5AqHxwOHFEN3WDqABqXAH2Qu5 +z3KgAPAXMaLPcQAA8P84orKi4g2AAU0DT/ngePHAzgpv+QDaz3CAAGwGQ6D/289wgADYqBEY2IBK +JIBwSHGoIAAHhCkICAAhjn+AANiiz3eAAOxaQaYG3aWmz3UBAHzupKbmpiAeghAAIY1/gAD0okCl +AeHPcIAA2KgaGNiAz3GAAHwtAIEc2kCgGNgOCCAAAqHBAk/54Hg52c9wpQAIDD6g4H7/2c9wgAC0 +oCCoANnPcIAAXKDgfzWg4HgA2oDhyiRNcOB46CDtAf/ZXGAgrAHi4H7xwOHFz3WAAHCwz3CAADxu +qXHmCCAISNrPcIAAoGbPcYAAdAfSCCAICNoA2c9wgAAINymgz3CAAFAHIKDPcKAALCAQgEkCb/kS +peB48cAA2c9ygABMpSCiz3CAABwuIKA9sjC5PrLRwOB+4HjPcIAAlG7PcYAAlDc1ASAIFNrgePHA +lglv+SDZANrPdaAAyBwppc9xoACUE1uhz3OAAOgTYIPzaM92gABssgyG9X9TIMQF8GP7Y1MgjwCD +56TBi3Eb9B+Gm7gfpjQWgBDii/FwC/QocEAjAQREa7INIAlAJgMcDdoq8B6GkbiSuB6mz3CgAMwX +K/CF5w70QSoCUkAjAATBukIO7/yIcx+GnLgfpg3aFPAsuFMgAgAfhgO6mbgfpuSDBeIFJwARAKEF +gwGhBoMCoQeDA6ED4s9woADMF89xoACUE1yhAdqA4gf0H4aXuB+mINgKpRjwAMED2hgYWIABwRkY +WIACwRoYWIADwRsYWIAUGJiAihYBERAYWIAE2SelFhiYgPUAb/mkwOB48cCGCE/5pBABAPm5osFw +9CDZz3OgAMgcKaOkEAEAUSHAgS7yMYjPdaAAEBQjucC5A7kF4QPaT6VGhUHCjeEQ3som4hEGFA8x +jCfDnwj0BBQPMfF2zCfqkAHeQ/YA3oDm6vXFgEV+x6WxiIYl/B8YvaV6z3WgAMwXWqAX8EWAz3Gg +ABAUR6GkEAEAUSGAggnyMYjXuoYh/A8YuUV5OqDPdaAAzBcN2QHaA+ENHZiQDh1YkCaAGR1YkCeA +Gh1YkCiAGx1YkAPZFB1YkHAQAQEQHViQcBABAc91oAD0BwThJ6VHo6QQAQCZuaQYQAABAG/5osDg +ePHAkg8v+QTZCHUVEg42BtgVGhgwz3egABQECqfPcIAAMG5eD8AHAIVWD+AHBNkBhU4P4Ac42SKF +gOEG8gGFAJAQcc33CiHAD+tyGdiMuGrbSiRAAIEHb/q4cyYP4AcDhQGFQoUgkAWFFg/gB0J5yqeJ +By/5FRqYM/HAFg8P+Rpwz3WAAMQHAIUodoDgSHcG9IDm4iCCAzrwiiALAP4NYACKIckBiiALAPIN +YADpcc9wgAAEOQCAjCDDjwfyz3CAABRaGg/ACM9wgABELs9xgACQB8CgAIEFf+Chz3GAALQ4AoEB +4AKhz3GAALA4ABkABAPwHg1P+gCFgOD99c9wgADIBwCAgOD39ekGD/ngfwDY8cAA2Jy4z3GgAKwv +HKEagVEggIIagQzyqrgaoRqBUSAAgPHzIgiv/AHYC/CKuBqhGoFRIACA5/UeCK/8AdgA2Zu5z3Cg +ANAbMaB+DsAKCgzACs9wgABoOACAQiAAgMogYgDRwOB+4HjxwOHFz3GAAEylfpFdkRC7ZXoRIgCA +Ad0L9M9xgABMWAO4FHg+DuAIOGCpcALwANhhBg/5RoGA4gjyI4FggSKCYnkwcADYA/YB2OB+8cDP +cYAA7FriD+//mHCA4Anyz3GAAAxb0g/v/4hwgOAD9ADYCvDPcYAAzFq+D+//iHCA4PfzAdjRwOB+ +4cXPc4AAYDCIE4CAgOAU8osTgICA4BL0ihOAgFEgwIEK8s9wgABkLgCA4bgE9FEgAIBa9AHYWfCB +4M9ygADuLx70jhOBgAHYgOGKE4KAwHhRIsCBDfLPcoAAZC5AguG6yiBiAAX0USIAgMogIgCTE4KA +geI59IDhN/I28JMTgYCB4Qb0oxOAgIHgCvKB4V4ADACjE4CAgeBSAAwAjhOCgIDiBvSPE4CAgOAE +8gDYA/AB2IoTjYBRJcCRD3gN8s91gABkLqCF4b3KIGIABfRRJQCQyiAiAIHhB/SA4gT0jxOBgMvx +ANjgf8HFgeEB2Y4TgIDCIUEAgOAF9I8TgICA4APyANgC8AHYihODgFEjwIEPeA7yz3OAAGQuYIPh +u8ogYgAG9FEjAIDKICIAKWKl8c9wgADIBQ6AgOAB2OB/wHjxwH4IAACA4AXy2ggAAIHgB/TPcIAA +8CgAgIDgA/QA2ALwAdjRwOB+8cBSCQAAgOAg9P4Iz/qF4ATyANjRwOB+z3CAAFwjFIiH4A3yiOAS +9M9wgADIHQGAuhAABlEgQIEI8s9wgABkLgCAI7jAuOjxAdjm8REA4AAP2OB4z3CAAMQHAICA4Mwg +YoAE9ADYBfCI4P7zAdjgfvHAz3CAAI4HIIjPcIAA5LrwIEAAUSAAgAX0IggAAIDgA/QA2Ajwz3CA +AGi0BJCA4PnzAdjRwOB+z3CAAMQHAICF4AHY4H/AeM9wgADEBwCAhuAB2OB/wHjPcIAAxAcAgIfg +Adjgf8B4z3CgAMQsGoDnuAb0USAAgQHYA/QA2OB+z3CAAGQuAYCB4AHY4H/AeM9wgABkLgCAhiD/ +AUIgAIDgf8ogYgDgeM9wgABMByCAz3CAAChv8CBAAIDgAdjgf8B44HjPcIAATAcggM9wgAAob/Ag +QACB4AHY4H/AeOB4z3CAAGQuAYCA4AHY4H/AeM9wgAAwFQCIgOAH8s9wgAAcFQGIAvAB2OB+4Hjx +wLIKD/nPdYAAlDcIhYPgM/ILhYPgMfIJhc9xoAAsIFEgAIEL8gyFgeAJ9DCBiglgAIogSggB2CDw +0IEKhQImARAF2Ay4EHHX94ogygdqCWAAyXEQ2AmlDYUCJgEQ13EAAABQyfeKIMoHTglgAMlxAdgM +pQLwANilAg/5USFAxwXyCci9uAkaGDAA2Z25z3CgANAbMaDgfvHAGgoP+c91oADIHyQVDpbovgry +hRUAlh4Lj/uKIAQAJB0YkOK+CfKKINcK8ghgAMlxXg7AClECD/ngePHA2gkv+TTYlgmAAPC4z3eA +AICKFfL+DqACANjSDqACAdiKJhAQAN0WCK/+qXAUJ0wTYb6A5gC0AeU49w7wANuKIhAAMg7gA3B4 +FCfMEGG6gOIAtAHjOPfpAQ/58cB+CS/5NNihwQDdNgmgAEDF8LjPd4AAgHIZ8loJ4AAB2APeCr4A +2Iy4uGAQeItxtgrgAAHaFCdME2G+gOYAtAHlM/ciCcAAEPAF2wq7A9oKunhlxg3gAxB4FCdME2G6 +gOIAtAHlN/d9AS/5ocDgeM9xAQAUOM9wgACEF+B/JKDxwOHFb9iVuM91oADIHxIdGJDPcAEAQDwV +HRiQJgtACYogBAAOpVEBD/ngeADYkLjPcaAAyB8VGRiAz3CAAMiwRpBbek8iAwBaEQKGOBCAAGR6 +WGDYGQAA4H7geOHFANvPcoAAVJpKJAB0z3WAAMyaaHCoIAACQCUBEhR5YLEB4Ehwz3GgAAQlD6FW +IgAEEaFWIgAFEKHgf8HF4HjxwGIID/nPdYAAyB0Fhc92oADEJ3UeGJAMlXYeGJAHhXkeGJAQlXoe +GJBiDe//AN+A4Bzydx7Yk3ge2JOAHtiTgR7YkweFhh4YkBCVhx4YkAeFih4YkBCVix4YkAWFiB4Y +kAyViR4YkAWFhB4YkAyVhR4YkMHYUB4YkFEAD/ngeOHFCHHDuM9ygADUmvQiAwDJu3BxyiQidMog +IgDoICIC9CINAMm9sXEC8gHg4H/BxfHA4cUIdc9xoADEJxkRAIYB2oDgEREAhsB6gOIApdEg4YcA +2Db0z3CAAOiyDIDPcaAAyB9k4B6hENgOoQHYFRkYgIII4AoL2FEhAMbKICIAG/RRIEDHE/LPcaAA +1AsWgTiBJOAwcEv3WgjgCgPYUSMAwAX0USCAxAPyGNgC8ADYgODKIOIEz3GgAJAjPoEgpZkHz/jx +wB4Pz/jPcYAAyB0VIQMAwINJhriOQSrAAMC4F7jHcAAAgBzkus8gIgbguk7fzyCiAMongh8AAE4B +huXPJ2ES5boW9M91gABoIxgVBBG+kZB1D/ShgboVDRZRJUCRCPQggboRAQZRIUCBA/KBuM9xgABc +IzSJh+HMIWKCzCEiggL0g7hRIgCCzyCiBRym/aYgg89wOgRKcM92gABILh6hIIagg2B5ANiO4Cvy +IIZgeQDYiuAl8gfYKg5gAAq4BCCADwcAAAAwuIfgVgANADMmAHCAADxeQCeBchR5AHmKIAQAH6UY +8IogEAAfpRTwANiLuB+lEPAA2Iy4H6UM8ADYjbgfpQjwA9gMuB+lBPAA2I64H6WCIAEBbQbv+B+l +CiHAD+tyjNiNuM9zAABPCUokAAAxBi/6CiUAAeB4IYAA2lMhfoAL8gDambpRIUCAyiKCDwAAgwDA +KmIGz3GgAOxGRaFmkEgjAwNHkBC7BCODDw8AAADIukV7SJAMugQigg8AAADwZXpGoWKAz3KfALj/ +faJFgEmhRoBKoUeAUaFIgEuhSYBMoUqAUqFLgE2hTIBOoU2AU6FOgE+hT4BQoRCAFKHPcAAAVVXg +fuB48cBWDc/4IYDPdYAAAAACgCClAN4BpcKlz3DQ/gAAjg9v/wSlz3KfALj/3aJvIUMAz3CgAOxG +JaAmDQ/+IIWA4Qvyz3CgAMg7HYCA4AXyz3AAAFVVB/DdooDh+/PPcAAArd5hBc/44HgikEghQQFA +KQIDI5BigMu5j7lFec9ynwC4/32iz3KgAOxGJ6IjgDWiJIA2ogWAF6LPcAAAVVXgfvHArgzv+ADb +psHPcYAAAABgoWGhYqHPdqAAtEcsFgGQCiSADwAAVVVKJAB4aHGoIEACz3KAAGgTNXpgogHhANmY +uZUeWJBKJIBxz3KAAAAACBIFAAsQkAAA3Tl12HWpcqlzGXWoIEEEv2Dkj7/nACBKAwbyFSRBM2Ch +AeNKJwAADydHAwsgwKEJ8hUkQTMggUojABAPI0sQA/BKIwAQKogLIcCBBSHJEgnyFSRBMyCBSicA +AA8nRwAD8EonAACA5wUiwgEP9BUkQTMggQwQBQA/3wokgA8AAK3eDyBIEAQawhOJ5wf0FSRBMyCB +ANoPIkIAiOcI9BUkQTMggUomAAAPJkYAAeXPdYAAAAAIHUARgOPKJIEPAACt3jbyJYhkiAYiggHF +uhC5BSODDwAAAD9leQUhgQ8APwAAmx5YkGeIJogIu2V5aIgQu2V5aYgYu2V5nB5YkAYhARLFuZke +WJAA2ZUemJCZuUweQJAkgFgeQJAKkJQeGJBvIEMAkx4YkD4LD/6IcI0D7/imwOHF4cbPcqAAwEbP +c6AA4EZKJAByAN2oIAADFiBOAyGGAeUEGlAAIoYEG1AAMYDPcqAAtEeYGliAMoCzGliAE4C0GhiA +z3AAAFVVwcbgf8HF4cXhxiSIz3KAACBvpojCuS5iANkPIYEDgOXPc4AANJ9AgwX0JnpAoxfwRXkg +oyWIFSONAyOlJohFiFlhJqUggIwhEIBE94ohEAAgoCO5IaMAgCq4AqMA2c9woADwNiygI4MloCaD +JqAkgyegJ4MooCWDKaAogyqgIYMroCKDLaAggySgwcbgf8HF4HjxwCIKz/gId5pxunLacwoiACEK +I0AhCiGAIc9wAADIG+4JYAAKIMAh+nDPcAAAzBveCUAAG3DPcAAABBzSCUAAz3agAMgfO3AB2BOm +BtjPdYAAfD0ApeGlDsAgHQAUCaUVhhwdQBQKpRiGGB3AFAulGYYUHYAUDKWgFgAQEB2AFQ2lpBYA +EAwdQBUOpagWABAIHQAVD6XPcAEAqBEQpXIJYAAo2BGlaglgAADYEqVTJ8B1E6UByFQdABcWpRIW +AJZQHQAXF6UTFgCWz3GgAMgcGKUUFgCWUyECMxmlFRYAlhC6GqUkFgCWG6UWFgCWHKXPcIAAgDwM +gB2lz3CAAHw9eBiACs9wgAB8PXwYwArPcIAA+D0EGAALz3CAAHw9hBhACyiBiBhAAM9xgAC0WyCB +jBhAAC8hxwUIuSV6LyEHBkV5kBhAAFYJYAAl2RUBz/jxwPoIz/jPc4AAED5DgwDfz3WgACwgsIXS +atR+fmalpgSmAeKMIgiAJqZDo4X3AoPjowHgAqMtAc/44HgA2M9xoADIHxihGaEB2A6h4H7gePHA +rgjv+IogTA2qD+//iiFYAgvIAN4EIIAP////AwsaGDCqDSAAyXDPdYAAbAYRhYDgtAwiAMogYgDh +AO/40KXxwOHFjgkgAAh1jCD/jwj0iiAHCl4P7/+pcQDYxQDP+PHATgjv+GrYosGLcQHaNg9gAEhz +gOAQ9AohwA/rcs9wAADSFIojhQGKJIEKYQAv+kolAABAJIExRNgB2gYPYABIc4DgD/QKIcAP63LP +cAAA0xSKI4UCiiQBATUAL/pKJQAANg0v+QYUADGA4EjygcFr2AHazg5gAEhzgOAP9AohwA/rcs9w +AADUFIojRQSKJMEK/Qfv+UolAAAEFAAxQCSBMAHang5gAEhzgOAP9AQUBTEKIcAP63LPcAAA1BSK +IwUFzQfv+YokwQoCFAAxz3aAAGBdG3hBKMUATCWAjAAeQBHU9gohwA/rcs9wAADVFIojRQaZB+/5 +iiTBCh3Yz3aAAGBdAKa4cAAUADHPdYAA7NVALYIAqXEqDmAAAduA4A/0ABQEMQAWBRAKIcAP63LP +cAAA1hRZB+/5iiPFCECGgOIA2NH2FiUBEGCJhiP/DSO7geMG9GGJgOME8mK7YakB4FBwsfYA2FEH +r/iiwOB48cDKDo/4p8E6cHpxGnJac4twz3GAAHRe5gjv+Braz3GAAGBdIIEA2IDhuHHEAC4AiiX/ +H89xgAAUFQARhACKJv8fyXUC8Ol2TCGAowHaz3GAAOzVFnlgicIijABEI48A/X/xcj304YlEIwIE +JLpEIwYCQS7GAAwggKFEIwEBIrkv9EwkQIAO9IDhzCIhgAfygeHMImGAANoC9AHaT3oF8IDiAdrA +eoHiG/RMIgCmAdrCIooAUHGGI/0PJ7sF8oDizCBhoA30MnfMIyGAC/KA5wPygOMF8jJ3A/bxdoX2 +yXcE8AHZCfAIdQHgsHBaB8X/ANmKIP8PgOEE9IDlyiBKA4wg/4/KIIEP/////xXyMiSCNIHiz3GA +AOzVB/RicRZ5AhHAAAnwguIWeQX0BhHAAAPwBxHAAO0Fr/inwPHA4gzP/3XYngzv/4ohywHyDg// +SghP/0YLwAYyDg//CiHAD+tyPdiKI0sGSiQAALEF7/kKJQAB8cDPcIAAyB0CgLgQAAZRIECA+A3C +BdHA4H7gePHAQg2P+BpwKHU6cs9wgAC8pZIMb/pE2c9yoADUC36CACWBHwAAACDPcIAABAdieWGg +zLnPcIAA6LIvogyAz3KgAMgfZOAeohDYDqIB2BUaGIBNcIYg/APQ4Mwggo8AAIAAEvKMIAOEE/IK +IcAP63IKJIAKz3AAADIRiiPaAxEF7/m4cwpwMgkv+ypyBPC6DW/6CnCA4BTyz3KAAGyyP4Kc4LO5 +P6IA2s9xgABImkupz3GAAHyXTLHKIIEA5QSP+PHAjgyP+M9woADEJ1IQAYZBEACGhiDjjwDdBvLr +udEhooFP8s9wgADIHQOACYDPdoAAvKVRIECBF/IiD4ADgOAJ9BSOgeDKICEBDA0h/8ohYQDPcIAA +eKYAgFEggIAF8kYJYAAQlrSuz3CAAHimoKBNcIYg/AOMIAKAH/TPcYAANBUAgQHgAKHPcIAAyB0D +gBiIhOBID8H+iiBHDfYK7/+KIQsAbg+AA9oID/vaCy//LyCICgXwjCADhAQOQfo9BI/44HiA4PHA +DtgK8t4PAACSDGABiiAEANHA4H6qDwAAVgxgAYogBACGCoAIguAG9KIKoAgA2PLx8PHgePHA4cXP +dYAAbAYQhYDgIvRiCoAIguCACqEIyiAhAAHYEKVqDyAAD9iaDyAADtiA4BGlCfJWDyAADtgCDGAB +iiAEAM9xAACE6AHYLgxv/4DatQOP+PHAOguP+ADeAt3Pd4AAzKJAJwAahC4IGDAgQA5RIACA1A2i +/sogggNhvYDlAeYy90YP7/8A2G0Dj/jgeAHaz3GAAPQoQ6kYoShwZNl12h7bfQGgBhi74HjxwM9x +gABsBgOh+g4gAA/YqgtgAYogCADRwOB+8cDKCq/4AdqhwYHgz3GAAPAoQKEt9M91gAC8pBiFjCDD +jwryANqEKAgIACGBf4AA+KJAqc92gABsBgyGgOAH8ooP7/8LhgDYDKb/2BilbgjgB4twgOAN8tYJ +wAMAwc9wgADsKCCgsg/gBwDYEfBWDiAAD9i6CcAD+gpgAYogCAAqCYAIguBICaEIyiAhAKkCr/ih +wPHAz3AAACBOGgsACs9xgAB0KQChz3EAALgLz3CAAOAoIKDPcAAAiBP6CgAKz3GAAOQoAKHPcA8A +QELqCgAKz3GAAOgoAKEF2NoKIAoLuM9xgAB4LQCh0cDgfuB44cXhxkEtAFTBuIPgCfczJgBwgAAc +XkAngXIUeQB5ANgX8M9xgABsspgRgABAKAIGhiD9D1IgwAFFuEV4z3KgAIgkEKIfgbO4H6FK8AHY +ENvPcaAAyBxpoc9zgABsspgTjQAA2s92gACkasaGQC0BFoYl/R9SJc0RxXlFvaV5z3WgAIgkMKU/ +gwLdRCg+DQAhgH+AAIjElbk/o89xoADwF72hpICKEwMBpqGjgBTjpqGigFMjw4CmoaGApqHAICEI +wCAiDGCAc6FsaGCDc6H4EAOCc6H8EACAE6FKocHG4H/BxeB48cDyCI/4ocEId89w1Lr+ykDAD/Ag +3c92oADIH7CmAdhDHhgQANjeCWAKjbixps9xnwC4//qhBNgboYtwHqEA2p26z3CgANAbUaDPcABt +ABAZoVEhQMf/84ogmwWeD6//6XGKIJsFlg+v/wDBAMDXcNS6/srQ8+UAr/ihwADbz3KfALj/GqJ7 +oj6iz3AAbAQAGaLgfvHAYgiv+JhwKHYaCCAASHUGIIEDiHBSCCAApXmxAI/4z3GAAJQtYImA489y +nwC4/wXyz3HQuv7KPqIaooDjDvLPcKAAOC4FgAQggA/AAAAA13DAAAAA9vNq2Bi4GaIcguB+4Hjh +xc9ygACULaCKgOXPcp8AuP8G8s9z0Lr+yn6iGqI7ooDlDvLPcKAAOC4FgAQggA/AAAAA13DAAAAA +9vNp2Bi4GaLgf8HF4HjgfuB48cCuD2/4iiAKBut1qg6v/4ohBAqKIAoGng6v/6lxz3eAANwHAIdR +IECAGvTPdYAAcBwAhVIggAAApQnwz3CgAKggDYDk4EgBBQAqD+//VNgAFQQQhiD/DpBw8vWKIAoG +Vg6v/4ohxA3PdYAAxCXEFQAWUSCAgD7yWggP/892gADIHb8WABaluL8eGBAfhaW4H6VuFQCWpbhu +HRiQDoaKJRUVpbgOpgCGJOCgYIYgf47KICIAyiECAEwM4vjKIqIBAYYk4KBghiB/jsogYgDKISIA +NAzi+MoiogEAhs9xgABwsLoQAAYluMC4lgwv/AqhiiAKBsINr/+KIYUDANqeugDZz3CgAPxEQaDg +eCGgz3CgALQPPKALyAQggA/+//8DCxoYMAvIh7gLGhgwf9gKuM9xoADQGxOhf9gQoQDYlbgQoc9x +AADAIDIKIAAG2M9xoADwNgSBRiDAAQShlNhaDu//GNmKIAoGTg2v/yCHAIdRIECANAwiAcogIgCK +IAoGNg2v/4ohRQqNBk/4CiHAD+ty29gEuIojxAxZBq/5SiUAAOB48cAODm/4iiBKBgoNr/+KIcUM +9g+gCAHYz3ClAAgMAN7PdYAAcCjCoBmFUSCAgGwNgvnPcQAAoAaeCSAABtgLyAUggA8BAAD8CxoY +MBmFUSCAgAXy/gsABQ3wANmeuc9woAD8RCGg4HjBoM9woAC0D9ygHgwP/B4MAAHyCaAHAdiGCSAA +Adj1BU/44HjgfuB48cB6DU/4gOCIdQDfCfKB4Av0Ad7PcIAAFxXAqAXwz3CAABcV4KiA4QnygeEL +9AHZz3CAABUVIKgF8M9wgAAVFeCogOIJ8oHiC/QB2c9wgAAWFSCoBfDPcIAAFhXgqM92oADIH89w +gAAXFRge2JMAiIDgiiEQABLyz3CAAAUdAIiA4Azyz3ADAEANRR4YEDCmAtgYHhiQA/Axps9wgAAV +FQCIgOAc8s9wgAAGHQCIgOAW8s9wAgD+RyAeGJDPcIAAFAAhHhiQz3CAAMQFIh4YkBgWAJZFIAAD +GB4YkM9wgAAWFQCIgOAI8hgWAJaFIAEEGB4YkIHjB/QYFgCWiLgYHhiQGBYAloC4GB4YkIDlGfIA +2JS4z3WAAAwIAKVx2Aa4Ygzv//zZIIXPcAAATBxWDO//n7kYFgCWhbgYHhiQpQRP+OB4gOHxwAPy +oOCN9gohwA/rcs9wAADaDtrbSiRAAF0Er/m4c89ygACcLRV6IKLRwOB+ANmeuRl5z3KAAMg5AYIm +eOB/AaLPcIAAyDkBgOB/LygBAOB4ANmeuRl5z3KAAMg5AYIleOB/AaLPcoAAyDkhgkKCJHoA2Z65 +GXkEIYAAQiAAgOB/yiBiAALhMHlBaVBwxPYieBB4A/AC2M9xoADIHx6hENgOoQHYFRkYgOB+4Hjx +wOHFUN0A2s9zoADIH6+jXqMCIEIAXqMB2hUbmIBA2k6jBCC+zwACABCwD8H/0QNP+OB4ANnPcIAA +eKYhoM9wgABsshyQYrhIIEAAEHnPcqAAyB8fghB4CCEBADB5AtgVGhiAP6LgfgLhMHlBaVBwxPYi +eBB4A/AC2M9xoADIHx+hiiAYCA6hAtgVGRiA4H4A2c9wgAB4piCgIaDgfyKg4cXhxoDgz3GAABDO +RYEl8s9xoADIH0ARDgbPc4AAbLJAKI0CQhMAAXyT0H7YYLtjYrsIIwMAAnsJIsIAAtgVGRiAz3CA +AMgdX6EDgCKAz3CAAHimIqDBxuB/wcXhxPwcyL78HEi+4cDhweHC4cP8HAix/BxIsfwciLH8HMix +/BwIsvwcSLL8HIiy/BzIsuHF4cbhx/wcCLT8HEi0/BwIv2okgBDhxGokwBDhxPHAz3WgANAbXBUQ +EHvYNgmv//bZz3CfALj/HYDrdstwz3AAAEQc2gnv/wonwB86cBeFB9jKCe//CrhTIEEHB9gCCu// +CrjPcKAA1AsYgEIgAAhIIAAAz3OAAJA6z3GAAAwIIIGxGxgACyFAhMogIgMz9EwggKAR9FEhgKUL +8oDgCfRRIUClZNjKIIEPAABcACPwNNgh8IwgBKAc8kwgAKIU8gr2TCBAoA7yTCAAoRT0htgT8Ewg +AKQK8owgAaAM9EzYC/Bm2AnwPNgH8EbYBfBU2APwhNiIEwMG6XHJcgokAASdAa/5CiVABOB44H7g +eOB/AdjPcoAAbAYigiWJgOES8s9xgAC8pHiBz3GAAPSihCsICDAhQQ5RIUCABPQI2AuiAdgJogDY +BKIF2AOi4H7xwOHFgOMIdShwBvLPcYAAgIoF8M9xgACAclt6Egtv+LR5YQFv+AHY8cDSCE/4MHK8 +ACUAenAiegHiOnEacs9xgAAQxgAhQCBAK0IhW2Bwi4wjw48AIJIAQ/LPdqAAOC4HhgDdUSAAgg8l +zRAN8s9woABILguA07gLJQCQBfJAYVEgQIIk8pIND/+A4Bb0z3CAAGgjLJDPcIAAyB0ekBBxz3eA +AGQuDvQAh4Yg/4EK9MoKD/+A4AbyB4aleAemDvBPFwAWBX1PH1gTCPDPcYAAXC8QgQV9sKH/2RAa +QiBCIEIggOJWB+3/QCFBIGUAT/jPcQEAxwPPcKAA7CcmoOB+8cAGCE/4GnDGD6//JNiYcFEgAIDK +IcEPyiLBB8oggQ8AAFEmyiOBDwAAFgEgAKH5yiUBBM92oADAL0wgAKAThkj0+rgG8s9wgAAoLgCA +QHj02ADZWg+v/wHaNNgA2ZG5Tg+v/wDaMNiKIQYAQg+v/wDaNNgA2QPaNg+v/xS6Ug+v/zDYwriB +4AP0ANgH8ATdP9iCDm//qXGpcM9yAQDGA89xoADsJ0ahz3OgALQPPIOA4V7yARIENnATBQAKIcAP +63LPcAAAUiaFB2/5iiNFAJq4E6Yg3891oADIH/CliiAPCkMdGBAA2DIIIAqNuM9wgAAoLvGlAIBA +ePClAdhDHRgQANgWCCAKjbjxpROG+rgO8vwWBRAKIcAP63KKIIwJiiOHBSkHb/mKJAQOEIZRIACA +D/T8FgUQCiHAD+tyiiDMCYojxwUJB2/5iiQEDkTYSR0YkPClAdhDHRgQANi+D+AJjbjxpZ4JgAGR +8f0GD/jxwJYOD/iiwSh2CiSAgADfz3WgACwgQBUQEAAcxDMU8kwkQIBB8kwkgICS8gohwA/rcs9w +AABUJoojhAChBm/5CiUABDJoBCGBDwAA/P9WDq//LNgQhQIgAASMIA+KCvf+Da//LNhRIACACHf0 +8wjwIIaAuSCmLg1v/z/Y4g2v/zTY9bgN8iCGgbkgphYNb/8/2DTYANkA2qYNr/+VujC/AhzEM4jw +D3kQuQUhgg8AAIL9z3GgAOwnRqEEIIAPAAAAH0i4hrgQuAUggA8AAEL9BqEQhQIgAASMIA+KDPeL +ceYML/mKIA8NABQAMVEgAIDx8wjwIIaAuSCmqgxv/z/YgcHGDC/5iiBPDAQUADFRIICACPIghoG5 +IKaKDG//P9iLdYogjw+iDC/5qXEgwAi4AhwEMIogzw+ODC/5qXEgwQIUADEleAIcBDA28M9xAwBC +/s93oADsJyanz3EEAAL+JqeGuBB4ELgFIIAPAABC/QanEIUCIAAEjCAPigz3i3FGDC/5iiBPDwAU +ADFRIACB8fMI8CCGgLkgpgoMb/8/2M9wBgAC/wanQCSBMBoML/mKIM8OQNjuC2//AhQBMQIUADE5 +BS/4osAA2c9wgACMbyCgIqDPcIAAZC4ZBO/5iiEIA+B48cCiDA/4egkP/4DgQgIBAM9xgABkLqgR +AAAA3891gAC8pQHgqBkAAM9wgABQBuCgXhEABgHgXhkYAA2NXxnYA4Dgz3aAAGAwYBnYA8j2TI1Q +cMb2Hh4CkEcZmAAiFYAQjODiASIAiBaBkIDhB/IlFYAQiRaCkBBy6/KA4UANQvsjFYAQAdmC4Ige +QpAE9IsewpMd8I/gBfSLHkKQF/Cc4AX0AtiLHgKQEfCA4A/0JBWEEAohwA/rcs9wAADnG4oj0gs5 +BG/5SiUAACUVgBCJHgKQJhWAEIoeApCLFoCQgeAN9EAlwBnJcYIhQQuqCuAGDdqTFoCQjB4CkIsW +gJCC4A30QCUAHclxgiFBB4oK4AYN2qMWgJCNHgKQixaAkIDgLgEuAEokACDPcIAApFoFgAOAQCwN +IeCAz3CAAOwvuWAniQAgUwN6Cm//iiBVDAAlgB+AANgvJ4BmCm//iiBVDAAlgB+AANgvKIBWCm// +iiBVDAAlgB+AANgvKYBCCm//iiBVDIoglQw2Cm//6XEAJYAfgADYLyQQEQAAJZIfgADYLzJ3RAAO +AAInUBQgEg0gCnAyDC/4qXEFLT4QHBICIAIgQS5QccAgZgAHE4EgjCHDjwn0BS0+EAAhTXTifQDY +GPCMIMOPxPcqdfrxMHBQ9wUtPhAAIU104n0CeS95ACSAL4AA7C8gqADYBPAB2ADdgOAR9Iog1Qym +CW//qXFQ3AImARNALMAgFHg4YEYL4Af5ZYsWgJBAJFQgknDsBs3/B/CA4QXyegtv+4gewpOpAg/4 +4HjxwOHFCHWKIBQNYglv/6lxANjPcacAiEmB5cog4QAOobkCD/jxwOHFAN2go4HgzCEhgBfyoOJF +9qCjANgJ8MDiBtgG9kIiAAhDuALgAKNQeRC5EH2KIJQNEglv/6V5fQIP+OB4uHBWIQACgODxwJhx +xPaMIAKAjPYKIcAP63LPcAAAyRQhAm/5iiOHCs9wgABgYPQgAAHPcYAAYGEEKH4BL3D1IQEBQigD +BMG7UrgEKX4BL3FCKQIEwbpSuYHjwCBpAIHiwCFpAIggPgCJIMEPiCE+AIkhwQ+A4NYgKwiA4dYh +KwiyCQAA0cDgfvHAZgkP+KHBOnEA34DgyiHBD8oiwQfKIIEPAADKFMojgQ8AAH4CyiTBAJABYfnK +JcEDz3GAAIQwQLHPcYAAhjDgsUwhAKDKJc4TaAAuAMomzhMad1p3BfDJdxp1anBAIFMAi3EB2goI +7/8A2wAUDTEvI8gkqXYpvci+v+XZJSkUTCIAoMogwgPKIYIDyiICBBgOIgDKI0IDyXDiDu//qXFC +IVEgTCEAoLAH7f9AIlIgyXBeCSAAqXEFAS/4ocDgePHApggP+AojAKAacRryz3GAADAHpYkEiR1l +cnXKIcwPyiLMB8ogjA8AAMsUyiOMDwAA4QLKJMwEwABs+colTAMA3QDeKPAA2c9wgACAMCCoSnCK +2e4O7/8qcs9wgACAMACIUyXBEBi5w7gcuAV5z3gQuAV5iiBUDUYPL//leS8hiAQQuYogVA02Dy// +BSFBBAHmz34AIIEvgAAwByaJAWkQdjoACgBAK4IgVHq1etR6z3OAAASnV2OA5xJt6vNAJ5IQLyKI +JNR4gOHPcoAA+KY0IhEAufUB2bjxAeWvfYPlYgfL/xkAD/jxwM4Pz/fPc4AAhjBAk1MiTYAh8oLl +JPTPdYAAMAcJrSitIoXPdoAAhDAAlindEr3Pd4AAgDAVJQwQIKTgj4DnBvJWIA8I8H/1fSClAeAA +tgbwz3WAADAHC60qrQHi2Qfv90Cz8cBmD8/3CHYacc91gACGMOCVC/DMf6IIL/hAKUBxRbhODe// +CnEglYwhEIC09p0Hz/fgePHAJg/P96HBCiNAoAh2GnIa8s9xgAAwB6WJBIkdZXJ1yiHMD8oizAfK +IIwPAADMFMojjA8AACwDyiTMBDwHLPnKJUwDAN8A3SDwARSAMAEeEhAGEYEggOEBFIAwA/QBHhIQ +IMADFIIwARSBMBi4FLoFegIUgDAQuAV6iiCUDcINL/9FeQHlr33PcYAAMAcAIQAEBogB4BB1egAq +AAAhEQRAK4AgFHj1eLR4z3GAAASnNCESAFMnwRAYua94ELgFeYoglA16DS//BSGBBEwiAKAA2Rjy +i3FKcALaVg2v/wDbgOC19QohwA/rcs9wAADNFIojTQAKJIAEgQYv+UolgAABHlIQBhGAIIDgvvUB +HlIQuvEB5+9/g+cuB8v/YQbv96HA4HiA4PHAuHDJ9kwlgIMF9gDYAKkAqhPwTCWAiIf2jCUBgMog +bAD29owlAYmL9owlAoMH9gLYAKkB2ACq0cDgfowlQoSG9owlQokD2Pb2CiHAD+tyz3AAAMgUiiMG +BfkFL/mYc+B48cCiDc/3o8FKIQAgi3EqcEogACEKcpIMr/8qc4DgDvQKIcAP63JT2Aa4+9sKJEAE +wQUv+QolAAQAFIUwz3GAADAHABlCAUwlAIDKIcsPyiLLB8ogiw8AAMEUyiOLDwAAAwGQBSv5yiTL +AADAQSgCAkEoDgNTIsQAUybFEAIZAgEDGUIBTCTAgMwl7IDKIskHyiCJDwAAwhTKI4kPAAAJAVAF +KfnKIckPQSgCBFMixgAEGYIBQSgCBVMixQAFGUIBTCZAgMwl7IDKIckPyiLJB8ogiQ8AAMMUyiOJ +DwAADwEQBSn5yiSJAUEoAgZTIsQABhkCAUEoBQcHGUIBTCRAgMwlbIDKIskHyiCJDwAAxBTKI4kP +AAAVAdgEKfnKIckPBBSFMIwlAYS8ACwAARlCAQohwA/rcs9wAADFFIojhAaxBC/5mHPPdYAABKcA +3wTwAefvf0EoAQLDuTB3cgAKAADeE/BAKYEgNHkKFIAwFSFBAQHmz34UeblhABkEBIAgAiMvIAgk +AMBBKAEGw7kB4TB2wAfK/4LBCnAC2goLr/8A2wsUhDAvKAEBTiCFBy8lRwFMJcCAsAfL/wohwA/r +cs9wAADGFC0EL/mKI4QOQCFRIC8hRyRBKAEEw7kycXAHyf8G8EwmAIBeB8n/QSgBBcO5gOEKdbQA +LABKIAAgSiIAIAbwQCJSIC8ihyRBKAEDw7lScYAADABKIQAgFPACvtR+ChSAMBUmThFAIVEgLyFH +JBR+ACaAH4AABKegsIAlAhOwfQDAQSgBBwHhMnG4B8z/MLjDuAAgDgSCwalwAtpGCq//ANsLFIQw +LygBAU4ghQcvJUcBTCXAgKYH6//PfgohwA/rcs9wAADHFGUDL/mKI8UEQCBQIC8gByRBKAEFw7kS +cVoHyf/T2Qi5ANgD3s9zgAD4pgDasmhUfX1lILUB4k96guJWIQEIMHm29mG+gOYB4A94MfclA+/3 +o8DgePHArgrP96LBQMBBwkAoFAVAKRcFAN1AKhMFQCsSBQHeSiWAIal3BPAKdcp3AMAVuBN4FCDA +BeYL7/cH2QIgUAMCIEAj1gvv9w7ZzH4KIUAuBCk+cC9wrH4AIQ11HWUBwBW4E3gUIIAEsgvv9wfZ +AiDWAwImwCOmC+/3DtkEKH4EL3HsfgAhwHQZYUItABVGCO//VLlCJVUgTCUAoAHmjAft/89+UQLv +96LA4HjxwAYKz/c6cLpxz3CAAGyyAJBKJEAgANlKIEAghiD8AIwgAoDCJAIlSiKAIM9wgABImiuo +z3agANAPJRYPliUWDZZCIYAgEBYWlrFwlPcCIFEDDCGApMoiLiDiCS/46XBMJACgmHAA2BPyhecJ +8ovnBfII8EojACAw8AHYAvAC2M9xgAAcFSSBCyEAgAPyANoC8AHaACJAI5YIb/nKcQojAKAc8kwk +AIIS8s9wgADAHBYgAAFAgAaIEHcX9IDiFfKpcGB6qnEKIACgCPLCdRAeWJNMIgCgsPVMIwCgzCAi +oBHyANgQ8AohwA/rcs9wAAAxEYojVwVKJAAAbQEv+QolAAET2E0Bz/fxwOHFz3CAAFQyCBAEAEwk +AIDKIcEPyiLBB8oggQ8AAGkZyiOBDwAAqAE0ASH5yiUBAc9ypQAIDAgSBQAA2UwlAIDMJSKEyiHC +D8oiwgfKIIIPAAB9Gcojgg8AAK8BAAEi+cokIgBA2AKiz3CAAFSwYIAK8PQgTQDPcKYAAIA1eAHh +oKDS4YQrAgoAJEAOtPekEAMBz3GkAKA/faGmEAABHqEIGkAB7QDP9+B48cByCM/3z3aAAEguIIYI +dWB5BNiA4Af0IIZgeQPYgOAJ8s9xrACQAYDlA9jKIKEABaGtAM/34HjxwDII7/dQ2M92rADUAQDd +rR5Yk6geWJPoHgCQz3eAAEguIIdgealwi+Aghw3yYHmpcIfgIIcJ8mB5qXCI4AXyUNjsHgCQUNiB +HhgQgNiCHhgQBdiDHhgQc9i+HhiQdNgIHgCQGB5Ak78eGJB32AweAJAD2BweAJAH2LweGJAAHgCQ +f9gQHkCTvR4YkAQeAJAUHkCTqh5Yk6seWJMB2KweWJOTHhiQEdjwHgCQqth1HhgQCth2HhgQeNjU +HkCTmB4YkCfYmR4YkCDYmh4YkCCHYHkA2IvgCPIgh2B5ANiH4ADYA/QB2CCHGnBgeQDYiOAB2MB4 +BSA+hATyAtibHhiQfh5YE38eWBOAHlgTiQeP9/HABgsgAEfYANrPcasAoP9ZoQfYGqFYodHA4H7g +fuB4VQPACFEDwAhNA8AIANnPcIAAVLAhoM0E4AEioPHA4cXPdYAAVLC2DuABqXC4cACFgOAS8kok +gHPPc4AA7GYA2aggQAJEKX4DMiNCDrByHvIB4RHwANlKJIB5z3KAAKRnqCBAAkQpfgMyIkMOsHMO +8gHhCiHAD+tyz3AAAIYZ6tvJBu/4SiQAAPUGr/cocOB4z3CAAFSwIICA4QOACfLPcYAA+GZEKH4D +MiFADgjwz3GAALBnRCh+AzIhQA7gfuB48cA+Dq/3B9geCiAAAN8GDu//OnDPdqQAuD2sFgAWoris +HhgQz3ClANjL7KAB2PYeGBDPcBUAKyuaHhgQmg7v9+lwiiDEAJ8eGBDPdYAASC4ghWB56XCL4Ajy +IIVgeelwh+DKIMIjBPRKIEAgIIVgeQDYiOAB2MB4BSA+hBLyGtjzHhgQ9B4YEGTYyB4YEKrYyR4Y +EGnYzB4YEMDYzR4YEDnZz3ClAAgMPqBOCAAAogggACpwGNiVHhgQz3GAAEAc4aHI2AKhAKEDoc9x +AQBo4M9wgACMFtQYQACU2c9wpQDYyyugQdnPcKUAzH8toLEFj/fgeADbz3GqAPBDZaHPcgAAPz9G +oc9wAAA+PwehiiAQAAihCdiMuAmhz3AAABYcCqHPcAAAHx8Loc9wAAAcFgyhkdgEuA2hBNgOoc9w +AAA/Pg+hUKFxoeB+4Hjhxc9xoADIHAihBt0R8OB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44Hjg +eOB4Yb2MJf+f7fXgf8HF4HjxwL4Mj/eiwaKBYJDPdoAA7Aa4e6OBZH1ghqV7poEBkLh4p4FgpqR4 +oYZAIQ8EgOKleAGmHPIBgQIcxDAwuwQcxDAAHAQwIIGLdWB5qXABhyGGAhxEMDC5BBxEMCCHABwE +MGB5qXAA2ACmAaa5BK/3osDgePHAz3CAAFguIIBgeQHYJ7hSIAAAwLgTeMK4z3GnABRIC6EModHA +4H7hxeHGz3GgAMgcyIEIoQbdEfDgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeGG9jCX/ +n+31yXDBxuB/wcXgePHA1guP9wh2OnFIdxpzz3WAAFSwAKUhpVit3gzv/3mtSg3v/wOlBKUA2s9w +qwCg/1mgB9k6oFigyXAqcelytg0gAgpzLgvv/+lwgOYB2MB4DOCmDC/6AdndA4/38cB2C4/3CHUE +Io8PAAYAAIDnAd/AfwQigg9AAAAA13JAAAAASiFAIM92gABUsBiOwiFCJBB3GnEI9IDnBPQZjjJw +BPQA2APwAdgvIgcgqXBGCiAC6XEghjB1ANgG9CGGEnHMIiGgA/IB2C8mB/AarhvyANnPcKAAtA88 +oKlwCnHpciYP7/8qc4YNgAIBhs9xgAC4BgCxAIYBsRiOBKnODKACKnAI8IDlAdjAeAzg7gsv+gHZ +HQOP9/HAz3CAADDSGgpv+YohCQzPcIAAwCAOCm/5iiEKBc9wgAA8Jv4Jb/mKIQoF0cDgfvHAhgqP +96LBOnAacQDdbg7v/wfYmnAC2alwWnB6cQDbNGgCcSh1FCEAIGhywoUEEA8F2H/DhQHixH+D4uV7 +IOW29wGBAhzEMDC7ABwEMCCBBBzEMGB5i3BCI0EggOG+B+3/QCJAID4N7/+KcG0Cr/eiwOB48cAe +Co/3OnDPd4AA1DkQj892gABUsKWGhiD/AUO4DiUNkM9wgABILiCAyiViEGB5BNiA4CHyGo6A4Mwl +IZAd8gDYDd0acAK4FXjHcIAA2DEggIDhBfICgIDgFPJAeGG9gOVAIEAgMPcA2BquEI+GIP8BQ7gF +pkIK7/cqcAECj/cKIcAP63LPcAAAZRk12wokAATZAe/4uHPxwOHFCHUgkAKVQZUQuAV6KdgSuBUg +QQBAoSCV8CBBADByDvJyCO/+iiDRAwKVIZUQuAV5Ygjv/oog0QPJAY/38cDhxYogiQaKJUoVSgjv +/qlxz3GAAAQ0wBECBr/iANtL9xJqFHg4YKCgz3WAAFAHoIWhoGKgAWrFuMAZGABODaAAANiBAY/3 +8cD+CI/3CHaKIP8PAKbPcIAAcLAKgIDgDPTPcIAAUC4ggGB5AdiB4AXdyiUiEXXwz3CAAMgdA4AY +iITgGfTmCOAAAd0Aps9xgADwEyGRz3OAAHQHQIM84TpiIYNk4hThWWEwcMIlThOzfcG9VfByCEAA +z3CAAFRZAIDPd4AACDdCIBCAQgjgAMogYiAAps9xoACwH7uBKYdAJxETz3KAABDO8CFBIEWCYbkF +Kn4A1b0ndWq9SCUNEBB1yiUGEE/3z3CAAFRZighgB0ogQCDPcIAAbFl6CEAHoKbPcIAA8BMBkM9y +gAB0ByCCPOAZYQGCZOEU4DhgEHUB2MIgDgATeFMgTYAJ8kwgQKAH9AmHeg+gBfAhACBJAK/3qXDg +fuB44H7gePHA4cXPcaAArC8cgb2BBH3PcIAABB0AiIHgCfTPcMDfAQAcoSjZGLkh8IogSQa+Dq/+ +iiHOD4ogCQayDq/+qXH8vQryiiCKBaIOr/6KIc8Dhg+AAgQljZ9AAAAA3AtC/IDlqAgC+gDZm7nP +cKAA0BsxoOkHT/fgePHAEggAABYPAADRwOB+4HjxwFYPT/fPcIAAcLAHgEogQCDAuIHgz3GAAOQ3 +AIHCIAIk4bg49IG4AKHPdqAAwC8Thvq4BPIThrq4E6YC2BGmz3CAAEguIIBgeQDYiOAW9CDfz3Wg +AMgf8KUK2EMdGBAA2AoIYAmNuPGlDPDPcKAAqCANgOTgkvcQhlEgAID487YPj/8SDyACCnAVFgCW +gLgVHhiQJQdP91wWBBBAFgUQCiHAD+tyiiBMCfUGr/iKI4YH4HjxwJoOT/cIdc92oADALxqGObhS +IAAAUyARABSGUSDAgAf0Sg7v/iTY8rgA3wLyAd9RFgCWgOAL9KMWAJYEIIAPAAAAD4wgEIAD9ADY +AvAB2BpwBCGSTwAEAADPcAAACBwKDs/+P7hSIAMABCCATwIAAADXcAIAAAAB2sB6DHCGID0AgOAB +2cB5USCAwQjyz3CAAFAHAICB4ADYA/QB2AHe5b3KIYEjTCEAoCjy5r3KJ2EQgOci8uO9yiJhIEwi +AKAc8uS9yiNhAIDjGPLivcogYSBMIACgEvLhvcoiYQCA4gzy4L3KIWEAgOEI8lElwJHKIGEAgOAE +9ADYA/AB2PkFb/cPePHAog1P96bBz3CAAMReIIDPdYAAcLABgETBJYVFwIPhzCEigDryz3CAAMgd +A4AYiITgNPKB4QHfAN4M9FYLr/zpcM9wgAAcsR2IgODFpSbyiiBJBlYMr/6KIU0FA9gFpQ2FzqUM +2RUkAjDPcKAALCCwgM9wAQAoJ0DAQcdCx0PGRIIA2AhzmHC4cAAlhx8HACChFguv/NhwcQVv96bA +4HjxwO4KD/4A2M9xoADAL4gZAAATgYu4E6HPcIAA8BMBkBC4RSAAD8AZAADRwOB+4HjxwADZz3Cg +ANAbm7kxoM9wgABQBwAQBQBMJUCCi/cKIcAP63KKIA0H6dvtBK/4SiQAAM9wgAAwN/AgQAFAeNHA +4H7gePHAigxv91LZGnDPcIAAcLAHgAHdwLiB4MB9fguv/oogSQaKIMkJcguv/gpxz3CAAPAVAIjP +dqAAyB9RIICAAN8G8n4WAJaguH4eGJDPcKAAtA/8oAvIBCCAD/7//wMLGhgwC8iHuAsaGDA6Cw/7 +RNhJHhiQHN4S8OB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4Yb6MJv+f7vXPdqAAwC8T +hvq4CvSKIEkG5gqv/mnZPg2gAalwGg6gAKlwQgqAAFEWAJaA4AX0DHSEJMKfF/IXhvm4FfTPcIAA +3AcAgFEgQIAN9AohwA/rcgokAAhRFgWWiiBMCNUDr/iD24HlKfSKIEkGjgqv/ovZEIZRIACAGvTP +dYAAUC4ghWB5AdiF4Af0IIVgeQLYguAM8kAWBBAKIcAP63KKIIwIkduRA6/4uHOKIBABEaYQhlEg +AID99RSGq7gUphLYGLgZps9xoADIHxgRAIahuBgZGICKIBAAEaEJ2Ai4D6EThqm4E6bPcIAAcLAH +gIPgIPTPcIAA8BMBkM9xgAB0ByCBPOAZYWThAiBAoBwADwAKIcAP63KKIMwIu9tKJAAAFQOv+Lhz +ArifuIgeABAuDQAHz3CAAOQ3GQNv9+Cg4H7geOB+4HjxwJ4Kb/fa2c92oADAL4AWDxBcFhIQiiUJ +HWgWEBCIFhEQkgmv/qlwqXCKCa/+QS+BEKlwfgmv/kpxqXB2Ca/+CnGpcG4Jr/4qcTCGZgmv/qlw +M4ZeCa/+qXAH2M91oADIHxkdGJAB2AhxCHIIc8YM7/6YcPoJ7/5U2IAWDxAiv6oLIAfpcM9xgAAE +PA+B+GAPoQDYiB4AEAnYCLgOpV0CT/fgePHACgpP914Lz/+A4ADZyiBBADvy7gugByhwiiCJB4ol +RxHuCK/+qXHPcIAAUAdggM9xgAAENMARAAa/4APaSPfSaNR+PmagpmGmQqYB4MW4wBkYAO4NYAAD +2ALYz3GAAHCwBaHPcIAAyB0AgLoQAAYluMC44g0v/AqhCNgGDCAAiiH/DwHY8QFP9+B48cDPcIAA +UAcAgIPgBfQGCs//Mg4AANHA4H7gePHAXglP989wgADIHQOAGIiE4M92gABwsBT0CoYB2oDgAIbA +egHZgODPcIAAEM4GgMB5gODMIiGAzCEigFzyZPDPcKAALCCwgBKGANoCJQGQ44bKIm8AsXcJhhIA +LwD7YAIlzxCA5wDfwvYB39dxAEAAAMn3gOIH8gIlgR9OAAEgMqYCJcEQ13EAQAAAyPeA5wbyAiWB +H04AASAjpiKGgOES8iGGOGAQccb3EHXK9zB1hvcI8DB1hPcQdcT3ANkD8AHZIqYAhs91gAAQzqaF +gOAB2MB4gOEB2cB5hiV/HoblANsF8qqGgOUC9AHbgOfMIiKABPQA2AnwgOPMISKAzCAigPrzAdjB +AE/34HjxwIog0AdWD2/+iiFFCuoKwAUuDM/9CdkIuc9woACwHzSg0cDgfuB48cAmCG/3AdvPcIAA +lDcAgM9ygACYl8G4g+AEEgUAwHtMJUCABvTPcIAACDccEAUAz3CAALRZAIBCIACAyiBiAIDgR/TP +cYAAcLAMgYDgzCMhgD/0AoLPc6AAsB/bgza4Nr7RcNYmjR8AAIAAQIK1gQAiEADdZRJ1TfcKIcAP +63KKIA0KiiOEDQokAAThB2/4uHVMJQCAD/QKIcAP63KKIE0KiiNEDskHb/hKJAAAACBQIRJ1ffeg +doogSQZ2Dm/+iiFFAAIggCOuD2AFAdm9Bw/34HjxwOHFCHWKIAkGVg5v/qlxz3GAAHCwAIGmeACh +ANgQoQWBvgngCBGhpQcP9/HALg8P9891gABwsCCFJXgApRCFgOChwQX0AdgQpQWFEaXuDy/9i3AA +wc9wAQD0GjBwDPLPcAEAKCcQcQbyz3ACABA0EHEF9NIMb/wB2ADeBg1gAsKlz3CAAFRZFg/gBofd +z3CAAGxZCg/ABs9wgADkWQIPwAaKIIkGug1v/qlxz3GAAAQ0wBECBr/iS/cSahR4OGDPc4AAUAdg +g6CgYaDCoAFqxbjAGRgAvgpgAADY6QYv96HA4HjxwJhwz3CAAMgdAIDPcYAAcLC6EAAGJbjAuP4M +7/8KoYDgB/KqD6//iHCA4AP0ANgC8AHY0cDgfvHAOg4P989wgACYpQiAz3WAAAQ0USDAgSv0iiBJ +B/LeIg1v/slxwBUBFr/hAt9M9xJpFHi4YM9ygABQB0CCwKBBoOKgAWnFuMAdGBAqCmAAAtjPcIAA +cLDloADaz3GAAJQ3UKFRoRDYCaFHoSHwAN/PcIAAcLDloIogiQb73sYMb/7JccAVABa/4Ez3Mmg0 +eblhz3KAAFAHQILAoUGh4qEB4MW4wB0YEM4JYAAA2PUFD/fgePHAeg0P9zpwWnGKIMkJggxv/ooh +BwzPcIAA8BMBkM9ygAB0ByCCPOAZYQGCZOEU4DhgUnCO9wohwA/rcoogjQiKI0cMCiRABIEFb/gK +JYAEz3CAAHCwqoCA5R3yz3CAAMgdA4DYiITmFfLPcIAAcLAUEAQATCSAgA3yCiHAD+tyEL2KIM0I +iiMHDUEFb/gAJYUTQgnP+ljY9gyv/gHZz3agAMgfINgQpjLYQx4YEADY5g3gCI24INgRps9wgABw +sKQWEBDuDyAHHBhABDWGwgtv/oogyQnPdaAArC88hbILb/6KIMkJiiDJCaYLb/5KcVEhwKBC8s9w +gADcBwCAhiB/D4LgAdjAeIHgOPQYFgCWobgYHhiQiiAQABGmGYXwuBmFDPIEIIAPCAAAANdwCAAA +AAHYwHgH8IYgfw+C4AHYwHiA4OzzoN8R8OB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +Yb+MJ/+f7fUZhYi4GaXqCUABz3CAAHCwB4DAuIHgAdjAeFoIL/w6cGoPr/9KcAHYtg5gAApxHIX5 +uBv0GIWIuBiloN8S8OB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4Yb+MJ/+f7vUH8M9x +gADkNwCBgrgAofoIz/+6CEAApBYPEPoP7/sqcDIPAABc2JILr/4B2SDYEKYy2EMeGBAA2IYM4AiN +uCDYEaYchfm4DvLPcIAACDcAkFEggIHKICECXAuh/sohoQDPcACCAQAcpQDYDg5gAOlxjQMP9/HA +Ogsv9wDZm7nPcKAA0BsxoM9wgABwKBmAz3aAAFAHz3WAAAQ0USCAgADfHPSKIIkGEgpv/oohygbA +FQEWv+FAhkr3EmkUeLhgiiPKBmCgQaDioAFpxbjAHRgQGg8gAADYHvCKIAkJiieKGNYJb/7pccAV +ABYghr/gBNpH93JodHu7Y+CjIaNCowHgxbjAHRgQ5g4gAATY7gwAAAUDD/fxwJ4KD/fPcIAAyB0D +gBgQhQBMJQCBDPQKIcAP63KKII0JZmi5Am/4SiQAAIIMgAjCC6AICHUIcaYNoAipcIYgv44q9KoP +z/2B4Cb0At3PcIAAcLCmoIogSQeKJk0fRglv/slxz3CAAFAHIIDPcoAABDTAEgAGv+BH93JodHtb +Y8CjIaOiowHgxbjAGhgASg4gAALYdQIP9/HAAgoP9891gABwsEwVhhBMJgCApMEP9gohwA/rcoog +TQeKIwQASiQAAB0Cb/gKJYABz3CAAHAoZBAFAFElAIAM8gohwA/rcoogjQeKI0QA9QFv+EokAABM +JoCACPQA2EwdAhCaDa/+GNiJ8CYL7/+KIMYLgOCD8gqFAN6A4M6lCPLPcIAAyB0DgBiIhOAq9M9x +gACUN9Ch0aEQ2Amhx6HFpYogSQeKJcQWYghv/qlxz3CAAFAHQIDPcYAABDTAEQAGv+AC20j30mjU +fj5moKZBpmKmAeDFuMAZGAAC2E3w4ghgAAHfz3GAAPATYZHPcoAAdAcggkGCPON5YZUhwQIU4llh +MHB2AAUA5aXPcKAALCCwgM9wAQD0GkDAQcdCx0PG6XAG2elyyXOYdrh2ACWHHwcAIKHSDi/82HaK +IAkHiiXEGsYPL/6pcc9wgABQB0CAz3GAAAQ0wBEABr/gSPdyaHR7O2Ogo0Gj4qMB4MW4wBkYAAHY +ygwAAPEAL/ekwPHAfggv94og/w+hwUDAz3WAAHCwBIWA4ADZCPLPcKAALCAQgCSlA6VuCoAIrgmg +CBpwCHGSC6AICnCA4Gv0z3CAAJQ3JBAFAFElAIEM9AohwA/rcoogDQiKI8UMaQBv+EokAADPcQCC +AQDPcKAArC88oKIJ7/+KIMcLgOBL8ggVBRBMJQCADfIKIcAP63KKIE0IiiPGAzEAb/hKJAAA4g5v +/4twCiUAkDXyiiBJBt4OL/6KIcYFiiAJBtIOL/4AwYogCQbGDi/+qXGKIIkHiibGFroOL/7Jcc9w +gABQB2CAz3KAAAQ0wBIABr/gA9lI9/Jo9H9fZ8CnYacipwHgxbjAGhgAugsgAAPYqXDyCe//AMHR +B+/2ocDxwG4Pz/bPcIAAyB0DgBgQhQBMJQCBDfQKIcAP63KKIM0HiiNEDokHL/hKJAAAUgmACPoO +IAAIdoDmCHUZ9L4I7/+KIMYLgOAT8s9wgADwEwGQz3KAAHQHIII84BlhAYKVIcECFOA4YBB1TAAN +AO4ML/wB2IogiQaKJYUU9g0v/qlxz3CAAFAHIIDPcoAABDTAEgAGv+AA20f30mjUfl5moKYhpmKm +AeDFuMAaGAD6CiAAANglB8/28cDhxc9wgADIHQOAGBCEAEwkAIEM9AohwA/rcoogDQmKI4wE0QYv ++EolAACaCIAI2g9gCAh1CHG+CaAIqXDtBs/24HjxwHIOz/Z+CIAIvg9gCAh1CHGiCaAIqXCE4An0 +iiAJBlYNL/6KIcsMRfDPcKAAyB+kEAEAFYDPdoAAcLBBhkJ513EAAKAPAN3L989xgAAQziWB1bhB +KYIAQnkwcIT3AoaA4Cn0iiAJBg4NL/6KIYsPoqaKIEkHiiVMEP4ML/6pcc9wgABQB2CAz3GAAAQ0 +wBEABr/gAtpI99Jo1H4+ZqCmYaZCpgHgxbjAGRgA/gkgAALYLQbP9uB48cC2De/2iiBJDLYML/6K +IYoMrg4P/891gADIHU2FPpVTIgAAdg6gAwHbANjPdoAAcLAOpgqGgOAF8gOFGIiE4AP0BNgD8IYP +QAiyCKAIANmA4D/0B4bPd4AAUAfPdoAABDRRIMCAG/KKIIkGiiVLFk4ML/6pccAWARa/4UCHSfcS +aRR42GCgoEGgANpCoAFpxbjAHhgQANgZ8IogSQeKJYsXHgwv/qlxwBYAFiCHv+AC2kj3cmh0e9tj +oKMho0KjAeDFuMAeGBAC2CoJAABRBc/24HjxwOYMz/bPcIAAyB0DgBiIhOAO9AohwA/rcoogTQmK +IwwJSiQAAAEFL/i4c8oOQAiA4Cfyngov/AHYiiBJCIolDB2qCy/+qXHPcIAAUAdggM9xgAAENMAR +AAa/4AfaSPfSaNR+PmagpmGmQqYB4MW4wBkYAKoIIAAH2GYKAADVBM/24HjxwKoP4Abhxc91oACs +LxiF+rgL8hqFUiAAAFEgAIAF8hyF/LgJ8oogSQY+Cy/+iiEJCdYMT/8chVEgAIAZ8s9wgABUWQCA +QiAAgMogYgCA4A/0z3KAAAg3CYKE4En3z3GAAHCwKoGB4QP0AeAJojyF9gov/oogiQ36Ds/3Yg2P +/YDgCfTPcIAAUAcAgIPgmAjB/0UEz/bgePHAxgvP9s91gABwN/AlARDPd4AAUAeD4QCnYfKC4M92 +gABwsAv0JoaB4Qn0iiAJCJ4KL/4A2QjYAKeC4Bz0AtgGpgDanroA2c9woAD8REGg4HghoM9woAC0 +DzygC8gEIIAP/v//AwsaGDALyIe4CxoYMDXw8CUBEIHhDPTPcIAAlDcAgFEgAIAE9ADYBqYD8Cam +z3CAAHAoGYBRIICABfJuCYADDvAA2p66ANnPcKAA/ERBoOB4IaDPcKAAtA88oM9wgADIHQOAGIiE +4AX0ig8P/YDgA/RaCgACVQPP9uB48cDeCs/2z3agAMAvOobPcoAA5DcAguC4YfSAuACiz3CAAHCw +B4BKIEAgwLiB4MIgAiT8uQXyEIZRIACAA/QA2ALwAdhMIACgLyEHIEHyiiAJDZ4JL/6KIUQPMIaS +CS/+iiAJDRCGUSCAgg/0QBYEEEwWBRAKIcAP63KKIEwJrQIv+IojBQBMIUCgz3WgAMgfIN8T9Iog +EAERpvClCthDHRgQANhSC6AIjbjxpTCGQgkv/oogCQ2KIBAAEqbwpQXYQx0YEADYMgugCI248aXP +cIAAQC4ggGB5CnBlAs/24HjxwAYKz/bPdoAAUAcAFgQQz3CAAHCwTCTAgcwkIoAN8hQQBQAKIcAP +63KKIM0JHQIv+IojxAEA3+WgiiCJBoolhBPOCC/+qXHPcYAABDTAEQAGv+BI91JoVHo6YmCGoKJh +ouKiAeDFuMAZGADWDe//ANj9Ac/24HjxwOHFz3EDAEANz3CgAKggLaDPcaAAwC8UgfC4FIEM8gQg +gA8IAAAA13AIAAAAAdjAeAfwhiB/D4LgAdjAeIDgXvQVEQCGoLgVGRiAEfDPcKAAqCANgOTgz3Wg +AKwvj/cchfm4RvQMdIQkwp9C9H4Kb/9a2IDg7fNC8IogCQYaCC/+LmjPcaAA1As7gQoIL/6KIAkG +LHECCC/+iiAJBjmF9g/v/YogCQaqCG/+JNgIceYP7/2KIAkGmghv/oogCQMIcdYP7/2KIAkG63WG +CG/+JNi4cM9woADUC2wQBACKII0KCiHAD6ly6QAv+IojSQbPcaAAzCsSgYC4EqEJAc/2z3GAAJQ3 +AIEigX/bz3KAAHCwUyAAgCZ7BPQugoDhFfSA4AbyDoILIMCAD/QwgoDhBPQFgoLgB/KA4QfyEYKC +4AP0AdgC8ADY4H7gePHAocEA2M9ygABwsE0SgQBAwIHhi3AP9M9xoAAsIDCBVIJCeddxTgAAIMX3 +LgnP/APwCgnP/ILgBvSKIP8PocDRwOB+z3CAAOxaA4AggADAIniA4MogLADz8eB44cWKIf8Pz3Cg +ALAfG4DPdYAA7FpjhWCDpoXVuIDlANoG8iKFYnmA4cohjAAJIQAAarhIIAAA4H/BxeB48cCqD4/2 +CHXPcIAACDdBgM9wgABwsM92gABsskmgX4YB3wQlhh8AAAAgSHMmulMiBQBEJQITiOKGI/4PwH9B +LUITUyIEAIDjFiBHAQgfAAEp8oHnNvTPc4AAlDdJgyV6SaPDuQDaDyJCAC+DCyGAgAHfBfLsoxwb +gAHmvSL0LoNEeVCDBSGBgDCjHPIA2s9xgAAIN0mhz3GgACwgMIEjoBDwz3GgACwgMIGB5yGgCvQC +gIDgBPIuDw/8BPCWDg/8z3eAAMgdA4cYiITg2A4h/cogQQMDhxiIgeAG9M9xgAAQxhXwjguP/YDg +KfLPcIAAXCMUiIfgI/SYFoAQz3GAABDGBbgAYe24GfKYFoAQ7L1AIU8DBbg4YA/yIICIuSCgkg3v +/YogCQaYFoAQAdkFuB9nIK8D8ADZLajZBo/24HjxwGIOj/YacDpxz3CgACwg0IDPdYAASC4ghWB5 +A9iA4ADfB/IghWB5BNiA4AP0SiCAIUwgwKGP9gohwA/rcoogzQqKI0cPCiRABGUG7/cKJQAETCGA +oc9xgABwsALy1KEOgc9ygABUNw8gQAQOofAiAARygdhgAiDCAP+6AvQSoc91gACUNwKFIYUEeRXI +ESEAgA3yyqWKIMoI2gzv/clxAYWP4OmlA/TnpRkGj/bgeOHF4cYIdf/Zz3CrAKD/OaA4oATZz3Cg +AMgcKKAW3hLw4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44Hhhvowm/5/u9c9xoADALxOB +gOXPIOIC0CDhAhOhgOU82gX0z3CAAPATQJDPcIAA8BMBkBC4RXjAGQAAwcbgf8HFz3KgACwgUIIi +es9xgAB0BxV5AIEQcsz3z3CAAMgdAIC6EAAGUSBAgQLyQKHgfuB48cAKDY/2z3aAAHQcAIYB4IHg +AKYQ9AHYz3WgAMgfUR0YkCDf8KVDHRgQANjuDWAIjbjxpc9xAQBCac9woADsJyagAIZCIECAAKYH +9M9xoADIHADYEaEdBY/24HgA2M9xgAD0KAOpz3CAAGwGR4ACgEKpHOBWeESISakFiOB/CqnxwFIJ +j/2A4DPyz3CAAGgjLJDPcIAAyB0ekBBxKfLPcIAAfC9wiFKIRCs+CwAhgH+AAAwvVXgOiM9xgABk +LoHgF/QAgYq4Ugmv/QChgOCMDCIGyiAiAM9ygABEWgWCA4AggMdxAAAAUN4MYAZIcNHA4H7gePHA +FgyP9s9xpwAUSADeyKEHgc91gABAlAelEIHPcqcANEQIpcehz3DzD//8EKGg2Nahmrj1GhgAz3Ck +ALg9mxABBiOlphABBiSlkhABBiWloxABBialmxiYA//ZphhYAJIYWACjGFgAz3GkAOz/z3AAAP// +x6EGoc9xgAB0HACBAeCB4AChEvQB2c93oADIH1EfWJAg2BCnQx9YEADYigxgCI24INgRpwTYmgqv +90AlARIN2I4Kr/dAJYESz3AoAAIBz3GgAOwnBqGKII0ABqHPcIAAdBwAgM9xgAB0HEIgQIAAoQX0 +z3CgAMgc0aCRA4/24HjxwCILj/ZRIMCBFcjPc4AAHLEDEgI2z3WAACyyFHvxixAThAAR8gHn6XEy +EoUAZ5UCHQIRz3ZBAIMAZrXPc4AA1DzjrRDwQCRBADEShQAircATAwHjrc92IQCCAGa1z3OAANg8 +sHHI98SlAIMB4ACjBIVU8M9xgAA8sQlhAeEkrSGCANtRIQCB0Io68i8lyAMPeEkgxAAVbs93gAAQ +xgBn9rgyigfyz3CAABDI1ngBiALwaHAAJI8PgAAQyNZ/5I8IIcEDCCEAAKBwSSDBAxZuNXjPcYAA +kMkAYc9xgAAQydZ5z3aAAMgdxIbYhiGBxXkEIYEPAAAACCZ4A/ADggKlmBKAACiNEHEF8mStYNgY +uAPwANiduASlcQKP9vHA4cUDyKQQAABRIACAz3CAAMgdBIAE8huQA/AakP4LwAaA4Dr0z3CgABQE +A9kjoCDYDBocMM9xgACIOxOBAeAToQPIANqYEAEApBADAJQYQACeEAEBrLuSGEQAvhABAa27gBAN +AaQYwACQGEQAfhABAYAYhAA9ZbAQAQGieTB5sBhEAIIQAQF+GIQAhiPlj7IYRADsCEL95QGP9vHA +agmv9ghzEIkzEY0AAdpAqxUSDzbPdoAARLHuZs9ygAB0sUjcwasVEg82AiIOA/QmzhPBsxUSDjbw +IoIDQaNBgVEiAIEQ8tKJz3KAABDIFnrcq0CKhiJ/DFx6BLpFftyrBPCA2lyrBLgFfb2rHJHPcoAA +vLEPsxXI8CIAAASzB8gFo1QRAAEMswCRDbOgEYIASKMGyAQggA8CAEEA13ACAAAAA/SIukijBsiG +IL6PA/KJukijnBEAAc9zgACEWya4wLhAKAIDD4HAuA24RXgBAa/2AKPgePHAkgiP9s9wAACsMM9x +gAB8BwGhz3CAAJilAKHPdoAAoM7PdYAAVFsAhSCGIKAAhRzZIKjPcIAAZC4AgFEggIEEbjfyz3eA +AHzX6XHeDyAFDtrPcIAAfNdgkM9wgACYL02Iz3GAAHzXAuIAIsQALyQIAQAZBAFVJEEEjCEIgMoh +zQ/KIs0HyiCNDwAAwhvKI40PAABwAEAA7ffKJS0AVSZBFAzgzg4gBXlh4aUD8AGlCHdVJkAUA6UY +2AKlVSbAFQWlAYYEpc9wgAB8BwKnANhaHgQQAYetuCEAr/YBp+B48cCuD2/2HNoacM91gABsWwCF +z3GAAGS3z3aAAGi0QKBAJgAXAaUIhiOlz3GAAJQHjbgIps9wgAA8CAmmGNgCpc9wgACsBwCA5gsv ++iCBz3GgACwgMIGA4EGFKqLD9jhgCqICjlEgQIBQ9EwgAKAK9M9wgACgt89xgACgBwChQfDPcIAA +oAcAgAGIRCi+KADZQCCFAM9wgACbtDIgQg4vJUcBz3CAAKQHAuJPeoDiABCEAAIkgADX9gAhgw+A +AIS0RCi+KBbjMiNDDjhgACCPD4AAZLcB4S95UHFgrwIkgACs9s9xgABktzhgz3GAAKAHAKEulgIh +QQEweVlhLrYFpQ6WEQdv9gSlz3CAAHy3+fHxwBIIIAAC2PoJAADRwOB+8cCODm/2SiQAcgh3z3CA +AMgdFSDQAwAQDSAA3slw2qWoIEANz3GAAFBk9CECAM9xgACEphR5QLHPcYAAYGb0IQIAz3GAALSm +FHlAsc9xgABgZPQhAgDPcYAAlKYUeUCxz3GAAHBm9CECAM9xgADcphR5QLHPcYAASGb0IQIAz3GA +AKSmFHkB4ECxCIXluAXyBNk0pQLw1KXkuAfyCdlGHUQQLtoF8BTZRh1EEDLaW7VZjVEgAIBZYTB5 +Rh1EEBrhOrUK8grYVB0EEAbYVh0EEAfYCPAQ2FQdBBBWHYQTBdgPpfIOIAPpcDyNKHBEHUIQhiAD +AOa5WB0CEMoiQQAM8lAhwwFvekQdwhBQIMMBb3hYHcIQ5bkI8khzhiMDAG96RB3CEOS5BfKluFgd +AhBRIcCABfKkukQdghCC5xXyYg0v+elwABAAIK8QAAZRIECA8djAKCIByiCBDwAAkwDAKCEBiB0A +EBjYjbgTpQiFUSDAgM9wgADIHQXyuhCAAIm4A/ChEIAAEqXPcKAArC8ZgM9xgABwKDC4wLieCSAI +GqEIhQQgvo8ABgAAC/I2uMC4G3gB4FodBBAC2BqlA/BaHYQTANgXpRilrg1v/elwKIUB2khzQSkA +BTW5UiAAAFIhAQDAuMC5Ng/v/ZhyBQVP9vHAogxv9gfYz3agAMgfSB4YkM91gADIHQOFz3egAKQw +OoBMHliQiiEEAC+mRhABAbAeQBBGEAEBtB5AEB/ZCLkupgiAUSAAgADYi7gH8hCmRgvP+AGHhLgG +8BGmjgvP+AGHpLgBp89wgADAWwCA4LgJ8oYg/w4iuBS4z3GAAMgFC6E+D4/4mg7AAGYOAAPiDgAD +z3AAAFVVWh4YkAHaWR6YkAOFCIDPcaYAKADzuAfyANgPoeYJgAQC8E+hA4XPd4AASC5aEAEBz3Cm +AOgHJqC+D8/8A4WCCOAEDZAA2M9xqwCg/xmhB9gaoQDYGKEgh2B5BNiA4AvyiiDYCa4Kr/0B2R4K +YAAC2ATw5gqgBgHYI4XPdqAAxCccgQ8eGJBdgc9woAAwEESgz3CAAGyyEHiPHhiQz3CAADSbz3KA +ADSrEHgQukV4kB4YkIogBACSHhiQHoFAHgCQz3CAAAgdUx4YkA8WAJafuA8eGJAgh2B5ANiO4Aby +IIdgeQDYiuAI9AgWAJCFIIQACB4AkCCHYHkA2IrgBvQIFgCQirgIHgCQANgQHgCQA4UfgBweGJBd +A0/24HiA4PHANNgH9KoKz/1QIEEEBfCiCs/9TyBBBN4K7/002NHA4H6A4PHA9NgI9IYKz/1QIAEA +9NgH8HoKz/0IcfTYgLm2Cs/90cDgfuB48cCiCk/2z3aAAHQcAIYB4IHgAKYQ9AHYz3WgAMgfUR0Y +kCDf8KVDHRgQANiGCyAIjbjxpc9ygABUBwCSz3GgAOwnhrgQuAUggA8AAMISBqEBkhC4BSCADwAA +AhMGoQCGQiBAgACmB/TPcaAAyBwA2BGhmQJP9uB48cAqCk/2z3CAANgxGYCB4Mohwg/KIsIHyiCC +DwAAqBPKI4IPAABoAcokIgBAAqL3yiUCAc91gAB0HACFAeCB4AClEfQB2M92oADIH1EeGJAg3/Cm +Qx4YEADY4gogCI248abPcIAAVAcjkASQwrnCuAO4JXgQuIUgjQDPcaAA7CcGoQCFQiBAgAClB/TP +caAAyBwA2BGh/QFP9uB48cCOCU/2z3aAAHQcAIYB4IHgAKYQ9AHYz3WgAMgfUR0YkCDf8KVDHRgQ +ANhyCiAIjbjxpc9ygADcMgCKz3GgAOwnELgFIIAPAADCaQahAYoQuAUggA8AAAJqBqEAhkIgQIAA +pgb0z3GgAMgcANgRoYUBT/bxwOHFCiUAgM9xgABwXQARBAAw8kwkAIDPcKQAuD0A2xn0mxANBs9y +gAB0XaCiphANBs9ygAB4XaCikhANBs9ygABoXaCioxANBs9ygABsXaCimxjYAP/aphiYAJIYmACj +GJgAAdrPcKAAtA9coDfwTCQAgMoiwQfKIIEPAAB+GcojgQ8AAN4C1ACh98ohwQ/PcIAAdF1AgM9w +pAC4PZsYmADPcoAAeF1AgqYYmADPcoAAaF1AgpIYmADPcoAAbF1AgqMYmADPcIAAcCgZgM9yoAC0 +DyK4wLgcorkAb/YAGUAB4HjxwCYIT/bPcIAA2DEUgIDgi/IGDK/+B9h6cM9wgADUORCIhiD/AUO4 +YbiG4PQADQDPdoAAVLAkhs9ygACErjMmAHCAACBeQCIRCwS5NHlAIhAKQCISBkAiDwhAIg0EOmJA +JwFyFHkAec9xgABEM0hwVfDPcYAAZDMEalHwz3GAAIQzQCIAAkvwQCIAA89xgABEM+oKr/4A2gSG +z3GAAGQzBLgUeLhgO/BAIgAHz3GAAEQzygqv/gDaBIbPcYAAhDMEuBR4+GAr8EAiAAXPcYAAZDOq +Cq/+ANoEhs9xgACEMwS4FHhCcBvwQCIACc9xgABEM4oKr/4A2gSGz3GAAGQzBLgUeAJwdgqv/gDa +BIbPcYAAhDMEuBR4InBiCq/+AdoeCq/+anBZBw/24HjxwM9wgADYMQ+AgOAQ8s9wgABUsASAz3GA +ANSvArgUeDhgz3GAAKQzSgyP/tHA4H7xwN4OL/ZE2s9wgACoZs9xgADIsKYN4AQA3gLdFgggAMlw +Yb2A5QHmOvchBw/24HjxwKYOL/YA2s9xgADIHRV5YIEEuAAgkA+AADBjrxuYAACBBBAPIM92gACo +ZrQY2AOggUKGiiAHD2GGHWXIHYAQxB3AECCBRobPdYAAyLBlhjhg0BiAABYmwRPMGMAAFiXAEwTg +BOFqCG/2CNoMEAAgFn4WfQRtJG5WCG/2CNqNBg/24HjxwCIOL/YS2anBCHZWC2AHi3BKJABxANqo +IIACFiSAMCiIgeHD9mG5KKgB4gLCAcPPdYAAyB3VfQCFiiEHD/Rux3eAADBjOGDEGMAAyBiAAACF +BsIFwzhg0BiAAIPBzBjAAAQXEBDPcIAAyLAWIAAEBODaDy/2CNrjh89wgADIsIfB9ngE4MYPL/YI +2gDAIIWvGRgAIIWvEQAGUSAAgAnytBnYAyCFtREABoC4B/C0GRgEIIW1EQAGoLiWCi/9tRkYAIDg +BfRSCg/9gOAD8gDYAvAB2BB2PA3hB8oggQMAha8QAQZRIUCA8dnAKSIByiGBDwAAkwDAKSEB6ggv ++4gYQACFBS/2qcDxwCIND/bPdoAAXF2A4c91gADMBxLyIIaA4Q30AKUiCe/9DNjSDe/+iiAQAAHY +AKYO8CCFJXgL8OII7/0M2I4N7/6KIBAAANgApgClQQUP9vHAwgwP9s9xgAAcLgCBoLgAof4Lr/sB +2M9wgABMpQAQBABMJMCAyiHND8oizQfKII0PAACBDMojjQ8AANgA1ARt98ol7QBMJACAxAAuAADe +FG4AIIEPgABMpUeRBpHkkRC6RXgacAWRQ5EQuAV/ApEQukV4OnD2D+/3CnFacM9wgAAUb/AggQOz +brR9ACWAH4AAWFggoNYPL/sqcAhxACWAH4AATFjmDMAFiiDMDioLb/3n2YogDAgeC2/9SnGKIAwI +Fgtv/elxEncE94DnGPTPcIAACG/wIIEDs260fQAlgB+AAOhYIKCCDy/7SnAIcQAlgB+AANxYkgzA +Bc9wgABMpQCAAeYQdkgHxf8RBA/24H7geOB+4HjgfuB4z3GAAIgwz3CAAFQy4H8ioPwcCLTxwBpw +z3CAAFAuIIBgeQHYgeDKIcIPyiLCB8oggg8AAJ4ZyiOCDwAAoQHKJGIAtANi98olIgAKcNHA4H8E +FBA08cBiCw/2AN3PdoAADLHPcIAAUC4ggKCmYHkB2IHgyiHCD8oiwgfKIIIPAACYGcojgg8AABQB +yiRiAGgDYvfKJUIDAIaYuJm4AKYA2I64AaYD2KGuoq4OuAKmz3WAAFQuQIUG2GB6AtlAhQfYYHoC +2QKOXQMv9gCu4H7geOB+4HjxwOHFtMHPdaAAtEdxFQCWBCCAD3AAAABBKD6F9fWKIP8Pbx0YkGsd +GJA6CS/5i3AqDM/8gOAP8m8VBJZrFQWWCiHAD+tyz3AAALET1QJv9yzbfgzP+HIIQAT9Ai/2tMBA +iAHYAKFougK6VXrHcoAA2DFjgmOhYYJhoWKCYqFkgmSh4H8AouB48cBWCg/2z3CAADBbBYADgM91 +gABAlCCASYUAIoAPLQDAxgJ5gOGSACwAocHPd4AAdBwAhwHggeAApxL0AdnPdqAAyB9RHliQINgQ +pkMeWBAA2BYL4AeNuCDYEaaLcSYJL/dC2ACHQiBAgACnBvQA2c9woADIHDGgABQEMQQkvo8AABf/ +yiHCD8oiwgfKIIIPAACmE8ojIgwAAmL3yiUiAACFgriODyAAAKUqCCAAAdgAhaK4AKUphc9wgAAw +W8dxLQDAxk4KwAX1AS/2ocDgePHAXgkP9rjBz3CAAMgdA4DPd4AAWBwIgMC4QcADj0ogADBCwASP +Q8ACj0TAz3CAABAWOoAbgCR4z3GAAJBeIIExuFfBz3GAAECUYpHPcYAAuAZAkVBzwLgw9M9zgADU +OS2Lz3WAAECUhiH/ASgVjRBDuQIhQYOui2+LyiFiAIYl/xHbbc91gABAlCkVjRCGI/8BDiWNk8ol +YhC7faV5u2vPc4AAQJQqE4MADiNDg8ojYgACu2V5A/AH2YDhnAYhAEbBz3GgALRHRxEBhoDhzCAi +gIgGAQDPcIAAQJQAEAQAUSRAgMohwQ/KIsEHyiCBDwAAqhPKI4EPAADgAMwAYffKJSEAz3GAANQ5 +DYnPc4AAQJSGIP8BQ7goGwIADomGIP8BQ7gpGwIAD4nPcYAAQJRCsYYg/wFDuCoZAgAA2Z65z3Cg +ALRHUxhYgOB4ANlTGFiAIgxP/892gAB0HACGAeCB4ACmEvTPdaAAyB8B2FEdGJAg2BClAdhDHRgQ +ANgaCeAHjbgg2BGlAI/Pd6AA7CcQuAUggQ8AAEItBSCADwAAgkYmpwanz3AIAIcQBqcAhkIgQIAA +pgf0z3GgAMgcANgRoQHAz3GAAESnFnlEgWCBz3APAAD8CroEesm7ZXrPc6cAFEhNo0WBIYEKukR4 +ybkleA6jHglP/kfAAcCA4AvyiiH/D89woAC0R28YWIBrGFiAANhAwAPYSMAUHAA2CiEANgDAz3GA +AGiUCGGE4B4BKgBJwADABsERIQCA5AMBAAnAACQBMFwRgQCB4dQDIQCDcAHZXBhCAAnBz3CgALRH +YBhYgM9wgADIHQOAELmbuTIggA8AALACn7mA4AHYwHgPuCV4z3GgALRHXxkYgM9woAC0R3EQAIYE +IIAPcAAAAEEoPoX19UogACAw8IHiQKYS9M91oADIHwHYUR0YkCDYEKUB2EMdGBAA2M4PoAeNuCDY +EaULwUAsACQGuYG5JXgGpwzAQCkBJAa4gbgleAanAIZCIECAAKYG9M9xoADIHADYEaFAIFAgz3CA +AFAuIIBgeQbYEnAMAw4ACcERIQCE8vMCwQPATCAAoCJ4z3GnABRIXBkABErAF/JMIECgGfSKIMQG +iiGECBHwJBQEMAohwA/rcs9wAACrE4ojxAJtBi/3SiUAALbYvdkbcDtxQCCAMRB4S8BAIYAxEHhM +wAnAAg7v+wpxTcAJwNoM7/sKcU7AAIYB4IHgSiQAIACmE/TPdaAAyB8B2FEdGJAg2BClAdhDHRgQ +ANjeDqAHjbgg2BGlDcAFuBB4ELiBuIe4jLgGpyCGQiFBgAb0z3KgAMgcANgRokojACFqdUAoQCFP +wAohACUB4YHhYb0gphX0AdjPcaAAyB9RGRiAINgQoQHYQxkYAADYgg6gB424INjPcaAAyB8RoQTB +FW0AJRcWLyfIJSV4EHgQuIUgigAGp0AvgCGBuJe4ACVSFganLyKIJEAqgCGBuJe4BqcLwAa4gbgG +pwzABriBuAanAIZCIECAAKYH9M9xoADIHADYEaGSwJPBlMKVw8YJIAVWJMQyNsCA4Bv0TCAAoAv0 +z3CAAECUDYDPcYAAQJQB4A2hDfBMIECgC/TPcIAAQJQOgM9xgABAlAHgDqEBwIDgDPI2Do/8geAI +9ADYdsAFwIC4D3hFwAHAz3KAAESnA7gVIAAEGWIaYgyCKIESwlDAD8C2eAAglQ+AAICUE8DwHYAg +9B0AIArAiCJ8AC8mACAELr4geg0v+y9wDiCBDwAAAAFRwRPAiCB8AAQovgUvcF4NL/sQwQ4ggQ8A +AAABEcCJIccPiSDHD0ggAABIIQEANsJUHRgggeJVHVggDfQOwgfDBLoGu3pitXrHcoAAgKcCsiOy +AIYB4IHgAKYW9AHYz3GgAMgfURkYgCDYEKEB2EMZGAAA2PYMoAeNuCDYz3GgAMgfEaEHwQ7ABrkE +uDhgtXjHcIAAgKcikDx6QC+BIYG5ELpFeSanIpDAubh5BSEBBS8kSCAjkDx6QCqBIYG5ELpFeSan +A5DAuLh4QIYFIEAEQiJBgC8hCCAG9M9zoADIHADYEaNCI1MgTCMAoNwFzf+RBM//AMAB4EDACMBh +uIDg9gPt/0jAAIYB4IHgAKYT9M91oADIHwHYUR0YkCDYEKUB2EMdGBAA2EIMoAeNuCDYEaXPcAgA +hhAGpwCGQiBAgACmB/TPcaAAyBwA2BGhz3GgALQPXIEA2Byhz3CAAECUBJAQuIUghAAGp89wgABA +lAWQELiFII0ABqfPcIAAQJRngM9wpwAUSGegz3CAAECUaIDPcKcAFEhwoM9wgABAlAOAz3OkALg9 +mxsYAM9wgABAlASAphsYAM9wgABAlAWAkhsYAM9wgABAlAaAoxsYAM9zpADs/wDYBqOKIIoABqfP +cIAAcChcoRmAUSCAgLgJIgbKIGIAz3CgALRHcRAAhgQggA9wAAAAQSg+hfX1PgyP+M9wgABAlCyA +BcA4YM9xgABAlAyhD4EB4A+hRQLv9bjA4HgA2c9wgABclCyoLajgfy6o4H7geIC4z3GgAOwnBqHg +fs9wgAAHIc9xoADsJwahz3CAAEc6BqHPcIAAx1MGoc9wgADHJAahz3CAAAc+BqHPcIAAh1cGoUnZ +z3CnAIhJMKDgfuB4AdnPcKAAyBwwoEvZz3CkABxAJKDgfuB4z3EBAHA9z3CAADAuIKDPcIAALC4g +oM9wgAA0LiCgz3EBAHg9z3CAADguIKDPcQEAdD3PcIAAQC7gfyCgz3GAAECUAIGAuOB/AKHgePHA +Ygnv9bhwUyCBAM9wgAA0bihggeDKIcIPyiLCB8oggg8AAJUZyiSCDwAA/gB0ASL3yiPiB892gABQ +LiCGYHkB2IHgEfIghut1YHkB2Lhwz3AAAJYZCiHAD6lyIttFAS/3iiSDD2kB7/UB2AnZ4H8goOB4 +8cDPcIAALFsAgIXgcgAFAM9woACsLxqAUiAAAFEgAIAv9M9xgABAlAuBAeALoc9wgAA8LgCAQHiO +Ds//z3CAACguAIBAeIoKgACqCQ/+igxP/M9woAB4RQCABCCAD3AAAABBKD6F9/XPcIAAyB0jgEiB +NJFTIgAAVgmgAgHbagxv/RDY0cDgfuB+4HjxwM9wgABQLiCAYHkI2BB5z3CAAEQKBgjP9pYO4AMH +2PYLD/5GCUAAJggAANHA4H4IcViJAYCA4gKhCfRZiYDiwiCiAMAgoQACoeB+8cASCM/1z3CAAHQc +AIDPcYAAdBwB4AChgeDPdaAAyB8g3w30AdhRHRiQ8KVDHRgQANjyCKAHjbjxpcfYlLjPdqAA7CcG +ps9wAwCCKwamz3ADAMJEBqbPcAMAAiwGps9wAwBCRQamz3AAAMJ0z3EDAMJ0JqbPcQMAgm8mps9x +AwCCbCamxtmQuSamBqbwpQrYQx0YEADYjgigB4248aXPcAAAgmwGpvClCthDHRgQANhyCKAHjbjx +pc9wAAACLAam8KUK2EMdGBAA2FoIoAeNuPGlz3AAAEJFBqbwpQrYQx0YEADYPgigB4248aXPcAAA +gm8GpvClCthDHRgQANgmCKAHjbjxpc9wAACCKwam8KUK2EMdGBAA2AoIoAeNuPGlz3AAAMJEBqbw +pQrYQx0YEADY8g9gB4248aXPcBMAxgAGpvClMthDHRgQANjWD2AHjbjPcIAAdBzxpQCAz3GAAHQc +QiBAgAChBPQA2FEdGJAJB4/18cCeDq/1AdnPdqAA7CcmpoDgCPTPcIAAPC4AgEB4VvDPcKAArC8V +gFEgAIDKIcEPyiLBB8oggQ8AAH8ZyiOBDwAApwDKJMEAmAbh9solwQDPcMAAR2gGps9wEwDHAAam +z3AQAAZpBqbH2JW4BqbPd4AAdBwAhwHggeAApxD0z3WgAMgfUR1YkCDYEKVDHVgQANgeD2AHjbgg +2BGlz3AAAEItBqbPcAAAgkYGps9wAABCYAamAIdCIECAAKcG9M9xoADIHADYEaE9Bo/18cDSDY/1 +z3CAAEguIIChwWB5BNiA4DvyANgAHAQwz3WAAHQcAIUB4IHgAKUQ9AHYz3agAMgfUR4YkCDf8KZD +HhgQANieDmAHjbjxpotxsgyv9gDYAIVCIECAAKUG9M9xoADIHADYEaEAFAExz3WAAFQuhiH/DECF +QrlgegLYABQBMUCFA9hgesG5sQWv9aHA8cA+Da/1A9jPdoAASC4ghs91gAAAOGB5osGA4AbyIIZg +eQTYgOAG9McDIABIFQQQA9gacM93pwAUSM92oADsJ4ogkQUGDO/8ANnaCC/+BdgOpc9wgAB0HACA +AeCB4M9xgAB0HAChFfQB2s9woADIH1EYmIAg2TCgQxiYAADY1g1gB424INnPcKAAyB8xoAPY3guv +9qlxBNjWC6/2Im0F2M4Lr/YkbQvYxguv9iZtD9i+C6/2QCUBEjbYtguv9kAlgRI32KoLr/ZAJQET +ONiiC6/2QCWBEwiHBKUNhwWlDocGpc9wpwCYRxyAB6UXhwilFocJpc9wqwCg/xiAC6XPcKsAoP8Z +gAylz3CrAKD/GoANpc9wBQDGAwamxtiQuAamz3AsAAIBBqbPcFoAQgEGpoogiwAGps9wQACHDQam +z3DRAMINBqbPcMAABw4Gps9wgAB0HCCAgeEG9M9yoADIHADYEaIB2AinANgNpw6nz3CnAJhHz3JQ +AP8AXKAB2BenANgWp/zaz3CrAKD/WKBz2lmgGoDPcqsAoP+BuBqigeHPcIAAdBwgoBj0AdnPcKAA +yB9RGFiAINjPcaAAyB8QoQHYQxkYAADYigxgB424INnPcKAAyB8xoM9wEQAGDgami3AGCeAEgcE1 +hQDAInjPcYAAeD0gmVSFDHk2hS8gQA5CeTlhigyv9TV54LgceMAgYgABwoIgxALPcYAA9JUSpVWh +FqHPcEAAhg0Gps9wEAACDgamz3CAAHQcAIDPcYAAdBxCIECAAKEG9M9xoADIHADYEaGLcJII4ASB +wTWFAMAieAQogA8AAHQJFIU2hQJ5Hgyv9S9wT+DPcYAA9JUTpRihz3CAAHQcAIABwgHgV6GB4M9x +gAB0HAChGfQB2c9woADIH1EYWIAg2M9xoADIHxChAdhDGRgAANiaC2AHjbgg2c9woADIHzGgAZUQ +uIUghAAGpgKVELiFIIUABqYDlRC4hSCLAAamBJUQuIUgjwAGpgWVELgFIIAPAACCDQamBpUQuAUg +gA8AAMINBqYHlRC4BSCADwAAAg4Gps9wgAB0HACAz3GAAHQcQiBAgAChBvTPcaAAyBwA2BGhBIUr +hQinBYUNpwaFDqcIhRenCYUWp89wqwCg/zigLIU5oC2FOqDqDO/9DoUyhYwhgoBF9owhP4Eb9iDf +z3agAMgf8KYK2EMeGBAA2MoKYAeNuPGm/giABIog0QWyCO/8MoVCIEAggOCOBM3/BfCiCO/8iiDR +BTKFjCGCgET2jCE/gQb2igjv/IogEQtIFQQQjCSCgET2jCQ/gQ32CiHAD+tyz3AAALQZiiMFBZ0B +7/a4c4hwsQGv9aLA4HjPcIAAADjgfxOA4HjPcQEANFrPcgEABFB9BW/6ANjgeIogVwctAO/8lNng +ePHAIgmP9c9wgAAoLgCAz3WgAMgfYHgg3tClCthDHRgQANgOCmAHjbjRpWUBj/XgeFEgAIDPcoAA +aAYL8oDhUdjAKCIEyiBhBMAoIQQC8ADY4H8AovHAxgiP9c9wgABILiCAocFgeQTYgODO8gDYABwE +MM9zoADALxOD+rgO8vwTBQAKIcAP63KKIIwJiiOHBdEA7/aKJIQJEINRIACAD/T8EwUACiHAD+ty +iiDMCYojxwWxAO/2iiSECc92gAB0HACGAeCB4ACmAdkQ9M91oADIH1EdWJAg3/ClQx1YEADYTglg +B4248aWLdwDYXg9v9ulxABQFMahxhiH8D8DhyiHCD8oiwgfKIIIPAACZGcojgg8AAC8BTADi9sok +YgDPdYAAVC5AhQDYYHpGuQAUADFAhUQgAQwB2GB6RLkB2A4Pb/bpcUCFCNhgegAUATEAFAUxTCUA +gMwlYoDMJaKAyiHCD8oiwgfKIIIPAACaGcojgg8AAD4B7Aei9sokYgAC2MoOb/bpcQAUADFAhVMg +UAAE2GB6CnFMIMCgEPIAFAUxCiHAD+tyz3AAAJsZiiPFAbEHr/ZKJEAAEtiSDm/26XFAhQAUDzEF +2MG/YHrpcYPnD/IAFAUxCiHAD+tyz3AAAJwZiiOFA30Hr/ZKJEAAAIZCIECAAKYX9M9xoADIHADY +EaER8M91gABULkCFAdhgeghxQIUE2GB6A9lAhQXYYHoD2V0Hb/WhwPHA9g5P9c92gAB0HACGAeCB +4ACmAN8S9AHZz3WgAMgfUR1YkCDYEKVDHVgQANjaDyAHjbgg2BGlz3CAAAYhz3GgAOwnBqHPcIAA +RjoGoc9wgADGUwahz3CAAMYkBqHPcIAABj4Goc9wgACGVwahAIZCIECAAKYG9M9woADIHPGgz3Cn +AIhJ8KDVBk/1CNnPcIAADLHgfyOg8cBeDk/1z3aAAHQcAIYB4IHgAKYQ9AHYz3WgAMgfUR0YkCDf +8KVDHRgQANhCDyAHjbjxpc9wAADCLM9xoADsJwahz3AAAAJGBqHPcAAAwl8GoQCGQiBAgACmB/TP +caAAyBwA2BGhYQZP9eB44H7gePHAz3OgAMAvE4P6uA7y/BMFAAohwA/rcoogjAmKI4cFEQav9ook +hwkQg1EgAIAP9PwTBQAKIcAP63KKIMwJiiPHBfEFr/aKJIcJRgtv/QDYz3CAAEguIIBgeQTYgODg +CUL20cDgfuB4z3CAAMgdA4AIgM9xgAAMsVEgAIAD8gGJAvACieB/AKmA4PHAuHEN9AohwA/rcs9w +AACnGdnblQWv9ookgw/PcYAADLEggUwlAIAEIYEPAAcAAEEpAwYA2cokTXHgeOggrQPwIEUABCWC +DwEAAMAuumV6UHME9AHh0cDgfgohwA/rcs9wAACoGeLbQQWv9kokQADgePHA4cUA3c9wgABkBqYI +IACgoM9wpwAUSKigUQVP9eB48cChwbhwANhAwFMlgACB4BHyguAg8oTgJfIKIcAP63LPcAAAqxmK +I8kA7QSv9ookgw/PcIAAUC4ggGB5AdiE4AHZwHnPcAAAItI0eM9xgACr1A/wz3AAACPSz3GAAK7U +B/DPcAAAJNLPcYAAsdQp2hK68CIAAA4ggg8AAQAAQMKLcDILIAQD2qHA0cDgfuB48cA+DE/1A8iU +EAAAz3aAAHQcBCCQDwEAAMAAhgHggeBBKJAjAKYR9AHYz3WgAMgfUR0YkCDf8KVDHRgQANgWDSAH +jbjxpc9xJAAHAc9woADsJyagiiGFACagUyCBIIHhE/KC4SXyhOEz8gohwA/rcs9wAACIGYojhgWK +JIMPCQSv9golAATPcYAAyB0jgSiBUSEAgMohgg+AAMcgyiGBD4AAhyQmoM9xBABHSyTwz3GAAMgd +I4EogVEhAIDKIYIPgAAHOsohgQ+AAMc9EPDPcYAAyB0jgSiBUSEAgMohgg+AAIdTyiGBD4AAR1cm +oM9xBADHMSagAIZCIECAAKYH9M9xoADIHADYEaGZA0/14HjxwKHBz3GAAMgdI4EvKAEAKIHAuQAh +gw8AACLSTiCBBynYErjwIMAAz3KAAKvUNHlZYUDAi3DeCSAEA9qhwNHA4H7gePHA4cW4cM9wLAAG +Ac9yoADsJwaiz3GrAKD/GoFTJY0AgeUA2xHyguU28oTlWvIKIcAP63LPcAAAgRmKI0UF9QKv9ook +gw/Pc4AAyB1jg2iDUSMAgAnyz3OAAMYgZqLPcwMAwgII8M9zgACGJGaiz3MCAMICZqLPcwQARktm +os9zSABCAWaiAdvPcqcAFEh3ooG4TfDPdYAAyB2jhaiFUSUAkAryz3WAAAY6pqLPdQMAggIJ8M91 +gADGPaaiz3UCAIICpqLPdQQAxjGmos91SgBCAaaiz3KnABRId6KAuCfwz3CAAMgdA4AIgFEgAIAK +8s9wgACGUwaiz3ADAIICCfDPcIAARlcGos9wAgCCAgaiz3AEAMYxBqLPcEwAQgEGos9wpwAUSHeg +P9gaoTkCT/XxwL4JT/UDyJQQAAAB3s91pwAUSMilBCCGDwEAAMC2Du//QS6AA//Ym7jPd6cAmEcc +p4ogEg2SCK/8QS6BA89xgABkBgCBgODKIcIPyiLCB8oggg8AAKwZyiOCDwAANwLKJCIAnAGi9sol +AgEA2Bal2qe1AW/1wKHxwEIJT/XPcKYAnD8ZgFEgAIBZ8s91gADIHSSFG4EvKAEATiCQB0Eo0CBM +IICgB/ds4TIhAASA4A/0CiHAD+tyz3AAAK0ZiiOJCIokgw89Aa/2CiUABM92gACg1EAmwBI+CC/3 +CdkA2IIPb/8PIAAEgOAA2A8gAAQE9P4Lz/8E8JYNz/8DyCSFuRCAAFThG3iAuAquACEABBiIjCDD +jwJxBPJhuA94GKmKIFINANmiD2/8DyEBBCSFG4EodIAkFRwApJYLz//hAE/14HjxwM9wgABQLiCA +YHkB2IHgyiHCD8oiwgfKIIIPAACdGcojgg8AAIgByiRiAJAAovbKJSIAz3EqKhUVz3CAAEhbIKDR +wOB+4HjxwCoIT/U6cBt9z3CmAJw/ZBAQAFEgAKAo9APeEfDgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HjgeOB44HjgeGG+jCb/n+31Yb2MJf+f3/UKIcAP63LPcAAApChO2wokQAQVAK/2CiUABCEAT/Xx +wMYPD/XPcaAArC86gVIhAQBRIQCAWfSA4M91gAB0HCnylg9P/wCFAeCB4AClEfQB2M92oADIH1Ee +GJAg3/CmQx4YEADYkgggB4248abPcQYAAnXPcKAA7CcmoACFQiBAgAClCfTPcaAAyBwA2BGhA/A6 +CQAAAIUB4IHgAKUR9AHYz3agAMgfUR4YkCDf8KZDHhgQANhCCCAHjbjxps9wgADIHQOAz3GgAOwn +DoCAuAahAIVCIECAAKUH9M9xoADIHADYEaFpBw/14HjxwP4OD/XPcIAAKC4AgM91oADIH2B4IN7Q +pQXYQx0YEADY6g/gBo240aXPc6AAwC8Tg/q4DvL8EwUACiHAD+tyiiCMCYojhwX1Bm/2iiTCCBCD +USAAgA/0/BMFAAohwA/rcoogzAmKI8cF1QZv9ookwghuCAAAz3CAAEguIIBgeQPYgOAICUIEz3CA +AHAoGYBRIICAC/LPcYAAyB1NgT6RUyIAADoP4AEB28EGD/XgePHA4cXPdYAA+DcAhVEgAIAM9BIJ +gAPGD4/7Jg+P+LYNz/8AhYC4AKWZBg/18cDPc6AAwC8Tg/q4DvL8EwUACiHAD+tyiiCMCYojhwVB +Bm/2iiQCDhCDUSAAgA/0/BMFAAohwA/rcoogzAmKI8cFIQZv9ookAg6OD8//z3CAAEguIIBgeQTY +gOAF8mYNT/8OCAAA0cDgfuB48cC2DQ/1z3WAAPg3AIVRIECAGvTPcIAASC4ggGB5BNiA4BLybgmv +/QfYKg1v/wh2zgwABM4JD/+CCK/9yXAAhYG4AKXdBQ/14H7gePHAZg0v9YogBwbPdoAAFBheDG/8 +IIYV3c93gADEEACG6XFSaAHgAKZUelhhAoCA4FlhEvLPcqAALCBQgkJ413BJawDSANvI92KhiiDH +BSIMb/wgiQCGquCD9wDYAKZhvYDlvgfN/2kFD/XgePHAz3CAADgPDtkB2v4KIAAA289wgABwDwnZ +AdruCiAASHPPcIAAZA4q2QDa3gogAADbz3CAAAwPC9kA2s4KIAAB29HA4H7gePHA4cXPdYAAXjiK +IEcGrgtv/CCNBNhqDa/7AdnPcIAAXTgAiLILIAAgjQEFD/XgePHAz3GAAF44iiDHBn4Lb/wgic9w +gACAXbIMwATRwOB+gODxwNhxC/QCCQAAANkioIogxwVWC2/8yHHRwOB+4HjxwEYMD/XCCg/8z3aA +ACgHZtgibgHaJgvv/EhzgOAM9AohwA/rcs9wAAC2FNnbiiSBCTzwAhYFEUwlAIDMJYKPAAD//wz0 +CiHAD+tyz3AAALcU3NsxBG/2iiSBCWfYyXEB2toK7/xIc4DgDPQKIcAP63LPcAAAuBTf24okwQkW +8AGWJG4B2gHgEHiyCu/8SHOA4KGWDvQKIcAP63LPcAAAuRTi20AlRBDdA2/2SiUAAAJtEHgmbgHa +ggrv/EhzgOAM9AohwA/rcqGWz3AAALoU5dtAJYQQ6vHZAw/1z3GgAGAdErEUkeB+geDxwLhxHPRM +JQCAxPZMJYCDzPYKIcAP63Kn2AW4m9t9A2/2SiQAAEAtgAAUeEIgAQPPcIAA5A8ZYR/wz3CAAPQT +MiBAAYwgw4/KIcEPyiLBB8oggQ8AAOEUyiOBDwAAoQA8A2H2yiQhAAK4FHgAIIEPgADEEChw0cDg +fui4CPIEIL6PAAAAGAHYA/QA2OB/AKngePHAxgoP9c91gAC6BgCNz3eAALgGWg/v/yCPQYjPdoAA +ZDjjuiCXB/IB2ACuiiDHA03wAoCA4AbyANgArpC5RfBRIgCBM/LPcoAAvCAaihBxLfQAlXiKcHAp +9M9wgAC8BgCIVooQciP0z3CAAMgdDoBRIECBG/LPcIAAYDhAgIDiANsO8s9woAAsIBCAQnjXcDEB +AC1E9wHaQK4E8GCuANoQuoogRwNFeRHwz3CAAHgcAIiA4AbyAdgAroogBwMH8ADYAK6RuYogBwQG +CU/8YQIv9QCO8cDaCQ/1ocEacDpygOFodsgALAAA2JpxFSANIM9xgAAoBwAVkxACFZIQunDjjSGR +AY0B2jhgEHiLcbII7/xIc4DgE/IAFAAxTCEAoEAqgiAEIIEPAAAA/0e5VHoY8sdygADkDxfwz3CA +ACgHwZChjQohwA/rcs9wAAC7FIojhAAAJkQTsQFv9golQAXHcoAAxBCA5gAawgQD8gKqAvABqlEg +AIAT8oDmDPIDioC4A6oSbxR4G2Jji1hggbtjqOSqgOYE8iaqA/AlqkIkQSCA4UYH7f9AJUAgUQEv +9aHA4HjhxVMgDQCgqQQggQ8ABgAAQiEBgAQggA9AAAAAyiFiACCq13BAAAAAAdjAeACr4H/BxeB4 +gODxwA/0gg3P/89xoAAsIDCBx3FJawDSIqDODy/8iiCHBdHA4H7gePHAuggv9dhxCiaAkIh1zCMi +gAbyQiYGAS8mhwFCDe//yHGA5s9xgAAkBwChJvIkiAK5NHlDiAPhUSIAgAIQhQAP9AohwA/rcs9w +AADiFIojSAVKJAAApQBv9golgAEIYVEgQIAM9AohwA/rcs9wAADjFIojSAbv8QEQhQBRJQCAyiHB +D8oggQ8AAOQUyiOBDwAAJwLKIsEH3fPhvdElIoHKIcIPyiLCB8oggg8AAOUUyiOCDwAALgJAAGL2 +yiSCAVElAJAT8lElwIDKIcEPyiLBB8oggQ8AAOYUyiOBDwAANQIYAGH2yiSBAT0AD/XgePHAvg/P +9KHBCHYodxpyAN3PcKAAtA9wEBEAiiDHALIOL/zJcc9woAC0D7ygi3FAJEIwQCSDMIIO7//pcEwg +AKAE9EokAAAK8M9wgABknwGIgOD59UokgAAgwAEUgjDJcbIO7/8CFIMwz3CAAF44AIiA4MwmApAL +8s9wgAAkBwCAoqDPcIAAXDigqOW/FvLPcYAAvCAaiRB2EPQYiVMnAhAQcgz0BCePHwAGAACA5wHa +FonAehByDvLPcIAAeRygqM9wgABgOKCgz3CAAGQ4oKiKIMcA+g0v/Mlxz3GgALQPcBlABDkH7/Sh +wOB48cDPcYAAdD2KIIcB1g0v/CCBZgnP/89wgAC4BgCQgOD0C8L/0cDgfvHAcgrP/7YJz//CCEAG ++ggP/boMQAHRwOB+4HjxwOHFz3CAAGQ4AIiA4BL0wgvP/4DgDvSKIEcEAN2CDS/8qXGQ2ZC5A8ig +GEAAGPDPcIAAEBgAiIDgEfLPcKAAAAQsiIwhAoAA3Qn0Ug0v/IoghwSR2ZC56PEB3bEG7/SpcOB4 +z3GAAMgd8CEBACgRgAAogV0G7/8A2uB48cAaDs/0CHfPcoAAvCDPdoAAuAYAlnqKEHPPcYAAeBwU +9M9wgAC6BgCQeIoQcw70z3CAALwGAIhWihByBvTPcIAAeRwAiAPwANgOC+//AKnPcIAAvAZAiM9x +gAC6BgCJII6A4gHawHrpcwDd+gzv/5h1z3CAACQHAIABiM9ygAAQGFEgAIEglgbyAdgAqoogRwMF +8KCqiiCHA4oMD/zlBc/04HjPcYAAvCDPcIAAuAYAkFqJEHIY9M9wgAC6BgCQWIkQchD0z3CAALwG +AIg2iRBxCvTPcIAAeBwgiM9wgAB5HCCo4H7gePHAMg3P9M92gAC8pRSOgeAS9ATY6g1v+wHZz3CA +ALoGAIjPcYAAuAYuDO//IIkA2BSuNvC2joDlMvLPd4AAXDgAj2G4EHUZ8moIz//PcIAAEM4FgCFt +BSh+AM9wgACAXY4NoAQvcYoghwbPcYAAuAbKCy/8IJHPcIAAugYgkM9wgABdOKCvIKjPcIAAuAYg +kM9wgABeOCCoANgWrjWOgOEJ8s9wgAC6BioI7/8AiADYFa7pBO/0AdjPcKAALCAwgM9wgABgOOB/ +IKDgePHA5g+v/+HFz3CAAOQdEIiE4M91gABknwv0iiAPClILL/yKIQoEAo16CCAAIYUCjSGFcgzv +/wHapQTP9M9xAACt3i0DL/yKIIcJ4HjxwBYMz/TPcIAAyB08EJAArYCKIAcCDgsv/ApxUyUAEKII +7/8KcQGIUSAAgcohwg/KIsIHyiCCDwAA6BTKI4IPAABdA8okIgAUBCL2yiUCBCkEz/TxwMIL7/TY +caHBGnCLcUAkQjBAJIMwogrv/8hwARSAMIDgCvICFIAwgOAG8kIgECEvIAckIMA6CO//CnEBFIEw +gOEE8qKIA/ChiIogxwGCCi/8yHFAKAAmQC0CFAV6ARSAMAIUgTAIuAV6iiDHAWIKL/xFeeG90SXi +kAXyUSUAkQ/yCiHAD+tyz3AAAOcUiiPNAUokAAB1Ay/2CiUABIkD7/ShwPHAGgvP9KHBGnAA3s9w +oAC0D3AQEQDPcKAAtA/coIogRwEKCi/8CnGEKAgoACGNf4AA3KAk8EAlABcWIIQDBRSAAIYg/ocb +8gSFi3FAJIMwQCRPML4J7//pcqgVABDqD6//6XEgwAQUgQABFIIwAhSDMP4J7/9KJMAAAeYMlRB2 +tgfF/4ogRwGiCS/8CnHPcaAAtA9wGUAE4QLv9KHA4HjxwHYKz/ShwQh3GnE6cgDez3CgALQPcBAS +AM9woAC0D9ygo4+KIAcBYgkv/KlxBJeLcUAkgzCA4AHYwHgvJwAABYcyCe//QCRCMAqHWg+v/0Ak +QTCA5db38CCAIxQhjCMgjAEUgjDAuAUgwAEvJAcAIMBeCe//AhSDMAHmsXau94ogBwEGCS/8qXHP +caAAtA9wGYAEPQLv9KHA4HjxwA4Lz/86CwAG0cDgfuB48cDaCc/0z3KAAMgdAILPcYAAcLC6EAAG +JbhTIACACqEA2AWhDaFX8gOCGIiE4FPyiiBJBqoIL/yKIYoGz3CgALAfO4CKIAkGlggv/Da5z3WA +ALRZAIVCIACAyiBiAIHgGPS+CaAEqXDPdoAAhFkAhkIgAIDKIGIAgOAM9IogCgFeCC/8iiFKCclw +CgqgBCKFz3WAAMxZAIVCIACAyiBiAIHgGfR6CaAEqXDPdoAAnFkAhkIgAIDKIGIAgOAL9IogCgEe +CC/8iiGKDMlwxgmgBCKFdQHP9OB44cUA289ygAAcsRQiDQBgtWi1GmIgGsIAwB3EECgawgDPcYAA +yLAWeSKRMBrCANAdxBCAHdwQeB1EEAHZiBpCAM9xgAC8sRV5YKHgHcQQ8B3EEOB/wcXgeAvIkLgL +GhgwoQeP+/HAzgxv/A/YgOA29M9xgAC8IM9wgAC4BgCQWokQciX0z3CAALoGAJBYiRByHfTPcIAA +vAYAiDaJEHEX9M9wgAAcLgCAgOAV9HoNj/uA4AvIxSCCDwEAAPwJ9AUggA8AAAA8CxoYMAvIkLgL +GhgwMg+P+wTwmgqP9dHA4H4A2Zy5z3CgAKwvPaDgfuB4jQGP+89xgAB8OhCJgODF9mG4D3gQqeB+ +ocHxwOHFrMEA2UrBkNkYuUjBz3OAAAyxIIMEII0PAQAAwIYh/gMkuQ65CyVAkE7AjsIW8td1AAAA +QMwlgp8AAACAzCWCnwEAAAAE9CGDA/Aig664r7iwuAV5IKIOwwjAi3UEI4EPAQAAwC65QCkCBkV4 +SMCKIAYGScBBw6lwTgkgAADaz3GAABAWGoE7gSR4USAAghHyCsALwYQoBA4AIYB/gAAw0gK5COA0 +eSFgz3CnAIhJL6CuDeAEqXAI3LMHr/SswKHB8cAyD6/0CHKtwQjYSsCQ2Bi4ScDPcIAADLGggAQh +jg8BAADAhiX+EyS9Dr0LJkCTUMGQwxby13YAAABAzCaCnwAAAIDMJoKfAQAAAAT0AYAD8AKArrmv +ubC5JXgAoxDDCcUEI4EPAQAAwC65QCkABua6BX1JxQ3yCsAEI76PAAAAGEUgwABKwAXyhSAQAUrA +5LoQ8pu9z3CgACwgBYAA2wK4briA4MogzADJuKV4ScAG8Oi6BPKdvUnFEMCBxULARgggAKlwA8gM +ws9xgAAQFrkYggAagTuBJHhRIACCC/ICus9wgAA40lR6QWDPcKcAiEkvoKoM4ASpcAjcpwav9K3A +8cAuDq/0mHEhgKPBQMHpuQDbaqA08gQhgg8BAADALrrPc4AA6GFKY0kiggBhukugcmp0e8dzgAAo +06qDz3aAAKSypqBrg891gADIHWWgo4Ugw7SF1Y5kfcR9Cb1ALA4CxX0EIYEPAAAAEKV7ZXknoCiA +GOKeuSigS6CO8FEigIIc8s9ygACgW0CCQcJRIgCCQsIiww/yz3KAAPBhamKB4sn2guIF9AbaYcIB +wiHwB9r88WHDAcId8M9ygADIHaSCMCWCHwAAdAWG4hH0BCG+jwAAABgL9EiFBCK+jwAGAAAF8gHd +qqAocgTwaqAocgDd6Lkn8kLCIsOg48onwhDKJyEQBCKODwEAAMBBLoYTz3aAAPBha2YEIoIPBgAA +ADG6ACLFAM9ygADoYTIiggECIkIBFieDEGugIMJOZhXwUyLDAH17z3aAAEBma2YEIoIPAQAAwC66 +z3aAAOhhSmZhulZ7a6AB3oQtBB4AIYJ/gAAw0gK7dHtlYmG+emKmoEGCBCGBD+8AAN0mucV5UiHB +A0WgJ6DPcoAADLFDghEiAIEA2Q7yz3KAAMBbQILgugryhiJ/D116QCrBAwTwANmPuUiAJXpIoNEE +r/SjwPHAZgyP9M91gABgLgCFxJDJcC4JoACGIPwDAIXJcVIJYACGIfwDmuDPc4AA6LIF9CGDgLkh +o0qDAeJKo89zoADEJ5ETAYbDuVBxDfSKJQgQExtYg5ETAYbDuVBxA/ISG1iDcQSP9OB48cD+C4/0 +z3WgAMQnUhUAlhUVAJZRIMCAyiZiFAb0USDAxgDeyiaiFEIVAJaA5hf0BCC+jwDAAAAJ8s9xgABs +sgGxAJEODO/9NJHPcAAA/38THRiQG9gWHRiQz3CgADAQTYCA4s9xgACIOx7yCoEB4AqhCIFYYAih +z3CAAHgcAdpAqM9wgABssh+A7rgG8s9wgABMBkCgCPDvuAbyz3CAAFAGQKChFQKWCYGA5lhgCaEO +9M9ygABssh+C8LgI8pTYSg1gAqgSAQBWDUAGnQOv9Mlw4HjxwOHFocFyC6/7i3CA4Df0ABQFMFEl +AIAM8oYIAADPcYAAbLJDgc9xgAB4pkGhJ/BRJYCABPL6Ds//IfBRJUCCBPKGDs//G/BRJcCAHPII +2M91oADEJxMdGJCGDsAAlOAN8gLYPB0AkM9wgABssiOAz3CAAHimIaAZ2JngxfMhA6/0ocAKIcAP +63IX2Iy4iiOGC9kC7/WKJIMP4HjxwOHFz3CAAGyyP4AEIYEP//+POAQlgF8AAHDHJXjPcYAAbLIf +oUQiAFOI4M91gABssgDZCPRRJUDRBvIB2JwdABAF8JwdQBAA2IDgevLPcKAAqCAIgFElgNMH8s9w +gAAcHgWIDfBRJcDTB/LPcIAAlCMJiAXwA4X2CO/1JIWYHQIQH4VRIACBB/RRJcDSBfSA2JgdAhCY +FYAQUSDAgUAoAQYJ9FEigNOCuQ7yBglAAhrwH4VRIoDTs7gfpcUhgg8AAAAHRSEABs9xgAD4siyJ +hiH9D1IhwQFFuSV4z3GgAIgkEKGKINYAz3GgAMQnfhkYgM9woADUCwHaUqAE2BAZGIDPdYAAbLIf +hVEggIEl8hSVUSBAgSH0z3CgACwgD4CA4Bv0rXFyD2/5ViVAFYAVABCUuIAdABAfhZC4H6UN8M9x +gAAMOw+BAeAPoRDZz3CgAJAjPaCtAa/0GdjxwCoJr/QA2Qh2AYDBuIPgyiBBIAXyXg4gAMlwGnBM +IACgx/QQhlEggIHD8hCGz3WAAGyy7rgH8s9wgAAcHgWIDfAQhu+4B/LPcIAAlCMJiAXwBYYmhr4P +j/WYHQIQgBUAEAQgvo8QcAAAB/Stcc4Ob/lWJUAVEYbPcYAA5AYAoUEoAQNTIcUAmBWBEEEoBgVR +IcCBFGkFIEQBBvIehZW4HqV88KoIr/tPJEACkODsAAYAz3GAAPSamBWDEPAhAQBAKwIGhiP9D1Ij +wwFFu2V6z3OgAMQnQRuYgADajLoCJk8A+mLLutdyAAAACEAtDwOQv1L3BSePEWIb2IOMIgKAx/fP +cYAAgDwHgQHgB6EA2Z25RvDleWIbWIDXcgAAwA9SAA4ADiKDDwAAABDPcoAAVJoWeqDjIIIEEgUA +T/cA2A8gwABhuE4jDwgBKcIDeHkFeQAtwAAFehbwQiMDCADYDyDAAGG4eHkFIQIAiiH/Dwrwz3OA +AIA8CIOKIf8PKHIB4AijAdjPc4AA7KYAqwIbBAEho0KjvfEA2Zy5gBUAECV4gB0AEEAmABKgHQAQ +AtnPcKAA9CYjoCWGz3CAAHimIaDNB2/0CnDxwFYPT/QIdlUgUAQNzKLB7bjRIGKAB/IEyFoPr/+Y +EAAAz3CAAOiyDIDPcaAAyB9k4B6hENgOoQHYFRkYgAGGgOAF9FEjAMD78wGGwbiD4OX0ABAAIEHA +BBQAMUEoEQMQhlEggIEGFBMxQvINzOu4QPIQhs93gABssu64BvLPcIAAHB4FiA7wEIbvuAbyz3CA +AJQjCYgG8AWGJoauDY/1USDAgZgfAhAB3QvyHocA3ZW4HqeKIAUJtg2v+6lxmBeAEM9xgAA0pwS4 +RpEFIEAEUHAJ8s9ygAAEPB2CAN0B4B2iBJHXcAAA//8P9ADdDfDPcIAADDstgADdAeEtoHINr/uK +IAUMAZac4In0BBASIAgQDyDPcKAA9CYC2SOgI4bPcIAAeKYhoIILIADJcIDggfSA5STyz3KgAMQs +HBqABM9xgAD4suiiLIlAKQMjELmfuWV5QSsDIWV5JqINEgE367kO8hDaq7kMGpwwDRpcMM9ygAAE +PCSCAeEkog0SATfsuQbyGtisuQ0aXDCA5VPyz3WAAFyT4BUDEEWGRCs+BwAlQR5AoUyWAeNCsc9y +gAD4ssyK4B3AEM9ygAA0p8ipCRlCBAoZxAQMGYAERJLkoUApAyMQvkErDSHFe6V7SrHPdaAAwC9H +HdiQlOLAIoYPAACTAM9zoABoLPAjggBLsY8VA5YI8KMVApaPFQOWUSIAgQf057v58wbwCNgL8Oe7 +yiMhAEDDARSCMMa7xrpYqXmpfQVv9KLA8cDhxc9xgADIHSOBSIFRIgCAK/KGIP8Bz3KAAOhhQ7gK +YgDbgOLKIcEPyiLBB8og4QfPICEDyiOBDwAAbgDKJMEAMAWh9colIQCB4s9wqgAMULmBxveAvbmh +AdkloAXwoL25oWWgQQVP9OB48cDGDE/0CHUNzFMgQIAH8gTIvgyv/5gQAAABhcG4g+DKJiEQBfLi +CSAAqXAIdoDmUPQQhVEggIED9ADZPfAMzFEgwIAu8g3MUyBAgBUSAjYR9AAigA+AAKSxAdkgqM9w +gADUORKIUSAAgKQLogTKIEIAENgMGhwwz3GAAIg7FIEB4BShA8gVEgE2hBACAc9wgACYsTV4KYBZ +YSmgGt7P8c9wgAAMOy2AAeEtoB4Lr/uKIMUJAdnPcIAAeBwB2kCoz3CAAOiyToAGggHgBqID8AHZ +AtrPcKAA9CZDoEOFz3CAAHimgOFBoBwKQgNFBG/0yXDgeM9zgABsslgTgQCA4QDaD/Q8k2K5ELlF +IUMBz3GgAPQmY6HPcYAAeKZBoekAAADgePHAogtP9Ah2AYDBuIPgAN0F8tIIIADJcAh1gOU29BCG +USCAgSbyDMzPcoAAkDpRIECBF/JA2AwaHDBSEgAGz3GAAByxAeBSGhgAFcgA2hR5A8hAqVYLr/+Y +EAAACvCsEgEAAeGsGkAAPgqv+4ogBQrPcIAAeBwB2SCoz3CAAOiyLoAGgQHgBqEC2c9woAD0JiOg +I4bPcIAAeKYhoHEDb/SpcOB44H8I2PHA+gpP9Ah1KHYklfIJr/uKIMQLAZVBLgERw7nPcoAAlGk2 +eiGCBOAwcAjYBPQggmB5qXAxA0/0z3GAAOiyLIHPcqAAyB9k4T6iENkuogHZFRpYgCGAgOEE9FEj +AMD88yGAwbmD4RD0z3CAAHgcAdkgqM9wgADosi6ABoEB4AahANkN8CGAUSEAgADZyiHhBQGAUSBA +gMohoQTgfyhw4HjxwFoKT/TPdYAA6LIBhQQgvo8AcAAAWvIvKQEAz3CAAKA49CBOACuFTyaAEDoM +IAJJhYDgD/SMJgOQz3GAAPw8BfQUgQHgFKFA8BOBAeAToTzwAYX+uDPyz3WAANQ5EI0ujRBxMPIS +jVEgwIAs9DCtMgmgBALYUSAAwx30HghAAxCNhiD/AUO4ELhPIMEGz3CAAMgdA4AyIIAPAACwAp+5 +gOAB2MB4D7gleM9xoAD8RA2hEo2EuBKtBvAA2c9wgADspiCotgsABv0BT/TxwIoJT/QIdgGAwbiD +4ADfEvSA5891gABsskn0EIZRIICBO/IQhu64C/LPcIAAHB4FiBPwmg7v/8lwCHfr8RCG77gH8s9w +gACUIwmIBfAFhiaGHgiP9VEgwIGYHQIQCPIehZW4HqUfhZe4H6WAFQAQBCC+jxBwAAAP9Jy4gB0A +EDCGFg8v+VYlQBVAJgASoB0AEADYBbYB2c9wgAB4HCCotBUBEAaBAeAGoVgVgBCA4Bn0og0P+4Dg +BfIQhu24AdgC9ADYz3GAAM6y9CEAADyVOGBiuBC4gLjPcaAA9CYDoQbwAtnPcKAA9CYjoCWGz3CA +AHimIaD9AG/06XDxwIoIb/QA2Qh2AYDBuIPgyiBBIAXyvg3v/8lwGnDPcKAALCAGgBB4TCAAoM91 +gABsssonIhBQ9DCGUSGAgTLyPJUwcMj2JYbPcIAAeKYCgBBxVvQQhu64BvLPcIAAHB4FiA7wEIbv +uAbyz3CAAJQjCYgG8AWGJob6Dk/1mB0CEIAVABAEIL6PEHAAAAr0ygwP+4DgMvIQhu24MPIB3wTw +AN8Q8DCG9g0v+VYlQBWAFQAQnriAHQAQQCYAEqAdABAB2c9wgAB4HCCotBUBEAaBAeAGoVgVgRCA +4c9woAD0Jhv0z3GAAM6yXJX0IcEDWWFiuRC5gLkS8ADf1vG0FQEQC4EB4AuhtBUBEIogRQuKDm/7 +K4HG8QLZI6Alhs9wgAB4piGgyQcv9Apw4HjxwGYPD/TPcKAAqCAIgFElgNPPdoAAbLIG8s9wgAAc +HgWIDvBRJcDTBvLPcIAAlCMJiAbwA4YSDm/1JIaYHgIQH4ZRIACBC/RRJUDTB/RRJUDSBfSA2Jge +AhCYFoAQ57gL8l+GPoazupW5l7o+pl+mANkB3RbwnBYBEIHhEPQ/hlEhQILPcYAAyB0jgSmBBfJE +IQ0EBfBEIQ0CA/AB3QTZGLgleM9xoACIJBChH4ZRIICBHPIUllEgQIEY9HoIgAKA4BT0z3CgACwg +D4CA4AbyDcxRIMCBCvIfhpC4H6atcY4ML/lWJkAVgOUc9FEigNME8poNwAEW8EQiPtPPcYAAbLIQ +9AGBUSAAgAzymBGAAM9xgAAQxgW4AGH+uHAMgvvPcKAAUAyggM9woACQIwTZPaDPdoAAbLIfhvO4 +BfQPhoDgANgh8k1xIg1v+4ogRA43hooWAhG5YQTiUSCAxAX0USEAxvvzz3OAAGyyihMAAU8TjQDP +c4AAyB1jg0J5oniaCK/7T5NNBg/04HjxwOHFocEA2EDAz3GAAAw7D4EB4A+hA9nPcKAA1AsxoOB4 +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4MaAQ2M91oADEJxAdGJDaDS/7i3CA4Bj0ABQF +MFElgIAM9AohwA/rcg3YjLiKI58NqQVv9Yokgw8E2RMdWJAb2RYdWJDJBS/0ocDgePHAz3CAAMSm +mgzv9RjZz3CAANyWjgzv9RjZ0cDgfuB48cAmDQ/0GnDPdaAA1AsQhQDegeChwUDGDvIKIcAP63IP +2Iy4iiOWC4okgw9BBW/1CiUABM9xoAD8RBmBBCC+jwAACCAC9B2BTCDApAfyLg0v+4twgODKIAIg +QiDBIJThTAENADImQXCAAABeQCcAcjR4AHjPcIAA6LIugAiBAeBGC+AACKER8M9wgADosi6AB4EB +4AehCfDPcIAA6LIugAyBAeAMoQDZKHAv8M9wgADosi6AAoEB4AKhJfDPcYAAiDsCgQHgAqEd8M9w +gADosi6AA4EB4AOhAdkA2BXwz3GAAIA8D4EB4A+hjgtgBAHY1grAANnxz3GAAIA8CYEB4AmhAdgI +cYDh3AqCAM9wgABssh+A87gK8s9wgABImsuoz3CAAHyXzLAD2BGl4HjgeOB44HjgeOB44HjgeOB4 +4HjgeOB44HjgeOB44HgRpT0EL/ShwM9xnwC4/xiBkLgYoRiBsLgYoc9wgADosi6ABYEB4E4IIAAF +ocXxz3CAAOiyLoAEgQHgOgggAAShu/HPcIAA6LIugBGBAeARobPxz3GAAIg7C4EB4Auhf/EKIcAP +63JB2Iy4iiPYCzjx8cBuCw/0z3CAAOiyDIDPdaAAyB8Q3gHfZOAepc6lFR3Yk14M4AUJ2APYHqXO +pRUd2JPPcKAADCQHgIDgBPJRIwDA+fORAw/08cDhxc9xgADIHSOBKYFRIUCAyiCiACv0RLjPcYAA +kDjDuAlh4LkF8lElgNEc9FEhQIAc8s91gADIHQOFGIiB4A/yrg/P+oDgB/LPcIAAXCMUiIfgBfID +hRiIguAG9FElgNEE8gHYA/AA2DUDD/TgePHAsgoP9EQiEFNNdoYm/BNNcE1wBCWAXwAAACBBKH6D +BfJeD8/6gOAD9ADfAvAB3891gABssh+F8bgE8gDdpPBMIACg/PU6D8/6gOAe8s9wgABcIxSIh+DM +IGKCFvQBhYwg/48S9CSVz3AAAP//EHEM9AWFjCD/jwj0DJXXcAAA///KJWEQgPLPcIAAyB3wIMED +CYFRIECBBfLPcIAAwGIE8M9wgADMYjiJKmBBLgARz3GAANhiCGEWes9wgAAUakhg4LgF8j+FhiH2 +jxfy4bgF8j+FUSGAghHy4rgE8lElANIE8gHdDPDjuAnyz3GgAAwkMYGMIf+P9vMA3VEggIHKJSIQ +eg7P+oDgCPIEJb7fAAAAIsolYhCA5Sjyz3GAAGyyH4HouA/yjCYCkMwmgp8AAFAAzCaCnwAA0AAD +9JO4H6HPcIAAyB0CgLgQAAaA4BryjCYCkMwmgp8AAFAAFPRPgUV4D6EP8M9wgADIHQOACYDhuAf0 +jCYCkAb0USCAgQLyAt2RAS/0qXDgePHAHgkv9IDbosEA3c9xgABssr6hv6GvoU8ZQgOAGUADjBlE +A5gZwgCEGUADz3KgAMgfpBIAAPgSDgCsGUADQhlEA8J4sBkAAM9wgADYk7mgz3CAACSzoKAE3s9w +gADkBsCgmRGAAKC4mRkCAM9woADEJ2QYWIPPdgAA/38TGJiDG94WGJiDGhhYg4on/x/PdqAA/ET9 +pvmmiieYHc92oABQDOKmcaJwojwYQIOKIxgIbqKAEgMApBlAA1EjQIDPc4AAeKZYGUIDDPJCEACG +BCC+jwDAAAAG8gGDgOAC8gKjoaOAGkADUSGAw89zgACQOs9wgADIHUOAGPIfgYu4H6FVI8AFtBkA +AArYHLEbkpYZBACKIEQLHg8v+wDZBtnPcKAAyBwpoBDwQCMAA7QZAAAQ2ByxGpKWGQQAiiCEC/YO +L/sA2c9xoADUCxCBgeAO9AohwA/rcgvYjLiKI5UDiiSDDw0Ab/W4cwHdsKFRIEDGggIhAMol4RDP +d4AAbLK0FwEQAIEB4ACh+tj2C6/7ANkg2M92gABEs0YMIAQApgHYz3KgAMgfE6IYgnmCANlUEgQA ++BICAAIggIABpgDYAyNDAFAfBBBSHwQQVB8EEAIkgQDPcIAAyB1ipkOAI6YUkkAmEBXPcaUACAwJ +tgiCwLgItgARBABTJEUBUyRBAEwfQhGD4cohwQ/KIsEHyiBhBcojgQ8AALwMVAch9c8gIQMEJIEP +AAAA4C25f4eaH0IQ67sUHgARDfIEuYG5JXgItgfYCPAA2RUgDCAgpALwBNgB4IjguPcIguu4iA0C +Bh+HK7hTIBAAUSCAxa7yz3GAAHAoG4EB4A94G6FBKYBDz3GAAHAoW4HPcaAAtA83gcC4MHIA3Qj0 +z3GgAKggJoGMIYOOxPcD3aXwEnAE8gTdofDPcoAARLNlgs92pACQQfWGFoYEI4MPAAAA4C274Lvn +os9xgABssgiiBPJQGcQDCfBQGUQDBCePH///AADnouG7BfIwv1IZxAMF8FIZRAPwf+eiUSOAgAXy +VBkEAAjwVBlEAwQggA///wAACKINhgaiBCCADwAAAP4puFYZBAAfgeu4JPLPcKoAAAQEgAmiz3CA +ANyWYIiA46RoN/KA42QALgACEIQAn3MA2KggwAP0JQ8QFd4TvvAmzxPPdoAARLIVfgHg4KYe8M9w +gADEpmCIgOOkaBnyAhCEAIDjyiTNcMogLQDoIK0D9CUPECneEr7wJs8Tz3aAAESyFX4B4OCmYaoC +GgIBtBEBAALdAYEB4AGhF/AEIL7PYAAAAAj0iiCFB2IML/sMEgE3avFRIwDAB/KKIMUHTgwv+wDZ +XPGB5TvzguUW9ALdBCC+z4ABAADKJaIRBfRRIwDAyiXiEILl9PPPcKAAMBADgIDgyiViEYblHgQC +AM92gABsshyWP4ZiuOu5EHh28s9xqgAABKKBz3KlAAgMQIIEJY8fAAAA/yi/BCKCDwAAAOBbeom/ +RX/PcoAAyB0MEgQA8qYgFAIAz3OAAESzBCK+jwAGAAAE8oy/8qbto6yjQIFIFo8QlOdKoxryBfaK +5xj0I7oN8LfnDfLu5xL0RSr+AkEpwnBRJcCRwiJiAAfdCvBFKv4CQSkCcfvxIrr58QDaCN0hgVem +XLMro+S5yiUiEuG5yiUhEoYh/g9BKQ8BTR7CEyiTh+XleSizD/SO4gfdjPeIFAEAMHII989xoAAw +ECiBMHID8gjdh+WQCKH7yiEhACMDAADPcaYACAQhgQQhgQ8wAAAANLlRIEDGQh5EEEIWAREL9M9y +oACoIEiCWWE2CK/7MHkD8FYIj/sEIIBPgAEAANdwAAEAAADZFvQB2E4eAhDPcoAARLOaFoAQQh5E +EE0eQhA3pimiBLgokom4JXgIsnbwz3CmAIwDHYBNHkIQUSDAx89zgABssgQggg84AAAAQSrBBJoe +QhAEIIEPAAAA8Cy5JbpFeTKmBfIyg4y5MqNTIMICSBOBAFej4LnRIOKHB90C9Ajdz3aAAESzCaaa +E4AA6JYEuOV4CLZctoflEoMNpj/0z3CmAIwDvYAEJYAfAQAAADC4ThsCAE4TgACA4KmmHPKN4Sz0 +USAAxij0FNjPcaAAyB8eoRDYDqEB2BUZGIAK3VEgAMbKJeIRUSMAwMolIhKK5ffzFfCO4pL3z3CA +AMgdA4CIEAAAEHIK989woAAwEAiAEHIE9AfdA/AI3Yfl3/TPdoAAbLJOFoAQgODZ8s9ypgDUBCwS +AYA0EhKAOBIPgMsSEAZKcMa46XKGIv0PBrpFeEpyhiL9DwS6RXgEIYIPAgAAACe6RXhEJwIcDbpF +eOlyhiLzDwQhgQ84AAAADroluUV4JXhEJ4EQFLkleIi4RCcBEkEpwYBSIEAFEqZYHkIQyiGCDwAA +///KIYEPAAAQHzpxN4ZAHkQQBCKBL/8DAP8ouTemHgzv+ADa8r+sHgAQOvJIFoIQcoag4tEj4YI0 +8gQjgY8AAAABB/LPdYAA8GFNZYHlCfYEI40PAAAAJNd1AAAAJCDyBCODDwYAAAAxu4LjNAANAILj +CfSA4RTyz3OAAPBhS2OC4w70gOED8sziCvY3hjJxyiGODwEAiA3MIE6AzvfXcAEAiA3I989xgACA +PBGBAeARoQjdK/DPcIAA8GFNYM9wgABQLiCAYHkG2BB1D/cShuu4EvLPcIAAyB0DgAiABCC+jwAG +AAAI9PIMAAAIdZTgyiXiEwvwz3CgADAQCIA3hhBxB93KJWISWBaCEM9xgABEswiRB7qIukV4CLEX +hjAZAAQcsRKG66ENoawWABAoGYAEHbGH5QT0ZggAAAh1gOW4C6L/yiBCAwDYz3GgANQLEKHPcIAA ++LINiFEgAIAH8s9woACIJB6ACxocMIIOQAAMzIYg+Y8J9ITlzCXikAX0ANiPuAwaHDAy2c9woADI +HCqg3QDv86LA4HjxwIYIz/PPcKAA1As4gEIhAQhIIQEAz3CAAHAoGoCB4IogmQ4I9M9wgADIHQOA +H4CAIJkOMHAA3colbRSA5Tv0z3aAAGyyWBaAEIDgyiAiACL0DBIBN+O5EPINzFMgfoAM8uu4F4YG +8qDgAdjAeArwjuAB2MB4BvBRIUCBEvQA2M9xgADIHSOBKYE9eVIhAQDAuSR4gOAI8h+Gkbgfpgvw +F4bo8V4MAABYFoAQgOAwCwEAgOVuAgIAz3WAAGyyWBWAEIDgE/IC2c9woAD0JiOgz3GAAHimANgB +ocDZmRWAEIC4mR0CEChwAvBC2M9xoADEJ78ZGIAA2AwZAIAB2BAZGIAfhfG4CgICABKFN4WWCe/4 +ANqsHQAQH4VShc9zgABwHkAjAQTruM9wgADoI0AgBAFAIAYFSBWAEFnyz3OAAMgdY4PUgwR+RCYP +EUQgDgxCLgcR4HdTJ0QQMiEBAYm5PKU0g3AVjhDPd4AAcGIEJkUQTRWBEIYm/xNEvgQlRQCgdvQn +jhNiHYQTMiYOAYm+3aV0FY8Q1IPkfoYn/xNEvyR+/mbPd4AAcGL0J44TWqV0g2QdhBNkeAR54HHP +cIAAgGL0IEMAW6XPcIAAqGL0IEAAjh3EEJAdxBCSHQQQlB0EEADYTh0CEIXwThWFEM93gACEps9x +gACUpkwlAIDPdoAA3KZS8gQigg8AAAAIW3vCuAAggg+AAMgdvBKCAAUixQAAIIIPgAC8I0QSggBo +HUARBSLEAAAggg+AAMgdxBKCAGV6XKVwFYIQw7pcevQnghBsHQARYh2EEAAggg+AALwjTBKAAGV4 +HaV0FYAQw7gcePQnABBkHQQQaBWAEMO4HHj0IQIA9CYAEI4dhBCSHQQQbBWAEMO4HHj0IQEAkB1E +EPQmABAl8MO4HHgLY1qlfKVwFYMQw7t8e/QnwxD0IQEAYh3EEDIkAwCOHUQQfaV0FYMQw7t8e/Qn +wxD0JgAQW6WQHUQQZB3EEJIdBBCUHQQQHg9AAc9wgADIHQOACIDruAfyThWAEIDgWArCBVgVgBCA +4ATyTgoP/wTwigwAAAh1zQWv86lw8cDhxc9xoADEJxURA4YE2BMZGIAb2BYZGIAD2s9woADUC1Gg +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HhRoOS7yiWiFSv0UhEAhuC4yiXhFSXyUSBA +gAXyUSPAgAPyEt0d8AHZz3CAAHgcz3KAAGyytBIDACCoBoMB4AajH4LuuAbyz3CAAEwGIKAI8O+4 +BvLPcIAAUAYgoBXdiiAEDMIL7/oA2SkFr/OpcOB4wdgUGgIwz3GAAMgdA4EYiAHbz3KAAGyyhuAX +gsIjwQAM4BggwABmGgQAZhIAAQPgBCCADwAA/P+duJ+47HMAowXI7HMAowOBGIg3gobgAdjCIAEA +GCEBAOxwIKDgfuB48cBKDI/zz3CAAGyyMoBRIUCCEvLPcYAAyB0jgUgQggA0gUR5USGAgEjayiKB +DwAAkAAD8A7aAN/PcaAAqCAngawQDQBZYbFxwiVFEMol5hKweE4Ib/sK2c9wgAAINwCQz3agAMQn +USAAgQXyjCUDkgP3AN0b8M9woAC0D/ygz3CrAKD/+qC2Ce/9ANgZFgCWgOAF8gLYEB4YkM9xgACA +PBCBar24YBTdEKEZFgCWgOAH9FEhAMakDGEFyiBhAPUDr/OpcOHFz3GAAESzQYnA2xQawjDPc4AA +yB1jgxJqR+AEIIAPAAD8/2mDKrvAuxe7x3MADgAAZXjscwCjBcjscwCjSiTAcwDbqCDAAfAhzQDs +cKCgAeOA4gDZzPfPcIAARLLwIEMA7HBgoAHhUHG49wDZz3CgANQLLaALzAHgEHgEIIAPAAD/v4+4 +CxocMM9xoACIJB6h4H/BxeB48cDuCo/zz3eAAGyyoJcIdqlxhiH8A0IpBQFEJQgTjBcBEUIoiBBA +2M9zoADUCwoiQIAPo8oiYgCsFwAQQCqGBc9ygABEsy8kCAAdsjgSBwFALAQEBScAAQujQYoCukji +T6NmFwIRUSWAkllhMHlmH0QQBvQOl1MgwIAR8s9wgADIHQOACYBRIACAPdjAKOIFyiChB8AoIQYJ +8EAoABGgcM9ygAAIHQhiF7gD4QQhgQ8AAPz/BSCAASV4nbifuAujC8wB4BB4BCCADwAA/7+PuAsa +HDDPcIAAyB3NowOACIDruBDy5L4O9CoPoAXJcM9wgACAs6DZxNo924oIoAEXu1UCj/PxwOHFz3CA +ACgHAJDPcYAAhK6o2gHdgCBECxB4xghv+6lzgODKIcEPyiLBB8oggQ8AALUUyiOBDwAAzADKJCEA +7AHh9MolAQF+CEAAz3CAANgxEQKv87Sg8cAA2c9woAC0DzygmghP9yYLD/6GCs/7ag+v/QDY/9nP +cKsAoP85oDig0cDgfuB4AdoA2c9woAC0D1ygz3CAAAQ8K6BJBS/7F9jgePHASgmP84YPYAIIdc9x +gABssh+Bz3agAMQnsLgfoRkWAJaA4ADZBfIC2BAeGJDPcKAA1As3oBYIQAFaCOADAdiA5QXyng8A +AAXwRg8AAKoND/sZFgCWgOAE8gLYEB4YkFUBj/PxwNoIj/OiwYt2Kgmv+slwCiUAkBn0z3CAAGyy +z3GgAAwkO4FXgDByyiUiEiCG8LkE8gLZjBhEAAQlgl8AAHDHP4BFeT+ggOXaAwIAAMDpuNryz3WA +AGAuAIWKIQgA5JDPdqAAxCcTHliQz3GAAGyyP4E6d/G5hiH8I0PyQSkBIcO5z3KAAJRpNnoggkB5 +CHUZFgCWgOAF8gLYEB4YkM9wAAD/fxMeGJAb2BYeGJAD2c9woADUCzGg4HjgeOB44HjgeOB44Hjg +eOB44HjgeOB44HjgeOB44HgxoM9wgADYkxmAgODwD0IBmuU6AwIAz3CAAKDUEgvgAwDdKwMAANoK +AAK+DG//KnAacACF4gwv/ypxfg0v/wh3iOfMJ+KVyiXBEy3yTCAAoAvyBgsgAIHACiUAkBz0wgzv +/wHAGPAD2c9woADUCzGg4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HgxoADdmucH9M9w +gACg1JIKwAOA5aYCAgDPcIAAbLIfgO64CPIB2c9wgABMBiCgCfDvuAfyAdnPcIAAUAYgoBEWAJYA +3VEggIBBwBj0fg9v+oHACiUAkBL0BBQFMFElgIAM9AohwA/rcgrYjLiKI4cMTQev9Iokgw+A5UIC +AgAE2BMeGJAb2BYeGJDPcIAA2JMZgIDg2A5CASMCAADguMvyz3aAAGyyEoaGIDoAjCAEgrwJBQLP +caAADCQ8gReGInhkuBB4ih4EEEQiAFOI4Av0H4bxuAX0USVA0QHYBfQA2APw5gtP/4DgnB4AEDDy +Lg8P/wolAJDj9A3MUSDAgRHyH4ZRIICBDfIvIIcKjCAChgf0z3GAAGyyH4GYuB+hqgkgAIHACiUA +kMn0z3aAAGyyH4bwuBXyqBYBENTYTghgAclygOAH8loIQAUL8FoIT/+08M9xgAD8PBOBAeAToQHf +z3CAAHgctBYBEOCoBoEB4AahH4bzuHwJwvoPhoDgmAjC+h+G7rgI8gHZz3CAAEwGIKAJ8O+4B/IB +2c9wgABQBiCgANjPcaAAyBwHoTDYCqHeCu//AcCKIIQNygyv+gHBH4b4uBLyENgMGhwwz3CAAKDU +zgjAAxXIACCBD4AApLEfhuCpuLgfpgCWhiD8AIwgAoAc9L4KT/qA4Bj0A9nPcKAA1AsxoOB44Hjg +eOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4MaAAlqoNr/w0lkXwUSDAgEHAFd8E9Ol1IfAI2M92 +oADEJxMeGJDmCM//lOAIdRXyAtg8HgCQIRYBls9wgAB4piGgERYAllEggIDm9VoNb/qBwAolAJDg +85XlHfTPcKAAkCMegAQUBDBRIICAyiHBD8oiwQfKIGECzyAhA8ojgQ8AAO4EFAWh9MolIQBuD6// +iHAIdalwFQVv86LA4HjxwLoMT/OhwQh2ANhAwACm9gxv+otwCiUAkIr0z3CgAAQlIoAAhgQhgQ// +AF//BSECAECmUyGCAFMggwBleofiVfRRIoDTz3CAAGyyH4A98vq4XvQEIL6PAB4AAAP0AIYK8FEi +gMD/9VEiAMAAhgTyhbgAps9ygABssj+C+bkH8oi4i7iOuACmQvD7uRPyTyABAom5jbmLuY65IKYe +ggQggA8CAAAAUiBABCq4JXgApi7w/LnFIIIPAAAABeP1hSAcAACmJPD1uACGIvKGIBwAhSAYAACm +USIAwf/1USLAwACGFvKGuACmEvBTIQMAUyACAAUjvoDKJeEVCvKGIX8PhiB/DwUhPoDKJaEUz3CA +APiyDIjEuEAoAQYAhiV4USCAxACmoAwiBcogIgipcPkDb/OhwPHAggtv8wXYAN0LuMoP7/qpcYYO +T/TPcIAAbLIfgOu4DPSE5SIBBgBRIEDFjfRRIADFcfQB5XDwANmcuc9woADQGzCgAdnPcKQAmEA8 +oAQgvs8wAAAAAeXKJSIQUSMAwDb0z3aAAFQGAIZRIACACfLPcKAATBwDgFEggIAx9FEgQMUF8lEh +gMM28lEgwMUP8lEhgMML8s9wqgAABAGAhiA/C4PgKPImCQAAIN/PdqAAyB/wpgHYQx4YEADY1gsg +BY248aaE5YoHxf8W8P4IAADPcYAABDwLgQHgC6EM8O4IAAAC2ACmz3EAAN8Ongmv+oogmAFRIADH +ANoI8gDZnLnPcKAA0BswoM9wpACYQFygG/AA3VEjAMAP9CDfz3agAMgf8KYB2EMeGBAA2GYLIAWN +uPGmd/GWCAAAz3GAAAQ8C4EB4AuhpQJP8+B4DMxEID6KO/LjuCHyDRICN4DYz3GAAIg767oMGhww +BvIagQHgGqEF8BKBAeASoVEiwIAH9ADZz3CgACwgL6ANzIYgggLgfw0aHDBRIECBF/KKIAQADBoc +MM9xgACIOxGBAeARoQ3MANlGIIACDRocMM9woAAsIC+g4H7gfvHAuglP8wDfz3agANAP9aYD3RLw +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HhhvYwl/5/u9QPZOqbPcIAAcCj7oDqmAdgV +ptUBT/PgePHArg/P/+INz/8ODs/60cDgfuB48cDhxc9yoADQD7CCz3CAAHAoO4AwdQDbBfQD2Tqi +e6AD8M4Pz/+lAU/z4HjxwB4Jb/MA2QfYGnE6cADeQCgAIRR4x3CAAISuFSCNAwCVjCACjQDfhPaM +IIWCyfb/2AC1iiARA/YPb/r/2QGdvOAF9owgP4FH9uG1iiARA94Pb/oA2QHmz36M5rQHy/9CIUAg +gOBAIEEgogft/y95DQFP8/HAtghP8wDdz3CAALylbg0v+rSogOAT8gjegOXMJaKQzCUikcwlYpGM +D2L+yiBCA2G+gOYB5TP3HPCKJAFxz3GAAByxqCBAAQQZUAPgeADZSiQAcs9ygADIsKggAAMWIkAA +YpDPcIAAlLE0eAHhYLDPdYAAyB3PdoAAAKZAJQAXJG4SD+ABBtpAJQAVQCaBEgIP4AEG2kAlABdA +JgEU9g7gAQbaLBWAEITgD/SKIA8KCg9v+oohmg48FYAQMgxv/i2FYgyP+Q6FUSBAgQnyiiCHDuoO +b/qKIRsCwghAA/4MD/qA4HwOwv/PcQAA///PcIAA5NEsoF4PL/oroCUAT/PxwLYPL/OKIQoFz3CA +AMAg+g7v9ADdz3CAADwm7g7v9IohCgXPdoAAyB1AJgAVAKbPcIAAWCMBpqlwqXHODK/zBtoB2Klx +xgyv8wbaAIZKJIBwqXECpgOmqCCABRUmQhBggoogxg0NswCCAeGpoACCqaAAgrYYWAMAgrcYWAMA +grgYWAMb2c9wgADUOZUHL/MwqOB48cAeDw/zAN7PdaAAtA/cpY4Lr/tod7oKD/qA4AT0sglAAwTw +4glAA1YIz/zODK/76XDPcIAAcCgZgFEggIAF8iYNz/8K8ADZnrnPcKAA/EQhoOB4waDcpS0HD/Px +wMIOL/OKIwoIz3GAAMgd8CENAKPBQCUCFC2VfmI8fyhwhiHxD8K/R7kkf/FxhiD+A0S4DvIKIcAP +63KD2I24iiNSA0okAAC9Bm/0CiUAAeiFemI7v1MnD5Dgqk2VwLpBrgzyd5WGI/8JQ7tnrneVhiP+ +B0W7aK6A4hLyz3KAAHA4FSIDAACLNXoCrgGLA64CiwSuA4sFrgOKC/AB2SmuAtgCriOuANgErgPY +Ba4GrotwyXEyCG/zDNoAwAHBAgxv9ALCi3DJcR4Ib/MM2gDAAcFWC2/0AsLPcYAAQAcAoQ2VRLjg +uADZLqUF8oohCAAupeG4A/KLuS6lUSCAgATyjbkupSUGL/OjwOB48cDhxc91gADIHSOFz3KAAEQH +d5Hgu1fYAKIE8l/YAKLiuwTyhbgAolEjQIAD8oe4AKIyIYMPAACwApYhAQUA2oDjyiCBAM9ypQDo +DwaiEInPcaAApDCA4AGBzyDiANAg4QABoWYMz/Yjhc9woADIHE+BSKAyC2/9DoG1BQ/z4Hjhxc9w +gADIHQOAKYBEIYOAANol9JDijAAGAAAijQ+AAAgdAI2guACtgBWAEKC4gB0CEEAVgBCguEAdAhAQ +jaC4EK2QFYAQoLiQHQIQUBWAEKC4UB0CEAHi3vGQ4kQABgAAIo0PgAAIHQCNgLgArYAVgBCAuIAd +AhBAFYAQgLhAHQIQEI2AuBCtkBWAEIC4kB0CEFAVgBCAuFAdAhAB4t/x5rkR8s9ygAAIHQiKgLgI +qogSgACAuIgaAgBIEoAAgLgR8IDjEfTPcoAACB0IiqC4CKqIEoAAoLiIGgIASBKAAKC4SBoCAFEh +AIAA2B3ySiQAdOB4qCAABuK4FfIAIIMPgAAIHSATgQCAuSAbQgCgE4EAgLmgG0IAYBOBAIC5YBtC +AAHgHPBKJAB04HioIAAG4rgV8gAggw+AAAgdIBOCAKC6IBuCAKATggCguqAbggBgE4IAoLpgG4IA +AeDgf8HF8cDSCw/zgeDPdoAAyB0acAP0AIYC8AGGuhAABhUmDRRMIACgAd8luFMgBQAghcB/QCEA +A7oRAQZRIUCBDPQKIcAP63KB2I24iiPNA80Db/QKJAAEiiILBllgABYDQFhgYKAAFgBAAaEAFoBA +CKkAFoBACanPcIAAcCgagIHgB/RAhQAWAEEPsgPwABYAQQAWgEAKqQAWgEALqQAWgEAMqQAWgEAA +FgBBB7EAFgBBCLEAFgBADglP/QCFiiEVBSTgIGCGIH+OVPTwJsATJOAgYIYgf45M9Iog0wEGCm/6 +iiFNCwpwVg8v+AHZXgyv/C8gBwR+CeAECnAGCA/6gOAU9M9wgABoIyyQHpYQcQzyug/P+YDgLPJM +IACgKvSSD8/5gOAm8gCFuhABBgpwJbniC2/1wLnKD8/5gOAJ9M9wgABoIyyQHpYQcQf0C8gFIIAP +AQAA/ArwC8gFIIAPAAAAPAsaGDALyJC4CxoYMCYOz/fFAg/z8cA6Cg/zCiQAoKHByidhEBXyz3CA +AHAoZBAFAFElgIAM9AohwA/rcn7YjbiKI0gMdQJv9AokAAUA3891gADIHRUlDhUAhhUl0hMkEBYA +IBAXACgQGAFBLkEhUyEQAAASASAaEBkBKYEluVMhEwCCDiAEDdnPcYAABDTAEQAGv+BL94oiyA9y +aHR7O2NAowQbAAUIGwAEAeDFuMAZGACWCy/+inAAhgmAJbhTIBEAinAWDi/4ANlMJACgBfT2CM// +A/C2CgAATCEAoDfyTCAAoA3yCiHAD+tyf9iNuIojSQdKJAAAwQFv9LhzEg7AAeIN7/cB2ACGCIBR +IACABvIsFYAQhOAD3wP0Bd9MIwCgBvRuCY/7AgiP+ywVgBCE4F/0iiCPDkYIb/qKIQkPgNiGDq/7 +AdlT8JoN7/cA2CwVgBCE4Az0iiCPDiIIb/qKIQoCgNhiDq/7ANlMJACgCPQiCY/7GgmP+wIPj/Yj +8LIPj/a6Dc/5gOAF8m4OwAQZ8A4Oz/mA4BXyz3CAAFwjFIiJ4Mwg4oEN9M9wgADwXgCABNm92h7b +QMCLcE4P4AAYu0wjAKAK9IHnBvTSDc/5gOAE8nYPj/YAhgiAUSAAgAbyLBWAEITgBN8D9AbfIIYI +gSgRFQGKcQQgkA8ABgAA6XCSCa/1BSBCJYDgBvLpcH4Jr/UFIEElJg3P+QTZz3CAAHAoPg4v/Tmg +IIaKIhUFQCEACUBghiB/jlb0ABIAICTgQGCGIH+OTvSeCa/8inC+DqAEinBKDc/5gOAT9M9wgABo +IyyQHpUQcQ3y+gzP+YDgRfJMJACgQfTWDM/5gOA98kwhAKAF9EwjAKAF9IpwHglv9Spxf9kRuc9w +oACwHzSg2g7P+foMz/mA4Aj0z3CAAGgjLJAelRBxCvQLyAUggA8BAAD8CxoYMBnwC8gFIIAPAAAA +PAsaGDALyJC4CxoYMA3wJBmABSCGIBnABSCGKBkEBiCGGhlEBgHe2gsgAslwz3CAAFAc6gogAsCo +TCRAoBX0z3CAAFwjFIiJ4Mwg4oEF9EwhAKAH9IjgB/RyDM/5gOAD8rIJz/RMJECgzCEhoAX0AIUC +pQOl0gmP+eYKz/cEypDgzCCCjwAAswAP8gohwA/rcgESBDaS2I24iiPMCkkHL/QKJQAFDgvgAQDY +DQfv8qHA4HjxwPIOz/IA3Qjez3CAAMgdAIC6EAEGQSlAAVEgAIAO8oDlzCWikMwlIpHMJWKRBvSA +5cwlopAN9FEhQIEM9IDlzCWikMwlIpHMJWKRBPSmDS/+qXBhvoDmsgft/wHlz3WAALwjz3aAACCm +XNwCJQATJG5eDaABBtpk3AIlABNAJoESTg2gAQbaXNwCJQATQCYBFD4NoAEG2s9zgAAcIw+Dz3Gg +AMQnz3KAACwjdxkYgBiSeBkYgBGDgBkYgBySgRkYgA8RAIaDuA8ZGICRBs/y8cAeDs/yz3WAAGwG +AIUA3oDg/AyCAgzM4LgA3y7yz3CgAMgfsBACAM9xgADIHSOBAuJGEQEBYbkIIkEAPqAQ2S6gAdkV +GFiAz3CAAKDQAxoYMM9wgABo0ToKYAMEGhgwz3CAAGQGAICA4MQIgv0EII9PMAAAABvw7bgY8noM +z/7PcIAABDwLgIwgAo2I97IJr/oX2M9woAC0D/ygDMzvuM9woADIHxj0yXcA2c9wgACAPCGgz3Gg +ACwgI4EjoEvwfgmv+hfYANjPcaAAtA8coQHeQfAE2QYaWDA/gIDhiiEMAMohgg8AAAACLqAD2RW5 +EhhYgACFgODgC4ICHQMAAFEgQMUc8gbIhiDxjxj0z3WAAJA6fRUAFgHg3gvv/n0dGBAMzO64BfIE +2AwaHDBoFQAWjCACjYwHxv8B3gzM5LhF9Oa4TvSGIP+FivJRIwDAUvQGyAQgvo8DgOhD0vVRIEDF +0PXPdaAAyB8/haAVABAJIQAA5OAA3tL2z3CAAMiwAIBRIECADPLepRDfFgngAOlwgOAE9AHYHqXu +paAdgBOKIAgADqVfhajivAEFAM9xoAD8RBmBBCC+jwAACCDQ9B2B+bjM9ADYy/ANzFMgQIDB8wTI +AxIBNgMaGDAEGlgwsghAA89wgABkBgCAgOBAD0L9sfFRIEDFrfUMzM91gACIO1EgwIAg8oDYDBoc +MA3M67gH8hqFAeAapQDeBPAShQHgEqXPcIAA1DkSiFEgAIA4CyIDyiBiAIDnEvIZhQHgGaUO8Iog +BAAMGhwwEYWA5wHgEaUE8hiFAeAYpQzM57g+8g3MBCCEDwAAABgMJICPAAAACBryXgnP9w3MUSDA +gCPyz3CgACwgJYAGgArhEHEX9wMSATYC2AwaHDBQ2FIML/6YEQEAnvE2De/4yXBRIACAB/II2Ju4 +BhoYMEvxBNgGGhgwR/EDyKAQAADwuADYPfJWDg/4ANiWuDnw6Lgk9Om4OPTuuA7yUSMAwAryiiAE +AM9xoACwHxShBNgGGhgwDczvuCfzz3GgAKggSIHPcYAA5LIvkTByOgbF/6+4DRocMBnx2g8v/Iog +BACmCO/3AN0DyKAQAADwuMogQQMH8uYNL/ipcADYlbjqD0AEufHWDS/4AdgA2JC4+fEB2A94geAJ +9IDiBfSKIAQADqUuDUABL9iVuBIdGJDPcAEAwPwVHRiQ3gwAA89xgADwNwCBh+Ag8s9woAA4LgWA +BCCAD8AAAADXcMAAAAAP8vXaBbrPcJ8AuP9aoAfaW6Bp2hi6WaAB2ALwANiB4AT0B9gAoc9wgABs +BgCAgOAACYICz3GAAIA8QYECgQgggAACoXyFA4FEgQJ7AMoIIsIAiOBEoQn0A9nPcKAAQC0woAAa +gjME8AHgABoCMG0Cz/LxwP4J7/KKIIsBz3eAAMgH+ggv+iCHANjPcYAAtDjPdYAAjAcIoQmhC6UB +hYYgeY8V8s91gADEBwCFIIcYuBC5BXmFIRgAxggv+oogiwAG2AClANglAiAAAKcD2NoLr/kLuIDg +IIcI9M91gADEBwCFGLjn8YDhCAICACKNz3CAAHC7QCAQDc92gABotDV4W5B6kIDiBBYEEQOGIfJw +csohxQ/KIIUPAAB7J8ojhQ8AADoCPgAlAMoixQeA4A/yEHLKIcYPyiCGDwAAfCfKI4YPAAA8Asoi +xgdL95BzTvcKIcAP63LPcAAAfSeKIwkASiRAAFUBL/S4c4DgEPIQc8ohxg/KIIYPAAB+J8ojhg8A +AEICyiLGB233DIWA4Bn0B4WA4Bf0z3CgACwgA4AJpc9wgABku/QgQQDSD+/5iiBLBoogSwbGD+/5 +KYUB2Aelz3CAAMgdA4AlhiigIo3PcIAAZLv0IEEAz3CAAMgdA4A0sM9wgADIHQOAJoYpoM9wgADI +HQOAJZYtsALYCHHODS/zANoijc9wgABku0WG9CBBAFMiAABCCa//ANuKIBMBXg/v+SqGIo3PcoAA +ZLkKhgK5NHmSD+AAWWHPdoAAxAeKIEsHOg/v+SCGOgygAQHYYg3AACKNz3CAALS6NXhMgFEiAIAH +8s9yoAAsIEOCQqXPcoAAyB1CgrgSAwaBu7ga2AAMgMC4UiAAABt4NXg0IAAgIIcKuAilAIYQuRi4 +BXmKudoO7/mKIIsABNgApiKNANgAp89wgABku/QgQQC+Du/5iiALBM9xoAAsICOBrg7v+YogCwQM +hYDgB/QA2JIPL/UIce4Oz/0B2OkHj/IKIcAP63LPcAAAfyeKI8oASiSAALUH7/O4c+B48cB2Dw/4 +ANjRwOB+8cCmC6/54cWA4DTyz3GAALylFImB4C7yN4mA4Qnyz3CAAFSwAYAQcQHYwHgU8M9ygABI +mguKhiD/jB7yz3GAAFSwYYGkirFzANgF8iCKMHMC9AHYgeDPcYAAuAcAoQr0z3CAAPxZJYAjgSCB +rg9AAmUHj/K+Dg/47vHgePHA5g6P8s9xgACQBwCBz3WAAMQHz3aAAMgHgLgAoc9xgAC0OAWBAeAF +oSCFAIYYuRC4BXmFIRgAsg3v+YogiwAG2AClANgNB6/yAKbxwJYOj/LPc4AAjgcAi89ygADkus92 +gABkuwHd8CIBAPQmBBAB4MC5geHPcYAAaLTAfeOJD3jxcDwAKgAAq/QmARCQcRj0gOUW8vAiAQBR +IQCAEvQB4A948XBN9vQmARCQcQn0gOUH8vAiAQBRIQCA8vMAq/FwcAAKAPAiAQDAuVIhAQA7eRV5 +z3CAAKS7MGDPcYAArAcKuAChx3AAAAAYKgiv+QDfz3aAAMQHIIbPdYAAyAdAhRi5gOAQukV5DPKF +IQwA2gzv+YogiwAD2ACm4KUM8IUhGADGDO/5iiCLAAbY9/HSDs//FQav8gDY4HjxwKYNr/KKIEsB +pMHPdoAAyAeeDO/5IIbPdYAAjAcBhQh0hCSGkCCGHfKA4WgL4vfKICIBAN/PcIAAZV3gqM91gADE +BwCFIIYYuEApAgQFeoi6iiCLAFoM7/lFeQHYAKWb8IDhRfQLyAQggA////8DCxoYMIogywA2DO/5 +ANkghs93gADEBwCHELkYuAV5hSFIAB4M7/mKIIsAAtgApwHYAKbPdoAAZV0AjoDgCfTPcKAALCAQ +gMdwBwAgoQ2lNBUHEM9wAAA8c0DABNhBwAHfQscA2EPA6XAG2QTaANuYc7hzygrv99hzANgArlXw +geE19APY5g5v+Qu4gOAt9AHZz3CAAGVdIKiOCu/3BNjCCY/5gOALyMUggg8BAAD8CvQFIIAPAAAA +PAsaGDALyJC4CxoYMCCGz3WAAMQHAIUQuRi4BXmIuWoL7/mKIIsAAdgApQDYAKYB3x/wguEh9M9y +gABlXQDfgrjgqgGlz3KAALQ4BoLPdYAAxAcQuQHgBqIAhRi4BXmIuSYL7/mKIIsAAdgApeCm6XB1 +BK/ypMAKIcAP63LPcAAAeieKI4gASiSAADkE7/O4c/HA7guv8oogiwKkwc92gADIB+YK7/kghs9w +gACMByGAKHSEJAaQ4IYi8oHnBPT+C0/0DPCFuSGgz3GAALQ4CoEB4BYL7/0Koc91gADEByCF4IYY +uRC/5XmIuZ4K7/mKIIsAAdgApQDYAKY98IDnOPTPcIAAxAcAgBC/QCgBBgi45XkFeYogiwBuCu/5 +gLkB3aCmANnPcKAALCDQgM9wAAA8c0DABNhBwELFQ8EocAbZBNoA20okAABKJQAAACaHHwcAIKEu +Ce/3SiYAAIogCwUmCu/5iiGQBqlwBfCB5wb0Adh1A6/ypMCC5891gADEBwAVBBAM9IW5IaDPcYAA +tDgKgQHgCqFALAEGpvEKIcAP63LPcAAAhCeKI1APFQPv87h34HjxwMIKj/LPdoAAjAcBhs91gADI +By8oASCKIAsBtgnv+SCFIYZQIQwAp7xQJAySAN8G8lILb/ROIMAnIvAodIQkBpAh8s91gACwOACF +geAH9DILb/ROIMAn4KUBhoYgBgABpoogSwBuCe/5ANnPdYAARC4AhYDgBPJAeOClpQKv8gHYAIWA +4Kr0USEAgM93gADIHYn0Ao7PcYAA5LrwIQIAAdkCuEZ5NHjPcYAApLsQYQq4CKbHcAAAABhGDG/5 +SiFAILkXARYacM9wgAAcsTR4EYiA4M4Nb/nCIUIkTCAAoMwhIqDMICKATvLPcIAAYLwEEAKBz3CA +ALgGAJAQciOHGfTPd4AAaLQFh0iBUyAEAFMiAwCQcw/0Y4+B48QggQ8ABgAAxCKBDwAGAADMIIGA +A/IA2ALwAdhJgQymz3aAAMQHYIZRIkCBQIUA3xi7ELpFexHygOAP9BiJg+AL9E8jQQJyCO/5iiCL +AALYAKbgpYbxTyMBAom5Wgjv+YogiwAD2PbxTCAAoAb0iiALCIohRgEh8M9xgACAPBOBAeAToW7x +6gugAAHYAIe6EAAGJbiKCC/1wLgSDS/6Eti6CW/7BNhKDwAAz3CAAKy7PoCKIMoPAgjP+VTxCiHA +D+tyz3AAAHkniiMGCkokgAAhAe/zuHPgePHA1giv8oogSwLPd4AAyAfOD6/5IIcAh4Dgn/T2CG/0 +AN2KIBMCug+v+YohjgsC2AoNr/cB2c92gADIHSOGMCGADwAAdAUodIAkFR2muACkI4ZIgTSRUyIA +AGIJb/8B2wLYqXHKDe/yAtoihrgRAAahuLgZGAAAhroQAAYluMC4Uggv9alxI4aKIMsDUg+v+TSR +og+P/doOIAQC2EoMYAEB2M9wgABwKBmAUSCAgAXybg4P/w3wANmeuc9woAD8RCGg4HihoM9woAC0 +D7ygI4YJgc92gADEB1EgQIEX8s9wgACMBwyAgOAR9BiJg+AP9CCGAIcYuRC4BXmFIRwA4g6v+Yog +iwAH2CLwNg+P/c9wgABotASAIIZAhxi5gOAQukV5CfLPcIAAjAcBgIYgOY8I8oi5qg6v+YogiwAB +2Ajwi7meDq/5iiCLAAjYAKagp+0Hb/IA2AohwA/rcs9wAACDJ4ojzwxKJIAAsQev87hz8cBqD2/y +iiDLAs91gADIB14Or/kghYogywLPdoAAaLRODq/5JIYghYDhM/T+2c9wgAAEOSCgBguv9wSGCHHP +cIAAFFreDwACz3GAALQ4DIEB4AyhDgsv+hLYug8v+wTYbg6P/c9wgADEBwCAIIVAKAIGELkIuEV5 +BXmKIIsA8g2v+UUhwQAD2AClAdgd8IPhHfTPcoAAtDgNgs92gADEBxC5AeANogCGGLgFeYi5wg2v ++YogiwAB2ACmANgApc9xgACMBwehEQdP8gohwA/rcs9wAACFJ4ojkQtKJIAAzQav87hz8cCCDk/y +z3CAAGi0A4DPdYAAjAdWCy/2KYUIdwGFz3aAAMgHhiB5jwz0ANiKCG/5jLiA4AbyDIWA4MwnYZAk +9ACGgeB4DgH0DIWA4MwnYZAH9M9xgAC0OACBAeAAoQCGz3WAAMQHIIUQuBi5BXmFIRgAGg2v+Yog +iwAG2AClANgAptPwAo3Pd4AA5LrwJwAQUSAAgDjyCIVmCi/2IoWMIBCAZAApACCGgeEUDgH0I4XP +c4AAtDiA4QDYCKMQ8kSFAN8PJ48QBiHBgy8vQRAjpU4nghcB4Pb1RKUIowCGz3WAAMQHIIUQuBi5 +BXmFIRQBmgyv+YogiwAF2AClBNgApgDYk/AghoXhUAENADImQXCAACxeQCcAcjR4AHjPcYAAaLQi +iVEhQIAA2AX0egmAAwCGIo3wJ0EQz3KAAMQH4LlAggDfELhAKgMGBXsQ8oC5I6XkpQi6RXuKIIsA +Lgyv+UUjQQEF2ACm6XBf8M9xoAAsIAOBAqUDgU8jAQKKuQqlCgyv+YogiwAF2c9wgADEByCg4KYg +8AOFgOAg9M93gADEBwCHGLiQuJK4TyABAoq52guv+YogiwAF2ACnANgAps9woAAsIAOACqWKIEsE +vguv+QDZAdgp8OC4B/QvKAEATiCBBySl7gzv+wSFz3CAAMQHQIAghkAqAAYQuQV5CLpFeYogiwCG +C6/5gLkB389wgABsW6IMYADgpoogSwRuC6/5JIXpcMUET/LPcYAAtDgHgQHgB6HPcIAAxAcggEAp +AAaRuAi5BXmKIIsAPguv+UUhQQEF2FXxCiHAD+tyT9gHuIojjAJKJIAAXQSv87hz8cAODE/y5g8P ++c91gACMB4DgAYUB2cB5hiB5D0IgDoAA2MomYhAIviV+Hg4v+Yy4gOAB2MB4ELgFIL6DIvILhYHg +CvQijc9wgAC0ujV4LICAuSygz3aAAMQHAIbPdYAAyAcghRi4ELkFeYUhGACuCq/5iiCLAAbYAKYA +2ACl6PBCjc9wgAC0ukAgEAxVeCyAUyEDgCz0y4WB5ir0gLksoIC7UiMAABt4VXjPcYAApLsQYQDf +CrgIpc9woAAsIAOA66XPdoAAxAcCpQCGz3WAAMgHIIUYuBC5BXmKuT4Kr/mKIIsABNgApulwyvHP +d4AAaLQDhwYIL/YphYDgG/IMhYDgGfQohc9wAAABFAghAACZIAoA5g/v9SKFgOAE8mIMj/+a8c9x +gAC0OACBAeAAoZLxz3aAAMgHAIaA4BDyhOBr8gohwA/rcs9wAACCJ4ojjgVKJIAAAQOv87hzCIWe +D+/1IoWA4BbyIIbPdYAAxAcAhRC5GLgFeYUhFAGeCa/5iiCLAAXYAKUE2ACmANhg8AOXgOAu8gKN +8CAAIFEgAIAo8gKXCrhWD+/1KoWA4E/yz3KAAJA6OYIYgiJ4JIJFgkJ5GWEDlzBwlPdSCa/5iiCL +BM9xoAAsICOBQgmv+YogiwTPcYAAtDgBgQHgAaEd8CCGz3WAAMQHAIUQuRi4BXmFIRQBFgmv+Yog +iwAF2AClBNgAphvwCIV2Du/1IoUKIQCAEAAPAJIOQABWC4//EPDPc4AA/FkFgwOAQIBocJIKIAJZ +YcoN7/kS2AHYJQJP8vHAwglP8s92gADIBwCGgeDsCQH0IIbPd4AAxAdAh4ogiwAQuRi6pgiv+UV5 +AN2gps92gAAEOQCGjCDDj6CnB/LPcIAAFFrGCQACz3CAAPxZugkAAs9wgACOB6Coz3CAAJAHoKDP +cIAAqAegoP/YAKYC2ADZpg6v8ghysQFP8uB44cXhxgDez3OgAMAvpRuYgw/dCL2jEwKGpHqMIhCA +/PMUG5iDoxMChgsiQIP89RS4BXmkG1iApBMAhv+4/fPBxuB/wcXhxTDbAN3PcKAAyBxpoAPaz3Gg +AMwXIRmYgE6hp6BqoOB/wcXxwNoIb/IA2c9woAAMJFiAz3WAAGyyrXBBKoYHhiD3D5gVgxApuHZ5 +wHHHcYAAkM0VeQARhADPcIAA6BMggEAszgDVftBh2WFEII+AUyCOAAQigA8AIAAAzCAigAb0gOfM +ICGAANgD9AHYz3egAMQnQCsFBoYj/Q9MJACEUiPDAbQAKgBFu4DmzCAigFTyz3CAAKRq8CCHA0Au +hgOC5gUmxgEFJYABBXtBH9iQJvQfhRDamrgfpQjYTx0CEM9woADIHEmgB4HPcqAA8BcGogaBBqIF +gQaiBIEGogDYCqKKFQARaLgQeIodBBAAlYYg/4wp9AHYHaIn8E4VgBCA4CP0ihUAEUylZLgQeIod +BBCD5gTZTx1CEAz0KxcBlmS4EHiKHQQQDNgtpU8dAhAaDu/4iHAJ8AUjQwFBH9iQH4WzuB+lAQBP +8uB4ENrPcaAAyBxJoQHbz3GgAPAXaqGkEAIA67om8gLaXaHPc4AAiMREg0ahQ4NGoUKDRqFBg0ah +cBAAARzgUyDAgAT0QCMACATwQCMADECAU6FMaECCU6H4EAKCU6H8EACAE6EP8FyQhiL/jAP0faFI +gEahR4BGoUaARqEFgAah4H7hxS+Az3OgAPAXz3KgAPwXKKNAEAEBKrIxgCijSBABASqyM4Aoo1AQ +AQEqsjyQhiHzD4whDIAH9DaAKKNcEAEBKrJwEAEBvJAI4aiyvZCoslQQDQGosmAQDQGosrmAp6O6 +gKeju4Cno3IQAAE4YBB4CLLPcKAA9AcnoALZz3CgAMgcJ6Dgf8HF8cDSD4/4jgvP+NHA4H7gePHA +eg4P8s91gABssheFmODPdoAAMM4G8lgVgBCA4AXyeoVbhQPwfIVdhRKFz3H+//8/JHtEeQQggA8A +AAAQBXthpgDf4qYleA2mDtj2Ci/5DqaA4Afyz3GAAFgjWgvgAAHYz3GAANwdTgvgAADYF4WU4Af0 +AdgBrjEeAhAE8OGuMR7CE10GD/KhwfHA3g0P8kh3z3KAAHCwRoIIdoHiAdrAekAqEwPJc4Yj/ACM +IwKFz3KAAGyyANgd9JgSggDnugj0z3CAABDGBbpAYC24wLjPcoAA5AZAgs9zgADkslEigIAUewTy +INqtkwrwmNqrkwbwz3CAAKiys5AO2gGXQCUDFRBzRvaieEggAAAQeAPwANg6cADYWnCpc0YNIASY +cAogAKBN9ArYz3GgAMgfHqEQ2A6hAdgVGRiASnET8M9yoAD8RB2CWYLrugDZBvQEIL6PAAYAAAPy +AdkEIJIPIAAAAFEgAMPMISGAzCIhoAX0USMAwOXzUSMAwBbyz3CAAFBbAdkgoAPIpBABAJq5pBhA +ADYMYAIB2M9xgAD8PAKBAeACoVEgAMMA2Ar0z3GAAIA8BYEB4AWhANiYuBpwTCAAoADYyiICIEr0 +BSOAIw1xALENcQAZRAQjhw1wIKAolw1wILCKIIUAmgtv+clxjCYClRXyjCYDkRzyjCYDlSLyCiHA +D+tyE9iMuM9zAACyC4okgw+pBG/zuHPPcIAA6LIugA+BAeAPoaoJIADpcBHwz3CAAOiyLoAOgQHg +DqEJ8M9wgADosi6ADYEB4A2hANjPcaAA9AcEoUoiQCDPcaAAyB/4EQMAACVCFGJ6SCICAH+BUHpw +cjwABQBjh89ygAB4pkwgAKBioqDaT6Efoc9wgABsshyQYrgicB+hAtgVGRiABvJRIEDGINgD8oDY +DqGMJgOVBvTPcIAAbLIckAnwjCYDkQj0z3CAAOSyD5AqCO/5ANlyCc/+DMyGIPmPC/SMJgORANjP +IKEDyiAiAQwaHDBKcAjczwMP8uB48cB+Cw/yocHPcYAAHNEkgc9zgAC0ps91oADIHwQhgQ8AAAAQ +RSFBA0DBIMLDulx69CODAKAVAhBwu1BzAN4O934VApajun4dmJAQeHB72g4gBBTa+LgE8gDYO/AD +2M9xoAD0BwWh5NoNcECwDXDAsIoi/w8NcECgz3IAAP//DXBAsAPIz3OAABDGz3KAAMgdEIgFuABj +LbjAuPAiAADggA1w4KADyBCIBbgAYy24wLjwIgAAQpANcECwxKHmDMADQBUBFjB5ng+v+RDYAdgZ +Ay/yocDxwKYKD/LPcoAA7KYgioDhEfLBgqKCz3GAAOQGAhIQAeCBz3KAAIA8III0vwHhIKIx8M9y +oADEJxESAYZRIYCBAN/582QSA4ZkGtiDAtkTGliAgOMvKcEATiGCBxLyz3GAAFSaVnnAgaGBz3GA +ANSa9CGQAM9xgAD0mvAhjwAL8M9ygAAEPD6C6XXpdhp3AeE+okGADXFAoSSQDXAgsM9xgAAkswCB +gOAG8kKBDXBAoADYAKHPcIAAyB0DgAiA67jKIIIDyiFCA8oiwgN8CGIEyiMCBFMgwCDPcYAA5AYg +gRS/USGAgAy45XgK8oK4DXEAoQ1wwKANcKCgIPANcQChSiQAdOB4qCAAA0QmgRAPuVMmABAleA1x +AKEivkokAHTgeKggAANEJYEQD7lTJQAQJXgNcQChIr3RAQ/y8cByCQ/yCHYodShwSHFiCCAAaHKB +4MoggQMQCCEAyiFBA70BD/LgeCK5BvDscmCiBOBhuYHhYIA6989woADUC22gA9nPcKAARB01oOB+ +4HhBKYGACvIvJElw4HioIIABBBACBOxxQKHgfuB48cD+CA/yocEId892oACsLxmGBCCAD3AAAADX +cCAAAAAB2MB4LyYH8Ch1GnIT9IogSQbaDy/5iiELATmGzg8v+YogCQaKIAkGwg8v+alxANgt8AvM +ABxEM08gwQMCHEQwAeAQeAQggA8AAP+/j7gLGhwwz3CgANQLOIBCIQEISCEBAEAnABIQcQwLxQMH +5wQnjx8AAPz/BScAFJ24n7jscQChAMHscCCgAdi5AC/yocDPcIAAcLAGgAPageAB2MB4DLiFIAMB +z3GgAPQHRaENcgCyA8gA212QDXBAsAPIUYANcECgA8hIEAIBDXBAsGSh4H7gePHAEggP8s91gABc +k+AVABAA3oDg0PdELj4XACFAcxzZxdoe234O7/8Yu+AVABAB5hB2s/cA2EkAL/LgHQAQ4HjxwM4P +z/EhgAolAJAQicO4yiHBD8oiwQfKIKEGyiOBDwAApgDPICEDNfKA4cohwQ/KIsEHyiDhBsojgQ8A +AKcAzyAhAyfyBbjPcYAAEMYHYQOFAJCGIPwAjCACgC2/wL8L9M9wgADIHfAgwQO1EQAGgbi1GRgA +AYXCgAGGgOAF8gCGgOAM9AohwA/rchzYjLi020okQAB9By/zuHNRIIDBBfQCCUAAgOAM8oogzgIq +Di/5u9kAhoDZKKABhkB4IPABhSCQHMgQccohzQ/KIs0HHdjKI40PAADBALoH7f/PIC0DXg+v+Klw +Wg4gAAGGz3CAAIxv5qDyDqAD6XA5B8/x8cDSDu/xiiBPDs4NL/mU2QHYz3WAAHwcB6XPdoAAmKWK +IE8Osg0v+SiGFY0A2iyFDyICAAshgIAm9CqFRXnIhiqla4UFuOC+x3CAABDGIIAM8lEmwJEK9GV6 +S6WouSCgiiAPDqXZCfBGe2uliLkgoIogDw6s2WIND/mKIA8OWg0v+SuFuQbP8fHAQg7v8TjaosEa +cM91gAD8FAGFAN+SDa/z6XEBhRjZz3aAAMgdILAjhjOBUyDDIM9ygAAcxiGgQChBISliMxjCA0Ap +BAGIcYYh/gNleTCoz3GgACwgMIHHcQcAIKEqoAbZMRhCADIYQgAjhjKB+rAjoAzgkg3gAgpxA4WQ +2YHCILCLcfIML/MKcIHgyiHCD8oiwgfKIIIPAAC9Icojgg8AAHYAyiRiAOAFIvPKJQIEAMBRIACA +C/KKIE8Okgwv+XrZIYUBgaO4AaEjhYtwBOFWDKAABtoBhc9xgAD0FCKgmg3v/6lwz3CAAHwcFRgC +BLUF7/GiwOB4z3CAAFRbfQXP/+B48cBCDc/xo8EId4ogiwM+DC/56XHPcIAAjgcgiAEcwjPPcIAA +Yrv0IEAAYMEDHAIwANgCHAIwAdjPdqAAyB8TphmGDNlCwBiGhNoe20HAi3CGC+//GLvPc4AAxAfP +dYAAtDgLEgE3XpWE2GCD4g2gA5h3TgnAA6QWABATpS0F7/GjwOB48cCyDM/xpMFacDpxJgwv+xpy +gOBk8s91gABwsACFgOBe9M92gABQBwCGguAe9IogCQiKJwgYkgsv+elxz3GAAAQ0wBEABr/gCNpJ +93JodHs7Y8CG4KPBo0KjAeDFuMAZGACaCC/7CNjPcYAAlDcAgVEgAIFLgQX0AYGP4Anyg+Iu8gDe +x6HMoQPYC6EI8IPiJvIA3smhx6ED2AihxKWKIIoIJgsv+SqBz3CgACwgsIAAHAA0BthBwELGQ8YB +2B7ZSnIIc0okAAAKJQABACWHHwcAIKEjIEAECiYAATEE7/GkwOB48cDOC8/xocEIdlpxOnIac4h3 +Pgsv+6h1gODMJiKQCvLPcIAAcLCvoNIPb/kD2BPwiiBZBq4KL/nJcUDFyXBKcSpyANuYc7hz2HcG +DKAACicABNkD7/GhwAjZ7HAgoAPZANrPcKAAFAQloAHI7HEAoc9woADUC02g4H7gePHA4cXPcIAA +jgcgiM9wgABku/QgQACkwQ95YMBKCi/5iiBLA89wgABotAWAz3WAALQ4wLgBHAIwCYUA2QIcAjAI +hSmlKKXPcaAAyB8DHAIwAdgToRmBg9pCwBiBHttBwM9wgACQOj2ACYA4YEPAi3AQ2YIJ7/8YuwAU +hDALEgE3z3OAAMQHXpWD2OILoANgg0UD7/GkwOB48cDPcIAAjgcgiM9wgABku/QgQAClwQ95Y8DP +cIAAaLQFgMC4DRwCMKYJL/mKIAsDAdvPcaAAyB9zoRmBANpBwBiBDhyCMEDAFYEPHIIwRMMU2ULA +i3CC2h7bAgnv/xi7z3KAALQ4DBSEMAsSATfPc4AAxAdekoLYWgugA2CDpcDRwOB+CMiHuAgaGDAJ +yJu4CRoYMArIChoYMAvIh7gLGhgwDMgMGhgw4H7geM9xgABAlACBgbjgfwCh4HjPcFhYWFjPcaUA +TBWxGRgAz3BwcFhYshkYAM9wAAQWoLMZGADPcDEIU7S0GRgAz3ACAJ1QtRkYAM9wMAQRgLYZGADP +cEEJPfC3GRgAz3ACAKl0uBkYAOB+z3GAAECU4H8DseB4z3GAACBW4H8AoeB4z3KAADA5FXogopkA +L/mKIJIO4HjxwJhwCiHAD+tyCiXAB89wAACiGbUBL/Ne2+B4z3KAAAw5FXogomkAL/mKINIO4Hjx +wJhwCiHAD+tyCiXAB89wAACjGYUBL/Nm2+B4z3KAAEQ5FXogojkAL/mKIBIP4HjxwJhwCiHAD+ty +CiXAB89wAACkGVUBL/Nu2+B48cCkEAEA+bkE9H4Ij/gH8CDZz3CgAMgcKaAD2c9woAAQFCWg0cDg +fuHFA7g1eM9xgACYXQJhSiQAdADZqCDAAhYiQAChgGCAKdgSuAHhdXigoOB/wcXgeM9wgADIHSOA +ocEwIYAPAAB0BSh0gCQVHYa4AKTgf6HA4H7geM9xgAD0BuB/A6HgePHAggjv8dhwz3CAAMgdA4AY +EIUATCUAgQz0CiHAD+tyiiBNBIojhQadAC/zSiQAAM9wgABwsAqAgOBH8s92gABUWQCGQiAAgMog +YgCA4D30TCYAgA70CiHAD+tyiiBNBIojBQhKJAAAXQAv8wolgAEFhgOAz3egALAfoIAbh89xgAAQ +ztW4HWUlgUImQAAFKT4AJ3WKIAkO8g7v+KlxO4eKIAkO5g7v+Da5yXCSCKABQiWBEs9wgABsWQAl +gR8AAIgTfgiAASUAz/HgePHAtg+P8QolAIAN9AohwA/rcoogjQSKI4UN4Qfv8kokAADPd4AAhFkF +hwOAAIDPcqAAsB/bgkIlQwDPcoAAEM5TJk0VRYIdZQUq/gAndQIlAxCMIxeHNr6gdkr3z3CAAJiX +AYAFKL4AJ3UeZoDhCPLPcIAAlDcTgIHgJ/QCDI/4gOAS8s9wgABoIyyQz3CAAMgdHpAQcQjyAiWB +HwAAAAzpcAXw6XBCJQEVyg9AAc9wgACcWQAlgR8AAIgTtg9AAYogyQ4Z8M9wgAC0WaYPYAFCJQEV +z3CAAMxZACWBHwAAiBOSD0AByXHJuc9wgACYlyOgiiBKAMoN7/jJcc9xgAAQzgaBgbgZB6/xBqHx +wK4Oj/HPdYAAVAfMjQ2Nwr7CuBZ+z34qCa/8DdgGuIG4EL7FeM9xoADsJwahBIXPcaUA6A8GoQWF +B6HdBo/x8cBqDo/xz3alAOgPJoanhs9wgABUBwDfJKCloOYIr/wN2Aa4gbjPcaAA7CcGoeamRSXN +H6emnQaP8eB4z3GAALwgz3CAALgGAJBaiRByFfTPcIAAugYAkFiJEHIN9M9wgAC8BgCINokQcQf0 +z3CAABwuAIAC8ADY4H7geOHFn+HhxgDdGPKe4QP2gOFD9gDYFPCf4R/eSvZOIfwH4HioIIABDyWN +E2G+ESBAgAPypXgC8KZ4AKIB2MHG4H/BxeB48cCqDa/xKNhmDQ/5z3aAAEwuQIYIcQh1hiH8AwDY +YHokuUCGRCUBEwHYYHoiuUCGAthgelMlQRA2DS/5ANhAhgh3QSgBAgPYYHrAuUCGQS9BEgTYYHrA +uc9xAABIwc9wgABILiCgz3ABAKjHAKbPcf7KAgA+DO/4iiCSD5UFj/HxwGIMD/xWD8/7z3EAAHDB +z3CAAFAuugmv+yCgz3EBANjHz3CAAFQuIKDPcf7KAQACDO/4iiCSD9HA4H7xwPIMr/FQ2KoMD/nP +dYAAXC5AhQh2ANhgelMmQRBAhQHYyXFgeoYh/Q/PcQAAlMHPcIAAWC4goM9wAQAIyAClz3H+ygMA +sgvv+Iogkg8RBY/x4HjxwOHFdggv+gfYYgqv9Ah1ygrP+5oPz/8aDg/8hg/v+alw8QSP8eB48cBy +DI/xz3aAANQ5EY6A4M93gADIHQf0A4cNkD+WEHEd8k4Ib/kT2AOHAN2xrrKuDgogAA2Qz3CAAEgu +IIBgeQTYgOAK8oog2Amr2S4L7/gEuZ4Kr/sC2L+2iiCQDB4L7/iKIYwPdQSP8eB48cAGDK/xmHDP +cYAA1DlsiQDdQCECCkokwHDgeKggQAMRI0CDB/TPcP8A//8VIkwDAKQB5a99a4GqgXB1DIHV9hB1 +z/YQcwLbyiApAMolaRDKI2wAyiAsAMolrBAU8AHbAtgA3RDwEHPL9hB1AN3KI6kAyiBpAAj2AdgC +3QPwAtgB3QDb8CLPAPAiRQPwIgAAAiXOA82hAiBAAQ6hANgPIMAAPBkCAA8gQAM9GQIAwQOv8QAc +wgDgePHASguP8Qh1z3CAAMgdA4DPdoAA1DkJgCW4UyAQABuOgeDRJSGQC/QA2Buu7gggAKlwvg8g +AAHYWfAflhB1V/KKIJAJEgrv+KlxEY4B3/GuE67KCCAAqXBRJQCQBPQRjoTgDPTPcQICAgLuCe/4 +iiCQDG4Oz/9P8BOOgOAA2TP08a6sHkAQMq72rveuCtgYrgXaWa5Q2BquANiOuAimCaYHpgPYQB4C +EATYQR4CEEIeAhBDHoIQRB6CEEUeghAG2EYeAhBHHgIQSB4CEEkeAhAI2EoeAhAM2EseAhAy2LQe +ABDuCSAAsB5CEBGOgOAT8gTKkOAP9EwgAKAN8gyOM2gleA6uDa60FgAQ9g0gALgeAhCdAo/x4Hjx +wDIKr/FKJEAAGnDAuIHgwiQCAQpyhiL+A0S6CnGGIfEPgODPdYAA1DlHuQX0H5VRIACAA/QA2ALw +AdiyHQIQRCCAIxx4CHMMrQQgji8AAAAMSr64dtStBCCPLwAAADBMv/WtBCCOLwAAAEBOvrEdghNT +IL6AyiHBD8oggQ8AAJEayiOBDwAAPQHKIsEHIfJMJACALvIEI0AAEHHKIcIPyiCCDwAAkhrKI4IP +AABHAcoiwgcN9AQhgAAQcg/yCiHAD+tyz3AAAJMaiiMFAookww+pAe/ySiUAAIDiRvQKIcAP63LP +cAAAlBqKI0UC8fGD5wT2gOcL9gohwA/rcs9wAACVGoojxQPj8bB3hPZMJQCAC/YKIcAP63LPcAAA +lhqKI4UE1fFTIAYARCCOAC8kgQMAJI4BhiD/DkK4HmbPfrB2RPbUrbh28XZE9tWtyXeC5kX2ANix +HQIQsHcRjQb0gOAE8gTYEa3RjYHmzCYikMwmIpEF9BNrZXgOrQ2tgOLMJiKRBPITakV4Da2A4cwm +IpEF8hNpJXgOrRNrZXgPrQ2NEK3eD6ABANjtAK/xPh0EFOB48cB+CI/xz3agALAfG4YA3891gADU +OVMgUAUC2BGtO4ZqD6/4iiAQCg+N4KXhpeKlhiD/AVtoDo2sHcATAdmGIP8BQ7gQcjKtA/QF2TKt +B4UScND3gbkuDCAAMq3PcYAABDwWgQHgFqE7hoog0AoH8OYLAAA7hoogUAwSD4/4ZQCP8eB48cD+ +D2/xiiAQDaHBz3GgALAfO4EA3vIOr/hgxgoMAADaC+//i3DPdYAA1DmwFYIQgOJAJQEaBfQUFYQQ +EPAgwHqN8CEPAAGFBSj+ADd3NvYB2BStsB2CE5hwyXKA4swkYYAR9CDA8CECAAGFOo0FKH4AN3LH +9gLYFK0B2bAdQhCYcEwkQIAe8kwkgIAQ8kwkwIAj8gohwA/rcs9wAACYGoojSwqdB6/ySiUAAAGF +OY0FKT4ADYU3cAT3PRWAEAjwsRWAEIDg+/U8FYAQM2gleA95Da0P8AGFOY0FKT4ALYUvIEAOEHEu +9y6FMHCn9z/ZLa0VFYQQTCRAgBTyTCSAgCDyTCTAgBHyCiHAD+tyz3AAAJkaiiOMAykHr/JKJQAA +PBWAEBDwAYVZjQUqPgBNhS8gQA4Qcgb3ToVQcD/YRvc9FYAQU2hFeA6tvg2v+IogEA0ujQ0VhRAP +jQUhQQEleIYg/wEMFYQQQ7gLJACAyiLBB8oggQ8AAJoayiOBDwAAHAPABqHyyiHBDwYgPoHKIsIH +yiCCDwAAmxrKI4IPAAAdA6AGovLKIcIPvQZv8aHA8cBSDk/xz3aAANQ5Fo4hhhBxR/cXjiKGEHFi +AAUANg7P/89wgABILiCAz3WAABQ6YHkE2IDgDPLPcQAAsLAaDa/4iiDYCYYMb/sC2ADYDaYOpgCm +AaYCpqweABDPcaAAsB87gfIMr/iKIFAKkgkAAA2GCGW4HgIQJfASjqG4OI5AhjByz3WgALAfEq6H +98IJAAA7hYogkAoT8DuFR4bVuVBxSveBuKoJIAASrjuFiiDQCgfwbgkAADuFiiBQDJoMj/j9BU/x +4HjxwOHFz3WAANQ5Eo1RIACBCfINjRCtvgygAQHYEo2kuBKt3QVP8eB48cBaCS/5E9iKINAHWgyv ++D/Zz3GAANQ5UYmA4hnyz3CAAHCwAoBCIACAyiBiAC8mB/AP9IPiCvS4EYAAgOAJ9J4Mz//RwOB+ +yg7P//zx/PHxwA4NT/HPdoAA1DkSjlEgAIBT8s9ygABssj+C5rkL9ACShiD8AIwgAoBH9FEhAIJD +8gCGAeAApg+OhiD/AZoSjQBDuLFwOfQA2awWBRBKJMBwVhIEAaggwAXPcIAAvLI0eGCIESVAkEAk +DwtALYAAFHg1eNhgBfLg48InxRDzoAHhQCVAAMK4rB4AEAGGAeABpgCShiD8AIwgAoAE9AKGAeAC +poog0AduC6/4iiESAn4IL/kT2MEET/HgePHAA9nPcIAA1DkxqADZMqgtiFCIMHIG8jCohgugAQHY +0cDgfvHAAtjPcYAA1DkRqRKJgLijuA94obgSqQ2JUIkQcgbyEKlaC6ABAdjRwOB+8cAC2M9xgADU +ORGpEolFIEACEqkPiVCJEHIG8hCpMgugAQHY0cDgfvHA2gtP8c9ygADUOQGCFhKEAAkkBABMJACA +BfJMJACCzfcKIcAP63LPcAAAlxqKIwgH7QOv8kolAAIA22qiTCQAgGuibKLX92h3aHVocRJpFHge +YtOGAeHfZx5i1IZYYBWA22MveZBxHWWsorH3a6LqotEDT/HgePHA4cXPcYAAyB0jgS2RAdvPdYAA +1DlTIQIAgeJbjcB7G60OIgKAyiJiAIDjzCJhgAXyshWCEIHiHPSB4ADash2CEBX0EI0tjRBxUa0E +9EAlQhME8EAlghMVjQnZguAtrUL2Lq0AihCtBPCuD6//KHBpA0/x4H7gePHA7gpP8c92gABsBs91 +gABYKQOG8CUAEEB4gOD78z0DT/HgePHAxgpv8QDbocEEuM9ygAAwzhR4HmKQ3RpiAYIYvaimiiUE +Es9y/v//P6mmBHqA4UDCyiXBAAvyCIEEIIAPAAAAMEIgBYDKJWIATCUAgCHyqIENkQQljR8AAAAw +LL2GIH8MYb0ceEAlgRMRIECDDyJCAEDCQ/QKIcAP63I+2Iy4iiMKBookww+BAq/yuHXPcIAA1Dkb +iIHgzyKhAy7yz3WAAAyxz3OAAGyymhOBAAONCyEAgCDyTBONAADfANtTJUEQDyNDAEQlARNCuQ8n +TxCGJf8TBCcPkADZRL0Eew8hQQMkeMonARCA48ojwQMOu2V6BPABhQV6QMLPcIAADLFAgItxhiL+ +AyS6YIEOugQjjQ8BAADACyWAkBby13UAAABAzCWCnwAAAIDMJYKfAQAAAAT0AYAD8AKArruvu7C7 +ZXgAoQAUBDAEJIGPAQAAwAr0CiHAD+tyRtiMuK0Br/KKIwsBCIYuuUApAgYEHgARRXgIpoogBQYJ +ps9wgADAsgSIgOCKIAUOyiCBDwAA2AEJpslwBguv/ADaAdgArpEBb/GhwIDi4cXhxlbyQCLDAyS7 +w7oC8ADaj+KWAA0AMyaCcIAAWF5AJw1zVH0gfcCIARmSAwHgARCCBAEZkgABEIIEARmSAAEQggQB +GZIAARCCBAEZkgABEIIEARmSAAEQggQBGZIAARCCBAEZkgABEIIEARmSAAEQggQBGZIAARCCBAEZ +kgABEIIEARmSAAEQggQBGZIAARCCBAEZkgABEIIEARmSAAEQggQBGZIAQiNDgLP1wcbgf8HF4HiA +4uHF4cYk8mNqIrvBugPwANqD4hn3MyaCcIAAVF5AJw1zVH0gfcCABBmQAwTgBBACBAQZkAAEEAIE +BBmQAAQQAgQEGZAAQiNDgOT1wcbgf8HF4HjxwBoIb/FTIUIATiINAc9yoAAUBMmCANsOJoIfAAAA +BlBxyiHGD8oixgfKIIYPAADGIsojhg8AAEgCyiRmABwApvLKJcYAgOHKJE1wyiLNAOggLQJOYM9x +oAA4BAHiyKmB5Q7yguUI8oPlDvTPcKAAOARoqM9woAA4BGioz3CgADgEaKgBAE/x8cBuDw/xunB6 +cfpymnMKIgAhCiFAIch1CiDAIQogQIPPcYAAHMbKIGIACHcFuAhhTCMAoAS4hiD+AwV/yiHMD8oi +zAfKIIwPAADBIcojjA8AAPIAyiRsAHgHbPLKJcwEUSCAwQ7yz3CAAJilgNkooAzAgOAD8kB4hfCW +C0//g/DPdoAAiFsBhgDZZg7v8jjaAIYc2SCgAYYY2SCwz3GAAMgdFSFWAwAWASAzgfCoz3eAACwI +KBgABKS5IaAA2TMYQgDpcSKgCiFAgzEYwgQyGMIENBjEBcohYgBSDi/3DOCA5Qb0z3GAAACmBfDP +cYAAIKYjps9wAABIEQCxTCVAoBjYAqYE8oogBQIAsQzAgOAE9M9wAQCsxQGnABYAIK8QAAZRIACA +F/JBhhrYALICpgCRh7gAsQDYC7EBgkwkAKCtuAGiB/LPcIAAlDcEgDMaAgBMIgCgFPIhhgGBmLgB +oQOBn7gDoc9xgADQBwAWACAAGUQEQIABgEGhAqFGDi//yXA1Bg/x4HjxwOYND/G6cHpx+nIKIgAh +CiFAIch1CiTAIQohQIPPcIAAHMbKIWIAKHIFuShgTCMAoAS4hiD+AwUgkADKIcwPyiLMB8ogjA8A +AL8hyiOMDwAAlgDKJGwA8AVs8solzAQMwIDgDPQKIcAP63KH2Aa4l9tKJAAA1QVv8rhzUSCAwQny +z3CAAJilgNkooAzAQHhp8M92gACIWwGGAN/pccoM7/I42gCGHNkgoAGGENkgsM9xgADIHRUhVgMA +FgEgM4EzGMIDz3eAADQIEBgCBKS5jbmZuSGg6XEioAohQIMoGAAFMRjCBDIYwgQ0GMQFyiFiALIM +L/cM4IDlBvTPcYAAAKYF8M9xgAAgpiOmpNgAsUwlQKAQ2AKmBPSk2Iy4ALHPcIAAyB0ZkI64j7gB +sUwiAKAMwAGnFPIhhgGBmLgBoQOBn7gDoc9xgADQBwAWACAAGUQEQIABgEGhAqHeDC//yXDNBA/x +4HjxwOHFz3WAAHA9AI2MIMOPD/TPcoAAPFkFggOAIIDHcQ8AAKA2DeAASHD+2ACt6QQP8eB48cBu +DC/xANjPdYAAkMhKJAB0gN6oIEAFCHEB4E8gwgEWJUMQR6uKIggAQClEAQAkgQ+AABDGQKEA2kKx +xqnA2H8dAhDPdYAASAfArc9wgACQxYDZdgvv8ihywa3PcIAAlCPJqM9wgAAcHnEEL/HFqAkAIAAA +2OB48cDyCw/xocEId+YPr/gW2M92gACQOiCGAYaA4cwgIYAr9M9woADUCxiAAN1CIAAIgODKIEwD +jCAHikj3thYAFgHgth4YEB3wndgAHAQwC8zpcQIcBDAB4BB4BCCADwAA/7+PuAsaHDAAwB7aTggg +ABi6oaYF8IDgA/JhuAGmDggAANkDL/GhwPHAz3CAAMgdA4AYiIXgD/TPcAEAoIZGDIACJg8P9ghx +z3CAACxaAgzAANHA4H7gePHAMgsP8Qh3GnE6cs92gADIHQOGz3WAAJA6FJAQuEIP7/cCpYDgyiAi +IIUhBylPIUAnn7jscQCh7HDgoAOGCIBRIACABPIChYG4AqXPcIAAvAYAiIDgBfQChYO4AqXPcKAA +LCAQgM9zgAAYPG8dGBBKJMBwANioIIAFz3GAAMAGIImA4QzayiIhAEQovgPPcYAAwNUncjMhgQAc +YwHgIKxAJQ4Swguv88lwTCAAoAfyAoUA2YC4AqUD8Ioh/w9kFQ8WZRUEFgDaB/DscwCjJHgEHhAQ +AeL34gCGuffPcqAA1AsNoiR4AKZkHdgTZR0YEQDYoQIv8dwdABDgePHAz3KAAGwGAoIliIDhAdgG +8gjZZg9v+CuiCPDPcYAA8CiSDO/xAKHRwOB+8cASCi/x2HA+CCAAAN3JaIDmlvb4cKl3MiaAA7Dg +iva54Aj2lgmP9DJvOHgFfQHnQidHAEwnAIBhvjD3PQIv8alw4HgIcgPwAeAgiIDh/vXgf0J48cDC +CQ/xz3WgAPxEHYU5hWoL4AIA3gDYnrgBpeB4waXFpQ0CD/HgePHACiHAD+tyiiANC4ojigZKJAAA +xQFv8golAAHPcaAAyDsOgYi4DqFpIEAA/vHgeOB+4HjxwF4JD/HPdYAAcLAvhUogACCA4cohwQ/K +IsEHyiCBDwAAviHKI4EPAABIAMokAQR0AWHyyiXBAM9wgAA8HECIz3CAAJilYHlIoDwdABQSDa/4 +A9htAQ/x8cAOCQ/xtgngAAh1gODPcaAAyB9FhQ3y9BEOAAKAZIXEekV79BnAACKFAKEK8PQRAABE +ePQZAAAc2Bi4FRkYgDkBD/GA4AHZwHnPcIAAbD3gfyCg8cC2CA/xz3CAAEguIICiwWB5BNiA4OYC +AQDPcYAAdBwAgQHggeAAoRD0AdjPdaAAyB9RHRiQIN7QpUMdGBAA2IYJ4AKNuNGlTgxv+QXYz3WA +AAA4DqXPcYAAdBwAgQHggeAAoRD0AdjPdqAAyB9RHhiQIN/wpkMeGBAA2EoJ4AKNuPGmA9heD+/x +qXEE2FYP7/EibQXYTg/v8SRtC9hGD+/xJm0P2D4P7/FAJQESNtgyD+/xQCWBEjfYKg/v8UAlARM4 +2B4P7/FAJYETz3enABRICIfPcacAmEcEpQ2Hz3KrAKD/BaUOh892oADsJwalHIEHpReHCKUWhwml +GIILpRmCDKUagg2lz3AFAMYDBqbG2JC4BqbPcCwAAgEGps9wWgBCAQamiiCLAAamz3BAAIcNBqbP +cNEAwg0Gps9wwAAHDgamz3CAAHQcAIDPcoAAdBxCIECAAKIG9M9yoADIHADYEaIB2AinANgNpw6n +z3BQAP8AHKEB2BenANgWp/zZz3CrAKD/OKBz2TmgGoDPcasAoP+BuBqhz3AqAAIOBqaLcLoMIACB +wQDBz3CAAPSVNKUyoAHBL6DPcBoAAg4GpotwmgwgAIHBAMHPcIAA9JU1pTOgAcEwoM9wJgACDgam +i3B6DCAAgcEAwc9wgAD0lTSgNqUBwTGgz3CAAHQcAIAB4IHgz3GAAHQcAKEY9AHZz3CgAMgfURhY +gCDYz3GgAMgfEKEB2EMZGAAA2JoPoAKNuCDZz3CgAMgfMaABlRC4hSCEAAamApUQuIUghQAGpgOV +ELiFIIsABqYElRC4hSCPAAamBZUQuAUggA8AAIINBqYGlRC4BSCADwAAwg0GpgeVELgFIIAPAAAC +Dgamz3CAAHQcAIDPcYAAdBxCIECAAKEH9M9xoADIHADYEaEEhSuFCKcFhQ2nBoUOpwiFF6cJhRan +z3CrAKD/OKAshTmgLYU6oOoIb/kOhc9wgAB0HM9xgAB0HACAQiBAgAChB/TPcaAAyBwA2BGhJQbv +8KLA8cC6Dc/wfggAAM92gADQW7IN7/YAhgh1AIYQdQryugrv+qlwfgsv+6Cmpgnv8xHYtgwP9s9w +oAAsIDCAz3CAADwH5QXv8CCg8cC6D+//ocHPcIAAdD0AgATZYtoe20DAi3DqC+/+GLuhwNHA4H7g +ePHAQgmv+BTYANjRwOB+4HjxwDIN7/AH2A4JT/nPdqAAtA/8hhpwANgcps9xoAAsIDCBHgwv+Iog +kQXODw/7z3WAAHQ9ugtv+wClQIXPcYAAvFsAoc9xgAAEPEehBgsv/Aih/KbqDy/5CnDPcIAAUBwA +iIHgJPRAhYogRATPdYAAQBwjhRpiOGAQcgHYwiAOAIDgD/KKIBELtgsv+ADZfg4v9ATYAIWyDm/7 +A6UG8F4OL/QE2AKFA6ViCoAC6QTP8PHAz3CAAGw9AICA4B30rgiv+BTYgOAZ9M9wgABILiCAYHkE +2IDgEfLPcIAAJC5ggM9xAQDo4wvYYHsE2moIr/gU2NHA4H7PcYAAyB0AgboQAAZRIECBCPQBgboQ +AAZRIECBCfI6CO/zE9g2CO/zEdjp8enx8cAOCK/4FNhWDs//z3GAAMgdAIG6EAAGUSBAgQf0AYG6 +EAAGUSBAgQTyAgjv8xPYz3CAACAuIIBgeQvY0cDgfvHAz3CAAAgYAIDPcYAAPAcbeMoIr/QggYDg +CfIB2c9wgABQHCoP7/8gqNHA4H7gePHAogvP8Ah3fdgNuM9xgAAQzsWBugzv8MlxjCACgM9xgAAM +GADdh/cdeIwgAoAB5Xz3AChCAwUqvgPPcoAACBgWuAChgOfPcYAAcD0AGkAOA/T/2ACpAImMIMOP +qA6B/6kDz/DxwCYLz/B6cJpxSHcacwolACEA2s9xqwCg/1mhB9gaoVihIN7PdaAAyB/QpQHYQx0Y +EADYGgygAo240aUZ2c9wpwCYRzqgygqv+x7Yz3KnABRIHYK+gmwSEQBwEhIAAKcAGEAj97jFIIIP +AP8AANMg4QX3vcUlgh8A/wAA0yXhFc4LL/aKIRAACHapcMILL/aKIRAACHVAKQAitgsv9oohCAAI +d0AqACKmCy/2iiEIANF5GeEseS9xsXoZ4kx6L3IwdwAbgCMAHEAjhPYA2AXwUHB+9gHYoQLv8AAd +AiDgePHAWgrP8Ah3GnEB2c9wpwCYRzqgIN3PdqAAyB+wpgrYQx4YEADYSgugAo24sabPcKcAFEgs +gD2AABhAIPe5xSGCDwD/AADTIeEFdQLv8CCn8cAKCs/wz3KAADilooKMJcOfNfL/2SKihC0IGKCg +ACGPf4AA3KAEj4DgCiBALhL0AofPcYAAdClyDa/yIIEIcc92oADIHxWGDgnAAIDgBPQB2Bbwz3GA +APQoAo+gqQGpAdgTphyGAaGqDi/4AdgA2AAggS+AAPiiAKkA2PEBz/DxwOHFz3WgAMgfFYU2DM/+ +FRUAlpC4Hh0YkNIP7/4A2OUBz/DxwG4Jz/AIdc9woACwHzuAiiBJDl4IL/g2uYogSQ5WCC/4IoXP +cIAAyB0DgBgQhQBMJQCBDPQKIcAP63KKIM0EiiMGDmkBL/JKJAAAz3GAAAg3CYGE4ET3AeAJoc9x +gAAQzgaBRiBAAQahz3aAAFAHAIaC4B70iiDJB4olRxL2D+/3qXHPcYAABDTAEQAGv+AG2kn3cmh0 +eztjoKOghqGjQqMB4MW4wBkYAP4M7/kG2LIID/wlAc/w8cDhxQh1z3CgALAfO4CKIIkOqg/v9za5 +iiCJDp4P7/cihc9xgAAQzgaBgrgGoaYMb/gC2PUAz/DxwOHFCHX/2c9wgAC0oCCobyBDAJYKL/IB +2c9xoACwHzuBYg/v94ogzA0FhQOAQoUggIogiABOD+/3Qnm1AM/wUQSv8xHY4HjxwDYIz/AIds91 +oADIHzWFiiAJDyYP7/c2uYogCQ8eD+/3IobPcIAAyB0DgBgQhABMJACBDPQKIcAP63KKIA0FiiNH +DDEAL/JKJQAApBUBEM9wgABsVpoIoACWIUEPz3GAAHCwDIGA4AryBYGA4MwgYoAG8toKIAAA2DDw +rg/P+89xgAAQzgaBRiBAAQahz3WAAFAHAIWC4B70iiDJB4omCBOaDu/3yXHPcYAABDTAEQAGv+AG +2kn3cmh0eztjoIXAo6GjQqMB4MW4wBkYAKIL7/kG2NYKD/rJB4/w8cDhxQh1z3CgALAfO4CKIEkP +Tg7v9za5iiBJD0IO7/cihc9xgAAQzgaBgrgGoUoLb/gC2M9xgABwsAyBgOAN8g2BgOAJ8gWBgODM +IGKA5AoiAMogIgB5B4/w4HjgfuB48cD6Do/wosGA4MohgQ+t3q3eB/IlgCOBIIECgAJ54g3v94og +Tw3PdYAAfBwBhYHgDPSKIE8Nyg3v94ohRgwA2NoJL/cBpWDw9gkP94HgAdjAeC8mB5AP8oogDw2i +De/3iiGGDwHYzg5v8gal3g0v9wLYzgkP94LgDfIKIcAP63KKIN8FiiPHAYokww+tBu/xuHOKCQ/3 +z3CAABDOBZCA4GQADAAKhUHAC4X6Ci/3QMCA4AnygObKIIEPAABAAOQOQfmLcAjZlNoe28IMr/4Y +u4ogjw4qDe/3iiGHB4ogjw4eDe/3K4WKII8OFg3v9yqFgOYI9HYOD/c6Dk/yAdgHpQDYC6VhBq/w +osDgePHA4cUIdQWAA4BChSCAiiAPC+IM7/dCec9wgAAQzgWQgODF9kIMD/cD8P4LD/cOCCAAqXAt +Bo/w8cC2Da/wiiAPCrIM7/eKIYUIUgmP94Dgz3WAAHwcF/SKIM8Olgzv94ohxQkB2AGlz3CAABDO +BZCA4MX2fgwP90Pwfg7v/wDYP/ALyAQggA/+//8DCxoYMAvIh7gLGhgwC8iQuAsaGDCiCe/wAN52 +DI/3Yglv+AjYJIXPcKAALCADgMdxAAAAFCJ413AAgAAASPeKIA8KJgzv94ohxgDDpVoIL/fCpYDg +XAwh98ogYQDPcIAAEM4FkIDgyiCJDwAAQADIDUn5XQWP8OB48cDqDI/wCHbPdaAAyB81hYogigDa +C+/3NrmKIIoA0gvv9yKGz3CAAMgdA4AYEIUATCUAgQz0CiHAD+tyiiBNBYojSQPlBO/xSiQAAKQV +ARDPcIAAbFZODWAAliFBD4ogyQeOC+/3K2jPcYAABDTAEQIGiiUJF7/iBttM9xJqFHg4YKCgz3WA +AFAHoIWhoGKgAWrFuMAZGACKCO/5BtgB2c9wgABwsC2gz3GAABDOBoFGIEABKgzv+wahnQSP8OB4 +8cAmDI/wCHXPcKAAsB87gIogygAaC+/3NrmKIMoAEgvv9yKFz3CAAMgdA4AYEIUATCUAgQDeDPQK +IcAP63KKIE0GiiNJDSUE7/GYds91gAAQzsaliiBJCIonyR7SCu/36XHPcYAABDTAEQAGv+AH2kv3 +cmh0eztj4KPPd4AAUAfgh+GjQqMB4MW4wBkYANYPr/kH2AaFgrjuDS/5BqXPcIAAcLDNoKIPL/gC +2OEDj/DPcIAAbFa5A0AA4HjxwIoPL/gR2M9woACwHzuAz3CAAGQTIKDRwOB+CHIA2HUA7/YQ2eB4 +CHIB2GkA7/Yg2eB4CHIC2F0A7/ZA2eB4CHFxAO/2ANgIcWkA7/YB2AhxYQDv9gLYJQaP8fHALg8v ++BLYggnP8dHA4H7xwM9xgADEB4ogCwb6Ce/3IIEODy/4Eti+C2/5BNj/2c9wgAAEOSCg0cDgfvEG +L/gW2OB48cD/2c9wgABwPSYOb/8gqOoOj//RwOB+8cCuCo/wz3WAAOwoABUQEIwgw68I8oogDA2i +Ce/3iiFHACLwgOAT9M9wgAC8pGAQBAAKIcAP63LPcAAAhwyKI4cBtQLv8QolAAQIcYIhCADPcIAA +3KAOIEAApguv8IohCAgacM9wgADYqBEQAoaMIsOP/9kF8hoYGIQgpQvwERgYhCClANnPcIAAbAYk +oJoOz/eBAo/w4HgB2c9wgABsBiSghQbP9+B48cDhxc9wgACkWgWAI4AggQIJ7/eKIJULzg4P8oXg +GvLGDg/ygOAW8r4OD/KB4BLytg4P8ghx3gjv94ogFQqqDg/yz3GAAGQuFXkagQHgGqHPcIAAaCMs +kM91gADIHR6VEHEc8gvIBCCAD////8MLGhgwC8iHuAsaGDDqDY/wAIW6EAAGUSBAgQjyz3CAAGQu +AIDruAbYA/II2PIPD/KODS/4CdjdAY/w8cDhxc9wgABcIxSIh+As9M9wgADIHQGAHt22EAIGgOIv +KIEAAiUBEBHyjuEI8hVpz3OAAB3GCGOA4AvyECJCgC8ogQACJQEQ8fUB2ALwANiA4BnyGg5P94Dg +WAkiAMogIgAR8G4LT/fPcoAAZC4ggoDgobkgogfyWgtP94DgPAqB9lkBj/DgePHA4cXPcIAAfC9Q +iDKIRCo+CwAhgH+AAAwvNXgOiM91gABkLoHgFvTPcoAAyB0AgoohFQUk4CBghiB/jgr0AYIk4CBg +hiB/jogO4f/KICEAAIWquP0Ar/AApeB48cB2CI/wCHfPdYAAYDBQ3AIlARMieLYJr/AY2RpwQiUD +GAS4ACCRD4AA2C8cEQIgIodAKMAgFHh4YAIJYABZYQAgji+AAOwvAI6A4Nb2jCDDj0X2YbgPeACu +gODO9lDcAiUDEyARASBCh0AowCAUeHhgyghgAFlhdgpP94DgAdkirgfyagpP94DgTAmB9kkAj/Dg +ePHA4cXPcYAAQDAieCoJr/AY2UoKb/cIdQAlgR+AAO4vgOAA2kCpB/QyCk/3gOAoCYL2MQCP8OB4 +8cCuD0/wz3CAAKRaBYAjgCCBqg6v94og1Qt2DA/yguAZ8m4MD/KA4BXyZgwP8oHgEfJeDA/yCHGC +Dq/3iiDVCE4MD/LPcYAAZC4VeQ6BAeAOoT4MD/LPdoAAyB3PcYAAaCOE4EyRPpYP9DByC/TPcYAA +ZC4AgYYg/4EF9AGBguBy9O4JT/HPcIAAaCMskB6WEHEJ9M9wgABkLgCAhiD/gQPyAdgC8ADYGnDP +cIAAjFqWDe/zCnHPcIAAXCMUiIjgD/QA3wLdE28UeMdwgABAMHYN7/MKcWG9gOUB5zX3RglP9wh1 +z3CAAGgjLJAelhBxCvTPcIAAZC4AgIYg/4EE9IDlD/QLyAQggA////8rCxoYMAvIh7gLGhgw8gqP +8M9wgABcIxSIiOAY9M9wgABoIyyQHpYQcQn0z3CAAGQuAICGIP+BCvIBhroQAAZRIECBzCUikArY +A/QJ2NoMD/J2Ci/4CditBk/w8cDPcYAAZC5IEQIGg+JQAA0AMyaCcIAAKF5AJ4ByVHgAeJgRAAAB +4JgZAAAI2BbwnBEAAAHgnBkAAAXYDvCgEQAAAeCgGQAACdgI8KQRAAAB4KQZAAAC2HIMD/IOCi/4 +CdjRwOB+4HjxwN4NT/AIds9wgACMWgWAI4AggdYMr/eKIBULz3CAAFwjFIiH4CYCAgCA5lPyz3WA +AGQuRxUAFoDg4oYV9M9wgAB8LwKIgOAP9gohwA/rcs9wAAC/G4ojhw9KJAAAyQWv8QolAAFhuIYJ +r/FHHRgQBgmv8elwz3CAAOwHAIBHFQEWIqhHFQAWgOAl9AYKT/eA4A/yiiAVBFIMr/eKIYgEz3CA +AOwHIIAEiYC4BKnPcIAAfC9QiDKIRCo+CwAhgH+AAAwvNXgOiIHg6A6h8sogwQPuCQ/yhODEDwHx +4gkP8oLgGPLaCQ/yCHECDK/3iiAVCc4JD/LPcYAAZC4VIQIAAoIB4AKiAIGHuA0CIAAAoYDmCPLP +cYAAZC4Agae4AKELyJC4CxoYMBIJj/DPdqAAOC4HhoYg+AOMIAOMD/IcFgQQCiHAD+tyz3AAAOQb +iiPJANUEr/FKJQAAz3OgAJAjHINRIMCAEPRwEwQACiHAD+tyz3AAAOUbiiOJAakEr/FKJQAAzgvP ++Q4PT/7PcaAA0BsTgZC4HKHKCi/yA9jPd4AA7AcghwKJgOBN9ASJUSAAgEHyiiCVBDILr/eKIQkH +z3CgAEguq4DTvQeGz3GAAFwvpHgQoYogFQwSC6/3qXGKIBUMz3GAAFwvAguv9zCBB4ameAem1glg +AhDYZgov8gTYB4bPcQAAQB2IuAemog/v9w3YC8gEIIAP/v//AwsaGDALyI64kLgLGhgwDgiP8ATw +Mgov8gLYIIcEiaC4BKlq8CIKL/IC2Gbw4obPdoAAZC5HFgAWgOAQ9M9wgAB8LwKIgOAK9gohwA/r +cm/YBrjrBe//iiPKBWG4dg9v8UceGBBHFgAWgODACKH1yiDBA891gABgMIgVgJCA4B7yihWAkFEg +wIEa8qoND/eKFYGQGnAAhsa5CrmBuACmz3CAAFxa3gsgAPlhTCAAoAb0hg0P94DgeAxC9noND/eA +4AfyXRYAFgHgXR4YEEcWABaA4BL0LBWAkC4VgZBEKD4LACGAf4AADC81eA6IgeCkDKHyyiDBAy0D +T/DxwMoKT/AId89wgACkWgWAz3aAAGQuI4AggboJr/eKINUKAofPdYAAfC9wjUkeGBDPcIAAFy9E +Kz4LMiBEDhKNQiRBABBxANrI9kAgRQAvJUcBEh1CEQTwUq24ckQrPgsAIYB/gAAYLxUgQwFgk4Dj +DfSwccj2QCVFAC8lRwESHUIRBfBSrUolAAAVIEABAJCA4MoizAfKIIwPAADmG8ojjA8AAIwDaAKs +8cohzA9GDk/xEI0yjUQoPgsAIYB/gAAMLzV4DoiA4Bb0Dg8P94DgBfJKCu//6XA28ACGUSCAgjLy +z3CAAERaKgoAAACGqrgApvHxz3CAAFwjFIiH4MwgYoIG8jYMD/eA4B7yAIZRIICCGvSmDg/3gOAW +8s9ygADIHQCCiiEVBSTgIGCGIH+OCvQBgiTgIGCGIH+OhA+h/8ogwQPtAU/w8cDhxQDdug2v96lw +Jgkv8qlw2g+P8nIJD/LPcIAAGBXZAW/woKDgePHAFg/P9o4Pz/aGDs/20cDgfuB44cXPcqAAyB+k +EgMAz3GAAGwGDYEQc8IjBgBE92J4E3u/gg6Bu2N4YA6hAdhKGhgA4H/Bxc9yoAAsIGaCz3GAAGwG +DoFieA6hEIJtBS/1DaHxwPYIb/BKJEAAwIGggAHf0XXCJAIB0XWhgWGAwifOEwHesXPAfrFzAdvC +I84ATCQAgMwmIpDKI2IAC/SA4wb0gObMJyKQBPIC2wPwANuA4xTygeMO8oLjGvSggMCBAYAhgQIl +jZOgogMgQAABohDwANgAogGiDPCggcCAIYEBgAIljZOgogMhAQAhotEAb/BocOB48cDhxSWAQIBC +IgKAyiJiAIDiyiHCD8oiwgfKIIIPAAA2Ecojgg8AAG8AyiQiAHgAovHKJQIBYIEwcwryQoCig0J9 +gOUE9mCDMHP69UGDAaNgoEGgAKJEgKWAUSJAgEAlAxYL8kaFgOIG8qKCQoBCfYDlw/YAo0SApYBR +IsCAQCUDFwvyR4WA4gbyooJCgEJ9gOXD9gCjQYBQcQX0vg4v/wWAOQBP8OB48cC6Dw/wCHYAgEIg +AYDKIWIAgOEA2CjyJYZBhgHfMHIghkGGQaEgogCmz3Ct3gIAAaalhsB/BoUQdgf0qXBaCCAAAtkG +paWGB4UQdgb0qXBGCCAACNkHpYDnBfJWDi//BYYB2L0HD/AggBBxyiEhAOB/KHDxwEYPD/AIdYYP +7/8odgh3wqXWDu//qXCVBy/w6XDgeECAEHII8mSCCyNAgAX0QIIQcvv1ANrgf0hw4HjPcaAAyB/0 +EQAAANpGIMAP9BkAAAvImribuJy4CxoYMBzYGLgVGRiAWKFZoVqhW6HPcAAMDwCkGYAADqEP2Ay4 +EKHgfvHAyg4P8M91oADQG9OF+r4G8s9wgADsWq4IAAD7vgfyz3CAAAxboggAAPy+BvLPcIAAzFqS +CAAAHNgYuBOl+QYP8OB48cCGDg/wCHXPdqAAyB+kFgAQuGCkHgAQAdgTpliGOYYA2AAiQoMBIQEA +WKY5pgLZM6Y6hluGACFBgwEggAA6phumFYbOCa/yqXEVpheGxgmv8qlxF6YP2Jq4DqbPcIAAzFoa +DQ//z3CAAOxaDg0P/89wgAAMWwYND/95Bg/w4HjxwAIOD/AIdyDwAIYhhiGgAKEA2ACmz3Ct3gIA +AaalhgaFEHYG9Klwtg7v/wLZBqWlhgeFEHYH9Klwpg7v/wjZB6UjhmB5yXBqDu//6XAKJgCQCfID +hyCAAoYieIDgrgfM/5oML//pcAEGD/AP2Zq5z3CgALAfNaDgfuB48cB6DQ/wz3KAAGyyP4I6cOu5 +qsEA2BDyz3OAAMgdY4N0g0gSgQDA3WR5hiH/DiK5On0E8BTdAtiKEgEBAnkSggThYg8v9QDa8glg +AAIgTgMD2M91oADIHxOlGIUA2ULAGYVDwBqFRMAbhUXA9YVcFRIQQBUAFh5mz3CAALylQIABgAAi +goMBIEAAQMJMIUCgQcCLdg30xgnP8YTBGnDJcPIL7/+Gwgh2CBABIQvwgsHJcOIL7/+Gwgh2z3CA +ABDOJJDPcoAAEM5lggbCBLtQc0ApgAKH91BwSvcCelBwv/cF8EINYACGwAhyRsKC5hb06XAmCK/y +SHEId0pwGgiv8gbBBsJacATDB8EFwAAiwoABIEAARMIX8IDmFvTpcCYIr/JIcQh3SnAaCK/yBsEE +w1pwBsIFwAfBAiODgETDAyBAAEXAgeYM8s9wgADIHQOAGIiE4MwmIZAA2AP0AdgvIAegO/TpcLIP +b/ID2Qh3SnCmD2/yA9kAwQh2AcBAIcGAQSAAAEHABMBAwQXBQCDAgEEhAQBEwKYIYABFwUwhAKAG +9PWlAMAYpQHAGaVMIYCgC/T1pQDAGKUBwBml16UEwBqlBcAbpUwhQKAH9NelAMAapQHAG6WKIAcO +tgpv9wpxTCAAoAHZwHnPcIAAfBw0qOUDL/CqwOB48cCOCw/wpcEIdgKLKHWYcGTAAIsAEgYBERwC +MHlwAhIHAQQSCAEQFAAx5JIGEgUBACDJAwCRLyFIEgcgQAIKCSAAEHgAIIoBAZUvIogSByCAAvYI +IAAQeAAgxgEClS8miAEHIIAB4gggABB4ACAHAgOVLyfIAQcgwAHOCCAAEHgAJQUABJUvJUgBByBA +AboIIAAQeB9nBZXwf+d4qgggABB4JpUhcBB4B3k8eg+5JXpQegAigQIweQAcRDBHlSd6XHkPukV5 +MHkAIYIBUHpceQIchDAPukV5MHkAIcIBUHpceQQchDAPukV5MHkAIUIBUHpceQYchDAPukV5MHk/ +Z/B//HkIHMQzD7/leTB5OGBpcca5hbkIuQUhwQIgthB4IJUKHAQwJ3gceAi4BSAAAQG2AMABpgHA +AqYCwAOmuQIv8KXAD3tIuA94z3KAAABs9CIAAEAoAQJIuAV59CLAADB54H8neOB48cDhxYogSQYm +CW/35dnPcIAAyB0DgBgQhQBMJQCBDPQKIcAP63KKIA0E6Ns9Am/xSiQAAM9wgABsVjYKz//mDa/3 +AtjPdYAAcLAChYDgDPLPcIAACDcBgAmlz3CgACwgEIABpc9wgAAQzgaAUSAAgCPyz3CAAFAHAICG +4MwgYoHMICKCBPRiC0/1FfAEhYDgANkR8s9woAAsIBCAIqUDpc9wgACYlwKA1bjHcAAAiBMJpQDY +BKXCDgAA5QEP8OB48cDPcoAAvFoggoDhyiHBD8oiwQfKIIEPAAA0EcojgQ8AAL4GyiQhAIABYfHK +JQEBAaIB2s9xoADIH1ChShmYAEgZGADRwOB+z3CAALxa4H8AgOB4z3GAALxaIIEA2IPhzCEigAL0 +Adjgfw94CiIAgPHAF/LiD8//gODKIcEPyiLBB8oggQ8AADMRyiOBDwAAtwbKJCEAFAFh8colAQHP +cIAAvFpAoNHA4H7geAhzKHLPcKAAsB8bgAIggA8AAgAASQAgAGhx4HjhxVMgQgUEII0PwP8AAM9w +gAAQzgWAAiCDAAQhgg/A/wAA1bkieKV7RXgQc8ogrQAF9xBzANjKIGYA4H/BxeB48cDhxdhwuHG6 +D+//mHIIdchwsg/v/4hxEHXKIK0ACvcQdQDYyiBGAZgP5v/KIQYBpQAP8Da4NrkwcNYghQ8AAIAA +4H8ieOB48cAaCA/wCiYAkM91gAAQzhH0z3CAAGxqqXHeDq/+FNrPcIAA7Fo6DQ/xz3CAAAxbFPCC +5gv0tgyP8alxug6v/hTaz3CAAAxbDfCpcFYMIAEF2c9wgADsWgYND/HPcIAAzFr+DA/xBJUKuAWl +BoWGIMMPBqUeCyAAyXCyCg/xCQAP8OB48cChwQhzhggv9otwguAA2AbyAMAQcwHYwiAOAKHA0cDg +fuB48cAA2c9wgACYLRoIIAAgoM9wgABUVqIPj//RwOB+4HgA2c9ygAAEByKiI6IkoiWiJqIgos9w +gADIWiCgz3CAACxbIKAvsi6yz3CAAOw34H8goOB48cDPcYAAmC0AgYDgGfQB2AChANnPcIAAZBO2 +D+//IKCKIIcO/g0v94ohzwTPcIAA5B0QiIPgYAkhAMogYQHRwOB+4HjxwNYO7++KIMcPpMHSDS/3 +iiGSAO4Kz/aA4KQJAgDPcIAAZBMAgM9xgADsN4IO7/8ggc92gAAEBy6WT5ZZYTBwAN3E9wIgTQAA +hoDgFfSA5RPyz3GAACxbAIG4YAChz3GAAMhaAIG4YAChz3GAAAw7EoG4YBKhz3CAAEwGAICB4ADf +BvTPcIAAyFrgoIogCADPcYAALFtKDS/3IIHPcIAAyFoAgELFQMDPcIAALFsAgBDZQcAAhqLaHttD +wItwrgzv/Ri7z3CAAGQTIIDPcIAA7Dfgpu+2IKDuts9wgABMBuCg8gmv9xHYz3CAACxbAICF4I73 +XgggAAHY9gwP+s9xgAAEPBqBAeAaoQXwRgggAAXYLQbv76TAFdgA2s9xoADIH28ZGADg2JC4EKEJ +2LAZAAC0GQAAdNhCGRgAANiauA+hpBmAAM9wAAwAGQ6h4H7PcoAAVFYlgiOBYbhggc9xgABkEyCB +1bl5Yc9zgAAQzmWDBSs+ACdxx3EAAAAQFQav/0hw8cDhxc91gAAEBwaFgOAT9M9wgACYLQCAgeAN +9EYJj/eY4Anyz3CgALAfG4AEpQHYBqWZBc/v4HjxwOHFz3WAAAQHBoWA4Bnyz3CAAJgtAICB4BP0 +DgmP95jgD/LPcKAAsB8bgADaBaXCDO//JIUulUalOGAOtVUFz+/geM9wgACYLQCAgeAK9M9woACw +HzuAz3CAAAQHIqDgfuB48cDPcIAAmC0AgIHgD/TPcKAAsB8bgM9ygAAEBwOicgzv/yKCL5I4YA+y +0cDgfuB48cB+DM/vGnCKIAgAz3agAMgfEKYB2EEeGBAiCQAAz3WAABDOA4UlhdW4MHDKIc0PyiLN +B8ogjQ8AADURyiONDwAAnADKJC0AgAQt8colDQEKCY/x+giv8Qh3OnBMIACgzCBioD30AIUYpgGF +GaYFhRSmA4UVptoIz/aA4Fzyz3CAAFwjFIiH4Fb0F4a3hgQgkA/A/wAAFYbVvaoPL/IqcdW4AiBD +gwUgAQQ3pgLZM6ZahjuGEgAEAEIrwAcCIsKAAyEBAArwZJcKu6J7eGACIgKAANsDIcEAWqY7pizw +TCCAoCr0BJcKuBamz3CAAMgdAIC6EAAGUSBAgRjyz3CAAFwjFIiH4BL0AdgTpjiGGYYA2wIhQYQD +IMAAOqYbphWGIg8v8ipxB/AAhxqmAYcbpgOFF6apA8/vANmWuc9woADQGzOg4HhRI4DF//PgfuB4 +z3CAAOxaJ4CA4QfyA4BAgAKBQngE8M9w/w///+B+4HjxwBYLz+/PcKAALCDwgM92gACUNwqGpYYC +JwEQsXEG9waGHWUifQrwz3ICABA0AdgqDu/9MobqpgCGz3aAAORZUSBAgAvywgtgAalwng7P9Ahx +gguv/8lwBPAGC6//yXAdA8/v8cDPcIAAbFnyCq//4cXPcIAAqLAViM9xgACEWYDgz3WAAJiXC/QA +gUIgAIDKIGIAgOAF8gCFgOBS9MIKr/8ocM9wgACcWbYKj/9Chc9woACwHzuANro2uTByxvcocIAg +EAAD8ChwYIUEFQUQACOEAAAlBgAMJICBzfcKIcAP63KKII0Dx9txAi/xCiWAAQAkRAEMJICB/fcC +JIQBLyQHAQwkQIHJ9wohwA/rcoogzQNFAi/xztvPcIAAtFkAgEIgAIDKIGIAgOAG8oBxA4XJuRBx +BvKIcCoKL/4A2U0Cz+/PcYAAyB0kgSiBBCG+jwAGAAChwQX0USEAgAj0CPAEIL6PAAAAGATyANgD +8AHYz3GmAKQAF6Hgf6HA4HjxwOHFCHXPcaAAtEdxEQCGBCCAD3AAAABBKD6F+PWKIP8PbxkYgGsZ +GIAD2g+6z3CgANAbUaAFhc9ygADAW1kZGIAGhUCCWhkYgAeFUSIAgFsZGIAJhVgZGIAIhVcZGIAE +IIAPAAAAgAb0gOAG2Mog4QED8ADYz3KAAMgdQ4JIgs9zgADIBVEiAIAR8k8gAgKNupe6RqMFIIIP +gABAOkejBSCAD4AAwFMP8AUggg+AAMAkRqMFIIIPgAAAPkejBSCAD4AAgFcIo4QRAIYJowaFuggv +8yGF8g7v/wGFMQHP7/HArgjv7wDaOnDPcIAA1DkQiM92oAC0R0QgAQ5CKdAACnVxFgGWBCGBD3AA +AABBKT6F+fVDFgGWRiEBDUMeWJBXFgGWvLm/uVceWJBfFgGWv7lfHliQANmeuVMeWJDgeFMemJBg +HhiQIgtP+89wgABILiCAYHkE2IDgEvJWDa/5qXDPd4AAyFsAjxB1CPLPcIAA2DEWgEB4AB8CFGoM +j/FDFgCWTCEAoEUgAA2fuEMeGJBI8kwhQKAR8kwhgKAx8gohwA/rcoogWgqKIwwJSiQAACkAL/EK +JUAEz3CAAMgdA4AQvZu9MiCADwAAsAKfvYDgAdjAeA+4pXhfHhiQcRYAlgQggA9wAAAAQSg+hfn1 +iiD/D28eGJBrHhiQEvDPcIAAyB0DgBC9MiCADwAAsAKfvYDgAdjAeA+4pXhfHhiQBsiE4JALYffK +ICEEwQeP7/HAag+P7wh1KHaKCO/vAYCghRC5QS0AFDhgegjv78lxELmweDhgbgjv70AugRKpB6/v +KHDxwDYPr+8E2QDYz3WgALRHSx0YkADakLp3HZiQAdp3HZiQz3KgAIREGKIA2pG6dx2YkALadx2Y +kM9yoACIRBiiANiSuHcdGJB3HViQgNh3HRiQANieuFQdGJAA2Jy4VB0YkM92gAAYBslwIg5v8RzZ +z3CAAAwGFg5v8QrZz3CAAMgFCg5v8UTZyXAhHRiQz3CAAJwEEHhJHRiQCQeP7+B4/BwItIXg8cAa +cI33CiHAD+tyiiDaC3rbCiQABLkG7/C4c4ogGQp2De/2CnHPc4AAGAYkg2hwNHggkFEhAIIO8hAT +BAAAEAUBCiHAD+tyiiDaCoUG7/CB2ySDAeGI4SSjANoD9ESjLyEHBIUhDAAgsJDZz3CgAPxEGLki +oAuTAeAQeAuz0cDgfwQUEDSA4PHAB/TPcIAANJ9SDW/xJNnRwOB+4HjxwPINj+8OCKABCHbCD4AA +z3GgAMgfCHVA2A+hQBEBBjB5Igpv98lwNQav76lw4HjxwL4Nr+9KJAByz3CgAIggAN6oIIAPh+Y5 +8qCAz3GAAMiwz3KAABDO1nloiUeCemKA5c9zgACUsdR7HvQAJo0fgACMsfiNgucI9OCT+38jkYC/ +JH/gswbwgecE9CKRILMA2Titz3WgAMgc+oUgk+R5LLMF8CyTMHXD91lhA/Css7liiSHPDwQYUAAB +5gDZz3CAABDOkQWv7yeg4HjxwAAWAUAHGlgwABYFQAEaWDEEEoEwnOHKIcIPyiLCB8oggg8AANwO +yiOCDwAAygo0BeLwyiRiAHYJ4AAO2dHA4H7gePHA3gyv75hwFcjPdoAAvLHwJgEQz3OAAByxAxIN +NggcRAAVEgE2QZWA4jR7yiIhAAzygBMAB4DgTvIA2oAbnADwG4QA4BuEAECzAYXuuA/0SLPQG4QA +EI0FuMdwgAAQxuWQgOfD9mG/5bAAIYAPgAA4sUSoTKhUqM9wgADIsDZ4ApDAG4QANX5ApngbBAAB +hQQggA8AAABg13AAAAAgDvTPcIAAjG/wIEAAz3GAAAAdFHkAkRDgALED2c9woAAUBDCgtgqgAYhw +2dgeC+/2ARIBNj7wcBUAEeATAQECIQ4AEHYH98J4AnpQeoAbnADPcqAA1AcPEg6GANjwG4QDcBUN +EcAbBACieTB54BtEANATAQEB4TB58BMFAdAbRABTJX6AyiHCD8oiwgfKIOINyiOCDwAAtw3KJIIP +AAD+AOQD4vDPICIDA9gTGhiA+QOP7/HAiguv7wDYz3GAAFBbAKEMzM91oADUB1EgAIAD2CAdGJCj +wVXyFB0YkAMSATYAFgBABxoYMAAWBUABGlgxBMqc4Mohwg/KIsIHyiCCDwAA3A7KI4IPAADKCngD +4vDKJGIAKHC2D6AADtkDEgE2z3KAABDGEInDuAW4AGLPcoAAyB0tuMC48CIAAASirxACBs9wgADI +sECgDxUAlrQZBAAQiVMgwgCGIP4DRLjEGQIAUKkGyM4Kb/UVEgI2AxIBNpIRAAGaC+/6lBEBACfw +SiRAABQdGJEAFgBABxoYMAAWBUABGlgxBMqc4Mohwg/KIsIHyiDiCcojgg8AAEwC1ALi8M8gIgMD +yLQQAAEPHRiQy9iGCe/2FRIBNhUSAzbPcIAAHLEUIMIAyJKA5gMSATYd9JgRDgB1eM6g1qDPcIAA +jG/wIMMAz3CAAAAd9CDDALwZxADQEgABBCODDwAA8P/DuGV40BoEAAXw0BIAAbwZBAAB2KAZAACC +C6/60ImA4PoDIQADEgM2BshRIICB7gMCACGD+rkI8pDYkLjfAyAAoBsAAM9wgAAQxkAgAgMFvs5i +xBOCANFyB/KR2JC4vwMgAKAbAADKg89yoADIH6QSAgCMJv+fDfLCetdyAIAAAEf3h9iQuJcDIACg +GwAAUIv1auZgBCa+nwAAABP4YFry6b4I8ovYkLhzAyAAoBsAAOy+NPQlkIDhG/QHyAQggA8AwAAA +13AAwAAADfQR2BS4oBsAAOHYYgjv9khxAxIDNiDwiNiQuKAbAADi2PXxSgjv9uPYAxIDNqQTAAC0 +uKQbAACSEwABp7iSGwQAnhMAAae4nhsEAAbwhdiQuKAbAADPcIAAyB0DgBiIhODuAgIAz3GAAHwc +DIFQiw8ggAAMoc9xgAC4HACBAeDTAiAAAKFCkDMTgAARIgCAJ/IHyAQggA8AwAAA13AAwAAAFPQI +i4DgFfakEwAAtLikGwAAkhMAAae4khsEAJ4TAAGnuJ4bBAAL8FEhgIEH8o3YkLh/AiAAoBsAAAbI +USAAgBwCAQBKDY//AxIDNghysBMHAagbAADPcKAAyB81gFUnQAbVuRBxz3aAABDOQ/cF2AemBYYi +eIwgCYbKISUApBMAAAkhgQDyuKwbQADv8pgTgQDDuQfIPHkEIIgPAQAA8BUSBjbPcIAAyLAWIIAB +xZCsEwAACSCAA34TDwGAEw4B/mbPd4AAyB3kh0YXDxFBKAgT/mYIIIADwniYEw4A6L4A34nyQMYg +wc93gADwYQQmhB8GAAAAL2dBLEEEBCaEH8AAAABBLIQF+WHPd4AAAG4yJ0UQMicPEUEugRJSIQEA +wLkDuaB3GOGF58ohjQ8BAIkN1SHOA6QTDwD0vyLyIniEEwEBInhIIAAAOmhBLk8TwL8Ev/R/yXDG +uEkgwAUUf+u+z3CAAKBk8GAG8kEoDgEUJgAQBSh+AEEpAHIA31vwQSiEAEEuTxPAvwS/9H/JcMa4 +SSDABRR/677PcIAAoGTwYAbyQSgPARQnABAFKD4BQSkAcoQTDwHrvvlhEOFBKYQAQS5BE8C5BLk0 +ecl3xr9JJ88V9HnPd4AAoGQxZwbyQSkOARQmQRAFKT4BQSkPciHw4L4E8oYm/JME8ulwG/AD4M92 +gAB4ZPAmQRAiuAUpPgAvcFMgDgDYYIQTDgEdeCfmIr4FKb4DL3dTJwEQP2f9f89xoADELO+h7qFA +KA4Wnr5ALg8F5X7FeMAbAAAKoc9xgAAIOQHYAKEJ8M9woADIH6AQAgCwEwcB8HJF9wXYGLigGwAA +z3CAAGwHQYAgkwkhgQAAiIHgBvQZFQCWEHEA2AP3AdiA4Av0A9gYuKAbAADPcYAAiDsQgQHgEKGg +EwAABCC+jwEBAAAa9JITAAGUEwEAkBMCAbITAwHaDWABSiRAAAMSAjagEgEAJXigGgAAztjmDK/2 +ARIBNgMSDTagFQAQBCC+jwEBAAAF8k4Lj/VPBUAAA8zPcZ8AuP8YoQbIUSAAgMomIRB88qQVABDy +uDXyz3GAAAg5AIGA4ADfM/IA2AChgBUAEX4VDxEfZ89wgADIHQSARhAAAR9nUSGAxf/zz3CgAMQs +y4Df2G4Mr/bJcVMmgRT+vswhIoAK8pgVABBqD2/0ANp0uB9nA/AA3wMSATYA3gnwFcjPcYAAyLAW +eeWRAN6pcYDnz3CgAMgfrBUDEAj0pBUCELG6pB2AEATwCSPDAwPaGLpPoPgQAgCA56FqCCNDA0J7 +oBjAAADamLpOoAzypBEAAPG4DczFIKIEzyBhAA0aHDABkYDgCfIVyM9ygAAcsvQiAACA4ATyAYHu +uAbyDcyAuA0aHDDM2LoLr/YGEgE2AxICNqQSAQD4uQjythIBAc9woACYAz6goPAAFgNBfLIAFgBB +HbIAFgRAPBoAAQAWAEFAGgQAABYAQBGiABYAQUgaBABEIwADhOAZ8hjdchpEAwAWDUCI4LOiABYN +QVAaRAMAFg1BVBpEAwf0aHWGJfMfjCUMkAvyGN0T8BDdchpEA893gAAssse3C/Ae3XIaRAMAFg9A +9qIAFg9BXBrEA2h3hif9HIwnApIK9ALlsH1yGkQDABYPQWAaxAME8GAahAPhvQTyABYPQSh0hCQM +kAX0SiQAACHwgOAX9FEkAIDRISKCE/Lwiqi5z3CAABDGpBpAAAW/4GD+uATyi7mkGkAA2qLboubx +ABYAQEokAAIaogAWAEAbonQSAAG+Eg8BAn+if7gSgAACJw8RmLmkGkAAAn+4YBB4choEALoSAAHw +f3AaxANleByyz3CgAJgDHoC2GgQAvJJEJQAThOBg8hXIz3GAAByxFHnAEQABz3OAACyyBX0Bgu24 +vLIK8lQSAAG8Eg8Bw7jleFQaBACGJf0cjCUCkg70EIrPdYAAGsYFuBBlgeAG9GASAAGEuGAaBAAB +koDgJvLQEQABVBINAcO4pXhUGgQAgBEBB4DhBPQ8koq5PLKkEgEA6LkK8mgSDwFTIM0A/WWwfWga +RANRIUCCCPJqEoEAw7g4YA94ahoCAAfIBCCADwDAAADXcADAAAAD9MezBPAA2Iu4B7MBkoDgE/IV +yM9xgAAcsRR50BEAAVMgwIAJ8vARAQHPcKAAmAM+oLYaRACkEgAABCC+jwAAADAI9IYg5Y9QDWIA +yiCCAADZCtjPcqAAyB8eohDYDqIB2BUaGIAocBPwz3KgAPxEHYJZguu6ANkG9AQgvo8ABgAAA/IB +2QQggA8gAAAAUSAAw8whIYDMICGABfRRIwDA5fNRIwDAFvLPcIAAUFsB2SCgA8ikEAEAmrmkGEAA +Jgmv/wHYz3GAAPw8AoEB4AKhUSAAwwDYCvTPcYAAgDwFgQHgBaEA2Ji4gOAP8q4ID/0D2c9woAAU +BCOgiiAQACcBYAAGGhgwA8ikEAAABCC+jwAAADC/8vS4CPTODw/01th+CK/2BhIBNgPIpBABAOy5 +RfJuCK/2zdjiD+/xAdgDEgE2A90dsc9wgADIHWSAz3CAAHCwBoDPcqAA9AeB4AHYwHgMuKWihSAC +DQ11ALUDyL2QDXCgsAPIr4DgvQDZB/Kigw1woKBmkwbwDXCgoAPIQBADAQ1wYLADyHGADXBgoAPI +SBADAQ1wYLAkouYOj/gGEgE2awBgANDY5g9v9tHYAxIBNgGB+LgO8s9wgADQBwCQHbHPcIAA1AdA +gAGAUaESoQjwNg/v8QLYAxIBNh2xVghP/QPItgqv/3gQAAGA4CIAQgDS2JoPb/YA2QMSAzYBg5gT +AQD4uJQbQAAU8s91gACg1KlwCg+v+GhxENgMGhwwDcyjuA0aHDCCC6//qXDjBwAAnhMAAb4TAgGS +GwQAkBuEAOoLYAGCEwMBCHXP2D4Pb/apcfi9DvID2c9woAAUBCOgiiAQAAYaGDD92KMHIACpcQPI +pBABAIYh5Y8MC0IAAxIONqQWABD0uHwCAQBQjs9wgADwxFZ4z3GgACwgb4GEFgERoJAII0MAInsJ +I0EDsBYNEWTlsXML989ygACIOx2CANkB4B2iKHCo8AW6z3OAABDGQmMEIo0PgAMAADe9Zb1IJQ0Q +BCKCDxgAAAAzug3iAN8PJ48QAxCQACoIr/WYFgAQmBYCEAkgwQNBKkMDwLsEu3R7SHDGuEkgwAUU +e+u6z3CAAKBkcGAF8kEoAgEUIgAAKLi4eAPgBCCADwAA/P/PcoAAkM4Dos9yoADELA2iMBoABAfI +FRIDNgQggA8BAADwLLgYuJ24FLtleAV5KqLPcoAAgDwcggHgHKIODm/23thRIYDF//PPcKAAxCyr +gN/Y+g1v9qlxBCWPH/AHAAD+vTS/UyWBFAfygefF9wCWEOAQcQT3AxIONoDxEI7PcoAAEMYFuABi ++7jVIcIDz3WAAJDOIKXipZgWABDCCG/0ANoBpc9xgACIOx6BAeAeoRyB+GAcoc9wgADIHQOACYBR +IECABvINzEYggAINGhwwAxIONgHYANmA4DfylBYAEJIWAxHPcoAAkM7CkuCCQMDPdaUArP/PcoAA +yB34pUSCVhICARTiQn4D5iK+2mbaYkgiQgAFukUiQgNWpVEjwIHKIYIPAACAACDCBCCADwAAACAl +uEV5JXiJuI64GaU2Cw/xjwUAAKQWABC0uKQeABCSFgARp7iSHgQQlBYAEJAWDRHPcqUArP9AwLAW +AxG4os91gADIHaSFVhUNERTlonsD4yK7fWO7Y0gjQwAFu0UjQwN2oiDDBCCADwAAACAluGV5JXiJ +uI64GaID2c9woAD0ByWgFciYFgIQz3GAAFSxFXlAoaQWABAIdIQkGpAZ9AQgvo8AAAAJCPLaDe/8 +yXBSDu/8A8gN8HAWAhHPcKAA9AcA2Uegz3CgAMgcJ6ADyKQQAABRIACBCPSKCw/029g6DG/2BhIB +NgMSATbT2C4Mb/akEQEAAxICNgGC+bgI9JYL7/EE2AMSAjYdss9wgABwsAaAAdmB4MB5DLnPdaAA +9AcZhUokAACA4Mohwg/KIsIHyiDiDM8gIgPKI4IPAABEChQFYvDKJQIBHJIleA1xALEDyD2QDXAg +sAPIL4ANcCCgA8hAEAEBDXAgsAPIMYANcCCgA8hIEAEBDXAgsAMSATYckYYg/wyE4B/yM4ENcCCg +A8hQEAEBDXAgsAPIVBABAQ1wILADEgE2HJGGIPMPjCAMgAn0NoENcCCgA8hcEAEBDXAgsAMSATYc +kYYg/QyMIAKCG/RgEQEBDXAgsAMSATakEQAA97gR8jmBDXAgoAMSATakEQAAt7ikGQAAZBkAAbgZ +AgG6GQQBpBEAAAQgvo8AAEAIB/IBgfC43AnC8Q7wOoENcCCgAxIBNqQRAACGIPOPBPI7gQ1wIKAB +2SulA9pIpc9zgADwNxUSDTZAg1B1ANgb8s9yoAA4LkWCBCKCD8AAAADXcsAAAAAM8vXYBbjPcp8A +uP8aoruiadgYuBmiKHCB4AP0oKPPcKAA/EQ9gBmA67g19AQhvo8ABgAAL/TgeOB44HhRIEDDKfID +yM9xoADIH7AQAAGWIEEPHqEQ2A6hAdgVGRiAWgzgAEHYUSBAwxXyz3CAAFBbAdkgoAPIpBABAJq5 +pBhAAHIKb/8B2M9xgAD8PAKBAeACofYMAAAacNTYFgpv9gpxBCC+rwYAygAg8s9wgABgHAOAgODK +IcIPyiLCB8og4grPICIDyiOCDwAAOgTKJAIEGANi8MolAgTPcYAA/DwFgQHgUwIgAAWhA9nPcKAA +FAQloAMSATYBgVEgwIAm8qQRAADPcYAAyB1RIACABIEE8tuQA/DakM9ygADUORKKUSAAgBbyI4EP +ihC4MiGBDwAAsAKfuIDhAdnAeQ+5JXjPcaAA/EQNoQTwdhEOAQ3MUyBAgA7y1dhaCW/2BhIBNgbI +BBIBNl4Nr/QVEgI2z3WAAKDUqXDKCK/4AxIBNj4Mb//JcIDg1/QDEgE2khEAAeq4BvKquM4I7/mS +GQQAAxICNn4SAQGCEgABgBIDAThgG2MVyM9xgACYsXB7FXkJgXhgCaEBglEgwIBi8tfY4ghv9gDZ +tg5v+IDYBhIBNgQhgQ8CAAEA13ECAAAADRIDNwn0/bgH8k8jwgANGpwwBfCju3B6DRrcMAMSAzYB +g1EggIEs8k8iwAKMuBB6DRocMBCLMxOBAAS4JXjPdoAANKfPcaAAOC4kgQa2EPAvL0EQTieNFwDf +DydPE+Z5z3eAAGDE9CdPE/FwCfKA4fH1z3AAAP//BLYC8KS2CNgMGhwwAYP9uM8i4gHQIuEBz3GA +AIg7E4ENGpwwAeAToTTwENgMGhwwDcyjuA0aHDAyDG//qXDY2A4Ib/YBEgE2AxICNgGSgOAK8hXI +z3GAAByy9CEAAIDgDPIBgu64CPQVyAHaACCBD4AApLFAqQ3MUyBAgAryBBIBNoogBACOCW/6mBEB +AAPIGpBKCm/4FRIBNg3MUSDAgAYSATYS8qYPL/bX2M9wgAAssgMSATYCgJgZAAAGyHoI7/QVEgI2 +BhIBNtzYgg8P9tUAL++jwPHA4cWpwYt1qXDPcYAAlF6CCi/vJNqpcO4Ob/gDEgE25g7gAKlwwQAv +76nA8cDhxQh1z3CAAIxvRoDPcIAAyB3wIIIAvhAABlEgwIChwRXyFmnPc4AAkMkAY1EgQIIN9M9w +gAAQyDZ4pxKCAAKIiboOuEV4BfA2Du/0i3AAwAClZQAv76HA4HjxwOHFAxIBNqKBIIW6Dq/9JNoB +hYDg4iACAEUAD+/gePHAug/P7qHBCHcA2EDAABaSQAAWkEAAFo1AABaRQEEoDiHAvkAvARSKIJMC +og4v9sV5gOYj9EwgAKA08gpwz3GAAAyxI4mGIPwHRbgGeVMgwCDgucoiAgDKIiEAYMLhucoiAgDK +IiEAARyCMFEhgIDKICEAAhwCMBTwUyD+oBLyCiHAD+tyQCoPJM9wAACvKIojXgEFJ0QTcQcv8Aol +AATPcoAAyB31eiCChC4EHyhwgCALDSdwZohwdQX0ZIhScxTyCiHAD+tyBhCEABC9xIhAKg8kh9iN +uIojXgcFJEQDKQcv8AUmxRNAIA0CiiMVBXhhgOYIgHlhC/SBuAihIIIAwBzheWEAoSCCG6ED8IK4 +CKEAgiDgYGCGIH8OhuCKIBMDyiCCDwAAywSmDS/26XFAIUEgSSEBBjR5GgsgAKlwQiHAJUggAACA +4ADbyvcA2gAWAUAB4oPivPcB4xBzufdWJQAZ7gogAAbZhgvP9YDgC/TPcIAAaCMskM9wgADIHR6Q +EHEK9Klwrg0v/clxiiASDT4NL/YAweoJz/N5Bu/uocDgePHAHg7v7gDZz3CgAPxEdBAQALmABCWC +nwAAAAgL9AQgvq8ABgAAB/QDyKQQAAD6uHfyz3CAAMgdBIDPcaAAyB9RIICmRhAAAR+hINgOoQry +cgqP8oogBADSDC/2ANk68FEgQKYM8vIOT/EDEgI2CHGgGgAAtgwv9vzYLPBRIMCkAxIBNgzybyBD +AKAZAACKIAgABhoYMIogRALg8VEggKQM8gDYl7igGQAAiiAIAAYaGDCKIIQC0vGkEQAA+rgb8gXY +ELigGQAAiiAIAAYaGDAKcA4PoACpcQPez3WgANQH0qVGDI/8Ex2YkwPIoBAAABjwgOII8s9ygACA +PAWCAeAFouDxCiHAD+tyCiUACDLYjLj/24u7UQUv8AokAAQocGEFz+7xwKQQAQDpuQXy7gsP/dHA +4H4odIQkEpAR8vm5BPReDI/1B/Ag2c9woADIHCmgA9nPcKAAEBQloOvx6/HxwLoMz+4KJwCQOnEA +3Rby6XEvKEEATiCCB89woAAMLU968CCAAMK4DyUNEADYDyCAAAYhAYDv9YDlK/IvKEEDTiCOBxUa +mDP12AW4fgxv9slxFcjPcqAAFAQKos9xoABkLvAhAABTINAEKYJeCy/22tgqcGoIb/QEIMEjSgsv ++slwANgPIIADBiUNkNj1z3KAAPA3AIIH2YfgFRpYMB7yz3CgADguBYAEIIAPwAAAANdwwAAAAA7y +9dgFuM9znwC4/xqjO6Np2Bi4GaMB2APwANiB4AL0IKLPcKAAFAQqoDkEz+7xwM9wgAAgtEGIz3GA +AKC3rgqv/QLiz3CAAIwHIJDPcIAAaLQusNHA4H7gePHAtgvP7ih2RiHNAB1lMgggACK5wb6B5g3y +guYH8oPmDPQAFoBAAR0SEAAWgEABHRIQABaAQACt6QPP7oDhVvJAIcIDJLrDuQLwANmP4ZYADQAz +JkFwgABEXkAng3I0ewB7ABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQAAAW +AUAEGFAAABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYB +QAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUABCIkKAs/XgfuB4gOHKJE1w4HjoIK0BABYBQQIY +VADgfuB48cCqCs/uAN3PdwAABB1KIAAiqXYVIoAzFhABBgDYz3KgABQEyqKooieiBKI9ZYjhaLnK +IQ4Aggpv9ulwQiBQIEwgAKAg5wHmJvfFAs/u4HjgfwDY8cBKCs/uocEacEojACAAHMA0iiAHCU4J +L/YKcc9wgADkWzIgEgTPcIAAwAbRiBKIEHZcAQkAancKIcAkAvB6dUQuvhMAIkAuz3GAAMDVMyEN +AEwgAKa7fa19V/bPcYAAEBYagTuBJHhRIACCDfLPcIAAwAYLiItzyXGmD6/2qXIAwAJ9rX0AJoAf +gADABhwQwQDPcoAAdD0AigXaXg8gAKlzz3GAALBbIIEA3UokgHEieKgggAVzbnR7tXvPcoAANJd5 +YiGJgOF6YgvyEHEQ8hBxE/aF5Vf2AeWvfQrwQiWREC8hRyRhva99EfADEs8AANlqdQzwgOVKIQAg +yiVhEAXyQiVREC8hRyQB2YDhLfLzbvR/FSdBE89zgAA0lzpjACNFABUnTxT5YyGJQYowcvtj44vY +9gIiRAADFYIABL/wfyJ4BLovJAgBAieDEGx4LyBGDlIK7+6IcQ54An8I5+5/RL/tf0wgAKaE9grn +7X/JcApxxgwgAOlyAebPcIAAwAYSiM9+EHa2Bsz/FQHv7qHA4HjxwMIIz+4Idih1SHcac095ELkP +eAi4BXmKIEcIsg/v9aV5gOfMICKgCPIsbS95z3CAAMAGM6gH8M9wgADABrOoqXHPcoAAwAa0qsCq +9aoWGgIEFgogAMlwABCHAOGIz3CAAMAG0YgSiBB2pAEJAEQvPgcvcYQuAxEKJEAOACFDDgohgB+A +AKyXIXNAL4IAVHqELgEVCiVADgAiTQ4KJoAPgADE1AAmSAMAJo0fgADABkwnAIDMJ2KAJvQaE8AA +ANkYrRsTwABKJIBxHK0YiyAdAhCoIEAGFCBAEEGIs260fTV9x3WAADSXABDAAECtFSNCAAGtARLA +AAHhAq0Aii95A6198AETwACA4Bn0ANpYrVytIB2CEEokgHEA2agggAMTbhR4NXjHcIAANJdAqEGo +QqhDqAHhL3lh8Hy5ACREAGy6ACJBAQAhhQEAJEACGog6iwIJIADpchitACRAAhuIO4vyCCAA6XIc +rQAkQAIYiDiLACREAt4IIADpciAdAhAA3UoigBEUJUsDFCBJEwETgBABEYEQvgggAOlyM240ebV5 +x3GAADSXAKnYcQATgBAAEYEQngggAOlyAR4CABUkSwMVI0kDAROAEAERgRCGCCAA6XICHgIAABOA +EAARgRByCCAA6XIDHgIAQiJKEEwiAJAB5ZIH7f+vfQHmz3CAAMAGEojPfhB2ZgbM/wDZz3CAAKxb +EQev7iCo4HjxwOHFz3WAAHQ9iiDHCaYN7/UghQCFz3GAAKhbIIFNaDBywCBsAcwhDIA8CwkA9QaP +7uB4AnkteUx5ViEBcke5OGDgfw944HiB4PHAuHEc9EwlAIDE9kwlgIPO9gohwA/rcs9wAADXFIoj +Rw+BBu/vSiQAAEAtgQBkuQAhgA+AAIwQHfDPcIAA9BMyIEEBjCHDj8ohwQ/KIsEHyiCBDwAA2BTK +I4EPAAADAkQG4e/KJCEAz3CAALwSNXjRwOB+4HjxwM9ygADSBgpqsgkgAClq3g0AANYIAADPcYAA +6G4ggc9wgAA4DyIIIAAB2s9xgADkbiCBz3CAAGQODgggAADa0cDgfvHAng2P7hpwgOFId5QALAAA +3TpxFSBAI4DnQIgCiAzyz3aAAIwQFX4CuBR4x3CAAOQPC/DPdoAAvBIVfgK4FHjHcIAAxBAhiFEh +AIAk8gUQwQAirgYQwAADrulwigwgAEhxAK6A4MwgYoDKICEAE/JEKD4HACGAf4AAqJfFEIMA4RCB +AAIiwAAQeAe4Zg6v7mJ5Aa5CIUEggOF6B+3/AeVdBY/u8cACDY/uz3CAAMAGERCIAM9wgADABhKI +EXC0AAsASiYAAEohwBFELj4HL3CEKAMRJ3AAIIEPgAColx8RywAAIIEPgAColx4RygD4cADeBt8A +J40PgACol9V9B41pcQXamHBCCiAABRXDEEAuggBUeoQoARUAIkEO1HnHcYAAxNS4cQCpiHBJcQfa +GgogAAYVwxABHQIAYb+A5wHmtAft/89+QiFJEEwhAJBAJkYAegft/y8mhwFAIEgQz3CAAMAGEogv +IAcSEXBWB8r/nQSP7gLbYKgA2ACpAdjgfwCq4HihwfHAHgyP7qHBZcIIdih1z3CAALoGhcGLckAk +QzCKCyAAAIhELr4WACVAHhQUwTDPd4AA+JmY5fhgegAqACCoUyWAEIXgTAAKAEYlzRGvfRvwARSA +MAAmgR+AADDSUm1UellhIMIAqUQuvhYAJUAeRKkUFMEw+GAgqMlwXgggAKlxAeWvfVMlgBCF4KP2 +IfABFIIwEm0UeAAmgR+AADDSOGBAqCDCRKjJcDIIIACpcQ/wQiUAFg94ARSBMMd2gABI0wK4FHge +ZiDAKK4MrgjcuwOv7qHA4HjgfuB48cBCC4/uAN7PcKAAtA9wEBAAiiDHCM9xgAB0PTIK7/Uggc9w +oAC0D9ygz3GAAMAGUomxiVB1EfbPc4AAWJ9/2BQlTxN/ZwCvwa8B5a99UHUF2AKv9fbPcIAAqJdB +kM91gACwW4DiwKUI8s9wgAC8WwCAjCAfhAT2ANkV8NdwAACgD3z2QnhAiYDiiiEPCsAo4gAF9EQo +vgMvcPoLj+4IcQClrgnv9YogxwgA3Q7ez3eAALhdOgjv/6hnYb6A5gHlr306989wgAB0PSCAz3CA +AKhbIKDPcaAAtA9wGQAEyQKP7uB4DngseClqANgPIEAAJ3BaeOB/DiDAAOB48cA6Cq/uiiCHCM93 +gADABkIJ7/UzjwCP0gvv/zOPz3CAAKRbABDSAM9xgAC8IBSPWokQcg70AI84iTBwCvTPcIAArVsA +EMAACSCABC8iBSASj7GPEHW8AAkAAN5KI4Ajz3CAAKVbAIiA4BHyRC2+EwAmQB7PcYAApFsAEcIA +ACCBD4AAwNVAqTbwSCJAIC8gBSDPcIAAuF3LYBOPqXFGCe/1VY8JIAAEDXjPcYAA3AZ8ublhz3KA +AKhdymIgEYEAQnkJIQEARC2+EwAmUR4TjwAhkC+AAMDVABhCIKlxEg+v/8lyz3KAAMDVMyJBBAJ5 +ABhCIEIjUyBMIwCgAeZkB+3/z34B5RKPr30QdU4HzP+BAY/u8cA2CY/uCHXPcIAAgjAAiBB1KHcH +9M9wgACBMACIEHcn8s92gADABqlwQCaBEvoKr/ZAJsISCo6veiuOGLoIuAV6iiBUDfoPr/VFeSqO +BG6yCa/2S44KjioIr/Yrjs9wgACCMKCoz3CAAIEw4KgxAY/u4HiA4OHFGvSMIcKNOAAqAAHYSiSA +cc9zgACImKggAASha0QoPgcyJU0esXHM9oDlCPKG4AjyAeAPeADYBPBhuA944H/BxeHF4cYAEc0A +gOVE9gDdoKmA4BzygOVF9gDYAKkA3c9wgACoXACQEHWE9qlorX2gqc9wgAAAXBQgTgOgjqCqABHB +ADR4AYga8IDlRPYA3aCpz3CAAFRdAJAQdYX2qWitfaCpz3CAAKxcFCBOA6COoKoAEcEANHgBiACr +wcbgf8HF8cACCK/uANihwQAcBDDPdYAAKAcAlc92gACol8lxiiIECtYOL/YB24DgEPQKIcAP63IA +FQQRz3AAANsUbtuLuwEA7++KJQQKABaEEEwkAIHKIcsPyiLLB8ogiw8AANwUyiOLDwAAcwDPI+sC +1Aer78olKwBCD4/1gODKIcIPyiLCB8oggg8AAN0UyiOCDwAAeQDPI+ICyiQiAKgHou/KJSIAi3FF +2AHaTg4v9gHbgOAP9AohwA/rcs9wAADeFHzbi7uKJEEBfQev70olAAAAFAAxAdmGIP4PwODAec9w +gAAUFSCoiQdv7qHA4HjxwBYPT+4Iddd1JQAAgADYSvfPcYAAEM4lgTB10PcifQHg+fHPcIAAEM7F +gKlwEgiv7slxBS4+EAIlTR6MIBCAyiHGD8oixgfKIIYPAADNIsoj5gzKJCYA/Aam78olBgEWuCEH +b+6lePHAqg5v7gDZz3KAAHCwBIKA4Aj0z3CAAJQ3B4CA4APyAdnPcIAAyB3jgM91gACUN/iPwIWE +51MmAxAG8g6AUSBAgQT0AN458AeFgOAD9ADYEaWA48whIoAL8gmFUSAAgQfyUSYAkQryAYWP4AT0 +ANgIdhXwANgS8BGFAeCE4BGlCN5G9wGFj+AA2Anyz3agACwg0IYB2MOiCN6whYDlDPSA4wT0gOEI +9IDgBvRMEoAAguAD9ATeXQZv7slw4cXhxs9wgACUN0CAAoA/2wZ7DHDPdoAAlDeihs9xgABwsAsg +QIMB2C6BwiABAAshQIPAugbyKYZRIQCBzyBhAAsgwMAJ9M9xgABwsC6BCyHAgADZAvIE2YDiBvSE +4QjygOAG9IDiBfKE4QP0BNjBxuB/wcXxwOHFz3WAAORZug0v/qlwz3CAAJQ3IIDhuR/yFBAEABgQ +BQBRIQCAzCQigMwlIoAJ9AohwA/rcoogzQuBBa/vx9sqDu//ACUAAQYJj/MIceYNL/6pcJ0FT+7g +eM9xgACUNwCBUSAAgc9wgACYpUiAUyIDAAT0AYGP4BLygOMN8lEiwIEJ9M9woAAsIBCADaEB2OB/ +C6EC2OB/C6GA4wzyUSLAgQj0z3CgACwgEIAKoQHYA/AC2Aih4H7gePHAvgxP7oTgCHUm9N4Kr/mK +JcYeiiCJBq4Lr/Wpcc9xgAAENMARAga/4gDbS/cSahR4OGCgoM91gABQB6CFoaBioAHixbrAGZgA +sgiv9wDYBN2F8IThS/TPcIAAyB0sEIQATCQAgQ30CiHAD+tyiiANDIojxwCNBK/vSiUAADgQBABR +JECBDfQKIcAP63KKIE0MiiNHAW0Er+9KJQAAiiBJCIolxxEiC6/1qXHPcYAABDTAEQAGv+AH20z3 +UmhUejpioKLPdYAAUAeghaGiYqIB4MW4wBkYACIIr/cH2EIO7/YE3QYKj/k58FMlfpAo8s92gABQ +BwCGguDMICKBL/SKIAkIiidHFr4Kr/Xpcc9xgAAENMARAAa/4AjaSPdyaHR7O2PAhuCjwaNCowHg +xbjAGRgAxg9v9wjYEfCI4Q70z3GAAJQ3z3ICABA0Ad2pcLIOb/wygQPwAN3NA2/uqXCB4M9xgABs +BwT0AdgAqQGpAImB4MoggQ8AAMQJyiCCDwAAgADgfwGh8cA6C0/uCHXPdoAA3DKKINgOLgqv9SCO +iiDYDiIKr/UhjgCOuGAArgGOHWV5A2/uoa7geEGJBbjHcIAAEMZIqCKJ4H8pqOB4FRICNgQgvo9g +AAAAz3OAAByxVHvHcoAAjLEIcQbyA8gckFEggIIK8gQhgQ9hAAAA13EBAAAABvQA2ACzAdge8AzM +USDAgQMSATYN8jIRgQABizBwBPQA2AGr8vEB4AGrC/AxEYEAAIswcAX0ANgAq+bxAeAAqwLY4H8Y +quHF4cbPcoAA4AeA4MAiIgH/3RVpACCDD4AAF8agqwDdSiQAcc9zgACQzaggwAKuYnhlNnjEqK5i +AeWvfcCowcbgf8HF8cAyCm/uiiDKBaHBz3WAAGw4QJXPdoAAaDgglhC6Ggmv9UV5QIUghlBxI/LP +cIAAcCgZgFEggIBAwQXyTyEAAUDAgOEE9IDi3AvC9YtwBNmh2j3bbghv/Be7IIaA4QjyAIWA4AT0 +HgrP9SCGIKWA4SfyANqeugDZz3CgAPxEQaDgeCGgz3CgALQPPKALyAQggA/+//8DCxoYMAvIh7gL +Ghgwf9gKuM9xoADQGxOhf9gQoQDYlbgQoZYN7/UB2OEBb+6hwPHAaglP7s93gADIHRV/IIdIgQQi +gA+AAAAARCIDAi+4BrsFewQigA8AAQAAQShNAyy4ZX0FfbcRAAYQdbYRDgY28gQivo+AAQAAJPLP +cIAAXCMUiIfgHvTaDQ/1gOAghxjyCIG+uAihIIcIgUQgAgIEIIMPgAAAAAQggA8AAQAABrovu0Eo +TQNlekV9LLgFfYDmtxlYAwzyLymBA04hgAcSCCAAECYOEIDm+PUlAU/u8cC+CG/umHCQ4I33CiHA +D+tycdiNuIojzQflAK/vSiUABEokAHQA2qggwA5ALIMBVXvHc4AAkMkAg891gAAQxkAsQQHduCFl +AKPxudEgIoII8sCLz3WAAPBhzWWB5Qv2z3WAABDIFiUNEaCNUSUAkAPynrgT8C25wLnPdoAAyB3w +Jk4QUiBNArcWARYLIUCDBvIohv657/OfuACjAeKNAE/u4HjPcYAAyB3wIQAAz3GAAMiwsRACBrAQ +AwZCoWGhshACBrMQAAZFoeB/BqHgeM9xgADIHfAhAADPcYAAyLC0EAAGFiECAAKSGrEDkhuxCIo4 +GQIAANjgfx2x8cDhxc9zoACsLxmD8LgZgwDdDPIEIIAPCAAAANdwCAAAAAHYwHgH8IYgfw+C4AHY +wHiA4BnyGYMEIIAPDgAAAEIgAIDKIGIAgeAP8gohwA/rcmQTBADPcAAArg2L26UHb+9KJQAAHg+v +9VTY5LhEIAICC/LPcZ8AuP+9oQLbz3GAANwHYKHPcYAAaDhRIECAAIHPIGIA0CBhAFEggIAAoQ/y +z3GAALhbAIEQcgnyQKEB2c9wgABQHNIJb/0gqHkHD+7geOB+4HjgfuB4z3GAAIA8MBnAB524nrjP +caAAyBwNoeB44HjgeOB44HjgeOB44HjgfvHAxg4P7qHBGnAodkh3iiARBcINb/V62YogEQW2DW/1 +CnGKIBEFrg1v9clxiiARBaINb/Xpcc9woAAsIDCAz3CAAPw3IKDPcKAALCAQgM9xgAD8NyCBz3WA +APQ3IngApYtxlg0v7wpwAIUQd8j3ABQAMcR4EHbp9QHYA/AA2K0GL+6hwPHAz3KgACwgQBIEAEAS +BQDruQf0BCC+jwAGAAAk8uy5IvTPcQAAECcD8EASBQDPcKAA/EQZgOy4AiUAAQP0MHC19tdwAAAQ +J8ohyg/KIsoHyiCKDwAAqgbKI+oHLAZq788jKgPRwOB+USAAw89woAD0B/HAK/IngBmAMHk4YAO4 +liBCBc9xoADIHx6hENgOoQHYFRkYgMIO7/+B2FEgAMMV8s9wgABQWwHZIKADyKQQAQCauaQYQADa +DG/+AdjPcYAA/DwCgQHgAqED2c9woAD0Byqg0cDgfvHAcg0P7gh2z3CgACwgsIAL8HIIT+/PcA8A +QEJaCu/xqXGB4A3yz3CgANQLGIBCIAAISCAAABB2LfelBQ/uCiHAD+tyz3AAAM4iXtuKJMMPYQVv +77hz4HjxwAINL+4B2aXBGnDPdYAA4AdadY4Jb/+LcEwgQKAAFIUwARSRMAT0QCUSEUwlAIDE9kwl +AIHN9gohwA/rcs9wAAApJazbFQVv70okQABMJQCAMgEOAKhwABaOQAAWlEBMJACkenCF9owkw68o +9AAWAEEAFo9AABaAQAAWAEFMJACkhgAKAIDnJ/LPcIAA6BMAgEAszSC1fRDguGAGCW//BNnPcIAA +6BMAgEwhQKAdZcwnYZMZ9ADYjLgY8AohwA/rcs9wAAAqJbfbSiRAAI0Eb+8KJQAFCiHAD+tyz3AA +ACslwNvz8QDYALXPcIAA6BMggEAswCAVeBJhGWEFIkAEALEE3QbwgcAE3ZoIb/+pcQAijCMAHAIV +z3CAAMgd8CAABB7fthACBoDiLymBAAInQBAk8s9zgAAXxjVoK2MRI4CDCfIAJoEfgACQzRZ5ABkC +BQAtgRMLIcCACfIAJoEfgACQzRZ5BBkCBRAiAoAvKYEAAidAEOD1QiNAIIDg3AbN/1IPz/LRAy/u +pcDgfuB4z3GAAGQuAIGiuOB/AKHgePHAPggv9eHFgOA88s9wgAB8L1CIMohEKj4LACGAf4AADC81 +eA6Iz3WAAGQugeAq9DYID/WA4Cbyz3KAAMgdAIKKIRUFJOAgYIYgf44a9AGCJOAgYIYgf44U9M9w +gABcIxSIh+DMIGKCBfJ+Dc/0gOAI8gCFUSCAgvQIof3KICEAbQMP7s9xgABkLgCBgrjgfwCh4Hjx +wN4KD+7PcIAAjFoeC+/9At3PcIAApFoSC8/9z3CAAFxaCgvP/c9wgABEWv4Kz/0A2Bpwz3eAAGAw +UNwCJwATQCjOINR+5grv/dhgQicAGNoK7/3YYGG9gOVAIEAgK/fhAg/u8cBaD4/vAtqF4M9xgABk +LkGhEPJ2D8/0gOAG8rIKr/0A2AvwNg+P74HgB/QA2APwBdjOCM/vANjPcaAAxCd3GRiAeBkYgIAZ +GICBGRiADxEAhqO4DxkYgEYOr/UJ2NHA4H7gePHAEgoP7gh1AN7PcKAAwC+lEBGGFBAQhoogFQwG +CW/1qXGA5c93oABkLsohgQMU8qlyA/Aodi8pgQBOIYAHD3jwJwEQANsPIwMABiLCgNO5xXny9YYI +7/upcIDlEPKpdi8ogQNOII8H738aC6/z6XAA2A8gwAMGJg6Q9PWA5RDyLyhBA04gjgfPfvoKr/PJ +cADYDyCAAwYlDZD09c9woADAL6UYWIQUGBiEyQEP7uB48cBqCQ/uCHbPdaAAwC+jFQCWUSAAgfrz +B8hAHRiQFciG4Ab0Ygkv/8lwkPDPd4AAoNQKj4DgCfJAJ4ASQCaBEgoI7/wK2gPIB4hRIMCAE/LP +cKAA0BsRgPG4yiAhABwK4f/PIOEDANmRuc9woADQGzGgz3CgANQLGIBCIAAISCAAALDgeAvl/8og +JQwDyAOQJbjAuBe4x3AADgAARSABC+xwIKABEgE27HAgoCCG7HAgoCGG7HAgoCKG7HAgoCOG7HAg +oCSG7HAgoCWG7HAgoCaG7HAgoCeG7HAgoCiG7HAgoKMVAJZRIACB/fMHyAQggA8BAADwLLiU4MAg +hg8AAJMAz3GgAGgs8CENAM9wgACEW8CA2dheDy/1BSZBE2oM7/IFJkATKo+A4Q7yiiBSDUIPL/WH +uc9xgADoPAGRAeAQeAGxANgKr4kAD+6hwfHADggP7qLBScE6cEh16bkacwoiACEy8gLZz3CgAMgf +SRhYgCnBU23u4VB4BvTSCW/xi3Ea8LfhCPQbeBB4wglv8YtxEfCU4QT0HHgK8IrhBfQAHIQwBvDP +cAAA//8AHAQw4HgA2M9yqQCk/7miABQBMYK4N6Iaokrw6Lku8kwiAKDRIeKhQvTPcqUArP/PcIAA +yB24ogSAVhAAARTgAiADIAPjIrt4Y3hgSCBAAAW4RSBAAxaiQSnAIcC4d2gpwAQhgQ8AAAAgJbll +eCV4ibiOuBmiHPApwIDgyiHBD8oiwQfKICEOzyAhA8ojgQ8AAMoPyiQhAGgHIe/KJcEABb2leM9x +pQCs/xahz3KgAMgfz3CgALRHVxAAhgDbSiRAAAQgvo8AKAAAwiQCAc9woAC0R28QAIZMJACABCCF +D4AAAAAEII4PIAAAAAQgjQ8ABgAABfJAEgEGg+GD9wDfAvAB3xMSAYYEIL6PADgAAAQhgQ8AAACA +zCchkMAjYQAFJk8RJX8FJ36TBfSJ46IHzv+A4QXygObMJSGQl/LPcaAAtEdrEQSGTCQAgE3yiHSE +JNCRCvLPcYAAiDsNgQDdAeANoZy9Y/BRJMCACfLPcYAAiDsOgQHgDqFC3VfwiHSEJAKYCPLPcYAA +/DwGgQHgBqEP8FEkgIEI8s9xgACAPBiBAeAYoQXwUyQ+gwPyAN098FEkQIML8koMz/zPcYAA/DwZ +gQHgGaHz8QohwA/rcs9woAC0R28QBYZE2Iy4nNshBi/vjLuA5gjyz3GAAIA8BYEB4AWh3fGA5TDy ++rgL8s9ygAD8PCSCAN0B4SSikb0K8Pm4EvLPcoAA/DwngkLdAeEnolYPr/+Icd3YANmaDC/1mLmY +vTrwCiHAD+tyz3CgALRHcRAEhm8QBYY52Iy4tduxBS/vjLuqC8/8z3GAAIA8BoEB4Aaho/ETEgCG +8LjKICEAWA6h/88goQPPcKAAtEdrEAGGWBAAhgsgQIAN8noML/4B2APZz3CgAPQHKqAF3Zi9AvAA +3YDlGfRRIcChC/JMIgCgDvQB2c9woAD0ByygA9kF8APZz3CgAPQHJaBRIYCiLAuC+BfwAxIBNs9w +gACg0BBxB/LPcIAAaNEQcQv0khEAAaq4khkEAJ4RAAGquJ4ZBADPcIAAcAYAgIDgB/LPcoAA9CgF +ggJwBaLPcYAAiDsMgQHgDKHPcIAAVLAhgM9wgADIHQOAFJAQcQ70z3GAABAWGoE7gSR4USAAggwK +4vXKIGIAqXAI3LME7+2iwOB4ocHxwFIMz+2hwSh1CHYacgQhvo8BAADAaHcw9Oi9QMUW8iDBz3CA +APBhKWAEJYAfBgAAADG4OGAEJYEfAgAAAddxAgAAAcogoQAD8AHYgeAP8oLgCPKD4ADYyiDhAcAo +oQML8M9wgAAMsQKABfDPcIAADLEBgAV9yXCyDC/5qXHJcKlxCnLpcwHdtgvv/5h1gOBO9ADZCtjP +cqAAyB8eohDYDqIVGliDKHAH8AHZBCCADyAAAABRIADDzCEhgMwgIYAT9FEjAMAP9M9yoAD8RB2C +WYLrugDZ6vUEIL6PAAYAAOb15fFRIwDAFvLPcIAAUFsB2SCgA8ikEAEAmrmkGEAApgov/gHYz3GA +APw8AoEB4AKhUSAAwwDYCvTPcYAAgDwFgQHgBaEA2Ji4CNyPA+/tocDPcKQAkEFNgM9xgACAs0Kx +GoBRIEDGA7EEIIAP/wAAADC4BLHPcIAAgLMA2gjyz3GAAGyyMoFRIYCCBfJCsEOwRLDgf1mw4Hjx +wN4K7+2YcM9ygABsskgSgQDPdoAAgLNTIQ+ADpIAtgXyKHSEJAOcBfISglEgAIIJ8s9zpgDo/wuD +A6YMgwSmBPAA2ASmA6bPdaQAtEUMFQOWDRUFlih0hCQDnC8nxwD/2BC4BCMIAAP0gOct9DIVD5ZT +J4AQGGDhthR4/98PeAi/ZH9AKAkCACHGEwAnBwAFJsYBQCgPBgQjgw8A/wAAQCgHBPtjACDIEQUm +BgL/3wUjgwEIvwQlxgMFtgAhiRGgcAUgRQJveAQjgw//AAAAKLtleAO2LyBHAQS2BBUAlgK2EoJR +IACCD/LPcIAA8GEoYIHgyfbPcaYA6P8NgQWmDoEGpgTwANgGpgWmANtKJIBwBtmNuaggQAMp2BK4 +8CBPAEAmAB91eAHh4KAB4wCSOB4AEVUmQRQats9wgABYszYJr/wI2hsVAJbPcaUA2MsZphwVAJYa +ph0VAJYbpg6BHKYPgR2mJhUAlh6mz3CkAJB/HIDRAe/tH6bgeOHFz3WAAICzCaUqpXi1S6UB2Bm1 +4H/BxUokAHoA2agggAIA2s9wgACAszV4QKAB4eB+AAACAAAAAEABAAAAAAAAAAAAAAAAAAIAAAAA +AND+VAWAgQ8aGyIAABslAgAbQAAAG3H4BYCBAADAFg8bCyL8BYCBAADAFg8bCiIABoCBAADAFg8b +CCJ8KYCBAgBcbhEAAGH4QcQQDxsJIgALCTkCAApiAwEKYgQCCmIAAAlABAAAYQkACUACAABhCgAJ +QAAAAGECAAlBAAkaKAAAwBYBABsmAADAFwQAHSYBAAgn6QAIZA8gGyIABoCBAADAF1QFgIEPGhsi +AAAbJQIAG0AAABtxAAATJQAAEyQPRQAiAFwAOQcAAGIGYABiAABYOGBFwBBwRcAQeEXAEJBFwBBl +AABhJBDAEQCAEyQ4HMARDwATIgEAEzAEKMARD3MTIoIBEzAEKMARD3QTIgICEzAEKMARD3UTIkIC +EzAEKMARDxQVIgEAFSYPchMiCADMEQ9EACIKAABAAEAAcA4AAGEAABMlAgATJOwcwBEPdhMiGAjK +EQkAE0AcCMoRCQATQCAIyhEPeBMiBADKEQAAASQAAAElBgAAYQ92EyIsSMcRD3gTIgAAxhEDAAEk +AAABJQAAEyXCLBMkBCjAEQJGEyQEKMARwl8TJAQowBEPRQAiAFwAOSwAAGQAABMkAQATJTgcwBEP +dxMi4BzAEQIAAWIPARMiBAjAEeAFwBIEKMARDxMCIuQFwBIEKMARDxMHIugFwBIEKMARDxMEIgIA +cXAHAABh/wATJQIQEyQEKMARAAATJQAAEyTISccRBgAAYQAAEyUCEBMkBCjAEQAAEyVJABMkyEnH +EQ9wEyIBABMwBCjAEQMAEyQAABMlBAjAEQAAEyQ4RcAR7AXAEhgowBEPEwMiBAAAYQAAWDgAABMk +AQATJTgcwBEAABUkAAAAIcwFgIEAAMAWDxtQItAFgIEAAMAWDxsaItQFgIEAAMAWDxsZItgFgIEA +AMAWAAAAhcgFgIEAAMAWDxsEIhwEG2YbARtoFBzAEAoAG0AEABtuCwAAYQ8cHSIBAB0m+Q8AYdwF +gIEAAMAWBQAbYlQFgIEPGhsiAAAbJQIAG0AAABtxZAwAEADABhEBAAQn/AAEZAAAGyQCABslOBzA +EVQFgIEPGhsiAAAbJQIAG0AAABtxAAAbJUAAGyQwHMARVAWAgQ8aGyIAABslAgAbQAAAG3FkBoCB +AADAFgIBE2RCARMkBCjAEVBbgIEAAMAWBgETYgQIwBAEABNkD1wAIgoAAEAABgBwGQAAYQAAEyQA +ABMlAADAFwAIWDDIIMAQcEXAEBAIwBAAABMlAwATJBwIwBEcCMARAAATJAQIwBEPFBUiBAAVJvv/ +MDIDABMkGAjAEQ8UFSICABUmBAAwMAAAEyQQRcARGAjAEQAQWDAPfBMiCADMEQAAEyUAABMkNEjH +EQ97EyIBABMwBCjAEQ8UFSICABUm/wATJQIQEyQEKMARDxQVIgIAFSZoBoCBAADAFsIsEyQEKMAR +AkYTJAQowBHCXxMkBCjAEQ9NEyIEEMURAgATJPAcwBEBABMk7BzAEQAAEyRwABMlEBzAEQAAEyUA +ABMk4BzAEQEAEyQkEMARAAAVJAAAACEPDhoiAABAFgABG3ANAABhgABjJP/+GzIAAEAXAAAbJQ8b +DyI0BoCB/wAbMgIAG0EAGxooAADAFgAAGyUCABtAAAAbcQEAZHAHAABhAQBjJAAAGyQWBoCBAABA +FwwGgIEAAEAW7Q8AYQIAZHAQAABhAgBjJAEAGyQWBoCBAABAFw4GgIEAAEAW5A8AYQQAZHAHAABh +AgBjJAIAGyQWBoCBAABAFxAGgIEAAEAW2w8AYQAAHSQAAAAhAAIPbgkAAGEWBoCBAABAFgAAGyUS +BoCBABsaKAAAABYBABsmAAAAFw0AAGEsBoCBAABAFgIAGyYBEBtoAAAbJAAAQBcYBoCBABobKA8b +DiIwBoCBAABAFgEAGyYAAEAXnASAgQ8aGyIAABslAgAbQAAAG3EAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAoAAKACAAAAAAAAAAAAAFACAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACY +pYAAsAUAAJilgACgywAAuKCAAGx0AACYpYAAAAAAAJilgAAAAAAARLSAAJR0AAAwgAAAAAAAADGA +AACIiDMzMoAAAACqqoozgAAAAAAAADSAAAAAAAAANYAAAAAAAAA2gAAAAAAAADeAAAAAAAAAOIAA +AAAAAAA5gAAAAAAAADqAAAAAAAAAO4AAAAAAAAA8gAAAAAAAAD2AAACqqgoAPoAAAFOFiIg/gAAA +AAAAMDCAAAAAAAAAMYAAAJqZWFUygAAAAKqqqjOAAAAAAAAANIAAAAAAAAA1gAAAAAAAADaAAAAA +AAAAN4AAAAAAAAA4gAAAAAAAADmAAAAAAAAAOoAAAAAAAAA7gAAAAAAAADyAAAAAAAAAPYAAAKqq +CgA+gAAAVZiZqj+AAAAAAABQMIAAAAAAAAAxgAAAAAAAADKAAAAAAAAAM4AAAAAAAAA0gAAAAAAA +ADWAAAAAAAAANoAAAAAAAAA3gAAAAAAAADiAAAAAAAAAOYAAAAAAAAA6gAAAAAAAADuAAAAAAAAA +PIAAAAAAAAA9gAAAAAAAAD6AAAAAAAAAP4AAAAAAAAAwgAAAAAAAADGAAAAAAAAAMoAAAAAAAAAz +gAAAAAAAADSAAACaeQAANYAAAKqqqqo2gAAAAAAAADeAAAAAAAAAOIAAAAAAAAA5gAAAAAAAADqA +AACqqqoKO4AAAABwmao8gAAAAAAAAD2AAAAAAAAAPoAAAAAAAAA/gAAAAAAAAP//AAClAQEAuQHf +ALEAGwAWARsArwAbABQBGwBsAKAA0QCgAG8AgwBxAIMAdgCDAHMAMwBuADMAcAAzAHIAMwDXADMA +1AEGANABAAB+ADwA4wA8AHgASQDdAEkAfwBaAOQAWgCqAD8AqwABAA8BPwAQAQEAeQBqAN4AagCo +AAAADQEAAKYANwCnAAEACwE3AAwBAQAEAAgAnAHMAJ0BzADVAcwA1gHMALQAIAAZASAAMQIMADIC +DAAzAr0ANgIMADcCDAA4Ar0AoACIAAUBiAChANUABgHVAKIABAAHAQQAjwCIAPQAiACQACIA9QAi +AJEABAD2AAQAnwAMAPsADACUAAAAlQAAAJwAlQCdANAAmgCKAJgAEQCWADMAlwB3AJQAAQCVAAEA +nACVAJ0A0ACaAIoAmAARAJYAMwCXAHcAlAACAJUAAwCcAJUAnQDQAJoAigCYABEAlgAzAJcAdwCU +AAMAlQAHAJwAlQCdANAAmgCKAJgAEQCWADMAlwB3APoAAAD5AAAAAgGVAAMB0AAAAYoA/gARAPwA +MwD9AHcA+gABAPkAAQACAZUAAwHQAAABigD+ABEA/AAzAP0AdwD6AAIA+QADAAIBlQADAdAAAAGK +AP4AEQD8ADMA/QB3APoAAwD5AAcAAgGVAAMB0AAAAYoA/gARAPwAMwD9AHcAhQAAAIYAAACHAFUA +iAAAAIkAqgCKAAAAiwDdAIwAAACFAAEAhgABAIcAVQCIAAAAiQCqAIoAAACLAN0AjAAAAIUAAgCG +AAMAhwBVAIgAAACJAKoAigAAAIsA3QCMAAAAhQADAIYABwCHAFUAiAAAAIkAqgCKAAAAiwDdAIwA +AADrAAAA6gAAAOwAVQDtAAAA7gCqAO8AAADwAN0A8QAAAOsAAQDqAAEA7ABVAO0AAADuAKoA7wAA +APAA3QDxAAAA6wACAOoAAwDsAFUA7QAAAO4AqgDvAAAA8ADdAPEAAADrAAMA6gAHAOwAVQDtAAAA +7gCqAO8AAADwAN0A8QAAAPv/AAAAAAIADdIS0hPSFNIM0hXSC9IC0hHSBEMAEBQQCRAREAFAG9Ic +0gDSCgALAAQADgC1ABoBDwBCALwAwwAhASgBtgC3ALgAuQC9AL4AvwDAABsBHAEdAR4BIgEjASQB +JQEKAAAACwAAAAwAAAC2AAAAtwAAALgAAAC5AAAAGwEAABwBAAAdAQAAHgEAALYAAAC3AAAAuAAA +ALkAAAAbAQAAHAEAAB0BAAAeAQAAvQAAAL4AAAC/AAAAwAAAACIBAAAjAQAAJAEAACUBAAC9AAAA +vgAAAL8AAADAAAAAIgEAACMBAAAkAQAAJQEAABLSAAAT0gAAFNIAAAAAAQACAAMALABkAHQAgACM +AKEABwAAAAAAAQACAAMAAAAAALcTIgC4FCMAuRUkALsWJQC8FyYAvRgnAMAZKADEGikABxsAAAgc +AQALHQIADB4DABAfBAAiIQUAJCIGACYjBwAoJAgAKiUJACwmCgAuJwsAMCgMADQpDQA4Kg4APCsP +AEAsEABkLhEAaC8SAGwwEwBwMRQAdDIVAHgzFgB8NBcAgDUYAIQ2GQCINxoAjDgbAJE6HACVOx0A +mTweAJ09HwChPiAApT8hACRJBgIsSgoCNEsNATxMDwFkTREBbE4TAXRPFQF8UBcBhFEZAZVSHQGd +Ux8BAQQAAAIFAQADBgIABAcDAAUIBAAGCQUABwoGAAgLBwAJDAgACg0JAAsOCgAMDwsADRAMAA4R +DQABQAAEAkEBBANCAgQEQwMEBUQEBAZFBQQHRgYECEcHBAlICAQAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAHCAAAAAAACyDMgA/////////wAB//8CA////wT//////////////////////wX/Bv8H +/wj/Cf8K/wv/DP///w3///8O////D////xD///////////////////////////////////////// +/////xH///8S////E////xT///8V////Fv///xf///8Y////Gf///xr///8b/////xz///8d//// +Hv///x////8g////If//////////////////////IiMk/yUmJ///KP///yn///////////////// +/////////////////////////////////////////////////////////////5ilgABgwgEA9AaA +AECmgAAYAAAAAKaAAAAAAAAAAAAAAAEBAQAAAAAAAQAAAAAAAAAAAAAAAAAAAwAAAAEAAAAAAAAA +AwAAAMzfAQACAAAACP8BAAQAAADI3wEABQAAAJjfAQAGAAAAiJ0AABIAAACoJwAACAAAAPzNAAAJ +AAAAdDYAAA0AAAAgKwAADgAAAPTtAAAPAAAARNYBABgAAABcFAEADAAAAHjGAAAWAAAANN0BABAA +AABESAEAEQAAAFgCAgABAAAAmGoAABMAAADQ0wEAFAAAABzlAQAHAAAAXF4AABUAAAAEZQEAFwAA +AMyPAQAZAAAAsPMAAAAUBQAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAABwAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMSWAADE +lgAAxJYAAFh8AADElgAAxJYAALx8AADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAMSW +AABUiAAApIcAAJSHAAAkhwAAwIcAAOCGAADElgAAxJYAACSOAADokAAAOJIAAMSWAADElgAAxJYA +ACyWAABgjQAAmI0AAASNAADElgAAxJYAAMSWAADolQAAxJYAAOSMAADElgAAxJYAAMSWAADElgAA +xJYAAMSWAADElgAAxJYAAMh8AADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAMSWAADE +lgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAASA +AADElgAAxJYAAMSWAADElgAAxJYAAEiTAADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYA +AMSWAADElgAAxJYAAFB6AADElgAADHoAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAA +lHkAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAbIEAAOSAAADE +lgAAiIEAAMSWAAAkgAAAkIUAAMSWAADElgAAdIgAAMSWAADElgAAxJYAAMSWAADElgAABIoAAKSI +AADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAFyDAADElgAAxJYA +AMSWAADwkgAAxJYAANx+AADElgAAfJUAAMSWAADglQAAsJIAAMSWAADElgAATHgAAHCSAADElgAA +xJYAAMSWAAAshwAAxJYAAMSWAAAYgwAAnHoAAMSWAADElgAAxJYAAKCNAABAhgAAxJYAAMSWAADE +lgAAxJYAAMSWAADElgAA8IQAAMSWAADklwAAHJoAAEyZAAAkmgAARJkAADyZAAAsmgAA6JYAAMSW +AADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAIIMAAMSWAADElgAAxJYAAMSWAADElgAAxJYA +AMSWAADAmgAA1JsAAKx4AAAIeQAAxJYAAJR4AADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAA +xJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAMSWAADE +lgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAAMSWAADElgAAxJYAANB6AACkewAARHsAADSa +AAAgeQAAMHwAAGB/AADElgAAxJYAAMSWAADElgAAtHwAALh8AADElgAAxJYAAFx8AAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/////wAAAAD//////////wEAAACoDQAA +4QMOHuEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQCwAAAP8DADAM +AAAA/wUA1AsAAAD/LQCwCwAAAP89AEwLAAAA/wQAdAsAAAD/JQDcDAAAAP/dAPgLAAAQEEwAAAAA +AAABAQA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PBUVFRU8PDw8FRUVFTw8PDwAAAAA +AAAAAAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwVFRUVPDw8PBUVFRU8 +PDw8AAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8FRUVFTw8 +PDwVFRUVPDw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQOAAAsFgAAbBIAANgPAAD0FwAAfBMAACAVAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0 +BoAAQKaAABgAAAAApoAAAAAAAAAAAAAAAAAAAAAAAEwRAQA4sQAAECQAADixAAA4sQAAOLEAAKAG +AABo+gEAGN8AADixAAA4sQAAFCwAABQsAAAULAAAFCwAABQsAAAULAAAFCwAADixAAA4sQAAOLEA +ADixAAA4KQAAOLEAADixAAA4sQAAOLEAADixAAD83gAAOLEAADixAADc0QAAAAAAAOD3AADk9wAA +FAIAAHA9AQBwPQEAcD0BAHg9AQDkAQAAdD0BAAAAAABUwQAAlMcBAHzBAADExwEAoMEAAPTHAQA0 +m4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAC +AAIAAwAEAAQABQAGAAYABwAIAAgACQAKAAoACwAMAAwADQAOAA4ADwAmACcAKAApACoARgBGAEcA +SABIAEkASgBKAEsATABoAGkAagBqAGsAbABsAG0AbgBuAG8AcABwAHEAcgByAHMAcwB0AHQAdAB0 +AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AAoAPwAAAAAAAAAAAAAAAAAAAAAAAQACAAIA +AwAEAAQABQAGAAYABwAIAAgACQAKAAoACwAMAAwADQAOAA4ADwAmACcAKAApACoARgBGAEcASABI +AEkASgBKAEsATABoAGkAagBqAGsAbABsAG0AbgBuAG8AcABwAHEAcgByAHMAcwB0AHQAdAB0AHQA +dAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AAoAPwAAAAAA8CEAALghAABEp4AAAAIAAAAAAAAo +CgEAJAoBAESpgABABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAoBACQ6AQDUr4AAVAAAAAAA +AAAoCgEA+DgBAISugABQAQAAAAAAACgKAQAENwEAWAeAAAgAAAABAAAAKAoBABQIAQAAAAAAUAEA +AAAAAAAoCgEAoDcBANwygAACAAAAAAAAACgKAQCMNgEAVAeAAAQAAAAAAAAAMAoBACQKAQAosIAA +KgAAAAAAAAAoCgEAJAoBAHg9gAAEAAAAAAAAACgKAQDEygEAAAAAAAAAAAAAAAAAKAoBAITKAQBg +B4AABAAAAAAAAABuAG4AaQDAAKAAUACAAL4AUAF9AD4AAAAAAAAAnAIEAOYBJQBVAwQA3AFjAAAA +bgBuAGkAwACgAFAAgAC+AFABfQA+AAAAAAAAAJwCBADmASUAVQMEANwBYwAAAAAAAAABAQAAoA8B +ABXSAAAAAAAA/wMAAKAPAQAM0gAAAAAAAP8BAACgDwEAFdIAAAoAAAAA/A8AoA8BAAzSAAAJAAAA +AP4DAKAPAQAV0gAAFAAAAAAA8D+gDwEADNIAABIAAAAAAPwHoA8BAAbSAAAAAAAA/wEAAKAPAQAH +0gAAAAAAAP8DAACgDwEABtIAAAkAAAAA/gMAoA8BAAfSAAAKAAAAAPwPAKAPAQAG0gAAEgAAAAAA +/AegDwEAB9IAABQAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAQAA +XgEAAAEAAAABAAAAAQAAAAEAAAADAAAAAAAAAAAAAAAsHwEAxCEBAKwgAQDQJAEAeCMBAMAiAQB8 +IgEATCQBAJQeAQAAAAAAEAAAAACAAAAAAKAAECcAAOgDAADoAwAAAAAAAAMAAAACAAAAAwAAAAMA +AAADAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAIAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAQIBAQACAQABAgICAAEBAAIBAgECAAIAAQIDgICAgICAgIABgAKAgICA +gMAAkADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAA4sQAAOLEAADixAAA4sQAAOLEAADixAAA4sQAAOLEAADixAAA4sQAAOLEAADixAAA4sQAAOLEA +ADixAAA4sQAAOLEAADixAAA4sQAAOLEAADixAAA4sQAAOLEAADixAAA4sQAAOLEAADixAAA4sQAA +OLEAADixAAA4sQAAsPMAAAAAAAD///9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAACMCgAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHO4BABUAAADMWoAA +AAAAAAAAAAAAAAAAoOcBAAYAAADsWoAAAAAAAAAAAAAAAAAAxO0BAAUAAADMWoAAAAAAAAAAAAAA +AAAAuO0BAAoAAADMWoAAAAAAAAAAAAAAAAAAOOoBAAQAAADsWoAAAAAAAAAAAAAAAAAAOOoBAAQA +AADsWoAAAAAAAAAAAAAAAAAAOOoBAAQAAADsWoAAAAAAAAAAAAAAAAAAOOoBAAQAAADsWoAAAAAA +AAAAAAAAAAAAOOoBAAQAAADsWoAAAAAAAAAAAAAAAAAAROsBAAYAAADsWoAAAAAAAAAAAAAAAAAA +fOsBAAQAAADsWoAAAAAAAAAAAAAAAAAAfOsBAAQAAADsWoAAAAAAAAAAAAAAAAAAfOsBAAQAAADs +WoAAAAAAAAAAAAAAAAAAfOsBAAQAAADsWoAAAAAAAAAAAAAAAAAAROsBAAYAAADsWoAAAAAAAAAA +AAAAAAAAROsBAAYAAADsWoAAAAAAAAAAAAAAAAAAROsBAAYAAADsWoAAAAAAAAAAAAAAAAAAfOsB +AAQAAADsWoAAAAAAAAAAAAAAAAAAfOsBAAQAAADsWoAAAAAAAAAAAAAAAAAAtOgBAAoAAADsWoAA +AAAAAAAAAAAAAAAANOoBAAoAAADsWoAAAAAAAAAAAAAAAAAANOoBAAoAAADsWoAAAAAAAAAAAAAA +AAAANOoBAAoAAADsWoAAAAAAAAAAAAAAAAAANOoBAAoAAADsWoAAAAAAAAAAAAAAAAAANOoBAAoA +AADsWoAAAAAAAAAAAAAAAAAANOoBAAoAAADsWoAAAAAAAAAAAAAAAAAANOoBAAoAAADsWoAAAAAA +AAAAAAAAAAAANOoBAAoAAADsWoAAAAAAAAAAAAAAAAAANOoBAAoAAADsWoAAAAAAAAAAAAAAAAAA +NOoBAAoAAADsWoAAAAAAAAAAAAAAAAAANOoBAAoAAADsWoAAAAAAAAAAAAAAAAAANOoBAAoAAADs +WoAAAAAAAAAAAAAAAAAAFO8BAAYAAADsWoAAAAAAAAAAAAAAAAAAZO4BAAUAAADMWoAAAAAAAAAA +AAAAAAAAxOcBAAoAAADsWoAAAAAAAAAAAAAAAAAAfOgBAAoAAADsWoAAAAAAAAAAAAAAAAAA/OgB +AAoAAADsWoAAAAAAAAAAAAAAAAAA2OkBAAoAAADsWoAAAAAAAAAAAAAAAAAASOwBAAoAAADsWoAA +AAAAAAAAAAAAAAAACO0BAAoAAADsWoAAAAAAAAAAAAAAAAAAGAYCAAYAAADsWoAAAAAAAAAAAAAA +AAAAIO4BAAYAAADsWoAAAAAAAAAAAAAAAAAAMO4BAAYAAADsWoAAAAAAAAAAAAAAAAAAXO4BAAEA +AADsWoAAAAAAAAAAAAAAAAAAVPABAAoAAAAMW4AAAAAAAAAAAAAAAAAAzO8BAAUAAAAMW4AAAAAA +AAAAAAAAAAAA5PIBAAYAAAAMW4AAAAAAAAAAAAAAAAAATPMBAAYAAAAMW4AAAAAAAAAAAAAAAAAA +ZPYBAAoAAAAMW4AAAAAAAAAAAAAAAAAAAAAAAMxagADMWoAArCCgAGwgoAAwAAAAz////wAAAAAA +AAAA7FqAAOxagACkIKAAOCCgAAEAAAD8////AAAAAAAAAAAMW4AADFuAAKggoAA8IKAACAAAAPP/ +//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD06AEAFQAAAMxagAAAAAAAUAAAAAAAAAD0BoAAQKaA +ABgAAAAApoAAAAAAAAAAAAD0BoAAQKaAABgAAAAApoAAAAAAAAAAAAAAAAAA9AaAAECmgAAYAAAA +AKaAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/ +/wAAAQAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAECAwQEBAQEBQYHCAgICAgJCgsMDQAAbjtoO2I7 +XDtuOmg6YjpcOm45aDliOVw5bjhoOGI4XDhuN2g3YjdcN24paCliKVwpbihoKGIoXChuJ2gnYidc +J24ZaBliGVwZbhhoGGIYXBhuF2gXYhdcF24WaBZiFlwWbhVoFWIVXBVuFGgUYhRcFG4TaBNiE1wT +bhJoEmISXBJuEWgRYhFcEW4QaBBiEFwQbgJoAmICXAJuAWgBYgFcAW4AaABiAFwAVAAAAG47aDti +O1w7bjpoOmI6XDpuOWg5YjlcOW4raCtiK1wrbipoKmIqXCpuKWgpYilcKW4oaChiKFwobidoJ2In +XCduJmgmYiZcJm4laCViJVwlbiRoJGIkXCRuI2gjYiNcI24iaCJiIlwibiFoIWIhXCFuIGggYiBc +IG4SaBJiElwSbhFoEWIRXBFuEGgQYhBcEFcQUhBNEEkQbgFoAWIBXAFuAGgAYgBcAFQAAAAAAAAA +AAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfFwBAAgAAADM +WoAARAiAAMQIgABECYAAxAmAAAoNERQKDREUGRkZGQoKAAAABQYHCA0ODxAVFhcYGQAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChKcnBwk +nJycnJyVnHCDQTUZjSsAAAAABgYMAgAXAAAFEAogMEAAAAcOFQBch56ePQAAABQPFBIAAAAMEBQY +IAgEAAA8ODQwLCgkIBwYFBAMCAQACwcDADs3My8rJyMfGxcTDwsHAzE3OjM1OjU3AAAAAAEBAQEB +AQEBAgICAgICAgIDAwMDAwMDAwECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAV9mP2sPb89kb3kPfY9x/4Zfip+O34L/lw+bD57vkr+mf6ovrc+hT7 +S/uB+7b76vsc/E38ffyr/Nn8Bf0w/Vn9gv2p/c/99P0X/jn+Wv56/pj+tv7S/u3+Bv8e/zX/S/9g +/3P/hf+W/6b/tP/B/83/2P/h/+n/8P/2//r//f/////////9//r/9v/w/+n/4f/Y/83/wf+0/6b/ +lv+F/3P/YP9L/zX/Hv8G/+3+0v62/pj+ev5a/jn+F/70/c/9qf2C/Vn9MP0F/dn8q/x9/E38HPzq ++7b7gftL+xT73Pqi+mf6K/ru+bD5cPkv+e34qfhl+B/42PeQ90b3/Paw9mP2cLmDupa7qry+vdK+ +57/8wBHCJ8M9xFPFasaAx5fIr8nGyt7L9swPzifPQNBZ0XLSjNOm1L/V2tb01w7ZKdpE21/cet2W +3rHfzeDp4QXjIeQ+5Vrmd+eT6LDpzerq6wftJO5C71/wffGa8rjz1fTz9RH3L/hM+Wr6iPum/MT9 +4v4AAB4BPAJaA3gElgW0BtEH7wgNCisLSAxmDYMOoQ++ENwR+RIWFDMVUBZtF4kYphnCGt8b+xwX +HjMfTyBqIYYioSO8JNcl8iYMKCYpQSpaK3Qsji2nLsAv2TDxMQozIjQ6NVE2aTeAOJY5rTrDO9k8 +7z0EPxlALkFCQlZDakR9RQQEAAQEAQIDAAEBAgECAgMBAQEBAQEBAQICAgICAgICAwMDAwMDAwME +BAQEBAQEBAECAgICAgIDAwMDAwMDAwMDAwMDAwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAMQ1 +AAAUNgAA1DcAAIA4AADwNQAAZDIAAIwxAAD4MQAArDYAAFQxAADQNgAAPDcAADoBAgHVAN8A2gCi +AHUAfwCKBSoDOQGoAYoFygLZAEgBAQMPBwoUN25qARoB2QDoAAoBugB5AIgAygFKAeIA+QDKAeoA +ggCZAHTRRRfooosuAAUHAQMEAAUBBQAAAAUGAAIEAAUABQAAAQIBAgMEAAAFBgcICQoAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiM0AALjQ +AAAoywAAAAAAAAAAAAABAAAAAgAAAAMAAAAAAAAABAAAAAIAAAAFAAAABwcHBwcHBwcHBwcHBwcH +BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBgYGBgYFBQUFBQQEBAQE +AwMDAwMCAgICAgEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAACgAKAAwACwALAAoADwANABAADwAjABsAFgASAD0ALAAf/8HDx8/AQMwAAAA +NgAAAAwAAAASAAAAGAAAACQAAAAGAAAACQAAAAUABwIDBAYGQAOABsAJAA2AEwAaQB2AIIAGAA2A +EwAaACcANIA6AEHACYATQB0AJ4A6AE7AV4BhmQMzB9kKcw6mFeYcgCAZJDMHcw6mFeYcWSvMOQBB +M0jZCqYVgCBZKwBBplaAYVlsndiJnU7sxE40SIM0J3ZiJxqkQRoTO7ETERiBEQ/8wA9O7MROJ3Zi +JxqkQRoTO7ETDdIgDYmd2AkIjMAIB37gBzRIgzQapEEaERiBEQ3SIA0IjMAIBmmQBrCy1QUFVEAF +J3ZiJxM7sRMN0iANiZ3YCQZpkAbETuwEBEZgBAM/8AOqqqqqGqRBGhM7sRMP/MAPERiBEQ3SIA0K +qIAKEzuxEw/8wA8P/MAPDdIgDQu0QAsLtEALiZ3YCQ3SIA0KqIAKCqiACgiMwAgHeIAHB3iABwZp +kAYP/MAPDdIgDQu0QAsN0iANC7RAC4md2AkIjMAIiZ3YCQiMwAgHfuAHB37gB8EsKQcKqIAKCIzA +CAd4gAcIjMAIB3iABwZpkAawstUFBmmQBrCy1QUFVEAFBVRABdYdxgQBBw8fP3///2bmAAAFBgEC +AwQAAFQAVABsAGAAXABUAIwAeAANDwUHCQsBAygAKAA0ADAALAAsAEQAPAAsACwAPAA0ADAALABU +AEQAVVVVAUtoLwFVVVUF4ziOA6qqqgJxHMcBqqqqCsdxHAcABAAAZAAAAAAAAAAPAD8AAQAAAA8A +PwABAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8AAgAAAA8APwABAAAAARAA +AQAAAAKAAAFCBgIQAAIgAAADwAABQwYDEAACwAAAA8AAAUMGBBAAAkAAAAKAAAFEBgURAABAAAAD +wAABRQYGEQAA4AAAA8AAAUUGBxEAAQAAAAKAAAFGBggRAAIgAAADwAABRwYJEQACwAAAA8AAAUcG +ChEAAkAAAAKAAAFIBgsSAABAAAADwAABSQYMEgAA4AAAA8AAAUkGDRIAAQAAAAKAAAFKBg4SAAIA +AAACgAABTAYAACIWAACAAAADAAABWQAkFgABAAAAAwAAAVoAJhYAAgAAAAQAAAFaACgWAAIAAAAD +AAABWwAqFgACgAAAAwAAAVwALBcAAAAAAAQAAAFcAC4XAACAAAADAAABXQAwFwABAAAAAwAAAV4A +NBcAAgAAAAMAAAFfADYXAAKAAAADAAABYAA4GAAAAAAABAAAAWAAPBgAAQAAAAMAAAFiAD4YAAIA +AAAEAAABYgBAGAACAAAAAwAAAWMAZBsAAgAAAAMAAAFvAWYbAAKAAAADAAABcAFoHAAAAAAABAAA +AXABbBwAAQAAAAMAAAFyAW4cAAIAAAAEAAABcgFwHAACAAAAAwAAAXMCdB0AAAAAAAQAAAF0AnYd +AACAAAADAAABdQJ4HQABAAAAAwAAAXYCfB0AAgAAAAMAAAF3A34dAAKAAAADAAABeAOAHgAAAAAA +BAAAAXgDhB4AAQAAAAMAAAF6A4YeAAIAAAAEAAABegSIHgACAAAAAwAAAXsEjB8AAAAAAAQAAAF8 +BJEfAAFAAAADAAABfgSVHwADAAAABAAAAX8Flx8AAsAAAAMAAAGABZkgAABAAAADAAABgQWdIAAB +QAAAAwAAAYIFnyAAAcAAAAMAAAGDBaEgAAMAAAAEAAABgwWlIQAAQAAAAwAAAYUFAAA0dgEAAAAA +ADR2AQAAAAAANHYBAAAAAAA0dgEAAAAAADR2AQAAAAAANHYBAAAAAAA0dgEAAAAAADR2AQAAAAAA +AHABABgAAADIcQEAIAAAAKR3AQAUAAAAoHgBABQAAACQdQEADgAAAGx0AQAOAAAAYHUBABQAAABg +dQEAFAAAAEAjQCUhISEhQEBAQEAFBAQBAUBAQEAFBUBADAxADQwMAQEBBUBABQUABAAEQEAABEBA +QAVAQEBAQAVAQEAFBQUBAQEBQAUFBQEFAQFABQUFQAVABQUFBQUAAAAAAAAAAGQAAAAAkAEACgAA +AMSpAQBkrgEAiKsBACynAQCssgEAHLUBAFiwAQBArQEAyLEBAAQAAAAcEQAAHDIAABwzAAAEAAAA +HBUAABwCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKXGhPiZ7o32Df+91rHe +VJFQYAMCqc59VhnnYrXmTZrsRY+dH0CJh/oV7+uyyY4L++xBZ7P9X+pFvyP3U5bkW5vCdRzhrj1q +TFpsQX4C9U+DXGj0UTTRCPmT4nOrU2I/KgwIUpVlRl6dKDChNw8KtS8JDjYkmxs93ybNaU7Nf5/q +GxKeHXRYLjQtNrLc7rT7W/akTXZht859e1I+3XFelxP1pmi5AAAswWBAH+PIee22vtRGjdlnS3Le +lNSY6LBKhWu7KsXlTxbtxYbXmlVmlBHPihDpBgSB/vCgRHi6JeNL86L+XcCAigWtP7whSHAE8d9j +wXd1r2NCMCAa5Q79bb9MgRQYNSYvw+G+ojXMiDkuV5PyVYL8R3qsyOe6KzKV5qDAmBnRnn+jZkR+ +VKs7gwvKjCnH02s8KHmn4rwdFnatO9tWZE50HhTbkgoMbEjkuF2fbr3vQ6bEqDmkMTfTi/Iy1UOL +WW632owBZLHSnOBJtNj6rAfzJc+vyo706UcYENVviPBvSnJcJDjxV8dzUZcjy3yhnOghPt2W3GGG +DYUPkOBCfMRxqszYkAUGAfcSHKPCX2r5rtBpkRdYmSc6uSc42RPrsyszIrvScKmJB6czti0iPJIV +IMlJh/+qeFB6pY8D+FmACRca2mUx18aEuNDDgrApd1oRHst7/KjWbTosAAECBAQAAAAEDAwIBAwE +BEAAAACAAAAAAAEAAAACAABAAAAAAAQAAEAAAABAAAAAAPBhAAABAQIBAgIDAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAABAA +AAAAAAAAAQAAAAEAAAAAAAAA/wAAAP8AAAAAAAAAAAAAADCnAAAAAAAAKgAAAA4AAAAAAAEBAAAA +AAAAAAAAAQEAAAAAAgABAAICAwMD4O0BAOztAQD47QEABO4BAAzuAQAU7gEAAQEAAQIBAQEAAAAA +AAAAAAEAAAABAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAP////8A +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA +AAABAAAAAAAAAAAAAAAAAAAAgA0AAAAgAACADQAAgA0AAAAgAACADQAAAAYAAAAEAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAPj9 +AQAgIIAPAABAAGkgAABpIEAAaSAAAGkgQAAgIIAPAADoAGkgAABpIEAAaSAAAGkgQAAgIIAPAACU +4mkgAABpIEAAaSAAAEogAABKIQAASiIAAEojAABKJAAASiUAAEomAABKJwAASiAAEEohABBKIgAQ +SiMAEEokABBKJQAQSiYAEEonABBKIAAgSiEAIEoiACBKIwAgSiQAIEolACBKJgAgSicAIEogADBK +IQAwCiSAP4EAAEBBLJwwQCycMEIkHDQKIoA/gAAobwojADfqDoAGSiYAcGkgQABKJgBwSiYAcEom +AHBKJgBwABYAcIAArB9AeCAgQIcAAAAAAAAAAAAA/ByItvwcSLb8HAi2/BzItfwciLX8HEi1/BwI +tfwcyLT8HIi0/BxItPwcCLT8HMiz/ByIs/wcSLPgfuB4BNw43TXw4HgE3DTdM/DgeATcMN0x8OB4 +BNws3S/w4HgE3CjdLfDgeATcJN0r8OB4BNwg3Snw4HgE3BzdJ/DgeATcGN0l8OB4BNwU3SPw4HgE +3BDdIfDgeATcDN0f8OB4BNwI3Rzw4HgE3ATdGfA0FBowMBQZMCwUGDAoFBcwJBQWMCAUFTAcFBQw +GBQTMBQUEjAQFBEwDBQQMALHAcawJE0zsCQfM+B+8cBOD8//z3GgAKwvGIHPdaAAyB8g3pq4GKEF +2NClQx0YEADYfgigD4240aWNB8//8cAeD8//z3GgAKwvGIHPdaAAyB8g3rO4urgYoWTY0KVDHRgQ +ANhOCKAPjbjRpV0Hz//geOB+4HjgfuB44H7geOB+4HgKIkCAANnuAAEALyYA8EomQABOAAYATwAg +AIol/w/geAoiQIAA2c4AAQBsACQALyYA8FwABQArCDUISiZAAAhxANgCIb6A4CDFB0J5AeACIb6A +4CDFB0J56wfv/wHgLy0BAEAlRQACJnzxAAAgAAAoQAHoIGIDLyAAgC8hSwACIb6AwCCGAcIhhgDg +fhEAIABKIAAQSiBAEA4iQgAvIAsSziBFgIol/w8IAAUALy0BAEAlRQACJnzxAAAgAAAoQAFKJkAA +6CAiAy8gAIAvIUsAAiG+gMAghgHCIYYASiYAAEIg/pDOIIIBRCB+kM4hggHgfrkAAADgeAokgPAF +IEQA4CDBB0Qk/oBBKsQAhAACAC8kAvFCIQEBQiADAeggogQEEQQCBBEFAgQRBgIEEQcCBBsIAQQb +SAEEG4gBBBvIASwAJQBEIj6BPAAiAEQi/IBAIcEA4CDBB0AjwwCoIIABARGEAgEbCgEgIMAHBBEE +AgQRBQIEGwgB1Afh/wQbSAFEIvyABBEEAskH7/8EGwgBQiFBAEIgQwCoIIABARGEAgEbCgEgIMAH +CiYA8Iogvw/KIGQA4H8vIAMA4H+KIP8P/ByIsfwcSLH8HAix4cPhwuHB4cAHwBwcwDHhwOB/AcBT +IkKB4HxOIgOIFgAMAAEozAAAKYEAACiAAOB/hXlOIwMAACjBAOB/AnjgeFMiQoHgfE4iA4gWAAwA +ACnMAAEpgQABKIAA4H+FeE4jAwABKcAA4H8ieeB4CHQA2AUqfgAvcQUqPgMAIECOASHBDgUrPgPg +fydx4HgzACAASiQAAAchxAAvJkDwSiUAABAAJgAvJAQBDiBAgQMlQQCA4w4AAwAOIkKBAyXDAAUj +hYAwAQEAeXNIdAhyKHMKJcCCSiIAEBoABADAIiEYyiUBgy8vQQHAImMQwCLDEUonAAAKJcCAwCch +CBYABADKJYGALyhBAcAnYwDAJwMADieHgsonJABAJ0cACiXAAUwnAIgA2RAAJAAA2EhxaHIA20In +B4gKJEBxKAABAE4nCoh+AAEAACmAAgEpwQEAKoUCoHEBKsIBACuFAgErwwGgckwiAJhqAAkAqCCA +BQAgAIABIUGAASKCgAEjwwACIgKDAyPDggwABgAAIgKDASPDgsAgZgBCJD6ASiUAACAAAQAMAAoA +DiJCgQMlwwAvJACBDAADAA4gQIEDJUEA4H4ocEhxaHIA2yAggA8AAIQFqCCAAwAgAIABIUGAASKC +gJFywiIGA8UgZgAgIIAPAAC4BQDaCWoA2y8hAgAgIIAPAADgBeB4UyJCgeB8TiIDiBYADAAAKcwA +AimBAAEogADgf4V4TiMDAAIpwADgf0IpwQfxwOHFz3CAANwgTYDPdYAAmKEghbe6uLoEIYEPAwAA +AAe5RXktoKYJYA8A2ACFz3GAAEzLUSCAgs9wgACMvEyIFWrHcIAATMhggFZ5QYEG8pW7YKCrugXw +tbtgoIu6C41BoaO47QLv/wut4HjhxeHGwIBhgKCBAYEAJY2TASDAAKCiAaLBxuB/wcXgeKLB8cBK +Cs//RcHPdYAA3CAnhRUIQQAwlRQUDjEJDkEQWR2CEM9xgAAwJjGBHQhBAM9xgABAJjyRFBQNMQ0N +QRDPcYAAqCZJqYvqz3WAAEwHwY2A5gDZyiBBACTyIa0LCpEDAdge8EEoDQIHfUEoAQSnec93gABM +B6CPUyVFER8NMgTGuQohwA/rcs9wAADNG5/bZQEgAYokgw8PDZ4RANgM3BcCz//PdoAAzMoWJk0R +p42gr8l1FiVNEQClFBQAMUatx3GAAMzHArUAiQetABlCAQAbQgHH8QjIz3KgAMgfDhoYgAnIDxoY +gArIEBoYgAsSATYCyCR4ERoYgAzILRoYgOB+n+HMIO6HzCBOgAb3AnlBaQsKEQiKIf8PBvAA2Q8h +gQBhuRh54H8ocPHADgnv/4ogDwqCJAI6mnF6clpziHWodwohgCEKIMAh1ghgAJ7BinDOCGAAi3GC +xmpwxghgAMlxSnC+CGAAhMGpcLYIYACGwYjF6XCqCGAAqXEqcKIIYACKwQpwmghgAIzBqXCKwUoI +IAGQwotwyXE+CCABksLJcITBNgggAZTChsCpcSoIIAGWwpjGkMCSwY4NoADJcprHlMCWwYINoADp +cslw6XEKCCABnMKcwJ7BPgsgAI7Cn8UuDaAPBG2OwDIJIAAkbbcIEACGwIrB6g3v/0AlAhOLcITB +3g3v/0AlAhWUwEAlARM2DaAAyXKQwEAlARUqDaAA6XLJcOlxsg/gAJzCjMCcwRYNoADJcjINoADJ +cMlwjsHWCiAAQCUCF5LAQCUBE/oMoADJcpbAQCUBFe4MoADpcslw6XFyD+AAnMKMwJzB2gygAMly +yXCOwZ4KIABAJQIZqg8gAEAlABfPcYAA9AcQoZoPIABAJQAZz3GAAPQHEaEH8ADZz3CAAPQHMKAx +oN0Hr/+AJAI64HjPcYAA7G7gfwhh4HjxwIYPr//YcCh2SHGIdTIO7//JcAh3qXAmDu//qHEIcQAu +gAMEfyZ/ACtAAyR4wQev/+V48cCCDUAFz3GAAHAb8CEAAEB4gNnPcKAA0BswoNHA4H5ggECBAYAh +gVBzzCBBgOEgwQfKICEAMHCG9gT2CQrFAOB/AdiKIP8P4H7geIDhyiRNcOggbQLPcaAAUAwlgQEY +UgDgfvHA7g6P/89wgADcIAOAGBCFABsNEQEKIcAP63KKIE0DXNt1BuAASiQAAIogBw4GCmAGANnP +doAARK0tjgTpDI4ZCEIA7glgBooghw2KIIcN4glgBiyOYPDPcKAAsB8bgM93gADongKniiBJBsYJ +YAZu2YogCQa+CWAGIodMjg2Oz3GAAEzQaJFAp891gAAEuhsI4gABpwixANlNHUIQAdkspTWFBwkF +ABWlEI4EpRGOAugE6gDYCvDPcIAA3CADgAmA9QiegAHYAqWKIEkGZglgBo7ZiiAJBloJYAYihwKF +IIeA4MogYgAYuAV5BIUKIgCAiiAJBsoiYgAQujYJYAZFeQyOhegChYDgsA/BBPINoAYC2EEGj/+i +wfHA0g2v/5hyRcFBKAECB3lBKAIEJ3rGus91gADMx0llXWUnCd8BFBQOMc9zgADMymhyNnrgggsI +wQPikhMPgBMniqdq7wnegQDYJ/DGiobugN/PcIAATAfhqM93gAAwIQWPCw4BEIDYBa8J8M93gACo +JgmPCw4BEIDYCa/GijZ7AByAAweKh7kArc9wgABMB0CIIKgB2EerDNyjBY//8cA6DY//SHXBgECB +YYEAgLII7//JcQCljQWv/yGl4HihwfHAAxICN9dyAAAAQAHawiKKABe6x3IADgAAg7rsc0Cj7HIA +oqYLYAQocNHA4H+hwOB4peAf8gn2LwjQADMIEAE7CFEB4H8B2L3gD/IG9isIUQvgfwLYzOAP8owg +Q4cN9OB/BtjgfwDY4H8D2OB/BNjgfwXY4H8H2AjY4H7gePHA4cWKIFIO0g8gBq3Zz3WAAOQzqXBA +JYEb6gigDC7aAdjtBK//YR0CEOB48cBmDI//Hwi0AAh2CiHAD+ty/diLuHPbSiQAAPUD4AC4c893 +gADkMxeHEw4BEM9wgABENMhg3wgQAG4IYAcF2BpwiiASDmoPIAbJcUQuvhsAJ0AeQJAhkAi6RXnP +cqQAuD2bGlgAIpDKGlgAI5DLGlgAJJDEGlgAJZDGGlgAJpDHGlgAJ5DCGlgAKJDDGlgAKZDFGlgA +KpCjGlgAz3GAANwgI4EogVEhAIDPcaQAtEUA3QzybJBLkHt7ZXpTGZiATZBUGZiABvBTGViDVBlY +g06QVhmYgE+QWBmYgFCQVRmYgFGQVxmYgFKQWhmYgFOQXBmYgFSQWRmYgBWQWxkYgNIOIAcKcNen +ACaAH4AARDSgqLkDj//geIbg8cAA2A/0z3CAAGCtQgzv/wbZz3GAAACuAIGCuAChAdjRwOB+4HiD +4PHAANgJ9M9wgABYrRoM7/8D2QHY0cDgfuB48cCB4OHFANgJ9M9wgABbrQHd+gvv/6lxqXBtA4// +4HjxwJbg4cUA2Iz3z3WAAJihqXDaC+//BNkLjYO4C60B2EUDj//xwJrg4cUA2Iz3z3WAAJihBG22 +C+//BNkLjYK4C60B2CEDj//xwKTBkOAA2cogQgAT9Itwkgvv/xDZABQAMYTgzCBigQj0z3CAAAC8 +H4AJCF4FTHAB2KTA0cDgfvHAagqP/wh3z3CAANwgA4AYiBpxjQgQAYTnAN2GACUAyiBFA892gABE +rUAmABM+C+//BNkujrCuUyEAABGuQSjAIKC5XQhkAAIgQgBjv1UKxQMP6s9xoADQDxARAIZhulhg +EBkYgCURAIYPeALwD44A2VMggiAPIYEAJHgvJgfwz3GfALj/EK4Ygc8g4gfQIOEHGKEYgZ64GKEY +gb64GKEB2C0Cj//gePHAwgmP/xpwocG5CDQhANiLcATdrgrv/6lxAMDPdqAA0A+RCIEPmglQbxbw +JRYDliUWApYvJMcAJRYAlk9/D30IvaV/GQwQAxAWAJb9YfhgEB4YkCNt2QhFoCnwgufMJ+KTzCci +l8olQhAh9M91gABgrUetJRYClgitSa0lFgKWZq1KraJpFQ/RE89wgABrrTIK7/8N2Q3lEw8RF89w +gAB4rSIK7/8N2Q3lAiBBIwTwQiABIRAWAJY4YBAeGJAB2GUBr/+hwOB44cT8HMi+/BxIvuHA4cHh +wuHD/BwIsfwcSLH8HIix/BzIsfwcCLL8HEiy/ByIsvwcyLL8HAi/aiSAEOHEaiTAEOHE8cDPcKAA +0BsUgM9xgABIBgQggI/PUQThAKER8i8pAQAPCJ4FLymBD0AAAADPcIAAsDDwIEAAQHgSD4//0cDB +xGskwBDBxGskgBDBxJ90BBQLNAQUCjQEFAk0BBQINAQUBzQEFAY0BBQFNAQUBDTBw8HCwcHBwMHE +RSx+EAomQH7BxGskgBTBxCAgQIfgeAhyX7hAoeB/AaHgeOB/AICMIFyCAdjgf8IgCwDxwBYIr/9K +JEAAz3aAANwgFSYDEKCDQCYAFRB1wiQCAfAmDhGKIBUFJOYwJgUQFw0QAAohwA/rco7Yjbh9B6AA +c9seZcmGuGDFeSmgYIMG2DAjgQ8AAHgFRnhodIAkFR4keGIMIA8ApBkAj//xwKYPb/+KIAwJz3WA +AGwGJIXaCgAGBIWJCBEAz3aAAGCwERYClgDfhCoICAAhgH+AAGSoAqUkiAHb66VspSLpGx7YkwwQ +BQAEJYEPwP8AAEEpBAbPcYAATNAUEQYABS4+AQAhhH8/AP//BCRBARweWJAgkIwhgoYB2cIhTgAq +peelJIDPdoAAnKzAuSa2z3aAAAgsKK5ArgKIZKUBrh/wBIU7CFEA6gkACADYBKUChSSIk+knhRzg +NngkiM9wgADQIxqIEHEB2cB5z3CAAAQsIKAC2ALwAdgDpTUHb/8B2PHAxg5v/4ogDAqjwc91gABs +BiSF9gkgBgDeBIWm6GILQAAB2ASlAoUEiIDgUAIBAM9wgAAELACAgOBEAgIAz3CgACwgA4DPcoAA +wKwhghlhz3CAAPQrAIA4YMYIYA0AooDgHAIBAHjwBIWFCJEACoWP6AwVBBAQFQUQCiHAD+tyz3AA +AIoM6QWgAIojTgkihUeFQCEAB1Z4RohgwkaIARyCMEaIAhyCMEeIYcJHiAUcgjAHiAYcAjCKIFMB +TgkgBqgRAQAChYtxugogDKgQAADPcKAALCAjgM9wgAAILCGgvg+gAMWlA9gEpcrwBIVxCNEAQoUn +hUAiAAc2eAWIJwheAQOSz3GgACwgI4HPc4AACCxhgwq4YnkLCQQACdgLpYbwBYWM6ASKgOCq8s9w +gADArO4PIA0AgIDgovIFhQboBdgLpQHYCfDPcIAABCwAgIDglvQA2BIIgAaS8ASF1whRAL4OAAMi +hUeFQCEAB1Z4RYgzCh4Ag7pFqM9zgACAOsmDz3KAAESs2qL5g8WD/mbboviDxIP+Ztyiw4N3g35m +3aIFiFcIXgD2DQANkOgKIcAPAoXrchwVBRAEEIQAz3AAAIsMqQSgAIojzw3qDSANAth6DSANCNgi +hQSJFQiRAAHYAKUA2A6lYg0gDVrYIoUEiQsIUQAB2AGlB4Uc4RZ5BYmGIP+MyiCCDwAAMEP4CyIE +yiEiAAKFJ4Uc4DZ4BYiGIP6HBPIC2ASlKvAE2ASlJvAkhQHYSQkRAQ+lz3egAMgfPIfPcIAACCwh +oL4P4AWKIAwKz3CAAAgsDNl12h7bxgvgCxi7FYfPcYAA/Cu2DeAAIIEGpcSlBNgDpQHYsQRv/6PA +8cBGDG//iiCMCc91gABsBiSFdg/ABQSFewgRACKFR4VAIQAHVnhEiM9wgAC4BgCQAd4hCgEAz3CA +ALoGQJDPcIAAnKwGkA0KAQDEpQDYTvAEiR7oz3CAAAQsAICY6M9wgADArCGAz3CAAPgrAIDODKAF +OGCM6IogTA0OD+AFiiENBWIOYAYA2AHYMPDEpQHYLPAEhVkIUQAChc9ygADcICOCZIBooSOCZYAc +4GmhJ4U2eCSIA4IA3jSwAtgE2XYL7//Jcs9zgACcrEKFB4VAIgEHFnkGkySJRII2DyALyXPEpQPY +A6UB2MkDT/8MFQQQEBUFEAohwA/rcs9wAACJDOkCoACKI80O8cA6C0//z3aAAGwGBIahwbnoJIZq +DuAFiiCMCs9xgAAELAHYAKEA2A+mAKYBpoogkwFODuAFiiEZAwLdqXD+CWAEAdnPd4AA3CAjhzAh +gA8AAHQFKHSAJBUdANmmuACkqXDKCu//BNrCCeAOqXAjh0iBNJFTIgAAjg4gCwHbpKZl8ASGYwiR +ACSG9g3gBYogjArPcYAAuAaKIIwM4g3gBSCRz3GAALoGiiDMDNIN4AUgkQKGBIgX6AmGlejPcoAA +wKwEgiOCDiCDDwcAIKETC0UAB9gLpgHYDKYJpgPwOGADogPYMvAEhiEI0QAkhpIN4AWKIIwKC8gE +IIAP////AwsaGDAE2CLwBIZHCBEBJIZuDeAFiiCMClMgwEDPcYAAWFnSDiAAAKHPcIAARKw4gM9w +gAB8qoQpCAgwIEAOUSBAgAXYyiChAQSmAdgf8ASGAd9BCFEBz3WAAESsGIUE2ZnaHttAwItwMgng +Cxi7GIXppoQoCAgAIYB/gABUqiqAobkqoAbYBKYA2BkCb/+hwASGuwiRgQbYA6YA2Nbx4HjxwJoJ +T//PdYAAbAYEhaTBi+gkhcoM4AWKIIwIAoUEiJboAtgEpQSFmwhRAAWFgQgRAM9woACwHxuAz3GA +AOhdigogDSCBr+gA2DPwAN7Fpc93oADIHxWHz3GAAPgrmgrgACCBz3GAAOhdBNrJcwChpBcHEM9w +AADgeEDABdhBwAHfQsdDxslwBtmYdrh2ACeHDwcAIKEeCWAE2HbkpelwLvD+CGAEBdgE2APwBdgB +2oPoAdgk8CmFIQlQAEylC6UM8ASFNwiRACSFFgzgBYogjAgJhQkIUQAB2A7w6+gChS4PIAQDgAhx +z3CAAJBXZgvADADY+gkABt3xANgFAW//pMDgePHAlghv/4ogTAnPdYAAbAYkhcoL4AWkwQSFgOCm +9AKFR4UkgFZ4z3KAANAjBCGBDwAGAACA4QHZeoogEI4AwHkTDsEQz3eAAJys5pfYigsOwBMA3gXw +1or7CYGDAd7PcYAABCzAoZbuz3GAALgGIJEhC0EAz3GAALoGIJF4ihULQQDPcYAAvAYgiVaKCQpA +AADZA/AB2cUJEAAcEAQAz3CAAMCsBBgAAc9wgADongQQBQDPcIAATNAFgAUofgFAKYBykHDKIs4H +yiCODwAAiAzKI44PAAD4AmQHbgDKIc4Pz3CAAPgrAICmCKAFgHCF6J4KQAxM8AvIBCCAD////wML +Ghgwz3CAAHRdAIgA3sWliejPcKAALCAQgMdwBwAgoRKlSBUHEM9wAACseEDABdhBwAHfQsdDxulw +BtkE2gDbmHO4c2oPIATYc89wgAB0XcCo5KXpcB3wANjPcYAAdF0AqQLZI6UV8ASFAd4hCFEABYWc +6M9wgADArCGAz3CAAPgrAIAKCKAFOGAG6AHYcQcv/6TAz3CAAHRdwKj+DiAEBdgA2ASlpvEF2Aul +PgggBslwANnPcIAAdF0gqOjx4HjxwNIOD//PdoAAbAYEhtMIEQAChgSIE+jPcIAABCwAgI3oz3CA +AMCsBgkgDQCAB+hGCWAGANg3AwAAz3WgAMgfPIXPcIAACCwBgEeGAnkChlZ4B4ANCQQAAdgEpg8D +AAAAhgroEQteQALYFR0YkO4O4Awe2BWFz3aAAGwGig/gDCaGgODmAgEAFYXPcYAA/CuiD6AAIIEG +pgKGJ4Yc4DZ4BYiGIP+MCvLPcAAAMEPPcYAAJCxiDcADAoYnhhzgNngFiFEgQICmAgEAAIYF6B+F +gOCaAgIAJg3AA5MCAAAEhoHgjfQkhjYJ4AWKIEwKz3GgACwgI4EmCeAFiiBMCgKGJ4Yc4DZ4BRCG +AADdr6Z7Dh4Az3KAAAgsz3CAAIA6eIAkgHlhz3OAAESs/IO4qlwQBAAMEAUAACUFAXQTBADieQIl +BQH6gyQQBAACJMSDe4MFgGJ4yidBEwPyAd/4qg7pQCyDAAsJxABPJ4AQBPAG6E8nQBAPfxiqQSnA +ADhgCwhFAYK/+KpbDl4AAIYN6M9xoAAsICaBDoYieM9xgAAILAWhoKYE8AGGAuihpk4MwAPyDcAM +JQiQAOt16g3ADAwWBBC4cM9wAACMDAohwA+pcq0EYACKI9MI7g3gDADYAoYnhhzgNngFiIYg/4wE +8gLYBKa98ATYBKa58ASGGQiRAM9wAAAwQ89xgAAkLAoMwAME2ASmBIaE4Kz0JIb+D6AFiiBMCs9w +oAAsICOAz3CAAAgsQCAQBzeg4g+gBYogjA0ihhwWBBBAIQAHFiAAAQWIAN0/CB4ASiTAcKlyqXOo +IMAB8CDAIAHjGmID30okQHEA26ggwAHwIMAjAecbYxMKxQDPcoAACCwYioK4GKrPcIAAwKyjoEyR +QCRAAA8IpQAHpoYRAAYRCF4AAdjKDiAGDKZd8D4N4AULhgvIBCCAD////wMLGhgw9g6gB6umiiBM +DUoPoAWKIVQLB4YihhZ5iiBMDTYPoAUngQLYA6YChs9ygAAELCSIjuknhhzgNngkiM9wgADQIxqI +EHEB2MB4AKIs8CCCBekB2AOmJvAnhjZ4HBAEAM9wgADArAQYAAHPcIAA6J4EEAUAz3CAAEzQBYAF +KH4BQCmAcpBwyiLOB8ogjg8AAI0MyiOODwAARQUcA24AyiHOD6SmzQMv/wHYDBYEEBAWBRAKIcAP +63LPcAAAjgz5AmAAiiOVA/HAz3CAAAQsAIAW6M9wgAAwMQCAlOi6DEAFgOALyMUggg8BAAD8CvQF +IIAPAAAAPAsaGDALyJC4CxoYMJoOQAXRwOB+8cAKCw//SHVAgGGAwYEAgVoOL//JcQClXQMv/yGl +4HhAgCGATiIDgADaAyJCAGCg4H9BoPHAzgoP/89xgADsPAmBAeAJoc9xgADMHwCBAeAAoSUIUQAB +2M91oADIH1EdGJAg3tClQx0YEADY8gugDo240aXPcMAAR2jPdqAA7CcGps9xgABYMwSBJQhRAAaB +z3eAAOi5QHgYj5joz3ABAAYBBqbPcBIABgQX8AohwA/rcs9wAACHGYojRQBKJAAA7QFgAAolAAHP +cAEABwEGps9wEgAHBAamYIfPcgAAAjPPcQAAgkwDhxnrRCh+AwAhjX+AADBoxtiSuAamz3A5AAIz +BqbPcDkAgkwGps9wOQACZgamx9iVuBLwRCh+AwAhjX+AAOhox9iSuAamRqYmps9wAAACZgamxtiV +uAam3g2ABgHYz3GqAOAHE6EYj0YOoAsgh89wEACHcgamAY0QuAUggA8AAEJyBqYFjRC4BSCADwAA +QnAGpgSNELgFIIAPAACCcAamA40QuAUggA8AAMJwBqYCjRC4BSCADwAAAnEGpgmNELgFIIAPAABC +cQamCI0QuAUggA8AAIJxBqYHjRC4BSCADwAAwnEGpgaNELgFIIAPAAACcgamC40QuAUggA8AAIJz +BqYKjRC4BSCADwAAxnMGps9wAQBGagamz3WgAMgfpBUQEM9wgAAGdAamz3CAAAd0BqbPcIAAxnMG +ps9wQABCdAamz3CAAMdzBqbPcAIARmoGps9wEADGagamWI8AjySPgOIB2sB6sgggDnmPJNgY2TIK +oA4z2icIUADPcIAA7DwkEAQADBcFEAohwA/rcs9wAACKGTUAYACKI0YPz3AQAMdqBqbPcBAAhnIG +psYOAA7KDQAOJNgB2eoJoA4z2icIUADPcIAA7DwkEAQADBcFEAohwA/rcs9wAACqKO0HIACKI4cC +pBUAEM9xgADsPAIgAAQIoc9wAgBHagamz3BlAMJuBqbPcIAAzB8AgM9xgADMH0IgQIAAoQX0ANhR +HRiQYQAP/+B44cUB289ygADIBX6y4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeAa4RSDNAM9woADsJ6agCoAA2wCxfrLgf8HF4Hjx +wIogygbSCqAFANlmCcACFgiADrINQA6A2c9woADQGzCg0cDgfuB48cBWD8/+OnAacUojQCCgkCbw +inUk8BUhwCQAEBQBAhASAUAjUyAMJICvAAD7/y8jyCRx9j8NgB8AAP//TCAAoMwlgZ8AAP7/FfJM +IECgzCWBnwAA/f8P8hMIkCDPcAAA+/+3DQGQRQfP/vUNgZ8AAPz/z3aAAMwfAIYB4ACmJwhRAAHZ +z3egAMgfUR9YkCDYEKdDH1gQANgqCKAOjbgg2BGnQCyAIU8gQQBAKgAkJXjPcaAA7CcGoQCGQiBA +gACmzvXPcaAAyBwA2BGhyPHgePHAz3CAANwyAICB4Mohwg/KIsIHyiCCDwAArxPKI4IPAADLAcok +IgAYBiIAyiUCARoIAADRwOB+8cCCC8ANEgqAC9HA4H7gePHAOg7P/s9wgADcIAOAocEogM9wgADY +sM9yDwAA/MC5NnhkgCCACrvJuUR7JXvPcacAFEhtoWWAAYAKu8m4ZHpFeA6hz3KAAHDGDYqGIP8B +O2jPcIAAaJQsqC6KQCAVA4Yh/wFDuS2oL4qGIf8BQ7nSD2AGLqhAwM9xgADMHwCBAeAAoSMIUQAB +2M91oADIH1EdGJAg3tClQx0YEADYDg9gDo240aXPcAgAhxDPdaAA7CcGpUojwCBKIAAgCiIAJAoh +ACQyJZQkdQwTIQDeFPBAIIAhEHgGuIG4EL/leAalQCGBITB5BrmBuUAtAAQleAalAebPcIAAYDEg +gGB5BtjHDgUQ7wyOo4pwZgygBMlx2HCKcDoLoATJcZhwQC5AARB4ELiBuIe4jLgGpRbuNQ5REIoh +xAaKIIQIEvAKIcAP63LPcAAAsBOKIwkNCiQABakEIABKJQAAttm92BpxOnAA3wTZn3G4d6gggAth +uQAhAwRwewAUBjBALAIBBruBu0AugAEaYjV6x3KAABSxApIceBC4ZXgGpQKSwLg4eOV4EH9jkgAh +QAQQeAa4fHuBuBC7ZXgGpQOSwLg4eAUgQAEvJQgAhvFCI1MgTCMAoPgG7f9AIlIgz3AIAIYQBqXP +cIAAzB8AgM9xgADMH0IgQIAAoQf0z3GgAMgcANgRoY0E7/6hwPHAatiOD2AF+tkA2I249g/gCgYa +GDAMzIYg/4oI8s9wgADsOACIgOAQDsID0cDgfs9xAwBADc9woACoIC2gz3GAALgIQIEBagChz3Cg +ADguBYAEIIAPwAAAAB0IgA/AAAAASNjPcZ8AuP8aoVuhadgYuBmhz3KAABBWBYIDgCCAx3EAAIgT +gQZgDEhw8cC2C8/+z3GAAKxgIYGjwULBz3GAANwgFSEQAAAQACC2EA4GLyiBA04gjQetDhAQFW0A +IJEPgABMyAYRgCDPcYAAzMoWeQCBIpGO5QgcRDDKIGEABfKLcpYNL/8CwTfoANjPcYAA7AZAgQ8g +QAMvIgogBCKAoAChBvSA4vQL4gbKICIIr3iiDeADENkA3wQZxCOKIQgAABlAIKlw6XEmDuAFD9oA +EAIgthIABgQggAS2GhgAz3CAAEzLtnjgoOGgz3CAAKzHtHjgsBAmTpMvKIEDTiCNB671OQPv/qPA +4HjxwOHFCHUE8CINQAyCDWAMqXD86EUDz/6jwUDAQcEFFIEwANiB4ULCDfKC4Qfyg+EN9CHBANgP +IEAAAxSBMA8gQAACFIEwDyBAAAYUgTAhCVAAEwmQACMJ0QAhwQPhDyBAAAMUgTAD4Q8gQAACFIEw +A+EPIEAACRSBMCEJUQACFIEwCrlPIQIEAxSBMAy5JXohwQ65RXkleCDBFQlRAAcUgTAiwga5CLpF +eSV44H+jwKPB4cVCwQkUgTBDwkHAGQkzAQDYEQlSAAoUgTAJCVIABwkSAQHYBxSCMAYUgzARC4AA +IsEwc8wiQoAD9AHYIcUhDVEQChSBMCPDGQnDAAsUgjBQccwjqoCE9oDiyiBpABsIUQCKIckPz3CA +AEQHIKCB5f/ZyiEiACGgwcXgf6PA8cAKIcAP63LPcAAAiicc24okww9FASAAuHPgeKLB4cVCwUEo +AgIHekEoAQRHec9ygADMx8a5KmIlCt8BCBQDMc91gADMyqlxVnlAgQsIgQBCkREKwABHie8K3oGA +2APwBonBxeB/osDgfuB48cAIyJW4CBoYMAnIm7gJGhgwC8iKuI24kLgLGhgwz3CAANwgA4AYiBkI +UQALyM9xAACsLKy4CxoYMMoI4AUP2GfYSgxgBYohCADRwOB+4HjxwOHFCHU+iM9wgACAF0CAQCUA +FAO5NXlZYf4NoAsK2o4P7/+pcEkBz/7gePHAzgjP/kh1wYAAgChyug3v/slxAKUlAe/+IaXxwOHF +z3KAAPg5hBIAAIASAQDPdaAAyB8keC8pAQDPcAMAQA1FHRgQ8CJAAEB4gNgVHRiQ8QDP/uHFYICg +gQGAIYECI0ODYKIDIEAAAaLgf8HF4HjxwKXBQcBCwQwcADEQHEAxz3GAAPySNBnADzAZAA8sGcAO +KBmADiQZQA7PcIAA/JIgGEALz3CAAPySHBgAC89wgAD8khgYwArPcIAA/JIUGIAKz3CAAPySEBjA +CM9wgAD8kgwYgAjPcIAA/JIIGEAIz3GAAICSgBkACHwZwAd4GYAHdBlAB3AZAAdsGQAHaBmABmQZ +QAZgGQAGXBnABVgZgAVUGUAFUBkABUwZwARIGYAERBlABEAZAATvoc6hraGMoSwZwAIoGYACJBlA +AiAZAAIcGcABGBmAARQZQAEQGQABY6FqIAAD2BkAAGogwALUGQAAaiCAAtAZAABqIEAByBkAAGog +AAHEGQAAaiDAAMAZAABqIIAAvBkAAGogQAC4GQAAaiAAALQZAABqIIABzBkAAEDDAcACwVMnzTUM +FAYwUyXENVMmxTXXuqlzAglgBRAUBzAA2c9woAC0Dzygz3GgAMg7LoE2CmAFfdgKDkAD/gygAADY +CNgA2fYKoAWZuc91gABYMSCFYHkA2BEIkAMghWB5ANgTCJECz3DgAMQxANlWCqAFlrlpAsAL4Hjx +wM9xgACMLACBEwiBDwCAAABKC0AC0cDgfgCBHwiBDwBAAADPcaAAsB87gcIJYAWKIEwM7gpAAu/x +7/HxwHIOj/7PcoAAjCzPdYAAaF0O6QCiAIWT6GYOoAUN2CoPoAYI2AHYAKUL8ADewKIqDqAFDdjq +DqAGCNjApaEGj/7geM9xgACQMACBHNrPc4AAbAZAoEKDVSLACQGhoBIAAI24oBoAAM9wgAC8CKQa +AACcEgABZ4MEoVUiQA0DoUAiAAd2eAWIGQgRCM9wgAC4BgCQSHSAJEQTAKwe2wPwGNtioVUiQA14 +YAWhvQYgCyhw4HjxwLoNj/7PcIAASAZAgM92gAB4E6CGBCKDDw8AAOAEI4APAQAAADJoZHknfaCm +mHUEIo4PAAAAQM91gAB0E+CFA75kfh14x3/gpQQhAQEEIoIPAAAAgEV4BiNNAAK4BCODDwIAAADk +fgR7xn0GJcAQLygBAE4gQQTPcIAAXG/wIEIAz3CAANwg8CCAALUQAAZTIECAFRpYMAHaJvQvCZEB +z3OAALC6CZML6BUamDBIcc9zgABwPBeDAeAXoxTwDJMS6ATZFRpYMPTxhOHMIWKACvTPcIAAsLoO +kAboBtkVGlgw6PHPdaAAFAQqpc9zgABsB2CLANgNC1EAaYW444P3AdiI6M9woACIIDV4QKAS8F4I +4AoGGpgw0g3ABIroANmRuc9woADQGzGgsg+gDAHY8QSP/uB/ANjxwOHFz3CAAEgGoIBr2AQljR8P +AADgsg8gBYohBwEvKEED3g/v/04gQAQKJQCAyiHCD8oiwgfKIIIPAADeDsojgg8AAMkB5APi/8ok +YgB/2Aq4z3GgANAbE6F/2BChnQSP/uB48cDhxc9ygAD0BwKCz3WAAJwQgODKIGIAE3jCuAGlz3Bo +H/8AA6UDggfbANlipYboAdgGpRGlB/ALCFEAAtgGpTGlMqX/2ADZCdoIc0okgAJKDO/+SiXABADZ +E9r/20okAAU6DO/+SiVABxOlz3AgACAgB6UhBK/+ANjgeIPoANgE8P8IUYAB2EjZDyEBAM9wgADw +EOB/MbDxwH4Lj/4IduyICJDPcoAAmAe1bwhzhiPzD0IrEQLHdYAATMhghUhxBwteAyRq67iKIMMv +A/QeFpAQTY5RIgCAofJ7CN8ALQveAv/YB61KJABxANqoIEADSGEAIoMPgADMz/Z7BKtIYQHiT3oA +q1zwIQkSIQohwA/rcs9wAAAtJYojCwRKJEAApQLv/wolQATuuAeNMiFBBAAhgi+AAMzP9noJ8iSq +BNkAKUEEJXgHrTzwIKoPIEAEYvAvCBIkjCDDr8ohwg/KIsIHyiCCDwAALiXKI4IPAADkAsokYgBQ +AuL/yiUCBK4J7//JcAiWDQieAwKOCa0E8AGOCK0AhTMI3gIA2ketSiQAcc9xgADMz6gggAI4YvZ4 +BBgCBAAYAgQB4k96AY4IrQKOCa0r8EwhAKHKIcoPyiCKDwAALyXKI4oPAAABA0AH6v/KIsoHCJYA +IYEvgADMz+64B432eQryBBkCBATZAClBBCZ4B63e8QAZAgQA2Q8hQQQmeAetAY4IrV0Cj/7gePHA +/gmP/s9zgAAIB2GDeWHPc6AAUAxgg8dzAAAAICJ7zLsLCwUA7QsewFEjAMDKICIAH/Q5ClEAz3Wg +ANAPEBUDlikIVADPcoAAlBifcCOCqCDAAgKKJRUPlsG402jYfwHgAqrneSOiEB3YkAHY+QGP/uB4 +z3CAAHiv4H8PgOB4z3CAAIiv4H7gfuB4KHIJACAAANnhxeHGQCkNAiV9QC0DFKV7JQo0Agh1UyV+ +kAbyAR1SEGG6+/FBKo4AwbpCJk6QBB3QEP31CeovJIlw4HioIEABAR1SEOB4wcbgf8HF8cDhxc91 +gAA8qCCNjCHDjwnyB+jPcIAAWFZOCwAM/9gArc9wgADkpwDZNaDPcIAAkBggoM9xgAAwMQCBorhG +DOAIAKEA2G4K7/8IcUkBj/7xwOHFAN3PcIAAhAegoM9wgAAwMaCgz3CAANSsqXSdsDC8nrASCuAD +qXCpcCoJoAepcRUBj/7gePHAkgiv/gbYFRIONgESEDYVGhgwz3WgABQECqUJhQcSDzYn6APYEKUE +pc9wgADc0O4MoAwDGhgwktkDyJC5oBhAAJYNoAMA2AmFD+goFQQQJBUFEB7YCiHAD+tyjLjhB6// +iiOEBAca2DMBGhg0yqWFAK/+FRqYM/HAIgiP/qHBCHUodoogRA9SCyAFqXETDdQQqXDJcQYO7/8A +2oPoE92D8M9yoABQDAWCz3aAAEStEq4FghOuCZaMIIiAKm1G8hH2RQjQAYwgxIFp9FsJkQDPcoAA +mKG+CO/+QCIAAkhxH/CMIMiAS/KMIBCAV/QFgglpCwhQAQDdUvDyDeAFANkIdU7wkwlRAM9ygACY +oYYI7/5AIoACC4qBuAuq7fELiYC4C6np8XMJUQBqCO/+i3AgwM9xgACYoVMgAgCGIH8PSKkceAmp +7fFPCZEDz3CAANwgA4AYiEMIUADPcoAAzJ5IcDII7/4G2UAiAAImCO/+BtkMkoG4DLK/8R8JEQHP +coAAzJ5AIgAFCgjv/gTZDJKAuAyysfET3QLwHN2KIEQPOgogBSmWqXBdB2/+ocDgePHAz3CAAMye +DJANCB4ACgmAAwbwUSBAgGwKggPPcIAAmKELiBEIUAATCJEASg1ABNHA4H5eDkAE/PH88eB+4HgI +czhg1bvVuQ0J5QA2uAIjQgAK8M9ygABM0EWCAeDJuCJ6emIWuOB/RXjgePHAeg5v/phyCHXPdoAA +XKL0JkAQz3eAANyhUSBAgsogQQDKJCJ0yiAiAOggIgL0JgIQCQpeAgHgRwgVBC27wLvPcoAArMe0 +ekArhQJgkgS9hiX4E4m9DyNDAGCyANoWf0CnQafDuaV5BSFDARR+YLbPcYAAfKIVeQAZAAEC8IDY +YQZP/uB+4HjxwOHFz3GAAOymQYnPdYAAkBjPc4AAMDEggwfqAdgApYK5IKMI8ADaQKWiuYDgIKMk +CcIIANhSD6//CHH6CSACANgpBk/+4HjxwOHFmHADyKCQAYBA5fS4wCWiEAPlz3OgANQHDxMChgQl +jR8AAPz/EwolAYB1FcgVIgEwFhEABhpiGRMBhgIlgBAxCQUAiiEPCs9yoADIHz6iENkuogHZFRpY +gAPwIQsfQM9xoADUBxkRAYbzCQSAz3CgAJgDvqCpBU/+CiHAD+tyQ9iMuM9zAADEFcUEr/+4deB4 +8cDuDE/+qcHPcIAAzNAAEBUADcwA3c92oADIH1EgQIDPcIAAzNBBgAPID/KgFgEQ+BYDEGJ6AiGX +AHYQAgEvJ8glOmIE8IQQFwHicjoYxAUfhg8IhQBQeJINYAUC2QHZz3CgANQHNKAzoAPZLaAREACG +z3GgANQHQMBA4A8ZGIAUGViDA8ikEAEADwkeAuoNgAoDyAPwRx5Yk89xoADUBw0RAoZALwEkUHpF +ebgQmAByEAIBeYACIhIGuhACAQQQGQBBws9ygAAEukaCABARAYHiAdrAegy6QsLPcqAA1AeIGsAA +pBACALmgt7qkGIAAuBhCA7oYRAMRCZ41z3KgAEgIQCEAIwfwQCEAIc9yoABMCAHDAscDcOV7BSNT +ACdoz3MAAPz/JHvPcYAAzNAjgQgjQQDPd6AA1AcVpwAawAQCIYAkD6cCIcIAW6cD2lCnz3KAAPQ4 +FRIDNgCCPQjAAM9woAA4LgWABCCAD8AAAAAhCIAPwAAAAPXYBbjPd58AuP8ap3unadgYuBmnAdgD +8ADYCQhRAGCiB8gCJVUgz3GAAMiwBCCADwEAAPAsuAMSDzYEsQ+HrqkAoUAXABECsRCPYBcPEVRo +w7/leg+pz3CAAMzQAYBGsc93gAAsu0AnBBl1fxB5z3KAALC6aYdWIsUCeWEpp6QWARA4YPgWARAi +eEPAAdjPcaAA1AsQoUEpQDXAuBe4ACCBDwAOAADPcIAAzNACgAK4K+AEIIAPAAD8/yV47HEAoQES +ATbscCCgz3CAAMzQIoDscCCoFcgUIgEAMInscCCo7HCgsBXI8CUBAOxwIKAVyPAkAQDscCCw7HCg +sOxwoKDscKCgBxIBNuxwIKADyCCQVBAAARC5JXjscQChAxIDNgGDIQgeATKLcIvPcIAATMp2eACI +hiB/DBx4BLgleAPwgNjscQCpA8gA3zCIMxCAAAS5BXnscCCoA8iadzyQ7HAgsAMSAzbPcIAA/Fic +EwEBb4MmucC5wLsMuQ27ZXkgoBUSATYadwAhgA+AANi6oKjPcIAAXLo2eDR6oLICkMAaRAMVJEEA +oKF4GgQAz3CAANwgBIAakNAaRANEwM9wgADM0CKAgOGSAy4AyiXOE+l26XVMIACgtvIBgM9xoADI +H5YgQQ8eoRDYDqEB2BUZGIAS8M9xoAD8RB2BOYEEIYOPAAAACBH0BCC+jwAGAAAN9FELH0DPcKAA +9AcHgNcI3odKJgAALfAA2vq4yiKCDwAAAQLYcvm4yiaCDwAAAgL8uMomgg8AAAECCevPcoAAcDxl +goomCAIB42WiSgvADRHwAdjPcYAA+Fg6CmAMAKHPcYAA7DwCgYomCAIB4AKhBSWNkdwCAgDPcaAA +1AcPgRB4GREChljgKwoFAA+BEHgZEQKGWOANCgUAhBEAAO8I1YwPgRB4GREChljgaQoEAB4ZmIMd +EQCGBxoYMB0RAIZIwB0RAoYEyECgHREChkGgHREChkKgHREChkOgHREChkSgViYAEh4ZGIAdEQCG +QC8BJBB6BSJTAAQSATaGIPMPjCAMgAAREQEEERkADvIa2A3wz3GAAPQ7AYGKJhARAeAzAiAAAaEg +2FpwA3AQeHIZBAAJCBEgA8jB8BEJnjXPcKAASAhAIQEjB/BAIQEhz3CgAEwIA3FFwAHARsECwSV4 +BSMTIAbAB+DPcYAAzNAjgQQggA8AAPz/CCBWAFcNpCVHwGEIXkPPcIAAzNABgM9xoADIH5YgQQ8e +oRDYDqEB2BUZGIBGCeANQdg5CF5DAdnPcIAA+FggoN4IYAwB2M9xgADsPAKBAeACoYonCBI28M9x +gAD0OwCBiiYSEAHgAKG58M9xoAD8RB2BOYEEIYKPAAAACAf0BCC+jwAGAAAY8gDf+rjKJ4IfAAAB +Avm4yieCHwAAAgIJ6s9zgABwPEWDiicIEgHiRaNuCcANCPAD2c9woAAUBCWgAN8FJc2Th/QB2M9x +oADUBxQZGIBVJkAUDxkYgAMKH0IGwM9xoADUBxWhBcICIYAkABrABA+hB8ICJoAgG6ED2BChKMCc +4AjHk/QDyKlxyLkCJZUlCIgMuCV4AxIBNxC5JXjscQChQCRUIAEa2DMEyAMSATYA30DGAxoYMAQa +WDAhgACQAMY0ucC5NHgD4EDmBCCADwAA/P8eZhUSATYG8BUiQDAWEAAGAn4VIkAwFhAABu8OBZAD +zM9xnwC4/xihz3CgAPxEPYAEIb6PAAYAAFz0GQgQIATIUIhTIsEAhiL+A0S6xBiCADCoz3CgANQH +FBjYgwfIz3GgAEgsHaHPcIAAzNAigEAgUCAScYIEzf8A3gPwAN+pdlMmfpCB9J8IXkPPcIAAzNAB +gM9xoADIH5YgQQ8eoRDYDqEB2BUZGIByD6ANQdh3CF5DAdnPcIAA+FggoAoPIAwB2M9xgADsPAKB +AeACoYomCAJX8AohwA/rcjzYjLjPcwAAtBNKJEAAgQVv/7h3TCAAoIolEBAI9AfIz3KgAEgsiiUI +EB2i+rnPcYAA9DsG8gKBgL0B4AKhtPEDgYG9AeADoa7xz3GgAPxEHYE5gQQhg48AAAAIBvQEIL6P +AAYAABryANr6uMoigg8AAAEC2HL5uMomgg8AAAICCevPcoAAcDxlgoomCAIB42WiWg+ADQnwA9nP +cKAAFAQloEomAAAFJY0RGO0bDV4QA8gpiAHhKajPcYAA9DsDgQHgA6EJ8BMNHhDPcYAA9DsCgQHg +AqGpdgPIqXHIuQiIDLgleAMSATcQuSV47HHJdIQkApEAoUAkVCAW8s9xoADUB4AZQAUDzMlyyLoQ +uEV47HIAouyhAdgUGRiANg+gDUAkVCADEgI2khIAAQQSATYNCJ8CkhEDAW0LngKquJIaBACSEQAB +qrjGCCAIkhkEABDZz3CgANAPEBhYgCQQAobPcYAA3NQlkVB6ArlFeQwYWIAU2RAYWIDPcYAA3NRn +kUaRGNkQu2V6DBiYgBAYWIDPcYAA3NRpkUiRELtlegwYmIAG8M9wgADc1Oqoz3KgANQL8KK3DhAQ +BvAI2exwIKBAJFQgz3CAAMzQAoDvDASgz3CAAMiwJJCU4cAhhg8AAJMAz3CgAGgs8CBBAM9wgAD8 +WACAJXgNogPYz3GgANQHEqHiC0AKDw1eEjYOr/8AwAnwA9nPcKAA1AcTGFiAFBjYgykIECDPcKAA +LCAwgAPAMHAB2MogJgAEIIFPIAAAAIDgzCEhgPHzz3AAKAgABhoYMATA1gsgBQDZUSZAkLDyz3Cg +ACwg76Cq8M9wgABwxhKIOQgeADUIHkPPcYAA3CAjgc9wgABwxg+IELgyIYEPAACwAp+4gOEB2cB5 +D7kleM9xoAD8RA2hGw0QIM9woAD0B2AYQAXPcYAA9DsAgQHgAKHPcIAAyLAkkJThwCGGDwAAkwDP +cKAAaCzwIEAAz3GAAPxYIIEA2s92oADUByV4z3GgANQLDaFMpoogBAIuDqAEqXGiDiAMBMAZFgCW +wOCgAA4ADcydCF4AA90gHliTSiRAABQeGJEEEgE2ABYAQAcaGDAAFgVAARpYMQTKnODKIsIHyiCC +DwAA3A7KI4IPAADKCjgCYv/KIcIPKHDmD+AMDtkPFgCWBBIBNrQZBAATHliTEIlTIMIAhiD+A0S4 +xBkCAFCpz3ASIAAARgqgAxUSAjYEyM9xoAAsILAQAAEvgWTgMHDKIIUPEigIAIX3z3AAKAgABhoY +MADfDcwEIIAPAAACCBcIkQAEEgE2iiAEAPIOYAiYEQEAFRIBNs9wgADAujR44LADyDoLoAYakA0C +L/6pwOB48cDuCQ/+CHfPcYAAEA4AiQDeqcFAxpMIEQAB3aCpz3GAAAC+z3CgAMwrLaAA2I+4Cxoc +MBUagjNKDmAHi3C6CgAEz3ABAKgRQcCKINQAQsDPcIAAcGQAiGTFAt0RHAIwAMASHEIzExwCMM9w +gAAAPkXAz3CAAGw9RsDPcIAALFkAgEPGINkB2kfASMeBwD3bvgigChe7CNhuDeAEAdnPcIAAhCu5 +oLEBL/6pwPHAPgkP/gh1GnHPcIAA3CDwIEEDAN7Pd6AAtA8ioCOg3KdIgVMiAAD2DaAFNJFWCkAE +heieDcALA/DODcALkgnABoDlMA+hBcogYQDPcIAAhCsZgAsIngAiCsAJCvAA2Z65z3CgAPxEIaDg +eMGg3KdMIACg7AsiAMogYgDPdYAA+BEAjYXoOg0ACwHYAK0VAQ/+4HjPcIAA3CADgM9xpAAcQAiA +wLgTeMG4EqHgfuB44cUA2kokAHTPdYAA3KHPc4AAVKJIcKggAANAIwECFHlAsRYlARBAoUGhAeBK +JMBzANmoIEACz3CAAKzHNHhAsAHhz3CAAOgGQaDPcIAAzJ5MsOB/wcXgeAXwQnnHcEAAAADPcoAA +TNBFgvMKRIBTIEMFcHHAII0PQAAAAMAgjQDgfyJ4BvBieQIggA9AAAAAz3KAAEzQZYLvC0SAUyBC +BTpiCwuEADhgB/ACIIAPQAAAAGJ4OGDgfuHFz3CAAJQYIIgB22GoIOnPcqAAsB95on6CQoCjgADZ +MQ2BEM9ygACoGECKg+oB2grwQYACI40A9w2Fn0wAQEshqChyBwpRAGGgIqjgf8HFoqDv8YDgAdjC +IAwAz3KAAJQYAKoB2AGqANgCqgGiAqIDouB/JKLgePHAYg/P/Qh1KHdIdoogRw2WCqAEiiGVDREN +FBQO2OlxRg1v/wDahOgT3S3wz3KAAEStSHAqCG/+DNnPcYAAlBgAiQ/oz3CAAAC8AJCGIPwAjCAC +gAX0BZJkkmd4A6FCJQATVg1gBclxCiUAkAv0z3CAAAC8AJCGIPwAjCACgAwPwf9JB+/9qXDxwN4O +z/3PdYAA3CABhboQAAYTCF4Bz3CAAHAmFIgTCBACAIW6EAAGUSBAgZryz3GAAAC8mBGAAIwgAoCS +8gOBBg0v/ySBCHYjCFEABghABA3oz3CAAHAmFIgTCBEC9gqgCwHYugwABQ/wj+7mDwAECOjPcIAA +cCYUiIfgAtgD8gDY0gqAC6oPAAvPcYAATNAGgUUgQAEGoQOFGIhpCBABz3CAAEStV4jPcIAA0CMa +iM9xgAD8Og8KAAC+FQAWNQgfAM9ygAAIBwCCAeAAos9wgADYWADaQKDPcIAAdFhAoM9wgABMBkCg +EYEB4BGhBfAQgQHgEKEAhboQAAZRIECB7A4C/s9xgACQGACBC+gA2AChz3GAADAxAIGiuCIJYAgA +oc91gACYoQuNUSDAgNQKAv4LjVEggIDIC8IDMguAAyIPAASA4KQN4gTKIKIFz3CAAHDGEYiA4JAN +4gTKIOIE6QXP/fHAcg3v/f/az3CAAGCwERiYgBoYmIAA3s9xgABsBsOhz3CAAAAsQKAB2s9wgAAE +LECgzKHQodGhz6HAocGhAt3Jd89wgABUqoQvCBgAIEIOSoIncAAhkH+AAGCqRiLCAEqgXg9gC0Ag +ACFhvSAYgiPTDXWQAecC2ADZ7gxv/gTaSg6gBAHYUQXP/eB44H7geOB+4HjgfuB44H8B2OB+4Hjg +fuB44H8A2OB+4HjgfuB44H7geOB+4HgA2c9woADAHSegJqAtoOB+z3GAAHg7D4EB4A+hFcjHcIAA +zLosiAHhL3ksqM9wgABAlAKIEwhDAIogCAAGGhgwitiQuAfwiiAQAAYaGDBC2Ji44H4C2M9xoADA +HQ2hIdgGoQHYB6HgfvHAVgzP/ZgQAgAEIoEPAAAACDt5BCKDDwAAABAle89xgADcIKSBVSXOGFUl +TxqYEIEAFQpeAoYh/wNEuS9nib/pcRnwUSIAgsAVAhEM8sK5gCUCGj9l6I89ZTCNZX/wf0V5CfDD +uTx5P2Y+ZjCO6I9FeYgYwANleUUE7/2MGEAA8cDhxQPIpBABAJgQAgBRIQCAchABAUhwBvJ6COAC +ANoIdQfwAeFuCOACANqsaDIKwAvPcqAAyB/4EgEAA8jPc4AATMgQiAW4AGMRCF8DAdgToniCWYIG +8ALYE6J6gluCAiVAEHhgEHPAIm0ADXEAoQ1wQKAAFgBAABYAQAPIz3KgAPQHcBABAWi5J6JwEAEB +aLkwebkD7/1wGEQA8cA6C8/9z3agAMgfoBYEEPgWAxAA30kIEQEDEgE2pBEAAHYRAgERCB4Fz3CA +AMzQoYAE8IIRDQENzFEgAIGEEQABCfICJcEQAiRDAAgjAwAE8IYRAwEbY2hxcfCVCFEADRIBNwPI +eBACAUcJHgFRIUCAz3GAANwgJIFUEQEBCfJ+EA0BIn1ifQIkQwMr8IAQAwHPdYAALMcAI0QAcIh2 +fWCVACMNAYQQAwG7YxvwpBABABUJHgVwiM9xgAAsx3Z5YJEE8IIQAwHPcYAA3CAkgYAQDQFUEQEB +PWW7Y4QQDQG7Y4AQDQG5YX4QDQFCfSfwQwiRAAMSDTYNzHgVAhFRIACBz3CAANwgBIBUEAEBCfKA +FQARInhieAIkAwAH8IIVAxGEFQARO2MbY4AVDRFCfQXw6XPpcul16XENzBEIXgADyHYQAgFiujpi +DPAVC3IAYrrPcIAA3CAEgEYQAAEaYvgWABBdZQJ9H4YZDQQQoNgPpv+mX6YC2BUeGJCA2A6mIQLv +/XB44HjxwLIJz/3PcYAA3CDwIQIAVSLFCAiCVSJEClEgwICKIAgAyiAhAMAaBABKJAByANmoIEAP +z3WAALRl/IouZeR+LyiBA04ggwfPcIAAnGdvYAAlQwDgq0QSjwDkfi8ugRNOJo8X7mDIq8iCIQ7e +EB2KhuHTIKYALygBAE4gjQfPcIAAHGSoYBHwz3aAANxlLmbOZbyKxH1YEo4AxH0vLUETTiWOF8hg +EKsB4UokAHIA26ggwA/cis9xgAB4Z29hz3WAAJxn5H4vKIEDTiCPB+9lACXAAPyoRBKPAOR+Ly6B +E04mjxfuZSQYggPIgh8O3hA9ioDj0yGhAC8pQQBOIY0Hz3GAABxkqWEQ8ATryWsD8Gh2zmE8isR5 +WBKOAMR5LylBAE4hjgfJZSwYQgAB40okAHEA2KggAAXPcYAAGGR9iglhACQMAAHgZHkvKUEATiGD +B89xgAAcZGlhIKy9AM/94cXhxs9zpAC0RSkTAIbPcYAAgDrIGQAAKxMAhswZAADPcKUACAwDgOQZ +AAAOEwCGEHowuNQZAADQGYAADxMAhtgZAADPcIAAPLzUiLaI6BmAA3iI7BlAAw2Q8BnAACzgAiCC +A/QZgAACIEIDYnj4GYAA/BkAAMHG4H/Bxc9wgADcWAWAA4AggM9wgABMlOB/KaDgeOHF4caYcM9y +gABoGQWCIIJmgsi4ELjIuQUhAYABgsi7ELvIuAUjBQBnggKCyLsQu8i4BSMHAGiCA4LIu8i4ELsF +IwYAJPIAFA4ALyhBAE4ggwcA2A8gwAASfQQgQwGkfmV+AByAA9qCpH7Fe3qieYIEII4BBCDAAaR7 +xXt5oniCpHsEIUGDZXgYot/1wcbgf8HF4HjxwCIPj/06cAWBoIHIuBC4yL0FJQ2QAYEmgci4yLkQ +uQUhEAAB3hnyBCWAkxPyLygBAE4gggfwIYEgAN8PJ48QCOkEJwAUQiAAgGB5yiBiAOZ9237q7S0H +j/3geOB/ANihwfHAwg6P/aPBCHVIwM92gABoGRqG+4Y8hgR/JH+nf0HH7glgBIog2ASKINgE4glg +BKlxlu/RDREQtg6gBAfYxQgQAAohwA/rcs9wAACNE4ojxg9KJAAAGQbv/golAAEEFAExGOkgFAAx +CyBAgA3yz3CAADgxYIDPcQAAYEoM2GB7A9oI8Ijoz3CAADQxIIBgeQzYBhQBMRjpIhQAMQsgQIAN +8s9wgAA4MWCAz3EAAGBKDdhgewTaCPCI6M9wgAA0MSCAYHkN2AQnUJMK8g4OoAQH2IogGAg2CWAE +CnET8JHtiiDYBCoJYASKIccKyg2gBAfYiiAYBBYJYATpcWIIAAC8pgjcJwav/aPA8cC+DY/9CHYA +3Yog2AP2CGAEyXHPcIAAaBlagDuARHkA2g8iggMEIkMAQiMDgMojYgAvJsfwAd/KIEEDB/IcgCR4 +tg7v/0V46XDdBY/94HjxwKHBAdiuCO//QMDPcIAAaBkKgFEgAIDKIAIHyiEiAcoigg8AAGcAyiNi +D6AMIgrAK+IFocDRwOB+4HjxwC4Nj/0acCh1SHdodjhjZtk92uYMIAoXuhcIUQAKcMIMIAqpcelw +kgwgCslxZQWP/eB48cD6DI/9psEodRpyYMAA2AEcAjAB2AIcAjADHAIwi3D6D6AGgcEG7QTBCnBg +fQXCA8CO6AohwA/rcs9wAACME+7biiTDD2EE7/64c0B4EQWv/abA8cCiDI/9osEB3c92gABoGTqG +G4YkeDyGBCEQANIPIASKIJgDVSZPF1sIECAC8Lt9BCBAo/3zLygBAE4gkQfwJ0AUXB5AFIDgyiHB +D8oiwQfKIIEPAACPE8ojgQ8AABoCyiQBBOwD4f7KJUEEQHiKIJgDfg8gBCpxANgPIEAEBiAQIGIN +7/8KcIogmANiDyAEPIZxBK/9osDxwLTBiiCYA04PIAQA2XoMYACLcIogmAM+DyAEENm0wNHA4H7x +wLTBiiCYAyoPIAQC2XIMoACLcIogmAMaDyAECdm0wNHA4H7xwLTBiiCYAwYPIAQD2doPoACLcIog +mAP2DiAEC9mKIJgD7g4gBBHZtMDRwOB+4HjgfuB48cCWC6/9ANnPdoAAaBkXhs91gADolg8hAQAZ +hiR4QiAAgMogYgChwQHfFwhRAM9xAQCYnQvYZg7v/1Ulwhc3hgDYDyBAADiGJHhCIACAyiBiAADZ +IwhRAAvYYMABHEIwAhzCMwMcwjOLcATZVSXCF/YN7/9U2wDYhQOv/aHA4HjxwFYOwAPPcAEAcCQJ +6M9xgABoGbgZAAAbgZG4G6HPcAEA6CMI6M9xgABoGR6hG4GBuBuhz3AAAJRNCujPcYAAaBmUGQAA +G4GIuBuh0cDgfvHA4cWhwc9ygADYsM91gABoGReFANkPIQEAGIUkeEIgAIDKIGIAAdsA2SMIUQAI +2GDAARxCMAIcwjADHMIwi3AE2VYN7/+KIwgACNgA2X4N7/8ocgDY6QKv/aHA8cBiCq/9CNnPcq3e +774KCaACOnAqDyAAKnCRCNAAz3CAAEyUA5BOIM8BUQ/VEc9wgAAQD8oMIAH0IMADAN4A3QTYGnAq +cOlxyXIKJIAPrd7vvsYIoAKpcz4PIAAqcE0I0ABCIEAg3wh1gAHlAebTDhSRAee7D9SRKnDPcq3e +776WCKACENm6DiAAKnAdCNAAz3Gt3u++ggigAipwCg/v/ypwg+DKICIAGQKP/fHAugmv/QPapsEa +cNIOYAqDwQPBz3CAACwTFBQHMADe8CBFAM9wgAA4E/AgRgDPdYAAmAgO2MSlQMAE2EHAz3Ct3u++ +QsAEwgpwgNseCKACmHPOCSAACnB9CNAAA8PPcIAAXBNChfAgwQDApQwVEBDBpQjpz3eAAGgT8CfA +EIbowKXBpQDZGfCEKgwDHghgAC9wDiCBDwAAAAEgpQPAhCgMI/AnARAGCGAAL3AOIIEPAAAAASGl +BIUbCFEAAIUReIwgB43C98ClMXmMIQeNw/fBpQDYSQGv/abA4HjxwOIIr/0E2qbB+g1gCotxz3AA +ABvSAN2pcXILIAGpcgDBz3AAABzSYgsgAalyAMHPcIAAcA4BwhUgQQAAkQLBBbouDCABRXkDwIDg +2gAFAM92gACYCNLYCLgZ2S4LIAEA2s9wAAAi0kAmARI6CSABBNrPcAAAI9JAJgETKgkgAQDaz3AA +ACDShMEeCSABANqFx89wAAAh0ulxDgkgAQDaAoYX2boPIApAJgISA4YX2a4PIApAJgITBMAX2aIP +IAqEwgXAF9maDyAK6XIChgDZ/g4gAIu5AqYDhgDZ8g4gAIu5A6YEwADZCLjmDiAAi7kIdwXAANkI +uNYOIACLuSKGMXkZ4QUpfgAjhi9yUHcxeRnhBSl+AC9xzCBFgIX3A8AB5TcIRYMDwA8IRQMB2c9w +gACYCCSgANgRAK/9psDgePHAng9v/QnaqcEacLYMYAqLcULYGgsgAQjZ+g+v/SHACHFC2AoLIAEF +uQwUBDAAwQpwBsIKJYAPrd7vvhIOYAICw+INIAAKcGkI0AAAwQXCz3CAAPwOAN/wIEAABMEKugQi +gg8PAAD8yblFed4JIAHpciDez3WgAMgf0KUF2EMdGBAA2HYIIA2NuNGlIBQEMADBCnAGwgolgA+t +3u++sg1gAgfDHg7v/wpwg+DKIMIDUQdv/anA4HjxwMoOb/0C2qXBmnD+C2AKg8HPcAAAEdIH2XoJ +IAEA2s9wAAAS0gDZagkgAQDaz3AAABPSANleCSABANrPcAAAFNIA2U4JIAEA2s9wAAABRAfZQgkg +AQDaz3CgALQPcBAXAAHZz3CgALQPPKAg3c92oADIH7CmBdhDHhgQANjGD+AMjbixprzY7gkgAQDZ +w9jmCSABANmKIEQI3gkgAQDZiiAECtIJIAEA2bXYygkgAeHZiiCEBsIJIAHh2QPYQMAE30HHz3Wt +3u++QsWKcATBA8Ie25hzSiUAAEomAAC6DGACSicAAGYO7/+KcIPgvPLPdoAAmAgIFhYQDBYTEA7Y +QMBBx0LFinAEwQPCHtuYc0olAABKJgAAfgxgAkonAAAqDu//inCD4J7yCBYQEAwWFRAO2EDAQcdC +xYpwBMEDwuHbiiRDCEolAABKJgAASgxgAkonAAD2De//inCD4ITyCBYREAwWEhAD2EDAQcdCxYpw +BMEDwuHbiiRDCEolAABKJgAAEgxgAkonAAC+De//inDVCNAAIoajhs9yoAC0D+pwHKIEw89ygABc +EwIhAKTPdoAARBN1egCiAiJAJc9ygABoE3V6AKLD2nV+QKbPdoAAUBN1fkCmD/QKIcAP63LPcAAA +rROKI8oFSiQAAKUEr/4KJQABgODKIcEPyiCBDwAArhPKI4EPAACeAsoiwQft8wIggCUZYQIhQYQP +8gIgQiQMerILIAAvcATCAiABIM9wgAAsE1V4IKACJcAkuWACIYGED/ICJYIkDHqKCyAAL3AEwgIl +ASDPcIAAOBNVeCCgANitBG/9pcDgePHA0gzgAADYz3AAAA3SANkWD+AAANrPcAAADNIA2QoP4AAA +2s9wAAAV0s9x8w///PYO4AAA2s9wAAAb0gDZ6g7gAADaz3AAAALSoNmaudoO4AAA2gnYjLgA2c4O +4AAA2hTYjLj/2cIO4AAA2gDYjLj/2bYO4AAA2hHYjLj/2aoO4AAA2gLYjrgA2Z4O4AAA2gHYjrjP +cQAA//+ODuAAANrPcAAAC9IA2X4O4AAA2s9wAAAN0gHZcg7gAADaz3AAABLSANliDuAAANrPcAAA +E9IA2VYO4AAA2s9wAAAU0gDZRg7gAADaANjRwOB+8cDhxa3Bi3GqCGAKAdoA3QTYDg/gACzZDtgG +D+AAqXG12P4O4ADh2YoghAbyDuAA4dkAwIDgzCCigMwg4oDKIUIDA/QC2YPgzCCigMwgYoAD9IK5 +L3nKDuAAD9gA2K0Db/2twPHA4cWhwYtxRghgCgHaz3WAAGSWABQEMM9wgAAUDqlxEtp6DeAAANsA +FAQwz3CAABIOViVBEgHaYg3gAALbz3CAADgOVSXBFBzaZg3gAADDANhVA2/9ocDxwL4Kb/0D2qPB +unDqDyAKi3EBwc9wgAAIDwDf9CBNAALBz3CAACAPgOX0IFQAz3CAAJgI4KDhoMwlopDKJsITAvQA +3oHlzCXikMomYRAODs//qnDPcq3e774qCWACqXHmDu//qnDrCNAAAMCA4MwgooFP9IDlzCVikEv0 +AsCTCBEAz3CAACwT1XhacOCgz3CAADgT1Xh6cOCgz3CAAFwT1XgacOCgz3CAAGgT1Xg6cOCgz3CA +AEQT1XjgoM9wgABQE9V44KCqcKlxz3Ot3u++sghgAslyGgvv/6pwcwjQAADBABIAIIbhAdnAeQO5 +1XnHcYAA2LAAoQATACAEoQAQACAbeAihABEAIBt4DKGqcMlxqXIKJIAPrd7vvmYIYAKKc/oPr/+q +cCcI0AAAwM9xgACYCECBBL0GuLhgFSAABcdwgAAUsSGBQrAjsADYwQFv/aPA8cCGCW/9BNqkwZoO +IAqLcQDAAcEEuDV4z3aAAHwOEGbuDOAAAsEAwAHBBLjPdYAAvA41eBBl2gzgAAPBAMABwQS4NXgA +ZgbgEHjGDOAAANkAwAHBBLg1eABlBuAQeLIM4AAA2QDYjQFv/aTA8cChwfYLYAKLcgDAocDRwOB+ +4HjxwOoIT/2uwbpwmnF6clpzCiEAIQogQCGCxa4NIA2pcITGpg0gDclwng0gDYbAmg0gDYjAkg0g +DYrAjMeKDSAN6XCqcBfZOgggCotyinAX2S4IIAqBwgDAfgjv/alxAcB2CO/9yXGpcKlxlg0v/qly +yXDJcYoNL/7JcqlwyXEaDm/9hsJqcBfZ9g/gCYtySnAX2e4P4AmBwgDAPgjv/alxAcA2CO/9yXGp +cKlxUg0v/qlyyXDJcUoNL/7JcqlwyXHWDW/9iMIqcA4I7/2KwYjAisEuDS/+6XLpcAvZXg9v/uly +hsDuCK/96XGA4AHYGPYKcOYPr/2KwYjAisECDS/+6XLpcAvZNg9v/ulyhsDGCK/96XGA4ALYyiAq +AB0Ab/2uwOB48cDiDy/9AtqiwQh28gwgCotxAMAA3alxBNpIc0okQAE6CK/9SiXAAQhxQgvgAEvY +yXDPcq3e775SDiACAcHKCyAAyXCD4MogQgMFAG/9osDxwJIPL/0I2c9yrd7vvi4OIAIIdnYIIADJ +cGsI0AAA2c91gACACCClz3Kt3u++Dg4gAslwOgkgAMlwSwjQACCFQCFBgCCl8vMolclwFgkgAEqV +z3Gt3u++4g0gAslwhgggAMlwHwjQAMlwz3Kt3u++yg0gAhDZFgggAMlwg+DKICIAfQcP/eB48cDh +xaHBi3EeDCAKAdrPdYAA5JcAFAQwz3CAAPAPqXEX2lIJ4AAA2wAUBDDPcIAA6A9VJcEVA9o6CeAA +AtvPcIAAIBBWJUETC9o+CeAAAMMA2C0HL/2hwPHArg4v/QDZz3KAAOSXz3WAAGgZF4VIdw8hAQAZ +hSR4QiAAgMogYgChwQHeFQhRAM9xAQCYnRDYegmv/4AiAgA3hQDYDyBAADiFJHhCIACAyiBiAADZ +JQhRABDYYMABHEIwAhyCMwMcgjOLcATZVicCFA4Jr/8ocwDYnQYv/aHAz3CAAGCYIrDgf0Ow8cAG +Di/9AdqhwbpwNgsgCotxAMHPcIAABAnPdoAAgAjwIEAAIKbPca3e774BpqIMIAKqcPIIIACqcOUI +0ADPca3e776KDCACqnCiCSAAqnDNCNAAqnAP2c9zrd7vvnIMIAIC2uIN7/+qcADfSiTAJ60I0AAI +FhAQDBYRENp3A/Cpd+l1O/CadTnwACTNI719sH2qcKlxz3Ot3u++MgwgAgrapg3v/6pwdQjQAAgW +EhDPcIAAYDEggAwWExBgeQHYgeAKcCpxSnJqc8okgQ8AAM0ayiWBDwAA4xfKJIIPAABNGcolgg8A +AIwWOgzP/5sIUICRCJCASiZAIAIkwCMLCJQAiw4QoIHgyiUOFc9wgACoD/QgQAOkpgWmANg1BS/9 +ocDgePHAAg0v/QzaqcHPdkAf/wDPdTwAPDzPcYAAwGAGDy/9i3DPcIAA8A/PcYAANA8X2v4PoAAA +289wAAAL0gwcBDDPcAAAAtIOHAQwz3AAABvSEBwEMM9wAAAc0kXFEhwEMM91gACACCCFANgPIEAA +R8ABhUbGhcEE2kjAg8CyD6AAANvPcIAA6A/PcYAAKA8D2p4PoAAC2wDYANkOD6AAAtoB2ADZAg+g +AALaAIUVJAEwIIEC2PIOoAAC2gDYsQQv/anA4HjxwOHFocHPcIAAgAgggFDYDyBNAM9wgAAgEM9x +gACQD3oPoAAL2gXYABwEMAIcRDOLcEAkgTBmD6AAAdqz2IoPoAAA2YogBAZ+D6AAANmKIMUPdg+g +AADZANhZBC/9ocDxwOHFocGLcfIIIAoB2gDBz3AAAAPSPXlqDqAAANrS2Ai4E9leDqAAANrPdYAA +iAjPcAAAINKpcWYMoAAE2s9wAAAh0iRtWgygAATaANgFBC/9ocDxwHILD/2acUh3z3CAAPQHZBAS +AM9wgAD0B1wQEAAM2QDdKHB6cM9wgADUCPAgUQNKcKIML/0qcQJwE3iWDC/9iiEPCgh2z3CAAPQH +GoCGDC/9KnHPcYAA9Ac4gThgE3hyDC/9iiEPCs9xgAD0BzuBju9UaVR6QCyDIXR7emK1esdygADY +mNSqFaoQ8B0PURBUaVR6QCyDIXR7emK1esdygADYmNaqF6o5CZEAje9ALIEhNHmAIQIEtXnHcYAA +2JjUqRWpDvAdD1EQQCyBITR5gCECBLV5x3GAANiY1qkXqUIjQCBBCHWAAeXdAi/9ANjxwG4KD/2l +wbpwANjPdoAA9Ad0FhcQRMAA2AOmz3CAAGAxIIBAJ9ggCiCALwAACNIB3WB5qXA7cALYhB4AEAsJ +kTCEHkATA4aEFgEQMHDQAgYAgODKIIEvAAAI0oHgyiCBLwAACdIA3UwhgLDKJaERP/AQhgimEYYJ +pgOGhugG2MoLoABWJsESA4YRCFEACNi6C6AAVibBEhaGw7gLCHQDFqYL2Bamz3GAANQI8CEAACmG +SIYMeWQeQB4MegSGaB5AHoToBYYK6AaGhOgHhgbogOLMISGAB/QA2BemGKYZphqmqnCpcS4O7/9D +hgHlh+UcAgYAz3eAADxZtX8AhwHajuDCIo4AQqaA4iPZyiHCBTpxgOIm2cohAgYSDKAAWnHPcIAA +OBDPcYAAkBAD2poMoAAC2wOGgeDKIKEAyiFhBPwLoQDKIqEAz3Gt3u++9g/gAapwJg1v/qpwg+Dh +8s9wgABAEM9xgACcEBXaWgygAADbhg1v/gOGz3CAAGwQz3GAAPAQcgygABLaz3Gt3u++sg/gAapw +Lg9gAKpwg+DB8gCHPoYApkApAAJAKQIEBXrPcAAAC9JFeYYLoAAA2oonvx1Ax0HHCthCwM9wrd7v +vkPAqnAjhipyCnNKJIACSiWAAkomgAJeD+ABTiYHAF4LIACqcIPglfIQhj6GBKYRhldpBaZAKcAD +BXo9ec9wAAAL0kV5KgugAADaQMdBxwrYQsDPcK3e775DwKpwI4ZKcgpzSiSAAkolgAJKJoACBg/g +AU4mBwAGCyAAqnDTCNAAMIZRhoTHBYYmpkemE3hUeESGF6YTeFN6NHpYpoohDwoKCyAC6XIYhhAU +FDCKIQ8KE3j6CiAC6XIXhhAUEzCKIQ8KE3jmCiAC6XIEwIohDwpCIJYCGIYTeNIKIALpcgTAPoZC +IJICQCkAAkApAgQFes9wAAAL0kV5dgqgAADaAByANQQcgDQK2ELAz3Ct3u++Q8CqcCOGKnIKc0Ak +hCJAI4UiCiYAAU4O4AEKJ4AETgogAKpwg+BuBcL/C/ADhoQWARAB4DBwPgXl/wOmANiRB+/8pcDx +wHIP7/wI2c9yrd7vvhIO4AEIdzoJIADpcHkI0AAA3qYPYADJcM91gAD0B9ulINgepd+lyXAEuEUg +wAAcpR2lz3Gt3u++2g3gAelwkgzv/+lwQQjQABuFAeDfCPSAG6XPca3e7766DeAB6XA6CSAA6XAh +CNAA6XDPcq3e776iDeABENnKCCAA6XCD4MogIgBJB8/88cDaDu/8BNqkwRpw8gvgCYtxAsADwwDd +qXEI2kokQAI6Dy/9SiVABAhxAcBaCaAAqXIKcM9yrd7vvlIN4AEAwRoKIAAKcG0I0ADPdoAA9AfP +cAAAINJWJkESSg9gAATaz3AAACHSVSbBFDoPYAAE2jKG84ZBKcAFwLgYuBN4JXhBL8EVwLkYuTN5 +JX8Sps9xAABoH/Omlg/v/Ai4FKbPcQAAaB+GD+/8QC8AEhWmqXCNBu/8pMDgePHA4cWhwYtxPgvg +CQHaz3WAAGiYABQEMM9wgABAEKlxFdpyCKAAANsAFAQwz3CAADgQVSVBFQPaWgigAALbz3CAAGwQ +ViUBExLaXgigAADDANhNBu/8ocDxwM4N7/wA2c91gABoGReFz3aAAGiYDyEBABmFJHhCIACAyiBi +AKHBAd8XCFEAz3EBAJidCdieCG//VSZCGDeFANgPIEAAOIUkeEIgAIDKIGIAANklCFEACdhgwAEc +QjACHMIzAxzCM4twBNlVJkIYLghv/4ojFQAA2L0F7/yhwPHAUg3v/AraqsEIdmIK4AmLcQbYxgig +AAHBCNi+CKAAAcEQFAQwyXAAwQLCCiWAD63e777GC+ABA8M6Du//yXCDCNAAz3WAAPQHFIUYFAQw +CqUVhQDBCiWAD63e774Cwg2lyXCWC+ABBcMKDu//yXBTCNAAFIUgFAQwC6UVhQDBCiWAD63e774C +wg6lyXBuC+ABB8PeDe//yXArCNAAdIVUFQYQyXA0FQQQOBUFEGylJBQHMCqFPB2AEXYLL/1LhQDY +/QTv/KrA8cChwYtxogngCQHa0tgIuAHZHg9gAADaANihwNHA4H7xwGYMz/ypwUDAQcEA2EjAgsUa +CeAMqXCExhIJ4AzJcIbHCgngDOlwAMCLcrYLoAkX2QHAgcKuC6AJF9kAwP4Lb/2pcQHA9gtv/clx +qXCpcRIJ7/2pcslwyXEKCe/9yXKpcMlxlgkv/elyBsAHwYjDkg+gCQHaCMBVBO/8qcDgePHA3gvv +/AjZOnAC3892gACgB+emCtgJps9yrd7vvnYK4AEqcL4MIAAqcOkI0AAA3QoMYACpcM9wgABgMSCA +oKZgeQHYGnALCJEABtgApgCGkQjVAc9xgAC8XfAhAAAB2Y7gAqbCIU4AEg5gACOmoabxpgsIkSAB +2BGmANgE8AGGAeABpjGGUwhFAM9xrd7vvgIK4AEqcI4NIAAqcHUI0ADPca3e777uCeABKnDmDSAA +KnBhCNAAqqb/2AumKnDPcq3e777OCeABIIZKDiAAKnCvCNGAHvAAhgHgfQj0gQCmz3Gt3u++rgng +ASpwZg8v/ypwIQjQACpwz3Kt3u++lgngARDZ3gsgACpwg+DKICIALQPP/PHAzgrP/Bpwz3CAAGAx +IIAB3WB5qXDPdoAAoAciho7hAdnCIU4AhOkHCFEAAN0BhoDgBtjKICICJg5gAEAlARQKcM9yrd7v +vjYJ4AFAJQEU1gsgAApwg+AEAgEAz3AAAAfSz3EDAPDAEg1gAADaz3AAAAbSANkGDWAAANohhgpw +BNoKJIAPrd7vvvYI4AH/2/YPIAAKcIPg4vLPcAAAINJVJsEU8gpgAATaz3AAACHSViaBEuIKYAAE +2hOGsg3v/zSGCHfPcAAAB9LPcQQADjmqDGAAANrPcAAABtIA2Z4MYAAA2iGGCnAE2gokgA+t3u++ +jgjgAf/bjg8gAApwg+Cu8s9wAAAg0lUmwRSKCmAABNrPcAAAIdJWJoESegpgAATaE4ZKDe//NIYC +INADjCAErgHfyielECEIEyACho7gAdjCIA4ACOgBhoDgAd/KJaERBPIA3al3ZwhSIGMIgy8AAHyS +z3AAAFDDtgrv/ApxgODKIGwAyPaMIAKIyiCGDwAAnwDPcYAAXFnwIQAAFXiOCu/8iiEPCh1lQ9gj +DfQSBaYBhovoAoaO4AHYwiAOAIHgCN3KJ6EQA/II3QHfdQ4DdAAAJPTPcQAAUMNSCu/8CnCA4Mog +bADH9owgAojKIIYPAACfAM9xgABcWfAhAAAVeC4K7/yKIQ8KIYaa6SKGjuEB2cIhTgApCVEADQjU +AE4gjQMA3w7wTiDNAgDfz3AAAAvSz3EgACAgUgtgAOlyAYYEv/1liegG2CYMYACpcQLYCtkH8AjY +FgxgAKlxAtgR2SoLYAAC2qSmANjVAM/88cBqCM/8ocE6cALeiiABKc91gACgBxDYEPDshQDYQMAK +cfhnFXhmC+ABi3I6DCAHi3AAwAHmGndAJg8UVw41EyGFUwjUA4DhBtjKICICsgtgAOlx5KUqcM9y +rd7vvsIOoAHpcWIJIAAqcEMI0AAqhUuFKnAB2wolgA+t3u++og6gAYokww8uCCAAKnCPCNGADfBA +Jo8TgOEG2MogIgJiC2AAQCaBE+SlANghAO/8ocDxwLoPr/wE2qTBGnDWDKAJi3EAwc92gACgB2GG +z3CAAKxdBBQRMADd8CDCAM9wgAC0XfAgzwDPcAAABtJYeS4KYACpcs9wAAAH0gApwSMeCmAAqXIK +cM9yrd7vvhIOoAEkhrYIIAAKcE8I0AAhhgLCCnAKJIAPrd7vvvYNoAEDw/YMIAAKcDMI0ADPcAAA +INJVJsEU8g8gAATaz3AAACHSViaBEuIPIAAE2hOGsgrv/zSGDKapcGUHr/ykwPHA4cWhwYtxHgyg +CQHaz3WAAOiWABQEMM9wgACsEalxE9pSCWAAANsAFAQwz3CAAKQRVSXBFAPaOglgAALbz3CAANQR +ViXBEhLaPglgAADDANgtB6/8ocDxwKIOr/wB2gh2z3CAALxgAICiwUDAgcG2C6AJyXABws9xgACg +B4tzyXDFukHCCgmgBSCBIMA2DmAJB9kacAEUgDAqDmAJB9kIdgpwANkI2slzSiRAAtYO7/xKJUAE +WnACFIAwBg5gCQfZCHUDFIAw+g1gCQfZCHepcADZCNrpc0okQAKmDu/8SiVABDpwz3AAAAjSSnHC +CGAAANpB2Am4CnG2CGAAAdrPcAAAAYLJcaYIYAAB2s9wAAAJ0ipxmghgAADaz3AAAAKCqXGKCGAA +AdrPcAAAA4LpcX4IYAAB2gDYHQav/KLA8cDKDa/8ANjPdmgf/wAIcV4IYAAC2gHYANlWCGAAAtoC +2ArZSghgAALaz3KAAKAHY4LPcIAA2F3PcYAANBHwIMAAAqHPcIAA4F3wIMAAz3UgADAwpaLEoQOh +qqHPcIAAFBEQ2pIIYAAA280Fr/wA2PHAVg2v/Avaz3CAAHQRz3GAAIwRoghgAKHBz3WAAKAHQYUF +2EjZvghgAA8hgQADhc92gACMXYt3FSYAEACQzg4gAOlxA4UAwRUmABAAkJYIYADGuQOFz3aAAJxd +FSYAEACQqg4gAOlxA4UAwRUmABAAkHIIYADGuQDYRQWv/KHA8cDSDI/8ocEacItxAd7qCaAJyXLP +dYAAoAcAhQK4FHgAII8PgABklwDAyKXPca3e774ApU4LoAEKcM4J7/8KcKUI0ADPcIAAYDEggGB5 +yXAChQHajuDCIo4Az3Gt3u++CnA9ClEAHguAAVIJIAAKcHUI0AAA2ATwCIUB4CeFWwhlAAilz3Gt +3u+++gqgAQpwXgggAApw5QjRgCbw5gqAARoJIAAKcEEI0ADPca3e777SCqABCnCyC+//CnApCNAA +z3Gt3u++vgqgAQpwIgggAApwFQjQACGFCoU1fwC3C4UBtwDYUQSv/KHA4HjxwOoLr/wB2wh3z3WA +AKAHSoUphQolgA+t3u++AN5ZYUuFdgqgAZh2Agzv/+lwmwjQAAyFKoUC20mFDaXpcAolgA+t3u++ +WWFLhU4KoAGYdtoL7//pcHMI0AAMhSqFAdtJhQ6l6XAKJYAPrd7vvkJ5S4UmCqABmHayC+//6XBL +CNAADIUqhQLbSYUPpelwCiWAD63e775CeUuF/gmgAZh2igvv/+lwIwjQADAVBRA8FQQQCoUphUAd +QBFNhfYNYAVuhQqlyXCNA4/84HjxwCILr/yKJMMPCHbPdYAAoAdrhUmFCiWAD63e774qhXpiqgmg +AQPbNgvv/8lwoQjQAAyFS4UKJYAPrd7vvmmFKoUNpclwemIE24IJoAGKJMMPDgvv/8lwdQjQAAyF +S4UKJYAPrd7vvmmFKoUOpclwYnoD21YJoAGKJMMP4grv/8lwTQjQAAyFS4UKJYAPrd7vvmmFKoUP +pclwYnoE2y4JoAGKJMMPugrv/8lwIQjQADAVBRA8FQQQC4UphUAdQBFNhSYNYAVuhQulANjBAo/8 +8cCjwYtxag9gCQPaAMHPcAAAG9KP6QHZ3gwgAADaz3AAABzSAdnSDCAAANoC2ArZDvAC2cIMIAAA +2s9wAAAc0gDZtgwgAADaAtgR2aoMIAAC2gLBz3AAAAXSngwgAADaAcHS2Ai4O3kB4Y4MIAAA2gDY +o8DRwOB+8cDWCa/8Bdihwc91gAD0B0OFSNlODSAADyGBAAKFz3aAAJRdi3cVJgAQAJBeCyAA6XEC +hQDBFSYAEACQJg0gAMa5AoXPdoAApF0VJgAQAJA6CyAA6XEChQDBFSYAEACQAg0gAMa5ANjVAa/8 +ocDgeKHB4cXhxrhwz3CAAOi5EBAGAM9wgADcMgWAmHGhwYYk9w/nCBAAz3CAAOhbAIAfCIEBz3CA +APBbAIATCEEBz3CAAOxbAIDDCAABABxAMSDCARSBMPDeUyLAAMR6UyHHACR+VHpALo0BtH26YhV6 +z3GAANiySGHUfghzhiP9D3t7OmJBimV4SHOGI/0Pe3vdZRUlzRG+YcKOZXrJc4Yj/Q97e7lhI4ll +fihzhiP9D3t7ZXknDBAAz3WqAOAHc4URCx4ASKUJpSqly6UQ8AilSaXKpSulCvAJukV4z3KnABRI +A6IJuSV+xKLPcYAA6FsAGYABz3CAAPBbABhAAc9wgADsWwAYAAGhwMHGwcXgf6HA8cBaCI/8z3EA +ggEAz3CgAKwvPKDPcIAAbDkAgIToggjAAhfwEgpAADoOYARv2JHoIN7PdaAAyB/QpQrYQx0YEADY +bgkgDI240aXuCUAAeQCP/OB4z3KAAGw5IIIGeeB/IKLgeM9ygABsOSCCJXjgfwCi4HgEKIAPAAAv +ukIpwnRQekQq/gICIEAOEHgD6AHiUHoLCDMBQLGD6ADYAvCA2OB+4HhBBs/98cCmD0/8OnDPdoAA +zB8AhgHgAKYjCFEAAdjPdaAAyB9RHRiQIN/wpUMdGBAA2NoIIAyNuPGltgsgBAfYGnDPdaAA7Cfr +hWIJoAUqcAulAIZCIECAAKYH9M9xoADIHADYEaG2CiAECnCdB2/86XDgePHAMg9P/DpwKHUacm4L +IAQH2FpwDwieIFoMYAbI2FAgkCBMIICgGfII9iMIECBFCFEgFdgTuA3wJQgQJDUIESgiCmADKnAA +pQ/wKdgSuPAgQAQApQnwK9gSuPvxz3CgAOwnGYAApUIKIARKcCEHT/wKIcAP63LPcAAAihN62wok +QARlBq/9CiUABOB48cCqDk/8CHc6cRpzHwp0AADeSHX0J4ATFSGBI1oP7/8KcmG98Q11kAHm4QZP +/OB48cB+Dk/8ocEIdxpxIwp0AADeSHX0J4ATHgggAItxAMAUIIwjYb0AtO0NdZAB5rUGb/yhwPHA +Qg5P/KHBWnDPdYAAzB8AhQHgGnEApSMIUQAB2M92oADIH1EeGJAg3/CmQx4YEADYdg/gC4248aZS +CiAEB9g6cM9woADALzOAIQmeBvwQBQAKIcAP63KKIIwJiiOHBZUFr/2KJMILMIAhCR8A/BAFAAoh +wA/rcoogzAmKI8cFdQWv/YokwguLcc4Nb/1KcAAUATEAGEAgAIVCIECAAKUG9M9xoADIHADYEaEK +CSAEKnDtBW/8ocDxwA0M3gDiDs//BPC6CAAA0cDgfvHADQveAP4Oz/8E8NYIAADRwOB+CHGO4AHY +wiANAAHa4QEgBEhz4HjxwE4NT/w6cCh1GnKKCSAEB9hMIICgWnAb8gz2JwgQIE0IUSAV2BO4FSBA +BKCgG/ArCBAkOQgRKCpwwghgA6lxEfAp2BK4FSBABKCgC/Ar2BK4FSBABKCgBfDPcKAA7Ce5oGII +IARKcEEFT/wKIcAP63LPcAAAiRNJ2wokQASFBK/9CiUABOB48cDKDE/8CHc6cRpzHwp0AADeSHX0 +J4AT8CGBI14P7/8KcmG98Q11kAHmAQVP/OB48cCeDE/8CHcacR8KdAAA3kh19CeAExoIIAD0IIEj +Yb3zDXWQAebdBE/84HjxwG4MT/w6cM91gADMHwCFAeAacQClJQhRAAHYz3agAMgfUR4YkCDf8KZD +HhgQANieDeALjbjxpnoIIAQH2M9zoADALzODIQmeBvwTBQAKIcAP63KKIIwJiiOHBcEDr/2KJIIE +MIMhCR8A/BMFAAohwA/rcoogzAmKI8cFoQOv/YokggQvIggEQCmBIYG5ELpFec9yoADsJyaiIIVC +IUGAIKUH9M9yoADIHADZMaIyD8ADHQRP/OB4z3GAANwgI4HPcoAAfAcyIYMPAAD6AgGiMiGBDwAA ++AJhskhwILII2XPaHtvxAuAIGLvgePHAz3CAANwgA4AJgFEgQIHKIGIAmA5i/sohIgDPcYAAuAaK +IIwMqg7gAiCRbg3v/QHY0cDgfuB48cBSC2/8iiIEDs92gADsps91gADUJEAmABTo3KIPIAkCJQET +AYbPd4AA3CAihr4fGBC/H1gQIZYEIIAPAAYAABYdQpAgjoDgAdjAeBQdQpASHQKQANnPcIAA0R+C +DW/+IKheDIACCeheDIAChej2DO/9ANgo8M9xoACwHzuBGg7gAoogTAyKIJMBDg7gAp/ZAtjCCWAB +AdmqCeALAtgjh0iBNJFTIgAAdg4gCAHbiiCMDuYN4AKp2QDZnrnPcIAAjCwgoPUCT/zxwOHFCwgy +DAh1HQ2SHgohwA/rcs9wAACaISLbmHUVAq/9uHNCJQAc2QJv/A944HjxwFoKb/yYcEGBsIl1Ch4B +conPd4AATMjVbcZnVMoIEYUASSDAABMOnhXPdoAATMq2fsGOAvAA3sdwgABMyrZ4BIgIIwMACCOD +AwAjQAFJIMMDFm11eM9zgADMywNjz3CAAEzLtnjPdYAA3CCkhbiFAYCleAQggA8AAAAIBnsD8GOB +6LuYGcAAANgL8qQRAAAA3Ze9kbiUuKQZAACpcDsMHgDPdYAA3CDEhcC6yIYEJo4fAEAAAD6+HubY +ekV7mBnAAB0LngekEQIAhSABBIy6kbqkGYAAnBkAAB7wJwveB6QRAgCFIAEElriYuI26kbqcGQAA +pBmAACSFEIGeuBChCvCUuJa4nBkAACSFEIGeuJ+4EKGtAU/88cA+CW/8A9jPdYAAWDEghUB5qwgQ +ACCFYHkE2J8IEAAghWB5ANgTCNABUQgQAhsI0AIA2Cvwz3aAAGAxIIZgeQHYGugT8M92gABgMSCG +YHkB2CUIUAAghmB5AdgZCNAAIIZgeQHYEQiQACCGYHkB2MMIUYAB2Avwz3CAAGAxIIBgeQHYheAB +2MB4MwhQACCF63ZgeQDYGnDPcIAAYDEggGB5Adi4cDfYCiHAD8lyiiNNBTkAr/0KJAAE6QBP/OB4 +z3CAACCtKIDPcoAAbAYveBcIUQAA289woAC0D3ygAtgDomSiA/AB2AWinQPgAoogzAjgeM9wgAAg +rSiAz3KAAGwGL3gLCFEAAtgEogPwAdgFonUD4AKKIMwI4HjPcIAAQKgogM9ygABsBi94CwhRAATY +BKID8AHYBaJNA+ACiiDMCOB48cDPcAAACBzOCyADocEfCN4Hz3CgACwgEIAE2XzaPdtAwItwOg+g +CBe7ocDRwOB+FcjHcIAAzLo0iAHhL3k0qB0JMgEDEgI2z3ADAIQAoBoAAIogCAAGGhgwC/CKIBAA +BhoYMM9wAgGEAKAaAACKIAQA0QLgAgDZz3KgACwgcIIJ6AIjQgATDoRwAIAAAA8IhAAA2ATw/wjF +gAHY4H7gePHAXg8v/JhwpcEod7hzAN4EI4AP/wAAABi6BXpveQi5/9gIuGR4KLgFeUV5CN30JIAD +J3hEwNIO4AkQFAAxEhQCMWG9QCgBBAV5R3lEwRAUAjEUJIAzQLDXDXWQAeZTJcIFQKcAFA0BB9kH +8BB9FCdMEAC0YbkUJEAwu3tPvQCQpXtwe+kJtYB4YAQggA8AAAD/ELgFekCnLQcv/KXA4HjxwDYI +AADSCAAA0ggAANHA4H7geM9xgAAILEAhAANVIcIFEQiFAADZBBhQAPsIhIDgfuB48cCKDSAFANjC +Cm/9ANjPcIAAmFiWC0/9z3CAAHhYjgtP/doND/6iDAAHAdgA2Z4OYAKA2uIOgAlyDgACyggACiYL +QAGWC0ACANhmCW/+CHFGD8AI8gtAAjYOIAH/2C4OAAHRwOB+4HjxwCYOL/yKIP8Pz3WgADgux4UH +pc9woABULguA07gGJgBwDwD//zoKIAsW2fYPQAHHpWEGD/zgeOB+4HjxwOHFAN3PcIAA7AagoM9w +gADMnqywpg/gCalwrglP/UYPYAmpcL4OAAMqDY/9ug0AAU4Jr/ypcBoJj/whBg/8ANnPcKAA7Ccr +oOB+8cDPcIAAQJTuCiALA9n+C8AA0cDgfuB48cChwYtw2gogCwHZ5gvAAKHA0cDgfuB48cBqDS/8 +BNmkwb4KIAuLcM92gADMHwCGAeAApiMIUQAB2M91oADIH1EdGJAg3/ClQx0YEADYjg6gC4248aUA +hkIgQIAApgf0ANnPcKAAyBwxoIoLwAB9BS/8pMDxwKHBi3BmCiALAdlyC8AAocDRwOB+4HjxwKHB +i3ASCiALBNkAwFEgQID0CGIFyiCiAADAUSCAgFAJQgkAwFEgwIAMDYIFAMBRIACB2AiCBcINIAoB +2M9xgK7gAexwIKAByOxxAKHPcoAAjJSKJIF9ANmoIAAC8CJDAOxwYKAB4UIL4AAA2KHA0cDgfvHA +4cWjwQHYQMDPdYAAaBmpcJIJIAtc2TqFG4UkeDyFBHmBwKIMb/5BwQHAO4UEeUHBlg+gAoogWARV +JUAfHg1v/qlxz3CAAOAaEg1v/kAlARuLcKIJ4AAE2WINb/4BwLoPD/4AhYboBYWA4KgOQf6JBC/8 +o8DgePHADgwP/KHBz3aAAHAfyXAB3VYJIAupcYogFwoyD6ACARIBNkCOiiAXCiGOELoiD6ACRXlA +xYtwRgngAATZPQQv/KHA8cDhxaHBi3AaCSALAdkgwM91gAB0HwCliiAXCu4OoAIBEgE2iiAXCuIO +oAIghUDZz3CAAESesgggC0DB+gnAAO4JAAb5Ay/8ocDgePHAfgsP/M91gACYHwKFI4UB3hBxwH6p +cL4IIAsD2c4JwAAE7gKFA/AAhcEDL/wDpfHA4cXPdYAAuB+pcF4IIAsQ2QAVBBAdDFAAJwzQAAoh +wA/rco/YjbiP28kCb/24cwGFDLgEIIAPAQAA8AGlA8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4nbif +uOxxAKEBEgE27HAgoJoJ4AAB2FUDD/zxwADYz3GAAAAAAKEBoQKhz3DQ/gAABKEAFgBAABYAQAAW +AEAAFgBAA8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4nbifuOxxAKEBEgE27HAgoD4J4AAC2EYMAALR +wOB+4HjxwAAWAkChwUDCARSAMA8IHgDPcYAALJ4E8M9xgABMrkChYIkB2gjwABYAQBUhjAAApAHi +fXj1CIWAFwseAAAWAEED8ADYFSGMAACkAeL5ClSBA8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4nbif +uOxyAKIBEgI27HBAoOYI4AACiaHA0cDgfuB48cDhxc91gACsCKlwBg/gCgjZAIXPcaAAuB4CoQGF +A6FCCMAARQIP/DkAwADxwKTBi3DiDuAKENkDzNdwAAAAQAHYwiAKABe4x3AADgAAg7iduJ+47HEA +oQESATbscCCgAMBRIACAA8AG9ALBQg7gAADaBfBaCCACAcEuCMAApMDRwOB+CQAAAAUAAADxwNYP +gAAZBQAJ4HjxwFoJL/wA2c9woADQDzWgABYCQQAWAUEDzDEKXgLXcAAAAEAB2MIgCgAXuAAgjQ8A +DgAAQCEDA89wAAD8/2R4pXiduJ+4E/DXcAAAAEAB3cIlShMXvcd1AA4AAEAhAwPPcAAA/P9keKV4 +7HMAowHI7HMAo+xwILDscwDYALOJCh4CA2njugQggA8AAPz/ANsJ8s91oAA4BADbaK0B22G4EHgd +Ch4BoWsIvWV9z3agABAEuLYC4297YrgQeADdFPDDaxi+4mvvfxC/5X7ha+9/CL/lfmV+z3egABQE +y6cE4297AeXaaN0NhJMA3gjwz3WgADgEaK0B4297AeZTIE0A7w5EkxEKXgEB289woADQDxEY2IAT +Cp4BA9jPc6AAFAQQowHYBKMRCt4AABaDQOxwYKhhuRMKHgEPCZQAABYDQexwYLBiuUQig4FBKYAA +FfQA3gvwz3WgAAAE7I0AFo1A7HXgrQHmsmgPDkUT6QrfgQAWj0D28S0LkQAA2wrwz3WgANQD3JUA +Fg1B7HXAtQHjG30RC0UD6wrfgQAWDkH38SsKngCA4MokDXDgeOgg7QMTCt4Bz3CgAJgDfYAAFgBA +A/AAFgNA7HBgoADaBvAAFoNA7HBgqAHiUyFAAPMKBIBeDqAAAdgA2M9xoADQDxEZGIDPcaAAFAQE +oc9wgACEKxmAz3GgANAPIrjAuBWhtQfP++B44H7gePHA4cW0wYt1qXCWDOAKFNkAwBEIUQBKCKAC +qXCYcB3wDwiRAK4OYAKpcJhwFfARCNEAeg1gAqlwmHAP8A8IEQFaDmACqXCYcAfwQwiRAe4NYAKp +cJhwA8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4nbifuOxxAKEBEgE27HAgoHoNoACIcDUH7/u0wAoh +wA/rcnzYjbiKIx0PSiQAAE0GL/0KJQAB8cDhxaLBi3WpcPIL4AoC2foPYAKpcPoMgAD9Bu/7osDx +wHoOz/sAFhBAocFMIICgyiHGD8oixgfKIIYPAACPDMojhg8AAIMFyiQGBPgFJv3KJSYAABwANIt1 +qXC2C6AABNmKIMwKfgmgAgpxhCgIKC93ACeOH4AAYKpuCKAJBG7PcIAARKwYgCEIAAQgFoAQIuip +cATZmdoe22YNYAgYuwDYIB4CEBjwx3eAAFSqCoeBuAqnz3CAAGwGL4AB2gXpRKAE2AbwANksoEmg +JKAF2AYPgAIpBu/7ocDgePHA4cXPcaAAsB87gfoIoAKKIMwNz3CAAIwsAIAEIL6PAMAAAAj0z3CA +ADyoAIiMIMOPBfJyDG/9AdjPdYAA7KapcN4K4ApS2R4OAAajhYogTA62CKACqXHaC4AAiiCMDqYI +oAJk2ZoL4ACpcAhxz3CAAFhWBgiACf7Zz3CAADyouQXv+yCo4HjxwM9wgADUrI4K4AoN2Z4LgAD+ +DcAE0cDgfuB48cAKDe/7iiDMDqLBVgigAoohhQSLcGYK4AoC2QMUkTAhCZIgBBSFMAohwA/rcs9w +AACEDIojBQiNBC/9CiRABAIUgDDPdoAAbAaEKQgoL3cgHgIQz3CAAHiq+WAoiUAgEgIAFBQxACDT +AxzpiiBMDfIPYAKKIYUKiiBMDeYPYAIqcbYJIAFCJIAhAdgRtv/YIR4CEEAmABj6CaAABNlo8ADY +EbYhHkIUz3WAAGSoQCUQEv1li3CpcYYJ4AgC2kAlABJ+CeAKQiSBIQAngB+AAGSoCBAFAM9wgABM +0AWAUyVBBRBxyiHGD8oixgfKIIYPAACFDMojhg8AAH4ByAMm/cokRgSmDSAGKnBKJIBwANmoIMAD +hCkICC9wMiICIAjqCBUFEDAgBCBLDEABAeFAJgAYYgmgAATZAdkIG0IghhUAFoC4hh0YEC4MoAIo +cIogTA0SD2ACHHmKIEwNBg9gAiKFiiBMDf4OYAIqcfED7/uiwAohwA/rcs9wAACGDEkDL/2KI4YD +4HgAFgBAAQKAAPHA4cXPdYAAzLypcN4I4AoD2QGFz3GgAIAlDKEChQ2hAI1RIACAANiOuATyD6ED +8BChzgmAANEDz/vgePHATgvv+wTZo8EA30LHTgngCotwPtiCDmACARIBNj7Ydg5gAgQUATE+2G4O +YAIGFAExA8zXcAAAAEAB2MIgCgAXuAAggQ8ADgAABhQAMRt4E+AEIIAPAAD8/yV4nbifuOxxAKEB +EgE27HAgoADB7HAgoAQUATHscCCwBhQBMexwILAGFAQxHQweAAESBTYKIcAP63LPcAAATyZhAi/9 +VtsB3c9xAAAiIu4NYAI+2LoN4AKpcALBJXhCwADAUSAAgMolohDKIYIPAAAzM8gNYgLKIKIPz3Cg +ACwgQBAQAAPwAecGFAAxgQ8DEAQUADGCxi0NkRAbeBB4yXHaDuACqXLscQCpBBQAMclxG3gB4BB4 +wg7gAqly7HEAqQjwyXG2DuACqXLscQCxBBQAMUAgRQDPcKAALCAQgC8lSAECIAAE13ABAKCGnAfl +/wQcRDEIFAQwCiHAD+tyz3AAAFAmnQEv/Xnb8gzAAs9woAAsIDCAPtgmDWACAiEBBD/YGg1gAgLB +hgigAALAKQLv+6PA4HjxwAAWhUCmwQ0NcwUAHEIxGw0TAgohwA/rcs9wAABmGXrbSQEv/UokQAAA +FoBAARwCMAAWgEACHAIwABaAQAMcAjCLcJoM4ASBwQLCjuoAFIUwCiHAD+tyz3AAAGcZhNsJAS/9 +iiTDDwTAYHoFwQPBi+kKIcAP63IAFIUwz3AAAGgZiNvu8QHAgODiIEIApg9AAKbA0cDgfvHALgnv ++wnZz3aAAAw4eg6gCslwAJbPdYAABLoTCB4AAdhMHQIQFgngAhjYCPBMFYAQDQhRAALYTB0CEACW +IoYiuMC4TR0CEM9wgABYOCCgz3GgACwgUIFyhQIiwAAJCN8HUqUQgQOlz3CAAFBYAIBCIACAyiBi +AIjoz3CAAJg4AICA4GAOwgEIhoboz3CAAEzQCJAVpQCWJbjAuAoJ7/0D2foOQAD1AM/74HjxwH4I +7/sH2c93gACYOM4NoArpcAgXBBBGJP6DC/IKIcAP63KKIE0Ld9v9B+/8SiUAAKCHLQ1eEBQXBRDG +h+C9zCUigMwmIpAM9AohwA/rchC9iiCNC4LbzQfv/AAlhBPPcAAARKESpwDYE6cjhx8NHhEOpwGH +L6cZCNADz3ABAJygEqcB2BOnBPAup//YD6fmCgALWg5AAE0Az/vxwKXBi3A6DaAKBdkAwC0IHgDP +cIAA3CADgBiIHQhRAADYmrjPcaAAyB8PoQHApBkAAMPYGrgOoRoOQAClwNHA4H7geCEHoAQA2OB4 +8cDhxQAWAEDPdYAAlAcApQ8IkQAA2c9wnwC4/z2g6g1AACCFOwlVATMmQXCAAChgQCcAcjR4AHg2 +C6ACVNgjCF4Az3GAAGw5AIGBuH4NIAsAoQfwoguAAgPwogyAA7EHj/vgePHA0ghAB54NQADRwOB+ +4HjxwCIOoAcA2M9xgADQIxqJbg7gCjiJ0cDgfuB48cDhxc91gADcIACFuhAABh0IXgEKIcAP63KF +2I24iiPcCEokQACJBu/8uHPmD0AIqgigCQHYz3CAAHAmFIg9CNEBAYW6EAAGMQheAT4ND/3PcYAA +TNAEkCWBCrgdCEAACiHAD+tyhtiNuIojnAtKJAAAPQbv/LhzcgrP/AoIIAkA2GoIgALyDEAA9QaP +++B48cDeDqAHANgqDc/8z3GAANAjGom+DeAKOInRwOB+4HjxwKLBi3ByC6AKCNkAwM9xgACsOQCh +COgGFAAxA7EEFAAxArGiDEAAosDRwOB+4HjxwKHBgdhgwAPMAhwEMADAAgkv/ALZocDRwOB+8cCh +wYDYYMADzAIcBDDPcKAA1AMckA4LwAAAwNoIL/wC2d4PIAgC2KHA0cDgfuB48cAKIcAP63LPcAAA +MCWKI4wHiiSDD20F7/xKJQAA4HjxwOHFINvPcaAAyBxpoQAWAEDPcqAAEBQMogAWBUAB3UwlAIDK +IcEPyiLBB8oggQ8AACwlyiOBDwAACQEkBeH8yiRBAxgaQAFoGUABA9gPormhaqHWC0AA2QWP+/HA +4cWtwYt1qXCyCqAKDdkAwB14UyABAEQpPg2pcAAhgX+AAAjGWgqgCA3aogtAAKUFr/utwOB4VQBg +CwDY4HjxwOHFrMGKIJINWghgAr7Zi3BqCqAKDNkAFAAxk+hAJIAwz3WAAOQzqXFiCaAILtoB2GAd +AhAXhYDgfAgh/MogIQAAFAAxMwhRAIog0g0WCGACz9lAJIAwz3WAAOQzQCWBGyoJoAgu2gHYN4Vh +HQIQgeFECAH8GgtAAB0Fr/uswPHAjgyv+xfZt8HyCaAKi3AjwEojQCBTINEAhiD+A0IoEgElCTIk +DBxCNAohwA/rcnLYjbiKI04PCiTABAkE7/wKJUAEEsHPdoAATMhBKUADUyAQACDAQClNIVEgAICg +Zt1lhiD3D170iegKIcAP63Jz2I24iiMPAeDxz3KAAAg1wBIABhcI1Q+KI48B8mj0f19nYKcEH0AU +IqcB4MW4wBoYAAHAAsEqcqoJ7/tmbTXoCnDeCSALKnENFIAwhSDBAA0cAjCKIP8PU8AAham4AKUS +wIYg+w8ouA2tSiQAdADYqCCAAv/a22BAKUEhEOM7Y0CrAeAqcA4JIAuLcc9wgADcIPAgAQS2EQAG +DyBABLYZGAAB3wLwAt/CDKABKnAH8IDgyifBFMonIhKB56f0IIXPcIAA3CADgBiIKHaGJvsfIQhQ +ANIMwAEghRnoz3CAAHAmFIgnCNEBQSlAAx8IHgATwBLCFwgeAoYi+w9BKgQCTY0LCgABqLhTwBPA +EsIGeUR4JXgApYYg+w8L7oDgyiBBBMohIQAIDqECyiLhAwwdghQA2M9xgABMyxYhQQRAhQChAaEL +Cl8FANiLuAGhDwqeBQGBhSABDgGhUg/v/ItwDRSAMB0IXgFYFAAxBbWA4MogQgTKISIAtA2iAsoi +4gMNFIAwMwheAFAUADECtRXoAN4Q2BpwApURIICDyiBCBMohggOIDaICyiKCA0IgQCDlCHWAAeYN +FIAwEQgeASpw0gygAFUUgTANFIAwOQjeADXBVhQCMSpw3gsv/RLDjCACgLhwDPQKIcAP63J02I24 +iiOSAeEB7/xKJEAAUSXAgconIhHGCSALKnADzNdwAAAAQAHYwiAKABe4x3AADgAAg7iduJ+47HEA +oQESATbscCCgsghgAOlwPQKv+7fA4HjxwN4Jj/vPdoAACDXAFgAWGQj1D6TBiiJSCzJoNHnZYUCh +ANpBoUKhAeDFuMAeGBBKI0AggcAWD2AKanEA2GrwgsAKD2AKAtkCwItyzgvv+wPBBCDABC8jB6Ba +8gDCz3eAAEzINWohZy25UyESAMAWARYA2BsJ9Q8PIIAAiiNSDrJptH3dZWClQaUIHYAUAeHFucAe +WBDPcYAA7AZAgS8hCiAEIYCgAKEG9IDi8AmiA8ogIgggwJ4LoAAQ2QDAAN2KIggANWj5YaKxQKGp +cSIMoAIP2gDAgNo1aD9nz3GAANwgSK/wIYMESa+2EwEGBCFBBLYbWADPcYAATMsWeaChoaHPcYAA +rMcUeaCxQCBAIBpwIcAtCASgA8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4nbifuOxxAKEBEgE27HAg +oJIPIABqcPEAr/ukwPHAz3KAAAg1wBIBBhcJ1Q+KI9MGEmkUeFhgYKAA22GgYqABacW4fgmgCMAa +GADmDgAA0cDgfuB48cDhxQAWDUADzAHa13AAAABAAcjCIooAF7rHcgAOAABOCqAIUyUBEFElQJDP +cYAAgDoB2MogIQCpAK/7AKHgePHAocGLcIINYAoB2QAUBTAbDREACiHAD+tyidiNuIojXwqxB6/8 +SiRAAM9wgACgumoOIAADGEIBocDRwOB+4HjgfuB48cDOD0/7ABYSQQAWAEHPcYAATMhAKkAhMCEF +AKLBQS1AAyUKNCRTIBEACiHAD+tyddiNuIojlQxKJEAAUQev/EolAAAbDV4CCiHAD+tydtiNuIoj +1Qw5B6/8CiSABM9wgABMyhYggAQacNoMYAoC2c9wgAAsxxYggATKDGAKAtlAKpUhACWAL4AAzMu2 +DGAKENmLcK4MYAoB2QAlgC+AAMzLVg8gBRDZARCAIB8IEgQKIcAP63J32I24iiMWBUokQADNBq/8 +CiWABADfENh6cBUlwCPPcYAAzMswIRQABCSCrwAAAAEEHAA1QfIhwc9wgACoYy5gBCSALwYAAAAx +uKDh3WDRJOGiLPIE6hUOkxAEJIQvAAAAJEkMgA8AAAAkQQjVAAsIkQAc6jkOkRAE6szhGPbPcIAA +YDEggGB5BtghCIQDIQzeIs9wgADcIPAgQAS5EAAGBCC+jwAGAAAE9ADZA/AB2S95A/AB3alxBCSA +LwEAAMAuuM9ygAA0bghiEHUB2MIgDQCA4cwgIoAX8kIjQCA7CHWAAecCEIAgz3GAAKBjCGE7CFAA +CiHAD+tyediNuIojlgpA8QohwA/PcIAA3CDwIEAE63KKI9YJuRAEBnjYjbi5Ba/8CiUABQMQgCAI +YRUIkAAKIcAP63J62I24iiMWCyLxig3gCkpwz3CAACzHFiCABECQz3EAABgVCSJBAEIMIAAgsAUG +b/uiwPHAABaBQM9wgAAcWSCoABaEQAAWgUDPcIAAJVkgqAAWgEBQJL6ByiHCD8oiwgfKIIIPAADa +FMojgg8AAGgHMAWi/MolIgDPcIAAuAYAkAboxguACsoKgAreCwAA0cDgfq0GIAoA2OB48cBiDW/7 +ANlKJAByqCBAAgAWAkAVIkAwFhiYAAHhABYNQAAWDkBaC0AKz3CgABQErKDPcKAA1AvcoJYLAACR +BU/74HjxwBYNb/sI2aLBARIONs91oAA4LhwVEBAiCmAKi3AAFAQwAN8EJL6P8P8AAMohwg/KIsIH +yiCCDwAApijKI4IPAABEBnwEovzKJcIAUSRAgsohwg/KIsIHyiCCDwAApyjKI4IPAABHBlgEovzK +JcIA56ViCSALP9gAwAQUATEHpdYIYAqCuRwdABQCCyAAARqYM+kEb/uiwPHAANhqCiAABBKBMAQS +hTAKIcAP63I42IojzwwNBK/8SiQAAOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB48cCh +wQDZQMEAFgJAABYAQDUKUAADzNdwAAAAQAHYwiAKABe4x3AADgAARSAAA524n7jscgCiARICNuxw +QKDscCCgH/COCOAEi3ADzAHZ13AAAABAAdjCIAoAF7jHcAAOAACEuJ24n7jscgCiARICNuxwQKDs +cCCgAMLscECgdgogAChwocDRwOB+4HjxwLILb/sC2c93gAA4Wa4JYArpcECHz3agAOwnz3WAAGAx +lwoeACuGRCKAAIYi/w4iuqG5FLq0uQUggwBleSumBCCADxAAAgAEIoIPEAACAM9xgADIBUV4C6Eg +hQTeYHnJcBsI0AEghWB5yXAPCJABIIVgeQHYJQhRAACHz3GgAMgcEQheAAHYHqGuCQAFBvAA2B6h +ng6ABCCFYHkB2GkIUQEAh2EI3gDPcKAARB3FoMOgxKAo8M9woADIHAHZPqALhoG4C6ZyCQAFIIVg +eQHYJQhRAc9wgADcIAOACIAZCB4AANmUuc9wgADIBSugC4aUuAnwz3CAAMgFANkroAuGtLgLph4J +AAARA0/78cDPcIAAiBemCGAKAtkKCQAA0cDgfuB48cCSCm/7ANoIdSh2z3CgANQLOIBCIQEIgOHK +IYwAQCYAEhBxQA3FCgPM13AAAABAAdjCIAoAF7gAIIEPAA4AAAduBCCADwAA/P8leJ24n7jscQCh +ARIBNuxwIKAivgbw7HEAoQTlYb75DrWQAIXWCAAAjQJP++B48cDhxc9yoADUCwPdsaIA23CiAxIC +N9dyAAAAQAHawiKKABe6x3IADgAARSICBp26n7rsc0CjAtoUGoIwBRIDNuxyYKILEgI3AeILGpww +7HIAogESAjbscECg7HAgoAHYz3GgAMgfE6FYgexwQKAZgVoIAADPcaAAyDsOgYi4DqENAk/7A8zX +cAAAAEAB2MIgCgAXuMdwAA4AAE8ggQCduZ+57HAgoM9woAAUBAPZJaABEgI2z3CgANQLTaDPcKAA +RB01oOB+4HgD2s9xoAAUBEWhz3GgANQLDaHPcKAARB1VoOB+A9rPcaAAFARFoc9xoADUCw2h4H4D +2s9xoAAUBEWhz3GgAPwLDKnPcKAARB1VoOB+4H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+ +4HjgfuB4z3OgAKggMYPPcoAACCwDgjhgA6IB2BKj4H7gePHAvghv+7hxz3CAAESsYBAEAEogACBM +JICAyiLGB8oghg8AAJEMyiOGDwAArQc8AKb8yiHGD89wgABsBgeAhCwICAAhgX+AAGSoFnnHgX8N +EQDPcIAAkCz6Dq/8iiEPD89wgAAkLO4Or/wg2c9wpQAIDKCAUyVNkBLyKQ1QECsNkBAKIcAP63LP +cAAAkgyKIx8FmHXVB2/8CiUABP/YB/D/2Ai4A/D/2BC4z3GAAMgFDKGtoc6hANmRuc9woADQGzGg +IgtgCQHYHfDPc4AAyAUOg5voz3GAAJRkz3KAAJAsz3WAAAgsiiTDfwpwqCDAAg9hFSXDE+eD8CIO +AAHg/mbHoyEAT/s4EwQACiHAD+tyz3AAAJMMiiOfCVEHb/wKJQAE4HjhxeHGz3CgABQEA9kjoBXI +z3KAAMC7YZLPcYAAsLrEihQhDQBotQAggw+AANC6OOHAq2KCFXkGkmChAxIDNsAdBBAEgqATAQCG +IcMPJXigGwAAwcbgf8HF8cBKDw/7CHa2CKABKHWA4NElYpMB2AP0ANgEuM91gABs0BR4CWUdZRUJ +UQBCDyAJqXA+Cm/9AY0A2ACtAYV5By/7AKbxwPoOD/uiwRUSAjbPdqAAvC3PcIAA3CBOpiSAAN1G +EREBDRIQN1UhRgpGIMAgAxIDNg0aHDCkEwAAhLikGwAAAZNVIUgJVSHHCIYbRAMI6M9wgACwu/Qg +gAAJ6AGDDwifA1AgACAvIAggUyB+oEgDAQDPcIAAgDpmEAAGz3GAAIA6AeBmGRgABBIBNqQZQAMB +k48IEADPcIAAsLpUeIAQDwd/DxEQ0BAOAVMmzpAV9HITDgHgk8J/uBOOAMJ/8H/gGMQDpBMOAIYm +858F8mi/8H/gGMQD4BAOAXATAAHhkwJ+EHbCII4DwicOEHQTAAG4E44A+GDYYBB4kBkEAL4ZBAB0 +GUQDoLEQiwDeEKkBgwGhCIsIqRKLEqmWvjDwD4b/CN6Fz4ZTJsASVQ6eFSEIlQPPcIAAgDqcEAAG +tr7Pc4AAgDoB4JwbGAAa8GS4EHiQGQQABCaAHwAAAPAsuBCpdBlEA6CxobG+GUQDAYOoqYYg/w2E +uAGhEosSqfa+OAIBAADYlrikGQAAKQ5eFR4L7/4A2AQSATakEQAABCCDDwIAAAAtuwUjAgQvIIgg +PfABgaMIHgFwic93gABMyBVrAGdPetKJSSLCABMIngXPcIAATMp2eAGIAvAA2MdygABMynZ6RIoI +Jo4QCCYAEEkgwgMWa1V4z3KAAMzLAmLPcIAATMt2eM9zgADcIGSDeIMBgGV4BCCADwAAAAgGegDY +lriYGYAAQYGGIv8NQwgeBaEKEACYEYIAQCcACUpgz3OAAGSuQMIgwMO4HHj0IwAAUvAKIcAP63I0 +2Iy4z3MAAK0LiiSDD0UEb/xKJQAAmBEDAJwZQANJC14CgLikGQAAKOqYEYAAhiD/A0S4MiYCAM9w +gADcIAOAibpAwiDDFIBkeIYj/wOGIP8ORLt4YA94z3OAAPhj9CMAAB7wEwseAgjqmBGCAEAnAAlK +YAvwheoA2AhyEPCYEYAAw7gceDIgAhBAwiDAz3OAAAyuw7gcePQjAACEGQQAmBEAAIgZgACQEQEB +ugggAADaBBIDNgMSDTbPdqAAyB+EEwEBghsEABlhMHmwG0QA+BYCELAVABFCeAAgTwTPcIAA3CBE +gFQSAAEfZz9noBYOEPB/Ow7EE1CCmBUOEAsigIMX9HCLUI1wctEmIpIa8pgVjhDPc4AAqGPLYyUL +kgAFus9zgABMyEJjGQpeBM9xgACAOq0RAAYB4K0ZGAAQ8DhgEHiGHQQQz3GAAIA6ZxEABg0aHDQB +4GcZGAClAy/7osDgeKHB8cA2Cw/7CHVHwOi9KHDgACEASHYDuEAgkQUnwc9wgACoYwQlkh8GAAAA +QSpCJCtgBCWAH8AAAAA2uKl3emLPc4AAAG7GvwhjSmMaYkEtgBJSIAAAwLgDuBjgheLKII0PAQCJ +DdUgjgAvIAggBCWCHwAAABjPcIAARGbXcgAAAAgeACIA8CDAA6DhEgABAM9xQnvQXgUofgAKIMAO +KnEFKT4ACiDADiS4AeALChAgUyABADhgAiiBI89ygADcIESCVhICASUNXhPPc4AAgGdgkwUrPgAA +IYB/AAD/Py64OGCXACAAWGAVeY8AIABYYVElQJJQACEAJ8W35SAACwAzaFMlAhDPcIAAQGTwIIAA +BSk+AAogwA4B4AfwiuXAKOEAwCiiAM9xgADcICOBwNo0gaR5hiH/DiK5OnraejsAIABYYDNoUyXA +EBx4z3KAAMRn8CIAABbhBSk+AAogwA7PcYAA3CAkgQHgVhEBARV5FNjaeDhgEHgI3B8CD/vgeM9x +oACwHzuBQSiCBdW4QSmDBdW5AnnPcIAATNBiegWAyboFKL4AJ3HPcIAAmFgDgACA4H84YOB4z3Gg +ALAfO4FBKIMF1bhBKYIF1bkXCSUAW2PPcoAATNBFgllhAnkB4wLwAnlAK4AFmQfv/yV44HjxwEIM +D/tOCS/7UNlFwEogACCWCa/+hsUjCDUlBBUBFAXAFSAABCCgQCBQIO0JgY+t3u++JNyDAQ/7CiHA +D+tyz3AAAIsTiiMHB5hzsQBv/AolAATxwAIJL/uYcBcI9AC4cQohwA/rcn3YjbiRAG/86tvPcIAA +3CDwIAEBKHCAIAsJQCAPBmkNEQBIgQDbQKBJgUokgHBBoFyJSKhdiUmoKhGCAEqoKxGCAEuoLBGC +AEyoTZFHsFeRSLBIgQQigg8ABgAAgOIB2sB6UqhbgaMYmACoIEADtJGEKwQPACBCDgHjtqqogcC9 +tKor8FcNUQBAgADdSKFBgALeSaFIiFypSYhdqUqIKhmCAEuIKxmCAEyILBmCAFaIVLFHkE2xSJBX +saMQAAYboYQtBB8AJ0AeAg2gB6lxYb7xDnWQAeWBAA/7CiHAD+tykNiNuLEHL/yKI4QH4H7gePHA +CHE+C6ABiiBZAV4PT/zRwOB+8cDWD8/6ocE6cCh1SHaacwojACEKIkAhyHcKIMAhiiAZAg4LoAEL +wSzAKBQFMAroKnCpcclyCnPCCqAHmHcR8AAcQDEqcKlxyXKKcwokwAQKJYAE2HeODeAHCicABM0H +7/qhwPHAfg/P+jpwz3aAAMwfAIYB4M91oADIHwCmHwhRAAHYUR0YkCDf8KVDHRgQANiyCKAKjbjx +paQVEBDPcIAAWDMGgM93gADouUB4AYcp6CTYGNm2CKAKM9ofCFAABBcFEAohwA/rcs9wAAB0GZrb +wQYv/AokQAQk2AHZjgigCjPaHwhQAAQXBRAKIcAP63LPcAAAqyif25kGL/wKJEAEpBUBEIogGA8m +CqABAiEBBACGQiBAgACmBfQA2FEdGJAhB8/64HjxwMYO7/qKIBgOz3aAAAQ59gmgATKGz3CAAFgz +BICK6M9xAACtC+IJoAGKIBgOPvAyhuTh1vbPdYAA5FsAhdrgUPaKIFgOwgmgAQTZQIUyhoogmA4Q +urIJoAFFeQTYG/Da4UgACgDPdYAA5FsAheTg3PaKIFgOkgmgAYohPw9AhTKGiiCYDhC6fgmgAUV5 +iiA/D2ILQAoghUgWABEQuaIO7/8leBKGAKWJBs/6z3CAAOw4QIgRCh4Az3GgAKwvGYGKuBmhEQpe +AM9xoACsLxmBjrgZoeB+4HjPcaAAyDsdgQfogtgUoc9wAIARFA6h4H7PcIAAjLwsiM9ygADMnowh +AoAKkkEoAwML8hcI3wIFucdxgABMyAKRDyDAAAKxANjgfwyy8cCeDe/6VGiGIvgDTyJDAlMhwgAF +IsQAz3KAAKzHFHqP4YojDwzKICkACfYAkgDdDyVNEIojzw+meACyANlKJAB0z3aAANyhz3KAAFSi +z3WAAFiiqCDABBQiQADkkGR/GQ8BEQDf5LAWJkAQ4KDhoEAlABk1eOCgAeGNBc/64HjxwCINz/pI +doDgAd1E9ool/x8TeAkJEwCzfTN5FCEAAEoO7/o7eax4AB5AHmEF7/oB2OB4ocHxwOHFQsCYcUh1 +gOAA2kT2AdoTeELAigugB4LAAsAC6hN4Eg7v+ohxAKUI3DcFz/rgePHA4cUIcgHdgOHKIcEPyiLB +B8oggQ8AAJsTyiOBDwAASADKJCEAOAQh/MolAQGA4kT2U3qKJf8fCQkTADN5s30UIYAAvg3v+jt5 +rHjhBO/6L3DgePHA4cXPdYAAzJ7PcIAA3CAjgECFAIFBCgEAApFClTkKAQAChaoKL/wjhYwgAoAU +8s9ygADoBiGCANsPIwMABbhmeSGiACCBD4AATMgAgaq4iLgAoQDYhQTv+gy18cAKDO/6iiBJBkIP +YAGKIUQI1g0ACs92gAAEughxhODMISKCEfTPcKAALCAQgADaQqYDps9wgADongKA1bjHcAAAiBMJ +pg2GgODKISIBAN1iDyAKqXALCBEBraY/8AKGz3aAAAg1HuiKIIkJiiXFEdoOYAGpccAWARYdCfUP +BdoSaRR42GDPc4AAUAdgg6CgYaBCoAFpxbjAHhgQBdgd8IogSQeKJQUTog5gAalxwBYAFh0I9Q8C +2jJoNHnZYc9zgABQB2CDoKFhoUKhAeDFuMAeGBAC2DIPAAOdA8/64HjxwOHFz3AAAP//z3WAAOie +A6XPcIAAwFdWDUAIz3CAANhXTg1ACADZIKUF2AGlIqXiCuABAthpA8/64HgH2c9yoADUBxoaWIAN +6BkSAYYJIEMADxIBhgIgwIB5YQ8aWID19eB+8cDhxQh1FRIBNs9wgACwujR4EYgR6APIAYAfCF4D +z3CAAFxv8CBAAM9xgAAUIBR5AJEQ4ACxiguACZYNIAUVyAPIAdmgGEAAz3EPAP//xgggAKlw5QLP ++vHAZgrv+gPaz3OgANQHExuYgA8TDYYAFgBAABYBQKLBQMEgwB8IEAcKIcAP63I12Iy4z3MAAMQM +mHPZAS/8SiUAAAAWDkDQfgAWEEBWJgASUSAApcAgogAD4AQggA8AAPz/GRMOhkIgDwT7DsSTHWUP +G1iDIBuYgBkTAIYnCBQCHxMAhkHAIcCc4Mohwg/KIsIHNtjKI4IPAADhDM8gIgPM9Q4NYAHa2AQg +gC8AAABAGQLv+qLA4HjxwKoJ7/rI2oIkAzIIdSh2z3GAANBgwgvv+otwAdrPcKAAFAREoM9ygAB4 +OxWCANkB4OK9FaLKIEIgBfQOD8//GnAVyM9xoABkLs9yoAA4LvAhAAAngtO4JHgEIJEDrPDqDs// +z3aAANzUGnDJcAIPYAOLcfoNYArJcJ7wA9/PcKAAFATwoOSgABYAQAcaGDAAFgVAARpYMQTKPwgR +B4twbg6gCQ7ZJMFTIcAAhiH+A0S5xBxCMGTARCaNFDUOXhCO2JC4oBwAMNsOHhGG2JC4oBwAMGfw +CiHAD+tyz3AAANwOz3MAAMoKcQAv/EokQAAPCBAgjNiQuKAcADBT8AW4x3CAAEzIQIBIdIQkDJAN +8hEKXgKL2JC4oBwAMAHdQ/CI2JC4+vFMiFBxyiCCDwAAkQDPICIE8vUBwRMJngYB3ZDYkLigHAAw +LfAikDMUgDArCQ4AB8gEIIAPAMAAAB8IgQ8AwAAAIsCA4MogiQ8AAI0AqAfp/88gKQQKwYwh/48R +8s9woAAsIBCAInjXcACAAADKIIUPAACHAIAH5f/PICUETCAAoMwlIZBc9c9woAAUBOOgTCAAoKl2 +YvVTJn6QB/LPcKAAFAQJgIDgWPVnDl4QAdpVCRAgKnEvKEEATiCDB5TjyiXFEIT3aHWAJcIUz3Cg +AGgs8CBAA5TjD3jKJ8UQhfdod4AnwhHPdaAAGCzwJc0TsXDKIiIACuoA2A8gwAAGIQGA2/UB2APw +ANiA4Cbz2Qev+oAkAzLgePHAcg+P+hpwRgugATDYmHApuFEgAIDKIcIPyiLCB8oggg8AAOkUyiOC +DwAAxwDwBuL7yiUiACzYVgugAUAogSAB34ogDwoacAYLoAEw2JhwKbgxCB4AjCcPmjLyIN3PdqAA +yB+wpgHYQx4YEADYYghgCo24saZCIEAgzwh1gAHnzgqgATTYTyABBZW5AgugATTYvgqgASzYCHW2 +CqABNNi4cDMIXgUKIcAP63LPcAAA6xTj22kG7/tKJAAACiHAD+tyz3AAAOoU1NtVBu/7SiUAAAUH +r/pBLQAU4HjxwJYOj/oIdwDeyXAWD6ADyXED2Ml1GnAJ789xgAC4VhNtFHi+CGAIOGAK789xgABI +VxNtFHiuCGAIOGBCIEAg1wh1gAHlz3CAANSsyXSdsDC8nrDPcIAAhAemCSAFwKCZBo/64H7gePHA +z3GAAEgGfNhuCWABIIEKIcAP63LPcAAA2w7w20okAAC5Be/7CiUAAeB44H7gePHA9g2P+s9woABU +LiuAB93TuS8oQQBOII8Hz3CgAMAvpRAShhQQEYbPdqAAFASqpooN4AaA2PPYBbiA2d4JoAGfuRUS +EDb12AW40gmgAalxqqYVGlgzBPAD2AWmqYYb7XztQS2AkAryLyQJcOB4qCCAAQAWAEDgeFMlTZAJ +8i8kSXPgeKggQAEAFoBA4Hiphujx89hGCaABBbjJCN+H9dgFuHoJoAEKcSgeABSU5xUaGDTKIcUD +hffpcYAhwgHPcKAAGCzwIEIAlOfKIcUDhffpcYAhwgTPcKAAaCw1eAS/QKDHd4AATMQVhzaHBXkX +h7iHJXgFJQ2QyiHCD8oiwgfKIIIPAADCIcojgg8AAMsGyiRCA5QE4vvKJSIAgNnPcKAA0BswoM9w +oADAL6UYmIQUGFiEHQWP+vHAugyP+qLBpBEAACh1USAAgArYyiAhBJgVARAEIb6PAQAAwHYdBBAx +9EHBLwkeAiHCz3CAAKhjSmAEIYAPBgAAADG4WGAEIYIPAgAAAddyAgAAAcogoQAC8AHYIQhQABMI +kACD4ADYyiDhAcAooQMK8M9wgACgugKABvDPcIAAoLoBgAV5mB1AEJ4VABGUHUAQkh0EEBCNz3ag +ANQHQMCCFQARsh0EEADYgB0EEH4dBBADyEGQkBUTEQnqFcjPcYAAsLv0IQAAEugZFgCWIQgVDg3M +z3GAAHg7RiCAAg0aHDAXgQHgywMgABehDxYQlgjqFcjPcYAAsLv0IQAABehKIUAgBvAD2BMeGJBK +IQAgBxIPNgESEjYAFgBABxoYMAAWBUABGlgxBMqc4Mohwg/KIIIPAADcDsojgg8AAMoKyiLCB0f0 +qXDeCKAJDtkhCVEgBMgBkCHoz3GAAOw8D4EB4A+hEYEB4BGhF/ADyAGQE+gVyM9xgACAu/QhAABT +IMCAC/TPcYAA7DwPgQHgD6EQgQHgEKEDEgE2AYEbCJ4DVBEAAVMgwIAH9M9xgADsPA6BAeAOoQIV +BREjDRAAAYUbCJ4DCiHAD+tyLtiMuIoj3gahAu/7SiRAAACVsHDKIcwPyiLMBy/YyiOMDwAAngfP +ICwD7/YwjVMhwAAQrYYh/gOkFQAQRLnEHUIQRwifBQcSATYCIcIDANgRClAAAidCEIwiw48D9AHY +legNzM9xgAB4O0YggAINGhwwFoEB4BahDx4YlAca2DNnAiAAARqYNAca2DMBGpg0ANh0HQQQGgpg +AKlwz3GAAAhuCmF0FQERACJGAM9xgAAQbvAhAQAvJogBpBUAEHQdhBEFeaQdQBAEyAGQFOgfCVEg +QZW4FYAQwHJglRpiUHq+HYQQwHMAIwUADfC+FQIRCvBAlbgVgBDAchpiUHq+HYQQuHKQHYQQDCNA +ocohwg/KIsIHyiAiDM8gIgPKI4IPAADcB4QB4vvKJMIEAMAQFYQQGwgAAQohwA/rcjHYjLiKI58H +ZQHv+wAUBTAPFgCWtB0EEBEJHga2FQARDx4YkJvwABYPQfy1ABYAQUQnBxMdtQAWCEA8HQASABYA +QUAdBBAAFgBAEaUAFgBBSB0EEDcPEAEY2HIdBBAAFgBAE6UAFgBBUB0EEAAWAEFUHQQQEw8RAulw +hiDzD4wgDIAN8hjYFfAQ2HIdBBAA289wgADAu2ewENgL8B7Ych0EEAAWA0B2pQAWA0FcHcQQuHeG +Jf0MjCUCggj0AuAQeHIdBBAAFgNBA/AA22AdxBALCF4AABYDQSh0hCQMkAP0ANsi8DcPEQBRIACQ +0SEighXyqLnPc4AATMikHUAQQCxEATAjAwELC54Hi7mkHUAQANt6pXul5fEAFgNAeqUAFgNAe6UI +2wIiggECemJ6uBWDEJi5pB1AEHhgEHhyHQQQuhUAEWJ6UHpwHYQQ5XgctQ8WAJa2HQQQpBUAEAh0 +hCQakCHyPQheAgPIAZAa6BXIz3GAALC6FHmAEQAHkujQEQABahWPEAHgw7j4YA94ah0CEA4PoACp +cGodwhMF8AIPoACpcA8eGJRlAK/6osDxwAoIj/oacCh2sIkA2KQZAADPd4AA3CAkhxChB8gEIIAP +AMAAADMIgQ8AwAAAFcjPcYAAsLoUeRGJj+jPcIAALMe2eCKICI4PCEMACnByDS/+yXHL8FEgAKB6 +8gQWBBB3DB4BFcjPcoAAsLoUehEShQDPc4AATMhVbUJjD3gyjkkgwAARCp4Fz3KAAEzKtnpBigPw +ANrHcIAATMq2eASICCEBAAghgQCgcUkhwQMWbTV4RIfPcYAAzMsBYc9wgABMy7Z4WIIBgEV4BCCA +DwAAAAgGeQLwI4aYHkAQBIcIgAQggA8AQAAAQSiCB1MkAAAe4lh4JXiYHgAQGQieB6QWABCMuKQe +ABBQ2JweABBv8CMI3gekFgAQjbikHgAQz3BAAVAAnB4AECSHEIGeuBChXfAA2KQeABAF2BS4nB4A +ECSHEIGeuJ+4EKFR8IUIXicBhmsIHgEyjlQSgjBJIsIAFW3Pc4AATMgAYxMIngXPcIAATMq2eAGI +AvAA2MdygABMyrZ6RIoIIYEACCEAAEkgwQMWbTV4RIfPcYAAzMsBYc9wgABMy7Z4WIIBgEV4BCCA +DwAAAAgGeQLwI4aYHkAQFcjPcoAA6LoVeiCiANgE8AXYFLicHgAQUSAApQDYzyBiBMogIQCkHgAQ +ANh0HgQQ1g0gAMlwz3GAAAhuCmF0FgERWWEweXQeRBDPcYAAEG7wIQAApBYBECV4mBYBEKQeABAZ +CV4CCtl2HkQQeB5EEIC4pB4AEBLwENp2HoQQI4cogRUJ3gAK2XgeRBCDuKQeABAE8HgehBBqCa/8 +yXCkFgIQRCJ+gowWgRAW8gOHFIAkeIYh/wNEuYYg/w44YM9xgAAgZPQhEQDPcYAA+GP0IRIADvDD +uc9wgAA8rjx59CBRAM9wgAAMrvQgUgCYFgUQ4LrKIIIEFvSIFoAQUSUAgsO4HHjRIiKFB/LPcYAA +ZK70IQAABvDPcYAADK70IQAAIYZRIcCAyiAhAIQeBBBLDR4CmBaBEM9wgACoY3VtKWAEJYAPBgAA +ADG4GWHPcIAATMhgYCUI3gaXuqQegBAE2LgeAhAA2I+4uh4EEM9wDECo/hmmAvAB2QMSBzYCFwAB +I+gVyM9zgACwu/QjAACD6AGWuBaGEHQWBBEEJb6PAQAAwAAmAwF4YBB4vh4EEA/0CiHAD+tyLNiM +uIojmgBBBK/7iiSDDwCW5fE9CVAAguHMIeKAyiHCD8oiwgfKIGILzyAiA8ojgg8AAJMGyiQiAAwE +ovvKJQIBz3CAAEzKtngDiAfwz3CAAEzKtngCiIwWARAOuCV4jB4AEASHG4CI6M9wgAAkWQCIvQgQ +ABUSAza1C5ABAJbPcYAAcDylCBIMz3CAALC6dHgRiJUIEQCkFwAAiQgfA4EKHwB5CB4gnhYAEc9y +gADYPIq4nh4EEADYG6EAkgHgEHgAsgHIGaGYFgAQrrivuLC4mB4AECSHW4EvKoEATiKBByO5DuEP +IEAApBYBEJgeABC0uaQeQBCeFgERp7meHkQQz3GAABhZAKGouKu4mB4AEA3YmB4CEAzwENgJ8AjY +B/AE2AXwAtgD8AHYG6GYFgAQvhYBESYIb/8A2qQWAhAEIr6PAAAAMIIeBBBR8owWARCcFgARlB5A +EJIeBBCAHoQUAxIDNhsKHgMU2JAeBBB+HkQUeBMNAQIhQCMQeAzwDtiQHgQQANh+HgQQeBMNAQIi +QCMQeLIeBBDPcIAAXLoAgIYgf48L9JgWDRATDV8SYZOF65G6krqkHoAQELgFeqQegBAEIYEPAAAA +EESHUiEBAxCCBXkwokSHEIIEIIEPAAAAED15JXgQohTwmBYBELIeBBCUHkAQnhYBEZIeRBC+FgER +kB5EEADZgB5EEH4eRBCAFgARfhYCEYIWAREaYoQWABFZYThgEHjFAm/6sB4EEPHAHgqv/OHFz3KA +AGhYIIJJCRUBMyZBcIAAGGBAJwByNHgAeDoLIAgD2MoKIAhA2ADZz3CAAPw6OaAQ8M9zoACoIDGD +AoIA3aKiOGDPcYAA/DoZoQHYEqMB2c9wgAD8OoUCb/o4oOB48cCYcLhxFHnPcIAAmGMoYITgyiLB +B8oggQ8AAKwTyiOBDwAABgOIAaH7yiHBD9HA4H7gePHA1glv+gfYz3GgANQHGhkYgA4RAoYVGhgw +z3CgAEgsXqAfEQCGBxqYMAEaGDAEypzgzCCCjwAAkQAG8gAWAEAAFgBAA8zPcZ8AuP8YoYogRgTG +DOAAARIBNs9zgAAINcATAAYBEgI2Fwj1DwcSATZ/3rJotH19ZcClQaUipQHgxbjAGxgAvQFv+gTK +8cC4cc9ygABMyAW5MCJEAFEkQILKIsIHyiCCDwAAyyLKI4IPAADCA8QAovvKIcIPQC2BAc9ygADM +yyFiUSFAgooiCAXKImEDz3GAAEzKFiFBASKJDrlFeSCg0cDgfuB4FHg4YM9xgADwbuB/CGHgeOB/ +AdjPcYAA3Dngf/AhAADxwJhwCiHAD+tyCiXAB89wAACfGVkAr/tD2+B4z3GAALg54H/wIQAA8cCY +cAohwA/rcgolwAfN2AW4NQCv+0zbz3GAAPA54H/wIQAA8cCYcAohwA/rcgolwAfPcAAAoRkNAK/7 +VdvgeM9xgAD4BiOB4H8goBGI4H/CuOB4z3GAAJhYRoGKIf8PIKAG6iKCIKAB2APwAtjgfooh/w8g +oM9zgACYWEaDEuokghsJXgDPcYAA8FcPCkAAz3GAAAhYEQpBAECC5QuBgALYBfAigiCgAdjgfvHA +5g8P+s92gADIsESWlOLAIoYPAACTAM9xoABoLPAhkQCvCBAAL47PcIAATMrPdYAA3CA2eCKIA4UA +389yoAAsIDQQEAE8EhIADo6A4IQAKQDKIKkAjCIBpHgAJQAE2OWiUNhFIUECGNoyCSAKINv4uAjY +LvQD2M9xoAD0BwWhhNoNcECwQiIAKA1yALJAhg1wQKBClg1wQLADhUCADXBAoAOFQpANcECwBpZA +KQIlw7gMuIK4BXoNcECg5KEOjgHgDq7uCmAICnAB2BXwANgA2s9xoADELEehSKGmlgy9n70FJUMU +ZqFOrs9ygAB4OzuCAeE7ok0HD/rgePHA8g4P+hpwhCgICAAhgX+AAGSohhENBs9wgABsBgKAoL2G +GVgDBIgP6AOBjegKIcAP63LJ2AS4iiMcDAokAARdBm/7uHUCgZroz3KAAGCwERIAhowgw48J8s9w +oACwHxuAAqEaGhiEFfDPcIAAACwAGAAEag6gBwDYDfC2DA//hCgIKAhxACGAf4AAZKoiCcAHxQYP ++uB48cBaDg/6GnCKIEwLlgngAApxz3aAANSsKQjUIB6WOhYFEQohwA/rchC4BSUFAM9wAACDDIoj +BQ/NBW/7CiQABEAoDyHfZyWXBJcQuSV4OejPcIAAFG/wIAEEQCjNILR9ACWAH4AADFcgoCOXApcQ +uSoML/8leAhxACWAH4AAAFeWCMAHz3CAAAhv8CABBAAlgB+AAHxWR5cgoCOXApcQuhC5JXgmlxYP +r/tFee4LD/8IcQAlgB+AAHBWXgjAB16WHZYA2Q8hAQQQukV4BiBAgAHdHbYwuB62GPTPcYAAMDEA +gaC43gigBAChz3CgALAfO4DPcIAAFK2ioJbaIaAM2R7bvgygBhi7ENrPcYAAhAcAgQAqAgRGeKUF +L/oAoeB48cA+DQ/6AN/PdoAA1Kw+lg8nDxAdlhC5JXgGIP6DQPTPcYAAMDEAgYC4AKHPcIAAuAbP +cYAA0CMAkFqJNwoBAM9wgAC6BgCQWIkrCgEAz3CAALwGAIg2iRsJAQALyAQggA/+//8DCxoYMAvI +h7gLGhgwz3CgALAfO4DPcIAAFK0A3aKgIKAM2ZbaHtsSDKAGGLsB2Klx6gxgAIDaPpYdlhC5JXjl +eB22MLj9BC/6HrbxwOHFNg1gACh1gODKIEEDBA0hA8ohYQDtBA/6NQfP//HAcgwP+s92gACEBwDd +C/AQ2Lh4CyEAgPgN4v/KIEIDAeXxDfSQIIaA4cogIQDIDCEDyiEBAKkED/rgePHAMgwP+qIPIAcA +3s9woADQGxGAFwjeAx4NIAgB2M9xgABwPB2BAeAdoQbIAxINNjUIHgCkFQAQLQieBM9xgAC0OQCB +EOjAoQEJnkXPcKAAxCzLgN/YIg+gAMlxUyaBFD8OnxcDEgE2oBEAAPC4AN268oogCAAMGhww+tj6 +DqAAoBEBAAMSAzakEwEAIQkeBrYTAQHPcKAAmAM+oNfwZOmYFQAQSggv/wDa3vEAFgJBXLMAFgBB +HbMAFgBAmHAPowAWAEFAGwQAABYAQBGjABYAQUgbBABEIgADNwgQARjechuEAwAWDkDTowAWDkFQ +G4QDABYOQVQbhAMTCBECSHaGJvMfjCYMkAvyGN4T8BDechuEA893gADAu6e3C/Ae3nIbhAMAFg9A +9qMAFg9BXBvEA0h3hif9HIwnApIK9ALm0H5yG4QDABYPQWAbxAME8GAbRAMJDl4QABYPQSh0hCQM +kAT0ANgg8JfoUSQAgNEhIoIT8vCLqLnPcIAATMikG0AABb/gYA0IngeLuaQbQAC6o7uj6PEAFgBA +GqMAFgBAG6MI2HQTDQG+Ew8Bon8CJ40TAn24E4AAmLkCfdhgEHhyGwQAsH26EwABcBtEA6QbQAAF +elyzz3CgAJgDHoC2GwQANfBFCB4FB8jwiQDaMxGNAAQggA8BAADwQSgOA89xoAA4LgeBDyKCAwHc +RngHoRXI2g6gCQAsABDHdYAATMgFvxDl/WXArQMSATaKIBAABhoYMPvYQg2gAKARAQADyKAQgADE +4EALgQkD2c9woAAUBCOgRQIP+vHA2gkP+s91gACYoQGFz3KAAEzLRCAEg89wgACMvAyI1WjHdoAA +TMhghhZ64YIT8lAjgQUgpoYnAR7hogsMEQGRuSCmBPCxu7a7YKYqCYAJBvCWu2CmhScBHuGiC42i +uOEBL/oLreB44cXhxs9wgACMvAyIjCACgM9ygACYoRbyyorPcYAATMu1aMd1gABMyBZ5AIVhgQbu +lbgApau7BfC1uACli7thoQDYC6rBxuB/wcXgeKHB8cDhxVEgAIIIdagAIQBCwCLDz3CAAKhjBCWC +HwYAAAAxumtgBCWAH8AAAAA2uHpiz3OAAABuCGNKY0EtgxJSIwMAwLsDuxpiGOOF4sojjQ8BAIkN +1SOOAHBxUgAlAADY7b0YACEAAiHAAM9xHEfHcQUofgAKIMAOA/AiuEEtQRPAuQS5NHmpcsa6SSLC +BVR5z3KAAORlMmIPDd4SQSoBARQhggAFKj4AQSkAcgjc7wAP+gohwA/rcjvYjLgJ2wm7SiQAAAkA +b/sKJQAB4HjxwFYID/rPcIAAjLwMiIwgAoAq8jVox3GAAEzIwIHPcoAATMvPd4AAmKHklxZ6YYJQ +Jo0Vhie7H6ChjCdEkIYjAQ5hogT0kb2goQzwsb62vsChEQ9REJa+wKGFIwEOYaKSD0AJANnPcIAA +mKFRAC/6K6jgeOB+4HjgfuB44H7geOB/ANjgfuB44H7gePHAVg4P+uB44HjgeOB4aSCAAW8hPwBp +IAAA9/HPc4AAMDFAg0V4AKMZ6c9xgADQI89wgAC4BgCQWok5CgEAz3CAALoGAJBYiSkKAQDPcIAA +vAYAiDaJHQkBAAvIBCCAD/7//wMLGhgwC8iHuAsaGDDgfuB44H7gePHAz3OAAJgHaHCCDCAABNkE +a3oMIAAE2dHA4H7hxQDZSiTAdc9zgACwGM9ygAD4OagggAIWI0AAoYAAgAHhFSIAAKCg4H/BxQDY +z3GAAGwHAakJBGAJAKnxwOHFbgyv/TDYtGhmDK/9N9gFfRi9kb3PcIAAXGACCiAHkr0ouKV4z3GA +ACxZRQfv+QCh4cU1aM9ygABMyCFiz3KAANwgLbnAufAiQwAog1EhAIDPcYAAoLpBgQjyPIuA4cUi +gQ8AAAoCBPJFIkIDSiQAdADbqCDAAjZodXkAIY0PgADMy0ClAeMA3c9zgABMyhYjAgCgqqGqAdki +qgPZI6pKJABxqXGoIIABemEWeqSqAeHgf8HF4cVKJAB4ANioIAAIANvPdYAAAABAhQ8jAwALIsCA +D/JBhQsiwIBA2s8i4gfKIoEPAADQAM8i4QcC8ADaz3OAAAAXFXtAowHg4H/Bxc9wgADcWAWAA4Ag +gM9wgABMlCmgJQBv/BHY4HjxwNoN7/kB2c9wgACEKzmgiiDFD891oADIHxkdGJAocChyKHNCDOAA +mHHqCC/8AN7Pd6AA0A/Vp892oADAL3oWAJaJuIu4eh4YkMYIwAGODc/+Xg2ABkDZz3CfALj/MqCa +C8AIgNnPcKAAFAQsoB0fWJCOCcAHWgiABzYPoAcA2LoJgAMH2EgdGJCKCMAF4gqAAc91gABYMSCF +YHkA2BMI0AIghWB5ANiH4EwPQgGiDwAABglAAwoOgAYVhlIgAADAuCCFG35geQDYEQjQAiCFYHkA +2AkI0QEeD0ABzgvAAvoNwAauCEAAWg8ABl4Mz/vmDcAAmg1AB74JD/+6CEAEGgsAARIPgAUOC8AE +DgmAA9ILj/4uCwAEmg6ABpYOgAbOCu/7AW4dBc/54HjxwKoMz/nPd4AA3CADhwiAwLgeD+AHLyAA +IADdz3agALRHz3CgAIxEuKAA2JO4dx4YkAjYdx4YkADYnrhTHhiQ4HjPcIAAyAAQeFMeWJNHHhiQ +z3CAAGQDEHhIHhiQTyCAI0UgAA1PIMYHNNhEHhiQHNhFHhiQz3CAAECUAYhGHhiQz3CAAHDGzgqg +BBCISiSAcM9xgABs0KggQAPPcIAAoLpBgHRtdHs7YwKAQ6MB5QSjz3WAAPRYAIUE6GQeGJBDHpiR +7gzgBwHYA4cIgECFHQgeAFMiQQASuUQiAAMOuCV4hiL/Awq6RXgS8EhwhiDzDwq4BCKBDwAAAAwG +uSV4BCKBDwAAADACuSV4z3GAAHQx/QPv+QKh8cDhxRDdzg9gAalwB9kLuc9yoADwFzGiz3EAAPD/ +OKKyot4OQAHpA8/54HjxwGoL7/kA2s9wgABsBkOg/9vPcIAAYLARGNiASiSAcEhxqCAAB4QpCAgA +IY5/gABgqs93gACYWEGmBt2lps91AQAUsaSm5qYgHoIQACGNf4AAfKpApQHhz3CAAGCwGhjYgM9x +gACQMACBHNpAoBjYDgggAAKhXQPP+eB4OdnPcKUACAw+oOB+/9nPcIAAPKggqADZz3CAAOSn4H81 +oOB4ANqA4cokTXDoIK0B/9lcYCCsAeLgfuB48cDhxc91gAAEus9wgAA8bqlxDg+gBkjaz3CAAORn +z3GAAHQH+g6gBgjaANnPcIAADDgpoM9wgABQByCgz3CgACwgEIDlAu/5EqXgePHAANnPcoAA1Kwg +os9wgAAwMSCgPbIwuT6y0cDgfuB4z3CAAJRuz3GAAJg4WQegBhTa4HjxwDIK7/kg2QDaz3WgAMgc +KaXPcaAAlBNboc9zgACAF2CD82jPdoAAALwMhvV/UyDEBfBj+2NTII8ApMGLcTsP0RAfhpu4H6Y0 +FoAQ4osbCMEDKHBAIwEERGs+CKAHQCYDHA3aKvAehpG4krgeps9woADMFyvwIQ9REUEqAlJAIwAE +wbpSCq/9iHMfhpy4H6YN2hTwLLhTIAIAH4YDupm4H6bkgwXiBScAEQChBYMBoQaDAqEHgwOhA+LP +cKAAzBfPcaAAlBNcoQHaiOofhpe4H6Yg2AqlGfAAwQPaGBhYgAHBGRhYgALBGhhYgAPBGxhYgBQY +mICKFgEREBhYgATZJ6UWGJiAlQHv+aTA8cAmCc/5pBABAKLB2wlfBiDZz3OgAMgcKaOkEAEAXQne +ATGIz3WgABAUI7nAuQO5BeED2k+lRoVBwo3hEN7KJuIRBhQPMYwnw58J9AQUDzHxdswn6pAB3kL2 +AN7r7sWARX7HpbGIhiX8Hxi9pXrPdaAAzBdaoBbwRYDPcaAAEBRHoaQQAQAVCZ4CMYjXuoYh/A8Y +uUV5OqDPdaAAzBcN2QHaA+ENHZiQDh1YkCaAGR1YkCeAGh1YkCiAGx1YkAPZFB1YkHAQAQEQHViQ +cBABAc91oAD0BwThJ6VHo6QQAQCZuaQYQACpAO/5osDxwDoI7/kE2Qh1FRIONgbYFRoYMM93oAAU +BAqnz3CAADBuig2ABgCFgg2gBgTZAYV6DaAGONkihQXpAYUAkB0IRQAKIcAP63IZ2Iy4attKJEAA +kQfv+rhzUg2gBgOFAYVChSCQBYVGDaAGQnnKpzUA7/kVGpgz4HjgfuB44H8A2PHAANicuM9xoACs +LxyhGoFRIICCGoEL8qq4GqEagecIHoCaDy/9AdgJ8Iq4GqEagdMIH4CWDy/9AdgA2Zu5z3CgANAb +MaAKCEAJpg0ACc9wgABsOQCAQiAAgMogYgDRwOB+4HjxwOHFz3GAANSsfpFdkRC7ZXoB3RkKDwDP +cYAAuFYDuBR4fglgBzhgqXAD8ADYoQeP+eB4RoEJ6iOBYIEigmJ5MHAA2AL2AdjgfuB48cDPcYAA +mFjiD+//mHAJ6M9xgAC4WNYP7/+IcIPoANgJ8M9xgAB4WMIP7/+IcHnoAdjRwOB+4HjPcIAAyAUO +gIDgAdjgf8B48cAuCAAABugqCAAADwhRAM9wgAAELACAg+gA2ALwAdjRwOB+wQagAA/Y4HjgfwDY +4H8A2OB/ANjgfwDY4H8A2OB/AdjgfwHYz3CAAKgYAIgG6M9wgACUGAGIA/AB2OB+8cBmDo/5z3WA +AJg4CIVpCNAAC4VhCNAACYXPcaAALCAZCB4BDIUVCFEAMIF6CWAAiiBKCAHYIfDQgQqFAiYBEAXY +DLgxCEUAiiDKB1oJYADJcRDYCaUNhQImARAZDkVwAAAAUIogygc+CWAAyXEB2AylA/AA2F0Gj/ng +eA0JXkcJyL24CRoYMADZnbnPcKAA0BsxoOB+4HjxwM4Nj/nPdaAAyB8kFQ6WFQ4eEoUVAJbmCM/7 +iiAEACQdGJATDp4QiiDXCuIIYADJcUYKQAkFBo/54HjxwI4Nr/k02F4JgADPd4AAgIovCB4E2g9g +AgDYrg9gAgHYiiYQEADd8g3v/qlwFCdME2G+ALT1DnWQAeUO8ADbiiIQACoPoANweBQnzBBhugC0 +9Qp1gAHjnQWP+fHAMg2v+TTYocEA3f4IoABAxc93gACAcjMIHgQqCOAAAdgD3gq+ANiMuLhgEHiL +cYIJ4AAB2hQnTBNhvgC06w51kAHl8g+AABDwBdsKuwPaCrp4Zb4OoAMQeBQnTBNhugC08wp1gAHl +MQWv+aHA4HjPcAEAwB3PcYAAaBlhGRgAz3AAAGRNVSFCB0AhAwMG6B2jG4GDuBuhz3AAAEBNBugC +ohuBgrgboc9wAAAcTQboAKIbgYC4G6HgfuB48cDhxW/YlbjPdaAAyB8SHRiQz3ABAEA8FR0YkEoI +wAeKIAQADqXJBI/54HjhxQDbz3KAANyhSiQAdM91gABUomhwqCAAAkAlARIUeWCxAeBIcM9xoAAE +JQ+hViIABBGhViIABRCh4H/BxeB48cAKDI/5z3WAANwgBYXPdqAAxCd1HhiQDJV2HhiQB4V5HhiQ +EJV6HhiQZg3v/wDfG+h3HtiTeB7Yk4Ae2JOBHtiTB4WGHhiQEJWHHhiQB4WKHhiQEJWLHhiQBYWI +HhiQDJWJHhiQBYWEHhiQDJWFHhiQwdhQHhiQ+QOP+eHFCHHDuM9ygABcovQiAwDJu3BxyiQidMog +IgDoICIC9CINAMm9CQlAAwHg4H/BxfHA4cUIdc9xoADEJxkRAIYB2oDgEREAhsB6gOIApdEg4YcA +2DP0z3CAAHy8DIDPcaAAyB9k4B6hENgOoQHYFRkYgHYMIAkL2FEhAMbKICIAGPQlCF5Hz3GgANQL +FoE4gSTgFQhFAFIMIAkD2AkLH0AJCJ5EGNgD8ADYgODKIOIEz3GgAJAjPoEgpU0Dj/ngePHAzgqP ++c9xgADcIBUhAwDAg0mGuI5BKsAAwLgXuMdwAACAHOS6zyAiBuC6Tt/PIKIAyieCHwAATgGG5c8n +YRIpCl8Bz3WAAHwmGBUEEb6RGw0BEaGBuhUNFhENXxEggboRAQYHCV4BgbjPcYAAcCY0iYfhzCFi +gswhIoIC9IO4USIAgs8gogUcpv2mIIPPcDoESnDPdoAAWDEeoSCGoINgeQDYVQiQAyCGYHkA2E0I +kAIH2PINYAAKuAQggA8HAAAAMLhVCBUCMyYAcIAAMGBAJwFyFHkAeYogBAAfpRnwiiAQAB+lFfAA +2Iu4H6UR8ADYjLgfpQ3wANiNuB+lCfAD2Ay4H6UF8ADYjrgfpYIgAQElAq/5H6UKIcAP63KM2I24 +z3MAAE8JSiQAAEkB7/oKJQABIYAA2lMhfoAL8gDambpRIUCAyiKCDwAAgwDAKmIGz3GgAOxGRaFm +kEgjAwNHkBC7BCODDw8AAADIukV7SJAMugQigg8AAADwZXpGoWKAz3KfALj/faJFgEmhRoBKoUeA +UaFIgEuhSYBMoUqAUqFLgE2hTIBOoU2AU6FOgE+hT4BQoRCAFKHPcAAAVVXgfuB48cAOCY/5IYDP +dYAAAAACgCClAN4BpcKlz3DQ/gAArgqv/wSlz3KfALj/3aJvIUMAz3CgAOxGJaDqCo/+IIUL6c9w +oADIOx2ABejPcAAAVVUG8N2ie+nPcAAArd4dAY/5IpBIIUEBQCkCAyOQYoDLuY+5RXnPcp8AuP99 +os9yoADsRieiI4A1oiSANqIFgBeiz3AAAFVV4H7xwG4Ir/kA26bBz3GAAAAAYKFhoWKhz3agALRH +LBYBkAokgA8AAFVVSiQAeGhxqCBAAs9ygAAAFzV6YKIB4QDZmLmVHliQSiSAcc9ygAAAAAgSBQAL +EJAAAN05ddh1qXKpcxl1qCABBL9g5I8AIEoDDQ/QHxUkQTNgoQHjSicAAA8nRwMLIMChCfIVJEEz +IIFKIwAQDyNLEAPwSiMAECqICyHAgQUhyRIJ8hUkQTMggUonAAAPJ0cAA/BKJwAABSLCAZDvFSRB +MyCBDBAFAD/fCiSADwAArd4PIEgQBBrCExEPURIVJEEzIIEA2g8iQgATDxESFSRBMyCBSiYAAA8m +RgAB5c91gAAAAAgdQBGA48okgQ8AAK3eNfIliGSIBiKCAcW6ELkFI4MPAAAAP2V5BSGBDwA/AACb +HliQZ4gmiAi7ZXloiBC7ZXlpiBi7ZXmcHliQBiEBEsW5mR5YkADZlR6YkJm5TB5AkCSAWB5AkAqQ +lB4YkG8gQwCTHhiQDgmP/ohwTQdv+abA4HjhxeHGz3KgAMBGz3OgAOBGSiQAcgDdqCAAAxYgTgMh +hgHlBBpQACKGBBtQADGAz3KgALRHmBpYgDKAsxpYgBOAtBoYgM9wAABVVcHG4H/BxeHF4cYkiM9y +gAAgb6aIwrkuYgDZDyGBA89zgAC8pkCDhO0mekCjGPBFeSCjJYgVI40DI6UmiEWIWWEmpSCAjCEQ +gEX3iiEQACCgI7khowCAKrgCowDZz3CgAPA2LKAjgyWgJoMmoCSDJ6AngyigJYMpoCiDKqAhgyug +IoMtoCCDJKDBxuB/wcXxwOYNT/kId5pxunLacwoiACEKI0AhCiGAIc9wAADIG8YJYAAKIMAh+nDP +cAAAzBu2CUAAG3DPcAAABByqCUAAz3agAMgfO3AB2BOmBtjPdYAAbD0ApeGlDsAgHQAUCaUVhhwd +QBQKpRiGGB3AFAulGYYUHYAUDKWgFgAQEB2AFQ2lpBYAEAwdQBUOpagWABAIHQAVD6XPcAEAqBEQ +pUoJYAAo2BGlQglgAADYEqVTJ8B1E6UByFQdABcWpRIWAJZQHQAXF6UTFgCWz3GgAMgcGKUUFgCW +UyECMxmlFRYAlhC6GqUkFgCWG6UWFgCWHKXPcIAAcDwMgB2lz3CAAGw9eBiACs9wgABsPXwYwArP +cIAA6D0EGAALz3CAAGw9hBhACyiBiBhAAM9xgAAsWSCBjBhAAC8hxwUIuSV6LyEHBkV5kBhAACYJ +YAAl2dkET/nxwL4MT/nPc4AAAD5DgwDfz3WgACwgsIXSatR+fmalpgSmAeKMIgiAJqZDo4X3AoPj +owHgAqPxBE/54HgA2M9xoADIHxihGaEB2A6h4H7gePHAcgxv+YogTA2qD+//iiFYAgvIAN4EIIAP +////AwsaGDCGDSAAyXDPdYAAbAYRhYDglAwiAMogYgClBG/50KXxwOHFggkgAAh1jCD/jwj0iiAH +Cl4P7/+pcQDYiQRP+fHAEgxv+WrYosGLcQHa2g5gAEhzj+gKIcAP63LPcAAA0hSKI4UBiiSBCo0D +r/pKJQAAQCSBMUTYAdquDmAASHOP6AohwA/rcs9wAADTFIojhQKKJAEBYQOv+kolAACWC+/5BhQA +MZEIEACBwWvYAdp2DmAASHOQ6AohwA/rcs9wAADUFIojRQSKJMEKKQOv+kolAAAEFAAxQCSBMAHa +Sg5gAEhzj+gEFAUxCiHAD+tyz3AAANQUiiMFBf0Cr/qKJMEKAhQAMc92gABwXRt4QSjFAEwlgIwA +HkAR1PYKIcAP63LPcAAA1RSKI0UGyQKv+ookwQod2M92gABwXQCmuHAAFAAxz3WAACjWQC2CAKlx +1g1gAAHbkOgAFAQxABYFEAohwA/rcs9wAADWFIkCr/qKI8UIQIYnCnIAANgWJQEQYImGI/8NI7sN +C1EAYYkE62K7YakB4OkIgoAA2CEDb/miwOB48cCaCk/5p8E6cHpxGnJac4twz3GAAGhgtgxv+Rra +z3GAAHBdIIEA2IDhuHG6AC4AiiX/H89xgACMGAARhACKJv8fyXUC8Ol2TCGAowHaz3GAACjWFnlg +icIijABEI48A/X93CsED4YlEIwIEJLpEIwYCQS7GAEQjAQEiuVsIgSEdDFEAgOHMIiGAB/KB4cwi +YYAA2gL0AdpPegXwgOIB2sB6NwpRAEwiAKYB2sIiigCGI/0PJ7sPCYAAgOLMIGGgC/Qyd8wjIYAJ +8gPvBesLCcIjDw7CE8l3BPAB2QjwCHUB4GcIRIEA2Yog/w+E6YDlyiBKA4wg/4/KIIEP/////xXy +MiSCNM9xgAAo1g8KUQBicRZ5AhHAAAnwFnkLCpEABhHAAAPwBxHAAMkBb/mnwPHA+gzP/3XYtgzv +/4ohywE2Ck//jgtP/+4MwAWWCU//CiHAD+tyPdiKI0sGSiQAAPEAr/oKJQAB8cDPcIAA3CACgLgQ +AAZRIECA5AiCBdHA4H7gePHAHglP+RpwKHU6cs9wgABEraYPr/pE2c9yoADUC36CACWBHwAAACDP +cIAACAdieWGgzLnPcIAAfLwvogyAz3KgAMgfZOAeohDYDqIB2BUaGIBNcIYg/APQ4Mwggo8AAIAA +EvKMIAOEE/IKIcAP63IKJIAKz3AAADIRiiPaA1EAr/q4cwpwQglv+ypyBPB+CO/6CnAT6M9ygAAA +vD+CnOCzuT+iANrPcYAAmKFLqc9xgADMnkyxyiCBAMUAT/ngePHAaghP+c9woADEJ1IQAYZBEACG +hiDjjwDdBvLrudEhooFM8s9wgADcIAOACYDPdoAARK0tCF4BCgiAA4noFI6B4MogIQF0CGH/yiFh +AM9wgAAArgCADQieABoJYAAQlrSuz3CAAACuoKBNcIYg/AOMIAKAHvTPcYAArBgAgQHgAKHPcIAA +3CADgBiIhOD8DwH/iiBHDRYL7/+KIQsAWgiAA+4IT/v2Dy//LyCICgbwjCADhMwIwfodAE/5gODx +wA7YCvKyDwAAeghgAYogBADRwOB+fg8AAD4IYAGKIAQAUggABw0IkQBuCCAHANjy8fDx4HjxwOHF +z3WAAGwGEIWg6DIIAAeC4EwIIQfKICEAAdgQpT4PIAAP2HIPIAAO2BGlCeguDyAADtjuDyABiiAE +AM9xAADA1AHYbg9v/4DanQcP+fHAIg8P+QDeAt3Pd4AAVKpAJwAahC4IGDAgQA5RIACADAgi/8og +ggNhvekNdZAB5koP7/8A2FUHD/ngeAHaz3GAAAgsQ6kYoShwZNl12h7bMQagBRi74HjxwM9xgABs +BgOh0g4gAA/Ylg8gAYogCADRwOB+8cCyDi/5Adqhwc9xgAAELEChWwhRAM91gABErBiFjCDDjwry +ANqEKAgIACGBf4AAgKpAqc92gABsBgyGBuiOD+//C4YA2Aym/9gYpXYJoAaLcA3ovgmAAwDBz3CA +AAAsIKA2DqAGANgR8DIOIAAP2KIJgAPqDiABiiAIAP4OwAaC4BwP4QbKICEAlQYv+aHA8cDPcAAA +IE6OD0AIz3GAAIgsAKHPcQAAuAvPcIAA9CsgoM9wAACIE24PQAjPcYAA+CsAoc9wDwBAQl4PQAjP +cYAA/CsAoQXYTg9gCAu4z3GAAIwwAKHRwOB+4HjhxeHGQS0AVMG4FwgVATMmAHCAABxgQCeBchR5 +AHkA2Bfwz3GAAAC8mBGAAEAoAgaGIP0PUiDAAUW4RXjPcqAAiCQQoh+Bs7gfoUrwAdgQ289xoADI +HGmhz3OAAAC8mBONAADaz3aAAMRrxoZALQEWhiX9H1IlzRHFeUW9pXnPdaAAiCQwpT+DAt1EKD4N +ACGAf4AACMaVuT+jz3GgAPAXvaGkgIoTAwGmoaOAFOOmoaKAUyPDgKahoYCmocAgIQjAICIMYIBz +oWxoYINzofgQA4JzofwQAIAToUqhwcbgf8HF4HjxwN4MD/mhwQh3z3DUuv7KQMAP8CDdz3agAMgf +sKYB2EMeGBAA2BIOoAiNuLGmz3GfALj/+qEE2Buhi3AeoQDanbrPcKAA0BtRoM9wAG0AEBmhAwle +R4ogmwXKD6//6XGKIJsFvg+v/wDBAMCpCICP1Lr+ytEEL/mhwOB4ANvPcp8AuP8aonuiPqLPcABs +BAAZouB+8cBODC/5mHAodhoIIABIdQYggQOIcE4IIACleZ0ED/nPcYAAqDBgic9ynwC4/wbrz3HQ +uv7KPqIaog7rz3CgADguBYAEIIAPwAAAAPEIgI/AAAAAatgYuBmiHILgfuB44cXPcoAAqDCgis9y +nwC4/wXtz3PQuv7KfqIaojuiDu3PcKAAOC4FgAQggA/AAAAA8QiAj8AAAABp2Bi4GaLgf8HF4Hjg +fuB48cCiCy/5iiAKBut12g6v/4ohBAqKIAoGzg6v/6lxz3eAAJQHAIc3CF8Az3WAAMgfAIVSIIAA +AKUI8M9woACoIA2A5OBEAQUAMg/v/1TYABUEEIYg/w7nCAGBiiAKBooOr/+KIcQNz3WAANgoxBUA +Fn0IngDaCw//z3aAANwgvxYAFqW4vx4YEB+FpbgfpW4VAJaluG4dGJAOhoolFRWluA6mAIYk4KBg +hiB/jsogIgDKIQIA3Aqi+coiogEBhiTgoGCGIH+OyiBiAMohIgDECqL5yiKiAQCGz3GAAAS6uhAA +BiW4wLgCDO/8CqGKIAoG9g2v/4ohhQMA2p66ANnPcKAA/ERBoOB4IaDPcKAAtA88oAvIBCCAD/7/ +/wMLGhgwC8iHuAsaGDB/2Aq4z3GgANAbE6F/2BChANiVuBChz3EAAJwhGgogAAbYz3GgAPA2BIFG +IMABBKGU2GIO7/8Y2YogCgaCDa//IIcAh1EgQIA8CCIByiAiAIogCgZqDa//iiFFCoUCD/kKIcAP +63Lb2AS4iiPEDLUBb/pKJQAA4HjxwAYKL/mKIEoGPg2v/4ohxQyeDSAHAdjPcKUACAwA3s91gACE +K8KgGYVRIICAkAhC+s9xAADcCYYJIAAG2AvIBSCADwEAAPwLGhgwGYUNCJ4A6grABA7wANmeuc9w +oAD8RCGg4HjBoM9woAC0D9ygcgvP/CYIAAEKC2AGAdhyCSAAAdjtAQ/54H7gePHAdgkP+Yh1AN8K +6BkIUQAB3s9wgACPGMCoBvDPcIAAjxjgqAnpGwlRAAHZz3CAAI0YIKgF8M9wgACNGOCoCuoZClEA +AdnPcIAAjhggqAbwz3CAAI4Y4KjPdqAAyB/PcIAAjxgYHtiTAIiKIRAAEejPcIAAGSAAiAvoz3AD +AEANRR4YEDCmAtgYHhiQAvAxps9wgACNGACIG+jPcIAAGiAAiBfoz3ABAPj9IB4YkM9wgAAUACEe +GJDPcIAAxAUiHhiQGBYAlkUgAAMYHhiQz3CAAI4YAIgI6BgWAJaFIAEEGB4YkA8LUQAYFgCWiLgY +HhiQGBYAloC4GB4YkBjtANiUuM91gAC0CAClcdgGuIIM7//82SCFz3AAAEwccgzv/5+5GBYAloW4 +GB4YkLEAD/nxwATpHQgSCAohwA/rcs9wAADaDtrbSiRAANUHL/q4c89ygACwMBV6IKLRwOB+4HgA +2Z65GXnPcoAAdDoBgiZ44H8Bos9wgAB0OgGA4H8vKAEA4HgA2Z65GXnPcoAAdDoBgiV44H8Bos9y +gAB0OiGCQoIkegDZnrkZeQQhgABCIACA4H/KIGIAAuEweUFpDQoDACJ4EHgD8ALYz3GgAMgfHqEQ +2A6hAdgVGRiA4H7gePHA4cVQ3QDaz3OgAMgfr6NeowIgQgBeowHaFRuYgEDaTqMEIL7PAAIAELAP +wf/hB8/44HgA2c9wgAAAriGgz3CAAAC8HJBiuEggQAAQec9yoADIHx+CEHgIIQEAMHkC2BUaGIA/ +ouB+AuEweUFpDQoDACJ4EHgD8ALYz3GgAMgfH6GKIBgIDqEC2BUZGIDgfgDZz3CAAACuIKAhoOB/ +IqDhxeHGz3GAAEzQRYEk6M9xoADIH0ARDgbPc4AAALxAKI0CQhMAAXyT0H7YYLtjYrsIIwMAAnsJ +IsIAAtgVGRiAz3CAANwgX6EDgCKAz3CAAACuIqDBxuB/wcXgeOHE/BzIvvwcSL7hwOHB4cLhw/wc +CLH8HEix/ByIsfwcyLH8HAiy/BxIsvwciLL8HMiy4cXhxuHH/BwItPwcSLT8HAi/aiSAEOHEaiTA +EOHE8cDPdaAA0BtcFRAQe9iCCa//9tnPcJ8AuP8dgOt2y3DPcAAARBz+Ce//CifAHzpwF4UH2O4J +7/8KuFMgQQcH2CIK7/8KuM9woADUCxiAQiAACEggAADPc4AAgDrPcYAAtAgggbEbGAALIUCEyiAi +Ay30IQiRIBkJniWK6FEhQKVk2MoggQ8AAFwAIfA02B/wjCAEoBjyTCAAohLyB/YdCFAgKQgRIYbY +EfAZCBAkjCABoAz0TNgL8GbYCfA82AfwRtgF8FTYA/CE2IgTAwbpcclyCiQABB0FL/oKJUAE4Hjg +fuB44H8B2M9ygABsBiKCJYkS6c9xgABErHiBz3GAAHyqhCsICDAhQQ4NCV8ACNgLogHYCaIA2ASi +BdgDouB+8cDhxQh1KHAF689xgACAigTwz3GAAIByW3o2D+/4tHmBBe/4AdjgeOB+4HjPcQEAxwPP +cKAA7CcmoOB+8cDqDM/4GnC+CO//JNiYcFEgAIDKIcEPyiLBB8oggQ8AAFEmyiOBDwAAFgFoBCH6 +yiUBBM92oADALxOGkwgRIA8IngbPcIAAPDEAgEB49NgA2VYI7/8B2jTYANmRuUoI7/8A2jDYiiEG +AD4I7/8A2jTYANkD2jII7/8UukoI7/8w2MK4CQhRAADYCPAE3T/Yog9v/6lxqXDPcgEAxgPPcaAA +7CdGoc9zoAC0DzyDvQkQAAESBDZwEwUACiHAD+tyz3AAAFIm0QMv+oojRQCauBOmIN/PdaAAyB/w +pYogDwpDHRgQANhiDWAIjbjPcIAAPDHxpQCAQHjwpQHYQx0YEADYRg1gCI248aUThh8Ingb8FgUQ +CiHAD+tyiiCMCYojhwV1Ay/6iiQEDhCGHwgfAPwWBRAKIcAP63KKIMwJiiPHBVUDL/qKJAQORNhJ +HRiQ8KUB2EMdGBAA2O4MYAiNuPGlGg5AAZLx5QPP+PHAfgvP+KLBKHYKJICAAN/PdaAALCBAFRAQ +ABzEMxPygwxQAEwkgICO8gohwA/rcs9wAABUJoojhADxAi/6CiUABDJoBCGBDwAA/P9OD6//LNgQ +hQIgAASMIA+KCPf+Dq//LNgId+8IHoAI8CCGgLkgplYOb/8/2OIOr/802B8IXgUghoG5IKY+Dm// +P9g02ADZANqmDq//lbowvwIcxDOF8A95ELkFIYIPAACC/c9xoADsJ0ahBCCADwAAAB9IuIa4ELgF +IIAPAABC/QahEIUCIAAEjCAPigv3i3GuCu/5iiAPDQAUADHnCB6AB/AghoC5IKbSDW//P9iBwY4K +7/mKIE8MBBQAMREIngAghoG5IKa2DW//P9iLdYogjw9uCu/5qXEgwAi4AhwEMIogzw9aCu/5qXEg +wQIUADEleAIcBDA18M9xAwBC/s93oADsJyanz3EEAAL+JqeGuBB4ELgFIIAPAABC/QanEIUCIAAE +jCAPigv3i3ESCu/5iiBPDwAUADHnCB6BB/AghoC5IKY2DW//P9jPcAYAAv8Gp0AkgTDqCe/5iiDP +DkDYGg1v/wIUATECFAAxKQLv+KLA4HjgfuB44H7gePHA4cUIdYogFA32DG//qXEA2M9xpwCISYHl +yiDhAA6hEQLP+PHA4cUA3aCjgeDMISGAF/ILChMIoKMA2AnwwOIG2Ab2QiIACEO4AuAAo1B5ELkQ +fYoglA2mDG//pXnVAc/44Hi4cFYhAALxwA0IcgCYcYwgAoCM9gohwA/rcs9wAADJFN0AL/qKI4cK +z3CAABhi9CAAAc9xgAAYYwQofgEvcPUhAQFCKAMEwbtSuAQpfgEvcUIpAgTBulK5gePAIGkAgeLA +IWkAiCA+AIkgwQ+IIT4AiSHBD4Dg1iArCIDh1iErCKoJAADRwOB+8cC+CM/4ocE6cQDfgODKIcEP +yiLBB8oggQ8AAMoUyiOBDwAAfgLKJMEATAAh+solwQPPcYAAiDFAsc9xgACKMeCxTCEAoMolzhNk +AC4AyibOExp3WncF8Ml3GnVqcEAgUwCLcQHaQgvv/wDbABQNMS8jyCSpdim9yL6/5dklKRRMIgCg +yiDCA8ohggPKIgIE6A0iAMojQgPJcOIO7/+pcUIhUSC1CXWgQCJSIMlwWgkgAKlxYQDv+KHA4Hjx +wAIIz/gKIwCgGnEa8s9xgAA0B6WJBIkdZXJ1yiHMD8oizAfKIIwPAADLFMojjA8AAOECyiTMBIAH +7PnKJUwDAN0A3ijwANnPcIAAhDEgqEpwitnyDu//KnLPcIAAhDEAiFMlwRAYucO4HLgFec94ELgF +eYogVA3eCm//5XkvIYgEELmKIFQNzgpv/wUhQQQB5s9+ACCBL4AANAcmiQFpNw4DEEArgiBUerV6 +1HrPc4AAmLBXYxJtbO9AJ5IQLyKIJNR4z3KAAIywNCIRAHsJEYAB2brxAeWvfWsN0pB9B4/44Hjx +wC4Pj/jPc4AAijFAk1MiTYAg8kcNkRDPdYAANAcJrSitIoXPdoAAiDEAlindEr3Pd4AAhDEVJQwQ +IKTgjwfvViAPCPB/9X0gpQHgALYH8M91gAA0BwutKq0B4jkHr/hAs+B48cDGDo/4CHYacc91gACK +MeCVC/DMfwII7/hAKUBxRbhWDe//CnEglYwhEIC09v0Gj/jgePHAhg6P+KHBCiNAoAh2GnIa8s9x +gAA0B6WJBIkdZXJ1yiHMD8oizAfKIIwPAADMFMojjA8AACwDyiTMBAAG7PnKJUwDAN8A3R/wARSA +MAEeEhAGEYEgARSAMITpAR4SECDAAxSCMAEUgTAYuBS6BXoCFIAwELgFeooglA1eCW//RXkB5a99 +z3GAADQHACEABAaIAeB5DSMQACERBEArgCAUePV4tHjPcYAAmLA0IRIAUyfBEBi5r3gQuAV5iiCU +DRoJb/8FIYEEANkzChAgi3FKcALamgjv/wDbcwgRgAohwA/rcs9wAADNFIojTQAKJIAETQXv+Uol +gAABHlIQBhGAIIMIEYABHlIQvfEB5+9/Nw/SkMkFr/ihwOB48cAVCHIAuHANDdMDANgAqQCqE/AP +DZIIjCUBgMogbAD39owlAYmL9owlAoMH9gLYAKkB2ACq0cDgfowlQoSG9owlQokD2Pb2CiHAD+ty +z3AAAMgUiiMGBckE7/mYc+B48cAODY/4o8FKIQAgi3EqcEogACEKct4Pr/8qc43oCiHAD+tyU9gG +uPvbCiRABJUE7/kKJQAEABSFMM9xgAA0BwAZQgFMJQCAyiHLD8oiywfKIIsPAADBFMojiw8AAAMB +YATr+cokywAAwEEoAgJBKA4DUyLEAFMmxRACGQIBAxlCAUwkwIDMJeyAyiLJB8ogiQ8AAMIUyiOJ +DwAACQEkBOn5yiHJD0EoAgRTIsYABBmCAUEoAgVTIsUABRlCAUwmQIDMJeyAyiHJD8oiyQfKIIkP +AADDFMojiQ8AAA8B5APp+cokiQFBKAIGUyLEAAYZAgFBKAUHBxlCAUwkQIDMJWyAyiLJB8ogiQ8A +AMQUyiOJDwAAFQGsA+n5yiHJDwQUhTCMJQGEtAAsAAEZQgEKIcAP63LPcAAAxRSKI4QGhQPv+Zhz +z3WAAJiwAN8D8AHn739BKAECw7ltD0MQAN4T8EApgSA0eQoUgDAVIUEBAebPfhR5uWEAGQQEgCAC +Iy8gCCQAwEEoAQbDuQHhww5DkILBCnAC2l4Or/8A2wsUhDAvKAEBTiCFBy8lRwG1DdKACiHAD+ty +z3AAAMYUBQPv+YojhA5AIVEgLyFHJEEoAQTDuXsJQqAE8G0OU4BBKAEFw7kKdakJcgBKIAAgSiIA +IAXwQCJSIC8ihyRBKAEDw7l7CkMgSiEAIBTwAr7UfgoUgDAVJk4RQCFRIC8hRyQUfgAmgB+AAJiw +oLCAJQITsH0AwEEoAQcB4bsJQ6AwuMO4ACAOBILBqXAC2qoNr/8A2wsUhDAvKAEBTiCFBy8lRwGr +DfKAz34KIcAP63LPcAAAxxRRAu/5iiPFBEAgUCAvIAckQSgBBcO5ZQhCoNPZCLkA2APez3OAAIyw +ANqyaFR9fWUgtQHiT3pWIQEI8QqygDB5Yb4B4OcOdZAPeK0Cr/ijwOB48cA2Co/4osFAwEHCQCgU +BUApFwUA3UAqEwVAKxIFAd5KJYAhqXcE8Ap1yncAwBW4E3gUIMAFbguv+AfZAiBQAwIgQCNeC6/4 +DtnMfgohQC4EKT5wL3CsfgAhDXUdZQHAFbgTeBQggAQ6C6/4B9kCINYDAibAIy4Lr/gO2QQofgQv +cex+ACHAdBlhQi0AFXYI7/9UuUIlVSAB5pENdaDPft0Br/iiwOB48cCSCY/4OnC6cc9wgAAAvACQ +SiRAIADZSiBAIIYg/ACMIAKAwiQCJUoigCDPcIAAmKErqM92oADQDyUWD5YlFg2WQiGAIBAWFpYr +CEQDAiBRAwwhgKTKIi4gdgzv+OlwmHAA2CkMECAVD1ARDQ/QEgfwSiMAIC7wAdgD8ALYz3GAAJQY +JIELIQCABPIA2gPwAdoAIkAjHg/v+cpxCiMAoBjyJwwQAs9wgADUHxYgAAFAgAaIKw8BEBPqqXBg +eqpxCiAAoAbywnUQHliTaQoRoEwjAKDMICKgEfIA2BDwCiHAD+tyz3AAADERiiNXBUokAABlAO/5 +CiUAARPY4QCP+PHA4cXPcIAAWDMIEAQATCQAgMohwQ/KIsEHyiCBDwAAaRnKI4EPAACoASwA4fnK +JQEBz3KlAAgMCBIFAADZTCUAgMwlIoTKIcIPyiLCB8oggg8AAH0ZyiOCDwAArwH4B6L5yiQiAEDY +AqLPcIAA6LlggArw9CBNAM9wpgAAgDV4AeGgoNLhhCsCCgAkQA6096QQAwHPcaQAoD99oaYQAAEe +oQgaQAGBAI/44HjxwAYIj/jPdoAAWDEghgh1YHkE2IXoIIZgeQPYCejPcawAkAGA5QPYyiChAAWh +RQCP+OB48cDKD2/4UNjPdqwA1AEA3a0eWJOoHliT6B4AkM93gABYMSCHYHmpcCCHHwjQAmB5qXAg +hxMI0AFgealwCwgQAlDY7B4AkFDYgR4YEIDYgh4YEAXYgx4YEHPYvh4YkHTYCB4AkBgeQJO/HhiQ +d9gMHgCQA9gcHgCQB9i8HhiQAB4AkH/YEB5Ak70eGJAEHgCQFB5Ak6oeWJOrHliTAdisHliTkx4Y +kBHY8B4AkKrYdR4YEArYdh4YEHjY1B5Ak5geGJAn2JkeGJAg2JoeGJAgh2B5ANgRCNACIIdgeQDY +h+AA2AP0AdgghxpwYHkA2IjgAdjAeAUgPoQE8gLYmx4YkH4eWBN/HlgTgB5YEyEHT/jxwPoKIABH +2ADaz3GrAKD/WaEH2BqhWKHRwOB+4H7geL0DQAe5A0AHtQNABwDZz3CAAOi5IaDpAeABIqDxwOHF +z3WAAOi5zgvgAalwuHAAhRHoSiSAc89zgAAwaADZqCCAAkQpfgMyI0IOPwpAAQHhEPAA2UokgHnP +coAA6GioIIACRCl+AzIiQw4fC0ABAeEKIcAP63LPcAAAhhnq28kFr/lKJAAAkQZv+Chwz3CAAOi5 +IIADgArpz3GAADxoRCh+AzIhQA4J8M9xgAD0aEQofgMyIUAO4H7xwN4Nb/gH2BoKIAAA3w4O7/86 +cM92pAC4PawWABaiuKweGBDPcKUA2MvsoAHY9h4YEM9wFQArK5oeGBBCCe/46XCKIMQAnx4YEM91 +gABYMSCFYHnpcBUI0AIghWB56XCH4MogwiME9EogQCAghWB5ANiI4AHYwHgFID6EEvIa2PMeGBD0 +HhgQZNjIHhgQqtjJHhgQadjMHhgQwNjNHhgQOdnPcKUACAw+oE4IAACiCCAAKnAY2JUeGBDPcYAA +mB/hocjYAqEAoQOhz3EBAJilz3CAAOQZ1BhAAJTZz3ClANjLK6BB2c9wpQDMfy2gUQVP+OB4ANvP +caoA8ENloc9yAAA/P0ahz3AAAD4/B6GKIBAACKEJ2Iy4CaHPcAAAFhwKoc9wAAAfHwuhz3AAABwW +DKGR2AS4DaEE2A6hz3AAAD8+D6FQoXGh4H7geOHFz3GgAMgcCKEG3RHw4HjgeOB44HjgeOB44Hjg +eOB44HjgeOB44HjgeOB44HhhvYwl/5/t9eB/wcXgePHAXgxP+KLBooFgkM92gADwBrh7o4FkfWCG +pXumgQGQuHingWCmpHihhkAhDwSleAGmHeoBgQIcxDAwuwQcxDAAHAQwIIGLdWB5qXABhyGGAhxE +MDC5BBxEMCCHABwEMGB5qXAA2ACmAaZdBG/4osDxwM9wgABoMSCAYHkB2Ce4UiAAAMC4E3jCuM9x +pwAUSAuhDKHRwOB+4cXhxs9xoADIHMiBCKEG3RHw4HjgeOB44HjgeOB44HjgeOB44HjgeOB44Hjg +eOB44HhhvYwl/5/t9clwwcbgf8HF4HjxwHoLT/gIdjpxSHcac891gADouQClIaVYreoM7/95rVIN +7/8DpQSlANrPcKsAoP9ZoAfZOqBYoMlwKnHpctIKIAIKcz4L7//pcIDmAdjAeAzgXg5v+gHZgQNP ++PHAGgtP+Ah1BCKPDwAGAACA5wHfwH8EIoIPQAAAANdyQAAAAEohQCDPdoAA6LkYjsIhQiQacRMP +ARCF7xmOCwhBBADYAvAB2C8iByCpcGoP4AHpcSCGANgPDUEQIYYSccwiIaAC8gHYLyYH8BquHPIA +2c9woAC0DzygqXAKcelyJg/v/ypzOgqAAgGGz3GAALgGALEAhgGxGI4EqYIJoAIqcAnwgOUB2MB4 +DOCmDW/6AdnFAk/44HjxwM9wgABs0vYI7/mKIQkMz3CAANQj6gjv+YohCgXPcIAAUCnaCO/5iiEK +BdHA4H7xwCoKT/iiwTpwGnEA3W4O7/8H2JpwAtmpcFpwenEA2zRoAnEodRQhACBocsKFBBAPBdh/ +w4UB4sR/5XvxCvSAIOUBgQIcxDAwuwAcBDAggQQcxDBgeYtwQiNBIL8JdYBAIkAgQg3v/4pwFQJv ++KLA8cDGCU/4OnDPd4AAcMYQj892gADouaWGhiD/AUO4DiUNkM9wgABYMSCAyiViEGB5BNgg6BqO +gODMJSGQGvIA2A3dGnACuBV4x3CAANwyIIAE6QKAE+hAeGG96w11kEAgQCAA2BquEI+GIP8BQ7gF +pvYMr/gqcLEBT/gKIcAP63LPcAAAZRk12wokAATpAK/5uHPgePHA4cUIdSCQApVBlRC4BXop2BK4 +FSBBAEChIJXwIEEAHQpAAFoM7/6KINEDApUhlRC4BXlKDO/+iiDRA3UBT/jxwOHFiiCJBoolShUy +DO/+qXHPcYAACDXAEQIGGwr1DwDbEmoUeDhgoKDPdYAAUAeghaGgYqABasW4wBkYAL4MoAAA2C0B +T/jxwKoIT/gIdoog/w8Aps9wgAAEugqAjejPcIAAYDEggGB5AdiB4AXdyiUiEXPwz3CAANwgA4AY +iDUIEQE+COAAAd0Aps9xgACIFyGRz3OAAHQHQIM84TpiIYNk4hThWWEwcMIlThOzfcG9VfAmCEAA +z3CAAMBXAIDPd4AADDhCIBCAng+gAMogYiAAps9xoACwH7uBKYdAJxETz3KAAEzQ8CFBIEWCYbkF +Kn4A1b0ndWq9SCUNEBB1yiUGEE73z3CAAMBXNgrgBUogQCDPcIAA2FcqCsAFoKbPcIAAiBcBkM9y +gAB0ByCCPOAZYQGCZOEU4DhgEHUB2MIgDgATeFMgTYAJ8g8IUSAJh5YM4ATwIQAg+Qcv+Klw4H7g +eOB+4HjxwOHFz3GgAKwvHIG9gQR9z3CAABggAIgTCFEAz3DA3wEAHKEo2Ri5IfCKIEkGqgrv/ooh +zg+KIAkGngrv/qlxFQ0eF4ogigWOCu/+iiHPAy4LgAIEJY2fQAAAAEAOwvyA5WwKQvoA2Zu5z3Cg +ANAbMaCZBw/44HjxwBIIAADODgAA0cDgfuB48cAGDw/4z3CAAAS6B4BKIEAgwLiB4M9xgADoOACB +wiACJHMIXwCBuAChz3agAMAvE4YNCJ4GE4a6uBOmAtgRps9wgABYMSCAYHkA2C0IEQIg3891oADI +H/ClCthDHRgQANgCCOAHjbjxpQvwz3CgAKggDYDk4JH3EIb1CB6A0g+P/yoMIAIKcBUWAJaAuBUe +GJDZBg/4XBYEEEAWBRAKIcAP63KKIEwJCQZv+YojhgfxwE4OD/gIdc92oADALxqGObhSIAAAUyAR +ABSGEQjfABIKL/8k2PK4AN8D8gHfURYAlovooxYAlgQggA8AAAAPjCAQgAP0ANgC8AHYGnAEIZJP +AAQAAM9wAAAIHNYJD/8/uFIgAwAEIIBPAgAAANdwAgAAAAHawHoMcIYgPQCA4AHZwHkTCJ5Bz3CA +AFAHAICB4ADYAvQB2AHe5b3KIYEjQwkQIOa9yidhEB3v473KImEgMwoQIOS9yiNhABPr4r3KIGEg +HwgQIOG9yiJhAAvq4L3KIWEAB+lRJcCRyiBhAIPoANgC8AHYwQUv+A944HjxwGoND/imwc9wgAC0 +YCCAz3WAAAS6AYBEwSWFRcCD4cwhIoA58s9wgADcIAOAGIhnCBABAd8A3hcJUQAyDS/96XDPcIAA +sLodiMWlJeiKIEkGXgjv/oohTQUD2AWlDYXOpQzZFSQCMM9woAAsILCAz3ABANwOQMBBx0LHQ8ZE +ggDYCHOYcLhwACWHHwcAIKHyDC/92HA9BS/4psDxwB4KT/4A2M9xoADAL4gZAAATgYu4E6HPcIAA +iBcBkBC4RSAAD8AZAADRwOB+4HjxwADZz3CgANAbm7kxoM9wgABQBwAQBQAZDVQCCiHAD+tyiiAN +B+nbHQRv+UokAADPcIAANDjwIEABQHjRwOB+8cBaDC/4UtkacM9wgAAEugeAAd3AuIHgwH0A34YP +r/6KIEkGiiDJCXoPr/4Kcc9woAC0D/ygC8gEIIAP/v//AwsaGDALyIe4CxoYMG4O7/sc3kTZz3Cg +AMgcKaAR8OB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4Yb6MJv+f7fXPdqAAwC8ThhcI +nwaKIEkGDg+v/mnZpgqgAalwng2gAKlw3gmAAFEWAJaF6Ax0hCTCnxbyF4YpCF8Gz3CAAJQHAIAd +CF8ACiHAD+tyCiQACFEWBZaKIEwIKQNv+YPbUQ1REIogSQa2Dq/+i9kQhjUIHwDPdYAAYDEghWB5 +AdgPCFEBIIVgeQLYHQiQAEAWBBAKIcAP63KKIIwIkdvlAm/5uHOKIBABEaYQhv8IH4AUhqu4FKYS +2Bi4GabPcaAAyB8YEQCGobgYGRiAiiAQABGhCdgIuA+hE4apuBOmz3CAAAS6B4BDCNEAz3CAAIgX +AZDPcYAAdAcggTzgGWFk4QIgQKAaAA8ACiHAD+tyiiDMCLvbSiQAAGkCb/m4cwK4n7iIHgAQHg+A +Bc9wgADoOAkDL/jgoOB44H7geOB+4HjxwI4KL/ja2c92oADAL4AWDxBcFhIQiiUJHWgWEBCIFhEQ +vg2v/qlwqXC2Da/+QS+BEKlwqg2v/kpxqXCiDa/+CnGpcJoNr/4qcTCGkg2v/qlwM4aKDa/+qXAH +2M91oADIHxkdGJAB2AhxCHIIc7oIL/+YcP4N7/5U2IAWDxAiv5YNoAXpcM9xgAD0Ow+B+GAPoQDY +iB4AEAnYCLgOpU0CD/jgePHA+gkP+JoLz/+A4ADZyiBBADvyjg0gBihwiiCJB4olRxEaDa/+qXHP +cIAAUAdggM9xgAAINcARAAYVCPUPA9rSaNR+PmagpmGmQqYB4MW4wBkYAKINYAAD2ALYz3GAAAS6 +BaHPcIAA3CAAgLoQAAYluMC4hgjv/AqhCNjuCyAAiiH/DwHY4QEP+OB48cDPcIAAUAcAgA8I0QBG +Cs//Eg4AANHA4H7gePHATgkP+M9wgADcIAOAGIjPdoAABLotCBEBCoYB2oDgAIbAegHZgODPcIAA +TNAGgMB5gODMIiGAzCEigFjyYPDPcKAALCCwgBKGANoCJQGQ44bKIm8AsXcJhhIALwD7YAIlzxCA +5wDfwvYB3xUORXAAQAAABuoCJYEfTgABIDKmAiXBEBUORXAAQAAABu8CJYEfTgABICOmIoYT6SGG +OGAPCEUAFwhFAw8NRBAH8AsNRBALCEUDANkC8AHZIqYAhs91gABM0KaFgOAB2MB4gOEB2cB5hiV/ +HgDbCw2QEaqGgu0B24DnzCIigAT0ANgJ8IDjzCEigMwgIoD68wHYuQAP+OB48cCKINAHiguv/ooh +RQoOCsAEjgsP/gnZCLnPcKAAsB80oNHA4H7gePHAHggv+AHbz3CAAJg4AIDPcoAA6J7BuIPgBBIF +AMB7Dw1RAM9wgAAMOBwQBQDPcIAAIFgAgEIgAIDKIGIAjwgRAM9xgAAEugyBgODMIyGAPfQCgs9z +oACwH9uDNrg2vtFw1iaNHwAAgABAgrWBACIQAN1lHQ0FFAohwA/rcoogDQqKI4QNCiQABEEHL/m4 +dR8NEQAKIcAP63KKIE0KiiNEDikHL/lKJAAAACBQIf8NBZSgdoogSQauCq/+iiFFAAIggCMODaAE +Adm5B8/34HjxwOHFCHWKIAkGjgqv/qlxz3GAAAS6AIGmeAChANgQoQWBKgpgBxGhoQfP9/HAKg/P +9891gAAEuiCFJXgApRCFocGG6AHYEKUFhRGlqg6v/YtwAMHPcAEA8AIbCEAAz3ABANwODwkAAM9w +AQCA7A0JAQDmDu/8AdgA3hIJYALCpc9wgADAVxYJoAWH3c9wgADYVwoJgAXPcIAAUFj+CIAFiiCJ +BvIJr/6pcc9xgAAINcARAgYZCtUPEmoUeDhgz3OAAFAHYIOgoGGgwqABasW4wBkYAH4KYAAA2OkG +7/ehwPHAmHDPcIAA3CAAgM9xgAAEuroQAAYluMC4Dg3v/wqhBej6D6//iHCD6ADYAvAB2NHA4H7x +wD4Oz/fPcIAAIK0IgM91gAAINVkI3wGKIEkH8t5mCa/+yXHAFQEWGwn1DwLfEmkUeLhgz3KAAFAH +QILAoEGg4qABacW4wB0YEPYJYAAC2M9wgAAEuuWgANrPcYAAmDhQoVGhENgJoUehIvAA389wgAAE +uuWgiiCJBvveBgmv/slxwBUAFhsI1Q8yaDR5uWHPcoAAUAdAgsChQaHioQHgxbjAHRgQmglgAADY ++QXP9/HAgg3P9zpwWnGKIMkJxgiv/oohBwzPcIAAiBcBkM9ygAB0ByCCPOAZYQGCZOEU4DhgIQiE +BAohwA/rcoogjQiKI0cMCiRABO0EL/kKJYAEz3CAAAS6qoAb7c9wgADcIAOA2IgrDhARz3CAAAS6 +FBAEAB8MkAAKIcAP63IQvYogzQiKIwcNsQQv+QAlhRMGDY/7WNgSCe/+AdnPdqAAyB8g2BCmMthD +HhgQANg6DmAHjbgg2BGmz3CAAAS6pBYQENIJ4AUcGEAENYYKCK/+iiDJCc91oACsLzyF+g9v/oog +yQmKIMkJ7g9v/kpxhQneIM9wgACUBwCAhiB/D4LgAdjAeHEIUQAYFgCWobgYHhiQiiAQABGmGYXw +uBmFC/IEIIAPCAAAANdwCAAAAAHYwHgG8IYgfw+C4AHYwHht6KDfEfDgeOB44HjgeOB44HjgeOB4 +4HjgeOB44HjgeOB44HjgeGG/jCf/n+31GYWIuBmlfg8AAc9wgAAEugeAwLiB4AHYwHgeC6/8OnCq +D6//SnAB2F4OYAAKcRyFOwhfBhiFiLgYpaDfEvDgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HjgeGG/jCf/n+71B/DPcYAA6DgAgYK4AKEaCc//hghAAKQWDxC+Cq/8KnAODwAAXNiyD6/+Adkg +2BCmMthDHhgQANjeDGAHjbgg2BGmHIUdCF4Gz3CAAAw4AJBRIICByiAhAnwPof7KIaEAz3AAggEA +HKUA2LYNYADpcZ0Dz/fxwEoL7/cA2Zu5z3CgANAbMaDPcIAAhCsZgM92gABQB891gAAINQDfOwif +AIogiQZeDm/+iiHKBsAVARYXCfUPQIYSaRR4uGCKI8oGYKBBoOKgAWnFuMAdGBDyDiAAANgd8Iog +CQmKJ4oYJg5v/ulxwBUAFiCGFQj1DwTacmh0e7tj4KMho0KjAeDFuMAdGBC6DiAABNjWDAAAGQPP +9+B48cCuCs/3z3CAANwgA4AYEIUAGw0RAQohwA/rcoogjQlmaDECL/lKJAAACg0AB14MIAcIdQhx +Ig4gB6lwhiC/jin0CgwP/k8IUQAC3c9wgAAEuqagiiBJB4omTR+SDW/+yXHPcIAAUAcggM9ygAAI +NcASAAYRCNUPcmh0e1tjwKMho6KjAeDFuMAaGAAeDiAAAtiJAs/34HjxwBIKz/fPdYAABLpMFYYQ +IQ5zAKTBCiHAD+tyiiBNB4ojBABKJAAAkQEv+QolgAHPcIAAhCtkEAUAHQ0eAAohwA/rcoogjQeK +I0QAbQEv+UokAAATDpEAANhMHQIQognv/hjYhvA+C+//iiDGC4DggPIKhQDezqUI6M9wgADcIAOA +GIhVCBEBz3GAAJg40KHRoRDYCaHHocWliiBJB4olxBa2DG/+qXHPcIAAUAdAgM9xgAAINcARAAYV +CPUPAtvSaNR+PmagpkGmYqYB4MW4wBkYAALYTPCmCGAAAd/PcYAAiBdhkc9ygAB0ByCCQYI843lh +lSHBAhTiWWF1CEQA5aXPcKAALCCwgM9wAQDwAkDAQcdCx0PG6XAG2elyyXOYdrh2ACWHHwcAIKH+ +CO/82HaKIAkHiiXEGh4Mb/6pcc9wgABQB0CAz3GAAAg1wBEABhMI1Q9yaHR7O2Ogo0Gj4qMB4MW4 +wBkYAAHYpgwAAAkB7/ekwOB48cCWCO/3iiD/D6HBQMDPdYAABLoEhQDZB+jPcKAALCAQgCSlA6X+ +CgAHUgogBxpwCHEWDCAHCnDVCBEAz3CAAJg4JBAFAB0NHwEKIcAP63KKIA0IiiPFDOkH7/hKJAAA +z3EAggEAz3CgAKwvPKC+Ce//iiDHC5kIEAAIFQUQHQ0QAAohwA/rcoogTQiKI8YDsQfv+EokAABS +D2//i3AKJQCQNvKKIEkGNgtv/oohxgWKIAkGKgtv/gDBiiAJBiILb/6pcYogiQeKJsYWEgtv/slx +z3CAAFAHYIDPcoAACDXAEgAGEwj1DwPZ8mj0f19nwKdhpyKnAeDFuMAaGACeCyAAA9ipcAoK7/8A +we0Hr/ehwOB48cCKD4/3z3CAANwgA4AYEIUAHQ0RAQohwA/rcoogzQeKI0QOCQfv+EokAADiCQAH +wg4gAAh2CHWX7t4I7/+KIMYLE+jPcIAAiBcBkM9ygAB0ByCCPOAZYQGClSHBAhTgOGBNCEQDJg+v +/AHYiiCJBoolhRRWCm/+qXHPcIAAUAcggM9ygAAINcASAAYTCPUPANvSaNR+XmagpiGmYqYB4MW4 +wBoYAOIKIAAA2EkHj/fxwOHFz3CAANwgA4AYEIQAGwwRAQohwA/rcoogDQmKI4wEXQbv+EolAAA2 +CQAHigggBwh1CHFOCiAHqXARB4/38cCaDo/3GgkAB24IIAcIdQhxMgogB6lwEwgRAYogCQa6CW/+ +iiHLDETwz3CgAMgfpBABABWAz3aAAAS6QYZCeddxAACgDwDdy/fPcYAATNAlgdW4QSmCAEJ5CwhE +AAKGqOiKIAkGdglv/oohiw+ipoogSQeKJUwQYglv/qlxz3CAAFAHYIDPcYAACDXAEQAGEwj1DwLa +0mjUfj5moKZhpkKmAeDFuMAZGADuCSAAAthVBo/38cDiDa/3iiBJDB4Jb/6KIYoMQg8P/891gADc +IE2FPpVTIgAAigmgAwHbANjPdoAABLoOpgqGBugDhRiICQgRAQTYBPAmCAAHRgkgBwDZfwgRAAeG +z3eAAFAHz3aAAAg1NwjeAIogiQaKJUsWughv/qlxwBYBFhcJ9Q9AhxJpFHjYYKCgQaAA2kKgAWnF +uMAeGBAA2BnwiiBJB4olixeKCG/+qXHAFgAWIIcVCPUPAtpyaHR722OgoyGjQqMB4MW4wB4YEALY +HgkAAIEFj/fgePHAFg2P989wgADcIAOAGIgdCBEBCiHAD+tyiiBNCYojDAlKJAAAlQTv+Lhzbg/A +Bibo5gyv/AHYiiBJCIolDB0WCG/+qXHPcIAAUAdggM9xgAAINcARAAYTCPUPB9rSaNR+PmagpmGm +QqYB4MW4wBkYAKIIIAAH2EoKAAAFBY/38cC2CaAF4cXPdaAArC8YhRUIngYahVIgAAANCB4AHIUV +CB4HiiBJBq4PL/6KIQkJWg1P/xyFNQgeAM9wgADAVwCAQiAAgMogYgCQ6M9ygAAMOAmCFQgVAc9x +gAAEuiqBCQlRAAHgCaI8hW4PL/6KIIkNBgjP+GYMz/2J6M9wgABQBwCAg+DECMH/gQSP9+B48cAC +DI/3z3WAAHQ48CUBEM93gABQBwCnvQnQAM92gAAEuhsIkQAmhhMJUQCKIAkIFg8v/gDZCNgApz0I +kQAC2AamANqeugDZz3CgAPxEQaDgeCGgz3CgALQPPKALyAQggA/+//8DCxoYMAvIh7gLGhgwMvDw +JQEQFwlRAM9wgACYOACACwgfAADYBqYC8Camz3CAAIQrGYALCJ4AngxAAw7wANqeugDZz3CgAPxE +QaDgeCGgz3CgALQPPKDPcIAA3CADgBiIDQgRAWYLj/2E6JYOwAGVA4/38cAiC4/3z3agAMAvOobP +coAA6DgAgr8IHwCAuACiz3CAAAS6B4BKIEAgwLiB4MIgAiQNCR4HEIYJCB8AANgD8AHYLyEHIIMI +ECCKIAkNIg4v/oohRA8whhYOL/6KIAkNEIYhCJ8CQBYEEEwWBRAKIcAP63KKIEwJWQLv+IojBQDP +daAAyB8g3ycJUSCKIBABEabwpQrYQx0YEADY5gsgB4248aUwhsoNL/6KIAkNiiAQABKm8KUF2EMd +GBAA2MYLIAeNuPGlz3CAAFQxIIBgeQpwsQKP9+B48cBSCo/3z3aAAFAHABYEEM9wgAAEukwkwIHM +JCKADfIUEAUACiHAD+tyiiDNCc0B7/iKI8QBAN/loIogiQaKJYQTVg0v/qlxz3GAAAg1wBEABhUI +1Q9SaFR6OmJghqCiYaLiogHgxbjAGRgA5g3v/wDYSQKP9+B48cDhxc9xAwBADc9woACoIC2gz3Gg +AMAvFIHwuBSBDPIEIIAPCAAAANdwCAAAAAHYwHgH8IYgfw+C4AHYwHi/CBEAFREAhqC4FRkYgBHw +z3CgAKggDYDk4M91oACsL473HIWPCF8GDHSEJMKfQfQWC2//Wtht6EPwiiAJBqIML/4uaM9xoADU +CzuBlgwv/oogCQYscYoML/6KIAkGOYWCDC/+iiAJBg4Nb/4k2Ahxcgwv/oogCQb+DG/+iiAJAwhx +Xgwv/oogCQbrdeoMb/4k2Lhwz3CgANQLbBAEAIogjQoKIcAPqXKdAO/4iiNJBs9xoADMKxKBgLgS +oVkBj/fgeM9xgACYOACBIoF/289ygAAEulMgAIAmewP0LoKR6QboDoILIMCADfQwgoXpBYIPCJAA +B+kRggsIkQAB2ALwANjgfuB48cChwQDYz3KAAAS6TRKBAEDAi3AfCVEAz3GgACwgMIFUgkJ5Dw5F +cE4AACA+CE/9A/AeCE/9EQiRAIog/w+hwNHA4H7PcIAAmFgDgCCAAMAieIDgyiAsAPPx4HjhxYoh +/w/PcKAAsB8bgM91gACYWGOFYIOmhdW4gOUA2gbyIoVieYDhyiGMAAkhAABquEggAADgf8HF4Hjx +wP4PT/cIdc9wgAAMOEGAz3CAAAS6z3aAAAC8SaBfhgHfBCWGHwAAACBIcya6UyIFAEQlAhOI4oYj +/g/Af0EtQhNTIgQAFiBHAQgfAAEq620PURDPc4AAmDhJgyV6SaPDuQDaDyJCAC+DCyGAgAHfBPLs +oxwbgAFFDZ8RLoNEeVCDBSGBgDCjGvIA2s9xgAAMOEmhz3GgACwgMIEjoBDwz3GgACwgMIEhoBUP +URACgAToSgnP/ATwEgnP/M93gADcIAOHGIiE4GgPYf3KIEEDA4cYiA0IUQDPcYAATMgU8JYIz/0o +6M9wgABwJhSISQjRAZgWgBDPcYAATMgFuABhNQheA5gWgBBAIU8DBbg4YCENHhMggIi5IKAqCi/+ +iiAJBpgWgBAB2QW4H2cgrwTwANktqDEHT/fxwL4OT/cacDpxz3CgACwg0IDPdYAAWDEghWB5A9gA +3wXoIIVgeQTYg+hKIIAhIQjSIQohwA/rcoogzQqKI0cPCiRABCkGr/gKJQAEz3GAAAS6CQmQIdSh +DoHPcoAAWDgPIEAEDqHwIgAEcoHYYAIgwgAJCt8HEqHPdYAAmDgChSGFBHkVyB0JDgDKpYogygh6 +CS/+yXEBhemlCQjRA+elfQZP9+HF4cYIdf/Zz3CrAKD/OaA4oATZz3CgAMgcKKAW3hLw4HjgeOB4 +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44Hhhvowm/5/u9c9xoADALxOBgOXPIOIC0CDhAhOhgOU8 +2gX0z3CAAIgXQJDPcIAAiBcBkBC4RXjAGQAAwcbgf8HFz3KgACwgUIIies9xgAB0BxV5AIEXCIUA +z3CAANwgAIC6EAAGBwheAUCh4H7xwHYNT/fPdoAAzB8AhgHgAKYlCFEAAdjPdaAAyB9RHRiQIN/w +pUMdGBAA2KIO4AaNuPGlz3EBAEJpz3CgAOwnJqAAhkIgQIAApgf0z3GgAMgcANgRoYkFT/fgeADY +z3GAAAgsA6nPcIAAbAZHgAKAQqkc4FZ4RIhJqQWI4H8KqeB+4HjxwPIMT/fPcacAFEgA3sihB4HP +dYAATJQHpRCBz3KnADRECKXHoc9w8w///BChoNjWoZq49RoYAM9wpAC4PZsQAQYjpaYQAQYkpZIQ +AQYlpaMQAQYmpZsYmAP/2aYYWACSGFgAoxhYAM9xpADs/89wAAD//8ehBqHPcYAAzB8AgQHgAKEl +CFEAAdnPd6AAyB9RH1iQINgQp0MfWBAA2K4N4AaNuCDYEacE2FIMb/hAJQESDdhGDG/4QCWBEs9w +KAACAc9xoADsJwahiiCNAAahz3CAAMwfAIDPcYAAzB9CIECAAKEF9M9woADIHNGgbQRP9+B48cD+ +C0/3USDAgRXIz3OAALC6AxICNs91gADAuxR78YsQE4QAEfIB5+lxMhKFAGeVAh0CEc92QQCDAGa1 +z3OAAMQ8460Q8EAkQQAxEoUAIq3AEwMB463PdiEAggBmtc9zgADIPBENRQDEpQCDAeAAowSFU/DP +cYAA0LoJYQHhJK0hggDb0Ip3CR4BLyXIAw94SSDEABVuz3eAAEzIAGcyihEIngXPcIAATMrWeAGI +A/BocAAkjw+AAEzK1n/kjwghwQMIIQAAoHBJIMEDFm41eM9xgADMywBhz3GAAEzL1nnPdoAA3CDE +htiGIYHFeQQhgQ8AAAAIJngC8AOCAqWYEoAAKI0NCQAAZK1g2Bi4BPAA2J24BKVRA0/34HjxwOHF +A8ikEAAAUSAAgM9wgADcIASABPIbkAPwGpCGDkAFu+jPcKAAFAQD2SOgINgMGhwwz3GAAHg7E4EB +4BOhA8gA2pgQAQCkEAMAlBhAAJ4QAQGsu5IYRAC+EAEBrbuAEA0BpBjAAJAYRAB+EAEBgBiEAD1l +sBABAaJ5MHmwGEQAghABAX4YhACGI+WPshhEACwJgv3FAk/34HjxwEYKb/cIcxCJMxGNAAHaQKsV +Eg82z3aAANi67mbPcoAACLtI3MGrFRIPNgIiDgP0Js4TwbMVEg428CKCA0GjQYEjCh4B0onPcoAA +TMoWetyrQIqGIn8MXHoEukV+3KsD8IDaXKsEuAV9vasckc9ygABQuw+zFcjwIgAABLMHyAWjVBEA +AQyzAJENs6ARggBIowbIBCCADwIAQQANCIEPAgAAAIi6SKMGyIYgvo8E8om6SKOcEQABz3OAAPxY +JrjAuEAoAgMPgcC4DbhFeOEBb/cAo/HAEgggAALY9gkAANHA4H7xwF4Jb/dKJAByCHfPcIAA3CAV +INADABANIADeyXDapaggQA3PcYAAlGX0IQIAz3GAAAyuFHlAsc9xgACkZ/QhAgDPcYAAPK4UeUCx +z3GAAKRl9CECAM9xgAAcrhR5QLHPcYAAtGf0IQIAz3GAAGSuFHlAsc9xgACMZ/QhAgDPcYAALK4U +eQHgQLEIhQsIXgEE2TSlAvDUpQ8IHgEJ2UYdRBAu2gXwFNlGHUQQMtpbtVmNWWEweUYdRBAa4Tq1 +FwgeAArYVB0EEAbYVh0EEAfYB/AQ2FQdBBBWHYQTBdgPpaYMIAPpcDyNKHBEHUIQhiADAOa5WB0C +EMoiQQAL8lAhwwFvekQdwhBQIMMBb3hYHcIQEwleAUhzhiMDAG96RB3CEA0JHgGluFgdAhALCd4A +pLpEHYIQLw+QEHoOb/npcAAQACCvEAAGUSBAgPHYwCgiAcoggQ8AAJMAwCghAYgdABAY2I24E6UI +hVEgwIDPcIAA3CAF8roQgACJuAPwoRCAABKlz3CgAKwvGYDPcYAAhCswuMC41gygBhqhCIUEIL6P +AAYAAAvyNrjAuBt4AeBaHQQQAtgapQPwWh2EEwDYF6UYpdIMr/3pcCiFAdpIc0EpAAU1uVIgAABS +IQEAwLjAuQ4OL/6YctkHD/fxwHYPL/cH2M92oADIH0geGJDPdYAA3CADhc93oACkMDqATB5YkIoh +BAAvpkYQAQGwHkAQRhABAbQeQBAf2Qi5LqYIgFEgAIAA2Iu4B/IQpj4KT/kBh4S4BvARpjYKT/kB +h6S4AafPcIAAOFkAgBcIHgCGIP8OIrgUuM9xgADIBQuhSg4P+eIOwAAaDAADkgwAA89wAABVVVoe +GJAB2lkemJADhQiAz3GmACgADwjeBADYD6GGCsADAvBPoQOFz3eAAFgxWhABAc9wpgDoByag+glP +/QOFsg/gAw2QANjPcasAoP8ZoQfYGqEA2BihIIdgeQTYCuiKINgJwgnv/QHZhgpgAALYBfByDyAF +Adgjhc92oADEJxyBDx4YkF2Bz3CgADAQRKDPcIAAALwQeI8eGJDPcIAAvKLPcoAAvLIQeBC6RXiQ +HhiQiiAEAJIeGJAegUAeAJDPcIAAHCBTHhiQDxYAlp+4Dx4YkCCHYHkA2A8IkAMgh2B5ANgTCJEC +CBYAkIUghAAIHgCQIIdgeQDYDwiRAggWAJCKuAgeAJAA2BAeAJADhR+AHB4YkDEGD/eA4PHANNgH +9JYJD/5QIEEEBfCOCQ/+TyBBBMYJL/402NHA4H6A4PHA9NgI9HIJD/5QIAEA9NgH8GYJD/4IcfTY +gLmeCQ/+0cDgfuB48cDhxaHBaHVEIsAChiL/A0YiwgNUega5NHlZYRV5x3GAAOSYi3AI4XYPL/cE +2qlwi3FuDy/3BNoA2LkFL/ehwPHAOg0P96HBCHUAJI4AYn4CJk4RoHJiegIiAoEA2EDADfIsfot2 +L3BIcSoIb/zJcv4IoAHJcADAAn2pcGUFL/ehwOB48cD2DA/3z3aAAMwfAIYB4ACmJQhRAAHYz3Wg +AMgfUR0YkCDf8KVDHRgQANgiDqAGjbjxpc9ygABUBwCSz3GgAOwnhrgQuAUggA8AAMISBqEBkhC4 +BSCADwAAAhMGoQCGQiBAgACmB/TPcaAAyBwA2BGh7QQP9+B48cB+DA/3z3CAANwyGYCB4Mohwg/K +IsIHyiCCDwAAqBPKI4IPAABoAcokIgD4A2L4yiUCAc91gADMHwCFAeAApSMIUQAB2M92oADIH1Ee +GJAg3/CmQx4YEADYfg2gBo248abPcIAAVAcjkASQwrnCuAO4JXgQuIUgjQDPcaAA7CcGoQCFQiBA +gAClB/TPcaAAyBwA2BGhUQQP9+B48cDiCw/3z3aAAMwfAIYB4ACmJQhRAAHYz3WgAMgfUR0YkCDf +8KVDHRgQANgODaAGjbjxpc9ygADgMwCKz3GgAOwnELgFIIAPAADCaQahAYoQuAUggA8AAAJqBqEA +hkIgQIAApgb0z3GgAMgcANgRodkDD/fxwOHFCiUAgM9xgACAXQARBAAv8s9wpAC4PQDbNQwRAJsQ +DQbPcoAAhF2goqYQDQbPcoAAiF2gopIQDQbPcoAAeF2goqMQDQbPcoAAfF2gopsY2AD/2qYYmACS +GJgAoxiYAAHaz3CgALQPXKA28EwkAIDKIsEHyiCBDwAAfhnKI4EPAADeApACYfjKIcEPz3CAAIRd +QIDPcKQAuD2bGJgAz3KAAIhdQIKmGJgAz3KAAHhdQIKSGJgAz3KAAHxdQIKjGJgAz3CAAIQrGYDP +cqAAtA8iuMC4HKINAy/3ABlAAfHAfgoP989wgADcMhSAgOCL8roOr/4H2Hpwz3CAAHDGEIiGIP8B +Q7hhuIbg9AANAM92gADouSSGz3KAABi4MyYAcIAAIGBAIhELBLk0eUAiEApAIhIGQCIPCEAiDQQ6 +YkAnAXIUeQB5z3GAAEg0SHBV8M9xgABoNARqUfDPcYAAiDRAIgACS/BAIgADz3GAAEg0og2v/gDa +BIbPcYAAaDQEuBR4uGA78EAiAAfPcYAASDSCDa/+ANoEhs9xgACINAS4FHj4YCvwQCIABc9xgABo +NGINr/4A2gSGz3GAAIg0BLgUeEJwG/BAIgAJz3GAAEg0Qg2v/gDaBIbPcYAAaDQEuBR4AnAuDa/+ +ANoEhs9xgACINAS4FHgicBoNr/4B2tYMr/5qcLEBD/fgePHAz3CAANwyD4AR6M9wgADouQSAz3GA +AGi5ArgUeDhgz3GAAKg0Ag+P/tHA4H7gePHANgkv90Taz3CAAOxnz3GAAFy6ig3gAwDeAt0WCCAA +yXBhvfkNdZAB5nkBD/fgePHA/ggv9wDaz3GAANwgFXlggQS4ACCQD4AAdGSvG5gAAIEEEA8gz3aA +AOxntBjYA6CBQoaKIAcPYYYdZcgdgBDEHcAQIIFGhs91gABcumWGOGDQGIAAFibBE8wYwAAWJcAT +BOAE4cIKL/cI2gwQACAWfhZ9BG0kbq4KL/cI2uUAD/fgePHAeggv9xLZqcEIdnoO4AWLcEokAHEA +2qgggAIWJIAwKIgLCZIAYbkoqAHiAsIBw891gADcINV9AIWKIQcP9G7Hd4AAdGQ4YMQYwADIGIAA +AIUGwgXDOGDQGIAAg8HMGMAABBcQEM9wgABcuhYgAAQE4DIKL/cI2uOHz3CAAFy6h8H2eATgHgov +9wjaAMAgha8ZGAAgha8RAAYVCB4AtBnYAyCFtREABoC4CPC0GRgEIIW1EQAGoLhKCW/9tRkYAITo +PglP/QToANgD8AHYEHboD2EGyiCBAwCFrxABBlEhQIDx2cApIgHKIYEPAACTAMApIQH6Da/7iBhA +AOEH7/apwOB48cB+D8/2z3aAAGxdz3WAAIQHEukgho3pAKVyD+/9DNg2CC//iiAQAAHYAKYO8CCF +JXgL8DIP7/0M2PIP7/6KIBAAANgApgCloQfP9vHAIg/P9s9xgAAwMQCBoLgAoYYIb/wB2M9wgADU +rAAQBABMJMCAyiHND8oizQfKII0PAACBDMojjQ8AANgAmAYt+Mol7QDBDHQAAN4UbgAggQ+AANSs +R5EGkeSRELpFeBpwBZFDkRC4BX8CkRC6RXg6cBoIr/gKcVpwz3CAABRv8CCBA7NutH0AJYAfgADE +ViCg2gzv+ypwCHEAJYAfgAC4VkYJgASKIMwOygmv/efZiiAMCL4Jr/1KcYogDAi2Ca/96XEHCMQj +l+/PcIAACG/wIIEDs260fQAlgB+AAFRXIKCKDO/7SnAIcQAlgB+AAEhX9giABM9wgADUrACAAeZN +DgSQeQbP9uB+4HjgfuB44H7geM9xgACMMc9wgABYM+B/IqD8HAi08cAacM9wgABgMSCAYHkB2IHg +yiHCD8oiwgfKIIIPAACeGcojgg8AAKEByiRiAIAFIvjKJSIACnDRwOB/BBQQNPHAyg3P9gDdz3aA +AKC6z3CAAGAxIICgpmB5AdiB4Mohwg/KIsIHyiCCDwAAmBnKI4IPAAAUAcokYgA0BSL4yiVCAwCG +mLiZuACmANiOuAGmA9ihrqKuDrgCps91gABkMUCFBthgegLZQIUH2GB6AtkCjsUF7/YAruB+4Hjg +fuB48cDhxbTBz3WgALRHcRUAlgQggA9wAAAAQSg+hfX1iiD/D28dGJBrHRiQtgpv+YtwWg0P/Q7o +bxUElmsVBZYKIcAP63LPcAAAsROlBC/4LNsiDQ/5pgiAA2UF7/a0wOB4QIgB2AChaLoCulV6x3KA +ANwyY4JjoWGCYaFigmKhZIJkoeB/AKLgePHAvgzP9s9wgADcWAWAA4DPdYAATJQggEmFACKADy0A +wMYCeZEJcgChwc93gADMHwCHAeAApycIUQAB2c92oADIH1EeWJAg2BCmQx5YEADYxg1gBo24INgR +potxagzv90LYAIdCIECAAKcH9ADZz3CgAMgcMaAAFAQxBCS+jwAAF//KIcIPyiLCB8oggg8AAKYT +yiMiDNADIvjKJSIAAIWCuH4PIAAApSYIIAAB2ACForgApSmFz3CAANxYx3EtAMDGtg5ABGEE7/ah +wPHAygvP9rjBz3CAANwgA4DPd4AAsB8IgMC4QcADj0ogADBCwASPQ8ACj0TAz3CAAGgZOoAbgCR4 +z3GAAIRgIIExuFfBz3GAAEyUYpHPcYAAuAZAkcC4ZQuBAM9zgABwxi2Lz3WAAEyUhiH/ASgVjRBD +uQIhQYOui2+LyiFiAIYl/xHbbc91gABMlCkVjRCGI/8BDiWNk8olYhC7faV5u2vPc4AATJQqE4MA +DiNDg8ojYgACu2V5A/AH2YDhjAYhAEbBz3GgALRHRxEBhoDhzCAigHgGAQDPcIAATJQAEAQAUSRA +gMohwQ/KIsEHyiCBDwAAqhPKI4EPAADgAJwCIfjKJSEAz3GAAHDGDYnPc4AATJSGIP8BQ7goGwIA +DomGIP8BQ7gpGwIAD4nPcYAATJRCsYYg/wFDuCoZAgAA2Z65z3CgALRHUxhYgOB4ANlTGFiAsg1P +/892gADMHwCGAeAApikIUQDPdaAAyB8B2FEdGJAg2BClAdhDHRgQANjOC2AGjbgg2BGlAI/Pd6AA +7CcQuAUggQ8AAEItBSCADwAAgkYmpwanz3AIAIcQBqcAhkIgQIAApgf0z3GgAMgcANgRoQHAz3GA +ANiwFnlEgWCBz3APAAD8CroEesm7ZXrPc6cAFEhNo0WBIYEKukR4ybkleA6j7gtP/kfAAcAK6Ioh +/w/PcKAAtEdvGFiAaxhYgADYQMAD2EjAFBwANgohADYAwM9xgAB0lAhhhOAWASoAScAAwAbBESEA +gNgDAQAJwAAkATBcEYEAgeHIAyEAg3AB2VwYQgAJwc9woAC0R2AYWIDPcIAA3CADgBC5m7kyIIAP +AACwAp+5gOAB2MB4D7gleM9xoAC0R18ZGIDPcKAAtEdxEACGBCCAD3AAAABBKD6F9vVKIAAgL/BA +picKUQDPdaAAyB8B2FEdGJAg2BClAdhDHRgQANiCCmAGjbgg2BGlC8FALAAkBrmBuSV4BqcMwEAp +ASQGuIG4JXgGpwCGQiBAgACmB/TPcaAAyBwA2BGhQCBQIM9wgABgMSCAYHkG2BJw/AIOAAnB6wkO +hALBA8AieM9xpwAUSFwZAARKwC8IECAzCFEgiiDEBoohhAgR8CQUBDAKIcAP63LPcAAAqxOKI8QC +RQAv+EolAAC22L3ZG3A7cUAggDEQeEvAQCGAMRB4TMAJwJYPb/wKcU3ACcBuDm/8CnFOwACGAeBK +JAAgAKYnCFEAz3WgAMgfAdhRHRiQINgQpQHYQx0YEADYmglgBo24INgRpQ3ABbgQeBC4gbiHuIy4 +BqcghkIhQYAG9M9yoADIHADYEaJKIwAhanVAKEAhT8AKIQAlAeFhvSCmLwlRAAHYz3GgAMgfURkY +gCDYEKEB2EMZGAAA2D4JYAaNuCDYz3GgAMgfEaEEwRVtACUXFi8nyCUleBB4ELiFIIoABqdAL4Ah +gbiXuAAlUhYGpy8iiCRAKoAhgbiXuAanC8AGuIG4BqcMwAa4gbgGpwCGQiBAgACmB/TPcaAAyBwA +2BGhksCTwZTClcNaCSAEViTEMjbAmOgbCBEgz3CAAEyUDYDPcYAATJQB4A2hDPAZCFEgz3CAAEyU +DoDPcYAATJQB4A6hAcAM6HoPz/wRCFEAANh2wAXAgLgPeEXAAcDPcoAA2LADuBUgAAQZYhpiDIIo +gRLCUMAPwLZ4ACCVD4AAjJQTwPAdgCD0HQAgCsCIInwALyYAIAQuviAyCu/7L3AOIIEPAAAAAVHB +E8CIIHwABCi+BS9wFgrv+xDBDiCBDwAAAAERwIkhxw+JIMcPSCAAAEghAQA2wlQdGCBVHVggGwpR +AA7CB8MEuga7emK1esdygAAUsQKyI7IAhgHgAKYtCFEAAdjPcaAAyB9RGRiAINgQoQHYQxkYAADY +ug8gBo24INjPcaAAyB8RoQfBDsAGuQS4OGC1eMdwgAAUsSKQPHpAL4EhgbkQukV5JqcikMC5uHkF +IQEFLyRIICOQPHpAKoEhgbkQukV5JqcDkMC4uHhAhgUgQARCIkGALyEIIAb0z3OgAMgcANgRo0Ij +UyBMIwCg5AXN/58Ez/8AwAHgQMAIwGG4gOAEBO3/SMAAhgHgAKYnCFEAz3WgAMgfAdhRHRiQINgQ +pQHYQx0YEADYBg8gBo24INgRpc9wCACGEAanAIZCIECAAKYH9M9xoADIHADYEaHPcaAAtA9cgQDY +HKHPcIAATJQEkBC4hSCEAAanz3CAAEyUBZAQuIUgjQAGp89wgABMlGeAz3CnABRIZ6DPcIAATJRo +gM9wpwAUSHCgz3CAAEyUA4DPc6QAuD2bGxgAz3CAAEyUBICmGxgAz3CAAEyUBYCSGxgAz3CAAEyU +BoCjGxgAz3OkAOz/ANgGo4ogigAGp89wgACEK1yhGYBRIICA7A2iBMogYgDPcKAAtEdxEACGBCCA +D3AAAABBKD6F9fX2DM/4z3CAAEyULIAFwDhgz3GAAEyUDKEPgQHgD6HBBK/2uMDgeADZz3CAAGiU +LKgtqOB/LqjgfuB4gLjPcaAA7CcGoeB+z3CAAAchz3GgAOwnBqHPcIAARzoGoc9wgADHUwahz3CA +AMckBqHPcIAABz4Goc9wgACHVwahSdnPcKcAiEkwoOB+4HgB2c9woADIHDCgS9nPcKQAHEAkoOB+ +4HjPcQEACCPPcIAARDEgoM9wgABAMSCgz3CAAEgxIKDPcQEAECPPcIAATDEgoM9xAQAMI89wgABU +MeB/IKDPcYAATJQAgYC44H8AoeB48cDeC6/2uHBTIIEAz3CAADRuKGCB4Mohwg/KIsIHyiCCDwAA +lRnKJIIPAAD+AFQD4vfKI+IHz3aAAGAxIIZgeQHYJwhQACCG63VgeQHYuHDPcAAAlhkKIcAPqXIi +2yUD7/eKJIMP5QOv9gHYCdngfyCg4HjxwM9wgADYWACAcwhUAc9woACsLxqAUiAAAGMIHwDPcYAA +TJQLgQHgC6HPcIAAUDEAgEB4kg7P/89wgAA8MQCAQHhmCoAAkgwP/nIOj/zPcKAAeEUAgAQggA9w +AAAAQSg+hff1z3CAANwgI4BIgTSRUyIAAL4OYAIB29oKr/0Q2NHA4H7gfuB48cDPcIAAYDEggGB5 +CNgQec9wgAAMC2ILj/eODiADB9jSDg/+PglAACYIAADRwOB+CHFYiQGAAqGI6lmJgOLCIKIAwCCh +AAKh4H7gePHAkgqP9s9wgADMHwCAz3GAAMwfAeAAoc91oADIHyDfGwhRAAHYUR0YkPClQx0YEADY +ugsgBo248aXH2JS4z3agAOwnBqbPcAMAgisGps9wAwDCRAamz3ADAAIsBqbPcAMAQkUGps9wAADC +dM9xAwDCdCamz3EDAIJvJqbPcQMAgmwmpsbZkLkmpgam8KUK2EMdGBAA2FYLIAaNuPGlz3AAAIJs +BqbwpQrYQx0YEADYOgsgBo248aXPcAAAAiwGpvClCthDHRgQANgiCyAGjbjxpc9wAABCRQam8KUK +2EMdGBAA2AYLIAaNuPGlz3AAAIJvBqbwpQrYQx0YEADY7gogBo248aXPcAAAgisGpvClCthDHRgQ +ANjSCiAGjbjxpc9wAADCRAam8KUK2EMdGBAA2LoKIAaNuPGlz3ATAMYABqbwpTLYQx0YEADYngog +Bo24z3CAAMwf8aUAgM9xgADMH0IgQIAAoQT0ANhRHRiQiQGP9vHAHgmv9gHZz3agAOwnJqaH6M9w +gABQMQCAQHhV8M9woACsLxWAUSAAgMohwQ/KIsEHyiCBDwAAfxnKI4EPAACnAMokwQCAAOH3yiXB +AM9wwABHaAamz3ATAMcABqbPcBAABmkGpsfYlbgGps93gADMHwCHAeAApyMIUQDPdaAAyB9RHViQ +INgQpUMdWBAA2OYJIAaNuCDYEaXPcAAAQi0Gps9wAACCRgamz3AAAEJgBqYAh0IgQIAApwf0z3Gg +AMgcANgRocEAj/bgePHAUgiP9s9wgABYMSCAocFgeQTYOugA2AAcBDDPdYAAzB8AhQHgAKUjCFEA +AdjPdqAAyB9RHhiQIN/wpkMeGBAA2GoJIAaNuPGmi3EOCK/3ANgAhUIgQIAApQf0z3GgAMgcANgR +oQAUATHPdYAAZDGGIf8MQIVCuWB6AtgAFAExQIUD2GB6wbkxAK/2ocDgePHAvg9v9gPYz3aAAFgx +IIbPdYAABDlgeaLBBugghmB5BNiG6McDIABIFQQQA9gacM93pwAUSM92oADsJ4ogkQXGCi/9ANm6 +Cy/+BdgOpc9wgADMHwCAAeDPcYAAzB8AoSsIUQAB2s9woADIH1EYmIAg2TCgQxiYAADYogggBo24 +INnPcKAAyB8xoAPYPg9v96lxBNg2D2/3Im0F2C4Pb/ckbQvYJg9v9yZtD9geD2/3QCUBEjbYFg9v +90AlgRI32AoPb/dAJQETONgCD2/3QCWBEwiHBKUNhwWlDocGpc9wpwCYRxyAB6UXhwilFocJpc9w +qwCg/xiAC6XPcKsAoP8ZgAylz3CrAKD/GoANpc9wBQDGAwamxtiQuAamz3AsAAIBBqbPcFoAQgEG +poogiwAGps9wQACHDQamz3DRAMINBqbPcMAABw4Gps9wgADMHyCAEQlRAM9yoADIHADYEaIB2Ain +ANgNpw6nz3CnAJhHz3JQAP8AXKAB2BenANgWp/zaz3CrAKD/WKBz2lmgGoDPcqsAoP+BuBqiz3CA +AMwfIKA1CVEAAdnPcKAAyB9RGFiAINjPcaAAyB8QoQHYQxkYAADYVg/gBY24INnPcKAAyB8xoM9w +EQAGDgami3CqCOADgcE1hQDAInjPcYAAaD0gmVSFDHk2hS8gQA5CeTlhDg9v9jV54LgceMAgYgAB +woIgxALPcYAAAJYSpVWhFqHPcEAAhg0Gps9wEAACDgamz3CAAMwfAIDPcYAAzB9CIECAAKEG9M9x +oADIHADYEaGLcDYI4AOBwTWFAMAieAQogA8AAHQJFIU2hQJ5og5v9i9wT+DPcYAAAJYTpRihz3CA +AMwfAIABwgHgV6HPcYAAzB8AoTMIUQAB2c9woADIH1EYWIAg2M9xoADIHxChAdhDGRgAANhmDuAF +jbgg2c9woADIHzGgAZUQuIUghAAGpgKVELiFIIUABqYDlRC4hSCLAAamBJUQuIUgjwAGpgWVELgF +IIAPAACCDQamBpUQuAUggA8AAMINBqYHlRC4BSCADwAAAg4Gps9wgADMHwCAz3GAAMwfQiBAgACh +BvTPcaAAyBwA2BGhBIUrhQinBYUNpwaFDqcIhRenCYUWp89wqwCg/zigLIU5oC2FOqDOD+/9DoUy +hYwhgoBF9owhP4Eb9iDfz3agAMgf8KYK2EMeGBAA2JYN4AWNuPGmsgiAA4og0QVyD+/8MoVCIEAg +gOCOBM3/BfBiD+/8iiDRBTKFjCGCgET2jCE/gQb2Sg/v/IogEQtIFQQQjCSCgET2jCQ/gQ32CiHA +D+tyz3AAALQZiiMFBYUDr/e4c4hwNQRv9qLA4HjPcIAABDngfxOA4HjPcQEAlD/PcgEAgDW1Ai/7 +ANjgeIogVwftBu/8lNngePHApgtP9s9wgAA8MQCAz3WgAMgfYHgg3tClCthDHRgQANjaDOAFjbjR +pekDT/bgeM9ygABoBhkIHgCA4VHYwCgiBMogYQTAKCEEA/AA2OB/AKLgePHASgtP9s9wgABYMSCA +ocFgeQTYgODM8gDYABwEMM9zoADALxODIQieBvwTBQAKIcAP63KKIIwJiiOHBbkCr/eKJIQJEIMh +CB8A/BMFAAohwA/rcoogzAmKI8cFmQKv94okhAnPdoAAzB8AhgHgAKYB2SMIUQDPdaAAyB9RHViQ +IN/wpUMdWBAA2B4M4AWNuPGli3cA2MIKb/fpcQAUBTGocYYh/A/A4cohwg/KIsIHyiCCDwAAmRnK +I4IPAAAvATQCovfKJGIAz3WAAGQxQIUA2GB6RrkAFAAxQIVEIAEMAdhgekS5AdhuCm/36XFAhQjY +YHoAFAExABQFMUwlAIDMJWKAzCWigMohwg/KIsIHyiCCDwAAmhnKI4IPAAA+AdQBovfKJGIAAtgu +Cm/36XEAFAAxQIVTIFAABNhgegpxIQjQIAAUBTEKIcAP63LPcAAAmxmKI8UBnQGv90okQAAS2PYJ +b/fpcUCFABQPMQXYwb9geulxIw/QEAAUBTEKIcAP63LPcAAAnBmKI4UDaQGv90okQAAAhkIgQIAA +phf0z3GgAMgcANgRoRHwz3WAAGQxQIUB2GB6CHFAhQTYYHoD2UCFBdhgegPZ5QFv9qHA8cB+CU/2 +z3aAAMwfAIYB4ACmAN8lCFEAAdnPdaAAyB9RHViQINgQpUMdWBAA2KoK4AWNuCDYEaXPcIAABiHP +caAA7CcGoc9wgABGOgahz3CAAMZTBqHPcIAAxiQGoc9wgAAGPgahz3CAAIZXBqEAhkIgQIAApgb0 +z3CgAMgc8aDPcKcAiEnwoF0BT/YI2c9wgACguuB/I6DxwOYIT/bPdoAAzB8AhgHgAKYlCFEAAdjP +daAAyB9RHRiQIN/wpUMdGBAA2BIK4AWNuPGlz3AAAMIsz3GgAOwnBqHPcAAAAkYGoc9wAADCXwah +AIZCIECAAKYH9M9xoADIHADYEaHpAE/24HjgfuB48cDPc6AAwC8TgyEIngb8EwUACiHAD+tyiiCM +CYojhwX9B2/3iiSHCRCDIQgfAPwTBQAKIcAP63KKIMwJiiPHBd0Hb/eKJIcJdg5v/QDYz3CAAFgx +IIBgeQTYgOBIDQL30cDgfs9wgADcIAOACIDPcYAAoLoJCB4AAYkD8AKJ4H8AqeB48cC4cYzoCiHA +D+tyz3AAAKcZ2duFB2/3iiSDD89xgACguiCBTCUAgAQhgQ8ABwAAQSkDBgDZyiRNceggrQPwIEUA +BCWCDwEAAMAuumV6DQuBAAHh0cDgfgohwA/rcs9wAACoGeLbNQdv90okQADgePHA4cUA3c9wgABk +BqYIIACgoM9wpwAUSKig4QcP9uB48cChwbhwANhAwFMlgAAnCFAARQiQAE8IEAEKIcAP63LPcAAA +qxmKI8kA4QZv94okgw/PcIAAYDEggGB5AdiE4AHZwHnPcAAAItI0eM9xgADn1A/wz3AAACPSz3GA +AOrUB/DPcAAAJNLPcYAA7dQp2hK68CIAAA4ggg8AAQAAQMKLcE4LIAMD2qHA0cDgfuB48cDODg/2 +A8iUEAAAz3aAAMwfBCCQDwEAAMAAhgHgQSiQIwCmIwhRAAHYz3WgAMgfUR0YkCDf8KVDHRgQANju +D6AFjbjxpc9xJAAHAc9woADsJyagiiGFACagUyCBICsJUABPCZAAawkQAQohwA/rcs9wAACIGYoj +hgWKJIMP/QVv9wolAATPcYAA3CAjgSiBUSEAgMohgg+AAMcgyiGBD4AAhyQmoM9xBABHSyTwz3GA +ANwgI4EogVEhAIDKIYIPgAAHOsohgQ+AAMc9EPDPcYAA3CAjgSiBUSEAgMohgg+AAIdTyiGBD4AA +R1cmoM9xBADHMSagAIZCIECAAKYH9M9xoADIHADYEaEpBg/24HjxwKHBz3GAANwgI4EvKAEAKIHA +uQAhgw8AACLSTiCBBynYErjwIMAAz3KAAOfUNHlZYUDAi3D6CSADA9qhwNHA4H7gePHA4cW4cM9w +LAAGAc9yoADsJwaiz3GrAKD/GoFTJY0AANsnDVAQbw2QELUNEBEKIcAP63LPcAAAgRmKI0UF6QRv +94okgw/Pc4AA3CBjg2iDFQseAM9zgADGIGaiz3MDAMICCfDPc4AAhiRmos9zAgDCAmaiz3MEAEZL +ZqLPc0gAQgFmogHbz3KnABRId6KBuErwz3WAANwgo4WohRUNHhDPdYAABjqmos91AwCCAgnwz3WA +AMY9pqLPdQIAggKmos91BADGMaaiz3VKAEIBpqLPcqcAFEh3ooC4JvDPcIAA3CADgAiAFwgeAM9w +gACGUwaiz3ADAIICCPDPcIAARlcGos9wAgCCAgaiz3AEAMYxBqLPcEwAQgEGos9wpwAUSHegP9ga +odEED/bgePHAUgwP9gPIlBAAAAHez3WnABRIyKUEIIYPAQAAwLoO7/9BLoAD/9ibuM93pwCYRxyn +iiASDWIPr/xBLoEDz3GAAGQGAIGA4Mohwg/KIsIHyiCCDwAArBnKI4IPAAA3AsokIgCUA2L3yiUC +AQDYFqXap0kEL/bAofHA1gsP9s9wpgCcPxmAsQgeAM91gADcICSFG4EvKAEATiCQB0Eo0CANCNUg +bOEyIQAEkOgKIcAP63LPcAAArRmKI4kIiiSDDzkDb/cKJQAEz3aAANzUQCbAEhIKr/cJ2QDYog9v +/w8gAASA4ADYDyAABAX0BgzP/wPwog3P/wPIJIW5EIAAVOEbeIC4Cq4AIQAEGIiMIMOPAnEF8mG4 +D3gYqYogUg0A2XYOr/wPIQEEJIUbgSh0gCQVHACkngvP/3kDD/bxwM9wgABgMSCAYHkB2IHgyiHC +D8oiwgfKIIIPAACdGcojgg8AAIgByiRiAJACYvfKJSIAz3EqKhUVz3CAAPRYIKDRwOB+4HjxwMYK +D/Y6cBt9z3CmAJw/ZBAQAFMIHyAD3hLw4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44Hhh +vowm/5/u9WG9jCX/n+H1CiHAD+tyz3AAAKQoTtsKJEAEGQJv9wolAATBAg/24HjxwGIKD/bPcaAA +rC86gVIhAQCzCR8Az3WAAMwfKei2D0//AIUB4AClIwhRAAHYz3agAMgfUR4YkCDf8KZDHhgQANh6 +C6AFjbjxps9xBgACdc9woADsJyagAIVCIECAAKUJ9M9xoADIHADYEaED8DYJAAAAhQHgAKUjCFEA +AdjPdqAAyB9RHhiQIN/wpkMeGBAA2CoLoAWNuPGmz3CAANwgA4DPcaAA7CcOgIC4BqEAhUIgQIAA +pQf0z3GgAMgcANgRoQkCD/bgePHAngkP9s9wgAA8MQCAz3WgAMgfYHgg3tClBdhDHRgQANjSCqAF +jbjRpc9zoADALxODIQieBvwTBQAKIcAP63KKIIwJiiOHBfkAb/eKJMIIEIMhCB8A/BMFAAohwA/r +coogzAmKI8cF2QBv94okwghqCAAAz3CAAFgxIIBgeQPYgODcCEIDz3CAAIQrGYAbCJ4Az3GAANwg +TYE+kVMiAADGDOABAdtlAQ/24HjxwOHFz3WAAPw4AIUbCB8AMgnAAtIJD/yWD4/5vg3P/wCFgLgA +pUEBD/bgePHAz3OgAMAvE4MhCJ4G/BMFAAohwA/rcoogjAmKI4cFSQBv94okAg4QgyEIHwD8EwUA +CiHAD+tyiiDMCYojxwUpAG/3iiQCDo4Pz//PcIAAWDEggGB5BNgF6I4NT/8OCAAA0cDgfuB48cBe +CA/2z3WAAPw4AIU1CF8Az3CAAFgxIIBgeQTYEuh2DK/9B9hWDW//CHaqDAADEgoP/44Lr/3JcACF +gbgApYkAD/bgfuB48cASCC/2iiAHBs92gABsG0YLr/wghhXdz3eAAFwUAIbpcVJoAeAAplR6WGEC +gFlhEejPcqAALCBQgkJ413BJawDSANvH92KhiiDHBQoLr/wgiQCGCQiUCgDYAKZhvcMNVZAZAA/2 +4HjxwM9wgADQEg7ZAdrmCiAAANvPcIAACBMJ2QHa1gogAEhzz3CAAPwRKtkA2sYKIAAA289wgACk +EgvZANq2CiAAAdvRwOB+4HjxwOHFz3WAAGI5iiBHBpoKr/wgjQTYog/v+wHZz3CAAGE5AIiKCyAA +II2xB8/14HjxwM9xgABiOYogxwZqCq/8IInPcIAA7F1iCYAD0cDgfvHA2HGK6PoIAAAA2SKgiiDH +BUYKr/zIcdHA4H7xwPoOz/XCCU/8z3aAACwHZtgibgHaugkv/Uhzi+gKIcAP63LPcAAAthTZ24ok +gQk58AIWBRFMJQCAzCWCjwAA//8N9AohwA/rcs9wAAC3FNzbTQYv94okgQln2MlxAdpuCS/9SHOM +6AohwA/rcs9wAAC4FN/biiTBCRXwAZYkbgHaAeAQeEoJL/1Ic6GWj+gKIcAP63LPcAAAuRTi20Al +RBD9BS/3SiUAAAJtEHgmbgHaHgkv/UhzjOgKIcAP63Khls9wAAC6FOXbQCWEEOvxlQbP9c9xoABg +HRKxFJHgfvHAuHE1CFEACQ1SABkN0gMKIcAP63Kn2AW4m9uhBS/3SiQAAEAtgAAUeEIgAQPPcIAA +fBMZYR/wz3CAAIwXMiBAAYwgw4/KIcEPyiLBB8oggQ8AAOEUyiOBDwAAoQBgBSH3yiQhAAK4FHgA +IIEPgABcFChw0cDgfhEIHgIEIL6PAAAAGAHYA/QA2OB/AKngePHAhg3P9c91gAC6BgCNz3eAALgG +Xg/v/yCPQYjPdoAAaDkglw8K3gAB2ACuiiDHA0jwAoAF6ADYAK6QuUDwZwoeAc9ygADQIxqKWwkB +AACVeIpTCMEAz3CAALwGAIhWikMKAQDPcIAA3CAOgDcIXgHPcIAAZDlAgADbDurPcKAALCAQgEJ4 +EQiFDzEBAC0B2kCuBPBgrgDaELqKIEcDRXkQ8M9wgADQHwCIB+gB2ACuiiAHAwbwANgArpG5iiAH +BAoIj/wpBe/1AI7gePHAogzP9aHBGnA6cmh2vQlyAADYmnEVIA0gz3GAACwHABWTEAIVkhC6cOON +IZEBjQHaOGAQeItxWg/v/EhzEugAFAAxQCqCIAQggQ8AAAD/R7lUejMJECDHcoAAfBMY8M9wgAAs +B8GQoY0KIcAP63LPcAAAuxSKI4QAACZEE+UDL/cKJUAFx3KAAFwUABrCBAPuAqoC8AGqJQgeAAzu +A4qAuAOqEm8UeBtiY4tYYIG7Y6jkqgPuJqoC8CWqQiRBIFUJdYBAJUAgKQTv9aHA4HjhxVMgDQCg +qQQggQ8ABgAAQiEBgAQggA9AAAAAyiFiACCq13BAAAAAAdjAeACr4H/BxeB48cCQ6J4Nz//PcaAA +LCAwgcdxSWsA0iKg4g5v/IoghwXRwOB+8cCWC+/12HEKJoCQiHXMIyKABvJCJgYBLyaHAWIN7//I +cc9xgAAoBwChJe4kiAK5NHlDiAPhAhCFACMKHwAKIcAP63LPcAAA4hSKI0gFSiQAAOkCL/cKJYAB +CGEbCF8ACiHAD+tyz3AAAOMUiiNIBu/xARCFAFElAIDKIcEPyiCBDwAA5BTKI4EPAAAnAsoiwQff +8+G90SUigcohwg/KIsIHyiCCDwAA5RTKI4IPAAAuAogCIvfKJIIBKw0eEFElwIDKIcEPyiLBB8og +gQ8AAOYUyiOBDwAANQJgAiH3yiSBASEDz/XgePHAogrP9aHBCHYodxpyAN3PcKAAtA9wEBEAiiDH +ANINb/zJcc9woAC0D7ygi3FAJEIwQCSDMI4O7//pcAsIESBKJAAACPDPcIAA7KYBiProSiSAACDA +ARSCMMlxvg7v/wIUgzDPcIAAYjkAiIDgzCYCkAvyz3CAACgHAICioM9wgABgOaCoMQ9eEc9xgADQ +IxqJJQ4BEBiJUycCEBkKAQAEJ48fAAYAAIDnAdoWicB6HQoAAM9wgADRH6Coz3CAAGQ5oKDPcIAA +aDmgqIogxwAeDW/8yXHPcaAAtA9wGUAEIQLv9aHA4HjxwM9xgABkPYoghwH6DG/8IIGiCc//z3CA +ALgGAJCA4BwMwv/RwOB+8cCmCs//7gnP/1oMwAR2DA/90gpAAdHA4H7gePHA4cXPcIAAaDkAiJDo +7gvP/47oiiBHBADdqgxv/KlxkNmQuQPIoBhAABfwz3CAAGgbAIgQ6M9woAAABCyIjCECgADdCPR+ +DG/8iiCHBJHZkLnq8QHdoQHv9alwz3GAANwg8CEBACgRgAAogWkG7/8A2uB48cAKCc/1CHfPcoAA +0CPPdoAAuAYAlnqKz3GAANAfLQsBAM9wgAC6BgCQeIodCwEAz3CAALwGAIhWihEKAQDPcIAA0R8A +iAPwANg+C+//AKnPcIAAvAZAiM9xgAC6BgCJII6A4gHawHrpcwDdDg3v/5h1z3CAACgHAIABiM9y +gABoGyCWDwgeAQHYAKqKIEcDBPCgqooghwO2C0/81QDP9c9xgADQI89wgAC4BgCQWokxCgEAz3CA +ALoGAJBYiSUKAQDPcIAAvAYAiDaJFQkBAM9wgADQHyCIz3CAANEfIKjgfuB48cAmCM/1z3aAAESt +FI4pCFEABNhmCO/7AdnPcIAAugYAiM9xgAC4BkoM7/8giQDYFK418LaOM+3Pd4AAYDkAj2G4NQ0A +ELIIz//PcIAATNAFgCFtBSh+AM9wgADsXYIKYAMvcYoghwbPcYAAuAb+Cm/8IJHPcIAAugYgkM9w +gABhOaCvIKjPcIAAuAYgkM9wgABiOSCoANgWrjWOCenPcIAAugZyCO//AIgA2BWu4Qev9QHYz3Cg +ACwgMIDPcIAAZDngfyCg4HjxwC4I7//hxc9wgAD4IBCIz3WAAOymGwgRAYogDwqGCm/8iiEKBAKN +JgggACGFAo0hhYYM7/8B2p0Hj/XPcQAArd5hAm/8iiCHCeB48cAOD6/12HGhwRpwi3FAJEIwQCSD +MBYL7//IcAEUgDAI6AIUgDAG6EIgECEvIAckIMDOCO//CnEBFIEwA+miiALwoYiKIMcBDgpv/Mhx +QCgAJkAtAhQFegEUgDACFIEwCLgFeoogxwHuCW/8RXnhvdEl4pAD8iMNHhEKIcAP63LPcAAA5xSK +I80BSiQAAC0G7/YKJQAE3Qav9aHA8cBuDo/1ocEacADez3CgALQPcBARAM9woAC0D9ygiiBHAZoJ +b/wKcYQoCCgAIY1/gABkqCTwQCUAFxYghAMFFIAAhiD+hxvyBIWLcUAkgzBAJE8wOgrv/+lyqBUA +EH4I7//pcSDABBSBAAEUgjACFIMwdgrv/0okwAAB5gyVuw4EkIogRwE2CW/8CnHPcaAAtA9wGUAE +OQav9aHA8cAaDM//4g+ABNHA4H7gePHAzg2P9c9ygADcIACCz3GAAAS6uhAABiW4UyAAgAqhANgF +oQ2hVfIDghiIowgQAYogSQbaCG/8iiGKBs9woACwHzuAiiAJBsYIb/w2uc91gAAgWACFQiAAgMog +YgAzCFEAsg8gA6lwz3aAAPBXAIZCIACAyiBiAIvoiiAKAZIIb/yKIUoJyXD6DyADIoXPdYAAOFgA +hUIgAIDKIGIAMwhRAHIPIAOpcM92gAAIWACGQiAAgMogYgCL6IogCgFSCG/8iiGKDMlwug8gAyKF +bQWP9eB44cUA289ygACwuhQiDQBgtWi1GmIgGsIAwB3EECgawgDPcYAAXLoWeSKRMBrCANAdxBCA +HdwQeB1EEAHZiBpCAM9xgABQuxV5YKHgHcQQ8B3EEOB/wcXgePHAwgyv/A/YtOjPcYAA0CPPcIAA +uAYAkFqJSwoBAM9wgAC6BgCQWIk7CgEAz3CAALwGAIg2iS8JAQDPcIAAMDEAgJXo3g3P+4DgC8jF +IIIPAQAA/An0BSCADwAAADwLGhgwC8iQuAsaGDDCD8/7BPDmCI/20cDgfgDZnLnPcKAArC89oOB+ +4HhdBM/74H7geCCAANqA4UX2AdozeSCggCEBgH/cwCEEA0e5IKAD6jN5IKDgfqHB8cDhxazBANlK +wZDZGLlIwc9zgACguiCDBCCNDwEAAMCGIf4DJLkOuQslQJBOwI7CFvLXdQAAAEDMJYKfAAAAgMwl +gp8BAAAABPQhgwPwIoOuuK+4sLgFeSCiDsMIwIt1BCOBDwEAAMAuuUApAgZFeEjAiiAGBknAQcOp +cE4JIAAA2s9xgABoGRqBO4EkeCUIHgIKwAvBhCgEDgAhgH+AAGzSArkI4DR5IWDPcKcAiEkvoF4L +oAOpcAjcpwOv9azA4HihwfHAJguv9QhyrcEI2ErAkNgYuEnAz3CAAKC6oIAEIY4PAQAAwIYl/hMk +vQ69CyZAk1DBkMMW8td2AAAAQMwmgp8AAACAzCaCnwEAAAAE9AGAA/ACgK65r7mwuSV4AKMQwwnF +BCOBDwEAAMAuuUApAAYFfUnFHwqeAQrABCO+jwAAABhFIMAASsAF8oUgEAFKwCUKHgGbvc9woAAs +IAWAANsCuG64gODKIMwAybileEnABvAJCh4Cnb1JxRDAgcVCwEYIIACpcAPIDMLPcYAAaBm5GIIA +GoE7gSR4GQgeAgK6z3CAAHTSVHpBYM9wpwCISS+gWgqgA6lwCNybAq/1rcDgePHAIgqv9ZhxIYCj +wUDBANtqoG0JXgIEIYIPAQAAwC66z3OAAKBjSmNJIoIAYbpLoHJqdHvHc4AAZNOqg892gAA4vKag +a4PPdYAA3CBloKOFIMO0hdWOZH3EfQm9QCwOAsV9BCGBDwAAABCle2V5J6AogBjinrkooEugjPA5 +Cp4Cz3KAABhZQIJBwkLCIsMjCh4Cz3KAAKhjamIXCpIADwqRAAbaYcIBwiHwB9r88WHDAcId8M9y +gADcIKSCMCWCHwAAdAUjCpEBBCG+jwAAABgL9EiFBCK+jwAGAAAF8gHdqqAocgTwaqAocgDdTwke +AkLCIsOg48onwhDKJyEQBCKODwEAAMBBLoYTz3aAAKhja2YEIoIPBgAAADG6ACLFAM9ygACgYzIi +ggECIkIBFieDEGugIMJOZhXwUyLDAH17z3aAAIRna2YEIoIPAQAAwC66z3aAAKBjSmZhulZ7a6AB +3oQtBB4AIYJ/gABs0gK7dHtlYmG+emKmoEGCBCGBD+8AAN0mucV5UiHBA0WgJ6DPcoAAoLpDggDZ +HwoOAc9ygAA4WUCCFwoeAIYifw9dekAqwQMD8ADZj7lIgCV6SKDJAK/1o8DgePHAXgiP9c91gABw +MQCFxJDJcKYIoACGIPwDAIXJcQoJYACGIfwDz3OAAHy8CwiRBiGDgLkho0qDAeJKo89zoADEJ5ET +AYbDuRsJgQCKJQgQExtYg5ETAYbDuQsJgAASG1iDaQCP9eB48cD2D0/1z3WgAMQnUhUAlhUVAJZR +IMCAyiZiFAb0USDAxgDeyiaiFEIVAJaW7gQgvo8AwAAACvLPcYAAALwBsQCRtg/v/TSRz3AAAP9/ +Ex0YkBvYFh0YkM9woAAwEE2Az3GAAHg7HuoKgQHgCqEIgVhgCKHPcIAA0B8B2kCoz3CAAAC8H4AR +CJ4Dz3CAAEwGQKAI8A0I3gPPcIAAUAZAoKEVApYJgVhgCaGP7s9ygAAAvB+CEwgeBJTYNgrgAagS +AQCeCQAFnQdv9clw8cDhxaHBxgvv+4twsugAFAUwHQ0eAH4IAADPcYAAALxDgc9xgAAArkGhJPAL +DZ4ABg/P/x7wDQ1eApYOz/8a8DsN3gAI2M91oADEJxMdGJDGDcAAHQgQBQLYPB0AkM9wgAAAvCOA +z3CAAACuIaAZ2JcIUIYpB2/1ocAKIcAP63IX2Iy4iiOGC0UGr/aKJIMP8cDhxc9wgAAAvD+ABCGB +D///jzgEJYBfAABwxyV4z3GAAAC8H6FEIgBTz3WAAAC8ANkTCBECDw1eUQHYnB0AEATwnB1AEADY +5QgQAM9woACoIAiADw2eU89wgAAwIQWIDPARDd5Tz3CAAKgmCYgG8AOFkgyv9iSFmB0CEB+FEQgf +AQ0N31KA2JgdAhCYFYAQQCgBBhEI3wGCuR8KnlMaDoABG/AfhVEigNOzuB+lxSGCDwAAAAdFIQAG +z3GAAIy8LImGIf0PUiHBAUW5JXjPcaAAiCQQoYog1gDPcaAAxCd+GRiAz3CgANQLAdpSoATYEBkY +gM91gAAAvB+FRwieARSVQwhfAc9woAAsIA+Am+itcUIOL/pWJUAVgBUAEJS4gB0AEB+FkLgfpQ3w +z3GAAPw6D4EB4A+hENnPcKAAkCM9oM0Fb/UZ2PHASg1v9QDZCHYBgMG4g+DKIEEgBfI+DiAAyXAa +cEwgAKDE9BCGUSCAgcDyEIbPdYAAALwPCJ4Dz3CAADAhBYgN8BCGDwjeA89wgACoJgmIBfAFhiaG +ZguP9pgdAhCAFQAQBCC+jxBwAAAH9K1xng0v+lYlQBURhs9xgADoBgChQSgBA1MhxQCYFYEQQSgG +BRRpBSBEAQ8J3gEehZW4HqV58CIJ7/tPJEAC6wgVBM9xgAB8opgVgxDwIQEAQCsCBoYj/Q9SI8MB +Rbtles9zoADEJ0EbmIAA2oy6AiZPAPpiy7rXcgAAAAhALQ8DkL9S9wUnjxFiG9iDjCICgMf3z3GA +AHA8B4EB4AehANmduUXw5XliG1iAWQ6FcAAAwA8OIoMPAAAAEM9ygADcoRZ6IIIlCzUIBBIFAADY +DyDAAGG4TiMPCAEpwgN4eQV5AC3AAAV6F/BCIwMIANgPIMAAYbh4eQUhAgCKIf8PC/DPc4AAcDwI +g4oh/w8ocgHgCKMB2M9zgAB0rgCrAhsEASGjQqO98QDZnLmAFQAQJXiAHQAQQCYAEqAdABAC2c9w +oAD0JiOgJYbPcIAAAK4hoPEDb/UKcOB48cB6C0/1CHZVIFAEDcyiwe240SBigAfyBMiKD6//mBAA +AM9wgAB8vAyAz3GgAMgfZOAeoRDYDqEB2BUZGIABhoPo/wsewAGGwbiD4OL0ABAAIEHABBQAMUEo +EQMQhgYUEzGHCJ4BDcyDCN4CEIbPd4AAALwPCJ4Dz3CAADAhBYgN8BCGDwjeA89wgACoJgmIBfAF +hiaGYgmP9lEgwIGYHwIQAd0K8h6HAN2VuB6niiAFCR4O7/upcZgXgBDPcYAAyLAEuEaRBSBABBUI +gADPcoAA9DsdggDdAeAdogSRJQiBDwAA//8A3Qzwz3CAAPw6LYAA3QHhLaDWDe/7iiAFDAGWnOCG +9AQQEiAIEA8gz3CgAPQmAtkjoCOGz3CAAACuIaBuCyAAyXCA4ID0JO3PcqAAxCwcGoAEz3GAAIy8 +6KIsiUApAyMQuZ+5ZXlBKwMhZXkmog0SATcdCd4CENqruQwanDANGlwwz3KAAPQ7JIIB4SSiDRIB +Nw0JHgMa2Ky5DRpcMKUNEBDPdYAAXJPgFQMQRYZEKz4HACVBHkChTJYB40Kxz3KAAIy8zIrgHcAQ +z3KAAMiwyKkJGUIEChnEBAwZgAREkuShQCkDIxC+QSsNIcV7pXtKsc91oADAL0cd2JCU4sAihg8A +AJMAz3OgAGgs8COCAEuxjxUDlgfwoxUClo8VA5YRCh8B9wvegQfwCNgM8Oe7yiMhAEDDARSCMMa7 +xrpYqXmpqQFv9aLA4HjxwOHFz3GAANwgI4FIgVkKHgCGIP8Bz3KAAKBjQ7gKYgDbgOLKIcEPyiLB +B8og4QfPICEDyiOBDwAAbgDKJMEAwACh9solIQDPcKoADFATCrQAuYGAvbmhAdkloATwoL25oWWg +bQFP9fHA9ghP9Qh1DcxTIECAB/IEyPoMr/+YEAAAAYXBuIPgyiYhEAXy0gkgAKlwCHahDhEQEIUJ +CJ8BANk98AzMYQjeAA3MUyBAgBUSAjYR9AAigA+AADi7AdkgqM9wgABwxhKIUSAAgJAJYgPKIEIA +ENgMGhwwz3GAAHg7FIEB4BShA8gVEgE2hBACAc9wgAAsuzV4KYBZYSmgGt7Q8c9wgAD8Oi2AAeEt +oI4L7/uKIMUJAdnPcIAA0B8B2kCoz3CAAHy8ToAGggHgBqID8AHZAtrPcKAA9CZDoEOFz3CAAACu +gOFBoIALQgJ5AG/1yXDgeM9zgAAAvFgTgQAA2o7pPJNiuRC5RSFDAc9xoAD0JmOhz3GAAACuQaHd +AAAA8cDaDw/1CHYBgMG4g+AA3QXyygggAMlwCHW17RCGTwieAQzMz3KAAIA6MQheAUDYDBocMFIS +AAbPcYAAsLoB4FIaGAAVyADaFHkDyECpoguv/5gQAAAL8KwSAQAB4awaQAC6Cu/7iiAFCs9wgADQ +HwHZIKjPcIAAfLwugAaBAeAGoQLZz3CgAPQmI6Ajhs9wgAAAriGgsQcv9alw4H8I2PHAOg8P9Qh1 +KHYklW4K7/uKIMQLAZVBLgERw7nPcoAA2Go2eiGCBOAwcAjYBPQggmB5qXBxBw/1z3GAAHy8LIHP +cqAAyB9k4T6iENkuogHZFRpYgCGAhOn9Cx7AIYDBuSEJ0QDPcIAA0B8B2SCoz3CAAHy8LoAGgQHg +BqEA2Q3wIYBRIQCAANnKIeEFAYBRIECAyiGhBOB/KHDgePHAng4P9c91gAB8vAGFBCC+jwBwAABX +8i8pAQDPcIAApDn0IE4AK4VPJoAQagmgAUmFkOiMJgOQz3GAAOw8BvQUgQHgFKE/8BOBAeAToTvw +AYVlCJ4Hz3WAAHDGEI0ujV8JAAASjVsI3wAwrTIPIAMC2D0IH0OaCUACEI2GIP8BQ7gQuE8gwQbP +cIAA3CADgDIggA8AALACn7mA4AHYwHgPuCV4z3GgAPxEDaESjYS4Eq0H8ADZz3CAAHSuIKhKCMAE +SQYP9eB48cDSDQ/1CHYBgMG4AN8nCNEAz3WAAAC8jw8REBCGdwieARCGGQieA89wgAAwIQWIEvCm +Du//yXAId+3xEIYRCN4Dz3CAAKgmCYgG8AWGJobuC0/2mB0CEBEI3gEehZW4HqUfhZe4H6WAFQAQ +BCC+jxBwAAAP9Jy4gB0AEDCGEg7v+VYlQBVAJgASoB0AEADYBbYB2c9wgADQHyCotBUBEAaBAeAG +oVgVgBCZ6J4OT/sF6BCG7bgB2AL0ANjPcYAAYrz0IQAAPJU4YGK4ELiAuM9xoAD0JgOhBvAC2c9w +oAD0JiOgJYbPcIAAAK4hoE0FL/XpcPHA2gwv9QDZCHYBgMG4g+DKIEEgBfLODe//yXAacM9woAAs +IAaAEHhMIACgz3WAAAC8yiciEE70MIZlCZ4BPJUTCQMAJYbPcIAAAK4CgKsJAQAQhg8IngPPcIAA +MCEFiA3wEIYPCN4Dz3CAAKgmCYgF8AWGJobWCk/2mB0CEIAVABAEIL6PEHAAAAr0yg1P+zHoEIZf +CF4DAd8E8ADfEPAwhvoM7/lWJUAVgBUAEJ64gB0AEEAmABKgHQAQAdnPcIAA0B8gqLQVARAGgQHg +BqFYFYEQz3CgAPQmnOnPcYAAYrxclfQhwQNZYWK5ELmAuRHwAN/W8bQVARALgQHgC6G0FQEQiiBF +CxoPr/srgcjxAtkjoCWGz3CAAACuIaAhBC/1CnDxwL4LD/XPcKAAqCAIgM92gAAAvA8NnlPPcIAA +MCEFiAzwEQ3eU89wgACoJgmIBvADhvYJb/YkhpgeAhAfhhUIHwERDV9TDQ1fUoDYmB4CEJgWgBAZ +CN4BX4Y+hrO6lbmXuj6mX6YA2QHdF/CcFgEQIwlRAD+GUSFAgs9xgADcICOBKYEE8kQhDQQG8EQh +DQIC8AHdBNkYuCV4z3GgAIgkEKEfhjEIngEUli0IXwFKCsABkujPcKAALCAPgAToDcwVCN4BH4aQ +uB+mrXGqC+/5ViZAFZntDQqeUwILQAEV8EQiPtPPcYAAALwP9AGBGwgeAJgRgADPcYAATMgFuABh +/rj4DML7z3CgAFAMoIDPcKAAkCME2T2gz3aAAAC8H4YNCN8ED4aA4ADYIPJNcdINr/uKIEQON4aK +FgIRuWEE4gkIn0T9CR7Gz3OAAAC8ihMAAU8TjQDPc4AA3CBjg0J5ong2Ce/7T5PBAg/18cDhxaHB +ANhAwM9xgAD8Og+BAeAPoQPZz3CgANQLMaDgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44Hjg +eDGgENjPdaAAxCcQHRiQpg5v+4twlugAFAUwHQ2fAAohwA/rcg3YjLiKI58NiQFv9ookgw8E2RMd +WJAb2RYdWJBFAi/1ocDgePHAz3CAAEyuTgiv9hjZz3CAACyeQgiv9hjZ0cDgfuB48cCiCQ/1GnDP +daAA1AsQhQDeocFAxiEIUAAKIcAP63IP2Iy4iiOWC4okgw8hAW/2CiUABM9xoAD8RBmBBCC+jwAA +CCAC9B2BEQjQJP4Nb/uLcIDgyiACIEIgwSCU4U4BDQAyJkFwgAAAYEAngHI0eAB4z3CAAHy8LoAI +gQHgtgrgAAihEPDPcIAAfLwugAeBAeAHoQjwz3CAAHy8LoAMgQHgDKEA2ShwLvDPcIAAfLwugAKB +AeACoSTwz3GAAHg7AoEB4AKhHvDPcIAAfLwugAOBAeADoQHZANgW8M9xgABwPA+BAeAPocIJIAMB +2EYKwADa8c9xgABwPAmBAeAJoQHYCHGA4YwKggDPcIAAALwfgBcI3gTPcIAAmKHLqM9wgADMnsyw +A9gRpeB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4EaW5AC/1ocDPcZ8AuP8YgZC4GKEY +gbC4GKHPcIAAfLwugAWBAeBOCCAABaHG8c9wgAB8vC6ABIEB4DoIIAAEobzxz3CAAHy8LoARgQHg +EaG08c9xgAB4OwuBAeALoX7xCiHAD+tyQdiMuIoj2As48eB48cDqD8/0z3CAAHy8DIDPdaAAyB8Q +3gHfZOAepc6lFR3YkyIJoAQJ2APYHqXOpRUd2JPPcKAADCQHgATo9wsewBEAD/XxwOHFz3GAANwg +I4EpgVEhQIDKIKIAJ/REuM9xgACUOcO4CWEJCR4ANQ2fUTUJXgDPdYAA3CADhRiIIQhQAOIIT/sI +6M9wgABwJhSIDQjQAQOFGIgNCJEACQ2eUQHYA/AA2L0Hz/TgePHAOg/P9EQiEFNNdoYm/BNNcE1w +BCWAXwAAACBBKH6DBPKWCE/7hOgA3wPwAd/PdYAAALwfhQsIXgQA3Zrw/wgRoHYIT/sf6M9wgABw +JhSIh+DMIGKCF/QBhYwg/48T9CSVz3AAAP//GwkBAAWFjCD/jwn0DJXXcAAA///KJWEQePLPcIAA +3CDwIMEDCYEPCF4Bz3CAAEhkBPDPcIAAVGQ4iSpgQS4AEc9xgABgZAhhFnrPcIAAWGtIYA8IHgA/ +hYYh9o8V8g0IXgA/hSMJngIJCJ4ACQ0eUgHdDPATCN4Az3GgAAwkMYGMIf+P9vMA3VEggIHKJSIQ +vg8P+wfoBCW+3wAAACLKJWIQJ+3PcYAAALwfgR8IHgKMJgKQzCaCnwAAUADMJoKfAADQAAP0k7gf +oc9wgADcIAKAuBAABhrojCYCkMwmgp8AAFAAEvRPgUV4D6EN8M9wgADcIAOACYAPCF8AjCYCkAT0 +CQieAQLdLQbv9Klw4HjxwLoN7/SA26LBAN3PcYAAALy+ob+hr6FPGUIDgBlAA4wZRAOYGcIAhBlA +A89yoADIH6QSAAD4Eg4ArBlAA0IZRAPCeLAZAADPcIAA2JO5oM9wgAC4vKCgBN7PcIAA6AbAoJkR +gACguJkZAgDPcKAAxCdkGFiDz3YAAP9/ExiYgxveFhiYgxoYWIOKJ/8fz3agAPxE/ab5poonmB3P +dqAAUAzipnGicKI8GECDiiMYCG6igBIDAKQZQANRI0CAz3OAAACuWBlCAwvyQhAAhgQgvo8AwAAA +BfIBgwPoAqOho4AaQAPPc4AAgDrPcIAA3CBDgDUJnkMfgYu4H6FVI8AFtBkAAArYHLEbkpYZBACK +IEQL+g9v+wDZBtnPcKAAyBwpoBDwQCMAA7QZAAAQ2ByxGpKWGQQAiiCEC9IPb/sA2c9xoADUCxCB +HQhRAAohwA/rcgvYjLiKI5UDiiSDDxEEL/a4cwHdsKFRIEDGeAIhAMol4RDPd4AAALy0FwEQAIEB +4ACh+tiGDO/7ANkg2M92gADYvLoK4AIApgHYz3KgAMgfE6IYgnmCANlUEgQA+BICAAIggIABpgDY +AyNDAFAfBBBSHwQQVB8EEAIkgQDPcIAA3CBipkOAI6YUkkAmEBXPcaUACAwJtgiCwLgItgARBABT +JEUBUyRBAEwfQhGD4cohwQ/KIsEHyiBhBcojgQ8AALwMWAMh9s8gIQMEJIEPAAAA4C25f4eaH0IQ +FB4AERsL3gIEuYG5JXgItgfYCPAA2RUgDCAgpALwBNgB4PUIFIIIguu4GAjCBB+HK7hTIBAAUSCA +xaryz3GAAIQrG4EB4A94G6FBKYBDz3GAAIQrW4HPcaAAtA83gcC4AN0VCkEAz3GgAKggJoGMIYOO +xPcD3aDwCQgABATdnPDPcoAA2Lxlgs92pACQQfWGFoYEI4MPAAAA4C2756LPcYAAALwIog0LHgBQ +GcQDCfBQGUQDBCePH///AADnog8LXgAwv1IZxAMF8FIZRAPwf+eiDQueAFQZBAAJ8FQZRAMEIIAP +//8AAAiiDYYGogQggA8AAAD+KbhWGQQAH4FHCN4Cz3CqAAAEBIAJos9wgAAsnmCIpGg162ELdAAC +EIQAn3MA2KgggAP0JQ8QFd4TvvAmzxPPdoAA2LsVfgHg4KYc8M9wgABMrmCIpGgZ6wIQhACA48ok +zXDKIC0A6CCtA/QlDxAp3hK+8CbPE892gADYuxV+AeDgpmGqAhoCAbQRAQAC3QGBAeABoRbwBCC+ +z2AAAAAI9IoghQdGDW/7DBIBN27xEQseQIogxQcyDW/7ANli8YHlQfMvDZEQAt0EIL7PgAEAAMol +ohEG9FEjAMDKJeIQ6w2QkM9woAAwEAOAgODKJWIRhuUOBAIAz3aAAAC8HJY/hmK467kQeHXyz3Gq +AAAEooHPcqUACAxAggQljx8AAAD/KL8EIoIPAAAA4Ft6ib9Ff89ygADcIAwSBADypiAUAgDPc4AA +2LwEIr6PAAYAAAPyjL/ypu2jrKNAgUgWjxCU50qjGfIG9jMPkRIjug7wHQ/QHe7nE/RFKv4CQSnC +cFElwJHCImIAB90L8EUq/gJBKQJx+vEiuvjxANoI3SGBV6Zcsyuj5LnKJSIS4bnKJSEShiH+D0Ep +DwFNHsITKJPleSizIQ3RERsKtAMH3YgUAQATCYQAz3GgADAQKIEJCkAACN2H5SwJ4fvKISEAFwMA +AM9xpgAIBCGBBCGBDzAAAAA0uUIeRBBCFgERFwhfRs9yoACoIEiCWWHSCO/7MHkD8PIIz/sEIIBP +gAEAAADZMQiBDwABAAAB2E4eAhDPcoAA2LyaFoAQQh5EEE0eQhA3pimiBLgokom4JXgIsnPwz3Cm +AIwDHYBNHkIQz3OAAAC8BCCCDzgAAABBKsEEmh5CEAQggQ8AAADwLLklukV5MqYNCN5HMoOMuTKj +UyDCAkgTgQBXo+C50SDihwfdA/QI3c92gADYvAmmmhOAAOiWBLjleAi2XLYSgw2mfQ3REc9wpgCM +A72ABCWAHwEAAAAwuE4bAgBOE4AAqaYb6FsJUQNTCB9GFNjPcaAAyB8eoRDYDqEB2BUZGIAK3VEg +AMbKJeIRUSMAwMolIhLxDZCSFPAnCpQDz3CAANwgA4CIEAAAFwiEAM9woAAwEAiACwoBAAfdAvAI +3Yfl3fTPdoAAALxOFoAQgODV8s9ypgDUBCwSAYA0EhKAOBIPgMsSEAZKcMa46XKGIv0PBrpFeEpy +hiL9DwS6RXgEIYIPAgAAACe6RXhEJwIcDbpFeOlyhiLzDwQhgQ84AAAADroluUV4JXhEJ4EQFLkl +eIi4RCcBEkEpwYBSIEAFEqZYHkIQyiGCDwAA///KIYEPAAAQHzpxN4ZAHkQQBCKBL/8DAP8ouTem +cguv+QDarB4AEHEPnhRIFoIQcoag4tEj4YIw8gQjgY8AAAABCPLPdYAAqGNNZRUNkxAEI40PAAAA +JEENgB8AAAAkBCODDwYAAAAxuzEL1QAVC5EAFOnPc4AAqGNLYx0LkQAD6cziCvY3hjJxyiGODwEA +iA3MIE6AzvcVDgVwAQCIDc9xgABwPBGBAeARoQjdK/DPcIAAqGNNYM9wgABgMSCAYHkG2B8IRAMS +hikI3gLPcIAA3CADgAiABCC+jwAGAAAI9OIMAAAIdZTgyiXiEwvwz3CgADAQCIA3hhBxB93KJWIS +WBaCEM9xgADYvAiRB7qIukV4CLEXhjAZAAQcsRKG66ENoawWABAoGYAEHbENDdERYggAAAh1gOX0 +C6L/yiBCAwDYz3GgANQLEKHPcIAAjLwNiBEIHgDPcKAAiCQegAsaHDAuDkAADMyGIPmPCvSE5cwl +4pAG9ADYj7gMGhwwMtnPcKAAyBwqoJkFr/SiwPHAQg2P9M9woADUCziAQiEBCEghAQDPcIAAhCsa +gIHgiiCZDgj0z3CAANwgA4AfgIAgmQ4wcADdyiVtFHMNERDPdoAAALxYFoAQgODKICIAIfQMEgE3 +JQneAA3MUyB+gAzy67gXhgbyoOAB2MB4CfCO4AHYwHgF8CUJXwEA2M9xgADcICOBKYE9eVIhAQDA +uSR4COgfhpG4H6YL8BeG6vFODAAAWBaAEIDgKAsBAIDlaAICAM91gAAAvFgVgBAU6ALZz3CgAPQm +I6DPcYAAAK4A2AGhwNmZFYAQgLiZHQIQKHAD8ELYz3GgAMQnvxkYgADYDBkAgAHYEBkYgB+F8bgG +AgIAEoU3hfYIr/kA2qwdABAfhVKFz3OAAIQhQCMBBOu4z3CAAPwmQCAEAUAgBgVIFYAQWPLPc4AA +3CBjg9SDBH5EJg8RRCAODEIuBxHgd1MnRBAyIQEBibk8pTSDcBWOEM93gAD4YwQmRRBNFYEQhib/ +E0S+BCVFAKB29CeOE2IdhBMyJg4Bib7dpXQVjxDUg+R+hif/E0S/JH7+Zs93gAD4Y/QnjhNapXSD +ZB2EE2R4BHngcc9wgAAIZPQgQwBbpc9wgAAwZPQgQACOHcQQkB3EEJIdBBCUHQQQANhOHQIQhfBO +FYUQz3eAAAyuz3GAAByuz3aAAGSuqQ0QAAQigg8AAAAIW3vCuAAggg+AANwgvBKCAAUixQAAIIIP +gADQJkQSggBoHUARBSLEAAAggg+AANwgxBKCAGV6XKVwFYIQw7pcevQnghBsHQARYh2EEAAggg+A +ANAmTBKAAGV4HaV0FYAQw7gcePQnABBkHQQQaBWAEMO4HHj0IQIA9CYAEI4dhBCSHQQQbBWAEMO4 +HHj0IQEAkB1EEPQmABAl8MO4HHgLY1qlfKVwFYMQw7t8e/QnwxD0IQEAYh3EEDIkAwCOHUQQfaV0 +FYMQw7t8e/QnwxD0JgAQW6WQHUQQZB3EEJIdBBCUHQQQ0gzAAM9wgADcIAOACIAPCN4CThWAEIDg +GA1CBFgVgBAF6BILD/8D8H4MAAAIdZECr/SpcOB48cDhxc9xoADEJxURA4YE2BMZGIAb2BYZGIAD +2s9woADUC1Gg4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HhRoOS7yiWiFSn0UhEAhuC4 +yiXhFSPyCwheAAsL3gAS3R3wAdnPcIAA0B/PcoAAALy0EgMAIKgGgwHgBqMfghEIngPPcIAATAYg +oAjwDQjeA89wgABQBiCgFd2KIAQMxgwv+wDZ8QGv9Klw4HjB2BQaAjDPcYAA3CADgRiIAdvPcoAA +ALyG4BeCwiPBAAzgGCDAAGYaBABmEgABA+AEIIAPAAD8/524n7jscwCjBcjscwCjA4EYiDeChuAB +2MIgAQAYIQEA7HAgoOB+4HjxwBIJj/TPcIAAALwygCcJXgLPcYAA3CAjgUgQggA0gUR5USGAgEja +yiKBDwAAkAAC8A7aAN/PcaAAqCAngawQDQBZYbFxwiVFEMol5hKweAYJr/sK2c9wgAAMOACQz3ag +AMQnCwgeAYwlA5ID9wDdGvDPcKAAtA/8oM9wqwCg//qgBgzv/QDYGRYAlgToAtgQHhiQz3GAAHA8 +EIFqvbhgFN0QoRkWAJaH6FEhAMa8CSEEyiBhAMUAr/SpcOHFz3GAANi8QYnA2xQawjDPc4AA3CBj +gxJqR+AEIIAPAAD8/2mDKrvAuxe7x3MADgAAZXjscwCjBcjscwCjSiTAcwDbqCDAAfAhzQDscKCg +AeMdCnQAANnPcIAA2LvwIEMA7HBgoAHh8QmEgADZz3CgANQLLaALzAHgEHgEIIAPAAD/v4+4Cxoc +MM9xoACIJB6h4H/BxeB48cC+D0/0z3eAAAC8oJcIdqlxhiH8A0IpBQFEJQgTjBcBEUIoiBBA2M9z +oADUCwoiQIAPo8oiYgCsFwAQQCqGBc9ygADYvC8kCAAdsjgSBwFALAQEBScAAQujQYoCukjiT6Nm +FwIRWWEweWYfRBAPDZ8SDpdTIMCAEPLPcIAA3CADgAmAUSAAgD3YwCjiBcogoQfAKCEGCvBAKAAR +oHDPcoAAHCAIYhe4A+EEIYEPAAD8/wUggAEleJ24n7gLowvMAeAQeAQggA8AAP+/j7gLGhwwz3CA +ANwgzaMDgAiAIwjeAh8OHxH2CWAEyXDPcIAAFL2g2cTaPdsmDuAAF7spB0/04HjxwOHFz3CAACwH +AJDPcYAAGLio2gHdgCBECxB4dgmv+6lzgODKIcEPyiLBB8oggQ8AALUUyiOBDwAAzADKJCEAIAah +9colAQE+CEAAz3CAANwy4QZv9LSg8cAA2c9woAC0DzygsghP+G4ND/6+D8/7vgnv/QDY/9nPcKsA +oP85oDig0cDgfuB4AdoA2c9woAC0D1ygz3CAAPQ7K6AJBm/7F9jgePHAGg5P9IYJoAEIdc9xgAAA +vB+Bz3agAMQnsLgfoRkWAJYA2QToAtgQHhiQz3CgANQLN6DeDYAA4g5gAgHYBe1iDwAABfAKDwAA +bg5P+xkWAJYF6ALYEB4YkC0GT/TgePHArg1P9KLBi3ZSCu/6yXAKJQCQGfTPcIAAALzPcaAADCQ7 +gVeAMHLKJSISIIYNCR4EAtmMGEQABCWCXwAAcMc/gEV5P6CA5cQDAgAAwOm41vLPdYAAcDEAhYoh +CADkkM92oADEJxMeWJDPcYAAALw/gTp3hiH8I4UJXgRBKQEhw7nPcoAA2Go2eiCCQHkIdRkWAJYE +6ALYEB4YkM9wAAD/fxMeGJAb2BYeGJAD2c9woADUCzGg4HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HjgeOB44HgxoM9wgADYkxmAgOCQDcIAmuUkAwIAz3CAANzUkgmgAgDdFQMAAI4OAAESDW//KnAa +cACFeg0v/ypxDg4v/wh3iOfMJ+KVyiXBEyvyGwgQIPIKIACBwAolAJAc9MoM7/8BwBjwA9nPcKAA +1AsxoOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4MaAA3Q8PkRbPcIAA3NQSCYACgOWU +AgIAz3CAAAC8H4ARCJ4DAdnPcIAATAYgoAnwDwjeAwHZz3CAAFAGIKARFgCWAN1BwDEInwCuCO/6 +gcAKJQCQEPQEFAUwHQ2fAAohwA/rcgrYjLiKI4cMjQOv9Yokgw+A5TQCAgAE2BMeGJAb2BYeGJDP +cIAA2JMZgIDgfAzCABUCAADguMbyz3aAAAC8EoaGIDoAjCAEgngNBQHPcaAADCQ8gReGInhkuBB4 +ih4EEEQiAFMXCBECH4YPCF8EUSVA0QHYBfQA2APwOgxP/5weABAu6LIPD/8KJQCQ3PQNzCEI3gEf +hh0IngEvIIcKjCAChgj0z3GAAAC8H4GYuB+hngkgAIHACiUAkMb0z3aAAAC8H4YrCB4EqBYBENTY +Hg6gAMlyB+iGDcADC/DGCE//sfDPcYAA7DwTgQHgE6EB389wgADQH7QWARDgqAaBAeAGoR+G87iE +CgL7D4aA4KAJAvsfhhEIngMB2c9wgABMBiCgCfAPCN4DAdnPcIAAUAYgoADYz3GgAMgcB6Ew2Aqh +8grv/wHAiiCEDeoN7/oBwR+GKQgeBhDYDBocMM9wgADc1FoPQAIVyAAggQ+AADi7H4bgqbi4H6YA +loYg/ACMIAKAG/TyC4/6l+gD2c9woADUCzGg4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HgxoACWOgrv/DSWRPBBwBXfCQjfAOl1IPAI2M92oADEJxMeGJAGCc//CHUtCBAFAtg8HgCQIRYB +ls9wgAAAriGgERYAltEIn4CWDq/6gcAKJQCQ4vM9DVEVz3CgAJAjHoAEFAQwUSCAgMohwQ/KIsEH +yiBhAs8gIQPKI4EPAADuBGABofXKJSEAkg+v/4hwCHWpcAECb/SiwPHApglP9KHBCHYA2EDAAKY2 +Dq/6i3AKJQCQhfTPcKAABCUigACGBCGBD/8AX/8FIQIAQKZTIYIAUyCDAGV6pQrRAc9wgAAAvB+A +eQqeU7cInwYEIL6PAB4AAAT0AIYJ8AEKn0AAhgsKHkCFuACmz3KAAAC8P4IRCV4GiLiLuI64AKZB +8CkJ3gZPIAECibmNuYu5jrkgph6CBCCADwIAAABSIEAEKrgleACmLfD8ucUggg8AAAAF5PWFIBwA +AKYj8PW4AIYf8oYgHACFIBgAAKYBCh9BAIYvCt5AhrgAphPwUyEDAFMgAgAFI76AyiXhFQnyhiF/ +D4Ygfw8FIT6AyiWhFM9wgACMvAyIxLhAKAEGAIYleFEggMQApuAJ4gPKICIIqXDtAG/0ocDgePHA +dghv9AXYAN0LuK4Ib/upcUoMT/XPcIAAALwfgBsI3wKE5QwBBgBRIEDFgvTTCB9FAeVm8ADZnLnP +cKAA0BswoAHZz3CkAJhAPKAEIL7PMAAAAAHlyiUiEGMLH0DPdoAAVAYAhhMIHgDPcKAATBwDgF0I +nwALCF5FawmeQx8I3kUbCZ5Dz3CqAAAEAYCGID8LUwjQABoJAAAg3892oADIH/CmAdhDHhgQANgi +CeADjbjxppkNFJEV8PYIAADPcYAA9DsLgQHgC6EN8OIIAAAC2ACmz3EAAN8O4grv+oogmAEA2hEI +HkcA2Zy5z3CgANAbMKDPcKQAmEBcoBrwAN0hCx9AIN/PdqAAyB/wpgHYQx4YEADYugjgA4248aaD +8Y4IAADPcYAA9DsLgQHgC6GtBw/0DMxEID6KOfJBCN4ADRICN4DYz3GAAHg7DBocMA0K3gIagQHg +GqEF8BKBAeASoREK3wAA2c9woAAsIC+gDcyGIIIC4H8NGhwwLwheAYogBAAMGhwwz3GAAHg7EYEB +4BGhDcwA2UYggAINGhwwz3CgACwgL6DgfuB+8cDKDg/0AN/PdqAA0A/1pgPdEvDgeOB44HjgeOB4 +4HjgeOB44HjgeOB44HjgeOB44HjgeGG9jCX/n+71A9k6ps9wgACEK/ugOqYB2BWm5QYP9OB48cCu +D8///g3P/w4PD/vRwOB+4HjxwOHFz3KgANAPsILPcIAAhCs7gADbDw1BEAPZOqJ7oAPwzg/P/7UG +D/TgePHALg4v9ADZB9gacTpwAN5AKAAhFHjHcIAAGLgVII0DAJWMIAKNAN+E9owghYLJ9v/YALWK +IBEDQgnv+v/ZAZ0LCFMPjCA/gUf24bWKIBEDKgnv+gDZAebPfrkOEpNCIUAgQCBBIKcIdYAveSEG +D/TxwMoND/QA3c9wgABErTIPb/q0qBLoCN6A5cwlopDMJSKRzCVikawIov7KIEIDYb7pDnWQAeUd +8IokAXHPcYAAsLqoIIABBBlQA+B4ANlKJAByz3KAAFy6qCDAAhYiQABikM9wgAAouzR4AeFgsM91 +gADcIM92gACIrUAlABckbrIJIAEG2kAlABVAJoESpgkgAQbaQCUAF0AmARSWCSABBtosFYAQIQgR +AYogDwpeCO/6iiGaDjwVgBD+DW/+LYUuDQ/6DoUXCF4BiiCHDj4I7/qKIRsCwg/AAXIOT/qA4IQO +wv/PcQAA///PcIAAINIsoM4Ir/oroD0FD/TxwM4ML/SKIQoFz3CAANQjSguv9QDdz3CAAFApPguv +9YohCgXPdoAA3CBAJgAVAKbPcIAAbCYBpqlwqXF+DK/0BtoB2Klxdgyv9AbaAIZKJIBwqXECpgOm +qCCABRUmQhBggoogxg0NswCCAeGpoACCqaAAgrYYWAMAgrcYWAMAgrgYWAMb2c9wgABwxq0EL/Qw +qOB48cA2DA/0AN7PdaAAtA/cpQIJ7/tod2INT/qF6KoIAAID8NoIAAKiCs/8Qgrv++lwz3CAAIQr +GYALCJ4AMg3P/wrwANmeuc9woAD8RCGg4HjBoNylSQQP9PHA3gsv9IojCgjPcYAA3CDwIQ0Ao8FA +JQIULZV+Yjx/KHCGIfEPwr9HuSR/hiD+A0S4IQnAAwohwA/rcoPYjbiKI1IDSiQAAD0Db/UKJQAB +6IV6Yju/UycPkOCqTZXAukGuDPJ3lYYj/wlDu2eud5WGI/4HRbtorhHqz3KAAHQ5FSIDAACLNXoC +rgGLA64CiwSuA4sFrgOKCvAB2SmuAtgCriOuANgErgPYBa4GrotwyXFSDS/0DNoAwAHB8ghv9QLC +i3DJcT4NL/QM2gDAAcFGCG/1AsLPcYAARAcAoQ2VRLgA2S6lDQgeAIohCAAupQkIXgCLuS6lCQie +AI25LqVFAy/0o8DgePHA4cXPdYAA3CAjhc9ygABIB3eRV9gAogkLHgBf2ACiCQueAIW4AKIJC14A +h7gAojIhgw8AALACliEBBQDagOPKIIEAz3KlAOgPBqIQic9xoACkMIDgAYHPIOIA0CDhAAGh0gzP +9yOFz3CgAMgcT4FIoNoNb/0OgdUCD/Thxc9wgADcIAOAKYBEIYOAANok9IkKFQQAIo0PgAAcIACN +oLgArYAVgBCguIAdAhBAFYAQoLhAHQIQEI2guBCtkBWAEKC4kB0CEFAVgBCguFAdAhAB4uDxRQoV +BAAijQ+AABwgAI2AuACtgBWAEIC4gB0CEEAVgBCAuEAdAhAQjYC4EK2QFYAQgLiQHQIQUBWAEIC4 +UB0CEAHi4PEjCZ4Bz3KAABwgCIqAuAiqiBKAAIC4iBoCAEgSgACAuBDwkuvPcoAAHCAIiqC4CKqI +EoAAoLiIGgIASBKAAKC4SBoCAADYPwkeAEokAHTgeKggAAYrCJ4AACCDD4AAHCAgE4EAgLkgG0IA +oBOBAIC5oBtCAGATgQCAuWAbQgAB4BzwSiQAdOB4qCAABisIngAAIIMPgAAcICATggCguiAbggCg +E4IAoLqgG4IAYBOCAKC6YBuCAAHg4H/BxfHA/ggP9M92gADcIBpwCwhRAACGAvABhroQAAYVJg0U +TCAAoAHfJbhTIAUAIIXAf0AhAAO6EQEGGwlfAQohwA/rcoHYjbiKI80DYQBv9QokAASKIgsGWWAA +FgNAWGBgoAAWAEABoQAWgEAIqQAWgEAJqc9wgACEKxqAEQhRAECFABYAQQ+yBPAAFgBBABaAQAqp +ABaAQAupABaAQAypABaAQAAWAEEHsQAWAEEIsQAWAEDCC0/9AIWKIRUFJOAgYIYgf45O9PAmwBMk +4CBghiB/jkj0iiDTAW4Lr/qKIU0LCnAiD+/4Adm6Dq/8LyAHBAIPYAMKcJIJT/qR6M9wgAB8JiyQ +HpYXCQAAeglP+iroUQgRIGoJT/ok6ACFuhABBgpwJbmeDu/1wLleCU/6iejPcIAAfCYskB6WEwkB +AAvIBSCADwEAAPwK8AvIBSCADwAAADwLGhgwC8iQuAsaGDASDo/4/QfP8/HAcg/P8wokAKChwcon +YRAU8s9wgACEK2QQBQAbDZ8ACiHAD+tyftiNuIojSAwVBy/1CiQABQDfz3WAANwgFSUOFQCGFSXS +EyQQFgAgEBcAKBAYAUEuQSFTIRAAABIBIBoQGQEpgSW5UyETAIoM4AIN2c9xgAAINcARAAYZCNUP +iiLID3JodHs7Y0CjBBsABQgbAAQB4MW4wBkYAN4NL/6KcACGCYAluFMgEQCKcO4N7/gA2QsMESAe +Cc//A/COCgAAawkQIB8IECAKIcAP63J/2I24iiNJB0okAABlBi/1uHO6CAAB1g2v+AHYAIYIgA8I +HgAsFYAQhOAD3wL0Bd8NCxEgAg+P+5oNj/ssFYAQswgRAYogjw7GCa/6iiEJD4DY2gvv+wHZTfCS +Da/4ANgsFYAQGQgRAYogjw6iCa/6iiEKAoDYtgvv+wDZEwwRILYOj/uuDo/7ug+P9yDwVgjP97IP +D/oF6OYKgAMY8LIPD/oW6M9wgABwJhSIieDMIOKBDvTPcIAAzGAAgATZvdoe20DAi3BmDWAAGLsT +CxEgCw9REHoPD/oD6A4Iz/cAhgiAEQgeACwVgBCE4ATfA/QG3yCGCIEoERUBinEEIJAPAAYAAOlw +9ggv9gUgQiUH6Olw5ggv9gUgQSUqDw/6BNnPcIAAhCsWCW/9OaAghooiFQVAIQAJQGCGIH+OT/QA +EgAgJOBAYIYgf45J9B4Mr/yKcGoMYAOKcPYOD/qR6M9wgAB8JiyQHpUXCQAA3g4P+oEIEAB9DBEg +zg4P+jroCwkRIA8LESCKcAIM7/UqcX/ZEbnPcKAAsB80oL4IT/qyDg/6iejPcIAAfCYskB6VFwkB +AAvIBSCADwEAAPwLGhgwGPALyAUggA8AAAA8CxoYMAvIkLgLGhgwDPAkGYAFIIYgGcAFIIYoGQQG +IIYaGUQGAd5aDiAByXDPcIAAqB96DSABwKgnDFEgz3CAAHAmFIiJ4Mwg4oEE9A8JESAPCBECLg4P ++gPo/g1P9UwkQKDMISGgBfQAhQKlA6WeDs/5/gqP+ATKkODMIIKPAACzAA/yCiHAD+tyARIENpLY +jbiKI8wKEQQv9QolAAXaDeAAANhxBO/zocDgeOB+4HjxwE4Mz/PPdYAAbAYAhQDegOA4DUIBDMwA +32EIHgDPcKAAyB+wEAIAz3GAANwgI4EC4kYRAQFhuQgiQQA+oBDZLqAB2RUYWIDPcIAA3NADGhgw +z3CAAKTREgogAgQaGDDPcIAAZAYAgIDgZAyC/QQgj08wAAAAG/AxCF4DDg7P/s9wgAD0OwuAjCAC +jYj30gvv+hfYz3CgALQP/KAMzO+4z3CgAMgfGPTJdwDZz3CAAHA8IaDPcaAALCAjgSOgSfCeC+/6 +F9gA2M9xoAC0DxyhAd4/8ATZBhpYMD+AgOGKIQwAyiGCDwAAAAIuoAPZFbkSGFiAAIWA4BwMQgEB +AwAAOwheRQbIhiDxjxn0z3WAAIA6fRUAFgHgcg3v/n0dGBAMzA0IngME2AwaHDBoFQAWkQiFjwAA +tAAB3gzMhQgfAZcInwGGIP+FgfKjCx9ABsgEIL6PA4DoQ9T1qQhfxc91oADIHz+FoBUAEAkhAADk +4ADe0fbPcIAAXLoAgBcIXgDepRDfLghgAOlwhegB2B6l7qWgHYATiiAIAA6lX4Wo4qoBBQDPcaAA +/EQZgQQgvo8AAAggx/Qdgfm4xfQA2MTwDcxTIECAxfMEyAMSATYDGhgwBBpYMJYIAALPcIAAZAYA +gIDg6AqC/bPxZwhfxQzMz3WAAHg7QQjeAIDYDBocMA3MEQjeAhqFAeAapQDeBfAShQHgEqXPcIAA +cMYSiFEgAIAwC+IByiBiABHvGYUB4BmlDfCKIAQADBocMBGFAeARpQXvGIUB4BilDMx5CN4BDcwE +IIQPAAAAGDsMgA8AAAAIUgqP+A3MRwjeAM9woAAsICWABoAK4S8IRAADEgE2AtgMGhwwUNiiDi/+ +mBEBAKPxzgmv+clwDwgeAAjYm7gGGhgwVfEE2AYaGDBR8QPIoBAAAPC4ANg88tYOz/gA2Ja4OPBH +CB8CbwhfAhsIngMXCx5AiiAEAM9xoACwHxShBNgGGhgwDczvuDPzz3GgAKggSIHPcYAAeLwvkTBy +UgbF/6+4DRocMCPxSg1v/IogBACiCa/4AN0DyKAQAADwuMogQQMG8moO7/ipcADYlbiWDgADufFa +Du/4AdgA2JC4+PEB2A94EwhRAIXqiiAEAA6lygqAAC/YlbgSHRiQz3ABAMD8FR0YkNYMwAHPcYAA +9DgAgUEI0AHPcKAAOC4FgAQggA/AAAAAIwiAD8AAAAD12gW6z3CfALj/WqAH2lugadoYulmgAdgC +8ADYCQhRAAfYAKHPcIAAbAYAgIDgWAlCAc9xgABwPEGBAoEIIIAAAqF8hQOBRIECewDKCCLCAESh +FwgRAgPZz3CgAEAtMKAAGoIzBPAB4AAaAjC5AM/z4H7geOHF4cYA3s9zoADAL6UbmIMP3Qi9oxMC +hqR6jCIQgPzzFBuYg6MTAoYLIkCD/PUUuAV5pBtYgKQTAIb/CN6Hwcbgf8HF4cUw2wDdz3CgAMgc +aaAD2s9xoADMFyEZmIBOoaegaqDgf8HF8cDiD6/zANnPcKAADCRYgM91gAAAvK1wQSqGB4Yg9w+Y +FYMQKbh2ecBxx3GAAMzPFXkAEYQAz3CAAIAXIIBALM4A1X7QYdlhRCCPgFMgjgAEIoAPACAAAMwg +IoAG9IDnzCAhgADYA/QB2M93oADEJ0ArBQaGI/0PUiPDAbMMMwRFu4DmzCAigFPyz3CAAMRr8CCH +A0AuhgMFJsYBBSWAAQV7QR/YkFEOkRAfhRDamrgfpQjYTx0CEM9woADIHEmgB4HPcqAA8BcGogaB +BqIFgQaiBIEGogDYCqKKFQARaLgQeIodBBAAlYYg/4wo9AHYHaIm8E4VgBCi6IoVABFMpWS4EHiK +HQQQBNlPHUIQGw7RECsXAZZkuBB4ih0EEAzYLaVPHQIQjgzv+YhwCPAFI0MBQR/YkB+Fs7gfpQ0H +j/MQ2s9xoADIHEmhAdvPcaAA8BdqoaQQAgBNCt4CAtpdoc9zgAAIxkSDRqFDg0ahQoNGoUGDRqFw +EAABHOBTIMCABPRAIwAIBPBAIwAMQIBToUxoQIJTofgQAoJTofwQAIAToQ/wXJCGIv+MA/R9oUiA +RqFHgEahRoBGoQWABqHgfuHFL4DPc6AA8BfPcqAA/Bcoo0AQAQEqsjGAKKNIEAEBKrIzgCijUBAB +ASqyPJCGIfMPjCEMgAf0NoAoo1wQAQEqsnAQAQG8kAjhqLK9kKiyVBANAaiyYBANAaiyuYCno7qA +p6O7gKejchAAAThgEHgIss9woAD0ByegAtnPcKAAyBwnoOB/wcXxwEoOj/kCCs/50cDgfuB48cCK +DY/zz3WAAAC8F4XPdoAAbNALCBAGWBWAEAToeoVbhQTwfIVdhRKFz3H+//8/JHtEeQQggA8AAAAQ +BXthpgDf4qYleA2mDti6Du/5DqYH6M9xgABsJi4PYAAB2M9xgADwICIPYAAA2BeFDwgRBQHYAa4x +HgIQBPDhrjEewhNxBY/zocHxwPIMj/NId89ygAAEukaCCHaB4gHawHpAKhMDyXOGI/wAjCMChc9y +gAAAvADYHPSYEoIAFQrfAc9wgABMyAW6QGAtuMC4z3KAAOgGQILPc4AAeLwUewsKngAg2q2TCfCY +2quTB/DPcIAAPLyzkA7aAZdAJQMVDwsDAKJ4SCAAABB4AvAA2DpwANhacKlzdgpgA5hwCiAAoEz0 +CtjPcaAAyB8eoRDYDqEB2BUZGIBKcRTwz3KgAPxEHYJZggDZDwrfAgQgvo8ABgAAAvIB2QQgkg8g +AAAAUSAAw8whIYDMIiGgA/TRCx7ALwseQM9wgAD4WAHZIKADyKQQAQCauaQYQAAGDaABAdjPcYAA +7DwCgQHgAqFRIADDANgJ9M9xgABwPAWBAeAFoQDYmLgacEwgAKAA2MoiAiBL9AUjgCMNcQCxDXEA +GUQEI4cNcCCgKJcNcCCwiiCFAPIOL/rJcYwmApUU8owmA5Ed8owmA5Uh8gohwA/rchPYjLjPcwAA +sguKJIMPKQPv9Lhzz3CAAHy8LoAPgQHgD6GeCSAA6XAQ8M9wgAB8vC6ADoEB4A6hCPDPcIAAfLwu +gA2BAeANoQDYz3GgAPQHBKFKIkAgz3GgAMgf+BEDAAAlQhRiekgiAgB/gVB6OwrEAGOHz3KAAACu +YqKg2k+hH6HPcIAAALwckGK4InAfoQLYFRkYgA8IECBRIEDGINgC8oDYDqGMJgOVB/TPcIAAALwc +kAjwjCYDkQn0z3CAAHi8D5A2C6/6ANmGC0//DMyGIPmPCvSMJgORANjPIKEDyiAiAQwaHDBKcAjc +6wKP8/HAngqP86HBz3GAAFjRJIHPc4AAPK7PdaAAyB8EIYEPAAAAEEUhQQNAwSDCw7pcevQjgwCg +FQIQcLsXCuQAAN4QeHB7AgxgAxTaCwgeBgDYOvAD2M9xoAD0BwWh5NoNcECwDXDAsIoi/w8NcECg +z3IAAP//DXBAsAPIz3OAAEzIz3KAANwgEIgFuABjLbjAuPAiAADggA1w4KADyBCIBbgAYy24wLjw +IgAAQpANcECwxKFaDAADQBUBFjB5tgqv+hDYAdhBAq/zocDgePHAzgmP889ygAB0riCKEunBgqKC +z3GAAOgGAhIQAeCBz3KAAHA8III0vwHhIKIw8M9yoADEJxESAYYA3/UJnoFkEgOGZBrYgwLZExpY +gC8pwQBOIYIHE+vPcYAA3KFWecCBoYHPcYAAXKL0IZAAz3GAAHyi8CGPAArwz3KAAPQ7PoLpdel2 +GncB4T6iQYANcUChJJANcCCwz3GAALi8AIEG6EKBDXBAoADYAKHPcIAA3CADgAiA67jKIIIDyiFC +A8oiwgOcDWIDyiMCBFMgwCDPcYAA6AYggRS/DLjleBcJngCCuA1xAKENcMCgDXCgoB3wDXEAoUok +AHSoIAADRCaBEA+5UyYAECV4DXEAoSK+SiQAdKggwAJEJYEQD7lTJQAQJXgNcQChIr0JAY/z4Hjx +wKYIj/MIdih1KHBIcV4IIABocoHgyiCBAxAIIQDKIUED8QCP8+B4IrkG8OxyYKIE4GG5+Qm1gGCA +z3CgANQLbaAD2c9woABEHTWg4H7geEEpgYAJ8i8kSXCoIMABBBACBOxxQKHgfvHANgiP86HBCHfP +dqAArC8ZhgQggA9wAAAA13AgAAAAAdjAeC8mB/AodRpyE/SKIEkGTgsv+oohCwE5hkILL/qKIAkG +iiAJBjYLL/qpcQDYLfALzAAcRDNPIMEDAhxEMAHgEHgEIIAPAAD/v4+4CxocMM9woADUCziAQiEB +CEghAQBAJwASEHGICgUDB+cEJ48fAAD8/wUnABSduJ+47HEAoQDB7HAgoAHY8Qdv86HAz3CAAAS6 +BoAD2oHgAdjAeAy4hSADAc9xoAD0B0WhDXIAsgPIANtdkA1wQLADyFGADXBAoAPISBACAQ1wQLBk +oeB+4HjxwEoPT/PPdYAAXJPgFQAQAN6A4ND3RC4+FwAhQHMc2cXaHtuCDu//GLvgFQAQAebnDgSQ +ANiBB2/z4B0AEOB48cAGD0/zIYAKJQCQEInDuMohwQ/KIsEHyiChBsojgQ8AAKYAzyAhAzPygOHK +IcEPyiLBB8og4QbKI4EPAACnAM8gIQMl8gW4z3GAAEzIB2EDhQCQhiD8AIwgAoAtv8C/C/TPcIAA +3CDwIMEDtREABoG4tRkYAAGFwoABhgPoAIaM6AohwA/rchzYjLi020okQAAdBq/0uHMLCJ9Bpg0A +AAzoiiDOAqYJL/q72QCGgNkooAGGQHgg8AGFIJAcyBBxyiHND8oizQcd2MojjQ8AAMEAvgft/88g +LQP2Da/5qXAGCyAAAYbPcIAAXG/moIIO4ALpcHkGT/PxwKPBANlgwQEcAjADHEIwAhxCMAHYz3Gg +AMgfE6EZgYTaQsAYgR7bDNlBwItwQg3v/xi7o8DRwOB+4HjxwMYNT/OkwVpwOnHuDO/7GnLLCBAA +z3WAAAS6AIW/CBEAz3aAAFAHAIZBCJEAiiAJCIonCBjiCC/66XHPcYAACDXAEQAGFwj1Dwjacmh0 +eztjwIbgo8GjQqMB4MW4wBkYAHIJ7/sI2M9xgACYOACBS4ENCB8BAYEVCNADXwrQAADex6HMoQPY +C6EJ8E8K0AAA3smhx6ED2AihxKWKIIoIdggv+iqBz3CgACwgsIAAHAA0BthBwELGQ8YB2B7ZSnII +c0okAAAKJQABACWHHwcAIKEjIEAECiYAAUkFb/OkwPHA5gxP86HBCHZacTpyGnOIdwoM7/uodYDg +zCYikAryz3CAAAS6r6DaDG/6A9gT8IogWQYCCC/6yXFAxclwSnEqcgDbmHO4c9h3ogpgAAonAATx +BG/zocAI2exwIKAD2QDaz3CgABQEJaAByOxxAKHPcKAA1AtNoOB+4HgIyIe4CBoYMAnIm7gJGhgw +CsgKGhgwC8iHuAsaGDAMyAwaGDDgfuB4z3GAAEyUAIGBuOB/AKHgeOB+4HjPcYAATJTgfwOx4HjP +coAA3DkVeiCiaQfv+Yogkg7gePHAmHAKIcAP63IKJcAHz3AAAKIZrQOv9F7b4HjPcoAAuDkVeiCi +OQfv+Yog0g7gePHAmHAKIcAP63IKJcAHz3AAAKMZfQOv9Gbb4HjPcoAA8DkVeiCiCQfv+YogEg/g +ePHAmHAKIcAP63IKJcAHz3AAAKQZTQOv9G7b4HjxwKQQAQANCV8GcgqP+QfwINnPcKAAyBwpoAPZ +z3CgABAUJaDRwOB+4cUDuDV4z3GAAAReAmFKJAB0ANmoIMACFiJAAKGAYIAp2BK4AeF1eKCg4H/B +xeB4z3CAANwgI4ChwTAhgA8AAHQFKHSAJBUdhrgApOB/ocDgfuB4z3GAAPgG4H8DoeB48cAWC2/z +2HDPcIAA3CADgBgQhQAbDREBCiHAD+tyiiBNBIojhQaZAq/0SiQAAM9wgAAEugqAjQgQAM92gADA +VwCGQiAAgMogYgC86B8OEQAKIcAP63KKIE0EiiMFCEokAABdAq/0CiWAAQWGA4DPd6AAsB+ggBuH +z3GAAEzQ1bgdZSWBQiZAAAUpPgAndYogCQ7KDe/5qXE7h4ogCQ6+De/5NrnJcCoN4ABCJYESz3CA +ANhXACWBHwAAiBMSDcAAvQJP8/HAUgpP8wolAIAN9AohwA/rcoogjQSKI4UN4QGv9EokAADPd4AA +8FcFhwOAAIDPcqAAsB/bgkIlQwDPcoAATNBTJk0VRYIdZQUq/gAndQIlAxCMIxeHNr6gdkr3z3CA +AOieAYAFKL4AJ3UeZgfpz3CAAJg4E4BPCFEAUguP+RLoz3CAAHwmLJDPcIAA3CAekBEJAAACJYEf +AAAADOlwBfDpcEIlARVmDMAAz3CAAAhYACWBHwAAiBNSDMAAiiDJDhnwz3CAACBYQgzgAEIlARXP +cIAAOFgAJYEfAACIEy4MwADJccm5z3CAAOieI6CKIEoApgzv+clxz3GAAEzQBoGBuLkBb/MGoSCA +B7ngfyCg8cBGCU/zz3WAAFQHzI0NjcK+wrgWfs9+Fglv/Q3YBriBuBC+xXjPcaAA7CcGoQSFz3Gl +AOgPBqEFhQehdQFP8/HAAglP8892pQDoDyaGp4bPcIAAVAcA3ySgpaDSCG/9DdgGuIG4z3GgAOwn +BqHmpkUlzR+npjUBT/PgeM9xgADQI89wgAC4BgCQWokrCgEAz3CAALoGAJBYiR8KAQDPcIAAvAYA +iDaJDwkBAM9wgAAwMQCAAvAA2OB+4HjhxeHGAN0zCdAHCwnTBwsJEwAA2BPwGQnzBx/eTiH8B+B4 +qCCAAQ8ljRNhvgkITgCleAPwpngAogHYwcbgf8HF8cChwQDaQMK6D+//i3IAwKHA0cDgfuB48cAu +CG/zKNj+Cw/6z3aAAFwxQIYIcQh1hiH8AwDYYHokuUCGRCUBEwHYYHoiuUCGAthgelMlQRDOCy/6 +ANhAhgh3QSgBAgPYYHrAuUCGQS9BEgTYYHrAuc9xAABcuM9wgABYMSCgz3ABABSVAKbPcf7KAgD+ +Cu/5iiCSDxkAT/PxwGIMz/xaD4/8z3EAAIS4z3CAAGAx1glv/CCgz3EBAESVz3CAAGQxIKDPcf7K +AQDCCu/5iiCSD9HA4H7xwHYPL/NQ2EILD/rPdYAAbDFAhQh2ANhgelMmQRBAhQHYyXFgeoYh/Q/P +cQAAqLjPcIAAaDEgoM9wAQB0lQClz3H+ygMAcgrv+Yogkg+VBw/z4HjxwOHFVgvv+gfYAgyv9Qh1 +0gqP/JoPz/8WDs/8agrv+qlwdQcP8+B44H7geAUAAADxwO4OL/MIcwh2hiP+A0S7CHeGJ/EfR79E +IIEDPHnPdYAAcMYsrQQghA8AAAAMQiyAAhStBCaEHwAAADBCLAADFa0EJoQfAAAAQFMhvoBCLIAD +sR0CEA70CiHAD+ty1dgFuFnbiiTDDy0Gb/RKJQAAEY2B4MwgIoDMICKBBfRTaSV6Tq1NrYDjzCAi +gQTyU2tlek2tgOfMICKBBfITb+V4Dq0TaSV4D60NjRCtRg8gAQDYpQYv89+14H7geOB+4HjgfuB4 +4H7gePHAKg4P8892gABsBs91gABsLAOG8CUAEEB4feh5Bg/z8cAGDi/zANuhwQS4z3KAAGzQFHge +YpDdGmIBghi9qKaKJQQSz3L+//8/qaYEeoDhQMLKJcEAC/IIgQQggA8AAAAwQiAFgMolYgBDDRAA +qIENkQQljR8AAAAwLL2GIH8MYb0ceEAlgRMPIkIAQMKLCE8DCiHAD+tyPtiMuIojCgaKJMMPKQVv +9Lh1z3CAAHDGG4iB4M8ioQMu8s91gACgus9zgAAAvJoTgQADjQshAIAg8kwTjQAA3wDbUyVBEA8j +QwBEJQETQrkPJ08QhiX/EwQnD5AA2US9BHsPIUEDJHjKJwEQgOPKI8EDDrtlegTwAYUFekDCz3CA +AKC6QICLcYYi/gMkumCBDroEI40PAQAAwAslgJAW8td1AAAAQMwlgp8AAACAzCWCnwEAAAAE9AGA +A/ACgK67r7uwu2V4AKEAFAQwBCSBjwEAAMAK9AohwA/rckbYjLhVBG/0iiMLAQiGLrlAKQIGBB4A +EUV4CKaKIAUGCabPcIAAVLwEiIDgiiAFDsoggQ8AANgBCabJcFYKr/0A2gHYAK7VBC/zocDxwD4M +D/NacBpx2nD6cTpyenMA2JpwbyVDEAh2SiDANztwCHe6cOlwqnFKDy/zAdoAIECDASGBAzoPL/ML +ckIgWLDKc0MhGTDyccwgwYAK9wAnT5MBJZUjAiYWoAMnVyCpcMlxOg8v8wHaBSB+gAh1KHbb9elw +qnHpclIPL/OqcwIiEqDpcAMgUCCqceYOL/MB2gUiPqQIdSh2EPIFJb6TDPIqcADZSnIiDy/zCnOp +cjoPL/PJc5pwKnAA2elyDg8v86pzACQCILUDL/MAG4Ag4cXhxqsKEABAIsMDJLvDugLwANqVChUE +MyaCcIAATGBAJ41yVH0gfcCIARmSAwHgARCCBAEZkgABEIIEARmSAAEQggQBGZIAARCCBAEZkgAB +EIIEARmSAAEQggQBGZIAARCCBAEZkgABEIIEARmSAAEQggQBGZIAARCCBAEZkgABEIIEARmSAAEQ +ggQBGZIAARCCBAEZkgABEIIEARmSAAEQggQBGZIAQiNDgLP1wcbgf8HF4cXhxiPqY2oiu8G6AvAA +2jUKFQEzJoJwgABIYEAnjXJUfSB9wIAEGZADBOAEEAIEBBmQAAQQAgQEGZAABBACBAQZkABCI0OA +4/XBxuB/wcXxwJYKL/NTIUIATiINAc9yoAAUBMmCANsOJoIfAAAABlBxyiHGD8oixgfKIIYPAADG +Isojhg8AAEgCyiRmAPwBZvTKJcYAgOHKJE1wyiLNAOggLQJOYM9xoAA4BAHiyKkdDVAQEQ2QEB0N +0RDPcKAAOARoqM9woAA4BGioz3CgADgEaKh9Ag/z8cDqCQ/zunB6cfpymnMKIgAhCiFAIch1CiDA +IQogQIPPcYAAWMjKIGIACHcFuAhhTCMAoAS4hiD+AwV/yiHMD8oizAfKIIwPAADBIcojjA8AAPIA +yiRsAFgBbPTKJcwEHQieQc9wgAAgrYDZKKAMwAPoQHh/8P4Mj/998M92gAAAWQGGANkeCK/0ONoA +hhzZIKABhhjZILDPcYAA3CAVIVYDABYBIDOB8KjPd4AAxAgoGAAEpLkhoADZMxhCAOlxIqAKIUCD +MRjCBDIYwgQ0GMQFyiFiAPIPr/gM4IXtz3GAAIitBPDPcYAAqK0jps9wAABIEQCxGNgCpg0NUCCK +IAUCALEMwIXoz3ABAJSUAacAFgAgrxAABi0IHgBBhhrYALICpgCRh7gAsQDYC7EBgq24AaIRDBAg +z3CAAJg4BIAzGgIAKQoQICGGAYGYuAGhA4GfuAOhz3GAAIgHABYAIAAZRARAgAGAQaECoZoJr//J +cMEAD/PgePHAcggP87pwenH6cgoiACEKIUAhyHUKJMAhCiFAg89wgABYyMohYgAocgW5KGBMIwCg +BLiGIP4DBSCQAMohzA/KIswHyiCMDwAAvyHKI4wPAACWAMokbADgByz0yiXMBAzAjegKIcAP63KH +2Aa4l9tKJAAAxQcv9LhzFwieQc9wgAAgrYDZKKAMwEB4ZvDPdoAAAFkBhgDf6XGSDm/0ONoAhhzZ +IKABhhDZILDPcYAA3CAVIVYDABYBIDOBMxjCA893gADMCBAYAgSkuY25mbkhoOlxIqAKIUCDKBgA +BTEYwgQyGMIENBjEBcohYgBiDq/4DOCF7c9xgACIrQTwz3GAAKitI6ak2ACxENgCpg0NUSCk2Iy4 +ALHPcIAA3CAZkI64j7gBsQzAAacrChAgIYYBgZi4AaEDgZ+4A6HPcYAAiAcAFgAgABlEBECAAYBB +oQKhPgiv/8lwYQfP8vHA4cXPdYAAYD0AjYwgw48P9M9ygACoVwWCA4AggMdxDwAAoMoJoABIcP7Y +AK2BB8/y4HjxwAYP7/IA2M91gADMykokAHSA3qggQAUIcQHgTyDCARYlQxBHq4oiCABAKUQBACSB +D4AATMhAoQDaQrHGqcDYfx0CEM91gABMB8Ctz3CAAMzHgNlGDW/0KHLBrc9wgACoJsmoz3CAADAh +CQfv8sWoCQAgAADY4HjxwIoOz/KhwQh3bg7v+RbYz3aAAIA6IIYBhoDhzCAhgCv0z3CgANQLGIAA +3UIgAAiA4MogTAOMIAeKSPe2FgAWAeC2HhgQHPCd2AAcBDALzOlxAhwEMAHgEHgEIIAPAAD/v4+4 +CxocMADAHtoiCCAAGLqhpgTwBOhhuAGmDggAAHEG7/KhwOB44H7gePHA9g3P8gh3GnE6cs92gADc +IAOGz3WAAIA6FJAQuEYPL/kCpYDgyiAiIIUhBylPIUAnn7jscQCh7HDgoAOGCIALCB4AAoWBuAKl +z3CAALwGAIiF6AKFg7gCpc9woAAsIBCAz3OAAAg8bx0YEEokwHAA2KgggAXPcYAAwAYgiYDhDNrK +IiEARCi+A89xgAD81SdyMyGBABxjAeAgrEAlDhKeCC/1yXARCBAgAoUA2YC4AqUE8Ioh/w9kFQ8W +ZRUEFgDaCPDscwCjJHgEHhAQAeL34gCGuPfPcqAA1AsNoiR4AKZkHdgTZR0YEQDYaQXv8twdABDx +wM9ygABsBgKCJYgB2AfpCNlODq/5K6IH8M9xgAAELKIJ7/MAodHA4H7gePHA3gzv8thwOgggAADd +yWgrDhIQ+HCpdzImgAMVCBIMEQiTDjIKj/Yybzh4BX0B50InRwDlD3WAYb4NBe/yqXAIcgPwAeAg +iP7p4H9CeOB48cCSDM/yz3WgAPxEHYU5hYIOYAIA3gDYnrgBpeB4waXFpd0Ez/LgePHACiHAD+ty +iiANC4ojigZKJAAA+QMv9AolAAHPcaAAyDsOgYi4DqFpIEAA/vHgeOB+4HjxwC4Mz/LPdYAABLov +hUogACCA4cohwQ/KIsEHyiCBDwAAviHKI4EPAABIAMokAQSoAyH0yiXBAM9wgACUH0CIz3CAACCt +YHlIoDwdABTSC+/5A9g9BM/y8cDeC8/ygg5gAAh1z3GgAMgfRYUM6PQRDgACgGSFxHpFe/QZwAAi +hQChC/D0EQAARHj0GQAAHNgYuBUZGIANBM/y4HiA4AHZwHnPcIAAXD3gfyCg8cCGC8/yz3CAAFgx +IICiwWB5BNiA4OYCAQDPcYAAzB8AgQHgAKElCFEAAdjPdaAAyB9RHRiQIN7QpUMdGBAA2J4MYAKN +uNGleg9v+gXYz3WAAAQ5DqXPcYAAzB8AgQHgAKElCFEAAdjPdqAAyB9RHhiQIN/wpkMeGBAA2GIM +YAKNuPGmA9gKC+/zqXEE2AIL7/MibQXY+grv8yRtC9jyCu/zJm0P2OoK7/NAJQESNtjeCu/zQCWB +EjfY1grv80AlARM42MoK7/NAJYETz3enABRICIfPcacAmEcEpQ2Hz3KrAKD/BaUOh892oADsJwal +HIEHpReHCKUWhwmlGIILpRmCDKUagg2lz3AFAMYDBqbG2JC4BqbPcCwAAgEGps9wWgBCAQamiiCL +AAamz3BAAIcNBqbPcNEAwg0Gps9wwAAHDgamz3CAAMwfAIDPcoAAzB9CIECAAKIG9M9yoADIHADY +EaIB2AinANgNpw6nz3BQAP8AHKEB2BenANgWp/zZz3CrAKD/OKBz2TmgGoDPcasAoP+BuBqhz3Aq +AAIOBqaLcKoMIACBwQDBz3CAAACWNKUyoAHBL6DPcBoAAg4GpotwigwgAIHBAMHPcIAAAJY1pTOg +AcEwoM9wJgACDgami3BqDCAAgcEAwc9wgAAAljSgNqUBwTGgz3CAAMwfAIAB4M9xgADMHwChNQhR +AAHZz3CgAMgfURhYgCDYz3GgAMgfEKEB2EMZGAAA2LIKYAKNuCDZz3CgAMgfMaABlRC4hSCEAAam +ApUQuIUghQAGpgOVELiFIIsABqYElRC4hSCPAAamBZUQuAUggA8AAIINBqYGlRC4BSCADwAAwg0G +pgeVELgFIIAPAAACDgamz3CAAMwfAIDPcYAAzB9CIECAAKEH9M9xoADIHADYEaEEhSuFCKcFhQ2n +BoUOpwiFF6cJhRanz3CrAKD/OKAshTmgLYU6oBoMb/oOhc9wgADMH89xgADMHwCAQiBAgAChB/TP +caAAyBwA2BGh9QDv8qLA8cCKCM/yfggAAM92gADgW6IPb/gAhgh1AIYZDQAQIgvv+6lw0gsv/KCm +ogov9RHYlgnP989woAAsIDCAz3CAAEAHtQDv8iCg8cC6D+//ocHPcIAAZD0AgATZYtoe20DAi3CG +Dy//GLuhwNHA4H7gePHAAgjv+RTYANjRwOB+4HjxwAII7/IH2DoMT/rPdqAAtA/8hhpwANgcps9x +oAAsIDCBKgtv+YogkQUeCE/8z3WAAGQ9Bgxv/AClQIXPcYAANFkAoc9xgAD0O0eh4gkv/Qih/KYa +C2/6CnDPcIAAqB8AiEsIUQBAhYogRATPdYAAmB8jhRpiOGAQcgHYwiAOAA7oiiARC8YKb/kA2YoP +L/YE2ACF+g5v/AOlB/BqDy/2BNgChQOllg0AAr0Hj/LgePHAz3CAAFw9AICc6G4Pr/kU2Jjoz3CA +AFgxIIBgeQTYEOjPcIAAODFggM9xAQAYqQvYYHsE2jIPr/kU2NHA4H7PcYAA3CAAgboQAAYPCF8B +AYG6EAAGFQheAUIJL/UT2DoJL/UR2Ozx6vHgePHA1g6v+RTYXg7P/89xgADcIACBuhAABg8IXwEB +gboQAAYNCF4BCgkv9RPYz3CAADQxIIBgeQvY0cDgfvHAz3CAAGAbAIDPcYAAQAcbeBoPb/YggQjo +AdnPcIAAqB86D+//IKjRwOB+8cCCDo/yCHd92A24z3GAAEzQxYGaD6/yyXGMIAKAz3GAAGQbAN2H +9x14jCACgAHlfPcAKEIDBSq+A89ygABgGxa4AKHPcYAAYD0AGkAOhO//2ACpAImMIMOP9A6B/40G +j/LgePHABg6P8npwmnFIdxpzCiUAIQDaz3GrAKD/WaEH2BqhWKEg3s91oADIH9ClAdhDHRgQANhC +DyACjbjRpRnZz3CnAJhHOqAOC6/8HtjPcqcAFEgdgr6CbBIRAHASEgAApwAYQCP3uMUggg8A/wAA +0yDhBfe9xSWCHwD/AADTJeEV6gjv94ohEAAIdqlw3gjv94ohEAAIdUApACLSCO/3iiEIAAh3QCoA +IsII7/eKIQgA0XkZ4Sx5L3GxehniTHovcgAbgCMND2IQABxAIwDYBfD9CIOAAdiBBa/yAB0CIOB4 +8cA6DY/yCHcacQHZz3CnAJhHOqAg3c92oADIH7CmCthDHhgQANhyDiACjbixps9wpwAUSCyAPYAA +GEAg97nFIYIPAP8AANMh4QVVBa/yIKfxwOoMj/LPcoAAwKyigowlw58z8v/ZIqKELQgYoKAAIY9/ +gABkqASPCiBALpDoAofPcYAAiCwWDi/0IIEIcc92oADIHxWG2g1AAIToAdgW8M9xgAAILAKPoKkB +qQHYE6YchgGhpg1v+QHYANgAIIEvgACAqgCpANjVBI/y8cB2DI/yCHXPcKAAsB87gIogSQ6iDy/5 +NrmKIEkOmg8v+SKFz3CAANwgA4AYEIUAGw0RAQohwA/rcoogzQSKIwYO2QPv80okAADPcYAADDgJ +gQsIFQEB4Amhz3GAAEzQBoFGIEABBqHPdoAAUAcAhj8IkQCKIMkHiiVHEjoPL/mpcc9xgAAINcAR +AAYVCPUPBtpyaHR7O2Ogo6CGoaNCowHgxbjAGRgAyg/v+gbYtg/P/DEEj/LgePHA4cUIdc9woACw +HzuAiiCJDu4OL/k2uYogiQ7iDi/5IoXPcYAATNAGgYK4BqGeC6/5Atj9A4/y8cDhxQh1/9nPcIAA +PKggqG8gQwACDe/zAdnPcaAAsB87gaYOL/mKIMwNBYUDgEKFIICKIIgAkg4v+UJ5vQOP8oUF7/QR +2OB48cA+C4/yCHbPdaAAyB81hYogCQ9qDi/5NrmKIAkPYg4v+SKGz3CAANwgA4AYEIQAGwwRAQoh +wA/rcoogDQWKI0cMoQLv80olAACkFQEQz3CAAEBWng0gAJYhQQ/PcYAABLoMgQroBYGA4MwgYoAG +8sYIIAAA2DDwsg7P/M9xgABM0AaBRiBAAQahz3WAAFAHAIVBCJEAiiDJB4omCBPiDS/5yXHPcYAA +CDXAEQAGFwj1Dwbacmh0eztjoIXAo6GjQqMB4MW4wBkYAHIO7/oG2HYND/vVAo/y8cDhxQh1z3Cg +ALAfO4CKIEkPlg0v+Ta5iiBJD4oNL/kihc9xgABM0AaBgrgGoUYKr/kC2M9xgAAEugyBC+gNgQno +BYGA4MwgYoDQCCIAyiAiAIkCj/LgeOB+4HjxwAoKj/IIds91oADIHzWFiiCKADYNL/k2uYogigAu +DS/5IobPcIAA3CADgBgQhQAbDREBCiHAD+tyiiBNBYojSQNtAe/zSiQAAKQVARDPcIAAQFZqDCAA +liFBD4ogyQfqDC/5K2jPcYAACDXAEQIGiiUJFxsK9Q8G2xJqFHg4YKCgz3WAAFAHoIWhoGKgAWrF +uMAZGAByDe/6BtgB2c9wgAAEui2gz3GAAEzQBoFGIEABRg3v/AahvQGP8vHASgmP8gh1z3CgALAf +O4CKIMoAegwv+Ta5iiDKAHIML/kihc9wgADcIAOAGBCFAADeGw0RAQohwA/rcoogTQaKI0kNrQDv +85h2z3WAAEzQxqWKIEkIiifJHjYML/npcc9xgAAINcARAAYdCPUPB9pyaHR7O2Pgo893gABQB+CH +4aNCowHgxbjAGRgAvgzv+gfYBoWCuE4Lb/oGpc9wgAAEus2gtgiv+QLYCQGP8uB4z3CAAEBW3QIA +AOB48cCeCK/5EdjPcKAAsB87gM9wgAD8FiCg0cDgfghyANjhA2/4ENngeAhyAdjVA2/4INngeAhy +AtjJA2/4QNngeAhx3QNv+ADYCHHVA2/4AdgIcc0Db/gC2BkEj/PxwP/Zz3CAAGA99giv/yCodgnP +/9HA4H7xwBYIj/LPdYAAACwAFRAQjCDDrwjyiiAMDUYLL/mKIUcAIfCS6M9wgABErGAQBAAKIcAP +63LPcAAAhwyKI4cBgQev8wolAAQIcYIhCADPcIAAZKgOIEAADgmv8oohCAgacM9wgABgsBEQAoaM +IsOP/9kG8hoYGIQgpQzwERgYhCClANnPcIAAbAYkoB4IT/npB0/yAdnPcIAAbAYkoA0AT/ngePHA +4cUA3coPL/mpcE4O7/OpcPIJj/SWDs/zz3CAAJAYzQdv8qCg4HjxwG4Mj/jmDI/43guP+NHA4H7g +eOHFz3KgAMgfpBIDAM9xgABsBg2BEHPCIwYARPdieBN7v4IOgbtjeGAOoQHYShoYAOB/wcXPcqAA +LCBmgs9xgABsBg6BYngOoRCCFQYv9w2h8cDqDm/ySiRAAMCBoIAB39F1wiQCAdF1oYFhgMInzhMB +3rFzwH6xcwHbwiPOAEwkAIDMJiKQyiNiAAr0heuA5swnIpAD8gLbAvAA2xTrIQtQADkLkQCggMCB +AYAhgQIljZOgogMgQAABohDwANgAogGiDPCggcCAIYEBgAIljZOgogMhAQAhoskGb/JocOB48cDh +xSWAQIBCIgKAyiJiAIDiyiHCD8oiwgfKIIIPAAA2Ecojgg8AAG8AyiQiANQFovPKJQIBYIEVC0AA +QoCig0J9DQ1TEGCD9QtBgEGDAaNgoEGgAKJEgKWAQCUDFhcKXgBGhQbqooJCgEJ9Bw1SEACjRICl +gEAlAxcXCt4AR4UG6qKCQoBCfQcNUhAAo0GACwmBAO4Jr/8FgDkGT/LgePHAug1P8gh2AIBCIAGA +yiFiAADYJuklhkGGAd8wciCGQYZBoSCiAKbPcK3eAgABpqWGwH8GhREOARCpcFYIIAAC2QalpYYH +hQ8OARCpcEYIIAAI2QelBe+KCa//BYYB2MEFT/IggBBxyiEhAOB/KHDxwEoNT/IIdYoP7/8odgh3 +wqXiDu//qXCZBW/y6XDgeECAFQoAAGSCCyNAgAX0QIL3CgGAANrgf0hw4HjPcaAAyB/0EQAAANpG +IMAP9BkAAAvImribuJy4CxoYMBzYGLgVGRiAWKFZoVqhW6HPcAAMDwCkGYAADqEP2Ay4EKHgfvHA +zgxP8s91oADQG9OFEQ6eFs9wgACYWK4IAAAPDt4Wz3CAALhYoggAABEOHhfPcIAAeFiSCAAAHNgY +uBOl/QRP8uB48cCKDE/yCHXPdqAAyB+kFgAQuGCkHgAQAdgTpliGOYYA2AAiQoMBIQEAWKY5pgLZ +M6Y6hluGACFBgwEggAA6phumFYYKDG/0qXEVpheGAgxv9KlxF6YP2Jq4DqbPcIAAeFhOCI//z3CA +AJhYQgiP/89wgAC4WDoIj/99BE/y4HjxwAYMT/IIdyDwAIYhhiGgAKEA2ACmz3Ct3gIAAaalhgaF +EQ4BEKlwtg7v/wLZBqWlhgeFDw4BEKlwpg7v/wjZB6UjhmB5yXBqDu//6XAKJgCQCPIDhyCAAoYi +eK8IUoDOD2//6XAJBE/y4HgP2Zq5z3CgALAfNaDgfuB48cB+C0/yz3KAAAC8P4I6cKrBANghCd4C +z3OAANwgY4N0g0gSgQDA3WR5hiH/DiK5On0E8BTdAtiKEgEBAnkSggThBghv9wDayglgAAIgTgMD +2M91oADIHxOlGIUA2ULAGYVDwBqFRMAbhUXA9YVcFRIQQBUAFh5mz3CAAEStQIABgAAigoMBIEAA +QMJBwIt2HQlRIHoJz/OEwRpwyXAGDO//hsIIdggQASEM8ILByXDyC+//hsIIds9wgABM0CSQz3KA +AEzQZYIGwgS7FQukAEApgAIXCIUAAnoBCIQABvD2DGAAhsAIckbCLw6REOlwYgpv9EhxCHdKcFoK +b/QGwQbCWnAEwwfBBcAAIsKAASBAAETCFfCW7ulwZgpv9EhxCHdKcFoKb/QGwQTDWnAGwgXAB8EC +I4OARMMDIEAARcAZDlAQz3CAANwgA4AYiITgzCYhkADYA/QB2C8gB6A49Olw8glv9APZCHdKcOYJ +b/QD2QDBCHYBwEAhwYBBIAAAQcAEwEDBBcFAIMCAQSEBAETAgghgAEXBDwkRIPWlAMAYpQHAGaUb +CZEg9aUAwBilAcAZpdelBMAapQXAG6URCVEg16UAwBqlAcAbpYogBw7+DO/4CnFMIACgAdnAec9w +gACkoTSo9QFv8qrA8cCeCU/ypcEIdgKLKHWYcGTAAIsAEgYBERwCMHlwAhIHAQQSCAEQFAAx5JIG +EgUBACDJAwCRLyFIEgcgQAIKCSAAEHgAIIoBAZUvIogSByCAAvYIIAAQeAAgxgEClS8miAEHIIAB +4gggABB4ACAHAgOVLyfIAQcgwAHOCCAAEHgAJQUABJUvJUgBByBAAboIIAAQeB9nBZXwf+d4qggg +ABB4JpUhcBB4B3k8eg+5JXpQegAigQIweQAcRDBHlSd6XHkPukV5MHkAIYIBUHpceQIchDAPukV5 +MHkAIcIBUHpceQQchDAPukV5MHkAIUIBUHpceQYchDAPukV5MHk/Z/B//HkIHMQzD7/leTB5OGBp +cca5hbkIuQUhwQIgthB4IJUKHAQwJ3gceAi4BSAAAQG2AMABpgHAAqYCwAOmyQBv8qXAD3tIuA94 +z3KAAABs9CIAAEAoAQJIuAV59CLAADB54H8neOB48cDhxYogSQZyC+/45dnPcIAA3CADgBgQhQAb +DREBCiHAD+tyiiANBOjbtQdv80okAADPcIAAQFZGCs//5g8v+QLYz3WAAAS6AoUM6M9wgAAMOAGA +CaXPcKAALCAQgAGlz3CAAEzQBoBHCB4Az3CAAFAHAICG4MwgYoHMICKCBfSyC0/3E/AEhQDZEejP +cKAALCAQgCKlA6XPcIAA6J4CgNW4x3AAAIgTCaUA2ASlpg4AAP0HD/LgePHAz3KAAGhYIIKA4coh +wQ/KIsEHyiCBDwAANBHKI4EPAAC+BsokIQD8BmHzyiUBAQGiAdrPcaAAyB9QoUoZmABIGRgA0cDg +fs9wgABoWOB/AIDgeM9xgABoWCCBANiD4cwhIoAC9AHY4H8PeAoiAIDxwBfy4g/P/4DgyiHBD8oi +wQfKIIEPAAAzEcojgQ8AALcGyiQhAJAGYfPKJQEBz3CAAGhYQKDRwOB+4HgIcyhyz3CgALAfG4AC +IIAPAAIAAEkAIABoceB44cVTIEIFBCCND8D/AADPcIAATNAFgAIggwAEIYIPwP8AANW5Inile0V4 +EHPKIK0ABfcQcwDYyiBmAOB/wcXgePHA4cXYcLhxug/v/5hyCHXIcLIP7/+IcRB1yiCtAAr3EHUA +2MogRgGYD+b/yiEGAb0GD/I2uDa5MHDWIIUPAACAAOB/InjgePHAMg4P8gomAJDPdYAATNAR9M9w +gACwa6lxggov/xTaz3CAAJhYKgtP889wgAC4WBTwGw6REH4Mj/OpcV4KL/8U2s9wgAC4WA3wqXA+ +CyABBdnPcIAAmFj2Ck/zz3CAAHhY7gpP8wSVCrgFpQaFhiDDDwalDgsgAMlwmglP8yEGD/LgePHA +ocEIc14N7/eLcILgANgG8gDAEHMB2MIgDgChwNHA4H7gePHAANnPcIAArDAaCCAAIKDPcIAAKFa6 +D4//0cDgfuB4ANnPcoAACAcioiOiJKIloiaiIKLPcIAAdFggoM9wgADYWCCgL7Iuss9wgADwOOB/ +IKDgePHAz3GAAKwwAIGa6AHYAKEA2c9wgAD8FrYP7/8goIoghw5WCO/4iiHPBM9wgAD4IBCIg+BY +CSEAyiBhAdHA4H7xwPIML/KKIMcPpMEqCO/4iiGSAEoOT/iA4JwJAgDPcIAA/BYAgM9xgADwOIYO +7/8ggc92gAAIBy6WT5ZZYTBwAN3E9wIgTQAAhpXoE+3PcYAA2FgAgbhgAKHPcYAAdFgAgbhgAKHP +cYAA/DoSgbhgEqHPcIAATAYAgADfDQhRAM9wgAB0WOCgiiAIAM9xgADYWKYPr/gggc9wgAB0WACA +QsVAwM9wgADYWACAENlBwACGotoe20PAi3CaC6/+GLvPcIAA/BYggM9wgADwOOCm77YgoO62z3CA +AEwG4KACDC/5EdjPcIAA2FgAgB0IVAFeCCAAAdiaCI/7z3GAAPQ7GoEB4BqhBfBGCCAABdhNBC/y +pMAV2ADaz3GgAMgfbxkYAODYkLgQoQnYsBkAALQZAAB02EIZGAAA2Jq4D6GkGYAAz3AADAAZDqHg +fs9ygAAoViWCI4FhuGCBz3GAAPwWIIHVuXlhz3OAAEzQZYMFKz4AJ3HHcQAAABAxBq//SHDxwOHF +z3WAAAgHBoWS6M9wgACsMACAHQhRAFoLD/kVCBAGz3CgALAfG4AEpQHYBqW5Aw/y8cDhxc91gAAI +BwaFGOjPcIAArDAAgCkIUQAmCw/5IQgQBs9woACwHxuAANoFpdIM7/8khS6VRqU4YA61eQMP8s9w +gACsMACAFQhRAM9woACwHzuAz3CAAAgHIqDgfuB48cDPcIAArDAAgCMIUQDPcKAAsB8bgM9ygAAI +BwOiggzv/yKCL5I4YA+y0cDgfuB48cCmCg/yGnCKIAgAz3agAMgfEKYB2EEeGBAeCQAAz3WAAEzQ +A4UlhdW4MHDKIc0PyiLNB8ogjQ8AADURyiONDwAAnADKJC0ADAJt88olDQHiCI/z0giv8wh3OnBM +IACgzCBioD30AIUYpgGFGaYFhRSmA4UVprILT/i5CBAAz3CAAHAmFIitCNEBF4a3hgQgkA/A/wAA +FYbVvQoKL/QqcdW4AiBDgwUgAQQ3pgLZM6ZahjuGEgAEAEIrwAcCIsKAAyEBAArwZJcKu6J7eGAC +IgKAANsDIcEAWqY7pirwVQiRIASXCrgWps9wgADcIACAuhAABjEIXgHPcIAAcCYUiCUI0QEB2BOm +OIYZhgDbAiFBhAMgwAA6phumFYaGCS/0KnEH8ACHGqYBhxumA4UXptUBD/IA2Za5z3CgANAbM6Dg +eAMLnkXgfs9wgACYWCeABukDgECAAoFCeAXwz3D/D///4H7xwEoJD/LPcKAALCDwgM92gACYOAqG +pYYCJwEQDQ1EEAaGHWUifQrwz3IBAIDsAdhKC6/+MobqpgCGz3aAAFBYGQheAH4KYAGpcHYPz/YI +cbILr//JcAXwOguv/8lwVQEP8uB48cDPcIAA2FcmC6//4cXPcIAAPLoViM9xgADwV891gADonovo +AIFCIACAyiBiAAXoAIWhCBEA+gqv/yhwz3CAAAhY7gqP/0KFz3CgALAfO4A2uja5DQmFAChwgCAQ +AAPwKHBghQQVBRAAI4QAACUGAB0OBQEKIcAP63KKII0Dx9sNAG/zCiWAAQAkRAH9DgWBAiSEAS8k +BwEVDQUBCiHAD+tyiiDNA+kHL/PO289wgAAgWACAQiAAgMogYgAG6IBxA4XJuQ0JAACIcM4Nr/4A +2Y0AD/LPcYAA3CAkgSiBBCG+jwAGAAChwQT0EwkfAAnwBCC+jwAAABgD8gDYAvAB2M9xpgCkABeh +4H+hwPHA4cUIdc9xoAC0R3ERAIYEIIAPcAAAAEEoPoX49Yog/w9vGRiAaxkYgAPaD7rPcKAA0BtR +oAWFz3KAADhZWRkYgAaFQIJaGRiAB4VbGRiACYVYGRiACIVXGRiABCCADwAAAIAPCh8AgOAG2Mog +4QEC8ADYz3KAANwgQ4JIgs9zgADIBSMKHgBPIAICjbqXukajBSCCD4AAQDpHowUggA+AAMBTD/AF +IIIPgADAJEajBSCCD4AAAD5HowUggA+AAIBXCKOEEQCGCaMGhaoNb/UhhfoO7/8BhXkHz/HxwPYO +7/EA2jpwz3CAAHDGEIjPdqAAtEdEIAEOQinQAAp1cRYBlgQhgQ9wAAAAQSk+hfn1QxYBlkYhAQ1D +HliQVxYBlry5v7lXHliQXxYBlr+5Xx5YkADZnrlTHliQ4HhTHpiQYB4YkD4Nj/zPcIAAWDEggGB5 +BNgR6DoJL/upcM93gADcWwCPEw0AEM9wgADcMhaAQHgAHwIUcgiP80MWAJZFIAANn7hDHhiQjQkQ +ICMJUCBjCZAgCiHAD+tyiiBaCoojDAlKJAAA3QUv8wolQATPcIAA3CADgBC9m70yIIAPAACwAp+9 +gOAB2MB4D7ileF8eGJBxFgCWBCCAD3AAAABBKD6F+fWKIP8Pbx4YkGseGJAS8M9wgADcIAOAEL0y +IIAPAACwAp+9gOAB2MB4D7ileF8eGJAGyITg0A3h+MogIQQRBs/x8cC6Dc/xCHUodtoO7/EBgKCF +ELlBLQAUOGDKDu/xyXEQubB4OGC+Du/xQC6BEvkF7/EocPHAhg3v8QTZANjPdaAAtEdLHRiQANqQ +uncdmJAB2ncdmJDPcqAAhEQYogDakbp3HZiQAtp3HZiQz3KgAIhEGKIA2JK4dx0YkHcdWJCA2Hcd +GJAA2J64VB0YkADYnLhUHRiQz3aAABgGyXCqC2/zHNnPcIAADAaeC2/zCtnPcIAAyAWSC2/zRNnJ +cCEdGJDPcIAAnAQQeEkdGJBZBc/x4Hj8HAi08cAfCHQBGnAKIcAP63KKINoLetsKJAAEbQQv87hz +iiAZCgIIr/gKcc9zgAAYBiSDaHA0eCCQHwkeAhATBAAAEAUBCiHAD+tyiiDaCjkEL/OB2ySDAeEk +owDaCQkRAkSjLyEHBIUhDAAgsJDZz3CgAPxEGLkioAuTAeAQeAuz0cDgfwQUEDTgePHAiOjPcIAA +vKbeCm/zJNnRwOB+8cBGDM/xqg5gAQh2Gg+AAM9xoADIHwh1QNgPoUARAQYweWYM7/jJcIkE7/Gp +cOB48cASDO/xSiQAcs9woACIIADeqCBAD3UO0BGggM9xgABcus9ygABM0NZ5aIlHgnpiz3OAACi7 +1Hud7QAmjR+AACC7+I0TD5EQ4JP7fyORgL8kf+CzBfALD1EQIpEgswDZOK3PdaAAyBz6hSCT5Hks +swTwLJMJCUUDWWEE8KyzuWKJIc8PBBhQAAHmANnPcIAATNDpA+/xJ6DxwAAWAUAHGlgwABYFQAEa +WDEEEoEwnOHKIcIPyiLCB8oggg8AANwOyiOCDwAAygrwAiLzyiRiAJ4I4AAO2dHA4H7gePHANgvv +8ZhwFcjPdoAAULvwJgEQz3OAALC6AxINNggcRAAVEgE2QZWA4jR7yiIhAAzygBMAB6EIEAAA2oAb +nADwG4QA4BuEAECzAYUfCJ8DSLPQG4QAEI0FuMdwgABMyOWQCw9SEGG/5bAAIYAPgADMukSoTKhU +qM9wgABcujZ4ApDAG4QANX5ApngbBAABhQQggA8AAABgIQiBDwAAACDPcIAAXG/wIEAAz3GAABQg +FHkAkRDgALED2c9woAAUBDCgMg9gAYhw2diyDW/4ARIBNj7wcBUAEeATAQECIQ4ADwiEA8J4AnpQ +eoAbnADPcqAA1AcPEg6GANjwG4QDcBUNEcAbBACieTB54BtEANATAQEB4TB58BMFAdAbRABTJX6A +yiHCD8oiwgfKIOINyiOCDwAAtw3KJIIPAAD+AKABIvPPICIDA9gTGhiAUQLP8fHA4gnv8QDYz3GA +APhYAKEMzM91oADUB1EgAIAD2CAdGJCjwVXyFB0YkAMSATYAFgBABxoYMAAWBUABGlgxBMqc4Moh +wg/KIsIHyiCCDwAA3A7KI4IPAADKCjQBIvPKJGIAKHDeDqAADtkDEgE2z3KAAEzIEInDuAW4AGLP +coAA3CAtuMC48CIAAASirxACBs9wgABcukCgDxUAlrQZBAAQiVMgwgCGIP4DRLjEGQIAUKkGyB4J +b/cVEgI2AxIBNpIRAAH+DS/8lBEBACfwSiRAABQdGJEAFgBABxoYMAAWBUABGlgxBMqc4Mohwg/K +IsIHyiDiCcojgg8AAEwCkAAi888gIgMDyLQQAAEPHRiQy9gaDG/4FRIBNhUSAzbPcIAAsLoUIMIA +yJIDEgE2nu6YEQ4AdXjOoNagz3CAAFxv8CDDAM9wgAAUIPQgwwC8GcQA0BIAAQQjgw8AAPD/w7hl +eNAaBAAG8NASAAG8GQQAAdigGQAA9g7v+9CJgOD0AyEAAxIDNgbIUSCAgeQDAgAhgxMJngaQ2JC4 +2QMgAKAbAADPcIAATMhAIAIDBb7OYsQTggARCoADkdiQuLUDIACgGwAAyoPPcqAAyB+kEgIAjCb/ +nwzywnoVCoUPAIAAAIfYkLiNAyAAoBsAAFCL9WrmYAQmvp8AAAAT+GBY8hMOXhKL2JC4bQMgAKAb +AABpDh8TJZCb6QfIBCCADwDAAAAfCIEPAMAAABHYFLigGwAA4dj6Cm/4SHEDEgM2IPCI2JC4oBsA +AOLY9fHiCm/449gDEgM2pBMAALS4pBsAAJITAAGnuJIbBACeEwABp7ieGwQABvCF2JC4oBsAAM9w +gADcIAOAGIiE4OgCAgDPcYAApKEMgVCLDyCAAAyhz3GAAOQGAIEB4M0CIAAAoUKQMxOAAE8KDgAH +yAQggA8AwAAALwiBDwDAAAAIiysIUwCkEwAAtLikGwAAkhMAAae4khsEAJ4TAAGnuJ4bBAAJ8BMJ +ngGN2JC4fQIgAKAbAAAGyFEgAIAcAgEAeg2P/wMSAzYIcrATBwGoGwAAz3CgAMgfNYBVJ0AG1bnP +doAATNALCQUABdgHpgWGIniMIAmGyiElAKQTAAAJIYEA8risG0AA7/KYE4EAw7kHyDx5BCCIDwEA +APAVEgY2z3CAAFy6FiCAAcWQrBMAAAkggAN+Ew8BgBMOAf5mz3eAANwg5IdGFw8RQSgIE/5mCCCA +A8J4mBMOAOi+AN+J8kDGIMHPd4AAqGMEJoQfBgAAAC9nQSxBBAQmhB/AAAAAQSyEBflhz3eAAABu +MidFEDInDxFBLoESUiEBAMC5A7mgdxjhhefKIY0PAQCJDdUhzgOkEw8ASQ8eFSJ4hBMBASJ4SCAA +ADpoQS5PE8C/BL/0f8lwxrhJIMAFFH/PcIAA5GXwYA0O3hJBKA4BFCYAEAUofgBBKQByAN9b8EEo +hABBLk8TwL8Ev/R/yXDGuEkgwAUUf89wgADkZfBgDQ7eEkEoDwEUJwAQBSg+AUEpAHKEEw8B+WEQ +4UEphABBLkETwLkEuTR5yXfGv0knzxX0ec93gADkZTFnDQ7eEkEpDgEUJkEQBSk+AUEpD3Ih8A0O +HhCGJvyTBPLpcBvwA+DPdoAAvGXwJkEQIrgFKT4AL3BTIA4A2GCEEw4BHXgn5iK+BSm+Ay93UycB +ED9n/X/PcaAAxCzvoe6hQCgOFp6+QC4PBeV+xXjAGwAACqHPcYAAtDkB2AChCfDPcKAAyB+gEAIA +sBMHAQ8KxQEF2Bi4oBsAAM9wgABsB0GAIJMJIYEAAIgRCFEAGRUAlhBxANgD9wHYjOgD2Bi4oBsA +AM9xgAB4OxCBAeAQoaATAAAEIL6PAQEAABn0khMAAZQTAQCQEwIBshMDAVoKYAFKJEAAAxICNqAS +AQAleKAaAADO2IYPL/gBEgE2AxINNqAVABAEIL6PAQEAAAby9g9P9xcFQAADzM9xnwC4/xihBshR +IACAyiYhEHbypBUAEGsIngTPcYAAtDkAgYDgAN8z8gDYAKGAFQARfhUPER9nz3CAANwgBIBGEAAB +H2cBCZ5Fz3CgAMQsy4Df2A4PL/jJcVMmgRT+vswhIoAK8pgVABBuCK/2ANp0uB9nA/AA3wMSATYA +3gnwFcjPcYAAXLoWeeWRAN6pcc9woADIH6wVAxCH76QVAhCxuqQdgBAD8AkjwwMD2hi6T6D4EAIA +oWoII0MDQnugGMAAANqYuk6gDO+kEQAA8bgNzMUgogTPIGEADRocMAGRCegVyM9ygACwu/QiAAAE +6AGBDQieAw3MgLgNGhwwzNhiDi/4BhIBNgMSAjakEgEAFQkeBrYSAQHPcKAAmAM+oJ/wABYDQXyy +ABYAQR2yABYEQDwaAAEAFgBBQBoEAAAWAEARogAWAEFIGgQARCMAAzcIEAEY3XIaRAMAFg1As6IA +Fg1BUBpEAwAWDUFUGkQDEwgRAmh1hiXzH4wlDJAL8hjdE/AQ3XIaRAPPd4AAwLvHtwvwHt1yGkQD +ABYPQPaiABYPQVwaxANod4Yn/RyMJwKSCvQC5bB9chpEAwAWD0FgGsQDBPBgGoQDCQ1eEAAWD0Eo +dIQkDJAF9EokAAAg8JjoUSQAgNEhIoIS8vCKqLnPcIAATMikGkAABb/gYAsIngeLuaQaQADaotui +6PEAFgBASiQAAhqiABYAQBuidBIAAb4SDwECf6J/uBKAAAInDxGYuaQaQAACf7hgEHhyGgQAuhIA +AfB/cBrEA2V4HLLPcKAAmAMegLYaBAC8kkQlABO9CBABFcjPcYAAsLoUecARAAHPc4AAwLsFfQGC +vLIXCF4DVBIAAbwSDwHDuOV4VBoEAIYl/RyMJQKSD/QQis91gABWyAW4EGUPCFEAYBIAAYS4YBoE +AAGSJOjQEQABVBINAcO4pXhUGgQAgBEBB4XpPJKKuTyypBIBABcJHgJoEg8BUyDNAP1lsH1oGkQD +FQleAmoSgQDDuDhgD3hqGgIAB8gEIIAPAMAAAA8IgQ8AwAAAx7ME8ADYi7gHswGSFOgVyM9xgACw +uhR50BEAAVMgwIAK8vARAQHPcKAAmAM+oLYaRACkEgAABCC+jwAAADAH9IYg5Y/EDGIAyiCCAADZ +CtjPcqAAyB8eohDYDqIB2BUaGIAocBTwz3KgAPxEHYJZggDZDwrfAgQgvo8ABgAAAvIB2QQggA8g +AAAAUSAAw8whIYDMICGAA/TRCx7ALwseQM9wgAD4WAHZIKADyKQQAQCauaQYQABWCa//AdjPcYAA +7DwCgQHgAqFRIADDANgJ9M9xgABwPAWBAeAFoQDYmLgP6CIIz/0D2c9woAAUBCOgiiAQAAsBYAAG +GhgwA8ikEAAABCC+jwAAADC/8hUIHwX6CE/21tg2Cy/4BhIBNgPIpBABAI8JHgMmCy/4zdiiDK/z +AdgDEgE2A90dsc9wgADcIGSAz3CAAAS6BoDPcqAA9AeB4AHYwHgMuKWihSACDQ11ALUDyL2QDXCg +sAPIr4AA2Q8NHhCigw1woKBmkwbwDXCgoAPIQBADAQ1wYLADyHGADXBgoAPISBADAQ1wYLAkooYM +D/oGEgE2TwBgANDYngov+NHYAxIBNgGBIQgeBs9wgACIBwCQHbHPcIAAjAdAgAGAUaESoQjw9guv +8wLYAxIBNh2xmg/P/QPI3gqv/3gQAAGA4AYAQgDS2FIKL/gA2QMSAzYBg5gTAQCUG0AALQgeBs91 +gADc1Klwqgwv+mhxENgMGhwwDcyjuA0aHDCmC6//qXDHBwAAnhMAAb4TAgGSGwQAkBuEAGYIYAGC +EwMBCHXP2PYJL/ipcSENHhYD2c9woAAUBCOgiiAQAAYaGDD92IcHIACpcQPIpBABAIYh5Y+ECkIA +AxIONqQWABD0uHYCAQBQjs9wgAAsx1Z4z3GgACwgb4GEFgERoJAII0MAInsJI0EDsBYNEWTlFw3E +EM9ygAB4Ox2CANkB4B2iKHCm8AW6z3OAAEzIQmMEIo0PgAMAADe9Zb1IJQ0QBCKCDxgAAAAzug3i +AN8PJ48QAxCQAOIMb/eYFgAQmBYCEAkgwQNBKkMDwLsEu3R7SHDGuEkgwAUUe89wgADkZXBgDwre +AkEoAgEUIgAAKLi4eAPgBCCADwAA/P/PcoAAzNADos9yoADELA2iMBoABAfIFRIDNgQggA8BAADw +LLgYuJ24FLtleAV5KqLPcoAAcDwcggHgHKLGCC/43tgDCZ5Fz3CgAMQsq4Df2LIIL/ipcQQljx/w +BwAANL9TJYEUEQ2eFw0PlBAAlhDgCwhEAAMSDjaA8RCOz3KAAEzIBbgAYvu41SHCA891gADM0CCl +4qWYFgAQ4glv9gDaAaXPcYAAeDsegQHgHqEcgfhgHKHPcIAA3CADgAmAEQheAA3MRiCAAg0aHDAD +Eg42AdgA2TbolBYAEJIWAxHPcoAAzNDCkuCCQMDPdaUArP/PcoAA3CD4pUSCVhICARTiQn4D5iK+ +2mbaYkgiQgAFukUiQgNWpVEjwIHKIYIPAACAACDCBCCADwAAACAluEV5JXiJuI64GaVyD8/ydwUA +AKQWABC0uKQeABCSFgARp7iSHgQQlBYAEJAWDRHPcqUArP9AwLAWAxG4os91gADcIKSFVhUNERTl +onsD4yK7fWO7Y0gjQwAFu0UjQwN2oiDDBCCADwAAACAluGV5JXiJuI64GaID2c9woAD0ByWgFciY +FgIQz3GAAOi6FXlAoaQWABAIdIQkGpAY9AQgvo8AAAAJCfJKDa/9yXDGDa/9A8gM8HAWAhHPcKAA +9AcA2Uegz3CgAMgcJ6ADyKQQAAAVCB8BvgwP9tvY+g7v9wYSATYDEgE209juDu/3pBEBAAMSAjYB +ghEIXwZeCK/zBNgDEgI2HbLPcIAABLoGgAHZgeDAeQy5z3WgAPQHGYVKJAAAgODKIcIPyiLCB8og +4gzPICIDyiOCDwAARAr8AqLyyiUCARySJXgNcQCxA8g9kA1wILADyC+ADXAgoAPIQBABAQ1wILAD +yDGADXAgoAPISBABAQ1wILADEgE2HJGGIP8MPwgQATOBDXAgoAPIUBABAQ1wILADyFQQAQENcCCw +AxIBNhyRhiDzD4wgDIAJ9DaBDXAgoAPIXBABAQ1wILADEgE2HJGGIP0MjCACghv0YBEBAQ1wILAD +EgE2pBEAACcI3gU5gQ1wIKADEgE2pBEAALe4pBkAAGQZAAG4GQIBuhkEAaQRAAAEIL6PAABACAfy +AYHwuKQOQvMO8DqBDXAgoAMSATakEQAAhiDzjwTyO4ENcCCgAdkrpQPaSKXPc4AA9DgVEg02QIMA +2DsNgBDPcqAAOC5FggQigg/AAAAAIQqAD8AAAAD12AW4z3KfALj/GqK7omnYGLgZoihwBwhRAKCj +z3CgAPxEPYAZgGcI3wIEIb6PAAYAAC304HjgeOB4UwheQwPIz3GgAMgfsBAAAZYgQQ8eoRDYDqEB +2BUZGIAmC+AAQdgvCF5Dz3CAAPhYAdkgoAPIpBABAJq5pBhAALIKb/8B2M9xgADsPAKBAeACoYIM +AAAacNTY2gzv9wpxBCC+rwYAygAg8s9wgAC4HwOAgODKIcIPyiLCB8og4grPICIDyiOCDwAAOgTK +JAIEBAGi8solAgTPcYAA7DwFgQHgQwIgAAWhA9nPcKAAFAQloAMSATYBgU0I3gCkEQAAz3GAANwg +USAAgASBA/LbkALw2pDPcoAAcMYSii0IHgAjgQ+KELgyIYEPAACwAp+4gOEB2cB5D7kleM9xoAD8 +RA2hBPB2EQ4BDcxTIECADvLV2CIM7/cGEgE2BsgEEgE2Bgyv9hUSAjbPdYAA3NSpcHoO7/kDEgE2 +dgxv/8lwgODR9AMSATaSEQABEQieAqq4xgwv+5IZBAADEgI2fhIBAYISAAGAEgMBOGAbYxXIz3GA +ACy7cHsVeQmBeGAJoQGCwwjeANfYrgvv9wDZZgzv+YDYBhIBNgQhgQ8CAAEADRIDNxkJgQ8CAAAA +EQheB08jwgANGpwwBvCju3B6DRrcMAMSAzYBg1sIngFPIsACjLgQeg0aHDAQizMTgQAEuCV4z3aA +AMiwz3GgADguJIEGthDwLy9BEE4njRcA3w8nTxPmec93gADgxfQnTxMRCMAD8enPcAAA//8EtgPw +pLYI2AwaHDABg/24zyLiAdAi4QHPcYAAeDsTgQ0anDAB4BOhMfAQ2AwaHDANzKO4DRocMGoMb/+p +cNjY2grv9wESATYDEgI2AZIJ6BXIz3GAALC79CEAAAvoAYITCJ8DFcgB2gAggQ+AADi7QKkNzFMg +QIAJ8gQSATaKIAQAMgyv+5gRAQADyBqQhgjv+RUSATYNzAYSATYlCN4Aegrv99fYz3CAAMC7AxIB +NgKAmBkAAAbICg+v9hUSAjYGEgE23NhWCs/3bQcv8aPA8cDhxanBi3WpcM9xgACIYBoJb/Ek2qlw +qgzv+QMSATaiC+AAqXBZBy/xqcDxwOHFAxIBNqKBIIU6Cy/+JNoBhYDg4iACADkHD/HgePHArg4P +8aHBCHcA2EDAABaSQAAWkEAAFo1AABaRQEEoDiHAvkAvARSKIJMC0gnv98V5o+5pCBAgCnDPcYAA +oLojiYYg/AdFuAZ5UyDAIOC5yiICAMoiIQBgwuG5yiICAMoiIQABHIIwUSGAgMogIQACHAIwFPBT +IP6gEvIKIcAP63JAKg8kz3AAAK8oiiNeAQUnRBPNBW/yCiUABM9ygADcIPV6IIKELgQfKHCAIAsN +J3BmiAsNwRBkiC0LgAQKIcAP63IGEIQAEL3EiEAqDySH2I24iiNeBwUkRAOFBW/yBSbFE0AgDQKK +IxUFeGEIgHlhjO6BuAihIIIAwBzheWEAoSCCG6EE8IK4CKEAgiDgYGCGIH8OhuCKIBMDyiCCDwAA +ywTaCO/36XFAIUEgSSEBBjR54gogAKlwQiHAJUggAAAbCHQAANsA2gAWAUAB4vsK1IAB4/ULBIBW +JQAZugogAAbZ2g5P94voz3CAAHwmLJDPcIAA3CAekBkJAQCpcBYK7/3JcYogEg12CO/3AMGaC8/1 +dQUv8aHA4HjxwBoNL/EA2c9woAD8RHQQEAC5gAQlgp8AAAAIC/QEIL6vAAYAAAf0A8ikEAAA6Qie +Bs9wgADcIASAz3GgAMgfRhAAAR+hINgOoRcIniYGDc/0iiAEAA4I7/cA2TbwHQheJhIIT/MDEgI2 +CHGgGgAA8g+v9/zYKvADEgE2GwjeJG8gQwCgGQAAiiAIAAYaGDCKIEQC4fEdCJ4kANiXuKAZAACK +IAgABhoYMIoghALV8aQRAAA3CJ4GBdgQuKAZAACKIAgABhoYMApwWg6gAKlxA97PdaAA1AfSpUIM +T/0THZiTA8igEAAAF/AJ6s9ygABwPAWCAeAFouDxCiHAD+tyCiUACDLYjLj/24u7uQNv8gokAAQo +cGkED/HgePHApBABAA8JXgJeCM/90cDgfih0hCQSkBHyDQlfBsIKT/cH8CDZz3CgAMgcKaAD2c9w +oAAQFCWg6/Hr8fHAvgsP8QonAJA6cQDdFvLpcS8oQQBOIIIHz3CgAAwtT3rwIIAAwrgPJQ0QANgP +IIAABiEBgO/1Ku0vKEEDTiCOBxUamDP12AW4lg/v98lxFcjPcqAAFAQKos9xoABkLvAhAABTINAE +KYKiDq/32tgqcKYJb/YEIMEjWg5v+8lwANgPIIADBiUNkNn1z3KAAPQ4AIIH2RUaWDA/CNABz3Cg +ADguBYAEIIAPwAAAACMIgA/AAAAA9dgFuM9znwC4/xqjO6Np2Bi4GaMB2ALwANgHCFEAIKLPcKAA +FAQqoEEDD/HgePHA5goP8Sh2RiHNAB1lMgggACK5wb4fDlAQEw6QEB0O0RAAFoBAAR0SEAAWgEAB +HRIQABaAQACtGQMP8asJEABAIcIDJLrDuQLwANmVCRUEMyZBcIAAOGBAJwNyNHsAewAWAUAEGFAA +ABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAA +FgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQAAAW +AUAEGFAAQiJCgLP14H6A4cokTXDgeOggrQEAFgFBAhhUAOB+4HjxwN4JD/EA3c93AAAEHUogACKp +dhUigDMWEAEGANjPcqAAFATKoqiiJ6IEoj1liOFoucohDgDGDe/36XBCIFAgIOfVCHWgAeb5AQ/x +4H8A2PHAggkP8aHBGnBKIwAgABzANIogBwnCDK/3CnHPcIAA9FsyIBIEz3CAAMAG0YgSiBB2UgEJ +AGp3CiHAJALwenVELr4TACJALs9xgAD81TMhDQC7fS8IMyatfc9xgABoGRqBO4EkeB8IHgLPcIAA +wAYLiItzyXGKDy/4qXIAwAJ9rX0AJoAfgADABhwQwQDPcoAAZD0AigXaMg8gAKlzz3GAAChZIIEA +3UokgHEieKggQAVzbnR7tXvPcoAAhJ55YiGJemIK6SMJAAApCEIAMQ1TEQHlr30L8EIlkRAvIUck +Yb2vfRDwAxLPAADZanUN8IDlSiEAIMolYRAG8kIlURAvIUckAdkt6fNu9H8VJ0ETz3OAAISeOmMA +I0UAFSdPFPljIYlBivtjNQmjAOOLAiJEAAMVggAEv/B/IngEui8kCAECJ4MQbHgvIEYOkgkv8Yhx +DngCfwjn7n9Ev+1/CwgSJgrn7X/JcApxqgwgAOlyAebPcIAAwAYSiM9+EHbCBsz/WQAv8aHA8cAG +CA/xCHYodUh3GnNPeRC5D3gIuAV5iiBHCDILr/eleYDnzCAioAjyLG0vec9wgADABjOoB/DPcIAA +wAazqKlxz3KAAMAGtKrAqvWqFhoCBA4KIADJcAAQhwDhiM9wgADABtGIEogQdp4BCQBELz4HL3GE +LgMRCiRADgAhQw4KIYAfgAD8niFzQC+CAFR6hC4BFQolQA4AIk0OCiaAD4AAANUAJkgDACaNH4AA +wAZMJwCAzCdigCb0GhPAAADZGK0bE8AASiSAcRytGIsgHQIQqCBABhQgQBBBiLNutH01fcd1gACE +ngAQwABArRUjQgABrQESwAAB4QKtAIoveQOtevABE8AAmOgA2litXK0gHYIQSiSAcQDZqCDAAxNu +FHg1eMdwgACEnkCoQahCqEOoAeEveWDwfLkAJEQAbLoAIkEBACGFAQAkQAIaiDqL+gggAOlyGK0A +JEACG4g7i+oIIADpchytACRAAhiIOIsAJEQC1gggAOlyIB0CEADdSiKAERQlSwMUIEkTAROAEAER +gRC2CCAA6XIzbjR5tXnHcYAAhJ4AqdhxABOAEAARgRCaCCAA6XIBHgIAFSRLAxUjSQMBE4AQARGB +EH4IIADpcgIeAgAAE4AQABGBEG4IIADpcgMeAgBCIkoQAeWZCnWQr30B5s9wgADABhKIz34Qdm4G +zP8A2c9wgAAkWV0G7/AgqPHA4cXPdYAAZD2KIMcJLgmv9yCFAIXPcYAAIFkggU1oMHLAIGwBzCEM +gCQLCQBBBs/w4HgCeS15THlWIQFyR7k4YOB/D3jgePHAuHE1CFEACQ1SAB0N0gMKIcAP63LPcAAA +1xSKI0cPNQUv8kokAABALYEAZLkAIYAPgAAkFB3wz3CAAIwXMiBBAYwhw4/KIcEPyiLBB8oggQ8A +ANgUyiOBDwAAAwL4BCHyyiQhAM9wgABUFjV40cDgfuB48cDPcoAA0gYKaqIJIAAparoNAADOCAAA +z3GAAOhuIIHPcIAA0BIiCCAAAdrPcYAA5G4ggc9wgAD8EQ4IIAAA2tHA4H7xwO4Mz/AacEh3kQly +AADdOnEVIEAjQIgCiAzvz3aAACQUFX4CuBR4x3CAAHwTC/DPdoAAVBYVfgK4FHjHcIAAXBQhiEsJ +HgAFEMEAIq4GEMAAA67pcHIMIABIcQCugODMIGKAyiAhABLyRCg+BwAhgH+AAPiexRCDAOEQgQAC +IsAAEHgHuL4N7/BieQGuQiFBIIEJdYAB5bUEz/DxwFoMz/DPcIAAwAYREIgAz3CAAMAGEoirCAIC +SiYAAEohwBFELj4HL3CEKAMRJ3AAIIEPgAD4nh8RywAAIIEPgAD4nh4RygD4cADeBt8AJ40PgAD4 +ntV9B41pcQXamHAyCiAABRXDEEAuggBUeoQoARUAIkEO1HnHcYAAANW4cQCpiHBJcQfaCgogAAYV +wxABHQIAYb8B5rcPdZDPfkIhSRBAJkYAgQl1kC8mhwFAIEgQz3CAAMAGEogvIAcSYQgDggEEz/Dg +eALbYKgA2ACpAdjgfwCq4HihwfHAfgvP8KHBZcIIdih1z3CAALoGhcGLckAkQzB2CyAAAIhELr4W +ACVAHhQUwTDPd4AASKH4YHcNMxYgqFMlgBBNCFMBRiXNEa99G/ABFIAwACaBH4AAbNJSbVR6WWEg +wgCpRC6+FgAlQB5EqRQUwTD4YCCoyXBeCCAAqXEB5a99UyWAEMsIUoEh8AEUgjASbRR4ACaBH4AA +bNI4YECoIMJEqMlwMgggAKlxD/BCJQAWD3gBFIEwx3aAAITTArgUeB5mIMAorgyuCNwfA+/wocDg +eOB+4HjxwKYKz/AA3s9woAC0D3AQEACKIMcIz3GAAGQ90g1v9yCBz3CgALQP3KDPcYAAwAZSibGJ +IwpCA89zgADgpn/YFCVPE39nAK/BrwHlr30F2O8KY4MCr89wgAD4nkGQz3WAAChZwKUJ6s9wgAA0 +WQCAjCAfhAP2ANkU8P8Ig48AAKAPQnhAiYDiiiEPCsAo4gAE9EQovgMvcF4Lz/AIcQClTg1v94og +xwgA3Q7ez3eAACReagjv/6hnYb4B5fcOdZCvfc9wgABkPSCAz3CAACBZIKDPcaAAtA9wGQAELQLP +8A54LHgpagDYDyBAACdwWnjgfw4gwADgePHAognv8IoghwjPd4AAwAbmDG/3M48Aj+4L7/8zj89w +gAAcWQAQ0gDPcYAA0CMUj1qJIQoBAACPOIkZCEEAz3CAACVZABDAAAkggAQvIgUgEo+xj7MIQgMA +3kojgCPPcIAAHVkAiBHoRC2+EwAmQB7PcYAAHFkAEcIAACCBD4AA/NVAqTbwSCJAIC8gBSDPcIAA +JF7LYBOPqXHuDG/3VY8JIAAEDXjPcYAA3AZ8ublhz3KAABReymIgEYEAQnkJIQEARC2+EwAmUR4T +jwAhkC+AAPzVABhCIKlxRg+v/8lyz3KAAPzVMyJBBAJ5ABhCIEIjUyAB5msLdaDPfgHlEo+vfVkI +Q4P1AM/w4HjxwKYIz/AIdc9wgACGMQCIKHcTDQEQz3CAAIUxAIhTDwAQz3aAAMAGqXBAJoESAgsv ++EAmwhIKjq96K44Yugi4BXqKIFQNpgtv90V5Ko4EbsIJL/hLjgqOPggv+CuOz3CAAIYxoKjPcIAA +hTHgqKEAz/DgeOHFmeiMIcKNAdhZ9kokgHHPc4AA2J+oIMADoWtEKD4HMiVNHhcNQxAH7RMIkAEB +4A94ANgD8GG4D3jgf8HF4HjhxeHGABHNAAkNExAA3aCpG+gNDRMQANgAqQDdz3CAALhcAJALDQIQ +qWitfaCpz3CAABBcFCBOA6COoKoAEcEANHgBiBnwCw0TEADdoKnPcIAAZF0AkA0NAhCpaK19oKnP +cIAAvFwUIE4DoI6gqgARwQA0eAGIAKvBxuB/wcXgePHAdg+v8ADYocEAHAQwz3WAACwHAJXPdoAA ++J7JcYoiBAoqCu/3AduP6AohwA/rcgAVBBHPcAAA2xRu24u73Qbv8YolBAoAFoQQTCQAgcohyw/K +IssHyiCLDwAA3BTKI4sPAABzAM8j6wKwBuvxyiUrAPYKT/eA4Mohwg/KIsIHyiCCDwAA3RTKI4IP +AAB5AM8j4gLKJCIAgAbi8colIgCLcUXYAdqmCe/3AduP6AohwA/rcs9wAADeFHzbi7uKJEEBWQbv +8UolAAAAFAAxAdmGIP4PwODAec9wgACMGCCoAQev8KHA4HjxwI4Oj/AIddd1JQAAgADYSvfPcYAA +TNAlgSUJRQMifQHg+fHPcIAATNDFgKlwig+v8MlxBS4+EAIlTR6MIBCAyiHGD8oixgfKIIYPAADN +Isoj5gzKJCYA2AXm8colBgEWuJkGr/ClePHAIg6v8ADZz3KAAAS6BIKG6M9wgACYOAeAA+gB2c9w +gADcIOOAz3WAAJg4+I/AhVMmAxALDxARDoALCF8BAN4x8AeFg+gA2BGlgOPMISKACfIJhQ8IHgEV +Dh4RAYUNCNEDANgIdhXwANgS8BGFAeARpREINQEI3gGFj+AA2Anyz3agACwg0IYB2MOiCN6whYjt +g+uG6YboTBKAAAcIkQAE3ukFr/DJcOHF4cbPcIAAmDhAgAKAP9sGewxwz3aAAJg4oobPcYAABLoL +IECDAdgugcIgAQALIUCDwLoG8imGUSEAgc8gYQALIMDACfTPcYAABLougQshwIAA2QLyBNmE6g8J +EAGF6ATqCQkRAQTYwcbgf8HF4HjxwOHFz3WAAFBYSg8v/qlwz3CAAJg4IIA/CV4AFBAEABgQBQBR +IQCAzCQigMwlIoAJ9AohwA/rcoogzQt1BO/xx9tCDu//ACUAATYLj/UIcXIPL/6pcC0Fj/DgeM9x +gACYOACBUSAAgc9wgAAgrUiAUyIDAAT0AYEhCNADC+sXCt8Bz3CgACwgEIANoQHY4H8LoQLY4H8L +oQrrFQrfAc9woAAsIBCACqEB2APwAtgIoeB+4HjxwFYMj/AIdU0IEQGCDu/6iiXGHoogiQaCDy/3 +qXHPcYAACDXAEQIGGwr1DwDbEmoUeDhgoKDPdYAAUAeghaGgYqAB4sW6wBmYAA4IL/kA2ATdg/CT +CREBz3CAANwgLBCEAB0MEQEKIcAP63KKIA0MiiPHAIkD7/FKJQAAOBAEABsMXwEKIcAP63KKIE0M +iiNHAW0D7/FKJQAAiiBJCIolxxH6Di/3qXHPcYAACDXAEQAGHQj1DwfbUmhUejpioKLPdYAAUAeg +haGiYqIB4MW4wBkYAIIP7/gH2BYOb/gE3a4Nz/o58FMlfpAo8s92gABQBwCGguDMICKBL/SKIAkI +iidHFpYOL/fpcc9xgAAINcARAAYVCPUPCNpyaHR7O2PAhuCjwaNCowHgxbjAGRgAJg/v+AjYEfAd +CRECz3GAAJg4z3IBAIDsAd2pcDoNL/0ygQPwAN1pA6/wqXDPcYAAbAcNCFEAAdgAqQGpAImB4Mog +gQ8AAMQJyiCCDwAAgADgfwGh8cDWCo/wCHXPdoAA4DOKINgOBg4v9yCOiiDYDvoNL/chjgCOuGAA +rgGOHWUVA6/woa7geEGJBbjHcIAATMhIqCKJ4H8pqOB4FRICNgQgvo9gAAAAz3OAALC6VHvHcoAA +ILsIcQXyA8gckBcIngIEIYEPYQAAABMJgQ8BAAAAANgAswHYHPAMzAMSATYbCN4BMhGBAAGLDQhB +AADYAavz8QHgAasL8DERgQAAiwsIQQAA2ACr5/EB4ACrAtjgfxiq4cXhxs9ygACYB4DgwCIiAf/d +FWkAIIMPgABTyKCrAN1KJABxz3OAAMzPqCDAAq5ieGU2eMSormIB5a99wKjBxuB/wcXxwNIJr/CK +IMoFocHPdYAAcDlAlc92gABsOSCWELr2DC/3RXlAhSCGPwmAAM9wgACEKxmAQMENCJ4ATyEAAUDA +hOmA4ogPQveLcATZodo9294IL/0XuyCGBukAhYTo0g1P9yCGIKUo6QDanroA2c9woAD8REGg4Hgh +oM9woAC0DzygC8gEIIAP/v//AwsaGDALyIe4CxoYMH/YCrjPcaAA0BsToX/YEKEA2JW4EKEyCa/3 +AdiJAa/wocDgePHAEgmP8M93gADcIBV/IIdIgQQigA+AAAAARCIDAi+4BrsFewQigA8AAQAAQShN +Ayy4ZX0FfbcRAAa2EQ4Gaw0AEAQivo+AAQAAI/LPcIAAcCYUiDsI0QEyCs/2IIcZ6AiBvrgIoSCH +CIFEIAICBCCDD4AAAAAEIIAPAAEAAAa6L7tBKE0DZXpFfSy4BX23GVgDC+4vKYEDTiGABxIIIAAQ +Jg4Q+O7VAI/w4HjxwGoIr/CYcBsIFAQKIcAP63Jx2I24iiPNB/UHr/FKJQAESiQAdADaqCCADkAs +gwFVe8dzgADMywCDz3WAAEzIQCxBAd24IWUAo/G50SAiggjywIvPdYAAqGPNZRUNkxDPdYAATMoW +JQ0RoI0JDR4QnrgU8C25wLnPdoAA3CDwJk4QUiBNArcWARYLIUCDB/IohuEJnoefuACjAeI5AI/w +z3GAANwg8CEAAM9xgABcurEQAgawEAMGQqFhobIQAgazEAAGRaHgfwah4HjPcYAA3CDwIQAAz3GA +AFy6tBAABhYhAgACkhqxA5IbsQiKOBkCAADY4H8dsfHA4cXPc6AArC8Zg/C4GYMA3QzyBCCADwgA +AADXcAgAAAAB2MB4B/CGIH8PguAB2MB4GugZgwQggA8OAAAAQiAAgMogYgAhCFAACiHAD+tyZBME +AM9wAACuDYvbuQav8UolAADiCm/3VNhEIAICGQgeAc9xnwC4/72hAtvPcYAAlAdgoc9xgABsOVEg +QIAAgc8gYgDQIGEAAKEjCJ4Az3GAADBZAIEXCgAAQKEB2c9wgACoH7YOr/0gqC0HT/DgeOB+4HjP +cYAAcDwwGcAHnbieuM9xoADIHA2h4HjgeOB44HjgeOB44HjgeOB+8cB+Dk/wocEacCh2SHeKIBEF +tgkv93rZiiARBaoJL/cKcYogEQWiCS/3yXGKIBEFlgkv9+lxz3CgACwgMIDPcIAAADkgoM9woAAs +IBCAz3GAAAA5IIHPdYAA+DgieACli3EqDm/xCnAAhRUIxQMAFAAxxHjTDgGQAdgD8ADYZQZv8KHA +8cDPcqAALCBAEgQAQBIFAA8J3wIEIL6PAAYAACTySQkfA89xAAAQJwPwQBIFAM9woAD8RBmA7LgC +JQABA/TvCEKA13AAABAnyiHKD8oiygfKIIoPAACqBsoj6gdIBarxzyMqA9HA4H7PcKAA9AfxwFcI +HkMngBmAMHk4YAO4liBCBc9xoADIHx6hENgOoQHYFRkYgMIO7/+B2C8IHkPPcIAA+FgB2SCgA8ik +EAEAmrmkGEAATg5v/gHYz3GAAOw8AoEB4AKhA9nPcKAA9AcqoNHA4H7xwC4NT/AIds9woAAsILCA +C/D+CI/xz3APAEBCig0v9KlxHwhQAM9woADUCxiAQiAACEggAADfCISDYQVP8AohwA/rcs9wAADO +Il7biiTDD4EEr/G4c+B48cC+DG/wAdmlwRpwz3WAAJgHWnUaCm//i3AAFIUwARSRMAsIUSBAJRIR +Cw1SAB0NUgEKIcAP63LPcAAAKSWs2zkEr/FKJEAATCUAgCQBDgCocAAWjkAAFpRADwwyJHpwjCTD +ryX0ABYAQQAWj0AAFoBAABYAQYUMEyQo789wgACAFwCAQCzNILV9EOC4YKIJb/8E2c9wgACAFwCA +TCFAoB1lzCdhkxr0ANiMuBfwCiHAD+tyz3AAAColt9tKJEAAuQOv8QolAAUKIcAP63LPcAAAKyXA +2/TxANgAtc9wgACAFyCAQCzAIBV4EmEZYQUiQAQAsQTdB/CBwATdMglv/6lxACKMIwAcAhXPcIAA +3CDwIAAEHt+2EAIGLymBAAInQBAj6s9zgABTyDVoK2MVC44DACaBH4AAzM8WeQAZAgUALYETCyHA +gAjyACaBH4AAzM8WeQQZAgUQIgKALymBAAInQBDg9UIjQCCA4OYGzf/SCQ/1nQNv8KXA4HjgfuB4 +4H7geOB+4HjgfuB48cBGC0/wCHbPdaAAwC+jFQCW+QgegQfIQB0YkBXIDwiRAU4ML//JcIvwz3eA +ANzUCo8J6EAngBJAJoESdg8v/QraA8gHiCkI3gDPcKAA0BsRgPG4yiAhAEQM4f/PIOEDANmRuc9w +oADQGzGgz3CgANQLGIBCIAAISCAAALDgoA3l/8ogJQwDyAOQJbjAuBe4x3AADgAARSABC+xwIKAB +EgE27HAgoCCG7HAgoCGG7HAgoCKG7HAgoCOG7HAgoCSG7HAgoCWG7HAgoCaG7HAgoCeG7HAgoCiG +7HAgoKMVAJb9CB6BB8gEIIAPAQAA8Cy4lODAIIYPAACTAM9xoABoLPAhDQDPcIAA/FjAgNnYfg3v +9gUmQRMCCS/1BSZAEyqPDemKIFINZg3v9oe5z3GAANg8AZEB4BB4AbEA2AqvcQJP8OB4ocHxwPIJ +T/CiwUnBOnBIdRpzCiIAIWkJXgIC2c9woADIH0kYWIApwVNt7uFQeAb08gnv84txGvARCdENG3gQ +eOIJ7/OLcRHwCQkRBRx4CvALCZECAByEMAbwz3AAAP//ABwEMOB4ANjPcqkApP+5ogAUATGCuDei +GqJK8F0JHgJMIgCg0SHioUL0z3KlAKz/z3CAANwguKIEgFYQAAEU4AIgAyAD4yK7eGN4YEggQAAF +uEUgQAMWokEpwCHAuHdoKcAEIYEPAAAAICW5ZXgleIm4jrgZohzwKcCA4MohwQ/KIsEHyiAhDs8g +IQPKI4EPAADKD8okIQCwAKHxyiXBAAW9pXjPcaUArP8Woc9yoADIH89woAC0R1cQAIYA20okQAAE +IL6PACgAAMIkAgHPcKAAtEdvEACGBCCFD4AAAAAEII4PIAAAAAQgjQ8ABgAADQwQAEASAQYJCdQA +AN8D8AHfExIBhgQgvo8AOAAABCGBDwAAAIDMJyGQwCNhAAUmTxElfwUnfpMD9KcLlIIG6YDmzCUh +kJLyz3GgALRHaxEEhpkMEACIdIQk0JEK8s9xgAB4Ow2BAN0B4A2hnL1e8BUM3gDPcYAAeDsOgQHg +DqFC3VTwiHSEJAKYCfLPcYAA7DwGgQHgBqEN8BUMngHPcYAAcDwYgQHgGKEF8FMkPoMD8gDdOvAZ +DF4DbgtP/c9xgADsPBmBAeAZofXxCiHAD+tyz3CgALRHbxAFhkTYjLic23kHb/GMuwjuz3GAAHA8 +BYEB4AWh3/Ev7RkIngbPcoAA7DwkggDdAeEkopG9C/AnCF4Gz3KAAOw8J4JC3QHhJ6KWCe//iHHd +2ADZygrv9pi5mL058AohwA/rcs9woAC0R3EQBIZvEAWGOdiMuLXbCQdv8Yy70gpP/c9xgABwPAaB +AeAGoafxExIAhvC4yiAhAJgI4f/PIKEDz3CgALRHaxABhlgQAIYLIECADPIqCG/+AdgD2c9woAD0 +ByqgBd2YvQPwAN2X7RcJ3iEdChEgAdnPcKAA9AcsoAPZBfAD2c9woAD0ByWgUSGAopQKAvoX8AMS +ATbPcIAA3NAPCQAAz3CAAKTRGwkBAJIRAAGquJIZBACeEQABqrieGQQAz3CAAHAGAIAI6M9ygAAI +LAWCAnAFos9xgAB4OwyBAeAMoc9wgADouSGAz3CAANwgA4AUkB8JAQDPcYAAaBkagTuBJHhRIACC +tAxi98ogYgCpcAjcswYv8KLAocHxwFIOD/ChwSh1CHYacgQhvo8BAADAaHcw9EDFMQ0eEiDBz3CA +AKhjKWAEJYAfBgAAADG4OGAEJYEfAgAAAddxAgAAAcogoQAD8AHYIwhQABUIkACD4ADYyiDhAcAo +oQML8M9wgACgugKABfDPcIAAoLoBgAV9yXC+Cq/6qXHJcKlxCnLpcwHd0gvv/5h1mQgRAADZCtjP +cqAAyB8eohDYDqIVGliDKHAH8AHZBCCADyAAAABRIADDzCEhgMwgIYAS9CELH0DPcqAA/EQdglmC +ANnZCt+CBCC+jwAGAADm9efxLQseQM9wgAD4WAHZIKADyKQQAQCauaQYQABiDi/+AdjPcYAA7DwC +gQHgAqFRIADDANgK9M9xgABwPAWBAeAFoQDYmLgI3JMFL/ChwM9wpACQQU2Az3GAABS9QrEagAOx +BCCAD/8AAAAwuASxz3CAABS9ANoRCF5Gz3GAAAC8MoELCZ4CQrBDsESw4H9ZsOB48cDmDC/wmHDP +coAAALxIEoEAz3aAABS9UyEPgA6SALYF8ih0hCQDnATyEoIVCB4Cz3OmAOj/C4MDpgyDBKYF8ADY +BKYDps91pAC0RQwVA5YNFQWWKHSEJAOcLyfHAP/YELgEIwgAA/St7zIVD5ZTJ4AQGGDhthR4/98P +eAi/ZH9AKAkCACHGEwAnBwAFJsYBQCgPBgQjgw8A/wAAQCgHBPtjACDIEQUmBgL/3wUjgwEIvwQl +xgMFtgAhiRGgcAUgRQJveAQjgw//AAAAKLtleAO2LyBHAQS2BBUAlgK2EoIhCB4Cz3CAAKhjKGAV +CJIAz3GmAOj/DYEFpg6BBqYF8ADYBqYFpgDbSiSAcAbZjbmoIAADKdgSuPAgTwBAJgAfdXgB4eCg +AeMAkjgeABFVJkEUGrbPcIAA7LzOCC/9CNobFQCWz3GlANjLGaYcFQCWGqYdFQCWG6YOgRymD4Ed +piYVAJYeps9wpACQfxyA4QMv8B+m4cXPdYAAFL0JpSqleLVLpQHYGbXgf8HFSiQAegDZqCCAAgDa +z3CAABS9NXhAoAHh4H7geADZIKDgfyGgBAAAAABAAQAAAAAAAAAAAAAAAAACAAAAAADQ/lQFgIEP +GhsiAAAbJQIAG0AAABtx+AWAgQAAwBYPGwsi/AWAgQAAwBYPGwoiAAaAgQAAwBYPGwgikCyAgQIA +XG4RAABh+EHEEA8bCSIACwk5AgAKYgMBCmIEAgpiAAAJQAQAAGEJAAlAAgAAYQoACUAAAABhAgAJ +QQAJGigAAMAWAQAbJgAAwBcEAB0mAQAIJ+kACGQPIBsiAAaAgQAAwBdUBYCBDxobIgAAGyUCABtA +AAAbcQAAEyUAABMkD0UAIgBcADkHAABiBmAAYgAAWDhgRcAQcEXAEHhFwBCQRcAQZQAAYSQQwBEA +gBMkOBzAEQ8AEyIBABMwBCjAEQ9zEyKCARMwBCjAEQ90EyICAhMwBCjAEQ91EyJCAhMwBCjAEQ8U +FSIBABUmD3ITIggAzBEPRAAiCgAAQABAAHAOAABhAAATJQIAEyTsHMARD3YTIhgIyhEJABNAHAjK +EQkAE0AgCMoRD3gTIgQAyhEAAAEkAAABJQYAAGEPdhMiLEjHEQ94EyIAAMYRAwABJAAAASUAABMl +wiwTJAQowBECRhMkBCjAEcJfEyQEKMARD0UAIgBcADksAABkAAATJAEAEyU4HMARD3cTIuAcwBEC +AAFiDwETIgQIwBHgBcASBCjAEQ8TAiLkBcASBCjAEQ8TByLoBcASBCjAEQ8TBCICAHFwBwAAYf8A +EyUCEBMkBCjAEQAAEyUAABMkyEnHEQYAAGEAABMlAhATJAQowBEAABMlSQATJMhJxxEPcBMiAQAT +MAQowBEDABMkAAATJQQIwBEAABMkOEXAEewFwBIYKMARDxMDIgQAAGEAAFg4AAATJAEAEyU4HMAR +AAAVJAAAACHMBYCBAADAFg8bUCLQBYCBAADAFg8bGiLUBYCBAADAFg8bGSLYBYCBAADAFgAAAIXI +BYCBAADAFg8bBCIcBBtmGwEbaBQcwBAKABtABAAbbgsAAGEPHB0iAQAdJvkPAGHcBYCBAADAFgUA +G2JUBYCBDxobIgAAGyUCABtAAAAbcWQMABAAwAYRAQAEJ/wABGQAABskAgAbJTgcwBFUBYCBDxob +IgAAGyUCABtAAAAbcQAAGyVAABskMBzAEVQFgIEPGhsiAAAbJQIAG0AAABtxZAaAgQAAwBYCARNk +QgETJAQowBH4WICBAADAFgYBE2IECMAQBAATZA9cACIKAABAAAYAcBkAAGEAABMkAAATJQAAwBcA +CFgwyCDAEHBFwBAQCMAQAAATJQMAEyQcCMARHAjAEQAAEyQECMARDxQVIgQAFSb7/zAyAwATJBgI +wBEPFBUiAgAVJgQAMDAAABMkEEXAERgIwBEAEFgwD3wTIggAzBEAABMlAAATJDRIxxEPexMiAQAT +MAQowBEPFBUiAgAVJv8AEyUCEBMkBCjAEQ8UFSICABUmaAaAgQAAwBbCLBMkBCjAEQJGEyQEKMAR +wl8TJAQowBEPTRMiBBDFEQIAEyTwHMARAQATJOwcwBEAABMkcAATJRAcwBEAABMlAAATJOAcwBEB +ABMkJBDAEQAAFSQAAAAhDw4aIgAAQBYAARtwDQAAYYAAYyT//hsyAABAFwAAGyUPGw8iNAaAgf8A +GzICABtBABsaKAAAwBYAABslAgAbQAAAG3EBAGRwBwAAYQEAYyQAABskFgaAgQAAQBcMBoCBAABA +Fu0PAGECAGRwEAAAYQIAYyQBABskFgaAgQAAQBcOBoCBAABAFuQPAGEEAGRwBwAAYQIAYyQCABsk +FgaAgQAAQBcQBoCBAABAFtsPAGEAAB0kAAAAIQACD24JAABhFgaAgQAAQBYAABslEgaAgQAbGigA +AAAWAQAbJgAAABcNAABhLAaAgQAAQBYCABsmARAbaAAAGyQAAEAXGAaAgQAaGygPGw4iMAaAgQAA +QBYBABsmAABAF5wEgIEPGhsiAAAbJQIAG0AAABtxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlAKAACgAgAAAAAAAAAAAABQAgAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQKiAAAh5AAAgrYAA +AAAAACCtgAAAAAAA3wAAABkBAABiAQAAvgEAADICAADDAgAAewMAAGIEAACEBQAA8gYAAL4IAAAC +CwAAAQAAAAAAAAAwgAAAAAAAADGAAACIiDMzMoAAAACqqoozgAAAAAAAADSAAAAAAAAANYAAAAAA +AAA2gAAAAAAAADeAAAAAAAAAOIAAAAAAAAA5gAAAAAAAADqAAAAAAAAAO4AAAAAAAAA8gAAAAAAA +AD2AAACqqgoAPoAAAFOFiIg/gAAAAAAAMDCAAAAAAAAAMYAAAJqZWFUygAAAAKqqqjOAAAAAAAAA +NIAAAAAAAAA1gAAAAAAAADaAAAAAAAAAN4AAAAAAAAA4gAAAAAAAADmAAAAAAAAAOoAAAAAAAAA7 +gAAAAAAAADyAAAAAAAAAPYAAAKqqCgA+gAAAVZiZqj+AAAAAAABQMIAAAAAAAAAxgAAAAAAAADKA +AAAAAAAAM4AAAAAAAAA0gAAAAAAAADWAAAAAAAAANoAAAAAAAAA3gAAAAAAAADiAAAAAAAAAOYAA +AAAAAAA6gAAAAAAAADuAAAAAAAAAPIAAAAAAAAA9gAAAAAAAAD6AAAAAAAAAP4AAAAAAAAAwgAAA +AAAAADGAAAAAAAAAMoAAAAAAAAAzgAAAAAAAADSAAACaeQAANYAAAKqqqqo2gAAAAAAAADeAAAAA +AAAAOIAAAAAAAAA5gAAAAAAAADqAAACqqqoKO4AAAABwmao8gAAAAAAAAD2AAAAAAAAAPoAAAAAA +AAA/gAAAAAAAAP//AAClAQEAuQHfALEAGwAWARsArwAbABQBGwBsAKAA0QCgAG8AgwBxAIMAdgCD +AHMAMwBuADMAcAAzAHIAMwDXADMA1AEGANABAAB+ADwA4wA8AHgASQDdAEkAfwBaAOQAWgCqAD8A +qwABAA8BPwAQAQEAeQBqAN4AagCoAAAADQEAAKYANwCnAAEACwE3AAwBAQAEAAgAnAHMAJ0BzADV +AcwA1gHMALQAIAAZASAAMQIMADICDAAzAr0ANgIMADcCDAA4Ar0AoACIAAUBiAChANUABgHVAKIA +BAAHAQQAjwCIAPQAiACQACIA9QAiAJEABAD2AAQAnwAMAPsADACUAAAAlQAAAJwAlQCdANAAmgCK +AJgAEQCWADMAlwB3AJQAAQCVAAEAnACVAJ0A0ACaAIoAmAARAJYAMwCXAHcAlAACAJUAAwCcAJUA +nQDQAJoAigCYABEAlgAzAJcAdwCUAAMAlQAHAJwAlQCdANAAmgCKAJgAEQCWADMAlwB3APoAAAD5 +AAAAAgGVAAMB0AAAAYoA/gARAPwAMwD9AHcA+gABAPkAAQACAZUAAwHQAAABigD+ABEA/AAzAP0A +dwD6AAIA+QADAAIBlQADAdAAAAGKAP4AEQD8ADMA/QB3APoAAwD5AAcAAgGVAAMB0AAAAYoA/gAR +APwAMwD9AHcAhQAAAIYAAACHAFUAiAAAAIkAqgCKAAAAiwDdAIwAAACFAAEAhgABAIcAVQCIAAAA +iQCqAIoAAACLAN0AjAAAAIUAAgCGAAMAhwBVAIgAAACJAKoAigAAAIsA3QCMAAAAhQADAIYABwCH +AFUAiAAAAIkAqgCKAAAAiwDdAIwAAADrAAAA6gAAAOwAVQDtAAAA7gCqAO8AAADwAN0A8QAAAOsA +AQDqAAEA7ABVAO0AAADuAKoA7wAAAPAA3QDxAAAA6wACAOoAAwDsAFUA7QAAAO4AqgDvAAAA8ADd +APEAAADrAAMA6gAHAOwAVQDtAAAA7gCqAO8AAADwAN0A8QAAAPv/AAAAAAIADdIS0hPSFNIM0hXS +C9IC0hHSBEMAEBQQCRAREAFAG9Ic0gDSCgALAAQADgC1ABoBDwBCALwAwwAhASgBtgC3ALgAuQC9 +AL4AvwDAABsBHAEdAR4BIgEjASQBJQEKAAAACwAAAAwAAAC2AAAAtwAAALgAAAC5AAAAGwEAABwB +AAAdAQAAHgEAALYAAAC3AAAAuAAAALkAAAAbAQAAHAEAAB0BAAAeAQAAvQAAAL4AAAC/AAAAwAAA +ACIBAAAjAQAAJAEAACUBAAC9AAAAvgAAAL8AAADAAAAAIgEAACMBAAAkAQAAJQEAABLSAAAT0gAA +FNIAAAAAAQACAAMALABkAHQAgACMAKEABwAAAAAAAQACAAMAAAAAAAAAAAAAAAAAAAAAAAEAAAAB +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAcAAAAAAAAAAwAAAAQAAAADAAAAAAAAAP8D +AAADAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAACwAAQAAAAEAAQABAAAAAAAAAAAAAQAB +AAIAAgACAAMAAwAEAAQABQAFAAYABgAHAAcACAAIAAkACQAKAAoACwALAAwADAANAA0ADgAOAA8A +AAABAAIAAAAL0g7SDdII0gnSCtIS0hPSFNIR0hDSAtIB0gPSAIAF0gRDG9Ic0gTSAEUw0jHSAAC1 +ABoBgQEFAAQADwAQAAoACwAMAE4AAAAAAAEAAgAAAA3SEdIQ0gLSAdID0hvSC9IAgAXSEtIT0hTS +BEMI0gnSCtIc0gbSB9Jw0gAAtQAaAYEBBAAPAIMA6ABOAZIA9wBdAQYACAAJAAoACwAMAAUAAAAA +AAAAAAAKAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAEAAAAAwAAAAAAAAADAAAAAAAAAAAAAAAAAAAA +AAAAAP8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAABAAAAAAAAAAAAAAAA +AAAAAAAAAAEAAQABAAAABNIN0hHSENIC0gHSA9Ib0gCABdIL0hLSE9IU0gRDcNIAAAAAAQAAAAEA +AAABAAAAAQAAAAMAAAACAAAAAwAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8DAAAAAAAAtQAa +AYEBBAAPAAYACAAJAAoACwAMAAAAAAAAAAAALAABABUAFQAVAAEAAQABAAAAAAABAAIAAAAc0g3S +EdIQ0gLSAdID0hvSC9IAgAXSEtIT0hTSBEMG0gfSBNJw0gAAtQAaAYEBBQAEAAYACAAJAAoACwAM +AIMAkgDoAPcATgFdAQ8AAAAAALcTIgC4FCMAuRUkALsWJQC8FyYAvRgnAMAZKADEGikABxsAAAgc +AQALHQIADB4DABAfBAAiIQUAJCIGACYjBwAoJAgAKiUJACwmCgAuJwsAMCgMADQpDQA4Kg4APCsP +AEAsEABkLhEAaC8SAGwwEwBwMRQAdDIVAHgzFgB8NBcAgDUYAIQ2GQCINxoAjDgbAJE6HACVOx0A +mTweAJ09HwChPiAApT8hACRJBgIsSgoCNEsNATxMDwFkTREBbE4TAXRPFQF8UBcBhFEZAZVSHQGd +Ux8BAQQAAAIFAQADBgIABAcDAAUIBAAGCQUABwoGAAgLBwAJDAgACg0JAAsOCgAMDwsADRAMAA4R +DQABQAAEAkEBBANCAgQEQwMEBUQEBAZFBQQHRgYECEcHBAlICAQAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAHCAAAAAAACyDMgA/////////wAB//8CA////wT//////////////////////wX/Bv8H +/wj/Cf8K/wv/DP///w3///8O////D////xD///////////////////////////////////////// +/////xH///8S////E////xT///8V////Fv///xf///8Y////Gf///xr///8b/////xz///8d//// +Hv///x////8g////If//////////////////////IiMk/yUmJ///KP///yn///////////////// +/////////////////////////////////////////////////////////////wABAQEAAAAAAAEA +AAAAAAAAAAAAAAAAAAMAAAABAAAAAAAAAAMAAAD8pAEAAgAAAPi4AQAEAAAA+KQBAAUAAADIpAEA +BgAAADyYAAASAAAAfCcAAAgAAABcwQAACQAAALgvAAANAAAAhCoAAA4AAAAM2gAADwAAAAibAQAY +AAAAkPwAAAwAAADAvAAAFgAAAJyiAQAQAAAAyC0BABEAAAA8vAEAAQAAANhwAAATAAAA/JoBABQA +AABEqgEABwAAAIRMAAAVAAAADEoBABcAAAD8cgEAGQAAALTfAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArJQAAKyUAACslAAA +ZH8AAKyUAACslAAAyH8AAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAArJQAALiKAAAM +igAA/IkAAJCJAAAoigAATIkAAKyUAACslAAAkIwAAECPAACMkAAArJQAAKyUAACslAAAFJQAANCL +AAAIjAAAdIsAAKyUAACslAAArJQAANCTAACslAAAVIsAAKyUAACslAAArJQAAKyUAACslAAArJQA +AKyUAACslAAA1H8AAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAA +rJQAAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAAkIIAAKyUAACs +lAAArJQAAKyUAACslAAASJEAAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAArJQAAKyU +AACslAAAaH0AAKyUAAAkfQAArJQAAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACsfAAArJQA +AKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAAD0gwAAbIMAAKyUAAAQhAAA +rJQAALCCAAAEiAAArJQAAKyUAADYigAArJQAAKyUAACslAAArJQAAKyUAAAkiwAACIsAAKyUAACs +lAAArJQAAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAA3IUAAKyUAACslAAArJQAAESR +AACslAAA6IEAAKyUAABokwAArJQAAMiTAAAEkQAArJQAAKyUAACUewAAxJAAAKyUAACslAAArJQA +AJiJAACslAAArJQAAJiFAAC0fQAArJQAAKyUAACslAAAEIwAALCIAACslAAArJQAAKyUAACslAAA +rJQAAKyUAABshwAArJQAANSUAADklAAA4JQAAOiUAADclAAA2JQAAOyUAADQlAAArJQAAKyUAACs +lAAArJQAAKyUAACslAAArJQAAKyUAACghQAArJQAAKyUAACslAAArJQAAKyUAACslAAArJQAAHyV +AACIlgAAxHsAACB8AACslAAArHsAAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAArJQA +AKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAA +rJQAAKyUAACslAAArJQAAKyUAACslAAArJQAAKyUAACslAAA5H0AALR+AABUfgAA8JQAADh8AAA8 +fwAA7IEAAKyUAACslAAArJQAAKyUAADAfwAAxH8AAKyUAACslAAAaH8AAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/////AAAAAP//////////AQAAADAQAADhAw4e4QAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgDgAAAP8DAMAOAAAA/wUAZA4AAAD/LQBADgAA +AP89ANwNAAAA/wQABA4AAAD/JQBoDwAAAP/dAIgOAAAQEEwAAAAAAAABAQA8PDw8PDw8PDw8PDw8 +PDw8PDw8PDw8PDw8PDw8PDw8PBUVFRU8PDw8FRUVFTw8PDwAAAAAAAAAAAAAAAAAAAAAPDw8PDw8 +PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwVFRUVPDw8PBUVFRU8PDw8AAAAAAAAAAAAAAAAAAAA +ADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8FRUVFTw8PDwVFRUVPDw8PAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAIgRAACYGAAA7BQAAGgSAABYGgAA9BUAAJQXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4BoAAyK2AABgAAACIrYAAAAAA +AAAAAAAAAAAAAAAAAJz5AAD8qgAA4CQAAPyqAAD8qgAA/KoAANwJAABktAEAZMsAAPyqAAD8qgAA +dCsAAHQrAAB0KwAAdCsAAHQrAAB0KwAAdCsAAPyqAAD8qgAA/KoAAPyqAACAKAAA/KoAAPyqAAD8 +qgAA/KoAAPyqAABIywAA/KoAAPyqAABkwQAAAAAAAMTjAADI4wAAFAIAAAgjAQAIIwEACCMBABAj +AQDkAQAADCMBAGi4AAAAlQEAkLgAADCVAQC0uAAAYJUBALyigAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQACAAIAAwAEAAQABQAGAAYABwAIAAgACQAKAAoACwAMAAwA +DQAOAA4ADwAmACcAKAApACoARgBGAEcASABIAEkASgBKAEsATABoAGkAagBqAGsAbABsAG0AbgBu +AG8AcABwAHEAcgByAHMAcwB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AAoA +PwAAAAAAAAAAAAAAAAAAAAAAAQACAAIAAwAEAAQABQAGAAYABwAIAAgACQAKAAoACwAMAAwADQAO +AA4ADwAmACcAKAApACoARgBGAEcASABIAEkASgBKAEsATABoAGkAagBqAGsAbABsAG0AbgBuAG8A +cABwAHEAcgByAHMAcwB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AAoAPwAA +AAAAzCIAAJQiAADYsIAAAAIAAAAAAACQ8gAAjPIAANiygABABQAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAlPIAAMwfAQBouYAAVAAAAAAAAACQ8gAAoB4BABi4gABQAQAAAAAAAJDyAACwHAEAWAeA +AAgAAAABAAAAkPIAAIDwAAAAAAAAUAEAAAAAAACQ8gAATB0BAOAzgAACAAAAAAAAAJDyAAA4HAEA +VAeAAAQAAAAAAAAAmPIAAIzyAAC8uYAAKgAAAAAAAACQ8gAAjPIAAGg9gAAEAAAAAAAAAJDyAAAs +mAEAAAAAAAAAAAAAAAAAkPIAAOyXAQBgB4AABAAAAAAAAABuAG4AaQDAAKAAUACAAL4AUAF9AD4A +AAAAAAAAnAIEAOYBJQBVAwQA3AFjAAAAbgBuAGkAwACgAFAAgAC+AFABfQA+AAAAAAAAAJwCBADm +ASUAVQMEANwBYwAAAAAAAAABAQAA9PcAABXSAAAAAAAA/wMAAPT3AAAM0gAAAAAAAP8BAAD09wAA +FdIAAAoAAAAA/A8A9PcAAAzSAAAJAAAAAP4DAPT3AAAV0gAAFAAAAAAA8D/09wAADNIAABIAAAAA +APwH9PcAAAbSAAAAAAAA/wEAAPT3AAAH0gAAAAAAAP8DAAD09wAABtIAAAkAAAAA/gMA9PcAAAfS +AAAKAAAAAPwPAPT3AAAG0gAAEgAAAAAA/Af09wAAB9IAABQAAAAAAPA/AAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAsAQAAXgEAAAEAAAABAAAAAQAAAAEAAAADAAAAAAAAAAAAAAAc +BwEAqAkBAJQIAQCcDAEATAsBAJgKAQBYCgEAHAwBAIQGAQAAAAAAEAAAAACAAAAAAKAAECcAAOgD +AADoAwAAAAAAAAMAAAACAAAAAwAAAAMAAAADAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAADAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIBAQACAQABAgICAAEBAAIB +AgECAAIAAQIDgICAgICAgIABgAKAgICAgMAAkADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPyqAAD8 +qgAA/KoAAPyqAAD8qgAA/KoAAPyqAAD8qgAA/KoAAPyqAAD8qgAA/KoAAPyqAAD8qgAA/KoAAPyq +AAD8qgAA/KoAAPyqAAD8qgAA/KoAAPyqAAD8qgAA/KoAAPyqAAD8qgAA/KoAAPyqAAD8qgAA/KoA +APyqAAC03wAAAAAAAP///38BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA/wAAAAAAAACMCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAACAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAD4sAEAFQAAAHhYgAAAAAAAAAAAAAAAAACgsAEABQAAAHhYgAAAAAAA +AAAAAAAAAACUsAEACgAAAHhYgAAAAAAAAAAAAAAAAACsrQEACgAAAJhYgAAAAAAAAAAAAAAAAAAk +rwEACgAAAJhYgAAAAAAAAAAAAAAAAAAkrwEACgAAAJhYgAAAAAAAAAAAAAAAAAAkrwEACgAAAJhY +gAAAAAAAAAAAAAAAAAAkrwEACgAAAJhYgAAAAAAAAAAAAAAAAAAkrwEACgAAAJhYgAAAAAAAAAAA +AAAAAAAkrwEACgAAAJhYgAAAAAAAAAAAAAAAAAAkrwEACgAAAJhYgAAAAAAAAAAAAAAAAAAkrwEA +CgAAAJhYgAAAAAAAAAAAAAAAAAAkrwEACgAAAJhYgAAAAAAAAAAAAAAAAAAkrwEACgAAAJhYgAAA +AAAAAAAAAAAAAAAkrwEACgAAAJhYgAAAAAAAAAAAAAAAAAAkrwEACgAAAJhYgAAAAAAAAAAAAAAA +AACosQEABgAAAJhYgAAAAAAAAAAAAAAAAAD8sAEABQAAAHhYgAAAAAAAAAAAAAAAAAC8rAEACgAA +AJhYgAAAAAAAAAAAAAAAAAB0rQEACgAAAJhYgAAAAAAAAAAAAAAAAAD0rQEACgAAAJhYgAAAAAAA +AAAAAAAAAADMrgEACgAAAJhYgAAAAAAAAAAAAAAAAAAorwEACgAAAJhYgAAAAAAAAAAAAAAAAADk +rwEACgAAAJhYgAAAAAAAAAAAAAAAAADkvwEABgAAAJhYgAAAAAAAAAAAAAAAAAAAAAAAeFiAAHhY +gACsIKAAbCCgADAAAADP////AAAAAAAAAACYWIAAmFiAAKQgoAA4IKAAAQAAAPz///8AAAAAAAAA +ALhYgAC4WIAAqCCgADwgoAAIAAAA8////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOytAQAVAAAA +eFiAAAAAAAAAAAAAAAAAAPgGgADIrYAAGAAAAIitgAAAAAAAAAAAAAAAAAB/AAAAAAAAAAB/AAAA +AAAAAAAAAAAAAAAAAAAAAAAAADgAAABoAAAAdAAAAIAAAACMAAAAnQAAAAcAAAAAAAAA/////wAA +AAAtAQAA3QEAAFoCAAC6AgAACgMAAE0DAACHAwAAugMAAOgDAAARBAAANwQAAFkEAAB6BAAAmAQA +ALQEAADOBAAA5wQAAP4EAAAVBQAAKgUAAD4FAABRBQAAZAUAAHUFAACGBQAAlwUAAKcFAAC2BQAA +xQUAANMFAADhBQAA7gUAAPsFAAAIBgAAFAYAACAGAAArBgAANwYAAEIGAABMBgAAVwYAAGEGAABr +BgAAdQYAAH4GAACIBgAAkQYAAJoGAACiBgAAqwYAALQGAAC8BgAAxAYAAMwGAADUBgAA2wYAAOMG +AADqBgAA8gYAAPkGAAAABwAABwcAAA4HAAAUBwAAGwcAACIHAAAoBwAALgcAADUHAAA7BwAAQQcA +AEcHAABNBwAAUwcAAFgHAABeBwAAZAcAAGkHAABvBwAAdAcAAHkHAAB/BwAAhAcAAIkHAACOBwAA +kwcAAJgHAACdBwAAogcAAKcHAACrBwAAsAcAALUHAAC5BwAAvgcAAMIHAADHBwAAywcAANAHAADU +BwAA2AcAANwHAADhBwAA5QcAAOkHAADtBwAA8QcAAPUHAAD5BwAA/QcAAAEIAAAFCAAACAgAAAwI +AAAQCAAAFAgAABcIAAAbCAAAHwgAACIIAAAmCAAAKQgAAC0IAAAwCAAANAgAADcIAAA7CAAAPggA +AEEIAABFCAAASAgAAEsIAABPCAAAUggAAFUIAABYCAAAWwgAAF8IAABiCAAAZQgAAGgIAABrCAAA +bggAAHEIAAB0CAAAdwgAAHoIAAB9CAAAgAgAAIIIAACFCAAAiAgAAIsIAACOCAAAkQgAAJMIAACW +CAAAmQgAAAAAAAABAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAQIDBAQEBAQFBgcICAgICAkKCwwN +AABuO2g7YjtcO246aDpiOlw6bjloOWI5XDluOGg4YjhcOG43aDdiN1w3biloKWIpXCluKGgoYihc +KG4naCdiJ1wnbhloGWIZXBluGGgYYhhcGG4XaBdiF1wXbhZoFmIWXBZuFWgVYhVcFW4UaBRiFFwU +bhNoE2ITXBNuEmgSYhJcEm4RaBFiEVwRbhBoEGIQXBBuAmgCYgJcAm4BaAFiAVwBbgBoAGIAXABU +AAAAbjtoO2I7XDtuOmg6YjpcOm45aDliOVw5bitoK2IrXCtuKmgqYipcKm4paCliKVwpbihoKGIo +XChuJ2gnYidcJ24maCZiJlwmbiVoJWIlXCVuJGgkYiRcJG4jaCNiI1wjbiJoImIiXCJuIWghYiFc +IW4gaCBiIFwgbhJoEmISXBJuEWgRYhFcEW4QaBBiEFwQVxBSEE0QSRBuAWgBYgFcAW4AaABiAFwA +VAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIMAAACSAAAAgwAAAJIAAADo +AAAA9wAAAOgAAAD3AAAAAAAAAAkAAAAAAAAACgAAADgAAABoAAAAdAAAAIAAAACMAAAAnQAAAAcA +AAAAAAAABwAAAAcAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAMxBAQAIAAAAeFiAAAwJgACMCYAADAqA +AIwKgAAKDREUCg0RFBkZGRkKCgAAAAUGBwgNDg8QFRYXGBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChKcnBwknJycnJyVnHCD +QTUZjSsAAAAABgYMAgAXAAAFEAogMEAAABMOExEAAAAMEBQYIAgEAAA8ODQwLCgkIBwYFBAMCAQA +CwcDADs3My8rJyMfGxcTDwsHAzE3OjMzOjU0AAAAAAEBAQEBAQEBAgICAgICAgIDAwMDAwMDAwEC +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAA +AAAAAAAKAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV9mP2sPb8 +9kb3kPfY9x/4Zfip+O34L/lw+bD57vkr+mf6ovrc+hT7S/uB+7b76vsc/E38ffyr/Nn8Bf0w/Vn9 +gv2p/c/99P0X/jn+Wv56/pj+tv7S/u3+Bv8e/zX/S/9g/3P/hf+W/6b/tP/B/83/2P/h/+n/8P/2 +//r//f/////////9//r/9v/w/+n/4f/Y/83/wf+0/6b/lv+F/3P/YP9L/zX/Hv8G/+3+0v62/pj+ +ev5a/jn+F/70/c/9qf2C/Vn9MP0F/dn8q/x9/E38HPzq+7b7gftL+xT73Pqi+mf6K/ru+bD5cPkv ++e34qfhl+B/42PeQ90b3/Paw9mP2cLmDupa7qry+vdK+57/8wBHCJ8M9xFPFasaAx5fIr8nGyt7L +9swPzifPQNBZ0XLSjNOm1L/V2tb01w7ZKdpE21/cet2W3rHfzeDp4QXjIeQ+5Vrmd+eT6LDpzerq +6wftJO5C71/wffGa8rjz1fTz9RH3L/hM+Wr6iPum/MT94v4AAB4BPAJaA3gElgW0BtEH7wgNCisL +SAxmDYMOoQ++ENwR+RIWFDMVUBZtF4kYphnCGt8b+xwXHjMfTyBqIYYioSO8JNcl8iYMKCYpQSpa +K3Qsji2nLsAv2TDxMQozIjQ6NVE2aTeAOJY5rTrDO9k87z0EPxlALkFCQlZDakR9RQQEAAQEAQID +AAEBAgECAgMBAQEBAQEBAQICAgICAgICAwMDAwMDAwMEBAQEBAQEBAECAgICAgIDAwMDAwMDAwMD +AwMDAwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAADoBAgHVAN8A2gCiAHUAfwCKBSoDOQGoAYoF +ygLZAEgBAQMPBwoUN25qARoB2QDoAAoBugB5AIgAygFKAeIA+QDKAeoAggCZAHTRRRfooosuAAUH +AQMEAAUBBQAAAAUGAAIEAAUABQAAAQIBAgMEAAAFBgcICQoAAAkAAAAAAAAAAQAAAAIAAAADAAAA +AAAAAAQAAAACAAAABQAAAAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcH +BwcHBwcHBwcHBwcHBwcHBwYGBgYGBQUFBQUEBAQEBAMDAwMDAgICAgIBAQEBAQAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoACgAMAAsACwAKAA8 +ADQAQAA8AIwAbABYAEgA9ACwAH//Bw8fPwEDMAAAADYAAAAMAAAAEgAAABgAAAAkAAAABgAAAAkA +AAAFAAcCAwQGBkADgAbACQANgBMAGkAdgCCABgANgBMAGgAnADSAOgBBwAmAE0AdACeAOgBOwFeA +YZkDMwfZCnMOphXmHIAgGSQzB3MOphXmHFkrzDkAQTNI2QqmFYAgWSsAQaZWgGFZbJ3YiZ1O7MRO +NEiDNCd2YicapEEaEzuxExEYgREP/MAPTuzETid2YicapEEaEzuxEw3SIA2JndgJCIzACAd+4Ac0 +SIM0GqRBGhEYgREN0iANCIzACAZpkAawstUFBVRABSd2YicTO7ETDdIgDYmd2AkGaZAGxE7sBARG +YAQDP/ADqqqqqhqkQRoTO7ETD/zADxEYgREN0iANCqiAChM7sRMP/MAPD/zADw3SIA0LtEALC7RA +C4md2AkN0iANCqiACgqogAoIjMAIB3iABwd4gAcGaZAGD/zADw3SIA0LtEALDdIgDQu0QAuJndgJ +CIzACImd2AkIjMAIB37gBwd+4AfBLCkHCqiACgiMwAgHeIAHCIzACAd4gAcGaZAGsLLVBQZpkAaw +stUFBVRABQVUQAXWHcYEAQcPHz9///9m5gAABQYBAgMEAABUAFQAbABgAFwAVACMAHgADQ8FBwkL +AQMoACgANAAwACwALABEADwALAAsADwANAAwACwAVABEAFVVVQFLaC8BVVVVBeM4jgOqqqoCcRzH +AaqqqgrHcRwHAAQAAGQAAAAAAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8A +AQAAAA8APwABAAAADwA/AAIAAAAPAD8AAQAAAAEQAAEAAAACgAABQgYCEAACIAAAA8AAAUMGAxAA +AsAAAAPAAAFDBgQQAAJAAAACgAABRAYFEQAAQAAAA8AAAUUGBhEAAOAAAAPAAAFFBgcRAAEAAAAC +gAABRgYIEQACIAAAA8AAAUcGCREAAsAAAAPAAAFHBgoRAAJAAAACgAABSAYLEgAAQAAAA8AAAUkG +DBIAAOAAAAPAAAFJBg0SAAEAAAACgAABSgYOEgACAAAAAoAAAUwGAAAiFgAAgAAAAwAAAVkAJBYA +AQAAAAMAAAFaACYWAAIAAAAEAAABWgAoFgACAAAAAwAAAVsAKhYAAoAAAAMAAAFcACwXAAAAAAAE +AAABXAAuFwAAgAAAAwAAAV0AMBcAAQAAAAMAAAFeADQXAAIAAAADAAABXwA2FwACgAAAAwAAAWAA +OBgAAAAAAAQAAAFgADwYAAEAAAADAAABYgA+GAACAAAABAAAAWIAQBgAAgAAAAMAAAFjAGQbAAIA +AAADAAABbwFmGwACgAAAAwAAAXABaBwAAAAAAAQAAAFwAWwcAAEAAAADAAABcgFuHAACAAAABAAA +AXIBcBwAAgAAAAMAAAFzAnQdAAAAAAAEAAABdAJ2HQAAgAAAAwAAAXUCeB0AAQAAAAMAAAF2Anwd +AAIAAAADAAABdwN+HQACgAAAAwAAAXgDgB4AAAAAAAQAAAF4A4QeAAEAAAADAAABegOGHgACAAAA +BAAAAXoEiB4AAgAAAAMAAAF7BIwfAAAAAAAEAAABfASRHwABQAAAAwAAAX4ElR8AAwAAAAQAAAF/ +BZcfAALAAAADAAABgAWZIAAAQAAAAwAAAYEFnSAAAUAAAAMAAAGCBZ8gAAHAAAADAAABgwWhIAAD +AAAABAAAAYMFpSEAAEAAAAMAAAGFBQAA9FkBAAAAAAD0WQEAAAAAAPRZAQAAAAAA9FkBAAAAAAD0 +WQEAAAAAAPRZAQAAAAAA9FkBAAAAAAD0WQEAAAAAAOBTAQAYAAAApFUBACAAAABcWwEAFAAAAFBc +AQAUAAAAWFkBAA4AAAA8WAEADgAAACxZAQAUAAAALFkBABQAAABAI0AlISEhIUBAQEBABQQEAQFA +QEBABQVAQAwMQA0MDAEBAQVAQAUFAAQABEBAAARAQEAFQEBAQEAFQEBABQUFAQEBAUAFBQUBBQEB +QAUFBUAFQAUFBQUFAAAAAAAAAABkAAAAAJABAAoAAAAEAAAAHBEAABwyAAAcMwAABAAAABwVAAAc +AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAClxoT4me6N9g3/vdax3lSRUGADAqnO +fVYZ52K15k2a7EWPnR9AiYf6Fe/rssmOC/vsQWez/V/qRb8j91OW5FubwnUc4a49akxabEF+AvVP +g1xo9FE00Qj5k+Jzq1NiPyoMCFKVZUZenSgwoTcPCrUvCQ42JJsbPd8mzWlOzX+f6hsSnh10WC40 +LTay3O60+1v2pE12YbfOfXtSPt1xXpcT9aZouQAALMFgQB/jyHnttr7URo3ZZ0ty3pTUmOiwSoVr +uyrF5U8W7cWG15pVZpQRz4oQ6QYEgf7woER4uiXjS/Oi/l3AgIoFrT+8IUhwBPHfY8F3da9jQjAg +GuUO/W2/TIEUGDUmL8PhvqI1zIg5LleT8lWC/Ed6rMjnuisyleagwJgZ0Z5/o2ZEflSrO4MLyowp +x9NrPCh5p+K8HRZ2rTvbVmROdB4U25IKDGxI5Lhdn26970OmxKg5pDE304vyMtVDi1lut9qMAWSx +0pzgSbTY+qwH8yXPr8qO9OlHGBDVb4jwb0pyXCQ48VfHc1GXI8t8oZzoIT7dltxhhg2FD5DgQnzE +carM2JAFBgH3Ehyjwl9q+a7QaZEXWJknOrknONkT67MrMyK70nCpiQenM7YtIjySFSDJSYf/qnhQ +eqWPA/hZgAkXGtplMdfGhLjQw4KwKXdaER7Le/yo1m06LAABAgQEAAAABAwMCAQMBARAAAAAgAAA +AAABAAAAAgAAQAAAAAAEAABAAAAAQAAAAADwYQAAAQECAQICAwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAQAAAAAAAAAAEA +AAABAAAAAAAAAP8AAAD/AAAAAAAAAAAAAABEoQAAAAAAACoAAAAOAAAAAAABAQAAAAAAAAAAAAEB +AAAAAAIAAQACAgMDA7ywAQDIsAEA1LABAOCwAQDosAEA8LABAAEBAAECAQEBAAAAAAAAAAD///// +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB +AAAAAQAAAAAAAAAAAAAAAAAAAIANAAAAIAAAgA0AAIANAAAAIAAAgA0AAAAGAAAABAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAEAAAALAEAAAcA +AAAAAAAACAAAAAQAAAAQPoAACQAAAAQAAAAQGAAACgAAAAQAAAB8PYAACwAAAAQAAAAAPoAADAAA +AAQAAAAQGAAADQAAAAQAAABsPYAADgAAAAAAAAAPAAAABAAAABMAAAA= +==== diff --git a/sys/contrib/dev/iwn/iwlwifi-6000g2b-18.168.6.1.fw.uu b/sys/contrib/dev/iwn/iwlwifi-6000g2b-18.168.6.1.fw.uu new file mode 100644 index 00000000000..5fed324732d --- /dev/null +++ b/sys/contrib/dev/iwn/iwlwifi-6000g2b-18.168.6.1.fw.uu @@ -0,0 +1,11961 @@ +Copyright (c) 2006-2012, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +begin-base64 644 iwlwifi-6000g2b-18.168.6.1.fw.uu +AAAAAElXTAo2MDAwZzJiIGZ3IHYxOC4xNjguNi4xIGJ1aWxkIDAKAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAQaoEgAAAAABAAAAAAAAAAEAAAC8cAIAICCADwAAQABpIAAAaSBAAGkg +AABpIEAAICCADwAA6ABpIAAAaSBAAGkgAABpIEAAICCADwEA6ARpIAAAaSBAAGkgAABKIAAASiEA +AEoiAABKIwAASiQAAEolAABKJgAASicAAEogABBKIQAQSiIAEEojABBKJAAQSiUAEEomABBKJwAQ +SiAAIEohACBKIgAgSiMAIEokACBKJQAgSiYAIEonACBKIAAwSiEAMAokgD+BAABAQSycMEAsnDBC +JBw0CiKAP4AAIHMKIwA3DguAB0omAHBpIEAASiYAcEomAHBKJgBwSiYAcAAWAHCAAMgzQHggIECH +AAAAAAAAAAAAAPwciLb8HEi2/BwItvwcyLX8HIi1/BxItfwcCLX8HMi0/ByItPwcSLT8HAi0/BzI +s/wciLP8HEiz4H7geATcON018OB4BNw03TPw4HgE3DDdMfDgeATcLN0v8OB4BNwo3S3w4HgE3CTd +K/DgeATcIN0p8OB4BNwc3Sfw4HgE3BjdJfDgeATcFN0j8OB4BNwQ3SHw4HgE3AzdH/DgeATcCN0c +8OB4BNwE3RnwNBQaMDAUGTAsFBgwKBQXMCQUFjAgFBUwHBQUMBgUEzAUFBIwEBQRMAwUEDACxwHG +sCRNM7AkHzPgfuB44HjgeOB44HjgeAokgPAFIEQA4CDBB0Qk/oBBKsQAhAACAC8kAvFCIQEBQiAD +AeggogQEEQQCBBEFAgQRBgIEEQcCBBsIAQQbSAEEG4gBBBvIASwAJQBEIj6BPAAiAEQi/IBAIcEA +4CDBB0AjwwCoIIABARGEAgEbCgEgIMAHBBEEAgQRBQIEGwgB1Afh/wQbSAFEIvyABBEEAskH7/8E +GwgBQiFBAEIgQwCoIIABARGEAgEbCgEgIMAHz3GgAKwvGIGauBih4QXgEgXY4HjPcaAArC8YgbO4 +urgYoc0F4BJk2AoiQIAA2e4AAQAvJgDwSiZAAE4ABgBPACAAiiX/D+B4CiJAgADZzgABAGwAJAAv +JgDwXAAFACsINQhKJkAACHEA2AIhvoDgIMUHQnkB4AIhvoDgIMUHQnnrB+//AeAvLQEAQCVFAAIm +fPEAACAAAChAAeggYgMvIACALyFLAAIhvoDAIIYBwiGGAOB+EQAgAEogABBKIEAQDiJCAC8gCxLO +IEWAiiX/DwgABQAvLQEAQCVFAAImfPEAACAAAChAAUomQADoICIDLyAAgC8hSwACIb6AwCCGAcIh +hgBKJgAAQiD+kM4gggFEIH6QziGCAeB+KQAAAOB4/ByIsfwcSLH8HAix4cPhwuHB4cAHwBwcwDHh +wOB/AcAKJgDwiiC/D8ogZADgfy8gAwDgf4og/w/hxQh1EfDgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HjgeOB44HjgeGG9jCX/n+314H/BxeB48cDhxc9wgACkNU2Az3WAALSdIIW3uri6BCGBDwMAAAAH +uUV5LaDyD6ASANgAhc9xgADcw1EggIJMic9wgABQ2jJqNnnHcYAAENdggVZ4QYAF8pW7YKGrugTw +tbtgoYu6QaALjaO4FQXv/wutosHxwJIMz/9Fwc91gACkNSeFMHAI9DCVFBQOMTB2BPRZHYIQ0BUB +FjBwDvTPcYAAsDg8kRQUDTEwdQb0z3GAAAg5WamA4gz0z3WAABgLwY2A5gDZyiBBACXyIa2O4gT0 +Adgh8EEoDQIHfUEoAQSnec93gAAYC6CPUyVFEUwlAITGuY32CiHAD+tyz3AAAM0bn9sJACABiiSD +D1ElgJEG8gDYDNxbBM//z3aAANDZFiZNEaeNoK/JdRYlTREApRQUADFGrcdxgACQ1gK1AIkHrQAZ +QgEAG0IBxPHgePHAtgvP/wjIz3KgAMgfDhoYgAnIDxoYgArIEBoYgAsSATYCyCR4ERoYgAzIz3GA +AGhPLRoYgACBAeAAocO4jeAp9AvIf9kKuSR4LygBAE4gggcA2A8ggAAEIQGAQiKNAhnyCyNAwBf0 +z3CgAIgg8CBQA892gAA4TACGEHXPd4AAPEwG9ACHEnBIDQEHoKYAHwAUiQPP/+B48cDhxQHZz3Cg +ALAfOaDPcYAA/DMIgQCArMFJwAyBAIDPcYAAjDjPdYAADKlKwAqBobgKoQiF4LgJ8lEgwIEH9O4N +AAamDGACGNiLcalwdgjgDyTaz3CAABQLIIACiYDgEvQEiVEgAIAO8gvIBCCAD/7//wMLGhgwC8iG +uIy4j7iQuAvwC8gFIIAPAQAA/AsaGDALyKy4CxoYMNIOz/+LcDDZkNoe29oM4A4YuyjAgeDKIcIP +yiLCB8oggg8AAOocyiOCDwAA/ADKJCIAWAbiAMolIgB6DwAGgOAI9BIK4AAA2CYKIA8G2LEC7/+s +wOB4z3GAAJxy4H8IYeB48cAWDgAGz3GAAFQv8CEAAEB4gNnPcKAA0BswoNHA4H7xwAoK7/8P2c91 +gAAI4AAWAEAAFgBAVSVOFACltgwgEgRtyXByDCASIpUelc9xgAAUC9pg2GABEIUATCUAgEChE/QC +hfC4yiHBD8oiwQfKIIEPAADpHMojgQ8AAMEArAXhAMokYQARAs//4HiA4cokTXDgeOggLQLPcaAA +UAwlgQEYUgDgfuB48cB6Cc//z3CAAKQ1A4AYiKXBhOBKIAAgDPQKIcAP63KKIIwNZNsKJAAEWQXg +ALhzz3WAAEhKz3CAAMxXgg6gECQdABTPcIAA6Fd2DoAQz3CAAJBYag6AEM9wgACsWGIOgBDPd4AA +MKltj4DjovJMj1BzQAEMAM9wgAD8MwSAIIDPcIAABJtAoGGgIqDPcIAAeN8IkBBzlPbPcIAAeN/P +cYAAVMFosAHez3CAADzBzKEjgDBzARgCBML3Y6AQj4DgyiBiAAOlEY+A4BbygOIU9M9wgACkNQOA +CYBRIICADPJmCmACB9gB2AGlz3CgACwgEIAApc9wgADARgCAgeAN9M9wgAB4389xAAAQJw4K7/8F +gBB4AvAA2M9xgADkwAexA4WB4AwZBAQw9ACBguDMIOKABPQB2AChTBWAEIHgJvTPcKAALCDQgM9w +AQAgNUDAAdhBwAgcADQR2EPAANiMuETAANgQ2QTaCHOYcLhwACaHHwAAAH06DWAF2HBLFYAQAeAP +eEsdAhAMj4DgBfQBhYDg3A2BBc9wgAA8WCINgBAB2c9wgACIKiCgnglgAgbYLQDv/6XA4HiiwfHA +wg+v/5hyRcFBKAECB3lBKAIEJ3rGus91gACQ1kll57ldZRP0FBQOMc9zgADQ2WhyNnrggvFwBfTi +ktF3B/Iniue5p2r18wDYKPDGioDmB/SA389wgAAYC+Goz3eAAPg1BY8QdgT0gNgFrwrwz3eAAAg5 +GY8QdgT0gNgZr8aKNnsAHIADB4qHuQCtz3CAABgLQIggqAHYR6sM3JMHj//geKHB8cADEgI313IA +AABAAdrCIooAF7rHcgAOAACDuuxzQKPscgCiZgvgBChw0cDgf6HA4Hil4B/yCfaD4BXyhOAX8oXg +G/TgfwHYveAP8gb2reAV9OB/AtjM4A/yjCBDhw304H8G2OB/ANjgfwPY4H8E2OB/BdjgfwfYCNjg +fuB48cDhxc91gADgRKlwQCWBGzIMoA8u2gHYAQev/2EdAhDxwHoOj/+C4Ah1jfcKIcAP63L92Iu4 +c9tKJAAAaQLgALhzz3eAAOBEN4cAJZAfgAA0RTB1BfQMEIAggOCN8jIJoAgF2DpwRC2+GwAnQB5A +kCGQAN4IukV5z3KkALg9mxpYACKQDBiCI8oaWAAjkLenyxpYACSQxBpYACWQxhpYACaQxxpYACeQ +whpYACiQwxpYACmQxRpYAAqQoxoYAM9wgABkQSCAYHnJcIzgGfLPcIAAZEEggGB5yXCQ4BHyz3CA +AGRBIIBgeclwkeAJ8s9wgABkQSCAYHnJcJLgAvQA3c9wgACkNQOACIDPcaQAtEVRIACAD/JELb4b +ACdAHmyQS5B7e2V6UxmYgA2QVBkYgAXwUxmYg1QZmINELb4bJ3cOl1YZGIAPl1gZGIAQl1UZGIAR +l1cZGIASl1oZGIATl1wZGIAUl1kZGIAVl1sZGIAeDWAIKnCFBY//4HjxwCIL7//hxUIJwATPcIAA +pDUDgBiIgeAu9M9xgAAI4M9ygACEWgCCYIFgoACCHNtgqARpAaLPcIAAmAsDoVUhQAQDohjYAqJV +IcAFBaIBgQDdWhlEAwSiAoGtuPYJIAYCoYDgEPSODKAAqXCeDOAOBtgK8DYKwBKA4AbyDgvAEtYP +gBIZBY//huDxwADYD/TPcIAATKn6Cu//BtnPcYAA7KkAgYK4AKEB2NHA4H7geIPg8cAA2An0z3CA +AESp0grv/wPZAdjRwOB+4HjxwIHg4cUA2An0z3CAAEepAd2yCu//qXGpcLkEj//gePHAluDhxQDY +jPfPdYAAtJ2pcJIK7/8E2QuNg7gLrQHYkQSP//HAmuDhxQDYjPfPdYAAtJ0EbW4K7/8E2QuNgrgL +rQHYbQSP//HApMGQ4ADZyiBCABP0i3BKCu//ENkAFAAxhODMIGKBCPTPcIAAUMMfgPW4AvJMcAHY +pMDRwOB+8cC2C4//CHfPcIAApDUDgBiIhOAacUnyhOcA3YwAJQDKIEUDz3aAADCpQCYAE/YJ7/8E +2S6OsK5TIQAAEa5BKMAgoLkwcGIAJQACIEIAY7/xclYABgCA4g7yz3GgANAPEBEAhmG6WGAQGRiA +JREAhg94A/APjgDZUyCCIA8hgQAkeC8mB/DPcZ8AuP8QrhiBzyDiB9Ag4QcYoRiBnrgYoRiBvrgY +oQHYcQOP/+HE/BzIvvwcSL7hwOHB4cLhw/wcCLH8HEix/ByIsfwcyLH8HAiy/BxIsvwciLL8HMiy +/BwIv2okgBDhxGokwBDhxPHAz3CgANAbFIDPcYAAwAkEIICPz1EE4QChEfL2uC8pAQAF8i8pgQ9A +AAAAz3CAAMhA8CBAAEB43g6P/9HAwcRrJMAQwcRrJIAQwcSfdAQUCzQEFAo0BBQJNAQUCDQEFAc0 +BBQGNAQUBTQEFAQ0wcPBwsHBwcDBxEUsfhAKJkB+wcRrJIAUwcQgIECH4HiMIFyCAdjgf8IgCwDx +wDYKr/9KJEAAz3WAAKQ1FSUDEACDQCUOFdFwwiQCAfAlDRHIFQUWRCW+gQnyCiHAD+tyjtiNuP0F +oAB028gQDQalecgYWACggwbZRnnIFQAWJHjIHRgQAIPIEAAGhiB/jmgPgRI9Ao//4HjxwMYJj//P +c4AAGAoEg4DgRPTPdoAARKwTFgKWAN+EKggJACGAf4AASKQCoySIAd2A4eujrKMi8h0e2JMMEAUA +BCWBD8D/AABBKQQGz3GAAHjfFBEGAAUuPgEAIYR/PwD//wQkQQEeHliQIJCMIYKGAdnCIU4AKqPn +oySAz3aAAICowLkqts92gAAgPCiuQK4CiKSjAa4g8ASDgeAc9KoLQAkA2ASjAoMkiIDhEvQngxzg +NngkiM9wgADQOAeIEHEB2cB5z3CAABw8IKAC2APwAdgDo1kBr/8B2OB48cDqCI//z3WAABgKBIWj +wYDgAN8n9PoKQAAB2ASlAoUEiIDgUgIBAM9wgAAcPACAgOBGAgIAz3CAAPwzEIDPcoAApKgAgCOC +GWHPcIAADDwAgDhgLg6gEAKigOAaAgEAdvAEhYLgPPQKhYDgD/QMFQQQEBUFEAohwA/rcs9wAACK +DG0EoACKI44LQoUnhUAiAAc2eCaIYMEmiAEcQjAmiAIcQjAniGHBJ4gFHEIwB4iLcQYcAjDaCeAO +qBIAAM9wgAD8MxCAIIDPcIAAIDwhoN4NoADlpQPYBKXP8ASFg+A69EKFJ4VAIgAHNngFiFEgQIET +8s9xgAD8MwOSMIHPc4AAIDwggWGDCrhieTBwBfcJ2AuljvAFhYDgDfQEioDgq/LPcIAApKhaDaAQ +AoCA4KPyBYWA4AbyBdgLpQHYCfDPcIAAHDwAgIDgl/QA2DYNgAeT8ASFgeBv9M4JgAMihUeFQCEA +B1Z4RYjguhvyg7pFqM9zgAAkUMmDz3KAAESsFRqYg/mDxYP+ZhYamIP4g8SD/mYXGpiDw4N3g35m +GBqYgwWIUSBAgCvySguAEIDgEPQKIcAPAoXrchwVBRAEEIQAz3AAAIsMJQOgAIojEAA6C6AQAtjK +CqAQCNgihQSJguAK9AHYAKUA2A6lsgqgEFrYIoUEiYHgA/QB2AGlB4Uc4RZ5BYmGIP+MyiCCDwAA +MEPUC6IEyiEiAAKFJ4Uc4DZ4BYiGIP6HBPIC2ASlJfAE2ASlIfAkhYThAdgd9A+lz3aAAPwzEIZ1 +2h7bIIDPcIAAIDwhoAzZ7gigDhi7BIbPcYAAFDwAgJ4NIAEggQal5KUE2AOlAdjZBm//o8DgePHA +bg5P/891gAAYCgSFgOA59CKFR4VAIQAHVnhEiM9wgAAQCgCQEHIB3g/0z3CAABIKQJDPcIAAgKgK +kBByBfTEpQDYSvAEiYDgGvLPcIAAHDwAgIDgFPTPcIAApKgjgM9wgAAQPACA1gqgBjhggOAG9JIL +oAcA2AHYMPDEpQHYLPAEhYHgLPQChc9ygACkNSOCZIBooSOCZYAc4GmhJ4U2eCSIA4IA3jSwAtgE +2Y4L7//Jcs9zgACAqEKFB4VAIgEHFnkKkySJRIIeC2ANyXPEpQPYA6UB2AEGT/8MFQQQEBUFEAoh +wA/rcs9wAACJDH0BoACKIw4B8cByDU//z3WAABgKBIWA4KHBMPQB389wgAAcPOCgANgPpQClAaUC +3slwBgvgBOlxz3CAAOQJAIAmgJ4RAAamuJ4ZGADJcADZ+grv/wTaOghgEslwz3CAAKQ1I4BIgTSR +UyIAAIoKYA3pc8Sl6XBt8ASFguAd9AKFBIiA4BfyCYWA4BX0z3KAAKSoBoIlgg4ggw8HACChMHNH +9wfYC6UB2AylCaUD8DhgBaID2CjwBIWD4Av0C8gEIIAP////AwsaGDAE2BzwBIWE4Bz0UyDAQM9x +gADwWsIOIAAAoc9wgAAoqDqAz3CAAGSmhCkICTAgQA5RIECABdjKIKEBBKUk8ASFheAB3x30z3aA +ACioGoYE2ZnaHttAwItwtg5gDhi7GobppYQoCAkAIYB/gAA4piuAobkroAbYBKUA2AXwBIWG4Aby +AdiVBG//ocAG2AOlANjW8fHAHgxP/891gAAYCgSFgOClwQj0AoUEiIDgGfQC2ASlBIWB4FT0BYWA +4Eb0z3CAAPwzBIDPcYAABF8AgEIIoBAggYDgM/QA2Dfwz3CAAPwzBIAA3sWlz3GAABA8AIDeCiAB +IIHPcYAABF8B3wTaAKHPcKAALCBAEAcAz3AAAFiAQMAF2EHAQsdDxkTGyXAG2clzmHa4dgAnhw8A +AAB9sgggBdh25KXpcCvwdg/gBAXYBNgD8AXYgOAB2gT0Adgh8CmFgeEK8kylC6UI8ASFguAW9AmF +geAE9AHYD/CA4PD1AoVqCOAEA4AIcc9wgACUV+IIQBAA2A4JAAfi8QDYiQNv/6XA8cAaC0//z3WA +ABgKBIWA4KXBq/QChUeFJIBWeM9ygADQOAQhgQ8ABgAAgOEB2WeKIBCOAMB5cHYI9M93gACAqOqX +wYrxdgTyAN4G8MaK0XH89QHegObPcYAAHDzAoRb0z3GAABAKIJEwcxD0z3GAABIKIJFhijBzCPTP +cYAAFAogiUaKMHIE8gDZA/AB2YDhY/IcEAQAz3CAAKSoDBgAAc9wgAAEmwQQBQDPcIAAeN8FgAUo +fgFAKYBykHDKIs4HyiCODwAAiAzKI44PAAABA0wGbgDKIc4Pz3CAABA8AIAOD2AGgHCA4AT0/g5A +D1HwC8gEIIAP////AwsaGDDPcIAA6F4AiADegODFpQn0z3CgACwgEIDHcAAAAH0SpUgVBxDPcAAA +JIBAwAXYQcAB30LHQ8ZExulwBtkE2gDbmHO4cwoP4ATYc89wgADoXsCo5KXpcB7wANjPcYAA6F4A +qQLZI6UW8ASFgeAB3hH0BYWA4B30z3CAAKSoI4DPcIAAEDwAgGoOYAY4YIDgBfIB2PEBb/+lwM9w +gADoXsCofg3gBAXYANgEpaHxBdgLpVIP4AbJcADZz3CAAOheIKjp8fHAWglP/892gAAYCgSGgOB4 +9AKGBIiA4BTyz3CAABw8AICA4A70z3CAAKSoxg5gEAKAgOAG8r4OYAcA2B0DAADPcIAA/DMQgEeG +IIDPcIAAIDwBgAJ5AoZWeAeAEHGG9wHYBKb1AgAAAIaA4AzyUSNAwAryAtnPcKAA0BszoJIMYBAe +2M92gAD8MwSGz3WAABgKAIAmDWAQJoWA4LwCAQAEhs9xgAAUPACAzg/gACCBBqUChSeFHOA2eAWI +hiD/jAnyz3AAADBDz3GAADw8ig1ABAKFJ4Uc4DZ4BYhRIECAeAIBAACFgOAI8s9woAAsIAaAgOBk +AgIAQg1ABF0CAAAEhoHgiPQChieGHOA2eAUQhgAA2lEmAIBPpkHyz3OAACA8z3CAACRQuIAkgLlh +z3WAAESsFxUPllirXBAEAAwQBQAAJQUBGBUEluJ5AiUFARUVD5YkEAQAAiTEgxYVDZYFgKJ4yiWB +EAPyAd24q4DhDvJALI8A8XGE908lgBAG8IDgBvJPJUAQD30Yq0EpwAAZYbBxQ/eCvbirUSZAgC7y +AIaA4A3yz3GgACwgJoEOhiJ4z3GAACA8BaFApgXwAYaA4APyQaZ2DEAEjgtAEILgEfLrdYILQBAM +FgQQuHDPcAAAjAwKIcAPqXJ1A2AAiiMTC4oLYBAA2AKGJ4Yc4DZ4BYiGIP+MBfIC2ASmpvAE2ASm +pPAEhoLgC/TPcAAAMEPPcYAAPDwyDEAEBNgEpgSGhOCX9M9wgAD8MxCAz3OAACA8AIAXowgWBBAc +FgUQQCQABxYgQAEFiFEgAIBAIwIHGvIA2UokwHAodaggwAHwIkADAeUZYQPfSiRAcQDdqCDAAfAi +wAMB5x1lMHXE9xiLgrgYqwDdz3eAAKSopacYFAABQCVBABBxJ6ZH94cUAAZRIECABvIB2DoMYAcM +pk7wRgzgBguGC8gEIIAP////AwsaGDAGCSAJq6YC2AOmAobPcoAAHDwkiIDhD/QnhhzgNnjPcYAA +0DgniQSIMHAB2MB4AKIp8CCCgOEF8gHYA6Yj8CeGNngcEAQAz3CAAASbBBAFAM9wgAB43wWADB8A +EQUofgFAKYBykHDKIs4HyiCODwAAjQzKI44PAABOBRACbgDKIc4PpKZpBi//AdgMFgQQEBYFEAoh +wA/rcs9wAACODO0BYACKI9UF4HjxwM9wgAAcPACAgOAd8s9wgABIQQCAgOAb9EIIgA6A4Aj0C8gF +IIAPAAAAPAsaGDB2CIAOgOAJ9AvIBSCADwAAANQLGhgwC8iQuAsaGDCqD0AG0cDgfuB48cCGDQ// +CHXPdqAAOC4Hhs9xAABgJ6i4B6YWDyAHDdiA5QDfuAxiEsogIgTPdYAAhEFFFQEWB4YleAemz3CA +AOw4LJDPcIAApDUekBBxC8hFHdgTCvIFIIAPAAAA1AsaGDALyJC4BvAFIIAPAQAA/AsaGDBaCU// +AIWwuEYKYBIApYDgzAlCEmUFD//xwFYNgACD4An0z3CAAFRZKgoAEF4PoAAF2NHA4H7gePHANg2A +AIfgCfTPcIAAVFkKCgAQPg+gAAbY0cDgfuB48cAWDYAAhOAJ9M9wgABUWeoJABAeD6AAAtjRwOB+ +4HjxwPYMgACI4An0z3CAAFRZygkAEP4OoAAB2NHA4H7gePHA5gtgAATYCiUAgMohwg/KIsIHyiCC +DwAA3w7KI4IPAAB5AVgAYgDKJGIA0cDgfuHFAdvPcoAALAl+suB44HjgeOB44HjgeOB44HjgeOB4 +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HgGuEUgzQDPcKAA7Cem +oAqAANsAsX6y4H/BxeB48cCyDgADkggAEkIOwBGA2c9woADQGzCg0cDgfvHAugsP/xpwAd8AEBIB +FPBadRLwFSDAI6CQAhARAQHn13UAAPv/8H909gwigK8AAP//CfLPcAAA+/9ScOz12QMP/892gAD0 +MwCGAeCB4ACmCfQB2c9woADIHDGgygogEihwBr2BvUApACSleM9xoADsJwahAIZCIECAAKbc9c9x +oADIHADYEaHW8eB48cDPcIAAnEMAgIHgyiHCD8oiwgfKIIIPAACvE8ojgg8AAPMByiQiABQHIgDK +JQIBGggAANHA4H7xwJINQBGaCkAO0cDgfuB48cDWCg//z3CAAKQ1A4DPcw8AAPwogM9wgAC4qsC5 +NnhEgCCACrpkesm5JXrPcacAFEhNoUWAAYAKusm4ZHpFeA6hz3GAAGxPDomGIP8BW2jPcIAA+JdM +qE+JMIlAIBMDhiL/AUO6hiH/AU2oQ7mOD6AHLqjacM9wgAD0MwCAAeCB4M9xgAD0MwChCvQB2c9w +oADIHDGgvgkgEihwz3EIAIcQz3CgAOwnJqAD2ADZMiNVIDpxTCUAopQAKgBacEokACAa8EAlgQEw +eQa5gbkQvyV/z3GgAOwn5qFAJoEBMHkGuYG5ELgleM9xoADsJwahQCRUIM9wgABsQSCAYHkG2JJw +9gAOABElAKX086pw/g5gBYpxGnCqcJINYAWKcZhwQChAIRB4ELiBuIe4jLjPcaAA7CcGoUwkAKAm +8kwkQKAU9IolxAaKJoQIIvAKIcAP63LPcAAAsBOKI8UNCiRABZUFIABKJQAACiHAD+tyz3AAAK4o +iiNGBkokAAB5BSAACiUABYolgg2KJkIPAN8E259z6XCoIAAMYbtALoIhQCwBAVlhdXkAI00Bx3GA +APSqQpGwfQa9gb1cehC6RX3PcqAA7CemokKRwLp4euV6UH9DkQAjjQGwfQa9XHqBvRC6pXrPdqAA +7CdGpiORwLl4eSV4EHho8UIiQCCA4LIG7f9AIUEgz3EIAIYQz3CgAOwnJqDPcIAA9DMAgM9xgAD0 +M0IgQIAAoQf0z3GgAMgcANgRofEAD//gePHAANiNuCYPIA0GGhgwDMyGIP+KCPLPcIAAMEwAiIDg +QA+CBNHA4H7PcQMAQA3PcKAAqCAtoM9xgACUC0CBAWoAoc9woAA4LgWABCCAD8AAAADXcMAAAAAK +8kjYz3GfALj/GqFboWnYGLgZoc9ygAD4UwaCA4AggMdxAACIE/EF4A9IcAhyz3OAABRUBoMDgCCA +z3CAAPwzBIAAgNW4GWEQ4WhwyQXgD0J54HjxwAhxz3CAAIBCSIjPcIAAEkJEKj4LMiBCDue6CfLG +ugq6z3CAADhZmg3gD1lh0cDgfuB48cDhxc9zgACMWQaDA4AggM9wgACAQqiISohELT4bACGAf4AA +/EFVeEyQaHAKumIN4A9ZYR0AD//PcIAAOEJckM9zgABwWSKDaHAKukEF4A9ZYeB4z3CAAIBCSIgq +iM9zgACMWUQqPgsAIYB/gAD8QTV4TJAig2hwCroVBeAPWWHxwE4Pz/7PcYAAKGIhgaPBQsHPcYAA +pDUVIRAAABAAIMAQDgaA5i8ogQNOII0HWPISbRZ4ACCSD4AAENcGEoAgz3GAANDZFnkAgSKRjuUI +HEQwyiBhAAbyi3I+Dy//AsGA4DfyANjPcYAAtApAgQ8gQAMvIQogBCGAoAChBvSA4kwNIgjKICII +r3j6DaAEENkA3wQaxCOKIQgAABpAIKlw6XHmDCAHD9oAEAIgwBIABgQgQATAGhgAz3CAAFDatnjg +oOGgz3CAAHDWtHjgsBAmTpMvKIEDTiCNB6z1zQbv/qPA4HjxwOHFCHUE8K4LwA8SDOAPqXCA4Pr1 +2QbP/uB4o8FAwEHBBRSBMADYgeFCwg3yguEH8oPhDfQhwQDYDyBAAAMUgTAPIEAAAhSBMA8gQAAG +FIEwgeEO8oLhB/KD4Q/0IcED4Q8gQAADFIEwA+EPIEAAAhSBMAPhDyBAAAkUgTCB4Q70AhSBMAq5 +TyECBAMUgTAMuSV6IcEOuUV5JXggwYHhCPQHFIEwIsIGuQi6RXkleOB/o8CjweHFQsEJFIEwQ8KD +4UHAANgK9oDhyPYKFIEwgOHE9oPhw/YB2AcUgjAGFIMwUHMG8iLBMHPMIkKAA/QB2CHFgeUQ9AoU +gTAjw3BxSvYLFIIwUHHMI6qAhPaA4sogaQCB4A30iiHJD89wgACICiCggeX/2cohIgAhoMHF4H+j +wPHAQg3P/s91gABoCwAVBRBMJUCCWffPdoAA+FrPd4AACG4E8AAVBRABhUAtAQIleCCGMHAC8gCm +8CdAEUB4gODy82kFz/4KIcAP63LPcAAAhidj2/EAIABKJIAAosHhxULBQSgCAgd6QSgBBEd5z3KA +AJDWxrkqYue6EvQIFAMxz3WAANDZqXFWeUCBUHAF9EKRcHIG8keJ57r384DYA/AGicHF4H+iwPHA +z3KAABrXMmg2eTFiosFAwUHAi3AI2Z7aHtvaDuANGLuiwNHA4H7gfuB48cAIyJW4CBoYMAnIm7gJ +GhgwC8iKuI24kLgLGhgwz3CAAKQ1A4AYiIHgDPQLyM9xAAB8Kay4CxoYMN4N4AYP2NHA4H7xwOHF +CHU+iM9wgABEH0CAQCUAFAO5NXlZYYYK4A4K2poP7/+pcH0Ez/7gePHApcFBwELBDBwAMRAcQDHP +cYAAfJY0GcAPMBkADywZwA4oGYAOJBlADs9wgAB8liAYQAvPcIAAfJYcGAALz3CAAHyWGBjACs9w +gAB8lhQYgArPcIAAfJYQGMAIz3CAAHyWDBiACM9wgAB8lggYQAjPcYAAAJaAGQAIfBnAB3gZgAd0 +GUAHcBkAB2wZAAdoGYAGZBlABmAZAAZcGcAFWBmABVQZQAVQGQAFTBnABEgZgAREGUAEQBkABO+h +zqGtoYyhLBnAAigZgAIkGUACIBkAAhwZwAEYGYABFBlAARAZAAFjoWogAAPYGQAAaiDAAtQZAABq +IIAC0BkAAGogQAHIGQAAaiAAAcQZAABqIMAAwBkAAGoggAC8GQAAaiBAALgZAABqIAAAtBkAAGog +gAHMGQAAQMMBwALBUyfNNQwUBjBTJcQ1UybFNde6qXO6CGAGEBQHMJoKIA4A2HoPwAPPcAAArd6W +D8AACNgA2dII4AaZuf0HwA7xwIoKz/7PcoAApDyA4c91gADcXg7yAKIAhYDgE/QyDGABD9jyCCAI +CNgB2AClC/AA3sCi9gpgAQ/YwgggCAjYwKW1As/+4HjPcYAAqEAAgRzaz3OAABgKQKBCg1UiwAkB +oaASAACNuKAaAADPcIAAuAukGgAAnBIAAWeDBKFVIkANA6FAIgAHdngFiKDgDPTPcIAAEAoAkEh0 +gCREEwCsHtsD8BjbYqFVIkANeGAFocUF4A0ocOB48cDOCc/+z3CAAMAJAIDPdoAAnBighs93gACY +GAQggg8PAADgBCKBDwEAAAByaUR7Z32gpgQgjg8AAABAmHWghwO+RH4EIIAPAAAAgMd9oKcEIwMB +BiLPAMR9pn89eSV4ArgEIoIPAgAAAAR6BieAEC8oAQBOIEIEhuINGpgwCPLPcIAAAMIOkIDgKfLP +cIAAeAoAiM9xgACkNfAhAQC/EQEGUyFBgBv0z3GAAFBnhuIEuAFhEfTPcIAAEML0IEAAgOAN8s9y +gACQUgOCDRpYMAHgA6IE8DByGvJIcc9zoAAUBCqjz3KAAJQKQIqB4gDYBPRJg7jig/cB2IDgAd0K +9M9woACIIDV4oKAV8AbZ3PEuD+AMBhpYM+IOwAWA4Av0ANmRuc9woADQGzGgtg8gEKlwBQHP/uB4 +8cCWCM/+DRoYMM9xoADUBxoZGIAfEQCGAd0BGhgwBBKFMEwlAIfKIcIPyiLCB8oggg8AAOscyiOC +DwAAaQFcBOL/yiRCAxkRAoYD2CAZGIAUGViDDxEOhgAWAEAAFgBAABYDQQAWAEEAFg9ADxmYg/S/ +ViMAAhB4A/IC4BB4A+AEIIAPAAD8/xByDxEAhkDgHhkYgB0RAoYa9626HhkYgB0ZmIDaD8AFgOAG +8mYKr/8A2BPwC8gFIIAPAQAA/AsaGDALyKy4CxoYMAfwjboeGRiAHRmYgDIO4AwGGlgzIQDv/gDY +8cDhxc9wgADACQCABCCADw8AAOAvLQEQBg/v/04lQBQKJQCADfIKIcAP63LPcAAA3g6KI8UKgQPv +/04lRBR/2Aq4z3GgANAbE6F/2BCh3QeP/uB48cBWD4/+CHbsiCiWz3CAANwJsm8oc4Yj8w+2fUIr +EQLHdYAAENdghe27CHIC8kRo67mKIMMvBPQeFpAQDY5RIACApPLjuT3067sV8v/YB61KJABxANmo +IIADKGIAIYMPgAD43vZ7BKsoYgHhL3kAq13wTCEAoZD2CiHAD+tyz3AAAC0liiMLBEokQADVAu// +CiVABO65B40yIkIEACGBL4AA+N72eQnyRKkE2QApQQQleAetPfBAqQ8gQARj8EwgAKSW9owgw6/K +IcIPyiLCB8oggg8AAC4lyiOCDwAA5ALKJGIAfALi/8olAgRKCu//yXAIlu64BfICjgmtA/ABjgit +AIXruBjyANpHrUokAHHPcYAA+N6oIMACOGL2eAQYAgQAGAIEAeJPegGOCK0CjgmtLPBMIQChyiHK +D8ogig8AAC8lyiOKDwAAAQM8B+r/yiLKBwiWACGBL4AA+N7uuAeN9nkJ8gQZAgQE2QApQQQmeAet +3fEAGQIEANkPIUEEJngHrQGOCK0tBo/+8cDSDY/+z3OAAOwKYIN5Yc9zoABQDGCDx3MAAAAgInvM +u3BwxPdRIwDA9PNRIwDAyiAiAB70geIb9M91oADQDxAVA5aA4NP3z3KAAHQqn3AjgqggAAMCiiUV +D5bBuNNo2H8B4AKq53kjohAd2JAB2MkFj/7xwGINj/6swc9xgAB0OxmBobgZoc9xgAAMqQKRQZEQ +uAV6AhyEMDC6KIEEHIQwAtrPcKAAsB9IwVmgz3KAAPwzCYIAgOC5ScANggCASsAd8lEhwIEZ9M92 +gACkNQCGxBAABs91gAAkUFEgQIEG9P4PwAQB2NwdABABhhiIQR0YEKYOIAEY2M9wgACAQiiIz3CA +ABBCRCk+CzQgQA5RIACByiABB8ohIQzKIoEPAACQAMojoQcED6ENwCshBhEFr/6swOB48cD2CSAA +AdjPcIAAhEEggOu5D/LPcIAApDUAgMQQAAZRIECBBfJRIYCCBNgC8gLY4g4AANHA4H7xwGIMj/5R +IIDBpcFUCGIEyiCiAAvIkLgLGhgwjgjv/gDdz3CAAFRZJoAjgSCBjL3mCaAPuWEA2c92gACEQfwe +QBDPcKAALCDwgM9wAAA0HEDAAthBwAHYQsBDwUTBBdkE2gDbmHO4c9hzKglgBAAnRxMAhou4AKZR +BK/+pcDgePHA4guP/lEggMGlwdQPIgTKIKIAC8iQuAsaGDAOCO/+AN3PcIAAVFkmgCOBIIGMvWYJ +oA+5YQHaz3aAAIRB/B6AEADZz3CgACwg8IDPcAAAdBxAwALYQcBCwkPBRMEocAXZBNoIc5hwuHDY +cKYIYAQAJ0cTAIaruACm0QOv/qXA8cBmC4/+z3WAAIRBAIXruAXySgvABYDgCvILyAUggA8AAAA8 +CxoYMIIPj/7Pc6AAOC4Hg8O4j+AP8hwTBAAKIcAP63LPcAAAwRuKIwQAGQev/0olAADPdoAA7DgI +jongB/KI4BH0AIVRIACCDfTeCsAFgOAJ8s9wgACMWQaAA4AAgKoJwADWCsAFgOAK8s9wgABUWQ4I +gA9CDSAAANgJ8AiOieAJ9ACFUSCAgAX0ANgmCeAHjLgdA4/+4HjxwJYKj/56cIHgAd3CJUETgeAB +2M93gACkNSCHwHjIEQ4GIYdEJr6RyBEDBgT0RCO+gRLyCiHAD+tyQCsNBM9wAADLG4ojRwwKJMAE +XQav/wUlhRPPcYAA7DhelyyRUHEH9M9ygADIs0GCUHEa8iIKAADqCSAAqXCqCQAA8CdAE8QQAQap +cCW5wLnmD6AAANrqCQAQC8iQuAsaGDBSDo/+Yg5gEQHYIgngCgDYGgngCgLYz3agAMAvqRYAlqsW +AZaqFgKWBXmsFgCWAN2tFgOWBXquFgCWBXvPcA8AAPgEIQGABCIQAAQjEQBadRfyLypBAE4igAfP +cqAADC3wIgIAUSIAggDaDyICAAT0RX0E8AUikiAGIYGA6/XPcIAA7DgskB6XEHEP9M9wgACEQQCA +BCC+jwAAOBAF9IIOgAWA4Cj0TCNAoAv0pRYBlk8iACGGuAZ5pR5YkA/wz3CAAOw4LJAelxBxCfKl +FgCWRSVBESZ4pR4YkEwjQKAJ8s9wgADsOCyQHpcQcQTydgjgEQXYTCNAoAv0pRYAlkUlQREFIQEE +JXilHhiQOvBPIgAhhrjPcYAAfEJIgQUgQAQFegDYCKEBh8AQAwaA4y8owQBOII0HIfKO5cokInTK +ICIA6CAiBfJtACCBD4AAENf2fxLh72GMJ8OfyiEiAM8hwgPGIkIAAeAQI0ODLyjBAE4gjQfi9aUW +AJYFeqUemJDRAI/+8cCGCI/+z3GgACwg5oGwgc92gAB8QgWGAiUCEASGEHJE90J4BqEG8ArYBqGi +C4AG5Ka9AK/+pabxwOHFz3WAAKQ1FX0Ahc9xgADsqYAgAwCqDmAOA9oAhc9xgAAsUIAgAwOaDmAO +g9qVAI/+8cDhxc91gACkNRV9IIXPcoAA7KlIcIAhAwB2DmAOA9oghc9wgAAsUIAhAwNiDmAOg9ph +AI/+4HjxwKHBz3CAAABiAICKCeAGQMCLcATZvdoe2yYKoA0Yu6HA0cDgfuB4z3CAAHxC4H8GgOB4 +z3CAAGhC4H7PcIAA1ArgfwCA4HjxwJoPb/4A2UokgHDgeKggAArPdYAAgENw3AIlAhNEKT4HJ3LP +d4AA+FkA3sCiBdtkos9zAgBwFmOiAdtlouaiQiUCHgAiQA7AoAbaRKDPcgIABBdDoGWg5qAB4aUH +T/7PcIAA1ApggM9xgAD1WgCJb3oQcgLyYKnPcIAAaGbwIIAAAHjxwHIM7/8A2M9wgACEQQCA4LgG +8u64B/QI2APwAdhyCQAA0cDgfuB48cDuDk/+pcFRIIDBAt3gCiIEyiBCAwvIkLgLGhgwGguv/gDf +z3CAAFRZJoAjgSCBjL9yDGAP+WHPdoAAhEH8HkATANnPcKAALCBAEAcAz3AAAFQcQMBBxULBQ8FE +wQHYBdkE2gDbmHO4c9hwsgsgBAAnxwMAhoC4AKbdBm/+pcDxwG4OT/5RIIDBpcFgCiIEyiCiAAvI +kLgLGhgwmgqv/gDdz3CAAFRZJoAjgSCBjL3yC2APuWED2M92gACEQfweABAA2c9woAAsIPCAz3AA +AJQcQMAC2EHAQsFDwUTBKHAF2QTaCHOYcLhwSiZAADILIAQAJ0cTAIaguACmWQZv/qXA4HjxwP4K +oAXhxYDgC/ILyAUggA8AAADUCxoYMBoKj/7PdYAAhEEAhee4BvKnuACl8g0gDwDYz3CAAOw4CIiJ +4AjyiOAO9ACFUSAAggr0z3CAAIxZBoADgACAWgyAAAUGT/7PcYAA1ApNBu//AKHxwAHZz3CAAHxC +IKDPc4AAcFkGgwOAIIDPcIAA/DMFgECAaHDVug4LYA9ZYc9wgAAUCyCABImguASp0cDgfuB4z3OA +AHBZBoMDgCCAz3CAAPwzBYBAgGhw1brZAmAPWWEocgkAIAAA2eHF4cZAKQ0CJX1ALQMUiOKlewh1 +kPdTJX6QBvIBHVIQYbr78UEqjgDBukImTpAEHdAQ/fWA4gryLySJcOB4qCCAAQEdUhDgeMHG4H/B +xeB48cDhxc91gAAgpCCNjCHDjwrygOAG8s9wgAAoVuoJQA//2ACtz3CAAMijANk1oM9wgABwKiCg +z3GAAEhBAIGiuP4LoAoAoQDY+gmv/whx8QRP/uB48cDhxQDdz3CAAHALoKDPcIAASEGgoM9wgADA +qKl0nbAwvJ6w1glgBKlwqXAOCGAJqXG5BE/+4HjxwDYMb/4G2A0SDjYBEhA2DRoYMM91oAAUBAql +CYWA4AcSDzYn8gPYEKUEpc9wgAAI4noM4A8DGhgwktkDyJC5oBhAADoNIAQA2AmFgOAP8igVBBAk +FQUQHtgKIcAP63KMuN0Hb/+KIwQGBxrYMwEaGDTKpSUEb/4NGpgz8cDhxQh1XgzgABTYz3CAAKQ1 +AIDEEAAGJbgKDuAAwLgSCqAHBNiaCKANqXAKDQANugoADQEET/7xwOHFguChwQYBLgAIdaoNr/8A +2oDgffLPc6AAUAwFg89ygAAwqRKqBYMTqgmSjCCIgCptRfIT9ofgIfKMIMSBafSC4VgABQDPcoAA +tJ2iCa/+QCIAAkhxHvCMIMiAS/KMIBCAV/QFgwlpheBD9wDYUvBODeAGANlO8IHhSfTPcoAAtJ1q +Ca/+QCKAAguKgbgLqu/xC4mAuAup6/GB4Tn0Tgmv/otwIMDPcYAAtJ1TIAIAhiB/D0ipHHgJqezx +juFOAAUAz3CAAKQ1A4AYiIHgH/LPcoAA6JpIcBYJr/4G2UAiAAIKCa/+BtkMkoG4DLK/8YThjffP +coAA6JpAIgAF7giv/gTZDJKAuAyysfET2ALwHNjpAm/+ocDgePHAz3CAAOiaDJDguATyTgkABAbw +USBAgLQKAgTPcIAAtJ0LiIHgCPKC4An0Ig7ABNHA4H42D8AE/PH88fHAMgpP/rYKgAWA4M91gACE +QQ/0BBUEEAohwA/rcs9wAAC9G8PbDQZv/0olAADPdoAA7DgIjgAVBBCH4NEkIYLKIcEPyiLBB8og +gQ8AAMMbyiOBDwAAygDYBWH/yiUhAFEkQII19ADZz3OAAIBCKKsB2kmrSquMHUQQCtuOHcIQh+AC +248dwhAG8ojgDvRRJACCDPLsFQARargQeJAdBBAK2JQdBBAH8GTYkB0EEJQdRBCSHUIQlh2CEFUl +wBhWJcEV4g8gDgvaAIWJuAClAdgBpc9xgACkNQCByBAABoYgf44J9AGByBAABoYgf44ACIEDCI6H +4Ajyz3GgADguB4GouAehmQFP/vHA4cUA2M91gADkwEokQHEkhagggAIA2w8jAwALIcCAA/QB4AXw +Znl6CaAAJKUEhYDgmAnhAMogYQJlAU/+4HgIczhg1bvVuTBzNrjE9wIjQgAK8M9ygAB430WCAeDJ +uCJ6emIWuOB/RXjgePHAughv/phyCHXPdoAAQJ70JkAQz3eAAMCdUSBAgsogQQDKJCJ0yiAiAOgg +YgL0JgIQUSJAggPyAeCQ4EYABgAtu8C7z3KAAHDWtHpAK4UCYJIEvYYl+BOJvQ8jQwBgsgDaFn9A +p0Gnw7mleQUhQwEUfmC2z3GAAGCeFXkAGQABAvCA2J0AT/7gfuB48cDhxc9xgADQokGJz3WAAHAq +gOLPc4AASEEggwbyAdgApYK5IKMJ8ADaQKWiuYDgIKN0D0IKANhyDW//CHFSCyACANhhAE/+8cDh +xZhwA8igkAGAQOX0uMAlohAD5c9yoADUBw8SA4YEJY0fAAD8/5BzgHVH9w3IFSIBMA4RAAYbYxkS +AIYCJcEQEHFIAA4ABdgMuM9zoADIHx6jENgOowHYFRsYgBkSAIYQccT3USMAwPvzUSMAwA7yGRIA +hgohwA/rckPYjLjPcwAARBZlA2//uHUPGliDzQcP/vHAKg8P/qvBB8gA3c93gAD43wQggA/xAADw +QMANzAAXExDPdqAAyB9hh1EgQIADyA7yoBYCEPgWARAiewIi1wB2EAMBLyfIJVtjBfCEEBcB4nM6 +GMQFH4YQc8b3cHgWCmAGAtkB2c9woADUBzSgM6AD2S2gERAAhs9xoADUB0HAQOAPGRiAFBlYgwPI +pBABAFEhAIIE8s4KAA0E8EceWJPPcKAA1AcNEACGQC8BJBB4BSEVAAPIIYAAEBIBQ8G4EJgAchAB +AboQAAECIRQGCg0gB0TAgeAM9M9wgACwMwCQgeAB2MB4DLhCwAPwQsUDyM9xoADUB1mAiBmAAKQQ +AQC5oLgYQgO6GEQDt7mkGEAAA8D2uAfyz3CgAEgIQCIBIwbwQCIBIc9woABMCATCAsMDcWV6BSWV +IEdpz3MAAPz/ZHpjhwgixgDPc6AA1Ac1owAYQAUCIgAlD6MCJoAAG6MD2BCjz3GAAEBMDRIFNgCB +sHAg8s9woAA4LgWABCCAD8AAAADXcMAAAAAP8vXYBbjPcp8AuP8aomwaQAFp2Bi4GaIB2ALwqXCB +4AT0ABlAAQQXBBDPcYAA0CyIcIAgDwoephDYDqYB2BUeGJABgVEgAIBZ9IogBAAAoc9wgABGTACQ +z3GAAERMSiBAEAQggA8AAAAo13AAAAAohRYAloYg/w5BKIcAAJHCIAISLyYH8Cv0z3KAAGxPTIoE +IIAP////wkAowxJleIYi/wFDuoYifw+C4gHawHovJofwAdrCIoEABSLCAYi4CrpFeE8gQgMEIIAP +AAAAPE8gfoNQeECxA/SLuACxz3GgAPxETYEEIIAPAAAAPAQigg/////DRXgNoQfIz3GAAKiqBCCA +DwEAAPAsuAMSAzYEsQ+DAiOTIQChQBMAAa6pArEQi2ATAwFUaMO7ZXpGsQ+pLyIIAc9wgAB8wkAg +BgkVIEABaYDPcYAAAMJ6YkmgpBYAEPgWAhCAcEJ4RcDPcqAA1AsB2BCiA8BChzW4ArrAuCviF7gE +IoIPAAD8/8dwAA4AAEV47HIAogESAjbscECgQofscECoDcgUIQIAUIrscECo7HCgsAPIlBACAOxw +QKANyPAmAgDscECw7HCgsOxwoKDscKCgBxICNuxwQKADyECQVBAAARC6RXjscgCiAxIDNgGDUSAA +gQ/yUotwi89wgABQ2XZ4AIiGIH8MHHgEuEV4AvCA2OxyAKoDyDt1UIgzEIAABLoFeuxwQKgDyBp1 +XJDscECwAxIDNs9wgAC0WpwTAgFvgya6wLrAuwy6DbtlekCgDRICNgAigA+AACjCoKjPcIAArMFW +eFR5oLECkMAZRAMVJoIAeBkEAM9wgACkNQSAGpDQGUQDRsDPcIAA+N8CgKCigODKJ04TFAMuAMoh +TiOpdql3OnVMIACgt/IU8M9xoAD8RB2BOYEEIYKPAAAACBL0BCC+jwAGAAAM9FEjAMAn9M9woAD0 +BweA/7gA3ejzL/AA3fq4yiWCHwAAAQL5uMolgh8AAAIC/LjKJYIfAAABAoDiCvLPc4AAFFJQg4ol +CBIB4lCjegoAERHwAdnPcIAAgFogoFIOYA8ocM9xgACQUg2BiiUIEgHgDaEFJ0+TDPJnAiAAAN2E +EgAAsuCP91EjAMBJ9M9yoADUBw+CEHgZEgGGWOAwcDH3CfDPc4AAmFEkg4ohECEB4SSjUSGAoET0 +HhqYgx0SAIYHGhgwHRIAhkrAHRIBhgTIIKAdEgGGIaAdEgGGIqAdEgGGI6AdEgGGJKBWJgASHhoY +gB0SAYZALwIkMHgFIJUABBICNoYh8w8AEhIBjCEMgAGCQ8AW8hrYFfDPcIAA+N8IEAQAABAFAAoh +wA/rclfYz3MAAIwT2QUv/4y4AN3S8CDYmnADcBB4choEAADdTCAAoAT0A8hz8APA9rgH8s9xoABI +CEAiACMG8EAiACHPcaAATAhHwQNwSMAEwQLAJXgFJRUgCMAH4M9xgAD43yOBBCCADwAA/P8IIFYA +DCbApCwBLQBJwKoNAAAFJw+QmfQB2c9woADUBxQYWIBVJkEUDxhYgFEiAML+9QjAz3GgANQHFaEH +wgIiACUAGkAFD6EJwgImgCAboQPYEKEqwJzgAN2P9AfIAMEEIIAP8QAA8BBxlfQDyOlxyLkCI5Ml +CIgMuCV4AxIBNxC5JXjscQChCsBAIVkwARoYMATIAxIBNkHGAxoYMAQaWDAhgACQAcY0ucC5NHgD +4EDmBCCADwAA/P8eZg0SATYG8BUiQDAOEAAGAn4VIkAwDhAABhB2d/cDzM9xnwC4/xihz3CgAPxE +XYAEIr6PAAYAAGL0TCAAoAvyBMhQiFMiwQCGIv4DRLrEGIIAMKjPcKAAFASkoAfIz3GgAEgsHaHP +cIAA+N8CgEAgUCAScBgFzf8M8M9ygACYUSOCiiESIAHhI6IC8Dp3Jg4ABlMhfqAE9GYMAAAFf4Dn +UvLhv0fyA8gpiAHhKajPcYAAmFEGgQHgBqFD8AohwA/rcigUBTA82Iy4z3MAABsU7QMv/0okQABu +DuAFKHAKIcAP63IHEgU2R9iMuM9zAAAjFMkDL/8AFAQwTCAAoM9xgACYUYonEBAJ9AfIz3OgAEgs +iicIEB2j+roG8gWBgL8B4AWhtfEGgYG/AeAGoa/x4L8H8s9xgACYUQWBAeAFoTp3A8jpcci5CIgM +uCV4AxIBNxC5JXjscSp0hCQCkQChQCFOMBXyz3GgANQHgBnABAPMKnLIuhC4RXjscgCirKEB2BQZ +GIBOD+AQAeYDEgI2khIAAeq4BBIBNgb0khEDAVEjgII28qq4khoEAJIRAAGquK4NoAmSGQQAENnP +cKAA0A8QGFiAJBABhs9ygAAI5kWSMHkCukV5DBhYgBTZEBhYgM9xgAAI5meRRpEY2RC7ZXoMGJiA +EBhYgM9xgAAI5mmRSJEQu2V6DBiYgAbwz3CAAAjmqqjPcqAA1AuwokwhAKBY8gbwCNnscCCgAebP +cIAA+N8CgBB2uPfPcIAAqKokkJThwCGGDwAAkwDPcKAAaCzwIEEAz3CAALRaAIDPdqAA1AcleA2i +A9gSpvIIwAxRJ0CSBvJeDq//AcAH8APYEx4YkBQeWJNMIACgE/LPcKAALCAwgAXAMHAB2cohRgME +IIBPIAAAAIDhzCAhgPDzz3AAKAgABhoYMAbAjgggBqlxUSFAoMvyz3CgACwgr6DH8M9wgABsTxGI +USAAgDnyUSAAwzfyz3CAAERMIJAocIYg+w+MIASAAdjAeIHgD/TPcKAAwB0HgAQhgQ8AAAA8hiD/ +DiK4CrgleAPwB9gKuM9ygACkNUOCz3GAAGxPMIkQuTIigg8AANgCn7mA4gHawHoPukV5JXjPcaAA +/EQNoUwjAKAN8s9woAD0B2AYwATPcYAAmFEDgQHgA6HPcIAAqKokkJThwCGGDwAAkwDPcKAAaCzw +IEAAz3GAALRaIIEA2s91oADUByV4z3GgANQLDaFMpboMYA8GwBkVAJbA4KIADgANzFEgQIBL8gPe +IB2YkwHYFB0YkAQSATYAFgRABxoYMQAWBUABGlgxBMqc4MoiwgfKIIIPAADcDsojgg8AAPQKyAAi +/8ohwg8ocIYPIBAO2Q8VAJYEEgE2tBkEABMdmJMQiVMgwgCGIP4DRLjEGQIAUKnPcBIgAADSCSAE +DRICNgTIz3GgACwgsBAAAS+BZOAwcMoghQ8SKAgAhPfPcAAoCAAGGhgwAN0NzAQggA8AAAIIguAK +9AQSATaKIAQAag0gCpgRAQANyM9xgAAQws9ygADkwBR5z3CAAPjfoLEigAaSz3WAAKiqGWEweSay +rdjPcgC7ALsSDWAHBbgDyBqQQgygBw0SATYElc92gABg1fQmARAGlTBwFPJ2CuAFB8gKIcAP63IE +lQwVBBHPcwAAqRX0JgUQMdjRB+/+jLjdA+/9q8DgeFEgQMPxwOHFJ/LPcIAA+N8BgM9xoADIH5Yg +QQ8eoRDYDqEB2BUZGIDOCuAQQdhRIEDDE/IB2c9wgACAWiCgJg8gDwHYz3GAAJBSDYEB4A2hiiUI +Ei7wz3GgAPxEHYE5gQQhgo8AAAAIAN0H9AQgvo8ABgAAGfIA3fq4yiWCHwAAAQL5uMolgh8AAAIC +gOIK8s9zgAAUUlCDiiUIEgHiUKPaCsAQBvAD2c9woAAUBCWghQPv/alw4HjxwAYLz/0Idc92gAAg +FgCOgOCowVj0i3fpcM9xgABMYqoL7/0g2gHYAK4A2I+4CxocMADYFRoCMM92gAAAANd1AAD+yqC2 +BfQHwIC4R8DPcKAArC8agFIgAABRIACACPIBloC4AbYHwIG4R8DPcIAASGegiO4OoASqrs9xQ3Wo +EkDBiiEaCkHBK44EpkbA6XBjwQ0cQjPPcYAA2FNEwc9xgABEU0XBINkB2j3btgzgDBe7CNiSCOAF +AdkC2c9wgADwOySgqQLv/ajA4HjxwDYKz/0odoDgz3GAAKQ1LyAHIAP0YYEC8GCBxBMDBiW78CEN +AMC7gOaioaOhzCMhgAHdyiUhEM9zgADsOOiLiecX9OGBxBcPFlEnQJER8uyTfpFwdw3ygeAK8oDg +CfQAgcQQAAZRIECBA/QA3YHiyiUhEADftgkgDelwCnDiCKAGqXHPcIAA8DsEgFEggIAR8s9wgACw +TQCAgOAL9M9wAAAWCXIIAAWB4AX0sgyACwzwANmeuc9woAD8RCGg4HjhoGoJIA0A2IDmB/LSC2AA +AdjaC0AAog/ABIDgBPQCCQAPBPAyCQAPz3WAADQXAI2A4Ab0CggADgHYAK2dAc/98cAyCc/9z3aA +AIBCKY5ojjBzz3WAAIRBGnAF9ACF7LiT8kqOz3CAABBCQCCRAUQrPgsncFV4BoiB4CiuVPQAhc93 +gAD8QUQpPgtAJwEVNCFBDuy4wLkR8oDhrLgApRTy0g3ABQiORCg+CwAnQB4qkKC5KrAI8IDhBvK6 +DcAFAIWMuAClCI5EKD4LMiFALoHgAdjCIAEAQg6gEAquKI5KjkQpPgsAJ0AeVXhMkIDiz3CAAIxZ +E/LPc4AA7Dhoi4njB/KI4w30YIVRIwCCCfREKT4LMiFBLoHhJPIKcSXwLWoKuSLwRCk+CzIhQC7P +d4AA/EGA4MogYgDeDaAQCq4IjkqORCg+Cy9xOGdVeEyQgOLPcIAAjFnj8zIhQSCB4d/zQCqBAgJx +yg2gDhTnCI5EKD4LNCdAHlEgQIEAhc8gYgHQIGEBAKXPcYAA7DgoiYfhDPKI4RD0z3GAAKQ1IYHE +EQEGUSFAgQjy4rjPIOIA0CDhAAClUg+AABkAz/3xwL4Pj/3PdYAA5MAklYDhEfLPd6AALCBQhwDe +BoVHpToJ7/0OIIAACKXEtRCHxbUGpfUHr/0IhfHAz3GAAOTAABEEALhwz3KAAHBGQCyAABV4FSBA +ATAiBgBMJgCBC/QKIcAP63KKIMwMWQPv/oojxQJMJgCAK/JMJkCAEvJMJoCAF/JMJsCAEPIKIcAP +63KKIAwNiiNFCykD7/4KJYABRgoAANHA4H4iCQAA/PFMJECAA9gC8gChANgFoQSBoLgEocYIYAAD +2O7x7vHxwM9ygADkwAaSAeAnkhB4MHAGssz2BIqB4Ab0BYqB4AHYA/IA2IDggAgCANHA4H7PcIAA +UMMgkEQhAAOI4DT0ANvPcoAA5MBlogSCUSGAgaC4BKIe9ASSz3GAADzBAeAkgRB4MHAEssz3BIqB +4Ab0BYqB4AHYA/IA2IDgLAACAM9wgABISgOAgOAL8gPYCvDPcYAASEoDgYDgA/JjoQTYZQEAAOB+ +4HjxwM9zgADkwAQThABMJECABfQFi4HgAdgC8gDYgOAM9AUThQAKIcAP63KKII0OIQLv/s7bAtgA +owDYJJMJowWjBrMqoySDoLkkozIOoAYEs9HA4H7PcoAA5MAA2SWiJIID2ACioLnZBmANJKIA2c9w +gADkwCqg4H8poOB48cDSDY/97g/P/89wgAAQwWCAz3KAAOTAqIBgos92gADARgSCqKIA2cCGoLiB +5iWiBKIS9ILjzCPigBP0gOXPcIAASEojoAXykg/P/wnwYgoAAAfwAdtgoiiioLgEouEFj/3gePHA +bg2v/QDYz3GgACwgUIHPdoAA5MAkjs91gAAQwYHhCKUF9CWOgeEC8gHYgOAl9CqGgOEc8gaGzg6v +/Q4ggADPcQAAECcwcND3z3GAAHjfJYGZIc0KMHBK9wXwz3AAABAnCKUC2AjwANgI8AmGgOD29QHY +AKUB2GEFj/3PcoAA5MAkgg8hAQAkoqkGIAAJ2PHA2gyP/c92oAAsIBCGz3WAAOTAB6XPcIAABFj+ +CaAOAN8AFQUQTCVAgBLyTCWAgMwl4oA98gohwA/rcoogTA2KIwgHmQDv/ookgw8ElYDgbPLODM// +z3CAAHjfBYAohZkgzQowcAHYwiAOAIDgXvLPcIAA2EnpoNdxAAAQJ28gCwCA4BLyBI2B4Ab0BY2B +4AHYA/IA2IDgBPL6Dc//RvDPcAAAiBMIpT4Oz/8+8ASVgOAb9CWVCIWB4cAggQ8AAIgTA/IbeM9x +gAB43yWBCKWZIc0KEHEB2MIgDgCA4CL02ggAACDwgeAc8giFHXjXcAAAECcIpW8gCwCA4BLyBI2B +4Ab0BY2B4AHYA/IA2IDgBPKCDc//CPDPcAAAiBMIpcYNz/8ElQW15LUQhhUEr/0GpeB48cDPcYAA +BJtBgc9xgAB43yWBBSm+ADBwyiBOAAwhAPDPcQAAECceDa/9yiBFDs9xgAA8wQSh0cDgfuB48cDh +xQDYz3OAAOTAAKPPdaAALCAQhQHZz3KAABDBBqMQhSCiBqLPcIAA2EkDiCSrjCCDhiSqBPIlqiWr +0gsgAAPYoQOP/eB4AdnPcIAA5MDgfyCgz3CAAKQ1A4DPcaQAHEAIgMC4E3jBuBKh4H7geOHFANpK +JAB0z3WAAMCdz3OAADieSHCoIAADQCMBAhR5QLEWJQEQQKFBoQHgSiTAcwDZqCBAAs9wgABw1jR4 +QLAB4c9wgACwCkGgz3CAAOiaTLDgf8HF4HgF8EJ5x3BAAAAAz3KAAHjfRYJQcTf3UyBDBXBxwCCN +D0AAAADAII0A4H8ieAbwYnkCIIAPQAAAAM9ygAB432WCcHE391MgQgU6YlBzg/c4YAfwAiCAD0AA +AABieDhg4H7xwEIKj/3PcIAA3MMMiOe4CvQCuM9xgAAQ1xZ4BWEtvcC9A/D/3QYKwASA4Ajyz3CA +AOw4CIiH4ALYA/IA2M9xgAAwqXeJz3KAAMizIYIwcwTyIIKA4QT0Ad8D8ADfz3aAAKQ1IIbEEQEG +USFAgSvygOUp9COGOImE4SXy+gmADoDnz3GAAKBQGPLPcoAA7AoCggHgAqIA2M9ygABYWgCiz3KA +ALRZAKLPcoAAxAkAohGBAeARoQXwEIEB4BChCgjP/WoJwASA4A7yz3CAAOw4CIiI4MwlYZAG9J4J +oA4B2D4LwAWMJcOfSfKA5xHyz3GAAHAqAIGA4AvyANgAoc9xgABIQQCBoriyCOAJAKFGDMANz3GA +AHjfBoFFIEABBqHPd4AAtJ0Lj1EgwIAUDIL9C49RIICAhAwCBBYMwAPaCcAEgODECiIAyiAiBoDl +CPIAhsQQAAZRIECBEfTPcYAAuE0EiYDgC/IDiYDgsAphDMog4QCWCiAAFdgxAY/94Hjhxc9xgAB0 +KgCJAduA4GGpJPLPcKAAsB95oM9wgAD8MwiAo4FggAKBEHUA2hj0z3CAAIwqAIiA4AP0AdgK8AGB +AiMNANd1TABAS3n3QalIcIHgA/RhoUKp4H/BxaKh7/GA4AHYwiAMAM9ygAB0KgCqAdgBqgDYAqoB +ogKiA6LgfySi4HjxwOHFkOAIdZhyiPcO2GIK7/4A2oDgBPQT3S7wz3KAADCpSHCCDq/9DNnPcYAA +dCoAiYDgDvLPcIAAUMMAkIYg/ACMIAKABvQFkmSSZ3gDoUIlABMiCiAGiHEKJQCQDPTPcIAAUMMA +kIYg/ACMIAKADA/B/0EAr/2pcOB48cCYcLhxnODKIsYHyiCGDwAA4w7KI4YPAACDAKgDpv7KIcYP +TCWAgcoixgfKIIYPAADkDsojhg8AAIQAiAOm/sohxg8A2s9xgADAl566FSFBAQCBASoCAUZ4+gyg +BwCh0cDgfp0H7/8F2eB48cDhxQDdz3CAAMCXLgov/xzZG9imCCAABdlKJAB3z3GAAJQqqCDAAhYh +QAMEEAUAsHWYdQX0QCRNAJUHT/0KIcAP63J32AW4EQOv/lPb4HjxwM9wgADAlxgQBQAvLEEBTCQA +h8oixgfKIIYPAADiDsojhg8AAKsA4AKm/sohxg/PcIAAlCoWIAABAIBAeNHA4H7gePHA4cXPcAMA +QA3PdaAAyB9FHRgQqg/P/4DYFR0YkB0HT/3gePHAmHC4cZzgyiLGB8oghg8AAOMOyiOGDwAAYwCE +Aqb+yiHGD0wlgIHKIsYHyiCGDwAA5A7KI4YPAABkAGQCpv7KIcYPANrPcIAAwJeeuhUgQAEggAEq +AgFFedYLoAcgoNHA4H6dB+//BdngePHALg5v/f/az3CAAESsExiYgBwYmIAA3s9xgAAYCsOhz3CA +ABg8QKAB2s9wgAAcPECgzKHQodGhz6HAocGhAt3Jd89wgAA4poQvCBkAIEIOS4IncAAhkH+AAESm +RiLCAEugEgtgDkAgACFhvYDlJBiCIwHnJ/cC2ADZigvv/QTalgsgBQHYDQZP/eB44H7geOB+4Hjg +fuB44H8B2OB+4HjgfuB48cCGDU/9GnDPdoAAWCAAhjpxz3GAABBbz3KAADxcRCg+DxUhAHQBYQdi +B9gA3YDhyiViEOMgQgDKIEIEhufKIMIDzCBhggP0AIaD4AHawiKBAIfgz3GAALAsQKkP9KCGCiHA +D+tyiiCHDwi96dsFJQQUIQGv/golQATPc4AAZChMIMCgz3KgACwgRgAlAACmTCCAoR33ghMEBkAS +BQBALIEANXkAIY4PgABAJTQeQBEKpiweABQwHkAUACGOD4AAeCVAJEEAxbmgroIbWACBEwEGUILS +adV+x3aAAGggQ6YApgQeABQIHkAUAWmwrsW49QRv/YEbGADxwJoMT/3Pc4AAXCCggwDeDyZOEITg +zCCigQr0xn2go89zgABgIDV7QKMI8IPgzCBigQT0xX2gowYlvpPKICIAE/SD4MwgYoEO9IPgAdjC +IAEAz3KAAGAg8CJBABt4rg7v/wTgAdihBE/94Hj0uPHAFPLPcIAAxCwIiIDgyiBhAEAK4QfKIQEA +ANjPcaAAwB0IoQTYlLgJodHA4H7xwPYJYAVw2E8gQQYuCmAFcNj+DwAA0cDgfuB48cDhxTILIAWi +wYoIoAIIdYHlEfSLdS4NIAWpcCoK4AepcIHgCfTPcIAAnDX+DQAFA/CSCgAFIQRv/aLA8cDhxaLB +CHVqCSAAi3DPcoAAdCshwQeCOGAHoiaCBRSAMDhgBqIlggYUgDA4YAWiJIIHFIAwOGAEoiOCIMA4 +YAOiARSBMAKCOGACoiGCAhSAMDhgAaIgggMUgDA4YACiqXCAIAcJSHH+C2/9INqtA2/9osDxwM9w +gAD8KxSIgOAK8s9wgADELAzZztoe23INYAwYu9HA4H7xwOHFocHPdYAA9DMAhQHggeAApQn0AdnP +cKAAyBwxoEoKYBAocItxmg4v/oogiA8AhUIgQIAApQb0ANnPcKAAyBwxoAAUADEnuM9xgADELCiJ +wLgwcOAI4gfKIWIAjgrAByEDb/2hwPHApgpv/Qhzz3KgAMgfgxIAhiOLBCCAD///AMCLGliAIYvA +iwa5JX4iiwq5xXkleIMaGIAEi+gaAIADi0IgAIBKCCAAyiBiAAOLgOAA3QzyiiDECIQaGICDEgCG +lLiDGhiABvCEGliDgxpYg6UCT/3PcqAAsB8igiCgI4IhoIog/w8CogOi4H6A4MogYgAIuIu4z3GA +AEZMALHPcYAAREzgfwCxhOAI8gS4FHgAIIEPgABoZWCBz3CgAMgfRGmCGNiASiTAcgDZqCCAAvAi +QwDPcKAAgB81eAHhYKDgfuB44H7geM9xgAAcURKBAeASoQ3Ix3CAABzCLIgB4S95LKjPcIAA0Cwc +iBBxyfaKIAgABhoYMIrYkLgH8IogEAAGGhgwQtiYuOB+8cB6CU/9geAB2MB4LyEAEC94heDPcoAA +0Cw/qgr0CYqA4MD0Adh2DCAAIBoCALrwz3CAAEQWFSBKAAMSjRAB2AHZIBpCAIDlwHgvJAAAz3KA +AEZMAJIvJgfwBfQFIAABALLPdoAAREwgli8mR/AF9AUhAQEgts9zoADAHeeDhif/HkEviBAPf5B3 +ABKHEAEShhAl9EwhgJDKIGEQTCYAgADfyifiEMAvIhO4dwQggA/////CQC/PAuV4QC0PEuV4QCiP +EuV4BSBAAQQgvo8AAAA8ALID9Iu4ALIHgy96kHKGIP8OIrg39EwhQJAU9M9ygABsT0yKhiL/AUO6 +hiJ/D4LiAdrAei8mh/AB2sIigQBFeAbwTCGAkMogYQAEIYEP////wgoigIFAL88CJX9ALQESyiJi +AOV5CrgNugV5JXoEIr6PAAAAPFB5QLYD9Iu5ILaA5c9yoAD8RAv0DYIEIIAP////w4q4i7iMuAvw +rYIEIYAPAAAAPAQljR/////DpXgNogISgBCB4Ab0AdgIowDYCaMEIYAPAAAAPCq4CqNBAE/98cDW +Dw/9z3WAANAsH42F4Ar0IBWAEIHgnAkhAMogIQAA2HTwz3OAAEZMAJMPeYLhBvQIcYYhww8weCCz +z3aAAERMIJYveoLiBvQocoYiww9QeUC2z3egAMAdR4cvJgfwRCIFAUEthQAB2hT0BCCAD////8JP +IAQCQC2FAgUlAAEEIL6PAAAAPACzBPSLuACzB4cve4DjhiD/DiK4I/TPc4AAbE9siwQhgQ/////C +iLmGI/8BQ7uGI38PguMB28B7LybH8AHbwiPBAGV4CrgleAQgvo8AAAA8EHkAtgP0i7kgts9woAD8 +RG2ABCGBDwAAADwEI4MP////wyV7baAquSqnANgIp0mnH601By/9IB0CEOB48cCyDg/9SHYacwoj +ACEKIUAhCiKAIc91gADQLB2tPq2A4AHfQYUP8umt6q1GIkIChuAB28B7IR3CEIfgAdvAewjwANtp +rWqtRSJCAiEdwhOA4SgdwhAH8uit661GIoIBBvAA2SitK61FIoIBQiAAgEGlOgzv/8ogYgDDpcWl +EB0AFBgdABQkHUQUJh1EFCIdghQjHYIUdQYv/RwdwhTgePHAIg4v/Zhwz3KAANAsAYLPdoAARkwg +loO4LyZH8AGiBPRFIcEAILbPc4AAREwAky8mB/AE9EUgwAAAs891oADIH4UVD5ZEJwURL3+D50Et +hQAS9AQhgQ/////CQC2PAuV5BCePHwAAADyA5yC2BPSLuSC2hRUBlg9+g+aGIf8OIrkS9AQgjg// +///CCrklfgQhgQ8AAAA8gOHQeMCzBPSLuACzz3OgAPxELYMEIIAPAAAAPCq4BCGBD////8OKuYu5 +jLkto4gdGJAdiofgzCCigQXyAdghGgIACYpMJECACqoA2AmqK/TPdoAA9DMAhgHggeAApgf0AdhR +HRiQhgwAEM9wgAC4TQCIz3GgAOwngeAB2MB4B7hFIAAGELiFIJEABqHKDy/9AdgAhkIgQIAApgX0 +ANhRHRiQUQUP/eB48cDiDA/9z3aAANAsHY6H4MwgooFt8gWGz3OAAEZMA6YGhuCTBKYTlhK2IxaA +ECIeAhDveIPgB/TpcIYgww8QfwCzz3WAAERMAJUPeYPhB/QIcYYhww8weCC1z3GgAMAdR4EvJsfz +RCIFAUEthQAP2gq6EvQEJ48f////wk8nBBJALYUCBSUPAQsngJDgswT0i7/gsyeBD3uA44Yh/w4i +uQ/0BCCAD////8KIuAq5BXkLIYCAMHggtQP0i7gAtc9yoAD8RC2CBCCADwAAADwEIYEP////wyV4 +DaIBhqO4AaYJjgquAdgJrgDYIR4CEF0ED/3gePHA4cUA3c9wgADQLKGgygnv/6lwz3CAAERMAJDP +caAAwB0EIIAPAAAAPCq4CqEFgaWhBYEFoTEED/3gePHAtgsP/c9zgADQLCETggCA4hLyKBOBAIDh +DvIdE4QACiHAD+tyiiBHD4ojhwGJBy/+uHOA4nH0KBOBAIDh0CCiA3T0z3GAAEZMIImA4Uz0QSjC +AsC6z3OgAMAdp4PPdoAAREwgloYl/x4vJkfwW3oivSr0geIV9M9ygABsT0yKhiL/AUO6hiJ/D4Li +AdrAei8mh/AB2sIigQBFfQTwguLKJWEQBCGBD////8IKvYi5JX0EJb6fAAAAPLB5oLYE9Iu5ILbP +daAA/ERNhQQhgQ8AAAA8BCKCD////8Mlek2lKrkqo89yoADIH+wSAYDuuRX0ixIBhoDhEfLPcYAA +REwgkQQhgQ8AAAAo13EAAAAoCvTruAr0jrgI8OwSAYBRIQCABPKruPnx+QIP/fHAhgoP/c9xgADQ +LAGBhiC/jXD0ANiSuM9zgABGTECTAKFPeIHgB/RIcIYgww8QegCzz3WgAMAdB4XPdoAAREyGIP8O +QSiBAACWLyYH8CT0z3eAAGxP7I8EIIAP////woYn/xFDv4Ynfx+C5wHfwH8vJsfzAd/CJ8ET5XkK +uQUgTwDweOC2D98KvwshwIME9Iu4ALbPdqAA/ETthg/ZBCePH////8OKv4u/jL/tpseFhib/HkEu +hBBPfoDmCrkC3w/0BCKCD////8KIukAsjgLFegsiQIBAswP0i7pAswDZKKXppQQggA8AAAA8KrgK +pf0BD/3gfuB44H7geOB+4HjgfuB48cCCCS/9JNqpwYt1z3GAAARiNgov/alwz3eAAIBDCBeBkM9w +gAASQkQpPgsyIEAOz3aAAIRBUSDAgVEWABYf8oHgLvJiCCAAANiiCAAAZgwAEAHYQMCBwdrcAicA +E8YO4Awg2qlwJNm82h7bcgsgDBi7AdhRHhgQEvCA4BDykg4gCVQWABYA30DHqXAk2bzaHttOCyAM +GLtRHtgTTQEv/anA4HgM2s9xgACAQwLgD3gnGQKAANgoGQKACxGAgCYZgoAIEYKAKRkCgAHgD3gL +GQKAz3CAABJCRCo+CzIgQA7gfyoZAoDgeN3Yz3GAAJxCBKkLiQfgD3gFqVDYBqlv2AepmtgIqQnY +4H8JqfHAcggv/STarcHPcYAAPGMqCS/9hMDPcoAA7DgIiofgfAICAM93gACAQwgXgZAKF4OQz3WA +ABBCQCWQEQNtRCk+Cyd1dX1mjc92gACEQYHjTAICAGySz3KAAKQ1XpJQcwj0QIYEIr6PAAA4ECwC +AQAA3alyC/BEKT4LACGDf4AA/EFVe2yTAeJ9ZUQpPgsyIEQOkHKx90wkgIDKIcIPyiLCB8oggg8A +ANobyiOCDwAAxADIAyL+yiUiAK4NQANyDWADmHACIAABIIZKuOO50SEhg1HygODEAQwAEHUA2QMc +QjAJ96J4EHUB4S95/PcDHEIwgODE9gHhAxxCMAgXgJAKvUQoPgsyIEEuL3DHcIAA/EGA4cohYgA1 +eAyQCrhBwM9wgACMWQKAQsXpcYIhQwVDwEAkwDDiDOAMDdpeDu//DdieDs//YgoAEAHYRMCFwdrc +AicAE8IM4Awg2oTAJNm82h7bbgkgDBi7AthRHhgQlvAC2c9woACwHzmgURYBFoPhCBeAkLhwJ/RE +KD4LL3AyIAEgx3CAAPxBCiJAgMoiYgAVIIMApBYCF2yTUHMV9IHhAdnCIUEANXilFgEXTJAwcs9w +gAD8Mwf0DYAAgFMWARYQcWTy/9gDHAIwRC0+CzIgQS4vcMdwgAD8QQq9gOHKIWIANXgMkAq4QcDP +cIAA/DMJgELFIIAAIQABQ8DpcUAkwDCCIUMF/gvgDA3afg3v/w3Yug3P/34JABAB2ETAhcHa3AIn +ABPeC+AMINqEwCTZvNoe244IIAwYuwPYUR4YEAgXgJBEKD4LMiBCLi9wx3CAAPxBCiOAgMojYgAV +IMEALJGB4qQeXBAB2cIhQQA1eAyQpR4cEM9wgAD8Mw2AAIBTHhgQBPBeDM//OQbv/K3A4HjxwNIN +z/yYEAIABCKBDwAAAAg7eQQigw8AAAAQJXvPcYAApDWkgem6ViVOFFYlDxWYEIEACPKGIf8DRLkv +Z4m/6XEZ8FEiAIK8FQIRDPLCuYAlAhk/ZeiPPWUwjWV/8H9FeQnww7k8eT9mPmYwjuiPRXmIGMAD +ZXnBBe/8jBhAAPHA4cUDyKQQAQCYEAIAUSEAgHIQAQFIcAbyzghgAgDaCHUH8AHhwghgAgDarGgC +DwAOz3KgAMgf+BIBAAPIz3OAABDXEIgCuBZ4AGPtuM9wgAD8Mwj0AdtzokiAQIIMgGCACPAC23Oi +SYBAgg2AYIACJUAQWGAQcsAjbQANcQChDXBgoAAWAEAAFgBAA8jPcqAA9AdwEAEBaLknonAQAQFo +uTB5JQXv/HAYRADxwKYMz/zPdqAAyB+gFgQQ+BYDEITgAN8i9AMSATakEQAA9Lh2EQIBBvLPcIAA ++N+hgATwghENAQ3MUSAAgYQRAAEJ8gIlwRACJEMACCMDAATwhhEDARtjaHFx8IHgSvQNEgE3A8jk +uXgQAgEh8lEhQIDPcYAApDUkgVQRAQEJ8n4QDQEifWJ9AiRDAyvwgBADAc91gADw1QAjRABwiHZ9 +YJUAIw0BhBADAbtjG/CkEAEA9LkI8nCIz3GAAPDVdnlgkQTwghADAc9xgACkNSSBgBANAVQRAQE9 +ZbtjhBANAbtjgBANAblhfhANAUJ9J/CC4CH0AxINNg3MeBUCEVEgAIHPcIAApDUEgFQQAQEJ8oAV +ABEieGJ4AiQDAAfwghUDEYQVABE7YxtjgBUNEUJ9BfDpc+ly6XXpcQ3MUSBAgAfyA8h2EAIBYro6 +YgvwgONiusn2z3CAAKQ1BIBGEAABGmL4FgAQXWUCfR+GEHWL96DYD6b/pl+mAtgVHhiQgNgOpo0D +7/xwePHAHgvP/M9xgACkNfAhAgBWIkUECIJWIgQFUSDAgIogCADKICEAvBoEAEokAHIA2agggA/P +dYAAjGj8ii5l5H4vKIEDTiCDB89wgAB0am9gACVDAOCrRBKPAOR+Ly6BE04mjxfuYMiryIJRJsCQ +D/Idiobh0yCmAC8oAQBOII0Hz3CAALBmqGAQ8M92gAC0aC5mzmW8isR9WBKOAMR9Ly1BE04ljhfI +YBCrAeFKJAByANuoIIEA3IrPcYAAUGpvYc91gAB0auR+LyiBA04gjwfvZQAlwAD8qEQSjwDkfi8u +gRNOJo8X7mUkGIIDyIJRJsCQD/I9ioDj0yGhAC8pQQBOIY0Hz3GAALBmqWER8IDjA/LJawLwaHbO +YTyKxHlYEo4AxHkvKUEATiGOB8llLBhCAAHjSiQAcQDYqCBABc9xgACsZn2KCWEAJAwAAeBkeS8p +QQBOIYMHz3GAALBmaWEgrCUCz/zgeOHF4cbPc6QAtEUpEwCGz3GAACRQyBkAACsTAIbMGQAAz3Cl +AAgMA4DkGQAADhMAhhB6MLjUGQAA0BmAAA8TAIbYGQAAz3CAAIzD1Ii2iOgZgAN4iOwZQAMNkPAZ +wAAs4AIgggP0GYAAAiBCA2J4+BmAAPwZAADBxuB/wcXPcIAAXFoGgAOAIIDPcIAA3Jfgfymg4Hjh +xeHGmHDPcoAADC0FgiCCZoLKuBC4yrkFIQGAAYLKuxC7yrgFIwUAZ4ICgsq7ELvKuAUjBwBoggOC +yrvKuBC7BSMGACTyABQOAC8oQQBOIIMHANgPIMAAEn0EIEMBpH5lfgAcgAPagqR+xXt6onmCBCCO +AQQgwAGke8V7eaJ4gqR7BCFBg2V4GKLf9cHG4H/BxeB48cCGCM/8OnAFgaCByrgQuMq9BSUNkAGB +JoHKuMq5ELkFIRAAAd4b8gQlgJMU8i8oAQBOIIIH8CGBIIDhAN8PJ48QCfIEJwAUQiAAgGB5yiBi +AOZ9gOXbfuj1jQDP/OB44H8A2KHB8cAmCM/8o8EIdkfAz3WAAAwtG4U6hfyFJHgEfwcnj5NBxxb0 +gOZb9AYK4AQK2IDgV/IKIcAP63LPcAAAjROKI0cASiQAAOUD7/0KJQABBBQBMYDhGvIcFAAxCyBA +gAzyz3CAAFBBYIDPcQAAAGkM2GB7A9oK8IDgCPTPcIAATEEggGB5DNgGFAExgOEa8h4UADELIECA +DPLPcIAAUEFggM9xAAAAaQ3YYHsE2grwgOAI9M9wgABMQSCAYHkN2AsngJMF8i4Jb/8K2AjwgOYG +9P4PL/8K2FYIAADcpQjcswev/KPA4HjxwEYPr/wA2s9zgAAMLTuDuoMA3g8mDhCkeQQmQBBCIACA +yiBiAC8mB/AB3coggQAH8hyDJHjmDu//xXipcHUHj/zgePHA4cWhwQHYQMDPdYAADC0KhVEgAIAM +8otwBNln2j3bOgngCxe7CoWguAqlSQev/KHA4HjxwMYOj/wacCh1SHdodjhjZtk92n4J4AsXuoHg +CfQKcFYJ4AupcelwJgngC8lx/QaP/OB48cCSDo/8psEodRpyYMAA2AEcAjAB2AIcAjADHAIwi3CC +DaAHgcGA5QXyBMEKcGB9BcIDwYDhDvQKIcAP63LPcAAAjBPu24okww9RAu/9uHNgeQDYoQav/KbA +4HjxwDIOr/wB2aLBz3WAAAwtGoVbhQR6HIUEIJCALfID8Dt5BCBAoP7zLygBAE4gkQdcHUAUFSVN +FB2FgODKIcEPyiLBB8oggQ8AAI8TyiOBDwAAHALKJAEE5AHh/colQQRWDI//HYVAeBIMT/8A2A8g +QAQGIBAgng3v/wpwFQav/KLA4HjgfuB4ANnPcIAAGETgfzig4H7gePHAqg/AA89wAQBgYIDgCvLP +cYAADC24GQAAG4GRuBuhz3ABALBfgOAI8s9xgAAMLR6hG4GBuBuhz3AAAHhrgOAJ8s9xgAAMLZQZ +AAAbgYi4G6HPcAAAfGuA4Aryz3GAAAwtmBkAABuBibgboc9wAACIa4DgCfLPcYAADC2cGQAAG4GK +uBuhz3ABAJxqgOAK8s9xgAAMLdgZAAAbgZm4G6HRwOB+8cDhxaHBz3KAALiqz3WAAAwtF4UA2Q8h +AQAYhSR4QiAAgMogYgCB4AHbANkP9AjYYMABHEIwAhzCMAMcwjCLcATZ9g3v/4ojCAAI2ADZHg7v +/yhyANghBa/8ocDxwJoMr/wI2c9yrd7vvvoJIAI6cCIIYAAqcIPgSPLPcIAA3JcDkE4gzwGH51AA +BgDPcIAAHBc+DmAA9CDAAwDeAN0E2BpwKnDpcclyCiSAD63e776yCSACqXM2CGAAKnCD4CbyQiBA +IIDgAeUs9wHmhOao9wHnh+e4B8X/KnDPcq3e776CCSACENmuDyAAKnCD4A7yz3Gt3u++bgkgAipw +Bg/v/ypwg+DKICIATQSP/PHA7guv/APapsEacFoKoAyDwQPBz3CAAGgYFBQHMADe8CBFAM9wgABw +GPAgRgDPdYAAdAsO2MSlQMAE2EHAz3Ct3u++QsAEwgpwgNsKCSACmHPSCSAACnCD4EDyA8PPcIAA +iBhChfAgwQDApYDhDBUQEMGlCPLPd4AAkBjwJ8AQgOAG9MClwaUA2RnwhCoMAwoJYAAvcA4ggQ8A +AAABIKUDwIQoDCPwJwEQ8ghgAC9wDiCBDwAAAAEhpQSFgeAN9ACFEXiMIAeNwvfApTF5jCEHjcP3 +waUA2HkDr/ymwOB48cASC6/8BNqmwX4JoAyLcc9wAAAb0gDdqXH+DGAAqXIAwc9wAAAc0u4MYACp +cgDBz3CAAMQWAcIVIEEAAJECwQW6wg1gAEV5A8CA4NwABQDPdoAAdAvS2Ai4Gdm6DGAAANrPcAAA +ItJAJgES4gpgAATaz3AAACPSQCYBE9IKYAAA2s9wAAAg0oTBxgpgAADahcfPcAAAIdLpcbYKYAAA +2gKGF9k+DuALQCYCEgOGF9kyDuALQCYCEwTAF9kmDuALhMIFwBfZHg7gC+lyAoYA2eoPIACLuQKm +A4YA2d4PIACLuQOmBMAA2Qi40g8gAIu5CHcFwADZCLjCDyAAi7kihjF5GeEFKX4AI4YvclB3MXkZ +4QUpfgAvccwgRYCG9wPAAeUQdTIHzv8DwBB1xvcB2c9wgAB0CySgANhBAq/8psDxwNYJr/wJ2qnB +CHY6CKAMi3GSD6/8IcAIcULYpgxgAAW5DBQEMADByXAGwgolgA+t3u++Ag/gAQLDAg8gAMlwg+Aq +8gDBBcLPcIAADBcA3fAgQAAEwQq6BCKCDw8AAPzJuUV5cgtgAKlyygigDwXYIBQEMADByXAGwgol +gA+t3u++tg7gAQfDOg7v/8lwg+DKIEIDrQGv/KnA4HjxwBYJr/wC2qfBmnCeD2AMg8HPcIAAYGMA +gAfZRcDPcAAAEdIWC2AAANrPcAAAEtIA2QoLYAAA2s9wAAAT0gDZ+gpgAADaz3AAABTSANnuCmAA +ANrPcAAAAUQH2d4KYAAA2s9woAC0D3AQFwC6COALAdgmCKAPBdi82K4LYAAA2cPYpgtgAADZiiBE +CJoLYAAA2YogBAqSC2AAANklxbXYhgtgAKlxiiCEBn4LYACpcQPYQMAE3kHGz3et3u++QseKcATB +A8Ie25hzSiUAAEomAADKDeABSicAAI4O7/+KcIPgLAIBAM91gAB0CwgVFhAMFRIQDthAwEHGQseK +cATBA8Ie25hzSiUAAEomAACODeABSicAAFIO7/+KcIPg8AEBAAgVFRAMFRAQDthAwEHGQseKcATB +A8Lh25hzSiUAAEomAABWDeABSicAABoO7/+KcIPg3PIIFREQDBUTEAPYQMBBxkLHinAEwQPC4duY +c0olAABKJgAAIg3gAUonAADmDe//inCD4MLywoWjhZoPoAsvIMcFBMHPcoAAiBgCIUClz3OAAHgY +NXoAogIjACTPcoAAkBg1egCiw9o1e0Cjz3OAAIAYNXtAoz/0z3CgALAfAYCGIP8BgOAB2MB4LyYH +8BP0z3CgAPxEdBAEAGQQBQAKIcAP63LPcAAAsRM9A6/9iiMJCi4LgAMKIcAPgODrchDyz3CgAPxE +dBAEAGQQBQDPcAAAsRMRA6/9iiNJCs9wAACtE4ojiQpKJAAA/QKv/QolAAGA4Dn0z3CgALAfAYCG +IP8BgOAB2MB4LyYH8BL0z3CgAPxEdBAEAGQQBQAKIcAP63LPcAAAsRO9Aq/9iiNJDK4KgAMKIcAP +gODrcg/yz3CgAPxEdBAEAGQQBQDPcAAAsROVAq/9iiOJDM9wAACuE4ojyQzB8QIlgCXZYAIhQYQP +8gIlQiQMehIMIAAvcATCAiUBIM9wgABoGFV4IKACIIAkuWACIcGED/ICIMIkDHrqCyAAL3AEwgIg +ASDPcIAAcBhVeCCgANhRBm/8p8DgePHA/g0gAADYz3AAAA3SANkWCGAAANrPcAAADNIA2QoIYAAA +2s9wAAAV0s9x8w///PYPIAAA2s9wAAAb0gDZ6g8gAADaz3AAAALSoNmaudoPIAAA2gnYjLgA2c4P +IAAA2hTYjLj/2cIPIAAA2gDYjLj/2bYPIAAA2hHYjLj/2aoPIAAA2gLYjrgA2Z4PIAAA2gHYjrjP +cQAA//+ODyAAANrPcAAAC9IA2X4PIAAA2s9wAAAN0gHZcg8gAADaz3AAABLSANliDyAAANrPcAAA +E9IA2VYPIAAA2s9wAAAU0gDZRg8gAADaANjRwOB+8cA6DU/8o8GLcQHdngtgDKlyz3CAAEBiAIBB +wATYCghgACzZDtgCCGAAANkhxrXY9g8gAMlxiiCEBu4PIADJcYogRgDiDyAAyXEAwIDgzCCigMwg +4oDMIGKBzCCigcwgIoLMIGKCzCDigsohQgMD9APZgeDMIKKAzCDigMwgooHMIOKBzCAigswgooLM +IOKCA/SCuS95hODMIGKBzCCigcwg4oHMICKCzCBigswgooLMIOKCA/SDuS95bg8gAA/YANjlBG/8 +o8DxwOHFocGLcdoKYAwB2s91gADsmQAUBDDPcIAAaBZAJQEfEtrqDSAAANsAFAQwz3CAAGQWqXEB +2tYNIAAC289wgACMFiRtHNreDSAAAMMA2JUEb/yhwOB48cD+C2/8A9qjwbpwfgpgDItxAcHPcIAA +FBcA3/QgTgACwc9wgAAsF4Dm9CBUAM9wgAB0C+Cg4aDMJqKQzCZikcwmopHKJcITAvQA3YHmzCbi +kMwm4pHMJiKSA/QB3YTmzCZikswmopLMJuKSAvQC3YYNz/+qcM9yrd7vvv4I4AHJcWIO7/+qcIPg +dvIAwIDgzCCigVD0gObMJmKQzCYikUr0AsCA4Ej0z3CAAGgYtXhacOCgz3CAAHAYtXh6cOCgz3CA +AIgYtXgacOCgz3CAAJAYtXg6cOCgz3CAAHgYtXjgoM9wgACAGLV44KCqcMlxz3Ot3u++hgjgAaly +5gnv/6pwg+A48gDBABIAIIbhAdnAeQO5tXnHcYAAuKoAoQATACAEoQAQACAbeAihABEAIBt4DKGq +cKlxyXIKJIAPrd7vvjoI4AGKc94Or/+qcIPgEvIAwM9xgAB0C0CBBL4GuNhgFSAABcdwgAD0qiGB +QrAjsADY2QJv/KPA4HjxwKTBi3EKCWAMBNoAwAHBBLg1eM9xgADMFhBhbg0gAALBAMABwQS4NXjP +cYAA7BYQYVoNIAADwQDYpMDRwOB+8cChwTIKIAKLcgDAocDRwOB+4HihweHF4ca4cM9wgADIsxAQ +BgDPcIAAnEMFgJhxgOChwYYk9w9z8s9wgAAEWwCA0HAN9M9wgAAMWwCAsHAH9M9wgAAIWwCAkHBh +8gAcQDEgwgEUgTDw3lMiwADEelMhxwAkflR6QC6NAbR9umIVes9xgAC4rEhh1H4Ic4Yj/Q97ezpi +QYpleEhzhiP9D3t73WUVJc0RvmHCjmV6yXOGI/0Pe3u5YSOJZX4oc4Yj/Q9MJACAe3tleRPyz3Wq +AOAHc4VRIwCABvJIpQmlKqXLpRDwCKVJpcqlK6UK8Am6RXjPcqcAFEgDogm5JX7Eos9xgAAEWwAZ +gAHPcIAADFsAGEABz3CAAAhbABgAAaHAwcbBxeB/ocDxwDIJT/xCDkADgODUD4ECAN4X8HDcAiUA +E0QuPhcvd1IOIA0ncEIlAB5KDiAN+GAA2QAmgB+AAO5CIKgB5s91gACAQ2sVgJAQdqb3z3CAADhZ +Ig4ADc9xgACEQQCBobiuuDkBb/wAofHAz3EAggEAz3CgAKwvPKDPcIAAsE0AgIDgDPTPcIAADC8A +gILgBvK+DEAD0cDgfmoLQAD6C2AFb9iA4Af07g8gDwrYVgtAAPLx8vHPcoAAsE0gggZ54H8gouB4 +z3KAALBNIIIleOB/AKLgeAQogA8AAC+6QinCdFB6RCr+AgIgQA4QeIDgBPIB4lB6g+BAsQP2gOAD +9ADYAvCA2OB+4HgNA8/98cAeCE/8OnDPdYAA9DMAhQHggeAApQr0AdnPcKAAyBwxoGYPIA8ocOoK +IAUH2Bpwz3agAOwn64YyDSAHKnALpgCFQiBAgAClBvTPcaAAyBwA2BGhvg/gBApwJQBv/Olw8cC6 +Dw/8OnAodRpypgogBQfYUSCAoFpwBvIuD+AHyNhQIJAgTCCAoBzyC/ZMIACgEvJMIECgI/QV2BO4 +DvBMIACkE/JMIACoGfTuDCAEKnAApRDwKdgSuPAgQAQApQrwK9gSuPrxz3CgAOwnGYAApUIP4ARK +cKEHD/wKIcAP63LPcAAAihN72wokQAQ9A2/9CiUABPHAKg8P/Ah3OnGA4hpzAN7N90h19CeAExUh +gSNSD+//CnJhvYDlAeY292EHD/zgePHA/g4P/KHBCHeA4hpxAN7P90h19CeAEx4IIACLcQDAFCCM +I2G9gOUAtAHmNPc1By/8ocDxwMoOD/yhwRpwz3aAAPQzAIYB4IHgKHUApgr0AdnPcKAAyBwxoAoO +IA8ocI4JIAUH2Ah3dg1gA7PYgOAV8otxRgov/QpwABQAMQClAIZCIECAAKYG9ADZz3CgAMgcMaBa +DuAE6XDJBi/8ocBRJMCA8cAF8ioPz/8D8OoIAADRwOB+4HhRI8CA8cAF8kIPz/8D8AIJAADRwOB+ +4HjxwDIOD/wIdY7gAd7CJo0Tz3CgALQP/IAKDmALANjJcKlxAdoWCSAFSHP6DWAL73hpBg/88cDy +DQ/8OnAodRpy3gggBQfYTCCAoFpwH/IO9kwgAKAV8kwgQKAo9BXYE7gVIEAEoKAd8EwgAKQV8kwg +AKgc9CpwggsgBKlxEfAp2BK4FSBABKCgC/Ar2BK4FSBABKCgBfDPcKAA7Ce5oIIN4ARKcN0FD/wK +IcAP63LPcAAAiRNK2wokQAR9AW/9CiUABOB48cBmDQ/8CHc6cYDiGnMA3s33SHX0J4AT8CGBI1YP +7/8KcmG9gOUB5jb3nQUP/OB48cA6DQ/8CHeA4hpxAN7N90h19CeAExoIIAD0IIEjYb2A5QHmN/d5 +BQ/84HjxwAoND/wacM92gAD0MwCGAeCB4Ch1AKYJ9AHZz3CgAMgcMaBODCAPKHDWD+AEB9g6cL4L +YAOT2IDgGfKwfUAojyGBvxC9pX/PcKAA7CfmoACGQiBAgADZAKYG9M9woADIHDGgmgzgBCpwAQUP +/OB4z3GAAKQ1I4HPcoAAKAsyIYMPAAAfAwGiMiGBDwAAGQNhskhwILII2XPaHtvRBiALGLvgePHA +z3CAAKQ1A4AJgFEgQIHKIGIAwA6i/sohIgAmDO/9AdjRwOB+4HjgfuB48cBGDA/8CHUodiCFQiEB +gMohYgCA4QDYBfJqCSANqXAB2CSFgObQIWIAzyEiANAhIQDPIWEAgOAkpaAIIg3KIEIDcQQP/OB4 +8cD+Cy/8iiIEDs9wgADkCQCAz3aAANCiJoBAJgAUfgkgDAThAYbPdYAApDUihsgdGBDPcoAA0DjJ +HVgQIZYnqiCOBCCADwAGAACA4AHYwHghqgaqAN6ODqAJyXDPcIAA+TNqDa/+wKi2CkADgOAK8joL +QAOA4Ab0Vgvv/clwF/AC2DYJoAEB2YYO4A4C2COFSIE0kVMiAADeCCAKAdsA2Z65z3CAAKQ8IKDB +Aw/84HjxwLDg4cUIdYP2ueXM9gohwA/rcs9wAACaISLbmHUxBy/9uHNCJQAcmQMv/A944HjxwBoL +L/yYcEGB5LqwiTvyconPdoAAENfybfZ/5mY0yva+CBGFAEkgwAAI8s92gABQ2bZ+wY4D8ADex3CA +AFDZtngEiAgjAwAII4MDACNAAUkgwwMWbXV4z3OAANDaA2PPcIAAUNq2eM91gACkNaSFuIUBgKV4 +BCCADwAAAAgGewLwY4Hou5gZwAAA3QnypBEAAADdl72RuJS4pBkAAFEkAIAc8s9wgACkNcSAwLrI +hgQmjh8AQAAAPr4e5th6RXv+u5gZwAAN8qQRAACFJQEUjLiRuKQZAACcGUADHfD/uxLypBECAIUl +ARSWvZi9jbqRuqQZgACcGUADJIAQgZ64EKEL8JS9lr2cGUADJIAQgZ64n7gQoW0CD/zgePHA+gkv +/APYz3aAAGRBIIZAeYDgbfIghmB5BNiA4GnyIIZgeQDYZ7iL4Ar3MyYAcIAANGBAJwFyFHkAeQDY +QvDPcIAAbEEggGB5AdiA4AHYwHg48M91gABsQSCFYHkB2IHgEfIghWB5AdiD4AvyIIVgeQHYguAH +8iCFYHkB2IHg3vUB2B7wz3CAAGxBIIBgeQHYheAB2MB4FPDPcIAAbEEggGB5AdiB4AHYwHgK8M9w +gABsQSCAYHkB2IPgAdjAeIHgF/Ighut1YHkA2Bpwz3CAAGxBIIBgeQHYuHA32AohwA+pcpTbHQUv +/QokAARxAQ/84HjxwA4JD/zPcIAADKkgEIAAgeDPdYAAGAoJ9ADe3ghgC8lwAtgDpcSlA/AB2AWl +TQEP/OB4z3CAAAypIBCAAIHgz3GAABgKBfQC2AShA/AB2AWh4H7xwM9xgABsCwCBgeAO8gohwA/r +cs9wAACHJ4ojRAZKJAAAmQQv/bhzz3KAAGgLAIKC4Mwg4oHKIcIPyiCCDwAAiCfKI4IPAAAaAcoi +wgfp9YLgHPTPcIAAMgtgiM9wgABOxYQrHwAyIEAOUSAAgAnyz3CAAAypIBCAAIHgA/QD2CHwAtgA +oiHwz3CAAAypIBCAAIHgFvTPcIAAMgtgiM9wgABcxYQrHwAwIEAOgOAK8s9wgAA0CwCAhiA5jwjY +A/IB2ACiANgAodHA4H7PcIAAJKQgEIAAgeDPcYAAGAoF9ATYBKED8AHYBaHgfvHAz3CAAGgLABAE +AM9xgABsCwARBQBMJACBzCVhgMoiwgfKIIIPAACJJ8ojgg8AAFMBnAMi/cohwg/PcIAAQAsAgADb +z3KAADwLDyMDAACCZngAos9wgAAoxSAQgwCB4wXYF/LC489ygAAITgmCDfKMI8KBBvKMI4KCB/KA +uAfwRSDAAAPwRSBAAQmiAtgAodHA4H6A4ADayiCBABHyz3KgALAfAdt5os9ygAD8M0iCYIICI0IA +cHHCIm0AQnjgfg3Ix3CAABzCNIgB4S95hOE0qAMSAjaM9s9wAwCEAKAaAACKIAgABhoYMAvwiiAQ +AAYaGDDPcAIBhACgGgAA4H7Pc6AAsB8B2lmjz3OAAPwzaIOA4GCDBfIie3Bwg/cA2ALwSHDgfuB4 +z3KgACwgcIKA4AryAiNCANdyAIAAAAb3UHCG9wDYBfBwcH73AdjgfvHAeg7v+5hwpcEod7hzAN4E +I4AP/wAAABi6BXpveQi5/9gIuGR4KLgFeUV5CN30JIADJ3hEwNYJIA0QFAAxEhQCMWG9QCgBBAV5 +R3lEwRAUAjEUJIAzgOVAsAHmKfdTJcIFQKcAFA0BB9kH8BB9FCdMEAC0YbkUJEAwu3tPvQCQpXuB +4XB7eGAy9wQggA8AAAD/ELgFekCnSQbv+6XA4HjxwDYIAADeCAAA8ggAANHA4H7geM9xgAAgPEAh +AANVIcIFUHBG9wDZBBhQAFBwvffgfuB48cDiD6AGANhGDu/8ANjPcIAA2FkeD8/8z3CAALhZFg/P +/I4KT/5eDMAIANgSCSADgNnuCMAM5gqAAioLAA0uDoAB+g3AAgDYxg9v/ghx0gvP/noKQAtmDsAC +TgmgAf/Y3g1AAYoghQ8IcUIOYAUIctHA4H7xwDYN7/uKIP8Pz3WgADgux4UHpc9woABULguA07gG +JgBwDwD//4IOIA4W2Y4NwAHHpXEFz/vgePHANg+gBgHYmg3v/AHYcgsAD9HA4H7gePHA4cUA3c9w +gAC0CqCgz3CAAOiarLDqCSANqXA2DM/8AghgDKlwBggABIIIj/1ODUABiiAGCghxrg1gBQhyJg4v +/Klw/g0P/BEFz/sA2c9woADsJyug4H7xwM9wgABoLE4PIA4S2aIIAAEC2OoOb/4A2dHA4H7gePHA +z3CAALQsLg8gDgTZgggAAQHYyg5v/gDZ0cDgfuB48cChwYtwEg8gDgHZYggAASDAgeAB2MIgAQAH +4KIOb/4BFIEwocDRwOB+4HjxwKHBi3CqDiAOBNkAwFEgQID8C+IGyiCiAADAUSCAgMAKAgwAwFEg +wIDcDwIHAMBRIACBOAsCB4oPIA0B2M9xgK7gAexwIKAByOxxAKHPcoAAFJiKJIF9ANmoIAAC8CJD +AOxwYKAB4R4IIAEA2KHA0cDgfvHA4cWjwQHYQMDPdYAADC2pcCoOIA5c2Q4Kz/46hRuFJHg8hQR5 +gcBiCi//QcEBwRuFJHhBwFUlQB/mCi//qXHPcIAAhC7aCi//QCUBG4twdg7gAATZLgsv/wHAAIWA +4AX0BYWA4EgMAf+CCY/+tQPv+6PA8cDhxc9wgADYYQCAosFBwIHAAd3uDSAOqXFAxYtwNg7gAATZ +iQPv+6LA4HjxwKHBi3DSDSAOAdkAwFEgwIEvJAcAABwAMQzyBxIFNgohwA/rcoogxQDlBu/8J9vy +C6ABQNj6DsAA6guAB6HA0cDgfvHAygrP+891gAC0MwKFI4UB3hBxwH6pcHoNIA4D2c4OwACA5gPy +AoUC8ACFCQPv+wOl4HjgfuB48cDhxc91gADMM6lwEg0gDhDZABUEEEwkQIAR8kwkwIAf8kwkAIET +8gohwA/rco/YjbiY210G7/y4cwGFDLgEIIAPAQAA8AGlC/Ahhc9wgAB0TSCgI4XPcIAAUiAgqAPM +13AAAABAAdjCIAoAF7jHcAAOAACDuJ24n7jscQChARIBNuxwIKByDuAAAdh5As/78cAA2M9xgADc +MwChAaECoc9w0P4AAAShABYAQAAWAEAAFgBAABYAQAPM13AAAABAAdjCIAoAF7jHcAAOAACDuJ24 +n7jscQChARIBNuxwIKAWDuAAAti6DoAC0cDgfuB48cAAFgJAocFAwgEUgDBRIACABvLPcYAAcJoF +8M9xgAA4qkChYIkB2gfwABYAQBUhjAAApAHifXgQcvn3USMAgAnyABYAQQPwANgVIYwAAKQB4oXi +uvcDzNdwAAAAQAHYwiAKABe4x3AADgAAg7iduJ+47HIAogESAjbscECgug3gAAKJocDRwOB+4Hjx +wOHFz3WAAIgLqXCWCyAOCNkAhc9xoAC4HgKhAYUDoRYNwABlAc/7DQXAAPHApMGLcHILIA4Q2QPM +13AAAABAAdjCIAoAF7jHcAAOAACDuJ24n7jscQChARIBNuxwIKAAwFEgAIADwAb0AsE6DCABANoF +8NIMYAIBwQINwACkwNHA4H4JAAAABQAAAPHAqgzAAPUFwAvgePHA4cW0wYt1qXA+CyAOFNkAwIbg +zCDigQb0ag0gA6lwCHEj8ILgB/S+DSADqXAIcRvwgeAG9LoNIAOpcAhxFfCD4MwgIoIH9DINIAOp +cAhxC/CE4Ab0ig0gA6lwCHEF8IngHfQB2QPM13AAAABAAdjCIAoAF7jHcAAOAACDuJ24n7jscgCi +ARICNuxwQKBWDOAAKHBdAO/7tMAKIcAP63J82I24d9uLu0okAADRA+/8CiUAAfHA4cWiwYt1qXCK +CiAOAtkyDSADqXDWC8AAJQDv+6LA8cCiD4/7ABYQQKHBTCCAoMohxg/KIsYHyiCGDwAAjwzKI4YP +AACMBcokBgR8A+b8yiUmAAAcADSLdalwhgrgAATZhCgIKS93ACeOH4AARKaWDKAMBG7PcIAAKKga +gBJwEPIkFoAQgOAj8qlwBNmZ2h7bkgngChi7ANgkHgIQGfDHd4AAOKYLh4G4C6fPcIAAGAovgIDh +AdoE8kSgBNgH8ADZLKBJoCSgBdjGDEADWQev+6HA8cDhxc9wgACkPACABCC+jwDAAAAI9M9wgAAg +pACIjCDDjwXyCgpv/QHYz3WAANCiqXCOCSAOUtlOCsAH2grgAKOFpgsgAalwCHHPcIAAKFZWDIAM +/tnPcIAAIKQNB6/7IKjgePHAz3CAAMCoUgkgDg3ZpgrAAJYKgAbRwOB+4HjxwF4Or/sC2aLBNgkg +DotwAxSSMEwigKCP9gQUhTAKIcAP63LPcAAAhAyKI4UJSQLv/AokgAQCFIAwz3aAABgKhCoIKS93 +IB4CEM9wgABcpvlgLIlAIBADgOEAFBQxACDTAxHyJg9gAUIkgCEB2BG2/9ghHgIQQCYAGBYJ4AAE +2VrwANgRtiEeghTPdYAASKRAJRES/WWLcKlxTgygCwLaQCUAEl4IIA5CJIEhACeAH4AASKQIEAUA +z3CAAHjfBYBTJUEFEHHKIcYPyiLGB8oghg8AAIUMyiOGDwAAhAGYAeb8yiSGBBIK4AdKcEokgHAA +2agggASEKQgJL3AyIAIggOIJ8ggVBRAwIQQgDCRAgRXyAeFAJgAYdgjgAATZAdkMG0IghxUAFoC4 +hx0YEOYJYAMocH0Fr/uiwAohwA/rcs9wAACGDDEB7/yKI8YF4HgAFgBAQQHAAPHA4cXPdYAAHMSp +cNoP4A0D2QGFz3GgAIAlDKEChQ2hAI1RIACAANiOuATyD6ED8BChDgnAAF0Fj/vgeOB+4HjgfuB4 +4H7geOB+4HjgfuB48cDGDK/7B9ijwQDeQsYyDy/+CdmLcDIIIA4E2QPM13AAAABAAdjCIAoAF7gA +IIEPAA4AAAYUADEbeBPgBCCADwAA/P8leJ24n7jscQChARIBNuxwIKAAwexwIKAEFAEx7HAgsAYU +ATHscCCwBhQEMVEkAIAM8gESBTYKIcAP63LPcAAATyZJAO/8adtCC+ADAdgCwQDFJXhCwM9woAAs +IEAQEADAvQHlAvAB5gYUADEQdoAACgCC5QQUADGCxxb0G3gQeOlxGgzgA6ly7HEAqQQUADHpcRt4 +AeAQeAIM4AOpcuxxAKkI8Olx9gvgA6ly7HEAsQQUADFAIEUAz3CgACwgEIAvJUgBAiAABNdwAQCg +hpoH5f8EHEQxCBQEMAohwA/rcs9wAABQJqUHr/yM244KwAMI2AoOL/4J2fYPoAACwOkDr/ujwPHA +ABaFQKbBTCUAhgAcQjFE9kwlAIJN9gohwA/rcs9wAABmGZXbYQev/EokQAAAFoBAARwCMAAWgEAC +HAIwABaAQAMcAjCLcEYKoAaBwQLCgOIP9AAUhTAKIcAP63LPcAAAZxmf2yEHr/yKJMMPBMBgegXB +A8GA4Qv0CiHAD+tyABSFMM9wAABoGaPb7fEBwIDg4yBCAMogIgAOD4AApsDRwOB+8cDPcIAA2Emi +DeANCdlyDwAF/gsABTYMAAXqDoAA0cDgfuB48cDPcIAA3Et+DeANB9nSDoAA0cDgfuB48cClwYtw +ag3gDQXZAMBRIACAFfLPcIAApDUDgBiIgeAN9ADYmrjPcaAAyB8PoQHApBkAAMPYGrgOoY4OgACl +wNHA4H4dBWAGANjgePHAz3CAAHxN3gzgDSjZbg6AANHA4H7gePHA4cUAFgBAguDPdYAADC8ApQf0 +ANnPcJ8AuP89oEYOgAAghYThRAANADMmQXCAAGRgQCeAcjR4AHgCCKADVNhRIECAEvLPcYAAsE0A +gYG4VgxgDgChCvCuCy/+Adh2CIADBPCGDIAETQKP+/HAigwACfINgADRwOB+4HjxwMoKoAkA2M9w +gACkNcgQAQbAuYHhAdnAeZoOIA48EIAA0cDgfuB48cDhxc91gACkNQCFxBAABlEgQIEN8gohwA/r +coXYjbiKI5wPSiRAAHUFr/y4c5IOwAqGDqAMAdjPcIAA7DgIiIfgHvQBhcQQAAZRIECBGPKeCQ/9 +z3GAAHjfBJAlgQq4MHAO8gohwA/rcobYjbiKI10CSiQAACkFr/y4c44Ij/xaDOALANiODwADNg2A +AIUBj/vgePHAXgugCQDYkgyP/M9xgADkswKJ4g0gDiCJ0cDgfuB48cCiwYtwcgvgDQjZAMCA4M9x +gAD8TQChB/IGFAAxA7EEFAAxArHmDIAAosDRwOB+8cCuCK/7gdihwWDAA8wA3892gABoCwIcBDDP +cKAALCBAEBEAAIaA4AEcwjMP8s9xgAA0CwCBgbgAoc9xgAAITgOBAeADoQHYAvAC2BpwAMBGCe/7 +CnHPdYAACE4DEgE3XpWB2GCG6g1gDgokAATPcKAALCAQgEAdQBRMIICgEaVIHQAUTfIAhojgE/TP +cIAA5FhmDUAMxggv/hTYjg6gBATY4KbPcIAAbAvgoADYheAD8gDYCPDPcIAAbAsAgITg+fUB2C8m +B/AO8vIJoAMU2IDgCvTPcIAAyFgmgCOBIIGKDUAMAIaA4APyANgI8M9wgABsCwCAgOD59QHYLyYH +8AX0ig6AAoDgC/LPcIAANAsAgC8oAQDmCy/9TiDAB/EHb/uhwPHAig9v+4DYocEDEgE3YMDPc4AA +aAtgg891gAAITgIcRDAvpShySiAAIAEcAjT+DGAOCiQABM9wgADwOxAQBQBRJYCADPQAFAQwCiHA +D+tyz3AAAHYnQQOv/Gfbz3CAAGgLAICA4G4CAgC6CsAKgOBiAgIAz3CAANxLAIBRIACBUgICAIYI +QArPd4AAMgsAj4QoHwAAIYB/gABMxYYJ4A2KIQsPYI8KIYAvgABoxYQrHwAAIYJ/gABMxQWShiB/ +DBx4UyCAgAj0z3GAADQLAIGGuAChAopRIECAaPSEKx8AACGAf4AASMg6CeANGNkAj4QoHwAvcDQh +DSBCJQQWjCQHgc33CiHAD+tyz3AAAIEnkNuFAq/8iiUHAc92gACEyNhgAgngDYhxAI/PcYAARAuE +KB8AMiZFHgAmQB5MJQCAAKEN8gohwA/rcs9wAAB3J5XbRQKv/Iokgw+hiM9xgABIC0AlhRBMJYCI +QCWCH0CpzPcKIcAP63LPcAAAeCeb2xUCr/yKJIMPz3GAAATFpgtgC6hyAI+EKB8ANCFBLs9wgAAw +CyCwIPAcEgQBjCQIgMz3CiHAD+tyz3AAAIsnpNvVAa/8iiUIAIQrHwAAIYB/gABIyE4I4A2Icc9w +gAAoxSAYAAQA2TPwABYCQIQrHwAAIYB/gACYyzDgNXhAoAAWAkEAIYB/gAAYzDDgNHhAsAAWgEAA +IY1/gAA4ylJpVHq6YhCqEaoSqgAWgEAUqhWqFqoAFgBBACGCf4AAVMw1ehqyABYAQQHhG7Jgj4Qr +HwAAIYB/gABMxUOIUHGMB+X/L3UAJYEfgADIywAlgh+AAEjMLgqAB+YO7/0U2KYLoAQE2ECPAciE +Kh8AACGBf4AACM0Aoc9wgABoCwHZIKDPcIAAbAsAGAAEyg2v+wDAzgyAAoDgTAuCDgMSATfPc4AA +aAtgg4DYKHJiCmAOSiRAAB3wBIUB4ASlz3CgANQDHJDKDQABAMCODa/7AtkDEgE3z3OAAGgLYIOA +2ChyLgpgDkokgACOCaAKAtjhBG/7ocDxwAohwA/rcs9wAAAwJYojjAeKJIMPcQCv/EolAADgePHA +4cUg289xoADIHGmhABYAQM9yoAAQFAyiABYFQAHdTCUAgMohwQ/KIsEHyiCBDwAALCXKI4EPAAAJ +ASgAofzKJEEDGBpAAWgZQAED2A+iuaFqoTIIgACBBE/78cDhxa3Bi3WpcMoOoA0N2QDAHXhTIAEA +RCk+DalwACGBf4AAiNVWCmALDdr+D0AATQRv+63A4HhRBWAOANjgePHAxgtv+wzZrMGKDqANi3AA +FAAxgOAw9M91gABkQSCFz3aAAOBEYHkA2IzgQCSPMBDyIIVgeQDYkOAM8iCFYHkA2JHgBvIghWB5 +ANiS4Ab06XDJcRjaBfDpcMlxLtoKCUALAdhgHgIQF4aA4NgMofvKICEAABQAMYHgE/RAJIAwz3WA +AOBEQCWBG94IYAsu2gHYN4VhHQIQgeGsDIH7Tg9AAI0Db/uswPHAEgtv+xfZt8HiDaANi3AjwEoi +QCBTINAAhiD+A0wgAKRCKBEBDBwCNI/2CiHAD+tyctiNuIojDwMKJIAE5QZv/AolAARIFAUwIMBA +KI4gz3WAABDX1n5RIACAwGVBLU8DwL++ZoYg9w9e9IDgDfQKIcAP63Jz2I24iiPPBKUGb/wKJAAE +iiBPBQpxlgvgBKhyAcACwQpy8g1v+2ZugOA98ulwmgwgDgpxDRSAMIUgwQANHAIwiiD/D1PAAIap +uACmEsCGIPsPKLgPrkokAHQA2KggAAP/2rtgQCiBIDZ5EuM7Y0CrAeAKcJYLIA6Lcc9wgACkNfAg +wQPAEQAGDyAABMAZGAAPjoHgB/SA58wgoqOADkIOAd8C8ALfig4gAgpwB/CA4MongRTKJyISgefD +9CCGz3CAAKQ1A4AYiCh1geCGJfsfEvK+CYACgOAghhnyz3CAAOw4CIiH4BP0QSlAA1EgAIAP8hPA +6LgSwgvyhiL7D0EqBAJPjpByA/KouFPAE8ASwgZ5RHgleIDlAKaGIPsPCvKA4MogAQTKISEAqA9h +A8oi4QMOHkIUANjPcYAAUNoWIQEEQIYAofW6AaEE9ADYi7gBofa6BvIBgUUgAAYBoe4Jr/yLcA0U +gDBRIECBIvJYFAAxBbZaFAAxBrYFloDgGPJOCYACgOAP8gaWUSBAgAjyggxv/ApwGg5ADgXYEq4A +2AW2BvAKcADZLg9gAw/aDRSAMFEgQIAZ8lAUADGA4AK2FfIA3RDYOnAClhEgQIPKIAIEyiFCA/wO +YgPKIkIDQiFAIIDgAeUw9w0UgDBRIACBB/IKcN4P4ABVFIEwDRSAMFEgwIAc8jXBVhQCMQpw4g/v +/BLDjCACgLhwDPQKIcAP63J02I24iiOSD4EEb/xKJEAAUSXAgconIhEmDCAOCnADzNdwAAAAQAHY +wiAKABe4x3AADgAAg7iduJ+47HEAoQESATbscCCgqgxgAOlwiQBv+7fA4HjxwB4Ib/uKIFMJpMEA +3alxJgngBKlyz3aAANDeAI5KJEAgoa4CHgIVAeAArqOuoaaipqSmpaa4rrmuAcC6rgLBB6YDwCim +CaaBwLYKoA0B2QHAB6Z6dYvwgsCmCqANAtkBjgPBAd/jrgHgAa4CwCmmCKb+D2/7i3IEIAAFLyQH +oALZI64CrgDBIaZv8hJpFnjPcoAAENcAYkohACAPIVEgLbhTIBAAiiBUBY4I4AQKcs9xgAC0CkCB +LyJKJPiuEB5AFAQigKAUHgAUAKED2SOuQqYDpgf0gOIF8s4NYAQg2PmuBdgDriDAcg7gABDZAMAy +aDZ5ACGCD4AAENeKIQgAorIgogbZI64A2VYNYAMP2gDCgNkSahZ4x3CAABDXKKgpqAfYA67PcIAA +pDXwIAAEz3OAAFDaVnvAEAEGBCGBBMAYWAAA2SCjz3CAAHDWIaNUeB4MYA6gsIDgB/KiC0AOCNgD +rvquQCNTICHAcnDsBs3/CdgDrgPM13AAAABAAdjCIAoAF7jHcAAOAACDuJ24n7jscQChARIBNuxw +IKAuC2AAinAK2AOuyQYv+6TA4HjxwIogVQsA2X4PoAQocu4IQAuWCkAA0cDgfuB48cDhxQAWDUAD +zAHa13AAAABAAcjCIooAF7rHcgAOAADyCWALUyUBEFElQJDPcYAAJFAB2MogIQClBi/7AKHgePHA +ocGLcO4IoA0B2QAUBTBMJQCAC/QKIcAP63KJ2I24RdsJAm/8SiRAAM9xgADwwQMZQgFALYADAqFK +JMBwANqoIEACANgPIIAACyBAgQT0AeIE8A64AaHyCUAAocDRwOB+4HjxwIoJQAfPcIAApDUsEIQA +TCQAgQn0yRAABlEgQIEF8mIMwAEQ8EwkQIAM8s9wgADsOAgQhQBMJcCBzCViggb0XgiP+9HA4H4K +IcAP63LPcAAA7BxxAW/8X9vgePHATg0P+wAWEkEAFgBBz3GAABDXQCqAIBZ4MCEFAKLBTCIApEEt +QANTIBMAjvcKIcAP63J12I24iiMYAkokQAApAW/8SiUAAFElQIIM8gohwA/rcnbYjbiKI1gCDQFv +/AokgATPcIAAUNkWIIAEGnDCD2ANAtnPcIAA8NUWIIAEsg9gDQLZQCqVIQAlgC+AANDaog9gDRDZ +i3CaD2ANAdkAJYAvgADQ2moPoAYQ2QEQgCCQ4I72CiHAD+tyd9iNuIojmApKJEAAoQBv/AolgAQA +3RDYOnAVJUAjz3GAANDaMCEUAAQkgq8AAAABBBwANU3yRCQOJiO+AeYEJIAvBgAAADG4IcHfYKDh +0SThojrygOIE8oHmC/cEJIQvAAAAJAwkgI8AAAAkLPKC4FQADQCC4Ab0gOIm8oLmJPSA4gXyzOFA +AAkAz3CAAGxBIIBgeQbYEHYW989wgACkNfAgwATDEAAGAdkEIL6PAAYAAAQkgC8AAAAIwiFBACu4 +EHFE9wDYA/AB2A94A/AB3+lwBCSBLwEAAMAuuc9ygAA0ciliMHcB2cIhTQCA4MwhIoAY8kIhQCCA +4CAH7f8B5QIQgCDPcYAAEGYIYYHgHPIKIcAP63J52I24iiMZADLxCiHAD89wgACkNfAgwATrcooj +WA/DEAQGeNiNuHEHL/wKJQAFAxCAIAhhguAJ8gohwA/rcnrYjbiKI5kCEvEGD+ANSnDPcIAA8NUW +IIAEIJDPcgAAGBUJIYEAVg8gACCwYQMv+6LA4HjxwAAWgUDPcIAA1FogqAAWhEAAFoFAz3CAAN1a +IKgAFoBAUCS+gcohwg/KIsIHyiCCDwAA2hTKI4IPAACBB+gGIvzKJSIAz3CAABAKAJCA4AXyag6A +DY4NgA3uDgAA0cDgfuB4VQFgDQDY4HjxwLoKL/sA2UokAHLgeKgggAIAFgJAFSJAMA4YmAAB4QAW +DUAAFg5AIg5ADc9woAAUBKygz3CgANQL3KCeDgAA5QIP+/HAbgov+wjZosEBEg42z3WgADguHBUQ +EOoMYA2LcAAUBDAA3wQkvo/w/wAAyiHCD8oiwgfKIIIPAACmKMojgg8AAOEGMAYi/MolwgBRJECC +yiHCD8oiwgfKIIIPAACnKMojgg8AAOQGDAYi/MolwgDnpVoJYA4/2ADABBQBMQelZgtgDYK5HB0A +FA4OIAABGpgzQQIv+6LA8cAA2GoNIAAEEoEwBBKFMAohwA/rcjjYiiMPAcEFL/xKJAAA8cDhxc91 +gACEQalwgCAHDzYMYA0E2YoJQAKA4Afyz3CAAOw4CIiJ4A7yCiHAD+tyz3AAANQbfttKJAAAfQUv +/AolAAHPcIAApDUhgMQRAAZRIECByiHBD8oggQ8AANYbyiOBDwAAfwDKIsEH5vP+FQAXgODD9o7g +yfYKIcAP63LPcAAA1xuA29jxyBEABoYgf44F9GIIQAAP8ACFkrgApQvIrrivuAsaGDALyIe4CxoY +ME4ND/smDQAAdQEP++B48cD2CA/7z3aAAIRBAIbPdYAAgEJRIECCBfJqCUACgOAj8gDYCK0B2Amt +VSbAGJYLYA0L2VUmwBhWJsEVLg/gCgvaCI3Pd4AAEEJEKD4LBm8yIEAOgeAB2MIgAQAKrQCGibgA +phTwCI0pjTBwBfROIEEAL3kprc93gAAQQlUmwBhEKT4LJ3A+C2ANC9lpjQNvRCs+CzIgQA6K4Moh +yQ/KIIkPAADRG8ojiQ8AAGoBqgApAMoiyQeC4Mohyw/KIIsPAADSG8ojiw8AAGwBigArAMoiyweB +4AHZ0/ZCIEQACiQAcShwqCBAA0QrPgsAJ0EeFXlGiSKJMHIn8gHgD3jiDwACgOAd8s9wgADsOAiI +ieAH8ojgFfQAhlEgAIIR9DYIj/yC4AXyLgiP/IHgCfTPcIAAjFkGgAOAAICGDg/93gsAAB0AD/sK +IcAP63LPcAAA0xuKI0UMSiQAAKEDL/wKJQAB4HhRAuAFAdjgeJEAIAkB2OB48cAOCGAC4cWA4M91 +gACEQQ70BBUEEAohwA/rcs9wAAC+G4ojBgRhAy/8uHMAhYi4AKVVJUAeGgpgDQXZ9xWBEM9woADI +HBqACrnKuBV4OGCZIAoARB0YEM9wgADsOAiIh+Al9M9wgACkNQCAxBAABlEgQIEb8uwVABHPcYAA +eN8lgQq4MHDKIcIPyiLCB8oggg8AAMQbyiOCDwAAngHKJCIA5AIi/MolwgD+C0AK8gsgDALYPg7P ++woKYAsA2D4NgALmCgAANQfP+uB4DQEgCQHY4HhFBSANAdjgeCkAIA4B2OB48cChwQDZQMEAFgJA +ABYAQIHiGvIDzNdwAAAAQAHYwiAKABe4x3AADgAARSAAA524n7jscgCiARICNuxwQKDscCCgH/Dy +DSAGi3ADzAHZ13AAAABAAdjCIAoAF7jHcAAOAACEuJ24n7jscgCiARICNuxwQKDscCCgAMLscECg +igogAChwocDRwOB+4HjxwBIO7/oC2c93gADsWoIJYA3pcECHz3agAOwnz3WAAGxB4LpL8iuGRCKA +AIYi/w4iuqG5FLq0uQUggwBleSumBCCADxAAAgAEIoIPEAACAM9xgAAsCUV4C6EghQTeYHnJcIfg +C/IghWB5yXCG4AfyIIVgeQHYgeAR9ACHz3GgAMgcUSBAgAfyAdgeocIOQAYF8ADYHqFiDAAGIIVg +eQHYheA19ACHUSDAgDHyz3CgAEQdxaDDoMSgKfDPcKAAyBwB2T6gC4aBuAumhg5ABiCFYHkB2IXg +E/TPcIAApDUDgAiAUSAAgAvyANmUuc9wgAAsCSugC4aUuAjwz3CAACwJANkroAuGtLgLpi4JAABt +Bc/64HjxwM9wgABMH3IIYA0C2RYJAADRwOB+4HjxwOoM7/oA2gh1KHbPcKAA1As4gEIhAQiA4coh +jABAJgASEHHsDcUNA8zXcAAAAEAB2MIgCgAXuAAggQ8ADgAAB24EIIAPAAD8/yV4nbifuOxxAKEB +EgE27HAgoCK+BvDscQChBOVhvoHmAIU69+IIAADlBM/64HjxwOHFz3KgANQLA92xogDbcKIDEgI3 +13IAAABAAdrCIooAF7rHcgAOAABFIgIGnbqfuuxzQKMC2hQagjAFEgM27HJgogsSAjcB4gsanDDs +cgCiARICNuxwQKDscCCgz3CgALAfAdk5oM9xgAD8MwiBQIDscECgDIEAgF4IAADPcaAAyDsOgYi4 +DqFdBM/64HgDzNdwAAAAQAHYwiAKABe4x3AADgAATyCBAJ25n7nscCCgz3CgABQEA9kloAESAjbP +cKAA1AtNoM9woABEHTWg4H7geAPaz3GgABQERaHPcaAA1AsNoc9woABEHVWg4H4D2s9xoAAUBEWh +z3GgANQLDaHgfgPaz3GgABQERaHPcaAA/AsMqc9woABEHVWg4H4A2Za5z3CgAKwvPKDgfuB44H7g +eOB+4HjgfuB44H7geOB+4HjgfuB44H7geM9zoACoIDGDz3KAACA8A4I4YAOiAdgSo+B+4HjxwAIL +7/q4cc9wgAAoqGgQBABKIAAgTCSAgMoixgfKIIYPAACRDMojhg8AALcH3Abm+8ohxg/PcIAAGAoH +gIQsCAkAIYF/gABIpEwlAIAWeceBPvTPcIAAqDySDW/8iiEPD89wgAA8PIINb/wg2c9wpQAIDKCA +UyVNkBPygeUT8oLlFPIKIcAP63LPcAAAkgyKI58HmHV1Bu/7CiUABP/YBvD/2Ai4BPD/2BC4z3GA +ACwJDKGtoc6hANmRuc9woADQGzGgVglgDAHYH/DPc4AALAkOg4DgG/TPcYAAbGfPcoAAqDzPdYAA +IDyKJMN/CnCoIMACD2EVJcMT54PwIg4AAeD+ZsejYQLP+jgTBAAKIcAP63LPcAAAkwyKIx8M7QXv ++wolAATgeOHF4cbPcKAAFAQD2SOgDcjPcoAAEMNhks9xgAAAwsSKFCENAGi1ACCDD4AAIMI44cCr +YoIVeQaSYKEDEgM2wB0EEASCoBMBAIYhww8leKAbAADBxuB/wcXxwIoJz/oIdmYJIAIodYDg0SVi +kwHYA/QA2AS4z3WAAJjfFHgJZYHhHWUK9KoLIAypcMILb/0BjQDYAK0BhbkB7/oApvHA6g7ACBoN +YAsA2M9wgADsOAgQhABMJMCBE/JMJACCFfJMJECCGvIKIcAP63LPcAAAyhu72xEF7/tKJQAAigtP +/M4NwA3RwOB+z3CAAIRBAIBRIACCBfQSCc/79fFOCU/8pgtP/AvIrrivuAsaGDALyIe4CxoYMBIN +z/rl8eB48cDGCM/6z3GAAOw4DJHPdYAApDXelQ4mDpDPcIAAZEMOkMomYhAMsQHYVg4gAADZegtg +CAHY6ghP/IHgGPQAhcQQAAZRIECBA/KA5hDyAdgIcToO7/wIcgvIkLgLGhgwC8gFIIAPAAAA1Anw +C8iuuK+4CxoYMAvIh7gLGhgwjgzP+rEAz/rgePHAMgjP+qLBDRICNs9zoAC8Lc9wgACkNU6jJIAA +3UYREQENEhA3ViEGBUYgwCADEg42DRocMKQWABCEuKQeABABllYhiASA4FYhRwSGHkQTCPLPcIAA +AMP0IIAAgOAJ8gGG7rgF9FAgACAvIAggUyB+oFQDAQDPcIAAJFBpEAAGz3GAACRQAeBpGRgABBIB +NqQZQAMBloDgRfLPcIAAAMJUeIAQDweA5z300BADAVMjw4AV9HIWAxHglmJ/uBaDEGJ/8H/gGMQD +pBYDEIYj848F8mi/8H/gGMQDcBYPEeAQAAFhluJ48XDCJw4QwiPOA3QWABEbY7gWgBB0GUQDoLF4 +YBB4kBkEAL4ZBAAQjgDbEKkBhgGhCI4IqRKOEqmWuzDwD4P3uP/zb4P2u1MjwAIo8o7gTvfPcIAA +JFCnEAAGtrvPdoAAJFAB4KceGBAa8GS4EHiQGQQABCOADwAAAPAsuBCpdBlEA6CxobG+GUQDAYao +qYYg/w2EuAGhEo4Sqfa7RAIBAADY9buWuKQZAAAS8pILr/4A2AQSATakEQAABCCDDwIAAAAtuwUj +AgQvIIggP/ABgVEgAIFR8nCJT3pJIsAAz3KAABDX8mv2f+Ji9rrSiQfyz3KAAFDZdnpBigLwANrH +cIAAUNl2eASICCYOEAgmghBJIsIDFmtVeM9ygADQ2gBiz3KAAFDadnrPc4AApDVkg3iDQYJlegQi +gg8AAAAIRniYGQAAANiWuPS4QYGGIv8NIPKA4lPymBGCAEAnAAlIYM9zgABQqkDAIMLDulx69COC +AFXwCiHAD+tyNNiMuF/bBbuKJIMP0QHv+0olAACYEQMA6bucGUADJPKA4oC4pBkAACvymBGAAM9y +gACkNUOChiD/A0S4MiYAAIm4QMAgw1SCZHqGI/8DhiL/DkS7emJPes9zgACMZvQjggAh8FEjAIIJ +8oDiCfKYEYIAQCcACUhgDPCA4gT0ANpIcBHwmBGAAMO4HHgyIAAQQMAgws9zgAD4qcO6XHr0I4IA +iBkAAJgRAACEGYQAkBEBAb4IIAAA2gQSAzYDEg02z3agAMgfhBMCAYIbBAAaYlB6sBuEAPgWARCw +FQARIngAIE8Ez3CAAKQ1BIBUEAEBP2dfZ6AWDhDwf9F3OgANABCAmBUOEAsggIMX9HCLEI1wcNEm +IpIa8oYm/xlBLsMQAeOB49L3ArgWeM9zgAAQ1wBj8bgK8s9xgAAkULgRAAYB4LgZGAAQ8FlhMHmG +HUQQz3GAACRQahEABg0aHDQB4GoZGADNBK/6osDgeKHB8cBiDI/6CHVGwOi9KHDQACEASHYDuEAg +kAVEJQIWI7oEJY8fBgAAAAHiQS9AFAQlgR/AAAAAWGA2uc9ygAAAcqlzxrspYghiOGBBLYESUiEB +AMC5A7kY4YXgyiGNDwEAiQ3VIQ4ALyFIIAQlgR8AAAAYz3CAABxp13EAAAAIHgAiAPAgwAAmwaDh +EgABAM9xQnvQXgUofgAKIMAOCnEFKT4ACiDADoDnJLgB4AXyUyABADhg7b0CKYEjD/LPcoAAWGpA +kgUqPgAAIYB/AAD/Py64XQAgABlhWQAgABV5USVAklQAIQAmxbflIAALADNoUyUCEM9wgADUZvAg +gAAFKT4ACiDADgHgB/CK5cAo4QDAKKIAz3GAAKQ1I4HA2jSBpHmGIf8OIrk6etp6GWIweAjckwOP ++jNoUyXAEBx4z3KAAJxq8CIAABbhBSk+AAogwA4B4BTZgwfv/9p54HjPcYAA/DMkgUEoggXVuCCB +QSmDBdW5AnnPcIAAeN9iegWAyboFKL4AJ3HPcIAA2FkDgACA4H84YM9xgAD8MySBIIFBKIMF1bhB +KYIF1bkQcVtjSvfPcoAAeN9FgllhAnkB4wPwAnlAK4AFmQfv/yV48cAyDY/6lgqv+lDZRcBKIAAg +Zgpv/obFTCAApQQVARRO9wXA13Gt3u++FSAABCCgQCBQIPL1JNzHAo/6CiHAD+tyz3AAAIsTiiMH +C5hzVQav+wolAATgePHA4cWC4JhwuHHK9wohwA/rcn3Yjbg1Bq/78NvPcIAApDXwIAEBiiMLDUwl +AIBAIQIGeGIm9KiBemKgokmBQaBciUioXYlJqCoRggBKqCsRggBLqCwRggBMqE2RR7BXkUiwSIEE +IoIPAAYAAIDiAdrAelKoVJFTqCiBwLktqBzwTCVAgBr0YmJIoUGASaFIiFypSYhdqUqIKhmCAEuI +KxmCAEyILBmCAFOIVLFHkE2xCJAXsQkCj/oKIcAP63KQ2I24iQWv+4ojhAfgePHAegmP+s92gACE +QVUWARZWFgIWMHKkwUj3iBYAEAIhgwB4YIgeABCA4Q7ygOIM9FcWABY4YFceGBBYFgAWOGBYHhgQ +z3eAAMgJAIeA4ADdA/JYHlgTWBYAFkPCQMBXFgAWQsEQ2b7aQcCLcB7bagugCRi7Vh5YE1UeWBOg +p2UBr/qkwPHA9giP+s91gACImgQVBRBCJUEAheE2AS0AosH1JkFwgAAYYEAnAHI0eAB4AtgApQHZ +z3CAALAzILCeCmAJKHAChc9zgAB0MyiDR4MIEwQADyBAAAKlz3CAAFQzNXhAoBgTBQEMEwYAz3CA +AIBKANk0qM9wAABUtUDABYMQEwcAQcAaizuLQIO+D2AKYYNc8M9wgACyMwHZIKjPcIAAdDMngM9w +gABUwS+gFgov/QLYSvAE2AClANjPd4AAsDMaCmAJALfPdoAAdDMChUiGZ4YPIIEAz3CAAFQzVXhg +oCKl7NgaCSAEQJcIFgQQz3AAAFS1GBYFEQwWBhBAwAWGEBYHEEHAGo47jkCGPg9gCmGGJBaAEEiG +ANlRIACBBIUPIYEACvIB289ygACASnSqBXkkpQTwJngEpRoO4AMA2ATwfgsP/BkAr/qiwAgVBBAK +IcAP63LPcAAAQh+hA6/7iiNEB+B48cDhxQHdz3CAAIiaoKAA2M9xgACwM14JYAkAsWoMIACpcOkH +T/rgePHA4cUA2M91gACImloIIAAApf4P7/wC2CKFz3KAALAzd9hOCCAEQJK5B0/68cA+D0/6AN7P +d4AAsDPAtw4JYAnJcM91gACImsKlw6XEpYogyQDJcRoIIARAlwHYdQdv+gCl4HjxwM9xgACImgAR +BQBMJUCBjPcKIcAP63LPcAAAQR+Z2+kCr/uKJIMPAaHPcIAAnDPwIEABQHjRwOB+4HjxwMoOT/rP +dYAAiJoEFQUQTCVAgKLBJfJMJYCAEPJMJUCBZ/IIFQQQCiHAD+tyz3AAAEQfmQKv+4ojRwbPcIAA +sjMB2SCoz3CAAHQzJ4DPcIAAVMEvoD4IL/0C2EvwBNgApQDZz3CAALAzILA+CGAJKHDPdoAAdDMC +hUiGZ4YPIIEAz3CAAFQzVXgipWCgQg/gA4oghgsIFgQQGBYFEc9wAABUtQwWBhBAwAWGEBYHEEHA +Go47jkCGYg1gCmGGJBaAEAHfSIYA2VEgAIEEhQ8hgQAJ8s9ygACASvSqBXkkpQPwJngEpUIM4AMA +2APwpgkP/EEGb/qiwPHA0g1P+s92gACImgQWBRBCJUEAhOHmAA0AMyZBcIAAJGBAJ4ByNHgAeAKG +z3GAAHQzSIEngQ8ggAACps9wgABUM1V4IKBZ8M9wgACyM4DZIKjPcIAAdDMngM9wgABUwS+gOg/v +/ALYR/AKlowgAoAR9ADYz3WAALAzOg8gCQC1IoaKIAUEUg7gA0CVAdgApjPwA9gApjHwA4aMIMOP +Ad8S9ADYz3WAALAzCg8gCQC1IoaKIEUK4KYeDuADQJXeCA/8G/AA2Q8hAQAChgYgQIAS9ADYz3WA +ALAz2g4gCQC1IoaKIIUM8g3gA0CVrggv/OCmA/ACpkUFT/oIFgQQCiHAD+tyz3AAAEMfzQCv+4oj +RgDgePHA4cXPdYAAiJoEFQUQQiVBAIXhkAANADMmQXCAACxgQCcAcjR4AHjPcIAAsjOA2SCoz3CA +AHQzJ4DPcIAAVMEvoEYO7/wC2CzwAoXPcYAAdDNIgSeBDyCAAAKlz3CAAFQzVXggoB7wA4WMIMOP +AdoI8gDZDyEBAAKFBiBAgA70z3CAALAzQLAWDiAJAdgD2PYP7/sApQbwAqUE8AHYAKWVBE/6CBUE +EAohwA/rcs9wAABFHw0Ar/uKI0gL8cDhxc91gACImgOl8gzv/wXYI4XPcoAAsDOg2OoM4ANAklkE +T/rgePHA0gtP+s9wgAAMqQiAz3WAAIiaAN8nuMC4E3jGuAHgCrUI2DpwAN4ChQ8mzhMLIICDLfIE +hQsggIMZ8sZ4BKXPcIAADKkIgA95geEP8s9ygACASjCKhiDDD4C4AeEveTCqz3GAAAypCKHPcIAA +VDMVINADABAAIIDg4iACAAKFANkAGEAgxngCpUIhQCCA4AHnlAft/+9/SpXPcIAAsDMgkIHizCEh +gAb0ANrPcIAAgEpUqAGFheAH8oHhA9jKICIBFgzP/20DT/rgeM9ygACImiKCANsPIwMAZnkios9x +gABUMwDaFXngf0Chz3OAAIiaQoMPIkIAQqPPcoAAVDM1euB/AKLgePHA1gpv+hlxCHWIds9xgAB0 +MxqpGxkCAkChEBnAAQwZgAHCoQPAGBlEAQTGB6EmwMihJBkCAAfAYaEFoVPYqXGWC+ADyXImwFEg +AIAI8lfYqXGGC+ADyXIG2AbwgeUC2MogYgBqC8//2QJP+vHAYgpP+hpwz3aAAPQzAIYB4IHgz3eg +AMgfAKYG9AHYUR8YkKIJQA2kFwAQz3CAABhEJoDPdYAAyLNgeQDYAYWA4CryJNgY2Z4JYA0z2oHg +DvIEFQUQCiHAD+tyz3AAAHQZwNsFBm/7CiQABCTYAdl2CWANM9qB4A7yBBUFEAohwA/rcs9wAACr +KMXb3QVv+wokAAQAhkIgQIAApgT0ANhRHxiQIQJP+vHAwglP+s9wgAAYRASAgOAk8s91gAAUTTKF +5OHJ9s92gAAAWwCG2uDKICsBi/ba4VT2z3aAAABbAIbk4M72iiA/D8oKAA0ghkgVABEQuQ4P7/8l +eBKFAKbVAU/64H7geOB+4HjPcIAAMExAiOC6CPLPcaAArC8ZgYq4GaFRIkCAB/LPcaAArC8ZgY64 +GaHgfs9xoADIOx2BgOAI8oLYFKHPcACAERQOoeB+4HjPcIAA3MNsiM9xgADomowjAoAKkUEoAgMM +8uu4CvQCu3Z7x3OAABDXApMPIIAAArMA2OB/DLHgePHA2ghv+lRohiL4A08iQwJTIcIABSLEAM9y +gABw1hR6j+GKIw8MyiApAAn2AJIA3Q8lTRCKI88PpngAsgDZSiQAdM92gADAnc9ygAA4ns91gAA8 +nqggwAQUIkAA5JBkf5B3DPQA3+SwFiZAEOCg4aBAJQAZNXjgoAHhyQBP+uB48cAA2p66ANnPcKAA +/ERBoOB4IaA2CKAJKHALyAQggA/+//8DCxoYMAvIh7gLGhgw0cDgfvHAKghP+kh2gOAB3UT2iiX/ +HxN4gOFE9rN9M3kUIQAAwglv+jt5rHgAHkAeaQBv+gHY4HjxwOHFCHIB3YDhyiHBD8oiwQfKIIEP +AACbE8ojgQ8AAFwAyiQhANADYfvKJQEBgOJE9lN6iiX/H4DhRPYzebN9FCGAAGoJb/o7eax4HQBv ++i9w4HjxwOHFz3WAAOiaz3CAAKQ1I4BAhQCBEHIf9AKRQpUQchv0AoWWCm/7I4WMIAKAFfLPcoAA +sAohggDbDyMDAAK4ZnkWeCGiACCBD4AAENcAgaq4iLgAoQDYvQcv+gy14HjxwOHFz3AAAP//z3WA +AASbA6XPcIAAzFdmDAALz3CAAOhXXgwAC89wgACQWFIMAAvPcIAArFhKDAALANkgpQXYAaUipZ4P +r/wG2JoPr/wJ2GUHD/oH2c9yoADUBxoaWICA4A7yGRIBhgkgQwAPEgGGAiDAgHlhDxpYgPb14H7g +ePHAvg4P+gMSAzYIdw0SDjbPcYAAAMIQi89ygAAQ19R5ArgWeAViMYktvYDhWGDAvQvyIYPtuQny +z3GAANQ0tHmgkRDloLElkIDh0fZhuSWwEIsyaDZ5O2Jlk4DjOmIH9CaSUSFAgMAJQvuGDEAMcg1g +Bg3IA8gB2aAYQADPcQ8A//++CCAA6XCdBg/68cAyDi/6A9nPcqAA1AcTGliADxIDhgAWAEAAFgBA +osFAwCDAnOAP8gohwA/rcjXYjLjPcwAA9AyYc/0Bb/tKJQAAABYNQLB9ABYAQEDl9LjAJaIQA+UE +JY0fAAD8/xkSDoZCJQ8U0Xc797tjDxrYgCAaWIAZEgGGiOGU9x8SAYZBwSHBnOHKIcIPyiLCB8og +og3KI4IPAAARDc8gIgPO9QQggA8AAABA8QUv+qLA4HjxwHoNL/rI2oIkAzIIdSh2z3GAAGxiMg4v ++otwAdrPcKAAFAREoM9ygAAcURiCANkB4OK9GKLKIEIgBfQWD8//GnANyM9xoABkLs9yoAA4LvAh +AAAngtO4JHgEIJEDr/DyDs//z3aAAAjmGnDJcMIKIASLcUoNYA3JcKHwA9/PcKAAFATwoOSgABYE +QAcaGDEAFgVAARpYMQTKnOAe9Itwrg9gDA7ZJMHhvlMhwACGIf4DRLnEHEIwZMBEJo0UGfKO2FEm +AJGQuKAcADBu8obYkLigHAAwavDrcs9wAADcDs9zAAD0CqEAb/sKIcAPTCAAoAfyjNiQuKAcADBW +8AK4FnjHcIAAENdAgEh0hCQMkA3yUSJAggjyi9iQuKAcADAB3UTwiNiQuPrxTohQccoggg8AAJEA +zyAiBPL1AcH6uQfyAd2Q2JC4oBwAMC7wIpAzFIAwESEAgBTyB8gEIIAPAMAAANdwAMAAAAz0IsCA +4MogiQ8AAI0ApAfp/88gKQQKwYwh/48S8s9woAAsIBCAInjXcACAAADKIIUPAACHAHwH5f/PICUE +TCAAoMwlIZBY9c9woAAUBOOgTCAAoKl2XvVTJn6QCPLPcKAAFAQJgIDgVvXhvjTyTCEAoAHaK/Iq +cS8oQQBOIIMHlOPKJcUQhPdodYAlwhTPcKAAaCzwIEADlOMPeMonxRCF92h3gCfCEc91oAAYLPAl +zROxcMoiIgCA4gnyANgPIMAABiEBgNn1AdgC8ADYgOAi850DL/qAJAMy8cA6Cw/6GnAyCSACMNiY +cCm4USAAgMohwg/KIsIHyiCCDwAA6RTKI4IPAADHABQHIvvKJSIALNhGCSACQCiBIAHeiiUPGvYI +IAIw2JhwKbhRIACAC/KMJg+aJ/JCCiANAdhhvYDlAeYv99IIIAI02E8gAQWVuQoJIAI02L4IIAIs +2Ah1tgggAjTY9bi4cBjyCiHAD+tyz3AAAOsU49ulBi/7SiQAAAohwA/rcs9wAADqFNTbjQYv+0ol +AADhAi/6QS0AFPHAdgoP+gh3AN7JcDYO4ATJcQPYyXWA5xpwCvJELT4XACGAf4AAmFaSD8AKgOcK +8kQtPhcAIYB/gABAV34PwApCIEAggOAB5Sf3z3CAAMCoyXSdsDC8nrDPcIAAcAuWCWAGwKB1Ag/6 +8cD6CUABgOAQ8s9wgACEQQCAUSCAggryz3CAABxZNg/ACt4OoAoA2NHA4H7xwDIIb/3hxc9zgAAk +UM9xgAB8WkCB9BMNAFB1ANiK9/gTAQAwcgb3/BMBADByw/cB2C0CD/rgePHAz3CAAMAJABAEAAES +BTYKIcAP63LPcAAA2w6VBS/7j9vgePHAcglAAYDgMPLPcIAAhEEAgFEggIIq8s9wgACAQmiISohE +Kz4LACGAf4AAEEJVeAaIgeAA2Rr0z3KAABxZBoIDgGCAAoJieIDgyiBLAAXZCrkwcEr2BoIDgCCA +x3EAAAAU3g7gCkhw0cDgfvHAHgkP+q7Bz3agANQHA90THliTDxYPlhkWAJbA4L73ABYAQAAWAEAP +eJzgyiHCD8oiwgfKIIIPAABAAM8gIgPKI4IPAACYDMokwgDUBCL7yiUiAItwlgtgDA7ZBhQBMQAU +ADFRIQCBwCCiAAPgC8MEIIAPAAD8/4DjViABAg7yz3KfALj/eqIsw3uiAsN+os9zAGwEAHmiGRYC +llBwPvc/Zw8e2JMgHliTAcAEIIAPAAAAQNEAL/quwOB48cBWCA/6CHbPcKAAZC7wII0D070NEhA2 +DRqYM/XYBbiCDuAByXENyM9xoAAUBADfCqEqCuAIyXBacAHYz3EAABAnz3KgAMgfPqIQ2S6iFRoY +gEwiAKBKIQAgDyGRI9D3CyBAxAT0USMAwPzzCyBAxAby1g7v/wHnUne09wsgQMQX9FEjAMAk8hPw +LyhBA04ggQcA2A8gQABALj6VBn0A2AT0QCk+gwPyAdhGDsABgOXt9QohwA/rclfYjLiKI58BSiQA +AKEDL/sKJQABDRoYNPXYBbjODeABCnENyM9xoAAUBAqhzQfP+fHAbg/P+c9woABULiuAB93TuS8o +QQBOII8Hz3CgAMAvpRAShhQQEYbPdqAAFASqptIJ4AiA2PPYBbiA2X4N4AGfuQ0SEDb12AW4cg3g +AalxqqYNGlgzBPAD2AWmqYaA5RvygOX680EtgJAK8i8kCXDgeKgggAEAFgBA4HhTJU2QCfIvJElz +4HioIEABABaAQOB4qYbn8fPY3gzgAQW4/7jh9fXYBbgWDeABCnEoHgAUlOcNGhg0yiHFA4X36XGA +IcIBz3CgABgs8CBCAJTnyiHFA4X36XGAIcIEz3CgAGgsNXgEv0Cgx3eAAMzTFYc2hwV5F4e4hyV4 +BSUNkMohwg/KIsIHyiCCDwAAwiHKI4IPAACNB8okQgNkAiL7yiUiAIDZz3CgANAbMKDPcKAAwC+l +GJiEFBhYhJEGz/nxwCoOz/mkEQAAKHVRIACACtjKICEEmBUBEAQhvo8BAADAdh0EEDD06LkW8kQh +AAYjuEFoBCGADwYAAAAxuFhgBCGCDwYAAAHXcgIAAAHKIKEAA/AB2IHgD/KC4Ajyg+AA2Mog4QHA +KKEDC/DPcIAA8MECgAXwz3CAAPDBAYAFeZgdQBCeFQARlB1AEJIdBBCCFQARkBUREbIdBBAA2IAd +BBB+HQQQA8jPdqAA1AdBkIDiEBWSEAryDcjPcYAAAMP0IQAAgOAT8hkWAJa44E/3DczPcYAAHFFG +IIACDRocMBqBAeCXAiAAGqEPFhSWgOIJ8g3Iz3GAAADD9CEAAIDgA/IB2AXwA9gTHhiQANgHEg82 +ARIQNgAWBEB6cAcaGDEAFgVAARpYMQTKnODKIsIHyiCCDwAA3A7KI4IPAAD0CgABIvvKIcIPqXDC +DyAMDtlMI0CgD/QEyAGQgOAh8s9xgACQUhqBAeAaoRyBAeAcoRfwA8gBkIDgE/INyM9xgADQwvQh +AABTIMCAC/TPcYAAkFIagQHgGqEbgQHgG6EDEgE2AYHuuA3yVBEAAVMgwIAH9M9xgACQUhmBAeAZ +oQIVBRFMJQCAFPIBhe64yiHCD8oiwgfKIKILzyAiA8ojgg8AALUHXAAi+8okYgAAlbBwyiHMD8oi +zAfKIOwLzyAsA8ojjA8AALgHOAAs+8okbAAQjVMgwQCGIP4DRLjEHQIQpBUAEPa4MK0i9AcSAjYC +IsEDgeEA2AfyAieBEIwhw48C9AHYgOAU9A3Mz3GAABxRRiCAAg0aHDAZgQHgGaEPHhiVBxrYMwEa +GDSJ8Aca2DMBGhg0ANh0HQQQ2glgAKlwz3GAAAhyC2F0FQIRz3GAABBy8CEAAHpiUHqkFQEQdB2E +ECV4pB0AEATIAZCA4BTyTCNAoA30AZW4FY8QWGAglfhgEHi+HQQQWWE/Zw3wvhUAEQrwIJW4FYAQ +WWE4YBB4vh0EEAh3kB0EEA8WAJa0HQQQWg2gBalwEI0yd8wggYQS8gohwA/rckApDSRAKA4EMNiM +uADbi7sFJcQTJQfv+gUmhRSkFQAQCHSEJBqQJfJRIECCHvIDyAGQgOAa8g3Iz3GAAADCFHmAEQAH +gOAS9NARAAFqFY8QAeDDuPhgD3hqHQIQAg3gAKlwah3CEwXw9gzgAKlwDx4YlQUDz/ngePHAsgrP ++RpwAN+kGcADz3CAAKQ1BIDQifCgB8gEIIAPAMAAANdwAMAAACh1FvQNyM9xgAAAwhR5EYmA4A70 +z3CAAPDV1ngiiAiNEHHG9gpwVg+v/alx4fBRIACghvIEFQQQUSQAgUDyDcjPcoAAAMIUehEShQAP +eEkgwgBybs9wgAAQ13Z7YGD2uDKNB/LPcIAAUNnWeAGIAvAA2MdygABQ2dZ6RIoIIYEACCEBAAAh +QAFJIMEDFm41eM9xgADQ2gBhz3KAAKQ1RILPcYAAUNrWeViCIYFFeQQhgQ8AAAAIJngD8AOFz3GA +AKQ1mB0AECSBKIEEIYEPAEAAAD65UyQCAB7hOHpFeP64mB0AEAvypBUAEIy4pB0AEFDYnB0AEHvw +/7gT8qQVABCNuKQdABDPcEABUACcHQAQz3CAAKQ1JIAQgZ64EKFn8AXYFLicHQAQz3CAAKQ1pB3A +EySAEIGeuJ+4EKFZ8FEgQKdH8gGFUSAAgTfyEo00EoEwSSHBAHJuz3KAABDXdntiYva6CPLPcoAA +UNnWekGKA/AA2sdxgABQ2dZ5JIkIIEAACCCAAEkgwQMWbjV4z3KAAKQ1RILPcYAA0NoBYc9wgABQ +2tZ4WIIBgEV4BCCADwAAAAgGeQLwI4WYHUAQDcjPcoAAOMIVeiCinB3AEwXwBdgUuJwdABBRIACl +B/IA2JG4pB0AEAPwpB3AE3QdxBO6DiAAqXDPcYAACHJ0FQIRCWFZYTB5dB1EEM9xgAAQcvAhAACk +FQEQJXiYFQEQUSFAgqQdABAK8grZdh1EEHgdRBCAuKQdABAW8BDZz3KAAKQ1dh1EEEOCSIJRIsCA +CPIK2XgdRBCDuKQdABAE8HgdRBBiCu/8qXCkFQAQRCB+gowVgRAZ8s9ygACkNUOCVIIkeoYh/wNE +uYYi/w46Ys9xgAC0ZvQhkQDPcYAAjGb0IZIADfDDuc9ygAAoqjx59CJRAM9ygAD4qfQiUgCYFQUQ +UyAEgMogggQW9IgVgRBRJQCCw7k8edEgIoUH8s9wgABQqvQgQAAG8M9wgAD4qfQgQAAhhVEhwIAF +8oQdBBAD8IQdxBNRJQCCDfJEJQIGI7oB4gQlgA8GAAAAMbgaYgLwAdoDyAGQgOAk8g3Iz3GAAADD +9CEAAIDgA/QBlbgVgxB0FQERBCW+jwEAAMB5YThgEHi+HQQQDvQKIcAP63Is2Iy4iiMaCTED7/qK +JIMPAJXn8YHiHfKC4swi4oDKIcIPyiLCB8ogYgvPICIDyiOCDwAAtQbKJCIAAAPi+solAgHPcIAA +UNnWeAOIBvDPcIAAUNnWeAKIjBUBEA64JXiMHQAQz3CAAOQJQIAGgqAQAAaA4Af0z3CAANxaAIiA +4FzyDRIDNobjWPIAla/gz3GAAJBSoAAMAM9wgAAAwnR4EYiA4Eb0TCQAgEL0USAAoDzynhUAEc9z +gAB8Uoq4nh0EEBaTAeAQeBazAcjnoQWhmBUBEK65r7mwuZgdQBAGgqAQAAYvKAEATiCCByO6DuIP +IYAApBUBEJgdABC0uaQdQBCeFQERp7meHUQQz3GAANBaAKEEIIAP///T9pgdABAN2JgdAhAK8BDY +B/AI2AXwAtgD8AHYB6GYFQAQvhUBEYoJL/8A2qQVARAEIb6PAAAAMIIdBBBT8owVAhCcFQARlB2A +EJIdBBDsuYAdhBQDEgM2C/IU2JAdBBAqcH4dBBB4Ew4BCfAO2JAdBBB+HcQTeBMOAUpwwngQeLId +BBDPcIAArMEAgIYgf48O9JgVDhBRJkCSCPRhk4DjBvSRuZK5pB1AEBC4JXikHQAQBCKCDwAAABDP +cYAApDVkgVIiAgMQgwV6UKNEgRCCBCCBDwAAABA9eSV4EKIT8JgVARCAHcQTlB1AEJ4VARF+HcQT +kh1EEL4VARGyHQQQkB1EEIAVABF+FQIRghUBERpihBUAEVlhOGAQeFEFr/mwHQQQ4HjxwPoMj/k+ +C8/8z3CAANzDDIjPcYAAENcCuBZ4AGEtuFMgAIAF9M91gAAkUA3wz3GAAKQ1IIHEEQEGz3WAACRQ +USFAgQT0AdncHUAQz3GAAKQ18CEAAM9ygACoWSCCGIiD4UYALQBBHRgQMyZBcIAAXGBAJ4ByNHgA +eJ4I4AoD2CoI4ApA2ADY4B0AEA3wz3OgAKggMYMCggDewqI4YOAdABAB2BKjwQSP+eB48cCYcLhx +FHg4YM9xgAD4ZQhhjCDDj8oiwQfKIIEPAACsE8ojgQ8AAIsBJADh+sohwQ/RwOB+4HjxwAfYz3Gg +ANQHGhkYgA4RAoYNGhgwz3CgAEgsXqAfEQCGBxqYMAEaGDAEypzgzCCCjwAAkQAG8gAWAEAAFgBA +A8zPcZ8AuP8YoX3YygwgAwESATYEytHA4H7gePHAuHECuc9ygAAQ1zZ5MCJEAFEkQILKIsIHyiCC +DwAAyyLKI4IPAACTA5AHovrKIcIPQC2BAc9ygADQ2iFiUSFAgooiCAXKImEDz3GAAFDZFiFBASKJ +DrlFeSCg0cDgfvHAWguP+c9ygAD8M0SCz3WAAASbYoVAgja7NrpQc9YijQ8AAIAAwIU9Yn5msXbO +9wohwA/rcoogjQKKIxAEmHYZB6/6uHUeZrF2//dYYHkDr/kOIIAD4HjPcIAA1AoggM9wgADYcuB/ +8CBAABR4OGDPcYAAoHLgfwhh4HjgfwHYz3CAAPRT4H8AgOB4z3GAAExP4H/wIQAA8cCYcAohwA/r +cgolwAfPcAAAnxmtBq/6O9vgeM9xgAAoT+B/8CEAAPHAmHAKIcAP63IKJcAHzdgFuIkGr/pE289x +gABgT+B/8CEAAPHAmHAKIcAP63IKJcAHz3AAAKEZYQav+k3b4HjPcIAAPFPgfwCY4HjPcYAAcFkG +gQOAz3OAAIRBQIACgUJ4SCACAPgTAQD2E4AAInjsEwEBYbgFKT4AQCmAcuB/WGDgeM9xgACMWQaB +A4BAgAKBQnjgf0ggAADgeM9xgABsCiSB4H8goBGI4H/CuOB4z3GAALhZRoGA4ooh/w8goAXyIoIg +oAHYAvAC2OB+4HjPcYAA2FlGgYDiiiH/DyCgBfIigiCgAdgC8ALY4H7geIoh/w8goM9zgADYWUaD +gOIS8iSCUSFAgAvyz3GAACBYMHIH8s9xgAA8WDByBvRAglBz8fUC2AXwIoIgoAHY4H7xwB4KwACA +4GwPIgrKICIA0cDgfvHAz3CAAIBCSIgqiEQqPgsAIYB/gAAQQjV4BoiB4Bj0zgnAAIDgFPLPcYAA +pDUAgcgQAAaGIH+OCvQBgcgQAAaGIH+O6AwhCsogIQDRwOB+8cD2CI/5gOBl8s92gACoqi+Oz3CA +AFDZz3WAAKQ1NngiiAOFAN/PcqAALCA0EBEBPBISAA6OgOCcACkAyiWpEIwiAaSQACUAyiUlEWSW +lOPAI4YPAACTAM9woABoLPAg0ADlolDYRSFBAhjaog3gDCDb+LjKJSISLvQD2M9xoAD0BwWhhNoN +cECwQiIAKA1yALJAhg1wQKBClg1wQLADhUCADXBAoAOFQpANcECwBpZAKAIlw7gMuIK4BXoNcECg +5KEOjgHgDq7eD+AKKnAB3RDwAN3PdoAAqKqCCmAIBJYA2M9xgAAcUQ6uHoEB4B6hYQCv+alw4Hjx +wAYIj/kacIQoCAkAIYF/gABIpIcRDQbPcIAAGAoCgKC9hxlYAwSIgOAR8gOBgOAN9AohwA/rcsnY +BLiKI5wOCiQABMkDr/q4dQKBgOAc9M9ygABErBMSAIaMIMOPC/LPcIAA/DMEgACAAqEcGhiEFfDP +cIAAGDwAGAAE1gogCgDYDfB6DM/+hCgIKQhxACGAf4AASKYqDUAK0QdP+eB48cBmD0/5g+DPdoAA +wKgacJP3HpY6FgURCiHAD+tyELgFJQUAz3AAAIMMiiOFD0EDr/oKJAAEQCgNId1lJZUElRC5JXiA +4Dnyz3CAAMRy8CABBEQoPicAIYB/gAD4Vi93IKAjlQKVELn2C+/+JXgIcQAngB+AAOxWpgxACs9w +gAC4cvAgAQQAJ4AfgABQVkeVIKAjlQKVELoQuSV4JpXqDS/7RXm6C8/+CHEAJ4AfgABEVm4MQApe +lh2WANkPIQEEELpFeAYgQIAB3R22MLgethn0z3GAAEhBAIGguAYOoAUAoc9wgAD8MwSAltoe2yCA +z3CAAACpoqAhoAzZygigCBi7ENrPcYAAcAsAgQAqAgRGeLkGb/kAofHAVg5P+QDdz3aAAMCoPpYP +JQ0QHZYQuSV4BiB+g0H0z3GAAEhBAIGAuAChz3CAABAKz3GAANA4AJBHiRByG/TPcIAAEgoAkEGJ +EHIT9M9wgAAUCgCIJokQcQ30C8gEIIAP/v//AwsaGDALyIe4CxoYMM9wgAD8MwSAz3GAAACpltoe +2wCAAKEA2AKhKHAM2R4IoAgYuwDYUgmgAIDZPpYdlhC5JXileB22MLgVBm/5HrbgePHA4cUeCqAA +KHWA4MogQQNUCWEEyiFhAP0FT/kxB8//8cB+DU/5xgqgCQDdz3CgANAbEYDvuAvyCgngCgHYz3GA +AJBSCYEB4AmhBshRIACAAxICNh7ypBIAAPK4GvLPcYAAWE4AgYDgFPKgoVEhgMX+889woADELAuA +UyCBBP64zCEigAbymBIAAKoI7/4A2gMSATagEQAA8LgK8oogCAAMGhwwBg8gBShwL/D0uCPyB8jQ +iQDaMxGPAAQggA8BAADwQSgNA89xoAA4LgeBDyJCAwHcRngHoQ3IHgygDAAsABDHd4AAENcCvtZ+ +EuffZ6CviiAQAAYaGDADyKAQgADE4DAKQQwD2c9woAAUBCOg9QRP+fHAigxP+c91gAC0nQGFz3OA +AFDaRCAEg89wgADcwwyI0mjWfsd2gAAQ10CGFnshgxPyUCKPBeCmTCQAgUYhAQYhowX0kb/gpgTw +sbq2ukCm8g8ADAbwlrpApkUhAQYhowuNoriNBG/5C63geOHF4cbPcIAA3MNMiIwiAoDPc4AAtJ0Y +8sqLz3CAAFDaMmo2ecdxgAAQ11Z4gOZAgaGABvKVukChq70F8LW6QKGLvaGgANgLq8HG4H/BxeB4 +ocHxwFEgAILhxagAIQAIdUQlAxYEJYIfBgAAACO7MboB43piBCWAH8AAAAA2uM9zgAAAckpjCGNY +YEEtghJSIgIAwLoDuhjiheDKIo0PAQCJDdUiDgBQcVIAJQAA2O29GAAhAAIhgADPcRxHx3EFKH4A +CiDADgPwIrhBLUETwLkEuTR5qXLGukkiwgVUeeu9z3KAALxoMmIF8kEqAQEUIYIABSo+AEEpAHII +3JsDT/kKIcAP63I72Iy4z3MAAFcSSiQAAA0Hb/oKJQAB8cACC0/5z3CAANzDDIiMIAKAK/IyaDZ5 +x3GAABDXoIHPc4AAUNrPd4AAtJ3klxZ7QYNQJY4Vhie7H8ChjCdEkEYiAgZBowX0kb7AoQvwsb2B +57a9oKEH9Ja9oKFFIgIGQaNaDgAMANnPcIAAtJ39Am/5K6j5AAAAz3GAAEw0CYGA4AvyB4GB4An0 +FokB4A94kOAWqQP0ANgWqeB+8cBmCk/5z3WAAAypCIXguKzBWvJRIMCBVvRaDa//AN4ODO/7GNiL +calw3g8gCSTaAdnPcKAAsB85oM9xgAD8MwiBAIDPd4AATDRJwAyBAIAw2UrABoeQ2h7bS8CLcGYM +YAgYu8G1yKXBpdytw6cKDCAAAtjPcIAAeN8KEAQBTCQAgAvyCiHAD+tyiiBfBmnb2QVv+rh2agng +CclwRocB2c9zgACMNACDgeLAeYDiOGAAowHYz3KAAIQ0IILAeDhgAKIE8A4IAAAFAm/5rMDgePHA +C8gFIIAPAQAA/AsaGDDODU/5Jgrv+wvYjgsgAADY0cDgfs9wgABMNOB/CIDgePHAAdjPcYAATDQD +oc9wgAD8MxCAAIAEoQKBgeAQDcH60cDgfvHAQglP+QAWAEDPcIAAjDgPgFEgQIEN9AohwA/rcoog +XwSQ24okww8dBW/6uHMAFgBAz3aAAAjgAKbkbulw0gugCw/ZVSZNFKlwigugCyKWFg1P/ggWBRBR +JQCEC/QKIcAP63KKIJ8EmNvdBG/6SiRAAM9xgACEWgCBQIZAoACBHNpAqM9wgACgCwOmGNgCoVUm +wBUFoeGhAYajoQShANhaHgQQAoatuMYNr/8CpoDgD/TPcIAAeN8FkIDgxPb+CAAABPCKCAAAXgig +CA3Y3QBP+eB42QbP//HAz3CAAARnz3GAAEw0/g0gCTjaOgigCADY0cDgfuB48cDaDs//ANmC4Mwg +YoDKIEIAA/QB2A940cDgfvHAz3CAAEw0IBAFAEwlwICL9wohwA/rcoogXwVW2xUEb/pKJIAAz3CA +ADxn8CBAAUB40cDgfuB48cD2Dw/5z3CAAPwzBIAA3pa+oIAEJY0fwP8AAN1lFOUAJY8fgAAAAMIM +r/6pcAhxz3CAACxVdg0ACrIMr/7YZQhxz3CAAEhVYg0ACp4Mr/7pcAhxz3CAABBVUg0ACs9wgABM +NPkHL/ngoOB48cCGDw/5z3CAAPwzBIAA3Za94IAEJ48fwP8AAL9nEOcAJ5AfgAAAAFYMr/7pcAhx +z3CAAGRVCg0gCr9nz3aAAHjfBZYlhgq4+WE2DK/+DiBAAAhxz3CAALxU5gwACiIMr/7pcAhxz3CA +AIBV0gwgCr9nBYYfZwWWCrgGDK/+DiDAAwhxz3CAANhUtgwgCgJ17guv/gpwCHHPcIAA1FWiDAAK +z3GAAEw0ABkABAWWJYYKuLlhyguv/g4gQAAIcc9wgAD0VHoMAAohBw/58cC+Dg/5z3aAAEw0oIYA +35a//WWeC6/+qXAIcc9wgADwVVIMIAr9ZYoLr/6pcAhxz3CAAJxVPgwACu0GL/mgpvHAfg4P+c9w +gABMNMCAAN+Wv/5mXguv/slwCHHPcIAADFYSDCAK/mbPdYAAeN8FlSWFCrjZYT4Lr/4OIEAAmHDP +cIAAhFTuCyAKiHEmC6/+yXCYcM9wgAC4VdoLIAqIcc9wgABMNMCgBYX+Zh5mBZUKuAILr/4OIIAD +CHHPcIAAoFSyCwAKYQYP+eB4z3KAAEw0KIIwcET3gOAD9Aii4H7xwOIND/lqDM//geAM8gohwA/r +coognwWh24okww/FAW/6uHPPdYAATDQjhYHhAoUP9IHgANkF8hSNgOAF8j4L7/8mpQzwI6UB2Aal +CPCA4Ab0Ad5+CmAIxqXCpc9wgAB43woQBAFMJACADPIKIcAP63KKIB8GwNtpAW/6SiUAAM0FD/nx +wKIJT/ngeOB44HjgeGkggAFvIT8AaSAAAPfx8cA6DQ/5GnDPdqAA0A8A3QfwEBYAlv1h+GAQHhiQ +I20ScXIADQAlFgOWJRYCli8kxwAlFgCWT38PfUwkAIMIvaV/6fWC58wn4pPMJyKXyiVCECH0z3WA +AEypSa0lFgKWCq1LrSUWApZorY/nTK2iaQj0z3CAAFmpLgtv+Q3ZDeWc5wn0z3CAAGapHgtv+Q3Z +DeUQFgCWAiBBIzhgEB4YkP0EL/kB2OB48cCaDA/5ocEIdSh2hOUA2Jj3i3DqCm/5BNkAwNdwmglQ +bwvyz3GgANQLD4FkvbhgD6EB2AbwqXAiD+//yXEPeMUEL/mhwOB4z3OAAEhBQIOA4UV4AKMa8s9x +gADQOM9wgAAQCgCQR4kQchv0z3CAABIKAJBBiRByE/TPcIAAFAoAiCaJEHEN9AvIBCCAD/7//wML +GhgwC8iHuAsaGDDgfvHAz3CAAGgLAICA4Aryz3GAAAhOC4EB4AuhIgjv+gLY0cDgfvHAz3OAANwJ +aHBGDCAABNkEaz4MIAAE2dHA4H4A2M9xgACUCgGp0QTgCwCp8cDhxVoIL/0x2LRoUggv/TPYBX0Y +vc9wgACgYIIIYAmQvSi4+QMv+aV44HjhxTJoNnnPcoAAENchYs9ygACkNS25wLnwIkMAKINRIQCA +z3GAAPDBQYEJ8jyLgOHFIoEPAAAKAgPyRSJCA0okAHQA26gggAI2aHV5ACGND4AA0NpApQHjAN3P +c4AAUNkWIwIAoKqhqgHZIqoD2SOqSiQAcalyqCDAAXliFnmkqQHi4H/BxeB44cVKJAB4ANioIAAI +ANvPdYAA3DNAhQ8jAwALIsCAD/JBhQsiwIBA2s8i4gfKIoEPAADQAM8i4QcC8ADaz3OAACQcFXtA +owHg4H/Bxc9wgABcWgaAA4AggM9wgADclymgUQNv/BHY4HjxwIoKL/kB2c9wgADwOySgiiDFD892 +oADIHxkeGJAocChyKHPKCiABmHEOC6/7AN9iDo/7z3WgANAP9aXPcKAAwC96EAGGibmLuXoYWIDP +cYAAgM0QGFiAvgoAAsYKj/4+DkAIQNnPcJ8AuP8yoLINQAuA2c9woAAUBCygHR1YkEIJQAr2D8AJ +Hg8gCulwB9hIHhiQ3g7ABlIIwAEqC0AAKglABOYOQAjuC8ADVgwACU4MQADuDsAH2g5P+xYNAAFq +DcAJigrP/sYJQAVyC0ABug3ABpIIAAYiCYAEeg4P/h4LAAUWCwAF3gjACM9wAAD+ypYOD/v9AQ/5 +4HjxwIoJD/mlwc93gACkNQOHCIDAuPoPYAovIAAgAN3PdqAAtEfPcKAAjES4oADYk7h3HhiQCNh3 +HhiQANieuFMeGJDgeFMeWJPPcIAAWAIQeEceGJDPcIAAcAUQeEgeGJBPIIAjRSAADU8gxgc02EQe +GJAc2EUeGJBGHliTz3CAAGxP1g6gBQyISiSAcM9xgACY36gggAPPcoAA8MEBgnRtdHs7YwOjAoIB +5QSjz3WAAHhaAIWA4ATyZB4YkEMemJFyDGAKAdgDhwiAUSAAgECFDfJTIkEAErlEIgADDrgleIYi +/wMKukV4EfBIcIYg8w8KuAQigQ8AAAAMBrkleAQigQ8AAAAwArkleM9xgACEQwKhi3WpcF4Lr/oU +2TjYZMAA2ATZHg5gCqlyz3AABhsATh4YkLkAL/mlwOB48cDhxRDdOgvgAalwB9kLuc9yoADwFzGi +z3EAAPD/OKKyoh4IwAGlAA/54HjxwCYIL/kA2s9wgAAYCkOg/9vPcIAARKwTGNiASiSAcEhxqCBA +B4QpCAkAIY5/gABEps93gADYWUGmBt2lps91AgB0FKSmRqbnpiQeghAAIY1/gABkpkClAeHPcIAA +RKwcGNiAz3GAAKhAAIEc2kCgGNgOCCAAAqEVAA/5OdnPcKUACAw+oOB+/9nPcIAAIKQgqADZz3CA +AMij4H81oOB4ANqA4cokTXDgeOgg7QH/2VxgIKwB4uB+8cDhxc9xgABUwc9wgAA8cv4M4AhI2s9w +gAC8as9xgAAgC+4M4AgI2gDdz3GAAMBGoaGioc9wgADYSamglgmgAgOBz3CgACwgz3GAAEhKUIAQ +gEWhBqHyCyACqaGJB8/48cAA2c9ygADAqCCiz3CAAEhBIKA9sjC5PrLRwOB+4HjgfuB48cDqDu/4 +INkA2s91oADIHCmlz3GgAJQTW6HPc4AARB9gg/Noz3aAAFDDDIb1f1MgxAXwY/tjUyCPAIPnpMGL +cRv0H4abuB+mNBaAEOKL8XAL9ChwQCMBBERr3gggCkAmAxwN2irwHoaRuJK4HqbPcKAAzBcr8IXn +DvRBKgJSQCMABMG67g/v/IhzH4acuB+mDdoU8Cy4UyACAB+GA7qZuB+m5IMF4gUnABEAoQWDAaEG +gwKhB4MDoQPiz3CgAMwXz3GgAJQTXKEB2oDiB/Qfhpe4H6Yg2AqlGPAAwQPaGBhYgAHBGRhYgALB +GhhYgAPBGxhYgBQYmICKFgEREBhYgATZJ6UWGJiASQbv+KTA4HjxwNoNz/ikEAEA+bmiwXD0INnP +c6AAyBwpo6QQAQBRIcCBLvIxiM91oAAQFCO5wLkDuQXhA9pPpUaFQcKN4RDeyibiEQYUDzGMJ8Of +CPQEFA8x8XbMJ+qQAd5D9gDegObq9cWARX7HpbGIhiX8Hxi9pXrPdaAAzBdaoBfwRYDPcaAAEBRH +oaQQAQBRIYCCCfIxiNe6hiH8Dxi5RXk6oM91oADMFw3ZAdoD4Q0dmJAOHViQJoAZHViQJ4AaHViQ +KIAbHViQA9kUHViQcBABARAdWJBwEAEBz3WgAPQHBOEnpUejpBABAJm5pBhAAFUF7/iiwOB48cDm +DO/4BNkIdQ0SDjYG2A0aGDDPd6AAFAQKp89wgAAwco4LwAgAhYYL4AgE2QGFfgvgCDjZCBUEEEwk +AIABhQAQBQEE8gwkQIHK9wohwA/rchnYjLiVAC/6b9sDhVIL4AiIcQGFQoUgkAWFQgvgCEJ5yqfZ +BO/4DRqYM/HAagzP+Ah2z3WAAGgLAIWA4Ch3BfSA5uIgggMi8M9wgADkWIYJwAnPcIAAYEHPcYAA +NAvAoACBBX/goc9xgAAITgKBAeACoQPw4g7P+QCFgOD99c9wgABsCwCAgOD39XEEz/jPcqAA/EQ5 +ggQhvo8AAAggANgF9D2C+bkC8gHY4H8PePHAANicuM9xoACsLxyhGoFRIICCGoEM8qq4GqEagVEg +AIDx80YLr/wB2AvwirgaoRqBUSAAgOf1Qguv/AHYANmbuc9woADQGzGgUgjACwIOgAvPcIAAsE0A +gEIgAIDKIGIA0cDgfuB48cDhxc9xgADAqH6RXZEQu2V6ESIAgAHdDPTPcYAAmFZEKD4HmgjgCQAh +QA6pcAPwANjFA8/44HhGgYDiCPIjgWCBIoJieTBwANgD9gHY4H7xwDILz/gIdc92gADYWd4P7//J +cYDgCfKpcNIP7/9AJgEYgOAD9ADYCvDPcYAAuFm6D+//qXCA4PfzAdhhA8/48cDhxc9wgADsOAiI +iOChwQf0z3CAAIRBAIDtuB/yz3KAAIBDaBKAgM9zgADuQoDgE/JrEoCAgOAT9GoSgIBRIMCBC/LP +cIAAhEEAgOG4BfRRIACAA/QB2FzwANha8IHgE/RuEoCAgOAB2MB4YMAuCiAIi3BzEoCAgeBL9G4S +gICA4EfyLPBzEoGAgeEF9IMSgICB4AnygeFKAAwAgxKAgIHgQgAMAG4SgICA4AX0bxKAgIDgA/IA +2ALwAdhgwN4JIAiLcHMSgICB4CP0bhKAgIDgBvRvEoCAgOAb8gDYYMAX8IHhAd1uEoCAwiVBE4Dg +BfRvEoCAgOAD8gDYAvAB2GDAmgkgCItwqGOA4Oj1IMBVAu/4ocDgeM9wgAAsCQ6AgOAB2OB/wHjx +wOoIAACA4AXyXgkAAIHgB/TPcIAAHDwAgIDgA/QA2BTwMgoAAIDgD/SmCQAAgOAL9M9wgADsOCyQ +z3CAAKQ1HpAQce31AdjRwOB+8cAGCgAAgOAg9M4JT/qC4ATyANjRwOB+z3CAAOw4CIiH4A3yiOAS +9M9wgACkNQGAxBAABlEgQIEI8s9wgACEQQCAI7jAuOjxAdjm8TED4AAR2OB48cC4cM9xoACsLxiB ++rgM8gohwA/rcoogjAln2w0F7/lKJAAAFYFRIACADPQKIcAP63KKIMwJaNvxBO/5SiQAAAHY0cDg +fuB4z3CAAGgLAICA4MwgYoAE9ADYBfCI4P7zAdjgfvHAz3GAADILYInPcIAAMwtAiIQrHwAAIYB/ +gACYyzDg8CCAAFEgAIAF9CoIAACA4AP0ANgM8CCJz3CAAFTFhCkfADQgQA6A4PXzAdjRwOB+z3CA +AGgLAICF4AHY4H/AeM9wgABoCwCAhuAB2OB/wHjPcIAAaAsAgIfgAdjgf8B4z3CgAMQsGoDnuAb0 +USAAgQHYA/QA2OB+z3CAAIRBAYCB4AHY4H/AeM9wgACEQQGAguAB2OB/wHjPcIAAhEEBgIPgAdjg +f8B4z3CAANQKIIDPcIAA2HLwIEAAgOAB2OB/wHjgePHAxg/v/+HFgOAc8s91gADsOAiNh+AW9M4P +z/+A4BLyz3CAAKQ1HpAslRBxDPTPcIAAhEEAgAQgvo8AADgQBPQA2APwAdgRAO/4D3jPcIAA1Aog +gM9wgADYcvAgQACB4AHY4H/AeOB4z3CAAIRBAYCA4AHY4H/AeM9wgADUCiCAz3CAAPxy8CBAAIDg +Adjgf8B44HjPcIAA1AoggM9wgAD8cvAgQACB4AHY4H/AeOB4z3CAAIwqAIiA4Afyz3CAAHQqAYgC +8AHY4H7geFEhQMcF8gnIvbgJGhgwANmduc9woADQGzGg4H7xwPoOj/jPdaAAyB8kFQ6W6L4K8oUV +AJa2Ck/7iiAEACQdGJBRJoCQ4AnCCzkHj/jxwMYOr/g02LoMgADwuM93gAAAjhXyAg/gAgDY1g7g +AgHYiiYQEADdYguv/qlwFCdME2G+gOYAtAHlOPcO8ADbiiIQAKYLoARweBQnzBBhuoDiALQB4zj3 +1QaP+PHAag6v+DTYocEA3VoMoABAxfC4z3eAAAB2GfJSDeAAAdgD3gq+ANiMuLhgEHiLcU4O4AAB +2hQnTBNhvoDmALQB5TP3Gg3AABDwBdsKuwPaCrp4ZToLoAQQeBQnTBNhuoDiALQB5Tf3aQav+KHA +4HjPcQEAxFXPcIAAgC7gfySg8cDhxW/YlbjPdaAAyB8SHRiQz3ABAEA8FR0YkKINAAqKIAQADqU9 +Bo/44HgA2JC4z3GgAMgfFRkYgM9wgACswUaQW3pPIgMAWhEChjgQgABkelhg2BkAAOB+4HjhxQDb +z3KAAMCdSiQAdM91gAA4nmhwqCAAAkAlARIUeWCxAeBIcM9xoAAEJQ+hViIABBGhViIABRCh4H/B +xeB48cBODY/4z3WAAKQ1BYXPdqAAxCd1HhiQDJV2HhiQB4V5HhiQEJV6HhiQsg3v/wDfgOAc8nce +2JN4HtiTgB7Yk4Ee2JMHhYYeGJAQlYceGJAHhYoeGJAQlYseGJAFhYgeGJAMlYkeGJAFhYQeGJAM +lYUeGJDB2FAeGJA9BY/44HjhxQhxw7jPcoAAQJ70IgMAybtwccokInTKICIA6CAiAvQiDQDJvbFx +AvIB4OB/wcXxwOHFCHXPcaAAxCcZEQCGAdqA4BERAIbAeoDiAKXRIOGHANg29M9wgADMwwyAz3Gg +AMgfZOAeoRDYDqEB2BUZGICWC6ALC9hRIQDGyiAiABv0USBAxxPyz3GgANQLFoE4gSTgMHBL924L +oAsD2FEjAMAF9FEggMQD8hjYAvAA2IDgyiDiBM9xoACQIz6BIKWFBI/48cAKDI/4z3aAAKQ1FSYB +EECBaYK4ikErwADAuBe4x3AAAIAc5LvPICIG4LtO388gogDKJ4IfAABOAYblzydhEuW7FvTPdYAA +7DgYFQQRvpaQdQ/0oYbEFQ0WUSVAkQj0oIbEFQ0WUSVAkQPygbhRIwCCzyCiBRui/KJAgc9wOgRK +cB2ioIEH2H4JoAAKuAQggA8HAAAAMLiH4FYADQAzJgBwgAB0YEAngXIUeQB5iiAEAB6lGPCKIBAA +HqUU8ADYi7gepRDwANiMuB6lDPAA2I24HqUI8APYDLgepQTwANiOuB6lgiABAYkDr/gepQohwA/r +cozYjbi+24u7SiQAAA0Hr/kKJQABz3AAAFVV4H7xwP4Kj/ghgM91gADcMwKAIKUA3gGlwqXPcND+ +AADuD2//BKXPcp8AuP/doqIJT/4ghf+5C/LPcKAAyDsdgIDgBfLPcAAAVVUH8N2igOH7889wAACt +3hUDj/jgeM9wAABVVeB+z3AAAFVV4H7PcAAAVVXgfuHF4cYkiM9ygADQcqaIwrkuYgDZDyGBA4Dl +z3OAAKCiQIMF9CZ6QKMX8EV5IKMliBUjjQMjpSaIRYhZYSalIICMIRCARPeKIRAAIKAjuSGjAIAq +uAKjANnPcKAA8DYsoCODJaAmgyagJIMnoCeDKKAlgymgKIMqoCGDK6Aigy2gIIMkoMHG4H/BxeB4 +8cDSCY/4CHeacbpy2nMKIgAhCiNAIQohgCHPcAAAyBvWD2AACiDAIfpwz3AAAMwbxg9AABtwz3AA +AAQcug9AAM92oADIHztwAdgTpgbYz3WAAERTAKXhpQgdABUMHUAVEB2AFRQdgBQYHcAUHB1AFA7A +IB0AFM9xgAD8MwmlBIEAgAqlCIEAgAulDIEAgAyloBYAEA2lpBYAEA6lqBYAEA+lz3BDdagSEKVO +D2AAKNgRpUYPYAAA2BKlUyfAdROlAchUHQAXFqUSFgCWUB0AFxelExYAls9xoADIHBilFBYAllMh +AjMZpRUWAJYQuhqlJBYAlhulFhYAlhylz3CAABRSF4Adpc9wgABEU3gYgArPcIAARFN8GMAKz3CA +AMBTBBgAC89wgABEU4QYQAsogYgYQADPcYAAAAAkgYwYQAAvIccFCLklei8hBwZFeZAYQAA6D2AA +Jdm5AI/48cCeCI/4z3OAANhTQ4MA3891oAAsILCF0mrUfn5mpaYEpkAiQoAmpkOjBvICg+OjAeAC +o9EAj/jPcYAA/DMIgQDaQKAMgQHZQKDPcKAAsB80oOB+8cBOCI/4C8gA3gQggA////8DCxoYMP4N +IADJcM91gAAYChGFgODEDCIAyiBiAI0Ar/jQpfHAhgkAAIwg/4/KICEA0cDgfuB48cAGCK/4atii +wYtxAdrKDaAASHOA4BD0CiHAD+tyz3AAANIUiiPFBIokgQrZA6/5SiUAAEAkgTFE2AHamg2gAEhz +gOAP9AohwA/rcs9wAADTFIojxQWKJAEBrQOv+UolAABmDe/4BhQAMYDgSPKBwWvYAdpiDaAASHOA +4A/0CiHAD+tyz3AAANQUiiOFB4okwQp1A6/5SiUAAAQUADFAJIEwAdoyDaAASHOA4A/0BBQFMQoh +wA/rcs9wAADUFIojRQhFA6/5iiTBCgIUADHPdoAA5F4beEEoxQBMJYCMAB5AEdT2CiHAD+tyz3AA +ANUUiiOFCREDr/mKJMEKHdjPdoAA5F4AprhwABQAMc91gABU50AtggCpcb4MoAAB24DgD/QAFAQx +ABYFEAohwA/rcs9wAADWFNECr/mKIwUMQIaA4gDY0fYWJQEQYImGI/8NI7uB4wb0YYmA4wTyYrth +qQHgUHCx9gDYCQdv+KLA4HjxwIIOT/inwTpwenEaclpzi3DPcYAA3GE+D2/4GtrPcYAA5F4ggQDY +gOG4ccQALgCKJf8fz3GAAFAgABGEAIom/x/JdQLw6XZMIYCjAdrPcYAAVOcWeWCJwiKMAEQjjwD9 +f/FyPfThiUQjAgQkukQjBgJBLsYADCCAoUQjAQEiuS/0TCRAgA70gOHMIiGAB/KB4cwiYYAA2gL0 +AdpPegXwgOIB2sB6geIb9EwiAKYB2sIiigBQcYYj/Q8nuwXygOLMIGGgDfQyd8wjIYAL8oDnA/KA +4wXyMncD9vF2hfbJdwTwAdkJ8Ah1AeCwcFoHxf8A2Yog/w+A4QT0gOXKIEoDjCD/j8oggQ////// +FfIyJII0geLPcYAAVOcH9GJxFnkCEcAACfCC4hZ5BfQGEcAAA/AHEcAApQVv+KfA8cDyDM//ygpP +/8IMgAfyDw//CiHAD+tyPdiKIwsOSiQAADkBr/kKJQAB4HjxwM9wgACkNQKAwhAABlEgQIB8CsIG +0cDgfuB48cAGDU/4GnAodTpyz3CAADCp4g/v+UTZz3KgANQLfoIAJYEfAAAAIM9wgADsCmJ5YKDM +uc9wgADMwy+iDIDPcqAAyB9k4B6iENgOogHYFRoYgE1whiD8A9DgzCCCjwAAgAAS8owgA4QT8goh +wA/rcgokgArPcAAAMhGKIxoNlQCv+bhzCnBODO/6KnIE8P4IL/oKcIDgFPLPcoAAUMM/gpzgs7k/ +ogDaz3GAALSdS6nPcYAA6JpMscoggQCpBE/48cBSDE/4z3CgAMQnUhABhkEQAIaGIOOPAN0G8uu5 +0SGigUXyz3CAAKQ1A4AJgM92gAAwqVEgQIEX8u4OQASA4An0FI6B4MogIQG4DyH/yiFhAM9wgADs +qQCAUSCAgAXyRg9gABCWtK7PcIAA7KmgoE1whiD8A4wgAoAV9M9xgACQKgCBAeAAoc9wgACkNQOA +GIiE4FQKAf82D0AEcgnP+gXwjCADhEAJAfoVBE/44HjxwJ4LT/gA3gLdz3eAADimQCcAG4QuCBkw +IEAOUSAAgHQL4v7KIIIDYb2A5QHmMvcOCCAAANjRA0/44HiA4PHAENgK8iINz/rmCaABiiAEANHA +4H7uC8/6ugmgAYogBAA6D0AJguAG9FYPYAkA2PLx8PHgePHALgtP+M92gABwCwDdC/AQ2Lh4CyEA +gKgL4v7KIEIDAeWD5SCGtveA4cogIQDEDiEDyiEBAGUDT/jgePHA4cXPdYAAGAoQhYDgIfTaDkAJ +guD4DmEJyiAhAAHYEKVyC+/6EdjKDGAAENiA4BGlCfJeC+/6ENgqCaABiiAEAM9wAADk8D4Ob/+A +2RkDT/jgePHAngpP+M92gAAYCs91gACEPAOG8CUAEEB4gOD78+0CT/jgeM9xgACkPACB13AAgAAA +cAYB/ACB13AAQAAA8AUB/OB+AdrPcYAAIDxDqRihKHBk2XXaHtudBGAHGLvgePHAz3GAABgKA6H6 +C+/6Edi6CKABiiAIANHA4H7xwCIKb/gB2qHBgeDPcYAAHDxAoS30z3WAACioGoWMIMOPCvIA2oQo +CAkAIYF/gABopkCpz3aAABgKDIaA4Afyig/v/wuGANgMpv/YGqWuDqAIi3CA4A3yPgmABADBz3CA +ABg8IKACDeAIANgR8FYK7/oR2CIJgAQaCKABiiAIAJoNQAmC4LgNYQnKICEAAQJv+KHA8cDPcAAA +IE5+CAALz3GAAKA8AKHPcQAAuAvPcIAADDwgoM9wAACIE14IAAvPcYAAEDwAoc9wDwBAQk4IAAvP +cYAAFDwAoQXYPgggCwu4z3GAAKRAAKHRwOB+4HjPcaAArC8dgZa4HaHgfuB48cAaCQAADgggAADY +0cDgfvHAGNgA2c9yPwAPCGYIIAsC289wgAC4WSOAQIEF8ACBQniF4BL2z3OgACAxAIPAuIHgAdjA +eC8mB/Dz8w3YAaOiD8//0cDgfgohwA/rcs9wAACiKIojBw5KJAAAtQRv+QolAAHxwOHFz3GAALhZ +Y4GggwfwAIOieIXgVAAJAM9yoADAL1gSAAbAuIHgAdjAeC8mB/Dw81YSAAajgWCFB/AghWJ5heFG +AAkAWBIBBsC5geEB2cB5LyZH8PTzVhoYACS4UiAAAMEAb/jAuAohwA/rcs9wAACjKIojCAQKJIAP +oAAYMS0Eb/m4cwohwA/rcs9wAACiKIojBw5KJAAAFQRv+QolAAHgePHABghP+M91gAC4WSOFQIEG +8ACBQniF4PgACQDPdqAAwC9YFgAWwLiB4AHYwHgvJgfw8fNAFgEWQ4VggoUhwgcG8ACCYniF4AQB +CQBYFgAWwLiB4AHYwHgvJgfw8/NAHlgQA4UggAOFQIAH8GCAQnuF474ACQBYFgMWwLuB4wHbwHsv +Jsfw9PNcFgAW44UEIIIPEAAAANdyEAAAAAHaBCCDDwEAAADAetdzAQAAAAHbBCCADwIAAADAe9dw +AgAAAAHYwHjghyJ/jCcHnQn2gOLMI2KAyfOA48wgYYDF84oOIAsE2COFQIEG8ACBQniF4FwACQBY +FgAWwLiB4AHYwHgvJgfw8/MG2EIeGBBhBw/4CiHAD+tyz3AAAKMoiiMIBAokgA+gAMAw4QJv+bhz +CiHAD+tyz3AAAKMoiiMIBAokgA+gADAxxQJv+bhzCiHAD+tyz3AAAKIoiiMHDkokAACpAm/5CiUA +AfHAog4P+M9ygAC4WWOCoIMG8CCDonmF4XYACQDPcaAAwC9YEQ4GwL6B5gHewH4vJofz8fMH20IZ +2ACjgsCFB/BghcJ7heNmAAkAWBEDBsC7geMB28B7LybH8PTzVREDBmCgY4KggwfwQIOieoXiXAAJ +AFgRAgbAuoHiAdrAei8mh/D081QRAQaFBi/4IaAKIcAP63LPcAAAoiiKIwcOSiQAAAECb/kKJQAB +CiHAD+tyz3AAAKMoiiMIBAokgA+gABQx4QFv+bhzCiHAD+tyz3AAAKMoiiMIBAokgA+gABAxwQFv ++bhz4HjxwLYND/ghiM9zgAAAX0YhAgZPeUGofdpAqIC5oItGIQEGUyVCEAO6AeVFeaCrz3OAALhZ +w4MhqECGB/AghkJ5heGmAQkAz3WgAMAvWBUBFsC5geEB2cB5LyZH8PDzQBUEFkODiHHAgoUhwgcG +8OCCwn+F564BCQBYFQ8WwL+B5wHfwH8vJsfz8/NAHVgQQ4PAggfwIILCeYXhbAEJAFgVARbAuYHh +AdnAeS8mR/D081wVARYEIYEPAQAAANdxAQAAAAHZwHmB4T70w4NAhgfwIIZCeYXhMAEJAFgVARbA +uYHhAdnAeS8mR/D081wVARYEIYEPAgAAANdxAgAAAAHZwHkvJkfwIPTDg0CGBvAghkJ5heHwAAkA +WBUBFsC5geEB2cB5LyZH8PPzXBUBFgQhgQ8BAAAA13EBAAAAAdnAeYHh5fMjg0CBwYAH8OCBQn+F +59IACQBYFQ8WwL+B5wHfwH8vJsfz9PNSHZgTI4NAgcCAB/AAgUJ4heCqAAkAWBUAFsC4geAB2MB4 +LyYH8PTzUx2YEyODQIEG8ACBQniF4IIACQBYFQAWwLiB4AHYwHgvJgfw8/ME2EIdGBAjg0CBBvAA +gUJ4heBaAAkAWBUAFsC4geAB2MB4LyYH8PPzQB0YET0ED/gKIcAP63LPcAAAoyiKIwgECiSAD6AA +wDC9By/5uHMKIcAP63LPcAAAoyiKIwgECiSAD6AAMDGdBy/5uHMKIcAP63LPcAAAoiiKIwcOSiQA +AIUHL/kKJQAB4HjhxeHGQS0AVMG4g+AJ9zMmAHCAAFBgQCeBchR5AHkA2Bfwz3GAAFDDmBGAAEAo +AgaGIP0PUiDAAUW4RXjPcqAAiCQQoh+Bs7gfoUrwAdgQ289xoADIHGmhz3OAAFDDmBONAADaz3aA +ACxuxoZALQEWhiX9H1IlzRHFeUW9pXnPdaAAiCQwpT+DAt1EKD4NACGAf4AAiNWVuT+jz3GgAPAX +vaGkgIoTAwGmoaOAFOOmoaKAUyPDgKahoYCmocAgIQjAICIMYIBzoWxoYINzofgQA4JzofwQAIAT +oUqhwcbgf8HF4HjxwOHFocEIdc9w1Lr+ykDABPDiCSALAdjPcZ8AuP+6oQTYG6GLcB6hANqdus9w +oADQG1Ggz3AAbQAQGaFRIUDH/vMAwNdw1Lr+yuXzvQIv+KHA4HgA289ynwC4/xqie6I+os9wAGwE +ABmi4H7xwCoKL/iYcCh2GgggAEh1BiCBA4hwUgggAKV5eQIP+M9xgADAQGCJgOPPcp8AuP8F8s9x +0Lr+yj6iGqKA4w7yz3CgADguBYAEIIAPwAAAANdwwAAAAPbzatgYuBmiHILgfuB44cXPcoAAwECg +ioDlz3KfALj/BvLPc9C6/sp+ohqiO6KA5Q7yz3CgADguBYAEIIAPwAAAANdwwAAAAPbzadgYuBmi +4H/BxeB44H7geOB+4HjgfuB48cBuCQ/463DPd4AADC8Ah1EgQIAZ9M91gADwMwCFUiCAAAClCPDP +cKAAqCANgOTg7AAFADYP7/9U2AAVBBCGIP8OkHDx9c92gACgPZgWAJZRIICAPfImDc/+z3WAAKQ1 +yRUAFqW4yR0YEJMWAJaluJMeGJDXFQAWpbjXHRgQDoWluA6lAIXIEAAGhiB/jsogIgDKIQIAqA5i ++MoiogEBhcgQAAaGIH+OyiBiAMohIgCMDmL4yiKiAQCFz3GAAFTBxBAABiW4wLjOCi/8CqFKCM/9 +f9gKuM9xoADQGxOhf9gQoQDYlbgQoc9xAABMHSoKIAAG2M9xoADwNgSBRiDAAQShlNiqDu//GNkA +h1EgQIDACyIByiAiAL0AD/gKIcAP63Lb2AS4iiMFAkkEL/lKJQAA4HjxwD4IL/gB2L4PYAkA3c9w +pQAIDM92gADwO6KgBIZRIICArAsC+c9xAAAIB7YJIAAG2AvIBSCADwEAAPwLGhgwBIZRIICAEfLP +cIAAsE0AgIDgC/TCDi//iiDGCIHgBfT+CsAFDPAA2Z65z3CgAPxEIaDgeKGgtg8gBwDYjgoP/AzY +Lgqv+gDZWgsAAe4KYAgB2E4Ir/oB2BEAD/jxwJ4Pz/eA4Ih1AN8J8oHgC/QB3s9wgABUIMCoBfDP +cIAAVCDgqIDhCfKB4Qv0AdnPcIAAUSAgqAXwz3CAAFEg4KiA4gnygeIL9AHZz3CAAFMgIKgF8M9w +gABTIOCoz3agAMgfz3CAAFQgGB7YkwCIgOCKIRAAEvLPcIAA2TQAiIDgDPLPcAMAQA1FHhgQMKYC +2BgeGJAD8DGmz3CAAFEgAIiA4Bzyz3CAANo0AIiA4Bbyz3ACALpwIB4YkM9wgAAoACEeGJDPcIAA +KAkiHhiQGBYAlkUgAAMYHhiQz3CAAFMgAIiA4AjyGBYAloUgAQQYHhiQgeMH9BgWAJaIuBgeGJAY +FgCWgLgYHhiQgOUZ8gDYlLjPdYAAkAsApXHYBri+DO///Nkghc9wAABMHLIM7/+fuRgWAJaFuBge +GJDJBs/34HiA4fHAmHAF8kwkAIiP9s9wgADACQAQBQAKIcAP63LPcAAA2g45Ai/5edvPcIAAyEAV +IAABIKDRwOB+4HgA2UokgHHPc4AAwJcocqggwAHwI4AAAeIFeeB/LyhBAOHFANpKJIBxz3WAAMCX +SHOoIIAB8CXBEAHjJXoA2Z65GXkEIYAAQiAAgMogYgDgf8HF4HjxwM9xoADIH6QRAgDPcIAASEoA +gDWBz3OAAASbliBBDxByANrKIm8AAYPVuYHgAdgC8gCDgeAG9NdxAACIE4T3ANgD8AHYgeLMIGKA +IA5h+sog4QHRwOB+AuEweUFpUHDE9iJ4EHgD8ALYz3GgAMgfHqEQ2A6hAdgVGRiA4H7gePHA4cVQ +3QDaz3OgAMgfr6NeowIgQgBeowHaFRuYgEDaTqMEIL7PAAIAELAPwf+VBc/34HgA2c9wgADsqSGg +z3CAAFDDHJBiuEggQAAQec9yoADIHx+CEHgIIQEAMHkC2BUaGIA/ouB+AuEweUFpUHDE9iJ4EHgD +8ALYz3GgAMgfH6GKIBgIDqEC2BUZGIDgfgDZz3CAAOypIKAhoOB/IqDhxeHGgODPcYAAeN9FgSXy +z3GgAMgfQBEOBs9zgABQw0AojQJCEwABfJPQfthgu2NiuwgjAwACewkiwgAC2BUZGIDPcIAApDVf +oQOAIoDPcIAA7KkioMHG4H/BxeB+4HjgfwDY4cT8HMi+/BxIvuHA4cHhwuHD/BwIsfwcSLH8HIix +/BzIsfwcCLL8HEiy/ByIsvwcyLLhxeHG4cf8HAi0/BxItPwcCL9qJIAQ4cRqJMAQ4cTxwM91oADQ +G1wVEBB72E4Lb/+KIQQDz3CfALj/HYDrdstwz3AAAEQcygnv/wonwB86cBeFB9i+Ce//CrhTIEEH +B9j2Ce//CrjPcKAA1AsYgEIgAAhIIAAAz3OAACRQz3GAAJALIIG8GxgACyFAhMogIgM09EwggKAQ +9FEhgKUM8oDgCvRRIUClZNjKIIEPAABcACTwNNgi8IwgBKAb8kwgAKIV8gn2TCBAoA/yTCAAoRP0 +htgS8EwgAKQL8owgAaAL9EzYCvBm2AjwPNgG8EbYBPBU2ALwhNiTEwMG6XHJcgokAAQVB+/4CiVA +BPHACgvv9wHaosHPdoAAgEIIjs91gAAAQkQoPgtAJQAVJ3BeCeAHi3EIjoHH6XFEKD4LQCUAFidw +RgngBwHaCI5EKD4LACVBHkAhAA0U4TIJ4AcB2giORCg+CwAlQR5AIQAOGOEaCeAHAdoIjkAlAR1E +KD4Li3AncQYJ4AcB2giOOOVEKD4L6XAAJUEe8gjgBwHa4QLv96LA4H7geOB/AdjPcoAAGAoigiWJ +gOES8s9xgAAoqHqBz3GAAGSmhCsICTAhQQ5RIUCABPQI2AuiAdgJogDYBKIF2AOi4H7xwOHFgOMI +dShwBvLPcYAAAI4F8M9xgAAAdlt61grv97R5hQLv9wHYz3CAABIKAJCA4AfyANnPcKQAHEAyoOB+ +z3CAABIKAJCA4AfyA9nPcKQAHEAyoOB+8cDKCc/3MHK6ACUAWnAiegHiKHdAKoAgz3GAABDXGnI7 +ZxZ4GmNSiowiw48AIxEAQ/LPdoAAhEFghgDd8LsPJY0QDvLPcqAASC5LgtO6CyWAkAbyAGFRIECC +J/LqCQ//gOAW9M9wgADsOCyQz3CAAKQ1HpAQcRP0AIYEIL6PAAA4EA30Zg7P/oDgCfLPcaAAOC4H +gaV4B6EM8EYWABaleEYeGBAG8EUWABaleEUeGBD/2RIZQiBCIEIggOJWB+3/IW9lAc/34HjPcQEA +xwPPcKAA7CcmoOB+/BwItPHAGnDyDq//JNiYcFEgAIDKIcEPyiLBB8oggQ8AAFEmyiOBDwAAKQHU +BOH4yiUBBM9xoACsL0wgAKAYgUP0+rgG8s9wgABUQQCAQHj02ADZhg6v/wHaNNgA2ZG5eg6v/wDa +MNiKIQYAbg6v/wDaNNgA2QPaYg6v/xS6fg6v/zDYwriB4AP0ANgC8ATYz3IBAMYDz3GgAOwnRqHP +c6AAtA88g4DhJPIBEgQ2cBMFAAohwA/rcs9wAABSJkUE7/iKI0UGmrgYoZYPoAqKIA8Kz3CAAFRB +AIBAeIIPoAoB2PoO7/6KIAUDgOAG9ATY0cDgfwQUEDRE2c9woADIHCmgXg+gCgHY1gmAAb/x4Hjx +wOoPj/eiwSh2CiSAgADfz3WgACwgQBUQEAAcxDMU8kwkQIA78kwkgICG8gohwA/rcs9wAABUJooj +RAW1A+/4CiUABDJoBCGBDwAA/P/iDa//LNgQhQIgAASMIA+KCveKDa//LNhRIACACHf08wXwAIaA +uACmdg2v/zTY9bgL8gCGANkA2oG4AKY02D4Nr/+VujC/AhzEM3/wD3kQuQUhgg8AAIL9z3GgAOwn +RqEEIIAPAAAAH0i4hrgQuAUggA8AAEL9BqEQhQIgAASMIA+KDPeLcdIKr/iKIA8NABQAMVEgAIDx +8wXwAIaAuACmgcG2Cq/4iiBPDAQUADFRIICABPIAhoG4AKaLdYogjw+aCq/4qXEgwAi4AhwEMIog +zw+GCq/4qXEgwQIUADEleAIcBDAz8M9xAwBC/s93oADsJyanz3EEAAL+JqeGuBB4ELgFIIAPAABC +/QanEIUCIAAEjCAPigz3i3E+Cq/4iiBPDwAUADFRIACB8fMF8ACGgLgAps9wBgAC/wanQCSBMBoK +r/iKIM8OAhQAMbUGr/eiwM9xgACkNQCBAqEDoc9woAA4Looh/w8noM9wgACEQRUBb/mKIQgA4Hjx +wA4O7/7hxYDgWvLPdYAAhEEAFQQQANlRJACCyiHBD8oiwQfKIIEPAADJG8ojgQ8AAEcF9AHh+Mol +IQCEFQAQVx1YEFgdWBAB4IQdABDPcIAAyAkgoFYVABYB4FYdGBDPcIAAMKktiIDhyfZMiFBxxfb2 +HUIQ+B2AEPoNoAEk4ACF7bgQ9I24ZgggBwClgOAK9AvIBSCADwAAANQLGhgwzgnP9wCF7rgK8q64 +1g0v+QClheDoDyH5yiAhAuEFj/eB4M9xpwCISQDaBfQD2A6hAvBOoeB+4HjhxeHGz3WAAJRDoI0A +3oDlwKMS9IHgzCEhgA7yoOJE9sCjCvDA4gbYBfZCIgAIQ7gC4ACjwcbgf8HF4Hi4cEDcACEAg/HA +DgAkAJhxjCACgIv2CiHAD+tyz3AAAMkU9QDv+IojyA/PcIAA6GP0IAABz3GAAOhkBCh+AS9w9SEB +AUIoAwTBu1K4BCl+AS9xQikCBMG6UrmB48AgaQCB4sAhaQCIID4AiSDBD4ghPgCJIcEPgODWICsI +gOHWISsIfgkAANHA4H7gePHAdgyP96HBOnEA34DgyiHBD8oiwQfKIIEPAADKFMojgQ8AANMCyiTB +AGAA4fjKJcEDz3GAAJhDQLHPcYAAmkPgsUwhAKDKJc4TaAAuAMomzhMad1p3BfDJdxp1anBAIFMA +i3EB2vYJ7/8A2wAUDTEvI8gkqXYpvci+v+XZJSkUTCIAoMogwgPKIYIDyiICBIANIgDKI0IDyXDe +Du//qXFCIVEgTCEAoLAH7f9AIlIgyXAmCSAAqXEVBK/3ocDgePHAvguP9zpwz3CAAJRDAIiA4Bpx +S/TPcYAA4AqliQSJHWUydcohzA/KIswHyiCMDwAAyxTKI4wPAAA4A8okTASIB6z4yiVMAwDdz3eA +AJVDAN4J8ADZIK/qDu//itkB5s9+ACCBL4AA4AomiQFpEHZY9kApgCAUeLV41HjPc4AAeKoQY4Dg +Um3r8wLgEHjUeoDhz3OAAGyqUmPe9QHZ3fEB5a99g+WsB8v/dQOP9+B48cAWC4/3z3OAAJpDQJNT +Ik2AIfKC5ST0z3WAAOAKCa0orSKFz3aAAJhDAJYp3RK9z3eAAJVDFSUMECCk4I+A5wbyViAPCPB/ +9X0gpQHgALYG8M91gADgCgutKq0B4iEDr/dAs/HArgqP9wh2GnHPdYAAmkPglQvwzH9aDK/3QClA +cUW4gg3v/wpxIJWMIRCAtPblAo/34HjxwG4Kj/cIds9wgACUQwCIenGA4KHBGnJq9M9xgADgCqWJ +BIkdZXJ1yiHMD8oizAfKIIwPAADMFMojjA8AAIUDyiTMBDwGrPjKJUwDSiEAIADdC/ABHlIQBo+A +4AP0IK4B5gHlr33Pd4AA4AoAJwAUBogB4BB1aAAqAAJ3QCuAIBR4FSBABLR4z3GAAHiqNCESAEwi +AKAA2d7zi3FKcALasg+v/wDbgOAM8gEUgDABHhIQBo+A4Nf1ARSAMACu0vEKIcAP63LPcAAAzRSK +I44GCiSABK0Fr/hKJYAAQCFRIC8hRyRMIcCgaAfL/9kBr/ehwOB4ANuA4GCpYKrG9o7gBPZgqeB/ +YKqi4If2wOAF9gHYAKkR8OTghvaMIAKDyiCsAMn2jCBChIn2jCBCiQf2A9gAqQHY4H8AquB+8cA2 +CY/3o8FKIQAgi3EqcEogACEKcgIPr/8qc4DgD/QKIcAP63JT2Aa4iiMFAQokQAQVBa/4CiUABCDC +gOKK9gDAQSgBAlMhxABMJMCAyfYB2c9wgACUQ28CIAAgqM9xgADgCkCpAhkCAUEoDgNTJsUQAxlC +AUwlwIDKIskHyiCJDwAAwhTKI4kPAABYAbgEqfjKIckPQSgCBFMixgAEGYIBQSgCBVMixQAFGUIB +TCZAgMwl7IDKIckPyiLJB8ogiQ8AAMMUyiOJDwAAXgF4BKn4yiSJAUEoAgZTIsQABhkCAUEoBQcH +GUIBTCRAgMwlbIDKIskHyiCJDwAAxBTKI4kPAABkAUAEqfjKIckPBBSFMIwlAYS+ACwAARlCAQoh +wA/rcs9wAADFFIojRQoZBK/4mHPPdYAAeKoA3wPwAefvf0EoAQLDuTB3dAAKAADeEvBAKYEgNHkK +FIAwFSFBAQHmz34UeblhABkEBIAgAiMvIAgkAMBBKAEGw7kB4TB2vgfK/4LBCnAC2o4Nr/8A2wsU +hDAvKAEBTiCFBy8lRwFMJcCArgfL/wohwA/rcs9wAADGFJEDr/iKI0YCQCFRIC8hRyRBKAEEw7ky +cW4Hyf8F8EwmAIBgB8n/QSgBBcO5gOEKdbIALABKIAAgSiIAIAXwQCJSIC8ihyRBKAEDw7lScYIA +DABKIQAgFfACvtR+ChSAMBUmThFAIVEgLyFHJBR+ACaAH4AAeKqgsIAlAhOwfQDAQSgBBwHhMnG2 +B8z/MLjDuAAgDgSCwalwAtrKDK//ANsLFIQwLygBAU4ghQcvJUcBTCXAgKQH6//PfgohwA/rcs9w +AADHFM0Cr/iKI4YIQCBQIC8gByRBKAEFw7kScVwHyf/T2Qi5ANgD3s9ygABsqgDbsmh0fV1lILUB +4297guNWIQEIMHm39mG+gOYB4A94MPfNBm/3o8DxwFYOT/eiwUDAQcJAKBQFQCkXBQDdQCoTBUAr +EgUB3kolgCGpdwTwCnXKdwDAFbgTeBQgwAX+D2/3B9kCIFADAiBAI+4Pb/cO2cx+CiFALgQpPnAv +cKx+ACENdR1lAcAVuBN4FCCABMoPb/cH2QIg1gMCJsAjvg9v9w7ZBCh+BC9x7H4AIcB0GWFCLQAV +2gjv/1S5QiVVIEwlAKAB5owH7f/PfvkFb/eiwOB48cCuDU/3OnC6cc9wgABQwwCQSiRAIADZSiBA +IIYg/ACMIAKAwiQCJUoigCDPcIAAtJ0rqM92oADQDyUWD5YlFg2WQiGAIBAWFpaxcJT3AiBRAwwh +gKTKIi4ghg6v9+lwTCQAoJhwANgT8oXnCfKL5wXyCPBKIwAgMPAB2ALwAtjPcYAAdCokgQshAIAD +8gDaAvAB2gAiQCNiD6/4ynEKIwCgHPJMJACCEvLPcIAAkDQWIAABQIAGiBB3F/SA4hXyqXBgeqpx +CiAAoAjywnUQHliTTCIAoLD1TCMAoMwgIqAR8gDYEPAKIcAP63LPcAAAMRGKIxcLSiQAANUAr/gK +JQABE9j1BE/38cDhxc9wgAAYRAgQBABMJACAyiHBD8oiwQfKIIEPAABpGcojgQ8AANABnACh+Mol +AQHPcqUACAwIEgUAANlMJQCAzCUihMohwg/KIsIHyiCCDwAAfRnKI4IPAADXAWgAovjKJCIAQNgC +os9wgADIs2CACvD0IE0Az3CmAACANXgB4aCg0uGEKwIKACRADrT3pBADAc9xpACgP32hphAAAR6h +CBpAAZUET/fgePHAWSRcOItwz3GAANBgzgxv94oiBAJKJEB4ANmoIAADFiRAMGGAQJAr2BK4AeFV +eGCgMHlWJFw40cDgfvHAxg4gAEfYANrPcasAoP9ZoQfYGqFYodHA4H7gfuB44H7gePHAz3GAABhE +OIGA4SgOAgDRwOB+8cDPcYAAGEQ9gYDhoA8CANHA4H4dBoAJGQaACRUGgAkA2c9wgADIsyGgCQKg +AiKg8cDhxc91gADIsxYMoAKpcLhwAIWA4BPySiSAc89zgAB8QQDZqCCAAkCDRCm+AzIiQg6wch7y +AeEQ8ADZSiSAec9ygAAIa6gggAJEKb4DMiJDDrBzDvIB4QohwA/rcs9wAACGGYojRAENB2/4SiQA +AHkDb/cocOB4z3CAAMizQICA4iOAC/LPcIAAfEEAgEQpvgMN4DIgQA4I8M9wgAAVa0QpvgMyIEAO +4H7geM9wAAA+Pc9xqgDwQwWhz3IAAD09RqGKIMgPB6HPcAAABgsIoc9wAAARFgmhz3AAABseCqHP +cAAAHx4Loc9wAAAbFgyhz3AAABELDaGKIIgBDqHPcAAAPz0PoVChPtgRoeB+4HjxwF4KT/fmCeAC +AN1CDSAAB9g+Du//GnDPdqQAuD2sFgAWz3elANjLOdmiuKweGBAB2Kyn9h4YEM9wFQArK5oeGBCK +IMQAnx4YEBrY8x4YEPQeGBBk2MgeGBCq2MkeGBBp2MweGBDA2M0eGBDPcKUACAw+oCoPz//WCSAA +CnAY2JUeGBDPcYAAtDOhocjYAqEAoQOhz3ECAOAHz3CAAIgt1BhAAJTYC6dB2c9wpQDMfy2gz3Ck +AAyAoqAJAk/34HjxwBoIAAA+D8//0g0AAPYLj/rRwOB+4HjxwH4JT/fPcIAAdMBAIBIGCHHPcIAA +5AkgoADexKgE30QuPhcKIUAuACGAf4AAdMA+DO/4HNmELgoSACGNf4AA5LOpcCoM7/iKIQoChC4C +FwAhgH+AAAS+GnAWDO/4nNkAIZEkABlAI2G/gOehHRgUsAft/wHmZQFP9+B48cAOCW/3RCg+BwAh +jn+AAHTAEK4B3/GuIa5ArmKuAx4CEXKuWgkgABMeAhFJAU/38cDWCG/3RCg+BxpwOnHPcYAAdMAv +cBphUYqB4hthD/IKIcAP63LPcAAAsihe24okww+xBG/4CiUABEwgwKAJ8s9ygADkCQQaAgQ4YACi +AYsgi1KLBgwgAHOLQgpAAQpwVg0gACpx0QBP9+B48cDhxQh1XgigBgDY0gtP+0TZz3CgAMgcKaAm +C2/3HNjPcKAArC8YgPq4tAqhAsogQQP/2c9wqwCg/zmgOKAKCSABqXClAE/38cDhxU4M7/8IdeoP +4AKpcJEAT/fPcaAAyBwIodkCb/cG2OB48cAGCE/3osGigWCQz3aAAIAKuHujgWR9YIale6aBAZC4 +eKeBYKakeKGGQCEPBIDipXgBphzyAYECHMQwMLsEHMQwABwEMCCBi3VgealwAYchhgIcRDAwuQQc +RDAghwAcBDBgealwANgApgGmAQBv96LA4HjxwJIPL/ec2Qh2z3WAAAS+hCgCBy93Ygrv+AAlQB5e +CeAB+GUGCSAAyXDRBw/34HjxwGYPL/cB2oQoAgcAIY1/gAAEvs9wgADkCQCAKHYgiACGmR2CEEyF +MLiB4g94RvQQcQPamR2CEED0BNiZHQIQEIWA4Az0BdiZHQIQCIYSpQOGEaUchhSlF4YTpalwlgug +AclxEIUB4JDgUAAlABClBtiZHQIQqXDSD6AByXGpcPII4AHJcalwUg+gAclxqXA+CeAByXGpcEoJ +4AGpcZgVgBCB4Ar0B9iZHQIQcgggAAJtANiYHQIQGQcP9/HA4cUIdYQoAgcAIYB/gAAEvs9ygAAU +T0iSUSJAgA7yIIGF4Yr3ANktoC6gYgjgAS+g9gggAKlw5QYP94QoAgcAIYB/gAAEvs9xgAAUTyiR +USFAgAPyAdksoADZ4H8woPHASg4P9wh1KgkgAAXYQJUhlQi6RXnPcqQAuD2bGlgAIpXPc6QAtEXK +GlgAI5XLGlgAJJXEGlgAJZXGGlgAJpXHGlgAJ5XCGlgAKJXDGlgAKZXFGlgAKpWjGlgAz3GAAKQ1 +I4EogVEhAIAA3gvyTJUrlVt6RXlTG1iALZVUG1iABfBTG5iDVBuYgy6VVhtYgC+VWBtYgDCVVRtY +gDGVVxtYgDKVWhtYgDOVXBtYgDSVWRtYgDWVWxtYgHoNz//5BQ/34HjxwIQoAgfPcYAAFE8okVMh +QYDPcoAABr4vcAXyIg/v/1hg0cDgfuB48cDhxc9wgAB0QSCAAd1gealw57gnuFIgAADKJSIQyiFC +A8oh4QHAuBN4wrjPcqcAFEgLoiyiz3CqAOAHs6CVBQ/34HjxwOHFz3GgAMgcqIEIodYPL/cG2HkF +L/epcOB48cD6DA/3CHbPdYAAyLMApSGlWK12Ce//ea3qCe//A6UEpQff6XBKD6/5CdnPcKAAeEUA +gAQggA9wAAAAQSg+hQDd9vWmDGAGqXDPcKsAoP+5oPqguKAGD4ACCNgSD6/5CdmA5gHYwHgN4AYP +r/kB2fEED/fxwHoMD/cId891gADIsxiNSHYQcjpxGnMI9IDmBPQZjRJwBPQA2APwAdgvIgcg6XD6 +C6ACyXEghTB3ANgG9CGFMnHMIiGgA/IB2C8mB/AarRby6XAqcclyNg/v/wpzvg4AAwGFz3GAABAK +ALEAhQGxGI0EqRIOIAMKcAnwgOcB2MB4DeB2Dq/5AdlNBA/34HjxwAhzANkC2oQrCgIAIYB/gADk +s4QpBA8E4J4NYAYncGG6gOIB4TL30cDgfvHAz3CAAJjjpg6v+IohCQzPcIAAxDiaDq/4FNnPcIAA +6DuODq/4FNnRwOB+8cCKCw/3osE6cBpxAN1+Du//B9iacALZqXBacHpxANs0aAJxKHUUIQAgaHLC +hQQQDwXYf8OFAeLEf4Pi5Xsg5bb3AYECHMQwMLsAHAQwIIEEHMQwYHmLcEIjQSCA4b4H7f9AIkAg +Jgvv/4pwcQMv96LA4HjxwB4LD/c6cFpxz3eAAGxPDI/PdoAAyLOlhoYg/wFDuA4lDZDPcIAAZEEg +gMolYhBgeQTYgOAj8hqOgODMJSGQHfIA2BDdGnACuBV4x3CAAJxDIICA4QfyIoCA4RTyYHkqcGG9 +gOVAIEAgL/cA2BquDI+GIP8BQ7gFpjIMb/dKcPkCD/cKIcAP63LPcAAAZRk32wokAASZBi/4uHPx +wEKQIZBgkBC6RXkp2hK6FSLDACCjAJDwIgAA0cDgfvHA4cXPcYAA5MAAgYDgAN0U8s9ygAAQwQCi +CIGgoaShCKLyCq/5CdjqCq/5A9jPcIAABFh6D8AHz3CAAMBGlgygAAOAz3CAAIBKnQIv96+otQZP ++fHAmghgA+HFz3CAAMxXTg/gBwDdz3CAAOhXQg/AB89wgAAEWDYPwAfPcIAAwEaioI4Kr/kD2M9w +gABISqOgVQIv96Gg8cDhxc9xoACsLxyBvYEEfc9wgADYNACIgeAJ9M9wwN8BAByhKNkYuQnw/L28 +CUID9r3IDYL5ANmbuc9woADQGzGgDQIP9+B48cAiCAAA1g8AANHA4H7geM9wgADARgCAgeAB2OB/ +wHjxwHIJD/fPcIAAVMHHgMC+geYB3s9xgAAsTACBwH7huCz0gbgAoc91oADALxOF+rgE8hOFurgT +pQLYEaXPcIAAZEEggGB5ANiI4Az0ggggCgrYDPDPcKAAqCANgOTgkPcQhVEgAID4894I7//JcBUV +AJaAuBUdGJBlAQ/3XBUEEEAVBRAKIcAP63KKIEwJ5QQv+Iojhg3gePHAyggP9wh1z3agAMAvGoY5 +uFIgAABTIBEAFIZRIMCAB/SyDu/+JNjyuADfAvIB31EWAJaA4Av0oxYAlgQggA8AAAAPjCAQgAP0 +ANgC8AHYGnAEIZJPAAQAAM9wAAAIHHIOz/4/uFIgAwAEIIBPAgAAANdwAgAAAAHawHoMcIYgPQCA +4AHZwHlRIIDBCPLPcIAAHAsAgIHgANgD9AHYAd7lvcohgSNMIQCgKPLmvconYRCA5yLy473KImEg +TCIAoBzy5L3KI2EAgOMY8uK9yiBhIEwgAKAS8uG9yiJhAIDiDPLgvcohYQCA4QjyUSXAkcogYQCA +4AT0ANgD8AHYKQAv9w948cDhxc9xgAAwYkCBIYGnwUbBz3GAAMBGIoFFwhUkQjDPcaAALCCwgc9x +AQAgNUDBAdlBwULBENlDwUTARYIA2AzZCHOYcLhwACWHHwAAAH2yDK/82HD1B+/2p8DxwAoID/7P +cqAAwC8A2YgaQAATgou4E6LPcIAATB8BkBC4RSAAD8AaAADPcIAA1EneC2/5IKDRwOB+4HjxwADZ +m7nPcKAA0BsxoNILgACA4Avyz3CAABwLIIDPcIAAAErwIEAAQHjRwOB+4HjxwAYPz/YacM9wgABU +wQeAz3GAAKQ1UyANAIHlAd0ggcQRAQbAfVEhQIEc8s9xgABMH2GRz3GAACALwIE843lmZOEScY73 +CiHAD+tyfmaKIMwIWtsKJAAEtQIv+FUmRRaD4ADfDvTPcIAATB8hkM9wgAAgCwCAPOE4YGTgAiAQ +IArY/giv+QHZC8gEIIAP/v//AwsaGDALyIe4CxoYMP4Nr/+pcBILgADPdqAAwC9RFgCWgOAF9Ax0 +hCTCnxfyF4b5uBX0z3CAAAwvAIBRIECADfQKIcAP63IKJAAIURYFloogTAgpAi/4f9uB5ST0EIZR +IACAGfTPdYAAbEEghWB5AdiF4Ab0IIVgeQLYguAN8kAWBBAKIcAP63KKIIwIjdvtAS/4uHOKIBAB +EaYQhlEgAID+9RSGq7gUps9wgAAMLwCAguAS2MAoIgbKICEAzyBhBhmmz3GgAMgfGBEAhqG4GBkY +gIogEAARoQnYCLgPoROGqbgTps9wgABUwQeAg+DMIOKBBvRAKIAgn7iIHgAQmg3AB89wgAAsTNEF +7/bgoIHh8cAE9PYLAAAE8NILAADRwOB+8cD+CaAA4cUWD2/5GtjPcIAA2EkAkM9ygAA8wVIgAQDA +uQHh4bggqgDZC/TPdYAASEpqhYHjBfJrhYHjAvQB2SOqQSiBAsC5NKopuMC4z3GAAMBGeQXv9gCh +4HjxwPoMz/bPdaAAwC8XhRqFz3agAMgfiBUAEAfYGR4YkAHYCHEIcghzNg3v/phwygrv/lTYgBUP +ECK/dgvgB+lwz3GAAJhREoH4YBKhANiIHQAQCdgIuA6mCQXP9vHAygvP/4DgANnKIEEAGfIaDGAI +KHDPcYAAHAsggYogTAaCDWAAA9raDmAAA9g6CQ/8CNgmDCAAiiH/DwHY0cDgfuB48cDPcIAAHAsA +gIPgB/TmDE/8vgrP/wYPAADRwOB+4HjxwDoM7/ZKJEBxAN7PdYAASEpAJQMcqCBABM9xgADYSdV5 +44GB4BUjjAPgpAP0Ad/joQHmz34B2GkE7/ZEHQIQz3CAAOTAAdkkqCWoz3GAANhJAJGGIBgAqLgA +sdrYA6nPcAAAUMMBoc9wAQCghjkFYAACofHAz3KAAIBKDoqB4KHBKfQPioTgTfaA4HQP4f/KIGEA +D4oB4A94D6qhwNHA4H4A2A2qDqouCCAAD6qWD8//ANi2C+//jLjPcK0LvrpAwItwBNl92j3bzg3g +BRe75vHm8eHFz3KAAEhKRBKAAIHgQCIDDBP0SiRAcQDZqCAAA/AjTQDPcIAA5Ek1eAHhoKAveQDY +RBoCAOB/wcXgeADaz3GAAIBKT6kB2A2pTqlMqVCpUalSqVOp4H9UqeB48cAKC+/2AdrPcYAApDVj +gXiLhOMa9ACBz3GAAMBGxBAABiW4UiAAACGBwLgB2oDhz3GAAHjfJoHAeoDhzCAhgMwiIoCA8oXw +USAAgAfyz3CAADzBAIiB4AP0mHID8EokAADPcKAALCBwgM92gABISkWGpoYCI4CAANrKIm8AAiNP +gwDdyiVvENdwAEAAAMn3gOIH8gIjgA9OAAEgBabXdwBAAADI94DlBvICI4APTgABIAamAYaA4Bby +z3eAANhJAIbhhx9n8XDG9/FzyvcQc4b3CPAQc4T38XPE9wDYA/AB2AGmIIHEEQMGQStBAVEhAIDK +JmEQBvIphoPhbyYLEM9xgADARiGBz3eAAHjf5oeA4QHZwHmA4AHYwHiGJ38ehufRI2KBANsC9AHb +gOXMIiKAzCMigMwgIoDMISKAzCYikAT0ANgG8EwkAID88wHYIQLP9vHAzgkAA89wgADwOwSAUSCA +gBgIwv0J2Qi5z3CgALAfNKDRwOB+4HjPcoAAwEYhggZ5IaIA2c9wgABUwTCgJYDgfzGg8cB2Cc/2 +z3WAAMBGIYUleAGlz3GAAFTBEIGA4KHBBvQB2BChBYERoVIPL/2LcADBz3ABAIgoMHAL8s9wAQAg +NRBxB/LPcAEABFQQcQT0Jg1v/AHYAN7PcIAASErBoLoJb/kH2LIJb/kI2IoPwALPcIAAzFc+DoAH +z3CAAOhXNg6AB89wgACkNQCAxBAABlEgQIEG8rYNIADJcAXwOgtgAAOFQQHv9qHA8cDOCM/2CHYA +3boN7/8ocIDgyiBBA+APov/KIIIDHQHP9uB48cDPcIAADKkIgFEgwIEh9M9xgADYSUKBIYHPcIAA +LEpAoM9wgABISiegz3GAABwLIIGKIEYAdglgAALazgpgAALYWgmgBgLYkgoP+Qfwz3CAAMBGtgpg +AAOA0cDgfuB48cBGCM/2g+AodR70z3GAAEwfIZHPc4AAIAtAgzzhOmIhg2TiWWEwdQ73CiHAD+ty +iiCNAYojxgdKJAAADQTv9wolAAHPcYAAVMHPdqAALCDwhmYMYAAHoQ4IAAi6DO/7AdjeCO//qXAB +2P4IoADpcc91oACsLxyF+bgJ9BiFiLgYpZIK7/ag2Afwz3GAACxMAIGCuAChugrP/w4LQADQhnoM +7/sB2AnYEgpv+QDZHg0AAPYOoAky2M9wAIIBAByl4gsv+QImwBMA2J4IoADJcd0Hj/bxwOHFz3GA +ADzBABGEAEwkAIClwQ72AxGFAEwlQIAK8gohwA/rcoogDQFNA+/38dtMJICAG/QDiYDgGfQA2ACp +z3GAABwLIIH52AfdKghgAKlyhglgAKlwz3CAAMBG/gyv/6Og8gyP/2Dwz3GAAOTABImB4Az0BYmB +4Ar0z3AAAP//Kg7v/wDZgOBQ8s9xgACkNQCBxBAABlEgQIEF8gOBGIiE4Az0z3GAABwLIIGKIMQE +xg8gAALaAtg28GYMQACMIBCFZAAFAM9wgADARgCAgeAG9DYJD/mA4CjyANnPcKAALCCwgM9wAQCI +KEDAAdhBwELAQ8FEwQbZCHIA25hzuHMAJYcfAAAAfZoLb/zYc89xgAAcCyCBiiAECloPIAAB2gHY +sghAAMEGr/alwOB44H7gePHAPg6v9gDZz3KgACwg0ILPcIAASEoIgM93gAB43wImDRDPcIAAPMHl +h2OABS/+EDd1AdugiMIjzgCB5aXBBfIDiIHgD/TPcIAAwEYjoM9xgAAcCyCBz9jqDiAAANoA2Enw +z3WAAKQ1AIXEEAAGUSBAgUPygeNB9AOFGIiD4D30z3CAAMBGAYCA4Df0z3CAALAzAJCB4AHYwHgM +uNdwAAAAECvysILPcAEAIDVAwAHYQcBCwRHYQ8AA2Iy4RMAocAzZAdoIc5hwuHAAJYcfAAAAfZ4K +b/zYcM9wgABISs9xgAAcCyCByKDY2FoOIAAI2gjYsg8AALEFr/alwPHA4cUA2c9woADQG5u5MaDP +cIAA8DsEgFEggIAe8qYJT//PdYAApDVNhT6VUyIAAI4KoAQB2wCFxBAABlEgQIEM8gOFGIiE4Ajy +z3CAAFTBB4BRIMCAB/LPcIAAwEYDgAvwz3GAABwLIIGKIEkH2g0gAALaAtgyDwAAQQWP9uB48cDC +DI/2z3KgACwgMILPcIAA/DMEgM92gABISgCAoIYCIUMD13MAAKAPAN/L989zgAB436WD1bhBLYMQ +Yn2xcIT3AYaA4CT0Y4aB4+GmOvLPdYAA5MAAhYDgHvIFhYDgGvIwggJ513EAAFDDAdjCIA4AgOAm +8ooIz/8EheWl46aguASlUg/v+ADYHPD+DS/5B9gY8IDjBvIGhgJ5gOHS9lMggMEEpg70z3GAABwL +IIGKIEsCEg0gAALabg4gAALYaQSP9vHA4cWhwYog/w9eDCAAQMCB4DH0z3CAAKQ1AIDEEAAGUSBA +gRDyz3CAALAzAJDPcYAAHAuB4AHYwHgMuNdwAAAAEA/yz3GAABwLIIGKIEUHsgwgAADaDg4gAADY +OfAggYogRQieDCAABdr6DSAABdgv8M9wgADUSUCAgeIA2QT0IKAn8M9xwN8BAM9woACsLzygz3AA +gP//ngrv/wHZgOAX8pIMYAaLcAolAJAR8s9xgAAcCyCBiiDGAUoMIAAD2qINIAAD2Klw8grv/wDB +qQOv9qHA8cC4cM9wgAAcCwAQBADPcYAABEZALIAAFHgVIEABAGGK4Ar0CiHAD+tyiiDNAAEHr/eg +21oNAADRwOB+4H7gePHA4cXPcIAApDUDgBiIhOAN9AohwA/rcoogTQGKI4QNSiQAAMkGr/e4c3II +QAAIdc9wAAC/3+4J7/8A2YHgBfSMJRCVEPemDi/8AdjPcYAAHAsggYogRQKWCyAAANryDCAAANj9 +Ao/24H7gePHAggqP9roKwAfPdYAADC8AhYLgz3agAKwvEPIYhvq4CvIahlIgAABRIACABPIchvy4 +BPK+CI//HIZRIACAHfLPcIAAzFcAgEIgAIDKIGIAgOAT9M9ygADYSQmChOBN989xgACkNSCBxBEB +BlEhQIED8gHgCaJ6CY/3Ig6P/YHgC/IAhYLgCfLPcIAAHAsAgIPgrAzB/1kCj/bgePHA5gmP9s9w +gADARgCAgeAU8s91gAAcCyCFgOHMIeKBzCEiggjyiiDRAADeugogAMlywKUeCg/8GQKP9gokAIDx +wAzyCiHAD+tyiiBNAoojjg2VBa/3uHNyD0//Xg7v/wLYz3ABACA1jg4v/AHZ0cDgfuB48cByCa/2 +BtgKCg/5z3CAAIgqSiQAAAAYAAHPcIAApDUDgBiIhOAL9AohwA/rcoogzA3q2z0Fr/e4c89wgABo +VG4OQAcI2J4LL/kG2c9woAAsINCAz3WAAEhKIIUCJkAQ13AAACBOBvbOCi/5B9jApc9wgAB43waA +USAAgLgKIvnKICIC3glgBgDYVQGP9uB48cDhxX4JL/kI2M91gAAcCwCFh+DMICKCPPLPcYAASEpB +gYDiBvLPcqAALCBQgkChz3KAAHjfRoJRIgCAKvKE4MwgYoEY9M9ygADARgKCgOAH9ACCgeAe8gOB +gOAa8gDZz3CAAOTAKaAqoADYogiv/4y4EPCA4MwgooEM9AOBgOAA2gfyz3CgACwgEIACoUOhIIWH +4cwhIoJU8s91gABISgGFgOAE9AOFgOAk8s9wgACwMwCQgeAB2MB4DLjXcAAAABAY9PIM7/8B2M9w +gADARgCAgeA29AOFgeAYC+H4yiBhAAOFgOAMC+H4yiChACrwgOEO9M9ygADkwAqCCaIA2Aqiz3Cg +ACwgEIAGos9wgACwMwCQgeAB2MB4DLjXcAAAABAQ9M9wgADARgGAgOAK9IoghQauCCAAAtoKCiAA +AtgVAI/2z3KAAEhKAYKA4ADZBPQDgoDgA/IB2VMggMEEogHawiKBAADYgOHMIiGAA/IB2OB/D3jg +ePHA4cXPcYAA5MBEiYHiANgP9ASpAd3PcIAASEqqoKrZz3CAANhJrgggACOoqXCxB0/24HjxwOHF +z3GAAOTARImA4gDYD/QB3aSpz3GAAEhKCqHM2c9wgADYSXoIIAAjqKlwfQdP9uB44cXhxs91gADQ +RsAVAxa/40f30mvUfr5mAKYhpkKmAWvFuMAdGBDBxuB/wcXPcYAAgEoNiYHgGfTPcIAA2EkAkOm4 +0SCiggj0ANgOqQ2pTQOv/w+pAdgOqQ+JQiAAgGkCr//KIGIA4H7xwJYOT/Y+CY//z3OAANhJAJPP +coAAPMFBKIEAwLkhqs9xgACwMyCRgeEB2cB5DLnXcQAAABAN9KKDz3GAACxKoKGhg89xgABISqeh +NvDPcYAAwEaggYHlEvTPdoAA5MAkjoHhBfQljoHhAdkC8gDZgOHKIYIPAAAQJwP0IoOB5c92gAAs +SiCmEvTPdYAA5MAkjYHhBfQljYHhAdkC8gDZgOHKIYIPAAAQJwP0IYPPdYAASEonpalxz3WgACwg +0IXlgQImzRP/vQL0xaHmgQImzRP/vQL0xqEog4DhBfTPcYAAeN8okSOiJbjAuEoN7/gD2Q0GT/bg +ePHAz3GAABwLABEEALhwz3KAAJhKQCyAABZ4FSBAAQBiheAK9AohwA/rcoogjQB1Aa/3dtuC4AAZ +QAFg8oTgHvTPcYAA5MAAgYDgWPLPcoAAEMEAogiBCKIA2AChBKHmDe/4CdjeDe/4A9jPcIAABFhu +CkAH0cDgfoHgEfQSDaAFANgLyAQggA/+//8DCxoYMAvIh7gLGhgw7vHPcIAA8DsEgFEggIAQ8s9w +gACwTQCAgOAK9MYLr/2Q2IHgBPQGCEAEDvAA2p66ANnPcKAA/ERBoOB4IaC6DKAFKHDPcIAApDUD +gBiIhOAF9G4MD/2A4AT0JgyAAsDxvvHgePHApgxP9s91oADALzqFz3KAACxMAILguDz0gLgAos9w +gABUwceAwL6B5gHewH78uQXyEIVRIACAA/QA2ALwAdiA5g94IPIwhVEhgIIO9EAVBBBMFQUQCiHA +D+tyiiBMCUUAr/eKI4UGgeAI9IogEAERpZILYAkK2IogEAASpYYLYAkF2M9wgABcQSCAYHnJcIEE +T/bPcYAAwEZAgYHiE/TPc4AA5MAEi4HgBvQFi4HgAdgD8gDYgODKIIIPAAAQJwX0z3CAANhJAoCB +4s9zgAAsSgCjEvTPcoAA5MAEioHgBfQFioHgAdgC8gDYgODKIIIPAAAQJwb0z3CAANhJAYDPcoAA +SEoHov0F7/8DgeB48cDPcAAACByGCW/+ocH/uA3yz3CgACwgEIAE2XzaPdtAwItwyg1gBRe7ocDR +wOB+4H7geOB/AdjgfuB48cDhxc9xAwBADc9woACoIC2gz3GgAMAvFIHwuBSBDPIEIIAPCAAAANdw +CAAAAAHYwHgH8IYgfw+C4AHYwHiA4F/0FREAhqC4FRkYgBHwz3CgAKggDYDk4M91oACsL4/3HIX5 +uEf0DHSEJMKfQ/QWCm//WtiA4O3zQ/CKIIkDPgrv/YohyQnPcaAA1As7gS4K7/2KIIkDLHEiCu/9 +iiCJAzmFGgrv/YogiQOqCG/+JNgIcQoK7/2KIIkDmghv/oogCQMIcfYJ7/2KIIkD63WGCG/+JNi4 +cM9woADUC2wQBACKII0KCiHAD6lycQZv94ojiQvPcaAAzCsSgYC4EqHRAk/24HjxwFoIIADhxR4I +IAAIdeYIIAAIc3B1yiNFAxBzrQJv9sogxQDxwOHFocEA3UDFQgjv/ItwguCKIP8PDPLPcIAAuFkD +gCCAAMAieIDgyiBMA3kCb/ahwOB48cChwQDYQMDPcIAAPMEhiIHhi3AR9M9xoAAsIDCBz3KAAEhK +SIJCeddxTgAAIMX3JgjP/APwAgjP/ILgBvSKIP8PocDRwOB+z3CAANhZA4AggADAIniA4MogLADz +8eB44cXPcYAA/DMkgSCBz3OAANhZQ4PVuaCCRoOKIP8PgOIF8gKConhIIAAACSBAAGq4SCAAAOB/ +wcXPcYAA2FkLgUCADoGA4MoggQ//////CvICgEJ4SCAAAJkgBgBIIAAA4H7gePHAKglP9qHBCHfP +cKAALCBAEBIAz3CAAFDDX4AA3UQnAROI4UEqgAEacoYg/i9KIUAgwiFCJMC4QS9CE8C6z3aAAEhK +FiYDEEGjiOHMICGACfQBhoDgBfJWDw/8A/DKDg/8z3CAAKQ1A4AYiIHgBvTPcoAAENcZ8KYIj/2A +4Dfyz3CAAOw4CIiH4DH0z3CAAFDDmBCAAM9ygAAQ1wK4FngAYu24I/LPcIAAUMOYEIEA7L8SaRZ4 +GmIT8gCCiLgAogHYD6rPcIAApDUBgMAQAAYRIECAzCGig9AMQgkH8JYNYAmvqoDgHA1CCc9wgAAc +CyCAh+HMISKgOPJMIACgSnAz8oDhCKYJ9M9xgADkwAqBAeAKoRrwRhaAEIHgFPTPcO3+vrpAwItw +BNl92j3bZgpgBRe7Rh5CE0UeQhOWDG//Rx5CEzIJj/gHhiaGQnACIEIA/7oC9AamTBaAEIHgBvRM +HkITAvAAph0Ab/ahwOB48cDGDw/2CHbPcKAALCDwgIfmAN2M9gohwA/rcoogDQKKIwkDmHWlA2/3 +uHOG4Rvytg2P/89wgABISuigz3CAABwLAICA4Mwg4oEJ8s9wgADARgGAgOCACIH4z3CAANhJqaDP +cIAALErPcYAAwEYggfAggAOB4fhgBfTPcYAA2Empoc9zgABISiWDAiBCAP+6AvQFo5kHD/bxwOHF +CHUE2c9woADIHCig6glv9hbYz3GgAMAvE4GA5c8g4gLQIOECE6GA5TzaBvTPcIAATB9AkM9wgABM +HwGQELhFeMAZAABdBw/2z3KgACwgUIIies9xgAAgCxV5AIEQcsz3z3CAAKQ1AIDEEAAGUSBAgQLy +QKHgfuB48cC2Dg/2AN7PcKAAtA+8gJIOYAXJcM9ygADclwSSz3GgAOwnELiFIIQABqEFkhC4hSCN +AAahB4LPc6cAFEgHowiCEKMDgs9zpAC4PZsbGAAEgqYbGAAFgpIbGAAGgqMbGADPcKQA7P/GoIog +igAGoTIOYAWveM9wgADwOwSAUSCAgNQJogfKIGIAmQYP9uB48cAmDg/2z3CAAGxBIIDPcAAAmM4Q +caHBQPTPdYAA9DMAhQHggeAApQDeCvQB2c9woADIHDGgTg0gCShwi3GeCS/3ANgAFAAxCHKGIvwP +RrpEIAMMRLtEIAEDguJCucG4E/SC4wT0gOEP9AjwgOEG8oHhzCAhgAn0z3EBAEJpz3CgAOwnJqAA +hUIgQIAApQb0z3CgAMgc0aD5BS/2ocDgeADYz3GAACA8A6nPcIAAGApHgAKAQqkc4FZ4RIhJqQWI +4H8KqfHARg1P/YDgM/LPcIAA7DgskM9wgACkNR6QEHEp8s9wgACAQmiISohEKz4LACGAf4AAEEJV +eAaIz3GAAIRBgeAX9ACBirjSDW/9AKGA4CAL4gbKICIAz3KAABxZBoIDgCCAx3EAAAAoqgogB0hw +0cDgfuB48cDqDA/2z3GnABRIAN2ooQeBz3aAANyXB6YQgc9ypwA0RAimp6HPcPMP//wQoaDYtqGa +uPUaGADPcaQAuD2bEQAGz3eAAPQzA6amEQAGBKaSEQAGBaajEQAGBqb/2JsZWAOmGRgAkhkYAKMZ +GADPcaQA7P/PcAAA//+noQahAIcB4IHgAKcK9AHZz3CgAMgcMaC6CyAJKHAE2AoIL/dAJgESDdj+ +D+/2QCaBEs9wKAACAc9xoADsJwahiiCNAAahAIdCIECAAKcF9M9woADIHLGggQQP9uB48cASDA/2 +USDAgQ0SDzbPc4AAAMIDEg02z3GAABDD9HsRixAThAAS8gHgCHIyFYUQZ5ECGQIBz3ZBAIMAZrHP +c4AAlFIDqRHwQCRCADEVhRBCqcATAwEDqc92IQCCAGaxz3OAAJhSsHLH98ShAIMB4ACjBIFU8M9z +gAAgwutjAePBhWSpUSYAkQDacI068i8lCADvf0knxBDya89wgAAQ1/Z/4GD2uNKNB/LPcIAAUNl2 +eAGIAvBIcAAkjw+AAFDZdn/kjwgmzhMIJgAQoHBJIM4DFmvVeM92gADQ2gBmz3aAAFDadn5hhs92 +gACkNcSG2IbFewQjgw8AAAAIZngD8AOFAqGYFYAQaIkQcwXyRKlg2Bi4A/AA2J24BKFdAw/28cDh +xQPIpBAAAFEgAIDPcIAApDUEgATyG5AD8BqQegqAB4DgOvTPcKAAFAQD2SOgINgMGhwwz3GAABxR +FoEB4BahA8gA2pgQAQCkEAMAlBhAAJ4QAQGsu5IYRAC+EAEBrbuAEA0BpBjAAJAYRAB+EAEBgBiE +AD1lsBABAaJ5MHmwGEQAghABAX4YhACGI+WPshhEAIQMAv3RAg/28cBWCi/2CHMQiTMRjQAB2kCr +DRIPNs92gAAowu5mz3KAAFjCSNzBqw0SDzYCIg4D9CbOE8GzDRIONvAiggNBo0GBUSIAgRDy0onP +coAAUNkWetyrQIqGIn8MXHoEukV+3KsE8IDaXKsEuAV9vasckc9ygACgwg+zDcjwIgAABLMHyAWj +VBEAAQyzAJENs6ARggBIowbIBCCADwIAQQDXcAIAAAAD9Ii6SKMGyIYgvo8D8om6SKOcEQABz3OA +ALRaJrjAuEAoAgMPgcC4DbhFeO0BL/YAo+B44cXPcAAA0CvPc4AAZAoBo89wgAAMqQCjz3GAAAjg +z3KAAIRaAIKggaCgAIIc3aCoBGkBolUhQAQDohjYAqJVIcAFBaIBgQSiaHADoQKBjbgCoeB/wcXg +ePHAHgkv9hzaGnDPcIAAMgsAiM92gACcWgohgC+AAEjIhCgfACCGACFELs91gABMxUChACVBHgAl +Qh4ogUAiAwcAJUAeTyFPA+iiAohRIECAYaYF8oO5jbkoos9wgADQCwKjGNgCps9wgABQCwCADB4A +Ec9xgAA4C3oJL/oggQDZz3KgACwgUIKA4GGGSqPE9lhgCqPPcIAAMgsAEIcAhC8fACd1Qo1RIkCA +L3BY9EwgAKAL9M9xgACEyBthz3CAAEQLYKBK8M9ygABEC0CCQYpEKL4ox3CAAGjFF+BAIoQAMiBC +Di8kBwHPcIAASAsC4k96gOIAEIUAQAAsAAIlgwCELx8AL3AAIU8OACeGH4AAaMVEKL4oQCaPBTIn +Tx47Y8dzgABAyAjjG2MB4S95UHHgqwIlgwCm9oQvHwAAIUAuG2PPcIAARAtgoA6VAiAAAQ61DpVY +YA61ZaYH8M9xgABgyDhgBaYOlRUAL/YEpuB48cCmD8/1CHYAiIzgz3WAAIBDaBWBkKT0gOEH8gOO +aRWCkBByo/KA4VwOgvkB2GgdApAhjoLhyiAhAMwh4oNc9GsdApAjjoDgaR1CkCSOah1CkM32BW6p +cYIhQgP6DOAFDdpzFYCQbB0CkGsVgJCC4A30QCaAFKlxgiFBD9oM4AUN2oMVgJBtHQKQaxWAkIDg +2gAuAADez3CAAIxZBoADgOCAFG4AIJIPgACEQV4SEyZyd14ADgACJ9AUXRIRJgpwkggv9ipxBSk+ +IFwSAiYCIEEuUHHAIGYAz3KAAPNCNG4qYowiw48S9CpxBSk+AAAhwXQJ8JzhAtik8wDYaB0CkDXw +4nkA2BrwjCDDj8P3anH58VBwUPcqcQUpPgAAIcF04nkCek96ACaAH4AA7EJAqADYBPAB2ADZgOAL +9HDcAiUAE0QuPhcncCIM4Ab5YWsVgJAB5hB2QgfF/wnwgOEH8gDYJg2v+WgdApCVBs/14HjxwBII +IAAC2PoJAADRwOB+8cAyDu/1SiQAcgh3z3CAAKQ1FSDQAwAQDSAA3slw2qWoIEANz3GAAGxo9CEC +AM9xgAD4qRR5QLHPcYAAfGr0IQIAz3GAACiqFHlAsc9xgAB8aPQhAgDPcYAACKoUeUCxz3GAAIxq +9CECAM9xgABQqhR5QLHPcYAAZGr0IQIAz3GAABiqFHkB4ECxCIXluAXyBNk0pQLw1KXkuAfyCdlG +HUQQLtoF8BTZRh1EEDLaW7VZjVEgAIBZYTB5Rh1EEBrhOrUK8grYVB0EEAbYVh0EEAfYCPAQ2FQd +BBBWHYQTBdgPpZYL4APpcDyNKHBEHUIQhiADAOa5WB0CEMoiQQAM8lAhwwFvekQdwhBQIMMBb3hY +HcIQ5bkI8khzhiMDAG96RB3CEOS5BfKluFgdAhBRIcCABfKkukQdghCC5xXy3gkv+elwABAAILkQ +AAZRIECA8djAKCIByiCBDwAAkwDAKCEBhB0AEBjYjbgTpQiFUSDAgM9wgACkNQXythCAAIm4A/Cd +EIAAEqXPcKAArC8ZgM9xgADwOzC4wLjCDaAIBaEIhQQgvo8ABgAAC/I2uMC4G3gB4FodBBAC2Bql +A/BaHYQTANgXpRilZghv/elwKIUB2khzQSkABTW5UiAAAFIhAQDAuMC5tgzv/ZhyqQTP9fHARgzv +9QfYz3agAMgfSB4YkM93gACkNSOHz3WsANQBGoFMHhiQguAC2Mog4gDQHQCQiiAEAA+mRhEAAbAe +ABBGEQABtB4AEB/YCLgOpgiBUSAAgADYi7gK8hCmRg5P+M9woACkMAGAhLgK8BGmOg5P+M9woACk +MAGApLjPcaAApDABoc9wgADsWgCA4LgK8oYg/w4iuBS4z3GAACwJC6GSCE/4Lg5AAboKwANCC8AD +z3AAAFVVWh4YkAHZWR5YkM9wpgAoAC+gA4daEAEBz3CmAOgHJqDmCc/8A4fiCmAFDZAA2IwdGJAH +2I0dGJAA2IsdGJDPcIAAZEEggGB5BNiA4A7yz3GAAAwtGoE7gSR48bgG8iIL4AAC2AXwzg4gBwHY +z3KgAMQnDxIAhmOHRCABAhuDDxoYgA8SAIajuA8aGIAPEgCGBXkPGliAPIPPcKAAMBAkoM9wgABQ +wxB4jxoYgM9wgACgns9xgACgrhB4ELkleJAaGICKIAQAkhoYgB2DQBoAgM9wgADcNFMaGIAPEgCG +n7gPGhiAANgQGgCAHoMcGhiACQPP9eB44H7gePHAz3CAAMCXGBAEAAohwA/rcs9wAADlDt7bgQbv +9kolAADgeM9xgADAlwWB4H8GofHAz3OAAJw1JItTIMUATCWAg1IhAQAkq8z3CiHAD+tyiiDIAYoj +yQ5BBu/2SiQAAM9ygAAQLxUiQgEjigQgvo8ABgAAxbkjqyKKxbkiqwj0AYrFuAOrAIrFuAKrAYtG +IMAPAatODK/9aHDRwOB+4HjxwPIJz/XPdYAAaCxCFQER4LnAjQfyyXCGIP4PQSi+gQP0BN8L8Klw +sgxv90jZjglgAAHfQhUBEcCtRCEAAUEovoAH8kKNz3CAAPwrQqhEIYAALyYC8BDyRBWAEM9ygAD8 +KwSiRhUAEWgaBABFFYAQahoCAEQhAAJBKP6ACvIMjc9ygAD8Kw6qDY0MqgONDaoocIYg/g9BKL6B +CPIiDCAEQBWAEEIVARFEIQAEQSg+gQbyQYXPcIAA/CtBoEQhAAhBKH6BBvJChc9wgAD8K0KgUSEA +gMogISA98iCNz3aAAPwrRCEADoYh/Q8nuUO4ax5CEA+uAK7PcYAAwCsJgf4IYAArgSCOh+HMIaKB +ANgf9ALYD65CFQARhiD9D0Eo/oEL9IfhAd/CJ8ET+3/pcM4Ob/hAJQEUughAAADYz3GgAMAdCKEE +2AmhAdgacACNwLgBrkIVABGGIP0PQSj+gQfy6XCaDm/4QCUBFM91gAD8KwIVhBBoFQURahWGEACN +IY1BhbYJr/hihc4Nb/hAJQATTCBAoD70z3WAAPQzAIUB4IHgAKUJ9AHZz3CgAMgcMaCmD6AIKHAA +2I4Mr/iOuAh3LrjAuAS4TyDBAM9wgAC4TQCIz3agAOwngeAB2MB4B7gleBC4hSCRAAam2grv9QHY +gL/mpgCFQiBAgAClBvTPcaAAyBwA2BGhzgmv+ADYCPAMyIi4DBoYMCYMz/U5AM/1gODxwDTYB/TK +DY/9UCBBBAXwwg2P/U8gQQT+Da/9NNjRwOB+gODxwPTYCPSmDY/9UCABAPTYB/CaDY/9CHH02IC5 +1g2P/dHA4H7geM9xoACsL4DgFYHQIOIBzyDhARWh4H7gePHAUgmv+A94CNjRwOB+4HjxwIIKj/gI +2NHA4H7xwOHFCHXPcAAA//9CCAAAANhyDSAACHHOD+//qXCxB6/1CNjxwD4Nz//PcIAA/CsAiILg +CfTPcIAApCwDkIwgw48A2ALyAtjRwOB+8cAOD4/1AN2pcAYPIACpcc92gAD8KwOOgeAa9AGOgeCj +rg30ggzv/6lw3g5P/T4OoAgC2E4P7/+pcMoOAABmDiAAtK4A2PIMIAAIcS0Hr/UI2OB48cC2Do/1 +ocFGDiAACHfPdYAA/CsBjQHegeDDrQ/0Eg/v/8lw8g2gCArYig5P/X4Nb/0A2B4M7//pcF4OAADU +rc91gAD0MwCFAeCB4AClCfTPcKAAyBzRoL4NoAgB2ItxDgqv9oogiA8AhUIgQIAApQb0ANnPcKAA +yBwxoAAUADEnuMC4XgwgAAHZCNiRBq/1ocDgeOB/CNjxwBoOj/XPdYAA/CsWFQQRGnBMJACAFRWF +EAX0TCVAghD2TCQAgAXyTCWAgor2CiHAD+tyiiBIAOkB7/aKI8oPTCQAgBTyANgPIEABBCAAAQu1 +UgggAKhwQCUAGqYIb/dA2UAlABaeCG/3ENleDu//CnANBq/1CNjxwM9zgAD8KwIThABoEwUBahOG +AACLIYtBg84Ob/higwjY0cDgfuB48cBuDa/1CdkA3w8nDxDpdIQkiZI6cEoigCIO9AohwA/rcoog +yACKI8cHCiRABFUB7/a4c891gAD8KwuVQCUQFgsgwINAJQ4aBPR9Ba/1KHAGIMSDFh0EEVbyANkK +JIB0KHKoIMADESRAgAny8CZDEHByyiJFIMoixQAB4S95TCKAokX2TCIAoAv2CiHAD+tyiiCIAGVo +7QDv9golgAQVJZMUFRWFECgTAiDwJkERMHLO9wohwA/rckAqDSKKIAgAiiPIA70A7/YFJUUD8CZA +FBByQgAGANYMb/jFv89wgABoCSKQ5nkisADZDyGBBEKQxblFeSKwMiCAJA4Lb/goEwEgCfCmDE/4 +ANnPcIAAaAkisEpwTCFAoAnZyiHhAADaFSZOFECmACERJAAZgiAVrY3x4HjxwEIMj/UA3Q8lDRCp +dIQkiZI6cA30CiHAD+tyiiDIAIojhgQKJEAEJQDv9rhzz3aAAPwrS5ZAJgUaBCJAAxB1QCYEFhLy +z3CAALQsMiBPBM9xgAAkFkQngBMdePAhAQCA4VMnAxAF9AnYOQSP9RUmUBQoGEAggOIAJEwEYKwL +9FMlQhHPcIAAaAlCsBUeQhQU8BWO8CUAABBx1PfaC2/4FR5CFM9ygABoCSKSUyVAESV4ArIoEAEg +Ggpv+FMnABBMIUCgAdjCIAEAA7grlgHgJX2rtsvx4HjxwHILj/XPcoAAXE5iks91gAD4YUCFpMFA +wkKV2BEEAM91gAA0YwQchDBAhULCQpUMHIQwtIBcgbFy2HKD9wIiRgNTgLeBUHXCJYYQz3KAABRP +BhIFAcgRDgD/2gi6RH4ovgAchDPMEQ4ARH4ovgIchDPQEQ4ASiTAcMR6KLoEHIQw7BECAAgchDDw +EQIA9BEBAAochDAMHEQwANpIdqggAAQD2REhgIMJ8hQkgTPgkQgiwgMkkQkjQwAB5gAlgREFKYEP +AwAAIC9xBS0+ATdxRfeMEAEAAeEC8ADZsICMGEAAVSDOBVMlwRAUJkEQQLFcEAIBSiQAdADfqCBA +AvQmwRMwcsoiSwAB51UgwQeQGIQAwr0UIU0DYLV8EAMBSiQAcgDaqCDAAfQhjQAII0MDAeIG43B7 +khjEAKECr/WkwPHAMgqv9Zhwb38Dv6Rvz3CAAFxOtmCib7VgieMG5/BgBvTqkYwnApjKIGsAgeIK +9HR5QZEdZbFyj/YCekGxCvCC4gv0dHlBkVhgEHaF9gGxAdmYHEIARQKP9eB48cDaCY/1CHUods9w +gADELJoOL/ioqIIIYAWpcIDlDfSGCg//geYJ9ATaANnPcKAAwB1IoCmgEQKP9eB48cCeCa/1ANkI +dQGIwriB4GP0z3aAAPwsAYZBhQcgvoAO9ACFQIYEIIAP//8AAAQigg///wAAByI+gE3yANjPcYAA +xCwKqQKN5bgP9M9ygACcNUSKkOIB2sB6RHhRIACAA/IB2AqpAo2GIP8MQrgJqSOOA43AucC4EHEo +8oDgIvIEjUWNxbhTIkEAhiL/DEK6hCiTCAokQI5ZYYQpSQwAIQVxzCUigAv0CiHAD+tyiiAIAe0E +r/aKI0gDiHCocQTwANgIcdoIAAABhQHZAaYAhQCmAd4f8ILgA/IA2Rrwz3KAAAQtAYJhhQcg/oAO +9CCFAIIEIYEP//8AAAQggA///wAAByB+gOvzYaIAhQHZAKIA3oDhCvIBhc9xgADELAGhAIVODS/4 +AKHhAK/1yXDgeADZz3CAAMQsKqgoqCmoK6ghoCCgz3CAAPwsIaAgoM9wgAAELSGg4H8goOB4BdjP +cYAAaCwCqQHYA6mKIP8PAaECoQzY4H8Mqc9ygABMVAaCA4AggMdxLQDAxsUFYAZIcM9wgABMVEUF +QAbgePHA/g9P9Sh1z3aAAMArK6aU4QmmAN/F90IlABUC8OlwCqbJcA2myXC6Ci/3INmA5c9xoADA +HQjyz3CAAFAsF4iB4A30BYG1uLa4BaEFgQWhfggv/yMewhMM8AWBBaEFgZW4lrgFoQHYMggv/yMe +AhD1B0/18cCKD0/1dIBcgdgRDQBwcsIixgD3gTOAMHfCJ0YQAtvPcYAAFE/0IcQABhEFAQDZLqD6 +YgUqgg8DAAAgL3EFLH4DN3GMEA4AwvduoAUtfgM3cU33kBABAZQQAgEC4VBxg/bk5sP3AdkuoIkH +T/XgeOHF4cZ0gFyB2BEOAAIixABTgDeBPBAHAIwQCAACIYUAz3GAABRPAtr0IYoABhEJAc91gABc +TkKVYZUKEQYBkhABAaOVCCNDAAAlAQEFKYEPAwAAIAokQA4FKr4TDCRAjtb3KpCMIQKI0vYC2S+g +kBABAX5llBhEACGQMHZsAAoAonkhsAHZmBhCADDwBSm+EwwkQI5W90wngIAU8pAQAQGUEA4BAuEw +dgT2jCABmcr3wZAB2d1lsXIvoJj2obDl8UwngIAM9KGQACbBADB1yPYCJY0RobAB2ZgYQgCQEAEB +lBhEAADZL6AJIsIAIZAwcoX2QbAB2ZgYQgDBxuB/wcUiaADaQLBKJMB1z3CAAFxOqCCAAhYggwBg +kxQhjAAB4k96YLTgfuB48cDyDU/1coDIgdgRAgBwdsImxhBxgCOBcHHCIcYAAN/Pc4AAFE/0I8QD +Ad3ZYQUpgQ8DAAAgL3EFLL4AN3H0I0MD7aDE9wLZLaAH8AUrvgA3cUP3raAFBk/14HhIgVKgQ4FR +oFyBVKA3geB/M6DgePHAhg1v9QLbCHUodgHYALGpcEIL7/9NhU2FqXDJcTYL7/8D202FqXDJcSoL +7/8F202FqXDJcR4L7/8G206FqXDJcRIL7/8J206FqXDJcQYL7/8E250FT/XPcKAALCAQgM9ygADk +wAWiz3CAAAypCIBRIMCBANsM8gSKgeAE9CWKgeED8gHbgOMgggjyAIKB4MwgIoAT8hDwgOER8oHg +BvQFioHgAdgD8gDYgOCMBoL3geEF8gLY4H8AouB+8cDKDE/1z3aAAPQzAIYB4IHgAKYA3Qr0AdnP +cKAAyBwxoAYMYAgocM9wgAC4CiCQhrkQuQUhgg8AAMISz3GgAOwnRqEBkBC4BSCADwAAAhMGoQCG +QiBAgACmBvTPcKAAyByxoNEET/XxwGIMT/XPcIAAnEMZgADdgeDKIcIPyiLCB8oggg8AAKgTyiOC +DwAAkAHKJEIDNACi9solQgPPdoAA9DMAhgHggeAApgn0AdnPcKAAyBwxoG4LYAgocM9wgAC4CiOQ +BJDCucK4A7gleBC4hSCNAM9xoADsJwahAIZCIECAAKYG9M9woADIHLGgRQRP9fHA1gtP9c92gAD0 +MwCGAeCB4ACmAN0K9AHZz3CgAMgcMaASC2AIKHDPcoAA3EQAis9xoADsJxC4BSCADwAAwmkGoQGK +ELgFIIAPAAACagahAIZCIECAAKYF9M9woADIHLGg4QNP9eB48cBmC0/1CiAAoM91gAD0XgAVBBAr +8kwkAIDPcKQAuD0A2hr0mxADBs9xgAD4XmChphADBs9xgAD8XmChkhADBs9xgADsXmChoxADBs9x +gADwXmChmxiYAP/ZphhYAJIYWACjGFgAAdg08EwkAIDKIcEPyiLBB8oggQ8AAH4ZyiOBDwAA/ALo +BmH2yiUBBM9wgAD4XiCAz3CkALg9mxhYAM9xgAD8XiCBphhYAM9xgADsXiCBkhhYAM9xgADwXiCB +oxhYAM9wgADwOwSAIrjAuIoKgAT1Am/1AB0AFPHAhgpP9c9wgABkQSCAYHkA2IzgFPTPdYAAbEEg +hWB5AtiA4Az0IIVgeQPYgOAI9FoIb/1Q2FEggIEE8gDYA/AB2C8hByDPcIAASEzPdYAAfEH6DS/5 +AKXPcYAAkFIUgQHgFKHPcYAA9DMAgQHggeAAoQn0AdjPcaAAyBwRoXIJQAjPcYAAGEQEgYHgFfQm +gc93gADIs2B5ANgYj4Dgz3agAOwnF/TPcAEABgEGps9wEgAGBBbwCiHAD+tyz3AAAIcZiiPFCUok +AADJBW/2CiUAAc9wAQAHAQamz3ASAAcEBqYgh4DhA4cI8qCFRCi+Ayd1xtiSuBnwRCi+AwAhjX+A +AAhrx9iSuAamz3AAAAIzBqbPcAAAgkwGps9wAAACZgamxtiVuAamDgwP/hiP1gqgBCCHTCEAoBXy +z3AAAAJuBqbPcMEAQm4Gps9wAwDCbgamz3A2AEKXBqbPcAIAQmsGps9wEACHcgamBY0QuAUggA8A +AEJwBqYEjRC4BSCADwAAgnAGpgONELgFIIAPAADCcAamAo0QuAUggA8AAAJxBqYJjRC4BSCADwAA +QnEGpgiNELgFIIAPAACCcQamB40QuAUggA8AAMJxBqYGjRC4BSCADwAAAnIGpgGNELgFIIAPAABC +cgamC40QuAUggA8AAIJzBqYKjRC4BSCADwAAwnMGps9wAQBGagamz3WgAMgfpBUQEEwhAKAK8s9w +UADGcwamz3AgAMdzBqbPcIAAxnMGps9wQABCdAamz3CAAMdzBqbPcAIARmoGps9wEADGagamWI8A +jySPgOIB2sB6ng2gB3mPJNgY2aYPIAgz2oHgE/LPcIAAkFJQEAQADBcFEAohwA/rcs9wAACKGQUE +b/aKIwcHTCEAoAbyz3AGAEJrBqbPcBAAx2oGps9wEACGcgamTCEAoAXyz3ACAEZqBqZmC8AHigrA +ByTYAdlCDyAIM9qB4BPyz3CAAJBSUBAEAAwXBRAKIcAP63LPcAAAqiihA2/2iiPHDKQVABDPcYAA +kFICIAAEE6HPcAIAR2oGps9wZQDCbgamz3CAAPQzAIDPcYAA9DNCIECAAKEF9ADYUR0YkLEHD/Xg +ePHAQg8P9c9wgACcQxSAgOCL8i4KL/4H2Hpwz3CAAGxPDIiGIP8BQ7hhuIbg9AANAM92gADIsySG +z3KAAPixMyYAcIAAVGBAIhELBLk0eUAiEApAIhIGQCIPCEAiDQQ6YkAnAXIUeQB5z3GAAERFSHBV +8M9xgABkRQRqUfDPcYAAhEVAIgACS/BAIgADz3GAAERFvg7v/QDaBIbPcYAAZEUEuBR4uGA78EAi +AAfPcYAAREWeDu/9ANoEhs9xgACERQS4FHj4YCvwQCIABc9xgABkRX4O7/0A2gSGz3GAAIRFBLgU +eEJwG/BAIgAJz3GAAERFXg7v/QDaBIbPcYAAZEUEuBR4AnBKDu/9ANoEhs9xgACERQS4FHgicDYO +7/0B2h4O7/1qcHUGD/XgePHAz3CAAJxDD4CA4BDyz3CAAMizBIDPcYAASLMCuBR4OGDPcYAApEVi +Cg/+0cDgfvHA+g0v9UTaz3CAAMRqz3GAAKzBggsgBQDeAt0WCCAAyXBhvYDlAeY69z0GD/XgePHA +wg0v9QDaz3GAAKQ1FXlggQS4ACCQD4AATGe5G5gAAIEEEA8gz3aAAMRqvhjYA6CBQoaKIAcPYYYd +ZfAdgBDsHcAQIIFGhs91gACswWWGOGD4GIAAFibBE/QYwAAWJcATBOAE4SYOL/UI2gwQACAWfhZ9 +BG0kbhIOL/UI2qkFD/XgePHAPg0v9RLZqcEIdrIIoAeLcEokAHEA2qgggAIWJIAwKIiB4cP2Ybko +qAHiAsIBw891gACkNdV9AIWKIQcP9G7Hd4AATGc4YOwYwADwGIAAAIUGwgXDOGD4GIAAg8H0GMAA +BBcQEM9wgACswRYgAAQE4JYNL/UI2uOHz3CAAKzBh8H2eATggg0v9QjaAMAghbkZGAAghbkRAAZR +IACACfK+GdgDIIW/EQAGgLgH8L4ZGAQghb8RAAaguBYNb/y/GRgAgOAF9IYMT/yA4APyANgC8AHY +EHbICCEIyiCBAwCFuRABBlEhQIDx2cApIgHKIYEPAACTAMApIQFuCG/6hBhAAKEEL/WpwPHAPgwP +9c92gADgXoDhz3WAAHALEvIghoDhDfQApeYNr/cO2KYKb/6KIBAAAdgApg7wIIUleAvwpgyv9w7Y +cgpv/oogEAAA2ACmAKVdBA/18cDeCw/1z3GAAEhBAIGguAChYgkv+wHYz3CAAMCoABAEAEwkwIDK +Ic0PyiLNB8ogjQ8AAIEMyiONDwAA2gCwBy32yiXtAEwkAICqAC4AAN0UbQAggQ+AAMCoB5HGkeSR +ELgFfgWRQ5EQuAV/ApEQukV4GnCSCu/2yXFacM9wgADEcvAgQQNELT4XCiFALgAhgH+AAKRWIKBG +CK/6CnAIcQAhgC+AAJhW9ggABvF2hPeA5xn0z3CAALhy8CBBA0QtPhcvdgAhgH+AAExXIKASCK/6 +SnAIcQAmgB+AAEBXwggABs9wgADAqACAAeUQdWQHxf9JAw/14HjgfuB48cDPcIAAbEEggGB5AdiC +4AX0z3GAAKQcBvCB4Aj0z3GAAPQdz3CAABhEIqDRwOB+4H7gePHAugov9QHYAN7Pd4AAbEEgh891 +gADwwWB5wKWB4BfyguAu8oPgE/Igh+t2YHkB2Lhwz3AAALkZCiHAD8lyiiMQCX0GL/aKJIMPAIWY +uJm4AKUA2I64AaUD2MGtwq0OuAKlz3aAAHBBQIYG2GB6AtlAhgfYYHoC2QKNF/AAhZi4AKUA2MGt +wq2OuAGlAqXPdoAAcEFAhgbYYHoC2UCGB9hgegHZAY19Ai/1AK3gfuB44H7gePHAz3CAAFhaAICF +4HIABQDPcKAArC8agFIgAABRIACAL/TPcYAA3JcLgQHgC6HPcIAAWEEAgEB4XghAAM9wgABUQQCA +QHhGC8AAPg6P/S4ID/zPcKAAeEUAgAQggA9wAAAAQSg+hff1z3CAAKQ1I4BIgTSRUyIAAAoP4AIB +2y4Kr/cS2NHA4H7xwOHFtMEH2OoLr/cB2c91oAC0R3EVAJYEIIAPcAAAAEEoPoX19Yog/w9vHRiQ +ax0YkM9woACwHwGAhiD/AYDgAdjAeC8mB/D185YMb/iLcCoND/yA4A/ybxUElmsVBZYKIcAP63LP +cAAAsRMVBS/2NNsI2H4Lr/cB2c4PD/ieCEAEdQEv9bTAQIgB2AChaLoCulV6x3KAAJxDY4JjoWGC +YaFigmKhZIJkoeB/AKLgePHAzggP9c93gABcWgaHA4DPdYAA3JcggEmFACKADy0AwMYCeYDhggAs +AKHBz3aAAPQzAIYB4IHgAKYK9AHZz3CgAMgcMaDqD+AHKHCLcToM7/VC2ACGQiBAgACmBvQA2c9w +oADIHDGgABQEMQQkvo8AABf/yiHCD8oiwgfKIIIPAACmE8ojIgxIBCL2yiUiAACFgrjKDiAAAKUm +CCAAAdgAhaK4AKUphcdxLQDAxtYN4AXpcIEAL/WhwOB48cDqD+/0ANrPcYAAOGIAgbvBV8AEiUok +AHJ4wM9wgACkNQOACIDAuEDAXxSAMM9xgAAMLUHAOMBCwF4UgDBDwBqBO4EEeTG5wLmoIIACANsA +JIAwZBjCAAHiT3rPcIAA3JdikM9wgAAQCkCQUHMx9M9zgABsTw6Lz3WAANyXhiD/ASgVjRBDuAIg +QIOvi3CLyiBiAIYl/xHbbc91gADclykVjRCGI/8BDiWNk8olYhC7faV4u2vPc4AA3JcqE4MADiND +g8ojYgACu2V4AvAH2IDgyAUhAEXAz3CgALRHRxAAhoDgzCEigLAFAQDPcIAA3JcAEAQAUSRAgMoh +wQ/KIsEHyiCBDwAAqhPKI4EPAAB2AAQDIfbKJSEAz3GAAGxPDonPc4AA3JeGIP8BQ7goGwIAD4mG +IP8BQ7gpGwIAEInPcYAA3JdCsYYg/wFDuCoZAgAA2Z65z3CgALRHUxhYgOB4ANlTGFiAwgnP/s92 +gAD0MwCGAeCB4ACmCfTPcaAAyBwB2BGh7g3ABzfAz3egAOwnELgFIIEPAABCLSanBSCBDwAAgkYF +IIAPAABCYCanBqfPcAgAhxAGpwCGQiBAgACmB/TPcaAAyBwA2BGhAMHPcIAAuKo2eGSAQIDPcQ8A +APwKuyR7ybples9zpwAUSE2jRYABgAq6RHnJuAV5LqMaC4/9RsAAwIDgD/KKIf8Pz3CgALRHbxhY +gGsYWIAH2GYIr/cD2QDYA9lEwFHBSMDPcYAABJgIYYjgbgAqAEfACMEFwBEgQIDEAwEAB8AAJAEw +ZBGBAIHhtAMhAINwAdlkGEIAB8HPcKAAtEdgGFiAz3CAAERMIJAocIYg+w+MIASAAdjAeIHgHPTP +cKAAwB0HgAQhgQ8AAAA8hiD/DiK4CrgleBDwHBQEMAohwA/rcs9wAACrE6TbXQEv9kolAAAH2Aq4 +B8LPcYAApDUjgRC6m7oyIYEPAADYAp+6gOEB2cB5D7lFeSV4z3GgALRHXxkYgM9woAC0R3EQAIYE +IIAPcAAAAEEoPoX19QLZANg6cAfAESBAhOoCIQBQwc9wpwAUSFwYQARMIQCgF/JMIUCgBvSKIMQ2 +iiGEOBPwCiHAD+tyz3AAAK4o19tKJAAAyQAv9golQASKIII9iiFCPwHBAsAieEnAB8DCCW/7KnEa +cAfAWghv+ypxSsAAhgHggeBKIgAgAKYJ9M9xoADIHAHYEaHiC8AHQChAIRB4ELiBuIe4jLgGpyCG +QiFBgAb0z3KgAMgcANgRokokACGKdUAggDEQeEvAQCGAMRB4TMBAKUAhTcAKIIAkAeGB4WG9IKYI +9M9xoADIHAHYEaGGC8AHA8EVbQAlFhYvJoglJXgQeBC4hSCKAAanQC6AIYG4l7gAJVMWBqcvI8gk +QCuAIYG4l7gGpwvABriBuAanDMAGuIG4BqcAhkIgQIAApgb0z3GgAMgcANgRoZLAk8GUwpXDZg8g +BVYkxDI2wIDgCfQAIYEvgADgUhCJAeAPeBCpAMCA4Azymg/P+4HgCPQA2HbABMCAuA94RMAAwM9y +gAC4qgO4FSBABBliGmIMgiiBEsJOwA3AtngAIJUPgAAUmBPA8B2AIPQdACAJwIgifAAvJwAgBC++ +IF4Lr/ovcA4ggQ8AAAABT8ETwIggfAAEKP4FL3BCC6/6DsEOIIEPAAAAAQ/ACSGDDwAA/wEJIIIP +AAD/AUgiAgBIIwMANsBUHZgggeBVHdggD/QKwBgUBDAEuEAsgQE4YLV4x3CAAPSqQrBjsACGAeCB +4ACmCfTPcaAAyBwB2BGhLgrABwrBBsBALoIhgboEuQa4OGC1eMdwgAD0qiKQPHkQuSV6RqcikMC5 +uHkFIYEELyJIICOQQCuCIYG6PHkQuSV6RqcDkMC4uHgFIAAELyAIIACGQiBBgAn0z3KgAMgcSiQA +AEQaAAFCJFQgTCQAoCQGzf+B4ACmCfTPcaAAyBwB2BGhqgnABwvAQCoBJAa4gbgleAanDMBAKAEk +BriBuCV4BqcAhkIgQIAApgf0z3GgAMgcANgRoRDBYbmA4QoF7f9AIUAgEcFhuYDhCMAYBO3/AeAA +hgHggeAApgn0z3GgAMgcAdgRoUYJwAfPcAgAhhAGpwCGQiBAgACmB/TPcaAAyBwA2BGhAMCA4Mog +IgIwDGL3yiHiAAYLj/7PcKAAtEdxEACGBCCAD3AAAABBKD6F9fViCA/4z3CAANyXBMEMgDhgz3GA +ANyXDKENgQHgDaGRAe/0u8DgeADZz3CAAPiXLKgtqOB/LqjgfuB48cBiCc/0CHYuuMC4BLhPIMEA +z3CAALhNAIjPdaAA7CeB4AHYwHgHuCV4ELiFIJEABqX6C+/0AdiAvsalkQHP9M9wgAAHIc9xoADs +Jwahz3CAAEc6BqHPcIAAx1MGoc9wgADHJAahz3CAAAc+BqHPcIAAh1cGoUnZz3CnAIhJMKDgfuB4 +AdnPcKAAyBwwoEvZz3CkABxAJKDgfuB4z3EBADxez3CAAFxB4H8goM9xgADclwCBgLjgfwCh4Hjx +wLhwUyCBAM9wgAA0cihggeDKIcIPyiLCB8oggg8AAJUZyiSCDwAA/gB8BOL1yiPiCAHY0cDgfgnZ +4H8goOB48cBmCO/0AdjPdYAAbEEghUB5geAghQfyYHkB2IPgIIVC9GB5AtiA4AvyIIVgeQLYgeAg +hRH0YHkD2IDgDfTuCAAAIIVgeQjYEHnPcIAAFBNODI/1FPAghWB5AtiB4CCFBvJgeQLYguAghQ70 +YHkI2BB5z3CAAAwQJgyP9b4P4AMH2C3w63ZgeQLYuHDPcAAAuxkKIcAPyXKKI04FyQPv9Yokgw9g +eQHYguAghR/0YHkC2IDgIIUI2Af0QHkQec9wgADYDQbwQHkQec9wgADwDs4Lj/VmD+ADAdgyCo/9 +wghAAPYIAADtB4/063ZgeQHYuHDPcAAAuhkKIcAPyXKKI88HZQPv9Yokgw/geAhxWIkBgIDiAqEJ +9FmJgOLCIKIAwCChAAKh4H7xwOHFz3CAAGRBIIChwWB5BNiB4Eb0Ag7v+4ogzA6B4ED0z3WAAPQz +AIUB4IHgAKUJ9AHZz3CgAMgcMaBeDqAHKHBKJMBw4HioIEACz3EBAEJpz3CgAOwnJqCLcZYKr/WK +IEYJAIVCIECAAKUG9ADZz3CgAMgcMaAAFAUxTCVAgMohwg/KIsIHyiCCDwAArCjKI4IPAABHA6QC +4vXKJCIAEQev9KHA4HjgfuB48cCODo/0z3aAAPQzAIYB4IHgAKYA3wr0AdnPcKAAyBwxoM4NoAco +cMfYlLjPdaAA7CcGpc9wAwCCKwalz3ADAMJEBqXPcAMAAiwGpc9wAwBCRQalz3EAAMJ0z3ADAMJ0 +BqXPcAMAgm8Gpc9wAwCCbAalxtiQuAalJqV2DaAHCtjPcAAAgmwGpWYNoAcK2M9wAAACLAalWg2g +BwrYz3AAAEJFBqVKDaAHCtjPcAAAgm8GpT4NoAcK2M9wAACCKwalLg2gBwrYz3AAAMJEBqUiDaAH +CtjPcBMAxgAGpRINoAcy2ACGQiBAgACmBvTPcKAAyBzxoAEGj/TxwJINj/QacM91oACsLxWFUSAA +gCDyANjOCa/3jrgIdy64wLgEuE8gwQDPcIAAuE0AiM92oADsJ4HgAdjAeAe4JXgQuIUgkQAGphoI +7/QB2IC/5qZMIACgB/TPcIAAWEEAgEB4SvAVhVEgAIDKIcEPyiLBB8oggQ8AAH8ZyiOBDwAAqgDK +JMEAEAHh9colwQDPcBMAxwDPdqAA7CcGps9wEAAGaQamx9iVuAamz3WAAPQzAIUB4IHgAKUK9AHZ +z3CgAMgcMaAyDKAHKHDPcAAAQi0Gps9wAACCRgamz3AAAEJgBqYAhUIgQIAApQb0z3GgAMgcANgR +of0Ej/TxwJ4Mj/TPcIAAZEEggKHBYHkE2IDgM/LPdoAA9DMAhgDdAeCB4AAcRDMApgn0AdnPcKAA +yBwxoMILoAcocItxEgiv9QDYAIZCIECAAKYG9M9woADIHLGgABQBMc91gABwQYYh/wxAhUK5YHoC +2AAUATFAhQPYYHrBuZEEr/ShwPHAFgyv9APYz3aAAGRBIIbPdYAAFE1geaLBgOAG8iCGYHkE2IDg +BvRLAyAASBUEEAPYGnDPd6cAFEjPdqAA7CfGDm/9BdgOpc9wgAD0MwCAAeCB4M9xgAD0MwChCfQB +2c9woADIHDGgEgugByhwA9hiD2/1qXEE2FoPb/UibQXYUg9v9SRtC9hKD2/1Jm0P2EIPb/VAJQES +Ntg6D2/1QCWBEjfYLg9v9UAlARM42CYPb/VAJYETCIcEpQ2HBaUOhwalz3CnAJhHHIAHpReHCKUW +hwmlz3CrAKD/GIALpc9wqwCg/xmADKXPcKsAoP8agA2lz3AFAMYDBqbG2JC4BqbPcCwAAgEGps9w +WgBCAQamiiCLAAamz3BAAIcNBqbPcNEAwg0Gps9wwAAHDgamz3CAAPQzIICB4Qb0z3KgAMgcANgR +ogHYCKcA2A2nDqfPcKcAmEfPclAA/wBcoAHYF6cA2Ban/NrPcKsAoP9YoHPaWaAagM9yqwCg/4G4 +GqKB4c9wgAD0MyCgCPTPcaAAyBwB2BGh5gmAB89wQACGDQamz3AQAAIOBqaLcN4O4ASBwTaFAMAi +eAQogA8AAHQJFYU3hQJ5Egyv9C9wAcJP4M9xgACImRSlV6EYoc9wQACHDQamz3ARAAYOBqbPcIAA +9DMAgM9xgAD0M0IgQIAAoQf0z3GgAMgcANgRoYtweg7gBIHBNoUAwCJ4rg/v+hKlMoVVhSx4N4Uv +IEAOQnk5YaoLr/Q1eeC4HHjAIGIAgiDEAs9xgACImRKlE6UWoc9wgAD0MwCAAcIB4FWhgeDPcYAA +9DMAoQj0z3GgAMgcAdgRoQoJgAcBlRC4hSCEAAamApUQuIUghQAGpgOVELiFIIsABqYElRC4hSCP +AAamBZUQuAUggA8AAIINBqYGlRC4BSCADwAAwg0GpgeVELgFIIAPAAACDgamz3CAAPQzAIDPcYAA +9DNCIECAAKEH9M9xoADIHADYEaEEhSuFCKcFhQ2nBoUOpwiFF6cJhRanz3CrAKD/OKAshTmgLYU6 +oPoIb/0OhUgVBBCMJIKARfaMJD+BDfZaCKAHCti2D4AEQiBAIIDgAgXN/0gVBBCMJIKARfaMJD+B +DPYKIcAP63LPcAAAtBmKI0UMyQSv9bhzz3CAAFIgAIiA4Afyz3CAAHRNABAEAIhwBQGv9KLA4HjP +cIAAFE3gfxSA4HjPcQEARHrPcgEAsHBJBa/5ANjgeOB+4HjxwM9wgABYQQCAQHjPcIAAVEEAgEB4 +0cDgfuB4USAAgM9ygADQCgvygOFR2MAoIgTKIGEEwCghBALwANjgfwCi8cA2CI/0z3CAAGRBIICh +wWB5BNiB4AHdnPT+Dq/7iiBQDIHglvTPdoAA9DMAhgDfABzEMwHggeACHMQzAKYJ9M9woADIHLGg +Ug9gB6lwi3GiC2/1ANgAFAExz3WAAHBBQIUA2IYh/A9geka5ABQAMUCFRCABDAHYYHpEuQHYdgtv +9UAkgTBAhQjYYHoCFAExABQFMahwhiD8D4wgAoAO8gohwA/rcs9wAAC1GYoj0QWNA6/1iiSDDwIU +BTFMJQCAzCVigMwlooAW8qhwhiA9D4wgAoDKIcIPyiLCB8oggg8AALYZyiOCDwAAXQRQA6L1yiRi +AALY/gpv9UAkgTACFAAxQIVTIFAABNhgegpxABQAMYYg/wNEuILgzCDioBDyAhQFMQohwA/rcs9w +AAC3GYojkQwJA6/1iiSDDwCGQiBAgACmFfTPcKAAyBzxoBHwz3WAAHBBQIUB2GB6CHFAhQTYYHoD +2UCFBdhgegPZLQdv9KHA8cDKDk/0z3WAAPQzAIUB4IHgAKUA3gr0AdnPcKAAyBwxoAYOYAcocM9w +gAAGIc9xoADsJwahz3CAAEY6BqHPcIAAxlMGoc9wgADGJAahz3CAAAY+BqHPcIAAhlcGoQCFQiBA +gAClBvTPcKAAyBzRoM9wpwCISdCgvQZP9AjZz3CAAPDB4H8joPHAQg5P9M92gAD0MwCGAeCB4ACm +AN0K9AHZz3CgAMgcMaB+DWAHKHDPcAAAwizPcaAA7CcGoc9wAAACRgahz3AAAMJfBqEAhkIgQIAA +pgb0z3CgAMgcsaBVBk/08cCGDu/2FthiD4AEz3GAAKQ1AIHEEAAGUSBAgQf0AYHEEAAGUSBAgQTy +eg6v9xPYz3CAAExBIIBgeQvY0cDgfvHAfgyv+4ogiAWA4A3yMgjv/ADYz3CAAGRBIIBgeQTYgOD0 +CgL/0cDgfuB4z3CAAKQ1A4AIgM9xgADwwVEgAIAD8gGJAvACieB/AKmA4PHAuHEO9AohwA/rcs9w +AACnGYojxAtBAa/1iiSDD89xgADwwSCBTCUAgAQhgQ8ABwAAQSkDBgDZyiRNceB46CBtA/AgRQAE +JYIPAQAAwC66ZXpQcwX0AeHRwOB+CiHAD+tyz3AAAKgZiiMEDu0Ar/VKJEAA4HjxwOHFAN3PcIAA +2AmmCCAAoKDPcKcAFEiooD0FT/TgePHAocG4cADYQMBTJYAAgeAR8oLgIPKE4CXyCiHAD+tyz3AA +AKsZiiOKCpkAr/WKJIMPz3CAAGxBIIBgeQHYhOAB2cB5z3AAACLSNHjPcYAAE+YP8M9wAAAj0s9x +gAAW5gfwz3AAACTSz3GAABnmKdoSuvAiAAAOIIIPAAEAAEDCi3DeCWAEA9qhwNHA4H7gePHAKgxP +9APIlBAAAM92gAD0MwQgkA8BAADAAIZBKJAjAeCB4ACmAN0J9AHZz3CgAMgcMaBaC2AHKHDPcSQA +BwHPcKAA7CcmoIohhQAmoFMggSCB4RPyguEl8oThM/IKIcAP63LPcAAAiBmKIwYDiiSDD8EHb/UK +JQAEz3GAAKQ1I4EogVEhAIDKIYIPgADHIMohgQ+AAIckJqDPcQQAR0sk8M9xgACkNSOBKIFRIQCA +yiGCD4AABzrKIYEPgADHPRDwz3GAAKQ1I4EogVEhAIDKIYIPgACHU8ohgQ+AAEdXJqDPcQQAxzEm +oACGQiBAgACmBvTPcKAAyByxoJEDT/TxwKHBz3GAAKQ1I4EvKAEAKIHAuQAhgw8AACLSTiCBBynY +ErjwIMAAz3KAABPmNHlZYUDAi3CaCGAEA9qhwNHA4H7gePHA4cW4cM9wLAAGAc9xoADsJwahz3Kr +AKD/GoJTJY0AgeUA2xHyguU28oTlVPIKIcAP63LPcAAAgRmKI4UDsQZv9Yokgw/Pc4AApDVjg2iD +USMAgAnyz3OAAMYgZqHPcwMAwgII8M9zgACGJGahz3MCAMICZqHPcwQARktmoc9zSABCAWahAdvP +cacAFEh3oYG4R/DPdYAApDWjhaiFUSUAkAryz3WAAAY6pqHPdQMAggIJ8M91gADGPaahz3UCAIIC +pqHPdQQAxjGmoc91SgBCASHwz3WAAKQ1o4WohVElAJAK8s91gACGU6ahz3UDAIICCfDPdYAARlem +oc91AgCCAqahz3UEAMYxpqHPdUwAQgGmoc9xpwAUSHehgLgaokECT/TxwMYJT/QDyAHdz3anABRI +lBAAAKimBCCADwEAAMDCDu//Lrj/2Ju4z3KnAJhHHKLPcYAA2AkAgQDfgODKIcIPyiLCB8oggg8A +AKwZyiOCDwAA5QDKJMIDcAVi9colwgP2prqiyQFv9KCh4HjxwFYJT/TPcKYAnD8ZgFEgAIBX8s92 +gADkCQCGRoCgEgAGLygBAE4ggQdBKdAATCCAoAn3SHCAIAoAMiAABIDgD/QKIcAP63LPcAAArRmK +I0sCiiSDDwkFb/UKJQAEz3WAAAjmQCXAEtYL7/UJ2QDYSgiv/w8gAASA4ADYDyAABAT0HgzP/wTw +pg3P/wPIuRCAABt4gLhAhgqtJoKWIUEDACEABBiIjCDDjwJxBPJhuA94GKkmgqARAAafGRgAwgvP +//kAT/TgeM9xKioVFc9wgAB4WuB/IKDxwHoIT/Q6cBt9z3CmAJw/ZBAQAFEgAKAV9DYLb/QD2GG9 +jCX/n/P1CiHAD+tyz3AAAKQoUdsKJEAETQRv9QolAASZAE/04HjxwDYIT/TPcaAArC86gVIhAQBR +IQCAocEA3pj0gODPdYAA9DNY8ooJj//Pd4AAZEEgh2B5yXCM4AfyIIdgeclwkOAghSv0AIUB4IHg +AKUK9AHZz3CgAMgcMaBCDyAHKHCLcZILL/WKIAcFAIVCIECAAKUG9M9woADIHNGgABQFMUwlwIAq +8gohwA/rcs9wAACJGerbqQNv9ZhzAeGB4SClCfQB2c9woADIHDGg7g4gByhwz3EGAAJ1z3CgAOwn +JqAAhUIgQIAApQj0z3CgAMgc0aAE8OoIAAAAhQHggeAApQn0AdnPcKAAyBwxoK4OIAcocM9wgACk +NQOAkgsv9w6Az3GAALhNGnAuuMC4BLggiYO4z3egAOwngeEB2cB5B7kleBC4hSCRAAan3glv9AHY +TyAAIAanAIVCIECAAKUG9M9woADIHNGgUQcv9KHA4HjxwG4IAADPcIAAZEEggGB5A9iA4KQIggTP +cIAA8DsEgFEggIAL8s9xgACkNU2BPpFTIgAAMgwgAgHb0cDgfuB48cDhxc91gAAMTQCFUSAAgAz0 +JguAA+IKD/uWDA/4/g3P/wCFgLgApfkGD/TxwFoNb/uKIAQCgOAR8voNj//GD8//z3CAAGRBIIBg +eQTYgOAF8voNT/8OCAAA0cDgfuB48cBODg/0z3WAAAxNAIVRIECAHfTPcIAAZEEggGB5BNiA4BXy +Ag1v++LYgOAP8goJL/0H2NoMYAQIdiYLD//6De/8yXAAhYG4AKVxBg/04HjgfuB48cD2DQ/0pBAB +APi5CPK2EAEBz3CgAJgDPqCf8AAWDUG8sAAWAkFdsAAWDkDPoAAWAkFAGIQAABYCQFGgABYCQUgY +hABEJQIThOIa8hjbchjEAAAWA0CI4nOgABYDQVAYxAAAFgNBVBjEAAj0qXOGI/MPjCMMgA7yGNsW +8BDbchjEAADfz3OAABDD57MQ2wzwHttyGMQAABYPQPagABYPQVwYxAOpd4Yn/RyMJwKSCfQC43B7 +chjEAAAWD0EC8ADf4btgGMQDBPIAFg9BKHSEJAyQBPQA2iPwgOIa9FEmAJDRISKCFPLQiKi5z3KA +ABDXpBhAAAK+1n7CYv66BPKLuaQYQAAA2lqgW6Dm8QAWAkBaoAAWAkBboAjadBAOAb4QDwHCf2J/ +Qn+4EIIAmLmkGEAAz3GgAJgDQn96YlB6chiEALoQAgHwf3AYxAOlelywPoG2GEQACQUP9OB48cCa +DC/0SiRAdc91gABQL8CFz3OAAIAZqCCABmhwMm40eTpgQoIB5oDiOGAM8s9xoAAsIDCBInrXcklr +ANIA38L34qCq5somJhDgeLUEL/TApeB48cDPcIAADBgO2QHamgogAADbz3CAAEQYCdkB2ooKIABI +c89wgAA4FyrZANp6CiAAANvPcIAA4BcL2QDaagogAAHb0cDgfuB48cAE2K4P7/oB2c9wgAClTQCI +z3GAAKZNWgsgACCJ0cDgfuB4z3CAAAhfFQEABeB4gODxwAX0+ggAAADZIqDRwOB+4HjxwL4LD/RO +DU/7z3aAANgKZtgibgHaeglv/EhzgOAM9AohwA/rcs9wAAC2FNnbiiSBCTzwAhYFEUwlAIDMJYKP +AAD//wz0CiHAD+tyz3AAALcU3NtpBy/1iiSBCWfYyXEB2i4Jb/xIc4DgDPQKIcAP63LPcAAAuBTf +24okwQkW8AGWJG4B2gHgEHgGCW/8SHOA4KGWDvQKIcAP63LPcAAAuRTi20AlRBAVBy/1SiUAAAJt +EHgmbgHa1ghv/EhzgOAM9AohwA/rcqGWz3AAALoU5dtAJYQQ6vFRAw/0z3GgAGAdErEUkeB+geDx +wLhxHPRMJQCAxPZMJYCDzPYKIcAP63Kn2AW4nNu1Bi/1SiQAAEAtgAAUeEIgAQPPcIAAoBgZYR/w +z3CAAFAfMiBAAYwgw4/KIcEPyiLBB8oggQ8AAOEUyiOBDwAAogB0BiH1yiQhAAK4FHgAIIEPgACA +GShw0cDgfui4CPIEIL6PAAAAGAHYA/QA2OB/AKngePHAQgoP9M91gAASCgCNz3aAABAKWg/v/yCO +QYjPcYAArE3jujH0AoCA4C30USIAgS/yz3KAANA4AJZninBwKfQAlWGKcHAl9M9wgAAUCgCIRooQ +ch30z3CAAKQ1DoBRIECBF/LPcIAAqE1AgIDiC/LPcKAALCAQgEJ413AxAQAtg/cA2ALwAdglAi/0 +AKnPcIAA+DMAiIDg9fP38fHAigkP9KHBGnA6coDhaHbIACwAANiacRUgDSDPcYAA2AoAFZMQAhWS +ELpw440hkQGNAdo4YBB4i3E+Dy/8SHOA4BPyABQAMUwhAKBAKoIgBCCBDwAAAP9HuVR6GPLHcoAA +oBgX8M9wgADYCsGQoY0KIcAP63LPcAAAuxSKI4QAACZEEyEFL/UKJUAFx3KAAIAZgOYAGsIEA/IC +qgLwAapRIACAE/KA5gzyA4qAuAOqEm8UeBtiY4tYYIG7Y6jkqoDmBPImqgPwJapCJEEggOFGB+3/ +QCVAIAEBL/ShwOB44cVTIA0AoKkEIIEPAAYAAEIhAYAEIIAPQAAAAMohYgAgqtdwQAAAAAHYwHgA +q+B/wcXgeIDg8cAL9LoNz//PcaAALCAwgcdxSWsA0iKg0cDgfuB48cByCC/02HEKJoCQiHXMIyKA +BvJCJgYBLyaHAYIN7//IcYDmz3GAAJAKAKEm8iSIArk0eUOIA+FRIgCAAhCFAA/0CiHAD+tyz3AA +AOIUiiOIBUokAAAdBC/1CiWAAQhhUSBAgAz0CiHAD+tyz3AAAOMUiiOIBu/xARCFAFElAIDKIcEP +yiCBDwAA5BTKI4EPAAAoAsoiwQfd8+G90SUigcohwg/KIsIHyiCCDwAA5RTKI4IPAAAvArgDIvXK +JIIBUSUAkBPyUSXAgMohwQ/KIsEHyiCBDwAA5hTKI4EPAAA2ApADIfXKJIEB9QfP8+B48cB2D8/z +ocEIdyh1GnIA3s9woAC0D3AQEQBWDyADyXCLcUAkQjBAJIMwlg7v/6lwTCAAoAfyz3CAANCiAYiA +4ATySiQAAATwSiSAACDAARSCMOlxvg7v/wIUgzDPcIAApk0AiIDgzCcCkAvyz3CAAJAKAIDCoM9w +gACkTcCo5b0W8s9xgADQOAeJEHcQ9AGJUyUCEBByDPQEJY0fAAYAAIDlAdoGicB6EHIO8s9wgAD5 +M8Coz3CAAKhNwKDPcIAArE3AqKoOIAMvIEcECQfv86HA4HjxwBIKz//PcIAAEAoAkIDgXAzC/9HA +4H7gfuB48cDWCs//RgrP/6IOQAZCDU/83giAAdHA4H7geOB+4HjxwM9wgACsTQCIgOAN9CYMz/+A +4An0kNkDyJC5oBhAAADY0cDgfs9wgABMLwCIgOAQ8s9woAAABAyIjCACgADZCPSR2gPIkLqgGIAA +KHDr8QHY6fHPcYAApDXwIQEAKBGAACiBjQbv/wDa4HjxwOHF2HDPcoAA0DjPdYAAEAoAlWeKEHPP +cYAA+DMV9M9wgAASCgCQYYoQcw30z3CAABQKAIhGihByB/TPcIAA+TMAiALwANh+C+//AKnPcIAA +FApAiM9xgAASCgCJII2A4gHawHrIcwDdLg3v/5h1z3CAAJAKAIABiM9xgABML1EgAIEE8gHYAKkD +8KCp7QXP8+B4z3GAANA4z3CAABAKAJBHiRByGPTPcIAAEgoAkEGJEHIQ9M9wgAAUCgCIJokQcQr0 +z3CAAPgzIIjPcIAA+TMgqOB+4HjxwCoNz/PPdoAAMKkUjoHgEvQE2MoI7/oB2c9wgAASCgCIz3GA +ABAKdgzv/yCJANgUri7wto6A5Sryz3eAAKRNAI9huBB1EfIKCc//z3CAAHjfBYAhbQUofgDPcIAA +CF9+CuAEL3HPcIAAEgogkM9wgAClTaCvIKjPcIAAEAogkM9wgACmTSCoANgWrjWOgOEJ8s9wgAAS +CsYI7/8AiADYFa7xBO/zAdjPcKAALCAwgM9wgACoTeB/IKDgePHAlgjv/+HFz3CAAMA1UIjPdYAA +0KKE4gGVIYUE9F4IIAAPeAKNIYXKDO//Adq5BM/z4HjxwM9wgACkNTwQhgANgMC4Wgnv/8hxAYhR +IACByiHCD8oiwgfKIIIPAADoFMojgg8AAGIDyiQiAAQAIvXKJYIB0cDgfvHA4cWhwdhwi3VAJEIw +QCSDMChwIgvv/6lxARSAMIDgCfICFIAwgOAF8kImBgEvJocBIMDyCO//yHEBFIEwgOED8gKIAvAB +iOG40SDigAXyUSAAgQ/yCiHAD+tyz3AAAOcUiiNNA0okAACRB+/0CiWAAf0D7/OhwPHAegvP86HB +CHUA3s9woAC0D3AQEABaCyADyXCELQgZACGNf4AASKQk8EAlABcWIIQDBRSAAIYg/ocb8gSFi3FA +JIMwQCRPMHYK7//pcqgVABDaCO//6XEgwAQUgQABFIIwAhSDMK4K7/9KJMAAAeYMlRB2tgfF//YK +IAMvIAcEXQPv86HA4HjxwOoKz/OhwQh2GnE6cgDdz3CgALQPcBASAM4KIAOpcAWG446LcUAkgzAO +Cu//QCRCMAqGbgjv/0AkQTCA59P3FCFMIyCMIMABFIIwAhSDMPAgTiM2Cu//UyYEEAHl8XWw94YK +IAMvIIcE3QLv86HA8cDeC8//6glABtHA4H7gePHAcgrP8wokAIDPcIAACOCkaFUgQQQEEAYBBfIM +JICBjPcKIcAP63LPcAAA2xuq20kG7/QKJYABMiEAAQAhAwEAIQ4BACEFAWKLw44AIQIBBBWFAIwg +Q4fMI4GPAABQAMwmgZ8AAG8AzCWBjwAAmgAH9OWKiecF9OaKjOcS8gohwA/rchi4ELsFIw0ACL7F +fc9wAADeG7Xb4QXv9AUlRQMBigImAgFAIJAAAiIChMohxA/KIsQHyiCEDwAA3xvKI4QPAAC8ALQF +5PTKJQQEgOLG9oBxQg+gAwAhAAQAlQDZAiAABAC1z3CAAHxC6QHv8zag4HjxwOHFz3CAAFTBANkl +oM9wgADARiKgz3GAAKQ1AIHEEAAGUSBAgTzyA4EYiITgOPLPdYAAWFgAhUIgAIDKIGIAgeAT9H4O +oASpcM9xgAAgWACBQiAAgMogYgCA4AX0KHDWDqAEIoXPdYAAdFgAhUIgAIDKIGIAgeAS9EoOoASp +cM9xgAA8WACBQiAAgMogYgCA4Ab0KHCiDqAEIoVdAc/z4cUA289ygAAAwhQiDQBgtWi1GmIgGsIA +wB3EECgawgDPcYAArMEWeSKRMBrCANAdxBCAHdwQeB1EEAHZiBpCAM9xgACgwhV5YKHgHcQQ8B3E +EOB/wcXgePHAjgrv+xHYgOA99M9xgADQOM9wgAAQCgCQR4kQciz0z3CAABIKAJBBiRByJPTPcIAA +FAoAiCaJEHEe9M9wgABIQQCAgOAc9L4KAAOA4An0C8gFIIAPAAAAPAsaGDD2CgADgOAI9AvIBSCA +DwAAANQLGhgwC8iQuAsaGDAmCg/7A/AuCo/00cDgfuB4ANmcuc9woACsLz2g4H7geAkEz/rxwI4I +b/YV2M9wgAC4TSSIgOEO8oPhCfQDiIDgCPQSCkAD0cDgfgoMQAP98fvx4HjPcYAAuE0DiYDgxPZh +uAOp4H7geKHB8cDhxazBANlKwW8hQwBIwc9zgADwwSCDBCCNDwEAAMCGIf4DJLkOuQslQJBOwI7C +FvLXdQAAAEDMJYKfAAAAgMwlgp8BAAAABPQhgwPwIoOuuK+4sLgFeSCiDsMIwIt1BCOBDwEAAMAu +uUApAgZFeEjAiiAGBknAQcOpcADaUgkgAAHbz3GAAAwtGoE7gSR4USAAghLyCsALwYQoBA4AIYB/ +gACY4wK5COA0eSFgz3CnAIhJL6A+CSAFqXAI3F8Hr/OswOB4ocHxwN4Or/MIcq3BCNhKwG8gQwBJ +wM9wgADwwaCABCGODwEAAMCGJf4TJL0OvQsmQJNQwZDDFvLXdgAAAEDMJoKfAAAAgMwmgp8BAAAA +BPQBgAPwAoCuua+5sLkleACjEMMJxQQjgQ8BAADALrlAKQAG5roFfUnFDfIKwAQjvo8AAAAYRSDA +AErABfKFIBABSsDkuhDym73PcKAALCAFgADbArhuuIDgyiDMAMm4pXhJwAbw6LoE8p29ScUQwIHF +QsCpcEYIIAAC2wPIDMLPcYAADC25GIIAGoE7gSR4USAAggzyArrPcIAAoONUekFgz3CnAIhJL6A2 +CCAFqXAI3E8Gr/OtwOB48cDWDa/zuHGjwQh1IYCYc0DB6bkA22qgVvIEIYAPAQAAwC64z3KAABBm +CmJJIoIAz3OAAHhNAINhugsgAIFLpRzyz3aAALAswI6A5gP0AN4I8M92gADELMiOgOb58wHeLyaH +8wryLygBAE4gjgfWewGDBqUCgwrwEmoUeMdwgACQ5GqAZqULgAWlIMDPc4AApDVjg892gACIw9WO +BCGBDwAAABB0gxjiBHtkfkAtAwIJvsV7ZXgFeQiFJ6WeuAilS6Wy8FEigIIa8s9wgADQWgCAQcDo +uELAD/KGIP8JI7gB4IHgyfeC4AT0BthhwCXwB9hhwCHwIsBhwB/wQcHPcIAA5AkAgAaAnhAABobg +FPQEIb6PAAAAGA70z3CAAKQ1BIAIgAQgvo8ABgAABPIB3+qlBPBqpQDfAcDouB3yQsAiwqDiyiIh +AAQgjg8BAADALr5EIAYGQS7DAAHjBCCGDwYAAABBLkAEG2PPcIAAEGbIYGJ4EvBTIMIAz3OAAFxq +XXpKYwQggA8BAADALrjPc4AAEGYIY2G46LkWekulCPIgw89wgAAYZmtgA/AB289wgAB4TQAQBgAL +JgCBHPLPdoAAsCzAjoDmA/QA3gjwz3aAAMQsyI6A5vnzAd4vJofzCvIvKoEBTiKOB9Z4QYBGpQKA +DvACuoQvBB4AIYB/gACY41R6RmBYYMalAYAFpWG7BCGBDy8AAN1BKYABZXhSIMADB6XPcIAA8MEj +gBEhQIEA3w7yz3CAAOxaAIDguAryhiB/Dx14QCjPAwTwAN+Pv4DnHPTPdoAAZEEghmB5ANiM4BHy +IIZgeQDYkOAL8iCGYHkA2JHgB/IghmB5ANiS4AT08g3v+wDYCIUFf+ilsQOv86PA8cBGC4/zz3WA +AIBBAIXEkMlwSgygAIYg/AMAhclxLgtgAIYh/AOa4M9zgADMwwX0IYOAuSGjSoMB4kqjz3OgAMQn +kRMBhsO5UHEN9IolCBATG1iDkRMBhsO5UHED8hIbWINRA4/z4HjxwNYKr/MA2M9yoADEJ1ISAYYV +EgGGQhIDhv67BvIB2M9ygABQw2GyUSHAgBpwyiViFBL0USDAxsolohQM9M9woADQDyAQAYYfEACG +EHEA3colYhWA5cf0z3aAAFDDH4bwuLjyqBYBEJTYtgigAslyz3GAANAsAYFRIACAAd9H9ADYjrgA +oc9woADAHSeAz3CAAERMQJCGIf8OLyaH8CK5J/TPc4AAbE9siwQigg/////CiLqGI/8BQ7uGI38P +guMB28B7LybH8AHbwiPBAGV5Crklek8iQQMEIoIPAAAAPE8ifoMweiCwA/SLukCwz3CgAPxELYAE +IoIPAAAAPAQhgQ/////DRXktoEwgAKAo8s9wgAAcCyCAz3CgAPwlgOHPcoAA5MAM9DOACoIZYSqi +z3IA/wCqiiCIBQzwE4AkkhlhMHkksoogiAXPcgD/AP+OCg/9AJZSCG/9NJbPcKAA0A+UEAIAgOLP +cYAAHFEb8g2BAeANoQuBWGALoc9wgAD4MwHaQKgfhu64B/LPcIAAxAngoAfw77gF8s9wgADICeCg +z3CgAPwlE4BMgVhgDKHPcQCgCADscCCgbyFDAOxwIKDPcKAA0A8OGNiDKgmABs9wAAD/f89xoAAM +JAGhG9gEoVkBr/OpcOB/AdjxwOHFocFODO/6i3CA4Df0ABQFMFElAIAM8oYIAADPcYAAUMNDgc9x +gADsqUGhJ/BRJYCABPLiDc//IfBRJUCCBPJuDc//G/BRJcCAHPII2M91oADEJxMdGJCOCAABlOAN +8gLYPB0AkM9wgABQwyOAz3CAAOypIaAZ2JngxfPpAK/zocAKIcAP63IX2Iy4iiPHAGEEr/SKJIMP +4HjxwFIIj/PPcIAAUMM/gAQhgQ///484BCWAXwAAcMcleM9xgABQwx+hRCIAU4jgz3WAAFDDIPRR +JUDRHvImD8//USWA05wdABAJ8s9wgAD4NQWImB0CEADZEfBRJcDTB/LPcIAACDkZiPXxA4UCC6/0 +JIXx8QDZnB1AEJwVABCA4Mwg4oDH8s9zoADIH0ATAAaA4GL0z3KAANAsJBIHAVMnBoBKJEAAyiRB +AAGChiC/jVL0ANiMuACihRMAhs92gABETIYg/w5BKIUAAJYvJgfwKfTPd4AAbE/sj4Yn/xFDv4Yn +fx+C5wHfwH8vJsfzyiFiAAUhQQEEIIAP////wkAszwLleAq5JXhPIEEDBCCADwAAADxPIH6DMHgg +tgP0i7gAts9xoAD8RM2BBCCADwAAADwquAQmjh/////Dir6Lvoy+zaGIGxiAQC7AAy8hwQEleBKy +H4VRIACBCPRRJcDSBPSA2JgdAhCYFYAQUSDAgUAoAQYI9FEigNOCuQ3ynglAAhvwH4VRIoDTs7gf +pcUhgg8AAAAHRSEABs9xgADcwyyJhiH9D1IhwQFFuSV4z3GgAIgkEKGKINYAz3GgAMQnfhkYgM9w +oADUCwHaUqAE2BAZGIDPdYAAUMMfhVEggIEk8hSVUSBAgSD0z3CgACwgD4CA4Br0rXHWDK/4ViVA +FYAVABCUuIAdABAfhZC4H6UM8M9xgACgUA+BAeAPoRDZz3CgAJAjPaCRBm/zGdjgePHAHg5v8wDZ +CHYBgMG4g+DKIEEgBfJCDiAAyXAacEwgAKDH9BCGUSCAgcPyEIbPdYAAUMPuuAfyz3CAAPg1BYgN +8BCG77gH8s9wgAAIORmIBfAFhiaG6giP9JgdAhCAFQAQBCC+jxBwAAAH9K1xMgyv+FYlQBURhs9x +gACwCgChQSgBA1MhxQCYFYEQQSgGBVEhwIEUaQUgRAEG8h6FlbgepXzwsgjv+k8kQAKQ4OwABgDP +cYAAYJ6YFYMQ8CEBAEArAgaGI/0PUiPDAUW7ZXrPc6AAxCdBG5iAANqMugImTwD6Ysu613IAAAAI +QC0PA5C/UvcFJ48RYhvYg4wiAoDH989xgAAUUhKBAeASoQDZnblG8OV5YhtYgNdyAADAD1IADgAO +IoMPAAAAEM9ygADAnRZ6oOMgggQSBQBP9wDYDyDAAGG4TiMPCAEpwgN4eQV5AC3AAAV6FvBCIwMI +ANgPIMAAYbh4eQUhAgCKIf8PCvDPc4AAFFITg4oh/w8ocgHgE6MB2M9zgABgqgCrAhsEASGjQqO9 +8QDZnLmAFQAQJXiAHQAQQCYAEqAdABAC2c9woAD0JiOgJYbPcIAA7KkhoMEEb/MKcPHATgxP8wh1 +VSBQBA3MosHtuNEgYoAH8gTIngyv/5gQAADPcIAAzMMMgM9xoADIH2TgHqEQ2A6hAdgVGRiAAYWA +4AX0USMAwPvzAYXBuIPg2PQAEAAgQcAEFA8xEIUsv1EggIEGFBIxOfINzOu4OfIQhc92gABQw+64 +B/LPcIAA+DUFiA3wEIXvuAfyz3CAAAg5GYgF8AWFJoXeDk/057iYHgIQyiZhEAXyPoaVuT6mAN4E +uM9xgACoqkaR5XhQcAjyz3KAABRSCYIA3gHgCaIEkddwAAD//wr0AN4I8M9xgACgUA2BAN4B4A2h +AZWc4Ij0BBARIAgQECDPcKAA9CYC2SOgI4XPcIAA7KkhoIILIACpcIDggvSA5ibyz3KgAMQsHBpA +BM9xgADcwyAaAAQsiUAvAxMQuZ+5JXtBKgEhZXkmog0SATfruQ7yENqruQwanDANGlwwz3KAAJhR +J4IB4SeiDRIBN+y5BvIa2Ky5DRpcMIDmUvLPdoAA3JbgFgMQRYVEKz4HACZBHkChTJUB40Kxz3KA +ANzDrIrgHsAQz3KAAKiqqKnpqQoZhAQMGUAERJIQGQAEEL0Mv0EqAyHlfWV9SrHPc6AAwC9HG1iD +lOLAIoYPAACTAM91oABoLPAlghBLsY8TAoYJ8KMTAoZRIgCBjxMChgb057r48wfwCNgM8Oe6yiIh +AEDCARSDMMa6xrt4qVmpkQJv86LA4HjxwOHFz3GAAKQ1I4FIgVEiAIAr8oYg/wHPcoAAEGZDuApi +ANuA4sohwQ/KIsEHyiDhB88gIQPKI4EPAABvAMokwQD8BWH0yiUhAIHiz3CqAAxQuYHG94C9uaEB +2SWgBfCgvbmhZaBNAk/z4HjxwNIJT/MIdQ3MUyBAgAfyBMgaCq//mBAAAAGFwbiD4MomIRAF8t4J +IACpcAh2gOZZ9BCFUSCAgQP0ANlG8AzMUSDAgDvyDcxTIECADRICNh70ACKAD4AAiMIB2c92gABs +TyCoEY5RIACACA2iBMogQgARjlEgQIEK8s9wgAC4TQOIgOAkCyECyiAhARDYDBocMM9xgAAcUReB +AeAXoQPIDRIBNoQQAgHPcIAAfMI1eCmAWWEpoBrewfHPcYAAoFANgQHgDaEB2c9wgAD4MwHaQKjP +cIAAzMNOgAaCAeAGogLwAdkC2s9woAD0JkOgQ4XPcIAA7KmA4UGgIA5CA0EBb/PJcM9zgABQw1gT +gQCA4QDaD/Q8k2K5ELlFIUMBz3GgAPQmY6HPcYAA7KlBodUAAADgePHAnghP8wh2AYDBuIPgAN0F +8r4IIADJcAh1gOUy9BCGUSCAgSLyDMzPcYAAJFBRIECBF/JA2AwaHDBVEQAGANoB4FUZGAANyM9x +gAAAwhR5A8hAqaIIr/+YEAAABvCsEQAAAeCsGQAAz3CAAPgzAdkgqM9wgADMwy6ABoEB4AahAtnP +cKAA9CYjoCOGz3CAAOypIaB1AG/zqXDgeOB/CNjxwCS5UyHCAIjiz3GAABxtVnkJ8kGQYYEE4nBy +yiAiAgP0IIFAedHA4H7geM9xgADMwyyBz3KgAMgfZOE+ohDZLqIB2RUaWIAhgIDhBPRRIwDA/PMh +gMG5g+EQ9M9wgAD4MwHZIKjPcIAAzMMugAaBAeAGoQDZDfAhgFEhAIAA2coh4QUBgFEgQIDKIaEE +4H8ocOB48cBqDw/zz3aAAMzDAYYEIL6PAHAAAIXyLykBAM9wgAD0TfQgTQArhk8lgBB+DSACSYaA +4BP0jCUDkM9xgAAkUAf0uhEABgHguhkYAGnwuREABgHguRkYAGPwAYb+uFryz3CAAGxPbIgviHBx +CPIRiFEgwIAE9DoNgAJR8M9xgADQLAGBUSAAgEn0ANiOuAChz3CgAMAdB4DPcoAAREyGIP8OQSiB +AACSLyYH8CP0hiP/AUO7hiN/D4LjAdvAey8mx/AB28IjwQBleQQggA/////CiLgKuSV4TyBBAwQg +gA8AAAA8TyB+gzB4ILID9Iu4ALLPcqAA/EQtggQggA8AAAA8BCGBD////8MleA2iB/AA2c9wgABg +qiCoag4ABrkGD/PgePHAQg4P8wh2AYDBuIPgAN8S9IDnz3WAAFDDSfQQhlEggIE78hCG7rgL8s9w +gAD4NQWIE/BCDu//yXAId+vxEIbvuAfyz3CAAAg5GYgF8AWGJoYOCU/0USDAgZgdAhAI8h6Flbge +pR+Fl7gfpYAVABAEIL6PEHAAAA/0nLiAHQAQMIY+DG/4ViVAFUAmABKgHQAQANgFtgHZz3CAAPgz +IKi0FQEQBoEB4AahWBWAEIDgGfR6DU/6gOAF8hCG7bgB2AL0ANjPcYAAssP0IQAAPJU4YGK4ELiA +uM9xoAD0JgOhBvAC2c9woAD0JiOgJYbPcIAA7KkhoLUFL/PpcPHAQg0v8wDZCHYBgMG4g+DKIEEg +BfJmDe//yXAacM9woAAsIAaAEHhMIACgz3WAAFDDyiciEFn0MIZRIYCBMvI8lTBwyPYlhs9wgADs +qQKAEHFd9BCG7rgG8s9wgAD4NQWIDvAQhu+4BvLPcIAACDkZiAbwBYYmhuoPD/SYHQIQgBUAEAQg +vo8QcAAACvSiDE/6gOAL8hCG7bgJ8gHfCPAA3xnwngpP+xXwAN8whhYLb/hWJUAVgBUAEKgVARCe +uIAdABBRIUCCQCYAEqAdABDq8wHZz3CAAPgzIKi0FQEQBoEB4AahWBWBEIDhz3CgAPQmE/TPcYAA +ssNclfQhwQNZYWK5ELmAuQjwtBUBEAuBAeALocbxAtkjoCWGz3CAAOypIaCBBC/zCnDgePHAGgwP +8891oADIH0AVABaA4F/0z3OAANAsAYOGIL+NUpNTIgEAVfQA2Iy4AKOFFQCWz3aAAERMRCAEAQCW +LyYH8EEshAAu9M93gABsT+yPSiVAAIYn/xFDv4Ynfx+C5wHfwH8vJsfzQCnPAsIlQQEFJQUBBCCE +D////8JALYACBScPEeV4TyBPAwQggA8AAAA8TyB+g/B44LYE9Iu4ALbPdqAA/ETthgQggA8AAAA8 +KrgEJ48f////w4q/i7+Mv+2miB0YkA+5XHpFeTKzUSWA0892gABQwwbyz3CAAPg1BYgO8FElwNMG +8s9wgAAIORmIBvADhkIOL/QkhpgeAhAfhlEgAIEL9FElQNMH9FElQNIF9IDYmB4CEJgWgBDnuAvy +P4ZehrO5l7mVuj+mXqYA2QHdFvCcFgEQgeEQ9D+GUSFAgs9xgACkNSOBKYEF8kQhDQQF8EQhDQID +8AHdBNkYuAV5z3CgAIgkMKAfhlEggIEc8hSWUSBAgRj0Lg5AAoDgFPTPcKAALCAPgIDgBvINzFEg +wIEK8h+GkLgfpq1x9ghv+FYmQBWA5R30USKA0wTyMg3AARfwhiL/3M9xgABQwxH0AYFRIACADfKY +EYAAz3GAABDXArgWeABh/rjIDsL6z3CgAFAMIIDPcIAA8AoE2iCgz3CgAJAjXaDPcoAAUMMfgvO4 +BvQPgoDgANgr8heCihICARlhBOJRIIDEBfRRIQDG+/PPc4AAUMOYE4AA57gA3Qn0ArjPdYAAENcW +eAVlLb3AvYoTAAFPE44Az3OAAKQ18CNDA0J5wniyDK/6T5MhAg/z4HjxwOHFocEA2EDAz3GAAKBQ +D4EB4A+hA9nPcKAA1AsxoOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4MaAQ2M91oADE +JxAdGJDKDG/6i3CA4Bj0ABQFMFElgIAM9AohwA/rcg3YjLiKI18HRQUv9Iokgw8E2RMdWJAb2RYd +WJClAS/zocDgePHAz3CAADiqAgyv9BjZz3CAAHCa9guv9BjZ0cDgfuB48cACCQ/zGnDPdqAA1AsQ +hgDdgeChwUDFDvIKIcAP63IP2Iy4iiOWCIokgw/dBC/0CiUABM9xoAD8RBmBBCC+jwAACCAG9B2B ++bjKIEEDA/IB2A94geAI9M9xgAAcUQKBAeACoUwgwKQH8gIMb/qLcIDgyiACIEIgwSCU4UgBDQAy +JkFwgAAAYEAnAHI0eAB4z3CAAMzDLoAIgQHgCKGqC8AAANkocD3wz3CAAMzDLoAHgQHgB6H38c9w +gADMwy6ADIEB4Ayh7/HPcIAAzMMugAKBAeACoSPwz3GAABxRBYEB4AWhG/DPcIAAzMMugAOBAeAD +oQHZANgT8M9xgAAUUhqBAeAaoaYLYAQB2Mnxz3GAABRSFIEB4BShAdgIcYDhGAuCAM9wgABQwx+A +87gK8s9wgAC0nauoz3CAAOiarLAD2BGm4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HgR +pgEAL/OhwM9xnwC4/xiBkLgYoRiBsLgYoc9wgADMwy6ABYEB4E4IIAAFocXxz3CAAMzDLoAEgQHg +OgggAAShu/HPcIAAzMMugBGBAeARobPxz3GAABxRDoEB4A6hmvEKIcAP63JB2Iy4iiPYByzx8cAy +D8/yz3CAAMzDDIDPdaAAyB8Q3gHfZOAepc6lFR3Yk0oO4AUJ2APYHqXOpRUd2JPPcKAADCQHgIDg +BPJRIwDA+fNVB8/y8cDhxc9xgACkNSOBKYFRIUCAyiCiACv0RLjPcYAA5E3DuAlh4LkF8lElgNEc +9FEhQIAc8s91gACkNQOFGIiB4A/ykg4P+oDgB/LPcIAA7DgIiIfgBfIDhRiIguAG9FElgNEE8gHY +A/AA2PkGz/LgePHAdg7P8kQiEFNNdoYm/BNNcE1wBCWAXwAAACBBKH6DBfJCDg/6gOAD9ADfAvAB +3891gABQwx+F8bgE8gDdpPBMIACg/PUeDg/6gOAe8s9wgADsOAiIh+DMIGKCFvQBhYwg/48S9CSV +z3AAAP//EHEM9AWFjCD/jwj0DJXXcAAA///KJWEQgPLPcIAApDXwIMEDCYFRIECBBfLPcIAA3GYE +8M9wgADoZjiJKmBBLgARz3GAAPRmCGEWes9wgACcbUhg4LgF8j+FhiH2jxfy4bgF8j+FUSGAghHy +4rgE8lElANIE8gHdDPDjuAnyz3GgAAwkMYGMIf+P9vMA3VEggIHKJSIQXg0P+oDgCPIEJb7fAAAA +IsolYhCA5Sjyz3GAAFDDH4HouA/yjCYCkMwmgp8AAFAAzCaCnwAA0AAD9JO4H6HPcIAApDUCgMIQ +AAaA4BryjCYCkMwmgp8AAFAAFPRPgUV4D6EP8M9wgACkNQOACYDhuAf0jCYCkAb0USCAgQLyAt1V +Be/yqXDgePHA4gzv8oDbosEA3c9xgABQw76hv6Ggsa+hTxlCA4AZQAOMGUQDmBnCAIQZQAPPcqAA +yB+kEgAA+BIOAKwZQANCGUQDwniwGQAAz3CAAFiXuaDPcIAACMSgoATez3CAALAKwKCZEYAAoLiZ +GQIAz3CgAMQnZBhYg892AAD/fxMYmIMb3hYYmIMaGFiDiif/H892oAD8RP2m+aaKJ5gdz3agAFAM +4qZxonCiPBhAg4ojGAhuooASAwCkGUADUSNAgM9zgADsqVgZQgMN8kIQAIYEIL6PAMAAAAXyAYOA +4APyAqOho4AaQANRIYDDz3OAACRQz3CAAKQ1Q4AU8h+Bi7gfoVUjwAW0GQAACtgcsRuSlhkEAAbZ +z3CgAMgcKaAL8EAjAAO0GQAAENgcsRqSlhkEAM9xoADUCxCBgeAN9AohwA/rcgvYjLiKI9UAiiSD +D6EH7/O4cwHe0KFRIEDGdgIhAMom4RDPd4AAUMO0FwEQAIEB4ACh+tgGDu/6ANkg2M91gAAoxEYN +IAQApQHYz3KgAMgfE6LPcYAA/DMIgQCAbIFggySBQCUQFQARBAD4EgIAANkCIICAAaUA2AMjQwBQ +HwQQUh8EEFQfBBACJIEAz3CAAKQ1YqVDgCOlFJLPcaUACAwJtQiCwLgItQARBABTJEUBUyRBAEwf +QhGD4cohwQ/KIsEHyiBhBcojgQ8AAJwL4Abh888gIQMEJIEPAAAA4C25f4eaH0IQ67sUHQARDPIE +uYG5JXgItQfYB/AA2RUgDCAgpAPwBNgB4IjgufcIguu4DApCBh+HK7hTIAUAUSCAxaryz3GAAPA7 +BoEB4A94BqFBKYBDz3GAAPA7ZoHPcaAAtA83gcC4MHMA2qD0z3GgAKggJoGMIYOOMAENALBwkfTP +dYAAKMQFhc92pACQQfWGNoYEIIAPAAAA4C244Ljnpc9zgABQwyilBPJQG8QDCfBQG4QABCePH/// +AADnpeG4BfIwv1IbxAMF8FIbhADwf+elUSCAgAXyVBtEAAjwVBuEAAQhgQ///wAAKKUNhgalBCCA +DwAAAP4puFYbBAAfg+u4JPLPcKoAAAQEgAmlz3CAAHCaIIiA4URoN/KA4WQALgACEIQAn3EA2Kgg +wAP0Ig8AFd4TvvAmzxPPdoAAKMMVfgHg4KYe8M9wgAA4qiCIgOFEaBnyAhCEAIDhyiRNcMogLQDo +IK0D9CIPACneEr7wJs8Tz3aAACjDFX4B4OCmIa0CHQIRtBMBAALeAYEB4AGhDfAEIL7PYAAAAAP0 +BN4F8FEjAMAD8gPegeZI84LmFvQC3gQgvs+AAQAAyiaiEQX0USMAwMom4hCC5vTzz3CgADAQA4CA +4MomYhGG5kIEAgDPdYAAUMMclUIghAAfheu4LyQIAXzyz3CqAAAEwoDPcaUACAwggQQmgh8AAAD/ +KLoEIYEPAAAA4Im6O3tFe89ygAAoxHKlzKJtoiCASBWPEJTnKqIa8gX2iucY9CO5DfC35w3y7ucS +9EUp/gJBKcFwUSbAkcIhYgAH3grwRSn+AkEpAXH78SK5+fEA2QjeAYA3pZThC6I8sg70z3eAAKQ1 +44fohwQnvp8ABgAABPKMu3Kl5LjKJiIS4bjKJiEShiD+D0EoAwFNHcIQCJKH5mV4CLIT9I7hB96Q +989wgACkNQOAhBAAABBxCPfPcKAAMBAIgBBxA/II3ofmyiABAaAK4frKISEANwMAAM9wpgAIBAGA +BCCADzAAAAA0uFEgQMZCHQQQQhUBEQz0z3CgAKggCIAZYTB5Qgrv+ohwBfBiCu/6iHAEIIBPgAEA +ANdwAAEAAADZFvQB2E4dAhDPcoAAKMSaFYAQQh1EEE0dQhA3pSmiBLgokom4JXgIsnbwTR1CEM9w +pgCMAz2AUSDAxwQhgg84AAAAQSrABJodAhAEIYAPAAAA8CW6LLhFeM9ygABQwxKlBfISgoy4EqJT +IcMCSBKNAHei4L3RIeKHB94C9Ajez3CAACjEKaCaEoEA6JAEueV5KLB8sIfmMoItoD/0z3GmAIwD +3YEEJoEfAQAAADC5ThpCAMmgThKAAIDgHPKN5Sz0USAAxij0FNjPcaAAyB8eoRDYDqEB2BUZGIAK +3lEgAMbKJuIRUSMAwMomIhKK5vfzFfCO45L3z3CAAKQ1A4CEEAAAEHMK989woAAwEAiAEHME9Afe +A/AI3ofm5/TPdYAAUMNOFYAQgODh8s9ypgDUBCwSAIA0EhKAOBIPgMsSEAZKcca56XKGIv0PBrpF +eUpyhiL9DwS6RXkEIIIPAgAAACe6RXlEJwIcDbpFeelyhiLzDwQggA84AAAADrpFeSW4JXhEJ4EQ +FLkleIi4RCcBEkEpwYBSIEAFEqVYHUIQyiGCDwAA///KIYEPAAAQHzpxN4VAHUQQBCKBL/8DAP8o +uTelZgkv+ADa8r+sHQAQOvJIFYMQMoWg49Eh4YI08gQhgo8AAAABB/JEIQ4GI74B5oHmCfcEIY4P +AAAAJNd2AAAAJCDyBCGODwYAAAAxvoLmNAANAILmCfSA4hTyRCEOBiO+AeaC5g70gOID8szjCvZX +hTJyyiKODwEAiA3MII6AzvfXcAEAiA3I989xgAAUUhyBAeAcoQjeM/CGIf8JQSnOAM9wgABsQSCA +AeZgeQbYEHYV989wgACkNQOACIAEIL6PAAYAAADYyiBiADKFBCGBDwAAAAgruTBwSPfyDAAACHaU +4Mom4hML8M9woAAwEAiAN4UQcQfeyiZiElgVghDPcYAAKMQIkQe6iLpFeAixF4UwGQAEHLESheuh +DaGsFQAQKBmABB2xh+YE9GoIAAAIdoDmyiYhEIDmlAui/8ogggMA2M9xoADUCxChz3CAANzDDYhR +IACACPLPcKAAiCQegAsaHDAWD0AADMyGIPmPCvSE5swm4pAG9ADYj7gMGhwwMtnPcKAAyBwqoJkE +r/KiwPHAQgyP8s9woADUCxiAQiAACEggAADPcYAA8DslgYHhiiGZDgj0z3GAAKQ1I4E+gYAhmQ4Q +cQDdyiVtFIDlO/TPdoAAUMNYFoAQgODKICIAIvQMEgE347kQ8g3MUyB+gAzy67gXhgbyoOAB2MB4 +CvCO4AHYwHgG8FEhQIES9ADYz3GAAKQ1I4EpgT15UiEBAMC5JHiA4AjyH4aRuB+mC/AXhujxYgwA +AFgWgBCA4CwLAQCA5XgCAgDPdYAAUMNYFYAQgOAT8gLZz3CgAPQmI6DPcYAA7KkA2AGhwNmZFYAQ +gLiZHQIQKHAC8ELYz3GgAMQnvxkYgADYDBkAgAHYEBkYgB+F8bgUAgIAEoU3hcoO7/cA2qwdABAf +heu4WfLPcIAApDVDgEgVgRAUgiR4RCADAUQhAAxCKAQBgHPPcIAAWDbBu2hgibgcpXAVjhD0gk0V +gBDEf4Ym/xMEf0S+32fPdoAAjGb0Js8TYh3EE893gAB8OWtnibt9pXSCdBWPEOR7hif/EwR7RL/7 +Y/QmwxBkHcQQcoV6pVSCe6VEeSR4z3GAAJxmgHD0IQIAz3GAAMRm9CEAAI4dhBCQHYQQkh0EEJQd +BBAA2E4dAhCY8E4VgRDPcIAAeE2A4QCAwLhT8oDgANvKICIACvRyhUgVgBAEI4MPAAAACHt7wrgA +II4PgABMNjCO2I7HcIAAeDnPd4AA+KlIiGV+3KVwFY4QZXnDvtx+9CeOE2V6EIhiHYQTBXt9pXQV +gBDDuBx49CcAEDqlz3GAAAiqZB0EEGgVgBDDuBx49CEDAFuljh3EEM9zgABQqvQjAACSHQQQbBWA +EMO4HHj0IQEAkB1EEPQjAAA88IDgANgG9EgVgBDDuBx4z3GAAEg2CWHPcoAA+Kk8pXAVgRDDuTx5 +9CJBAGIdRBDPcYAAbDkIYR2ldBWAEMO4HHj0IgAAz3GAAAiqUoVkHQQQSBWAEMO4HHj0IQMAWqXP +cYAAUKr0IQAAjh3EEFulkB3EEJIdBBCUHQQQcg5AAc9wgACkNQOACIDruAbyThWAEIDg0A7CBVgV +gBCA4AXyNggP/wPw0gwAAAh1fQGv8qlw4HjPcaAAxCcVEQOGBNgTGRiAG9gWGRiAA9rPcKAA1AtR +oOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4UaDku+EgwgcW2FIRAIbguOEgwQfKIOEF +USBAgATyUSPAgATy4H8S2AHZz3CAAPgzz3KAAFDDtBIDACCoBoMB4AajH4LuuAfyz3CAAMQJIKAH +8O+4BfLPcIAAyAkgoBXY4H7geMHYFBoCMM9xgACkNQOBGIgB289ygABQw4bgF4LCI8EADOAYIMAA +ZhoEAGYSAAED4AQggA8AAPz/nbifuOxzAKMFyOxzAKMDgRiIN4KG4AHYwiABABghAQDscCCg4H7g +ePHACgiP8oINT/XPcIAAUMMygFEhQIIS8s9xgACkNSOBSBCCADSBRHlRIYCASNrKIoEPAACQAAPw +DtoA389xoACoICeBrBANAFlhsXHCJUUQyiXmErB4Rgqv+grZz3CAANhJAJDPdqAAxCdRIACBBfKM +JQOSA/cA3R3wgg+gAQDYz3CrAKD/+qAA2NILb/WOuB4Oj/0ZFgCWgOAF8gLYEB4YkM9xgAAUUhuB +ar24YBTdG6EZFgCWgOAH9FEhAMaEDmEFyiBhAK0Hb/KpcOHFz3GAACjEQYnA2xQawjDPc4AApDVj +gxJqR+AEIIAPAAD8/2mDKrvAuxe7x3MADgAAZXjscwCjBcjscwCjSiTAcwDbqCDAAfAhzQDscKCg +AeOA4gDZzPfPcIAAKMPwIEMA7HBgoAHhUHG49wDZz3CgANQLLaALzAHgEHgEIIAPAAD/v4+4Cxoc +MM9xoACIJB6h4H/BxeB48cCmDk/yz3eAAFDDoJcIdqlxhiH8A0IpBQFEJQgTjBcBEUIoiBBA2M9z +oADUCwoiQIAPo8oiYgCsFwAQQCqGBc9ygAAoxC8kCAAdsjgSBwFALAQEBScAAQujQYoCukjiT6Nm +FwIRUSWAkllhMHlmH0QQBvQOl1MgwIAR8s9wgACkNQOACYBRIACAPdjAKOIFyiChB8AoIQYJ8EAo +ABGgcM9ygADcNAhiF7gD4QQhgQ8AAPz/BSCAASV4nbifuAujC8wB4BB4BCCADwAA/7+PuAsaHDDP +cIAApDXNowOACIDruBDy5L4O9KoL4AXJcM9wgABkxKDZxNo92woIoAEXuw0GT/LxwOHFz3CAANgK +AJDPcYAA+LGo2gHdgCBECxB4Wguv+qlzgODKIcEPyiLBB8oggQ8AALUUyiOBDwAAzADKJCEAZAGh +88olAQEKCUAAz3CAAJxDyQVv8rSg8cA6DaABANiuCI/2Ag/P/boJD/sA2IYJb/WOuNILj/3/2c9w +qwCg/zmgOKDRwOB+8cDhxc9xgACkNfAhAgBKJEAAwxIBBg94MiKCDwAAHwMEIYMPAAYAAIDjAdvA +ewQhjQ9AAAAA13VAAAAAwiQCAc4LL/vAuU0FT/LgePHA0gxP8hYKoAIIdc9xgABQwx+Bz3agAMQn +sLgfoRkWAJaA4ADZBfIC2BAeGJDPcKAA1As3oD4PAAE6COADAdiA5QXyyg8AAAXwqg8AAG4PT/oZ +FgCWgOAE8gLYEB4YkN0ET/LxwFoMoAEB2ADZz3CAAJhRLqD+DO/0GdjRwOB+8cBGDE/yosGLdqoP +r/nJcAolAJAZ9M9wgABQw89xoAAMJDuBV4AwcsolIhIghvC5BPIC2YwYRAAEJYJfAABwxz+ARXk/ +oIDlbgQCAADA6bja8s91gACAQQCFiiEIAOSQz3agAMQnEx5YkM9xgABQwz+BOnfxuYYh/CND8kEp +ASHDuc9ygAAcbTZ6IIJAeQh1GRYAloDgBfIC2BAeGJDPcAAA/38THhiQG9gWHhiQA9nPcKAA1Asx +oOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4MaDPcIAAWJcZgIDgGA9CAZrlzgMCAM9w +gAAI5goM4AMA3b8DAABqDG//KnAacACFTgsv/ypx3gsv/wh3iOfMJ+KVyiXBEy3yTCAAoAvyngsg +AIHACiUAkBz0egzv/wHAGPAD2c9woADUCzGg4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HgxoADdmucH9M9wgAAI5o4LwAOA5T4DAgDWD8ABz3CAAFDDH4DuuAjyAdnPcIAAxAkgoAnw77gH +8gHZz3CAAMgJIKARFgCWAN1RIICAQcAY9P4Nr/mBwAolAJAS9AQUBTBRJYCADPQKIcAP63IK2Iy4 +iiPHCnkGb/OKJIMPgOXWAgIABNgTHhiQG9gWHhiQz3CAAFiXGYCA4AAOQgG3AgAA4LgqAgEAz3aA +AFDDEoaGIDoAjCAEgjgPxQHPcaAADCQ8gReGInhkuBB4ih4EEEQiAFOI4Ar0H4bxuAb0USVA0QHY +BvQA2ATwigtP/4DgnB4AEH/y3g0P/wolAJBWAgIADcxRIMCBEfIfhlEggIEN8i8ghwqMIAKGB/TP +cYAAUMMfgZi4H6E6CiAAgcAKJQCQIgICAM92gABQwx+G8Lhi8qgWARDU2OoPIAHJcs9ygADQLCGC +USEAgEb0ANmOuSCiz3GgAMAdR4HPc4AAREwgk4Yi/w4vJkfwIroo9M93gABsT+yPBCGBD////8KI +uYYn/xFDv4Ynfx+C5wHfwH8vJsfzAd/CJ8ET5XoKukV5TyFCAwQhgQ8AAAA8TyF+g1B5QLME9Iu5 +ILPPcqAA/ERtggQhgQ8AAAA8BCODD////8NleS2igOAI8h4JQAUK8E4PD/+w8M9xgACQUh6BAeAe +oQHfz3CAAPgztBYBEOCoBoEB4AahH4bzuIQMwvkPhoDgoAvC+R+G7rgH8gHZz3CAAMQJIKAI8O+4 +BvIB2c9wgADICSCgANjPcaAAyBwHoTDYCqH2Ce//AcAfhvi4EvIQ2AwaHDDPcIAACOYyCcADDcgA +IIEPgACIwh+G4Km4uB+mAJaGIPwAjCACgBz0MgmP+YDgGPQD2c9woADUCzGg4HjgeOB44HjgeOB4 +4HjgeOB44HjgeOB44HjgeOB44HgxoACW9g7v+zSWRfBRIMCAQcAV3wT06XUh8AjYz3agAMQnEx4Y +kP4Pj/+U4Ah1FfIC2DweAJAhFgGWz3CAAOypIaARFgCWUSCAgOb1Rguv+YHACiUAkODzleUd9M9w +oACQIx6ABBQEMFEggIDKIcEPyiLBB8ogYQLPICEDyiOBDwAA5ASsA2HzyiUhAJYOr/+IcAh1qXDt +By/yosDgePHAkg8P8qHBCHYA2EDAAKbiCq/5i3AKJQCQivTPcKAABCUigACGBCGBD/8AX/8FIQIA +QKZTIYIAUyCDAGV6h+JV9FEigNPPcIAAUMMfgD3y+rhe9AQgvo8AHgAAA/QAhgrwUSKAwP/1USIA +wACGBPKFuACmz3KAAFDDP4L5uQfyiLiLuI64AKZC8Pu5E/JPIAECibmNuYu5jrkgph6CBCCADwIA +AABSIEAEKrgleACmLvD8ucUggg8AAAAF4/WFIBwAAKYk8PW4AIYi8oYgHACFIBgAAKZRIgDB//VR +IsDAAIYW8oa4AKYS8FMhAwBTIAIABSO+gMol4RUK8oYhfw+GIH8PBSE+gMoloRTPcIAA3MMMiMS4 +QCgBBgCGJXhRIIDEAKagDSIFyiAiCKlw0QYv8qHA8cDhxQDdBdgLuOIIb/qpcboND/PPcIAAUMMf +gOu4DfSE5doABgBRIEDFafRRIADFVfQB5VTwANmcuc9woADQGzCgAdnPcKQAmEA8oAXYCPAuCQAA +Zg0gBQXYAdheDQAFhOVuAAYABCC+zzAAAAAB5colIhBRIwDAGvRRIEDFBfJRIYDDJfJRIADHG/RR +IMDF5fNRIYDD4/PPcKoAAAQBgIYgPwuD4ADd1PUT8NIIAADPcYAAmFEOgQHgDqEJ8ADZnLnPcKAA +0BswoLYIAAAA2c9wpACYQDygEfAA3VEjAMAF9NoMIAUB2JzxlggAAM9xgACYUQ6BAeAOodkFD/Lg +eAzMRCA+ijvy47gh8g0SAjeA2M9xgAAcUeu6DBocMAbyHYEB4B2hBfAVgQHgFaFRIsCAB/QA2c9w +oAAsIC+gDcyGIIIC4H8NGhwwUSBAgRfyiiAEAAwaHDDPcYAAHFEUgQHgFKENzADZRiCAAg0aHDDP +cKAALCAvoOB+4H7xwM4MYAEB2KIPL/ID2CYIAAC+DGABAdjRwOB+8cDmD8//Zg7P/6YPD/rRwOB+ +4HjxwLIMD/LPcaAA/EQFgQDevLgFoYoMYAHJcAPdXg8v8qlwz3GgADAQoqHPcIAA8Duioe0EL/LG +oPHAz3CgALQPN4DPcIAA8DsGgBBxBPS2D8//BPCaD8//0cDgfuHF4cYA2QfYANq0abR9x3WAAPix +VX3AlYwmAp0A24X2jCaFksP2/97AtcGdvOYF9owmP5FC9mG1AeJPeozip/ZhuIDgAeEveSD3wcbg +f8HF8cAGDA/yAN3PcIAAMKneC2/5tKiA4BPyCN6A5cwlopDMJSKRzCVikfgKYv7KIEIDYb6A5gHl +M/cc8IokAXHPcYAAAMKoIEABBBlQA+B4ANlKJAByz3KAAKzBqCAAAxYiQABikM9wgAB4wjR4AeFg +sM91gACkNc92gAB0qUAlABckbiIJIAIG2kAlABVAJoESEgkgAgbaQCUAF0AmARQGCSACBtosFYAQ +hOAJ9DwVgBBeDy/+LYXmCs/4DoVRIECBUAlCA8oLT/mA4MQOwv/PcQAA///PcIAATOMsoNoNb/kr +oJEDD/LgePHAHgsv8hTZz3WAAJw52NzuDa/zAiUAE89wgADoO+INr/MU2c92gACkNUAmABUApsDc +AiUAEwGmAN2pcKlxrgiv8gbaAdipcaIIr/IG2gCGSiSAcKlxAqYDpqggwAUVJkIQYIKKIMYNDbMA +ggHhqaAAgqmgAILAGFgDAILBGFgDAILCGFgDG9nPcIAAbE/9Ai/yLKjxwHIKD/IacDpxSHa2CG/5 +mnMIdQQmgB8ABgAAgOBKIkAgwiKCJAQmjh9AAAAA13ZAAAAASiNAIMIjwiTPcIAA5AnEiADfMgpg +AelwgOUN9APeLyEHBC8iRwTJcEpzHgnv+gokwATJcEIJ7/qKcYDlBPS6CUADBPDqCUADz3CAAPA7 +BIBRIICAEPLPcIAAsE0AgIDgCvQ52MoIb/mLuIHgBPQKDc//DfAA2Z65z3CgAPxEIaDgeOGgvglg +AQDYCQIP8uB48cDCCQ/yo8EIds9wgACkNfAggwOKJwsWLZP9Yzx6KHCGIfEPwrpHuSR6UHGGIP4D +RLgP8gohwA/rcoPYjbiKI9INSiQAAIEFL/MKJQABSIN/Zzu6UyICgECvTZPAukGtC/L3k4Yn/xlD +v+etd5OGI/4HRbtorYDiE/LPcoAAxE0VIgMAAIs1egKt4YvjreKL5K1ji2WtI4pSDuAAJq2LcKlx +5gkv8gzaAMABwVYLL/MCwotwqXHSCS/yDNoAwAHBqgov8wLCz3GAAIgKAKFqCuAEyXBVAS/yo8Dg +ePHA6ggv8lfYz3WAAKQ1I4XPcoAAjAp3keC7AKID8l/YAKLiuwPyhbgAolEjQIAE8oe4AKKKJgsW +y2HZYQDagOPKIIEAz3KlAOgPBqIAic9xoACkMIDgAYHPIOIA0CDhAAGh8gsP9gOFz3GgAMgcT4AC +4Eihtg6gAchgA4W6DO/0DoAKDw/90QAP8uB44cXPcIAApDUDgCmARCGDgADaJfSQ4owABgAAIo0P +gADcNACNoLgArYAVgBCguIAdAhBAFYAQoLhAHQIQEI2guBCtkBWAEKC4kB0CEFAVgBCguFAdAhAB +4t7xkOJEAAYAACKND4AA3DQAjYC4AK2AFYAQgLiAHQIQQBWAEIC4QB0CEBCNgLgQrZAVgBCAuJAd +AhBQFYAQgLhQHQIQAeLf8ea5EfLPcoAA3DQIioC4CKqIEoAAgLiIGgIASBKAAIC4EfCA4xH0z3KA +ANw0CIqguAiqiBKAAKC4iBoCAEgSgACguEgaAgBRIQCAANgd8kokAHTgeKggAAbiuBXyACCDD4AA +3DQgE4EAgLkgG0IAoBOBAIC5oBtCAGATgQCAuWAbQgAB4BzwSiQAdOB4qCAABuK4FfIAIIMPgADc +NCATggCguiAbggCgE4IAoLqgG4IAYBOCAKC6YBuCAAHg4H/BxfHA9g7P8YHgz3aAAKQ1GnAD9ACG +AvABhsQQAAYVJg0UTCAAoAHfJbhTIAUAIIXAf0AhAAbEEQEGUSFAgQz0CiHAD+tygdiNuIojjQ+x +Ai/zCiQABIoiCw1ZYAAWA0BYYGCgABYAQAGhABaAQAipABaAQAmpz3CAAPA7BYCB4Af0QIUAFgBB +D7ID8AAWAEEAFoBACqkAFoBAC6kAFoBADKkAFoBAABYAQQexABYAQQixABYAQOYMD/0AhcgQAAaG +IH+ORPTwJsATyBAABoYgf4489Apw4gtv9wHZ7g/v+y8gBwQuCeAECnDPcIAA7DgskB6WEHEF8goL +T/gScCb0AIXEEAEGCnAlucC5ugsv9ADaZghAAYDgCfQLyAUggA8AAAA8CxoYMJ4IQAGA4Aj0C8gF +IIAPAAAA1AsaGDALyJC4CxoYMP4JD/LWCQ/3DQbP8fHAhg3v8QDZCiQAoKHByiFhABXyz3CAAPA7 +EBAFAFElgIAN9AohwA/rcn7YjbiKIwgNfQEv8wokAAXPdYAApDUVJQ4VAIYVJVIQJBAVAAASASAg +EBYAKBAXAUEtTyEpgRoQGAHAvyW5UyETAAoIYAQN2YogiQCKcTYOb/vpchYP7/2KcACGCYAluFMg +EACKcNYKb/cA2UwkAKAQCcH/TCAAoETygOcO8gohwA/rcn/YjbiKI4kHSiQAAPUAL/O4c2YIAALC +CS/3AdgAhgiAUSAAgAryLBWAEITgBvI+C+/0A98F8DoL7/QF30wjAKA6dw70ogrP+koKz/rPcIAA +uE0DiIDggA6hAMogIQAsFYAQhODKIIEPAACAACgP4frKIWEASiMAIE7wag9v/4pwWgkv9wDYLBWA +EITgyiCBDwAAgAAAD+H6yiEhAEwkAKAP9EIKz/o6Cs/6rg7P9doMD/mA4GgPwvUA2B/wSg/P9coM +D/mA4AT0HgsABRbwz3CAAOw4CIiJ4Mwg4oHv9c9wgABIYgCABNm92h7bQMCLcGoO4AAYuwHYenAA +hgiAUSAAgAbyLBWAEITgBNgD9AbYOnAAhiiAFJAEIY+PAAYAAAV/BvL2ucInohDAJ6EQKnCKcTYP +b/TpcoDgyiBCBDAOYvTKIcIDTCMAoATy1g/P9qbwkgsP+QTZz3CAAPA7Pgov/SSgIIbIEQAGhiB/ +jkP0Wg3v+4pwmg6gBIpwABIAIMgQAAaGIH+OQvTPcIAA7DgskB6VEHEF8moIT/iScDb0inAKcSIJ +L/QB2n/ZEbnPcKAAsB80oF4ND/m+DQABgOAJ9AvIBSCADwAAADwLGhgw9g0AAYDgCPQLyAUggA8A +AADUCxoYMAvIkLgLGhgwVg/P8QzwJBlABSCGIBmABSCGKBnEBSCGGhkEBtoKD/mA4AvyTCQAoADY +BfQKCQAFA/DmDsAEAd0WDiACqXDPcIAAxDNmDSACoKhMJECgFfTPcIAA7DgIiIngzCDigQX0TCAA +oAf0iOAH9DILD/mA4APycgiP8/YPj/i6Ds/2BMqQ4Mwggo8AALMAD/IKIcAP63IBEgQ2ktiNuIoj +jQZ1Bu/yCiUABVIN4AEA2IEC7/GhwOB48cBaCs/xAN3PdoAApDUI3wCGxBABBkEpQAFRIACADvKA +5cwlopDMJSKRzCVikQb0gOXMJaKQDfRRIUCBDPSA5cwlopDMJSKRzCVikQT0Lgkv/qlwYb+A57gH +7f8B5c93gADQOM91gACUqUAnABUkbYoPoAEG2kAnABNAJYESfg+gAQbaQCcAFUAlARRuD6ABBtrO +FgAWz3GgAMQnz3KAALA4dxkYgBiSeBkYgNAWABaAGRiAHJKBGRiADxEAhoO4DxkYgP0Bz/HxwI4J +z/HPdYAAGAoAhQDegOBoDYICDMzguDzyz3CgAMgfsBACAM9xgACkNSOBAuJGEQEBYbkIIkEAPqAQ +2S6gAdkVGFiAz3CAAAjiAxoYMM9wgADQ4moLYAMEGhgwz3CgAPxEJYBKIEAgvLkloAzMhiD/gc9w +gADYCQCAwiABJIDgNAxC/QQgj08wAAAAHvDtuBryEgzP/s9woAD8RCWAvLkloM9wgACYUQ6AjCAC +jYf3qgpv9BnYygggAQDYDMzvuBj0yXcadgDYz3GAABRSDKHPcIAA/DMQgACADqFW8HoKb/QZ2J4I +IAEA2AHeTvAE2AYaGDDPcKAAyB8/gIDhiiEMAMohgg8AAAACLqAD2RW5EhhYgACFgOAsDIICNwMA +AFEgQMUMEgE3JfIGyIYg8Y8h9M91gAAkUIgVABYEIb6PAAAAUAHgiB0YEATyBNgMGhwwUgvP/s9w +oAD8RCWAvLkloGsVABaMIAKNdAfG/wHeDMzkuHD05rh59IYg/4W58lEjAMCD9AbIBCC+jwOA6FPJ +9VEgQMXF9Q4O7/kA3m4Nj/RMIACgz3WgAMgfHPL/haAVABAJJwAQ5ODM9s9wgACswQCAUSBAgAby +3qUGCOAAENjk58j3QBUBFjB51grv+RDYiiAIAKAdgBMOpR+FgOAF9IogBAAOpXIMQAEv2JW4Eh0Y +kM9wAQDA/BUdGJBWDwADz3GAAEBMAIGH4OYBAQDPcKAAOC4FgAQggA/AAAAA13DAAAAA4PL12gW6 +z3CfALj/WqAH2lugadoYulmgAdjV8A3MUyBAgJjzBMgDEgE2AxoYMAQaWDBWCUADz3CgAPxEJYC8 +uSWgz3CAANgJAICA4DAKQv2A8VEgQMV+9QzMz3WAABxRUSDAgB/ygNgMGhwwDczruAbyHYUB4B2l +AN4F8BWFAeAVpc9wgABsTxGIUSAAgHAKIgPKIGIAgOcR8hyFAeAcpQ3wiiAEAAwaHDAUhYDnAeAU +pQXyG4UB4BulDMznuD/yDcwEIIQPAAAAGAwkgI8AAAAIG/KqDM/2DcxRIMCAJPLPcKAALCAlgAaA +CuEQcRj3AxIBNgLYDBocMFDYgg/v/ZgRAQCX8VYNL/jJcFEgAIAG8gjYm7gGGhgwHPEE2AYaGDAY +8QPIoBAAAPC4ANhB8m4PT/cA2Ja4O/DouCj06bg69AQgvo8AAABQDvJRIwDACvKKIQQAz3CgALAf +NKAE2AYaGDANzO+46AXB/89xoACoIEiBz3GAAMjDL5EwctQFxf+vuM0F7/8NGhwwvgmv+4ogBADq +C+/2AN0DyKAQAADwuKlwBfL6Dk/3ANiVuFIPQAS28eoOb/cB2ADYkLj58QDYgeAD9AfYAKHPcIAA +GAoAgIDgOAmCAs9xgAAUUgyBTYEIIgAADaHPcIAA/DMQgE+BYIAOgQJ7AMoIIsIAiOBPoQr0A9nP +cKAAQC0woAAagjMF8AHgABoCMKEFj/HgeM9xgAB4TeB/AKHgePHAHg2P8c9wgAAITgDf6KDPdYAA +MAsBhYYgeY/rpQj0A9jiCe/4C7iA4A70BtnPcIAAaAsgoM9wgABsC+CgKQIgAADYz3CAAGwLAICA +4BwCAgACFYUQAxWGEM92gABMxUAmkhCocIQoHwAvcwAjgQ+AAFTMFSGBARuROpFAJhEaQCYQFQAm +xBAEFAQBemZDgoDg22NKI0AgIPIwcE73CiHAD+tyz3AAAHsniiPGAQokwASBAO/yuHOA4hDyUHDK +IcYPyiCGDwAAfCfKI4YPAACJAcoixgdt95BxT/cKIcAP63LPcAAAfSeKI0YDSiRAAEEA7/K4c4Di +D/JQccohxg/KIIYPAAB+J8ojhg8AAI8ByiLGB2z3DIWA4BL0B4WA4A70z3CgALAfZBjABM9wgAD8 +MwiAAIAcHcAUCaXPdoAApDUDhiWDKKCocIQoHwAAIYB/gAAYzDDg9CCBAQOGNLADhiaDKaADhiWT +LbAC2Ahxjgkv8gDajgpAAAKNhCgfAC9xMCBCIAONx3GAABjMMOH0IQEAUyIAABIJr/8A2wKNhCgf +AC9xMCFAIAAhgg+AAEjKI40CuTR5Gg3gAFlhWg6gAQHYRgrAACKNQ42EKR8AACGAf4AAmMtVeGyA +USMAgAzyz3OgALAfZBvABM9zgAD8M2iDYINipWKGhCkfAMITDgaBvsIbmAMMgMC4UiAAABt4VXgA +IIIPgABUzDTiNCJBDgq5MiJALiilz3GAAGgLUSBAgAnyz3CAACjFIBCAAIHgBdgC8gTYAKHPcIAA +bAvgoAyFgODKICEAPA0h9MohAQAB2BEDj/EKIcAP63LPcAAAfyeKIwcISiSAALUGr/K4c+B48cD+ +CI/3ANjRwOB+8cDeCe/44cWA4DTyz3GAADCpFImB4C7yN4mA4Qnyz3CAAMizAYAQcQHYwHgU8M9y +gAC0nQuKhiD/jB7yz3GAAMizYYGkirFzANgF8iCKMHMC9AHYgeDPcYAAXAsAoQr0z3CAAMhYJoAj +gSCB5g9AAqUCj/FGCI/37vHgeM9xgAA0CwCBgLgAoc9xgAAITgWBAeAFoQbZz3CAAGgLIKAA2c9w +gABsC+B/IKDgePHA8gmP8c9wgAAyCwCIz3OAADMLwIsB3YQoHwAvcQAhgg+AAJjLmHAw4vAigAPA +uIHgACGAD4AAGMww4PQghQPHcYAATMXAfQHm44nPfvF2PgAqAMCr9CCPA7B3GfSA5Rfy8CKPA1En +AJAT9AHm44nPfvF2TPb0II8DsHcI9IDlBvLwIo8DUScAkPLzwKsDiRB2WAAKAPAigAOELB8AwLhS +IAAAG3jVeAAggQ+AAFTMNOE0IUAOz3GAAFALCrgAocdwAAAAGAIOj/jPcoAAaAuA4M9xgABsCwby +A9gAogDYAKEG8AbY/PHqDs//bQGv8QDY4HjxwP4Ij/Glwc9wgAAwCwQQBQAB3c92gABsC6h0hCSG +kAAWBBAT8kwkAIDUDCL3yiAiAQHZz3CAAGgLIKAA3c9wgADpXqCoqXdh8EwkAIAv9ALaz3GAAGgL +QKHPd4AA6V4gj6CmgOEA3gn0z3GgACwgMIHHcQAAAH0toDQQBwDPcAAAeIBAwATYQcAB3ULFQ8ZE +xqlwENkE2gDbmHO4c5INL/fYc8CvqXcx8EwkQIAY9APYIg2v+Au4gOAQ9M9wgADpXqCoOgwv9wTY +z3CAAGgLoKAA2ACmAN0B3xnwTCSAgBz0z3GAAOleAN/gqU8lgQAhoM9xgAAITgaB4KYB4Aahz3CA +AGgLoKDpdYDlHA8BAOlwVQCv8aXACiHAD+tyz3AAAHon3QOv8oojhQLxwOHFz3KAADALIYKlwSh0 +hCQGkM91gABsCwAVBRAY8kwlQIAE9HYLD/MK8IW5IaLPcYAACE4KgQHgCqEB2c9wgABoCyCgANgA +pS3wTCUAgCX0AdpApYYhOY8A2M91oAAsIM9zAAB4gATZsIVAw0HBQsIF8hDZQ8EC8EPARMAA2AbZ +BNoIc5hwuHAAJYcfAAAAfXIML/fYcATwTCVAgAb0AdipB2/xpcBMJYCAz3CAAGgLDPSFuSGiz3KA +AAhOKoIB4SqiAdnA8QAQBAAKIcAP63LPcAAAhCf9Aq/yiiNOCPHA7g5P8c92gAAwCyGGUCEMAKe8 +UCQMki8qQQAG8hoLL/NOIsAHF/AodIQkBpAW8gYLL/NOIsAHAYbPdYAAYEGGIAYAAaYAhYDgBfJA +eADYAKUBB2/xAdjPcIAAbAsAgIDgmfRRIQCAz3WAAKQ1fvQCjkOOhCgfAC9wACCBD4AAmMsw4fAh +gwAB2QK6Znk0esdygABUzDTiEGIKuAimx3AAAAAYIguv+EogQCDDFQEWCHfPcIAAAMI0eBGIgOC+ +DK/4wiACJIDnzCAioMwgIoBD8gKOz3GAAEjMhCgfAC9wE2HPcYAAEAogkTBzQ4Ua9MdwgABMxWWA +KIJTIw8AUyENALF3DvQDiIHgxCOBDwAGAADEIYEPAAYAAMwjQYAE8gDZA/AB2QmCz3OAAGgLUSBA +gSymB/KA4QX0GIqD4ALYAvID2ACjANnPcIAAbAuKDCAAIKB/8YDnffPPcYAAFFIegQHgHqF38YoK +oAAB2ACFxBAABiW44g/v88C4Gg7v8xTY5guv+gTY4g4AABoJj/lh8QohwA/rcs9wAAB5J/3bSiSA +AFEBr/K4c+B48cBGDU/xz3CAAGwLAICA4Jr0/ggv8wHeAtjqCu/2yXHPcIAA5AkAgM93gACkNSaA +nhEABqa4nhkYACOHSIE0kVMiAAB+Cm//yXMqDCAAAN0C2Klxwgrv8QLaIofCEQAGobjCGRgAAIfE +EAAGJbjAuD4P7/Opcc9woACwH9mgz3CAAPwzCIAggM9wgAAwCyKgyg8gBALYmg9gAclwz3CAAPA7 +BIBRIICAEPLPcIAAsE0AgIDgCvRuC6/4iiDMDoHgBPSqDw//DfAA2Z65z3CgAPxEIaDgeKGgXgyg +AADY4guP/UOHz3GAAGgLCYJRIECBC/LPcIAAMAsMgIDgBfQYioPgB9gY8s9wgAAwC0KIz3CAAFzF +hCofADAgQA6A4Anyz3CAADALAYCGIDmPA/LAoQPwCNgAoc9wgABsC6CgcQRv8QDYCiHAD+tyz3AA +AIMniiNNBkokgADxB2/yuHPgePHA4cXPcYAAMAsEEQQAz3WAAGwLiHSEJAaQCvIB2c9wgABoCyCg +ANgApUXwAIWA4DH0iHQCiYQkhpCEKB8AACGAf4AATMUO8hAQBQAKIcAP63LPcAAAjSeRB2/yiiMP +ALII7/YEgAhxz3CAAORYLglAAs9xgAAITgyBAeAMoQ4M7/MU2NYJr/oE2APYAKUB2BHwg+AR9M9y +gAAITg2CAeANos9wgABoCwHaQKAA2AClB6GtA0/xCiHAD+tyz3AAAIUniiPPBkokgAAhB2/yuHPx +wBILT/HPdoAAMAsijs9wgABYxUIgkAKEKR8AMCBADi4Mb/Uphgh3AYbPdYAAbAuGIHmPDPQA2LIP +b/iMuIDgBvIMhoDgzCdhkBn0AIWB4IwOwfIMhoDgzCdhkAf0z3GAAAhOAIEB4AChBtnPcIAAaAsg +oADYAKWi8AKOI46EKB8AACGAf4AAmMsw4PAgQABRIACAAN8u8giGSgtv9SKGjCAQgEwAKQAghYHh +MA7B8gOGz3OAAAhOgODooxHyJIYA2gDfDydPEAYgwIMvLwEQA6ZOJ4EXAeL19SSmSKMF2c9wgABo +CyCgBNgApQDYaPAghYXh3AANADMmQXCAAGxgQCcAcjR4AHgCjoQoHwAyIEAuUSBAgEwMgQMCjiOO +hCgfAAAhgH+AAJjLMODwIEAAz3KAAGgL4LgF2QjygLgDpgDYBKYgpTzwz3OgALAfAdgZo89zgAD8 +M+iDYIdipmCHIKIA2WqmIKUq8AOGgOAU9AXZz3CAAGgLIKDPcaAAsB/gpQHYGaHPcYAA/DMogSCB +KqYW8OC4B/QvKAEATiCBBySmUghv+wSGz3CAAJxaAd5WDWAAwKXJcALwAdi5AU/xz3GAAAhOB4EB +4AehBdiP8QohwA/rck/YB7iKI0kKSiSAADkFb/K4c89woABMLguA07iZAqADBtnxwOHFz3WgADgu +R4XPcIAABE4A2UCgJ6VeCKAEINgHhYq4B6ULyAQggA////8DCxoYMAvIj7gLGhgwC8iQuAsaGDBV +AU/x4HjxwKoPz//PcIAABE4ggM9woAA4LiegOgiP/dHA4H7gePHAsghP8ToPb/gB3YDgz3aAADAL +AYbAfYYgeQ9CIACAyiBiAAi4BX0A2GINb/iMuIDgAdjAeBC4BSB+gyLyC4aB4BX0Ao4jjoQoHwAA +IYB/gACYyzV4LICAuSygz3CAAAhOgNkpoADYC6YG2c9wgABoCyCgz3GAAGwLANgAocfwYo5DjoQr +HwAvcAAgjQ+AAJjLVX0shVMhBIAi9OuGgece9E8kAwBSIwMAe3tVe4C5x3OAAFTMLKU04xBjz3GA +AAhOgN2poQq4ANkIps9woAAsIAOAK6YCpgTZyvHPdYAATMWEKx8AQCUAEzAgQA4CCW/1KYaA4EAl +kBEe8gyGgOAa9CiGz3AAAAEUCCEAAJkgCgDeCG/1IoaA4Afyzg1AAKYNj/+j8c9xgAAITgCBAeAA +oZ3xz3eAAGwLAIeA4BHyhOBZ8gohwA/rcs9wAACCJ4ojSw5KJIAAYQNv8rhzCIaOCG/1IoaA4Ary +BdnPcIAAaAsgoATYAKcA2EnwAo6EKB8AL3AZZSORgOEdZSryI47HcIAAmMsw4PAgQABRIACAIPIC +lQq4Sghv9SqGgOAh8s9ygAAkUBmCOIICeQSCRYJCeDhgIo6EKR8ANCBBLjBwCPfPcYAACE4BgQHg +AaET8AXZz3CAAGgLIKAE2ACnAdgN8AiGjg8v9SKGCiEAgBIADwDqDEAAwgyP/w0HD/HPc4AAyFgG +gwOAQIBocE4MIAJZYToPr/MU2OPx4HjxwI4OD/HPdoAAbAsAhoHgQArB8gDdz3CAAGgLoKDPcIAA +5FimCyACoKbPcIAAyFiaCwACz3CAADMLoKjPcIAANAugoM9wgABMC6Cgz3CAAAhOqaAC2KlxAgyv +8QhynQYP8eB44H7geOB+4HgUuCV4z3GgADguBqEGgf+4/vPgfs9xoAC8LRV5WYExgc9zoADALzBy +CvSgEwGGESEAgAHYwiABAAS4BvBAIgAEInjDuOB+4HgA289xoADAL6UZ2IAP2gi6oxEAhkR4jCAQ +gPzzFBnYgKMRAIYLIICA/PXgfpTgyiIFAIX3CHKAIsIEz3GgAGgs8CGBAADbz3KgAMQsZ6Joogy4 +nbifuCV4BqLgfvHAfg0P8Qh2ng/v/yh1yXBOD+//qXHVBQ/x4HjhxTDbAN3PcKAAyBxpoAPaz3Gg +AMwXIRmYgE6hp6BqoOB/wcXxwDoNL/EA2c9woAAMJFiAz3WAAFDDrXBBKoYHhiD3D5gVgxApuHZ5 +wHHHcYAA+N4VeQARhADPcIAARB8ggEAszgDVftBh2WFEII+AUyCOAAQigA8AIAAAzCAigAb0gOfM +ICGAANgD9AHYz3egAMQnQCsFBoYj/Q9MJACEUiPDAbQAKgBFu4DmzCAigFTyz3CAACxu8CCHA0Au +hgOC5gUmxgEFJYABBXtBH9iQJvQfhRDamrgfpQjYTx0CEM9woADIHEmgB4HPcqAA8BcGogaBBqIF +gQaiBIEGogDYCqKKFQARaLgQeIodBBAAlYYg/4wp9AHYHaIn8E4VgBCA4CP0ihUAEUylZLgQeIod +BBCD5gTZTx1CEAz0KxcBlmS4EHiKHQQQDNgtpU8dAhAmDS/4iHAJ8AUjQwFBH9iQH4WzuB+lYQQP +8eB4ENrPcaAAyBxJoQHbz3GgAPAXaqGkEAIA67om8gLaXaHPc4AAiNVEg0ahQ4NGoUKDRqFBg0ah +cBAAARzgUyDAgAT0QCMACATwQCMADECAU6FMaECCU6H4EAKCU6H8EACAE6EP8FyQhiL/jAP0faFI +gEahR4BGoUaARqEFgAah4H7hxS+Az3OgAPAXz3KgAPwXKKNAEAEBKrIxgCijSBABASqyM4Aoo1AQ +AQEqsjyQhiHzD4whDIAH9DaAKKNcEAEBKrJwEAEBvJAI4aiyvZCoslQQDQGosmAQDQGosrmAp6O6 +gKeju4Cno3IQAAE4YBB4CLLPcKAA9AcnoALZz3CgAMgcJ6Dgf8HF8cAaD8/3lgoP+NHA4H7geOB+ +4HjxwNYKD/HPdYAAUMMXhZjgz3aAAJjfBvJYFYAQgOAF8lqFO4UD8FyFPYXPcIAAeE0AgFEgAIAJ +9BKFBCCADwAAABAFegV5z3D+//8/BHpBpgDf4qYkeA2mDthmCm/4DqaA4Ajyz3GAANw4rgngAAHY +z3GAALg1ogngAADYF4WU4Ab0AdgBrjEeAhAG8OGuMR7CEwDYz3KAANAsIYKGIb+NOvQA2Y25IKKA +4MAiIQPAIiIEIILPcKAAwB1SIQ4AB4DAvkQgBAHPcIAARkygkC8mR/NBLIQAHfQEJY0f////wgu+ +xX2IvUAsgwKle08jDgMEI40PAAAAPE8lDBNPJEyTjb7AsAX0i7uMu427YLAvIUMAIKIpAg/xocHx +wK4JD/E6cQh2SHc2CC/6AN2B4MogQiML9M9wgACwMwCQgeAB2MB4QCgQA8lwhiD8AIwgAoUj9M9w +gABQw5gQgADnuMogIgAK9AK4FnjPcYAAENcAYS24wLjPcYAAsAoggVEhgIDPcYAAyMMUeQTyINqt +kQrwmNqrkQbwz3CAAIzDs5AO2gGXQCUBFRBxRvaieEggAAAQeAPwANhacADYKnGpc2IKYASYcAoh +AKAE9JoJAAQ6cEwhAKAA2Ej0BSCAIw1xALENcQAZhAQjhw1wIKAolw1wILCMJgKVFfKMJgORHfKM +JgOVJPIKIcAP63IT2Iy4z3MAAJQKiiSDD8EEL/K4c89wgABQw7QQAQAPgQHgD6HKCSAA6XAS8M9w +gABQw7QQAQAOgQHgDqEK8M9wgABQw7QQAQANgQHgDaHPcaAA9AcA2AShAdgacM9xoADIH/gRAgBC +dQIlgBBIIAAAX4EQeFBwPAAFAEOHz3CAAOypTCEAoEKgoNgPoQDYH6HPcIAAUMMckGK4QnAfoQLY +FRkYgAbyUSBAxiDYA/KA2A6hjCYDlQb0z3CAAFDDHJAJ8IwmA5EI9M9wgADIww+Qtgov+QDZngrP +/gzMhiD5jxL0jCYDkcogIQDPIKEDCPJMIgCgANjPICIDyiAhAQwaHDAKcAjcFwAP8fHAwg/P8KHB +CHc+Du/5AN2B4Ar0z3CAALAzAJAB3YHgwH0Mvc9wgACE4gSAz3KAACiqBCCADwAAABBFIEEDQMEg +wMO4HHj0IgMAz3CgACwgD4BwuxBzAN4I9/B4cHtyDGAEFNr4uATyyXA48APYz3GgAPQHBaGFJQMZ +DXCgsA1wwLCKIv8PDXBAoM9yAAD//w1wQLADyM9zgAAQ189ygACkNRCIArgWeABjLbjAuPAiAACg +gA1woKADyBCIArgWeABjLbjAuPAiAABCkA1wQLDEoQ4PwAMB2FEH7/ChwOB48cDeDs/wz3KAAGCq +IIqA4RHywYKigs9xgACwCgISEAHggc9ygAAUUiuCNL8B4SuiMfDPcqAAxCcREgGGUSGAgQDf+fNk +EgOGZBrYgwLZExpYgIDjLynBAE4hggcS8s9xgADAnVZ5wIGhgc9xgABAnvQhkADPcYAAYJ7wIY8A +C/DPcoAAFFIqgul16XYadwHhKqJBgA1xQKEkkA1wILDPcYAACMQAgYDgBvJCgQ1wQKAA2AChz3CA +AKQ1A4AIgOu4yiCCA8ohQgPKIsIDcA1iBMojAgRTIMAgz3GAALAKIIEUv1EhgIAMuOV4CvKCuA1x +AKENcMCgDXCgoCDwDXEAoUokAHTgeKggAANEJoEQD7lTJgAQJXgNcQChIr5KJAB04HioIAADRCWB +EA+5UyUAECV4DXEAoSK9CQbP8PHAqg3P8Ah2KHUocEhxYgggAGhygeDKIIEDEAghAMohQQP1Bc/w +4HgiuQbw7HJgogTgYbmB4WCAOvfPcKAA1AttoAPZz3CgAEQdNaDgfuB4QSmBgAryLyRJcOB4qCCA +AQQQAgTscUCh4H7gePHAPg3P8KHBCHVIds9woACsLxmABCCAD3AAAADXcCAAAAAB2MB4LyYH8ADa +yiCBAC3yC8wAHEQwTyDBAwIcRDAB4BB4BCCADwAA/7+PuAsaHDDPcKAA1As4gEIhAQiA4cohjABA +JQASEHH8DcUDB+UEJY0fAAD8/8V9nb2fvexwoKAAwexwIKAB2CEF7/ChwPHA4cUqC+/5AN2B4Mog +QgMJ9M9wgACwMwCQgeAB2MB4DLiFIAMBA9rPcaAA9AdFoQ1yALIDyADbXZANcECwA8hRgA1wQKAD +yEgQAgENcECwZKHRBM/w4HjxwFYMz/DPdYAA3JbgFQAQAN6A4ND3RC4+FwAhQHMc2cXaHtuKDu// +GLvgFQAQAeYQdrP3ANiNBO/w4B0AEOB48cAWDM/wIYAKJgCQEInDuMohwQ/KIsEHyiChBsojgQ8A +AKoAzyAhAzzygOHKIcEPyiLBB8og4QbKI4EPAACrAM8gIQMu8gK4z3GAABDXFngAYc9xgABsCi24 +wLgMqSOGIJGGIfwAjCECgAz0z3GAAKQ18CEBAL8RAAaBuL8ZGAABhqKAgOUI8gGFgOAE8gCFgOAN +9AohwA/rchzYjLi520okQABxB+/xuHNRIIDBBvTyDgAAgOAI8gCFgNkooAGFQHgf8AGGIJAUyBBx +yiHND8oizQcd2MojjQ8AAMYAzyAtA8AHzf9KDu/3yXDqDCAAAYXPcIAAbAqiD6ADDIiFA8/w4HjP +cIAAhFr5Bs//4HjxwAILz/AId89wgAAzCyCIpMFgwc9wgAAyCwCIARzCM4QoHwAAIYB/gAAYzC7g +9CBAAADdAxwCMM92gAD0MwCGAeCB4ACmCfQB2M9xoADIHBGhEgrAA4PBYg6v8YogiA8AhkIgQIAA +pgX0z3CgAMgcsaAMFAAxJ7jAuAIcAjAB2M91oADIHxOlz3GAAPwzDIEAgITaQsAIgQCADNke20HA +i3C+DO//GLvPc4AAaAvPdoAACE4LEgE3XpaE2GCD3g+gA5h3og7AA6QVABATpp0C7/CkwAjZ7HAg +oAPZANrPcKAAFAQloAHI7HEAoc9woADUC02g4H7gePHA4cWlwQhyANvPcKAALCCwgEDBBthBwELD +Q8NEwwHYHtmYc7hzACWHHwAAAH26CuAA2HNNAu/wpcDgePHA4cWkwc9wgAAyCyCIz3CAADMLYIiE +KR8AACGBf4AAGMww4fQhwQAA2s91gAAITmDBz3GAAGDFMCFADsC4ARwCMAmFSaUCHAIwCIVIpQHZ +AxwCMM9woACwHzmgz3GAAPwzDIEAgIPaQsAIgQCAHttBwM9wgAAkUD2ACYA4YEPAi3AQ2aYL7/8Y +uwAUhDALEgE3z3OAAGgLXpWD2MoOoANgg6UB7/CkwPHApcHPcIAAMgsgiM9wgAAzC2CIhCkfAAAh +gX+AABjMMOH0IcEAANrPc4AA/DNjwc9xgABgxTAhQA4B2cC4DRwCMM9woACwHzmgDIMAgEHACIMA +gEDABIMAgA4cgjAPHIIwRMFCwItwFNmC2h7bFgvv/xi7z3KAAAhODBSEMAsSATfPc4AAaAtekoLY +Mg6gA2CDpcDRwOB+CMiHuAgaGDAJyJu4CRoYMArIChoYMAvIh7gLGhgwDMgMGhgw4H7geM9xgADc +lwCBgbjgfwCh4HjPcYAA1EI2iVEhwIEO8s9xgACEQSCB4bnKIWIABfRRIQCABPIA2SCo4H7geM9x +gADcl+B/A7HgeM9xgAD0U+B/AKHgeOHFgODPcqAArC8A2Sv0z3CgALQPPKAYgvq4ZPQVglEgAIBg +8hqCUSAAgFzyz3OAAPQzQIMBaoHgBvQB3c9woADIHLGgz3WAAEdoz3CgAOwnpqCA4kCjRvTPcKAA +yBwxoEDwGIL6uDn0FYJRIACANfIaglEgAIAx8s9zgAD0M0CDAWqB4Ab0Ad3PcKAAyByxoM91gABG +aM9woADsJ6agQKPgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HiA4gX0 +z3CgAMgcMaAB2c9woAC0Dzyg4H/Bxc9ygABMTxV64H8govHAmHAKIcAP63IKJcAHz3AAAKIZEQPv +8Vbb4HjPcoAAKE8VeuB/IKLxwJhwCiHAD+tyCiXAB89wAACjGekC7/Fe2+B4z3KAAGBPFXrgfyCi +8cCYcAohwA/rcgolwAfPcAAApBnBAu/xZtvgePHApBABAPm5BPTWCM/3B/Ag2c9woADIHCmgA9nP +cKAAEBQloNHA4H7hxQO4NXjPcYAAJF8CYUokAHQA2aggwAIWIkAAoYBggCnYErgB4XV4oKDgf8HF +4HjPcIAA5AkAgKHBJoCeEQAGhrieGRgA4H+hwOB44H7geM9xgABsCuB/BKHgePHA4cXPcoAApDUj +gjiJhOEN9AohwA/rcoogjA6KIwYCSiQAABEC7/G4cyCCxBEBBlEhQIE68s9ygADMVyCCQiEBgMoh +YgCA4TD0gOAO9AohwA/rcoogzA6KI4YDSiQAANUB7/EKJQABJoIjgWG4oIHPcYAA/DMkgSCB1bk9 +Zc9xgAB43yWBBSk+ACd1SHBaC6ABQiWBEs9wgADoVwAlgR8AAIgTQguAAQEGj/DxwBIOz/eA4B/0 +7g3P94DgC/LPcIAA7DgskM9wgACkNR6QEHEP9GoNz/eA4A3yz3CAAIRBAIDruAfyRg3P94DgA/QB +2ALwANjRwOB+8cAiDc/3gOAc8joNz/eA4BTyz3CAAOw4LJDPcIAApDUekBBxDvTPcIAAhEEAgAQg +vo8AADgQBvQWCs/3gOAE9AHYA/AA2NHA4H7gePHA8gyP8M91gAC4CsyNDY3CvsK4Fn7Pft4Ob/wN +2Aa4gbgQvsV4z3GgAOwnBqEEhc9xpQDoDwahBYUHoSEFj/DxwK4Mj/DPdqUA6A8mhqeGz3CAALgK +AN8koKWgmg5v/A3YBriBuM9xoADsJwah5qZFJc0fp6bhBI/w4HjPcYAA0DjPcIAAEAoAkEeJEHIV +9M9wgAASCgCQQYkQcg30z3CAABQKAIgmiRBxB/TPcIAASEEAgALwANjgfuB44cWf4eHGAN0Y8p7h +A/aA4UP2ANgU8J/hH95K9k4h/AfgeKgggAEPJY0TYb4RIECAA/KleALwpngAogHYwcbgf8HF4Hjx +wO4Lr/Ao2OIJj/jPdYAAaEFAhQh2BCCEDwAA8P8A2GB6QSwBAUCFAdhEJgQTYHpBLIEAQIUC2GB6 +UyZBEK4Jr/gA2ECFCHdBKAECA9hgesC5QIVBL0ESBNhgesC5z3EAAGTOz3CAAGRBIKDPcAEADOrl +A6/wAKXxwD4LD/zaDs/7z3EAAIzOz3CAAGxBqgiv+yCgz3EBADTqz3CAAHBBIKDRwOB+4HjxwEoL +r/BQ2DoJj/jPdYAAeEFAhQh2ANhgelMmQRBAhQHYyXFgeoYh/Q/PcQAAsM7PcIAAdEEgoM9wAQBc +6nkDr/AApfHA4cXqDW/5B9giCu/7CHWuD8//pgwP/NYKb/mpcF0Dj/DgePHA3gqP8M9wgAC4TQSI +z3aAAGxPgODPd4AApDUG9AOHDZA/lhBxIfJaCy/zFdjPcIAAuE0A3aSoA4exriYLIAANkM9wgABk +QSCAYHkE2IDgCvLPcIAAsE0AgIDgcAqh+8ogoQC/tuECj/DgePHAcgqv8Jhwz3GAAGxPbYkA3UAh +AgpKJMBw4HioIEADESNAgwf0z3D/AP//FSJMAwCkAeWvfWuBqoFwdQyB1fYQdc/2EHMC28ogKQDK +JWkQyiNsAMogLADKJawQFPAB2wLYAN0Q8BBzy/YQdQDdyiOpAMogaQAI9gHYAt0D8ALYAd0A2/Ai +zwDwIkUD8CIAAAIlzgPNoQIgQAEOoQDYDyDAADwZAgAPIEADPRkCAC0Cr/AAHMIA4HjxwM9wgABs +T2+Iz3GAANAsbKgBgVEgAIBC9ADYjrgAoc9woADAHSeAz3KAAERMAJKGIf8OLyYH8CK5JPSGI/8B +Q7uGI38PguMB28B7LybH8AHbwiPBAGV5BCCAD////8KIuAq5JXhPIEEDBCCADwAAADxPIH6DMHgg +sgT0i7gAss9yoAD8RC2CBCCADwAAADwEIYEP////wwV5LaLCDOABAthRIADDPvReDoAAz3CAAERM +IJAocIYg+w+MIASAAdjAeIHgD/TPcKAAwB0HgAQhgQ8AAAA8hiD/DiK4CrgleAPwB9gKuM9xgABs +TyyJhiH/AUO5QCkCBM9xgACkNSOBm7oyIYEPAADYAp+6gOEB2cB5D7lFeSV4z3GgAPxEDaHPcYAA +bE8RiYS4EanRwOB+8cCGCI/wCHfPcIAApDUDgM92gAC4TQmAJbhTIBAAB46B4NEnIZAL9ADYB67i +CCAA6XAaDyAAAdhR8M91gABsTz+VMHcEjkvyEq0B2ASuwgggAOlwUScAkAT0BI6E4AX0Tg3P/1Hw +Eo2A4ADZM/QB2ASurB1AEDGtFa0WrQrYF60F2BitUNpZrQDajrpIpUmlR6UD2kAdghAE2kEdghBC +HYIQQx0CEEQdAhBFHQIQBthGHQIQRx0CEEgdAhBJHQIQCNhKHQIQDNhLHQIQMti0HQAQ/gkgALAd +QhAEjoDgFfIEypDgEfRMIACgD/LPcoAAbE8NijNoJXgPqg6qtBIAAD4NIAADruUHT/DgePHAeg9v +8EokQAAacMC4geDCJAIBCnKGIv4DRLoKcYYh8Q+A4M91gABsT0e5BfQflVEgAIAD9ADYAvAB2LId +AhBEIIAjHHgIcw2tBCCOLwAAAAxKvrh2060EII8vAAAAMEy/9K0EII4vAAAAQE6+sR2CE1MgvoDK +IcEPyiCBDwAAkRrKI4EPAACCAcoiwQch8kwkAIAu8gQjQAAQccohwg/KIIIPAACSGsojgg8AAIwB +yiLCBw30BCGAABByD/IKIcAP63LPcAAAkxqKI0YDiiTDD7ECr/FKJQAAgOJJ9AohwA/rcs9wAACU +GoojhgPx8YPnBPaA5wv2CiHAD+tyz3AAAJUaiiMGBePxsHeE9kwlAIAL9gohwA/rcs9wAACWGooj +xgXV8VMgBgBEII4ALySBAwAkjgGGIP8OQrgeZs9+sHZE9tOtuHbxdkT21K3Jd4LmRfYA2LEdAhCw +d89wgAC4TQf0xIiA5gPyBN7EqM9wgAC4TcSIgebMJiKQzCYikQX0E2tleA+tDq2A4swmIpEE8hNq +RXgOrYDhzCYikQXyE2kleA+tE2tleBCtDo0MrXIJ4AEA2CkGb/A+HQQU4HjxwOHFz3CAAPwzBIAC +2gHbIIDPcIAAuE1EqADYz3KAAGxPAKIBogKirBoAABCK1bmGIP8Bu2gPioYg/wFDuBB1caoE9AXb +caoHghBxTPeBu4ILIABxqs9xgACYURmBAeAZoQTwOgsAAM0FT/DxwFINT/ChwQDekgsgAGDG0grv +/4twz3GAAGxPsBGDAIDjQCEACgvyIMK5ifAgjwBBgQUqfgM3d8P2s4kG8AHds6mwGYIDyXOA48wl +YZAQ9CDC8CCDAAGBWYkFKL4AN3PG9gLds6kB2LAZAgCB5R3yguUR8oPlJfIKIcAP63LPcAAAmBqK +I8wMmHXNAK/xSiUAAAGBWIkFKj4ADYE3cAX3PRGAAAfwsRGAAIDg+vU8EYAAU2hFeC8lBwAOqRDw +AYFYiQUqPgBNgS8gQA4Qci33ToFQcKb3P9gOqbhwFBGEAEwkQIAT8kwkgIAj8kwkwIAQ8gohwA/r +cs9wAACZGoojDQZVAK/xSiUAADwRgAAT8AGBWIkFKj4ATYEvIEAOEHIH906BUHCF9z/aT6kH8D0R +gABTaEV4D3oPqRCJBSJCAUV4hiD/AQ0RhABDuAskAIDKIsEHyiCBDwAAmhrKI4EPAABmA/AHYfHK +IcEPBiA+gcoiwgfKIIIPAACbGsojgg8AAGcD0Adi8cohwg8tBG/wocDgePHA4cXPdYAAbE8VjSGF +EHFG9xaNIoUQcUYABQAthc9wgACsTylgz3CAALhNQg7v/yOoz3CAAGRBIIBgeQTYgOBsC2L7yiCi +AADYDaUOpQClAaUCpR4JIACsHQAQGfA3jUCFEY0wcqG4Ea2F92YJAAAP8M9xgAD8MySBIIFHhdW5 +UHFF94G4Ea3y8RYJAACpA0/w4HjxwOHFz3WAAGxPEY1RIACBC/IOjZIIb/MMrbYOoAEB2BGNpLgR +rX0DT/DgePHA/gpP8M92gABsTxGOUSAAgE3yz3KAAFDDP4LmuQv0AJKGIPwAjCACgEH0USEAgj3y +AIYB4ACmEI6GIP8BmhKNAEO4sXAz9ADZrBYFEEokwHBWEgQBqCDABc9wgACgwzR4YIgRJUCQQCQP +C0AtgAAUeDV42GAF8uDjwifFEPOgAeFAJUAAwrisHgAQAYYB4AGmAJKGIPwAjCACgAT0AoYB4AKm +Igzv8hXYvQJP8OB48cAD2c9wgAC4TSSoANjPcYAAbE8RqQ6JTIkQcgXyDKnSDaABAdjRwOB+4Hjx +wM9wgAC4TQLZJKjPcYAAbE8RiYC4o7gPeKG4EakOiUyJEHIF8gypng2gAQHY0cDgfuB48cAC2c9w +gAC4TSSoz3GAAGxPEYlFIEACEakQiUyJEHIF8gypbg2gAQHY0cDgfuB44H7gePHAuglP8M9ygABs +TwGCFRKEAAkkBABMJACABfJMJACCzfcKIcAP63LPcAAAlxqKI0kJjQVv8UolAAIA22qiTCQAgGui +bKLX92h3aHVocRJpFHgeYtOGAeHfZx5i1IZYYBWA22MveZBxHWWsorH3a6LqorEBT/DgePHA4cXP +cYAApDUjgS2RAdvPdYAAuE1TIQIAgeJHjcB7B63PdYAAbE8OIgKAyiJiAIDjzCJhgAbyshWCEIHi +HvSB4ADash2CEBX0Hg6P/wyNLo0QcQT0QCWCEwTwQCXCExSNCdmC4C6tQvYvrQCKDK0E8EoI7/8o +cEEBT/DgfuB48cDCCG/wANuhwQS4z3KAAJjfFHgdYhpiAYJvJkMQyKWKJgQSz3L+//8/yaUEeoDh +QMLKJcEAC/IIgQQggA8AAAAwQiAFgMolYgBMJQCAJvLPcIAA8MEAEAQAyIEEJIYPAAcAAAQmjh8A +AAAwLL5hvkEuBgZAJoATESaAgw8iAgBAwkL0CiHAD+tyPtiMuIojig41BG/xuHbPcIAAuE0HiIHg +zyKhAy/yz3OAAPDBz3aAAFDDmhaBEAOLCyEAgCHyTBaBEADbUyFOAEQhDwMPI4MDQr8A3g8mzhOG +If8DBCYOkADfRLkEew8nTxDkeMomARCA48ojgQMOu2V6A/ABgwV6QMLPcIAA8MEggItyhiH+AyS5 +QCmDAyCCBCGODwEAAMALJsCQFvLXdgAAAEDMJoKfAAAAgMwmgp8BAAAABPQBgAPwAoCuua+5sLkl +eACiABQEMAQkgY8BAADACvQKIcAP63JG2Iy4XQNv8YojiwkIhS65QCkCBgQdABFFeAiliiAFBgml +z3CAAKTDBIiA4IogBQ7KIIEPAADYAQmlqXAA2gHeSgmv/MlzwK19By/wocDgeAolAIDxwBPyTCWA +gBPyTCXAgBTyCiHAD+tyiiDNDoojBAXxAm/xiiSDD84LAADRwOB+egsAAP3xLgsAAPnx4HjxwMoO +D/AIdc9wgABISgmAgOAK9M9wgADYSSmADODwIE4AA/AB3oog/w8Apc9xgACkNQCBxBAABlEgQIEz +9DINz/kApUIKb/ipcIDgyiXiEaT0Cg9P94DgBfQAhYwg/48M9M9wgABsQSCAYHkB2IHgBd3KJSIR +kvDPcYAATB8hkc9zgAAgC0CDPOE6YiGDZOIU4VlhMHAB3cIlThOzfcG9fPADgRiIhOAT9I4Mz/kA +pc9xgABMHyGRz3OAACALQIM84TpiIYNk4hThWWHk8c9wgADMVwCAz3eAAASbQiAQgJ4L7/nKIGIg +AKUBhxB2xveKCq/2yXEIds9wgAD8MwSAz3GAAHjfAIAlgUlu1bgFKb4AJ3BquCCFSCAAADBwyiBG +AEX3AKVKIEAgz3GAAEwfYZHPcYAAIAtAgSGBPOMB3XpiZOIU4TpiUHDCJU4Ts31TJU2QIvJMIECg +IPTPcIAAzFeuCgABz3CAAOhXogoAAc9wgACQWJoKAAHPcIAArFiOCgABIYcwdslwxvcWCCAAAdkE +8AoPT/+VBS/wqXDgePHAKg0v8LhxgODKIcEPyiLBB8oggQ8AAEsDyiPhDsokIQAQAWHxyiUBAc93 +gAAgWCaHI4Eggc9ygAD8M0SCQILPdoAAeN9TIk0FNroAIhAAPWVFhmG4BSo+ACd1AiVAEIwgF4dK +989wgAAEmyGABSm+ACd1ACBQIEwlAIAR8kwlQIAy8kwlgIBO8gohwA/rcoogjQ6Q250Ab/GKJIMP +egxP94DgEfLPcIAA7DgskM9wgACkNR6QEHEH8gIlgR8AAAAM6XAE8OlwQiUBFRYKAAHPcIAAPFgA +JYEfAACIEwYKAAFN8DIMT/eA4M9xgACQWBHyz3CAAOw4TJDPcIAApDUekBByB/IocAIlgR8AAAAM +BPAocEIlgRfKCQABz3CAAKxY2/HyC0/3gODPcYAAWFgR8s9wgADsOEyQz3CAAKQ1HpAQcgfyKHAC +JYEfAAAADATwKHBCJQEVigkAAc9wgAB0WAAlgR8AAIgTegkAAQpwybjPcYAABJsDoQaGgbgRBC/w +BqbxwOHFz3WAAARY4gggAalwz3CAACRKIIDPcIAAKEoAgAkhAQDPcIAA5MAIgAkhAgDPcKAALCAw +gKlwJgkgAVlh4QMP8PHAz3CAAASbAYCB4AX0z3CAANhJB4DPcYAAWFgggUIhAYDKIWIAgOEQ9M9x +gABUwSyBgOEK9M9xgAA8wdYPb/YjgfoN7/8C2dHA4H7xwB4LD/DPcIAA/DMEgKCAz3CAAMxXAIBC +IACAyiBiAIDgNr0G9M9wgADoVy4IAAHPcIAAPMEhiM9wgAAgWIDhz3aAAASbDPQggEIhAYDKIWIA +gOEE8iCGgOEu9P4PwADPcIAAPFj2D8AAAYZaD2/2CHEhhg94MHDM9wohwA/rcoogDQPX20okAACV +Bi/xuHPPcYAAWFgggUIhAYDKIWIAgOEH8h1lI4bJvTB1BPJCDe//ANnVAg/wgOLhxeHGVvJAIsMD +JLvDugLwANqP4pYADQAzJoJwgACQYEAnDXNUfSB9wIgBGZIDAeABEIIEARmSAAEQggQBGZIAARCC +BAEZkgABEIIEARmSAAEQggQBGZIAARCCBAEZkgABEIIEARmSAAEQggQBGZIAARCCBAEZkgABEIIE +ARmSAAEQggQBGZIAARCCBAEZkgABEIIEARmSAAEQggQBGZIAARCCBAEZkgBCI0OAs/XBxuB/wcXg +eIDiWGBZYQvyLySJcOB4qCDAAf8QgoL/GYqA4H6A4uHF4cYk8mNqIrvBugPwANqD4hn3MyaCcIAA +jGBAJw1zVH0gfcCABBmQAwTgBBACBAQZkAAEEAIEBBmQAAQQAgQEGZAAQiNDgOT1wcbgf8HF4Hjx +wD4JL/BTIUIATiINAc9yoAAUBMmCANsOJoIfAAAABlBxyiHGD8oixgfKIIYPAADGIsojhg8AAJsC +yiRmAAAFJvHKJcYAgOHKJE1wyiLNAOggLQJOYM9xoAA4BAHiyKmB5Q7yguUI8oPlDvTPcKAAOARo +qM9woAA4BGioz3CgADgEaKglAQ/w8cCSCA/wunB6cfpymnMKIgAhCiBAIch1CiHAIQonQJPPcYAA +HtfKJ2IQEm8WeAhhTCMAoAS4hiD+AwV/yiHMD8oizAfKIIwPAADBIcojjA8AAO4AyiRsAFwELPHK +JcwEUSCAwQ7yz3CAAAypgNkooAzAgOAD8kB4h/AODg//hfDPdoAAuFoBhgDZFguv8TjaAIYc2SCg +AYYY2SCwz3GAAKQ1FSFWAwAWASBTgQ3B8KjPd4AAwAsoGEAERXmkuSGgANkzGEIA6XEioAohQIMx +GMIEMhjCBDQYxAXKIWIAIgxv9gzggOUG9M9xgAB0qQXwz3GAAJSpI6bPcAAASBEAsUwlQKAY2AKm +BPKKIAUCALEMwIDgBPTPcAEAAOcBpwAWACC5EAAGUSAAgBfyQYYa2ACyAqYAkYe4ALEA2AuxAYJM +JACgrbgBogfyz3CAANxLBIAzGgIATCIAoBTyIYYBgZi4AaEDgZ+4A6HPcYAAnAoAFgAgABkEBECA +AYBBoQKhIgsv/8lwVQfP7+B48cAGD8/vunB6cfpyCiIAIQohQCHIdQokwCEKIECDz3KAAB7XyiBi +AAhxArgWeAhiTCMAoAS4hiD+AwUgUADKIcwPyiLMB8ogjA8AAL8hyiOMDwAAlgDKJGwA0AIs8col +zAQMwIDgDfQKIcAP63KH2Aa4l9tKJAAAsQIv8bhzUSCAwQryz3CAAAypgNkooAzAQHhq8M92gAC4 +WgGGAN/pcXIJr/E42gCGHNkgoAGGENkgsM9xgACkNRUhVgMAFgEgM4EzGMIDz3eAAMgLEBgCBKS5 +jbmZuSGg6XEioAohQIMoGAAFMRjCBDIYwgQ0GMQFyiFiAH4Kb/YM4IDlBfTPcYAAdKkE8M9xgACU +qSOmpNgAsUwlQKAQ2AKmBfSk2Iy4ALHPcIAApDUZkI64j7gBsUwiAKAMwAGnE/IhhgGBmLgBoQOB +n7gDoc9xgACcCgAWACAAGUQEQIABgEGhAqG6CS//yXDpBc/v8cDhxc91gAA0UwCNjCDDjw/0z3KA +ALBXBoIDgCCAx3EPAACgTgvgAEhw/tgArQkGz+/gePHAjg3v7wDYz3WAANDZSiQAdIDeqCAABQhx +AeBPIMIBFiVDEEeriiIIAAK5NnnHcYAAENdAoQDaQrHGqcDYfx0CEM91gAAYC8Ctz3CAAJDWgNkm +CK/xKHLBrc9wgAAIOdmoz3CAAPg1kQXv78Wo4HjxwBoNz++hwQh3tg1v8hjYz3aAACRQIIYBhoDh +zCAhgCv0z3CgANQLGIAA3UIgAAiA4MogTAOMIAiFSPfBFgAWAeDBHhgQHfCd2AAcBDALzOlxAhwE +MAHgEHgEIIAPAAD/v4+4CxocMADAHtpaCCAAGLqhpgXwgOAD8mG4AaYaCAAAANg2Da/4QCYBEvUE +7++hwOB48cDPcIAApDUDgBiIheAP9M9wAQCghm4LgAKaCU/1CHHPcIAAAFkWCsAA0cDgfuB48cBO +DM/vCHcacTpyz3aAAKQ1A4bPdYAAJFAUkBC4Dgsv9wKlgODKICIgz3CAAKwKAICA4Ar0hSEIJE8h +QCefuOxxAKHscOCgA4YIgFEgAIAE8gKFgbgCpc9wgAAUCgCIgOAF9AKFg7gCpc9woAAsIBCAz3OA +AKxRch0YEEokwHAA2KggAAbPcYAA7AkgiYDhDNrKIiEARCi+A89xgAAo5ydyMyGCAEAjAQMZYQHg +QKlAJQ4SAgiv8slwTCAAoAfyIoUA2IC5IqUD8Iog/w/PcYAArAoggWcVDxaA4WgVBBYT9ADbB/Ds +ciCiBHkEHlAQAeOMI4KAIIa3989yoADUCy2iJHgApmcd2BNoHRgRANidA+/v3B0AECUG7/8A2OB4 +8cDPcoAAGAoCgiWIgOEB2AbyCNkGCa/3K6II8M9xgAAcPDoNr/AAodHA4H7xwAoL7+/YcD4IIAAA +3clogOaW9vhwqXcyJoADsOCK9rngCPaeD4/zMm84eAV9AedCJ0cATCcAgGG+MPc1A+/vqXDgeAhy +A/AB4CCIgOH+9eB/QnjxwLoKz+/PdaAA/EQdhTmFYgrgAgDeANieuAGl4HjBpcWlBQPP7+B4z3Gg +AMg7DoGIuA6haSBAAP7x4HjxwM9wgACkNQOAGIiE4A70CiHAD+tyiiAMDoojhQpKJAAAXQbv8Lhz +9gpv8gPYz3CAAOTAABAEAEwkAIAL9AohwA/rcoogTA6KIwUMMQbv8Lhzz3CAALAzAJCB4AHYwHgM +uNdwAAAAEBH0z3CgACwgEIDPcYAASEoCoQLYA6HPcQEABFTuD+/+AdjRwOB+4HjxwOYJz+/PdYAA +VMEvhUogACCA4cohwQ/KIsEHyiCBDwAAviHKI4EPAABIAMokAQS8BeHwyiXBAM9wgACyM0CIz3CA +AAypYHlIoDwdABRCCm/yAtj1Ac/v8cCWCc/vNg+gAAh1gODPcaAAyB9FhQ3ybhEOBgKAZIXEekV7 +bhnYACKFAKEK8G4RAAZEeG4ZGAAc2Bi4FRkYgMEBz++A4AHZwHnPcIAAMFPgfyCg8cA+Cc/vz3CA +AGRBIICiwWB5BNiA4KoCAQDPcYAA9DMAgQHggeAAoQn0AdnPcKAAyBwxoGoI4AIocPILr/gF2M92 +gAAUTQ6mz3GAAPQzAIEB4IHgAKEK9AHZz3CgAMgcMaA+COACKHAD2I4Mr/DJcQTYhgyv8CJuBdh+ +DK/wJG4L2HYMr/Ambg/Ybgyv8EAmARI22GIMr/BAJoESN9haDK/wQCYBEzjYTgyv8EAmgRPPd6cA +FEgIh89xpwCYRwSmDYfPcqsAoP8Fpg6Hz3WgAOwnBqYcgQemF4cIphaHCaYYggumGYIMphqCDabP +cAUAxgMGpcbYkLgGpc9wLAACAQalz3BaAEIBBqWKIIsABqXPcEAAhw0Gpc9w0QDCDQalz3DAAAcO +BqXPcIAA9DMAgM9ygAD0M0IgQIAAogb0z3KgAMgcANgRogHYCKcA2A2nDqfPcFAA/wAcoQHYF6cA +2Ban/NnPcKsAoP84oHPZOaAagM9xqwCg/4G4GqHPcCoAAg4GpYtwJgwgAIHBAMHPcIAAiJk1pjKg +AcEvoM9wGgACDgali3AGDCAAgcEAwc9wgACImTamM6ABwTCgz3AmAAIOBqWLcOYLIACBwQDBz3CA +AIiZNKA3pgHBMaDPcIAA9DMAgAHggeDPcYAA9DMAoQj0z3GgAMgcAdgRoaIOgAIBlhC4hSCEAAal +ApYQuIUghQAGpQOWELiFIIsABqUElhC4hSCPAAalBZYQuAUggA8AAIINBqUGlhC4BSCADwAAwg0G +pQeWELgFIIAPAAACDgalz3CAAPQzAIDPcYAA9DNCIECAAKEH9M9xoADIHADYEaEEhiuGCKcFhg2n +BoYOpwiGF6cJhhanz3CrAKD/OKAshjmgLYY6oJIOb/gOhs9wgAD0M89xgAD0MwCAQiBAgAChB/TP +caAAyBwA2BGh6Qav76LA8cB+Do/vfggAAM92gAD8WpILL/YAhgh1AIYQdQryVgyv+qlw9gzv+qCm +Eg/v8hHYjgxP9c9woAAsIDCAz3CAAKgKqQav7yCg8cC6D+//ocHPcIAAOFMAgATZYtoe20DAi3B2 +CO/+GLuhwNHA4H7gePHArg4v8hbYANjRwOB+4HjxwPoNr+8H2N4Ij/gId89woAC0D9yA1g3v/gDY +xgkP+891gAA4UzoNL/sApUCFz3GAAOhaAKHPcYAAmFFKoToL7/sLoaYN7/7PeJ4Nb/jpcM9wgADE +MwCIgeAc9ECFiiBEBM91gAC0MyOFGmI4YBByAdnCIUUAgOEE2AbyEg1P8wCFBfD6DE/zAoXaD2AC +A6XRBY/v8cDPcIAAMFMAgIDgHfReD6/3FtiA4Bn0z3CAAGRBIIBgeQTYgOAR8s9wgABQQWCAz3EC +ACQLC9hgewTa8g4v8hbY0cDgfs9xgACkNQCBxBAABlEgQIEI9AGBxBAABlEgQIEJ8sIN7/IT2L4N +7/IR2Onx6fHxwM9wgAAELwCAz3GAAKgKG3hCDq/zIIGA4AnyAdnPcIAAxDNqD+//IKjRwOB+4Hjx +wMIMj+8Id33YDbjPcYAAeN/FgUoOr+/JcYwgAoDPcYAACC8A3Yf3HXiMIAKAAeV89wAoQgMFKr4D +z3KAAAQvFrgAoYDnz3GAADRTABpADgP0/9gAqQCJjCDDj6gOgf/JBI/v8cBKDI/vOnB6cUh3aHYK +JAAhANrPcasAoP9ZoQfYGqFYoZ4LoAIB2BnZz3CnAJhHOqCuC2/7HtjPcqcAFEgdgr6CbBIQAHAS +EgAAp6Cm97jFIIIPAP8AANMg4QX3vcUlgh8A/wAA0yXhFQYMb/WKIRAACHapcPoLb/WKIRAACHVA +KAAi6gtv9YohCAAId0AqACLeC2/1iiEIANF5GeEseS9xsXoZ4kx6L3IwdwAZgCMAG0Ajg/YA2ATw +UHB99gHY3QOv7wAcAiDxwJoLj+8IdSh27gqgAgrYAdjPcacAmEcaod4KoAIK2M9wpgCcP2QQBABR +JACAyiHBD8oiwQfKIIEPAAC/GcojgQ8AALgAVAeh8MolIQDPcKcAFEgsgB2AAKb3uMUggg8A/wAA +0yDhBZ0Dr+8ApeB48cAiC4/vz3KAAKSoxIKMJsOfPfL/2SSiwKCELggZACGNf4AASKQEjQogQC6A +4AHfEvQChc9xgACgPAoKb/EggQhxz3CAAPwzBIAAgDoPgACA4AT0Adgc8M9wgAAgPCKNwKghqM9x +oACwH/mhz3GAAPwzMIEggQDdIaBaCG/36XAAIIAvgABopqCoANj5Ao/v8cDPcIAA/DMEgACAfg+P +/s9xoADQGxOBkLgcoV4K7/4A2NHA4H7gePHAEgsv8gbYrgrP+89wgACkNQOAGIiE4A30CiHAD+ty +iiAMD4ojBgtKJAAARQav8Lhzz3GAANhJCYGE4EP3AeAJoc9xgAB43waBRiBAAQahz3CAABwLIICC +4Qr0iiBGDxILL/kE2m4ML/kE2NHA4H7xwM9xgABISgmBAeAJoc9xgAB43waBgrgGoc9wgAC4TQOI +gOC0C2H+yiChAJoLL/IG2NHA4H7geP/Zz3CAACCkIKhvIEMANQev8AHZcQLv8hHY4HjxwM9wgACk +NQOAGBCEAEwkAIEN9AohwA/rcoogTA+KI0cKjQWv8EolAADPcKAALCAwgM9wgABoVCYPYACWIUEP +B9jeCy/yBtnPcIAAVMEMgIDgEvLPcIAAsDMAkIHgAdjAeAy413AAAAAQBvQ6CiAAANgh8H4Jz/vP +cIAAiCoAgIDgF/TPcYAAeN8GgUYgQAEGoc9wgAAcCyCAguEJ9IogiAQOCi/5BNpmCy/5BNiiC0/5 +0cDgfuB48cDPcIAAkFgAgEIgAIDKIGIAgOAH9M9xgABISgmBAeAJoc9xgAB43waBgrgGoY4KL/IG +2M9wgABUwQyAgOAZ8s9wgADARgKAgOAT8s9wgACwMwCQgeAB2MB4DLjXcAAAABAH9BIKIAAA2NHA +4H7PcIAAuE0DiIDgBfRWCm/+Atj18fXx4H7gePHAbgiP74DgosEF8gaAA4AAgM91gABMNAGFgeAG +9ADYtg4v9gGlPPDSDg/2geAB2MB4LyYHkAnyAdj6Cy/xBqU6Cm/2Ati2Dg/2guAN8gohwA/rcoog +3wWKIwcAiiTDDw0Er/C4c3IOD/bPcIAAeN8FkIDg1PYKhQjZQcALhZTaHttAwItwQgqv/hi7gOYG +9KILD/EB2AelANgLpT0Ar++iwOB48cDhxQh1z3CAAHjfBZCA4MT2OglP9gTw8ghP9g4IIACpcB0A +j+/gePHAog9P79YNr/YA3oDgz3WAAEw0B/QB2AGlHg/v/8lwOfALyAQggA/+//8DCxoYMAvIh7gL +GhgwC8iQuAsaGDCmC4/vngnP9h4JL/IL2M9wgAD8MxCAJIUAgMdxAAAAFCJ413AAgAAAQvfDpcIN +L/bCpYDgOAlh9sogYQDPcIAAeN8FkIDgyiCJDwAAQACgDYn4fQdP7+B48cDPcIAApDUDgBiIhOAO +9AohwA/rcoogzA+KI8oFSiQAAOkCr/C4c89woAAsIDCAz3CAAGhUhgxgAJYhQQ8H2DoJL/IG2c9w +gAAcCyCAguEJ9IogCgi2D+/4BNoOCS/5BNgB2c9wgADARiKgz3GAAHjfBoFGIEAB1g6v+wahLglP ++dHA4H7gePHAz3CAAKQ1A4AYiITgDvQKIcAP63KKIA0PiiOKD0okAABhAq/wuHPPcYAAeN8E2Aah +z3CAAMBGAdkioM9wgAC4TQOIgOAUCGH+yiChAPoP7/EG2PIP7/EI2NHA4H7gePHAz3CAAGhUVgtA +AAjYhggv8gbZ0cDgfvHAzg/v8RPYz3CAAPwzBIAggM9wgAAgHCCg0cDgfuB4CHIA2EUAL/YQ2eB4 +CHIB2DkAL/Yg2eB4CHIC2C0AL/ZA2eB4CHFBAC/2ANgIcTkAL/YB2AhxMQAv9gLYGQVP8PHAz3CA +AKQ1A4AYEIQATCQAgQ30CiHAD+tyiiCMD4ojCQOJAa/wSiUAAM9woAAsIDCAz3CAAGhUIgtgAJYh +QQ8H2NoP7/EG2c9xgAB43waBRiBAAQahz3CAABwLIICC4Qn0iiCJB0YO7/gE2p4P7/gE2NoPD/nR +wOB+4HjxwM9xgAB43waBgrgGoc9wgAC4TQOIgODsDiH+yiChANIO7/EG2NHA4H7gePHAxg7v8RTY +tg9P8NHA4H7xwLYO7/EU2HYLr/gE2NHA4H7geKEG7/EY2OB48cD/2c9wgAA0Uw4Pb/8gqNIPj//R +wOB+8cDhxc91gAAYPAAVBRCMJcOPIPSA4BH0z3CAACioaBAEAAohwA/rcs9wAACHDJEAr/CKI8cD +CHGCIQgAz3CAAEikDiBAADIOb++KIQgJuHDPcIAARKwTEAKGjCLDj//ZBfIcGFiBIKUL8BMYWIEg +pQDZz3CAABgKJKBWCQ/3tQRP7+B4AdnPcIAAGAokoEEBD/fgePHAKgxv7wLYz3WAAIRBdgzv8AGl +guAN8moMz/CA4AnyYgzP8BUlARAUgQHgFKHPcIAA7DgskM92gACkNR6WEHEY8gvIBCCAD////8ML +GhgwC8iHuAsaGDAWCI/vAIbEEAAGUSBAgQbyAIXruAPYA/IF2C4Oz/AA2D4Kr/iMuBkET+/gePHA +4cXPcIAA7DgIiIfgLfTPcIAApDUBgB7ZwBADBoDjLyjBAAIhAgAS8o7iCfISahZ4z3WAAB/XCGWA +4AryECODgC8owQACIQIA8fUB2APwANiA4BnyBgyP9oDgVAkiAMogIgAR8FIIj/bPcoAAhEEggqG5 +gOCuuSCiB/I6CI/2gOC8CcH1lQNP7+B48cDhxc9wgACAQkiIKohEKj4LACGAf4AAEEI1eAaIz3WA +AIRBgeAU9M9xgACkNQCByBAABoYgf44K9AGByBAABoYgf46sDuH/yiAhAACFqrg9A2/vAKXgePHA +tgpP7wh1z3eAAIBDcNwCJwETInhmDG/vHNkIdkInAB40bgAhkQ+AAIRBXBEBJkKFRC4+FydwOghg +AFlhACaAH4AA1EI4iIDhGnDV9owhw49F9mG5L3k4qIDhzfZw3AInABNdEQEmQoVELj4XJ3ACCGAA +WWFeD0/2gOAB2hoYgiAH8k4PT/aA4NAIwfWJAk/v4HjxwOHFz3GAAEhDInjaC2/vHNkuD2/2CHUA +JYEfgADuQoDgANpAqQf0Fg9P9oDgrAjC9XECT+/gePHA7glP70oKz/CB4A7yQgrP8IDgCvI6Cs/w +z3GAAIRBFXkLgQHgC6HPcIAAhEEggM9wgADsOEyQz3CAAKQ18LkekBDyEHIL9AQhvo8AADgQBfSa +CY/2gOC68hYML/AB2M9wgADsOCyQz3CAAKQ1HpAQcQv0z3CAAIRBAIAEIL6PAAA4EAPyAd8C8ADf +z3CAAHBZIg0v8+lxz3CAAOw4CIiI4BH0AN0C3kQtPhcAIYB/gABIQ/4ML/PpcWG+gOYB5TT3Rg5P +9hpwz3CAAOw4LJDPcIAApDUekBBxDvTPcIAAhEEAgAQgvo8AADgQBPRMIACgP/QLyAQggA////8r +CxoYMAvIh7gLGhgwMg1P789wgADsOAiIh+Ar9M9wgACkNQGAwBAPBoDnLyjBA04gjgcf8o7mFvKy +brZ9x3WAABDXBZWA4M72BpVRIECACPIODG/wz3imDUACBdgSrQDYBbUQJ4+TLyjBA04gjgfj9c9w +gADsOAiIiOAn9M9wgADsOCyQz3CAAKQ1HpAQcQr0z3CAAIRBAIAEIL6PAAA4EBXyz3CAAKQ1AYDE +EAAGUSBAgcwgIqAJ8s9wgACEQQCAUSAAgAfYAvIG2KIKz/CFAE/v8cDPcYAAhEH8EQIAg+JEAA0A +MyaCcIAAYGBAJ4ByVHgAeB2BAeAdoQXYEvAegQHgHqEC2AzwH4EB4B+hBtgI8IARAAAB4IAZAAAB +2E4Kz/DRwOB+8cDKDw/vCHXPcIAA7DgIiIfgz3aAAIRBxfSA5Ujy+BYAEIDgCBUQEBP09haAEIDg +D/YKIcAP63LPcAAAvxuKIwgGSiQAAI0Db/AKJQABYbjeDy/w+B4AEGoPL/AKcM93gAAUCwCH+BYB +ECKo+BYAEIDgHvQaD0/2gOAI8sYLQAIghwSJgLgEqc9wgACAQkiIKohEKj4LACGAf4AAEEI1eAaI +geDwDWHxyiABBACG8LiYCSLwyiBiAHIPj/CB4A3yag+P8BUmARACgQHgAqEAhoe4AKbT8IDlBPIA +hqe4AKYLyJC4CxoYMC4LT+/Pc6AAkCMcg1EgwIAP9HATBAAKIcAP63LPcAAA5RuKI0kJxQJv8Eol +AAA+DQ/5qgtP/s9xoADQGxOBz3eAABQLkLgcoSCHAomA4KP0BIlRIACALvLPcKAASC4LgM91oAA4 +LtO4J4UEeUUeWBAnhQZ5J6XKDWACENgAhs9xAAC0HJC4AKYHhYi4B6UCCG/3DdgLyAQggA/+//8D +CxoYMAvIjriQuAsaGDCCCk/vIIcEiaC4BKlt8PgWABCA4OKFDvT2FoAQgOAK9gohwA/rcm/YBriK +I4oIQfFhuGoOL/D4HgAQz3CAAKQ1AYDEEAAGUSBAgQny+BYAEIDgcAyh9MogwQPPdYAAgENoFYCQ +gOAj8moVgJBRIMCBHfLeCk/2ahWBkBpwAIbGuQq5gbgAps9wgAA4WWILIAD5YUwgAKAL9LYKT/aA +4AfyAIaOuEYMr/UApqYKT/aA4AbyVRYAFgHgVR4YEPgWABCA4BP0CBWAkAoVgZBEKD4LACGAf4AA +EEI1eAaIgeAkDGHxyiDBA7UFD+/gePHATg0v7wDaCHUigM9wgACEQc92gACAQmiOQBhYAM93gAAQ +QgNvRCs+CzIgRA4KjkIkQQAQccn2QCBFAC8lRwEKHkIRA/BKrrhyRCs+CwAhgH+AAPxBFSBDAWyT +gOMO9LBxyfZAJUUALyVHAQoeQhEE8EquSiUAABUgQAEMkIDgyiLMB8ogjA8AAOYbyiOMDwAA5QO8 +AGzwyiHMDy4ND/AojgqORCk+Cyd3FX8mj4DhqXAF9MIKQAID8J4IQAL5BA/v4HjxwOHFAN0mCe/2 +qXC6D6/wqXBKDo/xBgjP8M9wgABwKuEEL++goOB48cDGDA/2Ug0P9jYMD/bRwOB+4Hjhxc9yoADI +H6QSAwDPcYAAGAoNgRBzwiMGAET3YngTe7+CDoG7Y3hgDqEB2EoaGADgf8HFz3KgACwgZoLPcYAA +GAoOgWJ4DqEQguUAb/QNofHA/gsv70okQADAgaCAAd/RdcIkAgHRdaGBYYDCJ84TAd6xc8B+sXMB +28IjzgBMJACAzCYikMojYgAL9IDjBvSA5swnIpAE8gLbA/AA24DjFPKB4w7yguMa9KCAwIEBgCGB +AiWNk6CiAyBAAAGiEPAA2ACiAaIM8KCBwIAhgQGAAiWNk6CiAyEBACGi2QMv72hw4HjxwOHFJoBA +gEIiAoDKImIAgOLKIcIPyiLCB8oggg8AADYRyiOCDwAAdwDKJCIAQAci8MolAgFggTBzCvJCgKKD +Qn2A5QT2YIMwc/r1QYMBo2CgQaAAokSApoBRIkCAQCUDFgvyRoWA4gbyooJCgEJ9gOXD9gCjRICm +gFEiwIBAJQMXC/JHhYDiBvKigkKAQn2A5cP2AKNBgFBxBfQ+CW//BoBBAw/v4HjxwMIKD+8IdgCA +QiABgMohYgCA4QDYKPImhkGGAd8wciCGQYZBoSCiAKbPcK3eAgABpqaGwH8GhRB2B/SpcFoIIAAC +2QalpoYHhRB2BvSpcEYIIAAI2QelgOcF8tYIb/8GhgHYxQIP7yCAEHHKISEA4H8ocPHATgoP7wh1 +hg/v/yh2CHfCpdYO7/+pcJ0CL+/pcOB4QIAQcgjyZIILI0CABfRAghBy+/UA2uB/SHDgeM9yoADI +H/QSAAC82xi7BCCAD///APD0GgAAC8hleAsaGDAVGtiAz3OAAPwzCIMA2SCgDIMgoAmDIKANgyCg +CoMgoA6DIKALgyCgD4MgoM9wAAwPAKQaQAAOog/YDLgQouB+4HjxwLIJD+/PdaAA0BvThfq+BvLP +cIAA2FlKCQAA+74H8s9wgAD4WT4JAAD8vgbyz3CAABhaLgkAAP2+B/LPcIAAOFoiCQAA/74G8s9w +gAC4WRIJAAC82Bi4E6XFAQ/v4HjxwE4JL+8A2wh3z3agAMgfpBYAEM91gAD8M/hgpB4AEAHYE6Yo +hQyFQIEAgAAiwoNAoSyFASDAAAChAtgTpimFTYUAgUCCACDAgwChDYUBIsIAQKAE2BOmKoUOhUCB +AIAAIsKDQKEuhQEgwAAAoQjYE6YrhQ+FQIEAgAAiwoNAoS+FASDAAAChBIUAgCIOb/HpcSSFAKEF +hQCAFg5v8elxJYUAoQaFAIAGDm/x6XEmhQChB4UAgPoNb/HpcSeFAKEP2Jq4DqYP2Ay4EKbPcIAA +uFnuDg//z3WAANhZ4g4v/6lw3g4v/0AlABjWDi//ViUAEs4OL/9WJQATvQAP7+B48cBOCA/vCHcg +8ACGIYYhoAChANgAps9wrd4CAAGmpoYGhRB2BvSpcPoN7/8C2QalpoYHhRB2B/SpcOoN7/8I2Qel +I4Zgeclwrg3v/+lwCiYAkAnyA4cggAKGIniA4K4HzP9eDi//6XBNAA/vD9iauM9xoACwHxWhD9gM +uBeh4H7xwMIPz+7PcoAAUMM/gjpw67mqwQDYEPLPcYAApDUjgUgSgwDA3TSBZHmGIf8OIrk6fQTw +FN0C2IoSAQECeRKCBOEiC2/0ANpiCWAAAiBPAwPYz3GgAMgfE6HPdYAA/DMIhQCAQsAMhQCAQ8AJ +hQCARMANhQCARcAEhcCABYUAEBIAQBEABh9nz3CAADCpQIAhgADYACLCgwEgQABAwkwhQKBBwIt3 +DvR6D0/whMEacOlwIgvv/4bCCHcIEAEhDPCCwelwDgvv/4bCCHfPcIAAeN8kkM9ygAB432WCBsIE +u1BzQCmAAoj3UHBL9wJ6UHC+9wbwWgxgAIbACHJGwoLnFfTJcCoMb/FIcQh2SnAiDG/xBsEGwlpw +BMMHwAXBACLCgAEgQABEwhbwgOcV9MlwKgxv8UhxCHZKcCIMb/EGwQTDWnAGwQXAB8ICI0OARMMD +IIAARcCB5wvyz3CAAKQ1A4AYiITgzCchkADYAvQB2C8gB6BG9Mlwtgtv8QPZCHdKcK4Lb/ED2Qh2 +AMABwUAgwIBBIQEAQMAEwEHBBcFAIMCAQSEBAETAAghgAEXBTCEAoAr0BIXgoAiFAMEgoAyFAcEg +oEwhgKAR9ASF4KAIhQDBIKAMhQHBIKAFhcCgCYUEwSCgDYUFwSCgTCFAoAr0BYXAoAmFAMEgoA2F +AcEgoEwgAKAB2cB5z3CAAEw0NKgNBu/uqsDgePHAtg3P7qXBCHYCiyh1mHBkwACLABIGAREcAjB5 +cAISBwEEEggBEBQAMeSSBhIFAQAgyQMAkS8hSBIHIEACCgkgABB4ACCKAQGVLyKIEgcggAL2CCAA +EHgAIMYBApUvJogBByCAAeIIIAAQeAAgBwIDlS8nyAEHIMABzgggABB4ACUFAASVLyVIAQcgQAG6 +CCAAEHgfZwWV8H/neKoIIAAQeCaVIXAQeAd5PHoPuSV6UHoAIoECMHkAHEQwR5Unelx5D7pFeTB5 +ACGCAVB6XHkCHIQwD7pFeTB5ACHCAVB6XHkEHIQwD7pFeTB5ACFCAVB6XHkGHIQwD7pFeTB5P2fw +f/x5CBzEMw+/5XkweThgaXHGuYW5CLkFIcECILYQeCCVChwEMCd4HHgIuAUgAAEBtgDAAaYBwAKm +AsADpuEE7+6lwA97SLgPeM9ygAAAcPQiAABAKAECSLgFefQiwAAweeB/J3jgePHAz3KAAKhZIIKA +4cohwQ/KIsEHyiCBDwAANBHKI4EPAADjBsokIQAoACHwyiUBAQGiAdrPcaAAyB9QoUoZmABIGRgA +0cDgfs9wgACoWeB/AIDgeM9xgACoWSCBANiD4cwhIoAC9AHY4H8PeAoiAIDxwBfy4g/P/4DgyiHB +D8oiwQfKIIEPAAAzEcojgQ8AANwGyiQhALwH4e/KJQEBz3CAAKhZQKDRwOB+4HgIcyhyz3CAAPwz +BIAAgAIggA8AAgAASQAgAGhx4cVTIEIFBCCND8D/AADPcIAAeN8FgAIggwAEIYIPwP8AANW5Inil +e0V4EHPKIK0ABfcQcwDYyiBmAOB/wcXgePHA4cXYcLhxug/v/5hyCHXIcLIP7/+IcRB1yiCtAAr3 +EHUA2MogRgGYD+b/yiEGAY0Dz+4A2M9xgADkwAWhBIGguAShyQRv8QPY4Hg2uDa5MHDWIIUPAACA +AOB/InjgePHA5grP7gonAJDPdoAAeN/PdYAA2FkP9M9wgAD0bclxZgjv/hTaTgzv76lwQCUAGBHw +gucK9AYLT/DJcUoI7/4U2kAlABgM8Mlwag0gAQXZqXAiDM/vz3CAALhZFgzP7wSWCrgFpgaGhiDD +Dwam6gogAOlw4gnP79UCz+7xwKHBCHOiCG/1i3CC4ADYBvIAwBBzAdjCIA4AocDRwOB+4HjxwADZ +z3CAAMRAGgggACCgz3CAADBUcg+P/9HA4H7geADZz3KAAOwKI6IkoiWiJqInoiKiz3CAALRZIKDP +cIAAWFogoDGyMLLPcIAANEzgfyCg4HjxwM9xgADEQACBgOAT9AHYAKEA2c9wgAAgHLYP7/8goM9w +gADANRCIg+A4CSEAyiBhAdHA4H7gePHAugnP7toIL/akwYDgiAkCAM9wgAAgHACAz3GAADRMog7v +/yCBz3aAAOwKMJZRlllhMHDKIC4AwiBNAEKGgOLPc4AAtFkT9IDgEfLPdYAAWFoghRlhIKUgg891 +gACgUBlhIKMyhRlhMqXPcYAAxAkggYHhAN0D9KCjIIPPd4AAWFpAwSCHQ8JCwItwQcEQ2aLaHtuC +C+/9GLsA2HoKr/eLcc9wgAAgHCCAz3CAADRMoqaxtiCgsLbPcIAAxAmgoJ4Jb/ET2ACHheCO914I +IAAB2OYOj/nPcYAAmFEdgQHgHaEF8EYIIAAF2DkB7+6kwBXYANrPcaAAyB9vGRgA4NiQuBChCdiw +GQAAtBkAAHTYQhkYAADYmrgPoaQZgADPcAAMABkOoeB+z3KAADBUJoIjgWG4YIHPcYAAIBwggdW5 +eWHPc4AAeN9lgwUrPgAnccdxAAAAEBkGr/9IcPHA4cXPdYAA7AoHhYDgFPTPcIAAxEAAgIHgDvQm +Cs/2muAK8s9wgAD8MwSAAIAFpQHYB6WhAM/u8cDhxc91gADsCgeFgOAa8s9wgADEQACAgeAU9O4J +z/aa4BDyz3CAAPwzBIAAgAal/gzv/yWFMJU4YBC1ANgHpV0Az+7PcIAAxEAAgIHgC/TPcIAA/DME +gCCAz3CAAOwKI6DgfvHAz3CAAMRAAICB4BD0z3CAAPwzBIDPcoAA7AoAgASiqgzv/yOCMZI4YBGy +0cDgfvHAig+v7oohCAAIdc9woADIHzCgAdlBGFgAVgkAAM92gAB43wOGJYbVuDBwyiHND8oizQfK +II0PAAA1EcojjQ8AAJsAyiQtAEwD7e/KJQ0Blg8P8IYPL/AIdxpwgOXMJWKQSvTPdYAA/DMIhSCG +IKAMhSGGIKAAhSWGIKAEhSOGIKD6Ds/1gOBw8s9wgADsOAiIh+Bq9AWFwIAAgAQmjh/A/wAAUyBR +BQSFAIByDC/xCnHVuEWFBX4C28Ciz3KgAMgfc6LJhQIgQYRghk2FQIIKAAQAQinABwfwJJcKuQIh +QQQZYQDYAiNDgAMiAQBgpg2FO/CC5Tr0BJfPdYAA/DMhhQq4AKHPcIAApDUAgMQQAAZRIECBCYUg +8s9xgADsOCiJh+Ea9M9xoADIHwHaU6EohQDbIIFMhQIhAYRAgiCgDYUDIsIAQKAEhQCA0gsv8Qpx +JYUAoQrwIIcgoA2FIYcgoCOGBYUgoIEGj+4A2Za5z3CgANAbM6DgeFEjgMX/8+B+4HjPcIAA2Fkn +gIDhB/IDgECAAoFCeATwz3D/D///4H7geM9xgACkNSSBKIEEIb6PAAYAAKHBBfRRIQCACPQI8AQg +vo8AAAAYBPIA2APwAdjPcaYApAAXoeB/ocDgePHAsg2P7gh1z3KgALRHcRIAhgQggA9wAAAAQSg+ +hfn1iiD/D28aGIBrGhiAA9gPuM92oADIHxMeGJAFhc9zgABGTFkaGIAGhVoaGIAHhVsaGIAJhVga +GIAohQCTBCGEDwAHAAAId4Yn+x+MJwSQAd/Af0EsBAYvJsfzyiDhAcAooQIg8u24B/QEIIAP//// +wxB4hRYOlkQkjwCC5wHfhib/HiK+wH/lfgq+xXgQfoy+jb4EIIAPAAAAPIy4jbjAswV5VxpYgAiF +z3GAAOxaIIEEIIAPAAAAgFEhAIAG9IDgBtjKIOEBA/AA2M9xgACkNSOBKIHPc4AALAlRIQCAEfJP +IAECjbmXuSajBSCBD4AAQDonowUggA+AAMBTD/AFIIEPgADAJCajBSCBD4AAAD4nowUggA+AAIBX +CKOEEgCGCaMGhSoKb/IhhX4O7/8BhckEj+7xwFYMr+4A2jpwz3CAAGxPDIjPdqAAtEdEIAEOQinQ +AAp1cRYBlgQhgQ9wAAAAQSk+hfn1QxYBlkYhAQ1DHliQVxYBlgQhgQ//b//DVx5YkF8WAZYEIYEP +/3//w18eWJAA2Z65Ux5YkOB4Ux6YkGAeGJC2CU/7z3CAAGRBIIBgeQTYgOAV8kwhQKDICaH5yiBB +A893gAD0WgCPEHUJ8s9wgACcQzaAYHkA2AAfAhSCC0/wQxYAlkwhAKBFIAANn7hDHhiQg/JMIUCg +EvJMIYCgTvIKIcAP63KKIFoKiiONAkokAAB9B6/vCiVABM9wgABETCCQKHCGIPsPjCAEgAHYwHiB +4A/0z3CgAMAdB4AEIYEPAAAAPIYg/w4iuAq4JXgD8AfYCrjPcYAApDUjgRC9m70yIYEPAADYAp+9 +gOEB2cB5D7klfaV4Xx4YkHEWAJYEIIAPcAAAAEEoPoX49Yog/w9vHhiQax4YkDHwz3CAAERMIJAo +cIYg+w+MIASAAdjAeIHgD/TPcKAAwB0HgAQhgQ8AAAA8hiD/DiK4CrgleAPwB9gKuM9xgACkNSOB +EL0yIYEPAADYAp+9gOEB2cB5D7mleSV4Xx4YkAbIhOBYDCHxyiChBOECj+7gePHAhgqP7gh1KHYW +DK/uAYCghRC5QS0AFDhgBgyv7slxELmweDhg+guv7kAugRLFAq/uKHDxwFIKr+64cIXhmHGK9woh +wA/rcoog2guw2zkGr++4c0wlwICM9wohwA/rcoogGguy2wokQAEdBq/vuHPPcIAAdAkIc6ZoFCND +AQCTUSAAggzyABMEAQohwA/rcoogWgu32/EFr++4cwCCgeAE9G8gQwAD8ADYmrghgp64Ad6B4TCK +wH4bvsV5JXgigtGKgeEB2cB5HLkIvsV5BXkDgqB1UoqB4AHYwHgduBC6BXoA2ACtLyAHAYi4ALPP +cKAA4ERFeRUgQAEgoPUBj+7xwIYJr+4E2QDYz3WgALRHSx0YkADakLp3HZiQAdp3HZiQz3KgAIRE +GKIA2pG6dx2YkALadx2YkM9yoACIRBiiANiSuHcdGJB3HViQgNh3HRiQANieuFQdGJAA2Jy4VB0Y +kM92gACACclw/gsv8BzZz3CAAHQJ8gsv8ArZyXAhHRiQz3CAAAAIEHhJHRiQZQGP7uB4heDxwJhw +i/cKIcAP63KKINoLd9vdBK/vuHPPc4AAgAkkg2hwNHggkFEhAIIN8hATBAAAEAUBCiHAD+tyiiDa +CrEEr+9+2ySDAeGI4SSjANoC9ESjLyEHAYUhDAAgsJDZz3CgAPxEGLkioAuTAeAQeAuz0cDgfuB4 +gODxwAf0z3CAAKCiTgsv8CTZ0cDgfuB48cBiCI/udgigAQh2fgjAAM9xoADIHwh1QNgPoUARAQYw +ec4Kr/bJcKUAr+6pcOB48cAuCK/uSiQAcs9woACIIADeqCCAD4fmOfKggM9xgACswc9ygAB439Z5 +aIlHgnpigOXPc4AAeMLUex70ACaNH4AAcML4jYLnCPTgk/t/I5GAvyR/4LMG8IHnBPQikSCzANk4 +rc91oADIHPqFIJPkeSyzBfAskzB1w/dZYQPwrLO5Yokhzw8EGFAAAeYA2c9wgAB43wEAr+4noOB4 +8cAAFgRABxoYMQAWBUABGlgxBBKBMJzhyiLCB8oggg8AANwOyiOCDwAA9ApoA6LvyiHCDyoK4AAO +2dHA4H7gePHATg9P7hpwDcjPd4AAoMLwJwEQz3WAAADCAxICNggYRCABkoDgDRIBNgDeDvIUJUMQ +gBMOB4DmZPIA3oAbnAPwG4QD4BuEAxQlQxDAswGC7rgf9Miz0BuEAxCKz3GAABDXArgWeBthZZOA +4zhg0fZhu2WwEIpyaHZ7emFFkoDieWEH9CaRUSFAgDAKgu8NyAAggQ+AABzCxKnMqdSpz3GAAKzB +FnkUfSKRwB2EExV/eB1EEAMSATbApwGBBCCADwAAAGDXcAAAACAT9BCJz3GAABDXArgWeABh7bjK +JmIQz3CAANQ01HggkBDhILAD2c9woAAUBDCglg6gAQpwPvBwEg0B4BMBAQIhTgOxdgf3wn2ieBB4 +gBscAM9woADUBw8QDoYA3fAbhANwEgIBwBtEA0J5MHngG0QA0BMBAQHhMHnwEwUB0BtEAFMlfoDK +IcIPyiLCB8og4g3KI4IPAADnDcokgg8AAP4A7AGi788gIgMD2RMYWIA5Bk/u8cDODW/uANjPcYAA +gFoAoQzMA9lRIACAz3CgANQHIBhYgKPBnvIUGFiAAxIBNgAWBEAHGhgxABYFQAEaWDEEypzgyiLC +B8oggg8AANwOyiOCDwAA9AqEAaLvyiHCDyhwQgjgAA7ZAxIBNlCJUyLAAIYi/gMQqUS6ArjEGYIA +FnjPcoAAENcAYs9ygACkNS24wLjwIgAABKK5EAIGz3CAAKzBQKDPcKAA1AcPEACGtBkEAAbIZgqv +9A0SAjYDEgE2z3OAANAsoYHBgyITgABRJgCQBCWNHwAAABBTIAIAO/RA3sCjgOXMIiGAMPLPdoAA +Rkzgli8mx/MD9IC/4LbPdaAAwB2nhUQlBBHvfYHlQSyEABz0BCePH////8KIv4u/QCyNAuV9TyUP +EwQlhB8AAAA8TyQMA08kTJONv+C2BvSLvYy9jb2gtge6HHhFeCIbAgCSEQABpg2v+pQRAQAu8Eok +QAAUGBiBABYAQAcaGDAAFgVAARpYMQTKnODKIcIPyiLCB8og4gnKI4IPAABmAkgAou/PICIDAxIC +Ns9woADUB7QSAQEPGFiAlBIAAFEgQIIG8jYKj/YDEgI2DRIDNs9wgAAAwhQgwQCokYDlIvTQis91 +gAAQ13V4Ar7WfsVlmBIOAC29zqDWoM9wgADUNMC99CBAA7waBADQEQMBBCCADwAA8P/Du2V40BkE +AAbw0BEAAbwaBAAB2KAaAABODW/60IqA4EgEIQADEg02BshRIICBOAQCACGF+rkH8pDYkLgtBCAA +oB0AEAK+z3CAABDXQCCCA9Z+y2LEFYIQcHIH8pHYkLgJBCAAoB0AEGqFz3KgACwgUIKMI/+PDPJi +etdyAIAAAEj3h9iQuOEDIACgHQAQUI1yanZ7ZmAEJr6fAAAAE3hgTPLpvgjyi9iQuL0DIACgHQAQ +7L4n9AWQgOAT9AfIBCCADwDAAADXcADAAAAR2MAoIQXKIIIPAACIAM8gIgQT8KQVABC0uKQdABCS +FQARp7iSHQQQnhUAEae4nh0EEAXwhdiQuKAdABDPcIAApDUDgBiIhOBUAwIAz3GAAEw0DIEPIIAA +DKHPcYAAiDQAgQHgOQMgAAChQpAzFYAQESIAgCfyB8gEIIAPAMAAANdwAMAAABT0CI2A4BX2pBUA +ELS4pB0AEJIVABGnuJIdBBCeFQARp7ieHQQQC/BRIYCBB/KN2JC45QIgAKAdABAGyFEgAIAOAgEA +LgyP/wMSDTYIcqgdABDPcIAA/DMEgLAVBxEggFUnQwbVuXBxz3aAAHjfRPcF2AemBYYieIwgCYbK +ISUApBUAEAkhgQDyuKwdQBDn8pgVgBDDuBx5B8gNEgU2BCCGDwEAAPDPcIAArMEWIEABZZCsFQAQ +QS4GAwkgzgCAFQMRfhUAEXhgz3OAAKQ1ZINGEwMBG2MIJs4QYn6YFQMQ6LsA2ILyRCMBBiO5BCOA +DwYAAAAB4TG4GWEEI4QPwAAAAEEsgAXPd4AAAHIpZwhnOGBBK4ECUiEBAMC5A7kY4YXgyiGNDwEA +iQ3VIQ4ApBUAEPS4I/IifoQVARECJkAQSCAAAEK4QStOA8C+BL7UfmhxxrlJIcEFNH7ru89xgAC8 +aNFhBfJBKQMBFCNBAAUpPgBBKQByANlW8CK+QStAA8C4BLgUeGh3xr9JJ88V9Hjru893gAC8aBBn +BvJBKA8BFCcAEAUovgNBKQByhBUOEUErTwPAvwS/2WEQ4SK59H9odsa+SSbOFdR/67vPdoAAvGj2 +ZgXyQS4DERQjjgMFLn4QQSkBciDwUSNAgsohAgAa9APmz3CAAJRo8CBBACK+BSm+Ay9wUyADAHhg +hBUDER14J+MiuwUp/gAvcVMhAwB5YT15z3OgAMQsL6Muo0AuAQaeuUAtDgXFeSV4wB0AEAqjz3GA +AFhOAdgAoQfwz3CgACwgT4CwFQcR8HJF9wXYGLigHQAQz3CAAJQKQYAglQkhgQAAiIHgCfTPcKAA +1AcZEACGEHEA2AL3AdiA4Az0A9gYuKAdABDPcYAAHFETgQHgE6ENyM9ygADAK4bgAdgjEoEAwHiB +4QPyAdgg8M9xgAD8LCOJUSEAgPnzz3GAAMQsKImB4fP1geCKITMIyiGCD///DP7PcKAALCAQgEyC +QniA4EP2EHEh9gDYgOAM9ELYmLigHQAQz3GAAAxTA4EB4AOhoBUAEAQgvo8BAQAAFPSSFQARlBUB +EJAVAhGyFQMRlgigAUokQAADEg02oBUBECV4oB0AEAQgvo8BAQAABfKyCc/0UwVAAAPMz3GfALj/ +GKEGyFEgAIDKIUEDyiAhIHjypBUAEPK4MPLPcYAAWE4AgYDgAN4u8gDYAKGAFQARfhUOER5mz3CA +AKQ1BIBGEAABHmZRIYDF//PPcKAAxCwLgFMggQT+uMwhIoAK8pgVABBOCq/zANp0uB5mA/AA3gMS +ATYJ8A3Iz3GAAKzBFnnFkalxSiAAIIDmz3CgAMgfrBUDEAj0pBUCELG6pB2AEATwCSODAwPaGLpP +oPgQAgCA5qFqCCNDA0J7oBjAAADamLpOoAzypBEAAPG4DczFIKIEzyBhAA0aHDABkYDgCfINyM9y +gAAAw/QiAACA4ATyAYHuuAbyDcyAuA0aHDAqCC/6KHADEgE2fJFEIwADhOBt8g3Iz3KAAADCFHrA +EgABZXhhge27HLEK8lQRAwG8EQ0Bw7ule1QZxACGIP0MjCACghn0EIkCuBZ4x3CAABDXZZCA49H2 +BpBRIECADfKB4wj0YBEAAYS4YBkEAAXwHJGNuByxAZGA4Cfy0BIAAVQRAwHDuAV7VBnEAIASAAeA +4AX0HJGKuByxpBENAOi9CfJoEQABUyPCAFhgEHhoGQQAUSVAkgnyahGAAMO7eGAPeGoZAgAHyM9y +gAAQwwQggA8AwAAA13AAwAAABPQOGgQEBfAA2Iu4B7IBkYDgFPINyM9ygAAAwhR60BIAAVMgwIAK +8vASAgHPcKAAmANeoLYZhACkEQAABCC+jwAAADAH9IYg5Y8wDmIAyiBCAH4NAAGA4AXyjg/P/PsB +AAADyKQQAAAEIL6PAAAAMAoCAQD0uJQMQfMDEgE2pBEAAOy4n/IaCG/xAdgDEgE2HbHPcIAApDXE +gC4LL/cA3YHgDPTPcIAAsDMAkIHgAN3PJSETyiUCFAPYz3GgAPQHBaGFJQIdDXCgsAPIXZANcECw +A8hPgOC6BvJChg1wQKBGlgfwDXBAoAPIQBACAQ1wQLADyFGADXBAoAPISBACAQ1wQLAQGQAEA8iU +EAAAUSBAgiwKQfY+CQ/4DMxRIECBSgJBAM9xgADQLAGBUSAAgDoCQgCKIAgAAKHPcKAAwB1HgM9w +gABETCCQhiL/Di8mR/Aiuif0z3OAAGxPbIuGI/8BQ7uGI38PguMB28B7LybH8MogYiAFIgIEBCGB +D////8KIuQq6RXlPIUIDBCGBDwAAADxPIX6DUHlAsAP0i7kgsM9yoAD8RA2CBCGBDwAAADwEIIAP +////wwV5LaKvAUAAAYH4uA/yz3CAAJwKAJAdsc9wgACgCkCAAYBRoRKhB/C+Di/xAtgDEgE2HbGu +Dg/9A8jyCq//eBAAAYDgbgFCAAMSAzYBg5gTAQD4uJQbQAAV8s91gAAI5qlw0ggv+GhxENgMGhww +DcyjuA0aHDDCC6//qXA3AUAAnhMAAb4TAgGSGwQAkBuEAAYIoAGCEwMB+LgM8gPZz3CgABQEI6CK +IBAABwFgAAYaGDADyKQQAQCGIeWPBAxCAAMSDjakFgAQ9LhwAgEAcI7PcoAA8NV2es9woAAsIA+A +hBYNESCSCCBAA6J4sBYNEWTlsXDuAC4ACSBBAAK7z3CAABDXdntgYAQgjQ+AAwAAN71lvYDlyiUM +FAQggA8YAAAAM7gN4ADfDycPEAMSkQCODq/0mBYAEJgWAhAJIMED7brKIGIgQCgDIXR7SHDGuEkg +wAUUe+u6z3CAALxocGAG8kEoAgEUIgAAKLi4eAPgBCCADwAA/P/PcoAA+N8Dos9yoADELA2iMBpA +BAfIDRIDNgQggA8BAADwLLgYuJ24FLtleAV5KqLPcYAAkFIIgQHgCKFRIYDF//PPcKAAxCwLgAQg +jQ/wBwAA/rg0vVMggQQD8oHlDfcDEg42SiAAIM9xgACYUQGBAeABoQDZMPAAlhDgEHHx96QWABD3 +uNUhQgPPd4AA+N8gp6KnmBYAEA4Nb/MA2gGnz3GAAJhRAoEB4AKhAIG4YAChz3CAAKQ1A4AJgFEg +QIAH8g3MRiCAAg0aHDADEg42AdlKIAAggOGSFgARNvKUFgEQz3KAAPjfopLAgkDBz3OlAKz/z3KA +AKQ12KNEglYSAgEU4kJ9A+UivbplumJIIkIABbpFIkIDVqNRIMCByiCCLwAAgAAgwAQhgQ8AAAAg +JbkFIAAEJXiJuI64GaOCCc/v9wYAAKQWARCnuJIeBBC0uaQeQBCUFgAQkBYDEc9xpQCs/0DAsBYC +EXihz3OAAKQ1ZINWEwMBFONiegPiIrpbYnpiSCJCAAW6RSJCA1ahIMIEIIAPAAAAICW4BSICBEV4 +ibiOuBmhA9nPcKAA9AcloA3ImBYCEM9xgAA4whV5QKGkFgAQCHSEJBqQGfQEIL6PAAAACQjySgzv +/Mlwwgzv/APIDfBwFgERz3CgAPQHJ6DPcKAAyBwcGAAEA8ikEAAAUSAAgdAPAfMDyAGA+bgI9FoL +L/EE2AMSATYdsXYO7/YA34HgC/TPcIAAsDMAkIHgAN/PJyETyicCFM91oAD0BxmFgODKIcIPyiLC +B8og4gzPICIDyiOCDwAAbgrKJAIEsAMi78olAgQDyByQ5XgNcQCxA8jPdoAA0Cw9kA1wILADyC+A +DXAgoAPIQBABAQ1wILADyDGADXAgoAPISBABAQ1wILADEgE2HJGGIP8MhOAe8jOBDXAgoAPIUBAB +AQ1wILADyFQQAQENcCCwAxIBNhyRhiDzD4wgDIAK9DaBDXAgoAPIXBABAQ1wILADEgE2HJGGIP0M +jCACghz0YBEBAQ1wILADEgE2pBEAAPe4EvI5gQ1wIKADEgE2pBEAAGQZAAS4GQIEuhkEBLe4pBkA +AKQRAAAEIL6PAABACAbyAYHwuHwJAvEP8DqBDXAgoAMSATakEQAAhiDzjwXyO4ENcCCgAdpLpQPZ +KKXPc4AAQEwNEgE2oIOxcQDYHPLPdaAAOC6lhQQljR/AAAAA13XAAAAADfL12AW4z3WfALj/GqU7 +pWnYGLgZpUhwgeAC9CCjA8gBgFEgwIABhsC4SvKA4Iv0iiAEAACmz3CAAEZMAJAEIIAPAAAAKNdw +AAAAKMoiAgTPcKAAwB0ngM9zgABETACThiH/Di8mB/AiuV/0z3WAAGxPrI2GJf8RQ72GJX8fguUB +3cB9LyZH88ogYiAFIQEEBCCAD////8ILukV4iLgKuSV4TyBBAwQggA8AAAA8TyB+gzB4ILM59Iu4 +ALM38IDgQ/SKIAQAAKbPcKAAwB0ngM9ygABETACShiH/Dg97EnMiuSP0z3OAAGxPbIuGI/8BQ7uG +I38PguMB28B7LybH8MogYiAFIQEEBCCAD////8IKuYi4BXkEIb6PAAAAPDB4ILID9Iu4ALLPcqAA +/EQtggQggA8AAAA8BCGBD////8MFeS2iz3CgAPxEPYAZgOu4NfQEIb6PAAYAAC/04HjgeOB4USBA +wynyA8jPcaAAyB+wEAABliBBDx6hENgOoQHYFRkYgDIM4ABB2FEgQMMV8s9wgACAWgHZIKADyKQQ +AQCauaQYQAB6CG//AdjPcYAAkFINgQHgDaHyDAAABCC+jwYAygCYcB7yz3CAAMwzA4CA4Mohwg/K +IsIHyiDiCs8gIgPKI4IPAAA/BJQAIu/KJQIBz3GAAJBSEIEB4KsCIAAQoQPZz3CgABQEJaADEgE2 +AYFRIMCARvKkEQAAz3KAAKQ1USAAgASCBPK7kAXwSgov9rqQz3GAAGxPEYlRIACANPLPcIAARExg +kGhwhiD7D4wgBIAB2MB4geAP9M9woADAHQeABCODDwAAADyGIP8OIrgKuGV4A/AH2Aq4cIkjghC7 +MiGBDwAA2AKfu4DhAdnAeQ+5ZXkleM9xoAD8RA2hBPB2EQ0BDcxTIECACfIGyAQSATaODe/zDRIC +Ns92gAAI5slwZgnv9wMSATYDyAYSETbPd4AA0DSgEBAAAdgAp0ILb/+pcIDgANkgpwryhiB+j9ny +A8igGAAEBhpYNAMSATaSEQAB6rgH8qq4Ggqv+ZIZBAADEgI2fhIBAYISAAGAEgMBOGAbYw3Iz3GA +AHzCcHsVeQmBeGAJoQGCUSDAgG/yKg+v94DYBhIBNgQhgQ8CAAEA13ECAAAADRICNwj0/bgG8k8i +wQANGlwwBvCjulB5DRqcMAMSAjYBglEggIEt8k8hwAKMuBB5DRocMBCKMxKCAAS4RXjPdYAAqKrP +cqAAOC5Egga1EfAvLoEQTiaDFwDeDybOEMZ6z3aAAGDV9CbOENFwCPKA4vD1z3AAAP//BLUD8GS1 +CNgMGhwwz3CAAGxPEYhRIECBCfLPcIAAuE2yD6/8AIgNEgE3A8gBgP24zyHiAdAh4QENGlwwz3GA +ABxRFoEB4BahLvAQ2AwaHDANzKO4DRocMAILb//JcAMSAjYBkoDgCvINyM9xgAAAw/QhAACA4Azy +AYLuuAj0DcgB2gAggQ+AAIjCQKkNzFMgQIAK8gQSATaKIAQAMgsv+pgRAQADyBqQPgqv9w0SATYN +zFEgwIAP8s9wgAAQwwMSATYCgJgZAAAGyCYP7/MNEgI2MQLv7aPA8cDhxanBi3WpcM9xgACsYIYK +7+0k2qlwZg+v9wMSATbuCSABqXAlAu/tqcDxwOHFAxIBNqKBIIU6D6/9JNqA5Q30CiHAD+tyWdiM +uO7bSiQAAIUF7+4KJQABAYWA4OIgAgDpAc/t4HjxwFYJz+2YJMEzGnAA2E4cGDAAFoNAABaFQAAW +hEAAFpNATCMAocT2LyMHJEwjAKHKIcoPyiLKB8ogig8AALUoyiOKDwAAUADKJCoAIAXq7solygRB +LQABUyARgCv0TCUAgCzyz3CAAPDBA4iocYYh/AdFuSZ4UyXOAOC4yiGCA8ohIQBWJMw5IKzhuMoh +ggPKISEAi3SAJEQeIKxRIICAyiCCA8ogIQCLdIAkhB4ArAXwUyX+gCz0AN6EKwoiACGAf4AA5LMK +JEAuBOCEKQQvACBSDkQrPicAIYB/gAB0wKCI4YiQdcwjwYMf8gohwA/rckAsDgRAKwUEh9iNuIjb +BSZEE2kE7+4FJcUDCiHAD+tyQCsPBM9wAACvKG7bUQTv7gUkxANKcA4LIABI2VYiACkGCyAABtkA +JIAvgABQtkwhAKAjgAn0gbkjoE4UATYkoCWgA/CCuSOggObPcYAA5AkL8s9wgAB0wECIHIgQcgP0 +BBkCBACBEIhycMoggQSoCSH9yiFBBAYMz/IdAO/tlSTBM/HA1g+v7QDZz3CgAPxEdBAEAHmABCOC +jwAAAAgL9AQkvo8ABgAAB/QDyKQQAAD6uGvyz3CAAKQ1BIDPcaAAyB9RJICGRhAAAR+hINgOoQXy +fgjP8Q3wUSRAhifyvg1P8AMSATagGQAAhiB+jwP0AN8C8AHfiHAeD6AAaHED3s91oADUB9Kl9gmP +/M9wgADQNACAgODMJyKQA/QTHZiTA8igEAAAMvBRJMCEAxIBNgvybyBDAKAZAACKIAgABhoYMNfx +USSAhADYzyDiBfT1pBEAAPq4BPIF2BC47vGA4gnyz3KAABRSEIIB4BCi9fEKIcAP63IKJQAIMtjP +cwAAJQnZAu/ujLgocDUHj+3xwKQQAQDpuQXyDggP/dHA4H4odIQkEpAR8vm5BPTWCM/0B/Ag2c9w +oADIHCmgA9nPcKAAEBQloOvx6/HxwIoOj+0KJwCQGnEA3Rby6XEvKEEATiCCB89woAAMLU968CCA +AMK4DyUNEADYDyCAAAYhAYDv9YDlJfIvKEEDTiCOBw0amDP12AW4ggyv9clxDcjPcaAAFAQKoc9x +oABkLvAhAQDTuQpwpgiv8+R5Pg3v+clwANgPIIADBiUNkN71z3KAAEBMAIIH2YfgDRpYMB7yz3Cg +ADguBYAEIIAPwAAAANdwwAAAAA7y9dgFuM9znwC4/xqjO6Np2Bi4GaMB2APwANiB4AL0IKLPcKAA +FAQqoBkGj+3xwOHFz3CAAATFz3WAADILYI1BiIQrHwAAIYF/gACEyDYLr/0C4iCNz3CAADALQJCE +KR8AACGAf4AAaMXxBa/tQLDgePHAdg2P7Sh2RiHNAB1lMgggACK5wb6B5g3yguYH8oPmDPQAFoBA +AR0SEAAWgEABHRIQABaAQACtqQWP7YDhVvJAIcIDJLrDuQLwANmP4ZYADQAzJkFwgAB8YEAng3I0 +ewB7ABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQY +UAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQ +AAAWAUAEGFAAABYBQAQYUABCIkKAs/XgfuB4gOHKJE1w4HjoIK0BABYBQQIYVADgfuB48cBqDI/t +AN3PdwAABB1KIAAiqXYVIoAzDhABBgDYz3KgABQEyqKooieiBKI9ZYjhaLnKIQ4Aegqv9elwQiBQ +IEwgAKAg5wHmJveFBI/t4HjgfwDY8cAKDI/tGnDPcIAAaF0yIBIEz3CAAOwJ0YgSiEojACAQdqHB +XgEpAAAcwDRqdwohwCQD8Hp1RC6+EwAiQC7PcYAAKOczIQ0ATCAAprt9rX1W9s9xgAAMLRqBO4Ek +eFEgAIIO8s9wgADsCQuIi3PJcV4O7/WpcgDAAn2tfQAmgB+AAOwJHBDBAM9ygAA4UwCKBdoKDyAA +qXPPcYAA4FoggQDdSiSAcSJ4qCBABXNudHu1e89ygACgmnliIYmA4XpiCvIQcQ/yEHES9oXlVvYB +5a99C/BCJZEQLyFHJGG9r30Q8AMSzwAA2Wp1DfCA5UohACDKJWEQBvJCJVEQLyFHJAHZgOEs8vNu +9H8VJ0ETz3OAAKCaOmMAI0UAFSdPFPljIYlBijBy+2Pji9n2AiJEAAMVggAEv/B/IngEui8kCAEC +J4MQbHgvIEYOjgyv7YhxDngCfwjn7n9Ev+1/TCAApoP2Cuftf8lwCnGWDCAA6XIB5s9wgADsCRKI +z34QdrgGzP/hAq/tocDxwJIKj+0odYDizCMigAnyLG0vec92gADsCTOuBvDPcYAA7Amzqalxz3aA +AOwJtK4ArlWuAgogAHauABCJAOGIyXASiNGOEHagAQkARCk+Fy9xhC4DEQomQA4AIUMOCiWAD4AA +GJugc0ApghBUeoQuARUKJ0AOACJNDgoggB+AACzmACBEEwAmjR+AAOwJTCEAkMwhYpAn9BoTwAAA +2RitGxPAAEokgHEcrRiLIB0CEKggAAYUJEAAQYizbrR9NX3HdYAAoJoAEMAAQK0VI0IAAa0BEsAA +AeECrQCKL3kDrXvwARPAAIDgGPQA2litXK0gHYIQSiSAcQDZqCDAAxNuFHg1eMdwgACgmkCoQahC +qEOoAeEveWHwfLkAIYoBOotsugAiQBEaiOByACIGAvYIIADpchitACJAERuIO4vmCCAA6XIcrQAi +QBEYiDiLACWFAtIIIADpciAdAhAA3UoggBEUJkoDFCRLAwESgBABE4EQsgggAOlyM240ebV5x3GA +AKCaAKn4cQASgBAAE4EQkgggAOlyAR8CABUlSwMVI0oDAROAEAESgRB6CCAA6XICHwIAABOAEAAS +gRBmCCAA6XIDHwIAQiBIEEwgAJAB5ZIH7f+vfQHmz3CAAOwJEojPfhB2aAbM/wDZz3CAANxaCQGv +7SCo4HjxwM9wgAA4UwCAz3GAANhaIIFNaDBywCBsAcwhDIA8CwkA0cDgfuB4AnkteUx5ViEBcke5 +OGDgfw944HiB4PHAuHEc9EwlAIDE9kwlgIPO9gohwA/rcs9wAADXFIojiAI9BK/uSiQAAEAtgQBk +uQAhgA+AAEgZHfDPcIAAUB8yIEEBjCHDj8ohwQ/KIsEHyiCBDwAA2BTKI4EPAAAQAgAEoe7KJCEA +z3CAAHgbNXjRwOB+4HjxwM9ygAD+CQpqsgkgAClq5g0AANYIAADPcYAAmHIggc9wgAAMGCIIIAAB +2s9xgACUciCBz3CAADgXDgggAADa0cDgfvHAmg9P7RpwgOFId5QALAAA3TpxFSBAI4DnQIgCiAzy +z3aAAEgZFX4CuBR4x3CAAKAYC/DPdoAAeBsVfgK4FHjHcIAAgBkhiFEhAIAk8gUQwQAirgYQwAAD +rulwkgwgAEhxAK6A4MwgYoDKICEAE/JEKD4HACGAf4AAFJvFEIMA4RCBAAIiwAAQeAe40giv7WJ5 +Aa5CIUEggOF6B+3/AeVZB0/t8cD+Dk/tz3CAAOwJERCIAM9wgADsCRKIEXC0AAsASiYAAEohwBFE +Lj4HL3CEKAMRJ3AAIIEPgAAUmx8RywAAIIEPgAAUmx4RygD4cADeBt8AJ40PgAAUm9V9B41pcQXa +mHAeCiAABRXDEEAuggBUeoQoARUAIkEO1HnHcYAALOa4cQCpiHBJcQfa9gkgAAYVwxABHQIAYb+A +5wHmtAft/89+QiFJEEwhAJBAJkYAegft/y8mhwFAIEgQz3CAAOwJEogvIAcSEXBWB8r/mQZP7QLb +YKgA2ACpAdjgfwCq4HihwfHAGg5P7aHBZcIIdih1z3CAABIKhcGLckAkQzCSCyAAAIhELr4WACVA +HhQUwTDPd4AAZJ2Y5fhgegAqACCoUyWAEIXgTAAKAEYlzRGvfRvwARSAMAAmgR+AAJjjUm1Uellh +IMIAqUQuvhYAJUAeRKkUFMEw+GAgqMlwXgggAKlxAeWvfVMlgBCF4KP2IfABFIIwEm0UeAAmgR+A +AJjjOGBAqCDCRKjJcDIIIACpcQ/wQiUAFg94ARSBMMd2gACw5AK4FHgeZiDAKK4MrgjctwVv7aHA +4HjgfuB48cA+DU/tAN7PcKAAtA9wEBAAIg2v/Mlwz3GAAOwJsolxibFzEPbPcoAAxKJ/2BQjzwBf +ZwCvwa8B4297sXMF2AKv9vbPcIAAFJtBkM91gADgWoDiwKUb8s9wgADoWgCAjCAfhNP213AAAKAP +T/ZCeECJgOKKIQ8KwCjiAAT0RCi+Ay9weg5P7QClAN0O3s93gABUX5YI7/+oZ2G+gOYB5a99OvfP +cIAAOFMggM9wgADYWiCgfgyv/C8gBwTlBE/tDngseClqANgPIEAAJ3BaeOB/DiDAAOB48cBaDE/t +z3eAAOwJAI8CDO//M4/PcIAA1FoAENAAz3GAANA4FI9HiRByD/QAjyGJMHAL9M9wgADdWgAQwAAJ +IAAELyAFILGPA/AB5a99Eo8QdQIBCQAA3koigCPPcIAA1VoAiIDgEfJELb4TACZAHs9xgADUWgAR +wgAAIIEPgAAo50CpXvDPcIAAZEEggGB5ANiM4Av0z3CAAERfyWACIEAgDXhIIEAAA/BIIEAgLyEF +IM9wgABUX8tgE4+pcZoL7/RVjwkgQAQvIQUgz3CAAGRBIIBgeQDYACWTH4AACAqQ4Azyz3CAAGRB +IIBgeQDYjOAEE4EgDPTPcYAAqAvJYQQTgCAieAkgQQQJ8M9wgAA0X8hgAnkJIUEERC2+EwAmQB7H +cIAAKOcgqDpwE4+pcR4Pr//JcgARwSACeQAZQiBCIlIgTCIAoAHmFAft/89+ffFhA0/t4HjxwBIL +T+0Idc9wgACXQwCIEHUodwf0z3CAAJZDAIgQdxzyz3aAAOwJqXBAJoESXgnv9UAmwhIqjgRuXgjv +9UuOCo4OD6/1K47PcIAAl0OgqM9wgACWQ+CoIQNP7YDg4cUa9Iwhwo04ACoAAdhKJIBxz3OAAPSb +qCAABKFrRCg+BzIlTR6xccz2gOUI8obgCPIB4A94ANgE8GG4D3jgf8HF4cXhxgARzQCA5UT2AN2g +qYDgHPKA5UX2ANgAqQDdz3CAACxeAJAQdYT2qWitfaCpz3CAAIRdFCBOA6COoKoAEcEANHgBiBrw +gOVE9gDdoKnPcIAA2F4AkBB1hfapaK19oKnPcIAAMF4UIE4DoI6gqgARwQA0eAGIAKvBxuB/wcXx +wPYJb+0A2KHBABwEMM91gADYCgCVz3aAABSbyXGKIgQKpg9v9QHbgOAQ9AohwA/rcgAVBBHPcAAA +2xSH24u7tQVv7oolBAoAFoQQTCQAgcohyw/KIssHyiCLDwAA3BTKI4sPAACMAM8j6wKIBWvuyiUr +AH4Jz/SA4Mohwg/KIsIHyiCCDwAA3RTKI4IPAACSAM8j4gLKJCIAXAVi7solIgCLcUXYAdoeD2/1 +AduA4A/0CiHAD+tyz3AAAN4UlduLu4okQQExBW/uSiUAAAAUADEB2YYg/g/A4MB5z3CAAFAgIKh9 +AW/tocDgePHACglP7Qh113UlAACAANhK989xgAB43yWBMHXQ9yJ9AeD58c9wgAB438WAqXB2Cm/t +yXEFLj4QAiVNHowgEIDKIcYPyiLGB8oghg8AAM0iyiPmDMokJgCwBGbuyiUGARa4FQFv7aV48cCe +CG/tmHDPcIAAuFkDgCh2IIAG8KCAIn2F5YIBCQDPdaAAwC9YFQ8WwL+B5wHfwH8vJsfz8fNBFQAW +BCCFDwAAwA9BLb6BuvTPcIAAuFkDgOCABvAggOJ5heEmAQkAWBUBFsC5geEB2cB5LyZH8PPzQB2Y +EM9wgAC4WQOAIIAG8ECAInqF4voACQBYFQIWwLqB4gHawHovJofw8/NXHRgRgeMv9M9wgAC4WQOA +IIAG8ECAInqF4soACQBYFQIWwLqB4gHawHovJofw8/MF2FEdGBDPcIAAuFkjgACBz34G8ECBAnqF +4poACQBYFQIWwLqB4gHawHovJofw8/NFHZgTz3CAALhZA4AggAbwQIAieoXibgAJAFgVAhbAuoHi +AdrAei8mh/Dz8wXYQh0YEM9zoAAsINCDz3CAALhZA4Ay5iCABvBAgCJ6heJSAAkAWBUCFsC6geIB +2sB6LyaH8PPzQRUBFvO5KvQwg8J5gOHp9gohwA/rcs9wAAChKGDbCfAKIcAP63LPcAAAoiiKIwcO +SiQAAA0Db+4KJQABCiHAD+tyz3AAAKMoiiMIBAokgA+gAMQw7QJv7rhzSQcP7YHgz3GAAJQKBPQB +2ACpAakAiYHgyiCBDwAAxAnKIIIPAACAAOB/AaHPcoAA3EQgihlhIKohijhg4H8BqkGJArgWeMdw +gAAQ10ioIongfymoz3GAAKQ18CECAADZDZJEuOC4LqIE8oohCAAuouG4BPKLuS6iUSCAgAPyjbku +ouB+DRICNgQgvo9gAAAAz3OAAADCVHvHcoAAcMIIcQbyA8gckFEggIIK8gQhgQ9hAAAA13EBAAAA +BvQA2ACzAdge8AzMUSDAgQMSATYN8jIRgQABizBwBPQA2AGr8vEB4AGrC/AxEYEAAIswcAX0ANgA +q+bxAeAAqwLY4H8YquHF4cbPcoAA3AmA4MAiIgH/3RJpFngAIIMPgAAX16CrAN1KJABxz3OAAPje +qCCAAq5ieGU2eMSormIB5a99wKjBxuB/wcXgePHAng0P7c9wgAAMLwCAguChwUryz3aAALBNz3WA +ALRNAIUghhBxKvLPcIAA8DsEgFEggIBAwQXyTyEAAUDAgOEI9P4L7/IA2PILz/IWDQ/1i3AE2aHa +PdueDy/8F7sghoDhC/IAhYDgB/TWC+/yAdi+Cw/1IIYgpYDhFvLGDM/yf9gKuM9xoADQGxOhf9gQ +oQDYlbgQoc4Or+8B2AvYcg+v7wHZZQUv7aHA4HjxwO4MD+3PcYAApDUVeUCBCIIEIIMPgAAAAEQg +DwIvuwa/ZX8EIIMPAAEAAEErTgPlfiy7xXvBEg4G0XPAEg0GMPIEIL6PgAEAAB7yz3aAAOw4yI6H +5hj0vrgIokCBCIIEIIMPgAAAAEQgAQIvuwa5ZXkEIIAPAAEAAEEoQwMleyy4BXuA5cEa2AAM8i8p +QQNOIYAHEgggABAlDRCA5fj1tQQP7fHASgwv7ZhwkOCN9wohwA/rcnHYjbiKI40LNQBv7kolAARK +JAB0ANuoIMAOQCyNAXV9QCyCAMd1gADQ2gCFz3GAABDXVnrduEFhAKXxudEgIoII8kQgAgYjugHi +geIL989ygABQ2RYiAgFAilEiAIAD8p64E/AtucC5z3eAAKQ18CdPEFIgTgLBFwEWCyGAgwbyKIf+ +ue/zn7gApQHjFQQP7eB4z3GAAKQ18CEAAM9xgACswbsQAga6EAMGQqFhobwQAga9EAAGRaHgfwah +4HjPcYAApDXwIQAAz3GAAKzBvhAABhYhAgACkhqxA5IbsQiKOBkCAADY4H8dsfHA4cXPc6AArC8Z +g/C4GYMA3QzyBCCADwgAAADXcAgAAAAB2MB4B/CGIH8PguAB2MB4gOAZ8hmDBCCADw4AAABCIACA +yiBiAIHgD/IKIcAP63JkEwQAz3AAAK4Nmdv1Bi/uSiUAAOYIL/VU2OS4RCACAgvyz3GfALj/vaEC +289xgAAML2Chz3GAALBNUSBAgACBzyBiANAgYQBRIICAAKEd8s9xgADkWgCBEHIX8s9wgABSIACI +geBAoQr0z3GAAHRNAIGA4MT2argAoQHZz3CAAMQzggxv/SCo7QIP7eB44H7geOB+4HjxwF4KD+1K +IAAgz3GAAIBCz3CAAIRBz3OAABBCSIkKdQzwRCo+CwAhgX+AAPxBtXkskQHlACBQIEQqPgsvcT9j +44/xdT5jr/fPcoAA7DhIiofiRvRGjsdxgAD8QYHiAdrCIoEAVXkYEQQBTCSAgk72CiHAD+tyz3AA +AMUbiiNEBukFL+5KJYAC7BABAfYQgAAseC91EnWV96lwagsv7QpxgOF78gohwA/rcs9wAADGG4oj +RAgKJAAEsQUv7rh1CnBCCy/tqXGA4WfyCiHAD+tyz3AAAMcbiiOECe7xiOJJ9ECAUSIAgkXyRo7H +cYAA/EGB4gHawiKBAFV5GBEEAUwkgILKIcsPyiCLDwAAzBvKI4sPAAAuAWwH6//KIssH7BARAQwg +QKQW9ypw2gov7QpxgOEz8gohwA/rcs9wAADPG4ojRA0KJAAEIQUv7golQAQKcLIKL+0qcYDhH/IK +IcAP63LPcAAA0BuKI4QO7PFMIACgyiHBD8oiwQfKIIEPAADIG8ojgQ8AAEAByiQBBNwEIe7KJSEA +KQEP7eB4z3GAABRSXBnAB524nrjPcaAAyBwNoeB44HjgeOB44HjgeOB44HjgfvHAINvPcqAAyB9w +okMaGAAA2MoP7/+NuHGi0cDgfuB48cCGCA/tocEIdih1z3CgACwgMIDPcIAAEE0goMYP7/8y2Itx +Fgzv7clwABQAMaR4EHUB2MB4vQAv7aHA8cDPcqAALCBAEgQAQBIFAOu5B/QEIL6PAAYAACDy7Lke +9M9xAAAQJwPwQBIFAM9woAD8RBmA7LgCJQABA/QwcLX213AAABAnivYKIcAP63KKIJoKadv1Ay/u +jLvRwOB+USAAw89woAD0B/HAK/IngBmAMHk4YAO4liBCBc9xoADIHx6hENgOoQHYFRkYgPIO7/+B +2FEgAMMV8s9wgACAWgHZIKADyKQQAQCauaQYQAA6C2/+AdjPcYAAkFINgQHgDaED2c9woAD0Byqg +0cDgfvHAANkK2M9yoADIHx6iENgOogHYFRoYgChwB/AB2QQggA8gAAAAUSAAw8whIYDMICGAE/RR +IwDAD/TPcqAA/EQdglmC67oA2er1BCC+jwAGAADm9eXxUSMAwBbyz3CAAIBaAdkgoAPIpBABAJq5 +pBhAAKoKb/4B2M9xgACQUg2BAeANoVEgAMMA2Ar0z3GAABRSEIEB4BChANiYuNHA4H7xwNoOz+wI +ds9woAAsILCAC/A2Ds/tz3APAEBCGggv8alxgeAN8s9woADUCxiAQiAACEggAAAQdi33DQfP7Aoh +wA/rcs9wAADOIl7biiTDD4kCL+64c+B48cBqDu/sAdmlwRpwz3WAANwJWnU2CW//i3BMIECgABSF +MAEUkTAE9EAlEhFMJQCAxPZMJQCBzfYKIcAP63LPcAAAKSWs2z0CL+5KJEAATCUAgDQBDgCocAAW +jkAAFpRATCQApHpwhfaMJMOvKPQAFgBBABaPQAAWgEAAFgBBTCQApIYACgCA5yfyz3CAAEQfAIBA +LM0gtX0Q4Lhgrghv/wTZz3CAAEQfAIBMIUCgHWXMJ2GTGfQA2Iy4GPAKIcAP63LPcAAAKiW320ok +QAC1AS/uCiUABQohwA/rcs9wAAArJcDb8/EA2AC1z3CAAEQfAIBALMEgNXkyYDhgBSJCBECwBN0G +8IHABN1CCG//qXEAIowjABwCFc9wgACkNfAgAAQe38AQAgaA4i8pgQACJ0AQJfIyaM9zgAAX1zZ5 +K2MRI4CDCPIAJoEfgAD43hZ5ABkCBQAtgRMLIcCACPIAJoEfgAD43hZ5BBkCBRAiAoAvKYEAAidA +EN71QiNAIIDg2AbN/x4JD/I1Be/spcDgePHACiHAD+tyiiBFAcbbSiQAAOEAL+4KJQAB4HjxwMoM +z+zPcYAACOBAIREBVSFOBM9wgAB8QhaAAN+A4FYhTQM4CgL5ABEEIQAkgQMwdTgABgBAjYwiQ4cB +jRL0Qo3Q4g70Q43v4gz0RI2MIoKGCPRFjYniBPS/YALnwn8C4B1lMHWp94DnyicBEc9zgACcQgWL +QCCQAFUkQAQCcIwgCIDKIc0PyiLNB8ogjQ8AAMIbyiONDwAAkAA4AC3uyiUNBJB32GdH9wAgAQR+ +Cu/8AiTCAwRr2We6Ce/8CnIAEQEhz3CAAHxCAnEAGUQgWQTv7Pag4HjxwOHFCHXPcIAA7DgIiIfg +zCBiggXy+ggP9IDgHvLPcIAAhEEAgFEggIIY9GoMD/SA4BTyz3GAAKQ1AIHIEAAGhiB/jgr0AYHI +EAAGhiB/joQPYf3KIEEDGQTP7M9xgACEQQCBorjgfwCh4HjxwI4Lz+xyCw/0gOAk8s9wgADsOAiI +h+Ae9M92gACEQQCG8bgY8s9woABILguAz3WgADgu07jnhQR/B4XmeAelpgogABDYB4Wov+V4B6UA +hrG4AKahA8/s8cAeCw/0gOAX8s9wgADsOAiIh+AR9M9zgACEQQCD8LjRIGGECfTPcqAAOC4ngpG4 +iLknogCj0cDgfuB48cD+Cs/sz3CgAEguC4DPdaAAOC7TuMeFBH4HhcZ4B6UyCiAAENgHhaW+xXgH +pT0Dz+zgeOHFz3CAAKQ1AYAe2cAQAwaA4y8owQACIQIAE/KO4gryEmoWeM91gAAf1whlgeAL8hAj +g4AvKMEAAiECAPD1AdgC8ADY4H/Bxc9wgAB8QhaAQiAAgOB/yiBiAOB48cDhxc91gACEQQCF77gH +8q+4QgkgAAClOfAqCg/0gOAE8goJD/Iz8ACF8rgF8rK4egkv8gClHgoP9IDgJ/LPcIAAgEJIiCqI +RCo+CwAhgH+AABBCNXgGiIHgGfSqCg/0gOAV8s9wgADsOAiIh+DMIGKCBvIKD8/zgOAJ8gCFUSCA +gsQNYf3KICEAWQLP7OB48cDeCc/sjgov9Ah2gOAG8toPb/3JcBLwz3WAAIRBAIVRIICCCvLPcIAA +HFnuDo/9AIWquACl7vERAs/sANnPcIAAfELgfzagz3GAAIRBAIGCuAChANgVAC/2jLjxwHoJz+zP +cIAAcFmyDq/9AN/PcIAAjFmmDq/9At3PcIAAOFmaDo/9z3CAABxZkg6P/c92gACAQ3DcAiYBE0Qv +PhcKIEAueg6v/QAhQA5CJgAebg6v/QJwYb2A5QHnK/d9Ac/s8cDPcoAApDUAgs9xgACEQcgQAAaG +IH+OJ/QBgsgQAAaGIH+OIfQD2KoJL/QBoYDgBfL6Dm/9ANgF8D4JT+5WC0/uANjPcaAAxCd3GRiA +eBkYgIAZGICBGRiADxEAhqO4DxkYgATwAIGPuACh0cDgfvHAlgjP7Ah2z3CgAMAvpRAUhhQQE4ai +EBKGvgqv+0ogACCA5inyyXcvKcEDTiGRBwDYLyFHJA8gQAQGf89woABkLvAgTQRTJc2UBSBQIxDy +LylBA04hgAcA2Q8hAQALIkCgJn2cCoL7gOX09d4Pr/IqcIDn2vXJcBYKr/sKcSTwLyiBA04gjwfv +fwDYDyDAAwZ+z3CgAGQu8CDNA1MlzZQS8i8pQQNOIYAHANkPIQEAJn1ALwEVDLgleHoOr/QB2YDl +8fWA5t71z3CgAMAvpRgYhRQY2IQVAM/s4HjgfuB44H7gePHAxg+P7Ah2z3WgAMAvoxUAllEgAIH6 +8wfIQB0YkA3IhuAG9P4N7/7JcG/wz3eAAAjmCo+A4AnyQCeAEkAmgRImDa/8CtrPcKAA1AsYgEIg +AAhIIAAAsOCYCOX/yiAlDAPIA5AluMC4F7jHcAAOAABFIAEL7HAgoAESATbscCCgIIbscCCgIYbs +cCCgIobscCCgI4bscCCgJIbscCCgJYbscCCgJobscCCgJ4bscCCgKIbscCCgoxUAllEgAIH98wfI +BCCADwEAAPAsuJTgwCCGDwAAkwDPcaAAaCzwIQEAz3CAALRaAIBiC+/xJXgKj4DgCfLPcYAAfFIX +kQHgEHgXsQDYCq8pB4/s4HihwfHAqg6P7KLBScE6cEh16bkacwoiACEy8gLZz3CgAMgfSRhYgCnB +U23u4VB4BvQuDm/wi3Ea8LfhCPQbeBB4Hg5v8ItxEfCU4QT0HHgK8IrhBfQAHIQwBvDPcAAA//8A +HAQw4HgA2M9yqQCk/7miABQBMYK4N6Iaokrw6Lku8kwiAKDRIeKhQvTPcqUArP/PcIAApDW4ogSA +VhAAARTgAiADIAPjIrt4Y3hgSCBAAAW4RSBAAxaiQSnAIcC4d2gpwAQhgQ8AAAAgJblleCV4ibiO +uBmiHPApwIDgyiHBD8oiwQfKICEOzyAhA8ojIQXPIyEDyiQhAMQB4e3KJcEABb2leM9xpQCs/xah +z3GgAMgfz3WgALRHVxUAlgDfSiRAAAQgvo8AKAAAwiQCAW8VAJZMJACABCCFD4AAAAAEIIMPIAAA +AAQgjg8ABgAABvJAEQIGg+KE9wDaA/AB2vhyExEChgQgvo8AOAAABCKGDwAAAIDMJyGAwCdhEAUj +QgEFIoIBBSK+gwT0ieeiB87/TCYAgAXygOPMJiGQivJrFQSWTCQAgEvyiHSEJNCRC/LPcYAAHFEQ +gQDdAeAQoZy9X/BRJMCACvLPcYAAHFERgQHgEaFC3VXwiHSEJAKYCfLPcYAAkFIRgQHgEaEO8FEk +gIEJ8s9xgACQUgSBAeAEoQTwUyQ+gwTyAN078FEkQIMK8vYJz/zPcYAADFMFgQHgBaH08QohwA/r +cm8VBZZE2Iy46duJAO/tjLuA4wjyz3GAABRSEIEB4BCh4PGA5iny+rgL8s9ygACQUi+CAN0B4S+i +kb0K8Pm4DfLPcoAAkFIygkLdAeEyov4Lr/+IcZi9RPBxFQSWbxUFlgohwA/rcjnYz3MAAAIRJQDv +7Yy4agnP/M9xgAAUUhGBAeARoa7xExEAhvC4yiAhADgLof/PIKEDaxUBllgVAJYLIECAHfJvFQCW +z3WgAPQHUyBAgAHYC/IJpeB4ANgJpc9xgAAMUwiBAeAIoWoP7/0B2APYCqUF3Zi9AvAA3YDlGfRR +IcChC/JMIgCgDvQB2c9woAD0ByygA9kF8APZz3CgAPQHJaBRIYCiwAlC+BfwAxIBNs9wgAAI4hBx +B/LPcIAA0OIQcQv0khEAAaq4khkEAJ4RAAGquJ4ZBADPcIAAHAoAgIDgB/LPcoAAIDwFggJwBaLP +cYAAHFEPgQHgD6HPcIAAyLMhgM9wgACkNQOAFJAQcQ70z3CAAAwtOoAbgCR4USAAgqQN4vTKIGIA +qXAI3E8Dr+yiwOB4ocHxwO4Kj+wodQh2GnIEIb6PAQAAwGh3LfTovRXyRCUAFiO4IWgEJYAfBgAA +ADG4OGAEJYEfBgAAAddxAgAAAcogoQAC8AHYgeAQ8oLgCfKD4ADYyiDhAcAooQMK8M9wgADwwQKA +BvDPcIAA8MEBgAV9yXCmC+/4qXHJcKlxCnLpc74L7/9KJEAAgOD0CoH/CNzHAo/s4HjPcKQAkEFN +gM9xgABkxEKxGoBRIEDGA7EEIIAP/wAAADC4BLHPcIAAZMQA2gjyz3GAAFDDMoFRIYCCBfJCsEOw +RLDgf1mw4HjxwBYKr+yYcM9wgABQww6Qz3aAAGTEALbPcIAAUMNIEAUABCWPjwAAAAIA2wTyUSUA +ggryz3GmAOj/C4EDpgyBBKYE8GSmY6bPdaQAtEUMFQKWDRUAlv/ZLyCHEIDnELkEIkkALPIyFQGW +UyGPAP9nIbb/2fR/CLnvf0R5QC8GEgAmRwAAIMgTBScHAkAvARYEIoIPAP8AAEAvCBQ6YgAgSBL/ +2QUnBwIIuQUiwgEEIEcA+GAAJ4EBJXjltk95BCKCD/8AAAAoukV5I7YPeAS2BBUAllElAIICthDy +RCUABiO4AeCB4Mr3z3GmAOj/DYEFpg6BBqYE8GamZaYA2kokgHAG2Y25qCBAAynYErjwIEMAQCYA +H1V4AeFgoAHiz3CAAFDDAJA4HgARVSZBFBq2z3CAADzEVg9v/AjaGxUAls9xpQDYyxmmHBUAlhqm +HRUAlhumDoEcpg+BHaYmFQCWHqbPcKQAkH8cgBUBr+wfpuHFz3WAAGTECaUqpXi1S6UB2Bm14H/B +xUokAHoA2agggAIA2s9wgABkxDV4QKAB4eB+AAACAAAAAEABAAAAAACoEkN1AQYAAQAAAAAAAAAA +RFOAANhTgAAAloAA3DOAAJQLgABsIMAQDxsJItwdwBAKABtAEAAbbh4AAGEKABtB5B3AEQAACiQA +AAolAQAKJv4FCmRAABtwAgAAYQgAX3AFAABhIAAbcAcAAGEIAF9uAQAAYQQAAGEkU4CBAADAFgEA +GyYAAMAXAQAKJAAACiUPCmMiCABfcAoAAGEPHB0iCQAdJg9fGyL4K4CBAADAFzsAAGEAABslAAEb +JFwcwBE3AABh+CuAgQAAwBYgABtwMwAAYfQrgIEAAMAWDxsKIg8bGiIPCRsiAQAbMAAAwBff/wwk +//8MJSAAGjAEABonAAwaOQAAwBYPCQsiAQAbcBkAAGEAGwkp6CuAgQAAwBYAGwkpAIAJcBMAAGEP +ChoiIAAaMAgAGicADBo5AADAFgEAG3ARAABhDwsJIgAbCSnoK4CBAADAFgAbCSkPCRsiAIAJbgQA +AGEoAAkkAAkbKQCAG3AFAABh5CuAgQAAwBYACxso8CuAgQAAwBcPChsiBAAbJgAMGzn0K4CBAADA +F7gIgIEPGhsiAAAbJQIAG0AAABtxXAmAgQAAwBYPGwsiYAmAgQAAwBYPGwoiZAmAgQAAwBYPGwgi +qDyAgQIAXG4RAABh+EHEEA8bCSIACwk5AgAKYgMBCmIEAgpiAAAJQAQAAGEJAAlAAgAAYQoACUAA +AABhAgAJQQAJGigAAMAWAQAbJgAAwBcEAB0mAQAIJ+kACGQPIBsiZAmAgQAAwBe4CICBDxobIgAA +GyUCABtAAAAbcQ9FACIAXAA5BwAAYgZgAGIAAFg4YEXAEHBFwBB4RcAQkEXAEIYAAGH0HcAQCwAT +YrQfwBAAQBNuCAAAYQIKeWgCAHluAwAAYQgAZDEDABMkBwAAYQAAEyQFAABhAwd5Yg95EyLoHcAR +AQBSJLQfwBAPE1IiAgATcAMAAGEIAFgwCABkMQUAAGFCBBMkCAATJQEAUm4QABMxBCjAEQgAWG7b +DwBhAAATJQAAEyQkEMARgAATJUdoEyQEKMARAIATJDgcwBEPABMiAQATMAQowBEPcxMiggETMAQo +wBEPdBMiAgITMAQowBEPFBUiAQAVJg9yEyIIAMwRD0QAIgoAAEAAQABwDgAAYQAAEyUCABMk7BzA +EQ92EyIYCMoRCQATQBwIyhEJABNAIAjKEQ94EyIEAMoRAAABJAAAASUGAABhD3YTIixIxxEPeBMi +AADGEQMAASQAAAElAAATJcIsEyQEKMARAkYTJAQowBHCXxMkBCjAEQ9FACIAXAA5LAAAZAAAEyQB +ABMlOBzAEQ93EyLgHMARAgABYg8BEyIECMARRAnAEgQowBEPEwIiSAnAEgQowBEPEwciTAnAEgQo +wBEPEwQiAgBxcAcAAGH/ABMlAhATJAQowBEAABMlAAATJMhJxxEGAABhAAATJQIQEyQEKMARAAAT +JUkAEyTISccRD3ATIgEAEzAEKMARAwATJAAAEyUECMARAAATJDhFwBFQCcASGCjAEQ8TAyIEAABh +AABYOAAAEyQBABMlOBzAEQAAFSQAAAAhMAmAgQAAwBYPG1AiNAmAgQAAwBYPGxoiOAmAgQAAwBYP +GxkiPAmAgQAAwBYAAACFLAmAgQAAwBYPGwQiHAQbZhsBG2gUHMAQCgAbQAQAG24LAABhDxwdIgEA +HSb5DwBhQAmAgQAAwBYFABtiuAiAgQ8aGyIAABslAgAbQAAAG3FkDAAQAMAGEQEABCf8AARkAAAb +JAIAGyU4HMARuAiAgQ8aGyIAABslAgAbQAAAG3EAABslQAAbJDAcwBG4CICBDxobIgAAGyUCABtA +AAAbcZBFwBAPZAEiCgABQAgAAXApAABhAAABJAgAASUPAWMiCABYbgYAAGEkEMAQAQATbgIAAGEA +AlwxAQAAYQAgWDBoCUAS//8Tbv0PAGEBQhMkAAATJQQowBFoCUAS//8Tbv0PAGFCBBMkGAATJQQo +wBFgRcAQcEXAEAMHfWICABMkAAATJegdwBH4/0wzAQBMMQEAUiRsCUAS//8TbgMAAGEkEMAQAQAT +cAIAAGEAABUkAAAAISQAAGECABMk5B3AEfQdwBARABNitB/AEABAE24OAABhBgp9aAIAEyTgHcAR +AAATJAEAfW4BABMkDAAAYQEAfXADAABhCABkMQMAEyQHAABhAQATJAUAAGEDB31iD30TIugdwBEB +AFIktB/AEAIAE3ACAABhCABkMQAAACEPE1IiQgQTJAgAEyUBAFJuEAATMQQowBHYCYCBAADAFgIB +E2RCARMkBCjAEYBagIEAAMAWBgETYgQIwBAEABNkD1wAIgoAAEAABgBwGQAAYQAAEyQAABMlAADA +FwAIWDDIIMAQcEXAEBAIwBAAABMlAwATJBwIwBEcCMARAAATJAQIwBEPFBUiBAAVJvv/MDIDABMk +GAjAEQ8UFSICABUmBAAwMAAAEyQQRcARGAjAEQAQWDAPfBMiCADMEQAAEyUAABMkNEjHEQ97EyIB +ABMwBCjAEQ8UFSICABUm/wATJQIQEyQEKMARDxQVIgIAFSbQCoCBAADAFsIsEyQEKMARAkYTJAQo +wBHCXxMkBCjAEQ9NEyIEEMURAgATJPAcwBEBABMk7BzAEQAAEyRwABMlEBzAEQAAEyUAABMk4BzA +EYAAEyVGaBMkBCjAEQAAEyUBABMkJBDAEQAAFSQAAAAhDw4aIgAAQBYAARtwDQAAYYAAYyT//hsy +AABAFwAAGyUPGw8inAmAgf8AGzICABtBABsaKAAAwBYAABslAgAbQAAAG3EBAGRwBwAAYQEAYyQA +ABskfgmAgQAAQBd0CYCBAABAFu0PAGECAGRwEAAAYQIAYyQBABskfgmAgQAAQBd2CYCBAABAFuQP +AGEEAGRwBwAAYQIAYyQCABskfgmAgQAAQBd4CYCBAABAFtsPAGEAAB0kAAAAIQACD24JAABhfgmA +gQAAQBYAABslegmAgQAbGigAAAAWAQAbJgAAABcNAABhlAmAgQAAQBYCABsmARAbaAAAGyQAAEAX +gAmAgQAaGygPGw4imAmAgQAAQBYBABsmAABAFwAIgIEPGhsiAAAbJQIAG0AAABtxAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAEgAC4AYAAAAAA +AAAAAAAoAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMqYAADAYAAAypgADI1gAA +CQ0RFAoNExcZGRkZCQkAACSkgABEgQAADKmAAAAAAAAMqYAAAAAAACjFgABkgQAAMIAAAAAAAAAx +gAAAiIgzMzKAAAAAqqqKM4AAAAAAAAA0gAAAAAAAADWAAAAAAAAANoAAAAAAAAA3gAAAAAAAADiA +AAAAAAAAOYAAAAAAAAA6gAAAAAAAADuAAAAAAAAAPIAAAAAAAAA9gAAAqqoKAD6AAABThYiIP4AA +AAAAADAwgAAAAAAAADGAAACamVhVMoAAAACqqqozgAAAAAAAADSAAAAAAAAANYAAAAAAAAA2gAAA +AAAAADeAAAAAAAAAOIAAAAAAAAA5gAAAAAAAADqAAAAAAAAAO4AAAAAAAAA8gAAAAAAAAD2AAACq +qgoAPoAAAFWYmao/gAAAAAAAUDCAAAAAAAAAMYAAAAAAAAAygAAAAAAAADOAAAAAAAAANIAAAAAA +AAA1gAAAAAAAADaAAAAAAAAAN4AAAAAAAAA4gAAAAAAAADmAAAAAAAAAOoAAAAAAAAA7gAAAAAAA +ADyAAAAAAAAAPYAAAAAAAAA+gAAAAAAAAD+AAAAAAAAAMIAAAAAAAAAxgAAAAAAAADKAAAAAAAAA +M4AAAAAAAAA0gAAAmnkAADWAAACqqqqqNoAAAAAAAAA3gAAAAAAAADiAAAAAAAAAOYAAAAAAAAA6 +gAAAqqqqCjuAAAAAcJmqPIAAAAAAAAA9gAAAAAAAAD6AAAAAAAAAP4AAAAAAAAD//wAApQEBALkB +3wA7Ai0AsQAbABYBGwCvABsAFAEbAGwAoADRAKAAbwCDAHEAgwBzADMA1AEGANABAAB4AEkAeQBq +AN4AagCoAAAADQEAAKYAPwCnAAEACwE/AAwBAQAEAAgAnAHMAJ0BzADVAcwA1gHMALQAIAAZASAA +jwCIAPQAiACQACIA9QAiAJEABAD2AAQAhQAAAIYAAACHAFUAiAAAAIkAqgCKAAAAiwDdAIwAAACF +AAEAhgABAIcAVQCIAAAAiQCqAIoAAACLAN0AjAAAAIUAAgCGAAMAhwBVAIgAAACJAKoAigAAAIsA +3QCMAAAAhQADAIYABwCHAFUAiAAAAIkAqgCKAAAAiwDdAIwAAAD7/wAA//8AALkB3wA7Ai0AsQAb +ABYBGwCvABsAFAEbAGwAoADRAKAAbwCDAHEAgwBzADMA1AEGANABAAB4AEkAeQBqAN4AagCoAAAA +DQEAAKYAPwCnAAEACwE/AAwBAQAEAAgAnAHMAJ0BzADVAcwA1gHMALQAIAAZASAAjwCIAPQAiACQ +ACIA9QAiAJEABAD2AAQAqAAMAA0BDACFAAAAhgAAAIcAmQCIAAAAiQCqAIoAAACLAN0AjAAAAIUA +AQCGAAEAhwCZAIgAAACJAKoAigAAAIsA3QCMAAAAhQACAIYAAwCHAJkAiAAAAIkAqgCKAAAAiwDd +AIwAAACFAAMAhgAHAIcAmQCIAAAAiQCqAIoAAACLAN0AjAAAAPv/AAD//wAAuQHfALEAGwAWARsA +rwAbABQBGwBsAKAA0QCgAG8AgwBxAIMAdgCDAHMAMwBuADMAcAAzAHIAMwDXADMA1AEGANABAAB+ +ADwA4wA8AHgASQDdAEkAfwBaAOQAWgCqAD8AqwABAA8BPwAQAQEAeQBqAN4AagCoAAAADQEAAKYA +NwCnAAEACwE3AAwBAQAEAAgAnAHMAJ0BzADVAcwA1gHMALQAIAAZASAAMQIMADICDAAzAr0ANgIM +ADcCDAA4Ar0AoACIAAUBiAChANUABgHVAKIABAAHAQQAjwCIAPQAiACQACIA9QAiAJEABAD2AAQA +nwAMAPsADACUAAAAlQAAAJwAlwCdANAAmgCNAJgAEQCWADMAlwB3AJQAAQCVAAEAnACXAJ0A0ACa +AI0AmAARAJYAMwCXAHcAlAACAJUAAwCcAJcAnQDQAJoAjQCYABEAlgAzAJcAdwCUAAMAlQAHAJwA +lwCdANAAmgCNAJgAEQCWADMAlwB3APoAAAD5AAAAAgGXAAMB0AAAAY0A/gARAPwAMwD9AHcA+gAB +APkAAQACAZcAAwHQAAABjQD+ABEA/AAzAP0AdwD6AAIA+QADAAIBlwADAdAAAAGNAP4AEQD8ADMA +/QB3APoAAwD5AAcAAgGXAAMB0AAAAY0A/gARAPwAMwD9AHcAhQAAAIYAAACHAFUAiAAAAIkApwCK +AAAAiwDeAIwAAACFAAEAhgABAIcAVQCIAAAAiQCnAIoAAACLAN4AjAAAAIUAAgCGAAMAhwBVAIgA +AACJAKcAigAAAIsA3gCMAAAAhQADAIYABwCHAFUAiAAAAIkApwCKAAAAiwDeAIwAAADrAAAA6gAA +AOwAVQDtAAAA7gCnAO8AAADwAN4A8QAAAOsAAQDqAAEA7ABVAO0AAADuAKcA7wAAAPAA3gDxAAAA +6wACAOoAAwDsAFUA7QAAAO4ApwDvAAAA8ADeAPEAAADrAAMA6gAHAOwAVQDtAAAA7gCnAO8AAADw +AN4A8QAAAKQBgAChAUAA+/8AAP//AAClAQEAuQHfALEAGwAWARsArwAbABQBGwBsAKAA0QCgAG8A +gwBxAIMAdgCDAHMAMwBuADMAcAAzAHIAMwDXADMA1AEGANABAAB+ADwA4wA8AHgASQDdAEkAfwBa +AOQAWgCqAD8AqwABAA8BPwAQAQEAeQBqAN4AagCoAAAADQEAAKYANwCnAAEACwE3AAwBAQAEAAgA +nAHMAJ0BzADVAcwA1gHMALQAIAAZASAAMQIMADICDAAzAr0ANgIMADcCDAA4Ar0AoACIAAUBiACh +ANUABgHVAKIABAAHAQQAjwCIAPQAiACQACIA9QAiAJEABAD2AAQAnwAMAPsADACUAAAAlQAAAJwA +lwCdANAAmgCNAJgAEQCWADMAlwB3AJQAAQCVAAEAnACXAJ0A0ACaAI0AmAARAJYAMwCXAHcAlAAC +AJUAAwCcAJcAnQDQAJoAjQCYABEAlgAzAJcAdwCUAAMAlQAHAJwAlwCdANAAmgCNAJgAEQCWADMA +lwB3APoAAAD5AAAAAgGXAAMB0AAAAY0A/gARAPwAMwD9AHcA+gABAPkAAQACAZcAAwHQAAABjQD+ +ABEA/AAzAP0AdwD6AAIA+QADAAIBlwADAdAAAAGNAP4AEQD8ADMA/QB3APoAAwD5AAcAAgGXAAMB +0AAAAY0A/gARAPwAMwD9AHcAhQAAAIYAAACHAFUAiAAAAIkApwCKAAAAiwDeAIwAAACFAAEAhgAB +AIcAVQCIAAAAiQCnAIoAAACLAN4AjAAAAIUAAgCGAAMAhwBVAIgAAACJAKcAigAAAIsA3gCMAAAA +hQADAIYABwCHAFUAiAAAAIkApwCKAAAAiwDeAIwAAADrAAAA6gAAAOwAVQDtAAAA7gCnAO8AAADw +AN4A8QAAAOsAAQDqAAEA7ABVAO0AAADuAKcA7wAAAPAA3gDxAAAA6wACAOoAAwDsAFUA7QAAAO4A +pwDvAAAA8ADeAPEAAADrAAMA6gAHAOwAVQDtAAAA7gCnAO8AAADwAN4A8QAAAKQBgAChAUAA+/8A +AAAAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAAAAAAAAQAAAQEAAAAAAQEAAAAA +AAAAAAAAAAABAQEBAgAAAA3SEtIT0hTSDNIV0gvSAtIR0gRDABAUEAkQERABQBvSHNIA0goACwAE +AA4AtQAaAQ8AQgC8AMMAIQEoAbYAtwC4ALkAvQC+AL8AwAAbARwBHQEeASIBIwEkASUBCgAAAAsA +AAC2AAAAtwAAALgAAAC5AAAAGwEAABwBAAAdAQAAHgEAAL0AAAC+AAAAvwAAAMAAAAAiAQAAIwEA +ACQBAAAlAQAAEtIAABPSAAAAAAEAAgADACwAZAB0AIAAjAChAAcAAAAAAAEAAgADAAAAAAC3EyIA +uBQjALkVJAC7FiUAvBcmAL0YJwDAGSgAxBopAAcbAAAIHAEACx0CAAweAwAQHwQAIiEFACQiBgAm +IwcAKCQIAColCQAsJgoALicLADAoDAA0KQ0AOCoOADwrDwBALBAAZC4RAGgvEgBsMBMAcDEUAHQy +FQB4MxYAfDQXAIA1GACENhkAiDcaAIw4GwCROhwAlTsdAJk8HgCdPR8AoT4gAKU/IQAkSQYCLEoK +AjRLDQE8TA8BZE0RAWxOEwF0TxUBfFAXAYRRGQGVUh0BnVMfAQEEAAACBQEAAwYCAAQHAwAFCAQA +BgkFAAcKBgAICwcACQwIAAoNCQALDgoADA8LAA0QDAAOEQ0AAUAABAJBAQQDQgIEBEMDBAVEBAQG +RQUEB0YGBAhHBwQJSAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIAAgADAAQABAAFAAYABgAHAAgACAAJ +AAoACgALAAwADAANAA4ADgAPACYAJwAoACkAKgBGAEYARwBIAEgASQBKAEoASwBMAGgAaQBqAGoA +awBsAGwAbQBuAG4AbwBwAHAAcQByAHIAcwBzAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0 +AHQAdAB0AHQACgA/AAAAAAAAAAAAAAAAAAAAAAABAAEAAgADAAMABAAFAAUABgAHAAcACAAJAAkA +CgALAAsADAAMAA0ADgAjACQAJQAmACcAKAApAEQARQBGAEYARwBHAEgASABJAEkASgBLAGgAaABp +AGoAawBsAG0AbQBuAG8AbwBwAHEAcQByAHIAcwBzAHMAcwBzAHMAcwBzAHMAcwBzAHMAcwBzAHMA +cwBzAHMACgA/AAAAAAAAAAAAAAAAAAAAAAABAAIAAgADAAQABAAFAAYABgAHAAgACAAJAAoACgAL +AAwADAANAA4ADgAPACYAJwAoACkAKgBGAEYARwBIAEgASQBKAEoASwBMAGgAaQBqAGoAawBsAGwA +bQBuAG4AbwBwAHAAcQByAHIAcwBzAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0 +AHQACgA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQACAAMAAwAEAAUABQAGAAcABwAIAAkA +CQAKAAoACwAkACUAJQAmACcAKAAoAEQARQBGAEYARwBIAEgASQBKAEoASwBMAGgAaABpAGoAawBs +AG0AbQBuAG8AbwBwAHEAcQByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIA +CgA/AIBzgAAAAAAAsgzIAP////////8AAf//AgP///8E//////////////////////8F/wb/B/8I +/wn/Cv8L/wz///8N////Dv///w////8Q//////////////////////////////////////////// +//8R////Ev///xP///8U////Ff///xb///8X////GP///xn///8a////G/////8c////Hf///x7/ +//8f////IP///yH//////////////////////yIjJP8lJif//yj///8p//////////////////// +//////////////////////////////////////////////////////////8AAQABAQAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAQAAAAAAAACYRgEAAAAA +AGR4AAABAAAARAcCAAIAAAC0BgIAAwAAAGBpAgAEAAAAmEYBAAUAAADALwEABgAAAGQDAQAHAAAA +UDABAAgAAAAIOAAACQAAAPRqAAAKAAAAANkAAAsAAAD0MQAADAAAAGRpAgANAAAABPYAAA4AAAC4 +9gAADwAAAJD1AAAQAAAAlPYAABEAAAAoXwEAEgAAAHQnAgATAAAA7CMAABQAAABEiQEAFQAAAExz +AQAWAAAAvIIBABcAAADwBQIAGAAAAMS0AQAZAAAA9CEBABoAAACURgEAGwAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////wAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAABGgAAASAAAAUgAS4JIgEyDyAHMBMiCzIZIBEwHSIVMiMgGzAnIh8xLSAAADEfAAA3GQAA +OxUAAAAAAAAAAAAAVJ8AAFSfAABUnwAARIgAAFSfAABUnwAAqIgAAFSfAABUnwAAVJ8AAFSfAABU +nwAAVJ8AAFSfAABUnwAAVJ8AACiQAABsjwAAXI8AANCOAACUjwAAjI4AAFSfAABUnwAAEJYAAPyY +AACsmgAAVJ8AAFSfAABUnwAAvJ4AACiVAABglQAAzJQAAFSfAABUnwAAVJ8AAHieAABUnwAArJQA +AFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAA +VJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABU +nwAAVJ8AAFSfAABUnwAAaIkAAFSfAABUnwAAVJ8AAFSfAABUnwAAyJsAAFSfAABUnwAAVJ8AAFSf +AABUnwAAUIwAAFSfAABgjAAAXIwAAFSMAABYjAAAJIYAAFSfAAD4hQAAVJ8AAFSfAABUnwAAVJ8A +AFSfAABUnwAAVJ8AAFSfAACEhQAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAA +VJ8AAFSfAACgigAAPIoAAFSfAAC8igAAVJ8AAIiJAABQjgAAVJ8AAFSfAABIkAAAVJ8AAFSfAABU +nwAAVJ8AAFSfAACckQAAeJAAAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSf +AABUnwAAZIwAAFSfAABUnwAAVJ8AAGybAABUnwAAVJ8AAFSfAAAMngAAVJ8AAHCeAAAImwAAVJ8A +AFSfAACkhAAAyJoAAFSfAABUnwAA2I4AAPCOAABUnwAAVJ8AAAyMAABohgAAVJ8AAFSfAABUnwAA +aJUAAHSOAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAACsjQAAVJ8AADigAAB4ogAArKEAAICiAACk +oQAAnKEAAIiiAAB4nwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAAAUjAAAVJ8AAFSf +AABUnwAAVJ8AAFSfAABUnwAAVJ8AAByjAAAwpAAAxIQAAOSEAABUnwAAVJ8AAFSfAABUnwAAVJ8A +AJyGAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAA +VJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABUnwAAVJ8AAFSfAABU +nwAAoIYAAJCHAAAwhwAAkKIAABCFAAAciAAAtIgAAFSfAABUnwAAVJ8AAFSfAACgiAAApIgAAFSf +AABUnwAASIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPCxAAA4sAAAXLMAAGSyAABwtAAAAAABAP////8AAAAA +//////////8BAAAAIA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAADQ/gAAAAAA +AAAAAAAAABggoAAgIKAAQCGgAEghoAAcIKAAJCCgAEQhoABMIaAAKCCgADAgoABoIaAAcCGgACwg +oAA0IKAAbCGgAHQhoAA4IKAAPCCgAHghoAB8IaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA +AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUDAAAAP8DAHQNAAAA/wUA +GA0AAAD/LQD0DAAAAP89AJAMAAAA/wQAuAwAAAD/JQCY3AAAAP/dADwNAAAQEEwAAAAAAAAAAAAA +AQEAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwVFRUVPDw8PBUVFRU8PDw8AAAAAAAA +AAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8FRUVFTw8PDwVFRUVPDw8 +PAAAAAAAAAAAAAAAAAAAAAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PBUVFRU8PDw8 +FRUVFTw8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgPAAAUFgAAxBIAAEQQAADUFwAAvBMAABAVAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AABsCoAAtKmAABgAAAB0qYAAAAAAAAAAAAAAAAAAAAAAAFgfAQCAvwAAdCAAAIC/AACAvwAAgL8A +AAgHAACAHwIAOOoAAIC/AACAvwAAYCcAAGAnAABgJwAAYCcAAGAnAABgJwAAYCcAAIC/AACAvwAA +gL8AAIC/AABsUgAAgL8AAIC/AACAvwAAgL8AAIC/AAAc6gAAgL8AAIC/AADU2wAAAAAAALwGAQDA +BgEAtAIAAKACAAA8XgEAAAAAAHDOAAAA6gEAmM4AACjqAQC8zgAAUOoBAEhMgACgnoAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAALB4AAPQdAAC4qoAAAAIAAAAAAACgFQEAcBUBALisgABABQAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApBUBAAhbAQBIs4AAVAAAAAAAAACgFQEA3FkBAPixgABQ +AQAAAAAAAKAVAQDQVAEAvAqAAAgAAAABAAAAoBUBAGwUAQAAAAAAUAEAAAAAAACgFQEAXFUBANxE +gAACAAAAAAAAAKAVAQBoVAEAuAqAAAQAAAAAAAAAqBUBAHAVAQCcs4AAKgAAAAAAAACgFQEAcBUB +ADxTgAAEAAAAAAAAAAAAAAB4FQEAAAAAAAAAAAABAAAAAAAAAIwVAQAAAAAAAAAAAAAAAAAAAAAA +dBUBAAAAAAAAAAAAAAAAAKAVAQCA7AEAAAAAAAAAAAAAAAAAoBUBAEDsAQDECoAABAAAAAAAAABu +AG4AaQDAAKAAUACAAL4AUAF9AD4AAAAAAAAAnAIEAOYBJQBVAwQA3AFjAAAAbgBuAGkAwACgAFAA +gAC+AFABfQA+AAAAAAAAAJwCBADmASUAVQMEANwBYwAAAAAAAAABAQAAoB4BABXSAAAAAAAA/wMA +AKAeAQAM0gAAAAAAAP8BAACgHgEAFdIAAAoAAAAA/A8AoB4BAAzSAAAJAAAAAP4DAKAeAQAV0gAA +FAAAAAAA8D+gHgEADNIAABIAAAAAAPwHoB4BAAbSAAAAAAAA/wEAAKAeAQAH0gAAAAAAAP8DAACg +HgEABtIAAAkAAAAA/gMAoB4BAAfSAAAKAAAAAPwPAKAeAQAG0gAAEgAAAAAA/AegHgEAB9IAABQA +AAAAAPA/AAAAAAAAAAAAAAAAAQAAAAEAAAAKAAAABQAAAAUAAAAGAAAACgAAAAoAAAAGAAAABAAA +AAUAAAAGAAAABQAAAAUAAAAGAAAABgAAAAYAAAAGAAAABwAAAAcAAAAHAAAACAAAAAgAAAAIAAAA +BAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAEAAAACAAAAAQAAAAEAAAADAAAAAwAAAAIAAAAB +AAAABAAAAAAAAAAAAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAEAAAAAAAAALAEAAF4BAAABAAAAAQAAAAEAAAABAAAAAwAAAAAAAAAAAAAA +vCkBAEQuAQAwLQEAsC4BAEAuAQBsLAEArC4BAPAqAQDsKgEAYOMWACDWEwAAAAAAEAAAAACAAAAA +AKAAECcAAOgDAADoAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAEAAAABAAAAAgAA +AAUAAAACAAAAAgAAAAUAAAACAAAAAgAAAAEAAAABAAAABQAAAAUAAAACAAAABQAAAAUAAAAAAAAA +BQAAAAIAAAACAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAAAAAABQAAAAIAAAACAAAABQAAAAUAAAAF +AAAAAAAAAAUAAAACAAAABQAAAAEAAAABAAAAAgAAAAIAAAACAAAABQAAAAUAAAACAAAABQAAAAEA +AAABAAAAAgAAAAIAAAACAAAABQAAAAUAAAACAAAAAgAAAAUAAAABAAAAAgAAAAUAAAACAAAABQAA +AAUAAAAEAAAABQAAAAUAAAABAAAABQAAAAUAAAAFAAAAAgAAAAIAAAAFAAAABQAAAAUAAAABAAAA +BQAAAAUAAAAFAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAA +AAAAAAAACAAAAAAAAAABEAABAAAAAoAAAUIABgIQAAIgAAADwAABQwAGAxAAAsAAAAPAAAFDAAYE +EAACQAAAAoAAAUQABgURAABAAAADwAABRQAGBhEAAOAAAAPAAAFFAAYHEQABAAAAAoAAAUYABggR +AAIgAAADwAABRwAGCREAAsAAAAPAAAFHAAYKEQACQAAAAoAAAUgABgsSAABAAAADwAABSQAGDBIA +AOAAAAPAAAFJAAYNEgABAAAAAoAAAUoABg4SAAIAAAACgAABTAAGAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AQIBAQACAQABAgICAAEBAAIBAgECAAIAAQIDgICAgICAgIABgAKAgICAgMAAkADQAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgAAAG4AAgBuAG4AbgACAGkAaQBuAAEA +wADAAOgAAQCgAKAANgEDAFAAUAD1AAEAgACAAOgAAQC+AL4AvgABAFABUAFQAQEAfQB9AK8AAwA+ +AD4APgABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAJwCnAKcAgEABAAEAAQAAQDmAeYB5gEBACUA +JQAlAAEAVQNVA1UDAQAEAAQABAABANwB3AHcAQEAYwBjAGMAAQAAAAAAAAAAADIABQAyAAUAAgAI +AGQAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAjAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACE +EwIAFQAAAAMAAAC4WYAAAAAAAAAAAAAAAAAAmA4CAAYAAAAAAAAA2FmAAAAAAAAAAAAAAAAAACgT +AgAFAAAAAwAAALhZgAAAAAAAAAAAAAAAAAAkVgAAFQAAAAMAAAC4WYAAAAAAAAAAAAAAAAAAEBMC +AAoAAAADAAAAuFmAAAAAAAAAAAAAAAAAAMQQAgAEAAAAAAAAANhZgAAAAAAAAAAAAAAAAADEEAIA +BAAAAAAAAADYWYAAAAAAAAAAAAAAAAAAxBACAAQAAAAAAAAA2FmAAAAAAAAAAAAAAAAAAMQQAgAE +AAAAAAAAANhZgAAAAAAAAAAAAAAAAADEEAIABAAAAAAAAADYWYAAAAAAAAAAAAAAAAAAaBECAAYA +AAAAAAAA2FmAAAAAAAAAAAAAAAAAAJARAgAEAAAAAAAAANhZgAAAAAAAAAAAAAAAAACQEQIABAAA +AAAAAADYWYAAAAAAAAAAAAAAAAAAkBECAAQAAAAAAAAA2FmAAAAAAAAAAAAAAAAAAJARAgAEAAAA +AAAAANhZgAAAAAAAAAAAAAAAAABoEQIABgAAAAAAAADYWYAAAAAAAAAAAAAAAAAAaBECAAYAAAAA +AAAA2FmAAAAAAAAAAAAAAAAAAGgRAgAGAAAAAAAAANhZgAAAAAAAAAAAAAAAAACQEQIABAAAAAAA +AADYWYAAAAAAAAAAAAAAAAAAkBECAAQAAAAAAAAA2FmAAAAAAAAAAAAAAAAAAGgPAgAKAAAAAAAA +ANhZgAAAAAAAAAAAAAAAAADAEAIACgAAAAAAAADYWYAAAAAAAAAAAAAAAAAAwBACAAoAAAAAAAAA +2FmAAAAAAAAAAAAAAAAAAMAQAgAKAAAAAAAAANhZgAAAAAAAAAAAAAAAAADAEAIACgAAAAAAAADY +WYAAAAAAAAAAAAAAAAAAwBACAAoAAAAAAAAA2FmAAAAAAAAAAAAAAAAAAMAQAgAKAAAAAAAAANhZ +gAAAAAAAAAAAAAAAAADAEAIACgAAAAAAAADYWYAAAAAAAAAAAAAAAAAAwBACAAoAAAAAAAAA2FmA +AAAAAAAAAAAAAAAAAMAQAgAKAAAAAAAAANhZgAAAAAAAAAAAAAAAAADAEAIACgAAAAAAAADYWYAA +AAAAAAAAAAAAAAAAwBACAAoAAAAAAAAA2FmAAAAAAAAAAAAAAAAAAMAQAgAKAAAAAAAAANhZgAAA +AAAAAAAAAAAAAAD4FAIABgAAAAAAAADYWYAAAAAAAAAAAAAAAAAAXBQCAAUAAAADAAAAuFmAAAAA +AAAAAAAAAAAAAMAOAgAKAAAAAAAAANhZgAAAAAAAAAAAAAAAAAAwDwIACgAAAAAAAADYWYAAAAAA +AAAAAAAAAAAAHCYCAAoAAAADAAAAuFmAAAAAAAAAAAAAAAAAAIQPAgAKAAAAAAAAANhZgAAAAAAA +AAAAAAAAAAA8EAIACgAAAAAAAADYWYAAAAAAAAAAAAAAAAAAKBICAAoAAAAAAAAA2FmAAAAAAAAA +AAAAAAAAALASAgAKAAAAAAAAANhZgAAAAAAAAAAAAAAAAACIEwIACgAAAAAAAADYWYAAAAAAAAAA +AAAAAAAABBQCAAoAAAAAAAAA2FmAAAAAAAAAAAAAAAAAADAUAgAGAAAAAAAAANhZgAAAAAAAAAAA +AAAAAABAFAIABgAAAAAAAADYWYAAAAAAAAAAAAAAAAAAVBQCAAEAAAAAAAAA2FmAAAAAAAAAAAAA +AAAAABgWAgAKAAAAAQAAAPhZgAAAAAAAAAAAAAAAAACMFQIABQAAAAEAAAD4WYAAAAAAAAAAAAAA +AAAADBkCAAYAAAABAAAA+FmAAAAAAAAAAAAAAAAAAGAZAgAGAAAAAQAAAPhZgAAAAAAAAAAAAAAA +AADgGwIACgAAAAEAAAD4WYAAAAAAAAAAAAAAAAAAAAAAALhZgAC4WYAAuCCgAGwgoAAAgAEA/3/8 +/wAAAAAAAAAA2FmAANhZgACkIKAAOCCgAAEAAAD8////AAAAAAAAAAD4WYAA+FmAAKggoAA8IKAA +EAAAAMf///8AAAAAAAAAABhagAAYWoAArCCgAHghoABAAQAAP/7//wAAAAAAAAAAOFqAADhagACw +IKAAfCGgAAAMAAD/8f//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfA8CABUAAAADAAAAuFmAAAAA +AABQAAAAAAAAAGwKgAC0qYAAGAAAAHSpgAAAAAAAAAAAAGwKgAC0qYAAGAAAAHSpgAAAAAAAAAAA +AAAAAABsCoAAtKmAABgAAAB0qYAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAfwAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA/wAA//8AAAEAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAxLAQD8SQEAAAAAAAAAAAAA +AAAAAAAAAORMAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAORMAQCwSwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxLAQD8SQEA +AAAAAMxJAQAAAAAA2EkBAORMAQCwSwEAAAAAAAAAAAAAAAAAiEsBAMxJAQC8SQEAAAAAAAxLAQD8 +SQEAeEoBACRKAQAAAAAA2EkBAORMAQCwSwEAzEkBALxJAQAQSwEAAAAAAMxJAQC8SQEABwAAAAAA +AAAGAAAAAgAAAAIAAAACAAAAAgAAAAYAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA +AAEAAAAGAAAABwAAAAcAAAAHAAAABwAAAAEAAAAGAAAAAQAAAAEAAAAAAAAAAQAAAAEAAAABAAAA +BwAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAC +AAAABwAAAAMAAAADAAAABwAAAAQAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMA +AAADAAAABwAAAAQAAAAEAAAABAAAAAQAAAAHAAAAAwAAAAQAAAAEAAAABAAAAAQAAAADAAAABAAA +AAQAAAAEAAAAAAAAAAABAgMEBAQEBAUGBwgICAgICQoLDA0AAG47aDtiO1w7bjpoOmI6XDpuOWg5 +YjlcOW44aDhiOFw4bjdoN2I3XDduKWgpYilcKW4oaChiKFwobidoJ2InXCduGWgZYhlcGW4YaBhi +GFwYbhdoF2IXXBduFmgWYhZcFm4VaBViFVwVbhRoFGIUXBRuE2gTYhNcE24SaBJiElwSbhFoEWIR +XBFuEGgQYhBcEG4CaAJiAlwCbgFoAWIBXAFuAGgAYgBcAFQAAABuO2g7YjtcO246aDpiOlw6bjlo +OWI5XDluK2grYitcK24qaCpiKlwqbiloKWIpXCluKGgoYihcKG4naCdiJ1wnbiZoJmImXCZuJWgl +YiVcJW4kaCRiJFwkbiNoI2IjXCNuImgiYiJcIm4haCFiIVwhbiBoIGIgXCBuEmgSYhJcEm4RaBFi +EVwRbhBoEGIQXBBXEFIQTRBJEG4BaAFiAVwBbgBoAGIAXABUAAAAAAAAAAAAAAAdAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwfQEACAAAAAMAAAC4WYAA2AuA +AFgMgADYDIAAWA2AAAoNERQKDREUGRkZGQoKAAAAAAAABgYGBgkJCQkABgAAAAUGBwgNDg8QFRYX +GBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMFJqaHCSampqa +mpOaboE/NQmLKwAAADIAAACPAIwAigBDAA8AIGg3AAAAEQA+OiARAAACJQAADC8AAAIvOTkACiU8 +ukdxjQAHFy1pNAAAAgAXAAAFEAogMEAAAAYGCgAFCg8AFw8XFQAAAABZXGRkMQAADBAUGCAIBAAA +PDg0MCwoJCAcGBQQDAgEAAsHAwA7NzMvKycjHxsXEw8LBwMxMTozNjowNgAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAAAAAAAB0AAAAAAAAAbwAAAFAAAAD2AAAAUAAA +APcAAACAAAAA+AAAAAUAAAAzAAAAcwAAADcAAAB0AAAAOwAAAAAAAAA0AAAAdAAAADgAAAB3AAAA +PAAAAAMAAAAxAAAABwAAADUAAAAHAAAAOQAAAAAAAAAyAAAAfwAAADYAAAB/AAAAOgAAAAAAAAAf +AAAAAAAAACAAAAAAAAAAIQAAAAAAAAAIAAAAAQAAAHEAAAARAAAA6gAAAKoAAADrAAAACgAAAGoA +AAAAAAAADQAAAHgAAAAOAAAAJwAAAA8AAAAgAAAAEAAAAAIAAADzAAAAAAAAAPQAAAAAAAAA9QAA +AAAAAAAAAAAAAQEBAQEBAQECAgICAgICAgMDAwMDAwMDAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAUAAADhAw4e4QAAAOEDDh7h +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOED +Dh7hAAAAFfZj9rD2/PZG95D32Pcf+GX4qfjt+C/5cPmw+e75K/pn+qL63PoU+0v7gfu2++r7HPxN +/H38q/zZ/AX9MP1Z/YL9qf3P/fT9F/45/lr+ev6Y/rb+0v7t/gb/Hv81/0v/YP9z/4X/lv+m/7T/ +wf/N/9j/4f/p//D/9v/6//3//////////f/6//b/8P/p/+H/2P/N/8H/tP+m/5b/hf9z/2D/S/81 +/x7/Bv/t/tL+tv6Y/nr+Wv45/hf+9P3P/an9gv1Z/TD9Bf3Z/Kv8ffxN/Bz86vu2+4H7S/sU+9z6 +ovpn+iv67vmw+XD5L/nt+Kn4Zfgf+Nj3kPdG9/z2sPZj9nC5g7qWu6q8vr3Svue//MARwifDPcRT +xWrGgMeXyK/Jxsrey/bMD84nz0DQWdFy0ozTptS/1drW9NcO2SnaRNtf3Hrdlt6x383g6eEF4yHk +PuVa5nfnk+iw6c3q6usH7STuQu9f8H3xmvK489X08/UR9y/4TPlq+oj7pvzE/eL+AAAeATwCWgN4 +BJYFtAbRB+8IDQorC0gMZg2DDqEPvhDcEfkSFhQzFVAWbReJGKYZwhrfG/scFx4zH08gaiGGIqEj +vCTXJfImDCgmKUEqWit0LI4tpy7AL9kw8TEKMyI0OjVRNmk3gDiWOa06wzvZPO89BD8ZQC5BQkJW +Q2pEfUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqqqqq +qqqqqqqqqq6qqqqqKP8AzKqqAACqqgDMqqoAAABAAMAAAAAAAFAA8ABAAPCqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqgAAAAAAAAAAAAAAAAAAAAD///8A////Af8CA////wQF/wn/BwoG +CAsAAQECAQICAwEBAQEBAQEBAgICAgICAgIDAwMDAwMDAwQEBAQEBAQEAQICAgICAgMDAwMDAwMD +AwMDAwMDBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAATDEAAEQzAADMLQAAzCwAAEwtAAAYMgAA +lCwAAEAyAADAMgAAOgECAdUA3wDaAKIAdQB/AIoFKgM5AagBigXKAtkASAEBAw8HChQ3bmoBGgHZ +AOgACgG6AHkAiADKAUoB4gD5AMoB6gCCAJkAdNFFF+iiiy4ABQcBAwQABQEFAAAABQYAAgQABQAF +AAABAgECAwQAAAUGBwgJCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAADA2AAAUNsAAKTWAAABAAAAAAAAAAEAAAACAAAAAwAAAAAAAAAEAAAA +AgAAAAUAAAAHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcH +BwcHBwcHBwcGBgYGBgUFBQUFBAQEBAQDAwMDAwICAgICAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAoADAALAAsACgAPAA0AEAAPACM +AGwAWABIAPQAsAB//wcPHz8BAzAAAAA2AAAADAAAABIAAAAYAAAAJAAAAAYAAAAJAAAABQAHAgME +BgZAA4AGwAkADYATABpAHYAggAYADYATABoAJwA0gDoAQcAJgBNAHQAngDoATsBXgGGZAzMH2Qpz +DqYV5hyAIBkkMwdzDqYV5hxZK8w5AEEzSNkKphWAIFkrAEGmVoBhWWyd2ImdTuzETjRIgzQndmIn +GqRBGhM7sRMRGIERD/zAD07sxE4ndmInGqRBGhM7sRMN0iANiZ3YCQiMwAgHfuAHNEiDNBqkQRoR +GIERDdIgDQiMwAgGaZAGsLLVBQVUQAUndmInEzuxEw3SIA2JndgJBmmQBsRO7AQERmAEAz/wA6qq +qqoapEEaEzuxEw/8wA8RGIERDdIgDQqogAoTO7ETD/zADw/8wA8N0iANC7RACwu0QAuJndgJDdIg +DQqogAoKqIAKCIzACAd4gAcHeIAHBmmQBg/8wA8N0iANC7RACw3SIA0LtEALiZ3YCQiMwAiJndgJ +CIzACAd+4AcHfuAHwSwpBwqogAoIjMAIB3iABwiMwAgHeIAHBmmQBrCy1QUGaZAGsLLVBQVUQAUF +VEAF1h3GBAEHDx8/f///ZuYAAAUGAQIDBAAAVABUAGwAYABcAFQAjAB4AA0PBQcJCwEDKAAoADQA +MAAsACwARAA8ACwALAA8ADQAMAAsAFQARABVVVUBS2gvAVVVVQXjOI4DqqqqAnEcxwGqqqoKx3Ec +BwAEAABkAAAAAAAAAA8APwABAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8A +AQAAAA8APwACAAAADwA/AAEAAAAiFgAAgAAAAwAAAVkAACQWAAEAAAADAAABWgAAJhYAAgAAAAQA +AAFaAAAoFgACAAAAAwAAAVsAACoWAAKAAAADAAABXAAALBcAAAAAAAQAAAFcAAAuFwAAgAAAAwAA +AV0AADAXAAEAAAADAAABXgAANBcAAgAAAAMAAAFfAAA2FwACgAAAAwAAAWAAADgYAAAAAAAEAAAB +YAAAPBgAAQAAAAMAAAFiAAA+GAACAAAABAAAAWIAAEAYAAIAAAADAAABYwAAZBsAAgAAAAMAAAFv +AAFmGwACgAAAAwAAAXAAAWgcAAAAAAAEAAABcAABbBwAAQAAAAMAAAFyAAFuHAACAAAABAAAAXIA +AXAcAAIAAAADAAABcwACdB0AAAAAAAQAAAF0AAJ2HQAAgAAAAwAAAXUAAngdAAEAAAADAAABdgAC +fB0AAgAAAAMAAAF3AAN+HQACgAAAAwAAAXgAA4AeAAAAAAAEAAABeAADhB4AAQAAAAMAAAF6AAOG +HgACAAAABAAAAXoABIgeAAIAAAADAAABewAEjB8AAAAAAAQAAAF8AASRHwABQAAAAwAAAX4ABJUf +AAMAAAAEAAABfwAFlx8AAsAAAAMAAAGAAAWZIAAAQAAAAwAAAYEABZ0gAAFAAAADAAABggAFnyAA +AcAAAAMAAAGDAAWhIAADAAAABAAAAYMABaUhAABAAAADAAABhQAFMJkBAAAAAAAwmQEAAAAAADCZ +AQAAAAAAMJkBAAAAAAAwmQEAAAAAADCZAQAAAAAAMJkBAAAAAAAwmQEAAAAAAAyTAQAYAAAA1JQB +ACAAAADsmgEAFAAAAOibAQAUAAAAlJgBAA4AAABglwEADgAAAGSYAQAUAAAAZJgBABQAAABAI0Al +ISEhIUBAQEBABQQEAQFAQEBABQVAQAwMQA0MDAEBAQVAQAUFAAQABEBAAARAQEAFQEBAQEAFQEBA +BQUFAQEBAUAFBQUBBQEBQAUFBUAFQAUFBQUFAAAAAAAAAABkAAAAAJABAAoAAACEzgEAPNIBADDQ +AQAAzAEAGNYBAHjYAQDo0wEAXNEBAEjVAQAEAAAAHBEAABwyAAAcMwAABAAAABwVAAAcAgAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAClxoT4me6N9g3/vdax3lSRUGAD +AqnOfVYZ52K15k2a7EWPnR9AiYf6Fe/rssmOC/vsQWez/V/qRb8j91OW5FubwnUc4a49akxabEF+ +AvVPg1xo9FE00Qj5k+Jzq1NiPyoMCFKVZUZenSgwoTcPCrUvCQ42JJsbPd8mzWlOzX+f6hsSnh10 +WC40LTay3O60+1v2pE12YbfOfXtSPt1xXpcT9aZouQAALMFgQB/jyHnttr7URo3ZZ0ty3pTUmOiw +SoVruyrF5U8W7cWG15pVZpQRz4oQ6QYEgf7woER4uiXjS/Oi/l3AgIoFrT+8IUhwBPHfY8F3da9j +QjAgGuUO/W2/TIEUGDUmL8PhvqI1zIg5LleT8lWC/Ed6rMjnuisyleagwJgZ0Z5/o2ZEflSrO4ML +yowpx9NrPCh5p+K8HRZ2rTvbVmROdB4U25IKDGxI5Lhdn26970OmxKg5pDE304vyMtVDi1lut9qM +AWSx0pzgSbTY+qwH8yXPr8qO9OlHGBDVb4jwb0pyXCQ48VfHc1GXI8t8oZzoIT7dltxhhg2FD5Dg +QnzEcarM2JAFBgH3Ehyjwl9q+a7QaZEXWJknOrknONkT67MrMyK70nCpiQenM7YtIjySFSDJSYf/ +qnhQeqWPA/hZgAkXGtplMdfGhLjQw4KwKXdaER7Le/yo1m06LAABAgQEAAAABAwMCAQMBARAAAAA +gAAAAAABAAAAAgAAQAAAAAAEAABAAAAAQAAAAADwYQAAAQECAQICAwAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAGQAAAAqAAAADgAAAAAAAQEAAAAAAAAAAAABAQAAAAACAAEAAgIDAwNIEwIAVBMC +AGATAgBsEwIAdBMCAHwTAgABAQABAgEBAQAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAA +AQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA/////wAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgA0AAAAgAACADQAAgA0AAAAg +AACADQAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAJgvAgAg +IIAPAABAAGkgAABpIEAAaSAAAGkgQAAgIIAPAADoAGkgAABpIEAAaSAAAGkgQAAgIIAPAAAw5mkg +AABpIEAAaSAAAEogAABKIQAASiIAAEojAABKJAAASiUAAEomAABKJwAASiAAEEohABBKIgAQSiMA +EEokABBKJQAQSiYAEEonABBKIAAgSiEAIEoiACBKIwAgSiQAIEolACBKJgAgSicAIEogADBKIQAw +CiSAP4EAAEBBLJwwQCycMEIkHDQKIoA/gAAgXwojADduCcAGSiYAcGkgQABKJgBwSiYAcEomAHBK +JgBwABYAcIAA4CZAeCAgQIcAAAAAAAAAAAAA/ByItvwcSLb8HAi2/BzItfwciLX8HEi1/BwItfwc +yLT8HIi0/BxItPwcCLT8HMiz/ByIs/wcSLPgfuB4BNw43TXw4HgE3DTdM/DgeATcMN0x8OB4BNws +3S/w4HgE3CjdLfDgeATcJN0r8OB4BNwg3Snw4HgE3BzdJ/DgeATcGN0l8OB4BNwU3SPw4HgE3BDd +IfDgeATcDN0f8OB4BNwI3Rzw4HgE3ATdGfA0FBowMBQZMCwUGDAoFBcwJBQWMCAUFTAcFBQwGBQT +MBQUEjAQFBEwDBQQMALHAcawJE0zsCQfM+B+4HjgeOB44HjgeOB4CiSA8AUgRADgIMEHRCT+gEEq +xACEAAIALyQC8UIhAQFCIAMB6CCiBAQRBAIEEQUCBBEGAgQRBwIEGwgBBBtIAQQbiAEEG8gBLAAl +AEQiPoE8ACIARCL8gEAhwQDgIMEHQCPDAKgggAEBEYQCARsKASAgwAcEEQQCBBEFAgQbCAHUB+H/ +BBtIAUQi/IAEEQQCyQfv/wQbCAFCIUEAQiBDAKgggAEBEYQCARsKASAgwAfPcaAArC8YgZq4GKEd +BaAQBdjgeM9xoACsLxiBs7i6uBihCQWgEGTYCiJAgADZ7gABAC8mAPBKJkAATgAGAE8AIACKJf8P +4HgKIkCAANnOAAEAbAAkAC8mAPBcAAUAKwg1CEomQAAIcQDYAiG+gOAgxQdCeQHgAiG+gOAgxQdC +eesH7/8B4C8tAQBAJUUAAiZ88QAAIAAAKEAB6CBiAy8gAIAvIUsAAiG+gMAghgHCIYYA4H4RACAA +SiAAEEogQBAOIkIALyALEs4gRYCKJf8PCAAFAC8tAQBAJUUAAiZ88QAAIAAAKEABSiZAAOggIgMv +IACALyFLAAIhvoDAIIYBwiGGAEomAABCIP6QziCCAUQgfpDOIYIB4H4JAAAA4HgKJgDwiiC/D8og +ZADgfy8gAwDgf4og/w/8HIix/BxIsfwcCLHhw+HC4cHhwAfAHBzAMeHA4H8BwPHAFg3P/wh2WnIB +iUCJELgYugd6AokIuEd4Q4kHegCG4oYHIIcARYkEiRC6GLhHeEaJCLpHeEeJB3oBhqOGByCIAAiJ +SYkYuBC6B3oKiQi4B3oLiUd4TYkHfwyJELoYuEd4TokIui+JR3gneAd9SiNAIV7wQgygBQDZCHfq +cDoMoAUB2Qd/6HAuDKAFAtkHfwlwJgygBQPZIIbneAchBwBBKwAGEgygBQDZCHMpcAoMoAUB2Qd7 +SXD+C6AFAtkHe2lw9gugBQPZIYZneAchCABBLgAm4gugBQDZCHMKcNoLoAUB2Qd7KnDOC6AFAtkH +e4hwxgugBQPZ4oZneAd/QS0AFrYLoAUA2QhzinCqC6AFAdkHe8hwogugBQLZB3uqcJYLoAUD2aOG +Z3gHfUEvAAaGC6AFANkIc0EtABQPeHoLoAUB2Qd7QS8AEg94agugBQLZB3svIAcCXgugBQPZJIZn +eAchBQBBKAAWTgugBQDZCHNBLwAED3g+C6AFAdkHe0EtABIPeDILoAUC2Qd773gmC6AFA9lneGWG +B3tBLwAWFgugBQDZmHBBKAAUD3gKC6AFAdkHJAQAQS8AAg94+gqgBQLZByQEAK947gqgBQPZJoYH +IAABByEWAEEtABbaCqAFANkIdUEvABQPeMoKoAUB2Qd9QSgAEg94vgqgBQLZB30vIMcBsgqgBQPZ +p3inhkIjU6BBLQkEQSsQBAd9IOZBLRcUQS4AIi8gxxBBLQoSLyOHFUEtAQIvJEcDQS4UJEErAgIv +JUchLyfHJS8nBwAvIUcSLyKHEi8gByQvIUcgLyQHJS8mhwBBLQAGBPVKCqAFBNkEII8PAP8AAOpw +OgqgBQTZ/9kQuSR4B3/ocCoKoAUE2f/ZCLkkeAd/CXAaCqAFBNkPeCCG53gneEEoAQYAGkIgQSgB +BAEaQiBBKAECAxoCIAIaQiBBKwAG6gmgBQTZBCCDDwD/AAApcNoJoAUE2f/ZELkkeAd7SXDKCaAF +BNn/2Qi5JHgHe2lwugmgBQTZD3ghhmd4J3hBKAEGBBpCIEEoAQQFGkIgQSgBAgcaAiAGGkIgQS4A +Jo4JoAUE2QQggw8A/wAACnB+CaAFBNn/2RC5JHgHeypwbgmgBQTZ/9kIuSR4B3uIcF4JoAUE2Q94 +IoZneCd4QSgBBggaQiBBKAEECRpCIEEoAQILGgIgChpCIEEtABYuCaAFBNkEIIMPAP8AAIpwHgmg +BQTZ/9kQuSR4B3vIcA4JoAUE2f/ZCLkkeAd7qnD+CKAFBNkPeCOGZ3gneEEoAQYMGkIgQSgBBA0a +QiBBKAECDhpCIIEB7/8PGgIg4HjxwE4Jz/+eCSAACHUA2SjYFSVCEBUlAxDAg+CCwKLgo8GD4YLB +ouGjwoPigsKi4qPDg+OCBOFkuMOi2QkigOOjCdsEhRDlOLjCCKAFBNkPeH4IoAUA2Qh2AIUwuA94 +rgigBQTZD3hqCKAFAdkHfgCFKLgPeJYIoAUE2Q94UgigBQLZB34AjYYIoAUE2Q94QgigBQPZx3gA +pQGFOLhuCKAFBNkPeCoIoAUA2Qh2AYUwuA94WgigBQTZD3gWCKAFAdkHfgGFKLgPeEIIoAUE2Q94 +/g9gBQLZB34EjTIIoAUE2Q947g9gBQPZx3gBpQKFOLgaCKAFBNkPeNYPYAUA2Qh2AoUwuA94Bgig +BQTZD3jCD2AFAdkHfgKFKLgPeO4PYAUE2Q94qg9gBQLZB34Ijd4PYAUE2Q94mg9gBQPZx3gCpQOF +OLjGD2AFBNkPeIIPYAUA2Qh2A4UwuA94sg9gBQTZD3huD2AFAdkHfgOFKLgPeJoPYAUE2Q94Vg9g +BQLZB34MjYoPYAUE2Q94Rg9gBQPZYbuA48d4rgbt/wOlGQDP//HArg+P/2GJQIkQuxi6Z3piiQi7 +Z3pjiQDfZ3pAoESJZYkYuhC7R3tGiQi6R3tHiWd6QaBIiWmJGLoQu0d7SokIukd7S4lnekKgbYlM +iRC7GLpnem6JCLsviWd6Ct0nekOgw4AIc0EuABQPeP4OYAUE2SCDBCCADwD/AAAHIQQAQS4AEg94 +5g5gBQTZBCCAD/8AAAAHJAQAz3jSDmAFBNkEIIAPAAAA/wckBABBLgAWug5gBQTZD3jPcYAA2F7w +IcEDByAAASd4IYMEoyd4IoMFoyd4I4MGo2G9J3gHo0AjAASDDXWQAectB4//4cUIdRHw4HjgeOB4 +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HhhvYwl/5/t9eB/wcXgePHA4cXPcIAAnChNgM91gAAw +mSCFt7q4ugQhgQ8DAAAAB7lFeS2gtgpgEADYAIXPcYAADNRRIICCTInPcIEACBgyajZ5x3GBAMgU +YIFWeEGABfKVu2Chq7oE8LW7YKGLukGgC42juKEGr/8LraLB8cAeDo//RcHPdYAAnCgnhRUIQQAw +lRQUDjEJDkEQWR2CENAVARYdCEEAz3GAAKgrPJEUFA0xDQ1BEM9xgAAALFmpi+rPdYAAIArBjYDm +ANnKIEEAJPIhrQsKkQMB2B7wQSgNAgd9QSgBBKd5z3eAACAKoI9TJUURHw0yBMa5CiHAD+tyz3AA +AM0bn9vlBiABiiSDDw8NnhEA2Azc7wWP/892gQCIFxYmTRGnjaCvyXUWJU0RAKUUFAAxRq3HcYEA +SBQCtQCJB60AGUIBABtCAcfx8cBKDY//CMjPcqAAyB8OGhiACcgPGhiACsgQGhiACxIBNgLIJHgR +GhiADMjPcYAAsDstGhiAAIEB4AChw7hXCFEDC8h/2Qq5JHgvKAEATiCCBwDYDyCAAAQhAYBCIo0C +GfILI0DAF/TPcKAAiCDwIFADz3aAAIw4AIbPd4AAkDgNDQEQAIcScLANAQagpgAfABQdBY//4HjP +cYAAnF7gfwhh4HjxwBIKQAXPcYAAbCLwIQAAQHiA2c9woADQGzCg0cDgfoDhyiRNcOggbQLPcaAA +UAwlgQEYUgDgfvHAbgyP/89wgACcKAOAGIilwUogACAdCBEBCiHAD+tyiiCMDWTbCiQABJkFIAG4 +c891gACcNs9wgACAQa4IoA4kHQAUz3CAAJxBogiADs9wgABEQpYIgA7PcIAAYEKOCIAOz3eAAGCg +bY+A457yTI9QczgBDADPcIAAECcEgCCAz3CAAICWQKBhoCKgz3CBADAdCJApCwIAz3CBADAdz3GA +AHjRaLAB3s9wgABg0cyhI4ANCeUAARgCBGOgEI+A4MogYgADpRGPE+iT6s9wgACcKAOACYAbCJ4A +vghgAgfYAdgBpc9woAAsIBCAAKXPcIAAFDMAgB0IUQDPcIEAMB3PcQAAECcKDa//BYAQeAPwANjP +cYAACNEHsQOFDBkEBGMIUQAAgYLgzCDigAP0AdgAoUwVgBBPCFEAz3CgACwg0IDPcAEAQBRAwAHY +QcAIHAA0EdhDwADYjLhEwADYENkE2ghzmHC4cAAmhx8AAAB9OgugBNhwSxWAEAHgD3hLHQIQDI+F +6AGFgOAMDMEEz3CAAPBBVg9ADgHZz3CAAFQfIKD2DyACBtgpA6//pcDgeKLB8cC+Cq//mHJFwUEo +AQIHeUEoAgQnesa6z3WBAEgUSWVdZScJ3wEUFA4xz3OBAIgXaHI2euCCCwjBA+KSEw+AEyeKp2rv +Cd6BANgn8MaKhu6A389wgAAgCuGoz3eAAPAoBY8LDgEQgNgFrwnwz3eAAAAsGY8LDgEQgNgZr8aK +NnsAHIADB4qHuQCtz3CAACAKQIggqAHYR6sM3I8Cj/+hwfHAAxICN9dyAAAAQAHawiKKABe6x3IA +DgAAg7rsc0Cj7HIAoooMIAQocNHA4H+hwOB4peAt8hH2YwiQCITgJfIH9i/oZwjRAOB/ANg3CFAB +WwgRCOB/C9iMIEOHG/LM4BvyreAR8gf2NwiQCT8IEQrgfwrYMwgQDDMIUQ/gfwPY4H8B2OB/Atjg +fwTY4H8F2OB/BtjgfwfY4H8I2OB/CdjgfwzY4H8N2A7Y4H7gePHA4cXPdYAANDGpcEAlgRvWCOAN +LtoB2NEBr/9hHQIQ8cBKCY//Hwi0AAh1CiHAD+ty/diLuHPbSiQAAIUCIAG4c893gAA0MTeHACWQ +H4AAiDEPDUEQDBCAIIDgjPJCDWAHBdg6cEQtvhsAJ0AeQJAhkADeCLpFec9ypAC4PZsaWAAikAwY +giPKGlgAI5C3p8saWAAkkMQaWAAlkMYaWAAmkMcaWAAnkMIaWAAokMMaWAApkMUaWAAKkKMaGADP +cIAAsC8ggGB5yXA3CBADz3CAALAvIIBgeclwJwgQBM9wgACwLyCAYHnJcBcIUATPcIAAsC8ggGB5 +yXAJCJEEAN3PcIAAnCgDgAiAz3GkALRFIQgeAEQtvhsAJ0AebJBLkHt7ZXpTGZiADZBUGRiABvBT +GZiDVBmYg0Qtvhsndw6XVhkYgA+XWBkYgBCXVRkYgBGXVxkYgBKXWhkYgBOXXBkYgBSXWRkYgBWX +WxkYgD4JYAcqcFUAj/+G4PHAANgP9M9wgAB8oGYL7/8G2c9xgADwowCBgrgAoQHY0cDgfuB48cCD +4OHFANgY9M91gABgoEAlABU2C+//A9nPcIAAnCgDgBSQNY0TCQAAz3GAAIDTH4GNuB+hAdgRAI// +8cCB4OHFANgJ9M9wgAB3oAHd/grv/6lxqXD1B0//4HjxwJbg4cUA2Iz3z3WAADCZqXDeCu//BNkL +jYO4C60B2M0HT//xwJrg4cUA2Iz3z3WAADCZBG26Cu//BNkLjYK4C60B2KkHT//xwDIPT/+jwc92 +gACYtyaOQCYNEgK5NHmO4D1lANgl9Itwhgrv/wzZAhSAMJzoENnPcIAAXAogsASOJG0ArSDAAa0D +FIAwAq2BwA4PoA0C2kaOAeJPeieORiLAAMG6Rq4leAeuAdg5B2//o8DxwKTBkOAA2cogQgAT9Itw +Kgrv/xDZABQAMYTgzCBigQj0z3CAAIDTH4AJCF4FTHAB2KTA0cDgfoHgANnKIEIAFPTPcKAAUAwl +gM9zgACggwGTL3kTCQAAz3KAAFwKAJIhs4G4ALIB2OB+4HjxwE4OT/+G4ADYKfTPcIAAECcEgM93 +gACYt1YnERIAgFIXDREPp4PlyiUmEL5l1H4AIZAjCnCaCe//BtkidgGWCugAEIAgCOjPcYAAXAoA +kYa4ALFSH0QTAdhVBk//4HiA4ADYCPTPcYAAXAoAkYK4ALEB2OB+4HjxwNoNT/8Id89wgACcKAOA +GIgacY0IEAGE5wDdhgAlAMogRQPPdoAAYKBAJgATKgnv/wTZLo6wrlMhAAARrkEowCCguV0IZAAC +IEIAY79VCsUDD+rPcaAA0A8QEQCGYbpYYBAZGIAlEQCGD3gC8A+OANlTIIIgDyGBACR4LyYH8M9x +nwC4/xCuGIHPIOIH0CDhBxihGIGeuBihGIG+uBihAdidBU//4HjhxPwcyL78HEi+4cDhweHC4cP8 +HAix/BxIsfwciLH8HMix/BwIsvwcSLL8HIiy/BzIsvwcCL9qJIAQ4cRqJMAQ4cTxwM9woADQGxSA +z3GAABAJBCCAj89RBOEAoRHyLykBAA8IngUvKYEPQAAAAM9wgAAUL/AgQABAeHIPj//RwMHEayTA +EMHEaySAEMHEn3QEFAs0BBQKNAQUCTQEFAg0BBQHNAQUBjQEFAU0BBQENMHDwcLBwcHAwcRFLH4Q +CiZAfsHEaySAFMHEICBAh+B4jCBcggHY4H/CIAsA8cBeDG//SiRAAM91gACcKBUlAxAAg0AlDhXR +cMIkAgHwJQ0RyBUFFkQlvoEJ8gohwA/rco7YjbhxBeAAdNvIEA0GpXnIGFgAoIMG2UZ5yBUAFiR4 +yB0YEACDyBAABoYgf45IDgEQZQRP/+B48cDuC2//gNoIdyh2BIFAJg0WI7hTIEEBOGUBGJIATiHC +Dx0KNQIA2Z4NAAHJcGoIIACpcalwANk42gPwaLqKDQABBIYUpgWGFabJcEoIIACpcclw6XEOC6AN +ENrJcADZZg0gAQTa8QNP/+B4z3FFZwEjIKDPcc3viashoM9xupj+3CKgz3EyEHZUI6AA2SSg4H8l +oPHAWgtv/5hwYIAMEAYAQoChgOKBByaAAKR4ByCOAQCBx3cgJNtwAiCAD5UoiFvYYBtjF2s5u2V4 +ByJDA7hgBHsHI44AYYECI4MPOBeqSH5mwHZALgMTNL7FewclDhAbY2R+p37+ZtpiQCpOBOOBL7rF +egcjDgB6YkR+B34CJ48fQj4SMf5m3WVALY4VKr3kgcV9ByOOAF1lpH5nfgInjx+DClHw/mbYYNdo +5YE5uMV4ByJOA7hgBH5Hfsd3h0cqxv5m22NAKw4D5oE0u8V7ByUOEBtjZH6nfgInjx/PV+25/mba +YkAqTgTngS+6xXoHIw4AemJEfgd+AiePH7kC/2r+Zt1lQC2OFSq96IHFfQcjjgBdZaR+Z37Hd4Bp +2Jj+Zthg12jpgTm4xXgHIk4DuGAEfkd+AiePH7t0UQj+ZttjQCsOAzS76oHFewclDhAbY2R+p34C +J48fAABPpP5m2mJAKk4EL7rrgcV6ByMOAHpiRH4HfgInjx+jdkIo/mbdZUAtjhUqveyBpX4HI40A +XmbEfWd9x3eQayIR/WW4YLdoObjtgaV4ByKNA9hgBH1HfQInjx9nAm2O/WW7Y0ArDQM0u+6BpXsH +Jg0QG2Nkfcd9AiePH4ZZcrz9ZbpiQCpNBC+6RX19ZQcjAgCkejwRBQAHIg8AACWCD7RJIQj6Ytpi +QCqOBSq6xXrhgbpiByWOEGR+p34CJ48f4Qme2v5m2GDVaDu4BX7mgV5mByKAA6R4R3gCJ48fvz/A +TPhgeGBAKEMCN7gFe+uB22MHI4ADRHjHeMd3XiZRWvhguGBAKI0DMrgFfeCBfWUHI0ADxHhneAIn +jx9JFlY4+GBYYEAoAgUsuEV45YG4YAclAhBkeqd6AiePH9Apo+/6Ytpi1Wo7usV66oEaYgcgjgCk +fgd+x3dEAlMU/mbbY0ArTgI3u2V+XmYHJoMQBHsHI48AAiWDD14nfxn7Y31lQC2DEzK9ZX3kgd1l +ByZDE0R7x3sCJ48fLBg4BPtjeGBAKAMFLLgFe+mBu2MHJcAQxHineMd34SHmzfhgWGBVaDu4BXp6 +YgcjgACkeDgRBwAHIM8AAieAD8g8Kvj4YNhgQChOAje4xXjjgVhgByCOAGR+R34CJ48fKgt58v5m +3WVALY4T6IEyvaV+HmYHII0DRH0Hfcd3WkXtFP1lu2NAKw0FLLtlfe2B3WUHJkMTBHvHewInjx8c +VvsW+2N6YnVq4oE7umV6umIHJYMQxHunewInjx8QAwhc+2N4YEAoQwI3uAV754FbYwcjgACkeEd4 +x3dvZ9kC+GDYYEAojgMyuAV+7IF+ZgcjgANEeGd4AiePH9VydrP4YLhgQCgNBSy45YGleNhgByYN +EGd9AiePHwUAvsb9ZbpitGrogTy6pXoaYgcgjQDHfQInjx+OeH8J/WW7Y0ArzQLrgTW7ZX1dZQcl +gxAHe8d3nW0iYftj22NAKw4EMLvFe7tjByXPEEd/AieODxoC9Mf+ZthgQCjOBSm44YHFeHhgByMO +AKd+AiePH0FbvBXfZ/pi1GrkgTy6RX4eZgcgggNnesd33kupz/piumJAKs0C54E1ukV93WUHJYIT +B3oCJ48fRAmgtF9n+2NAKwIE6oEwu0V7u2MHJcIQx3oCJ48fQEGQQ19n+GBAKMIFKbjtgQV6emIH +I4AAp3jHd5soxn74YNhg1Gg8uOCBBX5eZgcigANneAInjx9eFQbY+GC4YEAozQI1uOOBBX3dZQcl +gBNHeAInjx8QK3vP+GB4YEAoAwTmgTC4ZXi4YAclAxDHe8d3iAQFHftjemJAKsMF6YEpukV7G2MH +IMIAp3oCJ48fKybHL/pi2mLUauyBPLrFenpiByOOAAd+AiePHyQZG2b+Zt1lQC3OEjW9xX1dZQcl +jxBnfwAljg+iH/h8/mbYYEAoDgQwuOKBBX6+ZgclgBNHeAInjx9TO5up+GB4YEAowwXggSm4ZXiy +e9hgBXvHewInjx/WC7zd+2N6YnZq54E6ukV7G2PSemV6B3rHdypDl//6YrpiQCqNAu6BNrpFfRJ6 +fWWlemd6AiePH2tUWdz6YtpiQCrOA+WBMbrFenJ+umJFfqd+AiePH2wDx1/+ZthgQChOBSu47IHF +eFhgsn4Ffkd+x3dbZcNZ/mbbY9ZrOrvjgWV+UnseZsV7B3sCJ48f83BuM/tju2NAK40C6oE2u2V9 +EnvdZaV7x3sCJ48fEACDC/tjemJAKsMD4YExumV60nu6YkV7p3sCJ48fe3ovon9n+GBAKEMFK7jo +gQV7snhbY2V4R3jHd6hvT374YNhg1mg6uAV+Unh+ZsV4Z3gCJY8P0wEgGR9n/WVALYAS5oE2vaV4 +2GByfQV9x30CJ48f/lzsvL9n+mJAKs0D7YExuqV60n0aYkV9B33HdwhOoRG/Z/tj5IFAK00FK7tl +fRJ7XWWle0d7AiePH6wIfoH7Y35m64F2bjq+xXtSfrtjZX6nfgInjx/FQssN32f4YEAojgI2uOKB +BX6yeCmBfmbFeGd4x3fXKrvSH2f6YkAqwAMxugV6cnjaYkV4AiGBD3kUbyzHeBlhuWFAKUAFK7kF +eQAUDQBZYbtjABzAAAQUAwB5YQQcQAAIFAEAWWEIHEAAACaBAw0EL/8MHEAA4HjxwJILD/8Idkh1 +RIAodxYiQQMkoAsJpQAFgAHgBaZBLUEXOGBBKsEAUyFBgQWmQCYQFh/yQNwOIRED6XA9DWQUAnHO +CmANKnLJcPoPr/8KcSJ3AiVNFA3wtgpgDUDayXDiD6//QCYBFkDngiUBEMDl6XBAJgEWcveWCmAN +qXJ1Aw//4HjxwM9wgAAELwCAG+jPcIAAlC8AgJnoTgkADYnoC8gFIIAPAAAAPAsaGDA+CQANiegL +yAUggA8AAADUCxoYMAvIkLgLGhgwvguABdHA4H7gePHAxgov/2d6z3WAAGAKoIUVJU0RwIVEeWd5 +QyjABkMuDxIEJ48fAP8A/0MuDhYEJo4f/wD/AOV+wKXZYcdxglqZee0CL/84YPHAfgov/5hwQCVN +A892gABgCsCGw73wJk8TQCUNAsO98CZNE+d9QCWPAMO/8CbPE1MlwAAVfgCG531nekR5p3hDKMAH +AKZneRlhx3GCWpl5QyzABpECL/84YOB48cAiCi//mHBAJU0Dz3aAAGAKwIbDvUAlDwLDv/AmzxPw +Jk0T531AJY8Aw7/wJs8TUyXAABV+AIbnfUd5Z3kHfUMtwBcAphlhx3HZbqHrQyzABjkCL/84YPHA +ygkv/5hwQCVNA892gABgCsCGw71AJQ8Cw7/wJk0T8CbPE1MlwACnf0AljQDDvfAmTRMVfgCG532n +eAUiTQBEeaR7QyjAB2V5GWEApgIhgQ/kcCRDQyzABtkBL/84YPHAagkv/5hwQCVNA892gABgCsCG +w71AJQ8Cw7/wJs8T8CZNE+d9QCWPAMO/8CbPE1MlwAAVfgCG531HeWd5B31DLcAXAKYZYQIhgQ+d +NSo+QyzABn0BL/84YOB44cUB289ygACMCH6y4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeAa4RSDNAM9woADsJ6agCoAA2wCxfrLg +f8HF4HjxwJILgAKGDoAPOgyAD4DZz3CgANAbMKDRwOB+8cB+CA//GnAB3wAQEgET8Fp1EfAVIMAj +oJACEBEBAefXdQAA+//wf3T2GQqALwAA///PcAAA+//dCIGEnQAP/892gAAIJwCGAeAAphUIUQAB +2c9woADIHDGgzg6gDyhwBr2BvUApACSleM9xoADsJwahAIZCIECAAKbd9c9xoADIHADYEaHX8fHA +z3CAAPAvAICB4Mohwg/KIsIHyiCCDwAArxPKI4IPAADzAcokIgAoAaIAyiUCARoIAADRwOB+8cBm +DQAP8grADNHA4H7gePHAng/P/s9wgACcKAOAz3MPAAD8KIDPcIAA3LrAuTZ4RIAggAq6ZHrJuSV6 +z3GnABRITaFFgAGACrrJuGR6RXgOoc9xgABw8A6JhiD/AVtoz3CAAHSTTKhPiTCJQCATA4Yi/wFD +uoYh/wFNqEO5lg2gBi6o2nDPcIAACCcAgAHgz3GAAAgnAKEVCFEAAdnPcKAAyBwxoMINoA8ocM9x +CACHEM9woADsJyagA9gA2TIjVSA6cY0NMyJacEokACAa8EAlgQEweQa5gbkQvyV/z3GgAOwn5qFA +JoEBMHkGuYG5ELgleM9xoADsJwahQCRUIM9wgAC4LyCAYHkG2O8MBSDtDQ6lqnCuDaAEinEacKpw +2gugBIpxmHBAKEAhEHgQuIG4h7iMuM9xoADsJwahTQwQIC0MUSCKJcQGiiaECCLwCiHAD+tyz3AA +ALATiiPFDQokQAW1B2AASiUAAAohwA/rcs9wAACuKIojRgZKJAAAmQdgAAolAAWKJYINiiZCDwDf +BNufc+lwqCAADGG7QC6CIUAsAQFZYXV5ACNNAcdxgAAYu0KRsH0GvYG9XHoQukV9z3KgAOwnpqJC +kcC6eHrlelB/Q5EAI40BsH0GvVx6gb0QuqV6z3agAOwnRqYjkcC5eHkleBB4bPFCIkAggOC+Bu3/ +QCFBIM9xCACGEM9woADsJyagz3CAAAgnAIDPcYAACCdCIECAAKEH9M9xoADIHADYEaHFBc/+4Hjx +wADYjbiqCOALBhoYMAzMhiD/igjyz3CAAIQ4AIiA4HgPwgPRwOB+8cDPcQMAQA3PcKAAqCAtoM9x +oACsLxmB8LgZgQvyBCCADwgAAADXcAgAAAAB2MB4BvCGIH8PguAB2MB4z3KAAMwKIIJhaYzoz3CA +ABQJAYiG6GCiEgvgBUjYA/Bgos9ygACIPwaCA4AggMdxAACIE94J4A1IcNHA4H7gePHA3gzP/s9x +gAAsSCGBo8FCwc9xgACcKBUhEAAAEAAgwBAOBi8ogQNOII0Hrw4QEBJtFngAIJIPgQDIFAYSgCDP +cYEAiBcWeQCBIpGO5QgcRDDKIGEABvKLctIJb/8CwTboANjPcYAA7AlAgQ8gQAMvIQogBCGAoACh +B/SA4tAKIgfKICIIr3jqDuADENkA3wQaxCOKIQgAABpAIKlw6XG2DSAGD9oAEAIgwBIABgQgQATA +GhgAz3CBAAgYtnjgoOGgz3CBACgUtHjgsBAmTpMvKIEDTiCNB6z1YQTv/qPA8cDhxQh1BPB6CMAN +2gjgDalw/OhtBM/+o8FAwEHBBRSBMADYgeFCwg3yguEH8oPhDfQhwQDYDyBAAAMUgTAPIEAAAhSB +MA8gQAAGFIEwIQlQABMJkAAjCdEAIcED4Q8gQAADFIEwA+EPIEAAAhSBMAPhDyBAAAkUgTAhCVEA +AhSBMAq5TyECBAMUgTAMuSV6IcEOuUV5JXggwRUJUQAHFIEwIsIGuQi6RXkleOB/o8CjweHFQsEJ +FIEwQ8JBwBkJMwEA2BEJUgAKFIEwCQlSAAcJEgEB2AcUgjAGFIMwEQuAACLBMHPMIkKAA/QB2CHF +IQ1REAoUgTAjwxkJwwALFIIwUHHMI6qAhPaA4sogaQAbCFEAiiHJD89wgACcCSCggeX/2cohIgAh +oMHF4H+jwPHAzgrP/r7BOnFacoh2CiBAIeh1l8fpcF4JoADQ2QPYYcAFHII0CwoRIAndPvAlClAg +UwqQIAohwA/rcs9wAACxDcvbCiSABOEDYABKJQAAlBQAMQYcgjNAKIEhCxxCMwccAjBIuGLAQCmA +IIG4JXgQeQkcAjBIuQocQjBIvWPF1fGcFIAwQCkBIwu4BXkweEi4BxwCMJgUADEGHEIwBt1iwEi4 +CRwCMHYUgTCIxslwuWEweWYJoAAA2kTHRcaBwEbAHBxEM14LoACEwF0C7/6+wOB48cDhxaPBAN1A +xUHCQsMC2qlzmHW4ddh1Fg/v//h1YQLv/qPA8cDiCe/+QCEDBaLBCHcodUokAHIA2agggASE4W8g +CwDwIwIAUyFOAE4mwBADuBl6ACRAMECoAeHPdoAAfEapcMlxBPCpcCJubglgAAHaBYWGIPgBjCAH +gPb1i3apcMlxVglgAAjaSiQAdQDYqCDAA0EogQDwJUEQUyBDAE4jwgADull5HGcgrAHgqXAA2S4L +oAAE2slwANkiC6AACNqtAe/+osDPcUVnASMgoM9xze+JqyGgz3G6mP7cIqDPcTIQdlQjoM9x0sPw +4SSgANkmoOB/JaDxwA4J7/4ZcM9wgABgCiCgABAOEAQQDxAIEAcQDBAGEMlwEBAEEOlx6HLIcx4O +r/9KJQAAACANAUMviRCpcMlxKXLocwokgAECDq//SiVAAMBw2HBDLooQqXFJcilzCiTAAeoNr/9K +JYAAACDOAUMthxDJcMhx6HJJcwokQALODa//SiXAAAAgTwJDLokA6XDJcSly6HMKJIACsg2v/0ol +AAFBcNhwQy6KEOlxSXIpcwokwAGWDa//SiVAAQAgzQFDL4cQqXDIcehySXMKJEACeg2v/0olgAEA +IE4CQy6JAMlwqXEpcuhzCiSAAl4Nr/9KJcABQXDYcEMtihDJcUlyKXMKJMABRg2v/0olAAIAIM8B +Qy6HEOlwyHHocklzCiRAAioNr/9KJUACACBNAkMuiQCpcOlxKXLocwokgAIODa//SiWAAkFw2HBD +L4oQqXFJcilzCiTAAfIMr/9KJcACACDOAUMthxDJcMhx6HJJcwokQALWDK//SiUAAwAgTQJDLokA +qXDJcSly6HMKJIACugyv/0olQANBcNhwQy6KEKlxSXIpcwokwAGiDK//SiWAAwAgzwFDLYcQ6XDI +cehySXMKJEAChgyv/0olwAMAIE0CQy6JAKlw6XEpcuhzCiSAArIMr/9KJQAEQXDYcEMvihCpcUly +KXMKJMABlgyv/0olQAQAIM4BQy2HEMlwyHHocklzCiRAAnoMr/9KJYAEACBNAkMuiQCpcMlxKXLo +cwokgAJeDK//SiXABEFw2HBDLooQqXFJcilzCiTAAaIMr/9KJQAFACDPAUMthxDpcMhx6HJJcwok +QAKGDK//SiVABQAgTQJDLokAqXDpcSly6HMKJIACagyv/0olgAVBcNhwQy+KEKlxSXIpcwokwAFO +DK//SiXABQAgzgFDLYcQyXDIcehySXMKJEACMgyv/0olAAYAIE0CQy6JAKlwyXEpcuhzCiSAAhYM +r/9KJUAGQXDYcEMuihCpcUlyKXMKJMAB/guv/0olgAYAIM8BQy2HEOlwyHHocklzCiRAAuILr/9K +JcAGACBNAkMuiQCpcOlxKXLocwokgALGC6//SiUAB0Fw2HBDL4oQqXFJcilzCiTAAaoLr/9KJUAH +ACDOAUMthxDJcMhx6HJJcwokQAKOC6//SiWABwAgTQJDLokAqXDJcSly6HMKJIACcguv/0olwAdB +cNhwQy6KEKlxSXIpcwokwAFaC6//SiUACAAgzwFDLYcQ6XDIcehySXMKJEACPguv/0olQAgAIE0C +Qy6JAKlw6XEpcuhzCiSAAiILr/9KJYAIQXDYcEMvihCpcUlyKXMKJMABBguv/0olwAgAIM4BQy2H +EMlwyHHocklzCiRAAuoKr/9KJQAJACBNAkMuiQCpcMlxKXLocwokgALOCq//SiVACUFw2HBDLooQ +qXFJcilzCiTAAbYKr/9KJYAJACDPAUMthxDpcMhx6HJJcwokQAKaCq//SiXACQAgTQJDLokAqXDp +cSly6HMKJIAC1gqv/0olAApBcNhwQy+KEKlxSXIpcwokwAG6Cq//SiVACgAgzgFDLYcQyXDIcehy +SXMKJEACngqv/0olgAoAIE0CQy6JAKlwyXEpcuhzCiSAAoIKr/9KJcAKQXDYcEMuihCpcUlyKXMK +JMABagqv/0olAAsAIM8BQy2HEOlwyHHocklzCiRAAk4Kr/9KJUALACBNAkMuiQCpcOlxKXLocwok +gAIyCq//SiWAC0Fw2HBDL4oQqXFJcilzCiTAARYKr/9KJcALACDOAUMthxDJcMhx6HJJcwokQAL6 +Ca//SiUADAAgTQJDLokAqXDJcSly6HMKJIAC3gmv/0olQAxBcNhwQy6KEKlxSXIpcwokwAHGCa// +SiWADAAgzwFDLYcQ6XDIcehySXMKJEACqgmv/0olwAwAIE0CQy6JAKlw6XEpcuhzCiSAAo4Jr/9K +JQANQXDYcEMvihCpcUlyKXMKJMABcgmv/0olQA0AIM4BQy2HEMlwyHHocklzCiRAAlYJr/9KJYAN +ACBNAkMuiQCpcMlxKXLocwokgAI6Ca//SiXADUFw2HBDLooQqXFJcilzCiTAASIJr/9KJQAOACDP +AUMthxDpcMhx6HJJcwokQAIGCa//SiVADgAgTQJDLokAqXDpcSly6HMKJIAC6giv/0olgA5BcNhw +Qy+KEKlxSXIpcwokwAHOCK//SiXADgAgzgFDLYcQyXDIcehySXMKJEACEgmv/0olAA8AIE0CQy6J +AKlwyXEpcuhzCiSAAvYIr/9KJUAPQXDYcEMuihCpcUlyKXMKJMAB3giv/0olgA8AIM8BQy2HEOlw +yHHocklzCiRAAsIIr/9KJcAPACBNAkMuiQCpcOlxKXLocwokgAKmCK//iiUBAEFw2HBDL4oQqXFJ +cilzCiTAAYoIr/+KJUEAACDOAUMthxDJcMhx6HJJcwokQAJuCK//iiWBAAAgTQJDLokAqXDJcSly +6HMKJIACUgiv/4olwQBBcNhwQy6KEKlxSXIpcwokwAE6CK//iiUBAQAgzwFDLYcQ6XDIcehySXMK +JEACHgiv/4olQQEAIE0CQy6JAKlw6XEpcuhzCiSAAgIIr/+KJYEBQXDYcEMvihCpcUlyKXMKJMAB +5g9v/4olwQEAIM4BQy2HEMlwyHHocklzCiRAAsoPb/+KJQECACBNAkMuiQCpcMlxKXLocwokgAKu +D2//iiVBAkFw2HBDLooQqXFJcilzCiTAAZYPb/+KJYECACDPAUMtixDpcMhxaXJJcwokQAJ6D2// +iiXBAgAgTQJDLoYAqXDpcchyaXMKJIACXg9v/4olAQNBcPhwQy+JEKlxKXLIcwokwAJCD2//iiVB +AwAgzgJDLY0QyXDocalyKXMKJIABJg9v/4olgQMAJgYAQy+PAMhwyXHpcqlzCiRAAgoPb/+KJcED +ABABECFwQy6CEBlhBBAAEMBwBBgAEAgQABBYYAgYABAMEAAQABhAEB9nEBAAEAwYwBMdZZ0Ar/4Q +GEAT8cAmCI/+CHY6cSWASHdzb0EpwgD2ecW6JaANCeUABoAB4AamQS9BFzhgBqb4Yr/gPAAOAEAm +EBdA3A4iDQMqcAAggSBeD6AMqXLJcNYOr/8KcQjwyXDODq//ACVBFEDlQCXAH/EIxIMA2gPwAN1A +JgEXACVAFFlhKg+gDAInQhMFAI/+8cCqD0/+z3WAAKQKABUFEDMNVQLPdoAA7EPPd4AAyFoD8AAV +BRABhUAtAQIleCCGBwhAAACm8CdAEUB4c+jVB0/+CiHAD+tyz3AAAIYnY9upACAASiSAAKLB4cVC +wUEoAgIHekEoAQRHec9ygQBIFMa5KmIlCt8BCBQDMc91gQCIF6lxVnlAgQsIgQBCkREKwABHie8K +3oGA2APwBonBxeB/osDgfuB44H7geAjIlbgIGhgwCcibuAkaGDALyIq4jbiQuAsaGDDgfuB48cDh +xQh1PojPcIAAKB5AgEAlABQDuTV5WWHuDqAMCtq+D+//qXAxB0/+4HjxwKXBQcBCwQwcADEQHEAx +z3GAALCRNBnADzAZAA8sGcAOKBmADiQZQA7PcIAAsJEgGEALz3CAALCRHBgAC89wgACwkRgYwArP +cIAAsJEUGIAKz3CAALCREBjACM9wgACwkQwYgAjPcIAAsJEIGEAIz3GAADSRgBkACHwZwAd4GYAH +dBlAB3AZAAdsGQAHaBmABmQZQAZgGQAGXBnABVgZgAVUGUAFUBkABUwZwARIGYAERBlABEAZAATv +oc6hraGMoSwZwAIoGYACJBlAAiAZAAIcGcABGBmAARQZQAEQGQABY6FqIAAD2BkAAGogwALUGQAA +aiCAAtAZAABqIEAByBkAAGogAAHEGQAAaiDAAMAZAABqIIAAvBkAAGogQAC4GQAAaiAAALQZAABq +IIABzBkAAEDDAcACwVMnzTUMFAYwUyXENVMmxTXXuqlz/gkgBRAUBzCmCGAMANguCAADz3AAAK3e +Mg+AAMIL4A0A2M91oACsLxmFibgZpc9wgAAcCQCAgODKICECyiEhACQLYQXPIWEGz3CAACAJAYAp +CF4AQNnPcIAAcIQmsDC5J7AZhfC4GYUF8o64GaUH8Iq4GaUF8D4IoAYA2DkEwAzgeADbYKghqEKo +4H8D4PHA2gxP/s9zgAAIL891gAB4RUCFDOkAo5Tq4gkgAQ/YNgugBgjYAdgApQzwAN7Aowjqpggg +AQ/YAgugBgjYwKUFBU/+8cCSDE/+z3CAABAJAIDPdoAAgBeghs93gAB8FwQggg8PAADgBCKBDwEA +AAByaUR7Z32gpgQgjg8AAABAmHWghwO+RH4EIIAPAAAAgMd9oKcEIwMBBiLPAMR9pn89eSV4ArgE +IoIPAgAAAAR6BieAEC8oAQBOIEIEDRqYMA8KkAHPcIAAJNIOkCfoz3CAAIwJAIjPcYAAnCjwIQEA +vxEBBlMhQYAZ9M9xgABIVQS4AWEjCpEBz3CAADTS9CBAAA3oz3KAACQ+A4INGlgwAeADogTwNwpA +AEhxz3OgABQEKqPPcoAAqAlAigDYDQpRAEmDBwoUDgHYAdqJ6M9woACIIDV4QKAH8AbZ3PGqDiAL +BhqYMOkDT/7gePHAcgtP/gh27Igols9wgABECbJvKHOGI/MPtn1CKxECx3WBAMgUYIUIcgkLXgNE +aOu5iiDDLwT0HhaQEA2OUSAAgKLyeQnfACsL3gL/2AetSiQAcQDZqCCAAyhiACGDD4EAsBz2ewSr +KGIB4S95AKtb8CMJEiEKIcAP63LPcAAALSWKIwsESiRAAEEE7/8KJUAE7rkHjTIiQgQAIYEvgQCw +HPZ5CPJEqQTZAClBBCV4B6098ECpDyBABGPwLQgSJIwgw6/KIcIPyiLCB8oggg8AAC4lyiOCDwAA +5ALKJGIA6APi/8olAgS2C+//yXAIlgsIngMCjgmtA/ABjgitAIUxCN4CANpHrUokAHHPcYEAsByo +IMACOGL2eAQYAgQAGAIEAeJPegGOCK0CjgmtLPBMIQChyiHKD8ogig8AAC8lyiOKDwAAAQM+B+r/ +yiLKBwiWACGBL4EAsBzuuAeN9nkJ8gQZAgQE2QApQQQmeAet3fEAGQIEANkPIUEEJngHrQGOCK1N +Ak/+8cDyCU/+z3OAACQKYIN5Yc9zoABQDGCDx3MAAAAgInvMuwsLBQDtCx7AUSMAwMogIgAf9DkK +UQDPdaAA0A8QFQOWKQhUAM9ygABAH59wI4KoIMACAoolFQ+WwbjTaNh/AeACqud5I6IQHdiQAdjt +AU/+4HjPcIAAQLngfwaA4HjPcIAALLngfuB+4HjxwGYJb/4G2gh1KHcgsM92gACcKAOGCODCCKAM +JG0DhkAlgRK2CKAMBtoDhkAlARQI4KoIoAwG2gDYAbUMtUQnAZLPcIEADCPRJ+KREPLPcoAA0NFA +goYi/wtFIsIBTLUa2lqtS5AQ4kuwB/AY2lqtQpAQ4kKwz3CBALAcS7UAiM9ygAAoHkCCA7gVeBBi +UyCAgMwhIoAF8gCVjrgAtTEBT/7gePHAtghP/gh2OnEacuRoz3CBALAcAIjPcYAAKB4ggQDdA7gV +eDQhEgChrhzYAK6htulwqXFmCiAAONoEHkQUCNgCpkAmABQSDeADqXHPcIEAyBQOiDceQhM1HkIT +vLYEuIYg/gMUroog/w8Lpg/YNh4CEFMigKC9tswgIqAQ8hkI0QAL2BWuCnBAJwEVqg9gDBDaB/AL +CJEACtj28bGvdQBP/uB48cAWCG/+BtqCJAM9OnAacc92gQCwHACOz3eAACgeIIcDuBV4FWHPcIAA +QEtmD2AMmMHPcAAAiI5mHAQwmsEqcFIPYAxk2lMljZBs2GTyWw3REECOIIeWwJ/FA7pVehDhWWFy +D2APViVCEwogAIRWJU4TyiBiABN9z3CAAJwoQ4BVJMY8ViSHNs9wgABUg0AiAQKYw4okAQtKDCAF +UyWFEHzdlsc78FkNkRAgjgCHz3OAADSDA7k1eRDgPmAskwHhMHlAIwIGLLOJ6Q2TAeAQeA2zhegO +kwHgDrNYHEQwANhaHAIwINhbHAIwAZJ03VwcBDACkl4cBDCWxxHwCiHAD+tyz3AAALwh7tuYc2EA +7/9KJQAACHUA3pjHj8BMIACgiiEGAsohgQ8AAAgBjg3P/1YUgTCLcLlhMHkmDu//yXKPwNQcADCL +cNgcADDcHMAz4BxEMxIIIABVJEA9GQcv/oAkAz3xwL4OD/4IdQCAAJAnuMC4E3hTIE4AAthSDeAG +yXENGpgzz3GgABQEyqHPcoAAZAoAghS+AeAPeACixXgLoQGFpg9gDDzZAIWeD2AMOogChZYPYAwm +lVIPgATRBg/+4HgocjEAIAAA2eHF4cYA3YDiyiSJcOggKQKuYapgwnpPeoPqAeUA2khwwcbgf8HF +4HjhxeHGQCkNAiV9QC0DFKV7JQo0Agh1UyV+kAbyAR1SEGG6+/FBKo4AwbpCJk6QBB3QEP31Ceov +JIlw4HioIEABAR1SEOB4wcbgf8HF8cDaDS/+BtgNEg42ARIQNg0aGDDPdaAAFAQKpQmFBxIPNifo +A9gQpQSlz3CBAMAdAg2gDQMaGDCS2QPIkLmgGEAAPgpgAwDYCYUP6CgVBBAkFQUQHtgKIcAP63KM +uNEGr/+KIwQGBxrYMwEaGDTKpc0FL/4NGpgz8cDhxQh1YgngABTYz3CAAJwoAIDEEAAGJbiCCuAA +wLiqC2AGBNjKDeALqXAWC4AL1giAC6kFD/7xwOHFocG5CPQACHUyC+//ANqtCBAAz3OgAFAMBYPP +coAAYKASqgWDE6oJkowgxIEqbSfyEvbbCNAAh+B49IEJUQDPcoAAMJleCK/+QCKAAguKgbgLqg/w +jCCIgDLyjCDIgEnyjCAQgGL0BYMJaQsIVQEA2F3wPgjgBQDZWfAfCZQAz3KAADCZHgiv/kAiAAJI +cQuJgLgLqe3xJQlRAAoIr/6LcCDAz3GAADCZUyACAIYgfw9IqRx4Cant8RPYOfD9CZSDz3CAAJwo +A4AYiPEIUIDPcoAAZJZIcM4Pb/4G2UAiAALCD2/+BtkMkoG4DLLB8c0JFIHPcoAAZJZAIgAFpg9v +/gTZDJKAuAyys/GxCdGBz3CAAFQKjg9v/gfZz3CAANQvVg8gDwCApfEc2HkEL/6hwPHA4cXPcIAA +ZJYMkAsIHgA6DgADBfBRIECApA8CA89wgAAwmQuIDwhQAILgkAoBBAPwpgsABM91gABcCgCVMQie +AM9ygACA00wSgADPcYAA0NPBuPQhAADPcYAA0LcBqUgSgAACqdYKYAUB2ACVUSAAgVQPAg8A2PkD +L/4AteB44H7gePHA4cUA2M91gAAI0UokQHEkhagggAIA2w8jAwALIcCAA/QB4AXwZnk6D2AAJKUE +hYDgRA+hAMogYQK1Aw/+4HgIczhg1bvVuQ0J5QA2uAIjQgAK8M9ygQAwHUWCAeDJuCJ6emIWuOB/ +RXjgePHACgsv/phyCHXPdoAA/Jn0JkAQz3eAAHyZUSBAgsogQQDKJCJ0yiAiAOggIgL0JgIQCQpe +AgHgRwgVBC27wLvPcoEAKBS0ekArhQJgkgS9hiX4E4m9DyNDAGCyANoWf0CnQafDuaV5BSFDARR+ +YLbPcYAAHJoVeQAZAAEC8IDY8QIP/uB+4HjxwGoKD/6CJAMyCHZacUh1OnNIcItx4glgDAjaQCrQ +IEAlABIqcdIJYAwKcobACglv/slxBdgG2ZpwenFCIA0iXwpyICJ1SncKJYAkgsaLcMlxpglgDAja +BCy+JA8UgTAAIUB1J3gPHAIwqXCEwYoJYAwI2obAyXHWDC/+yXLJcItxdglgDAjahMCpcWoJYAwI +2mG/aL25D3WQQiVVIEIjQSCZCXWAQiRAIEokAHIA2aggAAIyJEAwjCCCiQT0AeEA2ATwiiD/D/EB +L/6AJAMy8cDhxZhwA8igkAGAQOX0uMAlohAD5c9yoADUBw8SA4YEJY0fAAD8/xMLJQGAdQ3IFSIB +MA4RAAYbYxkSAIYCJcEQRwhFAAXYDLjPc6AAyB8eoxDYDqMB2BUbGIAZEgCGCQhFAPkLHsAfCx5A +GRIAhgohwA/rckPYjLjPcwAARBaBAq//uHUPGliDoQEP/uB48cD6CA/+q8HPcIEAsB0AEBMAB8gE +IIAP8QAA8EDADcwA3s91oADIH1EgQIDPcIEAsB0hgAPID/KgFQIQ+BUDEGJ5AiJXAHYQAQEvJ8gl +WWEE8IQQFwHicToYxAUfhQ8IRQAweCoLIAUC2QHZz3CgANQHNKAzoAPf7aAREACGz3GgANQHQcBA +4A8ZGIAUGZiDA8ikEAEADQkeAtYIgAsE8EcdmJPPcKAA1AcNEACGQC8BJBB4BSEVAAPIIYAAEBIB +Q8G4EJgAchABAboQAAECIRQG+g/gBUTAGQhRAM9wgADIJgCQgeAB2MB4DLhCwAPwQsYDyM9xoADU +B1mAiBmAAKQQAQDZoLgYggO6GIQDt7mkGEAAA8ATCJ4Fz3KgAEgIQCIBIwbwQCIBIc9yoABMCATA +AsMDcWV4BSUVIAdpz3MAAPz/ZHjPc4EAsB1jgwggxADPc6AA1Ac1owAaQAUCIgElL6MCJAEAO6Pw +o89xgACUOA0SAjYAgT0IgADPcKAAOC4FgAQggA/AAAAAIQiAD8AAAAD12AW4z3OfALj/GqNbo2nY +GLgZowHYA/DJcAkIUQBAoc9wgQCwHQQQBQACIxMhz3GAAIS6qHCAIA8KHqUQ2A6lAdgVHRiQB8gE +IIAPAQAA8Cy4AxIDNgSxD4POqQChQBMAAQKxEItgEwMBQCgEAcO7BSMDAWaxD6kvI0gBz3CAAKDS +QCAECVV4SYDPcYAAJNJbY2mgpBUAEPgVAhCgcEJ4RcAB2M9yoADUCxCiA8A1uMC4F7gAIIIPAA4A +AM9wgQCwHQKAArgr4AQggA8AAPz/RXjscgCiARICNuxwQKDPcIEAsB1CgOxwQKgNyBQhAgBQiuxw +QKjscMCwA8iUEAIA7HBAoA3I8CQCAOxwQLDscMCw7HDAoOxwwKAHEgI27HBAoAPIQJBUEAABELpF +eOxyAKIDEgM2AYMfCB4BUotwi89wgQAIF3Z4AIiGIH8MHHgEuEV4AvCA2OxyAKoDyDt2UIgzEIAA +BLoFeuxwQKgDyBp2XJDscECwAxIDNs9wgACoQ5wTAgFvgya6wLrAuwy6DbtlekCgDRICNgAigA+A +AEzSwKjPcIAA0NFWeFR5wLECkMAZhAMVJIIAeBkEAM9wgACcKASAGpDQGYQDRsDPcIEAsB0CgMCi +gODKJ44TCgMuAMohjiPJdcl3OnZMIACgs/IT8M9xoAD8RB2BOYEEIYKPAAAACBH0BCC+jwAGAAAL +9E8LH0DPcKAA9AcHgADe1Qjehy3wAN76uMomgh8AAAEC+bjKJoIfAAACAvy4yiaCHwAAAQIK6s9z +gACoPVCDiiYIEgHiUKMuDIAOEfAB2c9wgACMQyCgsghgDShwz3GAACQ+DYGKJggSAeANoQUnj5ML +8mECIAAA3oQSAAAhCJQMkwsfQM9yoADUBw+CEHgZEgGGWODnCQSACvDPc4AALD0kg4ohECEB4SSj +iQmfIB4aWIMdEgCGBxoYMB0SAIZKwB0SAYYEyCCgHRIBhiGgHRIBhiKgHRIBhiOgHRIBhiSgViUA +Eh4aGIAdEgGGQC8CJDB4BSCVAAQSAjaGIfMPABISAYwhDIABgkPAFvIa2BXwz3CBALAdCBAEAAAQ +BQAKIcAP63JX2M9zAACME6EFb/+MuADe0fAg2JpwA3AQeHIaBAAA3gsIESADyHPwA8ARCJ4Fz3Gg +AEgIQCIAIwfwQCIAIc9xoABMCEfBA3BIwATBAsAleAUlFSAIwAfgz3GBALAdI4EEIIAPAAD8/wgg +VgAMJsCkLgEtAEnAFg0AAAUnD5CY9AHZz3CgANQHFBhYgFUlQRQPGFiAAwofQgjAz3KgANQHFaIH +wwIiACUAG0AFD6IJwwImwCAbogPYEKIqwJzgANmQ9AcSDjYAwAQmgh/xAADwUHCU9API6XLIugIj +kyUIiAy4RXgDEgI3ELpFeOxyAKIKwEAhWTABGhgwBMgDEgI2KHZBxQMaGDAEGpgwIYAAkAHFNLnA +uTR4A+BA5QQggA8AAPz/HWUNEgE2BvAVIkAwDhAABgJ9FSJAMA4QAAbvDQWQA8zPcZ8AuP8Yoc9w +oAD8RF2ABCK+jwAGAABd9BkIECAEyFCIUyLBAIYi/gNEusQYggAwqM9woAAUBMSgB8jPcaAASCwd +oc9wgQCwHQKAQCBQIBJwIAXN/wvwz3KAACw9I4KKIRIgAeEjogPwOncOCQAFUyF+oAX00gsAAAV/ +nw8QEIkPXhADyCmIAeEpqM9xgAAsPQaBAeAGoUDwCiHAD+tyKBQFMDzYjLjPcwAAGxS1A2//SiRA +AAAUBDBH2AohwA/rcoy4z3MAACMUmQNv/7h2TCAAoM9xgAAsPYonEBAI9AfIz3OgAEgsiicIEB2j +DwqeBgWBgL8B4AWhuPEGgYG/AeAGobTxEQ8eEM9xgAAsPQWBAeAFoTp3A8jpcci5CIgMuCV4AxIB +NxC5JXjscSp0hCQCkQChQCFNMBTyz3GgANQHgBnABAPMKnLIuhC4RXjscgCizKEB2BQZGIASCaAO +AeUDEgI2khIAAQQSATYNCJ8CkhEDAW0LngKquJIaBACSEQABqrgSDWAIkhkEABDZz3CgANAPEBhY +gCQQAYbPcoEAwCFFkjB5ArpFeQwYWIAU2RAYWIDPcYEAwCFnkUaRGNkQu2V6DBiYgBAYWIDPcYEA +wCFpkUiRELtlegwYmIAG8M9wgQDAIcqoz3KgANQL0KKvCRAgBfAI2exwIKAB5c9wgQCwHQKA8w0E +kM9wgACEuiSQlOHAIYYPAACTAM9woABoLPAgQADPcYAAqEMggc91oADUByV4DaID2BKlqg8ACw0P +XhIeD6//AcAH8APYEx0YkBQdmJMpCBAgz3CgACwgMIAFwDBwAdnKIYYDBCCATyAAAACA4cwgIYDx +889wACgIAAYaGDAGwGYK4ATJcVEhQKCq8s9woAAsIM+gpPDPcIAAcPARiDkIHgA1CB5Dz3GAAJwo +I4HPcIAAcPAQiBC4MiGBDwAA2AKfuIDhAdnAeQ+5JXjPcaAA/EQNoRsLECDPcKAA9AdgGMAEz3GA +ACw9A4EB4AOhz3CAAIS6JJCU4cAhhg8AAJMAz3CgAGgs8CBAAM9xgACoQyCBANrPdqAA1AcleM9x +oADUCw2hTKZyDiANBsAZFgCWwOCgAA4ADcyZCF4AA90gHliTAdgUHhiQBBIBNgAWBEAHGhgxABYF +QAEaWDEEypzgyiLCB8oggg8AANwOyiOCDwAA9ArkAGL/yiHCDyhwfg3gDQ7ZDxYAlgQSATa0GQQA +Ex5YkxCJUyDCAIYg/gNEuMQZAgBQqc9wEiAAAJINIAMNEgI2BMjPcaAALCCwEAABL4Fk4DBwyiCF +DxIoCACF989wACgIAAYaGDAA3g3MBCCADwAAAggXCJEABBIBNoogBADaCuAImBEBAA3Iz3GAADTS +z3KAAAjRFHnPcIEAsB3AsSKABpIZYTB5JrKt2M9yALsAuxoPIAYFuAPIGpCODWAGDRIBNu0Gr/2r +wPHA4cVPCF5Dz3CBALAdAYDPcaAAyB+WIEEPHqEQ2A6hAdgVGRiAHg1gDkHYJwheQwHZz3CAAIxD +IKAiCiANAdjPcYAAJD4NgQHgDaGKJQgSLfDPcaAA/EQdgTmBBCGCjwAAAAgA3Qf0BCC+jwAGAAAY +8gDd+rjKJYIfAAABAvm4yiWCHwAAAgIJ6s9zgACoPVCDiiUIEgHiUKMuDUAOB/AD2c9woAAUBCWg +nQav/alw8cAeDo/9CHXPdoAAQBUAjqjBzwgRAIt36XDPcYAASEjCDq/9INoB2ACuANiPuAsaHDAA +2BUaAjDPdoAAAACgtg8NgR8AAP7KB8CAuEfAz3CgAKwvGoBSIAAAEwgeAAGWgLgBtgfAgbhHwM9w +gABAVaCIqgngA6quz3FDdagSQMGKIRoKQcErjgSmDRxCM0bAY8HPcYAAbD9Ewc9xgADYPs91gAAc +CQCFRcGA4MogwQPKISEIyiJhAMojYQ9gC2ELwCvhBQCFgODKICECUAuhBMohYQAC2c9wgADoLiSg +qQWv/ajA8cA2DY/9KHbPcYAAnCgvIAcghOhhgQPwYIHEEwMGJbvwIQ0AwLuA5qKho6HMIyGAAd3K +JSEQz3OAAOQr6IsrD1ES4YHEFw8WHw9eEeyTfpEXD8AQEQhQAIfoAIHEEAAGBwhfAQDdgeLKJSEQ +AN8WCKAL6XAKcDoNYAWpcc9wgADoLgSAIwieAM9wgAAEOgCAi+jPcAAAFglyCwAECwhRAJoNAAoM +8ADZnrnPcKAA/EQhoOB44aDOD2ALANiA5rAJYgDKIGIA+goABIXofgzADAPwsgzADM91gAAUFgCN +huj2DAAMAdgArbEEj/3xwE4Mj/3PdYAACNEklRLpz3egACwgUIcA3gaFR6XODa/9DiCAAAilxLUQ +h8W1BqWFBK/9CIXgePHAz3GAAAjRABEEALhwz3KAAMQyQCyAABV4FSBAATAiBgAZDhEBCiHAD+ty +iiDMDDUFL/+KI8UCTw4QACMOUAAtDpAAIw7QAAohwA/rcoogDA2KI0ULEQUv/wolgAEyCgAA0cDg +fhYJAAD98QPYCQxQAAChANgFoQSBoLgEob4IYAAD2O/x7/HxwM9ygAAI0QaSAeAnkhB4HQkjAAay +BIoNCFEABYqB4AHYA/IA2IDgeAgCANHA4H7PcIAAgNMgkEQhAANjCBECANvPcoAACNFlogSCoLgE +oj0JnwEEks9xgABg0QHgJIEQeB8JJQAEsgSKDwhRAAWKgeAB2ALyANiA4CgAAgDPcIAAnDYDgAro +A9gJ8M9xgACcNgOBAuhjoQTYWQEAAOB+8cDPc4AACNEEE4QADQxRAAWLgeAB2APyANiM6AUThQAK +IcAP63KKII0OFQQv/87bAtgAowDYJJMJowWjBrMqoySDoLkkoxoLoAUEs9HA4H7PcoAACNEA2SWi +JIID2ACioLl5BaALJKIA2c9wgAAI0Sqg4H8poOB48cB6Co/97g/P/89wgAA00WCAz3KAAAjRqIBg +os92gAAUMwSCqKIA2cCGoLglogSiIw5REILjzCPigBL0z3CAAJw2I6AE7ZYPz/8K8EoKAAAG8AHb +YKIooqC4BKKJAo/98cAaCq/9ANjPcaAALCBQgc92gAAI0SSOz3WAADTRCKULCVEAJY4JCVAAAdii +6CqGHOkGhn4Lr/0OIIAAz3EAABAnJQkFAM9xgQAwHSWBmSHNChkIRQAF8M9wAAAQJwilAtgH8ADY +B/AJhvjoAdgApQHYFQKP/eB4z3KAAAjRJIIPIQEAJKK1BiAACdjxwIoJj/3PdqAALCAQhs91gAAI +0Qelz3CAALhB5g1gDADfABUFECcNUABMJYCAzCXigDzyCiHAD+tyiiBMDYojCAeZAi//iiSDDwSV +zwgQAO4Mz//PcIEAMB0FgCiFmSDNCjBwAdjCIA4AswgQAM9wgAAsNumg13EAABAnbyALABHoBI0N +CFEABY2B4AHYA/IA2AXoCg7P/0Hwz3AAAIgTCKVODs//O/AElZroJZUIhYHhwCCBDwAAiBMD8ht4 +z3GBADAdJYEIpZkhzQoQcQHYwiAOAJ/o1ggAAB/wNwhQAAiFHXjXcAAAECcIpW8gCwAR6ASNDQhR +AAWNgeAB2APyANgF6JoNz/8H8M9wAACIEwil3g3P/wSVBbXktRCG1QCv/Qal8cDPcYAAgJZBgc9x +gQAwHSWBBSm+ADBwyiBOAAwhAPDPcQAAECfeCa/9yiBFDs9xgABg0QSh0cDgfuB48cDhxQDYz3OA +AAjRAKPPdaAALCAQhQHZz3KAADTRBqMQhSCiBqLPcIAALDYDiCSrjCCDhiSqBPIlqiWr7gsgAAPY +YQCP/eB4AdnPcIAACNHgfyCgz3CAAJwoA4DPcaQAHEAIgMC4E3jBuBKh4H7geOHFANpKJAB0z3WA +AHyZz3OAAPSZSHCoIAADQCMBAhR5QLEWJQEQQKFBoQHgSiTAcwDZqCBAAs9wgQAoFDR4QLAB4c9w +gADoCUGgz3CAAGSWTLDgf8HF4HgF8EJ5x3BAAAAAz3KBADAdRYLzCkSAUyBDBXBxwCCND0AAAADA +II0A4H8ieAbwYnkCIIAPQAAAAM9ygQAwHWWC7wtEgFMgQgU6YgsLhAA4YAfwAiCAD0AAAABieDhg +4H7xwP4OT/3PcIAADNQMiBkI3wECuM9xgQDIFBZ4BWEtvcC9A/D/3XoOwAMJ6M9wgADkKwiIh+AC +2ALyANjPcYAAYKB3ic9ygADswyGCCQtAACCChOkB2QPwANkacc93gACcKCCHxBEBBosJXgGHDREQ +I4c4iX8JEAHyDUAMz3GAADQ8NQgQIM9ygAAkCgKCAeACos9wgABkQwDaQKDPcIAAwEJAoM9wgAAs +CUCgEYEB4BGhBfAQgQHgEKHaCc/9z3aAAFwKIJYTCV4APgqADgCWobgQeQC2HwmeAVIKgA7PcYAA +1LcLkQHgEHgLsQCWprgAtq4NwAMP6M9wgADkKwiIiODMJWGQB/RiDWAMAdgaCsAEjCXDn0byIwgQ +IM9xgAA8HwCBC+gA2AChz3GAAJQvAIGiuCoIoAgAoaoKAAzPcYEAMB0GgUUgQAEGoc92gAAwmQuO +USDAgBwPgv0LjlEggID8C0IDigkAA0YNwAOA4LQKIgDKICIGBu0Ah8QQAAYhCF8Bz3GAAEzTBIkK +6AOJgOCwC+EKyiDhAI4KIAAV2MEFT/3hxc9xgABAHwCJAdthqSToz3CgALAfeaDPcIAAECcIgKOB +YIACgQDaMQ0BEM9wgABYHwCIg+gB2ArwAYECIw0A9w2Fn0wAQEtBqUhwBwhRAGGhQqngf8HFoqHv +8YDgAdjCIAwAz3KAAEAfAKoB2AGqANgCqgGiAqIDouB/JKLgePHA4cUIdRMINASYcg7Y4gov/wDa +g+gT3Szwz3KAAGCgSHA2CO/9DNnPcYAAQB8AiQ7oz3CAAIDTAJCGIPwAjCACgAb0BZJkkmd4A6FC +JQATEgggBYhxCiUAkAz0z3CAAIDTAJCGIPwAjCACgBQPwf/lBG/9qXDgePHAmHC4cZzgyiLGB8og +hg8AAOMOyiOGDwAAgwCYBeb+yiHGD0wlgIHKIsYHyiCGDwAA5A7KI4YPAACEAHgF5v7KIcYPANrP +cYAA9JKeuhUhQQEAgQEqAgFGeE4MoAYAodHA4H6dB+//BdngePHA4cUA3c9wgAD0kpYNL/8c2RvY +pgggAAXZSiQAd89xgABgH6ggwAIWIUADBBAFAJh1Dw1BEUAkTQA5BE/9CiHAD+tyd9gFuAEF7/5T +2+B48cDPcIAA9JIYEAUALyxBAUwkAIfKIsYHyiCGDwAA4g7KI4YPAACrANAE5v7KIcYPz3CAAGAf +FiAAAQCAQHjRwOB+4HjxwOHFz3ADAEANz3WgAMgfRR0YEKoPz/+A2BUdGJDBA0/94HjxwJhwuHGc +4MoixgfKIIYPAADjDsojhg8AAGMAdATm/sohxg9MJYCByiLGB8oghg8AAOQOyiOGDwAAZABUBOb+ +yiHGDwDaz3CAAPSSnroVIEABIIABKgIBRXkqC6AGIKDRwOB+nQfv/wXZ4HjgfuB44H7geOB+4Hjg +fwHY4H7geOB+4HjgfwDY4H7geOB+4HjgfuB44H7geOB+4HjPcYAAsDwSgQHgEqENyMdwgABA0iyI +AeEveRcJcgAsqIogCAAGGhgwitiQuAfwiiAQAAYaGDBC2Ji44H7gfuB48cBmCk/9mBACAAQigQ8A +AAAIO3kEIoMPAAAAECV7z3GAAJwopIFWJU4UViUPFZgQgQAVCl4ChiH/A0S5L2eJv+lxGfBRIgCC +vBUCEQzywrmAJQIZP2Xojz1lMI1lf/B/RXkJ8MO5PHk/Zj5mMI7oj0V5iBjAA2V5VQJv/YwYQADx +wOHFA8ikEAEAmBACAFEhAIByEAEBSHAG8gYJIAIA2gh1B/AB4foIIAIA2qxoAgyADM9yoADIH/gS +AQADyM9zgQDIFBCIArgWeABj7bjPcIAAECcI9AHbc6JIgECCDIBggAjwAttzokmAQIINgGCAAiVA +EFhgEHLAI20ADXEAoQ1wYKAAFgBAABYAQAPIz3KgAPQHcBABAWi5J6JwEAEBaLkwebkBb/1wGEQA +8cA6CU/9z3agAMgfoBYEEPgWAxAA30kIEQEDEgE2pBEAAHYRAgERCB4Fz3CBALAdoYAE8IIRDQEN +zFEgAIGEEQABCfICJcEQAiRDAAgjAwAE8IYRAwEbY2hxcfCVCFEADRIBNwPIeBACAUcJHgFRIUCA +z3GAAJwoJIFUEQEBCfJ+EA0BIn1ifQIkQwMr8IAQAwHPdYEAqBMAI0QAcIh2fWCVACMNAYQQAwG7 +YxvwpBABABUJHgVwiM9xgQCoE3Z5YJEE8IIQAwHPcYAAnCgkgYAQDQFUEQEBPWW7Y4QQDQG7Y4AQ +DQG5YX4QDQFCfSfwQwiRAAMSDTYNzHgVAhFRIACBz3CAAJwoBIBUEAEBCfKAFQARInhieAIkAwAH +8IIVAxGEFQARO2MbY4AVDRFCfQXw6XPpcul16XENzBEIXgADyHYQAgFiujpiDPAVC3IAYrrPcIAA +nCgEgEYQAAEaYvgWABBdZQJ9H4YZDQQQoNgPpv+mX6YC2BUeGJCA2A6mIQBv/XB44HjxwLIPD/3P +cYAAnCjwIQIAViJFBAiCViIEBVEgwICKIAgAyiAhALwaBABKJAByANmoIEAPz3WAAIxV/IouZeR+ +LyiBA04ggwfPcIAAdFdvYAAlQwDgq0QSjwDkfi8ugRNOJo8X7mDIq8iCIQ7eEB2KhuHTIKYALygB +AE4gjQfPcIAA7FSoYBHwz3aAALRVLmbOZbyKxH1YEo4AxH0vLUETTiWOF8hgEKsB4UokAHIA26gg +wA/cis9xgABQV29hz3WAAHRX5H4vKIEDTiCPB+9lACXAAPyoRBKPAOR+Ly6BE04mjxfuZSQYggPI +gh8O3hA9ioDj0yGhAC8pQQBOIY0Hz3GAAOxUqWEQ8ATryWsD8Gh2zmE8isR5WBKOAMR5LylBAE4h +jgfJZSwYQgAB40okAHEA2KggAAXPcYAA6FR9iglhACQMAAHgZHkvKUEATiGDB89xgADsVGlhIKy9 +Bg/94cXhxs9zpAC0RSkTAIbPcYAAuDvIGQAAKxMAhswZAADPcKUACAwDgOQZAAAOEwCGEHowuNQZ +AADQGYAADxMAhtgZAADPcIAAvNPUiLaI6BmAA3iI7BlAAw2Q8BnAACzgAiCCA/QZgAACIEIDYnj4 +GYAA/BkAAMHG4H/Bxc9wgABoQwaAA4AggM9wgABYk+B/KaDgeOHF4caYcM9ygABgIAWCIIJmgsq4 +ELjKuQUhAYABgsq7ELvKuAUjBQBnggKCyrsQu8q4BSMHAGiCA4LKu8q4ELsFIwYAJPIAFA4ALyhB +AE4ggwcA2A8gwAASfQQgQwGkfmV+AByAA9qCpH7Fe3qieYIEII4BBCDAAaR7xXt5oniCpHsEIUGD +ZXgYot/1wcbgf8HF4HjxwCIND/06cAWBoIHKuBC4yr0FJQ2QAYEmgcq4yrkQuQUhEAAB3hnyBCWA +kxPyLygBAE4gggfwIYEgAN8PJ48QCOkEJwAUQiAAgGB5yiBiAOZ9237q7S0FD/3geOB/ANihwfHA +xgwP/aPBCHZHwM91gABgIBuFOoX8hSR4BH8HJ4+TQccW9LEOERDyDSAECtilCBAACiHAD+tyz3AA +AI0TiiNHAEokAADRBa/+CiUAAQQUATEY6RwUADELIECADfLPcIAAnC9ggM9xAABgXAzYYHsD2gjw +iOjPcIAAmC8ggGB5DNgGFAExGOkeFAAxCyBAgA3yz3CAAJwvYIDPcQAAYFwN2GB7BNoI8Ijoz3CA +AJgvIIBgeQ3YCyeAkwXyMgnv/wrYB/CH7gII7/8K2FYIAADcpQjcXwQv/aPA8cDyCy/9ANrPc4AA +YCA7g7qDAN4PJg4QpHkEJkAQQiAAgMogYgAvJgfwAd3KIIEAB/IcgyR48g7v/8V4qXAhBA/94Hjx +wOHFocEB2EDAz3WAAGAgCoUbCB4Ai3AE2WfaPduOCeAKF7sKhaC4CqX5Ay/9ocDxwHYLD/0acCh1 +SHdodjhjZtk92s4J4AoXuhcIUQAKcKoJ4AqpcelwegngCslxrQMP/eB48cBCCw/9psEodRpyYMAA +2AEcAjAB2AIcAjADHAIwi3CqD+AGgcEG7QTBCnBgfQXCA8GO6QohwA/rcs9wAACME+7biiTDD1EE +r/64c2B5ANhVAy/9psDgePHA5gov/QHZosHPdYAAYCAahVuFBHochQQgkIAt8gPwO3kEIECg/vMv +KAEATiCRB1wdQBQVJU0UHYWA4MohwQ/KIsEHyiCBDwAAjxPKI4EPAAAcAsokAQTkA6H+yiVBBCYI +z/8dhUB43g+P/wDYDyBABAYgECCyDe//CnDJAi/9osDgeOB+4HgB2c9wgABsMOB/OKDgfuB48cAy +C4ADz3ABANg9CejPcYAAYCC4GQAAG4GRuBuhz3ABAFA9COjPcYAAYCAeoRuBgbgboc9wAADEXgro +z3GAAGAglBkAABuBiLgboc9wAADIXgroz3GAAGAgmBkAABuBibgboc9wAADUXgroz3GAAGAgnBkA +ABuBirgboc9wAQCkRwroz3GAAGAg2BkAABuBmbgbodHA4H7xwOHFocHPcoAA3LrPdYAAYCAXhQDZ +DyEBABiFJHhCIACAyiBiAAHbANkjCFEACNhgwAEcQjACHMIwAxzCMItwBNkGDu//iiMIAAjYANku +Du//KHIA2OEBL/2hwPHAWgkv/QjZz3Kt3u++WgrgATpwmg8gACpwkQjQAM9wgABYkwOQTiDPAVEP +1RHPcIAA/BUyDWAA9CDAAwDeAN0E2BpwKnDpcclyCiSAD63e774WCuABqXOuDyAAKnBNCNAAQiBA +IN8IdYAB5QHm0w4UkQHnuw/UkSpwz3Kt3u++5gngARDZKg8gACpwHQjQAM9xrd7vvtIJ4AEqcAoP +7/8qcIPgyiAiABEBD/3xwLIIL/0D2qbBGnDSCGALg8EDwc9wgABMFxQUBzAA3vAgRQDPcIAAVBfw +IEYAz3WAAKwKDtjEpUDABNhBwM9wrd7vvkLABMIKcIDbbgngAZhzzgkgAApwfQjQAAPDz3CAAGwX +QoXwIMEAwKUMFRAQwaUI6c93gAB0F/AnwBCG6MClwaUA2RnwhCoMA4oIYAAvcA4ggQ8AAAABIKUD +wIQoDCPwJwEQcghgAC9wDiCBDwAAAAEhpQSFGwhRAACFEXiMIAeNwvfApTF5jCEHjcP3waUA2EEA +L/2mwOB48cDaD+/8BNqmwfoPIAuLcc9wAAAb0gDdqXH6C2AAqXIAwc9wAAAc0uoLYACpcgDBz3CA +AKQVAcIVIEEAAJECwQW6tgxgAEV5A8CA4NoABQDPdoAArArS2Ai4Gdm2C2AAANrPcAAAItJAJgES +7glgAATaz3AAACPSQCYBE94JYAAA2s9wAAAg0oTB0glgAADahcfPcAAAIdLpccIJYAAA2gKGF9lG +DuAKQCYCEgOGF9k6DuAKQCYCEwTAF9kuDuAKhMIFwBfZJg7gCulyAoYA2WoPIACLuQKmA4YA2V4P +IACLuQOmBMAA2Qi4Ug8gAIu5CHcFwADZCLhCDyAAi7kihjF5GeEFKX4AI4YvclB3MXkZ4QUpfgAv +ccwgRYCF9wPAAeU3CEWDA8APCEUDAdnPcIAArAokoADYCQfv/KbA4HjxwJ4O7/wJ2qnBCHa2DiAL +i3HWCW/9IcAIcULYmgtgAAW5DBQEMADByXAGwgolgA+t3u++ag+gAQLDgg4gAMlwVQjQAADBBcLP +cIAA7BUA3fAgQAAEwQq6BCKCDw8AAPzJuUV5bgpgAKlyzgygDQXYIBQEMADByXAGwgolgA+t3u++ +Hg+gAQfDOg7v/8lwg+DKIEIDdQbv/KnA4HjxwN4N7/wC2qfBmnAaDiALg8HPcIAAOEkAgAfZRcDP +cAAAEdISCmAAANrPcAAAEtIA2QYKYAAA2s9wAAAT0gDZ9glgAADaz3AAABTSANnqCWAAANrPcAAA +AUQH2doJYAAA2s9woAC0D3AQFwDaCOAKAdgqDKANBdi82KIKYAAA2cPYmgpgAADZiiBECI4KYAAA +2YogBAqGCmAAANklxbXYegpgAKlxiiCEBnIKYACpcQPYQMAE3kHGz3et3u++QseKcATBA8Ie25hz +SiUAAEomAAAyDqABSicAAI4O7/+KcIPg1/LPdYAArAoIFRYQDBUSEA7YQMBBxkLHinAEwQPCHtuY +c0olAABKJgAA9g2gAUonAABSDu//inCD4LnyCBUVEAwVEBAO2EDAQcZCx4pwBMEDwuHbmHNKJQAA +SiYAAMINoAFKJwAAHg7v/4pwg+Cf8ggVERAMFRMQA9hAwEHGQseKcATBA8Lh25hzSiUAAEomAACO +DaABSicAAOoN7/+KcIPghfLChaOFvg+gCi8gxwUEwc9ygABsFwIhQKXPc4AAXBc1egCiAiMAJM9y +gAB0FzV6AKLD2jV7QKPPc4AAZBc1e0CjIfSuCUADCiHAD+tyEOjPcKAA/ER0EAQAZBAFAM9wAACx +E2UFb/6KI0kKz3AAAK0TiiOJCkokAABRBW/+CiUAAZzobglAAwohwA/rchDoz3CgAPxEdBAEAGQQ +BQDPcAAAsRMlBW/+iiOJDM9wAACuE4ojyQzh8QIlgCXZYAIhQYQQ8gIlQiQMehIMIAAvcATCAiUB +IM9wgABMF1V4IKACIIAkuWACIcGEEPICIMIkDHrqCyAAL3AEwgIgASDPcIAAVBdVeCCgANiZA+/8 +p8DxwIoNIAAA2M9wAAAN0gDZkg8gAADaz3AAAAzSANmGDyAAANrPcAAAFdLPcfMP//xyDyAAANrP +cAAAG9IA2WYPIAAA2s9wAAAC0qDZmrlWDyAAANoJ2Iy4ANlKDyAAANoU2Iy4/9k+DyAAANoA2Iy4 +/9kyDyAAANoR2Iy4/9kmDyAAANoC2I64ANkaDyAAANoB2I64z3EAAP//Cg8gAADaz3AAAAvSANn6 +DiAAANrPcAAADdIB2e4OIAAA2s9wAAAS0gDZ3g4gAADaz3AAABPSANnSDiAAANrPcAAAFNIA2cIO +IAAA2gDY0cDgfvHAggrP/KPBi3EB3ZoKIAupcs9wgAA8SACAQcAE2H4PIAAs2Q7Ydg8gAADZIca1 +2GoPIADJcYoghAZiDyAAyXGKIEYAVg8gAMlxAMCA4MwgooDMIOKAzCBigcwgooHMICKCzCBigswg +4oLKIUIDA/QD2YHgzCCigMwg4oDMIKKBzCDigcwgIoLMIKKCzCDiggP0grkveYTgzCBigcwgooHM +IOKBzCAigswgYoLMIKKCzCDiggP0g7kveeIOIAAP2ADYLQLv/KPA8cDhxaHBi3HWCSALAdrPdYAA +aJUAFAQwz3CAAEgVQCUBHxLabg0gAADbABQEMM9wgABEFalxAdpaDSAAAtvPcIAAbBUkbRzaXg0g +AADDANjdAe/8ocDgePHARgnv/APao8G6cHoJIAuLcQHBz3CAAPQVAN/0IE4AAsHPcIAADBaA5vQg +VADPcIAArArgoOGgzCaikMwmYpHMJqKRyiXCEwL0AN2B5swm4pDMJuKRzCYikgP0Ad2E5swmYpLM +JqKSzCbikgL0At2GDc//qnDPcq3e777mCaAByXFiDu//qnDtCNAAAMCA4MwgooFQ9IDmzCZikMwm +IpFK9ALAkQgRAM9wgABMF7V4WnDgoM9wgABUF7V4enDgoM9wgABsF7V4GnDgoM9wgAB0F7V4OnDg +oM9wgABcF7V44KDPcIAAZBe1eOCgqnDJcc9zrd7vvm4JoAGpcmYK7/+qcHUI0AAAwQASACCG4QHZ +wHkDubV5x3GAANy6AKEAEwAgBKEAEAAgG3gIoQARACAbeAyhqnCpcclyCiSAD63e774iCaABinNi +D6//qnApCNAAAMDPcYAArApAgQS+BrjYYBUgAAXHcIAAGLshgUKwI7AA2CEA7/yjwOB48cCkwYtx +BgggCwTaAMABwQS4NXjPcYAArBUQYeIMIAACwQDAAcEEuDV4z3GAAMwVEGHODCAAA8EA2KTA0cDg +fvHAocHaCuABi3IAwKHA0cDgfuB4ocHhxeHGuHDPcIAA7MMQEAYAz3CAAPAvBYCYcaHBhiT3D+cI +EADPcIAA+EMAgB8IgQHPcIAAAEQAgBMIQQHPcIAA/EMAgMMIAAEAHEAxIMIBFIEw8N5TIsAAxHpT +IccAJH5UekAujQG0fbpiFXrPcYAA3LxIYdR+CHOGI/0Pe3s6YkGKZXhIc4Yj/Q97e91lFSXNEb5h +wo5leslzhiP9D3t7uWEjiWV+KHOGI/0Pe3tleScMEADPdaoA4AdzhRELHgBIpQmlKqXLpRDwCKVJ +pcqlK6UK8Am6RXjPcqcAFEgDogm5JX7Eos9xgAD4QwAZgAHPcIAAAEQAGEABz3CAAPxDABgAAaHA +wcbBxeB/ocDxwM9xAIIBAM9woACsLzygz3CAAAQ6AICL6M9wgABgIgCADwiQAPILAAPRwOB+PglA +AJ4J4ARv2Ifo4gxgDQrYKglAAPPx8/HPcoAABDogggZ54H8gouB4z3KAAAQ6IIIleOB/AKLgeAQo +gA8AAC+6QinCdFB6RCr+AgIgQA4QeAPoAeJQegsIMwFAsYPoANgC8IDY4H7geI0HT/7xwNoNj/w6 +cM91gAAIJwCFAeAApRUIUQAB2c9woADIHDGgXgxgDShw5gmgBAfYGnDPdqAA7CfrhpIIoAYqcAum +AIVCIECAAKUG9M9xoADIHADYEaHGDmAECnDhBa/86XDxwHYNj/w6cCh1GnKiCaAEB9hacA8IniC+ +CWAHyNhQIJAgTCCAoBnyCPYjCBAgRQhRIBXYE7gN8CUIECQ1CBEoegqgAypwAKUP8CnYErjwIEAE +AKUJ8CvYErj78c9woADsJxmAAKVWDmAESnBlBY/8CiHAD+tyz3AAAIoTe9sKJEAEUQYv/golAATg +ePHA7gyP/Ah3OnEacx8KdAAA3kh19CeAExUhgSNaD+//CnJhvfENdZAB5iUFj/zgePHAwgyP/KHB +CHcacSMKdAAA3kh19CeAEx4IIACLcQDAFCCMI2G9ALTtDXWQAeb5BK/8ocDxwI4Mj/yhwRpwz3aA +AAgnAIYB4Ch1AKYVCFEAAdnPcKAAyBwxoAoLYA0ocJIIoAQH2Ah3LgsgA7PYFuiLcUoLr/0KcAAU +ADEApQCGQiBAgACmB/QA2c9woADIHDGgbg1gBOlwjQSv/KHA4HjxwA0M3gAuD8//BPDaCAAA0cDg +fvHADQveAEoPz/8E8PYIAADRwOB+8cD+C4/8CHWO4AHewiaNE89woAC0D/yALg9gCgDYyXCpcQHa +IgigBEhzHg9gCu94NQSP/PHAvguP/DpwKHUacuoPYAQH2EwggKBacBvyDPYnCBAgTQhRIBXYE7gV +IEAEoKAb8CsIECQ5CBEoKnAaCaADqXER8CnYErgVIEAEoKAL8CvYErgVIEAEoKAF8M9woADsJ7mg +ogxgBEpwsQOP/AohwA/rcs9wAACJE0rbCiRABJ0EL/4KJQAE4HjxwDoLj/wIdzpxGnMfCnQAAN5I +dfQngBPwIYEjXg/v/wpyYb3xDXWQAeZxA4/84HjxwA4Lj/wIdxpxHwp0AADeSHX0J4ATGgggAPQg +gSNhvfMNdZAB5k0Dj/zgePHA3gqP/Bpwz3aAAAgnAIYB4Ch1AKYXCFEAAdnPcKAAyBwxoF4JYA0o +cOoOYAQH2DpwhgkgA5PYGOiwfUAojyGBvxC9pX/PcKAA7CfmoACGQiBAgADZAKYF9M9woADIHDGg +vgtgBCpw1QKP/OB+4HjxwOHFCwgyDAh1HQ2SHgohwA/rcs9wAACaISLbmHWpAy/+uHNCJQAcxQKv +/A944HjxwEYKr/yYcEGBsIl3Ch4BconPdoEAyBTybfZ/5mY0yggRhQBJIMAAEQ6eFc92gQAIF7Z+ +wY4D8ADex3CBAAgXtngEiAgjAwAII4MDACNAAUkgwwMWbXV4z3OBAIgYA2PPcIEACBi2eM91gACc +KKSFuIUBgKV4BCCADwAAAAgGewLwY4Hou5gZwAAA3QnypBEAAADdl72RuJS4pBkAADsMHgDPcIAA +nCjEgMC6yIYEJo4fAEAAAD6+HubYekV7mBnAAB0LngekEQAAhSUBFIy4kbikGQAAnBlAAx7wJwve +B6QRAgCFJQEUlr2YvY26kbqkGYAAnBlAAySAEIGeuBChCvCUvZa9nBlAAySAEIGeuJ+4EKGZAY/8 +8cAqCa/8A9jPdoAAsC8ghkB5gOBt8iCGYHkE2NMIEAAghmB5ANhnuBUIFQMzJgBwgAA0RkAnAXIU +eQB5ANhC8M9wgAC4LyCAYHkB2IDgAdjAeDjwz3WAALgvIIVgeQHYIwhQACCFYHkB2BsI0AAghWB5 +AdgPCJAAIIVgeQHYwQhRgAHYHvDPcIAAuC8ggGB5AdiF4AHYwHgU8M9wgAC4LyCAYHkB2IHgAdjA +eArwz3CAALgvIIBgeQHYg+AB2MB4LwhQACCG63VgeQDYGnDPcIAAuC8ggGB5Adi4cDfYCiHAD6ly +lNuZAS/+CiQABKEAj/zgePHAz3GAAKgKAIEhCFAACiHAD+tyz3AAAIcniiNEBkokAABpAS/+uHPP +coAApAoAgoLgzCDigcohwg/KIIIPAACIJ8ojgg8AABoByiLCB+n1NwiRAM9wgABuCmCIz3CAAH7V +hCsfADIgQA4VCB4Az3CAADygIBCAAAkIUQAD2CHwAtgAoh/wz3CAADygIBCAAC0IUQDPcIAAbgpg +iM9wgACM1YQrHwAwIEAOCujPcIAAcAoAgIYgOY8I2APyAdgAogDYAKHRwOB+8cDPcIAApAoAEAQA +z3GAAKgKABEFAEwkAIHMJWGAyiLCB8oggg8AAIknyiOCDwAAUwGQACL+yiHCD89wgAB8CgCAANvP +coAAeAoPIwMAAIJmeACiz3CAAFjVIBCDAIHjBdgX8sLjz3KAAFA6CYIN8owjwoEG8owjgoIH8oC4 +B/BFIMAAA/BFIEABCaIC2ACh0cDgfoDgANrKIIEAEfLPcqAAsB8B23miz3KAABAnSIJgggIjQgBw +ccIibQBCeOB+DcjHcIAAQNI0iAHhL3k0qB0JMgEDEgI2z3ADAIQAoBoAAIogCAAGGhgwC/CKIBAA +BhoYMM9wAgGEAKAaAADgfs9zoACwHwHaWaPPc4AAECdog2CDBOgiewkIxAAA2APwSHDgfs9yoAAs +IHCCCegCI0IAEw6EcACAAAAPCIQAANgE8P8IxYAB2OB+4HjxwCYOb/yYcKXBKHe4cwDeBCOAD/8A +AAAYugV6b3kIuf/YCLhkeCi4BXlFeQjd9CSAAyd4RMB2CqALEBQAMRIUAjFhvUAoAQQFeUd5RMEQ +FAIxFCSAM0Cw1w11kAHmUyXCBUCnABQNAQfZB/AQfRQnTBAAtGG5FCRAMLt7T70AkKV7cHvpCbWA +eGAEIIAPAAAA/xC4BXpAp/UFb/ylwOB48cB2DSAGANiWCK/9ANjPcIAA5EJqCY/9z3CAAMRCYgmP +/a4Nz/4OCwAIANhyCuACgNl2CEALog1AAj4LgAtuCYABNg2AAgDYdgov/whxmg1ACqYNgAI+DGAB +/9jWCEABiiCFDwhxVg3gBAhy0cDgfvHAGg1v/Iog/w/PdaAAOC7HhQelz3CgAFQuC4DTuAYmAHAP +AP//cgmgDBbZcg6AAcelVQVP/OB44H7gePHA4cUA3c9wgADsCaCgz3CAAGSWrLA6CqALqXBaD0/9 +xgkgC6lwSg9AA9YOD/5aCEABiiAGCghx1gzgBAhyTgvv/KlwJgvP/AkFT/wA2c9woADsJyug4H7x +wIIMb/wS2c9wgAAQk2YKoAwA3c92oADIH4IeWJNKJMByqXCoIAACz3GgAIAfFXmgoQHgAtiLHhiQ +TNiLuIMeWJODHhiQD9iIHhiQz3eAAAgnAIcB4ACnDwhRAAHYUR4YkL4KAA3PcIAATNMAiM9xoADs +J4HgAdjAeAe4g7gQuIUgkQAGoT4Nr/wB2AHYz3GgAOwnBqEAh0IgQIAApwT0UR5YkyYOwABBBE/8 +8cDaC2/8BNmkwb4JoAyLcM91gAAIJwCFAeAApRUIUQAB2c9woADIHDGgSgogDShwz3CAAEzTAIgA +3s9xoADsJ4HgAdjAeAe4g7gQuIUgkQAGocYMr/wB2ACFQiBAgAClBfTPcKAAyBzRoLYNwADZA2/8 +pMDxwKHBi3BOCaAMAdmeDcAAocDRwOB+4HjxwKHBi3DiCKAMBNkAwFEgQICcCGIGyiCiAADAUSCA +gMQLwgoAwFEgwID8C4IGAMBRIACBdA9CBp4OoAsB2M9xgK7gAexwIKAByOxxAKHPcoAAkJOKJIF9 +ANmoIAAC8CJDAOxwYKAB4W4N4AAA2KHA0cDgfvHA4cWjwQHYQMDPdYAAYCCpcGIIoAxc2VYID/86 +hRuFJHg8hQR5gcDyDC//QcEBwRuFJHhBwFUlQB92DS//qXHPcIAA2CFqDS//QCUBG4twxgvgAATZ +ug0v/wHAAIWG6AWFgODIDgH/xg/P/uECb/yjwOB48cDhxc9wgAD8RwCAosFBwIHAAd0+CKAMqXFA +xYtwhgvgAATZtQJv/KLA4HjxwKHBi3AiCKAMAdkAwC8kBwAAHAAxGwjeAQcSBTYKIcAP63KKIMUA +XQPv/Sfbgg5gAUDYSgzAAOIPwAahwNHA4H7gePHA9glP/M91gADMJgKFI4UB3hBxwH6pcMoPYAwD +2R4MwAAE7gKFA/AAhTkCb/wDpfHA4cXPdYAAIAmpcKYPYAwC2foLwAAghQvpz3CgACwgUIDPcIAA +3D+CDiALWWENAk/84HjxwOHFz3WAAOQmqXAeD2AMENkAFQQQIQxQAEEM0AApDBABCiHAD+tyj9iN +uJjbsQLv/bhzAYUMuAQggA8BAADwAaUM8CGFz3CAAMQ5IKAjhc9wgAA3HyCoA8zXcAAAAEAB2MIg +CgAXuMdwAA4AAIO4nbifuOxxAKEBEgE27HAgoJoL4AAB2IEBT/zgePHAANjPcYAA9CYAoQGhAqHP +cND+AAAEoQAWAEAAFgBAABYAQAAWAEADzNdwAAAAQAHYwiAKABe4x3AADgAAg7iduJ+47HEAoQES +ATbscCCgPgvgAALYXg1AAtHA4H7gePHAABYCQKHBQMIBFIAwDwgeAM9xgADslQTwz3GAAHC3QKFg +iQHaCPAAFgBAFSGMAACkAeJ9ePUIhYAXCx4AABYAQQPwANgVIYwAAKQB4vkKVIEDzNdwAAAAQAHY +wiAKABe4x3AADgAAg7iduJ+47HIAogESAjbscECg0grgAAKJocDRwOB+4HjxwOHFz3WAAMAKqXCq +DWAMCNkAhc9xoAC4HgKhAYUDoUIKwABtAE/8OQLAAPHApMGLcIYNYAwQ2QPM13AAAABAAdjCIAoA +F7jHcAAOAACDuJ24n7jscQChARIBNuxwIKAAwFEgAIADwAb0AsHmDuAAANoF8LYOIAIBwS4KwACk +wNHA4H4JAAAABQAAAPHA1gnAANkGgArgePHA4cW0wYt1qXBqDWAMFNkAwIbgzCDigQb0CgvgAqlw +CHEj8A8IkQBaC+ACqXAIcRvwEQhRAFYL4AKpcAhxFfCD4MwgIoIH9NIK4AKpcAhxC/ARCBEBJgvg +AqlwCHEF8DsIUQIB2QPM13AAAABAAdjCIAoAF7jHcAAOAACDuJ24n7jscgCiARICNuxwQKCCCeAA +KHBlBy/8tMAKIcAP63J82I24d9uLu0okAAAlAO/9CiUAAfHA4cWiwYt1qXC2DGAMAtnOCuACqXAC +CcAALQcv/KLAABYAQPEAwADxwOHFz3WAAEzUqXCKDGAMA9kBhc9xoACAJQyhAoUNoQCNUSAAgADY +jrgE8g+hA/AQob4IwADpBg/84HjxwG4OL/wV2c92gAD8o04MYAzJcJ4IwAABhs91gQBkJGILYAIA +pQQWBRArDRAAABYEEEwkgILKIsUHyiCFDwAA+yrKI4UPAAB1AHAHpf3KIcUPCBYEEEwkgILKIcUP +yiLFB8oghQ8AAPwqyiOFDwAAeABIB6X9yiUlAAOGGQjeADYPQAUIcc9wgABIQcYKAAsC2APwAdhF +Bi/8BKXxwM4ND/wAFgRAz3WAAHCldB0AEYwkAYnKIc0PyiLNB8ogjQ8AAP4qyiONDwAAxQDsBq39 +yiUtACEMdAAA3s93gADYpUAnABN2C2AMCtkB5h2Fz37xDgSQvg+AANkFD/zPcIAAiLWpBqAAiiEf +BOB48cBiDQ/8ABYEQM91gAD8o1QdABFMJICCyiHND8oizQfKII0PAAD9KsojjQ8AAKoAfAat/col +LQAA3gzwViXBEhNuFXg4YAoLYAwK2QHmz34Vhe0OBJBSD4AAdQUP/OB4z3CBAGQkIYDPcIAAiLXM +GEAALQagANTZ8cDiDC/8BNmjwQDeQsZ2C2AMi3ADzNdwAAAAQAHYwiAKABe4ACCBDwAOAAAGFAAx +G3gT4AQggA8AAPz/JXiduJ+47HEAoQESATbscCCgAMHscCCgBBQBMexwILAGFAEx7HAgsAYUBDEb +DB4AARIFNgohwA/rcs9wAABPJrkFr/1p2+YNYAMB2ALBAMUleELAz3CgACwgQBAQAMC9AeUD8AHm +BhQAMYEOAxAEFAAxgsctDZEQG3gQeOlxtg5gA6ly7HEAqQQUADHpcRt4AeAQeJ4OYAOpcuxxAKkI +8Olxkg5gA6ly7HEAsQQUADFAIEUAz3CgACwgEIAvJUgBAiAABNdwAQCghpwH5f8EHEQxCBQEMAoh +wA/rcs9wAABQJhkFr/2M2zINQANKDqAAAsAZBC/8o8DxwAAWhUCmwQ0NMwYAHEIxGw0TAgohwA/r +cs9wAABmGZXb4QSv/UokQAAAFoBAARwCMAAWgEACHAIwABaAQAMcAjCLcPIP4AWBwQLCjuoAFIUw +CiHAD+tyz3AAAGcZn9uhBK/9iiTDDwTAYHoFwQPBi+kKIcAP63IAFIUwz3AAAGgZo9vu8QHAgODj +IEIAyiAiAGoNgACmwNHA4H7xwM9wgAAsNv4IYAwJ2Z4OgARmC4AEnguABEYNgADRwOB+4HjxwM9w +gAAwONoIYAwH2S4NgADRwOB+4HjxwKXBi3DGCGAMBdkWDYAApcDRwOB+4Hg1A+AFANjgePHAz3CA +ANA5TghgDCjZ9gyAANHA4H7gePHA4cUAFgBAz3WAAGAiAKUPCJEAANnPcJ8AuP89oM4MgAAghUEJ +VQEzJkFwgABURkAnAHI0eAB4KgggA1TYKQheAM9xgAAEOgCBgbjyDaAMAKEK8HIPr/4B2JIIAAME +8N4MAAS1Ag/88cDCCUAIfgyAANHA4H7gePHA2gjgCADYz3CAAJwoyBABBsC5geEB2cB57gmgDDwQ +gADRwOB+4HjxwOHFz3WAAJwoAIXEEAAGHQheAQohwA/rcoXYjbiKI5wPSiRAAC0Dr/24czYKAApG +DyALAdjPcIAA5CsIiD0I0QEBhcQQAAYxCF4BRgjP/c9xgQAwHQSQJYEKuB0IQAAKIcAP63KG2I24 +iiNdAkokAADhAq/9uHMmDA/9kg6gCgDYggzAAsYLgADxAQ/84HjxwG4J4AgA2G4Kj/3PcYAACMQC +iToJoAwgidHA4H7gePHAosGLcOoOIAwI2QDAz3GAAEQ6AKEI6AYUADEDsQQUADECsXYLgACiwNHA +4H7gePHAGgkv/IHYocFgwAPMAN/PdoAApAoCHAQwz3CgACwgQBARAACGARzCMxDoz3GAAHAKAIGB +uAChz3GAAFA6A4EB4AOhAdgD8ALYGnAAwLYOb/wKcc91gABQOgMSATdelYHYYIYuD6AMCiQABM9w +oAAsIBCAQB1AFBGlSB0AFJcIkCAAhicIEQLPcIAAmEIODcAKkgyv/hTY7g4gBATY4KbPcIAAqArg +oADYCwhQAQDYCPDPcIAAqAoAgPcIEYEB2C8mB/AN8q4JIAMU2Inoz3CAAHxCJoAjgSCBMg3ACgCG +A+gA2Afwz3CAAKgKAID76AHYLyYH8AX09g5AAgvoz3CAAHAKAIAvKAEAtgrv/U4gwAdpAC/8ocDx +wAIIL/yA2KHBAxIBN2DAz3OAAKQKYIPPdYAAUDoCHEQwL6UockogACABHAI0Tg6gDAokAATPcIAA +6C4QEAUAGw2fAAAUBDAKIcAP63LPcAAAdicFAa/9ZtvPcIAApAoAgIDgdAICAHIOwAmA4GwCAgDP +cIAAMDgAgFEgAIFcAgIAz3WAAPzkqXAeDSAMiiELDwIVhBBEJD6DDfQDEgU3CiHAD+tyz3AAAI4n +rQCv/XfbQSzBAMC5z3eAAG4KIK+pcIQpHwAAIYF/gAB81WYPIAq/2mCPCiGAL4AAmNWEKx8AACGC +f4AAfNUFkoYgfwwceFMggIAI9M9xgABwCgCBhrgAoQKKzwhfAIQrHwAAIYB/gAB42JIMIAwY2QCP +hCgfAC9wNCENIEIlBBaMJAeBzPcKIcAP63LPcAAAgSeY2xkAr/2KJQcBz3aAALTY2GBWDCAMiHEA +j89xgACACoQoHwAyJkUeACZAHgChGw0QAAohwA/rcs9wAAB3J53b3Qdv/Yokgw+hiM9xgACECkAl +hRBAJYIfHw30CECpCiHAD+tyz3AAAHgno9uxB2/9iiSDD89xgAA01cYNIAqocgCPhCgfADQhQS7P +cIAAbAogsB/wHBIEAYwkCIDN9wohwA/rcs9wAACLJ6zbcQdv/YolCACEKx8AACGAf4AAeNiqCyAM +iHHPcIAAWNUgGAAEANky8AAWAkCEKx8AACGAf4AAyNsw4DV4QKAAFgJBACGAf4AASNww4DR4QLAA +FoBAACGNf4AAaNpSaVR6umIQqhGqEqoAFoBAFKoVqhaqABYAQQAhgn+AAITcNXoasgAWAEEB4Ruy +YI+EKx8AACGAf4AAfNVDiI8JpIAvdQAlgR+AAPjbACWCH4AAeNxaDsAGQI8ByIQqHwAAIYF/gAA4 +3QChAMA6C2/8AdnuDEACgOCkD4IMAxIBN89wgACkCmCAgNgockokQAAZ8ASFAeAEpc9woADUAxyQ +ngkAAQDA/gpv/ALZAxIBN89wgACkCmCAgNgockokgAB2C4AMWQXv+6HA8cAKIcAP63LPcAAAMCWK +I4wHiiSDDzUGb/1KJQAA4HjxwOHFINvPcaAAyBxpoQAWAEDPcqAAEBQMogAWBUAB3UwlAIDKIcEP +yiLBB8oggQ8AACwlyiOBDwAACQHsBWH9yiRBAxgaQAFoGUABA9gPormhaqHODkAA+QTP+/HA4cWt +wYt1qXBmCiAMDdkAwB14UyABAEQpPg2pcAAhgX+AAAjwggwgCg3amg5AAMUE7/utwOB4/QSgDADY +4HjxwD4M7/sM2azBJgogDItwABQAMa/oz3WAALAvIIXPdoAANDFgeQDYQCSPMCMIEAMghWB5ANgb +CBAEIIVgeQDYDwhQBCCFYHkA2A8IkQTpcMlxGNoE8OlwyXEu2lYLAAoB2GAeAhAXhoDghAph/Mog +IQAAFAAxKQhRAEAkgDDPdYAANDFAJYEbKgsgCi7aAdg3hWEdAhCB4VQKQfzqDUAABQTv+6zA4Hjx +wIoL7/sX2bfBfgkgDItwI8BKIkAgUyDQAIYg/gNCKBEBJQgyJAwcAjQKIcAP63Jy2I24iiMPAwok +gASpBG/9CiUABEgUBTAgwEAojiDPdYEAyBTWflEgAIDAZUEtTwPAv75mhiD3D1z0jegKIcAP63Jz +2I24iiPPBG0Eb/0KJAAEiiBPBQpxQgtgBKhyAcACwQpy4gwv/GZufwgQAOlwSg5gDApxDRSAMIUg +wQANHAIwiiD/D1PAAIapuACmEsCGIPsPKLgPrkokAHQA2KggAAP/2rtgQCiBIDZ5EuM7Y0CrAeAK +cDYNYAyLcc9wgACcKPAgwQPAEQAGDyAABMAZGAAPjg8IUQCA58wgoqPIDIIMAd8C8ALfpg7gAQpw +B/CA4MongRTKJyISgee49CCGz3CAAJwoA4AYiCh1hiX7HyEIUADuCUACIIYZ6M9wgADkKwiIJwjR +AUEpQAMfCB4AE8ASwhcIHgKGIvsPQSoEAk+OCwoAAai4U8ATwBLCBnlEeCV4AKaGIPsPC+2A4Mog +AQTKISEAbAshA8oi4QMOHkIUANjPcYEACBgWIQEEQIYAoQGhCwpfBQDYi7gBoQ8KngUBgUUgAAYB +oVYOb/2LcA0UgDA/CF4BWBQAMQW2WhQAMQa2BZYX6FIJQAIO6AaWEwheAJ4Kb/0KcOYLgAwF2BKu +ANgFtgfwCnAA2fYKIAMP2g0UgDA1CF4AUBQAMQK2FOgA3RDYOnAClhEgQIPKIAIEyiFCA8wKIgPK +IkIDQiFAIOcIdYAB5Q0UgDAPCB4BCnDOC+AAVRSBMA0UgDA7CN4ANcFWFAIxCnAmDq/9EsOMIAKA +uHAN9AohwA/rcnTYjbiKI5IPYQJv/UokQABRJcCByiciEe4NYAwKcAPM13AAAABAAdjCIAoAF7jH +cAAOAACDuJ24n7jscQChARIBNuxwIKBeC2AA6XAdAe/7t8DxwLII7/uKIFMJpMEA3alx6ghgBKly +z3aBAIgcAI5KJEAgoa4CHgIVAeAArqOuoaaipqSmpaa4rrmuAcC6rgLBB6YDwCimCaaBwG4O4AsB +2QHAB6Z6dYnwgsBeDuALAtkBjgPBAd/jrgHgAa4CwCmmCKaWDS/8i3IEIAAFLyQHoALZI64CrgDB +IaZt8hJpFnjPcoEAyBQAYkohACAPIVEgLbhTIBAAiiBUBVIIYAQKcs9xgADsCUCBLyJKJPiuEB5A +FAQigKAUHgAUAKED2SOuQqYDpgb0BupSDuADINj5rgXYA64gwGoK4AAQ2QDAMmg2eQAhgg+BAMgU +iiEIAKKyIKIG2SOuANkqCSADD9oAwoDZEmoWeMdwgQDIFCioKagH2AOuz3CAAJwo8CAABM9zgQAI +GFZ7wBABBgQhgQTAGFgAANkgo89wgQAoFCGjVHjCCaAMoLAH6LIJgAwI2AOu+q5AI1MgIcBycPAG +zf8J2AOuA8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4nbifuOxxAKEBEgE27HAgoNYJYACKcArYA65h +B6/7pMDgePHAiiBVCwDZRg8gBChy0gsAClIJQADRwOB+4HjxwOHFABYNQAPMAdrXcAAAAEAByMIi +igAXusdyAA4AAJ4MIApTJQEQUSVAkM9xgAC4OwHYyiAhAD0Hr/sAoeB48cChwYtwqgzgCwHZABQF +MBkNEQAKIcAP63KJ2I24RdvtBy/9SiRAAM9xgAAU0gMZQgFALYADAqFKJMBwANqoIIACANgPIIAA +CyBAgQP0AeID8A64AaGyCEAAocDRwOB+8cBGDo/7ABYSQQAWAEHPcYEAyBRAKoAgFngwIQUAosFB +LUADIwo0JFMgEwAKIcAP63J12I24iiMYAkokQABxBy/9SiUAAB0NXgIKIcAP63J22I24iiNYAlUH +L/0KJIAEz3CBAAgXFiCABBpw4gvgCwLZz3CBAKgTFiCABNIL4AsC2UAqlSEAJYAvgQCIGMIL4AsQ +2YtwugvgCwHZACWAL4EAiBhKDSAGENkBEIAgIQgSBAohwA/rcnfYjbiKI5gKSiRAAOkGL/0KJYAE +AN0Q2DpwFSVAI89xgQCIGDAhFAAEJIKvAAAAAQQcADVI8kQkDiYjvgHmBCSALwYAAAAxuCHB32Cg +4dEk4aI18gPqFw6VEAQkhC8AAAAkWwyADwAAACRTCNUADQiRACXqRw6REATqzOE+AAkAz3CAALgv +IIBgeQbYLwiEA89wgACcKPAgwATDEAAGAdkEIL6PAAYAAAQkgC8AAAAIwiFBACu4CwkFAADYAvAB +2A94BPAB3+lwBCSBLwEAAMAuuc9ygAA0XiliMHcB2cIhTQCA4MwhIoAW8kIhQCAtCHWAAeUCEIAg +z3GAAHBUCGE5CFAACiHAD+tyediNuIojGQA58QohwA/PcIAAnCjwIMAE63KKI1gPwxAEBnjYjbjF +BS/9CiUABQMQgCAIYRcIkAAKIcAP63J62I24iiOZAhnxQglgDEpwz3CBAKgTFiCABCCQz3IAABgV +CSGBAIIOIAAgsGkEr/uiwOB48cAAFoFAz3CAAMhDIKgAFoRAABaBQM9wgADRQyCoABaAQFAkvoHK +IcIPyiLCB8oggg8AANoUyiOCDwAAgQc8BSL9yiUiAM9wgAB4CQCQBuhmCgAMigkADBoOAADRwOB+ +uQWgCwDY4HjxwMYLr/sA2UokAHKoIEACABYCQBUiQDAOGJgAAeEAFg1AABYOQFIKwAvPcKAAFASs +oM9woADUC9yg0g0AAPUDj/vgePHAeguv+wjZosEBEg42z3WgADguHBUQEAIJ4AuLcAAUBDAA3wQk +vo/w/wAAyiHCD8oiwgfKIIIPAACmKMojgg8AAOEGiAQi/colwgBRJECCyiHCD8oiwgfKIIIPAACn +KMojgg8AAOQGZAQi/colwgDnpW4NYAw/2ADABBQBMQelfg+gC4K5HB0AFD4NIAABGpgzTQOv+6LA +8cAA2JoMIAAEEoEwBBKFMAohwA/rcjjYiiMPARkEL/1KJAAA4H7gePHA4cWhwR/di3CmCOALBNlh +vfkNVZDyDAAAHQOv+6HA8cCpwYtwNgngCxLZ2gwAAKnA0cDgfuB4ABYAQAAWAEAAFoBAABaAQAAW +AEEAFoBAABaAQAAWgEAAFoBAABYAQQAWAEEAFgBAnQQAAPHA4cWhwQvdi3A6COALBNlhvfkNVZCG +DAAAsQKv+6HA8cCtwYtwHgjgCw3ZbgwAAK3A0cDgfuB4CQSgCwHY4HjgfuB48cDPcIEADCP2D6AL +BtlKDAAA0cDgfuB48cD2Ca/7QtrPdoAAcITPcIAATIIKCuAJQCaBGc93gQAMI0AnABJAJoEU9gng +CQTaApfJdRG2A8yKJMFy13AAAABAAdjCIAoAF7jHcAAOAACFIAQNnbifuOxxAKEBEgE27HAgoADZ +qCAAAvAlQhDscECgAeHpAY/78cDhxc91gAAAgqlwYg+gCxPZtgsAAC4PYAmpcAHZz3CAACgJ0QGv ++yGo4HjxwFYJr/sB2aHBOg+gC4twAMDPdYAAoIUAFQUQoHAQeJTgyiHJD8oiyQfKIIkPAAC4Icoj +iQ8AAJAAaAIp/cokaQAA3gzwIIUEbdlhhCkCBSdw8g6gCyXZAebQfgDA6w4EkDoLAAASDyABABQA +MQCFAME4YAClTQGv+6HA8cDPcIAAKAmmDqALAdkSCwAA0cDgfuB48cDPcIAAVIOODqALStn6CgAA +EgqACtHA4H7gePHAz3CAAEyCig6gC0LZ3goAANHA4H7gePHAz3CAAKCDWg6gC9DZxgoAANHA4H7g +ePHAocEA2UDBABYCQAAWAEA1ClAAA8zXcAAAAEAB2MIgCgAXuMdwAA4AAEUgAAOduJ+47HIAogES +AjbscECg7HAgoB/w1gygBYtwA8wB2ddwAAAAQAHYwiAKABe4x3AADgAAhLiduJ+47HIAogESAjbs +cECg7HAgoADC7HBAoIIKIAAocKHA0cDgfuB48cDmD2/7AtnPd4AA5EN2DqAL6XBAh892oADsJ891 +gAC4L5cKHgArhkQigACGIv8OIrqhuRS6tLkFIIMAZXkrpgQggA8QAAIABCKCDxAAAgDPcYAAjAhF +eAuhIIUE3mB5yXAbCNABIIVgeclwDwiQASCFYHkB2CUIUQAAh89xoADIHBEIXgAB2B6hhg3ABQbw +ANgeoUYLgAUghWB5AdhpCFEBAIdhCN4Az3CgAEQdxaDDoMSgKPDPcKAAyBwB2T6gC4aBuAumSg3A +BSCFYHkB2CUIUQHPcIAAnCgDgAiAGQgeAADZlLnPcIAAjAgroAuGlLgJ8M9wgACMCADZK6ALhrS4 +C6YqCQAARQdP+/HAz3CAADAebg2gCwLZFgkAANHA4H7gePHAxg5v+wDaCHUods9woADUCziAQiEB +CIDhyiGMAEAmABIQcfwOBQwDzNdwAAAAQAHYwiAKABe4ACCBDwAOAAAHbgQggA8AAPz/JXiduJ+4 +7HEAoQESATbscCCgIr4G8OxxAKEE5WG++Q61kACF4ggAAMEGT/vgePHA4cXPcqAA1AsD3bGiANtw +ogMSAjfXcgAAAEAB2sIiigAXusdyAA4AAEUiAgadup+67HNAowLaFBqCMAUSAzbscmCiCxICNwHi +CxqcMOxyAKIBEgI27HBAoOxwIKDPcKAAsB8B2Tmgz3GAABAnCIFAgOxwQKAMgQCAXggAAM9xoADI +Ow6BiLgOoTkGT/vgeAPM13AAAABAAdjCIAoAF7jHcAAOAABPIIEAnbmfuexwIKDPcKAAFAQD2SWg +ARICNs9woADUC02gz3CgAEQdNaDgfuB4A9rPcaAAFARFoc9xoADUCw2hz3CgAEQdVaDgfgPaz3Gg +ABQERaHPcaAA/AsMqc9woABEHVWg4H7gfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44cXhxs9w +oAAUBAPZI6ANyM9ygAA002GSz3GAACTSxIoUIQ0AaLUAIIMPgABE0jjhwKtighV5BpJgoQMSAzbA +HQQQBIKgEwEAhiHDDyV4oBsAAMHG4H/BxfHAzgxP+wh2XgzgASh1gODRJWKTAdgD9ADYBLjPdYEA +UB0UeAllHWUVCVEATg+gCqlw1gkv/gGNANgArQGF/QRv+wCm8cB+DE/7osENEgI2z3OgALwtz3CA +AJwoTqMkgADdRhERAQ0SEDdWIQYFRiDAIAMSDjYNGhwwpBYAEIS4pB4AEAGWViGIBFYhRwSGHkQT +COjPcIAAJNP0IIAACegBhg8InwNQIAAgLyAIIFMgfqBIAwEAz3CAALg7aRAABs9xgAC4OwHgaRkY +AAQSATakGUADAZaPCBAAz3CAACTSVHiAEA8Hfw8RENAQAwFTI8OAFfRyFgMR4JZif7gWgxBif/B/ +4BjEA6QWAxCGI/OPBfJov/B/4BjEA3AWDxHgEAABYZbiePFwwicOEMIjzgN0FgARG2O4FoAQdBlE +A6CxeGAQeJAZBAC+GQQAEI4A2xCpAYYBoQiOCKkSjhKplrsw8A+D/wjehW+DUyPAAlULngUhCJUD +z3CAALg7pxAABra7z3aAALg7AeCnHhgQGvBkuBB4kBkEAAQjgA8AAADwLLgQqXQZRAOgsaGxvhlE +AwGGqKmGIP8NhLgBoRKOEqn2uzgCAQAA2Ja4pBkAACkLXgW2CO/+ANgEEgE2pBEAAAQggw8CAAAA +LbsFIwIELyCIID7wAYGlCB4BcIlPekkiwADPcoEAyBTya/Z/4mLSiREKngXPcoEACBd2ekGKA/AA +2sdwgQAIF3Z4BIgIJg4QCCaCEEkiwgMWa1V4z3KBAIgYAGLPcoEACBh2es9zgACcKGSDeINBgmV6 +BCKCDwAAAAhGeJgZAAAA2Ja4QYGGIv8NQwgeBaEKEACYEYIAQCcACUhgz3OAAIi3QMAgwsO6XHr0 +I4IAUvAKIcAP63I02Iy4X9sFu4okgw9xA+/8SiUAAJgRAwCcGUADSQteAoC4pBkAACjqmBGAAM9y +gACcKEOChiD/A0S4MiYAAIm4QMAgw1SCZHqGI/8DhiL/DkS7emJPes9zgADIVPQjggAe8BMLHgII +6pgRggBAJwAJSGAL8IXqANpIcBDwmBGAAMO4HHgyIAAQQMAgws9zgAAwt8O6XHr0I4IAiBkAAJgR +AACEGYQAkBEBAboIIAAA2gQSAzYDEg02z3agAMgfhBMCAYIbBAAaYlB6sBuEAPgWARCwFQARIngA +IE8Ez3CAAJwoBIBUEAEBP2dfZ6AWDhDwfzsOxBMQgJgVDhALIICDF/RwixCNcHDRJiKSGvKGJv8Z +QS7DEAHjKQuUAAK4FnjPc4EAyBQAYxkIXgTPcYAAuDu4EQAGAeC4GRgAEPBZYTB5hh1EEM9xgAC4 +O2oRAAYNGhw0AeBqGRgAKQFv+6LA4HihwfHAvghP+wh1RsDovShwzgAhAEh2A7hAIJAFRCUCFiO6 +BCWPHwYAAAAB4kEvQBQEJYEfwAAAAFhgNrnPcoAAAF6pc8a7KWIIYjhgQS2BElIhAQDAuQO5GOGF +4MohjQ8BAIkN1SEOAC8hSCAEJYEfAAAAGM9wgAAcVtdxAAAACB4AIgDwIMAAJsGg4RIAAQDPcUJ7 +0F4FKH4ACiDADgpxBSk+AAogwA4kuAHgBO9TIAEAOGACKYEjIQ1eE89ygABYV0CSBSo+AAAhgH8A +AP8/LrhfACAAGWFXACAAFXlRJUCSVgAhACbFt+UiAAsAM2hTJQIQz3CAABBV8CCAAAUpPgAKIMAO +AeAG8IrlwCjhAMAoogDPcYAAnCgjgcDaNIGkeYYh/w4iuTp62noZYjB4CNzzBw/7M2hTJcAQHHjP +coAAnFfwIgAAFuEFKT4ACiDADgHgFNmFB+//2nnPcYAAECckgUEoggXVuCCBQSmDBdW5AnnPcIEA +MB1iegWAyboFKL4AJ3HPcIAA5EIDgACA4H84YM9xgAAQJySBIIFBKIMF1bhBKYIF1bkZCSUAW2PP +coEAMB1FgllhAnkB4wPwAnlAK4AFmQfv/yV48cCqCU/79g4v+1DZRcBKIAAgCgmv/obFIwg1JQQV +ARQFwBUgAAQgoEAgUCDtCYGPrd7vviTcKwcP+wohwA/rcs9wAACLE4ojBwuYcwEA7/wKJQAE8cDh +xZhwGQj0ALhxCiHAD+tyfdiNuOUHr/zw289wgACcKPAgAQGKIwsNQCECBnhiTw0RAKiBemKgokmB +QaBciUioXYlJqCoRggBKqCsRggBLqCwRggBMqE2RR7BXkUiwSIEEIoIPAAYAAIDiAdrAelKoVJFT +qCiBwLktqBrwOQ1RAGJiSKFBgEmhSIhcqUmIXalKiCoZggBLiCsZggBMiCwZggBTiFSxR5BNsQiQ +F7FxBg/7CiHAD+tykNiNuD0Hr/yKI4QH4HjxwOIND/vPdYAABJYEFQUQQiVBAIXhNgEtAKLB9SZB +cIAAGEZAJwByNHgAeALYAKUB2c9wgADIJiCw7gugCChwAoXPc4AAjCYog0eDCBMEAA8gQAACpc9w +gABsJjV4QKAYEwUBDBMGAM9wgADUNgDZNKjPcAAAYKBAwAWDEBMHAEHAGos7i0CDDg9gCWGDXPDP +cIAAyiYB2SCoz3CAAIwmJ4DPcIAAeNEvoF4K7/0C2ErwBNgApQDYz3eAAMgmagugCAC3z3aAAIwm +AoVIhmeGDyCBAM9wgABsJlV4YKAipezYNg2gA0CXCBYEEM9wAABgoBgWBREMFgYQQMAFhhAWBxBB +wBqOO45Aho4OYAlhhiQWgBBIhgDZUSAAgQSFDyGBAAryAdvPcoAA1DZ0qgV5JKUE8CZ4BKW6CqAD +ANgE8MYOz/wFBS/7osAIFQQQCiHAD+tyz3AAAEIf2QWv/IojRAfgePHA4cUB3c9wgAAElqCgANjP +cYAAyCauCqAIALFeDCAAqXDVBA/74HjxwOHFANjPdYAABJZaCCAAAKVGCO/9Atgihc9ygADIJnfY +agygA0CSpQQP+/HAKgwP+wDez3eAAMgmwLdeCqAIyXDPdYAABJbCpcOlxKWKIMkAyXE2DKADQJcB +2GEEL/sApeB48cDPcYAABJYAEQUAGw1UAQohwA/rcs9wAABBH5nbJQWv/Iokgw8Boc9wgAC0JvAg +QAFAeNHA4H7xwLoLD/vPdYAABJYEFQUQosFJDVAAIw2QANENUAEIFQQQCiHAD+tyz3AAAEQf3QSv +/IojRwbPcIAAyiYB2SCoz3CAAIwmJ4DPcIAAeNEvoI4I7/0C2EzwBNgApQDZz3CAAMgmILCaCaAI +KHDPdoAAjCYChUiGZ4YPIIEAz3CAAGwmVXgipWCgZgugA4oghgsIFgQQGBYFEc9wAABgoAwWBhBA +wAWGEBYHEEHAGo47jkCGvgxgCWGGJBaAEAHfSIYA2VEgAIEEhQ8hgQAI8s9ygADUNvSqBXkkpQTw +JngEpeoIoAMA2ATw9gzP/DUDL/uiwOB48cDGCg/7z3aAAASWBBYFEEIlQQCE4eYADQAzJkFwgAAk +RkAngHI0eAB4AobPcYAAjCZIgSeBDyCAAAKmz3CAAGwmVXggoFnwz3CAAMomgNkgqM9wgACMJieA +z3CAAHjRL6CKD6/9AthH8AqWjCACgBH0ANjPdYAAyCaSCKAIALUihoogBQR2CqADQJUB2ACmM/AD +2ACmMfADhowgw48B3xL0ANjPdYAAyCZiCKAIALUihoogRQrgpkIKoANAlS4Mz/wb8ADZDyEBAAKG +BiBAgBL0ANjPdYAAyCYyCKAIALUihooghQwWCqADQJX+C+/84KYD8AKmOQIP+wgWBBAKIcAP63LP +cAAAQx8NA6/8iiNGAOB48cDhxc91gAAElgQVBRBCJUEAkwmVATMmQXCAACxGQCeAcjR4AHjPcIAA +yiaA2SCoz3CAAIwmJ4DPcIAAeNEvoJYOr/0C2C3wAoXPcYAAjCZIgSeBDyCAAAKlz3CAAGwmVXgg +oB3wA4WMIMOPAdoJ8gDZDyEBAAKFBiBAgA30z3CAAMgmQLByD2AIAdgD2EoL7/wApQXwAqUD8AHY +AKWNAQ/7CBUEEAohwA/rcs9wAABFH1ECr/yKI0gL4HjxwOHFz3WAAASWA6X6DO//Bdgjhc9ygADI +JqDYDgmgA0CSTQEP++B48cDGCA/7z3CAADygCIDPdYAABJYA3ye4wLgTeMa4AeAKtQjYOnAA3gKF +DybOEwsggIMt8gSFCyCAgxnyxngEpc9wgAA8oAiAD3kjCVAAz3KAANQ2MIqGIMMPgLgB4S95MKrP +cYAAPKAIoc9wgABsJhUg0AMAEAAggODiIAIAAoUA2QAYQCDGeAKlQiFAIAHnlQh1gO9/SpXPcIAA +yCYgkIHizCEhgAf0ANrPcIAA1DZUqAGFEQhQAYHhA9jKICIBHgzP/2EAD/vPcoAABJYiggDbDyMD +AGZ5IqLPcYAAbCYA2hV54H9Aoc9zgAAElkKDDyJCAEKjz3KAAGwmNXrgfwCi4HjxwM4P7/oZcQh1 +iHbPcYAAjCYaqRsZAgJAoRAZwAEMGYABwqEDwBgZRAEExgehJsDIoSQZAgAHwGGhBaFT2Klxvg9g +A8lyJsATCB4AV9ipca4PYAPJcgbYBfCB5QLYyiBiAHoLz//VB8/64HjxwFoPz/oacM92gAAIJwCG +AeDPd6AAyB8AphEIUQAB2FEfGJDWDYALpBcAEM9wgABsMCaAz3WAAOzDYHkA2AGFKegk2BjZ1g2g +CzPaHwhQAAQVBRAKIcAP63LPcAAAdBnA200Ar/wKJAAEJNgB2a4NoAsz2h8IUAAEFQUQCiHAD+ty +z3AAAKsoxdslAK/8CiQABACGQiBAgACmBfQA2FEfGJAdB8/64HjxwLoOz/rPcIAAbDAEgCXoz3WA +AGQ5MoXk4cr2z3aAAPRDAIba4MogKwGM9trhVfbPdoAA9EMAhuTgz/aKID8P5giACyCGSBUAERC5 +Dg/v/yV4EoUAptEGz/rgePHAz3CAACAJAYBRIACAIAgCANHA4H7geIHgh9jKICIAz3GAANg+4H8B +oeB4z3CAANw/AIBCIACAyiBiAAfoAdnPcIAANR8gqAzwz3GgAKwvGYHwuBmBzyCiA88goQIZoeB+ +4HjPcIAAhDhAiBEKHgDPcaAArC8ZgYq4GaERCl4Az3GgAKwvGYGOuBmh4H7geM9xoADIOx2BB+iC +2BShz3AAgBEUDqHgfs9wgAAM1GyIz3GAAGSWjCMCgAqRQSgCAwzyGQjfAgK7dnvHc4EAyBQCkw8g +gAACswDY4H8MseB48cB6De/6VGiGIvgDTyJDAlMhwgAFIsQAz3KBACgUFHqP4YojDwzKICkACfYA +kgDdDyVNEIojzw+meACyANlKJAB0z3aAAHyZz3KAAPSZz3WAAPiZqCDABBQiQADkkGR/GQ8BEQDf +5LAWJkAQ4KDhoEAlABk1eOCgAeFpBc/64HjxwADanroA2c9woAD8REGg4HghoC4I4AgocAvIBCCA +D/7//wMLGhgwC8iHuAsaGDDRwOB+8cDKDM/6SHaA4AHdRPaKJf8fE3gJCRMAs30zeRQhAABiDu/6 +O3mseAAeQB4JBe/6AdjgePHA4cUIcgHdgOHKIcEPyiLBB8oggQ8AAJsTyiOBDwAAXADKJCEAvAVh +/MolAQGA4kT2U3qKJf8fCQkTADN5s30UIYAACg7v+jt5rHi9BO/6L3DgePHA4cXPdYAAZJbPcIAA +nCgjgECFAIFDCgEAApFClTsKAQAChcoMb/wjhYwgAoAV8s9ygADoCSGCANsPIwMAArhmeRZ4IaIA +IIEPgQDIFACBqriIuAChANhdBO/6DLXgePHA4cXPcAAA///PdYAAgJYDpc9wgACAQT4IwAnPcIAA +nEE2CMAJz3CAAERCKgjACc9wgABgQiIIwAkA2SClBdgBpSKlmg9v/QbYlg9v/QnYBQTP+gfZz3Kg +ANQHGhpYgA3oGRIBhgkgQwAPEgGGAiDAgHlhDxpYgPX14H7xwGILz/oDEgM2CHcNEg42z3GAACTS +EIvPcoEAyBTUeQK4FngFYjGJLb1YYMC9DOkhgxUJXgPPcYAA1Ce0eaCREOWgsSWQIwlSAGG5JbAQ +izJoNnk7YmWTOmKH6yaSUSFAgPwLQvyKDMAK/gzgBQ3IA8gB2aAYQADPcQ8A//++CCAA6XBFA8/6 +8cDaCu/6A9nPcqAA1AcTGliADxIDhgAWAEAAFgBAosFAwCDAHwgQBwohwA/rcjXYjLjPcwAA9AyY +c/EDb/xKJQAAABYNQLB9ABYAQEDl9LjAJaIQA+UEJY0fAAD8/xkSDoZCJQ8U+w7Ek7tjDxrYgCAa +WIAZEgGGKQkUAh8SAYZBwSHBnOHKIcIPyiLCB8ogog3KI4IPAAARDc8gIgPO9QQggA8AAABAmQLv ++qLA4HjxwCIK7/rI2oIkAzIIdSh2z3GAAGhI2grv+otwAdrPcKAAFAREoM9ygACwPBiCANkB4OK9 +GKLKIEIgBfQWD8//GnANyM9xoABkLs9yoAA4LvAhAAAngtO4JHgEIJEDofDyDs//GnCd8APfz3Cg +ABQE8KDkoAAWBEAHGhgxABYFQAEaWDEEyj8IEQeLcI4P4AoO2STBUyHAAIYh/gNEucQcQjBkwEQm +jRQxDl4QjtiQuKAcADDZDh4RhtiQuKAcADBm8Otyz3AAANwOz3MAAPQKqQJv/AohwA8PCBAgjNiQ +uKAcADBU8AK4FnjHcIEAyBRAgEh0hCQMkAzyEwpeAovYkLigHAAwAd1C8IjYkLj78U6IUHHKIIIP +AACRAM8gIgTx9QHBEQmeBgHdkNiQuKAcADAu8CKQMxSAMC0JDgAHyAQggA8AwAAAHQiBDwDAAAAi +wIDgyiCJDwAAjQCmB+n/zyApBArBjCH/jxLyz3CgACwgEIAieNdwAIAAAMoghQ8AAIcAfgfl/88g +JQRMIACgzCUhkGb1z3CgABQE46BMIACgqXZi9VMmfpAI8s9woAAUBAmAgOBa9WUOXhAB2lcJECAq +cS8oQQBOIIMHlOPKJcUQhfdodYAlwhTPcKAAaCzwIEADlOMPeMonxRCE92h3gCfCEc91oAAYLPAl +zROxcMoiIgAJ6gDYDyDAAAYhAYDa9QHYAvAA2IDgKPNlAO/6gCQDMvHAAgjP+hpwvg2gATDYmHAp +uFEgAIDKIcIPyiLCB8oggg8AAOkUyiOCDwAAxwAoAWL8yiUiACzYzg2gAUAogSAB3oolDxqCDaAB +MNiYcCm4GQgeAIwmD5om8koOYAsB2GG95w11kAHmXg2gATTYTyABBZW5kg2gATTYTg2gASzYCHVG +DaABNNi4cDMIXgUKIcAP63LPcAAA6xTj27kAb/xKJAAACiHAD+tyz3AAAOoU1NulAG/8SiUAAK0H +r/pBLQAU4HjxwD4Pj/oIdwDeyXCuCKAEyXED2Ml1GnAJ70QtPhcAIYB/gABMQJYLgAkK70QtPhcA +IYB/gAD0QIILgAlCIEAg1wh1gAHlz3CAAPCfyXSdsDC8nrDPcIAAaApGCeAFwKBBB4/64H7gePHA +igiv/eHFz3OAALg7z3GAAIhDQIH0Ew0AGQ2kEADY+BMBAA0JhAD8EwEAMHLD9wHYIQeP+uB48cDP +cIAAEAkAEAQAARIFNgohwA/rcs9wAADbDtUHL/yP2+B44H7gePHAbg6P+s9woABULiuAB93TuS8o +QQBOII8Hz3CgAMAvpRAShhQQEYbPdqAAFASqpgINIAiA2PPYBbiA2T4MoAGfuQ0SEDb12AW4Mgyg +AalxqqYNGlgzBPAD2AWmqYYb7XztQS2AkAryLyQJcOB4qCCAAQAWAEDgeFMlTZAJ8i8kSXPgeKgg +QAEAFoBA4Hiphujx89imC6ABBbjJCN+H9dgFuNoLoAEKcSgeABSU5w0aGDTKIcUDhffpcYAhwgHP +cKAAGCzwIEIAlOfKIcUDhffpcYAhwgTPcKAAaCw1eAS/QKDHd4AATO4VhzaHBXkXh7iHJXgFJQ2Q +yiHCD8oiwgfKIIIPAADCIcojgg8AAI0HyiRCA7QGIvzKJSIAgNnPcKAA0BswoM9woADAL6UYmIQU +GFiElQWP+gLZz3CAAGAigQOgASCg4HjxwB4Nj/qkEQAAKHVRIACACtjKICEEmBUBEAQhvo8BAADA +dh0EEDD0LQkeAkQhAAYjuEFoBCGADwYAAAAxuFhgBCGCDwYAAAHXcgIAAAHKIKEAA/AB2CMIUAAV +CJAAg+AA2Mog4QHAKKEDC/DPcIAAFNICgAXwz3CAABTSAYAFeZgdQBCeFQARlB1AEJIdBBCCFQAR +kBUREbIdBBAA2IAdBBB+HQQQA8jPdqAA1AdBkBAVkhAI6g3Iz3GAACTT9CEAABPoGRYAlh8IFQ4N +zM9xgACwPEYggAINGhwwGoEB4H8CIAAaoQ8WFJYJ6g3Iz3GAACTT9CEAAAPoAdgF8APYEx4YkADY +BxIPNgESEDYAFgRAenAHGhgxABYFQAEaWDEEypzgyiLCB8oggg8AANwOyiOCDwAA9ApIBSL8yiHC +D6lw4gngCg7ZHwtRIATIAZAg6M9xgAAkPhqBAeAaoRyBAeAcoRbwA8gBkBToDcjPcYAA9NL0IQAA +UyDAgAr0z3GAACQ+GoEB4BqhG4EB4BuhAxIBNgGBHQieA1QRAAFTIMCACPTPcYAAJD4ZgQHgGaEC +FQURKQ0QAAGF7rjKIcIPyiLCB8ogogvPICIDyiOCDwAAtQesBCL8yiRiAACVsHDKIcwPyiLMB8og +7AvPICwDyiOMDwAAuAeIBCz8yiRsABCNUyDBAIYg/gNEuMQdAhCkFQAQMK1HCJ8FBxICNgIiwQMA +2A8JUAACJ4EQjCHDjwL0AdiT6A3Mz3GAALA8RiCAAg0aHDAZgQHgGaEPHhiVBxrYMwEaGDSD8Aca +2DMBGhg0ANh0HQQQ3gpgAKlwz3GAAAheC2F0FQIRz3GAABBe8CEAAHpiUHqkFQEQdB2EECV4pB0A +EATIAZAT6B0LUSABlbgVjxBYYCCV+GAQeL4dBBBZYT9nDvC+FQARCfAglbgVgBBZYThgEHi+HQQQ +CHeQHQQQDxYAlrQdBBACCmAFqXAQjTJ3zCCBhBPyCiHAD+tyQCkNJEAoDgQw2Iy4ANuLuwUlxBN9 +Ay/8BSaFFKQVABAIdIQkGpAh8j0IXgIDyAGQGugNyM9xgAAk0hR5gBEAB5Lo0BEAAWoVjxAB4MO4 ++GAPeGodAhB+C+AAqXBqHcITBfByC+AAqXAPHhiVFQKP+uB48cDCCY/6GnAA36QZwAPPcIAAnCgE +gNCJ8KAHyAQggA8AwAAAKHUzCIEPAMAAAA3Iz3GAACTSFHkRiY/oz3CBAKgT1ngiiAiNDwhDAApw +Pg/v/alx3PBRIACghvIEFQQQgQweAQ3Iz3KAACTSFHoREoUAD3hJIMIAcm7PcIEAyBR2e2BgMo0T +CJ4Fz3CBAAgX1ngBiALwANjHcoEACBfWekSKCCGBAAghAQAAIUABSSDBAxZuNXjPcYEAiBgAYc9y +gACcKESCz3GBAAgY1nlYgiGBRXkEIYEPAAAACCZ4A/ADhc9xgACcKJgdABAkgSiBBCGBDwBAAAA+ +uVMkAgAe4Th6RXiYHQAQFwieB6QVABCMuKQdABBQ2JwdABB48CsI3gekFQAQjbikHQAQz3BAAVAA +nB0AEM9wgACcKCSAEIGeuBChZPAF2BS4nB0AEM9wgACcKKQdwBMkgBCBnrifuBChVvCPCF4nAYVz +CB4BEo00EoEwSSHBAHJuz3KBAMgUdntiYhEKngXPcoEACBfWekGKA/AA2sdxgQAIF9Z5JIkIIEAA +CCCAAEkgwQMWbjV4z3KAAJwoRILPcYEAiBgBYc9wgQAIGNZ4WIIBgEV4BCCADwAAAAgGeQLwI4WY +HUAQDcjPcoAAXNIVeiCinB3AEwXwBdgUuJwdABARCB4lANiRuKQdABAE8KQdwBN0HcQT0g8gAKlw +z3GAAAhedBUCEQlhWWEweXQdRBDPcYAAEF7wIQAApBUBECV4mBUBEKQdABAZCV4CCtl2HUQQeB1E +EIC4pB0AEBXwENnPcoAAnCh2HUQQQ4JIghMK3gAK2XgdRBCDuKQdABAD8HgdRBDuDC/9qXCkFQAQ +RCB+gowVgRAY8s9ygACcKEOCVIIkeoYh/wNEuYYi/w46Ys9xgADwVPQhkQDPcYAAyFT0IZIADvDD +uc9ygABgtzx59CJRAM9ygAAwt/QiUgCYFQUQUyAEgMogggQV9IgVgRBRJQCCw7k8edEgIoUI8s9w +gACIt/QgQAAH8M9wgAAwt/QgQAAhhQsJ3gCEHQQQA/CEHcQTHQ0eAkQlAgYjugHiBCWADwYAAAAx +uBpiA/AB2gPIAZAs6A3Iz3GAACTT9CEAAILoAZW4FYMQdBUBEQQlvo8BAADAeWE4YBB4vh0EEAb0 +TyWFA5gdQBEEJb6PAQAAwA70CiHAD+tyLNiMuIojGgmRB+/7iiSDDwCV3vE7ClAAguLMIuKAyiHC +D8oiwgfKIGILzyAiA8ojgg8AALUGyiQiAGAH4vvKJQIBz3CBAAgX1ngDiAbwz3CBAAgX1ngCiIwV +ARAOuCV4jB0AEM9wgABMCUCABoKgEAAGiOjPcIAA0EMAiLUIEAANEgM2rQuQAQCVz3GAACQ+nQgS +DM9wgAAk0nR4EYiNCBEAhQwRAH0IHiCeFQARz3OAABA+irieHQQQFpMB4BB4FrMByOehBaGYFQEQ +rrmvubC5mB1AEAaCoBAABi8oAQBOIIIHI7oO4g8hgACkFQEQmB0AELS5pB1AEJ4VARGnuZ4dRBDP +cYAAxEMAoQQggA///9P2mB0AEA3YmB0CEArwENgH8AjYBfAC2APwAdgHoZgVABC+FQERSgwv/wDa +pBUBEAQhvo8AAAAwgh0EEFHyjBUCEJwVABGUHYAQkh0EEIAdhBQDEgM2FwkeAxTYkB0EECpwfh0E +EHgTDgEJ8A7YkB0EEH4dxBN4Ew4BSnDCeBB4sh0EEM9wgADQ0QCAhiB/jwz0mBUOEBEOXxJhk4br +kbmSuaQdQBAQuCV4pB0AEAQigg8AAAAQz3GAAJwoZIFSIgIDEIMFelCjRIEQggQggQ8AAAAQPXkl +eBCiE/CYFQEQgB3EE5QdQBCeFQERfh3EE5IdRBC+FQERsh0EEJAdRBCAFQARfhUCEYIVAREaYoQV +ABFZYThgEHhxBG/6sB0EEOB48cAaDE/6wg0P/c9wgAAM1AyIz3GBAMgUArgWeABhLbhTIACABfTP +dYAAuDsN8M9xgACcKCCBxBEBBs91gAC4O1EhQIEE9AHZ3B1AEM9xgACcKPAhAADPcoAAtEIgghiI +RQk1AUEdGBAzJkFwgABoRkAnAHI0eAB4pgigCQPYQgigCUDYANjgHQAQDvDPc6AAqCAxgwKCAN7C +ojhg4B0AEAHYEqPhA0/68cByC2/6uHECuc9ygQDIFDZ5MCJEAKLBDQxeA89ygABcLAXwz3KAADgp +QCIDBkAiAQdRJECCyiLCB8oggg8AAMsiyiOCDwAArAN0BOL7yiHCD892gQCIGEAtjQGmZkDGIMUN +Dh4Swr2qYQ7wEQ5eEkQlARxEuSpjiboG8FMlwRA8eSpiz3GBAAgXFiFBASKJDrlFeSCgSQNv+qLA +8cCYcLhxFHg4YM9xgABYVAhhjCDDj8oiwQfKIIEPAACsE8ojgQ8AAIsB+APh+8ohwQ/RwOB+4Hjx +wAfYz3GgANQHGhkYgA4RAoYNGhgwz3CgAEgsXqAfEQCGBxqYMAEaGDAEypzgzCCCjwAAkQAG8gAW +AEAAFgBAA8zPcZ8AuP8YoX3YggrgAgESATYEytHA4H7gePHAuHECuc9ygQDIFDZ5MCJEAFEkQILK +IsIHyiCCDwAAyyLKI4IPAACTA2QD4vvKIcIPQC2BAc9ygQCIGCFiUSFAgooiCAXKImEDz3GBAAgX +FiFBASKJDrlFeSCg0cDgfvHA3glP+s9ygACghfhyQCIGAWMIdAAA2s9xgQAkI5hyABcCALhwAN2A +coQqAgUUagAmQw4fYdRqPma1fgHlANj3DTSRAKZKJAByqCDAA0CLGnrAulN9GmegqqGLGn3AvbN9 +qKoB4EIlQAC3CHWAQCRCANUBT/rgePHAaglP+s9ygAAQJ0SCz3WAAICWYoVAgja7NrpQc9YijQ8A +AIAAwIU9Yn5mHQ2FEwohwA/rcoogjQKKIxAEmHZ1Au/7uHUeZv8NhZNYYIkBb/oOIIAD4HjgfwDY +FHg4YM9xgACgXuB/CGHgeOB/AdjPcYAAlDvgf/AhAADxwJhwCiHAD+tyCiXAB89wAACfGSUC7/s7 +2+B4z3GAAHA74H/wIQAA8cCYcAohwA/rcgolwAfN2AW4AQLv+0Tbz3GAAKg74H/wIQAA8cCYcAoh +wA/rcgolwAfPcAAAoRnZAe/7TdvgeB8JEQHPcYAAWE8IYUAoAgIFekAoAQRFeRi4JXgO8M9ygABY +S/AiAAAD8EMoAAJhuS95jCHDj/v14H7geM9ygABYUPAiAAAXCRABYbkveYwhw48U8kMoAAL58QQg +gA8AAAD/QSgBAoYgww8FIEIAQCkABEV4GLkleOB+4HjPcIAA0D7gfwCY4HjPcYAAgAkkgeB/IKAR +iOB/wrjgeM9xgADEQkaBiiH/DyCgBuoigiCgAdgD8ALY4H7PcYAA5EJGgYoh/w8goAbqIoIgoAHY +A/AC2OB+iiH/DyCgz3OAAORCRoMS6iSCGwleAM9xgADUQQ8KQADPcYAA8EERCkEAQILlC4GAAtgF +8CKCIKAB2OB+8cBmDw/6zwgQAM92gACEui+Oz3CBAAgXz3WAAJwoNngiiAOFAN/PcqAALCA0EBEB +PBISAA6OgOCcACkAyiWpEIwiAaSQACUAyiUlEWSWlOPAI4YPAACTAM9woABoLPAg0ADlolDYRSFB +AhjaYgygCyDb+LjKJSISLvQD2M9xoAD0BwWhhNoNcECwQiIAKA1yALJAhg1wQKBClg1wQLADhUCA +DXBAoAOFQpANcECwBpZAKAIlw7gMuIK4BXoNcECg5KEOjgHgDq42DaAJKnAB3RDwAN3PdoAAhLoi +DaAHBJYA2M9xgACwPA6uHoEB4B6h0QYv+qlw4HjxwHYOD/rPdoAA8J8rCPQAGnAeljoWBREKIcAP +63IQuAUlBQDPcAAAgwyKI4UPnQev+wokAARAKA0h3WUllQSVELkleDjoz3CAAMxe8CABBEQoPicA +IYB/gACsQC93IKAjlQKVELmqDu/+JXgIcQAngB+AAKBA7goACc9wgADAXvAgAQQAJ4AfgAAEQEeV +IKAjlQKVELoQuSV4JpWqCi/8RXluDs/+CHEAJ4AfgAD4P7IKAAlelh2WANkPIQEEELpFeAYgQIAB +3R22MLgethT0z3GAAJQvAIGguP4PIAUAoc9wgAAQJwSAIIDPcIAAMKCioCGgENrPcYAAaAoAgQAq +AgRGeNUFL/oAoeB48cByDS/6ANoPIgIAz3OAAPCfHpM9kxC4BXkGIb6ANvTPdYAAlC8AhYC4AKXP +cIAAeAnPdYAAyCsAkMeNNw4BEM9wgAB6CQCQwY0rDgEQz3CAAHwJAIimjRsNARALyAQggA/+//8D +CxoYMAvIh7gLGhgwz3CAABAnBIDPdYAAMKAAgAClANgCpUV5PbMwuVEFL/o+s/HA4cXSCqAAKHWA +4MogQQNADuEDyiFhADkFD/pRB8//8cC6DA/63gugCADdz3CgANAbEYAXCN4DLgigCQHYz3GAACQ+ +CYEB4AmhBsgDEgI2OwgeAKQSAAAzCJ4Ez3GAAKA6AIET6KChAQmeRc9woADELAuAUyCBBP64zCEi +gAfymBIAAI4L7/4A2gMSATagEQAAFwgeBIogCAAMGhww6gvgBChwLvBJCB4FB8jQiQDaMxGPAAQg +gA8BAADwQSgNA89xoAA4LgeBDyJCAwHcRngHoQ3IZg7gCgAsABDHd4EAyBQCvtZ+EuffZ6CviiAQ +AAYaGDADyKAQgADE4EgKwQoD2c9woAAUBCOgOQQP+uB4osHxwEHCYsMKJQABgcNAJAQyEgggAAHa +0cDgf6LA4HjxwJYLD/qCJAM8CHcodRpyOnMKJAAhCiJAIcDhVSTTN4t20vYGCO/6yXDJcOlx5g/v ++qlyVSNAJoYPr/rJcVUjTyYQ3ZbAANk6De/7QdpAIwAoANkuDe/7QdrpcJbBwgpgCKly6XBAIwEo +tgpgCKlyiiQBcADZqCCABQAkQjBYEoIAACRAMEcigg1YGIIAACRCMJwSggAB4YciAQecGIIAig+v ++slwyXCWwWoP7/pA2h8IciAA3Qp38CFBIzIkQiNSD+/6yXBhv/EPdZAB5Upw7g6v+slxVg+v+slw +yXBAIwEoMg/v+kDayXBKcSYP7/oQ2kpwyg6v+slx8QIv+oAkAzzgeKLB8cBBwkLDCiUAAYHDQCQE +MhIIIAAB2tHA4H+iwOB48cBuCg/6giQDObpwmnFIdxpzCiMAIQohQCGXxalwAN7JcT4M7/tB2lUk +0jdAIgApyXEuDO/7QdqqcKlxvglgCIpyqnBAIgEpsglgCIpyiiQBcKgggAUAJIEzXBGBAAAkgDNH +IYENXBhCAAAkgTOgEYEAAeaHIQEHoBhCAIt2zghv+8lwyXCpcdIJr/tA2h8PdBAA3fAgQSPwI0Ij +vgmv+8lwYb/xD3WQAeUqcPoPL/vJcZoIb/vJcMlwQCIBKZ4Jr/tA2slwKnGSCa/7FNoqcNYPL/vJ +cekBL/qAJAM54HjxwKYJD/rPdYAAMJkBhc9zgQAIGEQgBIPPcIAADNQMiNJo1n7HdoEAyBRAhhZ7 +IYMS8lAijwXgpkYhAQYhow0MEQGRv+CmBfCxura6QKZGDoAKB/CWukCmRSEBBiGjC42iuK0BL/oL +reHF4cbPcIAADNRMiIwiAoDPc4AAMJkX8sqLz3CBAAgYMmo2ecdxgQDIFFZ4QIGhgAXulbpAoau9 +BPC1ukChi72hoADYC6vBxuB/wcWhwfHAUSAAguHFqAAhAAh1RCUDFgQlgh8GAAAAI7sxugHjemIE +JYAfwAAAADa4z3OAAABeSmMIY1hgQS2CElIiAgDAugO6GOKF4MoijQ8BAIkN1SIOAFBxUgAlAADY +7b0YACEAAiGAAM9xHEfHcQUofgAKIMAOA/AiuEEtQRPAuQS5NHmpcsa6SSLCBVR5z3KAALxVMmIP +Dd4SQSoBARQhggAFKj4AQSkAcgjcvwAP+gohwA/rcjvYjLjPcwAAVxJKJAAAfQGv+wolAAHxwCYI +D/rPcIAADNQMiIwgAoAr8jJoNnnHcYEAyBSggc9zgQAIGM93gAAwmeSXFntBg1AljhWGJ7sfwKGM +J0SQRiICBkGjBfSRvsChC/Cxvba9oKEPD1EQlr2goUUiAgZBo7IMgAoA2c9wgAAwmSEAL/orqOB+ +4HjgfwDY4H7gePHAWgpP+uB44HjgeOB4aSCAAW8hPwBpIAAA9/HxwIYPz/kacM92oADQDwDdB/AQ +FgCW/WH4YBAeGJAjbW8IRCAlFgOWJRYCli8kxwAlFgCWT38PfQi9pX/XDBGDgufMJ+KTzCcil8ol +QhAh9M91gAB8oEmtJRYClgqtS60lFgKWaK1MraJpFQ/RE89wgACJoI4Kb/oN2Q3lEw8RF89wgACW +oH4Kb/oN2Q3lEBYAlgIgQSM4YBAeGJBNB+/5AdjgePHA5g7P+YwgBICAACYACHd5DxQVz3aAAGCg +ViZAE0IKb/oC2WgWABFhCFEAViaAEy4Kb/oE2VQmQB0mCm/6AtlqFgARRQhzAWi/Arg9DwQQAN0L +8FUmQBe1eAYKb/oE2WS/AeWvfWoWABHtDQKQVSbAFu4Jb/oC2WwWABENCHMBYr8CuAkPBRAA2Bjw +AN0L8FUmQBi1eMoJb/oE2WS/AeWvfWwWABHtDQKQz3GgANQLD4EfZwHY76GVBs/58cCg4AhxANgJ +989wgABgoDGgkglv+kjgAdjRwOB+4HjxwPYN7/kA2jpwjCAEgEogQCDCIA0kz3CgANAPJRAAhs91 +gABgoM93gADsoEAnUhOUHQIQz3CgANAPJRAAhkAnExMC3pUdAhCWFYEQlRWAEDhgkODKIIkgfwhR +IADYE/AiCW/6EOCWFYEQAeEveRNpFXgyIgAglh1CEB5mQCRAIA94mnCVFYAQTwwDIBNpFXhicPII +b/oB2ZYVgBDPcYAAHKEDuBV4OGDaCG/6BNmWFYAQA7gVeEJwyghv+gHZlhWAEAO4FXgZZy2JBuaV +CXKI+GBKIAAgz3KgANAPEBIAhgIhgSM4YBAaGIBhBe/5CnDxwB4Nz/mhwQh1KHZZDTQRANiLcH4I +b/oE2QDANQiAD/IBAFA3CIAP8gUAUBsIgA+aCVBvz3GgANQLD4FkvbhgD6EB2BDwqXBKDe//yXEL +8Klw5g3v/8lxBfAMbbYO7//JcQ94JQXv+aHA4HjPc4AAlC9Ag0V4AKMZ6c9xgADIK89wgAB4CQCQ +R4k5CgEAz3CAAHoJAJBBiSkKAQDPcIAAfAkAiCaJHQkBAAvIBCCAD/7//wMLGhgwC8iHuAsaGDDg +fuB48cDPcIAApAoAgAvoz3GAAFA6C4EB4Auh2g6v+wLY0cDgfuB48cDPc4AARAlocAIMIAAE2QRr ++gsgAATZ0cDgfgDYz3GAAKgJAalVBmAKAKnxwOHFjglv/THYtGiGCW/9M9gFfRi9z3CAAMRGwgpg +CJC9KLhZBO/5pXjgeOHFMmg2ec9ygQDIFCFiz3KAAJwoLbnAufAiQwAog1EhAIDPcYAAFNJBgQny +PIuA4cUigQ8AAAoCA/JFIkIDSiQAdADbqCCAAjZodXkAIY0PgQCIGEClAeMA3c9zgQAIFxYjAgCg +qqGqAdkiqgPZI6pKJABxqXKoIMABeWIWeaSpAeLgf8HF4HjhxUokAHgA2KggAAgA2891gAD0JkCF +DyMDAAsiwIAP8kGFCyLAgEDazyLiB8oigQ8AANAAzyLhBwLwANrPc4AACBsVe0CjAeDgf8HFz3CA +AGhDBoADgCCAz3CAAFiTKaAFB6/8EdjgePHA7grP+c9wgAB81cKIEw6eEADZz3CAAG4KIKgd8M9w +gAAk3bqI473KIWIA9PXPcIAA/KMMEAQAHwxfAAohwA/rcgi+z3AAAPoqiiONB+0Db/sAJkUTBQPP ++eB48cCOCu/5AdnPcIAA6C4koIogxQ/PdqAAyB8ZHhiQKHAocihzMgrgAJhxbg5v/ADfqg9P/M91 +oADQD/Wlz3CgAMAvehABhom5i7l6GFiAz3GAAADoEBhYgAILwAHeDY/+fgnAB0DZz3CfALj/MqDW +CAAKgNnPcKAAFAQsoB0dWJCyCQAJLg+ACHoP4AjpcAfYSB4YkKYMQAaqCYABAgpAAD4OwAMmCsAH +pgmAA6YOAAj2CkAALgtABx4KT/xmDMAAEg2ACO4Nz/6mDMAE4g0AAZoLQAZmD0AFHgyACg4OAAR6 +DE/+fgjABHYIwATaCsAHz3AAAP7KfgsP/P0Bz/ngePHAignP+aXBz3eAAJwoA4cIgMC4Xg8gCS8g +ACAA3c92oAC0R89woACMRLigANiTuHceGJAI2HceGJAA2J64Ux4YkOB4Ux5Yk89wgAC4ARB4Rx4Y +kM9wgADQBBB4SB4YkE8ggCNFIAANTyDGBzTYRB4YkBzYRR4YkEYeWJPPcIAAcPBKDyAFDIhKJIBw +z3GBAFAdqCCAA89ygAAU0gGCdG10eztjA6MCggHlBKPPdYAAhEMAhQPoZB4YkEMemJFeDCAJAdgD +hwiAQIUfCB4AUyJBABK5RCIAAw64JXiGIv8DCrpFeBHwSHCGIPMPCrgEIoEPAAAADAa5JXgEIoEP +AAAAMAK5JXjPcYAA2C8CoYt1qXAmCq/7FNk42GTAANgE2YoNIAmpcs9wAAYbAE4eGJC9AO/5pcDg +ePHA4cUQ3X4MoAGpcAfZC7nPcqAA8Bcxos9xAADw/ziisqJuCYABqQDP+eB4ANqA4cokTXDoIK0B +/9lcYCCsAeLgfuB48cDhxc9xgAB40c9wgAA8XnYP4AdI2s9wgAC8V89xgADcCWYP4AcI2gDdz3GA +ABQzoaGioc9wgAAsNqmgZglgAgOBz3CgACwgz3GAAJw2UIAQgEWhBqGODOABqaEtAM/58cAA2c9y +gADwnyCiz3CAAJQvIKA9sjC5PrLRwOB+4HjgfuB48cCOD6/5INukwc9xoADIHGmhz3GgAJQTANpb +oc9xgAAoHqCBM2g1eYt3MGU9Zc92gACA01MggQBshte7RQnRAC4O4AqpcIfoz3GgAMwXANhA8B+G +m7gfpjQWgBAijRsIQQDpcEAlARREbd4J4AhAJgMcDdgl8B6GkbiSuB6m5vEfCVEBQSoCUkAlABTp +cd4Ib/3Buh+GnLgfpg3YEfA/hiy4wLgDuJm5P6YkhQXgJXtgpyWFIacmhSKnJ4UjpwPgz3GgAMwX +z3KgAJQTHKIB2IroH4Yg2Ze4H6bPcKAAyBwqoBzwAMAD2hgZGIABwATbGRkYgALAGhkYgAPAGxkY +gBQZmICKFgAREBkYgM9woADIHGegFhmYgN0Gr/mkwOB48cBuDo/5pBABAKLB2wlfBiDZz3OgAMgc +KaOkEAEAXQneATGIz3WgABAUI7nAuQO5BeED2k+lRoVBwo3hEN7KJuIRBhQPMYwnw58J9AQUDzHx +dswn6pAB3kL2AN7r7sWARX7HpbGIhiX8Hxi9pXrPdaAAzBdaoBbwRYDPcaAAEBRHoaQQAQAVCZ4C +MYjXuoYh/A8YuUV5OqDPdaAAzBcN2QHaA+ENHZiQDh1YkCaAGR1YkCeAGh1YkCiAGx1YkAPZFB1Y +kHAQAQEQHViQcBABAc91oAD0BwThJ6VHo6QQAQCZuaQYQADxBa/5osDxwIINr/kE2Qh1DRIONgbY +DRoYMM93oAAUBAqnz3CAADBejg7ABwCFhg7gBwTZAYV+DuAHONkIFQQQAYUAEAUBCQwQABUNBQEK +IcAP63IZ2Iy4gQYv+2/bA4VWDuAHiHEBhUKFIJAFhUYO4AdCecqneQWv+Q0amDPxwAINj/kods93 +gQCwHDtnZItAJxERjCPDjxpyP2cS9ADZBPAB4S95z3KAACgeFQkTBECCs2m1fbJi9uokrwPwaHHP +dYAAKB5AhQO5NXkQ4llhLgzgBxDaRI8AhUAuARIDulV6WGAgsCSPAIUDuTV5MmA4YEUiggJAsEok +wHAB2agggAMVDkAQMiFDIACFANoDu3V7eGBAsAHhL3kA2BDdCHbPcYAAxIIWeUAgQC8I4c4L4AcG +2mG9AW7pDXWQD3ihBI/58cA6DI/5osEIdyh1GnLPcIEAsBwZYSSJQCARAYwhw4/PdoAAKB4AIFID +BPIocg/wANoE8AHiT3r1CjOEAIZzanV7cGD46AQagiAghgO6VXrpcBDhWWFmC+AHENoEEoIgAIZA +LQESA7pVelhgILAEEoIgIIYDulV6UGFZYUUgwAIAsUokwHAB2KgggAMVDQAQMiEDICCGANoDu3V7 +eWFAsQHgD3hAJwAUz3GAAGSDwgvgBwLai3FAIEAvAgvgBwLagcEKcEHg9grgBwTaAN8Q3Ytwz3GA +AMSC9nkI4d4K4AcG2mG9AeftDXWQ738EEoEgAIbPdYAAsLoBwgO5NXkC4DhgQKgEEoEgAIYDuTV5 +OGAA2SgdQhABwQWli3cQ4CelJoXpcu4MoAhohQQSgiAghgiFA7pVegThWWGGC+AHBdoBwCaF6XIB +4EHABYUQ4MYMoAhphUEDr/miwOB48cDqCo/5CHbPdYAApAoAhSh3huiA5uIgggMh8M9wgACYQkIP +QAjPcIAArC/PcYAAcArAoACBBX/goc9xgABQOgKBAeACoQTw+goP+wCF/ujPcIAAqAoAgPjo+QKP ++eB4z3KgAPxEOYIEIb6PAAAIIADYBfQ9gvm5AvIB2OB/D3jxwADYnLjPcaAArC8coRqBUSCAghqB +C/KquBqhGoHnCB6AFgzv/AHYCfCKuBqhGoHTCB+AEgzv/AHYANmbuc9woADQGzGgCghACr4NAArP +cIAABDoAgEIgAIDKIGIA0cDgfuB48cDhxc9xgADwn36RXZEQu2V6Ad0bCg8Az3GAAExARCg+B14O +YAgAIUAOqXAC8ADYTQKP+UaBCeojgWCBIoJieTBwANgC9gHY4H7gePHAvgmP+Qh1z3aAAORC3g/v +/8lxB+ipcNIP7/9AJgEYg+gA2Anwz3GAAMRCvg/v/6lweegB2PUBj/ngePHAkggAAAboAgkAAA8I +UQDPcIAABC8AgIPoANgS8AoJAACP6PoIAACL6M9wgADkKyyQz3CAAJwoHpDjCQGAAdjRwOB+4H8B +2OB/ANjxwLhwz3GgAKwvGIEZCJ4GCiHAD+tyiiCMCWfbZQIv+0okAAAVgRsIHwAKIcAP63KKIMwJ +aNtNAi/7SiQAAAHY0cDgfs9wgACkCgCAgODMIGKABPQA2AXw/QgQggHY4H7xwM9xgABuCmCJz3CA +AG8KQIiEKx8AACGAf4AAyNsw4PAggAALCB8AJggAAIPoANgL8CCJz3CAAITVhCkfADQgQA536AHY +0cDgfuB4z3CAAKQKAICF4AHY4H/AeM9wgACkCgCAhuAB2OB/wHjgfwDY4H8B2OB/ANjgfwHYz3CA +AFgfAIgG6M9wgABAHwGIA/AB2OB+DQleRwnIvbgJGhgwANmduc9woADQGzGg4H7gePHAJgiP+c91 +oADIHyQVDpYVDh4ShRUAllIND/yKIAQAJB0YkFEmgJAsCkIKZQCP+fHA8g9v+TTYqg1AAM93gAAA +ei8IHgQCCeACANjWCOACAdiKJhAQAN3GD6/+qXAUJ0wTYb4AtPUOdZAB5Q7wANuKIhAAXgpgBHB4 +FCfMEGG6ALT1CnWAAeMBAI/58cCWD2/5NNihwQDdSg1gAEDFz3eAAABiMwgeBPoI4AAB2APeCr4A +2Iy4uGAQeItx7gngAAHaFCdME2G+ALTrDnWQAeXCCMAAEPAF2wq7A9oKunhl8glgBBB4FCdME2G6 +ALTzCnWAAeWVB2/5ocDgeM9xAQCMM89wgADUIeB/JKDxwOHFb9iVuM91oADIHxIdGJDPcAEAQDwV +HRiQtg3ACIogBAAOpWkHT/ngeOHFANvPcoAAfJlKJAB0z3WAAPSZaHCoIAACQCUBEhR5YLEB4Ehw +z3GgAAQlD6FWIgAEEaFWIgAFEKHgf8HF4HjxwKoOT/nPdYAAnCgFhc92oADEJ3UeGJAMlXYeGJAH +hXkeGJAQlXoeGJAqDu//AN8b6Hce2JN4HtiTgB7Yk4Ee2JMHhYYeGJAQlYceGJAHhYoeGJAQlYse +GJAFhYgeGJAMlYkeGJAFhYQeGJAMlYUeGJDB2FAeGJCZBk/54cUIccO4z3KAAPyZ9CIDAMm7cHHK +JCJ0yiAiAOggIgL0Ig0Ayb0JCUADAeDgf8HF8cDhxQh1z3GgAMQnGREAhgHagOAREQCGwHqA4gCl +0SDhhwDYM/TPcIAA/NMMgM9xoADIH2TgHqEQ2A6hAdgVGRiAMgwgCgvYUSEAxsogIgAY9CUIXkfP +caAA1AsWgTiBJOAVCEUADgwgCgPYCQsfQAkInkQY2APwANiA4Mog4gTPcaAAkCM+gSCl7QVP+eB4 +8cBuDU/5z3aAAJwoFSYBEECBaYK4ikErwADAuBe4x3AAAIAc5LvPICIG4LtO388gogDKJ4IfAABO +AYblzydhEikLXwHPdYAA5CsYFQQRvpYbDQERoYbEFQ0WEQ1fEaCGxBUNFgcNXhGBuFEjAILPIKIF +G6L8okCBz3A6BEpwHaKggQfYqgpgAAq4BCCADwcAAAAwuFUIFQIzJgBwgACIRkAnAXIUeQB5iiAE +AB6lGfCKIBAAHqUV8ADYi7gepRHwANiMuB6lDfAA2I24HqUJ8APYDLgepQXwANiOuB6lgiABAfUE +b/kepQohwA/rcozYjbi+24u7SiQAAMUF7/oKJQAB4HjPcAAAVVXgfvHAZgxP+SGAz3WAAPQmAoAg +pQDeAaXCpc9w0P4AAPYIr/8Epc9ynwC4/92ibg5P/iCFGQneB89woADIOx2ABujPcAAAVVUH8N2i +fOnPcAAArd6BBE/54HjPcAAAVVXgfs9wAABVVeB+z3AAAFVV4H7hxeHGJIjPcoAAGF+miMK5LmIA +2Q8hgQPPc4AAXJ5Ag4TtJnpAoxjwRXkgoyWIFSONAyOlJohFiFlhJqUggIwhEIBF94ohEAAgoCO5 +IaMAgCq4AqMA2c9woADwNiygI4MloCaDJqAkgyegJ4MooCWDKaAogyqgIYMroCKDLaAggySgwcbg +f8HF8cBCC0/5ocH6cBtxO3JAwwojACEKJEAhCiWAIQomwCHPd4AAHAkghwDYgOHKIIEPAADIG/QI +QQBacACHiOjPcAAAzBvmCEAAOnAE8EohACAAh4noz3AAAAQc0ghAABpwA/BKIAAgAdjPdaAAyB8T +pQbYz3aAANg+AKYEHsAVCB4AFgDADB5AFhQewBQYHgAVBKYcHkAVD8AgHoAVCabPcIAAECckgCCB +KqYogCCBDIArpgCADKagFQAQDaakFQAQDqaoFQAQD6bPcEN1qBIQpgCHhuhWCGAAKNgD8ADYEaYA +h4DgANhECEEAEqZTJ8B1E6YByFQeABcWphIVAJZQHgAXF6YTFQCWLyGHBBimFBUAlgi5GaYVFQCW +GqYkFQCWG6YWFQCWHKbPcIAAqD0XgB2meB6AGnwewBqAHgAbhB5AG0gVAJaIHgAQz3CAAAAABICM +HgAQUyAAIxC4JXgvIUcEJXiQHgAQyXBGCGAAJdkRAm/5ocDgePHA8glP+c9zgABsP0ODAN/PdaAA +LCCwhdJq1H5+ZqWmBKZAIkKAJqZDowbyAoPjowHgAqMlAk/5z3GAABAnCIEA2kCgDIEB2UCgz3Cg +ALAfNKDgfvHAegkAAIwg/4/KICEA0cDgfuB48cCOCW/5atiiwYtxAdq6D2AASHOP6AohwA/rcs9w +AADSFIojxQSKJIEKsQLv+kolAABAJIExRNgB2o4PYABIc4/oCiHAD+tyz3AAANMUiiPFBYokAQGF +Au/6SiUAAMoM7/kGFAAxkQgQAIHBa9gB2lYPYABIc5DoCiHAD+tyz3AAANQUiiOFB4okwQpNAu/6 +SiUAAAQUADFAJIEwAdoqD2AASHOP6AQUBTEKIcAP63LPcAAA1BSKI0UIIQLv+ookwQoCFAAxz3aA +AIBFG3hBKMUATCWAjAAeQBHU9gohwA/rcs9wAADVFIojhQntAe/6iiTBCh3Yz3aAAIBFAKa4cAAU +ADHPdYEA/CRALYIAqXG2DmAAAduQ6AAUBDEAFgUQCiHAD+tyz3AAANYUrQHv+oojBQxAhicKcgAA +2BYlARBgiYYj/w0juw0LUQBhiQTrYrthqQHg6QiCgADYnQBv+aLA4HjxwBYIT/mnwTpwenEaclpz +i3DPcYAAAEjSCG/5GtrPcYAAgEUggQDYgOG4cboALgCKJf8fz3GAADQfABGEAIom/x/JdQLw6XZM +IYCjAdrPcYEA/CQWeWCJwiKMAEQjjwD9f3cKwQPhiUQjAgQkukQjBgJBLsYARCMBASK5WwiBIR0M +UQCA4cwiIYAH8oHhzCJhgADaAvQB2k96BfCA4gHawHo3ClEATCIApgHawiKKAIYj/Q8nuw8JgACA +4swgYaAL9DJ3zCMhgAnyA+8F6wsJwiMPDsITyXcE8AHZCPAIdQHgZwhEgQDZiiD/D4TpgOXKIEoD +jCD/j8oggQ//////FfIyJII0z3GBAPwkDwpRAGJxFnkCEcAACfAWeQsKkQAGEcAAA/AHEcAARQcv ++afA8cA+Dc//ZgxP//IJAAdGDw//CiHAD+tyPdiKIwsOSiQAACUA7/oKJQAB4HjxwM9wgACcKAKA +whAABlEgQIBwCEIG0cDgfuB48cCmDg/5GnAodTpyANnPcIAAmLcgoM9wgABgoDoIL/uKIQwGz3Kg +ANQLfoIAJYEfAAAAIM9wgAAkCmJ5YKDMuc9wgAD80y+iDIDPcqAAyB9k4B6iENgOogHYFRoYgE1w +hiD8A9DgzCCCjwAAgAAS8owgA4QT8gohwA/rcgokgArPcAAAMhGKIxoNdQev+rhzCnBCCe/7KnIE +8OoIL/sKcBPoz3KAAIDTP4Kc4LO5P6IA2s9xgAAwmUupz3GAAGSWTLHKIIEAQQYP+eB48cDmDQ/5 +z3CgAMQnUhABhkEQAIaGIOOPAN0G8uu50SGigTryz3CAAJwoA4AJgM92gABgoC0IXgHaDQAEiegU +joHgyiAhAfAIYf/KIWEAz3CAAPCjAIANCJ4ALghgABCWtK7PcIAA8KOgoE1whiD8A4wgAoAM9M9x +gABcHwCBAeA2DiAEAKFeDo/7BvCMIAOEWAkB+70FD/ngfuB48cBKDQ/5z3aAAGgKAN0L8BDYuHgL +IQCAtA7i/sogQgMB5fEN9JAghoDhyiAhAJAO4QLKIQEAgQUP+eB44H7geOB+4HjgfuB44cXhxkEt +AFTBuBcIFQEzJgBwgABQRkAngXIUeQB5ANgX8M9xgACA05gRgABAKAIGhiD9D1IgwAFFuEV4z3Kg +AIgkEKIfgbO4H6FK8AHYENvPcaAAyBxpoc9zgACA05gTjQAA2s92gADsWsaGQC0BFoYl/R9SJc0R +xXlFvaV5z3WgAIgkMKU/gwLdRCg+DQAhgH+AAAjwlbk/o89xoADwF72hpICKEwMBpqGjgBTjpqGi +gFMjw4CmoaGApqHAICEIwCAiDGCAc6FsaGCDc6H4EAOCc6H8EACAE6FKocHG4H/BxeB48cAaDC/5 +ANt5ClIAn3KoIIAOwJBvYVMmTRADvbh/o4AB5sCwUyZOkKV/46Ao9KGA532hoOKAQy3OE+d+3WUE +JY8fAP8A/wQlgh//AP8AKL8IukV/wqDnfqGg3WVDLU8XoaDHf8Kg/WVDLY4QoaDnfuKg3WUA2sKg +oaBDoAHjcHsBBA/58cCaCy/5AdqiwQh1WthgwADYQcCLcWoP7/+pcIHGqXDJcV4P7/8E2gCVyXHB +uE4gAgGpcEoP7//Bus0DL/miwGGAYKECgOB/AKLgeCGgQqAA2SCw4H8joKHB8cA6Cy/5OXGlwSQc +QjEIdxlyuHOIdQDYQMAgh4HGyXDWD+//QYfJcClx+g7v/wbayXAJcfIO7/8G2onByXDmDu//AdqL +cclw3g7v/wPayXCocdIO7/+pclIP7//JcMlwyHGGD+//6HII3DsDL/mlwOB48cDhxaHBCHXPcNS6 +/spAwATwVgngCQHYz3GfALj/uqEE2Buhi3AeoQDanbrPcKAA0BtRoM9wAG0AEBmhAQleRwDA0wiA +j9S6/sr5Ai/5ocAA289ynwC4/xqie6I+os9wAGwEABmi4H7xwGYKL/mYcCh2GgggAEh1BiCBA4hw +TgggAKV5tQIP+c9xgAAML2CJz3KfALj/BuvPcdC6/so+ohqiDuvPcKAAOC4FgAQggA/AAAAA8QiA +j8AAAABq2Bi4GaIcguB+4Hjhxc9ygAAML6CKz3KfALj/Be3Pc9C6/sp+ohqiO6IO7c9woAA4LgWA +BCCAD8AAAADxCICPwAAAAGnYGLgZouB/wcXgeOB+4HjxwL4JD/nrcM91gACYMJgVAJZ7CJ4AUg0P +/892gACcKMkWABaluMkeGBCTFQCWpbiTHRiQ1xYAFqW41x4YEA6GpbgOpgCGyBAABoYgf47KICIA +yiECAAwNovnKIqIBAYbIEAAGhiB/jsogYgDKISIA8Ayi+coiogEAhs9xgAB40cQQAAYluMC4CqE6 +DA/+f9gKuM9xoADQGxOhf9gQoQDYlbgQoc9xAACIIAoKIAAG2M9xoADwNgSBRiDAAQShz3CAABwJ +AICA4MoggQ8AAJQA6A7h/8ohIQbPcIAAYCIAgFEgQIAkDCIByiAiAD0BD/nxwM4IL/kB2DoPYAgA +3c9wpQAIDM92gADoLqKgBIZRIICArAmC+s9xAACEDJYJIAAG2AvIBSCADwEAAPwLGhgwBIYjCJ4A +z3CAAAQ6AICL6EoPb/+KIMYICwhRAG4JgAUM8ADZnrnPcKAA/EQhoOB4oaCiC+AGANg+C4/84gsA +AVYNoAcB2EYMr/sB2K0AD/nxwDoID/mIdQDfCugZCFEAAd7PcIAAOR/AqAbwz3CAADkf4KgJ6RsJ +UQAB2c9wgAA2HyCoBfDPcIAANh/gqArqGQpRAAHZz3CAADgfIKgG8M9wgAA4H+Coz3agAMgfz3CA +ADkfGB7YkwCIiiEQABHoz3CAANknAIgL6M9wAwBADUUeGBAwpgLYGB4YkALwMabPcIAANh8AiBvo +z3CAANonAIgX6M9wAgCWLyAeGJDPcIAAKAAhHhiQz3CAAIgIIh4YkBgWAJZFIAADGB4YkM9wgAA4 +HwCICOgYFgCWhSABBBgeGJAPC1EAGBYAloi4GB4YkBgWAJaAuBgeGJAY7QDYlLjPdYAAyAoApXHY +BrguDe///Nkghc9wAABMHB4N7/+fuRgWAJaFuBgeGJB1B8/48cCYcAPpIwwSCM9wgAAQCQAQBQAK +IcAP63LPcAAA2g45AK/6edvPcIAAFC8VIAABIKDRwOB+4HgA2UokgHHPc4AA9JIocqggwAHwI4AA +AeIFeeB/LyhBAOHFANpKJIBxz3WAAPSSSHOoIIAB8CXBEAHjJXoA2Z65GXkEIYAAQiAAgMogYgDg +f8HF4HjxwM9xoADIH6QRAgDPcIAAnDYAgDWBz3OAAICWliBBDxByANrKIm8AAYPVuYHgAdgC8gCD +DQhRAA0JhA8AAIgTANgD8AHYgeLMIGKAMAqh+8og4QHRwOB+AuEweUFpDQoDACJ4EHgD8ALYz3Gg +AMgfHqEQ2A6hAdgVGRiA4H7gePHA4cVQ3QDaz3OgAMgfr6NeowIgQgBeowHaFRuYgEDaTqMEIL7P +AAIAELAPwf9JBs/44HgA2c9wgADwoyGgz3CAAIDTHJBiuEggQAAQec9yoADIHx+CEHgIIQEAMHkC +2BUaGIA/ouB+AuEweUFpDQoDACJ4EHgD8ALYz3GgAMgfH6GKIBgIDqEC2BUZGIDgfgDZz3CAAPCj +IKAhoOB/IqDhxeHGz3GBADAdRYEk6M9xoADIH0ARDgbPc4AAgNNAKI0CQhMAAXyT0H7YYLtjYrsI +IwMAAnsJIsIAAtgVGRiAz3CAAJwoX6EDgCKAz3CAAPCjIqDBxuB/wcXgePHATg4AAghxz3CAAEhB +3gnABwLZz3CBAGQkJKDRwOB+8cDhxc9wgAD8owOAz3WBAGQkEQhfABcIHgAIjQ8IUQAE2JYO7/0E +pQ3w0gkP/wIOAAIIcc9wgABIQZIJwAcC2ASlGQXP+OB48cDhxc91gAD8oxWFgOCgDwICehUAFgro +gODKJA1w4HjoIC0B4HjgeOkEz/jxwM9wgQBkJASAGwjRAM9wgACA0wCQhiD8AIwgAoC4D8H/FdjR +wOB+8cDPcYAAbgoAiY3oz3CAACTdGogPCN4AAdg2DSAGAKkX8M9wgQBkJM9xoAAsIDCBBYAieM9x +gABctgChKHDPcYAAiLV2CyAH1NoeD8//0cDgfuB48cDhxQh1z3CBAGQkBIAH6BoIgAEApQHYAvAA +2E0Ez/jxwNILz/jPcIAAYKCVEIAAAN2A4FIALADKIkwDM23PcoAAHKE1eSJiBCKCDwcA8P8kui8r +gQBOI4EHL3kA2w8jQwDPcYAACF9uYc9xgQB8JLZ54YEGIsKA5X7Boev1AeWvfb0NApBtCHIAANmY +cBNpz3OAAByhFXgDYwQjgw/4AQAAQSvDhBnyLyiBAE4gjgfPfgDdDyWNE89wgAAAX65gz3CBAHwk +NnjggAYjQ4PlfsCg7PUI8M9wgQB8JDZ4YICAu2CgQiRAAAHhpQh1gC95aQPP+OHE/BzIvvwcSL7h +wOHB4cLhw/wcCLH8HEix/ByIsfwcyLH8HAiy/BxIsvwciLL8HMiy4cXhxuHH/BwItPwcSLT8HAi/ +aiSAEOHEaiTAEOHE8cDPdaAA0BtcFRAQe9iyCK//iiEEA89wnwC4/x2A63bLcM9wAABEHEYI7/8K +J8AfOnAXhQfYOgjv/wq4UyBBBwfYbgjv/wq4z3CgANQLGIBCIAAISCAAAM9zgAC4O89xgADICiCB +vBsYAAshQITKICIDLvQfCJEgFwmeJYnoUSFApWTYyiCBDwAAXAAg8DTYHvCMIASgGfJMIACiEfII +9hsIUCAnCBEhhtgS8BcIECSMIAGgC/RM2ArwZtgI8DzYBvBG2ATwVNgC8ITYkxMDBulxyXIKJAAE +JQNv+golQATgfuB44H8B2PHA4cUIdShwBevPcYAAAHoE8M9xgAAAYlt6cgrv+LR5HQLv+AHY4HjP +cIAAegkAkAboANnPcKQAHEAyoOB+4HjPcIAAegkAkAboA9nPcKQAHEAyoOB+4HgA2c9wgACYt+B/ +IKDxwFIJz/gacADez3CBADAdFBATABYQASHPcIAAyC8AgCCgOfDdZrR9QCAPIQAnUhMAIkAjAZAO +C2AJCrjPcYAAyC8ggUAuEREM4SJxAKG4ZwKQqWcKuAUp/gTqCmAJJ3AIcc4Nr/oAEAAgz3GAAMgv +IIFCdQThInEAoQGNAeYFKP4Ez3CAAMgvAIAI4CJwABhADhYQACGRDgSQEQHP+OB48cC6CO/4A9mC +JAI7OnEI6KkIUACBCJAAKnWM8M91gACYt+WNi3AybzR5ACVQEAgQkCAAJUQQAdmqC2/6CnIK8DJv +NHk6ZUiKACVEEEUKAQQIdiZoJ9gArg/YAa4A2ASuA64HtgkUgAAB5wKuChSAAMG/Ba5AJAADvg/g +BgjaENkwriaNQCZAFEAhUSS1D0GQ5a3E8c9xgACYt1YRgABUEY0Ah7hWGQIAVCHACotxA+WGD+AG +qXI+8M91gADQt4twIgtv+kCNI9pAqALaQajPcoAAoINikgjiamIiaEKoAo1huAsI1AMA2iDwMyYA +cIAAbEZAJ4JyFHoAeooi/gkW8IoifgsS8IoiPgsQ8IoiPgwM8IoifgwK8Ioifg0G8Ioi/g0E8Ioi +vg4BjQfdQngBqZ/HQCcAFSoOb/rQ2aoUgTCVxslwuWEweboOb/oA2kAnABVRwFLGi3BTwFAcRDOu +CK/6kcC1B6/4gCQCO/HAWg+P+Ah1DpCzCBQBqXBqDKAJANkgiIHhzCGigE/0IYibCRUBMyZBcIAA +XEZAJ4ByNHgAeKlwQgygCQTZAIh7CFEAqXA2DKAJCNkAiG8IUQCA2c9wgABwhCawMLknsCDYK/DP +doAAKQkAjjkIUQCpcAoMoAkE2QCIAdmC4MB5FQhQAILgzCCCjwAA/gAI8gDYCfBaDaABqXAF8PYK +4AGpcACui+gQ2M9xgABwhAh0hrEwvIex/gzACQ0Hj/jgeOB+4HjPcQEAxwPPcKAA7CcmoOB+/BwI +tPHAGnA6DK//JNiYcFEgAIDKIcEPyiLBB8oggQ8AAFEmyiOBDwAAKQGkByH6yiUBBM9xoACsLxiB +hwgRIA8IngbPcIAAoC8AgEB49NgA2dILr/8B2jTYANmRucYLr/8A2jDYiiEGALoLr/8A2jTYANkD +2q4Lr/8UusYLr/8w2MK4CQhRAADYA/AE2M9yAQDGA89xoADsJ0ahz3OgALQPPIMj6QESBDZwEwUA +CiHAD+tyz3AAAFImGQcv+oojRQaauBihWgxgCYogDwrPcIAAoC8AgEB4RgxgCQHYdgwv/4ogBQOH +6ATY0cDgfwQUEDRE2c9woADIHCmgIgxgCQHY0g1AAcLx8cB2DY/4osEodgokgIAA3891oAAsIEAV +EBAAHMQzE/J3DFAATCSAgILyCiHAD+tyz3AAAFQmiiNEBZEGL/oKJQAEMmgEIYEPAAD8/y4Lr/8s +2BCFAiAABIwgD4oI994Kr/8s2Ah37wgegAXwAIaAuACmygqv/zTYFwheBQCGANkA2oG4AKY02JIK +r/+VujC/AhzEM3zwD3kQuQUhgg8AAIL9z3GgAOwnRqEEIIAPAAAAH0i4hrgQuAUggA8AAEL9BqEQ +hQIgAASMIA+KC/eLcZ4Lr/mKIA8NABQAMecIHoAE8ACGgLgApoHBhguv+YogTwwEFAAxDQieAACG +gbgApot1iiCPD2oLr/mpcSDACLgCHAQwiiDPD1YLr/mpcSDBAhQAMSV4AhwEMDLwz3EDAEL+z3eg +AOwnJqfPcQQAAv4mp4a4EHgQuAUggA8AAEL9BqcQhQIgAASMIA+KC/eLcQ4Lr/mKIE8PABQAMecI +HoEE8ACGgLgAps9wBgAC/wanQCSBMOoKr/mKIM8OAhQAMUkEr/iiwOB44H7geOB+4HjPcacAiEkA +2gsIUQAD2A6hAvBOoeB+4HjhxeHGz3WAAOgvoI0A3sCjke2B4MwhIYAN8gsKEwjAownwwOIG2Ab2 +QiIACEO4AuAAo8HG4H/BxbhwQNwAIQCD8cAOACQAmHGMIAKAi/YKIcAP63LPcAAAyRS5BC/6iiPI +D89wgADASfQgAAHPcYAAwEoEKH4BL3D1IQEBQigDBMG7UrgEKX4BL3FCKQIEwbpSuYHjwCBpAIHi +wCFpAIggPgCJIMEPiCE+AIkhwQ+A4NYgKwiA4dYhKwhyCQAA0cDgfuB48cDuCo/4ocE6cQDfgODK +IcEPyiLBB8oggQ8AAMoUyiOBDwAA0wLKJMEAJAQh+solwQPPcYAA7C9Asc9xgADuL+CxTCEAoMol +zhNkAC4AyibOExp3WncF8Ml3GnVqcEAgUwCLcQHa1gjv/wDbABQNMS8jyCSpdim9yL6/5dklKRRM +IgCgyiDCA8ohggPKIgIESA0iAMojQgPJcN4O7/+pcUIhUSC1CXWgQCJSIMlwHgkgAKlxkQKv+KHA +4HjxwDoKj/g6cM9wgADoLwCIGnGVCBEAz3GAABQKpYkEiR1lMnXKIcwPyiLMB8ogjA8AAMsUyiOM +DwAAOAPKJEwEUAMs+solTAMA3c93gADpLwDeCfAA2SCv7g7v/4rZAebPfgAggS+AABQKJokBaTEO +AxBAKYAgFHi1eNR4z3OAAFS6EGNSbW3oAuAQeNR6z3OAAEi6UmPg6QHZ3/EB5a99sQ3SkPUBj/jx +wJoJj/jPc4AA7i9Ak1MiTYAg8kcNkRDPdYAAFAoJrSitIoXPdoAA7C8AlindEr3Pd4AA6S8VJQwQ +IKTgjwfvViAPCPB/9X0gpQHgALYH8M91gAAUCgutKq0B4qUBr/hAs+B48cAyCY/4CHYacc91gADu +L+CVC/DMf94Kr/hAKUBxRbiODe//CnEglYwhEIC09mkBj/jgePHA8giP+Ah2z3CAAOgvAIh6caHB +GnLLCBEAz3GAABQKpYkEiR1lcnXKIcwPyiLMB8ogjA8AAMwUyiOMDwAAhQPKJMwEDAIs+solTANK +IQAgAN0K8AEeUhAGj4ToIK4B5gHlr33Pd4AAFAoAJwAUBogB4GMNIxACd0ArgCAUeBUgQAS0eM9x +gABUujQhEgAA2cUKEKCLcUpwAtqmDq//ANsL6AEUgDABHhIQBo/a6AEUgDAArtXxCiHAD+tyz3AA +AM0UiiOOBgokgASJAS/6SiWAAEAhUSAvIUckeQnSoG0Ar/ihwADbYKkRCHIAYKoNCNMDYKngf2Cq +DwiSCMDgBfYB2ACpEfDk4Ib2jCACg8ogrADJ9owgQoSJ9owgQokH9gPYAKkB2OB/AKrgfvHAyg9P ++KPBSiEAIItxKnBKIAAhCnL+Da//KnOO6AohwA/rclPYBriKIwUBCiRABPUAL/oKJQAEIMIVChIA +AMBBKAECUyHEABMMEgEB2c9wgADoL1UCIAAgqM9xgAAUCkCpAhkCAUEoDgNTJsUQAxlCAUwlwIDK +IskHyiCJDwAAwhTKI4kPAABYAZwAKfrKIckPQSgCBFMixgAEGYIBQSgCBVMixQAFGUIBTCZAgMwl +7IDKIckPyiLJB8ogiQ8AAMMUyiOJDwAAXgFcACn6yiSJAUEoAgZTIsQABhkCAUEoBQcHGUIBTCRA +gMwlbIDKIskHyiCJDwAAxBTKI4kPAABkASQAKfrKIckPBBSFMIwlAYS0ACwAARlCAQohwA/rcs9w +AADFFIojRQr9B+/5mHPPdYAAVLoA3wPwAefvf0EoAQLDuW0PQxAA3hPwQCmBIDR5ChSAMBUhQQEB +5s9+FHm5YQAZBASAIAIjLyAIJADAQSgBBsO5AeHDDkOQgsEKcALakgyv/wDbCxSEMC8oAQFOIIUH +LyVHAbUN0oAKIcAP63LPcAAAxhR9B+/5iiNGAkAhUSAvIUckQSgBBMO5ewlCoATwbQ5TgEEoAQXD +uQp1qQlyAEogACBKIgAgBfBAIlIgLyKHJEEoAQPDuXsKQyBKIQAgFPACvtR+ChSAMBUmThFAIVEg +LyFHJBR+ACaAH4AAVLqgsIAlAhOwfQDAQSgBBwHhuwlDoDC4w7gAIA4EgsGpcALa3guv/wDbCxSE +MC8oAQFOIIUHLyVHAasN8oDPfgohwA/rcs9wAADHFMkG7/mKI4YIQCBQIC8gByRBKAEFw7llCEKg +09kIuQDYA97PcoAASLoA27JodH1dZSC1AeNve1YhAQjxC7KAMHlhvgHg5w51kA94fQVv+KPA4Hjx +wAYNT/iiwUDAQcJAKBQFQCkXBQDdQCoTBUArEgUB3kolgCGpdwTwCnXKdwDAFbgTeBQgwAWuDm/4 +B9kCIFADAiBAI54Ob/gO2cx+CiFALgQpPnAvcKx+ACENdR1lAcAVuBN4FCCABHoOb/gH2QIg1gMC +JsAjbg5v+A7ZBCh+BC9x7H4AIcB0GWFCLQAVEgnv/1S5QiVVIAHmkQ11oM9+rQRv+KLA4HjxwGIM +T/g6cLpxz3CAAIDTAJBKJEAgANlKIEAghiD8AIwgAoDCJAIlSiKAIM9wgAAwmSuoz3agANAPJRYP +liUWDZZCIYAgEBYWlisIRAMCIFEDDCGApMoiLiA6Cu/46XCYcADYKQwQIBUPUBEND9ASB/BKIwAg +LvAB2APwAtjPcYAAQB8kgQshAIAE8gDaA/AB2gAiQCP6CS/6ynEKIwCgGPInDJADz3CAAGAnFiAA +AUCABogrDwEQE+qpcGB6qnEKIACgBvLCdRAeWJNpChGgTCMAoMwgIqAR8gDYEPAKIcAP63LPcAAA +MRGKIxcLSiQAAN0E7/kKJQABE9ixA0/48cDhxc9wgABsMAgQBABMJACAyiHBD8oiwQfKIIEPAABp +GcojgQ8AANABpATh+colAQHPcqUACAwIEgUAANlMJQCAzCUihMohwg/KIsIHyiCCDwAAfRnKI4IP +AADXAXAE4vnKJCIAQNgCos9wgADsw2CACvD0IE0Az3CmAACANXgB4aCg0uGEKwIKACRADrT3pBAD +Ac9xpACgP32hphAAAR6hCBpAAVEDT/jgePHAWSRcOItwz3GAAPRGigtv+IoiBAJKJEB4ANmoIAAD +FiRAMGGAQJAr2BK4AeFVeGCgMHlWJFw40cDgfvHAwg4gAEfYANrPcasAoP9ZoQfYGqFYodHA4H7g +fuB44H7gePHAz3GAAGwwOIGA4SQOAgDRwOB+8cDPcYAAbDA9gYDhiA8CANHA4H7lB0AI4QdACN0H +QAgA2c9wgADswyGg1QVgAiKg8cDhxc91gADsw94PYAKpcLhwAIUS6EokgHPPc4AAzC8A2aggwAJA +g0QpvgMyIkIOPwpAAQHhEfAA2UokgHnPcoAACFioIEACRCm+AzIiQw4fC0ABAeEKIcAP63LPcAAA +hhmKI0QBGQPv+UokAAA5Am/4KHDPcIAA7MNAgCOADOrPcIAAzC8AgEQpvgMN4DIgQA4J8M9wgAAV +WEQpvgMyIEAO4H7PcAAAPj3PcaoA8EMFoc9yAAA9PUahiiDIDwehz3AAAAYLCKHPcAAAERYJoc9w +AAAbHgqhz3AAAB8eC6HPcAAAGxYMoc9wAAARCw2hiiCIAQ6hz3AAAD89D6FQoT7YEaHgfuB48cAi +CU/4lg2gAgDdRg0gAAfYRg7v/xpwz3akALg9rBYAFs93pQDYy2nZoNqiuKweGBCspwHY9h4YEM9w +FQArK5oeGBDKHlgQwNjLHhgQxB6YEM9yAABubpsemBCKIsQAnx6YEBra8x6YEPQemBBk2sgemBCq +2skemBDMHlgQzR4YEDnZz3ClAAgMPqASD8//zgkgAApwGNiVHhgQz3GAAMwmoaHI2AKhAKEDoc9x +AQC40c9wgADcINQYQACU2AunQdnPcKUAzH8toM9wpAAMgKKgtQBP+OB48cAaCAAAJg/P/6oNAADu +DQ/70cDgfuB48cAqCE/4z3CAAJjQQCASBghxz3CAAEwJIKAA3sSoBN9ELj4XCiFALgAhgH+AAJjQ +rgkv+hzZhC4KEgAhjX+AAAjEqXCaCS/6iiEKAoQuAhcAIYB/gAAozhpwhgkv+pzZACGRJAAZQCNh +v6EdGBS1D3WQAeYRAE/48cC+Dy/4RCg+BwAhjn+AAJjQEK4B3/GuIa5ArmKuAx4CEXKuUgkgABMe +AhH5Bw/48cCGDy/4RCg+BxpwOnHPcYAAmNAvcBphUYobYR8KUAAKIcAP63LPcAAAsihe24okww+t +AO/5CiUABBUI0CDPcoAATAkEGgIEOGAAogGLIItSi+oLIABzi84PAAEKcDINIAAqcYEHD/jxwOHF +CHVqCiAGANiOCs/7RNnPcKAAyBwpoE4Ir/gc2M9woACsLxiA+rhwDmECyiBBA//Zz3CrAKD/OaA4 +oDIO4ACpcFkHD/jxwOHFRgzv/wh1bgvgAqlwRQcP+M9xoADIHAihAQCv+AbY4HjxwLoOD/iiwaKB +YJDPdoAAlAm4e6OBZH1ghqV7poEBkLh4p4FgpqR4oYZAIQ8EpXgBph3qAYECHMQwMLsEHMQwABwE +MCCBi3VgealwAYchhgIcRDAwuQQcRDAghwAcBDBgealwANgApgGmuQYv+KLA8cBKDi/4nNkIds91 +gAAozoQoAgcvd94P7/kAJUAe4g2gAfhlAgkgAMlwiQYP+OB48cAeDi/4AdqEKAIHACGNf4AAKM7P +cIAATAkAgCh2IIgAhpkdghBMhTC4D3iJClEAA9qZHYIQgQkBAATYmR0CEBCFjegF2JkdAhAIhhKl +A4YRpRyGFKUXhhOlqXA2D2AByXEQhQHgUQg0BBClBtiZHQIQqXBiDKAByXGpcHoNoAHJcalw4gug +AclxqXDGDaAByXGpcNINoAGpcZgVgBAZCFEAB9iZHQIQcgggAAJtANiYHQIQ1QUP+PHA4cUIdYQo +AgcAIYB/gAAozs9ygABcO0iSHwpeACCBFwlUAQDZLaAuoO4MoAEvoPIIIACpcKUFD/jgeIQoAgcA +IYB/gAAozs9xgABcOyiRCQleAAHZLKAA2eB/MKDgePHABg0P+Ah1JgkgAAXYQJUhlQi6RXnPcqQA +uD2bGlgAIpXPc6QAtEXKGlgAI5XLGlgAJJXEGlgAJZXGGlgAJpXHGlgAJ5XCGlgAKJXDGlgAKZXF +GlgAKpWjGlgAz3GAAJwoI4EogQDeGQkeAEyVK5VbekV5UxtYgC2VVBtYgAbwUxuYg1QbmIMulVYb +WIAvlVgbWIAwlVUbWIAxlVcbWIAylVobWIAzlVwbWIA0lVkbWIA1lVsbWICCDc//tQQP+PHAhCgC +B89xgABcOyiRUyFBgM9ygAAqzi9wBfImD+//WGDRwOB+4HjxwOHFz3CAAMAvIIAB3WB5qXDnuCe4 +UiAAAMolIhDKIUIDyiHhAcC4E3jCuM9ypwAUSAuiLKLPcKoA4AezoFUED/jgePHA4cXPcaAAyByo +gQihCg1v+AbYOQQv+Klw4HjxwL4LD/gIds91gADswwClIaVYrXoJ7/95reoJ7/8DpQSlz3CgAHhF +AIAEIIAPcAAAAEEoPoUA3fX1yg7gBalwz3GrAKD/uaEH2BqhuKG2CoACgOYB2MB4DOCiCO/6AdnJ +Aw/48cBKCw/4CHfPdYAA7MMYjUh2OnEacxMKAQCF7hmNCwgBBADYAvAB2C8iByDpcLoPYALJcSCF +ANgPD0EQIYUyccwiIaAC8gHYLyYH8BqtF/LpcCpxyXJKD+//CnPmCgADAYXPcYAAeAkAsQCFAbEY +jQSpQgogAwpwCPCA5wHYwHgM4BYI7/oB2R0DD/jxwAhzANkC2oQrCgIAIYB/gAAIxIQpBA8E4L4P +4AUncGG66Qp1gAHh0cDgfvHAz3CBAFAfPgzv+YohCQzPcIAAvCsyDO/5FNnPcIAA4C4mDO/5FNnR +wOB+8cBeCg/4osE6cBpxAN2SDu//B9iacALZqXBacHpxANs0aAJxKHUUIQAgaHLChQQQDwXYf8OF +AeLEf+V78Qr0gCDlAYECHMQwMLsAHAQwIIEEHMQwYHmLcEIjQSC/CXWAQCJAIEYL7/+KcEkCL/ii +wPHA9gkP+DpwWnHPd4AAcPAMj892gADsw6WGhiD/AUO4DiUNkM9wgACwLyCAyiViEGB5BNgg6BqO +gODMJSGQHPIA2BDdGnACuBV4x3CAAPAvIIAG6SKAFelgeSpwYb3pDXWQQCBAIADYGq4Mj4Yg/wFD +uAWmPgiv+Epw2QEP+AohwA/rcs9wAABlGTfbCiQABMECr/m4c+B48cBCkCGQYJAQukV5KdoSuhUi +wwAgowCQ8CIAANHA4H7xwOHFz3GAAAjRAIEA3RXoz3KAADTRAKIIgaChpKEIoioNr/oJ2CYNr/oD +2M9wgAC4QZINwAbPcIAAFDOeCqAAA4DPcIAA1DZ5AS/4r6jgeNEAj/rxwF4KIAPhxc9wgACAQWIN +4AYA3c9wgACcQVYNwAbPcIAAuEFKDcAGz3CAABQzoqDGDK/6A9jPcIAAnDajoDEBL/ihoPHA4cXP +caAArC8cgb2BBH3PcIAA2CcAiBMIUQDPcMDfAQAcoSjZGLkJ8Py9dAsCA/a90A2C+gDZm7nPcKAA +0BsxoOkAD/jgePHAIggAAKIOAADRwOB+4HjPcIAAFDMAgIHgAdjgf8B48cBOCA/4z3CAAHjRx4DA +voHmAd7PcYAAgDgAgcB+UQhfAIG4AKHPdaAArC8YhQ0IngYYhbq4GKUC2Balz3CAALAvIIBgeQDY +GQgRApoOoAgK2Avwz3CgAKggDYDk4Ir3FYX1CB6ACgnv/8lwTQAP+HAVBBBUFQUQCiHAD+tyiiBM +CRkBr/mKI4YN4HhTIGDBz3CgAKwvGYCGID4DA/IA2APwf+gB2C8gB4AH8gHaz3GAABQJQangfvHA +4cXPcYAAHEhAgSGBp8FGwc9xgAAUMyKBRcIVJEIwz3GgACwgsIHPcQEAQBRAwQHZQcFCwRDZQ8FE +wEWCANgM2QhzmHC4cAAlhx8AAAB9eg/v/NhwtQfv96fA8cAmDw/+z3KgAMAvANmIGkAAE4KLuBOi +z3CAADAeAZAQuEUgAA/AGgAAz3CAACg23g5v+iCg0cDgfuB48cAA2Zu5z3CgANAbMaCaCoAADOjP +cIAAvAkggM9wgABUNvAgQABAeNHA4H7xwMoOz/cacM9wgAB40QeAz3GAAJwoUyAPAIHnAd8ggcQR +AQbAfzsJXgHPcYAAMB6hkc9xgADcCcCBPOW5ZmThHwkEBAohwA/rct1liiDMCFrbCiQABMkHb/lV +JUUWIQjRAM9wgAAwHkGQz3GAANwJIIE84llhZOECIFAgC8gEIIAP/v//AwsaGDALyIe4CxoYMBoP +r//pcM91oADAL0kPURAQhTUIHwDPdoAAuC8ghmB5AdgPCFEBIIZgeQLYHQiQAEAVBBAKIcAP63KK +IIwIjdtNB2/5uHOKIBABEaUQhf8IH4AUhau4FKXPcIAAYCIAgILgEtjAKCIGyiAhAM8gYQYZpc9x +oADIHxgRAIahuBgZGICKIBAAEaEJ2Ai4D6ETham4E6XPcIAAeNEHgIPgzCDigQb0QCiAIJ+4iB0A +EOIMwAbPcYAAgDgA2OEF7/cAoeB48cANCVEA9gsAAATw0gsAANHA4H7xwGIJoADhxYIKr/oa2M9w +gAAsNgCQz3KAAGDRUiABAMC5AeEgqgDZFwhfAM91gACcNmqFCwtQAGuFgeMC9AHZI6pBKIECwLk0 +qim4wLjPcYAAFDOJBe/3AKHgePHACg3P9891oADALxeFGoXPdqAAyB+IFQAQB9gZHhiQAdgIcQhy +CHOqDO/+mHCAFQ8QIr++CuAG6XDPcYAALD0SgfhgEqEA2IgdABAJ2Ai4DqYhBc/34HjxwPYMz/+A +4ADZyiBBABnyGgtgByhwz3GAALwJIIGKIEwGxgxgAAPaGg5gAAPYTg9P/AjYIgwgAIoh/w8B2NHA +4H7gePHAz3CAALwJAIATCNEADgjP/PYLz//qDgAA0cDgfuB48cBODO/3SiRAcQDez3WAAJw2QCUD +HKggQATPcYAALDbVeeOBFSOMA+CkCwhRAAHf46EB5s9+Adh9BO/3RB0CEM9wgAAI0QHZJKglqM9x +gAAsNgCRhiAYAKi4ALHa2AOpz3AAAFDDAaHPcAEAoIZ9BGAAAqHxwM9ygADUNg6KocFdCFEAD4of +CBMBgOB0D+H/yiBhAA+KAeAPeA+qocDRwOB+ANgNqg6qOgggAA+qlg/P/wDYCgzv/4y4z3CtC766 +QMDPcIAAHAkAgIroi3AE2X3aPdt6CaAFF7vi8eDx4Hjhxc9ygACcNkQSgABAIgMMJwhRAEokQHEA +2aggAAPwI00Az3CAADg2NXgB4aCgL3kA2EQaAgDgf8HF4HgA2s9xgADUNk+pAdgNqU6pTKlQqVGp +UqlTqeB/VKngePHAEgvv9wHaz3GAAJwoY4F4izkLEQEAgc9xgAAUM8QQAAYluFIgAAAhgcC4AdqA +4c9xgQAwHSaBwHqA4cwgIYDMIiKAfPKA8BEIHgDPcIAAYNEAiAkIUQCYcgTwSiQAAM9woAAsIHCA +z3aAAJw2RYamhgIjgIAA2soibwACI0+DAN3KJW8QFw4FcABAAAAH6gIjgA9OAAEgBaYXDsVzAEAA +AAftAiOAD04AASAGpgGGFujPd4AALDYAhuGHH2cRDwUQGQ/FEBELBAAI8AkLBAAJD8UQANgD8AHY +AaYggcQRAwZBK0EBUSEAgMomYRAG8imGg+FvJgsQz3GAABQzIYHPd4EAMB3mh4DhAdnAeYDgAdjA +eIYnfx6G59EjYoEA2wL0AduA5cwiIoDMIyKAzCAigMwhIoDMJiKQBPQA2AXw/QwQgAHYNQLP9+B4 +8cC6DMACz3CAAOguBIBRIICAKAgC/gnZCLnPcKAAsB80oNHA4H7geM9ygAAUMyGCBnkhogDZz3CA +AHjRMKAlgOB/MaDxwIYJz/fPdYAAFDMhhSV4AaXPcYAAeNEQgaHBhegB2BChBYERoWYJr/2LcADB +z3ABAHQIGQhAAM9wAQBAFBEJAADPcAEA0DELCQEAQgjv/AHYAN7PcIAAnDbBoCYNb/oH2CINb/oI +2IIKwALPcIAAgEGKDYAGz3CAAJxBfg2ABs9wgACcKACAxBAABg0IXgGGDSAAyXAF8HoKYAADhVUB +7/ehwPHA4gjP9wh2AN3GDe//KHCA4MogQQMMCeL/yiCCAzEBz/fgePHAz3CAADygCIBFCN8Bz3GA +ACw2QoEhgc9wgACANkCgz3CAAJw2J6DPcYAAvAkggYogRgC6CGAAAtoSCmAAAthmC+AFAtgCDg/6 +CPDPcIAAFDP6CWAAA4DRwOB+8cBeCM/3KHU9CNEAz3GAADAeIZHPc4AA3AlAgzzhOmIhg2TiWWEh +CUQDCiHAD+tyiiCNAYojxgdKJAAAcQFv+QolAAHPcYAAeNHPdqAALCDwhp4LYAAHoZIIAAfSCm/8 +AdgyCe//qXAB2IoPYADpcc91oACsLxyFEwhfBhiFiLgYpR4JL/ig2Afwz3GAAIA4AIGCuAChwgrP +/0oKQADQhpIKb/wB2PoMAABSDmAIMtjPcACCAQAcpUIPL/oCJsATANgyD2AAyXH9B4/38cDhxc9x +gABg0QARhAAhDHMApcEDEYUAFQ1QAAohwA/rcoogDQG9AG/58ds3DJEAA4mZ6ADYAKnPcYAAvAkg +gfnYB92CDyAAqXLaCGAAqXDPcIAAFDNKDq//o6A+Do//XvDPcYAACNEEiR0IUQAFiRUIUQDPcAAA +//8+Du//ANmdCBAAz3GAAJwoAIHEEAAGDQheAQOBGIgbCBEBz3GAALwJIIGKIMQEHg8gAALaAtg0 +8PYKQABpCIQPAAAUBM9wgAAUMwCADQhRALYMD/oo6ADZz3CgACwgsIDPcAEAdAhAwAHYQcBCwEPB +RMEG2QhyANuYc7hzACWHHwAAAH3ODq/82HPPcYAAvAkggYogBAq2DiAAAdoB2AoIQADtBq/3pcDg +eOB+4HjxwGoOr/cA2c9yoAAsINCCz3CAAJw2CIDPd4EAMB0CJg0Qz3CAAGDR5YdjgAUv/hA3dQHb +oIjCI84ApcELDVAQA4gjCFEAz3CAABQzI6DPcYAAvAkggc/YRg4gAADaANhH8M91gACcKACFxBAA +BocIXgGDC1EAA4UYiHsI0QDPcIAAFDMBgLfoz3CAAMgmAJCB4AHYwHgMuFsIgA8AAAAQsILPcAEA +QBRAwAHYQcBCwRHYQ8AA2Iy4RMAocAzZAdoIc5hwuHAAJYcfAAAAfdYNr/zYcM9wgACcNs9xgAC8 +CSCByKDY2LoNIAAI2gjYDg8AAOEFr/elwPHA4cUA2c9woADQG5u5MaDPcIAA6C4EgDsIngAaC0// +z3WAAJwoTYU+lVMiAACGCGAEAdsAhcQQAAYbCF4BA4UYiBMIEAHPcIAAeNEHgBEI3gDPcIAAFDMD +gAzwz3GAALwJIIGKIEkHPg0gAALaAtiSDgAAdQWP9/HA+gyP989yoAAsIDCCz3CAABAnBIDPdoAA +nDYAgKCGAiFDA9dzAACgDwDfy/fPc4EAMB2lg9W4QS2DEGJ9CwhEAwGGoOhjhuGmbwtQAM91gAAI +0QCFHOgFhRroMIICeddxAABQwwHYwiAOACXotgjP/wSF5aXjpqC4BKXiCi/6ANgb8JoJb/oH2Bfw +BesGhgJ5JwlSAFMggMEEpg30z3GAALwJIIGKIEsChgwgAALa2g0gAALYrQSP9+B48cDhxaHBiiD/ +DzoMIABAwGEIUQDPcIAAnCgAgMQQAAYjCF4Bz3CAAMgmAJDPcYAAvAmB4AHYwHgMuCUIgA8AAAAQ +z3GAALwJIIGKIEUHJgwgAADaeg0gAADYOfAggYogRQgSDCAABdpmDSAABdgv8M9wgAAoNkCAANkL +ClEAIKAl8M9xwN8BAM9woACsLzygz3AAgP//zgrv/wHZF+jKDqAFi3AKJQCQEfLPcYAAvAkggYog +xgG+CyAAA9oSDSAAA9ipcB4L7/8Awe0Dr/ehwPHAuHDPcIAAvAkAEAQAz3GAAFgyQCyAABR4FSBA +AQBhFQiRAgohwA/rcoogzQCRBC/5oNvKDAAA0cDgfuB+4HjxwOHFz3CAAJwoA4AYiB8IEQEKIcAP +63KKIE0BiiOEDUokAABZBC/5uHMaDwAACHXPcAAAv98eCu//ANkLCFEAjCUQlRD39gmv/AHYz3GA +ALwJIIGKIEUCCgsgAADaYgwgAADYQQOP9+B+4HjxwMYKj/dqC8AGz3WAAGAiAIXPdqAArC8fCJAA +GIYXCJ4GGoZSIAAACwgeAByGCwgeByoKj/8chjcIHgDPcIAAgEEAgEIgAIDKIGIAkejPcoAALDYJ +ghsIFQHPcYAAnCgggcQRAQYLCV4BAeAJovIMj/jqD8/9GwhQAACFEwiQAM9wgAC8CQCAg+DIDMH/ +pQKP9+B48cAyCo/3z3CAABQzAIAtCFAAz3WAALwJIIWA4cwh4oHMISKCCPKKINEAAN42CiAAyXLA +pX4NT/xlAo/3CiQAgPHADPIKIcAP63KKIE0CiiOODS0DL/m4c+IIj/9mDu//AtjPcAEAQBTiCa/8 +AdnRwOB+4HjxwL4Jr/cG2LIND/rPcIAAVB9KJAAAABgAAc9wgACcKAOAGIgXCBEBCiHAD+tyiiDM +Derb1QIv+bhzz3CAAMA/8g1ABs9woAAsINCAz3WAAJw2IIUCJkAQEQ4CcAAAIE5+Di/6B9jApc9w +gQAwHQaAUSAAgGgOIvrKICICKgygBQDYqQGP9+B48cDhxS4NL/oI2M91gAC8CQCFh+DMICKCN/LP +cYAAnDZBgQfqz3KgACwgUIJAoc9ygQAwHUaCUwoeAITgzCBigRb0z3KAABQzAoKH6ACCOwhQAAOB +GegA2c9wgAAI0SmgKqAA2D4Jr/+MuA/wgODMIKKBC/QDgQDaBujPcKAALCAQgAKhQ6EghYfhzCEi +glHyz3WAAJw2AYWD6AOFI+jPcIAAyCYAkIHgAdjAeAy4NwiBDwAAABASDe//AdjPcIAAFDMAgGsI +UQADhYHgyA7h+cogYQADhYDgvA7h+cogoQAn8I7pz3KAAAjRCoIJogDYCqLPcKAALCAQgAaiz3CA +AMgmAJCB4AHYwHgMuCMIgQ8AAAAQz3CAABQzAYCJ6IoghQZGCCAAAtqaCSAAAth9AI/34HjPcoAA +nDYBggDZhegDgoDgAvIB2VMggMEEogHawiKBAADYgOHMIiGAAvIB2OB/D3jhxeHGz3WAACQzwBUD +FhML1Q/Sa9R+vmYApiGmQqYBa8W4wB0YEMHG4H/Bxc9xgADUNg2JMwhRAM9wgAAsNgCQ6bjRIKKC +CPQA2A6pDakVBK//D6kB2A6pD4lCIACAJQOv/8ogYgDgfvHAZg9P9/4Jj//Pc4AALDYAk89ygABg +0UEogQDAuSGqz3GAAMgmIJGB4QHZwHkMuR8JgQ8AAAAQooPPcYAAgDagoaGDz3GAAJw2p6E28M9x +gAAUM6CBKQ1REM92gAAI0SSODwlRACWOgeEB2QLyANmA4cohgg8AABAnA/Qig892gACANiCmKQ1R +EM91gAAI0SSNDwlRACWNgeEB2QLyANmA4cohgg8AABAnA/Qhg891gACcNielqXHPdaAALCDQheWB +AibNEwkN3xfFoeaBAibNEwkN3xfGoSiDhunPcYEAMB0okSOiJbjAuH4JL/oD2d0GT/fxwM9xgAC8 +CQARBAC4cM9ygADsNkAsgAAWeBUgQAEAYhUIUQEKIcAP63KKII0AlQfv+HbbABlAAbsIkAA9CBEB +z3GAAAjRAIGrCBAAz3KAADTRAKIIgQiiANgAoQShFgov+gnYDgov+gPYz3CAALhBegpABtHA4H4j +CFEAPglgBQDYC8gEIIAP/v//AwsaGDALyIe4CxoYMO7xz3CAAOguBIAhCJ4Az3CAAAQ6AICK6JIM +7/2Q2A0IUQC6DsADDvAA2p66ANnPcKAA/ERBoOB4IaDqCGAFKHDPcIAAnCgDgBiIDQgRAeINT/2F +6OIPQALC8cLx8cCCDU/3z3WgAMAvOoXPcoAAgDgAgncIHwCAuACiz3CAAHjRx4DAvoHmAd7Afg0J +HgcQhQkIHwAA2APwAdgPeB/uMIUfCZ8CQBUEEEwVBRAKIcAP63KKIEwJdQbv+IojhQYTCFEAiiAQ +ARGlrgsgCArYiiAQABKlogsgCAXYz3CAAKgvIIBgeclwZQVP9+B4z3GAABQzQIEnClEAz3OAAAjR +BIsNCFEABYuB4AHYA/IA2IDgyiCCDwAAECcF9M9wgAAsNgKAz3OAAIA2AKMpClEAz3KAAAjRBIoP +CFEABYqB4AHYAvIA2IDgyiCCDwAAECcG9M9wgAAsNgGAz3KAAJw2B6IJBu//A4HgeOB+4HjPcoAA +LDYgkgOKgLmnuKK5hrggsuB/A6rxwFoMT/fPdoAAHAkAhp/oBgpv/lTYMwheAQHdoKbPcIAAgDbK +DuAHA4DPcYAAwAkAgYG4AKHPcIAA1C/yCaAIAICpcATwANgC8AHYeQRP989ygAAsNiCSA4qAuae4 +ormGuCCy4H8DqvHAWgggAOHFHgggAAh15gggAAhzcHXKI0UDEHNJBG/3yiDFAPHA4cWhwQDdQMXe +Cy/9i3CC4Iog/w8M8s9wgADEQgOAIIAAwCJ4gODKIEwDFQRv96HA4HjxwKHBANhAwM9wgABg0SGI +i3AnCVEAz3GgACwgMIHPcoAAnDZIgkJ5Dw5FcE4AACC6Cw/9A/CaCw/9EQiRAIog/w+hwNHA4H7P +cIAA5EIDgCCAAMAieIDgyiAsAPPx4Hjhxc9xgAAQJySBIIHPc4AA5EJDg9W5oIJGg4og/w+A4gXy +AoKieEggAAAJIEAAarhIIAAA4H/Bxc9xgADkQguBQIAOgYDgyiCBD/////8K8gKAQnhIIAAAmSAG +AEggAADgfuB48cDGCk/3ocEId89woAAsIEAQEgDPcIAAgNNfgADdRCcBE4jhQSqAARpyhiD+L0oh +QCDCIUIkwLhBL0ITwLrPdoAAnDYWJgMQQaOI4cwgIYAI9AGGBOgCDI/8BPCaC4/8z3CAAJwoA4AY +iA8IUQDPcoEAyBQX8PoJz/036M9wgADkKwiIYwjRAc9wgACA05gQgADPcoEAyBQCuBZ4AGJLCF4D +z3CAAIDTmBCBABJpFngaYisPHhMAgoi4AKIB2A+qz3CAAJwoAYDAEAAGESBAgMwhooM8DAIIB/BG +DCAIr6qA4DQMAgjPcIAAvAkggIfhzCEioELySnB/CBAgCKaJ6c9xgAAI0QqBAeAKoSbwRhaAEEUI +UQDPcO3+vrpAwM9wgAAcCQCAgODKIAEHyiEhAcoigQ8AAH0AyiNhD5QP4QTAK+EFRh5CE0UeQhMa +Dm//Rx5CEyIOj/kHhiaGQnACIEIACQrfBwamTBaAEA0IUQBMHkITAvAApqkBb/ehwOB48cBSCU/3 +CHbPcKAALCDwgB0O8hEA3QohwA/rcoogDQKKIwkDmHV9Au/4uHM3CZAB9g6P/89wgACcNuigz3CA +ALwJAICA4Mwg4oEJ8s9wgAAUMwGAgOBwDYH5z3CAACw2qaDPcIAAgDbPcYAAFDMggfAggAP4YA8J +UQDPcYAALDapoc9zgACcNiWDAiBCAAkK3wcFoyUBT/fxwOHFCHUE2c9woADIHCig6gmv9xbYz3Gg +AMAvE4GA5c8g4gLQIOECE6GA5TzaBvTPcIAAMB5AkM9wgAAwHgGQELhFeMAZAADpAE/3z3KgACwg +UIIies9xgADcCRV5AIEXCIUAz3CAAJwoAIDEEAAGBwheAUCh4H7xwEYIT/cA3s9woAC0D7yAegsg +Bclwz3KAAFiTBJLPcaAA7CcQuIUghAAGoQWSELiFII0ABqEHgs9zpwAUSAejCIIQowOCz3OkALg9 +mxsYAASCphsYAAWCkhsYAAaCoxsYAM9wpADs/8agiiCKAAahGgsgBa94z3CAAOguBIBRIICATAui +BsogYgApAE/34HjxwLYPD/fPcIAAuC8ggM9wAABsuKHBgQkBAM91gAAIJwCFAeAApQDeFQhRAAHZ +z3CgAMgcMaAaDuAHKHCLcWoOL/gA2AAUADEIcoYi/A9GukQgAwxEu0QgAQNCucG4JwqRAAsLkQCP +6QbwBumB4cwgIYAJ9M9xAQBCac9woADsJyagAIVCIECAAKUG9M9woADIHNGgjQcv96HA4HjgfuB4 +8cASDw/3z3GnABRIAN2ooQeBz3aAAFiTB6YQgc9ypwA0RAimp6HPcPMP//wQoaDYtqGauPUaGADP +caQAuD2bEQAGz3eAAAgnA6amEQAGBKaSEQAGBaajEQAGBqb/2JsZWAOmGRgAkhkYAKMZGADPcaQA +7P/PcAAA//+noQahAIcB4ACnFQhRAAHZz3CgAMgcMaAeDeAHKHAE2G4NL/hAJgESDdhiDS/4QCaB +Es9wKAACAc9xoADsJwahiiCNAAahAIdCIECAAKcF9M9woADIHLGgqQYP9+B48cA6Dg/3USDAgQ0S +DzbPc4AAJNIDEg02z3GAADTT9HsRixAThAAS8gHgCHIyFYUQZ5ECGQIBz3ZBAIMAZrHPc4AAKD4D +qRHwQCRCADEVhRBCqcATAwEDqc92IQCCAGaxz3OAACw+Ew2FAMShAIMB4ACjBIFT8M9zgABE0utj +AePBhWSpANpwjXcOHhEvJQgA739JJ8QQ8mvPcIEAyBT2f+Bg0o0RCJ4Fz3CBAAgXdngBiAPwSHAA +JI8PgQAIF3Z/5I8IJs4TCCYAEKBwSSDOAxZr1XjPdoEAiBgAZs92gQAIGHZ+YYbPdoAAnCjEhtiG +xXsEI4MPAAAACGZ4AvADhQKhmBWAEGiJDQsAAESpYNgYuATwANiduAShiQUP9+B48cDhxQPIpBAA +AFEgAIDPcIAAnCgEgATyG5AD8BqQiguABrvoz3CgABQEA9kjoCDYDBocMM9xgACwPBaBAeAWoQPI +ANqYEAEApBADAJQYQACeEAEBrLuSGEQAvhABAa27gBANAaQYwACQGEQAfhABAYAYhAA9ZbAQAQGi +eTB5sBhEAIIQAQF+GIQAhiPlj7IYRAAcDkL9/QQP9+B48cB+DC/3CHMQiTMRjQAB2kCrDRIPNs92 +gABM0u5mz3KAAHzSSNzBqw0SDzYCIg4D9CbOE8GzDRIONvAiggNBo0GBIwoeAdKJz3KBAAgXFnrc +q0CKhiJ/DFx6BLpFftyrA/CA2lyrBLgFfb2rHJHPcoAAxNIPsw3I8CIAAASzB8gFo1QRAAEMswCR +DbOgEYIASKMGyAQggA8CAEEADQiBDwIAAACIukijBsiGIL6PBPKJukijnBEAAc9zgACoQya4wLhA +KAIDD4HAuA24RXgZBC/3AKPxwKILL/cc2hpwz3CAAG4KAIjPdoAAkEMKIYAvgAB42IQoHwAghgAh +RC7PdYAAfNVAoQAlQR4AJUIeKIFAIgMHACVAHk8hTwPoogKIYaYNCF4Ag7mNuSiiz3CAAPAKAqMY +2AKmz3CAAIwKAIAMHgARz3GAAHQKWgyv+iCBANnPcqAALCBQgmGGCwhyAEqjWGAKo89wgABuCgAQ +hwCELx8AJ3VCjS9wsQpfABkIESDPcYAAtNgbYc9wgACACmCgSvDPcoAAgApAgkGKRCi+KMdwgACY +1RfgQCKEADIgQg4vJAcBz3CAAIQKAuJPegAQhQBBCnIAAiWDAIQvHwAvcAAhTw4AJ4YfgACY1UQo +vihAJo8FMidPHjtjx3OAAHDYCOMbYwHhL3ngq9EJooACJYMAhC8fAAAhQC4bY89wgACACmCgDpUC +IAABDrUOlVhgDrVlpgfwz3GAAJDYOGAFpg6VoQIv9wSm4HjxwOHFCHUGjSWNCLgFeS94KLkveQi4 +p7msuKy5JXgPeSi4CLkleAWtKLgGrQDZKHBhHQIQKLhiHQIQKHAHrSi4CK1AJUAU1gvv+CDaQCVA +HADZygvv+BDaqXBB4ADZvgvv+AjaqXBR4ADZsgvv+BDaz3CAANAJYIBBKwEEL3kIuUErAgZFeW96 +KLsIum97ZXoQukV5Ka0ouSqtKLkrrSi5AYAsrUEoAQQveUEoAgYIuUV5D3oouA94CLpFeBC4JXgN +rSi4Dq0ouA+tKLgQrV/YCLjpAS/3AbXxwGYJL/cA2c93gADQCWWXIwtyAIIkAjjPdYAAXJnPcoAA +IIIqYjxlAeEvefMJ4oBArESXIQpyAADdz3OAADyZz3GAAACCqWG8YwHlr331DaKQIKxukLDjIgEl +AADei3I6DuAHyXGBxZTBQCUAF3IIYAUQ2kAlABfJccoK7/gQ2gIUADGLclYkBDMPeSi4CLkleGRo +b3vPcIAAPJkGDe/8KI9KJAB0yXCoIIADACQCMAAkATBgEYEAUBKCAL8KQQAB4A94Io0BjQi5JXgP +fii4D3gIvgV+BZecwUAgEARAJcASLyAHJPoPIAUQ2lYkATTPcIAAXJnqDyAFRZecwozAyXEyD6AB +CnP7jc9wgABECc9xgAAoHmCB6GADuBV4EGPCuF8IUQHPeCMIEwROIDwEqCBAAwIggQMAJAIwg3Ew +EYEAAeAPeDAaQgAAJ40fgQCwHCSNBdgDuTV5O2MAsySNz3CAACgeQICMwAO5NXkQ4llhbg8gBRDa +J/AA2D3wACeNH4EAsBwkjQHYA7k1eTtjALMkjc9wgAAoHkCAjMADuTV5E+JZYToPIAXJcs9wgAAo +HiCARI0TDlETA7pVelBhWWGMuACxRI3PcIAAKB4ggAi/A7pVelBhWWHleACxRI3PcIAAKB4ggAO6 +VXpQYVlhg7gAsQHY1Qfv9oAkAjjgePHAEgggAALY9gkAANHA4H7xwFYP7/ZKJAByCHfPcIAAnCgV +INADABANIADeyXDapaggQA3PcYAAbFX0IQIAz3GAADC3FHlAsc9xgAB8V/QhAgDPcYAAYLcUeUCx +z3GAAHxV9CECAM9xgABAtxR5QLHPcYAAjFf0IQIAz3GAAIi3FHlAsc9xgABkV/QhAgDPcYAAULcU +eQHgQLEIhQsIXgEE2TSlAvDUpQ8IHgEJ2UYdRBAu2gXwFNlGHUQQMtpbtVmNWWEweUYdRBAa4Tq1 +FwgeAArYVB0EEAbYVh0EEAfYB/AQ2FQdBBBWHYQTBdgPpXYKoAPpcDyNKHBEHUIQhiADAOa5WB0C +EMoiQQAL8lAhwwFvekQdwhBQIMMBb3hYHcIQEwleAUhzhiMDAG96RB3CEA0JHgGluFgdAhALCd4A +pLpEHYIQLw+QEHIOr/npcAAQACC5EAAGUSBAgPHYwCgiAcoggQ8AAJMAwCghAYQdABAY2I24E6UI +hVEgwIDPcIAAnCgF8rYQgACJuAPwnRCAABKlz3CgAKwvGYDPcYAA6C4wuMC4DgigBwWhCIUEIL6P +AAYAAAvyNrjAuBt4AeBaHQQQAtgapQPwWh2EEwDYF6UYpSoIr/3pcCiFAdpIc0EpAAU1uVIgAABS +IQEAwLjAuUIN7/2YctEFz/bxwG4N7/YH2M92oADIH0geGJDPd4AAnCgjh891rADUARqBTB4YkILg +AtjKIOIA0B0AkIogBAAPpkYRAAGwHgAQRhEAAbQeABAf2Ai4DqYIgVEgAIAA2Iu4CvIQpj4Kj/nP +cKAApDABgIS4CvARpjIKj/nPcKAApDABgKS4z3GgAKQwAaHPcIAA5EMAgBUIHgCGIP8OIrgUuM9x +gACMCAuh+gxP+ToMQAGaCYADGgqAA89wAABVVVoeGJAB2VkeWJDPcKYAKAAvoAOHWhABAc9wpgDo +ByagDgsP/QOH+gzgBA2QANiMHRiQB9iNHRiQANiLHRiQz3CAALAvIIBgeQTYDejPcYAAYCAagTuB +JHgPCF4EwgngAALYBPDiDyAGAdjPcqAAxCcPEgCGY4dEIAECG4MPGhiADxIAhqO4DxoYgA8SAIYF +eQ8aWIA8g89woAAwECSgz3CAAIDTEHiPGhiAz3CAAFyaz3GAAFyqEHgQuSV4kBoYgIogBACSGhiA +HYNAGgCAz3CAANwnUxoYgA8SAIafuA8aGIAA2BAaAIAegxwaGIAxBM/28cC2C8/2bpAId+PjmCRB +Mxpxk/cA2eII4AeLcoHGIo4Bjgi5JXgPeii4CLoPeQUhkQANCN4AoQMgAADYCQgRIPcIn4FRIcCh +0SEiotEhYqLz8wsIECDjCR6jXhaBEF0WgBAIuSV4D3kouA94CLkFIFIAJo4Fjgi5JXgnjhC5JXgo +jhi5JXhBKAEEL3lBKAIGCLlFeQ96KLgPeAi6RXgQuEqOBXkJjgi6RXhLjhC6RXhMjhi6RXhBKAIE +T3pBKAMGCLpleg97KLgPeAi7ZXgQuAV6z3OAANAJAYNfCiSAUyGEIA0KAQAAg08JBIAgo0Gjz3OA +AHCEILMwuSGzQrMwukwkQIBDs5/FwPTJcE3gViWBEioKIAUQ2slwTeAA2YIMr/gQ2otwIZCLci94 +CLgouSV4ZGhve89wgAA8mRDZwg6v/FYlBBJKJAB0ANioIAADGmUZZUARgQBQEoIAMHJt9QHgD3jp +cADZi3KOD6AHbpdAJkAbViWBE8IJIAUQ2lYk0zfPcIAAXJlAIwEhrgkgBRDalwgQIFYlgBMg2Yoi +BACLc2PjAgmgAQokgASLcGPgQCMBJYYJIAVKcjIkgD8AAAwBjCBDhzn1MiSAPwAADQFCIJIBMiSA +PwAADgGA4C8iiCQr9TIkgD8AAA8Bj+Al9TIkgD8AABABjCACix31MiSAPwAAEQGB4Bf1MiSCPwAA +EgFAIwAnQCUBGFMiUAAeCSAFSnIX8FYlgBMg2YoiBACLc2PjcgigAQokgASLcGPgQCUBGPYIIAVK +ckQhACxCKBABQCUAGApxyXINChEoJg0P/QTwWgwP/R4Pr/+LcM9wgAA8mRDZi3Jj24YNr/xWJQQT +ViUAE5nwyXBN4FUlQRWqCCAFENrJcE3gANkCC6/4ENqLcCGQi3IveAi4KLkleGRob3vPcIAAPJkQ +2WYOr/xWJQQSSiQAdADYqCCAAxplGWVAEYEAVBKCADByWgXC/wHgD3jpcADZi3IODqAHbpeLcs9z +gABcmWPicwgQIEIqwSBWJNE3aHBhuT4Or/gqc/gUgDCMIEOHHgXC//kUgTD6FIAwgOBCIZIBDgXi +/y8iiCT7FIAwj+D+BML//BSAMIwgAovyBML//RSAMIHg6gTC//4UgDBAJQEYUyBQAEAhACLaD+AE +SnIN8EIqwSBocGG51g2v+EAlAxhEIQAsQigQAUAlABgKcclyDQoRKPYLD/0E8CoLD/3uDa//i3DP +cIAAPJkQ2YtyY9t6Da/8ViVEE1YlQBPJcU3hgg/gBBDatg+gB+lwIJCLcOIPb/iGIf0PAdg5AO/2 +lSRBM+B+4HjxwM9wgAD0khgQBAAKIcAP63LPcAAA5Q7e2x0Bb/hKJQAA4HjPcYAA9JIFgeB/BqHx +wLIPr/YCuBV4ACCND4AAXLYIlVMgEADPcIAAYKDXiI7uz3GAADCZC4mGIP+MBPLAiQbwz3CAAOzD +wYDWCOADyXDPcoAAgNNWEgEBz3OAAM7TQCEEC89xgABuCuCJz3GAAIbVhC8fEDQhQQ6GIX8MPHkU +I0EAjCD/j2CJAiTBAA3yANsRDrUTDyMDAAmVZXgJtQXwBYVleAWlDQgQIAeVEQkFACe1I4IEgiGl +AqXGtWUHj/aA4PHANNgH9LoMj/1QIEEEBfCyDI/9TyBBBOoMr/002NHA4H6A4PHA9NgI9JYMj/1Q +IAEA9NgH8IoMj/0IcfTYgLnCDI/90cDgfuB4z3CBAGQkIIDPcIAA/KME6SCAA/AigM9woAAsIBCA +OGDPcYAASArgfwKh4HjxwIoOj/bPcoAApDpiks91gAAkSECFpMFAwkKV2BEEAM91gAAwSQQchDBA +hULCQpUMHIQwtIBcgQsKZAPYcgIiRgNTgLeBUHXCJYYQz3KAAFw7BhIFAcgRDgD/2gi6RH4ovgAc +hDPMEQ4ARH4ovgIchDPQEQ4ASiTAcMR6KLoEHIQw7BECAAgchDDwEQIA9BEBAAochDAMHEQwANpI +dqggwAMD2RUJjgMUJIEz4JEIIsIDJJEJI0MAAeYAJYERBSmBDwMAACAvcQUtPgENCUUOjBABAAHh +A/AA2bCAjBhAAFUgzgVTJcEQFCZBEECxXBACAUokAHQA36ggAAL0JsETMHLKIksAAedVIMEHkBiE +AMK9FCFNA2C1fBADAUokAHIA2qggAAL0IY0ACCNDAwHiBuNwe5IYxAC5Ba/2pMDgePHASg2v9phw +b38Dv6Rvz3CAAKQ6tmCib7VgBufwYBELUQLqkYwnApjKIGsAFQpRAHR5QZEdZSMKQgMCekGxCvAX +CpEAdHlBkVhgDw4CEAGxAdmYHEIAXQWP9uB48cDuDK/2ANnPcIAAYKBVIEQHaBAAAYDgz3CAAGCg +VvJqEAIBPQpSAM9zgABICgGDz3WAALhe8CROAFMmzxXXd6wAAA/MJ4Kf8gAAUAz0OL7CvgHhL3nO +Zd8JooDFeAGjANkE8AGjAdmBCREAz3CAAGCgbBANAXUNchAA2s9zgABICs9wgADkoPAggABTIM4F +13asAAAPzCaCn/IAAFAJ9Di4EwhQABUIkAAB2QnwAdkc8ACDgrgE8ACDgbgAowHiT3rDCkKDEvAF +kM9ygABICiCCUSAAgQGCgLnFIKIEzyAhAAGiIKIA2d0JEQDPd4AA/KMVh9EIdAAA3jNuNXkAJ0QQ +WRSEAPlhz3CAAGCgRBCAAHJudXvPdYAAXLZ6ZUiSfWULCAEBg7pItc9zgABICmGDfBGAAAsgwIAG +8k8iAAEQegi1z3OAAEgKYIN9EYAACyDAgAXyTyJAARB6CLXPcIAAbgoAiH4RgwCEKB8Az3CAAH7V +MiBADgsgwIAF8k8igAEQegi1+OIM9M9wgACooFzhDg1v+IhySJWE6IK6SLX84g30lgvv/8lwCJUB +2YC4CLXPcIEAZCQoqAHmFYfPfjsOBJDPcIAAYKCVEIAACOjPcIAA/KMDgAkInwAA2APwAdgvJgfw +hfI2D6/9AN/PcIAA/KMVgIDg9gAOAADeavATbhV4z3KAAOygGWItiQAiBQATbxV4ACCCD4AA/KNZ +EoYAACCCD4AA/KMSbxV4z3WAAFy2G2Vokx1lCwmBAYO7aLXPcYEAfCTWeXwSgAAEEQQACyAAgQby +TyMAARB7CLV9EoAAIIELIECABvJPI0ABEHsItc9wgABuCgCIfhKBAIQoHwDPcIAAftUyIEAOCyBA +gAbyTyOAARB7CLX44xj0QCUABFUiwQX2C2/4yHKQ6AiVgrgItYYK7//pcAiVAdmAuAi1z3CBAGQk +KKgB5s9+z3CAAGCglRCAACkOApAB589wgAD8oxWA738VDwSQz3CAAEgKogtv+AjZz3CBAHwklgtv ++IDZz3CAAPyjdYAnC3QAANnPcoAAXLayabV9uGIIkF1lAeEveYYgAQ/vCeSACLUlAo/24HjxwLYJ +j/Z0gFyB2BENAHBywiLGAPeBM4Awd8InRhAC289xgABcO/QhxAAGEQUBANkuoPpiBSqCDwMAACAv +cQUsfgMNCWVwjBAOAG6gBS1+AxsJRQ6QEAEBlBACAQLhCwmCAOTmw/cB2S6gtQGP9uB44cXhxnSA +XIHYEQ4AAiLEAFOAN4E8EAcAjBAIAAIhhQDPcYAAXDsC2vQhigAGEQkBz3WAAKQ6QpVhlQoRBgGS +EAEBo5UII0MAACUBAQUpgQ8DAAAgCiRADgUqvhMtCQVxKpCMIQKI0vYC2S+gkBABAX5llBhEACGQ +Zw5DEKJ5IbAB2ZgYQgAt8AUpvhMtDEUOKQ+QAJAQAQGUEA4BAuENCYIDjCABmcr3wZAB2d1lMwpi +Ay+gobDn8RsPkQChkAAmwQATCUMDAiWNEaGwAdmYGEIAkBABAZQYRAAA2S+gCSLCACGQDQpCAEGw +AdmYGEIAwcbgf8HF4HgiaADaQLBKJMB1z3CAAKQ6qCCAAhYggwBgkxQhjAAB4k96YLTgfuB48cAm +CI/2coDIgdgRAgBwdsImxhBxgCOBcHHCIcYAAN/Pc4AAXDv0I8QDAd3ZYQUpgQ8DAAAgL3EFLL4A +9CNDAw0JZXDtoALZLaAH8AUrvgAHCUUOraA5AI/24HhIgVKgQ4FRoFyBVKA3geB/M6DgePHAug9v +9gLbCHUodgHYALGpcF4K7/9NhU2FqXDJcVIK7/8D202FqXDJcUYK7/8F202FqXDJcToK7/8G206F +qXDJcS4K7/8J206FqXDJcSIK7/8E29EHT/bPcKAALCAQgM9ygAAI0QWiz3CAADygCIAA2xkI3gEE +igsIUQAligkJUAAB2yCCCOsAgoHgzCAigBLyD/AQ6Q8IUQAFioHgAdgC8gDYgOAkBML4DQlQAALY +4H8AouB+4HjxwAIPT/bPdoAACCcAhgHgAKYA3RUIUQAB2c9woADIHDGgeg0gByhwz3CAAPAJIJCG +uRC5BSGCDwAAwhLPcaAA7CdGoQGQELgFIIAPAAACEwahAIZCIECAAKYG9M9woADIHLGgCQdP9vHA +mg5P9s9wgADwLxmAAN2B4Mohwg/KIsIHyiCCDwAAqBPKI4IPAACQAcokQgO4B+L3yiVCA892gAAI +JwCGAeAAphcIUQAB2c9woADIHDGg4gwgByhwz3CAAPAJI5AEkMK5wrgDuCV4ELiFII0Az3GgAOwn +BqEAhkIgQIAApgb0z3CgAMgcsaB9Bk/28cAODk/2z3aAAAgnAIYB4ACmAN0VCFEAAdnPcKAAyBwx +oIYMIAcocM9ygAAwMQCKz3GgAOwnELgFIIAPAADCaQahAYoQuAUggA8AAAJqBqEAhkIgQIAApgX0 +z3CgAMgcsaAZBk/24HjxwJ4NT/YKIACgz3WAAJBFABUEECryz3CkALg9ANo3DBEAmxADBs9xgACU +RWChphADBs9xgACYRWChkhADBs9xgACIRWChoxADBs9xgACMRWChmxiYAP/ZphhYAJIYWACjGFgA +Adg18EwkAIDKIcEPyiLBB8oggQ8AAH4ZyiOBDwAA/AJsBuH3yiUBBM9wgACURSCAz3CkALg9mxhY +AM9xgACYRSCBphhYAM9xgACIRSCBkhhYAM9xgACMRSCBoxhYAM9wgADoLgSAIrjAuB4IQAQxBW/2 +AB0AFOB48cC+DE/2z3CAALAvIIBgeQDYJwgRA891gAC4LyCFYHkC2IvoIIVgeQPYh+haCm/9UNgL +CJ4BANgC8AHYLyEHIM9wgACYOM91gADMLwIK7/kApc9xgAAkPhSBAeAUoc9xgAAIJwCBAeAAoRUI +UQAB2M9xoADIHBGh6goAB89xgABsMASBKwhRACaBz3eAAOzDYHkA2BiPz3agAOwnl+jPcAEABgEG +ps9wEgAGBBbwCiHAD+tyz3AAAIcZiiPFCUokAABVBe/3CiUAAc9wAQAHAQamz3ASAAcEBqYghwOH +CemghUQovgMndcbYkrgY8EQovgMAIY1/gAAIWMfYkrgGps9wAAACMwamz3AAAIJMBqbPcAAAAmYG +psbYlbgGppIPD/4Yj2IIYAQghy8JECDPcAAAAm4Gps9wwQBCbgamz3ADAMJuBqbPcDYAQpcGps9w +AgBCawamz3AQAIdyBqYFjRC4BSCADwAAQnAGpgSNELgFIIAPAACCcAamA40QuAUggA8AAMJwBqYC +jRC4BSCADwAAAnEGpgmNELgFIIAPAABCcQamCI0QuAUggA8AAIJxBqYHjRC4BSCADwAAwnEGpgaN +ELgFIIAPAAACcgamAY0QuAUggA8AAEJyBqYLjRC4BSCADwAAgnMGpgqNELgFIIAPAADCcwamz3AB +AEZqBqbPdaAAyB+kFRAQFwkQIM9wUADGcwamz3AgAMdzBqbPcIAAxnMGps9wQABCdAamz3CAAMdz +BqbPcAIARmoGps9wEADGagamWI8AjySPgOIB2sB6+gqgBnmPJNgY2SYJIAcz2ikIUADPcIAAJD5Q +EAQADBcFEAohwA/rcs9wAACKGZUD7/eKIwcHDQkQIM9wBgBCawamz3AQAMdqBqbPcBAAhnIGpg0J +ECDPcAIARmoGpqIIwAbGD4AGJNgB2cYIIAcz2ikIUADPcIAAJD5QEAQADBcFEAohwA/rcs9wAACq +KDUD7/eKI8cMpBUAEM9xgAAkPgIgAAQToc9wAgBHagamz3BlAMJuBqbPcIAACCcAgM9xgAAIJ0Ig +QIAAoQT0ANhRHRiQ+QFP9vHAjglP9s9wgADwLxSAgOCL8roNL/4H2Hpwz3CAAHDwDIiGIP8BQ7hh +uIbg9AANAM92gADswySGz3KAABzCMyYAcIAAYEZAIhELBLk0eUAiEApAIhIGQCIPCEAiDQQ6YkAn +AXIUeQB5z3GAAJgxSHBV8M9xgAC4MQRqUfDPcYAA2DFAIgACS/BAIgADz3GAAJgxVgov/gDaBIbP +cYAAuDEEuBR4uGA78EAiAAfPcYAAmDE2Ci/+ANoEhs9xgADYMQS4FHj4YCvwQCIABc9xgAC4MRYK +L/4A2gSGz3GAANgxBLgUeEJwG/BAIgAJz3GAAJgx9gkv/gDaBIbPcYAAuDEEuBR4AnDiCS/+ANoE +hs9xgADYMQS4FHgicM4JL/4B2rYJL/5qcMEAT/bgePHAz3CAAPAvD4AR6M9wgADswwSAz3GAAGzD +ArgUeDhgz3GAAPgx3g0P/tHA4H7gePHARghv9kTaz3CAAMRXz3GAANDRog9gBADeAt0WCCAAyXBh +vfkNdZAB5okAT/bgePHADghv9gDaz3GAAJwoFXlggQS4ACCQD4AARFW5G5gAAIEEEA8gz3aAAMRX +vhjYA6CBQoaKIAcPYYYdZfAdgBDsHcAQIIFGhs91gADQ0WWGOGD4GIAAFibBE/QYwAAWJcATBOAE +4XIIb/YI2gwQACAWfhZ9BG0kbl4Ib/YI2vUHD/bgePHAig8v9hLZqcEIdh4OYAaLcEokAHEA2qgg +gAIWJIAwKIgLCZIAYbkoqAHiAsIBw891gACcKNV9AIWKIQcP9G7Hd4AARFU4YOwYwADwGIAAAIUG +wgXDOGD4GIAAg8H0GMAABBcQEM9wgADQ0RYgAAQE4OIPL/YI2uOHz3CAANDRh8H2eATgzg8v9gja +AMAghbkZGAAghbkRAAYVCB4AvhnYAyCFvxEABoC4CPC+GRgEIIW/EQAGoLh+Dq/8vxkYAITobg6P +/AToANgD8AHYEHZIDOEGyiCBAwCFuRABBlEhQIDx2cApIgHKIYEPAACTAMApIQHiCO/6hBhAAPEG +L/apwOB48cCODg/2z3aAAHxFz3WAAGgKEukgho3pAKWWC+/4DtjqDG/+iiAQAAHYAKYO8CCFJXgL +8FYK7/gO2LYMb/6KIBAAANgApgClsQYP9vHAMg4P9s9xgACULwCBoLgAoe4Ob/sB2M9wgADwnwAQ +BABMJMCAyiHND8oizQfKII0PAACBDMojjQ8AANoAUAet98ol7QCnDHQAAN0UbQAggQ+AAPCfB5HG +keSRELgFfgWRQ5EQuAV/ApEQukV4GnCaCi/4yXFacM9wgADMXvAgQQNELT4XCiFALgAhgH+AAFhA +IKA+Du/6CnAIcQAhgC+AAExAggoABQcOxBOY789wgADAXvAgQQNELT4XL3YAIYB/gAAAQSCgCg7v ++kpwCHEAJoAfgAD0QE4KAAXPcIAA8J8AgAHlaQ0EkKUFD/bgeOB+4HjxwM9wgAC4LyCAYHkB2A8I +kQDPcYAAiBsG8BUIUQDPcYAA2BzPcIAAbDAioNHA4H7gfuB48cAWDS/2AdgA3s93gAC4LyCHz3WA +ABTSYHnApS8IUABdCJAAJwjQACCH63ZgeQHYuHDPcAAAuRkKIcAPyXKKIxAJJQav94okgw8AhZi4 +mbgApQDYjrgBpQPYwa3CrQ64AqXPdoAAvC9AhgbYYHoC2UCGB9hgegLZAo0X8ACFmLgApQDYwa3C +rY64AaUCpc92gAC8L0CGBthgegLZQIYH2GB6AdkBjdkEL/YAreB+4HjgfuB48cDPcIAAZEMAgHMI +VAHPcKAArC8agFIgAABjCB8Az3GAAFiTC4EB4Auhz3CAAKQvAIBAeM4PAADPcIAAoC8AgEB4bgrA +AOIJz/2OCk/8z3CgAHhFAIAEIIAPcAAAAEEoPoX39c9wgACcKCOASIE0kVMiAAAuD6ACAdvqD6/4 +EtjRwOB+8cDhxbTBz3WgALRHcRUAlgQggA9wAAAAQSg+hfX1iiD/D28dGJBrHRiQVgov+YtwJgmP +/A7obxUElmsVBZYKIcAP63LPcAAAsRPlBK/3NNu6Dc/4tg7AA/0DL/a0wOB4QIgB2AChaLoCulV6 +x3KAAPAvY4JjoWGCYaFigmKhZIJkoeB/AKLgePHAVgsP9s93gABoQwaHA4DPdYAAWJMggEmFACKA +Dy0AwMYCeYEJcgChwc92gAAIJwCGAeAAphcIUQAB2c9woADIHDGgrgngBihwi3H+CS/3QtgAhkIg +QIAApgf0ANnPcKAAyBwxoAAUBDEEJL6PAAAX/8ohwg/KIsIHyiCCDwAAphPKIyIMIASi98olIgAA +hYK4Zg4gAAClIgggAAHYAIWiuAClKYXHcS0AwMaSD+AE6XANAy/2ocDxwHYKL/YA2s9xgAA0SACB +u8FXwASJSiQAcnjAz3CAAJwoA4AIgMC4QMBfFIAwz3GAAGAgQcA4wELAXhSAMEPAGoE7gQR5MbnA +uagggAIA2wAkgDBkGMIAAeJPes9wgABYk2KQz3CAAHgJQJBjC4EAz3OAAHDwDovPdYAAWJOGIP8B +KBWNEEO4AiBAg6+LcIvKIGIAhiX/Edttz3WAAFiTKRWNEIYj/wEOJY2TyiViELt9pXi7a89zgABY +kyoTgwAOI0ODyiNiAAK7ZXgC8AfYgOBmBSEARcDPcKAAtEdHEACGgODMISKATgUBAM9wgABYkwAQ +BABRJECAyiHBD8oiwQfKIIEPAACqE8ojgQ8AAHYA3AKh98olIQDPcYAAcPAOic9zgABYk4Yg/wFD +uCgbAgAPiYYg/wFDuCkbAgAQic9xgABYk0KxhiD/AUO4KhkCAADZnrnPcKAAtEdTGFiA4HgA2VMY +WIAmCs/+z3aAAAgnAIYB4ACmEwhRAM9xoADIHAHYEaG2D4AGN8DPd6AA7CcQuAUggQ8AAEItJqcF +IIEPAACCRgUggA8AAEJgJqcGp89wCACHEAanAIZCIECAAKYH9M9xoADIHADYEaEAwM9xgADcuhZ5 +ZIFAgc9wDwAA/Aq7BHvJumV6z3OnABRITaNFgSGBCrpEeMm5JXgOo+YOj/1GwADACuiKIf8Pz3Cg +ALRHbxhYgGsYWIAA2APZRMBRwUjAz3GAAICTCGGpCDMCR8AIwQXAESBAgH4DAQAHwAAkATBkEYEA +geFuAyEAg3AB2WQYQgAHwc9woAC0R2AYWIDPcIAAnCgDgBC5m7kyIIAPAADYAp+5gOAB2MB4D7gl +eM9xoAC0R18ZGIDPcKAAtEdxEACGBCCAD3AAAABBKD6F9fUC2QDYGnAHwBEgAIT8AiEAUMHPcKcA +FEhcGAAESQgQICsIUSCKIMQ2iiGEOCDwHBQEMAohwA/rcs9wAACrE6TbCQGv90olAAAKIcAP63LP +cAAArijX20okAADtAK/3CiUABIoggj2KIUI/AcECwCJ4ScAHwH4Or/sKcTpwB8CqDK/7CnFKwACG +AeBKIgAgAKYVCFEAz3GgAMgcAdgRofYNgAZAKUAhEHgQuIG4h7iMuAanIIZCIUGAB/TPcqAAyBwA +2BGiSiQAIYp1QCCAMRB4S8BAIYAxEHhMwEAoQCFNwAomgCQB4WG9IKYTCVEAz3GgAMgcAdgRoZ4N +gAYDwDVtACUXFi8nyCUleBB4ELiFIIoABqdAL4AhgbiXuAAlUxYGpy8jyCRAK4AhgbiXuAanC8AG +uIG4BqcMwAa4gbgGpwCGQiBAgACmB/TPcaAAyBwA2BGhksCTwZTClcMODKAEViTEMjbAiegAIIEv +gAB0PhCJAeAPeBCpAMAL6PYLT/wTCFEAANh2wATAgLgPeETAAMDPcoAA3LoDuBUgAAQZYhpiDIIo +gRLCTsANwLZ4ACCVD4AAkJMTwPAdgCD0HQAgCcCIInwALyEAIAQpviCaCS/7L3AOIIEPAAAAAU/B +E8CIIHwABCh+BC9wfgkv+w7BDiCBDwAAAAEPwAkhgw8AAP8BCSCCDwAA/wFIIgIASCMDADbAVB2Y +IFUd2CAhCFEACsEYFAQwBLlALIABOGC1eMdwgAAYu0KwY7AAhgHgAKYVCFEAz3GgAMgcAdgRoUYM +gAYKwQbAQC+CIYG6BLkGuDhgtXjHcIAAGLsikDx5ELklekanIpDAubh5BSGBBC8iSCAjkEArgiGB +ujx5ELklekanA5DAuLh4BSCABS8mCCAAhkIgQYAI9M9yoADIHEokAABEGgABQiRUIEwkAKAmBs3/ +AKYVCFEAz3GgAMgcAdgRocILgAYLwUAqACQGuYG5JXgGpwzAQC4BJAa4gbgleAanAIZCIECAAKYG +9M9xoADIHADYEaEQwWG5gOH6BO3/QCBAIBHBYbmA4QjAYgTt/wHgAIYB4ACmFQhRAM9xoADIHAHY +EaFeC4AGz3AIAIYQBqcAhkIgQIAApgb0z3GgAMgcANgRoWIMj/7PcKAAtEdxEACGBCCAD3AAAABB +KD6F9vWyDo/4z3CAAFiTBMEMgDhgz3GAAFiTDKENgQHgDaGBBO/1u8AA2c9wgAB0kyyoLajgfy6o +4H7gePHAUgzP9Qh2LrjAuAS4TyDBAM9wgABM0wCIz3WgAOwngeAB2MB4B7gleBC4hSCRAAalXg0v +9gHYgL7GpYEEz/XPcIAAByHPcaAA7CcGoc9wgABHOgahz3CAAMdTBqHPcIAAxyQGoc9wgAAHPgah +z3CAAIdXBqFJ2c9wpwCISTCg4H7geAHZz3CgAMgcMKBL2c9wpAAcQCSg4H7geM9xAQDgO89wgACo +L+B/IKDPcYAAWJMAgYC44H8AoeB48cC4cFMggQDPcIAANF4oYIHgyiHCD8oiwgfKIIIPAACVGcok +gg8AAP4AuARi98oj4ggB2NHA4H4J2eB/IKDgePHAVgvv9QHYz3WAALgvIIVAeSCFDwhQAGB5Adgg +hYUI0QBgeQLYC+gghWB5AtgghSMIUQBgeQPYjejuCAAAIIVgeQjYEHnPcIAANBJ+Cs/2FPAghWB5 +AtgghREIUABgeQLYIIUdCJEAYHkI2BB5z3CAACwPVgrP9hYOoAMH2C3w63ZgeQLYuHDPcAAAuxkK +IcAPyXKKI04FCQRv94okgw9geQHYIIVDCJEAYHkC2IDgIIUI2Af0QHkQec9wgAD4DAbwQHkQec9w +gAAQDv4Jz/a+DaADAdhmDo/9oghAAPIIAADhAs/163ZgeQHYuHDPcAAAuhkKIcAPyXKKI88HpQNv +94okgw/geAhxWIkBgAKhiOpZiYDiwiCiAMAgoQACoeB+4HjxwOHFz3CAALAvIIChwWB5BNiPCFEA +6ghv/IogzA6DCFEAz3WAAAgnAIUB4AClFwhRAAHZz3CgAMgcMaCOCKAGKHBKJMBwqCCAAs9xAQBC +ac9woADsJyagi3HKCO/2iiBGCQCFQiBAgAClB/QA2c9woADIHDGgABQFMUwlQIDKIcIPyiLCB8og +gg8AAKwoyiOCDwAARwPoAmL3yiQiAAkC7/WhwOB+4HjxwIYJz/XPdoAACCcAhgHgAKYA3xUIUQAB +2c9woADIHDGgAgigBihwx9iUuM91oADsJwalz3ADAIIrBqXPcAMAwkQGpc9wAwACLAalz3ADAEJF +BqXPcQAAwnTPcAMAwnQGpc9wAwCCbwalz3ADAIJsBqXG2JC4BqUmpaoPYAYK2M9wAACCbAalmg9g +BgrYz3AAAAIsBqWOD2AGCtjPcAAAQkUGpX4PYAYK2M9wAACCbwalcg9gBgrYz3AAAIIrBqViD2AG +CtjPcAAAwkQGpVYPYAYK2M9wEwDGAAalRg9gBjLYAIZCIECAAKYG9M9woADIHPGg+QDP9fHAjgjP +9Qh3z3agAKwvFYYzCB4Az3CAAEzTAIjPdaAA7CeB4AHYwHgHuEUgAAYQuIUgkQAGpZoJL/YB2AHY +jrgGpYjvz3CAAKQvAIBAeEvwFYZRIACAyiHBD8oiwQfKIIEPAAB/GcojgQ8AAKoAyiTBAGwBYffK +JcEAz3ATAMcAz3agAOwnBqbPcBAABmkGpsfYlbgGps91gAAIJwCFAeAApRcIUQAB2c9woADIHDGg +eg5gBihwz3AAAEItBqbPcAAAgkYGps9wAABCYAamAIVCIECAAKUH9M9xoADIHADYEaEVAM/14Hjx +wKoPj/XPcIAAsC8ggKHBYHkE2DLoz3aAAAgnAIYA3QHgABxEMwCmFQhRAAHZz3CgAMgcMaAODmAG +KHCLcV4Or/YA2ACGQiBAgACmBfTPcKAAyByxoAAUATHPdYAAvC+GIf8MQIVCuWB6AtgAFAExQIUD +2GB6wbmdB6/1ocDgePHAIg+v9QPYz3aAALAvIIbPdYAAZDlgeaLBBugghmB5BNiG6EkDIABIFQQQ +A9gacM93pwAUSM92oADsJxYLr/0F2A6lz3CAAAgnAIAB4M9xgAAIJwChFwhRAAHZz3CgAMgcMaBe +DWAGKHAD2K4Nr/apcQTYpg2v9iJtBdieDa/2JG0L2JYNr/YmbQ/Yjg2v9kAlARI22IYNr/ZAJYES +N9h6Da/2QCUBEzjYcg2v9kAlgRMIhwSlDYcFpQ6HBqXPcKcAmEccgAelF4cIpRaHCaXPcKsAoP8Y +gAulz3CrAKD/GYAMpc9wqwCg/xqADaXPcAUAxgMGpsbYkLgGps9wLAACAQamz3BaAEIBBqaKIIsA +BqbPcEAAhw0Gps9w0QDCDQamz3DAAAcOBqbPcIAACCcggBEJUQDPcqAAyBwA2BGiAdgIpwDYDacO +p89wpwCYR89yUAD/AFygAdgXpwDYFqf82s9wqwCg/1igc9pZoBqAz3KrAKD/gbgaos9wgAAIJyCg +FQlRAM9xoADIHAHYEaEyDEAGz3BAAIYNBqbPcBAAAg4GpotwugtgBIHBNoUAwCJ4BCiADwAAdAkV +hTeFAnkiD6/1L3ABwk/gz3GAAASVFKVXoRihz3BAAIcNBqbPcBEABg4Gps9wgAAIJwCAz3GAAAgn +QiBAgAChB/TPcaAAyBwA2BGhi3BWC2AEgcE2hQDAIngODW/7EqUyhVWFLHg3hS8gQA5CeTlhug6v +9TV54LgceMAgYgCCIMQCz3GAAASVEqUTpRahz3CAAAgnAIABwgHgVaHPcYAACCcAoRUIUQDPcaAA +yBwB2BGhVgtABgGVELiFIIQABqYClRC4hSCFAAamA5UQuIUgiwAGpgSVELiFII8ABqYFlRC4BSCA +DwAAgg0GpgaVELgFIIAPAADCDQamB5UQuAUggA8AAAIOBqbPcIAACCcAgM9xgAAIJ0IgQIAAoQf0 +z3GgAMgcANgRoQSFK4UIpwWFDacGhQ6nCIUXpwmFFqfPcKsAoP84oCyFOaAthTqgVg1v/Q6FSBUE +EIwkgoBF9owkP4EN9qYKYAYK2J4MAARCIEAggOACBc3/SBUEEIwkgoBF9owkP4EM9gohwA/rcs9w +AAC0GYojRQwlBS/3uHPPcIAANx8AiAboz3CAAMQ5ABAEAIhwGQSv9aLAz3CAAGQ54H8UgOB4z3EB +ABBXz3IBAJxNXQYv+gDY4HjgfuB48cDPcIAApC8AgEB4z3CAAKAvAIBAeNHA4H7geM9ygAAIChkI +HgCA4VHYwCgiBMogYQTAKCEEA/AA2OB/AKLgePHASguP9c9wgACwLyCAocFgeQTYgeAB3Zz0Bgov +/IogUAyB4Jb0z3aAAAgnAIYA3wAcxDMB4AIcxDMAphMIUQDPcKAAyByxoKIJYAapcItx8gmv9gDY +ABQBMc91gAC8L0CFANiGIfwPYHpGuQAUADFAhUQgAQwB2GB6RLkB2MYJr/ZAJIEwQIUI2GB6AhQB +MQAUBTGocIYg/A+MIAKADvIKIcAP63LPcAAAtRmKI9EF7QMv94okgw8CFAUxTCUAgMwlYoDMJaKA +FvKocIYgPQ+MIAKAyiHCD8oiwgfKIIIPAAC2Gcojgg8AAF0EsAMi98okYgAC2E4Jr/ZAJIEwAhQA +MUCFUyBQAATYYHoKcQAUADGGIP8DRLiC4Mwg4qAQ8gIUBTEKIcAP63LPcAAAtxmKI5EMaQMv94ok +gw8AhkIgQIAAphX0z3CgAMgc8aAR8M91gAC8L0CFAdhgeghxQIUE2GB6A9lAhQXYYHoD2UECr/Wh +wPHA3gmP9c91gAAIJwCFAeAApQDeFQhRAAHZz3CgAMgcMaBWCGAGKHDPcIAABiHPcaAA7CcGoc9w +gABGOgahz3CAAMZTBqHPcIAAxiQGoc9wgAAGPgahz3CAAIZXBqEAhUIgQIAApQb0z3CgAMgc0aDP +cKcAiEnQoNEBj/UI2c9wgAAU0uB/I6DxwFYJj/XPdoAACCcAhgHgAKYA3RUIUQAB2c9woADIHDGg +zg8gBihwz3AAAMIsz3GgAOwnBqHPcAAAAkYGoc9wAADCXwahAIZCIECAAKYG9M9woADIHLGgaQGP +9fHA9gwv+BbYTgwABM9xgACcKACBxBAABg8IXwEBgcQQAAYNCF4B5gxv+BPYz3CAAJgvIIBgeQvY +0cDgfvHAig/v+4ogiAUO6NYM7/wA2M9wgACwLyCAYHkE2IDg1AsC/9HA4H7PcIAAnCgDgAiAz3GA +ABTSCQgeAAGJA/ACieB/AKngePHAuHGN6AohwA/rcs9wAACnGYojxAutAS/3iiSDD89xgAAU0iCB +TCUAgAQhgQ8ABwAAQSkDBgDZyiRNceggbQPwIEUABCWCDwEAAMAuumV6CwuBAAHh0cDgfgohwA/r +cs9wAACoGYojBA5ZAS/3SiRAAOB48cDhxQDdz3CAAEAJpgggAKCgz3CnABRIqKBdAI/14HjxwKHB +uHAA2EDAUyWAACcIUABFCJAATwgQAQohwA/rcs9wAACrGYojigoFAS/3iiSDD89wgAC4LyCAYHkB +2ITgAdnAec9wAAAi0jR4z3GBAMshD/DPcAAAI9LPcYEAziEH8M9wAAAk0s9xgQDRISnaErrwIgAA +DiCCDwABAABAwotw0g6gAwPaocDRwOB+4HjxwEoPT/UDyJQQAADPdoAACCcEIJAPAQAAwACGQSiQ +IwHgAKYA3RcIUQAB2c9woADIHDGgtg0gBihwz3EkAAcBz3CgAOwnJqCKIYUAJqBTIIEgKwlQAE8J +kABrCRABCiHAD+tyz3AAAIgZiiMGA4okgw8tAC/3CiUABM9xgACcKCOBKIFRIQCAyiGCD4AAxyDK +IYEPgACHJCagz3EEAEdLJPDPcYAAnCgjgSiBUSEAgMohgg+AAAc6yiGBD4AAxz0Q8M9xgACcKCOB +KIFRIQCAyiGCD4AAh1PKIYEPgABHVyagz3EEAMcxJqAAhkIgQIAApgb0z3CgAMgcsaCxBk/18cCh +wc9xgACcKCOBLygBACiBwLkAIYMPAAAi0k4ggQcp2BK48CDAAM9ygQDLITR5WWFAwItwjg2gAwPa +ocDRwOB+4HjxwOHFuHDPcCwABgHPcaAA7CcGoc9yqwCg/xqCUyWNAADbJw1QEG8NkBCpDRARCiHA +D+tyz3AAAIEZiiOFAx0H7/aKJIMPz3OAAJwoY4NogxULHgDPc4AAxiBmoc9zAwDCAgnwz3OAAIYk +ZqHPcwIAwgJmoc9zBABGS2ahz3NIAEIBZqEB289xpwAUSHehgbhE8M91gACcKKOFqIUVDR4Qz3WA +AAY6pqHPdQMAggIJ8M91gADGPaahz3UCAIICpqHPdQQAxjGmoc91SgBCASDwz3WAAJwoo4WohRcN +HhDPdYAAhlOmoc91AwCCAgjwz3WAAEZXpqHPdQIAggKmoc91BADGMaahz3VMAEIBpqHPcacAFEh3 +oYC4GqJpBU/14HjxwOoMT/UDyAHdz3anABRIlBAAAKimBCCADwEAAMDGDu//Lrj/2Ju4z3KnAJhH +HKLPcYAAQAkAgQDfgODKIcIPyiLCB8oggg8AAKwZyiOCDwAA5QDKJMID4AXi9solwgP2prqi7QRv +9aCh4HjxwHoMT/XPcKYAnD8ZgK0IHgDPdoAATAkAhkaAoBIABi8oAQBOIIEHQSnQABEI1SBIcIAg +CgAyIAAEkOgKIcAP63LPcAAArRmKI0sCiiSDD30F7/YKJQAEz3WBAMAhQCXAEsYNL/cJ2QDYhgiv +/w8gAASA4ADYDyAABAX0JgzP/wPwsg3P/wPIuRCAABt4gLhAhgqtJoKWIUEDACEABBiIjCDDjwJx +BfJhuA94GKkmgqARAAafGRgAygvP/yEET/XPcSoqFRXPcIAAhEPgfyCg8cCmC0/1OnAbfc9wpgCc +P2QQEAAtCB8g1gyv9QPYYb2MJf+f8/UKIcAP63LPcAAApChR2wokQATFBO/2CiUABMUDT/XxwGYL +T/XPcaAArC86gVIhAQBRIQCAocEA3pb0z3WAAAgnswgQAMIJj//Pd4AAsC8gh2B5yXATCBADIIdg +eclwIIVZCBEEAIUB4AClFQhRAAHZz3CgAMgcMaCuCSAGKHCLcf4Jb/aKIAcFAIVCIECAAKUG9M9w +oADIHNGgABQFMVcN0AAKIcAP63LPcAAAiRnq2ykE7/aYcwHhIKUVCVEAAdnPcKAAyBwxoF4JIAYo +cM9xBgACdc9woADsJyagAIVCIECAAKUJ9M9woADIHNGgA/DmCAAAAIUB4AClFQhRAAHZz3CgAMgc +MaAeCSAGKHDPcIAAnCgDgM9xgABM0zgQEAAgic93oADsJ0EogCOB4cC4AdkEuMB5g7gHuSV4ELiF +IJEABqeGC6/1AdhPIAAgBqcAhUIgQIAApQb0z3CgAMgc0aCFAm/1ocDgePHAaggAAM9wgACwLyCA +YHkD2IDgsA3CA89wgADoLgSAGQieAM9xgACcKE2BPpFTIgAALg3gAQHb0cDgfvHA4cXPdYAAXDkA +hRsIHwCaCUADug1P+54Iz/gKDs//AIWAuAClNQJP9eB48cCGCO/7iiAEAhHoHg6P/8YPz//PcIAA +sC8ggGB5BNgF6EYOT/8OCAAA0cDgfuB48cCKCU/1z3WAAFw5AIU5CF8Az3CAALAvIIBgeQTYFOg2 +CO/74tgQ6IoNL/0H2PYJ4AMIdgoMD/+GCi/9yXAAhYG4AKWxAU/14H7gePHA4cUIdZhxSHBocQDa +DgggAKlznQFP9fHAIglv9fhwWSQcONhxGXK4c4okBHAA2agggAEAJEAwIKgB4QDbiiQEcGhwaHGo +IMAFMiTCMAAkzzAdYjInQAAB4dBxuGAPeMohJgAyJA0wACQOMAHjoK9ArgDZKwh0EChyAeEveTIk +TTBCIEgQACRDMLpiT3oyJI4wACSAMMCr4wh1kKCoTCQAgMokDXHoIC0HAeEveTIkQDAAJEMwGmJP +ejIkjjAAJI0wwKsArTIkQzB4YA94MiQDMAAVgABneAEdEgDFAG/1ViQcOPHAVghP9aQQAQAVCR4G +thABAc9woACYAz6gnvAAFg1BvLAAFgJBXbAAFg5Az6AAFgJBQBiEAAAWAkBRoAAWAkFIGIQARCUC +EzUKEAEY23IYxAAAFgNAc6AAFgNBUBjEAAAWA0FUGMQAEQoRAqlzhiPzD4wjDIAO8hjbFvAQ23IY +xAAA389zgAA00+ezENsM8B7bchjEAAAWD0D2oAAWD0FcGMQDqXeGJ/0cjCcCkgn0AuNwe3IYxAAA +Fg9BAvAA32AYxAMJC14AABYPQSh0hCQMkAT0ANoi8JnqUSYAkNEhIoIV8tCIqLnPcoEAyBSkGEAA +Ar7WfsJiCwqeB4u5pBhAAADaWqBboObxABYCQFqgABYCQFugCNp0EA4BvhAPAcJ/Yn9Cf7gQggCY +uaQYQADPcaAAmANCf3piUHpyGIQAuhACAfB/cBjEA6V6XLA+gbYYRABpBw/18cD+Di/1SiRAdc91 +gABoIsCFz3OAAGQYqCBABmhwMm40eTpgQoIB5jhgDerPcaAALCAwgSJ613JJawDSAN/D9+KgqubK +JiYQ4HgdBy/1wKXxwM9wgADsFg7ZAdqCCiAAANvPcIAAJBcJ2QHacgogAEhzz3CAABgWKtkA2mIK +IAAA289wgADAFgvZANpSCiAAAdvRwOB+4HjxwATYtglv+wHZz3CAAPk5AIjPcYAA+jkyCyAAIInR +wOB+4HjPcIAAnEW1AgAE4HjxwIbo7ggAAADZIqDRwOB+8cAqDg/1jg6P+892gAAMCmbYIm4B2k4M +b/xIc4voCiHAD+tyz3AAALYU2duKJIEJOfACFgURTCUAgMwlgo8AAP//DfQKIcAP63LPcAAAtxTc +2yUHr/aKJIEJZ9jJcQHaAgxv/EhzjOgKIcAP63LPcAAAuBTf24okwQkV8AGWJG4B2gHgEHjeC2/8 +SHOhlo/oCiHAD+tyz3AAALkU4ttAJUQQ1Qav9kolAAACbRB4Jm4B2rILb/xIc4zoCiHAD+tyoZbP +cAAAuhTl20AlhBDr8cUFD/XPcaAAYB0SsRSR4H7xwLhxNQhRAAkNUgAZDdIDCiHAD+typ9gFuJzb +eQav9kokAABALYAAFHhCIAEDz3CAAIQXGWEf8M9wgAA0HjIgQAGMIMOPyiHBD8oiwQfKIIEPAADh +FMojgQ8AAKIAOAah9sokIQACuBR4ACCBD4AAZBgocNHA4H4RCB4CBCC+jwAAABgB2AP0ANjgfwCp +4HjxwLoMD/XPdYAAegkAjc92gAB4CV4P7/8gjkGIz3GAAAA6XwrfAAKAqehfCh4Bz3KAAMgrAJZn +ik8IwQAAlWGKRwjBAM9wgAB8CQCIRoo7CgEAz3CAAJwoDoAvCF4Bz3CAAPw5QIAL6s9woAAsIBCA +QngPCIQPMQEALQDYAvAB2KUEL/UAqc9wgAAMJwCId+j38eB48cAKDA/1ocEacDpyaHa9CXIAANia +cRUgDSDPcYAADAoAFZMQAhWSELpw440hkQGNAdo4YBB4i3EmCm/8SHMS6AAUADFAKoIgBCCBDwAA +AP9HuVR6MwkQIMdygACEFxjwz3CAAAwKwZChjQohwA/rcs9wAAC7FIojhAAAJkQT9QSv9golQAXH +coAAZBgAGsIEA+4CqgLwAaolCB4ADO4DioC4A6oSbxR4G2Jji1hggbtjqOSqA+4mqgLwJapCJEEg +VQl1gEAlQCCRAy/1ocDgeOHFUyANAKCpBCCBDwAGAABCIQGABCCAD0AAAADKIWIAIKrXcEAAAAAB +2MB4AKvgf8HF4HjxwIzo1g3P/89xoAAsIDCBx3FJawDSIqDRwOB+8cAGCy/12HEKJoCQiHXMIyKA +BvJCJgYBLyaHAaIN7//Icc9xgACkCQChJe4kiAK5NHlDiAPhAhCFACMKHwAKIcAP63LPcAAA4hSK +I4gFSiQAAAEEr/YKJYABCGEbCF8ACiHAD+tyz3AAAOMUiiOIBu/xARCFAFElAIDKIcEPyiCBDwAA +5BTKI4EPAAAoAsoiwQff8+G90SUigcohwg/KIsIHyiCCDwAA5RTKI4IPAAAvAqADovbKJIIBKw0e +EFElwIDKIcEPyiLBB8oggQ8AAOYUyiOBDwAANgJ4A6H2yiSBAZECD/XgePHAEgoP9aHBCHcodRpy +AN7PcKAAtA9wEBEASg3gAslwi3FAJEIwQCSDMKIO7/+pcA8IECDPcIAAnJ4BiAToSiQAAATwSiSA +ACDAARSCMOlxyg7v/wIUgzDPcIAA+jkAiIDgzCcCkAvyz3CAAKQJAIDCoM9wgAD4OcCoMQ1eEc9x +gADIKweJJQ8BEAGJUyUCEBkKAQAEJY0fAAYAAIDlAdoGicB6HQoAAM9wgAANJ8Coz3CAAPw5wKDP +cIAAADrAqKIM4AIvIEcEqQEv9aHA4HjxwE4Kz//PcIAAeAkAkIDghAzC/9HA4H7gfuB48cAKC8// +fgrP/0oMQAVOCY/8TghAAdHA4H7geOB+4HjxwM9wgAAAOgCIjehODM//ieiQ2QPIkLmgGEAAANjR +wOB+z3CAAGQiAIgR6M9woAAABAyIjCACgADZCfSR2gPIkLqgGIAAKHDr8QHY6fHgeM9xgACcKPAh +AQAoEYAAKIGVBu//ANrgePHA4cXYcM9ygADIK891gAB4CQCVZ4rPcYAADCcrCwEAz3CAAHoJAJBh +ih8LAQDPcIAAfAkAiEaKDwoBAM9wgAANJwCIAvAA2KoL7/8Aqc9wgAB8CUCIz3GAAHoJAIkgjYDi +AdrAeshzAN0+De//mHXPcIAApAkAgAGIz3GAAGQiCwgeAQHYAKkC8KCpkQAP9c9xgADIK89wgAB4 +CQCQR4kxCgEAz3CAAHoJAJBBiSUKAQDPcIAAfAkAiCaJFQkBAM9wgAAMJyCIz3CAAA0nIKjgfuB4 +8cDSD8/0z3aAAGCgFI4pCFEABNgSCy/7AdnPcIAAegkAiM9xgAB4CY4M7/8giQDYFK4t8LaOK+3P +d4AA+DkAj2G4JQ0AEE4Jz//PcIEAMB0FgCFtBSh+AM9wgACcRV4M4AMvcc9wgAB6CSCQz3CAAPk5 +oK8gqM9wgAB4CSCQz3CAAPo5IKgA2BauNY4J6c9wgAB6CQoJ7/8AiADYFa6dB+/0AdjPcKAALCAw +gM9wgAD8OeB/IKDgePHADg/P9KHBCHYacTpyAN3PcKAAtA9wEBIASgrgAqlwBYbjjotxQCSDMKIL +7/9AJEIwCoYaCu//QCRBMCcPVBAUIUwjIIwgwAEUgjACFIMw8CBOI8YL7/9TJgQQAeXlDcSTAgrg +Ai8ghwQBB+/0ocDxwGINz/8aCUAF0cDgfuB48cDhxc9wgAB40QDZJaDPcIAAFDMioM9xgACcKACB +xBAABncIXgEDgRiIbwgQAc91gAAMQgCFQiAAgMogYgAnCFEA0grgA6lwz3GAANRBAIFCIACAyiBi +AIXoKHAmC+ADIoXPdYAAKEIAhUIgAIDKIGIAJwhRAJ4K4AOpcM9xgADwQQCBQiAAgMogYgCF6Chw +8grgAyKFfQbP9OB44cUA289ygAAk0hQiDQBgtWi1GmIgGsIAwB3EECgawgDPcYAA0NEWeSKRMBrC +ANAdxBCAHdwQeB1EEAHZiBpCAM9xgADE0hV5YKHgHcQQ8B3EEOB/wcXgePHA9g7v+xHYuejPcYAA +yCvPcIAAeAkAkEeJVQoBAM9wgAB6CQCQQYlFCgEAz3CAAHwJAIgmiTkJAQDPcIAAlC8AgJrorgvA +AojoC8gFIIAPAAAAPAsaGDCeC8ACiOgLyAUggA8AAADUCxoYMAvIkLgLGhgwHg5P+wPwGgrP9dHA +4H7geADZnLnPcKAArC89oOB+4HipAk/74H7geOB+4HihwfHA4cWswQDZSsFvIUMASMHPc4AAFNIg +gwQgjQ8BAADAhiH+AyS5DrkLJUCQTsCOwhby13UAAABAzCWCnwAAAIDMJYKfAQAAAAT0IYMD8CKD +rrivuLC4BXkgog7DCMCLdQQjgQ8BAADALrlAKQIGRXhIwIogBgZJwEHDqXAA2koJIAAB289xgABg +IBqBO4EkeCcIHgIKwAvBhCgEDgAhgH+BAFAfArkI4DR5IWDPcKcAiEkvoAIPIASpcAjcwwTv9KzA +ocHxwEIM7/QIcq3BCNhKwG8gQwBJwM9wgAAU0qCABCGODwEAAMCGJf4TJL0OvQsmQJNQwZDDFvLX +dgAAAEDMJoKfAAAAgMwmgp8BAAAABPQBgAPwAoCuua+5sLkleACjEMMJxQQjgQ8BAADALrlAKQAG +BX1JxR8KngEKwAQjvo8AAAAYRSDAAErABfKFIBABSsAlCh4Bm73PcKAALCAFgADbArhuuIDgyiDM +AMm4pXhJwAbwCQoeAp29ScUQwIHFQsCpcEIIIAAC2wPIDMLPcYAAYCC5GIIAGoE7gSR4GwgeAgK6 +z3CBAFgfVHpBYM9wpwCISS+g/g0gBKlwCNy3A+/0rcDxwD4Lz/SjwWGACHVAwwDYCqVtC14CBCOA +DwEAAMAuuM9ygABwVApiSSKCAGG6S6USahR4x3CBAEggyoDPd4AAuNPGpQuAz3aAAJwoBaXDhiDA +1Ib1jwR+5H4JvkApDwLlfsV4BCODDwAAABBleAelCIUY4p64CKVLpY/wNwqeAs9wgADEQwCAQcBC +wCEIHgKGIP8JI7gB4BUIlAALCJEABthhwCTwB9hhwCLwIsBhwB7wQcPPcoAATAlAgkaCnhICBisK +kQEEI76PAAAAGA/0z3KAAJwoRIJIggQivo8ABgAABfIB2AqlA/AKpQDYAcZBDh4SQsYiwqDiyiIh +AAQmjx8BAADAQS+EE0QmDxYjvwHnBCaOHwYAAAAxvgAmxRPPdoAAcFQyJg4RAiZOERPwUybCEM93 +gABcV116SmcEJo4fAQAAwC6+z3eAAHBUzmdhvtZ6S6UTCx4CIMfPdoAAeFTuZgLwAd6EKAQOACGA +f4EAUB8CulR6R2Bhvlhg5qUBgAQjgw8vAADdJrvFe1IjwwMFpWelz3CAABTSA4AA3x0ITgDPcIAA +5EMAgBUIHgCGIH8PHXhAKM8DBPAA34+/m+/PdoAAsC8ghmB5ANglCBADIIZgeQDYGQgQBCCGYHkA +2BEIUAQghmB5ANgLCJEEdg0v/ADYCIUFf+ilqQHv9KPA4HjxwD4Jz/TPdYAA0C8AhcSQyXDyCKAA +hiD8AwCFyXGGCWAAhiH8A89zgAD80wsIkQYhg4C5IaNKgwHiSqPPc6AAxCeREwGGw7kbCYEAiiUI +EBMbWIOREwGGw7kLCYAAEhtYg0kBz/TgePHAzgjv9ADYz3GgAMQnUhEChhURAoZCEQOGEQueBwHY +z3GAAIDTYbFRIsCAGnDKJWIUEvRRIMDGyiWiFAz0z3CgANAPIBABhh8QAIYQcQDdyiViFekNERDP +doAAgNMfhssIHgSoFgEQlNhiCmACyXLPd6AA0A9RCBAgz3CAALwJIIDPcKAA/CXPcoAACNGM6TOA +CoIZYSqiz3IA/wCqiiCIBQzwE4AkkhlhMHkksoogiAXPcgD/AP9OCE/9AJZGDW/9NJaUFwAQz3KA +ALA8AdkZ6G2CAeNtomuCeGALos9wgAAMJyCoH4YPCJ4Dz3CAACwJIKAH8A8I3gPPcIAAMAkgoM9w +oAD8JROAbIJ4YAyiz3IAoAgA7HBAoG8iQwDscECgDh9YkAYPQAXPcAAA/3/PcaAADCQBoRvYBKH1 +B6/0qXDgeOB/A9jxwOHFocGKCW/7i3Cy6AAUBTAdDR4AfggAAM9xgACA00OBz3GAAPCjQaEk8AsN +ngCKDs//HvANDV4CGg7P/xrwOw3eAAjYz3WgAMQnEx0YkKYNwAAdCBAFAtg8HQCQz3CAAIDTI4DP +cIAA8KMhoBnYlwhQho0Hr/ShwAohwA/rchfYjLiKI8cAUQBv9ookgw/xwOHFz3CAAIDTP4AEIYEP +//+POAQlgF8AAHDHJXjPcYAAgNMfoUQiAFPPdYAAgNNDCBECPw1eUTYPz/+cHQAQEw2eU89wgADw +KAWImB0CEBTwFQ3eU89wgAAALBmImB0CEAzwA4VGDy/2JIWYHQIQBPAA2JwdABCcFQAQgODMIOKA +XvLPcKAAqCAIgB+FEQgfAQ0N31KA2JgdAhCYFYAQQCgBBhEI3wGCuR8KnlNGDQACG/AfhVEigNOz +uB+lxSGCDwAAAAdFIQAGz3GAAAzULImGIf0PUiHBAUW5JXjPcaAAiCQQoYog1gDPcaAAxCd+GRiA +z3CgANQLAdpSoATYEBkYgM91gACA0x+FRwieARSVQwhfAc9woAAsIA+Am+itcRIJb/lWJUAVgBUA +EJS4gB0AEB+FkLgfpQ3wz3GAADQ8D4EB4A+hENnPcKAAkCM9oCEGr/QZ2PHAng2v9ADZCHYBgMG4 +g+DKIEEgBfIiDiAAyXAacEwgAKDE9BCGUSCAgcDyEIbPdYAAgNMPCJ4Dz3CAAPAoBYgN8BCGDwje +A89wgAAALBmIBfAFhiaG/g0P9pgdAhCAFQAQBCC+jxBwAAAH9K1xbghv+VYlQBURhs9xgADoCQCh +QSgBA1MhxQCYFYEQQSgGBRRpBSBEAQ8J3gEehZW4HqV58NYOL/tPJEAC6wgVBM9xgAAcmpgVgxDw +IQEAQCsCBoYj/Q9SI8MBRbtles9zoADEJ0EbmIAA2oy6AiZPAPpiy7rXcgAAAAhALQ8DkL9S9wUn +jxFiG9iDjCICgMf3z3GAAKg9EoEB4BKhANmduUXw5XliG1iAWQ6FcAAAwA8OIoMPAAAAEM9ygAB8 +mRZ6IIIlCzUIBBIFAADYDyDAAGG4TiMPCAEpwgN4eQV5AC3AAAV6F/BCIwMIANgPIMAAYbh4eQUh +AgCKIf8PC/DPc4AAqD0Tg4oh/w8ocgHgE6MB2M9zgAA8uACrAhsEASGjQqO98QDZnLmAFQAQJXiA +HQAQQCYAEqAdABAC2c9woAD0JiOgJYbPcIAA8KMhoEUEr/QKcOB48cDSC4/0CHVVIFAEDcyiwe24 +0SBigAfyBMjCDq//mBAAAM9wgAD80wyAz3GgAMgfZOAeoRDYDqEB2BUZGIABhYPo/wsewAGFwbiD +4Nb0ABAAIEHABBQPMRCFLL8GFBIxdQieAQ3MdQjeAhCFz3aAAIDTEQieA89wgADwKAWIDvAQhREI +3gPPcIAAACwZiAbwBYUmhfoLD/bnuJgeAhDKJmEQBvI+hpW5PqYA3gS4z3GAAIS6RpHleBMIgADP +coAAqD0JggDeAeAJogSRGwiBDwAA//8A3gnwz3GAADQ8DYEA3gHgDaEBlZzgiPQEEBEgCBAQIM9w +oAD0JgLZI6Ajhc9wgADwoyGgagsgAKlwgOCA9Cbuz3KgAMQsHBpABM9xgAAM1CAaAAQsiUAvAxMQ +uZ+5JXtBKgEhZXkmog0SATcdCd4CENqruQwanDANGlwwz3KAACw9J4IB4SeiDRIBNw0JHgMa2Ky5 +DRpcMKUOEBDPdoAAEJLgFgMQRYVEKz4HACZBHkChTJUB40Kxz3KAAAzUrIrgHsAQz3KAAIS6qKnp +qQoZhAQMGUAERJIQGQAEEL0Mv0EqAyHlfWV9SrHPc6AAwC9HG1iDlOLAIoYPAACTAM91oABoLPAl +ghBLsY8TAoYJ8KMTAoZRIgCBjxMChgb09QregQfwCNgM8Oe6yiIhAEDCARSDMMa6xrt4qVmpHQKv +9KLA4HjxwOHFz3GAAJwoI4FIgVkKHgCGIP8Bz3KAAHBUQ7gKYgDbgOLKIcEPyiLBB8og4QfPICED +yiOBDwAAbwDKJMEA1AIh9solIQDPcKoADFATCrQAuYGAvbmhAdkloATwoL25oWWg2QGP9PHAYgmP +9Ah1DcxTIECAB/IEyEoMr/+YEAAAAYXBuIPgyiYhEAXyzgkgAKlwCHaxDhEQEIUJCJ8BANlF8AzM +eQjeAA3MUyBAgA0SAjYd9AAigA+AAKzSAdnPdoAAcPAgqBGOUSAAgIQM4gPKIEIAEY4XCF4Bz3CA +AEzTA4iA4CAP4QHKICEBENgMGhwwz3GAALA8F4EB4BehA8gNEgE2hBACAc9wgACg0jV4KYBZYSmg +Gt7E8c9xgAA0PA2BAeANoQHZz3CAAAwnAdpAqM9wgAD8006ABoIB4AaiA/AB2QLaz3CgAPQmQ6BD +hc9wgADwo4DhQaCQD8IC1QCv9Mlw4HjPc4AAgNNYE4EAANqO6TyTYrkQuUUhQwHPcaAA9CZjoc9x +gADwo0GhyQAAAPHANgiP9Ah2AYDBuIPgAN0F8rYIIADJcAh1se0QhkcIngEMzM9xgAC4OzEIXgFA +2AwaHDBVEQAGANoB4FUZGAANyM9xgAAk0hR5A8hAqeIKr/+YEAAAB/CsEQAAAeCsGQAAz3CAAAwn +AdkgqM9wgAD80y6ABoEB4AahAtnPcKAA9CYjoCOGz3CAAPCjIaAVAK/0qXDgfwjY8cAkuVMhwgDP +cYAAHFpWeRMKEAJBkGGBBOJwcsogIgID9CCBQHnRwOB+4HjPcYAA/NMsgc9yoADIH2ThPqIQ2S6i +AdkVGliAIYCE6f0LHsAhgMG5IQnRAM9wgAAMJwHZIKjPcIAA/NMugAaBAeAGoQDZDfAhgFEhAIAA +2coh4QUBgFEgQIDKIaEE4H8ocOB48cAOD0/0z3aAAPzTAYYEIL6PAHAAADnyLykBAM9wgAA8OvQg +TQArhk8lgBDWCCACSYaU6IwlA5DPcYAAuDsI9LoRAAYB4LoZGAAf8LkRAAYB4LkZGAAZ8AGGIQie +B89xgABw8AyJT4kbCgAAEYlRIMCA/A5BAgfwANnPcIAAPLggqOINAAX1Bk/04HjxwH4OT/QIdgGA +wbgA3ycI0QDPdYAAgNOPDxEQEIZ3CJ4BEIYZCJ4Dz3CAAPAoBYgS8OIO7//JcAh37fEQhhEI3gPP +cIAAACwZiAbwBYYmht4Oz/WYHQIQEQjeAR6FlbgepR+Fl7gfpYAVABAEIL6PEHAAAA/0nLiAHQAQ +MIY6CS/5ViVAFUAmABKgHQAQANgFtgHZz3CAAAwnIKi0FQEQBoEB4AahWBWAEJnobg3P+gXoEIbt +uAHYAvQA2M9xgADi0/QhAAA8lThgYrgQuIC4z3GgAPQmA6EG8ALZz3CgAPQmI6Alhs9wgADwoyGg ++QVv9Olw8cCGDW/0ANkIdgGAwbiD4MogQSAF8goO7//JcBpwz3CgACwgBoAQeEwgAKDPdYAAgNPK +JyIQVvQwhmUJngE8lRMJAwAlhs9wgADwowKAtwkBABCGDwieA89wgADwKAWIDfAQhg8I3gPPcIAA +ACwZiAXwBYYmhsYNz/WYHQIQgBUAEAQgvo8QcAAACvSaDM/6C+gQhhMIXgMB3wjwAN8Y8E4Lj/sU +8ADfMIYaCC/5ViVAFYAVABCoFQEQnriAHQAQQCYAEqAdABDZCV6CAdnPcIAADCcgqLQVARAGgQHg +BqFYFYEQz3CgAPQmk+nPcYAA4tNclfQhwQNZYWK5ELmAuQjwtBUBEAuBAeALocjxAtkjoCWGz3CA +APCjIaDNBG/0CnDgePHAagxP9M9woACoIAiAz3aAAIDTDw2eU89wgADwKAWIDPARDd5Tz3CAAAAs +GYgG8AOG5gzv9SSGmB4CEB+GFQgfARENX1MNDV9SgNiYHgIQmBaAEBcI3gE/hpe5P6Y+hpW5PqYA +2QHdFvCcFgEQJQlRAD+GUSFAgs9xgACcKCOBKYEF8kQhDQQF8EQhDQID8AHdBNkYuCV4z3GgAIgk +EKEfhjMIngEUlisIXwGKCkACkejPcKAALCAPgAXoDcwXCN4BH4aQuB+mrXHWDu/4ViZAFZvtCwqe +U4YKwAEV8IYi/9zPcYAAgNMP9AGBGwgeAJgRgADPcYEAyBQCuBZ4AGH+uGgOAvvPcKAAUAwggM9w +gAAoCgTaIKDPcKAAkCNdoM9ygACA0x+CDQjfBA+CgOAA2CnyF4KKEgIBGWEE4gsIn0T/CR7Gz3WA +AIDTmBWAEOe4ANsJ9AK4z3OBAMgUFngDYy27wLuKFQARTxWNEM92gACcKPAmwxBCeaJ4Pgwv+0+T +VQNP9OB48cDhxaHBANhAwM9xgAA0PA+BAeAPoQPZz3CgANQLMaDgeOB44HjgeOB44HjgeOB44Hjg +eOB44HjgeOB44HjgeDGgENjPdaAAxCcQHRiQlgzv+otwlugAFAUwHQ2fAAohwA/rcg3YjLiKI18H +wQPv9Yokgw8E2RMdWJAb2RYdWJDVAm/0ocDgePHAz3CAAHC39gsv9hjZz3CAAOyV6gsv9hjZ0cDg +fuB48cAyCk/0GnDPdaAA1AsQhQDeocFAxiEIUAAKIcAP63IP2Iy4iiOWCIokgw9ZA+/1CiUABM9x +oAD8RBmBBCC+jwAACCAC9B2BEQjQJO4L7/qLcIDgyiACIEIgwSCU4UoBDQAyJkFwgAAARkAngHI0 +eAB4z3CAAPzTLoAIgQHgCKHSCsAAANkocDzwz3CAAPzTLoAHgQHgB6H28c9wgAD80y6ADIEB4Ayh +7vHPcIAA/NMugAKBAeACoSLwz3GAALA8BYEB4AWhHPDPcIAA/NMugAOBAeADoQHZANgU8M9xgACo +PRqBAeAaodoMoAMB2Mrxz3GAAKg9FIEB4BShAdgIcYDhNAmCAM9wgACA0x+AFwjeBM9wgAAwmcuo +z3CAAGSWzLAD2BGl4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HgRpU0Bb/ShwM9xnwC4 +/xiBkLgYoRiBsLgYoc9wgAD80y6ABYEB4E4IIAAFocbxz3CAAPzTLoAEgQHgOgggAAShvPHPcIAA +/NMugBGBAeARobTxz3GAALA8DoEB4A6hmfEKIcAP63JB2Iy4iiPYBzrx4HjxwH4IT/TPcIAA/NMM +gM91oADIHxDeAd9k4B6lzqUVHdiT0g7gBAnYA9gepc6lFR3Yk89woAAMJAeABOj3Cx7ApQBP9PHA +4cXPcYAAnCgjgSmBUSFAgMogogAn9ES4z3GAACw6w7gJYQkJHgA1DZ9RNQleAM91gACcKAOFGIgh +CFAAmg+P+gjoz3CAAOQrCIgNCNABA4UYiA0IkQAJDZ5RAdgD8ADYUQBP9OB48cDKDw/0RCIRU013 +hif8E01wBCKQXwAAAEAEJYBfAAAAIEEofoMF8kYPj/qD6ADeAvAB3s91gACA0x+FCQheBADdvPD9 +CRGgJg+P+h7oz3CAAOQrCIiH4MwgYoIW9AGFjCD/jxL0JJXPcAAA//8dCQEABYWMIP+PCPQMlddw +AAD//8olYRCa8s9wgACcKPAggAMpgA0JXgHPcYAAGFUF8M9xgAAkVRiICmFBLwARz3GAADBVCGEU +es9wgACcWk5gKw4eEB+FCHSEJAmQD/TkvtEgIoIf8gGFjCD/jxv0BJUzCIEPAAD//wrwDQ5eEB+F +IwieAgkOnhAJDR5SAd0M8BMO3hDPcKAADCQRgIwg/4/28wDd5r7KJSIQVg6P+gjoBCW+3wAAACLK +JWIQjQ0QEBUO3hERCBEgz3GAAIDTH4GTuB+hEQ5eEc9xgACA0x+BjbgfoYwnApAO9M9xgACA0wGB +jCD/jwf0BJENCIAPAAD//wDdjCcCkMwngp8AAFAAB/TPcYAAgNMfgZO4H6HPcIAAnCgCgMIQAAYQ +6IwnApDMJ4KfAABQAAj0z3KAAIDTL4IC3SV4D6JxBi/0qXDgePHABg4v9IDbosEA3c9xgACA076h +v6Ggsa+hTxlCA4AZQAOMGUQDmBnCAIQZQAPPcqAAyB+kEgAA+BIOAKwZQANCGUQDwniwGQAAz3CA +AIySuaDPcIAAONSgoATez3CAAOgJwKCZEYAAoLiZGQIAz3CgAMQnZBhYg892AAD/fxMYmIMb3hYY +mIMaGFiDiif/H892oAD8RP2m+aaKJ5gdz3agAFAM4qZxonCiPBhAg4ojGAhuooASAwCkGUADUSNA +gM9zgADwo1gZQgMM8kIQAIYEIL6PAMAAAATyAYMC6AKjoaOAGkADz3OAALg7z3CAAJwoQ4ApCZ5D +H4GLuB+hVSPABbQZAAAK2ByxG5KWGQQABtnPcKAAyBwpoAvwQCMAA7QZAAAQ2ByxGpKWGQQAz3Gg +ANQLEIEfCFEACiHAD+tyC9iMuIoj1QCKJIMPFQav9bhzAd2woVEgQMZsAiEAyiXhEM93gACA07QX +ARAAgQHgAKH62HoOL/sA2SDYz3aAAFjU2g5gAwCmAdjPcqAAyB8Tos9xgAAQJwiBAIBsgWCDJIFA +JhAVABEEAPgSAgAA2QIggIABpgDYAyNDAFAfBBBSHwQQVB8EEAIkgQDPcIAAnChipkOAI6YUks9x +pQAIDAm2CILAuAi2ABEEAFMkRQFTJEEATB9CEYPhyiHBD8oiwQfKIGEFyiOBDwAAnAtUBaH1zyAh +AwQkgQ8AAADgLbl/h5ofQhAUHgARHQveAgS5gbkleAi2B9gH8ADZFSAMICCkA/AE2AHg8wgUggiC +67gQCoIFH4cruFMgBQBRIIDFpvLPcYAA6C4GgQHgD3gGoUEpgEPPcYAA6C5mgc9xoAC0DzeBwLgw +cwDam/TPcaAAqCAmgYwhg44mAQ0AsHCN9M91gABY1AWFz3akAJBB9YY2hgQggA8AAADgLbjnpc9z +gACA0yilDQgeAFAbxAMJ8FAbhAAEJ48f//8AAOelDwheADC/UhvEAwXwUhuEAPB/56UNCJ4AVBtE +AAnwVBuEAAQhgQ///wAAKKUNhgalBCCADwAAAP4puFYbBAAfg0cI3gLPcKoAAAQEgAmlz3CAAOyV +IIhEaDXpYQl0AAIQhACfcQDYqCCAA/QiDwAV3hO+8CbPE892gABY0xV+AeDgphzwz3CAAHC3IIhE +aBnpAhCEAIDhyiRNcMogLQDoIK0D9CIPACneEr7wJs8Tz3aAAFjTFX4B4OCmIa0CHQIRtBMBAALd +AYEB4AGhDPAEIL7PYAAAAAP0BN0E8AkLHkAD3YHlTvMvDZEQAt0EIL7PgAEAAMolohEG9FEjAMDK +JeIQ6w2QkM9woAAwEAOAgODKJWIRhuUyBAIAz3aAAIDTHJZCIIQAH4bruC8kCAF78s9xqgAABKKB +z3ClAAgMAIAEJYMfAAAA/yi7BCCADwAAAOCJuxt6ZXrPc4AAWNRSpqyjTaMAgUgWjxCU5wqjGfIG +9jMPkRIjuA7wHQ/QHe7nE/RFKP4CQSnAcFElwJHCIGIAB90L8EUo/gJBKQBx+vEiuPjxANgI3SGB +F6YroxyzHwgRBc93gACcKOOH6IcEJ76fAAYAAAPyjLpSpuS5yiUiEuG5yiUhEoYh/g9BKQIBTR6C +ECiTRXkosykN0REjCLQDB93PcYAAnCgjgYQRAQATCQQAz3GgADAQKIEJCEAACN2H5cogAQEgCyH7 +yiEhACsDAADPcKYACAQBgAQggA8wAAAANLhCHgQQQhYBERkIX0bPcKAAqCAIgBlhMHnCCi/7iHAF +8OIKL/uIcAQggE+AAQAAANkxCIEPAAEAAAHYTh4CEM9ygABY1JoWgBBCHkQQTR5CEDemKaIEuCiS +ibgleAiyc/BNHkIQz3CmAIwDPYAEIYIPOAAAAEEqwASaHgIQBCGADwAAAPAluiy4RXjPcoAAgNMS +pg0I3kcSgoy4EqJTIcMCSBKOAHei4L7RIeKHB90D9Ajdz3CAAFjUKaCaEoEA6JAEueV5KLB8sDKC +LaB9DdERz3GmAIwDvYEEJYEfAQAAADC5ThpCAKmgThKAABvoWw5RE1MIH0YU2M9xoADIHx6hENgO +oQHYFRkYgArdUSAAxsol4hFRIwDAyiUiEvENkJIU8CcLlAPPcIAAnCgDgIQQAAAXCMQAz3CgADAQ +CIALCwEAB90C8Ajdh+Xl9M92gACA004WgBCA4N3yz3KmANQELBIAgDQSEoA4Eg+AyxIQBkpxxrnp +coYi/Q8GukV5SnKGIv0PBLpFeQQggg8CAAAAJ7pFeUQnAhwNukV56XKGIvMPBCCADzgAAAAOukV5 +JbgleEQngRAUuSV4iLhEJwESQSnBgFIgQAUSplgeQhDKIYIPAAD//8ohgQ8AABAfOnE3hkAeRBAE +IoEv/wMA/yi5N6ZGDq/4ANqsHgAQcQ+eFEgWgxAyhqDj0SHhgjDyBCGCjwAAAAEI8kQhDQYjvQHl +FQ2VEAQhjQ8AAAAkQQ2AHwAAACQEIY0PBgAAADG9MQ3VEBUNkRAU6kQhDQYjvQHlHQ2REAPqzOMK +9leGMnLKIo4PAQCIDcwgjoDO9xUOBXABAIgNz3GAAKg9HIEB4ByhCN0z8IYh/wlBKc0Az3CAALgv +IIAB5WB5BtgvCEQDz3CAAJwoA4AIgAQgvo8ABgAAANjKIGIAMoYEIYEPAAAACCu5FQhFAKYMAAAI +dZTgyiXiEwvwz3CgADAQCIA3hhBxB93KJWISWBaCEM9xgABY1AiRB7qIukV4CLEXhjAZAAQcsRKG +66ENoawWABAoGYAEHbENDdEReggAAAh1jO0iDmAAFd1uCS/7CHaA5swgIoDKJSEQgOWUC6L/yiBC +AwDYz3GgANQLEKHPcIAADNQNiBEIHgDPcKAAiCQegAsaHDA6DEAADMyGIPmPCvSE5cwl4pAG9ADY +j7gMGhwwMtnPcKAAyBwqoMkF7/OiwPHAcg3P8wDdz3CgANQLGIBCIAAIgODKIEwDz3GAAOguJYGB +4YohmQ4I9M9xgACcKCOBPoGAIZkOEHEA2MogbQR1CBEAz3KAAIDTWBKBAIDhyiEiACL0DBIDNycL +3gANEgE3UyF+gA3y67k3ggXyoOEB2cB5CPCO4QHZwHkE8CcLXwEA2c9zgACcKGODaYN9e1IjAwDA +u2R5B+k/gpG5P6IK8DeC6fH2CwAAWBKBAIDhKAsBAIDgfgICAM92gACA01gWgBAS6ALZz3CgAPQm +I6DPcIAA8KOhoMDZmRaAEIC4mR4CEChwA/BC2M9xoADEJ78ZGIAB2AwZQIMQGRiAH4bxuCICAgAS +hjeGoguv+ADarB4AEB+GxQjeAs9xgACcKGOBSBaAEDSDBHlEIQIBRCABDEIpBAGAcs9xgABQKVMi +RgAyIYEBibk8plSDcBaBEM93gADIVAQhhQBNFoIQhiH/A0S5BCWFAKBx9CdBEGIeRBDPcYAAdCwy +IYEBibk9pnQWgRD0gyR/hiH/A0S5RH8/Z89xgADIVPQhwQNkHkQQMoY6pnSDO6ZkeAR6z3CAANhU +gHL0IIMAz3CAAABV9CCAAI4exBCQHsQQkh4EEJQeBBBOHkITmfBOFoEQz3CAAMw5AIDAuKkJEACA +4ADbyiEiAAv0coZIFoEQBCODDwAAAAh7e8K5ACGND4AARClQjbiNx3GAAHAsz3eAADC3CIllfbym +cBaNEGV6w728ffQnTRNleDCJZXk9pnQWgRDDuTx59CdBEGIeRBNapmgWgxBkHkQQz3GAAEC3w7t8 +e/QhwgAbpo4ehBDPcoAAiLf0IsMAbBaAEMO4HHj0IQEAkh7EEJAeRBD0IgAAPfCA4ADZBfRIFoEQ +w7k8ec9wgABAKShgz3KAADC3HKZwFoAQw7gcePQiAABiHgQQz3CAAGQsKGAdpnQWgBDDuBx49CIA +AM9xgABAt1KGZB4EEEgWgBDDuBx49CEDAFqmz3GAAIi39CEAAI4exBBbppAexBCSHgQQlB4EENYL +QAHPcIAAnCgDgAiADwjeAk4WgBCA4EgIQgVYFoAQBejCCg//A/DCCgAAqQLP8+B4z3GgAMQnFRED +hgTYExkYgBvYFhkYgAPaz3CgANQLUaDgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeFGg +5LvhIMIHFthSEQCG4LjhIMEHyiDhBQkIXgAJC94A4H8S2AHZz3CAAAwnz3KAAIDTtBIDACCoBoMB +4AajH4IPCJ4Dz3CAACwJIKAH8A8I3gPPcIAAMAkgoBXY4H7geOB+4HjxwJYJz/PPcIAAgNMygCcJ +XgLPcYAAnCgjgUgQggA0gUR5USGAgEjayiKBDwAAkAAC8A7aAN/PcaAAqCAngawQDQBZYbFxwiVF +EMol5hKweCIL7/oK2c9wgAAsNgCQz3agAMQnCwgeAYwlA5ID9wDdGvBuDKABANjPcKsAoP/6oADY +ygzv/Y64GRYAlgToAtgQHhiQz3GAAKg9G4FqvbhgFN0boRkWAJaH6FEhAMZcD2EEyiBhAEkB7/Op +cOB+4HjgfuB48cDhxc9wgAAMCgCQz3GAABzCqNoB3YAgRAsQePIO7/qpc4DgyiHBD8oiwQfKIIEP +AAC1FMojgQ8AAMwAyiQhAOABYfXKJQEBFgpAAM9wgADwL/kA7/O0oPHAwgugAQDY5gtP9x4PD/4u +Dk/7ANgaDO/9jrj/2c9wqwCg/zmgOKDRwOB+8cDhxc9xgACcKPAhAgBKJEAAwxIBBg94MiKCDwAA +HwMEIYMPAAYAAIDjAdvAewQhjQ9AAAAA13VAAAAAwiQCAVIIr/vAuYEAz/PgePHABgjP8yYPIAII +dc9xgACA0x+Bz3agAMQnsLgfoRkWAJYA2QToAtgQHhiQz3CgANQLN6CiDgABVgsgAwHYBe3eCEAA +BfC+CEAA8gnP+hkWAJYF6ALYEB4YkBkAz/PgePHA6gqgAQHYANnPcIAALD0uoJILb/YZ2NHA4H7x +wH4Pj/OiwYt2gglv+slwCiUAkBn0z3CAAIDTz3GgAAwkO4FXgDByyiUiEiCGDQkeBALZjBhEAAQl +gl8AAHDHP4BFeT+ggOW6AwIAAMDpuNbyz3WAANAvAIWKIQgA5JDPdqAAxCcTHliQz3GAAIDTP4E6 +d4Yh/COFCV4EQSkBIcO5z3KAABxaNnoggkB5CHUZFgCWBOgC2BAeGJDPcAAA/38THhiQG9gWHhiQ +A9nPcKAA1AsxoOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4MaDPcIAAjJIZgIDg9A1C +AZrlGgMCAM9wgQDAISoOIAMA3QsDAABSDm//KnAacACF6g4v/ypxcg8v/wh3iOfMJ+KVyiXBEyvy +GwgQIO4KIACBwAolAJAc9IYN7/8BwBjwA9nPcKAA1AsxoOB44HjgeOB44HjgeOB44HjgeOB44Hjg +eOB44HjgeOB4MaAA3Q8PkRbPcIEAwCGuDQADgOWOAgIAPg+AAc9wgACA0x+AEQieAwHZz3CAACwJ +IKAJ8A8I3gMB2c9wgAAwCSCgERYAlgDdQcAxCJ8A3g8v+oHACiUAkBD0BBQFMB0NnwAKIcAP63IK +2Iy4iiPHCgUHL/WKJIMPgOUqAgIABNgTHhiQG9gWHhiQz3CAAIySGYCA4OAMQgELAgAA4LjB8s92 +gACA0xKGhiA6AIwgBIKkDoUBz3GgAAwkPIEXhiJ4ZLgQeIoeBBBEIgBTFwgRAh+GDwhfBFElQNEB +2AX0ANgD8HYNT/+cHgAQLujWCE//CiUAkNf0DcwhCN4BH4YdCJ4BLyCHCowgAoYI9M9xgACA0x+B +mLgfoZYJIACBwAolAJDB9M92gACA0x+GKwgeBKgWARDU2OoOIAHJcgfoQgxABAvwBgpP/6zwz3GA +ACQ+HoEB4B6hAd/PcIAADCe0FgEQ4KgGgQHgBqEfhvO42A5C+g+GgODoDUL6H4YRCJ4DAdnPcIAA +LAkgoAnwDwjeAwHZz3CAADAJIKAA2M9xoADIHAehMNgKoaoL7/8BwB+GJwgeBhDYDBocMM9wgQDA +IfoLAAMNyAAggQ+AAKzSH4bgqbi4H6YAloYg/ACMIAKAGvTyCw/6mOgD2c9woADUCzGg4HjgeOB4 +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HgxoACWQglv/DSWQ/BBwBXfCwjfAOl1H/AI2M92oADE +JxMeGJBeCs//CHUrCBAFAtg8HgCQIRYBls9wgADwoyGgERYAltMIn4DSDS/6gcAKJQCQ4fM/DVEV +z3CgAJAjHoAEFAQwUSCAgMohwQ/KIsEHyiBhAs8gIQPKI4EPAADkBOQEIfXKJSEAVgnv/4hwCHWp +cNkDr/OiwOB48cB+C4/zocEIdgDYQMAApm4NL/qLcAolAJCF9M9woAAEJSKAAIYEIYEP/wBf/wUh +AgBAplMhggBTIIMAZXqlCtEBz3CAAIDTH4B5Cp5TtwifBgQgvo8AHgAABPQAhgnwAQqfQACGCwoe +QIW4AKbPcoAAgNM/ghEJXgaIuIu4jrgApkHwKQneBk8gAQKJuY25i7mOuSCmHoIEIIAPAgAAAFIg +QAQquCV4AKYt8Py5xSCCDwAAAAXk9YUgHAAApiPw9bgAhh/yhiAcAIUgGAAApgEKH0EAhi8K3kCG +uACmE/BTIQMAUyACAAUjvoDKJeEVCfKGIX8PhiB/DwUhPoDKJaEUz3CAAAzUDIjEuEAoAQYAhiV4 +USCAxACm1AhiBMogIgipcMUCr/OhwOB48cDhxQDdBdgLuCIMr/qpcdoMj/TPcIAAgNMfgBUI3wLF +DRURwQhfRZ8IH0UB5U7wANmcuc9woADQGzCgAdnPcKQAmEA8oAXYB/AGCwAAnghgBAXYAdiWCEAE +Yw0VEQQgvs8wAAAAAeXKJSIQLQsfQAkIXkVHCZ5DMwgfR9kI3sXVCZ7Dz3CqAAAEAYCGID8LAN27 +CNGAE/C2CgAAz3GAACw9DoEB4A6hCfAA2Zy5z3CgANAbMKCaCgAAANnPcKQAmEA8oBDwAN0NCx9A +HghgBAHYqPF6CgAAz3GAACw9DoEB4A6h4QGP8wzMRCA+ijnyQQjeAA0SAjeA2M9xgACwPAwaHDAN +Ct4CHYEB4B2hBfAVgQHgFaERCt8AANnPcKAALCAvoA3MhiCCAuB/DRocMC8IXgGKIAQADBocMM9x +gACwPBSBAeAUoQ3MANlGIIACDRocMM9woAAsIC+g4H7gfvHA4cUtCBECKQqfUc9xgACA03+BhiP3 +D7eBz3KgAAwkHIIU4AglABBcgooRAQER8JXoz3OAAIDTN4PPcqAADCQcggghAACKEwEBXIJ/g04P +QATPcYAA1C8AoQ0Bj/PgePHAz3CAAIDTFJBRIMCBz3CAANQvAIAF8nYOQAQD8MIOQATRwOB+4Hjx +wGYIj/PPdoAA1C8AhoDgyiBhBSPyz3GAACgKIIHPcoAAJApAgsdxAAAAIM91gACA00J5zLnPcqAA +1AsvoiCAOGCeC+/zN4UAhgDfQIA3hVlhIg6gBCCg6XB1AI/z4HjxwGYNgATPc4AA1C8AgwXomg2A +BACj0cDgfuB48cDPcIAAtDvPcYAASPHPcgAAYCKqCOAEAIAA2c9wgADULyCg0cDgfvHAxg9P889w +gQAMIwCArQgQAM9wgADULwCABugCkIYg/4lM9EQiAFNLCBECrg/P/6YO7/8I2CoPz//PdYAA1C8K +JgCQAIUI9IDg7A7C/3IP7//JcCCFDOkCkQroiO56DGAEAIE2DaAEAIUo8KoMQAQk8IYi/9zPcoAA +gNMS9B+CIQheA5IIoAQB2AjYz3GAAHCECHSGsTC8hg2gBIexDvCcEgAAFQjRADSSmBKAACXaw7kO +Da/0ANt5B2/zFdjgePHASgpgAQHYOgjv8wPYJggAADoKYAEB2NHA4H7xwOYPz/+WDM//FgmP+tHA +4H7gePHA1g5P889xoAD8RAWBAN68uAWhBgpgAclwA932D6/zqXDPcaAAMBCioc9wgADoLqKhEQdv +88ag8cDPcKAAtA83gM9wgADoLgaADQkBALYPz/8E8JoPz//RwOB+4cXhxgDZB9gA2rRptH3HdYAA +HMJVfcCVjCYCnQDbhfaMJoWSw/b/3sC1wZ0LDlMfjCY/kUL2YbUB4k96zwoSg2G4AeHFCHWAL3nB +xuB/wcXxwCoOT/MA3c9wgABgoLYN7/m0qBLoCN6A5cwlopDMJSKRzCVikQQIov7KIEIDYb7pDnWQ +AeUd8IokAXHPcYAAJNKoIIABBBlQA+B4ANlKJAByz3KAANDRqCDAAhYiQABikM9wgACc0jR4AeFg +sM91gACcKM92gAB4o0AlABckbhoNoAEG2kAlABVAJoESDg2gAQbaQCUAF0AmART+DKABBtoOhVEg +QIHAC4ICIg3P+YDg3A7C/89xAAD//89wgQAEHyygug7v+SugzQVP8+B48cBaDW/zFNnPdYAAlCzY +3O4OL/UCJQATz3CAAOAu4g4v9RTZz3aAAJwoQCYAFQCmwNwCJQATAaYA3alwqXHCCC/0BtoB2Klx +tggv9AbaAIZKJIBwqXECpgOmqCDABRUmQhBggoogxg0NswCCAeGpoACCqaAAgsAYWAMAgsEYWAMA +gsIYWAMb2c9wgABw8DkFb/MsqPHArgxP8xpwOnFIdjoL7/macwh1BCaAHwAGAACA4EoiQCDCIoIk +BCaOH0AAAADXdkAAAABKI0AgwiPCJM9wgABMCcSIAN/GDyAB6XCM7QPeLyEHBC8iRwTJcEpzqgwv ++wokwATJcNIML/uKcYTtZgyAAgTwlgyAAs9wgADoLgSAIQieAM9wgAAEOgCAiug52AIL7/mLuA0I +UQAqDc//DfAA2Z65z3CgAPxEIaDgeOGgWg8gAQDYTQRP8+B48cAGDE/zo8EIds9wgACcKPAggwOK +JwsWLZP9Yzx6KHCGIfEPwrpHuSR6hiD+A0S4HwmAAAohwA/rcoPYjbiKI9INSiQAABEF7/QKJQAB +SIN/Zzu6UyICgECvTZPAukGtC/L3k4Yn/xlDv+etd5OGI/4HRbtorRTqz3KAAAw6FSIDAACLNXoC +reGL463ii+StY4tlrSOK1gzgACati3CpcSoMb/MM2gDAAcEGCK/0AsKLcKlxFgxv8wzaAMABwVoP +b/QCws9xgACcCQCh5g3gA8lwnQNv86PA8cAyC2/zV9jPdYAAnCgjhc9ygACgCXeRAKILCx4AX9gA +ogsLngCFuACiCwteAIe4AKKKJgsWy2HZYQDagOPKIIEAz3KlAOgPBqIAic9xoACkMIDgAYHPIOIA +0CDhAAGhQg7P9gOFz3GgAMgcT4AC4Eih8gtgAchgA4VqDm/9DoAdA0/z4cXPcIAAnCgDgCmARCGD +gADaJPSJChUEACKND4AA3CcAjaC4AK2AFYAQoLiAHQIQQBWAEKC4QB0CEBCNoLgQrZAVgBCguJAd +AhBQFYAQoLhQHQIQAeLg8UUKFQQAIo0PgADcJwCNgLgArYAVgBCAuIAdAhBAFYAQgLhAHQIQEI2A +uBCtkBWAEIC4kB0CEFAVgBCAuFAdAhAB4uDxIwmeAc9ygADcJwiKgLgIqogSgACAuIgaAgBIEoAA +gLgQ8JLrz3KAANwnCIqguAiqiBKAAKC4iBoCAEgSgACguEgaAgAA2D8JHgBKJAB04HioIAAGKwie +AAAggw+AANwnIBOBAIC5IBtCAKATgQCAuaAbQgBgE4EAgLlgG0IAAeAc8EokAHTgeKggAAYrCJ4A +ACCDD4AA3CcgE4IAoLogG4IAoBOCAKC6oBuCAGATggCgumAbggAB4OB/wcXxwE4JT/PPdoAAnCga +cAsIUQAAhgLwAYbEEAAGFSYNFEwgAKAB3yW4UyAFACCFwH9AIQAGxBEBBhsJXwEKIcAP63KB2I24 +iiOND1kC7/QKJAAEiiILDVlgABYDQFhgYKAAFgBAAaEAFoBACKkAFoBACanPcIAA6C4FgBEIUQBA +hQAWAEEPsgTwABYAQQAWgEAKqQAWgEALqQAWgEAMqQAWgEAAFgBBB7EAFgBBCLEAFgBAUgxP/QCF +yBAABoYgf45B9PAmwBPIEAAGhiB/jjv0CnDaCS/4AdkiCW/8LyAHBL4M4AMKcM9wgADkKyyQHpYN +CQAAUg/P+EsIAQQAhcQQAQYKcCW5wLkSC6/1ANqSDgABiegLyAUggA8AAAA8CxoYMIIOAAGJ6AvI +BSCADwAAANQLGhgwC8iQuAsaGDDKCo/zWgrP920AT/PgePHA4g8v8wDZCiQAoKHByiFhABTyz3CA +AOguEBAFAB0NnwAKIcAP63J+2I24iiMIDSUB7/QKJAAFz3WAAJwoFSUOFQCGFSVSECQQFQAAEgEg +IBAWACgQFwFBLU8hKYEaEBgBwL8luVMhEwCODWADDdmKIIkAinHGD6/76XLODi/+inAAhgmAJbhT +IBAAinDSCC/4ANlMJACgSAnB/3kIECAN7wohwA/rcn/YjbiKI4kHSiQAAKEA7/S4cwoNgAEmCu/3 +AdgAhgiADwgeACwVgBCE4APYAvQF2DpwIQsRIDYOD/veDQ/7z3CAAEzTA4iA4FQNoQDKICEALBWA +EITgyiCBDwAAgACICWH7yiFhAEojACBL8KYOb/+KcMoJ7/cA2CwVgBCE4MoggQ8AAIAAYAlh+8oh +IQAhDBEg2g0P+9IND/tCCc/2ag6P+YDg4AnC9gDYH/DWCc/2Vg6P+YToBgkABBbwz3CAAOQrCIiJ +4Mwg4oHw9c9wgABESACABNm92h7bQMCLcIIM4AAYuwHYenAAhgiADwgeACwVgBCE4ATYAvQG2Dpw +AIYogBSQBCGPjwAGAAAFfwfy9rnCJ6IQwCehECpwinGGC+/16XKA4MogQgR0C+L1yiHCAw0LECBy +CM/3n/C+DY/5BNnPcIAA6C7GCW/9JKAghsgRAAaGIH+OQfSuDi/8inBKCuADinAAEgAgyBAABoYg +f45A9M9wgADkKyyQHpUPCQAA0gzP+G0IAQWKcApxmgiv9QHaf9kRuc9woACwHzSgqg6P+QYMAAGI +6AvIBSCADwAAADwLGhgw9gsAAYjoC8gFIIAPAAAA1AsaGDALyJC4CxoYMD4Ij/MM8CQZQAUghiAZ +gAUghigZxAUghhoZBAYKDY/5CegA2AsMESC2D8ADA/CWD8ADAd1iCuABqXDPcIAA3Ca+CeABoKgp +DFEgz3CAAOQrCIiJ4Mwg4oED9BEIESARCBEC0gyP+QToqgkP9RoKT/liD4/3BMqQ4Mwggo8AALMA +DvIKIcAP63IBEgQ2ktiNuIojjQZFBq/0CiUABSIKoAEA2AkFL/OhwPHA3gwP8wzMAN57CB4Az3Cg +AMgfsBACAM9xgACcKCOBAuJGEQEBYbkIIkEAPqAQ2S6gAdkVGFiAz3CBAMAdAxoYMM9wgQCIHqoN +oAIEGhgwz3CgAPxEJYBKIEAgvLkloAzMhiD/gc9wgABACQCAwiABJIDgcAyC/QQgj08wAAAAHfA3 +CF4DTg7P/s9woAD8RCWAvLkloM9wgAAsPQ6AjCACjYj3Ygnv9RnYgg/gAMlwDMwzCN8DyXcadgDY +z3GAAKg9DKHPcIAAECcQgACADqFQ8DYJ7/UZ2FIP4AAA2AHeSPAE2M9xoADIHwYaGDAfgYDgiiAM +AMoggg8AAAACDqED2BW4EhkYgL0CAAAMEgE3SwheRQbIhiDxjyH0z3WAALg7iBUAFgQhvo8AAABQ +AeCIHRgQBPIE2AwaHDCWDc/+z3CgAPxEJYC8uSWgaxUAFoMIhY8AALQAAd4MzNEIHwHjCJ8BhiD/ +ha3yUSMAwHv0BsgEIL6PA4DoU8r1kQhfxd4Jb/oA3s91oADIHzcIECD/haAVABAJJwAQ5ODL9s9w +gADQ0QCADwheAN6lJg+gABDY5OfH90AVARYweZINL/oQ2IogCACgHYATDqUfhYXoiiAEAA6lOgwA +AS/YlbgSHRiQz3ABAMD8FR0YkLIJgALPcYAAqD0MgU2BCCIAAA2hz3CAABAnEIBPgWCADoECewDK +CCLCAIjgT6HT9APZz3CgAEAtMKAAGoIzzvANzFMgQICg8wTIAxIBNgMaGDAEGlgwsguAAs9woAD8 +RCWAvLkloM9wgABACQCAgOCICoL9iPERCF/FDMzPdYAAsDxBCN4AgNgMGhwwDcwRCN4CHYUB4B2l +AN4F8BWFAeAVpc9wgABw8BGIUSAAgNQNYgLKIGIAEe8chQHgHKUN8IogBAAMGhwwFIUB4BSlBe8b +hQHgG6UMzHkI3gENzAQghA8AAAAYOwyADwAAAAjqDI/3DcxHCN4Az3CgACwgJYAGgArhLwhEAAMS +ATYC2AwaHDBQ2KINL/6YEQEAnfFqCu/4yXAPCB4ACNibuAYaGDAq8QTYBhoYMCbxA8igEAAA8LgA +2D7yUg4P+ADYlrg68E8IHwJzCF8CBCC+jwAAAFAM8hkLHkCKIQQAz3CgALAfNKAE2AYaGDANzO+4 +BPPPcaAAqCBIgc9xgAD40y+RMHL0BcX/r7jxBe//DRocMCIL7/uKIAQAMgyv9wDdA8igEAAA8Lip +cAby3g0P+ADYlbgSDIADt/HSDS/4AdgA2JC4+PEB4AAaAjB9AQ/z8cAKCQ/zz3CAAFA6AN/ooM91 +gABsCgGFhiB5j+ulB/QD2EIPb/kLuI3oBtnPcIAApAogoM9wgACoCuCgGQIgAADYz3CAAKgKAICA +4AwCAgACFYUQAxWGEM92gAB81UAmkhCocIQoHwAvcwAjgQ+AAITcFSGBARuROpFAJhEaQCYQFQAm +xBAEFAQBemZDgttjSiNAIB/oIQhFAAohwA/rcs9wAAB7J4ojxgEKJMAEvQGv9LhzD+pQcMohxg/K +IIYPAAB8J8ojhg8AAIkByiLGB233IQkFAQohwA/rcs9wAAB9J4ojRgNKJEAAgQGv9LhzD+pQccoh +xg/KIIYPAAB+J8ojhg8AAI8ByiLGB233DIWQ6AeFjujPcKAAsB9kGMAEz3CAABAnCIAAgBwdwBQJ +pc92gACcKAOGJYMooKhwhCgfAAAhgH+AAEjcMOD0IIEBA4Y0sAOGJoMpoAOGJZMtsALYCHFeC6/z +ANr6CkAAAo2EKB8AL3EwIEIgA43HcYAASNww4fQhAQBTIgAAzgqv/wDbAo2EKB8AL3EwIUAgACGC +D4AAeNojjQK5NHleDOAAWWGeDGABAdi2CcAAIo1DjYQpHwAAIYB/gADI21V4bIAbCx4Az3OgALAf +ZBvABM9zgAAQJ2iDYINipWKGhCkfAMITDgaBvsIbmAMMgMC4UiAAABt4VXgAIIIPgACE3DTiNCJB +Dgq5MiJALiilz3GAAKQKFwheAM9wgABY1SAQgACB4AXYAvIE2AChz3CAAKgK4KAMhYDgyiAhAAgM +ofXKIQEAAdgNB8/yCiHAD+tyz3AAAH8niiMHCEokgAD9B2/0uHPgeOHF4cYIdQDYz3OAAGwKz3GA +AHzVz3KAAEjcYosD8AHgD3jDaYQrHwAyJk4eGQiDA4QrHwAAIk4OMOb0Jg4Q4w2BkwTwiiD/D8HG +4H/BxeB48cC2Dw/4ANjRwOB+8cB6DW/54cUy6M9xgABgoBSJXQhQADeJCenPcIAA7MMBgBBxAdjA +eBTwz3KAADCZC4qGIP+MHvLPcYAA7MNhgaSKANgLC0ADIIoJC0EAAdjPcYAAmAoAoRUIUQDPcIAA +fEImgCOBIIHKCsABVQbP8gIPD/ju8eB4z3GAAHAKAIGAuAChz3GAAFA6BYEB4AWhBtnPcIAApAog +oADZz3CAAKgK4H8goOB48cCiDc/yz3CAAG4KAIjPc4AAbwrAiwHdhCgfAC9xACGCD4AAyNuYcDDi +8CKAA8C4geAAIYAPgABI3DDg9CCFA8dxgAB81cB9Aebjic9+OQ7jE8Cr9CCPAy0PQREU7fAijwMl +Dx8QAebjic9+Fw7DE/QgjwMPD0ERBe3wIo8D6w8ekMCrA4lXDgMQ8CKAA4QsHwDAuFIgAAAbeNV4 +ACCBD4AAhNw04TQhQA7PcYAAjAoKuAChx3AAAAAYMgtP+c9ygACkCs9xgACoCgfoA9gAogDYAKEF +8AbY+/H6Ds//LQXv8gDY8cC+DM/ypcHPcIAAbAoEEAUAAd3PdoAAqAqodIQkhpAAFgQQE/JMJACA +oAvi98ogIgEB2c9wgACkCiCgAN3PcIAAhEWgqKl3XfBfDBEAAtrPcYAApApAoc93gACERSCPoKYA +3onpz3GgACwgMIHHcQAAAH0toDQQBwDPcAAA9HBAwATYQcAB3ULFQ8ZExqlwENkE2gDbmHO4c14M +7/fYc8CvqXcv8DMMUQAD2FoKb/kLuIDgD/TPcIAAhEWgqA4L7/cE2M9wgACkCqCgANgApgDdAd8X +8D0MkQDPcYAAhEUA3+CpTyWBACGgz3GAAFA6BoHgpgHgBqHPcIAApAqgoOl1gOVYDwEA6XAdBO/y +pcAKIcAP63LPcAAAeifxBG/0iiOFAvHA4cXPcoAAbAohgqXBKHSEJAaQz3WAAKgKABUFEBfyCw1R +AJoNj/QJ8IW5IaLPcYAAUDoKgQHgCqEB2c9wgACkCiCgANgApSrwTw0RAAHaQKWGITmPANjPdaAA +LCDPcwAA9HAE2bCFQMNBwULCBfIQ2UPBAvBDwETAANgG2QTaCHOYcLhwACWHHwAAAH1GC+/32HAD +8A8NUQAB2HUD7/KlwM9wgACkChkNkQCFuSGiz3KAAFA6KoIB4SqiAdnD8QAQBAAKIcAP63LPcAAA +hCcZBG/0iiNOCPHAvgrP8s92gABsCiGGUCEMAKe8UCQMki8qQQAG8kINr/ROIsAHFvAodIQkBpAV +8i4Nr/ROIsAHAYbPdYAArC+GIAYAAaYAhQToQHgA2ACl0QLv8gHYz3CAAKgKAICA4Jb0USEAgM91 +gACcKHv0Ao5DjoQoHwAvcAAggQ+AAMjbMOHwIYMAAdkCumZ5NHrHcoAAhNw04hBiCrgIpsdwAAAA +GGoIb/lKIEAgwxUBFgh3z3CAACTSNHgRiIDgzghv+cIgAiSA58wgIqDMICKAQvICjs9xgAB43IQo +HwAvcBNhz3GAAHgJIJFDhTcLQQDHcIAAfNVlgCiCUyMPAFMhDQAfD0ETA4iB4MQjgQ8ABgAAxCGB +DwAGAADMI0GAA/IA2QLwAdkJgs9zgACkCiymEQheAYbpGIqD4ALYA/ID2ACjANnPcIAAqArSDCAA +IKCC8YDngPPPcYAAqD0egQHgHqF48eoJoAAB2ACFxBAABiW4hg5v9cC4Tg1v9RTYqg/v+gTYHg8A +APoMz/lk8QohwA/rcs9wAAB5J/3bSiSAAHUCb/S4c/HAHgnP8s9wgACoCgCAgOCV9DILr/QB3gLY +Xgqv98lxz3CAAEwJAIDPd4AAnCgmgJ4RAAamuJ4ZGAAjh0iBNJFTIgAAGgxv/8lzdgwgAADdAtip +cXIMb/MC2iKHwhEABqG4whkYAACHxBAABiW4wLjmDW/1qXHPcKAAsB/ZoM9wgAAQJwiAIIDPcIAA +bAoioNoMYAMC2L4NIAHJcM9wgADoLgSAIQieAM9wgAAEOgCAiug+Dy/5iiDMDg0IUQBiCU//DfAA +2Z65z3CgAPxEIaDgeKGgkgugAADYogrP/UOHz3GAAKQKCYIXCF4Bz3CAAGwKDICF6BiKg+AH2Bfy +z3CAAGwKQojPcIAAjNWEKh8AMCBADgjoz3CAAGwKAYCGIDmPBPLAoQTwCNgAoc9wgACoCqCgUQDv +8gDYCiHAD+tyz3AAAIMniiNNBkokgAAhAW/0uHPxwOHFz3GAAGwKBBEEAM91gACoCoh0hCQGkAry +AdnPcIAApAogoADYAKVE8ACFsuiIdAKJhCSGkIQoHwAAIYB/gAB81Q3yEBAFAAohwA/rcs9wAACN +J8UAb/SKIw8AOgiv9wSACHHPcIAAmEJGDIABz3GAAFA6DIEB4AyhTgtv9RTYrg3v+gTYA9gApQHY +EvAlCNEAz3KAAFA6DYIB4A2iz3CAAKQKAdpAoADYAKUHoZEHj/IKIcAP63LPcAAAhSeKI88GSiSA +AFEAb/S4c+B48cDWDAAAGgxv9RTYbg3v+gTYAdnPcIAApAogoADZz3CAAKgKIKDRwOB+4HjPcIAA +nCgDgA2QhiB/Ds9ygABIFwkIkQEgkid4gLgAss9xgAB81QWxz3GAADjd4H8HseB48cCWDo/yz3aA +AGwKIo7PcIAAiNVCIJAChCkfADAgQA4KCG/2KYYIdwGGz3WAAKgKhiB5jwv0ANiqDC/5jLgH6AyG +gODMJ2GQGPQAhYHgcAiB9AyGgODMJ2GQCPTPcYAAUDoAgQHgAKEG2c9wgACkCiCgANgApZ/wAo4j +joQoHwAAIYB/gADI2zDg8CBAAADfWwgeAAiGKg8v9iKGjCAQgEoAKQAghYHhFAiB9AOGz3OAAFA6 +6KMS6CSGANoA3w8nTxAGIMCDLy8BEAOmTieBFwHi9vUkpkijBdnPcIAApAogoATYAKUA2GXwIIXb +CZUBMyZBcIAAgEZAJwByNHgAeAKOhCgfADIgQC5RIECA5ArBAgKOI46EKB8AACGAf4AAyNsw4PAg +QADPcoAApAoF2REIHgCAuAOmANgEpiClO/DPc6AAsB8B2Bmjz3OAABAn6INgh2KmYIcgogDZaqYg +pSnwA4aT6AXZz3CAAKQKIKDPcaAAsB/gpQHYGaHPcYAAECcogSCBKqYV8BEIHwAvKAEATiCBBySm +Wgmv+wSGz3CAAJBDAd6GDGAAwKXJcAPwAdhJBY/yz3GAAFA6B4EB4AehBdiQ8QohwA/rck/YB7iK +I0kKSiSAABEGL/S4c+B4z3CgAEwuC4DTuDEB4AIG2fHA4cXPdaAAOC5Hhc9wgABMOgDZQKAnpfIO +YAMg2AeFirgHpQvIBCCAD////wMLGhgwC8iPuAsaGDALyJC4CxoYMOEEj/LgePHAqg/P/89wgABM +OiCAz3CgADguJ6CqDo/90cDgfuB48cA+DI/yBgsv+QHdgODPdoAAbAoBhsB9hiB5D0IgAIDKIGIA +CLgFfQDYYgov+Yy4gOAB2MB4ELgFIH6DIvILhisIUQACjiOOhCgfAAAhgH+AAMjbNXgsgIC5LKDP +cIAAUDqA2SmgANgLpgbZz3CAAKQKIKDPcYAAqAoA2AChv/BijkOOhCsfAC9wACCND4AAyNtVfSyF +UyEEgCL064ZBD1EQTyQDAFIjAwB7e1V7gLnHc4AAhNwspTTjEGPPcYAAUDqA3amhCrgA2Qimz3Cg +ACwgA4ArpgKmBNnK8c91gAB81YQrHwBAJQATMCBADuYML/YphkAlkBEb6AyGmegohs9wAAABFAgh +AACZIAoAxgwv9iKGBujCDEAAig2P/6fxz3GAAFA6AIEB4AChn/HPd4AAqAoAhxHoqwgQAQohwA/r +cs9wAACCJ4ojSw5KJIAAQQQv9LhzCIZ6DC/2IoYL6AXZz3CAAKQKIKAE2ACnANhF8AKOhCgfAC9w +GWUjkR1lKOkjjsdwgADI2zDg8CBAAEEIHgAClQq4Ogwv9iqGIejPcoAAuDsZgjiCAnkEgkWCQng4 +YCKOhCkfADQgQS4VCQQAz3GAAFA6AYEB4AGhE/AF2c9wgACkCiCgBNgApwHYDfAIhoILL/Yihgoh +AIASAA8A5gtAAK4Mj/+pAo/yz3OAAHxCBoMDgECAaHAeD2ABWWEyDi/1FNjj8eB48cAqCo/yz3aA +AKgKAIaB4DgMQfQA3c9wgACkCqCgz3CAAJhCeg5gAaCmz3CAAHxCbg5AAc9wgABvCqCoz3CAAHAK +oKDPcIAAiAqgoM9wgABQOqmgAtipcXYNL/MIcjkCj/LgeOB+4HjgfuB4FLgleM9xoAA4LgahBoEB +CN4H4H4A289xoADAL6UZ2IAP2gi6oxEAhkR4jCAQgPzzFBnYgKMRAIYLIICA/PXgfpTgyiIFAIX3 +CHKAIsIEz3GgAGgs8CGBAADbz3KgAMQsZ6Joogy4nbifuCV4BqLgfvHATgmP8gh2ng/v/yh1yXCC +D+//qXGlAY/y4HjhxTDbAN3PcKAAyBxpoAPaz3GgAMwXIRmYgE6hp6BqoOB/wcXxwAoJr/IA2c9w +oAAMJFiAz3WAAIDTrXBBKoYHhiD3D5gVgxApuHZ5wHHHcYEAsBwVeQARhADPcIAAKB4ggEAszgDV +ftBh2WFEII+AUyCOAAQigA8AIAAAzCAigAb0gOfMICGAANgD9AHYz3egAMQnQCsFBoYj/Q9SI8MB +xQwzBEW7gObMICKAXPLPcIAA7FrwIIcDQC6GAwUmxgEFJYABBXtBH9iQYw6REB+FENqauB+lCNhP +HQIQz3CgAMgcSaAHgc9yoADwFwaiBoEGogWBBqIEgQaiANgKoooVABFouBB4ih0EEACVhiD/jAP0 +AdgdohoLQAOt6M9wgADULyCAANgCsSXwThWAEKPoihUAEUylZLgQeIodBBAE2U8dQhAZDtEQKxcB +lmS4EHiKHQQQDNgtpU8dAhBGCO/4iHAJ8AUjQwFBH9iQH4WzuB+lJQCP8uB4ENrPcaAAyBxJoQHb +z3GgAPAXaqGkEAIATQreAgLaXaHPc4AACPBEg0ahQ4NGoUKDRqFBg0ahcBAAARzgUyDAgAT0QCMA +CATwQCMADECAU6FMaECCU6H4EAKCU6H8EACAE6EP8FyQhiL/jAP0faFIgEahR4BGoUaARqEFgAah +4H7hxS+Az3OgAPAXz3KgAPwXKKNAEAEBKrIxgCijSBABASqyM4Aoo1AQAQEqsjyQhiHzD4whDIAH +9DaAKKNcEAEBKrJwEAEBvJAI4aiyvZCoslQQDQGosmAQDQGosrmAp6O6gKeju4Cno3IQAAE4YBB4 +CLLPcKAA9AcnoALZz3CgAMgcJ6Dgf8HF8cB+Co/4Vg6P+NHA4H7geOB+4HjxwJoOT/LPdYAAgNMX +hc92gQBQHQsIEAZYFYAQBOgahVuFBPAchV2Fz3GAAMw5IIETCR8AMoUEIYEPAAAAECV4JXrPcf7/ +/z8keAGmAN/ipkR5LaYO2OIN7/gOpgfoz3GAANQrcg9gAAHYz3GAALAoZg9gAADYF4UPCBEFAdgB +rjEeAhAE8OGuMR7CE3UGT/KhwfHA+g1P8jpxCHZId6YNb/oA3YHgyiBCIwv0z3CAAMgmAJCB4AHY +wHhAKBADyXCGIPwAjCAChSP0z3CAAIDTmBCAAOe4yiAiAAr0ArgWeM9xgQDIFABhLbjAuM9xgADo +CSCBUSGAgM9xgAD40xR5BPIg2q2RCvCY2quRBvDPcIAAvNOzkA7aAZdAJQEVEQkDAKJ4SCAAABB4 +A/AA2FpwANgqcalzMg+gA5hwCiEAoAT0Hg0AAzpwTCEAoADYSPQFIIAjDXEAsQ1xABmEBCOHDXAg +oCiXDXAgsIwmApUV8owmA5Ed8owmA5Uk8gohwA/rchPYjLjPcwAAlAqKJIMPWQbv87hzz3CAAIDT +tBABAA+BAeAPocYJIADpcBLwz3CAAIDTtBABAA6BAeAOoQrwz3CAAIDTtBABAA2BAeANoc9xoAD0 +BwDYBKEB2Bpwz3GgAMgf+BECAEJ1AiWAEEggAABfgRB4PQiEAEOHz3CAAPCjQqCg2A+hANgfoc9w +gACA0xyQYrhCcB+hAtgVGRiADQkQIFEgQMYg2APygNgOoYwmA5UG9M9wgACA0xyQCfCMJgORCPTP +cIAA+NMPkFIOb/kA2eIKz/4MzIYg+Y8S9IwmA5HKICEAzyChAwjyTCIAoADYzyAiA8ogIQEMGhww +CnAI3GcET/LxwBIMT/KhwQh3sgtv+gDdFQhRAM9wgADIJgCQAd2B4MB9DL3PcIEAPB4EgM9ygABg +twQggA8AAAAQRSBBA0DBIMDDuBx49CIDAM9woAAsIA+AcLsVCOQAAN7weHB7EgngAxTaCQgeBslw +OPAD2M9xoAD0BwWhhSUDGQ1woLANcMCwiiL/Dw1wQKDPcgAA//8NcECwA8jPc4EAyBTPcoAAnCgQ +iAK4FngAYy24wLjwIgAAoIANcKCgA8gQiAK4FngAYy24wLjwIgAAQpANcECwxKGaCgADAdihA2/y +ocDgePHALgtP8s9ygAA8uCCKEunBgqKCz3GAAOgJAhIQAeCBz3KAAKg9K4I0vwHhK6Iw8M9yoADE +JxESAYYA3/UJnoFkEgOGZBrYgwLZExpYgC8pwQBOIYIHE+vPcYAAfJlWecCBoYHPcYAA/Jn0IZAA +z3GAABya8CGPAArwz3KAAKg9KoLpdel2GncB4SqiQYANcUChJJANcCCwz3GAADjUAIEG6EKBDXBA +oADYAKHPcIAAnCgDgAiA67jKIIIDyiFCA8oiwgOkCOIDyiMCBFMgwCDPcYAA6AkggRS/DLjleBcJ +ngCCuA1xAKENcMCgDXCgoB3wDXEAoUokAHSoIAADRCaBEA+5UyYAECV4DXEAoSK+SiQAdKggwAJE +JYEQD7lTJQAQJXgNcQChIr1pAk/y4HjxwAYKT/IIdih1KHBIcV4IIABocoHgyiCBAxAIIQDKIUED +UQJP8uB4IrkG8OxyYKIE4GG5+Qm1gGCAz3CgANQLbaAD2c9woABEHTWg4H7geEEpgYAJ8i8kSXCo +IMABBBACBOxxQKHgfvHAnglP8qHBCHVIds9woACsLxmABCCAD3AAAADXcCAAAAAB2MB4LyYH8ADa +yiCBAC3yC8wAHEQwTyDBAwIcRDAB4BB4BCCADwAA/7+PuAsaHDDPcKAA1As4gEIhAQiA4cohjABA +JQASEHGQCQUDB+UEJY0fAAD8/8V9nb2fvexwoKAAwexwIKAB2IEBb/KhwPHA4cWuCG/6AN2B4Mog +QgMJ9M9wgADIJgCQgeAB2MB4DLiFIAMBA9rPcaAA9AdFoQ1yALIDyADbXZANcECwA8hRgA1wQKAD +yEgQAgENcECwZKExAU/y4HjxwLYIT/LPdYAAEJLgFQAQAN6A4ND3RC4+FwAhQHMc2cXaHtuODu// +GLvgFQAQAebnDgSQANjtAG/y4B0AEOB48cB2CE/yIYAKJgCQEInDuMohwQ/KIsEHyiChBsojgQ8A +AKoAzyAhAznygOHKIcEPyiLBB8og4QbKI4EPAACrAM8gIQMr8gK4z3GBAMgUFngAYc9xgACACS24 +wLgMqSOGIJGGIfwAjCECgAz0z3GAAJwo8CEBAL8RAAaBuL8ZGAABhqKABe0BhQPoAIWM6AohwA/r +chzYjLi520okQAAlAe/zuHMLCJ9Bmg4AAAfoAIWA2SigAYVAeB3wAYYgkBTIEHHKIc0PyiLNBx3Y +yiONDwAAxgDPIC0DIfcaCq/4yXCiDCAAAYXPcIAAgAk+DeACDIjxBw/y4HjxwHoPL/IA2gh3z3CA +AG8KIIijwc9wgABuCgCIARzCM4QoHwAAIYB/gABI3C7g9CBAAGDBAxwCMAHYAhyCMM92oADIHxOm +z3GAABAnDIEAgELACIEAgEHAz3CAABwJAICA4MogAQfKISEDyiKBDwAAhADKI6EHBA3h/8ArIQbP +c4AApArPdYAAUDoLEgE3XpWE2GCDVg3gAph3HgkAA6QWABATpT0HL/KjwOB4CNnscCCgA9kA2s9w +oAAUBCWgAcjscQChz3CgANQLTaDgfuB48cDhxaXBCHIA289woAAsILCAQMEG2EHAQsNDw0TDAdge +2ZhzuHMAJYcfAAAAfa4JoADYc+0GL/KlwOB48cDhxaTBz3CAAG4KIIjPcIAAbwpgiIQpHwAAIYF/ +gABI3DDh9CHBAADaz3WAAFA6YMHPcYAAkNUwIUAOwLgBHAIwCYVJpQIcAjAIhUilAdkDHAIwz3Cg +ALAfOaDPcYAAECcMgQCAQsAIgQCAQcDPcIAAuDs9gAmAOGBDwM9wgAAcCQCAgODKIAEHyiEhBMoi +gQ8AAIMAyiOhB9QL4f/AKyEGABSEMAsSATfPc4AApApelYPYKgzgAmCDLQYv8qTA8cClwc9wgABu +CiCIz3CAAG8KYIiEKR8AACGBf4AASNww4fQhwQAA2s9zgAAQJ2PBz3GAAJDVMCFADgHZwLgNHAIw +z3CgALAfOaAMgwCAQcAIgwCAQMAEgwCADhyCMA8cgjBCwM9wgAAcCQCARMGA4MogAQfKISEFyiKB +DwAAggDKI6EHKAvh/8ArIQbPcoAAUDoMFIQwCxIBN89zgACkCl6Sgth6C+ACYIOlwNHA4H4IyIe4 +CBoYMAnIm7gJGhgwCsgKGhgwC8iHuAsaGDAMyAwaGDDgfuB4z3GAAFiTAIGBuOB/AKHgeM9xgABY +k+B/A7HgeOHFz3KgAKwvANmq6M9woAC0DzygGILBCJ8GFYK5CB4AGoK1CB4Az3OAAAgnQIMBag8I +UQAB3c9woADIHLGgz3WAAEdoz3CgAOwnpqBAo4kKEQDPcKAAyBwxoD7wGIJvCJ8GFYJnCB4AGoJj +CB4Az3OAAAgnQIMBag8IUQAB3c9woADIHLGgz3WAAEZoz3CgAOwnpqBAo+B44HjgeOB44HjgeOB4 +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeIXqz3CgAMgcMaAB2c9woAC0Dzyg4H/Bxc9ygACU +OxV64H8govHAmHAKIcAP63IKJcAHz3AAAKIZEQWv81bb4HjPcoAAcDsVeuB/IKLxwJhwCiHAD+ty +CiXAB89wAACjGekEr/Ne2+B4z3KAAKg7FXrgfyCi8cCYcAohwA/rcgolwAfPcAAApBnBBK/zZtvg +ePHApBABAA0JXwb2DE/4B/Ag2c9woADIHCmgA9nPcKAAEBQloNHA4H7hxQO4NXjPcYAAuEUCYUok +AHQA2aggwAIWIkAAoYBggCnYErgB4XV4oKDgf8HF4HjPcIAATAkAgKHBJoCeEQAGhrieGRgA4H+h +wOB44H7geM9xgACACeB/BKHgePHA4cXPcoAAnCgjgjiJHwkRAQohwA/rcoogjA6KIwYCSiQAABEE +r/O4cyCCxBEBBnMJXgHPcoAAgEEggkIhAYDKIWIAr+mP6AohwA/rcoogzA6KI4YDSiQAAN0Dr/MK +JQABJoIjgWG4oIHPcYAAECckgSCB1bk9Zc9xgQAwHSWBBSk+ACd1SHBGD+AAQiWBEs9wgACcQQAl +gR8AAIgTMg/AAL0CD/LgePHAQgoP8kAQAQHPc4AA0AlCEAIBJLOQ4UWzzCIshMohyQ/KIskHyiCJ +DwAABwLKIykPyiRpAFgDqfPKJSkAHwlyAADen3HPdYAAPJmoIMAByWDcZQHmz34grCMKcgAA3Z9y +z3GAAFyZqCBAAkAgAgiqYrxhAeWvfUCsMYAgoxKALQIv8gGj4HjgfwDY4H8A2PHAsgkP8s91gADw +CcyNDY3CvsK4Fn7PfloI7/wN2Aa4gbgQvsV4z3GgAOwnBqEEhc9xpQDoDwahBYUHoeEBD/LxwG4J +D/LPdqUA6A8mhqeGz3CAAPAJAN8koKWgFgjv/A3YBriBuM9xoADsJwah5qZFJc0fp6ahAQ/y4HjP +cYAAyCvPcIAAeAkAkEeJKwoBAM9wgAB6CQCQQYkfCgEAz3CAAHwJAIgmiQ8JAQDPcIAAlC8AgALw +ANjgfuB44cXhxgDdMwnQBwsJ0wcLCRMAANgT8BkJ8wcf3k4h/AfgeKgggAEPJY0TYb4JCE4ApXgD +8KZ4AKIB2MHG4H/BxfHAsggv8ijYag7P+M91gAC0L0CFCHYEIIQPAADw/wDYYHpBLAEBQIUB2EQm +BBNgekEsgQBAhQLYYHpTJkEQNg7v+ADYQIUId0EoAQID2GB6wLlAhUEvQRIE2GB6wLnPcQAAOLjP +cIAAsC8goM9wAQBYvakAL/IApfHA7gxP/JIIT/zPcQAAYLjPcIAAuC8SC+/7IKDPcQEAgL3PcIAA +vC8goNHA4H7gePHADggv8lDYwg3P+M91gADEL0CFCHYA2GB6UyZBEECFAdjJcWB6hiH9D89xAACE +uM9wgADALyCgz3ABAKi9PQAv8gCl8cDhxe4L7/kH2PYLL/wIda4Pz/9WDk/85gjv+alwIQAP8uB4 +4H7geOB+4HgFAAAA8cCWD+/xCHMIdoYj/gNEuwh3hifxH0e/RCCBAzx5z3WAAHDwLa0EIIQPAAAA +DEIsgAITrQQmhB8AAAAwQiwAAxStBCaEHwAAAEBTIb6AQiyAA7EdAhAO9AohwA/rctXYBbha24ok +ww99AK/zSiUAAM9wgABM0wSIgeDMICKAzCAigQb0U2klek+tTq2A48wgIoEF8lNrZXpOrYDnzCAi +gQTyE2/leA+tE2kleBCtDo0MrXIKYAEA2EUH7/HfteB44H7geOB+4HjgfuB44H7gePHAxg7v8QDb +ocEEuM9ygQBQHRR4HWIaYgGCbyZDEMiliiYEEs9y/v//P8mlBHqA4UDCyiXBAAvyCIEEIIAPAAAA +MEIgBYDKJWIATQ0QAM9wgAAU0gAQBADIgQQkhg8ABwAABCaOHwAAADAsvmG+QS4GBkAmgBMPIgIA +QMKFDo8DCiHAD+tyPtiMuIojig6JB2/zuHbPcIAATNMHiIHgzyKhAy/yz3OAABTSz3aAAIDTmhaB +EAOLCyEAgCHyTBaBEADbUyFOAEQhDwMPI4MDQr8A3g8mzhOGIf8DBCYOkADfRLkEew8nTxDkeMom +ARCA48ojgQMOu2V6A/ABgwV6QMLPcIAAFNIggItyhiH+AyS5QCmDAyCCBCGODwEAAMALJsCQFvLX +dgAAAEDMJoKfAAAAgMwmgp8BAAAABPQBgAPwAoCuua+5sLkleACiABQEMAQkgY8BAADACvQKIcAP +63JG2Iy4sQZv84ojiwkIhS65QCkCBgQdABFFeAiliiAFBgmlz3CAANTTBIiA4IogBQ7KIIEPAADY +AQmlqXAA2gHe6gkv/clzwK2FBe/xocDgeAolAIDxwBHyJw2QACkN0AAKIcAP63KKIM0OiiMEBUkG +b/OKJIMPtgsAANHA4H5mCwAA/fEaCwAA+fHgePHA1gzP8Qh1z3CAAJw2CYCJ6M9wgAAsNimADODw +IE4AAvAB3oog/w8Apc9xgACcKACBxBAABmkIXwGmCY/6AKWqCC/5qXCA4Mol4hGi9DYMT/iG6ACF +jCD/jw30z3CAALgvIIBgeQHYgeAF3colIhGQ8M9xgAAwHiGRz3OAANwJQIM84TpiIYNk4hThWWEw +cAHdwiVOE7N9wb188AOBGIgpCBEBAgmP+gClz3GAADAeIZHPc4AA3AlAgzzhOmIhg2TiFOFZYeXx +z3CAAIBBAIDPd4AAgJZCIBCAFgiv+sogYiAApQGHDwiFA44Kr/fJcQh2z3CAABAnBIDPcYEAMB0A +gCWBSW7VuAUpvgAncGq4IIVIIAAAMHDKIEYARPcApUogQCDPcYAAMB5hkc9xgADcCUCBIYE84wHd +emJk4hThOmJQcMIlThOzfVMlTZAi8kEIUSDPcIAAgEH6D4AAz3CAAJxB7g+AAM9wgABEQuYPgADP +cIAAYELaD4AAIYcRCaUDyXAWCCAAAdkE8GoIz/+pA+/xqXDgePHAPgvv8bhxgODKIcEPyiLBB8og +gQ8AAEsDyiPhDsokIQBwBGHzyiUBAc93gADUQSaHI4Eggc9ygAAQJ0SCQILPdoEAMB1TIk0FNroA +IhAAPWVFhmG4BSo+ACd1AiVAEIwgF4dK989wgACAliGABSm+ACd1ACBQICENEABhDVAAmw2QAAoh +wA/rcoogjQ6Q2wEEb/OKJIMPRgpP+BHoz3CAAOQrLJDPcIAAnCgekBMJAAACJYEfAAAADOlwBPDp +cEIlARVmD4AAz3CAAPBBACWBHwAAiBNWD4AAS/ACCk/4z3GAAERCEujPcIAA5CtMkM9wgACcKB6Q +EQoAAChwAiWBHwAAAAwF8ChwQiWBFx4PgADPcIAAYELb8cYJT/jPcYAADEIR6M9wgADkK0yQz3CA +AJwoHpATCgAAKHACJYEfAAAADATwKHBCJQEV3g6AAM9wgAAoQgAlgR8AAIgTzg6AAApwybjPcYAA +gJYDoQaGgbgxAu/xBqbxwOHFz3WAALhBOg6gAKlwz3CAAHg2IIDPcIAAfDYAgAkhAQDPcIAACNEI +gAkhAgDPcKAALCAwgKlweg6gAFlhAQLP8fHAz3CAAICWAYAPCFEAz3CAACw2B4DPcYAADEIggUIh +AYDKIWIAkOnPcYAAeNEsgYrpz3GAAGDR6g9v9yOBCg7v/wLZ0cDgfvHAQgnP8c9wgAAQJwSAoIDP +cIAAgEEAgEIgAIDKIGIANr2H6M9wgACcQY4NgADPcIAAYNEhiM9wgADUQc92gACAlorpIIBCIQGA +yiFiAATpIIat6WINgADPcIAA8EFaDYAAAYZ2D2/3CHEhhg94HQkFAAohwA/rcoogDQPX20okAAAN +Am/zuHPPcYAADEIggUIhAYDKIWIABukdZSOGyb0LDUAQWg3v/wDZBQHP8eB44cXhxqsKEABAIsMD +JLvDugLwANqVChUEMyaCcIAAtEZAJ41yVH0gfcCIARmSAwHgARCCBAEZkgABEIIEARmSAAEQggQB +GZIAARCCBAEZkgABEIIEARmSAAEQggQBGZIAARCCBAEZkgABEIIEARmSAAEQggQBGZIAARCCBAEZ +kgABEIIEARmSAAEQggQBGZIAARCCBAEZkgABEIIEARmSAAEQggQBGZIAQiNDgLP1wcbgf8HF4cXh +xiPqY2oiu8G6AvAA2jUKFQEzJoJwgACgRkAnjXJUfSB9wIAEGZADBOAEEAIEBBmQAAQQAgQEGZAA +BBACBAQZkABCI0OA4/XBxuB/wcXhxeHGqwoQAEAiwwMku8O6AvAA2pUKFQQzJoJwgACkRkAnjXJU +fSB9wJACGZQDAuACEAIFAhmUAAIQAgUCGZQAAhACBQIZlAACEAIFAhmUAAIQAgUCGZQAAhACBQIZ +lAACEAIFAhmUAAIQAgUCGZQAAhACBQIZlAACEAIFAhmUAAIQAgUCGZQAAhACBQIZlAACEAIFAhmU +AAIQAgUCGZQAAhACBQIZlABCI0OAs/XBxuB/wcXxwNoOr/FTIUIATiINAc9yoAAUBMmCANsOJoIf +AAAABlBxyiHGD8oixgfKIIYPAADGIsojhg8AAJsCyiRmAOgHJvPKJcYAgOHKJE1wyiLNAOggLQJO +YM9xoAA4BAHiyKkdDVAQEQ2QEB0N0RDPcKAAOARoqM9woAA4BGioz3CgADgEaKjBBo/x8cAuDo/x +unB6cfpymnMKIgAhCiBAIch1CiHAIQonQJPPcYEA1hTKJ2IQEm8WeAhhTCMAoAS4hiD+AwV/yiHM +D8oizAfKIIwPAADBIcojjA8AAO4AyiRsAEQHLPPKJcwEHQieQc9wgAA8oIDZKKAMwAPoQHiB8A4P +T/9/8M92gACsQwGGANmiD2/zONoAhhzZIKABhhjZILDPcYAAnCgVIVYDABYBIFOBDcHwqM93gADg +CigYQARFeaS5IaAA2TMYQgDpcSKgCiFAgzEYwgQyGMIENBjEBcohYgA6C2/3DOCF7c9xgAB4owTw +z3GAAJijI6bPcAAASBEAsRjYAqYNDVAgiiAFAgCxDMCF6M9wAQBgugGnABYAILkQAAYtCB4AQYYa +2ACyAqYAkYe4ALEA2AuxAYKtuAGiEQwQIM9wgAAwOASAMxoCACkKECAhhgGBmLgBoQOBn7gDoc9x +gACwCQAWACAAGQQEQIABgEGhAqFuDG//yXABBY/x4HjxwLIMj/G6cHpx+nIKIgAhCiFAIch1CiTA +IQogQIPPcoEA1hTKIGIACHECuBZ4CGJMIwCgBLiGIP4DBSBQAMohzA/KIswHyiCMDwAAvyHKI4wP +AACWAMokbADIBSzzyiXMBAzAjOgKIcAP63KH2Aa4l9tKJAAArQUv87hzFQieQc9wgAA8oIDZKKAM +wEB4Z/DPdoAArEMBhgDf6XEODm/zONoAhhzZIKABhhDZILDPcYAAnCgVIVYDABYBIDOBMxjCA893 +gADoChAYAgSkuY25mbkhoOlxIqAKIUCDKBgABTEYwgQyGMIENBjEBcohYgCmCW/3DOCG7c9xgAB4 +owXwz3GAAJijI6ak2ACxENgCpgsNUSCk2Iy4ALHPcIAAnCgZkI64j7gBsQzAAacpChAgIYYBgZi4 +AaEDgZ+4A6HPcYAAsAkAFgAgABlEBECAAYBBoQKhDgtv/8lwoQOP8eB48cDhxc91gADIPgCNjCDD +jw/0z3KAAGRBBoIDgCCAx3EPAACgNgigAEhw/tgArb0Dj/HgePHAQguv8QDYz3WBAIgXSiQAdIDe +qCAABQhxAeBPIMIBFiVDEEeriiIIAAK5NnnHcYEAyBRAoQDaQrHGqcDYfx0CEM91gAAgCsCtz3CB +AEgUgNnGDG/zKHLBrc9wgAAALNmoz3CAAPAoRQOv8cWo4HjxwM4Kj/GhwQh3xg4v9BjYz3aAALg7 +AYar6M9woADUCxiAAN1CIAAIgODKIEwDjCAIhUj3wRYAFgHgwR4YEBvwndgAHAQwC8zpcQIcBDAB +4BB4BCCADwAA/7+PuAsaHDAAwB7aKgggABi6oaYD8GG4AaYaCAAAANg+DG/5QCYBErUCr/GhwOB4 +4H7gePHAOgqP8Qh3GnE6cs92gACcKAOGz3WAALg7FJAQuPIIL/gCpYDgyiAiIM9wgAAcCQCAi+iF +IQgkTyFAJ5+47HEAoexw4KADhgiADQgeAAKFgbgCpc9wgAB8CQCIhOgChYO4AqXPcKAALCAQgM9z +gABAPXIdGBBKJMBwANioIMAFz3GAAFQJIImA4QzayiIhAEQovgPPcYEA4CIncjMhggBAIwEDGWEB +4ECpQCUOEuoOL/TJcA8IECAihQDYgLkipQPwiiD/D89xgAAcCSCBZxUPFmgVBBaU6QDbCPDsciCi +BHkEHlAQAeOMI4KAIIa4989yoADUCy2iJHgApmcd2BNoHRgRANiVAa/x3B0AEOB4ZQbv/wDY4Hjx +wCoJr/HYcDoIIAAA3cloKw4SEPhwqXcyJoADFQgSDBEIkw6SDs/0Mm84eAV9AedCJ0cA5Q91gGG+ +WQGv8alwCHID8AHgIIj+6eB/QnjgePHA3giP8c91oAD8RB2FOYXCDyACAN4A2J64AaXgeMGlxaUp +AY/x4HjPcaAAyDsOgYi4DqFpIEAA/vHgePHAz3CAAJwoA4AYiB0IEQEKIcAP63KKIAwOiiOFCkok +AADNAS/zuHN2DC/0A9jPcIAACNEAEAQAGQwRAAohwA/rcoogTA6KIwUMpQEv87hzz3CAAMgmAJCB +4AHYwHgMuCkIgQ8AAAAQz3CgACwgEIDPcYAAnDYCoQLYA6HPcQEA0DF2CW//AdjRwOB+8cAOCI/x +z3WAAHjRL4VKIAAggOHKIcEPyiLBB8oggQ8AAL4hyiOBDwAASADKJAEEMAEh88olwQDPcIAAyiZA +iM9wgAA8oGB5SKA8HQAUxgsv9ALYHQCP8fHAvg9P8ZIMYAAIdc9xoADIH0WFDOhuEQ4GAoBkhcR6 +RXtuGdgAIoUAoQvwbhEABkR4bhkYABzYGLgVGRiA7QdP8eB4gOAB2cB5z3CAAMQ+4H8goPHAZg9P +8c9wgACwLyCAosFgeQTYgOCqAgEAz3GAAAgnAIEB4AChFwhRAAHZz3CgAMgcMaDODSACKHBaC2/5 +BdjPdoAAZDkOps9xgAAIJwCBAeAAoRUIUQAB2c9woADIHDGgog0gAihwA9jyDW/yyXEE2OoNb/Ii +bgXY4g1v8iRuC9jaDW/yJm4P2NINb/JAJgESNtjGDW/yQCaBEjfYvg1v8kAmARM42LINb/JAJoET +z3enABRICIfPcacAmEcEpg2Hz3KrAKD/BaYOh891oADsJwamHIEHpheHCKYWhwmmGIILphmCDKYa +gg2mz3AFAMYDBqXG2JC4BqXPcCwAAgEGpc9wWgBCAQaliiCLAAalz3BAAIcNBqXPcNEAwg0Gpc9w +wAAHDgalz3CAAAgnAIDPcoAACCdCIECAAKIG9M9yoADIHADYEaIB2AinANgNpw6nz3BQAP8AHKEB +2BenANgWp/zZz3CrAKD/OKBz2TmgGoDPcasAoP+BuBqhz3AqAAIOBqWLcBoMIACBwQDBz3CAAASV +NaYyoAHBL6DPcBoAAg4GpYtw+gsgAIHBAMHPcIAABJU2pjOgAcEwoM9wJgACDgali3DaCyAAgcEA +wc9wgAAElTSgN6YBwTGgz3CAAAgnAIAB4M9xgAAIJwChFQhRAM9xoADIHAHYEaEGDAACAZYQuIUg +hAAGpQKWELiFIIUABqUDlhC4hSCLAAalBJYQuIUgjwAGpQWWELgFIIAPAACCDQalBpYQuAUggA8A +AMINBqUHlhC4BSCADwAAAg4Gpc9wgAAIJwCAz3GAAAgnQiBAgAChB/TPcaAAyBwA2BGhBIYrhgin +BYYNpwaGDqcIhhenCYYWp89wqwCg/zigLIY5oC2GOqAGDi/5DobPcIAACCfPcYAACCcAgEIgQIAA +oQf0z3GgAMgcANgRoREFb/GiwPHApgxP8X4IAADPdoAA8EOaCy/3AIYIdQCGGQ0AECIIb/upcC4I +r/ugpo4Ib/QR2L4NT/bPcKAALCAwgM9wgADICdEEb/EgoPHAug/v/6HBz3CAAMw+AIAE2WLaHttA +wItwQgov/xi7ocDRwOB+4HjxwDIIL/QW2ADY0cDgfuB48cAiDG/xB9hGCE/5CHfPcKAAtA/cgFYP +L/8A2OIMj/vPdYAAzD5OCO/7AKVAhc9xgADcQwChz3GAACw9SqE+DW/8C6EmDy//z3gSDS/56XDP +cIAA3CYAiDcIUQBAhYogRATPdYAAzCYjhRpiOGAQcgHZwiFFAATYBemGDY/0AIUE8G4Nj/QChTYP +4AEDpf0DT/HgePHAz3CAAMQ+AICc6NIMb/gW2Jjoz3CAALAvIIBgeQTYEOjPcIAAnC9ggM9xAQD8 +1AvYYHsE2n4IL/QW2NHA4H7PcYAAnCgAgcQQAAYPCF8BAYHEEAAGFQheAUoPL/QT2EIPL/QR2Ozx +6vHgePHAz3CAAFgiAIDPcYAAyAkbeMYM7/QggQjoAdnPcIAA3CZ2D+//IKjRwOB+8cD2Ck/xCHd9 +2A24z3GBADAdxYF+DG/xyXGMIAKAz3GAAFwiAN2H9x14jCACgAHlfPcAKEIDBSq+A89ygABYIha4 +AKHPcYAAyD4AGkAOhO//2ACpAImMIMOPLA+B/wEDT/HgePHAfgpP8TpwenFId2h2CiQAIQDaz3Gr +AKD/WaEH2BqhWKEOCSACAdgZ2c9wpwCYRzqgtg7v+x7Yz3KnABRIHYK+gmwSEABwEhIAAKegpve4 +xSCCDwD/AADTIOEF973FJYIfAP8AANMl4RWaDW/2iiEQAAh2qXCODW/2iiEQAAh1QCgAIn4Nb/aK +IQgACHdAKgAicg1v9oohCADReRnhLHkvcbF6GeJMei9yABmAIw8PYhAAG0AjANgE8P8Ig4AB2BEC +b/EAHAIg8cDOCU/xCHUodl4IIAIK2AHYz3GnAJhHGqFOCCACCtjPcKYAnD9kEAQAUSQAgMohwQ/K +IsEHyiCBDwAAvxnKI4EPAAC4ANQC4fLKJSEAz3CnABRILIAdgACm97jFIIIPAP8AANMg4QXRAW/x +AKXgePHAWg3v8wbYSgxP/M9wgACcKAOAGIgfCBEBCiHAD+tyiiAMD4ojBgtKJAAAfQLv8rhzz3GA +ACw2CYELCBUBAeAJoc9xgQAwHQaBRiBAAQahz3CAALwJIIAVCZEAiiBGDy4J7/kE2oYK7/kE2NHA +4H7xwM9xgACcNgmBAeAJoc9xgQAwHQaBgrgGoc9wgABM0wOIgOAED6H+yiChAOIN7/MG2NHA4H7g +eM9wgAA1HwCIGwhRAM9xoACsLxmB8LgZgc8gogPPIKECGaHgfqEEL/QR2OB48cDPcIAAnCgDgBgQ +hAAdDBEBCiHAD+tyiiBMD4ojRwq1Ae/ySiUAAM9woAAsIDCAz3CAAMA/Og0gAJYhQQ/PcIAAeNEM +gBLoz3CAAMgmAJCB4AHYwHgMuBEIgQ8AAAAQygggAADYIPAWC0/8z3CAAFQfAICW6M9xgQAwHQaB +RiBAAQahz3CAALwJIIAVCZEAiiCIBCYI7/kE2n4J7/kE2NIID/rRwOB+8cDPcIAAREIAgEIgAIDK +IGIAiOjPcYAAnDYJgQHgCaHPcYEAMB0GgYK4BqHWDO/zBtjPcIAAeNEMgBjoz3CAABQzAoAS6M9w +gADIJgCQgeAB2MB4DLgVCIEPAAAAEKYIIAAA2NHA4H7PcIAATNMDiIXorg2v/gLY9vH28eB+4Hjx +wM9wgACcKAOAGIgdCBEBCiHAD+tyiiDMD4ojygVKJAAAjQDv8rhzz3CgACwgMIDPcIAAwD8SDCAA +liFBD89wgAC8CSCAFwmRAIogCghGD6/5BNqaCO/5BNgB2c9wgAAUMyKgz3GBADAdBoFGIEAB5glv +/Aah1g/P+dHA4H7gePHAz3CAAJwoA4AYiB0IEQEKIcAP63KKIA0PiiOKD0okAAANAO/yuHPPcYEA +MB0E2Aahz3CAABQzAdkioM9wgABM0wOIgODYDKH+yiChALYL7/MG2K4L7/MI2NHA4H7geM9wgADA +P/ECAADgePHAlgvv8xPYz3CAABAnBIAggM9wgAAEGyCg0cDgfuB48cDhxc9wgAD8owOAz3WBAGQk +EQheAATYDghv9gSlHPAD2ASlANgIrc9wgABcts4P7/LU2QCFBOhhuAClSg9P/gGFAeABpc9woAAs +IBCADg9v/gWldQYP8QhyANgdAS/3ENngeAhyAdgRAS/3INngeAhyAtgFAS/3QNngeAhxGQEv9wDY +CHERAS/3AdgIcQkBL/cC2FkAT/LxwM9wgACcKAOAGBCEAB0MEQEKIcAP63KKIIwPiiMJA+kGr/JK +JQAAz3CgACwgMIDPcIAAwD9uCiAAliFBD89xgQAwHQaBRiBAAQahz3CAALwJIIAVCZEAiiCJB5IN +r/kE2uoOr/kE2D4Oz/nRwOB+8cDPcYEAMB0GgYK4BqHPcIAATNMDiIDgcAuh/sogoQBOCu/zBtjR +wOB+4HjxwEIK7/MU2G4Nj/LRwOB+8cAyCu/zFNiGC2/5BNjRwOB+4HjxwP/Zz3CAAMg+ggmv/yCo +ygnP/9HA4H7xwOHFAN3PcIAAlC+goJYNb/apcIog/w/2D6/yqXE9BQ/x4HgNBU/38cC6DC/xSiRA +AMCBoIAB39F1wiQCAdF1oYFhgMInzhMB3rFzwH6xcwHbwiPOAEwkAIDMJiKQyiNiAAr0heuA5swn +IpAD8gLbAvAA2xTrIQtQADkLkQCggMCBAYAhgQIljZOgogMgQAABohDwANgAogGiDPCggcCAIYEB +gAIljZOgogMhAQAhopkEL/FocOB48cDhxSaAQIBCIgKAyiJiAIDiyiHCD8oiwgfKIIIPAAA2Ecoj +gg8AAHcAyiQiAEwFovLKJQIBYIEVC0AAQoCig0J9DQ1TEGCD9QtBgEGDAaNgoEGgAKJEgKaAQCUD +FhcKXgBGhQbqooJCgEJ9Bw1SEACjRICmgEAlAxcXCt4AR4UG6qKCQoBCfQcNUhAAo0GACwmBAN4L +r/8GgAkED/HgePHAigsP8Qh2AIBCIAGAyiFiAADYJukmhkGGAd8wciCGQYZBoSCiAKbPcK3eAgAB +pqaGwH8GhREOARCpcFYIIAAC2QalpoYHhQ8OARCpcEYIIAAI2QelBe96C6//BoYB2JEDD/EggBBx +yiEhAOB/KHDxwBoLD/EIdYoP7/8odgh3wqXiDu//qXBpAy/x6XDgeECAFQoAAGSCCyNAgAX0QIL3 +CgGAANrgf0hw4HjPcqAAyB/0EgAAvNsYuwQggA///wDw9BoAAAvIZXgLGhgwFRrYgM9zgAAQJwiD +ANkgoAyDIKAJgyCgDYMgoAqDIKAOgyCgC4MgoA+DIKDPcAAMDwCkGkAADqIP2Ay4EKLgfuB48cB+ +Cg/xz3WgANAb04URDp4Wz3CAAORCSgkAAA8O3hbPcIAABEM+CQAAEQ4eF89wgAAkQy4JAAAPDl4X +z3CAAERDIgkAABEO3hfPcIAAxEISCQAAvNgYuBOlkQIP8eB48cAaCi/xANsId892oADIH6QWABDP +dYAAECf4YKQeABAB2BOmKIUMhUCBAIAAIsKDQKEshQEgwAAAoQLYE6YphU2FAIFAggAgwIMAoQ2F +ASLCAECgBNgTpiqFDoVAgQCAACLCg0ChLoUBIMAAAKEI2BOmK4UPhUCBAIAAIsKDQKEvhQEgwAAA +oQSFAIAuCq/z6XEkhQChBYUAgCIKr/PpcSWFAKEGhQCAEgqv8+lxJoUAoQeFAIAGCq/z6XEnhQCh +D9iauA6mD9gMuBCmz3CAAMRCkgmP/891gADkQoYJr/+pcIIJr/9AJQAYegmv/1YlABJyCa//ViUA +E4kBD/HgePHAGgkP8Qh3IPAAhiGGIaAAoQDYAKbPcK3eAgABpqaGBoURDgEQqXD6De//AtkGpaaG +B4UPDgEQqXDqDe//CNkHpSOGYHnJcK4N7//pcAomAJAI8gOHIIAChiJ4rwhSgAIJr//pcB0BD/Hg +eA/YmrjPcaAAsB8VoQ/YDLgXoeB+8cCOCA/xz3KAAIDTP4I6cKrBANghCd4Cz3OAAJwoY4N0g0gS +gQDA3WR5hiH/DiK5On0E8BTdAtiKEgEBAnkSggThkg+v9QDamgpgAAIgTwMD2M9xoADIHxOhz3WA +ABAnCIUAgELADIUAgEPACYUAgETADYUAgEXABIXAgAWFABASAEARAAYA2R9nz3CAAGCgQIABgAAi +woMBIEAAQMJBwIt3HwlRIIYOj/KEwRpw6XAyC+//hsIIdwgQAiEL8ILB6XAiC+//hsIId89wgQAw +HUSQz3GBADAdZYEGwQS7FwtkAEAqgAIbCEUAAnn/CESABvCGwI4MYABIcQhxRsEtD5EQOgiv88lw +CHZKcC4Ir/MGwQbCWnAEwwfBBcAAIsKAASBAAETCFfCU7z4Ir/PJcAh2SnAyCK/zBsEEw1pwBsEF +wAfCAiNDgETDAyCAAEXAGQ9QEM9wgACcKAOAGIiE4MwnIZAA2AP0AdgvJgfwRPTJcMoPb/MD2Qh3 +SnC+D2/zA9kIdgDAAcFAIMCAQSEBAEHBBMFAwAXAQCHBgEEgAABEwUIJYABFwBUJESAEheCgCIUA +wSCgDIUBwSCgJQmRIASF4KAIhQDBIKAMhQHBIKAFhcCgCYUEwSCgDYUFwSCgFQlRIAWFwKAJhQDB +IKANhQHBIKD1Bu/wqsDgeOHF4cbPcIAAnCjDgM9xgACUus91gAAAglQVABbBoc9ygABUgwDbAqFA +IgAGA6FkoXSpCOYUhcehLBnCAAihQCKACAmhQCIACwqh0BUAEM2hRBnCAA6hQCKADQ+hViIAAhCh +wcbgf8HF8cAqDs/wGnBodWWKBIoIu2d4ALUHikaKCLhHeAG1QYkAiUohACIIukd4ArVDiQKJCLpH +eAO1BIkliQi5J3gA2QS1UyEPABQgziNBjlpxII4Iukd5J3hmCiAAEHgglUIhUSA4YCJvEHgUIEIg +ALUgikGKCLpHeSd4QgogABB4IZVEbzhgEHgUIIEgAbVAiSGJCLlHeSd4JgogABB4IpUG5zhgEHgU +IMEjArVAiSGJCLlHeSd4BgogABB4I5U4YBB4A7VBjiCOCLpHeSd47gkgABB4JJU4YBB4SnE4YBB4 +BLUB4WMJdaAveZ0Fz/DxwEoNz/ClwQh2AosodZhwZMAAiwASBgERHAIweXACEgcBBBIIARAUADHk +kgYSBQEAIMkDAJEvIUgSByBAApIJIAAQeAAgigEBlS8iiBIHIIACfgkgABB4ACDGAQKVLyaIAQcg +gAFqCSAAEHgAIAcCA5UvJ8gBByDAAVYJIAAQeAAlBQAElS8lSAEHIEABQgkgABB4H2cFlfB/53gy +CSAAEHgmlSFwEHgHeTx6D7klelB6ACKBAjB5ABxEMEeVJ3pceQ+6RXkweQAhggFQelx5AhyEMA+6 +RXkweQAhwgFQelx5BByEMA+6RXkweQAhQgFQelx5BhyEMA+6RXkweT9n8H/8eQgcxDMPv+V5MHk4 +YGlxxrmFuQi5BSHBAiC2EHgglQocBDAneBx4CLgFIAABAbYAwAGmAcACpgLAA6Z1BO/wpcDxwAIM +z/CiwUogACAB389wgADMCQCICyDAgyjyQCjNIM92gACUurR9uGa5ZgSAI4FODC//Bdq4ZgKAumYh +aCKiAuBBwLlmz3CAAJS6oGAhgb5mZIaLcn4N7/8Q4ADZACWAH4AAqLogqPt/739AIFAgLyAHJJsP +EZIA2c9wgADMCSCo5QPv8KLAD3tIuA94z3KAAABc9CIAAEAoAQJIuAV59CLAADB54H8neOB48cDP +coAAtEIggoDhyiHBD8oiwQfKIIEPAAA0EcojgQ8AAOMGyiQhAIAEYfLKJQEBAaIB2s9xoADIH1Ch +ShmYAEgZGADRwOB+z3GAALRCIIEA2IPhzCEigAL0Adjgfw94CiIAgPHAF/LiD8//gODKIcEPyiLB +B8oggQ8AADMRyiOBDwAA3AbKJCEAIARh8solAQHPcIAAtEJAoNHA4H7geADYz3GAAAjRBaEEgaC4 +BKHNB2/zA9jgeDa4NrkwcNYghQ8AAIAA4H8ieOB48cCOCs/wCicAkM92gQAwHc91gADkQg/0z3CA +ALRayXHiCS//FNpiDu/xqXBAJQAYEfAZD5EQ6giP8slxxgkv/xTaQCUAGAzwyXA2CCABBdmpcDYO +z/HPcIAAxEIqDs/xBJYKuAWmBoaGIMMPBqb+CiAA6XC2DM/xfQLP8PHAANnPcIAAEC8aCCAAIKDP +cIAApD92Do//0cDgfuB4ANnPcoAAJAojoiSiJaImoieiIqLPcIAAwEIgoM9wgABkQyCgMbIwss9w +gACIOOB/IKDgePHAz3GAABAvAIGU6AHYAKEA2c9wgAAEG7YP7/8goM9wgAC4KBCIg+BwCSEAyiBh +AdHA4H7xwIoJz/CaCG/3pMGA4MQJAgDPcIAABBsAgM9xgACIOMoO7/8ggc92gAAkCjCWUZZZYTBw +yiAuAMIgTQBChs9xgADAQs93gABkQ4/qDehghxtjYKdggRtjYKHPc4AANDyygx1lsqPPc4AALAlg +gwDdBwtRAKChIIFDwkDBIIdCwM9wgAAcCQCAQcGA4MogAQfKISEEyiKBDwAAogDKI6EH6A5h/sAr +IQYA2IILr/iLcc9wgAAcCQCAg+igpxHwAIcfCBQKGgrgAQDYBNjPcYAAcIQIdIaxMLwOD+ABh7HP +cIAABBsggM9wgACIOKKmsbYgoLC2z3CAACwJoKCODG/zE9gAhx0IVAFeCCAAAdgeDI/6z3GAACw9 +HYEB4B2hBfBGCCAABdjNAO/wpMAV2ADaz3GgAMgfbxkYAODYkLgQoQnYsBkAALQZAAB02EIZGAAA +2Jq4D6GkGYAAz3AADAAZDqHgfs9ygACkPyaCI4FhuGCBz3GAAAQbIIHVuXlhz3OBADAdZYMFKz4A +J3HHcQAAABDhBK//SHDxwOHFz3WAACQKB4WT6M9wgAAQLwCAHwhRAAoJz/cXCJAGz3CAABAnBIAA +gAWlAdgHpTkAz/DgePHA4cXPdYAAJAoHhRnoz3CAABAvAIArCFEA0gjP9yMIkAbPcIAAECcEgACA +BqXuDO//JYUwlThgELUA2Ael9QeP8OB4z3CAABAvAIAXCFEAz3CAABAnBIAggM9wgAAkCiOg4H7x +wM9wgAAQLwCAJQhRAM9wgAAQJwSAz3KAACQKAIAEopYM7/8jgjGSOGARstHA4H7xwB4Pr/CKIQgA +CHXPcKAAyB8woAHZQRhYAFYJAADPdoEAMB0DhiWG1bgwcMohzQ/KIs0HyiCNDwAANRHKI40PAACb +AMokLQAsAG3yyiUNAWYNT/JWDW/yCHcacIDlzCVikEr0z3WAABAnCIUghiCgDIUhhiCgAIUlhiCg +BIUjhiCgQg4P9+UIEADPcIAA5CsIiNkI0QEFhcCAAIAEJo4fwP8AAFMgUQUEhQCARg8v8wpx1bhF +hQV+AtvAos9yoADIH3OiyYUCIEGEYIZNhUCCCgAEAEIpwAcH8CSXCrkCIUEEGWEA2AIjQ4ADIgEA +YKYNhTvwdQ2REASXz3WAABAnIYUKuAChz3CAAJwoAIDEEAAGUSBAgQmFIPLPcYAA5CsoiTkJ0QHP +caAAyB8B2lOhKIUA2yCBTIUCIQGEQIIgoA2FAyLCAECgBIUAgKYOL/MKcSWFAKEK8CCHIKANhSGH +IKAjhgWFIKAVBo/wANmWuc9woADQGzOg4HgDC55F4H7PcIAA5EIngAbpA4BAgAKBQngF8M9w/w// +/+B+z3GAAJwoJIEogQQhvo8ABgAAocEE9BMJHwAJ8AQgvo8AAAAYA/IA2ALwAdjPcaYApAAXoeB/ +ocDxwOHFCHXPcaAAtEdxEQCGBCCAD3AAAABBKD6F+PWKIP8PbxkYgGsZGIAD2g+6z3CgANAbUaAF +hc9ygADkQ1kZGIAGhUCCWhkYgAeFWxkYgAmFWBkYgAiFVxkYgAQggA8AAACADwofAIDgBtjKIOEB +AvAA2M9ygACcKEOCSILPc4AAjAgjCh4ATyACAo26l7pGowUggg+AAEA6R6MFIIAPgADAUw/wBSCC +D4AAwCRGowUggg+AAAA+R6MFIIAPgACAVwijhBEAhgmjBoX6DO/zIYX6Du//AYXxBI/w8cBuDK/w +ANo6cM9wgABw8AyIz3agALRHRCABDkIp0AAKdXEWAZYEIYEPcAAAAEEpPoX59UMWAZZGIQENQx5Y +kFcWAZYEIYEP/2//w1ceWJBfFgGWBCGBD/9//8NfHliQANmeuVMeWJDgeFMemJBgHhiQQgoP/M9w +gACwLyCAYHkE2BboTCFAoIQPYfrKIEEDz3eAAOhDAI8VDQAQz3CAAPAvNoBgeQDYAB8CFEYJj/JD +FgCWRSAADZ+4Qx4YkI8JECAlCVAgZQmQIAohwA/rcoogWgqKI40CSiQAAOkEL/IKJUAEz3CAAJwo +A4AQvZu9MiCADwAA2AKfvYDgAdjAeA+4pXhfHhiQcRYAlgQggA9wAAAAQSg+hfj1iiD/D28eGJBr +HhiQE/DPcIAAnCgDgBC9MiCADwAA2AKfvYDgAdjAeA+4pXhfHhiQBsiE4EwIYfPKIKEEeQOP8OB4 +8cAeC4/wCHUodq4Mr/ABgKCFELlBLQAUOGCeDK/wyXEQubB4OGCSDK/wQC6BEl0Dr/AocPHA6gqv +8LhwGQl0AZhxCiHAD+tyiiDaC7DbHQQv8rhzGw3UAAohwA/rcoogGguy2wokQAEBBC/yuHPPcIAA +1AgIc6ZoFCNDAQCTHQgeAgATBAEKIcAP63KKIFoLt9vZAy/yuHMAgg0IUQBvIEMAA/AA2Jq4IYKe +uAHegeEwisB+G77FeSV4IoLRioHhAdnAeRy5CL7FeQV5A4KgdVKKgeAB2MB4HbgQugV6ANgArS8g +BwGIuACzz3CgAOBERXkVIEABIKCRAo/w8cAiCq/wBNkA2M91oAC0R0sdGJAA2pC6dx2YkAHadx2Y +kM9yoACERBiiANqRuncdmJAC2ncdmJDPcqAAiEQYogDYkrh3HRiQdx1YkIDYdx0YkADYnrhUHRiQ +ANicuFQdGJDPdoAA4AjJcF4Lb/Ic2c9wgADUCFILb/IK2clwIR0YkM9wgABgBxB4SR0YkAECj/Dg +ePHAiOjPcIAAXJ4qC2/yJNnRwOB+8cB6CY/wyghgAQh2qgyAAM9xoADIHwh1QNgPoUARAQYweTIL +r/fJcL0Br/CpcOB48cBGCa/wSiQAcs9woACIIADeqCBAD3UO0BGggM9xgADQ0c9ygQAwHdZ5aIlH +gnpiz3OAAJzS1Hud7QAmjR+AAJTS+I0TD5EQ4JP7fyORgL8kf+CzBfALD1EQIpEgswDZOK3PdaAA +yBz6hSCT5HksswTwLJMJCUUDWWEE8KyzuWKJIc8PBBhQAAHmANnPcIEAMB0dAa/wJ6DxwAAWBEAH +GhgxABYFQAEaWDEEEoEwnOHKIsIHyiCCDwAA3A7KI4IPAAD0CtABIvLKIcIPag6gAA7Z0cDgfuB4 +8cBqCI/wGnANyM93gADE0vAnARDPdYAAJNIDEgI2CBhEIAGSgOANEgE2AN4O8hQlQxCAEw4Hyw4Q +EADegBucA/AbhAPgG4QDFCVDEMCzAYI9CJ8DyLPQG4QDEIrPcYEAyBQCuBZ4G2FlkyULcgA4YGG7 +ZbAQinJodnt6YUWSeWGG6iaRUSFAgOAIAvINyAAggQ+AAEDSxKnMqdSpz3GAANDRFnkUfSKRwB2E +ExV/eB1EEAMSATbApwGBBCCADwAAAGAtCIEPAAAAIBCJz3GBAMgUArgWeABh7bjKJmIQz3CAANQn +1HggkBDhILAD2c9woAAUBDCg6gjgAQpwPfBwEg0B4BMBAQIhTgMRDYQTwn2ieBB4gBscAM9woADU +Bw8QDoYA3fAbhANwEgIBwBtEA0J5MHngG0QA0BMBAQHhMHnwEwUB0BtEAFMlfoDKIcIPyiLCB8og +4g3KI4IPAADnDcokgg8AAP4AVAAi8s8gIgMD2RMYWIBZB0/w4HjxwOoOb/AA2M9xgACMQwChDMzP +dqAA1AdRIACAA9ggHhiQo8FS8hQeGJADEgE2ABYEQAcaGDEAFgVAARpYMQTKnODKIsIHyiCCDwAA +3A7KI4IPAAD0CuwH4vHKIcIPKHCCDKAADtkDEgE2EIlTIMIAhiD+A0S4UKnEGQIAArrPcIEAyBRW +ekBgz3KAAJwoLbjAuPAiAAAEorkQAgbPcIAA0NFAoA8WAJa0GQQABsh6DO/1DRICNgMSATaSEQAB +9gmv+5QRAQAq8EokQAAUHhiRABYAQAcaGDAAFgVAARpYMQTKnODKIcIPyiLCB8og4gnKI4IPAABm +AkgH4vHPICIDAxICNrQSAAEPHhiQlBIAAA0IXgJaDI/3AxICNg0SDTbPcIAAJNIUIEMDKJOh6fCK +z3GBAMgUtXgCv/Z/4WGYEg8ALbnuoPagwLnPcIAA1Cf0IEEAvBpEANATAAEEIYEPAADw/8O4JXjQ +GwQABfDQEwABvBoEAAHYoBoAAGoMb/vwioDgqAMhAAMSDTYGyFEggIGcAwIAIYURCZ4GkNiQuI0D +IACgHQAQAr/PcIEAyBRAIIID9n/rYsQVghARCsAAkdiQuGkDIACgHQAQaoXPcqAALCDwgowj/48N +8mJ/Fw+FHwCAAACH2JC4RQMgAKAdABDwjQK/9n/jYAQjvo8AAAAT+GA58hMLXgKL2JC4IQMgAKAd +ABBXCx8DBZCW6AfIBCCADwDAAAAVCIEPAMAAABHYFLj5AiAAoB0AEIjYkLjtAiAAoB0AEKQVABC0 +uKQdABCSFQARp7iSHQQQnhUAEae4zQIgAJ4dBBCF2JC4wQIgAKAdABBikDMVgBBNCw4AB8gEIIAP +AMAAADEIgQ8AwAAACI0pCFMApBUAELS4pB0AEJIVABGnuJIdBBCeFQARp7ieHQQQCvARCZ4BjdiQ +uG0CIACgHQAQBshRIACAGAIBAH4Oj/8DEg02CHKoHQAQz3CAABAnBICwFQcRIIBVJ0AG1bnPc4EA +MB0LCQUABdgHowWDIniMIAmGyiElAKQVABAJIYEA8risHUAQ5/KYFYEQw7kHyDx5BCCIDwEAAPAN +EgQ2z3CAANDRFiAAAWWQrBUAEEEoCBMJIM8AfhUAEYAVAxEbY89wgACcKASARhAAARtjCCfPEGJ/ +mBUDEOi7ANiH8kQjAAYEI4EPBgAAACO4MbkB4Dhgz3GAAABeMiEGAAQjhQ/AAAAAQS2FBTIhQAFB +K4ECUiEBAMC5A7nAcBjhheDKIY0PAQCJDdUhDgCkFQAQSQgeBSJ/hBUBEQInQBBIIAAAQrhBK0ED +wLn0afR/aHHGuUkhwQU0f89xgAC8VfFhDQveAkEpAwEUI0EABSk+AEEpAHIA2VnwQS+FEEErTwPA +vwS/9H9ocMa4SSDABRR/z3CAALxV8GANC94CQSgPARQnABAFKH4BQSkAcoQVDxH5YUErTwPAvxDh +BL9BKYUA9H9occa5SSHBBTR/z3GAALxV8WENC94CQSkDARQjQQAFKX4BQSkBch/wUSNAgsohAgAb +9APnz3CAAJRV8CBBACK/BSn+Ay9wUyADAHhghBUDER14J+MiuwUp/gAvcVMhAwB5YT15z3OgAMQs +L6Muo0AoARaeuUAsDwXleSV4wB0AEAqjz3GAAKA6AdgAoQXwT4KwFQcRDwrFAQXYGLigHQAQz3CA +AKgJQYAglQkhgQAAiBEIUQAZFgCWEHEA2AP3AdiM6APYGLigHQAQz3GAALA8E4EB4BOhoBUAEAQg +vo8BAQAAFPSSFQARlBUBEJAVAhGyFQMRdgugAUokQAADEg02oBUBECV4oB0AEAQgvo8BAQAABfLS +DA/2CwNAAAPMz3GfALj/GKEGyFEgAIDKIUEDyiAhIHPypBUAEF8IngTPcYAAoDoAgYDgAN4t8gDY +AKF+FQ4RgBUAEc9xgACcKCSB2GBGEQ4BHmYDCZ5Fz3CgAMQsC4BTIIEE/rjMISKACfKYFQAQUggv +9QDadLgeZgLwAN4DEgE2CPANyM9xgADQ0RZ5xZGpcUogACDPcKAAyB+sFQMQiO6kFQIQsbqkHYAQ +BPAJI4MDA9oYuk+g+BACAKFqCCNDA0J7oBjAAADamLpOoAvupBEAAPG4DczFIKIEzyBhAA0aHDAB +kQjoDcjPcoAAJNP0IgAABegBgQ8IngMNzIC4DRocMDIIL/socAMSAja8kkQlABPVCBABDcjPcYAA +JNIUecARAAFhgqV4HLIXC14DVBIDAbwSDQHDu6V7VBrEAIYg/QyMIAKCGfQQigK4FnjHcIEAyBRl +kCMLUgAGkBsIXgARC1EAYBIAAYS4YBoEAAXwHJKNuByyAZIk6NARAwFUEgABw7tleFQaBACAEQEH +hek8koq5PLKkEg0AFw0eEmgSAwFTIMEAeWEweWgaRAAVDV4SahKBAMO4OGAPeGoaAgAHyM9xgAA0 +0wQggA8AwAAADwiBDwDAAAAOGQQEBPAA2Iu4B7EBkhToDcjPcYAAJNIUedARAAFTIMCACvLwEQEB +z3CgAJgDPqC2GkQApBIAAAQgvo8AAAAwB/SGIOWPrAtiAMogggAmD8AABeguDo/9qPADyKQQAAAE +IL6PAAAAMLLy9Li8CsH0AxIBNqQRAACdCB4D+g3v8gHYAxIBNh2xz3CAAJwopIDGDi/4AN4bCFEA +z3CAAMgmAJCB4ADezyYhE8omAhQD2M9xoAD0BwWhhSYCHQ1wwLADyF2QDXBAsAPIT4APCh4AQoUN +cECgRpUG8A1wQKADyEAQAgENcECwA8hRgA1wQKADyEgQAgENcECwEBkABAPIlBAAAFEgQIIIDUH3 +igkP+SMAQAABgSEIHgbPcIAAsAkAkB2xz3CAALQJQIABgFGhEqEI8EIN7/IC2AMSATYdsWYNz/0D +yPYMr/94EAABgODiBwIAAxIDNgGDmBMBAJQbQAAtCB4Gz3WBAMAhqXDGCS/5aHEQ2AwaHDANzKO4 +DRocMMINr/+pcKsHAACeEwABvhMCAZIbBACQG4QAbgugAYITAwEbCB4GA9nPcKAAFAQjoIogEAB/ +ByAABhoYMAPIpBABAIYh5Y8oCkIAAxIONqQWABD0uGgCAQCwjs9wgQCoE7Z4z3KgACwgT4KEFg8R +IJAIIsID4nqwFgMRZOPrC6UACSJBAFJtVnrPd4EAyBRCZwQijQ+AAwAAN71lvYDlyiUMFAQigg8Y +AAAAM7oN4kohACAPIZEg44iGDC/2mBYAEJgWAhAJIEEE7brKIGIgQCgDIXR7SHDGuEkgwAUUe89w +gAC8VXBgDQreAkEoAgEUIgAAKLi4eAPgBCCADwAA/P/PcoEAsB0Dos9yoADELA2i7KIHyA0SAzYE +IIAPAQAA8Cy4GLiduBS7ZXgFeSqiz3GAACQ+CIEB4AihAQmeRc9woADELAuABCCND/AHAAA0vVMg +gQQLCJ4HHw2VEAMSDjZKIAAgz3GAACw9AYEB4AGhANgv8ACWEODnCEWApBYAEPe41SFCA893gQCw +HSCnoqeYFgAQ0gvv9ADaAafPcYAALD0CgQHgAqEAgR1lz3CAAJwoA4AJgKChEQheAA3MRiCAAg0a +HDADEg42AdhKIAAgkhYBETbolBYAEM9ygQCwHaKSwIJAwM9zpQCs/89ygACcKNijRIJWEgIBFOJC +fQPlIr26ZbpiSCJCAAW6RSJCA1ajUSHAgcoggi8AAIAAIMEEIIAPAAAAICW4BSEBBCV4ibiOuBmj +1goP8ncFAACkFgAQp7mSHkQQtLikHgAQlBYAEJAWAxHPcaUArP9AwLAWAhF4oc9zgACcKGSDVhMD +ARTjYnoD4iK6W2J6YkgiQgAFukUiQgNWoSDCBCCADwAAACAluAUiAgRFeIm4jrgZoQPZz3CgAPQH +JaANyJgWAhDPcYAAXNIVeUChpBYAEAh0hCQakBn0BCC+jwAAAAkI8qoLr/3JcCIMr/0DyA3wcBYB +Ec9woAD0Byegz3CgAMgcHBgABAPIpBAAAFEgAIGoDoH0A8gBgBEIXwbqCe/yBNgDEgE2HbG+Ci/4 +AN4bCFEAz3CAAMgmAJCB4ADezyYhE8omAhTPdaAA9AcZhYDgyiHCD8oiwgfKIOIMzyAiA8ojgg8A +AG4KyiQCBCAEovHKJQIEA8gckMV4DXEAsQPIPZANcCCwA8gvgA1wIKADyEAQAQENcCCwA8gxgA1w +IKADyEgQAQENcCCwAxIBNhyRhiD/DD8IEAEzgQ1wIKADyFAQAQENcCCwA8hUEAEBDXAgsAMSATYc +kYYg8w+MIAyACfQ2gQ1wIKADyFwQAQENcCCwAxIBNhyRhiD9DIwgAoIb9GARAQENcCCwAxIBNqQR +AAAnCN4FOYENcCCgAxIBNqQRAABkGQAEuBkCBLoZBAS3uKQZAACkEQAABCC+jwAAQAgH8gGB8LgQ +CMLyDvA6gQ1wIKADEgE2pBEAAIYg848E8juBDXAgoAHZK6UD2kilz3OAAJQ4DRINNkCDANg7DYAQ +z3KgADguRYIEIoIPwAAAACEKgA/AAAAA9dgFuM9ynwC4/xqiu6Jp2Bi4GaIocAcIUQCgo89woAD8 +RD2AGYBnCN8CBCG+jwAGAAAt9OB44HjgeFMIXkMDyM9xoADIH7AQAAGWIEEPHqEQ2A6hAdgVGRiA +vg+gAEHYLwheQ89wgACMQwHZIKADyKQQAQCauaQYQAC2DG//AdjPcYAAJD4NgQHgDaFaDAAABCC+ +jwYAygCYcB7yz3CAAOQmA4CA4Mohwg/KIsIHyiDiCs8gIgPKI4IPAAA/BDQCovHKJQIBz3GAACQ+ +EIEB4FsCIAAQoQPZz3CgABQEJaADEgE2AYFRCN4ApBEAAM9ygACcKFEgAIAEggPyu5AE8AoPL/e6 +kM9xgABw8BGJLQgeABCJI4IQuDIhgQ8AANgCn7iA4QHZwHkPuSV4z3GgAPxEDaEE8HYRDQENzFMg +QIAJ8gbIBBIBNi4Lb/UNEgI2z3aBAMAhyXDSC+/4AxIBNgPIBhIQNs93gADQJ6AQEQAB2ACnvg5v +/6lwANkgpwnohiB+j9PyA8igGEAEBhoYNAMSATaSEQABEQieAqq4iguv+pIZBAADEgI2fhIBAYIS +AAGAEgMBOGAbYw3Iz3GAAKDScHsVeQmBeGAJoQGC2QjeAJoJ7/iA2AYSAjYEIoIPAgABAA0SATcZ +CoEPAgAAABEIXgdPIcIADRqcMAbwo7kweg0aXDADEgM2AYNbCJ4BTyLAAoy4DRocMDCLEHozE4AA +z3WAAIS6BLkleM9xoAA4LiSBBrUQ8C8uQRBOJoMXAN4PJs4QxnnPdoAA4O/0Js4QEQiAA/Hpz3AA +AP//BLUD8GS1CNgMGhwwz3CAAHDwEYgVCF4Bz3CAAEzTjgiv/QCIDRICNwPIAYD9uM8i4gHQIuEB +z3GAALA8FoENGpwwAeAWoS3wENgMGhwwDcyjuA0aHDCGDm//yXADEgI2AZIJ6A3Iz3GAACTT9CEA +AAvoAYITCJ8DDcgB2gAggQ+AAKzSQKkNzFMgQIAJ8gQSATaKIAQAcgov+5gRAQADyBqQVg2v+A0S +ATYNzB8I3gDPcIAANNMDEgE2AoCYGQAABsi6DG/1DRICNtUG7++jwPHA4cWpwYt1qXDPcYAA0EYq +D+/vJNqpcOIJ7/gDEgE2xg8gAalwyQbv76nA8cDhxQMSATaigSCFsg0v/iTaju0KIcAP63JZ2Iy4 +7ttKJAAAdQdv8QolAAEBhYDg4iACAI0Gz+/xwAYOz++YJMEzGnAA2E4cGDAAFo5AABaFQAAWj0AA +FpJACwpSIS8iByRMIgChyiHKD8oiygfKIIoPAAC1KMojig8AAFAAyiQqABgHavHKJYoEQS0AAVMg +EYAr9FkNEACocoYi/AfPcIAAFNIjiEW6UyXNAEZ54LnKIEIDyiAhAFYkzDkArOG5yiBCA8ogIQCL +dIAkRB4ArFEhgIDKIEIDyiAhAIt0gCSEHgCsBfBTJf6AJvQA3YQqCiIvdwAngh+AAAjEKnGEKQQP +BOIAIk4OyXAyCyAASNlWJgAZJgsgAAbZx3eAAHTGI4ctCREggbkjp04UATYkpyWnEPAKIcAP63IQ +vs9wAACvKG7bVQZv8QUmxBOCuSOnz3KAAEwJC+3Pc4AAmNAgi3yLCwnBAAQaAgQAghCIUnDKIIED +4Anh/cohQQQWD0/0GQXv75UkwTPxwMIM7+8A2c9woAD8RHQQBAB5gAQjgo8AAAAIC/QEJL6PAAYA +AAf0A8ikEAAA0wieBs9wgACcKASAz3GgAMgfRhAAAR+hINgOoQ0MngbGDU/zDfBPDF4GxgmP8gMS +ATagGQAAhiB+jwP0AN8C8AHfiHBKC6AAaHED3s91oADUB9KlFgtP/c9wgADQJwCAgODMJyKQA/QT +HZiTA8igEAAAMPADEgE2GQzeBG8gQwCgGQAAiiAIAAYaGDDZ8VEkgIQA2M8g4gX19aQRAAALCJ4G +BdgQuO3xCerPcoAAqD0QggHgEKL28QohwA/rcgolAAgy2M9zAAAlCRkFb/GMuChwKQTP7/HApBAB +AA8JXgJOCM/90cDgfih0hCQSkBHyDQlfBjYND/YH8CDZz3CgAMgcKaAD2c9woAAQFCWg6/Hr8fHA +fgvP7wonAJAacQDdFvLpcS8oQQBOIIIHz3CgAAwtT3rwIIAAwrgPJQ0QANgPIIAABiEBgO/1JO0v +KEEDTiCOBw0amDP12AW4Ognv9slxDcjPcaAAFAQKoc9xoABkLvAhAQDTuQpw8ggv9eR5Gg3v+slw +ANgPIIADBiUNkN/1z3KAAJQ4AIIH2Q0aWDA/CNABz3CgADguBYAEIIAPwAAAACMIgA/AAAAA9dgF +uM9znwC4/xqjO6Np2Bi4GaMB2ALwANgHCFEAIKLPcKAAFAQqoBEDz+/gePHA4cXPcIAANNXPdYAA +bgpgjUGIhCsfAAAhgX+AALTY/gkv/gLiII3PcIAAbApAkIQpHwAAIYB/gACY1eUC7+9AsOB48cBq +Cs/vKHZGIc0AHWVKCCAAIrnBvh8OUBATDpAQHQ7REAAWgEABHRIQABaAQAEdEhAAFoBAAK2dAs/v +gOHKJE1w4HjoIK0BABaBQAEYUgDgfuB4qwkQAEAhwgMkusO5AvAA2ZUJFQQzJkFwgACQRkAnA3I0 +ewB7ABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQY +UAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQ +AAAWAUAEGFAAABYBQAQYUABCIkKAs/XgfoDhyiRNcOB46CCtAQAWAUECGFQA4H7gePHASgnP7wDd +z3cAAAQdSiAAIql2FSKAMw4QAQYA2M9yoAAUBMqiqKInogSiPWWI4Wi5yiEOABoPr/bpcEIgUCAg +59UIdaAB5mUBz+/gfwDY8cDuCM/vGnDPcIAABEQyIBIEz3CAAFQJ0YgSiEojACAQdqHBVAEpAAAc +wDRqdwohwCQD8Hp1RC6+EwAiQC7PcYEA4CIzIQ0Au30xCDMmrX3PcYAAYCAagTuBJHgdCB4Cz3CA +AFQJC4iLc8lx0gwv96lyAMACfa19ACaAH4AAVAkcEMEAz3KAAMw+AIoF2uYOIACpc89xgADUQyCB +AN1KJIBxInioIAAFc250e7V7z3KAAByWeWIhiXpiC+khCQAAJwhCAC8NUxEB5a99CvBCJZEQLyFH +JGG9r30R8AMSzwAA2Wp1DPCA5UohACDKJWEQBfJCJVEQLyFHJAHZLOnzbvR/FSdBE89zgAAcljpj +ACNFABUnTxT5YyGJQYr7YzcJowDjiwIiRAADFYIABL/wfyJ4BLovJAgBAieDEGx4LyBGDnoJ7++I +cQ54An8I5+5/RL/tfwkIEiYK5+1/yXAKcXoMIADpcgHmz3CAAFQJEojPfhB2wAbM/80Hr++hwOB4 +8cB+D4/vKHWA4swjIoAJ8ixtL3nPdoAAVAkzrgbwz3GAAFQJs6mpcc92gABUCbSuAK5VrvoJIAB2 +rgAQiQDhiMlwEojRjhB2mgEJAEQpPhcvcYQuAxEKJkAOACFDDgolgA+AAJSWoHNAKYIQVHqELgEV +CidADgAiTQ4KIIAfgQDkIQAgRBMAJo0fgABUCUwhAJDMIWKQJ/QaE8AAANkYrRsTwABKJIBxHK0Y +iyAdAhCoIAAGFCRAAEGIs260fTV9x3WAAByWABDAAECtFSNCAAGtARLAAAHhAq0Aii95A6148AET +wACZ6ADaWK1crSAdghBKJIBxANmoIIADE24UeDV4x3CAAByWQKhBqEKoQ6gB4S95XvB8uQAhigE6 +i2y6ACJAERqI4HIAIgYC7gggAOlyGK0AIkARG4g7i94IIADpchytACJAERiIOIsAJYUCygggAOly +IB0CEADdSiCAERQmSgMUJEsDARKAEAETgRCqCCAA6XIzbjR5tXnHcYAAHJYAqfhxABKAEAATgRCO +CCAA6XIBHwIAFSVLAxUjSgMBE4AQARKBEHIIIADpcgIfAgAAE4AQABKBEGIIIADpcgMfAgBCIEgQ +AeWZCHWQr30B5s9wgABUCRKIz34QdnAGzP8A2c9wgADQQ/0Fr+8gqPHAz3CAAMw+AIDPcYAAzEMg +gU1oMHLAIGwBzCEMgCQLCQDRwOB+4HgCeS15THlWIQFyR7k4YOB/D3jgePHAuHE1CFEACQ1SAB0N +0gMKIcAP63LPcAAA1xSKI4gCgQYv8UokAABALYEAZLkAIYAPgAAsGB3wz3CAADQeMiBBAYwhw4/K +IcEPyiLBB8oggQ8AANgUyiOBDwAAEAJEBiHxyiQhAM9wgABcGjV40cDgfuB48cDPcoAAZgkKaqIJ +IAApasYNAADOCAAAz3GAAJheIIHPcIAA7BYiCCAAAdrPcYAAlF4ggc9wgAAYFg4IIAAA2tHA4H7x +wJIMj+8acEh3kQlyAADdOnEVIEAjQIgCiAzvz3aAACwYFX4CuBR4x3CAAIQXC/DPdoAAXBoVfgK4 +FHjHcIAAZBghiEsJHgAFEMEAIq4GEMAAA67pcH4MIABIcQCugODMIGKAyiAhABLyRCg+BwAhgH+A +AJCWxRCDAOEQgQACIsAAEHgHuNINr+9ieQGuQiFBIIEJdYAB5VkEj+/xwP4Lj+/PcIAAVAkREIgA +z3CAAFQJEoirCAICSiYAAEohwBFELj4HL3CEKAMRJ3AAIIEPgACQlh8RywAAIIEPgACQlh4RygD4 +cADeBt8AJ40PgACQltV9B41pcQXamHASCiAABRXDEEAuggBUeoQoARUAIkEO1HnHcYEA5CG4cQCp +iHBJcQfa6gkgAAYVwxABHQIAYb8B5rcPdZDPfkIhSRBAJkYAgQl1kC8mhwFAIEgQz3CAAFQJEogv +IAcSYQgDgqUDj+/geALbYKgA2ACpAdjgfwCq4HihwfHAIguP76HBZcIIdih1z3CAAHoJhcGLckAk +QzCCCyAAAIhELr4WACVAHhQUwTDPd4AA4Jj4YHcNMxYgqFMlgBBNCFMBRiXNEa99G/ABFIAwACaB +H4EAUB9SbVR6WWEgwgCpRC6+FgAlQB5EqRQUwTD4YCCoyXBeCCAAqXEB5a99UyWAEMsIUoEh8AEU +gjASbRR4ACaBH4EAUB84YECoIMJEqMlwMgggAKlxD/BCJQAWD3gBFIEwx3aBAGggArgUeB5mIMAo +rgyuCNzDAq/vocDgeOB+4HjxwEoKj+8A3s9woAC0D3AQEACGDW/9yXDPcYAAVAmyiXGJJQ3CEM9y +gACAnn/YFCPPAF9nAK/BrwHjb3sF2PEN45ACr89wgACQlkGQz3WAANRDwKUa6s9wgADcQwCAjCAf +hNT2JQiDDwAAoA9CeECJgOKKIQ8KwCjiAAX0RCi+Ay9wiguP7wClAN0O3s93gADoRcII7/+oZ2G+ +AeX3DnWQr33PcIAAzD4ggM9wgADMQyCg5gxv/S8gBwT1AY/v4HgOeCx4KWoA2A8gQAAncFp44H8O +IMAA4HjxwGYJj+/Pd4AAVAkAjxoM7/8zj89wgADIQwAQ0ADPcYAAyCsUj0eJHwoBAACPIYkXCEEA +z3CAANFDABDAAAkgAAQvIAUgsY8D8AHlr30SjxB1/AAJAADeSiKAI89wgADJQwCIEOhELb4TACZA +Hs9xgADIQwARwgAAIIEPgQDgIkCpX/DPcIAAsC8ggGB5ANgZCBEDz3CAANhFyWACIEAgDXhIIEAA +BPBIIEAgLyEFIM9wgADoRctgE4+pcR4PL/ZVjwkgQAQvIQUgz3CAALAvIIBgeQDYACWTH4AAcAkb +CBAEz3CAALAvIIBgeQDYBBOBIBsIEQPPcYAA0ArJYQQTgCAieAkgQQQI8M9wgADIRchgAnkJIUEE +RC2+EwAmQB7HcIEA4CIgqDpwE4+pcUoPr//JcgARwSACeQAZQiBCIlIgAeYZCnWgz36B8XEAj+/x +wCYIj+8Idc9wgADrLwCIKHcTDQEQz3CAAOovAIg9DwAQz3aAAFQJqXBAJoES3g/v9kAmwhIqjgRu +7g7v9kuOCo6mDe/2K47PcIAA6y+gqM9wgADqL+CoNQCP7+HFmeiMIcKNAdhZ9kokgHHPc4AAcJeo +IMADoWtEKD4HMiVNHhcNQxAH7RMIkAEB4A94ANgD8GG4D3jgf8HF4HjhxeHGABHNAAkNExAA3aCp +G+gNDRMQANgAqQDdz3CAAMhEAJALDQIQqWitfaCpz3CAACBEFCBOA6COoKoAEcEANHgBiBnwCw0T +EADdoKnPcIAAdEUAkA0NAhCpaK19oKnPcIAAzEQUIE4DoI6gqgARwQA0eAGIAKvBxuB/wcXgePHA +Dg9v7wDYocEAHAQwz3WAAAwKAJXPdoAAkJbJcYoiBAomDa/2AduP6AohwA/rcgAVBBHPcAAA2xSH +24u7HQAv8YolBAoAFoQQTCQAgcohyw/KIssHyiCLDwAA3BTKI4sPAACMAM8j6wLwB+vwyiUrABIN +D/aA4Mohwg/KIsIHyiCCDwAA3RTKI4IPAACSAM8j4gLKJCIAwAfi8MolIgCLcUXYAdqiDK/2AduP +6AohwA/rcs9wAADeFJXbi7uKJEEBmQfv8EolAAAAFAAxAdmGIP4PwODAec9wgAA0HyComQZv76HA +4HjxwCYOT+8Iddd1JQAAgADYSvfPcYEAMB0lgSUJRQMifQHg+fHPcIEAMB3FgKlwkg9v78lxBS4+ +EAIlTR6MIBCAyiHGD8oixgfKIIYPAADNIsoj5gzKJCYAGAfm8MolBgEWuDEGb++leM9xgACoCQ0I +UQAB2ACpAakAiYHgyiCBDwAAxAnKIIIPAACAAOB/AaHPcoAAMDEgihlhIKohijhg4H8BqkGJArgW +eMdwgQDIFEioIongfymoz3GgACwgMIE4YM9xgACcNuB/BaHPcYAAnCjwIQEATZFEug0KHgAOgYm4 +DqELCl4ADoGLuA6hDQqeAA6BjbgOoeB+4HgNEgI2BCC+j2AAAADPc4AAJNJUe8dygACU0ghxBfID +yByQFwieAgQhgQ9hAAAAEwmBDwEAAAAA2ACzAdgc8AzMAxIBNhsI3gEyEYEAAYsNCEEAANgBq/Px +AeABqwvwMRGBAACLCwhBAADYAKvn8QHgAKsC2OB/GKrhxeHGz3KAAEQJgODAIiIB/90SaRZ4ACCD +D4EAzxSgqwDdSiQAcc9zgQCwHKgggAKuYnhlNnjEqK5iAeWvfcCowcbgf8HF4HjxwGoMT+/PcIAA +YCIAgKHBmwiQAM92gAAEOs91gAAIOgCFIIZlCQAAz3CAAOguBIBAwQ0IngBPIQABQMCI6eoNb/QA +2MoNT/RWC0/2z3CAABwJAICA4MogAQfKISEByiKBDwAAoQDKI2EP/Akh/cAr4QUghgnpAIWH6K4N +b/QB2C4KT/YghiClEenmDk/0f9gKuM9xoADQGxOhf9gQoQDYlbgQoeYIL/IB2C0Eb++hwPHAtgtP +789xgACcKBV5QIEIggQggw+AAAAARCAPAi+7Br9lfwQggw8AAQAAQStOA+V+LLvFe8ESDgbAEg0G +YQuAAwQgvo+AAQAAHvLPdoAA5CvIjjEO0RG+uAiiQIEIggQggw+AAAAARCABAi+7BrlleQQggA8A +AQAAQShDAyV7LLgFe8Ea2AAK7S8pQQNOIYAHEgggABAlDRD57YEDT+/xwBYLb++YcBsIFAQKIcAP +63Jx2I24iiONC00E7/BKJQAESiQAdADbqCCADkAsjQF1fUAsggDHdYEAiBgAhc9xgQDIFFZ63bhB +YQCl8bnRICKCCPJEIAIGI7oB4hUKlQDPcoEACBcWIgIBQIoJCh4AnrgU8C25wLnPd4AAnCjwJ08Q +UiBOAsEXARYLIYCDB/Ioh+EJnoefuAClAePhAk/vz3GAAJwo8CEAAM9xgADQ0bsQAga6EAMGQqFh +obwQAga9EAAGRaHgfwah4HjPcYAAnCjwIQAAz3GAANDRvhAABhYhAgACkhqxA5IbsQiKOBkCAADY +4H8dsfHAz3CAABwJAICG6NIPL/ZU2APwANhEIAICGwgeAQDbz3GfALj/faEC289xgABgImChz3GA +AAQ6USBAgACBzyBiANAgYQAAoT0IngDPcYAA2EMAgTEKAADPcIAANx8AiEChFwhRAM9xgADEOQCB +CwhSAGq4AKEB2c9wgADcJoIN7/0gqNHA4H7gfuB44H7geM9xgACoPVwZwAeduJ64z3GgAMgcDaHg +eOB44HjgeOB44HjgeOB44H7xwCDbz3KgAMgfcKJDGhgAANjKD+//jbhxotHA4H7gePHASglP76HB +CHYodc9woAAsIDCAz3CAAGA5IKDGD+//MtiLcRYIb/DJcAAUADGkeBB1AdjAeIEBb++hwPHAz3Kg +ACwgQBIEAEASBQAPCd8CBCC+jwAGAAAg8kEJHwPPcQAAECcD8EASBQDPcKAA/EQZgOy4AiUAAQP0 +7whCgB0Igg8AABAnCiHAD+tyiiCaCmnbBQLv8Iy70cDgfs9woAD0B/HAVwgeQyeAGYAweThgA7iW +IEIFz3GgAMgfHqEQ2A6hAdgVGRiA8g7v/4HYLwgeQ89wgACMQwHZIKADyKQQAQCauaQYQADqC6/+ +AdjPcYAAJD4NgQHgDaED2c9woAD0Byqg0cDgfvHAANkK2M9yoADIHx6iENgOogHYFRoYgChwB/AB +2QQggA8gAAAAUSAAw8whIYDMICGAEvQhCx9Az3KgAPxEHYJZggDZ2QrfggQgvo8ABgAA5vXn8S0L +HkDPcIAAjEMB2SCgA8ikEAEAmrmkGEAAXguv/gHYz3GAACQ+DYEB4A2hUSAAwwDYCvTPcYAAqD0Q +gQHgEKEA2Ji40cDgfvHApg8P7wh2z3CgACwgsIAL8C4KT/DPcA8AQEI6Ce/yqXEfCFAAz3CgANQL +GIBCIAAISCAAAN8IhIPZBw/vCiHAD+tyz3AAAM4iXtuKJMMPoQDv8Lhz4HjxwDYPL+8B2aXBGnDP +dYAARAladSYNb/+LcAAUhTABFJEwCwhRIEAlEhELDVIAHQ1SAQohwA/rcs9wAAApJazbWQDv8Eok +QABMJQCAJgEOAKhwABaOQAAWlEAPDDIkenCMJMOvJfQAFgBBABaPQAAWgEAAFgBBhQwTJCjvz3CA +ACgeAIBALM0gtX0Q4Lhgrgxv/wTZz3CAACgeAIBMIUCgHWXMJ2GTGvQA2Iy4F/AKIcAP63LPcAAA +KiW320okQADZB6/wCiUABQohwA/rcs9wAAArJcDb9PEA2AC1z3CAACgeAIBALMEgNXkyYDhgBSJC +BECwBN0H8IHABN0+DG//qXEAIowjABwCFc9wgACcKPAgAAQe38AQAgYvKYEAAidAECTqMmjPc4EA +zxQ2eStjEwuOAwAmgR+BALAcFnkAGQIFAC2BEwshwIAJ8gAmgR+BALAcFnkEGQIFECICgC8pgQAC +J0AQ4PVCI0AggODmBs3/IgjP8xUGL++lwOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB/AdjgfuB4 +4H7geOB+4HjgfuB44H7geOB+4HjxwJ4ND+/PcIAAtDvPcYAASPHPcgAAYCJWDmAAAIASDE/2LghA +AEYLAADPdYAAsC8ghWB5A9gG6CCFYHkE2ITovg4P/s9wgAAAggDeyXEmD+/wiiIFBc9wgADACcCg +z3CAACkJwKjPcKAALCAwgM9wgAAUCc91gABwhCGgz3CAAKCFwKCpcMlx6g7v8IoihAv/2HkFL+8Q +rVEiwNHPcoAAgNMA2QPyNJLDuR+Cz3OAAMg5USBAgs9wgAAAgtUg4gzVIOEENngAoyKQe5IlCcIA +JQtCACGQepIZCcIAGQtCAACQOJINCEIADQkCAAkK3lIB2APwANjgfvHAogwv7wDZvgkgAAh2CHcD +kM91gADACc9xgABISwK1cgkgAOlwkujPcYAAQEtmCSAA6XAR6AKV13AAAIE3zCCCjwAAgPMJ8gOW +COADtg6WaLgOthfwz3GAAFBLEgkgAOlwLpYJ6AOWZLkutgTgA7YI2AK1B/AveAi4KLkveQV5IrXJ +cGYJIAAA2c9xgACMngexApXXcAAAiI60DGH2yiCBA2kED+/gePHA+gsv7wDbS4CykEokgHFodl1l +UyVAEE4gBAEAJEIDqCAAAgEVjxTIYQHm53gFe7HrSiSAcQDeqCAAAgEVjxTIYQHm53gFe6XrANhM +JACAyiQNceggLQIBFY8UDmEB4Od+xXuX60AiAAMD8AzgViKOAtFw4IDAgud+xXtN9+GAwYLnfsV7 +4oDCgud+BSODg+7zANgW8AGAQYIHegUjg4BQ5fn1QCSOABUOlREBFYIUyGEB5kd4+Q60kQV76+sB +2KEDD+9AiWCIDQuBAEGJYYgJC4AAANgH8EKIAon5CgGAAdjgfw944HhAkWCQDQuBAEGRYZAJC4AA +ANgH8EKQApH5CgGAAdjgfw944HgIcc9wgAC0O1EDYAAAgOB4S4ADkFhg4H84YOB48cDhxauAA5C4 +YDhgSHE6Cm/9aHI1Aw/vS4ADkFhg4H8wYOB4z3CAALQ7AIARA2AAANngePHAogoP7891gADULwCF +AN6E6KoJAAAApQnoIpCH6VoNAAD58boJAAAApQbowpBTJg6R+vPPcYAAwAkggcS5BSZOkA3yLy6B +E89xgQCMJk4mghfwIYEAQHkI8M4JAACA4DwOovHKIGIDpQIP789wAgDQJM9xgQCMJgShz3ACAEQm +A6HPcAIAfCUCoc9wAgAcJAGhz3ACAMwk4H8AofHA/gkP766QCHZDDXIQ45ALhgzg8GAPeQi5KLgF +eS62QCeAEw7hA7YDaR8NZBBGINAAIgggAMlwAiUNlAJ31Afv//B/A/AA2AK2GQIP7+B48cDhxQ4N +7/8IdT4LIACpcGYKIACpcBUCD+/geOHF4caggWCAwYFnfWCCpHuhgKd+oYLEfaV7ooHCgKd+ooLE +faV7o4ADgQd9A4KkeAUg/oAB2MB4wcbgf8HF4HjxwFYJL++4cgh1KHfPdoAAtDuYcwXwSHA2CmAA +IIHaCWAAAIZAJQEcGwhlAECGAYKA4ADZBPIgggeCGWHt6QDYFvAyCmAASHAS6DDZIKDusADaIBiC +ACgYAAFAIAEMK6AGGEQBU7BCsCEYggBRAQ/v8cDPcoAAtDvGCWAAAIKF6ECCAYKD6ADYBPAAgieC +OGDRwOB+8cDCCA/vz3GAALQ7IIFAkGeBwIECIM8AGw+iE11nwn3BgcJ9GQ0SEAOBGQ0DEHhlCfBi +gSOBYn0JDUMQWGAD8ADY6QAP7+B48cDPcIAAtDtaCWAAAIAH6M9wgADACQCAA+gA2ALwAdjRwOB+ +4H8LgOB/C4DxwDoID+86cEAgEwIodhpyTCMAosohwQ/KIsEHyiCBDwAAuyHKI4EPAACyAcokwQBs +AaHwyiUhAM9wgADgQwCAhCgCJaRoJ3WRFYAQCQhVBADYNfBCIBIELyKIJEAllBAqcBIN7/8A2UAl +AhgvJYgDCSWBBDB5PQlSAADde20yJMMgRCWOEQAQBAHae8G7z3aAAGRV9CbOEGCSByMDAQsjgIMP +9ALlrn0C4tUNYpAC4AwlgIQB2MIgCwDVB8/uANgAINAkABgCICERgCBhuA94IRkCIL7x4HjhxXKQ +BfAA2lGwAeNwe0FpHwrCAEuAbWKMJcOfUZDAImEA9PPjCpKBcrAB2APwcrAA2OB/wcXgePHA4cUI +dc9wgQAMIwCAgQgeAA6V5uB4AAsAI5UA2oIgwQdRtTK1GWEweaIP7/+pcIDgAdgJ9AKV4rjMJSKQ +BPKiuAK1ANhJCFEAz3GAAJwoqXD2Cu//I4EilUQhAgES6AXqLgsgAKlwEugB2M9xgABwhAh0hrEw +vCINIACHsQjwgOLMJSKQBPKiuSK1KQfP7vHA4cURCFEAvg5P+7YNb/sA2AzwBNgA2ShyQg3v/yhz +z3GAANQvAKHPdYAA1C8AhZIL7/8AgFIMIAAAhekGz+7xwGoOz+4IdRIO7/9AIBACCHbPcIAAgNMA +kM93gACMnhcIHgJAJgAU6XG+Di/9A9pAJoASCPAEbulxrg4v/QPaQCYAFCZvog4v/QPaz3CAAMAJ +ApAGtwDeD/AB2C8mB/AAIIwjAKwI8iEVgBAB4A94IR0CEAHmz3CAAOBDIIAAgS0OBRCELgIVJ3EO +lZURggAQ4BkIhADpcFRux3KBACQjOgzv/xTh2+gA2NrxIRWAEDToA5UA3gLgA7UOlWK4DrUC8AHm +z3CAAOBDAIAAgEEOBRAyIIAjd+jPeqlwRg3v/3DZcegClQ8IngDWCSAAqXAU6ALaz3CAAHCESHEm +sDC5J7DQqMYLIABIcAjwA5ViuAO1DpUC4A61tQXv7iEVgBDPcqAArC8ZggDZqbgZokDaz3CAACw2 +QaDPcIAAFAngfyCo4HjxwAhzz3CAALQ7AIAWDiAAIIMAg9HA4H7xwBYNz+7PcIEAyBQOiM91gAAo +CUCNBLiA4sokInLKISIA6CDiAgDeDyZOEAsmgJAK9AHhL3nPcYAAwAkAgaG4AKEK8MZ6QK2GIP4D +JdrCCi/wANstBe/uAdjgePHA4cWjwc9ygABUCmKKIYrPcIEAyBSjigAShAAEI4MPAADA/w6IJdpC +K4UBQMIA2wS4hiH/AEHDQrlCw4Yg/gMB2thzsH2aCS/w+HUB2OEE7+6jwOB/ANjxwAXoIpCkuSKw +Fg8P9MoKb/4A2M9xoACsLxmBibgZoQHY0cDgfuB48cA6DM/uz3WAAJi3B40E6AaNBa0A3mILL/bJ +cAWNJo31CQGAxq3Frcetz3CAAMAJdQTv7gCA4HjxwM9wgACggyCQQZAHCYMAIbAGDAAAz3CAAMAJ +AIDRwOB+4HjxwOHFz3WAAJi3cgov9kAlAB+ODY/4ANhSHQQQz3CAAMAJMQTv7gCA8cCuC8/upMFa +C+//CHUIdiSOUSEAgM9xgABUgwCQBfJAIQ8EA/BAIQ8CRCABAxUJEQIIcYYh/AOMIQKAAtlD9gDZ +GOHouNEgYoIG2AL0ANg4YA942GBAIBACqXB6CO//LpUCIAQEIJYA2FEhwIEvJAgByiUBAAXyDJZT +IMUACiYAB0AkBzHpcCRuQCYCFOoPr/UKc6lwQgjv/y6VgsGKCi/9CNoE7QKVorgCtQDAAsEPCQEA +AcADwRBxAdgC8gDYUQPv7qTA4HjxwOHFCHXPcKAALCAQgM9xgABwhEeRBpEQukV4jegKIcAP63Ju +2I24sttKJAAADQRv8AolAAGKDM/zBe0ClaO4ArUhA+/uAdjhxc9ygADIOWCCHOvPdYAAgNMfhRkI +3gYNhQGjMBWBEDIVgBAIuSV4ALMK8BEIngYYlQCzGpUBsxuVArMA2ACi4H/Bxc9xgACA0y6RUyHB +gAz0JQqeUs9xgACA0z+BBCG+jwAYAAAI8gDaQrDPcZ8AuP9XoeB+4HjxwOHFz3WAAJi3QIUH6s9z +gADACSCDRXkgowDZIKWH6M9wgADACQCABOgmD2/xDdhxAs/uz3GAAIDTP4EVCV4GI5AE4SOwLpBk +uS6w4H8E2B0J3gYjkAjhI7AukGy5LrAE6CKQgrkisAjY4H4TCZ4GI5AI4SOwLpBouS6w9vHgfwDY +4HjxwKoJz+7PcYAAcIRnkUaRELtleo7qCiHAD+tybtiNuIojhwlKJAAAzQJv8EolAADPdYEADCMg +hc92gADUL+i5xiKCj///E/4P8l4Mz/UA2AClAIZmDq//AIBmCU/7Sg1v8Q3YDfALIQCAIIYF8gnp +ApGDuATwBekCkYS4ArGZAc/u4HjxwBoJz+4Id89xgACw01EiwNHPcIAAgNMA2gTyVJDDumCJookI +uwUl0BAfgMGBz3OAAMg5USBAgs9wgAAAggLZ1SDiDMohYQDVIOEEOnEDuTR5VngAIY0PgACUuiGA +Ew5kEACjDw5BEACQCwgCBADYMPAChR8OARAUjSvoA4Ukb+ClGgkv/QXaAIXCqADYFK0f8AHg2w4B +kBSNGwhQAASFJG/gpfYIL/0F2gCFwqgB2BStHw4DdAAAAIDgpc9ygADMCQCKDyBABFYM7/0AqgHY +qQDP7vHARgjP7gh1OnEacs9xgAA0gwyRz3OAAJS6aHcB4BB4QCEOBgyxjOgHgclyAeAHoQCDIYMQ +4OYJ7/1jgwGOKnEArQGOxriFuAGtAI4CrSDYA60BhgGlQ4cKcK4K7/2pc0UAz+7hxeHGz3GAAKCD +z3CAAMw+AIBjmQJ7DwtyAEAhAgIcawTwc3tEu3N4oZFgkaJ7eGAOeEokwHEA26gggAFtYgkNAxAB +4wKRCQsAAGKxwcbgf8HF4HjhxRTpYYClgIbrQ4CE6qCgIaAM8ECAemILDYEQeWEhoATwQ4A6YkOg +ANkloCag4H/BxeB48cAjgATpJggAAAfwEgggAGCACCMAANHA4H7geECAIYAEgFlh4H8ieEKAI4AA +gFlh4H8ieADbYqBgoGOgYaBmoGWgJ6Dgf0SgIYCE6QOABOgA2APwAdjgfkGAFwmEACKAIKAjgCGg +ANkjoCKgBvAiekGgQIBZYSCg4H7gePHA4cUodSOACHMP6aIPz/83CEQDGe1CgyODpqM6YkWjB4NY +YBbwfg/P/yCDEwhEAAvoEHXKIEUDBqNBg/DxANgD6QsJRQMA2ATwBaMHg6ajDQeP7vHAlg6v7ghx +z3KgAMAvoxIAhgDd9QgegQfIQBoYgA3IDQiRASYI7/4ocBfwz3aBAMAhCo4H6EAmgBIK4coN7/wK +2gqOCOjPcYAAED4XkQHgEHgXsaqurQaP7uB4ocHxwCoOj+6iwUjBGnBIdQohACFnCV4CAtnPcKAA +yB9JGFiAKMFTbe7hUHgF9PYP7/GLcRnwEwnRDRt4EHjmD+/xi3EQ8AsJEQUceAnwDQmRAgAchDAH +8M9wAAD//wAcBDDgeADYz3KpAKT/uaIAFAExgrg3ohqiSPBdCR4CTCEAoNEg4qFC9M9ypQCs/89w +gACcKLiiBIBWEAABFOACewPjIrt4Y3hgSCBAAAW4RSBAAxaiQSjAIcC4d2gowAQhgQ8AAAAgJbll +eCV4ibiOuBmiHPAowIDgyiHBD8oiwQfKICEOzyAhA8ojIQXPIyEDyiQhAJAGIfDKJcEABb2leM9x +pQCs/xahz3KgAMgfz3WgALRHVxUAlgDfSiRAAAQgvo8AKAAAwiQCAW8VAJYEIIUPgAAAAAQggw8g +AAAABCCODwAGAAAPDBAAQBIBBgsJ1AAA2QLwAdnYcRMSAYYEIL6PADgAAAQhhw8AAACAzCYhgMAn +YRAFI0EBBSHBAQUhvoME9KcPlJINDxAAgOPMJiGQhfJrFQSWkQwQAIh0hCTQkQvyz3GAALA8EIEA +3QHgEKGcvVrwFwzeAM9xgACwPBGBAeARoULdUPCIdIQkApgI8s9xgAAkPhGBAeARoQ7wEwyeAc9x +gAAkPgSBAeAEoQTwUyQ+gwTyAN048BcMXgNeCw/9z3GAAKA+BYEB4AWh9PEKIcAP63JvFQWWRNiM +uOnbZQUv8Iy7COvPcYAAqD0QgQHgEKHi8SjuGQieBs9ygAAkPi+CAN0B4S+ikb0L8B0IXgbPcoAA +JD4ygkLdAeEyos4Kb/+IcZi9RfBxFQSWbxUFlgohwA/rcjnYz3MAAAIRBQUv8Iy41goP/c9xgACo +PRGBAeARobDxExIAhvC4yiAhAAQKYf/PIKEDaxUBllgVAJYLIECAHPJvFQCWz3WgAPQHUyBAgAHY +DPIJpeB4ANgJpc9xgACgPgiBAeAIoeIO7/0B2APYCqUF3Zi9A/AA3ZftFwjeIR0JESAB2c9woAD0 +ByygA9kF8APZz3CgAPQHJaBRIICiNA4C+RfwAxIBNs9wgQDAHQ8JAADPcIEAiB4bCQEAkhEAAaq4 +khkEAJ4RAAGquJ4ZBADPcYAAsDwPgQHgD6HPcIAA7MMhgM9wgACcKAOAFJAdCQEAz3GAAGAgGoE7 +gSR4USAAguAO4vXKIGIAqXAI3AcDr+6iwOB4ocHxwJ4Kj+4odQh2GnIEIb6PAQAAwGh3LfQvDR4S +RCUAFiO4IWgEJYAfBgAAADG4OGAEJYEfBgAAAddxAgAAAcogoQAC8AHYIQhQABMIkACD4ADYyiDh +AcAooQMK8M9wgAAU0gKABvDPcIAAFNIBgAV9yXDyDa/5qXHJcKlxCnLpc/IL7/9KJEAAgODcCUH/ +CNx3Ao/u4HjPcKQAkEFNgM9xgACU1EKxGoADsQQggA//AAAAMLgEsc9wgACU1ADaEQheRs9xgACA +0zKBCwmeAkKwQ7BEsOB/WbDgeOHFz3WAAJTUCaUqpXi1S6UB2Bm14H/BxUokAHoA2agggAIA2s9w +gACU1DV4QKAB4eB+AAARAAAAAEABAAAAAACoEkN1AQYABQAAAAAAAAAA2D6AAGw/gAA0kYAA9CaA +AMwKgABsIMAQDxsJItwdwBAKABtAEAAbbh4AAGEKABtB5B3AEQAACiQAAAolAQAKJv4FCmRAABtw +AgAAYQgAX3AFAABhIAAbcAcAAGEIAF9uAQAAYQQAAGG4PoCBAADAFgEAGyYAAMAXAQAKJAAACiUP +CmMiCABfcAoAAGEPHB0iCQAdJg9fGyJcIICBAADAFzsAAGEAABslAAEbJFwcwBE3AABhXCCAgQAA +wBYgABtwMwAAYVgggIEAAMAWDxsKIg8bGiIPCRsiAQAbMAAAwBf3/wwk//8MJQgAGjAEABonAAwa +OQAAwBYPCQsiAQAbcBkAAGEAGwkpUCCAgQAAwBYAGwkpAIAJcBMAAGEPChoiCAAaMAgAGicADBo5 +AADAFgEAG3ARAABhDwsJIgAbCSlQIICBAADAFgAbCSkPCRsiAIAJbgQAAGEoAAkkAAkbKQCAG3AF +AABhTCCAgQAAwBYACxsoVCCAgQAAwBcPChsiBAAbJgAMGzlYIICBAADAFxgIgIEPGhsiAAAbJQIA +G0AAABtxD0UAIgBcADkHAABiBmAAYgAAWDhgRcAQcEXAEHhFwBCQRcAQhgAAYfQdwBALABNitB/A +EABAE24IAABhAgp5aAIAeW4DAABhCABkMQMAEyQHAABhAAATJAUAAGEDAHliD3kTIugdwBEBAFIk +tB/AEA8TUiICABNwAwAAYQgAWDAIAGQxBQAAYUIEEyQIABMlAQBSbhAAEzEEKMARCABYbtsPAGEA +ABMlAAATJCQQwBGAABMlR2gTJAQowBEAgBMkOBzAEQ8AEyIBABMwBCjAEQ9zEyKCARMwBCjAEQ90 +EyICAhMwBCjAEQ8UFSIBABUmD3ITIggAzBEPRAAiCgAAQABAAHAOAABhAAATJQIAEyTsHMARD3YT +IhgIyhEJABNAHAjKEQkAE0AgCMoRD3gTIgQAyhEAAAEkAAABJQYAAGEPdhMiLEjHEQ94EyIAAMYR +AwABJAAAASUAABMlwiwTJAQowBECRhMkBCjAEcJfEyQEKMARD0UAIgBcADksAABkAAATJAEAEyU4 +HMARD3cTIuAcwBECAAFiDwETIgQIwBGkCMASBCjAEQ8TAiKoCMASBCjAEQ8TByKsCMASBCjAEQ8T +BCICAHFwBwAAYf8AEyUCEBMkBCjAEQAAEyUAABMkyEnHEQYAAGEAABMlAhATJAQowBEAABMlSQAT +JMhJxxEPcBMiAQATMAQowBEDABMkAAATJQQIwBEAABMkOEXAEbAIwBIYKMARDxMDIgQAAGEAAFg4 +AAATJAEAEyU4HMARAAAVJAAAACGQCICBAADAFg8bUCKUCICBAADAFg8bGiKYCICBAADAFg8bGSKc +CICBAADAFgAAAIWMCICBAADAFg8bBCIcBBtmGwEbaBQcwBAKABtABAAbbgsAAGEPHB0iAQAdJvkP +AGGgCICBAADAFgUAG2IYCICBDxobIgAAGyUCABtAAAAbcWQMABAAwAYRAQAEJ/wABGQAABskAgAb +JTgcwBEYCICBDxobIgAAGyUCABtAAAAbcQAAGyVAABskMBzAERgIgIEPGhsiAAAbJQIAG0AAABtx +kEXAEA9kASIKAAFACAABcCkAAGEAAAEkCAABJQ8BYyIIAFhuBgAAYSQQwBABABNuAgAAYQACXDEB +AABhACBYMMgIQBL//xNu/Q8AYQFCEyQAABMlBCjAEcgIQBL//xNu/Q8AYUIEEyQYABMlBCjAEWBF +wBBwRcAQAwB9YgIAEyQAABMl6B3AEfj/TDMBAEwxAQBSJMwIQBL//xNuAwAAYSQQwBABABNwAgAA +YQAAFSQAAAAhJAAAYQIAEyTkHcAR9B3AEBEAE2K0H8AQAEATbg4AAGEGCn1oAgATJOAdwBEAABMk +AQB9bgEAEyQMAABhAQB9cAMAAGEIAGQxAwATJAcAAGEBABMkBQAAYQMAfWIPfRMi6B3AEQEAUiS0 +H8AQAgATcAIAAGEIAGQxAAAAIQ8TUiJCBBMkCAATJQEAUm4QABMxBCjAEUAJgIEAAMAWAgETZEIB +EyQEKMARjEOAgQAAwBYGARNiBAjAEAQAE2QPXAAiCgAAQAAGAHAZAABhAAATJAAAEyUAAMAXAAhY +MMggwBBwRcAQEAjAEAAAEyUDABMkHAjAERwIwBEAABMkBAjAEQ8UFSIEABUm+/8wMgMAEyQYCMAR +DxQVIgIAFSYEADAwAAATJBBFwBEYCMARABBYMA98EyIIAMwRAAATJQAAEyQ0SMcRD3sTIgEAEzAE +KMARDxQVIgIAFSb/ABMlAhATJAQowBEPFBUiAgAVJggKgIEAAMAWwiwTJAQowBECRhMkBCjAEcJf +EyQEKMARD00TIgQQxRECABMk8BzAEQEAEyTsHMARAAATJHAAEyUQHMARAAATJQAAEyTgHMARgAAT +JUZoEyQEKMARAAATJQEAEyQkEMARAAAVJAAAACEPDhoiAABAFgABG3ANAABhgABjJP/+GzIAAEAX +AAAbJQ8bDyL8CICB/wAbMgIAG0EAGxooAADAFgAAGyUCABtAAAAbcQEAZHAHAABhAQBjJAAAGyTe +CICBAABAF9QIgIEAAEAW7Q8AYQIAZHAQAABhAgBjJAEAGyTeCICBAABAF9YIgIEAAEAW5A8AYQQA +ZHAHAABhAgBjJAIAGyTeCICBAABAF9gIgIEAAEAW2w8AYQAAHSQAAAAhAAIPbgkAAGHeCICBAABA +FgAAGyXaCICBABsaKAAAABYBABsmAAAAFw0AAGH0CICBAABAFgIAGyYBEBtoAAAbJAAAQBfgCICB +ABobKA8bDiL4CICBAABAFgEAGyYAAEAXYAeAgQ8aGyIAABslAgAbQAAAG3EAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAOQJgAAAAAAAAAAA +ACgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQ0R +FAoNExcZGRkZCQkAADyggAAAAAAAPKCAAAAAAABY1YAAvHEAADCAAAAAAAAAMYAAAIiIMzMygAAA +AKqqijOAAAAAAAAANIAAAAAAAAA1gAAAAAAAADaAAAAAAAAAN4AAAAAAAAA4gAAAAAAAADmAAAAA +AAAAOoAAAAAAAAA7gAAAAAAAADyAAAAAAAAAPYAAAKqqCgA+gAAAU4WIiD+AAAAAAAAwMIAAAAAA +AAAxgAAAmplYVTKAAAAAqqqqM4AAAAAAAAA0gAAAAAAAADWAAAAAAAAANoAAAAAAAAA3gAAAAAAA +ADiAAAAAAAAAOYAAAAAAAAA6gAAAAAAAADuAAAAAAAAAPIAAAAAAAAA9gAAAqqoKAD6AAABVmJmq +P4AAAAAAAFAwgAAAAAAAADGAAAAAAAAAMoAAAAAAAAAzgAAAAAAAADSAAAAAAAAANYAAAAAAAAA2 +gAAAAAAAADeAAAAAAAAAOIAAAAAAAAA5gAAAAAAAADqAAAAAAAAAO4AAAAAAAAA8gAAAAAAAAD2A +AAAAAAAAPoAAAAAAAAA/gAAAAAAAADCAAAAAAAAAMYAAAAAAAAAygAAAAAAAADOAAAAAAAAANIAA +AJp5AAA1gAAAqqqqqjaAAAAAAAAAN4AAAAAAAAA4gAAAAAAAADmAAAAAAAAAOoAAAKqqqgo7gAAA +AHCZqjyAAAAAAAAAPYAAAAAAAAA+gAAAAAAAAD+AAAAAAAAA//8AAKUBAQC5Ad8AOwItALEAGwAW +ARsArwAbABQBGwBsAKAA0QCgAG8AgwBxAIMAcwAzANQBBgDQAQAAeABJAHkAagDeAGoAqAAAAA0B +AACmAD8ApwABAAsBPwAMAQEABAAIAJwBzACdAcwA1QHMANYBzAC0ACAAGQEgAI8AiAD0AIgAkAAi +APUAIgCRAAQA9gAEAIUAAACGAAAAhwBVAIgAAACJAKoAigAAAIsA3QCMAAAAhQABAIYAAQCHAFUA +iAAAAIkAqgCKAAAAiwDdAIwAAACFAAIAhgADAIcAVQCIAAAAiQCqAIoAAACLAN0AjAAAAIUAAwCG +AAcAhwBVAIgAAACJAKoAigAAAIsA3QCMAAAA+/8AAP//AAC5Ad8AOwItALEAGwAWARsArwAbABQB +GwBsAKAA0QCgAG8AgwBxAIMAcwAzANQBBgDQAQAAeABJAHkAagDeAGoAqAAAAA0BAACmAD8ApwAB +AAsBPwAMAQEABAAIAJwBzACdAcwA1QHMANYBzAC0ACAAGQEgAI8AiAD0AIgAkAAiAPUAIgCRAAQA +9gAEAKgADAANAQwAhQAAAIYAAACHAJkAiAAAAIkAqgCKAAAAiwDdAIwAAACFAAEAhgABAIcAmQCI +AAAAiQCqAIoAAACLAN0AjAAAAIUAAgCGAAMAhwCZAIgAAACJAKoAigAAAIsA3QCMAAAAhQADAIYA +BwCHAJkAiAAAAIkAqgCKAAAAiwDdAIwAAAD7/wAA//8AALkB3wCxABsAFgEbAK8AGwAUARsAbACg +ANEAoABvAIMAcQCDAHYAgwBzADMAbgAzAHAAMwByADMA1wAzANQBBgDQAQAAfgA8AOMAPAB4AEkA +3QBJAH8AWgDkAFoAqgA/AKsAAQAPAT8AEAEBAHkAagDeAGoAqAAAAA0BAACmADcApwABAAsBNwAM +AQEABAAIAJwBzACdAcwA1QHMANYBzAC0ACAAGQEgADECDAAyAgwAMwK9ADYCDAA3AgwAOAK9AKAA +iAAFAYgAoQDVAAYB1QCiAAQABwEEAI8AiAD0AIgAkAAiAPUAIgCRAAQA9gAEAJ8ADAD7AAwAlAAA +AJUAAACcAJcAnQDQAJoAjQCYABEAlgAzAJcAdwCUAAEAlQABAJwAlwCdANAAmgCNAJgAEQCWADMA +lwB3AJQAAgCVAAMAnACXAJ0A0ACaAI0AmAARAJYAMwCXAHcAlAADAJUABwCcAJcAnQDQAJoAjQCY +ABEAlgAzAJcAdwD6AAAA+QAAAAIBlwADAdAAAAGNAP4AEQD8ADMA/QB3APoAAQD5AAEAAgGXAAMB +0AAAAY0A/gARAPwAMwD9AHcA+gACAPkAAwACAZcAAwHQAAABjQD+ABEA/AAzAP0AdwD6AAMA+QAH +AAIBlwADAdAAAAGNAP4AEQD8ADMA/QB3AIUAAACGAAAAhwBVAIgAAACJAKcAigAAAIsA3gCMAAAA +hQABAIYAAQCHAFUAiAAAAIkApwCKAAAAiwDeAIwAAACFAAIAhgADAIcAVQCIAAAAiQCnAIoAAACL +AN4AjAAAAIUAAwCGAAcAhwBVAIgAAACJAKcAigAAAIsA3gCMAAAA6wAAAOoAAADsAFUA7QAAAO4A +pwDvAAAA8ADeAPEAAADrAAEA6gABAOwAVQDtAAAA7gCnAO8AAADwAN4A8QAAAOsAAgDqAAMA7ABV +AO0AAADuAKcA7wAAAPAA3gDxAAAA6wADAOoABwDsAFUA7QAAAO4ApwDvAAAA8ADeAPEAAACkAYAA +oQFAAPv/AAD//wAApQEBALkB3wCxABsAFgEbAK8AGwAUARsAbACgANEAoABvAIMAcQCDAHYAgwBz +ADMAbgAzAHAAMwByADMA1wAzANQBBgDQAQAAfgA8AOMAPAB4AEkA3QBJAH8AWgDkAFoAqgA/AKsA +AQAPAT8AEAEBAHkAagDeAGoAqAAAAA0BAACmADcApwABAAsBNwAMAQEABAAIAJwBzACdAcwA1QHM +ANYBzAC0ACAAGQEgADECDAAyAgwAMwK9ADYCDAA3AgwAOAK9AKAAiAAFAYgAoQDVAAYB1QCiAAQA +BwEEAI8AiAD0AIgAkAAiAPUAIgCRAAQA9gAEAJ8ADAD7AAwAlAAAAJUAAACcAJcAnQDQAJoAjQCY +ABEAlgAzAJcAdwCUAAEAlQABAJwAlwCdANAAmgCNAJgAEQCWADMAlwB3AJQAAgCVAAMAnACXAJ0A +0ACaAI0AmAARAJYAMwCXAHcAlAADAJUABwCcAJcAnQDQAJoAjQCYABEAlgAzAJcAdwD6AAAA+QAA +AAIBlwADAdAAAAGNAP4AEQD8ADMA/QB3APoAAQD5AAEAAgGXAAMB0AAAAY0A/gARAPwAMwD9AHcA ++gACAPkAAwACAZcAAwHQAAABjQD+ABEA/AAzAP0AdwD6AAMA+QAHAAIBlwADAdAAAAGNAP4AEQD8 +ADMA/QB3AIUAAACGAAAAhwBVAIgAAACJAKcAigAAAIsA3gCMAAAAhQABAIYAAQCHAFUAiAAAAIkA +pwCKAAAAiwDeAIwAAACFAAIAhgADAIcAVQCIAAAAiQCnAIoAAACLAN4AjAAAAIUAAwCGAAcAhwBV +AIgAAACJAKcAigAAAIsA3gCMAAAA6wAAAOoAAADsAFUA7QAAAO4ApwDvAAAA8ADeAPEAAADrAAEA +6gABAOwAVQDtAAAA7gCnAO8AAADwAN4A8QAAAOsAAgDqAAMA7ABVAO0AAADuAKcA7wAAAPAA3gDx +AAAA6wADAOoABwDsAFUA7QAAAO4ApwDvAAAA8ADeAPEAAACkAYAAoQFAAPv/AAAAAAAAAgAAAA3S +EtIT0hTSDNIV0gvSAtIR0gRDABAUEAkQERABQBvSHNIA0goACwAEAA4AtQAaAQ8AQgC8AMMAIQEo +AbYAtwC4ALkAvQC+AL8AwAAbARwBHQEeASIBIwEkASUBCgAAAAsAAAC2AAAAtwAAALgAAAC5AAAA +GwEAABwBAAAdAQAAHgEAAL0AAAC+AAAAvwAAAMAAAAAiAQAAIwEAACQBAAAlAQAAEtIAABPSAAAA +AAEAAgADACwAZAB0AIAAjAChAAcAAAAAAAEAAgADAAAAAAC3EyIAuBQjALkVJAC7FiUAvBcmAL0Y +JwDAGSgAxBopAAcbAAAIHAEACx0CAAweAwAQHwQAIiEFACQiBgAmIwcAKCQIAColCQAsJgoALicL +ADAoDAA0KQ0AOCoOADwrDwBALBAAZC4RAGgvEgBsMBMAcDEUAHQyFQB4MxYAfDQXAIA1GACENhkA +iDcaAIw4GwCROhwAlTsdAJk8HgCdPR8AoT4gAKU/IQAkSQYCLEoKAjRLDQE8TA8BZE0RAWxOEwF0 +TxUBfFAXAYRRGQGVUh0BnVMfAQEEAAACBQEAAwYCAAQHAwAFCAQABgkFAAcKBgAICwcACQwIAAoN +CQALDgoADA8LAA0QDAAOEQ0AAUAABAJBAQQDQgIEBEMDBAVEBAQGRQUEB0YGBAhHBwQJSAgEBAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAQACAAIAAwAEAAQABQAGAAYABwAIAAgACQAKAAoACwAMAAwADQAO +AA4ADwAmACcAKAApACoARgBGAEcASABIAEkASgBKAEsATABoAGkAagBqAGsAbABsAG0AbgBuAG8A +cABwAHEAcgByAHMAcwB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AAoAPwAA +AAAAAAAAAAAAAAAAAAAAAQABAAIAAwADAAQABQAFAAYABwAHAAgACQAJAAoACwALAAwADAANAA4A +IwAkACUAJgAnACgAKQBEAEUARgBGAEcARwBIAEgASQBJAEoASwBoAGgAaQBqAGsAbABtAG0AbgBv +AG8AcABxAHEAcgByAHMAcwBzAHMAcwBzAHMAcwBzAHMAcwBzAHMAcwBzAHMAcwBzAAoAPwAAAAAA +AAAAAAAAAAAAAAAAAQACAAIAAwAEAAQABQAGAAYABwAIAAgACQAKAAoACwAMAAwADQAOAA4ADwAm +ACcAKAApACoARgBGAEcASABIAEkASgBKAEsATABoAGkAagBqAGsAbABsAG0AbgBuAG8AcABwAHEA +cgByAHMAcwB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AAoAPwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAABAAEAAgADAAMABAAFAAUABgAHAAcACAAJAAkACgAKAAsAJAAlACUA +JgAnACgAKABEAEUARgBGAEcASABIAEkASgBKAEsATABoAGgAaQBqAGsAbABtAG0AbgBvAG8AcABx +AHEAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAAoAPwCAX4AAAAAAALIM +yAD/////////AAH//wID////BP//////////////////////Bf8G/wf/CP8J/wr/C/8M////Df// +/w7///8P////EP//////////////////////////////////////////////Ef///xL///8T//// +FP///xX///8W////F////xj///8Z////Gv///xv/////HP///x3///8e////H////yD///8h//// +//////////////////8iIyT/JSYn//8o////Kf////////////////////////////////////// +////////////////////////////////////////AAABAAEBAAAAAAAAAAEAAAAAAAAAAAAAAAAA +AAMAAAAAAAAAAQAAAAAAAABIKQEAAAAAALBqAAABAAAAHNEBAAIAAACQ0AEAAwAAAJAbAgAEAAAA +SCkBAAUAAAB0DwEABgAAALDiAAAHAAAA/A8BAAgAAAC4PQAACQAAAEBeAAAKAAAAhMEAAAsAAADE +NwAADAAAAJAeAgANAAAA6NsAAA4AAAAo3AAADwAAAOTbAAAQAAAAJNwAABEAAADMPAEAEgAAAKTn +AQATAAAAhDEAABQAAAAgZAEAFQAAADhQAQAWAAAAHGABABcAAAD8zwEAGAAAAIyJAQAZAAAANAIB +ABoAAABEKQEAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI +jgAASI4AAEiOAAA8eQAASI4AAEiOAACgeQAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiO +AABIjgAAvH8AAAR/AAD0fgAAbH4AACx/AABUfgAASI4AAEiOAACYhQAAaIgAABSKAABIjgAASI4A +AEiOAACwjQAAsIQAAOiEAABUhAAASI4AAEiOAABIjgAAbI0AAEiOAAA0hAAASI4AAEiOAABIjgAA +SI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiOAABI +jgAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiO +AABgegAASI4AAEiOAABIjgAASI4AAEiOAADQigAASI4AAEiOAABIjgAASI4AAEiOAADEegAASI4A +ADB8AADQewAAYHsAAMB7AAD4dgAASI4AAMx2AABIjgAASI4AAEiOAABIjgAASI4AAEiOAABIjgAA +SI4AAFh2AABIjgAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiOAABI +jgAASI4AAEiOAABIjgAASI4AABh+AABIjgAASI4AANx/AABIjgAASI4AAEiOAABIjgAASI4AACSB +AAAMgAAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiOAABIfAAASI4A +AEiOAABIjgAASI4AAEiOAABIjgAASI4AAASNAABIjgAAZI0AAHCKAABIjgAASI4AAKx0AAAwigAA +SI4AAEiOAAB0fgAAjH4AAEiOAABIjgAAgHoAADx3AABIjgAASI4AAEiOAADwhAAAPH4AAEiOAABI +jgAASI4AAEiOAABIjgAASI4AAHx9AABIjgAAcI4AAPyOAADcjgAAFI8AAKiOAACQjgAAHI8AAGyO +AABIjgAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAIh6AABIjgAASI4AAEiOAABIjgAASI4A +AEiOAABIjgAASJEAAFSSAABYdQAAzHUAAEiOAABIjgAASI4AAEiOAABIjgAAbHcAAEiOAABIjgAA +SI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AANyPAAAgjwAAjJAAAHCQAACw +jwAAOI8AAKSQAABYkAAASI4AAEiOAABIjgAASI4AAEiOAABIjgAASI4AAEiOAACgdwAAjHgAACx4 +AAC8kAAA5HUAABR5AACseQAASI4AAEiOAABIjgAASI4AAJh5AACceQAASI4AAEiOAABAeQAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAABJ0AAEybAABongAAdJ0AAHyfAAAAAAEA/////wAAAAD//////////wEAAAD4 +EwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAND+AAAAAAAAAAAYIKAAICCgAEAh +oABIIaAAHCCgACQgoABEIaAATCGgACggoAAwIKAAaCGgAHAhoAAsIKAANCCgAGwhoAB0IaAAOCCg +ADwgoAB4IaAAfCGgAJgRAAAA/wMAUBMAAAD/BQDcEQAAAP8tALgRAAAA/z0ANBEAAAD/BABcEQAA +AP8lABTEAAAA/90AbBIAABAQTAA4EwAAAP8iAAASAAAA/yYA2BIAAAD/KACkEgAAAP8gAATDAAAA +IAAASMIAAAD/MAAAAAAAAAAAAAABAQA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PBUV +FRU8PDw8FRUVFTw8PDwAAAAAAAAAAAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8 +PDw8PDwVFRUVPDw8PBUVFRU8PDw8AAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8 +PDw8PDw8PDw8PDw8FRUVFTw8PDwVFRUVPDw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAB8AAEAjKoAAKAj +AACMqgAAjKoAAIyqAACEDAAAtN4BAAzRAACMqgAAjKoAAJw0AACcNAAAnDQAAJw0AACcNAAAnDQA +AJw0AACMqgAAjKoAAIyqAACMqgAAyFUAAIyqAACMqgAAjKoAAIyqAACMqgAA8NAAAIyqAACMqgAA +iMEAAAAAAABg5wAAZOcAALQCAACgAgAA4DsBAAAAAABEuAAATL0BAGy4AAB0vQEAkLgAAJy9AQDw +n4AAmDiAAFyagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQhAAAsIQAA3LqAAAAC +AAAAAAAA5PYAALT2AADcvIAAQAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOj2AAC8OAEAbMOA +AFQAAAAAAAAA5PYAAJA3AQAcwoAAUAEAAAAAAADk9gAAmDIBAPQJgAAIAAAAAQAAAOT2AACw9QAA +AAAAAFABAAAAAAAA5PYAACQzAQAwMYAAAgAAAAAAAADk9gAAMDIBAPAJgAAEAAAAAAAAAOz2AAC0 +9gAAwMOAACoAAAAAAAAA5PYAALT2AADQPoAABAAAAAAAAAAAAAAAvPYAAAAAAAAAAAAAAQAAAAAA +AADQ9gAAAAAAAAAAAAAAAAAAAAAAALj2AAAAAAAAAAAAAAAAAADk9gAAwL8BAAAAAAAAAAAAAAAA +AOT2AACAvwEA/AmAAAQAAAAAAAAAbgBuAGkAwACgAFAAgAC+AFABfQA+AAAAAAAAAJwCBADmASUA +VQMEANwBYwAAAG4AbgBpAMAAoABQAIAAvgBQAX0APgAAAAAAAACcAgQA5gElAFUDBADcAWMAAAAA +AAAAAQEAAMT/AAAV0gAAAAAAAP8DAADE/wAADNIAAAAAAAD/AQAAxP8AABXSAAAKAAAAAPwPAMT/ +AAAM0gAACQAAAAD+AwDE/wAAFdIAABQAAAAAAPA/xP8AAAzSAAASAAAAAAD8B8T/AAAG0gAAAAAA +AP8BAADE/wAAB9IAAAAAAAD/AwAAxP8AAAbSAAAJAAAAAP4DAMT/AAAH0gAACgAAAAD8DwDE/wAA +BtIAABIAAAAAAPwHxP8AAAfSAAAUAAAAAADwPwAAAAAAAAAAAAAAAAEAAAABAAAACgAAAAUAAAAF +AAAABgAAAAoAAAAKAAAABgAAAAQAAAAFAAAABgAAAAUAAAAFAAAABgAAAAYAAAAGAAAABgAAAAcA +AAAHAAAABwAAAAgAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAABAAAAAgAA +AAEAAAABAAAAAwAAAAMAAAACAAAAAQAAAAQAAAAAAAAAAAAAAAIAAAABAAAAAQAAAAAAAAAAAAAA +BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAACwBAABeAQAAAQAAAAEA +AAABAAAAAQAAAAMAAAAAAAAAAAAAAJwJAQAADgEA8AwBAGwOAQD8DQEANAwBAGgOAQDECgEAwAoB +AGDjFgAg1hMAAAAAABAAAAAAgAAAAACgABAnAADoAwAA6AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAgAAAAIAAAABAAAAAQAAAAIAAAAFAAAAAgAAAAIAAAAFAAAAAgAAAAIAAAABAAAAAQAAAAUA +AAAFAAAAAgAAAAUAAAAFAAAAAAAAAAUAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAUAAAAFAAAAAAAA +AAUAAAACAAAAAgAAAAUAAAAFAAAABQAAAAAAAAAFAAAAAgAAAAUAAAABAAAAAQAAAAIAAAACAAAA +AgAAAAUAAAAFAAAAAgAAAAUAAAABAAAAAQAAAAIAAAACAAAAAgAAAAUAAAAFAAAAAgAAAAIAAAAF +AAAAAQAAAAIAAAAFAAAAAgAAAAUAAAAFAAAABAAAAAUAAAAFAAAAAQAAAAUAAAAFAAAABQAAAAIA +AAACAAAABQAAAAUAAAAFAAAAAQAAAAUAAAAFAAAABQAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAABEAABAAAAAoAAAUIABgIQAAIgAAADwAAB +QwAGAxAAAsAAAAPAAAFDAAYEEAACQAAAAoAAAUQABgURAABAAAADwAABRQAGBhEAAOAAAAPAAAFF +AAYHEQABAAAAAoAAAUYABggRAAIgAAADwAABRwAGCREAAsAAAAPAAAFHAAYKEQACQAAAAoAAAUgA +BgsSAABAAAADwAABSQAGDBIAAOAAAAPAAAFJAAYNEgABAAAAAoAAAUoABg4SAAIAAAACgAABTAAG +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAECAQEAAgEAAQICAgABAQACAQIBAgACAAECA4CAgICAgICAAYACgICAgIDAAJAA +0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG4AAABuAAIAbgBuAG4A +AgBpAGkAbgABAMAAwADoAAEAoACgADYBAwBQAFAA9QABAIAAgADoAAEAvgC+AL4AAQBQAVABUAEB +AH0AfQCvAAMAPgA+AD4AAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQCcApwCnAIBAAQABAAEAAEA +5gHmAeYBAQAlACUAJQABAFUDVQNVAwEABAAEAAQAAQDcAdwB3AEBAGMAYwBjAAEAAAAAAAAAAAAy +AAUAMgAFAAIACABkAKAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKPGAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAIwKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABw2wEA +FQAAAAMAAADEQoAAAAAAAAAAAAAAAAAAvNoBAAUAAAADAAAAxEKAAAAAAAAAAAAAAAAAALDaAQAK +AAAAAwAAAMRCgAAAAAAAAAAAAAAAAAB82AEACgAAAAMAAADEQoAAAAAAAAAAAAAAAAAAzNkBAAoA +AAAAAAAA5EKAAAAAAAAAAAAAAAAAAMzZAQAKAAAAAAAAAORCgAAAAAAAAAAAAAAAAADM2QEACgAA +AAAAAADkQoAAAAAAAAAAAAAAAAAAzNkBAAoAAAAAAAAA5EKAAAAAAAAAAAAAAAAAAMzZAQAKAAAA +AAAAAORCgAAAAAAAAAAAAAAAAADM2QEACgAAAAAAAADkQoAAAAAAAAAAAAAAAAAAzNkBAAoAAAAA +AAAA5EKAAAAAAAAAAAAAAAAAAMzZAQAKAAAAAAAAAORCgAAAAAAAAAAAAAAAAADM2QEACgAAAAAA +AADkQoAAAAAAAAAAAAAAAAAAzNkBAAoAAAAAAAAA5EKAAAAAAAAAAAAAAAAAAMzZAQAKAAAAAAAA +AORCgAAAAAAAAAAAAAAAAADM2QEACgAAAAAAAADkQoAAAAAAAAAAAAAAAAAA3NoBAAoAAAADAAAA +xEKAAAAAAAAAAAAAAAAAADTcAQAFAAAAAwAAAMRCgAAAAAAAAAAAAAAAAADU1wEACgAAAAAAAADk +QoAAAAAAAAAAAAAAAAAARNgBAAoAAAAAAAAA5EKAAAAAAAAAAAAAAAAAAHTmAQAKAAAAAwAAAMRC +gAAAAAAAAAAAAAAAAACo2AEACgAAAAAAAADkQoAAAAAAAAAAAAAAAAAAUNkBAAoAAAAAAAAA5EKA +AAAAAAAAAAAAAAAAANDZAQAKAAAAAAAAAORCgAAAAAAAAAAAAAAAAABQ2gEACgAAAAAAAADkQoAA +AAAAAAAAAAAAAAAAdNsBAAoAAAAAAAAA5EKAAAAAAAAAAAAAAAAAAOTbAQAKAAAAAAAAAORCgAAA +AAAAAAAAAAAAAAAQ3AEABgAAAAAAAADkQoAAAAAAAAAAAAAAAAAAINwBAAYAAAAAAAAA5EKAAAAA +AAAAAAAAAAAAAAAAAADEQoAAxEKAALggoABsIKAAAIABAP9//P8AAAAAAAAAAORCgADkQoAApCCg +ADggoAABAAAA/P///wAAAAAAAAAABEOAAARDgACoIKAAPCCgABAAAADH////AAAAAAAAAAAkQ4AA +JEOAAKwgoAB4IaAAQAEAAD/+//8AAAAAAAAAAERDgABEQ4AAsCCgAHwhoAAADAAA//H//wAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAKDYAQAVAAAAAwAAAMRCgAAAAAAAUAAAAAAAAACACYAAuKOAABgA +AAB4o4AAAAAAAAAAAAAAAAAAgAmAALijgAAYAAAAeKOAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAH8A +AAAAAAAAAAAAAAAAAKCFgAAAAAAAAAAAAP//AAABAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAQID +BAQEBAQFBgcICAgICAkKCwwNAABuO2g7YjtcO246aDpiOlw6bjloOWI5XDluOGg4YjhcOG43aDdi +N1w3biloKWIpXCluKGgoYihcKG4naCdiJ1wnbhloGWIZXBluGGgYYhhcGG4XaBdiF1wXbhZoFmIW +XBZuFWgVYhVcFW4UaBRiFFwUbhNoE2ITXBNuEmgSYhJcEm4RaBFiEVwRbhBoEGIQXBBuAmgCYgJc +Am4BaAFiAVwBbgBoAGIAXABUAAAAbjtoO2I7XDtuOmg6YjpcOm45aDliOVw5bitoK2IrXCtuKmgq +YipcKm4paCliKVwpbihoKGIoXChuJ2gnYidcJ24maCZiJlwmbiVoJWIlXCVuJGgkYiRcJG4jaCNi +I1wjbiJoImIiXCJuIWghYiFcIW4gaCBiIFwgbhJoEmISXBJuEWgRYhFcEW4QaBBiEFwQVxBSEE0Q +SRBuAWgBYgFcAW4AaABiAFwAVAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAMhaAQAIAAAAAwAAAMRCgAD4CoAAeAuAAPgLgAB4DIAACg0RFAoNERQZGRkZ +CgoAAAAAAAAGBgYGCQkJCQAGAAAABQYHCA0ODxAVFhcYGQAAAAAAAAAAAAAADBSamhwkmpqampqT +mm6BPzUJiysAAAAyAAAAjwCMAIoAQwAPACBoNwAAABEAPjogEQAAAiUAAAwvAAACLzk5AAolPLdH +b4oABxQnYi4AAAIAFwAAFg4WFAAAAABCQhcABRAKIDBAAAAGBgoS9hX2BvYJ9gz2D/YA9gMAgAAA +AABYW2NjMQAADBAUGCAIBAAAPDg0MCwoJCAcGBQQDAgEAAsHAwA7NzMvKycjHxsXEw8LBwMAOzcz +LysnIx8bFxMPCwcDMTE6Mzg6NDcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAIgAAAAAAAAAdAAAAAAAAAG8AAABQAAAA9gAAAFAAAAD3AAAAgAAAAPgAAAAFAAAAMwAAAHMA +AAA3AAAAdAAAADsAAAAAAAAANAAAAHQAAAA4AAAAdwAAADwAAAADAAAAMQAAAAcAAAA1AAAABwAA +ADkAAAAAAAAAMgAAAH8AAAA2AAAAfwAAADoAAAAAAAAAHwAAAAAAAAAgAAAAAAAAACEAAAAAAAAA +CAAAAAEAAABxAAAAEQAAAOoAAACqAAAA6wAAAAoAAABqAAAAAAAAAA0AAAB4AAAADgAAACcAAAAP +AAAAIAAAABAAAAACAAAA8wAAAAAAAAD0AAAAAAAAAPUAAAAAAAAAAAAAAAEBAQEBAQEBAgICAgIC +AgIDAwMDAwMDAwECAAAEAAAABQAAAAAAAAAAAAAAAAAAAAAAAADhAw4e4QAAAOEDDh7hAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAOEDDh7hAAAAFfZj9rD2/PZG95D32Pcf+GX4qfjt+C/5cPmw+e75K/pn+qL6 +3PoU+0v7gfu2++r7HPxN/H38q/zZ/AX9MP1Z/YL9qf3P/fT9F/45/lr+ev6Y/rb+0v7t/gb/Hv81 +/0v/YP9z/4X/lv+m/7T/wf/N/9j/4f/p//D/9v/6//3//////////f/6//b/8P/p/+H/2P/N/8H/ +tP+m/5b/hf9z/2D/S/81/x7/Bv/t/tL+tv6Y/nr+Wv45/hf+9P3P/an9gv1Z/TD9Bf3Z/Kv8ffxN +/Bz86vu2+4H7S/sU+9z6ovpn+iv67vmw+XD5L/nt+Kn4Zfgf+Nj3kPdG9/z2sPZj9nC5g7qWu6q8 +vr3Svue//MARwifDPcRTxWrGgMeXyK/Jxsrey/bMD84nz0DQWdFy0ozTptS/1drW9NcO2SnaRNtf +3Hrdlt6x383g6eEF4yHkPuVa5nfnk+iw6c3q6usH7STuQu9f8H3xmvK489X08/UR9y/4TPlq+oj7 +pvzE/eL+AAAeATwCWgN4BJYFtAbRB+8IDQorC0gMZg2DDqEPvhDcEfkSFhQzFVAWbReJGKYZwhrf +G/scFx4zH08gaiGGIqEjvCTXJfImDCgmKUEqWit0LI4tpy7AL9kw8TEKMyI0OjVRNmk3gDiWOa06 +wzvZPO89BD8ZQC5BQkJWQ2pEfUWqqgMAAAAAAKqqAwAA+AAAAKoD////AABQp/RRU2VBfsOkFxqW +Xic6y2urO/FFnR+rWPqskwPjS1X6MCD2bXatkXbMiCVMAvX81+VP18sqxYBENSaPo2K1SVqx3mcb +uiWYDupF4cD+XQJ1L8MS8EyBo5dGjcb502vnX48DlZySFet6bb/aWVKVLYO+1NMhdFgpaeBJRMjJ +jmqJwnV4eY70az5Ymd1xuSe2T+G+F62I8GasIMm0Os59GErfY4IxGuVgM1GXRX9TYuB3ZLGErmu7 +HKCB/pQrCPlYaEhwGf1Fj4ds3pS3+HtSI9Nzq+ICS3JXjx/jKqtVZgco67IDwrUvmnvFhqUIN9Py +hygwsqW/I7pqAwJcghbtKxzPipK0eafw8gfzoeJpTs302mXVvgUGH2I00Yr+psSdUy40oFXzojLh +igV16/akOeyDC6rvYEAGn3FeURBuvfmKIT49Bt2WrgU+3Ua95k21jVSRBV3EcW/UBgT/FVBgJPuY +GZfpvdbMQ0CJd57ZZ71C6LCIi4kHOFsZ59vuyHlHCnyh6Q9CfMkehPgAAAAAg4aACUjtKzKscBEe +TnJabPv/Dv1WOIUPHtWuPSc5LTZk2Q8KIaZcaNFUW5s6LjYksWcKDA/nV5PSlu60npGbG0/FwICi +INxhaUt3WhYaEhwKupPi5SqgwEPgIjwdFxsSCw0JDq3Hi/K5qLYtyKkeFIUZ8VdMB3Wvu92Z7v1g +f6OfJgH3vPVyXMU7ZkQ0fvtbdilDi9zGI8to/O22Y/HkuMrcMdcQhWNCQCKXEyARxoR9JEqF+D27 +0hEy+a5toSnHSy+eHfMwstzsUoYN0OPBd2wWsyuZuXCp+kiUESJk6UfEjPyoGj/woNgsfVbvkDMi +x05Jh8HRONn+osqMNgvUmM+B9aYo3nqlJo632qS/rT/knTosDZJ4UJvMX2piRn5UwhON9ui42JBe +9zku9a/Dgr6AXZ98k9BpqS3Vb7MSJc87mazIp30YEG5jnOh7uzvbCXgmzfQYWW4Bt5rsqJpPg2Vu +leZ+5v+qCM+8IeboFe/Zm+e6zjZvStQJn+rWfLApr7KkMTEjPyowlKXGwGaiNTe8TnSmyoL8sNCQ +4BXYpzNKmATx99rsQQ5QzX8v9pEXjdZNdk2w70NUTarM3wSW5OO10Z4biGpMuB8swX9RZUYE6l6d +XTWMAXN0h/ouQQv7Wh1ns1LS25IzVhDpE0fWbYxh15p6DKE3jhT4WYk8E+vuJ6nONclht+3lHOE8 +sUd6Wd/SnD9z8lV5zhQYvzfHc+rN91Nbqv1fFG8934bbRHiB86/KPsRouSw0JDhfQKPCcsMdFgwl +4ryLSTwoQZUN/3EBqDneswwInOS02JDBVmRhhMt7cLYy1XRcbEhCV7jQUglq1TA2pTi/QKOegfPX ++3zjOYKbL/+HNI5DRMTe6ctUe5QypsIjPe5MlQtC+sNOCC6hZijZJLJ2W6JJbYvRJXL49mSGaJgW +1KRczF1ltpJscEhQ/e252l4VRlenjZ2EkNirAIy80wr35FgFuLNFBtAsHo/KPw8Cwa+9AwETims6 +kRFBT2fc6pfyz87wtOZzlqx0IuetNYXi+TfoHHXfbkfxGnEdKcWJb7diDqoYvhv8Vj5LxtJ5IJrb +wP54zVr0H92oM4gHxzGxEhBZJ4DsX2BRf6kZtUoNLeV6n5PJnO+g4DtNrir1sMjruzyDU5lhFysE +frp31ibhaRRjVSEMfaVjY8aEfHz4mXd37o17e/YN8vL/vWtr1rFvb95UxcWRUDAwYAMBAQKpZ2fO +fSsrVhn+/udi19e15qurTZp2duxFysqPnYKCH0DJyYmHfX36Ffr67+tZWbLJR0eOC/Dw++ytrUFn +1NSz/aKiX+qvr0W/nJwj96SkU5ZycuRbwMCbwre3dRz9/eGuk5M9aiYmTFo2NmxBPz9+Avf39U/M +zINcNDRo9KWlUTTl5dEI8fH5k3Fx4nPY2KtTMTFiPxUVKgwEBAhSx8eVZSMjRl7Dw50oGBgwoZaW +Nw8FBQq1mpovCQcHDjYSEiSbgIAbPeLi3ybr681pJydOzbKyf591deobCQkSnoODHXQsLFguGho0 +LRsbNrJubtzuWlq0+6CgW/ZSUqRNOzt2YdbWt86zs317KSlSPuPj3XEvL16XhIQT9VNTpmjR0bkA +AAAALO3twWAgIEAf/PzjyLGxee1bW7a+amrURsvLjdm+vmdLOTly3kpKlNRMTJjoWFiwSs/PhWvQ +0Lsq7+/F5aqqTxb7++3FQ0OG101NmlUzM2aUhYURz0VFihD5+ekGAgIEgX9//vBQUKBEPDx4up+f +JeOoqEvzUVGi/qOjXcBAQICKj48FrZKSP7ydnSFIODhwBPX18d+8vGPBtrZ3ddrar2MhIUIwEBAg +Gv//5Q7z8/1t0tK/TM3NgRQMDBg1ExMmL+zsw+FfX76il5c1zEREiDkXFy5XxMST8qenVYJ+fvxH +PT16rGRkyOddXborGRkylXNz5qBgYMCYgYEZ0U9Pnn/c3KNmIiJEfioqVKuQkDuDiIgLykZGjCnu +7sfTuLhrPBQUKHne3qfiXl68HQsLFnbb26074ODbVjIyZE46OnQeCgoU20lJkgoGBgxsJCRI5Fxc +uF3Cwp9u09O976ysQ6ZiYsSokZE5pJWVMTfk5NOLeXnyMufn1UPIyItZNzdut21t2oyNjQFk1dWx +0k5OnOCpqUm0bGzY+lZWrAf09PMl6urPr2Vlyo56evTprq5HGAgIENW6um+IeHjwbyUlSnIuLlwk +HBw48aamV8e0tHNRxsaXI+joy3zd3aGcdHToIR8fPt1LS5bcvb1hhouLDYWKig+QcHDgQj4+fMS1 +tXGqZmbM2EhIkAUDAwYB9vb3Eg4OHKNhYcJfNTVq+VdXrtC5uWmRhoYXWMHBmScdHTq5np4nOOHh +2RP4+OuzmJgrMxERIrtpadJw2dmpiY6OB6eUlDO2m5stIh4ePJKHhxUg6enJSc7Oh/9VVap4KChQ +et/fpY+MjAP4oaFZgImJCRcNDRrav79lMebm18ZCQoS4aGjQw0FBgrCZmSl3LS1aEQ8PHsuwsHv8 +VFSo1ru7bToWFiz///8A////Af8CA////wQF/wn/BwoGCAsAAQECAQICAwEBAQEBAQEBAgICAgIC +AgIDAwMDAwMDAwQEBAQEBAQEAQICAgICAgMDAwMDAwMDAwMDAwMDBAQEBAQEBAQEBAQEBAQEBAQE +BAQEBAQEAAAAOgECAdUA3wDaAKIAdQB/AIoFKgM5AagBigXKAtkASAEBAw8HChQ3bmoBGgHZAOgA +CgG6AHkAiADKAUoB4gD5AMoB6gCCAJkAdNFFF+iiiy4ABQcBAwQABQEFAAAABQYAAgQABQAFAAAB +AgECAwQAAAUGBwgJCgAABQAAAAAAAAABAAAAAgAAAAMAAAAAAAAABAAAAAIAAAAFAAAAAAD/AAD/ +//8oACgAMAAsACwAKAA8ADQAQAA8AIwAbABYAEgA9ACwAH//Bw8fPwEDMAAAADYAAAAMAAAAEgAA +ABgAAAAkAAAABgAAAAkAAAAFAAcCAwQGBkADgAbACQANgBMAGkAdgCCABgANgBMAGgAnADSAOgBB +wAmAE0AdACeAOgBOwFeAYZkDMwfZCnMOphXmHIAgGSQzB3MOphXmHFkrzDkAQTNI2QqmFYAgWSsA +QaZWgGFZbJ3YiZ1O7MRONEiDNCd2YicapEEaEzuxExEYgREP/MAPTuzETid2YicapEEaEzuxEw3S +IA2JndgJCIzACAd+4Ac0SIM0GqRBGhEYgREN0iANCIzACAZpkAawstUFBVRABSd2YicTO7ETDdIg +DYmd2AkGaZAGxE7sBARGYAQDP/ADqqqqqhqkQRoTO7ETD/zADxEYgREN0iANCqiAChM7sRMP/MAP +D/zADw3SIA0LtEALC7RAC4md2AkN0iANCqiACgqogAoIjMAIB3iABwd4gAcGaZAGD/zADw3SIA0L +tEALDdIgDQu0QAuJndgJCIzACImd2AkIjMAIB37gBwd+4AfBLCkHCqiACgiMwAgHeIAHCIzACAd4 +gAcGaZAGsLLVBQZpkAawstUFBVRABQVUQAXWHcYEAQcPHz9///9m5gAABQYBAgMEAABUAFQAbABg +AFwAVACMAHgADQ8FBwkLAQMoACgANAAwACwALABEADwALAAsADwANAAwACwAVABEAFVVVQFLaC8B +VVVVBeM4jgOqqqoCcRzHAaqqqgrHcRwHAAQAAGQAAAAAAAAADwA/AAEAAAAPAD8AAQAAAA8APwAB +AAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAIAAAAPAD8AAQAAACIWAACAAAADAAABWQAA +JBYAAQAAAAMAAAFaAAAmFgACAAAABAAAAVoAACgWAAIAAAADAAABWwAAKhYAAoAAAAMAAAFcAAAs +FwAAAAAABAAAAVwAAC4XAACAAAADAAABXQAAMBcAAQAAAAMAAAFeAAA0FwACAAAAAwAAAV8AADYX +AAKAAAADAAABYAAAOBgAAAAAAAQAAAFgAAA8GAABAAAAAwAAAWIAAD4YAAIAAAAEAAABYgAAQBgA +AgAAAAMAAAFjAABkGwACAAAAAwAAAW8AAWYbAAKAAAADAAABcAABaBwAAAAAAAQAAAFwAAFsHAAB +AAAAAwAAAXIAAW4cAAIAAAAEAAABcgABcBwAAgAAAAMAAAFzAAJ0HQAAAAAABAAAAXQAAnYdAACA +AAADAAABdQACeB0AAQAAAAMAAAF2AAJ8HQACAAAAAwAAAXcAA34dAAKAAAADAAABeAADgB4AAAAA +AAQAAAF4AAOEHgABAAAAAwAAAXoAA4YeAAIAAAAEAAABegAEiB4AAgAAAAMAAAF7AASMHwAAAAAA +BAAAAXwABJEfAAFAAAADAAABfgAElR8AAwAAAAQAAAF/AAWXHwACwAAAAwAAAYAABZkgAABAAAAD +AAABgQAFnSAAAUAAAAMAAAGCAAWfIAABwAAAAwAAAYMABaEgAAMAAAAEAAABgwAFpSEAAEAAAAMA +AAGFAAWQcQEAAAAAAJBxAQAAAAAAkHEBAAAAAACQcQEAAAAAAJBxAQAAAAAAkHEBAAAAAACQcQEA +AAAAAJBxAQAAAAAAjGsBABgAAABQbQEAIAAAALByAQAUAAAApHMBABQAAAD8cAEADgAAANBvAQAO +AAAA0HABABQAAADQcAEAFAAAAEADQEBAQEBAAYEAhEBAQDUBQAE1QJUAAAAAAAAAAAAAZAAAAACQ +AQAKAAAA2KIBAGymAQBwpAEAFKABAJSqAQDsrAEAEKgBAJSlAQBkqQEABAAAABwRAAAcMgAAHDMA +AAQAAAAcFQAAHAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApcaE+JnujfYN/73Wsd5UkVBgAwKpzn1W +GediteZNmuxFj50fQImH+hXv67LJjgv77EFns/1f6kW/I/dTluRbm8J1HOGuPWpMWmxBfgL1T4Nc +aPRRNNEI+ZPic6tTYj8qDAhSlWVGXp0oMKE3Dwq1LwkONiSbGz3fJs1pTs1/n+obEp4ddFguNC02 +stzutPtb9qRNdmG3zn17Uj7dcV6XE/WmaLkAACzBYEAf48h57ba+1EaN2WdLct6U1JjosEqFa7sq +xeVPFu3FhteaVWaUEc+KEOkGBIH+8KBEeLol40vzov5dwICKBa0/vCFIcATx32PBd3WvY0IwIBrl +Dv1tv0yBFBg1Ji/D4b6iNcyIOS5Xk/JVgvxHeqzI57orMpXmoMCYGdGef6NmRH5UqzuDC8qMKcfT +azwoeafivB0Wdq0721ZkTnQeFNuSCgxsSOS4XZ9uve9DpsSoOaQxN9OL8jLVQ4tZbrfajAFksdKc +4Em02PqsB/Mlz6/KjvTpRxgQ1W+I8G9KclwkOPFXx3NRlyPLfKGc6CE+3ZbcYYYNhQ+Q4EJ8xHGq +zNiQBQYB9xIco8Jfavmu0GmRF1iZJzq5JzjZE+uzKzMiu9JwqYkHpzO2LSI8khUgyUmH/6p4UHql +jwP4WYAJFxraZTHXxoS40MOCsCl3WhEey3v8qNZtOiwAAQIEBAAAAAQMDAgEDAQEQAAAAIAAAAAA +AQAAAAIAAEAAAAAABAAAQAAAAEAAAAAA8GEAAAEBAgECAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAABkAAAAKgAAAA4AAAAAAAEBAAAAAAAAAAAAAQEAAAAAAgABAAICAwMDAQIE/wgQ//802wEA +QNsBAEzbAQBY2wEAYNsBAGjbAQAAAAABAAAAAgAAAAQAAAAIAAAAEAAAACAAAABAAAAAgAAAABsA +AAA2BAIEAgAAAAABAhAECAAAAAIQBAgAAAAAAQEAAQIBAQEAAAAAAAAAAP////8AAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIANAAAAIAAAgA0AAIANAAAAIAAAgA0A +AAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAALT8AQAgIIAPAABAAGkgAABpIEAA +aSAAAGkgQAAgIIAPAADoAGkgAABpIEAAaSAAAGkgQAAgIIAPAADI42kgAABpIEAAaSAAAEogAABK +IQAASiIAAEojAABKJAAASiUAAEomAABKJwAASiAAEEohABBKIgAQSiMAEEokABBKJQAQSiYAEEon +ABBKIAAgSiEAIEoiACBKIwAgSiQAIEolACBKJgAgSicAIEogADBKIQAwCiSAP4EAAEBBLJwwQCyc +MEIkHDQKIoA/gADYYgojADf6D4AGSiYAcGkgQABKJgBwSiYAcEomAHBKJgBwABYAcIAAVCtAeCAg +QIcAAAAAAAAAAAAA/ByItvwcSLb8HAi2/BzItfwciLX8HEi1/BwItfwcyLT8HIi0/BxItPwcCLT8 +HMiz/ByIs/wcSLPgfuB4BNw43TXw4HgE3DTdM/DgeATcMN0x8OB4BNws3S/w4HgE3CjdLfDgeATc +JN0r8OB4BNwg3Snw4HgE3BzdJ/DgeATcGN0l8OB4BNwU3SPw4HgE3BDdIfDgeATcDN0f8OB4BNwI +3Rzw4HgE3ATdGfA0FBowMBQZMCwUGDAoFBcwJBQWMCAUFTAcFBQwGBQTMBQUEjAQFBEwDBQQMALH +AcawJE0zsCQfM+B+4HjgeOB44HjgeOB4CiSA8AUgRADgIMEHRCT+gEEqxACEAAIALyQC8UIhAQFC +IAMB6CCiBAQRBAIEEQUCBBEGAgQRBwIEGwgBBBtIAQQbiAEEG8gBLAAlAEQiPoE8ACIARCL8gEAh +wQDgIMEHQCPDAKgggAEBEYQCARsKASAgwAcEEQQCBBEFAgQbCAHUB+H/BBtIAUQi/IAEEQQCyQfv +/wQbCAFCIUEAQiBDAKgggAEBEYQCARsKASAgwAfPcaAArC8YgZq4GKERB2APBdjgeM9xoACsLxiB +s7i6uBih/QZgD2TYCiJAgADZ7gABAC8mAPBKJkAATgAGAE8AIACKJf8P4HgKIkCAANnOAAEAbAAk +AC8mAPBcAAUAKwg1CEomQAAIcQDYAiG+gOAgxQdCeQHgAiG+gOAgxQdCeesH7/8B4C8tAQBAJUUA +AiZ88QAAIAAAKEAB6CBiAy8gAIAvIUsAAiG+gMAghgHCIYYA4H4RACAASiAAEEogQBAOIkIALyAL +Es4gRYCKJf8PCAAFAC8tAQBAJUUAAiZ88QAAIAAAKEABSiZAAOggIgMvIACALyFLAAIhvoDAIIYB +wiGGAEomAABCIP6QziCCAUQgfpDOIYIB4H4JAAAA4HgKJgDwiiC/D8ogZADgfy8gAwDgf4og/w/8 +HIix/BxIsfwcCLHhw+HC4cHhwAfAHBzAMeHA4H8BwFMiQoHgfE4iA4gWAAwAASjMAAApgQAAKIAA +4H+FeU4jAwAAKMEA4H8CeOB4UyJCgeB8TiIDiBYADAAAKcwAASmBAAEogADgf4V4TiMDAAEpwADg +fyJ54HgIdADYBSp+AC9xBSo+AwAgQI4BIcEOBSs+A+B/J3HgeDMAIABKJAAAByHEAC8mQPBKJQAA +EAAmAC8kBAEOIECBAyVBAIDjDgADAA4iQoEDJcMABSOFgDABAQB5c0h0CHIocwolwIJKIgAQGgAE +AMAiIRjKJQGDLy9BAcAiYxDAIsMRSicAAAolwIDAJyEIFgAEAMolgYAvKEEBwCdjAMAnAwAOJ4eC +yickAEAnRwAKJcABTCcAiADZEAAkAADYSHFocgDbQicHiAokQHEoAAEATicKiH4AAQAAKYACASnB +AQAqhQKgcQEqwgEAK4UCASvDAaByTCIAmGoACQCoIIAFACAAgAEhQYABIoKAASPDAAIiAoMDI8OC +DAAGAAAiAoMBI8OCwCBmAEIkPoBKJQAAIAABAAwACgAOIkKBAyXDAC8kAIEMAAMADiBAgQMlQQDg +fihwSHFocgDbICCADwAARAWoIIADACAAgAEhQYABIoKAkXLCIgYDxSBmACAggA8AAHgFANoJagDb +LyECACAggA8AAKAF4HhTIkKB4HxOIgOIFgAMAAApzAACKYEAASiAAOB/hXhOIwMAAinAAOB/QinB +B+HFCHUR8OB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4Yb2MJf+f7fXgf8HF4HjxwOHF +z3CAAOQsTYDPdYAAQJUghbe6uLoEIYEPAwAAAAe5RXktoLIIYA8A2ACFz3GAAKy9USCAgkyJz3CA +AIjMMmo2ecdxgABIyWCBVnhBgAXylbtgoau6BPC1u2Chi7pBoAuNo7j5Au//C63hxeHGwIBhgKCB +AYEAJY2TASDAAKCiAaLBxuB/wcXgeKLB8cBWCs//RcHPdYAA5CwnhRUIQQAwlRQUDjEJDkEQWR2C +ENAVARYdCEEAz3GAAPAvPJEUFA0xDQ1BEM9xgABIMFmpi+rPdYAA+ArBjYDmANnKIEEAJPIhrQsK +kQMB2B7wQSgNAgd9QSgBBKd5z3eAAPgKoI9TJUURHw0yBMa5CiHAD+tyz3AAAM0bn9vRBeAAiiSD +Dw8NnhEA2AzcJwLP/892gAAIzBYmTRGnjaCvyXUWJU0RAKUUFAAxRq3HcYAAyMgCtQCJB60AGUIB +ABtCAcfx8cCCCc//CMjPcqAAyB8OGhiACcgPGhiACsgQGhiACxIBNgLIJHgRGhiADMjPcYAAdEMt +GhiAAIEB4AChw7hXCFEDC8h/2Qq5JHgvKAEATiCCBwDYDyCAAAQhAYBCIo0CGfILI0DAF/TPcKAA +iCDwIFADz3aAAHRBAIbPd4AAeEENDQEQAIcScFwIQQagpgAfABRVAc//4Hif4cwg7ofMIE6ABvcC +eUFpCwoRCIoh/w8G8ADZDyGBAGG5GHngfyhw8cCyCO//iiAPCoIkAjqacXpyWnOIdah3CiGAIQog +wCHaCGAAnsGKcNIIYACLcYLGanDKCGAAyXFKcMIIYACEwalwughgAIbBiMXpcK4IYACpcSpwpghg +AIrBCnCeCGAAjMGpcIrBSgzgAJDCi3DJcT4M4ACSwslwhME2DOAAlMKGwKlxKgzgAJbCmMaQwJLB +2gygAMlymseUwJbBzgygAOlyyXDpcQoM4ACcwpzAnsHWCyAAjsKfxY4LoA8EbY7AMgkgACRttwgQ +AIbAisGCDe//QCUCE4twhMF2De//QCUCFZTAQCUBE4IMoADJcpDAQCUBFXYMoADpcslw6XGyC+AA +nMKMwJzBYgygAMlyfgygAMlwyXCOwW4LIABAJQIXksBAJQETRgygAMlylsBAJQEVOgygAOlyyXDp +cXIL4ACcwozAnMEmDKAAyXLJcI7BNgsgAEAlAhmuDyAAQCUAF89xgAB8CxChng8gAEAlABnPcYAA +fAsRoQfwANnPcIAAfAswoDGggQev/4AkAjrgeM9xgACcYuB/CGHgePHAKg+v/9hwKHZIcYh1Mg7v +/8lwCHepcCYO7/+ocQhxAC6AAwR/Jn8AK0ADJHhlB6//5XjxwKYJgAXPcYAA4CbwIQAAQHiA2c9w +oADQGzCg0cDgfmCAQIEBgCGBUHPMIEGA4SDBB8ogIQAwcIb2BPYJCsUA4H8B2Iog/w/gfuB4gOHK +JE1w6CBtAs9xoABQDCWBARhSAOB+8cCODo//z3CAAOQsA4AYiKXBSiAAIB0IEQEKIcAP63KKIIwN +ZNsKJAAEbQLgALhzz3WAAIQ/z3CAAEBJag1gDSQdABTPcIAAXEleDUANz3CAAARKUg1ADc9wgAAg +SkoNQA3Pd4AA9KBtj4DjnvJMj1BzOAEMAM9wgACIKwSAIIDPcIAAkJJAoGGgIqDPcIAAsNEIkCkL +AgDPcIAAsNHPcYAAGLtosAHez3CAAAC7zKEjgA0J5QABGAIEY6AQj4DgyiBiAAOlEY8T6JPqz3CA +AOQsA4AJgBsIngCyCuABB9gB2AGlz3CgACwgEIAApc9wgAD8OwCAHQhRAM9wgACw0c9xAAAQJyoP +r/8FgBB4A/AA2M9xgACougexA4UMGQQEYwhRAACBguDMIOKAA/QB2AChTBWAEE8IUQDPcKAALCDQ +gM9wAQAADkDAAdhBwAgcADQR2EPAANiMuETAANgQ2QTaCHOYcLhwACaHHwAAAH2uC+AE2HBLFYAQ +AeAPeEsdAhAMj4XoAYWA4GwMAQXPcIAAsEkSDEANAdnPcIAAyCMgoOoJ4AEG2EkFr/+lwOB4osHx +wN4Mr/+YckXBQSgBAgd5QSgCBCd6xrrPdYAAyMhJZV1lJwnfARQUDjHPc4AACMxocjZ64IILCMED +4pITD4ATJ4qnau8J3oEA2CfwxoqG7oDfz3CAAPgK4ajPd4AAOC0FjwsOARCA2AWvCfDPd4AASDAZ +jwsOARCA2Bmvxoo2ewAcgAMHioe5AK3PcIAA+ApAiCCoAdhHqwzcrwSP//HARgyP/0h1wYBAgWGB +AIB+D6//yXEApZkEr/8hpeB4ocHxwAMSAjfXcgAAAEAB2sIiigAXusdyAA4AAIO67HNAo+xyAKKK +C2AEKHDRwOB/ocDgeKXgH/IJ9i8I0AAzCBABOwhRAeB/Adi94A/yBvYrCFEL4H8C2MzgD/KMIEOH +DfTgfwbY4H8A2OB/A9jgfwTY4H8F2OB/B9gI2OB+4HjxwOHFz3WAABw6qXBAJYEbLg2gDC7aAdgB +BK//YR0CEPHAeguP/x8ItAAIdQohwA/rcv3Yi7hz20okAABpB6AAuHPPd4AAHDo3hwAlkB+AAHA6 +Dw1BEAwQgCCA4IzyMghgBwXYOnBELb4bACdAHkCQIZAA3gi6RXnPcqQAuD2bGlgAIpAMGIIjyhpY +ACOQt6fLGlgAJJDEGlgAJZDGGlgAJpDHGlgAJ5DCGlgAKJDDGlgAKZDFGlgACpCjGhgAz3CAAKA4 +IIBgeclwNwgQA89wgACgOCCAYHnJcCcIEATPcIAAoDgggGB5yXAXCFAEz3CAAKA4IIBgeclwCQiR +BADdz3CAAOQsA4AIgM9xpAC0RSEIHgBELb4bACdAHmyQS5B7e2V6UxmYgA2QVBkYgAbwUxmYg1QZ +mINELb4bJ3cOl1YZGIAPl1gZGIAQl1UZGIARl1cZGIASl1oZGIATl1wZGIAUl1kZGIAVl1sZGIBO +DiAHKnCFAo//huDxwADYD/TPcIAAEKF2C+//BtnPcYAAsKEAgYK4AKEB2NHA4H7geIPg8cAA2An0 +z3CAAAihTgvv/wPZAdjRwOB+4HjxwIHg4cUA2An0z3CAAAuhAd0uC+//qXGpcEUCj//gePHAluDh +xQDYjPfPdYAAQJWpcA4L7/8E2QuNg7gLrQHYHQKP//HAmuDhxQDYjPfPdYAAQJUEbeoK7/8E2QuN +grgLrQHY+QGP//HApMGQ4ADZyiBCABP0i3DGCu//ENkAFAAxhODMIGKBCPTPcIAAIL0fgAkIXgVM +cAHYpMDRwOB+8cBCCY//CHfPcIAA5CwDgBiIGnGNCBABhOcA3YYAJQDKIEUDz3aAAPSgQCYAE3IK +7/8E2S6OsK5TIQAAEa5BKMAgoLldCGQAAiBCAGO/VQrFAw/qz3GgANAPEBEAhmG6WGAQGRiAJREA +hg94AvAPjgDZUyCCIA8hgQAkeC8mB/DPcZ8AuP8QrhiBzyDiB9Ag4QcYoRiBnrgYoRiBvrgYoQHY +BQGP/+B44cT8HMi+/BxIvuHA4cHhwuHD/BwIsfwcSLH8HIix/BzIsfwcCLL8HEiy/ByIsvwcyLL8 +HAi/aiSAEOHEaiTAEOHE8cDPcKAA0BsUgM9xgACwCQQggI/PUQThAKER8i8pAQAPCJ4FLymBD0AA +AADPcIAACDjwIEAAQHiiDo//0cDBxGskwBDBxGskgBDBxJ90BBQLNAQUCjQEFAk0BBQINAQUBzQE +FAY0BBQFNAQUBDTBw8HCwcHBwMHERSx+EAomQH7BxGskgBTBxCAgQIfgeAhyX7hAoeB/AaHgeOB/ +AICMIFyCAdjgf8IgCwDxwLYPb/9KJEAAz3WAAOQsFSUDEACDQCUOFdFwwiQCAfAlDRHIFQUWRCW+ +gQnyCiHAD+tyjtiNuH0DoAB028gQDQalecgYWACggwbZRnnIFQAWJHjIHRgQAIPIEAAGhiB/jpAL +AQ+9B0//4HjxwEYPT//Pc4AACAoEg4sIEQDPdoAACKQTFgKWAN+EKggJACGAf4AADJwCoySIAd3r +o6yjIekdHtiTDBAFAAQlgQ/A/wAAQSkEBs9xgACw0RQRBgAFLj4BACGEfz8A//8EJEEBHh5YkCCQ +jCGChgHZwiFOACqj56MkgM92gABEoMC5KrbPdoAAYDMorkCuAoikowGuHvAEgzkIUQD2CQAIANgE +owKDJIiS6SeDHOA2eCSIz3CAABAwB4gQcQHZwHnPcIAAXDMgoALYA/AB2AOj3QZv/wHY4HjxwG4O +T//PdYAACAoEhaPBAN+o6K4KQAAB2ASlAoUEiIDgSAIBAM9wgABcMwCAgOA4AgIAz3CAAIgrEIDP +coAAaKAAgCOCGWHPcIAATDMAgDhgeg1gDQKigOAQAgEAc/AEhXkIkQAKhY/oDBUEEBAVBRAKIcAP +63LPcAAAigz1AaAAiiOOC0KFJ4VAIgAHNngmiGDBJogBHEIwJogCHEIwJ4hhwSeIBRxCMAeIi3EG +HAIwbgwgDKgSAADPcIAAiCsQgCCAz3CAAGAzIaBiC6AA5aUD2ASlyvAEhXMI0QBChSeFQCIABzZ4 +BYgpCF4Bz3GAAIgrA5Iwgc9zgABgMyCBYYMKuGJ5DQkEAAnYC6WL8AWFjegEioDgqPLPcIAAaKCq +DGANAoCA4KDyBYUF6AXYC6UB2Ajwz3CAAFwzAICA4JT0ANj+CIAGkPAEhd0IUQB+CUADIoVHhUAh +AAdWeEWIOQoeAIO6RajPc4AAeEPJg89ygAAIpBUamIP5g8WD/mYWGpiD+IPEg/5mFxqYg8ODd4N+ +ZhgamIMFiFkIXgCeCkANkegKIcAPAoXrchwVBRAEEIQAz3AAAIsMuQCgAIojEACSCmANAtgeCmAN +CNgihQSJFwiRAAHYAKUA2A6lCgpgDVrYIoUEiQkIUQAB2AGlB4Uc4RZ5BYmGIP+MyiCCDwAAMEN4 +DCIEyiEiAAKFJ4Uc4DZ4BYiGIP6HBfIC2ASlJPAE2ASlIvAkhQHYPQkRAQ+lz3aAAIgrEIZ12h7b +IIDPcIAAYDMhoAzZvg3gCxi7BIbPcYAAVDMAgJYJ4AAggQal5KUE2AOlAdhtBG//o8DxwAIMT//P +dYAACAoEhbfoIoVHhUAhAAdWeESIz3CAAAAKAJAB3iEKAQDPcIAAAgpAkM9wgABEoAqQDQoBAMSl +ANhI8ASJGOjPcIAAXDMAgJLoz3CAAGigI4DPcIAAUDMAgIoI4AU4YIboag9gBgDYAdgw8MSlAdgs +8ASFWQhRAAKFz3KAAOQsI4JkgGihI4JlgBzgaaEnhTZ4JIgDggDeNLAC2ATZqgvv/8lyz3OAAESg +QoUHhUAiAQcWeQqTJIlEgg4JYAvJc8SlA9gDpQHYnQNP/wwVBBAQFQUQCiHAD+tyz3AAAIkMGQdg +AIojDgHxwA4LT//PdYAACAoEhaHBr+gB389wgABcM+CgANgPpQClAaUC3slwkgpgBOlxz3CAANQJ +AIAmgJ4RAAamuJ4ZGADJcADZGgvv/wTasgjgDslwz3CAAOQsI4BIgTSRUyIAAH4IYAvpc8Sl6XBq +8ASFOQiRAAKFBIgW6AmFlOjPcoAAaKAGgiWCDiCDDwcAIKERC0UAB9gLpQHYDKUJpQTwOGAFogPY +KfAEhRkI0QALyAQggA////8DCxoYMATYHfAEhTsIEQFTIMBAz3GAAGxLkg4gAAChz3CAAOyfOoDP +cIAAKJ6EKQgJMCBADlEgQIAF2MogoQEEpSPwBIUB3z0IUQHPdoAA7J8ahgTZmdoe20DAi3CSC+AL +GLsahumlhCgICQAhgH+AAPydK4ChuSugBtgEpQDYBvAEhQ8IkAEB2DUCb/+hwAbYA6UA2NXx4Hjx +wL4JT//PdYAACAoEhaXBhugChQSImOgC2ASlBIWpCFEABYWLCBEAz3CAAIgrBIDPcYAA/E8AgKoP +IA0ggbToANg48M9wgACIKwSAAN7Fpc9xgABQMwCA5g6gACCBz3GAAPxPAd8E2gChz3CgACwgQBAH +AM9wAAAwfEDABdhBwELHQ8ZExslwBtnJc5h2uHYAJ4cPAAAAfbIPYATYduSl6XAq8HoOYAQF2ATY +AvAF2AHahOgB2CDwKYUZCVAATKULpQjwBIUvCJEACYUJCFEAAdgO8PDoAoUGCGAEA4AIcc9wgAAI +SV4IAA0A2JILAAbi8QDYMQFv/6XA4HjxwMIIT//PdYAACAoEhYDgpcGo9AKFR4UkgFZ4z3KAABAw +BCGBDwAGAACA4QHZZ4ogEI4AwHkVDsEQz3eAAESg6pfBigkOwBMA3gbwxor9CYGDAd7PcYAAXDPA +oZXuz3GAAAAKIJEjC0EAz3GAAAIKIJFhihMLQQDPcYAABAogiUaKCwpAAADZAvAB2cUJEAAcEAQA +z3CAAGigDBgAAc9wgACQkgQQBQDPcIAAsNEFgAUofgFAKYBykHDKIs4HyiCODwAAiAzKI44PAAAB +A/gDbgDKIc4Pz3CAAFAzAIDSDKAFgHCE6DIIgAxO8AvIBCCAD////wMLGhgwz3CAAIhPAIgA3sWl +iujPcKAALCAQgMdwAAAAfRKlSBUHEM9wAAD8e0DABdhBwAHfQsdDxkTG6XAG2QTaANuYc7hzEg5g +BNhzz3CAAIhPwKjkpelwHfAA2M9xgACITwCpAtkjpRXwBIUB3iEIUQAFhZzoz3CAAGigI4DPcIAA +UDMAgDIMoAU4YAboAdilBy//pcDPcIAAiE/AqI4MYAQF2ADYBKWl8QXYC6XeCSAGyXAA2c9wgACI +TyCo6PHgePHACg8P/892gAAICgSG6QgRAAKGBIgT6M9wgABcMwCAjejPcIAAaKA+DiANAoAH6K4K +YAYA2AUDAADPcIAAiCsQgEeGIIDPcIAAYDMBgAJ5AoZWeAeADwkEAAHYBKbdAgAAAIYL6BcLXkAC +2c9woADQGzOgDgwgDR7Yz3aAAIgrBIbPdYAACAoAgKYMIA0mhYDgqAIBAASGz3GAAFQzAIDqC6AA +IIEGpQKFJ4Uc4DZ4BYiGIP+MCvLPcAAAMEPPcYAAfDNWDsADAoUnhRzgNngFiFEgQIBkAgEAAIUI +6M9woAAsIAaAgOBQAgIAEg7AA0kCAAAEhoHggvQChieGHOA2eAUQhgAA2k+mgQ4eAM9zgABgM89w +gAB4Q7iAJIC5Yc91gAAIpBcVD5ZYq1wQBAAMEAUAACUFARgVBJbieQIlBQEVFQ+WJBAEAAIkxIMW +FQ2WBYCieMolgRAE8gHduKsN6UAsjwANCcQDTyWAEAXwBehPJUAQD30Yq0EpwAAZYQkJRQGCvbir +WQ5eAACGDujPcaAALCAmgQ6GInjPcYAAYDMFoUCmBfABhgPoQaZSDcADGgsADScIkADrdQ4LAA0M +FgQQuHDPcAAAjAwKIcAPqXI9AWAAiiMTCxYLIA0A2AKGJ4Yc4DZ4BYiGIP+MBfIC2ASmovAE2ASm +oPAEhhsIkQDPcAAAMEPPcYAAfDMODcADBNgEpgSGhOCT9M9wgACIKxCAz3OAAGAzAIAXowgWBBAc +FgUQQCQABxYgQAEFiEAjAgc3CB4AANlKJMBwKHWoIIAB8CJAAwHlGWED30okQHEA3agggAHwIsAD +AecdZQsJRQMYi4K4GKsA3c93gABooKWnGBQAAUAlQQAPCSUAJ6aHFAAGEQheAAHYQghgBgymTPDu +DuAFC4YLyAQggA////8DCxoYMJ4PoAerpgLYA6YChs9ygABcMySIjuknhhzgNnjPcYAAEDAniQSI +MHAB2MB4AKIp8CCCBekB2AOmI/AnhjZ4HBAEAM9wgACQkgQQBQDPcIAAsNEFgAwfABEFKH4BQCmA +cpBwyiLOB8ogjg8AAI0MyiOODwAATgXgBy4AyiHOD6SmOQQv/wHYDBYEEBAWBRAKIcAP63LPcAAA +jgy9ByAAiiPVBeB48cDPcIAAXDMAgBvoz3CAAIg4AICZ6B4LwAuJ6AvIBSCADwAAADwLGhgwDgvA +C4noC8gFIIAPAAAA1AsaGDALyJC4CxoYMMoKgAXRwOB+4HjxwGILD/9IdUCAYYDBgQCBcg4v/8lx +AKW1Ay//IaXgeECAIYBOIgOAANoDIkIAYKDgf0Gg4cUB289ygAAsCX6y4HjgeOB44HjgeOB44Hjg +eOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeAa4RSDNAM9w +oADsJ6agCoAA2wCxfrLgf8HF4HjxwLIPwAJGCoAOEgiADoDZz3CgANAbMKDRwOB+8cCaCg//GnAB +3wAQEgET8Fp1EfAVIMAjoJACEBEBAefXdQAA+//wf3T2GQqALwAA///PcAAA+//dCIGEuQIP/892 +gACAKwCGAeAAphUIUQAB2c9woADIHDGg3gqgDihwBr2BvUApACSleM9xoADsJwahAIZCIECAAKbd +9c9xoADIHADYEaHX8fHAz3CAANg4AICB4Mohwg/KIsIHyiCCDwAArxPKI4IPAADzAcokIgD4BSIA +yiUCARoIAADRwOB+8cBqCQAOzg6AC9HA4H7gePHAugkP/89wgADkLAOAz3MPAAD8KIDPcIAAfKTA +uTZ4RIAggAq6ZHrJuSV6z3GnABRITaFFgAGACrrJuGR6RXgOoc9xgABwxw6JhiD/AVtoz3CAAECI +TKhPiTCJQCATA4Yi/wFDuoYh/wFNqEO5qgqgBi6o2nDPcIAAgCsAgAHgz3GAAIArAKEVCFEAAdnP +cKAAyBwxoNIJoA4ocM9xCACHEM9woADsJyagA9gA2TIjVSA6cY0NMyJacEokACAa8EAlgQEweQa5 +gbkQvyV/z3GgAOwn5qFAJoEBMHkGuYG5ELgleM9xoADsJwahQCRUIM9wgACoOCCAYHkG2O8MBSDt +DQ6lqnCaDOAEinEacKpwPgvgBIpxmHBAKEAhEHgQuIG4h7iMuM9xoADsJwahTQwQIC0MUSCKJcQG +iiaECCLwCiHAD+tyz3AAALATiiPFDQokQAWFBCAASiUAAAohwA/rcs9wAACuKIojRgZKJAAAaQQg +AAolAAWKJYINiiZCDwDfBNufc+lwqCAADGG7QC6CIUAsAQFZYXV5ACNNAcdxgAC4pEKRsH0GvYG9 +XHoQukV9z3KgAOwnpqJCkcC6eHrlelB/Q5EAI40BsH0GvVx6gb0QuqV6z3agAOwnRqYjkcC5eHkl +eBB4bPFCIkAggOC+Bu3/QCFBIM9xCACGEM9woADsJyagz3CAAIArAIDPcYAAgCtCIECAAKEH9M9x +oADIHADYEaHhB8/+4HjxwADYjbhWDSALBhoYMAzMhiD/igjyz3CAAGxBAIiA4IwPAgTRwOB+z3ED +AEANz3CgAKggLaDPcYAALAxAgQFqAKHPcKAAOC4FgAQggA/AAAAAHQiAD8AAAABI2M9xnwC4/xqh +W6Fp2Bi4GaHPcoAASEcGggOAIIDHcQAAiBOxBqAMSHDxwBoPz/7PcYAA7FMhgaPBQsHPcYAA5CwV +IRAAABAAIMAQDgYvKIEDTiCNB68OEBASbRZ4ACCSD4AASMkGEoAgz3GAAAjMFnkAgSKRjuUIHEQw +yiBhAAbyi3LuCW//AsE26ADYz3GAAKAKQIEPIEADLyEKIAQhgKAAoQf0gOLMDuIGyiAiCK94Hg8g +BBDZAN8EGsQjiiEIAAAaQCCpcOlx6gogBg/aABACIMASAAYEIEAEwBoYAM9wgACIzLZ44KDhoM9w +gACoyLR44LAQJk6TLyiBA04gjQes9Z0G7/6jwPHA4cUIdQTwUg2ADLINoAypcPzoqQbP/qPBQMBB +wQUUgTAA2IHhQsIN8oLhB/KD4Q30IcEA2A8gQAADFIEwDyBAAAIUgTAPIEAABhSBMCEJUAATCZAA +IwnRACHBA+EPIEAAAxSBMAPhDyBAAAIUgTAD4Q8gQAAJFIEwIQlRAAIUgTAKuU8hAgQDFIEwDLkl +eiHBDrlFeSV4IMEVCVEABxSBMCLCBrkIukV5JXjgf6PAo8HhxULBCRSBMEPCQcAZCTMBANgRCVIA +ChSBMAkJUgAHCRIBAdgHFIIwBhSDMBELgAAiwTBzzCJCgAP0AdghxSENURAKFIEwI8MZCcMACxSC +MFBxzCOqgIT2gOLKIGkAGwhRAIohyQ/PcIAAcAogoIHl/9nKISIAIaDBxeB/o8DxwAohwA/rcs9w +AACKJxzbiiTDDwUBIAC4c+B4osHhxULBQSgCAgd6QSgBBEd5z3KAAMjIxrkqYiUK3wEIFAMxz3WA +AAjMqXFWeUCBCwiBAEKREQrAAEeJ7wregYDYA/AGicHF4H+iwOB+4HjgfuB48cAIyJW4CBoYMAnI +m7gJGhgwC8iKuI24kLgLGhgwz3CAAOQsA4AYiBkIUQALyM9xAACQKKy4CxoYMP4M4AUP2NHA4H7x +wOHFCHU+iM9wgACcIkCAQCUAFAO5NXlZYZoO4AsK2poP7/+pcLUEz/7gePHAOgzP/kh1wYAAgChy +5ggv/8lxAKWRBO/+IaXhxWCAoIEBgCGBAiNDg2CiAyBAAAGi4H/BxeB48cClwUHAQsEMHAAxEBxA +Mc9xgAB8hjQZwA8wGQAPLBnADigZgA4kGUAOz3CAAHyGIBhAC89wgAB8hhwYAAvPcIAAfIYYGMAK +z3CAAHyGFBiACs9wgAB8hhAYwAjPcIAAfIYMGIAIz3CAAHyGCBhACM9xgAAAhoAZAAh8GcAHeBmA +B3QZQAdwGQAHbBkAB2gZgAZkGUAGYBkABlwZwAVYGYAFVBlABVAZAAVMGcAESBmABEQZQARAGQAE +76HOoa2hjKEsGcACKBmAAiQZQAIgGQACHBnAARgZgAEUGUABEBkAAWOhaiAAA9gZAABqIMAC1BkA +AGoggALQGQAAaiBAAcgZAABqIAABxBkAAGogwADAGQAAaiCAALwZAABqIEAAuBkAAGogAAC0GQAA +aiCAAcwZAABAwwHAAsFTJ801DBQGMFMlxDVTJsU117qpc74NYAUQFAcwsg9gCwDYjgqAA89wAACt +3qoMgAAI2ADZ6g+gBZm5gQMADPHAigrP/s9ygADkM891gAB8Tw7pAKIAhZPoZg/gAA/YpgrgBgjY +AdgApQvwAN7AoioO4AAP2HYK4AYI2MCluQLP/uB4z3GAAOg3AIEc2s9zgAAICkCgQoNVIsAJAaGg +EgAAjbigGgAAz3CAAFAMpBoAAJwSAAFngwShVSJADQOhQCIAB3Z4BYgZCBEIz3CAAAAKAJBIdIAk +RBMArB7bA/AY22KhVSJADXhgBaEBBWALKHDgePHA0gnP/s9wgACwCQCAz3aAAPQboIbPd4AA8BsE +IIIPDwAA4AQigQ8BAAAAcmlEe2d9oKYEII4PAAAAQJh1oIcDvkR+BCCADwAAAIDHfaCnBCMDAQYi +zwDEfaZ/PXkleAK4BCKCDwIAAAAEegYngBAvKAEATiBCBA0amDAPCpABz3CAAMS7DpAn6M9wgABg +CgCIz3GAAOQs8CEBAL8RAQZTIUGAGfTPcYAAAFgEuAFhIwqRAc9wgADUu/QgQAAN6M9ygADkRQOC +DRpYMAHgA6IE8DcKQABIcc9zoAAUBCqjz3KAAIAKQIoA2A0KUQBJgwcKFA4B2AHdiejPcKAAiCA1 +eKCgE/AG2dzxeg7gCgYaWDPqDQAFi+gA2ZG5z3CgANAbMaB2CCANqXARAc/+4HjgfwDY8cDhxc9w +gACwCQCABCCADw8AAOAvLQEQ5g/v/04lQBQKJQCADfIKIcAP63LPcAAA3g6KI8UKbQTv/04lRBR/ +2Aq4z3GgANAbE6F/2BChyQDP/uB48cBKCM/+z3CAAKg4IIAB3mB5yXDPcYAAfAtigQffgODMIOKA +DfTPdYAAMBnhpQDagOPKI2IAc3vCu2KlDPAA2oDjyiNiAHN7wrvPdYAAMBlhpeKlI4HPc2gf/wBj +pYfpxqUTCNAA0aUG8A0JUQAC2AalUaVSpf/YANkJ2ghzSiSAAqIIL/9KJcAEANkT2v/bSiQABY4I +L/9KJUAHE6XPcCAAICAHpQ0A7/4A2IPoANgE8P8IUYAB2EjZDyEBAM9wgACEGeB/MbDxwHoPj/4I +duyIKJbPcIAAzAmybyhzhiPzD7Z9QisRAsd1gABIyWCFCHIJC14DRGjruYogwy8E9B4WkBANjlEg +AICi8nkJ3wArC94C/9gHrUokAHEA2agggAMoYgAhgw+AADDR9nsEqyhiAeEveQCrW/AjCRIhCiHA +D+tyz3AAAC0liiMLBEokQAD9Au//CiVABO65B40yIkIEACGBL4AAMNH2eQjyRKkE2QApQQQleAet +PfBAqQ8gQARj8C0IEiSMIMOvyiHCD8oiwgfKIIIPAAAuJcojgg8AAOQCyiRiAKQC4v/KJQIEOgrv +/8lwCJYLCJ4DAo4JrQPwAY4IrQCFMQjeAgDaR61KJABxz3GAADDRqCDAAjhi9ngEGAIEABgCBAHi +T3oBjgitAo4JrSzwTCEAocohyg/KIIoPAAAvJcojig8AAAEDPgfq/8oiygcIlgAhgS+AADDR7rgH +jfZ5CfIEGQIEBNkAKUEEJngHrd3xABkCBADZDyFBBCZ4B60BjgitVQaP/vHA+g2P/s9zgADUCmCD +eWHPc6AAUAxgg8dzAAAAICJ7zLsLCwUA7QsewFEjAMDKICIAH/Q5ClEAz3WgANAPEBUDlikIVADP +coAAtCOfcCOCqCDAAgKKJRUPlsG402jYfwHgAqrneSOiEB3YkAHY9QWP/uB4z3CAACij4H8GgOB4 +z3CAABSj4H7gfuB4KHIJACAAANnhxeHGQCkNAiV9QC0DFKV7JQo0Agh1UyV+kAbyAR1SEGG6+/FB +Ko4AwbpCJk6QBB3QEP31CeovJIlw4HioIEABAR1SEOB4wcbgf8HF8cDhxc91gADkmyCNjCHDjwny +B+jPcIAAnEcWDEAM/9gArc9wgACMmwDZNaDPcIAAsCMgoM9xgACIOACBorjuCSAJAKEA2FIK7/8I +cUUFj/7xwOHFAN3PcIAAEAugoM9wgACIOKCgz3CAAISgqXSdsDC8nrCmCyAEqXCpcPYI4AepcREF +j/7gePHAjgyv/gbYDRIONgESEDYNGhgwz3WgABQECqUJhQcSDzYn6APYEKUEpc9wgABA0noN4AwD +GhgwktkDyJC5oBhAAB4P4AMA2AmFD+goFQQQJBUFEB7YCiHAD+tyjLg5AO//iiMEBgca2DMBGhg0 +yqWBBK/+DRqYM/HA4cWC4KHBAgEuAAh1Fg7v/wDagOB78s9zoABQDAWDz3KAAPSgEqoFgxOqCZKM +IIiAKm1E8hL2QQjQAYwgxIFn9FsJlADPcoAAQJUmDe/+QCIAAkhxH/CMIMiASfKMIBCAV/QFgwlp +CQhVAQDYUvAmCiAGANlO8JMJUQDPcoAAQJXyDO/+QCKAAguKgbgLqu7xC4mAuAup6vFzCVEA1gzv +/otwIMDPcYAAQJVTIAIAhiB/D0ipHHgJqe3xTwmUA89wgADkLAOAGIhDCFAAz3KAAHSSSHCeDO/+ +BtlAIgACkgzv/gbZDJKBuAyywPEfCRQBz3KAAHSSQCIABXYM7/4E2QySgLgMsrLxE9gC8BzYgQOv +/qHA4HjxwM9wgAB0kgyQDQgeAD4LwAMG8FEgQIDYDMIDz3CAAECVC4gRCFAAEwiRAI4MgATRwOB+ +ng2ABPzx/PHgfuB48cDhxQDYz3WAAKi6SiRAcSSFqCCAAgDbDyMDAAshwIAD9AHgBfBmeZYOYAAk +pQSFgOBkDqEAyiBhAgEDj/7geAhzOGDVu9W5DQnlADa4AiNCAArwz3KAALDRRYIB4Mm4Inp6Yha4 +4H9FeOB48cBWCq/+mHIIdc92gAAElvQmQBDPd4AAhJVRIECCyiBBAMokInTKICIA6CAiAvQmAhAJ +Cl4CAeBHCBUELbvAu89ygACoyLR6QCuFAmCSBL2GJfgTib0PI0MAYLIA2hZ/QKdBp8O5pXkFIUMB +FH5gts9xgAAklhV5ABkAAQLwgNg9Ao/+4H7gePHA4cXPcYAAlJpBic91gACwI89zgACIOCCDB+oB +2AClgrkgowjwANpApaK5gOAgo6wOwggA2BYPr/8IcRoJYAIA2AUCj/7gePHA4cWYcAPIoJABgEDl +9LjAJaIQA+XPcqAA1AcPEgOGBCWNHwAA/P8TCyUBgHUNyBUiATAOEQAGG2MZEgCGAiXBEEcIRQAF +2Ay4z3OgAMgfHqMQ2A6jAdgVGxiAGRIAhgkIRQD5Cx7AHwseQBkSAIYKIcAP63JD2Iy4z3MAAEQW +CQWv/7h1DxpYg3UBj/7gePHAzgiP/qvBz3CAADDSABATAAfIBCCAD/EAAPBAwA3MAN7PdaAAyB9R +IECAz3CAADDSIYADyA/yoBUCEPgVAxBieQIiVwB2EAEBLyfIJVlhBPCEEBcB4nE6GMQFH4UPCEUA +MHiWCqAFAtkB2c9woADUBzSgM6AD3+2gERAAhs9xoADUB0HAQOAPGRiAFBmYgwPIpBABAA0JHgJC +DMAKBPBHHZiTz3CgANQHDRAAhkAvASQQeAUhFQADyCGAABASAUPBuBCYAHIQAQG6EAABAiEUBo4I +YAZEwBkIUQDPcIAAPCsAkIHgAdjAeAy4QsAD8ELGA8jPcaAA1AdZgIgZgACkEAEA2aC4GIIDuhiE +A7e5pBhAAAPAEwieBc9yoABICEAiASMG8EAiASHPcqAATAgEwALDA3FleAUlFSAHac9zAAD8/2R4 +z3OAADDSY4MIIMQAz3OgANQHNaMAGkAFAiIBJS+jAiQBADuj8KPPcYAAfEENEgI2AIE9CIAAz3Cg +ADguBYAEIIAPwAAAACEIgA/AAAAA9dgFuM9znwC4/xqjW6Np2Bi4GaMB2APwyXAJCFEAQKHPcIAA +MNIEEAUAAiMTIc9xgABspKhwgCAPCh6lENgOpQHYFR0YkAfIBCCADwEAAPAsuAMSAzYEsQ+DzqkA +oUATAAECsRCLYBMDAUAoBAHDuwUjAwFmsQ+pLyNIAc9wgABAvEAgBAlVeEmAz3GAAMS7W2NpoKQV +ABD4FQIQoHBCeEXAAdjPcqAA1AsQogPANbjAuBe4ACCCDwAOAADPcIAAMNICgAK4K+AEIIAPAAD8 +/0V47HIAogESAjbscECgz3CAADDSQoDscECoDcgUIQIAUIrscECo7HDAsAPIlBACAOxwQKANyPAk +AgDscECw7HDAsOxwwKDscMCgBxICNuxwQKADyECQVBAAARC6RXjscgCiAxIDNgGDHwgeAVKLcIvP +cIAAiMt2eACIhiB/DBx4BLhFeALwgNjscgCqA8g7dlCIMxCAAAS6BXrscECoA8gadlyQ7HBAsAMS +AzbPcIAAFEucEwIBb4MmusC6wLsMug27ZXpAoA0SAjYAIoAPgADsu8Coz3CAAHC7VnhUecCxApDA +GYQDFSSCAHgZBADPcIAA5CwEgBqQ0BmEA0bAz3CAADDSAoDAooDgyieOEwoDLgDKIY4jyXXJdzp2 +TCAAoLPyE/DPcaAA/EQdgTmBBCGCjwAAAAgR9AQgvo8ABgAAC/RPCx9Az3CgAPQHB4AA3tUI3oct +8ADe+rjKJoIfAAABAvm4yiaCHwAAAgL8uMomgh8AAAECCurPc4AAaEVQg4omCBIB4lCj9g3ADRHw +AdnPcIAAEEsgoNYJoAwocM9xgADkRQ2BiiYIEgHgDaEFJ4+TC/JhAiAAAN6EEgAAIQiUDJMLH0DP +cqAA1AcPghB4GRIBhljg5wkEgArwz3OAAOxEJIOKIRAhAeEko4kJnyAeGliDHRIAhgcaGDAdEgCG +SsAdEgGGBMggoB0SAYYhoB0SAYYioB0SAYYjoB0SAYYkoFYlABIeGhiAHRIBhkAvAiQweAUglQAE +EgI2hiHzDwASEgGMIQyAAYJDwBbyGtgV8M9wgAAw0ggQBAAAEAUACiHAD+tyV9jPcwAAjBMpAK// +jLgA3tHwINiacANwEHhyGgQAAN4LCBEgA8hz8APAEQieBc9xoABICEAiACMH8EAiACHPcaAATAhH +wQNwSMAEwQLAJXgFJRUgCMAH4M9xgAAw0iOBBCCADwAA/P8IIFYADCbApC4BLQBJwBYNAAAFJw+Q +mPQB2c9woADUBxQYWIBVJUEUDxhYgAMKH0IIwM9yoADUBxWiB8MCIgAlABtABQ+iCcMCJsAgG6ID +2BCiKsCc4ADZkPQHEg42AMAEJoIf8QAA8FBwlPQDyOlyyLoCI5MlCIgMuEV4AxICNxC6RXjscgCi +CsBAIVkwARoYMATIAxICNih2QcUDGhgwBBqYMCGAAJABxTS5wLk0eAPgQOUEIIAPAAD8/x1lDRIB +NgbwFSJAMA4QAAYCfRUiQDAOEAAG7w0FkAPMz3GfALj/GKHPcKAA/ERdgAQivo8ABgAAXfQZCBAg +BMhQiFMiwQCGIv4DRLrEGIIAMKjPcKAAFATEoAfIz3GgAEgsHaHPcIAAMNICgEAgUCAScCAFzf8L +8M9ygADsRCOCiiESIAHhI6ID8Dp3sg5ABVMhfqAF9NILAAAFf58PEBCJD14QA8gpiAHhKajPcYAA +7EQGgQHgBqFA8AohwA/rcigUBTA82Iy4z3MAABsUPQZv/0okQAAAFAQwR9gKIcAP63KMuM9zAAAj +FCEGb/+4dkwgAKDPcYAA7ESKJxAQCPQHyM9zoABILIonCBAdow8KngYFgYC/AeAFobjxBoGBvwHg +BqG08REPHhDPcYAA7EQFgQHgBaE6dwPI6XHIuQiIDLgleAMSATcQuSV47HEqdIQkApEAoUAhTTAU +8s9xoADUB4AZwAQDzCpyyLoQuEV47HIAosyhAdgUGRiA2grgDQHlAxICNpISAAEEEgE2DQifApIR +AwFtC54CqriSGgQAkhEAAaq4xg8gCJIZBAAQ2c9woADQDxAYWIAkEAGGz3KAAEDWRZIweQK6RXkM +GFiAFNkQGFiAz3GAAEDWZ5FGkRjZELtlegwYmIAQGFiAz3GAAEDWaZFIkRC7ZXoMGJiABvDPcIAA +QNbKqM9yoADUC9CirwkQIAXwCNnscCCgAeXPcIAAMNICgPMNBJDPcIAAbKQkkJThwCGGDwAAkwDP +cKAAaCzwIEAAz3GAABRLIIHPdaAA1AcleA2iA9gSpSoLgAoND14SHg+v/wHAB/AD2BMdGJAUHZiT +KQgQIM9woAAsIDCABcAwcAHZyiGGAwQggE8gAAAAgOHMICGA8fPPcAAoCAAGGhgwBsDSCWAFyXFR +IUCgqvLPcKAALCDPoKTwz3CAAHDHEYg5CB4ANQgeQ89xgADkLCOBz3CAAHDHEIgQuDIhgQ8AANgC +n7iA4QHZwHkPuSV4z3GgAPxEDaEbCxAgz3CgAPQHYBjABM9xgADsRAOBAeADoc9wgABspCSQlOHA +IYYPAACTAM9woABoLPAgQADPcYAAFEsggQDaz3agANQHJXjPcaAA1AsNoUymCgigDAbAGRYAlsDg +oAAOAA3MmQheAAPdIB5YkwHYFB4YkAQSATYAFgRABxoYMQAWBUABGlgxBMqc4MoiwgfKIIIPAADc +Dsojgg8AAPQKbANi/8ohwg8ocCIPIA0O2Q8WAJYEEgE2tBkEABMeWJMQiVMgwgCGIP4DRLjEGQIA +UKnPcBIgAABeC+ADDRICNgTIz3GgACwgsBAAAS+BZOAwcMoghQ8SKAgAhffPcAAoCAAGGhgwAN4N +zAQggA8AAAIIFwiRAAQSATaKIAQAhg2gCJgRAQANyM9xgADUu89ygACouhR5z3CAADDSwLEigAaS +GWEweSayrdjPcgC7ALuuCKAGBbgDyBqQwg+gBg0SATbBBi/+q8DxwOHFTwheQ89wgAAw0gGAz3Gg +AMgfliBBDx6hENgOoQHYFRkYgOYOoA1B2CcIXkMB2c9wgAAQSyCgRgtgDAHYz3GAAORFDYEB4A2h +iiUIEi3wz3GgAPxEHYE5gQQhgo8AAAAIAN0H9AQgvo8ABgAAGPIA3fq4yiWCHwAAAQL5uMolgh8A +AAICCerPc4AAaEVQg4olCBIB4lCj9g6ADQfwA9nPcKAAFAQloHEGL/6pcPHA8g0P/gh1z3aAAOgW +AI6owbMIEQCLd+lwz3GAACBUlg4v/iDaAdgArgDYj7gLGhwwANgVGgIwz3aAAAAAoLYPDYEfAAD+ +ygfAgLhHwM9woACsLxqAUiAAABMIHgABloC4AbYHwIG4R8DPcIAA+FegiGoKYASqrs9xQ3WoEkDB +iiEaCkHBK44EpkbA6XBjwQ0cQjPPcYAALEdEwc9xgACYRkXBINkB2j3b4g6gChe7CNiaCiAFAdkC +2c9wgAAwMySgmQUv/qjA8cAmDQ/+KHbPcYAA5CwvIAcghOhhgQPwYIHEEwMGJbvwIQ0AwLuA5qKh +o6HMIyGAAd3KJSEQz3OAACww6IsrD1ES4YHEFw8WHw9eEeyTfpEXD8AQEQhQAIfoAIHEEAAGBwhf +AQDdgeLKJSEQAN/GCeAK6XAKcAoI4AWpcc9wgAAwMwSAIwieAM9wgADoQgCAi+jPcAAAFgkWCoAE +CwhRAAYIAAoM8ADZnrnPcKAA/EQhoOB44aB+CeAKANiA5gAKYgDKIGIAngmABIXovg0ADAPw8g0A +DM91gACMGgCNhuiODkALAdgAraEED/7xwD4MD/7PdYAAqLoklRLpz3egACwgUIcA3gaFR6W+DS/+ +DiCAAAilxLUQh8W1BqV1BC/+CIXgePHAz3GAAKi6ABEEALhwz3KAAKw7QCyAABV4FSBAATAiBgAZ +DhEBCiHAD+tyiiDMDNkHL/+KI8UCTw4QACMOUAAtDpAAIw7QAAohwA/rcoogDA2KI0ULtQcv/wol +gAEyCgAA0cDgfhYJAAD98QPYCQxQAAChANgFoQSBoLgEoYIIYAAD2O/x7/HxwM9ygACougaSAeAn +khB4HQkjAAayBIoNCFEABYqB4AHYA/IA2IDgeAgCANHA4H7PcIAAIL0gkEQhAANjCBECANvPcoAA +qLplogSCoLgEoj0JnwEEks9xgAAAuwHgJIEQeB8JJQAEsgSKDwhRAAWKgeAB2ALyANiA4CgAAgDP +cIAAhD8DgAroA9gJ8M9xgACEPwOBAuhjoQTYWQEAAOB+8cDPc4AAqLoEE4QADQxRAAWLgeAB2APy +ANiM6AUThQAKIcAP63KKII0OuQYv/87bAtgAowDYJJMJowWjBrMqoySDoLkko5YM4AUEs9HA4H7P +coAAqLoA2SWiJIID2ACioLnBBuAKJKIA2c9wgACouiqg4H8poOB48cBqCg/+7g/P/89wgADUumCA +z3KAAKi6qIBgos92gAD8OwSCqKIA2cCGoLglogSiIw5REILjzCPigBL0z3CAAIQ/I6AE7ZYPz/8K +8EoKAAAG8AHbYKIooqC4BKJ5Ag/+8cAKCi/+ANjPcaAALCBQgc92gACouiSOz3WAANS6CKULCVEA +JY4JCVAAAdii6CqGHOkGhm4LL/4OIIAAz3EAABAnJQkFAM9xgACw0SWBmSHNChkIRQAF8M9wAAAQ +JwilAtgH8ADYB/AJhvjoAdgApQHYBQIP/uB4z3KAAKi6JIIPIQEAJKJ5BiAACdjxwHoJD/7PdqAA +LCAQhs91gACougelz3CAAHhJcgjgCwDfABUFECcNUABMJYCAzCXigDzyCiHAD+tyiiBMDYojCAc9 +BS//iiSDDwSVzwgQAO4Mz//PcIAAsNEFgCiFmSDNCjBwAdjCIA4AswgQAM9wgAAUP+mg13EAABAn +byALABHoBI0NCFEABY2B4AHYA/IA2AXoCg7P/0Hwz3AAAIgTCKVODs//O/AElZroJZUIhYHhwCCB +DwAAiBMD8ht4z3GAALDRJYEIpZkhzQoQcQHYwiAOAJ/o1ggAAB/wNwhQAAiFHXjXcAAAECcIpW8g +CwAR6ASNDQhRAAWNgeAB2APyANgF6JoNz/8H8M9wAACIEwil3g3P/wSVBbXktRCGxQAv/gal8cDP +cYAAkJJBgc9xgACw0SWBBSm+ADBwyiBOAAwhAPDPcQAAECfOCS/+yiBFDs9xgAAAuwSh0cDgfuB4 +8cDhxQDYz3OAAKi6AKPPdaAALCAQhQHZz3KAANS6BqMQhSCiBqLPcIAAFD8DiCSrjCCDhiSqBPIl +qiWrsgsgAAPYUQAP/uB4AdnPcIAAqLrgfyCgz3CAAOQsA4DPcaQAHEAIgMC4E3jBuBKh4H7geOHF +ANpKJAB0z3WAAISVz3OAAPyVSHCoIAADQCMBAhR5QLEWJQEQQKFBoQHgSiTAcwDZqCBAAs9wgACo +yDR4QLAB4c9wgACcCkGgz3CAAHSSTLDgf8HF4HgF8EJ5x3BAAAAAz3KAALDRRYLzCkSAUyBDBXBx +wCCND0AAAADAII0A4H8ieAbwYnkCIIAPQAAAAM9ygACw0WWC7wtEgFMgQgU6YgsLhAA4YAfwAiCA +D0AAAABieDhg4H7xwPIOz/3PcIAArL0MiBkI3wECuM9xgABIyRZ4BWEtvcC9A/D/3aIMQAQJ6M9w +gAAsMAiIh+AC2ALyANjPcYAA9KB3ic9ygACMrSGCCQtAACCChOkB3wPwAN/PdoAA5CwghsQRAQZV +CV4BqO0jhjiJSQkQAYIIwAvPcYAA9EMZ789ygADUCgKCAeACogDYz3KAAOxKAKLPcoAASEoAos9y +gAC0CQCiEYEB4BGhBPAQgQHgEKGuDw/+DgxABA7oz3CAACwwCIiI4MwlYZAG9CoI4AsB2DoNAAWM +JcOfRPIR789xgACwIwCBC+gA2AChz3GAAIg4AIGiuAoLYAgAoX4MQAvPcYAAsNEGgUUgQAEGoc93 +gABAlQuPUSDAgPAKAv4Lj1EggIAcD8IDmg+AA6oLQASA4LQKIgDKICIGBu0AhsQQAAYhCF8Bz3GA +AOy8BIkK6AOJgOCIDyEKyiDhAI4KIAAV2PUFz/3hxc9xgAC0IwCJAdthqSToz3CgALAfeaDPcIAA +iCsIgKOBYIACgQDaMQ0BEM9wgADMIwCIg+gB2ArwAYECIw0A9w2Fn0wAQEtBqUhwBwhRAGGhQqng +f8HFoqHv8YDgAdjCIAwAz3KAALQjAKoB2AGqANgCqgGiAqIDouB/JKLgePHA4cUIdRMINASYcg7Y +Bg8v/wDag+gT3Szwz3KAAPSgSHBCDi/+DNnPcYAAtCMAiQ7oz3CAACC9AJCGIPwAjCACgAb0BZJk +kmd4A6FCJQATNgtgBYhxCiUAkAz0z3CAACC9AJCGIPwAjCACgBQPwf8RBe/9qXDgePHAmHC4cZzg +yiLGB8oghg8AAOMOyiOGDwAAgwB4ACb/yiHGD0wlgIHKIsYHyiCGDwAA5A7KI4YPAACEAFgAJv/K +IcYPANrPcYAAwIeeuhUhQQEAgQEqAgFGeOIOoAYAodHA4H6dB+//BdngePHA4cUA3c9wgADAh64O +L/8c2RvYpgggAAXZSiQAd89xgADUI6ggwAIWIUADBBAFAJh1Dw1BEUAkTQBlBM/9CiHAD+tyd9gF +uOEH7/5T2+B48cDPcIAAwIcYEAUALyxBAUwkAIfKIsYHyiCGDwAA4g7KI4YPAACrALAH5v7KIcYP +z3CAANQjFiAAAQCAQHjRwOB+4HjxwOHFz3ADAEANz3WgAMgfRR0YEKoPz/+A2BUdGJDtA8/94Hjx +wJhwuHGc4MoixgfKIIYPAADjDsojhg8AAGMAVAfm/sohxg9MJYCByiLGB8oghg8AAOQOyiOGDwAA +ZAA0B+b+yiHGDwDaz3CAAMCHnroVIEABIIABKgIBRXm+DaAGIKDRwOB+nQfv/wXZ4HjxwP4K7/3/ +2s9wgAAIpBMYmIAcGJiAAN7PcYAACArDoc9wgABYM0CgAdrPcIAAXDNAoMyh0KHRoc+hwKHBoQLd +yXfPcIAA/J2ELwgZACBCDkuCJ3AAIZB/gAAInkYiwgBLoLYJoAtAIAAhYb0kGIIj0w11kAHnAtgA +2doKb/4E2kINoAQB2N0Cz/3geOB+4HjgfuB44H7geOB/AdjgfuB44H7geOB/ANjgfuB44H7geOB+ +4HjgfuB4ANnPcKAAwB0noCagLaDgfs9xgABwRBKBAeASoQ3Ix3CAAOC7LIgB4S95LKjPcIAA3IcC +iBMIQwCKIAgABhoYMIrYkLgH8IogEAAGGhgwQtiYuOB+AtjPcaAAwB0NoSHYBqEB2Aeh4H7xwOIJ +z/2YEAIABCKBDwAAAAg7eQQigw8AAAAQJXvPcYAA5CykgVYlThRWJQ8VmBCBABUKXgKGIf8DRLkv +Z4m/6XEZ8FEiAIK8FQIRDPLCuYAlAhk/ZeiPPWUwjWV/8H9FeQnww7k8eT9mPmYwjuiPRXmIGMAD +ZXnRAe/9jBhAAPHA4cUDyKQQAQCYEAIAUSEAgHIQAQFIcAby1g6gAgDaCHUH8AHhyg6gAgDarGjO +DMALz3KgAMgf+BIBAAPIz3OAAEjJEIgCuBZ4AGPtuM9wgACIKwj0AdtzokiAQIIMgGCACPAC23Oi +SYBAgg2AYIACJUAQWGAQcsAjbQANcQChDXBgoAAWAEAAFgBAA8jPcqAA9AdwEAEBaLknonAQAQFo +uTB5NQHv/XAYRADxwLYIz/3PdqAAyB+gFgQQ+BYDEADfSQgRAQMSATakEQAAdhECAREIHgXPcIAA +MNKhgATwghENAQ3MUSAAgYQRAAEJ8gIlwRACJEMACCMDAATwhhEDARtjaHFx8JUIUQANEgE3A8h4 +EAIBRwkeAVEhQIDPcYAA5CwkgVQRAQEJ8n4QDQEifWJ9AiRDAyvwgBADAc91gAAoyAAjRABwiHZ9 +YJUAIw0BhBADAbtjG/CkEAEAFQkeBXCIz3GAACjIdnlgkQTwghADAc9xgADkLCSBgBANAVQRAQE9 +ZbtjhBANAbtjgBANAblhfhANAUJ9J/BDCJEAAxINNg3MeBUCEVEgAIHPcIAA5CwEgFQQAQEJ8oAV +ABEieGJ4AiQDAAfwghUDEYQVABE7YxtjgBUNEUJ9BfDpc+ly6XXpcQ3MEQheAAPIdhACAWK6OmIM +8BULcgBius9wgADkLASARhAAARpi+BYAEF1lAn0fhhkNBBCg2A+m/6ZfpgLYFR4YkIDYDqadB6/9 +cHjgePHALg+P/c9xgADkLPAhAgBWIkUECIJWIgQFUSDAgIogCADKICEAvBoEAEokAHIA2aggQA/P +dYAAPFn8ii5l5H4vKIEDTiCDB89wgAAkW29gACVDAOCrRBKPAOR+Ly6BE04mjxfuYMiryIIhDt4Q +HYqG4dMgpgAvKAEATiCNB89wgACkV6hgEfDPdoAAZFkuZs5lvIrEfVgSjgDEfS8tQRNOJY4XyGAQ +qwHhSiQAcgDbqCDAD9yKz3GAAABbb2HPdYAAJFvkfi8ogQNOII8H72UAJcAA/KhEEo8A5H4vLoET +TiaPF+5lJBiCA8iCHw7eED2KgOPTIaEALylBAE4hjQfPcYAApFepYRDwBOvJawPwaHbOYTyKxHlY +Eo4AxHkvKUEATiGOB8llLBhCAAHjSiQAcQDYqCAABc9xgACgV32KCWEAJAwAAeBkeS8pQQBOIYMH +z3GAAKRXaWEgrDkGj/3hxeHGz3OkALRFKRMAhs9xgAB4Q8gZAAArEwCGzBkAAM9wpQAIDAOA5BkA +AA4TAIYQejC41BkAANAZgAAPEwCG2BkAAM9wgABcvdSItojoGYADeIjsGUADDZDwGcAALOACIIID +9BmAAAIgQgNiePgZgAD8GQAAwcbgf8HFz3CAAPBKBoADgCCAz3CAACSI4H8poOB44cXhxphwz3KA +ANQkBYIggmaCyrgQuMq5BSEBgAGCyrsQu8q4BSMFAGeCAoLKuxC7yrgFIwcAaIIDgsq7yrgQuwUj +BgAk8gAUDgAvKEEATiCDBwDYDyDAABJ9BCBDAaR+ZX4AHIAD2oKkfsV7eqJ5ggQgjgEEIMABpHvF +e3mieIKkewQhQYNleBii3/XBxuB/wcXgePHAngyP/TpwBYGggcq4ELjKvQUlDZABgSaByrjKuRC5 +BSEQAAHeGfIEJYCTE/IvKAEATiCCB/AhgSAA3w8njxAI6QQnABRCIACAYHnKIGIA5n3bfurtqQSP +/eB44H8A2KHB8cBCDI/9o8EIdkfAz3WAANQkG4U6hfyFJHgEfwcnj5NBxxb0sQ4REAYNoAQK2KUI +EAAKIcAP63LPcAAAjROKI0cASiQAAAEA7/4KJQABBBQBMRjpHBQAMQsgQIAN8s9wgACQOGCAz3EA +AORMDNhgewPaCPCI6M9wgACMOCCAYHkM2AYUATEY6R4UADELIECADfLPcIAAkDhggM9xAADkTA3Y +YHsE2gjwiOjPcIAAjDgggGB5DdgLJ4CTBfKCCO//CtgH8IfuUg+v/wrYVggAANylCNzbA6/9o8Dx +wG4Lr/0A2s9zgADUJDuDuoMA3g8mDhCkeQQmQBBCIACAyiBiAC8mB/AB3coggQAH8hyDJHjyDu// +xXipcJ0Dj/3gePHA4cWhwQHYQMDPdYAA1CQKhRsIHgCLcATZZ9o926IMIAoXuwqFoLgKpXUDr/2h +wPHA8gqP/RpwKHVId2h2OGNm2T3a4gwgChe6FwhRAApwvgwgCqlx6XCODCAKyXEpA4/94HjxwL4K +j/2mwSh1GnJgwADYARwCMAHYAhwCMAMcAjCLcAYK4AaBwQbtBMEKcGB9BcIDwY7pCiHAD+tyz3AA +AIwT7tuKJMMPgQav/rhzYHkA2NECr/2mwOB48cBiCq/9Admiwc91gADUJBqFW4UEehyFBCCQgC3y +A/A7eQQgQKD+8y8oAQBOIJEHXB1AFBUlTRQdhYDgyiHBD8oiwQfKIIEPAACPE8ojgQ8AABwCyiQB +BBQGof7KJUEEFgjP/x2FQHi6D4//ANgPIEAEBiAQILIN7/8KcEUCr/2iwOB48cC0wf4MYACLcLTA +0cDgfvHAtMEuDaAAi3C0wNHA4H7gfuB4ANnPcIAAVDngfzig8cC0wZoI4ACLcLTA0cDgfuB+4Hjx +wKIJr/0A2c92gADUJBeGz3WAALiKDyEBABmGJHhCIACAyiBiAKHBAd8XCFEAz3EBAMiiC9iuDu// +VSXCFzeGANgPIEAAOIYkeEIgAIDKIGIAANkjCFEAC9hgwAEcQjACHMIzAxzCM4twBNlVJcIXPg7v +/1TbANiRAa/9ocDgePHANggABM9wAQC4KAnoz3GAANQkuBkAABuBkbgboc9wAQAwKAjoz3GAANQk +HqEbgYG4G6HPcAAAaE8K6M9xgADUJJQZAAAbgYi4G6HPcAAAbE8K6M9xgADUJJgZAAAbgYm4G6HP +cAAAiE8K6M9xgADUJJwZAAAbgYq4G6HPcAEAhDIK6M9xgADUJNgZAAAbgZm4G6HRwOB+8cDhxaHB +z3KAAHykz3WAANQkF4UA2Q8hAQAYhSR4QiAAgMogYgAB2wDZIwhRAAjYYMABHEIwAhzCMAMcwjCL +cATZVg3v/4ojCAAI2ADZfg3v/yhyANitAK/9ocDxwCYIr/0I2c9yrd7vvnoPYAI6cJoPIAAqcJEI +0ADPcIAAJIgDkE4gzwFRD9URz3CAAKQX/g0gAfQgwAMA3gDdBNgacCpw6XHJcgokgA+t3u++Ng9g +Aqlzrg8gACpwTQjQAEIgQCDfCHWAAeUB5tMOFJEB57sP1JEqcM9yrd7vvgYPYAIQ2SoPIAAqcB0I +0ADPca3e777yDmACKnAKD+//KnCD4MogIgDdB0/98cB+D2/9A9qmwRpwxgmgCoPBA8HPcIAAwBsU +FAcwAN7wIEUAz3CAAMgb8CBGAM91gAAUCw7YxKVAwATYQcDPcK3e775CwATCCnCA244OYAKYc84J +IAAKcH0I0AADw89wgADgG0KF8CDBAMClDBUQEMGlCOnPd4AA6BvwJ8AQhujApcGlANkZ8IQqDAOK +CGAAL3AOIIEPAAAAASClA8CEKAwj8CcBEHIIYAAvcA4ggQ8AAAABIaUEhRsIUQAAhRF4jCAHjcL3 +wKUxeYwhB43D98GlANgNB2/9psDgePHApg5v/QTapsHuCKAKi3HPcAAAG9IA3alxxgwgAalyAMHP +cAAAHNK2DCABqXIAwc9wgABMFwHCFSBBAACRAsEFuoINIAFFeQPAgODaAAUAz3aAABQL0tgIuBnZ +ggwgAQDaz3AAACLSQCYBEroKIAEE2s9wAAAj0kAmAROqCiABANrPcAAAINKEwZ4KIAEA2oXHz3AA +ACHS6XGOCiABANoChhfZUg4gCkAmAhIDhhfZRg4gCkAmAhMEwBfZOg4gCoTCBcAX2TIOIArpcgKG +ANlqDyAAi7kCpgOGANleDyAAi7kDpgTAANkIuFIPIACLuQh3BcAA2Qi4Qg8gAIu5IoYxeRnhBSl+ +ACOGL3JQdzF5GeEFKX4AL3HMIEWAhfcDwAHlNwhFgwPADwhFAwHZz3CAABQLJKAA2NUFb/2mwOB4 +8cBqDW/9CdqpwQh2qg9gCotxIg6v/SHACHFC2GYMIAEFuQwUBDAAwclwBsIKJYAPrd7vvooMYAIC +w4IOIADJcFUI0AAAwQXCz3CAAJQXAN3wIEAABMEKugQigg8PAAD8yblFeToLIAGpco4N4AwF2CAU +BDAAwclwBsIKJYAPrd7vvj4MYAIHwzoO7//JcIPgyiBCA0EFb/2pwOB48cCqDG/9AtqnwZpwDg9g +CoPBz3CAAAhVAIAH2UXAz3AAABHS3gogAQDaz3AAABLSANnSCiABANrPcAAAE9IA2cIKIAEA2s9w +AAAU0gDZtgogAQDaz3AAAAFEB9mmCiABANrPcKAAtA9wEBcAZgkgCgHY6gzgDAXYvNhuCyABANnD +2GYLIAEA2YogRAhaCyABANmKIAQKUgsgAQDZJcW12EYLIAGpcYoghAY+CyABqXED2EDABN5Bxs93 +rd7vvkLHinAEwQPCHtuYc0olAABKJgAAUgtgAkonAACODu//inCD4Nfyz3WAABQLCBUWEAwVEhAO +2EDAQcZCx4pwBMEDwh7bmHNKJQAASiYAABYLYAJKJwAAUg7v/4pwg+C58ggVFRAMFRAQDthAwEHG +QseKcATBA8Lh25hzSiUAAEomAADiCmACSicAAB4O7/+KcIPgn/IIFREQDBUTEAPYQMBBxkLHinAE +wQPC4duYc0olAABKJgAArgpgAkonAADqDe//inCD4IXywoWjhUoIIAovIMcFBMHPcoAA4BsCIUCl +z3OAANAbNXoAogIjACTPcoAA6Bs1egCiw9o1e0Cjz3OAANgbNXtAoyH0Hg+AAwohwA/rchDoz3Cg +APxEdBAEAGQQBQDPcAAAsRPlBm/+iiNJCs9wAACtE4ojiQpKJAAA0QZv/golAAGc6N4OgAMKIcAP +63IQ6M9woAD8RHQQBABkEAUAz3AAALETpQZv/oojiQzPcAAArhOKI8kM4fECJYAl2WACIUGEEPIC +JUIkDHoSDCAAL3AEwgIlASDPcIAAwBtVeCCgAiCAJLlgAiHBhBDyAiDCJAx66gsgAC9wBMICIAEg +z3CAAMgbVXggoADYZQJv/afA8cBWDuAAANjPcAAADdIA2V4IIAEA2s9wAAAM0gDZUgggAQDaz3AA +ABXSz3HzD//8PgggAQDaz3AAABvSANkyCCABANrPcAAAAtKg2Zq5IgggAQDaCdiMuADZFgggAQDa +FNiMuP/ZCgggAQDaANiMuP/Z/g/gAADaEdiMuP/Z8g/gAADaAtiOuADZ5g/gAADaAdiOuM9xAAD/ +/9YP4AAA2s9wAAAL0gDZxg/gAADaz3AAAA3SAdm6D+AAANrPcAAAEtIA2aoP4AAA2s9wAAAT0gDZ +ng/gAADaz3AAABTSANmOD+AAANoA2NHA4H7xwE4JT/2jwYtxAd2OC2AKqXLPcIAABFQAgEHABNhK +CCABLNkO2EIIIAEA2SHGtdg2CCAByXGKIIQGLgggAclxiiBGACIIIAHJcQDAgODMIKKAzCDigMwg +YoHMIKKBzCAigswgYoLMIOKCyiFCAwP0A9mB4MwgooDMIOKAzCCigcwg4oHMICKCzCCigswg4oID +9IK5L3mE4MwgYoHMIKKBzCDigcwgIoLMIGKCzCCigswg4oID9IO5L3muD+AAD9gA2PkAb/2jwPHA +4cWhwYtxygpgCgHaz3WAADSKABQEMM9wgADwFkAlAR8S2joO4AAA2wAUBDDPcIAA7BapcQHaJg7g +AALbz3CAABQXJG0c2ioO4AAAwwDYqQBv/aHA4HjxwBIIb/0D2qPBunBuCmAKi3EBwc9wgACcFwDf +9CBOAALBz3CAALQXgOb0IFQAz3CAABQL4KDhoMwmopDMJmKRzCaikcolwhMC9ADdgebMJuKQzCbi +kcwmIpID9AHdhObMJmKSzCaikswm4pIC9ALdhg3P/6pwz3Kt3u++Bg8gAslxYg7v/6pw7QjQAADA +gODMIKKBUPSA5swmYpDMJiKRSvQCwJEIEQDPcIAAwBu1eFpw4KDPcIAAyBu1eHpw4KDPcIAA4Bu1 +eBpw4KDPcIAA6Bu1eDpw4KDPcIAA0Bu1eOCgz3CAANgbtXjgoKpwyXHPc63e776ODiACqXJmCu// +qnB1CNAAAMEAEgAghuEB2cB5A7m1ecdxgAB8pAChABMAIAShABAAIBt4CKEAEQAgG3gMoapwqXHJ +cgokgA+t3u++Qg4gAopzYg+v/6pwKQjQAADAz3GAABQLQIEEvga42GAVIAAFx3CAALikIYFCsCOw +ANjtBi/9o8DgePHApMGLcfoIYAoE2gDAAcEEuDV4z3GAAFQXEGGuDeAAAsEAwAHBBLg1eM9xgAB0 +FxBhmg3gAAPBANikwNHA4H7xwKHBng9gAotyAMChwNHA4H7gePHAQg4P/a7BunCacXpyWnMKIQAh +CiBAIYLFwgkgDalwhMa6CSANyXCyCSANhsCuCSANiMCmCSANisCMx54JIA3pcKpwF9lmDuAJi3KK +cBfZWg7gCYHCAMA2Dq/9qXEBwC4Or/3JcalwqXGWCi/+qXLJcMlxigov/slyqXDJcWYLb/2Gwmpw +F9kiDuAJi3JKcBfZGg7gCYHCAMD2Da/9qXEBwO4Nr/3JcalwqXFSCi/+qXLJcMlxSgov/slyqXDJ +cSILb/2Iwipwxg2v/YrBiMCKwS4KL/7pculwC9lKCW/+6XKGwKIOb/3pcYDgAdgY9gpwng2v/YrB +iMCKwQIKL/7pculwC9kiCW/+6XKGwHoOb/3pcYDgAtjKICoAdQUv/a7A4HjxwDoNL/0C2qLBCHZ6 +DyAKi3EAwADdqXEE2khzSiRAAe4Nb/1KJcABCHEqDOAAS9jJcM9yrd7vvlYMIAIBwcoLIADJcIPg +yiBCA10FL/2iwPHA6gwv/QjZz3Kt3u++MgwgAgh2dgggAMlwawjQAADZz3WAAAgMIKXPcq3e774S +DCACyXA6CSAAyXBLCNAAIIVAIUGAIKXy8yiVyXAWCSAASpXPca3e777mCyACyXCGCCAAyXAfCNAA +yXDPcq3e777OCyACENkWCCAAyXCD4MogIgDVBA/94HjxwOHFocGLcaYOIAoB2s91gAC0iwAUBDDP +cIAAhBipcRfaGgrgAADbABQEMM9wgAB8GFUlwRUD2gIK4AAC289wgAC0GFYlQRML2gYK4AAAwwDY +hQQv/aHA8cAGDC/9ANnPcoAAtIvPdYAA1CQXhUh3DyEBABmFJHhCIACAyiBiAKHBAd4VCFEAz3EB +AMiiENgOCa//gCICADeFANgPIEAAOIUkeEIgAIDKIGIAANklCFEAENhgwAEcQjACHIIzAxyCM4tw +BNlWJwIUogiv/yhzANj1Ay/9ocDPcIAAMIwisOB/Q7DxwF4LL/0B2qHBunC+DSAKi3EAwc9wgACY +DM92gAAIDPAgQAAgps9xrd7vvgGmpgogAqpw8gggAKpw5QjQAM9xrd7vvo4KIAKqcKIJIACqcM0I +0ACqcA/Zz3Ot3u++dgogAgLa4g3v/6pwAN9KJMAnrQjQAAgWEBAMFhEQ2ncD8Kl36XU78Jp1OfAA +JM0jvX2wfapwqXHPc63e7742CiACCtqmDe//qnB1CNAACBYSEM9wgACoOCCADBYTEGB5AdiB4Apw +KnFKcmpzyiSBDwAAzRrKJYEPAADjF8okgg8AAE0ZyiWCDwAAjBY6DM//mwhQgJEIkIBKJkAgAiTA +IwsIlACLDhCggeDKJQ4Vz3CAADwY9CBAA6SmBaYA2I0CL/2hwOB48cBaCi/9DNqpwc92QB//AM91 +PAA8PM9xgAAQVP4KL/2LcM9wgACEGM9xgADIFxfa5gjgAADbz3AAAAvSDBwEMM9wAAAC0g4cBDDP +cAAAG9IQHAQwz3AAABzSRcUSHAQwz3WAAAgMIIUA2A8gQABHwAGFRsaFwQTaSMCDwJoI4AAA289w +gAB8GM9xgAC8FwPahgjgAALbANgA2fYPoAAC2gHYANnqD6AAAtoAhRUkATAggQLY2g+gAALaANgJ +Ai/9qcDgePHA4cWhwc9wgAAIDCCAUNgPIE0Az3CAALQYz3GAACQYYgjgAAvaBdgAHAQwAhxEM4tw +QCSBME4I4AAB2rPYcgjgAADZiiAEBmYI4AAA2YogxQ9eCOAAANkA2LEBL/2hwPHA4cWhwYtxegsg +CgHaAMHPcAAAA9I9eVIPoAAA2tLYCLgT2UYPoAAA2s91gAAQDM9wAAAg0qlxeg2gAATaz3AAACHS +JG1uDaAABNoA2F0BL/2hwPHAyggP/ZpxSHfPcIAAfAtkEBIAz3CAAHwLXBAQAAzZAN0ocHpwz3CA +AGgM8CBRA0pwagov/SpxAnATeF4KL/2KIQ8KCHbPcIAAfAsagE4KL/0qcc9xgAB8CziBOGATeDoK +L/2KIQ8Kz3GAAHwLO4GO71RpVHpALIMhdHt6YrV6x3KAAKiM1KoVqhDwHQ9REFRpVHpALIMhdHt6 +YrV6x3KAAKiM1qoXqjkJkQCN70AsgSE0eYAhAgS1ecdxgACojNSpFakO8B0PURBALIEhNHmAIQIE +tXnHcYAAqIzWqRepQiNAIEEIdYAB5TUAL/0A2PHAxg/P/KXBunAA2M92gAB8C3QWGBBEwADYA6bP +cIAAqDgggEAg2TAKIoAvAAAI0gHdYHmpcDpwAtiEHgAQTCGAoMwh4qAE9IQeQBMDhoQWARAwcOoC +BgCA4MoigS8AAAjSgeDKIoEvAAAJ0gDdTCGAoMwhIqDMIeKgQvQG3UDwEIYIphGGCaYDhofoBtjS +DKAAVibBEgOGDwhRAAjYwgygAFYmwRIWhsO4DQh0AxamC9gWps9xgABoDPAhAAAphkiGDHlkHkAe +DHoEhmgeQB6D6AWGCegGhoPoB4YF6IDizCEhgAb0ANgXphimGaYapqpwqXEeDu//Q4YB5YflMgIG +AM93gABQS7V/AIcB2o7gwiKOAEKmgOIj2cohAgYacYDiJtnKIUIGygygAHpxz3CAAMwYz3GAACQZ +A9pyDaAAAtsDhoHgyiChAMohYQTYDKEAyiKhAEwhwKDKIKEAyiFhAsQMoQDKIgEAz3Gt3u++1g3g +AapwMg4v/qpwg+Di8s9wgADUGM9xgAAwGRXaIg2gAADbvg4v/gOGz3CAAAAZz3GAAIQZOg2gABLa +z3Gt3u++lg3gAapwOgigAKpwg+DA8gCHPoYApkApAAJAKQIEBXrPcAAAC9JFeU4MoAAA2oonvx1A +x0HHCthCwM9wrd7vvkPAqnAjhgpySnNKJIACSiWAAkomgAI+DeABTiYHAF4LIACqcIPglPIQhj6G +BKYRhldpBaZAKcADBXo9ec9wAAAL0kV58gugAADaQMdBxwrYQsDPcK3e775DwKpwI4ZqckpzSiSA +AkolgAJKJoAC5gzgAU4mBwAGCyAAqnDVCNAAMIZRhoTHBYYmpkemE3hUeESGF6YTeFN6NHpYpooh +DwqSDiAC6XIYhhAUFDCKIQ8KE3h+DiAC6XIXhhAUFzCKIQ8KE3huDiAC6XIEwIohDwpCIJYCGIYT +eFoOIALpcgTAPoZCIJMCQCkAAkApAgQFes9wAAAL0kV5PgugAADaAByANQQcwDQK2ELAz3Ct3u++ +Q8CqcCOGCnJKc0AkhCJAJ4UiCiYAAS4M4AEKJ8AETgogAKpwg+BYBcL/CvADhoQWARAB4DBwIAXl +/wOmANjFBO/8pcDgePHApgzv/AjZz3Kt3u++8gvgAQh3OgkgAOlweQjQAADepgigAMlwz3WAAHwL +26Ug2B6l36XJcAS4RSDAABylHaXPca3e7766C+AB6XBuDO//6XBBCNAAG4UB4N8I9IAbpc9xrd7v +vpoL4AHpcDoJIADpcCEI0ADpcM9yrd7vvoIL4AEQ2coIIADpcIPgyiAiAH0Ez/zxwA4M7/wE2qTB +GnBWDuAJi3ECwAPDAN2pcQjaSiRAAsoML/1KJUAECHEBwB4KoACpcgpwz3Kt3u++MgvgAQDBGgog +AApwbQjQAM92gAB8C89wAAAg0lYmQRI6CKAABNrPcAAAIdJVJsEUKgigAATaMobzhkEpwAXAuBi4 +E3gleEEvwRXAuRi5M3klfxKmz3EAAGgf86Y6De/8CLgUps9xAABoHyoN7/xALwASFaapcMED7/yk +wOB48cDhxaHBi3GiDeAJAdrPdYAAOIwAFAQwz3CAANQYqXEV2hYJoAAA2wAUBDDPcIAAzBhVJUEV +A9r+CKAAAtvPcIAAABlWJQETEtoCCaAAAMMA2IED7/yhwPHAAgvv/ADZz3WAANQkF4XPdoAAOIwP +IQEAGYUkeEIgAIDKIGIAocEB3xcIUQDPcQEAyKIJ2A4Ib/9VJkIYN4UA2A8gQAA4hSR4QiAAgMog +YgAA2SUIUQAJ2GDAARxCMAIcwjMDHMIzi3AE2VUmQhieDy//iiMVAADY8QLv/KHA8cCGCu/8Ctqq +wQh2xgzgCYtxBtiKCaAAAcEI2IIJoAABwRAUBDDJcADBAsIKJYAPrd7vvqYJ4AEDwzoO7//JcIMI +0ADPdYAAfAsUhRgUBDAKpRWFAMEKJYAPrd7vvgLCDaXJcHYJ4AEFwwoO7//JcFMI0AAUhSAUBDAL +pRWFAMEKJYAPrd7vvgLCDqXJcE4J4AEHw94N7//JcCsI0AB0hVQVBhDJcDQVBBA4FQUQbKUkFAcw +KoU8HYARBgkv/UuFANgxAu/8qsDxwKHBi3EGDOAJAdrS2Ai4AdniD2AAANoA2KHA0cDgfvHAmgnP +/KnBQMBBwQDYSMCCxQoNoAypcITGAg2gDMlwhsf6DKAM6XAAwItyvgmgCRfZAcCBwrYJoAkX2QDA +kglv/alxAcCKCW/9yXGpcKlx7g2v/alyyXDJceYNr/3JcqlwyXG+Du/86XIGwAfBiMP2CeAJAdoI +wIkB7/ypwOB48cAWCe/8CNkacM92gAAoCwLYB6YK2Ammz3Kt3u++VgjgAQpw3gwgAApwg+B78gDf +Cg1gAOlwz3CAAKg4IIDgpmB5AdgIdYLgzCUikMwl4pAD9AbYAKYAhpsI1QHPcYAA0E/wIQAAAdmO +4AKmwiFOAK4OYAAjpuGmAtgRpoLlzCUikMwl4pAE9AHYEaYA2AXwAYYB4AGmMYZRCEUAz3Gt3u++ +0g+gAQpwmg0gAApwdwjQAM9xrd7vvroPoAEKcDYOIAAKcF8I0ADqpv/YC6YKcM9yrd7vvp4PoAEg +hpYOIAAKcLEI0YAf8ACGAeBxCPSBAKbPca3e7756D6ABCnB+Di//CnAfCNAACnDPcq3e775iD6AB +ENnuCyAACnCD4MogIgBZAM/84HjxwOoPj/wacM9wgACoOCCAz3aAACgLYHkB2DpwAoYB3Y7gwiVO +EwGGUiUNEIDgBtjKICIC2g5gAEAlARQKcM9yrd7vvgYPoAFAJQEU5gsgAApwg+ASAgEAz3AAAAfS +z3EDAPDAxg1gAADaz3AAAAbSANm6DWAAANohhgpwBNoKJIAPrd7vvsYOoAH/2/IIYAAKcIPg6fLP +cAAAINJVJsEU0gtgAATaz3AAACHSViaBEsILYAAE2hOGog3v/zSGCHfPcAAAB9LPcQQADjleDWAA +ANrPcAAABtIA2VINYAAA2iGGCnAE2gokgA+t3u++Xg6gAf/bighgAApwg+C18s9wAAAg0lUmwRRq +C2AABNrPcAAAIdJWJoESWgtgAATaE4Y6De//NIYCINADjCAErgHfyielECEIEyACho7gAdjCIA4A +COgBhoDgAd/KJaERBPIA3al3ZwhSIGMIgy8AAHySz3AAAFDDSgjv/ApxgODKIGwAyPaMIAKIyiCG +DwAAnwDPcYAAcEvwIQAAFXgiCO/8iiEPCh1lQ9gjDfQSBaYBhovoAoaO4AHYwiAOAIHgCN3KJ6EQ +A/II3QHfdQ4DdAAAJPTPcQAAUMPmD6/8CnCA4MogbADH9owgAojKIIYPAACfAM9xgABwS/AhAAAV +eMIPr/yKIQ8KIYaa6SKGjuEB2cIhTgApCVEADQjUAE4gjQMA3w7wTiDNAgDfz3AAAAvSz3EgACAg +BgxgAOlyAYYEv/1lkOgG2NoMYACpcQLYCtnqC2AACHIfCdEgAtgJ2QjwCNi+DGAAqXEC2BHZzgtg +AALapKYA2OUFj/zgePHAfg2P/KHBOnAC3oogASnPdYAAKAsQ2BDw7IUA2EDACnH4ZxV4yg7gAYty +CgsgB4twAMAB5hp3QCYPFFcONRMhhVMI1AOA4QbYyiAiAlYMYADpceSlKnDPcq3e776CDKAB6XFi +CSAAKnBDCNAAKoVLhSpwAdsKJYAPrd7vvmIMoAGKJMMPLgggACpwjwjRgA3wQCaPE4DhBtjKICIC +BgxgAEAmgRPkpQDYNQWv/KHA8cDODK/8BNqkwRpwGg+gCYtxAMHPdoAAKAthhs9wgADATwQUETAA +3fAgwgDPcIAAyE/wIM8Az3AAAAbSWHnSCmAAqXLPcAAAB9IAKcEjwgpgAKlyCnDPcq3e777SC6AB +JIa2CCAACnBPCNAAIYYCwgpwCiSAD63e7762C6ABA8PiDSAACnAzCNAAz3AAACDSVSbBFMIIYAAE +2s9wAAAh0lYmgRKyCGAABNoThpIK7/80hgymqXB5BK/8pMDxwOHFocGLcWIOoAkB2s91gAC4igAU +BDDPcIAAQBqpcRPa1glgAADbABQEMM9wgAA4GlUlwRQD2r4JYAAC289wgABoGlYlwRIS2sIJYAAA +wwDYQQSv/KHA8cC2C6/8AdoIds9wgAAMVACAosFAwIHB+g2gCclwAcLPcYAAKAuLc8lwxbpBwpYO +YAUggSDAHgxgCQfZGnABFIAwEgxgCQfZCHYKcADZCNrJc0okQAJGDO/8SiVABFpwAhSAMO4LYAkH +2Qh1AxSAMOILYAkH2Qh3qXAA2Qja6XNKJEACFgzv/EolQAQ6cM9wAAAI0kpxZglgAADaQdgJuApx +WglgAAHaz3AAAAGCyXFKCWAAAdrPcAAACdIqcT4JYAAA2s9wAAACgqlxLglgAAHaz3AAAAOC6XEi +CWAAAdoA2DEDr/yiwPHA4cUA2AhxCglgAALaAdgA2QIJYAAC2gLYCtn2CGAAAtrPcIAAqDgggGB5 +AdgIdYPgyiChAMohYQLYCGEAyiKhAM9ygAAoC2OCz3GAAMgZgOXMJeKQDvTPcIAAMAzwIMAAAqHP +cIAAOAzwIMAADfDPcIAA7E/wIMAAAqHPcIAA9E/wIMAAA6HPcGgf/wAEoc9wIAAwMAqhBaLPcIAA +qBkQ2voIYAAA26kCr/wA2OB48cAqCq/8C9rPcIAACBrPcYAAIBoGCWAAocHPdYAAKAtBhQXYSNki +CWAADyGBAAOFz3aAAKBPi3cVJgAQAJBeDyAA6XEDhQDBFSYAEACQ+ghgAMa5A4XPdoAAsE8VJgAQ +AJA6DyAA6XEDhQDBFSYAEACQ1ghgAMa5ANgZAq/8ocDxwKYJj/yhwRpwi3EB3u4LoAnJcs91gAAo +CwCFArgUeAAgjw+AADSLAMDIpQClz3CAAKg4IIBgeclwCHZrCNEAz3AAAAvSQNmaDyAAANoG2HYI +YAAIcQrYbghgAALZM9gA2YIPIAAC2jTYANl2DyAAAto32ADZbg8gAALaONgA2WIPIAAC2jvYANla +DyAAAto82ADZTg8gAALaAtgJ2UYPIAAC2gzwz3Gt3u++VgigAQpwCgnv/wpw2QjQAAKFz3Gt3u++ +juAB2MIgDgCB4ApwHPQyCIABkgkgAApwtQjQAADYBPAIhQHgJ4WbCGUACKXPca3e774OCKABCnCe +CCAACnDlCNGARvBBDtEQ9g9AAYoIIAAKcH0I0ADPca3e777iD2ABCnBCCSAACnBlCNAAz3Gt3u++ +zg9gAQpwKgkgAApwQwjRACbwug9AARoJIAAKcEEI0ADPca3e776mD2ABCnDGCu//CnApCNAAz3Gt +3u++kg9gAQpwIgggAApwFQjQACGFCoU1fwC3C4UBtwDYeQCv/KHA4HjxwBIIr/wB2wh3z3WAACgL +SoUphQolgA+t3u++AN5ZYUuFSg9gAZh2Fgvv/+lwmwjQAAyFKoUC20mFDaXpcAolgA+t3u++WWFL +hSIPYAGYdu4K7//pcHMI0AAMhSqFAdtJhQ6l6XAKJYAPrd7vvkJ5S4X6DmABmHbGCu//6XBLCNAA +DIUqhQLbSYUPpelwCiWAD63e775CeUuF0g5gAZh2ngrv/+lwIwjQADAVBRA8FQQQCoUphUAdQBFN +hZYKYAVuhQqlyXC1B0/84HjxwEoPb/yKJMMPCHbPdYAAKAtrhUmFCiWAD63e774qhXpifg5gAQPb +Sgrv/8lwoQjQAAyFS4UKJYAPrd7vvmmFKoUNpclwemIE21YOYAGKJMMPIgrv/8lwdQjQAAyFS4UK +JYAPrd7vvmmFKoUOpclwYnoD2yoOYAGKJMMP9gnv/8lwTQjQAAyFS4UKJYAPrd7vvmmFKoUPpclw +YnoE2wIOYAGKJMMPzgnv/8lwIQjQADAVBRA8FQQQC4UphUAdQBFNhcYJYAVuhQulANjpBk/88cCj +wYtxwgigCQPaAMHPcAAAG9KP6QHZlgwgAADaz3AAABzSAdmKDCAAANoC2ArZDvAC2XoMIAAA2s9w +AAAc0gDZbgwgAADaAtgR2WIMIAAC2gLBz3AAAAXSVgwgAADaAcHS2Ai4O3kB4UYMIAAA2gDYo8DR +wOB+8cD+DW/8Bdihwc91gAB8C0OFSNkGDSAADyGBAAKFz3aAAKhPi3cVJgAQAJBCCyAA6XEChQDB +FSYAEACQ3gwgAMa5AoXPdoAAuE8VJgAQAJAeCyAA6XEChQDBFSYAEACQugwgAMa5ANj9BW/8ocDg +eKHB4cXhxrhwz3CAAIytEBAGAM9wgADYOAWAmHGhwYYk9w/nCBAAz3CAAPxNAIAfCIEBz3CAAARO +AIATCEEBz3CAAABOAIDDCAABABxAMSDCARSBMPDeUyLAAMR6UyHHACR+VHpALo0BtH26YhV6z3GA +AHymSGHUfghzhiP9D3t7OmJBimV4SHOGI/0Pe3vdZRUlzRG+YcKOZXrJc4Yj/Q97e7lhI4llfihz +hiP9D3t7ZXknDBAAz3WqAOAHc4URCx4ASKUJpSqly6UQ8AilSaXKpSulCvAJukV4z3KnABRIA6IJ +uSV+xKLPcYAA/E0AGYABz3CAAAROABhAAc9wgAAATgAYAAGhwMHGwcXgf6HA8cDPcQCCAQDPcKAA +rC88oM9wgADoQgCAi+jPcIAA1CYAgA8IkACWCMAC0cDgfkIJQABqCWAEb9iH6NYM4AsK2C4JQADz +8fPxz3KAAOhCIIIGeeB/IKLgeM9ygADoQiCCJXjgfwCi4HgEKIAPAAAvukIpwnRQekQq/gICIEAO +EHgD6AHiUHoLCDMBQLGD6ADYAvCA2OB+4Hh5Bo/98cDaC0/8OnDPdYAAgCsAhQHgAKUVCFEAAdnP +cKAAyBwxoFIM4AsocKYIIAQH2Bpwz3agAOwn64ZyCaAFKnALpgCFQiBAgAClBvTPcaAAyBwA2BGh +pg/gAwpw4QNv/Olw8cB2C0/8OnAodRpyYgggBAfYWnAPCJ4gngpgBsjYUCCQIEwggKAZ8gj2IwgQ +IEUIUSAV2BO4DfAlCBAkNQgRKNIPIAMqcAClD/Ap2BK48CBABAClCfAr2BK4+/HPcKAA7CcZgACl +Ng/gA0pwZQNP/AohwA/rcs9wAACKE3vbCiRABAUHb/0KJQAE4HjxwO4KT/wIdzpxGnMfCnQAAN5I +dfQngBMVIYEjWg/v/wpyYb3xDXWQAeYlA0/84HjxwMIKT/yhwQh3GnEjCnQAAN5IdfQngBMeCCAA +i3EAwBQgjCNhvQC07Q11kAHm+QJv/KHA8cCOCk/8ocEacM92gACAKwCGAeAodQCmFQhRAAHZz3Cg +AMgcMaD+CuALKHBSD+ADB9gId+IPoAKz2Bboi3EuDy/9CnAAFAAxAKUAhkIgQIAApgf0ANnPcKAA +yBwxoE4O4APpcI0Cb/yhwOB48cANDN4ALg/P/wTw2ggAANHA4H7xwA0L3gBKD8//BPD2CAAA0cDg +fvHA/glP/Ah1juAB3sImjRPPcKAAtA/8gO4O4AgA2MlwqXEB2uIO4ANIc94O4AjveDUCT/zxwL4J +T/w6cCh1GnKqDuADB9hMIICgWnAb8gz2JwgQIE0IUSAV2BO4FSBABKCgG/ArCBAkOQgRKCpwcg4g +A6lxEfAp2BK4FSBABKCgC/Ar2BK4FSBABKCgBfDPcKAA7Ce5oIIN4ANKcLEBT/wKIcAP63LPcAAA +iRNK2wokQARRBW/9CiUABOB48cA6CU/8CHc6cRpzHwp0AADeSHX0J4AT8CGBI14P7/8KcmG98Q11 +kAHmcQFP/OB48cAOCU/8CHcacR8KdAAA3kh19CeAExoIIAD0IIEjYb3zDXWQAeZNAU/84HjxwN4I +T/wacM92gACAKwCGAeAodQCmFwhRAAHZz3CgAMgcMaBSCeALKHCqDeADB9g6cDoOoAKT2BjosH1A +KI8hgb8QvaV/z3CgAOwn5qAAhkIgQIAA2QCmBfTPcKAAyBwxoJ4M4AMqcNUAT/zPcYAA5Cwjgc9y +gAAICzIhgw8AAB8DAaIyIYEPAAAZA2GySHAgsgjZc9oe2+UB4AgYu+B48cDPcIAA5CwDgAmAUSBA +gcogYgDIDWL+yiEiAF4Or/0B2NHA4H7geOB+4HjxwB4Ib/yKIgQOz3CAANQJAIDPdoAAlJomgEAm +ABSaCWAJBOEBhs91gADkLCKGyB0YEM9ygAAQMMkdWBAhlieqII4EIIAPAAYAAIDgAdjAeCGqBqoA +3uIL4AfJcM9wgACFK7oMb/7AqHoNgAII6H4NgAKG6NoNr/3JcBfwAthKDyABAdmGDaALAtgjhUiB +NJFTIgAAVg0gCAHbANmeuc9wgADkMyCg5QcP/OB48cDhxQsIMgwIdR0Nkh4KIcAP63LPcAAAmiEi +25h1VQNv/bhzQiUAHL0HL/wPeOB48cA+Dy/8mHBBgbCJdwoeAXKJz3aAAEjJ8m32f+ZmNMoIEYUA +SSDAABEOnhXPdoAAiMu2fsGOA/AA3sdwgACIy7Z4BIgIIwMACCODAwAjQAFJIMMDFm11eM9zgAAI +zQNjz3CAAIjMtnjPdYAA5CykhbiFAYCleAQggA8AAAAIBnsC8GOB6LuYGcAAAN0J8qQRAAAA3Ze9 +kbiUuKQZAAA7DB4Az3CAAOQsxIDAusiGBCaOHwBAAAA+vh7m2HpFe5gZwAAdC54HpBEAAIUlARSM +uJG4pBkAAJwZQAMe8CcL3gekEQIAhSUBFJa9mL2NupG6pBmAAJwZQAMkgBCBnrgQoQrwlL2WvZwZ +QAMkgBCBnrifuBChkQYP/PHAIg4v/APYz3aAAKA4IIZAeYDgbfIghmB5BNjTCBAAIIZgeQDYZ7gV +CBUDMyYAcIAANFJAJwFyFHkAeQDYQvDPcIAAqDgggGB5AdiA4AHYwHg48M91gACoOCCFYHkB2CMI +UAAghWB5AdgbCNAAIIVgeQHYDwiQACCFYHkB2MEIUYAB2B7wz3CAAKg4IIBgeQHYheAB2MB4FPDP +cIAAqDgggGB5AdiB4AHYwHgK8M9wgACoOCCAYHkB2IPgAdjAeC8IUAAghut1YHkA2Bpwz3CAAKg4 +IIBgeQHYuHA32AohwA+pcpTbRQFv/QokAASZBQ/84HjxwDYND/zPcIAA0KAgEIAAz3WAAAgKFwhR +AADeHgrgCMlwAtgDpcSlA/AB2AWldQUP/OB4z3CAANCgIBCAAM9xgAAICgsIUQAC2AShA/AB2AWh +4H7PcIAA6JsgEIAAz3GAAAgKCwhRAATYBKED8AHYBaHgfg3Ix3CAAOC7NIgB4S95NKgdCTIBAxIC +Ns9wAwCEAKAaAACKIAgABhoYMAvwiiAQAAYaGDDPcAIBhACgGgAA4H7PcqAALCBwggnoAiNCABMO +hHAAgAAADwiEAADYBPD/CMWAAdjgfuB48cBWDC/8mHClwSh3uHMA3gQjgA//AAAAGLoFem95CLn/ +2Ai4ZHgouAV5RXkI3fQkgAMneETAdgkgChAUADESFAIxYb1AKAEEBXlHeUTBEBQCMRQkgDNAsNcN +dZAB5lMlwgVApwAUDQEH2QfwEH0UJ0wQALRhuRQkQDC7e0+9AJCle3B76Qm1gHhgBCCADwAAAP8Q +uAV6QKclBC/8pcDgePHANggAANoIAADaCAAA0cDgfuB4z3GAAGAzQCEAA1UhwgURCIUAANkEGFAA ++wiEgOB+4HjxwFIOIAUA2FYML/0A2M9wgABsSioND/3PcIAATEoiDQ/9ugsP/uYLAAcA2G4PYAKA +2aoIwAmSDgACygoACpYNQAFmDEACANjSCG/+CHHuDMAI1gxAAo4IYAH/2CYNAAGKIIUPCHESDWAE +CHLRwOB+8cAWCy/8iiD/D891oAA4LseFB6XPcKAAVC4LgNO4BiYAcA8A//+aCSALFtl2CoABx6VR +Aw/84HjgfuB48cDhxQDdz3CAAKAKoKDPcIAAdJKssKIJIAqpcDoLD/1qCaAJqXDeDAADHg5P/aoM +AAGKIAYKCHGSDGAECHIaD2/8qXDyDk/8BQMP/ADZz3CgAOwnK6DgfvHAz3CAANyHNgogCxLZugnA +ANHA4H7gePHAagov/ATZpMEeCiALi3DPdYAAgCsAhQHgAKUVCFEAAdnPcKAAyBwxoM4KoAsocM9w +gADsvACIAN7PcaAA7CeB4AHYwHgHuIO4ELiFIJEABqH+Di/8AdgAhUIgQIAApQX0z3CgAMgc0aBG +CcAAaQIv/KTA8cChwYtwrgkgCwHZLgnAAKHA0cDgfuB48cChwYtwWgkgCwTZAMBRIECADApiBcog +ogAAwFEggID8C0IJAMBRIMCAbA2CBQDAUSAAgeQIggV+DiAKAdjPcYCu4AHscCCgAcjscQChz3KA +AFyIiiSBfQDZqCAAAvAiQwDscGCgAeH+COAAANihwNHA4H7xwOHFo8EB2EDAz3WAANQkqXDaCCAL +XNlaDw/+OoUbhSR4PIUEeYHABgxv/kHBAcEbhSR4QcBVJUAfigxv/qlxz3CAAEwmfgxv/kAlARuL +cFYPoAAE2c4Mb/4BwACFhugFhYDg3A1B/rYOD/5xAS/8o8DgePHA4cXPcIAAzFMAgKLBQcCBwAHd +ngggC6lxQMWLcBYPoAAE2UUBL/yiwOB48cChwYtwggggCwHZAMAvJAcAABwAMRsI3gEHEgU2CiHA +D+tyiiDFAKEEL/0n2z4LYAFA2NoPgABSCQAGocDRwOB+4HjxwIYID/zPdYAAQCsChSOFAd4QccB+ +qXAqCCALA9muD4AABO4ChQPwAIXJAC/8A6XgfuB48cDhxc91gABYK6lwxg/gChDZABUEECEMUABB +DNAAKQwQAQohwA/rco/YjbiY2yUEL/24cwGFDLgEIIAPAQAA8AGlDPAhhc9wgACsQiCgI4XPcIAA +qiMgqAPM13AAAABAAdjCIAoAF7jHcAAOAACDuJ24n7jscQChARIBNuxwIKBaD6AAAdhBAA/84Hjx +wADYz3GAAGgrAKEBoQKhz3DQ/gAABKEAFgBAABYAQAAWAEAAFgBAA8zXcAAAAEAB2MIgCgAXuMdw +AA4AAIO4nbifuOxxAKEBEgE27HAgoP4OoAAC2AoNAALRwOB+4HjxwAAWAkChwUDCARSAMA8IHgDP +cYAA/JEE8M9xgAD8oUChYIkB2gjwABYAQBUhjAAApAHifXj1CIWAFwseAAAWAEED8ADYFSGMAACk +AeL5ClSBA8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4nbifuOxyAKIBEgI27HBAoKYOoAACiaHA0cDg +fuB48cDhxc91gAAgDKlwUg7gCgjZAIXPcaAAuB4CoQGFA6ECDoAALQfP+/kFgADxwKTBi3AuDuAK +ENkDzNdwAAAAQAHYwiAKABe4x3AADgAAg7iduJ+47HEAoQESATbscCCgAMBRIACAA8AG9ALB+gvg +AADaBfBqCCACAcHuDYAApMDRwOB+CQAAAAUAAADxwJYNgABBBwAJ4HjxwOHFtMGLdalw+g3gChTZ +AMCG4Mwg4oEG9D4IoAKpcAhxI/APCJEAjgigAqlwCHEb8BEIUQCKCKACqXAIcRXwg+DMICKCB/QG +CKACqXAIcQvwEQgRAVoIoAKpcAhxBfA7CFECAdkDzNdwAAAAQAHYwiAKABe4x3AADgAAg7iduJ+4 +7HIAogESAjbscECgQg2gAChwJQbv+7TACiHAD+tyfNiNuHfbi7tKJAAAmQEv/QolAAHxwOHFosGL +dalwRg3gCgLZAgigAqlwwgyAAO0F7/uiwPHAag3P+wAWEEChwUwggKDKIcYPyiLGB8oghg8AAI8M +yiOGDwAAjAXKJAYERAEm/colJgAAHAA0i3WpcHILoAAE2YQoCCkvdwAnjh+AAAieMgygCQRuz3CA +AOyfGoAjCAAEJBaAECPoqXAE2ZnaHtuWDmAIGLsA2CQeAhAX8Md3gAD8nQuHgbgLp89wgAAICi+A +AdoE6USgBNgH8ADZLKBJoCSgBdhuD4ACJQXv+6HA8cDhxc9wgADkMwCABCC+jwDAAAAI9M9wgADk +mwCIjCDDjwXygg8v/QHYz3WAAJSaqXBODOAKUtlqDwAGygugAKOFZgvgAKlwCHHPcIAAnEfyC4AJ +/tnPcIAA5JvZBO/7IKjgePHAz3CAAISgEgzgCg3ZlguAAO4IAAXRwOB+4HjxwCoM7/sC2aLB9gvg +CotwAxSSMCEKkiAEFIUwCiHAD+tyz3AAAIQMiiOFCRUAL/0KJIAEAhSAMM92gAAICoQqCCkvdyAe +AhDPcIAAIJ75YCyJQCAQAwAUFDEAINMDEemCDiABQiSAIQHYEbb/2CEeAhBAJgAYCgqgAATZWPAA +2BG2IR6CFM91gAAMnEAlERL9ZYtwqXH6DeAIAtpAJQASIgvgCkIkgSEAJ4AfgAAMnAgQBQDPcIAA +sNEFgFMlQQUQccohxg/KIsYHyiCGDwAAhQzKI4YPAACEAWgH5vzKJIYE5g4gBkpwSiSAcADZqCAA +BIQpCAkvcDIgAiAH6ggVBRAwIQQgLwxAAQHhQCYAGG4JoAAE2QHZDBtCIIcVABaAuIcdGBCeDKAC +KHBRA+/7osAKIcAP63LPcAAAhgwFB+/8iiPGBeB4ABYAQDkCgADxwOHFz3WAAOy9qXCiCuAKA9kB +hc9xoACAJQyhAoUNoQCNUSAAgADYjrgE8g+hA/AQoQYKgAAxA8/74HjgfuB44H7geOB+4HjgfuB4 +4H7gePHAmgrv+wTZo8EA3kLG/grgCotwA8zXcAAAAEAB2MIgCgAXuAAggQ8ADgAABhQAMRt4E+AE +IIAPAAD8/yV4nbifuOxxAKEBEgE27HAgoADB7HAgoAQUATHscCCwBhQBMexwILAGFAQxGwweAAES +BTYKIcAP63LPcAAATyYlBu/8aduWDuACAdgCwQDFJXhCwM9woAAsIEAQEADAvQHlA/AB5gYUADGB +DgMQBBQAMYLHLQ2REBt4EHjpcWYP4AKpcuxxAKkEFAAx6XEbeAHgEHhOD+ACqXLscQCpCPDpcUIP +4AKpcuxxALEEFAAxQCBFAM9woAAsIBCALyVIAQIgAATXcAEAoIacB+X/BBxEMQgUBDAKIcAP63LP +cAAAUCaFBe/8jNviDcACAgmgAALA0QHv+6PA8cAAFoVApsENDTMGABxCMRsNEwIKIcAP63LPcAAA +ZhmV200F7/xKJEAAABaAQAEcAjAAFoBAAhwCMAAWgEADHAIwi3CKCCAFgcECwo7qABSFMAohwA/r +cs9wAABnGZ/bDQXv/Iokww8EwGB6BcEDwYvpCiHAD+tyABSFMM9wAABoGaPb7vEBwIDg4yBCAMog +IgAiCIAApsDRwOB+8cDPcIAAFD+GCOAKCdlCDgAE3goABBYLAAT+D0AA0cDgfuB48cDPcIAAGEFi +COAKB9nmD0AA0cDgfuB48cClwYtwTgjgCgXZAMAtCB4Az3CAAOQsA4AYiB0IUQAA2Jq4z3GgAMgf +D6EBwKQZAADD2Bq4DqGiD0AApcDRwOB+4HihA+AEANjgePHAz3CAALRCwg+gCijZgg9AANHA4H7g +ePHA4cUAFgBAz3WAANQmAKUPCJEAANnPcJ8AuP89oFoPQAAghUEJVQEzJkFwgABgUkAnAHI0eAB4 +Dg2gAlTYKQheAM9xgADoQgCBgbg6DSALAKEK8NIM7/0B2HYNgAIE8DIMgANBAM/78cC2C0AHCg9A +ANHA4H7gePHA9gjgBwDYz3CAAOQsyBABBsC5geEB2cB5SgkgCzwQgADRwOB+4HjxwOHFz3WAAOQs +AIXEEAAGHQheAQohwA/rcoXYjbiKI5wPSiRAAG0D7/y4cxoJgAg+DqAJAdjPcIAALDAIiD0I0QEB +hcQQAAYxCF4BygkP/c9xgACw0QSQJYEKuB0IQAAKIcAP63KG2I24iiNdAkokAAAhA+/8uHOWD4/8 +xg0gCQDYXgqAAlIOQAB9B4/74HjxwIoJ4AcA2FIKz/zPcYAAqK0CiZYIIAsgidHA4H7gePHAosGL +cF4OoAoI2QDAz3GAAChDAKEI6AYUADEDsQQUADECsQIOQACiwNHA4H7gePHAocGB2GDAA8wCHAQw +AMB+Ci/8AtmhwNHA4H7xwKHBgNhgwAPMAhwEMM9woADUAxyQIgkAAQDAVgov/ALZkgpgCALYocDR +wOB+4HjxwAohwA/rcs9wAAAwJYojjAeKJIMPUQLv/EolAADgePHA4cUg289xoADIHGmhABYAQM9y +oAAQFAyiABYFQAHdTCUAgMohwQ/KIsEHyiCBDwAALCXKI4EPAAAJAQgC4fzKJEEDGBpAAWgZQAED +2A+iuaFqoTYNQABhBo/78cDhxa3Bi3WpcJ4NoAoN2QDAHXhTIAEARCk+DalwACGBf4AACMcSCOAI +DdoCDUAALQav+63A4HhZAGALANjgePHApg2v+wzZrMFeDaAKi3AAFAAxr+jPdYAAoDgghc92gAAc +OmB5ANhAJI8wIwgQAyCFYHkA2BsIEAQghWB5ANgPCFAEIIVgeQDYDwiRBOlwyXEY2gTw6XDJcS7a +5g6ACAHYYB4CEBeGgOC8CSH8yiAhAAAUADEpCFEAQCSAMM91gAAcOkAlgRu6DqAILtoB2DeFYR0C +EIHhjAkB/FIMQABtBa/7rMDgePHA8gyv+xfZt8G2DKAKi3AjwEoiQCBTINAAhiD+A0IoEQElCDIk +DBwCNAohwA/rcnLYjbiKIw8DCiSABMUA7/wKJQAESBQFMCDAQCiOIM91gABIydZ+USAAgMBlQS1P +A8C/vmaGIPcPXPSN6AohwA/rcnPYjbiKI88EiQDv/AokAASKIE8FCnFqDuADqHIBwALBCnISCu/7 +Zm5/CBAA6XBuCSALCnENFIAwhSDBAA0cAjCKIP8PU8AAhqm4AKYSwIYg+w8ouA+uSiQAdADYqCAA +A//au2BAKIEgNnkS4ztjQKsB4ApwbgggC4txz3CAAOQs8CDBA8ARAAYPIAAEwBkYAA+ODwhRAIDn +zCCioyAIQgsB3wLwAt/6COABCnAH8IDgyieBFMonIhKB57j0IIbPcIAA5CwDgBiIKHWGJfsfIQhQ +AI4JAAIghhnoz3CAACwwCIgnCNEBQSlAAx8IHgATwBLCFwgeAoYi+w9BKgQCT44LCgABqLhTwBPA +EsIGeUR4JXgApoYg+w8L7YDgyiABBMohIQDMD6ECyiLhAw4eQhQA2M9xgACIzBYhAQRAhgChAaEL +Cl8FANiLuAGhDwqeBQGBRSAABgGhtgvv/ItwDRSAMD8IXgFYFAAxBbZaFAAxBrYFlhfo8ggAAg7o +BpYTCF4AXg6v/ApwPg8ACwXYEq4A2AW2B/AKcADZVg+gAg/aDRSAMDUIXgBQFAAxArYU6ADdENg6 +cAKWESBAg8ogAgTKIUIDLA+iAsoiQgNCIUAg5wh1gAHlDRSAMA8IHgEKcC4L4ABVFIEwDRSAMDsI +3gA1wVYUAjEKcEIIL/0Sw4wgAoC4cA30CiHAD+tydNiNuIojkg99Bq/8SiRAAFElwIHKJyIR+ggg +CwpwA8zXcAAAAEAB2MIgCgAXuMdwAA4AAIO4nbifuOxxAKEBEgE27HAgoMYJYADpcIUCr/u3wPHA +Ggqv+4ogUwmkwQDdqXESDOADqXLPdoAACNEAjkokQCChrgIeAhUB4ACuo66hpqKmpKalpriuua4B +wLquAsEHpgPAKKYJpoHApgmgCgHZAcAHpnp1ifCCwJYJoAoC2QGOA8EB3+OuAeABrgLAKaYIpt4M +7/uLcgQgAAUvJAegAtkjrgKuAMEhpm3yEmkWeM9ygABIyQBiSiEAIA8hUSAtuFMgEACKIFQFegvg +Awpyz3GAAKAKQIEvIkok+K4QHkAUBCKAoBQeABQAoQPZI65CpgOmBvQG6noJoAMg2PmuBdgDriDA +ygngABDZAMAyaDZ5ACGCD4AASMmKIQgAorIgogbZI64A2YoNoAIP2gDCgNkSahZ4x3CAAEjJKKgp +qAfYA67PcIAA5CzwIAAEz3OAAIjMVnvAEAEGBCGBBMAYWAAA2SCjz3CAAKjIIaNUeBoNIAugsAfo +Cg0ACwjYA676rkAjUyAhwHJw8AbN/wnYA64DzNdwAAAAQAHYwiAKABe4x3AADgAAg7iduJ+47HEA +oQESATbscCCgUghgAIpwCtgDrskAr/ukwOB48cCKIFULANluCuADKHKuDoAIug8AANHA4H7gePHA +4cUAFg1AA8wB2tdwAAAAQAHIwiKKABe6x3IADgAAgg+gCFMlARBRJUCQz3GAAHhDAdjKICEApQCv ++wCh4HjxwKHBi3DiD2AKAdkAFAUwGQ0RAAohwA/rconYjbhF2wkEr/xKJEAAz3GAALS7AxlCAUAt +gAMCoUokwHAA2qgggAIA2A8ggAALIECBA/QB4gPwDrgBoRoPAAChwNHA4H7gfuB48cCqD0/7ABYS +QQAWAEHPcYAASMlAKoAgFngwIQUAosFBLUADIwo0JFMgEwAKIcAP63J12I24iiMYAkokQACJA6/8 +SiUAAB0NXgIKIcAP63J22I24iiNYAm0Dr/wKJIAEz3CAAIjLFiCABBpwFg9gCgLZz3CAACjIFiCA +BAYPYAoC2UAqlSEAJYAvgAAIzfYOYAoQ2Ytw7g5gCgHZACWAL4AACM2OCWAFENkBEIAgIQgSBAoh +wA/rcnfYjbiKI5gKSiRAAAEDr/wKJYAEAN0Q2DpwFSVAI89xgAAIzTAhFAAEJIKvAAAAAQQcADVI +8kQkDiYjvgHmBCSALwYAAAAxuCHB32Cg4dEk4aI18gPqFw6VEAQkhC8AAAAkWwyADwAAACRTCNUA +DQiRACXqRw6REATqzOE+AAkAz3CAAKg4IIBgeQbYLwiEA89wgADkLPAgwATDEAAGAdkEIL6PAAYA +AAQkgC8AAAAIwiFBACu4CwkFAADYAvAB2A94BPAB3+lwBCSBLwEAAMAuuc9ygAA0YiliMHcB2cIh +TQCA4MwhIoAW8kIhQCAtCHWAAeUCEIAgz3GAAChXCGE5CFAACiHAD+tyediNuIojGQA58QohwA/P +cIAA5CzwIMAE63KKI1gPwxAEBnjYjbjdAa/8CiUABQMQgCAIYRcIkAAKIcAP63J62I24iiOZAhnx +SgzgCkpwz3CAACjIFiCABCCQz3IAABgVCSGBAOYMIAAgsM0Fb/uiwOB48cAAFoFAz3CAADRLIKgA +FoRAABaBQM9wgAA9SyCoABaAQFAkvoHKIcIPyiLCB8oggg8AANoUyiOCDwAAgQdUAaL8yiUiAM9w +gAAACgCQBuiaDYAKvgyACn4MAADRwOB+DQFgCgDY4HjxwCoNb/sA2UokAHKoIEACABYCQBUiQDAO +GJgAAeEAFg1AABYOQIYNQArPcKAAFASsoM9woADUC9ygNgwAAFkFT/vgePHA3gxv+wjZosEBEg42 +z3WgADguHBUQEE4MYAqLcAAUBDAA3wQkvo/w/wAAyiHCD8oiwgfKIIIPAACmKMojgg8AAOEGoACi +/MolwgBRJECCyiHCD8oiwgfKIIIPAACnKMojgg8AAOQGfACi/MolwgDnpb4IIAs/2ADABBQBMQel +DgtgCoK5HB0AFKILIAABGpgzsQRv+6LA8cAA2P4KIAAEEoEwBBKFMAohwA/rcjjYiiMPATEAr/xK +JAAA4H7gePHA4cWhwR/di3DaC2AKBNlhvfkNVZBWCwAAgQRv+6HA8cCpwYtwagxgChLZPgsAAKnA +0cDgfuB4ABYAQAAWAEAAFoBAABaAQAAWAEEAFoBAABaAQAAWgEAAFoBAABYAQQAWAEEAFgBAAQMA +APHA4cWhwQvdi3BuC2AKBNlhvfkNVZDqCgAAFQRv+6HA8cCtwYtwUgtgCg3Z0goAAK3A0cDgfuB4 +XQcgCgHY4HjgfuB48cChwQDZQMEAFgJAABYAQDUKUAADzNdwAAAAQAHYwiAKABe4x3AADgAARSAA +A524n7jscgCiARICNuxwQKDscCCgH/C2CuAEi3ADzAHZ13AAAABAAdjCIAoAF7jHcAAOAACEuJ24 +n7jscgCiARICNuxwQKDscCCgAMLscECgggogAChwocDRwOB+4HjxwOYKb/sC2c93gABMS0YLYArp +cECHz3agAOwnz3WAAKg4lwoeACuGRCKAAIYi/w4iuqG5FLq0uQUggwBleSumBCCADxAAAgAEIoIP +EAACAM9xgAAsCUV4C6EghQTeYHnJcBsI0AEghWB5yXAPCJABIIVgeQHYJQhRAACHz3GgAMgcEQhe +AAHYHqFmCwAFBvAA2B6hJgnABCCFYHkB2GkIUQEAh2EI3gDPcKAARB3FoMOgxKAo8M9woADIHAHZ +PqALhoG4C6YqCwAFIIVgeQHYJQhRAc9wgADkLAOACIAZCB4AANmUuc9wgAAsCSugC4aUuAnwz3CA +ACwJANkroAuGtLgLpioJAABFAk/78cDPcIAApCI+CmAKAtkWCQAA0cDgfuB48cDGCW/7ANoIdSh2 +z3CgANQLOIBCIQEIgOHKIYwAQCYAEhBx8AvFCgPM13AAAABAAdjCIAoAF7gAIIEPAA4AAAduBCCA +DwAA/P8leJ24n7jscQChARIBNuxwIKAivgbw7HEAoQTlYb75DrWQAIXiCAAAwQFP++B48cDhxc9y +oADUCwPdsaIA23CiAxICN9dyAAAAQAHawiKKABe6x3IADgAARSICBp26n7rsc0CjAtoUGoIwBRID +NuxyYKILEgI3AeILGpww7HIAogESAjbscECg7HAgoM9woACwHwHZOaDPcYAAiCsIgUCA7HBAoAyB +AIBeCAAAz3GgAMg7DoGIuA6hOQFP++B4A8zXcAAAAEAB2MIgCgAXuMdwAA4AAE8ggQCduZ+57HAg +oM9woAAUBAPZJaABEgI2z3CgANQLTaDPcKAARB01oOB+4HgD2s9xoAAUBEWhz3GgANQLDaHPcKAA +RB1VoOB+A9rPcaAAFARFoc9xoADUCw2h4H4D2s9xoAAUBEWhz3GgAPwLDKnPcKAARB1VoOB+4H7g +eOB+4HjgfuB44H7geOB+4HjgfuB44H7geM9zoACoIDGDz3KAAGAzA4I4YAOiAdgSo+B+4HjxwO4P +L/u4cc9wgADsn2gQBABKIAAgTCSAgMoixgfKIIYPAACRDMojhg8AALcHyANm/Mohxg/PcIAACAoH +gIQsCAkAIYF/gAAMnBZ5x4F/DREAz3CAAOgzLgqv/IohDw/PcIAAfDMiCq/8INnPcKUACAyggFMl +TZAS8ikNUBArDZAQCiHAD+tyz3AAAJIMiiOfB5h1YQNv/AolAAT/2Afw/9gIuAPw/9gQuM9xgAAs +CQyhraHOoQDZkbnPcKAA0BsxoPoOYAkB2B3wz3OAACwJDoOb6M9xgAAcWM9ygADoM891gABgM4ok +w38KcKggwAIPYRUlwxPng/AiDgAB4P5mx6NRBw/7OBMEAAohwA/rcs9wAACTDIojHwzdAm/8CiUA +BOB44cXhxs9woAAUBAPZI6ANyM9ygADUvGGSz3GAAMS7xIoUIQ0AaLUAIIMPgADkuzjhwKtighV5 +BpJgoQMSAzbAHQQQBIKgEwEAhiHDDyV4oBsAAMHG4H/BxfHAeg4P+wh2QgygASh1gODRJWKTAdgD +9ADYBLjPdYAA0NEUeAllHWUVCVEASgpgCalw4gtv/QGNANgArQGFqQYv+wCm8cAqDg/7osENEgI2 +z3OgALwtz3CAAOQsTqMkgADdRhERAQ0SEDdWIQYFRiDAIAMSDjYNGhwwpBYAEIS4pB4AEAGWViGI +BFYhRwSGHkQTCOjPcIAAxLz0IIAACegBhg8InwNQIAAgLyAIIFMgfqBIAwEAz3CAAHhDaRAABs9x +gAB4QwHgaRkYAAQSATakGUADAZaPCBAAz3CAAMS7VHiAEA8Hfw8RENAQAwFTI8OAFfRyFgMR4JZi +f7gWgxBif/B/4BjEA6QWAxCGI/OPBfJov/B/4BjEA3AWDxHgEAABYZbiePFwwicOEMIjzgN0FgAR +G2O4FoAQdBlEA6CxeGAQeJAZBAC+GQQAEI4A2xCpAYYBoQiOCKkSjhKplrsw8A+D/wjehW+DUyPA +AlULngUhCJUDz3CAAHhDpxAABra7z3aAAHhDAeCnHhgQGvBkuBB4kBkEAAQjgA8AAADwLLgQqXQZ +RAOgsaGxvhlEAwGGqKmGIP8NhLgBoRKOEqn2uzgCAQAA2Ja4pBkAACkLXgVqDe/+ANgEEgE2pBEA +AAQggw8CAAAALbsFIwIELyCIID7wAYGlCB4BcIlPekkiwADPcoAASMnya/Z/4mLSiREKngXPcoAA +iMt2ekGKA/AA2sdwgACIy3Z4BIgIJg4QCCaCEEkiwgMWa1V4z3KAAAjNAGLPcoAAiMx2es9zgADk +LGSDeINBgmV6BCKCDwAAAAhGeJgZAAAA2Ja4QYGGIv8NQwgeBaEKEACYEYIAQCcACUhgz3OAABSi +QMAgwsO6XHr0I4IAUvAKIcAP63I02Iy4X9sFu4okgw/RBy/8SiUAAJgRAwCcGUADSQteAoC4pBkA +ACjqmBGAAM9ygADkLEOChiD/A0S4MiYAAIm4QMAgw1SCZHqGI/8DhiL/DkS7emJPes9zgACAV/Qj +ggAe8BMLHgII6pgRggBAJwAJSGAL8IXqANpIcBDwmBGAAMO4HHgyIAAQQMAgws9zgAC8ocO6XHr0 +I4IAiBkAAJgRAACEGYQAkBEBAboIIAAA2gQSAzYDEg02z3agAMgfhBMCAYIbBAAaYlB6sBuEAPgW +ARCwFQARIngAIE8Ez3CAAOQsBIBUEAEBP2dfZ6AWDhDwfzsOxBMQgJgVDhALIICDF/RwixCNcHDR +JiKSGvKGJv8ZQS7DEAHjKQuUAAK4FnjPc4AASMkAYxkIXgTPcYAAeEO4EQAGAeC4GRgAEPBZYTB5 +hh1EEM9xgAB4Q2oRAAYNGhw0AeBqGRgA1QIv+6LA4HihwfHAagoP+wh1RsDovShwzgAhAEh2A7hA +IJAFRCUCFiO6BCWPHwYAAAAB4kEvQBQEJYEfwAAAAFhgNrnPcoAAAGKpc8a7KWIIYjhgQS2BElIh +AQDAuQO5GOGF4MohjQ8BAIkN1SEOAC8hSCAEJYEfAAAAGM9wgADMWddxAAAACB4AIgDwIMAAJsGg +4RIAAQDPcUJ70F4FKH4ACiDADgpxBSk+AAogwA4kuAHgBO9TIAEAOGACKYEjIQ1eE89ygAAIW0CS +BSo+AAAhgH8AAP8/LrhfACAAGWFXACAAFXlRJUCSVgAhACbFt+UiAAsAM2hTJQIQz3CAAMhX8CCA +AAUpPgAKIMAOAeAG8IrlwCjhAMAoogDPcYAA5CwjgcDaNIGkeYYh/w4iuTp62noZYjB4CNyfAQ/7 +M2hTJcAQHHjPcoAATFvwIgAAFuEFKT4ACiDADgHgFNmFB+//2nnPcYAAiCskgUEoggXVuCCBQSmD +BdW5AnnPcIAAsNFiegWAyboFKL4AJ3HPcIAAbEoDgACA4H84YM9xgACIKySBIIFBKIMF1bhBKYIF +1bkZCSUAW2PPcoAAsNFFgllhAnkB4wPwAnlAK4AFmQfv/yV48cBWCw/7oggv+1DZRcBKIAAgtgyv +/obFIwg1JQQVARQFwBUgAAQgoEAgUCDtCYGPrd7vviTc1wAP+wohwA/rcs9wAACLE4ojBwuYc2EE +L/wKJQAE8cDhxZhwGQj0ALhxCiHAD+tyfdiNuEUEL/zw289wgADkLPAgAQGKIwsNQCECBnhiTw0R +AKiBemKgokmBQaBciUioXYlJqCoRggBKqCsRggBLqCwRggBMqE2RR7BXkUiwSIEEIoIPAAYAAIDi +AdrAelKoVJFTqCiBwLktqBrwOQ1RAGJiSKFBgEmhSIhcqUmIXalKiCoZggBLiCsZggBMiCwZggBT +iFSxR5BNsQiQF7EdAA/7CiHAD+tykNiNuJ0DL/yKI4QH4HjxwI4Pz/rPdYAAFJIEFQUQQiVBAIXh +NgEtAKLB9SZBcIAAGFJAJwByNHgAeALYAKUB2c9wgAA8KyCwRglgByhwAoXPc4AAACsog0eDCBME +AA8gQAACpc9wgADgKjV4QKAYEwUBDBMGAM9wgAC8PwDZNKjPcAAAtKZAwAWDEBMHAEHAGos7i0CD +LgogCGGDXPDPcIAAPisB2SCoz3CAAAArJ4DPcIAAGLsvoN4LL/0C2ErwBNgApQDYz3eAADwrwghg +BwC3z3aAAAArAoVIhmeGDyCBAM9wgADgKlV4YKAipezYoghgA0CXCBYEEM9wAAC0phgWBREMFgYQ +QMAFhhAWBxBBwBqOO45Ahq4JIAhhhiQWgBBIhgDZUSAAgQSFDyGBAAryAdvPcoAAvD90qgV5JKUE +8CZ4BKUmDiADANgE8L4JT/yxBu/6osAIFQQQCiHAD+tyz3AAAEIfOQIv/IojRAfgePHA4cUB3c9w +gAAUkqCgANjPcYAAPCsGCGAHALFeDCAAqXCBBs/64HjxwOHFANjPdYAAFJJaCCAAAKXGCS/9Atgi +hc9ygAA8K3fY1g8gA0CSUQbP+vHA1g3P+gDez3eAADwrwLe2DyAHyXDPdYAAFJLCpcOlxKWKIMkA +yXGiDyADQJcB2A0G7/oApeB48cDPcYAAFJIAEQUAGw1UAQohwA/rcs9wAABBH5nbhQEv/Iokgw8B +oc9wgAAoK/AgQAFAeNHA4H7xwGYNz/rPdYAAFJIEFQUQosFJDVAAIw2QANENUAEIFQQQCiHAD+ty +z3AAAEQfPQEv/IojRwbPcIAAPisB2SCoz3CAAAArJ4DPcIAAGLsvoA4KL/0C2EzwBNgApQDZz3CA +ADwrILDyDiAHKHDPdoAAACsChUiGZ4YPIIEAz3CAAOAqVXgipWCg0g4gA4oghgsIFgQQGBYFEc9w +AAC0pgwWBhBAwAWGEBYHEEHAGo47jkCG3g/gB2GGJBaAEAHfSIYA2VEgAIEEhQ8hgQAI8s9ygAC8 +P/SqBXkkpQTwJngEpVYMIAMA2ATw7g8P/OEE7/qiwOB48cByDM/6z3aAABSSBBYFEEIlQQCE4eYA +DQAzJkFwgAAkUkAngHI0eAB4AobPcYAAACtIgSeBDyCAAAKmz3CAAOAqVXggoFnwz3CAAD4rgNkg +qM9wgAAAKyeAz3CAABi7L6AKCS/9AthH8AqWjCACgBH0ANjPdYAAPCvqDSAHALUihoogBQTiDSAD +QJUB2ACmM/AD2ACmMfADhowgw48B3xL0ANjPdYAAPCu6DSAHALUihoogRQrgpq4NIANAlSYPD/wb +8ADZDyEBAAKGBiBAgBL0ANjPdYAAPCuKDSAHALUihooghQyCDSADQJX2Di/84KYD8AKm5QPP+ggW +BBAKIcAP63LPcAAAQx9tB+/7iiNGAOB48cDhxc91gAAUkgQVBRBCJUEAkwmVATMmQXCAACxSQCeA +cjR4AHjPcIAAPiuA2SCoz3CAAAArJ4DPcIAAGLsvoBYIL/0C2C3wAoXPcYAAACtIgSeBDyCAAAKl +z3CAAOAqVXggoB3wA4WMIMOPAdoJ8gDZDyEBAAKFBiBAgA30z3CAADwrQLDKDCAHAdgD2EIOL/wA +pQXwAqUD8AHYAKU5A8/6CBUEEAohwA/rcs9wAABFH7EG7/uKI0gL4HjxwOHFz3WAABSSA6X6DO// +Bdgjhc9ygAA8K6DYegwgA0CS+QLP+uB48cByCs/6z3CAANCgCIDPdYAAFJIA3ye4wLgTeMa4AeAK +tQjYOnAA3gKFDybOEwsggIMt8gSFCyCAgxnyxngEpc9wgADQoAiAD3kjCVAAz3KAALw/MIqGIMMP +gLgB4S95MKrPcYAA0KAIoc9wgADgKhUg0AMAEAAggODiIAIAAoUA2QAYQCDGeAKlQiFAIAHnlQh1 +gO9/SpXPcIAAPCsgkIHizCEhgAf0ANrPcIAAvD9UqAGFEQhQAYHhA9jKICIBHgzP/w0Cz/rPcoAA +FJIiggDbDyMDAGZ5IqLPcYAA4CoA2hV54H9Aoc9zgAAUkkKDDyJCAEKjz3KAAOAqNXrgfwCi4Hjx +wHoJ7/oZcQh1iHbPcYAAACsaqRsZAgJAoRAZwAEMGYABwqEDwBgZRAEExgehJsDIoSQZAgAHwGGh +BaFT2KlxKgsgA8lyJsATCB4AV9ipcRoLIAPJcgbYBfCB5QLYyiBiAHoLz/+BAc/64HjxwAYJz/oa +cM92gACAKwCGAeDPd6AAyB8AphEIUQAB2FEfGJB2CUAKpBcAEM9wgABUOSaAz3WAAIytYHkA2AGF +Kegk2BjZdglgCjPaHwhQAAQVBRAKIcAP63LPcAAAdBnA260E7/sKJAAEJNgB2U4JYAoz2h8IUAAE +FQUQCiHAD+tyz3AAAKsoxduFBO/7CiQABACGQiBAgACmBfQA2FEfGJDJAM/64HjxwGYIz/rPcIAA +VDkEgCXoz3WAAExCMoXk4cr2z3aAAPhNAIba4MogKwGM9trhVfbPdoAA+E0AhuTgz/aKID8PYgwA +CiCGSBUAERC5Dg/v/yV4EoUApn0Az/rgeOB+4HjgfuB4z3CAAGxBQIgRCh4Az3GgAKwvGYGKuBmh +EQpeAM9xoACsLxmBjrgZoeB+4HjPcaAAyDsdgQfogtgUoc9wAIARFA6h4H7PcIAArL1siM9xgAB0 +kowjAoAKkUEoAgMM8hkI3wICu3Z7x3OAAEjJApMPIIAAArMA2OB/DLHgePHAgg+v+lRohiL4A08i +QwJTIcIABSLEAM9ygACoyBR6j+GKIw8MyiApAAn2AJIA3Q8lTRCKI88PpngAsgDZSiQAdM92gACE +lc9ygAD8lc91gAAAlqggwAQUIkAA5JBkfxkPAREA3+SwFiZAEOCg4aBAJQAZNXjgoAHhcQeP+uB4 +8cAA2p66ANnPcKAA/ERBoOB4IaD2C2AHKHALyAQggA/+//8DCxoYMAvIh7gLGhgw0cDgfvHA0g6P ++kh2gOAB3UT2iiX/HxN4CQkTALN9M3kUIQAAagjv+jt5rHgAHkAeEQev+gHY4HihwfHA4cVCwJhx +SHWA4ADaRPYB2hN4QsAODmAHgsACwALqE3gyCO/6iHEApQjc5waP+uB48cDhxQhyAd2A4cohwQ/K +IsEHyiCBDwAAmxPKI4EPAABcAMokIQBEAuH7yiUBAYDiRPZTeool/x8JCRMAM3mzfRQhgADeD6/6 +O3mseJEGr/ovcOB48cDhxc91gAB0ks9wgADkLCOAQIUAgUMKAQACkUKVOwoBAAKF9gjv+yOFjCAC +gBXyz3KAAJwKIYIA2w8jAwACuGZ5FnghogAggQ+AAEjJAIGquIi4AKEA2DEGr/oMteB48cDhxc9w +AAD//891gACQkgOlz3CAAEBJrgxACM9wgABcSaYMQAjPcIAABEqaDEAIz3CAACBKkgxACADZIKUF +2AGlIqVCCe/8Btg+Ce/8CdjZBY/6B9nPcqAA1AcaGliADegZEgGGCSBDAA8SAYYCIMCAeWEPGliA +9fXgfvHANg2P+gMSAzYIdw0SDjbPcYAAxLsQi89ygABIydR5ArgWeAViMYktvVhgwL0M6SGDFQle +A89xgAAcLLR5oJEQ5aCxJZAjCVIAYbklsBCLMmg2eTtiZZM6YofrJpJRIUCAKAjC+04IgAmGCSAF +DcgDyAHZoBhAAM9xDwD//74IIADpcBkFj/rxwK4Mr/oD2c9yoADUBxMaWIAPEgOGABYAQAAWAECi +wUDAIMAfCBAHCiHAD+tyNdiMuM9zAAD0DJhzeQDv+0olAAAAFg1AsH0AFgBAQOX0uMAlohAD5QQl +jR8AAPz/GRIOhkIlDxT7DsSTu2MPGtiAIBpYgBkSAYYpCRQCHxIBhkHBIcGc4cohwg/KIsIHyiCi +Dcojgg8AABENzyAiA871BCCADwAAAEBtBK/6osDgePHA9guv+sjagiQDMgh1KHbPcYAAQFSuDK/6 +i3AB2s9woAAUBESgz3KAAHBEGIIA2QHg4r0YosogQiAF9BYPz/8acA3Iz3GgAGQuz3KgADgu8CEA +ACeC07gkeAQgkQOr8PIOz//PdoAAQNYacMlwmglgA4tx4g8gCslwnfAD389woAAUBPCg5KAAFgRA +BxoYMQAWBUABGlgxBMo/CBEHi3AeC6AJDtkkwVMhwACGIf4DRLnEHEIwZMBEJo0UMQ5eEI7YkLig +HAAw2Q4eEYbYkLigHAAwZvDrcs9wAADcDs9zAAD0Ch0Hr/sKIcAPDwgQIIzYkLigHAAwVPACuBZ4 +x3CAAEjJQIBIdIQkDJAM8hMKXgKL2JC4oBwAMAHdQvCI2JC4+/FOiFBxyiCCDwAAkQDPICIE8fUB +wREJngYB3ZDYkLigHAAwLvAikDMUgDAtCQ4AB8gEIIAPAMAAAB0IgQ8AwAAAIsCA4MogiQ8AAI0A +pgfp/88gKQQKwYwh/48S8s9woAAsIBCAInjXcACAAADKIIUPAACHAH4H5f/PICUETCAAoMwlIZBc +9c9woAAUBOOgTCAAoKl2YvVTJn6QCPLPcKAAFAQJgIDgWvVlDl4QAdpXCRAgKnEvKEEATiCDB5Tj +yiXFEIX3aHWAJcIUz3CgAGgs8CBAA5TjD3jKJ8UQhPdod4AnwhHPdaAAGCzwJc0TsXDKIiIACeoA +2A8gwAAGIQGA2vUB2ALwANiA4CjzJQKv+oAkAzLxwMIJj/oacNYOYAEw2JhwKbhRIACAyiHCD8oi +wgfKIIIPAADpFMojgg8AAMcAnAWi+8olIgAs2OYOYAFAKIEgAd6KJQ8amg5gATDYmHApuBkIHgCM +Jg+aJvL+CSAKAdhhvecNdZAB5nYOYAE02E8gAQWVuaoOYAE02GYOYAEs2Ah1Xg5gATTYuHAzCF4F +CiHAD+tyz3AAAOsU49stBa/7SiQAAAohwA/rcs9wAADqFNTbGQWv+0olAABtAa/6QS0AFOB48cD+ +CI/6CHcA3slwTg2gA8lxA9jJdRpwCe9ELT4XACGAf4AADEjyDwAICu9ELT4XACGAf4AAtEjeDwAI +QiBAINcIdYAB5c9wgACEoMl0nbAwvJ6wz3CAABALug3gBMCgAQGP+uB+4HjxwM9wgACwCQAQBAAB +EgU2CiHAD+tyz3AAANsOgQSv+4/b4HjgfuB48cBmCI/6z3CgAFQuK4AH3dO5LyhBAE4gjwfPcKAA +wC+lEBKGFBARhs92oAAUBKqmpgrgBoDY89gFuIDZjg1gAZ+5DRIQNvXYBbiCDWABqXGqpg0aWDME +8APYBaaphhvtfO1BLYCQCvIvJAlw4HioIIABABYAQOB4UyVNkAnyLyRJc+B4qCBAAQAWgEDgeKmG +6PHz2PYMYAEFuMkI34f12AW4Kg1gAQpxKB4AFJTnDRoYNMohxQOF9+lxgCHCAc9woAAYLPAgQgCU +58ohxQOF9+lxgCHCBM9woABoLDV4BL9AoMd3gABMxRWHNocFeReHuIcleAUlDZDKIcIPyiLCB8og +gg8AAMIhyiOCDwAAjQfKJEIDYAOi+8olIgCA2c9woADQGzCgz3CgAMAvpRiYhBQYWISNB0/68cAm +D0/6pBEAACh1USAAgArYyiAhBJgVARAEIb6PAQAAwHYdBBAw9C0JHgJEIQAGI7hBaAQhgA8GAAAA +MbhYYAQhgg8GAAAB13ICAAAByiChAAPwAdgjCFAAFQiQAIPgANjKIOEBwCihAwvwz3CAALS7AoAF +8M9wgAC0uwGABXmYHUAQnhUAEZQdQBCSHQQQghUAEZAVERGyHQQQANiAHQQQfh0EEAPIz3agANQH +QZAQFZIQCOoNyM9xgADEvPQhAAAT6BkWAJYfCBUODczPcYAAcERGIIACDRocMBqBAeB/AiAAGqEP +FhSWCeoNyM9xgADEvPQhAAAD6AHYBfAD2BMeGJAA2AcSDzYBEhA2ABYEQHpwBxoYMQAWBUABGlgx +BMqc4MoiwgfKIIIPAADcDsojgg8AAPQKBAKi+8ohwg+pcLoNYAkO2R8LUSAEyAGQIOjPcYAA5EUa +gQHgGqEcgQHgHKEW8APIAZAU6A3Iz3GAAJS89CEAAFMgwIAK9M9xgADkRRqBAeAaoRuBAeAboQMS +ATYBgR0IngNUEQABUyDAgAj0z3GAAORFGYEB4BmhAhUFESkNEAABhe64yiHCD8oiwgfKIKILzyAi +A8ojgg8AALUHaAGi+8okYgAAlbBwyiHMD8oizAfKIOwLzyAsA8ojjA8AALgHRAGs+8okbAAQjVMg +wQCGIP4DRLjEHQIQpBUAEDCtRwifBQcSAjYCIsEDANgPCVAAAieBEIwhw48C9AHYk+gNzM9xgABw +REYggAINGhwwGYEB4BmhDx4YlQca2DMBGhg0g/AHGtgzARoYNADYdB0EEDoJYACpcM9xgAAIYgth +dBUCEc9xgAAQYvAhAAB6YlB6pBUBEHQdhBAleKQdABAEyAGQE+gdC1EgAZW4FY8QWGAglfhgEHi+ +HQQQWWE/Zw7wvhUAEQnwIJW4FYAQWWE4YBB4vh0EEAh3kB0EEA8WAJa0HQQQBg5gBKlwEI0yd8wg +gYQT8gohwA/rckApDSRAKA4EMNiMuADbi7sFJcQTOQCv+wUmhRSkFQAQCHSEJBqQIfI9CF4CA8gB +kBroDcjPcYAAxLsUeYARAAeS6NARAAFqFY8QAeDDuPhgD3hqHQIQpg6gAKlwah3CEwXwmg6gAKlw +Dx4YlR0ET/rgePHAygtP+hpwAN+kGcADz3CAAOQsBIDQifCgB8gEIIAPAMAAACh1MwiBDwDAAAAN +yM9xgADEuxR5EYmP6M9wgAAoyNZ4IogIjQ8IQwAKcE4ML/6pcdzwUSAAoIbyBBUEEIEMHgENyM9y +gADEuxR6ERKFAA94SSDCAHJuz3CAAEjJdntgYDKNEwieBc9wgACIy9Z4AYgC8ADYx3KAAIjL1npE +igghgQAIIQEAACFAAUkgwQMWbjV4z3GAAAjNAGHPcoAA5CxEgs9xgACIzNZ5WIIhgUV5BCGBDwAA +AAgmeAPwA4XPcYAA5CyYHQAQJIEogQQhgQ8AQAAAPrlTJAIAHuE4ekV4mB0AEBcIngekFQAQjLik +HQAQUNicHQAQePArCN4HpBUAEI24pB0AEM9wQAFQAJwdABDPcIAA5CwkgBCBnrgQoWTwBdgUuJwd +ABDPcIAA5CykHcATJIAQgZ64n7gQoVbwjwheJwGFcwgeARKNNBKBMEkhwQBybs9ygABIyXZ7YmIR +Cp4Fz3KAAIjL1npBigPwANrHcYAAiMvWeSSJCCBAAAgggABJIMEDFm41eM9ygADkLESCz3GAAAjN +AWHPcIAAiMzWeFiCAYBFeAQggA8AAAAIBnkC8COFmB1AEA3Iz3KAAPy7FXogopwdwBMF8AXYFLic +HQAQEQgeJQDYkbikHQAQBPCkHcATdB3EEy4OIACpcM9xgAAIYnQVAhEJYVlhMHl0HUQQz3GAABBi +8CEAAKQVARAleJgVARCkHQAQGQleAgrZdh1EEHgdRBCAuKQdABAV8BDZz3KAAOQsdh1EEEOCSIIT +Ct4ACtl4HUQQg7ikHQAQA/B4HUQQeg9v/KlwpBUAEEQgfoKMFYEQGPLPcoAA5CxDglSCJHqGIf8D +RLmGIv8OOmLPcYAAqFf0IZEAz3GAAIBX9CGSAA7ww7nPcoAA7KE8efQiUQDPcoAAvKH0IlIAmBUF +EFMgBIDKIIIEFfSIFYEQUSUAgsO5PHnRICKFCPLPcIAAFKL0IEAAB/DPcIAAvKH0IEAAIYULCd4A +hB0EEAPwhB3EEx0NHgJEJQIGI7oB4gQlgA8GAAAAMbgaYgPwAdoDyAGQI+gNyM9xgADEvPQhAACC +6AGVuBWDEHQVAREEJb6PAQAAwHlhOGAQeL4dBBAP9AohwA/rcizYjLiKIxoJYQRv+4okgw8Alebx +PQpQAILizCLigMohwg/KIsIHyiBiC88gIgPKI4IPAAC1BsokIgAsBGL7yiUCAc9wgACIy9Z4A4gH +8M9wgACIy9Z4AoiMFQEQDrgleIwdABDPcIAA1AlAgAaCoBAABofoz3CAADxLAIi3CBAADRIDNq8L +kAEAlc9xgADkRZ8IEgzPcIAAxLt0eBGIiwgRAIMMEQB7CB4gnhUAEc9zgADQRYq4nh0EEBaTAeAQ +eBazAcjnoQWhmBUBEK65r7mwuZgdQBAGgqAQAAYvKAEATiCCByO6DuIPIYAApBUBEJgdABC0uaQd +QBCeFQERp7meHUQQz3GAADBLAKEEIIAP///T9pgdABAN2JgdAhAJ8BDYBvAI2ATwAtgC8AHYB6GY +FQAQvhUBEboML/8A2qQVARAEIb6PAAAAMIIdBBBQ8owVAhCcFQARlB2AEJIdBBCAHYQUAxIDNhkJ +HgMU2JAdBBAqcH4dBBB4Ew4BCvAO2JAdBBB+HcQTeBMOAUpwwngQeLIdBBDPcIAAcLsAgIYgf48L +9JgVDhATDl8SYZOF65G5krmkHUAQELgleKQdABAEIoIPAAAAEM9xgADkLGSBUiICAxCDBXpQo0SB +EIIEIIEPAAAAED15JXgQohTwmBUBEIAdxBOUHUAQnhUBEX4dxBOSHUQQvhUBEbIdBBCQHUQQgBUA +EX4VAhGCFQERGmKEFQARWWE4YBB4iQYv+rAdBBDxwDYOD/piCI/8z3CAAKy9DIjPcYAASMkCuBZ4 +AGEtuFMgAIAF9M91gAB4Qw3wz3GAAOQsIIHEEQEGz3WAAHhDUSFAgQT0AdncHUAQz3GAAOQs8CEA +AM9ygAA8SiCCGIhFCTUBQR0YEDMmQXCAAFxSQCcAcjR4AHieCyAIA9guCyAIQNgA2OAdABAO8M9z +oACoIDGDAoIA3sKiOGDgHQAQAdgSo/0FD/rxwJhwuHEUeDhgz3GAABBXCGGMIMOPyiLBB8oggQ8A +AKwTyiOBDwAAiwFkAWH7yiHBD9HA4H7gePHAB9jPcaAA1AcaGRiADhEChg0aGDDPcKAASCxeoB8R +AIYHGpgwARoYMATKnODMIIKPAACRAAbyABYAQAAWAEADzM9xnwC4/xihfdj6DmACARIBNgTK0cDg +fuB48cC4cQK5z3KAAEjJNnkwIkQAUSRAgsoiwgfKIIIPAADLIsojgg8AAJMD0ABi+8ohwg9ALYEB +z3KAAAjNIWJRIUCCiiIIBcoiYQPPcYAAiMsWIUEBIokOuUV5IKDRwOB+8cCaDA/6z3KAAIgrRILP +dYAAkJJihUCCNrs2ulBz1iKNDwAAgADAhT1ifmYdDYUTCiHAD+tyiiCNAoojEASYdlkAb/u4dR5m +/w2Fk1hguQQv+g4ggAPgeOB/ANgUeDhgz3GAAKBi4H8IYeB44H8B2M9xgABYQ+B/8CEAAPHAmHAK +IcAP63IKJcAHz3AAAJ8ZCQBv+zvb4HjPcYAANEPgf/AhAADxwJhwCiHAD+tyCiXAB83YBbjlBy/7 +RNvPcYAAbEPgf/AhAADxwJhwCiHAD+tyCiXAB89wAAChGb0HL/tN2+B4z3CAAJBG4H8AmOB4z3GA +AFQKJIHgfyCgEYjgf8K44HjPcYAATEpGgYoh/w8goAbqIoIgoAHYA/AC2OB+z3GAAGxKRoGKIf8P +IKAG6iKCIKAB2APwAtjgfooh/w8goM9zgABsSkaDEuokghsJXgDPcYAAlEkPCkAAz3GAALBJEQpB +AECC5QuBgALYBfAigiCgAdjgfvHAEgsP+s8IEADPdoAAbKQvjs9wgACIy891gADkLDZ4IogDhQDf +z3KgACwgNBARATwSEgAOjoDgnAApAMolqRCMIgGkkAAlAMolJRFklpTjwCOGDwAAkwDPcKAAaCzw +INAA5aJQ2EUhQQIY2rYL4Akg2/i4yiUiEi70A9jPcaAA9AcFoYTaDXBAsEIiACgNcgCyQIYNcECg +QpYNcECwA4VAgA1wQKADhUKQDXBAsAaWQCgCJcO4DLiCuAV6DXBAoOShDo4B4A6upgpgCCpwAd0Q +8ADdz3aAAGykegxgBgSWANjPcYAAcEQOrh6BAeAeoX0CL/qpcOB48cAiCg/6GnCEKAgJACGBf4AA +DJyHEQ0Gz3CAAAgKAoCgvYcZWAMEiA/oA4GN6AohwA/rcsnYBLiKI5wOCiQABOkFL/u4dQKBm+jP +coAACKQTEgCGjCDDjwryz3CAAIgrBIAAgAKhHBoYhBbwz3CAAFgzABgABHoOoAcA2AzwkggP/4Qo +CCkIcQAhgH+AAAyeGgnAB/EBD/rxwIoJD/rPdoAAhKArCPQAGnAeljoWBREKIcAP63IQuAUlBQDP +cAAAgwyKI4UPZQUv+wokAARAKA0h3WUllQSVELkleDjoz3CAAMRi8CABBEQoPicAIYB/gABsSC93 +IKAjlQKVELkSCC//JXgIcQAngB+AAGBIngjAB89wgAC4YvAgAQQAJ4AfgADER0eVIKAjlQKVELoQ +uSV4JpVyDm/7RXnWD8/+CHEAJ4AfgAC4R2IIwAdelh2WANkPIQEEELpFeAYgQIAB3R22MLgethr0 +z3GAAIg4AIGguMYNYAQAoc9wgACIKwSAltoe2yCAz3CAAMSgoqAhoAzZLgqgBhi7ENrPcYAAEAsA +gQAqAgRGeN0AL/oAoeB48cB6CA/6AN3PdoAAhKA+lg8lDRAdlhC5JXgGIH6DQfTPcYAAiDgAgYC4 +AKHPcIAAAArPcYAAEDAAkEeJNwoBAM9wgAACCgCQQYkrCgEAz3CAAAQKAIgmiRsJAQALyAQggA/+ +//8DCxoYMAvIh7gLGhgwz3CAAIgrBIDPcYAAxKCW2h7bAIAAoQDYAqEocAzZfgmgBhi7ANj2C2AA +gNk+lh2WELkleKV4HbYwuDkAL/oetuB48cDhxV4MYAAodYDgyiBBAwgMIQPKIWEAIQAP+jEHz//x +wKIPz/luCGAHAN3PcKAA0BsRgBcI3gNmDCAIAdjPcYAA5EUJgQHgCaEGyAMSAjY7CB4ApBIAADMI +ngTPcYAAMEMAgRPooKEBCZ5Fz3CgAMQsC4BTIIEE/rjMISKAB/KYEgAAygzv/gDaAxIBNqARAAAX +CB4EiiAIAAwaHDDOCCAEKHAu8EkIHgUHyNCJANozEY8ABCCADwEAAPBBKA0Dz3GgADguB4EPIkID +AdxGeAehDcg6C6AJACwAEMd3gABIyQK+1n4S599noK+KIBAABhoYMAPIoBCAAMTgKA9BCQPZz3Cg +ABQEI6AhB8/54HjxwLIOz/nPdYAAQJUBhc9zgACIzEQgBIPPcIAArL0MiNJo1n7HdoAASMlAhhZ7 +IYMS8lAijwXgpkYhAQYhow0MEQGRv+CmBfCxura6QKb2DEAJB/CWukCmRSEBBiGjC42iuLkG7/kL +reHF4cbPcIAArL1MiIwiAoDPc4AAQJUX8sqLz3CAAIjMMmo2ecdxgABIyVZ4QIGhgAXulbpAoau9 +BPC1ukChi72hoADYC6vBxuB/wcWhwfHAUSAAguHFqAAhAAh1RCUDFgQlgh8GAAAAI7sxugHjemIE +JYAfwAAAADa4z3OAAABiSmMIY1hgQS2CElIiAgDAugO6GOKF4MoijQ8BAIkN1SIOAFBxUgAlAADY +7b0YACEAAiGAAM9xHEfHcQUofgAKIMAOA/AiuEEtQRPAuQS5NHmpcsa6SSLCBVR5z3KAAGxZMmIP +Dd4SQSoBARQhggAFKj4AQSkAcgjcywXP+QohwA/rcjvYjLjPcwAAVxJKJAAAPQEv+wolAAHxwDIN +z/nPcIAArL0MiIwgAoAr8jJoNnnHcYAASMmggc9zgACIzM93gABAleSXFntBg1AljhWGJ7sfwKGM +J0SQRiICBkGjBfSRvsChC/Cxvba9oKEPD1EQlr2goUUiAgZBo2ILQAkA2c9wgABAlS0F7/krqOB+ +4HjgfuB44H7geOB/ANjgfuB48cAmCw/64HjgeOB44HhpIIABbyE/AGkgAAD38fHAigzP+Rpwz3ag +ANAPAN0H8BAWAJb9YfhgEB4YkCNtbwhEICUWA5YlFgKWLyTHACUWAJZPfw99CL2lf9cMEYOC58wn +4pPMJyKXyiVCECH0z3WAABChSa0lFgKWCq1LrSUWApZorUytomkVD9ETz3CAAB2hcg0v+g3ZDeUT +DxEXz3CAACqhYg0v+g3ZDeUQFgCWAiBBIzhgEB4YkFEE7/kB2OB48cDuC8/5ocEIdSh2hOUA2Jj3 +i3AuDS/6BNkAwBsIgA+aCVBvz3GgANQLD4FkvbhgD6EB2AbwqXAmD+//yXEPeBkE7/mhwOB4z3OA +AIg4QINFeACjGenPcYAAEDDPcIAAAAoAkEeJOQoBAM9wgAACCgCQQYkpCgEAz3CAAAQKAIgmiR0J +AQALyAQggA/+//8DCxoYMAvIh7gLGhgw4H7geOB+4HjxwM9zgADMCWhwSgwgAATZBGtCDCAABNnR +wOB+ANjPcYAAgAoBqTkHIAkAqfHA4cWqC6/9Mdi0aKILr/0z2AV9GL3PcIAAlFJ+CyAHkL0ouG0D +7/mleOB44cUyaDZ5z3KAAEjJIWLPcoAA5CwtucC58CJDACiDUSEAgM9xgAC0u0GBCfI8i4DhxSKB +DwAACgID8kUiQgNKJAB0ANuoIIACNmh1eQAhjQ+AAAjNQKUB4wDdz3OAAIjLFiMCAKCqoaoB2SKq +A9kjqkokAHGpcqggwAF5YhZ5pKkB4uB/wcXgeOHFSiQAeADYqCAACADbz3WAAGgrQIUPIwMACyLA +gA/yQYULIsCAQNrPIuIHyiKBDwAA0ADPIuEHAvAA2s9zgAB8HxV7QKMB4OB/wcXPcIAA8EoGgAOA +IIDPcIAAJIgpoJ0GL/wR2OB48cD+Ce/5AdnPcIAAMDMkoIogxQ/PdqAAyB8ZHhiQKHAocihzOgng +AJhxsg3v+wDfeg/P+891oADQD/Wlz3CgAMAvehABhom5i7l6GFiAz3GAAAC/EBhYgP4LgAGiC8/+ +RgqABkDZz3CfALj/MqAWCsAIgNnPcKAAFAQsoB0dWJByCsAHOgmAB1YI4AfpcAfYSB4YkKYOgAX6 +C0ABqg8AAI4IQAPuCoAG9gvAAooPwAbaCEAANg4ABp4Jz/tuC8AAvg5AB4oLD//KDgAESggAAYYN +gAWyCcAEYgiAAwIJj/7uCQAE5gkABKYLgAbPcAAA/soeC4/7cQHP+eB48cD+CM/5pcHPd4AA5CwD +hwiAwLgiCCAILyAAIADdz3agALRHz3CgAIxEuKAA2JO4dx4YkAjYdx4YkADYnrhTHhiQ4HjPcIAA +WAIQeFMeWJNHHhiQz3CAAHAFEHhIHhiQTyCAI0UgAA1PIMYHNNhEHhiQHNhFHhiQz3CAANyHAYhG +HhiQz3CAAHDHjgmgBAyISiSAcM9xgADQ0agggAPPcoAAtLsBgnRtdHs7YwOjAoIB5QSjz3WAAAxL +AIUD6GQeGJBDHpiRGg3gBwHYA4cIgECFHwgeAFMiQQASuUQiAAMOuCV4hiL/Awq6RXgR8EhwhiDz +Dwq4BCKBDwAAAAwGuSV4BCKBDwAAADACuSV4z3GAAMA4AqGLdalwfgov+xTZONhkwADYBNlGDuAH +qXLPcAAGGwBOHhiQKQDv+aXA4HjxwOHFEN2qDGABqXAH2Qu5z3KgAPAXMaLPcQAA8P84orKiugtA +ARUAz/ngePHAlg+v+QDaz3CAAAgKQ6D/289wgAAIpBMY2IBKJIBwSHGoIEAHhCkICQAhjn+AAAie +z3eAAGxKQaYG3aWmz3UBAPS1pKZGpuemJB6CEAAhjX+AACieQKUB4c9wgAAIpBwY2IDPcYAA6DcA +gRzaQKAY2A4IIAACoYUHj/k52c9wpQAIDD6g4H7/2c9wgADkmyCoANnPcIAAjJvgfzWg4HgA2oDh +yiRNcOggrQH/2VxgIKwB4uB+4HjxwOHFz3GAABi7z3CAADxiagjgBkjaz3CAAGxbz3GAAAALWgjg +BgjaAN3PcYAA/DuhoaKhz3CAABQ/qaDyCSACA4HPcKAALCDPcYAAhD9QgBCARaEGoRoNoAGpofkG +j/nxwADZz3KAAISgIKLPcIAAiDggoD2yMLk+stHA4H7geOB+4HjxwFoOr/kg2QDaz3WgAMgcKaXP +caAAlBNboc9zgACcImCD82jPdoAAIL0MhvV/UyDEBfBj+2NTII8ApMGLcTsP0RAfhpu4H6Y0FoAQ +4osbCMEDKHBAIwEERGsSCqAHQCYDHA3aKvAehpG4krgeps9woADMFyvwIQ9REUEqAlJAIwAEwbqC +Ca/9iHMfhpy4H6YN2hTwLLhTIAIAH4YDupm4H6bkgwXiBScAEQChBYMBoQaDAqEHgwOhA+LPcKAA +zBfPcaAAlBNcoQHaiOofhpe4H6Yg2AqlGfAAwQPaGBhYgAHBGRhYgALBGhhYgAPBGxhYgBQYmICK +FgEREBhYgATZJ6UWGJiAvQWv+aTA8cBODY/5pBABAKLB2wlfBiDZz3OgAMgcKaOkEAEAXQneATGI +z3WgABAUI7nAuQO5BeED2k+lRoVBwo3hEN7KJuIRBhQPMYwnw58J9AQUDzHxdswn6pAB3kL2AN7r +7sWARX7HpbGIhiX8Hxi9pXrPdaAAzBdaoBbwRYDPcaAAEBRHoaQQAQAVCZ4CMYjXuoYh/A8YuUV5 +OqDPdaAAzBcN2QHaA+ENHZiQDh1YkCaAGR1YkCeAGh1YkCiAGx1YkAPZFB1YkHAQAQEQHViQcBAB +Ac91oAD0BwThJ6VHo6QQAQCZuaQYQADRBK/5osDxwGIMr/kE2Qh1DRIONgbYDRoYMM93oAAUBAqn +z3CAADBi4g6ABgCF2g6gBgTZAYXSDqAGONkIFQQQAYUAEAUBCQwQABUNBQEKIcAP63IZ2Iy4FQDv ++m/bA4WqDqAGiHEBhUKFIJAFhZoOoAZCecqnWQSv+Q0amDPgfuB4z3KgAPxEOYIEIb6PAAAIIADY +BfQ9gvm5AvIB2OB/D3jxwADYnLjPcaAArC8coRqBUSCAghqBC/KquBqhGoHnCB6Acg8v/QHYCfCK +uBqhGoHTCB+Abg8v/QHYANmbuc9woADQGzGgCgsACdYIAAnPcIAA6EIAgEIgAIDKIGIA0cDgfuB4 +8cDhxc9xgACEoH6RXZEQu2V6Ad0bCg8Az3GAAAxIRCg+B1YKYAcAIUAOqXAC8ADYqQOP+UaBCeoj +gWCBIoJieTBwANgC9gHY4H7gePHAGguP+Qh1z3aAAGxK3g/v/8lxB+ipcNIP7/9AJgEYg+gA2Anw +z3GAAExKvg/v/6lweegB2FEDj/ngeM9wgAAsCQ6AgOAB2OB/wHjxwJIIAAAG6I4IAAAPCFEAz3CA +AFwzAICD6ADYEvCOCAAAj+h+CAAAi+jPcIAALDAskM9wgADkLB6Q4wkBgAHY0cDgfm0DoAAR2OB4 +8cC4cM9xoACsLxiBGQieBgohwA/rcoogjAln22UGr/pKJAAAFYEbCB8ACiHAD+tyiiDMCWjbTQav ++kokAAAB2NHA4H7gfwDY4H8A2OB/ANjgfwDY4H8B2OB/ANjgfwHYz3CAAMwjAIgG6M9wgAC0IwGI +A/AB2OB+DQleRwnIvbgJGhgwANmduc9woADQGzGg4H7gePHA7gmP+c91oADIHyQVDpYVDh4ShRUA +lnoPj/uKIAQAJB0YkFEmgJDoDQIJLQKP+fHAugmv+TTYyg5AAM93gAAAfi8IHgR+DGACANhSDGAC +AdiKJhAQAN3OD+/+qXAUJ0wTYb4AtPUOdZAB5Q7wANuKIhAAIg6gA3B4FCfMEGG6ALT1CnWAAePJ +AY/58cBeCa/5NNihwQDdag5gAEDFz3eAAABmMwgeBLoNoAAB2APeCr4A2Iy4uGAQeItxrg6gAAHa +FCdME2G+ALTrDnWQAeWCDYAAEPAF2wq7A9oKunhltg2gAxB4FCdME2G6ALTzCnWAAeVdAa/5ocDg +eM9wAQBsHs9xgADUJGEZGADPcAAAeE9VIUIHQCEDAwboHaMbgYO4G6HPcAAAWE8G6AKiG4GCuBuh +z3AAAEhPBugAohuBgLgboeB+4HjxwOHFb9iVuM91oADIHxIdGJDPcAEAQDwVHRiQBgnAB4ogBAAO +pfUAj/ngeOHFANvPcoAAhJVKJAB0z3WAAPyVaHCoIAACQCUBEhR5YLEB4Ehwz3GgAAQlD6FWIgAE +EaFWIgAFEKHgf8HF4HjxwDYIj/nPdYAA5CwFhc92oADEJ3UeGJAMlXYeGJAHhXkeGJAQlXoeGJDu +De//AN8b6Hce2JN4HtiTgB7Yk4Ee2JMHhYYeGJAQlYceGJAHhYoeGJAQlYseGJAFhYgeGJAMlYke +GJAFhYQeGJAMlYUeGJDB2FAeGJAlAI/54cUIccO4z3KAAASW9CIDAMm7cHHKJCJ0yiAiAOggIgL0 +Ig0Ayb0JCUADAeDgf8HF8cDhxQh1z3GgAMQnGREAhgHagOAREQCGwHqA4gCl0SDhhwDYM/TPcIAA +nL0MgM9xoADIH2TgHqEQ2A6hAdgVGRiAsg/gCAvYUSEAxsogIgAY9CUIXkfPcaAA1AsWgTiBJOAV +CEUAjg/gCAPYCQsfQAkInkQY2APwANiA4Mog4gTPcaAAkCM+gSCleQdP+eB48cD6Dk/5z3aAAOQs +FSYBEECBaYK4ikErwADAuBe4x3AAAIAc5LvPICIG4LtO388gogDKJ4IfAABOAYblzydhEikLXwHP +dYAALDAYFQQRvpYbDQERoYbEFQ0WEQ1fEaCGxBUNFgcNXhGBuFEjAILPIKIFG6L8okCBz3A6BEpw +HaKggQfYjgtgAAq4BCCADwcAAAAwuFUIFQIzJgBwgABoUkAnAXIUeQB5iiAEAB6lGfCKIBAAHqUV +8ADYi7gepRHwANiMuB6lDfAA2I24HqUJ8APYDLgepQXwANiOuB6lgiABAYEGb/kepQohwA/rcozY +jbi+24u7SiQAAAUCr/oKJQAB4HjPcAAAVVXgfvHA8g1P+SGAz3WAAGgrAoAgpQDeAaXCpc9w0P4A +AG4Lr/8Epc9ynwC4/92i8g2P/iCFGQneB89woADIOx2ABujPcAAAVVUH8N2ifOnPcAAArd4NBk/5 +4HjPcAAAVVXgfs9wAABVVeB+z3AAAFVV4H7hxeHGJIjPcoAA0GKmiMK5LmIA2Q8hgQPPc4AAZJpA +g4TtJnpAoxjwRXkgoyWIFSONAyOlJohFiFlhJqUggIwhEIBF94ohEAAgoCO5IaMAgCq4AqMA2c9w +oADwNiygI4MloCaDJqAkgyegJ4MooCWDKaAogyqgIYMroCKDLaAggySgwcbgf8HF8cDODE/5CHea +cbpy2nMKIgAhCiNAIQohgCHPcAAAyBvuCWAACiDAIfpwz3AAAMwb3glAABtwz3AAAAQc0glAAM92 +oADIHztwAdgTpgbYz3WAAJhGAKXhpQgdABUMHUAVEB2AFRQdgBQYHcAUHB1AFA7AIB0AFM9xgACI +KwmlBIEAgAqlCIEAgAulDIEAgAyloBYAEA2lpBYAEA6lqBYAEA+lz3BDdagSEKVmCWAAKNgRpV4J +YAAA2BKlUyfAdROlAchUHQAXFqUSFgCWUB0AFxelExYAls9xoADIHBilFBYAllMhAjMZpRUWAJYQ +uhqlJBYAlhulFhYAlhylz3CAAGhFF4Adpc9wgACYRngYgArPcIAAmEZ8GMAKz3CAABRHBBgAC89w +gACYRoQYQAsogYgYQADPcYAAAAAkgYwYQAAvIccFCLklei8hBwZFeZAYQABCCWAAJdm1A0/58cCa +C0/5z3OAACxHQ4MA3891oAAsILCF0mrUfn5mpaYEpkAiQoAmpkOjBvICg+OjAeACo80DT/nPcYAA +iCsIgQDaQKAMgQHZQKDPcKAAsB80oOB+8cBKC0/5C8gA3gQggA////8DCxoYMNYNIADJcM91gAAI +ChGFgOCkDCIAyiBiAIkDb/nQpfHAegkAAIwg/4/KICEA0cDgfuB48cACC2/5atiiwYtxAdr+DmAA +SHOP6AohwA/rcs9wAADSFIojxQSKJIEK2QZv+kolAABAJIExRNgB2tIOYABIc4/oCiHAD+tyz3AA +ANMUiiPFBYokAQGtBm/6SiUAAOYK7/kGFAAxkQgQAIHBa9gB2poOYABIc5DoCiHAD+tyz3AAANQU +iiOFB4okwQp1Bm/6SiUAAAQUADFAJIEwAdpuDmAASHOP6AQUBTEKIcAP63LPcAAA1BSKI0UISQZv ++ookwQoCFAAxz3aAAIRPG3hBKMUATCWAjAAeQBHU9gohwA/rcs9wAADVFIojhQkVBm/6iiTBCh3Y +z3aAAIRPAKa4cAAUADHPdYAAjNdALYIAqXH6DWAAAduQ6AAUBDEAFgUQCiHAD+tyz3AAANYU1QVv ++oojBQxAhicKcgAA2BYlARBgiYYj/w0juw0LUQBhiQTrYrthqQHg6QiCgADYEQJv+aLA4HjxwIoJ +T/mnwTpwenEaclpzi3DPcYAA0FNGCm/5GtrPcYAAhE8ggQDYgOG4cboALgCKJf8fz3GAAKgjABGE +AIom/x/JdQLw6XZMIYCjAdrPcYAAjNcWeWCJwiKMAEQjjwD9f3cKwQPhiUQjAgQkukQjBgJBLsYA +RCMBASK5WwiBIR0MUQCA4cwiIYAH8oHhzCJhgADaAvQB2k96BfCA4gHawHo3ClEATCIApgHawiKK +AIYj/Q8nuw8JgACA4swgYaAL9DJ3zCMhgAnyA+8F6wsJwiMPDsITyXcE8AHZCPAIdQHgZwhEgQDZ +iiD/D4TpgOXKIEoDjCD/j8oggQ//////FfIyJII0z3GAAIzXDwpRAGJxFnkCEcAACfAWeQsKkQAG +EcAAA/AHEcAAuQBv+afA8cAKDc//ag5P/yYNwAW2C0//CiHAD+tyPdiKIwsOSiQAAE0Eb/oKJQAB +4HjxwM9wgADkLAKAwhAABlEgQIAUCoIF0cDgfuB48cAaCE/5GnAodTpyz3CAAPSgpgqv+kTZz3Kg +ANQLfoIAJYEfAAAAIM9wgADUCmJ5YKDMuc9wgACcvS+iDIDPcqAAyB9k4B6iENgOogHYFRoYgE1w +hiD8A9DgzCCCjwAAgAAS8owgA4QT8gohwA/rcgokgArPcAAAMhGKIxoNqQNv+rhzCnCWCm/7KnIE +8H4Lr/oKcBPoz3KAACC9P4Kc4LO5P6IA2s9xgABAlUupz3GAAHSSTLHKIIEAwQcP+eB48cBmDw/5 +z3CgAMQnUhABhkEQAIaGIOOPAN0G8uu50SGigULyz3CAAOQsA4AJgM92gAD0oC0IXgFWCYADiegU +joHgyiAhAXwLYf/KIWEAz3CAALChAIANCJ4ARglgABCWtK7PcIAAsKGgoE1whiD8A4wgAoAU9M9x +gADQIwCBAeAAoc9wgADkLAOAGIiE4BwKQf+iCYAD3g8P+wbwjCADhMALgfotBw/58cC6Dg/5AN4C +3c93gAD8nUAnABuELggZMCBADlEgAIB0DCL/yiCCA2G96Q11kAHmDgggAADY7QYP+eB4gODxwBDY +CvJuC0/7sg4gAYogBADRwOB+OgpP+4YOIAGKIAQAGgwABw0IkQA2DCAHANjy8fDx4HjxwEoOD/nP +doAAEAsA3QvwENi4eAshAICgDCL/yiBCAwHl8Q30kCCGgOHKICEAcAphAsohAQCBBg/54HjxwOHF +z3WAAAgKEIWf6L4LAAeC4NgLIQfKICEAAdgQpb4Jb/sR2M4OIAAQ2BGlCeiuCW/7ENj6DSABiiAE +AM9wAADo1d4Jr/+A2TkGD/ngePHAvg0P+c92gAAICs91gADEMwOG8CUAEEB4fegNBg/5z3GAAOQz +AIHXcACAAAB0BcH8AIHXcABAAAA8BcH84H4B2s9xgABgM0OpGKEocGTZddoe2/0GoAUYu+B48cDP +cYAACAoDoU4Kb/sR2I4NIAGKIAgA0cDgfvHARg0v+QHaocHPcYAAXDNAoVsIUQDPdYAA7J8ahYwg +w48K8gDahCgICQAhgX+AACyeQKnPdoAACAoMhgbojg/v/wuGANgMpv/YGqVGDaAGi3AN6P4JgAMA +wc9wgABYMyCgqgngBgDYEfCuCG/7EdjiCYAD8gwgAYogCACGCgAHguCkCiEHyiAhACkFL/mhwPHA +z3AAACBOWgiACM9xgADgMwChz3EAALgLz3CAAEwzIKDPcAAAiBM6CIAIz3GAAFAzAKHPcA8AQEIq +CIAIz3GAAFQzAKEF2BoIoAgLuM9xgADkNwCh0cDgfuB44cXhxkEtAFTBuBcIFQEzJgBwgABQUkAn +gXIUeQB5ANgX8M9xgAAgvZgRgABAKAIGhiD9D1IgwAFFuEV4z3KgAIgkEKIfgbO4H6FK8AHYENvP +caAAyBxpoc9zgAAgvZgTjQAA2s92gAC4XsaGQC0BFoYl/R9SJc0RxXlFvaV5z3WgAIgkMKU/gwLd +RCg+DQAhgH+AAAjHlbk/o89xoADwF72hpICKEwMBpqGjgBTjpqGigFMjw4CmoaGApqHAICEIwCAi +DGCAc6FsaGCDc6H4EAOCc6H8EACAE6FKocHG4H/BxeB48cDhxaHBCHXPcNS6/spAwATw8gugCAHY +z3GfALj/uqEE2Buhi3AeoQDanbrPcKAA0BtRoM9wAG0AEBmhAQleRwDA0wiAj9S6/sqhAy/5ocAA +289ynwC4/xqie6I+os9wAGwEABmi4H7xwA4LL/mYcCh2GgggAEh1BiCBA4hwTgggAKV5XQMP+c9x +gAAAOGCJz3KfALj/BuvPcdC6/so+ohqiDuvPcKAAOC4FgAQggA/AAAAA8QiAj8AAAABq2Bi4GaIc +guB+4Hjhxc9ygAAAOKCKz3KfALj/Be3Pc9C6/sp+ohqiO6IO7c9woAA4LgWABCCAD8AAAADxCICP +wAAAAGnYGLgZouB/wcXgeOB+4HjxwGIKD/nrcM93gADUJgCHNQhfAM91gAB8KwCFUiCAAAClCfDP +cKAAqCANgOTg7AAFAEoP7/9U2AAVBBCGIP8O5QgBgc92gADgNJgWAJZ/CJ4Ayg4P/891gADkLMkV +ABaluMkdGBCTFgCWpbiTHhiQ1xUAFqW41x0YEA6FpbgOpQCFyBAABoYgf47KICIAyiECACAKovnK +IqIBAYXIEAAGhiB/jsogYgDKISIABAqi+coiogEAhc9xgAAYu8QQAAYluMC46g3v/AqhmgpP/n/Y +CrjPcaAA0BsToX/YEKEA2JW4EKHPcQAAbB4KCiAABtjPcaAA8DYEgUYgwAEEoZTYug7v/xjZAIdR +IECAcA7iAMogIgC1AQ/5CiHAD+ty29gEuIojBQJBBS/6SiUAAOB48cA2CS/5AdhmCWAHAN3PcKUA +CAzPdoAAMDOioASGUSCAgGwMAvrPcQAAOAqWCSAABtgLyAUggA8BAAD8CxoYMASGIwieAM9wgADo +QgCAi+hmDm//iiDGCAsIUQBSDMAEDPAA2Z65z3CgAPxEIaDgeKGgyg2gBQDYqg3P/BYOwABmD2AG +AdiCDC/7AdgVAQ/58cCiCA/5iHUA3wroGQhRAAHez3CAAKwjwKgG8M9wgACsI+CoCekbCVEAAdnP +cIAAqSMgqAXwz3CAAKkj4KgK6hkKUQAB2c9wgACrIyCoBvDPcIAAqyPgqM92oADIH89wgACsIxge +2JMAiIohEAAR6M9wgAAhLACIC+jPcAMAQA1FHhgQMKYC2BgeGJAC8DGmz3CAAKkjAIgb6M9wgAAi +LACIF+jPcAEAtPwgHhiQz3CAACgAIR4YkM9wgAAoCSIeGJAYFgCWRSAAAxgeGJDPcIAAqyMAiAjo +GBYAloUgAQQYHhiQDwtRABgWAJaIuBgeGJAYFgCWgLgYHhiQGO0A2JS4z3WAACgMAKVx2Aa47gzv +//zZIIXPcAAATBzeDO//n7kYFgCWhbgYHhiQ3QfP+PHAmHAD6SMMEgjPcIAAsAkAEAUACiHAD+ty +z3AAANoOVQMv+nnbz3CAAAg4FSAAASCg0cDgfuB4ANlKJIBxz3OAAMCHKHKoIMAB8COAAAHiBXng +fy8oQQDhxQDaSiSAcc91gADAh0hzqCCAAfAlwRAB4yV6ANmeuRl5BCGAAEIgAIDKIGIA4H/BxeB4 +8cDPcaAAyB+kEQIAz3CAAIQ/AIA1gc9zgACQkpYgQQ8QcgDayiJvAAGD1bmB4AHYAvIAgw0IUQAN +CYQPAACIEwDYA/AB2IHizCBigGwKIfvKIOEB0cDgfgLhMHlBaQ0KAwAieBB4A/AC2M9xoADIHx6h +ENgOoQHYFRkYgOB+4HjxwOHFUN0A2s9zoADIH6+jXqMCIEIAXqMB2hUbmIBA2k6jBCC+zwACABCw +D8H/sQbP+OB4ANnPcIAAsKEhoM9wgAAgvRyQYrhIIEAAEHnPcqAAyB8fghB4CCEBADB5AtgVGhiA +P6LgfgLhMHlBaQ0KAwAieBB4A/AC2M9xoADIHx+hiiAYCA6hAtgVGRiA4H4A2c9wgACwoSCgIaDg +fyKg4cXhxs9xgACw0UWBJOjPcaAAyB9AEQ4Gz3OAACC9QCiNAkITAAF8k9B+2GC7Y2K7CCMDAAJ7 +CSLCAALYFRkYgM9wgADkLF+hA4AigM9wgACwoSKgwcbgf8HF4HjgfwDY4cT8HMi+/BxIvuHA4cHh +wuHD/BwIsfwcSLH8HIix/BzIsfwcCLL8HEiy/ByIsvwcyLLhxeHG4cf8HAi0/BxItPwcCL9qJIAQ +4cRqJMAQ4cTxwM91oADQG1wVEBB72HIJr/+KIQQDz3CfALj/HYDrdstwz3AAAEQcBgrv/wonwB86 +cBeFB9j6Ce//CrhTIEEHB9guCu//CrjPcKAA1AsYgEIgAAhIIAAAz3OAAHhDz3GAACgMIIG8GxgA +CyFAhMogIgMu9B8IkSAXCZ4liehRIUClZNjKIIEPAABcACDwNNge8IwgBKAZ8kwgAKIR8gj2GwhQ +ICcIESGG2BLwFwgQJIwgAaAL9EzYCvBm2AjwPNgG8EbYBPBU2ALwhNiTEwMG6XHJcgokAARBAC/6 +CiVABOB+4HjgfwHYz3KAAAgKIoIliRLpz3GAAOyfeoHPcYAAKJ6EKwgJMCFBDg0JXwAI2AuiAdgJ +ogDYBKIF2AOi4H7xwOHFCHUocAXrz3GAAAB+BPDPcYAAAGZbeqIM7/i0eU0E7/gB2OB4z3CAAAIK +AJAG6ADZz3CkABxAMqDgfuB4z3CAAAIKAJAG6APZz3CkABxAMqDgfuB44H7geM9xAQDHA89woADs +Jyag4H78HAi08cAacJoI7/8k2JhwUSAAgMohwQ/KIsEHyiCBDwAAUSbKI4EPAAApAWAH4fnKJQEE +z3GgAKwvGIGHCBEgDwieBs9wgACUOACAQHj02ADZMgjv/wHaNNgA2ZG5Jgjv/wDaMNiKIQYAGgjv +/wDaNNgA2QPaDgjv/xS6Jgjv/zDYwrgJCFEAANgD8ATYz3IBAMYDz3GgAOwnRqHPc6AAtA88gyPp +ARIENnATBQAKIcAP63LPcAAAUibVBu/5iiNFBpq4GKFWC2AIiiAPCs9wgACUOACAQHhCC2AIAdgy +CG//iiAFA4foBNjRwOB/BBQQNETZz3CgAMgcKaAeC2AIAdg6DUABwvHxwH4Kz/iiwSh2CiSAgADf +z3WgACwgQBUQEAAcxDMT8ncMUABMJICAgvIKIcAP63LPcAAAVCaKI0QFTQbv+QolAAQyaAQhgQ8A +APz/jg+v/yzYEIUCIAAEjCAPigj3Pg+v/yzYCHfvCB6ABfAAhoC4AKYqD6//NNgXCF4FAIYA2QDa +gbgApjTY8g6v/5W6ML8CHMQzfPAPeRC5BSGCDwAAgv3PcaAA7CdGoQQggA8AAAAfSLiGuBC4BSCA +DwAAQv0GoRCFAiAABIwgD4oL94txig6v+YogDw0AFAAx5wgegATwAIaAuACmgcFyDq/5iiBPDAQU +ADENCJ4AAIaBuACmi3WKII8PVg6v+alxIMAIuAIcBDCKIM8PQg6v+alxIMECFAAxJXgCHAQwMvDP +cQMAQv7Pd6AA7Ccmp89xBAAC/ianhrgQeBC4BSCADwAAQv0GpxCFAiAABIwgD4oL94tx+g2v+Yog +Tw8AFAAx5wgegQTwAIaAuACmz3AGAAL/BqdAJIEw1g2v+Yogzw4CFAAxUQHv+KLA4HjgfuB44H7g +eM9xpwCISQDaCwhRAAPYDqEC8E6h4H7geOHF4cbPdYAA0DigjQDewKOR7YHgzCEhgA3yCwoTCMCj +CfDA4gbYBvZCIgAIQ7gC4ACjwcbgf8HFuHBA3AAhAIPxwA4AJACYcYwgAoCL9gohwA/rcs9wAADJ +FHUE7/mKI8gPz3CAAJBV9CAAAc9xgACQVgQofgEvcPUhAQFCKAMEwbtSuAQpfgEvcUIpAgTBulK5 +gePAIGkAgeLAIWkAiCA+AIkgwQ+IIT4AiSHBD4Dg1iArCIDh1iErCHIJAADRwOB+4HjxwPYPj/ih +wTpxAN+A4MohwQ/KIsEHyiCBDwAAyhTKI4EPAADTAsokwQDgA+H5yiXBA89xgADUOECxz3GAANY4 +4LFMIQCgyiXOE2QALgDKJs4TGndadwXwyXcadWpwQCBTAItxAdquC+//ANsAFA0xLyPIJKl2Kb3I +vr/l2SUpFEwiAKDKIMIDyiGCA8oiAgRIDSIAyiNCA8lw3g7v/6lxQiFRILUJdaBAIlIgyXAeCSAA +qXGZB6/4ocDgePHAQg+P+Dpwz3CAANA4AIgacZUIEQDPcYAAyAqliQSJHWUydcohzA/KIswHyiCM +DwAAyxTKI4wPAAA4A8okTAQMA+z5yiVMAwDdz3eAANE4AN4J8ADZIK/uDu//itkB5s9+ACCBL4AA +yAomiQFpMQ4DEEApgCAUeLV41HjPc4AAPKQQY1JtbegC4BB41HrPc4AAMKRSY+DpAdnf8QHlr32x +DdKQ/QaP+PHAog6P+M9zgADWOECTUyJNgCDyRw2REM91gADICgmtKK0ihc92gADUOACWKd0Svc93 +gADROBUlDBAgpOCPB+9WIA8I8H/1fSClAeAAtgfwz3WAAMgKC60qrQHirQav+ECz4HjxwDoOj/gI +dhpxz3WAANY44JUL8Mx/5g+v+EApQHFFuI4N7/8KcSCVjCEQgLT2cQaP+OB48cD6DY/4CHbPcIAA +0DgAiHpxocEacssIEQDPcYAAyAqliQSJHWVydcohzA/KIswHyiCMDwAAzBTKI4wPAACFA8okzATI +Aez5yiVMA0ohACAA3QrwAR5SEAaPhOggrgHmAeWvfc93gADICgAnABQGiAHgYw0jEAJ3QCuAIBR4 +FSBABLR4z3GAADykNCESAADZxQoQoItxSnAC2n4J7/8A2wvoARSAMAEeEhAGj9roARSAMACu1fEK +IcAP63LPcAAAzRSKI44GCiSABEUB7/lKJYAAQCFRIC8hRyR5CdKgdQWv+KHAANtgqREIcgBgqg0I +0wNgqeB/YKoPCJIIwOAF9gHYAKkR8OTghvaMIAKDyiCsAMn2jCBChIn2jCBCiQf2A9gAqQHY4H8A +quB+8cDSDI/4o8FKIQAgi3EqcEogACEKctYI7/8qc47oCiHAD+tyU9gGuIojBQEKJEAEsQDv+Qol +AAQgwhUKEgAAwEEoAQJTIcQAEwwSAQHZz3CAANA4VQIgACCoz3GAAMgKQKkCGQIBQSgOA1MmxRAD +GUIBTCXAgMoiyQfKIIkPAADCFMojiQ8AAFgBWADp+cohyQ9BKAIEUyLGAAQZggFBKAIFUyLFAAUZ +QgFMJkCAzCXsgMohyQ/KIskHyiCJDwAAwxTKI4kPAABeARgA6fnKJIkBQSgCBlMixAAGGQIBQSgF +BwcZQgFMJECAzCVsgMoiyQfKIIkPAADEFMojiQ8AAGQB4Aep+cohyQ8EFIUwjCUBhLQALAABGUIB +CiHAD+tyz3AAAMUUiiNFCrkHr/mYc891gAA8pADfA/AB5+9/QSgBAsO5bQ9DEADeE/BAKYEgNHkK +FIAwFSFBAQHmz34UeblhABkEBIAgAiMvIAgkAMBBKAEGw7kB4cMOQ5CCwQpwAtpqD6//ANsLFIQw +LygBAU4ghQcvJUcBtQ3SgAohwA/rcs9wAADGFDkHr/mKI0YCQCFRIC8hRyRBKAEEw7l7CUKgBPBt +DlOAQSgBBcO5CnWpCXIASiAAIEoiACAF8EAiUiAvIockQSgBA8O5ewpDIEohACAU8AK+1H4KFIAw +FSZOEUAhUSAvIUckFH4AJoAfgAA8pKCwgCUCE7B9AMBBKAEHAeG7CUOgMLjDuAAgDgSCwalwAtq2 +Dq//ANsLFIQwLygBAU4ghQcvJUcBqw3ygM9+CiHAD+tyz3AAAMcUhQav+YojhghAIFAgLyAHJEEo +AQXDuWUIQqDT2Qi5ANgD3s9ygAAwpADbsmh0fV1lILUB4297ViEBCPELsoAweWG+AeDnDnWQD3iF +Aq/4o8DgePHADgqP+KLBQMBBwkAoFAVAKRcFAN1AKhMFQCsSBQHeSiWAIal3BPAKdcp3AMAVuBN4 +FCDABbYLr/gH2QIgUAMCIEAjpguv+A7ZzH4KIUAuBCk+cC9wrH4AIQ11HWUBwBW4E3gUIIAEgguv ++AfZAiDWAwImwCN2C6/4DtkEKH4EL3HsfgAhwHQZYUItABUSCe//VLlCJVUgAeaRDXWgz361Aa/4 +osDgePHAagmP+DpwunHPcIAAIL0AkEokQCAA2UogQCCGIPwAjCACgMIkAiVKIoAgz3CAAECVK6jP +dqAA0A8lFg+WJRYNlkIhgCAQFhaWKwhEAwIgUQMMIYCkyiIuIEIN7/jpcJhwANgpDBAgFQ9QEQ0P +0BIH8EojACAu8AHYA/AC2M9xgAC0IySBCyEAgATyANoD8AHaACJAI/oK7/nKcQojAKAY8icMEALP +cIAA2CsWIAABQIAGiCsPARAT6qlwYHqqcQogAKAG8sJ1EB5Yk2kKEaBMIwCgzCAioBHyANgQ8Aoh +wA/rcs9wAAAxEYojFwtKJAAAmQSv+QolAAET2LkAj/jxwOHFz3CAAFQ5CBAEAEwkAIDKIcEPyiLB +B8oggQ8AAGkZyiOBDwAA0AFgBKH5yiUBAc9ypQAIDAgSBQAA2UwlAIDMJSKEyiHCD8oiwgfKIIIP +AAB9Gcojgg8AANcBLASi+cokIgBA2AKiz3CAAIytYIAK8PQgTQDPcKYAAIA1eAHhoKDS4YQrAgoA +JEAOtPekEAMBz3GkAKA/faGmEAABHqEIGkABWQCP+OB48cBZJFw4i3DPcYAAxFKSCK/4iiIEAkok +QHgA2aggAAMWJEAwYYBAkCvYErgB4VV4YKAweVYkXDjRwOB+8cCKDCAAR9gA2s9xqwCg/1mhB9ga +oVih0cDgfuB+4HjgfuB48cDPcYAAVDk4gYDhEAwCANHA4H7xwM9xgABUOT2BgOFQDQIA0cDgftUG +QAfRBkAHzQZABwDZz3CAAIytIaC9BeABIqDxwOHFz3WAAIytxg/gAalwuHAAhRLoSiSAc89zgAC4 +OADZqCDAAkCDRCm+AzIiQg4/CkABAeER8ADZSiSAec9ygAC4W6ggQAJEKb4DMiJDDh8LQAEB4Qoh +wA/rcs9wAACGGYojRAHVAq/5SiQAAEEHb/gocM9wgACMrUCAI4AM6s9wgAC4OACARCm+Aw3gMiBA +Dgnwz3CAAMVbRCm+AzIgQA7gfs9wAAA+Pc9xqgDwQwWhz3IAAD09RqGKIMgPB6HPcAAABgsIoc9w +AAARFgmhz3AAABseCqHPcAAAHx4Loc9wAAAbFgyhz3AAABELDaGKIIgBDqHPcAAAPz0PoVChPtgR +oeB+4HjxwCoOT/h+DSACAN0OCyAAB9hGDu//GnDPdqQAuD2sFgAWz3elANjLOdmiuKweGBAB2Kyn +9h4YEM9wFQArK5oeGBCKIMQAnx4YEBrY8x4YEPQeGBBk2MgeGBCq2MkeGBBp2MweGBDA2M0eGBDP +cKUACAw+oCoPz//OCSAACnAY2JUeGBDPcYAAQCuhocjYAqEAoQOhz3EBAGCrz3CAAFAl1BhAAJTY +C6dB2c9wpQDMfy2gz3CkAAyAoqDVBU/44HjxwBoIAAA+D8//igsAAEIMz/rRwOB+4HjxwEoNT/jP +cIAAOLpAIBIGCHHPcIAA1AkgoADexKgE30QuPhcKIUAuACGAf4AAOLq6D6/5HNmELgoSACGNf4AA +qK2pcKYPr/mKIQoChC4CFwAhgH+AAMi3GnCSD6/5nNkAIZEkABlAI2G/oR0YFLUPdZAB5jEFT/jx +wN4Mb/hEKD4HACGOf4AAOLoQrgHf8a4hrkCuYq4DHgIRcq5SCSAAEx4CERkFT/jxwKYMb/hEKD4H +GnA6cc9xgAA4ui9wGmFRihthHwpQAAohwA/rcs9wAACyKF7biiTDD4EAr/kKJQAEFQjQIM9ygADU +CQQaAgQ4YACiAYsgi1KLygkgAHOLMgsAAQpwEgsgACpxoQRP+PHA4cUIdUoJIAUA2LIJT/xE2c9w +oADIHCmgFgmv+BzYz3CgAKwvGID6uHAO4QHKIEED/9nPcKsAoP85oDigsg3gAKlweQRP+PHA4cVe +DO//CHVuC2ACqXBlBE/4z3GgAMgcCKHJAK/4BtjgePHA2gtP+KLBooFgkM92gABoCrh7o4FkfWCG +pXumgQGQuHingWCmpHihhkAhDwSleAGmHeoBgQIcxDAwuwQcxDAAHAQwIIGLdWB5qXABhyGGAhxE +MDC5BBxEMCCHABwEMGB5qXAA2ACmAabZA2/4osDgfuB44H7geOB+4HjgfuB48cDhxc9wgACwOCCA +Ad1gealw57gnuFIgAADKJSIQyiFCA8oh4QHAuBN4wrjPcqcAFEgLoiyiz3CqAOAHs6CVA0/44Hjx +wOHFz3GgAMgcqIEIofIPb/gG2HkDb/ipcOB48cD+Ck/4CHbPdYAAjK0ApSGlWK2yC+//ea0iDO// +A6UEpc9woAB4RQCABCCAD3AAAABBKD6FAN319coP4ASpcM9xqwCg/7mhB9gaobih1gwAAoDmAdjA +eAzgQgiv+gHZCQNP+PHAigpP+Ah3z3WAAIytGI1IdjpxGnMTCgEAhe4ZjQsIAQQA2ALwAdgvIgcg +6XDaCSACyXEghQDYDw9BECGFMnHMIiGgAvIB2C8mB/AarRfy6XAqcclySg/v/wpzIgyAAgGFz3GA +AAAKALEAhQGxGI0EqX4LoAIKcAjwgOcB2MB4DOC2D2/6AdldAk/48cAIcwDZAtqEKwoCACGAf4AA +qK2EKQQPBOC+CCAFJ3BhuukKdYAB4dHA4H7xwM9wgADQ02oMr/mKIQkMz3CAAAQwXgyv+RTZz3CA +ACgzUgyv+RTZ0cDgfvHAnglP+KLBOnAacQDdkg7v/wfYmnAC2alwWnB6cQDbNGgCcSh1FCEAIGhy +woUEEA8F2H/DhQHixH/le/EK9IAg5QGBAhzEMDC7ABwEMCCBBBzEMGB5i3BCI0Egvwl1gEAiQCBm +De//inCJAW/4osDxwDYJT/g6cFpxz3eAAHDHDI/PdoAAjK2lhoYg/wFDuA4lDZDPcIAAoDgggMol +YhBgeQTYIOgajoDgzCUhkBzyANgQ3RpwArgVeMdwgADYOCCABukigBXpYHkqcGG96Q11kEAgQCAA +2BquDI+GIP8BQ7gFpk4Nr/hKcBkBT/gKIcAP63LPcAAAZRk32wokAAS1BG/5uHPgePHAQpAhkGCQ +ELpFeSnaEroVIsMAIKMAkPAiAADRwOB+8cDhxc9xgACougCBAN0V6M9ygADUugCiCIGgoaShCKI+ +DG/6Cdg6DG/6A9jPcIAAeEluD8AFz3CAAPw7ngugAAOAz3CAALw/uQBv+K+o4HghAE/68cBSDKAC +4cXPcIAAQEk+D+AFAN3PcIAAXEkyD8AFz3CAAHhJJg/ABc9wgAD8O6Kg2gtv+gPYz3CAAIQ/o6Bx +AG/4oaDxwOHFz3GgAKwvHIG9gQR9z3CAACAsAIgTCFEAz3DA3wEAHKEo2Ri5CfD8vWgNggL2vXAN +QvoA2Zu5z3CgANAbMaApAE/44HjxwCIIAACiDwAA0cDgfuB4z3CAAPw7AICB4AHY4H/AePHAjg8P ++M9wgAAYu8eAwL6B5gHez3GAAGhBAIHAflsIXwCBuAChz3WgAMAvE4UNCJ4GE4W6uBOlAtgRpc9w +gACgOCCAYHkA2BkIEQLOD6AHCtgL8M9woACoIA2A5OCP9xCF9QgegCoL7//JcBUVAJaAuBUdGJCF +Bw/4XBUEEEAVBRAKIcAP63KKIEwJAQNv+Yojhg3xwOoOD/gIdc92oADALxqGObhSIAAAUyARABSG +EQjfAO4LL/8k2PK4AN8D8gHfURYAlovooxYAlgQggA8AAAAPjCAQgAP0ANgC8AHYGnAEIZJPAAQA +AM9wAAAIHLILD/8/uFIgAwAEIIBPAgAAANdwAgAAAAHawHoMcIYgPQCA4AHZwHkTCJ5Bz3CAAPwK +AICB4ADYAvQB2AHe5b3KIYEjQwkQIOa9yidhEB3v473KImEgMwoQIOS9yiNhABPr4r3KIGEgHwgQ +IOG9yiJhAAvq4L3KIWEAB+lRJcCRyiBhAIPoANgC8AHYXQYv+A944HjxwOHFz3GAAPRTQIEhgafB +RsHPcYAA/DsigUXCFSRCMM9xoAAsILCBz3EBAAAOQMEB2UHBQsEQ2UPBRMBFggDYDNkIc5hwuHAA +JYcfAAAAfUIMb/3YcCkGL/inwPHAzg5P/s9yoADALwDZiBpAABOCi7gTos9wgACkIgGQELhFIAAP +wBoAAM9wgAAQP2INL/ogoNHA4H7gePHAANmbuc9woADQGzGg5gqAAAzoz3CAAPwKIIDPcIAAPD/w +IEAAQHjRwOB+8cA+DQ/4GnDPcIAAGLsHgM9xgADkLFMgDQCB5QHdIIHEEQEGwH07CV4Bz3GAAKQi +YZHPcYAAAAvAgTzjeWZk4R8JBAQKIcAP63J+ZoogzAha2wokAATxAG/5VSZFFgDfHwjRAM9wgACk +IiGQz3CAAAALAIA84ThgZOACIBAgC8gEIIAP/v//AwsaGDALyIe4CxoYMGoI7/+pcDYKgADPdqAA +wC9RFgCWhegMdIQkwp8W8heGKQhfBs9wgADUJgCAHQhfAAohwA/rcgokAAhRFgWWiiBMCHEAb/l/ +20cNURAQhjcIHwDPdYAAqDgghWB5AdgRCFEBIIVgeQLYGwiQAEAWBBAKIcAP63KKIIwIjds1AG/5 +uHOKIBABEaYQhgEIHwAUhqu4FKbPcIAA1CYAgILgEtjAKCIGyiAhAM8gYQYZps9xoADIHxgRAIah +uBgZGICKIBAAEaEJ2Ai4D6EThqm4E6bPcIAAGLsHgIPgzCDigQf0QCiAIJ+4iB4AELYNwAXPcIAA +aEEZBC/44KDgePHADQlRAO4LAAAE8MoLAADRwOB+8cAmCaAA4cWOCG/6GtjPcIAAFD8AkM9ygAAA +u1IgAQDAuQHhIKoA2RcIXwDPdYAAhD9qhQsLUABrhYHjAvQB2SOqQSiBAsC5NKopuMC4z3GAAPw7 +wQMv+ACh4HjxwEILD/jPdaAAwC8XhRqFz3agAMgfiBUAEAfYGR4YkAHYCHEIcghzegov/5hwLggv +/1TYgBUPECK/jgvgBelwz3GAAOxEEoH4YBKhANiIHQAQCdgIuA6mUQMP+PHA8gvP/4DgANnKIEEA +GfISC2AGKHDPcYAA/AoggYogTAa6DGAAA9oODmAAA9iWCs/8CNgWDCAAiiH/DwHY0cDgfuB48cDP +cIAA/AoAgBMI0QCWDA/96grP/94OAADRwOB+4HjxwIIKL/hKJEBxAN7PdYAAhD9AJQMcqCBABM9x +gAAUP9V544EVI4wD4KQLCFEAAd/joQHmz34B2LECL/hEHQIQz3CAAKi6AdkkqCWoz3GAABQ/AJGG +IBgAqLgAsdrYA6nPcAAAUMMBoc9wAQCghnEEYAACofHAz3KAALw/DoqhwVMIUQAPih8IEwGA4HQP +4f/KIGEAD4oB4A94D6qhwNHA4H4A2A2qDqouCCAAD6qWD8//ANjKC+//jLjPcK0LvrpAwItwBNl9 +2j3bUgugBBe75vHm8eHFz3KAAIQ/RBKAAEAiAwwnCFEASiRAcQDZqCAAA/AjTQDPcIAAID81eAHh +oKAveQDYRBoCAOB/wcXgeADaz3GAALw/T6kB2A2pTqlMqVCpUalSqVOp4H9UqeB48cBSCS/4AdrP +cYAA5CxjgXiLOQsRAQCBz3GAAPw7xBAABiW4UiAAACGBwLgB2oDhz3GAALDRJoHAeoDhzCAhgMwi +IoB88oDwEQgeAM9wgAAAuwCICQhRAJhyBPBKJAAAz3CgACwgcIDPdoAAhD9FhqaGAiOAgADayiJv +AAIjT4MA3colbxAXDgVwAEAAAAfqAiOAD04AASAFphcOxXMAQAAAB+0CI4APTgABIAamAYYW6M93 +gAAUPwCG4YcfZxEPBRAZD8UQEQsEAAjwCQsEAAkPxRAA2APwAdgBpiCBxBEDBkErQQFRIQCAyiZh +EAbyKYaD4W8mCxDPcYAA/Dshgc93gACw0eaHgOEB2cB5gOAB2MB4hid/Hobn0SNigQDbAvQB24Dl +zCIigMwjIoDMICKAzCEigMwmIpAE9ADYBfD9DBCAAdh1AA/44HjxwK4NQALPcIAAMDMEgFEggID0 +DgL+CdkIuc9woACwHzSg0cDgfuB4z3KAAPw7IYIGeSGiANnPcIAAGLswoCWA4H8xoPHAxg/P9891 +gAD8OyGFJXgBpc9xgAAYuxCBocGF6AHYEKEFgRGh+gvv/YtwAMHPcAEANAIZCEAAz3ABAAAOEQkA +AM9wAQCwHAsJAQDWDC/9AdgA3s9wgACEP8GgOgsv+gfYNgsv+gjYdgtAAs9wgABASWYOgAXPcIAA +XElaDoAFz3CAAOQsAIDEEAAGDQheAYYNIADJcAXwegpgAAOFlQfv96HA8cAiD8/3CHYA3cYN7/8o +cIDgyiBBAxQI4v/KIIIDcQfP9+B48cDPcIAA0KAIgEUI3wHPcYAAFD9CgSGBz3CAAGg/QKDPcIAA +hD8noM9xgAD8CiCBiiBGALoIYAAC2hIKYAAC2P4K4AQC2FIMz/kI8M9wgAD8O/oJYAADgNHA4H7x +wJ4Oz/codT0I0QDPcYAApCIhkc9zgAAAC0CDPOE6YiGDZOJZYSEJRAMKIcAP63KKII0BiiPGB0ok +AABlAi/5CiUAAc9xgAAYu892oAAsIPCGngtgAAehIggABiYOr/wB2P4I7/+pcAHYKgigAOlxz3Wg +AKwvHIUTCF8GGIWIuBilBgsv+KDYB/DPcYAAaEEAgYK4AKHKCs//SgpAANCG5g2v/AHY+gwAAIYO +YAcy2M9wAIIBABylkg3v+QImwBMA2NIPYADJcT0Gz/fxwOHFz3GAAAC7ABGEACEMcwClwQMRhQAV +DVAACiHAD+tyiiANAbEBL/nx2zcMkQADiZnoANgAqc9xgAD8CiCB+dgH3YIPIACpctoIYACpcM9w +gAD8O0oNr/+joD4Nj/9e8M9xgACougSJHQhRAAWJFQhRAM9wAAD//z4O7/8A2Z0IEADPcYAA5CwA +gcQQAAYNCF4BA4EYiBsIEQHPcYAA/AoggYogxAQeDyAAAtoC2DTwrgtAAGkIhA8AABQEz3CAAPw7 +AIANCFEABgvP+SjoANnPcKAALCCwgM9wAQA0AkDAAdhBwELAQ8FEwQbZCHIA25hzuHMAJYcfAAAA +fWILL/3Yc89xgAD8CiCBiiAECrYOIAAB2gHYCghAAC0F7/elwOB44H7gePHAqgzv9wDZz3KgACwg +0ILPcIAAhD8IgM93gACw0QImDRDPcIAAALvlh2OABS/+EDd1AdugiMIjzgClwQsNUBADiCMIUQDP +cIAA/DsjoM9xgAD8CiCBz9hGDiAAANoA2Efwz3WAAOQsAIXEEAAGhwheAYMLUQADhRiIewjRAM9w +gAD8OwGAt+jPcIAAPCsAkIHgAdjAeAy4WwiADwAAABCwgs9wAQAADkDAAdhBwELBEdhDwADYjLhE +wChwDNkB2ghzmHC4cAAlhx8AAAB9agov/dhwz3CAAIQ/z3GAAPwKIIHIoNjYug0gAAjaCNgODwAA +IQTv96XA8cDhxQDZz3CgANAbm7kxoM9wgAAwMwSAOwieAFIMT//PdYAA5CxNhT6VUyIAAFYJ4AMB +2wCFxBAABhsIXgEDhRiIEwgQAc9wgAAYuweAEQjeAM9wgAD8OwOADPDPcYAA/AoggYogSQc+DSAA +AtoC2JIOAAC1A8/38cA6C8/3z3KgACwgMILPcIAAiCsEgM92gACEPwCAoIYCIUMD13MAAKAPAN/L +989zgACw0aWD1bhBLYMQYn0LCEQDAYag6GOG4aZvC1AAz3WAAKi6AIUc6AWFGugwggJ513EAAFDD +AdjCIA4AJejCCM//BIXlpeOmoLgEpTIJ7/kA2Bvwrg/v+QfYF/AF6waGAnknCVIAUyCAwQSmDfTP +cYAA/AoggYogSwKGDCAAAtraDSAAAtjtAs/34HjxwOHFocGKIP8POgwgAEDAYQhRAM9wgADkLACA +xBAABiMIXgHPcIAAPCsAkM9xgAD8CoHgAdjAeAy4JQiADwAAABDPcYAA/AoggYogRQcmDCAAANp6 +DSAAANg58CCBiiBFCBIMIAAF2mYNIAAF2C/wz3CAABA/QIAA2QsKUQAgoCXwz3HA3wEAz3CgAKwv +PKDPcACA///OCu//AdkX6GIOoASLcAolAJAR8s9xgAD8CiCBiiDGAb4LIAAD2hINIAAD2KlwHgvv +/wDBLQLv96HA8cC4cM9wgAD8CgAQBADPcYAAQDtALIAAFHgVIEABAGEVCJECCiHAD+tyiiDNAIUF +7/ig28oMAADRwOB+4H7gePHA4cXPcIAA5CwDgBiIHwgRAQohwA/rcoogTQGKI4QNSiQAAE0F7/i4 +c9IPAAAIdc9wAAC/3x4K7/8A2QsIUQCMJRCVEPeKDu/8AdjPcYAA/AoggYogRQIKCyAAANpiDCAA +ANiBAc/34H7gePHABgnP9/oKwAXPdYAA1CYAhc92oACsLx8IkAAYhhcIngYahlIgAAALCB4AHIYL +CB4HKgmP/xyGNwgeAM9wgABASQCAQiAAgMogYgCR6M9ygAAUPwmCGwgVAc9xgADkLCCBxBEBBgsJ +XgEB4AmiFgnP+M4MD/4bCFAAAIUTCJAAz3CAAPwKAICD4MgMwf/lAM/34HjxwHIIz/fPcIAA/DsA +gC0IUADPdYAA/AoghYDhzCHigcwhIoII8oog0QAA3jYKIADJcsClEgrP/KUAz/cKJACA8cAM8goh +wA/rcoogTQKKI44NIQTv+Lhz4g9P/2YO7/8C2M9wAQAADnYO7/wB2dHA4H7gePHA/g+v9wbYxgvP ++c9wgADII0okAAAAGAABz3CAAOQsA4AYiBcIEQEKIcAP63KKIMwN6tvJA+/4uHPPcIAAgEfODkAF +z3CgACwg0IDPdYAAhD8ghQImQBARDgJwAAAgTpIM7/kH2MClz3CAALDRBoBRIACAfAzi+cogIgLC +C6AEANjpB4/34HjxwOHFQgvv+QjYz3WAAPwKAIWH4MwgIoI38s9xgACEP0GBB+rPcqAALCBQgkCh +z3KAALDRRoJTCh4AhODMIGKBFvTPcoAA/DsCgofoAII7CFAAA4EZ6ADZz3CAAKi6KaAqoADYCgmv +/4y4D/CA4MwgooEL9AOBANoG6M9woAAsIBCAAqFDoSCFh+HMISKCUfLPdYAAhD8BhYPoA4Uj6M9w +gAA8KwCQgeAB2MB4DLg3CIEPAAAAEBIN7/8B2M9wgAD8OwCAawhRAAOFgeAYDaH5yiBhAAOFgOAM +DaH5yiChACfwjunPcoAAqLoKggmiANgKos9woAAsIBCABqLPcIAAPCsAkIHgAdjAeAy4IwiBDwAA +ABDPcIAA/DsBgInoiiCFBkYIIAAC2poJIAAC2L0Gj/fgeM9ygACEPwGCANmF6AOCgOAC8gHZUyCA +wQSiAdrCIoEAANiA4cwiIYAC8gHY4H8PeOHF4cbPdYAADDzAFQMWEwvVD9Jr1H6+ZgCmIaZCpgFr +xbjAHRgQwcbgf8HFz3GAALw/DYkzCFEAz3CAABQ/AJDpuNEgooII9ADYDqkNqRUEr/8PqQHYDqkP +iUIgAIAxA6//yiBiAOB+8cCmDY/3BgqP/89zgAAUPwCTz3KAAAC7QSiBAMC5IarPcYAAPCsgkYHh +AdnAeQy5HwmBDwAAABCig89xgABoP6ChoYPPcYAAhD+noTbwz3GAAPw7oIEpDVEQz3aAAKi6JI4P +CVEAJY6B4QHZAvIA2YDhyiGCDwAAECcD9CKDz3aAAGg/IKYpDVEQz3WAAKi6JI0PCVEAJY2B4QHZ +AvIA2YDhyiGCDwAAECcD9CGDz3WAAIQ/J6Wpcc91oAAsINCF5YECJs0TCQ3fF8Wh5oECJs0TCQ3f +F8ahKIOG6c9xgACw0SiRI6IluMC4kg+v+QPZHQWP9/HAz3GAAPwKABEEALhwz3KAANQ/QCyAABZ4 +FSBAAQBiFQhRAQohwA/rcoogjQCJAO/4dtsAGUABuwiQAD0IEQHPcYAAqLoAgasIEADPcoAA1LoA +ogiBCKIA2AChBKEqCO/5CdgiCO/5A9jPcIAAeElWC0AF0cDgfiMIUQA+CWAEANgLyAQggA/+//8D +CxoYMAvIh7gLGhgw7vHPcIAAMDMEgCEIngDPcIAA6EIAgIrohgkv/pDYDQhRAHYPQAMO8ADanroA +2c9woAD8REGg4HghoOoIYAQocM9wgADkLAOAGIgNCBEBHg+P/YXo1ggAAsLxwvHxwMILj/fPdaAA +wC86hc9ygABoQQCCdwgfAIC4AKLPcIAAGLvHgMC+geYB3sB+DQkeBxCFCQgfAADYA/AB2A94H+4w +hR8JnwJAFQQQTBUFEAohwA/rcoogTAlpB6/4iiOFBhMIUQCKIBABEaXiCyAHCtiKIBAAEqXWCyAH +BdjPcIAAnDgggGB5yXClA4/34HjPcYAA/DtAgScKUQDPc4AAqLoEiw0IUQAFi4HgAdgD8gDYgODK +IIIPAAAQJwX0z3CAABQ/AoDPc4AAaD8AoykKUQDPcoAAqLoEig8IUQAFioHgAdgC8gDYgODKIIIP +AAAQJwb0z3CAABQ/AYDPcoAAhD8HogkG7/8DgeB48cDPcAAACBzCD2/+ocEfCN4Hz3CgACwgEIAE +2XzaPdtAwItwJgwgBBe7ocDRwOB+4H7geOB/AdjgfuB48cDhxc9xAwBADc9woACoIC2gz3GgAMAv +FIHwuBSBDPIEIIAPCAAAANdwCAAAAAHYwHgH8IYgfw+C4AHYwHjBCBEAFREAhqC4FRkYgBHwz3Cg +AKggDYDk4M91oACsL473HIWRCF8GDHSEJMKfQvQWC2//Wtht6ETwiiCJA2IOL/6KIckJz3GgANQL +O4FSDi/+iiCJAyxxSg4v/oogiQM5hT4OL/6KIIkD5g5v/iTYCHEuDi/+iiCJA9YOb/6KIAkDCHEe +Di/+iiCJA+t1wg5v/iTYuHDPcKAA1AtsEAQAiiCNCgohwA+pcpEFr/iKI4kLz3GgAMwrEoGAuBKh +8QGP9/HAWgggAOHFHgggAAh15gggAAhzcHXKI0UDEHPRAa/3yiDFAPHA4cWhwQDdQMW6DW/9i3CC +4Iog/w8M8s9wgABMSgOAIIAAwCJ4gODKIEwDnQGv96HA4HjxwKHBANhAwM9wgAAAuyGIi3AnCVEA +z3GgACwgMIHPcoAAhD9IgkJ5Dw5FcE4AACCWDU/9A/B2DU/9EQiRAIog/w+hwNHA4H7PcIAAbEoD +gCCAAMAieIDgyiAsAPPx4Hjhxc9xgACIKySBIIHPc4AAbEpDg9W5oIJGg4og/w+A4gXyAoKieEgg +AAAJIEAAarhIIAAA4H/Bxc9xgABsSguBQIAOgYDgyiCBD/////8K8gKAQnhIIAAAmSAGAEggAADg +fuB48cBOCI/3ocEId89woAAsIEAQEgDPcIAAIL1fgADdRCcBE4jhQSqAARpyhiD+L0ohQCDCIUIk +wLhBL0ITwLrPdoAAhD8WJgMQQaOI4cwgIYAI9AGGBOiSD8/8BPBiD8/8z3CAAOQsA4AYiA8IUQDP +coAASMkX8LoNz/036M9wgAAsMAiIYwjRAc9wgAAgvZgQgADPcoAASMkCuBZ4AGJLCF4Dz3CAACC9 +mBCBABJpFngaYisPHhMAgoi4AKIB2A+qz3CAAOQsAYDAEAAGESBAgMwhooO0CwIHB/C+CyAHr6qA +4KwLAgfPcIAA/AoggIfhzCEioDbySnBnCBAgCKaJ6c9xgACougqBAeAKoRrwRhaAEC0IUQDPcO3+ +vrpAwItwBNl92j3bzgggBBe7Rh5CE0UeQhN6DW//Rx5CE9ILT/kHhiaGQnACIEIACQrfBwamTBaA +EA0IUQBMHkITAvAApkkHb/ehwOB48cDyDk/3CHbPcKAALCDwgB0O8hEA3QohwA/rcoogDQKKIwkD +mHXRAq/4uHM3CZABVg6P/89wgACEP+igz3CAAPwKAICA4Mwg4oEJ8s9wgAD8OwGAgOAgC0H5z3CA +ABQ/qaDPcIAAaD/PcYAA/DsggfAggAP4YA8JUQDPcYAAFD+poc9zgACEPyWDAiBCAAkK3wcFo8UG +T/fxwOHFCHUE2c9woADIHCigMguv9xbYz3GgAMAvE4GA5c8g4gLQIOECE6GA5TzaBvTPcIAApCJA +kM9wgACkIgGQELhFeMAZAACJBk/3z3KgACwgUIIies9xgAAACxV5AIEXCIUAz3CAAOQsAIDEEAAG +BwheAUCh4H7xwOYNT/cA3s9woAC0D7yA2gogBMlwz3KAACSIBJLPcaAA7CcQuIUghAAGoQWSELiF +II0ABqEHgs9zpwAUSAejCIIQowOCz3OkALg9mxsYAASCphsYAAWCkhsYAAaCoxsYAM9wpADs/8ag +iiCKAAahegogBK94z3CAADAzBIBRIICAPAqiBcogYgDJBU/34HjxwFYNT/fPcIAAqDgggM9wAAA8 +vaHBgQkBAM91gACAKwCFAeAApQDeFQhRAAHZz3CgAMgcMaCuDeAGKHCLce4Jb/gA2AAUADEIcoYi +/A9GukQgAwxEu0QgAQNCucG4JwqRAAsLkQCP6QbwBumB4cwgIYAJ9M9xAQBCac9woADsJyagAIVC +IECAAKUG9M9woADIHNGgLQVv96HA4HgA2M9xgABgMwOpz3CAAAgKR4ACgEKpHOBWeESISakFiOB/ +CqngfuB48cCODE/3z3GnABRIAN2ooQeBz3aAACSIB6YQgc9ypwA0RAimp6HPcPMP//wQoaDYtqGa +uPUaGADPcaQAuD2bEQAGz3eAAIArA6amEQAGBKaSEQAGBaajEQAGBqb/2JsZWAOmGRgAkhkYAKMZ +GADPcaQA7P/PcAAA//+noQahAIcB4ACnFQhRAAHZz3CgAMgcMaCODOAGKHAE2M4Ib/hAJgESDdjC +CG/4QCaBEs9wKAACAc9xoADsJwahiiCNAAahAIdCIECAAKcF9M9woADIHLGgJQRP9+B48cC2C0/3 +USDAgQ0SDzbPc4AAxLsDEg02z3GAANS89HsRixAThAAS8gHgCHIyFYUQZ5ECGQIBz3ZBAIMAZrHP +c4AA6EUDqRHwQCRCADEVhRBCqcATAwEDqc92IQCCAGaxz3OAAOxFEw2FAMShAIMB4ACjBIFT8M9z +gADku+tjAePBhWSpANpwjXcOHhEvJQgA739JJ8QQ8mvPcIAASMn2f+Bg0o0RCJ4Fz3CAAIjLdngB +iAPwSHAAJI8PgACIy3Z/5I8IJs4TCCYAEKBwSSDOAxZr1XjPdoAACM0AZs92gACIzHZ+YYbPdoAA +5CzEhtiGxXsEI4MPAAAACGZ4AvADhQKhmBWAEGiJDQsAAESpYNgYuATwANiduAShBQNP9+B48cDh +xQPIpBAAAFEgAIDPcIAA5CwEgATyG5AD8BqQygqABbvoz3CgABQEA9kjoCDYDBocMM9xgABwRBaB +AeAWoQPIANqYEAEApBADAJQYQACeEAEBrLuSGEQAvhABAa27gBANAaQYwACQGEQAfhABAYAYhAA9 +ZbAQAQGieTB5sBhEAIIQAQF+GIQAhiPlj7IYRAC4DIL9eQJP9+B48cD6CW/3CHMQiTMRjQAB2kCr +DRIPNs92gADsu+5mz3KAABy8SNzBqw0SDzYCIg4D9CbOE8GzDRIONvAiggNBo0GBIwoeAdKJz3KA +AIjLFnrcq0CKhiJ/DFx6BLpFftyrA/CA2lyrBLgFfb2rHJHPcoAAZLwPsw3I8CIAAASzB8gFo1QR +AAEMswCRDbOgEYIASKMGyAQggA8CAEEADQiBDwIAAACIukijBsiGIL6PBPKJukijnBEAAc9zgAAU +Sya4wLhAKAIDD4HAuA24RXiVAW/3AKPxwBIIIAAC2PYJAADRwOB+8cASCW/3SiQAcgh3z3CAAOQs +FSDQAwAQDSAA3slw2qWoIEANz3GAABxZ9CECAM9xgAC8oRR5QLHPcYAALFv0IQIAz3GAAOyhFHlA +sc9xgAAsWfQhAgDPcYAAzKEUeUCxz3GAADxb9CECAM9xgAAUohR5QLHPcYAAFFv0IQIAz3GAANyh +FHkB4ECxCIULCF4BBNk0pQLw1KUPCB4BCdlGHUQQLtoF8BTZRh1EEDLaW7VZjVlhMHlGHUQQGuE6 +tRcIHgAK2FQdBBAG2FYdBBAH2AfwENhUHQQQVh2EEwXYD6XCDiAD6XA8jShwRB1CEIYgAwDmuVgd +AhDKIkEAC/JQIcMBb3pEHcIQUCDDAW94WB3CEBMJXgFIc4YjAwBvekQdwhANCR4BpbhYHQIQCwne +AKS6RB2CEC8PkBCyCK/56XAAEAAguRAABlEgQIDx2MAoIgHKIIEPAACTAMAoIQGEHQAQGNiNuBOl +CIVRIMCAz3CAAOQsBfK2EIAAibgD8J0QgAASpc9woACsLxmAz3GAADAzMLjAuJoLoAYFoQiFBCC+ +jwAGAAAL8ja4wLgbeAHgWh0EEALYGqUD8FodhBMA2BelGKVaCO/96XAohQHaSHNBKQAFNblSIAAA +UiEBAMC4wLmWDi/+mHKNBw/38cAqDy/3B9jPdqAAyB9IHhiQz3eAAOQsI4fPdawA1AEagUweGJCC +4ALYyiDiANAdAJCKIAQAD6ZGEQABsB4AEEYRAAG0HgAQH9gIuA6mCIFRIACAANiLuAryEKZaDE/5 +z3CgAKQwAYCEuArwEaZODE/5z3CgAKQwAYCkuM9xoACkMAGhz3CAAExLAIAVCB4AhiD/DiK4FLjP +cYAALAkLocYOD/nWCAAB5g0AA2YOAAPPcAAAVVVaHhiQAdlZHliQz3CmACgAL6ADh1oQAQHPcKYA +6AcmoFYNT/0Dhw4IIAQNkADYjB0YkAfYjR0YkADYix0YkM9wgACgOCCAYHkE2A3oz3GAANQkGoE7 +gSR4DwheBF4OYAAC2ATw7gpgBQHYz3KgAMQnDxIAhmOHRCABAhuDDxoYgA8SAIajuA8aGIAPEgCG +BXkPGliAPIPPcKAAMBAkoM9wgAAgvRB4jxoYgM9wgABkls9xgABkphB4ELkleJAaGICKIAQAkhoY +gB2DQBoAgM9wgAAkLFMaGIAPEgCGn7gPGhiAANgQGgCAHoMcGhiA7QUP9+B+4HjxwM9wgADAhxgQ +BAAKIcAP63LPcAAA5Q7e22kBb/hKJQAA4HjPcYAAwIcFgeB/BqGA4PHANNgH9F4KD/5QIEEEBfBW +Cg/+TyBBBI4KL/402NHA4H6A4PHA9NgI9DoKD/5QIAEA9NgH8C4KD/4IcfTYgLlmCg/+0cDgfuB4 +8cDhxaHBaHVEIsAChiL/A0YiwgNUega5NHlZYRV5x3GAALSMi3AI4Z4NL/cE2qlwi3GWDS/3BNoA +2EEFL/ehwPHAwgwP96HBCHUAJI4AYn4CJk4RoHJiegIiAoEA2EDADfIsfot2L3BIcQIOb/zJckIK +oAHJcADAAn2pcO0EL/ehwOB4z3CgACwgEIDPcoAAqLoFos9wgADQoAiAANsZCN4BBIoLCFEAJYoJ +CVAAAdsgggjrAIKB4MwgIoAS8g/wEOkPCFEABYqB4AHYAvIA2IDgVAEC+Q0JUAAC2OB/AKLgfuB4 +8cAiDA/3z3aAAIArAIYB4ACmAN0VCFEAAdnPcKAAyBwxoI4MoAYocM9wgACkCiCQhrkQuQUhgg8A +AMISz3GgAOwnRqEBkBC4BSCADwAAAhMGoQCGQiBAgACmBvTPcKAAyByxoCkED/fxwLoLD/fPcIAA +2DgZgADdgeDKIcIPyiLCB8oggg8AAKgTyiOCDwAAkAHKJEIDjAci+MolQgPPdoAAgCsAhgHgAKYX +CFEAAdnPcKAAyBwxoPYLoAYocM9wgACkCiOQBJDCucK4A7gleBC4hSCNAM9xoADsJwahAIZCIECA +AKYG9M9woADIHLGgnQMP9/HALgsP9892gACAKwCGAeAApgDdFQhRAAHZz3CgAMgcMaCaC6AGKHDP +coAAGDoAis9xoADsJxC4BSCADwAAwmkGoQGKELgFIIAPAAACagahAIZCIECAAKYF9M9woADIHLGg +OQMP9+B48cC+Cg/3CiAAoM91gACUTwAVBBAq8s9wpAC4PQDaNwwRAJsQAwbPcYAAmE9goaYQAwbP +cYAAnE9goZIQAwbPcYAAjE9goaMQAwbPcYAAkE9goZsYmAD/2aYYWACSGFgAoxhYAAHYNfBMJACA +yiHBD8oiwQfKIIEPAAB+GcojgQ8AAPwCQAYh+MolAQTPcIAAmE8ggM9wpAC4PZsYWADPcYAAnE8g +gaYYWADPcYAAjE8ggZIYWADPcYAAkE8ggaMYWADPcIAAMDMEgCK4wLj+DoADUQIv9wAdABTgePHA +3gkP989wgACgOCCAYHkA2CcIEQPPdYAAqDgghWB5AtiL6CCFYHkD2Ifo0g7v/VDYCwieAQDYAvAB +2C8hByDPcIAAgEHPdYAAuDh+Ce/6AKXPcYAA5EUUgQHgFKHPcYAAgCsAgQHgAKEVCFEAAdjPcaAA +yBwRof4JgAbPcYAAVDkEgSsIUQAmgc93gACMrWB5ANgYj892oADsJ5foz3ABAAYBBqbPcBIABgQW +8AohwA/rcs9wAACHGYojxQlKJAAAKQUv+AolAAHPcAEABwEGps9wEgAHBAamIIcDhwnpoIVEKL4D +J3XG2JK4GPBEKL4DACGNf4AAuFvH2JK4BqbPcAAAAjMGps9wAACCTAamz3AAAAJmBqbG2JW4BqZy +DY/+GI9CD6ADIIcvCRAgz3AAAAJuBqbPcMEAQm4Gps9wAwDCbgamz3A2AEKXBqbPcAIAQmsGps9w +EACHcgamBY0QuAUggA8AAEJwBqYEjRC4BSCADwAAgnAGpgONELgFIIAPAADCcAamAo0QuAUggA8A +AAJxBqYJjRC4BSCADwAAQnEGpgiNELgFIIAPAACCcQamB40QuAUggA8AAMJxBqYGjRC4BSCADwAA +AnIGpgGNELgFIIAPAABCcgamC40QuAUggA8AAIJzBqYKjRC4BSCADwAAwnMGps9wAQBGagamz3Wg +AMgfpBUQEBcJECDPcFAAxnMGps9wIADHcwamz3CAAMZzBqbPcEAAQnQGps9wgADHcwamz3ACAEZq +BqbPcBAAxmoGpliPAI8kj4DiAdrAeuoJIAZ5jyTYGNk6CKAGM9opCFAAz3CAAORFUBAEAAwXBRAK +IcAP63LPcAAAihlpAy/4iiMHBw0JECDPcAYAQmsGps9wEADHagamz3AQAIZyBqYNCRAgz3ACAEZq +BqaSDwAGtg4ABiTYAdnaD2AGM9opCFAAz3CAAORFUBAEAAwXBRAKIcAP63LPcAAAqigJAy/4iiPH +DKQVABDPcYAA5EUCIAAEE6HPcAIAR2oGps9wZQDCbgamz3CAAIArAIDPcYAAgCtCIECAAKEE9ADY +UR0YkBkHz/bxwK4Oz/bPcIAA2DgUgIDgi/KaC6/+B9h6cM9wgABwxwyIhiD/AUO4YbiG4PQADQDP +doAAjK0khs9ygAC8qzMmAHCAAFRSQCIRCwS5NHlAIhAKQCISBkAiDwhAIg0EOmJAJwFyFHkAec9x +gACAOkhwVfDPcYAAoDoEalHwz3GAAMA6QCIAAkvwQCIAA89xgACAOlYKr/4A2gSGz3GAAKA6BLgU +eLhgO/BAIgAHz3GAAIA6Ngqv/gDaBIbPcYAAwDoEuBR4+GAr8EAiAAXPcYAAoDoWCq/+ANoEhs9x +gADAOgS4FHhCcBvwQCIACc9xgACAOvYJr/4A2gSGz3GAAKA6BLgUeAJw4gmv/gDaBIbPcYAAwDoE +uBR4InDOCa/+Adq2Ca/+anDhBc/24HjxwM9wgADYOA+AEejPcIAAjK0EgM9xgAAMrQK4FHg4YM9x +gADgOr4Lj/7RwOB+4HjxwGYN7/ZE2s9wgAB0W89xgABwu+oO4AMA3gLdFgggAMlwYb35DXWQAeap +Bc/24HjxwC4N7/YA2s9xgADkLBV5YIEEuAAgkA+AAPxXuRuYAACBBBAPIM92gAB0W74Y2AOggUKG +iiAHD2GGHWXwHYAQ7B3AECCBRobPdYAAcLtlhjhg+BiAABYmwRP0GMAAFiXAEwTgBOGSDe/2CNoM +EAAgFn4WfQRtJG5+De/2CNoVBc/24HjxwKoM7/YS2anBCHYODeAFi3BKJABxANqoIIACFiSAMCiI +CwmSAGG5KKgB4gLCAcPPdYAA5CzVfQCFiiEHD/Rux3eAAPxXOGDsGMAA8BiAAACFBsIFwzhg+BiA +AIPB9BjAAAQXEBDPcIAAcLsWIAAEBOACDe/2CNrjh89wgABwu4fB9ngE4O4M7/YI2gDAIIW5GRgA +IIW5EQAGFQgeAL4Z2AMghb8RAAaAuAjwvhkYBCCFvxEABqC41glv/b8ZGACE6MYJT/0E6ADYA/AB +2BB2DAthBsoggQMAhbkQAQZRIUCA8dnAKSIByiGBDwAAkwDAKSEBAguv+4QYQAARBO/2qcDgePHA +rgvP9s92gACAT891gAAQCxLpIIaN6QCliggv+Q7Yygvv/oogEAAB2ACmDvAghSV4C/BKD+/4DtiW +C+/+iiAQAADYAKYApdEDz/bxwFILz/bPcYAAiDgAgaC4AKFOCm/8AdjPcIAAhKAAEAQATCTAgMoh +zQ/KIs0HyiCNDwAAgQzKI40PAADaACQH7ffKJe0Apwx0AADdFG0AIIEPgACEoAeRxpHkkRC4BX4F +kUORELgFfwKRELpFeBpwbghv+MlxWnDPcIAAxGLwIEEDRC0+FwohQC4AIYB/gAAYSCCgsgnv+wpw +CHEAIYAvgAAMSD4KgAQHDsQTmO/PcIAAuGLwIEEDRC0+Fy92ACGAf4AAwEggoH4J7/tKcAhxACaA +H4AAtEgKCoAEz3CAAISgAIAB5WkNBJDFAs/24HjgfuB48cDPcIAAqDgggGB5AdgPCJEAz3GAAPwf +BvAVCFEAz3GAAEwhz3CAAFQ5IqDRwOB+4H7gePHANgrv9gHYAN7Pd4AAqDggh891gAC0u2B5wKUv +CFAAXQiQACcI0AAgh+t2YHkB2Lhwz3AAALkZCiHAD8lyiiMQCfkF7/eKJIMPAIWYuJm4AKUA2I64 +AaUD2MGtwq0OuAKlz3aAAKw4QIYG2GB6AtlAhgfYYHoC2QKNF/AAhZi4AKUA2MGtwq2OuAGlAqXP +doAArDhAhgbYYHoC2UCGB9hgegHZAY35Ae/2AK3gfuB44H7gePHAz3CAAOxKAIBzCFQBz3CgAKwv +GoBSIAAAYwgfAM9xgAAkiAuBAeALoc9wgACYOACAQHjODwAAz3CAAJQ4AIBAeG4KwAD6CU/+OggP +/c9woAB4RQCABCCAD3AAAABBKD6F9/XPcIAA5CwjgEiBNJFTIgAA3g6gAgHb3gzv+BLY0cDgfvHA +4cW0wc91oAC0R3EVAJYEIIAPcAAAAEEoPoX19Yog/w9vHRiQax0YkKoIb/mLcOoMD/0O6G8VBJZr +FQWWCiHAD+tyz3AAALETuQTv9zTbXgsP+ZYNQAMdAe/2tMDgeECIAdgAoWi6ArpVesdygADYOGOC +Y6FhgmGhYoJioWSCZKHgfwCi4HjxwHYIz/bPd4AA8EoGhwOAz3WAACSIIIBJhQAigA8tAMDGAnmB +CXIAocHPdoAAgCsAhgHgAKYXCFEAAdnPcKAAyBwxoMIIYAYocItxAg2v90LYAIZCIECAAKYH9ADZ +z3CgAMgcMaAAFAQxBCS+jwAAF//KIcIPyiLCB8oggg8AAKYTyiMiDPQD4vfKJSIAAIWCuGYOIAAA +pSIIIAAB2ACForgApSmFx3EtAMDGTg9gBOlwLQDv9qHA8cCWD6/2ANrPcYAA/FMAgbvBV8AEiUok +AHJ4wM9wgADkLAOACIDAuEDAXxSAMM9xgADUJEHAOMBCwF4UgDBDwBqBO4EEeTG5wLmoIIACANsA +JIAwZBjCAAHiT3rPcIAAJIhikM9wgAAACkCQYwuBAM9zgABwxw6Lz3WAACSIhiD/ASgVjRBDuAIg +QIOvi3CLyiBiAIYl/xHbbc91gAAkiCkVjRCGI/8BDiWNk8olYhC7faV4u2vPc4AAJIgqE4MADiND +g8ojYgACu2V4AvAH2IDgZgUhAEXAz3CgALRHRxAAhoDgzCEigE4FAQDPcIAAJIgAEAQAUSRAgMoh +wQ/KIsEHyiCBDwAAqhPKI4EPAAB2ALAC4ffKJSEAz3GAAHDHDonPc4AAJIiGIP8BQ7goGwIAD4mG +IP8BQ7gpGwIAEInPcYAAJIhCsYYg/wFDuCoZAgAA2Z65z3CgALRHUxhYgOB4ANlTGFiAyglP/892 +gACAKwCGAeAAphMIUQDPcaAAyBwB2BGhyg4ABjfAz3egAOwnELgFIIEPAABCLSanBSCBDwAAgkYF +IIAPAABCYCanBqfPcAgAhxAGpwCGQiBAgACmB/TPcaAAyBwA2BGhAMDPcYAAfKQWeWSBQIHPcA8A +APwKuwR7ybples9zpwAUSE2jRYEhgQq6RHjJuSV4DqP+Dg/+RsAAwAroiiH/D89woAC0R28YWIBr +GFiAANgD2UTAUcFIwM9xgABMiAhhqQgzAkfACMEFwBEgQIB+AwEAB8AAJAEwZBGBAIHhbgMhAINw +AdlkGEIAB8HPcKAAtEdgGFiAz3CAAOQsA4AQuZu5MiCADwAA2AKfuYDgAdjAeA+4JXjPcaAAtEdf +GRiAz3CgALRHcRAAhgQggA9wAAAAQSg+hfX1AtkA2BpwB8ARIACE/AIhAFDBz3CnABRIXBgABEkI +ECArCFEgiiDENoohhDgg8BwUBDAKIcAP63LPcAAAqxOk290A7/dKJQAACiHAD+tyz3AAAK4o19tK +JAAAwQDv9wolAASKIII9iiFCPwHBAsAieEnAB8BuCK/8CnE6cAfAEg9v/ApxSsAAhgHgSiIAIACm +FQhRAM9xoADIHAHYEaEKDQAGQClAIRB4ELiBuIe4jLgGpyCGQiFBgAf0z3KgAMgcANgRokokACGK +dUAggDEQeEvAQCGAMRB4TMBAKEAhTcAKJoAkAeFhvSCmEwlRAM9xoADIHAHYEaGyDAAGA8A1bQAl +FxYvJ8glJXgQeBC4hSCKAAanQC+AIYG4l7gAJVMWBqcvI8gkQCuAIYG4l7gGpwvABriBuAanDMAG +uIG4BqcAhkIgQIAApgf0z3GgAMgcANgRoZLAk8GUwpXD1gogBFYkxDI2wInoACCBL4AANEYQiQHg +D3gQqQDAC+i6D8/8EwhRAADYdsAEwIC4D3hEwADAz3KAAHykA7gVIAAEGWIaYgyCKIESwk7ADcC2 +eAAglQ+AAFyIE8DwHYAg9B0AIAnAiCJ8AC8hACAEKb4g5gzv+y9wDiCBDwAAAAFPwRPAiCB8AAQo +fgQvcMoM7/sOwQ4ggQ8AAAABD8AJIYMPAAD/AQkggg8AAP8BSCICAEgjAwA2wFQdmCBVHdggIQhR +AArBGBQEMAS5QCyAAThgtXjHcIAAuKRCsGOwAIYB4ACmFQhRAM9xoADIHAHYEaFaCwAGCsEGwEAv +giGBugS5Brg4YLV4x3CAALikIpA8eRC5JXpGpyKQwLm4eQUhgQQvIkggI5BAK4Ihgbo8eRC5JXpG +pwOQwLi4eAUggAUvJgggAIZCIEGACPTPcqAAyBxKJAAARBoAAUIkVCBMJACgJgbN/wCmFQhRAM9x +oADIHAHYEaHWCgAGC8FAKgAkBrmBuSV4BqcMwEAuASQGuIG4JXgGpwCGQiBAgACmBvTPcaAAyBwA +2BGhEMFhuYDh+gTt/0AgQCARwWG5gOEIwGIE7f8B4ACGAeAAphUIUQDPcaAAyBwB2BGhcgoABs9w +CACGEAanAIZCIECAAKYG9M9xoADIHADYEaHiCw//z3CgALRHcRAAhgQggA9wAAAAQSg+hfb1VgzP ++M9wgAAkiATBDIA4YM9xgAAkiAyhDYEB4A2hoQGv9rvAANnPcIAAQIgsqC2o4H8uqOB+4HjxwHIJ +j/YIdi64wLgEuE8gwQDPcIAA7LwAiM91oADsJ4HgAdjAeAe4JXgQuIUgkQAGpSYOr/YB2IC+xqWh +AY/2z3CAAAchz3GgAOwnBqHPcIAARzoGoc9wgADHUwahz3CAAMckBqHPcIAABz4Goc9wgACHVwah +SdnPcKcAiEkwoOB+4HgB2c9woADIHDCgS9nPcKQAHEAkoOB+4HjPcQEAwCbPcIAAnDjgfyCgz3GA +ACSIAIGAuOB/AKHgePHAuHBTIIEAz3CAADRiKGCB4Mohwg/KIsIHyiCCDwAAlRnKJIIPAAD+AIwE +ovfKI+IIAdjRwOB+CdngfyCg4HjxwHYIr/YB2M91gACoOCCFQHkghQ8IUABgeQHYIIWFCNEAYHkC +2AvoIIVgeQLYIIUjCFEAYHkD2I3o7ggAACCFYHkI2BB5z3CAANwTgg1P9xTwIIVgeQLYIIURCFAA +YHkC2CCFHQiRAGB5CNgQec9wgADUEFoNT/f2DCADB9gt8Ot2YHkC2Lhwz3AAALsZCiHAD8lyiiNO +Bd0Dr/eKJIMPYHkB2CCFQwiRAGB5AtiA4CCFCNgH9EB5EHnPcIAAoA4G8EB5EHnPcIAAuA8CDU/3 +ngwgAwHYRgwP/qIIQADyCAAAAQCP9ut2YHkB2Lhwz3AAALoZCiHAD8lyiiPPB3kDr/eKJIMP4HgI +cViJAYACoYjqWYmA4sIgogDAIKEAAqHgfuB48cDhxc9wgACgOCCAocFgeQTYjwhRAL4M7/yKIMwO +gwhRAM91gACAKwCFAeAApRcIUQAB2c9woADIHDGgog/gBShwSiTAcKgggALPcQEAQmnPcKAA7Ccm +oItxzgtv94ogRgkAhUIgQIAApQf0ANnPcKAAyBwxoAAUBTFMJUCAyiHCD8oiwgfKIIIPAACsKMoj +gg8AAEcDvAKi98okIgApB2/2ocDgfuB48cCmDk/2z3aAAIArAIYB4ACmAN8VCFEAAdnPcKAAyBwx +oBYP4AUocMfYlLjPdaAA7CcGpc9wAwCCKwalz3ADAMJEBqXPcAMAAiwGpc9wAwBCRQalz3EAAMJ0 +z3ADAMJ0BqXPcAMAgm8Gpc9wAwCCbAalxtiQuAalJqW+DuAFCtjPcAAAgmwGpa4O4AUK2M9wAAAC +LAalog7gBQrYz3AAAEJFBqWSDuAFCtjPcAAAgm8GpYYO4AUK2M9wAACCKwaldg7gBQrYz3AAAMJE +BqVqDuAFCtjPcBMAxgAGpVoO4AUy2ACGQiBAgACmBvTPcKAAyBzxoBkGT/bxwK4NT/YId892oACs +LxWGMwgeAM9wgADsvACIz3WgAOwngeAB2MB4B7hFIAAGELiFIJEABqViCq/2AdgB2I64BqWI789w +gACYOACAQHhL8BWGUSAAgMohwQ/KIsEHyiCBDwAAfxnKI4EPAACqAMokwQBAAaH3yiXBAM9wEwDH +AM92oADsJwamz3AQAAZpBqbH2JW4BqbPdYAAgCsAhQHgAKUXCFEAAdnPcKAAyBwxoI4N4AUocM9w +AABCLQamz3AAAIJGBqbPcAAAQmAGpgCFQiBAgAClB/TPcaAAyBwA2BGhNQVP9uB48cDKDE/2z3CA +AKA4IIChwWB5BNgy6M92gACAKwCGAN0B4AAcRDMAphUIUQAB2c9woADIHDGgIg3gBShwi3FiCW/3 +ANgAhkIgQIAApgX0z3CgAMgcsaAAFAExz3WAAKw4hiH/DECFQrlgegLYABQBMUCFA9hgesG5vQRv +9qHA4HjxwEIMb/YD2M92gACgOCCGz3WAAExCYHmiwQboIIZgeQTYhuhJAyAASBUEEAPYGnDPd6cA +FEjPdqAA7Cf2CC/+BdgOpc9wgACAKwCAAeDPcYAAgCsAoRcIUQAB2c9woADIHDGgcgzgBShwA9iy +CG/3qXEE2KoIb/cibQXYoghv9yRtC9iaCG/3Jm0P2JIIb/dAJQESNtiKCG/3QCWBEjfYfghv90Al +ARM42HYIb/dAJYETCIcEpQ2HBaUOhwalz3CnAJhHHIAHpReHCKUWhwmlz3CrAKD/GIALpc9wqwCg +/xmADKXPcKsAoP8agA2lz3AFAMYDBqbG2JC4BqbPcCwAAgEGps9wWgBCAQamiiCLAAamz3BAAIcN +BqbPcNEAwg0Gps9wwAAHDgamz3CAAIArIIARCVEAz3KgAMgcANgRogHYCKcA2A2nDqfPcKcAmEfP +clAA/wBcoAHYF6cA2Ban/NrPcKsAoP9YoHPaWaAagM9yqwCg/4G4GqLPcIAAgCsgoBUJUQDPcaAA +yBwB2BGhRgvABc9wQACGDQamz3AQAAIOBqaLcIIK4AOBwTaFAMAieAQogA8AAHQJFYU3hQJ5Qgxv +9i9wAcJP4M9xgADQiRSlV6EYoc9wQACHDQamz3ARAAYOBqbPcIAAgCsAgM9xgACAK0IgQIAAoQf0 +z3GgAMgcANgRoYtwHgrgA4HBNoUAwCJ4gg4v/BKlMoVVhSx4N4UvIEAOQnk5YdoLb/Y1eeC4HHjA +IGIAgiDEAs9xgADQiRKlE6UWoc9wgACAKwCAAcIB4FWhz3GAAIArAKEVCFEAz3GgAMgcAdgRoWoK +wAUBlRC4hSCEAAamApUQuIUghQAGpgOVELiFIIsABqYElRC4hSCPAAamBZUQuAUggA8AAIINBqYG +lRC4BSCADwAAwg0GpgeVELgFIIAPAAACDgamz3CAAIArAIDPcYAAgCtCIECAAKEH9M9xoADIHADY +EaEEhSuFCKcFhQ2nBoUOpwiFF6cJhRanz3CrAKD/OKAshTmgLYU6oFYN7/0OhUgVBBCMJIKARfaM +JD+BDfa6CeAFCthmC4ADQiBAIIDgAgXN/0gVBBCMJIKARfaMJD+BDPYKIcAP63LPcAAAtBmKI0UM ++QRv97hzz3CAAKojAIgG6M9wgACsQgAQBACIcDkBb/aiwM9wgABMQuB/FIDgeM9xAQDwQc9yAQB8 +OJEAL/sA2OB44H7gePHAz3CAAJg4AIBAeM9wgACUOACAQHjRwOB+4HjPcoAAvAoZCB4AgOFR2MAo +IgTKIGEEwCghBAPwANjgfwCi4HjxwGoIT/bPcIAAoDgggKHBYHkE2IHgAd2c9NoNr/yKIFAMgeCW +9M92gACAKwCGAN8AHMQzAeACHMQzAKYTCFEAz3CgAMgcsaC2COAFqXCLcfYML/cA2AAUATHPdYAA +rDhAhQDYhiH8D2B6RrkAFAAxQIVEIAEMAdhgekS5AdjKDC/3QCSBMECFCNhgegIUATEAFAUxqHCG +IPwPjCACgA7yCiHAD+tyz3AAALUZiiPRBcEDb/eKJIMPAhQFMUwlAIDMJWKAzCWigBbyqHCGID0P +jCACgMohwg/KIsIHyiCCDwAAthnKI4IPAABdBIQDYvfKJGIAAthSDC/3QCSBMAIUADFAhVMgUAAE +2GB6CnEAFAAxhiD/A0S4guDMIOKgEPICFAUxCiHAD+tyz3AAALcZiiORDD0Db/eKJIMPAIZCIECA +AKYV9M9woADIHPGgEfDPdYAArDhAhQHYYHoIcUCFBNhgegPZQIUF2GB6A9lhBy/2ocDxwP4OD/bP +dYAAgCsAhQHgAKUA3hUIUQAB2c9woADIHDGgag+gBShwz3CAAAYhz3GgAOwnBqHPcIAARjoGoc9w +gADGUwahz3CAAMYkBqHPcIAABj4Goc9wgACGVwahAIVCIECAAKUG9M9woADIHNGgz3CnAIhJ0KDx +Bg/2CNnPcIAAtLvgfyOg8cB2Dg/2z3aAAIArAIYB4ACmAN0VCFEAAdnPcKAAyBwxoOIOoAUocM9w +AADCLM9xoADsJwahz3AAAAJGBqHPcAAAwl8GoQCGQiBAgACmBvTPcKAAyByxoIkGD/bxwOoJb/gW +2BYLgAPPcYAA5CwAgcQQAAYPCF8BAYHEEAAGDQheAYoKr/gT2M9wgACMOCCAYHkL2NHA4H7xwF4L +r/yKIIgFDujuDG/9ANjPcIAAoDgggGB5BNiA4NQLAv/RwOB+z3CAAOQsA4AIgM9xgAC0uwkIHgAB +iQPwAongfwCp4HjxwLhxjegKIcAP63LPcAAApxmKI8QLgQFv94okgw/PcYAAtLsggUwlAIAEIYEP +AAcAAEEpAwYA2cokTXHoIG0D8CBFAAQlgg8BAADALrplegsLgQAB4dHA4H4KIcAP63LPcAAAqBmK +IwQOLQFv90okQADgePHA4cUA3c9wgADICaYIIACgoM9wpwAUSKigfQUP9uB48cChwbhwANhAwFMl +gAAnCFAARQiQAE8IEAEKIcAP63LPcAAAqxmKI4oK2QBv94okgw/PcIAAqDgggGB5AdiE4AHZwHnP +cAAAItI0eM9xgABL1g/wz3AAACPSz3GAAE7WB/DPcAAAJNLPcYAAUdYp2hK68CIAAA4ggg8AAQAA +QMKLcBoOIAMD2qHA0cDgfuB48cBqDA/2A8iUEAAAz3aAAIArBCCQDwEAAMAAhkEokCMB4ACmAN0X +CFEAAdnPcKAAyBwxoMoMoAUocM9xJAAHAc9woADsJyagiiGFACagUyCBICsJUABPCZAAawkQAQoh +wA/rcs9wAACIGYojBgOKJIMPAQBv9wolAATPcYAA5CwjgSiBUSEAgMohgg+AAMcgyiGBD4AAhyQm +oM9xBABHSyTwz3GAAOQsI4EogVEhAIDKIYIPgAAHOsohgQ+AAMc9EPDPcYAA5CwjgSiBUSEAgMoh +gg+AAIdTyiGBD4AAR1cmoM9xBADHMSagAIZCIECAAKYG9M9woADIHLGg0QMP9vHAocHPcYAA5Cwj +gS8oAQAogcC5ACGDDwAAItJOIIEHKdgSuPAgwADPcoAAS9Y0eVlhQMCLcNYMIAMD2qHA0cDgfuB4 +8cDhxbhwz3AsAAYBz3GgAOwnBqHPcqsAoP8aglMljQAA2ycNUBBvDZAQqQ0QEQohwA/rcs9wAACB +GYojhQPxBi/3iiSDD89zgADkLGODaIMVCx4Az3OAAMYgZqHPcwMAwgIJ8M9zgACGJGahz3MCAMIC +ZqHPcwQARktmoc9zSABCAWahAdvPcacAFEh3oYG4RPDPdYAA5CyjhaiFFQ0eEM91gAAGOqahz3UD +AIICCfDPdYAAxj2moc91AgCCAqahz3UEAMYxpqHPdUoAQgEg8M91gADkLKOFqIUXDR4Qz3WAAIZT +pqHPdQMAggII8M91gABGV6ahz3UCAIICpqHPdQQAxjGmoc91TABCAaahz3GnABRId6GAuBqiiQIP +9uB48cAKCg/2A8gB3c92pwAUSJQQAACopgQggA8BAADAxg7v/y64/9ibuM9ypwCYRxyiz3GAAMgJ +AIEA34DgyiHCD8oiwgfKIIIPAACsGcojgg8AAOUAyiTCA7QFIvfKJcID9qa6og0CL/agoeB48cCa +CQ/2z3CmAJw/GYCtCB4Az3aAANQJAIZGgKASAAYvKAEATiCBB0Ep0AARCNUgSHCAIAoAMiAABJDo +CiHAD+tyz3AAAK0ZiiNLAookgw9RBS/3CiUABM91gABA1kAlwBLSC2/3CdkA2IYIr/8PIAAEgOAA +2A8gAAQF9CYMz/8D8LINz/8DyLkQgAAbeIC4QIYKrSaCliFBAwAhAAQYiIwgw48CcQXyYbgPeBip +JoKgEQAGnxkYAMoLz/9BAQ/2z3EqKhUVz3CAAAxL4H8goPHAxggP9jpwG33PcKYAnD9kEBAALQgf +IJ4NL/YD2GG9jCX/n/P1CiHAD+tyz3AAAKQoUdsKJEAEmQQv9wolAATlAA/28cCGCA/2z3GgAKwv +OoFSIQEAUSEAgKHBAN6W9M91gACAK7MIEADCCY//z3eAAKA4IIdgeclwEwgQAyCHYHnJcCCFWQgR +BACFAeAApRUIUQAB2c9woADIHDGgwgigBShwi3ECDe/2iiAHBQCFQiBAgAClBvTPcKAAyBzRoAAU +BTFXDdAACiHAD+tyz3AAAIkZ6tv9Ay/3mHMB4SClFQlRAAHZz3CgAMgcMaByCKAFKHDPcQYAAnXP +cKAA7CcmoACFQiBAgAClCfTPcKAAyBzRoAPw5ggAAACFAeAApRUIUQAB2c9woADIHDGgMgigBShw +z3CAAOQsA4DPcYAA7Lw4EBAAIInPd6AA7CdBKIAjgeHAuAHZBLjAeYO4B7kleBC4hSCRAAanTgwv +9gHYTyAAIAanAIVCIECAAKUG9M9woADIHNGgpQfv9aHA4HjxwGoIAADPcIAAoDgggGB5A9iA4HgM +QgPPcIAAMDMEgBkIngDPcYAA5CxNgT6RUyIAAN4M4AEB29HA4H7xwOHFz3WAAERCAIUbCB8AEgjA +AsYLD/zGCM/5Cg7P/wCFgLgApVUHz/XgePHAWgxv/IogBAIR6B4Oj//GD8//z3CAAKA4IIBgeQTY +BehGDk//DggAANHA4H7gePHAqg7P9c91gABEQgCFOQhfAM9wgACgOCCAYHkE2BToCgxv/OLYEOhq +C6/9B9i+CGADCHYKDA//hgqv/clwAIWBuACl0QbP9eB+4HjxwFoOz/WkEAEAFQkeBrYQAQHPcKAA +mAM+oJ7wABYNQbywABYCQV2wABYOQM+gABYCQUAYhAAAFgJAUaAAFgJBSBiEAEQlAhM1ChABGNty +GMQAABYDQHOgABYDQVAYxAAAFgNBVBjEABEKEQKpc4Yj8w+MIwyADvIY2xbwENtyGMQAAN/Pc4AA +1LznsxDbDPAe23IYxAAAFg9A9qAAFg9BXBjEA6l3hif9HIwnApIJ9ALjcHtyGMQAABYPQQLwAN9g +GMQDCQteAAAWD0EodIQkDJAE9ADaIvCZ6lEmAJDRISKCFfLQiKi5z3KAAEjJpBhAAAK+1n7CYgsK +ngeLuaQYQAAA2lqgW6Dm8QAWAkBaoAAWAkBboAjadBAOAb4QDwHCf2J/Qn+4EIIAmLmkGEAAz3Gg +AJgDQn96YlB6chiEALoQAgHwf3AYxAOlelywPoG2GEQAbQXP9fHAAg3v9UokQHXPdYAA3CbAhc9z +gADYHKggQAZocDJuNHk6YEKCAeY4YA3qz3GgACwgMIEietdySWsA0gDfw/fioKrmyiYmEOB4IQXv +9cCl8cDPcIAAZBsO2QHaggogAADbz3CAAJwbCdkB2nIKIABIc89wgACQGirZANpiCiAAANvPcIAA +OBsL2QDaUgogAAHb0cDgfuB48cAE2MYIL/wB2c9wgADdQgCIz3GAAN5CMgsgACCJ0cDgfuB4z3CA +AABQVQOAA+B48cCG6O4IAAAA2SKg0cDgfvHALgzP9coKT/zPdoAAwApm2CJuAdoiCC/9SHOL6Aoh +wA/rcs9wAAC2FNnbiiSBCTnwAhYFEUwlAIDMJYKPAAD//w30CiHAD+tyz3AAALcU3NvdB+/2iiSB +CWfYyXEB2tYP7/xIc4zoCiHAD+tyz3AAALgU39uKJMEJFfABliRuAdoB4BB4sg/v/EhzoZaP6Aoh +wA/rcs9wAAC5FOLbQCVEEI0H7/ZKJQAAAm0QeCZuAdqGD+/8SHOM6AohwA/rcqGWz3AAALoU5dtA +JYQQ6/HJA8/1z3GgAGAdErEUkeB+8cC4cTUIUQAJDVIAGQ3SAwohwA/rcqfYBbic2zEH7/ZKJAAA +QC2AABR4QiABA89wgAD4GxlhH/DPcIAAqCIyIEABjCDDj8ohwQ/KIsEHyiCBDwAA4RTKI4EPAACi +APAG4fbKJCEAArgUeAAggQ+AANgcKHDRwOB+EQgeAgQgvo8AAAAYAdgD9ADY4H8AqeB48cC+Cs/1 +z3WAAAIKAI3PdoAAAApeD+//II5BiM9xgADkQl8K3wACgKnoXwoeAc9ygAAQMACWZ4pPCMEAAJVh +ikcIwQDPcIAABAoAiEaKOwoBAM9wgADkLA6ALwheAc9wgADgQkCAC+rPcKAALCAQgEJ4DwiEDzEB +AC0A2ALwAdipAu/1AKnPcIAAhCsAiHfo9/HgePHADgrP9aHBGnA6cmh2vQlyAADYmnEVIA0gz3GA +AMAKABWTEAIVkhC6cOONIZEBjQHaOGAQeItx+g3v/EhzEugAFAAxQCqCIAQggQ8AAAD/R7lUejMJ +ECDHcoAA+BsY8M9wgADACsGQoY0KIcAP63LPcAAAuxSKI4QAACZEE60F7/YKJUAFx3KAANgcABrC +BAPuAqoC8AGqJQgeAAzuA4qAuAOqEm8UeBtiY4tYYIG7Y6jkqgPuJqoC8CWqQiRBIFUJdYBAJUAg +lQHv9aHA4HjhxVMgDQCgqQQggQ8ABgAAQiEBgAQggA9AAAAAyiFiACCq13BAAAAAAdjAeACr4H/B +xeB48cCM6NYNz//PcaAALCAwgcdxSWsA0iKg0cDgfvHACgnv9dhxCiaAkIh1zCMigAbyQiYGAS8m +hwGiDe//yHHPcYAAeAoAoSXuJIgCuTR5Q4gD4QIQhQAjCh8ACiHAD+tyz3AAAOIUiiOIBUokAAC5 +BO/2CiWAAQhhGwhfAAohwA/rcs9wAADjFIojiAbv8QEQhQBRJQCAyiHBD8oggQ8AAOQUyiOBDwAA +KALKIsEH3/PhvdElIoHKIcIPyiLCB8oggg8AAOUUyiOCDwAALwJYBOL2yiSCASsNHhBRJcCAyiHB +D8oiwQfKIIEPAADmFMojgQ8AADYCMATh9sokgQGVAM/14HjxwBYIz/WhwQh3KHUacgDez3CgALQP +cBARAA4NYALJcItxQCRCMEAkgzCiDu//qXAPCBAgz3CAAJSaAYgE6EokAAAE8EokgAAgwAEUgjDp +ccoO7/8CFIMwz3CAAN5CAIiA4MwnApAL8s9wgAB4CgCAwqDPcIAA3ELAqDENXhHPcYAAEDAHiSUP +ARABiVMlAhAZCgEABCWNHwAGAACA5QHaBonAeh0KAADPcIAAhSvAqM9wgADgQsCgz3CAAORCwKhm +DGACLyBHBK0Hr/WhwOB48cBOCs//z3CAAAAKAJCA4IQMwv/RwOB+4H7gePHACgvP/34Kz/8eDMAE +SgoP/boKQAHRwOB+4HjgfuB48cDPcIAA5EIAiI3oTgzP/4nokNkDyJC5oBhAAADY0cDgfs9wgADY +JgCIEejPcKAAAAQMiIwgAoAA2Qn0kdoDyJC6oBiAAChw6/EB2Onx4HjPcYAA5CzwIQEAKBGAACiB +lQbv/wDa4HjxwOHF2HDPcoAAEDDPdYAAAAoAlWeKz3GAAIQrKwsBAM9wgAACCgCQYYofCwEAz3CA +AAQKAIhGig8KAQDPcIAAhSsAiALwANiqC+//AKnPcIAABApAiM9xgAACCgCJII2A4gHawHrIcwDd +Pg3v/5h1z3CAAHgKAIABiM9xgADYJgsIHgEB2ACpAvCgqZUGj/XPcYAAEDDPcIAAAAoAkEeJMQoB +AM9wgAACCgCQQYklCgEAz3CAAAQKAIgmiRUJAQDPcIAAhCsgiM9wgACFKyCo4H7gePHA1g2P9c92 +gAD0oBSOKQhRAATYIgrv+wHZz3CAAAIKAIjPcYAAAAqODO//IIkA2BSuLfC2jivtz3eAANxCAI9h +uCUNABBOCc//z3CAALDRBYAhbQUofgDPcIAAAFD+DGADL3HPcIAAAgogkM9wgADdQqCvIKjPcIAA +AAogkM9wgADeQiCoANgWrjWOCenPcIAAAgoKCe//AIgA2BWuoQWv9QHYz3CgACwgMIDPcIAA4ELg +fyCg4HjxwNoI7//hxc9wgAAALVCIz3WAAJSaAZUhhQ0KEQEaCCAAD3gCjSGF2gzv/wHaaQWP9eB4 +8cDhxaHB2HCLdUAkQjBAJIMwKHCCC+//qXEBFIAwCegCFIAwBehCJgYBLyaHASDAcgnv/8hxARSB +MATpAogD8AGI4bjRIOKAA/IjCB4BCiHAD+tyz3AAAOcUiiNNA0okAACNAO/2CiWAAfkEr/WhwPHA +dgyP9aHBCHUA3s9woAC0D3AQEABuCWACyXCELQgZACGNf4AADJwk8EAlABcWIIQDBRSAAIYg/ocb +8gSFi3FAJIMwQCRPMN4K7//pcqgVABBaCe//6XEgwAQUgQABFIIwAhSDMBIL7/9KJMAAAeYMlbsO +BJAOCWACLyAHBF0Er/WhwPHAqgzP/zYIwATRwOB+4HjxwOHFz3CAABi7ANkloM9wgAD8OyKgz3GA +AOQsAIHEEAAGdwheAQOBGIhvCBABz3WAAMxJAIVCIACAyiBiACcIUQC6CmADqXDPcYAAlEkAgUIg +AIDKIGIAhegocA4LYAMihc91gADoSQCFQiAAgMogYgAnCFEAhgpgA6lwz3GAALBJAIFCIACAyiBi +AIXoKHDaCmADIoXJA4/14HjhxQDbz3KAAMS7FCINAGC1aLUaYiAawgDAHcQQKBrCAM9xgABwuxZ5 +IpEwGsIA0B3EEIAd3BB4HUQQAdmIGkIAz3GAAGS8FXlgoeAdxBDwHcQQ4H/BxeB48cDaC6/8Edi5 +6M9xgAAQMM9wgAAACgCQR4lVCgEAz3CAAAIKAJBBiUUKAQDPcIAABAoAiCaJOQkBAM9wgACIOACA +mugyCkACiOgLyAUggA8AAAA8CxoYMCIKQAKI6AvIBSCADwAAANQLGhgwC8iQuAsaGDDeCQ/8A/DO +Dk/20cDgfuB4ANmcuc9woACsLz2g4H7geJkGz/vgfuB44H7geCCAANqA4UX2AdozeSCggCEBgH/c +wCEEA0e5IKAD6jN5IKDgfqHB8cDhxazBANlKwW8hQwBIwc9zgAC0uyCDBCCNDwEAAMCGIf4DJLkO +uQslQJBOwI7CFvLXdQAAAEDMJYKfAAAAgMwlgp8BAAAABPQhgwPwIoOuuK+4sLgFeSCiDsMIwIt1 +BCOBDwEAAMAuuUApAgZFeEjAiiAGBknAQcOpcADaSgkgAAHbz3GAANQkGoE7gSR4JwgeAgrAC8GE +KAQOACGAf4AA0NMCuQjgNHkhYM9wpwCISS+geg2gA6lwCNzrAa/1rMChwfHAagmv9QhyrcEI2ErA +byBDAEnAz3CAALS7oIAEIY4PAQAAwIYl/hMkvQ69CyZAk1DBkMMW8td2AAAAQMwmgp8AAACAzCaC +nwEAAAAE9AGAA/ACgK65r7mwuSV4AKMQwwnFBCOBDwEAAMAuuUApAAYFfUnFHwqeAQrABCO+jwAA +ABhFIMAASsAF8oUgEAFKwCUKHgGbvc9woAAsIAWAANsCuG64gODKIMwAybileEnABvAJCh4Cnb1J +xRDAgcVCwKlwQgggAALbA8gMws9xgADUJLkYggAagTuBJHgbCB4CArrPcIAA2NNUekFgz3CnAIhJ +L6B2DKADqXAI3N8Ar/WtwPHAZgiP9aPBYYAIdUDDANgKpW0LXgIEI4APAQAAwC64z3KAAChXCmJJ +IoIAYbpLpRJqFHjHcIAAyNTKgM93gABYvcalC4DPdoAA5CwFpcOGIMDUhvWPBH7kfgm+QCkPAuV+ +xXgEI4MPAAAAEGV4B6UIhRjinrgIpUulj/A3Cp4Cz3CAADBLAIBBwELAIQgeAoYg/wkjuAHgFQiU +AAsIkQAG2GHAJPAH2GHAIvAiwGHAHvBBw89ygADUCUCCRoKeEgIGKwqRAQQjvo8AAAAYD/TPcoAA +5CxEgkiCBCK+jwAGAAAF8gHYCqUD8AqlANgBxkEOHhJCxiLCoOLKIiEABCaPHwEAAMBBL4QTRCYP +FiO/AecEJo4fBgAAADG+ACbFE892gAAoVzImDhECJk4RE/BTJsIQz3eAAAxbXXpKZwQmjh8BAADA +Lr7Pd4AAKFfOZ2G+1npLpRMLHgIgx892gAAwV+5mAvAB3oQoBA4AIYB/gADQ0wK6VHpHYGG+WGDm +pQGABCODDy8AAN0mu8V7UiPDAwWlZ6XPcIAAtLsDgADfHQhOAM9wgABMSwCAFQgeAIYgfw8deEAo +zwME8ADfj7+b7892gACgOCCGYHkA2CUIEAMghmB5ANgZCBAEIIZgeQDYEQhQBCCGYHkA2AsIkQSW +Da/8ANgIhQV/6KXRBm/1o8DgePHAZg5P9c91gAC8OACFxJDJcPYIoACGIPwDAIXJcYYJYACGIfwD +z3OAAJy9CwiRBiGDgLkho0qDAeJKo89zoADEJ5ETAYbDuRsJgQCKJQgQExtYg5ETAYbDuQsJgAAS +G1iDcQZP9eB48cD2DW/1ANjPcaAAxCdSEQKGFREChkIRA4YRC54HAdjPcYAAIL1hsVEiwIAacMol +YhQS9FEgwMbKJaIUDPTPcKAA0A8gEAGGHxAAhhBxAN3KJWIV6Q0REM92gAAgvR+GywgeBKgWARCU +2CIL4AHJcs93oADQD1EIECDPcIAA/AoggM9woAD8Jc9ygACouozpM4AKghlhKqLPcgD/AKqKIIgF +DPATgCSSGWEweSSyiiCIBc9yAP8A/zYPj/0AluYM7/00lpQXABDPcoAAcEQB2RnobYIB422ia4J4 +YAuiz3CAAIQrIKgfhg8IngPPcIAAtAkgoAfwDwjeA89wgAC4CSCgz3CgAPwlE4BsgnhgDKLPcgCg +CADscECgbyJDAOxwQKAOH1iQIg7ABM9wAAD/f89xoAAMJAGhG9gEoR0Fb/WpcOB44H8B2PHA4cWh +wSYN7/uLcLLoABQFMB0NHgB+CAAAz3GAACC9Q4HPcYAAsKFBoSTwCw2eAIoOz/8e8A0NXgIaDs// +GvA7Dd4ACNjPdaAAxCcTHRiQog3AAB0IEAUC2DwdAJDPcIAAIL0jgM9wgACwoSGgGdiXCFCGtQRv +9aHACiHAD+tyF9iMuIojxwAtAK/2iiSDD/HA4cXPcIAAIL0/gAQhgQ///484BCWAXwAAcMcleM9x +gAAgvR+hRCIAU891gAAgvUMIEQI/DV5RNg/P/5wdABATDZ5Tz3CAADgtBYiYHQIQFPAVDd5Tz3CA +AEgwGYiYHQIQDPADhcYOb/YkhZgdAhAE8ADYnB0AEJwVABCA4Mwg4oBe8s9woACoIAiAH4URCB8B +DQ3fUoDYmB0CEJgVgBBAKAEGEQjfAYK5HwqeUxoOgAEb8B+FUSKA07O4H6XFIYIPAAAAB0UhAAbP +cYAArL0siYYh/Q9SIcEBRbkleM9xoACIJBChiiDWAM9xoADEJ34ZGIDPcKAA1AsB2lKgBNgQGRiA +z3WAACC9H4VHCJ4BFJVDCF8Bz3CgACwgD4Cb6K1xjgwv+lYlQBWAFQAQlLiAHQAQH4WQuB+lDfDP +cYAA9EMPgQHgD6EQ2c9woACQIz2gSQNv9RnY8cDGCm/1ANkIdgGAwbiD4MogQSAF8iIOIADJcBpw +TCAAoMT0EIZRIICBwPIQhs91gAAgvQ8IngPPcIAAOC0FiA3wEIYPCN4Dz3CAAEgwGYgF8AWGJoZ+ +DU/2mB0CEIAVABAEIL6PEHAAAAf0rXHqCy/6ViVAFRGGz3GAAJwKAKFBKAEDUyHFAJgVgRBBKAYF +FGkFIEQBDwneAR6FlbgepXnwcgrv+08kQALrCBUEz3GAACSWmBWDEPAhAQBAKwIGhiP9D1IjwwFF +u2V6z3OgAMQnQRuYgADajLoCJk8A+mLLutdyAAAACEAtDwOQv1L3BSePEWIb2IOMIgKAx/fPcYAA +aEUSgQHgEqEA2Z25RfDleWIbWIBZDoVwAADADw4igw8AAAAQz3KAAISVFnoggiULNQgEEgUAANgP +IMAAYbhOIw8IASnCA3h5BXkALcAABXoX8EIjAwgA2A8gwABhuHh5BSECAIoh/w8L8M9zgABoRROD +iiH/DyhyAeATowHYz3OAACSiAKsCGwQBIaNCo73xANmcuYAVABAleIAdABBAJgASoB0AEALZz3Cg +APQmI6Alhs9wgACwoSGgbQFv9Qpw4HjxwPoIT/UIdVUgUAQNzKLB7bjRIGKAB/IEyMIOr/+YEAAA +z3CAAJy9DIDPcaAAyB9k4B6hENgOoQHYFRkYgAGFg+j/Cx7AAYXBuIPg1vQAEAAgQcAEFA8xEIUs +vwYUEjF1CJ4BDcx1CN4CEIXPdoAAIL0RCJ4Dz3CAADgtBYgO8BCFEQjeA89wgABIMBmIBvAFhSaF +egtP9ue4mB4CEMomYRAG8j6Glbk+pgDeBLjPcYAAbKRGkeV4EwiAAM9ygABoRQmCAN4B4AmiBJEb +CIEPAAD//wDeCfDPcYAA9EMNgQDeAeANoQGVnOCI9AQQESAIEBAgz3CgAPQmAtkjoCOFz3CAALCh +IaBqCyAAqXCA4ID0Ju7PcqAAxCwcGkAEz3GAAKy9IBoABCyJQC8DExC5n7kle0EqASFleSaiDRIB +Nx0J3gIQ2qu5DBqcMA0aXDDPcoAA7EQnggHhJ6INEgE3DQkeAxrYrLkNGlwwpQ4QEM92gADchuAW +AxBFhUQrPgcAJkEeQKFMlQHjQrHPcoAArL2siuAewBDPcoAAbKSoqempChmEBAwZQAREkhAZAAQQ +vQy/QSoDIeV9ZX1Ksc9zoADAL0cbWIOU4sAihg8AAJMAz3WgAGgs8CWCEEuxjxMChgnwoxMChlEi +AIGPEwKGBvT1Ct6BB/AI2Azw57rKIiEAQMIBFIMwxrrGu3ipWalFBy/1osDgePHA4cXPcYAA5Cwj +gUiBWQoeAIYg/wHPcoAAKFdDuApiANuA4sohwQ/KIsEHyiDhB88gIQPKI4EPAABvAMokwQCwAmH2 +yiUhAM9wqgAMUBMKtAC5gYC9uaEB2SWgBPCgvbmhZaABBw/18cCKDg/1CHUNzFMgQIAH8gTISgyv +/5gQAAABhcG4g+DKJiEQBfLOCSAAqXAIdrEOERAQhQkInwEA2UXwDMx5CN4ADcxTIECADRICNh30 +ACKAD4AATLwB2c92gABwxyCoEY5RIACA/ApiA8ogQgARjhcIXgHPcIAA7LwDiIDg9A9hAcogIQEQ +2AwaHDDPcYAAcEQXgQHgF6EDyA0SATaEEAIBz3CAAEC8NXgpgFlhKaAa3sTxz3GAAPRDDYEB4A2h +AdnPcIAAhCsB2kCoz3CAAJy9ToAGggHgBqID8AHZAtrPcKAA9CZDoEOFz3CAALChgOFBoGAOQgL9 +BS/1yXDgeM9zgAAgvVgTgQAA2o7pPJNiuRC5RSFDAc9xoAD0JmOhz3GAALChQaHJAAAA8cBeDQ/1 +CHYBgMG4g+AA3QXytgggAMlwCHWx7RCGRwieAQzMz3GAAHhDMQheAUDYDBocMFURAAYA2gHgVRkY +AA3Iz3GAAMS7FHkDyECp4gqv/5gQAAAH8KwRAAAB4KwZAADPcIAAhCsB2SCoz3CAAJy9LoAGgQHg +BqEC2c9woAD0JiOgI4bPcIAAsKEhoD0FL/WpcOB/CNjxwCS5UyHCAM9xgADMXVZ5EwoQAkGQYYEE +4nByyiAiAgP0IIFAedHA4H7geM9xgACcvSyBz3KgAMgfZOE+ohDZLqIB2RUaWIAhgITp/QsewCGA +wbkhCdEAz3CAAIQrAdkgqM9wgACcvS6ABoEB4AahANkN8CGAUSEAgADZyiHhBQGAUSBAgMohoQTg +fyhw4HjxwDYMD/XPdoAAnL0BhgQgvo8AcAAAOfIvKQEAz3CAACBD9CBNACuGTyWAEJYJoAFJhpTo +jCUDkM9xgAB4Qwj0uhEABgHguhkYAB/wuREABgHguRkYABnwAYYhCJ4Hz3GAAHDHDIlPiRsKAAAR +iVEgwIB8DcEBB/AA2c9wgAAkoiCo/gyABB0ED/XgePHApgsP9Qh2AYDBuADfJwjRAM91gAAgvY8P +ERAQhncIngEQhhkIngPPcIAAOC0FiBLw4g7v/8lwCHft8RCGEQjeA89wgABIMBmIBvAFhiaGXg4P +9pgdAhARCN4BHoWVuB6lH4WXuB+lgBUAEAQgvo8QcAAAD/ScuIAdABAwhrYM7/lWJUAVQCYAEqAd +ABAA2AW2AdnPcIAAhCsgqLQVARAGgQHgBqFYFYAQmejOCI/7BegQhu24AdgC9ADYz3GAAIK99CEA +ADyVOGBiuBC4gLjPcaAA9CYDoQbwAtnPcKAA9CYjoCWGz3CAALChIaAhAy/16XDxwK4KL/UA2Qh2 +AYDBuIPgyiBBIAXyCg7v/8lwGnDPcKAALCAGgBB4TCAAoM91gAAgvconIhBW9DCGZQmeATyVEwkD +ACWGz3CAALChAoC3CQEAEIYPCJ4Dz3CAADgtBYgN8BCGDwjeA89wgABIMBmIBfAFhiaGRg0P9pgd +AhCAFQAQBCC+jxBwAAAK9PoPT/sL6BCGEwheAwHfCPAA3xjwRg4P/BTwAN8whpYL7/lWJUAVgBUA +EKgVARCeuIAdABBAJgASoB0AENkJXoIB2c9wgACEKyCotBUBEAaBAeAGoVgVgRDPcKAA9CaT6c9x +gACCvVyV9CHBA1lhYrkQuYC5CPC0FQEQC4EB4AuhyPEC2SOgJYbPcIAAsKEhoPUBL/UKcOB48cCS +CQ/1z3CgAKggCIDPdoAAIL0PDZ5Tz3CAADgtBYgM8BEN3lPPcIAASDAZiAbwA4ZmDC/2JIaYHgIQ +H4YVCB8BEQ1fUw0NX1KA2JgeAhCYFoAQGQjeAV+GPoazupW5l7o+pl+mANkB3RfwnBYBECMJUQA/ +hlEhQILPcYAA5CwjgSmBBPJEIQ0EBvBEIQ0CAvAB3QTZGLgleM9xoACIJBChH4YxCJ4BFJYtCF8B +8gjAAZLoz3CgACwgD4AE6A3MFQjeAR+GkLgfpq1xTgrv+VYmQBWa7Q0KnlNaC0ABFvCGIv/cz3GA +ACC9EPQBgR0IHgCYEYAAz3GAAEjJArgWeABh/rg0DML7z3CgAFAMAIDPcYAA2AoE2gChz3GgAJAj +XaHPcoAAIL0/ghEJ3wQvgoDhyiAhACnyN4KKEgIBGWEE4gsIn0T/CR7Gz3WAACC9mBWAEOe4ANsJ +9AK4z3OAAEjJFngDYy27wLuKFQARTxWNEM92gADkLPAmwxBCeaJ47g+v+0+TeQAP9eB48cDhxaHB +ANhAwM9xgAD0Qw+BAeAPoQPZz3CgANQLMaDgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44Hjg +eDGgENjPdaAAxCcQHRiQLgiv+4twlugAFAUwHQ2fAAohwA/rcg3YjLiKI18HmQMv9ookgw8E2RMd +WJAb2RYdWJD5B+/0ocDgePHAz3CAAPyhBgpv9hjZz3CAAPyR+glv9hjZ0cDgfuB48cBWD8/0GnDP +daAA1AsQhQDeocFAxiEIUAAKIcAP63IP2Iy4iiOWCIokgw8xAy/2CiUABM9xoAD8RBmBBCC+jwAA +CCAC9B2BEQjQJIYPb/uLcIDgyiACIEIgwSCU4UoBDQAyJkFwgAAAUkAngHI0eAB4z3CAAJy9LoAI +gQHgCKFyCsAAANkocDzwz3CAAJy9LoAHgQHgB6H28c9wgACcvS6ADIEB4Ayh7vHPcIAAnL0ugAKB +AeACoSLwz3GAAHBEBYEB4AWhHPDPcIAAnL0ugAOBAeADoQHZANgU8M9xgABoRRqBAeAaoU4LIAMB +2Mrxz3GAAGhFFIEB4BShAdgIcYDhwAqCAM9wgAAgvR+AFwjeBM9wgABAlcuoz3CAAHSSzLAD2BGl +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HgRpXEG7/ShwM9xnwC4/xiBkLgYoRiBsLgY +oc9wgACcvS6ABYEB4E4IIAAFocbxz3CAAJy9LoAEgQHgOgggAAShvPHPcIAAnL0ugBGBAeARobTx +z3GAAHBEDoEB4A6hmfEKIcAP63JB2Iy4iiPYBzrx4HjxwKINz/TPcIAAnL0MgM91oADIHxDeAd9k +4B6lzqUVHdiT6g1gBAnYA9gepc6lFR3Yk89woAAMJAeABOj3Cx7AyQXP9PHA4cXPcYAA5CwjgSmB +USFAgMogogAn9ES4z3GAABBDw7gJYQkJHgA1DZ9RNQleAM91gADkLAOFGIghCFAA9gpP+wjoz3CA +ACwwCIgNCNABA4UYiA0IkQAJDZ5RAdgD8ADYdQXP9OB48cDyDM/0RCIQU012hib8E01wTXAEJYBf +AAAAIEEofoME8qoKT/uE6ADfA/AB3891gAAgvR+FCwheBADdmvD/CBGgigpP+x/oz3CAACwwCIiH +4MwgYoIX9AGFjCD/jxP0JJXPcAAA//8bCQEABYWMIP+PCfQMlddwAAD//8olYRB48s9wgADkLPAg +wQMJgQ8IXgHPcIAA0FcE8M9wgADcVziJKmBBLgARz3GAAOhXCGEWes9wgABMXkhgDwgeAD+FhiH2 +jxXyDQheAD+FIwmeAgkIngAJDR5SAd0M8BMI3gDPcaAADCQxgYwh/4/28wDdUSCAgcolIhDSCU/7 +B+gEJb7fAAAAIsolYhAn7c9xgAAgvR+BHwgeAowmApDMJoKfAABQAMwmgp8AANAAA/STuB+hz3CA +AOQsAoDCEAAGGuiMJgKQzCaCnwAAUAAS9E+BRXgPoQ3wz3CAAOQsA4AJgA8IXwCMJgKQBPQJCJ4B +At3lA+/0qXDgePHAcgvv9IDbosEA3c9xgAAgvb6hv6Ggsa+hTxlCA4AZQAOMGUQDmBnCAIQZQAPP +cqAAyB+kEgAA+BIOAKwZQANCGUQDwniwGQAAz3CAAFiHuaDPcIAA2L2goATez3CAAJwKwKCZEYAA +oLiZGQIAz3CgAMQnZBhYg892AAD/fxMYmIMb3hYYmIMaGFiDiif/H892oAD8RP2m+aaKJ5gdz3ag +AFAM4qZxonCiPBhAg4ojGAhuooASAwCkGUADUSNAgM9zgACwoVgZQgMM8kIQAIYEIL6PAMAAAATy +AYMC6AKjoaOAGkADz3OAAHhDz3CAAOQsQ4ApCZ5DH4GLuB+hVSPABbQZAAAK2ByxG5KWGQQABtnP +cKAAyBwpoAvwQCMAA7QZAAAQ2ByxGpKWGQQAz3GgANQLEIEfCFEACiHAD+tyC9iMuIoj1QCKJIMP +NQbv9bhzAd7QoVEgQMZsAiEAyibhEM93gAAgvbQXARAAgQHgAKH62H4L7/sA2SDYz3WAAPi9lg3g +AgClAdjPcqAAyB8Tos9xgACIKwiBAIBsgWCDJIFAJRAVABEEAPgSAgAA2QIggIABpQDYAyNDAFAf +BBBSHwQQVB8EEAIkgQDPcIAA5CxipUOAI6UUks9xpQAIDAm1CILAuAi1ABEEAFMkRQFTJEEATB9C +EYPhyiHBD8oiwQfKIGEFyiOBDwAAnAt0BeH1zyAhAwQkgQ8AAADgLbl/h5ofQhAUHQARHQveAgS5 +gbkleAi1B9gH8ADZFSAMICCkA/AE2AHg8wgUggiC67iQDIIEH4cruFMgBQBRIIDFpvLPcYAAMDMG +gQHgD3gGoUEpgEPPcYAAMDNmgc9xoAC0DzeBwLgwcwDam/TPcaAAqCAmgYwhg44mAQ0AsHCN9M91 +gAD4vQWFz3akAJBB9YY2hgQggA8AAADgLbjnpc9zgAAgvSilDQgeAFAbxAMJ8FAbhAAEJ48f//8A +AOelDwheADC/UhvEAwXwUhuEAPB/56UNCJ4AVBtEAAnwVBuEAAQhgQ///wAAKKUNhgalBCCADwAA +AP4puFYbBAAfg0cI3gLPcKoAAAQEgAmlz3CAAPyRIIhEaDXpYQl0AAIQhACfcQDYqCCAA/QiDwAV +3hO+8CbPE892gAD4vBV+AeDgphzwz3CAAPyhIIhEaBnpAhCEAIDhyiRNcMogLQDoIK0D9CIPACne +Er7wJs8Tz3aAAPi8FX4B4OCmIa0CHQIRtBMBAALeAYEB4AGhDPAEIL7PYAAAAAP0BN4E8AkLHkAD +3oHmTvMvDpEQAt4EIL7PgAEAAMomohEG9FEjAMDKJuIQ6w6QkM9woAAwEAOAgODKJmIRhuYyBAIA +z3WAACC9HJVCIIQAH4XruC8kCAF78s9wqgAABMKAz3GlAAgMIIEEJoIfAAAA/yi6BCGBDwAAAOCJ +ujt7RXvPcoAA+L1ypcyibaIggEgVjxCU5yqiGfIG9jMPkRIjuQ7wHQ/QHe7nE/RFKf4CQSnBcFEm +wJHCIWIAB94L8EUp/gJBKQFx+vEiufjxANkI3gGAN6ULojyyHwkRBc93gADkLOOH6IcEJ76fAAYA +AAPyjLtypeS4yiYiEuG4yiYhEoYg/g9BKAMBTR3CEAiSZXgIsikO0REjCbQDB97PcIAA5CwDgIQQ +AAATCEQAz3CgADAQCIAJCQAACN6H5sogAQEkCOH7yiEhACsDAADPcKYACAQBgAQggA8wAAAANLhC +HQQQQhUBERkIX0bPcKAAqCAIgBlhMHnGD6/7iHAF8OYPr/uIcAQggE+AAQAAANkxCIEPAAEAAAHY +Th0CEM9ygAD4vZoVgBBCHUQQTR1CEDelKaIEuCiSibgleAiyc/BNHUIQz3CmAIwDPYAEIYIPOAAA +AEEqwASaHQIQBCGADwAAAPAluiy4RXjPcoAAIL0SpQ0I3kcSgoy4EqJTIcMCSBKNAHei4L3RIeKH +B94D9Ajez3CAAPi9KaCaEoEA6JAEueV5KLB8sDKCLaB9DtERz3GmAIwD3YEEJoEfAQAAADC5ThpC +AMmgThKAABvoWw1RE1MIH0YU2M9xoADIHx6hENgOoQHYFRkYgAreUSAAxsom4hFRIwDAyiYiEvEO +kJIU8CcLlAPPcIAA5CwDgIQQAAAXCMQAz3CgADAQCIALCwEAB94C8Ajeh+bl9M91gAAgvU4VgBCA +4N3yz3KmANQELBIAgDQSEoA4Eg+AyxIQBkpxxrnpcoYi/Q8GukV5SnKGIv0PBLpFeQQggg8CAAAA +J7pFeUQnAhwNukV56XKGIvMPBCCADzgAAAAOukV5JbgleEQngRAUuSV4iLhEJwESQSnBgFIgQAUS +pVgdQhDKIYIPAAD//8ohgQ8AABAfOnE3hUAdRBAEIoEv/wMA/yi5N6UGCq/5ANqsHQAQcQ+eFEgV +gxAyhaDj0SHhgjDyBCGCjwAAAAEI8kQhDgYjvgHmFQ6VEAQhjg8AAAAkQQ6AHwAAACQEIY4PBgAA +ADG+MQ7VEBUOkRAU6kQhDgYjvgHmHQ6REAPqzOMK9leFMnLKIo4PAQCIDcwgjoDO9xUOBXABAIgN +z3GAAGhFHIEB4ByhCN4z8IYh/wlBKc4Az3CAAKg4IIAB5mB5BtgvCIQDz3CAAOQsA4AIgAQgvo8A +BgAAANjKIGIAMoUEIYEPAAAACCu5FQhFAOYMAAAIdpTgyibiEwvwz3CgADAQCIA3hRBxB97KJmIS +WBWCEM9xgAD4vQiRB7qIukV4CLEXhTAZAAQcsRKF66ENoawVABAoGYAEHbENDtERaggAAAh2gObK +JiEQgObsC6L/yiCCAwDYz3GgANQLEKHPcIAArL0NiBMIHgDPcKAAiCQegAsaHDAiDkAADMyGIPmP +CfSE5swm4pAF9ADYj7gMGhwwMtnPcKAAyBwqoEUDr/SiwOB48cDuCo/0z3CgANQLGIBCIAAISCAA +AM9xgAAwMyWBgeGKIZkOCPTPcYAA5CwjgT6BgCGZDhBxAN3KJW0Ucw0REM92gAAgvVgWgBCA4Mog +IgAh9AwSATclCd4ADcxTIH6ADPLruBeGBvKg4AHYwHgJ8I7gAdjAeAXwJQlfAQDYz3GAAOQsI4Ep +gT15UiEBAMC5JHgI6B+GkbgfpgvwF4bq8UoMAABYFoAQgOAkCwEAgOV0AgIAz3WAACC9WBWAEBTo +AtnPcKAA9CYjoM9xgACwoQDYAaHA2ZkVgBCAuJkdAhAocAPwQtjPcaAAxCe/GRiAANgMGQCAAdgQ +GRiAH4XxuBICAgAShTeFcg9v+QDarB0AEB+FtQjeAs9wgADkLEOASBWBEBSCJHhEIAMBRCEADEIo +BAGAc89wgACYLcG7aGCJuBylcBWOEPSCTRWAEMR/hib/EwR/RL7fZ892gACAV/QmzxNiHcQTz3eA +ALwwa2eJu32ldIJ0FY8Q5HuGJ/8TBHtEv/tj9CbDEGQdxBByhXqlVIJ7pUR5JHjPcYAAkFeAcPQh +AgDPcYAAuFf0IQAAjh2EEJAdhBCSHQQQlB0EEADYTh0CEJnwThWBEM9wgACwQgCAwLipCRAAgOAA +28ogIgAL9HKFSBWAEAQjgw8AAAAIe3vCuAAgjg+AAIwtMI7YjsdwgAC4MM93gAC8oUiIZX7cpXAV +jhBlecO+3H70J44TZXoQiGIdhBMFe32ldBWAEMO4HHj0JwAQOqXPcYAAzKFkHQQQaBWAEMO4HHj0 +IQMAW6WOHcQQz3OAABSi9CMAAJIdBBBsFYAQw7gcePQhAQCQHUQQ9CMAAD3wgOAA2AX0SBWAEMO4 +HHjPcYAAiC0JYc9ygAC8oTylcBWBEMO5PHn0IkEAYh1EEM9xgACsMAhhHaV0FYAQw7gcePQiAADP +cYAAzKFShWQdBBBIFYAQw7gcePQhAwBapc9xgAAUovQhAACOHcQQW6WQHcQQkh0EEJQdBBD6DMAA +z3CAAOQsA4AIgA8I3gJOFYAQgOB8CUIEWBWAEAXoJgsP/wPwtgwAAAh1MQCv9Klw4HjPcaAAxCcV +EQOGBNgTGRiAG9gWGRiAA9rPcKAA1AtRoOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +UaDku+EgwgcW2FIRAIbguOEgwQfKIOEFCQheAAkL3gDgfxLYAdnPcIAAhCvPcoAAIL20EgMAIKgG +gwHgBqMfgg8IngPPcIAAtAkgoAfwDwjeA89wgAC4CSCgFdjgfuB4wdgUGgIwz3GAAOQsA4EYiAHb +z3KAACC9huAXgsIjwQAM4BggwABmGgQAZhIAAQPgBCCADwAA/P+duJ+47HMAowXI7HMAowOBGIg3 +gobgAdjCIAEAGCEBAOxwIKDgfuB48cDCDk/0z3CAACC9MoAnCV4Cz3GAAOQsI4FIEIIANIFEeVEh +gIBI2soigQ8AAJAAAvAO2gDfz3GgAKggJ4GsEA0AWWGxccIlRRDKJeYSsHjmD2/7CtnPcIAAFD8A +kM92oADEJwsIHgGMJQOSA/cA3RrwWgsgAQDYz3CrAKD/+qAA2NYM7/2OuBkWAJYE6ALYEB4YkM9x +gABoRRuBar24YBTdG6EZFgCWh+hRIQDGfA7hA8ogYQB1Bm/0qXDhxc9xgAD4vUGJwNsUGsIwz3OA +AOQsY4MSakfgBCCADwAA/P9pgyq7wLsXu8dzAA4AAGV47HMAowXI7HMAo0okwHMA26ggwAHwIc0A +7HCgoAHjHQp0AADZz3CAAPi88CBDAOxwYKAB4fEJhIAA2c9woADUCy2gC8wB4BB4BCCADwAA/7+P +uAsaHDDPcaAAiCQeoeB/wcXgePHAbg1P9M93gAAgvaCXCHapcYYh/ANCKQUBRCUIE4wXARFCKIgQ +QNjPc6AA1AsKIkCAD6PKImIArBcAEEAqhgXPcoAA+L0vJAgAHbI4EgcBQCwEBAUnAAELo0GKArpI +4k+jZhcCEVlhMHlmH0QQDw2fEg6XUyDAgBDyz3CAAOQsA4AJgFEgAIA92MAo4gXKIKEHwCghBgrw +QCgAEaBwz3KAACQsCGIXuAPhBCGBDwAA/P8FIIABJXiduJ+4C6MLzAHgEHgEIIAPAAD/v4+4Cxoc +MM9wgADkLM2jA4AIgCMI3gIfDh8Rag4gBMlwz3CAADS+oNnE2j3bDg7gABe72QRP9OB48cDhxc9w +gADACgCQz3GAALyrqNoB3YAgRAsQeFoIr/upc4DgyiHBD8oiwQfKIIEPAAC1FMojgQ8AAMwAyiQh +ACwAofXKJQEBKghAAM9wgADYOJEEb/S0oPHAGgkgAQDYgglP+JYND/6+DM/7ANiSCu/9jrj/2c9w +qwCg/zmgOKDRwOB+8cDhxc9xgADkLPAhAgBKJEAAwxIBBg94MiKCDwAAHwMEIYMPAAYAAIDjAdvA +ewQhjQ9AAAAA13VAAAAAwiQCAcoO7/vAuRkET/TgePHAngtP9GYMoAEIdc9xgAAgvR+Bz3agAMQn +sLgfoRkWAJYA2QToAtgQHhiQz3CgANQLN6DmDYAAPgigAgHYBe3yDgAABfDSDgAAIg1P+xkWAJYF +6ALYEB4YkLEDT/TgePHAQgggAQHYANnPcIAA7EQuoP4Ob/YZ2NHA4H7xwBYLT/SiwYt2jgvv+slw +CiUAkBn0z3CAACC9z3GgAAwkO4FXgDByyiUiEiCGDQkeBALZjBhEAAQlgl8AAHDHP4BFeT+ggOW6 +AwIAAMDpuNbyz3WAALw4AIWKIQgA5JDPdqAAxCcTHliQz3GAACC9P4E6d4Yh/COFCV4EQSkBIcO5 +z3KAAMxdNnoggkB5CHUZFgCWBOgC2BAeGJDPcAAA/38THhiQG9gWHhiQA9nPcKAA1AsxoOB44Hjg +eOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4MaDPcIAAWIcZgIDgJA3CAJrlGgMCAM9wgABA1oYL +oAIA3QsDAADGDG//KnAacACFWg0v/ypx4g0v/wh3iOfMJ+KVyiXBEyvyGwgQIO4KIACBwAolAJAc +9IYM7/8BwBjwA9nPcKAA1AsxoOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4MaAA3Q8P +kRbPcIAAQNYKC4ACgOWOAgIALgwAAc9wgAAgvR+AEQieAwHZz3CAALQJIKAJ8A8I3gMB2c9wgAC4 +CSCgERYAlgDdQcAxCJ8A6gnv+oHACiUAkBD0BBQFMB0NnwAKIcAP63IK2Iy4iiPHClEFb/WKJIMP +gOUqAgIABNgTHhiQG9gWHhiQz3CAAFiHGYCA4BAMwgALAgAA4LjB8s92gAAgvRKGhiA6AIwgBIKU +CwUBz3GgAAwkPIEXhiJ4ZLgQeIoeBBBEIgBTFwgRAh+GDwhfBFElQNEB2AX0ANgD8OoLT/+cHgAQ +LuhGDw//CiUAkNf0DcwhCN4BH4YdCJ4BLyCHCowgAoYI9M9xgAAgvR+BmLgfoZYJIACBwAolAJDB +9M92gAAgvR+GKwgeBKgWARDU2BoOoADJcgfozgnAAwvweghP/6zwz3GAAORFHoEB4B6hAd/PcIAA +hCu0FgEQ4KgGgQHgBqEfhvO48AgC+w+GgOAMCAL7H4YRCJ4DAdnPcIAAtAkgoAnwDwjeAwHZz3CA +ALgJIKAA2M9xoADIHAehMNgKoaoK7/8BwB+GJwgeBhDYDBocMM9wgABA1lYJgAINyAAggQ+AAEy8 +H4bgqbi4H6YAloYg/ACMIAKAGvTCDY/6mOgD2c9woADUCzGg4HjgeOB44HjgeOB44HjgeOB44Hjg +eOB44HjgeOB44HgxoACWUg+v/DSWQ/BBwBXfCwjfAOl1H/AI2M92oADEJxMeGJDKCM//CHUrCBAF +Atg8HgCQIRYBls9wgACwoSGgERYAltMIn4DeD6/6gcAKJQCQ4fM/DVEVz3CgAJAjHoAEFAQwUSCA +gMohwQ/KIsEHyiBhAs8gIQPKI4EPAADkBDADYfXKJSEAZg+v/4hwCHWpcHEHL/SiwOB48cAWDw/0 +ocEIdgDYQMAApnoPr/qLcAolAJCF9M9woAAEJSKAAIYEIYEP/wBf/wUhAgBAplMhggBTIIMAZXql +CtEBz3CAACC9H4B5Cp5TtwifBgQgvo8AHgAABPQAhgnwAQqfQACGCwoeQIW4AKbPcoAAIL0/ghEJ +XgaIuIu4jrgApkHwKQneBk8gAQKJuY25i7mOuSCmHoIEIIAPAgAAAFIgQAQquCV4AKYt8Py5xSCC +DwAAAAXk9YUgHAAApiPw9bgAhh/yhiAcAIUgGAAApgEKH0EAhi8K3kCGuACmE/BTIQMAUyACAAUj +voDKJeEVCfKGIX8PhiB/DwUhPoDKJaEUz3CAAKy9DIjEuEAoAQYAhiV4USCAxACmYA6iA8ogIgip +cF0GL/ShwOB48cDhxQDdBdgLuFIPL/upcVYOD/XPcIAAIL0fgBUI3wLFDRURwQhfRZ8IH0UB5U7w +ANmcuc9woADQGzCgAdnPcKQAmEA8oAXYB/AaCQAAKg6gAwXYAdgiDoADYw0VEQQgvs8wAAAAAeXK +JSIQLQsfQAkIXkVHCZ5DMwgfR9kI3sXVCZ7Dz3CqAAAEAYCGID8LAN27CNGAE/DKCAAAz3GAAOxE +DoEB4A6hCfAA2Zy5z3CgANAbMKCuCAAAANnPcKQAmEA8oBDwAN0NCx9Aqg2gAwHYqPGOCAAAz3GA +AOxEDoEB4A6heQUP9AzMRCA+ijnyQQjeAA0SAjeA2M9xgABwRAwaHDANCt4CHYEB4B2hBfAVgQHg +FaERCt8AANnPcKAALCAvoA3MhiCCAuB/DRocMC8IXgGKIAQADBocMM9xgABwRBSBAeAUoQ3MANlG +IIACDRocMM9woAAsIC+g4H7gfvHAjgngAAHYZglv9APYJggAAH4J4AAB2NHA4H7xwOYPz/+CDs// +Mg4P+9HA4H7gePHAWgwP9M9xoAD8RAWBAN68uAWhSgngAMlwA90iCW/0qXDPcaAAMBCioc9wgAAw +M6KhlQQv9Mag8cDPcKAAtA83gM9wgAAwMwaADQkBALYPz/8E8JoPz//RwOB+4cXhxgDZB9gA2rRp +tH3HdYAAvKtVfcCVjCYCnQDbhfaMJoWSw/b/3sC1wZ0LDlMfjCY/kUL2YbUB4k96zwoSg2G4AeHF +CHWAL3nBxuB/wcXxwK4LD/QA3c9wgAD0oHIJr/q0qBLoCN6A5cwlopDMJSKRzCVikTwIov7KIEID +Yb7pDnWQAeUd8IokAXHPcYAAxLuoIIABBBlQA+B4ANlKJAByz3KAAHC7qCDAAhYiQABikM9wgAA8 +vDR4AeFgsM91gADkLM92gAA4oUAlABckbsYMIAEG2kAlABVAJoESugwgAQbaQCUAF0AmARSqDCAB +BtosFYAQFQgRATwVgBAWDm/+LYVCDg/6DoVRIECBwAoCAsoIj/qA4MQOwv/PcQAA///PcIAAhNMs +oJ4Kr/oroDkDD/TxwMoKL/QU2c91gADcMNjcSg1v9QIlABPPcIAAKDM+DW/1FNnPdoAA5CxAJgAV +AKbA3AIlABMBpgDdqXCpcdoKr/QG2gHYqXHOCq/0BtoAhkokgHCpcQKmA6aoIMAFFSZCEGCCiiDG +DQ2zAIIB4amgAIKpoACCwBhYAwCCwRhYAwCCwhhYAxvZz3CAAHDHqQIv9Cyo8cAeCg/0GnA6cUh2 +Xg9v+ppzCHUEJoAfAAYAAIDgSiJAIMIigiQEJo4fQAAAANd2QAAAAEojQCDCI8Ikz3CAANQJxIgA +3/YOoADpcIztA94vIQcELyJHBMlwSnP6DK/7CiTABMlwIg2v+4pxhO0mCwACBPBWCwACz3CAADAz +BIAhCJ4Az3CAAOhCAICK6DnYJg9v+ou4DQhRABYNz/8N8ADZnrnPcKAA/EQhoOB44aCKDqAAANi9 +AQ/04HjxwHYJD/SjwQh2z3CAAOQs8CCDA4onCxYtk/1jPHoocIYh8Q/Cuke5JHqGIP4DRLgfCYAA +CiHAD+tyg9iNuIoj0g1KJAAANQUv9QolAAFIg39nO7pTIgKAQK9Nk8C6Qa0L8veThif/GUO/5613 +k4Yj/gdFu2itFOrPcoAA8EIVIgMAAIs1egKt4YvjreKL5K1ji2WtI4reDWAAJq2LcKlxmgkv9Aza +AMABwToLL/UCwotwqXGGCS/0DNoAwAHBjgov9QLCz3GAAHAKAKESDWADyXANAS/0o8DxwKIIL/RX +2M91gADkLCOFz3KAAHQKd5EAogsLHgBf2ACiCwueAIW4AKILC14Ah7gAooomCxbLYdlhANqA48og +gQDPcqUA6A8GogCJz3GgAKQwgOABgc8g4gDQIOEAAaG2Dc/3A4XPcaAAyBxPgALgSKG6CuAAyGAD +hboOb/0OgI0AD/Thxc9wgADkLAOAKYBEIYOAANok9IkKFQQAIo0PgAAkLACNoLgArYAVgBCguIAd +AhBAFYAQoLhAHQIQEI2guBCtkBWAEKC4kB0CEFAVgBCguFAdAhAB4uDxRQoVBAAijQ+AACQsAI2A +uACtgBWAEIC4gB0CEEAVgBCAuEAdAhAQjYC4EK2QFYAQgLiQHQIQUBWAEIC4UB0CEAHi4PEjCZ4B +z3KAACQsCIqAuAiqiBKAAIC4iBoCAEgSgACAuBDwkuvPcoAAJCwIiqC4CKqIEoAAoLiIGgIASBKA +AKC4SBoCAADYPwkeAEokAHTgeKggAAYrCJ4AACCDD4AAJCwgE4EAgLkgG0IAoBOBAIC5oBtCAGAT +gQCAuWAbQgAB4BzwSiQAdOB4qCAABisIngAAIIMPgAAkLCATggCguiAbggCgE4IAoLqgG4IAYBOC +AKC6YBuCAAHg4H/BxfHAvg7P8892gADkLBpwCwhRAACGAvABhsQQAAYVJg0UTCAAoAHfJbhTIAUA +IIXAf0AhAAbEEQEGGwlfAQohwA/rcoHYjbiKI40PfQIv9QokAASKIgsNWWAAFgNAWGBgoAAWAEAB +oQAWgEAIqQAWgEAJqc9wgAAwMwWAEQhRAECFABYAQQ+yBPAAFgBBABaAQAqpABaAQAupABaAQAyp +ABaAQAAWAEEHsQAWAEEIsQAWAECiDE/9AIXIEAAGhiB/jkH08CbAE8gQAAaGIH+OO/QKcJ4N7/gB +2dYMr/wvIAcE0gtgAwpwz3CAACwwLJAelg0JAACSCc/5SwgBBACFxBABBgpwJbnAuZII7/UA2joN +gACJ6AvIBSCADwAAADwLGhgwKg2AAInoC8gFIIAPAAAA1AsaGDALyJC4CxoYMAIMD/TKDI/43QXP +8+B48cBSDe/zANkKJACgocHKIWEAFPLPcIAAMDMQEAUAHQ2fAAohwA/rcn7YjbiKIwgNSQEv9Qok +AAXPdYAA5CwVJQ4VAIYVJVIQJBAVAAASASAgEBYAKBAXAUEtTyEpgRoQGAHAvyW5UyETAM4M4AIN +2YogiQCKcfYOL/zpcjoOL/6KcACGCYAluFMgEACKcJYM7/gA2UwkAKA0CcH/eQgQIA3vCiHAD+ty +f9iNuIojiQdKJAAAxQAv9bhz9gsAAaoMr/gB2ACGCIAPCB4ALBWAEITgA9gC9AXYOnAhCxEgZgyP ++w4Mj/vPcIAA7LwDiIDgcA4hAMogIQAsFYAQhODKIIEPAACAAMAI4fvKIWEASiMAIEvwfgiv/4pw +Tgyv+ADYLBWAEITgyiCBDwAAgACYCOH7yiEhACEMESAKDI/7AgyP+7YIz/cSCk/6gOBUCcL3ANgf +8EoJz/f+CU/6hOhiCIADFvDPcIAALDAIiIngzCDigfD1z3CAABxUAIAE2b3aHttAwItwig1gABi7 +Adh6cACGCIAPCB4ALBWAEITgBNgC9AbYOnAAhiiAFJAEIY+PAAYAAAV/B/L2ucInohDAJ6EQKnCK +cVYJL/bpcoDgyiBCBEQJIvbKIcIDDQsQIOIKj/if8GYJT/oE2c9wgAAwMxYKb/0koCCGyBEABoYg +f45B9GIKr/yKcF4JYAOKcAASACDIEAAGhiB/jkD0z3CAACwwLJAelQ8JAAASD4/5bQgBBYpwCnEa +Dq/1Adp/2RG5z3CgALAfNKCOCk/6rgqAAIjoC8gFIIAPAAAAPAsaGDCeCoAAiOgLyAUggA8AAADU +CxoYMAvIkLgLGhgwdgkP9AzwJBlABSCGIBmABSCGKBnEBSCGGhkEBrIIT/oJ6ADYCwwRIBYPQAMD +8PoOQAMB3XoJYAGpcM9wgABQK9YIYAGgqCkMUSDPcIAALDAIiIngzCDigQP0EQgRIBEIEQJ6CE/6 +BOjODw/1dggP+tIJj/gEypDgzCCCjwAAswAO8gohwA/rcgESBDaS2I24iiONBmkG7/QKJQAFBgkg +AQDYeQLv86HA8cBOCs/zz3WAAAgKAIUA3oDgCAiCAQzMeQgeAM9woADIH7AQAgDPcYAA5CwjgQLi +RhEBAWG5CCJBAD6gENkuoAHZFRhYgM9wgABA0gMaGDDPcIAACNPSDCACBBoYMM9woAD8RCWASiBA +ILy5JaAMzIYg/4HPcIAAyAkAgMIgASSA4LQMgv0EII9PMAAAAB7wNQheA0IOz/7PcKAA/EQlgLy5 +JaDPcIAA7EQOgIwgAo2H95oO7/UZ2KIOYAAA2AzMMQjfA8l3GnYA2M9xgABoRQyhz3CAAIgrEIAA +gA6hVfBqDu/1Gdh2DmAAANgB3k3wBNgGGhgwz3CgAMgfP4CA4YohDADKIYIPAAAAAi6gA9kVuRIY +WIAAhYDgzA5CARcDAAAMEgE3TQheRQbIhiDxjyD0z3WAAHhDiBUAFgQhvo8AAABQAeCIHRgQBfIE +2AwaHDCGDc/+z3CgAPxEJYC8uSWgaxUAFn0IhY8AALQAAd4MzNUIHwHnCJ8BhiD/hbDyUSMAwHv0 +BsgEIL6PA4DoU8n1kwhfxQoN7/oA3s91oADIHzkIECD/haAVABAJJwAQ5ODM9s9wgABwuwCADQhe +AN6lGghgABDY5OfI90AVARYweYYK7/oQ2IogCACgHYATDqUfhYToiiAEAA6l6gqAAC/YlbgSHRiQ +z3ABAMD8FR0YkNIIAALPcYAAfEEAgYfg6fLPcKAAOC4FgAQggA/AAAAA13DAAAAA2PL12gW6z3Cf +ALj/WqAH2lugadoYulmgAdjN8A3MUyBAgJ/zBMgDEgE2AxoYMAQaWDDOCgACz3CgAPxEJYC8uSWg +z3CAAMgJAICA4MAKgv2H8VEgQMWF9QzMz3WAAHBEPwjeAIDYDBocMA3MDwjeAh2FAeAdpQDeBPAV +hQHgFaXPcIAAcMcRiFEgAIB4DOIByiBiABDvHIUB4BylDPCKIAQADBocMBSFAeAUpQTvG4UB4Bul +DMx7CN4BDcwEIIQPAAAAGDkMgA8AAAAIkgiP+A3MSQjeAM9woAAsICWABoAK4TEIRAADEgE2AtgM +GhwwUNjSDS/+mBEBAJ3xEgyv+clwEQgeAAjYm7gGGhgwKfEE2AYaGDAl8QPIoBAAAPC4ANg/8tIJ +D/kA2Ja4OfBRCB8CdQhfAgQgvo8AAABQDfIXCx5AiiEEAM9woACwHzSgBNgGGhgwDczvuAPzz3Gg +AKggSIHPcYAAmL0vkTBy8gXF/6+46wXv/w0aHDD6Cm/8iiAEANoPb/gA3QPIoBAAAPC4qXAF8mIJ +D/kA2JW4JgsAA7jxUgkv+QHYANiQuPnxANgLCFEAB9gAoc9wgAAICgCAgOD4C0IBz3GAAGhFDIFN +gQgiAAANoc9wgACIKxCAT4FggA6BAnsAyggiwgBPoRUIEQID2c9woABALTCgABqCMwXwAeAAGgIw +gQaP8+B44H7geOB+4HjgfuB4FLgleM9xoAA4LgahBoEBCN4H4H4A289xoADAL6UZ2IAP2gi6oxEA +hkR4jCAQgPzzFBnYgKMRAIYLIICA/PXgfpTgyiIFAIX3CHKAIsIEz3GgAGgs8CGBAADbz3KgAMQs +Z6Joogy4nbifuCV4BqLgfvHAog2P8wh2ng/v/yh1yXCCD+//qXH5BY/z4HjhxTDbAN3PcKAAyBxp +oAPaz3GgAMwXIRmYgE6hp6BqoOB/wcXxwF4Nr/MA2c9woAAMJFiAz3WAACC9rXBBKoYHhiD3D5gV +gxApuHZ5wHHHcYAAMNEVeQARhADPcIAAnCIggEAszgDVftBh2WFEII+AUyCOAAQigA8AIAAAzCAi +gAb0gOfMICGAANgD9AHYz3egAMQnQCsFBoYj/Q9SI8MBswwzBEW7gObMICKAU/LPcIAAuF7wIIcD +QC6GAwUmxgEFJYABBXtBH9iQUQ6REB+FENqauB+lCNhPHQIQz3CgAMgcSaAHgc9yoADwFwaiBoEG +ogWBBqIEgQaiANgKoooVABFouBB4ih0EEACVhiD/jCj0AdgdoibwThWAEKLoihUAEUylZLgQeIod +BBAE2U8dQhAbDtEQKxcBlmS4EHiKHQQQDNgtpU8dAhDiDe/5iHAI8AUjQwFBH9iQH4WzuB+liQSP +8xDaz3GgAMgcSaEB289xoADwF2qhpBACAE0K3gIC2l2hz3OAAAjHRINGoUODRqFCg0ahQYNGoXAQ +AAEc4FMgwIAE9EAjAAgE8EAjAAxAgFOhTGhAglOh+BACglOh/BAAgBOhD/BckIYi/4wD9H2hSIBG +oUeARqFGgEahBYAGoeB+4cUvgM9zoADwF89yoAD8FyijQBABASqyMYAoo0gQAQEqsjOAKKNQEAEB +KrI8kIYh8w+MIQyAB/Q2gCijXBABASqycBABAbyQCOGosr2QqLJUEA0BqLJgEA0BqLK5gKejuoCn +o7uAp6NyEAABOGAQeAiyz3CgAPQHJ6AC2c9woADIHCeg4H/BxfHA0g+P+VILz/nRwOB+4HjgfuB4 +8cACC4/zz3WAACC9F4XPdoAA0NELCBAGWBWAEAToGoVbhQTwHIVdhc9xgACwQiCBEwkfADKFBCGB +DwAAABAleCV6z3H+//8/JHgBpgDf4qZEeS2mDtiCCC/6DqYH6M9xgAAcMDINYAAB2M9xgAD4LCYN +YAAA2BeFDwgRBQHYAa4xHgIQBPDhrjEewhPdAo/zocHxwGIKj/M6cQh2SHfOCm/7AN2B4MogQiML +9M9wgAA8KwCQgeAB2MB4QCgQA8lwhiD8AIwgAoUj9M9wgAAgvZgQgADnuMogIgAK9AK4FnjPcYAA +SMkAYS24wLjPcYAAnAoggVEhgIDPcYAAmL0UeQTyINqtkQrwmNqrkQbwz3CAAFy9s5AO2gGXQCUB +FREJAwCieEggAAAQeAPwANhacADYKnGpcyoPIAOYcAohAKAE9HoLAAM6cEwhAKAA2Ej0BSCAIw1x +ALENcQAZhAQjhw1wIKAolw1wILCMJgKVFfKMJgORHfKMJgOVJPIKIcAP63IT2Iy4z3MAAJQKiiSD +D3UFr/S4c89wgAAgvbQQAQAPgQHgD6HGCSAA6XAS8M9wgAAgvbQQAQAOgQHgDqEK8M9wgAAgvbQQ +AQANgQHgDaHPcaAA9AcA2AShAdgacM9xoADIH/gRAgBCdQIlgBBIIAAAX4EQeD0IhABDh89wgACw +oUKgoNgPoQDYH6HPcIAAIL0ckGK4QnAfoQLYFRkYgA0JECBRIEDGINgD8oDYDqGMJgOVBvTPcIAA +IL0ckAnwjCYDkQj0z3CAAJi9D5BSCq/6ANmyC0//DMyGIPmPEvSMJgORyiAhAM8goQMI8kwiAKAA +2M8gIgPKICEBDBocMApwCNzPAI/z8cB6CI/zocEId9oIb/sA3RUIUQDPcIAAPCsAkAHdgeDAfQy9 +z3CAALzSBIDPcoAA7KEEIIAPAAAAEEUgQQNAwSDAw7gcePQiAwDPcKAALCAPgHC7FQjkAADe8Hhw +eyIJYAMU2gkIHgbJcDjwA9jPcaAA9AcFoYUlAxkNcKCwDXDAsIoi/w8NcECgz3IAAP//DXBAsAPI +z3OAAEjJz3KAAOQsEIgCuBZ4AGMtuMC48CIAAKCADXCgoAPIEIgCuBZ4AGMtuMC48CIAAEKQDXBA +sMSh9ggAAwHYCQCv86HA4HjxwJYPT/PPcoAAJKIgihLpwYKigs9xgACcCgISEAHggc9ygABoRSuC +NL8B4SuiMPDPcqAAxCcREgGGAN/1CZ6BZBIDhmQa2IMC2RMaWIAvKcEATiGCBxPrz3GAAISVVnnA +gaGBz3GAAASW9CGQAM9xgAAklvAhjwAK8M9ygABoRSqC6XXpdhp3AeEqokGADXFAoSSQDXAgsM9x +gADYvQCBBuhCgQ1wQKAA2AChz3CAAOQsA4AIgOu4yiCCA8ohQgPKIsIDIApiA8ojAgRTIMAgz3GA +AJwKIIEUvwy45XgXCZ4AgrgNcQChDXDAoA1woKAd8A1xAKFKJAB0qCAAA0QmgRAPuVMmABAleA1x +AKEivkokAHSoIMACRCWBEA+5UyUAECV4DXEAoSK90QZP8+B48cBuDk/zCHYodShwSHFeCCAAaHKB +4MoggQMQCCEAyiFBA7kGT/PgeCK5BvDscmCiBOBhufkJtYBggM9woADUC22gA9nPcKAARB01oOB+ +4HhBKYGACfIvJElwqCDAAQQQAgTscUCh4H7xwAYOT/OhwQh1SHbPcKAArC8ZgAQggA9wAAAA13Ag +AAAAAdjAeC8mB/AA2soggQAt8gvMABxEME8gwQMCHEQwAeAQeAQggA8AAP+/j7gLGhwwz3CgANQL +OIBCIQEIgOHKIYwAQCUAEhBx7A/FAgflBCWNHwAA/P/FfZ29n73scKCgAMHscCCgAdjpBW/zocDx +wOHF1g0v+wDdgeDKIEIDCfTPcIAAPCsAkIHgAdjAeAy4hSADAQPaz3GgAPQHRaENcgCyA8gA212Q +DXBAsAPIUYANcECgA8hIEAIBDXBAsGShmQVP8+B48cAeDU/zz3WAANyG4BUAEADegODQ90QuPhcA +IUBzHNnF2h7bjg7v/xi74BUAEAHm5w4EkADYVQVv8+AdABDgePHA3gxP8yGACiYAkBCJw7jKIcEP +yiLBB8ogoQbKI4EPAACqAM8gIQM58oDhyiHBD8oiwQfKIOEGyiOBDwAAqwDPICEDK/ICuM9xgABI +yRZ4AGHPcYAAVAotuMC4DKkjhiCRhiH8AIwhAoAM9M9xgADkLPAhAQC/EQAGgbi/GRgAAYaigAXt +AYUD6ACFjOgKIcAP63Ic2Iy4udtKJEAAQQCv9LhzCwifQUIMAAAH6ACFgNkooAGFQHgd8AGGIJAU +yBBxyiHND8oizQcd2MojjQ8AAMYAzyAtAyH3og+v+clwygogAAGFz3CAAFQKSgvgAgyIWQRP8+B4 +8cCjwQDZYMEBHAIwAxxCMAIcQjAB2c9woACwHzmgz3GAAIgrDIEAgITaQsAIgQCADNke20HAi3BC +De//GLujwNHA4H4I2exwIKAD2QDaz3CgABQEJaAByOxxAKHPcKAA1AtNoOB+4HjxwOHFpcEIcgDb +z3CgACwgsIBAwQbYQcBCw0PDRMMB2B7ZmHO4cwAlhx8AAAB98g9gANhzvQNv86XA4HgIyIe4CBoY +MAnIm7gJGhgwCsgKGhgwC8iHuAsaGDAMyAwaGDDgfuB4z3GAACSIAIGBuOB/AKHgeM9xgAAkiOB/ +A7HgeOHFz3KgAKwvANmq6M9woAC0DzygGILBCJ8GFYK5CB4AGoK1CB4Az3OAAIArQIMBag8IUQAB +3c9woADIHLGgz3WAAEdoz3CgAOwnpqBAo4kKEQDPcKAAyBwxoD7wGIJvCJ8GFYJnCB4AGoJjCB4A +z3OAAIArQIMBag8IUQAB3c9woADIHLGgz3WAAEZoz3CgAOwnpqBAo+B44HjgeOB44HjgeOB44Hjg +eOB44HjgeOB44HjgeOB44HjgeOB44HjgeIXqz3CgAMgcMaAB2c9woAC0Dzyg4H/Bxc9ygABYQxV6 +4H8govHAmHAKIcAP63IKJcAHz3AAAKIZBQZv9Fbb4HjPcoAANEMVeuB/IKLxwJhwCiHAD+tyCiXA +B89wAACjGd0Fb/Re2+B4z3KAAGxDFXrgfyCi8cCYcAohwA/rcgolwAfPcAAApBm1BW/0ZtvgePHA +pBABAA0JXwZWDI/5B/Ag2c9woADIHCmgA9nPcKAAEBQloNHA4H7hxQO4NXjPcYAAHFACYUokAHQA +2aggwAIWIkAAoYBggCnYErgB4XV4oKDgf8HF4HjPcIAA1AkAgKHBJoCeEQAGhrieGRgA4H+hwOB4 +4H7geM9xgABUCuB/BKHgePHA4cXPcoAA5CwjgjiJHwkRAQohwA/rcoogjA6KIwYCSiQAAAUFb/S4 +cyCCxBEBBnMJXgHPcoAAQEkggkIhAYDKIWIAr+mP6AohwA/rcoogzA6KI4YDSiQAANEEb/QKJQAB +JoIjgWG4oIHPcYAAiCskgSCB1bk9Zc9xgACw0SWBBSk+ACd1SHAiCCABQiWBEs9wgABcSQAlgR8A +AIgTDggAAf0AT/PgeOB/ANjgfwDYIIAHueB/IKDxwHIIT/PPdYAApArMjQ2Nwr7CuBZ+z376CW/9 +DdgGuIG4EL7FeM9xoADsJwahBIXPcaUA6A8GoQWFB6GhAE/z8cAuCE/zz3alAOgPJoanhs9wgACk +CgDfJKCloLYJb/0N2Aa4gbjPcaAA7CcGoeamRSXNH6emYQBP8+B4z3GAABAwz3CAAAAKAJBHiSsK +AQDPcIAAAgoAkEGJHwoBAM9wgAAECgCIJokPCQEAz3CAAIg4AIAC8ADY4H7geOHF4cYA3TMJ0AcL +CdMHCwkTAADYE/AZCfMHH95OIfwH4HioIIABDyWNE2G+CQhOAKV4A/CmeACiAdjBxuB/wcXxwKHB +ANpAwroP7/+LcgDAocDRwOB+4HjxwFoPL/Mo2GoMD/rPdYAApDhAhQh2BCCEDwAA8P8A2GB6QSwB +AUCFAdhEJgQTYHpBLIEAQIUC2GB6UyZBEDYML/oA2ECFCHdBKAECA9hgesC5QIVBL0ESBNhgesC5 +z3EAAAi9z3CAAKA4IKDPcAEAGJdRBy/zAKXxwHYOz/waCs/8z3EAADC9z3CAAKg4mgxv/CCgz3EB +AECXz3CAAKw4IKDRwOB+4HjxwLYOL/NQ2MILD/rPdYAAtDhAhQh2ANhgelMmQRBAhQHYyXFgeoYh +/Q/PcQAAVL3PcIAAsDggoM9wAQBol+UGL/MApfHA4cVWC+/6B9h+Da/8CHWuD8//3g/P/G4K7/qp +cMkGD/PgeOB+4HjgfuB4BQAAAPHAPg4v8whzCHaGI/4DRLsId4Yn8R9Hv0QggQM8ec91gABwxy2t +BCCEDwAAAAxCLIACE60EJoQfAAAAMEIsAAMUrQQmhB8AAABAUyG+gEIsgAOxHQIQDvQKIcAP63LV +2AW4WtuKJMMP2QFv9EolAADPcIAA7LwEiIHgzCAigMwgIoEG9FNpJXpPrU6tgOPMICKBBfJTa2V6 +Tq2A58wgIoEE8hNv5XgPrRNpJXgQrQ6NDK1qCmABANjtBS/z37XgeOB+4HjgfuB44H7geOB+4Hjx +wG4NL/MA26HBBLjPcoAA0NEUeB1iGmIBgm8mQxDIpYomBBLPcv7//z/JpQR6gOFAwsolwQAL8giB +BCCADwAAADBCIAWAyiViAE0NEADPcIAAtLsAEAQAyIEEJIYPAAcAAAQmjh8AAAAwLL5hvkEuBgZA +JoATDyICAEDChQ6PAwohwA/rcj7YjLiKI4oO5QBv9Lh2z3CAAOy8B4iB4M8ioQMv8s9zgAC0u892 +gAAgvZoWgRADiwshAIAh8kwWgRAA21MhTgBEIQ8DDyODA0K/AN4PJs4ThiH/AwQmDpAA30S5BHsP +J08Q5HjKJgEQgOPKI4EDDrtlegPwAYMFekDCz3CAALS7IICLcoYh/gMkuUApgwMgggQhjg8BAADA +CybAkBby13YAAABAzCaCnwAAAIDMJoKfAQAAAAT0AYAD8AKArrmvubC5JXgAogAUBDAEJIGPAQAA +wAr0CiHAD+tyRtiMuA0Ab/SKI4sJCIUuuUApAgYEHQARRXgIpYogBQYJpc9wgAB0vQSIgOCKIAUO +yiCBDwAA2AEJpalwANoB3moLr/3Jc8CtLQQv86HA4HgKJQCA8cAR8icNkAApDdAACiHAD+tyiiDN +DoojBAWlBy/0iiSDD7YLAADRwOB+ZgsAAP3xGgsAAPnx4HjxwH4LD/MIdc9wgACEPwmAiejPcIAA +FD8pgAzg8CBOAALwAd6KIP8PAKXPcYAA5CwAgcQQAAZpCF8BxgqP+wCl2g0v+qlwgODKJeIRovQW +CY/5hugAhYwg/48N9M9wgACoOCCAYHkB2IHgBd3KJSIRkPDPcYAApCIhkc9zgAAAC0CDPOE6YiGD +ZOIU4VlhMHAB3cIlThOzfcG9fPADgRiIKQgRASIKj/sApc9xgACkIiGRz3OAAAALQIM84TpiIYNk +4hThWWHl8c9wgABASQCAz3eAAJCSQiAQgDYJr/vKIGIgAKUBhw8IhQMGDu/4yXEIds9wgACIKwSA +z3GAALDRAIAlgUlu1bgFKb4AJ3BquCCFSCAAADBwyiBGAET3AKVKIEAgz3GAAKQiYZHPcYAAAAtA +gSGBPOMB3XpiZOIU4TpiUHDCJU4Ts31TJU2QIvJBCFEgz3CAAEBJPgnAAM9wgABcSTIJwADPcIAA +BEoqCcAAz3CAACBKHgnAACGHEQmlA8lwFgggAAHZBPDSCM//UQIv86lw4HjxwOYJL/O4cYDgyiHB +D8oiwQfKIIEPAABLA8oj4Q7KJCEAzAUh9MolAQHPd4AAlEkmhyOBIIHPcoAAiCtEgkCCz3aAALDR +UyJNBTa6ACIQAD1lRYZhuAUqPgAndQIlQBCMIBeHSvfPcIAAkJIhgAUpvgAndQAgUCAhDRAAYQ1Q +AJsNkAAKIcAP63KKII0OkNtdBS/0iiSDDyYPT/kR6M9wgAAsMCyQz3CAAOQsHpATCQAAAiWBHwAA +AAzpcATw6XBCJQEVqgjAAM9wgACwSQAlgR8AAIgTmgjAAEvw4g5P+c9xgAAEShLoz3CAACwwTJDP +cIAA5CwekBEKAAAocAIlgR8AAAAMBfAocEIlgRdiCMAAz3CAACBK2/GmDk/5z3GAAMxJEejPcIAA +LDBMkM9wgADkLB6QEwoAAChwAiWBHwAAAAwE8ChwQiUBFSIIwADPcIAA6EkAJYEfAACIExIIwAAK +cMm4z3GAAJCSA6EGhoG42QAv8wam8cDhxc91gAB4SX4PoACpcM9wgABgPyCAz3CAAGQ/AIAJIQEA +z3CAAKi6CIAJIQIAz3CgACwgMICpcL4PoABZYakAD/PxwM9wgACQkgGADwhRAM9wgAAUPweAz3GA +AMxJIIFCIQGAyiFiAJDpz3GAABi7LIGK6c9xgAAAu2IL7/gjgQoO7/8C2dHA4H7xwOoPz/LPcIAA +iCsEgKCAz3CAAEBJAIBCIACAyiBiADa9h+jPcIAAXEnSDoAAz3CAAAC7IYjPcIAAlEnPdoAAkJKK +6SCAQiEBgMohYgAE6SCGremmDoAAz3CAALBJng6AAAGG7grv+AhxIYYPeB0JBQAKIcAP63KKIA0D +19tKJAAAaQMv9Lhzz3GAAMxJIIFCIQGAyiFiAAbpHWUjhsm9Cw1AEFoN7/8A2a0Hz/LgePHADg/P +8lpwGnHacPpxOnJ6cwDYmnBvJUMQCHZKIMA3O3AId7pw6XCqcdoJL/MB2gAgQIMBIYEDygkv8wty +QiBYsMpzQyEZMPJxzCDBgAr3ACdPkwEllSMCJhagAydXIKlwyXHKCS/zAdoFIH6ACHUodtv16XCq +cely4gkv86pzAiISoOlwAyBQIKpxdgkv8wHaBSI+pAh1KHYQ8gUlvpMM8ipwANlKcrIJL/MKc6ly +ygkv88lzmnAqcADZ6XKeCS/zqnMAJAIghQbv8gAbgCDhxeHGqwoQAEAiwwMku8O6AvAA2pUKFQQz +JoJwgACEUkAnjXJUfSB9wIgBGZIDAeABEIIEARmSAAEQggQBGZIAARCCBAEZkgABEIIEARmSAAEQ +ggQBGZIAARCCBAEZkgABEIIEARmSAAEQggQBGZIAARCCBAEZkgABEIIEARmSAAEQggQBGZIAARCC +BAEZkgABEIIEARmSAAEQggQBGZIAARCCBAEZkgBCI0OAs/XBxuB/wcXhxeHGI+pjaiK7wboC8ADa +NQoVATMmgnCAAIBSQCeNclR9IH3AgAQZkAME4AQQAgQEGZAABBACBAQZkAAEEAIEBBmQAEIjQ4Dj +9cHG4H/BxfHAZg3v8lMhQgBOIg0Bz3KgABQEyYIA2w4mgh8AAAAGUHHKIcYPyiLGB8oghg8AAMYi +yiOGDwAAmwLKJGYAKAEm9MolxgCA4cokTXDKIs0A6CAtAk5gz3GgADgEAeLIqR0NUBARDZAQHQ3R +EM9woAA4BGioz3CgADgEaKjPcKAAOARoqE0Fz/LxwLoMz/K6cHpx+nKacwoiACEKIEAhyHUKIcAh +CidAk89xgABWyconYhASbxZ4CGFMIwCgBLiGIP4DBX/KIcwPyiLMB8ogjA8AAMEhyiOMDwAA7gDK +JGwAhAAs9MolzAQdCJ5Bz3CAANCggNkooAzAA+hAeIHwygiP/3/wz3aAABhLAYYA2fIOL/Q42gCG +HNkgoAGGGNkgsM9xgADkLBUhVgMAFgEgU4ENwfCoz3eAAFgMKBhABEV5pLkhoADZMxhCAOlxIqAK +IUCDMRjCBDIYwgQ0GMQFyiFiAA4Pr/gM4IXtz3GAADihBPDPcYAAWKEjps9wAABIEQCxGNgCpg0N +UCCKIAUCALEMwIXoz3ABAJCVAacAFgAguRAABi0IHgBBhhrYALICpgCRh7gAsQDYC7EBgq24AaIR +DBAgz3CAABhBBIAzGgIAKQoQICGGAYGYuAGhA4GfuAOhz3GAAIgKABYAIAAZBARAgAGAQaECoZIO +b//JcI0Dz/LgePHAPgvP8rpwenH6cgoiACEKIUAhyHUKJMAhCiBAg89ygABWycogYgAIcQK4FngI +YkwjAKAEuIYg/gMFIFAAyiHMD8oizAfKIIwPAAC/IcojjA8AAJYAyiRsAAgH7PPKJcwEDMCM6Aoh +wA/rcofYBriX20okAADtBu/zuHMVCJ5Bz3CAANCggNkooAzAQHhn8M92gAAYSwGGAN/pcV4NL/Q4 +2gCGHNkgoAGGENkgsM9xgADkLBUhVgMAFgEgM4EzGMIDz3eAAGAMEBgCBKS5jbmZuSGg6XEioAoh +QIMoGAAFMRjCBDIYwgQ0GMQFyiFiAHoNr/gM4Ibtz3GAADihBfDPcYAAWKEjpqTYALEQ2AKmCw1R +IKTYjLgAsc9wgADkLBmQjriPuAGxDMABpykKECAhhgGBmLgBoQOBn7gDoc9xgACICgAWACAAGUQE +QIABgEGhAqEyDW//yXAtAs/y4HjxwOHFz3WAAIhGAI2MIMOPD/TPcoAAJEkGggOAIIDHcQ8AAKBe +CaAASHD+2ACtSQLP8uB48cDOCe/yANjPdYAACMxKJAB0gN6oIAAFCHEB4E8gwgEWJUMQR6uKIggA +Ark2ecdxgABIyUChANpCscapwNh/HQIQz3WAAPgKwK3PcIAAyMiA2RYML/QocsGtz3CAAEgw2ajP +cIAAOC3RAe/yxajgePHAWgnP8qHBCHcmDe/0GNjPdoAAeEMghgGGgOHMICGAK/TPcKAA1AsYgADd +QiAACIDgyiBMA4wgCIVI98EWABYB4MEeGBAc8J3YABwEMAvM6XECHAQwAeAQeAQggA8AAP+/j7gL +GhwwAMAe2ioIIAAYuqGmBPAE6GG4AaYWCAAAANh2DW/6QCYBEjkB7/KhwOB+4HjxwL4Iz/IIdxpx +OnLPdoAA5CwDhs91gAB4QxSQELgmDi/5AqWA4MogIiDPcIAAmAoAgIvohSEIJE8hQCefuOxxAKHs +cOCgA4YIgA0IHgAChYG4AqXPcIAABAoAiIToAoWDuAKlz3CgACwgEIDPc4AAAEVyHRgQSiTAcADY +qCDABc9xgADcCSCJgOEM2soiIQBEKL4Dz3GAAGDXJ3IzIYIAQCMBAxlhAeBAqUAlDhLODe/0yXAP +CBAgIoUA2IC5IqUD8Iog/w/PcYAAmAoggWcVDxZoFQQWlOkA2wjw7HIgogR5BB5QEAHjjCOCgCCG +uPfPcqAA1AstoiR4AKZnHdgTaB0YEQDYGQDv8twdABDgeF0G7/8A2OB48cDPcoAACAoCgiWIAdgH +6QjZXgqv+SuiB/DPcYAAXDPiC6/zAKHRwOB+4HjxwIIPr/LYcDoIIAAA3cloKw4SEPhwqXcyJoAD +FQgSDBEIkw7yD0/2Mm84eAV9AedCJ0cA5Q91gGG+sQev8qlwCHID8AHgIIj+6eB/QnjgePHANg+P +8s91oAD8RB2FOYUOCGACAN4A2J64AaXgeMGlxaWBB4/y4HjPcaAAyDsOgYi4DqFpIEAA/vHgePHA +z3CAAOQsA4AYiB0IEQEKIcAP63KKIAwOiiOFCkokAADZAu/zuHOiCu/0A9jPcIAAqLoAEAQAGQwR +AAohwA/rcoogTA6KIwUMsQLv87hzz3CAADwrAJCB4AHYwHgMuCkIgQ8AAAAQz3CgACwgEIDPcYAA +hD8CoQLYA6HPcQEAsBz+Cm//AdjRwOB+8cBmDo/yz3WAABi7L4VKIAAggOHKIcEPyiLBB8oggQ8A +AL4hyiOBDwAASADKJAEEPALh88olwQDPcIAAPitAiM9wgADQoGB5SKA8HQAU8gnv9ALYdQaP8vHA +Fg6P8oYNYAAIdc9xoADIH0WFDOhuEQ4GAoBkhcR6RXtuGdgAIoUAoQvwbhEABkR4bhkYABzYGLgV +GRiARQaP8uB4gOAB2cB5z3CAAIRG4H8goPHAvg2P8s9wgACgOCCAosFgeQTYgOCqAgEAz3GAAIAr +AIEB4AChFwhRAAHZz3CgAMgcMaAaDiACKHByCm/6BdjPdoAATEIOps9xgACAKwCBAeAAoRUIUQAB +2c9woADIHDGg7g0gAihwA9guCq/zyXEE2CYKr/MibgXYHgqv8yRuC9gWCq/zJm4P2A4Kr/NAJgES +NtgCCq/zQCaBEjfY+gmv80AmARM42O4Jr/NAJoETz3enABRICIfPcacAmEcEpg2Hz3KrAKD/BaYO +h891oADsJwamHIEHpheHCKYWhwmmGIILphmCDKYagg2mz3AFAMYDBqXG2JC4BqXPcCwAAgEGpc9w +WgBCAQaliiCLAAalz3BAAIcNBqXPcNEAwg0Gpc9wwAAHDgalz3CAAIArAIDPcoAAgCtCIECAAKIG +9M9yoADIHADYEaIB2AinANgNpw6nz3BQAP8AHKEB2BenANgWp/zZz3CrAKD/OKBz2TmgGoDPcasA +oP+BuBqhz3AqAAIOBqWLcBoMIACBwQDBz3CAANCJNaYyoAHBL6DPcBoAAg4GpYtw+gsgAIHBAMHP +cIAA0Ik2pjOgAcEwoM9wJgACDgali3DaCyAAgcEAwc9wgADQiTSgN6YBwTGgz3CAAIArAIAB4M9x +gACAKwChFQhRAM9xoADIHAHYEaFSDAACAZYQuIUghAAGpQKWELiFIIUABqUDlhC4hSCLAAalBJYQ +uIUgjwAGpQWWELgFIIAPAACCDQalBpYQuAUggA8AAMINBqUHlhC4BSCADwAAAg4Gpc9wgACAKwCA +z3GAAIArQiBAgAChB/TPcaAAyBwA2BGhBIYrhginBYYNpwaGDqcIhhenCYYWp89wqwCg/zigLIY5 +oC2GOqA+Dy/6DobPcIAAgCvPcYAAgCsAgEIgQIAAoQf0z3GgAMgcANgRoWkDr/KiwPHA/gqP8n4I +AADPdoAA9E3CDm/4AIYIdQCGGQ0AEFoJ7/upcGYJL/ygpmoP7/QR2GoKz/fPcKAALCAwgM9wgACU +CikDr/IgoPHAug/v/6HBz3CAAIxGAIAE2WLaHttAwItwMgwv/xi7ocDRwOB+4HjxwF4Or/QW2ADY +0cDgfuB48cB6Cq/yB9heDw/6CHfPcKAAtA/cgG4PL/8A2BoOD/zPdYAAjEaGCW/8AKVAhc9xgABI +SwChz3GAAOxESqFKDu/8C6E+Dy//z3hKDi/66XDPcIAAUCsAiDcIUQBAhYogRATPdYAAQCsjhRpi +OGAQcgHZwiFFAATYBeneDQ/2AIUE8MYND/YChUoP4AEDpVUCj/LgePHAz3CAAIRGAICc6MIKr/kW +2Jjoz3CAAKA4IIBgeQTYEOjPcIAAkDhggM9xAQCkrgvYYHsE2qoOr/QW2NHA4H7PcYAA5CwAgcQQ +AAYPCF8BAYHEEAAGFQheASYO7/QT2B4O7/QR2Ozx6vHgePHAz3CAAMwmAIDPcYAAlAobeO4Mb/Yg +gQjoAdnPcIAAUCt2D+//IKjRwOB+8cBOCY/yCHd92A24z3GAALDRxYHWCq/yyXGMIAKAz3GAANAm +AN2H9x14jCACgAHlfPcAKEIDBSq+A89ygADMJha4AKHPcYAAiEYAGkAOhO//2ACpAImMIMOP+A6B +/1kBj/LgePHA1giP8jpwenFId2h2CiQAIQDaz3GrAKD/WaEH2BqhWKFaCSACAdgZ2c9wpwCYRzqg +7g9v/B7Yz3KnABRIHYK+gmwSEABwEhIAAKegpve4xSCCDwD/AADTIOEF973FJYIfAP8AANMl4RUe +Cu/3iiEQAAh2qXASCu/3iiEQAAh1QCgAIgIK7/eKIQgACHdAKgAi9gnv94ohCADReRnhLHkvcbF6 +GeJMei9yABmAIw8PYhAAG0AjANgE8P8Ig4AB2GkAr/IAHAIg8cAmCI/yCHUodqoIIAIK2AHYz3Gn +AJhHGqGaCCACCtjPcKYAnD9kEAQAUSQAgMohwQ/KIsEHyiCBDwAAvxnKI4EPAAC4AOADofPKJSEA +z3CnABRILIAdgACm97jFIIIPAP8AANMg4QUpAK/yAKXgePHArg9P8s9ygABooMSCjCbDnzvy/9kk +osCghC4IGQAhjX+AAAycBI0KIEAuAd+S6AKFz3GAAOAz+gzv8yCBCHHPcIAAiCsEgACAjg1AAITo +Adgc8M9wgABgMyKNwKghqM9xoACwH/mhz3GAAIgrMIEggQDdIaDGCW/56XAAIIAvgAAsnqCoANiJ +B0/y8cD6Cq/0BtjKDM/8z3CAAOQsA4AYiB8IEQEKIcAP63KKIAwPiiMGC0okAAD9Aq/zuHPPcYAA +FD8JgQsIFQEB4Amhz3GAALDRBoFGIEABBqHPcIAA/AoggBUJkQCKIEYPugjv+gTaEgrv+gTY0cDg +fvHAz3GAAIQ/CYEB4Amhz3GAALDRBoGCuAahz3CAAOy8A4iA4HwI4f7KIKEAgguv9AbY0cDgfuB4 +/9nPcIAA5JsgqG8gQwDtA6/zAdkBA+/0EdjgePHAz3CAAOQsA4AYEIQAHQwRAQohwA/rcoogTA+K +I0cKRQKv80olAADPcKAALCAwgM9wgACAR7INIACWIUEPz3CAABi7DIAS6M9wgAA8KwCQgeAB2MB4 +DLgRCIEPAAAAEMoIIAAA2CDwpgvP/M9wgADIIwCAlujPcYAAsNEGgUYgQAEGoc9wgAD8CiCAFQmR +AIogiATCD6/6BNoaCe/6BNgyCQ/70cDgfvHAz3CAAARKAIBCIACAyiBiAIjoz3GAAIQ/CYEB4Amh +z3GAALDRBoGCuAahhgqv9AbYz3CAABi7DIAY6M9wgAD8OwKAEujPcIAAPCsAkIHgAdjAeAy4FQiB +DwAAABCmCCAAANjRwOB+z3CAAOy8A4iF6DYPr/4C2Pbx9vHgfuB48cDPcIAA5CwDgBiIHQgRAQoh +wA/rcoogzA+KI8oFSiQAAB0Br/O4c89woAAsIDCAz3CAAIBHigwgAJYhQQ/PcIAA/AoggBcJkQCK +IAoI4g6v+gTaNgjv+gTYAdnPcIAA/DsioM9xgACw0QaBRiBAAXYK7/wGoTYID/vRwOB+4HjxwM9w +gADkLAOAGIgdCBEBCiHAD+tyiiAND4ojig9KJAAAnQCv87hzz3GAALDRBNgGoc9wgAD8OwHZIqDP +cIAA7LwDiIDgYA6h/sogoQBmCa/0BtheCa/0CNjRwOB+4HjPcIAAgEdpAwAA4HjxwEYJr/QT2M9w +gACIKwSAIIDPcIAAeB8goNHA4H7geAhyANhpBG/4ENngeAhyAdhdBG/4INngeAhyAthRBG/4QNng +eAhxZQRv+ADYCHFdBG/4AdgIcVUEb/gC2HEET/PxwM9wgADkLAOAGBCEAB0MEQEKIcAP63KKIIwP +iiMJA9EHb/NKJQAAz3CgACwgMIDPcIAAgEc+CyAAliFBD89xgACw0QaBRiBAAQahz3CAAPwKIIAV +CZEAiiCJB4YNr/oE2t4Or/oE2PYOz/rRwOB+8cDPcYAAsNEGgYK4BqHPcIAA7LwDiIDgUA2h/sog +oQBWCK/0BtjRwOB+4HjxwP/Zz3CAAIhGTgmv/yCoygnP/9HA4H7xwOHFz3WAAFgzABUFEIwlw48f +9JDoz3CAAOyfaBAEAAohwA/rcs9wAACHDBEHb/OKI8cDCHGCIQgAz3CAAAycDiBAALIMb/KKIQgJ +uHDPcIAACKQTEAKGjCLDj//ZBvIcGFiBIKUM8BMYWIEgpQDZz3CAAAgKJKC6DA/5NQNP8gHZz3CA +AAgKJKCpBA/54HjxwOHFAN0qDC/5qXCGDa/zqXCaD0/0zg2P889wgACwIwEDb/KgoOB48cB2C4/4 +AgyP+OYKj/jRwOB+4Hjhxc9yoADIH6QSAwDPcYAACAoNgRBzwiMGAET3YngTe7+CDoG7Y3hgDqEB +2EoaGADgf8HFz3KgACwgZoLPcYAACAoOgWJ4DqEQghkCL/cNofHAHgpv8kokQADAgaCAAd/RdcIk +AgHRdaGBYYDCJ84TAd6xc8B+sXMB28IjzgBMJACAzCYikMojYgAK9IXrgObMJyKQA/IC2wLwANsU +6yELUAA5C5EAoIDAgQGAIYECJY2ToKIDIEAAAaIQ8ADYAKIBogzwoIHAgCGBAYACJY2ToKIDIQEA +IaL9AW/yaHDgePHA4cUmgECAQiICgMoiYgCA4sohwg/KIsIHyiCCDwAANhHKI4IPAAB3AMokIgBk +BWLzyiUCAWCBFQtAAEKAooNCfQ0NUxBgg/ULQYBBgwGjYKBBoACiRICmgEAlAxYXCl4ARoUG6qKC +QoBCfQcNUhAAo0SApoBAJQMXFwreAEeFBuqigkKAQn0HDVIQAKNBgAsJgQDqCq//BoBtAU/y4Hjx +wO4IT/IIdgCAQiABgMohYgAA2CbpJoZBhgHfMHIghkGGQaEgogCmz3Ct3gIAAaamhsB/BoURDgEQ +qXBWCCAAAtkGpaaGB4UPDgEQqXBGCCAACNkHpQXvhgqv/waGAdj1AE/yIIAQccohIQDgfyhw8cB+ +CE/yCHWKD+//KHYId8Kl4g7v/6lwzQBv8ulw4HhAgBUKAABkggsjQIAF9ECC9woBgADa4H9IcOB4 +z3KgAMgf9BIAALzbGLsEIIAP//8A8PQaAAALyGV4CxoYMBUa2IDPc4AAiCsIgwDZIKAMgyCgCYMg +oA2DIKAKgyCgDoMgoAuDIKAPgyCgz3AADA8ApBpAAA6iD9gMuBCi4H7gePHA4g8P8s91oADQG9OF +EQ6eFs9wgABsSkoJAAAPDt4Wz3CAAIxKPgkAABEOHhfPcIAArEouCQAADw5eF89wgADMSiIJAAAR +Dt4Xz3CAAExKEgkAALzYGLgTpfUHD/LgePHAfg8v8gDbCHfPdqAAyB+kFgAQz3WAAIgr+GCkHgAQ +AdgTpiiFDIVAgQCAACLCg0ChLIUBIMAAAKEC2BOmKYVNhQCBQIIAIMCDAKENhQEiwgBAoATYE6Yq +hQ6FQIEAgAAiwoNAoS6FASDAAAChCNgTpiuFD4VAgQCAACLCg0ChL4UBIMAAAKEEhQCAog8v9Olx +JIUAoQWFAICWDy/06XElhQChBoUAgIYPL/TpcSaFAKEHhQCAeg8v9OlxJ4UAoQ/YmrgOpg/YDLgQ +ps9wgABMSp4Ij//PdYAAbEqSCK//qXCOCK//QCUAGIYIr/9WJQASfgiv/1YlABPtBg/y4HjxwH4O +D/IIdyDwAIYhhiGgAKEA2ACmz3Ct3gIAAaamhgaFEQ4BEKlw+g3v/wLZBqWmhgeFDw4BEKlw6g3v +/wjZB6UjhmB5yXCuDe//6XAKJgCQCPIDhyCAAoYieK8IUoAOCK//6XCBBg/y4HgP2Jq4z3GgALAf +FaEP2Ay4F6HgfvHA8g0P8s9ygAAgvT+COnCqwQDYIQneAs9xgADkLCOBSBKDAMDdNIFkeYYh/w4i +uTp9BPAU3QLYihIBAQJ5EoIE4UoLL/cA2k4JYAACIE8DA9jPcaAAyB8Toc91gACIKwiFAIBCwAyF +AIBDwAmFAIBEwA2FAIBFwASFwIAFhQAQEgBAEQAGH2fPcIAA9KBAgCGAANgAIsKDASBAAEDCQcCL +dx8JUSDiD0/zhMEacOlwMgvv/4bCCHcIEAEhC/CCwelwIgvv/4bCCHfPcIAAsNEkkM9ygACw0WWC +BsIEuxcLpABAKYACGQiFAAJ6/wiEgAXwRgtgAIbACHJGwi0PkRDJcK4NL/RIcQh2SnCiDS/0BsEG +wlpwBMMHwAXBACLCgAEgQABEwhbwle/JcK4NL/RIcQh2SnCmDS/0BsEEw1pwBsEFwAfCAiNDgETD +AyCAAEXAGw9QEM9wgADkLAOAGIiE4MwnIZAA2AL0AdgvIAegQ/TJcDoNL/QD2Qh3SnAyDS/0A9kI +dgDAAcFAIMCAQSEBAEDABMBBwQXBQCDAgEEhAQBEwPIPIABFwRcJESAEheCgCIUAwSCgDIUBwSCg +JwmRIASF4KAIhQDBIKAMhQHBIKAFhcCgCYUEwSCgDYUFwSCgFwlRIAWFwKAJhQDBIKANhQHBIKBM +IACgAdnAec9wgABMlTSoSQQv8qrA8cDyCw/ypcEIdgKLKHWYcGTAAIsAEgYBERwCMHlwAhIHAQQS +CAEQFAAx5JIGEgUBACDJAwCRLyFIEgcgQAIKCSAAEHgAIIoBAZUvIogSByCAAvYIIAAQeAAgxgEC +lS8miAEHIIAB4gggABB4ACAHAgOVLyfIAQcgwAHOCCAAEHgAJQUABJUvJUgBByBAAboIIAAQeB9n +BZXwf+d4qgggABB4JpUhcBB4B3k8eg+5JXpQegAigQIweQAcRDBHlSd6XHkPukV5MHkAIYIBUHpc +eQIchDAPukV5MHkAIcIBUHpceQQchDAPukV5MHkAIUIBUHpceQYchDAPukV5MHk/Z/B//HkIHMQz +D7/leTB5OGBpcca5hbkIuQUhwQIgthB4IJUKHAQwJ3gceAi4BSAAAQG2AMABpgHAAqYCwAOmHQMv +8qXAD3tIuA94z3KAAABg9CIAAEAoAQJIuAV59CLAADB54H8neOB48cDPcoAAPEoggoDhyiHBD8oi +wQfKIIEPAAA0EcojgQ8AAOMGyiQhAGQGIfPKJQEBAaIB2s9xoADIH1ChShmYAEgZGADRwOB+z3CA +ADxK4H8AgOB4z3GAADxKIIEA2IPhzCEigAL0Adjgfw94CiIAgPHAF/LiD8//gODKIcEPyiLBB8og +gQ8AADMRyiOBDwAA3AbKJCEA+AUh88olAQHPcIAAPEpAoNHA4H7geAhzKHLPcIAAiCsEgACAAiCA +DwACAABJACAAaHHhxVMgQgUEII0PwP8AAM9wgACw0QWAAiCDAAQhgg/A/wAA1bkieKV7RXgQc8og +rQAF9xBzANjKIGYA4H/BxeB48cDhxdhwuHG6D+//mHIIdchwsg/v/4hxEHXKIK0ACvcQdQDYyiBG +AZgP5v/KIQYByQEP8gDYz3GAAKi6BaEEgaC4BKE1Bi/0A9jgeDa4NrkwcNYghQ8AAIAA4H8ieOB4 +8cAiCQ/yCicAkM92gACw0c91gABsSg/0z3CAAKReyXGeCi//FNq6Ci/zqXBAJQAYEfAZD5EQdgtP +88lxggov/xTaQCUAGAzwyXCaCCABBdmpcI4KD/PPcIAATEqCCg/zBJYKuAWmBoaGIMMPBqbiCiAA +6XAuCQ/zEQEP8vHAocEIcy4N7/eLcILgANgG8gDAEHMB2MIgDgChwNHA4H7gePHAANnPcIAABDga +CCAAIKDPcIAAZEeCD4//0cDgfuB4ANnPcoAA1AojoiSiJaImoieiIqLPcIAASEogoM9wgADsSiCg +MbIwss9wgABwQeB/IKDgePHAz3GAAAQ4AIGU6AHYAKEA2c9wgAB4H7YP7/8goM9wgAAALRCIg+Aw +CSEAyiBhAdHA4H7xwPoPz/G+DW/4pMGA4IQJAgDPcIAAeB8AgM9xgABwQaYO7/8ggc92gADUCjCW +UZZZYTBwyiAuAMIgTQBChs9zgABISpHqEejPdYAA7EoghRlhIKUgg891gAD0QxlhIKMyhRlhMqXP +cYAAtAkggQDdBwlRAKCjIIPPd4AA7EpAwSCHQ8JCwItwQcEQ2aLaHtsCCa/+GLsA2AIMr/mLcc9w +gAB4HyCAz3CAAHBBoqaxtiCgsLbPcIAAtAmgoBILL/QT2ACHHQhUAV4IIAAB2K4ND/vPcYAA7EQd +gQHgHaEF8EYIIAAF2H0H7/GkwBXYANrPcaAAyB9vGRgA4NiQuBChCdiwGQAAtBkAAHTYQhkYAADY +mrgPoaQZgADPcAAMABkOoeB+z3KAAGRHJoIjgWG4YIHPcYAAeB8ggdW5eWHPc4AAsNFlgwUrPgAn +ccdxAAAAEC0Gr/9IcPHA4cXPdYAA1AoHhZPoz3CAAAQ4AIAfCFEAUg/P+BcIkAbPcIAAiCsEgACA +BaUB2Ael6QbP8eB48cDhxc91gADUCgeFGejPcIAABDgAgCsIUQAaD8/4IwiQBs9wgACIKwSAAIAG +pQoN7/8lhTCVOGAQtQDYB6WlBs/x4HjPcIAABDgAgBcIUQDPcIAAiCsEgCCAz3CAANQKI6DgfvHA +z3CAAAQ4AIAlCFEAz3CAAIgrBIDPcoAA1AoAgASisgzv/yOCMZI4YBGy0cDgfvHAzg3v8YohCAAI +dc9woADIHzCgAdlBGFgAVgkAAM92gACw0QOGJYbVuDBwyiHND8oizQfKII0PAAA1EcojjQ8AAJsA +yiQtAJABLfPKJQ0BDghP8/4PL/MIdxpwgOXMJWKQSvTPdYAAiCsIhSCGIKAMhSGGIKAAhSWGIKAE +hSOGIKAqC0/45QgQAM9wgAAsMAiI2QjRAQWFwIAAgAQmjh/A/wAAUyBRBQSFAIAGDu/zCnHVuEWF +BX4C28Ciz3KgAMgfc6LJhQIgQYRghk2FQIIKAAQAQinABwfwJJcKuQIhQQQZYQDYAiNDgAMiAQBg +pg2FO/B1DZEQBJfPdYAAiCshhQq4AKHPcIAA5CwAgMQQAAZRIECBCYUg8s9xgAAsMCiJOQnRAc9x +oADIHwHaU6EohQDbIIFMhQIhAYRAgiCgDYUDIsIAQKAEhQCAZg3v8wpxJYUAoQrwIIcgoA2FIYcg +oCOGBYUgoMUEz/EA2Za5z3CgANAbM6DgeAMLnkXgfs9wgABsSieABukDgECAAoFCeAXwz3D/D/// +4H7PcYAA5CwkgSiBBCG+jwAGAAChwQT0EwkfAAnwBCC+jwAAABgD8gDYAvAB2M9xpgCkABeh4H+h +wPHA4cUIdc9xoAC0R3ERAIYEIIAPcAAAAEEoPoX49Yog/w9vGRiAaxkYgAPaD7rPcKAA0BtRoAWF +z3KAAExLWRkYgAaFQIJaGRiAB4VbGRiACYVYGRiACIVXGRiABCCADwAAAIAPCh8AgOAG2Mog4QEC +8ADYz3KAAOQsQ4JIgs9zgAAsCSMKHgBPIAICjbqXukajBSCCD4AAQDpHowUggA+AAMBTD/AFIIIP +gADAJEajBSCCD4AAAD5HowUggA+AAIBXCKOEEQCGCaMGhaoNb/UhhfoO7/8BhaEDz/HxwB4L7/EA +2jpwz3CAAHDHDIjPdqAAtEdEIAEOQinQAAp1cRYBlgQhgQ9wAAAAQSk+hfn1QxYBlkYhAQ1DHliQ +VxYBlgQhgQ//b//DVx5YkF8WAZYEIYEP/3//w18eWJAA2Z65Ux5YkOB4Ux6YkGAeGJDKC4/8z3CA +AKA4IIBgeQTYFuhMIUCgFAkh+8ogQQPPd4AA8E0AjxUNABDPcIAA2Dg2gGB5ANgAHwIUqghP80MW +AJZFIAANn7hDHhiQjwkQICUJUCBlCZAgCiHAD+tyiiBaCoojjQJKJAAATQbv8golQATPcIAA5CwD +gBC9m70yIIAPAADYAp+9gOAB2MB4D7ileF8eGJBxFgCWBCCAD3AAAABBKD6F+PWKIP8Pbx4YkGse +GJAT8M9wgADkLAOAEL0yIIAPAADYAp+9gOAB2MB4D7ileF8eGJAGyITg0A7h88ogoQQpAs/x4Hjx +wM4Jz/EIdSh2Xgvv8QGAoIUQuUEtABQ4YE4L7/HJcRC5sHg4YEIL7/FALoESDQLv8Shw8cCaCe/x +uHAZCXQBmHEKIcAP63KKINoLsNuBBe/yuHMbDdQACiHAD+tyiiAaC7LbCiRAAWUF7/K4c89wgAB0 +CQhzpmgUI0MBAJMdCB4CABMEAQohwA/rcoogWgu32z0F7/K4cwCCDQhRAG8gQwAD8ADYmrghgp64 +Ad6B4TCKwH4bvsV5JXgigtGKgeEB2cB5HLkIvsV5BXkDgqB1UoqB4AHYwHgduBC6BXoA2ACtLyAH +AYi4ALPPcKAA4ERFeRUgQAEgoEEBz/HxwNII7/EE2QDYz3WgALRHSx0YkADakLp3HZiQAdp3HZiQ +z3KgAIREGKIA2pG6dx2YkALadx2YkM9yoACIRBiiANiSuHcdGJB3HViQgNh3HRiQANieuFQdGJAA +2Jy4VB0YkM92gACACclw+gov8xzZz3CAAHQJ7gov8wrZyXAhHRiQz3CAAAAIEHhJHRiQsQDP8eB4 +8cAbCHQBmHAKIcAP63KKINoLd9spBO/yuHPPc4AAgAkkg2hwNHggkB0JHgIQEwQAABAFAQohwA/r +coog2goBBO/yftskgwHhJKMA2gcJEQJEoy8hBwGFIQwAILCQ2c9woAD8RBi5IqALkwHgEHgLs9HA +4H7xwIjoz3CAAGSaUgov8yTZ0cDgfvHAtg+P8foIYAEIdhINgADPcaAAyB8IdUDYD6FAEQEGMHkG +Ce/4yXD5B6/xqXDgePHAgg+v8UokAHLPcKAAiCAA3qggQA91DtARoIDPcYAAcLvPcoAAsNHWeWiJ +R4J6Ys9zgAA8vNR7ne0AJo0fgAA0vPiNEw+REOCT+38jkYC/JH/gswXwCw9RECKRILMA2Titz3Wg +AMgc+oUgk+R5LLME8CyTCQlFA1lhBPCss7liiSHPDwQYUAAB5gDZz3CAALDRWQev8Seg8cAAFgRA +BxoYMQAWBUABGlgxBBKBMJzhyiLCB8oggg8AANwOyiOCDwAA9ArAAuLyyiHCD3YOoAAO2dHA4H7g +ePHApg6P8RpwDcjPd4AAZLzwJwEQz3WAAMS7AxICNggYRCABkoDgDRIBNgDeDvIUJUMQgBMOB8sO +EBAA3oAbnAPwG4QD4BuEAxQlQxDAswGCPQifA8iz0BuEAxCKz3GAAEjJArgWeBthZZMlC3IAOGBh +u2WwEIpyaHZ7emFFknlhhuomkVEhQIB0CcLyDcgAIIEPgADgu8SpzKnUqc9xgABwuxZ5FH0ikcAd +hBMVf3gdRBADEgE2wKcBgQQggA8AAABgLQiBDwAAACAQic9xgABIyQK4FngAYe24yiZiEM9wgAAc +LNR4IJAQ4SCwA9nPcKAAFAQwoA4KYAEKcD3wcBINAeATAQECIU4DEQ2EE8J9ongQeIAbHADPcKAA +1AcPEA6GAN3wG4QDcBICAcAbRANCeTB54BtEANATAQEB4TB58BMFAdAbRABTJX6AyiHCD8oiwgfK +IOINyiOCDwAA5w3KJIIPAAD+AEQB4vLPICIDA9kTGFiAlQWP8eB48cAiDa/xANjPcYAAEEsAoQzM +z3agANQHUSAAgAPYIB4YkKPBUvIUHhiQAxIBNgAWBEAHGhgxABYFQAEaWDEEypzgyiLCB8oggg8A +ANwOyiOCDwAA9ArcAOLyyiHCDyhwjgygAA7ZAxIBNlCJUyLAAIYi/gMQqUS6ArjEGYIAFnjPcoAA +SMkAYs9ygADkLC24wLjwIgAABKK5EAIGz3CAAHC7QKAPFgCWtBkEAAbIrghv9w0SAjYDEgE2khEA +AQoLL/yUEQEAKvBKJEAAFB4YkQAWAEAHGhgwABYFQAEaWDEEypzgyiHCD8oiwgfKIOIJyiOCDwAA +ZgI4AOLyzyAiAwMSAza0EwABDx4YkJQTAAANCF4CZgjP+AMSAzYNEgI2z3eAAMS7FCeNEAiVoegw +i89wgABIyVV/Ark2eSBgmBMBAC24Lqc2p8C4z3GAABws9CEBALwbRADQFQARBCGBDwAA8P/DuCV4 +0B0EEAXw0BUAEbwbBAAB2KAbAACiDO/78IuA4M4DIQADEg02BshRIICBwgMCACGFEQmeBpDYkLiz +AyAAoB0AEAK/z3CAAEjJQCCCA/Z/62LEFYIQEQrAAJHYkLiPAyAAoB0AEGqFz3KgACwg8IKMI/+P +DfJifxcPhR8AgAAAh9iQuGsDIACgHQAQEBWEEEAsjwD2f+NgBCO+jwAAABP4YEryEwteAovYkLhD +AyAAoB0AEE8LHwMFkJPoB8gEIIAPAMAAANdwAMAAABHYwCghBcoggg8AAIgAzyAiBBPwpBUAELS4 +pB0AEJIVABGnuJIdBBCeFQARp7ieHQQQBfCF2JC4oB0AEM9wgADkLAOAGIiE4NoCAgDPcYAATJUM +gQ8gAAEMoc9xgAB8CgCBAeC/AiAAAKFikDMVgBBPCw4AB8gEIIAPAMAAAC8IgQ8AwAAACI0rCFMA +pBUAELS4pB0AEJIVABGnuJIdBBCeFQARp7ieHQQQCfATCZ4BjdiQuG8CIACgHQAQBshRIACAFgIB +AOINj/8DEg02CHKoHQAQz3CAAIgrBICwFQcRIIBVJ0AG1bnPc4AAsNEJCQUABdgHowWDIniMIAmG +yiElAKQVABAJIYEA8risHUAQ6PKYFYEQw7kHyDx5BCCIDwEAAPANEgQ2z3CAAHC7FiAAAWWQrBUA +EEEoCBMJIM8AgBUDEX4VABF4YM9zgADkLGSDRhMDARtjCCfPEGJ/mBUDEOi7ANiG8kQjAQYjuQQj +gA8GAAAAAeExuDhgz3GAAABiMiEFAAQjhg/AAAAAQS6GBTIhgAFBK4ECUiEBAMC5A7mgcBjhheDK +IY0PAQCJDdUhDgCkFQAQSwgeBSJ/hBUBEQInQBBIIAAAQrhBK08DwL8Ev/R/aHHGuUkhwQU0f89x +gABsWfFhDwveAkEpAwEUI0EABSk+AEEpAHIA2VjwQS+FEEErQAPAuPRo9H9ocMa4SSDABRR/z3CA +AGxZ8GAPC94CQSgPARQnABAFKH4BQSkAcoQVDxH5YUErTwPAvxDhBL9BKYUA9H9occa5SSHBBTR/ +z3GAAGxZ8WEPC94CQSkDARQjQQAFKX4BQSkBciDwUSNAgsohAgAa9APnz3CAAERZ8CBBACK/BSn+ +Ay9wUyADAHhghBUDER14J+MiuwUp/gAvcVMhAwB5YT15z3OgAMQsL6Muo0AoARaeuUAsDwXleSV4 +wB0AEAqjz3GAADBDAdgAoQTwT4KwFQcRDQrFAQXYGLigHQAQz3CAAIAKQYAglQkhgQAAiA8IUQAZ +FgCWEHEA2AL3AdiL6APYGLigHQAQz3GAAHBEE4EB4BOhoBUAEAQgvo8BAQAAFfSSFQARlBUBEJAV +AhGyFQMRGg0gAUokQAADEg02oBUBECV4oB0AEAQgvo8BAQAABvL+D0/3DwNAAAPMz3GfALj/GKEG +yFEgAIDKIUEDyiAhIHLypBUAEGEIngTPcYAAMEMAgYDgAN4u8gDYAKGAFQARfhUOER5mz3CAAOQs +BIBGEAABHmYBCZ5Fz3CgAMQsC4BTIIEE/rjMISKACvKYFQAQugxv9gDadLgeZgPwAN4DEgE2CfAN +yM9xgABwuxZ5xZGpcUogACDPcKAAyB+sFQMQh+6kFQIQsbqkHYAQA/AJI4MDA9oYuk+g+BACAKFq +CCNDA0J7oBjAAADamLpOoAzupBEAAPG4DczFIKIEzyBhAA0aHDABkQnoDcjPcoAAxLz0IgAABOgB +gQ0IngMNzIC4DRocMEIIr/socAMSAjZ8kkQjAAPTCBABDcjPcYAAxLsUecARAAFleGGCHLIVC14D +VBIDAbwSDQHDu6V7VBrEAIYg/QyMIAKCGPQQigK4FnjHcIAASMllkCELUgAGkB0IXgATC1EAYBIA +AYS4YBoEAATwHJKNuByyAZIl6NARAwFUEgABw7tleFQaBACAEQEHhOk8koq5PLKkEg0AFQ0eEmgS +AwFTIMEAeWEweWgaRAATDV4SahKBAMO4OGAPeGoaAgAHyM9xgADUvAQggA8AwAAAEQiBDwDAAAAO +GQQEBfAA2Iu4B7EBkhPoDcjPcYAAxLsUedARAAFTIMCACfLwEQEBz3CgAJgDPqC2GkQApBIAAAQg +vo8AAAAwCPSGIOWP7AtiAMogggAuD8AABOjyD4/9qfADyKQQAAAEIL6PAAAAMLPy9LgoDwH2AxIB +NqQRAACfCB4Dlgyv8wHYAxIBNh2xz3CAAOQsxICeDS/5AN0ZCFEAz3CAADwrAJCB4ADdzyUhE8ol +AhQD2M9xoAD0BwWhhSUCHQ1woLADyF2QDXBAsAPIT4ARCh4AQoYNcECgRpYH8A1wQKADyEAQAgEN +cECwA8hRgA1wQKADyEgQAgENcECwEBkABAPIlBAAAFEgQILwCIH4JgoP+isAQAABgR8IHgbPcIAA +iAoAkB2xz3CAAIwKQIABgFGhEqEH8N4Lr/MC2AMSATYdsRYPz/0DyM4Mr/94EAABgODqBwIAAxID +NgGDmBMBAJQbQAArCB4Gz3WAAEDWqXBeCi/6aHEQ2AwaHDANzKO4DRocMJoNr/+pcLMHAACeEwAB +vhMCAZIbBACQG4QALg0gAYITAwEdCB4GA9nPcKAAFAQjoIogEACDByAABhoYMAPIpBABAIYh5Y9s +CkIAAxIONqQWABD0uGwCAQBQjs9wgAAoyFZ4z3OgACwgb4OEFg0RIJAII0MDonuwFg0RZOXvDeUQ +CSNBAAK6VnrPc4AASMlCYwQijQ+AAwAAN71lvYDlyiUMFAQigg8YAAAAM7oN4gHfSiEAIA8hkSAD +EJIAig1v95gWABAJIEEEmBYAEO24yiDCI0AoAyF0ewhyxrpJIsIFVHvPcoAAbFlyYg8I3gJBKgAB +FCCCACi6uHoDagQggA8AAPz/z3KAADDSA6LPcqAAxCwNojAagAQHyA0SAzYEIIAPAQAA8Cy4GLid +uBS7ZXgFeSqiz3GAAORFCIEB4AihAQmeRc9woADELAuABCCND/AHAAA0vVMggQQLCJ4HHw2VEAMS +DjZKIAAgz3GAAOxEAYEB4AGhANkv8ACWEODnCEWApBYAEPe41SFCA893gAAw0iCnoqeYFgAQNghv +9gDaAafPcYAA7EQCgQHgAqEAgbhgAKHPcIAA5CwDgAmAEQheAA3MRiCAAg0aHDADEg42AdlKIAAg +khYAETbplBYBEM9ygAAw0qKSwIJAwc9zpQCs/89ygADkLNijRIJWEgIBFOJCfQPlIr26ZbpiSCJC +AAW6RSJCA1ajUSDAgcoggi8AAIAAIMAEIYEPAAAAICW5BSAABCV4ibiOuBmjEgnP8ncFAACkFgEQ +p7iSHgQQtLmkHkAQlBYAEJAWAxHPcaUArP9AwLAWAhF4oc9zgADkLGSDVhMDARTjYnoD4iK6W2J6 +YkgiQgAFukUiQgNWoSDCBCCADwAAACAluAUiAgRFeIm4jrgZoQPZz3CgAPQHJaANyJgWAhDPcYAA +/LsVeUChpBYAEAh0hCQakBn0BCC+jwAAAAkI8lINr/3JcMoNr/0DyA3wcBYBEc9woAD0Byegz3Cg +AMgcHBgABAPIpBAAAFEgAIEMCwH2A8gBgBEIXwZ+CK/zBNgDEgE2HbGOCS/5AN4bCFEAz3CAADwr +AJCB4ADezyYhE8omAhTPdaAA9AcZhYDgyiHCD8oiwgfKIOIMzyAiA8ojgg8AAG4KyiQCBOQEYvLK +JQIEA8gckMV4DXEAsQPIPZANcCCwA8gvgA1wIKADyEAQAQENcCCwA8gxgA1wIKADyEgQAQENcCCw +AxIBNhyRhiD/DD8IEAEzgQ1wIKADyFAQAQENcCCwA8hUEAEBDXAgsAMSATYckYYg8w+MIAyACfQ2 +gQ1wIKADyFwQAQENcCCwAxIBNhyRhiD9DIwgAoIb9GARAQENcCCwAxIBNqQRAAAnCN4FOYENcCCg +AxIBNqQRAABkGQAEuBkCBLoZBAS3uKQZAACkEQAABCC+jwAAQAgH8gGB8LikDkLzDvA6gQ1wIKAD +EgE2pBEAAIYg848E8juBDXAgoAHaS6UD2Ailz3OAAHxBDRINNgCDANk7DQAQz3CgADguBYAEIIAP +wAAAACEIgA/AAAAA9dgFuM9xnwC4/xqhu6Fp2Bi4GaFIcQcJUQCgo89woAD8RD2AGYBnCN8CBCG+ +jwAGAAAt9OB44HjgeFMIXkMDyM9xoADIH7AQAAGWIEEPHqEQ2A6hAdgVGRiAwg+gAEHYLwheQ89w +gAAQSwHZIKADyKQQAQCauaQYQAAWDG//AdjPcYAA5EUNgQHgDaGWDAAABCC+jwYAygCYcB7yz3CA +AFgrA4CA4Mohwg/KIsIHyiDiCs8gIgPKI4IPAAA/BPgCYvLKJQIBz3GAAORFEIEB4FsCIAAQoQPZ +z3CgABQEJaADEgE2AYFRCN4ApBEAAM9ygADkLFEgAIAEggPy25AE8OoKb/jakM9xgABwxxGJLQge +AAOCMIkQuTIggA8AANgCn7mA4AHYwHgPuCV4z3GgAPxEDaEE8HYRDgENzFMgQIAJ8gbIBBIBNjYP +r/YNEgI2z3eAAEDW6XBmDO/5AxIBNgPIBhIRNs91gAAYLKAQEAAB2AClkg5v/8lwANkgpQnohiB+ +j9PyA8igGAAEBhpYNAMSATaSEQABEQieAqq4egwv+5IZBAADEgI2fhIBAYISAAGAEgMBOGAbYw3I +z3GAAEC8FXkJgXB7G2NpoQGC2QjeAC4K7/mA2AYSATYEIYEPAgABAA0SAjcZCYEPAgAAABEIXgdP +IsEADRpcMAbwo7pQeQ0anDADEgI2AYJbCJ4BTyHAAoy4EHkNGhwwEIozEoIABLhFeM91gABspM9y +oAA4LkSCBrUQ8C8ugRBOJoMXAN4PJs4QxnrPdoAA4Mb0Js4QEQiAA/Hqz3AAAP//BLUD8GS1CNgM +Ghwwz3CAAHDHEYgVCF4Bz3CAAOy8Ngqv/QCIDRIBNwPIAYD9uM8h4gHQIeEBDRpcMM9xgABwRBaB +AeAWoS3wENgMGhwwDcyjuA0aHDBaDm//6XADEgI2AZIJ6A3Iz3GAAMS89CEAAAvoAYITCJ8DDcgB +2gAggQ+AAEy8QKkNzFMgQIAJ8gQSATaKIAQAWguv+5gRAQADyBqQxg2v+Q0SATYNzB8I3gDPcIAA +1LwDEgE2AoCYGQAABsjCCO/2DRICNt0EL/GjwPHA4cWpwYt1qXDPcYAAoFI6DS/xJNqpcHYK7/kD +EgE2vgjgAKlw2QQv8anA8cDhxQMSATaigSCF6g0v/iTaju0KIcAP63JZ2Iy47ttKJAAAOQBv8gol +AAEBhYDg4iACAJ0ED/HxwA4MD/GYJMEzGnAA2E4cGDAAFoNAABaFQAAWhEAAFpNACwtSIS8jByRM +IwChyiHKD8oiygfKIIoPAAC1KMojig8AAFAAyiQqANwHKvLKJcoEQS0AAVMgEYAr9FkNEADPcIAA +tLsDiKhxhiH8B0W5JnhTJc4A4LjKIYIDyiEhAFYkzDkgrOG4yiGCA8ohIQCLdIAkRB4grFEggIDK +IIIDyiAhAIt0gCSEHgCsBfBTJf6ALPQA3oQrCiIAIYB/gACorQokQC4E4IQpBC8AIFIORCs+JwAh +gH+AADi6oIjhiJB1zCPBgx/yCiHAD+tyQCwOBEArBQSH2I24iNsFJkQTJQcv8gUlxQMKIcAP63JA +Kw8Ez3AAAK8obtsNBy/yBSTEA0pwvgogAEjZViIAKbYKIAAG2QAkgC+AABSwI4AVCREggbkjoE4U +ATYkoCWgBPCCuSOgz3GAANQJC+7PcIAAOLpAiByICwoBAAQZAgQAgRCIcnDKIIEEdAnh/cohQQTq +Cc/13QIv8ZUkwTPxwJYKL/EA2c9woAD8RHQQBAB5gAQjgo8AAAAIC/QEJL6PAAYAAAf0A8ikEAAA +0wieBs9wgADkLASAz3GgAMgfRhAAAR+hINgOoQ0MngaODc/0DfBPDF4GBghP8wMSATagGQAAhiB+ +jwP0AN8C8AHfiHASC6AAaHED3s91oADUB9KllgxP/c9wgAAYLACAgODMJyKQA/QTHZiTA8igEAAA +MPADEgE2GQzeBG8gQwCgGQAAiiAIAAYaGDDZ8VEkgIQA2M8g4gX19aQRAAALCJ4GBdgQuO3xCerP +coAAaEUQggHgEKL28QohwA/rcgolAAgy2M9zAAAlCaEFL/KMuChw/QEP8fHApBABAA8JXgLiD4/9 +0cDgfih0hCQSkBHyDQlfBioMT/cH8CDZz3CgAMgcKaAD2c9woAAQFCWg6/Hr8fHAUgkP8QonAJAa +cQDdFvLpcS8oQQBOIIIHz3CgAAwtT3rwIIAAwrgPJQ0QANgPIIAABiEBgO/1JO0vKEEDTiCOBw0a +mDP12AW4Zg7v98lxDcjPcaAAFAQKoc9xoABkLvAhAQDTuQpw8gxv9uR5og1v+8lwANgPIIADBiUN +kN/1z3KAAHxBAIIH2Q0aWDA/CNABz3CgADguBYAEIIAPwAAAACMIgA/AAAAA9dgFuM9znwC4/xqj +O6Np2Bi4GaMB2ALwANgHCFEAIKLPcKAAFAQqoOUAD/HgePHAgggP8Sh2RiHNAB1lMgggACK5wb4f +DlAQEw6QEB0O0RAAFoBAAR0SEAAWgEABHRIQABaAQACttQAP8asJEABAIcIDJLrDuQLwANmVCRUE +MyZBcIAAcFJAJwNyNHsAewAWAUAEGFAAABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAA +FgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAABYBQAQYUAAAFgFABBhQAAAW +AUAEGFAAABYBQAQYUAAAFgFABBhQAAAWAUAEGFAAQiJCgLP14H6A4cokTXDgeOggrQEAFgFBAhhU +AOB+4HjxwHoPz/AA3c93AAAEHUogACKpdhUigDMOEAEGANjPcqAAFATKoqiiJ6IEoj1liOFoucoh +DgCiDO/36XBCIFAgIOfVCHWgAeaVB8/w4H8A2PHAHg/P8Bpwz3CAAAhOMiASBM9wgADcCdGIEohK +IwAgEHahwVQBKQAAHMA0ancKIcAkA/B6dUQuvhMAIkAuz3GAAGDXMyENALt9MQgzJq19z3GAANQk +GoE7gSR4HQgeAs9wgADcCQuIi3PJcfoNL/ipcgDAAn2tfQAmgB+AANwJHBDBAM9ygACMRgCKBdrm +DiAAqXPPcYAAQEsggQDdSiSAcSJ4qCAABXNudHu1e89ygAAsknliIYl6YgvpIQkAACcIQgAvDVMR +AeWvfQrwQiWREC8hRyRhva99EfADEs8AANlqdQzwgOVKIQAgyiVhEAXyQiVREC8hRyQB2Szp8270 +fxUnQRPPc4AALJI6YwAjRQAVJ08U+WMhiUGK+2M3CaMA44sCIkQAAxWCAAS/8H8ieAS6LyQIAQIn +gxBseC8gRg6qD+/wiHEOeAJ/COfuf0S/7X8JCBImCuftf8lwCnF6DCAA6XIB5s9wgADcCRKIz34Q +dsAGzP/9Be/wocDgePHArg3P8Ch1gOLMIyKACfIsbS95z3aAANwJM64G8M9xgADcCbOpqXHPdoAA +3Am0rgCuVa76CSAAdq4AEIkA4YjJcBKI0Y4QdpoBCQBEKT4XL3GELgMRCiZADgAhQw4KJYAPgACk +kqBzQCmCEFR6hC4BFQonQA4AIk0OCiCAH4AAZNYAIEQTACaNH4AA3AlMIQCQzCFikCf0GhPAAADZ +GK0bE8AASiSAcRytGIsgHQIQqCAABhQkQABBiLNutH01fcd1gAAskgAQwABArRUjQgABrQESwAAB +4QKtAIoveQOtePABE8AAmegA2litXK0gHYIQSiSAcQDZqCCAAxNuFHg1eMdwgAAskkCoQahCqEOo +AeEveV7wfLkAIYoBOotsugAiQBEaiOByACIGAu4IIADpchitACJAERuIO4veCCAA6XIcrQAiQBEY +iDiLACWFAsoIIADpciAdAhAA3UoggBEUJkoDFCRLAwESgBABE4EQqgggAOlyM240ebV5x3GAACyS +AKn4cQASgBAAE4EQjgggAOlyAR8CABUlSwMVI0oDAROAEAESgRByCCAA6XICHwIAABOAEAASgRBi +CCAA6XIDHwIAQiBIEAHlmQh1kK99AebPcIAA3AkSiM9+EHZwBsz/ANnPcIAAPEstBO/wIKjxwM9w +gACMRgCAz3GAADhLIIFNaDBywCBsAcwhDIAkCwkA0cDgfuB4AnkteUx5ViEBcke5OGDgfw944Hjx +wLhxNQhRAAkNUgAdDdIDCiHAD+tyz3AAANcUiiOIAmUH7/FKJAAAQC2BAGS5ACGAD4AAoBwd8M9w +gACoIjIgQQGMIcOPyiHBD8oiwQfKIIEPAADYFMojgQ8AABACKAfh8cokIQDPcIAA0B41eNHA4H7g +ePHAz3KAAO4JCmqiCSAAKWrGDQAAzggAAM9xgACYYiCBz3CAAGQbIgggAAHaz3GAAJRiIIHPcIAA +kBoOCCAAANrRwOB+8cDCCs/wGnBId5EJcgAA3TpxFSBAI0CIAogM7892gACgHBV+ArgUeMdwgAD4 +Gwvwz3aAANAeFX4CuBR4x3CAANgcIYhLCR4ABRDBACKuBhDAAAOu6XB+DCAASHEAroDgzCBigMog +IQAS8kQoPgcAIYB/gACgksUQgwDhEIEAAiLAABB4B7gCDO/wYnkBrkIhQSCBCXWAAeWJAs/w8cAu +Cs/wz3CAANwJERCIAM9wgADcCRKIqwgCAkomAABKIcARRC4+By9whCgDESdwACCBD4AAoJIfEcsA +ACCBD4AAoJIeEcoA+HAA3gbfACeND4AAoJLVfQeNaXEF2phwEgogAAUVwxBALoIAVHqEKAEVACJB +DtR5x3GAAGTWuHEAqYhwSXEH2uoJIAAGFcMQAR0CAGG/Aea3D3WQz35CIUkQQCZGAIEJdZAvJocB +QCBIEM9wgADcCRKILyAHEmEIA4LVAc/w4HgC22CoANgAqQHY4H8AquB4ocHxwFIJz/ChwWXCCHYo +dc9wgAACCoXBi3JAJEMwggsgAACIRC6+FgAlQB4UFMEwz3eAAPCU+GB3DTMWIKhTJYAQTQhTAUYl +zRGvfRvwARSAMAAmgR+AANDTUm1UellhIMIAqUQuvhYAJUAeRKkUFMEw+GAgqMlwXgggAKlxAeWv +fVMlgBDLCFKBIfABFIIwEm0UeAAmgR+AANDTOGBAqCDCRKjJcDIIIACpcQ/wQiUAFg94ARSBMMd2 +gADo1AK4FHgeZiDAKK4Mrgjc8wDv8KHA4HjgfuB48cB6CM/wAN7PcKAAtA9wEBAAdg1v/clwz3GA +ANwJsolxiSUNwhDPcoAAiJp/2BQjzwBfZwCvwa8B4297BdjxDeOQAq/PcIAAoJJBkM91gABAS8Cl +GurPcIAASEsAgIwgH4TU9iUIgw8AAKAPQnhAiYDiiiEPCsAo4gAF9EQovgMvcLoJz/AApQDdDt7P +d4AATFDCCO//qGdhvgHl9w51kK99z3CAAIxGIIDPcIAAOEsgoNYMb/0vIAcEJQDP8OB4DngseClq +ANgPIEAAJ3BaeOB/DiDAAOB48cCWD4/wz3eAANwJAI8aDO//M4/PcIAANEsAENAAz3GAABAwFI9H +iR8KAQAAjyGJFwhBAM9wgAA9SwAQwAAJIAAELyAFILGPA/AB5a99Eo8QdfwACQAA3koigCPPcIAA +NUsAiBDoRC2+EwAmQB7PcYAANEsAEcIAACCBD4AAYNdAqV/wz3CAAKA4IIBgeQDYGQgRA89wgAA8 +UMlgAiBAIA14SCBAAATwSCBAIC8hBSDPcIAATFDLYBOPqXHaC2/3VY8JIEAELyEFIM9wgACgOCCA +YHkA2AAlkx+AAPgJGwgQBM9wgACgOCCAYHkA2AQTgSAbCBEDz3GAAEAMyWEEE4AgIngJIEEECPDP +cIAALFDIYAJ5CSFBBEQtvhMAJkAex3CAAGDXIKg6cBOPqXFKD6//yXIAEcEgAnkAGUIgQiJSIAHm +GQp1oM9+gfGhBo/w8cBWDo/wCHXPcIAA0zgAiCh3Ew0BEM9wgADSOACIPQ8AEM92gADcCalwQCaB +EgYJL/hAJsISKo4EbhYIL/hLjgqOzg7v9yuOz3CAANM4oKjPcIAA0jjgqGUGj/DhxZnojCHCjQHY +WfZKJIBxz3OAAICTqCDAA6FrRCg+BzIlTR4XDUMQB+0TCJABAeAPeADYA/BhuA944H/BxeB44cXh +xgARzQAJDRMQAN2gqRvoDQ0TEADYAKkA3c9wgADMTgCQCw0CEKlorX2gqc9wgAAkThQgTgOgjqCq +ABHBADR4AYgZ8AsNExAA3aCpz3CAAHhPAJANDQIQqWitfaCpz3CAANBOFCBOA6COoKoAEcEANHgB +iACrwcbgf8HF4HjxwD4Nr/AA2KHBABwEMM91gADACgCVz3aAAKCSyXGKIgQKJgnv9wHbj+gKIcAP +63IAFQQRz3AAANsUh9uLuwEB7/GKJQQKABaEEEwkAIHKIcsPyiLLB8ogiw8AANwUyiOLDwAAjADP +I+sC1ADr8colKwDOCU/3gODKIcIPyiLCB8oggg8AAN0UyiOCDwAAkgDPI+ICyiQiAKQA4vHKJSIA +i3FF2AHaogjv9wHbj+gKIcAP63LPcAAA3hSV24u7iiRBAX0A7/FKJQAAABQAMQHZhiD+D8DgwHnP +cIAAqCMgqMkEr/ChwOB48cBWDI/wCHXXdSUAAIAA2Er3z3GAALDRJYElCUUDIn0B4Pnxz3CAALDR +xYCpcMINr/DJcQUuPhACJU0ejCAQgMohxg/KIsYHyiCGDwAAzSLKI+YMyiQmAPwHpvHKJQYBFrhh +BK/wpXjPcYAAgAoNCFEAAdgAqQGpAImB4MoggQ8AAMQJyiCCDwAAgADgfwGhz3KAABg6IIoZYSCq +IYo4YOB/AapBiQK4FnjHcIAASMlIqCKJ4H8pqM9xgADkLPAhAQBNkUS6DQoeAA6BibgOoQsKXgAO +gYu4DqENCp4ADoGNuA6h4H7geA0SAjYEIL6PYAAAAM9zgADEu1R7x3KAADS8CHEF8gPIHJAXCJ4C +BCGBD2EAAAATCYEPAQAAAADYALMB2BzwDMwDEgE2GwjeATIRgQABiw0IQQAA2AGr8/EB4AGrC/Ax +EYEAAIsLCEEAANgAq+fxAeAAqwLY4H8YquHF4cbPcoAAzAmA4MAiIgH/3RJpFngAIIMPgABPyaCr +AN1KJABxz3OAADDRqCCAAq5ieGU2eMSormIB5a99wKjBxuB/wcXgePHArgqP8M9wgADUJgCAocGD +CJAAz3aAAOhCz3WAAOxCAIUghk0JAADPcIAAMDMEgEDBDQieAE8hAAFAwIjpbgrv9QDYYgrP9TIJ +j/eLcATZodo92+4LL/0XuyCGCekAhYfoSgrv9QHY4g9P9yCGIKUR6ToLz/V/2Aq4z3GgANAbE6F/ +2BChANiVuBChFg+v8gHYiQKv8KHA8cASCo/wz3GAAOQsFXlAgQiCBCCDD4AAAABEIA8CL7sGv2V/ +BCCDDwABAABBK04D5X4su8V7wRIOBsASDQZhC4ADBCC+j4ABAAAe8s92gAAsMMiOMQ7REb64CKJA +gQiCBCCDD4AAAABEIAECL7sGuWV5BCCADwABAABBKEMDJXssuAV7wRrYAArtLylBA04hgAcSCCAA +ECUNEPnt3QGP8PHAcgmv8JhwGwgUBAohwA/rcnHYjbiKI40LXQWv8UolAARKJAB0ANuoIIAOQCyN +AXV9QCyCAMd1gAAIzQCFz3GAAEjJVnrduEFhAKXxudEgIoII8kQgAgYjugHiFQqVAM9ygACIyxYi +AgFAigkKHgCeuBTwLbnAuc93gADkLPAnTxBSIE4CwRcBFgshgIMH8iiH4Qmeh5+4AKUB4z0Bj/DP +cYAA5CzwIQAAz3GAAHC7uxACBroQAwZCoWGhvBACBr0QAAZFoeB/BqHgeM9xgADkLPAhAADPcYAA +cLu+EAAGFiECAAKSGrEDkhuxCIo4GQIAANjgfx2x8cDhxc9zoACsLxmD8LgZgwDdDPIEIIAPCAAA +ANdwCAAAAAHYwHgH8IYgfw+C4AHYwHga6BmDBCCADw4AAABCIACAyiBiACEIUAAKIcAP63JkEwQA +z3AAAK4NmdshBK/xSiUAAC4Nb/dU2EQgAgIZCB4Bz3GfALj/vaEC289xgADUJmChz3GAAOhCUSBA +gACBzyBiANAgYQAAoT8IngDPcYAAREsAgTMKAADPcIAAqiMAiEChFQhRAM9xgACsQgCBCQhSAGq4 +AKEB2c9wgABQKzIN7/0gqB0Aj/DgeOB+4HjPcYAAaEVcGcAHnbieuM9xoADIHA2h4HjgeOB44Hjg +eOB44HjgeOB+8cAg289yoADIH3CiQxoYAADYyg/v/424caLRwOB+4HjxwFYPT/ChwQh2KHXPcKAA +LCAwgM9wgABIQiCgxg/v/zLYi3EGDG/xyXAAFAAxpHgQdQHYwHiNB2/wocDxwM9yoAAsIEASBABA +EgUADwnfAgQgvo8ABgAAIPJBCR8Dz3EAABAnA/BAEgUAz3CgAPxEGYDsuAIlAAED9O8IQoAdCIIP +AAAQJwohwA/rcoogmgpp28UCr/GMu9HA4H7PcKAA9AfxwFcIHkMngBmAMHk4YAO4liBCBc9xoADI +Hx6hENgOoQHYFRkYgPIO7/+B2C8IHkPPcIAAEEsB2SCgA8ikEAEAmrmkGEAARguv/gHYz3GAAORF +DYEB4A2hA9nPcKAA9AcqoNHA4H7xwADZCtjPcqAAyB8eohDYDqIB2BUaGIAocAfwAdkEIIAPIAAA +AFEgAMPMISGAzCAhgBL0IQsfQM9yoAD8RB2CWYIA2dkK34IEIL6PAAYAAOb15/EtCx5Az3CAABBL +AdkgoAPIpBABAJq5pBhAALoKr/4B2M9xgADkRQ2BAeANoVEgAMMA2Ar0z3GAAGhFEIEB4BChANiY +uNHA4H7xwLINT/AIds9woAAsILCAC/AeDk/xz3APAEBCFglv9KlxHwhQAM9woADUCxiAQiAACEgg +AADfCISD5QVP8AohwA/rcs9wAADOIl7biiTDD2EBr/G4c+B48cBCDW/wAdmlwRpwz3WAAMwJWnUC +DW//i3AAFIUwARSRMAsIUSBAJRIRCw1SAB0NUgEKIcAP63LPcAAAKSWs2xkBr/FKJEAATCUAgCYB +DgCocAAWjkAAFpRADwwyJHpwjCTDryX0ABYAQQAWj0AAFoBAABYAQYUMEyQo789wgACcIgCAQCzN +ILV9EOC4YIoMb/8E2c9wgACcIgCATCFAoB1lzCdhkxr0ANiMuBfwCiHAD+tyz3AAAColt9tKJEAA +mQCv8QolAAUKIcAP63LPcAAAKyXA2/TxANgAtc9wgACcIgCAQCzBIDV5MmA4YAUiQgRAsATdB/CB +wATdGgxv/6lxACKMIwAcAhXPcIAA5CzwIAAEHt/AEAIGLymBAAInQBAk6jJoz3OAAE/JNnkrYxML +jgMAJoEfgAAw0RZ5ABkCBQAtgRMLIcCACfIAJoEfgAAw0RZ5BBkCBRAiAoAvKYEAAidAEOD1QiNA +IIDg5gbN/y4LD/UhBG/wpcDgfuB44H7geOB+4HjgfuB44H7geOB/AdjgfuB44H7geOB+4HjgfuB4 +4H7geOB+4HjxwKoLT/AIds91oADAL6MVAJb5CB6BB8hAHRiQDcgPCJEBMg8v/8lwa/DPd4AAQNYK +jwnoQCeAEkAmgRIKDW/9CtrPcKAA1AsYgEIgAAhIIAAAsOCoDeX/yiAlDAPIA5AluMC4F7jHcAAO +AABFIAEL7HAgoAESATbscCCgIIbscCCgIYbscCCgIobscCCgI4bscCCgJIbscCCgJYbscCCgJobs +cCCgJ4bscCCgKIbscCCgoxUAlv8IHoEHyAQggA8BAADwLLiU4MAghg8AAJMAz3GgAGgs8CEBAM9w +gAAUSwCAcgov9SV4Co8J6M9xgADQRReRAeAQeBexANgKrxUDT/DgeKHB8cCWCk/wosFJwTpwSHUa +cwoiACFpCV4CAtnPcKAAyB9JGFiAKcFTbe7hUHgG9GIO7/OLcRrwEQnRDRt4EHhSDu/zi3ER8AkJ +EQUceArwCwmRAgAchDAG8M9wAAD//wAcBDDgeADYz3KpAKT/uaIAFAExgrg3ohqiSvBdCR4CTCIA +oNEh4qFC9M9ypQCs/89wgADkLLiiBIBWEAABFOACIAMgA+Miu3hjeGBIIEAABbhFIEADFqJBKcAh +wLh3aCnABCGBDwAAACAluWV4JXiJuI64GaIc8CnAgODKIcEPyiLBB8ogIQ7PICEDyiMhBc8jIQPK +JCEAsAVh8colwQAFvaV4z3GlAKz/FqHPcaAAyB/PdaAAtEdXFQCWAN9KJEAABCC+jwAoAADCJAIB +bxUAlgQghQ+AAAAABCCDDyAAAAAEII4PAAYAAA8MEABAEQIGCwrUAADaAvAB2vhyExEChgQgvo8A +OAAABCKGDwAAAIDMJyGAwCdhEAUjQgEFIoIBBSK+gwT0pw+Ukg0OEACA48wmIZCF8msVBJaRDBAA +iHSEJNCRC/LPcYAAcEQQgQDdAeAQoZy9WvAXDN4Az3GAAHBEEYEB4BGhQt1Q8Ih0hCQCmAjyz3GA +AORFEYEB4BGhDvATDJ4Bz3GAAORFBIEB4AShBPBTJD6DBPIA3TjwFwxeA3IJj/3PcYAAYEYFgQHg +BaH08QohwA/rcm8VBZZE2Iy46duFBG/xjLsI689xgABoRRCBAeAQoeLxKO4ZCJ4Gz3KAAORFL4IA +3QHhL6KRvQvwHQheBs9ygADkRTKCQt0B4TKiLgnv/4hxmL1F8HEVBJZvFQWWCiHAD+tyOdjPcwAA +AhElBG/xjLjqCI/9z3GAAGhFEYEB4BGhsPETEQCG8LjKICEAZAjh/88goQNrFQGWWBUAlgsgQIAc +8m8VAJbPdaAA9AdTIECAAdgM8gml4HgA2Amlz3GAAGBGCIEB4Aihngxv/gHYA9gKpQXdmL0D8ADd +l+0XCd4hHQoRIAHZz3CgAPQHLKAD2QXwA9nPcKAA9AcloFEhgKKADQL6F/ADEgE2z3CAAEDSDwkA +AM9wgAAI0xsJAQCSEQABqriSGQQAnhEAAaq4nhkEAM9wgAAMCgCACOjPcoAAYDMFggJwBaLPcYAA +cEQPgQHgD6HPcIAAjK0hgM9wgADkLAOAFJAfCQEAz3CAANQkOoAbgCR4USAAgjAOYvfKIGIAqXAI +3FcHL/CiwKHB8cD2Dg/wKHUIdhpyBCG+jwEAAMBody30Lw0eEkQlABYjuCFoBCWAHwYAAAAxuDhg +BCWBHwYAAAHXcQIAAAHKIKEAAvAB2CEIUAATCJAAg+AA2Mog4QHAKKEDCvDPcIAAtLsCgAbwz3CA +ALS7AYAFfclwIg2v+qlxyXCpcQpy6XPaC+//SiRAAIDgKAjB/wjczwYP8OB4z3CkAJBBTYDPcYAA +NL5CsRqAA7EEIIAP/wAAADC4BLHPcIAANL4A2hEIXkbPcYAAIL0ygQsJngJCsEOwRLDgf1mw4Hjx +wCIOL/CYcM9wgAAgvQ6Qz3aAADS+ALbPcIAAIL1IEAUABCWPjwAAAAIA2wPyFw0eAs9xpgDo/wuB +A6YMgQSmA/BkpmOmz3WkALRFDBUClg0VAJb/2S8ghxAQuQQiSQAs7zIVAZZTIY8A/2chtv/Z9H8I +ue9/RHlALwYSACZHAAAgyBMFJwcCQC8BFgQigg8A/wAAQC8IFDpiACBIEv/ZBScHAgi5BSLCAQQg +RwD4YAAngQEleOW2T3kEIoIP/wAAACi6RXkjtg94BLYEFQCWArYjDR4CRCUABiO4AeAXCJQAz3Gm +AOj/DYEFpg6BBqYD8GamZaYA2kokgHAG2Y25qCAAAynYErjwIEMAQCYAH1V4AeFgoAHiz3CAACC9 +AJA4HgARVSZBFBq2z3CAAAy+Qg8v/QjaGxUAls9xpQDYyxmmHBUAlhqmHRUAlhumDoEcpg+BHaYm +FQCWHqbPcKQAkH8cgCUFL/AfpuB44cXPdYAANL4JpSqleLVLpQHYGbXgf8HFSiQAegDZqCCAAgDa +z3CAADS+NXhAoAHh4H7geADZIKDgfyGgBAAAAABAAQAAAAAAqBJDdQEGAAEAAAAAAAAAAJhGgAAs +R4AAAIaAAGgrgAAsDIAAbCDAEA8bCSLcHcAQCgAbQBAAG24eAABhCgAbQeQdwBEAAAokAAAKJQEA +Cib+BQpkQAAbcAIAAGEIAF9wBQAAYSAAG3AHAABhCABfbgEAAGEEAABheEaAgQAAwBYBABsmAADA +FwEACiQAAAolDwpjIggAX3AKAABhDxwdIgkAHSYPXxsi0CSAgQAAwBc7AABhAAAbJQABGyRcHMAR +NwAAYdAkgIEAAMAWIAAbcDMAAGHMJICBAADAFg8bCiIPGxoiDwkbIgEAGzAAAMAX9/8MJP//DCUI +ABowBAAaJwAMGjkAAMAWDwkLIgEAG3AZAABhABsJKcQkgIEAAMAWABsJKQCACXATAABhDwoaIggA +GjAIABonAAwaOQAAwBYBABtwEQAAYQ8LCSIAGwkpxCSAgQAAwBYAGwkpDwkbIgCACW4EAABhKAAJ +JAAJGykAgBtwBQAAYcAkgIEAAMAWAAsbKMgkgIEAAMAXDwobIgQAGyYADBs5zCSAgQAAwBe4CICB +DxobIgAAGyUCABtAAAAbcVwJgIEAAMAWDxsLImAJgIEAAMAWDxsKImQJgIEAAMAWDxsIIugzgIEC +AFxuEQAAYfhBxBAPGwkiAAsJOQIACmIDAQpiBAIKYgAACUAEAABhCQAJQAIAAGEKAAlAAAAAYQIA +CUEACRooAADAFgEAGyYAAMAXBAAdJgEACCfpAAhkDyAbImQJgIEAAMAXuAiAgQ8aGyIAABslAgAb +QAAAG3EPRQAiAFwAOQcAAGIGYABiAABYOGBFwBBwRcAQeEXAEJBFwBCGAABh9B3AEAsAE2K0H8AQ +AEATbggAAGECCnloAgB5bgMAAGEIAGQxAwATJAcAAGEAABMkBQAAYQMAeWIPeRMi6B3AEQEAUiS0 +H8AQDxNSIgIAE3ADAABhCABYMAgAZDEFAABhQgQTJAgAEyUBAFJuEAATMQQowBEIAFhu2w8AYQAA +EyUAABMkJBDAEYAAEyVHaBMkBCjAEQCAEyQ4HMARDwATIgEAEzAEKMARD3MTIoIBEzAEKMARD3QT +IgICEzAEKMARDxQVIgEAFSYPchMiCADMEQ9EACIKAABAAEAAcA4AAGEAABMlAgATJOwcwBEPdhMi +GAjKEQkAE0AcCMoRCQATQCAIyhEPeBMiBADKEQAAASQAAAElBgAAYQ92EyIsSMcRD3gTIgAAxhED +AAEkAAABJQAAEyXCLBMkBCjAEQJGEyQEKMARwl8TJAQowBEPRQAiAFwAOSwAAGQAABMkAQATJTgc +wBEPdxMi4BzAEQIAAWIPARMiBAjAEUQJwBIEKMARDxMCIkgJwBIEKMARDxMHIkwJwBIEKMARDxME +IgIAcXAHAABh/wATJQIQEyQEKMARAAATJQAAEyTISccRBgAAYQAAEyUCEBMkBCjAEQAAEyVJABMk +yEnHEQ9wEyIBABMwBCjAEQMAEyQAABMlBAjAEQAAEyQ4RcARUAnAEhgowBEPEwMiBAAAYQAAWDgA +ABMkAQATJTgcwBEAABUkAAAAITAJgIEAAMAWDxtQIjQJgIEAAMAWDxsaIjgJgIEAAMAWDxsZIjwJ +gIEAAMAWAAAAhSwJgIEAAMAWDxsEIhwEG2YbARtoFBzAEAoAG0AEABtuCwAAYQ8cHSIBAB0m+Q8A +YUAJgIEAAMAWBQAbYrgIgIEPGhsiAAAbJQIAG0AAABtxZAwAEADABhEBAAQn/AAEZAAAGyQCABsl +OBzAEbgIgIEPGhsiAAAbJQIAG0AAABtxAAAbJUAAGyQwHMARuAiAgQ8aGyIAABslAgAbQAAAG3GQ +RcAQD2QBIgoAAUAIAAFwKQAAYQAAASQIAAElDwFjIggAWG4GAABhJBDAEAEAE24CAABhAAJcMQEA +AGEAIFgwaAlAEv//E279DwBhAUITJAAAEyUEKMARaAlAEv//E279DwBhQgQTJBgAEyUEKMARYEXA +EHBFwBADAH1iAgATJAAAEyXoHcAR+P9MMwEATDEBAFIkbAlAEv//E24DAABhJBDAEAEAE3ACAABh +AAAVJAAAACEkAABhAgATJOQdwBH0HcAQEQATYrQfwBAAQBNuDgAAYQYKfWgCABMk4B3AEQAAEyQB +AH1uAQATJAwAAGEBAH1wAwAAYQgAZDEDABMkBwAAYQEAEyQFAABhAwB9Yg99EyLoHcARAQBSJLQf +wBACABNwAgAAYQgAZDEAAAAhDxNSIkIEEyQIABMlAQBSbhAAEzEEKMARyAmAgQAAwBYCARNkQgET +JAQowBEQS4CBAADAFgYBE2IECMAQBAATZA9cACIKAABAAAYAcBkAAGEAABMkAAATJQAAwBcACFgw +yCDAEHBFwBAQCMAQAAATJQMAEyQcCMARHAjAEQAAEyQECMARDxQVIgQAFSb7/zAyAwATJBgIwBEP +FBUiAgAVJgQAMDAAABMkEEXAERgIwBEAEFgwD3wTIggAzBEAABMlAAATJDRIxxEPexMiAQATMAQo +wBEPFBUiAgAVJv8AEyUCEBMkBCjAEQ8UFSICABUmvAqAgQAAwBbCLBMkBCjAEQJGEyQEKMARwl8T +JAQowBEPTRMiBBDFEQIAEyTwHMARAQATJOwcwBEAABMkcAATJRAcwBEAABMlAAATJOAcwBGAABMl +RmgTJAQowBEAABMlAQATJCQQwBEAABUkAAAAIQ8OGiIAAEAWAAEbcA0AAGGAAGMk//4bMgAAQBcA +ABslDxsPIpwJgIH/ABsyAgAbQQAbGigAAMAWAAAbJQIAG0AAABtxAQBkcAcAAGEBAGMkAAAbJH4J +gIEAAEAXdAmAgQAAQBbtDwBhAgBkcBAAAGECAGMkAQAbJH4JgIEAAEAXdgmAgQAAQBbkDwBhBABk +cAcAAGECAGMkAgAbJH4JgIEAAEAXeAmAgQAAQBbbDwBhAAAdJAAAACEAAg9uCQAAYX4JgIEAAEAW +AAAbJXoJgIEAGxooAAAAFgEAGyYAAAAXDQAAYZQJgIEAAEAWAgAbJgEQG2gAABskAABAF4AJgIEA +GhsoDxsOIpgJgIEAAEAWAQAbJgAAQBcACICBDxobIgAAGyUCABtAAAAbcQAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgBIAAuAGAAAAAAAAAAAAA +KACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAHAAAABwAAAAAAAAAHAAAACQ0RFAoNExcZGRkZCQkAAOibgABQfAAA +0KCAAAAAAADQoIAAAAAAAN8AAAAZAQAAYgEAAL4BAAAyAgAAwwIAAHsDAABiBAAAhAUAAPIGAAC+ +CAAAAgsAAAEAAAAAAAAAMIAAAAAAAAAxgAAAiIgzMzKAAAAAqqqKM4AAAAAAAAA0gAAAAAAAADWA +AAAAAAAANoAAAAAAAAA3gAAAAAAAADiAAAAAAAAAOYAAAAAAAAA6gAAAAAAAADuAAAAAAAAAPIAA +AAAAAAA9gAAAqqoKAD6AAABThYiIP4AAAAAAADAwgAAAAAAAADGAAACamVhVMoAAAACqqqozgAAA +AAAAADSAAAAAAAAANYAAAAAAAAA2gAAAAAAAADeAAAAAAAAAOIAAAAAAAAA5gAAAAAAAADqAAAAA +AAAAO4AAAAAAAAA8gAAAAAAAAD2AAACqqgoAPoAAAFWYmao/gAAAAAAAUDCAAAAAAAAAMYAAAAAA +AAAygAAAAAAAADOAAAAAAAAANIAAAAAAAAA1gAAAAAAAADaAAAAAAAAAN4AAAAAAAAA4gAAAAAAA +ADmAAAAAAAAAOoAAAAAAAAA7gAAAAAAAADyAAAAAAAAAPYAAAAAAAAA+gAAAAAAAAD+AAAAAAAAA +MIAAAAAAAAAxgAAAAAAAADKAAAAAAAAAM4AAAAAAAAA0gAAAmnkAADWAAACqqqqqNoAAAAAAAAA3 +gAAAAAAAADiAAAAAAAAAOYAAAAAAAAA6gAAAqqqqCjuAAAAAcJmqPIAAAAAAAAA9gAAAAAAAAD6A +AAAAAAAAP4AAAAAAAAD//wAApQEBALkB3wA7Ai0AsQAbABYBGwCvABsAFAEbAGwAoADRAKAAbwCD +AHEAgwBzADMA1AEGANABAAB4AEkAeQBqAN4AagCoAAAADQEAAKYAPwCnAAEACwE/AAwBAQAEAAgA +nAHMAJ0BzADVAcwA1gHMALQAIAAZASAAjwCIAPQAiACQACIA9QAiAJEABAD2AAQAhQAAAIYAAACH +AFUAiAAAAIkAqgCKAAAAiwDdAIwAAACFAAEAhgABAIcAVQCIAAAAiQCqAIoAAACLAN0AjAAAAIUA +AgCGAAMAhwBVAIgAAACJAKoAigAAAIsA3QCMAAAAhQADAIYABwCHAFUAiAAAAIkAqgCKAAAAiwDd +AIwAAAD7/wAA//8AALkB3wA7Ai0AsQAbABYBGwCvABsAFAEbAGwAoADRAKAAbwCDAHEAgwBzADMA +1AEGANABAAB4AEkAeQBqAN4AagCoAAAADQEAAKYAPwCnAAEACwE/AAwBAQAEAAgAnAHMAJ0BzADV +AcwA1gHMALQAIAAZASAAjwCIAPQAiACQACIA9QAiAJEABAD2AAQAqAAMAA0BDACFAAAAhgAAAIcA +mQCIAAAAiQCqAIoAAACLAN0AjAAAAIUAAQCGAAEAhwCZAIgAAACJAKoAigAAAIsA3QCMAAAAhQAC +AIYAAwCHAJkAiAAAAIkAqgCKAAAAiwDdAIwAAACFAAMAhgAHAIcAmQCIAAAAiQCqAIoAAACLAN0A +jAAAAPv/AAD//wAAuQHfALEAGwAWARsArwAbABQBGwBsAKAA0QCgAG8AgwBxAIMAdgCDAHMAMwBu +ADMAcAAzAHIAMwDXADMA1AEGANABAAB+ADwA4wA8AHgASQDdAEkAfwBaAOQAWgCqAD8AqwABAA8B +PwAQAQEAeQBqAN4AagCoAAAADQEAAKYANwCnAAEACwE3AAwBAQAEAAgAnAHMAJ0BzADVAcwA1gHM +ALQAIAAZASAAMQIMADICDAAzAr0ANgIMADcCDAA4Ar0AoACIAAUBiAChANUABgHVAKIABAAHAQQA +jwCIAPQAiACQACIA9QAiAJEABAD2AAQAnwAMAPsADACUAAAAlQAAAJwAlwCdANAAmgCNAJgAEQCW +ADMAlwB3AJQAAQCVAAEAnACXAJ0A0ACaAI0AmAARAJYAMwCXAHcAlAACAJUAAwCcAJcAnQDQAJoA +jQCYABEAlgAzAJcAdwCUAAMAlQAHAJwAlwCdANAAmgCNAJgAEQCWADMAlwB3APoAAAD5AAAAAgGX +AAMB0AAAAY0A/gARAPwAMwD9AHcA+gABAPkAAQACAZcAAwHQAAABjQD+ABEA/AAzAP0AdwD6AAIA ++QADAAIBlwADAdAAAAGNAP4AEQD8ADMA/QB3APoAAwD5AAcAAgGXAAMB0AAAAY0A/gARAPwAMwD9 +AHcAhQAAAIYAAACHAFUAiAAAAIkApwCKAAAAiwDeAIwAAACFAAEAhgABAIcAVQCIAAAAiQCnAIoA +AACLAN4AjAAAAIUAAgCGAAMAhwBVAIgAAACJAKcAigAAAIsA3gCMAAAAhQADAIYABwCHAFUAiAAA +AIkApwCKAAAAiwDeAIwAAADrAAAA6gAAAOwAVQDtAAAA7gCnAO8AAADwAN4A8QAAAOsAAQDqAAEA +7ABVAO0AAADuAKcA7wAAAPAA3gDxAAAA6wACAOoAAwDsAFUA7QAAAO4ApwDvAAAA8ADeAPEAAADr +AAMA6gAHAOwAVQDtAAAA7gCnAO8AAADwAN4A8QAAAKQBgAChAUAA+/8AAP//AAClAQEAuQHfALEA +GwAWARsArwAbABQBGwBsAKAA0QCgAG8AgwBxAIMAdgCDAHMAMwBuADMAcAAzAHIAMwDXADMA1AEG +ANABAAB+ADwA4wA8AHgASQDdAEkAfwBaAOQAWgCqAD8AqwABAA8BPwAQAQEAeQBqAN4AagCoAAAA +DQEAAKYANwCnAAEACwE3AAwBAQAEAAgAnAHMAJ0BzADVAcwA1gHMALQAIAAZASAAMQIMADICDAAz +Ar0ANgIMADcCDAA4Ar0AoACIAAUBiAChANUABgHVAKIABAAHAQQAjwCIAPQAiACQACIA9QAiAJEA +BAD2AAQAnwAMAPsADACUAAAAlQAAAJwAlwCdANAAmgCNAJgAEQCWADMAlwB3AJQAAQCVAAEAnACX +AJ0A0ACaAI0AmAARAJYAMwCXAHcAlAACAJUAAwCcAJcAnQDQAJoAjQCYABEAlgAzAJcAdwCUAAMA +lQAHAJwAlwCdANAAmgCNAJgAEQCWADMAlwB3APoAAAD5AAAAAgGXAAMB0AAAAY0A/gARAPwAMwD9 +AHcA+gABAPkAAQACAZcAAwHQAAABjQD+ABEA/AAzAP0AdwD6AAIA+QADAAIBlwADAdAAAAGNAP4A +EQD8ADMA/QB3APoAAwD5AAcAAgGXAAMB0AAAAY0A/gARAPwAMwD9AHcAhQAAAIYAAACHAFUAiAAA +AIkApwCKAAAAiwDeAIwAAACFAAEAhgABAIcAVQCIAAAAiQCnAIoAAACLAN4AjAAAAIUAAgCGAAMA +hwBVAIgAAACJAKcAigAAAIsA3gCMAAAAhQADAIYABwCHAFUAiAAAAIkApwCKAAAAiwDeAIwAAADr +AAAA6gAAAOwAVQDtAAAA7gCnAO8AAADwAN4A8QAAAOsAAQDqAAEA7ABVAO0AAADuAKcA7wAAAPAA +3gDxAAAA6wACAOoAAwDsAFUA7QAAAO4ApwDvAAAA8ADeAPEAAADrAAMA6gAHAOwAVQDtAAAA7gCn +AO8AAADwAN4A8QAAAKQBgAChAUAA+/8AAAAAAAACAAAADdIS0hPSFNIM0hXSC9IC0hHSBEMAEBQQ +CRAREAFAG9Ic0gDSCgALAAQADgC1ABoBDwBCALwAwwAhASgBtgC3ALgAuQC9AL4AvwDAABsBHAEd +AR4BIgEjASQBJQEKAAAACwAAALYAAAC3AAAAuAAAALkAAAAbAQAAHAEAAB0BAAAeAQAAvQAAAL4A +AAC/AAAAwAAAACIBAAAjAQAAJAEAACUBAAAS0gAAE9IAAAAAAQACAAMALABkAHQAgACMAKEABwAA +AAAAAQACAAMAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +BwAAAAcAAAAAAAAAAwAAAAQAAAADAAAAAAAAAP8DAAADAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAA +AAAAAAAAACwAAQAAAAEAAQABAAAAAAAAAAAAAQABAAIAAgACAAMAAwAEAAQABQAFAAYABgAHAAcA +CAAIAAkACQAKAAoACwALAAwADAANAA0ADgAOAA8AAAABAAIAAAAL0g7SDdII0gnSCtIS0hPSFNIR +0hDSAtIB0gPSAIAF0gRDG9Ic0gTSAEUw0jHSAAC1ABoBgQEFAAQADwAQAAoACwAMAE4AAAAAAAEA +AgAAAA3SEdIQ0gLSAdID0hvSC9IAgAXSEtIT0hTSBEMI0gnSCtIc0gbSB9Jw0gAAtQAaAYEBBAAP +AIMA6ABOAZIA9wBdAQYACAAJAAoACwAMAAUAAAAAAAAAAAAKAAAAAQAAAAAAAAAAAAAAAAAAAAMA +AAAEAAAAAwAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAP8DAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAALAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAAABNIN0hHSENIC0gHS +A9Ib0gCABdIL0hLSE9IU0gRDcNIAAAAAAQAAAAEAAAABAAAAAQAAAAMAAAACAAAAAwAAAAMAAAAA +AAAAAQAAAAAAAAAAAAAAAAAAAP8DAAAAAAAAtQAaAYEBBAAPAAYACAAJAAoACwAMAAAAAAAAAAAA +LAABABUAFQAVAAEAAQABAAAAAAABAAIAAAAc0g3SEdIQ0gLSAdID0hvSC9IAgAXSEtIT0hTSBEMG +0gfSBNJw0gAAtQAaAYEBBQAEAAYACAAJAAoACwAMAIMAkgDoAPcATgFdAQ8AAAAAALcTIgC4FCMA +uRUkALsWJQC8FyYAvRgnAMAZKADEGikABxsAAAgcAQALHQIADB4DABAfBAAiIQUAJCIGACYjBwAo +JAgAKiUJACwmCgAuJwsAMCgMADQpDQA4Kg4APCsPAEAsEABkLhEAaC8SAGwwEwBwMRQAdDIVAHgz +FgB8NBcAgDUYAIQ2GQCINxoAjDgbAJE6HACVOx0AmTweAJ09HwChPiAApT8hACRJBgIsSgoCNEsN +ATxMDwFkTREBbE4TAXRPFQF8UBcBhFEZAZVSHQGdUx8BAQQAAAIFAQADBgIABAcDAAUIBAAGCQUA +BwoGAAgLBwAJDAgACg0JAAsOCgAMDwsADRAMAA4RDQABQAAEAkEBBANCAgQEQwMEBUQEBAZFBQQH +RgYECEcHBAlICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgACAAMABAAEAAUABgAGAAcACAAIAAkACgAK +AAsADAAMAA0ADgAOAA8AJgAnACgAKQAqAEYARgBHAEgASABJAEoASgBLAEwAaABpAGoAagBrAGwA +bABtAG4AbgBvAHAAcABxAHIAcgBzAHMAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0 +AHQAdAAKAD8AAAAAAAAAAAAAAAAAAAAAAAEAAQACAAMAAwAEAAUABQAGAAcABwAIAAkACQAKAAsA +CwAMAAwADQAOACMAJAAlACYAJwAoACkARABFAEYARgBHAEcASABIAEkASQBKAEsAaABoAGkAagBr +AGwAbQBtAG4AbwBvAHAAcQBxAHIAcgBzAHMAcwBzAHMAcwBzAHMAcwBzAHMAcwBzAHMAcwBzAHMA +cwAKAD8AAAAAAAAAAAAAAAAAAAAAAAEAAgACAAMABAAEAAUABgAGAAcACAAIAAkACgAKAAsADAAM +AA0ADgAOAA8AJgAnACgAKQAqAEYARgBHAEgASABJAEoASgBLAEwAaABpAGoAagBrAGwAbABtAG4A +bgBvAHAAcABxAHIAcgBzAHMAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAAK +AD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAIAAwADAAQABQAFAAYABwAHAAgACQAJAAoA +CgALACQAJQAlACYAJwAoACgARABFAEYARgBHAEgASABJAEoASgBLAEwAaABoAGkAagBrAGwAbQBt +AG4AbwBvAHAAcQBxAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgAKAD8A +gGOAAAAAAACyDMgA/////////wAB//8CA////wT//////////////////////wX/Bv8H/wj/Cf8K +/wv/DP///w3///8O////D////xD//////////////////////////////////////////////xH/ +//8S////E////xT///8V////Fv///xf///8Y////Gf///xr///8b/////xz///8d////Hv///x// +//8g////If//////////////////////IiMk/yUmJ///KP///yn///////////////////////// +/////////////////////////////////////////////////////wABAAEBAAAAAAAAAAABAAAA +AAAAAAAAAAAAAAADAAAAAAAAAAEAAAAAAAAAsBsBAAAAAACwdAAAAQAAAMSqAQACAAAAOKoBAAMA +AAB89QEABAAAALAbAQAFAAAANAkBAAYAAABI4gAABwAAALwJAQAIAAAAbC4AAAkAAADETgAACgAA +AIDEAAALAAAAvCsAAAwAAACA9QEADQAAAOjaAAAOAAAAlNsAAA8AAAB02gAAEAAAAHTbAAARAAAA +rCcBABIAAAA0wQEAEwAAABgkAAAUAAAA1E4BABUAAAAYOwEAFgAAABhKAQAXAAAAeKkBABgAAAD0 +dQEAGQAAAMD7AAAaAAAArBsBABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////wAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA5JQAAOSUAADklAAAfIIAAOSUAADklAAA4IIAAOSUAADklAAA5JQAAOSUAADklAAA +5JQAAOSUAADklAAA5JQAADCKAAB4iQAAaIkAAOCIAACgiQAAnIgAAOSUAADklAAAMIwAAACPAACs +kAAA5JQAAOSUAADklAAATJQAAEiLAACAiwAA7IoAAOSUAADklAAA5JQAAAiUAADklAAAzIoAAOSU +AADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQA +AOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA +5JQAAOSUAADklAAAoIMAAOSUAADklAAA5JQAAOSUAADklAAAbJEAAOSUAADklAAA5JQAAOSUAADk +lAAAfIYAAOSUAACMhgAAiIYAAICGAACEhgAAaIAAAOSUAAA8gAAA5JQAAOSUAADklAAA5JQAAOSU +AADklAAA5JQAAOSUAADIfwAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQA +AOSUAADUhAAAcIQAAOSUAADwhAAA5JQAAMCDAABgiAAA5JQAAOSUAABQigAA5JQAAOSUAADklAAA +5JQAAOSUAACcigAAgIoAAOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADk +lAAAkIYAAOSUAADklAAA5JQAAGiRAADklAAA5JQAAOSUAACgkwAA5JQAAACUAAAIkQAA5JQAAOSU +AACwfgAAyJAAAOSUAADklAAA6IgAAACJAADklAAA5JQAADiGAACsgAAA5JQAAOSUAADklAAAiIsA +AISIAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADEhwAA5JQAAAyVAACYlQAAeJUAALCVAABElQAA +LJUAALiVAAAIlQAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAABAhgAA5JQAAOSUAADk +lAAA5JQAAOSUAADklAAA5JQAAEiWAABUlwAAyH4AADx/AADklAAA5JQAAOSUAADklAAA5JQAANyA +AADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQA +AOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA5JQAAOSUAADklAAA +4IAAAMyBAABsgQAAvJUAAFR/AABUggAA7IIAAOSUAADklAAA5JQAAOSUAADYggAA3IIAAOSUAADk +lAAAgIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFijAACgoQAAvKQAAMijAADQpQAAAAABAP////8AAAAA//// +//////8BAAAAkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAADQ/gAAAAAAAAAA +AAAAABggoAAgIKAAQCGgAEghoAAcIKAAJCCgAEQhoABMIaAAKCCgADAgoABoIaAAcCGgACwgoAA0 +IKAAbCGgAHQhoAA4IKAAPCCgAHghoAB8IaAASA8AAAD/AwDoDwAAAP8FAIwPAAAA/y0AaA8AAAD/ +PQAEDwAAAP8EACwPAAAA/yUARMUAAAD/3QCwDwAAEBBMAAAAAAAAAAAAAAEBADw8PDw8PDw8PDw8 +PDw8PDw8PDw8PDw8PDw8PDw8PDw8FRUVFTw8PDwVFRUVPDw8PAAAAAAAAAAAAAAAAAAAAAA8PDw8 +PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PBUVFRU8PDw8FRUVFTw8PDwAAAAAAAAAAAAAAAAA +AAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwVFRUVPDw8PBUVFRU8PDw8AAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAA6BEAAGwYAAAwFQAAwBIAACQaAAAgFgAAcBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQKgAB4oYAAGAAAADihgAAAAAAA +AAAAAAAAAAAAAAAAPPkAAJSwAACEIQAAlLAAAJSwAACUsAAAOAoAAFC5AQBEzwAAlLAAAJSwAABc +JwAAXCcAAFwnAABcJwAAXCcAAFwnAABcJwAAlLAAAJSwAACUsAAAlLAAAJxFAACUsAAAlLAAAJSw +AACUsAAAlLAAACjPAACUsAAAlLAAAITEAAAAAAAA+OQAAPzkAAC0AgAAoAIAAMAmAQAUvQAADJcB +ADy9AAA0lwEAYL0AAFyXAQCAQYAAZJaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIHwAA +EB8AAHykgAAAAgAAAAAAANzxAACs8QAAfKaAAEAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg +8QAAnCMBAAytgABUAAAAAAAAANzxAABwIgEAvKuAAFABAAAAAAAA3PEAAHgdAQCoCoAACAAAAAEA +AADc8QAAqPAAAAAAAABQAQAAAAAAANzxAAAEHgEAGDqAAAIAAAAAAAAA3PEAABAdAQCkCoAABAAA +AAAAAADk8QAArPEAAGCtgAAqAAAAAAAAANzxAACs8QAAkEaAAAQAAAAAAAAAAAAAALTxAAAAAAAA +AAAAAAEAAAAAAAAAyPEAAAAAAAAAAAAAAAAAAAAAAACw8QAAAAAAAAAAAAAAAAAA3PEAAACZAQAA +AAAAAAAAAAAAAADc8QAAwJgBALAKgAAEAAAAAAAAAG4AbgBpAMAAoABQAIAAvgBQAX0APgAAAAAA +AACcAgQA5gElAFUDBADcAWMAAABuAG4AaQDAAKAAUACAAL4AUAF9AD4AAAAAAAAAnAIEAOYBJQBV +AwQA3AFjAAAAAAAAAAEBAACE+AAAFdIAAAAAAAD/AwAAhPgAAAzSAAAAAAAA/wEAAIT4AAAV0gAA +CgAAAAD8DwCE+AAADNIAAAkAAAAA/gMAhPgAABXSAAAUAAAAAADwP4T4AAAM0gAAEgAAAAAA/AeE ++AAABtIAAAAAAAD/AQAAhPgAAAfSAAAAAAAA/wMAAIT4AAAG0gAACQAAAAD+AwCE+AAAB9IAAAoA +AAAA/A8AhPgAAAbSAAASAAAAAAD8B4T4AAAH0gAAFAAAAAAA8D8AAAAAAAAAAAAAAAABAAAAAQAA +AAoAAAAFAAAABQAAAAYAAAAKAAAACgAAAAYAAAAEAAAABQAAAAYAAAAFAAAABQAAAAYAAAAGAAAA +BgAAAAYAAAAHAAAABwAAAAcAAAAIAAAACAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAC +AAAAAQAAAAIAAAABAAAAAQAAAAMAAAADAAAAAgAAAAEAAAAEAAAAAAAAAAAAAAACAAAAAQAAAAEA +AAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAsAQAA +XgEAAAEAAAABAAAAAQAAAAEAAAADAAAAAAAAAAAAAABcAwEAwAcBALAGAQAsCAEAvAcBAPQFAQAo +CAEAhAQBAIAEAQBg4xYAINYTAAAAAAAQAAAAAIAAAAAAoAAQJwAA6AMAAOgDAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAIAAAACAAAAAQAAAAEAAAACAAAABQAAAAIAAAACAAAABQAAAAIAAAACAAAA +AQAAAAEAAAAFAAAABQAAAAIAAAAFAAAABQAAAAAAAAAFAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAF +AAAABQAAAAAAAAAFAAAAAgAAAAIAAAAFAAAABQAAAAUAAAAAAAAABQAAAAIAAAAFAAAAAQAAAAEA +AAACAAAAAgAAAAIAAAAFAAAABQAAAAIAAAAFAAAAAQAAAAEAAAACAAAAAgAAAAIAAAAFAAAABQAA +AAIAAAACAAAABQAAAAEAAAACAAAABQAAAAIAAAAFAAAABQAAAAQAAAAFAAAABQAAAAEAAAAFAAAA +BQAAAAUAAAACAAAAAgAAAAUAAAAFAAAABQAAAAEAAAAFAAAABQAAAAUAAAACAAAAAgAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAARAAAQAAAAKAAAFCAAYC +EAACIAAAA8AAAUMABgMQAALAAAADwAABQwAGBBAAAkAAAAKAAAFEAAYFEQAAQAAAA8AAAUUABgYR +AADgAAADwAABRQAGBxEAAQAAAAKAAAFGAAYIEQACIAAAA8AAAUcABgkRAALAAAADwAABRwAGChEA +AkAAAAKAAAFIAAYLEgAAQAAAA8AAAUkABgwSAADgAAADwAABSQAGDRIAAQAAAAKAAAFKAAYOEgAC +AAAAAoAAAUwABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAECAQEAAgEAAQICAgABAQACAQIBAgACAAECA4CAgICAgICAAYACgICA +gIDAAJAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAjAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy1AQAV +AAAAAwAAAExKgAAAAAAAAAAAAAAAAADgtAEABQAAAAMAAABMSoAAAAAAAAAAAAAAAAAA1LQBAAoA +AAADAAAATEqAAAAAAAAAAAAAAAAAALCyAQAKAAAAAAAAAGxKgAAAAAAAAAAAAAAAAADwswEACgAA +AAAAAABsSoAAAAAAAAAAAAAAAAAA8LMBAAoAAAAAAAAAbEqAAAAAAAAAAAAAAAAAAPCzAQAKAAAA +AAAAAGxKgAAAAAAAAAAAAAAAAADwswEACgAAAAAAAABsSoAAAAAAAAAAAAAAAAAA8LMBAAoAAAAA +AAAAbEqAAAAAAAAAAAAAAAAAAPCzAQAKAAAAAAAAAGxKgAAAAAAAAAAAAAAAAADwswEACgAAAAAA +AABsSoAAAAAAAAAAAAAAAAAA8LMBAAoAAAAAAAAAbEqAAAAAAAAAAAAAAAAAAPCzAQAKAAAAAAAA +AGxKgAAAAAAAAAAAAAAAAADwswEACgAAAAAAAABsSoAAAAAAAAAAAAAAAAAA8LMBAAoAAAAAAAAA +bEqAAAAAAAAAAAAAAAAAAPCzAQAKAAAAAAAAAGxKgAAAAAAAAAAAAAAAAAB0tgEABgAAAAAAAABs +SoAAAAAAAAAAAAAAAAAA3LUBAAUAAAADAAAATEqAAAAAAAAAAAAAAAAAAAiyAQAKAAAAAAAAAGxK +gAAAAAAAAAAAAAAAAAB4sgEACgAAAAAAAABsSoAAAAAAAAAAAAAAAAAA4L8BAAoAAAADAAAATEqA +AAAAAAAAAAAAAAAAAMyyAQAKAAAAAAAAAGxKgAAAAAAAAAAAAAAAAAB0swEACgAAAAAAAABsSoAA +AAAAAAAAAAAAAAAA9LMBAAoAAAAAAAAAbEqAAAAAAAAAAAAAAAAAAHS0AQAKAAAAAAAAAGxKgAAA +AAAAAAAAAAAAAABAtQEACgAAAAAAAABsSoAAAAAAAAAAAAAAAAAAsLUBAAoAAAAAAAAAbEqAAAAA +AAAAAAAAAAAAAAAAAABMSoAATEqAALggoABsIKAAAIABAP9//P8AAAAAAAAAAGxKgABsSoAApCCg +ADggoAABAAAA/P///wAAAAAAAAAAjEqAAIxKgACoIKAAPCCgABAAAADH////AAAAAAAAAACsSoAA +rEqAAKwgoAB4IaAAQAEAAD/+//8AAAAAAAAAAMxKgADMSoAAsCCgAHwhoAAADAAA//H//wAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAMSyAQAVAAAAAwAAAExKgAAAAAAAAAAAAAAAAABUCoAAeKGAABgA +AAA4oYAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAADgAAABoAAAAdAAA +AIAAAACMAAAAnQAAAAcAAAAAAAAA/////wAAAAAtAQAA3QEAAFoCAAC6AgAACgMAAE0DAACHAwAA +ugMAAOgDAAARBAAANwQAAFkEAAB6BAAAmAQAALQEAADOBAAA5wQAAP4EAAAVBQAAKgUAAD4FAABR +BQAAZAUAAHUFAACGBQAAlwUAAKcFAAC2BQAAxQUAANMFAADhBQAA7gUAAPsFAAAIBgAAFAYAACAG +AAArBgAANwYAAEIGAABMBgAAVwYAAGEGAABrBgAAdQYAAH4GAACIBgAAkQYAAJoGAACiBgAAqwYA +ALQGAAC8BgAAxAYAAMwGAADUBgAA2wYAAOMGAADqBgAA8gYAAPkGAAAABwAABwcAAA4HAAAUBwAA +GwcAACIHAAAoBwAALgcAADUHAAA7BwAAQQcAAEcHAABNBwAAUwcAAFgHAABeBwAAZAcAAGkHAABv +BwAAdAcAAHkHAAB/BwAAhAcAAIkHAACOBwAAkwcAAJgHAACdBwAAogcAAKcHAACrBwAAsAcAALUH +AAC5BwAAvgcAAMIHAADHBwAAywcAANAHAADUBwAA2AcAANwHAADhBwAA5QcAAOkHAADtBwAA8QcA +APUHAAD5BwAA/QcAAAEIAAAFCAAACAgAAAwIAAAQCAAAFAgAABcIAAAbCAAAHwgAACIIAAAmCAAA +KQgAAC0IAAAwCAAANAgAADcIAAA7CAAAPggAAEEIAABFCAAASAgAAEsIAABPCAAAUggAAFUIAABY +CAAAWwgAAF8IAABiCAAAZQgAAGgIAABrCAAAbggAAHEIAAB0CAAAdwgAAHoIAAB9CAAAgAgAAIII +AACFCAAAiAgAAIsIAACOCAAAkQgAAJMIAACWCAAAmQgAAAAAAAABAAAAAAAAAAcAAAAAAAAAAAAA +AAAAAAAAAQIDBAQEBAQFBgcICAgICAkKCwwNAABuO2g7YjtcO246aDpiOlw6bjloOWI5XDluOGg4 +YjhcOG43aDdiN1w3biloKWIpXCluKGgoYihcKG4naCdiJ1wnbhloGWIZXBluGGgYYhhcGG4XaBdi +F1wXbhZoFmIWXBZuFWgVYhVcFW4UaBRiFFwUbhNoE2ITXBNuEmgSYhJcEm4RaBFiEVwRbhBoEGIQ +XBBuAmgCYgJcAm4BaAFiAVwBbgBoAGIAXABUAAAAbjtoO2I7XDtuOmg6YjpcOm45aDliOVw5bito +K2IrXCtuKmgqYipcKm4paCliKVwpbihoKGIoXChuJ2gnYidcJ24maCZiJlwmbiVoJWIlXCVuJGgk +YiRcJG4jaCNiI1wjbiJoImIiXCJuIWghYiFcIW4gaCBiIFwgbhJoEmISXBJuEWgRYhFcEW4QaBBi +EFwQVxBSEE0QSRBuAWgBYgFcAW4AaABiAFwAVAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAIMAAACSAAAAgwAAAJIAAADoAAAA9wAAAOgAAAD3AAAAAAAAAAkAAAAAAAAACgAA +ADgAAABoAAAAdAAAAIAAAACMAAAAnQAAAAcAAAAAAAAABwAAAAcAAAAHAAAAAAAAAAAAAAAAAAAA +AAAAAMREAQAIAAAAAwAAAExKgACgDIAAIA2AAKANgAAgDoAACg0RFAoNERQZGRkZCgoAAAAAAAAG +BgYGCQkJCQAGAAAABQYHCA0ODxAVFhcYGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwUmpocJJqa +mpqak5pugT81CYsrAAAAMgAAAI8AjACKAEMADwAgaDcAAAARAD46IBEAAAIlAAAMLwAAAi85OQAK +JTy3R2+KAAcUJ2IuAAACABcAAAUQCiAwQAAABgYKABYOFhQAAAAMEBQYIAgEAAA8ODQwLCgkIBwY +FBAMCAQACwcDADs3My8rJyMfGxcTDwsHAzExOjMzOjIzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAACIAAAAAAAAAHQAAAAAAAABvAAAAUAAAAPYAAABQAAAA9wAAAIAAAAD4 +AAAABQAAADMAAABzAAAANwAAAHQAAAA7AAAAAAAAADQAAAB0AAAAOAAAAHcAAAA8AAAAAwAAADEA +AAAHAAAANQAAAAcAAAA5AAAAAAAAADIAAAB/AAAANgAAAH8AAAA6AAAAAAAAAB8AAAAAAAAAIAAA +AAAAAAAhAAAAAAAAAAgAAAABAAAAcQAAABEAAADqAAAAqgAAAOsAAAAKAAAAagAAAAAAAAANAAAA +eAAAAA4AAAAnAAAADwAAACAAAAAQAAAAAgAAAPMAAAAAAAAA9AAAAAAAAAD1AAAAAAAAAAAAAAAB +AQEBAQEBAQICAgICAgICAwMDAwMDAwMBAgAAAAAAAAAAAAAEAAAABQAAAOEDDh7hAAAA4QMOHuEA +AAAAAAAACgAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADhAw4e4QAAABX2Y/aw9vz2RveQ99j3H/hl+Kn47fgv ++XD5sPnu+Sv6Z/qi+tz6FPtL+4H7tvvq+xz8Tfx9/Kv82fwF/TD9Wf2C/an9z/30/Rf+Of5a/nr+ +mP62/tL+7f4G/x7/Nf9L/2D/c/+F/5b/pv+0/8H/zf/Y/+H/6f/w//b/+v/9//////////3/+v/2 +//D/6f/h/9j/zf/B/7T/pv+W/4X/c/9g/0v/Nf8e/wb/7f7S/rb+mP56/lr+Of4X/vT9z/2p/YL9 +Wf0w/QX92fyr/H38Tfwc/Or7tvuB+0v7FPvc+qL6Z/or+u75sPlw+S/57fip+GX4H/jY95D3Rvf8 +9rD2Y/ZwuYO6lruqvL690r7nv/zAEcInwz3EU8VqxoDHl8ivycbK3sv2zA/OJ89A0FnRctKM06bU +v9Xa1vTXDtkp2kTbX9x63Zbesd/N4OnhBeMh5D7lWuZ355PosOnN6urrB+0k7kLvX/B98ZryuPPV +9PP1Efcv+Ez5avqI+6b8xP3i/gAAHgE8AloDeASWBbQG0QfvCA0KKwtIDGYNgw6hD74Q3BH5EhYU +MxVQFm0XiRimGcIa3xv7HBceMx9PIGohhiKhI7wk1yXyJgwoJilBKlordCyOLacuwC/ZMPExCjMi +NDo1UTZpN4A4ljmtOsM72TzvPQQ/GUAuQUJCVkNqRH1F////AP///wH/AgP///8EBf8J/wcKBggL +AAEBAgECAgMBAQEBAQEBAQICAgICAgICAwMDAwMDAwMEBAQEBAQEBAECAgICAgIDAwMDAwMDAwMD +AwMDAwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAADoBAgHVAN8A2gCiAHUAfwCKBSoDOQGoAYoF +ygLZAEgBAQMPBwoUN25qARoB2QDoAAoBugB5AIgAygFKAeIA+QDKAeoAggCZAHTRRRfooosuAAUH +AQMEAAUBBQAAAAUGAAIEAAUABQAAAQIBAgMEAAAFBgcICQoAAAkAAAAAAAAAAQAAAAIAAAADAAAA +AAAAAAQAAAACAAAABQAAAAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcH +BwcHBwcHBwcHBwcHBwcHBwYGBgYGBQUFBQUEBAQEBAMDAwMDAgICAgIBAQEBAQAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoACgAMAAsACwAKAA8 +ADQAQAA8AIwAbABYAEgA9ACwAH//Bw8fPwEDMAAAADYAAAAMAAAAEgAAABgAAAAkAAAABgAAAAkA +AAAFAAcCAwQGBkADgAbACQANgBMAGkAdgCCABgANgBMAGgAnADSAOgBBwAmAE0AdACeAOgBOwFeA +YZkDMwfZCnMOphXmHIAgGSQzB3MOphXmHFkrzDkAQTNI2QqmFYAgWSsAQaZWgGFZbJ3YiZ1O7MRO +NEiDNCd2YicapEEaEzuxExEYgREP/MAPTuzETid2YicapEEaEzuxEw3SIA2JndgJCIzACAd+4Ac0 +SIM0GqRBGhEYgREN0iANCIzACAZpkAawstUFBVRABSd2YicTO7ETDdIgDYmd2AkGaZAGxE7sBARG +YAQDP/ADqqqqqhqkQRoTO7ETD/zADxEYgREN0iANCqiAChM7sRMP/MAPD/zADw3SIA0LtEALC7RA +C4md2AkN0iANCqiACgqogAoIjMAIB3iABwd4gAcGaZAGD/zADw3SIA0LtEALDdIgDQu0QAuJndgJ +CIzACImd2AkIjMAIB37gBwd+4AfBLCkHCqiACgiMwAgHeIAHCIzACAd4gAcGaZAGsLLVBQZpkAaw +stUFBVRABQVUQAXWHcYEAQcPHz9///9m5gAABQYBAgMEAABUAFQAbABgAFwAVACMAHgADQ8FBwkL +AQMoACgANAAwACwALABEADwALAAsADwANAAwACwAVABEAFVVVQFLaC8BVVVVBeM4jgOqqqoCcRzH +AaqqqgrHcRwHAAQAAGQAAAAAAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8A +AQAAAA8APwABAAAADwA/AAIAAAAPAD8AAQAAACIWAACAAAADAAABWQAAJBYAAQAAAAMAAAFaAAAm +FgACAAAABAAAAVoAACgWAAIAAAADAAABWwAAKhYAAoAAAAMAAAFcAAAsFwAAAAAABAAAAVwAAC4X +AACAAAADAAABXQAAMBcAAQAAAAMAAAFeAAA0FwACAAAAAwAAAV8AADYXAAKAAAADAAABYAAAOBgA +AAAAAAQAAAFgAAA8GAABAAAAAwAAAWIAAD4YAAIAAAAEAAABYgAAQBgAAgAAAAMAAAFjAABkGwAC +AAAAAwAAAW8AAWYbAAKAAAADAAABcAABaBwAAAAAAAQAAAFwAAFsHAABAAAAAwAAAXIAAW4cAAIA +AAAEAAABcgABcBwAAgAAAAMAAAFzAAJ0HQAAAAAABAAAAXQAAnYdAACAAAADAAABdQACeB0AAQAA +AAMAAAF2AAJ8HQACAAAAAwAAAXcAA34dAAKAAAADAAABeAADgB4AAAAAAAQAAAF4AAOEHgABAAAA +AwAAAXoAA4YeAAIAAAAEAAABegAEiB4AAgAAAAMAAAF7AASMHwAAAAAABAAAAXwABJEfAAFAAAAD +AAABfgAElR8AAwAAAAQAAAF/AAWXHwACwAAAAwAAAYAABZkgAABAAAADAAABgQAFnSAAAUAAAAMA +AAGCAAWfIAABwAAAAwAAAYMABaEgAAMAAAAEAAABgwAFpSEAAEAAAAMAAAGFAAVoXAEAAAAAAGhc +AQAAAAAAaFwBAAAAAABoXAEAAAAAAGhcAQAAAAAAaFwBAAAAAABoXAEAAAAAAGhcAQAAAAAAZFYB +ABgAAAAoWAEAIAAAAIhdAQAUAAAAfF4BABQAAADUWwEADgAAAKhaAQAOAAAAqFsBABQAAACoWwEA +FAAAAEAjQCUhISEhQEBAQEAFBAQBAUBAQEAFBUBADAxADQwMAQEBBUBABQUABAAEQEAABEBAQAVA +QEBAQAVAQEAFBQUBAQEBQAUFBQEFAQFABQUFQAVABQUFBQUAAAAAAAAAAGQAAAAAkAEACgAAAAQA +AAAcEQAAHDIAABwzAAAEAAAAHBUAABwCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAClxoT4me6N9g3/vdax3lSR +UGADAqnOfVYZ52K15k2a7EWPnR9AiYf6Fe/rssmOC/vsQWez/V/qRb8j91OW5FubwnUc4a49akxa +bEF+AvVPg1xo9FE00Qj5k+Jzq1NiPyoMCFKVZUZenSgwoTcPCrUvCQ42JJsbPd8mzWlOzX+f6hsS +nh10WC40LTay3O60+1v2pE12YbfOfXtSPt1xXpcT9aZouQAALMFgQB/jyHnttr7URo3ZZ0ty3pTU +mOiwSoVruyrF5U8W7cWG15pVZpQRz4oQ6QYEgf7woER4uiXjS/Oi/l3AgIoFrT+8IUhwBPHfY8F3 +da9jQjAgGuUO/W2/TIEUGDUmL8PhvqI1zIg5LleT8lWC/Ed6rMjnuisyleagwJgZ0Z5/o2ZEflSr +O4MLyowpx9NrPCh5p+K8HRZ2rTvbVmROdB4U25IKDGxI5Lhdn26970OmxKg5pDE304vyMtVDi1lu +t9qMAWSx0pzgSbTY+qwH8yXPr8qO9OlHGBDVb4jwb0pyXCQ48VfHc1GXI8t8oZzoIT7dltxhhg2F +D5DgQnzEcarM2JAFBgH3Ehyjwl9q+a7QaZEXWJknOrknONkT67MrMyK70nCpiQenM7YtIjySFSDJ +SYf/qnhQeqWPA/hZgAkXGtplMdfGhLjQw4KwKXdaER7Le/yo1m06LAABAgQEAAAABAwMCAQMBARA +AAAAgAAAAAABAAAAAgAAQAAAAAAEAABAAAAAQAAAAADwYQAAAQECAQICAwAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAGQAAAAqAAAADgAAAAAAAQEAAAAAAAAAAAABAQAAAAACAAEAAgIDAwMAtQEA +DLUBABi1AQAktQEALLUBADS1AQABAQABAgEBAQAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgA0AAAAgAACADQAAgA0AAAAgAACADQAAAAYAAAAE +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAEAAAALAEAAAcA +AAAAAAAAEgAAAAQAAAALAAAACAAAAAQAAADYU4AACQAAAAQAAAAcAAAACgAAAAQAAABEU4AACwAA +AAQAAAAsR4AADAAAAAQAAAAcAAAADQAAAAQAAACYRoAADgAAAAAAAAAPAAAABAAAABYAAAA= +==== diff --git a/sys/contrib/pf/net/pf.c b/sys/contrib/pf/net/pf.c index 7058b7dca4d..ac512826269 100644 --- a/sys/contrib/pf/net/pf.c +++ b/sys/contrib/pf/net/pf.c @@ -643,10 +643,10 @@ pf_src_connlimit(struct pf_state **state) (*state)->key[PF_SK_WIRE]->af && (((*state)->direction == PF_OUT && PF_AEQ(&(*state)->src_node->addr, - &sk->addr[0], sk->af)) || + &sk->addr[1], sk->af)) || ((*state)->direction == PF_IN && PF_AEQ(&(*state)->src_node->addr, - &sk->addr[1], sk->af))) && + &sk->addr[0], sk->af))) && ((*state)->rule.ptr->flush & PF_FLUSH_GLOBAL || (*state)->rule.ptr == st->rule.ptr)) { diff --git a/sys/contrib/pf/net/pf_ioctl.c b/sys/contrib/pf/net/pf_ioctl.c index 468f3d76933..6b5d8f548bb 100644 --- a/sys/contrib/pf/net/pf_ioctl.c +++ b/sys/contrib/pf/net/pf_ioctl.c @@ -298,7 +298,7 @@ init_zone_var(void) V_pf_altq_pl = V_pf_pooladdr_pl = NULL; V_pf_frent_pl = V_pf_frag_pl = V_pf_cache_pl = V_pf_cent_pl = NULL; V_pf_state_scrub_pl = NULL; - V_pfr_ktable_pl = V_pfr_kentry_pl = NULL; + V_pfr_ktable_pl = V_pfr_kentry_pl = V_pfr_kcounters_pl = NULL; } void @@ -317,6 +317,7 @@ cleanup_pf_zone(void) UMA_DESTROY(V_pf_cent_pl); UMA_DESTROY(V_pfr_ktable_pl); UMA_DESTROY(V_pfr_kentry_pl); + UMA_DESTROY(V_pfr_kcounters_pl); UMA_DESTROY(V_pf_state_scrub_pl); UMA_DESTROY(V_pfi_addr_pl); } @@ -337,6 +338,7 @@ pfattach(void) UMA_CREATE(V_pf_pooladdr_pl, struct pf_pooladdr, "pfpooladdrpl"); UMA_CREATE(V_pfr_ktable_pl, struct pfr_ktable, "pfrktable"); UMA_CREATE(V_pfr_kentry_pl, struct pfr_kentry, "pfrkentry"); + UMA_CREATE(V_pfr_kcounters_pl, struct pfr_kcounters, "pfrkcounters"); UMA_CREATE(V_pf_frent_pl, struct pf_frent, "pffrent"); UMA_CREATE(V_pf_frag_pl, struct pf_fragment, "pffrag"); UMA_CREATE(V_pf_cache_pl, struct pf_fragment, "pffrcache"); diff --git a/sys/contrib/pf/net/pf_table.c b/sys/contrib/pf/net/pf_table.c index 5e1f5f1d6a0..ea77e31375c 100644 --- a/sys/contrib/pf/net/pf_table.c +++ b/sys/contrib/pf/net/pf_table.c @@ -179,7 +179,6 @@ struct pfr_walktree { VNET_DEFINE(uma_zone_t, pfr_ktable_pl); VNET_DEFINE(uma_zone_t, pfr_kentry_pl); VNET_DEFINE(uma_zone_t, pfr_kcounters_pl); -#define V_pfr_kcounters_pl VNET(pfr_kcounters_pl) VNET_DEFINE(struct sockaddr_in, pfr_sin); #define V_pfr_sin VNET(pfr_sin) VNET_DEFINE(struct sockaddr_in6, pfr_sin6); diff --git a/sys/contrib/pf/net/pfvar.h b/sys/contrib/pf/net/pfvar.h index 85fef1d2322..dab70c597a6 100644 --- a/sys/contrib/pf/net/pfvar.h +++ b/sys/contrib/pf/net/pfvar.h @@ -1868,6 +1868,8 @@ VNET_DECLARE(uma_zone_t, pfr_ktable_pl); #define V_pfr_ktable_pl VNET(pfr_ktable_pl) VNET_DECLARE(uma_zone_t, pfr_kentry_pl); #define V_pfr_kentry_pl VNET(pfr_kentry_pl) +VNET_DECLARE(uma_zone_t, pfr_kcounters_pl); +#define V_pfr_kcounters_pl VNET(pfr_kcounters_pl) VNET_DECLARE(uma_zone_t, pf_cache_pl); #define V_pf_cache_pl VNET(pf_cache_pl) VNET_DECLARE(uma_zone_t, pf_cent_pl); diff --git a/sys/contrib/rdma/krping/krping.c b/sys/contrib/rdma/krping/krping.c index d787965cd84..99d1924704d 100644 --- a/sys/contrib/rdma/krping/krping.c +++ b/sys/contrib/rdma/krping/krping.c @@ -41,7 +41,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include @@ -53,11 +52,13 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include -#include +#include +#include #include "getopt.h" #include "krping.h" @@ -83,6 +84,7 @@ static const struct krping_option krping_opts[] = { {"bw", OPT_NOPARAM, 'B'}, {"tx-depth", OPT_INT, 't'}, {"poll", OPT_NOPARAM, 'P'}, + {"memlimit", OPT_INT, 'm'}, {NULL, 0, 0} }; @@ -254,10 +256,14 @@ static void krping_cq_event_handler(struct ib_cq *cq, void *ctx) ib_req_notify_cq(cb->cq, IB_CQ_NEXT_COMP); while ((ret = ib_poll_cq(cb->cq, 1, &wc)) == 1) { if (wc.status) { - if (wc.status != IB_WC_WR_FLUSH_ERR) - log(LOG_ERR, "cq completion failed status %d\n", + if (wc.status == IB_WC_WR_FLUSH_ERR) { + DEBUG_LOG("cq flushed\n"); + continue; + } else { + log(LOG_CRIT, "cq completion failed status %d\n", wc.status); - goto error; + goto error; + } } switch (wc.opcode) { @@ -432,8 +438,17 @@ static int krping_setup_buffers(struct krping_cb *cb) } } - cb->rdma_buf = contigmalloc(cb->size, M_DEVBUF, M_WAITOK, 0, -1UL, - PAGE_SIZE, 0); + /* RNIC adapters have a limit upto which it can register physical memory + * If DMA-MR memory mode is set then normally driver registers maximum + * supported memory. After that if contigmalloc allocates memory beyond the + * specified RNIC limit then Krping may not work. + */ + if (cb->use_dmamr && cb->memlimit) + cb->rdma_buf = contigmalloc(cb->size, M_DEVBUF, M_WAITOK, 0, cb->memlimit, + PAGE_SIZE, 0); + else + cb->rdma_buf = contigmalloc(cb->size, M_DEVBUF, M_WAITOK, 0, -1UL, + PAGE_SIZE, 0); if (!cb->rdma_buf) { log(LOG_ERR, "rdma_buf malloc failed\n"); @@ -458,8 +473,12 @@ static int krping_setup_buffers(struct krping_cb *cb) } if (!cb->server || cb->wlat || cb->rlat || cb->bw) { - cb->start_buf = contigmalloc(cb->size, M_DEVBUF, M_WAITOK, - 0, -1UL, PAGE_SIZE, 0); + if (cb->use_dmamr && cb->memlimit) + cb->start_buf = contigmalloc(cb->size, M_DEVBUF, M_WAITOK, + 0, cb->memlimit, PAGE_SIZE, 0); + else + cb->start_buf = contigmalloc(cb->size, M_DEVBUF, M_WAITOK, + 0, -1UL, PAGE_SIZE, 0); if (!cb->start_buf) { log(LOG_ERR, "start_buf malloc failed\n"); ret = ENOMEM; @@ -1636,6 +1655,8 @@ int krping_doit(char *cmd) cb->state = IDLE; cb->size = 64; cb->txdepth = RPING_SQ_DEPTH; + cb->use_dmamr = 1; + cb->memlimit = 0; mtx_init(&cb->lock, "krping mtx", NULL, MTX_DUPOK|MTX_DEF); while ((op = krping_getopt("krping", &cmd, krping_opts, NULL, &optarg, @@ -1713,6 +1734,15 @@ int krping_doit(char *cmd) case 'd': debug++; break; + case 'm': + cb->memlimit = optint; + if (cb->memlimit < 1) { + log(LOG_ERR, "Invalid memory limit %ju\n", + cb->memlimit); + ret = EINVAL; + } else + DEBUG_LOG(PFX "memory limit %d\n", (int)optint); + break; default: log(LOG_ERR, "unknown opt %s\n", optarg); ret = EINVAL; diff --git a/sys/contrib/rdma/krping/krping.h b/sys/contrib/rdma/krping/krping.h index 8578e7e7979..d2348257cf7 100644 --- a/sys/contrib/rdma/krping/krping.h +++ b/sys/contrib/rdma/krping/krping.h @@ -1,7 +1,7 @@ /* * $FreeBSD$ */ -#include +#include #include /* @@ -92,6 +92,8 @@ struct krping_cb { int count; /* ping count */ int size; /* ping data size */ int validate; /* validate ping data */ + uint64_t memlimit; /* limit of the physical memory that + can be registered with dma_mr mode */ /* CM stuff */ struct rdma_cm_id *cm_id; /* connection on client side,*/ diff --git a/sys/contrib/rdma/krping/krping_dev.c b/sys/contrib/rdma/krping/krping_dev.c index 448f1971757..92d954d5e98 100644 --- a/sys/contrib/rdma/krping/krping_dev.c +++ b/sys/contrib/rdma/krping/krping_dev.c @@ -14,7 +14,6 @@ __FBSDID("$FreeBSD$"); #include -#include #include /* uprintf */ #include #include /* defines used in kernel.h */ @@ -51,6 +50,9 @@ typedef struct s_krping { /* vars */ static struct cdev *krping_dev; +#undef MODULE_VERSION +#include + static int krping_loader(struct module *m, int what, void *arg) { @@ -175,6 +177,4 @@ krping_write(struct cdev *dev, struct uio *uio, int ioflag) return(err); } -MODULE_DEPEND(krping, rdma_core, 1, 1, 1); -MODULE_DEPEND(krping, rdma_cma, 1, 1, 1); DEV_MODULE(krping,krping_loader,NULL); diff --git a/sys/contrib/rdma/rdma_addr.c b/sys/contrib/rdma/rdma_addr.c index b3f734963c0..33ec5acb255 100644 --- a/sys/contrib/rdma/rdma_addr.c +++ b/sys/contrib/rdma/rdma_addr.c @@ -117,7 +117,8 @@ int rdma_copy_addr(struct rdma_dev_addr *dev_addr, struct ifnet *dev, const unsigned char *dst_dev_addr) { dev_addr->dev_type = RDMA_NODE_RNIC; - memcpy(dev_addr->src_dev_addr, IF_LLADDR(dev), MAX_ADDR_LEN); + memset(dev_addr->src_dev_addr, 0, MAX_ADDR_LEN); + memcpy(dev_addr->src_dev_addr, IF_LLADDR(dev), dev->if_addrlen); memcpy(dev_addr->broadcast, dev->if_broadcastaddr, MAX_ADDR_LEN); if (dst_dev_addr) memcpy(dev_addr->dst_dev_addr, dst_dev_addr, MAX_ADDR_LEN); @@ -207,7 +208,7 @@ static int addr_resolve_remote(struct sockaddr_in *src_in, goto put; } ret = arpresolve(iproute.ro_rt->rt_ifp, iproute.ro_rt, NULL, - rt_key(iproute.ro_rt), dmac, &lle); + (struct sockaddr *)dst_in, dmac, &lle); if (ret) { goto put; } diff --git a/sys/contrib/rdma/rdma_cache.c b/sys/contrib/rdma/rdma_cache.c index dced8ebd011..1e516a1b036 100644 --- a/sys/contrib/rdma/rdma_cache.c +++ b/sys/contrib/rdma/rdma_cache.c @@ -132,7 +132,7 @@ int ib_find_cached_gid(struct ib_device *device, for (p = 0; p <= end_port(device) - start_port(device); ++p) { cache = device->cache.gid_cache[p]; for (i = 0; i < cache->table_len; ++i) { - if (!memcmp(gid, &cache->table[i], 6)) { /* XXX */ + if (!memcmp(gid, &cache->table[i], sizeof *gid)) { *port_num = p + start_port(device); if (index) *index = i; diff --git a/sys/dev/aac/aac_disk.c b/sys/dev/aac/aac_disk.c index 3c9720ddbc1..e4042f72fc0 100644 --- a/sys/dev/aac/aac_disk.c +++ b/sys/dev/aac/aac_disk.c @@ -332,9 +332,6 @@ aac_disk_dump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size void aac_biodone(struct bio *bp) { - struct aac_disk *sc; - - sc = (struct aac_disk *)bp->bio_disk->d_drv1; fwprintf(NULL, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, ""); if (bp->bio_flags & BIO_ERROR) diff --git a/sys/dev/acpi_support/acpi_asus_wmi.c b/sys/dev/acpi_support/acpi_asus_wmi.c new file mode 100644 index 00000000000..9e2a49809de --- /dev/null +++ b/sys/dev/acpi_support/acpi_asus_wmi.c @@ -0,0 +1,651 @@ +/*- + * Copyright (c) 2012 Alexander Motin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_acpi.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "acpi_wmi_if.h" + +#define _COMPONENT ACPI_OEM +ACPI_MODULE_NAME("ASUS-WMI") + +#define ACPI_ASUS_WMI_MGMT_GUID "97845ED0-4E6D-11DE-8A39-0800200C9A66" +#define ACPI_ASUS_WMI_EVENT_GUID "0B3CBB35-E3C2-45ED-91C2-4C5A6D195D1C" +#define ACPI_EEEPC_WMI_EVENT_GUID "ABBC0F72-8EA1-11D1-00A0-C90629100000" + +/* WMI Methods */ +#define ASUS_WMI_METHODID_SPEC 0x43455053 +#define ASUS_WMI_METHODID_SFUN 0x4E554653 +#define ASUS_WMI_METHODID_DSTS 0x53544344 +#define ASUS_WMI_METHODID_DSTS2 0x53545344 +#define ASUS_WMI_METHODID_DEVS 0x53564544 +#define ASUS_WMI_METHODID_INIT 0x54494E49 +#define ASUS_WMI_METHODID_HKEY 0x59454B48 + +#define ASUS_WMI_UNSUPPORTED_METHOD 0xFFFFFFFE + +/* Wireless */ +#define ASUS_WMI_DEVID_HW_SWITCH 0x00010001 +#define ASUS_WMI_DEVID_WIRELESS_LED 0x00010002 +#define ASUS_WMI_DEVID_CWAP 0x00010003 +#define ASUS_WMI_DEVID_WLAN 0x00010011 +#define ASUS_WMI_DEVID_BLUETOOTH 0x00010013 +#define ASUS_WMI_DEVID_GPS 0x00010015 +#define ASUS_WMI_DEVID_WIMAX 0x00010017 +#define ASUS_WMI_DEVID_WWAN3G 0x00010019 +#define ASUS_WMI_DEVID_UWB 0x00010021 + +/* LEDs */ +#define ASUS_WMI_DEVID_LED1 0x00020011 +#define ASUS_WMI_DEVID_LED2 0x00020012 +#define ASUS_WMI_DEVID_LED3 0x00020013 +#define ASUS_WMI_DEVID_LED4 0x00020014 +#define ASUS_WMI_DEVID_LED5 0x00020015 +#define ASUS_WMI_DEVID_LED6 0x00020016 + +/* Backlight and Brightness */ +#define ASUS_WMI_DEVID_BACKLIGHT 0x00050011 +#define ASUS_WMI_DEVID_BRIGHTNESS 0x00050012 +#define ASUS_WMI_DEVID_KBD_BACKLIGHT 0x00050021 +#define ASUS_WMI_DEVID_LIGHT_SENSOR 0x00050022 + +/* Misc */ +#define ASUS_WMI_DEVID_CAMERA 0x00060013 +#define ASUS_WMI_DEVID_CARDREADER 0x00080013 +#define ASUS_WMI_DEVID_TOUCHPAD 0x00100011 +#define ASUS_WMI_DEVID_TOUCHPAD_LED 0x00100012 +#define ASUS_WMI_DEVID_THERMAL_CTRL 0x00110011 +#define ASUS_WMI_DEVID_FAN_CTRL 0x00110012 +#define ASUS_WMI_DEVID_PROCESSOR_STATE 0x00120012 + +/* DSTS masks */ +#define ASUS_WMI_DSTS_STATUS_BIT 0x00000001 +#define ASUS_WMI_DSTS_UNKNOWN_BIT 0x00000002 +#define ASUS_WMI_DSTS_PRESENCE_BIT 0x00010000 +#define ASUS_WMI_DSTS_USER_BIT 0x00020000 +#define ASUS_WMI_DSTS_BIOS_BIT 0x00040000 +#define ASUS_WMI_DSTS_BRIGHTNESS_MASK 0x000000FF +#define ASUS_WMI_DSTS_MAX_BRIGTH_MASK 0x0000FF00 + + +struct acpi_asus_wmi_softc { + device_t dev; + device_t wmi_dev; + const char *notify_guid; + struct sysctl_ctx_list *sysctl_ctx; + struct sysctl_oid *sysctl_tree; + int dsts_id; + int handle_keys; +}; + +static struct { + char *name; + int dev_id; + char *description; + int access; +} acpi_asus_wmi_sysctls[] = { + { + .name = "hw_switch", + .dev_id = ASUS_WMI_DEVID_HW_SWITCH, + .description = "hw_switch", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "wireless_led", + .dev_id = ASUS_WMI_DEVID_WIRELESS_LED, + .description = "Wireless LED control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "cwap", + .dev_id = ASUS_WMI_DEVID_CWAP, + .description = "Alt+F2 function", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "wlan", + .dev_id = ASUS_WMI_DEVID_WLAN, + .description = "WLAN power control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "bluetooth", + .dev_id = ASUS_WMI_DEVID_BLUETOOTH, + .description = "Bluetooth power control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "gps", + .dev_id = ASUS_WMI_DEVID_GPS, + .description = "GPS power control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "wimax", + .dev_id = ASUS_WMI_DEVID_WIMAX, + .description = "WiMAX power control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "wwan3g", + .dev_id = ASUS_WMI_DEVID_WWAN3G, + .description = "WWAN-3G power control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "uwb", + .dev_id = ASUS_WMI_DEVID_UWB, + .description = "UWB power control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "led1", + .dev_id = ASUS_WMI_DEVID_LED1, + .description = "LED1 control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "led2", + .dev_id = ASUS_WMI_DEVID_LED2, + .description = "LED2 control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "led3", + .dev_id = ASUS_WMI_DEVID_LED3, + .description = "LED3 control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "led4", + .dev_id = ASUS_WMI_DEVID_LED4, + .description = "LED4 control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "led5", + .dev_id = ASUS_WMI_DEVID_LED5, + .description = "LED5 control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "led6", + .dev_id = ASUS_WMI_DEVID_LED6, + .description = "LED6 control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "backlight", + .dev_id = ASUS_WMI_DEVID_BACKLIGHT, + .description = "LCD backlight on/off control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "brightness", + .dev_id = ASUS_WMI_DEVID_BRIGHTNESS, + .description = "LCD backlight brightness control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "kbd_backlight", + .dev_id = ASUS_WMI_DEVID_KBD_BACKLIGHT, + .description = "Keyboard backlight brightness control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "light_sensor", + .dev_id = ASUS_WMI_DEVID_LIGHT_SENSOR, + .description = "Ambient light sensor", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "camera", + .dev_id = ASUS_WMI_DEVID_CAMERA, + .description = "Camera power control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "cardreader", + .dev_id = ASUS_WMI_DEVID_CARDREADER, + .description = "Cardreader power control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "touchpad", + .dev_id = ASUS_WMI_DEVID_TOUCHPAD, + .description = "Touchpad control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "touchpad_led", + .dev_id = ASUS_WMI_DEVID_TOUCHPAD_LED, + .description = "Touchpad LED control", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { + .name = "themperature", + .dev_id = ASUS_WMI_DEVID_THERMAL_CTRL, + .description = "Temperature (C)", + .access = CTLTYPE_INT | CTLFLAG_RD + }, + { + .name = "fan_speed", + .dev_id = ASUS_WMI_DEVID_FAN_CTRL, + .description = "Fan speed (0-3)", + .access = CTLTYPE_INT | CTLFLAG_RD + }, + { + .name = "processor_state", + .dev_id = ASUS_WMI_DEVID_PROCESSOR_STATE, + .description = "Processor state", + .access = CTLTYPE_INT | CTLFLAG_RW + }, + { NULL, 0, NULL, 0 } +}; + +ACPI_SERIAL_DECL(asus_wmi, "ASUS WMI device"); + +static void acpi_asus_wmi_identify(driver_t *driver, device_t parent); +static int acpi_asus_wmi_probe(device_t dev); +static int acpi_asus_wmi_attach(device_t dev); +static int acpi_asus_wmi_detach(device_t dev); + +static int acpi_asus_wmi_sysctl(SYSCTL_HANDLER_ARGS); +static int acpi_asus_wmi_sysctl_set(struct acpi_asus_wmi_softc *sc, int dev_id, + int arg, int oldarg); +static int acpi_asus_wmi_sysctl_get(struct acpi_asus_wmi_softc *sc, int dev_id); +static int acpi_asus_wmi_evaluate_method(device_t wmi_dev, int method, + UINT32 arg0, UINT32 arg1, UINT32 *retval); +static int acpi_wpi_asus_get_devstate(struct acpi_asus_wmi_softc *sc, + UINT32 dev_id, UINT32 *retval); +static int acpi_wpi_asus_set_devstate(struct acpi_asus_wmi_softc *sc, + UINT32 dev_id, UINT32 ctrl_param, UINT32 *retval); +static void acpi_asus_wmi_notify(ACPI_HANDLE h, UINT32 notify, void *context); + +static device_method_t acpi_asus_wmi_methods[] = { + DEVMETHOD(device_identify, acpi_asus_wmi_identify), + DEVMETHOD(device_probe, acpi_asus_wmi_probe), + DEVMETHOD(device_attach, acpi_asus_wmi_attach), + DEVMETHOD(device_detach, acpi_asus_wmi_detach), + {0, 0} +}; + +static driver_t acpi_asus_wmi_driver = { + "acpi_asus_wmi", + acpi_asus_wmi_methods, + sizeof(struct acpi_asus_wmi_softc), +}; + +static devclass_t acpi_asus_wmi_devclass; + +DRIVER_MODULE(acpi_asus_wmi, acpi_wmi, acpi_asus_wmi_driver, + acpi_asus_wmi_devclass, 0, 0); +MODULE_DEPEND(acpi_asus_wmi, acpi_wmi, 1, 1, 1); +MODULE_DEPEND(acpi_asus_wmi, acpi, 1, 1, 1); + +static void +acpi_asus_wmi_identify(driver_t *driver, device_t parent) +{ + + /* Don't do anything if driver is disabled. */ + if (acpi_disabled("asus_wmi")) + return; + + /* Add only a single device instance. */ + if (device_find_child(parent, "acpi_asus_wmi", -1) != NULL) + return; + + /* Check management GUID to see whether system is compatible. */ + if (!ACPI_WMI_PROVIDES_GUID_STRING(parent, + ACPI_ASUS_WMI_MGMT_GUID)) + return; + + if (BUS_ADD_CHILD(parent, 0, "acpi_asus_wmi", -1) == NULL) + device_printf(parent, "add acpi_asus_wmi child failed\n"); +} + +static int +acpi_asus_wmi_probe(device_t dev) +{ + + if (!ACPI_WMI_PROVIDES_GUID_STRING(device_get_parent(dev), + ACPI_ASUS_WMI_MGMT_GUID)) + return (EINVAL); + device_set_desc(dev, "ASUS WMI device"); + return (0); +} + +static int +acpi_asus_wmi_attach(device_t dev) +{ + struct acpi_asus_wmi_softc *sc; + UINT32 val; + int dev_id, i; + + ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__); + + sc = device_get_softc(dev); + sc->dev = dev; + sc->wmi_dev = device_get_parent(dev); + sc->handle_keys = 1; + + /* Check management GUID. */ + if (!ACPI_WMI_PROVIDES_GUID_STRING(sc->wmi_dev, + ACPI_ASUS_WMI_MGMT_GUID)) { + device_printf(dev, + "WMI device does not provide the ASUS management GUID\n"); + return (EINVAL); + } + + /* Find proper DSTS method. */ + sc->dsts_id = ASUS_WMI_METHODID_DSTS; +next: + for (i = 0; acpi_asus_wmi_sysctls[i].name != NULL; ++i) { + dev_id = acpi_asus_wmi_sysctls[i].dev_id; + if (acpi_wpi_asus_get_devstate(sc, dev_id, &val)) + continue; + break; + } + if (acpi_asus_wmi_sysctls[i].name == NULL) { + if (sc->dsts_id == ASUS_WMI_METHODID_DSTS) { + sc->dsts_id = ASUS_WMI_METHODID_DSTS2; + goto next; + } else { + device_printf(dev, "Can not detect DSTS method ID\n"); + return (EINVAL); + } + } + + /* Find proper and attach to notufy GUID. */ + if (ACPI_WMI_PROVIDES_GUID_STRING(sc->wmi_dev, + ACPI_ASUS_WMI_EVENT_GUID)) + sc->notify_guid = ACPI_ASUS_WMI_EVENT_GUID; + else if (ACPI_WMI_PROVIDES_GUID_STRING(sc->wmi_dev, + ACPI_EEEPC_WMI_EVENT_GUID)) + sc->notify_guid = ACPI_EEEPC_WMI_EVENT_GUID; + else + sc->notify_guid = NULL; + if (sc->notify_guid != NULL) { + if (ACPI_WMI_INSTALL_EVENT_HANDLER(sc->wmi_dev, + sc->notify_guid, acpi_asus_wmi_notify, dev)) + sc->notify_guid = NULL; + } + if (sc->notify_guid == NULL) + device_printf(dev, "Could not install event handler!\n"); + + /* Initialize. */ + if (!acpi_asus_wmi_evaluate_method(sc->wmi_dev, + ASUS_WMI_METHODID_INIT, 0, 0, &val) && bootverbose) + device_printf(dev, "Initialization: %#x\n", val); + if (!acpi_asus_wmi_evaluate_method(sc->wmi_dev, + ASUS_WMI_METHODID_SPEC, 0, 0x9, &val) && bootverbose) + device_printf(dev, "WMI BIOS version: %d.%d\n", + val >> 16, val & 0xFF); + if (!acpi_asus_wmi_evaluate_method(sc->wmi_dev, + ASUS_WMI_METHODID_SFUN, 0, 0, &val) && bootverbose) + device_printf(dev, "SFUN value: %#x\n", val); + + ACPI_SERIAL_BEGIN(asus_wmi); + + sc->sysctl_ctx = device_get_sysctl_ctx(dev); + sc->sysctl_tree = device_get_sysctl_tree(dev); + SYSCTL_ADD_INT(sc->sysctl_ctx, + SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, + "handle_keys", CTLFLAG_RW, &sc->handle_keys, + 0, "Handle some hardware keys inside the driver"); + for (i = 0; acpi_asus_wmi_sysctls[i].name != NULL; ++i) { + dev_id = acpi_asus_wmi_sysctls[i].dev_id; + if (acpi_wpi_asus_get_devstate(sc, dev_id, &val)) + continue; + switch (dev_id) { + case ASUS_WMI_DEVID_THERMAL_CTRL: + case ASUS_WMI_DEVID_PROCESSOR_STATE: + case ASUS_WMI_DEVID_FAN_CTRL: + case ASUS_WMI_DEVID_BRIGHTNESS: + if (val == 0) + continue; + break; + default: + if ((val & ASUS_WMI_DSTS_PRESENCE_BIT) == 0) + continue; + break; + } + + SYSCTL_ADD_PROC(sc->sysctl_ctx, + SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, + acpi_asus_wmi_sysctls[i].name, + acpi_asus_wmi_sysctls[i].access, + sc, i, acpi_asus_wmi_sysctl, "I", + acpi_asus_wmi_sysctls[i].description); + } + ACPI_SERIAL_END(asus_wmi); + + return (0); +} + +static int +acpi_asus_wmi_detach(device_t dev) +{ + struct acpi_asus_wmi_softc *sc = device_get_softc(dev); + + ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__); + + if (sc->notify_guid) + ACPI_WMI_REMOVE_EVENT_HANDLER(dev, sc->notify_guid); + + return (0); +} + +static int +acpi_asus_wmi_sysctl(SYSCTL_HANDLER_ARGS) +{ + struct acpi_asus_wmi_softc *sc; + int arg; + int oldarg; + int error = 0; + int function; + int dev_id; + + ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); + + sc = (struct acpi_asus_wmi_softc *)oidp->oid_arg1; + function = oidp->oid_arg2; + dev_id = acpi_asus_wmi_sysctls[function].dev_id; + + ACPI_SERIAL_BEGIN(asus_wmi); + arg = acpi_asus_wmi_sysctl_get(sc, dev_id); + oldarg = arg; + error = sysctl_handle_int(oidp, &arg, 0, req); + if (!error && req->newptr != NULL) + error = acpi_asus_wmi_sysctl_set(sc, dev_id, arg, oldarg); + ACPI_SERIAL_END(asus_wmi); + + return (error); +} + +static int +acpi_asus_wmi_sysctl_get(struct acpi_asus_wmi_softc *sc, int dev_id) +{ + UINT32 val = 0; + + ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); + ACPI_SERIAL_ASSERT(asus_wmi); + + acpi_wpi_asus_get_devstate(sc, dev_id, &val); + + switch(dev_id) { + case ASUS_WMI_DEVID_THERMAL_CTRL: + val = (val - 2732 + 5) / 10; + break; + case ASUS_WMI_DEVID_PROCESSOR_STATE: + case ASUS_WMI_DEVID_FAN_CTRL: + break; + case ASUS_WMI_DEVID_BRIGHTNESS: + val &= ASUS_WMI_DSTS_BRIGHTNESS_MASK; + break; + case ASUS_WMI_DEVID_KBD_BACKLIGHT: + val &= 0x7; + break; + default: + if (val & ASUS_WMI_DSTS_UNKNOWN_BIT) + val = -1; + else + val = !!(val & ASUS_WMI_DSTS_STATUS_BIT); + break; + } + + return (val); +} + +static int +acpi_asus_wmi_sysctl_set(struct acpi_asus_wmi_softc *sc, int dev_id, int arg, int oldarg) +{ + ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); + ACPI_SERIAL_ASSERT(asus_wmi); + + switch(dev_id) { + case ASUS_WMI_DEVID_KBD_BACKLIGHT: + arg = min(0x7, arg); + if (arg != 0) + arg |= 0x80; + break; + } + + acpi_wpi_asus_set_devstate(sc, dev_id, arg, NULL); + + return (0); +} + +static __inline void +acpi_asus_wmi_free_buffer(ACPI_BUFFER* buf) { + if (buf && buf->Pointer) { + AcpiOsFree(buf->Pointer); + } +} + +static void +acpi_asus_wmi_notify(ACPI_HANDLE h, UINT32 notify, void *context) +{ + device_t dev = context; + ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, notify); + UINT32 val; + int code = 0; + + struct acpi_asus_wmi_softc *sc = device_get_softc(dev); + ACPI_BUFFER response = { ACPI_ALLOCATE_BUFFER, NULL }; + ACPI_OBJECT *obj; + ACPI_WMI_GET_EVENT_DATA(sc->wmi_dev, notify, &response); + obj = (ACPI_OBJECT*) response.Pointer; + if (obj && obj->Type == ACPI_TYPE_INTEGER) { + code = obj->Integer.Value; + acpi_UserNotify("ASUS", ACPI_ROOT_OBJECT, + code); + } + if (code && sc->handle_keys) { + /* Keyboard backlight control. */ + if (code == 0xc4 || code == 0xc5) { + acpi_wpi_asus_get_devstate(sc, + ASUS_WMI_DEVID_KBD_BACKLIGHT, &val); + val &= 0x7; + if (code == 0xc4) { + if (val < 0x7) + val++; + } else if (val > 0) + val--; + if (val != 0) + val |= 0x80; + acpi_wpi_asus_set_devstate(sc, + ASUS_WMI_DEVID_KBD_BACKLIGHT, val, NULL); + } + /* Touchpad control. */ + if (code == 0x6b) { + acpi_wpi_asus_get_devstate(sc, + ASUS_WMI_DEVID_TOUCHPAD, &val); + val = !(val & 1); + acpi_wpi_asus_set_devstate(sc, + ASUS_WMI_DEVID_TOUCHPAD, val, NULL); + } + } + acpi_asus_wmi_free_buffer(&response); +} + +static int +acpi_asus_wmi_evaluate_method(device_t wmi_dev, int method, + UINT32 arg0, UINT32 arg1, UINT32 *retval) +{ + UINT32 params[2] = { arg0, arg1 }; + UINT32 result; + ACPI_OBJECT *obj; + ACPI_BUFFER in = { sizeof(params), ¶ms }; + ACPI_BUFFER out = { ACPI_ALLOCATE_BUFFER, NULL }; + + if (ACPI_FAILURE(ACPI_WMI_EVALUATE_CALL(wmi_dev, + ACPI_ASUS_WMI_MGMT_GUID, 1, method, &in, &out))) { + acpi_asus_wmi_free_buffer(&out); + return (-EINVAL); + } + obj = out.Pointer; + if (obj && obj->Type == ACPI_TYPE_INTEGER) + result = (UINT32) obj->Integer.Value; + else + result = 0; + acpi_asus_wmi_free_buffer(&out); + if (retval) + *retval = result; + return (result == ASUS_WMI_UNSUPPORTED_METHOD ? -ENODEV : 0); +} + +static int +acpi_wpi_asus_get_devstate(struct acpi_asus_wmi_softc *sc, + UINT32 dev_id, UINT32 *retval) +{ + + return (acpi_asus_wmi_evaluate_method(sc->wmi_dev, + sc->dsts_id, dev_id, 0, retval)); +} + +static int +acpi_wpi_asus_set_devstate(struct acpi_asus_wmi_softc *sc, + UINT32 dev_id, UINT32 ctrl_param, UINT32 *retval) +{ + + return (acpi_asus_wmi_evaluate_method(sc->wmi_dev, + ASUS_WMI_METHODID_DEVS, dev_id, ctrl_param, retval)); +} diff --git a/sys/dev/acpi_support/acpi_ibm.c b/sys/dev/acpi_support/acpi_ibm.c index c8f3b45b7c2..c6b52471cb7 100644 --- a/sys/dev/acpi_support/acpi_ibm.c +++ b/sys/dev/acpi_support/acpi_ibm.c @@ -50,6 +50,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include @@ -70,6 +72,7 @@ ACPI_MODULE_NAME("IBM") #define ACPI_IBM_METHOD_FANLEVEL 11 #define ACPI_IBM_METHOD_FANSTATUS 12 #define ACPI_IBM_METHOD_THERMAL 13 +#define ACPI_IBM_METHOD_HANDLEREVENTS 14 /* Hotkeys/Buttons */ #define IBM_RTC_HOTKEY1 0x64 @@ -126,6 +129,21 @@ ACPI_MODULE_NAME("IBM") #define IBM_NAME_EVENTS_GET "MHKP" #define IBM_NAME_EVENTS_AVAILMASK "MHKA" +/* Event Code */ +#define IBM_EVENT_LCD_BACKLIGHT 0x03 +#define IBM_EVENT_SUSPEND_TO_RAM 0x04 +#define IBM_EVENT_BLUETOOTH 0x05 +#define IBM_EVENT_SCREEN_EXPAND 0x07 +#define IBM_EVENT_SUSPEND_TO_DISK 0x0c +#define IBM_EVENT_BRIGHTNESS_UP 0x10 +#define IBM_EVENT_BRIGHTNESS_DOWN 0x11 +#define IBM_EVENT_THINKLIGHT 0x12 +#define IBM_EVENT_ZOOM 0x14 +#define IBM_EVENT_VOLUME_UP 0x15 +#define IBM_EVENT_VOLUME_DOWN 0x16 +#define IBM_EVENT_MUTE 0x17 +#define IBM_EVENT_ACCESS_IBM_BUTTON 0x18 + #define ABS(x) (((x) < 0)? -(x) : (x)) struct acpi_ibm_softc { @@ -164,6 +182,8 @@ struct acpi_ibm_softc { int events_mask_supported; int events_enable; + unsigned int handler_events; + struct sysctl_ctx_list *sysctl_ctx; struct sysctl_oid *sysctl_tree; }; @@ -267,8 +287,15 @@ static int acpi_ibm_sysctl_set(struct acpi_ibm_softc *sc, int method, int val); static int acpi_ibm_eventmask_set(struct acpi_ibm_softc *sc, int val); static int acpi_ibm_thermal_sysctl(SYSCTL_HANDLER_ARGS); +static int acpi_ibm_handlerevents_sysctl(SYSCTL_HANDLER_ARGS); static void acpi_ibm_notify(ACPI_HANDLE h, UINT32 notify, void *context); +static int acpi_ibm_brightness_set(struct acpi_ibm_softc *sc, int arg); +static int acpi_ibm_bluetooth_set(struct acpi_ibm_softc *sc, int arg); +static int acpi_ibm_thinklight_set(struct acpi_ibm_softc *sc, int arg); +static int acpi_ibm_volume_set(struct acpi_ibm_softc *sc, int arg); +static int acpi_ibm_mute_set(struct acpi_ibm_softc *sc, int arg); + static device_method_t acpi_ibm_methods[] = { /* Device interface */ DEVMETHOD(device_probe, acpi_ibm_probe), @@ -404,6 +431,15 @@ acpi_ibm_attach(device_t dev) "Thermal zones"); } + /* Hook up handlerevents node */ + if (acpi_ibm_sysctl_init(sc, ACPI_IBM_METHOD_HANDLEREVENTS)) { + SYSCTL_ADD_PROC(sc->sysctl_ctx, + SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, + "handlerevents", CTLTYPE_STRING | CTLFLAG_RW, + sc, 0, acpi_ibm_handlerevents_sysctl, "I", + "devd(8) events handled by acpi_ibm"); + } + /* Handle notifies */ AcpiInstallNotifyHandler(sc->handle, ACPI_DEVICE_NOTIFY, acpi_ibm_notify, dev); @@ -656,10 +692,8 @@ acpi_ibm_sysctl_get(struct acpi_ibm_softc *sc, int method) static int acpi_ibm_sysctl_set(struct acpi_ibm_softc *sc, int method, int arg) { - int val, step; + int val; UINT64 val_ec; - ACPI_OBJECT Arg; - ACPI_OBJECT_LIST Args; ACPI_STATUS status; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); @@ -683,101 +717,23 @@ acpi_ibm_sysctl_set(struct acpi_ibm_softc *sc, int method, int arg) break; case ACPI_IBM_METHOD_BRIGHTNESS: - if (arg < 0 || arg > 7) - return (EINVAL); - - if (sc->cmos_handle) { - /* Read the current brightness */ - status = ACPI_EC_READ(sc->ec_dev, IBM_EC_BRIGHTNESS, &val_ec, 1); - if (ACPI_FAILURE(status)) - return (status); - val = val_ec & IBM_EC_MASK_BRI; - - Args.Count = 1; - Args.Pointer = &Arg; - Arg.Type = ACPI_TYPE_INTEGER; - Arg.Integer.Value = (arg > val) ? IBM_CMOS_BRIGHTNESS_UP : IBM_CMOS_BRIGHTNESS_DOWN; - - step = (arg > val) ? 1 : -1; - for (int i = val; i != arg; i += step) { - status = AcpiEvaluateObject(sc->cmos_handle, NULL, &Args, NULL); - if (ACPI_FAILURE(status)) - break; - } - } - return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_BRIGHTNESS, arg, 1); + return acpi_ibm_brightness_set(sc, arg); break; case ACPI_IBM_METHOD_VOLUME: - if (arg < 0 || arg > 14) - return (EINVAL); - - status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1); - if (ACPI_FAILURE(status)) - return (status); - - if (sc->cmos_handle) { - val = val_ec & IBM_EC_MASK_VOL; - - Args.Count = 1; - Args.Pointer = &Arg; - Arg.Type = ACPI_TYPE_INTEGER; - Arg.Integer.Value = (arg > val) ? IBM_CMOS_VOLUME_UP : IBM_CMOS_VOLUME_DOWN; - - step = (arg > val) ? 1 : -1; - for (int i = val; i != arg; i += step) { - status = AcpiEvaluateObject(sc->cmos_handle, NULL, &Args, NULL); - if (ACPI_FAILURE(status)) - break; - } - } - return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME, arg + (val_ec & (~IBM_EC_MASK_VOL)), 1); + return acpi_ibm_volume_set(sc, arg); break; case ACPI_IBM_METHOD_MUTE: - if (arg < 0 || arg > 1) - return (EINVAL); - - status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1); - if (ACPI_FAILURE(status)) - return (status); - - if (sc->cmos_handle) { - Args.Count = 1; - Args.Pointer = &Arg; - Arg.Type = ACPI_TYPE_INTEGER; - Arg.Integer.Value = IBM_CMOS_VOLUME_MUTE; - - status = AcpiEvaluateObject(sc->cmos_handle, NULL, &Args, NULL); - if (ACPI_FAILURE(status)) - break; - } - return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME, (arg==1) ? val_ec | IBM_EC_MASK_MUTE : val_ec & (~IBM_EC_MASK_MUTE), 1); + return acpi_ibm_mute_set(sc, arg); break; case ACPI_IBM_METHOD_THINKLIGHT: - if (arg < 0 || arg > 1) - return (EINVAL); - - if (sc->light_set_supported) { - Args.Count = 1; - Args.Pointer = &Arg; - Arg.Type = ACPI_TYPE_INTEGER; - Arg.Integer.Value = arg ? sc->light_cmd_on : sc->light_cmd_off; - - status = AcpiEvaluateObject(sc->light_handle, NULL, &Args, NULL); - if (ACPI_SUCCESS(status)) - sc->light_val = arg; - return (status); - } + return acpi_ibm_thinklight_set(sc, arg); break; case ACPI_IBM_METHOD_BLUETOOTH: - if (arg < 0 || arg > 1) - return (EINVAL); - - val = (arg == 1) ? sc->wlan_bt_flags | IBM_NAME_MASK_BT : sc->wlan_bt_flags & (~IBM_NAME_MASK_BT); - return acpi_SetInteger(sc->handle, IBM_NAME_WLAN_BT_SET, val); + return acpi_ibm_bluetooth_set(sc, arg); break; case ACPI_IBM_METHOD_FANLEVEL: @@ -898,6 +854,9 @@ acpi_ibm_sysctl_init(struct acpi_ibm_softc *sc, int method) return (TRUE); } return (FALSE); + + case ACPI_IBM_METHOD_HANDLEREVENTS: + return (TRUE); } return (FALSE); } @@ -937,6 +896,328 @@ acpi_ibm_thermal_sysctl(SYSCTL_HANDLER_ARGS) return (error); } +static int +acpi_ibm_handlerevents_sysctl(SYSCTL_HANDLER_ARGS) +{ + struct acpi_ibm_softc *sc; + int error = 0; + struct sbuf sb; + char *cp, *ep; + int l, val; + unsigned int handler_events; + + ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); + + sc = (struct acpi_ibm_softc *)oidp->oid_arg1; + + if (sbuf_new(&sb, NULL, 128, SBUF_AUTOEXTEND) == NULL) + return (ENOMEM); + + ACPI_SERIAL_BEGIN(ibm); + + /* Get old values if this is a get request. */ + if (req->newptr == NULL) { + for (int i = 0; i < 8 * sizeof(sc->handler_events); i++) + if (sc->handler_events & (1 << i)) + sbuf_printf(&sb, "0x%02x ", i + 1); + if (sbuf_len(&sb) == 0) + sbuf_printf(&sb, "NONE"); + } + + sbuf_trim(&sb); + sbuf_finish(&sb); + + /* Copy out the old values to the user. */ + error = SYSCTL_OUT(req, sbuf_data(&sb), sbuf_len(&sb)); + sbuf_delete(&sb); + + if (error != 0 || req->newptr == NULL) + goto out; + + /* If the user is setting a string, parse it. */ + handler_events = 0; + cp = (char *)req->newptr; + while (*cp) { + if (isspace(*cp)) { + cp++; + continue; + } + + ep = cp; + + while (*ep && !isspace(*ep)) + ep++; + + l = ep - cp; + if (l == 0) + break; + + if (strncmp(cp, "NONE", 4) == 0) { + cp = ep; + continue; + } + + if (l >= 3 && cp[0] == '0' && (cp[1] == 'X' || cp[1] == 'x')) + val = strtoul(cp, &ep, 16); + else + val = strtoul(cp, &ep, 10); + + if (val == 0 || ep == cp || val >= 8 * sizeof(handler_events)) { + cp[l] = '\0'; + device_printf(sc->dev, "invalid event code: %s\n", cp); + error = EINVAL; + goto out; + } + + handler_events |= 1 << (val - 1); + + cp = ep; + } + + sc->handler_events = handler_events; +out: + ACPI_SERIAL_END(ibm); + return (error); +} + +static int +acpi_ibm_brightness_set(struct acpi_ibm_softc *sc, int arg) +{ + int val, step; + UINT64 val_ec; + ACPI_OBJECT Arg; + ACPI_OBJECT_LIST Args; + ACPI_STATUS status; + + ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); + ACPI_SERIAL_ASSERT(ibm); + + if (arg < 0 || arg > 7) + return (EINVAL); + + /* Read the current brightness */ + status = ACPI_EC_READ(sc->ec_dev, IBM_EC_BRIGHTNESS, &val_ec, 1); + if (ACPI_FAILURE(status)) + return (status); + + if (sc->cmos_handle) { + val = val_ec & IBM_EC_MASK_BRI; + + Args.Count = 1; + Args.Pointer = &Arg; + Arg.Type = ACPI_TYPE_INTEGER; + Arg.Integer.Value = (arg > val) ? IBM_CMOS_BRIGHTNESS_UP : + IBM_CMOS_BRIGHTNESS_DOWN; + + step = (arg > val) ? 1 : -1; + for (int i = val; i != arg; i += step) { + status = AcpiEvaluateObject(sc->cmos_handle, NULL, + &Args, NULL); + if (ACPI_FAILURE(status)) { + /* Record the last value */ + if (i != val) { + ACPI_EC_WRITE(sc->ec_dev, + IBM_EC_BRIGHTNESS, i - step, 1); + } + return (status); + } + } + } + + return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_BRIGHTNESS, arg, 1); +} + +static int +acpi_ibm_bluetooth_set(struct acpi_ibm_softc *sc, int arg) +{ + int val; + + ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); + ACPI_SERIAL_ASSERT(ibm); + + if (arg < 0 || arg > 1) + return (EINVAL); + + val = (arg == 1) ? sc->wlan_bt_flags | IBM_NAME_MASK_BT : + sc->wlan_bt_flags & (~IBM_NAME_MASK_BT); + return acpi_SetInteger(sc->handle, IBM_NAME_WLAN_BT_SET, val); +} + +static int +acpi_ibm_thinklight_set(struct acpi_ibm_softc *sc, int arg) +{ + ACPI_OBJECT Arg; + ACPI_OBJECT_LIST Args; + ACPI_STATUS status; + + ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); + ACPI_SERIAL_ASSERT(ibm); + + if (arg < 0 || arg > 1) + return (EINVAL); + + if (sc->light_set_supported) { + Args.Count = 1; + Args.Pointer = &Arg; + Arg.Type = ACPI_TYPE_INTEGER; + Arg.Integer.Value = arg ? sc->light_cmd_on : sc->light_cmd_off; + + status = AcpiEvaluateObject(sc->light_handle, NULL, + &Args, NULL); + if (ACPI_SUCCESS(status)) + sc->light_val = arg; + return (status); + } + + return (0); +} + +static int +acpi_ibm_volume_set(struct acpi_ibm_softc *sc, int arg) +{ + int val, step; + UINT64 val_ec; + ACPI_OBJECT Arg; + ACPI_OBJECT_LIST Args; + ACPI_STATUS status; + + ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); + ACPI_SERIAL_ASSERT(ibm); + + if (arg < 0 || arg > 14) + return (EINVAL); + + /* Read the current volume */ + status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1); + if (ACPI_FAILURE(status)) + return (status); + + if (sc->cmos_handle) { + val = val_ec & IBM_EC_MASK_VOL; + + Args.Count = 1; + Args.Pointer = &Arg; + Arg.Type = ACPI_TYPE_INTEGER; + Arg.Integer.Value = (arg > val) ? IBM_CMOS_VOLUME_UP : + IBM_CMOS_VOLUME_DOWN; + + step = (arg > val) ? 1 : -1; + for (int i = val; i != arg; i += step) { + status = AcpiEvaluateObject(sc->cmos_handle, NULL, + &Args, NULL); + if (ACPI_FAILURE(status)) { + /* Record the last value */ + if (i != val) { + val_ec = i - step + + (val_ec & (~IBM_EC_MASK_VOL)); + ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME, + val_ec, 1); + } + return (status); + } + } + } + + val_ec = arg + (val_ec & (~IBM_EC_MASK_VOL)); + return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME, val_ec, 1); +} + +static int +acpi_ibm_mute_set(struct acpi_ibm_softc *sc, int arg) +{ + UINT64 val_ec; + ACPI_OBJECT Arg; + ACPI_OBJECT_LIST Args; + ACPI_STATUS status; + + ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); + ACPI_SERIAL_ASSERT(ibm); + + if (arg < 0 || arg > 1) + return (EINVAL); + + status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1); + if (ACPI_FAILURE(status)) + return (status); + + if (sc->cmos_handle) { + Args.Count = 1; + Args.Pointer = &Arg; + Arg.Type = ACPI_TYPE_INTEGER; + Arg.Integer.Value = IBM_CMOS_VOLUME_MUTE; + + status = AcpiEvaluateObject(sc->cmos_handle, NULL, &Args, NULL); + if (ACPI_FAILURE(status)) + return (status); + } + + val_ec = (arg == 1) ? val_ec | IBM_EC_MASK_MUTE : + val_ec & (~IBM_EC_MASK_MUTE); + return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME, val_ec, 1); +} + +static void +acpi_ibm_eventhandler(struct acpi_ibm_softc *sc, int arg) +{ + int val; + UINT64 val_ec; + ACPI_STATUS status; + + ACPI_SERIAL_BEGIN(ibm); + switch (arg) { + case IBM_EVENT_SUSPEND_TO_RAM: + power_pm_suspend(POWER_SLEEP_STATE_SUSPEND); + break; + + case IBM_EVENT_BLUETOOTH: + acpi_ibm_bluetooth_set(sc, (sc->wlan_bt_flags == 0)); + break; + + case IBM_EVENT_BRIGHTNESS_UP: + case IBM_EVENT_BRIGHTNESS_DOWN: + /* Read the current brightness */ + status = ACPI_EC_READ(sc->ec_dev, IBM_EC_BRIGHTNESS, + &val_ec, 1); + if (ACPI_FAILURE(status)) + return; + + val = val_ec & IBM_EC_MASK_BRI; + val = (arg == IBM_EVENT_BRIGHTNESS_UP) ? val + 1 : val - 1; + acpi_ibm_brightness_set(sc, val); + break; + + case IBM_EVENT_THINKLIGHT: + acpi_ibm_thinklight_set(sc, (sc->light_val == 0)); + break; + + case IBM_EVENT_VOLUME_UP: + case IBM_EVENT_VOLUME_DOWN: + /* Read the current volume */ + status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1); + if (ACPI_FAILURE(status)) + return; + + val = val_ec & IBM_EC_MASK_VOL; + val = (arg == IBM_EVENT_VOLUME_UP) ? val + 1 : val - 1; + acpi_ibm_volume_set(sc, val); + break; + + case IBM_EVENT_MUTE: + /* Read the current value */ + status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1); + if (ACPI_FAILURE(status)) + return; + + val = ((val_ec & IBM_EC_MASK_MUTE) == IBM_EC_MASK_MUTE); + acpi_ibm_mute_set(sc, (val == 0)); + break; + + default: + break; + } + ACPI_SERIAL_END(ibm); +} + static void acpi_ibm_notify(ACPI_HANDLE h, UINT32 notify, void *context) { @@ -965,6 +1246,10 @@ acpi_ibm_notify(ACPI_HANDLE h, UINT32 notify, void *context) break; } + /* Execute event handler */ + if (sc->handler_events & (1 << (arg - 1))) + acpi_ibm_eventhandler(sc, (arg & 0xff)); + /* Notify devd(8) */ acpi_UserNotify("IBM", h, (arg & 0xff)); break; diff --git a/sys/dev/acpica/Osd/OsdSchedule.c b/sys/dev/acpica/Osd/OsdSchedule.c index c05ae93d4ff..6d517cb3011 100644 --- a/sys/dev/acpica/Osd/OsdSchedule.c +++ b/sys/dev/acpica/Osd/OsdSchedule.c @@ -214,6 +214,20 @@ AcpiOsExecute(ACPI_EXECUTE_TYPE Type, ACPI_OSD_EXEC_CALLBACK Function, return_ACPI_STATUS (acpi_task_enqueue(pri, Function, Context)); } +void +AcpiOsWaitEventsComplete(void) +{ + int i; + + ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); + + for (i = 0; i < acpi_max_tasks; i++) + if ((atomic_load_acq_int(&acpi_tasks[i].at_flag) & + ACPI_TASK_ENQUEUED) != 0) + taskqueue_drain(acpi_taskq, &acpi_tasks[i].at_task); + return_VOID; +} + void AcpiOsSleep(UINT64 Milliseconds) { diff --git a/sys/dev/acpica/Osd/OsdSynch.c b/sys/dev/acpica/Osd/OsdSynch.c index dedfa6e0a72..b70a12051ee 100644 --- a/sys/dev/acpica/Osd/OsdSynch.c +++ b/sys/dev/acpica/Osd/OsdSynch.c @@ -208,7 +208,7 @@ AcpiOsWaitSemaphore(ACPI_SEMAPHORE Handle, UINT32 Units, UINT16 Timeout) tmo -= slptick; } } - if (status == AE_OK) + if (ACPI_SUCCESS(status)) as->as_units -= Units; mtx_unlock(&as->as_lock); @@ -402,7 +402,7 @@ AcpiOsAcquireMutex(ACPI_MUTEX Handle, UINT16 Timeout) tmo -= slptick; } } - if (status == AE_OK) + if (ACPI_SUCCESS(status)) am->am_owner = curthread; mtx_unlock(&am->am_lock); diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c index d1db7c938b7..56f4fdb7668 100644 --- a/sys/dev/acpica/acpi.c +++ b/sys/dev/acpica/acpi.c @@ -2448,6 +2448,16 @@ acpi_SetSleepState(struct acpi_softc *sc, int state) } #if defined(__amd64__) || defined(__i386__) +static void +acpi_sleep_force_task(void *context) +{ + struct acpi_softc *sc = (struct acpi_softc *)context; + + if (ACPI_FAILURE(acpi_EnterSleepState(sc, sc->acpi_next_sstate))) + device_printf(sc->acpi_dev, "force sleep state S%d failed\n", + sc->acpi_next_sstate); +} + static void acpi_sleep_force(void *arg) { @@ -2455,9 +2465,13 @@ acpi_sleep_force(void *arg) device_printf(sc->acpi_dev, "suspend request timed out, forcing sleep now\n"); - if (ACPI_FAILURE(acpi_EnterSleepState(sc, sc->acpi_next_sstate))) - device_printf(sc->acpi_dev, "force sleep state S%d failed\n", - sc->acpi_next_sstate); + /* + * XXX Suspending from callout cause the freeze in DEVICE_SUSPEND(). + * Suspend from acpi_task thread in stead. + */ + if (ACPI_FAILURE(AcpiOsExecute(OSL_NOTIFY_HANDLER, + acpi_sleep_force_task, sc))) + device_printf(sc->acpi_dev, "AcpiOsExecute() for sleeping failed\n"); } #endif @@ -2479,14 +2493,20 @@ acpi_ReqSleepState(struct acpi_softc *sc, int state) if (!acpi_sleep_states[state]) return (EOPNOTSUPP); - ACPI_LOCK(acpi); - /* If a suspend request is already in progress, just return. */ if (sc->acpi_next_sstate != 0) { - ACPI_UNLOCK(acpi); return (0); } + /* Wait until sleep is enabled. */ + while (sc->acpi_sleep_disabled) { + AcpiOsSleep(1000); + } + + ACPI_LOCK(acpi); + + sc->acpi_next_sstate = state; + /* S5 (soft-off) should be entered directly with no waiting. */ if (state == ACPI_STATE_S5) { ACPI_UNLOCK(acpi); @@ -2495,7 +2515,6 @@ acpi_ReqSleepState(struct acpi_softc *sc, int state) } /* Record the pending state and notify all apm devices. */ - sc->acpi_next_sstate = state; STAILQ_FOREACH(clone, &sc->apm_cdevs, entries) { clone->notify_status = APM_EV_NONE; if ((clone->flags & ACPI_EVF_DEVD) == 0) { @@ -2647,6 +2666,7 @@ acpi_EnterSleepState(struct acpi_softc *sc, int state) register_t intr; ACPI_STATUS status; enum acpi_sleep_state slp_state; + int sleep_result; ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, state); @@ -2726,16 +2746,25 @@ acpi_EnterSleepState(struct acpi_softc *sc, int state) if (sc->acpi_sleep_delay > 0) DELAY(sc->acpi_sleep_delay * 1000000); + intr = intr_disable(); if (state != ACPI_STATE_S1) { - if (acpi_sleep_machdep(sc, state)) + sleep_result = acpi_sleep_machdep(sc, state); + acpi_wakeup_machdep(sc, state, sleep_result, 0); + AcpiLeaveSleepStatePrep(state, acpi_sleep_flags); + intr_restore(intr); + + /* call acpi_wakeup_machdep() again with interrupt enabled */ + acpi_wakeup_machdep(sc, state, sleep_result, 1); + + if (sleep_result == -1) goto backout; /* Re-enable ACPI hardware on wakeup from sleep state 4. */ if (state == ACPI_STATE_S4) AcpiEnable(); } else { - intr = intr_disable(); status = AcpiEnterSleepState(state, acpi_sleep_flags); + AcpiLeaveSleepStatePrep(state, acpi_sleep_flags); intr_restore(intr); if (ACPI_FAILURE(status)) { device_printf(sc->acpi_dev, "AcpiEnterSleepState failed - %s\n", @@ -2754,12 +2783,10 @@ backout: acpi_wake_prep_walk(state); sc->acpi_sstate = ACPI_STATE_S0; } - if (slp_state >= ACPI_SS_SLP_PREP) { - AcpiLeaveSleepStatePrep(state, acpi_sleep_flags); - AcpiLeaveSleepState(state); - } if (slp_state >= ACPI_SS_DEV_SUSPEND) DEVICE_RESUME(root_bus); + if (slp_state >= ACPI_SS_SLP_PREP) + AcpiLeaveSleepState(state); if (slp_state >= ACPI_SS_SLEPT) { acpi_resync_clock(sc); acpi_enable_fixed_events(sc); diff --git a/sys/dev/acpica/acpi_cpu.c b/sys/dev/acpica/acpi_cpu.c index 29034e1873e..0f2f7f91111 100644 --- a/sys/dev/acpica/acpi_cpu.c +++ b/sys/dev/acpica/acpi_cpu.c @@ -124,6 +124,13 @@ struct acpi_cpu_device { #define PIIX4_STOP_BREAK_MASK (PIIX4_BRLD_EN_IRQ0 | PIIX4_BRLD_EN_IRQ | PIIX4_BRLD_EN_IRQ8) #define PIIX4_PCNTRL_BST_EN (1<<10) +/* Allow users to ignore processor orders in MADT. */ +static int cpu_unordered; +TUNABLE_INT("debug.acpi.cpu_unordered", &cpu_unordered); +SYSCTL_INT(_debug_acpi, OID_AUTO, cpu_unordered, CTLFLAG_RDTUN, + &cpu_unordered, 0, + "Do not use the MADT to match ACPI Processor objects to CPUs."); + /* Platform hardware resource information. */ static uint32_t cpu_smi_cmd; /* Value to write to SMI_CMD. */ static uint8_t cpu_cst_cnt; /* Indicate we are _CST aware. */ @@ -148,7 +155,7 @@ static int acpi_cpu_probe(device_t dev); static int acpi_cpu_attach(device_t dev); static int acpi_cpu_suspend(device_t dev); static int acpi_cpu_resume(device_t dev); -static int acpi_pcpu_get_id(uint32_t idx, uint32_t *acpi_id, +static int acpi_pcpu_get_id(device_t dev, uint32_t *acpi_id, uint32_t *cpu_id); static struct resource_list *acpi_cpu_get_rlist(device_t dev, device_t child); static device_t acpi_cpu_add_child(device_t dev, u_int order, const char *name, @@ -245,7 +252,7 @@ acpi_cpu_probe(device_t dev) */ acpi_id = obj->Processor.ProcId; AcpiOsFree(obj); - if (acpi_pcpu_get_id(device_get_unit(dev), &acpi_id, &cpu_id) != 0) + if (acpi_pcpu_get_id(dev, &acpi_id, &cpu_id) != 0) return (ENXIO); /* @@ -436,36 +443,66 @@ acpi_cpu_resume(device_t dev) } /* - * Find the nth present CPU and return its pc_cpuid as well as set the - * pc_acpi_id from the most reliable source. + * Find the processor associated with a given ACPI ID. By default, + * use the MADT to map ACPI IDs to APIC IDs and use that to locate a + * processor. Some systems have inconsistent ASL and MADT however. + * For these systems the cpu_unordered tunable can be set in which + * case we assume that Processor objects are listed in the same order + * in both the MADT and ASL. */ static int -acpi_pcpu_get_id(uint32_t idx, uint32_t *acpi_id, uint32_t *cpu_id) +acpi_pcpu_get_id(device_t dev, uint32_t *acpi_id, uint32_t *cpu_id) { - struct pcpu *pcpu_data; - uint32_t i; + struct pcpu *pc; + uint32_t i, idx; KASSERT(acpi_id != NULL, ("Null acpi_id")); KASSERT(cpu_id != NULL, ("Null cpu_id")); + idx = device_get_unit(dev); + + /* + * If pc_acpi_id for CPU 0 is not initialized (e.g. a non-APIC + * UP box) use the ACPI ID from the first processor we find. + */ + if (idx == 0 && mp_ncpus == 1) { + pc = pcpu_find(0); + if (pc->pc_acpi_id == 0xffffffff) + pc->pc_acpi_id = *acpi_id; + *cpu_id = 0; + return (0); + } + CPU_FOREACH(i) { - pcpu_data = pcpu_find(i); - KASSERT(pcpu_data != NULL, ("no pcpu data for %d", i)); - if (idx-- == 0) { - /* - * If pc_acpi_id was not initialized (e.g., a non-APIC UP box) - * override it with the value from the ASL. Otherwise, if the - * two don't match, prefer the MADT-derived value. Finally, - * return the pc_cpuid to reference this processor. - */ - if (pcpu_data->pc_acpi_id == 0xffffffff) - pcpu_data->pc_acpi_id = *acpi_id; - else if (pcpu_data->pc_acpi_id != *acpi_id) - *acpi_id = pcpu_data->pc_acpi_id; - *cpu_id = pcpu_data->pc_cpuid; - return (0); + pc = pcpu_find(i); + KASSERT(pc != NULL, ("no pcpu data for %d", i)); + if (cpu_unordered) { + if (idx-- == 0) { + /* + * If pc_acpi_id doesn't match the ACPI ID from the + * ASL, prefer the MADT-derived value. + */ + if (pc->pc_acpi_id != *acpi_id) + *acpi_id = pc->pc_acpi_id; + *cpu_id = pc->pc_cpuid; + return (0); + } + } else { + if (pc->pc_acpi_id == *acpi_id) { + if (bootverbose) + device_printf(dev, + "Processor %s (ACPI ID %u) -> APIC ID %d\n", + acpi_name(acpi_get_handle(dev)), *acpi_id, + pc->pc_cpuid); + *cpu_id = pc->pc_cpuid; + return (0); + } } } + if (bootverbose) + printf("ACPI: Processor %s (ACPI ID %u) ignored\n", + acpi_name(acpi_get_handle(dev)), *acpi_id); + return (ESRCH); } @@ -592,6 +629,7 @@ acpi_cpu_generic_cx_probe(struct acpi_cpu_softc *sc) cx_ptr->type = ACPI_STATE_C1; cx_ptr->trans_lat = 0; cx_ptr++; + sc->cpu_non_c3 = sc->cpu_cx_count; sc->cpu_cx_count++; /* @@ -616,6 +654,7 @@ acpi_cpu_generic_cx_probe(struct acpi_cpu_softc *sc) cx_ptr->type = ACPI_STATE_C2; cx_ptr->trans_lat = AcpiGbl_FADT.C2Latency; cx_ptr++; + sc->cpu_non_c3 = sc->cpu_cx_count; sc->cpu_cx_count++; } } @@ -633,6 +672,7 @@ acpi_cpu_generic_cx_probe(struct acpi_cpu_softc *sc) cx_ptr->trans_lat = AcpiGbl_FADT.C3Latency; cx_ptr++; sc->cpu_cx_count++; + cpu_can_deep_sleep = 1; } } } @@ -709,13 +749,13 @@ acpi_cpu_cx_cst(struct acpi_cpu_softc *sc) /* This is the first C1 state. Use the reserved slot. */ sc->cpu_cx_states[0] = *cx_ptr; } else { - sc->cpu_non_c3 = i; + sc->cpu_non_c3 = sc->cpu_cx_count; cx_ptr++; sc->cpu_cx_count++; } continue; case ACPI_STATE_C2: - sc->cpu_non_c3 = i; + sc->cpu_non_c3 = sc->cpu_cx_count; break; case ACPI_STATE_C3: default: @@ -724,7 +764,8 @@ acpi_cpu_cx_cst(struct acpi_cpu_softc *sc) "acpi_cpu%d: C3[%d] not available.\n", device_get_unit(sc->cpu_dev), i)); continue; - } + } else + cpu_can_deep_sleep = 1; break; } @@ -848,16 +889,10 @@ acpi_cpu_cx_list(struct acpi_cpu_softc *sc) /* * Set up the list of Cx states */ - sc->cpu_non_c3 = 0; sbuf_new(&sb, sc->cpu_cx_supported, sizeof(sc->cpu_cx_supported), SBUF_FIXEDLEN); - for (i = 0; i < sc->cpu_cx_count; i++) { + for (i = 0; i < sc->cpu_cx_count; i++) sbuf_printf(&sb, "C%d/%d ", i + 1, sc->cpu_cx_states[i].trans_lat); - if (sc->cpu_cx_states[i].type < ACPI_STATE_C3) - sc->cpu_non_c3 = i; - else - cpu_can_deep_sleep = 1; - } sbuf_trim(&sb); sbuf_finish(&sb); } @@ -883,14 +918,12 @@ acpi_cpu_startup_cx(struct acpi_cpu_softc *sc) (void *)sc, 0, acpi_cpu_usage_sysctl, "A", "percent usage for each Cx state"); -#ifdef notyet /* Signal platform that we can handle _CST notification. */ if (!cpu_cx_generic && cpu_cst_cnt != 0) { ACPI_LOCK(acpi); AcpiOsWritePort(cpu_smi_cmd, cpu_cst_cnt, 8); ACPI_UNLOCK(acpi); } -#endif } /* diff --git a/sys/dev/acpica/acpi_ec.c b/sys/dev/acpica/acpi_ec.c index f8af33c454b..00a3073dae8 100644 --- a/sys/dev/acpica/acpi_ec.c +++ b/sys/dev/acpica/acpi_ec.c @@ -178,7 +178,6 @@ struct acpi_ec_softc { ACPI_SERIAL_DECL(ec, "ACPI embedded controller"); -SYSCTL_DECL(_debug_acpi); static SYSCTL_NODE(_debug_acpi, OID_AUTO, ec, CTLFLAG_RD, NULL, "EC debugging"); static int ec_burst_mode; @@ -650,8 +649,8 @@ EcGpeQueryHandler(void *Context) Status = EcCommand(sc, EC_COMMAND_QUERY); if (ACPI_SUCCESS(Status)) break; - if (EcCheckStatus(sc, "retr_check", - EC_EVENT_INPUT_BUFFER_EMPTY) == AE_OK) + if (ACPI_SUCCESS(EcCheckStatus(sc, "retr_check", + EC_EVENT_INPUT_BUFFER_EMPTY))) continue; else break; @@ -846,7 +845,7 @@ EcWaitEvent(struct acpi_ec_softc *sc, EC_EVENT Event, u_int gen_count) DELAY(10); for (i = 0; i < count; i++) { Status = EcCheckStatus(sc, "poll", Event); - if (Status == AE_OK) + if (ACPI_SUCCESS(Status)) break; DELAY(EC_POLL_DELAY); } @@ -876,7 +875,7 @@ EcWaitEvent(struct acpi_ec_softc *sc, EC_EVENT Event, u_int gen_count) * event we are actually waiting for. */ Status = EcCheckStatus(sc, "sleep", Event); - if (Status == AE_OK) { + if (ACPI_SUCCESS(Status)) { if (gen_count == sc->ec_gencount) no_intr++; else @@ -891,7 +890,7 @@ EcWaitEvent(struct acpi_ec_softc *sc, EC_EVENT Event, u_int gen_count) * read the register once and trust whatever value we got. This is * the best we can do at this point. */ - if (Status != AE_OK) + if (ACPI_FAILURE(Status)) Status = EcCheckStatus(sc, "sleep_end", Event); } if (!need_poll && no_intr > 10) { @@ -899,7 +898,7 @@ EcWaitEvent(struct acpi_ec_softc *sc, EC_EVENT Event, u_int gen_count) "not getting interrupts, switched to polled mode\n"); ec_polled_mode = 1; } - if (Status != AE_OK) + if (ACPI_FAILURE(Status)) CTR0(KTR_ACPI, "error: ec wait timed out"); return (Status); } @@ -978,8 +977,8 @@ EcRead(struct acpi_ec_softc *sc, UINT8 Address, UINT8 *Data) EC_SET_DATA(sc, Address); status = EcWaitEvent(sc, EC_EVENT_OUTPUT_BUFFER_FULL, gen_count); if (ACPI_FAILURE(status)) { - if (EcCheckStatus(sc, "retr_check", - EC_EVENT_INPUT_BUFFER_EMPTY) == AE_OK) + if (ACPI_SUCCESS(EcCheckStatus(sc, "retr_check", + EC_EVENT_INPUT_BUFFER_EMPTY))) continue; else break; diff --git a/sys/dev/acpica/acpi_powerres.c b/sys/dev/acpica/acpi_powerres.c index b661594c104..ba08286f785 100644 --- a/sys/dev/acpica/acpi_powerres.c +++ b/sys/dev/acpica/acpi_powerres.c @@ -314,7 +314,6 @@ acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state) ACPI_OBJECT *reslist_object; ACPI_STATUS status; char *method_name, *reslist_name; - int res_changed; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); @@ -445,7 +444,7 @@ acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state) * Now we are ready to switch, so kill off any current power * resource references. */ - res_changed = acpi_pwr_dereference_resource(pc); + acpi_pwr_dereference_resource(pc); /* * Add new power resource references, if we have any. Traverse the @@ -457,7 +456,6 @@ acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state) reslist_object->Package.Count)); acpi_ForeachPackageObject(reslist_object, acpi_pwr_reference_resource, pc); - res_changed = 1; } /* diff --git a/sys/dev/acpica/acpi_smbat.c b/sys/dev/acpica/acpi_smbat.c index 06477724b15..f83392ff3f8 100644 --- a/sys/dev/acpica/acpi_smbat.c +++ b/sys/dev/acpica/acpi_smbat.c @@ -62,7 +62,6 @@ static int acpi_smbat_get_bst(device_t dev, struct acpi_bst *bst); ACPI_SERIAL_DECL(smbat, "ACPI Smart Battery"); -SYSCTL_DECL(_debug_acpi); static SYSCTL_NODE(_debug_acpi, OID_AUTO, batt, CTLFLAG_RD, NULL, "Battery debugging"); diff --git a/sys/dev/acpica/acpi_video.c b/sys/dev/acpica/acpi_video.c index eac2d07204b..3954892ee69 100644 --- a/sys/dev/acpica/acpi_video.c +++ b/sys/dev/acpica/acpi_video.c @@ -75,6 +75,7 @@ static void acpi_video_identify(driver_t *driver, device_t parent); static int acpi_video_probe(device_t); static int acpi_video_attach(device_t); static int acpi_video_detach(device_t); +static int acpi_video_resume(device_t); static int acpi_video_shutdown(device_t); static void acpi_video_notify_handler(ACPI_HANDLE, UINT32, void *); static void acpi_video_power_profile(void *); @@ -155,6 +156,7 @@ static device_method_t acpi_video_methods[] = { DEVMETHOD(device_probe, acpi_video_probe), DEVMETHOD(device_attach, acpi_video_attach), DEVMETHOD(device_detach, acpi_video_detach), + DEVMETHOD(device_resume, acpi_video_resume), DEVMETHOD(device_shutdown, acpi_video_shutdown), { 0, 0 } }; @@ -304,6 +306,36 @@ acpi_video_detach(device_t dev) return (0); } +static int +acpi_video_resume(device_t dev) +{ + struct acpi_video_softc *sc; + struct acpi_video_output *vo, *vn; + int level; + + sc = device_get_softc(dev); + + /* Restore brightness level */ + ACPI_SERIAL_BEGIN(video); + ACPI_SERIAL_BEGIN(video_output); + STAILQ_FOREACH_SAFE(vo, &sc->vid_outputs, vo_next, vn) { + if ((vo->adr & DOD_DEVID_MASK_FULL) != DOD_DEVID_LCD && + (vo->adr & DOD_DEVID_MASK) != DOD_DEVID_INTDFP) + continue; + + if ((vo_get_device_status(vo->handle) & DCS_ACTIVE) == 0) + continue; + + level = vo_get_brightness(vo->handle); + if (level != -1) + vo_set_brightness(vo->handle, level); + } + ACPI_SERIAL_END(video_output); + ACPI_SERIAL_END(video); + + return (0); +} + static int acpi_video_shutdown(device_t dev) { diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h index 5791ca5683a..4ef92b59094 100644 --- a/sys/dev/acpica/acpivar.h +++ b/sys/dev/acpica/acpivar.h @@ -71,8 +71,6 @@ struct acpi_softc { int acpi_verbose; int acpi_handle_reboot; - bus_dma_tag_t acpi_waketag; - bus_dmamap_t acpi_wakemap; vm_offset_t acpi_wakeaddr; vm_paddr_t acpi_wakephys; @@ -273,7 +271,7 @@ acpi_get_type(device_t dev) if ((h = acpi_get_handle(dev)) == NULL) return (ACPI_TYPE_NOT_FOUND); - if (AcpiGetType(h, &t) != AE_OK) + if (ACPI_FAILURE(AcpiGetType(h, &t))) return (ACPI_TYPE_NOT_FOUND); return (t); } @@ -439,6 +437,8 @@ int acpi_disabled(char *subsys); int acpi_machdep_init(device_t dev); void acpi_install_wakeup_handler(struct acpi_softc *sc); int acpi_sleep_machdep(struct acpi_softc *sc, int state); +int acpi_wakeup_machdep(struct acpi_softc *sc, int state, + int sleep_result, int intr_enabled); int acpi_table_quirks(int *quirks); int acpi_machdep_quirks(int *quirks); @@ -492,5 +492,7 @@ ACPI_HANDLE acpi_GetReference(ACPI_HANDLE scope, ACPI_OBJECT *obj); /* Use the device logging level for ktr(4). */ #define KTR_ACPI KTR_DEV +SYSCTL_DECL(_debug_acpi); + #endif /* _KERNEL */ #endif /* !_ACPIVAR_H_ */ diff --git a/sys/dev/adb/adb_kbd.c b/sys/dev/adb/adb_kbd.c index e69c4db47dc..75899c971d7 100644 --- a/sys/dev/adb/adb_kbd.c +++ b/sys/dev/adb/adb_kbd.c @@ -426,8 +426,10 @@ adb_kbd_receive_packet(device_t dev, u_char status, /* 0x7f is always the power button */ if (data[0] == 0x7f && devctl_process_running()) { devctl_notify("PMU", "Button", "pressed", NULL); + mtx_unlock(&sc->sc_mutex); return (0); } else if (data[0] == 0xff) { + mtx_unlock(&sc->sc_mutex); return (0); /* Ignore power button release. */ } if ((data[0] & 0x7f) == 57 && sc->buffers < 7) { diff --git a/sys/dev/ae/if_ae.c b/sys/dev/ae/if_ae.c index 3b882ee2410..e49b92689ff 100644 --- a/sys/dev/ae/if_ae.c +++ b/sys/dev/ae/if_ae.c @@ -1381,12 +1381,13 @@ ae_pm_init(ae_softc_t *sc) /* * Configure PME. */ - pci_find_cap(sc->dev, PCIY_PMG, &pmc); - pmstat = pci_read_config(sc->dev, pmc + PCIR_POWER_STATUS, 2); - pmstat &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE); - if ((ifp->if_capenable & IFCAP_WOL) != 0) - pmstat |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE; - pci_write_config(sc->dev, pmc + PCIR_POWER_STATUS, pmstat, 2); + if (pci_find_cap(sc->dev, PCIY_PMG, &pmc) == 0) { + pmstat = pci_read_config(sc->dev, pmc + PCIR_POWER_STATUS, 2); + pmstat &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE); + if ((ifp->if_capenable & IFCAP_WOL) != 0) + pmstat |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE; + pci_write_config(sc->dev, pmc + PCIR_POWER_STATUS, pmstat, 2); + } } static int diff --git a/sys/dev/agp/agp.c b/sys/dev/agp/agp.c index 6e5aa358b24..95642acd6c0 100644 --- a/sys/dev/agp/agp.c +++ b/sys/dev/agp/agp.c @@ -55,7 +55,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include #include @@ -234,12 +233,13 @@ agp_generic_attach(device_t dev) * Work out an upper bound for agp memory allocation. This * uses a heurisitc table from the Linux driver. */ - memsize = ptoa(Maxmem) >> 20; + memsize = ptoa(realmem) >> 20; for (i = 0; i < agp_max_size; i++) { if (memsize <= agp_max[i][0]) break; } - if (i == agp_max_size) i = agp_max_size - 1; + if (i == agp_max_size) + i = agp_max_size - 1; sc->as_maxmem = agp_max[i][1] << 20U; /* @@ -802,6 +802,13 @@ agp_unbind_user(device_t dev, agp_unbind *unbind) return AGP_UNBIND_MEMORY(dev, mem); } +static int +agp_chipset_flush(device_t dev) +{ + + return (AGP_CHIPSET_FLUSH(dev)); +} + static int agp_open(struct cdev *kdev, int oflags, int devtype, struct thread *td) { @@ -869,6 +876,8 @@ agp_ioctl(struct cdev *kdev, u_long cmd, caddr_t data, int fflag, struct thread case AGPIOC_UNBIND: return agp_unbind_user(dev, (agp_unbind *)data); + case AGPIOC_CHIPSET_FLUSH: + return agp_chipset_flush(dev); } return EINVAL; diff --git a/sys/dev/agp/agp_i810.c b/sys/dev/agp/agp_i810.c index ff3ad1c614a..c0f592ce97f 100644 --- a/sys/dev/agp/agp_i810.c +++ b/sys/dev/agp/agp_i810.c @@ -1,8 +1,12 @@ /*- * Copyright (c) 2000 Doug Rabson * Copyright (c) 2000 Ruslan Ermilov + * Copyright (c) 2011 The FreeBSD Foundation * All rights reserved. * + * Portions of this software were developed by Konstantin Belousov + * under sponsorship from the FreeBSD Foundation. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -28,6 +32,9 @@ /* * Fixes for 830/845G support: David Dawes * 852GM/855GM/865G support added by David Dawes + * + * This is generic Intel GTT handling code, morphed from the AGP + * bridge code. */ #include @@ -35,10 +42,17 @@ __FBSDID("$FreeBSD$"); #include "opt_bus.h" +#if 0 +#define KTR_AGP_I810 KTR_DEV +#else +#define KTR_AGP_I810 0 +#endif + #include #include #include #include +#include #include #include #include @@ -47,8 +61,10 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include +#include #include #include @@ -63,6 +79,88 @@ __FBSDID("$FreeBSD$"); MALLOC_DECLARE(M_AGP); +struct agp_i810_match; + +static int agp_i810_check_active(device_t bridge_dev); +static int agp_i830_check_active(device_t bridge_dev); +static int agp_i915_check_active(device_t bridge_dev); +static int agp_sb_check_active(device_t bridge_dev); + +static void agp_82852_set_desc(device_t dev, + const struct agp_i810_match *match); +static void agp_i810_set_desc(device_t dev, const struct agp_i810_match *match); + +static void agp_i810_dump_regs(device_t dev); +static void agp_i830_dump_regs(device_t dev); +static void agp_i855_dump_regs(device_t dev); +static void agp_i915_dump_regs(device_t dev); +static void agp_i965_dump_regs(device_t dev); +static void agp_sb_dump_regs(device_t dev); + +static int agp_i810_get_stolen_size(device_t dev); +static int agp_i830_get_stolen_size(device_t dev); +static int agp_i915_get_stolen_size(device_t dev); +static int agp_sb_get_stolen_size(device_t dev); + +static int agp_i810_get_gtt_mappable_entries(device_t dev); +static int agp_i830_get_gtt_mappable_entries(device_t dev); +static int agp_i915_get_gtt_mappable_entries(device_t dev); + +static int agp_i810_get_gtt_total_entries(device_t dev); +static int agp_i965_get_gtt_total_entries(device_t dev); +static int agp_gen5_get_gtt_total_entries(device_t dev); +static int agp_sb_get_gtt_total_entries(device_t dev); + +static int agp_i810_install_gatt(device_t dev); +static int agp_i830_install_gatt(device_t dev); + +static void agp_i810_deinstall_gatt(device_t dev); +static void agp_i830_deinstall_gatt(device_t dev); + +static void agp_i810_install_gtt_pte(device_t dev, u_int index, + vm_offset_t physical, int flags); +static void agp_i830_install_gtt_pte(device_t dev, u_int index, + vm_offset_t physical, int flags); +static void agp_i915_install_gtt_pte(device_t dev, u_int index, + vm_offset_t physical, int flags); +static void agp_i965_install_gtt_pte(device_t dev, u_int index, + vm_offset_t physical, int flags); +static void agp_g4x_install_gtt_pte(device_t dev, u_int index, + vm_offset_t physical, int flags); +static void agp_sb_install_gtt_pte(device_t dev, u_int index, + vm_offset_t physical, int flags); + +static void agp_i810_write_gtt(device_t dev, u_int index, uint32_t pte); +static void agp_i915_write_gtt(device_t dev, u_int index, uint32_t pte); +static void agp_i965_write_gtt(device_t dev, u_int index, uint32_t pte); +static void agp_g4x_write_gtt(device_t dev, u_int index, uint32_t pte); +static void agp_sb_write_gtt(device_t dev, u_int index, uint32_t pte); + +static u_int32_t agp_i810_read_gtt_pte(device_t dev, u_int index); +static u_int32_t agp_i915_read_gtt_pte(device_t dev, u_int index); +static u_int32_t agp_i965_read_gtt_pte(device_t dev, u_int index); +static u_int32_t agp_g4x_read_gtt_pte(device_t dev, u_int index); + +static vm_paddr_t agp_i810_read_gtt_pte_paddr(device_t dev, u_int index); +static vm_paddr_t agp_i915_read_gtt_pte_paddr(device_t dev, u_int index); +static vm_paddr_t agp_sb_read_gtt_pte_paddr(device_t dev, u_int index); + +static int agp_i810_set_aperture(device_t dev, u_int32_t aperture); +static int agp_i830_set_aperture(device_t dev, u_int32_t aperture); +static int agp_i915_set_aperture(device_t dev, u_int32_t aperture); + +static int agp_i810_chipset_flush_setup(device_t dev); +static int agp_i915_chipset_flush_setup(device_t dev); +static int agp_i965_chipset_flush_setup(device_t dev); + +static void agp_i810_chipset_flush_teardown(device_t dev); +static void agp_i915_chipset_flush_teardown(device_t dev); +static void agp_i965_chipset_flush_teardown(device_t dev); + +static void agp_i810_chipset_flush(device_t dev); +static void agp_i830_chipset_flush(device_t dev); +static void agp_i915_chipset_flush(device_t dev); + enum { CHIP_I810, /* i810/i815 */ CHIP_I830, /* 830M/845G */ @@ -72,6 +170,7 @@ enum { CHIP_G33, /* G33/Q33/Q35 */ CHIP_IGD, /* Pineview */ CHIP_G4X, /* G45/Q45 */ + CHIP_SB, /* SandyBridge */ }; /* The i810 through i855 have the registers at BAR 1, and the GATT gets @@ -96,19 +195,308 @@ static struct resource_spec agp_i965_res_spec[] = { { -1, 0 } }; +static struct resource_spec agp_g4x_res_spec[] = { + { SYS_RES_MEMORY, AGP_G4X_MMADR, RF_ACTIVE | RF_SHAREABLE }, + { SYS_RES_MEMORY, AGP_G4X_GTTADR, RF_ACTIVE | RF_SHAREABLE }, + { -1, 0 } +}; + struct agp_i810_softc { struct agp_softc agp; u_int32_t initial_aperture; /* aperture size at startup */ struct agp_gatt *gatt; - int chiptype; /* i810-like or i830 */ u_int32_t dcache_size; /* i810 only */ - u_int32_t stolen; /* number of i830/845 gtt entries for stolen memory */ + u_int32_t stolen; /* number of i830/845 gtt + entries for stolen memory */ + u_int stolen_size; /* BIOS-reserved graphics memory */ + u_int gtt_total_entries; /* Total number of gtt ptes */ + u_int gtt_mappable_entries; /* Number of gtt ptes mappable by CPU */ device_t bdev; /* bridge device */ - void *argb_cursor; /* contigmalloc area for ARGB cursor */ - - struct resource_spec * sc_res_spec; struct resource *sc_res[2]; + const struct agp_i810_match *match; + int sc_flush_page_rid; + struct resource *sc_flush_page_res; + void *sc_flush_page_vaddr; + int sc_bios_allocated_flush_page; +}; + +static device_t intel_agp; + +struct agp_i810_driver { + int chiptype; + int gen; + int busdma_addr_mask_sz; + struct resource_spec *res_spec; + int (*check_active)(device_t); + void (*set_desc)(device_t, const struct agp_i810_match *); + void (*dump_regs)(device_t); + int (*get_stolen_size)(device_t); + int (*get_gtt_total_entries)(device_t); + int (*get_gtt_mappable_entries)(device_t); + int (*install_gatt)(device_t); + void (*deinstall_gatt)(device_t); + void (*write_gtt)(device_t, u_int, uint32_t); + void (*install_gtt_pte)(device_t, u_int, vm_offset_t, int); + u_int32_t (*read_gtt_pte)(device_t, u_int); + vm_paddr_t (*read_gtt_pte_paddr)(device_t , u_int); + int (*set_aperture)(device_t, u_int32_t); + int (*chipset_flush_setup)(device_t); + void (*chipset_flush_teardown)(device_t); + void (*chipset_flush)(device_t); +}; + +static const struct agp_i810_driver agp_i810_i810_driver = { + .chiptype = CHIP_I810, + .gen = 1, + .busdma_addr_mask_sz = 32, + .res_spec = agp_i810_res_spec, + .check_active = agp_i810_check_active, + .set_desc = agp_i810_set_desc, + .dump_regs = agp_i810_dump_regs, + .get_stolen_size = agp_i810_get_stolen_size, + .get_gtt_mappable_entries = agp_i810_get_gtt_mappable_entries, + .get_gtt_total_entries = agp_i810_get_gtt_total_entries, + .install_gatt = agp_i810_install_gatt, + .deinstall_gatt = agp_i810_deinstall_gatt, + .write_gtt = agp_i810_write_gtt, + .install_gtt_pte = agp_i810_install_gtt_pte, + .read_gtt_pte = agp_i810_read_gtt_pte, + .read_gtt_pte_paddr = agp_i810_read_gtt_pte_paddr, + .set_aperture = agp_i810_set_aperture, + .chipset_flush_setup = agp_i810_chipset_flush_setup, + .chipset_flush_teardown = agp_i810_chipset_flush_teardown, + .chipset_flush = agp_i810_chipset_flush, +}; + +static const struct agp_i810_driver agp_i810_i815_driver = { + .chiptype = CHIP_I810, + .gen = 2, + .busdma_addr_mask_sz = 32, + .res_spec = agp_i810_res_spec, + .check_active = agp_i810_check_active, + .set_desc = agp_i810_set_desc, + .dump_regs = agp_i810_dump_regs, + .get_stolen_size = agp_i810_get_stolen_size, + .get_gtt_mappable_entries = agp_i830_get_gtt_mappable_entries, + .get_gtt_total_entries = agp_i810_get_gtt_total_entries, + .install_gatt = agp_i810_install_gatt, + .deinstall_gatt = agp_i810_deinstall_gatt, + .write_gtt = agp_i810_write_gtt, + .install_gtt_pte = agp_i810_install_gtt_pte, + .read_gtt_pte = agp_i810_read_gtt_pte, + .read_gtt_pte_paddr = agp_i810_read_gtt_pte_paddr, + .set_aperture = agp_i810_set_aperture, + .chipset_flush_setup = agp_i810_chipset_flush_setup, + .chipset_flush_teardown = agp_i810_chipset_flush_teardown, + .chipset_flush = agp_i830_chipset_flush, +}; + +static const struct agp_i810_driver agp_i810_i830_driver = { + .chiptype = CHIP_I830, + .gen = 2, + .busdma_addr_mask_sz = 32, + .res_spec = agp_i810_res_spec, + .check_active = agp_i830_check_active, + .set_desc = agp_i810_set_desc, + .dump_regs = agp_i830_dump_regs, + .get_stolen_size = agp_i830_get_stolen_size, + .get_gtt_mappable_entries = agp_i830_get_gtt_mappable_entries, + .get_gtt_total_entries = agp_i810_get_gtt_total_entries, + .install_gatt = agp_i830_install_gatt, + .deinstall_gatt = agp_i830_deinstall_gatt, + .write_gtt = agp_i810_write_gtt, + .install_gtt_pte = agp_i830_install_gtt_pte, + .read_gtt_pte = agp_i810_read_gtt_pte, + .read_gtt_pte_paddr = agp_i810_read_gtt_pte_paddr, + .set_aperture = agp_i830_set_aperture, + .chipset_flush_setup = agp_i810_chipset_flush_setup, + .chipset_flush_teardown = agp_i810_chipset_flush_teardown, + .chipset_flush = agp_i830_chipset_flush, +}; + +static const struct agp_i810_driver agp_i810_i855_driver = { + .chiptype = CHIP_I855, + .gen = 2, + .busdma_addr_mask_sz = 32, + .res_spec = agp_i810_res_spec, + .check_active = agp_i830_check_active, + .set_desc = agp_82852_set_desc, + .dump_regs = agp_i855_dump_regs, + .get_stolen_size = agp_i915_get_stolen_size, + .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries, + .get_gtt_total_entries = agp_i810_get_gtt_total_entries, + .install_gatt = agp_i830_install_gatt, + .deinstall_gatt = agp_i830_deinstall_gatt, + .write_gtt = agp_i810_write_gtt, + .install_gtt_pte = agp_i830_install_gtt_pte, + .read_gtt_pte = agp_i810_read_gtt_pte, + .read_gtt_pte_paddr = agp_i810_read_gtt_pte_paddr, + .set_aperture = agp_i830_set_aperture, + .chipset_flush_setup = agp_i810_chipset_flush_setup, + .chipset_flush_teardown = agp_i810_chipset_flush_teardown, + .chipset_flush = agp_i830_chipset_flush, +}; + +static const struct agp_i810_driver agp_i810_i865_driver = { + .chiptype = CHIP_I855, + .gen = 2, + .busdma_addr_mask_sz = 32, + .res_spec = agp_i810_res_spec, + .check_active = agp_i830_check_active, + .set_desc = agp_i810_set_desc, + .dump_regs = agp_i855_dump_regs, + .get_stolen_size = agp_i915_get_stolen_size, + .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries, + .get_gtt_total_entries = agp_i810_get_gtt_total_entries, + .install_gatt = agp_i830_install_gatt, + .deinstall_gatt = agp_i830_deinstall_gatt, + .write_gtt = agp_i810_write_gtt, + .install_gtt_pte = agp_i830_install_gtt_pte, + .read_gtt_pte = agp_i810_read_gtt_pte, + .read_gtt_pte_paddr = agp_i810_read_gtt_pte_paddr, + .set_aperture = agp_i915_set_aperture, + .chipset_flush_setup = agp_i810_chipset_flush_setup, + .chipset_flush_teardown = agp_i810_chipset_flush_teardown, + .chipset_flush = agp_i830_chipset_flush, +}; + +static const struct agp_i810_driver agp_i810_i915_driver = { + .chiptype = CHIP_I915, + .gen = 3, + .busdma_addr_mask_sz = 32, + .res_spec = agp_i915_res_spec, + .check_active = agp_i915_check_active, + .set_desc = agp_i810_set_desc, + .dump_regs = agp_i915_dump_regs, + .get_stolen_size = agp_i915_get_stolen_size, + .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries, + .get_gtt_total_entries = agp_i810_get_gtt_total_entries, + .install_gatt = agp_i830_install_gatt, + .deinstall_gatt = agp_i830_deinstall_gatt, + .write_gtt = agp_i915_write_gtt, + .install_gtt_pte = agp_i915_install_gtt_pte, + .read_gtt_pte = agp_i915_read_gtt_pte, + .read_gtt_pte_paddr = agp_i915_read_gtt_pte_paddr, + .set_aperture = agp_i915_set_aperture, + .chipset_flush_setup = agp_i915_chipset_flush_setup, + .chipset_flush_teardown = agp_i915_chipset_flush_teardown, + .chipset_flush = agp_i915_chipset_flush, +}; + +static const struct agp_i810_driver agp_i810_g965_driver = { + .chiptype = CHIP_I965, + .gen = 4, + .busdma_addr_mask_sz = 36, + .res_spec = agp_i965_res_spec, + .check_active = agp_i915_check_active, + .set_desc = agp_i810_set_desc, + .dump_regs = agp_i965_dump_regs, + .get_stolen_size = agp_i915_get_stolen_size, + .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries, + .get_gtt_total_entries = agp_i965_get_gtt_total_entries, + .install_gatt = agp_i830_install_gatt, + .deinstall_gatt = agp_i830_deinstall_gatt, + .write_gtt = agp_i965_write_gtt, + .install_gtt_pte = agp_i965_install_gtt_pte, + .read_gtt_pte = agp_i965_read_gtt_pte, + .read_gtt_pte_paddr = agp_i915_read_gtt_pte_paddr, + .set_aperture = agp_i915_set_aperture, + .chipset_flush_setup = agp_i965_chipset_flush_setup, + .chipset_flush_teardown = agp_i965_chipset_flush_teardown, + .chipset_flush = agp_i915_chipset_flush, +}; + +static const struct agp_i810_driver agp_i810_g33_driver = { + .chiptype = CHIP_G33, + .gen = 3, + .busdma_addr_mask_sz = 36, + .res_spec = agp_i915_res_spec, + .check_active = agp_i915_check_active, + .set_desc = agp_i810_set_desc, + .dump_regs = agp_i965_dump_regs, + .get_stolen_size = agp_i915_get_stolen_size, + .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries, + .get_gtt_total_entries = agp_i965_get_gtt_total_entries, + .install_gatt = agp_i830_install_gatt, + .deinstall_gatt = agp_i830_deinstall_gatt, + .write_gtt = agp_i915_write_gtt, + .install_gtt_pte = agp_i915_install_gtt_pte, + .read_gtt_pte = agp_i915_read_gtt_pte, + .read_gtt_pte_paddr = agp_i915_read_gtt_pte_paddr, + .set_aperture = agp_i915_set_aperture, + .chipset_flush_setup = agp_i965_chipset_flush_setup, + .chipset_flush_teardown = agp_i965_chipset_flush_teardown, + .chipset_flush = agp_i915_chipset_flush, +}; + +static const struct agp_i810_driver agp_i810_igd_driver = { + .chiptype = CHIP_IGD, + .gen = 3, + .busdma_addr_mask_sz = 36, + .res_spec = agp_i915_res_spec, + .check_active = agp_i915_check_active, + .set_desc = agp_i810_set_desc, + .dump_regs = agp_i915_dump_regs, + .get_stolen_size = agp_i915_get_stolen_size, + .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries, + .get_gtt_total_entries = agp_i965_get_gtt_total_entries, + .install_gatt = agp_i830_install_gatt, + .deinstall_gatt = agp_i830_deinstall_gatt, + .write_gtt = agp_i915_write_gtt, + .install_gtt_pte = agp_i915_install_gtt_pte, + .read_gtt_pte = agp_i915_read_gtt_pte, + .read_gtt_pte_paddr = agp_i915_read_gtt_pte_paddr, + .set_aperture = agp_i915_set_aperture, + .chipset_flush_setup = agp_i965_chipset_flush_setup, + .chipset_flush_teardown = agp_i965_chipset_flush_teardown, + .chipset_flush = agp_i915_chipset_flush, +}; + +static const struct agp_i810_driver agp_i810_g4x_driver = { + .chiptype = CHIP_G4X, + .gen = 5, + .busdma_addr_mask_sz = 36, + .res_spec = agp_i965_res_spec, + .check_active = agp_i915_check_active, + .set_desc = agp_i810_set_desc, + .dump_regs = agp_i965_dump_regs, + .get_stolen_size = agp_i915_get_stolen_size, + .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries, + .get_gtt_total_entries = agp_gen5_get_gtt_total_entries, + .install_gatt = agp_i830_install_gatt, + .deinstall_gatt = agp_i830_deinstall_gatt, + .write_gtt = agp_g4x_write_gtt, + .install_gtt_pte = agp_g4x_install_gtt_pte, + .read_gtt_pte = agp_g4x_read_gtt_pte, + .read_gtt_pte_paddr = agp_i915_read_gtt_pte_paddr, + .set_aperture = agp_i915_set_aperture, + .chipset_flush_setup = agp_i965_chipset_flush_setup, + .chipset_flush_teardown = agp_i965_chipset_flush_teardown, + .chipset_flush = agp_i915_chipset_flush, +}; + +static const struct agp_i810_driver agp_i810_sb_driver = { + .chiptype = CHIP_SB, + .gen = 6, + .busdma_addr_mask_sz = 40, + .res_spec = agp_g4x_res_spec, + .check_active = agp_sb_check_active, + .set_desc = agp_i810_set_desc, + .dump_regs = agp_sb_dump_regs, + .get_stolen_size = agp_sb_get_stolen_size, + .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries, + .get_gtt_total_entries = agp_sb_get_gtt_total_entries, + .install_gatt = agp_i830_install_gatt, + .deinstall_gatt = agp_i830_deinstall_gatt, + .write_gtt = agp_sb_write_gtt, + .install_gtt_pte = agp_sb_install_gtt_pte, + .read_gtt_pte = agp_g4x_read_gtt_pte, + .read_gtt_pte_paddr = agp_sb_read_gtt_pte_paddr, + .set_aperture = agp_i915_set_aperture, + .chipset_flush_setup = agp_i810_chipset_flush_setup, + .chipset_flush_teardown = agp_i810_chipset_flush_teardown, + .chipset_flush = agp_i810_chipset_flush, }; /* For adding new devices, devid is the id of the graphics controller @@ -118,75 +506,232 @@ struct agp_i810_softc { */ static const struct agp_i810_match { int devid; - int chiptype; - int bridge_offset; char *name; + const struct agp_i810_driver *driver; } agp_i810_matches[] = { - {0x71218086, CHIP_I810, 0x00010000, - "Intel 82810 (i810 GMCH) SVGA controller"}, - {0x71238086, CHIP_I810, 0x00010000, - "Intel 82810-DC100 (i810-DC100 GMCH) SVGA controller"}, - {0x71258086, CHIP_I810, 0x00010000, - "Intel 82810E (i810E GMCH) SVGA controller"}, - {0x11328086, CHIP_I810, 0x00020000, - "Intel 82815 (i815 GMCH) SVGA controller"}, - {0x35778086, CHIP_I830, 0x00020000, - "Intel 82830M (830M GMCH) SVGA controller"}, - {0x25628086, CHIP_I830, 0x00020000, - "Intel 82845M (845M GMCH) SVGA controller"}, - {0x35828086, CHIP_I855, 0x00020000, - "Intel 82852/855GM SVGA controller"}, - {0x25728086, CHIP_I855, 0x00020000, - "Intel 82865G (865G GMCH) SVGA controller"}, - {0x25828086, CHIP_I915, 0x00020000, - "Intel 82915G (915G GMCH) SVGA controller"}, - {0x258A8086, CHIP_I915, 0x00020000, - "Intel E7221 SVGA controller"}, - {0x25928086, CHIP_I915, 0x00020000, - "Intel 82915GM (915GM GMCH) SVGA controller"}, - {0x27728086, CHIP_I915, 0x00020000, - "Intel 82945G (945G GMCH) SVGA controller"}, - {0x27A28086, CHIP_I915, 0x00020000, - "Intel 82945GM (945GM GMCH) SVGA controller"}, - {0x27AE8086, CHIP_I915, 0x00020000, - "Intel 945GME SVGA controller"}, - {0x29728086, CHIP_I965, 0x00020000, - "Intel 946GZ SVGA controller"}, - {0x29828086, CHIP_I965, 0x00020000, - "Intel G965 SVGA controller"}, - {0x29928086, CHIP_I965, 0x00020000, - "Intel Q965 SVGA controller"}, - {0x29A28086, CHIP_I965, 0x00020000, - "Intel G965 SVGA controller"}, - {0x29B28086, CHIP_G33, 0x00020000, - "Intel Q35 SVGA controller"}, - {0x29C28086, CHIP_G33, 0x00020000, - "Intel G33 SVGA controller"}, - {0x29D28086, CHIP_G33, 0x00020000, - "Intel Q33 SVGA controller"}, - {0xA0018086, CHIP_IGD, 0x00010000, - "Intel Pineview SVGA controller"}, - {0xA0118086, CHIP_IGD, 0x00010000, - "Intel Pineview (M) SVGA controller"}, - {0x2A028086, CHIP_I965, 0x00020000, - "Intel GM965 SVGA controller"}, - {0x2A128086, CHIP_I965, 0x00020000, - "Intel GME965 SVGA controller"}, - {0x2A428086, CHIP_G4X, 0x00020000, - "Intel GM45 SVGA controller"}, - {0x2E028086, CHIP_G4X, 0x00020000, - "Intel Eaglelake SVGA controller"}, - {0x2E128086, CHIP_G4X, 0x00020000, - "Intel Q45 SVGA controller"}, - {0x2E228086, CHIP_G4X, 0x00020000, - "Intel G45 SVGA controller"}, - {0x2E328086, CHIP_G4X, 0x00020000, - "Intel G41 SVGA controller"}, - {0x00428086, CHIP_G4X, 0x00020000, - "Intel Ironlake (D) SVGA controller"}, - {0x00468086, CHIP_G4X, 0x00020000, - "Intel Ironlake (M) SVGA controller"}, - {0, 0, 0, NULL} + { + .devid = 0x71218086, + .name = "Intel 82810 (i810 GMCH) SVGA controller", + .driver = &agp_i810_i810_driver + }, + { + .devid = 0x71238086, + .name = "Intel 82810-DC100 (i810-DC100 GMCH) SVGA controller", + .driver = &agp_i810_i810_driver + }, + { + .devid = 0x71258086, + .name = "Intel 82810E (i810E GMCH) SVGA controller", + .driver = &agp_i810_i810_driver + }, + { + .devid = 0x11328086, + .name = "Intel 82815 (i815 GMCH) SVGA controller", + .driver = &agp_i810_i815_driver + }, + { + .devid = 0x35778086, + .name = "Intel 82830M (830M GMCH) SVGA controller", + .driver = &agp_i810_i830_driver + }, + { + .devid = 0x25628086, + .name = "Intel 82845M (845M GMCH) SVGA controller", + .driver = &agp_i810_i830_driver + }, + { + .devid = 0x35828086, + .name = "Intel 82852/855GM SVGA controller", + .driver = &agp_i810_i855_driver + }, + { + .devid = 0x25728086, + .name = "Intel 82865G (865G GMCH) SVGA controller", + .driver = &agp_i810_i865_driver + }, + { + .devid = 0x25828086, + .name = "Intel 82915G (915G GMCH) SVGA controller", + .driver = &agp_i810_i915_driver + }, + { + .devid = 0x258A8086, + .name = "Intel E7221 SVGA controller", + .driver = &agp_i810_i915_driver + }, + { + .devid = 0x25928086, + .name = "Intel 82915GM (915GM GMCH) SVGA controller", + .driver = &agp_i810_i915_driver + }, + { + .devid = 0x27728086, + .name = "Intel 82945G (945G GMCH) SVGA controller", + .driver = &agp_i810_i915_driver + }, + { + .devid = 0x27A28086, + .name = "Intel 82945GM (945GM GMCH) SVGA controller", + .driver = &agp_i810_i915_driver + }, + { + .devid = 0x27AE8086, + .name = "Intel 945GME SVGA controller", + .driver = &agp_i810_i915_driver + }, + { + .devid = 0x29728086, + .name = "Intel 946GZ SVGA controller", + .driver = &agp_i810_g965_driver + }, + { + .devid = 0x29828086, + .name = "Intel G965 SVGA controller", + .driver = &agp_i810_g965_driver + }, + { + .devid = 0x29928086, + .name = "Intel Q965 SVGA controller", + .driver = &agp_i810_g965_driver + }, + { + .devid = 0x29A28086, + .name = "Intel G965 SVGA controller", + .driver = &agp_i810_g965_driver + }, + { + .devid = 0x29B28086, + .name = "Intel Q35 SVGA controller", + .driver = &agp_i810_g33_driver + }, + { + .devid = 0x29C28086, + .name = "Intel G33 SVGA controller", + .driver = &agp_i810_g33_driver + }, + { + .devid = 0x29D28086, + .name = "Intel Q33 SVGA controller", + .driver = &agp_i810_g33_driver + }, + { + .devid = 0xA0018086, + .name = "Intel Pineview SVGA controller", + .driver = &agp_i810_igd_driver + }, + { + .devid = 0xA0118086, + .name = "Intel Pineview (M) SVGA controller", + .driver = &agp_i810_igd_driver + }, + { + .devid = 0x2A028086, + .name = "Intel GM965 SVGA controller", + .driver = &agp_i810_g965_driver + }, + { + .devid = 0x2A128086, + .name = "Intel GME965 SVGA controller", + .driver = &agp_i810_g965_driver + }, + { + .devid = 0x2A428086, + .name = "Intel GM45 SVGA controller", + .driver = &agp_i810_g4x_driver + }, + { + .devid = 0x2E028086, + .name = "Intel Eaglelake SVGA controller", + .driver = &agp_i810_g4x_driver + }, + { + .devid = 0x2E128086, + .name = "Intel Q45 SVGA controller", + .driver = &agp_i810_g4x_driver + }, + { + .devid = 0x2E228086, + .name = "Intel G45 SVGA controller", + .driver = &agp_i810_g4x_driver + }, + { + .devid = 0x2E328086, + .name = "Intel G41 SVGA controller", + .driver = &agp_i810_g4x_driver + }, + { + .devid = 0x00428086, + .name = "Intel Ironlake (D) SVGA controller", + .driver = &agp_i810_g4x_driver + }, + { + .devid = 0x00468086, + .name = "Intel Ironlake (M) SVGA controller", + .driver = &agp_i810_g4x_driver + }, + { + .devid = 0x01028086, + .name = "SandyBridge desktop GT1 IG", + .driver = &agp_i810_sb_driver + }, + { + .devid = 0x01128086, + .name = "SandyBridge desktop GT2 IG", + .driver = &agp_i810_sb_driver + }, + { + .devid = 0x01228086, + .name = "SandyBridge desktop GT2+ IG", + .driver = &agp_i810_sb_driver + }, + { + .devid = 0x01068086, + .name = "SandyBridge mobile GT1 IG", + .driver = &agp_i810_sb_driver + }, + { + .devid = 0x01168086, + .name = "SandyBridge mobile GT2 IG", + .driver = &agp_i810_sb_driver + }, + { + .devid = 0x01268086, + .name = "SandyBridge mobile GT2+ IG", + .driver = &agp_i810_sb_driver + }, + { + .devid = 0x010a8086, + .name = "SandyBridge server IG", + .driver = &agp_i810_sb_driver + }, + { + .devid = 0x01528086, + .name = "IvyBridge desktop GT1 IG", + .driver = &agp_i810_sb_driver + }, + { + .devid = 0x01628086, + .name = "IvyBridge desktop GT2 IG", + .driver = &agp_i810_sb_driver + }, + { + .devid = 0x01568086, + .name = "IvyBridge mobile GT1 IG", + .driver = &agp_i810_sb_driver + }, + { + .devid = 0x01668086, + .name = "IvyBridge mobile GT2 IG", + .driver = &agp_i810_sb_driver + }, + { + .devid = 0x015a8086, + .name = "IvyBridge server GT1 IG", + .driver = &agp_i810_sb_driver + }, + { + .devid = 0, + } }; static const struct agp_i810_match* @@ -196,17 +741,17 @@ agp_i810_match(device_t dev) if (pci_get_class(dev) != PCIC_DISPLAY || pci_get_subclass(dev) != PCIS_DISPLAY_VGA) - return NULL; + return (NULL); devid = pci_get_devid(dev); for (i = 0; agp_i810_matches[i].devid != 0; i++) { if (agp_i810_matches[i].devid == devid) - break; + break; } if (agp_i810_matches[i].devid == 0) - return NULL; + return (NULL); else - return &agp_i810_matches[i]; + return (&agp_i810_matches[i]); } /* @@ -215,28 +760,8 @@ agp_i810_match(device_t dev) static device_t agp_i810_find_bridge(device_t dev) { - device_t *children, child; - int nchildren, i; - u_int32_t devid; - const struct agp_i810_match *match; - - match = agp_i810_match(dev); - devid = match->devid - match->bridge_offset; - if (device_get_children(device_get_parent(device_get_parent(dev)), - &children, &nchildren)) - return 0; - - for (i = 0; i < nchildren; i++) { - child = children[i]; - - if (pci_get_devid(child) == devid) { - free(children, M_TEMP); - return child; - } - } - free(children, M_TEMP); - return 0; + return (pci_find_dbsf(0, 0, 0, 0)); } static void @@ -248,93 +773,117 @@ agp_i810_identify(driver_t *driver, device_t parent) device_add_child(parent, "agp", -1); } +static int +agp_i810_check_active(device_t bridge_dev) +{ + u_int8_t smram; + + smram = pci_read_config(bridge_dev, AGP_I810_SMRAM, 1); + if ((smram & AGP_I810_SMRAM_GMS) == AGP_I810_SMRAM_GMS_DISABLED) + return (ENXIO); + return (0); +} + +static int +agp_i830_check_active(device_t bridge_dev) +{ + int gcc1; + + gcc1 = pci_read_config(bridge_dev, AGP_I830_GCC1, 1); + if ((gcc1 & AGP_I830_GCC1_DEV2) == AGP_I830_GCC1_DEV2_DISABLED) + return (ENXIO); + return (0); +} + +static int +agp_i915_check_active(device_t bridge_dev) +{ + int deven; + + deven = pci_read_config(bridge_dev, AGP_I915_DEVEN, 4); + if ((deven & AGP_I915_DEVEN_D2F0) == AGP_I915_DEVEN_D2F0_DISABLED) + return (ENXIO); + return (0); +} + +static int +agp_sb_check_active(device_t bridge_dev) +{ + int deven; + + deven = pci_read_config(bridge_dev, AGP_I915_DEVEN, 4); + if ((deven & AGP_SB_DEVEN_D2EN) == AGP_SB_DEVEN_D2EN_DISABLED) + return (ENXIO); + return (0); +} + +static void +agp_82852_set_desc(device_t dev, const struct agp_i810_match *match) +{ + + switch (pci_read_config(dev, AGP_I85X_CAPID, 1)) { + case AGP_I855_GME: + device_set_desc(dev, + "Intel 82855GME (855GME GMCH) SVGA controller"); + break; + case AGP_I855_GM: + device_set_desc(dev, + "Intel 82855GM (855GM GMCH) SVGA controller"); + break; + case AGP_I852_GME: + device_set_desc(dev, + "Intel 82852GME (852GME GMCH) SVGA controller"); + break; + case AGP_I852_GM: + device_set_desc(dev, + "Intel 82852GM (852GM GMCH) SVGA controller"); + break; + default: + device_set_desc(dev, + "Intel 8285xM (85xGM GMCH) SVGA controller"); + break; + } +} + +static void +agp_i810_set_desc(device_t dev, const struct agp_i810_match *match) +{ + + device_set_desc(dev, match->name); +} + static int agp_i810_probe(device_t dev) { device_t bdev; const struct agp_i810_match *match; - u_int8_t smram; - int gcc1, deven; + int err; if (resource_disabled("agp", device_get_unit(dev))) return (ENXIO); match = agp_i810_match(dev); if (match == NULL) - return ENXIO; + return (ENXIO); bdev = agp_i810_find_bridge(dev); - if (!bdev) { + if (bdev == NULL) { if (bootverbose) printf("I810: can't find bridge device\n"); - return ENXIO; + return (ENXIO); } /* * checking whether internal graphics device has been activated. */ - switch (match->chiptype) { - case CHIP_I810: - smram = pci_read_config(bdev, AGP_I810_SMRAM, 1); - if ((smram & AGP_I810_SMRAM_GMS) == - AGP_I810_SMRAM_GMS_DISABLED) { - if (bootverbose) - printf("I810: disabled, not probing\n"); - return ENXIO; - } - break; - case CHIP_I830: - case CHIP_I855: - gcc1 = pci_read_config(bdev, AGP_I830_GCC1, 1); - if ((gcc1 & AGP_I830_GCC1_DEV2) == - AGP_I830_GCC1_DEV2_DISABLED) { - if (bootverbose) - printf("I830: disabled, not probing\n"); - return ENXIO; - } - break; - case CHIP_I915: - case CHIP_I965: - case CHIP_G33: - case CHIP_IGD: - case CHIP_G4X: - deven = pci_read_config(bdev, AGP_I915_DEVEN, 4); - if ((deven & AGP_I915_DEVEN_D2F0) == - AGP_I915_DEVEN_D2F0_DISABLED) { - if (bootverbose) - printf("I915: disabled, not probing\n"); - return ENXIO; - } - break; + err = match->driver->check_active(bdev); + if (err != 0) { + if (bootverbose) + printf("i810: disabled, not probing\n"); + return (err); } - if (match->devid == 0x35828086) { - switch (pci_read_config(dev, AGP_I85X_CAPID, 1)) { - case AGP_I855_GME: - device_set_desc(dev, - "Intel 82855GME (855GME GMCH) SVGA controller"); - break; - case AGP_I855_GM: - device_set_desc(dev, - "Intel 82855GM (855GM GMCH) SVGA controller"); - break; - case AGP_I852_GME: - device_set_desc(dev, - "Intel 82852GME (852GME GMCH) SVGA controller"); - break; - case AGP_I852_GM: - device_set_desc(dev, - "Intel 82852GM (852GM GMCH) SVGA controller"); - break; - default: - device_set_desc(dev, - "Intel 8285xM (85xGM GMCH) SVGA controller"); - break; - } - } else { - device_set_desc(dev, match->name); - } - - return BUS_PROBE_DEFAULT; + match->driver->set_desc(dev, match); + return (BUS_PROBE_DEFAULT); } static void @@ -344,391 +893,641 @@ agp_i810_dump_regs(device_t dev) device_printf(dev, "AGP_I810_PGTBL_CTL: %08x\n", bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL)); + device_printf(dev, "AGP_I810_MISCC: 0x%04x\n", + pci_read_config(sc->bdev, AGP_I810_MISCC, 2)); +} - switch (sc->chiptype) { - case CHIP_I810: - device_printf(dev, "AGP_I810_MISCC: 0x%04x\n", - pci_read_config(sc->bdev, AGP_I810_MISCC, 2)); +static void +agp_i830_dump_regs(device_t dev) +{ + struct agp_i810_softc *sc = device_get_softc(dev); + + device_printf(dev, "AGP_I810_PGTBL_CTL: %08x\n", + bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL)); + device_printf(dev, "AGP_I830_GCC1: 0x%02x\n", + pci_read_config(sc->bdev, AGP_I830_GCC1, 1)); +} + +static void +agp_i855_dump_regs(device_t dev) +{ + struct agp_i810_softc *sc = device_get_softc(dev); + + device_printf(dev, "AGP_I810_PGTBL_CTL: %08x\n", + bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL)); + device_printf(dev, "AGP_I855_GCC1: 0x%02x\n", + pci_read_config(sc->bdev, AGP_I855_GCC1, 1)); +} + +static void +agp_i915_dump_regs(device_t dev) +{ + struct agp_i810_softc *sc = device_get_softc(dev); + + device_printf(dev, "AGP_I810_PGTBL_CTL: %08x\n", + bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL)); + device_printf(dev, "AGP_I855_GCC1: 0x%02x\n", + pci_read_config(sc->bdev, AGP_I855_GCC1, 1)); + device_printf(dev, "AGP_I915_MSAC: 0x%02x\n", + pci_read_config(sc->bdev, AGP_I915_MSAC, 1)); +} + +static void +agp_i965_dump_regs(device_t dev) +{ + struct agp_i810_softc *sc = device_get_softc(dev); + + device_printf(dev, "AGP_I965_PGTBL_CTL2: %08x\n", + bus_read_4(sc->sc_res[0], AGP_I965_PGTBL_CTL2)); + device_printf(dev, "AGP_I855_GCC1: 0x%02x\n", + pci_read_config(sc->bdev, AGP_I855_GCC1, 1)); + device_printf(dev, "AGP_I965_MSAC: 0x%02x\n", + pci_read_config(sc->bdev, AGP_I965_MSAC, 1)); +} + +static void +agp_sb_dump_regs(device_t dev) +{ + struct agp_i810_softc *sc = device_get_softc(dev); + + device_printf(dev, "AGP_SNB_GFX_MODE: %08x\n", + bus_read_4(sc->sc_res[0], AGP_SNB_GFX_MODE)); + device_printf(dev, "AGP_SNB_GCC1: 0x%04x\n", + pci_read_config(sc->bdev, AGP_SNB_GCC1, 2)); +} + +static int +agp_i810_get_stolen_size(device_t dev) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(dev); + sc->stolen = 0; + sc->stolen_size = 0; + return (0); +} + +static int +agp_i830_get_stolen_size(device_t dev) +{ + struct agp_i810_softc *sc; + unsigned int gcc1; + + sc = device_get_softc(dev); + + gcc1 = pci_read_config(sc->bdev, AGP_I830_GCC1, 1); + switch (gcc1 & AGP_I830_GCC1_GMS) { + case AGP_I830_GCC1_GMS_STOLEN_512: + sc->stolen = (512 - 132) * 1024 / 4096; + sc->stolen_size = 512 * 1024; break; - case CHIP_I830: - device_printf(dev, "AGP_I830_GCC1: 0x%02x\n", - pci_read_config(sc->bdev, AGP_I830_GCC1, 1)); + case AGP_I830_GCC1_GMS_STOLEN_1024: + sc->stolen = (1024 - 132) * 1024 / 4096; + sc->stolen_size = 1024 * 1024; break; + case AGP_I830_GCC1_GMS_STOLEN_8192: + sc->stolen = (8192 - 132) * 1024 / 4096; + sc->stolen_size = 8192 * 1024; + break; + default: + sc->stolen = 0; + device_printf(dev, + "unknown memory configuration, disabling (GCC1 %x)\n", + gcc1); + return (EINVAL); + } + return (0); +} + +static int +agp_i915_get_stolen_size(device_t dev) +{ + struct agp_i810_softc *sc; + unsigned int gcc1, stolen, gtt_size; + + sc = device_get_softc(dev); + + /* + * Stolen memory is set up at the beginning of the aperture by + * the BIOS, consisting of the GATT followed by 4kb for the + * BIOS display. + */ + switch (sc->match->driver->chiptype) { case CHIP_I855: - device_printf(dev, "AGP_I855_GCC1: 0x%02x\n", - pci_read_config(sc->bdev, AGP_I855_GCC1, 1)); + gtt_size = 128; break; case CHIP_I915: + gtt_size = 256; + break; case CHIP_I965: + switch (bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL) & + AGP_I810_PGTBL_SIZE_MASK) { + case AGP_I810_PGTBL_SIZE_128KB: + gtt_size = 128; + break; + case AGP_I810_PGTBL_SIZE_256KB: + gtt_size = 256; + break; + case AGP_I810_PGTBL_SIZE_512KB: + gtt_size = 512; + break; + case AGP_I965_PGTBL_SIZE_1MB: + gtt_size = 1024; + break; + case AGP_I965_PGTBL_SIZE_2MB: + gtt_size = 2048; + break; + case AGP_I965_PGTBL_SIZE_1_5MB: + gtt_size = 1024 + 512; + break; + default: + device_printf(dev, "Bad PGTBL size\n"); + return (EINVAL); + } + break; case CHIP_G33: + gcc1 = pci_read_config(sc->bdev, AGP_I855_GCC1, 2); + switch (gcc1 & AGP_G33_MGGC_GGMS_MASK) { + case AGP_G33_MGGC_GGMS_SIZE_1M: + gtt_size = 1024; + break; + case AGP_G33_MGGC_GGMS_SIZE_2M: + gtt_size = 2048; + break; + default: + device_printf(dev, "Bad PGTBL size\n"); + return (EINVAL); + } + break; case CHIP_IGD: case CHIP_G4X: - device_printf(dev, "AGP_I855_GCC1: 0x%02x\n", - pci_read_config(sc->bdev, AGP_I855_GCC1, 1)); - device_printf(dev, "AGP_I915_MSAC: 0x%02x\n", - pci_read_config(sc->bdev, AGP_I915_MSAC, 1)); + gtt_size = 0; + break; + default: + device_printf(dev, "Bad chiptype\n"); + return (EINVAL); + } + + /* GCC1 is called MGGC on i915+ */ + gcc1 = pci_read_config(sc->bdev, AGP_I855_GCC1, 1); + switch (gcc1 & AGP_I855_GCC1_GMS) { + case AGP_I855_GCC1_GMS_STOLEN_1M: + stolen = 1024; + break; + case AGP_I855_GCC1_GMS_STOLEN_4M: + stolen = 4 * 1024; + break; + case AGP_I855_GCC1_GMS_STOLEN_8M: + stolen = 8 * 1024; + break; + case AGP_I855_GCC1_GMS_STOLEN_16M: + stolen = 16 * 1024; + break; + case AGP_I855_GCC1_GMS_STOLEN_32M: + stolen = 32 * 1024; + break; + case AGP_I915_GCC1_GMS_STOLEN_48M: + stolen = sc->match->driver->gen > 2 ? 48 * 1024 : 0; + break; + case AGP_I915_GCC1_GMS_STOLEN_64M: + stolen = sc->match->driver->gen > 2 ? 64 * 1024 : 0; + break; + case AGP_G33_GCC1_GMS_STOLEN_128M: + stolen = sc->match->driver->gen > 2 ? 128 * 1024 : 0; + break; + case AGP_G33_GCC1_GMS_STOLEN_256M: + stolen = sc->match->driver->gen > 2 ? 256 * 1024 : 0; + break; + case AGP_G4X_GCC1_GMS_STOLEN_96M: + if (sc->match->driver->chiptype == CHIP_I965 || + sc->match->driver->chiptype == CHIP_G4X) + stolen = 96 * 1024; + else + stolen = 0; + break; + case AGP_G4X_GCC1_GMS_STOLEN_160M: + if (sc->match->driver->chiptype == CHIP_I965 || + sc->match->driver->chiptype == CHIP_G4X) + stolen = 160 * 1024; + else + stolen = 0; + break; + case AGP_G4X_GCC1_GMS_STOLEN_224M: + if (sc->match->driver->chiptype == CHIP_I965 || + sc->match->driver->chiptype == CHIP_G4X) + stolen = 224 * 1024; + else + stolen = 0; + break; + case AGP_G4X_GCC1_GMS_STOLEN_352M: + if (sc->match->driver->chiptype == CHIP_I965 || + sc->match->driver->chiptype == CHIP_G4X) + stolen = 352 * 1024; + else + stolen = 0; + break; + default: + device_printf(dev, + "unknown memory configuration, disabling (GCC1 %x)\n", + gcc1); + return (EINVAL); + } + + gtt_size += 4; + sc->stolen_size = stolen * 1024; + sc->stolen = (stolen - gtt_size) * 1024 / 4096; + + return (0); +} + +static int +agp_sb_get_stolen_size(device_t dev) +{ + struct agp_i810_softc *sc; + uint16_t gmch_ctl; + + sc = device_get_softc(dev); + gmch_ctl = pci_read_config(sc->bdev, AGP_SNB_GCC1, 2); + switch (gmch_ctl & AGP_SNB_GMCH_GMS_STOLEN_MASK) { + case AGP_SNB_GMCH_GMS_STOLEN_32M: + sc->stolen_size = 32 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_64M: + sc->stolen_size = 64 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_96M: + sc->stolen_size = 96 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_128M: + sc->stolen_size = 128 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_160M: + sc->stolen_size = 160 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_192M: + sc->stolen_size = 192 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_224M: + sc->stolen_size = 224 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_256M: + sc->stolen_size = 256 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_288M: + sc->stolen_size = 288 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_320M: + sc->stolen_size = 320 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_352M: + sc->stolen_size = 352 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_384M: + sc->stolen_size = 384 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_416M: + sc->stolen_size = 416 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_448M: + sc->stolen_size = 448 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_480M: + sc->stolen_size = 480 * 1024 * 1024; + break; + case AGP_SNB_GMCH_GMS_STOLEN_512M: + sc->stolen_size = 512 * 1024 * 1024; break; } - device_printf(dev, "Aperture resource size: %d bytes\n", - AGP_GET_APERTURE(dev)); + sc->stolen = (sc->stolen_size - 4) / 4096; + return (0); +} + +static int +agp_i810_get_gtt_mappable_entries(device_t dev) +{ + struct agp_i810_softc *sc; + uint32_t ap; + uint16_t miscc; + + sc = device_get_softc(dev); + miscc = pci_read_config(sc->bdev, AGP_I810_MISCC, 2); + if ((miscc & AGP_I810_MISCC_WINSIZE) == AGP_I810_MISCC_WINSIZE_32) + ap = 32; + else + ap = 64; + sc->gtt_mappable_entries = (ap * 1024 * 1024) >> AGP_PAGE_SHIFT; + return (0); +} + +static int +agp_i830_get_gtt_mappable_entries(device_t dev) +{ + struct agp_i810_softc *sc; + uint32_t ap; + uint16_t gmch_ctl; + + sc = device_get_softc(dev); + gmch_ctl = pci_read_config(sc->bdev, AGP_I830_GCC1, 2); + if ((gmch_ctl & AGP_I830_GCC1_GMASIZE) == AGP_I830_GCC1_GMASIZE_64) + ap = 64; + else + ap = 128; + sc->gtt_mappable_entries = (ap * 1024 * 1024) >> AGP_PAGE_SHIFT; + return (0); +} + +static int +agp_i915_get_gtt_mappable_entries(device_t dev) +{ + struct agp_i810_softc *sc; + uint32_t ap; + + sc = device_get_softc(dev); + ap = AGP_GET_APERTURE(dev); + sc->gtt_mappable_entries = ap >> AGP_PAGE_SHIFT; + return (0); +} + +static int +agp_i810_get_gtt_total_entries(device_t dev) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(dev); + sc->gtt_total_entries = sc->gtt_mappable_entries; + return (0); +} + +static int +agp_i965_get_gtt_total_entries(device_t dev) +{ + struct agp_i810_softc *sc; + uint32_t pgetbl_ctl; + int error; + + sc = device_get_softc(dev); + error = 0; + pgetbl_ctl = bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL); + switch (pgetbl_ctl & AGP_I810_PGTBL_SIZE_MASK) { + case AGP_I810_PGTBL_SIZE_128KB: + sc->gtt_total_entries = 128 * 1024 / 4; + break; + case AGP_I810_PGTBL_SIZE_256KB: + sc->gtt_total_entries = 256 * 1024 / 4; + break; + case AGP_I810_PGTBL_SIZE_512KB: + sc->gtt_total_entries = 512 * 1024 / 4; + break; + /* GTT pagetable sizes bigger than 512KB are not possible on G33! */ + case AGP_I810_PGTBL_SIZE_1MB: + sc->gtt_total_entries = 1024 * 1024 / 4; + break; + case AGP_I810_PGTBL_SIZE_2MB: + sc->gtt_total_entries = 2 * 1024 * 1024 / 4; + break; + case AGP_I810_PGTBL_SIZE_1_5MB: + sc->gtt_total_entries = (1024 + 512) * 1024 / 4; + break; + default: + device_printf(dev, "Unknown page table size\n"); + error = ENXIO; + } + return (error); +} + +static void +agp_gen5_adjust_pgtbl_size(device_t dev, uint32_t sz) +{ + struct agp_i810_softc *sc; + uint32_t pgetbl_ctl, pgetbl_ctl2; + + sc = device_get_softc(dev); + + /* Disable per-process page table. */ + pgetbl_ctl2 = bus_read_4(sc->sc_res[0], AGP_I965_PGTBL_CTL2); + pgetbl_ctl2 &= ~AGP_I810_PGTBL_ENABLED; + bus_write_4(sc->sc_res[0], AGP_I965_PGTBL_CTL2, pgetbl_ctl2); + + /* Write the new ggtt size. */ + pgetbl_ctl = bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL); + pgetbl_ctl &= ~AGP_I810_PGTBL_SIZE_MASK; + pgetbl_ctl |= sz; + bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, pgetbl_ctl); +} + +static int +agp_gen5_get_gtt_total_entries(device_t dev) +{ + struct agp_i810_softc *sc; + uint16_t gcc1; + + sc = device_get_softc(dev); + + gcc1 = pci_read_config(sc->bdev, AGP_I830_GCC1, 2); + switch (gcc1 & AGP_G4x_GCC1_SIZE_MASK) { + case AGP_G4x_GCC1_SIZE_1M: + case AGP_G4x_GCC1_SIZE_VT_1M: + agp_gen5_adjust_pgtbl_size(dev, AGP_I810_PGTBL_SIZE_1MB); + break; + case AGP_G4x_GCC1_SIZE_VT_1_5M: + agp_gen5_adjust_pgtbl_size(dev, AGP_I810_PGTBL_SIZE_1_5MB); + break; + case AGP_G4x_GCC1_SIZE_2M: + case AGP_G4x_GCC1_SIZE_VT_2M: + agp_gen5_adjust_pgtbl_size(dev, AGP_I810_PGTBL_SIZE_2MB); + break; + default: + device_printf(dev, "Unknown page table size\n"); + return (ENXIO); + } + + return (agp_i965_get_gtt_total_entries(dev)); +} + +static int +agp_sb_get_gtt_total_entries(device_t dev) +{ + struct agp_i810_softc *sc; + uint16_t gcc1; + + sc = device_get_softc(dev); + + gcc1 = pci_read_config(sc->bdev, AGP_SNB_GCC1, 2); + switch (gcc1 & AGP_SNB_GTT_SIZE_MASK) { + default: + case AGP_SNB_GTT_SIZE_0M: + printf("Bad GTT size mask: 0x%04x\n", gcc1); + return (ENXIO); + case AGP_SNB_GTT_SIZE_1M: + sc->gtt_total_entries = 1024 * 1024 / 4; + break; + case AGP_SNB_GTT_SIZE_2M: + sc->gtt_total_entries = 2 * 1024 * 1024 / 4; + break; + } + return (0); +} + +static int +agp_i810_install_gatt(device_t dev) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(dev); + + /* Some i810s have on-chip memory called dcache. */ + if ((bus_read_1(sc->sc_res[0], AGP_I810_DRT) & AGP_I810_DRT_POPULATED) + != 0) + sc->dcache_size = 4 * 1024 * 1024; + else + sc->dcache_size = 0; + + /* According to the specs the gatt on the i810 must be 64k. */ + sc->gatt->ag_virtual = contigmalloc(64 * 1024, M_AGP, 0, 0, ~0, + PAGE_SIZE, 0); + if (sc->gatt->ag_virtual == NULL) { + if (bootverbose) + device_printf(dev, "contiguous allocation failed\n"); + return (ENOMEM); + } + + bzero(sc->gatt->ag_virtual, sc->gatt->ag_entries * sizeof(u_int32_t)); + sc->gatt->ag_physical = vtophys((vm_offset_t)sc->gatt->ag_virtual); + agp_flush_cache(); + /* Install the GATT. */ + bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, + sc->gatt->ag_physical | 1); + return (0); +} + +static int +agp_i830_install_gatt(device_t dev) +{ + struct agp_i810_softc *sc; + uint32_t pgtblctl; + + sc = device_get_softc(dev); + + /* + * The i830 automatically initializes the 128k gatt on boot. + * GATT address is already in there, make sure it's enabled. + */ + pgtblctl = bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL); + pgtblctl |= 1; + bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, pgtblctl); + + sc->gatt->ag_physical = pgtblctl & ~1; + return (0); } static int agp_i810_attach(device_t dev) { - struct agp_i810_softc *sc = device_get_softc(dev); - struct agp_gatt *gatt; - const struct agp_i810_match *match; + struct agp_i810_softc *sc; int error; + sc = device_get_softc(dev); sc->bdev = agp_i810_find_bridge(dev); - if (!sc->bdev) - return ENOENT; + if (sc->bdev == NULL) + return (ENOENT); - match = agp_i810_match(dev); - sc->chiptype = match->chiptype; - - switch (sc->chiptype) { - case CHIP_I810: - case CHIP_I830: - case CHIP_I855: - sc->sc_res_spec = agp_i810_res_spec; - agp_set_aperture_resource(dev, AGP_APBASE); - break; - case CHIP_I915: - case CHIP_G33: - case CHIP_IGD: - sc->sc_res_spec = agp_i915_res_spec; - agp_set_aperture_resource(dev, AGP_I915_GMADR); - break; - case CHIP_I965: - case CHIP_G4X: - sc->sc_res_spec = agp_i965_res_spec; - agp_set_aperture_resource(dev, AGP_I915_GMADR); - break; - } + sc->match = agp_i810_match(dev); + agp_set_aperture_resource(dev, sc->match->driver->gen <= 2 ? + AGP_APBASE : AGP_I915_GMADR); error = agp_generic_attach(dev); if (error) - return error; + return (error); - if (sc->chiptype != CHIP_I965 && sc->chiptype != CHIP_G33 && - sc->chiptype != CHIP_IGD && sc->chiptype != CHIP_G4X && - ptoa((vm_paddr_t)Maxmem) > 0xfffffffful) - { - device_printf(dev, "agp_i810.c does not support physical " - "memory above 4GB.\n"); - return ENOENT; + if (ptoa((vm_paddr_t)Maxmem) > + (1ULL << sc->match->driver->busdma_addr_mask_sz) - 1) { + device_printf(dev, "agp_i810 does not support physical " + "memory above %ju.\n", (uintmax_t)(1ULL << + sc->match->driver->busdma_addr_mask_sz) - 1); + return (ENOENT); } - if (bus_alloc_resources(dev, sc->sc_res_spec, sc->sc_res)) { + if (bus_alloc_resources(dev, sc->match->driver->res_spec, sc->sc_res)) { agp_generic_detach(dev); - return ENODEV; + return (ENODEV); } sc->initial_aperture = AGP_GET_APERTURE(dev); + sc->gatt = malloc(sizeof(struct agp_gatt), M_AGP, M_WAITOK); + sc->gatt->ag_entries = AGP_GET_APERTURE(dev) >> AGP_PAGE_SHIFT; - gatt = malloc( sizeof(struct agp_gatt), M_AGP, M_NOWAIT); - if (!gatt) { - bus_release_resources(dev, sc->sc_res_spec, sc->sc_res); - agp_generic_detach(dev); - return ENOMEM; - } - sc->gatt = gatt; - - gatt->ag_entries = AGP_GET_APERTURE(dev) >> AGP_PAGE_SHIFT; - - if ( sc->chiptype == CHIP_I810 ) { - /* Some i810s have on-chip memory called dcache */ - if (bus_read_1(sc->sc_res[0], AGP_I810_DRT) & - AGP_I810_DRT_POPULATED) - sc->dcache_size = 4 * 1024 * 1024; - else - sc->dcache_size = 0; - - /* According to the specs the gatt on the i810 must be 64k */ - gatt->ag_virtual = contigmalloc( 64 * 1024, M_AGP, 0, - 0, ~0, PAGE_SIZE, 0); - if (!gatt->ag_virtual) { - if (bootverbose) - device_printf(dev, "contiguous allocation failed\n"); - bus_release_resources(dev, sc->sc_res_spec, - sc->sc_res); - free(gatt, M_AGP); - agp_generic_detach(dev); - return ENOMEM; - } - bzero(gatt->ag_virtual, gatt->ag_entries * sizeof(u_int32_t)); - - gatt->ag_physical = vtophys((vm_offset_t) gatt->ag_virtual); - agp_flush_cache(); - /* Install the GATT. */ - bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, - gatt->ag_physical | 1); - } else if ( sc->chiptype == CHIP_I830 ) { - /* The i830 automatically initializes the 128k gatt on boot. */ - unsigned int gcc1, pgtblctl; - - gcc1 = pci_read_config(sc->bdev, AGP_I830_GCC1, 1); - switch (gcc1 & AGP_I830_GCC1_GMS) { - case AGP_I830_GCC1_GMS_STOLEN_512: - sc->stolen = (512 - 132) * 1024 / 4096; - break; - case AGP_I830_GCC1_GMS_STOLEN_1024: - sc->stolen = (1024 - 132) * 1024 / 4096; - break; - case AGP_I830_GCC1_GMS_STOLEN_8192: - sc->stolen = (8192 - 132) * 1024 / 4096; - break; - default: - sc->stolen = 0; - device_printf(dev, "unknown memory configuration, disabling\n"); - bus_release_resources(dev, sc->sc_res_spec, - sc->sc_res); - free(gatt, M_AGP); - agp_generic_detach(dev); - return EINVAL; - } - - /* GATT address is already in there, make sure it's enabled */ - pgtblctl = bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL); - pgtblctl |= 1; - bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, pgtblctl); - - gatt->ag_physical = pgtblctl & ~1; - } else if (sc->chiptype == CHIP_I855 || sc->chiptype == CHIP_I915 || - sc->chiptype == CHIP_I965 || sc->chiptype == CHIP_G33 || - sc->chiptype == CHIP_IGD || sc->chiptype == CHIP_G4X) { - unsigned int gcc1, pgtblctl, stolen, gtt_size; - - /* Stolen memory is set up at the beginning of the aperture by - * the BIOS, consisting of the GATT followed by 4kb for the - * BIOS display. - */ - switch (sc->chiptype) { - case CHIP_I855: - gtt_size = 128; - break; - case CHIP_I915: - gtt_size = 256; - break; - case CHIP_I965: - switch (bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL) & - AGP_I810_PGTBL_SIZE_MASK) { - case AGP_I810_PGTBL_SIZE_128KB: - gtt_size = 128; - break; - case AGP_I810_PGTBL_SIZE_256KB: - gtt_size = 256; - break; - case AGP_I810_PGTBL_SIZE_512KB: - gtt_size = 512; - break; - case AGP_I965_PGTBL_SIZE_1MB: - gtt_size = 1024; - break; - case AGP_I965_PGTBL_SIZE_2MB: - gtt_size = 2048; - break; - case AGP_I965_PGTBL_SIZE_1_5MB: - gtt_size = 1024 + 512; - break; - default: - device_printf(dev, "Bad PGTBL size\n"); - bus_release_resources(dev, sc->sc_res_spec, - sc->sc_res); - free(gatt, M_AGP); - agp_generic_detach(dev); - return EINVAL; - } - break; - case CHIP_G33: - gcc1 = pci_read_config(sc->bdev, AGP_I855_GCC1, 2); - switch (gcc1 & AGP_G33_MGGC_GGMS_MASK) { - case AGP_G33_MGGC_GGMS_SIZE_1M: - gtt_size = 1024; - break; - case AGP_G33_MGGC_GGMS_SIZE_2M: - gtt_size = 2048; - break; - default: - device_printf(dev, "Bad PGTBL size\n"); - bus_release_resources(dev, sc->sc_res_spec, - sc->sc_res); - free(gatt, M_AGP); - agp_generic_detach(dev); - return EINVAL; - } - break; - case CHIP_IGD: - case CHIP_G4X: - gtt_size = 0; - break; - default: - device_printf(dev, "Bad chiptype\n"); - bus_release_resources(dev, sc->sc_res_spec, - sc->sc_res); - free(gatt, M_AGP); - agp_generic_detach(dev); - return EINVAL; - } - - /* GCC1 is called MGGC on i915+ */ - gcc1 = pci_read_config(sc->bdev, AGP_I855_GCC1, 1); - switch (gcc1 & AGP_I855_GCC1_GMS) { - case AGP_I855_GCC1_GMS_STOLEN_1M: - stolen = 1024; - break; - case AGP_I855_GCC1_GMS_STOLEN_4M: - stolen = 4 * 1024; - break; - case AGP_I855_GCC1_GMS_STOLEN_8M: - stolen = 8 * 1024; - break; - case AGP_I855_GCC1_GMS_STOLEN_16M: - stolen = 16 * 1024; - break; - case AGP_I855_GCC1_GMS_STOLEN_32M: - stolen = 32 * 1024; - break; - case AGP_I915_GCC1_GMS_STOLEN_48M: - if (sc->chiptype == CHIP_I915 || - sc->chiptype == CHIP_I965 || - sc->chiptype == CHIP_G33 || - sc->chiptype == CHIP_IGD || - sc->chiptype == CHIP_G4X) { - stolen = 48 * 1024; - } else { - stolen = 0; - } - break; - case AGP_I915_GCC1_GMS_STOLEN_64M: - if (sc->chiptype == CHIP_I915 || - sc->chiptype == CHIP_I965 || - sc->chiptype == CHIP_G33 || - sc->chiptype == CHIP_IGD || - sc->chiptype == CHIP_G4X) { - stolen = 64 * 1024; - } else { - stolen = 0; - } - break; - case AGP_G33_GCC1_GMS_STOLEN_128M: - if (sc->chiptype == CHIP_I965 || - sc->chiptype == CHIP_G33 || - sc->chiptype == CHIP_IGD || - sc->chiptype == CHIP_G4X) { - stolen = 128 * 1024; - } else { - stolen = 0; - } - break; - case AGP_G33_GCC1_GMS_STOLEN_256M: - if (sc->chiptype == CHIP_I965 || - sc->chiptype == CHIP_G33 || - sc->chiptype == CHIP_IGD || - sc->chiptype == CHIP_G4X) { - stolen = 256 * 1024; - } else { - stolen = 0; - } - break; - case AGP_G4X_GCC1_GMS_STOLEN_96M: - if (sc->chiptype == CHIP_I965 || - sc->chiptype == CHIP_G4X) { - stolen = 96 * 1024; - } else { - stolen = 0; - } - break; - case AGP_G4X_GCC1_GMS_STOLEN_160M: - if (sc->chiptype == CHIP_I965 || - sc->chiptype == CHIP_G4X) { - stolen = 160 * 1024; - } else { - stolen = 0; - } - break; - case AGP_G4X_GCC1_GMS_STOLEN_224M: - if (sc->chiptype == CHIP_I965 || - sc->chiptype == CHIP_G4X) { - stolen = 224 * 1024; - } else { - stolen = 0; - } - break; - case AGP_G4X_GCC1_GMS_STOLEN_352M: - if (sc->chiptype == CHIP_I965 || - sc->chiptype == CHIP_G4X) { - stolen = 352 * 1024; - } else { - stolen = 0; - } - break; - default: - device_printf(dev, "unknown memory configuration, " - "disabling\n"); - bus_release_resources(dev, sc->sc_res_spec, - sc->sc_res); - free(gatt, M_AGP); - agp_generic_detach(dev); - return EINVAL; - } - - gtt_size += 4; - - sc->stolen = (stolen - gtt_size) * 1024 / 4096; - - /* GATT address is already in there, make sure it's enabled */ - pgtblctl = bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL); - pgtblctl |= 1; - bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, pgtblctl); - - gatt->ag_physical = pgtblctl & ~1; + if ((error = sc->match->driver->get_stolen_size(dev)) != 0 || + (error = sc->match->driver->install_gatt(dev)) != 0 || + (error = sc->match->driver->get_gtt_mappable_entries(dev)) != 0 || + (error = sc->match->driver->get_gtt_total_entries(dev)) != 0 || + (error = sc->match->driver->chipset_flush_setup(dev)) != 0) { + bus_release_resources(dev, sc->match->driver->res_spec, + sc->sc_res); + free(sc->gatt, M_AGP); + agp_generic_detach(dev); + return (error); } + intel_agp = dev; device_printf(dev, "aperture size is %dM", sc->initial_aperture / 1024 / 1024); if (sc->stolen > 0) printf(", detected %dk stolen memory\n", sc->stolen * 4); else printf("\n"); + if (bootverbose) { + sc->match->driver->dump_regs(dev); + device_printf(dev, "Mappable GTT entries: %d\n", + sc->gtt_mappable_entries); + device_printf(dev, "Total GTT entries: %d\n", + sc->gtt_total_entries); + } + return (0); +} - if (0) - agp_i810_dump_regs(dev); +static void +agp_i810_deinstall_gatt(device_t dev) +{ + struct agp_i810_softc *sc; - return 0; + sc = device_get_softc(dev); + bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, 0); + contigfree(sc->gatt->ag_virtual, 64 * 1024, M_AGP); +} + +static void +agp_i830_deinstall_gatt(device_t dev) +{ + struct agp_i810_softc *sc; + unsigned int pgtblctl; + + sc = device_get_softc(dev); + pgtblctl = bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL); + pgtblctl &= ~1; + bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, pgtblctl); } static int agp_i810_detach(device_t dev) { - struct agp_i810_softc *sc = device_get_softc(dev); + struct agp_i810_softc *sc; + sc = device_get_softc(dev); agp_free_cdev(dev); /* Clear the GATT base. */ - if ( sc->chiptype == CHIP_I810 ) { - bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, 0); - } else { - unsigned int pgtblctl; - pgtblctl = bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL); - pgtblctl &= ~1; - bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, pgtblctl); - } + sc->match->driver->deinstall_gatt(dev); + + sc->match->driver->chipset_flush_teardown(dev); /* Put the aperture back the way it started. */ AGP_SET_APERTURE(dev, sc->initial_aperture); - if ( sc->chiptype == CHIP_I810 ) { - contigfree(sc->gatt->ag_virtual, 64 * 1024, M_AGP); - } free(sc->gatt, M_AGP); - - bus_release_resources(dev, sc->sc_res_spec, sc->sc_res); + bus_release_resources(dev, sc->match->driver->res_spec, sc->sc_res); agp_free_res(dev); - return 0; + return (0); } static int @@ -758,143 +1557,338 @@ agp_i810_resume(device_t dev) static int agp_i810_set_aperture(device_t dev, u_int32_t aperture) { - struct agp_i810_softc *sc = device_get_softc(dev); - u_int16_t miscc, gcc1; + struct agp_i810_softc *sc; + u_int16_t miscc; - switch (sc->chiptype) { - case CHIP_I810: - /* - * Double check for sanity. - */ - if (aperture != 32 * 1024 * 1024 && aperture != 64 * 1024 * 1024) { - device_printf(dev, "bad aperture size %d\n", aperture); - return EINVAL; - } - - miscc = pci_read_config(sc->bdev, AGP_I810_MISCC, 2); - miscc &= ~AGP_I810_MISCC_WINSIZE; - if (aperture == 32 * 1024 * 1024) - miscc |= AGP_I810_MISCC_WINSIZE_32; - else - miscc |= AGP_I810_MISCC_WINSIZE_64; - - pci_write_config(sc->bdev, AGP_I810_MISCC, miscc, 2); - break; - case CHIP_I830: - if (aperture != 64 * 1024 * 1024 && - aperture != 128 * 1024 * 1024) { - device_printf(dev, "bad aperture size %d\n", aperture); - return EINVAL; - } - gcc1 = pci_read_config(sc->bdev, AGP_I830_GCC1, 2); - gcc1 &= ~AGP_I830_GCC1_GMASIZE; - if (aperture == 64 * 1024 * 1024) - gcc1 |= AGP_I830_GCC1_GMASIZE_64; - else - gcc1 |= AGP_I830_GCC1_GMASIZE_128; - - pci_write_config(sc->bdev, AGP_I830_GCC1, gcc1, 2); - break; - case CHIP_I855: - case CHIP_I915: - case CHIP_I965: - case CHIP_G33: - case CHIP_IGD: - case CHIP_G4X: - return agp_generic_set_aperture(dev, aperture); + sc = device_get_softc(dev); + /* + * Double check for sanity. + */ + if (aperture != 32 * 1024 * 1024 && aperture != 64 * 1024 * 1024) { + device_printf(dev, "bad aperture size %d\n", aperture); + return (EINVAL); } - return 0; + miscc = pci_read_config(sc->bdev, AGP_I810_MISCC, 2); + miscc &= ~AGP_I810_MISCC_WINSIZE; + if (aperture == 32 * 1024 * 1024) + miscc |= AGP_I810_MISCC_WINSIZE_32; + else + miscc |= AGP_I810_MISCC_WINSIZE_64; + + pci_write_config(sc->bdev, AGP_I810_MISCC, miscc, 2); + return (0); +} + +static int +agp_i830_set_aperture(device_t dev, u_int32_t aperture) +{ + struct agp_i810_softc *sc; + u_int16_t gcc1; + + sc = device_get_softc(dev); + + if (aperture != 64 * 1024 * 1024 && + aperture != 128 * 1024 * 1024) { + device_printf(dev, "bad aperture size %d\n", aperture); + return (EINVAL); + } + gcc1 = pci_read_config(sc->bdev, AGP_I830_GCC1, 2); + gcc1 &= ~AGP_I830_GCC1_GMASIZE; + if (aperture == 64 * 1024 * 1024) + gcc1 |= AGP_I830_GCC1_GMASIZE_64; + else + gcc1 |= AGP_I830_GCC1_GMASIZE_128; + + pci_write_config(sc->bdev, AGP_I830_GCC1, gcc1, 2); + return (0); +} + +static int +agp_i915_set_aperture(device_t dev, u_int32_t aperture) +{ + + return (agp_generic_set_aperture(dev, aperture)); +} + +static int +agp_i810_method_set_aperture(device_t dev, u_int32_t aperture) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(dev); + return (sc->match->driver->set_aperture(dev, aperture)); } /** - * Writes a GTT entry mapping the page at the given offset from the beginning - * of the aperture to the given physical address. + * Writes a GTT entry mapping the page at the given offset from the + * beginning of the aperture to the given physical address. Setup the + * caching mode according to flags. + * + * For gen 1, 2 and 3, GTT start is located at AGP_I810_GTT offset + * from corresponding BAR start. For gen 4, offset is 512KB + + * AGP_I810_GTT, for gen 5 and 6 it is 2MB + AGP_I810_GTT. + * + * Also, the bits of the physical page address above 4GB needs to be + * placed into bits 40-32 of PTE. */ static void -agp_i810_write_gtt_entry(device_t dev, int offset, vm_offset_t physical, - int enabled) +agp_i810_install_gtt_pte(device_t dev, u_int index, vm_offset_t physical, + int flags) { - struct agp_i810_softc *sc = device_get_softc(dev); - u_int32_t pte; + uint32_t pte; - pte = (u_int32_t)physical | 1; - if (sc->chiptype == CHIP_I965 || sc->chiptype == CHIP_G33 || - sc->chiptype == CHIP_IGD || sc->chiptype == CHIP_G4X) { - pte |= (physical & 0x0000000f00000000ull) >> 28; - } else { - /* If we do actually have memory above 4GB on an older system, - * crash cleanly rather than scribble on system memory, - * so we know we need to fix it. - */ - KASSERT((pte & 0x0000000f00000000ull) == 0, - (">4GB physical address in agp")); - } + pte = (u_int32_t)physical | I810_PTE_VALID; + if (flags == AGP_DCACHE_MEMORY) + pte |= I810_PTE_LOCAL; + else if (flags == AGP_USER_CACHED_MEMORY) + pte |= I830_PTE_SYSTEM_CACHED; + agp_i810_write_gtt(dev, index, pte); +} - switch (sc->chiptype) { - case CHIP_I810: - case CHIP_I830: - case CHIP_I855: - bus_write_4(sc->sc_res[0], - AGP_I810_GTT + (offset >> AGP_PAGE_SHIFT) * 4, pte); - break; - case CHIP_I915: - case CHIP_G33: - case CHIP_IGD: - bus_write_4(sc->sc_res[1], - (offset >> AGP_PAGE_SHIFT) * 4, pte); - break; - case CHIP_I965: - bus_write_4(sc->sc_res[0], - (offset >> AGP_PAGE_SHIFT) * 4 + (512 * 1024), pte); - break; - case CHIP_G4X: - bus_write_4(sc->sc_res[0], - (offset >> AGP_PAGE_SHIFT) * 4 + (2 * 1024 * 1024), pte); - break; - } +static void +agp_i810_write_gtt(device_t dev, u_int index, uint32_t pte) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(dev); + bus_write_4(sc->sc_res[0], AGP_I810_GTT + index * 4, pte); + CTR2(KTR_AGP_I810, "810_pte %x %x", index, pte); +} + +static void +agp_i830_install_gtt_pte(device_t dev, u_int index, vm_offset_t physical, + int flags) +{ + uint32_t pte; + + pte = (u_int32_t)physical | I810_PTE_VALID; + if (flags == AGP_USER_CACHED_MEMORY) + pte |= I830_PTE_SYSTEM_CACHED; + agp_i810_write_gtt(dev, index, pte); +} + +static void +agp_i915_install_gtt_pte(device_t dev, u_int index, vm_offset_t physical, + int flags) +{ + uint32_t pte; + + pte = (u_int32_t)physical | I810_PTE_VALID; + if (flags == AGP_USER_CACHED_MEMORY) + pte |= I830_PTE_SYSTEM_CACHED; + pte |= (physical & 0x0000000f00000000ull) >> 28; + agp_i915_write_gtt(dev, index, pte); +} + +static void +agp_i915_write_gtt(device_t dev, u_int index, uint32_t pte) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(dev); + bus_write_4(sc->sc_res[1], index * 4, pte); + CTR2(KTR_AGP_I810, "915_pte %x %x", index, pte); +} + +static void +agp_i965_install_gtt_pte(device_t dev, u_int index, vm_offset_t physical, + int flags) +{ + uint32_t pte; + + pte = (u_int32_t)physical | I810_PTE_VALID; + if (flags == AGP_USER_CACHED_MEMORY) + pte |= I830_PTE_SYSTEM_CACHED; + pte |= (physical & 0x0000000f00000000ull) >> 28; + agp_i965_write_gtt(dev, index, pte); +} + +static void +agp_i965_write_gtt(device_t dev, u_int index, uint32_t pte) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(dev); + bus_write_4(sc->sc_res[0], index * 4 + (512 * 1024), pte); + CTR2(KTR_AGP_I810, "965_pte %x %x", index, pte); +} + +static void +agp_g4x_install_gtt_pte(device_t dev, u_int index, vm_offset_t physical, + int flags) +{ + uint32_t pte; + + pte = (u_int32_t)physical | I810_PTE_VALID; + if (flags == AGP_USER_CACHED_MEMORY) + pte |= I830_PTE_SYSTEM_CACHED; + pte |= (physical & 0x0000000f00000000ull) >> 28; + agp_g4x_write_gtt(dev, index, pte); +} + +static void +agp_g4x_write_gtt(device_t dev, u_int index, uint32_t pte) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(dev); + bus_write_4(sc->sc_res[0], index * 4 + (2 * 1024 * 1024), pte); + CTR2(KTR_AGP_I810, "g4x_pte %x %x", index, pte); +} + +static void +agp_sb_install_gtt_pte(device_t dev, u_int index, vm_offset_t physical, + int flags) +{ + int type_mask, gfdt; + uint32_t pte; + + pte = (u_int32_t)physical | I810_PTE_VALID; + type_mask = flags & ~AGP_USER_CACHED_MEMORY_GFDT; + gfdt = (flags & AGP_USER_CACHED_MEMORY_GFDT) != 0 ? GEN6_PTE_GFDT : 0; + + if (type_mask == AGP_USER_MEMORY) + pte |= GEN6_PTE_UNCACHED; + else if (type_mask == AGP_USER_CACHED_MEMORY_LLC_MLC) + pte |= GEN6_PTE_LLC_MLC | gfdt; + else + pte |= GEN6_PTE_LLC | gfdt; + + pte |= (physical & 0x000000ff00000000ull) >> 28; + agp_sb_write_gtt(dev, index, pte); +} + +static void +agp_sb_write_gtt(device_t dev, u_int index, uint32_t pte) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(dev); + bus_write_4(sc->sc_res[0], index * 4 + (2 * 1024 * 1024), pte); + CTR2(KTR_AGP_I810, "sb_pte %x %x", index, pte); } static int agp_i810_bind_page(device_t dev, vm_offset_t offset, vm_offset_t physical) { struct agp_i810_softc *sc = device_get_softc(dev); + u_int index; if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT)) { - device_printf(dev, "failed: offset is 0x%08jx, shift is %d, entries is %d\n", (intmax_t)offset, AGP_PAGE_SHIFT, sc->gatt->ag_entries); - return EINVAL; + device_printf(dev, "failed: offset is 0x%08jx, " + "shift is %d, entries is %d\n", (intmax_t)offset, + AGP_PAGE_SHIFT, sc->gatt->ag_entries); + return (EINVAL); } - - if ( sc->chiptype != CHIP_I810 ) { - if ( (offset >> AGP_PAGE_SHIFT) < sc->stolen ) { - device_printf(dev, "trying to bind into stolen memory"); - return EINVAL; - } + index = offset >> AGP_PAGE_SHIFT; + if (sc->stolen != 0 && index < sc->stolen) { + device_printf(dev, "trying to bind into stolen memory\n"); + return (EINVAL); } - - agp_i810_write_gtt_entry(dev, offset, physical, 1); - - return 0; + sc->match->driver->install_gtt_pte(dev, index, physical, 0); + return (0); } static int agp_i810_unbind_page(device_t dev, vm_offset_t offset) { - struct agp_i810_softc *sc = device_get_softc(dev); + struct agp_i810_softc *sc; + u_int index; + sc = device_get_softc(dev); if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT)) - return EINVAL; - - if ( sc->chiptype != CHIP_I810 ) { - if ( (offset >> AGP_PAGE_SHIFT) < sc->stolen ) { - device_printf(dev, "trying to unbind from stolen memory"); - return EINVAL; - } + return (EINVAL); + index = offset >> AGP_PAGE_SHIFT; + if (sc->stolen != 0 && index < sc->stolen) { + device_printf(dev, "trying to unbind from stolen memory\n"); + return (EINVAL); } + sc->match->driver->install_gtt_pte(dev, index, 0, 0); + return (0); +} - agp_i810_write_gtt_entry(dev, offset, 0, 0); +static u_int32_t +agp_i810_read_gtt_pte(device_t dev, u_int index) +{ + struct agp_i810_softc *sc; + u_int32_t pte; - return 0; + sc = device_get_softc(dev); + pte = bus_read_4(sc->sc_res[0], AGP_I810_GTT + index * 4); + return (pte); +} + +static u_int32_t +agp_i915_read_gtt_pte(device_t dev, u_int index) +{ + struct agp_i810_softc *sc; + u_int32_t pte; + + sc = device_get_softc(dev); + pte = bus_read_4(sc->sc_res[1], index * 4); + return (pte); +} + +static u_int32_t +agp_i965_read_gtt_pte(device_t dev, u_int index) +{ + struct agp_i810_softc *sc; + u_int32_t pte; + + sc = device_get_softc(dev); + pte = bus_read_4(sc->sc_res[0], index * 4 + (512 * 1024)); + return (pte); +} + +static u_int32_t +agp_g4x_read_gtt_pte(device_t dev, u_int index) +{ + struct agp_i810_softc *sc; + u_int32_t pte; + + sc = device_get_softc(dev); + pte = bus_read_4(sc->sc_res[0], index * 4 + (2 * 1024 * 1024)); + return (pte); +} + +static vm_paddr_t +agp_i810_read_gtt_pte_paddr(device_t dev, u_int index) +{ + struct agp_i810_softc *sc; + u_int32_t pte; + vm_paddr_t res; + + sc = device_get_softc(dev); + pte = sc->match->driver->read_gtt_pte(dev, index); + res = pte & ~PAGE_MASK; + return (res); +} + +static vm_paddr_t +agp_i915_read_gtt_pte_paddr(device_t dev, u_int index) +{ + struct agp_i810_softc *sc; + u_int32_t pte; + vm_paddr_t res; + + sc = device_get_softc(dev); + pte = sc->match->driver->read_gtt_pte(dev, index); + res = (pte & ~PAGE_MASK) | ((pte & 0xf0) << 28); + return (res); +} + +static vm_paddr_t +agp_sb_read_gtt_pte_paddr(device_t dev, u_int index) +{ + struct agp_i810_softc *sc; + u_int32_t pte; + vm_paddr_t res; + + sc = device_get_softc(dev); + pte = sc->match->driver->read_gtt_pte(dev, index); + res = (pte & ~PAGE_MASK) | ((pte & 0xff0) << 28); + return (res); } /* @@ -909,29 +1903,30 @@ static int agp_i810_enable(device_t dev, u_int32_t mode) { - return 0; + return (0); } static struct agp_memory * agp_i810_alloc_memory(device_t dev, int type, vm_size_t size) { - struct agp_i810_softc *sc = device_get_softc(dev); + struct agp_i810_softc *sc; struct agp_memory *mem; + vm_page_t m; - if ((size & (AGP_PAGE_SIZE - 1)) != 0) - return 0; + sc = device_get_softc(dev); - if (sc->agp.as_allocated + size > sc->agp.as_maxmem) - return 0; + if ((size & (AGP_PAGE_SIZE - 1)) != 0 || + sc->agp.as_allocated + size > sc->agp.as_maxmem) + return (0); if (type == 1) { /* * Mapping local DRAM into GATT. */ - if ( sc->chiptype != CHIP_I810 ) - return 0; + if (sc->match->driver->chiptype != CHIP_I810) + return (0); if (size != sc->dcache_size) - return 0; + return (0); } else if (type == 2) { /* * Type 2 is the contiguous physical memory type, that hands @@ -942,13 +1937,13 @@ agp_i810_alloc_memory(device_t dev, int type, vm_size_t size) */ if (size != AGP_PAGE_SIZE) { if (sc->argb_cursor != NULL) - return 0; + return (0); /* Allocate memory for ARGB cursor, if we can. */ sc->argb_cursor = contigmalloc(size, M_AGP, 0, 0, ~0, PAGE_SIZE, 0); if (sc->argb_cursor == NULL) - return 0; + return (0); } } @@ -958,7 +1953,7 @@ agp_i810_alloc_memory(device_t dev, int type, vm_size_t size) mem->am_type = type; if (type != 1 && (type != 2 || size == AGP_PAGE_SIZE)) mem->am_obj = vm_object_allocate(OBJT_DEFAULT, - atop(round_page(size))); + atop(round_page(size))); else mem->am_obj = 0; @@ -968,8 +1963,6 @@ agp_i810_alloc_memory(device_t dev, int type, vm_size_t size) * Allocate and wire down the page now so that we can * get its physical address. */ - vm_page_t m; - VM_OBJECT_LOCK(mem->am_obj); m = vm_page_grab(mem->am_obj, 0, VM_ALLOC_NOBUSY | VM_ALLOC_WIRED | VM_ALLOC_ZERO | VM_ALLOC_RETRY); @@ -981,33 +1974,33 @@ agp_i810_alloc_memory(device_t dev, int type, vm_size_t size) */ mem->am_physical = vtophys(sc->argb_cursor); } - } else { + } else mem->am_physical = 0; - } mem->am_offset = 0; mem->am_is_bound = 0; TAILQ_INSERT_TAIL(&sc->agp.as_memory, mem, am_link); sc->agp.as_allocated += size; - return mem; + return (mem); } static int agp_i810_free_memory(device_t dev, struct agp_memory *mem) { - struct agp_i810_softc *sc = device_get_softc(dev); + struct agp_i810_softc *sc; + vm_page_t m; if (mem->am_is_bound) - return EBUSY; + return (EBUSY); + + sc = device_get_softc(dev); if (mem->am_type == 2) { if (mem->am_size == AGP_PAGE_SIZE) { /* * Unwire the page which we wired in alloc_memory. */ - vm_page_t m; - VM_OBJECT_LOCK(mem->am_obj); m = vm_page_lookup(mem->am_obj, 0); vm_page_lock(m); @@ -1025,14 +2018,13 @@ agp_i810_free_memory(device_t dev, struct agp_memory *mem) if (mem->am_obj) vm_object_deallocate(mem->am_obj); free(mem, M_AGP); - return 0; + return (0); } static int -agp_i810_bind_memory(device_t dev, struct agp_memory *mem, - vm_offset_t offset) +agp_i810_bind_memory(device_t dev, struct agp_memory *mem, vm_offset_t offset) { - struct agp_i810_softc *sc = device_get_softc(dev); + struct agp_i810_softc *sc; vm_offset_t i; /* Do some sanity checks first. */ @@ -1040,76 +2032,78 @@ agp_i810_bind_memory(device_t dev, struct agp_memory *mem, offset + mem->am_size > AGP_GET_APERTURE(dev)) { device_printf(dev, "binding memory at bad offset %#x\n", (int)offset); - return EINVAL; + return (EINVAL); } + sc = device_get_softc(dev); if (mem->am_type == 2 && mem->am_size != AGP_PAGE_SIZE) { mtx_lock(&sc->agp.as_lock); if (mem->am_is_bound) { mtx_unlock(&sc->agp.as_lock); - return EINVAL; + return (EINVAL); } /* The memory's already wired down, just stick it in the GTT. */ for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) { - agp_i810_write_gtt_entry(dev, offset + i, - mem->am_physical + i, 1); + sc->match->driver->install_gtt_pte(dev, (offset + i) >> + AGP_PAGE_SHIFT, mem->am_physical + i, 0); } agp_flush_cache(); mem->am_offset = offset; mem->am_is_bound = 1; mtx_unlock(&sc->agp.as_lock); - return 0; + return (0); } if (mem->am_type != 1) - return agp_generic_bind_memory(dev, mem, offset); + return (agp_generic_bind_memory(dev, mem, offset)); - if ( sc->chiptype != CHIP_I810 ) - return EINVAL; - - for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) { + /* + * Mapping local DRAM into GATT. + */ + if (sc->match->driver->chiptype != CHIP_I810) + return (EINVAL); + for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) bus_write_4(sc->sc_res[0], AGP_I810_GTT + (i >> AGP_PAGE_SHIFT) * 4, i | 3); - } - return 0; + return (0); } static int agp_i810_unbind_memory(device_t dev, struct agp_memory *mem) { - struct agp_i810_softc *sc = device_get_softc(dev); + struct agp_i810_softc *sc; vm_offset_t i; + sc = device_get_softc(dev); + if (mem->am_type == 2 && mem->am_size != AGP_PAGE_SIZE) { mtx_lock(&sc->agp.as_lock); if (!mem->am_is_bound) { mtx_unlock(&sc->agp.as_lock); - return EINVAL; + return (EINVAL); } for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) { - agp_i810_write_gtt_entry(dev, mem->am_offset + i, - 0, 0); + sc->match->driver->install_gtt_pte(dev, + (mem->am_offset + i) >> AGP_PAGE_SHIFT, 0, 0); } agp_flush_cache(); mem->am_is_bound = 0; mtx_unlock(&sc->agp.as_lock); - return 0; + return (0); } if (mem->am_type != 1) - return agp_generic_unbind_memory(dev, mem); - - if ( sc->chiptype != CHIP_I810 ) - return EINVAL; + return (agp_generic_unbind_memory(dev, mem)); + if (sc->match->driver->chiptype != CHIP_I810) + return (EINVAL); for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) { - bus_write_4(sc->sc_res[0], - AGP_I810_GTT + (i >> AGP_PAGE_SHIFT) * 4, 0); + sc->match->driver->install_gtt_pte(dev, i >> AGP_PAGE_SHIFT, + 0, 0); } - - return 0; + return (0); } static device_method_t agp_i810_methods[] = { @@ -1123,7 +2117,7 @@ static device_method_t agp_i810_methods[] = { /* AGP interface */ DEVMETHOD(agp_get_aperture, agp_generic_get_aperture), - DEVMETHOD(agp_set_aperture, agp_i810_set_aperture), + DEVMETHOD(agp_set_aperture, agp_i810_method_set_aperture), DEVMETHOD(agp_bind_page, agp_i810_bind_page), DEVMETHOD(agp_unbind_page, agp_i810_unbind_page), DEVMETHOD(agp_flush_tlb, agp_i810_flush_tlb), @@ -1132,6 +2126,7 @@ static device_method_t agp_i810_methods[] = { DEVMETHOD(agp_free_memory, agp_i810_free_memory), DEVMETHOD(agp_bind_memory, agp_i810_bind_memory), DEVMETHOD(agp_unbind_memory, agp_i810_unbind_memory), + DEVMETHOD(agp_chipset_flush, agp_intel_gtt_chipset_flush), { 0, 0 } }; @@ -1147,3 +2142,424 @@ static devclass_t agp_devclass; DRIVER_MODULE(agp_i810, vgapci, agp_i810_driver, agp_devclass, 0, 0); MODULE_DEPEND(agp_i810, agp, 1, 1, 1); MODULE_DEPEND(agp_i810, pci, 1, 1, 1); + +extern vm_page_t bogus_page; + +void +agp_intel_gtt_clear_range(device_t dev, u_int first_entry, u_int num_entries) +{ + struct agp_i810_softc *sc; + u_int i; + + sc = device_get_softc(dev); + for (i = 0; i < num_entries; i++) + sc->match->driver->install_gtt_pte(dev, first_entry + i, + VM_PAGE_TO_PHYS(bogus_page), 0); + sc->match->driver->read_gtt_pte(dev, first_entry + num_entries - 1); +} + +void +agp_intel_gtt_insert_pages(device_t dev, u_int first_entry, u_int num_entries, + vm_page_t *pages, u_int flags) +{ + struct agp_i810_softc *sc; + u_int i; + + sc = device_get_softc(dev); + for (i = 0; i < num_entries; i++) { + MPASS(pages[i]->valid == VM_PAGE_BITS_ALL); + MPASS(pages[i]->wire_count > 0); + sc->match->driver->install_gtt_pte(dev, first_entry + i, + VM_PAGE_TO_PHYS(pages[i]), flags); + } + sc->match->driver->read_gtt_pte(dev, first_entry + num_entries - 1); +} + +struct intel_gtt +agp_intel_gtt_get(device_t dev) +{ + struct agp_i810_softc *sc; + struct intel_gtt res; + + sc = device_get_softc(dev); + res.stolen_size = sc->stolen_size; + res.gtt_total_entries = sc->gtt_total_entries; + res.gtt_mappable_entries = sc->gtt_mappable_entries; + res.do_idle_maps = 0; + res.scratch_page_dma = VM_PAGE_TO_PHYS(bogus_page); + return (res); +} + +static int +agp_i810_chipset_flush_setup(device_t dev) +{ + + return (0); +} + +static void +agp_i810_chipset_flush_teardown(device_t dev) +{ + + /* Nothing to do. */ +} + +static void +agp_i810_chipset_flush(device_t dev) +{ + + /* Nothing to do. */ +} + +static void +agp_i830_chipset_flush(device_t dev) +{ + struct agp_i810_softc *sc; + uint32_t hic; + int i; + + sc = device_get_softc(dev); + pmap_invalidate_cache(); + hic = bus_read_4(sc->sc_res[0], AGP_I830_HIC); + bus_write_4(sc->sc_res[0], AGP_I830_HIC, hic | (1 << 31)); + for (i = 0; i < 20000 /* 1 sec */; i++) { + hic = bus_read_4(sc->sc_res[0], AGP_I830_HIC); + if ((hic & (1 << 31)) != 0) + break; + DELAY(50); + } +} + +static int +agp_i915_chipset_flush_alloc_page(device_t dev, uint64_t start, uint64_t end) +{ + struct agp_i810_softc *sc; + device_t vga; + + sc = device_get_softc(dev); + vga = device_get_parent(dev); + sc->sc_flush_page_rid = 100; + sc->sc_flush_page_res = BUS_ALLOC_RESOURCE(device_get_parent(vga), dev, + SYS_RES_MEMORY, &sc->sc_flush_page_rid, start, end, PAGE_SIZE, + RF_ACTIVE); + if (sc->sc_flush_page_res == NULL) { + device_printf(dev, "Failed to allocate flush page at 0x%jx\n", + (uintmax_t)start); + return (EINVAL); + } + sc->sc_flush_page_vaddr = rman_get_virtual(sc->sc_flush_page_res); + if (bootverbose) { + device_printf(dev, "Allocated flush page phys 0x%jx virt %p\n", + (uintmax_t)rman_get_start(sc->sc_flush_page_res), + sc->sc_flush_page_vaddr); + } + return (0); +} + +static void +agp_i915_chipset_flush_free_page(device_t dev) +{ + struct agp_i810_softc *sc; + device_t vga; + + sc = device_get_softc(dev); + vga = device_get_parent(dev); + if (sc->sc_flush_page_res == NULL) + return; + BUS_DEACTIVATE_RESOURCE(device_get_parent(vga), dev, SYS_RES_MEMORY, + sc->sc_flush_page_rid, sc->sc_flush_page_res); + BUS_RELEASE_RESOURCE(device_get_parent(vga), dev, SYS_RES_MEMORY, + sc->sc_flush_page_rid, sc->sc_flush_page_res); +} + +static int +agp_i915_chipset_flush_setup(device_t dev) +{ + struct agp_i810_softc *sc; + uint32_t temp; + int error; + + sc = device_get_softc(dev); + temp = pci_read_config(sc->bdev, AGP_I915_IFPADDR, 4); + if ((temp & 1) != 0) { + temp &= ~1; + if (bootverbose) + device_printf(dev, + "Found already configured flush page at 0x%jx\n", + (uintmax_t)temp); + sc->sc_bios_allocated_flush_page = 1; + /* + * In the case BIOS initialized the flush pointer (?) + * register, expect that BIOS also set up the resource + * for the page. + */ + error = agp_i915_chipset_flush_alloc_page(dev, temp, + temp + PAGE_SIZE - 1); + if (error != 0) + return (error); + } else { + sc->sc_bios_allocated_flush_page = 0; + error = agp_i915_chipset_flush_alloc_page(dev, 0, 0xffffffff); + if (error != 0) + return (error); + temp = rman_get_start(sc->sc_flush_page_res); + pci_write_config(sc->bdev, AGP_I915_IFPADDR, temp | 1, 4); + } + return (0); +} + +static void +agp_i915_chipset_flush_teardown(device_t dev) +{ + struct agp_i810_softc *sc; + uint32_t temp; + + sc = device_get_softc(dev); + if (sc->sc_flush_page_res == NULL) + return; + if (!sc->sc_bios_allocated_flush_page) { + temp = pci_read_config(sc->bdev, AGP_I915_IFPADDR, 4); + temp &= ~1; + pci_write_config(sc->bdev, AGP_I915_IFPADDR, temp, 4); + } + agp_i915_chipset_flush_free_page(dev); +} + +static int +agp_i965_chipset_flush_setup(device_t dev) +{ + struct agp_i810_softc *sc; + uint64_t temp; + uint32_t temp_hi, temp_lo; + int error; + + sc = device_get_softc(dev); + + temp_hi = pci_read_config(sc->bdev, AGP_I965_IFPADDR + 4, 4); + temp_lo = pci_read_config(sc->bdev, AGP_I965_IFPADDR, 4); + + if ((temp_lo & 1) != 0) { + temp = ((uint64_t)temp_hi << 32) | (temp_lo & ~1); + if (bootverbose) + device_printf(dev, + "Found already configured flush page at 0x%jx\n", + (uintmax_t)temp); + sc->sc_bios_allocated_flush_page = 1; + /* + * In the case BIOS initialized the flush pointer (?) + * register, expect that BIOS also set up the resource + * for the page. + */ + error = agp_i915_chipset_flush_alloc_page(dev, temp, + temp + PAGE_SIZE - 1); + if (error != 0) + return (error); + } else { + sc->sc_bios_allocated_flush_page = 0; + error = agp_i915_chipset_flush_alloc_page(dev, 0, ~0); + if (error != 0) + return (error); + temp = rman_get_start(sc->sc_flush_page_res); + pci_write_config(sc->bdev, AGP_I965_IFPADDR + 4, + (temp >> 32) & UINT32_MAX, 4); + pci_write_config(sc->bdev, AGP_I965_IFPADDR, + (temp & UINT32_MAX) | 1, 4); + } + return (0); +} + +static void +agp_i965_chipset_flush_teardown(device_t dev) +{ + struct agp_i810_softc *sc; + uint32_t temp_lo; + + sc = device_get_softc(dev); + if (sc->sc_flush_page_res == NULL) + return; + if (!sc->sc_bios_allocated_flush_page) { + temp_lo = pci_read_config(sc->bdev, AGP_I965_IFPADDR, 4); + temp_lo &= ~1; + pci_write_config(sc->bdev, AGP_I965_IFPADDR, temp_lo, 4); + } + agp_i915_chipset_flush_free_page(dev); +} + +static void +agp_i915_chipset_flush(device_t dev) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(dev); + *(uint32_t *)sc->sc_flush_page_vaddr = 1; +} + +int +agp_intel_gtt_chipset_flush(device_t dev) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(dev); + sc->match->driver->chipset_flush(dev); + return (0); +} + +void +agp_intel_gtt_unmap_memory(device_t dev, struct sglist *sg_list) +{ +} + +int +agp_intel_gtt_map_memory(device_t dev, vm_page_t *pages, u_int num_entries, + struct sglist **sg_list) +{ + struct agp_i810_softc *sc; + struct sglist *sg; + int i; +#if 0 + int error; + bus_dma_tag_t dmat; +#endif + + if (*sg_list != NULL) + return (0); + sc = device_get_softc(dev); + sg = sglist_alloc(num_entries, M_WAITOK /* XXXKIB */); + for (i = 0; i < num_entries; i++) { + sg->sg_segs[i].ss_paddr = VM_PAGE_TO_PHYS(pages[i]); + sg->sg_segs[i].ss_len = PAGE_SIZE; + } + +#if 0 + error = bus_dma_tag_create(bus_get_dma_tag(dev), + 1 /* alignment */, 0 /* boundary */, + 1ULL << sc->match->busdma_addr_mask_sz /* lowaddr */, + BUS_SPACE_MAXADDR /* highaddr */, + NULL /* filtfunc */, NULL /* filtfuncarg */, + BUS_SPACE_MAXADDR /* maxsize */, + BUS_SPACE_UNRESTRICTED /* nsegments */, + BUS_SPACE_MAXADDR /* maxsegsz */, + 0 /* flags */, NULL /* lockfunc */, NULL /* lockfuncarg */, + &dmat); + if (error != 0) { + sglist_free(sg); + return (error); + } + /* XXXKIB */ +#endif + *sg_list = sg; + return (0); +} + +void +agp_intel_gtt_insert_sg_entries(device_t dev, struct sglist *sg_list, + u_int first_entry, u_int flags) +{ + struct agp_i810_softc *sc; + vm_paddr_t spaddr; + size_t slen; + u_int i, j; + + sc = device_get_softc(dev); + for (i = j = 0; j < sg_list->sg_nseg; j++) { + spaddr = sg_list->sg_segs[i].ss_paddr; + slen = sg_list->sg_segs[i].ss_len; + for (; slen > 0; i++) { + sc->match->driver->install_gtt_pte(dev, first_entry + i, + spaddr, flags); + spaddr += AGP_PAGE_SIZE; + slen -= AGP_PAGE_SIZE; + } + } + sc->match->driver->read_gtt_pte(dev, first_entry + i - 1); +} + +void +intel_gtt_clear_range(u_int first_entry, u_int num_entries) +{ + + agp_intel_gtt_clear_range(intel_agp, first_entry, num_entries); +} + +void +intel_gtt_insert_pages(u_int first_entry, u_int num_entries, vm_page_t *pages, + u_int flags) +{ + + agp_intel_gtt_insert_pages(intel_agp, first_entry, num_entries, + pages, flags); +} + +struct intel_gtt +intel_gtt_get(void) +{ + + return (agp_intel_gtt_get(intel_agp)); +} + +int +intel_gtt_chipset_flush(void) +{ + + return (agp_intel_gtt_chipset_flush(intel_agp)); +} + +void +intel_gtt_unmap_memory(struct sglist *sg_list) +{ + + agp_intel_gtt_unmap_memory(intel_agp, sg_list); +} + +int +intel_gtt_map_memory(vm_page_t *pages, u_int num_entries, + struct sglist **sg_list) +{ + + return (agp_intel_gtt_map_memory(intel_agp, pages, num_entries, + sg_list)); +} + +void +intel_gtt_insert_sg_entries(struct sglist *sg_list, u_int first_entry, + u_int flags) +{ + + agp_intel_gtt_insert_sg_entries(intel_agp, sg_list, first_entry, flags); +} + +device_t +intel_gtt_get_bridge_device(void) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(intel_agp); + return (sc->bdev); +} + +vm_paddr_t +intel_gtt_read_pte_paddr(u_int entry) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(intel_agp); + return (sc->match->driver->read_gtt_pte_paddr(intel_agp, entry)); +} + +u_int32_t +intel_gtt_read_pte(u_int entry) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(intel_agp); + return (sc->match->driver->read_gtt_pte(intel_agp, entry)); +} + +void +intel_gtt_write(u_int entry, uint32_t val) +{ + struct agp_i810_softc *sc; + + sc = device_get_softc(intel_agp); + return (sc->match->driver->write_gtt(intel_agp, entry, val)); +} diff --git a/sys/dev/agp/agp_i810.h b/sys/dev/agp/agp_i810.h new file mode 100644 index 00000000000..68cad87a158 --- /dev/null +++ b/sys/dev/agp/agp_i810.h @@ -0,0 +1,101 @@ +/*- + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Konstantin Belousov under sponsorship from + * the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef AGP_AGP_I810_H +#define AGP_AGP_I810_H + +#include +#include + +#include +#include + +/* Special gtt memory types */ +#define AGP_DCACHE_MEMORY 1 +#define AGP_PHYS_MEMORY 2 + +/* New caching attributes for gen6/sandybridge */ +#define AGP_USER_CACHED_MEMORY_LLC_MLC (AGP_USER_TYPES + 2) +#define AGP_USER_UNCACHED_MEMORY (AGP_USER_TYPES + 4) + +/* flag for GFDT type */ +#define AGP_USER_CACHED_MEMORY_GFDT (1 << 3) + +struct intel_gtt { + /* Size of memory reserved for graphics by the BIOS */ + u_int stolen_size; + /* Total number of gtt entries. */ + u_int gtt_total_entries; + /* + * Part of the gtt that is mappable by the cpu, for those + * chips where this is not the full gtt. + */ + u_int gtt_mappable_entries; + + /* + * Always false. + */ + u_int do_idle_maps; + + /* + * Share the scratch page dma with ppgtts. + */ + vm_paddr_t scratch_page_dma; +}; + +struct intel_gtt agp_intel_gtt_get(device_t dev); +int agp_intel_gtt_chipset_flush(device_t dev); +void agp_intel_gtt_unmap_memory(device_t dev, struct sglist *sg_list); +void agp_intel_gtt_clear_range(device_t dev, u_int first_entry, + u_int num_entries); +int agp_intel_gtt_map_memory(device_t dev, vm_page_t *pages, u_int num_entries, + struct sglist **sg_list); +void agp_intel_gtt_insert_sg_entries(device_t dev, struct sglist *sg_list, + u_int pg_start, u_int flags); +void agp_intel_gtt_insert_pages(device_t dev, u_int first_entry, + u_int num_entries, vm_page_t *pages, u_int flags); + +struct intel_gtt intel_gtt_get(void); +int intel_gtt_chipset_flush(void); +void intel_gtt_unmap_memory(struct sglist *sg_list); +void intel_gtt_clear_range(u_int first_entry, u_int num_entries); +int intel_gtt_map_memory(vm_page_t *pages, u_int num_entries, + struct sglist **sg_list); +void intel_gtt_insert_sg_entries(struct sglist *sg_list, u_int pg_start, + u_int flags); +void intel_gtt_insert_pages(u_int first_entry, u_int num_entries, + vm_page_t *pages, u_int flags); +vm_paddr_t intel_gtt_read_pte_paddr(u_int entry); +u_int32_t intel_gtt_read_pte(u_int entry); +device_t intel_gtt_get_bridge_device(void); +void intel_gtt_write(u_int entry, uint32_t val); + +#endif diff --git a/sys/dev/agp/agp_if.m b/sys/dev/agp/agp_if.m index da2e19a80ce..4a97ca95b34 100644 --- a/sys/dev/agp/agp_if.m +++ b/sys/dev/agp/agp_if.m @@ -36,6 +36,14 @@ # INTERFACE agp; +CODE { + static int + null_agp_chipset_flush(device_t dev) + { + return (ENXIO); + } +}; + # # Return the current aperture size. # @@ -132,3 +140,7 @@ METHOD int unbind_memory { device_t dev; struct agp_memory *handle; }; + +METHOD int chipset_flush { + device_t dev; +} DEFAULT null_agp_chipset_flush; diff --git a/sys/dev/agp/agppriv.h b/sys/dev/agp/agppriv.h index fd64056f6b4..00e7dc13b8d 100644 --- a/sys/dev/agp/agppriv.h +++ b/sys/dev/agp/agppriv.h @@ -73,7 +73,7 @@ struct agp_softc { struct agp_memory_list as_memory; /* list of allocated memory */ int as_nextid; /* next memory block id */ int as_isopen; /* user device is open */ - struct cdev *as_devnode; /* from make_dev */ + struct cdev *as_devnode; /* from make_dev */ struct mtx as_lock; /* lock for access to GATT */ }; diff --git a/sys/dev/agp/agpreg.h b/sys/dev/agp/agpreg.h index b453cac1b39..dfa93a502b7 100644 --- a/sys/dev/agp/agpreg.h +++ b/sys/dev/agp/agpreg.h @@ -176,10 +176,33 @@ #define AGP_I810_GMADR 0x10 #define AGP_I810_MMADR 0x14 +#define I810_PTE_VALID 0x00000001 + +/* + * Cache control + * + * Pre-Sandybridge bits + */ +#define I810_PTE_MAIN_UNCACHED 0x00000000 +#define I810_PTE_LOCAL 0x00000002 /* Non-snooped main phys memory */ +#define I830_PTE_SYSTEM_CACHED 0x00000006 /* Snooped main phys memory */ + +/* + * Sandybridge + * LLC - Last Level Cache + * MMC - Mid Level Cache + */ +#define GEN6_PTE_RESERVED 0x00000000 +#define GEN6_PTE_UNCACHED 0x00000002 /* Do not cache */ +#define GEN6_PTE_LLC 0x00000004 /* Cache in LLC */ +#define GEN6_PTE_LLC_MLC 0x00000006 /* Cache in LLC and MLC */ +#define GEN6_PTE_GFDT 0x00000008 /* Graphics Data Type */ + /* * Memory mapped register offsets for i810 chipset. */ #define AGP_I810_PGTBL_CTL 0x2020 +#define AGP_I810_PGTBL_ENABLED 0x00000001 /** * This field determines the actual size of the global GTT on the 965 * and G33 @@ -187,7 +210,23 @@ #define AGP_I810_PGTBL_SIZE_MASK 0x0000000e #define AGP_I810_PGTBL_SIZE_512KB (0 << 1) #define AGP_I810_PGTBL_SIZE_256KB (1 << 1) -#define AGP_I810_PGTBL_SIZE_128KB (2 << 1) +#define AGP_I810_PGTBL_SIZE_128KB (2 << 1) +#define AGP_I810_PGTBL_SIZE_1MB (3 << 1) +#define AGP_I810_PGTBL_SIZE_2MB (4 << 1) +#define AGP_I810_PGTBL_SIZE_1_5MB (5 << 1) +#define AGP_G33_GCC1_SIZE_MASK (3 << 8) +#define AGP_G33_GCC1_SIZE_1M (1 << 8) +#define AGP_G33_GCC1_SIZE_2M (2 << 8) +#define AGP_G4x_GCC1_SIZE_MASK (0xf << 8) +#define AGP_G4x_GCC1_SIZE_1M (0x1 << 8) +#define AGP_G4x_GCC1_SIZE_2M (0x3 << 8) +#define AGP_G4x_GCC1_SIZE_VT_EN (0x8 << 8) +#define AGP_G4x_GCC1_SIZE_VT_1M \ + (AGP_G4x_GCC1_SIZE_1M | AGP_G4x_GCC1_SIZE_VT_EN) +#define AGP_G4x_GCC1_SIZE_VT_1_5M ((0x2 << 8) | AGP_G4x_GCC1_SIZE_VT_EN) +#define AGP_G4x_GCC1_SIZE_VT_2M \ + (AGP_G4x_GCC1_SIZE_2M | AGP_G4x_GCC1_SIZE_VT_EN) + #define AGP_I810_DRT 0x3000 #define AGP_I810_DRT_UNPOPULATED 0x00 #define AGP_I810_DRT_POPULATED 0x01 @@ -207,6 +246,7 @@ #define AGP_I830_GCC1_GMASIZE 0x01 #define AGP_I830_GCC1_GMASIZE_64 0x01 #define AGP_I830_GCC1_GMASIZE_128 0x00 +#define AGP_I830_HIC 0x70 /* * Config registers for 852GM/855GM/865G device 0 @@ -243,6 +283,9 @@ #define AGP_I915_GCC1_GMS_STOLEN_48M 0x60 #define AGP_I915_GCC1_GMS_STOLEN_64M 0x70 #define AGP_I915_DEVEN 0x54 +#define AGP_SB_DEVEN_D2EN 0x10 /* SB+ has IGD enabled bit */ +#define AGP_SB_DEVEN_D2EN_ENABLED 0x10 /* in different place */ +#define AGP_SB_DEVEN_D2EN_DISABLED 0x00 #define AGP_I915_DEVEN_D2F0 0x08 #define AGP_I915_DEVEN_D2F0_ENABLED 0x08 #define AGP_I915_DEVEN_D2F0_DISABLED 0x00 @@ -250,6 +293,7 @@ #define AGP_I915_MSAC_GMASIZE 0x02 #define AGP_I915_MSAC_GMASIZE_128 0x02 #define AGP_I915_MSAC_GMASIZE_256 0x00 +#define AGP_I915_IFPADDR 0x60 /* * G965 registers @@ -262,6 +306,8 @@ #define AGP_I965_PGTBL_SIZE_1MB (3 << 1) #define AGP_I965_PGTBL_SIZE_2MB (4 << 1) #define AGP_I965_PGTBL_SIZE_1_5MB (5 << 1) +#define AGP_I965_PGTBL_CTL2 0x20c4 +#define AGP_I965_IFPADDR 0x70 /* * G33 registers @@ -275,11 +321,42 @@ /* * G4X registers */ +#define AGP_G4X_GMADR 0x20 +#define AGP_G4X_MMADR 0x10 +#define AGP_G4X_GTTADR 0x18 #define AGP_G4X_GCC1_GMS_STOLEN_96M 0xa0 #define AGP_G4X_GCC1_GMS_STOLEN_160M 0xb0 #define AGP_G4X_GCC1_GMS_STOLEN_224M 0xc0 #define AGP_G4X_GCC1_GMS_STOLEN_352M 0xd0 +/* + * SandyBridge/IvyBridge registers + */ +#define AGP_SNB_GCC1 0x50 +#define AGP_SNB_GMCH_GMS_STOLEN_MASK 0xF8 +#define AGP_SNB_GMCH_GMS_STOLEN_32M (1 << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_64M (2 << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_96M (3 << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_128M (4 << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_160M (5 << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_192M (6 << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_224M (7 << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_256M (8 << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_288M (9 << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_320M (0xa << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_352M (0xb << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_384M (0xc << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_416M (0xd << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_448M (0xe << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_480M (0xf << 3) +#define AGP_SNB_GMCH_GMS_STOLEN_512M (0x10 << 3) +#define AGP_SNB_GTT_SIZE_0M (0 << 8) +#define AGP_SNB_GTT_SIZE_1M (1 << 8) +#define AGP_SNB_GTT_SIZE_2M (2 << 8) +#define AGP_SNB_GTT_SIZE_MASK (3 << 8) + +#define AGP_SNB_GFX_MODE 0x02520 + /* * NVIDIA nForce/nForce2 registers */ diff --git a/sys/dev/agp/agpvar.h b/sys/dev/agp/agpvar.h index 52d40ef2527..5aeebc949bd 100644 --- a/sys/dev/agp/agpvar.h +++ b/sys/dev/agp/agpvar.h @@ -122,4 +122,10 @@ int agp_unbind_memory(device_t dev, void *handle); */ void agp_memory_info(device_t dev, void *handle, struct agp_memory_info *mi); +#define AGP_NORMAL_MEMORY 0 + +#define AGP_USER_TYPES (1 << 16) +#define AGP_USER_MEMORY (AGP_USER_TYPES) +#define AGP_USER_CACHED_MEMORY (AGP_USER_TYPES + 1) + #endif /* !_PCI_AGPVAR_H_ */ diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c index c3557366c32..481fe0ab448 100644 --- a/sys/dev/ahci/ahci.c +++ b/sys/dev/ahci/ahci.c @@ -199,8 +199,12 @@ static struct { {0x91231b4b, 0x00, "Marvell 88SE912x", AHCI_Q_EDGEIS|AHCI_Q_SATA2|AHCI_Q_NOBSYRES}, {0x91251b4b, 0x00, "Marvell 88SE9125", AHCI_Q_NOBSYRES}, {0x91281b4b, 0x00, "Marvell 88SE9128", AHCI_Q_NOBSYRES|AHCI_Q_ALTSIG}, + {0x91301b4b, 0x00, "Marvell 88SE9130", AHCI_Q_NOBSYRES|AHCI_Q_ALTSIG}, {0x91721b4b, 0x00, "Marvell 88SE9172", AHCI_Q_NOBSYRES}, {0x91821b4b, 0x00, "Marvell 88SE9182", AHCI_Q_NOBSYRES}, + {0x92201b4b, 0x00, "Marvell 88SE9220", AHCI_Q_NOBSYRES|AHCI_Q_ALTSIG}, + {0x92301b4b, 0x00, "Marvell 88SE9230", AHCI_Q_NOBSYRES|AHCI_Q_ALTSIG}, + {0x92351b4b, 0x00, "Marvell 88SE9235", AHCI_Q_NOBSYRES}, {0x06201103, 0x00, "HighPoint RocketRAID 620", AHCI_Q_NOBSYRES}, {0x06201b4b, 0x00, "HighPoint RocketRAID 620", AHCI_Q_NOBSYRES}, {0x06221103, 0x00, "HighPoint RocketRAID 622", AHCI_Q_NOBSYRES}, @@ -1457,7 +1461,9 @@ ahci_ch_intr_locked(void *data) struct ahci_channel *ch = device_get_softc(dev); mtx_lock(&ch->mtx); + xpt_batch_start(ch->sim); ahci_ch_intr(data); + xpt_batch_done(ch->sim); mtx_unlock(&ch->mtx); } @@ -2878,7 +2884,7 @@ ahciaction(struct cam_sim *sim, union ccb *ccb) d = &ch->curr[ccb->ccb_h.target_id]; else d = &ch->user[ccb->ccb_h.target_id]; - cts->protocol = PROTO_ATA; + cts->protocol = PROTO_UNSPECIFIED; cts->protocol_version = PROTO_VERSION_UNSPECIFIED; cts->transport = XPORT_SATA; cts->transport_version = XPORT_VERSION_UNSPECIFIED; diff --git a/sys/dev/aic7xxx/aic79xx.c b/sys/dev/aic7xxx/aic79xx.c index 86b13fadb0b..363301bcea4 100644 --- a/sys/dev/aic7xxx/aic79xx.c +++ b/sys/dev/aic7xxx/aic79xx.c @@ -8561,7 +8561,7 @@ void ahd_send_lstate_events(struct ahd_softc *ahd, struct ahd_tmode_lstate *lstate) { struct ccb_hdr *ccbh; - struct ccb_immed_notify *inot; + struct ccb_immediate_notify *inot; while (lstate->event_r_idx != lstate->event_w_idx && (ccbh = SLIST_FIRST(&lstate->immed_notifies)) != NULL) { @@ -8569,19 +8569,18 @@ ahd_send_lstate_events(struct ahd_softc *ahd, struct ahd_tmode_lstate *lstate) event = &lstate->event_buffer[lstate->event_r_idx]; SLIST_REMOVE_HEAD(&lstate->immed_notifies, sim_links.sle); - inot = (struct ccb_immed_notify *)ccbh; + inot = (struct ccb_immediate_notify *)ccbh; switch (event->event_type) { case EVENT_TYPE_BUS_RESET: ccbh->status = CAM_SCSI_BUS_RESET|CAM_DEV_QFRZN; break; default: ccbh->status = CAM_MESSAGE_RECV|CAM_DEV_QFRZN; - inot->message_args[0] = event->event_type; - inot->message_args[1] = event->event_arg; + inot->arg = event->event_type; + inot->seq_id = event->event_arg; break; } inot->initiator_id = event->initiator_id; - inot->sense_len = 0; xpt_done((union ccb *)inot); lstate->event_r_idx++; if (lstate->event_r_idx == AHD_TMODE_EVENT_BUFFER_SIZE) diff --git a/sys/dev/aic7xxx/aic79xx_osm.c b/sys/dev/aic7xxx/aic79xx_osm.c index 375de63ae82..1d44b9f7e2c 100644 --- a/sys/dev/aic7xxx/aic79xx_osm.c +++ b/sys/dev/aic7xxx/aic79xx_osm.c @@ -601,8 +601,8 @@ ahd_action(struct cam_sim *sim, union ccb *ccb) break; } #ifdef AHD_TARGET_MODE - case XPT_NOTIFY_ACK: - case XPT_IMMED_NOTIFY: + case XPT_NOTIFY_ACKNOWLEDGE: + case XPT_IMMEDIATE_NOTIFY: { struct ahd_tmode_tstate *tstate; struct ahd_tmode_lstate *lstate; @@ -1189,7 +1189,7 @@ ahd_abort_ccb(struct ahd_softc *ahd, struct cam_sim *sim, union ccb *ccb) switch (abort_ccb->ccb_h.func_code) { #ifdef AHD_TARGET_MODE case XPT_ACCEPT_TARGET_IO: - case XPT_IMMED_NOTIFY: + case XPT_IMMEDIATE_NOTIFY: case XPT_CONT_TARGET_IO: { struct ahd_tmode_tstate *tstate; @@ -1207,7 +1207,7 @@ ahd_abort_ccb(struct ahd_softc *ahd, struct cam_sim *sim, union ccb *ccb) if (abort_ccb->ccb_h.func_code == XPT_ACCEPT_TARGET_IO) list = &lstate->accept_tios; - else if (abort_ccb->ccb_h.func_code == XPT_IMMED_NOTIFY) + else if (abort_ccb->ccb_h.func_code == XPT_IMMEDIATE_NOTIFY) list = &lstate->immed_notifies; else list = NULL; diff --git a/sys/dev/aic7xxx/aic7xxx.c b/sys/dev/aic7xxx/aic7xxx.c index d5bac1d4563..7bbe3c58b7c 100644 --- a/sys/dev/aic7xxx/aic7xxx.c +++ b/sys/dev/aic7xxx/aic7xxx.c @@ -6368,7 +6368,7 @@ void ahc_send_lstate_events(struct ahc_softc *ahc, struct ahc_tmode_lstate *lstate) { struct ccb_hdr *ccbh; - struct ccb_immed_notify *inot; + struct ccb_immediate_notify *inot; while (lstate->event_r_idx != lstate->event_w_idx && (ccbh = SLIST_FIRST(&lstate->immed_notifies)) != NULL) { @@ -6376,19 +6376,18 @@ ahc_send_lstate_events(struct ahc_softc *ahc, struct ahc_tmode_lstate *lstate) event = &lstate->event_buffer[lstate->event_r_idx]; SLIST_REMOVE_HEAD(&lstate->immed_notifies, sim_links.sle); - inot = (struct ccb_immed_notify *)ccbh; + inot = (struct ccb_immediate_notify *)ccbh; switch (event->event_type) { case EVENT_TYPE_BUS_RESET: ccbh->status = CAM_SCSI_BUS_RESET|CAM_DEV_QFRZN; break; default: ccbh->status = CAM_MESSAGE_RECV|CAM_DEV_QFRZN; - inot->message_args[0] = event->event_type; - inot->message_args[1] = event->event_arg; + inot->arg = event->event_type; + inot->seq_id = event->event_arg; break; } inot->initiator_id = event->initiator_id; - inot->sense_len = 0; xpt_done((union ccb *)inot); lstate->event_r_idx++; if (lstate->event_r_idx == AHC_TMODE_EVENT_BUFFER_SIZE) diff --git a/sys/dev/aic7xxx/aic7xxx_osm.c b/sys/dev/aic7xxx/aic7xxx_osm.c index eeb06af0c23..281b00ec9e5 100644 --- a/sys/dev/aic7xxx/aic7xxx_osm.c +++ b/sys/dev/aic7xxx/aic7xxx_osm.c @@ -568,8 +568,8 @@ ahc_action(struct cam_sim *sim, union ccb *ccb) } break; } - case XPT_NOTIFY_ACK: - case XPT_IMMED_NOTIFY: + case XPT_NOTIFY_ACKNOWLEDGE: + case XPT_IMMEDIATE_NOTIFY: { struct ahc_tmode_tstate *tstate; struct ahc_tmode_lstate *lstate; @@ -1248,7 +1248,7 @@ ahc_abort_ccb(struct ahc_softc *ahc, struct cam_sim *sim, union ccb *ccb) abort_ccb = ccb->cab.abort_ccb; switch (abort_ccb->ccb_h.func_code) { case XPT_ACCEPT_TARGET_IO: - case XPT_IMMED_NOTIFY: + case XPT_IMMEDIATE_NOTIFY: case XPT_CONT_TARGET_IO: { struct ahc_tmode_tstate *tstate; @@ -1266,7 +1266,7 @@ ahc_abort_ccb(struct ahc_softc *ahc, struct cam_sim *sim, union ccb *ccb) if (abort_ccb->ccb_h.func_code == XPT_ACCEPT_TARGET_IO) list = &lstate->accept_tios; - else if (abort_ccb->ccb_h.func_code == XPT_IMMED_NOTIFY) + else if (abort_ccb->ccb_h.func_code == XPT_IMMEDIATE_NOTIFY) list = &lstate->immed_notifies; else list = NULL; diff --git a/sys/dev/aic7xxx/aicasm/Makefile b/sys/dev/aic7xxx/aicasm/Makefile index b8352d67cf7..97b93d00e86 100644 --- a/sys/dev/aic7xxx/aicasm/Makefile +++ b/sys/dev/aic7xxx/aicasm/Makefile @@ -24,8 +24,7 @@ WARNS?= 5 DEPENDFILE= .depend_aicasm .endif -NOSTDINC= -nostdinc -CFLAGS+= ${NOSTDINC} -I/usr/include -I. +CFLAGS+= -I. .ifdef MAKESRCPATH CFLAGS+= -I${MAKESRCPATH} .endif diff --git a/sys/dev/aic7xxx/aicasm/aicasm.c b/sys/dev/aic7xxx/aicasm/aicasm.c index 1b88ba02e80..b5e159213e5 100644 --- a/sys/dev/aic7xxx/aicasm/aicasm.c +++ b/sys/dev/aic7xxx/aicasm/aicasm.c @@ -530,7 +530,7 @@ output_listing(char *ifilename) int instrptr; unsigned int line; int func_count; - int skip_addr; + unsigned int skip_addr; instrcount = 0; instrptr = 0; diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c index 9ea25c0495e..b1c09ab2fd0 100644 --- a/sys/dev/ata/ata-all.c +++ b/sys/dev/ata/ata-all.c @@ -544,9 +544,11 @@ ata_interrupt(void *data) struct ata_channel *ch = (struct ata_channel *)data; mtx_lock(&ch->state_mtx); + xpt_batch_start(ch->sim); #endif ata_interrupt_locked(data); #ifdef ATA_CAM + xpt_batch_done(ch->sim); mtx_unlock(&ch->state_mtx); #endif } @@ -885,7 +887,7 @@ ata_add_child(device_t parent, struct ata_device *atadev, int unit) { device_t child; - if ((child = device_add_child(parent, NULL, unit))) { + if ((child = device_add_child(parent, (unit < 0) ? NULL : "ad", unit))) { device_set_softc(child, atadev); device_quiet(child); atadev->dev = child; @@ -1785,7 +1787,7 @@ ataaction(struct cam_sim *sim, union ccb *ccb) d = &ch->curr[ccb->ccb_h.target_id]; else d = &ch->user[ccb->ccb_h.target_id]; - cts->protocol = PROTO_ATA; + cts->protocol = PROTO_UNSPECIFIED; cts->protocol_version = PROTO_VERSION_UNSPECIFIED; if (ch->flags & ATA_SATA) { cts->transport = XPORT_SATA; diff --git a/sys/dev/ata/chipsets/ata-ite.c b/sys/dev/ata/chipsets/ata-ite.c index fe6ff21b2a8..3f890fd536d 100644 --- a/sys/dev/ata/chipsets/ata-ite.c +++ b/sys/dev/ata/chipsets/ata-ite.c @@ -105,10 +105,10 @@ ata_ite_chipinit(device_t dev) ctlr->setmode = ata_ite_821x_setmode; /* No timing restrictions initally. */ - ctlr->chipset_data = (void *)0; + ctlr->chipset_data = NULL; } ctlr->ch_attach = ata_ite_ch_attach; - return 0; + return (0); } static int @@ -119,6 +119,9 @@ ata_ite_ch_attach(device_t dev) error = ata_pci_ch_attach(dev); ch->flags |= ATA_CHECKS_CABLE; +#ifdef ATA_CAM + ch->flags |= ATA_NO_ATAPI_DMA; +#endif return (error); } diff --git a/sys/dev/ata/chipsets/ata-via.c b/sys/dev/ata/chipsets/ata-via.c index 956a4e2b290..01b86459755 100644 --- a/sys/dev/ata/chipsets/ata-via.c +++ b/sys/dev/ata/chipsets/ata-via.c @@ -472,12 +472,10 @@ ata_via_sata_reset(device_t dev) static int ata_via_sata_scr_read(device_t dev, int port, int reg, u_int32_t *result) { - struct ata_channel *ch; device_t parent; uint32_t val; parent = device_get_parent(dev); - ch = device_get_softc(dev); port = (port == 1) ? 1 : 0; switch (reg) { case ATA_SSTATUS: @@ -520,12 +518,10 @@ ata_via_sata_scr_read(device_t dev, int port, int reg, u_int32_t *result) static int ata_via_sata_scr_write(device_t dev, int port, int reg, u_int32_t value) { - struct ata_channel *ch; device_t parent; uint32_t val; parent = device_get_parent(dev); - ch = device_get_softc(dev); port = (port == 1) ? 1 : 0; switch (reg) { case ATA_SERROR: diff --git a/sys/dev/ath/ah_osdep.c b/sys/dev/ath/ah_osdep.c index 50986325977..043ebed87fd 100644 --- a/sys/dev/ath/ah_osdep.c +++ b/sys/dev/ath/ah_osdep.c @@ -47,6 +47,7 @@ #include /* XXX for ether_sprintf */ #include +#include /* * WiSoC boards overload the bus tag with information about the @@ -137,8 +138,6 @@ ath_hal_ether_sprintf(const u_int8_t *mac) #ifdef AH_DEBUG -/* This must match the definition in ath_hal/ah_debug.h */ -#define HAL_DEBUG_UNMASKABLE 0xf0000000 void DO_HALDEBUG(struct ath_hal *ah, u_int mask, const char* fmt, ...) { diff --git a/sys/dev/ath/ah_osdep.h b/sys/dev/ath/ah_osdep.h index 6daed0a2946..23eda0dd79c 100644 --- a/sys/dev/ath/ah_osdep.h +++ b/sys/dev/ath/ah_osdep.h @@ -63,6 +63,7 @@ typedef bus_space_handle_t HAL_BUS_HANDLE; #define OS_INLINE __inline #define OS_MEMZERO(_a, _n) bzero((_a), (_n)) #define OS_MEMCPY(_d, _s, _n) memcpy(_d,_s,_n) +#define OS_MEMCMP(_a, _b, _l) memcmp((_a), (_b), (_l)) #define abs(_a) __builtin_abs(_a) diff --git a/sys/dev/ath/ath_dfs/null/dfs_null.c b/sys/dev/ath/ath_dfs/null/dfs_null.c index a8aabb4018b..c2d7f5eff79 100644 --- a/sys/dev/ath/ath_dfs/null/dfs_null.c +++ b/sys/dev/ath/ath_dfs/null/dfs_null.c @@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$"); /* * This implements an empty DFS module. */ +#include "opt_ath.h" #include "opt_inet.h" #include "opt_wlan.h" @@ -102,7 +103,7 @@ __FBSDID("$FreeBSD$"); int ath_dfs_attach(struct ath_softc *sc) { - return 1; + return (1); } /* @@ -111,11 +112,12 @@ ath_dfs_attach(struct ath_softc *sc) int ath_dfs_detach(struct ath_softc *sc) { - return 1; + return (1); } /* - * Enable radar check + * Enable radar check. Return 1 if the driver should + * enable radar PHY errors, or 0 if not. */ int ath_dfs_radar_enable(struct ath_softc *sc, struct ieee80211_channel *chan) @@ -163,9 +165,12 @@ ath_dfs_radar_enable(struct ath_softc *sc, struct ieee80211_channel *chan) /* * Process DFS related PHY errors + * + * The mbuf is not "ours" and if we want a copy, we have + * to take a copy. It'll be freed after this function returns. */ void -ath_dfs_process_phy_err(struct ath_softc *sc, const char *buf, +ath_dfs_process_phy_err(struct ath_softc *sc, struct mbuf *m, uint64_t tsf, struct ath_rx_status *rxstat) { @@ -182,7 +187,7 @@ int ath_dfs_process_radar_event(struct ath_softc *sc, struct ieee80211_channel *chan) { - return 0; + return (0); } /* @@ -195,7 +200,7 @@ ath_dfs_process_radar_event(struct ath_softc *sc, int ath_dfs_tasklet_needed(struct ath_softc *sc, struct ieee80211_channel *chan) { - return 0; + return (0); } /* @@ -272,7 +277,7 @@ bad: free(indata, M_TEMP); if ((ad->ad_id & ATH_DIAG_DYN) && outdata != NULL) free(outdata, M_TEMP); - return error; + return (error); } /* @@ -282,5 +287,5 @@ int ath_dfs_get_thresholds(struct ath_softc *sc, HAL_PHYERR_PARAM *param) { ath_hal_getdfsthresh(sc->sc_ah, param); - return 1; + return (1); } diff --git a/sys/dev/ath/ath_hal/ah.c b/sys/dev/ath/ath_hal/ah.c index 5a8046d6749..dea17363cfe 100644 --- a/sys/dev/ath/ath_hal/ah.c +++ b/sys/dev/ath/ath_hal/ah.c @@ -630,6 +630,34 @@ ath_hal_getcapability(struct ath_hal *ah, HAL_CAPABILITY_TYPE type, case HAL_CAP_REG_FLAG: *result = AH_PRIVATE(ah)->ah_currentRDext; return HAL_OK; + case HAL_CAP_ENHANCED_DMA_SUPPORT: + return pCap->halEnhancedDmaSupport ? HAL_OK : HAL_ENOTSUPP; + case HAL_CAP_NUM_TXMAPS: + *result = pCap->halNumTxMaps; + return HAL_OK; + case HAL_CAP_TXDESCLEN: + *result = pCap->halTxDescLen; + return HAL_OK; + case HAL_CAP_TXSTATUSLEN: + *result = pCap->halTxStatusLen; + return HAL_OK; + case HAL_CAP_RXSTATUSLEN: + *result = pCap->halRxStatusLen; + return HAL_OK; + case HAL_CAP_RXFIFODEPTH: + switch (capability) { + case HAL_RX_QUEUE_HP: + *result = pCap->halRxHpFifoDepth; + return HAL_OK; + case HAL_RX_QUEUE_LP: + *result = pCap->halRxLpFifoDepth; + return HAL_OK; + default: + return HAL_ENOTSUPP; + } + case HAL_CAP_RXBUFSIZE: + case HAL_CAP_NUM_MR_RETRIES: + return HAL_EINVAL; /* XXX not yet */ case HAL_CAP_BT_COEX: return pCap->halBtCoexSupport ? HAL_OK : HAL_ENOTSUPP; case HAL_CAP_HT20_SGI: @@ -667,6 +695,7 @@ ath_hal_getcapability(struct ath_hal *ah, HAL_CAPABILITY_TYPE type, return pCap->halHasBBReadWar? HAL_OK : HAL_ENOTSUPP; case HAL_CAP_SERIALISE_WAR: /* PCI register serialisation */ return pCap->halSerialiseRegWar ? HAL_OK : HAL_ENOTSUPP; + default: return HAL_EINVAL; } diff --git a/sys/dev/ath/ath_hal/ah.h b/sys/dev/ath/ath_hal/ah.h index ba1ea83897e..aa3e8b6123b 100644 --- a/sys/dev/ath/ath_hal/ah.h +++ b/sys/dev/ath/ath_hal/ah.h @@ -73,6 +73,7 @@ typedef enum { HAL_EINPROGRESS = 15, /* Operation incomplete */ HAL_EEBADREG = 16, /* EEPROM invalid regulatory contents */ HAL_EEBADCC = 17, /* EEPROM invalid country code */ + HAL_INV_PMODE = 18, /* Couldn't bring out of sleep state */ } HAL_STATUS; typedef enum { @@ -109,7 +110,7 @@ typedef enum { HAL_CAP_TPC_ACK = 26, /* ack txpower with per-packet tpc */ HAL_CAP_TPC_CTS = 27, /* cts txpower with per-packet tpc */ HAL_CAP_11D = 28, /* 11d beacon support for changing cc */ - + HAL_CAP_PCIE_PS = 29, HAL_CAP_HT = 30, /* hardware can support HT */ HAL_CAP_GTXTO = 31, /* hardware supports global tx timeout */ HAL_CAP_FAST_CC = 32, /* hardware supports fast channel change */ @@ -119,6 +120,9 @@ typedef enum { HAL_CAP_CST = 38, /* hardware supports carrier sense timeout */ + HAL_CAP_RIFS_RX = 39, + HAL_CAP_RIFS_TX = 40, + HAL_CAP_FORCE_PPM = 41, HAL_CAP_RTS_AGGR_LIMIT = 42, /* aggregation limit with RTS */ HAL_CAP_4ADDR_AGGR = 43, /* hardware is capable of 4addr aggregation */ HAL_CAP_DFS_DMN = 44, /* current DFS domain */ @@ -130,8 +134,32 @@ typedef enum { HAL_CAP_MBSSID_AGGR_SUPPORT = 49, /* Support for mBSSID Aggregation */ HAL_CAP_SPLIT_4KB_TRANS = 50, /* hardware supports descriptors straddling a 4k page boundary */ HAL_CAP_REG_FLAG = 51, /* Regulatory domain flags */ + HAL_CAP_BB_RIFS_HANG = 52, + HAL_CAP_RIFS_RX_ENABLED = 53, + HAL_CAP_BB_DFS_HANG = 54, HAL_CAP_BT_COEX = 60, /* hardware is capable of bluetooth coexistence */ + HAL_CAP_DYNAMIC_SMPS = 61, /* Dynamic MIMO Power Save hardware support */ + + HAL_CAP_DS = 67, /* 2 stream */ + HAL_CAP_BB_RX_CLEAR_STUCK_HANG = 68, + HAL_CAP_MAC_HANG = 69, /* can MAC hang */ + HAL_CAP_MFP = 70, /* Management Frame Protection in hardware */ + + HAL_CAP_TS = 72, /* 3 stream */ + + HAL_CAP_ENHANCED_DMA_SUPPORT = 75, /* DMA FIFO support */ + HAL_CAP_NUM_TXMAPS = 76, /* Number of buffers in a transmit descriptor */ + HAL_CAP_TXDESCLEN = 77, /* Length of transmit descriptor */ + HAL_CAP_TXSTATUSLEN = 78, /* Length of transmit status descriptor */ + HAL_CAP_RXSTATUSLEN = 79, /* Length of transmit status descriptor */ + HAL_CAP_RXFIFODEPTH = 80, /* Receive hardware FIFO depth */ + HAL_CAP_RXBUFSIZE = 81, /* Receive Buffer Length */ + HAL_CAP_NUM_MR_RETRIES = 82, /* limit on multirate retries */ + + HAL_CAP_OL_PWRCTRL = 84, /* Open loop TX power control */ + + HAL_CAP_BB_PANIC_WATCHDOG = 92, HAL_CAP_HT20_SGI = 96, /* hardware supports HT20 short GI */ @@ -143,7 +171,6 @@ typedef enum { HAL_CAP_INTMIT = 229, /* interference mitigation */ HAL_CAP_RXORN_FATAL = 230, /* HAL_INT_RXORN treated as fatal */ HAL_CAP_BB_HANG = 235, /* can baseband hang */ - HAL_CAP_MAC_HANG = 236, /* can MAC hang */ HAL_CAP_INTRMASK = 237, /* bitmask of supported interrupts */ HAL_CAP_BSSIDMATCH = 238, /* hardware has disable bssid match */ HAL_CAP_STREAMS = 239, /* how many 802.11n spatial streams are available */ @@ -180,10 +207,19 @@ typedef enum { HAL_TX_QUEUE_CAB = 3, /* "crap after beacon" xmit q */ HAL_TX_QUEUE_UAPSD = 4, /* u-apsd power save xmit q */ HAL_TX_QUEUE_PSPOLL = 5, /* power save poll xmit q */ + HAL_TX_QUEUE_CFEND = 6, + HAL_TX_QUEUE_PAPRD = 7, } HAL_TX_QUEUE; #define HAL_NUM_TX_QUEUES 10 /* max possible # of queues */ +typedef enum { + HAL_RX_QUEUE_HP = 0, /* high priority recv queue */ + HAL_RX_QUEUE_LP = 1, /* low priority recv queue */ +} HAL_RX_QUEUE; + +#define HAL_NUM_RX_QUEUES 2 /* max possible # of queues */ + /* * Transmit queue subtype. These map directly to * WME Access Categories (except for UPSD). Refer @@ -373,7 +409,10 @@ typedef enum { */ typedef enum { HAL_INT_RX = 0x00000001, /* Non-common mapping */ - HAL_INT_RXDESC = 0x00000002, + HAL_INT_RXDESC = 0x00000002, /* Legacy mapping */ + HAL_INT_RXHP = 0x00000001, /* EDMA */ + HAL_INT_RXLP = 0x00000002, /* EDMA */ + HAL_INT_RXERR = 0x00000004, HAL_INT_RXNOFRM = 0x00000008, HAL_INT_RXEOL = 0x00000010, HAL_INT_RXORN = 0x00000020, @@ -420,14 +459,38 @@ typedef enum { | HAL_INT_GPIO, } HAL_INT; +/* + * MSI vector assignments + */ typedef enum { - HAL_GPIO_MUX_OUTPUT = 0, - HAL_GPIO_MUX_PCIE_ATTENTION_LED = 1, - HAL_GPIO_MUX_PCIE_POWER_LED = 2, - HAL_GPIO_MUX_TX_FRAME = 3, - HAL_GPIO_MUX_RX_CLEAR_EXTERNAL = 4, - HAL_GPIO_MUX_MAC_NETWORK_LED = 5, - HAL_GPIO_MUX_MAC_POWER_LED = 6 + HAL_MSIVEC_MISC = 0, + HAL_MSIVEC_TX = 1, + HAL_MSIVEC_RXLP = 2, + HAL_MSIVEC_RXHP = 3, +} HAL_MSIVEC; + +typedef enum { + HAL_INT_LINE = 0, + HAL_INT_MSI = 1, +} HAL_INT_TYPE; + +/* For interrupt mitigation registers */ +typedef enum { + HAL_INT_RX_FIRSTPKT=0, + HAL_INT_RX_LASTPKT, + HAL_INT_TX_FIRSTPKT, + HAL_INT_TX_LASTPKT, + HAL_INT_THRESHOLD +} HAL_INT_MITIGATION; + +typedef enum { + HAL_GPIO_OUTPUT_MUX_AS_OUTPUT = 0, + HAL_GPIO_OUTPUT_MUX_PCIE_ATTENTION_LED = 1, + HAL_GPIO_OUTPUT_MUX_PCIE_POWER_LED = 2, + HAL_GPIO_OUTPUT_MUX_MAC_NETWORK_LED = 3, + HAL_GPIO_OUTPUT_MUX_MAC_POWER_LED = 4, + HAL_GPIO_OUTPUT_MUX_AS_WLAN_ACTIVE = 5, + HAL_GPIO_OUTPUT_MUX_AS_TX_FRAME = 6 } HAL_GPIO_MUX_TYPE; typedef enum { @@ -568,7 +631,7 @@ typedef enum { typedef struct { uint8_t kv_type; /* one of HAL_CIPHER */ - uint8_t kv_pad; + uint8_t kv_apsd; /* Mask for APSD enabled ACs */ uint16_t kv_len; /* length in bits */ uint8_t kv_val[16]; /* enough for 128-bit keys */ uint8_t kv_mic[8]; /* TKIP MIC key */ @@ -660,7 +723,11 @@ typedef struct { uint32_t tx_busy; uint32_t rx_busy; uint32_t chan_busy; + uint32_t ext_chan_busy; uint32_t cycle_count; + /* XXX TODO */ + uint32_t ofdm_phyerr_count; + uint32_t cck_phyerr_count; } HAL_SURVEY_SAMPLE; /* @@ -693,6 +760,7 @@ typedef enum { HAL_ANI_SPUR_IMMUNITY_LEVEL = 5, /* set level */ HAL_ANI_MODE = 6, /* 0 => manual, 1 => auto (XXX do not change) */ HAL_ANI_PHYERR_RESET = 7, /* reset phy error stats */ + HAL_ANI_MRC_CCK = 8, } HAL_ANI_CMD; /* @@ -710,6 +778,7 @@ typedef enum { HAL_CAP_INTMIT_SPUR_IMMUNITY_LEVEL = 6 } HAL_CAP_INTMIT_CMD; +/* DFS defines */ typedef struct { int32_t pe_firpwr; /* FIR pwr out threshold */ int32_t pe_rrssi; /* Radar rssi thresh */ @@ -773,6 +842,139 @@ struct hal_dfs_event { }; typedef struct hal_dfs_event HAL_DFS_EVENT; +/* + * BT Co-existence definitions + */ +typedef enum { + HAL_BT_MODULE_CSR_BC4 = 0, /* CSR BlueCore v4 */ + HAL_BT_MODULE_JANUS = 1, /* Kite + Valkyrie combo */ + HAL_BT_MODULE_HELIUS = 2, /* Kiwi + Valkyrie combo */ + HAL_MAX_BT_MODULES +} HAL_BT_MODULE; + +typedef struct { + HAL_BT_MODULE bt_module; + u_int8_t bt_coex_config; + u_int8_t bt_gpio_bt_active; + u_int8_t bt_gpio_bt_priority; + u_int8_t bt_gpio_wlan_active; + u_int8_t bt_active_polarity; + HAL_BOOL bt_single_ant; + u_int8_t bt_dutyCycle; + u_int8_t bt_isolation; + u_int8_t bt_period; +} HAL_BT_COEX_INFO; + +typedef enum { + HAL_BT_COEX_MODE_LEGACY = 0, /* legacy rx_clear mode */ + HAL_BT_COEX_MODE_UNSLOTTED = 1, /* untimed/unslotted mode */ + HAL_BT_COEX_MODE_SLOTTED = 2, /* slotted mode */ + HAL_BT_COEX_MODE_DISALBED = 3, /* coexistence disabled */ +} HAL_BT_COEX_MODE; + +typedef enum { + HAL_BT_COEX_CFG_NONE, /* No bt coex enabled */ + HAL_BT_COEX_CFG_2WIRE_2CH, /* 2-wire with 2 chains */ + HAL_BT_COEX_CFG_2WIRE_CH1, /* 2-wire with ch1 */ + HAL_BT_COEX_CFG_2WIRE_CH0, /* 2-wire with ch0 */ + HAL_BT_COEX_CFG_3WIRE, /* 3-wire */ + HAL_BT_COEX_CFG_MCI /* MCI */ +} HAL_BT_COEX_CFG; + +typedef enum { + HAL_BT_COEX_SET_ACK_PWR = 0, /* Change ACK power setting */ + HAL_BT_COEX_LOWER_TX_PWR, /* Change transmit power */ + HAL_BT_COEX_ANTENNA_DIVERSITY, /* Enable RX diversity for Kite */ +} HAL_BT_COEX_SET_PARAMETER; + +#define HAL_BT_COEX_FLAG_LOW_ACK_PWR 0x00000001 +#define HAL_BT_COEX_FLAG_LOWER_TX_PWR 0x00000002 +/* Check Rx Diversity is allowed */ +#define HAL_BT_COEX_FLAG_ANT_DIV_ALLOW 0x00000004 +/* Check Diversity is on or off */ +#define HAL_BT_COEX_FLAG_ANT_DIV_ENABLE 0x00000008 + +#define HAL_BT_COEX_ANTDIV_CONTROL1_ENABLE 0x0b +/* main: LNA1, alt: LNA2 */ +#define HAL_BT_COEX_ANTDIV_CONTROL2_ENABLE 0x09 +#define HAL_BT_COEX_ANTDIV_CONTROL1_FIXED_A 0x04 +#define HAL_BT_COEX_ANTDIV_CONTROL2_FIXED_A 0x09 +#define HAL_BT_COEX_ANTDIV_CONTROL1_FIXED_B 0x02 +#define HAL_BT_COEX_ANTDIV_CONTROL2_FIXED_B 0x06 + +#define HAL_BT_COEX_ISOLATION_FOR_NO_COEX 30 + +#define HAL_BT_COEX_ANT_DIV_SWITCH_COM 0x66666666 + +#define HAL_BT_COEX_HELIUS_CHAINMASK 0x02 + +#define HAL_BT_COEX_LOW_ACK_POWER 0x0 +#define HAL_BT_COEX_HIGH_ACK_POWER 0x3f3f3f + +typedef enum { + HAL_BT_COEX_NO_STOMP = 0, + HAL_BT_COEX_STOMP_ALL, + HAL_BT_COEX_STOMP_LOW, + HAL_BT_COEX_STOMP_NONE, + HAL_BT_COEX_STOMP_ALL_FORCE, + HAL_BT_COEX_STOMP_LOW_FORCE, +} HAL_BT_COEX_STOMP_TYPE; + +typedef struct { + /* extend rx_clear after tx/rx to protect the burst (in usec). */ + u_int8_t bt_time_extend; + + /* + * extend rx_clear as long as txsm is + * transmitting or waiting for ack. + */ + HAL_BOOL bt_txstate_extend; + + /* + * extend rx_clear so that when tx_frame + * is asserted, rx_clear will drop. + */ + HAL_BOOL bt_txframe_extend; + + /* + * coexistence mode + */ + HAL_BT_COEX_MODE bt_mode; + + /* + * treat BT high priority traffic as + * a quiet collision + */ + HAL_BOOL bt_quiet_collision; + + /* + * invert rx_clear as WLAN_ACTIVE + */ + HAL_BOOL bt_rxclear_polarity; + + /* + * slotted mode only. indicate the time in usec + * from the rising edge of BT_ACTIVE to the time + * BT_PRIORITY can be sampled to indicate priority. + */ + u_int8_t bt_priority_time; + + /* + * slotted mode only. indicate the time in usec + * from the rising edge of BT_ACTIVE to the time + * BT_PRIORITY can be sampled to indicate tx/rx and + * BT_FREQ is sampled. + */ + u_int8_t bt_first_slot_time; + + /* + * slotted mode only. rx_clear and bt_ant decision + * will be held the entire time that BT_ACTIVE is asserted, + * otherwise the decision is made before every slot boundry. + */ + HAL_BOOL bt_hold_rxclear; +} HAL_BT_COEX_CONFIG; + typedef struct { int ah_debug; /* only used if AH_DEBUG is defined */ @@ -828,7 +1030,8 @@ struct ath_hal { HAL_BOOL bChannelChange, HAL_STATUS *status); HAL_BOOL __ahdecl(*ah_phyDisable)(struct ath_hal *); HAL_BOOL __ahdecl(*ah_disable)(struct ath_hal *); - void __ahdecl(*ah_configPCIE)(struct ath_hal *, HAL_BOOL restore); + void __ahdecl(*ah_configPCIE)(struct ath_hal *, HAL_BOOL restore, + HAL_BOOL power_off); void __ahdecl(*ah_disablePCIE)(struct ath_hal *); void __ahdecl(*ah_setPCUConfig)(struct ath_hal *); HAL_BOOL __ahdecl(*ah_perCalibration)(struct ath_hal*, @@ -883,8 +1086,8 @@ struct ath_hal { const struct ath_desc *ds, int *rates, int *tries); /* Receive Functions */ - uint32_t __ahdecl(*ah_getRxDP)(struct ath_hal*); - void __ahdecl(*ah_setRxDP)(struct ath_hal*, uint32_t rxdp); + uint32_t __ahdecl(*ah_getRxDP)(struct ath_hal*, HAL_RX_QUEUE); + void __ahdecl(*ah_setRxDP)(struct ath_hal*, uint32_t rxdp, HAL_RX_QUEUE); void __ahdecl(*ah_enableReceive)(struct ath_hal*); HAL_BOOL __ahdecl(*ah_stopDmaReceive)(struct ath_hal*); void __ahdecl(*ah_startPcuReceive)(struct ath_hal*); @@ -1030,8 +1233,8 @@ struct ath_hal { struct ath_desc *); void __ahdecl(*ah_set11nBurstDuration)(struct ath_hal *, struct ath_desc *, u_int); - uint32_t __ahdecl(*ah_get_mib_cycle_counts_pct) (struct ath_hal *, - uint32_t *, uint32_t *, uint32_t *, uint32_t *); + HAL_BOOL __ahdecl(*ah_getMibCycleCounts) (struct ath_hal *, + HAL_SURVEY_SAMPLE *); uint32_t __ahdecl(*ah_get11nExtBusy)(struct ath_hal *); void __ahdecl(*ah_set11nMac2040)(struct ath_hal *, diff --git a/sys/dev/ath/ath_hal/ah_debug.h b/sys/dev/ath/ath_hal/ah_debug.h index f1678eb48e2..6cd262737cb 100644 --- a/sys/dev/ath/ath_hal/ah_debug.h +++ b/sys/dev/ath/ath_hal/ah_debug.h @@ -47,8 +47,13 @@ enum { HAL_DEBUG_DIVERSITY = 0x00100000, /* diversity debugging */ HAL_DEBUG_DFS = 0x00200000, /* DFS debugging */ HAL_DEBUG_HANG = 0x00400000, /* BB/MAC hang debugging */ + HAL_DEBUG_CALIBRATE = 0x00800000, /* setup calibration */ + HAL_DEBUG_POWER_MGMT = 0x01000000, /* power calibration */ + HAL_DEBUG_CHANNEL = 0x02000000, + HAL_DEBUG_QUEUE = 0x04000000, + HAL_DEBUG_PRINT_REG = 0x08000000, - HAL_DEBUG_UNMASKABLE = 0xf0000000, /* always printed */ + HAL_DEBUG_UNMASKABLE = 0x80000000, /* always printed */ HAL_DEBUG_ANY = 0xffffffff }; #endif /* _ATH_AH_DEBUG_H_ */ diff --git a/sys/dev/ath/ath_hal/ah_desc.h b/sys/dev/ath/ath_hal/ah_desc.h index 0fa9bf64cc4..1203ebbe3e5 100644 --- a/sys/dev/ath/ath_hal/ah_desc.h +++ b/sys/dev/ath/ath_hal/ah_desc.h @@ -122,11 +122,12 @@ struct ath_rx_status { int8_t rs_rssi_ext[3]; /* rx frame RSSI [ext, chain 0-2] */ uint8_t rs_isaggr; /* is part of the aggregate */ uint8_t rs_moreaggr; /* more frames in aggr to follow */ + uint16_t rs_flags; /* misc flags */ uint8_t rs_num_delims; /* number of delims in aggr */ - uint8_t rs_flags; /* misc flags */ + uint8_t rs_spare0; /* padding */ uint32_t rs_evm0; /* evm bytes */ uint32_t rs_evm1; - uint32_t rs_evm2; + uint32_t rs_evm2; uint32_t rs_evm3; /* needed for ar9300 and later */ uint32_t rs_evm4; /* needed for ar9300 and later */ #endif /* AH_SUPPORT_AR5416 */ @@ -138,16 +139,19 @@ struct ath_rx_status { #define HAL_RXERR_FIFO 0x04 /* fifo overrun */ #define HAL_RXERR_DECRYPT 0x08 /* non-Michael decrypt error */ #define HAL_RXERR_MIC 0x10 /* Michael MIC decrypt error */ +#define HAL_RXERR_INCOMP 0x20 /* Rx Desc processing is incomplete */ +#define HAL_RXERR_KEYMISS 0x40 /* Key not found in keycache */ /* bits found in rs_flags */ -#define HAL_RX_MORE 0x01 /* more descriptors follow */ -#define HAL_RX_MORE_AGGR 0x02 /* more frames in aggr */ -#define HAL_RX_GI 0x04 /* full gi */ -#define HAL_RX_2040 0x08 /* 40 Mhz */ -#define HAL_RX_DELIM_CRC_PRE 0x10 /* crc error in delimiter pre */ -#define HAL_RX_DELIM_CRC_POST 0x20 /* crc error in delim after */ -#define HAL_RX_DECRYPT_BUSY 0x40 /* decrypt was too slow */ -#define HAL_RX_HI_RX_CHAIN 0x80 /* SM power save: hi Rx chain control */ +#define HAL_RX_MORE 0x0001 /* more descriptors follow */ +#define HAL_RX_MORE_AGGR 0x0002 /* more frames in aggr */ +#define HAL_RX_GI 0x0004 /* full gi */ +#define HAL_RX_2040 0x0008 /* 40 Mhz */ +#define HAL_RX_DELIM_CRC_PRE 0x0010 /* crc error in delimiter pre */ +#define HAL_RX_DELIM_CRC_POST 0x0020 /* crc error in delim after */ +#define HAL_RX_DECRYPT_BUSY 0x0040 /* decrypt was too slow */ +#define HAL_RX_HI_RX_CHAIN 0x0080 /* SM power save: hi Rx chain control */ +#define HAL_RX_IS_APSD 0x0100 /* Is ASPD trigger frame */ enum { HAL_PHYERR_UNDERRUN = 0, /* Transmit underrun */ @@ -178,6 +182,8 @@ enum { HAL_PHYERR_HT_CRC_ERROR = 34, /* */ HAL_PHYERR_HT_LENGTH_ILLEGAL = 35, /* */ HAL_PHYERR_HT_RATE_ILLEGAL = 36, /* */ + + HAL_PHYERR_SPECTRAL = 38, }; /* value found in rs_keyix to mark invalid entries */ @@ -225,6 +231,7 @@ struct ath_desc_status { #define ds_rxstat ds_us.rx /* flags passed to tx descriptor setup methods */ +/* This is a uint16_t field in ath_buf, just be warned! */ #define HAL_TXDESC_CLRDMASK 0x0001 /* clear destination filter mask */ #define HAL_TXDESC_NOACK 0x0002 /* don't wait for ACK */ #define HAL_TXDESC_RTSENA 0x0004 /* enable RTS */ diff --git a/sys/dev/ath/ath_hal/ah_internal.h b/sys/dev/ath/ath_hal/ah_internal.h index b34d92586d2..65ec50e9998 100644 --- a/sys/dev/ath/ath_hal/ah_internal.h +++ b/sys/dev/ath/ath_hal/ah_internal.h @@ -212,10 +212,24 @@ typedef struct { halBssidMatchSupport : 1, hal4kbSplitTransSupport : 1, halHasRxSelfLinkedTail : 1, - halSupportsFastClock5GHz : 1, /* Hardware supports 5ghz fast clock; check eeprom/channel before using */ + halSupportsFastClock5GHz : 1, halHasLongRxDescTsf : 1, halHasBBReadWar : 1, - halSerialiseRegWar : 1; + halSerialiseRegWar : 1, + halMciSupport : 1, + halRxTxAbortSupport : 1, + halPaprdEnabled : 1, + halHasUapsdSupport : 1, + halWpsPushButtonSupport : 1, + halBtCoexApsmWar : 1, + halGenTimerSupport : 1, + halLDPCSupport : 1, + halHwBeaconProcSupport : 1, + halEnhancedDmaSupport : 1; + uint32_t halIsrRacSupport : 1, + halApmEnable : 1, + halIntrMitigation : 1; + uint32_t halWirelessModes; uint16_t halTotalQueues; uint16_t halKeyCacheSize; @@ -231,6 +245,13 @@ typedef struct { uint32_t halIntrMask; uint8_t halTxStreams; uint8_t halRxStreams; + + int halNumTxMaps; + int halTxDescLen; + int halTxStatusLen; + int halRxStatusLen; + int halRxHpFifoDepth; + int halRxLpFifoDepth; } HAL_CAPABILITIES; struct regDomain; @@ -355,8 +376,8 @@ struct ath_hal_private { AH_PRIVATE(_ah)->ah_getNfAdjust(_ah, _c) #define ath_hal_getNoiseFloor(_ah, _nfArray) \ AH_PRIVATE(_ah)->ah_getNoiseFloor(_ah, _nfArray) -#define ath_hal_configPCIE(_ah, _reset) \ - (_ah)->ah_configPCIE(_ah, _reset) +#define ath_hal_configPCIE(_ah, _reset, _poweroff) \ + (_ah)->ah_configPCIE(_ah, _reset, _poweroff) #define ath_hal_disablePCIE(_ah) \ (_ah)->ah_disablePCIE(_ah) #define ath_hal_setInterrupts(_ah, _mask) \ @@ -484,6 +505,8 @@ isBigEndian(void) /* Analog register writes may require a delay between each one (eg Merlin?) */ #define OS_A_REG_RMW_FIELD(_a, _r, _f, _v) \ do { OS_REG_WRITE(_a, _r, (OS_REG_READ(_a, _r) &~ (_f)) | (((_v) << _f##_S) & (_f))) ; OS_DELAY(100); } while (0) +#define OS_A_REG_WRITE(_a, _r, _v) \ + do { OS_REG_WRITE(_a, _r, _v); OS_DELAY(100); } while (0) /* wait for the register contents to have the specified value */ extern HAL_BOOL ath_hal_wait(struct ath_hal *, u_int reg, @@ -626,6 +649,46 @@ extern HAL_BOOL ath_hal_setcapability(struct ath_hal *ah, /* The diagnostic codes used to be internally defined here -adrian */ #include "ah_diagcodes.h" +/* + * The AR5416 and later HALs have MAC and baseband hang checking. + */ +typedef struct { + uint32_t hang_reg_offset; + uint32_t hang_val; + uint32_t hang_mask; + uint32_t hang_offset; +} hal_hw_hang_check_t; + +typedef struct { + uint32_t dma_dbg_3; + uint32_t dma_dbg_4; + uint32_t dma_dbg_5; + uint32_t dma_dbg_6; +} mac_dbg_regs_t; + +typedef enum { + dcu_chain_state = 0x1, + dcu_complete_state = 0x2, + qcu_state = 0x4, + qcu_fsp_ok = 0x8, + qcu_fsp_state = 0x10, + qcu_stitch_state = 0x20, + qcu_fetch_state = 0x40, + qcu_complete_state = 0x80 +} hal_mac_hangs_t; + +typedef struct { + int states; + uint8_t dcu_chain_state; + uint8_t dcu_complete_state; + uint8_t qcu_state; + uint8_t qcu_fsp_ok; + uint8_t qcu_fsp_state; + uint8_t qcu_stitch_state; + uint8_t qcu_fetch_state; + uint8_t qcu_complete_state; +} hal_mac_hang_check_t; + enum { HAL_BB_HANG_DFS = 0x0001, HAL_BB_HANG_RIFS = 0x0002, diff --git a/sys/dev/ath/ath_hal/ar5210/ar5210.h b/sys/dev/ath/ath_hal/ar5210/ar5210.h index 24718531566..657e2504206 100644 --- a/sys/dev/ath/ath_hal/ar5210/ar5210.h +++ b/sys/dev/ath/ath_hal/ar5210/ar5210.h @@ -180,8 +180,8 @@ extern void ar5210IntrReqTxDesc(struct ath_hal *ah, struct ath_desc *); extern HAL_BOOL ar5210GetTxCompletionRates(struct ath_hal *ah, const struct ath_desc *, int *rates, int *tries); -extern uint32_t ar5210GetRxDP(struct ath_hal *); -extern void ar5210SetRxDP(struct ath_hal *, uint32_t rxdp); +extern uint32_t ar5210GetRxDP(struct ath_hal *, HAL_RX_QUEUE); +extern void ar5210SetRxDP(struct ath_hal *, uint32_t rxdp, HAL_RX_QUEUE); extern void ar5210EnableReceive(struct ath_hal *); extern HAL_BOOL ar5210StopDmaReceive(struct ath_hal *); extern void ar5210StartPcuReceive(struct ath_hal *); @@ -249,6 +249,11 @@ extern HAL_BOOL ar5210SetCapability(struct ath_hal *, HAL_CAPABILITY_TYPE, extern HAL_BOOL ar5210GetDiagState(struct ath_hal *ah, int request, const void *args, uint32_t argsize, void **result, uint32_t *resultsize); +extern uint32_t ar5210Get11nExtBusy(struct ath_hal *); +extern HAL_BOOL ar5210GetMibCycleCounts(struct ath_hal *, + HAL_SURVEY_SAMPLE *); +extern void ar5210EnableDfs(struct ath_hal *, HAL_PHYERR_PARAM *); +extern void ar5210GetDfsThresh(struct ath_hal *, HAL_PHYERR_PARAM *); extern u_int ar5210GetKeyCacheSize(struct ath_hal *); extern HAL_BOOL ar5210IsKeyCacheEntryValid(struct ath_hal *, uint16_t); diff --git a/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c b/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c index 6f9010a77b7..03c5f93221b 100644 --- a/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c +++ b/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c @@ -33,7 +33,8 @@ static HAL_BOOL ar5210GetChannelEdges(struct ath_hal *, static HAL_BOOL ar5210GetChipPowerLimits(struct ath_hal *ah, struct ieee80211_channel *chan); -static void ar5210ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore); +static void ar5210ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, + HAL_BOOL power_on); static void ar5210DisablePCIE(struct ath_hal *ah); static const struct ath_hal_private ar5210hal = {{ @@ -129,8 +130,14 @@ static const struct ath_hal_private ar5210hal = {{ .ah_getAckCTSRate = ar5210GetAckCTSRate, .ah_setCTSTimeout = ar5210SetCTSTimeout, .ah_getCTSTimeout = ar5210GetCTSTimeout, - .ah_setDecompMask = ar5210SetDecompMask, - .ah_setCoverageClass = ar5210SetCoverageClass, + .ah_setDecompMask = ar5210SetDecompMask, + .ah_setCoverageClass = ar5210SetCoverageClass, + .ah_get11nExtBusy = ar5210Get11nExtBusy, + .ah_getMibCycleCounts = ar5210GetMibCycleCounts, + .ah_enableDfs = ar5210EnableDfs, + .ah_getDfsThresh = ar5210GetDfsThresh, + /* XXX procRadarEvent */ + /* XXX isFastClockEnabled */ /* Key Cache Functions */ .ah_getKeyCacheSize = ar5210GetKeyCacheSize, @@ -326,7 +333,7 @@ ar5210GetChipPowerLimits(struct ath_hal *ah, struct ieee80211_channel *chan) } static void -ar5210ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore) +ar5210ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, HAL_BOOL power_off) { } diff --git a/sys/dev/ath/ath_hal/ar5210/ar5210_misc.c b/sys/dev/ath/ath_hal/ar5210/ar5210_misc.c index 1c1573c4dfd..88decf30d1c 100644 --- a/sys/dev/ath/ath_hal/ar5210/ar5210_misc.c +++ b/sys/dev/ath/ath_hal/ar5210/ar5210_misc.c @@ -646,3 +646,34 @@ ar5210GetDiagState(struct ath_hal *ah, int request, return ath_hal_getdiagstate(ah, request, args, argsize, result, resultsize); } + +/* + * Return what percentage of the extension channel is busy. + * This is always disabled for AR5210 series NICs. + */ +uint32_t +ar5210Get11nExtBusy(struct ath_hal *ah) +{ + + return (0); +} + +/* + * There's no channel survey support for the AR5210. + */ +HAL_BOOL +ar5210GetMibCycleCounts(struct ath_hal *ah, HAL_SURVEY_SAMPLE *hsample) +{ + + return (AH_FALSE); +} + +void +ar5210EnableDfs(struct ath_hal *ah, HAL_PHYERR_PARAM *pe) +{ +} + +void +ar5210GetDfsThresh(struct ath_hal *ah, HAL_PHYERR_PARAM *pe) +{ +} diff --git a/sys/dev/ath/ath_hal/ar5210/ar5210_recv.c b/sys/dev/ath/ath_hal/ar5210/ar5210_recv.c index bdb4d57cade..3a1220b5329 100644 --- a/sys/dev/ath/ath_hal/ar5210/ar5210_recv.c +++ b/sys/dev/ath/ath_hal/ar5210/ar5210_recv.c @@ -30,8 +30,10 @@ * Get the RXDP. */ uint32_t -ar5210GetRxDP(struct ath_hal *ah) +ar5210GetRxDP(struct ath_hal *ah, HAL_RX_QUEUE qtype) { + + HALASSERT(qtype == HAL_RX_QUEUE_HP); return OS_REG_READ(ah, AR_RXDP); } @@ -39,8 +41,10 @@ ar5210GetRxDP(struct ath_hal *ah) * Set the RxDP. */ void -ar5210SetRxDP(struct ath_hal *ah, uint32_t rxdp) +ar5210SetRxDP(struct ath_hal *ah, uint32_t rxdp, HAL_RX_QUEUE qtype) { + + HALASSERT(qtype == HAL_RX_QUEUE_HP); OS_REG_WRITE(ah, AR_RXDP, rxdp); } diff --git a/sys/dev/ath/ath_hal/ar5211/ar5211.h b/sys/dev/ath/ath_hal/ar5211/ar5211.h index 51acd38862c..1d6c8af1738 100644 --- a/sys/dev/ath/ath_hal/ar5211/ar5211.h +++ b/sys/dev/ath/ath_hal/ar5211/ar5211.h @@ -205,8 +205,8 @@ extern void ar5211IntrReqTxDesc(struct ath_hal *ah, struct ath_desc *); extern HAL_BOOL ar5211GetTxCompletionRates(struct ath_hal *ah, const struct ath_desc *ds0, int *rates, int *tries); -extern uint32_t ar5211GetRxDP(struct ath_hal *); -extern void ar5211SetRxDP(struct ath_hal *, uint32_t rxdp); +extern uint32_t ar5211GetRxDP(struct ath_hal *, HAL_RX_QUEUE); +extern void ar5211SetRxDP(struct ath_hal *, uint32_t rxdp, HAL_RX_QUEUE); extern void ar5211EnableReceive(struct ath_hal *); extern HAL_BOOL ar5211StopDmaReceive(struct ath_hal *); extern void ar5211StartPcuReceive(struct ath_hal *); @@ -276,6 +276,11 @@ extern HAL_BOOL ar5211SetCapability(struct ath_hal *, HAL_CAPABILITY_TYPE, extern HAL_BOOL ar5211GetDiagState(struct ath_hal *ah, int request, const void *args, uint32_t argsize, void **result, uint32_t *resultsize); +extern uint32_t ar5211Get11nExtBusy(struct ath_hal *); +extern HAL_BOOL ar5211GetMibCycleCounts(struct ath_hal *, + HAL_SURVEY_SAMPLE *); +extern void ar5211EnableDfs(struct ath_hal *, HAL_PHYERR_PARAM *); +extern void ar5211GetDfsThresh(struct ath_hal *, HAL_PHYERR_PARAM *); extern u_int ar5211GetKeyCacheSize(struct ath_hal *); extern HAL_BOOL ar5211IsKeyCacheEntryValid(struct ath_hal *, uint16_t); diff --git a/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c b/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c index c7de79284bd..186ece2559e 100644 --- a/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c +++ b/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c @@ -33,7 +33,8 @@ static HAL_BOOL ar5211GetChannelEdges(struct ath_hal *ah, static HAL_BOOL ar5211GetChipPowerLimits(struct ath_hal *ah, struct ieee80211_channel *chan); -static void ar5211ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore); +static void ar5211ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, + HAL_BOOL power_off); static void ar5211DisablePCIE(struct ath_hal *ah); static const struct ath_hal_private ar5211hal = {{ @@ -129,8 +130,14 @@ static const struct ath_hal_private ar5211hal = {{ .ah_getAckCTSRate = ar5211GetAckCTSRate, .ah_setCTSTimeout = ar5211SetCTSTimeout, .ah_getCTSTimeout = ar5211GetCTSTimeout, - .ah_setDecompMask = ar5211SetDecompMask, - .ah_setCoverageClass = ar5211SetCoverageClass, + .ah_setDecompMask = ar5211SetDecompMask, + .ah_setCoverageClass = ar5211SetCoverageClass, + .ah_get11nExtBusy = ar5211Get11nExtBusy, + .ah_getMibCycleCounts = ar5211GetMibCycleCounts, + .ah_enableDfs = ar5211EnableDfs, + .ah_getDfsThresh = ar5211GetDfsThresh, + /* XXX procRadarEvent */ + /* XXX isFastClockEnabled */ /* Key Cache Functions */ .ah_getKeyCacheSize = ar5211GetKeyCacheSize, @@ -449,7 +456,7 @@ ar5211GetChipPowerLimits(struct ath_hal *ah, struct ieee80211_channel *chan) } static void -ar5211ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore) +ar5211ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, HAL_BOOL power_off) { } diff --git a/sys/dev/ath/ath_hal/ar5211/ar5211_misc.c b/sys/dev/ath/ath_hal/ar5211/ar5211_misc.c index 3b27062294f..55f39e98da3 100644 --- a/sys/dev/ath/ath_hal/ar5211/ar5211_misc.c +++ b/sys/dev/ath/ath_hal/ar5211/ar5211_misc.c @@ -688,3 +688,34 @@ ar5211GetDiagState(struct ath_hal *ah, int request, } return AH_FALSE; } + +/* + * Return what percentage of the extension channel is busy. + * This is always disabled for AR5211 series NICs. + */ +uint32_t +ar5211Get11nExtBusy(struct ath_hal *ah) +{ + return (0); +} + + +/* + * There's no channel survey support for the AR5211. + */ +HAL_BOOL +ar5211GetMibCycleCounts(struct ath_hal *ah, HAL_SURVEY_SAMPLE *hsample) +{ + + return (AH_FALSE); +} + +void +ar5211EnableDfs(struct ath_hal *ah, HAL_PHYERR_PARAM *pe) +{ +} + +void +ar5211GetDfsThresh(struct ath_hal *ah, HAL_PHYERR_PARAM *pe) +{ +} diff --git a/sys/dev/ath/ath_hal/ar5211/ar5211_recv.c b/sys/dev/ath/ath_hal/ar5211/ar5211_recv.c index 733559e7a50..27c48352728 100644 --- a/sys/dev/ath/ath_hal/ar5211/ar5211_recv.c +++ b/sys/dev/ath/ath_hal/ar5211/ar5211_recv.c @@ -30,8 +30,10 @@ * Get the RXDP. */ uint32_t -ar5211GetRxDP(struct ath_hal *ah) +ar5211GetRxDP(struct ath_hal *ah, HAL_RX_QUEUE qtype) { + + HALASSERT(qtype == HAL_RX_QUEUE_HP); return OS_REG_READ(ah, AR_RXDP); } @@ -39,8 +41,10 @@ ar5211GetRxDP(struct ath_hal *ah) * Set the RxDP. */ void -ar5211SetRxDP(struct ath_hal *ah, uint32_t rxdp) +ar5211SetRxDP(struct ath_hal *ah, uint32_t rxdp, HAL_RX_QUEUE qtype) { + + HALASSERT(qtype == HAL_RX_QUEUE_HP); OS_REG_WRITE(ah, AR_RXDP, rxdp); HALASSERT(OS_REG_READ(ah, AR_RXDP) == rxdp); } diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212.h b/sys/dev/ath/ath_hal/ar5212/ar5212.h index 606f615c1d5..a8b95d1c097 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212.h +++ b/sys/dev/ath/ath_hal/ar5212/ar5212.h @@ -320,6 +320,7 @@ struct ath_hal_5212 { struct ar5212AniParams ah_aniParams5; /* 5GHz parameters */ struct ar5212AniState *ah_curani; /* cached last reference */ struct ar5212AniState ah_ani[AH_MAXCHAN]; /* per-channel state */ + HAL_CHANNEL_SURVEY ah_chansurvey; /* channel survey */ /* AR5416 uses some of the AR5212 ANI code; these are the ANI methods */ HAL_BOOL (*ah_aniControl) (struct ath_hal *, HAL_ANI_CMD cmd, int param); @@ -510,14 +511,16 @@ extern HAL_BOOL ar5212GetDiagState(struct ath_hal *ah, int request, void **result, uint32_t *resultsize); extern HAL_STATUS ar5212SetQuiet(struct ath_hal *ah, uint32_t period, uint32_t duration, uint32_t nextStart, HAL_QUIET_FLAG flag); +extern HAL_BOOL ar5212GetMibCycleCounts(struct ath_hal *, + HAL_SURVEY_SAMPLE *); extern HAL_BOOL ar5212SetPowerMode(struct ath_hal *ah, HAL_POWER_MODE mode, int setChip); extern HAL_POWER_MODE ar5212GetPowerMode(struct ath_hal *ah); extern HAL_BOOL ar5212GetPowerStatus(struct ath_hal *ah); -extern uint32_t ar5212GetRxDP(struct ath_hal *ath); -extern void ar5212SetRxDP(struct ath_hal *ah, uint32_t rxdp); +extern uint32_t ar5212GetRxDP(struct ath_hal *ath, HAL_RX_QUEUE); +extern void ar5212SetRxDP(struct ath_hal *ah, uint32_t rxdp, HAL_RX_QUEUE); extern void ar5212EnableReceive(struct ath_hal *ah); extern HAL_BOOL ar5212StopDmaReceive(struct ath_hal *ah); extern void ar5212StartPcuReceive(struct ath_hal *ah); diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c b/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c index 15bdd604d04..43cbe7fdf2b 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c @@ -29,7 +29,8 @@ #define AH_5212_COMMON #include "ar5212/ar5212.ini" -static void ar5212ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore); +static void ar5212ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, + HAL_BOOL power_off); static void ar5212DisablePCIE(struct ath_hal *ah); static const struct ath_hal_private ar5212hal = {{ @@ -125,9 +126,10 @@ static const struct ath_hal_private ar5212hal = {{ .ah_getAckCTSRate = ar5212GetAckCTSRate, .ah_setCTSTimeout = ar5212SetCTSTimeout, .ah_getCTSTimeout = ar5212GetCTSTimeout, - .ah_setDecompMask = ar5212SetDecompMask, - .ah_setCoverageClass = ar5212SetCoverageClass, + .ah_setDecompMask = ar5212SetDecompMask, + .ah_setCoverageClass = ar5212SetCoverageClass, .ah_setQuiet = ar5212SetQuiet, + .ah_getMibCycleCounts = ar5212GetMibCycleCounts, /* DFS Functions */ .ah_enableDfs = ar5212EnableDfs, @@ -369,7 +371,7 @@ ar5212Attach(uint16_t devid, HAL_SOFTC sc, if (AH_PRIVATE(ah)->ah_ispcie) { /* XXX: build flag to disable this? */ - ath_hal_configPCIE(ah, AH_FALSE); + ath_hal_configPCIE(ah, AH_FALSE, AH_FALSE); } if (!ar5212ChipTest(ah)) { @@ -665,7 +667,7 @@ ar5212GetChannelEdges(struct ath_hal *ah, * XXX Clean up the magic numbers. */ static void -ar5212ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore) +ar5212ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, HAL_BOOL power_off) { OS_REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00); OS_REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924); diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c b/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c index 9cbf3204029..e5bbc666870 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c @@ -1090,6 +1090,11 @@ ar5212GetDiagState(struct ath_hal *ah, int request, return AH_FALSE; return ar5212AniSetParams(ah, args, args); } + break; + case HAL_DIAG_CHANSURVEY: + *result = &ahp->ah_chansurvey; + *resultsize = sizeof(HAL_CHANNEL_SURVEY); + return AH_TRUE; } return AH_FALSE; } @@ -1243,3 +1248,13 @@ ar5212Get11nExtBusy(struct ath_hal *ah) { return 0; } + +/* + * There's no channel survey support for the AR5211. + */ +HAL_BOOL +ar5212GetMibCycleCounts(struct ath_hal *ah, HAL_SURVEY_SAMPLE *hsample) +{ + + return (AH_FALSE); +} diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_recv.c b/sys/dev/ath/ath_hal/ar5212/ar5212_recv.c index db4f93d430e..00b04cae748 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_recv.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_recv.c @@ -29,8 +29,10 @@ * Get the RXDP. */ uint32_t -ar5212GetRxDP(struct ath_hal *ath) +ar5212GetRxDP(struct ath_hal *ath, HAL_RX_QUEUE qtype) { + + HALASSERT(qtype == HAL_RX_QUEUE_HP); return OS_REG_READ(ath, AR_RXDP); } @@ -38,8 +40,10 @@ ar5212GetRxDP(struct ath_hal *ath) * Set the RxDP. */ void -ar5212SetRxDP(struct ath_hal *ah, uint32_t rxdp) +ar5212SetRxDP(struct ath_hal *ah, uint32_t rxdp, HAL_RX_QUEUE qtype) { + + HALASSERT(qtype == HAL_RX_QUEUE_HP); OS_REG_WRITE(ah, AR_RXDP, rxdp); HALASSERT(OS_REG_READ(ah, AR_RXDP) == rxdp); } diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_reset.c b/sys/dev/ath/ath_hal/ar5212/ar5212_reset.c index 412c64d5445..eca2e1f3657 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_reset.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_reset.c @@ -195,6 +195,9 @@ ar5212Reset(struct ath_hal *ah, HAL_OPMODE opmode, saveFrameSeqCount = OS_REG_READ(ah, AR_D_SEQNUM); } else saveFrameSeqCount = 0; /* NB: silence compiler */ + + /* Blank the channel survey statistics */ + OS_MEMZERO(&ahp->ah_chansurvey, sizeof(ahp->ah_chansurvey)); #if 0 /* * XXX disable for now; this appears to sometimes cause OFDM diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416.h b/sys/dev/ath/ath_hal/ar5416/ar5416.h index ecb244348cd..5a0e7ef7e6c 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416.h +++ b/sys/dev/ath/ath_hal/ar5416/ar5416.h @@ -132,6 +132,28 @@ struct ath_hal_5416 { int initPDADC; int ah_need_an_top2_fixup; /* merlin or later chips that may need this workaround */ + + /* + * Bluetooth coexistence static setup according to the registry + */ + HAL_BT_MODULE ah_btModule; /* Bluetooth module identifier */ + uint8_t ah_btCoexConfigType; /* BT coex configuration */ + uint8_t ah_btActiveGpioSelect; /* GPIO pin for BT_ACTIVE */ + uint8_t ah_btPriorityGpioSelect; /* GPIO pin for BT_PRIORITY */ + uint8_t ah_wlanActiveGpioSelect; /* GPIO pin for WLAN_ACTIVE */ + uint8_t ah_btActivePolarity; /* Polarity of BT_ACTIVE */ + HAL_BOOL ah_btCoexSingleAnt; /* Single or dual antenna configuration */ + uint8_t ah_btWlanIsolation; /* Isolation between BT and WLAN in dB */ + + /* + * Bluetooth coexistence runtime settings + */ + HAL_BOOL ah_btCoexEnabled; /* If Bluetooth coexistence is enabled */ + uint32_t ah_btCoexMode; /* Register setting for AR_BT_COEX_MODE */ + uint32_t ah_btCoexBTWeight; /* Register setting for AR_BT_COEX_WEIGHT */ + uint32_t ah_btCoexWLANWeight; /* Register setting for AR_BT_COEX_WEIGHT */ + uint32_t ah_btCoexMode2; /* Register setting for AR_BT_COEX_MODE2 */ + uint32_t ah_btCoexFlag; /* Special tuning flags for BT coex */ }; #define AH5416(_ah) ((struct ath_hal_5416 *)(_ah)) @@ -173,6 +195,21 @@ extern void ar5416SetStaBeaconTimers(struct ath_hal *ah, const HAL_BEACON_STATE *); extern uint64_t ar5416GetNextTBTT(struct ath_hal *); +/* ar5416_btcoex.c */ +extern void ar5416SetBTCoexInfo(struct ath_hal *ah, + HAL_BT_COEX_INFO *btinfo); +extern void ar5416BTCoexConfig(struct ath_hal *ah, + HAL_BT_COEX_CONFIG *btconf); +extern void ar5416BTCoexSetQcuThresh(struct ath_hal *ah, int qnum); +extern void ar5416BTCoexSetWeights(struct ath_hal *ah, uint32_t stompType); +extern void ar5416BTCoexSetupBmissThresh(struct ath_hal *ah, + uint32_t thresh); +extern void ar5416BTCoexSetParameter(struct ath_hal *ah, uint32_t type, + uint32_t value); +extern void ar5416BTCoexDisable(struct ath_hal *ah); +extern int ar5416BTCoexEnable(struct ath_hal *ah); +extern void ar5416InitBTCoex(struct ath_hal *ah); + extern HAL_BOOL ar5416EepromRead(struct ath_hal *, u_int off, uint16_t *data); extern HAL_BOOL ar5416EepromWrite(struct ath_hal *, u_int off, uint16_t data); @@ -196,9 +233,8 @@ extern uint32_t ar5416GetCurRssi(struct ath_hal *ah); extern HAL_BOOL ar5416SetAntennaSwitch(struct ath_hal *, HAL_ANT_SETTING); extern HAL_BOOL ar5416SetDecompMask(struct ath_hal *, uint16_t, int); extern void ar5416SetCoverageClass(struct ath_hal *, uint8_t, int); -extern uint32_t ar5416GetMibCycleCountsPct(struct ath_hal *ah, - uint32_t *rxc_pcnt, uint32_t *rxextc_pcnt, uint32_t *rxf_pcnt, - uint32_t *txf_pcnt); +extern HAL_BOOL ar5416GetMibCycleCounts(struct ath_hal *ah, + HAL_SURVEY_SAMPLE *hsample); extern uint32_t ar5416Get11nExtBusy(struct ath_hal *ah); extern void ar5416Set11nMac2040(struct ath_hal *ah, HAL_HT_MACMODE mode); extern HAL_HT_RXCLEAR ar5416Get11nRxClear(struct ath_hal *ah); @@ -234,6 +270,7 @@ extern HAL_BOOL ar5416SetKeyCacheEntry(struct ath_hal *ah, uint16_t entry, extern uint32_t ar5416GetRxFilter(struct ath_hal *ah); extern void ar5416SetRxFilter(struct ath_hal *ah, uint32_t bits); +extern HAL_BOOL ar5416StopDmaReceive(struct ath_hal *ah); extern void ar5416StartPcuReceive(struct ath_hal *ah); extern void ar5416StopPcuReceive(struct ath_hal *ah); extern HAL_BOOL ar5416SetupRxDesc(struct ath_hal *, diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c b/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c index deaacd79116..738a635dcef 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c @@ -804,21 +804,50 @@ ar5416AniLowerImmunity(struct ath_hal *ah) * deducting the cycles spent tx'ing and rx'ing from the total * cycle count since our last call. A return value <0 indicates * an invalid/inconsistent time. + * + * This may be called with ANI disabled; in which case simply keep + * the statistics and don't write to the aniState pointer. + * + * XXX TODO: Make this cleaner! */ static int32_t ar5416AniGetListenTime(struct ath_hal *ah) { struct ath_hal_5212 *ahp = AH5212(ah); - struct ar5212AniState *aniState; - uint32_t rxc_pct, extc_pct, rxf_pct, txf_pct; - int32_t listenTime; + struct ar5212AniState *aniState = NULL; + int32_t listenTime = 0; int good; + HAL_SURVEY_SAMPLE hs; + HAL_CHANNEL_SURVEY *cs = AH_NULL; - good = ar5416GetMibCycleCountsPct(ah, - &rxc_pct, &extc_pct, &rxf_pct, &txf_pct); + /* + * We shouldn't see ah_curchan be NULL, but just in case.. + */ + if (AH_PRIVATE(ah)->ah_curchan == AH_NULL) { + ath_hal_printf(ah, "%s: ah_curchan = NULL?\n", __func__); + return (0); + } - aniState = ahp->ah_curani; - if (good == 0) { + cs = &ahp->ah_chansurvey; + + /* + * Fetch the current statistics, squirrel away the current + * sample, bump the sequence/sample counter. + */ + OS_MEMZERO(&hs, sizeof(hs)); + good = ar5416GetMibCycleCounts(ah, &hs); + if (cs != AH_NULL) { + OS_MEMCPY(&cs->samples[cs->cur_sample], &hs, sizeof(hs)); + cs->samples[cs->cur_sample].seq_num = cs->cur_seq; + cs->cur_sample = + (cs->cur_sample + 1) % CHANNEL_SURVEY_SAMPLE_COUNT; + cs->cur_seq++; + } + + if (ANI_ENA(ah)) + aniState = ahp->ah_curani; + + if (good == AH_FALSE) { /* * Cycle counter wrap (or initial call); it's not possible * to accurately calculate a value because the registers @@ -826,18 +855,28 @@ ar5416AniGetListenTime(struct ath_hal *ah) */ listenTime = 0; ahp->ah_stats.ast_ani_lzero++; - } else { - int32_t ccdelta = AH5416(ah)->ah_cycleCount - aniState->cycleCount; - int32_t rfdelta = AH5416(ah)->ah_rxBusy - aniState->rxFrameCount; - int32_t tfdelta = AH5416(ah)->ah_txBusy - aniState->txFrameCount; + } else if (ANI_ENA(ah)) { + /* + * Only calculate and update the cycle count if we have + * an ANI state. + */ + int32_t ccdelta = + AH5416(ah)->ah_cycleCount - aniState->cycleCount; + int32_t rfdelta = + AH5416(ah)->ah_rxBusy - aniState->rxFrameCount; + int32_t tfdelta = + AH5416(ah)->ah_txBusy - aniState->txFrameCount; listenTime = (ccdelta - rfdelta - tfdelta) / CLOCK_RATE; } - aniState->cycleCount = AH5416(ah)->ah_cycleCount; - aniState->txFrameCount = AH5416(ah)->ah_rxBusy; - aniState->rxFrameCount = AH5416(ah)->ah_txBusy; - HALDEBUG(ah, HAL_DEBUG_ANI, "rxc=%d, extc=%d, rxf=%d, txf=%d\n", - rxc_pct, extc_pct, rxf_pct, txf_pct); + /* + * Again, only update ANI state if we have it. + */ + if (ANI_ENA(ah)) { + aniState->cycleCount = AH5416(ah)->ah_cycleCount; + aniState->txFrameCount = AH5416(ah)->ah_rxBusy; + aniState->rxFrameCount = AH5416(ah)->ah_txBusy; + } return listenTime; } @@ -902,13 +941,13 @@ ar5416AniPoll(struct ath_hal *ah, const struct ieee80211_channel *chan) const struct ar5212AniParams *params; int32_t listenTime; + /* Always update from the MIB, for statistics gathering */ + listenTime = ar5416AniGetListenTime(ah); + /* XXX can aniState be null? */ if (aniState == AH_NULL) return; - /* Always update from the MIB, for statistics gathering */ - listenTime = ar5416AniGetListenTime(ah); - if (!ANI_ENA(ah)) return; diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c b/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c index 80d6a2545c9..fc5eefb0fef 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c @@ -30,7 +30,9 @@ #include "ar5416/ar5416.ini" -static void ar5416ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore); +static void ar5416ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, + HAL_BOOL power_off); +static void ar5416DisablePCIE(struct ath_hal *ah); static void ar5416WriteIni(struct ath_hal *ah, const struct ieee80211_channel *chan); static void ar5416SpurMitigate(struct ath_hal *ah, @@ -99,6 +101,7 @@ ar5416InitState(struct ath_hal_5416 *ahp5416, uint16_t devid, HAL_SOFTC sc, ah->ah_phyDisable = ar5416PhyDisable; ah->ah_disable = ar5416Disable; ah->ah_configPCIE = ar5416ConfigPCIE; + ah->ah_disablePCIE = ar5416DisablePCIE; ah->ah_perCalibration = ar5416PerCalibration; ah->ah_perCalibrationN = ar5416PerCalibrationN, ah->ah_resetCalValid = ar5416ResetCalValid, @@ -119,6 +122,7 @@ ar5416InitState(struct ath_hal_5416 *ahp5416, uint16_t devid, HAL_SOFTC sc, /* Receive Functions */ ah->ah_getRxFilter = ar5416GetRxFilter; ah->ah_setRxFilter = ar5416SetRxFilter; + ah->ah_stopDmaReceive = ar5416StopDmaReceive; ah->ah_startPcuReceive = ar5416StartPcuReceive; ah->ah_stopPcuReceive = ar5416StopPcuReceive; ah->ah_setupRxDesc = ar5416SetupRxDesc; @@ -144,6 +148,7 @@ ar5416InitState(struct ath_hal_5416 *ahp5416, uint16_t devid, HAL_SOFTC sc, ah->ah_setDecompMask = ar5416SetDecompMask; ah->ah_setCoverageClass = ar5416SetCoverageClass; ah->ah_setQuiet = ar5416SetQuiet; + ah->ah_getMibCycleCounts = ar5416GetMibCycleCounts; ah->ah_resetKeyCacheEntry = ar5416ResetKeyCacheEntry; ah->ah_setKeyCacheEntry = ar5416SetKeyCacheEntry; @@ -455,20 +460,71 @@ void ar5416AttachPCIE(struct ath_hal *ah) { if (AH_PRIVATE(ah)->ah_ispcie) - ath_hal_configPCIE(ah, AH_FALSE); + ath_hal_configPCIE(ah, AH_FALSE, AH_FALSE); else ath_hal_disablePCIE(ah); } static void -ar5416ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore) +ar5416ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, HAL_BOOL power_off) { - if (AH_PRIVATE(ah)->ah_ispcie && !restore) { + + /* This is only applicable for AR5418 (AR5416 PCIe) */ + if (! AH_PRIVATE(ah)->ah_ispcie) + return; + + if (! restore) { ath_hal_ini_write(ah, &AH5416(ah)->ah_ini_pcieserdes, 1, 0); OS_DELAY(1000); - OS_REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); - OS_REG_WRITE(ah, AR_WA, AR_WA_DEFAULT); } + + if (power_off) { /* Power-off */ + /* clear bit 19 to disable L1 */ + OS_REG_CLR_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); + } else { /* Power-on */ + /* Set default WAR values for Owl */ + OS_REG_WRITE(ah, AR_WA, AR_WA_DEFAULT); + + /* set bit 19 to allow forcing of pcie core into L1 state */ + OS_REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); + } +} + +/* + * Disable PCIe PHY if PCIe isn't used. + */ +static void +ar5416DisablePCIE(struct ath_hal *ah) +{ + + /* PCIe? Don't */ + if (AH_PRIVATE(ah)->ah_ispcie) + return; + + /* .. Only applicable for AR5416v2 or later */ + if (! (AR_SREV_OWL(ah) && AR_SREV_OWL_20_OR_LATER(ah))) + return; + + OS_REG_WRITE_BUFFER_ENABLE(ah); + + /* + * Disable the PCIe PHY. + */ + OS_REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00); + OS_REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924); + OS_REG_WRITE(ah, AR_PCIE_SERDES, 0x28000029); + OS_REG_WRITE(ah, AR_PCIE_SERDES, 0x57160824); + OS_REG_WRITE(ah, AR_PCIE_SERDES, 0x25980579); + OS_REG_WRITE(ah, AR_PCIE_SERDES, 0x00000000); + OS_REG_WRITE(ah, AR_PCIE_SERDES, 0x1aaabe40); + OS_REG_WRITE(ah, AR_PCIE_SERDES, 0xbe105554); + OS_REG_WRITE(ah, AR_PCIE_SERDES, 0x000e1007); + + /* Load the new settings */ + OS_REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); + + OS_REG_WRITE_BUFFER_FLUSH(ah); + OS_REG_WRITE_BUFFER_DISABLE(ah); } static void diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_btcoex.c b/sys/dev/ath/ath_hal/ar5416/ar5416_btcoex.c new file mode 100644 index 00000000000..b7ac1184cb0 --- /dev/null +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_btcoex.c @@ -0,0 +1,385 @@ +/* + * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting + * Copyright (c) 2002-2005 Atheros Communications, Inc. + * Copyright (c) 2008-2010, Atheros Communications Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#include "opt_ah.h" + +#include "ah.h" +#include "ah_internal.h" +#include "ah_devid.h" +#ifdef AH_DEBUG +#include "ah_desc.h" /* NB: for HAL_PHYERR* */ +#endif + +#include "ar5416/ar5416.h" +#include "ar5416/ar5416reg.h" +#include "ar5416/ar5416phy.h" +#include "ar5416/ar5416desc.h" /* AR5416_CONTTXMODE */ +#include "ar5416/ar5416_btcoex.h" + +void +ar5416SetBTCoexInfo(struct ath_hal *ah, HAL_BT_COEX_INFO *btinfo) +{ + struct ath_hal_5416 *ahp = AH5416(ah); + + ahp->ah_btModule = btinfo->bt_module; + ahp->ah_btCoexConfigType = btinfo->bt_coex_config; + ahp->ah_btActiveGpioSelect = btinfo->bt_gpio_bt_active; + ahp->ah_btPriorityGpioSelect = btinfo->bt_gpio_bt_priority; + ahp->ah_wlanActiveGpioSelect = btinfo->bt_gpio_wlan_active; + ahp->ah_btActivePolarity = btinfo->bt_active_polarity; + ahp->ah_btCoexSingleAnt = btinfo->bt_single_ant; + ahp->ah_btWlanIsolation = btinfo->bt_isolation; +} + +void +ar5416BTCoexConfig(struct ath_hal *ah, HAL_BT_COEX_CONFIG *btconf) +{ + struct ath_hal_5416 *ahp = AH5416(ah); + HAL_BOOL rxClearPolarity = btconf->bt_rxclear_polarity; + + /* + * For Kiwi and Osprey, the polarity of rx_clear is active high. + * The bt_rxclear_polarity flag from ath(4) needs to be inverted. + */ + if (AR_SREV_KIWI(ah)) { + rxClearPolarity = !btconf->bt_rxclear_polarity; + } + + ahp->ah_btCoexMode = (ahp->ah_btCoexMode & AR_BT_QCU_THRESH) | + SM(btconf->bt_time_extend, AR_BT_TIME_EXTEND) | + SM(btconf->bt_txstate_extend, AR_BT_TXSTATE_EXTEND) | + SM(btconf->bt_txframe_extend, AR_BT_TX_FRAME_EXTEND) | + SM(btconf->bt_mode, AR_BT_MODE) | + SM(btconf->bt_quiet_collision, AR_BT_QUIET) | + SM(rxClearPolarity, AR_BT_RX_CLEAR_POLARITY) | + SM(btconf->bt_priority_time, AR_BT_PRIORITY_TIME) | + SM(btconf->bt_first_slot_time, AR_BT_FIRST_SLOT_TIME); + + ahp->ah_btCoexMode2 |= SM(btconf->bt_hold_rxclear, + AR_BT_HOLD_RX_CLEAR); + + if (ahp->ah_btCoexSingleAnt == AH_FALSE) { + /* Enable ACK to go out even though BT has higher priority. */ + ahp->ah_btCoexMode2 |= AR_BT_DISABLE_BT_ANT; + } +} + +void +ar5416BTCoexSetQcuThresh(struct ath_hal *ah, int qnum) +{ + struct ath_hal_5416 *ahp = AH5416(ah); + + ahp->ah_btCoexMode |= SM(qnum, AR_BT_QCU_THRESH); +} + +void +ar5416BTCoexSetWeights(struct ath_hal *ah, u_int32_t stompType) +{ + struct ath_hal_5416 *ahp = AH5416(ah); + + if (AR_SREV_KIWI_10_OR_LATER(ah)) { + /* TODO: TX RX seperate is not enabled. */ + switch (stompType) { + case HAL_BT_COEX_STOMP_ALL: + ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; + ahp->ah_btCoexWLANWeight = AR5416_STOMP_ALL_WLAN_WGHT; + break; + case HAL_BT_COEX_STOMP_LOW: + ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; + ahp->ah_btCoexWLANWeight = AR5416_STOMP_LOW_WLAN_WGHT; + break; + case HAL_BT_COEX_STOMP_ALL_FORCE: + ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; + ahp->ah_btCoexWLANWeight = + AR5416_STOMP_ALL_FORCE_WLAN_WGHT; + break; + case HAL_BT_COEX_STOMP_LOW_FORCE: + ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; + ahp->ah_btCoexWLANWeight = + AR5416_STOMP_LOW_FORCE_WLAN_WGHT; + break; + case HAL_BT_COEX_STOMP_NONE: + case HAL_BT_COEX_NO_STOMP: + ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; + ahp->ah_btCoexWLANWeight = AR5416_STOMP_NONE_WLAN_WGHT; + break; + default: + /* There is a forceWeight from registry */ + ahp->ah_btCoexBTWeight = stompType & 0xffff; + ahp->ah_btCoexWLANWeight = stompType >> 16; + break; + } + } else { + switch (stompType) { + case HAL_BT_COEX_STOMP_ALL: + ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; + ahp->ah_btCoexWLANWeight = AR5416_STOMP_ALL_WLAN_WGHT; + break; + case HAL_BT_COEX_STOMP_LOW: + ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; + ahp->ah_btCoexWLANWeight = AR5416_STOMP_LOW_WLAN_WGHT; + break; + case HAL_BT_COEX_STOMP_ALL_FORCE: + ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; + ahp->ah_btCoexWLANWeight = + AR5416_STOMP_ALL_FORCE_WLAN_WGHT; + break; + case HAL_BT_COEX_STOMP_LOW_FORCE: + ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; + ahp->ah_btCoexWLANWeight = + AR5416_STOMP_LOW_FORCE_WLAN_WGHT; + break; + case HAL_BT_COEX_STOMP_NONE: + case HAL_BT_COEX_NO_STOMP: + ahp->ah_btCoexBTWeight = AR5416_BT_WGHT; + ahp->ah_btCoexWLANWeight = AR5416_STOMP_NONE_WLAN_WGHT; + break; + default: + /* There is a forceWeight from registry */ + ahp->ah_btCoexBTWeight = stompType & 0xffff; + ahp->ah_btCoexWLANWeight = stompType >> 16; + break; + } + } +} + +void +ar5416BTCoexSetupBmissThresh(struct ath_hal *ah, u_int32_t thresh) +{ + struct ath_hal_5416 *ahp = AH5416(ah); + + ahp->ah_btCoexMode2 |= SM(thresh, AR_BT_BCN_MISS_THRESH); +} + +/* + * There is no antenna diversity for Owl, Kiwi, etc. + * + * Kite will override this particular method. + */ +static void +ar5416BTCoexAntennaDiversity(struct ath_hal *ah) +{ +} + +void +ar5416BTCoexSetParameter(struct ath_hal *ah, u_int32_t type, u_int32_t value) +{ + struct ath_hal_5416 *ahp = AH5416(ah); + + switch (type) { + case HAL_BT_COEX_SET_ACK_PWR: + if (value) { + ahp->ah_btCoexFlag |= HAL_BT_COEX_FLAG_LOW_ACK_PWR; + OS_REG_WRITE(ah, AR_TPC, HAL_BT_COEX_LOW_ACK_POWER); + } else { + ahp->ah_btCoexFlag &= ~HAL_BT_COEX_FLAG_LOW_ACK_PWR; + OS_REG_WRITE(ah, AR_TPC, HAL_BT_COEX_HIGH_ACK_POWER); + } + break; + case HAL_BT_COEX_ANTENNA_DIVERSITY: + /* This is overridden for Kite */ + break; +#if 0 + case HAL_BT_COEX_LOWER_TX_PWR: + if (value) { + if ((ahp->ah_btCoexFlag & HAL_BT_COEX_FLAG_LOWER_TX_PWR) == 0) { + ahp->ah_btCoexFlag |= HAL_BT_COEX_FLAG_LOWER_TX_PWR; + AH_PRIVATE(ah)->ah_config.ath_hal_desc_tpc = 1; + ar5416SetTxPowerLimit(ah, AH_PRIVATE(ah)->ah_power_limit, AH_PRIVATE(ah)->ah_extra_txpow, 0); + } + } + else { + if (ahp->ah_btCoexFlag & HAL_BT_COEX_FLAG_LOWER_TX_PWR) { + ahp->ah_btCoexFlag &= ~HAL_BT_COEX_FLAG_LOWER_TX_PWR; + AH_PRIVATE(ah)->ah_config.ath_hal_desc_tpc = 0; + ar5416SetTxPowerLimit(ah, AH_PRIVATE(ah)->ah_power_limit, AH_PRIVATE(ah)->ah_extra_txpow, 0); + } + } + break; +#endif + default: + break; + } +} + +void +ar5416BTCoexDisable(struct ath_hal *ah) +{ + struct ath_hal_5416 *ahp = AH5416(ah); + + /* Always drive rx_clear_external output as 0 */ + ar5416GpioSet(ah, ahp->ah_wlanActiveGpioSelect, 0); + ar5416GpioCfgOutput(ah, ahp->ah_wlanActiveGpioSelect, + HAL_GPIO_OUTPUT_MUX_AS_OUTPUT); + + if (AR_SREV_9271(ah)) { + /* + * Set wlanActiveGpio to input when disabling BT-COEX to + * reduce power consumption + */ + ar5416GpioCfgInput(ah, ahp->ah_wlanActiveGpioSelect); + } + + if (ahp->ah_btCoexSingleAnt == AH_TRUE) { + OS_REG_RMW_FIELD(ah, AR_QUIET1, AR_QUIET1_QUIET_ACK_CTS_ENABLE, + 1); + OS_REG_RMW_FIELD(ah, AR_MISC_MODE, AR_PCU_BT_ANT_PREVENT_RX, + 0); + } + + OS_REG_WRITE(ah, AR_BT_COEX_MODE, AR_BT_QUIET | AR_BT_MODE); + OS_REG_WRITE(ah, AR_BT_COEX_WEIGHT, 0); + if (AR_SREV_KIWI_10_OR_LATER(ah)) + OS_REG_WRITE(ah, AR_BT_COEX_WEIGHT2, 0); + OS_REG_WRITE(ah, AR_BT_COEX_MODE2, 0); + + ahp->ah_btCoexEnabled = AH_FALSE; +} + +int +ar5416BTCoexEnable(struct ath_hal *ah) +{ + struct ath_hal_5416 *ahp = AH5416(ah); + + /* Program coex mode and weight registers to actually enable coex */ + OS_REG_WRITE(ah, AR_BT_COEX_MODE, ahp->ah_btCoexMode); + OS_REG_WRITE(ah, AR_BT_COEX_WEIGHT, + SM(ahp->ah_btCoexWLANWeight & 0xFFFF, AR_BT_WL_WGHT) | + SM(ahp->ah_btCoexBTWeight & 0xFFFF, AR_BT_BT_WGHT)); + if (AR_SREV_KIWI_10_OR_LATER(ah)) { + OS_REG_WRITE(ah, AR_BT_COEX_WEIGHT2, + SM(ahp->ah_btCoexWLANWeight >> 16, AR_BT_WL_WGHT)); + } + OS_REG_WRITE(ah, AR_BT_COEX_MODE2, ahp->ah_btCoexMode2); + +#if 0 + /* Added Select GPIO5~8 instaed SPI */ + if (AR_SREV_9271(ah)) { + val = OS_REG_READ(ah, AR9271_CLOCK_CONTROL); + val &= 0xFFFFFEFF; + OS_REG_WRITE(ah, AR9271_CLOCK_CONTROL, val); + } +#endif + + if (ahp->ah_btCoexFlag & HAL_BT_COEX_FLAG_LOW_ACK_PWR) + OS_REG_WRITE(ah, AR_TPC, HAL_BT_COEX_LOW_ACK_POWER); + else + OS_REG_WRITE(ah, AR_TPC, HAL_BT_COEX_HIGH_ACK_POWER); + + if (ahp->ah_btCoexSingleAnt == AH_TRUE) { + OS_REG_RMW_FIELD(ah, AR_QUIET1, + AR_QUIET1_QUIET_ACK_CTS_ENABLE, 1); + /* XXX should update miscMode? */ + OS_REG_RMW_FIELD(ah, AR_MISC_MODE, + AR_PCU_BT_ANT_PREVENT_RX, 1); + } else { + OS_REG_RMW_FIELD(ah, AR_QUIET1, + AR_QUIET1_QUIET_ACK_CTS_ENABLE, 1); + /* XXX should update miscMode? */ + OS_REG_RMW_FIELD(ah, AR_MISC_MODE, + AR_PCU_BT_ANT_PREVENT_RX, 0); + } + + if (ahp->ah_btCoexConfigType == HAL_BT_COEX_CFG_3WIRE) { + /* For 3-wire, configure the desired GPIO port for rx_clear */ + ar5416GpioCfgOutput(ah, ahp->ah_wlanActiveGpioSelect, + HAL_GPIO_OUTPUT_MUX_AS_WLAN_ACTIVE); + } else { + /* + * For 2-wire, configure the desired GPIO port + * for TX_FRAME output + */ + ar5416GpioCfgOutput(ah, ahp->ah_wlanActiveGpioSelect, + HAL_GPIO_OUTPUT_MUX_AS_TX_FRAME); + } + + /* + * Enable a weak pull down on BT_ACTIVE. + * When BT device is disabled, BT_ACTIVE might be floating. + */ + OS_REG_RMW(ah, AR_GPIO_PDPU, + (0x2 << (ahp->ah_btActiveGpioSelect * 2)), + (0x3 << (ahp->ah_btActiveGpioSelect * 2))); + + ahp->ah_btCoexEnabled = AH_TRUE; + + return (0); +} + +void +ar5416InitBTCoex(struct ath_hal *ah) +{ + struct ath_hal_5416 *ahp = AH5416(ah); + + if (ahp->ah_btCoexConfigType == HAL_BT_COEX_CFG_3WIRE) { + OS_REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, + (AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_BB | + AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB)); + + /* + * Set input mux for bt_prority_async and + * bt_active_async to GPIO pins + */ + OS_REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1, + AR_GPIO_INPUT_MUX1_BT_ACTIVE, + ahp->ah_btActiveGpioSelect); + OS_REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1, + AR_GPIO_INPUT_MUX1_BT_PRIORITY, + ahp->ah_btPriorityGpioSelect); + + /* + * Configure the desired GPIO ports for input + */ + ar5416GpioCfgInput(ah, ahp->ah_btActiveGpioSelect); + ar5416GpioCfgInput(ah, ahp->ah_btPriorityGpioSelect); + + if (AR_SREV_KITE(ah)) + ar5416BTCoexAntennaDiversity(ah); + + if (ahp->ah_btCoexEnabled) + ar5416BTCoexEnable(ah); + else + ar5416BTCoexDisable(ah); + } else if (ahp->ah_btCoexConfigType != HAL_BT_COEX_CFG_NONE) { + /* 2-wire */ + if (ahp->ah_btCoexEnabled) { + /* Connect bt_active_async to baseband */ + OS_REG_CLR_BIT(ah, AR_GPIO_INPUT_EN_VAL, + (AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_DEF | + AR_GPIO_INPUT_EN_VAL_BT_FREQUENCY_DEF)); + OS_REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, + AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB); + + /* + * Set input mux for bt_prority_async and + * bt_active_async to GPIO pins + */ + OS_REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1, + AR_GPIO_INPUT_MUX1_BT_ACTIVE, + ahp->ah_btActiveGpioSelect); + + /* Configure the desired GPIO ports for input */ + ar5416GpioCfgInput(ah, ahp->ah_btActiveGpioSelect); + + /* Enable coexistence on initialization */ + ar5416BTCoexEnable(ah); + } + } +} diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_btcoex.h b/sys/dev/ath/ath_hal/ar5416/ar5416_btcoex.h new file mode 100644 index 00000000000..0d3e3164471 --- /dev/null +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_btcoex.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2011 Atheros Communications, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef __ATH_AR5416_BTCOEX_H__ +#define __ATH_AR5416_BTCOEX_H__ +/* + * Weight table configurations. + */ +#define AR5416_BT_WGHT 0xff55 +#define AR5416_STOMP_ALL_WLAN_WGHT 0xfcfc +#define AR5416_STOMP_LOW_WLAN_WGHT 0xa8a8 +#define AR5416_STOMP_NONE_WLAN_WGHT 0x0000 +#define AR5416_STOMP_ALL_FORCE_WLAN_WGHT 0xffff // Stomp BT even when WLAN is idle +#define AR5416_STOMP_LOW_FORCE_WLAN_WGHT 0xaaaa // Stomp BT even when WLAN is idle + +#endif /* __ATH_AR5416_BTCOEX_H__ */ diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_gpio.c b/sys/dev/ath/ath_hal/ar5416/ar5416_gpio.c index 89334f55f29..3c493b43f4e 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_gpio.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_gpio.c @@ -85,23 +85,49 @@ ar5416GpioCfgOutput(struct ath_hal *ah, uint32_t gpio, HAL_GPIO_MUX_TYPE type) { uint32_t gpio_shift, reg; +#define N(a) (sizeof(a) / sizeof(a[0])) + HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins); + /* + * This table maps the HAL GPIO pins to the actual hardware + * values. + */ + static const u_int32_t MuxSignalConversionTable[] = { + AR_GPIO_OUTPUT_MUX_AS_OUTPUT, + AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED, + AR_GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED, + AR_GPIO_OUTPUT_MUX_AS_MAC_NETWORK_LED, + AR_GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED, + AR_GPIO_OUTPUT_MUX_AS_RX_CLEAR_EXTERNAL, + AR_GPIO_OUTPUT_MUX_AS_TX_FRAME, + }; + HALDEBUG(ah, HAL_DEBUG_GPIO, "%s: gpio=%d, type=%d\n", __func__, gpio, type); - /* NB: type maps directly to hardware */ - /* XXX this may not actually be the case, for anything but output */ - cfgOutputMux(ah, gpio, type); - gpio_shift = gpio << 1; /* 2 bits per output mode */ + /* + * Convert HAL signal type definitions to hardware-specific values. + */ + if (type >= N(MuxSignalConversionTable)) { + ath_hal_printf(ah, "%s: mux %d is invalid!\n", + __func__, + type); + return AH_FALSE; + } + cfgOutputMux(ah, gpio, MuxSignalConversionTable[type]); + /* 2 bits per output mode */ + gpio_shift = gpio << 1; + + /* Always drive, rather than tristate/drive low/drive high */ reg = OS_REG_READ(ah, AR_GPIO_OE_OUT); reg &= ~(AR_GPIO_OE_OUT_DRV << gpio_shift); - /* Always drive, rather than tristate/drive low/drive high */ reg |= AR_GPIO_OE_OUT_DRV_ALL << gpio_shift; OS_REG_WRITE(ah, AR_GPIO_OE_OUT, reg); return AH_TRUE; +#undef N } /* diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c index 68073845183..fef3cec2696 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c @@ -184,12 +184,11 @@ ar5416SetCoverageClass(struct ath_hal *ah, uint8_t coverageclass, int now) /* * Return the busy for rx_frame, rx_clear, and tx_frame */ -uint32_t -ar5416GetMibCycleCountsPct(struct ath_hal *ah, uint32_t *rxc_pcnt, - uint32_t *extc_pcnt, uint32_t *rxf_pcnt, uint32_t *txf_pcnt) +HAL_BOOL +ar5416GetMibCycleCounts(struct ath_hal *ah, HAL_SURVEY_SAMPLE *hsample) { struct ath_hal_5416 *ahp = AH5416(ah); - u_int32_t good = 1; + u_int32_t good = AH_TRUE; /* XXX freeze/unfreeze mib counters */ uint32_t rc = OS_REG_READ(ah, AR_RCCNT); @@ -206,36 +205,34 @@ ar5416GetMibCycleCountsPct(struct ath_hal *ah, uint32_t *rxc_pcnt, */ HALDEBUG(ah, HAL_DEBUG_ANY, "%s: cycle counter wrap. ExtBusy = 0\n", __func__); - good = 0; + good = AH_FALSE; } else { - uint32_t cc_d = cc - ahp->ah_cycleCount; - uint32_t rc_d = rc - ahp->ah_ctlBusy; - uint32_t ec_d = ec - ahp->ah_extBusy; - uint32_t rf_d = rf - ahp->ah_rxBusy; - uint32_t tf_d = tf - ahp->ah_txBusy; - - if (cc_d != 0) { - *rxc_pcnt = rc_d * 100 / cc_d; - *rxf_pcnt = rf_d * 100 / cc_d; - *txf_pcnt = tf_d * 100 / cc_d; - *extc_pcnt = ec_d * 100 / cc_d; - } else { - good = 0; - } + hsample->cycle_count = cc - ahp->ah_cycleCount; + hsample->chan_busy = rc - ahp->ah_ctlBusy; + hsample->ext_chan_busy = ec - ahp->ah_extBusy; + hsample->rx_busy = rf - ahp->ah_rxBusy; + hsample->tx_busy = tf - ahp->ah_txBusy; } + + /* + * Keep a copy of the MIB results so the next sample has something + * to work from. + */ ahp->ah_cycleCount = cc; ahp->ah_rxBusy = rf; ahp->ah_ctlBusy = rc; ahp->ah_txBusy = tf; ahp->ah_extBusy = ec; - return good; + return (good); } /* * Return approximation of extension channel busy over an time interval * 0% (clear) -> 100% (busy) * + * XXX TODO: update this to correctly sample all the counters, + * rather than a subset of it. */ uint32_t ar5416Get11nExtBusy(struct ath_hal *ah) @@ -496,36 +493,6 @@ ar5416GetDiagState(struct ath_hal *ah, int request, args, argsize, result, resultsize); } -typedef struct { - uint32_t dma_dbg_3; - uint32_t dma_dbg_4; - uint32_t dma_dbg_5; - uint32_t dma_dbg_6; -} mac_dbg_regs_t; - -typedef enum { - dcu_chain_state = 0x1, - dcu_complete_state = 0x2, - qcu_state = 0x4, - qcu_fsp_ok = 0x8, - qcu_fsp_state = 0x10, - qcu_stitch_state = 0x20, - qcu_fetch_state = 0x40, - qcu_complete_state = 0x80 -} hal_mac_hangs_t; - -typedef struct { - int states; - uint8_t dcu_chain_state; - uint8_t dcu_complete_state; - uint8_t qcu_state; - uint8_t qcu_fsp_ok; - uint8_t qcu_fsp_state; - uint8_t qcu_stitch_state; - uint8_t qcu_fetch_state; - uint8_t qcu_complete_state; -} hal_mac_hang_check_t; - HAL_BOOL ar5416SetRifsDelay(struct ath_hal *ah, const struct ieee80211_channel *chan, HAL_BOOL enable) diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c b/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c index de4343e98a4..9e4b8117250 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c @@ -66,6 +66,40 @@ ar5416SetRxFilter(struct ath_hal *ah, u_int32_t bits) } } +/* + * Stop Receive at the DMA engine + */ +HAL_BOOL +ar5416StopDmaReceive(struct ath_hal *ah) +{ + HAL_BOOL status; + + OS_MARK(ah, AH_MARK_RX_CTL, AH_MARK_RX_CTL_DMA_STOP); + OS_REG_WRITE(ah, AR_CR, AR_CR_RXD); /* Set receive disable bit */ + if (!ath_hal_wait(ah, AR_CR, AR_CR_RXE, 0)) { + OS_MARK(ah, AH_MARK_RX_CTL, AH_MARK_RX_CTL_DMA_STOP_ERR); +#ifdef AH_DEBUG + ath_hal_printf(ah, "%s: dma failed to stop in 10ms\n" + "AR_CR=0x%08x\nAR_DIAG_SW=0x%08x\n", + __func__, + OS_REG_READ(ah, AR_CR), + OS_REG_READ(ah, AR_DIAG_SW)); +#endif + status = AH_FALSE; + } else { + status = AH_TRUE; + } + + /* + * XXX Is this to flush whatever is in a FIFO somewhere? + * XXX If so, what should the correct behaviour should be? + */ + if (AR_SREV_9100(ah)) + OS_DELAY(3000); + + return (status); +} + /* * Start receive at the PCU engine */ @@ -194,15 +228,40 @@ ar5416ProcRxDesc(struct ath_hal *ah, struct ath_desc *ds, * Consequently we filter them out here so we don't * confuse and/or complicate drivers. */ - if (ads->ds_rxstatus8 & AR_CRCErr) - rs->rs_status |= HAL_RXERR_CRC; - else if (ads->ds_rxstatus8 & AR_PHYErr) { + + /* + * The AR5416 sometimes sets both AR_CRCErr and AR_PHYErr + * when reporting radar pulses. In this instance + * set HAL_RXERR_PHY as well as HAL_RXERR_CRC and + * let the driver layer figure out what to do. + * + * See PR kern/169362. + */ + if (ads->ds_rxstatus8 & AR_PHYErr) { u_int phyerr; - rs->rs_status |= HAL_RXERR_PHY; + /* + * Packets with OFDM_RESTART on post delimiter are CRC OK and + * usable and MAC ACKs them. + * To avoid packet from being lost, we remove the PHY Err flag + * so that driver layer does not drop them. + */ phyerr = MS(ads->ds_rxstatus8, AR_PHYErrCode); - rs->rs_phyerr = phyerr; - } else if (ads->ds_rxstatus8 & AR_DecryptCRCErr) + + if ((phyerr == HAL_PHYERR_OFDM_RESTART) && + (ads->ds_rxstatus8 & AR_PostDelimCRCErr)) { + ath_hal_printf(ah, + "%s: OFDM_RESTART on post-delim CRC error\n", + __func__); + rs->rs_phyerr = 0; + } else { + rs->rs_status |= HAL_RXERR_PHY; + rs->rs_phyerr = phyerr; + } + } + if (ads->ds_rxstatus8 & AR_CRCErr) + rs->rs_status |= HAL_RXERR_CRC; + else if (ads->ds_rxstatus8 & AR_DecryptCRCErr) rs->rs_status |= HAL_RXERR_DECRYPT; else if (ads->ds_rxstatus8 & AR_MichaelErr) rs->rs_status |= HAL_RXERR_MIC; diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c b/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c index 1004f5201ab..bd43d5d1056 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c @@ -118,6 +118,9 @@ ar5416Reset(struct ath_hal *ah, HAL_OPMODE opmode, } HALASSERT(AH_PRIVATE(ah)->ah_eeversion >= AR_EEPROM_VER14_1); + /* Blank the channel survey statistics */ + OS_MEMZERO(&ahp->ah_chansurvey, sizeof(ahp->ah_chansurvey)); + /* XXX Turn on fast channel change for 5416 */ /* * Preserve the bmiss rssi threshold and count threshold diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416reg.h b/sys/dev/ath/ath_hal/ar5416/ar5416reg.h index f8e897dd4cc..ea1a9cddfac 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416reg.h +++ b/sys/dev/ath/ath_hal/ar5416/ar5416reg.h @@ -253,11 +253,15 @@ #define AR_MAC_LED_ASSOC_PEND 0x2 /* STA is trying to associate */ #define AR_MAC_LED_ASSOC_S 10 +#define AR_WA_BIT6 0x00000040 +#define AR_WA_BIT7 0x00000080 +#define AR_WA_D3_L1_DISABLE 0x00004000 /* */ #define AR_WA_UNTIE_RESET_EN 0x00008000 /* ena PCI reset to POR */ #define AR_WA_RESET_EN 0x00040000 /* ena AR_WA_UNTIE_RESET_EN */ #define AR_WA_ANALOG_SHIFT 0x00100000 #define AR_WA_POR_SHORT 0x00200000 /* PCIE phy reset control */ -#define AR_WA_D3_L1_DISABLE 0x00800000 /* bit 23 */ +#define AR_WA_BIT22 0x00400000 +#define AR_WA_BIT23 0x00800000 #define AR_WA_DEFAULT 0x0000073f #define AR9280_WA_DEFAULT 0x0040073b /* disable bit 2, see commit */ diff --git a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c index 5c5ad9aa5a4..36205d4eb61 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c @@ -61,7 +61,9 @@ static const HAL_PERCAL_DATA ar9280_adc_init_dc_cal = { .calPostProc = ar5416AdcDcCalibration }; -static void ar9280ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore); +static void ar9280ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, + HAL_BOOL power_off); +static void ar9280DisablePCIE(struct ath_hal *ah); static HAL_BOOL ar9280FillCapabilityInfo(struct ath_hal *ah); static void ar9280WriteIni(struct ath_hal *ah, const struct ieee80211_channel *chan); @@ -187,6 +189,7 @@ ar9280Attach(uint16_t devid, HAL_SOFTC sc, ah->ah_setAntennaSwitch = ar9280SetAntennaSwitch; ah->ah_configPCIE = ar9280ConfigPCIE; + ah->ah_disablePCIE = ar9280DisablePCIE; AH5416(ah)->ah_cal.iqCalData.calData = &ar9280_iq_cal; AH5416(ah)->ah_cal.adcGainCalData.calData = &ar9280_adc_gain_cal; @@ -415,14 +418,70 @@ bad: } static void -ar9280ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore) +ar9280ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, HAL_BOOL power_off) { + uint32_t val; + if (AH_PRIVATE(ah)->ah_ispcie && !restore) { ath_hal_ini_write(ah, &AH5416(ah)->ah_ini_pcieserdes, 1, 0); OS_DELAY(1000); - OS_REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); - OS_REG_WRITE(ah, AR_WA, AR9280_WA_DEFAULT); } + + + /* + * Set PCIe workaround bits + * + * NOTE: + * + * In Merlin and Kite, bit 14 in WA register (disable L1) should only + * be set when device enters D3 and be cleared when device comes back + * to D0. + */ + if (power_off) { /* Power-off */ + OS_REG_CLR_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); + + val = OS_REG_READ(ah, AR_WA); + + /* + * Disable bit 6 and 7 before entering D3 to prevent + * system hang. + */ + val &= ~(AR_WA_BIT6 | AR_WA_BIT7); + + /* + * XXX Not sure, is specified in the reference HAL. + */ + val |= AR_WA_BIT22; + + /* + * See above: set AR_WA_D3_L1_DISABLE when entering D3 state. + * + * XXX The reference HAL does it this way - it only sets + * AR_WA_D3_L1_DISABLE if it's set in AR9280_WA_DEFAULT, + * which it (currently) isn't. So the following statement + * is currently a NOP. + */ + if (AR9280_WA_DEFAULT & AR_WA_D3_L1_DISABLE) + val |= AR_WA_D3_L1_DISABLE; + + OS_REG_WRITE(ah, AR_WA, val); + } else { /* Power-on */ + val = AR9280_WA_DEFAULT; + + /* + * See note above: make sure L1_DISABLE is not set. + */ + val &= (~AR_WA_D3_L1_DISABLE); + OS_REG_WRITE(ah, AR_WA, val); + + /* set bit 19 to allow forcing of pcie core into L1 state */ + OS_REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); + } +} + +static void +ar9280DisablePCIE(struct ath_hal *ah) +{ } static void diff --git a/sys/dev/ath/ath_hal/ar9002/ar9285.h b/sys/dev/ath/ath_hal/ar9002/ar9285.h index 3f6b48143c4..a1451d2d1da 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9285.h +++ b/sys/dev/ath/ath_hal/ar9002/ar9285.h @@ -86,4 +86,9 @@ extern HAL_BOOL ar9285SetTransmitPower(struct ath_hal *, extern HAL_BOOL ar9285SetBoardValues(struct ath_hal *, const struct ieee80211_channel *); +/* ar9285_btcoex.h */ +extern void ar9285BTCoexAntennaDiversity(struct ath_hal *ah); +extern void ar9285BTCoexSetParameter(struct ath_hal *ah, + u_int32_t value, u_int32_t type); + #endif /* _ATH_AR9285_H_ */ diff --git a/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c index b43b48542c4..940c6a5baea 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c @@ -66,7 +66,9 @@ static const HAL_PERCAL_DATA ar9280_adc_init_dc_cal = { .calPostProc = ar5416AdcDcCalibration }; -static void ar9285ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore); +static void ar9285ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, + HAL_BOOL power_off); +static void ar9285DisablePCIE(struct ath_hal *ah); static HAL_BOOL ar9285FillCapabilityInfo(struct ath_hal *ah); static void ar9285WriteIni(struct ath_hal *ah, const struct ieee80211_channel *chan); @@ -152,6 +154,7 @@ ar9285Attach(uint16_t devid, HAL_SOFTC sc, ah->ah_setAntennaSwitch = ar9285SetAntennaSwitch; ah->ah_configPCIE = ar9285ConfigPCIE; + ah->ah_disablePCIE = ar9285DisablePCIE; ah->ah_setTxPower = ar9285SetTransmitPower; ah->ah_setBoardValues = ar9285SetBoardValues; @@ -362,14 +365,92 @@ bad: } static void -ar9285ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore) +ar9285ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, HAL_BOOL power_off) { + uint32_t val; + + /* + * This workaround needs some integration work with the HAL + * config parameters and the if_ath_pci.c glue. + * Specifically, read the value of the PCI register 0x70c + * (4 byte PCI config space register) and store it in ath_hal_war70c. + * Then if it's non-zero, the below WAR would override register + * 0x570c upon suspend/resume. + */ +#if 0 + if (AR_SREV_9285E_20(ah)) { + val = AH_PRIVATE(ah)->ah_config.ath_hal_war70c; + if (val) { + val &= 0xffff00ff; + val |= 0x6f00; + OS_REG_WRITE(ah, 0x570c, val); + } + } +#endif + if (AH_PRIVATE(ah)->ah_ispcie && !restore) { ath_hal_ini_write(ah, &AH5416(ah)->ah_ini_pcieserdes, 1, 0); OS_DELAY(1000); - OS_REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); - OS_REG_WRITE(ah, AR_WA, AR9285_WA_DEFAULT); } + + /* + * Set PCIe workaround bits + * + * NOTE: + * + * In Merlin and Kite, bit 14 in WA register (disable L1) should only + * be set when device enters D3 and be cleared when device comes back + * to D0. + */ + if (power_off) { /* Power-off */ + OS_REG_CLR_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); + + val = OS_REG_READ(ah, AR_WA); + + /* + * Disable bit 6 and 7 before entering D3 to prevent + * system hang. + */ + val &= ~(AR_WA_BIT6 | AR_WA_BIT7); + + /* + * See above: set AR_WA_D3_L1_DISABLE when entering D3 state. + * + * XXX The reference HAL does it this way - it only sets + * AR_WA_D3_L1_DISABLE if it's set in AR9280_WA_DEFAULT, + * which it (currently) isn't. So the following statement + * is currently a NOP. + */ + if (AR9285_WA_DEFAULT & AR_WA_D3_L1_DISABLE) + val |= AR_WA_D3_L1_DISABLE; + + if (AR_SREV_9285E_20(ah)) + val |= AR_WA_BIT23; + + OS_REG_WRITE(ah, AR_WA, val); + } else { /* Power-on */ + val = AR9285_WA_DEFAULT; + /* + * See note above: make sure L1_DISABLE is not set. + */ + val &= (~AR_WA_D3_L1_DISABLE); + + /* Software workaroud for ASPM system hang. */ + val |= (AR_WA_BIT6 | AR_WA_BIT7); + + if (AR_SREV_9285E_20(ah)) + val |= AR_WA_BIT23; + + OS_REG_WRITE(ah, AR_WA, val); + + /* set bit 19 to allow forcing of pcie core into L1 state */ + OS_REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); + } +} + +static void +ar9285DisablePCIE(struct ath_hal *ah) +{ } static void diff --git a/sys/dev/ath/ath_hal/ar9002/ar9285_btcoex.c b/sys/dev/ath/ath_hal/ar9002/ar9285_btcoex.c new file mode 100644 index 00000000000..256039c47e5 --- /dev/null +++ b/sys/dev/ath/ath_hal/ar9002/ar9285_btcoex.c @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting + * Copyright (c) 2002-2005 Atheros Communications, Inc. + * Copyright (c) 2008-2010, Atheros Communications Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#include "opt_ah.h" + +#include "ah.h" +#include "ah_internal.h" +#include "ah_devid.h" +#ifdef AH_DEBUG +#include "ah_desc.h" /* NB: for HAL_PHYERR* */ +#endif + +#include "ar5416/ar5416.h" +#include "ar5416/ar5416reg.h" +#include "ar5416/ar5416phy.h" +#include "ar5416/ar5416desc.h" /* AR5416_CONTTXMODE */ + +#include "ar9002/ar9285phy.h" +#include "ar9002/ar9285.h" + +/* + * This is specific to Kite. + * + * Kiwi and others don't have antenna diversity like this. + */ +void +ar9285BTCoexAntennaDiversity(struct ath_hal *ah) +{ + struct ath_hal_5416 *ahp = AH5416(ah); + u_int32_t regVal; + u_int8_t ant_div_control1, ant_div_control2; + + if ((ahp->ah_btCoexFlag & HAL_BT_COEX_FLAG_ANT_DIV_ALLOW) || + (AH5212(ah)->ah_diversity != HAL_ANT_VARIABLE)) { + if ((ahp->ah_btCoexFlag & HAL_BT_COEX_FLAG_ANT_DIV_ENABLE) && + (AH5212(ah)->ah_diversity == HAL_ANT_VARIABLE)) { + /* Enable antenna diversity */ + ant_div_control1 = HAL_BT_COEX_ANTDIV_CONTROL1_ENABLE; + ant_div_control2 = HAL_BT_COEX_ANTDIV_CONTROL2_ENABLE; + + /* Don't disable BT ant to allow BB to control SWCOM */ + ahp->ah_btCoexMode2 &= (~(AR_BT_DISABLE_BT_ANT)); + OS_REG_WRITE(ah, AR_BT_COEX_MODE2, ahp->ah_btCoexMode2); + + /* Program the correct SWCOM table */ + OS_REG_WRITE(ah, AR_PHY_SWITCH_COM, + HAL_BT_COEX_ANT_DIV_SWITCH_COM); + OS_REG_RMW(ah, AR_PHY_SWITCH_CHAIN_0, 0, 0xf0000000); + } else if (AH5212(ah)->ah_diversity == HAL_ANT_FIXED_B) { + /* Disable antenna diversity. Use antenna B(LNA2) only. */ + ant_div_control1 = HAL_BT_COEX_ANTDIV_CONTROL1_FIXED_B; + ant_div_control2 = HAL_BT_COEX_ANTDIV_CONTROL2_FIXED_B; + + /* Disable BT ant to allow concurrent BT and WLAN receive */ + ahp->ah_btCoexMode2 |= AR_BT_DISABLE_BT_ANT; + OS_REG_WRITE(ah, AR_BT_COEX_MODE2, ahp->ah_btCoexMode2); + + /* Program SWCOM talbe to make sure RF switch always parks at WLAN side */ + OS_REG_WRITE(ah, AR_PHY_SWITCH_COM, HAL_BT_COEX_ANT_DIV_SWITCH_COM); + OS_REG_RMW(ah, AR_PHY_SWITCH_CHAIN_0, 0x60000000, 0xf0000000); + } else { + /* Disable antenna diversity. Use antenna A(LNA1) only */ + ant_div_control1 = HAL_BT_COEX_ANTDIV_CONTROL1_FIXED_A; + ant_div_control2 = HAL_BT_COEX_ANTDIV_CONTROL2_FIXED_A; + + /* Disable BT ant to allow concurrent BT and WLAN receive */ + ahp->ah_btCoexMode2 |= AR_BT_DISABLE_BT_ANT; + OS_REG_WRITE(ah, AR_BT_COEX_MODE2, ahp->ah_btCoexMode2); + + /* Program SWCOM talbe to make sure RF switch always parks at BT side */ + OS_REG_WRITE(ah, AR_PHY_SWITCH_COM, 0); + OS_REG_RMW(ah, AR_PHY_SWITCH_CHAIN_0, 0, 0xf0000000); + } + + regVal = OS_REG_READ(ah, AR_PHY_MULTICHAIN_GAIN_CTL); + regVal &= (~(AR_PHY_9285_ANT_DIV_CTL_ALL)); + /* Clear ant_fast_div_bias [14:9] since for Janus the main LNA is always LNA1. */ + regVal &= (~(AR_PHY_9285_FAST_DIV_BIAS)); + + regVal |= SM(ant_div_control1, AR_PHY_9285_ANT_DIV_CTL); + regVal |= SM(ant_div_control2, AR_PHY_9285_ANT_DIV_ALT_LNACONF); + regVal |= SM((ant_div_control2 >> 2), AR_PHY_9285_ANT_DIV_MAIN_LNACONF); + regVal |= SM((ant_div_control1 >> 1), AR_PHY_9285_ANT_DIV_ALT_GAINTB); + regVal |= SM((ant_div_control1 >> 2), AR_PHY_9285_ANT_DIV_MAIN_GAINTB); + OS_REG_WRITE(ah, AR_PHY_MULTICHAIN_GAIN_CTL, regVal); + + regVal = OS_REG_READ(ah, AR_PHY_CCK_DETECT); + regVal &= (~AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV); + regVal |= SM((ant_div_control1 >> 3), AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV); + OS_REG_WRITE(ah, AR_PHY_CCK_DETECT, regVal); + } +} + +void +ar9285BTCoexSetParameter(struct ath_hal *ah, u_int32_t type, u_int32_t value) +{ + struct ath_hal_5416 *ahp = AH5416(ah); + + switch (type) { + case HAL_BT_COEX_ANTENNA_DIVERSITY: + if (AR_SREV_KITE(ah)) { + ahp->ah_btCoexFlag |= HAL_BT_COEX_FLAG_ANT_DIV_ALLOW; + if (value) + ahp->ah_btCoexFlag |= + HAL_BT_COEX_FLAG_ANT_DIV_ENABLE; + else + ahp->ah_btCoexFlag &= + ~HAL_BT_COEX_FLAG_ANT_DIV_ENABLE; + ar9285BTCoexAntennaDiversity(ah); + } + break; + default: + ar5416BTCoexSetParameter(ah, type, value); + break; + } +} + + diff --git a/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c index 78f74937a72..fc69103ba93 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c @@ -65,7 +65,9 @@ static const HAL_PERCAL_DATA ar9287_adc_init_dc_cal = { .calPostProc = ar5416AdcDcCalibration }; -static void ar9287ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore); +static void ar9287ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, + HAL_BOOL power_off); +static void ar9287DisablePCIE(struct ath_hal *ah); static HAL_BOOL ar9287FillCapabilityInfo(struct ath_hal *ah); static void ar9287WriteIni(struct ath_hal *ah, const struct ieee80211_channel *chan); @@ -141,6 +143,7 @@ ar9287Attach(uint16_t devid, HAL_SOFTC sc, ah->ah_setAntennaSwitch = ar9287SetAntennaSwitch; ah->ah_configPCIE = ar9287ConfigPCIE; + ah->ah_disablePCIE = ar9287DisablePCIE; AH5416(ah)->ah_cal.iqCalData.calData = &ar9287_iq_cal; AH5416(ah)->ah_cal.adcGainCalData.calData = &ar9287_adc_gain_cal; @@ -357,16 +360,23 @@ bad: } static void -ar9287ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore) +ar9287ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore, HAL_BOOL power_off) { if (AH_PRIVATE(ah)->ah_ispcie && !restore) { ath_hal_ini_write(ah, &AH5416(ah)->ah_ini_pcieserdes, 1, 0); OS_DELAY(1000); OS_REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); - OS_REG_WRITE(ah, AR_WA, AR9285_WA_DEFAULT); /* Yes, Kiwi uses the Kite PCIe PHY WA */ + /* Yes, Kiwi uses the Kite PCIe PHY WA */ + OS_REG_WRITE(ah, AR_WA, AR9285_WA_DEFAULT); } } +static void +ar9287DisablePCIE(struct ath_hal *ah) +{ + /* XXX TODO */ +} + static void ar9287WriteIni(struct ath_hal *ah, const struct ieee80211_channel *chan) { diff --git a/sys/dev/ath/ath_hal/ar9002/ar9287_reset.c b/sys/dev/ath/ath_hal/ar9002/ar9287_reset.c index a799ba0da99..8b7cecc3fbb 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9287_reset.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9287_reset.c @@ -45,70 +45,70 @@ static void ar9287SetPowerCalTable(struct ath_hal *ah, const struct ieee80211_channel *chan, int16_t *pTxPowerIndexOffset) { - struct cal_data_op_loop_ar9287 *pRawDatasetOpenLoop; - uint8_t *pCalBChans = NULL; - uint16_t pdGainOverlap_t2; - uint16_t numPiers = 0, i; - uint16_t numXpdGain, xpdMask; - uint16_t xpdGainValues[AR5416_NUM_PD_GAINS] = {0, 0, 0, 0}; - uint32_t regChainOffset; + struct cal_data_op_loop_ar9287 *pRawDatasetOpenLoop; + uint8_t *pCalBChans = NULL; + uint16_t pdGainOverlap_t2; + uint16_t numPiers = 0, i; + uint16_t numXpdGain, xpdMask; + uint16_t xpdGainValues[AR5416_NUM_PD_GAINS] = {0, 0, 0, 0}; + uint32_t regChainOffset; HAL_EEPROM_9287 *ee = AH_PRIVATE(ah)->ah_eeprom; - struct ar9287_eeprom *pEepData = &ee->ee_base; + struct ar9287_eeprom *pEepData = &ee->ee_base; - xpdMask = pEepData->modalHeader.xpdGain; + xpdMask = pEepData->modalHeader.xpdGain; - if ((pEepData->baseEepHeader.version & AR9287_EEP_VER_MINOR_MASK) >= - AR9287_EEP_MINOR_VER_2) - pdGainOverlap_t2 = pEepData->modalHeader.pdGainOverlap; - else - pdGainOverlap_t2 = (uint16_t)(MS(OS_REG_READ(ah, AR_PHY_TPCRG5), - AR_PHY_TPCRG5_PD_GAIN_OVERLAP)); + if ((pEepData->baseEepHeader.version & AR9287_EEP_VER_MINOR_MASK) >= + AR9287_EEP_MINOR_VER_2) + pdGainOverlap_t2 = pEepData->modalHeader.pdGainOverlap; + else + pdGainOverlap_t2 = (uint16_t)(MS(OS_REG_READ(ah, AR_PHY_TPCRG5), + AR_PHY_TPCRG5_PD_GAIN_OVERLAP)); /* Note: Kiwi should only be 2ghz.. */ - if (IEEE80211_IS_CHAN_2GHZ(chan)) { - pCalBChans = pEepData->calFreqPier2G; - numPiers = AR9287_NUM_2G_CAL_PIERS; - pRawDatasetOpenLoop = (struct cal_data_op_loop_ar9287 *)pEepData->calPierData2G[0]; - AH5416(ah)->initPDADC = pRawDatasetOpenLoop->vpdPdg[0][0]; - } - numXpdGain = 0; + if (IEEE80211_IS_CHAN_2GHZ(chan)) { + pCalBChans = pEepData->calFreqPier2G; + numPiers = AR9287_NUM_2G_CAL_PIERS; + pRawDatasetOpenLoop = (struct cal_data_op_loop_ar9287 *)pEepData->calPierData2G[0]; + AH5416(ah)->initPDADC = pRawDatasetOpenLoop->vpdPdg[0][0]; + } + numXpdGain = 0; - /* Calculate the value of xpdgains from the xpdGain Mask */ - for (i = 1; i <= AR5416_PD_GAINS_IN_MASK; i++) { - if ((xpdMask >> (AR5416_PD_GAINS_IN_MASK - i)) & 1) { - if (numXpdGain >= AR5416_NUM_PD_GAINS) - break; - xpdGainValues[numXpdGain] = - (uint16_t)(AR5416_PD_GAINS_IN_MASK-i); - numXpdGain++; - } - } + /* Calculate the value of xpdgains from the xpdGain Mask */ + for (i = 1; i <= AR5416_PD_GAINS_IN_MASK; i++) { + if ((xpdMask >> (AR5416_PD_GAINS_IN_MASK - i)) & 1) { + if (numXpdGain >= AR5416_NUM_PD_GAINS) + break; + xpdGainValues[numXpdGain] = + (uint16_t)(AR5416_PD_GAINS_IN_MASK-i); + numXpdGain++; + } + } - OS_REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_NUM_PD_GAIN, - (numXpdGain - 1) & 0x3); - OS_REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_1, - xpdGainValues[0]); - OS_REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_2, - xpdGainValues[1]); - OS_REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_3, - xpdGainValues[2]); + OS_REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_NUM_PD_GAIN, + (numXpdGain - 1) & 0x3); + OS_REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_1, + xpdGainValues[0]); + OS_REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_2, + xpdGainValues[1]); + OS_REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_3, + xpdGainValues[2]); - for (i = 0; i < AR9287_MAX_CHAINS; i++) { - regChainOffset = i * 0x1000; + for (i = 0; i < AR9287_MAX_CHAINS; i++) { + regChainOffset = i * 0x1000; - if (pEepData->baseEepHeader.txMask & (1 << i)) { - int8_t txPower; - pRawDatasetOpenLoop = - (struct cal_data_op_loop_ar9287 *)pEepData->calPierData2G[i]; - ar9287olcGetTxGainIndex(ah, chan, - pRawDatasetOpenLoop, - pCalBChans, numPiers, - &txPower); - ar9287olcSetPDADCs(ah, txPower, i); - } - } + if (pEepData->baseEepHeader.txMask & (1 << i)) { + int8_t txPower; + pRawDatasetOpenLoop = + (struct cal_data_op_loop_ar9287 *)pEepData->calPierData2G[i]; + ar9287olcGetTxGainIndex(ah, chan, + pRawDatasetOpenLoop, + pCalBChans, numPiers, + &txPower); + ar9287olcSetPDADCs(ah, txPower, i); + } + } - *pTxPowerIndexOffset = 0; + *pTxPowerIndexOffset = 0; } @@ -329,20 +329,20 @@ ar9287SetTransmitPower(struct ath_hal *ah, const struct ieee80211_channel *chan, uint16_t *rfXpdGain) { #define POW_SM(_r, _s) (((_r) & 0x3f) << (_s)) -#define N(a) (sizeof (a) / sizeof (a[0])) +#define N(a) (sizeof (a) / sizeof (a[0])) const struct modal_eep_ar9287_header *pModal; struct ath_hal_5212 *ahp = AH5212(ah); - int16_t ratesArray[Ar5416RateSize]; - int16_t txPowerIndexOffset = 0; - uint8_t ht40PowerIncForPdadc = 2; - int i; + int16_t ratesArray[Ar5416RateSize]; + int16_t txPowerIndexOffset = 0; + uint8_t ht40PowerIncForPdadc = 2; + int i; - uint16_t cfgCtl; - uint16_t powerLimit; - uint16_t twiceAntennaReduction; - uint16_t twiceMaxRegulatoryPower; - int16_t maxPower; + uint16_t cfgCtl; + uint16_t powerLimit; + uint16_t twiceAntennaReduction; + uint16_t twiceMaxRegulatoryPower; + int16_t maxPower; HAL_EEPROM_9287 *ee = AH_PRIVATE(ah)->ah_eeprom; struct ar9287_eeprom *pEepData = &ee->ee_base; @@ -351,7 +351,8 @@ ar9287SetTransmitPower(struct ath_hal *ah, cfgCtl = ath_hal_getctl(ah, chan); powerLimit = chan->ic_maxregpower * 2; twiceAntennaReduction = chan->ic_maxantgain; - twiceMaxRegulatoryPower = AH_MIN(MAX_RATE_POWER, AH_PRIVATE(ah)->ah_powerLimit); + twiceMaxRegulatoryPower = AH_MIN(MAX_RATE_POWER, + AH_PRIVATE(ah)->ah_powerLimit); pModal = &pEepData->modalHeader; HALDEBUG(ah, HAL_DEBUG_RESET, "%s Channel=%u CfgCtl=%u\n", __func__,chan->ic_freq, cfgCtl ); @@ -361,9 +362,9 @@ ar9287SetTransmitPower(struct ath_hal *ah, /* Fetch per-rate power table for the given channel */ if (! ar9287SetPowerPerRateTable(ah, pEepData, chan, - &ratesArray[0],cfgCtl, - twiceAntennaReduction, - twiceMaxRegulatoryPower, powerLimit)) { + &ratesArray[0],cfgCtl, + twiceAntennaReduction, + twiceMaxRegulatoryPower, powerLimit)) { HALDEBUG(ah, HAL_DEBUG_ANY, "%s: unable to set tx power per rate table\n", __func__); return AH_FALSE; @@ -476,7 +477,8 @@ ar9287SetBoardValues(struct ath_hal *ah, const struct ieee80211_channel *chan) pModal->antCtrlChain[i]); OS_REG_WRITE(ah, AR_PHY_TIMING_CTRL4_CHAIN(0) + regChainOffset, - (OS_REG_READ(ah, AR_PHY_TIMING_CTRL4_CHAIN(0) + regChainOffset) + (OS_REG_READ(ah, AR_PHY_TIMING_CTRL4_CHAIN(0) + + regChainOffset) & ~(AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF | AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF)) | SM(pModal->iqCalICh[i], @@ -500,7 +502,6 @@ ar9287SetBoardValues(struct ath_hal *ah, const struct ieee80211_channel *chan) pModal->rxTxMarginCh[i]); } - if (IEEE80211_IS_CHAN_HT40(chan)) OS_REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_SWITCH, pModal->swSettleHt40); @@ -539,8 +540,8 @@ ar9287SetBoardValues(struct ath_hal *ah, const struct ieee80211_channel *chan) SM(pModal->ob_qam, AR9287_AN_RF2G3_OB_QAM) | SM(pModal->ob_pal_off, AR9287_AN_RF2G3_OB_PAL_OFF)); - OS_REG_WRITE(ah, AR9287_AN_RF2G3_CH0, regval); - OS_DELAY(100); /* analog write */ + /* Analog write - requires a 100usec delay */ + OS_A_REG_WRITE(ah, AR9287_AN_RF2G3_CH0, regval); regval = OS_REG_READ(ah, AR9287_AN_RF2G3_CH1); regval &= ~(AR9287_AN_RF2G3_DB1 | @@ -556,8 +557,7 @@ ar9287SetBoardValues(struct ath_hal *ah, const struct ieee80211_channel *chan) SM(pModal->ob_qam, AR9287_AN_RF2G3_OB_QAM) | SM(pModal->ob_pal_off, AR9287_AN_RF2G3_OB_PAL_OFF)); - OS_REG_WRITE(ah, AR9287_AN_RF2G3_CH1, regval); - OS_DELAY(100); /* analog write */ + OS_A_REG_WRITE(ah, AR9287_AN_RF2G3_CH1, regval); OS_REG_RMW_FIELD(ah, AR_PHY_RF_CTL2, AR_PHY_TX_FRAME_TO_DATA_START, pModal->txFrameToDataStart); diff --git a/sys/dev/ath/ath_hal/ar9003/ar9300_btcoex.h b/sys/dev/ath/ath_hal/ar9003/ar9300_btcoex.h new file mode 100644 index 00000000000..583636ec809 --- /dev/null +++ b/sys/dev/ath/ath_hal/ar9003/ar9300_btcoex.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2011 Atheros Communications, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef __ATH_AR9300_BTCOEX_H__ +#define __ATH_AR9300_BTCOEX_H__ +/* + * Weight table configurations. + */ +#define AR9300_BT_WGHT 0xcccc4444 +#define AR9300_STOMP_ALL_WLAN_WGHT0 0xfffffff0 +#define AR9300_STOMP_ALL_WLAN_WGHT1 0xfffffff0 +#define AR9300_STOMP_LOW_WLAN_WGHT0 0x88888880 +#define AR9300_STOMP_LOW_WLAN_WGHT1 0x88888880 +#define AR9300_STOMP_NONE_WLAN_WGHT0 0x00000000 +#define AR9300_STOMP_NONE_WLAN_WGHT1 0x00000000 +/* Stomp BT even when WLAN is idle */ +#define AR9300_STOMP_ALL_FORCE_WLAN_WGHT0 0xffffffff +#define AR9300_STOMP_ALL_FORCE_WLAN_WGHT1 0xffffffff +/* Stomp BT even when WLAN is idle */ +#define AR9300_STOMP_LOW_FORCE_WLAN_WGHT0 0x88888888 +#define AR9300_STOMP_LOW_FORCE_WLAN_WGHT1 0x88888888 + +#define JUPITER_STOMP_ALL_WLAN_WGHT0 0x00007d00 +#define JUPITER_STOMP_ALL_WLAN_WGHT1 0x7d7d7d00 +#define JUPITER_STOMP_ALL_WLAN_WGHT2 0x7d7d7d00 +#define JUPITER_STOMP_ALL_WLAN_WGHT3 0x7d7d7d7d +#define JUPITER_STOMP_LOW_WLAN_WGHT0 0x00007d00 +#define JUPITER_STOMP_LOW_WLAN_WGHT1 0x7d3b3b00 +#define JUPITER_STOMP_LOW_WLAN_WGHT2 0x3b3b3b00 +#define JUPITER_STOMP_LOW_WLAN_WGHT3 0x3b3b3b3b +#define JUPITER_STOMP_NONE_WLAN_WGHT0 0x00007d00 +#define JUPITER_STOMP_NONE_WLAN_WGHT1 0x7d000000 +#define JUPITER_STOMP_NONE_WLAN_WGHT2 0x00000000 +#define JUPITER_STOMP_NONE_WLAN_WGHT3 0x00000000 +#define JUPITER_STOMP_ALL_FORCE_WLAN_WGHT0 0x00007d7d +#define JUPITER_STOMP_ALL_FORCE_WLAN_WGHT1 0x7d7d7d00 +#define JUPITER_STOMP_ALL_FORCE_WLAN_WGHT2 0x7d7d7d7d +#define JUPITER_STOMP_ALL_FORCE_WLAN_WGHT3 0x7d7d7d7d +#define JUPITER_STOMP_LOW_FORCE_WLAN_WGHT0 0x00003b3b +#define JUPITER_STOMP_LOW_FORCE_WLAN_WGHT1 0x3b3b3b00 +#define JUPITER_STOMP_LOW_FORCE_WLAN_WGHT2 0x3b3b3b3b +#define JUPITER_STOMP_LOW_FORCE_WLAN_WGHT3 0x3b3b3b3b + +#endif /* __ATH_AR9300_BTCOEX_H__ */ diff --git a/sys/dev/ath/ath_rate/amrr/amrr.c b/sys/dev/ath/ath_rate/amrr/amrr.c index b10b8269159..efba5dd77f0 100644 --- a/sys/dev/ath/ath_rate/amrr/amrr.c +++ b/sys/dev/ath/ath_rate/amrr/amrr.c @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); * "IEEE 802.11 Rate Adaptation: A Practical Approach" by * Mathieu Lacage, Hossein Manshaei, Thierry Turletti */ +#include "opt_ath.h" #include "opt_inet.h" #include "opt_wlan.h" diff --git a/sys/dev/ath/ath_rate/onoe/onoe.c b/sys/dev/ath/ath_rate/onoe/onoe.c index b5e2c2dbd43..7160346a8aa 100644 --- a/sys/dev/ath/ath_rate/onoe/onoe.c +++ b/sys/dev/ath/ath_rate/onoe/onoe.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); /* * Atsushi Onoe's rate control algorithm. */ +#include "opt_ath.h" #include "opt_inet.h" #include "opt_wlan.h" diff --git a/sys/dev/ath/ath_rate/sample/sample.c b/sys/dev/ath/ath_rate/sample/sample.c index 7b96cb36503..ae77e5ef063 100644 --- a/sys/dev/ath/ath_rate/sample/sample.c +++ b/sys/dev/ath/ath_rate/sample/sample.c @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); /* * John Bicket's SampleRate control algorithm. */ +#include "opt_ath.h" #include "opt_inet.h" #include "opt_wlan.h" #include "opt_ah.h" diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index 5f322abebeb..965a1fd6c07 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -102,19 +102,20 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include #include +#include +#include +#include #include #ifdef ATH_TX99_DIAG #include #endif -#define ATH_KTR_INTR KTR_SPARE4 -#define ATH_KTR_ERR KTR_SPARE3 - /* * ATH_BCBUF determines the number of vap's that can transmit * beacons and also (currently) the number of vap's that can @@ -139,7 +140,6 @@ static void ath_vap_delete(struct ieee80211vap *); static void ath_init(void *); static void ath_stop_locked(struct ifnet *); static void ath_stop(struct ifnet *); -static void ath_start(struct ifnet *); static int ath_reset_vap(struct ieee80211vap *, u_long); static int ath_media_change(struct ifnet *); static void ath_watchdog(void *); @@ -151,23 +151,9 @@ static void ath_key_update_begin(struct ieee80211vap *); static void ath_key_update_end(struct ieee80211vap *); static void ath_update_mcast(struct ifnet *); static void ath_update_promisc(struct ifnet *); -static void ath_mode_init(struct ath_softc *); -static void ath_setslottime(struct ath_softc *); static void ath_updateslot(struct ifnet *); -static int ath_beaconq_setup(struct ath_hal *); -static int ath_beacon_alloc(struct ath_softc *, struct ieee80211_node *); -static void ath_beacon_update(struct ieee80211vap *, int item); -static void ath_beacon_setup(struct ath_softc *, struct ath_buf *); -static void ath_beacon_proc(void *, int); -static struct ath_buf *ath_beacon_generate(struct ath_softc *, - struct ieee80211vap *); static void ath_bstuck_proc(void *, int); static void ath_reset_proc(void *, int); -static void ath_beacon_return(struct ath_softc *, struct ath_buf *); -static void ath_beacon_free(struct ath_softc *); -static void ath_beacon_config(struct ath_softc *, struct ieee80211vap *); -static void ath_descdma_cleanup(struct ath_softc *sc, - struct ath_descdma *, ath_bufhead *); static int ath_desc_alloc(struct ath_softc *); static void ath_desc_free(struct ath_softc *); static struct ieee80211_node *ath_node_alloc(struct ieee80211vap *, @@ -176,16 +162,9 @@ static void ath_node_cleanup(struct ieee80211_node *); static void ath_node_free(struct ieee80211_node *); static void ath_node_getsignal(const struct ieee80211_node *, int8_t *, int8_t *); -static int ath_rxbuf_init(struct ath_softc *, struct ath_buf *); -static void ath_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m, - int subtype, int rssi, int nf); -static void ath_setdefantenna(struct ath_softc *, u_int); -static void ath_rx_proc(struct ath_softc *sc, int); -static void ath_rx_tasklet(void *, int); static void ath_txq_init(struct ath_softc *sc, struct ath_txq *, int); static struct ath_txq *ath_txq_setup(struct ath_softc*, int qtype, int subtype); static int ath_tx_setup(struct ath_softc *, int, int); -static int ath_wme_update(struct ieee80211com *); static void ath_tx_cleanupq(struct ath_softc *, struct ath_txq *); static void ath_tx_cleanup(struct ath_softc *); static void ath_tx_proc_q0(void *, int); @@ -194,8 +173,6 @@ static void ath_tx_proc(void *, int); static void ath_txq_sched_tasklet(void *, int); static int ath_chan_set(struct ath_softc *, struct ieee80211_channel *); static void ath_draintxq(struct ath_softc *, ATH_RESET_TYPE reset_type); -static void ath_stoprecv(struct ath_softc *, int); -static int ath_startrecv(struct ath_softc *); static void ath_chan_change(struct ath_softc *, struct ieee80211_channel *); static void ath_scan_start(struct ieee80211com *); static void ath_scan_end(struct ieee80211com *); @@ -222,16 +199,10 @@ static void ath_announce(struct ath_softc *); static void ath_dfs_tasklet(void *, int); #ifdef IEEE80211_SUPPORT_TDMA -static void ath_tdma_settimers(struct ath_softc *sc, u_int32_t nexttbtt, - u_int32_t bintval); -static void ath_tdma_bintvalsetup(struct ath_softc *sc, - const struct ieee80211_tdma_state *tdma); -static void ath_tdma_config(struct ath_softc *sc, struct ieee80211vap *vap); -static void ath_tdma_update(struct ieee80211_node *ni, - const struct ieee80211_tdma_param *tdma, int); -static void ath_tdma_beacon_send(struct ath_softc *sc, - struct ieee80211vap *vap); +#include +#endif +#if 0 #define TDMA_EP_MULTIPLIER (1<<10) /* pow2 to optimize out * and / */ #define TDMA_LPF_LEN 6 #define TDMA_DUMMY_MARKER 0x127 @@ -263,16 +234,20 @@ static int ath_anicalinterval = 100; /* ANI calibration - 100 msec */ SYSCTL_INT(_hw_ath, OID_AUTO, anical, CTLFLAG_RW, &ath_anicalinterval, 0, "ANI calibration (msecs)"); -static int ath_rxbuf = ATH_RXBUF; /* # rx buffers to allocate */ +int ath_rxbuf = ATH_RXBUF; /* # rx buffers to allocate */ SYSCTL_INT(_hw_ath, OID_AUTO, rxbuf, CTLFLAG_RW, &ath_rxbuf, 0, "rx buffers allocated"); TUNABLE_INT("hw.ath.rxbuf", &ath_rxbuf); -static int ath_txbuf = ATH_TXBUF; /* # tx buffers to allocate */ +int ath_txbuf = ATH_TXBUF; /* # tx buffers to allocate */ SYSCTL_INT(_hw_ath, OID_AUTO, txbuf, CTLFLAG_RW, &ath_txbuf, 0, "tx buffers allocated"); TUNABLE_INT("hw.ath.txbuf", &ath_txbuf); +int ath_txbuf_mgmt = ATH_MGMT_TXBUF; /* # mgmt tx buffers to allocate */ +SYSCTL_INT(_hw_ath, OID_AUTO, txbuf_mgmt, CTLFLAG_RW, &ath_txbuf_mgmt, + 0, "tx (mgmt) buffers allocated"); +TUNABLE_INT("hw.ath.txbuf_mgmt", &ath_txbuf_mgmt); -static int ath_bstuck_threshold = 4; /* max missed beacons */ +int ath_bstuck_threshold = 4; /* max missed beacons */ SYSCTL_INT(_hw_ath, OID_AUTO, bstuck, CTLFLAG_RW, &ath_bstuck_threshold, 0, "max missed beacon xmits before chip reset"); @@ -322,6 +297,18 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) sc->sc_debug = ath_debug; #endif + /* + * Setup the DMA/EDMA functions based on the current + * hardware support. + * + * This is required before the descriptors are allocated. + */ + if (ath_hal_hasedma(sc->sc_ah)) { + sc->sc_isedma = 1; + ath_recv_setup_edma(sc); + } else + ath_recv_setup_legacy(sc); + /* * Check if the MAC has multi-rate retry support. * We do this by trying to setup a fake extended @@ -387,6 +374,14 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) if_printf(ifp, "failed to allocate descriptors: %d\n", error); goto bad; } + + error = ath_rxdma_setup(sc); + if (error != 0) { + if_printf(ifp, "failed to allocate RX descriptors: %d\n", + error); + goto bad; + } + callout_init_mtx(&sc->sc_cal_ch, &sc->sc_mtx, 0); callout_init_mtx(&sc->sc_wd_ch, &sc->sc_mtx, 0); @@ -397,7 +392,7 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) taskqueue_start_threads(&sc->sc_tq, 1, PI_NET, "%s taskq", ifp->if_xname); - TASK_INIT(&sc->sc_rxtask, 0, ath_rx_tasklet, sc); + TASK_INIT(&sc->sc_rxtask, 0, sc->sc_rx.recv_tasklet, sc); TASK_INIT(&sc->sc_bmisstask, 0, ath_bmiss_proc, sc); TASK_INIT(&sc->sc_bstucktask,0, ath_bstuck_proc, sc); TASK_INIT(&sc->sc_resettask,0, ath_reset_proc, sc); @@ -545,7 +540,9 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) | IEEE80211_C_SHPREAMBLE /* short preamble supported */ | IEEE80211_C_SHSLOT /* short slot time supported */ | IEEE80211_C_WPA /* capable of WPA1+WPA2 */ +#ifndef ATH_ENABLE_11N | IEEE80211_C_BGSCAN /* capable of bg scanning */ +#endif | IEEE80211_C_TXFRAG /* handle tx frags */ #ifdef ATH_ENABLE_DFS | IEEE80211_C_DFS /* Enable radar detection */ @@ -681,12 +678,6 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) (void) ath_hal_settxchainmask(sc->sc_ah, tx_chainmask); } - /* - * The if_ath 11n support is completely not ready for normal use. - * Enabling this option will likely break everything and everything. - * Don't think of doing that unless you know what you're doing. - */ - #ifdef ATH_ENABLE_11N /* * Query HT capabilities @@ -747,6 +738,13 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) } #endif + /* + * Initial aggregation settings. + */ + sc->sc_hwq_limit = ATH_AGGR_MIN_QDEPTH; + sc->sc_tid_hwq_lo = ATH_AGGR_SCHED_LOW; + sc->sc_tid_hwq_hi = ATH_AGGR_SCHED_HIGH; + /* * Check if the hardware requires PCI register serialisation. * Some of the Owl based MACs require this. @@ -824,11 +822,26 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) ic->ic_update_chw = ath_update_chw; #endif /* ATH_ENABLE_11N */ +#ifdef ATH_ENABLE_RADIOTAP_VENDOR_EXT + /* + * There's one vendor bitmap entry in the RX radiotap + * header; make sure that's taken into account. + */ + ieee80211_radiotap_attachv(ic, + &sc->sc_tx_th.wt_ihdr, sizeof(sc->sc_tx_th), 0, + ATH_TX_RADIOTAP_PRESENT, + &sc->sc_rx_th.wr_ihdr, sizeof(sc->sc_rx_th), 1, + ATH_RX_RADIOTAP_PRESENT); +#else + /* + * No vendor bitmap/extensions are present. + */ ieee80211_radiotap_attach(ic, &sc->sc_tx_th.wt_ihdr, sizeof(sc->sc_tx_th), ATH_TX_RADIOTAP_PRESENT, &sc->sc_rx_th.wr_ihdr, sizeof(sc->sc_rx_th), ATH_RX_RADIOTAP_PRESENT); +#endif /* ATH_ENABLE_RADIOTAP_VENDOR_EXT */ /* * Setup dynamic sysctl's now that country code and @@ -845,6 +858,7 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) bad2: ath_tx_cleanup(sc); ath_desc_free(sc); + ath_rxdma_teardown(sc); bad: if (ah) ath_hal_detach(ah); @@ -887,6 +901,7 @@ ath_detach(struct ath_softc *sc) ath_dfs_detach(sc); ath_desc_free(sc); + ath_rxdma_teardown(sc); ath_tx_cleanup(sc); ath_hal_detach(sc->sc_ah); /* NB: sets chip in full sleep */ if_free(ifp); @@ -1334,15 +1349,22 @@ ath_suspend(struct ath_softc *sc) __func__, ifp->if_flags); sc->sc_resume_up = (ifp->if_flags & IFF_UP) != 0; - if (ic->ic_opmode == IEEE80211_M_STA) - ath_stop(ifp); - else - ieee80211_suspend_all(ic); + + ieee80211_suspend_all(ic); /* * NB: don't worry about putting the chip in low power * mode; pci will power off our socket on suspend and * CardBus detaches the device. */ + + /* + * XXX ensure none of the taskqueues are running + * XXX ensure sc_invalid is 1 + * XXX ensure the calibration callout is disabled + */ + + /* Disable the PCIe PHY, complete with workarounds */ + ath_hal_enablepcie(sc->sc_ah, 1, 1); } /* @@ -1375,6 +1397,9 @@ ath_resume(struct ath_softc *sc) DPRINTF(sc, ATH_DEBUG_ANY, "%s: if_flags %x\n", __func__, ifp->if_flags); + /* Re-enable PCIe, re-enable the PCIe bus */ + ath_hal_enablepcie(ah, 0, 0); + /* * Must reset the chip before we reload the * keycache as we were powered down on suspend. @@ -1391,23 +1416,8 @@ ath_resume(struct ath_softc *sc) ath_led_config(sc); ath_hal_setledstate(ah, HAL_LED_INIT); - if (sc->sc_resume_up) { - if (ic->ic_opmode == IEEE80211_M_STA) { - ath_init(sc); - ath_hal_setledstate(ah, HAL_LED_RUN); - /* - * Program the beacon registers using the last rx'd - * beacon frame and enable sync on the next beacon - * we see. This should handle the case where we - * wakeup and find the same AP and also the case where - * we wakeup and need to roam. For the latter we - * should get bmiss events that trigger a roam. - */ - ath_beacon_config(sc, NULL); - sc->sc_syncbeacon = 1; - } else - ieee80211_resume_all(ic); - } + if (sc->sc_resume_up) + ieee80211_resume_all(ic); /* XXX beacons ? */ } @@ -1611,7 +1621,11 @@ ath_intr(void *arg) /* bump tx trigger level */ ath_hal_updatetxtriglevel(ah, AH_TRUE); } - if (status & HAL_INT_RX) { + /* + * Handle both the legacy and RX EDMA interrupt bits. + * Note that HAL_INT_RXLP is also HAL_INT_RXDESC. + */ + if (status & (HAL_INT_RX | HAL_INT_RXHP | HAL_INT_RXLP)) { sc->sc_stats.ast_rx_intr++; taskqueue_enqueue(sc->sc_tq, &sc->sc_rxtask); } @@ -1838,13 +1852,6 @@ ath_init(void *arg) */ sc->sc_beacons = 0; - /* - * Initial aggregation settings. - */ - sc->sc_hwq_limit = ATH_AGGR_MIN_QDEPTH; - sc->sc_tid_hwq_lo = ATH_AGGR_SCHED_LOW; - sc->sc_tid_hwq_hi = ATH_AGGR_SCHED_HIGH; - /* * Setup the hardware after reset: the key cache * is filled as needed and the receive engine is @@ -1864,6 +1871,14 @@ ath_init(void *arg) sc->sc_imask = HAL_INT_RX | HAL_INT_TX | HAL_INT_RXEOL | HAL_INT_RXORN | HAL_INT_FATAL | HAL_INT_GLOBAL; + + /* + * Enable RX EDMA bits. Note these overlap with + * HAL_INT_RX and HAL_INT_RXDESC respectively. + */ + if (sc->sc_isedma) + sc->sc_imask |= (HAL_INT_RXHP | HAL_INT_RXLP); + /* * Enable MIB interrupts when there are hardware phy counters. * Note we only do this (at the moment) for station mode. @@ -2115,7 +2130,7 @@ ath_reset(struct ifnet *ifp, ATH_RESET_TYPE reset_type) * That way frames aren't dropped which shouldn't be. */ ath_stoprecv(sc, (reset_type != ATH_RESET_NOLOSS)); - ath_rx_proc(sc, 0); + ath_rx_flush(sc); ath_settkipmic(sc); /* configure TKIP MIC handling */ /* NB: indicate channel change so we do a full reset */ @@ -2225,13 +2240,17 @@ ath_reset_vap(struct ieee80211vap *vap, u_long cmd) } struct ath_buf * -_ath_getbuf_locked(struct ath_softc *sc) +_ath_getbuf_locked(struct ath_softc *sc, ath_buf_type_t btype) { struct ath_buf *bf; ATH_TXBUF_LOCK_ASSERT(sc); - bf = TAILQ_FIRST(&sc->sc_txbuf); + if (btype == ATH_BUFTYPE_MGMT) + bf = TAILQ_FIRST(&sc->sc_txbuf_mgmt); + else + bf = TAILQ_FIRST(&sc->sc_txbuf); + if (bf == NULL) { sc->sc_stats.ast_tx_getnobuf++; } else { @@ -2241,18 +2260,43 @@ _ath_getbuf_locked(struct ath_softc *sc) } } - if (bf != NULL && (bf->bf_flags & ATH_BUF_BUSY) == 0) - TAILQ_REMOVE(&sc->sc_txbuf, bf, bf_list); - else + if (bf != NULL && (bf->bf_flags & ATH_BUF_BUSY) == 0) { + if (btype == ATH_BUFTYPE_MGMT) + TAILQ_REMOVE(&sc->sc_txbuf_mgmt, bf, bf_list); + else { + TAILQ_REMOVE(&sc->sc_txbuf, bf, bf_list); + sc->sc_txbuf_cnt--; + + /* + * This shuldn't happen; however just to be + * safe print a warning and fudge the txbuf + * count. + */ + if (sc->sc_txbuf_cnt < 0) { + device_printf(sc->sc_dev, + "%s: sc_txbuf_cnt < 0?\n", + __func__); + sc->sc_txbuf_cnt = 0; + } + } + } else bf = NULL; if (bf == NULL) { + /* XXX should check which list, mgmt or otherwise */ DPRINTF(sc, ATH_DEBUG_XMIT, "%s: %s\n", __func__, TAILQ_FIRST(&sc->sc_txbuf) == NULL ? "out of xmit buffers" : "xmit buffer busy"); return NULL; } + /* XXX TODO: should do this at buffer list initialisation */ + /* XXX (then, ensure the buffer has the right flag set) */ + if (btype == ATH_BUFTYPE_MGMT) + bf->bf_flags |= ATH_BUF_MGMT; + else + bf->bf_flags &= (~ATH_BUF_MGMT); + /* Valid bf here; clear some basic fields */ bf->bf_next = NULL; /* XXX just to be sure */ bf->bf_last = NULL; /* XXX again, just to be sure */ @@ -2287,7 +2331,9 @@ ath_buf_clone(struct ath_softc *sc, const struct ath_buf *bf) { struct ath_buf *tbf; - tbf = ath_getbuf(sc); + tbf = ath_getbuf(sc, + (bf->bf_flags & ATH_BUF_MGMT) ? + ATH_BUFTYPE_MGMT : ATH_BUFTYPE_NORMAL); if (tbf == NULL) return NULL; /* XXX failure? Why? */ @@ -2315,12 +2361,18 @@ ath_buf_clone(struct ath_softc *sc, const struct ath_buf *bf) } struct ath_buf * -ath_getbuf(struct ath_softc *sc) +ath_getbuf(struct ath_softc *sc, ath_buf_type_t btype) { struct ath_buf *bf; ATH_TXBUF_LOCK(sc); - bf = _ath_getbuf_locked(sc); + bf = _ath_getbuf_locked(sc, btype); + /* + * If a mgmt buffer was requested but we're out of those, + * try requesting a normal one. + */ + if (bf == NULL && btype == ATH_BUFTYPE_MGMT) + bf = _ath_getbuf_locked(sc, ATH_BUFTYPE_NORMAL); ATH_TXBUF_UNLOCK(sc); if (bf == NULL) { struct ifnet *ifp = sc->sc_ifp; @@ -2334,7 +2386,7 @@ ath_getbuf(struct ath_softc *sc) return bf; } -static void +void ath_start(struct ifnet *ifp) { struct ath_softc *sc = ifp->if_softc; @@ -2353,6 +2405,7 @@ ath_start(struct ifnet *ifp) "%s: sc_inreset_cnt > 0; bailing\n", __func__); ATH_PCU_UNLOCK(sc); IF_LOCK(&ifp->if_snd); + sc->sc_stats.ast_tx_qstop++; ifp->if_drv_flags |= IFF_DRV_OACTIVE; IF_UNLOCK(&ifp->if_snd); return; @@ -2361,17 +2414,28 @@ ath_start(struct ifnet *ifp) ATH_PCU_UNLOCK(sc); for (;;) { + ATH_TXBUF_LOCK(sc); + if (sc->sc_txbuf_cnt <= sc->sc_txq_data_minfree) { + /* XXX increment counter? */ + ATH_TXBUF_UNLOCK(sc); + IF_LOCK(&ifp->if_snd); + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + IF_UNLOCK(&ifp->if_snd); + break; + } + ATH_TXBUF_UNLOCK(sc); + /* * Grab a TX buffer and associated resources. */ - bf = ath_getbuf(sc); + bf = ath_getbuf(sc, ATH_BUFTYPE_NORMAL); if (bf == NULL) break; IFQ_DEQUEUE(&ifp->if_snd, m); if (m == NULL) { ATH_TXBUF_LOCK(sc); - TAILQ_INSERT_HEAD(&sc->sc_txbuf, bf, bf_list); + ath_returnbuf_head(sc, bf); ATH_TXBUF_UNLOCK(sc); break; } @@ -2414,7 +2478,7 @@ ath_start(struct ifnet *ifp) bf->bf_m = NULL; bf->bf_node = NULL; ATH_TXBUF_LOCK(sc); - TAILQ_INSERT_HEAD(&sc->sc_txbuf, bf, bf_list); + ath_returnbuf_head(sc, bf); ath_txfrag_cleanup(sc, &frags, ni); ATH_TXBUF_UNLOCK(sc); if (ni != NULL) @@ -2485,102 +2549,6 @@ ath_key_update_end(struct ieee80211vap *vap) taskqueue_unblock(sc->sc_tq); } -/* - * Calculate the receive filter according to the - * operating mode and state: - * - * o always accept unicast, broadcast, and multicast traffic - * o accept PHY error frames when hardware doesn't have MIB support - * to count and we need them for ANI (sta mode only until recently) - * and we are not scanning (ANI is disabled) - * NB: older hal's add rx filter bits out of sight and we need to - * blindly preserve them - * o probe request frames are accepted only when operating in - * hostap, adhoc, mesh, or monitor modes - * o enable promiscuous mode - * - when in monitor mode - * - if interface marked PROMISC (assumes bridge setting is filtered) - * o accept beacons: - * - when operating in station mode for collecting rssi data when - * the station is otherwise quiet, or - * - when operating in adhoc mode so the 802.11 layer creates - * node table entries for peers, - * - when scanning - * - when doing s/w beacon miss (e.g. for ap+sta) - * - when operating in ap mode in 11g to detect overlapping bss that - * require protection - * - when operating in mesh mode to detect neighbors - * o accept control frames: - * - when in monitor mode - * XXX HT protection for 11n - */ -static u_int32_t -ath_calcrxfilter(struct ath_softc *sc) -{ - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; - u_int32_t rfilt; - - rfilt = HAL_RX_FILTER_UCAST | HAL_RX_FILTER_BCAST | HAL_RX_FILTER_MCAST; - if (!sc->sc_needmib && !sc->sc_scanning) - rfilt |= HAL_RX_FILTER_PHYERR; - if (ic->ic_opmode != IEEE80211_M_STA) - rfilt |= HAL_RX_FILTER_PROBEREQ; - /* XXX ic->ic_monvaps != 0? */ - if (ic->ic_opmode == IEEE80211_M_MONITOR || (ifp->if_flags & IFF_PROMISC)) - rfilt |= HAL_RX_FILTER_PROM; - if (ic->ic_opmode == IEEE80211_M_STA || - ic->ic_opmode == IEEE80211_M_IBSS || - sc->sc_swbmiss || sc->sc_scanning) - rfilt |= HAL_RX_FILTER_BEACON; - /* - * NB: We don't recalculate the rx filter when - * ic_protmode changes; otherwise we could do - * this only when ic_protmode != NONE. - */ - if (ic->ic_opmode == IEEE80211_M_HOSTAP && - IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) - rfilt |= HAL_RX_FILTER_BEACON; - - /* - * Enable hardware PS-POLL RX only for hostap mode; - * STA mode sends PS-POLL frames but never - * receives them. - */ - if (ath_hal_getcapability(sc->sc_ah, HAL_CAP_PSPOLL, - 0, NULL) == HAL_OK && - ic->ic_opmode == IEEE80211_M_HOSTAP) - rfilt |= HAL_RX_FILTER_PSPOLL; - - if (sc->sc_nmeshvaps) { - rfilt |= HAL_RX_FILTER_BEACON; - if (sc->sc_hasbmatch) - rfilt |= HAL_RX_FILTER_BSSID; - else - rfilt |= HAL_RX_FILTER_PROM; - } - if (ic->ic_opmode == IEEE80211_M_MONITOR) - rfilt |= HAL_RX_FILTER_CONTROL; - - /* - * Enable RX of compressed BAR frames only when doing - * 802.11n. Required for A-MPDU. - */ - if (IEEE80211_IS_CHAN_HT(ic->ic_curchan)) - rfilt |= HAL_RX_FILTER_COMPBAR; - - /* - * Enable radar PHY errors if requested by the - * DFS module. - */ - if (sc->sc_dodfs) - rfilt |= HAL_RX_FILTER_PHYRADAR; - - DPRINTF(sc, ATH_DEBUG_MODE, "%s: RX filter 0x%x, %s if_flags 0x%x\n", - __func__, rfilt, ieee80211_opmode_name[ic->ic_opmode], ifp->if_flags); - return rfilt; -} - static void ath_update_promisc(struct ifnet *ifp) { @@ -2630,7 +2598,7 @@ ath_update_mcast(struct ifnet *ifp) __func__, mfilt[0], mfilt[1]); } -static void +void ath_mode_init(struct ath_softc *sc) { struct ifnet *ifp = sc->sc_ifp; @@ -2644,6 +2612,13 @@ ath_mode_init(struct ath_softc *sc) /* configure operational mode */ ath_hal_setopmode(ah); + DPRINTF(sc, ATH_DEBUG_STATE | ATH_DEBUG_MODE, + "%s: ah=%p, ifp=%p, if_addr=%p\n", + __func__, + ah, + ifp, + (ifp == NULL) ? NULL : ifp->if_addr); + /* handle any link-level address change */ ath_hal_setmac(ah, IF_LLADDR(ifp)); @@ -2654,7 +2629,7 @@ ath_mode_init(struct ath_softc *sc) /* * Set the slot time based on the current setting. */ -static void +void ath_setslottime(struct ath_softc *sc) { struct ieee80211com *ic = sc->sc_ifp->if_l2com; @@ -2706,249 +2681,11 @@ ath_updateslot(struct ifnet *ifp) ath_setslottime(sc); } -/* - * Setup a h/w transmit queue for beacons. - */ -static int -ath_beaconq_setup(struct ath_hal *ah) -{ - HAL_TXQ_INFO qi; - - memset(&qi, 0, sizeof(qi)); - qi.tqi_aifs = HAL_TXQ_USEDEFAULT; - qi.tqi_cwmin = HAL_TXQ_USEDEFAULT; - qi.tqi_cwmax = HAL_TXQ_USEDEFAULT; - /* NB: for dynamic turbo, don't enable any other interrupts */ - qi.tqi_qflags = HAL_TXQ_TXDESCINT_ENABLE; - return ath_hal_setuptxqueue(ah, HAL_TX_QUEUE_BEACON, &qi); -} - -/* - * Setup the transmit queue parameters for the beacon queue. - */ -static int -ath_beaconq_config(struct ath_softc *sc) -{ -#define ATH_EXPONENT_TO_VALUE(v) ((1<<(v))-1) - struct ieee80211com *ic = sc->sc_ifp->if_l2com; - struct ath_hal *ah = sc->sc_ah; - HAL_TXQ_INFO qi; - - ath_hal_gettxqueueprops(ah, sc->sc_bhalq, &qi); - if (ic->ic_opmode == IEEE80211_M_HOSTAP || - ic->ic_opmode == IEEE80211_M_MBSS) { - /* - * Always burst out beacon and CAB traffic. - */ - qi.tqi_aifs = ATH_BEACON_AIFS_DEFAULT; - qi.tqi_cwmin = ATH_BEACON_CWMIN_DEFAULT; - qi.tqi_cwmax = ATH_BEACON_CWMAX_DEFAULT; - } else { - struct wmeParams *wmep = - &ic->ic_wme.wme_chanParams.cap_wmeParams[WME_AC_BE]; - /* - * Adhoc mode; important thing is to use 2x cwmin. - */ - qi.tqi_aifs = wmep->wmep_aifsn; - qi.tqi_cwmin = 2*ATH_EXPONENT_TO_VALUE(wmep->wmep_logcwmin); - qi.tqi_cwmax = ATH_EXPONENT_TO_VALUE(wmep->wmep_logcwmax); - } - - if (!ath_hal_settxqueueprops(ah, sc->sc_bhalq, &qi)) { - device_printf(sc->sc_dev, "unable to update parameters for " - "beacon hardware queue!\n"); - return 0; - } else { - ath_hal_resettxqueue(ah, sc->sc_bhalq); /* push to h/w */ - return 1; - } -#undef ATH_EXPONENT_TO_VALUE -} - -/* - * Allocate and setup an initial beacon frame. - */ -static int -ath_beacon_alloc(struct ath_softc *sc, struct ieee80211_node *ni) -{ - struct ieee80211vap *vap = ni->ni_vap; - struct ath_vap *avp = ATH_VAP(vap); - struct ath_buf *bf; - struct mbuf *m; - int error; - - bf = avp->av_bcbuf; - DPRINTF(sc, ATH_DEBUG_NODE, "%s: bf_m=%p, bf_node=%p\n", - __func__, bf->bf_m, bf->bf_node); - if (bf->bf_m != NULL) { - bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); - m_freem(bf->bf_m); - bf->bf_m = NULL; - } - if (bf->bf_node != NULL) { - ieee80211_free_node(bf->bf_node); - bf->bf_node = NULL; - } - - /* - * NB: the beacon data buffer must be 32-bit aligned; - * we assume the mbuf routines will return us something - * with this alignment (perhaps should assert). - */ - m = ieee80211_beacon_alloc(ni, &avp->av_boff); - if (m == NULL) { - device_printf(sc->sc_dev, "%s: cannot get mbuf\n", __func__); - sc->sc_stats.ast_be_nombuf++; - return ENOMEM; - } - error = bus_dmamap_load_mbuf_sg(sc->sc_dmat, bf->bf_dmamap, m, - bf->bf_segs, &bf->bf_nseg, - BUS_DMA_NOWAIT); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: cannot map mbuf, bus_dmamap_load_mbuf_sg returns %d\n", - __func__, error); - m_freem(m); - return error; - } - - /* - * Calculate a TSF adjustment factor required for staggered - * beacons. Note that we assume the format of the beacon - * frame leaves the tstamp field immediately following the - * header. - */ - if (sc->sc_stagbeacons && avp->av_bslot > 0) { - uint64_t tsfadjust; - struct ieee80211_frame *wh; - - /* - * The beacon interval is in TU's; the TSF is in usecs. - * We figure out how many TU's to add to align the timestamp - * then convert to TSF units and handle byte swapping before - * inserting it in the frame. The hardware will then add this - * each time a beacon frame is sent. Note that we align vap's - * 1..N and leave vap 0 untouched. This means vap 0 has a - * timestamp in one beacon interval while the others get a - * timstamp aligned to the next interval. - */ - tsfadjust = ni->ni_intval * - (ATH_BCBUF - avp->av_bslot) / ATH_BCBUF; - tsfadjust = htole64(tsfadjust << 10); /* TU -> TSF */ - - DPRINTF(sc, ATH_DEBUG_BEACON, - "%s: %s beacons bslot %d intval %u tsfadjust %llu\n", - __func__, sc->sc_stagbeacons ? "stagger" : "burst", - avp->av_bslot, ni->ni_intval, - (long long unsigned) le64toh(tsfadjust)); - - wh = mtod(m, struct ieee80211_frame *); - memcpy(&wh[1], &tsfadjust, sizeof(tsfadjust)); - } - bf->bf_m = m; - bf->bf_node = ieee80211_ref_node(ni); - - return 0; -} - -/* - * Setup the beacon frame for transmit. - */ -static void -ath_beacon_setup(struct ath_softc *sc, struct ath_buf *bf) -{ -#define USE_SHPREAMBLE(_ic) \ - (((_ic)->ic_flags & (IEEE80211_F_SHPREAMBLE | IEEE80211_F_USEBARKER))\ - == IEEE80211_F_SHPREAMBLE) - struct ieee80211_node *ni = bf->bf_node; - struct ieee80211com *ic = ni->ni_ic; - struct mbuf *m = bf->bf_m; - struct ath_hal *ah = sc->sc_ah; - struct ath_desc *ds; - int flags, antenna; - const HAL_RATE_TABLE *rt; - u_int8_t rix, rate; - - DPRINTF(sc, ATH_DEBUG_BEACON_PROC, "%s: m %p len %u\n", - __func__, m, m->m_len); - - /* setup descriptors */ - ds = bf->bf_desc; - bf->bf_last = bf; - bf->bf_lastds = ds; - - flags = HAL_TXDESC_NOACK; - if (ic->ic_opmode == IEEE80211_M_IBSS && sc->sc_hasveol) { - ds->ds_link = bf->bf_daddr; /* self-linked */ - flags |= HAL_TXDESC_VEOL; - /* - * Let hardware handle antenna switching. - */ - antenna = sc->sc_txantenna; - } else { - ds->ds_link = 0; - /* - * Switch antenna every 4 beacons. - * XXX assumes two antenna - */ - if (sc->sc_txantenna != 0) - antenna = sc->sc_txantenna; - else if (sc->sc_stagbeacons && sc->sc_nbcnvaps != 0) - antenna = ((sc->sc_stats.ast_be_xmit / sc->sc_nbcnvaps) & 4 ? 2 : 1); - else - antenna = (sc->sc_stats.ast_be_xmit & 4 ? 2 : 1); - } - - KASSERT(bf->bf_nseg == 1, - ("multi-segment beacon frame; nseg %u", bf->bf_nseg)); - ds->ds_data = bf->bf_segs[0].ds_addr; - /* - * Calculate rate code. - * XXX everything at min xmit rate - */ - rix = 0; - rt = sc->sc_currates; - rate = rt->info[rix].rateCode; - if (USE_SHPREAMBLE(ic)) - rate |= rt->info[rix].shortPreamble; - ath_hal_setuptxdesc(ah, ds - , m->m_len + IEEE80211_CRC_LEN /* frame length */ - , sizeof(struct ieee80211_frame)/* header length */ - , HAL_PKT_TYPE_BEACON /* Atheros packet type */ - , ni->ni_txpower /* txpower XXX */ - , rate, 1 /* series 0 rate/tries */ - , HAL_TXKEYIX_INVALID /* no encryption */ - , antenna /* antenna mode */ - , flags /* no ack, veol for beacons */ - , 0 /* rts/cts rate */ - , 0 /* rts/cts duration */ - ); - /* NB: beacon's BufLen must be a multiple of 4 bytes */ - ath_hal_filltxdesc(ah, ds - , roundup(m->m_len, 4) /* buffer length */ - , AH_TRUE /* first segment */ - , AH_TRUE /* last segment */ - , ds /* first descriptor */ - ); -#if 0 - ath_desc_swap(ds); -#endif -#undef USE_SHPREAMBLE -} - -static void -ath_beacon_update(struct ieee80211vap *vap, int item) -{ - struct ieee80211_beacon_offsets *bo = &ATH_VAP(vap)->av_boff; - - setbit(bo->bo_flags, item); -} - /* * Append the contents of src to dst; both queues * are assumed to be locked. */ -static void +void ath_txqmove(struct ath_txq *dst, struct ath_txq *src) { @@ -2964,255 +2701,6 @@ ath_txqmove(struct ath_txq *dst, struct ath_txq *src) src->axq_aggr_depth = 0; } -/* - * Transmit a beacon frame at SWBA. Dynamic updates to the - * frame contents are done as needed and the slot time is - * also adjusted based on current state. - */ -static void -ath_beacon_proc(void *arg, int pending) -{ - struct ath_softc *sc = arg; - struct ath_hal *ah = sc->sc_ah; - struct ieee80211vap *vap; - struct ath_buf *bf; - int slot, otherant; - uint32_t bfaddr; - - DPRINTF(sc, ATH_DEBUG_BEACON_PROC, "%s: pending %u\n", - __func__, pending); - /* - * Check if the previous beacon has gone out. If - * not don't try to post another, skip this period - * and wait for the next. Missed beacons indicate - * a problem and should not occur. If we miss too - * many consecutive beacons reset the device. - */ - if (ath_hal_numtxpending(ah, sc->sc_bhalq) != 0) { - sc->sc_bmisscount++; - sc->sc_stats.ast_be_missed++; - DPRINTF(sc, ATH_DEBUG_BEACON, - "%s: missed %u consecutive beacons\n", - __func__, sc->sc_bmisscount); - if (sc->sc_bmisscount >= ath_bstuck_threshold) - taskqueue_enqueue(sc->sc_tq, &sc->sc_bstucktask); - return; - } - if (sc->sc_bmisscount != 0) { - DPRINTF(sc, ATH_DEBUG_BEACON, - "%s: resume beacon xmit after %u misses\n", - __func__, sc->sc_bmisscount); - sc->sc_bmisscount = 0; - } - - if (sc->sc_stagbeacons) { /* staggered beacons */ - struct ieee80211com *ic = sc->sc_ifp->if_l2com; - uint32_t tsftu; - - tsftu = ath_hal_gettsf32(ah) >> 10; - /* XXX lintval */ - slot = ((tsftu % ic->ic_lintval) * ATH_BCBUF) / ic->ic_lintval; - vap = sc->sc_bslot[(slot+1) % ATH_BCBUF]; - bfaddr = 0; - if (vap != NULL && vap->iv_state >= IEEE80211_S_RUN) { - bf = ath_beacon_generate(sc, vap); - if (bf != NULL) - bfaddr = bf->bf_daddr; - } - } else { /* burst'd beacons */ - uint32_t *bflink = &bfaddr; - - for (slot = 0; slot < ATH_BCBUF; slot++) { - vap = sc->sc_bslot[slot]; - if (vap != NULL && vap->iv_state >= IEEE80211_S_RUN) { - bf = ath_beacon_generate(sc, vap); - if (bf != NULL) { - *bflink = bf->bf_daddr; - bflink = &bf->bf_desc->ds_link; - } - } - } - *bflink = 0; /* terminate list */ - } - - /* - * Handle slot time change when a non-ERP station joins/leaves - * an 11g network. The 802.11 layer notifies us via callback, - * we mark updateslot, then wait one beacon before effecting - * the change. This gives associated stations at least one - * beacon interval to note the state change. - */ - /* XXX locking */ - if (sc->sc_updateslot == UPDATE) { - sc->sc_updateslot = COMMIT; /* commit next beacon */ - sc->sc_slotupdate = slot; - } else if (sc->sc_updateslot == COMMIT && sc->sc_slotupdate == slot) - ath_setslottime(sc); /* commit change to h/w */ - - /* - * Check recent per-antenna transmit statistics and flip - * the default antenna if noticeably more frames went out - * on the non-default antenna. - * XXX assumes 2 anntenae - */ - if (!sc->sc_diversity && (!sc->sc_stagbeacons || slot == 0)) { - otherant = sc->sc_defant & 1 ? 2 : 1; - if (sc->sc_ant_tx[otherant] > sc->sc_ant_tx[sc->sc_defant] + 2) - ath_setdefantenna(sc, otherant); - sc->sc_ant_tx[1] = sc->sc_ant_tx[2] = 0; - } - - if (bfaddr != 0) { - /* - * Stop any current dma and put the new frame on the queue. - * This should never fail since we check above that no frames - * are still pending on the queue. - */ - if (!ath_hal_stoptxdma(ah, sc->sc_bhalq)) { - DPRINTF(sc, ATH_DEBUG_ANY, - "%s: beacon queue %u did not stop?\n", - __func__, sc->sc_bhalq); - } - /* NB: cabq traffic should already be queued and primed */ - ath_hal_puttxbuf(ah, sc->sc_bhalq, bfaddr); - ath_hal_txstart(ah, sc->sc_bhalq); - - sc->sc_stats.ast_be_xmit++; - } -} - -static struct ath_buf * -ath_beacon_generate(struct ath_softc *sc, struct ieee80211vap *vap) -{ - struct ath_vap *avp = ATH_VAP(vap); - struct ath_txq *cabq = sc->sc_cabq; - struct ath_buf *bf; - struct mbuf *m; - int nmcastq, error; - - KASSERT(vap->iv_state >= IEEE80211_S_RUN, - ("not running, state %d", vap->iv_state)); - KASSERT(avp->av_bcbuf != NULL, ("no beacon buffer")); - - /* - * Update dynamic beacon contents. If this returns - * non-zero then we need to remap the memory because - * the beacon frame changed size (probably because - * of the TIM bitmap). - */ - bf = avp->av_bcbuf; - m = bf->bf_m; - /* XXX lock mcastq? */ - nmcastq = avp->av_mcastq.axq_depth; - - if (ieee80211_beacon_update(bf->bf_node, &avp->av_boff, m, nmcastq)) { - /* XXX too conservative? */ - bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); - error = bus_dmamap_load_mbuf_sg(sc->sc_dmat, bf->bf_dmamap, m, - bf->bf_segs, &bf->bf_nseg, - BUS_DMA_NOWAIT); - if (error != 0) { - if_printf(vap->iv_ifp, - "%s: bus_dmamap_load_mbuf_sg failed, error %u\n", - __func__, error); - return NULL; - } - } - if ((avp->av_boff.bo_tim[4] & 1) && cabq->axq_depth) { - DPRINTF(sc, ATH_DEBUG_BEACON, - "%s: cabq did not drain, mcastq %u cabq %u\n", - __func__, nmcastq, cabq->axq_depth); - sc->sc_stats.ast_cabq_busy++; - if (sc->sc_nvaps > 1 && sc->sc_stagbeacons) { - /* - * CABQ traffic from a previous vap is still pending. - * We must drain the q before this beacon frame goes - * out as otherwise this vap's stations will get cab - * frames from a different vap. - * XXX could be slow causing us to miss DBA - */ - ath_tx_draintxq(sc, cabq); - } - } - ath_beacon_setup(sc, bf); - bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMASYNC_PREWRITE); - - /* - * Enable the CAB queue before the beacon queue to - * insure cab frames are triggered by this beacon. - */ - if (avp->av_boff.bo_tim[4] & 1) { - struct ath_hal *ah = sc->sc_ah; - - /* NB: only at DTIM */ - ATH_TXQ_LOCK(cabq); - ATH_TXQ_LOCK(&avp->av_mcastq); - if (nmcastq) { - struct ath_buf *bfm; - - /* - * Move frames from the s/w mcast q to the h/w cab q. - * XXX MORE_DATA bit - */ - bfm = TAILQ_FIRST(&avp->av_mcastq.axq_q); - if (cabq->axq_link != NULL) { - *cabq->axq_link = bfm->bf_daddr; - } else - ath_hal_puttxbuf(ah, cabq->axq_qnum, - bfm->bf_daddr); - ath_txqmove(cabq, &avp->av_mcastq); - - sc->sc_stats.ast_cabq_xmit += nmcastq; - } - /* NB: gated by beacon so safe to start here */ - if (! TAILQ_EMPTY(&(cabq->axq_q))) - ath_hal_txstart(ah, cabq->axq_qnum); - ATH_TXQ_UNLOCK(&avp->av_mcastq); - ATH_TXQ_UNLOCK(cabq); - } - return bf; -} - -static void -ath_beacon_start_adhoc(struct ath_softc *sc, struct ieee80211vap *vap) -{ - struct ath_vap *avp = ATH_VAP(vap); - struct ath_hal *ah = sc->sc_ah; - struct ath_buf *bf; - struct mbuf *m; - int error; - - KASSERT(avp->av_bcbuf != NULL, ("no beacon buffer")); - - /* - * Update dynamic beacon contents. If this returns - * non-zero then we need to remap the memory because - * the beacon frame changed size (probably because - * of the TIM bitmap). - */ - bf = avp->av_bcbuf; - m = bf->bf_m; - if (ieee80211_beacon_update(bf->bf_node, &avp->av_boff, m, 0)) { - /* XXX too conservative? */ - bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); - error = bus_dmamap_load_mbuf_sg(sc->sc_dmat, bf->bf_dmamap, m, - bf->bf_segs, &bf->bf_nseg, - BUS_DMA_NOWAIT); - if (error != 0) { - if_printf(vap->iv_ifp, - "%s: bus_dmamap_load_mbuf_sg failed, error %u\n", - __func__, error); - return; - } - } - ath_beacon_setup(sc, bf); - bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMASYNC_PREWRITE); - - /* NB: caller is known to have already stopped tx dma */ - ath_hal_puttxbuf(ah, sc->sc_bhalq, bf->bf_daddr); - ath_hal_txstart(ah, sc->sc_bhalq); -} - /* * Reset the hardware, with no loss. * @@ -3253,255 +2741,6 @@ ath_bstuck_proc(void *arg, int pending) ath_reset(ifp, ATH_RESET_NOLOSS); } -/* - * Reclaim beacon resources and return buffer to the pool. - */ -static void -ath_beacon_return(struct ath_softc *sc, struct ath_buf *bf) -{ - - DPRINTF(sc, ATH_DEBUG_NODE, "%s: free bf=%p, bf_m=%p, bf_node=%p\n", - __func__, bf, bf->bf_m, bf->bf_node); - if (bf->bf_m != NULL) { - bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); - m_freem(bf->bf_m); - bf->bf_m = NULL; - } - if (bf->bf_node != NULL) { - ieee80211_free_node(bf->bf_node); - bf->bf_node = NULL; - } - TAILQ_INSERT_TAIL(&sc->sc_bbuf, bf, bf_list); -} - -/* - * Reclaim beacon resources. - */ -static void -ath_beacon_free(struct ath_softc *sc) -{ - struct ath_buf *bf; - - TAILQ_FOREACH(bf, &sc->sc_bbuf, bf_list) { - DPRINTF(sc, ATH_DEBUG_NODE, - "%s: free bf=%p, bf_m=%p, bf_node=%p\n", - __func__, bf, bf->bf_m, bf->bf_node); - if (bf->bf_m != NULL) { - bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); - m_freem(bf->bf_m); - bf->bf_m = NULL; - } - if (bf->bf_node != NULL) { - ieee80211_free_node(bf->bf_node); - bf->bf_node = NULL; - } - } -} - -/* - * Configure the beacon and sleep timers. - * - * When operating as an AP this resets the TSF and sets - * up the hardware to notify us when we need to issue beacons. - * - * When operating in station mode this sets up the beacon - * timers according to the timestamp of the last received - * beacon and the current TSF, configures PCF and DTIM - * handling, programs the sleep registers so the hardware - * will wakeup in time to receive beacons, and configures - * the beacon miss handling so we'll receive a BMISS - * interrupt when we stop seeing beacons from the AP - * we've associated with. - */ -static void -ath_beacon_config(struct ath_softc *sc, struct ieee80211vap *vap) -{ -#define TSF_TO_TU(_h,_l) \ - ((((u_int32_t)(_h)) << 22) | (((u_int32_t)(_l)) >> 10)) -#define FUDGE 2 - struct ath_hal *ah = sc->sc_ah; - struct ieee80211com *ic = sc->sc_ifp->if_l2com; - struct ieee80211_node *ni; - u_int32_t nexttbtt, intval, tsftu; - u_int64_t tsf; - - if (vap == NULL) - vap = TAILQ_FIRST(&ic->ic_vaps); /* XXX */ - ni = ieee80211_ref_node(vap->iv_bss); - - /* extract tstamp from last beacon and convert to TU */ - nexttbtt = TSF_TO_TU(LE_READ_4(ni->ni_tstamp.data + 4), - LE_READ_4(ni->ni_tstamp.data)); - if (ic->ic_opmode == IEEE80211_M_HOSTAP || - ic->ic_opmode == IEEE80211_M_MBSS) { - /* - * For multi-bss ap/mesh support beacons are either staggered - * evenly over N slots or burst together. For the former - * arrange for the SWBA to be delivered for each slot. - * Slots that are not occupied will generate nothing. - */ - /* NB: the beacon interval is kept internally in TU's */ - intval = ni->ni_intval & HAL_BEACON_PERIOD; - if (sc->sc_stagbeacons) - intval /= ATH_BCBUF; - } else { - /* NB: the beacon interval is kept internally in TU's */ - intval = ni->ni_intval & HAL_BEACON_PERIOD; - } - if (nexttbtt == 0) /* e.g. for ap mode */ - nexttbtt = intval; - else if (intval) /* NB: can be 0 for monitor mode */ - nexttbtt = roundup(nexttbtt, intval); - DPRINTF(sc, ATH_DEBUG_BEACON, "%s: nexttbtt %u intval %u (%u)\n", - __func__, nexttbtt, intval, ni->ni_intval); - if (ic->ic_opmode == IEEE80211_M_STA && !sc->sc_swbmiss) { - HAL_BEACON_STATE bs; - int dtimperiod, dtimcount; - int cfpperiod, cfpcount; - - /* - * Setup dtim and cfp parameters according to - * last beacon we received (which may be none). - */ - dtimperiod = ni->ni_dtim_period; - if (dtimperiod <= 0) /* NB: 0 if not known */ - dtimperiod = 1; - dtimcount = ni->ni_dtim_count; - if (dtimcount >= dtimperiod) /* NB: sanity check */ - dtimcount = 0; /* XXX? */ - cfpperiod = 1; /* NB: no PCF support yet */ - cfpcount = 0; - /* - * Pull nexttbtt forward to reflect the current - * TSF and calculate dtim+cfp state for the result. - */ - tsf = ath_hal_gettsf64(ah); - tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE; - do { - nexttbtt += intval; - if (--dtimcount < 0) { - dtimcount = dtimperiod - 1; - if (--cfpcount < 0) - cfpcount = cfpperiod - 1; - } - } while (nexttbtt < tsftu); - memset(&bs, 0, sizeof(bs)); - bs.bs_intval = intval; - bs.bs_nexttbtt = nexttbtt; - bs.bs_dtimperiod = dtimperiod*intval; - bs.bs_nextdtim = bs.bs_nexttbtt + dtimcount*intval; - bs.bs_cfpperiod = cfpperiod*bs.bs_dtimperiod; - bs.bs_cfpnext = bs.bs_nextdtim + cfpcount*bs.bs_dtimperiod; - bs.bs_cfpmaxduration = 0; -#if 0 - /* - * The 802.11 layer records the offset to the DTIM - * bitmap while receiving beacons; use it here to - * enable h/w detection of our AID being marked in - * the bitmap vector (to indicate frames for us are - * pending at the AP). - * XXX do DTIM handling in s/w to WAR old h/w bugs - * XXX enable based on h/w rev for newer chips - */ - bs.bs_timoffset = ni->ni_timoff; -#endif - /* - * Calculate the number of consecutive beacons to miss - * before taking a BMISS interrupt. - * Note that we clamp the result to at most 10 beacons. - */ - bs.bs_bmissthreshold = vap->iv_bmissthreshold; - if (bs.bs_bmissthreshold > 10) - bs.bs_bmissthreshold = 10; - else if (bs.bs_bmissthreshold <= 0) - bs.bs_bmissthreshold = 1; - - /* - * Calculate sleep duration. The configuration is - * given in ms. We insure a multiple of the beacon - * period is used. Also, if the sleep duration is - * greater than the DTIM period then it makes senses - * to make it a multiple of that. - * - * XXX fixed at 100ms - */ - bs.bs_sleepduration = - roundup(IEEE80211_MS_TO_TU(100), bs.bs_intval); - if (bs.bs_sleepduration > bs.bs_dtimperiod) - bs.bs_sleepduration = roundup(bs.bs_sleepduration, bs.bs_dtimperiod); - - DPRINTF(sc, ATH_DEBUG_BEACON, - "%s: tsf %ju tsf:tu %u intval %u nexttbtt %u dtim %u nextdtim %u bmiss %u sleep %u cfp:period %u maxdur %u next %u timoffset %u\n" - , __func__ - , tsf, tsftu - , bs.bs_intval - , bs.bs_nexttbtt - , bs.bs_dtimperiod - , bs.bs_nextdtim - , bs.bs_bmissthreshold - , bs.bs_sleepduration - , bs.bs_cfpperiod - , bs.bs_cfpmaxduration - , bs.bs_cfpnext - , bs.bs_timoffset - ); - ath_hal_intrset(ah, 0); - ath_hal_beacontimers(ah, &bs); - sc->sc_imask |= HAL_INT_BMISS; - ath_hal_intrset(ah, sc->sc_imask); - } else { - ath_hal_intrset(ah, 0); - if (nexttbtt == intval) - intval |= HAL_BEACON_RESET_TSF; - if (ic->ic_opmode == IEEE80211_M_IBSS) { - /* - * In IBSS mode enable the beacon timers but only - * enable SWBA interrupts if we need to manually - * prepare beacon frames. Otherwise we use a - * self-linked tx descriptor and let the hardware - * deal with things. - */ - intval |= HAL_BEACON_ENA; - if (!sc->sc_hasveol) - sc->sc_imask |= HAL_INT_SWBA; - if ((intval & HAL_BEACON_RESET_TSF) == 0) { - /* - * Pull nexttbtt forward to reflect - * the current TSF. - */ - tsf = ath_hal_gettsf64(ah); - tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE; - do { - nexttbtt += intval; - } while (nexttbtt < tsftu); - } - ath_beaconq_config(sc); - } else if (ic->ic_opmode == IEEE80211_M_HOSTAP || - ic->ic_opmode == IEEE80211_M_MBSS) { - /* - * In AP/mesh mode we enable the beacon timers - * and SWBA interrupts to prepare beacon frames. - */ - intval |= HAL_BEACON_ENA; - sc->sc_imask |= HAL_INT_SWBA; /* beacon prepare */ - ath_beaconq_config(sc); - } - ath_hal_beaconinit(ah, nexttbtt, intval); - sc->sc_bmisscount = 0; - ath_hal_intrset(ah, sc->sc_imask); - /* - * When using a self-linked beacon descriptor in - * ibss mode load it once here. - */ - if (ic->ic_opmode == IEEE80211_M_IBSS && sc->sc_hasveol) - ath_beacon_start_adhoc(sc, vap); - } - sc->sc_syncbeacon = 0; - ieee80211_free_node(ni); -#undef FUDGE -#undef TSF_TO_TU -} - static void ath_load_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error) { @@ -3510,7 +2749,7 @@ ath_load_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error) *paddr = segs->ds_addr; } -static int +int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, ath_bufhead *head, const char *name, int nbuf, int ndesc) @@ -3649,7 +2888,7 @@ fail0: #undef ATH_DESC_4KB_BOUND_CHECK } -static void +void ath_descdma_cleanup(struct ath_softc *sc, struct ath_descdma *dd, ath_bufhead *head) { @@ -3690,23 +2929,31 @@ ath_desc_alloc(struct ath_softc *sc) { int error; - error = ath_descdma_setup(sc, &sc->sc_rxdma, &sc->sc_rxbuf, - "rx", ath_rxbuf, 1); - if (error != 0) - return error; - error = ath_descdma_setup(sc, &sc->sc_txdma, &sc->sc_txbuf, "tx", ath_txbuf, ATH_TXDESC); if (error != 0) { - ath_descdma_cleanup(sc, &sc->sc_rxdma, &sc->sc_rxbuf); return error; } + sc->sc_txbuf_cnt = ath_txbuf; + + error = ath_descdma_setup(sc, &sc->sc_txdma_mgmt, &sc->sc_txbuf_mgmt, + "tx_mgmt", ath_txbuf_mgmt, ATH_TXDESC); + if (error != 0) { + ath_descdma_cleanup(sc, &sc->sc_txdma, &sc->sc_txbuf); + return error; + } + + /* + * XXX mark txbuf_mgmt frames with ATH_BUF_MGMT, so the + * flag doesn't have to be set in ath_getbuf_locked(). + */ error = ath_descdma_setup(sc, &sc->sc_bdma, &sc->sc_bbuf, "beacon", ATH_BCBUF, 1); if (error != 0) { ath_descdma_cleanup(sc, &sc->sc_txdma, &sc->sc_txbuf); - ath_descdma_cleanup(sc, &sc->sc_rxdma, &sc->sc_rxbuf); + ath_descdma_cleanup(sc, &sc->sc_txdma_mgmt, + &sc->sc_txbuf_mgmt); return error; } return 0; @@ -3720,8 +2967,9 @@ ath_desc_free(struct ath_softc *sc) ath_descdma_cleanup(sc, &sc->sc_bdma, &sc->sc_bbuf); if (sc->sc_txdma.dd_desc_len != 0) ath_descdma_cleanup(sc, &sc->sc_txdma, &sc->sc_txbuf); - if (sc->sc_rxdma.dd_desc_len != 0) - ath_descdma_cleanup(sc, &sc->sc_rxdma, &sc->sc_rxbuf); + if (sc->sc_txdma_mgmt.dd_desc_len != 0) + ath_descdma_cleanup(sc, &sc->sc_txdma_mgmt, + &sc->sc_txbuf_mgmt); } static struct ieee80211_node * @@ -3788,197 +3036,10 @@ ath_node_getsignal(const struct ieee80211_node *ni, int8_t *rssi, int8_t *noise) *noise = -95; /* nominally correct */ } -static int -ath_rxbuf_init(struct ath_softc *sc, struct ath_buf *bf) -{ - struct ath_hal *ah = sc->sc_ah; - int error; - struct mbuf *m; - struct ath_desc *ds; - - m = bf->bf_m; - if (m == NULL) { - /* - * NB: by assigning a page to the rx dma buffer we - * implicitly satisfy the Atheros requirement that - * this buffer be cache-line-aligned and sized to be - * multiple of the cache line size. Not doing this - * causes weird stuff to happen (for the 5210 at least). - */ - m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); - if (m == NULL) { - DPRINTF(sc, ATH_DEBUG_ANY, - "%s: no mbuf/cluster\n", __func__); - sc->sc_stats.ast_rx_nombuf++; - return ENOMEM; - } - m->m_pkthdr.len = m->m_len = m->m_ext.ext_size; - - error = bus_dmamap_load_mbuf_sg(sc->sc_dmat, - bf->bf_dmamap, m, - bf->bf_segs, &bf->bf_nseg, - BUS_DMA_NOWAIT); - if (error != 0) { - DPRINTF(sc, ATH_DEBUG_ANY, - "%s: bus_dmamap_load_mbuf_sg failed; error %d\n", - __func__, error); - sc->sc_stats.ast_rx_busdma++; - m_freem(m); - return error; - } - KASSERT(bf->bf_nseg == 1, - ("multi-segment packet; nseg %u", bf->bf_nseg)); - bf->bf_m = m; - } - bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMASYNC_PREREAD); - - /* - * Setup descriptors. For receive we always terminate - * the descriptor list with a self-linked entry so we'll - * not get overrun under high load (as can happen with a - * 5212 when ANI processing enables PHY error frames). - * - * To insure the last descriptor is self-linked we create - * each descriptor as self-linked and add it to the end. As - * each additional descriptor is added the previous self-linked - * entry is ``fixed'' naturally. This should be safe even - * if DMA is happening. When processing RX interrupts we - * never remove/process the last, self-linked, entry on the - * descriptor list. This insures the hardware always has - * someplace to write a new frame. - */ - /* - * 11N: we can no longer afford to self link the last descriptor. - * MAC acknowledges BA status as long as it copies frames to host - * buffer (or rx fifo). This can incorrectly acknowledge packets - * to a sender if last desc is self-linked. - */ - ds = bf->bf_desc; - if (sc->sc_rxslink) - ds->ds_link = bf->bf_daddr; /* link to self */ - else - ds->ds_link = 0; /* terminate the list */ - ds->ds_data = bf->bf_segs[0].ds_addr; - ath_hal_setuprxdesc(ah, ds - , m->m_len /* buffer size */ - , 0 - ); - - if (sc->sc_rxlink != NULL) - *sc->sc_rxlink = bf->bf_daddr; - sc->sc_rxlink = &ds->ds_link; - return 0; -} - -/* - * Extend 15-bit time stamp from rx descriptor to - * a full 64-bit TSF using the specified TSF. - */ -static __inline u_int64_t -ath_extend_tsf15(u_int32_t rstamp, u_int64_t tsf) -{ - if ((tsf & 0x7fff) < rstamp) - tsf -= 0x8000; - - return ((tsf &~ 0x7fff) | rstamp); -} - -/* - * Extend 32-bit time stamp from rx descriptor to - * a full 64-bit TSF using the specified TSF. - */ -static __inline u_int64_t -ath_extend_tsf32(u_int32_t rstamp, u_int64_t tsf) -{ - u_int32_t tsf_low = tsf & 0xffffffff; - u_int64_t tsf64 = (tsf & ~0xffffffffULL) | rstamp; - - if (rstamp > tsf_low && (rstamp - tsf_low > 0x10000000)) - tsf64 -= 0x100000000ULL; - - if (rstamp < tsf_low && (tsf_low - rstamp > 0x10000000)) - tsf64 += 0x100000000ULL; - - return tsf64; -} - -/* - * Extend the TSF from the RX descriptor to a full 64 bit TSF. - * Earlier hardware versions only wrote the low 15 bits of the - * TSF into the RX descriptor; later versions (AR5416 and up) - * include the 32 bit TSF value. - */ -static __inline u_int64_t -ath_extend_tsf(struct ath_softc *sc, u_int32_t rstamp, u_int64_t tsf) -{ - if (sc->sc_rxtsf32) - return ath_extend_tsf32(rstamp, tsf); - else - return ath_extend_tsf15(rstamp, tsf); -} - -/* - * Intercept management frames to collect beacon rssi data - * and to do ibss merges. - */ -static void -ath_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m, - int subtype, int rssi, int nf) -{ - struct ieee80211vap *vap = ni->ni_vap; - struct ath_softc *sc = vap->iv_ic->ic_ifp->if_softc; - - /* - * Call up first so subsequent work can use information - * potentially stored in the node (e.g. for ibss merge). - */ - ATH_VAP(vap)->av_recv_mgmt(ni, m, subtype, rssi, nf); - switch (subtype) { - case IEEE80211_FC0_SUBTYPE_BEACON: - /* update rssi statistics for use by the hal */ - /* XXX unlocked check against vap->iv_bss? */ - ATH_RSSI_LPF(sc->sc_halstats.ns_avgbrssi, rssi); - if (sc->sc_syncbeacon && - ni == vap->iv_bss && vap->iv_state == IEEE80211_S_RUN) { - /* - * Resync beacon timers using the tsf of the beacon - * frame we just received. - */ - ath_beacon_config(sc, vap); - } - /* fall thru... */ - case IEEE80211_FC0_SUBTYPE_PROBE_RESP: - if (vap->iv_opmode == IEEE80211_M_IBSS && - vap->iv_state == IEEE80211_S_RUN) { - uint32_t rstamp = sc->sc_lastrs->rs_tstamp; - uint64_t tsf = ath_extend_tsf(sc, rstamp, - ath_hal_gettsf64(sc->sc_ah)); - /* - * Handle ibss merge as needed; check the tsf on the - * frame before attempting the merge. The 802.11 spec - * says the station should change it's bssid to match - * the oldest station with the same ssid, where oldest - * is determined by the tsf. Note that hardware - * reconfiguration happens through callback to - * ath_newstate as the state machine will go from - * RUN -> RUN when this happens. - */ - if (le64toh(ni->ni_tstamp.tsf) >= tsf) { - DPRINTF(sc, ATH_DEBUG_STATE, - "ibss merge, rstamp %u tsf %ju " - "tstamp %ju\n", rstamp, (uintmax_t)tsf, - (uintmax_t)ni->ni_tstamp.tsf); - (void) ieee80211_ibss_merge(ni); - } - } - break; - } -} - /* * Set the default antenna. */ -static void +void ath_setdefantenna(struct ath_softc *sc, u_int antenna) { struct ath_hal *ah = sc->sc_ah; @@ -3991,538 +3052,6 @@ ath_setdefantenna(struct ath_softc *sc, u_int antenna) sc->sc_rxotherant = 0; } -static void -ath_rx_tap(struct ifnet *ifp, struct mbuf *m, - const struct ath_rx_status *rs, u_int64_t tsf, int16_t nf) -{ -#define CHAN_HT20 htole32(IEEE80211_CHAN_HT20) -#define CHAN_HT40U htole32(IEEE80211_CHAN_HT40U) -#define CHAN_HT40D htole32(IEEE80211_CHAN_HT40D) -#define CHAN_HT (CHAN_HT20|CHAN_HT40U|CHAN_HT40D) - struct ath_softc *sc = ifp->if_softc; - const HAL_RATE_TABLE *rt; - uint8_t rix; - - rt = sc->sc_currates; - KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode)); - rix = rt->rateCodeToIndex[rs->rs_rate]; - sc->sc_rx_th.wr_rate = sc->sc_hwmap[rix].ieeerate; - sc->sc_rx_th.wr_flags = sc->sc_hwmap[rix].rxflags; -#ifdef AH_SUPPORT_AR5416 - sc->sc_rx_th.wr_chan_flags &= ~CHAN_HT; - if (sc->sc_rx_th.wr_rate & IEEE80211_RATE_MCS) { /* HT rate */ - struct ieee80211com *ic = ifp->if_l2com; - - if ((rs->rs_flags & HAL_RX_2040) == 0) - sc->sc_rx_th.wr_chan_flags |= CHAN_HT20; - else if (IEEE80211_IS_CHAN_HT40U(ic->ic_curchan)) - sc->sc_rx_th.wr_chan_flags |= CHAN_HT40U; - else - sc->sc_rx_th.wr_chan_flags |= CHAN_HT40D; - if ((rs->rs_flags & HAL_RX_GI) == 0) - sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_SHORTGI; - } -#endif - sc->sc_rx_th.wr_tsf = htole64(ath_extend_tsf(sc, rs->rs_tstamp, tsf)); - if (rs->rs_status & HAL_RXERR_CRC) - sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_BADFCS; - /* XXX propagate other error flags from descriptor */ - sc->sc_rx_th.wr_antnoise = nf; - sc->sc_rx_th.wr_antsignal = nf + rs->rs_rssi; - sc->sc_rx_th.wr_antenna = rs->rs_antenna; -#undef CHAN_HT -#undef CHAN_HT20 -#undef CHAN_HT40U -#undef CHAN_HT40D -} - -static void -ath_handle_micerror(struct ieee80211com *ic, - struct ieee80211_frame *wh, int keyix) -{ - struct ieee80211_node *ni; - - /* XXX recheck MIC to deal w/ chips that lie */ - /* XXX discard MIC errors on !data frames */ - ni = ieee80211_find_rxnode(ic, (const struct ieee80211_frame_min *) wh); - if (ni != NULL) { - ieee80211_notify_michael_failure(ni->ni_vap, wh, keyix); - ieee80211_free_node(ni); - } -} - -/* - * Only run the RX proc if it's not already running. - * Since this may get run as part of the reset/flush path, - * the task can't clash with an existing, running tasklet. - */ -static void -ath_rx_tasklet(void *arg, int npending) -{ - struct ath_softc *sc = arg; - - CTR1(ATH_KTR_INTR, "ath_rx_proc: pending=%d", npending); - DPRINTF(sc, ATH_DEBUG_RX_PROC, "%s: pending %u\n", __func__, npending); - ATH_PCU_LOCK(sc); - if (sc->sc_inreset_cnt > 0) { - device_printf(sc->sc_dev, - "%s: sc_inreset_cnt > 0; skipping\n", __func__); - ATH_PCU_UNLOCK(sc); - return; - } - ATH_PCU_UNLOCK(sc); - ath_rx_proc(sc, 1); -} - -static void -ath_rx_proc(struct ath_softc *sc, int resched) -{ -#define PA2DESC(_sc, _pa) \ - ((struct ath_desc *)((caddr_t)(_sc)->sc_rxdma.dd_desc + \ - ((_pa) - (_sc)->sc_rxdma.dd_desc_paddr))) - struct ath_buf *bf; - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; - struct ath_hal *ah = sc->sc_ah; - struct ath_desc *ds; - struct ath_rx_status *rs; - struct mbuf *m; - struct ieee80211_node *ni; - int len, type, ngood; - HAL_STATUS status; - int16_t nf; - u_int64_t tsf, rstamp; - int npkts = 0; - - /* XXX we must not hold the ATH_LOCK here */ - ATH_UNLOCK_ASSERT(sc); - ATH_PCU_UNLOCK_ASSERT(sc); - - ATH_PCU_LOCK(sc); - sc->sc_rxproc_cnt++; - ATH_PCU_UNLOCK(sc); - - DPRINTF(sc, ATH_DEBUG_RX_PROC, "%s: called\n", __func__); - ngood = 0; - nf = ath_hal_getchannoise(ah, sc->sc_curchan); - sc->sc_stats.ast_rx_noise = nf; - tsf = ath_hal_gettsf64(ah); - do { - bf = TAILQ_FIRST(&sc->sc_rxbuf); - if (sc->sc_rxslink && bf == NULL) { /* NB: shouldn't happen */ - if_printf(ifp, "%s: no buffer!\n", __func__); - break; - } else if (bf == NULL) { - /* - * End of List: - * this can happen for non-self-linked RX chains - */ - sc->sc_stats.ast_rx_hitqueueend++; - break; - } - m = bf->bf_m; - if (m == NULL) { /* NB: shouldn't happen */ - /* - * If mbuf allocation failed previously there - * will be no mbuf; try again to re-populate it. - */ - /* XXX make debug msg */ - if_printf(ifp, "%s: no mbuf!\n", __func__); - TAILQ_REMOVE(&sc->sc_rxbuf, bf, bf_list); - goto rx_next; - } - ds = bf->bf_desc; - if (ds->ds_link == bf->bf_daddr) { - /* NB: never process the self-linked entry at the end */ - sc->sc_stats.ast_rx_hitqueueend++; - break; - } - /* XXX sync descriptor memory */ - /* - * Must provide the virtual address of the current - * descriptor, the physical address, and the virtual - * address of the next descriptor in the h/w chain. - * This allows the HAL to look ahead to see if the - * hardware is done with a descriptor by checking the - * done bit in the following descriptor and the address - * of the current descriptor the DMA engine is working - * on. All this is necessary because of our use of - * a self-linked list to avoid rx overruns. - */ - rs = &bf->bf_status.ds_rxstat; - status = ath_hal_rxprocdesc(ah, ds, - bf->bf_daddr, PA2DESC(sc, ds->ds_link), rs); -#ifdef ATH_DEBUG - if (sc->sc_debug & ATH_DEBUG_RECV_DESC) - ath_printrxbuf(sc, bf, 0, status == HAL_OK); -#endif - if (status == HAL_EINPROGRESS) - break; - - TAILQ_REMOVE(&sc->sc_rxbuf, bf, bf_list); - npkts++; - - /* - * Calculate the correct 64 bit TSF given - * the TSF64 register value and rs_tstamp. - */ - rstamp = ath_extend_tsf(sc, rs->rs_tstamp, tsf); - - /* These aren't specifically errors */ -#ifdef AH_SUPPORT_AR5416 - if (rs->rs_flags & HAL_RX_GI) - sc->sc_stats.ast_rx_halfgi++; - if (rs->rs_flags & HAL_RX_2040) - sc->sc_stats.ast_rx_2040++; - if (rs->rs_flags & HAL_RX_DELIM_CRC_PRE) - sc->sc_stats.ast_rx_pre_crc_err++; - if (rs->rs_flags & HAL_RX_DELIM_CRC_POST) - sc->sc_stats.ast_rx_post_crc_err++; - if (rs->rs_flags & HAL_RX_DECRYPT_BUSY) - sc->sc_stats.ast_rx_decrypt_busy_err++; - if (rs->rs_flags & HAL_RX_HI_RX_CHAIN) - sc->sc_stats.ast_rx_hi_rx_chain++; -#endif /* AH_SUPPORT_AR5416 */ - - if (rs->rs_status != 0) { - if (rs->rs_status & HAL_RXERR_CRC) - sc->sc_stats.ast_rx_crcerr++; - if (rs->rs_status & HAL_RXERR_FIFO) - sc->sc_stats.ast_rx_fifoerr++; - if (rs->rs_status & HAL_RXERR_PHY) { - sc->sc_stats.ast_rx_phyerr++; - /* Process DFS radar events */ - if ((rs->rs_phyerr == HAL_PHYERR_RADAR) || - (rs->rs_phyerr == HAL_PHYERR_FALSE_RADAR_EXT)) { - /* Since we're touching the frame data, sync it */ - bus_dmamap_sync(sc->sc_dmat, - bf->bf_dmamap, - BUS_DMASYNC_POSTREAD); - /* Now pass it to the radar processing code */ - ath_dfs_process_phy_err(sc, mtod(m, char *), rstamp, rs); - } - - /* Be suitably paranoid about receiving phy errors out of the stats array bounds */ - if (rs->rs_phyerr < 64) - sc->sc_stats.ast_rx_phy[rs->rs_phyerr]++; - goto rx_error; /* NB: don't count in ierrors */ - } - if (rs->rs_status & HAL_RXERR_DECRYPT) { - /* - * Decrypt error. If the error occurred - * because there was no hardware key, then - * let the frame through so the upper layers - * can process it. This is necessary for 5210 - * parts which have no way to setup a ``clear'' - * key cache entry. - * - * XXX do key cache faulting - */ - if (rs->rs_keyix == HAL_RXKEYIX_INVALID) - goto rx_accept; - sc->sc_stats.ast_rx_badcrypt++; - } - if (rs->rs_status & HAL_RXERR_MIC) { - sc->sc_stats.ast_rx_badmic++; - /* - * Do minimal work required to hand off - * the 802.11 header for notification. - */ - /* XXX frag's and qos frames */ - len = rs->rs_datalen; - if (len >= sizeof (struct ieee80211_frame)) { - bus_dmamap_sync(sc->sc_dmat, - bf->bf_dmamap, - BUS_DMASYNC_POSTREAD); - ath_handle_micerror(ic, - mtod(m, struct ieee80211_frame *), - sc->sc_splitmic ? - rs->rs_keyix-32 : rs->rs_keyix); - } - } - ifp->if_ierrors++; -rx_error: - /* - * Cleanup any pending partial frame. - */ - if (sc->sc_rxpending != NULL) { - m_freem(sc->sc_rxpending); - sc->sc_rxpending = NULL; - } - /* - * When a tap is present pass error frames - * that have been requested. By default we - * pass decrypt+mic errors but others may be - * interesting (e.g. crc). - */ - if (ieee80211_radiotap_active(ic) && - (rs->rs_status & sc->sc_monpass)) { - bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, - BUS_DMASYNC_POSTREAD); - /* NB: bpf needs the mbuf length setup */ - len = rs->rs_datalen; - m->m_pkthdr.len = m->m_len = len; - bf->bf_m = NULL; - ath_rx_tap(ifp, m, rs, rstamp, nf); - ieee80211_radiotap_rx_all(ic, m); - m_freem(m); - } - /* XXX pass MIC errors up for s/w reclaculation */ - goto rx_next; - } -rx_accept: - /* - * Sync and unmap the frame. At this point we're - * committed to passing the mbuf somewhere so clear - * bf_m; this means a new mbuf must be allocated - * when the rx descriptor is setup again to receive - * another frame. - */ - bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, - BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); - bf->bf_m = NULL; - - len = rs->rs_datalen; - m->m_len = len; - - if (rs->rs_more) { - /* - * Frame spans multiple descriptors; save - * it for the next completed descriptor, it - * will be used to construct a jumbogram. - */ - if (sc->sc_rxpending != NULL) { - /* NB: max frame size is currently 2 clusters */ - sc->sc_stats.ast_rx_toobig++; - m_freem(sc->sc_rxpending); - } - m->m_pkthdr.rcvif = ifp; - m->m_pkthdr.len = len; - sc->sc_rxpending = m; - goto rx_next; - } else if (sc->sc_rxpending != NULL) { - /* - * This is the second part of a jumbogram, - * chain it to the first mbuf, adjust the - * frame length, and clear the rxpending state. - */ - sc->sc_rxpending->m_next = m; - sc->sc_rxpending->m_pkthdr.len += len; - m = sc->sc_rxpending; - sc->sc_rxpending = NULL; - } else { - /* - * Normal single-descriptor receive; setup - * the rcvif and packet length. - */ - m->m_pkthdr.rcvif = ifp; - m->m_pkthdr.len = len; - } - - /* - * Validate rs->rs_antenna. - * - * Some users w/ AR9285 NICs have reported crashes - * here because rs_antenna field is bogusly large. - * Let's enforce the maximum antenna limit of 8 - * (and it shouldn't be hard coded, but that's a - * separate problem) and if there's an issue, print - * out an error and adjust rs_antenna to something - * sensible. - * - * This code should be removed once the actual - * root cause of the issue has been identified. - * For example, it may be that the rs_antenna - * field is only valid for the lsat frame of - * an aggregate and it just happens that it is - * "mostly" right. (This is a general statement - - * the majority of the statistics are only valid - * for the last frame in an aggregate. - */ - if (rs->rs_antenna > 7) { - device_printf(sc->sc_dev, "%s: rs_antenna > 7 (%d)\n", - __func__, rs->rs_antenna); -#ifdef ATH_DEBUG - ath_printrxbuf(sc, bf, 0, status == HAL_OK); -#endif /* ATH_DEBUG */ - rs->rs_antenna = 0; /* XXX better than nothing */ - } - - ifp->if_ipackets++; - sc->sc_stats.ast_ant_rx[rs->rs_antenna]++; - - /* - * Populate the rx status block. When there are bpf - * listeners we do the additional work to provide - * complete status. Otherwise we fill in only the - * material required by ieee80211_input. Note that - * noise setting is filled in above. - */ - if (ieee80211_radiotap_active(ic)) - ath_rx_tap(ifp, m, rs, rstamp, nf); - - /* - * From this point on we assume the frame is at least - * as large as ieee80211_frame_min; verify that. - */ - if (len < IEEE80211_MIN_LEN) { - if (!ieee80211_radiotap_active(ic)) { - DPRINTF(sc, ATH_DEBUG_RECV, - "%s: short packet %d\n", __func__, len); - sc->sc_stats.ast_rx_tooshort++; - } else { - /* NB: in particular this captures ack's */ - ieee80211_radiotap_rx_all(ic, m); - } - m_freem(m); - goto rx_next; - } - - if (IFF_DUMPPKTS(sc, ATH_DEBUG_RECV)) { - const HAL_RATE_TABLE *rt = sc->sc_currates; - uint8_t rix = rt->rateCodeToIndex[rs->rs_rate]; - - ieee80211_dump_pkt(ic, mtod(m, caddr_t), len, - sc->sc_hwmap[rix].ieeerate, rs->rs_rssi); - } - - m_adj(m, -IEEE80211_CRC_LEN); - - /* - * Locate the node for sender, track state, and then - * pass the (referenced) node up to the 802.11 layer - * for its use. - */ - ni = ieee80211_find_rxnode_withkey(ic, - mtod(m, const struct ieee80211_frame_min *), - rs->rs_keyix == HAL_RXKEYIX_INVALID ? - IEEE80211_KEYIX_NONE : rs->rs_keyix); - sc->sc_lastrs = rs; - -#ifdef AH_SUPPORT_AR5416 - if (rs->rs_isaggr) - sc->sc_stats.ast_rx_agg++; -#endif /* AH_SUPPORT_AR5416 */ - - if (ni != NULL) { - /* - * Only punt packets for ampdu reorder processing for - * 11n nodes; net80211 enforces that M_AMPDU is only - * set for 11n nodes. - */ - if (ni->ni_flags & IEEE80211_NODE_HT) - m->m_flags |= M_AMPDU; - - /* - * Sending station is known, dispatch directly. - */ - type = ieee80211_input(ni, m, rs->rs_rssi, nf); - ieee80211_free_node(ni); - /* - * Arrange to update the last rx timestamp only for - * frames from our ap when operating in station mode. - * This assumes the rx key is always setup when - * associated. - */ - if (ic->ic_opmode == IEEE80211_M_STA && - rs->rs_keyix != HAL_RXKEYIX_INVALID) - ngood++; - } else { - type = ieee80211_input_all(ic, m, rs->rs_rssi, nf); - } - /* - * Track rx rssi and do any rx antenna management. - */ - ATH_RSSI_LPF(sc->sc_halstats.ns_avgrssi, rs->rs_rssi); - if (sc->sc_diversity) { - /* - * When using fast diversity, change the default rx - * antenna if diversity chooses the other antenna 3 - * times in a row. - */ - if (sc->sc_defant != rs->rs_antenna) { - if (++sc->sc_rxotherant >= 3) - ath_setdefantenna(sc, rs->rs_antenna); - } else - sc->sc_rxotherant = 0; - } - - /* Newer school diversity - kite specific for now */ - /* XXX perhaps migrate the normal diversity code to this? */ - if ((ah)->ah_rxAntCombDiversity) - (*(ah)->ah_rxAntCombDiversity)(ah, rs, ticks, hz); - - if (sc->sc_softled) { - /* - * Blink for any data frame. Otherwise do a - * heartbeat-style blink when idle. The latter - * is mainly for station mode where we depend on - * periodic beacon frames to trigger the poll event. - */ - if (type == IEEE80211_FC0_TYPE_DATA) { - const HAL_RATE_TABLE *rt = sc->sc_currates; - ath_led_event(sc, - rt->rateCodeToIndex[rs->rs_rate]); - } else if (ticks - sc->sc_ledevent >= sc->sc_ledidle) - ath_led_event(sc, 0); - } -rx_next: - TAILQ_INSERT_TAIL(&sc->sc_rxbuf, bf, bf_list); - } while (ath_rxbuf_init(sc, bf) == 0); - - /* rx signal state monitoring */ - ath_hal_rxmonitor(ah, &sc->sc_halstats, sc->sc_curchan); - if (ngood) - sc->sc_lastrx = tsf; - - CTR2(ATH_KTR_INTR, "ath_rx_proc: npkts=%d, ngood=%d", npkts, ngood); - /* Queue DFS tasklet if needed */ - if (resched && ath_dfs_tasklet_needed(sc, sc->sc_curchan)) - taskqueue_enqueue(sc->sc_tq, &sc->sc_dfstask); - - /* - * Now that all the RX frames were handled that - * need to be handled, kick the PCU if there's - * been an RXEOL condition. - */ - ATH_PCU_LOCK(sc); - if (resched && sc->sc_kickpcu) { - CTR0(ATH_KTR_ERR, "ath_rx_proc: kickpcu"); - device_printf(sc->sc_dev, "%s: kickpcu; handled %d packets\n", - __func__, npkts); - - /* XXX rxslink? */ - /* - * XXX can we hold the PCU lock here? - * Are there any net80211 buffer calls involved? - */ - bf = TAILQ_FIRST(&sc->sc_rxbuf); - ath_hal_putrxbuf(ah, bf->bf_daddr); - ath_hal_rxena(ah); /* enable recv descriptors */ - ath_mode_init(sc); /* set filters, etc. */ - ath_hal_startpcurecv(ah); /* re-enable PCU/DMA engine */ - - ath_hal_intrset(ah, sc->sc_imask); - sc->sc_kickpcu = 0; - } - ATH_PCU_UNLOCK(sc); - - /* XXX check this inside of IF_LOCK? */ - if (resched && (ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) { -#ifdef IEEE80211_SUPPORT_SUPERG - ieee80211_ff_age_all(ic, 100); -#endif - if (!IFQ_IS_EMPTY(&ifp->if_snd)) - ath_start(ifp); - } -#undef PA2DESC - - ATH_PCU_LOCK(sc); - sc->sc_rxproc_cnt--; - ATH_PCU_UNLOCK(sc); -} - static void ath_txq_init(struct ath_softc *sc, struct ath_txq *txq, int qnum) { @@ -4700,7 +3229,7 @@ ath_txq_update(struct ath_softc *sc, int ac) /* * Callback from the 802.11 layer to update WME parameters. */ -static int +int ath_wme_update(struct ieee80211com *ic) { struct ath_softc *sc = ic->ic_ifp->if_softc; @@ -4887,12 +3416,14 @@ ath_tx_update_busy(struct ath_softc *sc) * descriptor. */ ATH_TXBUF_LOCK_ASSERT(sc); + last = TAILQ_LAST(&sc->sc_txbuf_mgmt, ath_bufhead_s); + if (last != NULL) + last->bf_flags &= ~ATH_BUF_BUSY; last = TAILQ_LAST(&sc->sc_txbuf, ath_bufhead_s); if (last != NULL) last->bf_flags &= ~ATH_BUF_BUSY; } - /* * Process completed xmit descriptors from the specified queue. * Kick the packet scheduler if needed. This can occur from this @@ -5063,7 +3594,7 @@ ath_tx_proc_q0(void *arg, int npending) sc->sc_txproc_cnt--; ATH_PCU_UNLOCK(sc); - ath_start(ifp); + ath_tx_kick(sc); } /* @@ -5113,7 +3644,7 @@ ath_tx_proc_q0123(void *arg, int npending) sc->sc_txproc_cnt--; ATH_PCU_UNLOCK(sc); - ath_start(ifp); + ath_tx_kick(sc); } /* @@ -5156,7 +3687,7 @@ ath_tx_proc(void *arg, int npending) sc->sc_txproc_cnt--; ATH_PCU_UNLOCK(sc); - ath_start(ifp); + ath_tx_kick(sc); } #undef TXQACTIVE @@ -5195,6 +3726,48 @@ ath_txq_sched_tasklet(void *arg, int npending) ATH_PCU_UNLOCK(sc); } +void +ath_returnbuf_tail(struct ath_softc *sc, struct ath_buf *bf) +{ + + ATH_TXBUF_LOCK_ASSERT(sc); + + if (bf->bf_flags & ATH_BUF_MGMT) + TAILQ_INSERT_TAIL(&sc->sc_txbuf_mgmt, bf, bf_list); + else { + TAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list); + sc->sc_txbuf_cnt++; + if (sc->sc_txbuf_cnt > ath_txbuf) { + device_printf(sc->sc_dev, + "%s: sc_txbuf_cnt > %d?\n", + __func__, + ath_txbuf); + sc->sc_txbuf_cnt = ath_txbuf; + } + } +} + +void +ath_returnbuf_head(struct ath_softc *sc, struct ath_buf *bf) +{ + + ATH_TXBUF_LOCK_ASSERT(sc); + + if (bf->bf_flags & ATH_BUF_MGMT) + TAILQ_INSERT_HEAD(&sc->sc_txbuf_mgmt, bf, bf_list); + else { + TAILQ_INSERT_HEAD(&sc->sc_txbuf, bf, bf_list); + sc->sc_txbuf_cnt++; + if (sc->sc_txbuf_cnt > ATH_TXBUF) { + device_printf(sc->sc_dev, + "%s: sc_txbuf_cnt > %d?\n", + __func__, + ATH_TXBUF); + sc->sc_txbuf_cnt = ATH_TXBUF; + } + } +} + /* * Return a buffer to the pool and update the 'busy' flag on the * previous 'tail' entry. @@ -5217,7 +3790,7 @@ ath_freebuf(struct ath_softc *sc, struct ath_buf *bf) ATH_TXBUF_LOCK(sc); ath_tx_update_busy(sc); - TAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list); + ath_returnbuf_tail(sc, bf); ATH_TXBUF_UNLOCK(sc); } @@ -5271,6 +3844,9 @@ ath_tx_draintxq(struct ath_softc *sc, struct ath_txq *txq) */ ATH_TXBUF_LOCK(sc); bf = TAILQ_LAST(&sc->sc_txbuf, ath_bufhead_s); + if (bf != NULL) + bf->bf_flags &= ~ATH_BUF_BUSY; + bf = TAILQ_LAST(&sc->sc_txbuf_mgmt, ath_bufhead_s); if (bf != NULL) bf->bf_flags &= ~ATH_BUF_BUSY; ATH_TXBUF_UNLOCK(sc); @@ -5403,81 +3979,6 @@ ath_draintxq(struct ath_softc *sc, ATH_RESET_TYPE reset_type) sc->sc_wd_timer = 0; } -/* - * Disable the receive h/w in preparation for a reset. - */ -static void -ath_stoprecv(struct ath_softc *sc, int dodelay) -{ -#define PA2DESC(_sc, _pa) \ - ((struct ath_desc *)((caddr_t)(_sc)->sc_rxdma.dd_desc + \ - ((_pa) - (_sc)->sc_rxdma.dd_desc_paddr))) - struct ath_hal *ah = sc->sc_ah; - - ath_hal_stoppcurecv(ah); /* disable PCU */ - ath_hal_setrxfilter(ah, 0); /* clear recv filter */ - ath_hal_stopdmarecv(ah); /* disable DMA engine */ - if (dodelay) - DELAY(3000); /* 3ms is long enough for 1 frame */ -#ifdef ATH_DEBUG - if (sc->sc_debug & (ATH_DEBUG_RESET | ATH_DEBUG_FATAL)) { - struct ath_buf *bf; - u_int ix; - - device_printf(sc->sc_dev, - "%s: rx queue %p, link %p\n", - __func__, - (caddr_t)(uintptr_t) ath_hal_getrxbuf(ah), - sc->sc_rxlink); - ix = 0; - TAILQ_FOREACH(bf, &sc->sc_rxbuf, bf_list) { - struct ath_desc *ds = bf->bf_desc; - struct ath_rx_status *rs = &bf->bf_status.ds_rxstat; - HAL_STATUS status = ath_hal_rxprocdesc(ah, ds, - bf->bf_daddr, PA2DESC(sc, ds->ds_link), rs); - if (status == HAL_OK || (sc->sc_debug & ATH_DEBUG_FATAL)) - ath_printrxbuf(sc, bf, ix, status == HAL_OK); - ix++; - } - } -#endif - if (sc->sc_rxpending != NULL) { - m_freem(sc->sc_rxpending); - sc->sc_rxpending = NULL; - } - sc->sc_rxlink = NULL; /* just in case */ -#undef PA2DESC -} - -/* - * Enable the receive h/w following a reset. - */ -static int -ath_startrecv(struct ath_softc *sc) -{ - struct ath_hal *ah = sc->sc_ah; - struct ath_buf *bf; - - sc->sc_rxlink = NULL; - sc->sc_rxpending = NULL; - TAILQ_FOREACH(bf, &sc->sc_rxbuf, bf_list) { - int error = ath_rxbuf_init(sc, bf); - if (error != 0) { - DPRINTF(sc, ATH_DEBUG_RECV, - "%s: ath_rxbuf_init failed %d\n", - __func__, error); - return error; - } - } - - bf = TAILQ_FIRST(&sc->sc_rxbuf); - ath_hal_putrxbuf(ah, bf->bf_daddr); - ath_hal_rxena(ah); /* enable recv descriptors */ - ath_mode_init(sc); /* set filters, etc. */ - ath_hal_startpcurecv(ah); /* re-enable PCU/DMA engine */ - return 0; -} - /* * Update internal state after a channel change. */ @@ -5544,7 +4045,7 @@ ath_chan_set(struct ath_softc *sc, struct ieee80211_channel *chan) /* * First, handle completed TX/RX frames. */ - ath_rx_proc(sc, 0); + ath_rx_flush(sc); ath_draintxq(sc, ATH_RESET_NOLOSS); /* * Next, flush the non-scheduled frames. @@ -6487,6 +4988,9 @@ ath_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) sc->sc_stats.ast_tx_rate |= IEEE80211_RATE_MCS; return copyout(&sc->sc_stats, ifr->ifr_data, sizeof (sc->sc_stats)); + case SIOCGATHAGSTATS: + return copyout(&sc->sc_aggr_stats, + ifr->ifr_data, sizeof (sc->sc_aggr_stats)); case SIOCZATHSTATS: error = priv_check(curthread, PRIV_DRIVER); if (error == 0) { @@ -6549,357 +5053,6 @@ ath_announce(struct ath_softc *sc) if_printf(ifp, "using multicast key search\n"); } -#ifdef IEEE80211_SUPPORT_TDMA -static void -ath_tdma_settimers(struct ath_softc *sc, u_int32_t nexttbtt, u_int32_t bintval) -{ - struct ath_hal *ah = sc->sc_ah; - HAL_BEACON_TIMERS bt; - - bt.bt_intval = bintval | HAL_BEACON_ENA; - bt.bt_nexttbtt = nexttbtt; - bt.bt_nextdba = (nexttbtt<<3) - sc->sc_tdmadbaprep; - bt.bt_nextswba = (nexttbtt<<3) - sc->sc_tdmaswbaprep; - bt.bt_nextatim = nexttbtt+1; - /* Enables TBTT, DBA, SWBA timers by default */ - bt.bt_flags = 0; - ath_hal_beaconsettimers(ah, &bt); -} - -/* - * Calculate the beacon interval. This is periodic in the - * superframe for the bss. We assume each station is configured - * identically wrt transmit rate so the guard time we calculate - * above will be the same on all stations. Note we need to - * factor in the xmit time because the hardware will schedule - * a frame for transmit if the start of the frame is within - * the burst time. When we get hardware that properly kills - * frames in the PCU we can reduce/eliminate the guard time. - * - * Roundup to 1024 is so we have 1 TU buffer in the guard time - * to deal with the granularity of the nexttbtt timer. 11n MAC's - * with 1us timer granularity should allow us to reduce/eliminate - * this. - */ -static void -ath_tdma_bintvalsetup(struct ath_softc *sc, - const struct ieee80211_tdma_state *tdma) -{ - /* copy from vap state (XXX check all vaps have same value?) */ - sc->sc_tdmaslotlen = tdma->tdma_slotlen; - - sc->sc_tdmabintval = roundup((sc->sc_tdmaslotlen+sc->sc_tdmaguard) * - tdma->tdma_slotcnt, 1024); - sc->sc_tdmabintval >>= 10; /* TSF -> TU */ - if (sc->sc_tdmabintval & 1) - sc->sc_tdmabintval++; - - if (tdma->tdma_slot == 0) { - /* - * Only slot 0 beacons; other slots respond. - */ - sc->sc_imask |= HAL_INT_SWBA; - sc->sc_tdmaswba = 0; /* beacon immediately */ - } else { - /* XXX all vaps must be slot 0 or slot !0 */ - sc->sc_imask &= ~HAL_INT_SWBA; - } -} - -/* - * Max 802.11 overhead. This assumes no 4-address frames and - * the encapsulation done by ieee80211_encap (llc). We also - * include potential crypto overhead. - */ -#define IEEE80211_MAXOVERHEAD \ - (sizeof(struct ieee80211_qosframe) \ - + sizeof(struct llc) \ - + IEEE80211_ADDR_LEN \ - + IEEE80211_WEP_IVLEN \ - + IEEE80211_WEP_KIDLEN \ - + IEEE80211_WEP_CRCLEN \ - + IEEE80211_WEP_MICLEN \ - + IEEE80211_CRC_LEN) - -/* - * Setup initially for tdma operation. Start the beacon - * timers and enable SWBA if we are slot 0. Otherwise - * we wait for slot 0 to arrive so we can sync up before - * starting to transmit. - */ -static void -ath_tdma_config(struct ath_softc *sc, struct ieee80211vap *vap) -{ - struct ath_hal *ah = sc->sc_ah; - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; - const struct ieee80211_txparam *tp; - const struct ieee80211_tdma_state *tdma = NULL; - int rix; - - if (vap == NULL) { - vap = TAILQ_FIRST(&ic->ic_vaps); /* XXX */ - if (vap == NULL) { - if_printf(ifp, "%s: no vaps?\n", __func__); - return; - } - } - /* XXX should take a locked ref to iv_bss */ - tp = vap->iv_bss->ni_txparms; - /* - * Calculate the guard time for each slot. This is the - * time to send a maximal-size frame according to the - * fixed/lowest transmit rate. Note that the interface - * mtu does not include the 802.11 overhead so we must - * tack that on (ath_hal_computetxtime includes the - * preamble and plcp in it's calculation). - */ - tdma = vap->iv_tdma; - if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) - rix = ath_tx_findrix(sc, tp->ucastrate); - else - rix = ath_tx_findrix(sc, tp->mcastrate); - /* XXX short preamble assumed */ - sc->sc_tdmaguard = ath_hal_computetxtime(ah, sc->sc_currates, - ifp->if_mtu + IEEE80211_MAXOVERHEAD, rix, AH_TRUE); - - ath_hal_intrset(ah, 0); - - ath_beaconq_config(sc); /* setup h/w beacon q */ - if (sc->sc_setcca) - ath_hal_setcca(ah, AH_FALSE); /* disable CCA */ - ath_tdma_bintvalsetup(sc, tdma); /* calculate beacon interval */ - ath_tdma_settimers(sc, sc->sc_tdmabintval, - sc->sc_tdmabintval | HAL_BEACON_RESET_TSF); - sc->sc_syncbeacon = 0; - - sc->sc_avgtsfdeltap = TDMA_DUMMY_MARKER; - sc->sc_avgtsfdeltam = TDMA_DUMMY_MARKER; - - ath_hal_intrset(ah, sc->sc_imask); - - DPRINTF(sc, ATH_DEBUG_TDMA, "%s: slot %u len %uus cnt %u " - "bsched %u guard %uus bintval %u TU dba prep %u\n", __func__, - tdma->tdma_slot, tdma->tdma_slotlen, tdma->tdma_slotcnt, - tdma->tdma_bintval, sc->sc_tdmaguard, sc->sc_tdmabintval, - sc->sc_tdmadbaprep); -} - -/* - * Update tdma operation. Called from the 802.11 layer - * when a beacon is received from the TDMA station operating - * in the slot immediately preceding us in the bss. Use - * the rx timestamp for the beacon frame to update our - * beacon timers so we follow their schedule. Note that - * by using the rx timestamp we implicitly include the - * propagation delay in our schedule. - */ -static void -ath_tdma_update(struct ieee80211_node *ni, - const struct ieee80211_tdma_param *tdma, int changed) -{ -#define TSF_TO_TU(_h,_l) \ - ((((u_int32_t)(_h)) << 22) | (((u_int32_t)(_l)) >> 10)) -#define TU_TO_TSF(_tu) (((u_int64_t)(_tu)) << 10) - struct ieee80211vap *vap = ni->ni_vap; - struct ieee80211com *ic = ni->ni_ic; - struct ath_softc *sc = ic->ic_ifp->if_softc; - struct ath_hal *ah = sc->sc_ah; - const HAL_RATE_TABLE *rt = sc->sc_currates; - u_int64_t tsf, rstamp, nextslot, nexttbtt; - u_int32_t txtime, nextslottu; - int32_t tudelta, tsfdelta; - const struct ath_rx_status *rs; - int rix; - - sc->sc_stats.ast_tdma_update++; - - /* - * Check for and adopt configuration changes. - */ - if (changed != 0) { - const struct ieee80211_tdma_state *ts = vap->iv_tdma; - - ath_tdma_bintvalsetup(sc, ts); - if (changed & TDMA_UPDATE_SLOTLEN) - ath_wme_update(ic); - - DPRINTF(sc, ATH_DEBUG_TDMA, - "%s: adopt slot %u slotcnt %u slotlen %u us " - "bintval %u TU\n", __func__, - ts->tdma_slot, ts->tdma_slotcnt, ts->tdma_slotlen, - sc->sc_tdmabintval); - - /* XXX right? */ - ath_hal_intrset(ah, sc->sc_imask); - /* NB: beacon timers programmed below */ - } - - /* extend rx timestamp to 64 bits */ - rs = sc->sc_lastrs; - tsf = ath_hal_gettsf64(ah); - rstamp = ath_extend_tsf(sc, rs->rs_tstamp, tsf); - /* - * The rx timestamp is set by the hardware on completing - * reception (at the point where the rx descriptor is DMA'd - * to the host). To find the start of our next slot we - * must adjust this time by the time required to send - * the packet just received. - */ - rix = rt->rateCodeToIndex[rs->rs_rate]; - txtime = ath_hal_computetxtime(ah, rt, rs->rs_datalen, rix, - rt->info[rix].shortPreamble); - /* NB: << 9 is to cvt to TU and /2 */ - nextslot = (rstamp - txtime) + (sc->sc_tdmabintval << 9); - nextslottu = TSF_TO_TU(nextslot>>32, nextslot) & HAL_BEACON_PERIOD; - - /* - * Retrieve the hardware NextTBTT in usecs - * and calculate the difference between what the - * other station thinks and what we have programmed. This - * lets us figure how to adjust our timers to match. The - * adjustments are done by pulling the TSF forward and possibly - * rewriting the beacon timers. - */ - nexttbtt = ath_hal_getnexttbtt(ah); - tsfdelta = (int32_t)((nextslot % TU_TO_TSF(HAL_BEACON_PERIOD + 1)) - nexttbtt); - - DPRINTF(sc, ATH_DEBUG_TDMA_TIMER, - "tsfdelta %d avg +%d/-%d\n", tsfdelta, - TDMA_AVG(sc->sc_avgtsfdeltap), TDMA_AVG(sc->sc_avgtsfdeltam)); - - if (tsfdelta < 0) { - TDMA_SAMPLE(sc->sc_avgtsfdeltap, 0); - TDMA_SAMPLE(sc->sc_avgtsfdeltam, -tsfdelta); - tsfdelta = -tsfdelta % 1024; - nextslottu++; - } else if (tsfdelta > 0) { - TDMA_SAMPLE(sc->sc_avgtsfdeltap, tsfdelta); - TDMA_SAMPLE(sc->sc_avgtsfdeltam, 0); - tsfdelta = 1024 - (tsfdelta % 1024); - nextslottu++; - } else { - TDMA_SAMPLE(sc->sc_avgtsfdeltap, 0); - TDMA_SAMPLE(sc->sc_avgtsfdeltam, 0); - } - tudelta = nextslottu - TSF_TO_TU(nexttbtt >> 32, nexttbtt); - - /* - * Copy sender's timetstamp into tdma ie so they can - * calculate roundtrip time. We submit a beacon frame - * below after any timer adjustment. The frame goes out - * at the next TBTT so the sender can calculate the - * roundtrip by inspecting the tdma ie in our beacon frame. - * - * NB: This tstamp is subtlely preserved when - * IEEE80211_BEACON_TDMA is marked (e.g. when the - * slot position changes) because ieee80211_add_tdma - * skips over the data. - */ - memcpy(ATH_VAP(vap)->av_boff.bo_tdma + - __offsetof(struct ieee80211_tdma_param, tdma_tstamp), - &ni->ni_tstamp.data, 8); -#if 0 - DPRINTF(sc, ATH_DEBUG_TDMA_TIMER, - "tsf %llu nextslot %llu (%d, %d) nextslottu %u nexttbtt %llu (%d)\n", - (unsigned long long) tsf, (unsigned long long) nextslot, - (int)(nextslot - tsf), tsfdelta, nextslottu, nexttbtt, tudelta); -#endif - /* - * Adjust the beacon timers only when pulling them forward - * or when going back by less than the beacon interval. - * Negative jumps larger than the beacon interval seem to - * cause the timers to stop and generally cause instability. - * This basically filters out jumps due to missed beacons. - */ - if (tudelta != 0 && (tudelta > 0 || -tudelta < sc->sc_tdmabintval)) { - ath_tdma_settimers(sc, nextslottu, sc->sc_tdmabintval); - sc->sc_stats.ast_tdma_timers++; - } - if (tsfdelta > 0) { - ath_hal_adjusttsf(ah, tsfdelta); - sc->sc_stats.ast_tdma_tsf++; - } - ath_tdma_beacon_send(sc, vap); /* prepare response */ -#undef TU_TO_TSF -#undef TSF_TO_TU -} - -/* - * Transmit a beacon frame at SWBA. Dynamic updates - * to the frame contents are done as needed. - */ -static void -ath_tdma_beacon_send(struct ath_softc *sc, struct ieee80211vap *vap) -{ - struct ath_hal *ah = sc->sc_ah; - struct ath_buf *bf; - int otherant; - - /* - * Check if the previous beacon has gone out. If - * not don't try to post another, skip this period - * and wait for the next. Missed beacons indicate - * a problem and should not occur. If we miss too - * many consecutive beacons reset the device. - */ - if (ath_hal_numtxpending(ah, sc->sc_bhalq) != 0) { - sc->sc_bmisscount++; - DPRINTF(sc, ATH_DEBUG_BEACON, - "%s: missed %u consecutive beacons\n", - __func__, sc->sc_bmisscount); - if (sc->sc_bmisscount >= ath_bstuck_threshold) - taskqueue_enqueue(sc->sc_tq, &sc->sc_bstucktask); - return; - } - if (sc->sc_bmisscount != 0) { - DPRINTF(sc, ATH_DEBUG_BEACON, - "%s: resume beacon xmit after %u misses\n", - __func__, sc->sc_bmisscount); - sc->sc_bmisscount = 0; - } - - /* - * Check recent per-antenna transmit statistics and flip - * the default antenna if noticeably more frames went out - * on the non-default antenna. - * XXX assumes 2 anntenae - */ - if (!sc->sc_diversity) { - otherant = sc->sc_defant & 1 ? 2 : 1; - if (sc->sc_ant_tx[otherant] > sc->sc_ant_tx[sc->sc_defant] + 2) - ath_setdefantenna(sc, otherant); - sc->sc_ant_tx[1] = sc->sc_ant_tx[2] = 0; - } - - bf = ath_beacon_generate(sc, vap); - if (bf != NULL) { - /* - * Stop any current dma and put the new frame on the queue. - * This should never fail since we check above that no frames - * are still pending on the queue. - */ - if (!ath_hal_stoptxdma(ah, sc->sc_bhalq)) { - DPRINTF(sc, ATH_DEBUG_ANY, - "%s: beacon queue %u did not stop?\n", - __func__, sc->sc_bhalq); - /* NB: the HAL still stops DMA, so proceed */ - } - ath_hal_puttxbuf(ah, sc->sc_bhalq, bf->bf_daddr); - ath_hal_txstart(ah, sc->sc_bhalq); - - sc->sc_stats.ast_be_xmit++; /* XXX per-vap? */ - - /* - * Record local TSF for our last send for use - * in arbitrating slot collisions. - */ - /* XXX should take a locked ref to iv_bss */ - vap->iv_bss->ni_tstamp.tsf = ath_hal_gettsf64(ah); - } -} -#endif /* IEEE80211_SUPPORT_TDMA */ - static void ath_dfs_tasklet(void *p, int npending) { diff --git a/sys/dev/ath/if_ath_ahb.c b/sys/dev/ath/if_ath_ahb.c index 21c3529b6b8..a5bb413727e 100644 --- a/sys/dev/ath/if_ath_ahb.c +++ b/sys/dev/ath/if_ath_ahb.c @@ -35,6 +35,8 @@ __FBSDID("$FreeBSD$"); * AHB bus front-end for the Atheros Wireless LAN controller driver. */ +#include "opt_ath.h" + #include #include #include diff --git a/sys/dev/ath/if_ath_beacon.c b/sys/dev/ath/if_ath_beacon.c new file mode 100644 index 00000000000..c4b159a5977 --- /dev/null +++ b/sys/dev/ath/if_ath_beacon.c @@ -0,0 +1,841 @@ +/*- + * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Driver for the Atheros Wireless LAN controller. + * + * This software is derived from work of Atsushi Onoe; his contribution + * is greatly appreciated. + */ + +#include "opt_inet.h" +#include "opt_ath.h" +/* + * This is needed for register operations which are performed + * by the driver - eg, calls to ath_hal_gettsf32(). + * + * It's also required for any AH_DEBUG checks in here, eg the + * module dependencies. + */ +#include "opt_ah.h" +#include "opt_wlan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for mp_ncpus */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#ifdef IEEE80211_SUPPORT_SUPERG +#include +#endif + +#include + +#ifdef INET +#include +#include +#endif + +#include + +#include +#include +#include +#include + +#ifdef ATH_TX99_DIAG +#include +#endif + +/* + * Setup a h/w transmit queue for beacons. + */ +int +ath_beaconq_setup(struct ath_hal *ah) +{ + HAL_TXQ_INFO qi; + + memset(&qi, 0, sizeof(qi)); + qi.tqi_aifs = HAL_TXQ_USEDEFAULT; + qi.tqi_cwmin = HAL_TXQ_USEDEFAULT; + qi.tqi_cwmax = HAL_TXQ_USEDEFAULT; + /* NB: for dynamic turbo, don't enable any other interrupts */ + qi.tqi_qflags = HAL_TXQ_TXDESCINT_ENABLE; + return ath_hal_setuptxqueue(ah, HAL_TX_QUEUE_BEACON, &qi); +} + +/* + * Setup the transmit queue parameters for the beacon queue. + */ +int +ath_beaconq_config(struct ath_softc *sc) +{ +#define ATH_EXPONENT_TO_VALUE(v) ((1<<(v))-1) + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + struct ath_hal *ah = sc->sc_ah; + HAL_TXQ_INFO qi; + + ath_hal_gettxqueueprops(ah, sc->sc_bhalq, &qi); + if (ic->ic_opmode == IEEE80211_M_HOSTAP || + ic->ic_opmode == IEEE80211_M_MBSS) { + /* + * Always burst out beacon and CAB traffic. + */ + qi.tqi_aifs = ATH_BEACON_AIFS_DEFAULT; + qi.tqi_cwmin = ATH_BEACON_CWMIN_DEFAULT; + qi.tqi_cwmax = ATH_BEACON_CWMAX_DEFAULT; + } else { + struct wmeParams *wmep = + &ic->ic_wme.wme_chanParams.cap_wmeParams[WME_AC_BE]; + /* + * Adhoc mode; important thing is to use 2x cwmin. + */ + qi.tqi_aifs = wmep->wmep_aifsn; + qi.tqi_cwmin = 2*ATH_EXPONENT_TO_VALUE(wmep->wmep_logcwmin); + qi.tqi_cwmax = ATH_EXPONENT_TO_VALUE(wmep->wmep_logcwmax); + } + + if (!ath_hal_settxqueueprops(ah, sc->sc_bhalq, &qi)) { + device_printf(sc->sc_dev, "unable to update parameters for " + "beacon hardware queue!\n"); + return 0; + } else { + ath_hal_resettxqueue(ah, sc->sc_bhalq); /* push to h/w */ + return 1; + } +#undef ATH_EXPONENT_TO_VALUE +} + +/* + * Allocate and setup an initial beacon frame. + */ +int +ath_beacon_alloc(struct ath_softc *sc, struct ieee80211_node *ni) +{ + struct ieee80211vap *vap = ni->ni_vap; + struct ath_vap *avp = ATH_VAP(vap); + struct ath_buf *bf; + struct mbuf *m; + int error; + + bf = avp->av_bcbuf; + DPRINTF(sc, ATH_DEBUG_NODE, "%s: bf_m=%p, bf_node=%p\n", + __func__, bf->bf_m, bf->bf_node); + if (bf->bf_m != NULL) { + bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); + m_freem(bf->bf_m); + bf->bf_m = NULL; + } + if (bf->bf_node != NULL) { + ieee80211_free_node(bf->bf_node); + bf->bf_node = NULL; + } + + /* + * NB: the beacon data buffer must be 32-bit aligned; + * we assume the mbuf routines will return us something + * with this alignment (perhaps should assert). + */ + m = ieee80211_beacon_alloc(ni, &avp->av_boff); + if (m == NULL) { + device_printf(sc->sc_dev, "%s: cannot get mbuf\n", __func__); + sc->sc_stats.ast_be_nombuf++; + return ENOMEM; + } + error = bus_dmamap_load_mbuf_sg(sc->sc_dmat, bf->bf_dmamap, m, + bf->bf_segs, &bf->bf_nseg, + BUS_DMA_NOWAIT); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: cannot map mbuf, bus_dmamap_load_mbuf_sg returns %d\n", + __func__, error); + m_freem(m); + return error; + } + + /* + * Calculate a TSF adjustment factor required for staggered + * beacons. Note that we assume the format of the beacon + * frame leaves the tstamp field immediately following the + * header. + */ + if (sc->sc_stagbeacons && avp->av_bslot > 0) { + uint64_t tsfadjust; + struct ieee80211_frame *wh; + + /* + * The beacon interval is in TU's; the TSF is in usecs. + * We figure out how many TU's to add to align the timestamp + * then convert to TSF units and handle byte swapping before + * inserting it in the frame. The hardware will then add this + * each time a beacon frame is sent. Note that we align vap's + * 1..N and leave vap 0 untouched. This means vap 0 has a + * timestamp in one beacon interval while the others get a + * timstamp aligned to the next interval. + */ + tsfadjust = ni->ni_intval * + (ATH_BCBUF - avp->av_bslot) / ATH_BCBUF; + tsfadjust = htole64(tsfadjust << 10); /* TU -> TSF */ + + DPRINTF(sc, ATH_DEBUG_BEACON, + "%s: %s beacons bslot %d intval %u tsfadjust %llu\n", + __func__, sc->sc_stagbeacons ? "stagger" : "burst", + avp->av_bslot, ni->ni_intval, + (long long unsigned) le64toh(tsfadjust)); + + wh = mtod(m, struct ieee80211_frame *); + memcpy(&wh[1], &tsfadjust, sizeof(tsfadjust)); + } + bf->bf_m = m; + bf->bf_node = ieee80211_ref_node(ni); + + return 0; +} + +/* + * Setup the beacon frame for transmit. + */ +static void +ath_beacon_setup(struct ath_softc *sc, struct ath_buf *bf) +{ +#define USE_SHPREAMBLE(_ic) \ + (((_ic)->ic_flags & (IEEE80211_F_SHPREAMBLE | IEEE80211_F_USEBARKER))\ + == IEEE80211_F_SHPREAMBLE) + struct ieee80211_node *ni = bf->bf_node; + struct ieee80211com *ic = ni->ni_ic; + struct mbuf *m = bf->bf_m; + struct ath_hal *ah = sc->sc_ah; + struct ath_desc *ds; + int flags, antenna; + const HAL_RATE_TABLE *rt; + u_int8_t rix, rate; + + DPRINTF(sc, ATH_DEBUG_BEACON_PROC, "%s: m %p len %u\n", + __func__, m, m->m_len); + + /* setup descriptors */ + ds = bf->bf_desc; + bf->bf_last = bf; + bf->bf_lastds = ds; + + flags = HAL_TXDESC_NOACK; + if (ic->ic_opmode == IEEE80211_M_IBSS && sc->sc_hasveol) { + ds->ds_link = bf->bf_daddr; /* self-linked */ + flags |= HAL_TXDESC_VEOL; + /* + * Let hardware handle antenna switching. + */ + antenna = sc->sc_txantenna; + } else { + ds->ds_link = 0; + /* + * Switch antenna every 4 beacons. + * XXX assumes two antenna + */ + if (sc->sc_txantenna != 0) + antenna = sc->sc_txantenna; + else if (sc->sc_stagbeacons && sc->sc_nbcnvaps != 0) + antenna = ((sc->sc_stats.ast_be_xmit / sc->sc_nbcnvaps) & 4 ? 2 : 1); + else + antenna = (sc->sc_stats.ast_be_xmit & 4 ? 2 : 1); + } + + KASSERT(bf->bf_nseg == 1, + ("multi-segment beacon frame; nseg %u", bf->bf_nseg)); + ds->ds_data = bf->bf_segs[0].ds_addr; + /* + * Calculate rate code. + * XXX everything at min xmit rate + */ + rix = 0; + rt = sc->sc_currates; + rate = rt->info[rix].rateCode; + if (USE_SHPREAMBLE(ic)) + rate |= rt->info[rix].shortPreamble; + ath_hal_setuptxdesc(ah, ds + , m->m_len + IEEE80211_CRC_LEN /* frame length */ + , sizeof(struct ieee80211_frame)/* header length */ + , HAL_PKT_TYPE_BEACON /* Atheros packet type */ + , ni->ni_txpower /* txpower XXX */ + , rate, 1 /* series 0 rate/tries */ + , HAL_TXKEYIX_INVALID /* no encryption */ + , antenna /* antenna mode */ + , flags /* no ack, veol for beacons */ + , 0 /* rts/cts rate */ + , 0 /* rts/cts duration */ + ); + /* NB: beacon's BufLen must be a multiple of 4 bytes */ + ath_hal_filltxdesc(ah, ds + , roundup(m->m_len, 4) /* buffer length */ + , AH_TRUE /* first segment */ + , AH_TRUE /* last segment */ + , ds /* first descriptor */ + ); +#if 0 + ath_desc_swap(ds); +#endif +#undef USE_SHPREAMBLE +} + +void +ath_beacon_update(struct ieee80211vap *vap, int item) +{ + struct ieee80211_beacon_offsets *bo = &ATH_VAP(vap)->av_boff; + + setbit(bo->bo_flags, item); +} + +/* + * Transmit a beacon frame at SWBA. Dynamic updates to the + * frame contents are done as needed and the slot time is + * also adjusted based on current state. + */ +void +ath_beacon_proc(void *arg, int pending) +{ + struct ath_softc *sc = arg; + struct ath_hal *ah = sc->sc_ah; + struct ieee80211vap *vap; + struct ath_buf *bf; + int slot, otherant; + uint32_t bfaddr; + + DPRINTF(sc, ATH_DEBUG_BEACON_PROC, "%s: pending %u\n", + __func__, pending); + /* + * Check if the previous beacon has gone out. If + * not don't try to post another, skip this period + * and wait for the next. Missed beacons indicate + * a problem and should not occur. If we miss too + * many consecutive beacons reset the device. + */ + if (ath_hal_numtxpending(ah, sc->sc_bhalq) != 0) { + sc->sc_bmisscount++; + sc->sc_stats.ast_be_missed++; + DPRINTF(sc, ATH_DEBUG_BEACON, + "%s: missed %u consecutive beacons\n", + __func__, sc->sc_bmisscount); + if (sc->sc_bmisscount >= ath_bstuck_threshold) + taskqueue_enqueue(sc->sc_tq, &sc->sc_bstucktask); + return; + } + if (sc->sc_bmisscount != 0) { + DPRINTF(sc, ATH_DEBUG_BEACON, + "%s: resume beacon xmit after %u misses\n", + __func__, sc->sc_bmisscount); + sc->sc_bmisscount = 0; + } + + if (sc->sc_stagbeacons) { /* staggered beacons */ + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + uint32_t tsftu; + + tsftu = ath_hal_gettsf32(ah) >> 10; + /* XXX lintval */ + slot = ((tsftu % ic->ic_lintval) * ATH_BCBUF) / ic->ic_lintval; + vap = sc->sc_bslot[(slot+1) % ATH_BCBUF]; + bfaddr = 0; + if (vap != NULL && vap->iv_state >= IEEE80211_S_RUN) { + bf = ath_beacon_generate(sc, vap); + if (bf != NULL) + bfaddr = bf->bf_daddr; + } + } else { /* burst'd beacons */ + uint32_t *bflink = &bfaddr; + + for (slot = 0; slot < ATH_BCBUF; slot++) { + vap = sc->sc_bslot[slot]; + if (vap != NULL && vap->iv_state >= IEEE80211_S_RUN) { + bf = ath_beacon_generate(sc, vap); + if (bf != NULL) { + *bflink = bf->bf_daddr; + bflink = &bf->bf_desc->ds_link; + } + } + } + *bflink = 0; /* terminate list */ + } + + /* + * Handle slot time change when a non-ERP station joins/leaves + * an 11g network. The 802.11 layer notifies us via callback, + * we mark updateslot, then wait one beacon before effecting + * the change. This gives associated stations at least one + * beacon interval to note the state change. + */ + /* XXX locking */ + if (sc->sc_updateslot == UPDATE) { + sc->sc_updateslot = COMMIT; /* commit next beacon */ + sc->sc_slotupdate = slot; + } else if (sc->sc_updateslot == COMMIT && sc->sc_slotupdate == slot) + ath_setslottime(sc); /* commit change to h/w */ + + /* + * Check recent per-antenna transmit statistics and flip + * the default antenna if noticeably more frames went out + * on the non-default antenna. + * XXX assumes 2 anntenae + */ + if (!sc->sc_diversity && (!sc->sc_stagbeacons || slot == 0)) { + otherant = sc->sc_defant & 1 ? 2 : 1; + if (sc->sc_ant_tx[otherant] > sc->sc_ant_tx[sc->sc_defant] + 2) + ath_setdefantenna(sc, otherant); + sc->sc_ant_tx[1] = sc->sc_ant_tx[2] = 0; + } + + if (bfaddr != 0) { + /* + * Stop any current dma and put the new frame on the queue. + * This should never fail since we check above that no frames + * are still pending on the queue. + */ + if (!ath_hal_stoptxdma(ah, sc->sc_bhalq)) { + DPRINTF(sc, ATH_DEBUG_ANY, + "%s: beacon queue %u did not stop?\n", + __func__, sc->sc_bhalq); + } + /* NB: cabq traffic should already be queued and primed */ + ath_hal_puttxbuf(ah, sc->sc_bhalq, bfaddr); + ath_hal_txstart(ah, sc->sc_bhalq); + + sc->sc_stats.ast_be_xmit++; + } +} + +struct ath_buf * +ath_beacon_generate(struct ath_softc *sc, struct ieee80211vap *vap) +{ + struct ath_vap *avp = ATH_VAP(vap); + struct ath_txq *cabq = sc->sc_cabq; + struct ath_buf *bf; + struct mbuf *m; + int nmcastq, error; + + KASSERT(vap->iv_state >= IEEE80211_S_RUN, + ("not running, state %d", vap->iv_state)); + KASSERT(avp->av_bcbuf != NULL, ("no beacon buffer")); + + /* + * Update dynamic beacon contents. If this returns + * non-zero then we need to remap the memory because + * the beacon frame changed size (probably because + * of the TIM bitmap). + */ + bf = avp->av_bcbuf; + m = bf->bf_m; + /* XXX lock mcastq? */ + nmcastq = avp->av_mcastq.axq_depth; + + if (ieee80211_beacon_update(bf->bf_node, &avp->av_boff, m, nmcastq)) { + /* XXX too conservative? */ + bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); + error = bus_dmamap_load_mbuf_sg(sc->sc_dmat, bf->bf_dmamap, m, + bf->bf_segs, &bf->bf_nseg, + BUS_DMA_NOWAIT); + if (error != 0) { + if_printf(vap->iv_ifp, + "%s: bus_dmamap_load_mbuf_sg failed, error %u\n", + __func__, error); + return NULL; + } + } + if ((avp->av_boff.bo_tim[4] & 1) && cabq->axq_depth) { + DPRINTF(sc, ATH_DEBUG_BEACON, + "%s: cabq did not drain, mcastq %u cabq %u\n", + __func__, nmcastq, cabq->axq_depth); + sc->sc_stats.ast_cabq_busy++; + if (sc->sc_nvaps > 1 && sc->sc_stagbeacons) { + /* + * CABQ traffic from a previous vap is still pending. + * We must drain the q before this beacon frame goes + * out as otherwise this vap's stations will get cab + * frames from a different vap. + * XXX could be slow causing us to miss DBA + */ + ath_tx_draintxq(sc, cabq); + } + } + ath_beacon_setup(sc, bf); + bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMASYNC_PREWRITE); + + /* + * Enable the CAB queue before the beacon queue to + * insure cab frames are triggered by this beacon. + */ + if (avp->av_boff.bo_tim[4] & 1) { + struct ath_hal *ah = sc->sc_ah; + + /* NB: only at DTIM */ + ATH_TXQ_LOCK(cabq); + ATH_TXQ_LOCK(&avp->av_mcastq); + if (nmcastq) { + struct ath_buf *bfm; + + /* + * Move frames from the s/w mcast q to the h/w cab q. + * XXX MORE_DATA bit + */ + bfm = TAILQ_FIRST(&avp->av_mcastq.axq_q); + if (cabq->axq_link != NULL) { + *cabq->axq_link = bfm->bf_daddr; + } else + ath_hal_puttxbuf(ah, cabq->axq_qnum, + bfm->bf_daddr); + ath_txqmove(cabq, &avp->av_mcastq); + + sc->sc_stats.ast_cabq_xmit += nmcastq; + } + /* NB: gated by beacon so safe to start here */ + if (! TAILQ_EMPTY(&(cabq->axq_q))) + ath_hal_txstart(ah, cabq->axq_qnum); + ATH_TXQ_UNLOCK(&avp->av_mcastq); + ATH_TXQ_UNLOCK(cabq); + } + return bf; +} + +void +ath_beacon_start_adhoc(struct ath_softc *sc, struct ieee80211vap *vap) +{ + struct ath_vap *avp = ATH_VAP(vap); + struct ath_hal *ah = sc->sc_ah; + struct ath_buf *bf; + struct mbuf *m; + int error; + + KASSERT(avp->av_bcbuf != NULL, ("no beacon buffer")); + + /* + * Update dynamic beacon contents. If this returns + * non-zero then we need to remap the memory because + * the beacon frame changed size (probably because + * of the TIM bitmap). + */ + bf = avp->av_bcbuf; + m = bf->bf_m; + if (ieee80211_beacon_update(bf->bf_node, &avp->av_boff, m, 0)) { + /* XXX too conservative? */ + bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); + error = bus_dmamap_load_mbuf_sg(sc->sc_dmat, bf->bf_dmamap, m, + bf->bf_segs, &bf->bf_nseg, + BUS_DMA_NOWAIT); + if (error != 0) { + if_printf(vap->iv_ifp, + "%s: bus_dmamap_load_mbuf_sg failed, error %u\n", + __func__, error); + return; + } + } + ath_beacon_setup(sc, bf); + bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMASYNC_PREWRITE); + + /* NB: caller is known to have already stopped tx dma */ + ath_hal_puttxbuf(ah, sc->sc_bhalq, bf->bf_daddr); + ath_hal_txstart(ah, sc->sc_bhalq); +} + +/* + * Reclaim beacon resources and return buffer to the pool. + */ +void +ath_beacon_return(struct ath_softc *sc, struct ath_buf *bf) +{ + + DPRINTF(sc, ATH_DEBUG_NODE, "%s: free bf=%p, bf_m=%p, bf_node=%p\n", + __func__, bf, bf->bf_m, bf->bf_node); + if (bf->bf_m != NULL) { + bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); + m_freem(bf->bf_m); + bf->bf_m = NULL; + } + if (bf->bf_node != NULL) { + ieee80211_free_node(bf->bf_node); + bf->bf_node = NULL; + } + TAILQ_INSERT_TAIL(&sc->sc_bbuf, bf, bf_list); +} + +/* + * Reclaim beacon resources. + */ +void +ath_beacon_free(struct ath_softc *sc) +{ + struct ath_buf *bf; + + TAILQ_FOREACH(bf, &sc->sc_bbuf, bf_list) { + DPRINTF(sc, ATH_DEBUG_NODE, + "%s: free bf=%p, bf_m=%p, bf_node=%p\n", + __func__, bf, bf->bf_m, bf->bf_node); + if (bf->bf_m != NULL) { + bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); + m_freem(bf->bf_m); + bf->bf_m = NULL; + } + if (bf->bf_node != NULL) { + ieee80211_free_node(bf->bf_node); + bf->bf_node = NULL; + } + } +} + +/* + * Configure the beacon and sleep timers. + * + * When operating as an AP this resets the TSF and sets + * up the hardware to notify us when we need to issue beacons. + * + * When operating in station mode this sets up the beacon + * timers according to the timestamp of the last received + * beacon and the current TSF, configures PCF and DTIM + * handling, programs the sleep registers so the hardware + * will wakeup in time to receive beacons, and configures + * the beacon miss handling so we'll receive a BMISS + * interrupt when we stop seeing beacons from the AP + * we've associated with. + */ +void +ath_beacon_config(struct ath_softc *sc, struct ieee80211vap *vap) +{ +#define TSF_TO_TU(_h,_l) \ + ((((u_int32_t)(_h)) << 22) | (((u_int32_t)(_l)) >> 10)) +#define FUDGE 2 + struct ath_hal *ah = sc->sc_ah; + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + struct ieee80211_node *ni; + u_int32_t nexttbtt, intval, tsftu; + u_int64_t tsf; + + if (vap == NULL) + vap = TAILQ_FIRST(&ic->ic_vaps); /* XXX */ + ni = ieee80211_ref_node(vap->iv_bss); + + /* extract tstamp from last beacon and convert to TU */ + nexttbtt = TSF_TO_TU(LE_READ_4(ni->ni_tstamp.data + 4), + LE_READ_4(ni->ni_tstamp.data)); + if (ic->ic_opmode == IEEE80211_M_HOSTAP || + ic->ic_opmode == IEEE80211_M_MBSS) { + /* + * For multi-bss ap/mesh support beacons are either staggered + * evenly over N slots or burst together. For the former + * arrange for the SWBA to be delivered for each slot. + * Slots that are not occupied will generate nothing. + */ + /* NB: the beacon interval is kept internally in TU's */ + intval = ni->ni_intval & HAL_BEACON_PERIOD; + if (sc->sc_stagbeacons) + intval /= ATH_BCBUF; + } else { + /* NB: the beacon interval is kept internally in TU's */ + intval = ni->ni_intval & HAL_BEACON_PERIOD; + } + if (nexttbtt == 0) /* e.g. for ap mode */ + nexttbtt = intval; + else if (intval) /* NB: can be 0 for monitor mode */ + nexttbtt = roundup(nexttbtt, intval); + DPRINTF(sc, ATH_DEBUG_BEACON, "%s: nexttbtt %u intval %u (%u)\n", + __func__, nexttbtt, intval, ni->ni_intval); + if (ic->ic_opmode == IEEE80211_M_STA && !sc->sc_swbmiss) { + HAL_BEACON_STATE bs; + int dtimperiod, dtimcount; + int cfpperiod, cfpcount; + + /* + * Setup dtim and cfp parameters according to + * last beacon we received (which may be none). + */ + dtimperiod = ni->ni_dtim_period; + if (dtimperiod <= 0) /* NB: 0 if not known */ + dtimperiod = 1; + dtimcount = ni->ni_dtim_count; + if (dtimcount >= dtimperiod) /* NB: sanity check */ + dtimcount = 0; /* XXX? */ + cfpperiod = 1; /* NB: no PCF support yet */ + cfpcount = 0; + /* + * Pull nexttbtt forward to reflect the current + * TSF and calculate dtim+cfp state for the result. + */ + tsf = ath_hal_gettsf64(ah); + tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE; + do { + nexttbtt += intval; + if (--dtimcount < 0) { + dtimcount = dtimperiod - 1; + if (--cfpcount < 0) + cfpcount = cfpperiod - 1; + } + } while (nexttbtt < tsftu); + memset(&bs, 0, sizeof(bs)); + bs.bs_intval = intval; + bs.bs_nexttbtt = nexttbtt; + bs.bs_dtimperiod = dtimperiod*intval; + bs.bs_nextdtim = bs.bs_nexttbtt + dtimcount*intval; + bs.bs_cfpperiod = cfpperiod*bs.bs_dtimperiod; + bs.bs_cfpnext = bs.bs_nextdtim + cfpcount*bs.bs_dtimperiod; + bs.bs_cfpmaxduration = 0; +#if 0 + /* + * The 802.11 layer records the offset to the DTIM + * bitmap while receiving beacons; use it here to + * enable h/w detection of our AID being marked in + * the bitmap vector (to indicate frames for us are + * pending at the AP). + * XXX do DTIM handling in s/w to WAR old h/w bugs + * XXX enable based on h/w rev for newer chips + */ + bs.bs_timoffset = ni->ni_timoff; +#endif + /* + * Calculate the number of consecutive beacons to miss + * before taking a BMISS interrupt. + * Note that we clamp the result to at most 10 beacons. + */ + bs.bs_bmissthreshold = vap->iv_bmissthreshold; + if (bs.bs_bmissthreshold > 10) + bs.bs_bmissthreshold = 10; + else if (bs.bs_bmissthreshold <= 0) + bs.bs_bmissthreshold = 1; + + /* + * Calculate sleep duration. The configuration is + * given in ms. We insure a multiple of the beacon + * period is used. Also, if the sleep duration is + * greater than the DTIM period then it makes senses + * to make it a multiple of that. + * + * XXX fixed at 100ms + */ + bs.bs_sleepduration = + roundup(IEEE80211_MS_TO_TU(100), bs.bs_intval); + if (bs.bs_sleepduration > bs.bs_dtimperiod) + bs.bs_sleepduration = roundup(bs.bs_sleepduration, bs.bs_dtimperiod); + + DPRINTF(sc, ATH_DEBUG_BEACON, + "%s: tsf %ju tsf:tu %u intval %u nexttbtt %u dtim %u nextdtim %u bmiss %u sleep %u cfp:period %u maxdur %u next %u timoffset %u\n" + , __func__ + , tsf, tsftu + , bs.bs_intval + , bs.bs_nexttbtt + , bs.bs_dtimperiod + , bs.bs_nextdtim + , bs.bs_bmissthreshold + , bs.bs_sleepduration + , bs.bs_cfpperiod + , bs.bs_cfpmaxduration + , bs.bs_cfpnext + , bs.bs_timoffset + ); + ath_hal_intrset(ah, 0); + ath_hal_beacontimers(ah, &bs); + sc->sc_imask |= HAL_INT_BMISS; + ath_hal_intrset(ah, sc->sc_imask); + } else { + ath_hal_intrset(ah, 0); + if (nexttbtt == intval) + intval |= HAL_BEACON_RESET_TSF; + if (ic->ic_opmode == IEEE80211_M_IBSS) { + /* + * In IBSS mode enable the beacon timers but only + * enable SWBA interrupts if we need to manually + * prepare beacon frames. Otherwise we use a + * self-linked tx descriptor and let the hardware + * deal with things. + */ + intval |= HAL_BEACON_ENA; + if (!sc->sc_hasveol) + sc->sc_imask |= HAL_INT_SWBA; + if ((intval & HAL_BEACON_RESET_TSF) == 0) { + /* + * Pull nexttbtt forward to reflect + * the current TSF. + */ + tsf = ath_hal_gettsf64(ah); + tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE; + do { + nexttbtt += intval; + } while (nexttbtt < tsftu); + } + ath_beaconq_config(sc); + } else if (ic->ic_opmode == IEEE80211_M_HOSTAP || + ic->ic_opmode == IEEE80211_M_MBSS) { + /* + * In AP/mesh mode we enable the beacon timers + * and SWBA interrupts to prepare beacon frames. + */ + intval |= HAL_BEACON_ENA; + sc->sc_imask |= HAL_INT_SWBA; /* beacon prepare */ + ath_beaconq_config(sc); + } + ath_hal_beaconinit(ah, nexttbtt, intval); + sc->sc_bmisscount = 0; + ath_hal_intrset(ah, sc->sc_imask); + /* + * When using a self-linked beacon descriptor in + * ibss mode load it once here. + */ + if (ic->ic_opmode == IEEE80211_M_IBSS && sc->sc_hasveol) + ath_beacon_start_adhoc(sc, vap); + } + sc->sc_syncbeacon = 0; + ieee80211_free_node(ni); +#undef FUDGE +#undef TSF_TO_TU +} diff --git a/sys/dev/ath/if_ath_beacon.h b/sys/dev/ath/if_ath_beacon.h new file mode 100644 index 00000000000..2e279a1c014 --- /dev/null +++ b/sys/dev/ath/if_ath_beacon.h @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ +#ifndef __IF_ATH_BEACON_H__ +#define __IF_ATH_BEACON_H__ + +extern int ath_bstuck_threshold; + +extern int ath_beaconq_setup(struct ath_hal *ah); +extern int ath_beaconq_config(struct ath_softc *sc); +extern void ath_beacon_config(struct ath_softc *sc, + struct ieee80211vap *vap); +extern struct ath_buf * ath_beacon_generate(struct ath_softc *sc, + struct ieee80211vap *vap); +extern int ath_wme_update(struct ieee80211com *ic); +extern void ath_beacon_update(struct ieee80211vap *vap, int item); +extern void ath_beacon_start_adhoc(struct ath_softc *sc, + struct ieee80211vap *vap); +extern int ath_beacon_alloc(struct ath_softc *sc, struct ieee80211_node *ni); +extern void ath_beacon_return(struct ath_softc *sc, struct ath_buf *bf); +extern void ath_beacon_free(struct ath_softc *sc); +extern void ath_beacon_proc(void *arg, int pending); + +#endif diff --git a/sys/dev/ath/if_ath_debug.c b/sys/dev/ath/if_ath_debug.c index b438455a53d..da898be3cc2 100644 --- a/sys/dev/ath/if_ath_debug.c +++ b/sys/dev/ath/if_ath_debug.c @@ -89,12 +89,12 @@ __FBSDID("$FreeBSD$"); #ifdef ATH_DEBUG #include -int ath_debug = 0; +uint64_t ath_debug = 0; SYSCTL_DECL(_hw_ath); -SYSCTL_INT(_hw_ath, OID_AUTO, debug, CTLFLAG_RW, &ath_debug, +SYSCTL_QUAD(_hw_ath, OID_AUTO, debug, CTLFLAG_RW, &ath_debug, 0, "control debugging printfs"); -TUNABLE_INT("hw.ath.debug", &ath_debug); +TUNABLE_QUAD("hw.ath.debug", &ath_debug); void ath_printrxbuf(struct ath_softc *sc, const struct ath_buf *bf, @@ -118,6 +118,16 @@ ath_printrxbuf(struct ath_softc *sc, const struct ath_buf *bf, ds->ds_hw[2], ds->ds_hw[3], ds->ds_hw[4], ds->ds_hw[5], ds->ds_hw[6], ds->ds_hw[7], ds->ds_hw[8]); + } else if (ah->ah_magic == 0x19741014) { + printf(" %08x %08x %08x %08x %08x %08x %08x\n", + ds->ds_hw[2], ds->ds_hw[3], ds->ds_hw[4], + ds->ds_hw[5], ds->ds_hw[6], ds->ds_hw[7], + ds->ds_hw[8]); + + printf(" %08x %08x %08x %08x %08x %08x %08x\n", + ds->ds_hw[9], ds->ds_hw[10], ds->ds_hw[11], + ds->ds_hw[12], ds->ds_hw[13], ds->ds_hw[14], + ds->ds_hw[15]); } } } @@ -144,9 +154,6 @@ ath_printtxbuf(struct ath_softc *sc, const struct ath_buf *first_bf, bf->bf_state.bfs_retries, bf->bf_state.bfs_addedbaw, bf->bf_state.bfs_dobaw); - printf(" SEQNO_ASSIGNED: %d, NEED_SEQNO: %d\n", - bf->bf_state.bfs_seqno_assigned, - bf->bf_state.bfs_need_seqno); printf(" %08x %08x %08x %08x %08x %08x\n", ds->ds_ctl0, ds->ds_ctl1, ds->ds_hw[0], ds->ds_hw[1], diff --git a/sys/dev/ath/if_ath_debug.h b/sys/dev/ath/if_ath_debug.h index 58199ff39d6..2e6ebf5f4c0 100644 --- a/sys/dev/ath/if_ath_debug.h +++ b/sys/dev/ath/if_ath_debug.h @@ -34,39 +34,45 @@ #ifdef ATH_DEBUG enum { - ATH_DEBUG_XMIT = 0x00000001, /* basic xmit operation */ - ATH_DEBUG_XMIT_DESC = 0x00000002, /* xmit descriptors */ - ATH_DEBUG_RECV = 0x00000004, /* basic recv operation */ - ATH_DEBUG_RECV_DESC = 0x00000008, /* recv descriptors */ - ATH_DEBUG_RATE = 0x00000010, /* rate control */ - ATH_DEBUG_RESET = 0x00000020, /* reset processing */ - ATH_DEBUG_MODE = 0x00000040, /* mode init/setup */ - ATH_DEBUG_BEACON = 0x00000080, /* beacon handling */ - ATH_DEBUG_WATCHDOG = 0x00000100, /* watchdog timeout */ - ATH_DEBUG_INTR = 0x00001000, /* ISR */ - ATH_DEBUG_TX_PROC = 0x00002000, /* tx ISR proc */ - ATH_DEBUG_RX_PROC = 0x00004000, /* rx ISR proc */ - ATH_DEBUG_BEACON_PROC = 0x00008000, /* beacon ISR proc */ - ATH_DEBUG_CALIBRATE = 0x00010000, /* periodic calibration */ - ATH_DEBUG_KEYCACHE = 0x00020000, /* key cache management */ - ATH_DEBUG_STATE = 0x00040000, /* 802.11 state transitions */ - ATH_DEBUG_NODE = 0x00080000, /* node management */ - ATH_DEBUG_LED = 0x00100000, /* led management */ - ATH_DEBUG_FF = 0x00200000, /* fast frames */ - ATH_DEBUG_DFS = 0x00400000, /* DFS processing */ - ATH_DEBUG_TDMA = 0x00800000, /* TDMA processing */ - ATH_DEBUG_TDMA_TIMER = 0x01000000, /* TDMA timer processing */ - ATH_DEBUG_REGDOMAIN = 0x02000000, /* regulatory processing */ - ATH_DEBUG_SW_TX = 0x04000000, /* per-packet software TX */ - ATH_DEBUG_SW_TX_BAW = 0x08000000, /* BAW handling */ - ATH_DEBUG_SW_TX_CTRL = 0x10000000, /* queue control */ - ATH_DEBUG_SW_TX_AGGR = 0x20000000, /* aggregate TX */ - ATH_DEBUG_SW_TX_RETRIES = 0x40000000, /* software TX retries */ - ATH_DEBUG_FATAL = 0x80000000, /* fatal errors */ - ATH_DEBUG_ANY = 0xffffffff + ATH_DEBUG_XMIT = 0x000000001ULL, /* basic xmit operation */ + ATH_DEBUG_XMIT_DESC = 0x000000002ULL, /* xmit descriptors */ + ATH_DEBUG_RECV = 0x000000004ULL, /* basic recv operation */ + ATH_DEBUG_RECV_DESC = 0x000000008ULL, /* recv descriptors */ + ATH_DEBUG_RATE = 0x000000010ULL, /* rate control */ + ATH_DEBUG_RESET = 0x000000020ULL, /* reset processing */ + ATH_DEBUG_MODE = 0x000000040ULL, /* mode init/setup */ + ATH_DEBUG_BEACON = 0x000000080ULL, /* beacon handling */ + ATH_DEBUG_WATCHDOG = 0x000000100ULL, /* watchdog timeout */ + ATH_DEBUG_INTR = 0x000001000ULL, /* ISR */ + ATH_DEBUG_TX_PROC = 0x000002000ULL, /* tx ISR proc */ + ATH_DEBUG_RX_PROC = 0x000004000ULL, /* rx ISR proc */ + ATH_DEBUG_BEACON_PROC = 0x000008000ULL, /* beacon ISR proc */ + ATH_DEBUG_CALIBRATE = 0x000010000ULL, /* periodic calibration */ + ATH_DEBUG_KEYCACHE = 0x000020000ULL, /* key cache management */ + ATH_DEBUG_STATE = 0x000040000ULL, /* 802.11 state transitions */ + ATH_DEBUG_NODE = 0x000080000ULL, /* node management */ + ATH_DEBUG_LED = 0x000100000ULL, /* led management */ + ATH_DEBUG_FF = 0x000200000ULL, /* fast frames */ + ATH_DEBUG_DFS = 0x000400000ULL, /* DFS processing */ + ATH_DEBUG_TDMA = 0x000800000ULL, /* TDMA processing */ + ATH_DEBUG_TDMA_TIMER = 0x001000000ULL, /* TDMA timer processing */ + ATH_DEBUG_REGDOMAIN = 0x002000000ULL, /* regulatory processing */ + ATH_DEBUG_SW_TX = 0x004000000ULL, /* per-packet software TX */ + ATH_DEBUG_SW_TX_BAW = 0x008000000ULL, /* BAW handling */ + ATH_DEBUG_SW_TX_CTRL = 0x010000000ULL, /* queue control */ + ATH_DEBUG_SW_TX_AGGR = 0x020000000ULL, /* aggregate TX */ + ATH_DEBUG_SW_TX_RETRIES = 0x040000000ULL, /* software TX retries */ + ATH_DEBUG_FATAL = 0x080000000ULL, /* fatal errors */ + ATH_DEBUG_SW_TX_BAR = 0x100000000ULL, /* BAR TX */ + ATH_DEBUG_EDMA_RX = 0x200000000ULL, /* RX EDMA state */ + + ATH_DEBUG_ANY = 0xffffffffffffffffULL }; -extern int ath_debug; +#define ATH_KTR_INTR KTR_SPARE4 +#define ATH_KTR_ERR KTR_SPARE3 + +extern uint64_t ath_debug; #define IFF_DUMPPKTS(sc, m) \ ((sc->sc_debug & (m)) || \ @@ -85,6 +91,9 @@ extern void ath_printrxbuf(struct ath_softc *, const struct ath_buf *bf, extern void ath_printtxbuf(struct ath_softc *, const struct ath_buf *bf, u_int qnum, u_int ix, int done); #else /* ATH_DEBUG */ +#define ATH_KTR_INTR 0 +#define ATH_KTR_ERR 0 + #define IFF_DUMPPKTS(sc, m) \ ((sc->sc_ifp->if_flags & (IFF_DEBUG|IFF_LINK2)) == (IFF_DEBUG|IFF_LINK2)) #define DPRINTF(sc, m, fmt, ...) do { \ diff --git a/sys/dev/ath/if_ath_led.c b/sys/dev/ath/if_ath_led.c index 47ae3e10117..33cc512ebf1 100644 --- a/sys/dev/ath/if_ath_led.c +++ b/sys/dev/ath/if_ath_led.c @@ -125,7 +125,7 @@ ath_led_config(struct ath_softc *sc) /* Software LED blinking - GPIO controlled LED */ if (sc->sc_softled) { ath_hal_gpioCfgOutput(sc->sc_ah, sc->sc_ledpin, - HAL_GPIO_MUX_OUTPUT); + HAL_GPIO_OUTPUT_MUX_AS_OUTPUT); ath_hal_gpioset(sc->sc_ah, sc->sc_ledpin, !sc->sc_ledon); } @@ -139,10 +139,10 @@ ath_led_config(struct ath_softc *sc) */ if (sc->sc_led_pwr_pin > 0) ath_hal_gpioCfgOutput(sc->sc_ah, sc->sc_led_pwr_pin, - HAL_GPIO_MUX_MAC_POWER_LED); + HAL_GPIO_OUTPUT_MUX_MAC_POWER_LED); if (sc->sc_led_net_pin > 0) ath_hal_gpioCfgOutput(sc->sc_ah, sc->sc_led_net_pin, - HAL_GPIO_MUX_MAC_NETWORK_LED); + HAL_GPIO_OUTPUT_MUX_MAC_NETWORK_LED); } } diff --git a/sys/dev/ath/if_ath_misc.h b/sys/dev/ath/if_ath_misc.h index c48590edac4..0a51feeec76 100644 --- a/sys/dev/ath/if_ath_misc.h +++ b/sys/dev/ath/if_ath_misc.h @@ -48,13 +48,22 @@ ((((u_int8_t *)(p))[0] ) | (((u_int8_t *)(p))[1] << 8) | \ (((u_int8_t *)(p))[2] << 16) | (((u_int8_t *)(p))[3] << 24))) +extern int ath_rxbuf; +extern int ath_txbuf; +extern int ath_txbuf_mgmt; + extern int ath_tx_findrix(const struct ath_softc *sc, uint8_t rate); -extern struct ath_buf * ath_getbuf(struct ath_softc *sc); -extern struct ath_buf * _ath_getbuf_locked(struct ath_softc *sc); +extern struct ath_buf * ath_getbuf(struct ath_softc *sc, + ath_buf_type_t btype); +extern struct ath_buf * _ath_getbuf_locked(struct ath_softc *sc, + ath_buf_type_t btype); extern struct ath_buf * ath_buf_clone(struct ath_softc *sc, const struct ath_buf *bf); +/* XXX change this to NULL the buffer pointer? */ extern void ath_freebuf(struct ath_softc *sc, struct ath_buf *bf); +extern void ath_returnbuf_head(struct ath_softc *sc, struct ath_buf *bf); +extern void ath_returnbuf_tail(struct ath_softc *sc, struct ath_buf *bf); extern int ath_reset(struct ifnet *, ATH_RESET_TYPE); extern void ath_tx_draintxq(struct ath_softc *sc, struct ath_txq *txq); @@ -67,4 +76,33 @@ extern void ath_tx_update_ratectrl(struct ath_softc *sc, extern void ath_tx_freebuf(struct ath_softc *sc, struct ath_buf *bf, int status); +extern void ath_txqmove(struct ath_txq *dst, struct ath_txq *src); + +extern void ath_mode_init(struct ath_softc *sc); + +extern void ath_setdefantenna(struct ath_softc *sc, u_int antenna); + +extern void ath_setslottime(struct ath_softc *sc); + +extern int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, + ath_bufhead *head, const char *name, int nbuf, int ndesc); +extern void ath_descdma_cleanup(struct ath_softc *sc, + struct ath_descdma *dd, ath_bufhead *head); + +/* + * This is only here so that the RX proc function can call it. + * It's very likely that the "start TX after RX" call should be + * done via something in if_ath.c, moving "rx tasklet" into + * if_ath.c and do the ath_start() call there. Once that's done, + * we can kill this. + */ +extern void ath_start(struct ifnet *ifp); + +static inline void +ath_tx_kick(struct ath_softc *sc) +{ + + ath_start(sc->sc_ifp); +} + #endif diff --git a/sys/dev/ath/if_ath_rx.c b/sys/dev/ath/if_ath_rx.c new file mode 100644 index 00000000000..eba6ba53960 --- /dev/null +++ b/sys/dev/ath/if_ath_rx.c @@ -0,0 +1,1102 @@ +/*- + * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Driver for the Atheros Wireless LAN controller. + * + * This software is derived from work of Atsushi Onoe; his contribution + * is greatly appreciated. + */ + +#include "opt_inet.h" +#include "opt_ath.h" +/* + * This is needed for register operations which are performed + * by the driver - eg, calls to ath_hal_gettsf32(). + * + * It's also required for any AH_DEBUG checks in here, eg the + * module dependencies. + */ +#include "opt_ah.h" +#include "opt_wlan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for mp_ncpus */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#ifdef IEEE80211_SUPPORT_SUPERG +#include +#endif +#ifdef IEEE80211_SUPPORT_TDMA +#include +#endif + +#include + +#ifdef INET +#include +#include +#endif + +#include +#include /* XXX for softled */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef ATH_TX99_DIAG +#include +#endif + +/* + * Calculate the receive filter according to the + * operating mode and state: + * + * o always accept unicast, broadcast, and multicast traffic + * o accept PHY error frames when hardware doesn't have MIB support + * to count and we need them for ANI (sta mode only until recently) + * and we are not scanning (ANI is disabled) + * NB: older hal's add rx filter bits out of sight and we need to + * blindly preserve them + * o probe request frames are accepted only when operating in + * hostap, adhoc, mesh, or monitor modes + * o enable promiscuous mode + * - when in monitor mode + * - if interface marked PROMISC (assumes bridge setting is filtered) + * o accept beacons: + * - when operating in station mode for collecting rssi data when + * the station is otherwise quiet, or + * - when operating in adhoc mode so the 802.11 layer creates + * node table entries for peers, + * - when scanning + * - when doing s/w beacon miss (e.g. for ap+sta) + * - when operating in ap mode in 11g to detect overlapping bss that + * require protection + * - when operating in mesh mode to detect neighbors + * o accept control frames: + * - when in monitor mode + * XXX HT protection for 11n + */ +u_int32_t +ath_calcrxfilter(struct ath_softc *sc) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + u_int32_t rfilt; + + rfilt = HAL_RX_FILTER_UCAST | HAL_RX_FILTER_BCAST | HAL_RX_FILTER_MCAST; + if (!sc->sc_needmib && !sc->sc_scanning) + rfilt |= HAL_RX_FILTER_PHYERR; + if (ic->ic_opmode != IEEE80211_M_STA) + rfilt |= HAL_RX_FILTER_PROBEREQ; + /* XXX ic->ic_monvaps != 0? */ + if (ic->ic_opmode == IEEE80211_M_MONITOR || (ifp->if_flags & IFF_PROMISC)) + rfilt |= HAL_RX_FILTER_PROM; + if (ic->ic_opmode == IEEE80211_M_STA || + ic->ic_opmode == IEEE80211_M_IBSS || + sc->sc_swbmiss || sc->sc_scanning) + rfilt |= HAL_RX_FILTER_BEACON; + /* + * NB: We don't recalculate the rx filter when + * ic_protmode changes; otherwise we could do + * this only when ic_protmode != NONE. + */ + if (ic->ic_opmode == IEEE80211_M_HOSTAP && + IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) + rfilt |= HAL_RX_FILTER_BEACON; + + /* + * Enable hardware PS-POLL RX only for hostap mode; + * STA mode sends PS-POLL frames but never + * receives them. + */ + if (ath_hal_getcapability(sc->sc_ah, HAL_CAP_PSPOLL, + 0, NULL) == HAL_OK && + ic->ic_opmode == IEEE80211_M_HOSTAP) + rfilt |= HAL_RX_FILTER_PSPOLL; + + if (sc->sc_nmeshvaps) { + rfilt |= HAL_RX_FILTER_BEACON; + if (sc->sc_hasbmatch) + rfilt |= HAL_RX_FILTER_BSSID; + else + rfilt |= HAL_RX_FILTER_PROM; + } + if (ic->ic_opmode == IEEE80211_M_MONITOR) + rfilt |= HAL_RX_FILTER_CONTROL; + + /* + * Enable RX of compressed BAR frames only when doing + * 802.11n. Required for A-MPDU. + */ + if (IEEE80211_IS_CHAN_HT(ic->ic_curchan)) + rfilt |= HAL_RX_FILTER_COMPBAR; + + /* + * Enable radar PHY errors if requested by the + * DFS module. + */ + if (sc->sc_dodfs) + rfilt |= HAL_RX_FILTER_PHYRADAR; + + DPRINTF(sc, ATH_DEBUG_MODE, "%s: RX filter 0x%x, %s if_flags 0x%x\n", + __func__, rfilt, ieee80211_opmode_name[ic->ic_opmode], ifp->if_flags); + return rfilt; +} + +static int +ath_legacy_rxbuf_init(struct ath_softc *sc, struct ath_buf *bf) +{ + struct ath_hal *ah = sc->sc_ah; + int error; + struct mbuf *m; + struct ath_desc *ds; + + m = bf->bf_m; + if (m == NULL) { + /* + * NB: by assigning a page to the rx dma buffer we + * implicitly satisfy the Atheros requirement that + * this buffer be cache-line-aligned and sized to be + * multiple of the cache line size. Not doing this + * causes weird stuff to happen (for the 5210 at least). + */ + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (m == NULL) { + DPRINTF(sc, ATH_DEBUG_ANY, + "%s: no mbuf/cluster\n", __func__); + sc->sc_stats.ast_rx_nombuf++; + return ENOMEM; + } + m->m_pkthdr.len = m->m_len = m->m_ext.ext_size; + + error = bus_dmamap_load_mbuf_sg(sc->sc_dmat, + bf->bf_dmamap, m, + bf->bf_segs, &bf->bf_nseg, + BUS_DMA_NOWAIT); + if (error != 0) { + DPRINTF(sc, ATH_DEBUG_ANY, + "%s: bus_dmamap_load_mbuf_sg failed; error %d\n", + __func__, error); + sc->sc_stats.ast_rx_busdma++; + m_freem(m); + return error; + } + KASSERT(bf->bf_nseg == 1, + ("multi-segment packet; nseg %u", bf->bf_nseg)); + bf->bf_m = m; + } + bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMASYNC_PREREAD); + + /* + * Setup descriptors. For receive we always terminate + * the descriptor list with a self-linked entry so we'll + * not get overrun under high load (as can happen with a + * 5212 when ANI processing enables PHY error frames). + * + * To insure the last descriptor is self-linked we create + * each descriptor as self-linked and add it to the end. As + * each additional descriptor is added the previous self-linked + * entry is ``fixed'' naturally. This should be safe even + * if DMA is happening. When processing RX interrupts we + * never remove/process the last, self-linked, entry on the + * descriptor list. This insures the hardware always has + * someplace to write a new frame. + */ + /* + * 11N: we can no longer afford to self link the last descriptor. + * MAC acknowledges BA status as long as it copies frames to host + * buffer (or rx fifo). This can incorrectly acknowledge packets + * to a sender if last desc is self-linked. + */ + ds = bf->bf_desc; + if (sc->sc_rxslink) + ds->ds_link = bf->bf_daddr; /* link to self */ + else + ds->ds_link = 0; /* terminate the list */ + ds->ds_data = bf->bf_segs[0].ds_addr; + ath_hal_setuprxdesc(ah, ds + , m->m_len /* buffer size */ + , 0 + ); + + if (sc->sc_rxlink != NULL) + *sc->sc_rxlink = bf->bf_daddr; + sc->sc_rxlink = &ds->ds_link; + return 0; +} + +/* + * Intercept management frames to collect beacon rssi data + * and to do ibss merges. + */ +void +ath_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m, + int subtype, int rssi, int nf) +{ + struct ieee80211vap *vap = ni->ni_vap; + struct ath_softc *sc = vap->iv_ic->ic_ifp->if_softc; + + /* + * Call up first so subsequent work can use information + * potentially stored in the node (e.g. for ibss merge). + */ + ATH_VAP(vap)->av_recv_mgmt(ni, m, subtype, rssi, nf); + switch (subtype) { + case IEEE80211_FC0_SUBTYPE_BEACON: + /* update rssi statistics for use by the hal */ + /* XXX unlocked check against vap->iv_bss? */ + ATH_RSSI_LPF(sc->sc_halstats.ns_avgbrssi, rssi); + if (sc->sc_syncbeacon && + ni == vap->iv_bss && vap->iv_state == IEEE80211_S_RUN) { + /* + * Resync beacon timers using the tsf of the beacon + * frame we just received. + */ + ath_beacon_config(sc, vap); + } + /* fall thru... */ + case IEEE80211_FC0_SUBTYPE_PROBE_RESP: + if (vap->iv_opmode == IEEE80211_M_IBSS && + vap->iv_state == IEEE80211_S_RUN) { + uint32_t rstamp = sc->sc_lastrs->rs_tstamp; + uint64_t tsf = ath_extend_tsf(sc, rstamp, + ath_hal_gettsf64(sc->sc_ah)); + /* + * Handle ibss merge as needed; check the tsf on the + * frame before attempting the merge. The 802.11 spec + * says the station should change it's bssid to match + * the oldest station with the same ssid, where oldest + * is determined by the tsf. Note that hardware + * reconfiguration happens through callback to + * ath_newstate as the state machine will go from + * RUN -> RUN when this happens. + */ + if (le64toh(ni->ni_tstamp.tsf) >= tsf) { + DPRINTF(sc, ATH_DEBUG_STATE, + "ibss merge, rstamp %u tsf %ju " + "tstamp %ju\n", rstamp, (uintmax_t)tsf, + (uintmax_t)ni->ni_tstamp.tsf); + (void) ieee80211_ibss_merge(ni); + } + } + break; + } +} + +#ifdef ATH_ENABLE_RADIOTAP_VENDOR_EXT +static void +ath_rx_tap_vendor(struct ifnet *ifp, struct mbuf *m, + const struct ath_rx_status *rs, u_int64_t tsf, int16_t nf) +{ + struct ath_softc *sc = ifp->if_softc; + + /* Fill in the extension bitmap */ + sc->sc_rx_th.wr_ext_bitmap = htole32(1 << ATH_RADIOTAP_VENDOR_HEADER); + + /* Fill in the vendor header */ + sc->sc_rx_th.wr_vh.vh_oui[0] = 0x7f; + sc->sc_rx_th.wr_vh.vh_oui[1] = 0x03; + sc->sc_rx_th.wr_vh.vh_oui[2] = 0x00; + + /* XXX what should this be? */ + sc->sc_rx_th.wr_vh.vh_sub_ns = 0; + sc->sc_rx_th.wr_vh.vh_skip_len = + htole16(sizeof(struct ath_radiotap_vendor_hdr)); + + /* General version info */ + sc->sc_rx_th.wr_v.vh_version = 1; + + sc->sc_rx_th.wr_v.vh_rx_chainmask = sc->sc_rxchainmask; + + /* rssi */ + sc->sc_rx_th.wr_v.rssi_ctl[0] = rs->rs_rssi_ctl[0]; + sc->sc_rx_th.wr_v.rssi_ctl[1] = rs->rs_rssi_ctl[1]; + sc->sc_rx_th.wr_v.rssi_ctl[2] = rs->rs_rssi_ctl[2]; + sc->sc_rx_th.wr_v.rssi_ext[0] = rs->rs_rssi_ext[0]; + sc->sc_rx_th.wr_v.rssi_ext[1] = rs->rs_rssi_ext[1]; + sc->sc_rx_th.wr_v.rssi_ext[2] = rs->rs_rssi_ext[2]; + + /* evm */ + sc->sc_rx_th.wr_v.evm[0] = rs->rs_evm0; + sc->sc_rx_th.wr_v.evm[1] = rs->rs_evm1; + sc->sc_rx_th.wr_v.evm[2] = rs->rs_evm2; + /* XXX TODO: extend this to include 3-stream EVM */ + + /* phyerr info */ + if (rs->rs_status & HAL_RXERR_PHY) + sc->sc_rx_th.wr_v.vh_phyerr_code = rs->rs_phyerr; + else + sc->sc_rx_th.wr_v.vh_phyerr_code = 0xff; + sc->sc_rx_th.wr_v.vh_rs_status = rs->rs_status; + sc->sc_rx_th.wr_v.vh_rssi = rs->rs_rssi; +} +#endif /* ATH_ENABLE_RADIOTAP_VENDOR_EXT */ + +static void +ath_rx_tap(struct ifnet *ifp, struct mbuf *m, + const struct ath_rx_status *rs, u_int64_t tsf, int16_t nf) +{ +#define CHAN_HT20 htole32(IEEE80211_CHAN_HT20) +#define CHAN_HT40U htole32(IEEE80211_CHAN_HT40U) +#define CHAN_HT40D htole32(IEEE80211_CHAN_HT40D) +#define CHAN_HT (CHAN_HT20|CHAN_HT40U|CHAN_HT40D) + struct ath_softc *sc = ifp->if_softc; + const HAL_RATE_TABLE *rt; + uint8_t rix; + + rt = sc->sc_currates; + KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode)); + rix = rt->rateCodeToIndex[rs->rs_rate]; + sc->sc_rx_th.wr_rate = sc->sc_hwmap[rix].ieeerate; + sc->sc_rx_th.wr_flags = sc->sc_hwmap[rix].rxflags; +#ifdef AH_SUPPORT_AR5416 + sc->sc_rx_th.wr_chan_flags &= ~CHAN_HT; + if (sc->sc_rx_th.wr_rate & IEEE80211_RATE_MCS) { /* HT rate */ + struct ieee80211com *ic = ifp->if_l2com; + + if ((rs->rs_flags & HAL_RX_2040) == 0) + sc->sc_rx_th.wr_chan_flags |= CHAN_HT20; + else if (IEEE80211_IS_CHAN_HT40U(ic->ic_curchan)) + sc->sc_rx_th.wr_chan_flags |= CHAN_HT40U; + else + sc->sc_rx_th.wr_chan_flags |= CHAN_HT40D; + if ((rs->rs_flags & HAL_RX_GI) == 0) + sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_SHORTGI; + } +#endif + sc->sc_rx_th.wr_tsf = htole64(ath_extend_tsf(sc, rs->rs_tstamp, tsf)); + if (rs->rs_status & HAL_RXERR_CRC) + sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_BADFCS; + /* XXX propagate other error flags from descriptor */ + sc->sc_rx_th.wr_antnoise = nf; + sc->sc_rx_th.wr_antsignal = nf + rs->rs_rssi; + sc->sc_rx_th.wr_antenna = rs->rs_antenna; +#undef CHAN_HT +#undef CHAN_HT20 +#undef CHAN_HT40U +#undef CHAN_HT40D +} + +static void +ath_handle_micerror(struct ieee80211com *ic, + struct ieee80211_frame *wh, int keyix) +{ + struct ieee80211_node *ni; + + /* XXX recheck MIC to deal w/ chips that lie */ + /* XXX discard MIC errors on !data frames */ + ni = ieee80211_find_rxnode(ic, (const struct ieee80211_frame_min *) wh); + if (ni != NULL) { + ieee80211_notify_michael_failure(ni->ni_vap, wh, keyix); + ieee80211_free_node(ni); + } +} + +int +ath_rx_pkt(struct ath_softc *sc, struct ath_rx_status *rs, HAL_STATUS status, + uint64_t tsf, int nf, HAL_RX_QUEUE qtype, struct ath_buf *bf) +{ + struct ath_hal *ah = sc->sc_ah; + struct mbuf *m = bf->bf_m; + uint64_t rstamp; + int len, type; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211_node *ni; + int is_good = 0; + struct ath_rx_edma *re = &sc->sc_rxedma[qtype]; + + /* + * Calculate the correct 64 bit TSF given + * the TSF64 register value and rs_tstamp. + */ + rstamp = ath_extend_tsf(sc, rs->rs_tstamp, tsf); + + /* These aren't specifically errors */ +#ifdef AH_SUPPORT_AR5416 + if (rs->rs_flags & HAL_RX_GI) + sc->sc_stats.ast_rx_halfgi++; + if (rs->rs_flags & HAL_RX_2040) + sc->sc_stats.ast_rx_2040++; + if (rs->rs_flags & HAL_RX_DELIM_CRC_PRE) + sc->sc_stats.ast_rx_pre_crc_err++; + if (rs->rs_flags & HAL_RX_DELIM_CRC_POST) + sc->sc_stats.ast_rx_post_crc_err++; + if (rs->rs_flags & HAL_RX_DECRYPT_BUSY) + sc->sc_stats.ast_rx_decrypt_busy_err++; + if (rs->rs_flags & HAL_RX_HI_RX_CHAIN) + sc->sc_stats.ast_rx_hi_rx_chain++; +#endif /* AH_SUPPORT_AR5416 */ + + if (rs->rs_status != 0) { + if (rs->rs_status & HAL_RXERR_CRC) + sc->sc_stats.ast_rx_crcerr++; + if (rs->rs_status & HAL_RXERR_FIFO) + sc->sc_stats.ast_rx_fifoerr++; + if (rs->rs_status & HAL_RXERR_PHY) { + sc->sc_stats.ast_rx_phyerr++; + /* Process DFS radar events */ + if ((rs->rs_phyerr == HAL_PHYERR_RADAR) || + (rs->rs_phyerr == HAL_PHYERR_FALSE_RADAR_EXT)) { + /* Since we're touching the frame data, sync it */ + bus_dmamap_sync(sc->sc_dmat, + bf->bf_dmamap, + BUS_DMASYNC_POSTREAD); + /* Now pass it to the radar processing code */ + ath_dfs_process_phy_err(sc, m, rstamp, rs); + } + + /* Be suitably paranoid about receiving phy errors out of the stats array bounds */ + if (rs->rs_phyerr < 64) + sc->sc_stats.ast_rx_phy[rs->rs_phyerr]++; + goto rx_error; /* NB: don't count in ierrors */ + } + if (rs->rs_status & HAL_RXERR_DECRYPT) { + /* + * Decrypt error. If the error occurred + * because there was no hardware key, then + * let the frame through so the upper layers + * can process it. This is necessary for 5210 + * parts which have no way to setup a ``clear'' + * key cache entry. + * + * XXX do key cache faulting + */ + if (rs->rs_keyix == HAL_RXKEYIX_INVALID) + goto rx_accept; + sc->sc_stats.ast_rx_badcrypt++; + } + if (rs->rs_status & HAL_RXERR_MIC) { + sc->sc_stats.ast_rx_badmic++; + /* + * Do minimal work required to hand off + * the 802.11 header for notification. + */ + /* XXX frag's and qos frames */ + len = rs->rs_datalen; + if (len >= sizeof (struct ieee80211_frame)) { + bus_dmamap_sync(sc->sc_dmat, + bf->bf_dmamap, + BUS_DMASYNC_POSTREAD); + ath_handle_micerror(ic, + mtod(m, struct ieee80211_frame *), + sc->sc_splitmic ? + rs->rs_keyix-32 : rs->rs_keyix); + } + } + ifp->if_ierrors++; +rx_error: + /* + * Cleanup any pending partial frame. + */ + if (re->m_rxpending != NULL) { + m_freem(re->m_rxpending); + re->m_rxpending = NULL; + } + /* + * When a tap is present pass error frames + * that have been requested. By default we + * pass decrypt+mic errors but others may be + * interesting (e.g. crc). + */ + if (ieee80211_radiotap_active(ic) && + (rs->rs_status & sc->sc_monpass)) { + bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, + BUS_DMASYNC_POSTREAD); + /* NB: bpf needs the mbuf length setup */ + len = rs->rs_datalen; + m->m_pkthdr.len = m->m_len = len; + bf->bf_m = NULL; + ath_rx_tap(ifp, m, rs, rstamp, nf); +#ifdef ATH_ENABLE_RADIOTAP_VENDOR_EXT + ath_rx_tap_vendor(ifp, m, rs, rstamp, nf); +#endif /* ATH_ENABLE_RADIOTAP_VENDOR_EXT */ + ieee80211_radiotap_rx_all(ic, m); + m_freem(m); + } + /* XXX pass MIC errors up for s/w reclaculation */ + goto rx_next; + } +rx_accept: + /* + * Sync and unmap the frame. At this point we're + * committed to passing the mbuf somewhere so clear + * bf_m; this means a new mbuf must be allocated + * when the rx descriptor is setup again to receive + * another frame. + */ + bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); + bf->bf_m = NULL; + + len = rs->rs_datalen; + m->m_len = len; + + if (rs->rs_more) { + /* + * Frame spans multiple descriptors; save + * it for the next completed descriptor, it + * will be used to construct a jumbogram. + */ + if (re->m_rxpending != NULL) { + /* NB: max frame size is currently 2 clusters */ + sc->sc_stats.ast_rx_toobig++; + m_freem(re->m_rxpending); + } + m->m_pkthdr.rcvif = ifp; + m->m_pkthdr.len = len; + re->m_rxpending = m; + goto rx_next; + } else if (re->m_rxpending != NULL) { + /* + * This is the second part of a jumbogram, + * chain it to the first mbuf, adjust the + * frame length, and clear the rxpending state. + */ + re->m_rxpending->m_next = m; + re->m_rxpending->m_pkthdr.len += len; + m = re->m_rxpending; + re->m_rxpending = NULL; + } else { + /* + * Normal single-descriptor receive; setup + * the rcvif and packet length. + */ + m->m_pkthdr.rcvif = ifp; + m->m_pkthdr.len = len; + } + + /* + * Validate rs->rs_antenna. + * + * Some users w/ AR9285 NICs have reported crashes + * here because rs_antenna field is bogusly large. + * Let's enforce the maximum antenna limit of 8 + * (and it shouldn't be hard coded, but that's a + * separate problem) and if there's an issue, print + * out an error and adjust rs_antenna to something + * sensible. + * + * This code should be removed once the actual + * root cause of the issue has been identified. + * For example, it may be that the rs_antenna + * field is only valid for the lsat frame of + * an aggregate and it just happens that it is + * "mostly" right. (This is a general statement - + * the majority of the statistics are only valid + * for the last frame in an aggregate. + */ + if (rs->rs_antenna > 7) { + device_printf(sc->sc_dev, "%s: rs_antenna > 7 (%d)\n", + __func__, rs->rs_antenna); +#ifdef ATH_DEBUG + ath_printrxbuf(sc, bf, 0, status == HAL_OK); +#endif /* ATH_DEBUG */ + rs->rs_antenna = 0; /* XXX better than nothing */ + } + + ifp->if_ipackets++; + sc->sc_stats.ast_ant_rx[rs->rs_antenna]++; + + /* + * Populate the rx status block. When there are bpf + * listeners we do the additional work to provide + * complete status. Otherwise we fill in only the + * material required by ieee80211_input. Note that + * noise setting is filled in above. + */ + if (ieee80211_radiotap_active(ic)) { + ath_rx_tap(ifp, m, rs, rstamp, nf); +#ifdef ATH_ENABLE_RADIOTAP_VENDOR_EXT + ath_rx_tap_vendor(ifp, m, rs, rstamp, nf); +#endif /* ATH_ENABLE_RADIOTAP_VENDOR_EXT */ + } + + /* + * From this point on we assume the frame is at least + * as large as ieee80211_frame_min; verify that. + */ + if (len < IEEE80211_MIN_LEN) { + if (!ieee80211_radiotap_active(ic)) { + DPRINTF(sc, ATH_DEBUG_RECV, + "%s: short packet %d\n", __func__, len); + sc->sc_stats.ast_rx_tooshort++; + } else { + /* NB: in particular this captures ack's */ + ieee80211_radiotap_rx_all(ic, m); + } + m_freem(m); + goto rx_next; + } + + if (IFF_DUMPPKTS(sc, ATH_DEBUG_RECV)) { + const HAL_RATE_TABLE *rt = sc->sc_currates; + uint8_t rix = rt->rateCodeToIndex[rs->rs_rate]; + + ieee80211_dump_pkt(ic, mtod(m, caddr_t), len, + sc->sc_hwmap[rix].ieeerate, rs->rs_rssi); + } + + m_adj(m, -IEEE80211_CRC_LEN); + + /* + * Locate the node for sender, track state, and then + * pass the (referenced) node up to the 802.11 layer + * for its use. + */ + ni = ieee80211_find_rxnode_withkey(ic, + mtod(m, const struct ieee80211_frame_min *), + rs->rs_keyix == HAL_RXKEYIX_INVALID ? + IEEE80211_KEYIX_NONE : rs->rs_keyix); + sc->sc_lastrs = rs; + +#ifdef AH_SUPPORT_AR5416 + if (rs->rs_isaggr) + sc->sc_stats.ast_rx_agg++; +#endif /* AH_SUPPORT_AR5416 */ + + if (ni != NULL) { + /* + * Only punt packets for ampdu reorder processing for + * 11n nodes; net80211 enforces that M_AMPDU is only + * set for 11n nodes. + */ + if (ni->ni_flags & IEEE80211_NODE_HT) + m->m_flags |= M_AMPDU; + + /* + * Sending station is known, dispatch directly. + */ + type = ieee80211_input(ni, m, rs->rs_rssi, nf); + ieee80211_free_node(ni); + /* + * Arrange to update the last rx timestamp only for + * frames from our ap when operating in station mode. + * This assumes the rx key is always setup when + * associated. + */ + if (ic->ic_opmode == IEEE80211_M_STA && + rs->rs_keyix != HAL_RXKEYIX_INVALID) + is_good = 1; + } else { + type = ieee80211_input_all(ic, m, rs->rs_rssi, nf); + } + /* + * Track rx rssi and do any rx antenna management. + */ + ATH_RSSI_LPF(sc->sc_halstats.ns_avgrssi, rs->rs_rssi); + if (sc->sc_diversity) { + /* + * When using fast diversity, change the default rx + * antenna if diversity chooses the other antenna 3 + * times in a row. + */ + if (sc->sc_defant != rs->rs_antenna) { + if (++sc->sc_rxotherant >= 3) + ath_setdefantenna(sc, rs->rs_antenna); + } else + sc->sc_rxotherant = 0; + } + + /* Newer school diversity - kite specific for now */ + /* XXX perhaps migrate the normal diversity code to this? */ + if ((ah)->ah_rxAntCombDiversity) + (*(ah)->ah_rxAntCombDiversity)(ah, rs, ticks, hz); + + if (sc->sc_softled) { + /* + * Blink for any data frame. Otherwise do a + * heartbeat-style blink when idle. The latter + * is mainly for station mode where we depend on + * periodic beacon frames to trigger the poll event. + */ + if (type == IEEE80211_FC0_TYPE_DATA) { + const HAL_RATE_TABLE *rt = sc->sc_currates; + ath_led_event(sc, + rt->rateCodeToIndex[rs->rs_rate]); + } else if (ticks - sc->sc_ledevent >= sc->sc_ledidle) + ath_led_event(sc, 0); + } +rx_next: + return (is_good); +} + +static void +ath_rx_proc(struct ath_softc *sc, int resched) +{ +#define PA2DESC(_sc, _pa) \ + ((struct ath_desc *)((caddr_t)(_sc)->sc_rxdma.dd_desc + \ + ((_pa) - (_sc)->sc_rxdma.dd_desc_paddr))) + struct ath_buf *bf; + struct ifnet *ifp = sc->sc_ifp; + struct ath_hal *ah = sc->sc_ah; +#ifdef IEEE80211_SUPPORT_SUPERG + struct ieee80211com *ic = ifp->if_l2com; +#endif + struct ath_desc *ds; + struct ath_rx_status *rs; + struct mbuf *m; + int ngood; + HAL_STATUS status; + int16_t nf; + u_int64_t tsf; + int npkts = 0; + + /* XXX we must not hold the ATH_LOCK here */ + ATH_UNLOCK_ASSERT(sc); + ATH_PCU_UNLOCK_ASSERT(sc); + + ATH_PCU_LOCK(sc); + sc->sc_rxproc_cnt++; + ATH_PCU_UNLOCK(sc); + + DPRINTF(sc, ATH_DEBUG_RX_PROC, "%s: called\n", __func__); + ngood = 0; + nf = ath_hal_getchannoise(ah, sc->sc_curchan); + sc->sc_stats.ast_rx_noise = nf; + tsf = ath_hal_gettsf64(ah); + do { + bf = TAILQ_FIRST(&sc->sc_rxbuf); + if (sc->sc_rxslink && bf == NULL) { /* NB: shouldn't happen */ + if_printf(ifp, "%s: no buffer!\n", __func__); + break; + } else if (bf == NULL) { + /* + * End of List: + * this can happen for non-self-linked RX chains + */ + sc->sc_stats.ast_rx_hitqueueend++; + break; + } + m = bf->bf_m; + if (m == NULL) { /* NB: shouldn't happen */ + /* + * If mbuf allocation failed previously there + * will be no mbuf; try again to re-populate it. + */ + /* XXX make debug msg */ + if_printf(ifp, "%s: no mbuf!\n", __func__); + TAILQ_REMOVE(&sc->sc_rxbuf, bf, bf_list); + goto rx_proc_next; + } + ds = bf->bf_desc; + if (ds->ds_link == bf->bf_daddr) { + /* NB: never process the self-linked entry at the end */ + sc->sc_stats.ast_rx_hitqueueend++; + break; + } + /* XXX sync descriptor memory */ + /* + * Must provide the virtual address of the current + * descriptor, the physical address, and the virtual + * address of the next descriptor in the h/w chain. + * This allows the HAL to look ahead to see if the + * hardware is done with a descriptor by checking the + * done bit in the following descriptor and the address + * of the current descriptor the DMA engine is working + * on. All this is necessary because of our use of + * a self-linked list to avoid rx overruns. + */ + rs = &bf->bf_status.ds_rxstat; + status = ath_hal_rxprocdesc(ah, ds, + bf->bf_daddr, PA2DESC(sc, ds->ds_link), rs); +#ifdef ATH_DEBUG + if (sc->sc_debug & ATH_DEBUG_RECV_DESC) + ath_printrxbuf(sc, bf, 0, status == HAL_OK); +#endif + if (status == HAL_EINPROGRESS) + break; + + TAILQ_REMOVE(&sc->sc_rxbuf, bf, bf_list); + npkts++; + + /* + * Process a single frame. + */ + if (ath_rx_pkt(sc, rs, status, tsf, nf, HAL_RX_QUEUE_HP, bf)) + ngood++; +rx_proc_next: + TAILQ_INSERT_TAIL(&sc->sc_rxbuf, bf, bf_list); + } while (ath_rxbuf_init(sc, bf) == 0); + + /* rx signal state monitoring */ + ath_hal_rxmonitor(ah, &sc->sc_halstats, sc->sc_curchan); + if (ngood) + sc->sc_lastrx = tsf; + + CTR2(ATH_KTR_INTR, "ath_rx_proc: npkts=%d, ngood=%d", npkts, ngood); + /* Queue DFS tasklet if needed */ + if (resched && ath_dfs_tasklet_needed(sc, sc->sc_curchan)) + taskqueue_enqueue(sc->sc_tq, &sc->sc_dfstask); + + /* + * Now that all the RX frames were handled that + * need to be handled, kick the PCU if there's + * been an RXEOL condition. + */ + ATH_PCU_LOCK(sc); + if (resched && sc->sc_kickpcu) { + CTR0(ATH_KTR_ERR, "ath_rx_proc: kickpcu"); + device_printf(sc->sc_dev, "%s: kickpcu; handled %d packets\n", + __func__, npkts); + + /* XXX rxslink? */ + /* + * XXX can we hold the PCU lock here? + * Are there any net80211 buffer calls involved? + */ + bf = TAILQ_FIRST(&sc->sc_rxbuf); + ath_hal_putrxbuf(ah, bf->bf_daddr, HAL_RX_QUEUE_HP); + ath_hal_rxena(ah); /* enable recv descriptors */ + ath_mode_init(sc); /* set filters, etc. */ + ath_hal_startpcurecv(ah); /* re-enable PCU/DMA engine */ + + ath_hal_intrset(ah, sc->sc_imask); + sc->sc_kickpcu = 0; + } + ATH_PCU_UNLOCK(sc); + + /* XXX check this inside of IF_LOCK? */ + if (resched && (ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) { +#ifdef IEEE80211_SUPPORT_SUPERG + ieee80211_ff_age_all(ic, 100); +#endif + if (!IFQ_IS_EMPTY(&ifp->if_snd)) + ath_tx_kick(sc); + } +#undef PA2DESC + + ATH_PCU_LOCK(sc); + sc->sc_rxproc_cnt--; + ATH_PCU_UNLOCK(sc); +} + +/* + * Only run the RX proc if it's not already running. + * Since this may get run as part of the reset/flush path, + * the task can't clash with an existing, running tasklet. + */ +static void +ath_legacy_rx_tasklet(void *arg, int npending) +{ + struct ath_softc *sc = arg; + + CTR1(ATH_KTR_INTR, "ath_rx_proc: pending=%d", npending); + DPRINTF(sc, ATH_DEBUG_RX_PROC, "%s: pending %u\n", __func__, npending); + ATH_PCU_LOCK(sc); + if (sc->sc_inreset_cnt > 0) { + device_printf(sc->sc_dev, + "%s: sc_inreset_cnt > 0; skipping\n", __func__); + ATH_PCU_UNLOCK(sc); + return; + } + ATH_PCU_UNLOCK(sc); + + ath_rx_proc(sc, 1); +} + +static void +ath_legacy_flushrecv(struct ath_softc *sc) +{ + + ath_rx_proc(sc, 0); +} + +/* + * Disable the receive h/w in preparation for a reset. + */ +static void +ath_legacy_stoprecv(struct ath_softc *sc, int dodelay) +{ +#define PA2DESC(_sc, _pa) \ + ((struct ath_desc *)((caddr_t)(_sc)->sc_rxdma.dd_desc + \ + ((_pa) - (_sc)->sc_rxdma.dd_desc_paddr))) + struct ath_hal *ah = sc->sc_ah; + + ath_hal_stoppcurecv(ah); /* disable PCU */ + ath_hal_setrxfilter(ah, 0); /* clear recv filter */ + ath_hal_stopdmarecv(ah); /* disable DMA engine */ + /* + * TODO: see if this particular DELAY() is required; it may be + * masking some missing FIFO flush or DMA sync. + */ +#if 0 + if (dodelay) +#endif + DELAY(3000); /* 3ms is long enough for 1 frame */ +#ifdef ATH_DEBUG + if (sc->sc_debug & (ATH_DEBUG_RESET | ATH_DEBUG_FATAL)) { + struct ath_buf *bf; + u_int ix; + + device_printf(sc->sc_dev, + "%s: rx queue %p, link %p\n", + __func__, + (caddr_t)(uintptr_t) ath_hal_getrxbuf(ah, HAL_RX_QUEUE_HP), + sc->sc_rxlink); + ix = 0; + TAILQ_FOREACH(bf, &sc->sc_rxbuf, bf_list) { + struct ath_desc *ds = bf->bf_desc; + struct ath_rx_status *rs = &bf->bf_status.ds_rxstat; + HAL_STATUS status = ath_hal_rxprocdesc(ah, ds, + bf->bf_daddr, PA2DESC(sc, ds->ds_link), rs); + if (status == HAL_OK || (sc->sc_debug & ATH_DEBUG_FATAL)) + ath_printrxbuf(sc, bf, ix, status == HAL_OK); + ix++; + } + } +#endif + /* + * Free both high/low RX pending, just in case. + */ + if (sc->sc_rxedma[HAL_RX_QUEUE_LP].m_rxpending != NULL) { + m_freem(sc->sc_rxedma[HAL_RX_QUEUE_LP].m_rxpending); + sc->sc_rxedma[HAL_RX_QUEUE_LP].m_rxpending = NULL; + } + if (sc->sc_rxedma[HAL_RX_QUEUE_HP].m_rxpending != NULL) { + m_freem(sc->sc_rxedma[HAL_RX_QUEUE_HP].m_rxpending); + sc->sc_rxedma[HAL_RX_QUEUE_HP].m_rxpending = NULL; + } + sc->sc_rxlink = NULL; /* just in case */ +#undef PA2DESC +} + +/* + * Enable the receive h/w following a reset. + */ +static int +ath_legacy_startrecv(struct ath_softc *sc) +{ + struct ath_hal *ah = sc->sc_ah; + struct ath_buf *bf; + + sc->sc_rxlink = NULL; + sc->sc_rxedma[HAL_RX_QUEUE_LP].m_rxpending = NULL; + sc->sc_rxedma[HAL_RX_QUEUE_HP].m_rxpending = NULL; + TAILQ_FOREACH(bf, &sc->sc_rxbuf, bf_list) { + int error = ath_rxbuf_init(sc, bf); + if (error != 0) { + DPRINTF(sc, ATH_DEBUG_RECV, + "%s: ath_rxbuf_init failed %d\n", + __func__, error); + return error; + } + } + + bf = TAILQ_FIRST(&sc->sc_rxbuf); + ath_hal_putrxbuf(ah, bf->bf_daddr, HAL_RX_QUEUE_HP); + ath_hal_rxena(ah); /* enable recv descriptors */ + ath_mode_init(sc); /* set filters, etc. */ + ath_hal_startpcurecv(ah); /* re-enable PCU/DMA engine */ + return 0; +} + +static int +ath_legacy_dma_rxsetup(struct ath_softc *sc) +{ + int error; + + device_printf(sc->sc_dev, "%s: called\n", __func__); + + error = ath_descdma_setup(sc, &sc->sc_rxdma, &sc->sc_rxbuf, + "rx", ath_rxbuf, 1); + if (error != 0) + return (error); + + return (0); +} + +static int +ath_legacy_dma_rxteardown(struct ath_softc *sc) +{ + + device_printf(sc->sc_dev, "%s: called\n", __func__); + + if (sc->sc_rxdma.dd_desc_len != 0) + ath_descdma_cleanup(sc, &sc->sc_rxdma, &sc->sc_rxbuf); + return (0); +} + +void +ath_recv_setup_legacy(struct ath_softc *sc) +{ + + device_printf(sc->sc_dev, "DMA setup: legacy\n"); + + sc->sc_rx.recv_start = ath_legacy_startrecv; + sc->sc_rx.recv_stop = ath_legacy_stoprecv; + sc->sc_rx.recv_flush = ath_legacy_flushrecv; + sc->sc_rx.recv_tasklet = ath_legacy_rx_tasklet; + sc->sc_rx.recv_rxbuf_init = ath_legacy_rxbuf_init; + + sc->sc_rx.recv_setup = ath_legacy_dma_rxsetup; + sc->sc_rx.recv_teardown = ath_legacy_dma_rxteardown; +} diff --git a/sys/dev/ath/if_ath_rx.h b/sys/dev/ath/if_ath_rx.h new file mode 100644 index 00000000000..504ff80b4bf --- /dev/null +++ b/sys/dev/ath/if_ath_rx.h @@ -0,0 +1,65 @@ +/*- + * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ +#ifndef __IF_ATH_RX_H__ +#define __IF_ATH_RX_H__ + +extern u_int32_t ath_calcrxfilter(struct ath_softc *sc); +extern void ath_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m, + int subtype, int rssi, int nf); + +#define ath_stoprecv(_sc, _dodelay) \ + (_sc)->sc_rx.recv_stop((_sc), (_dodelay)) +#define ath_startrecv(_sc) \ + (_sc)->sc_rx.recv_start((_sc)) +#define ath_rx_flush(_sc) \ + (_sc)->sc_rx.recv_flush((_sc)) +#define ath_rxbuf_init(_sc, _bf) \ + (_sc)->sc_rx.recv_rxbuf_init((_sc), (_bf)) +#define ath_rxdma_setup(_sc) \ + (_sc)->sc_rx.recv_setup(_sc) +#define ath_rxdma_teardown(_sc) \ + (_sc)->sc_rx.recv_teardown(_sc) + +#if 0 +extern int ath_rxbuf_init(struct ath_softc *sc, struct ath_buf *bf); +extern void ath_rx_tasklet(void *arg, int npending); +extern void ath_rx_proc(struct ath_softc *sc, int resched); +extern void ath_stoprecv(struct ath_softc *sc, int dodelay); +extern int ath_startrecv(struct ath_softc *sc); +#endif + +extern int ath_rx_pkt(struct ath_softc *sc, struct ath_rx_status *rs, + HAL_STATUS status, uint64_t tsf, int nf, HAL_RX_QUEUE qtype, + struct ath_buf *bf); + +extern void ath_recv_setup_legacy(struct ath_softc *sc); + +#endif diff --git a/sys/dev/ath/if_ath_rx_edma.c b/sys/dev/ath/if_ath_rx_edma.c new file mode 100644 index 00000000000..9e3580d966c --- /dev/null +++ b/sys/dev/ath/if_ath_rx_edma.c @@ -0,0 +1,770 @@ +/*- + * Copyright (c) 2012 Adrian Chadd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Driver for the Atheros Wireless LAN controller. + * + * This software is derived from work of Atsushi Onoe; his contribution + * is greatly appreciated. + */ + +#include "opt_inet.h" +#include "opt_ath.h" +/* + * This is needed for register operations which are performed + * by the driver - eg, calls to ath_hal_gettsf32(). + * + * It's also required for any AH_DEBUG checks in here, eg the + * module dependencies. + */ +#include "opt_ah.h" +#include "opt_wlan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for mp_ncpus */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#ifdef IEEE80211_SUPPORT_SUPERG +#include +#endif +#ifdef IEEE80211_SUPPORT_TDMA +#include +#endif + +#include + +#ifdef INET +#include +#include +#endif + +#include +#include /* XXX for softled */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef ATH_TX99_DIAG +#include +#endif + +#include + +/* + * some general macros + */ +#define INCR(_l, _sz) (_l) ++; (_l) &= ((_sz) - 1) +#define DECR(_l, _sz) (_l) --; (_l) &= ((_sz) - 1) + +MALLOC_DECLARE(M_ATHDEV); + +/* + * XXX TODO: + * + * + Add an RX lock, just to ensure we don't have things clash; + * + Make sure the FIFO is correctly flushed and reinitialised + * through a reset; + * + Handle the "kickpcu" state where the FIFO overflows. + * + Implement a "flush" routine, which doesn't push any + * new frames into the FIFO. + * + Verify multi-descriptor frames work! + * + There's a "memory use after free" which needs to be tracked down + * and fixed ASAP. I've seen this in the legacy path too, so it + * may be a generic RX path issue. + */ + +/* + * XXX shuffle the function orders so these pre-declarations aren't + * required! + */ +static int ath_edma_rxfifo_alloc(struct ath_softc *sc, HAL_RX_QUEUE qtype, + int nbufs); +static int ath_edma_rxfifo_flush(struct ath_softc *sc, HAL_RX_QUEUE qtype); +static void ath_edma_rxbuf_free(struct ath_softc *sc, struct ath_buf *bf); +static int ath_edma_recv_proc_queue(struct ath_softc *sc, + HAL_RX_QUEUE qtype, int dosched); + +static void +ath_edma_stoprecv(struct ath_softc *sc, int dodelay) +{ + struct ath_hal *ah = sc->sc_ah; + + ath_hal_stoppcurecv(ah); + ath_hal_setrxfilter(ah, 0); + ath_hal_stopdmarecv(ah); + + DELAY(3000); + + /* Flush RX pending for each queue */ + /* XXX should generic-ify this */ + if (sc->sc_rxedma[HAL_RX_QUEUE_HP].m_rxpending) { + m_freem(sc->sc_rxedma[HAL_RX_QUEUE_HP].m_rxpending); + sc->sc_rxedma[HAL_RX_QUEUE_HP].m_rxpending = NULL; + } + + if (sc->sc_rxedma[HAL_RX_QUEUE_LP].m_rxpending) { + m_freem(sc->sc_rxedma[HAL_RX_QUEUE_LP].m_rxpending); + sc->sc_rxedma[HAL_RX_QUEUE_LP].m_rxpending = NULL; + } +} + +/* + * Re-initialise the FIFO given the current buffer contents. + * Specifically, walk from head -> tail, pushing the FIFO contents + * back into the FIFO. + */ +static void +ath_edma_reinit_fifo(struct ath_softc *sc, HAL_RX_QUEUE qtype) +{ + struct ath_rx_edma *re = &sc->sc_rxedma[qtype]; + struct ath_buf *bf; + int i, j; + + i = re->m_fifo_head; + for (j = 0; j < re->m_fifo_depth; j++) { + bf = re->m_fifo[i]; + DPRINTF(sc, ATH_DEBUG_EDMA_RX, + "%s: Q%d: pos=%i, addr=0x%jx\n", + __func__, + qtype, + i, + (uintmax_t)bf->bf_daddr); + ath_hal_putrxbuf(sc->sc_ah, bf->bf_daddr, qtype); + INCR(i, re->m_fifolen); + } + + /* Ensure this worked out right */ + if (i != re->m_fifo_tail) { + device_printf(sc->sc_dev, "%s: i (%d) != tail! (%d)\n", + __func__, + i, + re->m_fifo_tail); + } +} + +/* + * Start receive. + * + * XXX TODO: this needs to reallocate the FIFO entries when a reset + * occurs, in case the FIFO is filled up and no new descriptors get + * thrown into the FIFO. + */ +static int +ath_edma_startrecv(struct ath_softc *sc) +{ + struct ath_hal *ah = sc->sc_ah; + + /* Enable RX FIFO */ + ath_hal_rxena(ah); + + /* + * Entries should only be written out if the + * FIFO is empty. + * + * XXX This isn't correct. I should be looking + * at the value of AR_RXDP_SIZE (0x0070) to determine + * how many entries are in here. + * + * A warm reset will clear the registers but not the FIFO. + * + * And I believe this is actually the address of the last + * handled buffer rather than the current FIFO pointer. + * So if no frames have been (yet) seen, we'll reinit the + * FIFO. + * + * I'll chase that up at some point. + */ + if (ath_hal_getrxbuf(sc->sc_ah, HAL_RX_QUEUE_HP) == 0) { + DPRINTF(sc, ATH_DEBUG_EDMA_RX, + "%s: Re-initing HP FIFO\n", __func__); + ath_edma_reinit_fifo(sc, HAL_RX_QUEUE_HP); + } + if (ath_hal_getrxbuf(sc->sc_ah, HAL_RX_QUEUE_LP) == 0) { + DPRINTF(sc, ATH_DEBUG_EDMA_RX, + "%s: Re-initing LP FIFO\n", __func__); + ath_edma_reinit_fifo(sc, HAL_RX_QUEUE_LP); + } + + /* Add up to m_fifolen entries in each queue */ + /* + * These must occur after the above write so the FIFO buffers + * are pushed/tracked in the same order as the hardware will + * process them. + */ + ath_edma_rxfifo_alloc(sc, HAL_RX_QUEUE_HP, + sc->sc_rxedma[HAL_RX_QUEUE_HP].m_fifolen); + + ath_edma_rxfifo_alloc(sc, HAL_RX_QUEUE_LP, + sc->sc_rxedma[HAL_RX_QUEUE_LP].m_fifolen); + + ath_mode_init(sc); + ath_hal_startpcurecv(ah); + return (0); +} + +static void +ath_edma_recv_flush(struct ath_softc *sc) +{ + + device_printf(sc->sc_dev, "%s: called\n", __func__); + + ath_edma_recv_proc_queue(sc, HAL_RX_QUEUE_HP, 0); + ath_edma_recv_proc_queue(sc, HAL_RX_QUEUE_LP, 0); +} + +/* + * Process frames from the current queue. + * + * TODO: + * + * + Add a "dosched" flag, so we don't reschedule any FIFO frames + * to the hardware or re-kick the PCU after 'kickpcu' is set. + * + * + Perhaps split "check FIFO contents" and "handle frames", so + * we can run the "check FIFO contents" in ath_intr(), but + * "handle frames" in the RX tasklet. + */ +static int +ath_edma_recv_proc_queue(struct ath_softc *sc, HAL_RX_QUEUE qtype, + int dosched) +{ + struct ath_rx_edma *re = &sc->sc_rxedma[qtype]; + struct ath_rx_status *rs; + struct ath_desc *ds; + struct ath_buf *bf; + struct mbuf *m; + HAL_STATUS status; + struct ath_hal *ah = sc->sc_ah; + uint64_t tsf; + int16_t nf; + int ngood = 0; + + tsf = ath_hal_gettsf64(ah); + nf = ath_hal_getchannoise(ah, sc->sc_curchan); + sc->sc_stats.ast_rx_noise = nf; + + do { + bf = re->m_fifo[re->m_fifo_head]; + /* This shouldn't occur! */ + if (bf == NULL) { + device_printf(sc->sc_dev, "%s: Q%d: NULL bf?\n", + __func__, + qtype); + break; + } + m = bf->bf_m; + ds = bf->bf_desc; + + /* + * Sync descriptor memory - this also syncs the buffer for us. + * + * EDMA descriptors are in cached memory. + */ + bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, + BUS_DMASYNC_POSTREAD); + rs = &bf->bf_status.ds_rxstat; + status = ath_hal_rxprocdesc(ah, ds, bf->bf_daddr, NULL, rs); +#ifdef ATH_DEBUG + if (sc->sc_debug & ATH_DEBUG_RECV_DESC) + ath_printrxbuf(sc, bf, 0, status == HAL_OK); +#endif + if (status == HAL_EINPROGRESS) + break; + + /* + * Completed descriptor. + * + * In the future we'll call ath_rx_pkt(), but it first + * has to be taught about EDMA RX queues (so it can + * access sc_rxpending correctly.) + */ + DPRINTF(sc, ATH_DEBUG_EDMA_RX, + "%s: Q%d: completed!\n", __func__, qtype); + + /* + * Remove the FIFO entry! + */ + re->m_fifo[re->m_fifo_head] = NULL; + + /* + * Skip the RX descriptor status - start at the data offset + */ + m_adj(m, sc->sc_rx_statuslen); + + /* Handle the frame */ + if (ath_rx_pkt(sc, rs, status, tsf, nf, qtype, bf)) + ngood++; + + /* Free the buffer/mbuf */ + ath_edma_rxbuf_free(sc, bf); + + /* Bump the descriptor FIFO stats */ + INCR(re->m_fifo_head, re->m_fifolen); + re->m_fifo_depth--; + /* XXX check it doesn't fall below 0 */ + } while (re->m_fifo_depth > 0); + + /* Handle resched and kickpcu appropriately */ + ATH_PCU_LOCK(sc); + if (dosched && sc->sc_kickpcu) { + CTR0(ATH_KTR_ERR, "ath_edma_recv_proc_queue(): kickpcu"); + device_printf(sc->sc_dev, "%s: handled %d descriptors\n", + __func__, ngood); + + /* + * XXX TODO: what should occur here? Just re-poke and + * re-enable the RX FIFO? + */ + sc->sc_kickpcu = 0; + } + ATH_PCU_UNLOCK(sc); + + /* Append some more fresh frames to the FIFO */ + if (dosched) + ath_edma_rxfifo_alloc(sc, qtype, re->m_fifolen); + + return (ngood); +} + +static void +ath_edma_recv_tasklet(void *arg, int npending) +{ + struct ath_softc *sc = (struct ath_softc *) arg; + + DPRINTF(sc, ATH_DEBUG_EDMA_RX, "%s: called; npending=%d\n", + __func__, + npending); + + ATH_PCU_LOCK(sc); + if (sc->sc_inreset_cnt > 0) { + device_printf(sc->sc_dev, "%s: sc_inreset_cnt > 0; skipping\n", + __func__); + ATH_PCU_UNLOCK(sc); + return; + } + ATH_PCU_UNLOCK(sc); + + ath_edma_recv_proc_queue(sc, HAL_RX_QUEUE_HP, 1); + ath_edma_recv_proc_queue(sc, HAL_RX_QUEUE_LP, 1); +} + +/* + * Allocate an RX mbuf for the given ath_buf and initialise + * it for EDMA. + * + * + Allocate a 4KB mbuf; + * + Setup the DMA map for the given buffer; + * + Keep a pointer to the start of the mbuf - that's where the + * descriptor lies; + * + Take a pointer to the start of the RX buffer, set the + * mbuf "start" to be there; + * + Return that. + */ +static int +ath_edma_rxbuf_init(struct ath_softc *sc, struct ath_buf *bf) +{ + + struct mbuf *m; + int error; + int len; + +// device_printf(sc->sc_dev, "%s: called; bf=%p\n", __func__, bf); + + m = m_getm(NULL, sc->sc_edma_bufsize, M_DONTWAIT, MT_DATA); + if (! m) + return (ENOBUFS); /* XXX ?*/ + + /* XXX warn/enforce alignment */ + + len = m->m_ext.ext_size; +#if 0 + device_printf(sc->sc_dev, "%s: called: m=%p, size=%d, mtod=%p\n", + __func__, + m, + len, + mtod(m, char *)); +#endif + + m->m_pkthdr.len = m->m_len = m->m_ext.ext_size; + + /* + * Create DMA mapping. + */ + error = bus_dmamap_load_mbuf_sg(sc->sc_dmat, + bf->bf_dmamap, m, bf->bf_segs, &bf->bf_nseg, BUS_DMA_NOWAIT); + if (error != 0) { + device_printf(sc->sc_dev, "%s: failed; error=%d\n", + __func__, + error); + m_freem(m); + return (error); + } + + /* + * Populate ath_buf fields. + */ + + bf->bf_desc = mtod(m, struct ath_desc *); + bf->bf_daddr = bf->bf_segs[0].ds_addr; + bf->bf_lastds = bf->bf_desc; /* XXX only really for TX? */ + bf->bf_m = m; + + /* Zero the descriptor */ + memset(bf->bf_desc, '\0', sc->sc_rx_statuslen); + +#if 0 + /* + * Adjust mbuf header and length/size to compensate for the + * descriptor size. + */ + m_adj(m, sc->sc_rx_statuslen); +#endif + + /* Finish! */ + + return (0); +} + +static struct ath_buf * +ath_edma_rxbuf_alloc(struct ath_softc *sc) +{ + struct ath_buf *bf; + int error; + + /* Allocate buffer */ + bf = TAILQ_FIRST(&sc->sc_rxbuf); + /* XXX shouldn't happen upon startup? */ + if (bf == NULL) + return (NULL); + + /* Remove it from the free list */ + TAILQ_REMOVE(&sc->sc_rxbuf, bf, bf_list); + + /* Assign RX mbuf to it */ + error = ath_edma_rxbuf_init(sc, bf); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: bf=%p, rxbuf alloc failed! error=%d\n", + __func__, + bf, + error); + TAILQ_INSERT_TAIL(&sc->sc_rxbuf, bf, bf_list); + return (NULL); + } + + return (bf); +} + +static void +ath_edma_rxbuf_free(struct ath_softc *sc, struct ath_buf *bf) +{ + + bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); + + if (bf->bf_m) { + m_freem(bf->bf_m); + bf->bf_m = NULL; + } + + /* XXX lock? */ + TAILQ_INSERT_TAIL(&sc->sc_rxbuf, bf, bf_list); +} + +/* + * Allocate up to 'n' entries and push them onto the hardware FIFO. + * + * Return how many entries were successfully pushed onto the + * FIFO. + */ +static int +ath_edma_rxfifo_alloc(struct ath_softc *sc, HAL_RX_QUEUE qtype, int nbufs) +{ + struct ath_rx_edma *re = &sc->sc_rxedma[qtype]; + struct ath_buf *bf; + int i; + + /* + * Allocate buffers until the FIFO is full or nbufs is reached. + */ + for (i = 0; i < nbufs && re->m_fifo_depth < re->m_fifolen; i++) { + /* Ensure the FIFO is already blank, complain loudly! */ + if (re->m_fifo[re->m_fifo_tail] != NULL) { + device_printf(sc->sc_dev, + "%s: Q%d: fifo[%d] != NULL (%p)\n", + __func__, + qtype, + re->m_fifo_tail, + re->m_fifo[re->m_fifo_tail]); + + /* Free the slot */ + ath_edma_rxbuf_free(sc, re->m_fifo[re->m_fifo_tail]); + re->m_fifo_depth--; + /* XXX check it's not < 0 */ + re->m_fifo[re->m_fifo_tail] = NULL; + } + + bf = ath_edma_rxbuf_alloc(sc); + /* XXX should ensure the FIFO is not NULL? */ + if (bf == NULL) { + device_printf(sc->sc_dev, "%s: Q%d: alloc failed?\n", + __func__, + qtype); + break; + } + + re->m_fifo[re->m_fifo_tail] = bf; + + /* + * Flush the descriptor contents before it's handed to the + * hardware. + */ + bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, + BUS_DMASYNC_PREREAD); + + /* Write to the RX FIFO */ + DPRINTF(sc, ATH_DEBUG_EDMA_RX, "%s: Q%d: putrxbuf=%p\n", + __func__, + qtype, + bf->bf_desc); + ath_hal_putrxbuf(sc->sc_ah, bf->bf_daddr, qtype); + + re->m_fifo_depth++; + INCR(re->m_fifo_tail, re->m_fifolen); + } + + /* + * Return how many were allocated. + */ + DPRINTF(sc, ATH_DEBUG_EDMA_RX, "%s: Q%d: nbufs=%d, nalloced=%d\n", + __func__, + qtype, + nbufs, + i); + return (i); +} + +static int +ath_edma_rxfifo_flush(struct ath_softc *sc, HAL_RX_QUEUE qtype) +{ + struct ath_rx_edma *re = &sc->sc_rxedma[qtype]; + int i; + + for (i = 0; i < re->m_fifolen; i++) { + if (re->m_fifo[i] != NULL) { +#ifdef ATH_DEBUG + struct ath_buf *bf = re->m_fifo[i]; + + if (sc->sc_debug & ATH_DEBUG_RECV_DESC) + ath_printrxbuf(sc, bf, 0, HAL_OK); +#endif + ath_edma_rxbuf_free(sc, re->m_fifo[i]); + re->m_fifo[i] = NULL; + re->m_fifo_depth--; + } + } + + if (re->m_rxpending != NULL) { + m_freem(re->m_rxpending); + re->m_rxpending = NULL; + } + re->m_fifo_head = re->m_fifo_tail = re->m_fifo_depth = 0; + + return (0); +} + +/* + * Setup the initial RX FIFO structure. + */ +static int +ath_edma_setup_rxfifo(struct ath_softc *sc, HAL_RX_QUEUE qtype) +{ + struct ath_rx_edma *re = &sc->sc_rxedma[qtype]; + + if (! ath_hal_getrxfifodepth(sc->sc_ah, qtype, &re->m_fifolen)) { + device_printf(sc->sc_dev, "%s: qtype=%d, failed\n", + __func__, + qtype); + return (-EINVAL); + } + device_printf(sc->sc_dev, "%s: type=%d, FIFO depth = %d entries\n", + __func__, + qtype, + re->m_fifolen); + + /* Allocate ath_buf FIFO array, pre-zero'ed */ + re->m_fifo = malloc(sizeof(struct ath_buf *) * re->m_fifolen, + M_ATHDEV, + M_NOWAIT | M_ZERO); + if (re->m_fifo == NULL) { + device_printf(sc->sc_dev, "%s: malloc failed\n", + __func__); + return (-ENOMEM); + } + + /* + * Set initial "empty" state. + */ + re->m_rxpending = NULL; + re->m_fifo_head = re->m_fifo_tail = re->m_fifo_depth = 0; + + return (0); +} + +static int +ath_edma_rxfifo_free(struct ath_softc *sc, HAL_RX_QUEUE qtype) +{ + struct ath_rx_edma *re = &sc->sc_rxedma[qtype]; + + device_printf(sc->sc_dev, "%s: called; qtype=%d\n", + __func__, + qtype); + + free(re->m_fifo, M_ATHDEV); + + return (0); +} + +static int +ath_edma_dma_rxsetup(struct ath_softc *sc) +{ + int error; + + /* Create RX DMA tag */ + /* Create RX ath_buf array */ + + error = ath_descdma_setup(sc, &sc->sc_rxdma, &sc->sc_rxbuf, + "rx", ath_rxbuf, 1); + if (error != 0) + return error; + + (void) ath_edma_setup_rxfifo(sc, HAL_RX_QUEUE_HP); + (void) ath_edma_setup_rxfifo(sc, HAL_RX_QUEUE_LP); + + return (0); +} + +static int +ath_edma_dma_rxteardown(struct ath_softc *sc) +{ + + device_printf(sc->sc_dev, "%s: called\n", __func__); + + ath_edma_rxfifo_flush(sc, HAL_RX_QUEUE_HP); + ath_edma_rxfifo_free(sc, HAL_RX_QUEUE_HP); + + ath_edma_rxfifo_flush(sc, HAL_RX_QUEUE_LP); + ath_edma_rxfifo_free(sc, HAL_RX_QUEUE_LP); + + /* Free RX ath_buf */ + /* Free RX DMA tag */ + if (sc->sc_rxdma.dd_desc_len != 0) + ath_descdma_cleanup(sc, &sc->sc_rxdma, &sc->sc_rxbuf); + + return (0); +} + +void +ath_recv_setup_edma(struct ath_softc *sc) +{ + + device_printf(sc->sc_dev, "DMA setup: EDMA\n"); + + /* Set buffer size to 4k */ + sc->sc_edma_bufsize = 4096; + + /* Configure the hardware with this */ + (void) ath_hal_setrxbufsize(sc->sc_ah, sc->sc_edma_bufsize); + + /* Fetch EDMA field and buffer sizes */ + (void) ath_hal_getrxstatuslen(sc->sc_ah, &sc->sc_rx_statuslen); + (void) ath_hal_gettxdesclen(sc->sc_ah, &sc->sc_tx_desclen); + (void) ath_hal_gettxstatuslen(sc->sc_ah, &sc->sc_tx_statuslen); + (void) ath_hal_getntxmaps(sc->sc_ah, &sc->sc_tx_nmaps); + + device_printf(sc->sc_dev, "RX status length: %d\n", + sc->sc_rx_statuslen); + device_printf(sc->sc_dev, "TX descriptor length: %d\n", + sc->sc_tx_desclen); + device_printf(sc->sc_dev, "TX status length: %d\n", + sc->sc_tx_statuslen); + device_printf(sc->sc_dev, "TX/RX buffer size: %d\n", + sc->sc_edma_bufsize); + device_printf(sc->sc_dev, "TX buffers per descriptor: %d\n", + sc->sc_tx_nmaps); + + sc->sc_rx.recv_stop = ath_edma_stoprecv; + sc->sc_rx.recv_start = ath_edma_startrecv; + sc->sc_rx.recv_flush = ath_edma_recv_flush; + sc->sc_rx.recv_tasklet = ath_edma_recv_tasklet; + sc->sc_rx.recv_rxbuf_init = ath_edma_rxbuf_init; + + sc->sc_rx.recv_setup = ath_edma_dma_rxsetup; + sc->sc_rx.recv_teardown = ath_edma_dma_rxteardown; +} diff --git a/sys/dev/ath/if_ath_rx_edma.h b/sys/dev/ath/if_ath_rx_edma.h new file mode 100644 index 00000000000..e786daa6c43 --- /dev/null +++ b/sys/dev/ath/if_ath_rx_edma.h @@ -0,0 +1,36 @@ +/*- + * Copyright (c) 2012 Adrian Chadd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ +#ifndef __IF_ATH_RX_EDMA_H__ +#define __IF_ATH_RX_EDMA_H__ + +extern void ath_recv_setup_edma(struct ath_softc *sc); + +#endif diff --git a/sys/dev/ath/if_ath_sysctl.c b/sys/dev/ath/if_ath_sysctl.c index 6e7c2c8024c..ff75888e047 100644 --- a/sys/dev/ath/if_ath_sysctl.c +++ b/sys/dev/ath/if_ath_sysctl.c @@ -374,7 +374,20 @@ ath_sysctl_txagg(SYSCTL_HANDLER_ARGS) t++; } ATH_TXBUF_UNLOCK(sc); - printf("Total TX buffers: %d; Total TX buffers busy: %d\n", + printf("Total TX buffers: %d; Total TX buffers busy: %d (%d)\n", + t, i, sc->sc_txbuf_cnt); + + i = t = 0; + ATH_TXBUF_LOCK(sc); + TAILQ_FOREACH(bf, &sc->sc_txbuf_mgmt, bf_list) { + if (bf->bf_flags & ATH_BUF_BUSY) { + printf("Busy: %d\n", t); + i++; + } + t++; + } + ATH_TXBUF_UNLOCK(sc); + printf("Total mgmt TX buffers: %d; Total mgmt TX buffers busy: %d\n", t, i); return 0; @@ -501,8 +514,8 @@ ath_sysctlattach(struct ath_softc *sc) "regdomain", CTLFLAG_RD, &sc->sc_eerd, 0, "EEPROM regdomain code"); #ifdef ATH_DEBUG - SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, - "debug", CTLFLAG_RW, &sc->sc_debug, 0, + SYSCTL_ADD_QUAD(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, + "debug", CTLFLAG_RW, &sc->sc_debug, "control debugging printfs"); #endif SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, @@ -607,12 +620,11 @@ ath_sysctlattach(struct ath_softc *sc) "tid_hwq_hi", CTLFLAG_RW, &sc->sc_tid_hwq_hi, 0, ""); -#if 0 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "txq_data_minfree", CTLFLAG_RW, &sc->sc_txq_data_minfree, 0, "Minimum free buffers before adding a data frame" " to the TX queue"); -#endif + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "txq_mcastq_maxdepth", CTLFLAG_RW, &sc->sc_txq_mcastq_maxdepth, 0, diff --git a/sys/dev/ath/if_ath_tdma.c b/sys/dev/ath/if_ath_tdma.c new file mode 100644 index 00000000000..1d04ccd91c3 --- /dev/null +++ b/sys/dev/ath/if_ath_tdma.c @@ -0,0 +1,476 @@ +/*- + * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Driver for the Atheros Wireless LAN controller. + * + * This software is derived from work of Atsushi Onoe; his contribution + * is greatly appreciated. + */ + +#include "opt_inet.h" +#include "opt_ath.h" +/* + * This is needed for register operations which are performed + * by the driver - eg, calls to ath_hal_gettsf32(). + * + * It's also required for any AH_DEBUG checks in here, eg the + * module dependencies. + */ +#include "opt_ah.h" +#include "opt_wlan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for mp_ncpus */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#ifdef IEEE80211_SUPPORT_SUPERG +#include +#endif +#ifdef IEEE80211_SUPPORT_TDMA +#include +#endif + +#include + +#ifdef INET +#include +#include +#endif + +#include +#include /* XXX for softled */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef ATH_TX99_DIAG +#include +#endif + +#ifdef IEEE80211_SUPPORT_TDMA +#include + +static void ath_tdma_settimers(struct ath_softc *sc, u_int32_t nexttbtt, + u_int32_t bintval); +static void ath_tdma_bintvalsetup(struct ath_softc *sc, + const struct ieee80211_tdma_state *tdma); +#endif /* IEEE80211_SUPPORT_TDMA */ + +#ifdef IEEE80211_SUPPORT_TDMA +static void +ath_tdma_settimers(struct ath_softc *sc, u_int32_t nexttbtt, u_int32_t bintval) +{ + struct ath_hal *ah = sc->sc_ah; + HAL_BEACON_TIMERS bt; + + bt.bt_intval = bintval | HAL_BEACON_ENA; + bt.bt_nexttbtt = nexttbtt; + bt.bt_nextdba = (nexttbtt<<3) - sc->sc_tdmadbaprep; + bt.bt_nextswba = (nexttbtt<<3) - sc->sc_tdmaswbaprep; + bt.bt_nextatim = nexttbtt+1; + /* Enables TBTT, DBA, SWBA timers by default */ + bt.bt_flags = 0; + ath_hal_beaconsettimers(ah, &bt); +} + +/* + * Calculate the beacon interval. This is periodic in the + * superframe for the bss. We assume each station is configured + * identically wrt transmit rate so the guard time we calculate + * above will be the same on all stations. Note we need to + * factor in the xmit time because the hardware will schedule + * a frame for transmit if the start of the frame is within + * the burst time. When we get hardware that properly kills + * frames in the PCU we can reduce/eliminate the guard time. + * + * Roundup to 1024 is so we have 1 TU buffer in the guard time + * to deal with the granularity of the nexttbtt timer. 11n MAC's + * with 1us timer granularity should allow us to reduce/eliminate + * this. + */ +static void +ath_tdma_bintvalsetup(struct ath_softc *sc, + const struct ieee80211_tdma_state *tdma) +{ + /* copy from vap state (XXX check all vaps have same value?) */ + sc->sc_tdmaslotlen = tdma->tdma_slotlen; + + sc->sc_tdmabintval = roundup((sc->sc_tdmaslotlen+sc->sc_tdmaguard) * + tdma->tdma_slotcnt, 1024); + sc->sc_tdmabintval >>= 10; /* TSF -> TU */ + if (sc->sc_tdmabintval & 1) + sc->sc_tdmabintval++; + + if (tdma->tdma_slot == 0) { + /* + * Only slot 0 beacons; other slots respond. + */ + sc->sc_imask |= HAL_INT_SWBA; + sc->sc_tdmaswba = 0; /* beacon immediately */ + } else { + /* XXX all vaps must be slot 0 or slot !0 */ + sc->sc_imask &= ~HAL_INT_SWBA; + } +} + +/* + * Max 802.11 overhead. This assumes no 4-address frames and + * the encapsulation done by ieee80211_encap (llc). We also + * include potential crypto overhead. + */ +#define IEEE80211_MAXOVERHEAD \ + (sizeof(struct ieee80211_qosframe) \ + + sizeof(struct llc) \ + + IEEE80211_ADDR_LEN \ + + IEEE80211_WEP_IVLEN \ + + IEEE80211_WEP_KIDLEN \ + + IEEE80211_WEP_CRCLEN \ + + IEEE80211_WEP_MICLEN \ + + IEEE80211_CRC_LEN) + +/* + * Setup initially for tdma operation. Start the beacon + * timers and enable SWBA if we are slot 0. Otherwise + * we wait for slot 0 to arrive so we can sync up before + * starting to transmit. + */ +void +ath_tdma_config(struct ath_softc *sc, struct ieee80211vap *vap) +{ + struct ath_hal *ah = sc->sc_ah; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + const struct ieee80211_txparam *tp; + const struct ieee80211_tdma_state *tdma = NULL; + int rix; + + if (vap == NULL) { + vap = TAILQ_FIRST(&ic->ic_vaps); /* XXX */ + if (vap == NULL) { + if_printf(ifp, "%s: no vaps?\n", __func__); + return; + } + } + /* XXX should take a locked ref to iv_bss */ + tp = vap->iv_bss->ni_txparms; + /* + * Calculate the guard time for each slot. This is the + * time to send a maximal-size frame according to the + * fixed/lowest transmit rate. Note that the interface + * mtu does not include the 802.11 overhead so we must + * tack that on (ath_hal_computetxtime includes the + * preamble and plcp in it's calculation). + */ + tdma = vap->iv_tdma; + if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) + rix = ath_tx_findrix(sc, tp->ucastrate); + else + rix = ath_tx_findrix(sc, tp->mcastrate); + /* XXX short preamble assumed */ + sc->sc_tdmaguard = ath_hal_computetxtime(ah, sc->sc_currates, + ifp->if_mtu + IEEE80211_MAXOVERHEAD, rix, AH_TRUE); + + ath_hal_intrset(ah, 0); + + ath_beaconq_config(sc); /* setup h/w beacon q */ + if (sc->sc_setcca) + ath_hal_setcca(ah, AH_FALSE); /* disable CCA */ + ath_tdma_bintvalsetup(sc, tdma); /* calculate beacon interval */ + ath_tdma_settimers(sc, sc->sc_tdmabintval, + sc->sc_tdmabintval | HAL_BEACON_RESET_TSF); + sc->sc_syncbeacon = 0; + + sc->sc_avgtsfdeltap = TDMA_DUMMY_MARKER; + sc->sc_avgtsfdeltam = TDMA_DUMMY_MARKER; + + ath_hal_intrset(ah, sc->sc_imask); + + DPRINTF(sc, ATH_DEBUG_TDMA, "%s: slot %u len %uus cnt %u " + "bsched %u guard %uus bintval %u TU dba prep %u\n", __func__, + tdma->tdma_slot, tdma->tdma_slotlen, tdma->tdma_slotcnt, + tdma->tdma_bintval, sc->sc_tdmaguard, sc->sc_tdmabintval, + sc->sc_tdmadbaprep); +} + +/* + * Update tdma operation. Called from the 802.11 layer + * when a beacon is received from the TDMA station operating + * in the slot immediately preceding us in the bss. Use + * the rx timestamp for the beacon frame to update our + * beacon timers so we follow their schedule. Note that + * by using the rx timestamp we implicitly include the + * propagation delay in our schedule. + */ +void +ath_tdma_update(struct ieee80211_node *ni, + const struct ieee80211_tdma_param *tdma, int changed) +{ +#define TSF_TO_TU(_h,_l) \ + ((((u_int32_t)(_h)) << 22) | (((u_int32_t)(_l)) >> 10)) +#define TU_TO_TSF(_tu) (((u_int64_t)(_tu)) << 10) + struct ieee80211vap *vap = ni->ni_vap; + struct ieee80211com *ic = ni->ni_ic; + struct ath_softc *sc = ic->ic_ifp->if_softc; + struct ath_hal *ah = sc->sc_ah; + const HAL_RATE_TABLE *rt = sc->sc_currates; + u_int64_t tsf, rstamp, nextslot, nexttbtt; + u_int32_t txtime, nextslottu; + int32_t tudelta, tsfdelta; + const struct ath_rx_status *rs; + int rix; + + sc->sc_stats.ast_tdma_update++; + + /* + * Check for and adopt configuration changes. + */ + if (changed != 0) { + const struct ieee80211_tdma_state *ts = vap->iv_tdma; + + ath_tdma_bintvalsetup(sc, ts); + if (changed & TDMA_UPDATE_SLOTLEN) + ath_wme_update(ic); + + DPRINTF(sc, ATH_DEBUG_TDMA, + "%s: adopt slot %u slotcnt %u slotlen %u us " + "bintval %u TU\n", __func__, + ts->tdma_slot, ts->tdma_slotcnt, ts->tdma_slotlen, + sc->sc_tdmabintval); + + /* XXX right? */ + ath_hal_intrset(ah, sc->sc_imask); + /* NB: beacon timers programmed below */ + } + + /* extend rx timestamp to 64 bits */ + rs = sc->sc_lastrs; + tsf = ath_hal_gettsf64(ah); + rstamp = ath_extend_tsf(sc, rs->rs_tstamp, tsf); + /* + * The rx timestamp is set by the hardware on completing + * reception (at the point where the rx descriptor is DMA'd + * to the host). To find the start of our next slot we + * must adjust this time by the time required to send + * the packet just received. + */ + rix = rt->rateCodeToIndex[rs->rs_rate]; + txtime = ath_hal_computetxtime(ah, rt, rs->rs_datalen, rix, + rt->info[rix].shortPreamble); + /* NB: << 9 is to cvt to TU and /2 */ + nextslot = (rstamp - txtime) + (sc->sc_tdmabintval << 9); + nextslottu = TSF_TO_TU(nextslot>>32, nextslot) & HAL_BEACON_PERIOD; + + /* + * Retrieve the hardware NextTBTT in usecs + * and calculate the difference between what the + * other station thinks and what we have programmed. This + * lets us figure how to adjust our timers to match. The + * adjustments are done by pulling the TSF forward and possibly + * rewriting the beacon timers. + */ + nexttbtt = ath_hal_getnexttbtt(ah); + tsfdelta = (int32_t)((nextslot % TU_TO_TSF(HAL_BEACON_PERIOD + 1)) - nexttbtt); + + DPRINTF(sc, ATH_DEBUG_TDMA_TIMER, + "tsfdelta %d avg +%d/-%d\n", tsfdelta, + TDMA_AVG(sc->sc_avgtsfdeltap), TDMA_AVG(sc->sc_avgtsfdeltam)); + + if (tsfdelta < 0) { + TDMA_SAMPLE(sc->sc_avgtsfdeltap, 0); + TDMA_SAMPLE(sc->sc_avgtsfdeltam, -tsfdelta); + tsfdelta = -tsfdelta % 1024; + nextslottu++; + } else if (tsfdelta > 0) { + TDMA_SAMPLE(sc->sc_avgtsfdeltap, tsfdelta); + TDMA_SAMPLE(sc->sc_avgtsfdeltam, 0); + tsfdelta = 1024 - (tsfdelta % 1024); + nextslottu++; + } else { + TDMA_SAMPLE(sc->sc_avgtsfdeltap, 0); + TDMA_SAMPLE(sc->sc_avgtsfdeltam, 0); + } + tudelta = nextslottu - TSF_TO_TU(nexttbtt >> 32, nexttbtt); + + /* + * Copy sender's timetstamp into tdma ie so they can + * calculate roundtrip time. We submit a beacon frame + * below after any timer adjustment. The frame goes out + * at the next TBTT so the sender can calculate the + * roundtrip by inspecting the tdma ie in our beacon frame. + * + * NB: This tstamp is subtlely preserved when + * IEEE80211_BEACON_TDMA is marked (e.g. when the + * slot position changes) because ieee80211_add_tdma + * skips over the data. + */ + memcpy(ATH_VAP(vap)->av_boff.bo_tdma + + __offsetof(struct ieee80211_tdma_param, tdma_tstamp), + &ni->ni_tstamp.data, 8); +#if 0 + DPRINTF(sc, ATH_DEBUG_TDMA_TIMER, + "tsf %llu nextslot %llu (%d, %d) nextslottu %u nexttbtt %llu (%d)\n", + (unsigned long long) tsf, (unsigned long long) nextslot, + (int)(nextslot - tsf), tsfdelta, nextslottu, nexttbtt, tudelta); +#endif + /* + * Adjust the beacon timers only when pulling them forward + * or when going back by less than the beacon interval. + * Negative jumps larger than the beacon interval seem to + * cause the timers to stop and generally cause instability. + * This basically filters out jumps due to missed beacons. + */ + if (tudelta != 0 && (tudelta > 0 || -tudelta < sc->sc_tdmabintval)) { + ath_tdma_settimers(sc, nextslottu, sc->sc_tdmabintval); + sc->sc_stats.ast_tdma_timers++; + } + if (tsfdelta > 0) { + ath_hal_adjusttsf(ah, tsfdelta); + sc->sc_stats.ast_tdma_tsf++; + } + ath_tdma_beacon_send(sc, vap); /* prepare response */ +#undef TU_TO_TSF +#undef TSF_TO_TU +} + +/* + * Transmit a beacon frame at SWBA. Dynamic updates + * to the frame contents are done as needed. + */ +void +ath_tdma_beacon_send(struct ath_softc *sc, struct ieee80211vap *vap) +{ + struct ath_hal *ah = sc->sc_ah; + struct ath_buf *bf; + int otherant; + + /* + * Check if the previous beacon has gone out. If + * not don't try to post another, skip this period + * and wait for the next. Missed beacons indicate + * a problem and should not occur. If we miss too + * many consecutive beacons reset the device. + */ + if (ath_hal_numtxpending(ah, sc->sc_bhalq) != 0) { + sc->sc_bmisscount++; + DPRINTF(sc, ATH_DEBUG_BEACON, + "%s: missed %u consecutive beacons\n", + __func__, sc->sc_bmisscount); + if (sc->sc_bmisscount >= ath_bstuck_threshold) + taskqueue_enqueue(sc->sc_tq, &sc->sc_bstucktask); + return; + } + if (sc->sc_bmisscount != 0) { + DPRINTF(sc, ATH_DEBUG_BEACON, + "%s: resume beacon xmit after %u misses\n", + __func__, sc->sc_bmisscount); + sc->sc_bmisscount = 0; + } + + /* + * Check recent per-antenna transmit statistics and flip + * the default antenna if noticeably more frames went out + * on the non-default antenna. + * XXX assumes 2 anntenae + */ + if (!sc->sc_diversity) { + otherant = sc->sc_defant & 1 ? 2 : 1; + if (sc->sc_ant_tx[otherant] > sc->sc_ant_tx[sc->sc_defant] + 2) + ath_setdefantenna(sc, otherant); + sc->sc_ant_tx[1] = sc->sc_ant_tx[2] = 0; + } + + bf = ath_beacon_generate(sc, vap); + if (bf != NULL) { + /* + * Stop any current dma and put the new frame on the queue. + * This should never fail since we check above that no frames + * are still pending on the queue. + */ + if (!ath_hal_stoptxdma(ah, sc->sc_bhalq)) { + DPRINTF(sc, ATH_DEBUG_ANY, + "%s: beacon queue %u did not stop?\n", + __func__, sc->sc_bhalq); + /* NB: the HAL still stops DMA, so proceed */ + } + ath_hal_puttxbuf(ah, sc->sc_bhalq, bf->bf_daddr); + ath_hal_txstart(ah, sc->sc_bhalq); + + sc->sc_stats.ast_be_xmit++; /* XXX per-vap? */ + + /* + * Record local TSF for our last send for use + * in arbitrating slot collisions. + */ + /* XXX should take a locked ref to iv_bss */ + vap->iv_bss->ni_tstamp.tsf = ath_hal_gettsf64(ah); + } +} +#endif /* IEEE80211_SUPPORT_TDMA */ diff --git a/sys/dev/ath/if_ath_tdma.h b/sys/dev/ath/if_ath_tdma.h new file mode 100644 index 00000000000..1e90a5f2974 --- /dev/null +++ b/sys/dev/ath/if_ath_tdma.h @@ -0,0 +1,55 @@ +/*- + * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ +#ifndef __IF_ATH_TDMA_H__ +#define __IF_ATH_TDMA_H__ + +#define TDMA_EP_MULTIPLIER (1<<10) /* pow2 to optimize out * and / */ +#define TDMA_LPF_LEN 6 +#define TDMA_DUMMY_MARKER 0x127 +#define TDMA_EP_MUL(x, mul) ((x) * (mul)) +#define TDMA_IN(x) (TDMA_EP_MUL((x), TDMA_EP_MULTIPLIER)) +#define TDMA_LPF(x, y, len) \ + ((x != TDMA_DUMMY_MARKER) ? (((x) * ((len)-1) + (y)) / (len)) : (y)) +#define TDMA_SAMPLE(x, y) do { \ + x = TDMA_LPF((x), TDMA_IN(y), TDMA_LPF_LEN); \ +} while (0) +#define TDMA_EP_RND(x,mul) \ + ((((x)%(mul)) >= ((mul)/2)) ? \ + ((x) + ((mul) - 1)) / (mul) : (x)/(mul)) +#define TDMA_AVG(x) TDMA_EP_RND(x, TDMA_EP_MULTIPLIER) + +extern void ath_tdma_config(struct ath_softc *sc, struct ieee80211vap *vap); +extern void ath_tdma_update(struct ieee80211_node *ni, + const struct ieee80211_tdma_param *tdma, int changed); +extern void ath_tdma_beacon_send(struct ath_softc *sc, + struct ieee80211vap *vap); + +#endif diff --git a/sys/dev/ath/if_ath_tsf.h b/sys/dev/ath/if_ath_tsf.h new file mode 100644 index 00000000000..cce089fab84 --- /dev/null +++ b/sys/dev/ath/if_ath_tsf.h @@ -0,0 +1,81 @@ +/*- + * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ +#ifndef __IF_ATH_TSF_H__ +#define __IF_ATH_TSF_H__ + +/* + * Extend 15-bit time stamp from rx descriptor to + * a full 64-bit TSF using the specified TSF. + */ +static __inline u_int64_t +ath_extend_tsf15(u_int32_t rstamp, u_int64_t tsf) +{ + if ((tsf & 0x7fff) < rstamp) + tsf -= 0x8000; + + return ((tsf &~ 0x7fff) | rstamp); +} + +/* + * Extend 32-bit time stamp from rx descriptor to + * a full 64-bit TSF using the specified TSF. + */ +static __inline u_int64_t +ath_extend_tsf32(u_int32_t rstamp, u_int64_t tsf) +{ + u_int32_t tsf_low = tsf & 0xffffffff; + u_int64_t tsf64 = (tsf & ~0xffffffffULL) | rstamp; + + if (rstamp > tsf_low && (rstamp - tsf_low > 0x10000000)) + tsf64 -= 0x100000000ULL; + + if (rstamp < tsf_low && (tsf_low - rstamp > 0x10000000)) + tsf64 += 0x100000000ULL; + + return tsf64; +} + +/* + * Extend the TSF from the RX descriptor to a full 64 bit TSF. + * Earlier hardware versions only wrote the low 15 bits of the + * TSF into the RX descriptor; later versions (AR5416 and up) + * include the 32 bit TSF value. + */ +static __inline u_int64_t +ath_extend_tsf(struct ath_softc *sc, u_int32_t rstamp, u_int64_t tsf) +{ + if (sc->sc_rxtsf32) + return ath_extend_tsf32(rstamp, tsf); + else + return ath_extend_tsf15(rstamp, tsf); +} + +#endif diff --git a/sys/dev/ath/if_ath_tx.c b/sys/dev/ath/if_ath_tx.c index 74e137fcb13..934f9dc0082 100644 --- a/sys/dev/ath/if_ath_tx.c +++ b/sys/dev/ath/if_ath_tx.c @@ -109,10 +109,10 @@ static int ath_tx_ampdu_pending(struct ath_softc *sc, struct ath_node *an, int tid); static int ath_tx_ampdu_running(struct ath_softc *sc, struct ath_node *an, int tid); +static ieee80211_seq ath_tx_tid_seqno_assign(struct ath_softc *sc, + struct ieee80211_node *ni, struct ath_buf *bf, struct mbuf *m0); static int ath_tx_action_frame_override_queue(struct ath_softc *sc, struct ieee80211_node *ni, struct mbuf *m0, int *tid); -static int ath_tx_seqno_required(struct ath_softc *sc, - struct ieee80211_node *ni, struct ath_buf *bf, struct mbuf *m0); /* * Whether to use the 11n rate scenario functions or not @@ -184,7 +184,7 @@ ath_txfrag_cleanup(struct ath_softc *sc, TAILQ_FOREACH_SAFE(bf, frags, bf_list, next) { /* NB: bf assumed clean */ TAILQ_REMOVE(frags, bf, bf_list); - TAILQ_INSERT_HEAD(&sc->sc_txbuf, bf, bf_list); + ath_returnbuf_head(sc, bf); ieee80211_node_decref(ni); } } @@ -203,7 +203,8 @@ ath_txfrag_setup(struct ath_softc *sc, ath_bufhead *frags, ATH_TXBUF_LOCK(sc); for (m = m0->m_nextpkt; m != NULL; m = m->m_nextpkt) { - bf = _ath_getbuf_locked(sc); + /* XXX non-management? */ + bf = _ath_getbuf_locked(sc, ATH_BUFTYPE_NORMAL); if (bf == NULL) { /* out of buffers, cleanup */ device_printf(sc->sc_dev, "%s: no buffer?\n", __func__); @@ -1171,6 +1172,15 @@ ath_tx_normal_setup(struct ath_softc *sc, struct ieee80211_node *ni, struct ath_node *an; u_int pri; + /* + * To ensure that both sequence numbers and the CCMP PN handling + * is "correct", make sure that the relevant TID queue is locked. + * Otherwise the CCMP PN and seqno may appear out of order, causing + * re-ordered frames to have out of order CCMP PN's, resulting + * in many, many frame drops. + */ + ATH_TXQ_LOCK_ASSERT(txq); + wh = mtod(m0, struct ieee80211_frame *); iswep = wh->i_fc[1] & IEEE80211_FC1_WEP; ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1); @@ -1298,6 +1308,40 @@ ath_tx_normal_setup(struct ath_softc *sc, struct ieee80211_node *ni, return EIO; } + /* + * There are two known scenarios where the frame AC doesn't match + * what the destination TXQ is. + * + * + non-QoS frames (eg management?) that the net80211 stack has + * assigned a higher AC to, but since it's a non-QoS TID, it's + * being thrown into TID 16. TID 16 gets the AC_BE queue. + * It's quite possible that management frames should just be + * direct dispatched to hardware rather than go via the software + * queue; that should be investigated in the future. There are + * some specific scenarios where this doesn't make sense, mostly + * surrounding ADDBA request/response - hence why that is special + * cased. + * + * + Multicast frames going into the VAP mcast queue. That shows up + * as "TXQ 11". + * + * This driver should eventually support separate TID and TXQ locking, + * allowing for arbitrary AC frames to appear on arbitrary software + * queues, being queued to the "correct" hardware queue when needed. + */ +#if 0 + if (txq != sc->sc_ac2q[pri]) { + device_printf(sc->sc_dev, + "%s: txq=%p (%d), pri=%d, pri txq=%p (%d)\n", + __func__, + txq, + txq->axq_qnum, + pri, + sc->sc_ac2q[pri], + sc->sc_ac2q[pri]->axq_qnum); + } +#endif + /* * Calculate miscellaneous flags. */ @@ -1424,7 +1468,7 @@ ath_tx_start(struct ath_softc *sc, struct ieee80211_node *ni, int ismcast; const struct ieee80211_frame *wh; int is_ampdu, is_ampdu_tx, is_ampdu_pending; - //ieee80211_seq seqno; + ieee80211_seq seqno; uint8_t type, subtype; /* @@ -1476,9 +1520,8 @@ ath_tx_start(struct ath_softc *sc, struct ieee80211_node *ni, is_ampdu_pending = ath_tx_ampdu_pending(sc, ATH_NODE(ni), tid); is_ampdu = is_ampdu_tx | is_ampdu_pending; - DPRINTF(sc, ATH_DEBUG_SW_TX, - "%s: bf=%p, tid=%d, ac=%d, is_ampdu=%d\n", - __func__, bf, tid, pri, is_ampdu); + DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: tid=%d, ac=%d, is_ampdu=%d\n", + __func__, tid, pri, is_ampdu); /* * When servicing one or more stations in power-save mode @@ -1494,34 +1537,33 @@ ath_tx_start(struct ath_softc *sc, struct ieee80211_node *ni, /* Do the generic frame setup */ /* XXX should just bzero the bf_state? */ bf->bf_state.bfs_dobaw = 0; - bf->bf_state.bfs_seqno_assigned = 0; - bf->bf_state.bfs_need_seqno = 0; - bf->bf_state.bfs_seqno = -1; /* XXX debugging */ + + /* + * Acquire the TXQ lock early, so both the encap and seqno + * are allocated together. + */ + ATH_TXQ_LOCK(txq); /* A-MPDU TX? Manually set sequence number */ - /* Don't do it whilst pending; the net80211 layer still assigns them */ - /* XXX do we need locking here? */ + /* + * Don't do it whilst pending; the net80211 layer still + * assigns them. + */ if (is_ampdu_tx) { - ATH_TXQ_LOCK(txq); /* * Always call; this function will * handle making sure that null data frames * don't get a sequence number from the current * TID and thus mess with the BAW. */ - //seqno = ath_tx_tid_seqno_assign(sc, ni, bf, m0); - if (ath_tx_seqno_required(sc, ni, bf, m0)) { + seqno = ath_tx_tid_seqno_assign(sc, ni, bf, m0); + + /* + * Don't add QoS NULL frames to the BAW. + */ + if (IEEE80211_QOS_HAS_SEQ(wh) && + subtype != IEEE80211_FC0_SUBTYPE_QOS_NULL) { bf->bf_state.bfs_dobaw = 1; - bf->bf_state.bfs_need_seqno = 1; - } - ATH_TXQ_UNLOCK(txq); - } else { - /* No AMPDU TX, we've been assigned a sequence number. */ - if (IEEE80211_QOS_HAS_SEQ(wh)) { - bf->bf_state.bfs_seqno_assigned = 1; - /* XXX we should store the frag+seqno in bfs_seqno */ - bf->bf_state.bfs_seqno = - M_SEQNO_GET(m0) << IEEE80211_SEQ_SEQ_SHIFT; } } @@ -1529,7 +1571,7 @@ ath_tx_start(struct ath_softc *sc, struct ieee80211_node *ni, * If needed, the sequence number has been assigned. * Squirrel it away somewhere easy to get to. */ - //bf->bf_state.bfs_seqno = M_SEQNO_GET(m0) << IEEE80211_SEQ_SEQ_SHIFT; + bf->bf_state.bfs_seqno = M_SEQNO_GET(m0) << IEEE80211_SEQ_SEQ_SHIFT; /* Is ampdu pending? fetch the seqno and print it out */ if (is_ampdu_pending) @@ -1541,15 +1583,11 @@ ath_tx_start(struct ath_softc *sc, struct ieee80211_node *ni, r = ath_tx_normal_setup(sc, ni, bf, m0, txq); if (r != 0) - return r; + goto done; /* At this point m0 could have changed! */ m0 = bf->bf_m; - DPRINTF(sc, ATH_DEBUG_SW_TX, - "%s: DONE: bf=%p, tid=%d, ac=%d, is_ampdu=%d, dobaw=%d, seqno=%d\n", - __func__, bf, tid, pri, is_ampdu, bf->bf_state.bfs_dobaw, M_SEQNO_GET(m0)); - #if 1 /* * If it's a multicast frame, do a direct-dispatch to the @@ -1568,21 +1606,17 @@ ath_tx_start(struct ath_softc *sc, struct ieee80211_node *ni, * reached.) */ if (txq == &avp->av_mcastq) { - DPRINTF(sc, ATH_DEBUG_SW_TX_CTRL, + DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: bf=%p: mcastq: TX'ing\n", __func__, bf); - ATH_TXQ_LOCK(txq); ath_tx_xmit_normal(sc, txq, bf); - ATH_TXQ_UNLOCK(txq); } else if (type == IEEE80211_FC0_TYPE_CTL && subtype == IEEE80211_FC0_SUBTYPE_BAR) { - DPRINTF(sc, ATH_DEBUG_SW_TX_CTRL, + DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: BAR: TX'ing direct\n", __func__); - ATH_TXQ_LOCK(txq); ath_tx_xmit_normal(sc, txq, bf); - ATH_TXQ_UNLOCK(txq); } else { /* add to software queue */ - DPRINTF(sc, ATH_DEBUG_SW_TX_CTRL, + DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: bf=%p: swq: TX'ing\n", __func__, bf); ath_tx_swq(sc, ni, txq, bf); } @@ -1591,10 +1625,10 @@ ath_tx_start(struct ath_softc *sc, struct ieee80211_node *ni, * For now, since there's no software queue, * direct-dispatch to the hardware. */ - ATH_TXQ_LOCK(txq); ath_tx_xmit_normal(sc, txq, bf); - ATH_TXQ_UNLOCK(txq); #endif +done: + ATH_TXQ_UNLOCK(txq); return 0; } @@ -1630,10 +1664,29 @@ ath_tx_raw_start(struct ath_softc *sc, struct ieee80211_node *ni, /* XXX honor IEEE80211_BPF_DATAPAD */ pktlen = m0->m_pkthdr.len - (hdrlen & 3) + IEEE80211_CRC_LEN; - DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: ismcast=%d\n", __func__, ismcast); + pri = params->ibp_pri & 3; + /* Override pri if the frame isn't a QoS one */ + if (! IEEE80211_QOS_HAS_SEQ(wh)) + pri = ath_tx_getac(sc, m0); + + /* XXX If it's an ADDBA, override the correct queue */ + do_override = ath_tx_action_frame_override_queue(sc, ni, m0, &o_tid); + + /* Map ADDBA to the correct priority */ + if (do_override) { +#if 0 + device_printf(sc->sc_dev, + "%s: overriding tid %d pri %d -> %d\n", + __func__, o_tid, pri, TID_TO_WME_AC(o_tid)); +#endif + pri = TID_TO_WME_AC(o_tid); + } + + ATH_TXQ_LOCK(sc->sc_ac2q[pri]); + /* Handle encryption twiddling if needed */ if (! ath_tx_tag_crypto(sc, ni, m0, params->ibp_flags & IEEE80211_BPF_CRYPTO, 0, @@ -1688,11 +1741,6 @@ ath_tx_raw_start(struct ath_softc *sc, struct ieee80211_node *ni, if (flags & (HAL_TXDESC_RTSENA|HAL_TXDESC_CTSENA)) bf->bf_state.bfs_ctsrate0 = params->ibp_ctsrate; - pri = params->ibp_pri & 3; - /* Override pri if the frame isn't a QoS one */ - if (! IEEE80211_QOS_HAS_SEQ(wh)) - pri = ath_tx_getac(sc, m0); - /* * NB: we mark all packets as type PSPOLL so the h/w won't * set the sequence number, duration, etc. @@ -1774,19 +1822,6 @@ ath_tx_raw_start(struct ath_softc *sc, struct ieee80211_node *ni, /* NB: no buffered multicast in power save support */ - /* XXX If it's an ADDBA, override the correct queue */ - do_override = ath_tx_action_frame_override_queue(sc, ni, m0, &o_tid); - - /* Map ADDBA to the correct priority */ - if (do_override) { -#if 0 - device_printf(sc->sc_dev, - "%s: overriding tid %d pri %d -> %d\n", - __func__, o_tid, pri, TID_TO_WME_AC(o_tid)); -#endif - pri = TID_TO_WME_AC(o_tid); - } - /* * If we're overiding the ADDBA destination, dump directly * into the hardware queue, right after any pending @@ -1796,13 +1831,12 @@ ath_tx_raw_start(struct ath_softc *sc, struct ieee80211_node *ni, __func__, do_override); if (do_override) { - ATH_TXQ_LOCK(sc->sc_ac2q[pri]); ath_tx_xmit_normal(sc, sc->sc_ac2q[pri], bf); - ATH_TXQ_UNLOCK(sc->sc_ac2q[pri]); } else { /* Queue to software queue */ ath_tx_swq(sc, ni, sc->sc_ac2q[pri], bf); } + ATH_TXQ_UNLOCK(sc->sc_ac2q[pri]); return 0; } @@ -1867,7 +1901,7 @@ ath_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, /* * Grab a TX buffer and associated resources. */ - bf = ath_getbuf(sc); + bf = ath_getbuf(sc, ATH_BUFTYPE_MGMT); if (bf == NULL) { sc->sc_stats.ast_tx_nobuf++; m_freem(m); @@ -1905,7 +1939,7 @@ ath_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, return 0; bad2: ATH_TXBUF_LOCK(sc); - TAILQ_INSERT_HEAD(&sc->sc_txbuf, bf, bf_list); + ath_returnbuf_head(sc, bf); ATH_TXBUF_UNLOCK(sc); bad: ATH_PCU_LOCK(sc); @@ -2027,27 +2061,27 @@ ath_tx_addto_baw(struct ath_softc *sc, struct ath_node *an, struct ieee80211_tx_ampdu *tap; ATH_TXQ_LOCK_ASSERT(sc->sc_ac2q[tid->ac]); + ATH_TID_LOCK_ASSERT(sc, tid); if (bf->bf_state.bfs_isretried) return; - /* - * If this occurs we're in a lot of trouble. We should try to - * recover from this without the session hanging? - */ - if (! bf->bf_state.bfs_seqno_assigned) { - device_printf(sc->sc_dev, - "%s: bf=%p, seqno_assigned is 0?!\n", __func__, bf); - return; - } - tap = ath_tx_get_tx_tid(an, tid->tid); + if (! bf->bf_state.bfs_dobaw) { + device_printf(sc->sc_dev, + "%s: dobaw=0, seqno=%d, window %d:%d\n", + __func__, + SEQNO(bf->bf_state.bfs_seqno), + tap->txa_start, + tap->txa_wnd); + } + if (bf->bf_state.bfs_addedbaw) device_printf(sc->sc_dev, - "%s: re-added? bf=%p, tid=%d, seqno %d; window %d:%d; " + "%s: re-added? tid=%d, seqno %d; window %d:%d; " "baw head=%d tail=%d\n", - __func__, bf, tid->tid, SEQNO(bf->bf_state.bfs_seqno), + __func__, tid->tid, SEQNO(bf->bf_state.bfs_seqno), tap->txa_start, tap->txa_wnd, tid->baw_head, tid->baw_tail); @@ -2063,7 +2097,6 @@ ath_tx_addto_baw(struct ath_softc *sc, struct ath_node *an, __func__, bf, tid->tid, SEQNO(bf->bf_state.bfs_seqno), tap->txa_start, tap->txa_wnd, tid->baw_head, tid->baw_tail); - } /* @@ -2073,9 +2106,9 @@ ath_tx_addto_baw(struct ath_softc *sc, struct ath_node *an, index = ATH_BA_INDEX(tap->txa_start, SEQNO(bf->bf_state.bfs_seqno)); cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1); DPRINTF(sc, ATH_DEBUG_SW_TX_BAW, - "%s: bf=%p, tid=%d, seqno %d; window %d:%d; index=%d cindex=%d " + "%s: tid=%d, seqno %d; window %d:%d; index=%d cindex=%d " "baw head=%d tail=%d\n", - __func__, bf, tid->tid, SEQNO(bf->bf_state.bfs_seqno), + __func__, tid->tid, SEQNO(bf->bf_state.bfs_seqno), tap->txa_start, tap->txa_wnd, index, cindex, tid->baw_head, tid->baw_tail); @@ -2124,6 +2157,7 @@ ath_tx_switch_baw_buf(struct ath_softc *sc, struct ath_node *an, int seqno = SEQNO(old_bf->bf_state.bfs_seqno); ATH_TXQ_LOCK_ASSERT(sc->sc_ac2q[tid->ac]); + ATH_TID_LOCK_ASSERT(sc, tid); tap = ath_tx_get_tx_tid(an, tid->tid); index = ATH_BA_INDEX(tap->txa_start, seqno); @@ -2172,15 +2206,16 @@ ath_tx_update_baw(struct ath_softc *sc, struct ath_node *an, int seqno = SEQNO(bf->bf_state.bfs_seqno); ATH_TXQ_LOCK_ASSERT(sc->sc_ac2q[tid->ac]); + ATH_TID_LOCK_ASSERT(sc, tid); tap = ath_tx_get_tx_tid(an, tid->tid); index = ATH_BA_INDEX(tap->txa_start, seqno); cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1); DPRINTF(sc, ATH_DEBUG_SW_TX_BAW, - "%s: bf=%p: tid=%d, baw=%d:%d, seqno=%d, index=%d, cindex=%d, " + "%s: tid=%d, baw=%d:%d, seqno=%d, index=%d, cindex=%d, " "baw head=%d, tail=%d\n", - __func__, bf, tid->tid, tap->txa_start, tap->txa_wnd, seqno, index, + __func__, tid->tid, tap->txa_start, tap->txa_wnd, seqno, index, cindex, tid->baw_head, tid->baw_tail); /* @@ -2260,52 +2295,12 @@ ath_tx_tid_unsched(struct ath_softc *sc, struct ath_tid *tid) TAILQ_REMOVE(&txq->axq_tidq, tid, axq_qelem); } -/* - * Return whether a sequence number is actually required. - * - * A sequence number must only be allocated at the time that a frame - * is considered for addition to the BAW/aggregate and being TXed. - * The sequence number must not be allocated before the frame - * is added to the BAW (protected by the same lock instance) - * otherwise a the multi-entrant TX path may result in a later seqno - * being added to the BAW first. The subsequent addition of the - * earlier seqno would then not go into the BAW as it's now outside - * of said BAW. - * - * This routine is used by ath_tx_start() to mark whether the frame - * should get a sequence number before adding it to the BAW. - * - * Then the actual aggregate TX routines will check whether this - * flag is set and if the frame needs to go into the BAW, it'll - * have a sequence number allocated for it. - */ -static int -ath_tx_seqno_required(struct ath_softc *sc, struct ieee80211_node *ni, - struct ath_buf *bf, struct mbuf *m0) -{ - const struct ieee80211_frame *wh; - uint8_t subtype; - - wh = mtod(m0, const struct ieee80211_frame *); - subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; - - /* XXX assert txq lock */ - /* XXX assert ampdu is set */ - - return ((IEEE80211_QOS_HAS_SEQ(wh) && - subtype != IEEE80211_FC0_SUBTYPE_QOS_NULL)); -} - /* * Assign a sequence number manually to the given frame. * * This should only be called for A-MPDU TX frames. - * - * If this is called after the initial frame setup, make sure you've flushed - * the DMA map or you'll risk sending stale data to the NIC. This routine - * updates the actual frame contents with the relevant seqno. */ -int +static ieee80211_seq ath_tx_tid_seqno_assign(struct ath_softc *sc, struct ieee80211_node *ni, struct ath_buf *bf, struct mbuf *m0) { @@ -2318,22 +2313,8 @@ ath_tx_tid_seqno_assign(struct ath_softc *sc, struct ieee80211_node *ni, wh = mtod(m0, struct ieee80211_frame *); pri = M_WME_GETAC(m0); /* honor classification */ tid = WME_AC_TO_TID(pri); - DPRINTF(sc, ATH_DEBUG_SW_TX, - "%s: bf=%p, pri=%d, tid=%d, qos has seq=%d\n", - __func__, bf, pri, tid, IEEE80211_QOS_HAS_SEQ(wh)); - - if (! bf->bf_state.bfs_need_seqno) { - device_printf(sc->sc_dev, "%s: bf=%p: need_seqno not set?!\n", - __func__, bf); - return -1; - } - /* XXX check for bfs_need_seqno? */ - if (bf->bf_state.bfs_seqno_assigned) { - device_printf(sc->sc_dev, - "%s: bf=%p: seqno already assigned (%d)?!\n", - __func__, bf, SEQNO(bf->bf_state.bfs_seqno)); - return bf->bf_state.bfs_seqno >> IEEE80211_SEQ_SEQ_SHIFT; - } + DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: pri=%d, tid=%d, qos has seq=%d\n", + __func__, pri, tid, IEEE80211_QOS_HAS_SEQ(wh)); /* XXX Is it a control frame? Ignore */ @@ -2341,6 +2322,8 @@ ath_tx_tid_seqno_assign(struct ath_softc *sc, struct ieee80211_node *ni, if (! IEEE80211_QOS_HAS_SEQ(wh)) return -1; + ATH_TID_LOCK_ASSERT(sc, &(ATH_NODE(ni)->an_tid[tid])); + /* * Is it a QOS NULL Data frame? Give it a sequence number from * the default TID (IEEE80211_NONQOS_TID.) @@ -2352,6 +2335,7 @@ ath_tx_tid_seqno_assign(struct ath_softc *sc, struct ieee80211_node *ni, */ subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; if (subtype == IEEE80211_FC0_SUBTYPE_QOS_NULL) { + /* XXX no locking for this TID? This is a bit of a problem. */ seqno = ni->ni_txseqs[IEEE80211_NONQOS_TID]; INCR(ni->ni_txseqs[IEEE80211_NONQOS_TID], IEEE80211_SEQ_RANGE); } else { @@ -2361,14 +2345,9 @@ ath_tx_tid_seqno_assign(struct ath_softc *sc, struct ieee80211_node *ni, } *(uint16_t *)&wh->i_seq[0] = htole16(seqno << IEEE80211_SEQ_SEQ_SHIFT); M_SEQNO_SET(m0, seqno); - bf->bf_state.bfs_seqno = seqno << IEEE80211_SEQ_SEQ_SHIFT; - bf->bf_state.bfs_seqno_assigned = 1; /* Return so caller can do something with it if needed */ - DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: bf=%p: -> seqno=%d\n", - __func__, - bf, - seqno); + DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: -> seqno=%d\n", __func__, seqno); return seqno; } @@ -2380,98 +2359,27 @@ ath_tx_tid_seqno_assign(struct ath_softc *sc, struct ieee80211_node *ni, static void ath_tx_xmit_aggr(struct ath_softc *sc, struct ath_node *an, struct ath_buf *bf) { - struct ieee80211_node *ni = &an->an_node; struct ath_tid *tid = &an->an_tid[bf->bf_state.bfs_tid]; struct ath_txq *txq = bf->bf_state.bfs_txq; struct ieee80211_tx_ampdu *tap; ATH_TXQ_LOCK_ASSERT(txq); + ATH_TID_LOCK_ASSERT(sc, tid); tap = ath_tx_get_tx_tid(an, tid->tid); /* paused? queue */ if (tid->paused) { - ATH_TXQ_INSERT_TAIL(tid, bf, bf_list); + ATH_TXQ_INSERT_HEAD(tid, bf, bf_list); /* XXX don't sched - we're paused! */ return; } - /* - * TODO: If it's _before_ the BAW left edge, complain very loudly. - * This means something (else) has slid the left edge along - * before we got a chance to be TXed. - */ - - /* - * Is there space in this BAW for another frame? - * If not, don't bother trying to schedule it; just - * throw it back on the queue. - * - * If we allocate the sequence number before we add - * it to the BAW, we risk racing with another TX - * thread that gets in a frame into the BAW with - * seqno greater than ours. We'd then fail the - * below check and throw the frame on the tail of - * the queue. The sender would then have a hole. - * - * XXX again, we're protecting ni->ni_txseqs[tid] - * behind this hardware TXQ lock, like the rest of - * the TIDs that map to it. Ugh. - */ - if (bf->bf_state.bfs_dobaw) { - ieee80211_seq seqno; - - /* - * If the sequence number is allocated, use it. - * Otherwise, use the sequence number we WOULD - * allocate. - */ - if (bf->bf_state.bfs_seqno_assigned) - seqno = SEQNO(bf->bf_state.bfs_seqno); - else - seqno = ni->ni_txseqs[bf->bf_state.bfs_tid]; - - /* - * Check whether either the currently allocated - * sequence number _OR_ the to-be allocated - * sequence number is inside the BAW. - */ - if (! BAW_WITHIN(tap->txa_start, tap->txa_wnd, seqno)) { - ATH_TXQ_INSERT_TAIL(tid, bf, bf_list); - ath_tx_tid_sched(sc, tid); - return; - } - if (! bf->bf_state.bfs_seqno_assigned) { - int seqno; - - seqno = ath_tx_tid_seqno_assign(sc, ni, bf, bf->bf_m); - if (seqno < 0) { - device_printf(sc->sc_dev, - "%s: bf=%p, huh, seqno=-1?\n", - __func__, - bf); - /* XXX what can we even do here? */ - } - /* Flush seqno update to RAM */ - /* - * XXX This is required because the dmasetup - * XXX is done early rather than at dispatch - * XXX time. Ew, we should fix this! - */ - bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, - BUS_DMASYNC_PREWRITE); - } - } - /* outside baw? queue */ if (bf->bf_state.bfs_dobaw && (! BAW_WITHIN(tap->txa_start, tap->txa_wnd, SEQNO(bf->bf_state.bfs_seqno)))) { - device_printf(sc->sc_dev, - "%s: bf=%p, shouldn't be outside BAW now?!\n", - __func__, - bf); - ATH_TXQ_INSERT_TAIL(tid, bf, bf_list); + ATH_TXQ_INSERT_HEAD(tid, bf, bf_list); ath_tx_tid_sched(sc, tid); return; } @@ -2521,14 +2429,18 @@ ath_tx_swq(struct ath_softc *sc, struct ieee80211_node *ni, struct ath_txq *txq, int pri, tid; struct mbuf *m0 = bf->bf_m; + ATH_TXQ_LOCK_ASSERT(txq); + /* Fetch the TID - non-QoS frames get assigned to TID 16 */ wh = mtod(m0, struct ieee80211_frame *); pri = ath_tx_getac(sc, m0); tid = ath_tx_gettid(sc, m0); atid = &an->an_tid[tid]; - DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: bf=%p, pri=%d, tid=%d, qos=%d, seqno=%d\n", - __func__, bf, pri, tid, IEEE80211_QOS_HAS_SEQ(wh), SEQNO(bf->bf_state.bfs_seqno)); + ATH_TID_LOCK_ASSERT(sc, atid); + + DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: bf=%p, pri=%d, tid=%d, qos=%d\n", + __func__, bf, pri, tid, IEEE80211_QOS_HAS_SEQ(wh)); /* Set local packet state, used to queue packets to hardware */ bf->bf_state.bfs_tid = tid; @@ -2541,41 +2453,53 @@ ath_tx_swq(struct ath_softc *sc, struct ieee80211_node *ni, struct ath_txq *txq, * If the TID is paused or the traffic it outside BAW, software * queue it. */ - ATH_TXQ_LOCK(txq); if (atid->paused) { /* TID is paused, queue */ - DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: bf=%p: paused\n", __func__, bf); + DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: paused\n", __func__); ATH_TXQ_INSERT_TAIL(atid, bf, bf_list); } else if (ath_tx_ampdu_pending(sc, an, tid)) { /* AMPDU pending; queue */ - DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: bf=%p: pending\n", __func__, bf); + DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: pending\n", __func__); ATH_TXQ_INSERT_TAIL(atid, bf, bf_list); /* XXX sched? */ } else if (ath_tx_ampdu_running(sc, an, tid)) { /* AMPDU running, attempt direct dispatch if possible */ + + /* + * Always queue the frame to the tail of the list. + */ + ATH_TXQ_INSERT_TAIL(atid, bf, bf_list); + + /* + * If the hardware queue isn't busy, direct dispatch + * the head frame in the list. Don't schedule the + * TID - let it build some more frames first? + * + * Otherwise, schedule the TID. + */ if (txq->axq_depth < sc->sc_hwq_limit) { - DPRINTF(sc, ATH_DEBUG_SW_TX, - "%s: bf=%p: xmit_aggr\n", - __func__, bf); + bf = TAILQ_FIRST(&atid->axq_q); + ATH_TXQ_REMOVE(atid, bf, bf_list); ath_tx_xmit_aggr(sc, an, bf); + DPRINTF(sc, ATH_DEBUG_SW_TX, + "%s: xmit_aggr\n", + __func__); } else { DPRINTF(sc, ATH_DEBUG_SW_TX, - "%s: bf=%p: ampdu; swq'ing\n", - __func__, bf); - ATH_TXQ_INSERT_TAIL(atid, bf, bf_list); + "%s: ampdu; swq'ing\n", + __func__); ath_tx_tid_sched(sc, atid); } } else if (txq->axq_depth < sc->sc_hwq_limit) { /* AMPDU not running, attempt direct dispatch */ - DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: bf=%p: xmit_normal\n", __func__, bf); + DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: xmit_normal\n", __func__); ath_tx_xmit_normal(sc, txq, bf); } else { /* Busy; queue */ - DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: bf=%p: swq'ing\n", __func__, bf); + DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: swq'ing\n", __func__); ATH_TXQ_INSERT_TAIL(atid, bf, bf_list); ath_tx_tid_sched(sc, atid); } - ATH_TXQ_UNLOCK(txq); } /* @@ -2673,10 +2597,12 @@ ath_tx_tid_bar_suspend(struct ath_softc *sc, struct ath_tid *tid) { ATH_TXQ_LOCK_ASSERT(sc->sc_ac2q[tid->ac]); - DPRINTF(sc, ATH_DEBUG_SW_TX_BAW, - "%s: tid=%p, called\n", + DPRINTF(sc, ATH_DEBUG_SW_TX_BAR, + "%s: tid=%p, bar_wait=%d, bar_tx=%d, called\n", __func__, - tid); + tid, + tid->bar_wait, + tid->bar_tx); /* We shouldn't be called when bar_tx is 1 */ if (tid->bar_tx) { @@ -2704,7 +2630,7 @@ ath_tx_tid_bar_unsuspend(struct ath_softc *sc, struct ath_tid *tid) { ATH_TXQ_LOCK_ASSERT(sc->sc_ac2q[tid->ac]); - DPRINTF(sc, ATH_DEBUG_SW_TX_BAW, + DPRINTF(sc, ATH_DEBUG_SW_TX_BAR, "%s: tid=%p, called\n", __func__, tid); @@ -2732,6 +2658,9 @@ ath_tx_tid_bar_tx_ready(struct ath_softc *sc, struct ath_tid *tid) if (tid->bar_wait == 0 || tid->hwq_depth > 0) return (0); + DPRINTF(sc, ATH_DEBUG_SW_TX_BAR, "%s: tid=%p (%d), bar ready\n", + __func__, tid, tid->tid); + return (1); } @@ -2754,7 +2683,7 @@ ath_tx_tid_bar_tx(struct ath_softc *sc, struct ath_tid *tid) ATH_TXQ_LOCK_ASSERT(sc->sc_ac2q[tid->ac]); - DPRINTF(sc, ATH_DEBUG_SW_TX_BAW, + DPRINTF(sc, ATH_DEBUG_SW_TX_BAR, "%s: tid=%p, called\n", __func__, tid); @@ -2776,7 +2705,7 @@ ath_tx_tid_bar_tx(struct ath_softc *sc, struct ath_tid *tid) /* Don't do anything if we still have pending frames */ if (tid->hwq_depth > 0) { - DPRINTF(sc, ATH_DEBUG_SW_TX_BAW, + DPRINTF(sc, ATH_DEBUG_SW_TX_BAR, "%s: tid=%p, hwq_depth=%d, waiting\n", __func__, tid, @@ -2793,7 +2722,7 @@ ath_tx_tid_bar_tx(struct ath_softc *sc, struct ath_tid *tid) * * XXX verify this is _actually_ the valid value to begin at! */ - DPRINTF(sc, ATH_DEBUG_SW_TX_BAW, + DPRINTF(sc, ATH_DEBUG_SW_TX_BAR, "%s: tid=%p, new BAW left edge=%d\n", __func__, tid, @@ -2856,25 +2785,24 @@ ath_tx_tid_drain(struct ath_softc *sc, struct ath_node *an, if (t == 0) { device_printf(sc->sc_dev, "%s: node %p: bf=%p: addbaw=%d, dobaw=%d, " - "seqno_assign=%d, seqno_required=%d, seqno=%d, retry=%d\n", + "seqno=%d, retry=%d\n", __func__, ni, bf, bf->bf_state.bfs_addedbaw, bf->bf_state.bfs_dobaw, - bf->bf_state.bfs_need_seqno, - bf->bf_state.bfs_seqno_assigned, SEQNO(bf->bf_state.bfs_seqno), bf->bf_state.bfs_retries); device_printf(sc->sc_dev, - "%s: node %p: bf=%p: tid txq_depth=%d hwq_depth=%d\n", + "%s: node %p: bf=%p: tid txq_depth=%d hwq_depth=%d, bar_wait=%d\n", __func__, ni, bf, tid->axq_depth, - tid->hwq_depth); + tid->hwq_depth, + tid->bar_wait); device_printf(sc->sc_dev, - "%s: node %p: bf=%p: tid %d: txq_depth=%d, " + "%s: node %p: tid %d: txq_depth=%d, " "txq_aggr_depth=%d, sched=%d, paused=%d, " "hwq_depth=%d, incomp=%d, baw_head=%d, " "baw_tail=%d txa_start=%d, ni_txseqs=%d\n", - __func__, ni, bf, tid->tid, txq->axq_depth, + __func__, ni, tid->tid, txq->axq_depth, txq->axq_aggr_depth, tid->sched, tid->paused, tid->hwq_depth, tid->incomp, tid->baw_head, tid->baw_tail, tap == NULL ? -1 : tap->txa_start, @@ -3088,14 +3016,14 @@ ath_tx_comp_cleanup_unaggr(struct ath_softc *sc, struct ath_buf *bf) * The caller is responsible for pausing the TID. */ static void -ath_tx_cleanup(struct ath_softc *sc, struct ath_node *an, int tid) +ath_tx_tid_cleanup(struct ath_softc *sc, struct ath_node *an, int tid) { struct ath_tid *atid = &an->an_tid[tid]; struct ieee80211_tx_ampdu *tap; struct ath_buf *bf, *bf_next; ath_bufhead bf_cq; - DPRINTF(sc, ATH_DEBUG_SW_TX_CTRL, + DPRINTF(sc, ATH_DEBUG_SW_TX_BAW, "%s: TID %d: called\n", __func__, tid); TAILQ_INIT(&bf_cq); @@ -3232,7 +3160,7 @@ ath_tx_retry_clone(struct ath_softc *sc, struct ath_node *an, * the list.) */ ATH_TXBUF_LOCK(sc); - TAILQ_INSERT_HEAD(&sc->sc_txbuf, nbf, bf_list); + ath_returnbuf_head(sc, nbf); ATH_TXBUF_UNLOCK(sc); return NULL; } @@ -3455,6 +3383,9 @@ ath_tx_comp_aggr_error(struct ath_softc *sc, struct ath_buf *bf_first, ATH_TXQ_INSERT_HEAD(tid, bf, bf_list); } + /* + * Schedule the TID to be re-tried. + */ ath_tx_tid_sched(sc, tid); /* @@ -3469,12 +3400,9 @@ ath_tx_comp_aggr_error(struct ath_softc *sc, struct ath_buf *bf_first, ath_tx_tid_bar_suspend(sc, tid); } - ATH_TXQ_UNLOCK(sc->sc_ac2q[tid->ac]); - /* * Send BAR if required */ - ATH_TXQ_LOCK(sc->sc_ac2q[tid->ac]); if (ath_tx_tid_bar_tx_ready(sc, tid)) ath_tx_tid_bar_tx(sc, tid); ATH_TXQ_UNLOCK(sc->sc_ac2q[tid->ac]); @@ -3562,7 +3490,7 @@ ath_tx_aggr_comp_aggr(struct ath_softc *sc, struct ath_buf *bf_first, int nframes = 0, nbad = 0, nf; int pktlen; /* XXX there's too much on the stack? */ - struct ath_rc_series rc[4]; + struct ath_rc_series rc[ATH_RC_NUM]; int txseq; DPRINTF(sc, ATH_DEBUG_SW_TX_AGGR, "%s: called; hwq_depth=%d\n", @@ -3597,9 +3525,16 @@ ath_tx_aggr_comp_aggr(struct ath_softc *sc, struct ath_buf *bf_first, pktlen = bf_first->bf_state.bfs_pktlen; /* - * handle errors first + * Handle errors first! + * + * Here, handle _any_ error as a "exceeded retries" error. + * Later on (when filtered frames are to be specially handled) + * it'll have to be expanded. */ +#if 0 if (ts.ts_status & HAL_TXERR_XRETRY) { +#endif + if (ts.ts_status != 0) { ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->ac]); ath_tx_comp_aggr_error(sc, bf_first, atid); return; @@ -3648,6 +3583,10 @@ ath_tx_aggr_comp_aggr(struct ath_softc *sc, struct ath_buf *bf_first, "seq_st=%d\n", __func__, hasba, tx_ok, isaggr, seq_st); /* XXX TODO: schedule an interface reset */ +#ifdef ATH_DEBUG + ath_printtxbuf(sc, bf_first, + sc->sc_ac2q[atid->ac]->axq_qnum, 0, 0); +#endif } /* @@ -3742,24 +3681,28 @@ ath_tx_aggr_comp_aggr(struct ath_softc *sc, struct ath_buf *bf_first, ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->ac]); } - /* Prepend all frames to the beginning of the queue */ + DPRINTF(sc, ATH_DEBUG_SW_TX_AGGR, + "%s: txa_start now %d\n", __func__, tap->txa_start); + ATH_TXQ_LOCK(sc->sc_ac2q[atid->ac]); + + /* Prepend all frames to the beginning of the queue */ while ((bf = TAILQ_LAST(&bf_q, ath_bufhead_s)) != NULL) { TAILQ_REMOVE(&bf_q, bf, bf_list); ATH_TXQ_INSERT_HEAD(atid, bf, bf_list); } - ath_tx_tid_sched(sc, atid); - ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->ac]); - DPRINTF(sc, ATH_DEBUG_SW_TX_AGGR, - "%s: txa_start now %d\n", __func__, tap->txa_start); + /* + * Reschedule to grab some further frames. + */ + ath_tx_tid_sched(sc, atid); /* * Send BAR if required */ - ATH_TXQ_LOCK(sc->sc_ac2q[atid->ac]); if (ath_tx_tid_bar_tx_ready(sc, atid)) ath_tx_tid_bar_tx(sc, atid); + ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->ac]); /* Do deferred completion */ @@ -3835,7 +3778,10 @@ ath_tx_aggr_comp_unaggr(struct ath_softc *sc, struct ath_buf *bf, int fail) * Don't bother with the retry check if all frames * are being failed (eg during queue deletion.) */ +#if 0 if (fail == 0 && ts->ts_status & HAL_TXERR_XRETRY) { +#endif + if (fail == 0 && ts->ts_status != 0) { ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->ac]); DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: retry_unaggr\n", __func__); @@ -4303,9 +4249,17 @@ ath_addba_request(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap, * it'll be "after" the left edge of the BAW and thus it'll * fall within it. */ - ATH_TXQ_LOCK(sc->sc_ac2q[atid->tid]); - ath_tx_tid_pause(sc, atid); - ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->tid]); + ATH_TXQ_LOCK(sc->sc_ac2q[atid->ac]); + /* + * This is a bit annoying. Until net80211 HT code inherits some + * (any) locking, we may have this called in parallel BUT only + * one response/timeout will be called. Grr. + */ + if (atid->addba_tx_pending == 0) { + ath_tx_tid_pause(sc, atid); + atid->addba_tx_pending = 1; + } + ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->ac]); DPRINTF(sc, ATH_DEBUG_SW_TX_CTRL, "%s: called; dialogtoken=%d, baparamset=%d, batimeout=%d\n", @@ -4365,6 +4319,7 @@ ath_addba_response(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap, r = sc->sc_addba_response(ni, tap, status, code, batimeout); ATH_TXQ_LOCK(sc->sc_ac2q[atid->ac]); + atid->addba_tx_pending = 0; /* * XXX dirty! * Slide the BAW left edge to wherever net80211 left it for us. @@ -4379,6 +4334,9 @@ ath_addba_response(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap, /* * Stop ADDBA on a queue. + * + * This can be called whilst BAR TX is currently active on the queue, + * so make sure this is unblocked before continuing. */ void ath_addba_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap) @@ -4390,20 +4348,32 @@ ath_addba_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap) DPRINTF(sc, ATH_DEBUG_SW_TX_CTRL, "%s: called\n", __func__); - /* Pause TID traffic early, so there aren't any races */ - ATH_TXQ_LOCK(sc->sc_ac2q[atid->tid]); + /* + * Pause TID traffic early, so there aren't any races + * Unblock the pending BAR held traffic, if it's currently paused. + */ + ATH_TXQ_LOCK(sc->sc_ac2q[atid->ac]); ath_tx_tid_pause(sc, atid); - ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->tid]); + if (atid->bar_wait) { + /* + * bar_unsuspend() expects bar_tx == 1, as it should be + * called from the TX completion path. This quietens + * the warning. It's cleared for us anyway. + */ + atid->bar_tx = 1; + ath_tx_tid_bar_unsuspend(sc, atid); + } + ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->ac]); /* There's no need to hold the TXQ lock here */ sc->sc_addba_stop(ni, tap); /* - * ath_tx_cleanup will resume the TID if possible, otherwise + * ath_tx_tid_cleanup will resume the TID if possible, otherwise * it'll set the cleanup flag, and it'll be unpaused once * things have been cleaned up. */ - ath_tx_cleanup(sc, an, tid); + ath_tx_tid_cleanup(sc, an, tid); } /* @@ -4426,8 +4396,15 @@ ath_bar_response(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap, struct ath_tid *atid = &an->an_tid[tid]; int attempts = tap->txa_attempts; - DPRINTF(sc, ATH_DEBUG_SW_TX_CTRL, - "%s: called; status=%d\n", __func__, status); + DPRINTF(sc, ATH_DEBUG_SW_TX_BAR, + "%s: called; tap=%p, atid=%p, txa_tid=%d, atid->tid=%d, status=%d, attempts=%d\n", + __func__, + tap, + atid, + tap->txa_tid, + atid->tid, + status, + attempts); /* Note: This may update the BAW details */ sc->sc_bar_response(ni, tap, status); @@ -4461,6 +4438,10 @@ ath_addba_response_timeout(struct ieee80211_node *ni, DPRINTF(sc, ATH_DEBUG_SW_TX_CTRL, "%s: called; resuming\n", __func__); + ATH_TXQ_LOCK(sc->sc_ac2q[atid->ac]); + atid->addba_tx_pending = 0; + ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->ac]); + /* Note: This updates the aggregate state to (again) pending */ sc->sc_addba_response_timeout(ni, tap); diff --git a/sys/dev/ath/if_ath_tx.h b/sys/dev/ath/if_ath_tx.h index 979a51b128b..958acf9449e 100644 --- a/sys/dev/ath/if_ath_tx.h +++ b/sys/dev/ath/if_ath_tx.h @@ -109,8 +109,6 @@ extern void ath_tx_addto_baw(struct ath_softc *sc, struct ath_node *an, struct ath_tid *tid, struct ath_buf *bf); extern struct ieee80211_tx_ampdu * ath_tx_get_tx_tid(struct ath_node *an, int tid); -extern int ath_tx_tid_seqno_assign(struct ath_softc *sc, - struct ieee80211_node *ni, struct ath_buf *bf, struct mbuf *m0); /* TX addba handling */ extern int ath_addba_request(struct ieee80211_node *ni, diff --git a/sys/dev/ath/if_ath_tx_ht.c b/sys/dev/ath/if_ath_tx_ht.c index a2fc1c00eb9..e9ec632d51e 100644 --- a/sys/dev/ath/if_ath_tx_ht.c +++ b/sys/dev/ath/if_ath_tx_ht.c @@ -96,9 +96,10 @@ __FBSDID("$FreeBSD$"); */ #define IEEE80211_AMPDU_SUBFRAME_DEFAULT 32 -#define ATH_AGGR_DELIM_SZ 4 /* delimiter size */ +#define ATH_AGGR_DELIM_SZ 4 /* delimiter size */ #define ATH_AGGR_MINPLEN 256 /* in bytes, minimum packet length */ -#define ATH_AGGR_ENCRYPTDELIM 10 /* number of delimiters for encryption padding */ +/* number of delimiters for encryption padding */ +#define ATH_AGGR_ENCRYPTDELIM 10 /* * returns delimiter padding required given the packet length @@ -414,7 +415,7 @@ ath_get_aggr_limit(struct ath_softc *sc, struct ath_buf *bf) int amin = 65530; int i; - for (i = 0; i < 4; i++) { + for (i = 0; i < ATH_RC_NUM; i++) { if (bf->bf_state.bfs_rc[i].tries == 0) continue; amin = MIN(amin, bf->bf_state.bfs_rc[i].max4msframelen); @@ -438,7 +439,6 @@ static void ath_rateseries_setup(struct ath_softc *sc, struct ieee80211_node *ni, struct ath_buf *bf, HAL_11N_RATE_SERIES *series) { -#define HT_RC_2_STREAMS(_rc) ((((_rc) & 0x78) >> 3) + 1) struct ieee80211com *ic = ni->ni_ic; struct ath_hal *ah = sc->sc_ah; HAL_BOOL shortPreamble = AH_FALSE; @@ -466,7 +466,7 @@ ath_rateseries_setup(struct ath_softc *sc, struct ieee80211_node *ni, * XXX fields. */ memset(series, 0, sizeof(HAL_11N_RATE_SERIES) * 4); - for (i = 0; i < 4; i++) { + for (i = 0; i < ATH_RC_NUM; i++) { /* Only set flags for actual TX attempts */ if (rc[i].tries == 0) continue; @@ -512,7 +512,10 @@ ath_rateseries_setup(struct ath_softc *sc, struct ieee80211_node *ni, series[i].Rate = rt->info[rc[i].rix].rateCode; - /* PktDuration doesn't include slot, ACK, RTS, etc timing - it's just the packet duration */ + /* + * PktDuration doesn't include slot, ACK, RTS, etc timing - + * it's just the packet duration + */ if (series[i].Rate & IEEE80211_RATE_MCS) { series[i].PktDuration = ath_computedur_ht(pktlen @@ -528,16 +531,16 @@ ath_rateseries_setup(struct ath_softc *sc, struct ieee80211_node *ni, rt, pktlen, rc[i].rix, shortPreamble); } } -#undef HT_RC_2_STREAMS } #if 0 static void -ath_rateseries_print(HAL_11N_RATE_SERIES *series) +ath_rateseries_print(struct ath_softc *sc, HAL_11N_RATE_SERIES *series) { int i; - for (i = 0; i < 4; i++) { - printf("series %d: rate %x; tries %d; pktDuration %d; chSel %d; rateFlags %x\n", + for (i = 0; i < ATH_RC_NUM; i++) { + device_printf(sc->sc_dev ,"series %d: rate %x; tries %d; " + "pktDuration %d; chSel %d; rateFlags %x\n", i, series[i].Rate, series[i].Tries, @@ -582,19 +585,34 @@ ath_buf_set_rate(struct ath_softc *sc, struct ieee80211_node *ni, #if 0 printf("pktlen: %d; flags 0x%x\n", pktlen, flags); - ath_rateseries_print(series); + ath_rateseries_print(sc, series); #endif /* Set rate scenario */ + /* + * Note: Don't allow hardware to override the duration on + * ps-poll packets. + */ ath_hal_set11nratescenario(ah, ds, !is_pspoll, /* whether to override the duration or not */ - /* don't allow hardware to override the duration on ps-poll packets */ ctsrate, /* rts/cts rate */ series, /* 11n rate series */ 4, /* number of series */ flags); /* Setup the last descriptor in the chain */ + /* + * XXX Why is this done here, and not in the upper layer? + * The rate control code stores a copy of the RC info in + * the last descriptor as well as the first, then uses + * the shadow copy in the last descriptor to see what the RC + * decisions were. I'm not sure why; perhaps earlier hardware + * overwrote the first descriptor contents. + * + * In the 802.11n case, it also clears the moreaggr/delim + * fields. Again, this should be done by the caller of + * ath_buf_set_rate(). + */ ath_hal_setuplasttxdesc(ah, lastds, ds); /* Set burst duration */ @@ -630,8 +648,9 @@ ath_buf_set_rate(struct ath_softc *sc, struct ieee80211_node *ni, * descriptor setup, and ath_buf_set_rate() will configure the * rate control. * - * Note that the TID lock is only grabbed when dequeuing packets from - * the TID queue. If some code in another thread adds to the head of this + * The TID lock is required for the entirety of this function. + * + * If some code in another thread adds to the head of this * list, very strange behaviour will occur. Since retransmission is the * only reason this will occur, and this routine is designed to be called * from within the scheduler task, it won't ever clash with the completion @@ -641,10 +660,10 @@ ath_buf_set_rate(struct ath_softc *sc, struct ieee80211_node *ni, * dispatch aggregate frames to the hardware), please keep this in mind. */ ATH_AGGR_STATUS -ath_tx_form_aggr(struct ath_softc *sc, struct ath_node *an, struct ath_tid *tid, - ath_bufhead *bf_q) +ath_tx_form_aggr(struct ath_softc *sc, struct ath_node *an, + struct ath_tid *tid, ath_bufhead *bf_q) { - struct ieee80211_node *ni = &an->an_node; + //struct ieee80211_node *ni = &an->an_node; struct ath_buf *bf, *bf_first = NULL, *bf_prev = NULL; int nframes = 0; uint16_t aggr_limit = 0, al = 0, bpad = 0, al_delta, h_baw; @@ -750,75 +769,12 @@ ath_tx_form_aggr(struct ath_softc *sc, struct ath_node *an, struct ath_tid *tid, bf_first->bf_state.bfs_txflags & (HAL_TXDESC_RTSENA | HAL_TXDESC_CTSENA); - /* - * TODO: If it's _before_ the BAW left edge, complain very - * loudly. - * - * This means something (else) has slid the left edge along - * before we got a chance to be TXed. - */ - - /* - * Check if we have space in the BAW for this frame before - * we add it. - * - * see ath_tx_xmit_aggr() for more info. - */ - if (bf->bf_state.bfs_dobaw) { - ieee80211_seq seqno; - - /* - * If the sequence number is allocated, use it. - * Otherwise, use the sequence number we WOULD - * allocate. - */ - if (bf->bf_state.bfs_seqno_assigned) - seqno = SEQNO(bf->bf_state.bfs_seqno); - else - seqno = ni->ni_txseqs[bf->bf_state.bfs_tid]; - - /* - * Check whether either the currently allocated - * sequence number _OR_ the to-be allocated - * sequence number is inside the BAW. - */ - if (! BAW_WITHIN(tap->txa_start, tap->txa_wnd, - seqno)) { - status = ATH_AGGR_BAW_CLOSED; - break; - } - - /* XXX check for bfs_need_seqno? */ - if (! bf->bf_state.bfs_seqno_assigned) { - int seqno; - seqno = ath_tx_tid_seqno_assign(sc, ni, bf, bf->bf_m); - if (seqno < 0) { - device_printf(sc->sc_dev, - "%s: bf=%p, huh, seqno=-1?\n", - __func__, - bf); - /* XXX what can we even do here? */ - } - /* Flush seqno update to RAM */ - /* - * XXX This is required because the dmasetup - * XXX is done early rather than at dispatch - * XXX time. Ew, we should fix this! - */ - bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, - BUS_DMASYNC_PREWRITE); - } - } - /* * If the packet has a sequence number, do not * step outside of the block-ack window. */ if (! BAW_WITHIN(tap->txa_start, tap->txa_wnd, SEQNO(bf->bf_state.bfs_seqno))) { - device_printf(sc->sc_dev, - "%s: bf=%p, seqno=%d, outside?!\n", - __func__, bf, SEQNO(bf->bf_state.bfs_seqno)); status = ATH_AGGR_BAW_CLOSED; break; } diff --git a/sys/dev/ath/if_athdfs.h b/sys/dev/ath/if_athdfs.h index 215b8ca467b..3529671f3a9 100644 --- a/sys/dev/ath/if_athdfs.h +++ b/sys/dev/ath/if_athdfs.h @@ -35,7 +35,7 @@ extern int ath_dfs_attach(struct ath_softc *sc); extern int ath_dfs_detach(struct ath_softc *sc); extern int ath_dfs_radar_enable(struct ath_softc *, struct ieee80211_channel *chan); -extern void ath_dfs_process_phy_err(struct ath_softc *sc, const char *buf, +extern void ath_dfs_process_phy_err(struct ath_softc *sc, struct mbuf *m, uint64_t tsf, struct ath_rx_status *rxstat); extern int ath_dfs_process_radar_event(struct ath_softc *sc, struct ieee80211_channel *chan); diff --git a/sys/dev/ath/if_athioctl.h b/sys/dev/ath/if_athioctl.h index 8627a6bf88a..71813ae1835 100644 --- a/sys/dev/ath/if_athioctl.h +++ b/sys/dev/ath/if_athioctl.h @@ -166,6 +166,7 @@ struct ath_stats { #define SIOCGATHSTATS _IOWR('i', 137, struct ifreq) #define SIOCZATHSTATS _IOWR('i', 139, struct ifreq) +#define SIOCGATHAGSTATS _IOWR('i', 141, struct ifreq) struct ath_diag { char ad_name[IFNAMSIZ]; /* if name, e.g. "ath0" */ @@ -186,7 +187,7 @@ struct ath_diag { /* * Radio capture format. */ -#define ATH_RX_RADIOTAP_PRESENT ( \ +#define ATH_RX_RADIOTAP_PRESENT_BASE ( \ (1 << IEEE80211_RADIOTAP_TSFT) | \ (1 << IEEE80211_RADIOTAP_FLAGS) | \ (1 << IEEE80211_RADIOTAP_RATE) | \ @@ -196,8 +197,80 @@ struct ath_diag { (1 << IEEE80211_RADIOTAP_XCHANNEL) | \ 0) +#ifdef ATH_ENABLE_RADIOTAP_VENDOR_EXT +#define ATH_RX_RADIOTAP_PRESENT \ + (ATH_RX_RADIOTAP_PRESENT_BASE | \ + (1 << IEEE80211_RADIOTAP_VENDOREXT) | \ + (1 << IEEE80211_RADIOTAP_EXT) | \ + 0) +#else +#define ATH_RX_RADIOTAP_PRESENT ATH_RX_RADIOTAP_PRESENT_BASE +#endif /* ATH_ENABLE_RADIOTAP_PRESENT */ + +#ifdef ATH_ENABLE_RADIOTAP_VENDOR_EXT +/* + * This is higher than the vendor bitmap used inside + * the Atheros reference codebase. + */ + +/* Bit 8 */ +#define ATH_RADIOTAP_VENDOR_HEADER 8 + +/* + * Using four chains makes all the fields in the + * per-chain info header be 4-byte aligned. + */ +#define ATH_RADIOTAP_MAX_CHAINS 4 + +/* + * The vendor radiotap header data needs to be: + * + * + Aligned to a 4 byte address + * + .. so all internal fields are 4 bytes aligned; + * + .. and no 64 bit fields are allowed. + * + * So padding is required to ensure this is the case. + * + * Note that because of the lack of alignment with the + * vendor header (6 bytes), the first field must be + * two bytes so it can be accessed by alignment-strict + * platform (eg MIPS.) + */ +struct ath_radiotap_vendor_hdr { /* 30 bytes */ + uint8_t vh_version; /* 1 */ + uint8_t vh_rx_chainmask; /* 1 */ + + /* At this point it should be 4 byte aligned */ + uint32_t evm[ATH_RADIOTAP_MAX_CHAINS]; /* 4 * 4 = 16 */ + + uint8_t rssi_ctl[ATH_RADIOTAP_MAX_CHAINS]; /* 4 */ + uint8_t rssi_ext[ATH_RADIOTAP_MAX_CHAINS]; /* 4 */ + + uint8_t vh_phyerr_code; /* Phy error code, or 0xff */ + uint8_t vh_rs_status; /* RX status */ + uint8_t vh_rssi; /* Raw RSSI */ + uint8_t vh_pad1[1]; /* Pad to 4 byte boundary */ +} __packed; +#endif /* ATH_ENABLE_RADIOTAP_VENDOR_EXT */ + struct ath_rx_radiotap_header { struct ieee80211_radiotap_header wr_ihdr; + +#ifdef ATH_ENABLE_RADIOTAP_VENDOR_EXT + /* Vendor extension header bitmap */ + uint32_t wr_ext_bitmap; /* 4 */ + + /* + * This padding is needed because: + * + the radiotap header is 8 bytes; + * + the extension bitmap is 4 bytes; + * + the tsf is 8 bytes, so it must start on an 8 byte + * boundary. + */ + uint32_t wr_pad1; +#endif /* ATH_ENABLE_RADIOTAP_VENDOR_EXT */ + + /* Normal radiotap fields */ u_int64_t wr_tsf; u_int8_t wr_flags; u_int8_t wr_rate; @@ -209,6 +282,26 @@ struct ath_rx_radiotap_header { u_int16_t wr_chan_freq; u_int8_t wr_chan_ieee; int8_t wr_chan_maxpow; + +#ifdef ATH_ENABLE_RADIOTAP_VENDOR_EXT + /* + * Vendor header section, as required by the + * presence of the vendor extension bit and bitmap + * entry. + * + * XXX This must be aligned to a 4 byte address? + * XXX or 8 byte address? + */ + struct ieee80211_radiotap_vendor_header wr_vh; /* 6 bytes */ + + /* + * Because of the lack of alignment enforced by the above + * header, this vendor section won't be aligned in any + * useful way. So, this will include a two-byte version + * value which will force the structure to be 4-byte aligned. + */ + struct ath_radiotap_vendor_hdr wr_v; +#endif /* ATH_ENABLE_RADIOTAP_VENDOR_EXT */ } __packed; #define ATH_TX_RADIOTAP_PRESENT ( \ diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h index a651a9f015f..7370e017d45 100644 --- a/sys/dev/ath/if_athvar.h +++ b/sys/dev/ath/if_athvar.h @@ -43,11 +43,19 @@ #define ATH_TIMEOUT 1000 +/* + * There is a separate TX ath_buf pool for management frames. + * This ensures that management frames such as probe responses + * and BAR frames can be transmitted during periods of high + * TX activity. + */ +#define ATH_MGMT_TXBUF 32 + /* * 802.11n requires more TX and RX buffers to do AMPDU. */ #ifdef ATH_ENABLE_11N -#define ATH_TXBUF 128 +#define ATH_TXBUF 512 #define ATH_RXBUF 512 #endif @@ -106,6 +114,7 @@ struct ath_tid { TAILQ_ENTRY(ath_tid) axq_qelem; int sched; int paused; /* >0 if the TID has been paused */ + int addba_tx_pending; /* TX ADDBA pending */ int bar_wait; /* waiting for BAR */ int bar_tx; /* BAR TXed */ @@ -171,6 +180,11 @@ struct ath_node { ((((x)%(mul)) >= ((mul)/2)) ? ((x) + ((mul) - 1)) / (mul) : (x)/(mul)) #define ATH_RSSI(x) ATH_EP_RND(x, HAL_RSSI_EP_MULTIPLIER) +typedef enum { + ATH_BUFTYPE_NORMAL = 0, + ATH_BUFTYPE_MGMT = 1, +} ath_buf_type_t; + struct ath_buf { TAILQ_ENTRY(ath_buf) bf_list; struct ath_buf * bf_next; /* next buffer in the aggregate */ @@ -197,15 +211,16 @@ struct ath_buf { /* This state is kept to support software retries and aggregation */ struct { - int bfs_seqno; /* sequence number of this packet */ - int bfs_retries; /* retry count */ - uint16_t bfs_tid; /* packet TID (or TID_MAX for no QoS) */ - uint16_t bfs_pri; /* packet AC priority */ - struct ath_txq *bfs_txq; /* eventual dest hardware TXQ */ - uint16_t bfs_pktdur; /* packet duration (at current rate?) */ - uint16_t bfs_nframes; /* number of frames in aggregate */ + uint16_t bfs_seqno; /* sequence number of this packet */ uint16_t bfs_ndelim; /* number of delims for padding */ + uint8_t bfs_retries; /* retry count */ + uint8_t bfs_tid; /* packet TID (or TID_MAX for no QoS) */ + uint8_t bfs_nframes; /* number of frames in aggregate */ + uint8_t bfs_pri; /* packet AC priority */ + + struct ath_txq *bfs_txq; /* eventual dest hardware TXQ */ + u_int32_t bfs_aggr:1, /* part of aggregate? */ bfs_aggrburst:1, /* part of aggregate burst? */ bfs_isretried:1, /* retried frame? */ @@ -215,36 +230,44 @@ struct ath_buf { bfs_istxfrag:1, /* is fragmented */ bfs_ismrr:1, /* do multi-rate TX retry */ bfs_doprot:1, /* do RTS/CTS based protection */ - bfs_doratelookup:1, /* do rate lookup before each TX */ - bfs_need_seqno:1, /* need to assign a seqno for aggr */ - bfs_seqno_assigned:1; /* seqno has been assigned */ - - int bfs_nfl; /* next fragment length */ + bfs_doratelookup:1; /* do rate lookup before each TX */ /* * These fields are passed into the * descriptor setup functions. */ + + /* Make this an 8 bit value? */ HAL_PKT_TYPE bfs_atype; /* packet type */ - int bfs_pktlen; /* length of this packet */ - int bfs_hdrlen; /* length of this packet header */ + + uint32_t bfs_pktlen; /* length of this packet */ + + uint16_t bfs_hdrlen; /* length of this packet header */ uint16_t bfs_al; /* length of aggregate */ - int bfs_txflags; /* HAL (tx) descriptor flags */ - int bfs_txrate0; /* first TX rate */ - int bfs_try0; /* first try count */ + + uint16_t bfs_txflags; /* HAL (tx) descriptor flags */ + uint8_t bfs_txrate0; /* first TX rate */ + uint8_t bfs_try0; /* first try count */ + + uint16_t bfs_txpower; /* tx power */ uint8_t bfs_ctsrate0; /* Non-zero - use this as ctsrate */ - int bfs_keyix; /* crypto key index */ - int bfs_txpower; /* tx power */ - int bfs_txantenna; /* TX antenna config */ + uint8_t bfs_ctsrate; /* CTS rate */ + + /* 16 bit? */ + int32_t bfs_keyix; /* crypto key index */ + int32_t bfs_txantenna; /* TX antenna config */ + + /* Make this an 8 bit value? */ enum ieee80211_protmode bfs_protmode; - HAL_11N_RATE_SERIES bfs_rc11n[ATH_RC_NUM]; /* 11n TX series */ - int bfs_ctsrate; /* CTS rate */ - int bfs_ctsduration; /* CTS duration (pre-11n NICs) */ + + /* 16 bit? */ + uint32_t bfs_ctsduration; /* CTS duration (pre-11n NICs) */ struct ath_rc_series bfs_rc[ATH_RC_NUM]; /* non-11n TX series */ } bf_state; }; typedef TAILQ_HEAD(ath_bufhead_s, ath_buf) ath_bufhead; +#define ATH_BUF_MGMT 0x00000001 /* (tx) desc is a mgmt desc */ #define ATH_BUF_BUSY 0x00000002 /* (tx) desc owned by h/w */ /* @@ -304,6 +327,9 @@ struct ath_txq { #define ATH_TXQ_LOCK_ASSERT(_tq) mtx_assert(&(_tq)->axq_lock, MA_OWNED) #define ATH_TXQ_IS_LOCKED(_tq) mtx_owned(&(_tq)->axq_lock) +#define ATH_TID_LOCK_ASSERT(_sc, _tid) \ + ATH_TXQ_LOCK_ASSERT((_sc)->sc_ac2q[(_tid)->ac]) + #define ATH_TXQ_INSERT_HEAD(_tq, _elm, _field) do { \ TAILQ_INSERT_HEAD(&(_tq)->axq_q, (_elm), _field); \ (_tq)->axq_depth++; \ @@ -346,12 +372,35 @@ typedef enum { ATH_RESET_FULL = 2, } ATH_RESET_TYPE; +struct ath_rx_methods { + void (*recv_stop)(struct ath_softc *sc, int dodelay); + int (*recv_start)(struct ath_softc *sc); + void (*recv_flush)(struct ath_softc *sc); + void (*recv_tasklet)(void *arg, int npending); + int (*recv_rxbuf_init)(struct ath_softc *sc, + struct ath_buf *bf); + int (*recv_setup)(struct ath_softc *sc); + int (*recv_teardown)(struct ath_softc *sc); +}; + +/* + * Represent the current state of the RX FIFO. + */ +struct ath_rx_edma { + struct ath_buf **m_fifo; + int m_fifolen; + int m_fifo_head; + int m_fifo_tail; + int m_fifo_depth; + struct mbuf *m_rxpending; +}; + struct ath_softc { struct ifnet *sc_ifp; /* interface common */ struct ath_stats sc_stats; /* interface statistics */ struct ath_tx_aggr_stats sc_aggr_stats; struct ath_intr_stats sc_intr_stats; - int sc_debug; + uint64_t sc_debug; int sc_nvaps; /* # vaps */ int sc_nstavaps; /* # station vaps */ int sc_nmeshvaps; /* # mbss vaps */ @@ -359,6 +408,14 @@ struct ath_softc { u_int8_t sc_nbssid0; /* # vap's using base mac */ uint32_t sc_bssidmask; /* bssid mask */ + struct ath_rx_methods sc_rx; + struct ath_rx_edma sc_rxedma[2]; /* HP/LP queues */ + int sc_rx_statuslen; + int sc_tx_desclen; + int sc_tx_statuslen; + int sc_tx_nmaps; /* Number of TX maps */ + int sc_edma_bufsize; + void (*sc_node_cleanup)(struct ieee80211_node *); void (*sc_node_free)(struct ieee80211_node *); device_t sc_dev; @@ -402,7 +459,8 @@ struct ath_softc { sc_setcca : 1,/* set/clr CCA with TDMA */ sc_resetcal : 1,/* reset cal state next trip */ sc_rxslink : 1,/* do self-linked final descriptor */ - sc_rxtsf32 : 1;/* RX dec TSF is 32 bits */ + sc_rxtsf32 : 1,/* RX dec TSF is 32 bits */ + sc_isedma : 1;/* supports EDMA */ uint32_t sc_eerd; /* regdomain from EEPROM */ uint32_t sc_eecc; /* country code from EEPROM */ /* rate tables */ @@ -473,7 +531,6 @@ struct ath_softc { struct ath_descdma sc_rxdma; /* RX descriptors */ ath_bufhead sc_rxbuf; /* receive buffer */ - struct mbuf *sc_rxpending; /* pending receive data */ u_int32_t *sc_rxlink; /* link ptr in last RX desc */ struct task sc_rxtask; /* rx int processing */ u_int8_t sc_defant; /* current default antenna */ @@ -486,6 +543,9 @@ struct ath_softc { struct ath_descdma sc_txdma; /* TX descriptors */ ath_bufhead sc_txbuf; /* transmit buffer */ + int sc_txbuf_cnt; /* how many buffers avail */ + struct ath_descdma sc_txdma_mgmt; /* mgmt TX descriptors */ + ath_bufhead sc_txbuf_mgmt; /* mgmt transmit buffer */ struct mtx sc_txbuflock; /* txbuf lock */ char sc_txname[12]; /* e.g. "ath0_buf" */ u_int sc_txqsetup; /* h/w queues setup */ @@ -705,8 +765,8 @@ void ath_intr(void *); ((*(_ah)->ah_setMulticastFilter)((_ah), (_mfilt0), (_mfilt1))) #define ath_hal_waitforbeacon(_ah, _bf) \ ((*(_ah)->ah_waitForBeaconDone)((_ah), (_bf)->bf_daddr)) -#define ath_hal_putrxbuf(_ah, _bufaddr) \ - ((*(_ah)->ah_setRxDP)((_ah), (_bufaddr))) +#define ath_hal_putrxbuf(_ah, _bufaddr, _rxq) \ + ((*(_ah)->ah_setRxDP)((_ah), (_bufaddr), (_rxq))) /* NB: common across all chips */ #define AR_TSF_L32 0x804c /* MAC local clock lower 32 bits */ #define ath_hal_gettsf32(_ah) \ @@ -723,8 +783,8 @@ void ath_intr(void *); ((*(_ah)->ah_getTxDP)((_ah), (_q))) #define ath_hal_numtxpending(_ah, _q) \ ((*(_ah)->ah_numTxPending)((_ah), (_q))) -#define ath_hal_getrxbuf(_ah) \ - ((*(_ah)->ah_getRxDP)((_ah))) +#define ath_hal_getrxbuf(_ah, _rxq) \ + ((*(_ah)->ah_getRxDP)((_ah), (_rxq))) #define ath_hal_txstart(_ah, _q) \ ((*(_ah)->ah_startTxDma)((_ah), (_q))) #define ath_hal_setchannel(_ah, _chan) \ @@ -913,8 +973,34 @@ void ath_intr(void *); #define ath_hal_setintmit(_ah, _v) \ ath_hal_setcapability(_ah, HAL_CAP_INTMIT, \ HAL_CAP_INTMIT_ENABLE, _v, NULL) + +/* EDMA definitions */ +#define ath_hal_hasedma(_ah) \ + (ath_hal_getcapability(_ah, HAL_CAP_ENHANCED_DMA_SUPPORT, \ + 0, NULL) == HAL_OK) +#define ath_hal_getrxfifodepth(_ah, _qtype, _req) \ + (ath_hal_getcapability(_ah, HAL_CAP_RXFIFODEPTH, _qtype, _req) \ + == HAL_OK) +#define ath_hal_getntxmaps(_ah, _req) \ + (ath_hal_getcapability(_ah, HAL_CAP_NUM_TXMAPS, 0, _req) \ + == HAL_OK) +#define ath_hal_gettxdesclen(_ah, _req) \ + (ath_hal_getcapability(_ah, HAL_CAP_TXDESCLEN, 0, _req) \ + == HAL_OK) +#define ath_hal_gettxstatuslen(_ah, _req) \ + (ath_hal_getcapability(_ah, HAL_CAP_TXSTATUSLEN, 0, _req) \ + == HAL_OK) +#define ath_hal_getrxstatuslen(_ah, _req) \ + (ath_hal_getcapability(_ah, HAL_CAP_RXSTATUSLEN, 0, _req) \ + == HAL_OK) +#define ath_hal_setrxbufsize(_ah, _req) \ + (ath_hal_setcapability(_ah, HAL_CAP_RXBUFSIZE, 0, _req, NULL) \ + == HAL_OK) + #define ath_hal_getchannoise(_ah, _c) \ ((*(_ah)->ah_getChanNoise)((_ah), (_c))) + +/* 802.11n HAL methods */ #define ath_hal_getrxchainmask(_ah, _prxchainmask) \ (ath_hal_getcapability(_ah, HAL_CAP_RX_CHAINMASK, 0, _prxchainmask)) #define ath_hal_gettxchainmask(_ah, _ptxchainmask) \ @@ -994,6 +1080,14 @@ void ath_intr(void *); #define ath_hal_gpiosetintr(_ah, _gpio, _b) \ ((*(_ah)->ah_gpioSetIntr)((_ah), (_gpio), (_b))) +/* + * PCIe suspend/resume/poweron/poweroff related macros + */ +#define ath_hal_enablepcie(_ah, _restore, _poweroff) \ + ((*(_ah)->ah_configPCIE)((_ah), (_restore), (_poweroff))) +#define ath_hal_disablepcie(_ah) \ + ((*(_ah)->ah_disablePCIE)((_ah))) + /* * This is badly-named; you need to set the correct parameters * to begin to receive useful radar events; and even then @@ -1011,6 +1105,8 @@ void ath_intr(void *); ((*(_ah)->ah_isFastClockEnabled)((_ah))) #define ath_hal_radar_wait(_ah, _chan) \ ((*(_ah)->ah_radarWait)((_ah), (_chan))) +#define ath_hal_get_mib_cycle_counts(_ah, _sample) \ + ((*(_ah)->ah_getMibCycleCounts)((_ah), (_sample))) #define ath_hal_get_chan_ext_busy(_ah) \ ((*(_ah)->ah_get11nExtBusy)((_ah))) diff --git a/sys/dev/atkbdc/atkbdc_isa.c b/sys/dev/atkbdc/atkbdc_isa.c index 72412ad4cbf..c55e3562724 100644 --- a/sys/dev/atkbdc/atkbdc_isa.c +++ b/sys/dev/atkbdc/atkbdc_isa.c @@ -87,6 +87,7 @@ static driver_t atkbdc_isa_driver = { static struct isa_pnp_id atkbdc_ids[] = { { 0x0303d041, "Keyboard controller (i8042)" }, /* PNP0303 */ + { 0x0b03d041, "Keyboard controller (i8042)" }, /* PNP030B */ { 0x2003d041, "Keyboard controller (i8042)" }, /* PNP0320 */ { 0 } }; diff --git a/sys/dev/bce/if_bce.c b/sys/dev/bce/if_bce.c index e0014c885ed..f381dadf80d 100644 --- a/sys/dev/bce/if_bce.c +++ b/sys/dev/bce/if_bce.c @@ -364,6 +364,7 @@ static int bce_nvram_write (struct bce_softc *, u32, u8 *, int); static void bce_get_rx_buffer_sizes(struct bce_softc *, int); static void bce_get_media (struct bce_softc *); static void bce_init_media (struct bce_softc *); +static u32 bce_get_rphy_link (struct bce_softc *); static void bce_dma_map_addr (void *, bus_dma_segment_t *, int, int); static int bce_dma_alloc (device_t); static void bce_dma_free (struct bce_softc *); @@ -372,6 +373,7 @@ static void bce_release_resources (struct bce_softc *); /****************************************************************************/ /* BCE Firmware Synchronization and Load */ /****************************************************************************/ +static void bce_fw_cap_init (struct bce_softc *); static int bce_fw_sync (struct bce_softc *, u32); static void bce_load_rv2p_fw (struct bce_softc *, u32 *, u32, u32); static void bce_load_cpu_fw (struct bce_softc *, @@ -418,6 +420,7 @@ static void bce_watchdog (struct bce_softc *); static int bce_ifmedia_upd (struct ifnet *); static int bce_ifmedia_upd_locked (struct ifnet *); static void bce_ifmedia_sts (struct ifnet *, struct ifmediareq *); +static void bce_ifmedia_sts_rphy (struct bce_softc *, struct ifmediareq *); static void bce_init_locked (struct bce_softc *); static void bce_init (void *); static void bce_mgmt_init_locked (struct bce_softc *sc); @@ -527,7 +530,7 @@ SYSCTL_UINT(_hw_bce, OID_AUTO, hdr_split, CTLFLAG_RDTUN, &bce_hdr_split, 0, /* Allowable values are TRUE or FALSE. */ static int bce_strict_rx_mtu = FALSE; TUNABLE_INT("hw.bce.strict_rx_mtu", &bce_strict_rx_mtu); -SYSCTL_UINT(_hw_bce, OID_AUTO, loose_rx_mtu, CTLFLAG_RDTUN, +SYSCTL_UINT(_hw_bce, OID_AUTO, strict_rx_mtu, CTLFLAG_RDTUN, &bce_strict_rx_mtu, 0, "Enable/Disable strict RX frame size checking"); @@ -757,6 +760,13 @@ bce_print_adapter_info(struct bce_softc *sc) printf("2.5G"); i++; } + if (sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) { + if (i > 0) printf("|"); + printf("Remote PHY(%s)", + sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG ? + "FIBER" : "TP"); i++; + } + if (sc->bce_flags & BCE_MFW_ENABLE_FLAG) { if (i > 0) printf("|"); printf("MFW); MFW (%s)\n", sc->bce_mfw_ver); @@ -1297,6 +1307,9 @@ bce_attach(device_t dev) if (val & BCE_PCICFG_MISC_STATUS_32BIT_DET) sc->bce_flags |= BCE_PCI_32BIT_FLAG; + /* Find the media type for the adapter. */ + bce_get_media(sc); + /* Reset controller and announce to bootcode that driver is present. */ if (bce_reset(sc, BCE_DRV_MSG_CODE_RESET)) { BCE_PRINTF("%s(%d): Controller reset failed!\n", @@ -1344,9 +1357,6 @@ bce_attach(device_t dev) /* Update statistics once every second. */ sc->bce_stats_ticks = 1000000 & 0xffff00; - /* Find the media type for the adapter. */ - bce_get_media(sc); - /* Store data needed by PHY driver for backplane applications */ sc->bce_shared_hw_cfg = bce_shmem_rd(sc, BCE_SHARED_HW_CFG_CONFIG); sc->bce_port_hw_cfg = bce_shmem_rd(sc, BCE_PORT_HW_CFG_CONFIG); @@ -1386,6 +1396,15 @@ bce_attach(device_t dev) ifp->if_capabilities = BCE_IF_CAPABILITIES; } +#if __FreeBSD_version >= 800505 + /* + * Introducing IFCAP_LINKSTATE didn't bump __FreeBSD_version + * so it's approximate value. + */ + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) != 0) + ifp->if_capabilities |= IFCAP_LINKSTATE; +#endif + ifp->if_capenable = ifp->if_capabilities; /* @@ -1409,14 +1428,52 @@ bce_attach(device_t dev) /* Handle any special PHY initialization for SerDes PHYs. */ bce_init_media(sc); - /* MII child bus by attaching the PHY. */ - rc = mii_attach(dev, &sc->bce_miibus, ifp, bce_ifmedia_upd, - bce_ifmedia_sts, BMSR_DEFCAPMASK, sc->bce_phy_addr, - MII_OFFSET_ANY, MIIF_DOPAUSE); - if (rc != 0) { - BCE_PRINTF("%s(%d): attaching PHYs failed\n", __FILE__, - __LINE__); - goto bce_attach_fail; + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) != 0) { + ifmedia_init(&sc->bce_ifmedia, IFM_IMASK, bce_ifmedia_upd, + bce_ifmedia_sts); + /* + * We can't manually override remote PHY's link and assume + * PHY port configuration(Fiber or TP) is not changed after + * device attach. This may not be correct though. + */ + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG) != 0) { + if (sc->bce_phy_flags & BCE_PHY_2_5G_CAPABLE_FLAG) { + ifmedia_add(&sc->bce_ifmedia, + IFM_ETHER | IFM_2500_SX, 0, NULL); + ifmedia_add(&sc->bce_ifmedia, + IFM_ETHER | IFM_2500_SX | IFM_FDX, 0, NULL); + } + ifmedia_add(&sc->bce_ifmedia, + IFM_ETHER | IFM_1000_SX, 0, NULL); + ifmedia_add(&sc->bce_ifmedia, + IFM_ETHER | IFM_1000_SX | IFM_FDX, 0, NULL); + } else { + ifmedia_add(&sc->bce_ifmedia, + IFM_ETHER | IFM_10_T, 0, NULL); + ifmedia_add(&sc->bce_ifmedia, + IFM_ETHER | IFM_10_T | IFM_FDX, 0, NULL); + ifmedia_add(&sc->bce_ifmedia, + IFM_ETHER | IFM_100_TX, 0, NULL); + ifmedia_add(&sc->bce_ifmedia, + IFM_ETHER | IFM_100_TX | IFM_FDX, 0, NULL); + ifmedia_add(&sc->bce_ifmedia, + IFM_ETHER | IFM_1000_T, 0, NULL); + ifmedia_add(&sc->bce_ifmedia, + IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL); + } + ifmedia_add(&sc->bce_ifmedia, IFM_ETHER | IFM_AUTO, 0, NULL); + ifmedia_set(&sc->bce_ifmedia, IFM_ETHER | IFM_AUTO); + sc->bce_ifmedia.ifm_media = sc->bce_ifmedia.ifm_cur->ifm_media; + } else { + /* MII child bus by attaching the PHY. */ + rc = mii_attach(dev, &sc->bce_miibus, ifp, bce_ifmedia_upd, + bce_ifmedia_sts, BMSR_DEFCAPMASK, sc->bce_phy_addr, + MII_OFFSET_ANY, MIIF_DOPAUSE); + if (rc != 0) { + BCE_PRINTF("%s(%d): attaching PHYs failed\n", __FILE__, + __LINE__); + goto bce_attach_fail; + } } /* Attach to the Ethernet interface list. */ @@ -1521,8 +1578,12 @@ bce_detach(device_t dev) ether_ifdetach(ifp); /* If we have a child device on the MII bus remove it too. */ - bus_generic_detach(dev); - device_delete_child(dev, sc->bce_miibus); + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) != 0) + ifmedia_removeall(&sc->bce_ifmedia); + else { + bus_generic_detach(dev); + device_delete_child(dev, sc->bce_miibus); + } /* Release all remaining resources. */ bce_release_resources(sc); @@ -1983,13 +2044,28 @@ bce_miibus_statchg(device_t dev) { struct bce_softc *sc; struct mii_data *mii; - int val; + struct ifmediareq ifmr; + int media_active, media_status, val; sc = device_get_softc(dev); DBENTER(BCE_VERBOSE_PHY); - mii = device_get_softc(sc->bce_miibus); + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) != 0) { + bzero(&ifmr, sizeof(ifmr)); + bce_ifmedia_sts_rphy(sc, &ifmr); + media_active = ifmr.ifm_active; + media_status = ifmr.ifm_status; + } else { + mii = device_get_softc(sc->bce_miibus); + media_active = mii->mii_media_active; + media_status = mii->mii_media_status; + } + + /* Ignore invalid media status. */ + if ((media_status & (IFM_ACTIVE | IFM_AVALID)) != + (IFM_ACTIVE | IFM_AVALID)) + goto bce_miibus_statchg_exit; val = REG_RD(sc, BCE_EMAC_MODE); val &= ~(BCE_EMAC_MODE_PORT | BCE_EMAC_MODE_HALF_DUPLEX | @@ -1997,7 +2073,7 @@ bce_miibus_statchg(device_t dev) BCE_EMAC_MODE_25G); /* Set MII or GMII interface based on the PHY speed. */ - switch (IFM_SUBTYPE(mii->mii_media_active)) { + switch (IFM_SUBTYPE(media_active)) { case IFM_10_T: if (BCE_CHIP_NUM(sc) != BCE_CHIP_NUM_5706) { DBPRINT(sc, BCE_INFO_PHY, @@ -2026,7 +2102,7 @@ bce_miibus_statchg(device_t dev) } /* Set half or full duplex based on PHY settings. */ - if ((mii->mii_media_active & IFM_GMASK) == IFM_HDX) { + if ((IFM_OPTIONS(media_active) & IFM_FDX) == 0) { DBPRINT(sc, BCE_INFO_PHY, "Setting Half-Duplex interface.\n"); val |= BCE_EMAC_MODE_HALF_DUPLEX; @@ -2036,7 +2112,7 @@ bce_miibus_statchg(device_t dev) REG_WR(sc, BCE_EMAC_MODE, val); - if ((mii->mii_media_active & IFM_ETH_RXPAUSE) != 0) { + if ((IFM_OPTIONS(media_active) & IFM_ETH_RXPAUSE) != 0) { DBPRINT(sc, BCE_INFO_PHY, "%s(): Enabling RX flow control.\n", __FUNCTION__); BCE_SETBIT(sc, BCE_EMAC_RX_MODE, BCE_EMAC_RX_MODE_FLOW_EN); @@ -2046,7 +2122,7 @@ bce_miibus_statchg(device_t dev) BCE_CLRBIT(sc, BCE_EMAC_RX_MODE, BCE_EMAC_RX_MODE_FLOW_EN); } - if ((mii->mii_media_active & IFM_ETH_TXPAUSE) != 0) { + if ((IFM_OPTIONS(media_active) & IFM_ETH_TXPAUSE) != 0) { DBPRINT(sc, BCE_INFO_PHY, "%s(): Enabling TX flow control.\n", __FUNCTION__); BCE_SETBIT(sc, BCE_EMAC_TX_MODE, BCE_EMAC_TX_MODE_FLOW_EN); @@ -2060,6 +2136,7 @@ bce_miibus_statchg(device_t dev) /* ToDo: Update watermarks in bce_init_rx_context(). */ +bce_miibus_statchg_exit: DBEXIT(BCE_VERBOSE_PHY); } @@ -3130,7 +3207,8 @@ bce_get_media_exit: static void bce_init_media(struct bce_softc *sc) { - if ((sc->bce_phy_flags & BCE_PHY_IEEE_CLAUSE_45_FLAG) != 0) { + if ((sc->bce_phy_flags & (BCE_PHY_IEEE_CLAUSE_45_FLAG | + BCE_PHY_REMOTE_CAP_FLAG)) == BCE_PHY_IEEE_CLAUSE_45_FLAG) { /* * Configure 5709S/5716S PHYs to use traditional IEEE * Clause 22 method. Otherwise we have no way to attach @@ -4925,14 +5003,25 @@ bce_stop(struct bce_softc *sc) static int bce_reset(struct bce_softc *sc, u32 reset_code) { - u32 val; + u32 emac_mode_save, val; int i, rc = 0; + static const u32 emac_mode_mask = BCE_EMAC_MODE_PORT | + BCE_EMAC_MODE_HALF_DUPLEX | BCE_EMAC_MODE_25G; DBENTER(BCE_VERBOSE_RESET); DBPRINT(sc, BCE_VERBOSE_RESET, "%s(): reset_code = 0x%08X\n", __FUNCTION__, reset_code); + /* + * If ASF/IPMI is operational, then the EMAC Mode register already + * contains appropriate values for the link settings that have + * been auto-negotiated. Resetting the chip will clobber those + * values. Save the important bits so we can restore them after + * the reset. + */ + emac_mode_save = REG_RD(sc, BCE_EMAC_MODE) & emac_mode_mask; + /* Wait for pending PCI transactions to complete. */ REG_WR(sc, BCE_MISC_ENABLE_CLR_BITS, BCE_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE | @@ -5018,8 +5107,15 @@ bce_reset(struct bce_softc *sc, u32 reset_code) if (rc) BCE_PRINTF("%s(%d): Firmware did not complete " "initialization!\n", __FILE__, __LINE__); + /* Get firmware capabilities. */ + bce_fw_cap_init(sc); bce_reset_exit: + /* Restore EMAC Mode bits needed to keep ASF/IPMI running. */ + val = REG_RD(sc, BCE_EMAC_MODE); + val = (val & ~emac_mode_mask) | emac_mode_save; + REG_WR(sc, BCE_EMAC_MODE, val); + DBEXIT(BCE_VERBOSE_RESET); return (rc); } @@ -6081,6 +6177,55 @@ bce_free_pg_chain(struct bce_softc *sc) } +static u32 +bce_get_rphy_link(struct bce_softc *sc) +{ + u32 advertise, link; + int fdpx; + + advertise = 0; + fdpx = 0; + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG) != 0) + link = bce_shmem_rd(sc, BCE_RPHY_SERDES_LINK); + else + link = bce_shmem_rd(sc, BCE_RPHY_COPPER_LINK); + if (link & BCE_NETLINK_ANEG_ENB) + advertise |= BCE_NETLINK_ANEG_ENB; + if (link & BCE_NETLINK_SPEED_10HALF) + advertise |= BCE_NETLINK_SPEED_10HALF; + if (link & BCE_NETLINK_SPEED_10FULL) { + advertise |= BCE_NETLINK_SPEED_10FULL; + fdpx++; + } + if (link & BCE_NETLINK_SPEED_100HALF) + advertise |= BCE_NETLINK_SPEED_100HALF; + if (link & BCE_NETLINK_SPEED_100FULL) { + advertise |= BCE_NETLINK_SPEED_100FULL; + fdpx++; + } + if (link & BCE_NETLINK_SPEED_1000HALF) + advertise |= BCE_NETLINK_SPEED_1000HALF; + if (link & BCE_NETLINK_SPEED_1000FULL) { + advertise |= BCE_NETLINK_SPEED_1000FULL; + fdpx++; + } + if (link & BCE_NETLINK_SPEED_2500HALF) + advertise |= BCE_NETLINK_SPEED_2500HALF; + if (link & BCE_NETLINK_SPEED_2500FULL) { + advertise |= BCE_NETLINK_SPEED_2500FULL; + fdpx++; + } + if (fdpx) + advertise |= BCE_NETLINK_FC_PAUSE_SYM | + BCE_NETLINK_FC_PAUSE_ASYM; + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG) == 0) + advertise |= BCE_NETLINK_PHY_APP_REMOTE | + BCE_NETLINK_ETH_AT_WIRESPEED; + + return (advertise); +} + + /****************************************************************************/ /* Set media options. */ /* */ @@ -6116,21 +6261,110 @@ bce_ifmedia_upd_locked(struct ifnet *ifp) struct bce_softc *sc = ifp->if_softc; struct mii_data *mii; struct mii_softc *miisc; - int error; + struct ifmedia *ifm; + u32 link; + int error, fdx; DBENTER(BCE_VERBOSE_PHY); error = 0; BCE_LOCK_ASSERT(sc); - mii = device_get_softc(sc->bce_miibus); + sc->bce_link_up = FALSE; + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) != 0) { + ifm = &sc->bce_ifmedia; + if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) + return (EINVAL); + link = 0; + fdx = IFM_OPTIONS(ifm->ifm_media) & IFM_FDX; + switch(IFM_SUBTYPE(ifm->ifm_media)) { + case IFM_AUTO: + /* + * Check advertised link of remote PHY by reading + * BCE_RPHY_SERDES_LINK or BCE_RPHY_COPPER_LINK. + * Always use the same link type of remote PHY. + */ + link = bce_get_rphy_link(sc); + break; + case IFM_2500_SX: + if ((sc->bce_phy_flags & + (BCE_PHY_REMOTE_PORT_FIBER_FLAG | + BCE_PHY_2_5G_CAPABLE_FLAG)) == 0) + return (EINVAL); + /* + * XXX + * Have to enable forced 2.5Gbps configuration. + */ + if (fdx != 0) + link |= BCE_NETLINK_SPEED_2500FULL; + else + link |= BCE_NETLINK_SPEED_2500HALF; + break; + case IFM_1000_SX: + if ((sc->bce_phy_flags & + BCE_PHY_REMOTE_PORT_FIBER_FLAG) == 0) + return (EINVAL); + /* + * XXX + * Have to disable 2.5Gbps configuration. + */ + if (fdx != 0) + link = BCE_NETLINK_SPEED_1000FULL; + else + link = BCE_NETLINK_SPEED_1000HALF; + break; + case IFM_1000_T: + if (sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG) + return (EINVAL); + if (fdx != 0) + link = BCE_NETLINK_SPEED_1000FULL; + else + link = BCE_NETLINK_SPEED_1000HALF; + break; + case IFM_100_TX: + if (sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG) + return (EINVAL); + if (fdx != 0) + link = BCE_NETLINK_SPEED_100FULL; + else + link = BCE_NETLINK_SPEED_100HALF; + break; + case IFM_10_T: + if (sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG) + return (EINVAL); + if (fdx != 0) + link = BCE_NETLINK_SPEED_10FULL; + else + link = BCE_NETLINK_SPEED_10HALF; + break; + default: + return (EINVAL); + } + if (IFM_SUBTYPE(ifm->ifm_media) != IFM_AUTO) { + /* + * XXX + * Advertise pause capability for full-duplex media. + */ + if (fdx != 0) + link |= BCE_NETLINK_FC_PAUSE_SYM | + BCE_NETLINK_FC_PAUSE_ASYM; + if ((sc->bce_phy_flags & + BCE_PHY_REMOTE_PORT_FIBER_FLAG) == 0) + link |= BCE_NETLINK_PHY_APP_REMOTE | + BCE_NETLINK_ETH_AT_WIRESPEED; + } - /* Make sure the MII bus has been enumerated. */ - if (mii) { - sc->bce_link_up = FALSE; - LIST_FOREACH(miisc, &mii->mii_phys, mii_list) - PHY_RESET(miisc); - error = mii_mediachg(mii); + bce_shmem_wr(sc, BCE_MB_ARGS_0, link); + error = bce_fw_sync(sc, BCE_DRV_MSG_CODE_CMD_SET_LINK); + } else { + mii = device_get_softc(sc->bce_miibus); + + /* Make sure the MII bus has been enumerated. */ + if (mii) { + LIST_FOREACH(miisc, &mii->mii_phys, mii_list) + PHY_RESET(miisc); + error = mii_mediachg(mii); + } } DBEXIT(BCE_VERBOSE_PHY); @@ -6138,6 +6372,85 @@ bce_ifmedia_upd_locked(struct ifnet *ifp) } +static void +bce_ifmedia_sts_rphy(struct bce_softc *sc, struct ifmediareq *ifmr) +{ + struct ifnet *ifp; + u32 link; + + ifp = sc->bce_ifp; + BCE_LOCK_ASSERT(sc); + + ifmr->ifm_status = IFM_AVALID; + ifmr->ifm_active = IFM_ETHER; + link = bce_shmem_rd(sc, BCE_LINK_STATUS); + /* XXX Handle heart beat status? */ + if ((link & BCE_LINK_STATUS_LINK_UP) != 0) + ifmr->ifm_status |= IFM_ACTIVE; + else { + ifmr->ifm_active |= IFM_NONE; + ifp->if_baudrate = 0; + return; + } + switch (link & BCE_LINK_STATUS_SPEED_MASK) { + case BCE_LINK_STATUS_10HALF: + ifmr->ifm_active |= IFM_10_T | IFM_HDX; + ifp->if_baudrate = IF_Mbps(10UL); + break; + case BCE_LINK_STATUS_10FULL: + ifmr->ifm_active |= IFM_10_T | IFM_FDX; + ifp->if_baudrate = IF_Mbps(10UL); + break; + case BCE_LINK_STATUS_100HALF: + ifmr->ifm_active |= IFM_100_TX | IFM_HDX; + ifp->if_baudrate = IF_Mbps(100UL); + break; + case BCE_LINK_STATUS_100FULL: + ifmr->ifm_active |= IFM_100_TX | IFM_FDX; + ifp->if_baudrate = IF_Mbps(100UL); + break; + case BCE_LINK_STATUS_1000HALF: + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG) == 0) + ifmr->ifm_active |= IFM_1000_T | IFM_HDX; + else + ifmr->ifm_active |= IFM_1000_SX | IFM_HDX; + ifp->if_baudrate = IF_Mbps(1000UL); + break; + case BCE_LINK_STATUS_1000FULL: + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG) == 0) + ifmr->ifm_active |= IFM_1000_T | IFM_FDX; + else + ifmr->ifm_active |= IFM_1000_SX | IFM_FDX; + ifp->if_baudrate = IF_Mbps(1000UL); + break; + case BCE_LINK_STATUS_2500HALF: + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG) == 0) { + ifmr->ifm_active |= IFM_NONE; + return; + } else + ifmr->ifm_active |= IFM_2500_SX | IFM_HDX; + ifp->if_baudrate = IF_Mbps(2500UL); + break; + case BCE_LINK_STATUS_2500FULL: + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_PORT_FIBER_FLAG) == 0) { + ifmr->ifm_active |= IFM_NONE; + return; + } else + ifmr->ifm_active |= IFM_2500_SX | IFM_FDX; + ifp->if_baudrate = IF_Mbps(2500UL); + break; + default: + ifmr->ifm_active |= IFM_NONE; + return; + } + + if ((link & BCE_LINK_STATUS_RX_FC_ENABLED) != 0) + ifmr->ifm_active |= IFM_ETH_RXPAUSE; + if ((link & BCE_LINK_STATUS_TX_FC_ENABLED) != 0) + ifmr->ifm_active |= IFM_ETH_TXPAUSE; +} + + /****************************************************************************/ /* Reports current media status. */ /* */ @@ -6158,11 +6471,15 @@ bce_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) BCE_UNLOCK(sc); return; } - mii = device_get_softc(sc->bce_miibus); - mii_pollstat(mii); - ifmr->ifm_active = mii->mii_media_active; - ifmr->ifm_status = mii->mii_media_status; + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) != 0) + bce_ifmedia_sts_rphy(sc, ifmr); + else { + mii = device_get_softc(sc->bce_miibus); + mii_pollstat(mii); + ifmr->ifm_active = mii->mii_media_active; + ifmr->ifm_status = mii->mii_media_status; + } BCE_UNLOCK(sc); @@ -6199,14 +6516,26 @@ bce_phy_intr(struct bce_softc *sc) STATUS_ATTN_BITS_LINK_STATE); DBPRINT(sc, BCE_INFO_PHY, "%s(): Link is now UP.\n", __FUNCTION__); - } - else { + } else { REG_WR(sc, BCE_PCICFG_STATUS_BIT_CLEAR_CMD, STATUS_ATTN_BITS_LINK_STATE); DBPRINT(sc, BCE_INFO_PHY, "%s(): Link is now DOWN.\n", __FUNCTION__); } + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) != 0) { + if (new_link_state) { + if (bootverbose) + if_printf(sc->bce_ifp, "link UP\n"); + if_link_state_change(sc->bce_ifp, + LINK_STATE_UP); + } else { + if (bootverbose) + if_printf(sc->bce_ifp, "link DOWN\n"); + if_link_state_change(sc->bce_ifp, + LINK_STATE_DOWN); + } + } /* * Assume link is down and allow * tick routine to update the state @@ -6842,6 +7171,8 @@ bce_init_locked(struct bce_softc *sc) bcopy(IF_LLADDR(sc->bce_ifp), sc->eaddr, ETHER_ADDR_LEN); bce_set_mac_addr(sc); + if (bce_hdr_split == FALSE) + bce_get_rx_buffer_sizes(sc, ifp->if_mtu); /* * Calculate and program the hardware Ethernet MTU * size. Be generous on the receive if we have room @@ -7436,22 +7767,10 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) BCE_LOCK(sc); ifp->if_mtu = ifr->ifr_mtu; - - if (bce_hdr_split == FALSE) { - if (ifp->if_drv_flags & IFF_DRV_RUNNING) { - /* - * Because allocation size is used in RX - * buffer allocation, stop controller if - * it is already running. - */ - bce_stop(sc); - } - - bce_get_rx_buffer_sizes(sc, ifp->if_mtu); - + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; bce_init_locked(sc); } - BCE_UNLOCK(sc); break; @@ -7505,10 +7824,14 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) case SIOCGIFMEDIA: DBPRINT(sc, BCE_VERBOSE_MISC, "Received SIOCSIFMEDIA/SIOCGIFMEDIA\n"); - - mii = device_get_softc(sc->bce_miibus); - error = ifmedia_ioctl(ifp, ifr, - &mii->mii_media, command); + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) != 0) + error = ifmedia_ioctl(ifp, ifr, &sc->bce_ifmedia, + command); + else { + mii = device_get_softc(sc->bce_miibus); + error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, + command); + } break; /* Set interface capability */ @@ -8173,6 +8496,7 @@ bce_tick(void *xsc) struct bce_softc *sc = xsc; struct mii_data *mii; struct ifnet *ifp; + struct ifmediareq ifmr; ifp = sc->bce_ifp; @@ -8203,21 +8527,32 @@ bce_tick(void *xsc) goto bce_tick_exit; /* Link is down. Check what the PHY's doing. */ - mii = device_get_softc(sc->bce_miibus); - mii_tick(mii); - - /* Check if the link has come up. */ - if ((mii->mii_media_status & IFM_ACTIVE) && - (IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE)) { - DBPRINT(sc, BCE_VERBOSE_MISC, - "%s(): Link up!\n", __FUNCTION__); - sc->bce_link_up = TRUE; - if ((IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T || - IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_SX || - IFM_SUBTYPE(mii->mii_media_active) == IFM_2500_SX) && - (bce_verbose || bootverbose)) - BCE_PRINTF("Gigabit link up!\n"); + if ((sc->bce_phy_flags & BCE_PHY_REMOTE_CAP_FLAG) != 0) { + bzero(&ifmr, sizeof(ifmr)); + bce_ifmedia_sts_rphy(sc, &ifmr); + if ((ifmr.ifm_status & (IFM_ACTIVE | IFM_AVALID)) == + (IFM_ACTIVE | IFM_AVALID)) { + sc->bce_link_up = TRUE; + bce_miibus_statchg(sc->bce_dev); + } + } else { + mii = device_get_softc(sc->bce_miibus); + mii_tick(mii); + /* Check if the link has come up. */ + if ((mii->mii_media_status & IFM_ACTIVE) && + (IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE)) { + DBPRINT(sc, BCE_VERBOSE_MISC, "%s(): Link up!\n", + __FUNCTION__); + sc->bce_link_up = TRUE; + if ((IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T || + IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_SX || + IFM_SUBTYPE(mii->mii_media_active) == IFM_2500_SX) && + (bce_verbose || bootverbose)) + BCE_PRINTF("Gigabit link up!\n"); + } + } + if (sc->bce_link_up == TRUE) { /* Now that link is up, handle any outstanding TX traffic. */ if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) { DBPRINT(sc, BCE_VERBOSE_MISC, "%s(): Found " @@ -8231,6 +8566,36 @@ bce_tick_exit: return; } +static void +bce_fw_cap_init(struct bce_softc *sc) +{ + u32 ack, cap, link; + + ack = 0; + cap = bce_shmem_rd(sc, BCE_FW_CAP_MB); + if ((cap & BCE_FW_CAP_SIGNATURE_MAGIC_MASK) != + BCE_FW_CAP_SIGNATURE_MAGIC) + return; + if ((cap & (BCE_FW_CAP_MFW_KEEP_VLAN | BCE_FW_CAP_BC_KEEP_VLAN)) == + (BCE_FW_CAP_MFW_KEEP_VLAN | BCE_FW_CAP_BC_KEEP_VLAN)) + ack |= BCE_DRV_ACK_CAP_SIGNATURE_MAGIC | + BCE_FW_CAP_MFW_KEEP_VLAN | BCE_FW_CAP_BC_KEEP_VLAN; + if ((sc->bce_phy_flags & BCE_PHY_SERDES_FLAG) != 0 && + (cap & BCE_FW_CAP_REMOTE_PHY_CAP) != 0) { + sc->bce_phy_flags &= ~BCE_PHY_REMOTE_PORT_FIBER_FLAG; + sc->bce_phy_flags |= BCE_PHY_REMOTE_CAP_FLAG; + link = bce_shmem_rd(sc, BCE_LINK_STATUS); + if ((link & BCE_LINK_STATUS_SERDES_LINK) != 0) + sc->bce_phy_flags |= BCE_PHY_REMOTE_PORT_FIBER_FLAG; + ack |= BCE_DRV_ACK_CAP_SIGNATURE_MAGIC | + BCE_FW_CAP_REMOTE_PHY_CAP; + } + + if (ack != 0) + bce_shmem_wr(sc, BCE_DRV_ACK_CAP_MB, ack); +} + + #ifdef BCE_DEBUG /****************************************************************************/ /* Allows the driver state to be dumped through the sysctl interface. */ diff --git a/sys/dev/bce/if_bcereg.h b/sys/dev/bce/if_bcereg.h index f74c4d20893..be206081a29 100644 --- a/sys/dev/bce/if_bcereg.h +++ b/sys/dev/bce/if_bcereg.h @@ -814,6 +814,23 @@ struct flash_spec { #define BCE_DRV_PULSE_SEQ_MASK 0x00007fff #define BCE_MB_ARGS_0 0x00000014 +#define BCE_NETLINK_SPEED_10HALF (1<<0) +#define BCE_NETLINK_SPEED_10FULL (1<<1) +#define BCE_NETLINK_SPEED_100HALF (1<<2) +#define BCE_NETLINK_SPEED_100FULL (1<<3) +#define BCE_NETLINK_SPEED_1000HALF (1<<4) +#define BCE_NETLINK_SPEED_1000FULL (1<<5) +#define BCE_NETLINK_SPEED_2500HALF (1<<6) +#define BCE_NETLINK_SPEED_2500FULL (1<<7) +#define BCE_NETLINK_SPEED_10GHALF (1<<8) +#define BCE_NETLINK_SPEED_10GFULL (1<<9) +#define BCE_NETLINK_ANEG_ENB (1<<10) +#define BCE_NETLINK_PHY_APP_REMOTE (1<<11) +#define BCE_NETLINK_FC_PAUSE_SYM (1<<12) +#define BCE_NETLINK_FC_PAUSE_ASYM (1<<13) +#define BCE_NETLINK_ETH_AT_WIRESPEED (1<<14) +#define BCE_NETLINK_PHY_RESET (1<<15) + #define BCE_MB_ARGS_1 0x00000018 /* Indicate to the firmware not to go into the @@ -1079,6 +1096,26 @@ struct flash_spec { #define BCE_BC_STATE_BC_DBG_CMD_LOOP_CNT_MASK 0xffff #define BCE_BC_STATE_BC_DBG_CMD_LOOP_INFINITE 0xffff +#define BCE_FW_EVT_CODE_MB 0x00000354 +#define BCE_FW_EVT_CODE_SW_TIMER_EXPIRE_EVENT 0x00000000 +#define BCE_FW_EVT_CODE_LINK_EVENT 0x00000001 + +#define BCE_DRV_ACK_CAP_MB 0x00000364 +#define BCE_DRV_ACK_CAP_SIGNATURE_MAGIC 0x35450000 + +#define BCE_FW_CAP_MB 0x00000368 +#define BCE_FW_CAP_SIGNATURE_MAGIC 0xaa550000 +#define BCE_FW_ACK_SIGNATURE_MAGIC 0x52500000 +#define BCE_FW_CAP_SIGNATURE_MAGIC_MASK 0xffff0000 +#define BCE_FW_CAP_REMOTE_PHY_CAP 0x00000001 +#define BCE_FW_CAP_REMOTE_PHY_PRESENT 0x00000002 +#define BCE_FW_CAP_MFW_KEEP_VLAN 0x00000008 +#define BCE_FW_CAP_BC_KEEP_VLAN 0x00000010 + +#define BCE_RPHY_SERDES_LINK 0x00000374 + +#define BCE_RPHY_COPPER_LINK 0x00000378 + #define HOST_VIEW_SHMEM_BASE 0x167c00 /* @@ -6454,6 +6491,8 @@ struct bce_softc #define BCE_PHY_INT_MODE_AUTO_POLLING_FLAG 0x00000100 #define BCE_PHY_INT_MODE_LINK_READY_FLAG 0x00000200 #define BCE_PHY_IEEE_CLAUSE_45_FLAG 0x00000400 +#define BCE_PHY_REMOTE_CAP_FLAG 0x00000800 +#define BCE_PHY_REMOTE_PORT_FIBER_FLAG 0x00001000 /* Values that need to be shared with the PHY driver. */ u32 bce_shared_hw_cfg; diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c index 55572186246..16cfe27a220 100644 --- a/sys/dev/bge/if_bge.c +++ b/sys/dev/bge/if_bge.c @@ -2368,7 +2368,6 @@ bge_dma_free(struct bge_softc *sc) if (sc->bge_cdata.bge_tx_mtag) bus_dma_tag_destroy(sc->bge_cdata.bge_tx_mtag); - /* Destroy standard RX ring. */ if (sc->bge_cdata.bge_rx_std_ring_map) bus_dmamap_unload(sc->bge_cdata.bge_rx_std_ring_tag, @@ -2767,9 +2766,8 @@ bge_mbox_reorder(struct bge_softc *sc) }; devclass_t pci, pcib; device_t bus, dev; - int count, i; + int i; - count = sizeof(mbox_reorder_lists) / sizeof(mbox_reorder_lists[0]); pci = devclass_find("pci"); pcib = devclass_find("pcib"); dev = sc->bge_dev; @@ -2777,17 +2775,9 @@ bge_mbox_reorder(struct bge_softc *sc) for (;;) { dev = device_get_parent(bus); bus = device_get_parent(dev); - device_printf(sc->bge_dev, "dev : %s%d, bus : %s%d\n", - device_get_name(dev), device_get_unit(dev), - device_get_name(bus), device_get_unit(bus)); if (device_get_devclass(dev) != pcib) break; - for (i = 0; i < count; i++) { - device_printf(sc->bge_dev, - "probing dev : %s%d, vendor : 0x%04x " - "device : 0x%04x\n", - device_get_name(dev), device_get_unit(dev), - pci_get_vendor(dev), pci_get_device(dev)); + for (i = 0; i < nitems(mbox_reorder_lists); i++) { if (pci_get_vendor(dev) == mbox_reorder_lists[i].vendor && pci_get_device(dev) == @@ -2869,8 +2859,6 @@ bge_attach(device_t dev) sc = device_get_softc(dev); sc->bge_dev = dev; - bge_add_sysctls(sc); - TASK_INIT(&sc->bge_intr_task, 0, bge_intr_task, sc); /* @@ -3016,6 +3004,9 @@ bge_attach(device_t dev) break; } + /* Add SYSCTLs, requires the chipset family to be set. */ + bge_add_sysctls(sc); + /* Set various PHY bug flags. */ if (sc->bge_chipid == BGE_CHIPID_BCM5701_A0 || sc->bge_chipid == BGE_CHIPID_BCM5701_B0) @@ -3638,8 +3629,6 @@ bge_reset(struct bge_softc *sc) /* Clear enable no snoop and disable relaxed ordering. */ devctl &= ~(PCIM_EXP_CTL_RELAXED_ORD_ENABLE | PCIM_EXP_CTL_NOSNOOP_ENABLE); - /* Set PCIE max payload size to 128. */ - devctl &= ~PCIM_EXP_CTL_MAX_PAYLOAD; pci_write_config(dev, sc->bge_expcap + PCIR_EXPRESS_DEVICE_CTL, devctl, 2); /* Clear error status. */ diff --git a/sys/dev/bge/if_bgereg.h b/sys/dev/bge/if_bgereg.h index 8a58b85d62d..ab70692bd39 100644 --- a/sys/dev/bge/if_bgereg.h +++ b/sys/dev/bge/if_bgereg.h @@ -779,11 +779,11 @@ #define BGE_LEDCTL_10MBPS_LED 0x00000008 #define BGE_LEDCTL_TRAFLED_OVERRIDE 0x00000010 #define BGE_LEDCTL_TRAFLED_BLINK 0x00000020 -#define BGE_LEDCTL_TREFLED_BLINK_2 0x00000040 +#define BGE_LEDCTL_TRAFLED_BLINK_2 0x00000040 #define BGE_LEDCTL_1000MBPS_STS 0x00000080 #define BGE_LEDCTL_100MBPS_STS 0x00000100 #define BGE_LEDCTL_10MBPS_STS 0x00000200 -#define BGE_LEDCTL_TRADLED_STS 0x00000400 +#define BGE_LEDCTL_TRAFLED_STS 0x00000400 #define BGE_LEDCTL_BLINKPERIOD 0x7FF80000 #define BGE_LEDCTL_BLINKPERIOD_OVERRIDE 0x80000000 diff --git a/sys/dev/bwi/bwimac.c b/sys/dev/bwi/bwimac.c index c48d9c3a857..703da7a71cb 100644 --- a/sys/dev/bwi/bwimac.c +++ b/sys/dev/bwi/bwimac.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" #include "opt_bwi.h" +#include "opt_wlan.h" #include #include diff --git a/sys/dev/bwi/bwiphy.c b/sys/dev/bwi/bwiphy.c index d817d260344..86c7f4f74de 100644 --- a/sys/dev/bwi/bwiphy.c +++ b/sys/dev/bwi/bwiphy.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" +#include "opt_wlan.h" #include #include diff --git a/sys/dev/bwi/bwirf.c b/sys/dev/bwi/bwirf.c index cb881eb5de3..c10887ee66c 100644 --- a/sys/dev/bwi/bwirf.c +++ b/sys/dev/bwi/bwirf.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" #include "opt_bwi.h" +#include "opt_wlan.h" #include #include diff --git a/sys/dev/bwi/if_bwi.c b/sys/dev/bwi/if_bwi.c index 8db43b3af2a..cb4805b258a 100644 --- a/sys/dev/bwi/if_bwi.c +++ b/sys/dev/bwi/if_bwi.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" #include "opt_bwi.h" +#include "opt_wlan.h" #include #include diff --git a/sys/dev/bwi/if_bwi_pci.c b/sys/dev/bwi/if_bwi_pci.c index fdf282b4bb3..346558eac43 100644 --- a/sys/dev/bwi/if_bwi_pci.c +++ b/sys/dev/bwi/if_bwi_pci.c @@ -34,6 +34,8 @@ __FBSDID("$FreeBSD$"); * PCI/Cardbus front-end for the Broadcom Wireless LAN controller driver. */ +#include "opt_wlan.h" + #include #include #include diff --git a/sys/dev/cxgb/common/cxgb_ctl_defs.h b/sys/dev/cxgb/common/cxgb_ctl_defs.h index b228a25f52c..fe8a4f7defc 100644 --- a/sys/dev/cxgb/common/cxgb_ctl_defs.h +++ b/sys/dev/cxgb/common/cxgb_ctl_defs.h @@ -60,14 +60,12 @@ struct mtutab { const unsigned short *mtus; /* the MTU table values */ }; -struct net_device; - /* - * Structure used to request the adapter net_device owning a given MAC address. + * Structure used to request the ifnet that owns a given MAC address. */ struct iff_mac { - struct net_device *dev; /* the net_device */ - const unsigned char *mac_addr; /* MAC address to lookup */ + struct ifnet *dev; + const unsigned char *mac_addr; u16 vlan_tag; }; @@ -85,7 +83,7 @@ struct ddp_params { struct adap_ports { unsigned int nports; /* number of ports on this adapter */ - struct net_device *lldevs[MAX_NPORTS]; + struct ifnet *lldevs[MAX_NPORTS]; }; /* diff --git a/sys/dev/cxgb/cxgb_adapter.h b/sys/dev/cxgb/cxgb_adapter.h index ed75e7888b9..8b368065a35 100644 --- a/sys/dev/cxgb/cxgb_adapter.h +++ b/sys/dev/cxgb/cxgb_adapter.h @@ -46,6 +46,7 @@ $FreeBSD$ #include #include #include +#include #include #include @@ -56,7 +57,6 @@ $FreeBSD$ #include #include -#include #include struct adapter; @@ -129,6 +129,7 @@ enum { CXGB_OFLD_INIT = (1 << 7), TP_PARITY_INIT = (1 << 8), CXGB_BUSY = (1 << 9), + TOM_INIT_DONE = (1 << 10), /* port flags */ DOOMED = (1 << 0), @@ -178,7 +179,6 @@ struct sge_rspq { uint32_t async_notif; uint32_t cntxt_id; uint32_t offload_pkts; - uint32_t offload_bundles; uint32_t pure_rsps; uint32_t unhandled_irqs; uint32_t starved; @@ -265,15 +265,6 @@ struct sge_txq { struct sg_ent txq_sgl[TX_MAX_SEGS / 2 + 1]; }; - -enum { - SGE_PSTAT_TSO, /* # of TSO requests */ - SGE_PSTAT_RX_CSUM_GOOD, /* # of successful RX csum offloads */ - SGE_PSTAT_TX_CSUM, /* # of TX checksum offloads */ - SGE_PSTAT_VLANEX, /* # of VLAN tag extractions */ - SGE_PSTAT_VLANINS, /* # of VLAN tag insertions */ -}; - #define SGE_PSTAT_MAX (SGE_PSTAT_VLANINS+1) #define QS_EXITING 0x1 @@ -288,8 +279,8 @@ struct sge_qset { struct lro_state lro; struct sge_txq txq[SGE_TXQ_PER_SET]; uint32_t txq_stopped; /* which Tx queues are stopped */ - uint64_t port_stats[SGE_PSTAT_MAX]; struct port_info *port; + struct adapter *adap; int idx; /* qset # */ int qs_flags; int coalescing; @@ -306,10 +297,13 @@ struct sge { struct filter_info; +typedef int (*cpl_handler_t)(struct sge_qset *, struct rsp_desc *, + struct mbuf *); + struct adapter { + SLIST_ENTRY(adapter) link; device_t dev; int flags; - TAILQ_ENTRY(adapter) adapter_entry; /* PCI register resources */ int regs_rid; @@ -375,11 +369,16 @@ struct adapter { struct port_info port[MAX_NPORTS]; device_t portdev[MAX_NPORTS]; - struct t3cdev tdev; +#ifdef TCP_OFFLOAD + void *tom_softc; + void *iwarp_softc; +#endif char fw_version[64]; char port_types[MAX_NPORTS + 1]; uint32_t open_device_map; - uint32_t registered_device_map; +#ifdef TCP_OFFLOAD + int offload_map; +#endif struct mtx lock; driver_intr_t *cxgb_intr; int msi_count; @@ -391,6 +390,11 @@ struct adapter { char elmerlockbuf[ADAPTER_LOCK_NAME_LEN]; int timestamp; + +#ifdef TCP_OFFLOAD +#define NUM_CPL_HANDLERS 0xa7 + cpl_handler_t cpl_handler[NUM_CPL_HANDLERS] __aligned(CACHE_LINE_SIZE); +#endif }; struct t3_rx_mode { @@ -501,10 +505,12 @@ void t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed, int duplex, int fc, int mac_was_reset); void t3_os_phymod_changed(struct adapter *adap, int port_id); void t3_sge_err_intr_handler(adapter_t *adapter); -int t3_offload_tx(struct t3cdev *, struct mbuf *); +#ifdef TCP_OFFLOAD +int t3_offload_tx(struct adapter *, struct mbuf *); +#endif void t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[]); int t3_mgmt_tx(adapter_t *adap, struct mbuf *m); - +int t3_register_cpl_handler(struct adapter *, int, cpl_handler_t); int t3_sge_alloc(struct adapter *); int t3_sge_free(struct adapter *); @@ -522,7 +528,7 @@ int t3_sge_reset_adapter(adapter_t *); int t3_sge_init_port(struct port_info *); void t3_free_tx_desc(struct sge_qset *qs, int n, int qid); -void t3_rx_eth(struct adapter *adap, struct sge_rspq *rq, struct mbuf *m, int ethpad); +void t3_rx_eth(struct adapter *adap, struct mbuf *m, int ethpad); void t3_add_attach_sysctls(adapter_t *sc); void t3_add_configured_sysctls(adapter_t *sc); @@ -555,15 +561,9 @@ txq_to_qset(struct sge_txq *q, int qidx) return container_of(q, struct sge_qset, txq[qidx]); } -static __inline struct adapter * -tdev2adap(struct t3cdev *d) -{ - return container_of(d, struct adapter, tdev); -} - #undef container_of -#define OFFLOAD_DEVMAP_BIT 15 +#define OFFLOAD_DEVMAP_BIT (1 << MAX_NPORTS) static inline int offload_running(adapter_t *adapter) { return isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT); @@ -572,4 +572,5 @@ static inline int offload_running(adapter_t *adapter) void cxgb_tx_watchdog(void *arg); int cxgb_transmit(struct ifnet *ifp, struct mbuf *m); void cxgb_qflush(struct ifnet *ifp); +void t3_iterate(void (*)(struct adapter *, void *), void *); #endif diff --git a/sys/dev/cxgb/cxgb_main.c b/sys/dev/cxgb/cxgb_main.c index fb420044901..840c5826cb3 100644 --- a/sys/dev/cxgb/cxgb_main.c +++ b/sys/dev/cxgb/cxgb_main.c @@ -30,6 +30,8 @@ POSSIBILITY OF SUCH DAMAGE. #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + #include #include #include @@ -107,6 +109,9 @@ static inline void mk_set_tcb_field(struct cpl_set_tcb_field *, unsigned int, unsigned int, u64, u64); static inline void set_tcb_field_ulp(struct cpl_set_tcb_field *, unsigned int, unsigned int, u64, u64); +#ifdef TCP_OFFLOAD +static int cpl_not_handled(struct sge_qset *, struct rsp_desc *, struct mbuf *); +#endif /* Attachment glue for the PCI controller end of the device. Each port of * the device is attached separately, as defined later. @@ -119,10 +124,11 @@ static __inline void reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned i unsigned int end); static void cxgb_get_regs(adapter_t *sc, struct ch_ifconf_regs *regs, uint8_t *buf); static int cxgb_get_regs_len(void); -static int offload_open(struct port_info *pi); static void touch_bars(device_t dev); -static int offload_close(struct t3cdev *tdev); static void cxgb_update_mac_settings(struct port_info *p); +#ifdef TCP_OFFLOAD +static int toe_capability(struct port_info *, int); +#endif static device_method_t cxgb_controller_methods[] = { DEVMETHOD(device_probe, cxgb_controller_probe), @@ -138,8 +144,11 @@ static driver_t cxgb_controller_driver = { sizeof(struct adapter) }; +static int cxgbc_mod_event(module_t, int, void *); static devclass_t cxgb_controller_devclass; -DRIVER_MODULE(cxgbc, pci, cxgb_controller_driver, cxgb_controller_devclass, 0, 0); +DRIVER_MODULE(cxgbc, pci, cxgb_controller_driver, cxgb_controller_devclass, + cxgbc_mod_event, 0); +MODULE_VERSION(cxgbc, 1); /* * Attachment glue for the ports. Attachment is done directly to the @@ -177,6 +186,14 @@ static struct cdevsw cxgb_cdevsw = { static devclass_t cxgb_port_devclass; DRIVER_MODULE(cxgb, cxgbc, cxgb_port_driver, cxgb_port_devclass, 0, 0); +MODULE_VERSION(cxgb, 1); + +static struct mtx t3_list_lock; +static SLIST_HEAD(, adapter) t3_list; +#ifdef TCP_OFFLOAD +static struct mtx t3_uld_list_lock; +static SLIST_HEAD(, uld_info) t3_uld_list; +#endif /* * The driver uses the best interrupt scheme available on a platform in the @@ -194,15 +211,6 @@ SYSCTL_NODE(_hw, OID_AUTO, cxgb, CTLFLAG_RD, 0, "CXGB driver parameters"); SYSCTL_INT(_hw_cxgb, OID_AUTO, msi_allowed, CTLFLAG_RDTUN, &msi_allowed, 0, "MSI-X, MSI, INTx selector"); -/* - * The driver enables offload as a default. - * To disable it, use ofld_disable = 1. - */ -static int ofld_disable = 0; -TUNABLE_INT("hw.cxgb.ofld_disable", &ofld_disable); -SYSCTL_INT(_hw_cxgb, OID_AUTO, ofld_disable, CTLFLAG_RDTUN, &ofld_disable, 0, - "disable ULP offload"); - /* * The driver uses an auto-queue algorithm by default. * To disable it and force a single queue-set per port, use multiq = 0 @@ -445,6 +453,25 @@ cxgb_controller_attach(device_t dev) sc->msi_count = 0; ai = cxgb_get_adapter_info(dev); + snprintf(sc->lockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb controller lock %d", + device_get_unit(dev)); + ADAPTER_LOCK_INIT(sc, sc->lockbuf); + + snprintf(sc->reglockbuf, ADAPTER_LOCK_NAME_LEN, "SGE reg lock %d", + device_get_unit(dev)); + snprintf(sc->mdiolockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb mdio lock %d", + device_get_unit(dev)); + snprintf(sc->elmerlockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb elmer lock %d", + device_get_unit(dev)); + + MTX_INIT(&sc->sge.reg_lock, sc->reglockbuf, NULL, MTX_SPIN); + MTX_INIT(&sc->mdio_lock, sc->mdiolockbuf, NULL, MTX_DEF); + MTX_INIT(&sc->elmer_lock, sc->elmerlockbuf, NULL, MTX_DEF); + + mtx_lock(&t3_list_lock); + SLIST_INSERT_HEAD(&t3_list, sc, link); + mtx_unlock(&t3_list_lock); + /* find the PCIe link width and set max read request to 4KB*/ if (pci_find_cap(dev, PCIY_EXPRESS, ®) == 0) { uint16_t lnk; @@ -471,24 +498,10 @@ cxgb_controller_attach(device_t dev) if ((sc->regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->regs_rid, RF_ACTIVE)) == NULL) { device_printf(dev, "Cannot allocate BAR region 0\n"); - return (ENXIO); + error = ENXIO; + goto out; } - snprintf(sc->lockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb controller lock %d", - device_get_unit(dev)); - ADAPTER_LOCK_INIT(sc, sc->lockbuf); - - snprintf(sc->reglockbuf, ADAPTER_LOCK_NAME_LEN, "SGE reg lock %d", - device_get_unit(dev)); - snprintf(sc->mdiolockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb mdio lock %d", - device_get_unit(dev)); - snprintf(sc->elmerlockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb elmer lock %d", - device_get_unit(dev)); - - MTX_INIT(&sc->sge.reg_lock, sc->reglockbuf, NULL, MTX_SPIN); - MTX_INIT(&sc->mdio_lock, sc->mdiolockbuf, NULL, MTX_DEF); - MTX_INIT(&sc->elmer_lock, sc->elmerlockbuf, NULL, MTX_DEF); - sc->bt = rman_get_bustag(sc->regs_res); sc->bh = rman_get_bushandle(sc->regs_res); sc->mmio_len = rman_get_size(sc->regs_res); @@ -604,7 +617,7 @@ cxgb_controller_attach(device_t dev) } else { sc->flags |= TPS_UPTODATE; } - + /* * Create a child device for each MAC. The ethernet attachment * will be done in these children. @@ -636,12 +649,7 @@ cxgb_controller_attach(device_t dev) t3_sge_init_adapter(sc); t3_led_ready(sc); - - cxgb_offload_init(); - if (is_offload(sc)) { - setbit(&sc->registered_device_map, OFFLOAD_DEVMAP_BIT); - cxgb_adapter_ofld(sc); - } + error = t3_get_fw_version(sc, &vers); if (error) goto out; @@ -662,6 +670,11 @@ cxgb_controller_attach(device_t dev) device_printf(sc->dev, "Firmware Version %s\n", &sc->fw_version[0]); callout_reset(&sc->cxgb_tick_ch, hz, cxgb_tick, sc); t3_add_attach_sysctls(sc); + +#ifdef TCP_OFFLOAD + for (i = 0; i < NUM_CPL_HANDLERS; i++) + sc->cpl_handler[i] = cpl_not_handled; +#endif out: if (error) cxgb_free(sc); @@ -775,20 +788,9 @@ cxgb_free(struct adapter *sc) sc->tq = NULL; } - if (is_offload(sc)) { - clrbit(&sc->registered_device_map, OFFLOAD_DEVMAP_BIT); - cxgb_adapter_unofld(sc); - } - -#ifdef notyet - if (sc->flags & CXGB_OFLD_INIT) - cxgb_offload_deactivate(sc); -#endif free(sc->filters, M_DEVBUF); t3_sge_free(sc); - cxgb_offload_exit(); - if (sc->udbs_res != NULL) bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->udbs_rid, sc->udbs_res); @@ -800,6 +802,9 @@ cxgb_free(struct adapter *sc) MTX_DESTROY(&sc->mdio_lock); MTX_DESTROY(&sc->sge.reg_lock); MTX_DESTROY(&sc->elmer_lock); + mtx_lock(&t3_list_lock); + SLIST_REMOVE(&t3_list, sc, adapter, link); + mtx_unlock(&t3_list_lock); ADAPTER_LOCK_DEINIT(sc); } @@ -981,7 +986,7 @@ cxgb_makedev(struct port_info *pi) #define CXGB_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | \ IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO | \ - IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE) + IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE | IFCAP_HWCSUM_IPV6) #define CXGB_CAP_ENABLE CXGB_CAP static int @@ -1017,8 +1022,13 @@ cxgb_port_attach(device_t dev) ifp->if_qflush = cxgb_qflush; ifp->if_capabilities = CXGB_CAP; +#ifdef TCP_OFFLOAD + if (is_offload(sc)) + ifp->if_capabilities |= IFCAP_TOE4; +#endif ifp->if_capenable = CXGB_CAP_ENABLE; - ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO; + ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO | + CSUM_UDP_IPV6 | CSUM_TCP_IPV6; /* * Disable TSO on 4-port - it isn't supported by the firmware. @@ -1420,65 +1430,6 @@ setup_rss(adapter_t *adap) cpus, rspq_map); } - -/* - * Sends an mbuf to an offload queue driver - * after dealing with any active network taps. - */ -static inline int -offload_tx(struct t3cdev *tdev, struct mbuf *m) -{ - int ret; - - ret = t3_offload_tx(tdev, m); - return (ret); -} - -static int -write_smt_entry(struct adapter *adapter, int idx) -{ - struct port_info *pi = &adapter->port[idx]; - struct cpl_smt_write_req *req; - struct mbuf *m; - - if ((m = m_gethdr(M_NOWAIT, MT_DATA)) == NULL) - return (ENOMEM); - - req = mtod(m, struct cpl_smt_write_req *); - m->m_pkthdr.len = m->m_len = sizeof(struct cpl_smt_write_req); - - req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, idx)); - req->mtu_idx = NMTUS - 1; /* should be 0 but there's a T3 bug */ - req->iff = idx; - memset(req->src_mac1, 0, sizeof(req->src_mac1)); - memcpy(req->src_mac0, pi->hw_addr, ETHER_ADDR_LEN); - - m_set_priority(m, 1); - - offload_tx(&adapter->tdev, m); - - return (0); -} - -static int -init_smt(struct adapter *adapter) -{ - int i; - - for_each_port(adapter, i) - write_smt_entry(adapter, i); - return 0; -} - -static void -init_port_mtus(adapter_t *adapter) -{ - unsigned int mtus = ETHERMTU | (ETHERMTU << 16); - - t3_write_reg(adapter, A_TP_MTU_PORT_TABLE, mtus); -} - static void send_pktsched_cmd(struct adapter *adap, int sched, int qidx, int lo, int hi, int port) @@ -1705,45 +1656,6 @@ cxgb_down(struct adapter *sc) t3_intr_disable(sc); } -static int -offload_open(struct port_info *pi) -{ - struct adapter *sc = pi->adapter; - struct t3cdev *tdev = &sc->tdev; - - setbit(&sc->open_device_map, OFFLOAD_DEVMAP_BIT); - - t3_tp_set_offload_mode(sc, 1); - tdev->lldev = pi->ifp; - init_port_mtus(sc); - t3_load_mtus(sc, sc->params.mtus, sc->params.a_wnd, sc->params.b_wnd, - sc->params.rev == 0 ? sc->port[0].ifp->if_mtu : 0xffff); - init_smt(sc); - cxgb_add_clients(tdev); - - return (0); -} - -static int -offload_close(struct t3cdev *tdev) -{ - struct adapter *adapter = tdev2adap(tdev); - - if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT)) - return (0); - - /* Call back all registered clients */ - cxgb_remove_clients(tdev); - - tdev->lldev = NULL; - cxgb_set_dummy_ops(tdev); - t3_tp_set_offload_mode(adapter, 0); - - clrbit(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT); - - return (0); -} - /* * if_init for cxgb ports. */ @@ -1793,15 +1705,9 @@ cxgb_init_locked(struct port_info *p) ADAPTER_UNLOCK(sc); } - if (sc->open_device_map == 0) { - if ((rc = cxgb_up(sc)) != 0) + if (sc->open_device_map == 0 && ((rc = cxgb_up(sc)) != 0)) goto done; - if (is_offload(sc) && !ofld_disable && offload_open(p)) - log(LOG_WARNING, - "Could not initialize offload capabilities\n"); - } - PORT_LOCK(p); if (isset(&sc->open_device_map, p->port_id) && (ifp->if_drv_flags & IFF_DRV_RUNNING)) { @@ -1929,7 +1835,6 @@ cxgb_uninit_synchronized(struct port_info *pi) DELAY(100 * 1000); t3_mac_disable(&pi->mac, MAC_DIRECTION_RX); - pi->phy.ops->power_down(&pi->phy, 1); PORT_UNLOCK(pi); @@ -1937,9 +1842,6 @@ cxgb_uninit_synchronized(struct port_info *pi) pi->link_config.link_ok = 0; t3_os_link_changed(sc, pi->port_id, 0, 0, 0, 0, 0); - if ((sc->open_device_map & PORT_MASK) == 0) - offload_close(&sc->tdev); - if (sc->open_device_map == 0) cxgb_down(pi->adapter); @@ -2049,31 +1951,52 @@ fail: ifp->if_capenable ^= IFCAP_TXCSUM; ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP); - if (IFCAP_TSO & ifp->if_capenable && + if (IFCAP_TSO4 & ifp->if_capenable && !(IFCAP_TXCSUM & ifp->if_capenable)) { - ifp->if_capenable &= ~IFCAP_TSO; - ifp->if_hwassist &= ~CSUM_TSO; + ifp->if_capenable &= ~IFCAP_TSO4; if_printf(ifp, - "tso disabled due to -txcsum.\n"); + "tso4 disabled due to -txcsum.\n"); + } + } + if (mask & IFCAP_TXCSUM_IPV6) { + ifp->if_capenable ^= IFCAP_TXCSUM_IPV6; + ifp->if_hwassist ^= (CSUM_UDP_IPV6 | CSUM_TCP_IPV6); + + if (IFCAP_TSO6 & ifp->if_capenable && + !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) { + ifp->if_capenable &= ~IFCAP_TSO6; + if_printf(ifp, + "tso6 disabled due to -txcsum6.\n"); } } if (mask & IFCAP_RXCSUM) ifp->if_capenable ^= IFCAP_RXCSUM; - if (mask & IFCAP_TSO) { - ifp->if_capenable ^= IFCAP_TSO; + if (mask & IFCAP_RXCSUM_IPV6) + ifp->if_capenable ^= IFCAP_RXCSUM_IPV6; - if (IFCAP_TSO & ifp->if_capenable) { - if (IFCAP_TXCSUM & ifp->if_capenable) - ifp->if_hwassist |= CSUM_TSO; - else { - ifp->if_capenable &= ~IFCAP_TSO; - ifp->if_hwassist &= ~CSUM_TSO; - if_printf(ifp, - "enable txcsum first.\n"); - error = EAGAIN; - } - } else - ifp->if_hwassist &= ~CSUM_TSO; + /* + * Note that we leave CSUM_TSO alone (it is always set). The + * kernel takes both IFCAP_TSOx and CSUM_TSO into account before + * sending a TSO request our way, so it's sufficient to toggle + * IFCAP_TSOx only. + */ + if (mask & IFCAP_TSO4) { + if (!(IFCAP_TSO4 & ifp->if_capenable) && + !(IFCAP_TXCSUM & ifp->if_capenable)) { + if_printf(ifp, "enable txcsum first.\n"); + error = EAGAIN; + goto fail; + } + ifp->if_capenable ^= IFCAP_TSO4; + } + if (mask & IFCAP_TSO6) { + if (!(IFCAP_TSO6 & ifp->if_capenable) && + !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) { + if_printf(ifp, "enable txcsum6 first.\n"); + error = EAGAIN; + goto fail; + } + ifp->if_capenable ^= IFCAP_TSO6; } if (mask & IFCAP_LRO) { ifp->if_capenable ^= IFCAP_LRO; @@ -2081,6 +2004,15 @@ fail: /* Safe to do this even if cxgb_up not called yet */ cxgb_set_lro(p, ifp->if_capenable & IFCAP_LRO); } +#ifdef TCP_OFFLOAD + if (mask & IFCAP_TOE4) { + int enable = (ifp->if_capenable ^ mask) & IFCAP_TOE4; + + error = toe_capability(p, enable); + if (error == 0) + ifp->if_capenable ^= mask; + } +#endif if (mask & IFCAP_VLAN_HWTAGGING) { ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; if (ifp->if_drv_flags & IFF_DRV_RUNNING) { @@ -3362,3 +3294,235 @@ set_tcb_field_ulp(struct cpl_set_tcb_field *req, unsigned int tid, txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*req) / 8)); mk_set_tcb_field(req, tid, word, mask, val); } + +void +t3_iterate(void (*func)(struct adapter *, void *), void *arg) +{ + struct adapter *sc; + + mtx_lock(&t3_list_lock); + SLIST_FOREACH(sc, &t3_list, link) { + /* + * func should not make any assumptions about what state sc is + * in - the only guarantee is that sc->sc_lock is a valid lock. + */ + func(sc, arg); + } + mtx_unlock(&t3_list_lock); +} + +#ifdef TCP_OFFLOAD +static int +toe_capability(struct port_info *pi, int enable) +{ + int rc; + struct adapter *sc = pi->adapter; + + ADAPTER_LOCK_ASSERT_OWNED(sc); + + if (!is_offload(sc)) + return (ENODEV); + + if (enable) { + if (!(sc->flags & FULL_INIT_DONE)) { + log(LOG_WARNING, + "You must enable a cxgb interface first\n"); + return (EAGAIN); + } + + if (isset(&sc->offload_map, pi->port_id)) + return (0); + + if (!(sc->flags & TOM_INIT_DONE)) { + rc = t3_activate_uld(sc, ULD_TOM); + if (rc == EAGAIN) { + log(LOG_WARNING, + "You must kldload t3_tom.ko before trying " + "to enable TOE on a cxgb interface.\n"); + } + if (rc != 0) + return (rc); + KASSERT(sc->tom_softc != NULL, + ("%s: TOM activated but softc NULL", __func__)); + KASSERT(sc->flags & TOM_INIT_DONE, + ("%s: TOM activated but flag not set", __func__)); + } + + setbit(&sc->offload_map, pi->port_id); + + /* + * XXX: Temporary code to allow iWARP to be enabled when TOE is + * enabled on any port. Need to figure out how to enable, + * disable, load, and unload iWARP cleanly. + */ + if (!isset(&sc->offload_map, MAX_NPORTS) && + t3_activate_uld(sc, ULD_IWARP) == 0) + setbit(&sc->offload_map, MAX_NPORTS); + } else { + if (!isset(&sc->offload_map, pi->port_id)) + return (0); + + KASSERT(sc->flags & TOM_INIT_DONE, + ("%s: TOM never initialized?", __func__)); + clrbit(&sc->offload_map, pi->port_id); + } + + return (0); +} + +/* + * Add an upper layer driver to the global list. + */ +int +t3_register_uld(struct uld_info *ui) +{ + int rc = 0; + struct uld_info *u; + + mtx_lock(&t3_uld_list_lock); + SLIST_FOREACH(u, &t3_uld_list, link) { + if (u->uld_id == ui->uld_id) { + rc = EEXIST; + goto done; + } + } + + SLIST_INSERT_HEAD(&t3_uld_list, ui, link); + ui->refcount = 0; +done: + mtx_unlock(&t3_uld_list_lock); + return (rc); +} + +int +t3_unregister_uld(struct uld_info *ui) +{ + int rc = EINVAL; + struct uld_info *u; + + mtx_lock(&t3_uld_list_lock); + + SLIST_FOREACH(u, &t3_uld_list, link) { + if (u == ui) { + if (ui->refcount > 0) { + rc = EBUSY; + goto done; + } + + SLIST_REMOVE(&t3_uld_list, ui, uld_info, link); + rc = 0; + goto done; + } + } +done: + mtx_unlock(&t3_uld_list_lock); + return (rc); +} + +int +t3_activate_uld(struct adapter *sc, int id) +{ + int rc = EAGAIN; + struct uld_info *ui; + + mtx_lock(&t3_uld_list_lock); + + SLIST_FOREACH(ui, &t3_uld_list, link) { + if (ui->uld_id == id) { + rc = ui->activate(sc); + if (rc == 0) + ui->refcount++; + goto done; + } + } +done: + mtx_unlock(&t3_uld_list_lock); + + return (rc); +} + +int +t3_deactivate_uld(struct adapter *sc, int id) +{ + int rc = EINVAL; + struct uld_info *ui; + + mtx_lock(&t3_uld_list_lock); + + SLIST_FOREACH(ui, &t3_uld_list, link) { + if (ui->uld_id == id) { + rc = ui->deactivate(sc); + if (rc == 0) + ui->refcount--; + goto done; + } + } +done: + mtx_unlock(&t3_uld_list_lock); + + return (rc); +} + +static int +cpl_not_handled(struct sge_qset *qs __unused, struct rsp_desc *r __unused, + struct mbuf *m) +{ + m_freem(m); + return (EDOOFUS); +} + +int +t3_register_cpl_handler(struct adapter *sc, int opcode, cpl_handler_t h) +{ + uintptr_t *loc, new; + + if (opcode >= NUM_CPL_HANDLERS) + return (EINVAL); + + new = h ? (uintptr_t)h : (uintptr_t)cpl_not_handled; + loc = (uintptr_t *) &sc->cpl_handler[opcode]; + atomic_store_rel_ptr(loc, new); + + return (0); +} +#endif + +static int +cxgbc_mod_event(module_t mod, int cmd, void *arg) +{ + int rc = 0; + + switch (cmd) { + case MOD_LOAD: + mtx_init(&t3_list_lock, "T3 adapters", 0, MTX_DEF); + SLIST_INIT(&t3_list); +#ifdef TCP_OFFLOAD + mtx_init(&t3_uld_list_lock, "T3 ULDs", 0, MTX_DEF); + SLIST_INIT(&t3_uld_list); +#endif + break; + + case MOD_UNLOAD: +#ifdef TCP_OFFLOAD + mtx_lock(&t3_uld_list_lock); + if (!SLIST_EMPTY(&t3_uld_list)) { + rc = EBUSY; + mtx_unlock(&t3_uld_list_lock); + break; + } + mtx_unlock(&t3_uld_list_lock); + mtx_destroy(&t3_uld_list_lock); +#endif + mtx_lock(&t3_list_lock); + if (!SLIST_EMPTY(&t3_list)) { + rc = EBUSY; + mtx_unlock(&t3_list_lock); + break; + } + mtx_unlock(&t3_list_lock); + mtx_destroy(&t3_list_lock); + break; + } + + return (rc); +} diff --git a/sys/dev/cxgb/cxgb_offload.c b/sys/dev/cxgb/cxgb_offload.c deleted file mode 100644 index 2ae83bd3d0a..00000000000 --- a/sys/dev/cxgb/cxgb_offload.c +++ /dev/null @@ -1,465 +0,0 @@ -/************************************************************************** - -Copyright (c) 2007-2008, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - -***************************************************************************/ - - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#define VALIDATE_TID 0 -MALLOC_DEFINE(M_CXGB, "cxgb", "Chelsio 10 Gigabit Ethernet and services"); - -TAILQ_HEAD(, cxgb_client) client_list; -TAILQ_HEAD(, t3cdev) ofld_dev_list; - - -static struct mtx cxgb_db_lock; - - -static int inited = 0; - -static inline int -offload_activated(struct t3cdev *tdev) -{ - struct adapter *adapter = tdev2adap(tdev); - - return (isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT)); -} - -static inline void -register_tdev(struct t3cdev *tdev) -{ - static int unit; - - mtx_lock(&cxgb_db_lock); - snprintf(tdev->name, sizeof(tdev->name), "ofld_dev%d", unit++); - TAILQ_INSERT_TAIL(&ofld_dev_list, tdev, entry); - mtx_unlock(&cxgb_db_lock); -} - -static inline void -unregister_tdev(struct t3cdev *tdev) -{ - if (!inited) - return; - - mtx_lock(&cxgb_db_lock); - TAILQ_REMOVE(&ofld_dev_list, tdev, entry); - mtx_unlock(&cxgb_db_lock); -} - -#ifndef TCP_OFFLOAD_DISABLE -/** - * cxgb_register_client - register an offload client - * @client: the client - * - * Add the client to the client list, - * and call backs the client for each activated offload device - */ -void -cxgb_register_client(struct cxgb_client *client) -{ - struct t3cdev *tdev; - - mtx_lock(&cxgb_db_lock); - TAILQ_INSERT_TAIL(&client_list, client, client_entry); - - if (client->add) { - TAILQ_FOREACH(tdev, &ofld_dev_list, entry) { - if (offload_activated(tdev)) { - client->add(tdev); - } else - CTR1(KTR_CXGB, - "cxgb_register_client: %p not activated", tdev); - - } - } - mtx_unlock(&cxgb_db_lock); -} - -/** - * cxgb_unregister_client - unregister an offload client - * @client: the client - * - * Remove the client to the client list, - * and call backs the client for each activated offload device. - */ -void -cxgb_unregister_client(struct cxgb_client *client) -{ - struct t3cdev *tdev; - - mtx_lock(&cxgb_db_lock); - TAILQ_REMOVE(&client_list, client, client_entry); - - if (client->remove) { - TAILQ_FOREACH(tdev, &ofld_dev_list, entry) { - if (offload_activated(tdev)) - client->remove(tdev); - } - } - mtx_unlock(&cxgb_db_lock); -} - -/** - * cxgb_add_clients - activate register clients for an offload device - * @tdev: the offload device - * - * Call backs all registered clients once a offload device is activated - */ -void -cxgb_add_clients(struct t3cdev *tdev) -{ - struct cxgb_client *client; - - mtx_lock(&cxgb_db_lock); - TAILQ_FOREACH(client, &client_list, client_entry) { - if (client->add) - client->add(tdev); - } - mtx_unlock(&cxgb_db_lock); -} - -/** - * cxgb_remove_clients - activate register clients for an offload device - * @tdev: the offload device - * - * Call backs all registered clients once a offload device is deactivated - */ -void -cxgb_remove_clients(struct t3cdev *tdev) -{ - struct cxgb_client *client; - - mtx_lock(&cxgb_db_lock); - TAILQ_FOREACH(client, &client_list, client_entry) { - if (client->remove) - client->remove(tdev); - } - mtx_unlock(&cxgb_db_lock); -} -#endif - -/** - * cxgb_ofld_recv - process n received offload packets - * @dev: the offload device - * @m: an array of offload packets - * @n: the number of offload packets - * - * Process an array of ingress offload packets. Each packet is forwarded - * to any active network taps and then passed to the offload device's receive - * method. We optimize passing packets to the receive method by passing - * it the whole array at once except when there are active taps. - */ -int -cxgb_ofld_recv(struct t3cdev *dev, struct mbuf **m, int n) -{ - - return dev->recv(dev, m, n); -} - -/* - * Dummy handler for Rx offload packets in case we get an offload packet before - * proper processing is setup. This complains and drops the packet as it isn't - * normal to get offload packets at this stage. - */ -static int -rx_offload_blackhole(struct t3cdev *dev, struct mbuf **m, int n) -{ - while (n--) - m_freem(m[n]); - return 0; -} - -static void -dummy_neigh_update(struct t3cdev *dev, struct rtentry *neigh, uint8_t *enaddr, - struct sockaddr *sa) -{ -} - -void -cxgb_set_dummy_ops(struct t3cdev *dev) -{ - dev->recv = rx_offload_blackhole; - dev->arp_update = dummy_neigh_update; -} - -static int -do_smt_write_rpl(struct t3cdev *dev, struct mbuf *m) -{ - struct cpl_smt_write_rpl *rpl = cplhdr(m); - - if (rpl->status != CPL_ERR_NONE) - log(LOG_ERR, - "Unexpected SMT_WRITE_RPL status %u for entry %u\n", - rpl->status, GET_TID(rpl)); - - return CPL_RET_BUF_DONE; -} - -static int -do_l2t_write_rpl(struct t3cdev *dev, struct mbuf *m) -{ - struct cpl_l2t_write_rpl *rpl = cplhdr(m); - - if (rpl->status != CPL_ERR_NONE) - log(LOG_ERR, - "Unexpected L2T_WRITE_RPL status %u for entry %u\n", - rpl->status, GET_TID(rpl)); - - return CPL_RET_BUF_DONE; -} - -static int -do_rte_write_rpl(struct t3cdev *dev, struct mbuf *m) -{ - struct cpl_rte_write_rpl *rpl = cplhdr(m); - - if (rpl->status != CPL_ERR_NONE) - log(LOG_ERR, - "Unexpected L2T_WRITE_RPL status %u for entry %u\n", - rpl->status, GET_TID(rpl)); - - return CPL_RET_BUF_DONE; -} - -static int -do_set_tcb_rpl(struct t3cdev *dev, struct mbuf *m) -{ - struct cpl_set_tcb_rpl *rpl = cplhdr(m); - - if (rpl->status != CPL_ERR_NONE) - log(LOG_ERR, - "Unexpected SET_TCB_RPL status %u for tid %u\n", - rpl->status, GET_TID(rpl)); - return CPL_RET_BUF_DONE; -} - -static int -do_trace(struct t3cdev *dev, struct mbuf *m) -{ -#if 0 - struct cpl_trace_pkt *p = cplhdr(m); - - - skb->protocol = 0xffff; - skb->dev = dev->lldev; - skb_pull(skb, sizeof(*p)); - skb->mac.raw = mtod(m, (char *)); - netif_receive_skb(skb); -#endif - return 0; -} - -/* - * Process a received packet with an unknown/unexpected CPL opcode. - */ -static int -do_bad_cpl(struct t3cdev *dev, struct mbuf *m) -{ - log(LOG_ERR, "%s: received bad CPL command 0x%x\n", dev->name, - 0xFF & *mtod(m, uint32_t *)); - return (CPL_RET_BUF_DONE | CPL_RET_BAD_MSG); -} - -/* - * Handlers for each CPL opcode - */ -static cpl_handler_func cpl_handlers[256]; - -/* - * T3CDEV's receive method. - */ -int -process_rx(struct t3cdev *dev, struct mbuf **m, int n) -{ - while (n--) { - struct mbuf *m0 = *m++; - unsigned int opcode = G_OPCODE(ntohl(m0->m_pkthdr.csum_data)); - int ret; - - DPRINTF("processing op=0x%x m=%p data=%p\n", opcode, m0, m0->m_data); - - ret = cpl_handlers[opcode] (dev, m0); - -#if VALIDATE_TID - if (ret & CPL_RET_UNKNOWN_TID) { - union opcode_tid *p = cplhdr(m0); - - log(LOG_ERR, "%s: CPL message (opcode %u) had " - "unknown TID %u\n", dev->name, opcode, - G_TID(ntohl(p->opcode_tid))); - } -#endif - if (ret & CPL_RET_BUF_DONE) - m_freem(m0); - } - return 0; -} - -/* - * Add a new handler to the CPL dispatch table. A NULL handler may be supplied - * to unregister an existing handler. - */ -void -t3_register_cpl_handler(unsigned int opcode, cpl_handler_func h) -{ - if (opcode < NUM_CPL_CMDS) - cpl_handlers[opcode] = h ? h : do_bad_cpl; - else - log(LOG_ERR, "T3C: handler registration for " - "opcode %x failed\n", opcode); -} - -/* - * Allocate a chunk of memory using kmalloc or, if that fails, vmalloc. - * The allocated memory is cleared. - */ -void * -cxgb_alloc_mem(unsigned long size) -{ - - return malloc(size, M_CXGB, M_ZERO|M_NOWAIT); -} - -/* - * Free memory allocated through t3_alloc_mem(). - */ -void -cxgb_free_mem(void *addr) -{ - free(addr, M_CXGB); -} - -static __inline int -adap2type(struct adapter *adapter) -{ - int type = 0; - - switch (adapter->params.rev) { - case T3_REV_A: - type = T3A; - break; - case T3_REV_B: - case T3_REV_B2: - type = T3B; - break; - case T3_REV_C: - type = T3C; - break; - } - return type; -} - -void -cxgb_adapter_ofld(struct adapter *adapter) -{ - struct t3cdev *tdev = &adapter->tdev; - - cxgb_set_dummy_ops(tdev); - tdev->type = adap2type(adapter); - tdev->adapter = adapter; - register_tdev(tdev); - -} - -void -cxgb_adapter_unofld(struct adapter *adapter) -{ - struct t3cdev *tdev = &adapter->tdev; - - tdev->recv = NULL; - tdev->arp_update = NULL; - unregister_tdev(tdev); -} - -void -cxgb_offload_init(void) -{ - int i; - - if (inited++) - return; - - mtx_init(&cxgb_db_lock, "ofld db", NULL, MTX_DEF); - - TAILQ_INIT(&client_list); - TAILQ_INIT(&ofld_dev_list); - - for (i = 0; i < 0x100; ++i) - cpl_handlers[i] = do_bad_cpl; - - t3_register_cpl_handler(CPL_SMT_WRITE_RPL, do_smt_write_rpl); - t3_register_cpl_handler(CPL_RTE_WRITE_RPL, do_rte_write_rpl); - t3_register_cpl_handler(CPL_L2T_WRITE_RPL, do_l2t_write_rpl); - - t3_register_cpl_handler(CPL_SET_TCB_RPL, do_set_tcb_rpl); - t3_register_cpl_handler(CPL_TRACE_PKT, do_trace); - -} - -void -cxgb_offload_exit(void) -{ - - if (--inited) - return; - - mtx_destroy(&cxgb_db_lock); -} - -MODULE_VERSION(if_cxgb, 1); diff --git a/sys/dev/cxgb/cxgb_offload.h b/sys/dev/cxgb/cxgb_offload.h index a8b858e7103..364ab43efc8 100644 --- a/sys/dev/cxgb/cxgb_offload.h +++ b/sys/dev/cxgb/cxgb_offload.h @@ -1,4 +1,3 @@ - /************************************************************************** Copyright (c) 2007-2008, Chelsio Inc. @@ -33,221 +32,93 @@ $FreeBSD$ #ifndef _CXGB_OFFLOAD_H #define _CXGB_OFFLOAD_H -#include -#include - -MALLOC_DECLARE(M_CXGB); - -struct adapter; -struct cxgb_client; - -void cxgb_offload_init(void); -void cxgb_offload_exit(void); - -void cxgb_adapter_ofld(struct adapter *adapter); -void cxgb_adapter_unofld(struct adapter *adapter); -int cxgb_offload_activate(struct adapter *adapter); -void cxgb_offload_deactivate(struct adapter *adapter); -int cxgb_ofld_recv(struct t3cdev *dev, struct mbuf **m, int n); - -void cxgb_set_dummy_ops(struct t3cdev *dev); - - -/* - * Client registration. Users of T3 driver must register themselves. - * The T3 driver will call the add function of every client for each T3 - * adapter activated, passing up the t3cdev ptr. Each client fills out an - * array of callback functions to process CPL messages. - */ - -void cxgb_register_client(struct cxgb_client *client); -void cxgb_unregister_client(struct cxgb_client *client); -void cxgb_add_clients(struct t3cdev *tdev); -void cxgb_remove_clients(struct t3cdev *tdev); - -typedef int (*cxgb_cpl_handler_func)(struct t3cdev *dev, - struct mbuf *m, void *ctx); - -struct l2t_entry; -struct cxgb_client { - char *name; - void (*add) (struct t3cdev *); - void (*remove) (struct t3cdev *); - cxgb_cpl_handler_func *handlers; - int (*redirect)(void *ctx, struct rtentry *old, - struct rtentry *new, - struct l2t_entry *l2t); - TAILQ_ENTRY(cxgb_client) client_entry; +#ifdef TCP_OFFLOAD +enum { + ULD_TOM = 1, + ULD_IWARP = 2, }; -/* - * TID allocation services. - */ -int cxgb_alloc_atid(struct t3cdev *dev, struct cxgb_client *client, - void *ctx); -int cxgb_alloc_stid(struct t3cdev *dev, struct cxgb_client *client, - void *ctx); -void *cxgb_free_atid(struct t3cdev *dev, int atid); -void cxgb_free_stid(struct t3cdev *dev, int stid); -void *cxgb_get_lctx(struct t3cdev *tdev, int stid); -void cxgb_insert_tid(struct t3cdev *dev, struct cxgb_client *client, - void *ctx, - unsigned int tid); -void cxgb_queue_tid_release(struct t3cdev *dev, unsigned int tid); -void cxgb_remove_tid(struct t3cdev *dev, void *ctx, unsigned int tid); +struct adapter; +struct uld_info { + SLIST_ENTRY(uld_info) link; + int refcount; + int uld_id; + int (*activate)(struct adapter *); + int (*deactivate)(struct adapter *); +}; -struct toe_tid_entry { - struct cxgb_client *client; - void *ctx; +struct tom_tunables { + int sndbuf; + int ddp; + int indsz; + int ddp_thres; }; /* CPL message priority levels */ enum { CPL_PRIORITY_DATA = 0, /* data messages */ - CPL_PRIORITY_SETUP = 1, /* connection setup messages */ - CPL_PRIORITY_TEARDOWN = 0, /* connection teardown messages */ - CPL_PRIORITY_LISTEN = 1, /* listen start/stop messages */ - CPL_PRIORITY_ACK = 1, /* RX ACK messages */ CPL_PRIORITY_CONTROL = 1 /* offload control messages */ }; -/* Flags for return value of CPL message handlers */ -enum { - CPL_RET_BUF_DONE = 1, // buffer processing done, buffer may be freed - CPL_RET_BAD_MSG = 2, // bad CPL message (e.g., unknown opcode) - CPL_RET_UNKNOWN_TID = 4 // unexpected unknown TID -}; +#define S_HDR_NDESC 0 +#define M_HDR_NDESC 0xf +#define V_HDR_NDESC(x) ((x) << S_HDR_NDESC) +#define G_HDR_NDESC(x) (((x) >> S_HDR_NDESC) & M_HDR_NDESC) -typedef int (*cpl_handler_func)(struct t3cdev *dev, struct mbuf *m); +#define S_HDR_QSET 4 +#define M_HDR_QSET 0xf +#define V_HDR_QSET(x) ((x) << S_HDR_QSET) +#define G_HDR_QSET(x) (((x) >> S_HDR_QSET) & M_HDR_QSET) -/* - * Returns a pointer to the first byte of the CPL header in an sk_buff that - * contains a CPL message. - */ -static inline void *cplhdr(struct mbuf *m) +#define S_HDR_CTRL 8 +#define V_HDR_CTRL(x) ((x) << S_HDR_CTRL) +#define F_HDR_CTRL V_HDR_CTRL(1U) + +#define S_HDR_DF 9 +#define V_HDR_DF(x) ((x) << S_HDR_DF) +#define F_HDR_DF V_HDR_DF(1U) + +#define S_HDR_SGL 10 +#define V_HDR_SGL(x) ((x) << S_HDR_SGL) +#define F_HDR_SGL V_HDR_SGL(1U) + +struct ofld_hdr { - return mtod(m, uint8_t *); -} - -void t3_register_cpl_handler(unsigned int opcode, cpl_handler_func h); - -union listen_entry { - struct toe_tid_entry toe_tid; - union listen_entry *next; -}; - -union active_open_entry { - struct toe_tid_entry toe_tid; - union active_open_entry *next; + void *sgl; /* SGL, if F_HDR_SGL set in flags */ + int plen; /* amount of payload (in bytes) */ + int flags; }; /* - * Holds the size, base address, free list start, etc of the TID, server TID, - * and active-open TID tables for a offload device. - * The tables themselves are allocated dynamically. + * Convenience function for fixed size CPLs that fit in 1 desc. */ -struct tid_info { - struct toe_tid_entry *tid_tab; - unsigned int ntids; - volatile unsigned int tids_in_use; - - union listen_entry *stid_tab; - unsigned int nstids; - unsigned int stid_base; - - union active_open_entry *atid_tab; - unsigned int natids; - unsigned int atid_base; - - /* - * The following members are accessed R/W so we put them in their own - * cache lines. - * - * XXX We could combine the atid fields above with the lock here since - * atids are use once (unlike other tids). OTOH the above fields are - * usually in cache due to tid_tab. - */ - struct mtx atid_lock /* ____cacheline_aligned_in_smp */; - union active_open_entry *afree; - unsigned int atids_in_use; - - struct mtx stid_lock /*____cacheline_aligned */; - union listen_entry *sfree; - unsigned int stids_in_use; -}; - -struct t3c_data { - struct t3cdev *dev; - unsigned int tx_max_chunk; /* max payload for TX_DATA */ - unsigned int max_wrs; /* max in-flight WRs per connection */ - unsigned int nmtus; - const unsigned short *mtus; - struct tid_info tid_maps; - - struct toe_tid_entry *tid_release_list; - struct mtx tid_release_lock; - struct task tid_release_task; -}; - -/* - * t3cdev -> toe_data accessor - */ -#define T3C_DATA(dev) (*(struct t3c_data **)&(dev)->l4opt) - -/* - * Map an ATID or STID to their entries in the corresponding TID tables. - */ -static inline union active_open_entry *atid2entry(const struct tid_info *t, - unsigned int atid) +#define M_GETHDR_OFLD(qset, ctrl, cpl) \ + m_gethdr_ofld(qset, ctrl, sizeof(*cpl), (void **)&cpl) +static inline struct mbuf * +m_gethdr_ofld(int qset, int ctrl, int cpllen, void **cpl) { - return &t->atid_tab[atid - t->atid_base]; + struct mbuf *m; + struct ofld_hdr *oh; + + m = m_gethdr(M_NOWAIT, MT_DATA); + if (m == NULL) + return (NULL); + + oh = mtod(m, struct ofld_hdr *); + oh->flags = V_HDR_NDESC(1) | V_HDR_QSET(qset) | V_HDR_CTRL(ctrl); + *cpl = (void *)(oh + 1); + m->m_pkthdr.len = m->m_len = sizeof(*oh) + cpllen; + + return (m); } +int t3_register_uld(struct uld_info *); +int t3_unregister_uld(struct uld_info *); +int t3_activate_uld(struct adapter *, int); +int t3_deactivate_uld(struct adapter *, int); +#endif /* TCP_OFFLOAD */ -static inline union listen_entry *stid2entry(const struct tid_info *t, - unsigned int stid) -{ - return &t->stid_tab[stid - t->stid_base]; -} +#define CXGB_UNIMPLEMENTED() \ + panic("IMPLEMENT: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__) -/* - * Find the connection corresponding to a TID. - */ -static inline struct toe_tid_entry *lookup_tid(const struct tid_info *t, - unsigned int tid) -{ - return tid < t->ntids ? &(t->tid_tab[tid]) : NULL; -} - -/* - * Find the connection corresponding to a server TID. - */ -static inline struct toe_tid_entry *lookup_stid(const struct tid_info *t, - unsigned int tid) -{ - if (tid < t->stid_base || tid >= t->stid_base + t->nstids) - return NULL; - return &(stid2entry(t, tid)->toe_tid); -} - -/* - * Find the connection corresponding to an active-open TID. - */ -static inline struct toe_tid_entry *lookup_atid(const struct tid_info *t, - unsigned int tid) -{ - if (tid < t->atid_base || tid >= t->atid_base + t->natids) - return NULL; - return &(atid2entry(t, tid)->toe_tid); -} - -void *cxgb_alloc_mem(unsigned long size); -void cxgb_free_mem(void *addr); -void cxgb_neigh_update(struct rtentry *rt, uint8_t *enaddr, struct sockaddr *sa); -void cxgb_redirect(struct rtentry *old, struct rtentry *new, struct sockaddr *sa); -int process_rx(struct t3cdev *dev, struct mbuf **m, int n); -int attach_t3cdev(struct t3cdev *dev); -void detach_t3cdev(struct t3cdev *dev); - -#define CXGB_UNIMPLEMENTED() panic("IMPLEMENT: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__) #endif diff --git a/sys/dev/cxgb/cxgb_osdep.h b/sys/dev/cxgb/cxgb_osdep.h index 5dc256dd23a..37171d94f5a 100644 --- a/sys/dev/cxgb/cxgb_osdep.h +++ b/sys/dev/cxgb/cxgb_osdep.h @@ -67,27 +67,6 @@ struct t3_mbuf_hdr { } while (0) #endif -#define m_get_priority(m) ((uintptr_t)(m)->m_pkthdr.rcvif) -#define m_set_priority(m, pri) ((m)->m_pkthdr.rcvif = (struct ifnet *)((uintptr_t)pri)) -#define m_set_sgl(m, sgl) ((m)->m_pkthdr.header = (sgl)) -#define m_get_sgl(m) ((bus_dma_segment_t *)(m)->m_pkthdr.header) -#define m_set_sgllen(m, len) ((m)->m_pkthdr.ether_vtag = len) -#define m_get_sgllen(m) ((m)->m_pkthdr.ether_vtag) - -/* - * XXX FIXME - */ -#define m_set_toep(m, a) ((m)->m_pkthdr.header = (a)) -#define m_get_toep(m) ((m)->m_pkthdr.header) -#define m_set_handler(m, handler) ((m)->m_pkthdr.header = (handler)) - -#define m_set_socket(m, a) ((m)->m_pkthdr.header = (a)) -#define m_get_socket(m) ((m)->m_pkthdr.header) - -#define KTR_CXGB KTR_SPARE2 - -#define MT_DONTFREE 128 - #if __FreeBSD_version < 800054 #if defined (__GNUC__) #if #cpu(i386) || defined __i386 || defined i386 || defined __i386__ || #cpu(x86_64) || defined __x86_64__ @@ -123,13 +102,6 @@ struct t3_mbuf_hdr { #define CXGB_TX_CLEANUP_THRESHOLD 32 - -#ifdef DEBUG_PRINT -#define DPRINTF printf -#else -#define DPRINTF(...) -#endif - #define TX_MAX_SIZE (1 << 16) /* 64KB */ #define TX_MAX_SEGS 36 /* maximum supported by card */ @@ -199,7 +171,6 @@ static const int debug_flags = DBG_RX; #define test_and_clear_bit(bit, p) atomic_cmpset_int((p), ((*(p)) | (1< __FBSDID("$FreeBSD$"); +#include "opt_inet6.h" #include "opt_inet.h" #include @@ -53,6 +54,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -77,6 +79,10 @@ __FBSDID("$FreeBSD$"); int txq_fills = 0; int multiq_tx_enable = 1; +#ifdef TCP_OFFLOAD +CTASSERT(NUM_CPL_HANDLERS >= NUM_CPL_CMDS); +#endif + extern struct sysctl_oid_list sysctl__hw_cxgb_children; int cxgb_txq_buf_ring_size = TX_ETH_Q_SIZE; TUNABLE_INT("hw.cxgb.txq_mr_size", &cxgb_txq_buf_ring_size); @@ -470,10 +476,17 @@ static int get_imm_packet(adapter_t *sc, const struct rsp_desc *resp, struct mbuf *m) { - m->m_len = m->m_pkthdr.len = IMMED_PKT_SIZE; + if (resp->rss_hdr.opcode == CPL_RX_DATA) { + const struct cpl_rx_data *cpl = (const void *)&resp->imm_data[0]; + m->m_len = sizeof(*cpl) + ntohs(cpl->len); + } else if (resp->rss_hdr.opcode == CPL_RX_PKT) { + const struct cpl_rx_pkt *cpl = (const void *)&resp->imm_data[0]; + m->m_len = sizeof(*cpl) + ntohs(cpl->len); + } else + m->m_len = IMMED_PKT_SIZE; m->m_ext.ext_buf = NULL; m->m_ext.ext_type = 0; - memcpy(mtod(m, uint8_t *), resp->imm_data, IMMED_PKT_SIZE); + memcpy(mtod(m, uint8_t *), resp->imm_data, m->m_len); return (0); } @@ -702,7 +715,8 @@ refill_fl(adapter_t *sc, struct sge_fl *q, int n) cb_arg.error = 0; while (n--) { /* - * We only allocate a cluster, mbuf allocation happens after rx + * We allocate an uninitialized mbuf + cluster, mbuf is + * initialized after rx. */ if (q->zone == zone_pack) { if ((m = m_getcl(M_NOWAIT, MT_NOINIT, M_PKTHDR)) == NULL) @@ -1169,57 +1183,6 @@ calc_tx_descs(const struct mbuf *m, int nsegs) return flits_to_desc(flits); } -static unsigned int -busdma_map_mbufs(struct mbuf **m, struct sge_txq *txq, - struct tx_sw_desc *txsd, bus_dma_segment_t *segs, int *nsegs) -{ - struct mbuf *m0; - int err, pktlen, pass = 0; - bus_dma_tag_t tag = txq->entry_tag; - -retry: - err = 0; - m0 = *m; - pktlen = m0->m_pkthdr.len; -#if defined(__i386__) || defined(__amd64__) - if (busdma_map_sg_collapse(tag, txsd->map, m, segs, nsegs) == 0) { - goto done; - } else -#endif - err = bus_dmamap_load_mbuf_sg(tag, txsd->map, m0, segs, nsegs, 0); - - if (err == 0) { - goto done; - } - if (err == EFBIG && pass == 0) { - pass = 1; - /* Too many segments, try to defrag */ - m0 = m_defrag(m0, M_DONTWAIT); - if (m0 == NULL) { - m_freem(*m); - *m = NULL; - return (ENOBUFS); - } - *m = m0; - goto retry; - } else if (err == ENOMEM) { - return (err); - } if (err) { - if (cxgb_debug) - printf("map failure err=%d pktlen=%d\n", err, pktlen); - m_freem(m0); - *m = NULL; - return (err); - } -done: -#if !defined(__i386__) && !defined(__amd64__) - bus_dmamap_sync(tag, txsd->map, BUS_DMASYNC_PREWRITE); -#endif - txsd->flags |= TX_SW_DESC_MAPPED; - - return (0); -} - /** * make_sgl - populate a scatter/gather list for a packet * @sgp: the SGL to populate @@ -1327,10 +1290,10 @@ write_wr_hdr_sgl(unsigned int ndesc, struct tx_desc *txd, struct txq_state *txqs if (__predict_true(ndesc == 1)) { set_wr_hdr(wrp, htonl(F_WR_SOP | F_WR_EOP | V_WR_DATATYPE(1) | - V_WR_SGLSFLT(flits)) | wr_hi, - htonl(V_WR_LEN(flits + sgl_flits) | - V_WR_GEN(txqs->gen)) | wr_lo); - /* XXX gen? */ + V_WR_SGLSFLT(flits)) | wr_hi, + htonl(V_WR_LEN(flits + sgl_flits) | V_WR_GEN(txqs->gen)) | + wr_lo); + wr_gen2(txd, txqs->gen); } else { @@ -1469,7 +1432,8 @@ t3_encap(struct sge_qset *qs, struct mbuf **m) cntrl |= V_TXPKT_OPCODE(CPL_TX_PKT); if (__predict_false(!(cflags & CSUM_IP))) cntrl |= F_TXPKT_IPCSUM_DIS; - if (__predict_false(!(cflags & (CSUM_TCP | CSUM_UDP)))) + if (__predict_false(!(cflags & (CSUM_TCP | CSUM_UDP | + CSUM_UDP_IPV6 | CSUM_TCP_IPV6)))) cntrl |= F_TXPKT_L4CSUM_DIS; hflit[0] = htonl(cntrl); @@ -1584,7 +1548,8 @@ t3_encap(struct sge_qset *qs, struct mbuf **m) cntrl |= V_TXPKT_OPCODE(CPL_TX_PKT); if (__predict_false(!(m0->m_pkthdr.csum_flags & CSUM_IP))) cntrl |= F_TXPKT_IPCSUM_DIS; - if (__predict_false(!(m0->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP)))) + if (__predict_false(!(m0->m_pkthdr.csum_flags & (CSUM_TCP | + CSUM_UDP | CSUM_UDP_IPV6 | CSUM_TCP_IPV6)))) cntrl |= F_TXPKT_L4CSUM_DIS; cpl->cntrl = htonl(cntrl); cpl->len = htonl(mlen | 0x80000000); @@ -1812,34 +1777,23 @@ cxgb_qflush(struct ifnet *ifp) * its entirety. */ static __inline void -write_imm(struct tx_desc *d, struct mbuf *m, +write_imm(struct tx_desc *d, caddr_t src, unsigned int len, unsigned int gen) { - struct work_request_hdr *from = mtod(m, struct work_request_hdr *); + struct work_request_hdr *from = (struct work_request_hdr *)src; struct work_request_hdr *to = (struct work_request_hdr *)d; uint32_t wr_hi, wr_lo; - if (len > WR_LEN) - panic("len too big %d\n", len); - if (len < sizeof(*from)) - panic("len too small %d", len); + KASSERT(len <= WR_LEN && len >= sizeof(*from), + ("%s: invalid len %d", __func__, len)); memcpy(&to[1], &from[1], len - sizeof(*from)); wr_hi = from->wrh_hi | htonl(F_WR_SOP | F_WR_EOP | - V_WR_BCNTLFLT(len & 7)); - wr_lo = from->wrh_lo | htonl(V_WR_GEN(gen) | - V_WR_LEN((len + 7) / 8)); + V_WR_BCNTLFLT(len & 7)); + wr_lo = from->wrh_lo | htonl(V_WR_GEN(gen) | V_WR_LEN((len + 7) / 8)); set_wr_hdr(to, wr_hi, wr_lo); wmb(); wr_gen2(d, gen); - - /* - * This check is a hack we should really fix the logic so - * that this can't happen - */ - if (m->m_type != MT_DONTFREE) - m_freem(m); - } /** @@ -1907,12 +1861,6 @@ reclaim_completed_tx_imm(struct sge_txq *q) q->cleaned += reclaim; } -static __inline int -immediate(const struct mbuf *m) -{ - return m->m_len <= WR_LEN && m->m_pkthdr.len <= WR_LEN ; -} - /** * ctrl_xmit - send a packet through an SGE control Tx queue * @adap: the adapter @@ -1930,11 +1878,8 @@ ctrl_xmit(adapter_t *adap, struct sge_qset *qs, struct mbuf *m) struct work_request_hdr *wrp = mtod(m, struct work_request_hdr *); struct sge_txq *q = &qs->txq[TXQ_CTRL]; - if (__predict_false(!immediate(m))) { - m_freem(m); - return 0; - } - + KASSERT(m->m_len <= WR_LEN, ("%s: bad tx data", __func__)); + wrp->wrh_hi |= htonl(F_WR_SOP | F_WR_EOP); wrp->wrh_lo = htonl(V_WR_TID(q->token)); @@ -1949,7 +1894,7 @@ again: reclaim_completed_tx_imm(q); } goto again; } - write_imm(&q->desc[q->pidx], m, m->m_len, q->gen); + write_imm(&q->desc[q->pidx], m->m_data, m->m_len, q->gen); q->in_use++; if (++q->pidx >= q->size) { @@ -1959,7 +1904,9 @@ again: reclaim_completed_tx_imm(q); TXQ_UNLOCK(qs); wmb(); t3_write_reg(adap, A_SG_KDOORBELL, - F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id)); + F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id)); + + m_free(m); return (0); } @@ -1984,7 +1931,8 @@ again: reclaim_completed_tx_imm(q); while (q->in_use < q->size && (m = mbufq_dequeue(&q->sendq)) != NULL) { - write_imm(&q->desc[q->pidx], m, m->m_len, q->gen); + write_imm(&q->desc[q->pidx], m->m_data, m->m_len, q->gen); + m_free(m); if (++q->pidx >= q->size) { q->pidx = 0; @@ -2085,7 +2033,7 @@ t3_free_qset(adapter_t *sc, struct sge_qset *q) MTX_DESTROY(&q->rspq.lock); } -#ifdef INET +#if defined(INET6) || defined(INET) tcp_lro_free(&q->lro.ctrl); #endif @@ -2238,6 +2186,7 @@ is_new_response(const struct rsp_desc *r, /* How long to delay the next interrupt in case of memory shortage, in 0.1us. */ #define NOMEM_INTR_DELAY 2500 +#ifdef TCP_OFFLOAD /** * write_ofld_wr - write an offload work request * @adap: the adapter @@ -2251,70 +2200,65 @@ is_new_response(const struct rsp_desc *r, * data already carry the work request with most fields populated. */ static void -write_ofld_wr(adapter_t *adap, struct mbuf *m, - struct sge_txq *q, unsigned int pidx, - unsigned int gen, unsigned int ndesc, - bus_dma_segment_t *segs, unsigned int nsegs) +write_ofld_wr(adapter_t *adap, struct mbuf *m, struct sge_txq *q, + unsigned int pidx, unsigned int gen, unsigned int ndesc) { unsigned int sgl_flits, flits; + int i, idx, nsegs, wrlen; struct work_request_hdr *from; - struct sg_ent *sgp, sgl[TX_MAX_SEGS / 2 + 1]; + struct sg_ent *sgp, t3sgl[TX_MAX_SEGS / 2 + 1]; struct tx_desc *d = &q->desc[pidx]; struct txq_state txqs; - - if (immediate(m) && nsegs == 0) { - write_imm(d, m, m->m_len, gen); + struct sglist_seg *segs; + struct ofld_hdr *oh = mtod(m, struct ofld_hdr *); + struct sglist *sgl; + + from = (void *)(oh + 1); /* Start of WR within mbuf */ + wrlen = m->m_len - sizeof(*oh); + + if (!(oh->flags & F_HDR_SGL)) { + write_imm(d, (caddr_t)from, wrlen, gen); + + /* + * mbuf with "real" immediate tx data will be enqueue_wr'd by + * t3_push_frames and freed in wr_ack. Others, like those sent + * down by close_conn, t3_send_reset, etc. should be freed here. + */ + if (!(oh->flags & F_HDR_DF)) + m_free(m); return; } - /* Only TX_DATA builds SGLs */ - from = mtod(m, struct work_request_hdr *); - memcpy(&d->flit[1], &from[1], m->m_len - sizeof(*from)); + memcpy(&d->flit[1], &from[1], wrlen - sizeof(*from)); - flits = m->m_len / 8; - sgp = (ndesc == 1) ? (struct sg_ent *)&d->flit[flits] : sgl; + sgl = oh->sgl; + flits = wrlen / 8; + sgp = (ndesc == 1) ? (struct sg_ent *)&d->flit[flits] : t3sgl; + + nsegs = sgl->sg_nseg; + segs = sgl->sg_segs; + for (idx = 0, i = 0; i < nsegs; i++) { + KASSERT(segs[i].ss_len, ("%s: 0 len in sgl", __func__)); + if (i && idx == 0) + ++sgp; + sgp->len[idx] = htobe32(segs[i].ss_len); + sgp->addr[idx] = htobe64(segs[i].ss_paddr); + idx ^= 1; + } + if (idx) { + sgp->len[idx] = 0; + sgp->addr[idx] = 0; + } - make_sgl(sgp, segs, nsegs); sgl_flits = sgl_len(nsegs); - txqs.gen = gen; txqs.pidx = pidx; txqs.compl = 0; - write_wr_hdr_sgl(ndesc, d, &txqs, q, sgl, flits, sgl_flits, + write_wr_hdr_sgl(ndesc, d, &txqs, q, t3sgl, flits, sgl_flits, from->wrh_hi, from->wrh_lo); } -/** - * calc_tx_descs_ofld - calculate # of Tx descriptors for an offload packet - * @m: the packet - * - * Returns the number of Tx descriptors needed for the given offload - * packet. These packets are already fully constructed. - */ -static __inline unsigned int -calc_tx_descs_ofld(struct mbuf *m, unsigned int nsegs) -{ - unsigned int flits, cnt = 0; - int ndescs; - - if (m->m_len <= WR_LEN && nsegs == 0) - return (1); /* packet fits as immediate data */ - - /* - * This needs to be re-visited for TOE - */ - - cnt = nsegs; - - /* headers */ - flits = m->m_len / 8; - - ndescs = flits_to_desc(flits + sgl_len(cnt)); - - return (ndescs); -} - /** * ofld_xmit - send a packet through an offload queue * @adap: the adapter @@ -2326,28 +2270,19 @@ calc_tx_descs_ofld(struct mbuf *m, unsigned int nsegs) static int ofld_xmit(adapter_t *adap, struct sge_qset *qs, struct mbuf *m) { - int ret, nsegs; + int ret; unsigned int ndesc; unsigned int pidx, gen; struct sge_txq *q = &qs->txq[TXQ_OFLD]; - bus_dma_segment_t segs[TX_MAX_SEGS], *vsegs; - struct tx_sw_desc *stx; + struct ofld_hdr *oh = mtod(m, struct ofld_hdr *); - nsegs = m_get_sgllen(m); - vsegs = m_get_sgl(m); - ndesc = calc_tx_descs_ofld(m, nsegs); - busdma_map_sgl(vsegs, segs, nsegs); + ndesc = G_HDR_NDESC(oh->flags); - stx = &q->sdesc[q->pidx]; - TXQ_LOCK(qs); again: reclaim_completed_tx(qs, 16, TXQ_OFLD); ret = check_desc_avail(adap, q, m, ndesc, TXQ_OFLD); if (__predict_false(ret)) { if (ret == 1) { - printf("no ofld desc avail\n"); - - m_set_priority(m, ndesc); /* save for restart */ TXQ_UNLOCK(qs); return (EINTR); } @@ -2362,16 +2297,11 @@ again: reclaim_completed_tx(qs, 16, TXQ_OFLD); q->pidx -= q->size; q->gen ^= 1; } -#ifdef T3_TRACE - T3_TRACE5(adap->tb[q->cntxt_id & 7], - "ofld_xmit: ndesc %u, pidx %u, len %u, main %u, frags %u", - ndesc, pidx, skb->len, skb->len - skb->data_len, - skb_shinfo(skb)->nr_frags); -#endif + + write_ofld_wr(adap, m, q, pidx, gen, ndesc); + check_ring_tx_db(adap, q, 1); TXQ_UNLOCK(qs); - write_ofld_wr(adap, m, q, pidx, gen, ndesc, segs, nsegs); - check_ring_tx_db(adap, q, 1); return (0); } @@ -2388,16 +2318,15 @@ restart_offloadq(void *data, int npending) struct sge_qset *qs = data; struct sge_txq *q = &qs->txq[TXQ_OFLD]; adapter_t *adap = qs->port->adapter; - bus_dma_segment_t segs[TX_MAX_SEGS]; - struct tx_sw_desc *stx = &q->sdesc[q->pidx]; - int nsegs, cleaned; + int cleaned; TXQ_LOCK(qs); again: cleaned = reclaim_completed_tx(qs, 16, TXQ_OFLD); while ((m = mbufq_peek(&q->sendq)) != NULL) { unsigned int gen, pidx; - unsigned int ndesc = m_get_priority(m); + struct ofld_hdr *oh = mtod(m, struct ofld_hdr *); + unsigned int ndesc = G_HDR_NDESC(oh->flags); if (__predict_false(q->size - q->in_use < ndesc)) { setbit(&qs->txq_stopped, TXQ_OFLD); @@ -2418,9 +2347,8 @@ again: cleaned = reclaim_completed_tx(qs, 16, TXQ_OFLD); } (void)mbufq_dequeue(&q->sendq); - busdma_map_mbufs(&m, q, stx, segs, &nsegs); TXQ_UNLOCK(qs); - write_ofld_wr(adap, m, q, pidx, gen, ndesc, segs, nsegs); + write_ofld_wr(adap, m, q, pidx, gen, ndesc); TXQ_LOCK(qs); } #if USE_GTS @@ -2433,35 +2361,8 @@ again: cleaned = reclaim_completed_tx(qs, 16, TXQ_OFLD); F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id)); } -/** - * queue_set - return the queue set a packet should use - * @m: the packet - * - * Maps a packet to the SGE queue set it should use. The desired queue - * set is carried in bits 1-3 in the packet's priority. - */ -static __inline int -queue_set(const struct mbuf *m) -{ - return m_get_priority(m) >> 1; -} - -/** - * is_ctrl_pkt - return whether an offload packet is a control packet - * @m: the packet - * - * Determines whether an offload packet should use an OFLD or a CTRL - * Tx queue. This is indicated by bit 0 in the packet's priority. - */ -static __inline int -is_ctrl_pkt(const struct mbuf *m) -{ - return m_get_priority(m) & 1; -} - /** * t3_offload_tx - send an offload packet - * @tdev: the offload device to send to * @m: the packet * * Sends an offload packet. We use the packet priority to select the @@ -2469,77 +2370,35 @@ is_ctrl_pkt(const struct mbuf *m) * should be sent as regular or control, bits 1-3 select the queue set. */ int -t3_offload_tx(struct t3cdev *tdev, struct mbuf *m) +t3_offload_tx(struct adapter *sc, struct mbuf *m) { - adapter_t *adap = tdev2adap(tdev); - struct sge_qset *qs = &adap->sge.qs[queue_set(m)]; + struct ofld_hdr *oh = mtod(m, struct ofld_hdr *); + struct sge_qset *qs = &sc->sge.qs[G_HDR_QSET(oh->flags)]; - if (__predict_false(is_ctrl_pkt(m))) - return ctrl_xmit(adap, qs, m); - - return ofld_xmit(adap, qs, m); -} - -/** - * deliver_partial_bundle - deliver a (partial) bundle of Rx offload pkts - * @tdev: the offload device that will be receiving the packets - * @q: the SGE response queue that assembled the bundle - * @m: the partial bundle - * @n: the number of packets in the bundle - * - * Delivers a (partial) bundle of Rx offload packets to an offload device. - */ -static __inline void -deliver_partial_bundle(struct t3cdev *tdev, - struct sge_rspq *q, - struct mbuf *mbufs[], int n) -{ - if (n) { - q->offload_bundles++; - cxgb_ofld_recv(tdev, mbufs, n); - } -} - -static __inline int -rx_offload(struct t3cdev *tdev, struct sge_rspq *rq, - struct mbuf *m, struct mbuf *rx_gather[], - unsigned int gather_idx) -{ - - rq->offload_pkts++; - m->m_pkthdr.header = mtod(m, void *); - rx_gather[gather_idx++] = m; - if (gather_idx == RX_BUNDLE_SIZE) { - cxgb_ofld_recv(tdev, rx_gather, RX_BUNDLE_SIZE); - gather_idx = 0; - rq->offload_bundles++; - } - return (gather_idx); + if (oh->flags & F_HDR_CTRL) { + m_adj(m, sizeof (*oh)); /* trim ofld_hdr off */ + return (ctrl_xmit(sc, qs, m)); + } else + return (ofld_xmit(sc, qs, m)); } +#endif static void restart_tx(struct sge_qset *qs) { struct adapter *sc = qs->port->adapter; - - + if (isset(&qs->txq_stopped, TXQ_OFLD) && should_restart_tx(&qs->txq[TXQ_OFLD]) && test_and_clear_bit(TXQ_OFLD, &qs->txq_stopped)) { qs->txq[TXQ_OFLD].restarts++; - DPRINTF("restarting TXQ_OFLD\n"); taskqueue_enqueue(sc->tq, &qs->txq[TXQ_OFLD].qresume_task); } - DPRINTF("stopped=0x%x restart=%d processed=%d cleaned=%d in_use=%d\n", - qs->txq_stopped, should_restart_tx(&qs->txq[TXQ_CTRL]), - qs->txq[TXQ_CTRL].processed, qs->txq[TXQ_CTRL].cleaned, - qs->txq[TXQ_CTRL].in_use); - + if (isset(&qs->txq_stopped, TXQ_CTRL) && should_restart_tx(&qs->txq[TXQ_CTRL]) && test_and_clear_bit(TXQ_CTRL, &qs->txq_stopped)) { qs->txq[TXQ_CTRL].restarts++; - DPRINTF("restarting TXQ_CTRL\n"); taskqueue_enqueue(sc->tq, &qs->txq[TXQ_CTRL].qresume_task); } } @@ -2568,6 +2427,7 @@ t3_sge_alloc_qset(adapter_t *sc, u_int id, int nports, int irq_vec_idx, MTX_INIT(&q->lock, q->namebuf, NULL, MTX_DEF); q->port = pi; + q->adap = sc; if ((q->txq[TXQ_ETH].txq_mr = buf_ring_alloc(cxgb_txq_buf_ring_size, M_DEVBUF, M_WAITOK, &q->lock)) == NULL) { @@ -2629,8 +2489,10 @@ t3_sge_alloc_qset(adapter_t *sc, u_int id, int nports, int irq_vec_idx, q->txq[i].gen = 1; q->txq[i].size = p->txq_size[i]; } - + +#ifdef TCP_OFFLOAD TASK_INIT(&q->txq[TXQ_OFLD].qresume_task, 0, restart_offloadq, q); +#endif TASK_INIT(&q->txq[TXQ_CTRL].qresume_task, 0, restart_ctrlq, q); TASK_INIT(&q->txq[TXQ_ETH].qreclaim_task, 0, sge_txq_reclaim_handler, q); TASK_INIT(&q->txq[TXQ_OFLD].qreclaim_task, 0, sge_txq_reclaim_handler, q); @@ -2668,7 +2530,7 @@ t3_sge_alloc_qset(adapter_t *sc, u_int id, int nports, int irq_vec_idx, /* Allocate and setup the lro_ctrl structure */ q->lro.enabled = !!(pi->ifp->if_capenable & IFCAP_LRO); -#ifdef INET +#if defined(INET6) || defined(INET) ret = tcp_lro_init(&q->lro.ctrl); if (ret) { printf("error %d from tcp_lro_init\n", ret); @@ -2735,8 +2597,7 @@ t3_sge_alloc_qset(adapter_t *sc, u_int id, int nports, int irq_vec_idx, mtx_unlock_spin(&sc->sge.reg_lock); t3_update_qset_coalesce(q, p); - q->port = pi; - + refill_fl(sc, &q->fl[0], q->fl[0].size); refill_fl(sc, &q->fl[1], q->fl[1].size); refill_rspq(sc, &q->rspq, q->rspq.size - 1); @@ -2761,22 +2622,12 @@ err: * will also be taken into account here. */ void -t3_rx_eth(struct adapter *adap, struct sge_rspq *rq, struct mbuf *m, int ethpad) +t3_rx_eth(struct adapter *adap, struct mbuf *m, int ethpad) { struct cpl_rx_pkt *cpl = (struct cpl_rx_pkt *)(mtod(m, uint8_t *) + ethpad); struct port_info *pi = &adap->port[adap->rxpkt_map[cpl->iff]]; struct ifnet *ifp = pi->ifp; - DPRINTF("rx_eth m=%p m->m_data=%p p->iff=%d\n", m, mtod(m, uint8_t *), cpl->iff); - - if ((ifp->if_capenable & IFCAP_RXCSUM) && !cpl->fragment && - cpl->csum_valid && cpl->csum == 0xffff) { - m->m_pkthdr.csum_flags = (CSUM_IP_CHECKED|CSUM_IP_VALID); - rspq_to_qset(rq)->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++; - m->m_pkthdr.csum_flags = (CSUM_IP_CHECKED|CSUM_IP_VALID|CSUM_DATA_VALID|CSUM_PSEUDO_HDR); - m->m_pkthdr.csum_data = 0xffff; - } - if (cpl->vlan_valid) { m->m_pkthdr.ether_vtag = ntohs(cpl->vlan); m->m_flags |= M_VLANTAG; @@ -2790,6 +2641,30 @@ t3_rx_eth(struct adapter *adap, struct sge_rspq *rq, struct mbuf *m, int ethpad) m->m_pkthdr.len -= (sizeof(*cpl) + ethpad); m->m_len -= (sizeof(*cpl) + ethpad); m->m_data += (sizeof(*cpl) + ethpad); + + if (!cpl->fragment && cpl->csum_valid && cpl->csum == 0xffff) { + struct ether_header *eh = mtod(m, void *); + uint16_t eh_type; + + if (eh->ether_type == htons(ETHERTYPE_VLAN)) { + struct ether_vlan_header *evh = mtod(m, void *); + + eh_type = evh->evl_proto; + } else + eh_type = eh->ether_type; + + if (ifp->if_capenable & IFCAP_RXCSUM && + eh_type == htons(ETHERTYPE_IP)) { + m->m_pkthdr.csum_flags = (CSUM_IP_CHECKED | + CSUM_IP_VALID | CSUM_DATA_VALID | CSUM_PSEUDO_HDR); + m->m_pkthdr.csum_data = 0xffff; + } else if (ifp->if_capenable & IFCAP_RXCSUM_IPV6 && + eh_type == htons(ETHERTYPE_IPV6)) { + m->m_pkthdr.csum_flags = (CSUM_DATA_VALID_IPV6 | + CSUM_PSEUDO_HDR); + m->m_pkthdr.csum_data = 0xffff; + } + } } /** @@ -2961,11 +2836,11 @@ process_responses(adapter_t *adap, struct sge_qset *qs, int budget) struct rsp_desc *r = &rspq->desc[rspq->cidx]; int budget_left = budget; unsigned int sleeping = 0; +#if defined(INET6) || defined(INET) int lro_enabled = qs->lro.enabled; int skip_lro; struct lro_ctrl *lro_ctrl = &qs->lro.ctrl; - struct mbuf *offload_mbufs[RX_BUNDLE_SIZE]; - int ngathered = 0; +#endif struct t3_mbuf_hdr *mh = &rspq->rspq_mh; #ifdef DEBUG static int last_holdoff = 0; @@ -2979,10 +2854,10 @@ process_responses(adapter_t *adap, struct sge_qset *qs, int budget) while (__predict_true(budget_left && is_new_response(r, rspq))) { int eth, eop = 0, ethpad = 0; uint32_t flags = ntohl(r->flags); - uint32_t rss_csum = *(const uint32_t *)r; uint32_t rss_hash = be32toh(r->rss_hdr.rss_hash_val); + uint8_t opcode = r->rss_hdr.opcode; - eth = (r->rss_hdr.opcode == CPL_RX_PKT); + eth = (opcode == CPL_RX_PKT); if (__predict_false(flags & F_RSPD_ASYNC_NOTIF)) { struct mbuf *m; @@ -3002,27 +2877,27 @@ process_responses(adapter_t *adap, struct sge_qset *qs, int budget) memcpy(mtod(m, char *), r, AN_PKT_SIZE); m->m_len = m->m_pkthdr.len = AN_PKT_SIZE; *mtod(m, char *) = CPL_ASYNC_NOTIF; - rss_csum = htonl(CPL_ASYNC_NOTIF << 24); + opcode = CPL_ASYNC_NOTIF; eop = 1; rspq->async_notif++; goto skip; } else if (flags & F_RSPD_IMM_DATA_VALID) { - struct mbuf *m = NULL; + struct mbuf *m = m_gethdr(M_DONTWAIT, MT_DATA); - DPRINTF("IMM DATA VALID opcode=0x%x rspq->cidx=%d\n", - r->rss_hdr.opcode, rspq->cidx); - if (mh->mh_head == NULL) - mh->mh_head = m_gethdr(M_DONTWAIT, MT_DATA); - else - m = m_gethdr(M_DONTWAIT, MT_DATA); - - if (mh->mh_head == NULL && m == NULL) { + if (m == NULL) { no_mem: rspq->next_holdoff = NOMEM_INTR_DELAY; budget_left--; break; } - get_imm_packet(adap, r, mh->mh_head); + if (mh->mh_head == NULL) + mh->mh_head = m; + else + mh->mh_tail->m_next = m; + mh->mh_tail = m; + + get_imm_packet(adap, r, m); + mh->mh_head->m_pkthdr.len += m->m_len; eop = 1; rspq->imm_data++; } else if (r->len_cq) { @@ -3045,34 +2920,18 @@ process_responses(adapter_t *adap, struct sge_qset *qs, int budget) handle_rsp_cntrl_info(qs, flags); } - r++; - if (__predict_false(++rspq->cidx == rspq->size)) { - rspq->cidx = 0; - rspq->gen ^= 1; - r = rspq->desc; - } - - if (++rspq->credits >= 64) { - refill_rspq(adap, rspq, rspq->credits); - rspq->credits = 0; - } if (!eth && eop) { - mh->mh_head->m_pkthdr.csum_data = rss_csum; - /* - * XXX size mismatch - */ - m_set_priority(mh->mh_head, rss_hash); - - - ngathered = rx_offload(&adap->tdev, rspq, - mh->mh_head, offload_mbufs, ngathered); + rspq->offload_pkts++; +#ifdef TCP_OFFLOAD + adap->cpl_handler[opcode](qs, r, mh->mh_head); +#else + m_freem(mh->mh_head); +#endif mh->mh_head = NULL; - DPRINTF("received offload packet\n"); - } else if (eth && eop) { struct mbuf *m = mh->mh_head; - t3_rx_eth(adap, rspq, m, ethpad); + t3_rx_eth(adap, m, ethpad); /* * The T304 sends incoming packets on any qset. If LRO @@ -3082,15 +2941,16 @@ process_responses(adapter_t *adap, struct sge_qset *qs, int budget) * The mbuf's rcvif was derived from the cpl header and * is accurate. Skip LRO and just use that. */ +#if defined(INET6) || defined(INET) skip_lro = __predict_false(qs->port->ifp != m->m_pkthdr.rcvif); if (lro_enabled && lro_ctrl->lro_cnt && !skip_lro -#ifdef INET && (tcp_lro_rx(lro_ctrl, m, 0) == 0) -#endif ) { /* successfully queue'd for LRO */ - } else { + } else +#endif + { /* * LRO not enabled, packet unsuitable for LRO, * or unable to queue. Pass it up right now in @@ -3102,14 +2962,24 @@ process_responses(adapter_t *adap, struct sge_qset *qs, int budget) mh->mh_head = NULL; } + + r++; + if (__predict_false(++rspq->cidx == rspq->size)) { + rspq->cidx = 0; + rspq->gen ^= 1; + r = rspq->desc; + } + + if (++rspq->credits >= 64) { + refill_rspq(adap, rspq, rspq->credits); + rspq->credits = 0; + } __refill_fl_lt(adap, &qs->fl[0], 32); __refill_fl_lt(adap, &qs->fl[1], 32); --budget_left; } - deliver_partial_bundle(&adap->tdev, rspq, offload_mbufs, ngathered); - -#ifdef INET +#if defined(INET6) || defined(INET) /* Flush LRO */ while (!SLIST_EMPTY(&lro_ctrl->lro_active)) { struct lro_entry *queued = SLIST_FIRST(&lro_ctrl->lro_active); diff --git a/sys/dev/cxgb/sys/mvec.h b/sys/dev/cxgb/sys/mvec.h index 9db27ddf75d..dff6f03ba59 100644 --- a/sys/dev/cxgb/sys/mvec.h +++ b/sys/dev/cxgb/sys/mvec.h @@ -31,15 +31,6 @@ #define _MVEC_H_ #include -#define M_DDP 0x200000 /* direct data placement mbuf */ -#define EXT_PHYS 10 /* physical/bus address */ - -#define m_cur_offset m_ext.ext_size /* override to provide ddp offset */ -#define m_seq m_pkthdr.csum_data /* stored sequence */ -#define m_ddp_gl m_ext.ext_buf /* ddp list */ -#define m_ddp_flags m_pkthdr.csum_flags /* ddp flags */ -#define m_ulp_mode m_pkthdr.tso_segsz /* upper level protocol */ - static __inline void busdma_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map, struct mbuf *m, bus_dma_segment_t *seg) @@ -58,17 +49,6 @@ int busdma_map_sg_collapse(bus_dma_tag_t tag, bus_dmamap_t map, struct mbuf **m, bus_dma_segment_t *segs, int *nsegs); void busdma_map_sg_vec(bus_dma_tag_t tag, bus_dmamap_t map, struct mbuf *m, bus_dma_segment_t *segs, int *nsegs); -static __inline int -busdma_map_sgl(bus_dma_segment_t *vsegs, bus_dma_segment_t *segs, int count) -{ - while (count--) { - segs->ds_addr = pmap_kextract((vm_offset_t)vsegs->ds_addr); - segs->ds_len = vsegs->ds_len; - segs++; - vsegs++; - } - return (0); -} static __inline void m_freem_list(struct mbuf *m) @@ -84,5 +64,4 @@ m_freem_list(struct mbuf *m) } } - #endif /* _MVEC_H_ */ diff --git a/sys/dev/cxgb/t3cdev.h b/sys/dev/cxgb/t3cdev.h deleted file mode 100644 index e0004b79562..00000000000 --- a/sys/dev/cxgb/t3cdev.h +++ /dev/null @@ -1,62 +0,0 @@ -/*- - * Copyright (c) 2007-2008, Chelsio Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Neither the name of the Chelsio Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ -#ifndef _T3CDEV_H_ -#define _T3CDEV_H_ - -#define T3CNAMSIZ 16 - -/* Get the t3cdev associated with an ifnet */ -#define T3CDEV(ifp) (&(((struct port_info *)(ifp)->if_softc))->adapter->tdev) - -struct cxgb3_client; - -enum t3ctype { - T3A = 0, - T3B, - T3C -}; - -struct t3cdev { - char name[T3CNAMSIZ]; /* T3C device name */ - enum t3ctype type; - TAILQ_ENTRY(t3cdev) entry; /* for list linking */ - struct ifnet *lldev; /* LL dev associated with T3C messages */ - struct adapter *adapter; - int (*send)(struct t3cdev *dev, struct mbuf *m); - int (*recv)(struct t3cdev *dev, struct mbuf **m, int n); - int (*ctl)(struct t3cdev *dev, unsigned int req, void *data); - void (*arp_update)(struct t3cdev *dev, struct rtentry *neigh, uint8_t *enaddr, struct sockaddr *sa); - void *priv; /* driver private data */ - void *l2opt; /* optional layer 2 data */ - void *l3opt; /* optional layer 3 data */ - void *l4opt; /* optional layer 4 data */ - void *ulp; /* ulp stuff */ -}; - -#endif /* _T3CDEV_H_ */ diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c index a4f2ff669ca..c8652a0c97d 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c @@ -29,11 +29,12 @@ POSSIBILITY OF SUCH DAMAGE. #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + #include #include #include #include -#include #include #include #include @@ -54,20 +55,14 @@ __FBSDID("$FreeBSD$"); #include #include -#if __FreeBSD_version < 800044 -#define V_ifnet ifnet -#endif - -#include -#include -#if __FreeBSD_version >= 800056 -#include -#endif - #include +#include -#include +#include +#include +#include +#ifdef TCP_OFFLOAD #include #include #include @@ -75,26 +70,21 @@ __FBSDID("$FreeBSD$"); #include #include -/* - * XXX :-/ - * - */ +static int iwch_mod_load(void); +static int iwch_mod_unload(void); +static int iwch_activate(struct adapter *); +static int iwch_deactivate(struct adapter *); -#define idr_init(x) - -cxgb_cpl_handler_func t3c_handlers[NUM_CPL_CMDS]; - -static void open_rnic_dev(struct t3cdev *); -static void close_rnic_dev(struct t3cdev *); - -static TAILQ_HEAD( ,iwch_dev) dev_list; -static struct mtx dev_mutex; -static eventhandler_tag event_tag; +static struct uld_info iwch_uld_info = { + .uld_id = ULD_IWARP, + .activate = iwch_activate, + .deactivate = iwch_deactivate, +}; static void rnic_init(struct iwch_dev *rnicp) { - CTR2(KTR_IW_CXGB, "%s iwch_dev %p", __FUNCTION__, rnicp); + idr_init(&rnicp->cqidr); idr_init(&rnicp->qpidr); idr_init(&rnicp->mmidr); @@ -103,15 +93,16 @@ rnic_init(struct iwch_dev *rnicp) rnicp->attr.vendor_id = 0x168; rnicp->attr.vendor_part_id = 7; rnicp->attr.max_qps = T3_MAX_NUM_QP - 32; - rnicp->attr.max_wrs = (1UL << 24) - 1; + rnicp->attr.max_wrs = T3_MAX_QP_DEPTH; rnicp->attr.max_sge_per_wr = T3_MAX_SGE; rnicp->attr.max_sge_per_rdma_write_wr = T3_MAX_SGE; rnicp->attr.max_cqs = T3_MAX_NUM_CQ - 1; - rnicp->attr.max_cqes_per_cq = (1UL << 24) - 1; + rnicp->attr.max_cqes_per_cq = T3_MAX_CQ_DEPTH; rnicp->attr.max_mem_regs = cxio_num_stags(&rnicp->rdev); rnicp->attr.max_phys_buf_entries = T3_MAX_PBL_SIZE; rnicp->attr.max_pds = T3_MAX_NUM_PD - 1; - rnicp->attr.mem_pgsizes_bitmask = 0x7FFF; /* 4KB-128MB */ + rnicp->attr.mem_pgsizes_bitmask = T3_PAGESIZE_MASK; + rnicp->attr.max_mr_size = T3_MAX_MR_SIZE; rnicp->attr.can_resize_wq = 0; rnicp->attr.max_rdma_reads_per_qp = 8; rnicp->attr.max_rdma_read_resources = @@ -127,170 +118,183 @@ rnic_init(struct iwch_dev *rnicp) rnicp->attr.zbva_support = 1; rnicp->attr.local_invalidate_fence = 1; rnicp->attr.cq_overflow_detection = 1; + return; } static void -open_rnic_dev(struct t3cdev *tdev) +rnic_uninit(struct iwch_dev *rnicp) +{ + idr_destroy(&rnicp->cqidr); + idr_destroy(&rnicp->qpidr); + idr_destroy(&rnicp->mmidr); + mtx_destroy(&rnicp->lock); +} + +static int +iwch_activate(struct adapter *sc) { struct iwch_dev *rnicp; - static int vers_printed; + int rc; + + KASSERT(!isset(&sc->offload_map, MAX_NPORTS), + ("%s: iWARP already activated on %s", __func__, + device_get_nameunit(sc->dev))); - CTR2(KTR_IW_CXGB, "%s t3cdev %p", __FUNCTION__, tdev); - if (!vers_printed++) - printf("Chelsio T3 RDMA Driver - version x.xx\n"); rnicp = (struct iwch_dev *)ib_alloc_device(sizeof(*rnicp)); - if (!rnicp) { - printf("Cannot allocate ib device\n"); - return; - } - rnicp->rdev.ulp = rnicp; - rnicp->rdev.t3cdev_p = tdev; + if (rnicp == NULL) + return (ENOMEM); - mtx_lock(&dev_mutex); + sc->iwarp_softc = rnicp; + rnicp->rdev.adap = sc; - if (cxio_rdev_open(&rnicp->rdev)) { - mtx_unlock(&dev_mutex); + cxio_hal_init(sc); + iwch_cm_init_cpl(sc); + + rc = cxio_rdev_open(&rnicp->rdev); + if (rc != 0) { printf("Unable to open CXIO rdev\n"); - ib_dealloc_device(&rnicp->ibdev); - return; + goto err1; } rnic_init(rnicp); - TAILQ_INSERT_TAIL(&dev_list, rnicp, entry); - mtx_unlock(&dev_mutex); - - if (iwch_register_device(rnicp)) { + rc = iwch_register_device(rnicp); + if (rc != 0) { printf("Unable to register device\n"); - close_rnic_dev(tdev); + goto err2; } -#ifdef notyet - printf("Initialized device %s\n", - pci_name(rnicp->rdev.rnic_info.pdev)); -#endif - return; + + return (0); + +err2: + rnic_uninit(rnicp); + cxio_rdev_close(&rnicp->rdev); +err1: + cxio_hal_uninit(sc); + iwch_cm_term_cpl(sc); + sc->iwarp_softc = NULL; + + return (rc); } -static void -close_rnic_dev(struct t3cdev *tdev) -{ - struct iwch_dev *dev, *tmp; - CTR2(KTR_IW_CXGB, "%s t3cdev %p", __FUNCTION__, tdev); - mtx_lock(&dev_mutex); - - TAILQ_FOREACH_SAFE(dev, &dev_list, entry, tmp) { - if (dev->rdev.t3cdev_p == tdev) { -#ifdef notyet - list_del(&dev->entry); - iwch_unregister_device(dev); - cxio_rdev_close(&dev->rdev); - idr_destroy(&dev->cqidr); - idr_destroy(&dev->qpidr); - idr_destroy(&dev->mmidr); - ib_dealloc_device(&dev->ibdev); -#endif - break; - } - } - mtx_unlock(&dev_mutex); -} - -static ifaddr_event_handler_t -ifaddr_event_handler(void *arg, struct ifnet *ifp) -{ - printf("%s if name %s \n", __FUNCTION__, ifp->if_xname); - if (ifp->if_capabilities & IFCAP_TOE4) { - KASSERT(T3CDEV(ifp) != NULL, ("null t3cdev ptr!")); - if (cxio_hal_find_rdev_by_t3cdev(T3CDEV(ifp)) == NULL) - open_rnic_dev(T3CDEV(ifp)); - } - return 0; -} - - static int -iwch_init_module(void) +iwch_deactivate(struct adapter *sc) { - VNET_ITERATOR_DECL(vnet_iter); - int err; - struct ifnet *ifp; + struct iwch_dev *rnicp; - printf("%s enter\n", __FUNCTION__); - TAILQ_INIT(&dev_list); - mtx_init(&dev_mutex, "iwch dev_list lock", NULL, MTX_DEF); - - err = cxio_hal_init(); - if (err) - return err; - err = iwch_cm_init(); - if (err) - return err; - cxio_register_ev_cb(iwch_ev_dispatch); + rnicp = sc->iwarp_softc; - /* Register for ifaddr events to dynamically add TOE devs */ - event_tag = EVENTHANDLER_REGISTER(ifaddr_event, ifaddr_event_handler, - NULL, EVENTHANDLER_PRI_ANY); + iwch_unregister_device(rnicp); + rnic_uninit(rnicp); + cxio_rdev_close(&rnicp->rdev); + cxio_hal_uninit(sc); + iwch_cm_term_cpl(sc); + ib_dealloc_device(&rnicp->ibdev); - /* Register existing TOE interfaces by walking the ifnet chain */ - IFNET_RLOCK(); - VNET_LIST_RLOCK(); - VNET_FOREACH(vnet_iter) { - CURVNET_SET(vnet_iter); /* XXX CURVNET_SET_QUIET() ? */ - TAILQ_FOREACH(ifp, &V_ifnet, if_link) - (void)ifaddr_event_handler(NULL, ifp); - CURVNET_RESTORE(); - } - VNET_LIST_RUNLOCK(); - IFNET_RUNLOCK(); - return 0; + sc->iwarp_softc = NULL; + + return (0); } static void -iwch_exit_module(void) +iwch_activate_all(struct adapter *sc, void *arg __unused) { - EVENTHANDLER_DEREGISTER(ifaddr_event, event_tag); - cxio_unregister_ev_cb(iwch_ev_dispatch); + ADAPTER_LOCK(sc); + if ((sc->open_device_map & sc->offload_map) != 0 && + t3_activate_uld(sc, ULD_IWARP) == 0) + setbit(&sc->offload_map, MAX_NPORTS); + ADAPTER_UNLOCK(sc); +} + +static void +iwch_deactivate_all(struct adapter *sc, void *arg __unused) +{ + ADAPTER_LOCK(sc); + if (isset(&sc->offload_map, MAX_NPORTS) && + t3_deactivate_uld(sc, ULD_IWARP) == 0) + clrbit(&sc->offload_map, MAX_NPORTS); + ADAPTER_UNLOCK(sc); +} + +static int +iwch_mod_load(void) +{ + int rc; + + rc = iwch_cm_init(); + if (rc != 0) + return (rc); + + rc = t3_register_uld(&iwch_uld_info); + if (rc != 0) { + iwch_cm_term(); + return (rc); + } + + t3_iterate(iwch_activate_all, NULL); + + return (rc); +} + +static int +iwch_mod_unload(void) +{ + t3_iterate(iwch_deactivate_all, NULL); + iwch_cm_term(); - cxio_hal_exit(); -} -static int -iwch_load(module_t mod, int cmd, void *arg) + if (t3_unregister_uld(&iwch_uld_info) == EBUSY) + return (EBUSY); + + return (0); +} +#endif /* TCP_OFFLOAD */ + +#undef MODULE_VERSION +#include + +static int +iwch_modevent(module_t mod, int cmd, void *arg) { - int err = 0; + int rc = 0; - switch (cmd) { - case MOD_LOAD: - printf("Loading iw_cxgb.\n"); +#ifdef TCP_OFFLOAD + switch (cmd) { + case MOD_LOAD: + rc = iwch_mod_load(); + if(rc) + printf("iw_cxgb: Chelsio T3 RDMA Driver failed to load\n"); + else + printf("iw_cxgb: Chelsio T3 RDMA Driver loaded\n"); + break; - iwch_init_module(); - break; - case MOD_QUIESCE: - break; - case MOD_UNLOAD: - printf("Unloading iw_cxgb.\n"); - iwch_exit_module(); - break; - case MOD_SHUTDOWN: - break; - default: - err = EOPNOTSUPP; - break; - } + case MOD_UNLOAD: + rc = iwch_mod_unload(); + if(rc) + printf("iw_cxgb: Chelsio T3 RDMA Driver failed to unload\n"); + else + printf("iw_cxgb: Chelsio T3 RDMA Driver unloaded\n"); + break; - return (err); + default: + rc = EINVAL; + } +#else + printf("iw_cxgb: compiled without TCP_OFFLOAD support.\n"); + rc = EOPNOTSUPP; +#endif + return (rc); } -static moduledata_t mod_data = { +static moduledata_t iwch_mod_data = { "iw_cxgb", - iwch_load, + iwch_modevent, 0 }; MODULE_VERSION(iw_cxgb, 1); -DECLARE_MODULE(iw_cxgb, mod_data, SI_SUB_EXEC, SI_ORDER_ANY); -MODULE_DEPEND(iw_cxgb, rdma_core, 1, 1, 1); -MODULE_DEPEND(iw_cxgb, if_cxgb, 1, 1, 1); +DECLARE_MODULE(iw_cxgb, iwch_mod_data, SI_SUB_EXEC, SI_ORDER_ANY); +MODULE_DEPEND(t3_tom, cxgbc, 1, 1, 1); +MODULE_DEPEND(iw_cxgb, toecore, 1, 1, 1); MODULE_DEPEND(iw_cxgb, t3_tom, 1, 1, 1); - diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.h b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.h index f4b28566ebf..9fd3e0cf92b 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.h +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.h @@ -37,6 +37,13 @@ struct iwch_cq; struct iwch_qp; struct iwch_mr; +enum t3ctype { + T3A = 0, + T3B, + T3C +}; + +#define PAGE_MASK_IWARP (~(PAGE_SIZE-1)) struct iwch_rnic_attributes { u32 vendor_id; @@ -57,6 +64,7 @@ struct iwch_rnic_attributes { * size (4k)^i. Phys block list mode unsupported. */ u32 mem_pgsizes_bitmask; + u64 max_mr_size; u8 can_resize_wq; /* @@ -97,9 +105,9 @@ struct iwch_dev { struct cxio_rdev rdev; u32 device_cap_flags; struct iwch_rnic_attributes attr; - struct kvl cqidr; - struct kvl qpidr; - struct kvl mmidr; + struct idr cqidr; + struct idr qpidr; + struct idr mmidr; struct mtx lock; TAILQ_ENTRY(iwch_dev) entry; }; @@ -113,40 +121,43 @@ static inline struct iwch_dev *to_iwch_dev(struct ib_device *ibdev) return container_of(ibdev, struct iwch_dev, ibdev); } -static inline int t3b_device(const struct iwch_dev *rhp) +static inline int t3b_device(const struct iwch_dev *rhp __unused) { - return rhp->rdev.t3cdev_p->type == T3B; + return (0); } -static inline int t3a_device(const struct iwch_dev *rhp) +static inline int t3a_device(const struct iwch_dev *rhp __unused) { - return rhp->rdev.t3cdev_p->type == T3A; + return (0); } static inline struct iwch_cq *get_chp(struct iwch_dev *rhp, u32 cqid) { - return kvl_lookup(&rhp->cqidr, cqid); + return idr_find(&rhp->cqidr, cqid); } static inline struct iwch_qp *get_qhp(struct iwch_dev *rhp, u32 qpid) { - return kvl_lookup(&rhp->qpidr, qpid); + return idr_find(&rhp->qpidr, qpid); } static inline struct iwch_mr *get_mhp(struct iwch_dev *rhp, u32 mmid) { - return kvl_lookup(&rhp->mmidr, mmid); + return idr_find(&rhp->mmidr, mmid); } -static inline int insert_handle(struct iwch_dev *rhp, struct kvl *kvlp, +static inline int insert_handle(struct iwch_dev *rhp, struct idr *idr, void *handle, u32 id) { int ret; u32 newid; do { + if (!idr_pre_get(idr, GFP_KERNEL)) { + return -ENOMEM; + } mtx_lock(&rhp->lock); - ret = kvl_alloc_above(kvlp, handle, id, &newid); + ret = idr_get_new_above(idr, handle, id, &newid); WARN_ON(ret != 0); WARN_ON(!ret && newid != id); mtx_unlock(&rhp->lock); @@ -155,14 +166,12 @@ static inline int insert_handle(struct iwch_dev *rhp, struct kvl *kvlp, return ret; } -static inline void remove_handle(struct iwch_dev *rhp, struct kvl *kvlp, u32 id) +static inline void remove_handle(struct iwch_dev *rhp, struct idr *idr, u32 id) { mtx_lock(&rhp->lock); - kvl_delete(kvlp, id); + idr_remove(idr, id); mtx_unlock(&rhp->lock); } -extern struct cxgb_client t3c_client; -extern cxgb_cpl_handler_func t3c_handlers[NUM_CPL_CMDS]; -extern void iwch_ev_dispatch(struct cxio_rdev *rdev_p, struct mbuf *m); +void iwch_ev_dispatch(struct iwch_dev *, struct mbuf *); #endif diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c index d95e48d67a4..9afad627d5a 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c @@ -29,11 +29,13 @@ POSSIBILITY OF SUCH DAMAGE. #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD #include #include #include #include -#include #include #include #include @@ -66,13 +68,17 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include +#include +#include #include #include -#include -#include #include +#include +#include +#include + #include #include #include @@ -97,46 +103,46 @@ static char *states[] = { }; #endif -SYSCTL_NODE(_hw, OID_AUTO, cxgb, CTLFLAG_RD, 0, "iw_cxgb driver parameters"); +SYSCTL_NODE(_hw, OID_AUTO, iw_cxgb, CTLFLAG_RD, 0, "iw_cxgb driver parameters"); -static int ep_timeout_secs = 10; +static int ep_timeout_secs = 60; TUNABLE_INT("hw.iw_cxgb.ep_timeout_secs", &ep_timeout_secs); -SYSCTL_INT(_hw_cxgb, OID_AUTO, ep_timeout_secs, CTLFLAG_RDTUN, &ep_timeout_secs, 0, - "CM Endpoint operation timeout in seconds (default=10)"); +SYSCTL_INT(_hw_iw_cxgb, OID_AUTO, ep_timeout_secs, CTLFLAG_RW, &ep_timeout_secs, 0, + "CM Endpoint operation timeout in seconds (default=60)"); static int mpa_rev = 1; TUNABLE_INT("hw.iw_cxgb.mpa_rev", &mpa_rev); -SYSCTL_INT(_hw_cxgb, OID_AUTO, mpa_rev, CTLFLAG_RDTUN, &mpa_rev, 0, +SYSCTL_INT(_hw_iw_cxgb, OID_AUTO, mpa_rev, CTLFLAG_RW, &mpa_rev, 0, "MPA Revision, 0 supports amso1100, 1 is spec compliant. (default=1)"); static int markers_enabled = 0; TUNABLE_INT("hw.iw_cxgb.markers_enabled", &markers_enabled); -SYSCTL_INT(_hw_cxgb, OID_AUTO, markers_enabled, CTLFLAG_RDTUN, &markers_enabled, 0, +SYSCTL_INT(_hw_iw_cxgb, OID_AUTO, markers_enabled, CTLFLAG_RW, &markers_enabled, 0, "Enable MPA MARKERS (default(0)=disabled)"); static int crc_enabled = 1; TUNABLE_INT("hw.iw_cxgb.crc_enabled", &crc_enabled); -SYSCTL_INT(_hw_cxgb, OID_AUTO, crc_enabled, CTLFLAG_RDTUN, &crc_enabled, 0, +SYSCTL_INT(_hw_iw_cxgb, OID_AUTO, crc_enabled, CTLFLAG_RW, &crc_enabled, 0, "Enable MPA CRC (default(1)=enabled)"); static int rcv_win = 256 * 1024; TUNABLE_INT("hw.iw_cxgb.rcv_win", &rcv_win); -SYSCTL_INT(_hw_cxgb, OID_AUTO, rcv_win, CTLFLAG_RDTUN, &rcv_win, 0, +SYSCTL_INT(_hw_iw_cxgb, OID_AUTO, rcv_win, CTLFLAG_RW, &rcv_win, 0, "TCP receive window in bytes (default=256KB)"); static int snd_win = 32 * 1024; TUNABLE_INT("hw.iw_cxgb.snd_win", &snd_win); -SYSCTL_INT(_hw_cxgb, OID_AUTO, snd_win, CTLFLAG_RDTUN, &snd_win, 0, +SYSCTL_INT(_hw_iw_cxgb, OID_AUTO, snd_win, CTLFLAG_RW, &snd_win, 0, "TCP send window in bytes (default=32KB)"); static unsigned int nocong = 0; TUNABLE_INT("hw.iw_cxgb.nocong", &nocong); -SYSCTL_UINT(_hw_cxgb, OID_AUTO, nocong, CTLFLAG_RDTUN, &nocong, 0, +SYSCTL_UINT(_hw_iw_cxgb, OID_AUTO, nocong, CTLFLAG_RW, &nocong, 0, "Turn off congestion control (default=0)"); static unsigned int cong_flavor = 1; TUNABLE_INT("hw.iw_cxgb.cong_flavor", &cong_flavor); -SYSCTL_UINT(_hw_cxgb, OID_AUTO, cong_flavor, CTLFLAG_RDTUN, &cong_flavor, 0, +SYSCTL_UINT(_hw_iw_cxgb, OID_AUTO, cong_flavor, CTLFLAG_RW, &cong_flavor, 0, "TCP Congestion control flavor (default=1)"); static void ep_timeout(void *arg); @@ -174,42 +180,44 @@ static void stop_ep_timer(struct iwch_ep *ep) { CTR2(KTR_IW_CXGB, "%s ep %p", __FUNCTION__, ep); + if (!callout_pending(&ep->timer)) { + CTR3(KTR_IW_CXGB, "%s timer stopped when its not running! ep %p state %u\n", + __func__, ep, ep->com.state); + return; + } callout_drain(&ep->timer); put_ep(&ep->com); } -static int set_tcpinfo(struct iwch_ep *ep) +static int +set_tcpinfo(struct iwch_ep *ep) { - struct tcp_info ti; - struct sockopt sopt; - int err; + struct socket *so = ep->com.so; + struct inpcb *inp = sotoinpcb(so); + struct tcpcb *tp; + struct toepcb *toep; + int rc = 0; - sopt.sopt_dir = SOPT_GET; - sopt.sopt_level = IPPROTO_TCP; - sopt.sopt_name = TCP_INFO; - sopt.sopt_val = (caddr_t)&ti; - sopt.sopt_valsize = sizeof ti; - sopt.sopt_td = NULL; - - err = sogetopt(ep->com.so, &sopt); - if (err) { - printf("%s can't get tcpinfo\n", __FUNCTION__); - return -err; - } - if (!(ti.tcpi_options & TCPI_OPT_TOE)) { - printf("%s connection NOT OFFLOADED!\n", __FUNCTION__); - return -EINVAL; - } + INP_WLOCK(inp); + tp = intotcpcb(inp); - ep->snd_seq = ti.tcpi_snd_nxt; - ep->rcv_seq = ti.tcpi_rcv_nxt; - ep->emss = ti.tcpi_snd_mss - sizeof(struct tcpiphdr); - ep->hwtid = TOEPCB(ep->com.so)->tp_tid; /* XXX */ - if (ti.tcpi_options & TCPI_OPT_TIMESTAMPS) - ep->emss -= 12; + if ((tp->t_flags & TF_TOE) == 0) { + rc = EINVAL; + printf("%s: connection NOT OFFLOADED!\n", __func__); + goto done; + } + toep = tp->t_toe; + + ep->hwtid = toep->tp_tid; + ep->snd_seq = tp->snd_nxt; + ep->rcv_seq = tp->rcv_nxt; + ep->emss = tp->t_maxseg; if (ep->emss < 128) ep->emss = 128; - return 0; +done: + INP_WUNLOCK(inp); + return (rc); + } static enum iwch_ep_state @@ -264,56 +272,6 @@ void __free_ep(struct iwch_ep_common *epc) free(epc, M_DEVBUF); } -int -iwch_quiesce_tid(struct iwch_ep *ep) -{ -#ifdef notyet - struct cpl_set_tcb_field *req; - struct mbuf *m = get_mbuf(NULL, sizeof(*req), M_NOWAIT); - - if (m == NULL) - return (-ENOMEM); - req = (struct cpl_set_tcb_field *) mbuf_put(m, sizeof(*req)); - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, ep->hwtid)); - req->reply = 0; - req->cpu_idx = 0; - req->word = htons(W_TCB_RX_QUIESCE); - req->mask = cpu_to_be64(1ULL << S_TCB_RX_QUIESCE); - req->val = cpu_to_be64(1 << S_TCB_RX_QUIESCE); - - m_set_priority(m, CPL_PRIORITY_DATA); - cxgb_ofld_send(ep->com.tdev, m); -#endif - return 0; -} - -int -iwch_resume_tid(struct iwch_ep *ep) -{ -#ifdef notyet - struct cpl_set_tcb_field *req; - struct mbuf *m = get_mbuf(NULL, sizeof(*req), M_NOWAIT); - - if (m == NULL) - return (-ENOMEM); - req = (struct cpl_set_tcb_field *) mbuf_put(m, sizeof(*req)); - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, ep->hwtid)); - req->reply = 0; - req->cpu_idx = 0; - req->word = htons(W_TCB_RX_QUIESCE); - req->mask = cpu_to_be64(1ULL << S_TCB_RX_QUIESCE); - req->val = 0; - - m_set_priority(m, CPL_PRIORITY_DATA); - cxgb_ofld_send(ep->com.tdev, m); -#endif - return 0; -} - static struct rtentry * find_route(__be32 local_ip, __be32 peer_ip, __be16 local_port, __be16 peer_port, u8 tos) @@ -331,13 +289,16 @@ find_route(__be32 local_ip, __be32 peer_ip, __be16 local_port, } static void -close_socket(struct iwch_ep_common *epc) +close_socket(struct iwch_ep_common *epc, int close) { CTR4(KTR_IW_CXGB, "%s ep %p so %p state %s", __FUNCTION__, epc, epc->so, states[epc->state]); SOCK_LOCK(epc->so); soupcall_clear(epc->so, SO_RCV); SOCK_UNLOCK(epc->so); - soshutdown(epc->so, SHUT_WR|SHUT_RD); + if (close) + soclose(epc->so); + else + soshutdown(epc->so, SHUT_WR|SHUT_RD); epc->so = NULL; } @@ -500,7 +461,7 @@ abort_connection(struct iwch_ep *ep) CTR4(KTR_IW_CXGB, "%s ep %p so %p state %s", __FUNCTION__, ep, ep->com.so, states[ep->com.state]); state_set(&ep->com, ABORTING); abort_socket(ep); - close_socket(&ep->com); + close_socket(&ep->com, 0); close_complete_upcall(ep); state_set(&ep->com, DEAD); put_ep(&ep->com); @@ -582,12 +543,13 @@ connect_request_upcall(struct iwch_ep *ep) event.private_data = ep->mpa_pkt + sizeof(struct mpa_message); event.provider_data = ep; event.so = ep->com.so; - if (state_read(&ep->parent_ep->com) != DEAD) + if (state_read(&ep->parent_ep->com) != DEAD) { + get_ep(&ep->com); ep->parent_ep->com.cm_id->event_handler( ep->parent_ep->com.cm_id, &event); + } put_ep(&ep->parent_ep->com); - ep->parent_ep = NULL; } static void @@ -729,6 +691,7 @@ process_mpa_reply(struct iwch_ep *ep) */ CTR1(KTR_IW_CXGB, "%s mpa rpl looks good!", __FUNCTION__); state_set(&ep->com, FPDU_MODE); + ep->mpa_attr.initiator = 1; ep->mpa_attr.crc_enabled = (mpa->flags & MPA_CRC) | crc_enabled ? 1 : 0; ep->mpa_attr.recv_marker_enabled = markers_enabled; ep->mpa_attr.xmit_marker_enabled = mpa->flags & MPA_MARKERS ? 1 : 0; @@ -885,6 +848,7 @@ process_mpa_request(struct iwch_ep *ep) * If we get here we have accumulated the entire mpa * start reply message including private data. */ + ep->mpa_attr.initiator = 0; ep->mpa_attr.crc_enabled = (mpa->flags & MPA_CRC) | crc_enabled ? 1 : 0; ep->mpa_attr.recv_marker_enabled = markers_enabled; ep->mpa_attr.xmit_marker_enabled = mpa->flags & MPA_MARKERS ? 1 : 0; @@ -934,7 +898,6 @@ process_peer_close(struct iwch_ep *ep) * rejects the CR. */ __state_set(&ep->com, CLOSING); - get_ep(&ep->com); break; case MPA_REP_SENT: __state_set(&ep->com, CLOSING); @@ -961,7 +924,7 @@ process_peer_close(struct iwch_ep *ep) iwch_modify_qp(ep->com.qp->rhp, ep->com.qp, IWCH_QP_ATTR_NEXT_STATE, &attrs, 1); } - close_socket(&ep->com); + close_socket(&ep->com, 0); close_complete_upcall(ep); __state_set(&ep->com, DEAD); release = 1; @@ -986,11 +949,10 @@ process_conn_error(struct iwch_ep *ep) { struct iwch_qp_attributes attrs; int ret; - int state; - state = state_read(&ep->com); - CTR5(KTR_IW_CXGB, "%s ep %p so %p so->so_error %u state %s", __FUNCTION__, ep, ep->com.so, ep->com.so->so_error, states[ep->com.state]); - switch (state) { + mtx_lock(&ep->com.lock); + CTR3(KTR_IW_CXGB, "%s ep %p state %u", __func__, ep, ep->com.state); + switch (ep->com.state) { case MPA_REQ_WAIT: stop_ep_timer(ep); break; @@ -1009,7 +971,6 @@ process_conn_error(struct iwch_ep *ep) * the reference on it until the ULP accepts or * rejects the CR. */ - get_ep(&ep->com); break; case MORIBUND: case CLOSING: @@ -1031,6 +992,7 @@ process_conn_error(struct iwch_ep *ep) case ABORTING: break; case DEAD: + mtx_unlock(&ep->com.lock); CTR2(KTR_IW_CXGB, "%s so_error %d IN DEAD STATE!!!!", __FUNCTION__, ep->com.so->so_error); return; @@ -1039,11 +1001,12 @@ process_conn_error(struct iwch_ep *ep) break; } - if (state != ABORTING) { - close_socket(&ep->com); - state_set(&ep->com, DEAD); + if (ep->com.state != ABORTING) { + close_socket(&ep->com, 0); + __state_set(&ep->com, DEAD); put_ep(&ep->com); } + mtx_unlock(&ep->com.lock); return; } @@ -1071,7 +1034,10 @@ process_close_complete(struct iwch_ep *ep) IWCH_QP_ATTR_NEXT_STATE, &attrs, 1); } - close_socket(&ep->com); + if (ep->parent_ep) + close_socket(&ep->com, 1); + else + close_socket(&ep->com, 0); close_complete_upcall(ep); __state_set(&ep->com, DEAD); release = 1; @@ -1102,77 +1068,59 @@ process_close_complete(struct iwch_ep *ep) * terminate() handles case (1)... */ static int -terminate(struct t3cdev *tdev, struct mbuf *m, void *ctx) +terminate(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { - struct toepcb *toep = (struct toepcb *)ctx; - struct socket *so = toeptoso(toep); + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + uint32_t hash = *((uint32_t *)r + 1); + unsigned int tid = ntohl(hash) >> 8 & 0xfffff; + struct toepcb *toep = lookup_tid(&td->tid_maps, tid); + struct socket *so = toep->tp_inp->inp_socket; struct iwch_ep *ep = so->so_rcv.sb_upcallarg; - CTR2(KTR_IW_CXGB, "%s ep %p", __FUNCTION__, ep); + if (state_read(&ep->com) != FPDU_MODE) + goto done; + m_adj(m, sizeof(struct cpl_rdma_terminate)); - CTR2(KTR_IW_CXGB, "%s saving %d bytes of term msg", __FUNCTION__, m->m_len); + + CTR4(KTR_IW_CXGB, "%s: tid %u, ep %p, saved %d bytes", + __func__, tid, ep, m->m_len); + m_copydata(m, 0, m->m_len, ep->com.qp->attr.terminate_buffer); ep->com.qp->attr.terminate_msg_len = m->m_len; ep->com.qp->attr.is_terminate_local = 0; - return CPL_RET_BUF_DONE; + +done: + m_freem(m); + return (0); } static int -ec_status(struct t3cdev *tdev, struct mbuf *m, void *ctx) +ec_status(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { - struct toepcb *toep = (struct toepcb *)ctx; - struct socket *so = toeptoso(toep); - struct cpl_rdma_ec_status *rep = cplhdr(m); - struct iwch_ep *ep; - struct iwch_qp_attributes attrs; - int release = 0; + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct cpl_rdma_ec_status *rep = mtod(m, void *); + unsigned int tid = GET_TID(rep); + struct toepcb *toep = lookup_tid(&td->tid_maps, tid); + struct socket *so = toep->tp_inp->inp_socket; + struct iwch_ep *ep = so->so_rcv.sb_upcallarg; - ep = so->so_rcv.sb_upcallarg; - CTR5(KTR_IW_CXGB, "%s ep %p so %p state %s ec_status %d", __FUNCTION__, ep, ep->com.so, states[ep->com.state], rep->status); - if (!so || !ep) { - panic("bogosity ep %p state %d, so %p state %x\n", ep, ep ? ep->com.state : -1, so, so ? so->so_state : -1); - } - mtx_lock(&ep->com.lock); - switch (ep->com.state) { - case CLOSING: - if (!rep->status) - __state_set(&ep->com, MORIBUND); - else - __state_set(&ep->com, ABORTING); - break; - case MORIBUND: - stop_ep_timer(ep); - if (!rep->status) { - if ((ep->com.cm_id) && (ep->com.qp)) { - attrs.next_state = IWCH_QP_STATE_IDLE; - iwch_modify_qp(ep->com.qp->rhp, - ep->com.qp, - IWCH_QP_ATTR_NEXT_STATE, - &attrs, 1); - } - close_socket(&ep->com); - close_complete_upcall(ep); - __state_set(&ep->com, DEAD); - release = 1; - } - break; - case DEAD: - break; - default: - panic("unknown state: %d\n", ep->com.state); - } - mtx_unlock(&ep->com.lock); if (rep->status) { - log(LOG_ERR, "%s BAD CLOSE - Aborting tid %u\n", - __FUNCTION__, ep->hwtid); + struct iwch_qp_attributes attrs; + + CTR1(KTR_IW_CXGB, "%s BAD CLOSE - Aborting", __FUNCTION__); + stop_ep_timer(ep); attrs.next_state = IWCH_QP_STATE_ERROR; iwch_modify_qp(ep->com.qp->rhp, - ep->com.qp, IWCH_QP_ATTR_NEXT_STATE, - &attrs, 1); + ep->com.qp, + IWCH_QP_ATTR_NEXT_STATE, + &attrs, 1); + abort_connection(ep); } - if (release) - put_ep(&ep->com); - return CPL_RET_BUF_DONE; + + m_freem(m); + return (0); } static void @@ -1181,24 +1129,29 @@ ep_timeout(void *arg) struct iwch_ep *ep = (struct iwch_ep *)arg; struct iwch_qp_attributes attrs; int err = 0; + int abort = 1; mtx_lock(&ep->com.lock); CTR4(KTR_IW_CXGB, "%s ep %p so %p state %s", __FUNCTION__, ep, ep->com.so, states[ep->com.state]); switch (ep->com.state) { case MPA_REQ_SENT: + __state_set(&ep->com, ABORTING); connect_reply_upcall(ep, -ETIMEDOUT); break; case MPA_REQ_WAIT: + __state_set(&ep->com, ABORTING); break; case CLOSING: case MORIBUND: if (ep->com.cm_id && ep->com.qp) err = 1; + __state_set(&ep->com, ABORTING); break; default: - panic("unknown state: %d\n", ep->com.state); + CTR3(KTR_IW_CXGB, "%s unexpected state ep %p state %u\n", + __func__, ep, ep->com.state); + abort = 0; } - __state_set(&ep->com, ABORTING); mtx_unlock(&ep->com.lock); if (err){ attrs.next_state = IWCH_QP_STATE_ERROR; @@ -1206,7 +1159,8 @@ ep_timeout(void *arg) ep->com.qp, IWCH_QP_ATTR_NEXT_STATE, &attrs, 1); } - abort_connection(ep); + if (abort) + abort_connection(ep); put_ep(&ep->com); } @@ -1228,6 +1182,7 @@ iwch_reject_cr(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len) err = send_mpa_reject(ep, pdata, pdata_len); err = soshutdown(ep->com.so, 3); } + put_ep(&ep->com); return 0; } @@ -1242,8 +1197,10 @@ iwch_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) struct iwch_qp *qp = get_qhp(h, conn_param->qpn); CTR4(KTR_IW_CXGB, "%s ep %p so %p state %s", __FUNCTION__, ep, ep->com.so, states[ep->com.state]); - if (state_read(&ep->com) == DEAD) - return (-ECONNRESET); + if (state_read(&ep->com) == DEAD) { + err = -ECONNRESET; + goto err; + } PANIC_IF(state_read(&ep->com) != MPA_REQ_RCVD); PANIC_IF(!qp); @@ -1251,7 +1208,8 @@ iwch_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) if ((conn_param->ord > qp->rhp->attr.max_rdma_read_qp_depth) || (conn_param->ird > qp->rhp->attr.max_rdma_reads_per_qp)) { abort_connection(ep); - return (-EINVAL); + err = -EINVAL; + goto err; } cm_id->add_ref(cm_id); @@ -1263,11 +1221,10 @@ iwch_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ep->ird = conn_param->ird; ep->ord = conn_param->ord; CTR3(KTR_IW_CXGB, "%s ird %d ord %d", __FUNCTION__, ep->ird, ep->ord); - get_ep(&ep->com); /* bind QP to EP and move to RTS */ attrs.mpa_attr = ep->mpa_attr; - attrs.max_ird = ep->ord; + attrs.max_ird = ep->ird; attrs.max_ord = ep->ord; attrs.llp_stream_handle = ep; attrs.next_state = IWCH_QP_STATE_RTS; @@ -1283,20 +1240,21 @@ iwch_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ep->com.qp, mask, &attrs, 1); if (err) - goto err; + goto err1; err = send_mpa_reply(ep, conn_param->private_data, conn_param->private_data_len); if (err) - goto err; + goto err1; state_set(&ep->com, FPDU_MODE); established_upcall(ep); put_ep(&ep->com); return 0; -err: +err1: ep->com.cm_id = NULL; ep->com.qp = NULL; cm_id->rem_ref(cm_id); +err: put_ep(&ep->com); return err; } @@ -1312,15 +1270,6 @@ static int init_sock(struct iwch_ep_common *epc) epc->so->so_state |= SS_NBIO; SOCK_UNLOCK(epc->so); sopt.sopt_dir = SOPT_SET; - sopt.sopt_level = SOL_SOCKET; - sopt.sopt_name = SO_NO_DDP; - sopt.sopt_val = (caddr_t)&on; - sopt.sopt_valsize = sizeof on; - sopt.sopt_td = NULL; - err = sosetopt(epc->so, &sopt); - if (err) - printf("%s can't set SO_NO_DDP err %d\n", __FUNCTION__, err); - sopt.sopt_dir = SOPT_SET; sopt.sopt_level = IPPROTO_TCP; sopt.sopt_name = TCP_NODELAY; sopt.sopt_val = (caddr_t)&on; @@ -1400,16 +1349,14 @@ iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) if (!(rt->rt_ifp->if_flags & IFCAP_TOE)) { printf("%s - interface not TOE capable.\n", __FUNCTION__); - goto fail3; + RTFREE(rt); + goto fail2; } tdev = TOEDEV(rt->rt_ifp); if (tdev == NULL) { printf("%s - No toedev for interface.\n", __FUNCTION__); - goto fail3; - } - if (!tdev->tod_can_offload(tdev, ep->com.so)) { - printf("%s - interface cannot offload!.\n", __FUNCTION__); - goto fail3; + RTFREE(rt); + goto fail2; } RTFREE(rt); @@ -1420,8 +1367,6 @@ iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ep->com.thread); if (!err) goto out; -fail3: - RTFREE(ep->dst); fail2: put_ep(&ep->com); out: @@ -1458,7 +1403,7 @@ iwch_create_listen(struct iw_cm_id *cm_id, int backlog) cm_id->provider_data = ep; goto out; } - close_socket(&ep->com); + close_socket(&ep->com, 0); fail: cm_id->rem_ref(cm_id); put_ep(&ep->com); @@ -1474,7 +1419,7 @@ iwch_destroy_listen(struct iw_cm_id *cm_id) CTR2(KTR_IW_CXGB, "%s ep %p", __FUNCTION__, ep); state_set(&ep->com, DEAD); - close_socket(&ep->com); + close_socket(&ep->com, 0); cm_id->rem_ref(cm_id); put_ep(&ep->com); return 0; @@ -1493,47 +1438,48 @@ iwch_ep_disconnect(struct iwch_ep *ep, int abrupt, int flags) CTR5(KTR_IW_CXGB, "%s ep %p so %p state %s, abrupt %d", __FUNCTION__, ep, ep->com.so, states[ep->com.state], abrupt); - if (ep->com.state == DEAD) { - CTR2(KTR_IW_CXGB, "%s already dead ep %p", __FUNCTION__, ep); - goto out; - } - - if (abrupt) { - if (ep->com.state != ABORTING) { - ep->com.state = ABORTING; - close = 1; - } - goto out; - } - switch (ep->com.state) { case MPA_REQ_WAIT: case MPA_REQ_SENT: case MPA_REQ_RCVD: case MPA_REP_SENT: case FPDU_MODE: - start_ep_timer(ep); - ep->com.state = CLOSING; close = 1; + if (abrupt) + ep->com.state = ABORTING; + else { + ep->com.state = CLOSING; + start_ep_timer(ep); + } break; case CLOSING: - ep->com.state = MORIBUND; close = 1; + if (abrupt) { + stop_ep_timer(ep); + ep->com.state = ABORTING; + } else + ep->com.state = MORIBUND; break; case MORIBUND: case ABORTING: + case DEAD: + CTR3(KTR_IW_CXGB, "%s ignoring disconnect ep %p state %u\n", + __func__, ep, ep->com.state); break; default: panic("unknown state: %d\n", ep->com.state); break; } -out: + mtx_unlock(&ep->com.lock); if (close) { if (abrupt) abort_connection(ep); - else + else { + if (!ep->parent_ep) + __state_set(&ep->com, MORIBUND); shutdown_socket(&ep->com); + } } return 0; } @@ -1587,7 +1533,7 @@ process_connected(struct iwch_ep *ep) send_mpa_req(ep); } else { connect_reply_upcall(ep, -ep->com.so->so_error); - close_socket(&ep->com); + close_socket(&ep->com, 0); state_set(&ep->com, DEAD); put_ep(&ep->com); } @@ -1643,10 +1589,20 @@ process_newconn(struct iwch_ep *parent_ep) } CTR3(KTR_IW_CXGB, "%s remote addr %s port %d", __FUNCTION__, inet_ntoa(remote->sin_addr), ntohs(remote->sin_port)); + child_ep->com.tdev = parent_ep->com.tdev; + child_ep->com.local_addr.sin_family = parent_ep->com.local_addr.sin_family; + child_ep->com.local_addr.sin_port = parent_ep->com.local_addr.sin_port; + child_ep->com.local_addr.sin_addr.s_addr = parent_ep->com.local_addr.sin_addr.s_addr; + child_ep->com.local_addr.sin_len = parent_ep->com.local_addr.sin_len; + child_ep->com.remote_addr.sin_family = remote->sin_family; + child_ep->com.remote_addr.sin_port = remote->sin_port; + child_ep->com.remote_addr.sin_addr.s_addr = remote->sin_addr.s_addr; + child_ep->com.remote_addr.sin_len = remote->sin_len; child_ep->com.so = child_so; child_ep->com.cm_id = NULL; child_ep->com.thread = parent_ep->com.thread; child_ep->parent_ep = parent_ep; + free(remote, M_SONAME); get_ep(&parent_ep->com); child_ep->parent_ep = parent_ep; @@ -1747,17 +1703,30 @@ iwch_cm_init(void) } taskqueue_start_threads(&iw_cxgb_taskq, 1, PI_NET, "iw_cxgb taskq"); TASK_INIT(&iw_cxgb_task, 0, process_req, NULL); - t3tom_register_cpl_handler(CPL_RDMA_TERMINATE, terminate); - t3tom_register_cpl_handler(CPL_RDMA_EC_STATUS, ec_status); - return 0; + return (0); } void iwch_cm_term(void) { - t3tom_register_cpl_handler(CPL_RDMA_TERMINATE, NULL); - t3tom_register_cpl_handler(CPL_RDMA_EC_STATUS, NULL); + taskqueue_drain(iw_cxgb_taskq, &iw_cxgb_task); taskqueue_free(iw_cxgb_taskq); } +void +iwch_cm_init_cpl(struct adapter *sc) +{ + + t3_register_cpl_handler(sc, CPL_RDMA_TERMINATE, terminate); + t3_register_cpl_handler(sc, CPL_RDMA_EC_STATUS, ec_status); +} + +void +iwch_cm_term_cpl(struct adapter *sc) +{ + + t3_register_cpl_handler(sc, CPL_RDMA_TERMINATE, NULL); + t3_register_cpl_handler(sc, CPL_RDMA_EC_STATUS, NULL); +} +#endif diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.h b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.h index 4250be33300..ef76729f452 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.h +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.h @@ -31,8 +31,8 @@ $FreeBSD$ #ifndef _IWCH_CM_H_ #define _IWCH_CM_H_ -#include -#include +#include +#include #include #include #include @@ -42,21 +42,21 @@ $FreeBSD$ #define MPA_KEY_REP "MPA ID Rep Frame" #define MPA_MAX_PRIVATE_DATA 256 -#define MPA_REV o0 /* XXX - amso1100 uses rev 0 ! */ +#define MPA_REV 0 /* XXX - amso1100 uses rev 0 ! */ #define MPA_REJECT 0x20 #define MPA_CRC 0x40 #define MPA_MARKERS 0x80 #define MPA_FLAGS_MASK 0xE0 #define put_ep(ep) { \ - CTR4(KTR_IW_CXGB, "put_ep (via %s:%u) ep %p refcnt %d\n", __FUNCTION__, __LINE__, \ + CTR4(KTR_IW_CXGB, "put_ep (via %s:%u) ep %p refcnt %d", __FUNCTION__, __LINE__, \ ep, atomic_load_acq_int(&((ep)->refcount))); \ if (refcount_release(&((ep)->refcount))) \ __free_ep(ep); \ } #define get_ep(ep) { \ - CTR4(KTR_IW_CXGB, "get_ep (via %s:%u) ep %p, refcnt %d\n", __FUNCTION__, __LINE__, \ + CTR4(KTR_IW_CXGB, "get_ep (via %s:%u) ep %p, refcnt %d", __FUNCTION__, __LINE__, \ ep, atomic_load_acq_int(&((ep)->refcount))); \ refcount_acquire(&((ep)->refcount)); \ } @@ -148,7 +148,7 @@ struct iwch_ep_common { TAILQ_ENTRY(iwch_ep_common) entry; struct iw_cm_id *cm_id; struct iwch_qp *qp; - struct t3cdev *tdev; + struct toedev *tdev; enum iwch_ep_state state; u_int refcount; struct cv waitq; @@ -176,7 +176,6 @@ struct iwch_ep { u32 snd_seq; u32 rcv_seq; struct l2t_entry *l2t; - struct rtentry *dst; struct mbuf *mpa_mbuf; struct iwch_mpa_attributes mpa_attr; unsigned int mpa_pkt_len; @@ -237,13 +236,13 @@ int iwch_destroy_listen(struct iw_cm_id *cm_id); int iwch_reject_cr(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len); int iwch_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param); int iwch_ep_disconnect(struct iwch_ep *ep, int abrupt, int flags); -int iwch_quiesce_tid(struct iwch_ep *ep); -int iwch_resume_tid(struct iwch_ep *ep); void __free_ep(struct iwch_ep_common *ep); void iwch_rearp(struct iwch_ep *ep); int iwch_ep_redirect(void *ctx, struct rtentry *old, struct rtentry *new, struct l2t_entry *l2t); int iwch_cm_init(void); void iwch_cm_term(void); +void iwch_cm_init_cpl(struct adapter *); +void iwch_cm_term_cpl(struct adapter *); #endif /* _IWCH_CM_H_ */ diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cq.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cq.c index bb564bb5b42..9ad6ed9a1d6 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cq.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cq.c @@ -30,11 +30,13 @@ POSSIBILITY OF SUCH DAMAGE. #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD #include #include #include #include -#include #include #include #include @@ -59,9 +61,11 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include +#include +#include +#include +#include +#include #include #include @@ -261,4 +265,4 @@ int iwch_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc) return npolled; } } - +#endif diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_dbg.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_dbg.c index ac9c7428304..f5f59a3fb2f 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_dbg.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_dbg.c @@ -30,11 +30,12 @@ POSSIBILITY OF SUCH DAMAGE. #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + #include #include #include #include -#include #include #include #include @@ -60,11 +61,13 @@ __FBSDID("$FreeBSD$"); #include -#include -#include -#include +#include +#include +#include +#include +#include -#ifdef DEBUG +#if defined(INVARIANTS) && defined(TCP_OFFLOAD) #include #include #include @@ -74,75 +77,100 @@ __FBSDID("$FreeBSD$"); #include #include +static int +cxio_rdma_get_mem(struct cxio_rdev *rdev, struct ch_mem_range *m) +{ + struct adapter *sc = rdev->adap; + struct mc7 *mem; + + if ((m->addr & 7) || (m->len & 7)) + return (EINVAL); + if (m->mem_id == MEM_CM) + mem = &sc->cm; + else if (m->mem_id == MEM_PMRX) + mem = &sc->pmrx; + else if (m->mem_id == MEM_PMTX) + mem = &sc->pmtx; + else + return (EINVAL); + + return (t3_mc7_bd_read(mem, m->addr/8, m->len/8, (u64 *)m->buf)); +} + void cxio_dump_tpt(struct cxio_rdev *rdev, uint32_t stag) { - struct ch_mem_range *m; + struct ch_mem_range m; u64 *data; + u32 addr; int rc; int size = 32; - m = kmalloc(sizeof(*m) + size, M_NOWAIT); - if (!m) { + m.buf = malloc(size, M_DEVBUF, M_NOWAIT); + if (m.buf == NULL) { CTR1(KTR_IW_CXGB, "%s couldn't allocate memory.", __FUNCTION__); return; } - m->mem_id = MEM_PMRX; - m->addr = (stag>>8) * 32 + rdev->rnic_info.tpt_base; - m->len = size; - CTR3(KTR_IW_CXGB, "%s TPT addr 0x%x len %d", __FUNCTION__, m->addr, m->len); - rc = rdev->t3cdev_p->ctl(rdev->t3cdev_p, RDMA_GET_MEM, m); + m.mem_id = MEM_PMRX; + m.addr = (stag >> 8) * 32 + rdev->rnic_info.tpt_base; + m.len = size; + CTR3(KTR_IW_CXGB, "%s TPT addr 0x%x len %d", __FUNCTION__, m.addr, m.len); + + rc = cxio_rdma_get_mem(rdev, &m); if (rc) { CTR2(KTR_IW_CXGB, "%s toectl returned error %d", __FUNCTION__, rc); - free(m, M_DEVBUF); + free(m.buf, M_DEVBUF); return; } - data = (u64 *)m->buf; + data = (u64 *)m.buf; + addr = m.addr; while (size > 0) { - CTR2(KTR_IW_CXGB, "TPT %08x: %016llx", m->addr, (unsigned long long) *data); + CTR2(KTR_IW_CXGB, "TPT %08x: %016llx", addr, (unsigned long long) *data); size -= 8; data++; - m->addr += 8; + addr += 8; } - free(m, M_DEVBUF); + free(m.buf, M_DEVBUF); } void cxio_dump_pbl(struct cxio_rdev *rdev, uint32_t pbl_addr, uint32_t len, u8 shift) { - struct ch_mem_range *m; + struct ch_mem_range m; u64 *data; + u32 addr; int rc; int size, npages; shift += 12; npages = (len + (1ULL << shift) - 1) >> shift; size = npages * sizeof(u64); - - m = kmalloc(sizeof(*m) + size, M_NOWAIT); - if (!m) { + m.buf = malloc(size, M_DEVBUF, M_NOWAIT); + if (m.buf == NULL) { CTR1(KTR_IW_CXGB, "%s couldn't allocate memory.", __FUNCTION__); return; } - m->mem_id = MEM_PMRX; - m->addr = pbl_addr; - m->len = size; + m.mem_id = MEM_PMRX; + m.addr = pbl_addr; + m.len = size; CTR4(KTR_IW_CXGB, "%s PBL addr 0x%x len %d depth %d", - __FUNCTION__, m->addr, m->len, npages); - rc = rdev->t3cdev_p->ctl(rdev->t3cdev_p, RDMA_GET_MEM, m); + __FUNCTION__, m.addr, m.len, npages); + + rc = cxio_rdma_get_mem(rdev, &m); if (rc) { CTR2(KTR_IW_CXGB, "%s toectl returned error %d", __FUNCTION__, rc); - free(m, M_DEVBUF); + free(m.buf, M_DEVBUF); return; } - data = (u64 *)m->buf; + data = (u64 *)m.buf; + addr = m.addr; while (size > 0) { - CTR2(KTR_IW_CXGB, "PBL %08x: %016llx", m->addr, (unsigned long long) *data); + CTR2(KTR_IW_CXGB, "PBL %08x: %016llx", addr, (unsigned long long) *data); size -= 8; data++; - m->addr += 8; + addr += 8; } - free(m, M_DEVBUF); + free(m.buf, M_DEVBUF); } void cxio_dump_wqe(union t3_wr *wqe) @@ -175,70 +203,76 @@ void cxio_dump_wce(struct t3_cqe *wce) void cxio_dump_rqt(struct cxio_rdev *rdev, uint32_t hwtid, int nents) { - struct ch_mem_range *m; + struct ch_mem_range m; int size = nents * 64; u64 *data; + u32 addr; int rc; - m = kmalloc(sizeof(*m) + size, M_NOWAIT); - if (!m) { + m.buf = malloc(size, M_DEVBUF, M_NOWAIT); + if (m.buf == NULL) { CTR1(KTR_IW_CXGB, "%s couldn't allocate memory.", __FUNCTION__); return; } - m->mem_id = MEM_PMRX; - m->addr = ((hwtid)<<10) + rdev->rnic_info.rqt_base; - m->len = size; - CTR3(KTR_IW_CXGB, "%s RQT addr 0x%x len %d", __FUNCTION__, m->addr, m->len); - rc = rdev->t3cdev_p->ctl(rdev->t3cdev_p, RDMA_GET_MEM, m); + m.mem_id = MEM_PMRX; + m.addr = ((hwtid)<<10) + rdev->rnic_info.rqt_base; + m.len = size; + CTR3(KTR_IW_CXGB, "%s RQT addr 0x%x len %d", __FUNCTION__, m.addr, m.len); + + rc = cxio_rdma_get_mem(rdev, &m); if (rc) { CTR2(KTR_IW_CXGB, "%s toectl returned error %d", __FUNCTION__, rc); - free(m, M_DEVBUF); + free(m.buf, M_DEVBUF); return; } - data = (u64 *)m->buf; + data = (u64 *)m.buf; + addr = m.addr; while (size > 0) { - CTR2(KTR_IW_CXGB, "RQT %08x: %016llx", m->addr, (unsigned long long) *data); + CTR2(KTR_IW_CXGB, "RQT %08x: %016llx", addr, (unsigned long long) *data); size -= 8; data++; - m->addr += 8; + addr += 8; } - free(m, M_DEVBUF); + free(m.buf, M_DEVBUF); } void cxio_dump_tcb(struct cxio_rdev *rdev, uint32_t hwtid) { - struct ch_mem_range *m; + struct ch_mem_range m; int size = TCB_SIZE; uint32_t *data; + uint32_t addr; int rc; - m = kmalloc(sizeof(*m) + size, M_NOWAIT); - if (!m) { + m.buf = malloc(size, M_DEVBUF, M_NOWAIT); + if (m.buf == NULL) { CTR1(KTR_IW_CXGB, "%s couldn't allocate memory.", __FUNCTION__); return; } - m->mem_id = MEM_CM; - m->addr = hwtid * size; - m->len = size; - CTR3(KTR_IW_CXGB, "%s TCB %d len %d", __FUNCTION__, m->addr, m->len); - rc = rdev->t3cdev_p->ctl(rdev->t3cdev_p, RDMA_GET_MEM, m); + m.mem_id = MEM_CM; + m.addr = hwtid * size; + m.len = size; + CTR3(KTR_IW_CXGB, "%s TCB %d len %d", __FUNCTION__, m.addr, m.len); + + rc = cxio_rdma_get_mem(rdev, &m); if (rc) { CTR2(KTR_IW_CXGB, "%s toectl returned error %d", __FUNCTION__, rc); - free(m, M_DEVBUF); + free(m.buf, M_DEVBUF); return; } - data = (uint32_t *)m->buf; + data = (uint32_t *)m.buf; + addr = m.addr; while (size > 0) { printf("%2u: %08x %08x %08x %08x %08x %08x %08x %08x\n", - m->addr, + addr, *(data+2), *(data+3), *(data),*(data+1), *(data+6), *(data+7), *(data+4), *(data+5)); size -= 32; data += 8; - m->addr += 32; + addr += 32; } - free(m, M_DEVBUF); + free(m.buf, M_DEVBUF); } #endif diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_ev.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_ev.c index cf0891d7fe7..65b7a2d97db 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_ev.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_ev.c @@ -29,11 +29,13 @@ POSSIBILITY OF SUCH DAMAGE. #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD #include #include #include #include -#include #include #include #include @@ -59,9 +61,11 @@ __FBSDID("$FreeBSD$"); #include -#include -#include -#include +#include +#include +#include +#include +#include #include #include @@ -81,11 +85,22 @@ post_qp_event(struct iwch_dev *rnicp, struct iwch_qp *qhp, struct iwch_cq *chp, struct ib_event event; struct iwch_qp_attributes attrs; + mtx_lock(&rnicp->lock); + + if (!qhp) { + CTR3(KTR_IW_CXGB, "%s unaffiliated error 0x%x qpid 0x%x\n", + __func__, CQE_STATUS(rsp_msg->cqe), + CQE_QPID(rsp_msg->cqe)); + mtx_unlock(&rnicp->lock); + return; + } + if ((qhp->attr.state == IWCH_QP_STATE_ERROR) || (qhp->attr.state == IWCH_QP_STATE_TERMINATE)) { CTR4(KTR_IW_CXGB, "%s AE received after RTS - " "qp state %d qpid 0x%x status 0x%x", __FUNCTION__, qhp->attr.state, qhp->wq.qpid, CQE_STATUS(rsp_msg->cqe)); + mtx_unlock(&rnicp->lock); return; } @@ -95,6 +110,15 @@ post_qp_event(struct iwch_dev *rnicp, struct iwch_qp *qhp, struct iwch_cq *chp, CQE_STATUS(rsp_msg->cqe), CQE_TYPE(rsp_msg->cqe), CQE_WRID_HI(rsp_msg->cqe), CQE_WRID_LOW(rsp_msg->cqe)); + mtx_unlock(&rnicp->lock); + + if (qhp->attr.state == IWCH_QP_STATE_RTS) { + attrs.next_state = IWCH_QP_STATE_TERMINATE; + iwch_modify_qp(qhp->rhp, qhp, IWCH_QP_ATTR_NEXT_STATE, + &attrs, 1); + if (send_term) + iwch_post_terminate(qhp, rsp_msg); + } event.event = ib_event; event.device = chp->ibcq.device; @@ -106,25 +130,17 @@ post_qp_event(struct iwch_dev *rnicp, struct iwch_qp *qhp, struct iwch_cq *chp, if (qhp->ibqp.event_handler) (*qhp->ibqp.event_handler)(&event, qhp->ibqp.qp_context); - if (qhp->attr.state == IWCH_QP_STATE_RTS) { - attrs.next_state = IWCH_QP_STATE_TERMINATE; - iwch_modify_qp(qhp->rhp, qhp, IWCH_QP_ATTR_NEXT_STATE, - &attrs, 1); - if (send_term) - iwch_post_terminate(qhp, rsp_msg); - } + (*chp->ibcq.comp_handler)(&chp->ibcq, chp->ibcq.cq_context); } void -iwch_ev_dispatch(struct cxio_rdev *rdev_p, struct mbuf *m) +iwch_ev_dispatch(struct iwch_dev *rnicp, struct mbuf *m) { - struct iwch_dev *rnicp; struct respQ_msg_t *rsp_msg = (struct respQ_msg_t *) m->m_data; struct iwch_cq *chp; struct iwch_qp *qhp; u32 cqid = RSPQ_CQID(rsp_msg); - rnicp = (struct iwch_dev *) rdev_p->ulp; mtx_lock(&rnicp->lock); chp = get_chp(rnicp, cqid); qhp = get_qhp(rnicp, CQE_QPID(rsp_msg->cqe)); @@ -136,7 +152,7 @@ iwch_ev_dispatch(struct cxio_rdev *rdev_p, struct mbuf *m) CQE_TYPE(rsp_msg->cqe), CQE_WRID_HI(rsp_msg->cqe), CQE_WRID_LOW(rsp_msg->cqe)); mtx_unlock(&rnicp->lock); - goto out; + return; } iwch_qp_add_ref(&qhp->ibqp); mtx_lock(&chp->lock); @@ -200,12 +216,6 @@ iwch_ev_dispatch(struct cxio_rdev *rdev_p, struct mbuf *m) case TPT_ERR_BOUND: case TPT_ERR_INVALIDATE_SHARED_MR: case TPT_ERR_INVALIDATE_MR_WITH_MW_BOUND: - log(LOG_ERR, "%s - CQE Err qpid 0x%x opcode %d status 0x%x " - "type %d wrid.hi 0x%x wrid.lo 0x%x \n", __FUNCTION__, - CQE_QPID(rsp_msg->cqe), CQE_OPCODE(rsp_msg->cqe), - CQE_STATUS(rsp_msg->cqe), CQE_TYPE(rsp_msg->cqe), - CQE_WRID_HI(rsp_msg->cqe), CQE_WRID_LOW(rsp_msg->cqe)); - (*chp->ibcq.comp_handler)(&chp->ibcq, chp->ibcq.cq_context); post_qp_event(rnicp, qhp, chp, rsp_msg, IB_EVENT_QP_ACCESS_ERR, 1); break; @@ -248,6 +258,5 @@ done: wakeup(chp); mtx_unlock(&chp->lock); iwch_qp_rem_ref(&qhp->ibqp); -out: - m_free(m); } +#endif diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.c index cf42e38774a..24272636fdc 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.c @@ -1,4 +1,3 @@ - /************************************************************************** Copyright (c) 2007, Chelsio Inc. @@ -30,11 +29,13 @@ POSSIBILITY OF SUCH DAMAGE. #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD #include #include #include #include -#include #include #include #include @@ -47,6 +48,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include #include @@ -59,12 +62,25 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include -#include +#include +#include +#include #include #include +#include +#include #include #include #include @@ -72,29 +88,21 @@ __FBSDID("$FreeBSD$"); #include #include -static TAILQ_HEAD( ,cxio_rdev) rdev_list; -static cxio_hal_ev_callback_func_t cxio_ev_cb = NULL; - -static struct cxio_rdev * -cxio_hal_find_rdev_by_name(char *dev_name) +/* Response queue used for RDMA events. */ +#define ASYNC_NOTIF_RSPQ 0 +static inline int +cxio_rdma_cq_setup(struct cxio_rdev *rdev_p, unsigned id, uint64_t base_addr, + unsigned size, unsigned ovfl_mode, unsigned credits, unsigned credit_thres) { - struct cxio_rdev *rdev; + struct adapter *sc = rdev_p->adap; + int rc; - TAILQ_FOREACH(rdev, &rdev_list, entry) - if (!strcmp(rdev->dev_name, dev_name)) - return rdev; - return NULL; -} + mtx_lock_spin(&sc->sge.reg_lock); + rc = -t3_sge_init_cqcntxt(sc, id, base_addr, size, ASYNC_NOTIF_RSPQ, + ovfl_mode, credits, credit_thres); + mtx_unlock_spin(&sc->sge.reg_lock); -struct cxio_rdev * -cxio_hal_find_rdev_by_t3cdev(struct t3cdev *tdev) -{ - struct cxio_rdev *rdev; - - TAILQ_FOREACH(rdev, &rdev_list, entry) - if (rdev->t3cdev_p == tdev) - return rdev; - return NULL; + return (rc); } int @@ -104,12 +112,14 @@ cxio_hal_cq_op(struct cxio_rdev *rdev_p, struct t3_cq *cq, int ret; struct t3_cqe *cqe; u32 rptr; + struct adapter *sc = rdev_p->adap; - struct rdma_cq_op setup; - setup.id = cq->cqid; - setup.credits = (op == CQ_CREDIT_UPDATE) ? credit : 0; - setup.op = op; - ret = rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_CQ_OP, &setup); + if (op != CQ_CREDIT_UPDATE) + credit = 0; + + mtx_lock_spin(&sc->sge.reg_lock); + ret = t3_sge_cqcntxt_op(sc, cq->cqid, op, credit); + mtx_unlock_spin(&sc->sge.reg_lock); if ((ret < 0) || (op == CQ_CREDIT_UPDATE)) return (ret); @@ -140,30 +150,26 @@ cxio_hal_cq_op(struct cxio_rdev *rdev_p, struct t3_cq *cq, while (!CQ_VLD_ENTRY(rptr, cq->size_log2, cqe)) { DELAY(1); if (i++ > 1000000) { - PANIC_IF(1); + struct adapter *sc = rdev_p->adap; + log(LOG_ERR, "%s: stalled rnic\n", - rdev_p->dev_name); + device_get_nameunit(sc->dev)); + PANIC_IF(1); return (-EIO); } } - return 1; + return (1); } - return 0; + return (0); } static int cxio_hal_clear_cq_ctx(struct cxio_rdev *rdev_p, u32 cqid) { - struct rdma_cq_setup setup; - setup.id = cqid; - setup.base_addr = 0; /* NULL address */ - setup.size = 0; /* disaable the CQ */ - setup.credits = 0; - setup.credit_thres = 0; - setup.ovfl_mode = 0; - return (rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_CQ_SETUP, &setup)); + + return (cxio_rdma_cq_setup(rdev_p, cqid, 0, 0, 0, 0, 0)); } static int @@ -171,43 +177,38 @@ cxio_hal_clear_qp_ctx(struct cxio_rdev *rdev_p, u32 qpid) { u64 sge_cmd; struct t3_modify_qp_wr *wqe; - struct mbuf *m = m_gethdr(MT_DATA, M_NOWAIT); + struct mbuf *m; + + m = M_GETHDR_OFLD(0, CPL_PRIORITY_CONTROL, wqe); if (m == NULL) { CTR1(KTR_IW_CXGB, "%s m_gethdr failed", __FUNCTION__); return (-ENOMEM); } wqe = mtod(m, struct t3_modify_qp_wr *); - m->m_len = m->m_pkthdr.len = sizeof(*wqe); memset(wqe, 0, sizeof(*wqe)); build_fw_riwrh((struct fw_riwrh *) wqe, T3_WR_QP_MOD, 3, 0, qpid, 7); wqe->flags = htobe32(MODQP_WRITE_EC); sge_cmd = qpid << 8 | 3; wqe->sge_cmd = htobe64(sge_cmd); - m_set_priority(m, CPL_PRIORITY_CONTROL); - m_set_sgl(m, NULL); - m_set_sgllen(m, 0); - return (cxgb_ofld_send(rdev_p->t3cdev_p, m)); + return t3_offload_tx(rdev_p->adap, m); } int -cxio_create_cq(struct cxio_rdev *rdev_p, struct t3_cq *cq) +cxio_create_cq(struct cxio_rdev *rdev_p, struct t3_cq *cq, int kernel) { - struct rdma_cq_setup setup; int size = (1UL << (cq->size_log2)) * sizeof(struct t3_cqe); + size += 1; /* one extra page for storing cq-in-err state */ cq->cqid = cxio_hal_get_cqid(rdev_p->rscp); if (!cq->cqid) return (-ENOMEM); - cq->sw_queue = malloc(size, M_DEVBUF, M_NOWAIT|M_ZERO); - if (!cq->sw_queue) - return (-ENOMEM); -#if 0 - cq->queue = dma_alloc_coherent(rdev_p->rnic_info.pdev, - (1UL << (cq->size_log2)) * - sizeof(struct t3_cqe), - &(cq->dma_addr), M_NOWAIT); -#else - cq->queue = contigmalloc((1UL << (cq->size_log2))*sizeof(struct t3_cqe), + if (kernel) { + cq->sw_queue = malloc(size, M_DEVBUF, M_NOWAIT|M_ZERO); + if (!cq->sw_queue) + return (-ENOMEM); + } + + cq->queue = contigmalloc(size, M_DEVBUF, M_NOWAIT, 0ul, ~0ul, 4096, 0); if (cq->queue) cq->dma_addr = vtophys(cq->queue); @@ -215,35 +216,10 @@ cxio_create_cq(struct cxio_rdev *rdev_p, struct t3_cq *cq) free(cq->sw_queue, M_DEVBUF); return (-ENOMEM); } -#endif - -#ifdef notyet - pci_unmap_addr_set(cq, mapping, cq->dma_addr); -#endif memset(cq->queue, 0, size); - setup.id = cq->cqid; - setup.base_addr = (u64) (cq->dma_addr); - setup.size = 1UL << cq->size_log2; - setup.credits = 65535; - setup.credit_thres = 1; - if (rdev_p->t3cdev_p->type != T3A) - setup.ovfl_mode = 0; - else - setup.ovfl_mode = 1; - return (rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_CQ_SETUP, &setup)); -} -int -cxio_resize_cq(struct cxio_rdev *rdev_p, struct t3_cq *cq) -{ - struct rdma_cq_setup setup; - setup.id = cq->cqid; - setup.base_addr = (u64) (cq->dma_addr); - setup.size = 1UL << cq->size_log2; - setup.credits = setup.size; - setup.credit_thres = setup.size; /* TBD: overflow recovery */ - setup.ovfl_mode = 1; - return (rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_CQ_SETUP, &setup)); + return (cxio_rdma_cq_setup(rdev_p, cq->cqid, cq->dma_addr, + 1UL << cq->size_log2, 0, 65535, 1)); } static u32 @@ -325,7 +301,7 @@ cxio_create_qp(struct cxio_rdev *rdev_p, u32 kernel_domain, if (!wq->qpid) return (-ENOMEM); - wq->rq = malloc(depth * sizeof(u64), M_DEVBUF, M_NOWAIT|M_ZERO); + wq->rq = malloc(depth * sizeof(struct t3_swrq), M_DEVBUF, M_NOWAIT|M_ZERO); if (!wq->rq) goto err1; @@ -336,28 +312,19 @@ cxio_create_qp(struct cxio_rdev *rdev_p, u32 kernel_domain, wq->sq = malloc(depth * sizeof(struct t3_swsq), M_DEVBUF, M_NOWAIT|M_ZERO); if (!wq->sq) goto err3; -#if 0 - wq->queue = dma_alloc_coherent(rdev_p->rnic_info.pdev, - depth * sizeof(union t3_wr), - &(wq->dma_addr), M_NOWAIT); -#else wq->queue = contigmalloc(depth *sizeof(union t3_wr), M_DEVBUF, M_NOWAIT, 0ul, ~0ul, 4096, 0); if (wq->queue) wq->dma_addr = vtophys(wq->queue); - -#endif - if (!wq->queue) + else goto err4; memset(wq->queue, 0, depth * sizeof(union t3_wr)); -#ifdef notyet - pci_unmap_addr_set(wq, mapping, wq->dma_addr); -#endif wq->doorbell = rdev_p->rnic_info.kdb_addr; if (!kernel_domain) wq->udb = (u64)rdev_p->rnic_info.udbell_physbase + (wq->qpid << rdev_p->qpshift); + wq->rdev = rdev_p; CTR4(KTR_IW_CXGB, "%s qpid 0x%x doorbell 0x%p udb 0x%llx", __FUNCTION__, wq->qpid, wq->doorbell, (unsigned long long) wq->udb); return 0; @@ -431,10 +398,11 @@ insert_recv_cqe(struct t3_wq *wq, struct t3_cq *cq) cq->sw_wptr++; } -void +int cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count) { u32 ptr; + int flushed = 0; CTR3(KTR_IW_CXGB, "%s wq %p cq %p", __FUNCTION__, wq, cq); @@ -442,8 +410,11 @@ cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count) CTR4(KTR_IW_CXGB, "%s rq_rptr %u rq_wptr %u skip count %u", __FUNCTION__, wq->rq_rptr, wq->rq_wptr, count); ptr = wq->rq_rptr + count; - while (ptr++ != wq->rq_wptr) + while (ptr++ != wq->rq_wptr) { insert_recv_cqe(wq, cq); + flushed++; + } + return flushed; } static void @@ -468,19 +439,22 @@ insert_sq_cqe(struct t3_wq *wq, struct t3_cq *cq, cq->sw_wptr++; } -void +int cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count) { __u32 ptr; + int flushed = 0; struct t3_swsq *sqp = wq->sq + Q_PTR2IDX(wq->sq_rptr, wq->sq_size_log2); ptr = wq->sq_rptr + count; - sqp += count; + sqp = wq->sq + Q_PTR2IDX(ptr, wq->sq_size_log2); while (ptr != wq->sq_wptr) { insert_sq_cqe(wq, cq, sqp); - sqp++; ptr++; + sqp = wq->sq + Q_PTR2IDX(ptr, wq->sq_size_log2); + flushed++; } + return flushed; } /* @@ -516,7 +490,7 @@ static int cqe_completes_wr(struct t3_cqe *cqe, struct t3_wq *wq) if ((CQE_OPCODE(*cqe) == T3_READ_RESP) && SQ_TYPE(*cqe)) return 0; - if ((CQE_OPCODE(*cqe) == T3_SEND) && RQ_TYPE(*cqe) && + if (CQE_OPCODE(*cqe) && RQ_TYPE(*cqe) && Q_EMPTY(wq->rq_rptr, wq->rq_wptr)) return 0; @@ -563,16 +537,8 @@ cxio_count_rcqes(struct t3_cq *cq, struct t3_wq *wq, int *count) static int cxio_hal_init_ctrl_cq(struct cxio_rdev *rdev_p) { - struct rdma_cq_setup setup; - setup.id = 0; - setup.base_addr = 0; /* NULL address */ - setup.size = 1; /* enable the CQ */ - setup.credits = 0; - /* force SGE to redirect to RspQ and interrupt */ - setup.credit_thres = 0; - setup.ovfl_mode = 1; - return (rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_CQ_SETUP, &setup)); + return (cxio_rdma_cq_setup(rdev_p, 0, 0, 1, 1, 0, 0)); } static int @@ -584,41 +550,28 @@ cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p) struct t3_modify_qp_wr *wqe; struct mbuf *m; - m = m_gethdr(MT_DATA, M_NOWAIT); + m = M_GETHDR_OFLD(0, CPL_PRIORITY_CONTROL, wqe); if (m == NULL) { CTR1(KTR_IW_CXGB, "%s m_gethdr failed", __FUNCTION__); - return (-ENOMEM); + return (ENOMEM); } err = cxio_hal_init_ctrl_cq(rdev_p); if (err) { CTR2(KTR_IW_CXGB, "%s err %d initializing ctrl_cq", __FUNCTION__, err); goto err; } -#if 0 - rdev_p->ctrl_qp.workq = dma_alloc_coherent( - rdev_p->rnic_info.pdev, - (1 << T3_CTRL_QP_SIZE_LOG2) * - sizeof(union t3_wr), - &(rdev_p->ctrl_qp.dma_addr), - M_NOWAIT); -#else + rdev_p->ctrl_qp.workq = contigmalloc((1 << T3_CTRL_QP_SIZE_LOG2) *sizeof(union t3_wr), M_DEVBUF, M_NOWAIT, 0ul, ~0ul, 4096, 0); if (rdev_p->ctrl_qp.workq) rdev_p->ctrl_qp.dma_addr = vtophys(rdev_p->ctrl_qp.workq); - -#endif - - if (!rdev_p->ctrl_qp.workq) { + else { CTR1(KTR_IW_CXGB, "%s dma_alloc_coherent failed", __FUNCTION__); - err = -ENOMEM; + err = ENOMEM; goto err; } -#if 0 - pci_unmap_addr_set(&rdev_p->ctrl_qp, mapping, - rdev_p->ctrl_qp.dma_addr); -#endif - rdev_p->ctrl_qp.doorbell = (void /*__iomem */ *)rdev_p->rnic_info.kdb_addr; + + rdev_p->ctrl_qp.doorbell = rdev_p->rnic_info.kdb_addr; memset(rdev_p->ctrl_qp.workq, 0, (1 << T3_CTRL_QP_SIZE_LOG2) * sizeof(union t3_wr)); @@ -637,10 +590,8 @@ cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p) ctx1 |= ((u64) (V_EC_BASE_HI((u32) base_addr & 0xf) | V_EC_RESPQ(0) | V_EC_TYPE(0) | V_EC_GEN(1) | V_EC_UP_TOKEN(T3_CTL_QP_TID) | F_EC_VALID)) << 32; - wqe = mtod(m, struct t3_modify_qp_wr *); - m->m_len = m->m_pkthdr.len = sizeof(*wqe); memset(wqe, 0, sizeof(*wqe)); - build_fw_riwrh((struct fw_riwrh *) wqe, T3_WR_QP_MOD, 3, 0, + build_fw_riwrh((struct fw_riwrh *) wqe, T3_WR_QP_MOD, 0, 0, T3_CTL_QP_TID, 7); wqe->flags = htobe32(MODQP_WRITE_EC); sge_cmd = (3ULL << 56) | FW_RI_SGEEC_START << 8 | 3; @@ -650,12 +601,9 @@ cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p) CTR3(KTR_IW_CXGB, "CtrlQP dma_addr 0x%llx workq %p size %d", (unsigned long long) rdev_p->ctrl_qp.dma_addr, rdev_p->ctrl_qp.workq, 1 << T3_CTRL_QP_SIZE_LOG2); - m_set_priority(m, CPL_PRIORITY_CONTROL); - m_set_sgl(m, NULL); - m_set_sgllen(m, 0); - return (cxgb_ofld_send(rdev_p->t3cdev_p, m)); + return t3_offload_tx(rdev_p->adap, m); err: - m_free(m); + m_freem(m); return err; } @@ -681,7 +629,7 @@ cxio_hal_destroy_ctrl_qp(struct cxio_rdev *rdev_p) */ static int cxio_hal_ctrl_qp_write_mem(struct cxio_rdev *rdev_p, u32 addr, - u32 len, void *data, int completion) + u32 len, void *data) { u32 i, nr_wqe, copy_len; u8 *copy_data; @@ -718,7 +666,7 @@ cxio_hal_ctrl_qp_write_mem(struct cxio_rdev *rdev_p, u32 addr, flag = 0; if (i == (nr_wqe - 1)) { /* last WQE */ - flag = completion ? T3_COMPLETION_FLAG : 0; + flag = T3_COMPLETION_FLAG; if (len % 32) utx_len = len / 32 + 1; else @@ -786,14 +734,13 @@ static int __cxio_tpt_op(struct cxio_rdev *rdev_p, u32 reset_tpt_entry, u32 *stag, u8 stag_state, u32 pdid, enum tpt_mem_type type, enum tpt_mem_perm perm, - u32 zbva, u64 to, u32 len, u8 page_size, __be64 *pbl, - u32 *pbl_size, u32 *pbl_addr) + u32 zbva, u64 to, u32 len, u8 page_size, + u32 pbl_size, u32 pbl_addr) { int err; struct tpt_entry tpt; u32 stag_idx; u32 wptr; - int rereg = (*stag != T3_STAG_UNSET); stag_state = stag_state > 0; stag_idx = (*stag) >> 8; @@ -807,30 +754,8 @@ __cxio_tpt_op(struct cxio_rdev *rdev_p, u32 reset_tpt_entry, CTR5(KTR_IW_CXGB, "%s stag_state 0x%0x type 0x%0x pdid 0x%0x, stag_idx 0x%x", __FUNCTION__, stag_state, type, pdid, stag_idx); - if (reset_tpt_entry) - cxio_hal_pblpool_free(rdev_p, *pbl_addr, *pbl_size << 3); - else if (!rereg) { - *pbl_addr = cxio_hal_pblpool_alloc(rdev_p, *pbl_size << 3); - if (!*pbl_addr) { - return (-ENOMEM); - } - } - mtx_lock(&rdev_p->ctrl_qp.lock); - /* write PBL first if any - update pbl only if pbl list exist */ - if (pbl) { - - CTR4(KTR_IW_CXGB, "%s *pdb_addr 0x%x, pbl_base 0x%x, pbl_size %d", - __FUNCTION__, *pbl_addr, rdev_p->rnic_info.pbl_base, - *pbl_size); - err = cxio_hal_ctrl_qp_write_mem(rdev_p, - (*pbl_addr >> 5), - (*pbl_size << 3), pbl, 0); - if (err) - goto ret; - } - /* write TPT entry */ if (reset_tpt_entry) memset(&tpt, 0, sizeof(tpt)); @@ -845,23 +770,23 @@ __cxio_tpt_op(struct cxio_rdev *rdev_p, u32 reset_tpt_entry, V_TPT_ADDR_TYPE((zbva ? TPT_ZBTO : TPT_VATO)) | V_TPT_PAGE_SIZE(page_size)); tpt.rsvd_pbl_addr = reset_tpt_entry ? 0 : - htobe32(V_TPT_PBL_ADDR(PBL_OFF(rdev_p, *pbl_addr)>>3)); + htobe32(V_TPT_PBL_ADDR(PBL_OFF(rdev_p, pbl_addr)>>3)); tpt.len = htobe32(len); tpt.va_hi = htobe32((u32) (to >> 32)); tpt.va_low_or_fbo = htobe32((u32) (to & 0xFFFFFFFFULL)); tpt.rsvd_bind_cnt_or_pstag = 0; tpt.rsvd_pbl_size = reset_tpt_entry ? 0 : - htobe32(V_TPT_PBL_SIZE((*pbl_size) >> 2)); + htobe32(V_TPT_PBL_SIZE((pbl_size) >> 2)); } err = cxio_hal_ctrl_qp_write_mem(rdev_p, stag_idx + (rdev_p->rnic_info.tpt_base >> 5), - sizeof(tpt), &tpt, 1); + sizeof(tpt), &tpt); /* release the stag index to free pool */ if (reset_tpt_entry) cxio_hal_put_stag(rdev_p->rscp, stag_idx); -ret: + wptr = rdev_p->ctrl_qp.wptr; mtx_unlock(&rdev_p->ctrl_qp.lock); if (!err) @@ -872,61 +797,90 @@ ret: return err; } +int cxio_write_pbl(struct cxio_rdev *rdev_p, __be64 *pbl, + u32 pbl_addr, u32 pbl_size) +{ + u32 wptr; + int err; + + CTR4(KTR_IW_CXGB, "%s *pdb_addr 0x%x, pbl_base 0x%x, pbl_size %d", + __func__, pbl_addr, rdev_p->rnic_info.pbl_base, + pbl_size); + + mtx_lock(&rdev_p->ctrl_qp.lock); + err = cxio_hal_ctrl_qp_write_mem(rdev_p, pbl_addr >> 5, pbl_size << 3, + pbl); + wptr = rdev_p->ctrl_qp.wptr; + mtx_unlock(&rdev_p->ctrl_qp.lock); + if (err) + return err; + + if (cxio_wait(&rdev_p->ctrl_qp, + &rdev_p->ctrl_qp.lock, + SEQ32_GE(rdev_p->ctrl_qp.rptr, wptr))) + return ERESTART; + + return 0; +} + int cxio_register_phys_mem(struct cxio_rdev *rdev_p, u32 *stag, u32 pdid, enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, - u8 page_size, __be64 *pbl, u32 *pbl_size, - u32 *pbl_addr) + u8 page_size, u32 pbl_size, u32 pbl_addr) { *stag = T3_STAG_UNSET; return __cxio_tpt_op(rdev_p, 0, stag, 1, pdid, TPT_NON_SHARED_MR, perm, - zbva, to, len, page_size, pbl, pbl_size, pbl_addr); + zbva, to, len, page_size, pbl_size, pbl_addr); } int cxio_reregister_phys_mem(struct cxio_rdev *rdev_p, u32 *stag, u32 pdid, enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, - u8 page_size, __be64 *pbl, u32 *pbl_size, - u32 *pbl_addr) + u8 page_size, u32 pbl_size, u32 pbl_addr) { return __cxio_tpt_op(rdev_p, 0, stag, 1, pdid, TPT_NON_SHARED_MR, perm, - zbva, to, len, page_size, pbl, pbl_size, pbl_addr); + zbva, to, len, page_size, pbl_size, pbl_addr); } int cxio_dereg_mem(struct cxio_rdev *rdev_p, u32 stag, u32 pbl_size, u32 pbl_addr) { - return __cxio_tpt_op(rdev_p, 1, &stag, 0, 0, 0, 0, 0, 0ULL, 0, 0, NULL, - &pbl_size, &pbl_addr); + return __cxio_tpt_op(rdev_p, 1, &stag, 0, 0, 0, 0, 0, 0ULL, 0, 0, + pbl_size, pbl_addr); } int cxio_allocate_window(struct cxio_rdev *rdev_p, u32 * stag, u32 pdid) { - u32 pbl_size = 0; *stag = T3_STAG_UNSET; return __cxio_tpt_op(rdev_p, 0, stag, 0, pdid, TPT_MW, 0, 0, 0ULL, 0, 0, - NULL, &pbl_size, NULL); + 0, 0); } int cxio_deallocate_window(struct cxio_rdev *rdev_p, u32 stag) { - return __cxio_tpt_op(rdev_p, 1, &stag, 0, 0, 0, 0, 0, 0ULL, 0, 0, NULL, - NULL, NULL); + return __cxio_tpt_op(rdev_p, 1, &stag, 0, 0, 0, 0, 0, 0ULL, 0, 0, + 0, 0); } int -cxio_rdma_init(struct cxio_rdev *rdev_p, struct t3_rdma_init_attr *attr) +cxio_rdma_init(struct cxio_rdev *rdev_p, struct t3_rdma_init_attr *attr, + struct socket *so) { struct t3_rdma_init_wr *wqe; - struct mbuf *m = m_gethdr(MT_DATA, M_NOWAIT); + struct mbuf *m; + struct ofld_hdr *oh; + int rc; + struct tcpcb *tp; + struct inpcb *inp; + struct toepcb *toep; + + m = M_GETHDR_OFLD(0, CPL_PRIORITY_DATA, wqe); if (m == NULL) return (-ENOMEM); CTR2(KTR_IW_CXGB, "%s rdev_p %p", __FUNCTION__, rdev_p); - wqe = mtod(m, struct t3_rdma_init_wr *); - m->m_len = m->m_pkthdr.len = sizeof(*wqe); wqe->wrh.op_seop_flags = htobe32(V_FW_RIWR_OP(T3_WR_INIT)); wqe->wrh.gen_tid_len = htobe32(V_FW_RIWR_TID(attr->tid) | V_FW_RIWR_LEN(sizeof(*wqe) >> 3)); @@ -940,36 +894,41 @@ cxio_rdma_init(struct cxio_rdev *rdev_p, struct t3_rdma_init_attr *attr) wqe->mpaattrs = attr->mpaattrs; wqe->qpcaps = attr->qpcaps; wqe->ulpdu_size = htobe16(attr->tcp_emss); - wqe->flags = htobe32(attr->flags); + wqe->rqe_count = htobe16(attr->rqe_count); + wqe->flags_rtr_type = htobe16(attr->flags | + V_RTR_TYPE(attr->rtr_type) | + V_CHAN(attr->chan)); wqe->ord = htobe32(attr->ord); wqe->ird = htobe32(attr->ird); wqe->qp_dma_addr = htobe64(attr->qp_dma_addr); wqe->qp_dma_size = htobe32(attr->qp_dma_size); wqe->irs = htobe32(attr->irs); - m_set_priority(m, 0); /* 0=>ToeQ; 1=>CtrlQ */ - m_set_sgl(m, NULL); - m_set_sgllen(m, 0); - return (cxgb_ofld_send(rdev_p->t3cdev_p, m)); -} -void -cxio_register_ev_cb(cxio_hal_ev_callback_func_t ev_cb) -{ - cxio_ev_cb = ev_cb; -} + /* XXX: bad form, fix later */ + inp = sotoinpcb(so); + INP_WLOCK(inp); + tp = intotcpcb(inp); + toep = tp->t_toe; + oh = mtod(m, struct ofld_hdr *); + oh->plen = 0; + oh->flags |= F_HDR_DF; + enqueue_wr(toep, m); + toep->tp_wr_avail--; + toep->tp_wr_unacked++; + rc = t3_offload_tx(rdev_p->adap, m); + INP_WUNLOCK(inp); -void -cxio_unregister_ev_cb(cxio_hal_ev_callback_func_t ev_cb) -{ - cxio_ev_cb = NULL; + return (rc); } static int -cxio_hal_ev_handler(struct t3cdev *t3cdev_p, struct mbuf *m) +cxio_hal_ev_handler(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { - static int cnt; - struct cxio_rdev *rdev_p = NULL; + struct adapter *sc = qs->adap; + struct iwch_dev *rnicp = sc->iwarp_softc; + struct cxio_rdev *rdev_p = &rnicp->rdev; struct respQ_msg_t *rsp_msg = (struct respQ_msg_t *) m->m_data; + int qpid = CQE_QPID(rsp_msg->cqe); CTR6(KTR_IW_CXGB, "%s cq_id 0x%x cq_ptr 0x%x genbit %0x overflow %0x an %0x", __FUNCTION__, RSPQ_CQID(rsp_msg), RSPQ_CQPTR(rsp_msg), @@ -978,80 +937,50 @@ cxio_hal_ev_handler(struct t3cdev *t3cdev_p, struct mbuf *m) RSPQ_SE(rsp_msg), RSPQ_NOTIFY(rsp_msg), RSPQ_CQBRANCH(rsp_msg), RSPQ_CREDIT_THRESH(rsp_msg)); CTR4(KTR_IW_CXGB, "CQE: QPID 0x%0x type 0x%0x status 0x%0x opcode %d", - CQE_QPID(rsp_msg->cqe), - CQE_TYPE(rsp_msg->cqe), CQE_STATUS(rsp_msg->cqe), - CQE_OPCODE(rsp_msg->cqe)); + qpid, CQE_TYPE(rsp_msg->cqe), CQE_STATUS(rsp_msg->cqe), + CQE_OPCODE(rsp_msg->cqe)); CTR3(KTR_IW_CXGB, "len 0x%0x wrid_hi_stag 0x%x wrid_low_msn 0x%x", CQE_LEN(rsp_msg->cqe), CQE_WRID_HI(rsp_msg->cqe), CQE_WRID_LOW(rsp_msg->cqe)); - rdev_p = (struct cxio_rdev *)t3cdev_p->ulp; - if (!rdev_p) { - CTR2(KTR_IW_CXGB, "%s called by t3cdev %p with null ulp", __FUNCTION__, - t3cdev_p); - return 0; - } - if (CQE_QPID(rsp_msg->cqe) == T3_CTRL_QP_ID) { + + switch(qpid) { + case T3_CTRL_QP_ID: mtx_lock(&rdev_p->ctrl_qp.lock); rdev_p->ctrl_qp.rptr = CQE_WRID_LOW(rsp_msg->cqe) + 1; wakeup(&rdev_p->ctrl_qp); mtx_unlock(&rdev_p->ctrl_qp.lock); - m_free(m); - } else if (CQE_QPID(rsp_msg->cqe) == 0xfff8) - m_free(m); - else if (cxio_ev_cb) - (*cxio_ev_cb) (rdev_p, m); - else - m_free(m); - cnt++; - return 0; + break; + case 0xfff8: + break; + default: + iwch_ev_dispatch(rnicp, m); + } + + m_freem(m); + return (0); } /* Caller takes care of locking if needed */ int cxio_rdev_open(struct cxio_rdev *rdev_p) { - struct ifnet *ifp; int err = 0; + struct rdma_info *ri = &rdev_p->rnic_info; + struct adapter *sc = rdev_p->adap; - if (strlen(rdev_p->dev_name)) { - if (cxio_hal_find_rdev_by_name(rdev_p->dev_name)) { - return (-EBUSY); - } - ifp = rdev_p->ifp; - if (ifp == NULL) - return (-EINVAL); - if_free(ifp); - } else if (rdev_p->t3cdev_p) { - if (cxio_hal_find_rdev_by_t3cdev(rdev_p->t3cdev_p)) - return (-EBUSY); - ifp = rdev_p->t3cdev_p->lldev; - strncpy(rdev_p->dev_name, rdev_p->t3cdev_p->name, - T3_MAX_DEV_NAME_LEN); - } else { - CTR1(KTR_IW_CXGB, "%s t3cdev_p or dev_name must be set", __FUNCTION__); - return (-EINVAL); - } + KASSERT(rdev_p->adap, ("%s: adap is NULL", __func__)); - TAILQ_INSERT_TAIL(&rdev_list, rdev_p, entry); - - CTR2(KTR_IW_CXGB, "%s opening rnic dev %s", __FUNCTION__, rdev_p->dev_name); memset(&rdev_p->ctrl_qp, 0, sizeof(rdev_p->ctrl_qp)); - if (!rdev_p->t3cdev_p) - rdev_p->t3cdev_p = T3CDEV(ifp); - rdev_p->t3cdev_p->ulp = (void *) rdev_p; - err = rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_GET_PARAMS, - &(rdev_p->rnic_info)); - if (err) { - log(LOG_ERR, "%s t3cdev_p(%p)->ctl returned error %d.\n", - __FUNCTION__, rdev_p->t3cdev_p, err); - goto err1; - } - err = rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, GET_PORTS, - &(rdev_p->port_info)); - if (err) { - log(LOG_ERR, "%s t3cdev_p(%p)->ctl returned error %d.\n", - __FUNCTION__, rdev_p->t3cdev_p, err); - goto err1; - } + + ri->udbell_physbase = rman_get_start(sc->udbs_res); + ri->udbell_len = rman_get_size(sc->udbs_res); + ri->tpt_base = t3_read_reg(sc, A_ULPTX_TPT_LLIMIT); + ri->tpt_top = t3_read_reg(sc, A_ULPTX_TPT_ULIMIT); + ri->pbl_base = t3_read_reg(sc, A_ULPTX_PBL_LLIMIT); + ri->pbl_top = t3_read_reg(sc, A_ULPTX_PBL_ULIMIT); + ri->rqt_base = t3_read_reg(sc, A_ULPRX_RQ_LLIMIT); + ri->rqt_top = t3_read_reg(sc, A_ULPRX_RQ_ULIMIT); + ri->kdb_addr = (void *)((unsigned long) + rman_get_virtual(sc->regs_res) + A_SG_KDOORBELL); /* * qpshift is the number of bits to shift the qpid left in order @@ -1064,8 +993,8 @@ cxio_rdev_open(struct cxio_rdev *rdev_p) PAGE_SHIFT)); rdev_p->qpnr = rdev_p->rnic_info.udbell_len >> PAGE_SHIFT; rdev_p->qpmask = (65536 >> ilog2(rdev_p->qpnr)) - 1; - CTR4(KTR_IW_CXGB, "cxio_rdev_open rnic %s info: tpt_base 0x%0x tpt_top 0x%0x num stags %d", - rdev_p->dev_name, rdev_p->rnic_info.tpt_base, + CTR4(KTR_IW_CXGB, "cxio_rdev_open rnic %p info: tpt_base 0x%0x tpt_top 0x%0x num stags %d", + rdev_p->adap, rdev_p->rnic_info.tpt_base, rdev_p->rnic_info.tpt_top, cxio_num_stags(rdev_p)); CTR4(KTR_IW_CXGB, "pbl_base 0x%0x pbl_top 0x%0x rqt_base 0x%0x, rqt_top 0x%0x", rdev_p->rnic_info.pbl_base, @@ -1111,43 +1040,34 @@ err3: err2: cxio_hal_destroy_ctrl_qp(rdev_p); err1: - TAILQ_REMOVE(&rdev_list, rdev_p, entry); return err; } void cxio_rdev_close(struct cxio_rdev *rdev_p) { - if (rdev_p) { - cxio_hal_pblpool_destroy(rdev_p); - cxio_hal_rqtpool_destroy(rdev_p); - TAILQ_REMOVE(&rdev_list, rdev_p, entry); - rdev_p->t3cdev_p->ulp = NULL; - cxio_hal_destroy_ctrl_qp(rdev_p); - cxio_hal_destroy_resource(rdev_p->rscp); - } + cxio_hal_pblpool_destroy(rdev_p); + cxio_hal_rqtpool_destroy(rdev_p); + cxio_hal_destroy_ctrl_qp(rdev_p); + cxio_hal_destroy_resource(rdev_p->rscp); } int -cxio_hal_init(void) +cxio_hal_init(struct adapter *sc) { - TAILQ_INIT(&rdev_list); #ifdef needed if (cxio_hal_init_rhdl_resource(T3_MAX_NUM_RI)) - return (-ENOMEM); + return (ENOMEM); #endif - t3_register_cpl_handler(CPL_ASYNC_NOTIF, cxio_hal_ev_handler); - return 0; + t3_register_cpl_handler(sc, CPL_ASYNC_NOTIF, cxio_hal_ev_handler); + + return (0); } void -cxio_hal_exit(void) +cxio_hal_uninit(struct adapter *sc) { - struct cxio_rdev *rdev, *tmp; - - t3_register_cpl_handler(CPL_ASYNC_NOTIF, NULL); - TAILQ_FOREACH_SAFE(rdev, &rdev_list, entry, tmp) - cxio_rdev_close(rdev); + t3_register_cpl_handler(sc, CPL_ASYNC_NOTIF, NULL); #ifdef needed cxio_hal_destroy_rhdl_resource(); #endif @@ -1304,11 +1224,12 @@ cxio_poll_cq(struct t3_wq *wq, struct t3_cq *cq, struct t3_cqe *cqe, } /* incoming SEND with no receive posted failures */ - if ((CQE_OPCODE(*hw_cqe) == T3_SEND) && RQ_TYPE(*hw_cqe) && + if (CQE_OPCODE(*hw_cqe) && RQ_TYPE(*hw_cqe) && Q_EMPTY(wq->rq_rptr, wq->rq_wptr)) { ret = -1; goto skip_cqe; } + PANIC_IF((*cqe_flushed == 0) && !SW_CQE(*hw_cqe)); goto proc_cqe; } @@ -1323,6 +1244,13 @@ cxio_poll_cq(struct t3_wq *wq, struct t3_cq *cq, struct t3_cqe *cqe, * then we complete this with TPT_ERR_MSN and mark the wq in * error. */ + + if (Q_EMPTY(wq->rq_rptr, wq->rq_wptr)) { + wq->error = 1; + ret = -1; + goto skip_cqe; + } + if (__predict_false((CQE_WRID_MSN(*hw_cqe) != (wq->rq_rptr + 1)))) { wq->error = 1; hw_cqe->header |= htonl(V_CQE_STATUS(TPT_ERR_MSN)); @@ -1367,13 +1295,17 @@ proc_cqe: wq->sq_rptr = CQE_WRID_SQ_WPTR(*hw_cqe); CTR2(KTR_IW_CXGB, "%s completing sq idx %ld", __FUNCTION__, Q_PTR2IDX(wq->sq_rptr, wq->sq_size_log2)); - *cookie = (wq->sq + - Q_PTR2IDX(wq->sq_rptr, wq->sq_size_log2))->wr_id; + *cookie = wq->sq[Q_PTR2IDX(wq->sq_rptr, wq->sq_size_log2)].wr_id; wq->sq_rptr++; } else { CTR2(KTR_IW_CXGB, "%s completing rq idx %ld", __FUNCTION__, Q_PTR2IDX(wq->rq_rptr, wq->rq_size_log2)); - *cookie = *(wq->rq + Q_PTR2IDX(wq->rq_rptr, wq->rq_size_log2)); + *cookie = wq->rq[Q_PTR2IDX(wq->rq_rptr, wq->rq_size_log2)].wr_id; + if (wq->rq[Q_PTR2IDX(wq->rq_rptr, wq->rq_size_log2)].pbl_addr) + cxio_hal_pblpool_free(wq->rdev, + wq->rq[Q_PTR2IDX(wq->rq_rptr, + wq->rq_size_log2)].pbl_addr, T3_STAG0_PBL_SIZE); + PANIC_IF(Q_EMPTY(wq->rq_rptr, wq->rq_wptr)); wq->rq_rptr++; } @@ -1404,5 +1336,4 @@ skip_cqe: } return ret; } - - +#endif diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.h b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.h index 6a401e09322..6b5f94820d7 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.h +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.h @@ -45,7 +45,11 @@ $FreeBSD$ #define T3_MAX_NUM_PD (1<<15) #define T3_MAX_PBL_SIZE 256 #define T3_MAX_RQ_SIZE 1024 +#define T3_MAX_QP_DEPTH (T3_MAX_RQ_SIZE-1) +#define T3_MAX_CQ_DEPTH 65536 #define T3_MAX_NUM_STAG (1<<15) +#define T3_MAX_MR_SIZE 0x100000000ULL +#define T3_PAGESIZE_MASK 0xffff000 /* 4KB-128MB */ #define T3_STAG_UNSET 0xffffffff @@ -55,12 +59,9 @@ struct cxio_hal_ctrl_qp { u32 wptr; u32 rptr; struct mtx lock; /* for the wtpr, can sleep */ -#ifdef notyet - DECLARE_PCI_UNMAP_ADDR(mapping) -#endif union t3_wr *workq; /* the work request queue */ bus_addr_t dma_addr; /* pci bus address of the workq */ - void /* __iomem */ *doorbell; + void *doorbell; }; struct cxio_hal_resource { @@ -85,13 +86,10 @@ struct cxio_ucontext { }; struct cxio_rdev { - char dev_name[T3_MAX_DEV_NAME_LEN]; - struct t3cdev *t3cdev_p; + struct adapter *adap; struct rdma_info rnic_info; - struct adap_ports port_info; struct cxio_hal_resource *rscp; struct cxio_hal_ctrl_qp ctrl_qp; - void *ulp; unsigned long qpshift; u32 qpnr; u32 qpmask; @@ -139,9 +137,8 @@ int cxio_rdev_open(struct cxio_rdev *rdev); void cxio_rdev_close(struct cxio_rdev *rdev); int cxio_hal_cq_op(struct cxio_rdev *rdev, struct t3_cq *cq, enum t3_cq_opcode op, u32 credit); -int cxio_create_cq(struct cxio_rdev *rdev, struct t3_cq *cq); +int cxio_create_cq(struct cxio_rdev *rdev, struct t3_cq *cq, int kernel); int cxio_destroy_cq(struct cxio_rdev *rdev, struct t3_cq *cq); -int cxio_resize_cq(struct cxio_rdev *rdev, struct t3_cq *cq); void cxio_release_ucontext(struct cxio_rdev *rdev, struct cxio_ucontext *uctx); void cxio_init_ucontext(struct cxio_rdev *rdev, struct cxio_ucontext *uctx); int cxio_create_qp(struct cxio_rdev *rdev, u32 kernel_domain, struct t3_wq *wq, @@ -149,27 +146,27 @@ int cxio_create_qp(struct cxio_rdev *rdev, u32 kernel_domain, struct t3_wq *wq, int cxio_destroy_qp(struct cxio_rdev *rdev, struct t3_wq *wq, struct cxio_ucontext *uctx); int cxio_peek_cq(struct t3_wq *wr, struct t3_cq *cq, int opcode); +int cxio_write_pbl(struct cxio_rdev *rdev_p, __be64 *pbl, + u32 pbl_addr, u32 pbl_size); int cxio_register_phys_mem(struct cxio_rdev *rdev, u32 * stag, u32 pdid, enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, - u8 page_size, __be64 *pbl, u32 *pbl_size, - u32 *pbl_addr); + u8 page_size, u32 pbl_size, u32 pbl_addr); int cxio_reregister_phys_mem(struct cxio_rdev *rdev, u32 * stag, u32 pdid, enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, - u8 page_size, __be64 *pbl, u32 *pbl_size, - u32 *pbl_addr); + u8 page_size, u32 pbl_size, u32 pbl_addr); int cxio_dereg_mem(struct cxio_rdev *rdev, u32 stag, u32 pbl_size, u32 pbl_addr); int cxio_allocate_window(struct cxio_rdev *rdev, u32 * stag, u32 pdid); int cxio_deallocate_window(struct cxio_rdev *rdev, u32 stag); -int cxio_rdma_init(struct cxio_rdev *rdev, struct t3_rdma_init_attr *attr); -void cxio_register_ev_cb(cxio_hal_ev_callback_func_t ev_cb); -void cxio_unregister_ev_cb(cxio_hal_ev_callback_func_t ev_cb); +int cxio_rdma_init(struct cxio_rdev *rdev, struct t3_rdma_init_attr *attr, + struct socket *so); u32 cxio_hal_get_pdid(struct cxio_hal_resource *rscp); void cxio_hal_put_pdid(struct cxio_hal_resource *rscp, u32 pdid); -int cxio_hal_init(void); +int cxio_hal_init(struct adapter *); +void cxio_hal_uninit(struct adapter *); void cxio_hal_exit(void); -void cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count); -void cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count); +int cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count); +int cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count); void cxio_count_rcqes(struct t3_cq *cq, struct t3_wq *wq, int *count); void cxio_count_scqes(struct t3_cq *cq, struct t3_wq *wq, int *count); void cxio_flush_hw_cq(struct t3_cq *cq); @@ -178,7 +175,7 @@ int cxio_poll_cq(struct t3_wq *wq, struct t3_cq *cq, struct t3_cqe *cqe, #define MOD "iw_cxgb: " -#ifdef DEBUG +#ifdef INVARIANTS void cxio_dump_tpt(struct cxio_rdev *rev, u32 stag); void cxio_dump_pbl(struct cxio_rdev *rev, u32 pbl_addr, uint32_t len, u8 shift); void cxio_dump_wqe(union t3_wr *wqe); @@ -187,60 +184,7 @@ void cxio_dump_rqt(struct cxio_rdev *rdev, u32 hwtid, int nents); void cxio_dump_tcb(struct cxio_rdev *rdev, u32 hwtid); #endif - - static unsigned char hiBitSetTab[] = { - 0, 1, 2, 2, 3, 3, 3, 3, - 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7 - -}; - - -static __inline -int ilog2(unsigned long val) -{ - unsigned long tmp; - - tmp = val >> 24; - if (tmp) { - return hiBitSetTab[tmp] + 23; - } - tmp = (val >> 16) & 0xff; - if (tmp) { - return hiBitSetTab[tmp] + 15; - } - tmp = (val >> 8) & 0xff; - if (tmp) { - return hiBitSetTab[tmp] + 7; - - } - return hiBitSetTab[val & 0xff] - 1; -} - #define cxfree(a) free((a), M_DEVBUF); -#define kmalloc(a, b) malloc((a), M_DEVBUF, (b)) -#define kzalloc(a, b) malloc((a), M_DEVBUF, (b)|M_ZERO) - -static __inline __attribute__((const)) -unsigned long roundup_pow_of_two(unsigned long n) -{ - return 1UL << flsl(n - 1); -} - -#define PAGE_ALIGN(x) roundup2((x), PAGE_SIZE) #include struct gen_pool { @@ -259,6 +203,7 @@ gen_pool_create(daddr_t base, u_int chunk_shift, u_int len) if (gp == NULL) return (NULL); + memset(gp, 0, sizeof(struct gen_pool)); gp->gen_list = blist_create(len >> chunk_shift, M_NOWAIT); if (gp->gen_list == NULL) { free(gp, M_DEVBUF); @@ -323,8 +268,7 @@ gen_pool_destroy(struct gen_pool *gp) mtx_unlock(lockp); \ __ret; \ }) -extern struct cxio_rdev *cxio_hal_find_rdev_by_t3cdev(struct t3cdev *tdev); -#define KTR_IW_CXGB KTR_SPARE4 +#define KTR_IW_CXGB KTR_SPARE3 #endif diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_ib_intfc.h b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_ib_intfc.h new file mode 100644 index 00000000000..7c7cd241a13 --- /dev/null +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_ib_intfc.h @@ -0,0 +1,22 @@ +#ifndef __IB_INTFC_H__ +#define __IB_INTFC_H__ + +/* $FreeBSD$ */ + +#undef prefetch +#undef WARN_ON +#undef max_t +#undef udelay +#undef le32_to_cpu +#undef le16_to_cpu +#undef cpu_to_le32 +#undef swab32 +#undef container_of + +#undef LIST_HEAD +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#endif /* __IB_INTFC_H__ */ diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c index c052aa6b2f0..0ccb70fcac8 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c @@ -29,11 +29,13 @@ POSSIBILITY OF SUCH DAMAGE. #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD #include #include #include #include -#include #include #include #include @@ -59,9 +61,11 @@ __FBSDID("$FreeBSD$"); #include -#include -#include -#include +#include +#include +#include +#include +#include #include #include @@ -72,14 +76,24 @@ __FBSDID("$FreeBSD$"); #include #include -int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php, - struct iwch_mr *mhp, - int shift, - __be64 *page_list) +static int iwch_finish_mem_reg(struct iwch_mr *mhp, u32 stag) { - u32 stag; u32 mmid; + mhp->attr.state = 1; + mhp->attr.stag = stag; + mmid = stag >> 8; + mhp->ibmr.rkey = mhp->ibmr.lkey = stag; + CTR3(KTR_IW_CXGB, "%s mmid 0x%x mhp %p", __func__, mmid, mhp); + return insert_handle(mhp->rhp, &mhp->rhp->mmidr, mhp, mmid); +} + +int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php, + struct iwch_mr *mhp, + int shift) +{ + u32 stag; + int ret; if (cxio_register_phys_mem(&rhp->rdev, &stag, mhp->attr.pdid, @@ -87,28 +101,24 @@ int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php, mhp->attr.zbva, mhp->attr.va_fbo, mhp->attr.len, - shift-12, - page_list, - &mhp->attr.pbl_size, &mhp->attr.pbl_addr)) + shift - 12, + mhp->attr.pbl_size, mhp->attr.pbl_addr)) return (-ENOMEM); - mhp->attr.state = 1; - mhp->attr.stag = stag; - mmid = stag >> 8; - mhp->ibmr.rkey = mhp->ibmr.lkey = stag; - insert_handle(rhp, &rhp->mmidr, mhp, mmid); - CTR3(KTR_IW_CXGB, "%s mmid 0x%x mhp %p", __FUNCTION__, mmid, mhp); - return 0; + + ret = iwch_finish_mem_reg(mhp, stag); + if (ret) + cxio_dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, + mhp->attr.pbl_addr); + return ret; } int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php, struct iwch_mr *mhp, int shift, - __be64 *page_list, int npages) { u32 stag; - u32 mmid; - + int ret; /* We could support this... */ if (npages > mhp->attr.pbl_size) @@ -121,17 +131,40 @@ int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php, mhp->attr.zbva, mhp->attr.va_fbo, mhp->attr.len, - shift-12, - page_list, - &mhp->attr.pbl_size, &mhp->attr.pbl_addr)) + shift - 12, + mhp->attr.pbl_size, mhp->attr.pbl_addr)) return (-ENOMEM); - mhp->attr.state = 1; - mhp->attr.stag = stag; - mmid = stag >> 8; - mhp->ibmr.rkey = mhp->ibmr.lkey = stag; - insert_handle(rhp, &rhp->mmidr, mhp, mmid); - CTR3(KTR_IW_CXGB, "%s mmid 0x%x mhp %p", __FUNCTION__, mmid, mhp); + + ret = iwch_finish_mem_reg(mhp, stag); + if (ret) + cxio_dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, + mhp->attr.pbl_addr); + return ret; +} + +int iwch_alloc_pbl(struct iwch_mr *mhp, int npages) +{ + mhp->attr.pbl_addr = cxio_hal_pblpool_alloc(&mhp->rhp->rdev, + npages << 3); + + if (!mhp->attr.pbl_addr) + return -ENOMEM; + + mhp->attr.pbl_size = npages; + return 0; + } + +void iwch_free_pbl(struct iwch_mr *mhp) +{ + cxio_hal_pblpool_free(&mhp->rhp->rdev, mhp->attr.pbl_addr, + mhp->attr.pbl_size << 3); +} + +int iwch_write_pbl(struct iwch_mr *mhp, __be64 *pages, int npages, int offset) +{ + return cxio_write_pbl(&mhp->rhp->rdev, pages, + mhp->attr.pbl_addr + (offset << 3), npages); } int build_phys_page_list(struct ib_phys_buf *buffer_list, @@ -204,3 +237,4 @@ int build_phys_page_list(struct ib_phys_buf *buffer_list, return 0; } +#endif diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c index bc336a4a625..4961395bfad 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c @@ -29,11 +29,13 @@ POSSIBILITY OF SUCH DAMAGE. #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD #include #include #include #include -#include #include #include #include @@ -62,9 +64,12 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include +#include +#include +#include +#include +#include + #include #include @@ -180,6 +185,8 @@ iwch_create_cq(struct ib_device *ibdev, int entries, int vector, struct iwch_create_cq_resp uresp; struct iwch_create_cq_req ureq; struct iwch_ucontext *ucontext = NULL; + static int warned; + size_t resplen; CTR3(KTR_IW_CXGB, "%s ib_dev %p entries %d", __FUNCTION__, ibdev, entries); rhp = to_iwch_dev(ibdev); @@ -214,7 +221,7 @@ iwch_create_cq(struct ib_device *ibdev, int entries, int vector, entries = roundup_pow_of_two(entries); chp->cq.size_log2 = ilog2(entries); - if (cxio_create_cq(&rhp->rdev, &chp->cq)) { + if (cxio_create_cq(&rhp->rdev, &chp->cq, !ucontext)) { cxfree(chp); return ERR_PTR(-ENOMEM); } @@ -222,7 +229,11 @@ iwch_create_cq(struct ib_device *ibdev, int entries, int vector, chp->ibcq.cqe = 1 << chp->cq.size_log2; mtx_init(&chp->lock, "cxgb cq", NULL, MTX_DEF|MTX_DUPOK); chp->refcnt = 1; - insert_handle(rhp, &rhp->cqidr, chp, chp->cq.cqid); + if (insert_handle(rhp, &rhp->cqidr, chp, chp->cq.cqid)) { + cxio_destroy_cq(&chp->rhp->rdev, &chp->cq); + cxfree(chp); + return ERR_PTR(-ENOMEM); + } if (ucontext) { struct iwch_mm_entry *mm; @@ -238,15 +249,27 @@ iwch_create_cq(struct ib_device *ibdev, int entries, int vector, uresp.key = ucontext->key; ucontext->key += PAGE_SIZE; mtx_unlock(&ucontext->mmap_lock); - if (ib_copy_to_udata(udata, &uresp, sizeof (uresp))) { + mm->key = uresp.key; + mm->addr = vtophys(chp->cq.queue); + if (udata->outlen < sizeof uresp) { + if (!warned++) + CTR1(KTR_IW_CXGB, "%s Warning - " + "downlevel libcxgb3 (non-fatal).\n", + __func__); + mm->len = PAGE_ALIGN((1UL << uresp.size_log2) * + sizeof(struct t3_cqe)); + resplen = sizeof(struct iwch_create_cq_resp_v0); + } else { + mm->len = PAGE_ALIGN(((1UL << uresp.size_log2) + 1) * + sizeof(struct t3_cqe)); + uresp.memsize = mm->len; + resplen = sizeof uresp; + } + if (ib_copy_to_udata(udata, &uresp, resplen)) { cxfree(mm); iwch_destroy_cq(&chp->ibcq); return ERR_PTR(-EFAULT); } - mm->key = uresp.key; - mm->addr = vtophys(chp->cq.queue); - mm->len = PAGE_ALIGN((1UL << uresp.size_log2) * - sizeof (struct t3_cqe)); insert_mmap(ucontext, mm); } CTR4(KTR_IW_CXGB, "created cqid 0x%0x chp %p size 0x%0x, dma_addr 0x%0llx", @@ -256,72 +279,11 @@ iwch_create_cq(struct ib_device *ibdev, int entries, int vector, } static int -iwch_resize_cq(struct ib_cq *cq, int cqe, struct ib_udata *udata) +iwch_resize_cq(struct ib_cq *cq __unused, int cqe __unused, + struct ib_udata *udata __unused) { -#ifdef notyet - struct iwch_cq *chp = to_iwch_cq(cq); - struct t3_cq oldcq, newcq; - int ret; - CTR3(KTR_IW_CXGB, "%s ib_cq %p cqe %d", __FUNCTION__, cq, cqe); - - /* We don't downsize... */ - if (cqe <= cq->cqe) - return 0; - - /* create new t3_cq with new size */ - cqe = roundup_pow_of_two(cqe+1); - newcq.size_log2 = ilog2(cqe); - - /* Dont allow resize to less than the current wce count */ - if (cqe < Q_COUNT(chp->cq.rptr, chp->cq.wptr)) { - return (-ENOMEM); - } - - /* Quiesce all QPs using this CQ */ - ret = iwch_quiesce_qps(chp); - if (ret) { - return (ret); - } - - ret = cxio_create_cq(&chp->rhp->rdev, &newcq); - if (ret) { - return (ret); - } - - /* copy CQEs */ - memcpy(newcq.queue, chp->cq.queue, (1 << chp->cq.size_log2) * - sizeof(struct t3_cqe)); - - /* old iwch_qp gets new t3_cq but keeps old cqid */ - oldcq = chp->cq; - chp->cq = newcq; - chp->cq.cqid = oldcq.cqid; - - /* resize new t3_cq to update the HW context */ - ret = cxio_resize_cq(&chp->rhp->rdev, &chp->cq); - if (ret) { - chp->cq = oldcq; - return ret; - } - chp->ibcq.cqe = (1<cq.size_log2) - 1; - - /* destroy old t3_cq */ - oldcq.cqid = newcq.cqid; - ret = cxio_destroy_cq(&chp->rhp->rdev, &oldcq); - if (ret) { - log(LOG_ERR, "%s - cxio_destroy_cq failed %d\n", - __FUNCTION__, ret); - } - - /* add user hooks here */ - - /* resume qps */ - ret = iwch_resume_qps(chp); - return ret; -#else return (-ENOSYS); -#endif } static int @@ -357,67 +319,12 @@ iwch_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags) return err; } -#ifdef notyet static int -iwch_mmap(struct ib_ucontext *context, struct vm_area_struct *vma) +iwch_mmap(struct ib_ucontext *context __unused, struct vm_area_struct *vma __unused) { -#ifdef notyet - int len = vma->vm_end - vma->vm_start; - u32 key = vma->vm_pgoff << PAGE_SHIFT; - struct cxio_rdev *rdev_p; - int ret = 0; - struct iwch_mm_entry *mm; - struct iwch_ucontext *ucontext; - u64 addr; - CTR4(KTR_IW_CXGB, "%s pgoff 0x%lx key 0x%x len %d", __FUNCTION__, vma->vm_pgoff, - key, len); - - if (vma->vm_start & (PAGE_SIZE-1)) { - return (-EINVAL); - } - - rdev_p = &(to_iwch_dev(context->device)->rdev); - ucontext = to_iwch_ucontext(context); - - mm = remove_mmap(ucontext, key, len); - if (!mm) - return (-EINVAL); - addr = mm->addr; - cxfree(mm); - - if ((addr >= rdev_p->rnic_info.udbell_physbase) && - (addr < (rdev_p->rnic_info.udbell_physbase + - rdev_p->rnic_info.udbell_len))) { - - /* - * Map T3 DB register. - */ - if (vma->vm_flags & VM_READ) { - return (-EPERM); - } - - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND; - vma->vm_flags &= ~VM_MAYREAD; - ret = io_remap_pfn_range(vma, vma->vm_start, - addr >> PAGE_SHIFT, - len, vma->vm_page_prot); - } else { - - /* - * Map WQ or CQ contig dma memory... - */ - ret = remap_pfn_range(vma, vma->vm_start, - addr >> PAGE_SHIFT, - len, vma->vm_page_prot); - } - - return ret; -#endif - return (0); + return (-ENOSYS); } -#endif static int iwch_deallocate_pd(struct ib_pd *pd) { @@ -470,7 +377,7 @@ static int iwch_dereg_mr(struct ib_mr *ib_mr) CTR2(KTR_IW_CXGB, "%s ib_mr %p", __FUNCTION__, ib_mr); /* There can be no memory windows */ - if (atomic_load_acq_int(&ib_mr->usecnt)) + if (atomic_load_acq_int(&ib_mr->usecnt.counter)) return (-EINVAL); mhp = to_iwch_mr(ib_mr); @@ -478,6 +385,7 @@ static int iwch_dereg_mr(struct ib_mr *ib_mr) mmid = mhp->attr.stag >> 8; cxio_dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, mhp->attr.pbl_addr); + iwch_free_pbl(mhp); remove_handle(rhp, &rhp->mmidr, mmid); if (mhp->kva) cxfree((void *) (unsigned long) mhp->kva); @@ -511,6 +419,8 @@ static struct ib_mr *iwch_register_phys_mem(struct ib_pd *pd, if (!mhp) return ERR_PTR(-ENOMEM); + mhp->rhp = rhp; + /* First check that we have enough alignment */ if ((*iova_start & ~PAGE_MASK) != (buffer_list[0].addr & ~PAGE_MASK)) { ret = -EINVAL; @@ -528,7 +438,17 @@ static struct ib_mr *iwch_register_phys_mem(struct ib_pd *pd, if (ret) goto err; - mhp->rhp = rhp; + ret = iwch_alloc_pbl(mhp, npages); + if (ret) { + cxfree(page_list); + goto err_pbl; + } + + ret = iwch_write_pbl(mhp, page_list, npages, 0); + cxfree(page_list); + if (ret) + goto err; + mhp->attr.pdid = php->pdid; mhp->attr.zbva = 0; @@ -538,15 +458,18 @@ static struct ib_mr *iwch_register_phys_mem(struct ib_pd *pd, mhp->attr.len = (u32) total_size; mhp->attr.pbl_size = npages; - ret = iwch_register_mem(rhp, php, mhp, shift, page_list); - cxfree(page_list); - if (ret) { - goto err; - } + ret = iwch_register_mem(rhp, php, mhp, shift); + if (ret) + goto err_pbl; + return &mhp->ibmr; + +err_pbl: + iwch_free_pbl(mhp); + err: cxfree(mhp); - return ERR_PTR(-ret); + return ERR_PTR(ret); } @@ -570,7 +493,7 @@ static int iwch_reregister_phys_mem(struct ib_mr *mr, CTR3(KTR_IW_CXGB, "%s ib_mr %p ib_pd %p", __FUNCTION__, mr, pd); /* There can be no memory windows */ - if (atomic_load_acq_int(&mr->usecnt)) + if (atomic_load_acq_int(&mr->usecnt.counter)) return (-EINVAL); mhp = to_iwch_mr(mr); @@ -596,7 +519,7 @@ static int iwch_reregister_phys_mem(struct ib_mr *mr, return ret; } - ret = iwch_reregister_mem(rhp, php, &mh, shift, page_list, npages); + ret = iwch_reregister_mem(rhp, php, &mh, shift, npages); cxfree(page_list); if (ret) { return ret; @@ -640,7 +563,9 @@ static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, if (!mhp) return ERR_PTR(-ENOMEM); - mhp->umem = ib_umem_get(pd->uobject->context, start, length, acc); + mhp->rhp = rhp; + + mhp->umem = ib_umem_get(pd->uobject->context, start, length, acc, 0); if (IS_ERR(mhp->umem)) { err = PTR_ERR(mhp->umem); cxfree(mhp); @@ -650,18 +575,22 @@ static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, shift = ffs(mhp->umem->page_size) - 1; n = 0; - TAILQ_FOREACH(chunk, &mhp->umem->chunk_list, entry) + list_for_each_entry(chunk, &mhp->umem->chunk_list, list) n += chunk->nents; - pages = kmalloc(n * sizeof(u64), M_NOWAIT); + err = iwch_alloc_pbl(mhp, n); + if (err) + goto err; + + pages = (__be64 *) kmalloc(n * sizeof(u64), M_NOWAIT); if (!pages) { err = -ENOMEM; - goto err; + goto err_pbl; } i = n = 0; -#if 0 +#ifdef notyet TAILQ_FOREACH(chunk, &mhp->umem->chunk_list, entry) for (j = 0; j < chunk->nmap; ++j) { len = sg_dma_len(&chunk->page_list[j]) >> shift; @@ -669,21 +598,36 @@ static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, pages[i++] = htobe64(sg_dma_address( &chunk->page_list[j]) + mhp->umem->page_size * k); + if (i == PAGE_SIZE / sizeof *pages) { + err = iwch_write_pbl(mhp, pages, i, n); + if (err) + goto pbl_done; + n += i; + i = 0; + } } } #endif - mhp->rhp = rhp; + + if (i) + err = iwch_write_pbl(mhp, pages, i, n); +#ifdef notyet +pbl_done: +#endif + cxfree(pages); + if (err) + goto err_pbl; + mhp->attr.pdid = php->pdid; mhp->attr.zbva = 0; mhp->attr.perms = iwch_ib_to_tpt_access(acc); mhp->attr.va_fbo = virt; mhp->attr.page_size = shift - 12; mhp->attr.len = (u32) length; - mhp->attr.pbl_size = i; - err = iwch_register_mem(rhp, php, mhp, shift, pages); - cxfree(pages); + + err = iwch_register_mem(rhp, php, mhp, shift); if (err) - goto err; + goto err_pbl; if (udata && !t3a_device(rhp)) { uresp.pbl_addr = (mhp->attr.pbl_addr - @@ -700,6 +644,9 @@ static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, return &mhp->ibmr; +err_pbl: + iwch_free_pbl(mhp); + err: ib_umem_release(mhp->umem); cxfree(mhp); @@ -748,7 +695,12 @@ static struct ib_mw *iwch_alloc_mw(struct ib_pd *pd) mhp->attr.type = TPT_MW; mhp->attr.stag = stag; mmid = (stag) >> 8; - insert_handle(rhp, &rhp->mmidr, mhp, mmid); + mhp->ibmw.rkey = stag; + if (insert_handle(rhp, &rhp->mmidr, mhp, mmid)) { + cxio_deallocate_window(&rhp->rdev, mhp->attr.stag); + cxfree(mhp); + return ERR_PTR(-ENOMEM); + } CTR4(KTR_IW_CXGB, "%s mmid 0x%x mhp %p stag 0x%x", __FUNCTION__, mmid, mhp, stag); return &(mhp->ibmw); } @@ -893,7 +845,13 @@ static struct ib_qp *iwch_create_qp(struct ib_pd *pd, mtx_init(&qhp->lock, "cxgb qp", NULL, MTX_DEF|MTX_DUPOK); qhp->refcnt = 1; - insert_handle(rhp, &rhp->qpidr, qhp, qhp->wq.qpid); + + if (insert_handle(rhp, &rhp->qpidr, qhp, qhp->wq.qpid)) { + cxio_destroy_qp(&rhp->rdev, &qhp->wq, + ucontext ? &ucontext->uctx : &rhp->rdev.uctx); + cxfree(qhp); + return ERR_PTR(-ENOMEM); + } if (udata) { @@ -1023,12 +981,14 @@ static int iwch_query_gid(struct ib_device *ibdev, u8 port, { struct iwch_dev *dev; struct port_info *pi; + struct adapter *sc; CTR5(KTR_IW_CXGB, "%s ibdev %p, port %d, index %d, gid %p", __FUNCTION__, ibdev, port, index, gid); dev = to_iwch_dev(ibdev); + sc = dev->rdev.adap; PANIC_IF(port == 0 || port > 2); - pi = ((struct port_info *)dev->rdev.port_info.lldevs[port-1]->if_softc); + pi = &sc->port[port - 1]; memset(&(gid->raw[0]), 0, sizeof(gid->raw)); memcpy(&(gid->raw[0]), pi->hw_addr, 6); return 0; @@ -1037,21 +997,20 @@ static int iwch_query_gid(struct ib_device *ibdev, u8 port, static int iwch_query_device(struct ib_device *ibdev, struct ib_device_attr *props) { - struct iwch_dev *dev; + struct adapter *sc; + CTR2(KTR_IW_CXGB, "%s ibdev %p", __FUNCTION__, ibdev); dev = to_iwch_dev(ibdev); + sc = dev->rdev.adap; memset(props, 0, sizeof *props); -#ifdef notyet - memcpy(&props->sys_image_guid, dev->rdev.t3cdev_p->lldev->if_addr.ifa_addr, 6); -#endif + memcpy(&props->sys_image_guid, sc->port[0].hw_addr, 6); props->device_cap_flags = dev->device_cap_flags; -#ifdef notyet - props->vendor_id = (u32)dev->rdev.rnic_info.pdev->vendor; - props->vendor_part_id = (u32)dev->rdev.rnic_info.pdev->device; -#endif - props->max_mr_size = ~0ull; + props->page_size_cap = dev->attr.mem_pgsizes_bitmask; + props->vendor_id = pci_get_vendor(sc->dev); + props->vendor_part_id = pci_get_device(sc->dev); + props->max_mr_size = dev->attr.max_mr_size; props->max_qp = dev->attr.max_qps; props->max_qp_wr = dev->attr.max_wrs; props->max_sge = dev->attr.max_sge_per_wr; @@ -1071,13 +1030,10 @@ static int iwch_query_port(struct ib_device *ibdev, u8 port, struct ib_port_attr *props) { CTR2(KTR_IW_CXGB, "%s ibdev %p", __FUNCTION__, ibdev); + memset(props, 0, sizeof(struct ib_port_attr)); props->max_mtu = IB_MTU_4096; - props->lid = 0; - props->lmc = 0; - props->sm_lid = 0; - props->sm_sl = 0; + props->active_mtu = IB_MTU_2048; props->state = IB_PORT_ACTIVE; - props->phys_state = 0; props->port_cap_flags = IB_PORT_CM_SUP | IB_PORT_SNMP_TUNNEL_SUP | @@ -1086,7 +1042,6 @@ static int iwch_query_port(struct ib_device *ibdev, IB_PORT_VENDOR_CLASS_SUP | IB_PORT_BOOT_MGMT_SUP; props->gid_tbl_len = 1; props->pkey_tbl_len = 1; - props->qkey_viol_cntr = 0; props->active_width = 2; props->active_speed = 2; props->max_msg_sz = -1; @@ -1094,80 +1049,18 @@ static int iwch_query_port(struct ib_device *ibdev, return 0; } -#ifdef notyet -static ssize_t show_rev(struct class_device *cdev, char *buf) -{ - struct iwch_dev *dev = container_of(cdev, struct iwch_dev, - ibdev.class_dev); - CTR2(KTR_IW_CXGB, "%s class dev 0x%p", __FUNCTION__, cdev); - return sprintf(buf, "%d\n", dev->rdev.t3cdev_p->type); -} - -static ssize_t show_fw_ver(struct class_device *cdev, char *buf) -{ - struct iwch_dev *dev = container_of(cdev, struct iwch_dev, - ibdev.class_dev); - struct ethtool_drvinfo info; - struct net_device *lldev = dev->rdev.t3cdev_p->lldev; - - CTR2(KTR_IW_CXGB, "%s class dev 0x%p", __FUNCTION__, cdev); - lldev->ethtool_ops->get_drvinfo(lldev, &info); - return sprintf(buf, "%s\n", info.fw_version); -} - -static ssize_t show_hca(struct class_device *cdev, char *buf) -{ - struct iwch_dev *dev = container_of(cdev, struct iwch_dev, - ibdev.class_dev); - struct ethtool_drvinfo info; - struct net_device *lldev = dev->rdev.t3cdev_p->lldev; - - CTR2(KTR_IW_CXGB, "%s class dev 0x%p", __FUNCTION__, cdev); - lldev->ethtool_ops->get_drvinfo(lldev, &info); - return sprintf(buf, "%s\n", info.driver); -} - -static ssize_t show_board(struct class_device *cdev, char *buf) -{ - struct iwch_dev *dev = container_of(cdev, struct iwch_dev, - ibdev.class_dev); - CTR2(KTR_IW_CXGB, "%s class dev 0x%p", __FUNCTION__, dev); -#ifdef notyet - return sprintf(buf, "%x.%x\n", dev->rdev.rnic_info.pdev->vendor, - dev->rdev.rnic_info.pdev->device); -#else - return sprintf(buf, "%x.%x\n", 0xdead, 0xbeef); /* XXX */ -#endif -} - -static CLASS_DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL); -static CLASS_DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL); -static CLASS_DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL); -static CLASS_DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL); - -static struct class_device_attribute *iwch_class_attributes[] = { - &class_device_attr_hw_rev, - &class_device_attr_fw_ver, - &class_device_attr_hca_type, - &class_device_attr_board_id -}; -#endif - int iwch_register_device(struct iwch_dev *dev) { int ret; -#ifdef notyet - int i; -#endif + struct adapter *sc = dev->rdev.adap; + CTR2(KTR_IW_CXGB, "%s iwch_dev %p", __FUNCTION__, dev); strlcpy(dev->ibdev.name, "cxgb3_%d", IB_DEVICE_NAME_MAX); memset(&dev->ibdev.node_guid, 0, sizeof(dev->ibdev.node_guid)); -#ifdef notyet - memcpy(&dev->ibdev.node_guid, dev->rdev.t3cdev_p->lldev->dev_addr, 6); -#endif + memcpy(&dev->ibdev.node_guid, sc->port[0].hw_addr, 6); dev->device_cap_flags = - (IB_DEVICE_ZERO_STAG | - IB_DEVICE_SEND_W_INV | IB_DEVICE_MEM_WINDOW); + (IB_DEVICE_LOCAL_DMA_LKEY | + IB_DEVICE_MEM_WINDOW); dev->ibdev.uverbs_cmd_mask = (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) | @@ -1189,9 +1082,9 @@ int iwch_register_device(struct iwch_dev *dev) (1ull << IB_USER_VERBS_CMD_POST_RECV); dev->ibdev.node_type = RDMA_NODE_RNIC; memcpy(dev->ibdev.node_desc, IWCH_NODE_DESC, sizeof(IWCH_NODE_DESC)); - dev->ibdev.phys_port_cnt = dev->rdev.port_info.nports; + dev->ibdev.phys_port_cnt = sc->params.nports; dev->ibdev.num_comp_vectors = 1; - dev->ibdev.dma_device = dev->rdev.rnic_info.pdev; + dev->ibdev.dma_device = dev->rdev.adap->dev; dev->ibdev.query_device = iwch_query_device; dev->ibdev.query_port = iwch_query_port; dev->ibdev.modify_port = iwch_modify_port; @@ -1199,9 +1092,7 @@ int iwch_register_device(struct iwch_dev *dev) dev->ibdev.query_gid = iwch_query_gid; dev->ibdev.alloc_ucontext = iwch_alloc_ucontext; dev->ibdev.dealloc_ucontext = iwch_dealloc_ucontext; -#ifdef notyet dev->ibdev.mmap = iwch_mmap; -#endif dev->ibdev.alloc_pd = iwch_allocate_pd; dev->ibdev.dealloc_pd = iwch_deallocate_pd; dev->ibdev.create_ah = iwch_ah_create; @@ -1229,11 +1120,13 @@ int iwch_register_device(struct iwch_dev *dev) dev->ibdev.req_notify_cq = iwch_arm_cq; dev->ibdev.post_send = iwch_post_send; dev->ibdev.post_recv = iwch_post_receive; - + dev->ibdev.uverbs_abi_ver = IWCH_UVERBS_ABI_VERSION; dev->ibdev.iwcm = - (struct iw_cm_verbs *) kmalloc(sizeof(struct iw_cm_verbs), - M_NOWAIT); + kmalloc(sizeof(struct iw_cm_verbs), M_NOWAIT); + if (!dev->ibdev.iwcm) + return (ENOMEM); + dev->ibdev.iwcm->connect = iwch_connect; dev->ibdev.iwcm->accept = iwch_accept_cr; dev->ibdev.iwcm->reject = iwch_reject_cr; @@ -1246,35 +1139,19 @@ int iwch_register_device(struct iwch_dev *dev) ret = ib_register_device(&dev->ibdev); if (ret) goto bail1; -#ifdef notyet - for (i = 0; i < ARRAY_SIZE(iwch_class_attributes); ++i) { - ret = class_device_create_file(&dev->ibdev.class_dev, - iwch_class_attributes[i]); - if (ret) { - goto bail2; - } - } -#endif - return 0; -#ifdef notyet -bail2: -#endif - ib_unregister_device(&dev->ibdev); + + return (0); + bail1: - return ret; + cxfree(dev->ibdev.iwcm); + return (ret); } void iwch_unregister_device(struct iwch_dev *dev) { -#ifdef notyet - int i; - CTR2(KTR_IW_CXGB, "%s iwch_dev %p", __FUNCTION__, dev); - - for (i = 0; i < ARRAY_SIZE(iwch_class_attributes); ++i) - class_device_remove_file(&dev->ibdev.class_dev, - iwch_class_attributes[i]); -#endif ib_unregister_device(&dev->ibdev); + cxfree(dev->ibdev.iwcm); return; } +#endif diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.h b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.h index c857ce8e5b8..2e012fd2834 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.h +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.h @@ -31,7 +31,7 @@ $FreeBSD$ #ifndef __IWCH_PROVIDER_H__ #define __IWCH_PROVIDER_H__ -#include +#include struct iwch_pd { struct ib_pd ibpd; @@ -116,6 +116,7 @@ enum IWCH_QP_FLAGS { }; struct iwch_mpa_attributes { + u8 initiator; u8 recv_marker_enabled; u8 xmit_marker_enabled; /* iWARP: enable inbound Read Resp. */ u8 crc_enabled; @@ -336,18 +337,17 @@ int iwch_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc); int iwch_post_terminate(struct iwch_qp *qhp, struct respQ_msg_t *rsp_msg); int iwch_register_device(struct iwch_dev *dev); void iwch_unregister_device(struct iwch_dev *dev); -int iwch_quiesce_qps(struct iwch_cq *chp); -int iwch_resume_qps(struct iwch_cq *chp); void stop_read_rep_timer(struct iwch_qp *qhp); int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php, struct iwch_mr *mhp, - int shift, - __be64 *page_list); + int shift); int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php, struct iwch_mr *mhp, int shift, - __be64 *page_list, int npages); +int iwch_alloc_pbl(struct iwch_mr *mhp, int npages); +void iwch_free_pbl(struct iwch_mr *mhp); +int iwch_write_pbl(struct iwch_mr *mhp, __be64 *pages, int npages, int offset); int build_phys_page_list(struct ib_phys_buf *buffer_list, int num_phys_buf, u64 *iova_start, diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c index fd514987817..7734fd02976 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c @@ -1,4 +1,3 @@ - /************************************************************************** Copyright (c) 2007, Chelsio Inc. @@ -30,11 +29,13 @@ POSSIBILITY OF SUCH DAMAGE. #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD #include #include #include #include -#include #include #include #include @@ -48,6 +49,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -57,14 +59,26 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include +#include #include #include #include @@ -75,7 +89,7 @@ __FBSDID("$FreeBSD$"); #define NO_SUPPORT -1 -static int iwch_build_rdma_send(union t3_wr *wqe, struct ib_send_wr *wr, +static int build_rdma_send(union t3_wr *wqe, struct ib_send_wr *wr, u8 * flit_cnt) { int i; @@ -83,59 +97,46 @@ static int iwch_build_rdma_send(union t3_wr *wqe, struct ib_send_wr *wr, switch (wr->opcode) { case IB_WR_SEND: - case IB_WR_SEND_WITH_IMM: if (wr->send_flags & IB_SEND_SOLICITED) wqe->send.rdmaop = T3_SEND_WITH_SE; else wqe->send.rdmaop = T3_SEND; wqe->send.rem_stag = 0; break; -#if 0 /* Not currently supported */ - case TYPE_SEND_INVALIDATE: - case TYPE_SEND_INVALIDATE_IMMEDIATE: - wqe->send.rdmaop = T3_SEND_WITH_INV; - wqe->send.rem_stag = htobe32(wr->wr.rdma.rkey); + case IB_WR_SEND_WITH_IMM: + if (wr->send_flags & IB_SEND_SOLICITED) + wqe->send.rdmaop = T3_SEND_WITH_SE_INV; + else + wqe->send.rdmaop = T3_SEND_WITH_INV; + wqe->send.rem_stag = 0; break; - case TYPE_SEND_SE_INVALIDATE: - wqe->send.rdmaop = T3_SEND_WITH_SE_INV; - wqe->send.rem_stag = htobe32(wr->wr.rdma.rkey); - break; -#endif default: - break; + return -EINVAL; } if (wr->num_sge > T3_MAX_SGE) return (-EINVAL); wqe->send.reserved[0] = 0; wqe->send.reserved[1] = 0; wqe->send.reserved[2] = 0; - if (wr->opcode == IB_WR_SEND_WITH_IMM) { - plen = 4; - wqe->send.sgl[0].stag = wr->imm_data; - wqe->send.sgl[0].len = 0; - wqe->send.num_sgle = 0; - *flit_cnt = 5; - } else { - plen = 0; - for (i = 0; i < wr->num_sge; i++) { - if ((plen + wr->sg_list[i].length) < plen) { - return (-EMSGSIZE); - } - plen += wr->sg_list[i].length; - wqe->send.sgl[i].stag = - htobe32(wr->sg_list[i].lkey); - wqe->send.sgl[i].len = - htobe32(wr->sg_list[i].length); - wqe->send.sgl[i].to = htobe64(wr->sg_list[i].addr); + plen = 0; + for (i = 0; i < wr->num_sge; i++) { + if ((plen + wr->sg_list[i].length) < plen) { + return (-EMSGSIZE); } - wqe->send.num_sgle = htobe32(wr->num_sge); - *flit_cnt = 4 + ((wr->num_sge) << 1); + plen += wr->sg_list[i].length; + wqe->send.sgl[i].stag = + htobe32(wr->sg_list[i].lkey); + wqe->send.sgl[i].len = + htobe32(wr->sg_list[i].length); + wqe->send.sgl[i].to = htobe64(wr->sg_list[i].addr); } + wqe->send.num_sgle = htobe32(wr->num_sge); + *flit_cnt = 4 + ((wr->num_sge) << 1); wqe->send.plen = htobe32(plen); return 0; } -static int iwch_build_rdma_write(union t3_wr *wqe, struct ib_send_wr *wr, +static int build_rdma_write(union t3_wr *wqe, struct ib_send_wr *wr, u8 *flit_cnt) { int i; @@ -152,7 +153,7 @@ static int iwch_build_rdma_write(union t3_wr *wqe, struct ib_send_wr *wr, if (wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM) { plen = 4; - wqe->write.sgl[0].stag = wr->imm_data; + wqe->write.sgl[0].stag = wr->ex.imm_data; wqe->write.sgl[0].len = 0; wqe->write.num_sgle = 0; *flit_cnt = 6; @@ -177,7 +178,7 @@ static int iwch_build_rdma_write(union t3_wr *wqe, struct ib_send_wr *wr, return 0; } -static int iwch_build_rdma_read(union t3_wr *wqe, struct ib_send_wr *wr, +static int build_rdma_read(union t3_wr *wqe, struct ib_send_wr *wr, u8 *flit_cnt) { if (wr->num_sge > 1) @@ -195,15 +196,12 @@ static int iwch_build_rdma_read(union t3_wr *wqe, struct ib_send_wr *wr, return 0; } -/* - * TBD: this is going to be moved to firmware. Missing pdid/qpid check for now. - */ static int iwch_sgl2pbl_map(struct iwch_dev *rhp, struct ib_sge *sg_list, u32 num_sgle, u32 * pbl_addr, u8 * page_size) { int i; struct iwch_mr *mhp; - u32 offset; + u64 offset; for (i = 0; i < num_sgle; i++) { mhp = get_mhp(rhp, (sg_list[i].lkey) >> 8); @@ -235,8 +233,8 @@ static int iwch_sgl2pbl_map(struct iwch_dev *rhp, struct ib_sge *sg_list, return (-EINVAL); } offset = sg_list[i].addr - mhp->attr.va_fbo; - offset += ((u32) mhp->attr.va_fbo) % - (1UL << (12 + mhp->attr.page_size)); + offset += mhp->attr.va_fbo & + ((1UL << (12 + mhp->attr.page_size)) - 1); pbl_addr[i] = ((mhp->attr.pbl_addr - rhp->rdev.rnic_info.pbl_base) >> 3) + (offset >> (12 + mhp->attr.page_size)); @@ -245,26 +243,113 @@ static int iwch_sgl2pbl_map(struct iwch_dev *rhp, struct ib_sge *sg_list, return 0; } -static int iwch_build_rdma_recv(struct iwch_dev *rhp, union t3_wr *wqe, +static int build_rdma_recv(struct iwch_qp *qhp, union t3_wr *wqe, struct ib_recv_wr *wr) { - int i; - if (wr->num_sge > T3_MAX_SGE) + int i, err = 0; + u32 pbl_addr[T3_MAX_SGE]; + u8 page_size[T3_MAX_SGE]; + + if (wr->num_sge > T3_MAX_SGE) return (-EINVAL); + + + err = iwch_sgl2pbl_map(qhp->rhp, wr->sg_list, wr->num_sge, pbl_addr, + page_size); + if (err) + return err; + wqe->recv.pagesz[0] = page_size[0]; + wqe->recv.pagesz[1] = page_size[1]; + wqe->recv.pagesz[2] = page_size[2]; + wqe->recv.pagesz[3] = page_size[3]; wqe->recv.num_sgle = htobe32(wr->num_sge); + for (i = 0; i < wr->num_sge; i++) { wqe->recv.sgl[i].stag = htobe32(wr->sg_list[i].lkey); wqe->recv.sgl[i].len = htobe32(wr->sg_list[i].length); - wqe->recv.sgl[i].to = htobe64(wr->sg_list[i].addr); + wqe->recv.sgl[i].to = htobe64(((u32)wr->sg_list[i].addr) & + ((1UL << (12 + page_size[i])) - 1)); + /* pbl_addr is the adapters address in the PBL */ + wqe->recv.pbl_addr[i] = cpu_to_be32(pbl_addr[i]); } for (; i < T3_MAX_SGE; i++) { wqe->recv.sgl[i].stag = 0; wqe->recv.sgl[i].len = 0; wqe->recv.sgl[i].to = 0; + wqe->recv.pbl_addr[i] = 0; } + + qhp->wq.rq[Q_PTR2IDX(qhp->wq.rq_wptr, + qhp->wq.rq_size_log2)].wr_id = wr->wr_id; + qhp->wq.rq[Q_PTR2IDX(qhp->wq.rq_wptr, + qhp->wq.rq_size_log2)].pbl_addr = 0; + return 0; } +static int build_zero_stag_recv(struct iwch_qp *qhp, union t3_wr *wqe, + struct ib_recv_wr *wr) +{ + int i; + u32 pbl_addr; + u32 pbl_offset; + + + /* + * The T3 HW requires the PBL in the HW recv descriptor to reference + * a PBL entry. So we allocate the max needed PBL memory here and pass + * it to the uP in the recv WR. The uP will build the PBL and setup + * the HW recv descriptor. + */ + pbl_addr = cxio_hal_pblpool_alloc(&qhp->rhp->rdev, T3_STAG0_PBL_SIZE); + if (!pbl_addr) + return -ENOMEM; + + /* + * Compute the 8B aligned offset. + */ + pbl_offset = (pbl_addr - qhp->rhp->rdev.rnic_info.pbl_base) >> 3; + + wqe->recv.num_sgle = cpu_to_be32(wr->num_sge); + + for (i = 0; i < wr->num_sge; i++) { + + /* + * Use a 128MB page size. This and an imposed 128MB + * sge length limit allows us to require only a 2-entry HW + * PBL for each SGE. This restriction is acceptable since + * since it is not possible to allocate 128MB of contiguous + * DMA coherent memory! + */ + if (wr->sg_list[i].length > T3_STAG0_MAX_PBE_LEN) + return -EINVAL; + wqe->recv.pagesz[i] = T3_STAG0_PAGE_SHIFT; + + /* + * T3 restricts a recv to all zero-stag or all non-zero-stag. + */ + if (wr->sg_list[i].lkey != 0) + return -EINVAL; + wqe->recv.sgl[i].stag = 0; + wqe->recv.sgl[i].len = htobe32(wr->sg_list[i].length); + wqe->recv.sgl[i].to = htobe64(wr->sg_list[i].addr); + wqe->recv.pbl_addr[i] = htobe32(pbl_offset); + pbl_offset += 2; + } + for (; i < T3_MAX_SGE; i++) { + wqe->recv.pagesz[i] = 0; + wqe->recv.sgl[i].stag = 0; + wqe->recv.sgl[i].len = 0; + wqe->recv.sgl[i].to = 0; + wqe->recv.pbl_addr[i] = 0; + } + qhp->wq.rq[Q_PTR2IDX(qhp->wq.rq_wptr, + qhp->wq.rq_size_log2)].wr_id = wr->wr_id; + qhp->wq.rq[Q_PTR2IDX(qhp->wq.rq_wptr, + qhp->wq.rq_size_log2)].pbl_addr = pbl_addr; + return 0; +} + int iwch_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, struct ib_send_wr **bad_wr) { @@ -282,18 +367,19 @@ int iwch_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, mtx_lock(&qhp->lock); if (qhp->attr.state > IWCH_QP_STATE_RTS) { mtx_unlock(&qhp->lock); - return (-EINVAL); + err = -EINVAL; + goto out; } num_wrs = Q_FREECNT(qhp->wq.sq_rptr, qhp->wq.sq_wptr, qhp->wq.sq_size_log2); - if (num_wrs <= 0) { + if (num_wrs == 0) { mtx_unlock(&qhp->lock); - return (-ENOMEM); + err = -EINVAL; + goto out; } while (wr) { if (num_wrs == 0) { err = -ENOMEM; - *bad_wr = wr; break; } idx = Q_PTR2IDX(qhp->wq.wptr, qhp->wq.size_log2); @@ -311,17 +397,17 @@ int iwch_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, case IB_WR_SEND: case IB_WR_SEND_WITH_IMM: t3_wr_opcode = T3_WR_SEND; - err = iwch_build_rdma_send(wqe, wr, &t3_wr_flit_cnt); + err = build_rdma_send(wqe, wr, &t3_wr_flit_cnt); break; case IB_WR_RDMA_WRITE: case IB_WR_RDMA_WRITE_WITH_IMM: t3_wr_opcode = T3_WR_WRITE; - err = iwch_build_rdma_write(wqe, wr, &t3_wr_flit_cnt); + err = build_rdma_write(wqe, wr, &t3_wr_flit_cnt); break; case IB_WR_RDMA_READ: t3_wr_opcode = T3_WR_READ; t3_wr_flags = 0; /* T3 reads are always signaled */ - err = iwch_build_rdma_read(wqe, wr, &t3_wr_flit_cnt); + err = build_rdma_read(wqe, wr, &t3_wr_flit_cnt); if (err) break; sqp->read_len = wqe->read.local_len; @@ -333,10 +419,9 @@ int iwch_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, wr->opcode); err = -EINVAL; } - if (err) { - *bad_wr = wr; + if (err) break; - } + wqe->send.wrid.id0.hi = qhp->wq.sq_wptr; sqp->wr_id = wr->wr_id; sqp->opcode = wr2opcode(t3_wr_opcode); @@ -358,6 +443,9 @@ int iwch_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, } mtx_unlock(&qhp->lock); ring_doorbell(qhp->wq.doorbell, qhp->wq.qpid); +out: + if (err) + *bad_wr = wr; return err; } @@ -374,27 +462,35 @@ int iwch_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr, mtx_lock(&qhp->lock); if (qhp->attr.state > IWCH_QP_STATE_RTS) { mtx_unlock(&qhp->lock); - return (-EINVAL); + err = -EINVAL; + goto out; } num_wrs = Q_FREECNT(qhp->wq.rq_rptr, qhp->wq.rq_wptr, qhp->wq.rq_size_log2) - 1; if (!wr) { mtx_unlock(&qhp->lock); - return (-EINVAL); + err = -EINVAL; + goto out; } + while (wr) { + if (wr->num_sge > T3_MAX_SGE) { + err = -EINVAL; + break; + } + idx = Q_PTR2IDX(qhp->wq.wptr, qhp->wq.size_log2); wqe = (union t3_wr *) (qhp->wq.queue + idx); - if (num_wrs) - err = iwch_build_rdma_recv(qhp->rhp, wqe, wr); - else + if (num_wrs) { + if (wr->sg_list[0].lkey) + err = build_rdma_recv(qhp, wqe, wr); + else + err = build_zero_stag_recv(qhp, wqe, wr); + } else err = -ENOMEM; - if (err) { - *bad_wr = wr; + if (err) break; - } - qhp->wq.rq[Q_PTR2IDX(qhp->wq.rq_wptr, qhp->wq.rq_size_log2)] = - wr->wr_id; + build_fw_riwrh((void *) wqe, T3_WR_RCV, T3_COMPLETION_FLAG, Q_GENBIT(qhp->wq.wptr, qhp->wq.size_log2), 0, sizeof(struct t3_receive_wr) >> 3); @@ -408,6 +504,9 @@ int iwch_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr, } mtx_unlock(&qhp->lock); ring_doorbell(qhp->wq.doorbell, qhp->wq.qpid); +out: + if (err) + *bad_wr = wr; return err; } @@ -439,7 +538,7 @@ int iwch_bind_mw(struct ib_qp *qp, } num_wrs = Q_FREECNT(qhp->wq.sq_rptr, qhp->wq.sq_wptr, qhp->wq.sq_size_log2); - if ((num_wrs) <= 0) { + if ((num_wrs) == 0) { mtx_unlock(&qhp->lock); return (-ENOMEM); } @@ -491,7 +590,7 @@ int iwch_bind_mw(struct ib_qp *qp, return err; } -static inline void build_term_codes(struct respQ_msg_t *rsp_msg, +static void build_term_codes(struct respQ_msg_t *rsp_msg, u8 *layer_type, u8 *ecode) { int status = TPT_ERR_INTERNAL_ERR; @@ -631,15 +730,18 @@ int iwch_post_terminate(struct iwch_qp *qhp, struct respQ_msg_t *rsp_msg) union t3_wr *wqe; struct terminate_message *term; struct mbuf *m; + struct ofld_hdr *oh; - CTR2(KTR_IW_CXGB, "%s %d", __FUNCTION__, __LINE__); - m = m_gethdr(MT_DATA, M_NOWAIT); - if (!m) { + CTR3(KTR_IW_CXGB, "%s: tid %u, %p", __func__, qhp->ep->hwtid, rsp_msg); + m = m_gethdr(M_NOWAIT, MT_DATA); + if (m == NULL) { log(LOG_ERR, "%s cannot send TERMINATE!\n", __FUNCTION__); return (-ENOMEM); } - wqe = mtod(m, union t3_wr *); - m->m_len = m->m_pkthdr.len = 40; + oh = mtod(m, struct ofld_hdr *); + m->m_pkthdr.len = m->m_len = sizeof(*oh) + 40; + oh->flags = V_HDR_NDESC(1) | V_HDR_CTRL(CPL_PRIORITY_DATA) | V_HDR_QSET(0); + wqe = (void *)(oh + 1); memset(wqe, 0, 40); wqe->send.rdmaop = T3_TERMINATE; @@ -653,22 +755,17 @@ int iwch_post_terminate(struct iwch_qp *qhp, struct respQ_msg_t *rsp_msg) V_FW_RIWR_FLAGS(T3_COMPLETION_FLAG | T3_NOTIFY_FLAG)); wqe->send.wrh.gen_tid_len = htobe32(V_FW_RIWR_TID(qhp->ep->hwtid)); - m_set_priority(m, CPL_PRIORITY_DATA); - m_set_sgl(m, NULL); - m_set_sgllen(m, 0); - return cxgb_ofld_send(qhp->rhp->rdev.t3cdev_p, m); + return t3_offload_tx(qhp->rhp->rdev.adap, m); } /* * Assumes qhp lock is held. */ -static void __flush_qp(struct iwch_qp *qhp) +static void __flush_qp(struct iwch_qp *qhp, struct iwch_cq *rchp, + struct iwch_cq *schp) { - struct iwch_cq *rchp, *schp; int count; - - rchp = get_chp(qhp->rhp, qhp->attr.rcq); - schp = get_chp(qhp->rhp, qhp->attr.scq); + int flushed; CTR4(KTR_IW_CXGB, "%s qhp %p rchp %p schp %p", __FUNCTION__, qhp, rchp, schp); /* take a ref on the qhp since we must release the lock */ @@ -680,20 +777,22 @@ static void __flush_qp(struct iwch_qp *qhp) mtx_lock(&qhp->lock); cxio_flush_hw_cq(&rchp->cq); cxio_count_rcqes(&rchp->cq, &qhp->wq, &count); - cxio_flush_rq(&qhp->wq, &rchp->cq, count); + flushed = cxio_flush_rq(&qhp->wq, &rchp->cq, count); mtx_unlock(&qhp->lock); mtx_unlock(&rchp->lock); - (*rchp->ibcq.comp_handler)(&rchp->ibcq, rchp->ibcq.cq_context); + if (flushed) + (*rchp->ibcq.comp_handler)(&rchp->ibcq, rchp->ibcq.cq_context); /* locking hierarchy: cq lock first, then qp lock. */ mtx_lock(&schp->lock); mtx_lock(&qhp->lock); cxio_flush_hw_cq(&schp->cq); cxio_count_scqes(&schp->cq, &qhp->wq, &count); - cxio_flush_sq(&qhp->wq, &schp->cq, count); + flushed = cxio_flush_sq(&qhp->wq, &schp->cq, count); mtx_unlock(&qhp->lock); mtx_unlock(&schp->lock); - (*schp->ibcq.comp_handler)(&schp->ibcq, schp->ibcq.cq_context); + if (flushed) + (*schp->ibcq.comp_handler)(&schp->ibcq, schp->ibcq.cq_context); /* deref */ mtx_lock(&qhp->lock); @@ -703,10 +802,23 @@ static void __flush_qp(struct iwch_qp *qhp) static void flush_qp(struct iwch_qp *qhp) { - if (qhp->ibqp.uobject) + struct iwch_cq *rchp, *schp; + + rchp = get_chp(qhp->rhp, qhp->attr.rcq); + schp = get_chp(qhp->rhp, qhp->attr.scq); + + if (qhp->ibqp.uobject) { cxio_set_wq_in_error(&qhp->wq); - else - __flush_qp(qhp); + cxio_set_cq_in_error(&rchp->cq); + (*rchp->ibcq.comp_handler)(&rchp->ibcq, rchp->ibcq.cq_context); + if (schp != rchp) { + cxio_set_cq_in_error(&schp->cq); + (*schp->ibcq.comp_handler)(&schp->ibcq, + schp->ibcq.cq_context); + } + return; + } + __flush_qp(qhp, rchp, schp); } @@ -715,7 +827,13 @@ static void flush_qp(struct iwch_qp *qhp) */ static int rqes_posted(struct iwch_qp *qhp) { - return fw_riwrh_opcode((struct fw_riwrh *)qhp->wq.queue) == T3_WR_RCV; + union t3_wr *wqe = qhp->wq.queue; + u16 count = 0; + while ((count+1) != 0 && fw_riwrh_opcode((struct fw_riwrh *)wqe) == T3_WR_RCV) { + count++; + wqe++; + } + return count; } static int rdma_init(struct iwch_dev *rhp, struct iwch_qp *qhp, @@ -724,6 +842,10 @@ static int rdma_init(struct iwch_dev *rhp, struct iwch_qp *qhp, { struct t3_rdma_init_attr init_attr; int ret; + struct socket *so = qhp->ep->com.so; + struct inpcb *inp = sotoinpcb(so); + struct tcpcb *tp; + struct toepcb *toep; init_attr.tid = qhp->ep->hwtid; init_attr.qpid = qhp->wq.qpid; @@ -737,32 +859,28 @@ static int rdma_init(struct iwch_dev *rhp, struct iwch_qp *qhp, (qhp->attr.mpa_attr.xmit_marker_enabled << 1) | (qhp->attr.mpa_attr.crc_enabled << 2); - /* - * XXX - The IWCM doesn't quite handle getting these - * attrs set before going into RTS. For now, just turn - * them on always... - */ -#if 0 - init_attr.qpcaps = qhp->attr.enableRdmaRead | - (qhp->attr.enableRdmaWrite << 1) | - (qhp->attr.enableBind << 2) | - (qhp->attr.enable_stag0_fastreg << 3) | - (qhp->attr.enable_stag0_fastreg << 4); -#else - init_attr.qpcaps = 0x1f; -#endif + init_attr.qpcaps = uP_RI_QP_RDMA_READ_ENABLE | + uP_RI_QP_RDMA_WRITE_ENABLE | + uP_RI_QP_BIND_ENABLE; + if (!qhp->ibqp.uobject) + init_attr.qpcaps |= uP_RI_QP_STAG0_ENABLE; init_attr.tcp_emss = qhp->ep->emss; init_attr.ord = qhp->attr.max_ord; init_attr.ird = qhp->attr.max_ird; init_attr.qp_dma_addr = qhp->wq.dma_addr; init_attr.qp_dma_size = (1UL << qhp->wq.size_log2); - init_attr.flags = rqes_posted(qhp) ? RECVS_POSTED : 0; + init_attr.rqe_count = rqes_posted(qhp); + init_attr.flags = qhp->attr.mpa_attr.initiator ? MPA_INITIATOR : 0; + init_attr.rtr_type = 0; + tp = intotcpcb(inp); + toep = tp->t_toe; + init_attr.chan = toep->tp_l2t->smt_idx; init_attr.irs = qhp->ep->rcv_seq; CTR5(KTR_IW_CXGB, "%s init_attr.rq_addr 0x%x init_attr.rq_size = %d " "flags 0x%x qpcaps 0x%x", __FUNCTION__, init_attr.rq_addr, init_attr.rq_size, init_attr.flags, init_attr.qpcaps); - ret = cxio_rdma_init(&rhp->rdev, &init_attr); + ret = cxio_rdma_init(&rhp->rdev, &init_attr, qhp->ep->com.so); CTR2(KTR_IW_CXGB, "%s ret %d", __FUNCTION__, ret); return ret; } @@ -870,8 +988,8 @@ int iwch_modify_qp(struct iwch_dev *rhp, struct iwch_qp *qhp, abort=0; disconnect = 1; ep = qhp->ep; + get_ep(&ep->com); } - flush_qp(qhp); break; case IWCH_QP_STATE_TERMINATE: qhp->attr.state = IWCH_QP_STATE_TERMINATE; @@ -886,6 +1004,7 @@ int iwch_modify_qp(struct iwch_dev *rhp, struct iwch_qp *qhp, abort=1; disconnect = 1; ep = qhp->ep; + get_ep(&ep->com); } goto err; break; @@ -901,6 +1020,7 @@ int iwch_modify_qp(struct iwch_dev *rhp, struct iwch_qp *qhp, } switch (attrs->next_state) { case IWCH_QP_STATE_IDLE: + flush_qp(qhp); qhp->attr.state = IWCH_QP_STATE_IDLE; qhp->attr.llp_stream_handle = NULL; put_ep(&qhp->ep->com); @@ -908,7 +1028,6 @@ int iwch_modify_qp(struct iwch_dev *rhp, struct iwch_qp *qhp, wakeup(qhp); break; case IWCH_QP_STATE_ERROR: - disconnect=1; goto err; default: ret = -EINVAL; @@ -960,81 +1079,29 @@ err: out: mtx_unlock(&qhp->lock); - if (terminate) + if (terminate) iwch_post_terminate(qhp, NULL); + /* * If disconnect is 1, then we need to initiate a disconnect * on the EP. This can be a normal close (RTS->CLOSING) or * an abnormal close (RTS/CLOSING->ERROR). */ - if (disconnect) + if (disconnect) { iwch_ep_disconnect(ep, abort, M_NOWAIT); - + put_ep(&ep->com); + } + /* * If free is 1, then we've disassociated the EP from the QP * and we need to dereference the EP. */ - if (free) + if (free) put_ep(&ep->com); + CTR2(KTR_IW_CXGB, "%s exit state %d", __FUNCTION__, qhp->attr.state); return ret; } - -static int quiesce_qp(struct iwch_qp *qhp) -{ - mtx_lock(&qhp->lock); - iwch_quiesce_tid(qhp->ep); - qhp->flags |= QP_QUIESCED; - mtx_unlock(&qhp->lock); - return 0; -} - -static int resume_qp(struct iwch_qp *qhp) -{ - mtx_lock(&qhp->lock); - iwch_resume_tid(qhp->ep); - qhp->flags &= ~QP_QUIESCED; - mtx_lock(&qhp->lock); - return 0; -} - -int iwch_quiesce_qps(struct iwch_cq *chp) -{ - int i; - struct iwch_qp *qhp; - - for (i=0; i < T3_MAX_NUM_QP; i++) { - qhp = get_qhp(chp->rhp, i); - if (!qhp) - continue; - if ((qhp->attr.rcq == chp->cq.cqid) && !qp_quiesced(qhp)) { - quiesce_qp(qhp); - continue; - } - if ((qhp->attr.scq == chp->cq.cqid) && !qp_quiesced(qhp)) - quiesce_qp(qhp); - } - return 0; -} - -int iwch_resume_qps(struct iwch_cq *chp) -{ - int i; - struct iwch_qp *qhp; - - for (i=0; i < T3_MAX_NUM_QP; i++) { - qhp = get_qhp(chp->rhp, i); - if (!qhp) - continue; - if ((qhp->attr.rcq == chp->cq.cqid) && qp_quiesced(qhp)) { - resume_qp(qhp); - continue; - } - if ((qhp->attr.scq == chp->cq.cqid) && qp_quiesced(qhp)) - resume_qp(qhp); - } - return 0; -} - +#endif diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_resource.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_resource.c index 62ffef5871b..a99bf664199 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_resource.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_resource.c @@ -29,11 +29,13 @@ POSSIBILITY OF SUCH DAMAGE. #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD #include #include #include #include -#include #include #include #include @@ -59,9 +61,11 @@ __FBSDID("$FreeBSD$"); #include -#include -#include -#include +#include +#include +#include +#include +#include #include #include @@ -369,3 +373,4 @@ void cxio_hal_rqtpool_destroy(struct cxio_rdev *rdev_p) { gen_pool_destroy(rdev_p->rqt_pool); } +#endif diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_user.h b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_user.h index 3086a6340a1..55a1006bbb1 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_user.h +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_user.h @@ -47,10 +47,18 @@ struct iwch_create_cq_req { uint64_t user_rptr_addr; }; +struct iwch_create_cq_resp_v0 { + __u64 key; + __u32 cqid; + __u32 size_log2; +}; + struct iwch_create_cq_resp { uint64_t key; uint32_t cqid; uint32_t size_log2; + __u32 memsize; + __u32 reserved; }; struct iwch_create_qp_resp { diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_wr.h b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_wr.h index bf8f2d609e0..8718aa061d7 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_wr.h +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_wr.h @@ -32,6 +32,9 @@ $FreeBSD$ #define __CXIO_WR_H__ #define T3_MAX_SGE 4 #define T3_MAX_INLINE 64 +#define T3_STAG0_PBL_SIZE (2 * T3_MAX_SGE << 3) +#define T3_STAG0_MAX_PBE_LEN (128 * 1024 * 1024) +#define T3_STAG0_PAGE_SHIFT 15 #define Q_EMPTY(rptr,wptr) ((rptr)==(wptr)) #define Q_FULL(rptr,wptr,size_log2) ( (((wptr)-(rptr))>>(size_log2)) && \ @@ -272,6 +275,22 @@ enum t3_qp_caps { uP_RI_QP_STAG0_ENABLE = 0x10 } __attribute__ ((packed)); +enum rdma_init_rtr_types { + RTR_READ = 1, + RTR_WRITE = 2, + RTR_SEND = 3, +}; + +#define S_RTR_TYPE 2 +#define M_RTR_TYPE 0x3 +#define V_RTR_TYPE(x) ((x) << S_RTR_TYPE) +#define G_RTR_TYPE(x) ((((x) >> S_RTR_TYPE)) & M_RTR_TYPE) + +#define S_CHAN 4 +#define M_CHAN 0x3 +#define V_CHAN(x) ((x) << S_CHAN) +#define G_CHAN(x) ((((x) >> S_CHAN)) & M_CHAN) + struct t3_rdma_init_attr { u32 tid; u32 qpid; @@ -287,8 +306,11 @@ struct t3_rdma_init_attr { u32 ird; u64 qp_dma_addr; u32 qp_dma_size; - u32 flags; + enum rdma_init_rtr_types rtr_type; + u16 flags; + u16 rqe_count; u32 irs; + u32 chan; }; struct t3_rdma_init_wr { @@ -303,13 +325,13 @@ struct t3_rdma_init_wr { u8 mpaattrs; /* 5 */ u8 qpcaps; __be16 ulpdu_size; - __be32 flags; /* bits 31-1 - reservered */ - /* bit 0 - set if RECV posted */ + __be16 flags_rtr_type; + __be16 rqe_count; __be32 ord; /* 6 */ __be32 ird; __be64 qp_dma_addr; /* 7 */ __be32 qp_dma_size; /* 8 */ - u32 irs; + __be32 irs; }; struct t3_genbit { @@ -318,7 +340,8 @@ struct t3_genbit { }; enum rdma_init_wr_flags { - RECVS_POSTED = 1, + MPA_INITIATOR = (1<<0), + PRIV_QP = (1<<1), }; union t3_wr { @@ -531,6 +554,12 @@ struct t3_cqe { #define CQE_STATUS(x) (G_CQE_STATUS(be32toh((x).header))) #define CQE_OPCODE(x) (G_CQE_OPCODE(be32toh((x).header))) +#define CQE_SEND_OPCODE(x)( \ + (G_CQE_OPCODE(be32_to_cpu((x).header)) == T3_SEND) || \ + (G_CQE_OPCODE(be32_to_cpu((x).header)) == T3_SEND_WITH_SE) || \ + (G_CQE_OPCODE(be32_to_cpu((x).header)) == T3_SEND_WITH_INV) || \ + (G_CQE_OPCODE(be32_to_cpu((x).header)) == T3_SEND_WITH_SE_INV)) + #define CQE_LEN(x) (be32toh((x).len)) /* used for RQ completion processing */ @@ -589,21 +618,23 @@ struct t3_swsq { uint64_t wr_id; struct t3_cqe cqe; uint32_t sq_wptr; - uint32_t read_len; + __be32 read_len; int opcode; int complete; int signaled; }; +struct t3_swrq { + __u64 wr_id; + __u32 pbl_addr; +}; + /* * A T3 WQ implements both the SQ and RQ. */ struct t3_wq { union t3_wr *queue; /* DMA accessable memory */ bus_addr_t dma_addr; /* DMA address for HW */ -#ifdef notyet - DECLARE_PCI_UNMAP_ADDR(mapping) /* unmap kruft */ -#endif u32 error; /* 1 once we go to ERROR */ u32 qpid; u32 wptr; /* idx to next available WR slot */ @@ -613,14 +644,15 @@ struct t3_wq { u32 sq_wptr; /* sq_wptr - sq_rptr == count of */ u32 sq_rptr; /* pending wrs */ u32 sq_size_log2; /* sq size */ - u64 *rq; /* SW RQ (holds consumer wr_ids */ + struct t3_swrq *rq; /* SW RQ (holds consumer wr_ids */ u32 rq_wptr; /* rq_wptr - rq_rptr == count of */ u32 rq_rptr; /* pending wrs */ - u64 *rq_oldest_wr; /* oldest wr on the SW RQ */ + struct t3_swrq *rq_oldest_wr; /* oldest wr on the SW RQ */ u32 rq_size_log2; /* rq size */ u32 rq_addr; /* rq adapter address */ - void /* __iomem */ *doorbell; /* kernel db */ + void *doorbell; /* kernel db */ u64 udb; /* user db if any */ + struct cxio_rdev *rdev; }; struct t3_cq { @@ -629,9 +661,6 @@ struct t3_cq { u32 wptr; u32 size_log2; bus_addr_t dma_addr; -#ifdef notyet - DECLARE_PCI_UNMAP_ADDR(mapping) -#endif struct t3_cqe *queue; struct t3_cqe *sw_queue; u32 sw_rptr; @@ -641,6 +670,22 @@ struct t3_cq { #define CQ_VLD_ENTRY(ptr,size_log2,cqe) (Q_GENBIT(ptr,size_log2) == \ CQE_GENBIT(*cqe)) +struct t3_cq_status_page { + u32 cq_err; +}; + +static inline int cxio_cq_in_error(struct t3_cq *cq) +{ + return ((struct t3_cq_status_page *) + &cq->queue[1 << cq->size_log2])->cq_err; +} + +static inline void cxio_set_cq_in_error(struct t3_cq *cq) +{ + ((struct t3_cq_status_page *) + &cq->queue[1 << cq->size_log2])->cq_err = 1; +} + static inline void cxio_set_wq_in_error(struct t3_wq *wq) { wq->queue->flit[13] = 1; diff --git a/sys/dev/cxgb/ulp/toecore/cxgb_toedev.h b/sys/dev/cxgb/ulp/toecore/cxgb_toedev.h deleted file mode 100644 index 398923a2e67..00000000000 --- a/sys/dev/cxgb/ulp/toecore/cxgb_toedev.h +++ /dev/null @@ -1,49 +0,0 @@ - -/************************************************************************** - -Copyright (c) 2007, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -$FreeBSD$ - -***************************************************************************/ - -#ifndef _CXGB_TOEDEV_H_ -#define _CXGB_TOEDEV_H_ -#include - - -/* offload type ids */ -enum { - TOE_ID_CHELSIO_T1 = 1, - TOE_ID_CHELSIO_T1C, - TOE_ID_CHELSIO_T2, - TOE_ID_CHELSIO_T3, - TOE_ID_CHELSIO_T3B, - TOE_ID_CHELSIO_T3C, -} - ; - -#endif diff --git a/sys/dev/cxgb/ulp/toecore/toedev.c b/sys/dev/cxgb/ulp/toecore/toedev.c deleted file mode 100644 index 01a7d902a56..00000000000 --- a/sys/dev/cxgb/ulp/toecore/toedev.c +++ /dev/null @@ -1,420 +0,0 @@ - -/************************************************************************** - -Copyright (c) 2007, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -***************************************************************************/ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - - -/* - * XXX - */ -#include -#include - -static struct mtx offload_db_lock; -static TAILQ_HEAD(, toedev) offload_dev_list; -static TAILQ_HEAD(, tom_info) offload_module_list; - -/* - * Returns the entry in the given table with the given offload id, or NULL - * if the id is not found. - */ -static const struct offload_id * -id_find(unsigned int id, const struct offload_id *table) -{ - for ( ; table->id; ++table) - if (table->id == id) - return table; - return NULL; -} - -/* - * Returns true if an offload device is presently attached to an offload module. - */ -static inline int -is_attached(const struct toedev *dev) -{ - return dev->tod_offload_mod != NULL; -} - -/* - * Try to attach a new offload device to an existing TCP offload module that - * can handle the device's offload id. Returns 0 if it succeeds. - * - * Must be called with the offload_db_lock held. - */ -static int -offload_attach(struct toedev *dev) -{ - struct tom_info *t; - - TAILQ_FOREACH(t, &offload_module_list, entry) { - const struct offload_id *entry; - - entry = id_find(dev->tod_ttid, t->ti_id_table); - if (entry && t->ti_attach(dev, entry) == 0) { - dev->tod_offload_mod = t; - return 0; - } - } - return (ENOPROTOOPT); -} - -/** - * register_tom - register a TCP Offload Module (TOM) - * @t: the offload module to register - * - * Register a TCP Offload Module (TOM). - */ -int -register_tom(struct tom_info *t) -{ - mtx_lock(&offload_db_lock); - toedev_registration_count++; - TAILQ_INSERT_HEAD(&offload_module_list, t, entry); - mtx_unlock(&offload_db_lock); - return 0; -} - -/** - * unregister_tom - unregister a TCP Offload Module (TOM) - * @t: the offload module to register - * - * Unregister a TCP Offload Module (TOM). Note that this does not affect any - * TOE devices to which the TOM is already attached. - */ -int -unregister_tom(struct tom_info *t) -{ - mtx_lock(&offload_db_lock); - TAILQ_REMOVE(&offload_module_list, t, entry); - mtx_unlock(&offload_db_lock); - return 0; -} - -/* - * Find an offload device by name. Must be called with offload_db_lock held. - */ -static struct toedev * -__find_offload_dev_by_name(const char *name) -{ - struct toedev *dev; - - TAILQ_FOREACH(dev, &offload_dev_list, entry) { - if (!strncmp(dev->tod_name, name, TOENAMSIZ)) - return dev; - } - return NULL; -} - -/* - * Returns true if an offload device is already registered. - * Must be called with the offload_db_lock held. - */ -static int -is_registered(const struct toedev *dev) -{ - struct toedev *d; - - TAILQ_FOREACH(d, &offload_dev_list, entry) { - if (d == dev) - return 1; - } - return 0; -} - -/* - * Finalize the name of an offload device by assigning values to any format - * strings in its name. - */ -static int -assign_name(struct toedev *dev, const char *name, int limit) -{ - int i; - - for (i = 0; i < limit; ++i) { - char s[TOENAMSIZ]; - - if (snprintf(s, sizeof(s), name, i) >= sizeof(s)) - return -1; /* name too long */ - if (!__find_offload_dev_by_name(s)) { - strcpy(dev->tod_name, s); - return 0; - } - } - return -1; -} - -/** - * register_toedev - register a TOE device - * @dev: the device - * @name: a name template for the device - * - * Register a TOE device and try to attach an appropriate TCP offload module - * to it. @name is a template that may contain at most one %d format - * specifier. - */ -int -register_toedev(struct toedev *dev, const char *name) -{ - int ret; - const char *p; - - /* - * Validate the name template. Only one %d allowed and name must be - * a valid filename so it can appear in sysfs. - */ - if (!name || !*name || !strcmp(name, ".") || !strcmp(name, "..") || - strchr(name, '/')) - return EINVAL; - - p = strchr(name, '%'); - if (p && (p[1] != 'd' || strchr(p + 2, '%'))) - return EINVAL; - - mtx_lock(&offload_db_lock); - if (is_registered(dev)) { /* device already registered */ - ret = EEXIST; - goto out; - } - - if ((ret = assign_name(dev, name, 32)) != 0) - goto out; - - dev->tod_offload_mod = NULL; - TAILQ_INSERT_TAIL(&offload_dev_list, dev, entry); -out: - mtx_unlock(&offload_db_lock); - return ret; -} - -/** - * unregister_toedev - unregister a TOE device - * @dev: the device - * - * Unregister a TOE device. The device must not be attached to an offload - * module. - */ -int -unregister_toedev(struct toedev *dev) -{ - int ret = 0; - - mtx_lock(&offload_db_lock); - if (!is_registered(dev)) { - ret = ENODEV; - goto out; - } - if (is_attached(dev)) { - ret = EBUSY; - goto out; - } - TAILQ_REMOVE(&offload_dev_list, dev, entry); -out: - mtx_unlock(&offload_db_lock); - return ret; -} - -/** - * activate_offload - activate an offload device - * @dev: the device - * - * Activate an offload device by locating an appropriate registered offload - * module. If no module is found the operation fails and may be retried at - * a later time. - */ -int -activate_offload(struct toedev *dev) -{ - int ret = 0; - - mtx_lock(&offload_db_lock); - if (!is_registered(dev)) - ret = ENODEV; - else if (!is_attached(dev)) - ret = offload_attach(dev); - mtx_unlock(&offload_db_lock); - return ret; -} - -/** - * toe_send - send a packet to a TOE device - * @dev: the device - * @m: the packet - * - * Sends an mbuf to a TOE driver after dealing with any active network taps. - */ -int -toe_send(struct toedev *dev, struct mbuf *m) -{ - int r; - - critical_enter(); /* XXX neccessary? */ - r = dev->tod_send(dev, m); - critical_exit(); - if (r) - BPF_MTAP(dev->tod_lldev, m); - return r; -} - -/** - * toe_receive_mbuf - process n received TOE packets - * @dev: the toe device - * @m: an array of offload packets - * @n: the number of offload packets - * - * Process an array of ingress offload packets. Each packet is forwarded - * to any active network taps and then passed to the toe device's receive - * method. We optimize passing packets to the receive method by passing - * it the whole array at once except when there are active taps. - */ -int -toe_receive_mbuf(struct toedev *dev, struct mbuf **m, int n) -{ - if (__predict_true(!bpf_peers_present(dev->tod_lldev->if_bpf))) - return dev->tod_recv(dev, m, n); - - for ( ; n; n--, m++) { - m[0]->m_pkthdr.rcvif = dev->tod_lldev; - BPF_MTAP(dev->tod_lldev, m[0]); - dev->tod_recv(dev, m, 1); - } - return 0; -} - -static inline int -ifnet_is_offload(const struct ifnet *ifp) -{ - return (ifp->if_flags & IFCAP_TOE); -} - -void -toe_arp_update(struct rtentry *rt) -{ - struct ifnet *ifp = rt->rt_ifp; - - if (ifp && ifnet_is_offload(ifp)) { - struct toedev *tdev = TOEDEV(ifp); - - if (tdev && tdev->tod_arp_update) - tdev->tod_arp_update(tdev, rt); - } -} - -/** - * offload_get_phys_egress - find the physical egress device - * @root_dev: the root device anchoring the search - * @so: the socket used to determine egress port in bonding mode - * @context: in bonding mode, indicates a connection set up or failover - * - * Given a root network device it returns the physical egress device that is a - * descendant of the root device. The root device may be either a physical - * device, in which case it is the device returned, or a virtual device, such - * as a VLAN or bonding device. In case of a bonding device the search - * considers the decisions of the bonding device given its mode to locate the - * correct egress device. - */ -struct ifnet * -offload_get_phys_egress(struct ifnet *root_dev, struct socket *so, int context) -{ - -#if 0 - while (root_dev && ifnet_is_offload(root_dev)) { - if (root_dev->tod_priv_flags & IFF_802_1Q_VLAN) - root_dev = VLAN_DEV_INFO(root_dev)->real_dev; - else if (root_dev->tod_flags & IFF_MASTER) - root_dev = toe_bond_get_slave(root_dev, sk, context); - else - break; - } -#endif - return root_dev; -} - -static int -toecore_load(module_t mod, int cmd, void *arg) -{ - int err = 0; - - switch (cmd) { - case MOD_LOAD: - mtx_init(&offload_db_lock, "toedev lock", NULL, MTX_DEF); - TAILQ_INIT(&offload_dev_list); - TAILQ_INIT(&offload_module_list); - break; - case MOD_QUIESCE: - break; - case MOD_UNLOAD: - mtx_lock(&offload_db_lock); - if (!TAILQ_EMPTY(&offload_dev_list) || - !TAILQ_EMPTY(&offload_module_list)) { - err = EBUSY; - mtx_unlock(&offload_db_lock); - break; - } - mtx_unlock(&offload_db_lock); - mtx_destroy(&offload_db_lock); - break; - case MOD_SHUTDOWN: - break; - default: - err = EOPNOTSUPP; - break; - } - - return (err); -} - - -static moduledata_t mod_data= { - "toecore", - toecore_load, - 0 -}; - -MODULE_VERSION(toecore, 1); -DECLARE_MODULE(toecore, mod_data, SI_SUB_EXEC, SI_ORDER_ANY); diff --git a/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c b/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c index e019c6148a4..16b5394a4be 100644 --- a/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c +++ b/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c @@ -1,35 +1,35 @@ -/************************************************************************** - -Copyright (c) 2007-2008, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -***************************************************************************/ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD #include #include #include @@ -42,22 +42,17 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include #include #include - -#if __FreeBSD_version < 800044 -#define V_tcp_do_autosndbuf tcp_do_autosndbuf -#define V_tcp_autosndbuf_max tcp_autosndbuf_max -#define V_tcp_do_rfc1323 tcp_do_rfc1323 -#define V_tcp_do_autorcvbuf tcp_do_autorcvbuf -#define V_tcp_autorcvbuf_max tcp_autorcvbuf_max -#define V_tcpstat tcpstat -#endif +#include +#include #include +#include #include #include @@ -65,37 +60,33 @@ __FBSDID("$FreeBSD$"); #include #include - -#include -#include - #include #include +#define TCPSTATES #include -#include +#include #include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "cxgb_include.h" +#include "ulp/tom/cxgb_l2t.h" +#include "ulp/tom/cxgb_tom.h" +#include "ulp/tom/cxgb_toepcb.h" + +VNET_DECLARE(int, tcp_do_autosndbuf); +#define V_tcp_do_autosndbuf VNET(tcp_do_autosndbuf) +VNET_DECLARE(int, tcp_autosndbuf_inc); +#define V_tcp_autosndbuf_inc VNET(tcp_autosndbuf_inc) +VNET_DECLARE(int, tcp_autosndbuf_max); +#define V_tcp_autosndbuf_max VNET(tcp_autosndbuf_max) +VNET_DECLARE(int, tcp_do_autorcvbuf); +#define V_tcp_do_autorcvbuf VNET(tcp_do_autorcvbuf) +VNET_DECLARE(int, tcp_autorcvbuf_inc); +#define V_tcp_autorcvbuf_inc VNET(tcp_autorcvbuf_inc) +VNET_DECLARE(int, tcp_autorcvbuf_max); +#define V_tcp_autorcvbuf_max VNET(tcp_autorcvbuf_max) +extern int always_keepalive; /* * For ULP connections HW may add headers, e.g., for digests, that aren't part @@ -108,29 +99,6 @@ __FBSDID("$FreeBSD$"); */ const unsigned int t3_ulp_extra_len[] = {0, 4, 4, 8}; -#ifdef notyet -/* - * This sk_buff holds a fake header-only TCP segment that we use whenever we - * need to exploit SW TCP functionality that expects TCP headers, such as - * tcp_create_openreq_child(). It's a RO buffer that may be used by multiple - * CPUs without locking. - */ -static struct mbuf *tcphdr_mbuf __read_mostly; -#endif - -/* - * Size of WRs in bytes. Note that we assume all devices we are handling have - * the same WR size. - */ -static unsigned int wrlen __read_mostly; - -/* - * The number of WRs needed for an skb depends on the number of page fragments - * in the skb and whether it has any payload in its main body. This maps the - * length of the gather list represented by an skb into the # of necessary WRs. - */ -static unsigned int mbuf_wrs[TX_MAX_SEGS + 1] __read_mostly; - /* * Max receive window supported by HW in bytes. Only a small part of it can * be set through option0, the rest needs to be set through RX_DATA_ACK. @@ -144,1261 +112,760 @@ static unsigned int mbuf_wrs[TX_MAX_SEGS + 1] __read_mostly; #define MIN_RCV_WND (24 * 1024U) #define INP_TOS(inp) ((inp_ip_tos_get(inp) >> 2) & M_TOS) -#define VALIDATE_SEQ 0 -#define VALIDATE_SOCK(so) -#define DEBUG_WR 0 +static void t3_release_offload_resources(struct toepcb *); +static void send_reset(struct toepcb *toep); -#define TCP_TIMEWAIT 1 -#define TCP_CLOSE 2 -#define TCP_DROP 3 - -static void t3_send_reset(struct toepcb *toep); -static void send_abort_rpl(struct mbuf *m, struct toedev *tdev, int rst_status); -static inline void free_atid(struct t3cdev *cdev, unsigned int tid); -static void handle_syncache_event(int event, void *arg); - -static inline void -SBAPPEND(struct sockbuf *sb, struct mbuf *n) +/* + * Called after the last CPL for the toepcb has been received. + * + * The inp must be wlocked on entry and is unlocked (or maybe destroyed) by the + * time this function exits. + */ +static int +toepcb_release(struct toepcb *toep) { - struct mbuf *m; + struct inpcb *inp = toep->tp_inp; + struct toedev *tod = toep->tp_tod; + struct tom_data *td = t3_tomdata(tod); + int rc; - m = sb->sb_mb; - while (m) { - KASSERT(((m->m_flags & M_EXT) && (m->m_ext.ext_type == EXT_EXTREF)) || - !(m->m_flags & M_EXT), ("unexpected type M_EXT=%d ext_type=%d m_len=%d\n", - !!(m->m_flags & M_EXT), m->m_ext.ext_type, m->m_len)); - KASSERT(m->m_next != (struct mbuf *)0xffffffff, ("bad next value m_next=%p m_nextpkt=%p m_flags=0x%x", - m->m_next, m->m_nextpkt, m->m_flags)); - m = m->m_next; - } - m = n; - while (m) { - KASSERT(((m->m_flags & M_EXT) && (m->m_ext.ext_type == EXT_EXTREF)) || - !(m->m_flags & M_EXT), ("unexpected type M_EXT=%d ext_type=%d m_len=%d\n", - !!(m->m_flags & M_EXT), m->m_ext.ext_type, m->m_len)); - KASSERT(m->m_next != (struct mbuf *)0xffffffff, ("bad next value m_next=%p m_nextpkt=%p m_flags=0x%x", - m->m_next, m->m_nextpkt, m->m_flags)); - m = m->m_next; - } - KASSERT(sb->sb_flags & SB_NOCOALESCE, ("NOCOALESCE not set")); - sbappendstream_locked(sb, n); - m = sb->sb_mb; + INP_WLOCK_ASSERT(inp); + KASSERT(!(toep->tp_flags & TP_CPL_DONE), + ("%s: double release?", __func__)); - while (m) { - KASSERT(m->m_next != (struct mbuf *)0xffffffff, ("bad next value m_next=%p m_nextpkt=%p m_flags=0x%x", - m->m_next, m->m_nextpkt, m->m_flags)); - m = m->m_next; - } + CTR2(KTR_CXGB, "%s: tid %d", __func__, toep->tp_tid); + + toep->tp_flags |= TP_CPL_DONE; + toep->tp_inp = NULL; + + mtx_lock(&td->toep_list_lock); + TAILQ_REMOVE(&td->toep_list, toep, link); + mtx_unlock(&td->toep_list_lock); + + if (!(toep->tp_flags & TP_ATTACHED)) + t3_release_offload_resources(toep); + + rc = in_pcbrele_wlocked(inp); + if (!rc) + INP_WUNLOCK(inp); + return (rc); } -static inline int -is_t3a(const struct toedev *dev) +/* + * One sided detach. The tcpcb is going away and we need to unhook the toepcb + * hanging off it. If the TOE driver is also done with the toepcb we'll release + * all offload resources. + */ +static void +toepcb_detach(struct inpcb *inp) { - return (dev->tod_ttid == TOE_ID_CHELSIO_T3); + struct toepcb *toep; + struct tcpcb *tp; + + KASSERT(inp, ("%s: inp is NULL", __func__)); + INP_WLOCK_ASSERT(inp); + + tp = intotcpcb(inp); + toep = tp->t_toe; + + KASSERT(toep != NULL, ("%s: toep is NULL", __func__)); + KASSERT(toep->tp_flags & TP_ATTACHED, ("%s: not attached", __func__)); + + CTR6(KTR_CXGB, "%s: %s %u, toep %p, inp %p, tp %p", __func__, + tp->t_state == TCPS_SYN_SENT ? "atid" : "tid", toep->tp_tid, + toep, inp, tp); + + tp->t_toe = NULL; + tp->t_flags &= ~TF_TOE; + toep->tp_flags &= ~TP_ATTACHED; + + if (toep->tp_flags & TP_CPL_DONE) + t3_release_offload_resources(toep); +} + +void +t3_pcb_detach(struct toedev *tod __unused, struct tcpcb *tp) +{ + + toepcb_detach(tp->t_inpcb); +} + +static int +alloc_atid(struct tid_info *t, void *ctx) +{ + int atid = -1; + + mtx_lock(&t->atid_lock); + if (t->afree) { + union active_open_entry *p = t->afree; + + atid = (p - t->atid_tab) + t->atid_base; + t->afree = p->next; + p->ctx = ctx; + t->atids_in_use++; + } + mtx_unlock(&t->atid_lock); + + return (atid); } static void -dump_toepcb(struct toepcb *toep) +free_atid(struct tid_info *t, int atid) { - DPRINTF("qset_idx=%d qset=%d ulp_mode=%d mtu_idx=%d tid=%d\n", - toep->tp_qset_idx, toep->tp_qset, toep->tp_ulp_mode, - toep->tp_mtu_idx, toep->tp_tid); + union active_open_entry *p = atid2entry(t, atid); - DPRINTF("wr_max=%d wr_avail=%d wr_unacked=%d mss_clamp=%d flags=0x%x\n", - toep->tp_wr_max, toep->tp_wr_avail, toep->tp_wr_unacked, - toep->tp_mss_clamp, toep->tp_flags); + mtx_lock(&t->atid_lock); + p->next = t->afree; + t->afree = p; + t->atids_in_use--; + mtx_unlock(&t->atid_lock); } -#ifndef RTALLOC2_DEFINED -static struct rtentry * -rtalloc2(struct sockaddr *dst, int report, u_long ignflags) +void +insert_tid(struct tom_data *td, void *ctx, unsigned int tid) { - struct rtentry *rt = NULL; - - if ((rt = rtalloc1(dst, report, ignflags)) != NULL) - RT_UNLOCK(rt); + struct tid_info *t = &td->tid_maps; - return (rt); + t->tid_tab[tid] = ctx; + atomic_add_int(&t->tids_in_use, 1); } + +void +update_tid(struct tom_data *td, void *ctx, unsigned int tid) +{ + struct tid_info *t = &td->tid_maps; + + t->tid_tab[tid] = ctx; +} + +void +remove_tid(struct tom_data *td, unsigned int tid) +{ + struct tid_info *t = &td->tid_maps; + + t->tid_tab[tid] = NULL; + atomic_add_int(&t->tids_in_use, -1); +} + +/* use ctx as a next pointer in the tid release list */ +void +queue_tid_release(struct toedev *tod, unsigned int tid) +{ + struct tom_data *td = t3_tomdata(tod); + void **p = &td->tid_maps.tid_tab[tid]; + struct adapter *sc = tod->tod_softc; + + mtx_lock(&td->tid_release_lock); + *p = td->tid_release_list; + td->tid_release_list = p; + if (!*p) + taskqueue_enqueue(sc->tq, &td->tid_release_task); + mtx_unlock(&td->tid_release_lock); +} + +/* + * Populate a TID_RELEASE WR. + */ +static inline void +mk_tid_release(struct cpl_tid_release *cpl, unsigned int tid) +{ + + cpl->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); + OPCODE_TID(cpl) = htonl(MK_OPCODE_TID(CPL_TID_RELEASE, tid)); +} + +void +release_tid(struct toedev *tod, unsigned int tid, int qset) +{ + struct tom_data *td = t3_tomdata(tod); + struct adapter *sc = tod->tod_softc; + struct mbuf *m; + struct cpl_tid_release *cpl; +#ifdef INVARIANTS + struct tid_info *t = &td->tid_maps; #endif -/* - * Determine whether to send a CPL message now or defer it. A message is - * deferred if the connection is in SYN_SENT since we don't know the TID yet. - * For connections in other states the message is sent immediately. - * If through_l2t is set the message is subject to ARP processing, otherwise - * it is sent directly. - */ -static inline void -send_or_defer(struct toepcb *toep, struct mbuf *m, int through_l2t) -{ - struct tcpcb *tp = toep->tp_tp; + KASSERT(tid >= 0 && tid < t->ntids, + ("%s: tid=%d, ntids=%d", __func__, tid, t->ntids)); + + m = M_GETHDR_OFLD(qset, CPL_PRIORITY_CONTROL, cpl); + if (m) { + mk_tid_release(cpl, tid); + t3_offload_tx(sc, m); + remove_tid(td, tid); + } else + queue_tid_release(tod, tid); - if (__predict_false(tp->t_state == TCPS_SYN_SENT)) { - inp_wlock(tp->t_inpcb); - mbufq_tail(&toep->out_of_order_queue, m); // defer - inp_wunlock(tp->t_inpcb); - } else if (through_l2t) - l2t_send(TOEP_T3C_DEV(toep), m, toep->tp_l2t); // send through L2T - else - cxgb_ofld_send(TOEP_T3C_DEV(toep), m); // send directly } -static inline unsigned int -mkprio(unsigned int cntrl, const struct toepcb *toep) +void +t3_process_tid_release_list(void *data, int pending) { - return (cntrl); + struct mbuf *m; + struct tom_data *td = data; + struct adapter *sc = td->tod.tod_softc; + + mtx_lock(&td->tid_release_lock); + while (td->tid_release_list) { + void **p = td->tid_release_list; + unsigned int tid = p - td->tid_maps.tid_tab; + struct cpl_tid_release *cpl; + + td->tid_release_list = (void **)*p; + m = M_GETHDR_OFLD(0, CPL_PRIORITY_CONTROL, cpl); /* qs 0 here */ + if (m == NULL) + break; /* XXX: who reschedules the release task? */ + mtx_unlock(&td->tid_release_lock); + mk_tid_release(cpl, tid); + t3_offload_tx(sc, m); + remove_tid(td, tid); + mtx_lock(&td->tid_release_lock); + } + mtx_unlock(&td->tid_release_lock); } -/* - * Populate a TID_RELEASE WR. The skb must be already propely sized. - */ -static inline void -mk_tid_release(struct mbuf *m, const struct toepcb *toep, unsigned int tid) +static void +close_conn(struct adapter *sc, struct toepcb *toep) { - struct cpl_tid_release *req; + struct mbuf *m; + struct cpl_close_con_req *req; - m_set_priority(m, mkprio(CPL_PRIORITY_SETUP, toep)); - m->m_pkthdr.len = m->m_len = sizeof(*req); - req = mtod(m, struct cpl_tid_release *); - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - req->wr.wr_lo = 0; - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_TID_RELEASE, tid)); + if (toep->tp_flags & TP_FIN_SENT) + return; + + m = M_GETHDR_OFLD(toep->tp_qset, CPL_PRIORITY_DATA, req); + if (m == NULL) + CXGB_UNIMPLEMENTED(); + + req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_CLOSE_CON)); + req->wr.wrh_lo = htonl(V_WR_TID(toep->tp_tid)); + OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_CON_REQ, toep->tp_tid)); + req->rsvd = 0; + + toep->tp_flags |= TP_FIN_SENT; + t3_offload_tx(sc, m); } static inline void -make_tx_data_wr(struct socket *so, struct mbuf *m, int len, struct mbuf *tail) +make_tx_data_wr(struct socket *so, struct tx_data_wr *req, int len, + struct mbuf *tail) { struct tcpcb *tp = so_sototcpcb(so); struct toepcb *toep = tp->t_toe; - struct tx_data_wr *req; struct sockbuf *snd; - + inp_lock_assert(tp->t_inpcb); snd = so_sockbuf_snd(so); - - req = mtod(m, struct tx_data_wr *); - m->m_len = sizeof(*req); - req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA)); - req->wr_lo = htonl(V_WR_TID(toep->tp_tid)); + + req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA)); + req->wr.wrh_lo = htonl(V_WR_TID(toep->tp_tid)); /* len includes the length of any HW ULP additions */ req->len = htonl(len); req->param = htonl(V_TX_PORT(toep->tp_l2t->smt_idx)); /* V_TX_ULP_SUBMODE sets both the mode and submode */ - req->flags = htonl(V_TX_ULP_SUBMODE(/*skb_ulp_mode(skb)*/ 0) | - V_TX_URG(/* skb_urgent(skb) */ 0 ) | - V_TX_SHOVE((!(tp->t_flags & TF_MORETOCOME) && - (tail ? 0 : 1)))); + req->flags = htonl(V_TX_ULP_SUBMODE(toep->tp_ulp_mode) | V_TX_URG(0) | + V_TX_SHOVE(!(tp->t_flags & TF_MORETOCOME) && (tail ? 0 : 1))); req->sndseq = htonl(tp->snd_nxt); if (__predict_false((toep->tp_flags & TP_DATASENT) == 0)) { - req->flags |= htonl(V_TX_ACK_PAGES(2) | F_TX_INIT | - V_TX_CPU_IDX(toep->tp_qset)); - - /* Sendbuffer is in units of 32KB. - */ + struct adapter *sc = toep->tp_tod->tod_softc; + int cpu_idx = sc->rrss_map[toep->tp_qset]; + + req->flags |= htonl(V_TX_ACK_PAGES(2) | F_TX_INIT | + V_TX_CPU_IDX(cpu_idx)); + + /* Sendbuffer is in units of 32KB. */ if (V_tcp_do_autosndbuf && snd->sb_flags & SB_AUTOSIZE) - req->param |= htonl(V_TX_SNDBUF(V_tcp_autosndbuf_max >> 15)); - else { + req->param |= htonl(V_TX_SNDBUF(VNET(tcp_autosndbuf_max) >> 15)); + else req->param |= htonl(V_TX_SNDBUF(snd->sb_hiwat >> 15)); - } - + toep->tp_flags |= TP_DATASENT; } } -#define IMM_LEN 64 /* XXX - see WR_LEN in the cxgb driver */ +/* + * TOM_XXX_DUPLICATION sgl_len, calc_tx_descs, calc_tx_descs_ofld, mbuf_wrs, etc. + * TOM_XXX_MOVE to some common header file. + */ +/* + * IMM_LEN: # of bytes that can be tx'd as immediate data. There are 16 flits + * in a tx desc; subtract 3 for tx_data_wr (including the WR header), and 1 more + * for the second gen bit flit. This leaves us with 12 flits. + * + * descs_to_sgllen: # of SGL entries that can fit into the given # of tx descs. + * The first desc has a tx_data_wr (which includes the WR header), the rest have + * the WR header only. All descs have the second gen bit flit. + * + * sgllen_to_descs: # of tx descs used up by an sgl of given length. The first + * desc has a tx_data_wr (which includes the WR header), the rest have the WR + * header only. All descs have the second gen bit flit. + * + * flits_to_sgllen: # of SGL entries that can be fit in the given # of flits. + * + */ +#define IMM_LEN 96 +static int descs_to_sgllen[TX_MAX_DESC + 1] = {0, 8, 17, 26, 35}; +static int sgllen_to_descs[TX_MAX_SEGS] = { + 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, /* 0 - 9 */ + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, /* 10 - 19 */ + 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, /* 20 - 29 */ + 4, 4, 4, 4, 4, 4 /* 30 - 35 */ +}; +#if 0 +static int flits_to_sgllen[TX_DESC_FLITS + 1] = { + 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10 +}; +#endif +#if SGE_NUM_GENBITS != 2 +#error "SGE_NUM_GENBITS really must be 2" +#endif int t3_push_frames(struct socket *so, int req_completion) { struct tcpcb *tp = so_sototcpcb(so); struct toepcb *toep = tp->t_toe; - - struct mbuf *tail, *m0, *last; - struct t3cdev *cdev; - struct tom_data *d; - int state, bytes, count, total_bytes; - bus_dma_segment_t segs[TX_MAX_SEGS], *segp; + struct mbuf *m0, *sndptr, *m; + struct toedev *tod = toep->tp_tod; + struct adapter *sc = tod->tod_softc; + int bytes, ndesc, total_bytes = 0, mlen; struct sockbuf *snd; - - if (tp->t_state == TCPS_SYN_SENT || tp->t_state == TCPS_CLOSED) { - DPRINTF("tcp state=%d\n", tp->t_state); - return (0); - } - - state = so_state_get(so); - - if (state & (SS_ISDISCONNECTING|SS_ISDISCONNECTED)) { - DPRINTF("disconnecting\n"); - - return (0); - } + struct sglist *sgl; + struct ofld_hdr *oh; + caddr_t dst; + struct tx_data_wr *wr; inp_lock_assert(tp->t_inpcb); snd = so_sockbuf_snd(so); - sockbuf_lock(snd); + SOCKBUF_LOCK(snd); - d = TOM_DATA(toep->tp_toedev); - cdev = d->cdev; - - last = tail = snd->sb_sndptr ? snd->sb_sndptr : snd->sb_mb; - - total_bytes = 0; - DPRINTF("wr_avail=%d tail=%p snd.cc=%d tp_last=%p\n", - toep->tp_wr_avail, tail, snd->sb_cc, toep->tp_m_last); - - if (last && toep->tp_m_last == last && snd->sb_sndptroff != 0) { - KASSERT(tail, ("sbdrop error")); - last = tail = tail->m_next; - } - - if ((toep->tp_wr_avail == 0 ) || (tail == NULL)) { - DPRINTF("wr_avail=%d tail=%p\n", toep->tp_wr_avail, tail); - sockbuf_unlock(snd); - - return (0); - } - - toep->tp_m_last = NULL; - while (toep->tp_wr_avail && (tail != NULL)) { - count = bytes = 0; - segp = segs; - if ((m0 = m_gethdr(M_NOWAIT, MT_DATA)) == NULL) { - sockbuf_unlock(snd); - return (0); + /* + * Autosize the send buffer. + */ + if (snd->sb_flags & SB_AUTOSIZE && VNET(tcp_do_autosndbuf)) { + if (snd->sb_cc >= (snd->sb_hiwat / 8 * 7) && + snd->sb_cc < VNET(tcp_autosndbuf_max)) { + if (!sbreserve_locked(snd, min(snd->sb_hiwat + + VNET(tcp_autosndbuf_inc), VNET(tcp_autosndbuf_max)), + so, curthread)) + snd->sb_flags &= ~SB_AUTOSIZE; } + } + + if (toep->tp_m_last && toep->tp_m_last == snd->sb_sndptr) + sndptr = toep->tp_m_last->m_next; + else + sndptr = snd->sb_sndptr ? snd->sb_sndptr : snd->sb_mb; + + /* Nothing to send or no WRs available for sending data */ + if (toep->tp_wr_avail == 0 || sndptr == NULL) + goto out; + + /* Something to send and at least 1 WR available */ + while (toep->tp_wr_avail && sndptr != NULL) { + + m0 = m_gethdr(M_NOWAIT, MT_DATA); + if (m0 == NULL) + break; + oh = mtod(m0, struct ofld_hdr *); + wr = (void *)(oh + 1); + dst = (void *)(wr + 1); + + m0->m_pkthdr.len = m0->m_len = sizeof(*oh) + sizeof(*wr); + oh->flags = V_HDR_CTRL(CPL_PRIORITY_DATA) | F_HDR_DF | + V_HDR_QSET(toep->tp_qset); + /* - * If the data in tail fits as in-line, then - * make an immediate data wr. + * Try to construct an immediate data WR if possible. Stuff as + * much data into it as possible, one whole mbuf at a time. */ - if (tail->m_len <= IMM_LEN) { - count = 1; - bytes = tail->m_len; - last = tail; - tail = tail->m_next; - m_set_sgl(m0, NULL); - m_set_sgllen(m0, 0); - make_tx_data_wr(so, m0, bytes, tail); - m_append(m0, bytes, mtod(last, caddr_t)); - KASSERT(!m0->m_next, ("bad append")); + mlen = sndptr->m_len; + ndesc = bytes = 0; + while (mlen <= IMM_LEN - bytes) { + bcopy(sndptr->m_data, dst, mlen); + bytes += mlen; + dst += mlen; + + if (!(sndptr = sndptr->m_next)) + break; + mlen = sndptr->m_len; + } + + if (bytes) { + + /* Was able to fit 'bytes' bytes in an immediate WR */ + + ndesc = 1; + make_tx_data_wr(so, wr, bytes, sndptr); + + m0->m_len += bytes; + m0->m_pkthdr.len = m0->m_len; + } else { - while ((mbuf_wrs[count + 1] <= toep->tp_wr_avail) - && (tail != NULL) && (count < TX_MAX_SEGS-1)) { - bytes += tail->m_len; - last = tail; - count++; - /* - * technically an abuse to be using this for a VA - * but less gross than defining my own structure - * or calling pmap_kextract from here :-| - */ - segp->ds_addr = (bus_addr_t)tail->m_data; - segp->ds_len = tail->m_len; - DPRINTF("count=%d wr_needed=%d ds_addr=%p ds_len=%d\n", - count, mbuf_wrs[count], tail->m_data, tail->m_len); - segp++; - tail = tail->m_next; + int wr_avail = min(toep->tp_wr_avail, TX_MAX_DESC); + + /* Need to make an SGL */ + + sgl = sglist_alloc(descs_to_sgllen[wr_avail], M_NOWAIT); + if (sgl == NULL) + break; + + for (m = sndptr; m != NULL; m = m->m_next) { + if ((mlen = m->m_len) > 0) { + if (sglist_append(sgl, m->m_data, mlen)) + break; + } + bytes += mlen; } - DPRINTF("wr_avail=%d mbuf_wrs[%d]=%d tail=%p\n", - toep->tp_wr_avail, count, mbuf_wrs[count], tail); - - m_set_sgl(m0, segs); - m_set_sgllen(m0, count); - make_tx_data_wr(so, m0, bytes, tail); + sndptr = m; + if (bytes == 0) { + sglist_free(sgl); + break; + } + ndesc = sgllen_to_descs[sgl->sg_nseg]; + oh->flags |= F_HDR_SGL; + oh->sgl = sgl; + make_tx_data_wr(so, wr, bytes, sndptr); } - m_set_priority(m0, mkprio(CPL_PRIORITY_DATA, toep)); - if (tail) { - snd->sb_sndptr = tail; - toep->tp_m_last = NULL; - } else - toep->tp_m_last = snd->sb_sndptr = last; - - - DPRINTF("toep->tp_m_last=%p\n", toep->tp_m_last); + oh->flags |= V_HDR_NDESC(ndesc); + oh->plen = bytes; + snd->sb_sndptr = sndptr; snd->sb_sndptroff += bytes; + if (sndptr == NULL) { + snd->sb_sndptr = snd->sb_mbtail; + snd->sb_sndptroff -= snd->sb_mbtail->m_len; + toep->tp_m_last = snd->sb_mbtail; + } else + toep->tp_m_last = NULL; + total_bytes += bytes; - toep->tp_write_seq += bytes; - CTR6(KTR_TOM, "t3_push_frames: wr_avail=%d mbuf_wrs[%d]=%d" - " tail=%p sndptr=%p sndptroff=%d", - toep->tp_wr_avail, count, mbuf_wrs[count], - tail, snd->sb_sndptr, snd->sb_sndptroff); - if (tail) - CTR4(KTR_TOM, "t3_push_frames: total_bytes=%d" - " tp_m_last=%p tailbuf=%p snd_una=0x%08x", - total_bytes, toep->tp_m_last, tail->m_data, - tp->snd_una); - else - CTR3(KTR_TOM, "t3_push_frames: total_bytes=%d" - " tp_m_last=%p snd_una=0x%08x", - total_bytes, toep->tp_m_last, tp->snd_una); + toep->tp_wr_avail -= ndesc; + toep->tp_wr_unacked += ndesc; -#ifdef KTR -{ - int i; - - i = 0; - while (i < count && m_get_sgllen(m0)) { - if ((count - i) >= 3) { - CTR6(KTR_TOM, - "t3_push_frames: pa=0x%zx len=%d pa=0x%zx" - " len=%d pa=0x%zx len=%d", - segs[i].ds_addr, segs[i].ds_len, - segs[i + 1].ds_addr, segs[i + 1].ds_len, - segs[i + 2].ds_addr, segs[i + 2].ds_len); - i += 3; - } else if ((count - i) == 2) { - CTR4(KTR_TOM, - "t3_push_frames: pa=0x%zx len=%d pa=0x%zx" - " len=%d", - segs[i].ds_addr, segs[i].ds_len, - segs[i + 1].ds_addr, segs[i + 1].ds_len); - i += 2; - } else { - CTR2(KTR_TOM, "t3_push_frames: pa=0x%zx len=%d", - segs[i].ds_addr, segs[i].ds_len); - i++; - } - - } -} -#endif - /* - * remember credits used - */ - m0->m_pkthdr.csum_data = mbuf_wrs[count]; - m0->m_pkthdr.len = bytes; - toep->tp_wr_avail -= mbuf_wrs[count]; - toep->tp_wr_unacked += mbuf_wrs[count]; - - if ((req_completion && toep->tp_wr_unacked == mbuf_wrs[count]) || + if ((req_completion && toep->tp_wr_unacked == ndesc) || toep->tp_wr_unacked >= toep->tp_wr_max / 2) { - struct work_request_hdr *wr = cplhdr(m0); - - wr->wr_hi |= htonl(F_WR_COMPL); + wr->wr.wrh_hi |= htonl(F_WR_COMPL); toep->tp_wr_unacked = 0; } - KASSERT((m0->m_pkthdr.csum_data > 0) && - (m0->m_pkthdr.csum_data <= 4), ("bad credit count %d", - m0->m_pkthdr.csum_data)); - m0->m_type = MT_DONTFREE; + enqueue_wr(toep, m0); - DPRINTF("sending offload tx with %d bytes in %d segments\n", - bytes, count); - l2t_send(cdev, m0, toep->tp_l2t); + l2t_send(sc, m0, toep->tp_l2t); } - sockbuf_unlock(snd); +out: + SOCKBUF_UNLOCK(snd); + + if (sndptr == NULL && (toep->tp_flags & TP_SEND_FIN)) + close_conn(sc, toep); + return (total_bytes); } -/* - * Close a connection by sending a CPL_CLOSE_CON_REQ message. Cannot fail - * under any circumstances. We take the easy way out and always queue the - * message to the write_queue. We can optimize the case where the queue is - * already empty though the optimization is probably not worth it. - */ -static void -close_conn(struct socket *so) -{ - struct mbuf *m; - struct cpl_close_con_req *req; - struct tom_data *d; - struct inpcb *inp = so_sotoinpcb(so); - struct tcpcb *tp; - struct toepcb *toep; - unsigned int tid; - - - inp_wlock(inp); - tp = so_sototcpcb(so); - toep = tp->t_toe; - - if (tp->t_state != TCPS_SYN_SENT) - t3_push_frames(so, 1); - - if (toep->tp_flags & TP_FIN_SENT) { - inp_wunlock(inp); - return; - } - - tid = toep->tp_tid; - - d = TOM_DATA(toep->tp_toedev); - - m = m_gethdr_nofail(sizeof(*req)); - m_set_priority(m, CPL_PRIORITY_DATA); - m_set_sgl(m, NULL); - m_set_sgllen(m, 0); - - toep->tp_flags |= TP_FIN_SENT; - req = mtod(m, struct cpl_close_con_req *); - - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_CLOSE_CON)); - req->wr.wr_lo = htonl(V_WR_TID(tid)); - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_CON_REQ, tid)); - req->rsvd = 0; - inp_wunlock(inp); - /* - * XXX - need to defer shutdown while there is still data in the queue - * - */ - CTR4(KTR_TOM, "%s CLOSE_CON_REQ so %p tp %p tid=%u", __FUNCTION__, so, tp, tid); - cxgb_ofld_send(d->cdev, m); - -} - -/* - * Handle an ARP failure for a CPL_ABORT_REQ. Change it into a no RST variant - * and send it along. - */ -static void -abort_arp_failure(struct t3cdev *cdev, struct mbuf *m) -{ - struct cpl_abort_req *req = cplhdr(m); - - req->cmd = CPL_ABORT_NO_RST; - cxgb_ofld_send(cdev, m); -} - -/* - * Send RX credits through an RX_DATA_ACK CPL message. If nofail is 0 we are - * permitted to return without sending the message in case we cannot allocate - * an sk_buff. Returns the number of credits sent. - */ -uint32_t -t3_send_rx_credits(struct tcpcb *tp, uint32_t credits, uint32_t dack, int nofail) +static int +send_rx_credits(struct adapter *sc, struct toepcb *toep, int credits) { struct mbuf *m; struct cpl_rx_data_ack *req; - struct toepcb *toep = tp->t_toe; - struct toedev *tdev = toep->tp_toedev; - - m = m_gethdr_nofail(sizeof(*req)); + uint32_t dack = F_RX_DACK_CHANGE | V_RX_DACK_MODE(1); - DPRINTF("returning %u credits to HW\n", credits); - - req = mtod(m, struct cpl_rx_data_ack *); - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - req->wr.wr_lo = 0; + m = M_GETHDR_OFLD(toep->tp_qset, CPL_PRIORITY_CONTROL, req); + if (m == NULL) + return (0); + + req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); + req->wr.wrh_lo = 0; OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RX_DATA_ACK, toep->tp_tid)); req->credit_dack = htonl(dack | V_RX_CREDITS(credits)); - m_set_priority(m, mkprio(CPL_PRIORITY_ACK, toep)); - cxgb_ofld_send(TOM_DATA(tdev)->cdev, m); + t3_offload_tx(sc, m); return (credits); } -/* - * Send RX_DATA_ACK CPL message to request a modulation timer to be scheduled. - * This is only used in DDP mode, so we take the opportunity to also set the - * DACK mode and flush any Rx credits. - */ void -t3_send_rx_modulate(struct toepcb *toep) +t3_rcvd(struct toedev *tod, struct tcpcb *tp) { - struct mbuf *m; - struct cpl_rx_data_ack *req; + struct adapter *sc = tod->tod_softc; + struct inpcb *inp = tp->t_inpcb; + struct socket *so = inp->inp_socket; + struct sockbuf *so_rcv = &so->so_rcv; + struct toepcb *toep = tp->t_toe; + int must_send; - m = m_gethdr_nofail(sizeof(*req)); + INP_WLOCK_ASSERT(inp); - req = mtod(m, struct cpl_rx_data_ack *); - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - req->wr.wr_lo = 0; - m->m_pkthdr.len = m->m_len = sizeof(*req); - - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RX_DATA_ACK, toep->tp_tid)); - req->credit_dack = htonl(F_RX_MODULATE | F_RX_DACK_CHANGE | - V_RX_DACK_MODE(1) | - V_RX_CREDITS(toep->tp_copied_seq - toep->tp_rcv_wup)); - m_set_priority(m, mkprio(CPL_PRIORITY_CONTROL, toep)); - cxgb_ofld_send(TOEP_T3C_DEV(toep), m); - toep->tp_rcv_wup = toep->tp_copied_seq; -} + SOCKBUF_LOCK(so_rcv); + KASSERT(toep->tp_enqueued >= so_rcv->sb_cc, + ("%s: so_rcv->sb_cc > enqueued", __func__)); + toep->tp_rx_credits += toep->tp_enqueued - so_rcv->sb_cc; + toep->tp_enqueued = so_rcv->sb_cc; + SOCKBUF_UNLOCK(so_rcv); -/* - * Handle receipt of an urgent pointer. - */ -static void -handle_urg_ptr(struct socket *so, uint32_t urg_seq) -{ -#ifdef URGENT_DATA_SUPPORTED - struct tcpcb *tp = so_sototcpcb(so); + must_send = toep->tp_rx_credits + 16384 >= tp->rcv_wnd; + if (must_send || toep->tp_rx_credits >= 15 * 1024) { + int credits; - urg_seq--; /* initially points past the urgent data, per BSD */ - - if (tp->urg_data && !after(urg_seq, tp->urg_seq)) - return; /* duplicate pointer */ - sk_send_sigurg(sk); - if (tp->urg_seq == tp->copied_seq && tp->urg_data && - !sock_flag(sk, SOCK_URGINLINE) && tp->copied_seq != tp->rcv_nxt) { - struct sk_buff *skb = skb_peek(&sk->sk_receive_queue); - - tp->copied_seq++; - if (skb && tp->copied_seq - TCP_SKB_CB(skb)->seq >= skb->len) - tom_eat_skb(sk, skb, 0); + credits = send_rx_credits(sc, toep, toep->tp_rx_credits); + toep->tp_rx_credits -= credits; + tp->rcv_wnd += credits; + tp->rcv_adv += credits; } - tp->urg_data = TCP_URG_NOTYET; - tp->urg_seq = urg_seq; -#endif } -/* - * Returns true if a socket cannot accept new Rx data. - */ -static inline int -so_no_receive(const struct socket *so) +static int +do_rx_urg_notify(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { - return (so_state_get(so) & (SS_ISDISCONNECTED|SS_ISDISCONNECTING)); -} + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct cpl_rx_urg_notify *hdr = mtod(m, void *); + unsigned int tid = GET_TID(hdr); + struct toepcb *toep = lookup_tid(&td->tid_maps, tid); -/* - * Process an urgent data notification. - */ -static void -rx_urg_notify(struct toepcb *toep, struct mbuf *m) -{ - struct cpl_rx_urg_notify *hdr = cplhdr(m); - struct socket *so = inp_inpcbtosocket(toep->tp_tp->t_inpcb); - - VALIDATE_SOCK(so); - - if (!so_no_receive(so)) - handle_urg_ptr(so, ntohl(hdr->seq)); + log(LOG_ERR, "%s: tid %u inp %p", __func__, tid, toep->tp_inp); m_freem(m); -} - -/* - * Handler for RX_URG_NOTIFY CPL messages. - */ -static int -do_rx_urg_notify(struct t3cdev *cdev, struct mbuf *m, void *ctx) -{ - struct toepcb *toep = (struct toepcb *)ctx; - - rx_urg_notify(toep, m); return (0); } -static __inline int -is_delack_mode_valid(struct toedev *dev, struct toepcb *toep) -{ - return (toep->tp_ulp_mode || - (toep->tp_ulp_mode == ULP_MODE_TCPDDP && - dev->tod_ttid >= TOE_ID_CHELSIO_T3)); -} - -/* - * Set of states for which we should return RX credits. - */ -#define CREDIT_RETURN_STATE (TCPF_ESTABLISHED | TCPF_FIN_WAIT1 | TCPF_FIN_WAIT2) - -/* - * Called after some received data has been read. It returns RX credits - * to the HW for the amount of data processed. - */ -void -t3_cleanup_rbuf(struct tcpcb *tp, int copied) +int +t3_send_fin(struct toedev *tod, struct tcpcb *tp) { struct toepcb *toep = tp->t_toe; - struct socket *so; - struct toedev *dev; - int dack_mode, must_send, read; - u32 thres, credits, dack = 0; - struct sockbuf *rcv; - - so = inp_inpcbtosocket(tp->t_inpcb); - rcv = so_sockbuf_rcv(so); + struct inpcb *inp = tp->t_inpcb; + struct socket *so = inp_inpcbtosocket(inp); +#if defined(KTR) + unsigned int tid = toep->tp_tid; +#endif - if (!((tp->t_state == TCPS_ESTABLISHED) || (tp->t_state == TCPS_FIN_WAIT_1) || - (tp->t_state == TCPS_FIN_WAIT_2))) { - if (copied) { - sockbuf_lock(rcv); - toep->tp_copied_seq += copied; - sockbuf_unlock(rcv); - } - - return; - } - - inp_lock_assert(tp->t_inpcb); + INP_INFO_WLOCK_ASSERT(&V_tcbinfo); + INP_WLOCK_ASSERT(inp); - sockbuf_lock(rcv); - if (copied) - toep->tp_copied_seq += copied; - else { - read = toep->tp_enqueued_bytes - rcv->sb_cc; - toep->tp_copied_seq += read; - } - credits = toep->tp_copied_seq - toep->tp_rcv_wup; - toep->tp_enqueued_bytes = rcv->sb_cc; - sockbuf_unlock(rcv); + CTR4(KTR_CXGB, "%s: tid %d, toep %p, flags %x", __func__, tid, toep, + toep->tp_flags); - if (credits > rcv->sb_mbmax) { - log(LOG_ERR, "copied_seq=%u rcv_wup=%u credits=%u\n", - toep->tp_copied_seq, toep->tp_rcv_wup, credits); - credits = rcv->sb_mbmax; - } - - - /* - * XXX this won't accurately reflect credit return - we need - * to look at the difference between the amount that has been - * put in the recv sockbuf and what is there now - */ + toep->tp_flags |= TP_SEND_FIN; + t3_push_frames(so, 1); - if (__predict_false(!credits)) - return; - - dev = toep->tp_toedev; - thres = TOM_TUNABLE(dev, rx_credit_thres); - - if (__predict_false(thres == 0)) - return; - - if (is_delack_mode_valid(dev, toep)) { - dack_mode = TOM_TUNABLE(dev, delack); - if (__predict_false(dack_mode != toep->tp_delack_mode)) { - u32 r = tp->rcv_nxt - toep->tp_delack_seq; - - if (r >= tp->rcv_wnd || r >= 16 * toep->tp_mss_clamp) - dack = F_RX_DACK_CHANGE | - V_RX_DACK_MODE(dack_mode); - } - } else - dack = F_RX_DACK_CHANGE | V_RX_DACK_MODE(1); - - /* - * For coalescing to work effectively ensure the receive window has - * at least 16KB left. - */ - must_send = credits + 16384 >= tp->rcv_wnd; - - if (must_send || credits >= thres) - toep->tp_rcv_wup += t3_send_rx_credits(tp, credits, dack, must_send); -} - -static int -cxgb_toe_disconnect(struct tcpcb *tp) -{ - struct socket *so; - - DPRINTF("cxgb_toe_disconnect\n"); - - so = inp_inpcbtosocket(tp->t_inpcb); - close_conn(so); return (0); } -static int -cxgb_toe_reset(struct tcpcb *tp) +int +t3_tod_output(struct toedev *tod, struct tcpcb *tp) { - struct toepcb *toep = tp->t_toe; + struct inpcb *inp = tp->t_inpcb; + struct socket *so = inp->inp_socket; - t3_send_reset(toep); - - /* - * unhook from socket - */ - tp->t_flags &= ~TF_TOE; - toep->tp_tp = NULL; - tp->t_toe = NULL; - return (0); -} - -static int -cxgb_toe_send(struct tcpcb *tp) -{ - struct socket *so; - - DPRINTF("cxgb_toe_send\n"); - dump_toepcb(tp->t_toe); - - so = inp_inpcbtosocket(tp->t_inpcb); t3_push_frames(so, 1); return (0); } -static int -cxgb_toe_rcvd(struct tcpcb *tp) -{ - - inp_lock_assert(tp->t_inpcb); - - t3_cleanup_rbuf(tp, 0); - - return (0); -} - -static void -cxgb_toe_detach(struct tcpcb *tp) -{ - struct toepcb *toep; - - /* - * XXX how do we handle teardown in the SYN_SENT state? - * - */ - inp_lock_assert(tp->t_inpcb); - toep = tp->t_toe; - toep->tp_tp = NULL; - - /* - * unhook from socket - */ - tp->t_flags &= ~TF_TOE; - tp->t_toe = NULL; -} - - -static struct toe_usrreqs cxgb_toe_usrreqs = { - .tu_disconnect = cxgb_toe_disconnect, - .tu_reset = cxgb_toe_reset, - .tu_send = cxgb_toe_send, - .tu_rcvd = cxgb_toe_rcvd, - .tu_detach = cxgb_toe_detach, - .tu_detach = cxgb_toe_detach, - .tu_syncache_event = handle_syncache_event, -}; - - -static void -__set_tcb_field(struct toepcb *toep, struct mbuf *m, uint16_t word, - uint64_t mask, uint64_t val, int no_reply) -{ - struct cpl_set_tcb_field *req; - - CTR4(KTR_TCB, "__set_tcb_field_ulp(tid=%u word=0x%x mask=%jx val=%jx", - toep->tp_tid, word, mask, val); - - req = mtod(m, struct cpl_set_tcb_field *); - m->m_pkthdr.len = m->m_len = sizeof(*req); - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - req->wr.wr_lo = 0; - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, toep->tp_tid)); - req->reply = V_NO_REPLY(no_reply); - req->cpu_idx = 0; - req->word = htons(word); - req->mask = htobe64(mask); - req->val = htobe64(val); - - m_set_priority(m, mkprio(CPL_PRIORITY_CONTROL, toep)); - send_or_defer(toep, m, 0); -} - -static void -t3_set_tcb_field(struct toepcb *toep, uint16_t word, uint64_t mask, uint64_t val) -{ - struct mbuf *m; - struct tcpcb *tp = toep->tp_tp; - - if (toep == NULL) - return; - - if (tp->t_state == TCPS_CLOSED || (toep->tp_flags & TP_ABORT_SHUTDOWN)) { - printf("not seting field\n"); - return; - } - - m = m_gethdr_nofail(sizeof(struct cpl_set_tcb_field)); - - __set_tcb_field(toep, m, word, mask, val, 1); -} - -/* - * Set one of the t_flags bits in the TCB. - */ -static void -set_tcb_tflag(struct toepcb *toep, unsigned int bit_pos, int val) -{ - - t3_set_tcb_field(toep, W_TCB_T_FLAGS1, 1ULL << bit_pos, val << bit_pos); -} - -/* - * Send a SET_TCB_FIELD CPL message to change a connection's Nagle setting. - */ -static void -t3_set_nagle(struct toepcb *toep) -{ - struct tcpcb *tp = toep->tp_tp; - - set_tcb_tflag(toep, S_TF_NAGLE, !(tp->t_flags & TF_NODELAY)); -} - -/* - * Send a SET_TCB_FIELD CPL message to change a connection's keepalive setting. - */ -void -t3_set_keepalive(struct toepcb *toep, int on_off) -{ - - set_tcb_tflag(toep, S_TF_KEEPALIVE, on_off); -} - -void -t3_set_rcv_coalesce_enable(struct toepcb *toep, int on_off) -{ - set_tcb_tflag(toep, S_TF_RCV_COALESCE_ENABLE, on_off); -} - -void -t3_set_dack_mss(struct toepcb *toep, int on_off) -{ - - set_tcb_tflag(toep, S_TF_DACK_MSS, on_off); -} - -/* - * Send a SET_TCB_FIELD CPL message to change a connection's TOS setting. - */ -static void -t3_set_tos(struct toepcb *toep) -{ - int tos = inp_ip_tos_get(toep->tp_tp->t_inpcb); - - t3_set_tcb_field(toep, W_TCB_TOS, V_TCB_TOS(M_TCB_TOS), - V_TCB_TOS(tos)); -} - - -/* - * In DDP mode, TP fails to schedule a timer to push RX data to the host when - * DDP is disabled (data is delivered to freelist). [Note that, the peer should - * set the PSH bit in the last segment, which would trigger delivery.] - * We work around the issue by setting a DDP buffer in a partial placed state, - * which guarantees that TP will schedule a timer. - */ -#define TP_DDP_TIMER_WORKAROUND_MASK\ - (V_TF_DDP_BUF0_VALID(1) | V_TF_DDP_ACTIVE_BUF(1) |\ - ((V_TCB_RX_DDP_BUF0_OFFSET(M_TCB_RX_DDP_BUF0_OFFSET) |\ - V_TCB_RX_DDP_BUF0_LEN(3)) << 32)) -#define TP_DDP_TIMER_WORKAROUND_VAL\ - (V_TF_DDP_BUF0_VALID(1) | V_TF_DDP_ACTIVE_BUF(0) |\ - ((V_TCB_RX_DDP_BUF0_OFFSET((uint64_t)1) | V_TCB_RX_DDP_BUF0_LEN((uint64_t)2)) <<\ - 32)) - -static void -t3_enable_ddp(struct toepcb *toep, int on) -{ - if (on) { - - t3_set_tcb_field(toep, W_TCB_RX_DDP_FLAGS, V_TF_DDP_OFF(1), - V_TF_DDP_OFF(0)); - } else - t3_set_tcb_field(toep, W_TCB_RX_DDP_FLAGS, - V_TF_DDP_OFF(1) | - TP_DDP_TIMER_WORKAROUND_MASK, - V_TF_DDP_OFF(1) | - TP_DDP_TIMER_WORKAROUND_VAL); - -} - -void -t3_set_ddp_tag(struct toepcb *toep, int buf_idx, unsigned int tag_color) -{ - t3_set_tcb_field(toep, W_TCB_RX_DDP_BUF0_TAG + buf_idx, - V_TCB_RX_DDP_BUF0_TAG(M_TCB_RX_DDP_BUF0_TAG), - tag_color); -} - -void -t3_set_ddp_buf(struct toepcb *toep, int buf_idx, unsigned int offset, - unsigned int len) -{ - if (buf_idx == 0) - t3_set_tcb_field(toep, W_TCB_RX_DDP_BUF0_OFFSET, - V_TCB_RX_DDP_BUF0_OFFSET(M_TCB_RX_DDP_BUF0_OFFSET) | - V_TCB_RX_DDP_BUF0_LEN(M_TCB_RX_DDP_BUF0_LEN), - V_TCB_RX_DDP_BUF0_OFFSET((uint64_t)offset) | - V_TCB_RX_DDP_BUF0_LEN((uint64_t)len)); - else - t3_set_tcb_field(toep, W_TCB_RX_DDP_BUF1_OFFSET, - V_TCB_RX_DDP_BUF1_OFFSET(M_TCB_RX_DDP_BUF1_OFFSET) | - V_TCB_RX_DDP_BUF1_LEN(M_TCB_RX_DDP_BUF1_LEN << 32), - V_TCB_RX_DDP_BUF1_OFFSET((uint64_t)offset) | - V_TCB_RX_DDP_BUF1_LEN(((uint64_t)len) << 32)); -} - -static int -t3_set_cong_control(struct socket *so, const char *name) -{ -#ifdef CONGESTION_CONTROL_SUPPORTED - int cong_algo; - - for (cong_algo = 0; cong_algo < ARRAY_SIZE(t3_cong_ops); cong_algo++) - if (!strcmp(name, t3_cong_ops[cong_algo].name)) - break; - - if (cong_algo >= ARRAY_SIZE(t3_cong_ops)) - return -EINVAL; -#endif - return 0; -} - +/* What mtu_idx to use, given a 4-tuple and/or an MSS cap */ int -t3_get_tcb(struct toepcb *toep) +find_best_mtu_idx(struct adapter *sc, struct in_conninfo *inc, int pmss) { - struct cpl_get_tcb *req; - struct tcpcb *tp = toep->tp_tp; - struct mbuf *m = m_gethdr(M_NOWAIT, MT_DATA); + unsigned short *mtus = &sc->params.mtus[0]; + int i = 0, mss; - if (!m) - return (ENOMEM); - - inp_lock_assert(tp->t_inpcb); - m_set_priority(m, mkprio(CPL_PRIORITY_CONTROL, toep)); - req = mtod(m, struct cpl_get_tcb *); - m->m_pkthdr.len = m->m_len = sizeof(*req); - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - req->wr.wr_lo = 0; - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_GET_TCB, toep->tp_tid)); - req->cpuno = htons(toep->tp_qset); - req->rsvd = 0; - if (tp->t_state == TCPS_SYN_SENT) - mbufq_tail(&toep->out_of_order_queue, m); // defer - else - cxgb_ofld_send(TOEP_T3C_DEV(toep), m); - return 0; -} + KASSERT(inc != NULL || pmss > 0, + ("%s: at least one of inc/pmss must be specified", __func__)); -static inline void -so_insert_tid(struct tom_data *d, struct toepcb *toep, unsigned int tid) -{ + mss = inc ? tcp_mssopt(inc) : pmss; + if (pmss > 0 && mss > pmss) + mss = pmss; - toepcb_hold(toep); - - cxgb_insert_tid(d->cdev, d->client, toep, tid); -} - -/** - * find_best_mtu - find the entry in the MTU table closest to an MTU - * @d: TOM state - * @mtu: the target MTU - * - * Returns the index of the value in the MTU table that is closest to but - * does not exceed the target MTU. - */ -static unsigned int -find_best_mtu(const struct t3c_data *d, unsigned short mtu) -{ - int i = 0; - - while (i < d->nmtus - 1 && d->mtus[i + 1] <= mtu) + while (i < NMTUS - 1 && mtus[i + 1] <= mss + 40) ++i; + return (i); } -static unsigned int -select_mss(struct t3c_data *td, struct tcpcb *tp, unsigned int pmtu) -{ - unsigned int idx; - -#ifdef notyet - struct rtentry *dst = so_sotoinpcb(so)->inp_route.ro_rt; -#endif - if (tp) { - tp->t_maxseg = pmtu - 40; - if (tp->t_maxseg < td->mtus[0] - 40) - tp->t_maxseg = td->mtus[0] - 40; - idx = find_best_mtu(td, tp->t_maxseg + 40); - - tp->t_maxseg = td->mtus[idx] - 40; - } else - idx = find_best_mtu(td, pmtu); - - return (idx); -} - static inline void -free_atid(struct t3cdev *cdev, unsigned int tid) +purge_wr_queue(struct toepcb *toep) { - struct toepcb *toep = cxgb_free_atid(cdev, tid); + struct mbuf *m; + struct ofld_hdr *oh; - if (toep) - toepcb_release(toep); + while ((m = mbufq_dequeue(&toep->wr_list)) != NULL) { + oh = mtod(m, struct ofld_hdr *); + if (oh->flags & F_HDR_SGL) + sglist_free(oh->sgl); + m_freem(m); + } } /* - * Release resources held by an offload connection (TID, L2T entry, etc.) + * Release cxgb(4) and T3 resources held by an offload connection (TID, L2T + * entry, etc.) */ static void t3_release_offload_resources(struct toepcb *toep) { - struct tcpcb *tp = toep->tp_tp; - struct toedev *tdev = toep->tp_toedev; - struct t3cdev *cdev; - struct socket *so; - unsigned int tid = toep->tp_tid; - struct sockbuf *rcv; - - CTR0(KTR_TOM, "t3_release_offload_resources"); + struct toedev *tod = toep->tp_tod; + struct tom_data *td = t3_tomdata(tod); - if (!tdev) - return; - - cdev = TOEP_T3C_DEV(toep); - if (!cdev) - return; - - toep->tp_qset = 0; - t3_release_ddp_resources(toep); - -#ifdef CTRL_SKB_CACHE - kfree_skb(CTRL_SKB_CACHE(tp)); - CTRL_SKB_CACHE(tp) = NULL; -#endif - - if (toep->tp_wr_avail != toep->tp_wr_max) { - purge_wr_queue(toep); - reset_wr_list(toep); + /* + * The TOM explicitly detaches its toepcb from the system's inp before + * it releases the offload resources. + */ + if (toep->tp_inp) { + panic("%s: inp %p still attached to toepcb %p", + __func__, toep->tp_inp, toep); } + if (toep->tp_wr_avail != toep->tp_wr_max) + purge_wr_queue(toep); + if (toep->tp_l2t) { - l2t_release(L2DATA(cdev), toep->tp_l2t); + l2t_release(td->l2t, toep->tp_l2t); toep->tp_l2t = NULL; } - toep->tp_tp = NULL; - if (tp) { - inp_lock_assert(tp->t_inpcb); - so = inp_inpcbtosocket(tp->t_inpcb); - rcv = so_sockbuf_rcv(so); - /* - * cancel any offloaded reads - * - */ - sockbuf_lock(rcv); - tp->t_toe = NULL; - tp->t_flags &= ~TF_TOE; - if (toep->tp_ddp_state.user_ddp_pending) { - t3_cancel_ubuf(toep, rcv); - toep->tp_ddp_state.user_ddp_pending = 0; - } - so_sorwakeup_locked(so); - - } - - if (toep->tp_state == TCPS_SYN_SENT) { - free_atid(cdev, tid); -#ifdef notyet - __skb_queue_purge(&tp->out_of_order_queue); -#endif - } else { // we have TID - cxgb_remove_tid(cdev, toep, tid); - toepcb_release(toep); - } -#if 0 - log(LOG_INFO, "closing TID %u, state %u\n", tid, tp->t_state); -#endif -} -static void -install_offload_ops(struct socket *so) -{ - struct tcpcb *tp = so_sototcpcb(so); + if (toep->tp_tid >= 0) + release_tid(tod, toep->tp_tid, toep->tp_qset); - KASSERT(tp->t_toe != NULL, ("toepcb not set")); - - t3_install_socket_ops(so); - tp->t_flags |= TF_TOE; - tp->t_tu = &cxgb_toe_usrreqs; -} - -/* - * Determine the receive window scaling factor given a target max - * receive window. - */ -static __inline int -select_rcv_wscale(int space, struct vnet *vnet) -{ - int wscale = 0; - - if (space > MAX_RCV_WND) - space = MAX_RCV_WND; - - if (V_tcp_do_rfc1323) - for (; space > 65535 && wscale < 14; space >>= 1, ++wscale) ; - - return (wscale); + toepcb_free(toep); } /* * Determine the receive window size for a socket. */ -static unsigned long -select_rcv_wnd(struct toedev *dev, struct socket *so) +unsigned long +select_rcv_wnd(struct socket *so) { - struct tom_data *d = TOM_DATA(dev); - unsigned int wnd; - unsigned int max_rcv_wnd; - struct sockbuf *rcv; + unsigned long wnd; - rcv = so_sockbuf_rcv(so); - - if (V_tcp_do_autorcvbuf) - wnd = V_tcp_autorcvbuf_max; - else - wnd = rcv->sb_hiwat; + SOCKBUF_LOCK_ASSERT(&so->so_rcv); - - - /* XXX - * For receive coalescing to work effectively we need a receive window - * that can accomodate a coalesced segment. - */ + wnd = sbspace(&so->so_rcv); if (wnd < MIN_RCV_WND) - wnd = MIN_RCV_WND; - - /* PR 5138 */ - max_rcv_wnd = (dev->tod_ttid < TOE_ID_CHELSIO_T3C ? - (uint32_t)d->rx_page_size * 23 : - MAX_RCV_WND); - - return min(wnd, max_rcv_wnd); + wnd = MIN_RCV_WND; + + return min(wnd, MAX_RCV_WND); } -/* - * Assign offload parameters to some socket fields. This code is used by - * both active and passive opens. - */ -static inline void -init_offload_socket(struct socket *so, struct toedev *dev, unsigned int tid, - struct l2t_entry *e, struct rtentry *dst, struct toepcb *toep) +int +select_rcv_wscale(void) { - struct tcpcb *tp = so_sototcpcb(so); - struct t3c_data *td = T3C_DATA(TOM_DATA(dev)->cdev); - struct sockbuf *snd, *rcv; - -#ifdef notyet - SOCK_LOCK_ASSERT(so); -#endif - - snd = so_sockbuf_snd(so); - rcv = so_sockbuf_rcv(so); - - log(LOG_INFO, "initializing offload socket\n"); - /* - * We either need to fix push frames to work with sbcompress - * or we need to add this - */ - snd->sb_flags |= SB_NOCOALESCE; - rcv->sb_flags |= SB_NOCOALESCE; - + int wscale = 0; + unsigned long space = sb_max; + + if (space > MAX_RCV_WND) + space = MAX_RCV_WND; + + while (wscale < TCP_MAX_WINSHIFT && (TCP_MAXWIN << wscale) < space) + wscale++; + + return (wscale); +} + + +/* + * Set up the socket for TCP offload. + */ +void +offload_socket(struct socket *so, struct toepcb *toep) +{ + struct toedev *tod = toep->tp_tod; + struct tom_data *td = t3_tomdata(tod); + struct inpcb *inp = sotoinpcb(so); + struct tcpcb *tp = intotcpcb(inp); + + INP_WLOCK_ASSERT(inp); + + /* Update socket */ + SOCKBUF_LOCK(&so->so_snd); + so_sockbuf_snd(so)->sb_flags |= SB_NOCOALESCE; + SOCKBUF_UNLOCK(&so->so_snd); + SOCKBUF_LOCK(&so->so_rcv); + so_sockbuf_rcv(so)->sb_flags |= SB_NOCOALESCE; + SOCKBUF_UNLOCK(&so->so_rcv); + + /* Update TCP PCB */ + tp->tod = toep->tp_tod; tp->t_toe = toep; - toep->tp_tp = tp; - toep->tp_toedev = dev; - - toep->tp_tid = tid; - toep->tp_l2t = e; - toep->tp_wr_max = toep->tp_wr_avail = TOM_TUNABLE(dev, max_wrs); - toep->tp_wr_unacked = 0; - toep->tp_delack_mode = 0; - - toep->tp_mtu_idx = select_mss(td, tp, dst->rt_ifp->if_mtu); - /* - * XXX broken - * - */ - tp->rcv_wnd = select_rcv_wnd(dev, so); + tp->t_flags |= TF_TOE; - toep->tp_ulp_mode = TOM_TUNABLE(dev, ddp) && !(so_options_get(so) & SO_NO_DDP) && - tp->rcv_wnd >= MIN_DDP_RCV_WIN ? ULP_MODE_TCPDDP : 0; - toep->tp_qset_idx = 0; - - reset_wr_list(toep); - DPRINTF("initialization done\n"); + /* Install an extra hold on inp */ + toep->tp_inp = inp; + toep->tp_flags |= TP_ATTACHED; + in_pcbref(inp); + + /* Add the TOE PCB to the active list */ + mtx_lock(&td->toep_list_lock); + TAILQ_INSERT_HEAD(&td->toep_list, toep, link); + mtx_unlock(&td->toep_list_lock); +} + +/* This is _not_ the normal way to "unoffload" a socket. */ +void +undo_offload_socket(struct socket *so) +{ + struct inpcb *inp = sotoinpcb(so); + struct tcpcb *tp = intotcpcb(inp); + struct toepcb *toep = tp->t_toe; + struct toedev *tod = toep->tp_tod; + struct tom_data *td = t3_tomdata(tod); + + INP_WLOCK_ASSERT(inp); + + so_sockbuf_snd(so)->sb_flags &= ~SB_NOCOALESCE; + so_sockbuf_rcv(so)->sb_flags &= ~SB_NOCOALESCE; + + tp->tod = NULL; + tp->t_toe = NULL; + tp->t_flags &= ~TF_TOE; + + toep->tp_inp = NULL; + toep->tp_flags &= ~TP_ATTACHED; + if (in_pcbrele_wlocked(inp)) + panic("%s: inp freed.", __func__); + + mtx_lock(&td->toep_list_lock); + TAILQ_REMOVE(&td->toep_list, toep, link); + mtx_unlock(&td->toep_list_lock); } /* - * The next two functions calculate the option 0 value for a socket. + * Socket could be a listening socket, and we may not have a toepcb at all at + * this time. */ -static inline unsigned int -calc_opt0h(struct socket *so, int mtu_idx) +uint32_t +calc_opt0h(struct socket *so, int mtu_idx, int rscale, struct l2t_entry *e) { - struct tcpcb *tp = so_sototcpcb(so); - int wscale = select_rcv_wscale(tp->rcv_wnd, so->so_vnet); - - return V_NAGLE((tp->t_flags & TF_NODELAY) == 0) | - V_KEEP_ALIVE((so_options_get(so) & SO_KEEPALIVE) != 0) | F_TCAM_BYPASS | - V_WND_SCALE(wscale) | V_MSS_IDX(mtu_idx); + uint32_t opt0h = F_TCAM_BYPASS | V_WND_SCALE(rscale) | + V_MSS_IDX(mtu_idx); + + if (so != NULL) { + struct inpcb *inp = sotoinpcb(so); + struct tcpcb *tp = intotcpcb(inp); + int keepalive = always_keepalive || + so_options_get(so) & SO_KEEPALIVE; + + opt0h |= V_NAGLE((tp->t_flags & TF_NODELAY) == 0); + opt0h |= V_KEEP_ALIVE(keepalive != 0); + } + + if (e != NULL) + opt0h |= V_L2T_IDX(e->idx) | V_TX_CHANNEL(e->smt_idx); + + return (htobe32(opt0h)); } -static inline unsigned int -calc_opt0l(struct socket *so, int ulp_mode) +uint32_t +calc_opt0l(struct socket *so, int rcv_bufsize) { - struct tcpcb *tp = so_sototcpcb(so); - unsigned int val; - - val = V_TOS(INP_TOS(tp->t_inpcb)) | V_ULP_MODE(ulp_mode) | - V_RCV_BUFSIZ(min(tp->rcv_wnd >> 10, (u32)M_RCV_BUFSIZ)); + uint32_t opt0l = V_ULP_MODE(ULP_MODE_NONE) | V_RCV_BUFSIZ(rcv_bufsize); - DPRINTF("opt0l tos=%08x rcv_wnd=%ld opt0l=%08x\n", INP_TOS(tp->t_inpcb), tp->rcv_wnd, val); - return (val); + KASSERT(rcv_bufsize <= M_RCV_BUFSIZ, + ("%s: rcv_bufsize (%d) is too high", __func__, rcv_bufsize)); + + if (so != NULL) /* optional because noone cares about IP TOS */ + opt0l |= V_TOS(INP_TOS(sotoinpcb(so))); + + return (htobe32(opt0l)); } -static inline unsigned int -calc_opt2(const struct socket *so, struct toedev *dev) -{ - int flv_valid; - - flv_valid = (TOM_TUNABLE(dev, cong_alg) != -1); - - return (V_FLAVORS_VALID(flv_valid) | - V_CONG_CONTROL_FLAVOR(flv_valid ? TOM_TUNABLE(dev, cong_alg) : 0)); -} - -#if DEBUG_WR > 1 -static int -count_pending_wrs(const struct toepcb *toep) -{ - const struct mbuf *m; - int n = 0; - - wr_queue_walk(toep, m) - n += m->m_pkthdr.csum_data; - return (n); -} -#endif - -#if 0 -(((*(struct tom_data **)&(dev)->l4opt)->conf.cong_alg) != -1) -#endif - -static void -mk_act_open_req(struct socket *so, struct mbuf *m, - unsigned int atid, const struct l2t_entry *e) -{ - struct cpl_act_open_req *req; - struct inpcb *inp = so_sotoinpcb(so); - struct tcpcb *tp = inp_inpcbtotcpcb(inp); - struct toepcb *toep = tp->t_toe; - struct toedev *tdev = toep->tp_toedev; - - m_set_priority((struct mbuf *)m, mkprio(CPL_PRIORITY_SETUP, toep)); - - req = mtod(m, struct cpl_act_open_req *); - m->m_pkthdr.len = m->m_len = sizeof(*req); - - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - req->wr.wr_lo = 0; - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_ACT_OPEN_REQ, atid)); - inp_4tuple_get(inp, &req->local_ip, &req->local_port, &req->peer_ip, &req->peer_port); -#if 0 - req->local_port = inp->inp_lport; - req->peer_port = inp->inp_fport; - memcpy(&req->local_ip, &inp->inp_laddr, 4); - memcpy(&req->peer_ip, &inp->inp_faddr, 4); -#endif - req->opt0h = htonl(calc_opt0h(so, toep->tp_mtu_idx) | V_L2T_IDX(e->idx) | - V_TX_CHANNEL(e->smt_idx)); - req->opt0l = htonl(calc_opt0l(so, toep->tp_ulp_mode)); - req->params = 0; - req->opt2 = htonl(calc_opt2(so, tdev)); -} - - /* * Convert an ACT_OPEN_RPL status to an errno. */ @@ -1422,61 +889,6 @@ act_open_rpl_status_to_errno(int status) } } -static void -fail_act_open(struct toepcb *toep, int errno) -{ - struct tcpcb *tp = toep->tp_tp; - - t3_release_offload_resources(toep); - if (tp) { - inp_wunlock(tp->t_inpcb); - tcp_offload_drop(tp, errno); - } - -#ifdef notyet - TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); -#endif -} - -/* - * Handle active open failures. - */ -static void -active_open_failed(struct toepcb *toep, struct mbuf *m) -{ - struct cpl_act_open_rpl *rpl = cplhdr(m); - struct inpcb *inp; - - if (toep->tp_tp == NULL) - goto done; - - inp = toep->tp_tp->t_inpcb; - -/* - * Don't handle connection retry for now - */ -#ifdef notyet - struct inet_connection_sock *icsk = inet_csk(sk); - - if (rpl->status == CPL_ERR_CONN_EXIST && - icsk->icsk_retransmit_timer.function != act_open_retry_timer) { - icsk->icsk_retransmit_timer.function = act_open_retry_timer; - sk_reset_timer(so, &icsk->icsk_retransmit_timer, - jiffies + HZ / 2); - } else -#endif - { - inp_wlock(inp); - /* - * drops the inpcb lock - */ - fail_act_open(toep, act_open_rpl_status_to_errno(rpl->status)); - } - - done: - m_free(m); -} - /* * Return whether a failed active open has allocated a TID */ @@ -1488,1072 +900,350 @@ act_open_has_tid(int status) } /* - * Process an ACT_OPEN_RPL CPL message. + * Active open failed. */ static int -do_act_open_rpl(struct t3cdev *cdev, struct mbuf *m, void *ctx) +do_act_open_rpl(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { - struct toepcb *toep = (struct toepcb *)ctx; - struct cpl_act_open_rpl *rpl = cplhdr(m); - - if (cdev->type != T3A && act_open_has_tid(rpl->status)) - cxgb_queue_tid_release(cdev, GET_TID(rpl)); - - active_open_failed(toep, m); + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct toedev *tod = &td->tod; + struct cpl_act_open_rpl *rpl = mtod(m, void *); + unsigned int atid = G_TID(ntohl(rpl->atid)); + struct toepcb *toep = lookup_atid(&td->tid_maps, atid); + struct inpcb *inp = toep->tp_inp; + struct tcpcb *tp = intotcpcb(inp); + int s = rpl->status; + + CTR3(KTR_CXGB, "%s: atid %u, status %u ", __func__, atid, s); + + free_atid(&td->tid_maps, atid); + toep->tp_tid = -1; + + if (act_open_has_tid(s)) + queue_tid_release(tod, GET_TID(rpl)); + + if (s == CPL_ERR_TCAM_FULL || s == CPL_ERR_CONN_EXIST) { + INP_WLOCK(inp); + toe_connect_failed(tod, tp, EAGAIN); + toepcb_release(toep); /* unlocks inp */ + } else { + INP_INFO_WLOCK(&V_tcbinfo); + INP_WLOCK(inp); + toe_connect_failed(tod, tp, act_open_rpl_status_to_errno(s)); + toepcb_release(toep); /* unlocks inp */ + INP_INFO_WUNLOCK(&V_tcbinfo); + } + + m_freem(m); return (0); } -/* - * Handle an ARP failure for an active open. XXX purge ofo queue - * - * XXX badly broken for crossed SYNs as the ATID is no longer valid. - * XXX crossed SYN errors should be generated by PASS_ACCEPT_RPL which should - * check SOCK_DEAD or sk->sk_sock. Or maybe generate the error here but don't - * free the atid. Hmm. - */ -#ifdef notyet -static void -act_open_req_arp_failure(struct t3cdev *dev, struct mbuf *m) -{ - struct toepcb *toep = m_get_toep(m); - struct tcpcb *tp = toep->tp_tp; - struct inpcb *inp = tp->t_inpcb; - struct socket *so; - - inp_wlock(inp); - if (tp->t_state == TCPS_SYN_SENT || tp->t_state == TCPS_SYN_RECEIVED) { - /* - * drops the inpcb lock - */ - fail_act_open(so, EHOSTUNREACH); - printf("freeing %p\n", m); - - m_free(m); - } else - inp_wunlock(inp); -} -#endif /* * Send an active open request. + * + * State of affairs on entry: + * soisconnecting (so_state |= SS_ISCONNECTING) + * tcbinfo not locked (this has changed - used to be WLOCKed) + * inp WLOCKed + * tp->t_state = TCPS_SYN_SENT + * rtalloc1, RT_UNLOCK on rt. */ int -t3_connect(struct toedev *tdev, struct socket *so, +t3_connect(struct toedev *tod, struct socket *so, struct rtentry *rt, struct sockaddr *nam) { - struct mbuf *m; - struct l2t_entry *e; - struct tom_data *d = TOM_DATA(tdev); - struct inpcb *inp = so_sotoinpcb(so); + struct mbuf *m = NULL; + struct l2t_entry *e = NULL; + struct tom_data *td = t3_tomdata(tod); + struct adapter *sc = tod->tod_softc; + struct cpl_act_open_req *cpl; + struct inpcb *inp = sotoinpcb(so); struct tcpcb *tp = intotcpcb(inp); - struct toepcb *toep; /* allocated by init_offload_socket */ - - int atid; + struct toepcb *toep; + int atid = -1, mtu_idx, rscale, cpu_idx, qset; + struct sockaddr *gw; + struct ifnet *ifp = rt->rt_ifp; + struct port_info *pi = ifp->if_softc; /* XXX wrong for VLAN etc. */ - toep = toepcb_alloc(); + INP_WLOCK_ASSERT(inp); + + toep = toepcb_alloc(tod); if (toep == NULL) - goto out_err; - - if ((atid = cxgb_alloc_atid(d->cdev, d->client, toep)) < 0) - goto out_err; - - e = t3_l2t_get(d->cdev, rt, rt->rt_ifp, nam); - if (!e) - goto free_tid; + goto failed; - inp_lock_assert(inp); - m = m_gethdr(MT_DATA, M_WAITOK); - -#if 0 - m->m_toe.mt_toepcb = tp->t_toe; - set_arp_failure_handler((struct mbuf *)m, act_open_req_arp_failure); -#endif - so_lock(so); - - init_offload_socket(so, tdev, atid, e, rt, toep); - - install_offload_ops(so); - - mk_act_open_req(so, m, atid, e); - so_unlock(so); - - soisconnecting(so); - toep = tp->t_toe; - m_set_toep(m, tp->t_toe); - - toep->tp_state = TCPS_SYN_SENT; - l2t_send(d->cdev, (struct mbuf *)m, e); + atid = alloc_atid(&td->tid_maps, toep); + if (atid < 0) + goto failed; - if (toep->tp_ulp_mode) - t3_enable_ddp(toep, 0); - return (0); - -free_tid: - printf("failing connect - free atid\n"); - - free_atid(d->cdev, atid); -out_err: - printf("return ENOMEM\n"); - return (ENOMEM); + qset = pi->first_qset + (arc4random() % pi->nqsets); + + m = M_GETHDR_OFLD(qset, CPL_PRIORITY_CONTROL, cpl); + if (m == NULL) + goto failed; + + gw = rt->rt_flags & RTF_GATEWAY ? rt->rt_gateway : nam; + e = t3_l2t_get(pi, ifp, gw); + if (e == NULL) + goto failed; + + toep->tp_l2t = e; + toep->tp_tid = atid; /* used to double check response */ + toep->tp_qset = qset; + + SOCKBUF_LOCK(&so->so_rcv); + /* opt0 rcv_bufsiz initially, assumes its normal meaning later */ + toep->tp_rx_credits = min(select_rcv_wnd(so) >> 10, M_RCV_BUFSIZ); + SOCKBUF_UNLOCK(&so->so_rcv); + + offload_socket(so, toep); + + /* + * The kernel sets request_r_scale based on sb_max whereas we need to + * take hardware's MAX_RCV_WND into account too. This is normally a + * no-op as MAX_RCV_WND is much larger than the default sb_max. + */ + if (tp->t_flags & TF_REQ_SCALE) + rscale = tp->request_r_scale = select_rcv_wscale(); + else + rscale = 0; + mtu_idx = find_best_mtu_idx(sc, &inp->inp_inc, 0); + cpu_idx = sc->rrss_map[qset]; + + cpl->wr.wrh_hi = htobe32(V_WR_OP(FW_WROPCODE_FORWARD)); + cpl->wr.wrh_lo = 0; + OPCODE_TID(cpl) = htobe32(MK_OPCODE_TID(CPL_ACT_OPEN_REQ, atid)); + inp_4tuple_get(inp, &cpl->local_ip, &cpl->local_port, &cpl->peer_ip, + &cpl->peer_port); + cpl->opt0h = calc_opt0h(so, mtu_idx, rscale, e); + cpl->opt0l = calc_opt0l(so, toep->tp_rx_credits); + cpl->params = 0; + cpl->opt2 = calc_opt2(cpu_idx); + + CTR5(KTR_CXGB, "%s: atid %u (%s), toep %p, inp %p", __func__, + toep->tp_tid, tcpstates[tp->t_state], toep, inp); + + if (l2t_send(sc, m, e) == 0) + return (0); + + undo_offload_socket(so); + +failed: + CTR5(KTR_CXGB, "%s: FAILED, atid %d, toep %p, l2te %p, mbuf %p", + __func__, atid, toep, e, m); + + if (atid >= 0) + free_atid(&td->tid_maps, atid); + + if (e) + l2t_release(td->l2t, e); + + if (toep) + toepcb_free(toep); + + m_freem(m); + + return (ENOMEM); } /* - * Send an ABORT_REQ message. Cannot fail. This routine makes sure we do - * not send multiple ABORT_REQs for the same connection and also that we do - * not try to send a message after the connection has closed. Returns 1 if - * an ABORT_REQ wasn't generated after all, 0 otherwise. + * Send an ABORT_REQ message. Cannot fail. This routine makes sure we do not + * send multiple ABORT_REQs for the same connection and also that we do not try + * to send a message after the connection has closed. */ static void -t3_send_reset(struct toepcb *toep) +send_reset(struct toepcb *toep) { - + struct cpl_abort_req *req; unsigned int tid = toep->tp_tid; - int mode = CPL_ABORT_SEND_RST; - struct tcpcb *tp = toep->tp_tp; - struct toedev *tdev = toep->tp_toedev; - struct socket *so = NULL; + struct inpcb *inp = toep->tp_inp; + struct socket *so = inp->inp_socket; + struct tcpcb *tp = intotcpcb(inp); + struct toedev *tod = toep->tp_tod; + struct adapter *sc = tod->tod_softc; struct mbuf *m; - struct sockbuf *snd; - - if (tp) { - inp_lock_assert(tp->t_inpcb); - so = inp_inpcbtosocket(tp->t_inpcb); - } - - if (__predict_false((toep->tp_flags & TP_ABORT_SHUTDOWN) || - tdev == NULL)) + + INP_INFO_WLOCK_ASSERT(&V_tcbinfo); + INP_WLOCK_ASSERT(inp); + + CTR4(KTR_CXGB, "%s: tid %d, toep %p (%x)", __func__, tid, toep, + toep->tp_flags); + + if (toep->tp_flags & TP_ABORT_SHUTDOWN) return; - toep->tp_flags |= (TP_ABORT_RPL_PENDING|TP_ABORT_SHUTDOWN); - snd = so_sockbuf_snd(so); - /* Purge the send queue so we don't send anything after an abort. */ - if (so) - sbflush(snd); - if ((toep->tp_flags & TP_CLOSE_CON_REQUESTED) && is_t3a(tdev)) - mode |= CPL_ABORT_POST_CLOSE_REQ; + toep->tp_flags |= (TP_ABORT_RPL_PENDING | TP_ABORT_SHUTDOWN); - m = m_gethdr_nofail(sizeof(*req)); - m_set_priority(m, mkprio(CPL_PRIORITY_DATA, toep)); - set_arp_failure_handler(m, abort_arp_failure); + /* Purge the send queue */ + sbflush(so_sockbuf_snd(so)); + purge_wr_queue(toep); - req = mtod(m, struct cpl_abort_req *); - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_HOST_ABORT_CON_REQ)); - req->wr.wr_lo = htonl(V_WR_TID(tid)); + m = M_GETHDR_OFLD(toep->tp_qset, CPL_PRIORITY_DATA, req); + if (m == NULL) + CXGB_UNIMPLEMENTED(); + + req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_HOST_ABORT_CON_REQ)); + req->wr.wrh_lo = htonl(V_WR_TID(tid)); OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_ABORT_REQ, tid)); - req->rsvd0 = tp ? htonl(tp->snd_nxt) : 0; + req->rsvd0 = htonl(tp->snd_nxt); req->rsvd1 = !(toep->tp_flags & TP_DATASENT); - req->cmd = mode; - if (tp && (tp->t_state == TCPS_SYN_SENT)) - mbufq_tail(&toep->out_of_order_queue, m); // defer + req->cmd = CPL_ABORT_SEND_RST; + + if (tp->t_state == TCPS_SYN_SENT) + mbufq_tail(&toep->out_of_order_queue, m); /* defer */ else - l2t_send(TOEP_T3C_DEV(toep), m, toep->tp_l2t); -} - -static int -t3_ip_ctloutput(struct socket *so, struct sockopt *sopt) -{ - struct inpcb *inp; - int error, optval; - - if (sopt->sopt_name == IP_OPTIONS) - return (ENOPROTOOPT); - - if (sopt->sopt_name != IP_TOS) - return (EOPNOTSUPP); - - error = sooptcopyin(sopt, &optval, sizeof optval, sizeof optval); - - if (error) - return (error); - - if (optval > IPTOS_PREC_CRITIC_ECP) - return (EINVAL); - - inp = so_sotoinpcb(so); - inp_wlock(inp); - inp_ip_tos_set(inp, optval); -#if 0 - inp->inp_ip_tos = optval; -#endif - t3_set_tos(inp_inpcbtotcpcb(inp)->t_toe); - inp_wunlock(inp); - - return (0); -} - -static int -t3_tcp_ctloutput(struct socket *so, struct sockopt *sopt) -{ - int err = 0; - size_t copied; - - if (sopt->sopt_name != TCP_CONGESTION && - sopt->sopt_name != TCP_NODELAY) - return (EOPNOTSUPP); - - if (sopt->sopt_name == TCP_CONGESTION) { - char name[TCP_CA_NAME_MAX]; - int optlen = sopt->sopt_valsize; - struct tcpcb *tp; - - if (sopt->sopt_dir == SOPT_GET) { - KASSERT(0, ("unimplemented")); - return (EOPNOTSUPP); - } - - if (optlen < 1) - return (EINVAL); - - err = copyinstr(sopt->sopt_val, name, - min(TCP_CA_NAME_MAX - 1, optlen), &copied); - if (err) - return (err); - if (copied < 1) - return (EINVAL); - - tp = so_sototcpcb(so); - /* - * XXX I need to revisit this - */ - if ((err = t3_set_cong_control(so, name)) == 0) { -#ifdef CONGESTION_CONTROL_SUPPORTED - tp->t_cong_control = strdup(name, M_CXGB); -#endif - } else - return (err); - } else { - int optval, oldval; - struct inpcb *inp; - struct tcpcb *tp; - - if (sopt->sopt_dir == SOPT_GET) - return (EOPNOTSUPP); - - err = sooptcopyin(sopt, &optval, sizeof optval, - sizeof optval); - - if (err) - return (err); - - inp = so_sotoinpcb(so); - inp_wlock(inp); - tp = inp_inpcbtotcpcb(inp); - - oldval = tp->t_flags; - if (optval) - tp->t_flags |= TF_NODELAY; - else - tp->t_flags &= ~TF_NODELAY; - inp_wunlock(inp); - - - if (oldval != tp->t_flags && (tp->t_toe != NULL)) - t3_set_nagle(tp->t_toe); - - } - - return (0); + l2t_send(sc, m, toep->tp_l2t); } int -t3_ctloutput(struct socket *so, struct sockopt *sopt) +t3_send_rst(struct toedev *tod __unused, struct tcpcb *tp) { - int err; - if (sopt->sopt_level != IPPROTO_TCP) - err = t3_ip_ctloutput(so, sopt); - else - err = t3_tcp_ctloutput(so, sopt); - - if (err != EOPNOTSUPP) - return (err); - - return (tcp_ctloutput(so, sopt)); -} - -/* - * Returns true if we need to explicitly request RST when we receive new data - * on an RX-closed connection. - */ -static inline int -need_rst_on_excess_rx(const struct toepcb *toep) -{ - return (1); -} - -/* - * Handles Rx data that arrives in a state where the socket isn't accepting - * new data. - */ -static void -handle_excess_rx(struct toepcb *toep, struct mbuf *m) -{ - - if (need_rst_on_excess_rx(toep) && - !(toep->tp_flags & TP_ABORT_SHUTDOWN)) - t3_send_reset(toep); - m_freem(m); -} - -/* - * Process a get_tcb_rpl as a DDP completion (similar to RX_DDP_COMPLETE) - * by getting the DDP offset from the TCB. - */ -static void -tcb_rpl_as_ddp_complete(struct toepcb *toep, struct mbuf *m) -{ - struct ddp_state *q = &toep->tp_ddp_state; - struct ddp_buf_state *bsp; - struct cpl_get_tcb_rpl *hdr; - unsigned int ddp_offset; - struct socket *so; - struct tcpcb *tp; - struct sockbuf *rcv; - int state; - - uint64_t t; - __be64 *tcb; - - tp = toep->tp_tp; - so = inp_inpcbtosocket(tp->t_inpcb); - - inp_lock_assert(tp->t_inpcb); - rcv = so_sockbuf_rcv(so); - sockbuf_lock(rcv); - - /* Note that we only accout for CPL_GET_TCB issued by the DDP code. - * We really need a cookie in order to dispatch the RPLs. - */ - q->get_tcb_count--; - - /* It is a possible that a previous CPL already invalidated UBUF DDP - * and moved the cur_buf idx and hence no further processing of this - * skb is required. However, the app might be sleeping on - * !q->get_tcb_count and we need to wake it up. - */ - if (q->cancel_ubuf && !t3_ddp_ubuf_pending(toep)) { - int state = so_state_get(so); - - m_freem(m); - if (__predict_true((state & SS_NOFDREF) == 0)) - so_sorwakeup_locked(so); - else - sockbuf_unlock(rcv); - - return; - } - - bsp = &q->buf_state[q->cur_buf]; - hdr = cplhdr(m); - tcb = (__be64 *)(hdr + 1); - if (q->cur_buf == 0) { - t = be64toh(tcb[(31 - W_TCB_RX_DDP_BUF0_OFFSET) / 2]); - ddp_offset = t >> (32 + S_TCB_RX_DDP_BUF0_OFFSET); - } else { - t = be64toh(tcb[(31 - W_TCB_RX_DDP_BUF1_OFFSET) / 2]); - ddp_offset = t >> S_TCB_RX_DDP_BUF1_OFFSET; - } - ddp_offset &= M_TCB_RX_DDP_BUF0_OFFSET; - m->m_cur_offset = bsp->cur_offset; - bsp->cur_offset = ddp_offset; - m->m_len = m->m_pkthdr.len = ddp_offset - m->m_cur_offset; - - CTR5(KTR_TOM, - "tcb_rpl_as_ddp_complete: idx=%d seq=0x%x hwbuf=%u ddp_offset=%u cur_offset=%u", - q->cur_buf, tp->rcv_nxt, q->cur_buf, ddp_offset, m->m_cur_offset); - KASSERT(ddp_offset >= m->m_cur_offset, - ("ddp_offset=%u less than cur_offset=%u", - ddp_offset, m->m_cur_offset)); - -#if 0 -{ - unsigned int ddp_flags, rcv_nxt, rx_hdr_offset, buf_idx; - - t = be64toh(tcb[(31 - W_TCB_RX_DDP_FLAGS) / 2]); - ddp_flags = (t >> S_TCB_RX_DDP_FLAGS) & M_TCB_RX_DDP_FLAGS; - - t = be64toh(tcb[(31 - W_TCB_RCV_NXT) / 2]); - rcv_nxt = t >> S_TCB_RCV_NXT; - rcv_nxt &= M_TCB_RCV_NXT; - - t = be64toh(tcb[(31 - W_TCB_RX_HDR_OFFSET) / 2]); - rx_hdr_offset = t >> (32 + S_TCB_RX_HDR_OFFSET); - rx_hdr_offset &= M_TCB_RX_HDR_OFFSET; - - T3_TRACE2(TIDTB(sk), - "tcb_rpl_as_ddp_complete: DDP FLAGS 0x%x dma up to 0x%x", - ddp_flags, rcv_nxt - rx_hdr_offset); - T3_TRACE4(TB(q), - "tcb_rpl_as_ddp_complete: rcvnxt 0x%x hwbuf %u cur_offset %u cancel %u", - tp->rcv_nxt, q->cur_buf, bsp->cur_offset, q->cancel_ubuf); - T3_TRACE3(TB(q), - "tcb_rpl_as_ddp_complete: TCB rcvnxt 0x%x hwbuf 0x%x ddp_offset %u", - rcv_nxt - rx_hdr_offset, ddp_flags, ddp_offset); - T3_TRACE2(TB(q), - "tcb_rpl_as_ddp_complete: flags0 0x%x flags1 0x%x", - q->buf_state[0].flags, q->buf_state[1].flags); - -} -#endif - if (__predict_false(so_no_receive(so) && m->m_pkthdr.len)) { - handle_excess_rx(toep, m); - return; - } - -#ifdef T3_TRACE - if ((int)m->m_pkthdr.len < 0) { - t3_ddp_error(so, "tcb_rpl_as_ddp_complete: neg len"); - } -#endif - if (bsp->flags & DDP_BF_NOCOPY) { -#ifdef T3_TRACE - T3_TRACE0(TB(q), - "tcb_rpl_as_ddp_complete: CANCEL UBUF"); - - if (!q->cancel_ubuf && !(sk->sk_shutdown & RCV_SHUTDOWN)) { - printk("!cancel_ubuf"); - t3_ddp_error(sk, "tcb_rpl_as_ddp_complete: !cancel_ubuf"); - } -#endif - m->m_ddp_flags = DDP_BF_PSH | DDP_BF_NOCOPY | 1; - bsp->flags &= ~(DDP_BF_NOCOPY|DDP_BF_NODATA); - q->cur_buf ^= 1; - } else if (bsp->flags & DDP_BF_NOFLIP) { - - m->m_ddp_flags = 1; /* always a kernel buffer */ - - /* now HW buffer carries a user buffer */ - bsp->flags &= ~DDP_BF_NOFLIP; - bsp->flags |= DDP_BF_NOCOPY; - - /* It is possible that the CPL_GET_TCB_RPL doesn't indicate - * any new data in which case we're done. If in addition the - * offset is 0, then there wasn't a completion for the kbuf - * and we need to decrement the posted count. - */ - if (m->m_pkthdr.len == 0) { - if (ddp_offset == 0) { - q->kbuf_posted--; - bsp->flags |= DDP_BF_NODATA; - } - sockbuf_unlock(rcv); - m_free(m); - return; - } - } else { - sockbuf_unlock(rcv); - - /* This reply is for a CPL_GET_TCB_RPL to cancel the UBUF DDP, - * but it got here way late and nobody cares anymore. - */ - m_free(m); - return; - } - - m->m_ddp_gl = (unsigned char *)bsp->gl; - m->m_flags |= M_DDP; - m->m_seq = tp->rcv_nxt; - tp->rcv_nxt += m->m_pkthdr.len; - tp->t_rcvtime = ticks; - CTR3(KTR_TOM, "tcb_rpl_as_ddp_complete: seq 0x%x hwbuf %u m->m_pktlen %u", - m->m_seq, q->cur_buf, m->m_pkthdr.len); - if (m->m_pkthdr.len == 0) { - q->user_ddp_pending = 0; - m_free(m); - } else - SBAPPEND(rcv, m); - - state = so_state_get(so); - if (__predict_true((state & SS_NOFDREF) == 0)) - so_sorwakeup_locked(so); - else - sockbuf_unlock(rcv); -} - -/* - * Process a CPL_GET_TCB_RPL. These can also be generated by the DDP code, - * in that case they are similar to DDP completions. - */ -static int -do_get_tcb_rpl(struct t3cdev *cdev, struct mbuf *m, void *ctx) -{ - struct toepcb *toep = (struct toepcb *)ctx; - - /* OK if socket doesn't exist */ - if (toep == NULL) { - printf("null toep in do_get_tcb_rpl\n"); - return (CPL_RET_BUF_DONE); - } - - inp_wlock(toep->tp_tp->t_inpcb); - tcb_rpl_as_ddp_complete(toep, m); - inp_wunlock(toep->tp_tp->t_inpcb); - + send_reset(tp->t_toe); return (0); } -static void -handle_ddp_data(struct toepcb *toep, struct mbuf *m) -{ - struct tcpcb *tp = toep->tp_tp; - struct socket *so; - struct ddp_state *q; - struct ddp_buf_state *bsp; - struct cpl_rx_data *hdr = cplhdr(m); - unsigned int rcv_nxt = ntohl(hdr->seq); - struct sockbuf *rcv; - - if (tp->rcv_nxt == rcv_nxt) - return; - - inp_lock_assert(tp->t_inpcb); - so = inp_inpcbtosocket(tp->t_inpcb); - rcv = so_sockbuf_rcv(so); - sockbuf_lock(rcv); - - q = &toep->tp_ddp_state; - bsp = &q->buf_state[q->cur_buf]; - KASSERT(SEQ_GT(rcv_nxt, tp->rcv_nxt), ("tp->rcv_nxt=0x%08x decreased rcv_nxt=0x08%x", - rcv_nxt, tp->rcv_nxt)); - m->m_len = m->m_pkthdr.len = rcv_nxt - tp->rcv_nxt; - KASSERT(m->m_len > 0, ("%s m_len=%d", __FUNCTION__, m->m_len)); - CTR3(KTR_TOM, "rcv_nxt=0x%x tp->rcv_nxt=0x%x len=%d", - rcv_nxt, tp->rcv_nxt, m->m_pkthdr.len); - -#ifdef T3_TRACE - if ((int)m->m_pkthdr.len < 0) { - t3_ddp_error(so, "handle_ddp_data: neg len"); - } -#endif - m->m_ddp_gl = (unsigned char *)bsp->gl; - m->m_flags |= M_DDP; - m->m_cur_offset = bsp->cur_offset; - m->m_ddp_flags = DDP_BF_PSH | (bsp->flags & DDP_BF_NOCOPY) | 1; - if (bsp->flags & DDP_BF_NOCOPY) - bsp->flags &= ~DDP_BF_NOCOPY; - - m->m_seq = tp->rcv_nxt; - tp->rcv_nxt = rcv_nxt; - bsp->cur_offset += m->m_pkthdr.len; - if (!(bsp->flags & DDP_BF_NOFLIP)) - q->cur_buf ^= 1; - /* - * For now, don't re-enable DDP after a connection fell out of DDP - * mode. - */ - q->ubuf_ddp_ready = 0; - sockbuf_unlock(rcv); -} - -/* - * Process new data received for a connection. - */ -static void -new_rx_data(struct toepcb *toep, struct mbuf *m) -{ - struct cpl_rx_data *hdr = cplhdr(m); - struct tcpcb *tp = toep->tp_tp; - struct socket *so; - struct sockbuf *rcv; - int state; - int len = be16toh(hdr->len); - - inp_wlock(tp->t_inpcb); - - so = inp_inpcbtosocket(tp->t_inpcb); - - if (__predict_false(so_no_receive(so))) { - handle_excess_rx(toep, m); - inp_wunlock(tp->t_inpcb); - TRACE_EXIT; - return; - } - - if (toep->tp_ulp_mode == ULP_MODE_TCPDDP) - handle_ddp_data(toep, m); - - m->m_seq = ntohl(hdr->seq); - m->m_ulp_mode = 0; /* for iSCSI */ - -#if VALIDATE_SEQ - if (__predict_false(m->m_seq != tp->rcv_nxt)) { - log(LOG_ERR, - "%s: TID %u: Bad sequence number %u, expected %u\n", - toep->tp_toedev->name, toep->tp_tid, m->m_seq, - tp->rcv_nxt); - m_freem(m); - inp_wunlock(tp->t_inpcb); - return; - } -#endif - m_adj(m, sizeof(*hdr)); - -#ifdef URGENT_DATA_SUPPORTED - /* - * We don't handle urgent data yet - */ - if (__predict_false(hdr->urg)) - handle_urg_ptr(so, tp->rcv_nxt + ntohs(hdr->urg)); - if (__predict_false(tp->urg_data == TCP_URG_NOTYET && - tp->urg_seq - tp->rcv_nxt < skb->len)) - tp->urg_data = TCP_URG_VALID | skb->data[tp->urg_seq - - tp->rcv_nxt]; -#endif - if (__predict_false(hdr->dack_mode != toep->tp_delack_mode)) { - toep->tp_delack_mode = hdr->dack_mode; - toep->tp_delack_seq = tp->rcv_nxt; - } - CTR6(KTR_TOM, "appending mbuf=%p pktlen=%d m_len=%d len=%d rcv_nxt=0x%x enqueued_bytes=%d", - m, m->m_pkthdr.len, m->m_len, len, tp->rcv_nxt, toep->tp_enqueued_bytes); - - if (len < m->m_pkthdr.len) - m->m_pkthdr.len = m->m_len = len; - - tp->rcv_nxt += m->m_pkthdr.len; - tp->t_rcvtime = ticks; - toep->tp_enqueued_bytes += m->m_pkthdr.len; - CTR2(KTR_TOM, - "new_rx_data: seq 0x%x len %u", - m->m_seq, m->m_pkthdr.len); - inp_wunlock(tp->t_inpcb); - rcv = so_sockbuf_rcv(so); - sockbuf_lock(rcv); -#if 0 - if (sb_notify(rcv)) - DPRINTF("rx_data so=%p flags=0x%x len=%d\n", so, rcv->sb_flags, m->m_pkthdr.len); -#endif - SBAPPEND(rcv, m); - -#ifdef notyet - /* - * We're giving too many credits to the card - but disable this check so we can keep on moving :-| - * - */ - KASSERT(rcv->sb_cc < (rcv->sb_mbmax << 1), - - ("so=%p, data contents exceed mbmax, sb_cc=%d sb_mbmax=%d", - so, rcv->sb_cc, rcv->sb_mbmax)); -#endif - - - CTR2(KTR_TOM, "sb_cc=%d sb_mbcnt=%d", - rcv->sb_cc, rcv->sb_mbcnt); - - state = so_state_get(so); - if (__predict_true((state & SS_NOFDREF) == 0)) - so_sorwakeup_locked(so); - else - sockbuf_unlock(rcv); -} - /* * Handler for RX_DATA CPL messages. */ static int -do_rx_data(struct t3cdev *cdev, struct mbuf *m, void *ctx) -{ - struct toepcb *toep = (struct toepcb *)ctx; - - DPRINTF("rx_data len=%d\n", m->m_pkthdr.len); - - new_rx_data(toep, m); - - return (0); -} - -static void -new_rx_data_ddp(struct toepcb *toep, struct mbuf *m) +do_rx_data(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct cpl_rx_data *hdr = mtod(m, void *); + unsigned int tid = GET_TID(hdr); + struct toepcb *toep = lookup_tid(&td->tid_maps, tid); + struct inpcb *inp = toep->tp_inp; struct tcpcb *tp; - struct ddp_state *q; - struct ddp_buf_state *bsp; - struct cpl_rx_data_ddp *hdr; - struct socket *so; - unsigned int ddp_len, rcv_nxt, ddp_report, end_offset, buf_idx; - int nomoredata = 0; - unsigned int delack_mode; - struct sockbuf *rcv; - - tp = toep->tp_tp; - inp_wlock(tp->t_inpcb); - so = inp_inpcbtosocket(tp->t_inpcb); - - if (__predict_false(so_no_receive(so))) { - - handle_excess_rx(toep, m); - inp_wunlock(tp->t_inpcb); - return; - } - - q = &toep->tp_ddp_state; - hdr = cplhdr(m); - ddp_report = ntohl(hdr->u.ddp_report); - buf_idx = (ddp_report >> S_DDP_BUF_IDX) & 1; - bsp = &q->buf_state[buf_idx]; - - CTR4(KTR_TOM, - "new_rx_data_ddp: tp->rcv_nxt 0x%x cur_offset %u " - "hdr seq 0x%x len %u", - tp->rcv_nxt, bsp->cur_offset, ntohl(hdr->seq), - ntohs(hdr->len)); - CTR3(KTR_TOM, - "new_rx_data_ddp: offset %u ddp_report 0x%x buf_idx=%d", - G_DDP_OFFSET(ddp_report), ddp_report, buf_idx); - - ddp_len = ntohs(hdr->len); - rcv_nxt = ntohl(hdr->seq) + ddp_len; - - delack_mode = G_DDP_DACK_MODE(ddp_report); - if (__predict_false(G_DDP_DACK_MODE(ddp_report) != toep->tp_delack_mode)) { - toep->tp_delack_mode = delack_mode; - toep->tp_delack_seq = tp->rcv_nxt; - } - - m->m_seq = tp->rcv_nxt; - tp->rcv_nxt = rcv_nxt; - - tp->t_rcvtime = ticks; - /* - * Store the length in m->m_len. We are changing the meaning of - * m->m_len here, we need to be very careful that nothing from now on - * interprets ->len of this packet the usual way. - */ - m->m_len = m->m_pkthdr.len = rcv_nxt - m->m_seq; - inp_wunlock(tp->t_inpcb); - CTR3(KTR_TOM, - "new_rx_data_ddp: m_len=%u rcv_next 0x%08x rcv_nxt_prev=0x%08x ", - m->m_len, rcv_nxt, m->m_seq); - /* - * Figure out where the new data was placed in the buffer and store it - * in when. Assumes the buffer offset starts at 0, consumer needs to - * account for page pod's pg_offset. - */ - end_offset = G_DDP_OFFSET(ddp_report) + ddp_len; - m->m_cur_offset = end_offset - m->m_pkthdr.len; - - rcv = so_sockbuf_rcv(so); - sockbuf_lock(rcv); - - m->m_ddp_gl = (unsigned char *)bsp->gl; - m->m_flags |= M_DDP; - bsp->cur_offset = end_offset; - toep->tp_enqueued_bytes += m->m_pkthdr.len; - - /* - * Length is only meaningful for kbuf - */ - if (!(bsp->flags & DDP_BF_NOCOPY)) - KASSERT(m->m_len <= bsp->gl->dgl_length, - ("length received exceeds ddp pages: len=%d dgl_length=%d", - m->m_len, bsp->gl->dgl_length)); - - KASSERT(m->m_len > 0, ("%s m_len=%d", __FUNCTION__, m->m_len)); - KASSERT(m->m_next == NULL, ("m_len=%p", m->m_next)); - /* - * Bit 0 of flags stores whether the DDP buffer is completed. - * Note that other parts of the code depend on this being in bit 0. - */ - if ((bsp->flags & DDP_BF_NOINVAL) && end_offset != bsp->gl->dgl_length) { - panic("spurious ddp completion"); - } else { - m->m_ddp_flags = !!(ddp_report & F_DDP_BUF_COMPLETE); - if (m->m_ddp_flags && !(bsp->flags & DDP_BF_NOFLIP)) - q->cur_buf ^= 1; /* flip buffers */ - } - - if (bsp->flags & DDP_BF_NOCOPY) { - m->m_ddp_flags |= (bsp->flags & DDP_BF_NOCOPY); - bsp->flags &= ~DDP_BF_NOCOPY; - } - - if (ddp_report & F_DDP_PSH) - m->m_ddp_flags |= DDP_BF_PSH; - if (nomoredata) - m->m_ddp_flags |= DDP_BF_NODATA; - -#ifdef notyet - skb_reset_transport_header(skb); - tcp_hdr(skb)->fin = 0; /* changes original hdr->ddp_report */ -#endif - SBAPPEND(rcv, m); - - if ((so_state_get(so) & SS_NOFDREF) == 0 && ((ddp_report & F_DDP_PSH) || - (((m->m_ddp_flags & (DDP_BF_NOCOPY|1)) == (DDP_BF_NOCOPY|1)) - || !(m->m_ddp_flags & DDP_BF_NOCOPY)))) - so_sorwakeup_locked(so); - else - sockbuf_unlock(rcv); -} - -#define DDP_ERR (F_DDP_PPOD_MISMATCH | F_DDP_LLIMIT_ERR | F_DDP_ULIMIT_ERR |\ - F_DDP_PPOD_PARITY_ERR | F_DDP_PADDING_ERR | F_DDP_OFFSET_ERR |\ - F_DDP_INVALID_TAG | F_DDP_COLOR_ERR | F_DDP_TID_MISMATCH |\ - F_DDP_INVALID_PPOD) - -/* - * Handler for RX_DATA_DDP CPL messages. - */ -static int -do_rx_data_ddp(struct t3cdev *cdev, struct mbuf *m, void *ctx) -{ - struct toepcb *toep = ctx; - const struct cpl_rx_data_ddp *hdr = cplhdr(m); - - VALIDATE_SOCK(so); - - if (__predict_false(ntohl(hdr->ddpvld_status) & DDP_ERR)) { - log(LOG_ERR, "RX_DATA_DDP for TID %u reported error 0x%x\n", - GET_TID(hdr), G_DDP_VALID(ntohl(hdr->ddpvld_status))); - return (CPL_RET_BUF_DONE); - } -#if 0 - skb->h.th = tcphdr_skb->h.th; -#endif - new_rx_data_ddp(toep, m); - return (0); -} - -static void -process_ddp_complete(struct toepcb *toep, struct mbuf *m) -{ - struct tcpcb *tp = toep->tp_tp; struct socket *so; - struct ddp_state *q; - struct ddp_buf_state *bsp; - struct cpl_rx_ddp_complete *hdr; - unsigned int ddp_report, buf_idx, when, delack_mode; - int nomoredata = 0; - struct sockbuf *rcv; - - inp_wlock(tp->t_inpcb); - so = inp_inpcbtosocket(tp->t_inpcb); + struct sockbuf *so_rcv; - if (__predict_false(so_no_receive(so))) { - struct inpcb *inp = so_sotoinpcb(so); + /* Advance over CPL */ + m_adj(m, sizeof(*hdr)); - handle_excess_rx(toep, m); - inp_wunlock(inp); - return; + /* XXX: revisit. This comes from the T4 TOM */ + if (__predict_false(inp == NULL)) { + /* + * do_pass_establish failed and must be attempting to abort the + * connection. Meanwhile, the T4 has sent us data for such a + * connection. + */ +#ifdef notyet + KASSERT(toepcb_flag(toep, TPF_ABORT_SHUTDOWN), + ("%s: inp NULL and tid isn't being aborted", __func__)); +#endif + m_freem(m); + return (0); } - q = &toep->tp_ddp_state; - hdr = cplhdr(m); - ddp_report = ntohl(hdr->ddp_report); - buf_idx = (ddp_report >> S_DDP_BUF_IDX) & 1; - m->m_pkthdr.csum_data = tp->rcv_nxt; - rcv = so_sockbuf_rcv(so); - sockbuf_lock(rcv); + INP_WLOCK(inp); + if (inp->inp_flags & (INP_DROPPED | INP_TIMEWAIT)) { + CTR4(KTR_CXGB, "%s: tid %u, rx (%d bytes), inp_flags 0x%x", + __func__, tid, m->m_pkthdr.len, inp->inp_flags); + INP_WUNLOCK(inp); + m_freem(m); + return (0); + } - bsp = &q->buf_state[buf_idx]; - when = bsp->cur_offset; - m->m_len = m->m_pkthdr.len = G_DDP_OFFSET(ddp_report) - when; - tp->rcv_nxt += m->m_len; + if (__predict_false(hdr->dack_mode != toep->tp_delack_mode)) + toep->tp_delack_mode = hdr->dack_mode; + + tp = intotcpcb(inp); + +#ifdef INVARIANTS + if (__predict_false(tp->rcv_nxt != be32toh(hdr->seq))) { + log(LOG_ERR, + "%s: unexpected seq# %x for TID %u, rcv_nxt %x\n", + __func__, be32toh(hdr->seq), toep->tp_tid, tp->rcv_nxt); + } +#endif + tp->rcv_nxt += m->m_pkthdr.len; + KASSERT(tp->rcv_wnd >= m->m_pkthdr.len, + ("%s: negative window size", __func__)); + tp->rcv_wnd -= m->m_pkthdr.len; tp->t_rcvtime = ticks; - delack_mode = G_DDP_DACK_MODE(ddp_report); - if (__predict_false(G_DDP_DACK_MODE(ddp_report) != toep->tp_delack_mode)) { - toep->tp_delack_mode = delack_mode; - toep->tp_delack_seq = tp->rcv_nxt; + so = inp->inp_socket; + so_rcv = &so->so_rcv; + SOCKBUF_LOCK(so_rcv); + + if (__predict_false(so_rcv->sb_state & SBS_CANTRCVMORE)) { + CTR3(KTR_CXGB, "%s: tid %u, excess rx (%d bytes)", + __func__, tid, m->m_pkthdr.len); + SOCKBUF_UNLOCK(so_rcv); + INP_WUNLOCK(inp); + + INP_INFO_WLOCK(&V_tcbinfo); + INP_WLOCK(inp); + tp = tcp_drop(tp, ECONNRESET); + if (tp) + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + + m_freem(m); + return (0); } -#ifdef notyet - skb_reset_transport_header(skb); - tcp_hdr(skb)->fin = 0; /* changes valid memory past CPL */ -#endif - inp_wunlock(tp->t_inpcb); - KASSERT(m->m_len >= 0, ("%s m_len=%d", __FUNCTION__, m->m_len)); - CTR5(KTR_TOM, - "process_ddp_complete: tp->rcv_nxt 0x%x cur_offset %u " - "ddp_report 0x%x offset %u, len %u", - tp->rcv_nxt, bsp->cur_offset, ddp_report, - G_DDP_OFFSET(ddp_report), m->m_len); + /* receive buffer autosize */ + if (so_rcv->sb_flags & SB_AUTOSIZE && + V_tcp_do_autorcvbuf && + so_rcv->sb_hiwat < V_tcp_autorcvbuf_max && + (m->m_pkthdr.len > (sbspace(so_rcv) / 8 * 7) || tp->rcv_wnd < 32768)) { + unsigned int hiwat = so_rcv->sb_hiwat; + unsigned int newsize = min(hiwat + V_tcp_autorcvbuf_inc, + V_tcp_autorcvbuf_max); - m->m_cur_offset = bsp->cur_offset; - bsp->cur_offset += m->m_len; - - if (!(bsp->flags & DDP_BF_NOFLIP)) { - q->cur_buf ^= 1; /* flip buffers */ - if (G_DDP_OFFSET(ddp_report) < q->kbuf[0]->dgl_length) - nomoredata=1; + if (!sbreserve_locked(so_rcv, newsize, so, NULL)) + so_rcv->sb_flags &= ~SB_AUTOSIZE; + else + toep->tp_rx_credits += newsize - hiwat; } - - CTR4(KTR_TOM, - "process_ddp_complete: tp->rcv_nxt 0x%x cur_offset %u " - "ddp_report %u offset %u", - tp->rcv_nxt, bsp->cur_offset, ddp_report, - G_DDP_OFFSET(ddp_report)); - - m->m_ddp_gl = (unsigned char *)bsp->gl; - m->m_flags |= M_DDP; - m->m_ddp_flags = (bsp->flags & DDP_BF_NOCOPY) | 1; - if (bsp->flags & DDP_BF_NOCOPY) - bsp->flags &= ~DDP_BF_NOCOPY; - if (nomoredata) - m->m_ddp_flags |= DDP_BF_NODATA; - SBAPPEND(rcv, m); - if ((so_state_get(so) & SS_NOFDREF) == 0) - so_sorwakeup_locked(so); - else - sockbuf_unlock(rcv); -} + toep->tp_enqueued += m->m_pkthdr.len; + sbappendstream_locked(so_rcv, m); + sorwakeup_locked(so); + SOCKBUF_UNLOCK_ASSERT(so_rcv); -/* - * Handler for RX_DDP_COMPLETE CPL messages. - */ -static int -do_rx_ddp_complete(struct t3cdev *cdev, struct mbuf *m, void *ctx) -{ - struct toepcb *toep = ctx; - - VALIDATE_SOCK(so); -#if 0 - skb->h.th = tcphdr_skb->h.th; -#endif - process_ddp_complete(toep, m); + INP_WUNLOCK(inp); return (0); } /* - * Move a socket to TIME_WAIT state. We need to make some adjustments to the - * socket state before calling tcp_time_wait to comply with its expectations. + * Handler for PEER_CLOSE CPL messages. */ -static void -enter_timewait(struct tcpcb *tp) +static int +do_peer_close(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { - /* - * Bump rcv_nxt for the peer FIN. We don't do this at the time we - * process peer_close because we don't want to carry the peer FIN in - * the socket's receive queue and if we increment rcv_nxt without - * having the FIN in the receive queue we'll confuse facilities such - * as SIOCINQ. - */ - inp_wlock(tp->t_inpcb); + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + const struct cpl_peer_close *hdr = mtod(m, void *); + unsigned int tid = GET_TID(hdr); + struct toepcb *toep = lookup_tid(&td->tid_maps, tid); + struct inpcb *inp = toep->tp_inp; + struct tcpcb *tp; + struct socket *so; + + INP_INFO_WLOCK(&V_tcbinfo); + INP_WLOCK(inp); + tp = intotcpcb(inp); + + CTR5(KTR_CXGB, "%s: tid %u (%s), toep_flags 0x%x, inp %p", __func__, + tid, tp ? tcpstates[tp->t_state] : "no tp" , toep->tp_flags, inp); + + if (toep->tp_flags & TP_ABORT_RPL_PENDING) + goto done; + + so = inp_inpcbtosocket(inp); + + socantrcvmore(so); tp->rcv_nxt++; - tp->ts_recent_age = 0; /* defeat recycling */ - tp->t_srtt = 0; /* defeat tcp_update_metrics */ - inp_wunlock(tp->t_inpcb); - tcp_offload_twstart(tp); -} - -/* - * For TCP DDP a PEER_CLOSE may also be an implicit RX_DDP_COMPLETE. This - * function deals with the data that may be reported along with the FIN. - * Returns -1 if no further processing of the PEER_CLOSE is needed, >= 0 to - * perform normal FIN-related processing. In the latter case 1 indicates that - * there was an implicit RX_DDP_COMPLETE and the skb should not be freed, 0 the - * skb can be freed. - */ -static int -handle_peer_close_data(struct socket *so, struct mbuf *m) -{ - struct tcpcb *tp = so_sototcpcb(so); - struct toepcb *toep = tp->t_toe; - struct ddp_state *q; - struct ddp_buf_state *bsp; - struct cpl_peer_close *req = cplhdr(m); - unsigned int rcv_nxt = ntohl(req->rcv_nxt) - 1; /* exclude FIN */ - struct sockbuf *rcv; - - if (tp->rcv_nxt == rcv_nxt) /* no data */ - return (0); - - CTR0(KTR_TOM, "handle_peer_close_data"); - if (__predict_false(so_no_receive(so))) { - handle_excess_rx(toep, m); - - /* - * Although we discard the data we want to process the FIN so - * that PEER_CLOSE + data behaves the same as RX_DATA_DDP + - * PEER_CLOSE without data. In particular this PEER_CLOSE - * may be what will close the connection. We return 1 because - * handle_excess_rx() already freed the packet. - */ - return (1); - } - - inp_lock_assert(tp->t_inpcb); - q = &toep->tp_ddp_state; - rcv = so_sockbuf_rcv(so); - sockbuf_lock(rcv); - - bsp = &q->buf_state[q->cur_buf]; - m->m_len = m->m_pkthdr.len = rcv_nxt - tp->rcv_nxt; - KASSERT(m->m_len > 0, ("%s m_len=%d", __FUNCTION__, m->m_len)); - m->m_ddp_gl = (unsigned char *)bsp->gl; - m->m_flags |= M_DDP; - m->m_cur_offset = bsp->cur_offset; - m->m_ddp_flags = - DDP_BF_PSH | (bsp->flags & DDP_BF_NOCOPY) | 1; - m->m_seq = tp->rcv_nxt; - tp->rcv_nxt = rcv_nxt; - bsp->cur_offset += m->m_pkthdr.len; - if (!(bsp->flags & DDP_BF_NOFLIP)) - q->cur_buf ^= 1; -#ifdef notyet - skb_reset_transport_header(skb); - tcp_hdr(skb)->fin = 0; /* changes valid memory past CPL */ -#endif - tp->t_rcvtime = ticks; - SBAPPEND(rcv, m); - if (__predict_true((so_state_get(so) & SS_NOFDREF) == 0)) - so_sorwakeup_locked(so); - else - sockbuf_unlock(rcv); - - return (1); -} - -/* - * Handle a peer FIN. - */ -static void -do_peer_fin(struct toepcb *toep, struct mbuf *m) -{ - struct socket *so; - struct tcpcb *tp = toep->tp_tp; - int keep, action; - - action = keep = 0; - CTR1(KTR_TOM, "do_peer_fin state=%d", tp->t_state); - if (!is_t3a(toep->tp_toedev) && (toep->tp_flags & TP_ABORT_RPL_PENDING)) { - printf("abort_pending set\n"); - - goto out; - } - inp_wlock(tp->t_inpcb); - so = inp_inpcbtosocket(toep->tp_tp->t_inpcb); - if (toep->tp_ulp_mode == ULP_MODE_TCPDDP) { - keep = handle_peer_close_data(so, m); - if (keep < 0) { - inp_wunlock(tp->t_inpcb); - return; - } - } - if (TCPS_HAVERCVDFIN(tp->t_state) == 0) { - CTR1(KTR_TOM, - "waking up waiters for cantrcvmore on %p ", so); - socantrcvmore(so); - - /* - * If connection is half-synchronized - * (ie NEEDSYN flag on) then delay ACK, - * so it may be piggybacked when SYN is sent. - * Otherwise, since we received a FIN then no - * more input can be expected, send ACK now. - */ - if (tp->t_flags & TF_NEEDSYN) - tp->t_flags |= TF_DELACK; - else - tp->t_flags |= TF_ACKNOW; - tp->rcv_nxt++; - } - switch (tp->t_state) { case TCPS_SYN_RECEIVED: - tp->t_starttime = ticks; - /* FALLTHROUGH */ + tp->t_starttime = ticks; + /* FALLTHROUGH */ case TCPS_ESTABLISHED: tp->t_state = TCPS_CLOSE_WAIT; break; @@ -2561,228 +1251,134 @@ do_peer_fin(struct toepcb *toep, struct mbuf *m) tp->t_state = TCPS_CLOSING; break; case TCPS_FIN_WAIT_2: - /* - * If we've sent an abort_req we must have sent it too late, - * HW will send us a reply telling us so, and this peer_close - * is really the last message for this connection and needs to - * be treated as an abort_rpl, i.e., transition the connection - * to TCP_CLOSE (note that the host stack does this at the - * time of generating the RST but we must wait for HW). - * Otherwise we enter TIME_WAIT. - */ - t3_release_offload_resources(toep); - if (toep->tp_flags & TP_ABORT_RPL_PENDING) { - action = TCP_CLOSE; - } else { - action = TCP_TIMEWAIT; - } - break; + tcp_twstart(tp); + INP_UNLOCK_ASSERT(inp); /* safe, we have a ref on the inp */ + INP_INFO_WUNLOCK(&V_tcbinfo); + + INP_WLOCK(inp); + toepcb_release(toep); /* no more CPLs expected */ + + m_freem(m); + return (0); default: - log(LOG_ERR, - "%s: TID %u received PEER_CLOSE in bad state %d\n", - toep->tp_toedev->tod_name, toep->tp_tid, tp->t_state); - } - inp_wunlock(tp->t_inpcb); - - if (action == TCP_TIMEWAIT) { - enter_timewait(tp); - } else if (action == TCP_DROP) { - tcp_offload_drop(tp, 0); - } else if (action == TCP_CLOSE) { - tcp_offload_close(tp); + log(LOG_ERR, "%s: TID %u received PEER_CLOSE in bad state %d\n", + __func__, toep->tp_tid, tp->t_state); } -#ifdef notyet - /* Do not send POLL_HUP for half duplex close. */ - if ((sk->sk_shutdown & SEND_SHUTDOWN) || - sk->sk_state == TCP_CLOSE) - sk_wake_async(so, 1, POLL_HUP); - else - sk_wake_async(so, 1, POLL_IN); -#endif +done: + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); -out: - if (!keep) - m_free(m); -} - -/* - * Handler for PEER_CLOSE CPL messages. - */ -static int -do_peer_close(struct t3cdev *cdev, struct mbuf *m, void *ctx) -{ - struct toepcb *toep = (struct toepcb *)ctx; - - VALIDATE_SOCK(so); - - do_peer_fin(toep, m); + m_freem(m); return (0); } -static void -process_close_con_rpl(struct toepcb *toep, struct mbuf *m) +/* + * Handler for CLOSE_CON_RPL CPL messages. peer ACK to our FIN received. + */ +static int +do_close_con_rpl(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { - struct cpl_close_con_rpl *rpl = cplhdr(m); - struct tcpcb *tp = toep->tp_tp; - struct socket *so; - int action = 0; - struct sockbuf *rcv; - - inp_wlock(tp->t_inpcb); - so = inp_inpcbtosocket(tp->t_inpcb); - + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + const struct cpl_close_con_rpl *rpl = mtod(m, void *); + unsigned int tid = GET_TID(rpl); + struct toepcb *toep = lookup_tid(&td->tid_maps, tid); + struct inpcb *inp = toep->tp_inp; + struct tcpcb *tp; + struct socket *so; + + INP_INFO_WLOCK(&V_tcbinfo); + INP_WLOCK(inp); + tp = intotcpcb(inp); + + CTR4(KTR_CXGB, "%s: tid %u (%s), toep_flags 0x%x", __func__, tid, + tp ? tcpstates[tp->t_state] : "no tp", toep->tp_flags); + + if ((toep->tp_flags & TP_ABORT_RPL_PENDING)) + goto done; + + so = inp_inpcbtosocket(inp); tp->snd_una = ntohl(rpl->snd_nxt) - 1; /* exclude FIN */ - if (!is_t3a(toep->tp_toedev) && (toep->tp_flags & TP_ABORT_RPL_PENDING)) { - inp_wunlock(tp->t_inpcb); - goto out; - } - - CTR3(KTR_TOM, "process_close_con_rpl(%p) state=%d dead=%d", toep, - tp->t_state, !!(so_state_get(so) & SS_NOFDREF)); - switch (tp->t_state) { - case TCPS_CLOSING: /* see FIN_WAIT2 case in do_peer_fin */ - t3_release_offload_resources(toep); - if (toep->tp_flags & TP_ABORT_RPL_PENDING) { - action = TCP_CLOSE; + case TCPS_CLOSING: + tcp_twstart(tp); +release: + INP_UNLOCK_ASSERT(inp); /* safe, we have a ref on the inp */ + INP_INFO_WUNLOCK(&V_tcbinfo); - } else { - action = TCP_TIMEWAIT; - } - break; + INP_WLOCK(inp); + toepcb_release(toep); /* no more CPLs expected */ + + m_freem(m); + return (0); case TCPS_LAST_ACK: - /* - * In this state we don't care about pending abort_rpl. - * If we've sent abort_req it was post-close and was sent too - * late, this close_con_rpl is the actual last message. - */ - t3_release_offload_resources(toep); - action = TCP_CLOSE; - break; + if (tcp_close(tp)) + INP_WUNLOCK(inp); + goto release; + case TCPS_FIN_WAIT_1: - /* - * If we can't receive any more - * data, then closing user can proceed. - * Starting the timer is contrary to the - * specification, but if we don't get a FIN - * we'll hang forever. - * - * XXXjl: - * we should release the tp also, and use a - * compressed state. - */ - if (so) - rcv = so_sockbuf_rcv(so); - else - break; - - if (rcv->sb_state & SBS_CANTRCVMORE) { - int timeout; - - if (so) - soisdisconnected(so); - timeout = (tcp_fast_finwait2_recycle) ? - tcp_finwait2_timeout : tcp_maxidle; - tcp_timer_activate(tp, TT_2MSL, timeout); - } + if (so->so_rcv.sb_state & SBS_CANTRCVMORE) + soisdisconnected(so); tp->t_state = TCPS_FIN_WAIT_2; - if ((so_options_get(so) & SO_LINGER) && so_linger_get(so) == 0 && - (toep->tp_flags & TP_ABORT_SHUTDOWN) == 0) { - action = TCP_DROP; - } - break; default: log(LOG_ERR, - "%s: TID %u received CLOSE_CON_RPL in bad state %d\n", - toep->tp_toedev->tod_name, toep->tp_tid, - tp->t_state); + "%s: TID %u received CLOSE_CON_RPL in bad state %d\n", + __func__, toep->tp_tid, tp->t_state); } - inp_wunlock(tp->t_inpcb); +done: + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); - if (action == TCP_TIMEWAIT) { - enter_timewait(tp); - } else if (action == TCP_DROP) { - tcp_offload_drop(tp, 0); - } else if (action == TCP_CLOSE) { - tcp_offload_close(tp); - } -out: m_freem(m); -} - -/* - * Handler for CLOSE_CON_RPL CPL messages. - */ -static int -do_close_con_rpl(struct t3cdev *cdev, struct mbuf *m, - void *ctx) -{ - struct toepcb *toep = (struct toepcb *)ctx; - - process_close_con_rpl(toep, m); return (0); } -/* - * Process abort replies. We only process these messages if we anticipate - * them as the coordination between SW and HW in this area is somewhat lacking - * and sometimes we get ABORT_RPLs after we are done with the connection that - * originated the ABORT_REQ. - */ -static void -process_abort_rpl(struct toepcb *toep, struct mbuf *m) +static int +do_smt_write_rpl(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { - struct tcpcb *tp = toep->tp_tp; - struct socket *so; - int needclose = 0; - -#ifdef T3_TRACE - T3_TRACE1(TIDTB(sk), - "process_abort_rpl: GTS rpl pending %d", - sock_flag(sk, ABORT_RPL_PENDING)); -#endif - - inp_wlock(tp->t_inpcb); - so = inp_inpcbtosocket(tp->t_inpcb); - - if (toep->tp_flags & TP_ABORT_RPL_PENDING) { - /* - * XXX panic on tcpdrop - */ - if (!(toep->tp_flags & TP_ABORT_RPL_RCVD) && !is_t3a(toep->tp_toedev)) - toep->tp_flags |= TP_ABORT_RPL_RCVD; - else { - toep->tp_flags &= ~(TP_ABORT_RPL_RCVD|TP_ABORT_RPL_PENDING); - if (!(toep->tp_flags & TP_ABORT_REQ_RCVD) || - !is_t3a(toep->tp_toedev)) { - if (toep->tp_flags & TP_ABORT_REQ_RCVD) - panic("TP_ABORT_REQ_RCVD set"); - t3_release_offload_resources(toep); - needclose = 1; - } - } + struct cpl_smt_write_rpl *rpl = mtod(m, void *); + + if (rpl->status != CPL_ERR_NONE) { + log(LOG_ERR, + "Unexpected SMT_WRITE_RPL status %u for entry %u\n", + rpl->status, GET_TID(rpl)); } - inp_wunlock(tp->t_inpcb); - if (needclose) - tcp_offload_close(tp); + m_freem(m); + return (0); +} - m_free(m); +static int +do_set_tcb_rpl(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) +{ + struct cpl_set_tcb_rpl *rpl = mtod(m, void *); + + if (rpl->status != CPL_ERR_NONE) { + log(LOG_ERR, "Unexpected SET_TCB_RPL status %u for tid %u\n", + rpl->status, GET_TID(rpl)); + } + + m_freem(m); + return (0); } /* * Handle an ABORT_RPL_RSS CPL message. */ static int -do_abort_rpl(struct t3cdev *cdev, struct mbuf *m, void *ctx) +do_abort_rpl(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { - struct cpl_abort_rpl_rss *rpl = cplhdr(m); - struct toepcb *toep; - + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + const struct cpl_abort_rpl_rss *rpl = mtod(m, void *); + unsigned int tid = GET_TID(rpl); + struct toepcb *toep = lookup_tid(&td->tid_maps, tid); + struct inpcb *inp; + /* * Ignore replies to post-close aborts indicating that the abort was * requested too late. These connections are terminated when we get @@ -2790,99 +1386,54 @@ do_abort_rpl(struct t3cdev *cdev, struct mbuf *m, void *ctx) * arrives the TID is either no longer used or it has been recycled. */ if (rpl->status == CPL_ERR_ABORT_FAILED) { -discard: - m_free(m); + m_freem(m); return (0); } - toep = (struct toepcb *)ctx; - - /* - * Sometimes we've already closed the socket, e.g., a post-close - * abort races with ABORT_REQ_RSS, the latter frees the socket - * expecting the ABORT_REQ will fail with CPL_ERR_ABORT_FAILED, - * but FW turns the ABORT_REQ into a regular one and so we get - * ABORT_RPL_RSS with status 0 and no socket. Only on T3A. - */ - if (!toep) - goto discard; + if (toep->tp_flags & TP_IS_A_SYNQ_ENTRY) + return (do_abort_rpl_synqe(qs, r, m)); - if (toep->tp_tp == NULL) { - log(LOG_NOTICE, "removing tid for abort\n"); - cxgb_remove_tid(cdev, toep, toep->tp_tid); - if (toep->tp_l2t) - l2t_release(L2DATA(cdev), toep->tp_l2t); + CTR4(KTR_CXGB, "%s: tid %d, toep %p, status %d", __func__, tid, toep, + rpl->status); - toepcb_release(toep); - goto discard; + inp = toep->tp_inp; + INP_WLOCK(inp); + + if (toep->tp_flags & TP_ABORT_RPL_PENDING) { + if (!(toep->tp_flags & TP_ABORT_RPL_RCVD)) { + toep->tp_flags |= TP_ABORT_RPL_RCVD; + INP_WUNLOCK(inp); + } else { + toep->tp_flags &= ~TP_ABORT_RPL_RCVD; + toep->tp_flags &= TP_ABORT_RPL_PENDING; + toepcb_release(toep); /* no more CPLs expected */ + } } - - log(LOG_NOTICE, "toep=%p\n", toep); - log(LOG_NOTICE, "tp=%p\n", toep->tp_tp); - toepcb_hold(toep); - process_abort_rpl(toep, m); - toepcb_release(toep); + m_freem(m); return (0); } /* - * Convert the status code of an ABORT_REQ into a FreeBSD error code. Also - * indicate whether RST should be sent in response. + * Convert the status code of an ABORT_REQ into a FreeBSD error code. */ static int -abort_status_to_errno(struct socket *so, int abort_reason, int *need_rst) +abort_status_to_errno(struct tcpcb *tp, int abort_reason) { - struct tcpcb *tp = so_sototcpcb(so); - switch (abort_reason) { case CPL_ERR_BAD_SYN: -#if 0 - NET_INC_STATS_BH(LINUX_MIB_TCPABORTONSYN); // fall through -#endif case CPL_ERR_CONN_RESET: - // XXX need to handle SYN_RECV due to crossed SYNs return (tp->t_state == TCPS_CLOSE_WAIT ? EPIPE : ECONNRESET); case CPL_ERR_XMIT_TIMEDOUT: case CPL_ERR_PERSIST_TIMEDOUT: case CPL_ERR_FINWAIT2_TIMEDOUT: case CPL_ERR_KEEPALIVE_TIMEDOUT: -#if 0 - NET_INC_STATS_BH(LINUX_MIB_TCPABORTONTIMEOUT); -#endif return (ETIMEDOUT); default: return (EIO); } } -static inline void -set_abort_rpl_wr(struct mbuf *m, unsigned int tid, int cmd) -{ - struct cpl_abort_rpl *rpl = cplhdr(m); - - rpl->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_HOST_ABORT_CON_RPL)); - rpl->wr.wr_lo = htonl(V_WR_TID(tid)); - m->m_len = m->m_pkthdr.len = sizeof(*rpl); - - OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_ABORT_RPL, tid)); - rpl->cmd = cmd; -} - -static void -send_deferred_abort_rpl(struct toedev *tdev, struct mbuf *m) -{ - struct mbuf *reply_mbuf; - struct cpl_abort_req_rss *req = cplhdr(m); - - reply_mbuf = m_gethdr_nofail(sizeof(struct cpl_abort_rpl)); - m_set_priority(m, CPL_PRIORITY_DATA); - m->m_len = m->m_pkthdr.len = sizeof(struct cpl_abort_rpl); - set_abort_rpl_wr(reply_mbuf, GET_TID(req), req->status); - cxgb_ofld_send(TOM_DATA(tdev)->cdev, reply_mbuf); - m_free(m); -} - /* * Returns whether an ABORT_REQ_RSS message is a negative advice. */ @@ -2893,850 +1444,177 @@ is_neg_adv_abort(unsigned int status) status == CPL_ERR_PERSIST_NEG_ADVICE; } -static void -send_abort_rpl(struct mbuf *m, struct toedev *tdev, int rst_status) +void +send_abort_rpl(struct toedev *tod, int tid, int qset) { - struct mbuf *reply_mbuf; - struct cpl_abort_req_rss *req = cplhdr(m); + struct mbuf *reply; + struct cpl_abort_rpl *rpl; + struct adapter *sc = tod->tod_softc; - reply_mbuf = m_gethdr(M_NOWAIT, MT_DATA); + reply = M_GETHDR_OFLD(qset, CPL_PRIORITY_DATA, rpl); + if (!reply) + CXGB_UNIMPLEMENTED(); - if (!reply_mbuf) { - /* Defer the reply. Stick rst_status into req->cmd. */ - req->status = rst_status; - t3_defer_reply(m, tdev, send_deferred_abort_rpl); - return; - } + rpl->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_HOST_ABORT_CON_RPL)); + rpl->wr.wrh_lo = htonl(V_WR_TID(tid)); + OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_ABORT_RPL, tid)); + rpl->cmd = CPL_ABORT_NO_RST; - m_set_priority(reply_mbuf, CPL_PRIORITY_DATA); - set_abort_rpl_wr(reply_mbuf, GET_TID(req), rst_status); - m_free(m); - - /* - * XXX need to sync with ARP as for SYN_RECV connections we can send - * these messages while ARP is pending. For other connection states - * it's not a problem. - */ - cxgb_ofld_send(TOM_DATA(tdev)->cdev, reply_mbuf); + t3_offload_tx(sc, reply); } -#ifdef notyet -static void -cleanup_syn_rcv_conn(struct socket *child, struct socket *parent) -{ - CXGB_UNIMPLEMENTED(); -#ifdef notyet - struct request_sock *req = child->sk_user_data; - - inet_csk_reqsk_queue_removed(parent, req); - synq_remove(tcp_sk(child)); - __reqsk_free(req); - child->sk_user_data = NULL; -#endif -} - - /* - * Performs the actual work to abort a SYN_RECV connection. - */ -static void -do_abort_syn_rcv(struct socket *child, struct socket *parent) -{ - struct tcpcb *parenttp = so_sototcpcb(parent); - struct tcpcb *childtp = so_sototcpcb(child); - - /* - * If the server is still open we clean up the child connection, - * otherwise the server already did the clean up as it was purging - * its SYN queue and the skb was just sitting in its backlog. - */ - if (__predict_false(parenttp->t_state == TCPS_LISTEN)) { - cleanup_syn_rcv_conn(child, parent); - inp_wlock(childtp->t_inpcb); - t3_release_offload_resources(childtp->t_toe); - inp_wunlock(childtp->t_inpcb); - tcp_offload_close(childtp); - } -} -#endif - -/* - * Handle abort requests for a SYN_RECV connection. These need extra work - * because the socket is on its parent's SYN queue. + * Handle an ABORT_REQ_RSS CPL message. If we're waiting for an ABORT_RPL we + * ignore this request except that we need to reply to it. */ static int -abort_syn_rcv(struct socket *so, struct mbuf *m) +do_abort_req(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { - CXGB_UNIMPLEMENTED(); -#ifdef notyet - struct socket *parent; - struct toedev *tdev = toep->tp_toedev; - struct t3cdev *cdev = TOM_DATA(tdev)->cdev; - struct socket *oreq = so->so_incomp; - struct t3c_tid_entry *t3c_stid; - struct tid_info *t; - - if (!oreq) - return -1; /* somehow we are not on the SYN queue */ - - t = &(T3C_DATA(cdev))->tid_maps; - t3c_stid = lookup_stid(t, oreq->ts_recent); - parent = ((struct listen_ctx *)t3c_stid->ctx)->lso; - - so_lock(parent); - do_abort_syn_rcv(so, parent); - send_abort_rpl(m, tdev, CPL_ABORT_NO_RST); - so_unlock(parent); -#endif - return (0); -} - -/* - * Process abort requests. If we are waiting for an ABORT_RPL we ignore this - * request except that we need to reply to it. - */ -static void -process_abort_req(struct toepcb *toep, struct mbuf *m, struct toedev *tdev) -{ - int rst_status = CPL_ABORT_NO_RST; - const struct cpl_abort_req_rss *req = cplhdr(m); - struct tcpcb *tp = toep->tp_tp; + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct toedev *tod = &td->tod; + const struct cpl_abort_req_rss *req = mtod(m, void *); + unsigned int tid = GET_TID(req); + struct toepcb *toep = lookup_tid(&td->tid_maps, tid); + struct inpcb *inp; + struct tcpcb *tp; struct socket *so; - int needclose = 0; - - inp_wlock(tp->t_inpcb); - so = inp_inpcbtosocket(toep->tp_tp->t_inpcb); - if ((toep->tp_flags & TP_ABORT_REQ_RCVD) == 0) { - toep->tp_flags |= (TP_ABORT_REQ_RCVD|TP_ABORT_SHUTDOWN); - m_free(m); - goto skip; - } + int qset = toep->tp_qset; - toep->tp_flags &= ~TP_ABORT_REQ_RCVD; - /* - * Three cases to consider: - * a) We haven't sent an abort_req; close the connection. - * b) We have sent a post-close abort_req that will get to TP too late - * and will generate a CPL_ERR_ABORT_FAILED reply. The reply will - * be ignored and the connection should be closed now. - * c) We have sent a regular abort_req that will get to TP too late. - * That will generate an abort_rpl with status 0, wait for it. - */ - if (((toep->tp_flags & TP_ABORT_RPL_PENDING) == 0) || - (is_t3a(toep->tp_toedev) && (toep->tp_flags & TP_CLOSE_CON_REQUESTED))) { - int error; - - error = abort_status_to_errno(so, req->status, - &rst_status); - so_error_set(so, error); - - if (__predict_true((so_state_get(so) & SS_NOFDREF) == 0)) - so_sorwakeup(so); - /* - * SYN_RECV needs special processing. If abort_syn_rcv() - * returns 0 is has taken care of the abort. - */ - if ((tp->t_state == TCPS_SYN_RECEIVED) && !abort_syn_rcv(so, m)) - goto skip; - - t3_release_offload_resources(toep); - needclose = 1; - } - inp_wunlock(tp->t_inpcb); - - if (needclose) - tcp_offload_close(tp); - - send_abort_rpl(m, tdev, rst_status); - return; -skip: - inp_wunlock(tp->t_inpcb); -} - -/* - * Handle an ABORT_REQ_RSS CPL message. - */ -static int -do_abort_req(struct t3cdev *cdev, struct mbuf *m, void *ctx) -{ - const struct cpl_abort_req_rss *req = cplhdr(m); - struct toepcb *toep = (struct toepcb *)ctx; - if (is_neg_adv_abort(req->status)) { - m_free(m); + CTR4(KTR_CXGB, "%s: negative advice %d for tid %u (%x)", + __func__, req->status, tid, toep->tp_flags); + m_freem(m); return (0); } - log(LOG_NOTICE, "aborting tid=%d\n", toep->tp_tid); - - if ((toep->tp_flags & (TP_SYN_RCVD|TP_ABORT_REQ_RCVD)) == TP_SYN_RCVD) { - cxgb_remove_tid(cdev, toep, toep->tp_tid); + if (toep->tp_flags & TP_IS_A_SYNQ_ENTRY) + return (do_abort_req_synqe(qs, r, m)); + + inp = toep->tp_inp; + INP_INFO_WLOCK(&V_tcbinfo); /* for tcp_close */ + INP_WLOCK(inp); + + tp = intotcpcb(inp); + so = inp->inp_socket; + + CTR6(KTR_CXGB, "%s: tid %u (%s), toep %p (%x), status %d", + __func__, tid, tcpstates[tp->t_state], toep, toep->tp_flags, + req->status); + + if (!(toep->tp_flags & TP_ABORT_REQ_RCVD)) { toep->tp_flags |= TP_ABORT_REQ_RCVD; - - send_abort_rpl(m, toep->tp_toedev, CPL_ABORT_NO_RST); - if (toep->tp_l2t) - l2t_release(L2DATA(cdev), toep->tp_l2t); - - /* - * Unhook - */ - toep->tp_tp->t_toe = NULL; - toep->tp_tp->t_flags &= ~TF_TOE; - toep->tp_tp = NULL; - /* - * XXX need to call syncache_chkrst - but we don't - * have a way of doing that yet - */ - toepcb_release(toep); - log(LOG_ERR, "abort for unestablished connection :-(\n"); - return (0); - } - if (toep->tp_tp == NULL) { - log(LOG_NOTICE, "disconnected toepcb\n"); - /* should be freed momentarily */ + toep->tp_flags |= TP_ABORT_SHUTDOWN; + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + m_freem(m); return (0); } + toep->tp_flags &= ~TP_ABORT_REQ_RCVD; - - toepcb_hold(toep); - process_abort_req(toep, m, toep->tp_toedev); - toepcb_release(toep); - return (0); -} -#ifdef notyet -static void -pass_open_abort(struct socket *child, struct socket *parent, struct mbuf *m) -{ - struct toedev *tdev = TOE_DEV(parent); - - do_abort_syn_rcv(child, parent); - if (tdev->tod_ttid == TOE_ID_CHELSIO_T3) { - struct cpl_pass_accept_rpl *rpl = cplhdr(m); - - rpl->opt0h = htonl(F_TCAM_BYPASS); - rpl->opt0l_status = htonl(CPL_PASS_OPEN_REJECT); - cxgb_ofld_send(TOM_DATA(tdev)->cdev, m); - } else - m_free(m); -} -#endif -static void -handle_pass_open_arp_failure(struct socket *so, struct mbuf *m) -{ - CXGB_UNIMPLEMENTED(); - -#ifdef notyet - struct t3cdev *cdev; - struct socket *parent; - struct socket *oreq; - struct t3c_tid_entry *t3c_stid; - struct tid_info *t; - struct tcpcb *otp, *tp = so_sototcpcb(so); - struct toepcb *toep = tp->t_toe; - /* - * If the connection is being aborted due to the parent listening - * socket going away there's nothing to do, the ABORT_REQ will close - * the connection. + * If we'd sent a reset on this toep, we'll ignore this and clean up in + * the T3's reply to our reset instead. */ if (toep->tp_flags & TP_ABORT_RPL_PENDING) { - m_free(m); - return; + toep->tp_flags |= TP_ABORT_RPL_SENT; + INP_WUNLOCK(inp); + } else { + so_error_set(so, abort_status_to_errno(tp, req->status)); + tp = tcp_close(tp); + if (tp == NULL) + INP_WLOCK(inp); /* re-acquire */ + toepcb_release(toep); /* no more CPLs expected */ } + INP_INFO_WUNLOCK(&V_tcbinfo); - oreq = so->so_incomp; - otp = so_sototcpcb(oreq); - - cdev = T3C_DEV(so); - t = &(T3C_DATA(cdev))->tid_maps; - t3c_stid = lookup_stid(t, otp->ts_recent); - parent = ((struct listen_ctx *)t3c_stid->ctx)->lso; - - so_lock(parent); - pass_open_abort(so, parent, m); - so_unlock(parent); -#endif -} - -/* - * Handle an ARP failure for a CPL_PASS_ACCEPT_RPL. This is treated similarly - * to an ABORT_REQ_RSS in SYN_RECV as both events need to tear down a SYN_RECV - * connection. - */ -static void -pass_accept_rpl_arp_failure(struct t3cdev *cdev, struct mbuf *m) -{ - -#ifdef notyet - TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); - BLOG_SKB_CB(skb)->dev = TOE_DEV(skb->sk); -#endif - handle_pass_open_arp_failure(m_get_socket(m), m); -} - -/* - * Populate a reject CPL_PASS_ACCEPT_RPL WR. - */ -static void -mk_pass_accept_rpl(struct mbuf *reply_mbuf, struct mbuf *req_mbuf) -{ - struct cpl_pass_accept_req *req = cplhdr(req_mbuf); - struct cpl_pass_accept_rpl *rpl = cplhdr(reply_mbuf); - unsigned int tid = GET_TID(req); - - m_set_priority(reply_mbuf, CPL_PRIORITY_SETUP); - rpl->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_PASS_ACCEPT_RPL, tid)); - rpl->peer_ip = req->peer_ip; // req->peer_ip not overwritten yet - rpl->opt0h = htonl(F_TCAM_BYPASS); - rpl->opt0l_status = htonl(CPL_PASS_OPEN_REJECT); - rpl->opt2 = 0; - rpl->rsvd = rpl->opt2; /* workaround for HW bug */ -} - -/* - * Send a deferred reject to an accept request. - */ -static void -reject_pass_request(struct toedev *tdev, struct mbuf *m) -{ - struct mbuf *reply_mbuf; - - reply_mbuf = m_gethdr_nofail(sizeof(struct cpl_pass_accept_rpl)); - mk_pass_accept_rpl(reply_mbuf, m); - cxgb_ofld_send(TOM_DATA(tdev)->cdev, reply_mbuf); - m_free(m); -} - -static void -handle_syncache_event(int event, void *arg) -{ - struct toepcb *toep = arg; - - switch (event) { - case TOE_SC_ENTRY_PRESENT: - /* - * entry already exists - free toepcb - * and l2t - */ - printf("syncache entry present\n"); - toepcb_release(toep); - break; - case TOE_SC_DROP: - /* - * The syncache has given up on this entry - * either it timed out, or it was evicted - * we need to explicitly release the tid - */ - printf("syncache entry dropped\n"); - toepcb_release(toep); - break; - default: - log(LOG_ERR, "unknown syncache event %d\n", event); - break; - } -} - -static void -syncache_add_accept_req(struct cpl_pass_accept_req *req, struct socket *lso, struct toepcb *toep) -{ - struct in_conninfo inc; - struct toeopt toeo; - struct tcphdr th; - struct inpcb *inp; - int mss, wsf, sack, ts; - uint32_t rcv_isn = ntohl(req->rcv_isn); - - bzero(&toeo, sizeof(struct toeopt)); - inp = so_sotoinpcb(lso); - - /* - * Fill out information for entering us into the syncache - */ - bzero(&inc, sizeof(inc)); - inc.inc_fport = th.th_sport = req->peer_port; - inc.inc_lport = th.th_dport = req->local_port; - th.th_seq = req->rcv_isn; - th.th_flags = TH_SYN; - - toep->tp_iss = toep->tp_delack_seq = toep->tp_rcv_wup = toep->tp_copied_seq = rcv_isn + 1; - - inc.inc_len = 0; - inc.inc_faddr.s_addr = req->peer_ip; - inc.inc_laddr.s_addr = req->local_ip; - - DPRINTF("syncache add of %d:%d %d:%d\n", - ntohl(req->local_ip), ntohs(req->local_port), - ntohl(req->peer_ip), ntohs(req->peer_port)); - - mss = req->tcp_options.mss; - wsf = req->tcp_options.wsf; - ts = req->tcp_options.tstamp; - sack = req->tcp_options.sack; - toeo.to_mss = mss; - toeo.to_wscale = wsf; - toeo.to_flags = (mss ? TOF_MSS : 0) | (wsf ? TOF_SCALE : 0) | (ts ? TOF_TS : 0) | (sack ? TOF_SACKPERM : 0); - tcp_offload_syncache_add(&inc, &toeo, &th, inp, &lso, &cxgb_toe_usrreqs, -toep); -} - - -/* - * Process a CPL_PASS_ACCEPT_REQ message. Does the part that needs the socket - * lock held. Note that the sock here is a listening socket that is not owned - * by the TOE. - */ -static void -process_pass_accept_req(struct socket *so, struct mbuf *m, struct toedev *tdev, - struct listen_ctx *lctx) -{ - int rt_flags; - struct l2t_entry *e; - struct iff_mac tim; - struct mbuf *reply_mbuf, *ddp_mbuf = NULL; - struct cpl_pass_accept_rpl *rpl; - struct cpl_pass_accept_req *req = cplhdr(m); - unsigned int tid = GET_TID(req); - struct tom_data *d = TOM_DATA(tdev); - struct t3cdev *cdev = d->cdev; - struct tcpcb *tp = so_sototcpcb(so); - struct toepcb *newtoep; - struct rtentry *dst; - struct sockaddr_in nam; - struct t3c_data *td = T3C_DATA(cdev); - - reply_mbuf = m_gethdr(M_NOWAIT, MT_DATA); - if (__predict_false(reply_mbuf == NULL)) { - if (tdev->tod_ttid == TOE_ID_CHELSIO_T3) - t3_defer_reply(m, tdev, reject_pass_request); - else { - cxgb_queue_tid_release(cdev, tid); - m_free(m); - } - DPRINTF("failed to get reply_mbuf\n"); - - goto out; - } - - if (tp->t_state != TCPS_LISTEN) { - DPRINTF("socket not in listen state\n"); - - goto reject; - } - - tim.mac_addr = req->dst_mac; - tim.vlan_tag = ntohs(req->vlan_tag); - if (cdev->ctl(cdev, GET_IFF_FROM_MAC, &tim) < 0 || !tim.dev) { - DPRINTF("rejecting from failed GET_IFF_FROM_MAC\n"); - goto reject; - } - -#ifdef notyet - /* - * XXX do route lookup to confirm that we're still listening on this - * address - */ - if (ip_route_input(skb, req->local_ip, req->peer_ip, - G_PASS_OPEN_TOS(ntohl(req->tos_tid)), tim.dev)) - goto reject; - rt_flags = ((struct rtable *)skb->dst)->rt_flags & - (RTCF_BROADCAST | RTCF_MULTICAST | RTCF_LOCAL); - dst_release(skb->dst); // done with the input route, release it - skb->dst = NULL; - - if ((rt_flags & RTF_LOCAL) == 0) - goto reject; -#endif - /* - * XXX - */ - rt_flags = RTF_LOCAL; - if ((rt_flags & RTF_LOCAL) == 0) - goto reject; - - /* - * Calculate values and add to syncache - */ - - newtoep = toepcb_alloc(); - if (newtoep == NULL) - goto reject; - - bzero(&nam, sizeof(struct sockaddr_in)); - - nam.sin_len = sizeof(struct sockaddr_in); - nam.sin_family = AF_INET; - nam.sin_addr.s_addr =req->peer_ip; - dst = rtalloc2((struct sockaddr *)&nam, 1, 0); - - if (dst == NULL) { - printf("failed to find route\n"); - goto reject; - } - e = newtoep->tp_l2t = t3_l2t_get(d->cdev, dst, tim.dev, - (struct sockaddr *)&nam); - if (e == NULL) { - DPRINTF("failed to get l2t\n"); - } - /* - * Point to our listen socket until accept - */ - newtoep->tp_tp = tp; - newtoep->tp_flags = TP_SYN_RCVD; - newtoep->tp_tid = tid; - newtoep->tp_toedev = tdev; - tp->rcv_wnd = select_rcv_wnd(tdev, so); - - cxgb_insert_tid(cdev, d->client, newtoep, tid); - so_lock(so); - LIST_INSERT_HEAD(&lctx->synq_head, newtoep, synq_entry); - so_unlock(so); - - newtoep->tp_ulp_mode = TOM_TUNABLE(tdev, ddp) && !(so_options_get(so) & SO_NO_DDP) && - tp->rcv_wnd >= MIN_DDP_RCV_WIN ? ULP_MODE_TCPDDP : 0; - - if (newtoep->tp_ulp_mode) { - ddp_mbuf = m_gethdr(M_NOWAIT, MT_DATA); - - if (ddp_mbuf == NULL) - newtoep->tp_ulp_mode = 0; - } - - CTR4(KTR_TOM, "ddp=%d rcv_wnd=%ld min_win=%d ulp_mode=%d", - TOM_TUNABLE(tdev, ddp), tp->rcv_wnd, MIN_DDP_RCV_WIN, newtoep->tp_ulp_mode); - set_arp_failure_handler(reply_mbuf, pass_accept_rpl_arp_failure); - /* - * XXX workaround for lack of syncache drop - */ - toepcb_hold(newtoep); - syncache_add_accept_req(req, so, newtoep); - - rpl = cplhdr(reply_mbuf); - reply_mbuf->m_pkthdr.len = reply_mbuf->m_len = sizeof(*rpl); - rpl->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - rpl->wr.wr_lo = 0; - OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_PASS_ACCEPT_RPL, tid)); - rpl->opt2 = htonl(calc_opt2(so, tdev)); - rpl->rsvd = rpl->opt2; /* workaround for HW bug */ - rpl->peer_ip = req->peer_ip; // req->peer_ip is not overwritten - - rpl->opt0h = htonl(calc_opt0h(so, select_mss(td, NULL, dst->rt_ifp->if_mtu)) | - V_L2T_IDX(e->idx) | V_TX_CHANNEL(e->smt_idx)); - rpl->opt0l_status = htonl(calc_opt0l(so, newtoep->tp_ulp_mode) | - CPL_PASS_OPEN_ACCEPT); - - DPRINTF("opt0l_status=%08x\n", rpl->opt0l_status); - - m_set_priority(reply_mbuf, mkprio(CPL_PRIORITY_SETUP, newtoep)); - - l2t_send(cdev, reply_mbuf, e); - m_free(m); - if (newtoep->tp_ulp_mode) { - __set_tcb_field(newtoep, ddp_mbuf, W_TCB_RX_DDP_FLAGS, - V_TF_DDP_OFF(1) | - TP_DDP_TIMER_WORKAROUND_MASK, - V_TF_DDP_OFF(1) | - TP_DDP_TIMER_WORKAROUND_VAL, 1); - } else - DPRINTF("no DDP\n"); - - return; -reject: - if (tdev->tod_ttid == TOE_ID_CHELSIO_T3) - mk_pass_accept_rpl(reply_mbuf, m); - else - mk_tid_release(reply_mbuf, newtoep, tid); - cxgb_ofld_send(cdev, reply_mbuf); - m_free(m); -out: -#if 0 - TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); -#else - return; -#endif -} - -/* - * Handle a CPL_PASS_ACCEPT_REQ message. - */ -static int -do_pass_accept_req(struct t3cdev *cdev, struct mbuf *m, void *ctx) -{ - struct listen_ctx *listen_ctx = (struct listen_ctx *)ctx; - struct socket *lso = listen_ctx->lso; /* XXX need an interlock against the listen socket going away */ - struct tom_data *d = listen_ctx->tom_data; - -#if VALIDATE_TID - struct cpl_pass_accept_req *req = cplhdr(m); - unsigned int tid = GET_TID(req); - struct tid_info *t = &(T3C_DATA(cdev))->tid_maps; - - if (unlikely(!lsk)) { - printk(KERN_ERR "%s: PASS_ACCEPT_REQ had unknown STID %lu\n", - cdev->name, - (unsigned long)((union listen_entry *)ctx - - t->stid_tab)); - return CPL_RET_BUF_DONE; - } - if (unlikely(tid >= t->ntids)) { - printk(KERN_ERR "%s: passive open TID %u too large\n", - cdev->name, tid); - return CPL_RET_BUF_DONE; - } - /* - * For T3A the current user of the TID may have closed but its last - * message(s) may have been backlogged so the TID appears to be still - * in use. Just take the TID away, the connection can close at its - * own leisure. For T3B this situation is a bug. - */ - if (!valid_new_tid(t, tid) && - cdev->type != T3A) { - printk(KERN_ERR "%s: passive open uses existing TID %u\n", - cdev->name, tid); - return CPL_RET_BUF_DONE; - } -#endif - - process_pass_accept_req(lso, m, &d->tdev, listen_ctx); + send_abort_rpl(tod, tid, qset); + m_freem(m); return (0); } -/* - * Called when a connection is established to translate the TCP options - * reported by HW to FreeBSD's native format. - */ static void -assign_rxopt(struct socket *so, unsigned int opt) +assign_rxopt(struct tcpcb *tp, uint16_t tcpopt) { - struct tcpcb *tp = so_sototcpcb(so); struct toepcb *toep = tp->t_toe; - const struct t3c_data *td = T3C_DATA(TOEP_T3C_DEV(toep)); + struct adapter *sc = toep->tp_tod->tod_softc; - inp_lock_assert(tp->t_inpcb); - - toep->tp_mss_clamp = td->mtus[G_TCPOPT_MSS(opt)] - 40; - tp->t_flags |= G_TCPOPT_TSTAMP(opt) ? TF_RCVD_TSTMP : 0; - tp->t_flags |= G_TCPOPT_SACK(opt) ? TF_SACK_PERMIT : 0; - tp->t_flags |= G_TCPOPT_WSCALE_OK(opt) ? TF_RCVD_SCALE : 0; - if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) == - (TF_RCVD_SCALE|TF_REQ_SCALE)) + tp->t_maxseg = tp->t_maxopd = sc->params.mtus[G_TCPOPT_MSS(tcpopt)] - 40; + + if (G_TCPOPT_TSTAMP(tcpopt)) { + tp->t_flags |= TF_RCVD_TSTMP; + tp->t_flags |= TF_REQ_TSTMP; /* forcibly set */ + tp->ts_recent = 0; /* XXX */ + tp->ts_recent_age = tcp_ts_getticks(); + tp->t_maxseg -= TCPOLEN_TSTAMP_APPA; + } + + if (G_TCPOPT_SACK(tcpopt)) + tp->t_flags |= TF_SACK_PERMIT; + else + tp->t_flags &= ~TF_SACK_PERMIT; + + if (G_TCPOPT_WSCALE_OK(tcpopt)) + tp->t_flags |= TF_RCVD_SCALE; + + if ((tp->t_flags & (TF_RCVD_SCALE | TF_REQ_SCALE)) == + (TF_RCVD_SCALE | TF_REQ_SCALE)) { tp->rcv_scale = tp->request_r_scale; + tp->snd_scale = G_TCPOPT_SND_WSCALE(tcpopt); + } + } /* - * Completes some final bits of initialization for just established connections - * and changes their state to TCP_ESTABLISHED. - * - * snd_isn here is the ISN after the SYN, i.e., the true ISN + 1. + * The ISS and IRS are from after the exchange of SYNs and are off by 1. */ -static void -make_established(struct socket *so, u32 snd_isn, unsigned int opt) +void +make_established(struct socket *so, uint32_t cpl_iss, uint32_t cpl_irs, + uint16_t cpl_tcpopt) { - struct tcpcb *tp = so_sototcpcb(so); + struct inpcb *inp = sotoinpcb(so); + struct tcpcb *tp = intotcpcb(inp); struct toepcb *toep = tp->t_toe; - - toep->tp_write_seq = tp->iss = tp->snd_max = tp->snd_nxt = tp->snd_una = snd_isn; - assign_rxopt(so, opt); + long bufsize; + uint32_t iss = be32toh(cpl_iss) - 1; /* true ISS */ + uint32_t irs = be32toh(cpl_irs) - 1; /* true IRS */ + uint16_t tcpopt = be16toh(cpl_tcpopt); - /* - *XXXXXXXXXXX - * - */ -#ifdef notyet - so->so_proto->pr_ctloutput = t3_ctloutput; -#endif - -#if 0 - inet_sk(sk)->id = tp->write_seq ^ jiffies; -#endif - /* - * XXX not clear what rcv_wup maps to - */ - /* - * Causes the first RX_DATA_ACK to supply any Rx credits we couldn't - * pass through opt0. - */ - if (tp->rcv_wnd > (M_RCV_BUFSIZ << 10)) - toep->tp_rcv_wup -= tp->rcv_wnd - (M_RCV_BUFSIZ << 10); + INP_WLOCK_ASSERT(inp); - dump_toepcb(toep); - -#ifdef notyet -/* - * no clean interface for marking ARP up to date - */ - dst_confirm(sk->sk_dst_cache); -#endif - tp->t_starttime = ticks; tp->t_state = TCPS_ESTABLISHED; + tp->t_starttime = ticks; + TCPSTAT_INC(tcps_connects); + + CTR4(KTR_CXGB, "%s tid %u, toep %p, inp %p", tcpstates[tp->t_state], + toep->tp_tid, toep, inp); + + tp->irs = irs; + tcp_rcvseqinit(tp); + tp->rcv_wnd = toep->tp_rx_credits << 10; + tp->rcv_adv += tp->rcv_wnd; + tp->last_ack_sent = tp->rcv_nxt; + + /* + * If we were unable to send all rx credits via opt0, save the remainder + * in rx_credits so that they can be handed over with the next credit + * update. + */ + SOCKBUF_LOCK(&so->so_rcv); + bufsize = select_rcv_wnd(so); + SOCKBUF_UNLOCK(&so->so_rcv); + toep->tp_rx_credits = bufsize - tp->rcv_wnd; + + tp->iss = iss; + tcp_sendseqinit(tp); + tp->snd_una = iss + 1; + tp->snd_nxt = iss + 1; + tp->snd_max = iss + 1; + + assign_rxopt(tp, tcpopt); soisconnected(so); } -static int -syncache_expand_establish_req(struct cpl_pass_establish *req, struct socket **so, struct toepcb *toep) -{ - - struct in_conninfo inc; - struct toeopt toeo; - struct tcphdr th; - int mss, wsf, sack, ts; - struct mbuf *m = NULL; - const struct t3c_data *td = T3C_DATA(TOM_DATA(toep->tp_toedev)->cdev); - unsigned int opt; - -#ifdef MAC -#error "no MAC support" -#endif - - opt = ntohs(req->tcp_opt); - - bzero(&toeo, sizeof(struct toeopt)); - - /* - * Fill out information for entering us into the syncache - */ - bzero(&inc, sizeof(inc)); - inc.inc_fport = th.th_sport = req->peer_port; - inc.inc_lport = th.th_dport = req->local_port; - th.th_seq = req->rcv_isn; - th.th_flags = TH_ACK; - - inc.inc_len = 0; - inc.inc_faddr.s_addr = req->peer_ip; - inc.inc_laddr.s_addr = req->local_ip; - - mss = td->mtus[G_TCPOPT_MSS(opt)] - 40; - wsf = G_TCPOPT_WSCALE_OK(opt); - ts = G_TCPOPT_TSTAMP(opt); - sack = G_TCPOPT_SACK(opt); - - toeo.to_mss = mss; - toeo.to_wscale = G_TCPOPT_SND_WSCALE(opt); - toeo.to_flags = (mss ? TOF_MSS : 0) | (wsf ? TOF_SCALE : 0) | (ts ? TOF_TS : 0) | (sack ? TOF_SACKPERM : 0); - - DPRINTF("syncache expand of %d:%d %d:%d mss:%d wsf:%d ts:%d sack:%d\n", - ntohl(req->local_ip), ntohs(req->local_port), - ntohl(req->peer_ip), ntohs(req->peer_port), - mss, wsf, ts, sack); - return tcp_offload_syncache_expand(&inc, &toeo, &th, so, m); -} - - -/* - * Process a CPL_PASS_ESTABLISH message. XXX a lot of the locking doesn't work - * if we are in TCP_SYN_RECV due to crossed SYNs - */ -static int -do_pass_establish(struct t3cdev *cdev, struct mbuf *m, void *ctx) -{ - struct cpl_pass_establish *req = cplhdr(m); - struct toepcb *toep = (struct toepcb *)ctx; - struct tcpcb *tp = toep->tp_tp; - struct socket *so, *lso; - struct t3c_data *td = T3C_DATA(cdev); - struct sockbuf *snd, *rcv; - - // Complete socket initialization now that we have the SND_ISN - - struct toedev *tdev; - - - tdev = toep->tp_toedev; - - inp_wlock(tp->t_inpcb); - - /* - * - * XXX need to add reference while we're manipulating - */ - so = lso = inp_inpcbtosocket(tp->t_inpcb); - - inp_wunlock(tp->t_inpcb); - - so_lock(so); - LIST_REMOVE(toep, synq_entry); - so_unlock(so); - - if (!syncache_expand_establish_req(req, &so, toep)) { - /* - * No entry - */ - CXGB_UNIMPLEMENTED(); - } - if (so == NULL) { - /* - * Couldn't create the socket - */ - CXGB_UNIMPLEMENTED(); - } - - tp = so_sototcpcb(so); - inp_wlock(tp->t_inpcb); - - snd = so_sockbuf_snd(so); - rcv = so_sockbuf_rcv(so); - - snd->sb_flags |= SB_NOCOALESCE; - rcv->sb_flags |= SB_NOCOALESCE; - - toep->tp_tp = tp; - toep->tp_flags = 0; - tp->t_toe = toep; - reset_wr_list(toep); - tp->rcv_wnd = select_rcv_wnd(tdev, so); - tp->rcv_nxt = toep->tp_copied_seq; - install_offload_ops(so); - - toep->tp_wr_max = toep->tp_wr_avail = TOM_TUNABLE(tdev, max_wrs); - toep->tp_wr_unacked = 0; - toep->tp_qset = G_QNUM(ntohl(m->m_pkthdr.csum_data)); - toep->tp_qset_idx = 0; - toep->tp_mtu_idx = select_mss(td, tp, toep->tp_l2t->neigh->rt_ifp->if_mtu); - - /* - * XXX Cancel any keep alive timer - */ - - make_established(so, ntohl(req->snd_isn), ntohs(req->tcp_opt)); - - /* - * XXX workaround for lack of syncache drop - */ - toepcb_release(toep); - inp_wunlock(tp->t_inpcb); - - CTR1(KTR_TOM, "do_pass_establish tid=%u", toep->tp_tid); - cxgb_log_tcb(cdev->adapter, toep->tp_tid); -#ifdef notyet - /* - * XXX not sure how these checks map to us - */ - if (unlikely(sk->sk_socket)) { // simultaneous opens only - sk->sk_state_change(sk); - sk_wake_async(so, 0, POLL_OUT); - } - /* - * The state for the new connection is now up to date. - * Next check if we should add the connection to the parent's - * accept queue. When the parent closes it resets connections - * on its SYN queue, so check if we are being reset. If so we - * don't need to do anything more, the coming ABORT_RPL will - * destroy this socket. Otherwise move the connection to the - * accept queue. - * - * Note that we reset the synq before closing the server so if - * we are not being reset the stid is still open. - */ - if (unlikely(!tp->forward_skb_hint)) { // removed from synq - __kfree_skb(skb); - goto unlock; - } -#endif - m_free(m); - - return (0); -} - /* * Fill in the right TID for CPL messages waiting in the out-of-order queue * and send them to the TOE. @@ -3745,48 +1623,70 @@ static void fixup_and_send_ofo(struct toepcb *toep) { struct mbuf *m; - struct toedev *tdev = toep->tp_toedev; - struct tcpcb *tp = toep->tp_tp; + struct toedev *tod = toep->tp_tod; + struct adapter *sc = tod->tod_softc; + struct inpcb *inp = toep->tp_inp; unsigned int tid = toep->tp_tid; - log(LOG_NOTICE, "fixup_and_send_ofo\n"); - - inp_lock_assert(tp->t_inpcb); + inp_lock_assert(inp); + while ((m = mbufq_dequeue(&toep->out_of_order_queue)) != NULL) { + struct ofld_hdr *oh = mtod(m, void *); /* * A variety of messages can be waiting but the fields we'll * be touching are common to all so any message type will do. */ - struct cpl_close_con_req *p = cplhdr(m); + struct cpl_close_con_req *p = (void *)(oh + 1); - p->wr.wr_lo = htonl(V_WR_TID(tid)); + p->wr.wrh_lo = htonl(V_WR_TID(tid)); OPCODE_TID(p) = htonl(MK_OPCODE_TID(p->ot.opcode, tid)); - cxgb_ofld_send(TOM_DATA(tdev)->cdev, m); + t3_offload_tx(sc, m); } } /* - * Updates socket state from an active establish CPL message. Runs with the - * socket lock held. + * Process a CPL_ACT_ESTABLISH message. */ -static void -socket_act_establish(struct socket *so, struct mbuf *m) +static int +do_act_establish(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { - struct cpl_act_establish *req = cplhdr(m); - u32 rcv_isn = ntohl(req->rcv_isn); /* real RCV_ISN + 1 */ - struct tcpcb *tp = so_sototcpcb(so); - struct toepcb *toep = tp->t_toe; - - if (__predict_false(tp->t_state != TCPS_SYN_SENT)) - log(LOG_ERR, "TID %u expected SYN_SENT, found %d\n", - toep->tp_tid, tp->t_state); + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct cpl_act_establish *req = mtod(m, void *); + unsigned int tid = GET_TID(req); + unsigned int atid = G_PASS_OPEN_TID(ntohl(req->tos_tid)); + struct toepcb *toep = lookup_atid(&td->tid_maps, atid); + struct inpcb *inp = toep->tp_inp; + struct tcpcb *tp; + struct socket *so; - tp->ts_recent_age = ticks; - tp->irs = tp->rcv_wnd = tp->rcv_nxt = rcv_isn; - toep->tp_delack_seq = toep->tp_rcv_wup = toep->tp_copied_seq = tp->irs; + CTR3(KTR_CXGB, "%s: atid %u, tid %u", __func__, atid, tid); + + free_atid(&td->tid_maps, atid); + + INP_WLOCK(inp); + tp = intotcpcb(inp); + + KASSERT(toep->tp_qset == qs->idx, + ("%s qset mismatch %d %d", __func__, toep->tp_qset, qs->idx)); + KASSERT(toep->tp_tid == atid, + ("%s atid mismatch %d %d", __func__, toep->tp_tid, atid)); + + toep->tp_tid = tid; + insert_tid(td, toep, tid); + + if (inp->inp_flags & INP_DROPPED) { + /* socket closed by the kernel before hw told us it connected */ + send_reset(toep); + goto done; + } + + KASSERT(tp->t_state == TCPS_SYN_SENT, + ("TID %u expected TCPS_SYN_SENT, found %d.", tid, tp->t_state)); + + so = inp->inp_socket; + make_established(so, req->snd_isn, req->rcv_isn, req->tcp_opt); - make_established(so, ntohl(req->snd_isn), ntohs(req->tcp_opt)); - /* * Now that we finally have a TID send any CPL messages that we had to * defer for lack of a TID. @@ -3794,80 +1694,9 @@ socket_act_establish(struct socket *so, struct mbuf *m) if (mbufq_len(&toep->out_of_order_queue)) fixup_and_send_ofo(toep); - if (__predict_false(so_state_get(so) & SS_NOFDREF)) { - /* - * XXX does this even make sense? - */ - so_sorwakeup(so); - } - m_free(m); -#ifdef notyet -/* - * XXX assume no write requests permitted while socket connection is - * incomplete - */ - /* - * Currently the send queue must be empty at this point because the - * socket layer does not send anything before a connection is - * established. To be future proof though we handle the possibility - * that there are pending buffers to send (either TX_DATA or - * CLOSE_CON_REQ). First we need to adjust the sequence number of the - * buffers according to the just learned write_seq, and then we send - * them on their way. - */ - fixup_pending_writeq_buffers(sk); - if (t3_push_frames(so, 1)) - sk->sk_write_space(sk); -#endif - - toep->tp_state = tp->t_state; - KMOD_TCPSTAT_INC(tcps_connects); - -} - -/* - * Process a CPL_ACT_ESTABLISH message. - */ -static int -do_act_establish(struct t3cdev *cdev, struct mbuf *m, void *ctx) -{ - struct cpl_act_establish *req = cplhdr(m); - unsigned int tid = GET_TID(req); - unsigned int atid = G_PASS_OPEN_TID(ntohl(req->tos_tid)); - struct toepcb *toep = (struct toepcb *)ctx; - struct tcpcb *tp = toep->tp_tp; - struct socket *so; - struct toedev *tdev; - struct tom_data *d; - - if (tp == NULL) { - free_atid(cdev, atid); - return (0); - } - inp_wlock(tp->t_inpcb); - - /* - * XXX - */ - so = inp_inpcbtosocket(tp->t_inpcb); - tdev = toep->tp_toedev; /* blow up here if link was down */ - d = TOM_DATA(tdev); - - /* - * It's OK if the TID is currently in use, the owning socket may have - * backlogged its last CPL message(s). Just take it away. - */ - toep->tp_tid = tid; - toep->tp_tp = tp; - so_insert_tid(d, toep, tid); - free_atid(cdev, atid); - toep->tp_qset = G_QNUM(ntohl(m->m_pkthdr.csum_data)); - - socket_act_establish(so, m); - inp_wunlock(tp->t_inpcb); - CTR1(KTR_TOM, "do_act_establish tid=%u", toep->tp_tid); - cxgb_log_tcb(cdev->adapter, toep->tp_tid); - +done: + INP_WUNLOCK(inp); + m_freem(m); return (0); } @@ -3878,97 +1707,66 @@ do_act_establish(struct t3cdev *cdev, struct mbuf *m, void *ctx) static void wr_ack(struct toepcb *toep, struct mbuf *m) { - struct tcpcb *tp = toep->tp_tp; - struct cpl_wr_ack *hdr = cplhdr(m); + struct inpcb *inp = toep->tp_inp; + struct tcpcb *tp; + struct cpl_wr_ack *hdr = mtod(m, void *); struct socket *so; unsigned int credits = ntohs(hdr->credits); u32 snd_una = ntohl(hdr->snd_una); int bytes = 0; struct sockbuf *snd; - - CTR2(KTR_SPARE2, "wr_ack: snd_una=%u credits=%d", snd_una, credits); + struct mbuf *p; + struct ofld_hdr *oh; - inp_wlock(tp->t_inpcb); - so = inp_inpcbtosocket(tp->t_inpcb); + inp_wlock(inp); + tp = intotcpcb(inp); + so = inp->inp_socket; toep->tp_wr_avail += credits; if (toep->tp_wr_unacked > toep->tp_wr_max - toep->tp_wr_avail) toep->tp_wr_unacked = toep->tp_wr_max - toep->tp_wr_avail; while (credits) { - struct mbuf *p = peek_wr(toep); - + p = peek_wr(toep); + if (__predict_false(!p)) { + CTR5(KTR_CXGB, "%s: %u extra WR_ACK credits, " + "tid %u, state %u, wr_avail %u", __func__, credits, + toep->tp_tid, tp->t_state, toep->tp_wr_avail); + log(LOG_ERR, "%u WR_ACK credits for TID %u with " "nothing pending, state %u wr_avail=%u\n", credits, toep->tp_tid, tp->t_state, toep->tp_wr_avail); break; } - CTR2(KTR_TOM, - "wr_ack: p->credits=%d p->bytes=%d", - p->m_pkthdr.csum_data, p->m_pkthdr.len); - KASSERT(p->m_pkthdr.csum_data != 0, - ("empty request still on list")); - if (__predict_false(credits < p->m_pkthdr.csum_data)) { + oh = mtod(p, struct ofld_hdr *); -#if DEBUG_WR > 1 - struct tx_data_wr *w = cplhdr(p); - log(LOG_ERR, - "TID %u got %u WR credits, need %u, len %u, " - "main body %u, frags %u, seq # %u, ACK una %u," - " ACK nxt %u, WR_AVAIL %u, WRs pending %u\n", - toep->tp_tid, credits, p->csum, p->len, - p->len - p->data_len, skb_shinfo(p)->nr_frags, - ntohl(w->sndseq), snd_una, ntohl(hdr->snd_nxt), - toep->tp_wr_avail, count_pending_wrs(tp) - credits); -#endif - p->m_pkthdr.csum_data -= credits; - break; - } else { - dequeue_wr(toep); - credits -= p->m_pkthdr.csum_data; - bytes += p->m_pkthdr.len; - CTR3(KTR_TOM, - "wr_ack: done with wr of %d bytes remain credits=%d wr credits=%d", - p->m_pkthdr.len, credits, p->m_pkthdr.csum_data); - - m_free(p); - } + KASSERT(credits >= G_HDR_NDESC(oh->flags), + ("%s: partial credits? %d %d", __func__, credits, + G_HDR_NDESC(oh->flags))); + + dequeue_wr(toep); + credits -= G_HDR_NDESC(oh->flags); + bytes += oh->plen; + + if (oh->flags & F_HDR_SGL) + sglist_free(oh->sgl); + m_freem(p); } -#if DEBUG_WR - check_wr_invariants(tp); -#endif - - if (__predict_false(SEQ_LT(snd_una, tp->snd_una))) { -#if VALIDATE_SEQ - struct tom_data *d = TOM_DATA(TOE_DEV(so)); - - log(LOG_ERR "%s: unexpected sequence # %u in WR_ACK " - "for TID %u, snd_una %u\n", (&d->tdev)->name, snd_una, - toep->tp_tid, tp->snd_una); -#endif + if (__predict_false(SEQ_LT(snd_una, tp->snd_una))) goto out_free; - } if (tp->snd_una != snd_una) { tp->snd_una = snd_una; - tp->ts_recent_age = ticks; -#ifdef notyet - /* - * Keep ARP entry "minty fresh" - */ - dst_confirm(sk->sk_dst_cache); -#endif + tp->ts_recent_age = tcp_ts_getticks(); if (tp->snd_una == tp->snd_nxt) toep->tp_flags &= ~TP_TX_WAIT_IDLE; } snd = so_sockbuf_snd(so); if (bytes) { - CTR1(KTR_SPARE2, "wr_ack: sbdrop(%d)", bytes); - snd = so_sockbuf_snd(so); - sockbuf_lock(snd); + SOCKBUF_LOCK(snd); sbdrop_locked(snd, bytes); so_sowwakeup_locked(so); } @@ -3978,142 +1776,25 @@ wr_ack(struct toepcb *toep, struct mbuf *m) out_free: inp_wunlock(tp->t_inpcb); - m_free(m); + m_freem(m); } /* * Handler for TX_DATA_ACK CPL messages. */ static int -do_wr_ack(struct t3cdev *dev, struct mbuf *m, void *ctx) +do_wr_ack(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) { - struct toepcb *toep = (struct toepcb *)ctx; + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct cpl_wr_ack *hdr = mtod(m, void *); + unsigned int tid = GET_TID(hdr); + struct toepcb *toep = lookup_tid(&td->tid_maps, tid); - VALIDATE_SOCK(so); + /* XXX bad race */ + if (toep) + wr_ack(toep, m); - wr_ack(toep, m); - return 0; -} - -/* - * Handler for TRACE_PKT CPL messages. Just sink these packets. - */ -static int -do_trace_pkt(struct t3cdev *dev, struct mbuf *m, void *ctx) -{ - m_freem(m); - return 0; -} - -/* - * Reset a connection that is on a listener's SYN queue or accept queue, - * i.e., one that has not had a struct socket associated with it. - * Must be called from process context. - * - * Modeled after code in inet_csk_listen_stop(). - */ -static void -t3_reset_listen_child(struct socket *child) -{ - struct tcpcb *tp = so_sototcpcb(child); - - t3_send_reset(tp->t_toe); -} - - -static void -t3_child_disconnect(struct socket *so, void *arg) -{ - struct tcpcb *tp = so_sototcpcb(so); - - if (tp->t_flags & TF_TOE) { - inp_wlock(tp->t_inpcb); - t3_reset_listen_child(so); - inp_wunlock(tp->t_inpcb); - } -} - -/* - * Disconnect offloaded established but not yet accepted connections sitting - * on a server's accept_queue. We just send an ABORT_REQ at this point and - * finish off the disconnect later as we may need to wait for the ABORT_RPL. - */ -void -t3_disconnect_acceptq(struct socket *listen_so) -{ - - so_lock(listen_so); - so_listeners_apply_all(listen_so, t3_child_disconnect, NULL); - so_unlock(listen_so); -} - -/* - * Reset offloaded connections sitting on a server's syn queue. As above - * we send ABORT_REQ and finish off when we get ABORT_RPL. - */ - -void -t3_reset_synq(struct listen_ctx *lctx) -{ - struct toepcb *toep; - - so_lock(lctx->lso); - while (!LIST_EMPTY(&lctx->synq_head)) { - toep = LIST_FIRST(&lctx->synq_head); - LIST_REMOVE(toep, synq_entry); - toep->tp_tp = NULL; - t3_send_reset(toep); - cxgb_remove_tid(TOEP_T3C_DEV(toep), toep, toep->tp_tid); - toepcb_release(toep); - } - so_unlock(lctx->lso); -} - - -int -t3_setup_ppods(struct toepcb *toep, const struct ddp_gather_list *gl, - unsigned int nppods, unsigned int tag, unsigned int maxoff, - unsigned int pg_off, unsigned int color) -{ - unsigned int i, j, pidx; - struct pagepod *p; - struct mbuf *m; - struct ulp_mem_io *req; - unsigned int tid = toep->tp_tid; - const struct tom_data *td = TOM_DATA(toep->tp_toedev); - unsigned int ppod_addr = tag * PPOD_SIZE + td->ddp_llimit; - - CTR6(KTR_TOM, "t3_setup_ppods(gl=%p nppods=%u tag=%u maxoff=%u pg_off=%u color=%u)", - gl, nppods, tag, maxoff, pg_off, color); - - for (i = 0; i < nppods; ++i) { - m = m_gethdr_nofail(sizeof(*req) + PPOD_SIZE); - m_set_priority(m, mkprio(CPL_PRIORITY_CONTROL, toep)); - req = mtod(m, struct ulp_mem_io *); - m->m_pkthdr.len = m->m_len = sizeof(*req) + PPOD_SIZE; - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_BYPASS)); - req->wr.wr_lo = 0; - req->cmd_lock_addr = htonl(V_ULP_MEMIO_ADDR(ppod_addr >> 5) | - V_ULPTX_CMD(ULP_MEM_WRITE)); - req->len = htonl(V_ULP_MEMIO_DATA_LEN(PPOD_SIZE / 32) | - V_ULPTX_NFLITS(PPOD_SIZE / 8 + 1)); - - p = (struct pagepod *)(req + 1); - if (__predict_false(i < nppods - NUM_SENTINEL_PPODS)) { - p->pp_vld_tid = htonl(F_PPOD_VALID | V_PPOD_TID(tid)); - p->pp_pgsz_tag_color = htonl(V_PPOD_TAG(tag) | - V_PPOD_COLOR(color)); - p->pp_max_offset = htonl(maxoff); - p->pp_page_offset = htonl(pg_off); - p->pp_rsvd = 0; - for (pidx = 4 * i, j = 0; j < 5; ++j, ++pidx) - p->pp_addr[j] = pidx < gl->dgl_nelem ? - htobe64(VM_PAGE_TO_PHYS(gl->dgl_pages[pidx])) : 0; - } else - p->pp_vld_tid = 0; /* mark sentinel page pods invalid */ - send_or_defer(toep, m, 0); - ppod_addr += PPOD_SIZE; - } return (0); } @@ -4153,10 +1834,7 @@ mk_set_tcb_field_ulp(struct cpl_set_tcb_field *req, unsigned int tid, unsigned int word, uint64_t mask, uint64_t val) { struct ulp_txpkt *txpkt = (struct ulp_txpkt *)req; - - CTR4(KTR_TCB, "mk_set_tcb_field_ulp(tid=%u word=0x%x mask=%jx val=%jx", - tid, word, mask, val); - + txpkt->cmd_dest = htonl(V_ULPTX_CMD(ULP_TXPKT)); txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*req) / 8)); OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, tid)); @@ -4167,294 +1845,19 @@ mk_set_tcb_field_ulp(struct cpl_set_tcb_field *req, unsigned int tid, req->val = htobe64(val); } -/* - * Build a CPL_RX_DATA_ACK message as payload of a ULP_TX_PKT command. - */ -static void -mk_rx_data_ack_ulp(struct toepcb *toep, struct cpl_rx_data_ack *ack, - unsigned int tid, unsigned int credits) -{ - struct ulp_txpkt *txpkt = (struct ulp_txpkt *)ack; - - txpkt->cmd_dest = htonl(V_ULPTX_CMD(ULP_TXPKT)); - txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*ack) / 8)); - OPCODE_TID(ack) = htonl(MK_OPCODE_TID(CPL_RX_DATA_ACK, tid)); - ack->credit_dack = htonl(F_RX_MODULATE | F_RX_DACK_CHANGE | - V_RX_DACK_MODE(TOM_TUNABLE(toep->tp_toedev, delack)) | - V_RX_CREDITS(credits)); -} - void -t3_cancel_ddpbuf(struct toepcb *toep, unsigned int bufidx) +t3_init_cpl_io(struct adapter *sc) { - unsigned int wrlen; - struct mbuf *m; - struct work_request_hdr *wr; - struct cpl_barrier *lock; - struct cpl_set_tcb_field *req; - struct cpl_get_tcb *getreq; - struct ddp_state *p = &toep->tp_ddp_state; - -#if 0 - SOCKBUF_LOCK_ASSERT(&toeptoso(toep)->so_rcv); -#endif - wrlen = sizeof(*wr) + sizeof(*req) + 2 * sizeof(*lock) + - sizeof(*getreq); - m = m_gethdr_nofail(wrlen); - m_set_priority(m, mkprio(CPL_PRIORITY_CONTROL, toep)); - wr = mtod(m, struct work_request_hdr *); - bzero(wr, wrlen); - - wr->wr_hi = htonl(V_WR_OP(FW_WROPCODE_BYPASS)); - m->m_pkthdr.len = m->m_len = wrlen; - - lock = (struct cpl_barrier *)(wr + 1); - mk_cpl_barrier_ulp(lock); - - req = (struct cpl_set_tcb_field *)(lock + 1); - - CTR1(KTR_TCB, "t3_cancel_ddpbuf(bufidx=%u)", bufidx); - - /* Hmmm, not sure if this actually a good thing: reactivating - * the other buffer might be an issue if it has been completed - * already. However, that is unlikely, since the fact that the UBUF - * is not completed indicates that there is no oustanding data. - */ - if (bufidx == 0) - mk_set_tcb_field_ulp(req, toep->tp_tid, W_TCB_RX_DDP_FLAGS, - V_TF_DDP_ACTIVE_BUF(1) | - V_TF_DDP_BUF0_VALID(1), - V_TF_DDP_ACTIVE_BUF(1)); - else - mk_set_tcb_field_ulp(req, toep->tp_tid, W_TCB_RX_DDP_FLAGS, - V_TF_DDP_ACTIVE_BUF(1) | - V_TF_DDP_BUF1_VALID(1), 0); - - getreq = (struct cpl_get_tcb *)(req + 1); - mk_get_tcb_ulp(getreq, toep->tp_tid, toep->tp_qset); - - mk_cpl_barrier_ulp((struct cpl_barrier *)(getreq + 1)); - - /* Keep track of the number of oustanding CPL_GET_TCB requests - */ - p->get_tcb_count++; - -#ifdef T3_TRACE - T3_TRACE1(TIDTB(so), - "t3_cancel_ddpbuf: bufidx %u", bufidx); -#endif - cxgb_ofld_send(TOEP_T3C_DEV(toep), m); + t3_register_cpl_handler(sc, CPL_ACT_ESTABLISH, do_act_establish); + t3_register_cpl_handler(sc, CPL_ACT_OPEN_RPL, do_act_open_rpl); + t3_register_cpl_handler(sc, CPL_RX_URG_NOTIFY, do_rx_urg_notify); + t3_register_cpl_handler(sc, CPL_RX_DATA, do_rx_data); + t3_register_cpl_handler(sc, CPL_TX_DMA_ACK, do_wr_ack); + t3_register_cpl_handler(sc, CPL_PEER_CLOSE, do_peer_close); + t3_register_cpl_handler(sc, CPL_ABORT_REQ_RSS, do_abort_req); + t3_register_cpl_handler(sc, CPL_ABORT_RPL_RSS, do_abort_rpl); + t3_register_cpl_handler(sc, CPL_CLOSE_CON_RPL, do_close_con_rpl); + t3_register_cpl_handler(sc, CPL_SMT_WRITE_RPL, do_smt_write_rpl); + t3_register_cpl_handler(sc, CPL_SET_TCB_RPL, do_set_tcb_rpl); } - -/** - * t3_overlay_ddpbuf - overlay an existing DDP buffer with a new one - * @sk: the socket associated with the buffers - * @bufidx: index of HW DDP buffer (0 or 1) - * @tag0: new tag for HW buffer 0 - * @tag1: new tag for HW buffer 1 - * @len: new length for HW buf @bufidx - * - * Sends a compound WR to overlay a new DDP buffer on top of an existing - * buffer by changing the buffer tag and length and setting the valid and - * active flag accordingly. The caller must ensure the new buffer is at - * least as big as the existing one. Since we typically reprogram both HW - * buffers this function sets both tags for convenience. Read the TCB to - * determine how made data was written into the buffer before the overlay - * took place. - */ -void -t3_overlay_ddpbuf(struct toepcb *toep, unsigned int bufidx, unsigned int tag0, - unsigned int tag1, unsigned int len) -{ - unsigned int wrlen; - struct mbuf *m; - struct work_request_hdr *wr; - struct cpl_get_tcb *getreq; - struct cpl_set_tcb_field *req; - struct ddp_state *p = &toep->tp_ddp_state; - - CTR4(KTR_TCB, "t3_setup_ppods(bufidx=%u tag0=%u tag1=%u len=%u)", - bufidx, tag0, tag1, len); -#if 0 - SOCKBUF_LOCK_ASSERT(&toeptoso(toep)->so_rcv); -#endif - wrlen = sizeof(*wr) + 3 * sizeof(*req) + sizeof(*getreq); - m = m_gethdr_nofail(wrlen); - m_set_priority(m, mkprio(CPL_PRIORITY_CONTROL, toep)); - wr = mtod(m, struct work_request_hdr *); - m->m_pkthdr.len = m->m_len = wrlen; - bzero(wr, wrlen); - - - /* Set the ATOMIC flag to make sure that TP processes the following - * CPLs in an atomic manner and no wire segments can be interleaved. - */ - wr->wr_hi = htonl(V_WR_OP(FW_WROPCODE_BYPASS) | F_WR_ATOMIC); - req = (struct cpl_set_tcb_field *)(wr + 1); - mk_set_tcb_field_ulp(req, toep->tp_tid, W_TCB_RX_DDP_BUF0_TAG, - V_TCB_RX_DDP_BUF0_TAG(M_TCB_RX_DDP_BUF0_TAG) | - V_TCB_RX_DDP_BUF1_TAG(M_TCB_RX_DDP_BUF1_TAG) << 32, - V_TCB_RX_DDP_BUF0_TAG(tag0) | - V_TCB_RX_DDP_BUF1_TAG((uint64_t)tag1) << 32); - req++; - if (bufidx == 0) { - mk_set_tcb_field_ulp(req, toep->tp_tid, W_TCB_RX_DDP_BUF0_LEN, - V_TCB_RX_DDP_BUF0_LEN(M_TCB_RX_DDP_BUF0_LEN), - V_TCB_RX_DDP_BUF0_LEN((uint64_t)len)); - req++; - mk_set_tcb_field_ulp(req, toep->tp_tid, W_TCB_RX_DDP_FLAGS, - V_TF_DDP_PUSH_DISABLE_0(1) | - V_TF_DDP_BUF0_VALID(1) | V_TF_DDP_ACTIVE_BUF(1), - V_TF_DDP_PUSH_DISABLE_0(0) | - V_TF_DDP_BUF0_VALID(1)); - } else { - mk_set_tcb_field_ulp(req, toep->tp_tid, W_TCB_RX_DDP_BUF1_LEN, - V_TCB_RX_DDP_BUF1_LEN(M_TCB_RX_DDP_BUF1_LEN), - V_TCB_RX_DDP_BUF1_LEN((uint64_t)len)); - req++; - mk_set_tcb_field_ulp(req, toep->tp_tid, W_TCB_RX_DDP_FLAGS, - V_TF_DDP_PUSH_DISABLE_1(1) | - V_TF_DDP_BUF1_VALID(1) | V_TF_DDP_ACTIVE_BUF(1), - V_TF_DDP_PUSH_DISABLE_1(0) | - V_TF_DDP_BUF1_VALID(1) | V_TF_DDP_ACTIVE_BUF(1)); - } - - getreq = (struct cpl_get_tcb *)(req + 1); - mk_get_tcb_ulp(getreq, toep->tp_tid, toep->tp_qset); - - /* Keep track of the number of oustanding CPL_GET_TCB requests - */ - p->get_tcb_count++; - -#ifdef T3_TRACE - T3_TRACE4(TIDTB(sk), - "t3_overlay_ddpbuf: bufidx %u tag0 %u tag1 %u " - "len %d", - bufidx, tag0, tag1, len); #endif - cxgb_ofld_send(TOEP_T3C_DEV(toep), m); -} - -/* - * Sends a compound WR containing all the CPL messages needed to program the - * two HW DDP buffers, namely optionally setting up the length and offset of - * each buffer, programming the DDP flags, and optionally sending RX_DATA_ACK. - */ -void -t3_setup_ddpbufs(struct toepcb *toep, unsigned int len0, unsigned int offset0, - unsigned int len1, unsigned int offset1, - uint64_t ddp_flags, uint64_t flag_mask, int modulate) -{ - unsigned int wrlen; - struct mbuf *m; - struct work_request_hdr *wr; - struct cpl_set_tcb_field *req; - - CTR6(KTR_TCB, "t3_setup_ddpbufs(len0=%u offset0=%u len1=%u offset1=%u ddp_flags=0x%08x%08x ", - len0, offset0, len1, offset1, ddp_flags >> 32, ddp_flags & 0xffffffff); - -#if 0 - SOCKBUF_LOCK_ASSERT(&toeptoso(toep)->so_rcv); -#endif - wrlen = sizeof(*wr) + sizeof(*req) + (len0 ? sizeof(*req) : 0) + - (len1 ? sizeof(*req) : 0) + - (modulate ? sizeof(struct cpl_rx_data_ack) : 0); - m = m_gethdr_nofail(wrlen); - m_set_priority(m, mkprio(CPL_PRIORITY_CONTROL, toep)); - wr = mtod(m, struct work_request_hdr *); - bzero(wr, wrlen); - - wr->wr_hi = htonl(V_WR_OP(FW_WROPCODE_BYPASS)); - m->m_pkthdr.len = m->m_len = wrlen; - - req = (struct cpl_set_tcb_field *)(wr + 1); - if (len0) { /* program buffer 0 offset and length */ - mk_set_tcb_field_ulp(req, toep->tp_tid, W_TCB_RX_DDP_BUF0_OFFSET, - V_TCB_RX_DDP_BUF0_OFFSET(M_TCB_RX_DDP_BUF0_OFFSET) | - V_TCB_RX_DDP_BUF0_LEN(M_TCB_RX_DDP_BUF0_LEN), - V_TCB_RX_DDP_BUF0_OFFSET((uint64_t)offset0) | - V_TCB_RX_DDP_BUF0_LEN((uint64_t)len0)); - req++; - } - if (len1) { /* program buffer 1 offset and length */ - mk_set_tcb_field_ulp(req, toep->tp_tid, W_TCB_RX_DDP_BUF1_OFFSET, - V_TCB_RX_DDP_BUF1_OFFSET(M_TCB_RX_DDP_BUF1_OFFSET) | - V_TCB_RX_DDP_BUF1_LEN(M_TCB_RX_DDP_BUF1_LEN) << 32, - V_TCB_RX_DDP_BUF1_OFFSET((uint64_t)offset1) | - V_TCB_RX_DDP_BUF1_LEN((uint64_t)len1) << 32); - req++; - } - - mk_set_tcb_field_ulp(req, toep->tp_tid, W_TCB_RX_DDP_FLAGS, flag_mask, - ddp_flags); - - if (modulate) { - mk_rx_data_ack_ulp(toep, - (struct cpl_rx_data_ack *)(req + 1), toep->tp_tid, - toep->tp_copied_seq - toep->tp_rcv_wup); - toep->tp_rcv_wup = toep->tp_copied_seq; - } - -#ifdef T3_TRACE - T3_TRACE5(TIDTB(sk), - "t3_setup_ddpbufs: len0 %u len1 %u ddp_flags 0x%08x%08x " - "modulate %d", - len0, len1, ddp_flags >> 32, ddp_flags & 0xffffffff, - modulate); -#endif - - cxgb_ofld_send(TOEP_T3C_DEV(toep), m); -} - -void -t3_init_wr_tab(unsigned int wr_len) -{ - int i; - - if (mbuf_wrs[1]) /* already initialized */ - return; - - for (i = 1; i < ARRAY_SIZE(mbuf_wrs); i++) { - int sgl_len = (3 * i) / 2 + (i & 1); - - sgl_len += 3; - mbuf_wrs[i] = sgl_len <= wr_len ? - 1 : 1 + (sgl_len - 2) / (wr_len - 1); - } - - wrlen = wr_len * 8; -} - -int -t3_init_cpl_io(void) -{ -#ifdef notyet - tcphdr_skb = alloc_skb(sizeof(struct tcphdr), GFP_KERNEL); - if (!tcphdr_skb) { - log(LOG_ERR, - "Chelsio TCP offload: can't allocate sk_buff\n"); - return -1; - } - skb_put(tcphdr_skb, sizeof(struct tcphdr)); - tcphdr_skb->h.raw = tcphdr_skb->data; - memset(tcphdr_skb->data, 0, tcphdr_skb->len); -#endif - - t3tom_register_cpl_handler(CPL_ACT_ESTABLISH, do_act_establish); - t3tom_register_cpl_handler(CPL_ACT_OPEN_RPL, do_act_open_rpl); - t3tom_register_cpl_handler(CPL_TX_DMA_ACK, do_wr_ack); - t3tom_register_cpl_handler(CPL_RX_DATA, do_rx_data); - t3tom_register_cpl_handler(CPL_CLOSE_CON_RPL, do_close_con_rpl); - t3tom_register_cpl_handler(CPL_PEER_CLOSE, do_peer_close); - t3tom_register_cpl_handler(CPL_PASS_ESTABLISH, do_pass_establish); - t3tom_register_cpl_handler(CPL_PASS_ACCEPT_REQ, do_pass_accept_req); - t3tom_register_cpl_handler(CPL_ABORT_REQ_RSS, do_abort_req); - t3tom_register_cpl_handler(CPL_ABORT_RPL_RSS, do_abort_rpl); - t3tom_register_cpl_handler(CPL_RX_DATA_DDP, do_rx_data_ddp); - t3tom_register_cpl_handler(CPL_RX_DDP_COMPLETE, do_rx_ddp_complete); - t3tom_register_cpl_handler(CPL_RX_URG_NOTIFY, do_rx_urg_notify); - t3tom_register_cpl_handler(CPL_TRACE_PKT, do_trace_pkt); - t3tom_register_cpl_handler(CPL_GET_TCB_RPL, do_get_tcb_rpl); - return (0); -} - diff --git a/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c b/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c deleted file mode 100644 index bb0015f3998..00000000000 --- a/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c +++ /dev/null @@ -1,1034 +0,0 @@ -/************************************************************************** - -Copyright (c) 2007-2008, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -***************************************************************************/ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - - -static int (*pru_sosend)(struct socket *so, struct sockaddr *addr, - struct uio *uio, struct mbuf *top, struct mbuf *control, - int flags, struct thread *td); - -static int (*pru_soreceive)(struct socket *so, struct sockaddr **paddr, - struct uio *uio, struct mbuf **mp0, struct mbuf **controlp, - int *flagsp); - -#define TMP_IOV_MAX 16 -#ifndef PG_FRAME -#define PG_FRAME ~PAGE_MASK -#endif -#define SBLOCKWAIT(f) (((f) & MSG_DONTWAIT) ? M_NOWAIT : M_WAITOK) - -void -t3_init_socket_ops(void) -{ - struct protosw *prp; - - prp = pffindtype(AF_INET, SOCK_STREAM); - pru_sosend = prp->pr_usrreqs->pru_sosend; - pru_soreceive = prp->pr_usrreqs->pru_soreceive; -} - -struct cxgb_dma_info { - size_t cdi_mapped; - int cdi_nsegs; - bus_dma_segment_t *cdi_segs; - -}; - -static void -cxgb_dma_callback(void *arg, bus_dma_segment_t *segs, int nsegs, - bus_size_t mapsize, int error) -{ - struct cxgb_dma_info *cdi = arg; - - cdi->cdi_mapped = mapsize; - cdi->cdi_nsegs = nsegs; - cdi->cdi_segs = segs; -} - -static void -iov_adj(struct iovec **iov, int *iovcnt, size_t count) -{ - struct iovec *iovtmp; - int iovcnttmp; - caddr_t ptmp; - - if (count > 0) { - iovtmp = *iov; - iovcnttmp = *iovcnt; - while (count > 0) { - if (count < iovtmp->iov_len) { - ptmp = iovtmp->iov_base; - ptmp += count; - iovtmp->iov_base = ptmp; - iovtmp->iov_len -= count; - break; - } else - count -= iovtmp->iov_len; - iovtmp++; - iovcnttmp--; - } - *iov = iovtmp; - *iovcnt = iovcnttmp; - } else if (count < 0) { - iovtmp = &(*iov)[*iovcnt - 1]; - iovcnttmp = *iovcnt; - while (count < 0) { - if (-count < iovtmp->iov_len) { - iovtmp->iov_len += count; - break; - } else - count += iovtmp->iov_len; - iovtmp--; - iovcnttmp--; - } - *iovcnt = iovcnttmp; - } -} - -static void -cxgb_zero_copy_free(void *cl, void *arg) -{ - struct mbuf_vec *mv; - struct mbuf *m = (struct mbuf *)cl; - - mv = mtomv(m); - /* - * Physical addresses, don't try to free should be unheld separately from sbdrop - * - */ - mv->mv_count = 0; - m_free_iovec(m, m->m_type); -} - - -static int -cxgb_hold_iovec_pages(struct uio *uio, vm_page_t *m, int *held, vm_prot_t prot) -{ - struct iovec *iov = uio->uio_iov; - int iovcnt = uio->uio_iovcnt; - int err, i, count, totcount, maxcount, totbytes, npages, curbytes; - uint64_t start, end; - vm_page_t *mp; - vm_map_t map; - - map = &uio->uio_td->td_proc->p_vmspace->vm_map; - totbytes = totcount = 0; - maxcount = *held; - - mp = m; - for (totcount = i = 0; (i < iovcnt) && (totcount < maxcount); i++, iov++) { - count = maxcount - totcount; - - start = (uintptr_t)iov->iov_base; - end = (uintptr_t)((caddr_t)iov->iov_base + iov->iov_len); - start &= PG_FRAME; - end += PAGE_MASK; - end &= PG_FRAME; - npages = (end - start) >> PAGE_SHIFT; - - count = min(count, npages); - - /* The following return value is not used. XXX */ - err = vm_fault_quick_hold_pages(map, - (vm_offset_t)iov->iov_base, iov->iov_len, prot, mp, count); - mp += count; - totcount += count; - curbytes = iov->iov_len; - if (count != npages) - curbytes = count*PAGE_SIZE - (((uintptr_t)iov->iov_base)&PAGE_MASK); - totbytes += curbytes; - } - uio->uio_resid -= totbytes; - - return (0); -} - -/* - * Returns whether a connection should enable DDP. This happens when all of - * the following conditions are met: - * - the connection's ULP mode is DDP - * - DDP is not already enabled - * - the last receive was above the DDP threshold - * - receive buffers are in user space - * - receive side isn't shutdown (handled by caller) - * - the connection's receive window is big enough so that sizable buffers - * can be posted without closing the window in the middle of DDP (checked - * when the connection is offloaded) - */ -static int -so_should_ddp(const struct toepcb *toep, int last_recv_len) -{ - - DPRINTF("ulp_mode=%d last_recv_len=%d ddp_thresh=%d rcv_wnd=%ld ddp_copy_limit=%d\n", - toep->tp_ulp_mode, last_recv_len, TOM_TUNABLE(toep->tp_toedev, ddp_thres), - toep->tp_tp->rcv_wnd, (TOM_TUNABLE(toep->tp_toedev, ddp_copy_limit) + DDP_RSVD_WIN)); - - return toep->tp_ulp_mode == ULP_MODE_TCPDDP && (toep->tp_ddp_state.kbuf[0] == NULL) && - last_recv_len > TOM_TUNABLE(toep->tp_toedev, ddp_thres) && - toep->tp_tp->rcv_wnd > - (TOM_TUNABLE(toep->tp_toedev, ddp_copy_limit) + DDP_RSVD_WIN); -} - -static inline int -is_ddp(const struct mbuf *m) -{ - return ((m->m_flags & M_DDP) != 0); -} - -static inline int -is_ddp_psh(const struct mbuf *m) -{ - return ((is_ddp(m) && (m->m_pkthdr.csum_flags & DDP_BF_PSH)) != 0); -} - -static int -m_uiomove(const struct mbuf *m, int offset, int len, struct uio *uio) -{ - int curlen, startlen, resid_init, err = 0; - caddr_t buf; - - DPRINTF("m_uiomove(m=%p, offset=%d, len=%d, ...)\n", - m, offset, len); - - startlen = len; - resid_init = uio->uio_resid; - while (m && len) { - buf = mtod(m, caddr_t); - curlen = m->m_len; - if (offset && (offset < curlen)) { - curlen -= offset; - buf += offset; - offset = 0; - } else if (offset) { - offset -= curlen; - m = m->m_next; - continue; - } - err = uiomove(buf, min(len, curlen), uio); - if (err) { - printf("uiomove returned %d\n", err); - return (err); - } - - len -= min(len, curlen); - m = m->m_next; - } - DPRINTF("copied %d bytes - resid_init=%d uio_resid=%d\n", - startlen - len, resid_init, uio->uio_resid); - return (err); -} - -/* - * Copy data from an sk_buff to an iovec. Deals with RX_DATA, which carry the - * data in the sk_buff body, and with RX_DATA_DDP, which place the data in a - * DDP buffer. - */ -static inline int -copy_data(const struct mbuf *m, int offset, int len, struct uio *uio) -{ - struct iovec *to = uio->uio_iov; - int err; - - if (__predict_true(!is_ddp(m))) /* RX_DATA */ - return m_uiomove(m, offset, len, uio); - if (__predict_true(m->m_ddp_flags & DDP_BF_NOCOPY)) { /* user DDP */ - to->iov_len -= len; - to->iov_base = ((caddr_t)to->iov_base) + len; - uio->uio_iov = to; - uio->uio_resid -= len; - return (0); - } - err = t3_ddp_copy(m, offset, uio, len); /* kernel DDP */ - return (err); -} - -static void -cxgb_wait_dma_completion(struct toepcb *toep) -{ - struct rwlock *lock; - - lock = &toep->tp_tp->t_inpcb->inp_lock; - inp_wlock(toep->tp_tp->t_inpcb); - cv_wait_unlock(&toep->tp_cv, lock); -} - -static int -cxgb_vm_page_to_miov(struct toepcb *toep, struct uio *uio, struct mbuf **m) -{ - int i, seg_count, err, type; - struct mbuf *m0; - struct cxgb_dma_info cdi; - struct mbuf_vec *mv; - struct mbuf_iovec *mi; - bus_dma_segment_t *segs; - - err = bus_dmamap_load_uio(toep->tp_tx_dmat, toep->tp_dmamap, uio, - cxgb_dma_callback, &cdi, 0); - - if (err) - return (err); - seg_count = cdi.cdi_nsegs; - if ((m0 = mcl_alloc(seg_count, &type)) == NULL) { - bus_dmamap_unload(toep->tp_tx_dmat, toep->tp_dmamap); - return (ENOMEM); - } - segs = cdi.cdi_segs; - m0->m_type = type; - m0->m_flags = (M_EXT|M_NOFREE); - m0->m_ext.ext_type = EXT_EXTREF; - m0->m_ext.ext_free = cxgb_zero_copy_free; -#if __FreeBSD_version >= 800016 - m0->m_ext.ext_arg1 = NULL; /* XXX: probably wrong /phk */ - m0->m_ext.ext_arg2 = NULL; -#else - m0->m_ext.ext_args = NULL; -#endif - - mv = mtomv(m0); - mv->mv_count = seg_count; - mv->mv_first = 0; - for (i = 0, mi = mv->mv_vec; i < seg_count; mi++, segs++, i++) - mi_collapse_sge(mi, segs); - - *m = m0; - - /* - * This appears to be a no-op at the moment - * as busdma is all or nothing need to make - * sure the tag values are large enough - * - */ - if (cdi.cdi_mapped < uio->uio_resid) { - uio->uio_resid -= cdi.cdi_mapped; - } else - uio->uio_resid = 0; - - return (0); -} - -static int -t3_sosend(struct socket *so, struct uio *uio) -{ - int rv, count, hold_resid, sent, iovcnt; - struct iovec iovtmp[TMP_IOV_MAX], *iovtmpp, *iov; - struct tcpcb *tp = so_sototcpcb(so); - struct toepcb *toep = tp->t_toe; - struct mbuf *m; - struct uio uiotmp; - struct sockbuf *snd; - - /* - * Events requiring iteration: - * - number of pages exceeds max hold pages for process or system - * - number of pages exceeds maximum sg entries for a single WR - * - * We're limited to holding 128 pages at once - and we're limited to - * 34 SG entries per work request, but each SG entry can be any number - * of contiguous pages - * - */ - - uiotmp = *uio; - iovcnt = uio->uio_iovcnt; - iov = uio->uio_iov; - sent = 0; - snd = so_sockbuf_snd(so); -sendmore: - /* - * Make sure we don't exceed the socket buffer - */ - count = min(toep->tp_page_count, (sockbuf_sbspace(snd) >> PAGE_SHIFT) + 2*PAGE_SIZE); - rv = cxgb_hold_iovec_pages(&uiotmp, toep->tp_pages, &count, VM_PROT_READ); - hold_resid = uiotmp.uio_resid; - if (rv) - return (rv); - - /* - * Bump past sent and shave off the unheld amount - */ - if (hold_resid > 0) { - iovtmpp = iovtmp; - memcpy(iovtmp, iov, iovcnt*sizeof(*iov)); - if (sent) - iov_adj(&iovtmpp, &iovcnt, sent); - iov_adj(&iovtmpp, &iovcnt, -hold_resid); - uiotmp.uio_iov = iovtmpp; - uiotmp.uio_iovcnt = iovcnt; - - } - uiotmp.uio_resid = uio->uio_resid - hold_resid; - - /* - * Push off all held pages - * - */ - while (uiotmp.uio_resid > 0) { - rv = cxgb_vm_page_to_miov(toep, &uiotmp, &m); - if (rv) { - vm_page_unhold_pages(toep->tp_pages, count); - return (rv); - } - uio->uio_resid -= m->m_pkthdr.len; - sent += m->m_pkthdr.len; - sbappend(snd, m); - t3_push_frames(so, TRUE); - iov_adj(&uiotmp.uio_iov, &iovcnt, uiotmp.uio_resid); - } - - /* - * Wait for pending I/O to be DMA'd to the card - * - */ - cxgb_wait_dma_completion(toep); - vm_page_unhold_pages(toep->tp_pages, count); - /* - * If there is more data to send adjust local copy of iov - * to point to teh start - */ - if (hold_resid) { - iovtmpp = iovtmp; - memcpy(iovtmp, iov, iovcnt*sizeof(*iov)); - iov_adj(&iovtmpp, &iovcnt, sent); - uiotmp = *uio; - uiotmp.uio_iov = iovtmpp; - uiotmp.uio_iovcnt = iovcnt; - goto sendmore; - } - - return (0); -} - -static int -cxgb_sosend(struct socket *so, struct sockaddr *addr, struct uio *uio, - struct mbuf *top, struct mbuf *control, int flags, struct thread *td) -{ - struct tcpcb *tp = so_sototcpcb(so); - struct toedev *tdev; - int zcopy_thres, zcopy_enabled, rv; - - /* - * In order to use DMA direct from userspace the following - * conditions must be met: - * - the connection is currently offloaded - * - ddp is enabled - * - the number of bytes to be transferred exceeds the threshold - * - the number of bytes currently in flight won't exceed the in-flight - * threshold XXX TODO - * - vm_fault_quick_hold_pages succeeds - * - blocking socket XXX for now - * - */ - if (tp && tp->t_flags & TF_TOE) { - struct toepcb *toep = tp->t_toe; - - tdev = toep->tp_toedev; - zcopy_thres = TOM_TUNABLE(tdev, zcopy_sosend_partial_thres); - zcopy_enabled = TOM_TUNABLE(tdev, zcopy_sosend_enabled); - - if (uio && (uio->uio_resid > zcopy_thres) && - (uio->uio_iovcnt < TMP_IOV_MAX) && ((so_state_get(so) & SS_NBIO) == 0) - && zcopy_enabled) { - rv = t3_sosend(so, uio); - if (rv != EAGAIN) - return (rv); - } - } - return pru_sosend(so, addr, uio, top, control, flags, td); -} - -/* - * Following replacement or removal of the first mbuf on the first mbuf chain - * of a socket buffer, push necessary state changes back into the socket - * buffer so that other consumers see the values consistently. 'nextrecord' - * is the callers locally stored value of the original value of - * sb->sb_mb->m_nextpkt which must be restored when the lead mbuf changes. - * NOTE: 'nextrecord' may be NULL. - */ -static __inline void -sockbuf_pushsync(struct sockbuf *sb, struct mbuf *nextrecord) -{ - sockbuf_lock_assert(sb); - /* - * First, update for the new value of nextrecord. If necessary, make - * it the first record. - */ - if (sb->sb_mb != NULL) - sb->sb_mb->m_nextpkt = nextrecord; - else - sb->sb_mb = nextrecord; - - /* - * Now update any dependent socket buffer fields to reflect the new - * state. This is an expanded inline of SB_EMPTY_FIXUP(), with the - * addition of a second clause that takes care of the case where - * sb_mb has been updated, but remains the last record. - */ - if (sb->sb_mb == NULL) { - sb->sb_mbtail = NULL; - sb->sb_lastrecord = NULL; - } else if (sb->sb_mb->m_nextpkt == NULL) - sb->sb_lastrecord = sb->sb_mb; -} - -#define IS_NONBLOCKING(so) (so_state_get(so) & SS_NBIO) - -static int -t3_soreceive(struct socket *so, int *flagsp, struct uio *uio) -{ - struct tcpcb *tp = so_sototcpcb(so); - struct toepcb *toep = tp->t_toe; - struct mbuf *m; - uint32_t offset; - int err, flags, avail, len, copied, copied_unacked; - int target; /* Read at least this many bytes */ - int user_ddp_ok; - struct ddp_state *p; - struct inpcb *inp = so_sotoinpcb(so); - int socket_state, socket_error; - struct sockbuf *rcv; - - avail = offset = copied = copied_unacked = 0; - flags = flagsp ? (*flagsp &~ MSG_EOR) : 0; - rcv = so_sockbuf_rcv(so); - - err = sblock(rcv, SBLOCKWAIT(flags)); - p = &toep->tp_ddp_state; - - if (err) - return (err); - - rcv = so_sockbuf_rcv(so); - sockbuf_lock(rcv); - if ((tp->t_flags & TF_TOE) == 0) { - sockbuf_unlock(rcv); - err = EAGAIN; - goto done_unlocked; - } - - p->user_ddp_pending = 0; -restart: - if ((tp->t_flags & TF_TOE) == 0) { - sockbuf_unlock(rcv); - err = EAGAIN; - goto done_unlocked; - } - - len = uio->uio_resid; - m = rcv->sb_mb; - target = (flags & MSG_WAITALL) ? len : rcv->sb_lowat; - user_ddp_ok = p->ubuf_ddp_ready; - p->cancel_ubuf = 0; - - if (len == 0) - goto done; - if (m) - goto got_mbuf; - - /* empty receive queue */ - if (copied >= target && (rcv->sb_mb == NULL) && - !p->user_ddp_pending) - goto done; - - socket_state = so_state_get(so); - socket_error = so_error_get(so); - rcv = so_sockbuf_rcv(so); - - if (copied) { - if (socket_error || tp->t_state == TCPS_CLOSED || - (socket_state & (SS_ISDISCONNECTING|SS_ISDISCONNECTED))) - goto done; - } else { - if (socket_state & SS_NOFDREF) - goto done; - if (socket_error) { - err = socket_error; - socket_error = 0; - goto done; - } - if (rcv->sb_state & SBS_CANTRCVMORE) - goto done; - if (socket_state & (SS_ISDISCONNECTING|SS_ISDISCONNECTED)) - goto done; - if (tp->t_state == TCPS_CLOSED) { - err = ENOTCONN; - goto done; - } - } - if (rcv->sb_mb && !p->user_ddp_pending) { - sockbuf_unlock(rcv); - inp_wlock(inp); - t3_cleanup_rbuf(tp, copied_unacked); - inp_wunlock(inp); - sockbuf_lock(rcv); - copied_unacked = 0; - goto restart; - } - if (p->kbuf[0] && user_ddp_ok && !p->user_ddp_pending && - uio->uio_iov->iov_len > p->kbuf[0]->dgl_length && - p->ubuf_ddp_ready) { - p->user_ddp_pending = - !t3_overlay_ubuf(toep, rcv, uio, - IS_NONBLOCKING(so), flags, 1, 1); - if (p->user_ddp_pending) { - p->kbuf_posted++; - user_ddp_ok = 0; - } - } - if (p->kbuf[0] && (p->kbuf_posted == 0)) { - t3_post_kbuf(toep, 1, IS_NONBLOCKING(so)); - p->kbuf_posted++; - } - if (p->user_ddp_pending) { - /* One shot at DDP if we already have enough data */ - if (copied >= target) - user_ddp_ok = 0; - - if (rcv->sb_state & SBS_CANTRCVMORE) - goto done; - CTR0(KTR_TOM, "ddp pending -- waiting"); - if ((err = sbwait(rcv)) != 0) - goto done; -//for timers to work await_ddp_completion(sk, flags, &timeo); - } else if (copied >= target) - goto done; - else { - if (copied_unacked) { - int i = 0; - - sockbuf_unlock(rcv); - inp_wlock(inp); - t3_cleanup_rbuf(tp, copied_unacked); - inp_wunlock(inp); - copied_unacked = 0; - if (mp_ncpus > 1) - while (i++ < 200 && rcv->sb_mb == NULL) - cpu_spinwait(); - sockbuf_lock(rcv); - } - if (rcv->sb_mb) - goto restart; - - if (rcv->sb_state & SBS_CANTRCVMORE) - goto done; - - CTR0(KTR_TOM, "no buffers -- waiting"); - - if ((err = sbwait(rcv)) != 0) - goto done; - } - goto restart; -got_mbuf: - /* - * Adjust the mbuf seqno if it has already been partially processed by - * soreceive_generic - */ - if (m->m_pkthdr.len != m->m_len) { - m->m_seq += m->m_pkthdr.len - m->m_len; - m->m_pkthdr.len = m->m_len; - } - - CTR6(KTR_TOM, "t3_soreceive: ddp_flags=0x%x m_len=%u resid=%u " - "m_seq=0x%08x c_seq=0x%08x c_unack=%u", - (is_ddp(m) ? m->m_ddp_flags : 0), m->m_pkthdr.len, len, - m->m_seq, toep->tp_copied_seq, copied_unacked); - KASSERT(((m->m_flags & M_EXT) && (m->m_ext.ext_type == EXT_EXTREF)) || !(m->m_flags & M_EXT), - ("unexpected type M_EXT=%d ext_type=%d m_len=%d m_pktlen=%d\n", !!(m->m_flags & M_EXT), - m->m_ext.ext_type, m->m_len, m->m_pkthdr.len)); - KASSERT(m->m_next != (struct mbuf *)0xffffffff, ("bad next value m_next=%p m_nextpkt=%p" - " m_flags=0x%x m->m_len=%d", m->m_next, m->m_nextpkt, m->m_flags, m->m_len)); - if (m->m_pkthdr.len == 0) { - if ((m->m_ddp_flags & DDP_BF_NOCOPY) == 0) - panic("empty mbuf and NOCOPY not set\n"); - CTR0(KTR_TOM, "ddp done notification"); - p->user_ddp_pending = 0; - sbdroprecord_locked(rcv); - goto done; - } - - KASSERT((int32_t)(toep->tp_copied_seq + copied_unacked - m->m_seq) >= 0, - ("offset will go negative: offset=%d copied_seq=0x%08x copied_unacked=%d m_seq=0x%08x", - offset, toep->tp_copied_seq, copied_unacked, m->m_seq)); - offset = toep->tp_copied_seq + copied_unacked - m->m_seq; - - if (offset >= m->m_pkthdr.len) - panic("t3_soreceive: OFFSET >= LEN offset %d copied_seq 0x%x " - "seq 0x%x pktlen %d ddp flags 0x%x", offset, - toep->tp_copied_seq + copied_unacked, m->m_seq, - m->m_pkthdr.len, m->m_ddp_flags); - - avail = m->m_pkthdr.len - offset; - if (len < avail) { - if (is_ddp(m) && (m->m_ddp_flags & DDP_BF_NOCOPY)) - panic("bad state in t3_soreceive len=%d avail=%d offset=%d\n", len, avail, offset); - avail = len; - rcv->sb_flags |= SB_IN_TOE; - } else if (p->kbuf_posted == 0 && p->user_ddp_pending == 0) - rcv->sb_flags &= ~SB_IN_TOE; - -#ifdef URGENT_DATA_SUPPORTED - /* - * Check if the data we are preparing to copy contains urgent - * data. Either stop short of urgent data or skip it if it's - * first and we are not delivering urgent data inline. - */ - if (__predict_false(toep->tp_urg_data)) { - uint32_t urg_offset = tp->rcv_up - tp->copied_seq + copied_unacked; - - if (urg_offset < avail) { - if (urg_offset) { - /* stop short of the urgent data */ - avail = urg_offset; - } else if ((so_options_get(so) & SO_OOBINLINE) == 0) { - /* First byte is urgent, skip */ - toep->tp_copied_seq++; - offset++; - avail--; - if (!avail) - goto skip_copy; - } - } - } -#endif - if (is_ddp_psh(m) || offset || (rcv->sb_mb && !is_ddp(m))) { - user_ddp_ok = 0; -#ifdef T3_TRACE - T3_TRACE0(TIDTB(so), "t3_sosend: PSH"); -#endif - } - - if (user_ddp_ok && !p->user_ddp_pending && - uio->uio_iov->iov_len > p->kbuf[0]->dgl_length && - p->ubuf_ddp_ready) { - p->user_ddp_pending = - !t3_overlay_ubuf(toep, rcv, uio, - IS_NONBLOCKING(so), flags, 1, 1); - if (p->user_ddp_pending) { - p->kbuf_posted++; - user_ddp_ok = 0; - } - DPRINTF("user_ddp_pending=%d\n", p->user_ddp_pending); - } else - DPRINTF("user_ddp_ok=%d user_ddp_pending=%d iov_len=%ld dgl_length=%d ubuf_ddp_ready=%d ulp_mode=%d is_ddp(m)=%d flags=0x%x ubuf=%p kbuf_posted=%d\n", - user_ddp_ok, p->user_ddp_pending, uio->uio_iov->iov_len, p->kbuf[0] ? p->kbuf[0]->dgl_length : 0, - p->ubuf_ddp_ready, toep->tp_ulp_mode, !!is_ddp(m), m->m_ddp_flags, p->ubuf, p->kbuf_posted); - - /* - * If MSG_TRUNC is specified the data is discarded. - * XXX need to check pr_atomic - */ - KASSERT(avail > 0, ("avail=%d resid=%d offset=%d", avail, uio->uio_resid, offset)); - if (__predict_true(!(flags & MSG_TRUNC))) { - int resid = uio->uio_resid; - - sockbuf_unlock(rcv); - if ((err = copy_data(m, offset, avail, uio))) { - if (err) - err = EFAULT; - goto done_unlocked; - } - - sockbuf_lock(rcv); - if (avail != (resid - uio->uio_resid)) - printf("didn't copy all bytes :-/ avail=%d offset=%d pktlen=%d resid=%d uio_resid=%d copied=%d copied_unacked=%d is_ddp(m)=%d\n", - avail, offset, m->m_pkthdr.len, resid, uio->uio_resid, copied, copied_unacked, is_ddp(m)); - - if ((tp->t_flags & TF_TOE) == 0) { - sockbuf_unlock(rcv); - err = EAGAIN; - goto done_unlocked; - } - } - - copied += avail; - copied_unacked += avail; - len -= avail; - -#ifdef URGENT_DATA_SUPPORTED -skip_copy: - if (tp->urg_data && after(tp->copied_seq + copied_unacked, tp->urg_seq)) - tp->urg_data = 0; -#endif - /* - * If the buffer is fully consumed free it. If it's a DDP - * buffer also handle any events it indicates. - */ - if (avail + offset >= m->m_pkthdr.len) { - unsigned int fl = m->m_ddp_flags; - int exitnow, got_psh = 0, nomoredata = 0; - int count; - struct mbuf *nextrecord; - - if (p->kbuf[0] != NULL && is_ddp(m) && (fl & 1)) { - if (is_ddp_psh(m) && p->user_ddp_pending) - got_psh = 1; - - if (fl & DDP_BF_NOCOPY) - p->user_ddp_pending = 0; - else if ((fl & DDP_BF_NODATA) && IS_NONBLOCKING(so)) { - p->kbuf_posted--; - nomoredata = 1; - } else { - p->kbuf_posted--; - p->ubuf_ddp_ready = 1; - } - } - - nextrecord = m->m_nextpkt; - count = m->m_pkthdr.len; - while (count > 0) { - count -= m->m_len; - KASSERT(((m->m_flags & M_EXT) && (m->m_ext.ext_type == EXT_EXTREF)) || !(m->m_flags & M_EXT), ("unexpected type M_EXT=%d ext_type=%d m_len=%d\n", !!(m->m_flags & M_EXT), m->m_ext.ext_type, m->m_len)); - CTR2(KTR_TOM, "freeing mbuf m_len = %d pktlen = %d", m->m_len, m->m_pkthdr.len); - sbfree(rcv, m); - rcv->sb_mb = m_free(m); - m = rcv->sb_mb; - } - sockbuf_pushsync(rcv, nextrecord); -#if 0 - sbdrop_locked(rcv, m->m_pkthdr.len); -#endif - exitnow = got_psh || nomoredata; - if (copied >= target && (rcv->sb_mb == NULL) && exitnow) - goto done; - if (copied_unacked > (rcv->sb_hiwat >> 2)) { - sockbuf_unlock(rcv); - inp_wlock(inp); - t3_cleanup_rbuf(tp, copied_unacked); - inp_wunlock(inp); - copied_unacked = 0; - sockbuf_lock(rcv); - } - } - if (len > 0) - goto restart; - - done: - if ((tp->t_flags & TF_TOE) == 0) { - sockbuf_unlock(rcv); - err = EAGAIN; - goto done_unlocked; - } - /* - * If we can still receive decide what to do in preparation for the - * next receive. Note that RCV_SHUTDOWN is set if the connection - * transitioned to CLOSE but not if it was in that state to begin with. - */ - if (__predict_true((so_state_get(so) & (SS_ISDISCONNECTING|SS_ISDISCONNECTED)) == 0)) { - if (p->user_ddp_pending) { - user_ddp_ok = 0; - t3_cancel_ubuf(toep, rcv); - if (rcv->sb_mb) { - if (copied < 0) - copied = 0; - if (len > 0) - goto restart; - } - p->user_ddp_pending = 0; - } - if ((p->kbuf[0] != NULL) && (p->kbuf_posted == 0)) { -#ifdef T3_TRACE - T3_TRACE0(TIDTB(so), - "chelsio_recvmsg: about to exit, repost kbuf"); -#endif - - t3_post_kbuf(toep, 1, IS_NONBLOCKING(so)); - p->kbuf_posted++; - } else if (so_should_ddp(toep, copied) && uio->uio_iovcnt == 1) { - CTR1(KTR_TOM ,"entering ddp on tid=%u", toep->tp_tid); - if (!t3_enter_ddp(toep, TOM_TUNABLE(toep->tp_toedev, - ddp_copy_limit), 0, IS_NONBLOCKING(so))) { - rcv->sb_flags |= SB_IN_TOE; - p->kbuf_posted = 1; - } - - } - } -#ifdef T3_TRACE - T3_TRACE5(TIDTB(so), - "chelsio_recvmsg <-: copied %d len %d buffers_freed %d " - "kbuf_posted %d user_ddp_pending %u", - copied, len, buffers_freed, p ? p->kbuf_posted : -1, - p->user_ddp_pending); -#endif - sockbuf_unlock(rcv); -done_unlocked: - if (copied_unacked && (tp->t_flags & TF_TOE)) { - inp_wlock(inp); - t3_cleanup_rbuf(tp, copied_unacked); - inp_wunlock(inp); - } - sbunlock(rcv); - - return (err); -} - -static int -cxgb_soreceive(struct socket *so, struct sockaddr **psa, struct uio *uio, - struct mbuf **mp0, struct mbuf **controlp, int *flagsp) -{ - struct toedev *tdev; - int rv, zcopy_thres, zcopy_enabled, flags; - struct tcpcb *tp = so_sototcpcb(so); - struct sockbuf *rcv = so_sockbuf_rcv(so); - - flags = flagsp ? *flagsp &~ MSG_EOR : 0; - - /* - * In order to use DMA direct from userspace the following - * conditions must be met: - * - the connection is currently offloaded - * - ddp is enabled - * - the number of bytes to be transferred exceeds the threshold - * - the number of bytes currently in flight won't exceed the in-flight - * threshold XXX TODO - * - vm_fault_quick_hold_pages succeeds - * - blocking socket XXX for now - * - iovcnt is 1 - * - */ - if (tp && (tp->t_flags & TF_TOE) && uio && ((flags & (MSG_OOB|MSG_PEEK|MSG_DONTWAIT)) == 0) - && (uio->uio_iovcnt == 1) && (mp0 == NULL) && - ((rcv->sb_flags & SB_IN_TOE) || (uio->uio_iovcnt == 1))) { - struct toepcb *toep = tp->t_toe; - - tdev = toep->tp_toedev; - zcopy_thres = TOM_TUNABLE(tdev, ddp_thres); - zcopy_enabled = TOM_TUNABLE(tdev, ddp); - if ((rcv->sb_flags & SB_IN_TOE) ||((uio->uio_resid > zcopy_thres) && - (uio->uio_iovcnt == 1) && zcopy_enabled)) { - CTR4(KTR_TOM, "cxgb_soreceive: sb_flags=0x%x t_flags=0x%x flags=0x%x uio_resid=%d", - rcv->sb_flags, tp->t_flags, flags, uio->uio_resid); - rv = t3_soreceive(so, flagsp, uio); - if (rv != EAGAIN) - return (rv); - else - printf("returned EAGAIN\n"); - } - } else if (tp && (tp->t_flags & TF_TOE) && uio && mp0 == NULL) { - struct sockbuf *rcv = so_sockbuf_rcv(so); - - log(LOG_INFO, "skipping t3_soreceive flags=0x%x iovcnt=%d sb_state=0x%x\n", - flags, uio->uio_iovcnt, rcv->sb_state); - } - - return pru_soreceive(so, psa, uio, mp0, controlp, flagsp); -} - -struct protosw cxgb_protosw; -struct pr_usrreqs cxgb_tcp_usrreqs; - -void -t3_install_socket_ops(struct socket *so) -{ - static int copied = 0; - struct pr_usrreqs *pru; - struct protosw *psw; - - if (copied == 0) { - psw = so_protosw_get(so); - pru = psw->pr_usrreqs; - - bcopy(psw, &cxgb_protosw, sizeof(*psw)); - bcopy(pru, &cxgb_tcp_usrreqs, sizeof(*pru)); - - cxgb_protosw.pr_ctloutput = t3_ctloutput; - cxgb_protosw.pr_usrreqs = &cxgb_tcp_usrreqs; - cxgb_tcp_usrreqs.pru_sosend = cxgb_sosend; - cxgb_tcp_usrreqs.pru_soreceive = cxgb_soreceive; - } - so_protosw_set(so, &cxgb_protosw); - -#if 0 - so->so_proto->pr_usrreqs->pru_sosend = cxgb_sosend; - so->so_proto->pr_usrreqs->pru_soreceive = cxgb_soreceive; -#endif -} diff --git a/sys/dev/cxgb/ulp/tom/cxgb_ddp.c b/sys/dev/cxgb/ulp/tom/cxgb_ddp.c deleted file mode 100644 index fe3b0756f51..00000000000 --- a/sys/dev/cxgb/ulp/tom/cxgb_ddp.c +++ /dev/null @@ -1,738 +0,0 @@ -/************************************************************************** - -Copyright (c) 2007-2008, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -***************************************************************************/ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -#include -#include -#include -#include - - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - - -#define MAX_SCHEDULE_TIMEOUT 300 - -/* - * Return the # of page pods needed to accommodate a # of pages. - */ -static inline unsigned int -pages2ppods(unsigned int pages) -{ - return (pages + PPOD_PAGES - 1) / PPOD_PAGES + NUM_SENTINEL_PPODS; -} - -/** - * t3_pin_pages - pin a user memory range and prepare it for DDP - * @addr - the starting address - * @len - the length of the range - * @newgl - contains the pages and physical addresses of the pinned range - * @gl - an existing gather list, may be %NULL - * - * Pins the pages in the user-space memory range [addr, addr + len) and - * maps them for DMA. Returns a gather list with the pinned pages and - * their physical addresses. If @gl is non NULL the pages it describes - * are compared against the pages for [addr, addr + len), and if the - * existing gather list already covers the range a new list is not - * allocated. Returns 0 on success, or a negative errno. On success if - * a new gather list was allocated it is returned in @newgl. - */ -static int -t3_pin_pages(bus_dma_tag_t tag, bus_dmamap_t dmamap, vm_offset_t addr, - size_t len, struct ddp_gather_list **newgl, - const struct ddp_gather_list *gl) -{ - int i = 0, err; - size_t pg_off; - unsigned int npages; - struct ddp_gather_list *p; - vm_map_t map; - - pg_off = addr & PAGE_MASK; - npages = (pg_off + len + PAGE_SIZE - 1) >> PAGE_SHIFT; - p = malloc(sizeof(struct ddp_gather_list) + npages * sizeof(vm_page_t *), - M_DEVBUF, M_NOWAIT|M_ZERO); - if (p == NULL) - return (ENOMEM); - - map = &curthread->td_proc->p_vmspace->vm_map; - if (vm_fault_quick_hold_pages(map, addr, len, VM_PROT_READ | - VM_PROT_WRITE, p->dgl_pages, npages) < 0) { - err = EFAULT; - goto free_gl; - } - - if (gl && gl->dgl_offset == pg_off && gl->dgl_nelem >= npages && - gl->dgl_length >= len) { - for (i = 0; i < npages; i++) - if (p->dgl_pages[i] != gl->dgl_pages[i]) - goto different_gl; - err = 0; - goto unpin; - } - -different_gl: - p->dgl_length = len; - p->dgl_offset = pg_off; - p->dgl_nelem = npages; -#ifdef NEED_BUSDMA - p->phys_addr[0] = pci_map_page(pdev, p->pages[0], pg_off, - PAGE_SIZE - pg_off, - PCI_DMA_FROMDEVICE) - pg_off; - for (i = 1; i < npages; ++i) - p->phys_addr[i] = pci_map_page(pdev, p->pages[i], 0, PAGE_SIZE, - PCI_DMA_FROMDEVICE); -#endif - *newgl = p; - return (0); -unpin: - vm_page_unhold_pages(p->dgl_pages, npages); - -free_gl: - - free(p, M_DEVBUF); - *newgl = NULL; - return (err); -} - -static void -unmap_ddp_gl(const struct ddp_gather_list *gl) -{ -#ifdef NEED_BUSDMA - int i; - - if (!gl->nelem) - return; - - pci_unmap_page(pdev, gl->phys_addr[0] + gl->offset, - PAGE_SIZE - gl->offset, PCI_DMA_FROMDEVICE); - for (i = 1; i < gl->nelem; ++i) - pci_unmap_page(pdev, gl->phys_addr[i], PAGE_SIZE, - PCI_DMA_FROMDEVICE); - -#endif -} - -static void -ddp_gl_free_pages(struct ddp_gather_list *gl, int dirty) -{ - /* - * XXX mark pages as dirty before unholding - */ - vm_page_unhold_pages(gl->dgl_pages, gl->dgl_nelem); -} - -void -t3_free_ddp_gl(struct ddp_gather_list *gl) -{ - unmap_ddp_gl(gl); - ddp_gl_free_pages(gl, 0); - free(gl, M_DEVBUF); -} - -/* Max # of page pods for a buffer, enough for 1MB buffer at 4KB page size */ -#define MAX_PPODS 64U - -/* - * Allocate page pods for DDP buffer 1 (the user buffer) and set up the tag in - * the TCB. We allocate page pods in multiples of PPOD_CLUSTER_SIZE. First we - * try to allocate enough page pods to accommodate the whole buffer, subject to - * the MAX_PPODS limit. If that fails we try to allocate PPOD_CLUSTER_SIZE page - * pods before failing entirely. - */ -static int -alloc_buf1_ppods(struct toepcb *toep, struct ddp_state *p, - unsigned long addr, unsigned int len) -{ - int err, tag, npages, nppods; - struct tom_data *d = TOM_DATA(toep->tp_toedev); - -#if 0 - SOCKBUF_LOCK_ASSERT(&so->so_rcv); -#endif - npages = ((addr & PAGE_MASK) + len + PAGE_SIZE - 1) >> PAGE_SHIFT; - nppods = min(pages2ppods(npages), MAX_PPODS); - nppods = roundup2(nppods, PPOD_CLUSTER_SIZE); - err = t3_alloc_ppods(d, nppods, &tag); - if (err && nppods > PPOD_CLUSTER_SIZE) { - nppods = PPOD_CLUSTER_SIZE; - err = t3_alloc_ppods(d, nppods, &tag); - } - if (err) - return (ENOMEM); - - p->ubuf_nppods = nppods; - p->ubuf_tag = tag; -#if NUM_DDP_KBUF == 1 - t3_set_ddp_tag(toep, 1, tag << 6); -#endif - return (0); -} - -/* - * Starting offset for the user DDP buffer. A non-0 value ensures a DDP flush - * won't block indefinitely if there's nothing to place (which should be rare). - */ -#define UBUF_OFFSET 1 - -static __inline unsigned long -select_ddp_flags(const struct toepcb *toep, int buf_idx, - int nonblock, int rcv_flags) -{ - if (buf_idx == 1) { - if (__predict_false(rcv_flags & MSG_WAITALL)) - return V_TF_DDP_PSH_NO_INVALIDATE0(1) | - V_TF_DDP_PSH_NO_INVALIDATE1(1) | - V_TF_DDP_PUSH_DISABLE_1(1); - if (nonblock) - return V_TF_DDP_BUF1_FLUSH(1); - - return V_TF_DDP_BUF1_FLUSH(!TOM_TUNABLE(toep->tp_toedev, - ddp_push_wait)); - } - - if (__predict_false(rcv_flags & MSG_WAITALL)) - return V_TF_DDP_PSH_NO_INVALIDATE0(1) | - V_TF_DDP_PSH_NO_INVALIDATE1(1) | - V_TF_DDP_PUSH_DISABLE_0(1); - if (nonblock) - return V_TF_DDP_BUF0_FLUSH(1); - - return V_TF_DDP_BUF0_FLUSH(!TOM_TUNABLE(toep->tp_toedev, ddp_push_wait)); -} - -/* - * Reposts the kernel DDP buffer after it has been previously become full and - * invalidated. We just need to reset the offset and adjust the DDP flags. - * Conveniently, we can set the flags and the offset with a single message. - * Note that this function does not set the buffer length. Again conveniently - * our kernel buffer is of fixed size. If the length needs to be changed it - * needs to be done separately. - */ -static void -t3_repost_kbuf(struct toepcb *toep, unsigned int bufidx, int modulate, - int activate, int nonblock) -{ - struct ddp_state *p = &toep->tp_ddp_state; - unsigned long flags; - -#if 0 - SOCKBUF_LOCK_ASSERT(&so->so_rcv); -#endif - p->buf_state[bufidx].cur_offset = p->kbuf[bufidx]->dgl_offset; - p->buf_state[bufidx].flags = p->kbuf_noinval ? DDP_BF_NOINVAL : 0; - p->buf_state[bufidx].gl = p->kbuf[bufidx]; - p->cur_buf = bufidx; - p->kbuf_idx = bufidx; - - flags = select_ddp_flags(toep, bufidx, nonblock, 0); - if (!bufidx) - t3_setup_ddpbufs(toep, 0, 0, 0, 0, flags | - V_TF_DDP_PSH_NO_INVALIDATE0(p->kbuf_noinval) | - V_TF_DDP_PSH_NO_INVALIDATE1(p->kbuf_noinval) | - V_TF_DDP_BUF0_VALID(1), - V_TF_DDP_BUF0_FLUSH(1) | - V_TF_DDP_PSH_NO_INVALIDATE0(1) | - V_TF_DDP_PSH_NO_INVALIDATE1(1) | V_TF_DDP_OFF(1) | - V_TF_DDP_BUF0_VALID(1) | - V_TF_DDP_ACTIVE_BUF(activate), modulate); - else - t3_setup_ddpbufs(toep, 0, 0, 0, 0, flags | - V_TF_DDP_PSH_NO_INVALIDATE0(p->kbuf_noinval) | - V_TF_DDP_PSH_NO_INVALIDATE1(p->kbuf_noinval) | - V_TF_DDP_BUF1_VALID(1) | - V_TF_DDP_ACTIVE_BUF(activate), - V_TF_DDP_BUF1_FLUSH(1) | - V_TF_DDP_PSH_NO_INVALIDATE0(1) | - V_TF_DDP_PSH_NO_INVALIDATE1(1) | V_TF_DDP_OFF(1) | - V_TF_DDP_BUF1_VALID(1) | V_TF_DDP_ACTIVE_BUF(1), - modulate); - -} - -/** - * setup_uio_ppods - setup HW page pods for a user iovec - * @sk: the associated socket - * @uio: the uio - * @oft: additional bytes to map before the start of the buffer - * - * Pins a user iovec and sets up HW page pods for DDP into it. We allocate - * page pods for user buffers on the first call per socket. Afterwards we - * limit the buffer length to whatever the existing page pods can accommodate. - * Returns a negative error code or the length of the mapped buffer. - * - * The current implementation handles iovecs with only one entry. - */ -static int -setup_uio_ppods(struct toepcb *toep, const struct uio *uio, int oft, int *length) -{ - int err; - unsigned int len; - struct ddp_gather_list *gl = NULL; - struct ddp_state *p = &toep->tp_ddp_state; - struct iovec *iov = uio->uio_iov; - vm_offset_t addr = (vm_offset_t)iov->iov_base - oft; - -#ifdef notyet - SOCKBUF_LOCK_ASSERT(&so->so_rcv); -#endif - if (__predict_false(p->ubuf_nppods == 0)) { - err = alloc_buf1_ppods(toep, p, addr, iov->iov_len + oft); - if (err) - return (err); - } - - len = (p->ubuf_nppods - NUM_SENTINEL_PPODS) * PPOD_PAGES * PAGE_SIZE; - len -= addr & PAGE_MASK; - if (len > M_TCB_RX_DDP_BUF0_LEN) - len = M_TCB_RX_DDP_BUF0_LEN; - len = min(len, toep->tp_tp->rcv_wnd - 32768); - len = min(len, iov->iov_len + oft); - - if (len <= p->kbuf[0]->dgl_length) { - printf("length too short\n"); - return (EINVAL); - } - - err = t3_pin_pages(toep->tp_rx_dmat, toep->tp_dmamap, addr, len, &gl, p->ubuf); - if (err) - return (err); - if (gl) { - if (p->ubuf) - t3_free_ddp_gl(p->ubuf); - p->ubuf = gl; - t3_setup_ppods(toep, gl, pages2ppods(gl->dgl_nelem), p->ubuf_tag, len, - gl->dgl_offset, 0); - } - *length = len; - return (0); -} - -/* - * - */ -void -t3_cancel_ubuf(struct toepcb *toep, struct sockbuf *rcv) -{ - struct ddp_state *p = &toep->tp_ddp_state; - int ubuf_pending = t3_ddp_ubuf_pending(toep); - int err = 0, count = 0; - - if (p->ubuf == NULL) - return; - - sockbuf_lock_assert(rcv); - - p->cancel_ubuf = 1; - while (ubuf_pending && !(rcv->sb_state & SBS_CANTRCVMORE)) { - CTR3(KTR_TOM, - "t3_cancel_ubuf: flags0 0x%x flags1 0x%x get_tcb_count %d", - p->buf_state[0].flags & (DDP_BF_NOFLIP | DDP_BF_NOCOPY), - p->buf_state[1].flags & (DDP_BF_NOFLIP | DDP_BF_NOCOPY), - p->get_tcb_count); - if (p->get_tcb_count == 0) - t3_cancel_ddpbuf(toep, p->cur_buf); - else - CTR5(KTR_TOM, "waiting err=%d get_tcb_count=%d timeo=%d rcv=%p SBS_CANTRCVMORE=%d", - err, p->get_tcb_count, rcv->sb_timeo, rcv, - !!(rcv->sb_state & SBS_CANTRCVMORE)); - - while (p->get_tcb_count && !(rcv->sb_state & SBS_CANTRCVMORE)) { - if (count & 0xfffffff) - CTR5(KTR_TOM, "waiting err=%d get_tcb_count=%d timeo=%d rcv=%p count=%d", - err, p->get_tcb_count, rcv->sb_timeo, rcv, count); - count++; - err = sbwait(rcv); - } - ubuf_pending = t3_ddp_ubuf_pending(toep); - } - p->cancel_ubuf = 0; - p->user_ddp_pending = 0; - -} - -#define OVERLAY_MASK (V_TF_DDP_PSH_NO_INVALIDATE0(1) | \ - V_TF_DDP_PSH_NO_INVALIDATE1(1) | \ - V_TF_DDP_BUF1_FLUSH(1) | \ - V_TF_DDP_BUF0_FLUSH(1) | \ - V_TF_DDP_PUSH_DISABLE_1(1) | \ - V_TF_DDP_PUSH_DISABLE_0(1) | \ - V_TF_DDP_INDICATE_OUT(1)) - -/* - * Post a user buffer as an overlay on top of the current kernel buffer. - */ -int -t3_overlay_ubuf(struct toepcb *toep, struct sockbuf *rcv, - const struct uio *uio, int nonblock, int rcv_flags, - int modulate, int post_kbuf) -{ - int err, len, ubuf_idx; - unsigned long flags; - struct ddp_state *p = &toep->tp_ddp_state; - - if (p->kbuf[0] == NULL) { - return (EINVAL); - } - sockbuf_unlock(rcv); - err = setup_uio_ppods(toep, uio, 0, &len); - sockbuf_lock(rcv); - if (err) - return (err); - - if ((rcv->sb_state & SBS_CANTRCVMORE) || - (toep->tp_tp->t_flags & TF_TOE) == 0) - return (EINVAL); - - ubuf_idx = p->kbuf_idx; - p->buf_state[ubuf_idx].flags = DDP_BF_NOFLIP; - /* Use existing offset */ - /* Don't need to update .gl, user buffer isn't copied. */ - p->cur_buf = ubuf_idx; - - flags = select_ddp_flags(toep, ubuf_idx, nonblock, rcv_flags); - - if (post_kbuf) { - struct ddp_buf_state *dbs = &p->buf_state[ubuf_idx ^ 1]; - - dbs->cur_offset = 0; - dbs->flags = 0; - dbs->gl = p->kbuf[ubuf_idx ^ 1]; - p->kbuf_idx ^= 1; - flags |= p->kbuf_idx ? - V_TF_DDP_BUF1_VALID(1) | V_TF_DDP_PUSH_DISABLE_1(0) : - V_TF_DDP_BUF0_VALID(1) | V_TF_DDP_PUSH_DISABLE_0(0); - } - - if (ubuf_idx == 0) { - t3_overlay_ddpbuf(toep, 0, p->ubuf_tag << 6, p->kbuf_tag[1] << 6, - len); - t3_setup_ddpbufs(toep, 0, 0, p->kbuf[1]->dgl_length, 0, - flags, - OVERLAY_MASK | flags, 1); - } else { - t3_overlay_ddpbuf(toep, 1, p->kbuf_tag[0] << 6, p->ubuf_tag << 6, - len); - t3_setup_ddpbufs(toep, p->kbuf[0]->dgl_length, 0, 0, 0, - flags, - OVERLAY_MASK | flags, 1); - } -#ifdef T3_TRACE - T3_TRACE5(TIDTB(so), - "t3_overlay_ubuf: tag %u flags 0x%x mask 0x%x ubuf_idx %d " - " kbuf_idx %d", - p->ubuf_tag, flags, OVERLAY_MASK, ubuf_idx, p->kbuf_idx); -#endif - CTR3(KTR_TOM, - "t3_overlay_ubuf: tag %u flags 0x%x mask 0x%x", - p->ubuf_tag, flags, OVERLAY_MASK); - CTR3(KTR_TOM, - "t3_overlay_ubuf: ubuf_idx %d kbuf_idx %d post_kbuf %d", - ubuf_idx, p->kbuf_idx, post_kbuf); - - return (0); -} - -/* - * Clean up DDP state that needs to survive until socket close time, such as the - * DDP buffers. The buffers are already unmapped at this point as unmapping - * needs the PCI device and a socket may close long after the device is removed. - */ -void -t3_cleanup_ddp(struct toepcb *toep) -{ - struct ddp_state *p = &toep->tp_ddp_state; - int idx; - - for (idx = 0; idx < NUM_DDP_KBUF; idx++) - if (p->kbuf[idx]) { - ddp_gl_free_pages(p->kbuf[idx], 0); - free(p->kbuf[idx], M_DEVBUF); - } - if (p->ubuf) { - ddp_gl_free_pages(p->ubuf, 0); - free(p->ubuf, M_DEVBUF); - p->ubuf = NULL; - } - toep->tp_ulp_mode = 0; -} - -/* - * This is a companion to t3_cleanup_ddp() and releases the HW resources - * associated with a connection's DDP state, such as the page pods. - * It's called when HW is done with a connection. The rest of the state - * remains available until both HW and the app are done with the connection. - */ -void -t3_release_ddp_resources(struct toepcb *toep) -{ - struct ddp_state *p = &toep->tp_ddp_state; - struct tom_data *d = TOM_DATA(toep->tp_toedev); - int idx; - - for (idx = 0; idx < NUM_DDP_KBUF; idx++) { - t3_free_ppods(d, p->kbuf_tag[idx], - p->kbuf_nppods[idx]); - unmap_ddp_gl(p->kbuf[idx]); - } - - if (p->ubuf_nppods) { - t3_free_ppods(d, p->ubuf_tag, p->ubuf_nppods); - p->ubuf_nppods = 0; - } - if (p->ubuf) - unmap_ddp_gl(p->ubuf); - -} - -void -t3_post_kbuf(struct toepcb *toep, int modulate, int nonblock) -{ - struct ddp_state *p = &toep->tp_ddp_state; - - t3_set_ddp_tag(toep, p->cur_buf, p->kbuf_tag[p->cur_buf] << 6); - t3_set_ddp_buf(toep, p->cur_buf, 0, p->kbuf[p->cur_buf]->dgl_length); - t3_repost_kbuf(toep, p->cur_buf, modulate, 1, nonblock); -#ifdef T3_TRACE - T3_TRACE1(TIDTB(so), - "t3_post_kbuf: cur_buf = kbuf_idx = %u ", p->cur_buf); -#endif - CTR1(KTR_TOM, - "t3_post_kbuf: cur_buf = kbuf_idx = %u ", p->cur_buf); -} - -/* - * Prepare a socket for DDP. Must be called when the socket is known to be - * open. - */ -int -t3_enter_ddp(struct toepcb *toep, unsigned int kbuf_size, unsigned int waitall, int nonblock) -{ - int i, err = ENOMEM; - static vm_pindex_t color; - unsigned int nppods, kbuf_pages, idx = 0; - struct ddp_state *p = &toep->tp_ddp_state; - struct tom_data *d = TOM_DATA(toep->tp_toedev); - - - if (kbuf_size > M_TCB_RX_DDP_BUF0_LEN) - return (EINVAL); - -#ifdef notyet - SOCKBUF_LOCK_ASSERT(&so->so_rcv); -#endif - kbuf_pages = (kbuf_size + PAGE_SIZE - 1) >> PAGE_SHIFT; - nppods = pages2ppods(kbuf_pages); - - p->kbuf_noinval = !!waitall; - p->kbuf_tag[NUM_DDP_KBUF - 1] = -1; - for (idx = 0; idx < NUM_DDP_KBUF; idx++) { - p->kbuf[idx] = - malloc(sizeof (struct ddp_gather_list) + kbuf_pages * - sizeof(vm_page_t *), M_DEVBUF, M_NOWAIT|M_ZERO); - if (p->kbuf[idx] == NULL) - goto err; - err = t3_alloc_ppods(d, nppods, &p->kbuf_tag[idx]); - if (err) { - printf("t3_alloc_ppods failed err=%d\n", err); - goto err; - } - - p->kbuf_nppods[idx] = nppods; - p->kbuf[idx]->dgl_length = kbuf_size; - p->kbuf[idx]->dgl_offset = 0; - p->kbuf[idx]->dgl_nelem = kbuf_pages; - - for (i = 0; i < kbuf_pages; ++i) { - p->kbuf[idx]->dgl_pages[i] = vm_page_alloc(NULL, color, - VM_ALLOC_NOOBJ | VM_ALLOC_NORMAL | VM_ALLOC_WIRED | - VM_ALLOC_ZERO); - if (p->kbuf[idx]->dgl_pages[i] == NULL) { - p->kbuf[idx]->dgl_nelem = i; - printf("failed to allocate kbuf pages\n"); - goto err; - } - } -#ifdef NEED_BUSDMA - /* - * XXX we'll need this for VT-d or any platform with an iommu :-/ - * - */ - for (i = 0; i < kbuf_pages; ++i) - p->kbuf[idx]->phys_addr[i] = - pci_map_page(p->pdev, p->kbuf[idx]->pages[i], - 0, PAGE_SIZE, PCI_DMA_FROMDEVICE); -#endif - t3_setup_ppods(toep, p->kbuf[idx], nppods, p->kbuf_tag[idx], - p->kbuf[idx]->dgl_length, 0, 0); - } - cxgb_log_tcb(TOEP_T3C_DEV(toep)->adapter, toep->tp_tid); - - t3_set_ddp_tag(toep, 0, p->kbuf_tag[0] << 6); - t3_set_ddp_buf(toep, 0, 0, p->kbuf[0]->dgl_length); - t3_repost_kbuf(toep, 0, 0, 1, nonblock); - - t3_set_rcv_coalesce_enable(toep, - TOM_TUNABLE(toep->tp_toedev, ddp_rcvcoalesce)); - t3_set_dack_mss(toep, TOM_TUNABLE(toep->tp_toedev, delack)>>1); - -#ifdef T3_TRACE - T3_TRACE4(TIDTB(so), - "t3_enter_ddp: kbuf_size %u waitall %u tag0 %d tag1 %d", - kbuf_size, waitall, p->kbuf_tag[0], p->kbuf_tag[1]); -#endif - CTR4(KTR_TOM, - "t3_enter_ddp: kbuf_size %u waitall %u tag0 %d tag1 %d", - kbuf_size, waitall, p->kbuf_tag[0], p->kbuf_tag[1]); - cxgb_log_tcb(TOEP_T3C_DEV(toep)->adapter, toep->tp_tid); - return (0); - -err: - t3_release_ddp_resources(toep); - t3_cleanup_ddp(toep); - return (err); -} - -int -t3_ddp_copy(const struct mbuf *m, int offset, struct uio *uio, int len) -{ - int resid_init, err; - struct ddp_gather_list *gl = (struct ddp_gather_list *)m->m_ddp_gl; - - resid_init = uio->uio_resid; - - if (!gl->dgl_pages) - panic("pages not set\n"); - - CTR4(KTR_TOM, "t3_ddp_copy: offset=%d dgl_offset=%d cur_offset=%d len=%d", - offset, gl->dgl_offset, m->m_cur_offset, len); - offset += gl->dgl_offset + m->m_cur_offset; - KASSERT(len <= gl->dgl_length, - ("len=%d > dgl_length=%d in ddp_copy\n", len, gl->dgl_length)); - - - err = uiomove_fromphys(gl->dgl_pages, offset, len, uio); - return (err); -} - - -/* - * Allocate n page pods. Returns -1 on failure or the page pod tag. - */ -int -t3_alloc_ppods(struct tom_data *td, unsigned int n, int *ptag) -{ - unsigned int i, j; - - if (__predict_false(!td->ppod_map)) { - printf("ppod_map not set\n"); - return (EINVAL); - } - - mtx_lock(&td->ppod_map_lock); - for (i = 0; i < td->nppods; ) { - - for (j = 0; j < n; ++j) /* scan ppod_map[i..i+n-1] */ - if (td->ppod_map[i + j]) { - i = i + j + 1; - goto next; - } - memset(&td->ppod_map[i], 1, n); /* allocate range */ - mtx_unlock(&td->ppod_map_lock); - CTR2(KTR_TOM, - "t3_alloc_ppods: n=%u tag=%u", n, i); - *ptag = i; - return (0); - next: ; - } - mtx_unlock(&td->ppod_map_lock); - return (0); -} - -void -t3_free_ppods(struct tom_data *td, unsigned int tag, unsigned int n) -{ - /* No need to take ppod_lock here */ - memset(&td->ppod_map[tag], 0, n); -} diff --git a/sys/dev/cxgb/ulp/tom/cxgb_defs.h b/sys/dev/cxgb/ulp/tom/cxgb_defs.h deleted file mode 100644 index 758f024ec78..00000000000 --- a/sys/dev/cxgb/ulp/tom/cxgb_defs.h +++ /dev/null @@ -1,91 +0,0 @@ - -/************************************************************************** - -Copyright (c) 2007, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - -$FreeBSD$ - -***************************************************************************/ -#ifndef CXGB_DEFS_H_ -#define CXGB_DEFS_H_ - -#define VALIDATE_TID 0 - -#define TOEPCB(so) ((struct toepcb *)(sototcpcb((so))->t_toe)) -#define TOE_DEV(so) (TOEPCB((so))->tp_toedev) -#define toeptoso(toep) ((toep)->tp_tp->t_inpcb->inp_socket) -#define sototoep(so) (sototcpcb((so))->t_toe) - -#define TRACE_ENTER printf("%s:%s entered\n", __FUNCTION__, __FILE__) -#define TRACE_EXIT printf("%s:%s:%d exited\n", __FUNCTION__, __FILE__, __LINE__) - -#define KTR_TOM KTR_SPARE2 -#define KTR_TCB KTR_SPARE3 - -struct toepcb; -struct listen_ctx; - -void cxgb_log_tcb(struct adapter *sc, unsigned int tid); -typedef void (*defer_handler_t)(struct toedev *dev, struct mbuf *m); - -void t3tom_register_cpl_handler(unsigned int opcode, cxgb_cpl_handler_func h); -void t3_listen_start(struct toedev *dev, struct socket *so, struct t3cdev *cdev); -void t3_listen_stop(struct toedev *dev, struct socket *so, struct t3cdev *cdev); -int t3_push_frames(struct socket *so, int req_completion); -int t3_connect(struct toedev *tdev, struct socket *so, struct rtentry *rt, - struct sockaddr *nam); -void t3_init_listen_cpl_handlers(void); -int t3_init_cpl_io(void); -void t3_init_wr_tab(unsigned int wr_len); -uint32_t t3_send_rx_credits(struct tcpcb *tp, uint32_t credits, uint32_t dack, int nofail); -void t3_send_rx_modulate(struct toepcb *toep); -void t3_cleanup_rbuf(struct tcpcb *tp, int copied); - -void t3_init_socket_ops(void); -void t3_install_socket_ops(struct socket *so); - - -void t3_disconnect_acceptq(struct socket *listen_so); -void t3_reset_synq(struct listen_ctx *ctx); -void t3_defer_reply(struct mbuf *m, struct toedev *dev, defer_handler_t handler); - -struct toepcb *toepcb_alloc(void); -void toepcb_hold(struct toepcb *); -void toepcb_release(struct toepcb *); -void toepcb_init(struct toepcb *); - -void t3_set_rcv_coalesce_enable(struct toepcb *toep, int on_off); -void t3_set_dack_mss(struct toepcb *toep, int on); -void t3_set_keepalive(struct toepcb *toep, int on_off); -void t3_set_ddp_tag(struct toepcb *toep, int buf_idx, unsigned int tag); -void t3_set_ddp_buf(struct toepcb *toep, int buf_idx, unsigned int offset, - unsigned int len); -int t3_get_tcb(struct toepcb *toep); - -int t3_ctloutput(struct socket *so, struct sockopt *sopt); - -#endif diff --git a/sys/dev/cxgb/ulp/tom/cxgb_l2t.c b/sys/dev/cxgb/ulp/tom/cxgb_l2t.c index 248492308fc..4352f33e6cd 100644 --- a/sys/dev/cxgb/ulp/tom/cxgb_l2t.c +++ b/sys/dev/cxgb/ulp/tom/cxgb_l2t.c @@ -1,76 +1,61 @@ -/************************************************************************** - -Copyright (c) 2007, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -***************************************************************************/ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD #include #include #include #include #include -#include -#include -#if __FreeBSD_version > 700000 -#include -#endif - #include #include #include #include -#include -#include #include -#include +#include -#include -#include +#include "cxgb_include.h" +#include "ulp/tom/cxgb_tom.h" +#include "ulp/tom/cxgb_l2t.h" -#define VLAN_NONE 0xfff -#define SDL(s) ((struct sockaddr_dl *)s) -#define RT_ENADDR(sa) ((u_char *)LLADDR(SDL((sa)))) -#define rt_expire rt_rmx.rmx_expire - -struct llinfo_arp { - struct callout la_timer; - struct rtentry *la_rt; - struct mbuf *la_hold; /* last packet until resolved/timeout */ - u_short la_preempt; /* countdown for pre-expiry arps */ - u_short la_asked; /* # requests sent */ -}; +#define VLAN_NONE 0xfff +#define SA(x) ((struct sockaddr *)(x)) +#define SIN(x) ((struct sockaddr_in *)(x)) +#define SINADDR(x) (SIN(x)->sin_addr.s_addr) /* * Module locking notes: There is a RW lock protecting the L2 table as a - * whole plus a spinlock per L2T entry. Entry lookups and allocations happen + * whole plus a mutex per L2T entry. Entry lookups and allocations happen * under the protection of the table lock, individual entry changes happen - * while holding that entry's spinlock. The table lock nests outside the + * while holding that entry's mutex. The table lock nests outside the * entry locks. Allocations of new entries take the table lock as writers so * no other lookups can happen while allocating new entries. Entry updates * take the table lock as readers so multiple entries can be updated in @@ -78,72 +63,60 @@ struct llinfo_arp { * and therefore can happen in parallel with entry allocation but no entry * can change state or increment its ref count during allocation as both of * these perform lookups. + * + * When acquiring multiple locks, the order is llentry -> L2 table -> L2 entry. */ -static inline unsigned int -vlan_prio(const struct l2t_entry *e) -{ - return e->vlan >> 13; -} - static inline unsigned int arp_hash(u32 key, int ifindex, const struct l2t_data *d) { return jhash_2words(key, ifindex, 0) & (d->nentries - 1); } -static inline void -neigh_replace(struct l2t_entry *e, struct llentry *neigh) -{ - LLE_WLOCK(neigh); - LLE_ADDREF(neigh); - LLE_WUNLOCK(neigh); - - if (e->neigh) - LLE_FREE(e->neigh); - e->neigh = neigh; -} - /* - * Set up an L2T entry and send any packets waiting in the arp queue. The - * supplied mbuf is used for the CPL_L2T_WRITE_REQ. Must be called with the - * entry locked. + * Set up an L2T entry and send any packets waiting in the arp queue. Must be + * called with the entry locked. */ static int -setup_l2e_send_pending(struct t3cdev *dev, struct mbuf *m, - struct l2t_entry *e) +setup_l2e_send_pending(struct adapter *sc, struct l2t_entry *e) { + struct mbuf *m; struct cpl_l2t_write_req *req; + struct port_info *pi = &sc->port[e->smt_idx]; /* smt_idx is port_id */ - if (!m) { - if ((m = m_gethdr(M_NOWAIT, MT_DATA)) == NULL) - return (ENOMEM); + mtx_assert(&e->lock, MA_OWNED); + + m = M_GETHDR_OFLD(pi->first_qset, CPL_PRIORITY_CONTROL, req); + if (m == NULL) { + log(LOG_ERR, "%s: no mbuf, can't setup L2 entry at index %d\n", + __func__, e->idx); + return (ENOMEM); } - /* - * XXX MH_ALIGN - */ - req = mtod(m, struct cpl_l2t_write_req *); - m->m_pkthdr.len = m->m_len = sizeof(*req); - - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); + + req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_L2T_WRITE_REQ, e->idx)); req->params = htonl(V_L2T_W_IDX(e->idx) | V_L2T_W_IFF(e->smt_idx) | - V_L2T_W_VLAN(e->vlan & EVL_VLID_MASK) | - V_L2T_W_PRIO(vlan_prio(e))); - + V_L2T_W_VLAN(e->vlan & EVL_VLID_MASK) | + V_L2T_W_PRIO(EVL_PRIOFTAG(e->vlan))); memcpy(req->dst_mac, e->dmac, sizeof(req->dst_mac)); - m_set_priority(m, CPL_PRIORITY_CONTROL); - cxgb_ofld_send(dev, m); + + t3_offload_tx(sc, m); + + /* + * XXX: We used pi->first_qset to send the L2T_WRITE_REQ. If any mbuf + * on the arpq is going out via another queue set associated with the + * port then it has a bad race with the L2T_WRITE_REQ. Ideally we + * should wait till the reply to the write before draining the arpq. + */ while (e->arpq_head) { m = e->arpq_head; e->arpq_head = m->m_next; m->m_next = NULL; - cxgb_ofld_send(dev, m); + t3_offload_tx(sc, m); } e->arpq_tail = NULL; - e->state = L2T_STATE_VALID; - return 0; + return (0); } /* @@ -153,6 +126,8 @@ setup_l2e_send_pending(struct t3cdev *dev, struct mbuf *m, static inline void arpq_enqueue(struct l2t_entry *e, struct mbuf *m) { + mtx_assert(&e->lock, MA_OWNED); + m->m_next = NULL; if (e->arpq_head) e->arpq_tail->m_next = m; @@ -161,113 +136,149 @@ arpq_enqueue(struct l2t_entry *e, struct mbuf *m) e->arpq_tail = m; } -int -t3_l2t_send_slow(struct t3cdev *dev, struct mbuf *m, struct l2t_entry *e) +static void +resolution_failed_mbuf(struct mbuf *m) { - struct llentry *lle = e->neigh; - struct sockaddr_in sin; + log(LOG_ERR, "%s: leaked mbuf %p, CPL at %p", + __func__, m, mtod(m, void *)); +} + +static void +resolution_failed(struct l2t_entry *e) +{ + struct mbuf *m; + + mtx_assert(&e->lock, MA_OWNED); + + while (e->arpq_head) { + m = e->arpq_head; + e->arpq_head = m->m_next; + m->m_next = NULL; + resolution_failed_mbuf(m); + } + e->arpq_tail = NULL; +} + +static void +update_entry(struct adapter *sc, struct l2t_entry *e, uint8_t *lladdr, + uint16_t vtag) +{ + + mtx_assert(&e->lock, MA_OWNED); + + /* + * The entry may be in active use (e->refcount > 0) or not. We update + * it even when it's not as this simplifies the case where we decide to + * reuse the entry later. + */ + + if (lladdr == NULL && + (e->state == L2T_STATE_RESOLVING || e->state == L2T_STATE_FAILED)) { + /* + * Never got a valid L2 address for this one. Just mark it as + * failed instead of removing it from the hash (for which we'd + * need to wlock the table). + */ + e->state = L2T_STATE_FAILED; + resolution_failed(e); + return; + + } else if (lladdr == NULL) { + + /* Valid or already-stale entry was deleted (or expired) */ + + KASSERT(e->state == L2T_STATE_VALID || + e->state == L2T_STATE_STALE, + ("%s: lladdr NULL, state %d", __func__, e->state)); + + e->state = L2T_STATE_STALE; + + } else { + + if (e->state == L2T_STATE_RESOLVING || + e->state == L2T_STATE_FAILED || + memcmp(e->dmac, lladdr, ETHER_ADDR_LEN)) { + + /* unresolved -> resolved; or dmac changed */ + + memcpy(e->dmac, lladdr, ETHER_ADDR_LEN); + e->vlan = vtag; + setup_l2e_send_pending(sc, e); + } + e->state = L2T_STATE_VALID; + } +} + +static int +resolve_entry(struct adapter *sc, struct l2t_entry *e) +{ + struct tom_data *td = sc->tom_softc; + struct toedev *tod = &td->tod; + struct sockaddr_in sin = {0}; + uint8_t dmac[ETHER_ADDR_LEN]; + uint16_t vtag = EVL_VLID_MASK; + int rc; - bzero(&sin, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_len = sizeof(struct sockaddr_in); - sin.sin_addr.s_addr = e->addr; + SINADDR(&sin) = e->addr; + + rc = toe_l2_resolve(tod, e->ifp, SA(&sin), dmac, &vtag); + if (rc == EWOULDBLOCK) + return (rc); + + mtx_lock(&e->lock); + update_entry(sc, e, rc == 0 ? dmac : NULL, vtag); + mtx_unlock(&e->lock); + + return (rc); +} + +int +t3_l2t_send_slow(struct adapter *sc, struct mbuf *m, struct l2t_entry *e) +{ - CTR2(KTR_CXGB, "send slow on rt=%p eaddr=0x%08x\n", rt, e->addr); again: switch (e->state) { case L2T_STATE_STALE: /* entry is stale, kick off revalidation */ - arpresolve(rt->rt_ifp, rt, NULL, - (struct sockaddr *)&sin, e->dmac, &lle); - mtx_lock(&e->lock); - if (e->state == L2T_STATE_STALE) - e->state = L2T_STATE_VALID; - mtx_unlock(&e->lock); + + if (resolve_entry(sc, e) != EWOULDBLOCK) + goto again; /* entry updated, re-examine state */ + + /* Fall through */ + case L2T_STATE_VALID: /* fast-path, send the packet on */ - return cxgb_ofld_send(dev, m); + + return (t3_offload_tx(sc, m)); + case L2T_STATE_RESOLVING: mtx_lock(&e->lock); - if (e->state != L2T_STATE_RESOLVING) { // ARP already completed + if (e->state != L2T_STATE_RESOLVING) { mtx_unlock(&e->lock); goto again; } arpq_enqueue(e, m); mtx_unlock(&e->lock); - /* - * Only the first packet added to the arpq should kick off - * resolution. However, because the m_gethdr below can fail, - * we allow each packet added to the arpq to retry resolution - * as a way of recovering from transient memory exhaustion. - * A better way would be to use a work request to retry L2T - * entries when there's no memory. - */ - if (arpresolve(rt->rt_ifp, rt, NULL, - (struct sockaddr *)&sin, e->dmac, &lle) == 0) { - CTR6(KTR_CXGB, "mac=%x:%x:%x:%x:%x:%x\n", - e->dmac[0], e->dmac[1], e->dmac[2], e->dmac[3], e->dmac[4], e->dmac[5]); - - if ((m = m_gethdr(M_NOWAIT, MT_DATA)) == NULL) - return (ENOMEM); - mtx_lock(&e->lock); - if (e->arpq_head) - setup_l2e_send_pending(dev, m, e); - else - m_freem(m); - mtx_unlock(&e->lock); - } + if (resolve_entry(sc, e) == EWOULDBLOCK) + break; + + mtx_lock(&e->lock); + if (e->state == L2T_STATE_VALID && e->arpq_head) + setup_l2e_send_pending(sc, e); + if (e->state == L2T_STATE_FAILED) + resolution_failed(e); + mtx_unlock(&e->lock); + break; + + case L2T_STATE_FAILED: + resolution_failed_mbuf(m); + return (EHOSTUNREACH); } - return 0; + + return (0); } -void -t3_l2t_send_event(struct t3cdev *dev, struct l2t_entry *e) -{ - struct mbuf *m0; - struct sockaddr_in sin; - sin.sin_family = AF_INET; - sin.sin_len = sizeof(struct sockaddr_in); - sin.sin_addr.s_addr = e->addr; - struct llentry *lle; - - if ((m0 = m_gethdr(M_NOWAIT, MT_DATA)) == NULL) - return; - - rt = e->neigh; -again: - switch (e->state) { - case L2T_STATE_STALE: /* entry is stale, kick off revalidation */ - arpresolve(rt->rt_ifp, rt, NULL, - (struct sockaddr *)&sin, e->dmac, &lle); - mtx_lock(&e->lock); - if (e->state == L2T_STATE_STALE) { - e->state = L2T_STATE_VALID; - } - mtx_unlock(&e->lock); - return; - case L2T_STATE_VALID: /* fast-path, send the packet on */ - return; - case L2T_STATE_RESOLVING: - mtx_lock(&e->lock); - if (e->state != L2T_STATE_RESOLVING) { // ARP already completed - mtx_unlock(&e->lock); - goto again; - } - mtx_unlock(&e->lock); - - /* - * Only the first packet added to the arpq should kick off - * resolution. However, because the alloc_skb below can fail, - * we allow each packet added to the arpq to retry resolution - * as a way of recovering from transient memory exhaustion. - * A better way would be to use a work request to retry L2T - * entries when there's no memory. - */ - arpresolve(rt->rt_ifp, rt, NULL, - (struct sockaddr *)&sin, e->dmac, &lle); - - } - return; -} /* * Allocate a free L2T entry. Must be called with l2t_data.lock held. */ @@ -276,15 +287,19 @@ alloc_l2e(struct l2t_data *d) { struct l2t_entry *end, *e, **p; + rw_assert(&d->lock, RA_WLOCKED); + if (!atomic_load_acq_int(&d->nfree)) - return NULL; + return (NULL); /* there's definitely a free entry */ - for (e = d->rover, end = &d->l2tab[d->nentries]; e != end; ++e) + for (e = d->rover, end = &d->l2tab[d->nentries]; e != end; ++e) { if (atomic_load_acq_int(&e->refcnt) == 0) goto found; + } - for (e = &d->l2tab[1]; atomic_load_acq_int(&e->refcnt); ++e) ; + for (e = &d->l2tab[1]; atomic_load_acq_int(&e->refcnt); ++e) + continue; found: d->rover = e + 1; atomic_add_int(&d->nfree, -1); @@ -294,90 +309,37 @@ found: * presently in the hash table. We need to remove it. */ if (e->state != L2T_STATE_UNUSED) { - int hash = arp_hash(e->addr, e->ifindex, d); + int hash = arp_hash(e->addr, e->ifp->if_index, d); - for (p = &d->l2tab[hash].first; *p; p = &(*p)->next) + for (p = &d->l2tab[hash].first; *p; p = &(*p)->next) { if (*p == e) { *p = e->next; break; } + } e->state = L2T_STATE_UNUSED; } - - return e; -} -/* - * Called when an L2T entry has no more users. The entry is left in the hash - * table since it is likely to be reused but we also bump nfree to indicate - * that the entry can be reallocated for a different neighbor. We also drop - * the existing neighbor reference in case the neighbor is going away and is - * waiting on our reference. - * - * Because entries can be reallocated to other neighbors once their ref count - * drops to 0 we need to take the entry's lock to avoid races with a new - * incarnation. - */ -void -t3_l2e_free(struct l2t_data *d, struct l2t_entry *e) -{ - struct llentry *lle; - - mtx_lock(&e->lock); - if (atomic_load_acq_int(&e->refcnt) == 0) { /* hasn't been recycled */ - lle = e->neigh; - e->neigh = NULL; - } - - mtx_unlock(&e->lock); - atomic_add_int(&d->nfree, 1); - if (lle) - LLE_FREE(lle); -} - - -/* - * Update an L2T entry that was previously used for the same next hop as neigh. - * Must be called with softirqs disabled. - */ -static inline void -reuse_entry(struct l2t_entry *e, struct llentry *neigh) -{ - - mtx_lock(&e->lock); /* avoid race with t3_l2t_free */ - if (neigh != e->neigh) - neigh_replace(e, neigh); - - if (memcmp(e->dmac, RT_ENADDR(neigh->rt_gateway), sizeof(e->dmac)) || - (neigh->rt_expire > time_uptime)) - e->state = L2T_STATE_RESOLVING; - else if (la->la_hold == NULL) - e->state = L2T_STATE_VALID; - else - e->state = L2T_STATE_STALE; - mtx_unlock(&e->lock); + return (e); } struct l2t_entry * -t3_l2t_get(struct t3cdev *dev, struct llentry *neigh, struct ifnet *ifp, - struct sockaddr *sa) +t3_l2t_get(struct port_info *pi, struct ifnet *ifp, struct sockaddr *sa) { + struct tom_data *td = pi->adapter->tom_softc; struct l2t_entry *e; - struct l2t_data *d = L2DATA(dev); - u32 addr = ((struct sockaddr_in *)sa)->sin_addr.s_addr; - int ifidx = ifp->if_index; - int hash = arp_hash(addr, ifidx, d); - unsigned int smt_idx = ((struct port_info *)ifp->if_softc)->port_id; + struct l2t_data *d = td->l2t; + uint32_t addr = SINADDR(sa); + int hash = arp_hash(addr, ifp->if_index, d); + unsigned int smt_idx = pi->port_id; rw_wlock(&d->lock); - for (e = d->l2tab[hash].first; e; e = e->next) - if (e->addr == addr && e->ifindex == ifidx && - e->smt_idx == smt_idx) { + for (e = d->l2tab[hash].first; e; e = e->next) { + if (e->addr == addr && e->ifp == ifp && e->smt_idx == smt_idx) { l2t_hold(d, e); - if (atomic_load_acq_int(&e->refcnt) == 1) - reuse_entry(e, neigh); goto done; } + } /* Need to allocate a new entry */ e = alloc_l2e(d); @@ -385,116 +347,59 @@ t3_l2t_get(struct t3cdev *dev, struct llentry *neigh, struct ifnet *ifp, mtx_lock(&e->lock); /* avoid race with t3_l2t_free */ e->next = d->l2tab[hash].first; d->l2tab[hash].first = e; - rw_wunlock(&d->lock); - + e->state = L2T_STATE_RESOLVING; e->addr = addr; - e->ifindex = ifidx; + e->ifp = ifp; e->smt_idx = smt_idx; atomic_store_rel_int(&e->refcnt, 1); - e->neigh = NULL; - - - neigh_replace(e, neigh); -#ifdef notyet - /* - * XXX need to add accessor function for vlan tag - */ - if (neigh->rt_ifp->if_vlantrunk) - e->vlan = VLAN_DEV_INFO(neigh->dev)->vlan_id; - else -#endif - e->vlan = VLAN_NONE; - mtx_unlock(&e->lock); - return (e); + KASSERT(ifp->if_vlantrunk == NULL, ("TOE+VLAN unimplemented.")); + e->vlan = VLAN_NONE; + + mtx_unlock(&e->lock); } - + done: rw_wunlock(&d->lock); - return e; -} - -/* - * Called when address resolution fails for an L2T entry to handle packets - * on the arpq head. If a packet specifies a failure handler it is invoked, - * otherwise the packets is sent to the TOE. - * - * XXX: maybe we should abandon the latter behavior and just require a failure - * handler. - */ -static void -handle_failed_resolution(struct t3cdev *dev, struct mbuf *arpq) -{ - - while (arpq) { - struct mbuf *m = arpq; -#ifdef notyet - struct l2t_mbuf_cb *cb = L2T_MBUF_CB(m); -#endif - arpq = m->m_next; - m->m_next = NULL; -#ifdef notyet - if (cb->arp_failure_handler) - cb->arp_failure_handler(dev, m); - else -#endif - cxgb_ofld_send(dev, m); - } + return (e); } void -t3_l2t_update(struct t3cdev *dev, struct llentry *neigh, - uint8_t *enaddr, struct sockaddr *sa) +t3_l2_update(struct toedev *tod, struct ifnet *ifp, struct sockaddr *sa, + uint8_t *lladdr, uint16_t vtag) { + struct tom_data *td = t3_tomdata(tod); + struct adapter *sc = tod->tod_softc; struct l2t_entry *e; - struct mbuf *arpq = NULL; - struct l2t_data *d = L2DATA(dev); - u32 addr = *(u32 *) &((struct sockaddr_in *)sa)->sin_addr; - int hash = arp_hash(addr, ifidx, d); - struct llinfo_arp *la; + struct l2t_data *d = td->l2t; + u32 addr = *(u32 *) &SIN(sa)->sin_addr; + int hash = arp_hash(addr, ifp->if_index, d); rw_rlock(&d->lock); for (e = d->l2tab[hash].first; e; e = e->next) - if (e->addr == addr) { + if (e->addr == addr && e->ifp == ifp) { mtx_lock(&e->lock); goto found; } rw_runlock(&d->lock); - CTR1(KTR_CXGB, "t3_l2t_update: addr=0x%08x not found", addr); + + /* + * This is of no interest to us. We've never had an offloaded + * connection to this destination, and we aren't attempting one right + * now. + */ return; found: - printf("found 0x%08x\n", addr); - rw_runlock(&d->lock); - memcpy(e->dmac, enaddr, ETHER_ADDR_LEN); - printf("mac=%x:%x:%x:%x:%x:%x\n", - e->dmac[0], e->dmac[1], e->dmac[2], e->dmac[3], e->dmac[4], e->dmac[5]); - - if (atomic_load_acq_int(&e->refcnt)) { - if (neigh != e->neigh) - neigh_replace(e, neigh); - - la = (struct llinfo_arp *)neigh->rt_llinfo; - if (e->state == L2T_STATE_RESOLVING) { - - if (la->la_asked >= 5 /* arp_maxtries */) { - arpq = e->arpq_head; - e->arpq_head = e->arpq_tail = NULL; - } else - setup_l2e_send_pending(dev, NULL, e); - } else { - e->state = L2T_STATE_VALID; - if (memcmp(e->dmac, RT_ENADDR(neigh->rt_gateway), 6)) - setup_l2e_send_pending(dev, NULL, e); - } - } - mtx_unlock(&e->lock); - if (arpq) - handle_failed_resolution(dev, arpq); + KASSERT(e->state != L2T_STATE_UNUSED, + ("%s: unused entry in the hash.", __func__)); + + update_entry(sc, e, lladdr, vtag); + mtx_unlock(&e->lock); } struct l2t_data * @@ -503,9 +408,9 @@ t3_init_l2t(unsigned int l2t_capacity) struct l2t_data *d; int i, size = sizeof(*d) + l2t_capacity * sizeof(struct l2t_entry); - d = cxgb_alloc_mem(size); + d = malloc(size, M_CXGB, M_NOWAIT | M_ZERO); if (!d) - return NULL; + return (NULL); d->nentries = l2t_capacity; d->rover = &d->l2tab[1]; /* entry 0 is not used */ @@ -515,10 +420,10 @@ t3_init_l2t(unsigned int l2t_capacity) for (i = 0; i < l2t_capacity; ++i) { d->l2tab[i].idx = i; d->l2tab[i].state = L2T_STATE_UNUSED; - mtx_init(&d->l2tab[i].lock, "L2TAB", NULL, MTX_DEF); + mtx_init(&d->l2tab[i].lock, "L2T_E", NULL, MTX_DEF); atomic_store_rel_int(&d->l2tab[i].refcnt, 0); } - return d; + return (d); } void @@ -530,5 +435,26 @@ t3_free_l2t(struct l2t_data *d) for (i = 0; i < d->nentries; ++i) mtx_destroy(&d->l2tab[i].lock); - cxgb_free_mem(d); + free(d, M_CXGB); } + +static int +do_l2t_write_rpl(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) +{ + struct cpl_l2t_write_rpl *rpl = mtod(m, void *); + + if (rpl->status != CPL_ERR_NONE) + log(LOG_ERR, + "Unexpected L2T_WRITE_RPL status %u for entry %u\n", + rpl->status, GET_TID(rpl)); + + m_freem(m); + return (0); +} + +void +t3_init_l2t_cpl_handlers(struct adapter *sc) +{ + t3_register_cpl_handler(sc, CPL_L2T_WRITE_RPL, do_l2t_write_rpl); +} +#endif diff --git a/sys/dev/cxgb/ulp/tom/cxgb_l2t.h b/sys/dev/cxgb/ulp/tom/cxgb_l2t.h index 308ba66bda2..d3ddf9d50bf 100644 --- a/sys/dev/cxgb/ulp/tom/cxgb_l2t.h +++ b/sys/dev/cxgb/ulp/tom/cxgb_l2t.h @@ -1,6 +1,6 @@ /************************************************************************** -Copyright (c) 2007-2008, Chelsio Inc. +Copyright (c) 2007-2009, Chelsio Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -31,26 +31,19 @@ $FreeBSD$ #ifndef _CHELSIO_L2T_H #define _CHELSIO_L2T_H -#include #include - -#if __FreeBSD_version > 700000 #include -#else -#define rwlock mtx -#define rw_wlock(x) mtx_lock((x)) -#define rw_wunlock(x) mtx_unlock((x)) -#define rw_rlock(x) mtx_lock((x)) -#define rw_runlock(x) mtx_unlock((x)) -#define rw_init(x, str) mtx_init((x), (str), NULL, MTX_DEF) -#define rw_destroy(x) mtx_destroy((x)) -#endif enum { - L2T_STATE_VALID, /* entry is up to date */ - L2T_STATE_STALE, /* entry may be used but needs revalidation */ - L2T_STATE_RESOLVING, /* entry needs address resolution */ - L2T_STATE_UNUSED /* entry not in use */ + L2T_SIZE = 2048 +}; + +enum { + L2T_STATE_VALID, /* entry is up to date */ + L2T_STATE_STALE, /* entry may be used but needs revalidation */ + L2T_STATE_RESOLVING, /* entry needs address resolution */ + L2T_STATE_FAILED, /* failed to resolve */ + L2T_STATE_UNUSED /* entry not in use */ }; /* @@ -64,18 +57,17 @@ enum { struct l2t_entry { uint16_t state; /* entry state */ uint16_t idx; /* entry index */ - uint32_t addr; /* dest IP address */ - int ifindex; /* neighbor's net_device's ifindex */ + uint32_t addr; /* nexthop IP address */ + struct ifnet *ifp; /* outgoing interface */ uint16_t smt_idx; /* SMT index */ uint16_t vlan; /* VLAN TCI (id: bits 0-11, prio: 13-15 */ - struct llentry *neigh; /* associated neighbour */ struct l2t_entry *first; /* start of hash chain */ struct l2t_entry *next; /* next l2t_entry on chain */ struct mbuf *arpq_head; /* queue of packets awaiting resolution */ struct mbuf *arpq_tail; struct mtx lock; volatile uint32_t refcnt; /* entry reference count */ - uint8_t dmac[6]; /* neighbour's MAC address */ + uint8_t dmac[ETHER_ADDR_LEN]; /* nexthop's MAC address */ }; struct l2t_data { @@ -86,76 +78,37 @@ struct l2t_data { struct l2t_entry l2tab[0]; }; -typedef void (*arp_failure_handler_func)(struct t3cdev *dev, - struct mbuf *m); +void t3_l2e_free(struct l2t_data *, struct l2t_entry *e); +void t3_l2_update(struct toedev *tod, struct ifnet *ifp, struct sockaddr *sa, + uint8_t *lladdr, uint16_t vtag); +struct l2t_entry *t3_l2t_get(struct port_info *, struct ifnet *, + struct sockaddr *); +int t3_l2t_send_slow(struct adapter *, struct mbuf *, struct l2t_entry *); +struct l2t_data *t3_init_l2t(unsigned int); +void t3_free_l2t(struct l2t_data *); +void t3_init_l2t_cpl_handlers(struct adapter *); -typedef void (*opaque_arp_failure_handler_func)(void *dev, - struct mbuf *m); - -/* - * Callback stored in an skb to handle address resolution failure. - */ -struct l2t_mbuf_cb { - arp_failure_handler_func arp_failure_handler; -}; - -/* - * XXX - */ -#define L2T_MBUF_CB(skb) ((struct l2t_mbuf_cb *)(skb)->cb) - - -static __inline void set_arp_failure_handler(struct mbuf *m, - arp_failure_handler_func hnd) +static inline int +l2t_send(struct adapter *sc, struct mbuf *m, struct l2t_entry *e) { - m->m_pkthdr.header = (opaque_arp_failure_handler_func)hnd; - + if (__predict_true(e->state == L2T_STATE_VALID)) + return t3_offload_tx(sc, m); + else + return t3_l2t_send_slow(sc, m, e); } -/* - * Getting to the L2 data from an offload device. - */ -#define L2DATA(dev) ((dev)->l2opt) - -void t3_l2e_free(struct l2t_data *d, struct l2t_entry *e); -void t3_l2t_update(struct t3cdev *dev, struct rtentry *rt, uint8_t *enaddr, struct sockaddr *sa); -struct l2t_entry *t3_l2t_get(struct t3cdev *dev, struct rtentry *neigh, - struct ifnet *ifp, struct sockaddr *sa); -int t3_l2t_send_slow(struct t3cdev *dev, struct mbuf *m, - struct l2t_entry *e); -void t3_l2t_send_event(struct t3cdev *dev, struct l2t_entry *e); -struct l2t_data *t3_init_l2t(unsigned int l2t_capacity); -void t3_free_l2t(struct l2t_data *d); - -#ifdef CONFIG_PROC_FS -int t3_l2t_proc_setup(struct proc_dir_entry *dir, struct l2t_data *d); -void t3_l2t_proc_free(struct proc_dir_entry *dir); -#else -#define l2t_proc_setup(dir, d) 0 -#define l2t_proc_free(dir) -#endif - -int cxgb_ofld_send(struct t3cdev *dev, struct mbuf *m); - -static inline int l2t_send(struct t3cdev *dev, struct mbuf *m, - struct l2t_entry *e) +static inline void +l2t_release(struct l2t_data *d, struct l2t_entry *e) { - if (__predict_true(e->state == L2T_STATE_VALID)) { - return cxgb_ofld_send(dev, (struct mbuf *)m); - } - return t3_l2t_send_slow(dev, (struct mbuf *)m, e); -} - -static inline void l2t_release(struct l2t_data *d, struct l2t_entry *e) -{ - if (atomic_fetchadd_int(&e->refcnt, -1) == 1) - t3_l2e_free(d, e); -} - -static inline void l2t_hold(struct l2t_data *d, struct l2t_entry *e) -{ - if (atomic_fetchadd_int(&e->refcnt, 1) == 1) /* 0 -> 1 transition */ + if (atomic_fetchadd_int(&e->refcnt, -1) == 1) /* 1 -> 0 transition */ atomic_add_int(&d->nfree, 1); } +static inline void +l2t_hold(struct l2t_data *d, struct l2t_entry *e) +{ + if (atomic_fetchadd_int(&e->refcnt, 1) == 0) /* 0 -> 1 transition */ + atomic_add_int(&d->nfree, -1); +} + #endif diff --git a/sys/dev/cxgb/ulp/tom/cxgb_listen.c b/sys/dev/cxgb/ulp/tom/cxgb_listen.c index 5dc2d9f09fc..c80abf0165b 100644 --- a/sys/dev/cxgb/ulp/tom/cxgb_listen.c +++ b/sys/dev/cxgb/ulp/tom/cxgb_listen.c @@ -1,280 +1,237 @@ -/************************************************************************** - -Copyright (c) 2007, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -***************************************************************************/ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD #include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - +#include #include -#include - +#include +#include #include #include - #include +#include #include -#include #include - - -#include -#include - -#include #include +#define TCPSTATES #include +#include -#include -#include +#include "cxgb_include.h" +#include "ulp/tom/cxgb_tom.h" +#include "ulp/tom/cxgb_l2t.h" +#include "ulp/tom/cxgb_toepcb.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +static void t3_send_reset_synqe(struct toedev *, struct synq_entry *); - -static struct listen_info *listen_hash_add(struct tom_data *d, struct socket *so, unsigned int stid); -static int listen_hash_del(struct tom_data *d, struct socket *so); - -/* - * Process a CPL_CLOSE_LISTSRV_RPL message. If the status is good we release - * the STID. - */ static int -do_close_server_rpl(struct t3cdev *cdev, struct mbuf *m, void *ctx) +alloc_stid(struct tid_info *t, void *ctx) { - struct cpl_close_listserv_rpl *rpl = cplhdr(m); - unsigned int stid = GET_TID(rpl); + int stid = -1; - if (rpl->status != CPL_ERR_NONE) - log(LOG_ERR, "Unexpected CLOSE_LISTSRV_RPL status %u for " - "STID %u\n", rpl->status, stid); - else { - struct listen_ctx *listen_ctx = (struct listen_ctx *)ctx; + mtx_lock(&t->stid_lock); + if (t->sfree) { + union listen_entry *p = t->sfree; - cxgb_free_stid(cdev, stid); - free(listen_ctx, M_CXGB); + stid = (p - t->stid_tab) + t->stid_base; + t->sfree = p->next; + p->ctx = ctx; + t->stids_in_use++; } - - return (CPL_RET_BUF_DONE); -} - -/* - * Process a CPL_PASS_OPEN_RPL message. Remove the socket from the listen hash - * table and free the STID if there was any error, otherwise nothing to do. - */ -static int -do_pass_open_rpl(struct t3cdev *cdev, struct mbuf *m, void *ctx) -{ - struct cpl_pass_open_rpl *rpl = cplhdr(m); - - if (rpl->status != CPL_ERR_NONE) { - int stid = GET_TID(rpl); - struct listen_ctx *listen_ctx = (struct listen_ctx *)ctx; - struct tom_data *d = listen_ctx->tom_data; - struct socket *lso = listen_ctx->lso; - -#if VALIDATE_TID - if (!lso) - return (CPL_RET_UNKNOWN_TID | CPL_RET_BUF_DONE); -#endif - /* - * Note: It is safe to unconditionally call listen_hash_del() - * at this point without risking unhashing a reincarnation of - * an already closed socket (i.e., there is no listen, close, - * listen, free the sock for the second listen while processing - * a message for the first race) because we are still holding - * a reference on the socket. It is possible that the unhash - * will fail because the socket is already closed, but we can't - * unhash the wrong socket because it is impossible for the - * socket to which this message refers to have reincarnated. - */ - listen_hash_del(d, lso); - cxgb_free_stid(cdev, stid); -#ifdef notyet - /* - * XXX need to unreference the inpcb - * but we have no way of knowing that other TOMs aren't referencing it - */ - sock_put(lso); -#endif - free(listen_ctx, M_CXGB); - } - return CPL_RET_BUF_DONE; -} - -void -t3_init_listen_cpl_handlers(void) -{ - t3tom_register_cpl_handler(CPL_PASS_OPEN_RPL, do_pass_open_rpl); - t3tom_register_cpl_handler(CPL_CLOSE_LISTSRV_RPL, do_close_server_rpl); -} - -static inline int -listen_hashfn(const struct socket *so) -{ - return ((unsigned long)so >> 10) & (LISTEN_INFO_HASH_SIZE - 1); -} - -/* - * Create and add a listen_info entry to the listen hash table. This and the - * listen hash table functions below cannot be called from softirqs. - */ -static struct listen_info * -listen_hash_add(struct tom_data *d, struct socket *so, unsigned int stid) -{ - struct listen_info *p; - - p = malloc(sizeof(*p), M_CXGB, M_NOWAIT|M_ZERO); - if (p) { - int bucket = listen_hashfn(so); - - p->so = so; /* just a key, no need to take a reference */ - p->stid = stid; - mtx_lock(&d->listen_lock); - p->next = d->listen_hash_tab[bucket]; - d->listen_hash_tab[bucket] = p; - mtx_unlock(&d->listen_lock); - } - return p; -} - -/* - * Given a pointer to a listening socket return its server TID by consulting - * the socket->stid map. Returns -1 if the socket is not in the map. - */ -static int -listen_hash_find(struct tom_data *d, struct socket *so) -{ - int stid = -1, bucket = listen_hashfn(so); - struct listen_info *p; - - mtx_lock(&d->listen_lock); - for (p = d->listen_hash_tab[bucket]; p; p = p->next) - if (p->so == so) { - stid = p->stid; - break; - } - mtx_unlock(&d->listen_lock); - return stid; -} - -/* - * Delete the listen_info structure for a listening socket. Returns the server - * TID for the socket if it is present in the socket->stid map, or -1. - */ -static int -listen_hash_del(struct tom_data *d, struct socket *so) -{ - int bucket, stid = -1; - struct listen_info *p, **prev; - - bucket = listen_hashfn(so); - prev = &d->listen_hash_tab[bucket]; - - mtx_lock(&d->listen_lock); - for (p = *prev; p; prev = &p->next, p = p->next) - if (p->so == so) { - stid = p->stid; - *prev = p->next; - free(p, M_CXGB); - break; - } - mtx_unlock(&d->listen_lock); - + mtx_unlock(&t->stid_lock); return (stid); } -/* - * Start a listening server by sending a passive open request to HW. - */ -void -t3_listen_start(struct toedev *dev, struct socket *so, struct t3cdev *cdev) +static void +free_stid(struct tid_info *t, int stid) +{ + union listen_entry *p = stid2entry(t, stid); + + mtx_lock(&t->stid_lock); + p->next = t->sfree; + t->sfree = p; + t->stids_in_use--; + mtx_unlock(&t->stid_lock); +} + +static struct listen_ctx * +alloc_lctx(struct tom_data *td, struct inpcb *inp, int qset) +{ + struct listen_ctx *lctx; + + INP_WLOCK_ASSERT(inp); + + lctx = malloc(sizeof(struct listen_ctx), M_CXGB, M_NOWAIT | M_ZERO); + if (lctx == NULL) + return (NULL); + + lctx->stid = alloc_stid(&td->tid_maps, lctx); + if (lctx->stid < 0) { + free(lctx, M_CXGB); + return (NULL); + } + + lctx->inp = inp; + in_pcbref(inp); + + lctx->qset = qset; + refcount_init(&lctx->refcnt, 1); + TAILQ_INIT(&lctx->synq); + + return (lctx); +} + +/* Don't call this directly, use release_lctx instead */ +static int +free_lctx(struct tom_data *td, struct listen_ctx *lctx) +{ + struct inpcb *inp = lctx->inp; + + INP_WLOCK_ASSERT(inp); + KASSERT(lctx->refcnt == 0, + ("%s: refcnt %d", __func__, lctx->refcnt)); + KASSERT(TAILQ_EMPTY(&lctx->synq), + ("%s: synq not empty.", __func__)); + KASSERT(lctx->stid >= 0, ("%s: bad stid %d.", __func__, lctx->stid)); + + CTR4(KTR_CXGB, "%s: stid %u, lctx %p, inp %p", + __func__, lctx->stid, lctx, lctx->inp); + + free_stid(&td->tid_maps, lctx->stid); + free(lctx, M_CXGB); + + return in_pcbrele_wlocked(inp); +} + +static void +hold_lctx(struct listen_ctx *lctx) +{ + + refcount_acquire(&lctx->refcnt); +} + +static inline uint32_t +listen_hashfn(void *key, u_long mask) +{ + + return (fnv_32_buf(&key, sizeof(key), FNV1_32_INIT) & mask); +} + +/* + * Add a listen_ctx entry to the listen hash table. + */ +static void +listen_hash_add(struct tom_data *td, struct listen_ctx *lctx) +{ + int bucket = listen_hashfn(lctx->inp, td->listen_mask); + + mtx_lock(&td->lctx_hash_lock); + LIST_INSERT_HEAD(&td->listen_hash[bucket], lctx, link); + td->lctx_count++; + mtx_unlock(&td->lctx_hash_lock); +} + +/* + * Look for the listening socket's context entry in the hash and return it. + */ +static struct listen_ctx * +listen_hash_find(struct tom_data *td, struct inpcb *inp) +{ + int bucket = listen_hashfn(inp, td->listen_mask); + struct listen_ctx *lctx; + + mtx_lock(&td->lctx_hash_lock); + LIST_FOREACH(lctx, &td->listen_hash[bucket], link) { + if (lctx->inp == inp) + break; + } + mtx_unlock(&td->lctx_hash_lock); + + return (lctx); +} + +/* + * Removes the listen_ctx structure for inp from the hash and returns it. + */ +static struct listen_ctx * +listen_hash_del(struct tom_data *td, struct inpcb *inp) +{ + int bucket = listen_hashfn(inp, td->listen_mask); + struct listen_ctx *lctx, *l; + + mtx_lock(&td->lctx_hash_lock); + LIST_FOREACH_SAFE(lctx, &td->listen_hash[bucket], link, l) { + if (lctx->inp == inp) { + LIST_REMOVE(lctx, link); + td->lctx_count--; + break; + } + } + mtx_unlock(&td->lctx_hash_lock); + + return (lctx); +} + +/* + * Releases a hold on the lctx. Must be called with the listening socket's inp + * locked. The inp may be freed by this function and it returns NULL to + * indicate this. + */ +static struct inpcb * +release_lctx(struct tom_data *td, struct listen_ctx *lctx) +{ + struct inpcb *inp = lctx->inp; + int inp_freed = 0; + + INP_WLOCK_ASSERT(inp); + if (refcount_release(&lctx->refcnt)) + inp_freed = free_lctx(td, lctx); + + return (inp_freed ? NULL : inp); +} + +static int +create_server(struct adapter *sc, struct listen_ctx *lctx) { - int stid; struct mbuf *m; struct cpl_pass_open_req *req; - struct tom_data *d = TOM_DATA(dev); - struct inpcb *inp = so_sotoinpcb(so); - struct listen_ctx *ctx; + struct inpcb *inp = lctx->inp; - if (!TOM_TUNABLE(dev, activated)) - return; - - if (listen_hash_find(d, so) != -1) - return; - - CTR1(KTR_TOM, "start listen on port %u", ntohs(inp->inp_lport)); - ctx = malloc(sizeof(*ctx), M_CXGB, M_NOWAIT|M_ZERO); - - if (!ctx) - return; - - ctx->tom_data = d; - ctx->lso = so; - ctx->ulp_mode = TOM_TUNABLE(dev, ddp) && !(so_options_get(so) & SO_NO_DDP) ? ULP_MODE_TCPDDP : 0; - LIST_INIT(&ctx->synq_head); - - stid = cxgb_alloc_stid(d->cdev, d->client, ctx); - if (stid < 0) - goto free_ctx; - - m = m_gethdr(M_NOWAIT, MT_DATA); + m = M_GETHDR_OFLD(lctx->qset, CPL_PRIORITY_CONTROL, req); if (m == NULL) - goto free_stid; - m->m_pkthdr.len = m->m_len = sizeof(*req); - - if (!listen_hash_add(d, so, stid)) - goto free_all; + return (ENOMEM); - req = mtod(m, struct cpl_pass_open_req *); - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ, stid)); + req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); + OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ, lctx->stid)); req->local_port = inp->inp_lport; memcpy(&req->local_ip, &inp->inp_laddr, 4); req->peer_port = 0; @@ -284,60 +241,900 @@ t3_listen_start(struct toedev *dev, struct socket *so, struct t3cdev *cdev) req->opt0l = htonl(V_RCV_BUFSIZ(16)); req->opt1 = htonl(V_CONN_POLICY(CPL_CONN_POLICY_ASK)); - m_set_priority(m, CPL_PRIORITY_LISTEN); - cxgb_ofld_send(cdev, m); - return; + t3_offload_tx(sc, m); -free_all: - m_free(m); -free_stid: - cxgb_free_stid(cdev, stid); -#if 0 - sock_put(sk); -#endif -free_ctx: - free(ctx, M_CXGB); + return (0); +} + +static int +destroy_server(struct adapter *sc, struct listen_ctx *lctx) +{ + struct mbuf *m; + struct cpl_close_listserv_req *req; + + m = M_GETHDR_OFLD(lctx->qset, CPL_PRIORITY_CONTROL, req); + if (m == NULL) + return (ENOMEM); + + req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); + OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_LISTSRV_REQ, + lctx->stid)); + req->cpu_idx = 0; + + t3_offload_tx(sc, m); + + return (0); +} + +/* + * Process a CPL_CLOSE_LISTSRV_RPL message. If the status is good we release + * the STID. + */ +static int +do_close_server_rpl(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) +{ + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct cpl_close_listserv_rpl *rpl = mtod(m, void *); + unsigned int stid = GET_TID(rpl); + struct listen_ctx *lctx = lookup_stid(&td->tid_maps, stid); + struct inpcb *inp = lctx->inp; + + CTR3(KTR_CXGB, "%s: stid %u, status %u", __func__, stid, rpl->status); + + if (rpl->status != CPL_ERR_NONE) { + log(LOG_ERR, "%s: failed (%u) to close listener for stid %u", + __func__, rpl->status, stid); + } else { + INP_WLOCK(inp); + KASSERT(listen_hash_del(td, lctx->inp) == NULL, + ("%s: inp %p still in listen hash", __func__, inp)); + if (release_lctx(td, lctx) != NULL) + INP_WUNLOCK(inp); + } + + m_freem(m); + return (0); +} + +/* + * Process a CPL_PASS_OPEN_RPL message. Remove the lctx from the listen hash + * table and free it if there was any error, otherwise nothing to do. + */ +static int +do_pass_open_rpl(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) +{ + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct cpl_pass_open_rpl *rpl = mtod(m, void *); + int stid = GET_TID(rpl); + struct listen_ctx *lctx; + struct inpcb *inp; + + /* + * We get these replies also when setting up HW filters. Just throw + * those away. + */ + if (stid >= td->tid_maps.stid_base + td->tid_maps.nstids) + goto done; + + lctx = lookup_stid(&td->tid_maps, stid); + inp = lctx->inp; + + INP_WLOCK(inp); + + CTR4(KTR_CXGB, "%s: stid %u, status %u, flags 0x%x", + __func__, stid, rpl->status, lctx->flags); + + lctx->flags &= ~LCTX_RPL_PENDING; + + if (rpl->status != CPL_ERR_NONE) { + log(LOG_ERR, "%s: %s: hw listen (stid %d) failed: %d\n", + __func__, device_get_nameunit(sc->dev), stid, rpl->status); + } + +#ifdef INVARIANTS + /* + * If the inp has been dropped (listening socket closed) then + * listen_stop must have run and taken the inp out of the hash. + */ + if (inp->inp_flags & INP_DROPPED) { + KASSERT(listen_hash_del(td, inp) == NULL, + ("%s: inp %p still in listen hash", __func__, inp)); + } +#endif + + if (inp->inp_flags & INP_DROPPED && rpl->status != CPL_ERR_NONE) { + if (release_lctx(td, lctx) != NULL) + INP_WUNLOCK(inp); + goto done; + } + + /* + * Listening socket stopped listening earlier and now the chip tells us + * it has started the hardware listener. Stop it; the lctx will be + * released in do_close_server_rpl. + */ + if (inp->inp_flags & INP_DROPPED) { + destroy_server(sc, lctx); + INP_WUNLOCK(inp); + goto done; + } + + /* + * Failed to start hardware listener. Take inp out of the hash and + * release our reference on it. An error message has been logged + * already. + */ + if (rpl->status != CPL_ERR_NONE) { + listen_hash_del(td, inp); + if (release_lctx(td, lctx) != NULL) + INP_WUNLOCK(inp); + goto done; + } + + /* hardware listener open for business */ + + INP_WUNLOCK(inp); +done: + m_freem(m); + return (0); +} + +static void +pass_accept_req_to_protohdrs(const struct cpl_pass_accept_req *cpl, + struct in_conninfo *inc, struct tcphdr *th, struct tcpopt *to) +{ + const struct tcp_options *t3opt = &cpl->tcp_options; + + bzero(inc, sizeof(*inc)); + inc->inc_faddr.s_addr = cpl->peer_ip; + inc->inc_laddr.s_addr = cpl->local_ip; + inc->inc_fport = cpl->peer_port; + inc->inc_lport = cpl->local_port; + + bzero(th, sizeof(*th)); + th->th_sport = cpl->peer_port; + th->th_dport = cpl->local_port; + th->th_seq = be32toh(cpl->rcv_isn); /* as in tcp_fields_to_host */ + th->th_flags = TH_SYN; + + bzero(to, sizeof(*to)); + if (t3opt->mss) { + to->to_flags |= TOF_MSS; + to->to_mss = be16toh(t3opt->mss); + } + if (t3opt->wsf) { + to->to_flags |= TOF_SCALE; + to->to_wscale = t3opt->wsf; + } + if (t3opt->tstamp) + to->to_flags |= TOF_TS; + if (t3opt->sack) + to->to_flags |= TOF_SACKPERM; +} + +static inline void +hold_synqe(struct synq_entry *synqe) +{ + + refcount_acquire(&synqe->refcnt); +} + +static inline void +release_synqe(struct synq_entry *synqe) +{ + + if (refcount_release(&synqe->refcnt)) + m_freem(synqe->m); +} + +/* + * Use the trailing space in the mbuf in which the PASS_ACCEPT_REQ arrived to + * store some state temporarily. There will be enough room in the mbuf's + * trailing space as the CPL is not that large. + * + * XXX: bad hack. + */ +static struct synq_entry * +mbuf_to_synq_entry(struct mbuf *m) +{ + int len = roundup(sizeof (struct synq_entry), 8); + uint8_t *buf; + int buflen; + + if (__predict_false(M_TRAILINGSPACE(m) < len)) { + panic("%s: no room for synq_entry (%td, %d)\n", __func__, + M_TRAILINGSPACE(m), len); + } + + if (m->m_flags & M_EXT) { + buf = m->m_ext.ext_buf; + buflen = m->m_ext.ext_size; + } else if (m->m_flags & M_PKTHDR) { + buf = &m->m_pktdat[0]; + buflen = MHLEN; + } else { + buf = &m->m_dat[0]; + buflen = MLEN; + } + + return ((void *)(buf + buflen - len)); +} + +#ifdef KTR +#define REJECT_PASS_ACCEPT() do { \ + reject_reason = __LINE__; \ + goto reject; \ +} while (0) +#else +#define REJECT_PASS_ACCEPT() do { goto reject; } while (0) +#endif + +/* + * The context associated with a tid entry via insert_tid could be a synq_entry + * or a toepcb. The only way CPL handlers can tell is via a bit in these flags. + */ +CTASSERT(offsetof(struct toepcb, tp_flags) == offsetof(struct synq_entry, flags)); + +/* + * Handle a CPL_PASS_ACCEPT_REQ message. + */ +static int +do_pass_accept_req(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) +{ + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct toedev *tod = &td->tod; + const struct cpl_pass_accept_req *req = mtod(m, void *); + unsigned int stid = G_PASS_OPEN_TID(ntohl(req->tos_tid)); + unsigned int tid = GET_TID(req); + struct listen_ctx *lctx = lookup_stid(&td->tid_maps, stid); + struct l2t_entry *e = NULL; + struct sockaddr_in nam; + struct rtentry *rt; + struct inpcb *inp; + struct socket *so; + struct port_info *pi; + struct ifnet *ifp; + struct in_conninfo inc; + struct tcphdr th; + struct tcpopt to; + struct synq_entry *synqe = NULL; + int i; +#ifdef KTR + int reject_reason; +#endif + + CTR4(KTR_CXGB, "%s: stid %u, tid %u, lctx %p", __func__, stid, tid, + lctx); + + pass_accept_req_to_protohdrs(req, &inc, &th, &to); + + /* + * Don't offload if the interface that received the SYN doesn't have + * IFCAP_TOE enabled. + */ + pi = NULL; + for_each_port(sc, i) { + if (memcmp(sc->port[i].hw_addr, req->dst_mac, ETHER_ADDR_LEN)) + continue; + pi = &sc->port[i]; + break; + } + if (pi == NULL) + REJECT_PASS_ACCEPT(); + ifp = pi->ifp; + if ((ifp->if_capenable & IFCAP_TOE4) == 0) + REJECT_PASS_ACCEPT(); + + /* + * Don't offload if the outgoing interface for the route back to the + * peer is not the same as the interface that received the SYN. + */ + bzero(&nam, sizeof(nam)); + nam.sin_len = sizeof(nam); + nam.sin_family = AF_INET; + nam.sin_addr = inc.inc_faddr; + rt = rtalloc1((struct sockaddr *)&nam, 0, 0); + if (rt == NULL) + REJECT_PASS_ACCEPT(); + else { + struct sockaddr *nexthop; + + RT_UNLOCK(rt); + nexthop = rt->rt_flags & RTF_GATEWAY ? rt->rt_gateway : + (struct sockaddr *)&nam; + if (rt->rt_ifp == ifp) + e = t3_l2t_get(pi, rt->rt_ifp, nexthop); + RTFREE(rt); + if (e == NULL) + REJECT_PASS_ACCEPT(); /* no l2te, or ifp mismatch */ + } + + INP_INFO_WLOCK(&V_tcbinfo); + + /* Don't offload if the 4-tuple is already in use */ + if (toe_4tuple_check(&inc, &th, ifp) != 0) { + INP_INFO_WUNLOCK(&V_tcbinfo); + REJECT_PASS_ACCEPT(); + } + + inp = lctx->inp; /* listening socket (not owned by the TOE) */ + INP_WLOCK(inp); + if (__predict_false(inp->inp_flags & INP_DROPPED)) { + /* + * The listening socket has closed. The reply from the TOE to + * our CPL_CLOSE_LISTSRV_REQ will ultimately release all + * resources tied to this listen context. + */ + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + REJECT_PASS_ACCEPT(); + } + so = inp->inp_socket; + + /* Reuse the mbuf that delivered the CPL to us */ + synqe = mbuf_to_synq_entry(m); + synqe->flags = TP_IS_A_SYNQ_ENTRY; + synqe->m = m; + synqe->lctx = lctx; + synqe->tid = tid; + synqe->e = e; + synqe->opt0h = calc_opt0h(so, 0, 0, e); + synqe->qset = pi->first_qset + (arc4random() % pi->nqsets); + SOCKBUF_LOCK(&so->so_rcv); + synqe->rx_credits = min(select_rcv_wnd(so) >> 10, M_RCV_BUFSIZ); + SOCKBUF_UNLOCK(&so->so_rcv); + refcount_init(&synqe->refcnt, 1); + atomic_store_rel_int(&synqe->reply, RPL_OK); + + insert_tid(td, synqe, tid); + TAILQ_INSERT_TAIL(&lctx->synq, synqe, link); + hold_synqe(synqe); + hold_lctx(lctx); + + /* syncache_add releases both pcbinfo and pcb locks */ + toe_syncache_add(&inc, &to, &th, inp, tod, synqe); + INP_UNLOCK_ASSERT(inp); + INP_INFO_UNLOCK_ASSERT(&V_tcbinfo); + + /* + * If we replied during syncache_add (reply is RPL_DONE), good. + * Otherwise (reply is unchanged - RPL_OK) it's no longer ok to reply. + * The mbuf will stick around as long as the entry is in the syncache. + * The kernel is free to retry syncache_respond but we'll ignore it due + * to RPL_DONT. + */ + if (atomic_cmpset_int(&synqe->reply, RPL_OK, RPL_DONT)) { + + INP_WLOCK(inp); + if (__predict_false(inp->inp_flags & INP_DROPPED)) { + /* listener closed. synqe must have been aborted. */ + KASSERT(synqe->flags & TP_ABORT_SHUTDOWN, + ("%s: listener %p closed but synqe %p not aborted", + __func__, inp, synqe)); + + CTR5(KTR_CXGB, + "%s: stid %u, tid %u, lctx %p, synqe %p, ABORTED", + __func__, stid, tid, lctx, synqe); + INP_WUNLOCK(inp); + release_synqe(synqe); + return (__LINE__); + } + + KASSERT(!(synqe->flags & TP_ABORT_SHUTDOWN), + ("%s: synqe %p aborted, but listener %p not dropped.", + __func__, synqe, inp)); + + TAILQ_REMOVE(&lctx->synq, synqe, link); + release_synqe(synqe); /* removed from synq list */ + inp = release_lctx(td, lctx); + if (inp) + INP_WUNLOCK(inp); + + release_synqe(synqe); /* about to exit function */ + REJECT_PASS_ACCEPT(); + } + + KASSERT(synqe->reply == RPL_DONE, + ("%s: reply %d", __func__, synqe->reply)); + + CTR3(KTR_CXGB, "%s: stid %u, tid %u, OK", __func__, stid, tid); + release_synqe(synqe); + return (0); + +reject: + CTR4(KTR_CXGB, "%s: stid %u, tid %u, REJECT (%d)", __func__, stid, tid, + reject_reason); + + if (synqe == NULL) + m_freem(m); + if (e) + l2t_release(td->l2t, e); + queue_tid_release(tod, tid); + + return (0); +} + +static void +pass_establish_to_protohdrs(const struct cpl_pass_establish *cpl, + struct in_conninfo *inc, struct tcphdr *th, struct tcpopt *to) +{ + uint16_t tcp_opt = be16toh(cpl->tcp_opt); + + bzero(inc, sizeof(*inc)); + inc->inc_faddr.s_addr = cpl->peer_ip; + inc->inc_laddr.s_addr = cpl->local_ip; + inc->inc_fport = cpl->peer_port; + inc->inc_lport = cpl->local_port; + + bzero(th, sizeof(*th)); + th->th_sport = cpl->peer_port; + th->th_dport = cpl->local_port; + th->th_flags = TH_ACK; + th->th_seq = be32toh(cpl->rcv_isn); /* as in tcp_fields_to_host */ + th->th_ack = be32toh(cpl->snd_isn); /* ditto */ + + bzero(to, sizeof(*to)); + if (G_TCPOPT_TSTAMP(tcp_opt)) + to->to_flags |= TOF_TS; +} + +/* + * Process a CPL_PASS_ESTABLISH message. The T3 has already established a + * connection and we need to do the software side setup. + */ +static int +do_pass_establish(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) +{ + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct cpl_pass_establish *cpl = mtod(m, void *); + struct toedev *tod = &td->tod; + unsigned int tid = GET_TID(cpl); + struct synq_entry *synqe = lookup_tid(&td->tid_maps, tid); + struct toepcb *toep; + struct socket *so; + struct listen_ctx *lctx = synqe->lctx; + struct inpcb *inp = lctx->inp; + struct tcpopt to; + struct tcphdr th; + struct in_conninfo inc; +#ifdef KTR + int stid = G_PASS_OPEN_TID(ntohl(cpl->tos_tid)); +#endif + + CTR5(KTR_CXGB, "%s: stid %u, tid %u, lctx %p, inp_flags 0x%x", + __func__, stid, tid, lctx, inp->inp_flags); + + KASSERT(qs->idx == synqe->qset, + ("%s qset mismatch %d %d", __func__, qs->idx, synqe->qset)); + + INP_INFO_WLOCK(&V_tcbinfo); /* for syncache_expand */ + INP_WLOCK(inp); + + if (__predict_false(inp->inp_flags & INP_DROPPED)) { + /* + * The listening socket has closed. The TOM must have aborted + * all the embryonic connections (including this one) that were + * on the lctx's synq. do_abort_rpl for the tid is responsible + * for cleaning up. + */ + KASSERT(synqe->flags & TP_ABORT_SHUTDOWN, + ("%s: listen socket dropped but tid %u not aborted.", + __func__, tid)); + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + m_freem(m); + return (0); + } + + pass_establish_to_protohdrs(cpl, &inc, &th, &to); + + /* Lie in order to pass the checks in syncache_expand */ + to.to_tsecr = synqe->ts; + th.th_ack = synqe->iss + 1; + + toep = toepcb_alloc(tod); + if (toep == NULL) { +reset: + t3_send_reset_synqe(tod, synqe); + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + m_freem(m); + return (0); + } + toep->tp_qset = qs->idx; + toep->tp_l2t = synqe->e; + toep->tp_tid = tid; + toep->tp_rx_credits = synqe->rx_credits; + + synqe->toep = toep; + synqe->cpl = cpl; + + so = inp->inp_socket; + if (!toe_syncache_expand(&inc, &to, &th, &so) || so == NULL) { + toepcb_free(toep); + goto reset; + } + + /* Remove the synq entry and release its reference on the lctx */ + TAILQ_REMOVE(&lctx->synq, synqe, link); + inp = release_lctx(td, lctx); + if (inp) + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + release_synqe(synqe); + + m_freem(m); + return (0); +} + +void +t3_init_listen_cpl_handlers(struct adapter *sc) +{ + t3_register_cpl_handler(sc, CPL_PASS_OPEN_RPL, do_pass_open_rpl); + t3_register_cpl_handler(sc, CPL_CLOSE_LISTSRV_RPL, do_close_server_rpl); + t3_register_cpl_handler(sc, CPL_PASS_ACCEPT_REQ, do_pass_accept_req); + t3_register_cpl_handler(sc, CPL_PASS_ESTABLISH, do_pass_establish); +} + +/* + * Start a listening server by sending a passive open request to HW. + * + * Can't take adapter lock here and access to sc->flags, sc->open_device_map, + * sc->offload_map, if_capenable are all race prone. + */ +int +t3_listen_start(struct toedev *tod, struct tcpcb *tp) +{ + struct tom_data *td = t3_tomdata(tod); + struct adapter *sc = tod->tod_softc; + struct port_info *pi; + struct inpcb *inp = tp->t_inpcb; + struct listen_ctx *lctx; + int i; + + INP_WLOCK_ASSERT(inp); + + if ((inp->inp_vflag & INP_IPV4) == 0) + return (0); + +#ifdef notyet + ADAPTER_LOCK(sc); + if (IS_BUSY(sc)) { + log(LOG_ERR, "%s: listen request ignored, %s is busy", + __func__, device_get_nameunit(sc->dev)); + goto done; + } + + KASSERT(sc->flags & TOM_INIT_DONE, + ("%s: TOM not initialized", __func__)); +#endif + + if ((sc->open_device_map & sc->offload_map) == 0) + goto done; /* no port that's UP with IFCAP_TOE enabled */ + + /* + * Find a running port with IFCAP_TOE4. We'll use the first such port's + * queues to send the passive open and receive the reply to it. + * + * XXX: need a way to mark an port in use by offload. if_cxgbe should + * then reject any attempt to bring down such a port (and maybe reject + * attempts to disable IFCAP_TOE on that port too?). + */ + for_each_port(sc, i) { + if (isset(&sc->open_device_map, i) && + sc->port[i].ifp->if_capenable & IFCAP_TOE4) + break; + } + KASSERT(i < sc->params.nports, + ("%s: no running port with TOE capability enabled.", __func__)); + pi = &sc->port[i]; + + if (listen_hash_find(td, inp) != NULL) + goto done; /* already setup */ + + lctx = alloc_lctx(td, inp, pi->first_qset); + if (lctx == NULL) { + log(LOG_ERR, + "%s: listen request ignored, %s couldn't allocate lctx\n", + __func__, device_get_nameunit(sc->dev)); + goto done; + } + listen_hash_add(td, lctx); + + CTR5(KTR_CXGB, "%s: stid %u (%s), lctx %p, inp %p", __func__, + lctx->stid, tcpstates[tp->t_state], lctx, inp); + + if (create_server(sc, lctx) != 0) { + log(LOG_ERR, "%s: %s failed to create hw listener.\n", __func__, + device_get_nameunit(sc->dev)); + (void) listen_hash_del(td, inp); + inp = release_lctx(td, lctx); + /* can't be freed, host stack has a reference */ + KASSERT(inp != NULL, ("%s: inp freed", __func__)); + goto done; + } + lctx->flags |= LCTX_RPL_PENDING; +done: +#ifdef notyet + ADAPTER_UNLOCK(sc); +#endif + return (0); } /* * Stop a listening server by sending a close_listsvr request to HW. * The server TID is freed when we get the reply. */ -void -t3_listen_stop(struct toedev *dev, struct socket *so, struct t3cdev *cdev) +int +t3_listen_stop(struct toedev *tod, struct tcpcb *tp) { - struct mbuf *m; - struct cpl_close_listserv_req *req; struct listen_ctx *lctx; - int stid = listen_hash_del(TOM_DATA(dev), so); - - if (stid < 0) + struct adapter *sc = tod->tod_softc; + struct tom_data *td = t3_tomdata(tod); + struct inpcb *inp = tp->t_inpcb; + struct synq_entry *synqe; + + INP_WLOCK_ASSERT(inp); + + lctx = listen_hash_del(td, inp); + if (lctx == NULL) + return (ENOENT); /* no hardware listener for this inp */ + + CTR4(KTR_CXGB, "%s: stid %u, lctx %p, flags %x", __func__, lctx->stid, + lctx, lctx->flags); + + /* + * If the reply to the PASS_OPEN is still pending we'll wait for it to + * arrive and clean up when it does. + */ + if (lctx->flags & LCTX_RPL_PENDING) { + KASSERT(TAILQ_EMPTY(&lctx->synq), + ("%s: synq not empty.", __func__)); + return (EINPROGRESS); + } + + /* + * The host stack will abort all the connections on the listening + * socket's so_comp. It doesn't know about the connections on the synq + * so we need to take care of those. + */ + TAILQ_FOREACH(synqe, &lctx->synq, link) { + KASSERT(synqe->lctx == lctx, ("%s: synq corrupt", __func__)); + t3_send_reset_synqe(tod, synqe); + } + + destroy_server(sc, lctx); + return (0); +} + +void +t3_syncache_added(struct toedev *tod __unused, void *arg) +{ + struct synq_entry *synqe = arg; + + hold_synqe(synqe); +} + +void +t3_syncache_removed(struct toedev *tod __unused, void *arg) +{ + struct synq_entry *synqe = arg; + + release_synqe(synqe); +} + +/* XXX */ +extern void tcp_dooptions(struct tcpopt *, u_char *, int, int); + +int +t3_syncache_respond(struct toedev *tod, void *arg, struct mbuf *m) +{ + struct adapter *sc = tod->tod_softc; + struct synq_entry *synqe = arg; + struct l2t_entry *e = synqe->e; + struct ip *ip = mtod(m, struct ip *); + struct tcphdr *th = (void *)(ip + 1); + struct cpl_pass_accept_rpl *rpl; + struct mbuf *r; + struct listen_ctx *lctx = synqe->lctx; + struct tcpopt to; + int mtu_idx, cpu_idx; + + /* + * The first time we run it's during the call to syncache_add. That's + * the only one we care about. + */ + if (atomic_cmpset_int(&synqe->reply, RPL_OK, RPL_DONE) == 0) + goto done; /* reply to the CPL only if it's ok to do so */ + + r = M_GETHDR_OFLD(lctx->qset, CPL_PRIORITY_CONTROL, rpl); + if (r == NULL) + goto done; + + /* + * Use only the provided mbuf (with ip and tcp headers) and what's in + * synqe. Avoid looking at the listening socket (lctx->inp) here. + * + * XXX: if the incoming SYN had the TCP timestamp option but the kernel + * decides it doesn't want to use TCP timestamps we have no way of + * relaying this info to the chip on a per-tid basis (all we have is a + * global knob). + */ + bzero(&to, sizeof(to)); + tcp_dooptions(&to, (void *)(th + 1), (th->th_off << 2) - sizeof(*th), + TO_SYN); + + /* stash them for later */ + synqe->iss = be32toh(th->th_seq); + synqe->ts = to.to_tsval; + + mtu_idx = find_best_mtu_idx(sc, NULL, to.to_mss); + cpu_idx = sc->rrss_map[synqe->qset]; + + rpl->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); + rpl->wr.wrh_lo = 0; + OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_PASS_ACCEPT_RPL, synqe->tid)); + rpl->opt2 = calc_opt2(cpu_idx); + rpl->rsvd = rpl->opt2; /* workaround for HW bug */ + rpl->peer_ip = ip->ip_dst.s_addr; + rpl->opt0h = synqe->opt0h | + calc_opt0h(NULL, mtu_idx, to.to_wscale, NULL); + rpl->opt0l_status = htobe32(CPL_PASS_OPEN_ACCEPT) | + calc_opt0l(NULL, synqe->rx_credits); + + l2t_send(sc, r, e); +done: + m_freem(m); + return (0); +} + +int +do_abort_req_synqe(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) +{ + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct toedev *tod = &td->tod; + const struct cpl_abort_req_rss *req = mtod(m, void *); + unsigned int tid = GET_TID(req); + struct synq_entry *synqe = lookup_tid(&td->tid_maps, tid); + struct listen_ctx *lctx = synqe->lctx; + struct inpcb *inp = lctx->inp; + + KASSERT(synqe->flags & TP_IS_A_SYNQ_ENTRY, + ("%s: !SYNQ_ENTRY", __func__)); + + CTR6(KTR_CXGB, "%s: tid %u, synqe %p (%x), lctx %p, status %d", + __func__, tid, synqe, synqe->flags, synqe->lctx, req->status); + + INP_WLOCK(inp); + + if (!(synqe->flags & TP_ABORT_REQ_RCVD)) { + synqe->flags |= TP_ABORT_REQ_RCVD; + synqe->flags |= TP_ABORT_SHUTDOWN; + INP_WUNLOCK(inp); + m_freem(m); + return (0); + } + synqe->flags &= ~TP_ABORT_REQ_RCVD; + + /* + * If we'd sent a reset on this synqe, we'll ignore this and clean up in + * the T3's reply to our reset instead. + */ + if (synqe->flags & TP_ABORT_RPL_PENDING) { + synqe->flags |= TP_ABORT_RPL_SENT; + INP_WUNLOCK(inp); + } else { + TAILQ_REMOVE(&lctx->synq, synqe, link); + inp = release_lctx(td, lctx); + if (inp) + INP_WUNLOCK(inp); + release_tid(tod, tid, qs->idx); + l2t_release(td->l2t, synqe->e); + release_synqe(synqe); + } + + send_abort_rpl(tod, tid, qs->idx); + m_freem(m); + return (0); +} + +int +do_abort_rpl_synqe(struct sge_qset *qs, struct rsp_desc *r, struct mbuf *m) +{ + struct adapter *sc = qs->adap; + struct tom_data *td = sc->tom_softc; + struct toedev *tod = &td->tod; + const struct cpl_abort_rpl_rss *rpl = mtod(m, void *); + unsigned int tid = GET_TID(rpl); + struct synq_entry *synqe = lookup_tid(&td->tid_maps, tid); + struct listen_ctx *lctx = synqe->lctx; + struct inpcb *inp = lctx->inp; + + CTR3(KTR_CXGB, "%s: tid %d, synqe %p, status %d", tid, synqe, + rpl->status); + + INP_WLOCK(inp); + + if (synqe->flags & TP_ABORT_RPL_PENDING) { + if (!(synqe->flags & TP_ABORT_RPL_RCVD)) { + synqe->flags |= TP_ABORT_RPL_RCVD; + INP_WUNLOCK(inp); + } else { + synqe->flags &= ~TP_ABORT_RPL_RCVD; + synqe->flags &= TP_ABORT_RPL_PENDING; + + TAILQ_REMOVE(&lctx->synq, synqe, link); + inp = release_lctx(td, lctx); + if (inp) + INP_WUNLOCK(inp); + release_tid(tod, tid, qs->idx); + l2t_release(td->l2t, synqe->e); + release_synqe(synqe); + } + } + + m_freem(m); + return (0); +} + +static void +t3_send_reset_synqe(struct toedev *tod, struct synq_entry *synqe) +{ + struct cpl_abort_req *req; + unsigned int tid = synqe->tid; + struct adapter *sc = tod->tod_softc; + struct mbuf *m; +#ifdef INVARIANTS + struct listen_ctx *lctx = synqe->lctx; + struct inpcb *inp = lctx->inp; +#endif + + INP_WLOCK_ASSERT(inp); + + CTR4(KTR_CXGB, "%s: tid %d, synqe %p (%x)", __func__, tid, synqe, + synqe->flags); + + if (synqe->flags & TP_ABORT_SHUTDOWN) return; - lctx = cxgb_get_lctx(cdev, stid); - /* - * Do this early so embryonic connections are marked as being aborted - * while the stid is still open. This ensures pass_establish messages - * that arrive while we are closing the server will be able to locate - * the listening socket. - */ - t3_reset_synq(lctx); + synqe->flags |= (TP_ABORT_RPL_PENDING | TP_ABORT_SHUTDOWN); - /* Send the close ASAP to stop further passive opens */ - m = m_gethdr(M_NOWAIT, MT_DATA); - if (m == NULL) { - /* - * XXX allocate from lowmem cache - */ - } - m->m_pkthdr.len = m->m_len = sizeof(*req); + m = M_GETHDR_OFLD(synqe->qset, CPL_PRIORITY_DATA, req); + if (m == NULL) + CXGB_UNIMPLEMENTED(); - req = mtod(m, struct cpl_close_listserv_req *); - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_LISTSRV_REQ, stid)); - req->cpu_idx = 0; - m_set_priority(m, CPL_PRIORITY_LISTEN); - cxgb_ofld_send(cdev, m); + req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_HOST_ABORT_CON_REQ)); + req->wr.wrh_lo = htonl(V_WR_TID(tid)); + OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_ABORT_REQ, tid)); + req->rsvd0 = 0; + req->rsvd1 = !(synqe->flags & TP_DATASENT); + req->cmd = CPL_ABORT_SEND_RST; - t3_disconnect_acceptq(so); + l2t_send(sc, m, synqe->e); } + +void +t3_offload_socket(struct toedev *tod, void *arg, struct socket *so) +{ + struct adapter *sc = tod->tod_softc; + struct tom_data *td = sc->tom_softc; + struct synq_entry *synqe = arg; +#ifdef INVARIANTS + struct inpcb *inp = sotoinpcb(so); +#endif + struct cpl_pass_establish *cpl = synqe->cpl; + struct toepcb *toep = synqe->toep; + + INP_INFO_LOCK_ASSERT(&V_tcbinfo); /* prevents bad race with accept() */ + INP_WLOCK_ASSERT(inp); + + offload_socket(so, toep); + make_established(so, cpl->snd_isn, cpl->rcv_isn, cpl->tcp_opt); + update_tid(td, toep, synqe->tid); +} +#endif diff --git a/sys/dev/cxgb/ulp/tom/cxgb_t3_ddp.h b/sys/dev/cxgb/ulp/tom/cxgb_t3_ddp.h deleted file mode 100644 index d6f98042233..00000000000 --- a/sys/dev/cxgb/ulp/tom/cxgb_t3_ddp.h +++ /dev/null @@ -1,181 +0,0 @@ -/************************************************************************** - -Copyright (c) 2007, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - -$FreeBSD$ - -***************************************************************************/ - -#ifndef T3_DDP_H -#define T3_DDP_H - -/* Should be 1 or 2 indicating single or double kernel buffers. */ -#define NUM_DDP_KBUF 2 - -/* min receive window for a connection to be considered for DDP */ -#define MIN_DDP_RCV_WIN (48 << 10) - -/* amount of Rx window not available to DDP to avoid window exhaustion */ -#define DDP_RSVD_WIN (16 << 10) - -/* # of sentinel invalid page pods at the end of a group of valid page pods */ -#define NUM_SENTINEL_PPODS 0 - -/* # of pages a pagepod can hold without needing another pagepod */ -#define PPOD_PAGES 4 - -/* page pods are allocated in groups of this size (must be power of 2) */ -#define PPOD_CLUSTER_SIZE 16 - -/* for each TID we reserve this many page pods up front */ -#define RSVD_PPODS_PER_TID 1 - -struct pagepod { - uint32_t pp_vld_tid; - uint32_t pp_pgsz_tag_color; - uint32_t pp_max_offset; - uint32_t pp_page_offset; - uint64_t pp_rsvd; - uint64_t pp_addr[5]; -}; - -#define PPOD_SIZE sizeof(struct pagepod) - -#define S_PPOD_TID 0 -#define M_PPOD_TID 0xFFFFFF -#define V_PPOD_TID(x) ((x) << S_PPOD_TID) - -#define S_PPOD_VALID 24 -#define V_PPOD_VALID(x) ((x) << S_PPOD_VALID) -#define F_PPOD_VALID V_PPOD_VALID(1U) - -#define S_PPOD_COLOR 0 -#define M_PPOD_COLOR 0x3F -#define V_PPOD_COLOR(x) ((x) << S_PPOD_COLOR) - -#define S_PPOD_TAG 6 -#define M_PPOD_TAG 0xFFFFFF -#define V_PPOD_TAG(x) ((x) << S_PPOD_TAG) - -#define S_PPOD_PGSZ 30 -#define M_PPOD_PGSZ 0x3 -#define V_PPOD_PGSZ(x) ((x) << S_PPOD_PGSZ) - -#include -#include -#include - -/* DDP gather lists can specify an offset only for the first page. */ -struct ddp_gather_list { - unsigned int dgl_length; - unsigned int dgl_offset; - unsigned int dgl_nelem; - vm_page_t dgl_pages[0]; -}; - -struct ddp_buf_state { - unsigned int cur_offset; /* offset of latest DDP notification */ - unsigned int flags; - struct ddp_gather_list *gl; -}; - -struct ddp_state { - struct ddp_buf_state buf_state[2]; /* per buffer state */ - int cur_buf; - unsigned short kbuf_noinval; - unsigned short kbuf_idx; /* which HW buffer is used for kbuf */ - struct ddp_gather_list *ubuf; - int user_ddp_pending; - unsigned int ubuf_nppods; /* # of page pods for buffer 1 */ - unsigned int ubuf_tag; - unsigned int ubuf_ddp_ready; - int cancel_ubuf; - int get_tcb_count; - unsigned int kbuf_posted; - unsigned int kbuf_nppods[NUM_DDP_KBUF]; - unsigned int kbuf_tag[NUM_DDP_KBUF]; - struct ddp_gather_list *kbuf[NUM_DDP_KBUF]; /* kernel buffer for DDP prefetch */ -}; - -/* buf_state flags */ -enum { - DDP_BF_NOINVAL = 1 << 0, /* buffer is set to NO_INVALIDATE */ - DDP_BF_NOCOPY = 1 << 1, /* DDP to final dest, no copy needed */ - DDP_BF_NOFLIP = 1 << 2, /* buffer flips after GET_TCB_RPL */ - DDP_BF_PSH = 1 << 3, /* set in skb->flags if the a DDP was - completed with a segment having the - PSH flag set */ - DDP_BF_NODATA = 1 << 4, /* buffer completed before filling */ -}; - -#include -struct sockbuf; - -/* - * Returns 1 if a UBUF DMA buffer might be active. - */ -static inline int -t3_ddp_ubuf_pending(struct toepcb *toep) -{ - struct ddp_state *p = &toep->tp_ddp_state; - - /* When the TOM_TUNABLE(ddp) is enabled, we're always in ULP_MODE DDP, - * but DDP_STATE() is only valid if the connection actually enabled - * DDP. - */ - if (p->kbuf[0] == NULL) - return (0); - - return (p->buf_state[0].flags & (DDP_BF_NOFLIP | DDP_BF_NOCOPY)) || - (p->buf_state[1].flags & (DDP_BF_NOFLIP | DDP_BF_NOCOPY)); -} - -int t3_setup_ppods(struct toepcb *toep, const struct ddp_gather_list *gl, - unsigned int nppods, unsigned int tag, unsigned int maxoff, - unsigned int pg_off, unsigned int color); -int t3_alloc_ppods(struct tom_data *td, unsigned int n, int *tag); -void t3_free_ppods(struct tom_data *td, unsigned int tag, unsigned int n); -void t3_free_ddp_gl(struct ddp_gather_list *gl); -int t3_ddp_copy(const struct mbuf *m, int offset, struct uio *uio, int len); -//void t3_repost_kbuf(struct socket *so, int modulate, int activate); -void t3_post_kbuf(struct toepcb *toep, int modulate, int nonblock); -int t3_post_ubuf(struct toepcb *toep, const struct uio *uio, int nonblock, - int rcv_flags, int modulate, int post_kbuf); -void t3_cancel_ubuf(struct toepcb *toep, struct sockbuf *rcv); -int t3_overlay_ubuf(struct toepcb *toep, struct sockbuf *rcv, - const struct uio *uio, int nonblock, - int rcv_flags, int modulate, int post_kbuf); -int t3_enter_ddp(struct toepcb *toep, unsigned int kbuf_size, unsigned int waitall, int nonblock); -void t3_cleanup_ddp(struct toepcb *toep); -void t3_release_ddp_resources(struct toepcb *toep); -void t3_cancel_ddpbuf(struct toepcb *, unsigned int bufidx); -void t3_overlay_ddpbuf(struct toepcb *, unsigned int bufidx, unsigned int tag0, - unsigned int tag1, unsigned int len); -void t3_setup_ddpbufs(struct toepcb *, unsigned int len0, unsigned int offset0, - unsigned int len1, unsigned int offset1, - uint64_t ddp_flags, uint64_t flag_mask, int modulate); -#endif /* T3_DDP_H */ diff --git a/sys/dev/cxgb/ulp/tom/cxgb_tcp.h b/sys/dev/cxgb/ulp/tom/cxgb_tcp.h deleted file mode 100644 index 3042ef00b0f..00000000000 --- a/sys/dev/cxgb/ulp/tom/cxgb_tcp.h +++ /dev/null @@ -1,47 +0,0 @@ - -/*- - * Copyright (c) 2007, Chelsio Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Neither the name of the Chelsio Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ -#ifndef CXGB_TCP_H_ -#define CXGB_TCP_H_ -#ifdef TCP_USRREQS_OVERLOAD -struct tcpcb *cxgb_tcp_drop(struct tcpcb *tp, int errno); -#else -#define cxgb_tcp_drop tcp_drop -#endif -void cxgb_tcp_ctlinput(int cmd, struct sockaddr *sa, void *vip); -struct tcpcb *cxgb_tcp_close(struct tcpcb *tp); - -extern struct pr_usrreqs cxgb_tcp_usrreqs; -#ifdef INET6 -extern struct pr_usrreqs cxgb_tcp6_usrreqs; -#endif - -#include -SYSCTL_DECL(_net_inet_tcp_cxgb); -#endif /* CXGB_TCP_H_ */ diff --git a/sys/dev/cxgb/ulp/tom/cxgb_tcp_offload.c b/sys/dev/cxgb/ulp/tom/cxgb_tcp_offload.c deleted file mode 100644 index 6cb61074821..00000000000 --- a/sys/dev/cxgb/ulp/tom/cxgb_tcp_offload.c +++ /dev/null @@ -1,97 +0,0 @@ -/*- - * Copyright (c) 2007, Chelsio Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Neither the name of the Chelsio Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -/* - * grab bag of accessor routines that will either be moved to netinet - * or removed - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - - -/* - * This file contains code as a short-term staging area before it is moved in - * to sys/netinet/tcp_offload.c - */ - -void -sockbuf_lock(struct sockbuf *sb) -{ - - SOCKBUF_LOCK(sb); -} - -void -sockbuf_lock_assert(struct sockbuf *sb) -{ - - SOCKBUF_LOCK_ASSERT(sb); -} - -void -sockbuf_unlock(struct sockbuf *sb) -{ - - SOCKBUF_UNLOCK(sb); -} - -int -sockbuf_sbspace(struct sockbuf *sb) -{ - - return (sbspace(sb)); -} - diff --git a/sys/dev/cxgb/ulp/tom/cxgb_tcp_offload.h b/sys/dev/cxgb/ulp/tom/cxgb_tcp_offload.h deleted file mode 100644 index 2b516d7492f..00000000000 --- a/sys/dev/cxgb/ulp/tom/cxgb_tcp_offload.h +++ /dev/null @@ -1,14 +0,0 @@ -/* $FreeBSD$ */ - -#ifndef CXGB_TCP_OFFLOAD_H_ -#define CXGB_TCP_OFFLOAD_H_ - -struct sockbuf; - -void sockbuf_lock(struct sockbuf *); -void sockbuf_lock_assert(struct sockbuf *); -void sockbuf_unlock(struct sockbuf *); -int sockbuf_sbspace(struct sockbuf *); - - -#endif /* CXGB_TCP_OFFLOAD_H_ */ diff --git a/sys/dev/cxgb/ulp/tom/cxgb_toepcb.h b/sys/dev/cxgb/ulp/tom/cxgb_toepcb.h index 1b28e965a18..d0046c86a09 100644 --- a/sys/dev/cxgb/ulp/tom/cxgb_toepcb.h +++ b/sys/dev/cxgb/ulp/tom/cxgb_toepcb.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2007-2008, Chelsio Inc. + * Copyright (c) 2007-2009, Chelsio Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,88 +32,63 @@ #include #include +#define TP_DATASENT (1 << 0) +#define TP_TX_WAIT_IDLE (1 << 1) +#define TP_FIN_SENT (1 << 2) +#define TP_ABORT_RPL_PENDING (1 << 3) +#define TP_ABORT_SHUTDOWN (1 << 4) +#define TP_ABORT_RPL_RCVD (1 << 5) +#define TP_ABORT_REQ_RCVD (1 << 6) +#define TP_ATTACHED (1 << 7) +#define TP_CPL_DONE (1 << 8) +#define TP_IS_A_SYNQ_ENTRY (1 << 9) +#define TP_ABORT_RPL_SENT (1 << 10) +#define TP_SEND_FIN (1 << 11) + struct toepcb { - struct toedev *tp_toedev; + TAILQ_ENTRY(toepcb) link; /* toep_list */ + int tp_flags; + struct toedev *tp_tod; struct l2t_entry *tp_l2t; - unsigned int tp_tid; + int tp_tid; int tp_wr_max; int tp_wr_avail; int tp_wr_unacked; int tp_delack_mode; - int tp_mtu_idx; int tp_ulp_mode; - int tp_qset_idx; - int tp_mss_clamp; int tp_qset; - int tp_flags; - int tp_enqueued_bytes; - int tp_page_count; - int tp_state; + int tp_enqueued; + int tp_rx_credits; - tcp_seq tp_iss; - tcp_seq tp_delack_seq; - tcp_seq tp_rcv_wup; - tcp_seq tp_copied_seq; - uint64_t tp_write_seq; + struct inpcb *tp_inp; + struct mbuf *tp_m_last; - volatile int tp_refcount; - vm_page_t *tp_pages; - - struct tcpcb *tp_tp; - struct mbuf *tp_m_last; - bus_dma_tag_t tp_tx_dmat; - bus_dma_tag_t tp_rx_dmat; - bus_dmamap_t tp_dmamap; - - LIST_ENTRY(toepcb) synq_entry; struct mbuf_head wr_list; struct mbuf_head out_of_order_queue; - struct ddp_state tp_ddp_state; - struct cv tp_cv; - }; static inline void reset_wr_list(struct toepcb *toep) { - mbufq_init(&toep->wr_list); } -static inline void -purge_wr_queue(struct toepcb *toep) -{ - struct mbuf *m; - - while ((m = mbufq_dequeue(&toep->wr_list)) != NULL) - m_freem(m); -} - static inline void enqueue_wr(struct toepcb *toep, struct mbuf *m) { - mbufq_tail(&toep->wr_list, m); } static inline struct mbuf * peek_wr(const struct toepcb *toep) { - return (mbufq_peek(&toep->wr_list)); } static inline struct mbuf * dequeue_wr(struct toepcb *toep) { - return (mbufq_dequeue(&toep->wr_list)); } -#define wr_queue_walk(toep, m) \ - for (m = peek_wr(toep); m; m = m->m_nextpkt) - - - #endif - diff --git a/sys/dev/cxgb/ulp/tom/cxgb_tom.c b/sys/dev/cxgb/ulp/tom/cxgb_tom.c index 1328044b378..8f0dd25ba01 100644 --- a/sys/dev/cxgb/ulp/tom/cxgb_tom.c +++ b/sys/dev/cxgb/ulp/tom/cxgb_tom.c @@ -1,261 +1,106 @@ -/************************************************************************** - -Copyright (c) 2007, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -***************************************************************************/ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * Written by: Navdeep Parhar + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + #include -#include +#include #include -#include -#include -#include -#include -#include -#include +#include +#include #include -#include -#include #include -#include -#include -#include -#include #include - -#include -#include - #include -#include -#include -#include - -#include -#include - -#include - -#include #include -#include -#include -#include +#include -#include +#ifdef TCP_OFFLOAD +#include "cxgb_include.h" +#include "ulp/tom/cxgb_tom.h" +#include "ulp/tom/cxgb_l2t.h" +#include "ulp/tom/cxgb_toepcb.h" -#include -#include +MALLOC_DEFINE(M_CXGB, "cxgb", "Chelsio T3 Offload services"); -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +/* Module ops */ +static int t3_tom_mod_load(void); +static int t3_tom_mod_unload(void); +static int t3_tom_modevent(module_t, int, void *); +/* ULD ops and helpers */ +static int t3_tom_activate(struct adapter *); +static int t3_tom_deactivate(struct adapter *); -TAILQ_HEAD(, adapter) adapter_list; -static struct rwlock adapter_list_lock; +static int alloc_tid_tabs(struct tid_info *, u_int, u_int, u_int, u_int, u_int); +static void free_tid_tabs(struct tid_info *); +static int write_smt_entry(struct adapter *, int); +static void free_tom_data(struct tom_data *); -static TAILQ_HEAD(, tom_data) cxgb_list; -static struct mtx cxgb_list_lock; -static const unsigned int MAX_ATIDS = 64 * 1024; -static const unsigned int ATID_BASE = 0x100000; - -static int t3_toe_attach(struct toedev *dev, const struct offload_id *entry); -static void cxgb_register_listeners(void); -static void t3c_tom_add(struct t3cdev *cdev); - -/* - * Handlers for each CPL opcode - */ -static cxgb_cpl_handler_func tom_cpl_handlers[256]; - - -static eventhandler_tag listen_tag; - -static struct offload_id t3_toe_id_tab[] = { - { TOE_ID_CHELSIO_T3, 0 }, - { TOE_ID_CHELSIO_T3B, 0 }, - { TOE_ID_CHELSIO_T3C, 0 }, - { 0 } +static struct uld_info tom_uld_info = { + .uld_id = ULD_TOM, + .activate = t3_tom_activate, + .deactivate = t3_tom_deactivate, }; -static struct tom_info t3_tom_info = { - .ti_attach = t3_toe_attach, - .ti_id_table = t3_toe_id_tab, - .ti_name = "Chelsio-T3" -}; - -struct cxgb_client t3c_tom_client = { - .name = "tom_cxgb3", - .add = t3c_tom_add, - .remove = NULL, - .handlers = tom_cpl_handlers, - .redirect = NULL -}; - -void -cxgb_log_tcb(struct adapter *sc, unsigned int tid) -{ - - char buf[TCB_SIZE]; - uint64_t *tcb = (uint64_t *)buf; - int i, error; - struct mc7 *mem = &sc->cm; - - error = t3_mc7_bd_read(mem, tid*TCB_SIZE/8, TCB_SIZE/8, tcb); - if (error) - printf("cxgb_tcb_log failed\n"); - - - CTR1(KTR_CXGB, "TCB tid=%u", tid); - for (i = 0; i < TCB_SIZE / 32; i++) { - - CTR5(KTR_CXGB, "%1d: %08x %08x %08x %08x", - i, (uint32_t)tcb[1], (uint32_t)(tcb[1] >> 32), - (uint32_t)tcb[0], (uint32_t)(tcb[0] >> 32)); - - tcb += 2; - CTR4(KTR_CXGB, " %08x %08x %08x %08x", - (uint32_t)tcb[1], (uint32_t)(tcb[1] >> 32), - (uint32_t)tcb[0], (uint32_t)(tcb[0] >> 32)); - tcb += 2; - } -} - -/* - * Add an skb to the deferred skb queue for processing from process context. - */ -void -t3_defer_reply(struct mbuf *m, struct toedev *dev, defer_handler_t handler) -{ - struct tom_data *td = TOM_DATA(dev); - - m_set_handler(m, handler); - mtx_lock(&td->deferq.lock); - - mbufq_tail(&td->deferq, m); - if (mbufq_len(&td->deferq) == 1) - taskqueue_enqueue(td->tq, &td->deferq_task); - mtx_lock(&td->deferq.lock); -} - struct toepcb * -toepcb_alloc(void) +toepcb_alloc(struct toedev *tod) { struct toepcb *toep; - - toep = malloc(sizeof(struct toepcb), M_CXGB, M_NOWAIT|M_ZERO); - + + toep = malloc(sizeof(struct toepcb), M_CXGB, M_NOWAIT | M_ZERO); if (toep == NULL) return (NULL); - toepcb_init(toep); + toep->tp_tod = tod; + toep->tp_wr_max = toep->tp_wr_avail = 15; + toep->tp_wr_unacked = 0; + toep->tp_delack_mode = 0; + return (toep); } void -toepcb_init(struct toepcb *toep) +toepcb_free(struct toepcb *toep) { - toep->tp_refcount = 1; - cv_init(&toep->tp_cv, "toep cv"); + free(toep, M_CXGB); } -void -toepcb_hold(struct toepcb *toep) -{ - atomic_add_acq_int(&toep->tp_refcount, 1); -} - -void -toepcb_release(struct toepcb *toep) -{ - if (toep->tp_refcount == 1) { - free(toep, M_CXGB); - return; - } - atomic_add_acq_int(&toep->tp_refcount, -1); -} - - -/* - * Add a T3 offload device to the list of devices we are managing. - */ -static void -t3cdev_add(struct tom_data *t) -{ - mtx_lock(&cxgb_list_lock); - TAILQ_INSERT_TAIL(&cxgb_list, t, entry); - mtx_unlock(&cxgb_list_lock); -} - -static inline int -cdev2type(struct t3cdev *cdev) -{ - int type = 0; - - switch (cdev->type) { - case T3A: - type = TOE_ID_CHELSIO_T3; - break; - case T3B: - type = TOE_ID_CHELSIO_T3B; - break; - case T3C: - type = TOE_ID_CHELSIO_T3C; - break; - } - return (type); -} - -/* - * Allocate and initialize the TID tables. Returns 0 on success. - */ static int -init_tid_tabs(struct tid_info *t, unsigned int ntids, - unsigned int natids, unsigned int nstids, - unsigned int atid_base, unsigned int stid_base) +alloc_tid_tabs(struct tid_info *t, u_int ntids, u_int natids, u_int nstids, + u_int atid_base, u_int stid_base) { unsigned long size = ntids * sizeof(*t->tid_tab) + natids * sizeof(*t->atid_tab) + nstids * sizeof(*t->stid_tab); - t->tid_tab = cxgb_alloc_mem(size); + t->tid_tab = malloc(size, M_CXGB, M_NOWAIT | M_ZERO); if (!t->tid_tab) return (ENOMEM); @@ -270,8 +115,8 @@ init_tid_tabs(struct tid_info *t, unsigned int ntids, t->afree = NULL; t->stids_in_use = t->atids_in_use = 0; t->tids_in_use = 0; - mtx_init(&t->stid_lock, "stid", NULL, MTX_DUPOK|MTX_DEF); - mtx_init(&t->atid_lock, "atid", NULL, MTX_DUPOK|MTX_DEF); + mtx_init(&t->stid_lock, "stid", NULL, MTX_DEF); + mtx_init(&t->atid_lock, "atid", NULL, MTX_DEF); /* * Setup the free lists for stid_tab and atid_tab. @@ -286,1240 +131,266 @@ init_tid_tabs(struct tid_info *t, unsigned int ntids, t->atid_tab[natids - 1].next = &t->atid_tab[natids]; t->afree = t->atid_tab; } - return 0; + return (0); } static void -free_tid_maps(struct tid_info *t) +free_tid_tabs(struct tid_info *t) { - mtx_destroy(&t->stid_lock); - mtx_destroy(&t->atid_lock); - cxgb_free_mem(t->tid_tab); + if (mtx_initialized(&t->stid_lock)) + mtx_destroy(&t->stid_lock); + if (mtx_initialized(&t->atid_lock)) + mtx_destroy(&t->atid_lock); + free(t->tid_tab, M_CXGB); } -static inline void -add_adapter(adapter_t *adap) -{ - rw_wlock(&adapter_list_lock); - TAILQ_INSERT_TAIL(&adapter_list, adap, adapter_entry); - rw_wunlock(&adapter_list_lock); -} - -static inline void -remove_adapter(adapter_t *adap) -{ - rw_wlock(&adapter_list_lock); - TAILQ_REMOVE(&adapter_list, adap, adapter_entry); - rw_wunlock(&adapter_list_lock); -} - -/* - * Populate a TID_RELEASE WR. The mbuf must be already propely sized. - */ -static inline void -mk_tid_release(struct mbuf *m, unsigned int tid) -{ - struct cpl_tid_release *req; - - m_set_priority(m, CPL_PRIORITY_SETUP); - req = mtod(m, struct cpl_tid_release *); - m->m_pkthdr.len = m->m_len = sizeof(*req); - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_TID_RELEASE, tid)); -} - -static void -t3_process_tid_release_list(void *data, int pending) +static int +write_smt_entry(struct adapter *sc, int idx) { + struct port_info *pi = &sc->port[idx]; + struct cpl_smt_write_req *req; struct mbuf *m; - struct t3cdev *tdev = data; - struct t3c_data *td = T3C_DATA (tdev); - mtx_lock(&td->tid_release_lock); - while (td->tid_release_list) { - struct toe_tid_entry *p = td->tid_release_list; - - td->tid_release_list = (struct toe_tid_entry *)p->ctx; - mtx_unlock(&td->tid_release_lock); - m = m_get(M_WAIT, MT_DATA); - mk_tid_release(m, p - td->tid_maps.tid_tab); - cxgb_ofld_send(tdev, m); - p->ctx = NULL; - mtx_lock(&td->tid_release_lock); - } - mtx_unlock(&td->tid_release_lock); -} - -int -cxgb_offload_activate(struct adapter *adapter) -{ - struct t3cdev *dev = &adapter->tdev; - int natids, err; - struct t3c_data *t; - struct tid_range stid_range, tid_range; - struct mtutab mtutab; - unsigned int l2t_capacity; - - t = malloc(sizeof(*t), M_CXGB, M_NOWAIT|M_ZERO); - if (!t) + m = M_GETHDR_OFLD(0, CPL_PRIORITY_CONTROL, req); + if (m == NULL) { + log(LOG_ERR, "%s: no mbuf, can't write SMT entry for %d\n", + __func__, idx); return (ENOMEM); - dev->adapter = adapter; - - err = (EOPNOTSUPP); - if (dev->ctl(dev, GET_TX_MAX_CHUNK, &t->tx_max_chunk) < 0 || - dev->ctl(dev, GET_MAX_OUTSTANDING_WR, &t->max_wrs) < 0 || - dev->ctl(dev, GET_L2T_CAPACITY, &l2t_capacity) < 0 || - dev->ctl(dev, GET_MTUS, &mtutab) < 0 || - dev->ctl(dev, GET_TID_RANGE, &tid_range) < 0 || - dev->ctl(dev, GET_STID_RANGE, &stid_range) < 0) { - device_printf(adapter->dev, "%s: dev->ctl check failed\n", __FUNCTION__); - goto out_free; - } - - err = (ENOMEM); - L2DATA(dev) = t3_init_l2t(l2t_capacity); - if (!L2DATA(dev)) { - device_printf(adapter->dev, "%s: t3_init_l2t failed\n", __FUNCTION__); - goto out_free; - } - natids = min(tid_range.num / 2, MAX_ATIDS); - err = init_tid_tabs(&t->tid_maps, tid_range.num, natids, - stid_range.num, ATID_BASE, stid_range.base); - if (err) { - device_printf(adapter->dev, "%s: init_tid_tabs failed\n", __FUNCTION__); - goto out_free_l2t; - } - - t->mtus = mtutab.mtus; - t->nmtus = mtutab.size; - - TASK_INIT(&t->tid_release_task, 0 /* XXX? */, t3_process_tid_release_list, dev); - mtx_init(&t->tid_release_lock, "tid release", NULL, MTX_DUPOK|MTX_DEF); - t->dev = dev; - - T3C_DATA (dev) = t; - dev->recv = process_rx; - dev->arp_update = t3_l2t_update; - /* Register netevent handler once */ - if (TAILQ_EMPTY(&adapter_list)) { -#if defined(CONFIG_CHELSIO_T3_MODULE) - if (prepare_arp_with_t3core()) - log(LOG_ERR, "Unable to set offload capabilities\n"); -#endif - } - CTR1(KTR_CXGB, "adding adapter %p", adapter); - add_adapter(adapter); - device_printf(adapter->dev, "offload started\n"); - adapter->flags |= CXGB_OFLD_INIT; - return (0); - -out_free_l2t: - t3_free_l2t(L2DATA(dev)); - L2DATA(dev) = NULL; -out_free: - free(t, M_CXGB); - return (err); -} - -void -cxgb_offload_deactivate(struct adapter *adapter) -{ - struct t3cdev *tdev = &adapter->tdev; - struct t3c_data *t = T3C_DATA(tdev); - - printf("removing adapter %p\n", adapter); - remove_adapter(adapter); - if (TAILQ_EMPTY(&adapter_list)) { -#if defined(CONFIG_CHELSIO_T3_MODULE) - restore_arp_sans_t3core(); -#endif - } - free_tid_maps(&t->tid_maps); - T3C_DATA(tdev) = NULL; - t3_free_l2t(L2DATA(tdev)); - L2DATA(tdev) = NULL; - mtx_destroy(&t->tid_release_lock); - free(t, M_CXGB); -} - -/* - * Sends an sk_buff to a T3C driver after dealing with any active network taps. - */ -int -cxgb_ofld_send(struct t3cdev *dev, struct mbuf *m) -{ - int r; - - r = dev->send(dev, m); - return r; -} - -static struct ifnet * -get_iff_from_mac(adapter_t *adapter, const uint8_t *mac, unsigned int vlan) -{ - int i; - - for_each_port(adapter, i) { -#ifdef notyet - const struct vlan_group *grp; -#endif - const struct port_info *p = &adapter->port[i]; - struct ifnet *ifp = p->ifp; - - if (!memcmp(p->hw_addr, mac, ETHER_ADDR_LEN)) { -#ifdef notyet - - if (vlan && vlan != EVL_VLID_MASK) { - grp = p->vlan_grp; - dev = grp ? grp->vlan_devices[vlan] : NULL; - } else - while (dev->master) - dev = dev->master; -#endif - return (ifp); - } - } - return (NULL); -} - -static inline void -failover_fixup(adapter_t *adapter, int port) -{ - if (adapter->params.rev == 0) { - struct ifnet *ifp = adapter->port[port].ifp; - struct cmac *mac = &adapter->port[port].mac; - if (!(ifp->if_flags & IFF_UP)) { - /* Failover triggered by the interface ifdown */ - t3_write_reg(adapter, A_XGM_TX_CTRL + mac->offset, - F_TXEN); - t3_read_reg(adapter, A_XGM_TX_CTRL + mac->offset); - } else { - /* Failover triggered by the interface link down */ - t3_write_reg(adapter, A_XGM_RX_CTRL + mac->offset, 0); - t3_read_reg(adapter, A_XGM_RX_CTRL + mac->offset); - t3_write_reg(adapter, A_XGM_RX_CTRL + mac->offset, - F_RXEN); - } - } -} - -static int -cxgb_ulp_iscsi_ctl(adapter_t *adapter, unsigned int req, void *data) -{ - int ret = 0; - struct ulp_iscsi_info *uiip = data; - - switch (req) { - case ULP_ISCSI_GET_PARAMS: - uiip->llimit = t3_read_reg(adapter, A_ULPRX_ISCSI_LLIMIT); - uiip->ulimit = t3_read_reg(adapter, A_ULPRX_ISCSI_ULIMIT); - uiip->tagmask = t3_read_reg(adapter, A_ULPRX_ISCSI_TAGMASK); - /* - * On tx, the iscsi pdu has to be <= tx page size and has to - * fit into the Tx PM FIFO. - */ - uiip->max_txsz = min(adapter->params.tp.tx_pg_size, - t3_read_reg(adapter, A_PM1_TX_CFG) >> 17); - /* on rx, the iscsi pdu has to be < rx page size and the - whole pdu + cpl headers has to fit into one sge buffer */ - /* also check the max rx data length programmed in TP */ - uiip->max_rxsz = min(uiip->max_rxsz, - ((t3_read_reg(adapter, A_TP_PARA_REG2)) - >> S_MAXRXDATA) & M_MAXRXDATA); - break; - case ULP_ISCSI_SET_PARAMS: - t3_write_reg(adapter, A_ULPRX_ISCSI_TAGMASK, uiip->tagmask); - break; - default: - ret = (EOPNOTSUPP); - } - return ret; -} - -/* Response queue used for RDMA events. */ -#define ASYNC_NOTIF_RSPQ 0 - -static int -cxgb_rdma_ctl(adapter_t *adapter, unsigned int req, void *data) -{ - int ret = 0; - - switch (req) { - case RDMA_GET_PARAMS: { - struct rdma_info *req = data; - - req->udbell_physbase = rman_get_start(adapter->udbs_res); - req->udbell_len = rman_get_size(adapter->udbs_res); - req->tpt_base = t3_read_reg(adapter, A_ULPTX_TPT_LLIMIT); - req->tpt_top = t3_read_reg(adapter, A_ULPTX_TPT_ULIMIT); - req->pbl_base = t3_read_reg(adapter, A_ULPTX_PBL_LLIMIT); - req->pbl_top = t3_read_reg(adapter, A_ULPTX_PBL_ULIMIT); - req->rqt_base = t3_read_reg(adapter, A_ULPRX_RQ_LLIMIT); - req->rqt_top = t3_read_reg(adapter, A_ULPRX_RQ_ULIMIT); - req->kdb_addr = (void *)((unsigned long)rman_get_virtual(adapter->regs_res) + A_SG_KDOORBELL); break; - } - case RDMA_CQ_OP: { - struct rdma_cq_op *req = data; - - /* may be called in any context */ - mtx_lock_spin(&adapter->sge.reg_lock); - ret = t3_sge_cqcntxt_op(adapter, req->id, req->op, - req->credits); - mtx_unlock_spin(&adapter->sge.reg_lock); - break; - } - case RDMA_GET_MEM: { - struct ch_mem_range *t = data; - struct mc7 *mem; - - if ((t->addr & 7) || (t->len & 7)) - return (EINVAL); - if (t->mem_id == MEM_CM) - mem = &adapter->cm; - else if (t->mem_id == MEM_PMRX) - mem = &adapter->pmrx; - else if (t->mem_id == MEM_PMTX) - mem = &adapter->pmtx; - else - return (EINVAL); - - ret = t3_mc7_bd_read(mem, t->addr/8, t->len/8, (u64 *)t->buf); - if (ret) - return (ret); - break; - } - case RDMA_CQ_SETUP: { - struct rdma_cq_setup *req = data; - - mtx_lock_spin(&adapter->sge.reg_lock); - ret = t3_sge_init_cqcntxt(adapter, req->id, req->base_addr, - req->size, ASYNC_NOTIF_RSPQ, - req->ovfl_mode, req->credits, - req->credit_thres); - mtx_unlock_spin(&adapter->sge.reg_lock); - break; - } - case RDMA_CQ_DISABLE: - mtx_lock_spin(&adapter->sge.reg_lock); - ret = t3_sge_disable_cqcntxt(adapter, *(unsigned int *)data); - mtx_unlock_spin(&adapter->sge.reg_lock); - break; - case RDMA_CTRL_QP_SETUP: { - struct rdma_ctrlqp_setup *req = data; - - mtx_lock_spin(&adapter->sge.reg_lock); - ret = t3_sge_init_ecntxt(adapter, FW_RI_SGEEC_START, 0, - SGE_CNTXT_RDMA, ASYNC_NOTIF_RSPQ, - req->base_addr, req->size, - FW_RI_TID_START, 1, 0); - mtx_unlock_spin(&adapter->sge.reg_lock); - break; - } - default: - ret = EOPNOTSUPP; - } - return (ret); -} - -static int -cxgb_offload_ctl(struct t3cdev *tdev, unsigned int req, void *data) -{ - struct adapter *adapter = tdev2adap(tdev); - struct tid_range *tid; - struct mtutab *mtup; - struct iff_mac *iffmacp; - struct ddp_params *ddpp; - struct adap_ports *ports; - struct ofld_page_info *rx_page_info; - struct tp_params *tp = &adapter->params.tp; - int port; - - switch (req) { - case GET_MAX_OUTSTANDING_WR: - *(unsigned int *)data = FW_WR_NUM; - break; - case GET_WR_LEN: - *(unsigned int *)data = WR_FLITS; - break; - case GET_TX_MAX_CHUNK: - *(unsigned int *)data = 1 << 20; /* 1MB */ - break; - case GET_TID_RANGE: - tid = data; - tid->num = t3_mc5_size(&adapter->mc5) - - adapter->params.mc5.nroutes - - adapter->params.mc5.nfilters - - adapter->params.mc5.nservers; - tid->base = 0; - break; - case GET_STID_RANGE: - tid = data; - tid->num = adapter->params.mc5.nservers; - tid->base = t3_mc5_size(&adapter->mc5) - tid->num - - adapter->params.mc5.nfilters - - adapter->params.mc5.nroutes; - break; - case GET_L2T_CAPACITY: - *(unsigned int *)data = 2048; - break; - case GET_MTUS: - mtup = data; - mtup->size = NMTUS; - mtup->mtus = adapter->params.mtus; - break; - case GET_IFF_FROM_MAC: - iffmacp = data; - iffmacp->dev = get_iff_from_mac(adapter, iffmacp->mac_addr, - iffmacp->vlan_tag & EVL_VLID_MASK); - break; - case GET_DDP_PARAMS: - ddpp = data; - ddpp->llimit = t3_read_reg(adapter, A_ULPRX_TDDP_LLIMIT); - ddpp->ulimit = t3_read_reg(adapter, A_ULPRX_TDDP_ULIMIT); - ddpp->tag_mask = t3_read_reg(adapter, A_ULPRX_TDDP_TAGMASK); - break; - case GET_PORTS: - ports = data; - ports->nports = adapter->params.nports; - for_each_port(adapter, port) - ports->lldevs[port] = adapter->port[port].ifp; - break; - case FAILOVER: - port = *(int *)data; - t3_port_failover(adapter, port); - failover_fixup(adapter, port); - break; - case FAILOVER_DONE: - port = *(int *)data; - t3_failover_done(adapter, port); - break; - case FAILOVER_CLEAR: - t3_failover_clear(adapter); - break; - case GET_RX_PAGE_INFO: - rx_page_info = data; - rx_page_info->page_size = tp->rx_pg_size; - rx_page_info->num = tp->rx_num_pgs; - break; - case ULP_ISCSI_GET_PARAMS: - case ULP_ISCSI_SET_PARAMS: - if (!offload_running(adapter)) - return (EAGAIN); - return cxgb_ulp_iscsi_ctl(adapter, req, data); - case RDMA_GET_PARAMS: - case RDMA_CQ_OP: - case RDMA_CQ_SETUP: - case RDMA_CQ_DISABLE: - case RDMA_CTRL_QP_SETUP: - case RDMA_GET_MEM: - if (!offload_running(adapter)) - return (EAGAIN); - return cxgb_rdma_ctl(adapter, req, data); - default: - return (EOPNOTSUPP); - } - return 0; -} - -/* - * Allocate a TOM data structure, - * initialize its cpl_handlers - * and register it as a T3C client - */ -static void -t3c_tom_add(struct t3cdev *cdev) -{ - int i; - unsigned int wr_len; - struct tom_data *t; - struct toedev *tdev; - struct adap_ports *port_info; - - t = malloc(sizeof(*t), M_CXGB, M_NOWAIT|M_ZERO); - if (t == NULL) - return; - - cdev->send = t3_offload_tx; - cdev->ctl = cxgb_offload_ctl; - - if (cdev->ctl(cdev, GET_WR_LEN, &wr_len) < 0) - goto out_free_tom; - - port_info = malloc(sizeof(*port_info), M_CXGB, M_NOWAIT|M_ZERO); - if (!port_info) - goto out_free_tom; - - if (cdev->ctl(cdev, GET_PORTS, port_info) < 0) - goto out_free_all; - - t3_init_wr_tab(wr_len); - t->cdev = cdev; - t->client = &t3c_tom_client; - - /* Register TCP offload device */ - tdev = &t->tdev; - tdev->tod_ttid = cdev2type(cdev); - tdev->tod_lldev = cdev->lldev; - - if (register_toedev(tdev, "toe%d")) { - printf("unable to register offload device"); - goto out_free_all; - } - TOM_DATA(tdev) = t; - - for (i = 0; i < port_info->nports; i++) { - struct ifnet *ifp = port_info->lldevs[i]; - TOEDEV(ifp) = tdev; - - CTR1(KTR_TOM, "enabling toe on %p", ifp); - ifp->if_capabilities |= IFCAP_TOE4; - ifp->if_capenable |= IFCAP_TOE4; - } - t->ports = port_info; - - /* Add device to the list of offload devices */ - t3cdev_add(t); - - /* Activate TCP offload device */ - cxgb_offload_activate(TOM_DATA(tdev)->cdev->adapter); - - activate_offload(tdev); - cxgb_register_listeners(); - return; - -out_free_all: - printf("out_free_all fail\n"); - free(port_info, M_CXGB); -out_free_tom: - printf("out_free_tom fail\n"); - free(t, M_CXGB); - return; -} - - - -static int -do_act_open_rpl(struct t3cdev *dev, struct mbuf *m) -{ - struct cpl_act_open_rpl *rpl = cplhdr(m); - unsigned int atid = G_TID(ntohl(rpl->atid)); - struct toe_tid_entry *toe_tid; - - toe_tid = lookup_atid(&(T3C_DATA (dev))->tid_maps, atid); - if (toe_tid->ctx && toe_tid->client && toe_tid->client->handlers && - toe_tid->client->handlers[CPL_ACT_OPEN_RPL]) { - return toe_tid->client->handlers[CPL_ACT_OPEN_RPL] (dev, m, - toe_tid->ctx); - } else { - log(LOG_ERR, "%s: received clientless CPL command 0x%x\n", - dev->name, CPL_ACT_OPEN_RPL); - return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG; - } -} - -static int -do_stid_rpl(struct t3cdev *dev, struct mbuf *m) -{ - union opcode_tid *p = cplhdr(m); - unsigned int stid = G_TID(ntohl(p->opcode_tid)); - struct toe_tid_entry *toe_tid; - - toe_tid = lookup_stid(&(T3C_DATA (dev))->tid_maps, stid); - if (toe_tid->ctx && toe_tid->client->handlers && - toe_tid->client->handlers[p->opcode]) { - return toe_tid->client->handlers[p->opcode] (dev, m, toe_tid->ctx); - } else { - log(LOG_ERR, "%s: received clientless CPL command 0x%x\n", - dev->name, p->opcode); - return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG; - } -} - -static int -do_hwtid_rpl(struct t3cdev *dev, struct mbuf *m) -{ - union opcode_tid *p = cplhdr(m); - unsigned int hwtid; - struct toe_tid_entry *toe_tid; - - DPRINTF("do_hwtid_rpl opcode=0x%x\n", p->opcode); - hwtid = G_TID(ntohl(p->opcode_tid)); - - toe_tid = lookup_tid(&(T3C_DATA (dev))->tid_maps, hwtid); - if (toe_tid->ctx && toe_tid->client->handlers && - toe_tid->client->handlers[p->opcode]) { - return toe_tid->client->handlers[p->opcode] - (dev, m, toe_tid->ctx); - } else { - log(LOG_ERR, "%s: received clientless CPL command 0x%x\n", - dev->name, p->opcode); - return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG; - } -} - -static int -do_cr(struct t3cdev *dev, struct mbuf *m) -{ - struct cpl_pass_accept_req *req = cplhdr(m); - unsigned int stid = G_PASS_OPEN_TID(ntohl(req->tos_tid)); - struct toe_tid_entry *toe_tid; - - toe_tid = lookup_stid(&(T3C_DATA (dev))->tid_maps, stid); - if (toe_tid->ctx && toe_tid->client->handlers && - toe_tid->client->handlers[CPL_PASS_ACCEPT_REQ]) { - return toe_tid->client->handlers[CPL_PASS_ACCEPT_REQ] - (dev, m, toe_tid->ctx); - } else { - log(LOG_ERR, "%s: received clientless CPL command 0x%x\n", - dev->name, CPL_PASS_ACCEPT_REQ); - return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG; - } -} - -static int -do_abort_req_rss(struct t3cdev *dev, struct mbuf *m) -{ - union opcode_tid *p = cplhdr(m); - unsigned int hwtid = G_TID(ntohl(p->opcode_tid)); - struct toe_tid_entry *toe_tid; - - toe_tid = lookup_tid(&(T3C_DATA (dev))->tid_maps, hwtid); - if (toe_tid->ctx && toe_tid->client->handlers && - toe_tid->client->handlers[p->opcode]) { - return toe_tid->client->handlers[p->opcode] - (dev, m, toe_tid->ctx); - } else { - struct cpl_abort_req_rss *req = cplhdr(m); - struct cpl_abort_rpl *rpl; - - struct mbuf *m = m_get(M_NOWAIT, MT_DATA); - if (!m) { - log(LOG_NOTICE, "do_abort_req_rss: couldn't get mbuf!\n"); - goto out; - } - - m_set_priority(m, CPL_PRIORITY_DATA); - rpl = cplhdr(m); - rpl->wr.wr_hi = - htonl(V_WR_OP(FW_WROPCODE_OFLD_HOST_ABORT_CON_RPL)); - rpl->wr.wr_lo = htonl(V_WR_TID(GET_TID(req))); - OPCODE_TID(rpl) = - htonl(MK_OPCODE_TID(CPL_ABORT_RPL, GET_TID(req))); - rpl->cmd = req->status; - cxgb_ofld_send(dev, m); - out: - return (CPL_RET_BUF_DONE); - } -} - -static int -do_act_establish(struct t3cdev *dev, struct mbuf *m) -{ - struct cpl_act_establish *req; - unsigned int atid; - struct toe_tid_entry *toe_tid; - - req = cplhdr(m); - atid = G_PASS_OPEN_TID(ntohl(req->tos_tid)); - toe_tid = lookup_atid(&(T3C_DATA (dev))->tid_maps, atid); - if (toe_tid && toe_tid->ctx && toe_tid->client->handlers && - toe_tid->client->handlers[CPL_ACT_ESTABLISH]) { - - return toe_tid->client->handlers[CPL_ACT_ESTABLISH] - (dev, m, toe_tid->ctx); - } else { - - log(LOG_ERR, "%s: received clientless CPL command 0x%x\n", - dev->name, CPL_ACT_ESTABLISH); - return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG; - } -} - - -static int -do_term(struct t3cdev *dev, struct mbuf *m) -{ - unsigned int hwtid = ntohl(m_get_priority(m)) >> 8 & 0xfffff; - unsigned int opcode = G_OPCODE(ntohl(m->m_pkthdr.csum_data)); - struct toe_tid_entry *toe_tid; - - toe_tid = lookup_tid(&(T3C_DATA (dev))->tid_maps, hwtid); - if (toe_tid && toe_tid->ctx && toe_tid->client->handlers && - toe_tid->client->handlers[opcode]) { - return toe_tid->client->handlers[opcode](dev, m, toe_tid->ctx); - } else { - log(LOG_ERR, "%s: received clientless CPL command 0x%x\n", - dev->name, opcode); - return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG; - } - return (0); -} - -/* - * Process a received packet with an unknown/unexpected CPL opcode. - */ -static int -do_bad_cpl(struct t3cdev *cdev, struct mbuf *m, void *ctx) -{ - log(LOG_ERR, "%s: received bad CPL command %u\n", cdev->name, - 0xFF & *mtod(m, unsigned int *)); - return (CPL_RET_BUF_DONE | CPL_RET_BAD_MSG); -} - -/* - * Add a new handler to the CPL dispatch table. A NULL handler may be supplied - * to unregister an existing handler. - */ -void -t3tom_register_cpl_handler(unsigned int opcode, cxgb_cpl_handler_func h) -{ - if (opcode < UCHAR_MAX) - tom_cpl_handlers[opcode] = h ? h : do_bad_cpl; - else - log(LOG_ERR, "Chelsio T3 TOM: handler registration for " - "opcode %u failed\n", opcode); -} - -/* - * Make a preliminary determination if a connection can be offloaded. It's OK - * to fail the offload later if we say we can offload here. For now this - * always accepts the offload request unless there are IP options. - */ -static int -can_offload(struct toedev *dev, struct socket *so) -{ - struct tom_data *tomd = TOM_DATA(dev); - struct t3cdev *cdev = T3CDEV(dev->tod_lldev); - struct tid_info *t = &(T3C_DATA(cdev))->tid_maps; - - return so_sotoinpcb(so)->inp_depend4.inp4_options == NULL && - tomd->conf.activated && - (tomd->conf.max_conn < 0 || - atomic_load_acq_int(&t->tids_in_use) + t->atids_in_use < tomd->conf.max_conn); -} - -static int -tom_ctl(struct toedev *dev, unsigned int req, void *data) -{ - struct tom_data *t = TOM_DATA(dev); - struct t3cdev *cdev = t->cdev; - - if (cdev->ctl) - return cdev->ctl(cdev, req, data); - - return (EOPNOTSUPP); -} - -/* - * Free an active-open TID. - */ -void * -cxgb_free_atid(struct t3cdev *tdev, int atid) -{ - struct tid_info *t = &(T3C_DATA(tdev))->tid_maps; - union active_open_entry *p = atid2entry(t, atid); - void *ctx = p->toe_tid.ctx; - - mtx_lock(&t->atid_lock); - p->next = t->afree; - t->afree = p; - t->atids_in_use--; - mtx_unlock(&t->atid_lock); - - return ctx; -} - -/* - * Free a server TID and return it to the free pool. - */ -void -cxgb_free_stid(struct t3cdev *tdev, int stid) -{ - struct tid_info *t = &(T3C_DATA (tdev))->tid_maps; - union listen_entry *p = stid2entry(t, stid); - - mtx_lock(&t->stid_lock); - p->next = t->sfree; - t->sfree = p; - t->stids_in_use--; - mtx_unlock(&t->stid_lock); -} - -/* - * Free a server TID and return it to the free pool. - */ -void * -cxgb_get_lctx(struct t3cdev *tdev, int stid) -{ - struct tid_info *t = &(T3C_DATA (tdev))->tid_maps; - union listen_entry *p = stid2entry(t, stid); - - return (p->toe_tid.ctx); -} - -void -cxgb_insert_tid(struct t3cdev *tdev, struct cxgb_client *client, - void *ctx, unsigned int tid) -{ - struct tid_info *t = &(T3C_DATA (tdev))->tid_maps; - - t->tid_tab[tid].client = client; - t->tid_tab[tid].ctx = ctx; - atomic_add_int(&t->tids_in_use, 1); -} - -/* use ctx as a next pointer in the tid release list */ -void -cxgb_queue_tid_release(struct t3cdev *tdev, unsigned int tid) -{ - struct t3c_data *td = T3C_DATA (tdev); - struct toe_tid_entry *p = &td->tid_maps.tid_tab[tid]; - - CTR0(KTR_TOM, "queuing tid release\n"); - - mtx_lock(&td->tid_release_lock); - p->ctx = td->tid_release_list; - td->tid_release_list = p; - - if (!p->ctx) - taskqueue_enqueue(tdev->adapter->tq, &td->tid_release_task); - - mtx_unlock(&td->tid_release_lock); -} - -/* - * Remove a tid from the TID table. A client may defer processing its last - * CPL message if it is locked at the time it arrives, and while the message - * sits in the client's backlog the TID may be reused for another connection. - * To handle this we atomically switch the TID association if it still points - * to the original client context. - */ -void -cxgb_remove_tid(struct t3cdev *tdev, void *ctx, unsigned int tid) -{ - struct tid_info *t = &(T3C_DATA (tdev))->tid_maps; - - if (tid >= t->ntids) - panic("tid=%d >= t->ntids=%d", tid, t->ntids); - - if (tdev->type == T3A) - atomic_cmpset_ptr((uintptr_t *)&t->tid_tab[tid].ctx, (long)NULL, (long)ctx); - else { - struct mbuf *m; - - m = m_get(M_NOWAIT, MT_DATA); - if (__predict_true(m != NULL)) { - mk_tid_release(m, tid); - CTR1(KTR_CXGB, "releasing tid=%u", tid); - - cxgb_ofld_send(tdev, m); - t->tid_tab[tid].ctx = NULL; - } else - cxgb_queue_tid_release(tdev, tid); - } - atomic_add_int(&t->tids_in_use, -1); -} - -int -cxgb_alloc_atid(struct t3cdev *tdev, struct cxgb_client *client, - void *ctx) -{ - int atid = -1; - struct tid_info *t = &(T3C_DATA (tdev))->tid_maps; - - mtx_lock(&t->atid_lock); - if (t->afree) { - union active_open_entry *p = t->afree; - - atid = (p - t->atid_tab) + t->atid_base; - t->afree = p->next; - p->toe_tid.ctx = ctx; - p->toe_tid.client = client; - t->atids_in_use++; - } - mtx_unlock(&t->atid_lock); - return atid; -} - -int -cxgb_alloc_stid(struct t3cdev *tdev, struct cxgb_client *client, - void *ctx) -{ - int stid = -1; - struct tid_info *t = &(T3C_DATA (tdev))->tid_maps; - - mtx_lock(&t->stid_lock); - if (t->sfree) { - union listen_entry *p = t->sfree; - - stid = (p - t->stid_tab) + t->stid_base; - t->sfree = p->next; - p->toe_tid.ctx = ctx; - p->toe_tid.client = client; - t->stids_in_use++; - } - mtx_unlock(&t->stid_lock); - return stid; -} - - -static int -is_offloading(struct ifnet *ifp) -{ - struct adapter *adapter; - int port; - - rw_rlock(&adapter_list_lock); - TAILQ_FOREACH(adapter, &adapter_list, adapter_entry) { - for_each_port(adapter, port) { - if (ifp == adapter->port[port].ifp) { - rw_runlock(&adapter_list_lock); - return 1; - } - } - } - rw_runlock(&adapter_list_lock); - return 0; -} - - -static void -cxgb_arp_update_event(void *unused, struct rtentry *rt0, - uint8_t *enaddr, struct sockaddr *sa) -{ - - if (!is_offloading(rt0->rt_ifp)) - return; - - RT_ADDREF(rt0); - RT_UNLOCK(rt0); - cxgb_neigh_update(rt0, enaddr, sa); - RT_LOCK(rt0); - RT_REMREF(rt0); -} - -static void -cxgb_redirect_event(void *unused, int event, struct rtentry *rt0, - struct rtentry *rt1, struct sockaddr *sa) -{ - /* - * ignore events on non-offloaded interfaces - */ - if (!is_offloading(rt0->rt_ifp)) - return; - - /* - * Cannot redirect to non-offload device. - */ - if (!is_offloading(rt1->rt_ifp)) { - log(LOG_WARNING, "%s: Redirect to non-offload" - "device ignored.\n", __FUNCTION__); - return; } - /* - * avoid LORs by dropping the route lock but keeping a reference - * - */ - RT_ADDREF(rt0); - RT_UNLOCK(rt0); - RT_ADDREF(rt1); - RT_UNLOCK(rt1); - - cxgb_redirect(rt0, rt1, sa); - cxgb_neigh_update(rt1, NULL, sa); + req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); + OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, idx)); + req->mtu_idx = NMTUS - 1; /* should be 0 but there's a T3 bug */ + req->iff = idx; + memset(req->src_mac1, 0, sizeof(req->src_mac1)); + memcpy(req->src_mac0, pi->hw_addr, ETHER_ADDR_LEN); - RT_LOCK(rt0); - RT_REMREF(rt0); - RT_LOCK(rt1); - RT_REMREF(rt1); -} + t3_offload_tx(sc, m); -void -cxgb_neigh_update(struct rtentry *rt, uint8_t *enaddr, struct sockaddr *sa) -{ - - if (rt->rt_ifp && is_offloading(rt->rt_ifp) && (rt->rt_ifp->if_flags & IFCAP_TOE)) { - struct t3cdev *tdev = T3CDEV(rt->rt_ifp); - - PANIC_IF(!tdev); - t3_l2t_update(tdev, rt, enaddr, sa); - } -} - -static void -set_l2t_ix(struct t3cdev *tdev, u32 tid, struct l2t_entry *e) -{ - struct mbuf *m; - struct cpl_set_tcb_field *req; - - m = m_gethdr(M_NOWAIT, MT_DATA); - if (!m) { - log(LOG_ERR, "%s: cannot allocate mbuf!\n", __FUNCTION__); - return; - } - - m_set_priority(m, CPL_PRIORITY_CONTROL); - req = mtod(m, struct cpl_set_tcb_field *); - m->m_pkthdr.len = m->m_len = sizeof(*req); - - req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, tid)); - req->reply = 0; - req->cpu_idx = 0; - req->word = htons(W_TCB_L2T_IX); - req->mask = htobe64(V_TCB_L2T_IX(M_TCB_L2T_IX)); - req->val = htobe64(V_TCB_L2T_IX(e->idx)); - tdev->send(tdev, m); -} - -void -cxgb_redirect(struct rtentry *old, struct rtentry *new, struct sockaddr *sa) -{ - struct ifnet *olddev, *newdev; - struct tid_info *ti; - struct t3cdev *tdev; - u32 tid; - int update_tcb; - struct l2t_entry *e; - struct toe_tid_entry *te; - - olddev = old->rt_ifp; - newdev = new->rt_ifp; - if (!is_offloading(olddev)) - return; - if (!is_offloading(newdev)) { - log(LOG_WARNING, "%s: Redirect to non-offload" - "device ignored.\n", __FUNCTION__); - return; - } - tdev = T3CDEV(olddev); - PANIC_IF(!tdev); - if (tdev != T3CDEV(newdev)) { - log(LOG_WARNING, "%s: Redirect to different " - "offload device ignored.\n", __FUNCTION__); - return; - } - - /* Add new L2T entry */ - e = t3_l2t_get(tdev, new, new->rt_ifp, sa); - if (!e) { - log(LOG_ERR, "%s: couldn't allocate new l2t entry!\n", - __FUNCTION__); - return; - } - - /* Walk tid table and notify clients of dst change. */ - ti = &(T3C_DATA (tdev))->tid_maps; - for (tid=0; tid < ti->ntids; tid++) { - te = lookup_tid(ti, tid); - PANIC_IF(!te); - if (te->ctx && te->client && te->client->redirect) { - update_tcb = te->client->redirect(te->ctx, old, new, - e); - if (update_tcb) { - l2t_hold(L2DATA(tdev), e); - set_l2t_ix(tdev, tid, e); - } - } - } - l2t_release(L2DATA(tdev), e); -} - -/* - * Initialize the CPL dispatch table. - */ -static void -init_cpl_handlers(void) -{ - int i; - - for (i = 0; i < 256; ++i) - tom_cpl_handlers[i] = do_bad_cpl; - - t3_init_listen_cpl_handlers(); -} - -static int -t3_toe_attach(struct toedev *dev, const struct offload_id *entry) -{ - struct tom_data *t = TOM_DATA(dev); - struct t3cdev *cdev = t->cdev; - struct ddp_params ddp; - struct ofld_page_info rx_page_info; - int err; - - t3_init_tunables(t); - mtx_init(&t->listen_lock, "tom data listeners", NULL, MTX_DEF); - CTR2(KTR_TOM, "t3_toe_attach dev=%p entry=%p", dev, entry); - - dev->tod_can_offload = can_offload; - dev->tod_connect = t3_connect; - dev->tod_ctl = tom_ctl; -#if 0 - dev->tod_failover = t3_failover; -#endif - err = cdev->ctl(cdev, GET_DDP_PARAMS, &ddp); - if (err) - return err; - - err = cdev->ctl(cdev, GET_RX_PAGE_INFO, &rx_page_info); - if (err) - return err; - - t->ddp_llimit = ddp.llimit; - t->ddp_ulimit = ddp.ulimit; - t->pdev = ddp.pdev; - t->rx_page_size = rx_page_info.page_size; - /* OK if this fails, we just can't do DDP */ - t->nppods = (ddp.ulimit + 1 - ddp.llimit) / PPOD_SIZE; - t->ppod_map = malloc(t->nppods, M_DEVBUF, M_NOWAIT|M_ZERO); - - mtx_init(&t->ppod_map_lock, "ppod map", NULL, MTX_DEF); - - - t3_sysctl_register(cdev->adapter, &t->conf); return (0); } static void -cxgb_toe_listen_start(void *unused, struct tcpcb *tp) +free_tom_data(struct tom_data *td) { - struct socket *so = inp_inpcbtosocket(tp->t_inpcb); - struct tom_data *p; - - mtx_lock(&cxgb_list_lock); - TAILQ_FOREACH(p, &cxgb_list, entry) { - t3_listen_start(&p->tdev, so, p->cdev); + KASSERT(TAILQ_EMPTY(&td->toep_list), + ("%s: toep_list not empty", __func__)); + + if (td->listen_mask != 0) + hashdestroy(td->listen_hash, M_CXGB, td->listen_mask); + + if (mtx_initialized(&td->toep_list_lock)) + mtx_destroy(&td->toep_list_lock); + if (mtx_initialized(&td->lctx_hash_lock)) + mtx_destroy(&td->lctx_hash_lock); + if (mtx_initialized(&td->tid_release_lock)) + mtx_destroy(&td->tid_release_lock); + if (td->l2t) + t3_free_l2t(td->l2t); + free_tid_tabs(&td->tid_maps); + free(td, M_CXGB); +} + +/* + * Ground control to Major TOM + * Commencing countdown, engines on + */ +static int +t3_tom_activate(struct adapter *sc) +{ + struct tom_data *td; + struct toedev *tod; + int i, rc = 0; + struct mc5_params *mc5 = &sc->params.mc5; + u_int ntids, natids, mtus; + + ADAPTER_LOCK_ASSERT_OWNED(sc); /* for sc->flags */ + + /* per-adapter softc for TOM */ + td = malloc(sizeof(*td), M_CXGB, M_ZERO | M_NOWAIT); + if (td == NULL) + return (ENOMEM); + + /* List of TOE PCBs and associated lock */ + mtx_init(&td->toep_list_lock, "PCB list lock", NULL, MTX_DEF); + TAILQ_INIT(&td->toep_list); + + /* Listen context */ + mtx_init(&td->lctx_hash_lock, "lctx hash lock", NULL, MTX_DEF); + td->listen_hash = hashinit_flags(LISTEN_HASH_SIZE, M_CXGB, + &td->listen_mask, HASH_NOWAIT); + + /* TID release task */ + TASK_INIT(&td->tid_release_task, 0 , t3_process_tid_release_list, td); + mtx_init(&td->tid_release_lock, "tid release", NULL, MTX_DEF); + + /* L2 table */ + td->l2t = t3_init_l2t(L2T_SIZE); + if (td->l2t == NULL) { + rc = ENOMEM; + goto done; } - mtx_unlock(&cxgb_list_lock); -} -static void -cxgb_toe_listen_stop(void *unused, struct tcpcb *tp) -{ - struct socket *so = inp_inpcbtosocket(tp->t_inpcb); - struct tom_data *p; - - mtx_lock(&cxgb_list_lock); - TAILQ_FOREACH(p, &cxgb_list, entry) { - if (tp->t_state == TCPS_LISTEN) - t3_listen_stop(&p->tdev, so, p->cdev); + /* TID tables */ + ntids = t3_mc5_size(&sc->mc5) - mc5->nroutes - mc5->nfilters - + mc5->nservers; + natids = min(ntids / 2, 64 * 1024); + rc = alloc_tid_tabs(&td->tid_maps, ntids, natids, mc5->nservers, + 0x100000 /* ATID_BASE */, ntids); + if (rc != 0) + goto done; + + /* CPL handlers */ + t3_init_listen_cpl_handlers(sc); + t3_init_l2t_cpl_handlers(sc); + t3_init_cpl_io(sc); + + /* toedev ops */ + tod = &td->tod; + init_toedev(tod); + tod->tod_softc = sc; + tod->tod_connect = t3_connect; + tod->tod_listen_start = t3_listen_start; + tod->tod_listen_stop = t3_listen_stop; + tod->tod_rcvd = t3_rcvd; + tod->tod_output = t3_tod_output; + tod->tod_send_rst = t3_send_rst; + tod->tod_send_fin = t3_send_fin; + tod->tod_pcb_detach = t3_pcb_detach; + tod->tod_l2_update = t3_l2_update; + tod->tod_syncache_added = t3_syncache_added; + tod->tod_syncache_removed = t3_syncache_removed; + tod->tod_syncache_respond = t3_syncache_respond; + tod->tod_offload_socket = t3_offload_socket; + + /* port MTUs */ + mtus = sc->port[0].ifp->if_mtu; + if (sc->params.nports > 1) + mtus |= sc->port[1].ifp->if_mtu << 16; + t3_write_reg(sc, A_TP_MTU_PORT_TABLE, mtus); + t3_load_mtus(sc, sc->params.mtus, sc->params.a_wnd, sc->params.b_wnd, + sc->params.rev == 0 ? sc->port[0].ifp->if_mtu : 0xffff); + + /* SMT entry for each port */ + for_each_port(sc, i) { + write_smt_entry(sc, i); + TOEDEV(sc->port[i].ifp) = &td->tod; } - mtx_unlock(&cxgb_list_lock); -} -static void -cxgb_toe_listen_start_handler(struct inpcb *inp, void *arg) -{ - struct tcpcb *tp = intotcpcb(inp); + /* Switch TP to offload mode */ + t3_tp_set_offload_mode(sc, 1); - if (tp->t_state == TCPS_LISTEN) - cxgb_toe_listen_start(NULL, tp); -} + sc->tom_softc = td; + sc->flags |= TOM_INIT_DONE; + register_toedev(tod); -static void -cxgb_register_listeners(void) -{ +done: + if (rc != 0) + free_tom_data(td); - inp_apply_all(cxgb_toe_listen_start_handler, NULL); + return (rc); } static int -t3_tom_init(void) +t3_tom_deactivate(struct adapter *sc) { - init_cpl_handlers(); - if (t3_init_cpl_io() < 0) { - log(LOG_ERR, - "Unable to initialize cpl io ops\n"); - return -1; - } - t3_init_socket_ops(); + int rc = 0; + struct tom_data *td = sc->tom_softc; - /* Register with the TOE device layer. */ + ADAPTER_LOCK_ASSERT_OWNED(sc); /* for sc->flags */ - if (register_tom(&t3_tom_info) != 0) { - log(LOG_ERR, - "Unable to register Chelsio T3 TCP offload module.\n"); - return -1; + if (td == NULL) + return (0); /* XXX. KASSERT? */ + + if (sc->offload_map != 0) + return (EBUSY); /* at least one port has IFCAP_TOE enabled */ + + mtx_lock(&td->toep_list_lock); + if (!TAILQ_EMPTY(&td->toep_list)) + rc = EBUSY; + mtx_unlock(&td->toep_list_lock); + + mtx_lock(&td->lctx_hash_lock); + if (td->lctx_count > 0) + rc = EBUSY; + mtx_unlock(&td->lctx_hash_lock); + + if (rc == 0) { + unregister_toedev(&td->tod); + t3_tp_set_offload_mode(sc, 0); + free_tom_data(td); + sc->tom_softc = NULL; + sc->flags &= ~TOM_INIT_DONE; } - rw_init(&adapter_list_lock, "ofld adap list"); - TAILQ_INIT(&adapter_list); - EVENTHANDLER_REGISTER(route_arp_update_event, cxgb_arp_update_event, - NULL, EVENTHANDLER_PRI_ANY); - EVENTHANDLER_REGISTER(route_redirect_event, cxgb_redirect_event, - NULL, EVENTHANDLER_PRI_ANY); - - mtx_init(&cxgb_list_lock, "cxgb tom list", NULL, MTX_DEF); - listen_tag = EVENTHANDLER_REGISTER(tcp_offload_listen_start, - cxgb_toe_listen_start, NULL, EVENTHANDLER_PRI_ANY); - listen_tag = EVENTHANDLER_REGISTER(tcp_offload_listen_stop, - cxgb_toe_listen_stop, NULL, EVENTHANDLER_PRI_ANY); - TAILQ_INIT(&cxgb_list); - + return (rc); +} +static int +t3_tom_mod_load(void) +{ + int rc; - t3_register_cpl_handler(CPL_PASS_OPEN_RPL, do_stid_rpl); - t3_register_cpl_handler(CPL_CLOSE_LISTSRV_RPL, do_stid_rpl); - t3_register_cpl_handler(CPL_PASS_ACCEPT_REQ, do_cr); - t3_register_cpl_handler(CPL_PASS_ESTABLISH, do_hwtid_rpl); - t3_register_cpl_handler(CPL_ABORT_RPL_RSS, do_hwtid_rpl); - t3_register_cpl_handler(CPL_ABORT_RPL, do_hwtid_rpl); - t3_register_cpl_handler(CPL_RX_URG_NOTIFY, do_hwtid_rpl); - t3_register_cpl_handler(CPL_RX_DATA, do_hwtid_rpl); - t3_register_cpl_handler(CPL_TX_DATA_ACK, do_hwtid_rpl); - t3_register_cpl_handler(CPL_TX_DMA_ACK, do_hwtid_rpl); - t3_register_cpl_handler(CPL_ACT_OPEN_RPL, do_act_open_rpl); - t3_register_cpl_handler(CPL_PEER_CLOSE, do_hwtid_rpl); - t3_register_cpl_handler(CPL_CLOSE_CON_RPL, do_hwtid_rpl); - t3_register_cpl_handler(CPL_ABORT_REQ_RSS, do_abort_req_rss); - t3_register_cpl_handler(CPL_ACT_ESTABLISH, do_act_establish); - t3_register_cpl_handler(CPL_RDMA_TERMINATE, do_term); - t3_register_cpl_handler(CPL_RDMA_EC_STATUS, do_hwtid_rpl); - t3_register_cpl_handler(CPL_RX_DATA_DDP, do_hwtid_rpl); - t3_register_cpl_handler(CPL_RX_DDP_COMPLETE, do_hwtid_rpl); - t3_register_cpl_handler(CPL_ISCSI_HDR, do_hwtid_rpl); - t3_register_cpl_handler(CPL_GET_TCB_RPL, do_hwtid_rpl); - t3_register_cpl_handler(CPL_SET_TCB_RPL, do_hwtid_rpl); + rc = t3_register_uld(&tom_uld_info); + if (rc != 0) + t3_tom_mod_unload(); + + return (rc); +} + +static void +tom_uninit(struct adapter *sc, void *arg __unused) +{ + /* Try to free resources (works only if no port has IFCAP_TOE) */ + ADAPTER_LOCK(sc); + if (sc->flags & TOM_INIT_DONE) + t3_deactivate_uld(sc, ULD_TOM); + ADAPTER_UNLOCK(sc); +} + +static int +t3_tom_mod_unload(void) +{ + t3_iterate(tom_uninit, NULL); + + if (t3_unregister_uld(&tom_uld_info) == EBUSY) + return (EBUSY); - /* Register to offloading devices */ - cxgb_register_client(&t3c_tom_client); - return (0); } +#endif /* ifdef TCP_OFFLOAD */ static int -t3_tom_load(module_t mod, int cmd, void *arg) +t3_tom_modevent(module_t mod, int cmd, void *arg) { - int err = 0; + int rc = 0; +#ifdef TCP_OFFLOAD switch (cmd) { case MOD_LOAD: - t3_tom_init(); + rc = t3_tom_mod_load(); break; - case MOD_QUIESCE: - break; - case MOD_UNLOAD: - printf("uhm, ... unloading isn't really supported for toe\n"); - break; - case MOD_SHUTDOWN: - break; - default: - err = EOPNOTSUPP; - break; - } - return (err); + case MOD_UNLOAD: + rc = t3_tom_mod_unload(); + break; + + default: + rc = EINVAL; + } +#else + rc = EOPNOTSUPP; +#endif + return (rc); } -static moduledata_t mod_data= { +static moduledata_t t3_tom_moddata= { "t3_tom", - t3_tom_load, + t3_tom_modevent, 0 }; + MODULE_VERSION(t3_tom, 1); MODULE_DEPEND(t3_tom, toecore, 1, 1, 1); -MODULE_DEPEND(t3_tom, if_cxgb, 1, 1, 1); -DECLARE_MODULE(t3_tom, mod_data, SI_SUB_EXEC, SI_ORDER_ANY); - +MODULE_DEPEND(t3_tom, cxgbc, 1, 1, 1); +DECLARE_MODULE(t3_tom, t3_tom_moddata, SI_SUB_EXEC, SI_ORDER_ANY); diff --git a/sys/dev/cxgb/ulp/tom/cxgb_tom.h b/sys/dev/cxgb/ulp/tom/cxgb_tom.h index 2f3201db7c5..5cc29a8aeb0 100644 --- a/sys/dev/cxgb/ulp/tom/cxgb_tom.h +++ b/sys/dev/cxgb/ulp/tom/cxgb_tom.h @@ -1,7 +1,6 @@ - /************************************************************************** -Copyright (c) 2007, Chelsio Inc. +Copyright (c) 2007, 2009 Chelsio Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -33,128 +32,248 @@ $FreeBSD$ #ifndef CXGB_TOM_H_ #define CXGB_TOM_H_ #include -#include +#include -#define LISTEN_INFO_HASH_SIZE 32 +MALLOC_DECLARE(M_CXGB); -struct listen_info { - struct listen_info *next; /* Link to next entry */ - struct socket *so; /* The listening socket */ - unsigned int stid; /* The server TID */ -}; +#define KTR_CXGB KTR_SPARE3 +#define LISTEN_HASH_SIZE 32 /* - * TOM tunable parameters. They can be manipulated through sysctl(2) or /proc. + * Holds the size, base address, free list start, etc of the TID, server TID, + * and active-open TID tables for a offload device. + * The tables themselves are allocated dynamically. */ -struct tom_tunables { - int max_host_sndbuf; // max host RAM consumed by a sndbuf - int tx_hold_thres; // push/pull threshold for non-full TX sk_buffs - int max_wrs; // max # of outstanding WRs per connection - int rx_credit_thres; // min # of RX credits needed for RX_DATA_ACK - int cong_alg; // Congestion control algorithm - int mss; // max TX_DATA WR payload size - int delack; // delayed ACK control - int max_conn; // maximum number of offloaded connections - int soft_backlog_limit; // whether the listen backlog limit is soft - int ddp; // whether to put new connections in DDP mode - int ddp_thres; // min recvmsg size before activating DDP - int ddp_copy_limit; // capacity of kernel DDP buffer - int ddp_push_wait; // whether blocking DDP waits for PSH flag - int ddp_rcvcoalesce; // whether receive coalescing is enabled - int zcopy_sosend_enabled; // < is never zcopied - int zcopy_sosend_partial_thres; // < is never zcopied - int zcopy_sosend_partial_copy; // bytes copied in partial zcopy - int zcopy_sosend_thres;// >= are mostly zcopied - int zcopy_sosend_copy; // bytes coped in zcopied - int zcopy_sosend_ret_pending_dma;// pot. return while pending DMA - int activated; // TOE engine activation state +struct tid_info { + void **tid_tab; + unsigned int ntids; + volatile unsigned int tids_in_use; + + union listen_entry *stid_tab; + unsigned int nstids; + unsigned int stid_base; + + union active_open_entry *atid_tab; + unsigned int natids; + unsigned int atid_base; + + /* + * The following members are accessed R/W so we put them in their own + * cache lines. TOM_XXX: actually do what is said here. + * + * XXX We could combine the atid fields above with the lock here since + * atids are use once (unlike other tids). OTOH the above fields are + * usually in cache due to tid_tab. + */ + struct mtx atid_lock; + union active_open_entry *afree; + unsigned int atids_in_use; + + struct mtx stid_lock; + union listen_entry *sfree; + unsigned int stids_in_use; }; struct tom_data { - TAILQ_ENTRY(tom_data) entry; - - struct t3cdev *cdev; - struct pci_dev *pdev; - struct toedev tdev; + struct toedev tod; - struct cxgb_client *client; - struct tom_tunables conf; - struct tom_sysctl_table *sysctl; + /* + * toepcb's associated with this TOE device are either on the + * toep list or in the synq of a listening socket in lctx hash. + */ + struct mtx toep_list_lock; + TAILQ_HEAD(, toepcb) toep_list; + + struct l2t_data *l2t; + struct tid_info tid_maps; /* - * The next three locks listen_lock, deferq.lock, and tid_release_lock - * are used rarely so we let them potentially share a cacheline. + * The next two locks listen_lock, and tid_release_lock are used rarely + * so we let them potentially share a cacheline. */ - struct listen_info *listen_hash_tab[LISTEN_INFO_HASH_SIZE]; - struct mtx listen_lock; + LIST_HEAD(, listen_ctx) *listen_hash; + u_long listen_mask; + int lctx_count; /* # of lctx in the hash table */ + struct mtx lctx_hash_lock; - struct mbuf_head deferq; - struct task deferq_task; - - struct socket **tid_release_list; + void **tid_release_list; struct mtx tid_release_lock; struct task tid_release_task; - - volatile int tx_dma_pending; - - unsigned int ddp_llimit; - unsigned int ddp_ulimit; - - unsigned int rx_page_size; - - u8 *ppod_map; - unsigned int nppods; - struct mtx ppod_map_lock; - - struct adap_ports *ports; - struct taskqueue *tq; }; +struct synq_entry { + TAILQ_ENTRY(synq_entry) link; /* listen_ctx's synq link */ + int flags; /* same as toepcb's tp_flags */ + int tid; + struct mbuf *m; /* backpointer to containing mbuf */ + struct listen_ctx *lctx; /* backpointer to listen ctx */ + struct cpl_pass_establish *cpl; + struct toepcb *toep; + struct l2t_entry *e; + uint32_t iss; + uint32_t ts; + uint32_t opt0h; + uint32_t qset; + int rx_credits; + volatile u_int refcnt; + +#define RPL_OK 0 /* ok to reply */ +#define RPL_DONE 1 /* replied already */ +#define RPL_DONT 2 /* don't reply */ + volatile u_int reply; /* see above. */ +}; + +#define LCTX_RPL_PENDING 1 /* waiting for CPL_PASS_OPEN_RPL */ struct listen_ctx { - struct socket *lso; - struct tom_data *tom_data; - int ulp_mode; - LIST_HEAD(, toepcb) synq_head; - + LIST_ENTRY(listen_ctx) link; /* listen hash linkage */ + volatile int refcnt; + int stid; + int flags; + struct inpcb *inp; /* listening socket's inp */ + int qset; + TAILQ_HEAD(, synq_entry) synq; }; -#define TOM_DATA(dev) (*(struct tom_data **)&(dev)->tod_l4opt) -#define T3C_DEV(sk) ((TOM_DATA(TOE_DEV(sk)))->cdev) -#define TOEP_T3C_DEV(toep) (TOM_DATA(toep->tp_toedev)->cdev) -#define TOM_TUNABLE(dev, param) (TOM_DATA(dev)->conf.param) +void t3_process_tid_release_list(void *data, int pending); -#define TP_DATASENT (1 << 0) -#define TP_TX_WAIT_IDLE (1 << 1) -#define TP_FIN_SENT (1 << 2) -#define TP_ABORT_RPL_PENDING (1 << 3) -#define TP_ABORT_SHUTDOWN (1 << 4) -#define TP_ABORT_RPL_RCVD (1 << 5) -#define TP_ABORT_REQ_RCVD (1 << 6) -#define TP_CLOSE_CON_REQUESTED (1 << 7) -#define TP_SYN_RCVD (1 << 8) -#define TP_ESTABLISHED (1 << 9) - -void t3_init_tunables(struct tom_data *t); - -void t3_sysctl_register(struct adapter *sc, const struct tom_tunables *p); - -static __inline struct mbuf * -m_gethdr_nofail(int len) +static inline struct tom_data * +t3_tomdata(struct toedev *tod) { - struct mbuf *m; - - m = m_gethdr(M_NOWAIT, MT_DATA); - if (m == NULL) { - panic("implement lowmem cache\n"); - } - - KASSERT(len < MHLEN, ("requested header size too large for mbuf")); - m->m_pkthdr.len = m->m_len = len; - return (m); + return (member2struct(tom_data, tod, tod)); +} + +union listen_entry { + void *ctx; + union listen_entry *next; +}; + +union active_open_entry { + void *ctx; + union active_open_entry *next; +}; + +/* + * Map an ATID or STID to their entries in the corresponding TID tables. + */ +static inline union active_open_entry *atid2entry(const struct tid_info *t, + unsigned int atid) +{ + return &t->atid_tab[atid - t->atid_base]; } +static inline union listen_entry *stid2entry(const struct tid_info *t, + unsigned int stid) +{ + return &t->stid_tab[stid - t->stid_base]; +} + +/* + * Find the connection corresponding to a TID. + */ +static inline void *lookup_tid(const struct tid_info *t, unsigned int tid) +{ + void *p; + + if (tid >= t->ntids) + return (NULL); + + p = t->tid_tab[tid]; + if (p < (void *)t->tid_tab || p >= (void *)&t->atid_tab[t->natids]) + return (p); + + return (NULL); +} + +/* + * Find the connection corresponding to a server TID. + */ +static inline void *lookup_stid(const struct tid_info *t, unsigned int tid) +{ + void *p; + + if (tid < t->stid_base || tid >= t->stid_base + t->nstids) + return (NULL); + + p = stid2entry(t, tid)->ctx; + if (p < (void *)t->tid_tab || p >= (void *)&t->atid_tab[t->natids]) + return (p); + + return (NULL); +} + +/* + * Find the connection corresponding to an active-open TID. + */ +static inline void *lookup_atid(const struct tid_info *t, unsigned int tid) +{ + void *p; + + if (tid < t->atid_base || tid >= t->atid_base + t->natids) + return (NULL); + + p = atid2entry(t, tid)->ctx; + if (p < (void *)t->tid_tab || p >= (void *)&t->atid_tab[t->natids]) + return (p); + + return (NULL); +} + +static inline uint32_t +calc_opt2(int cpu_idx) +{ + uint32_t opt2 = F_CPU_INDEX_VALID | V_CPU_INDEX(cpu_idx); + + /* 3 = highspeed CC algorithm */ + opt2 |= V_FLAVORS_VALID(1) | V_CONG_CONTROL_FLAVOR(3) | + V_PACING_FLAVOR(1); + + /* coalesce and push bit semantics */ + opt2 |= F_RX_COALESCE_VALID | V_RX_COALESCE(3); + + return (htobe32(opt2)); +} + +/* cxgb_tom.c */ +struct toepcb *toepcb_alloc(struct toedev *); +void toepcb_free(struct toepcb *); + +/* cxgb_cpl_io.c */ +void t3_init_cpl_io(struct adapter *); +int t3_push_frames(struct socket *, int); +int t3_connect(struct toedev *, struct socket *, struct rtentry *, + struct sockaddr *); +int t3_tod_output(struct toedev *, struct tcpcb *); +int t3_send_rst(struct toedev *, struct tcpcb *); +int t3_send_fin(struct toedev *, struct tcpcb *); +void insert_tid(struct tom_data *, void *, unsigned int); +void update_tid(struct tom_data *, void *, unsigned int); +void remove_tid(struct tom_data *, unsigned int); +uint32_t calc_opt0h(struct socket *, int, int, struct l2t_entry *); +uint32_t calc_opt0l(struct socket *, int); +void queue_tid_release(struct toedev *, unsigned int); +void offload_socket(struct socket *, struct toepcb *); +void undo_offload_socket(struct socket *); +int select_rcv_wscale(void); +unsigned long select_rcv_wnd(struct socket *); +int find_best_mtu_idx(struct adapter *, struct in_conninfo *, int); +void make_established(struct socket *, uint32_t, uint32_t, uint16_t); +void t3_rcvd(struct toedev *, struct tcpcb *); +void t3_pcb_detach(struct toedev *, struct tcpcb *); +void send_abort_rpl(struct toedev *, int, int); +void release_tid(struct toedev *, unsigned int, int); + +/* cxgb_listen.c */ +void t3_init_listen_cpl_handlers(struct adapter *); +int t3_listen_start(struct toedev *, struct tcpcb *); +int t3_listen_stop(struct toedev *, struct tcpcb *); +void t3_syncache_added(struct toedev *, void *); +void t3_syncache_removed(struct toedev *, void *); +int t3_syncache_respond(struct toedev *, void *, struct mbuf *); +int do_abort_req_synqe(struct sge_qset *, struct rsp_desc *, struct mbuf *); +int do_abort_rpl_synqe(struct sge_qset *, struct rsp_desc *, struct mbuf *); +void t3_offload_socket(struct toedev *, void *, struct socket *); #endif diff --git a/sys/dev/cxgb/ulp/tom/cxgb_tom_sysctl.c b/sys/dev/cxgb/ulp/tom/cxgb_tom_sysctl.c deleted file mode 100644 index 926b4450cd0..00000000000 --- a/sys/dev/cxgb/ulp/tom/cxgb_tom_sysctl.c +++ /dev/null @@ -1,140 +0,0 @@ -/************************************************************************** - -Copyright (c) 2007, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -***************************************************************************/ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Avoid clutter in the hw.* space, keep all toe tunables within hw.cxgb */ -SYSCTL_DECL(_hw_cxgb); -static SYSCTL_NODE(_hw_cxgb, OID_AUTO, toe, CTLFLAG_RD, 0, "TOE parameters"); - -static struct tom_tunables default_tunable_vals = { - .max_host_sndbuf = 32 * 1024, - .tx_hold_thres = 0, - .max_wrs = 15, - .rx_credit_thres = 15 * 1024, - .cong_alg = -1, - .mss = 16384, - .delack = 1, - .max_conn = -1, - .soft_backlog_limit = 0, - .ddp = 1, - .ddp_thres = 14 * 4096, - .ddp_copy_limit = 13 * 4096, - .ddp_push_wait = 1, - .ddp_rcvcoalesce = 0, - .zcopy_sosend_enabled = 0, - .zcopy_sosend_partial_thres = 40960, - .zcopy_sosend_partial_copy = 4096 * 3, - .zcopy_sosend_thres = 128 * 1024, - .zcopy_sosend_copy = 4096 * 2, - .zcopy_sosend_ret_pending_dma = 1, - .activated = 1, -}; - -static int activated = 1; -TUNABLE_INT("hw.cxgb.toe.activated", &activated); -SYSCTL_UINT(_hw_cxgb_toe, OID_AUTO, activated, CTLFLAG_RDTUN, &activated, 0, - "enable TOE at init time"); - -static int ddp = 1; -TUNABLE_INT("hw.cxgb.toe.ddp", &ddp); -SYSCTL_UINT(_hw_cxgb_toe, OID_AUTO, ddp, CTLFLAG_RDTUN, &ddp, 0, "enable DDP"); - -void -t3_init_tunables(struct tom_data *t) -{ - t->conf = default_tunable_vals; - - /* Adjust tunables */ - t->conf.activated = activated; - t->conf.ddp = ddp; - - /* Now apply device specific fixups. */ - t->conf.mss = T3C_DATA(t->cdev)->tx_max_chunk; - t->conf.max_wrs = T3C_DATA(t->cdev)->max_wrs; -} - -void -t3_sysctl_register(struct adapter *sc, const struct tom_tunables *p) -{ - struct sysctl_ctx_list *ctx; - struct sysctl_oid_list *children; - - ctx = device_get_sysctl_ctx(sc->dev); - children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)); - -} - diff --git a/sys/dev/cxgbe/adapter.h b/sys/dev/cxgbe/adapter.h index 020c4738056..5b0efa1ff31 100644 --- a/sys/dev/cxgbe/adapter.h +++ b/sys/dev/cxgbe/adapter.h @@ -44,6 +44,7 @@ #include #include #include +#include #include #include "offload.h" @@ -156,6 +157,7 @@ enum { INTR_DIRECT = (1 << 2), /* direct interrupts for everything */ MASTER_PF = (1 << 3), ADAP_SYSCTL_CTX = (1 << 4), + TOM_INIT_DONE = (1 << 5), CXGBE_BUSY = (1 << 9), @@ -198,7 +200,7 @@ struct port_info { int first_txq; /* index of first tx queue */ int nrxq; /* # of rx queues */ int first_rxq; /* index of first rx queue */ -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD int nofldtxq; /* # of offload tx queues */ int first_ofld_txq; /* index of first offload tx queue */ int nofldrxq; /* # of offload rx queues */ @@ -212,6 +214,8 @@ struct port_info { struct link_config link_cfg; struct port_stats stats; + eventhandler_tag vlan_c; + struct callout tick; struct sysctl_ctx_list ctx; /* from ifconfig up to driver detach */ @@ -295,7 +299,7 @@ struct sge_iq { enum { EQ_CTRL = 1, EQ_ETH = 2, -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD EQ_OFLD = 3, #endif @@ -388,7 +392,7 @@ struct sge_txq { /* stats for common events first */ uint64_t txcsum; /* # of times hardware assisted with checksum */ - uint64_t tso_wrs; /* # of IPv4 TSO work requests */ + uint64_t tso_wrs; /* # of TSO work requests */ uint64_t vlan_insertion;/* # of times VLAN tag was inserted */ uint64_t imm_wrs; /* # of work requests with immediate data */ uint64_t sgl_wrs; /* # of work requests with direct SGL */ @@ -408,7 +412,7 @@ struct sge_rxq { struct sge_fl fl; /* MUST follow iq */ struct ifnet *ifp; /* the interface this rxq belongs to */ -#ifdef INET +#if defined(INET) || defined(INET6) struct lro_ctrl lro; /* LRO state */ #endif @@ -421,14 +425,36 @@ struct sge_rxq { } __aligned(CACHE_LINE_SIZE); -#ifndef TCP_OFFLOAD_DISABLE +static inline struct sge_rxq * +iq_to_rxq(struct sge_iq *iq) +{ + + return (member2struct(sge_rxq, iq, iq)); +} + + +#ifdef TCP_OFFLOAD /* ofld_rxq: SGE ingress queue + SGE free list + miscellaneous items */ struct sge_ofld_rxq { struct sge_iq iq; /* MUST be first */ struct sge_fl fl; /* MUST follow iq */ } __aligned(CACHE_LINE_SIZE); + +static inline struct sge_ofld_rxq * +iq_to_ofld_rxq(struct sge_iq *iq) +{ + + return (member2struct(sge_ofld_rxq, iq, iq)); +} #endif +struct wrqe { + STAILQ_ENTRY(wrqe) link; + struct sge_wrq *wrq; + int wr_len; + uint64_t wr[] __aligned(16); +}; + /* * wrq: SGE egress queue that is given prebuilt work requests. Both the control * and offload tx queues are of this type. @@ -437,8 +463,9 @@ struct sge_wrq { struct sge_eq eq; /* MUST be first */ struct adapter *adapter; - struct mbuf *head; /* held up due to lack of descriptors */ - struct mbuf *tail; /* valid only if head is valid */ + + /* List of WRs held up due to lack of tx descriptors */ + STAILQ_HEAD(, wrqe) wr_list; /* stats for common events first */ @@ -456,7 +483,7 @@ struct sge { int nrxq; /* total # of Ethernet rx queues */ int ntxq; /* total # of Ethernet tx tx queues */ -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD int nofldrxq; /* total # of TOE rx queues */ int nofldtxq; /* total # of TOE tx queues */ #endif @@ -468,7 +495,7 @@ struct sge { struct sge_wrq *ctrlq; /* Control queues */ struct sge_txq *txq; /* NIC tx queues */ struct sge_rxq *rxq; /* NIC rx queues */ -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD struct sge_wrq *ofld_txq; /* TOE tx queues */ struct sge_ofld_rxq *ofld_rxq; /* TOE rx queues */ #endif @@ -482,6 +509,7 @@ struct sge { struct rss_header; typedef int (*cpl_handler_t)(struct sge_iq *, const struct rss_header *, struct mbuf *); +typedef int (*an_handler_t)(struct sge_iq *, const struct rsp_ctrl *); struct adapter { SLIST_ENTRY(adapter) link; @@ -518,15 +546,15 @@ struct adapter { uint8_t chan_map[NCHAN]; uint32_t filter_mode; -#ifndef TCP_OFFLOAD_DISABLE - struct uld_softc tom; +#ifdef TCP_OFFLOAD + void *tom_softc; /* (struct tom_data *) */ struct tom_tunables tt; #endif struct l2t_data *l2t; /* L2 table */ struct tid_info tids; int open_device_map; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD int offload_map; #endif int flags; @@ -553,7 +581,8 @@ struct adapter { TAILQ_HEAD(, sge_fl) sfl; struct callout sfl_callout; - cpl_handler_t cpl_handler[256] __aligned(CACHE_LINE_SIZE); + an_handler_t an_handler __aligned(CACHE_LINE_SIZE); + cpl_handler_t cpl_handler[256]; }; #define ADAPTER_LOCK(sc) mtx_lock(&(sc)->sc_lock) @@ -608,82 +637,96 @@ struct adapter { static inline uint32_t t4_read_reg(struct adapter *sc, uint32_t reg) { + return bus_space_read_4(sc->bt, sc->bh, reg); } static inline void t4_write_reg(struct adapter *sc, uint32_t reg, uint32_t val) { + bus_space_write_4(sc->bt, sc->bh, reg, val); } static inline uint64_t t4_read_reg64(struct adapter *sc, uint32_t reg) { + return t4_bus_space_read_8(sc->bt, sc->bh, reg); } static inline void t4_write_reg64(struct adapter *sc, uint32_t reg, uint64_t val) { + t4_bus_space_write_8(sc->bt, sc->bh, reg, val); } static inline void t4_os_pci_read_cfg1(struct adapter *sc, int reg, uint8_t *val) { + *val = pci_read_config(sc->dev, reg, 1); } static inline void t4_os_pci_write_cfg1(struct adapter *sc, int reg, uint8_t val) { + pci_write_config(sc->dev, reg, val, 1); } static inline void t4_os_pci_read_cfg2(struct adapter *sc, int reg, uint16_t *val) { + *val = pci_read_config(sc->dev, reg, 2); } static inline void t4_os_pci_write_cfg2(struct adapter *sc, int reg, uint16_t val) { + pci_write_config(sc->dev, reg, val, 2); } static inline void t4_os_pci_read_cfg4(struct adapter *sc, int reg, uint32_t *val) { + *val = pci_read_config(sc->dev, reg, 4); } static inline void t4_os_pci_write_cfg4(struct adapter *sc, int reg, uint32_t val) { + pci_write_config(sc->dev, reg, val, 4); } static inline struct port_info * adap2pinfo(struct adapter *sc, int idx) { + return (sc->port[idx]); } static inline void t4_os_set_hw_addr(struct adapter *sc, int idx, uint8_t hw_addr[]) { + bcopy(hw_addr, sc->port[idx]->hw_addr, ETHER_ADDR_LEN); } static inline bool is_10G_port(const struct port_info *pi) { + return ((pi->link_cfg.supported & FW_PORT_CAP_SPEED_10G) != 0); } static inline int tx_resume_threshold(struct sge_eq *eq) { + return (eq->qsize / 4); } @@ -697,6 +740,7 @@ void t4_os_portmod_changed(const struct adapter *, int); void t4_os_link_changed(struct adapter *, int, int); void t4_iterate(void (*)(struct adapter *, void *), void *); int t4_register_cpl_handler(struct adapter *, int, cpl_handler_t); +int t4_register_an_handler(struct adapter *, an_handler_t); /* t4_sge.c */ void t4_sge_modload(void); @@ -713,21 +757,45 @@ void t4_intr_all(void *); void t4_intr(void *); void t4_intr_err(void *); void t4_intr_evt(void *); -int t4_mgmt_tx(struct adapter *, struct mbuf *); -int t4_wrq_tx_locked(struct adapter *, struct sge_wrq *, struct mbuf *); +void t4_wrq_tx_locked(struct adapter *, struct sge_wrq *, struct wrqe *); int t4_eth_tx(struct ifnet *, struct sge_txq *, struct mbuf *); void t4_update_fl_bufsize(struct ifnet *); int can_resume_tx(struct sge_eq *); -static inline int t4_wrq_tx(struct adapter *sc, struct sge_wrq *wrq, struct mbuf *m) +static inline struct wrqe * +alloc_wrqe(int wr_len, struct sge_wrq *wrq) { - int rc; + int len = offsetof(struct wrqe, wr) + wr_len; + struct wrqe *wr; - TXQ_LOCK(wrq); - rc = t4_wrq_tx_locked(sc, wrq, m); - TXQ_UNLOCK(wrq); - return (rc); + wr = malloc(len, M_CXGBE, M_NOWAIT); + if (__predict_false(wr == NULL)) + return (NULL); + wr->wr_len = wr_len; + wr->wrq = wrq; + return (wr); } +static inline void * +wrtod(struct wrqe *wr) +{ + return (&wr->wr[0]); +} + +static inline void +free_wrqe(struct wrqe *wr) +{ + free(wr, M_CXGBE); +} + +static inline void +t4_wrq_tx(struct adapter *sc, struct wrqe *wr) +{ + struct sge_wrq *wrq = wr->wrq; + + TXQ_LOCK(wrq); + t4_wrq_tx_locked(sc, wrq, wr); + TXQ_UNLOCK(wrq); +} #endif diff --git a/sys/dev/cxgbe/common/common.h b/sys/dev/cxgbe/common/common.h index 81866df633e..7d97e148517 100644 --- a/sys/dev/cxgbe/common/common.h +++ b/sys/dev/cxgbe/common/common.h @@ -38,6 +38,8 @@ enum { SERNUM_LEN = 24, /* Serial # length */ EC_LEN = 16, /* E/C length */ ID_LEN = 16, /* ID length */ + PN_LEN = 16, /* Part Number length */ + MACADDR_LEN = 12, /* MAC Address length */ }; enum { MEM_EDC0, MEM_EDC1, MEM_MC }; @@ -62,8 +64,8 @@ enum { }; #define FW_VERSION_MAJOR 1 -#define FW_VERSION_MINOR 4 -#define FW_VERSION_MICRO 16 +#define FW_VERSION_MINOR 5 +#define FW_VERSION_MICRO 2 struct port_stats { u64 tx_octets; /* total # of octets in good frames */ @@ -219,6 +221,8 @@ struct vpd_params { u8 ec[EC_LEN + 1]; u8 sn[SERNUM_LEN + 1]; u8 id[ID_LEN + 1]; + u8 pn[PN_LEN + 1]; + u8 na[MACADDR_LEN + 1]; }; struct pci_params { @@ -356,6 +360,8 @@ void t4_write_indirect(struct adapter *adap, unsigned int addr_reg, unsigned int data_reg, const u32 *vals, unsigned int nregs, unsigned int start_idx); +u32 t4_hw_pci_read_cfg4(adapter_t *adapter, int reg); + struct fw_filter_wr; void t4_intr_enable(struct adapter *adapter); @@ -374,7 +380,7 @@ int t4_seeprom_wp(struct adapter *adapter, int enable); int t4_read_flash(struct adapter *adapter, unsigned int addr, unsigned int nwords, u32 *data, int byte_oriented); int t4_load_fw(struct adapter *adapter, const u8 *fw_data, unsigned int size); -int t4_load_boot(struct adapter *adap, const u8 *boot_data, +int t4_load_boot(struct adapter *adap, u8 *boot_data, unsigned int boot_addr, unsigned int size); unsigned int t4_flash_cfg_addr(struct adapter *adapter); int t4_load_cfg(struct adapter *adapter, const u8 *cfg_data, unsigned int size); @@ -431,6 +437,9 @@ int t4_mem_read(struct adapter *adap, int mtype, u32 addr, u32 size, __be32 *data); void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p); +void t4_get_port_stats_offset(struct adapter *adap, int idx, + struct port_stats *stats, + struct port_stats *offset); void t4_get_lb_stats(struct adapter *adap, int idx, struct lb_port_stats *p); void t4_clr_port_stats(struct adapter *adap, int idx); @@ -472,6 +481,10 @@ int t4_fw_hello(struct adapter *adap, unsigned int mbox, unsigned int evt_mbox, enum dev_master master, enum dev_state *state); int t4_fw_bye(struct adapter *adap, unsigned int mbox); int t4_fw_reset(struct adapter *adap, unsigned int mbox, int reset); +int t4_fw_halt(struct adapter *adap, unsigned int mbox, int force); +int t4_fw_restart(struct adapter *adap, unsigned int mbox, int reset); +int t4_fw_upgrade(struct adapter *adap, unsigned int mbox, + const u8 *fw_data, unsigned int size, int force); int t4_fw_initialize(struct adapter *adap, unsigned int mbox); int t4_query_params(struct adapter *adap, unsigned int mbox, unsigned int pf, unsigned int vf, unsigned int nparams, const u32 *params, @@ -484,6 +497,10 @@ int t4_cfg_pfvf(struct adapter *adap, unsigned int mbox, unsigned int pf, unsigned int rxqi, unsigned int rxq, unsigned int tc, unsigned int vi, unsigned int cmask, unsigned int pmask, unsigned int exactf, unsigned int rcaps, unsigned int wxcaps); +int t4_alloc_vi_func(struct adapter *adap, unsigned int mbox, + unsigned int port, unsigned int pf, unsigned int vf, + unsigned int nmac, u8 *mac, unsigned int *rss_size, + unsigned int portfunc, unsigned int idstype); int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port, unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac, unsigned int *rss_size); @@ -524,5 +541,10 @@ int t4_sge_ctxt_rd(struct adapter *adap, unsigned int mbox, unsigned int cid, enum ctxt_type ctype, u32 *data); int t4_sge_ctxt_rd_bd(struct adapter *adap, unsigned int cid, enum ctxt_type ctype, u32 *data); +int t4_sge_ctxt_flush(struct adapter *adap, unsigned int mbox); int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl); +int t4_fwaddrspace_write(struct adapter *adap, unsigned int mbox, u32 addr, u32 val); +int t4_config_scheduler(struct adapter *adapter, int mode, int level, int pktsize, + int sched_class, int port, int rate, int unit, + int weight, int minrate, int maxrate); #endif /* __CHELSIO_COMMON_H */ diff --git a/sys/dev/cxgbe/common/t4_hw.c b/sys/dev/cxgbe/common/t4_hw.c index 6f4dd8de4c0..8cdcfe30d87 100644 --- a/sys/dev/cxgbe/common/t4_hw.c +++ b/sys/dev/cxgbe/common/t4_hw.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 Chelsio Communications, Inc. + * Copyright (c) 2012 Chelsio Communications, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,6 +27,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + #include "common.h" #include "t4_regs.h" #include "t4_regs_values.h" @@ -132,6 +134,20 @@ void t4_write_indirect(struct adapter *adap, unsigned int addr_reg, } } +/* + * Read a 32-bit PCI Configuration Space register via the PCI-E backdoor + * mechanism. This guarantees that we get the real value even if we're + * operating within a Virtual Machine and the Hypervisor is trapping our + * Configuration Space accesses. + */ +u32 t4_hw_pci_read_cfg4(adapter_t *adap, int reg) +{ + t4_write_reg(adap, A_PCIE_CFG_SPACE_REQ, + F_ENABLE | F_LOCALCFG | V_FUNCTION(adap->pf) | + V_REGISTER(reg)); + return t4_read_reg(adap, A_PCIE_CFG_SPACE_DATA); +} + /* * Get the reply to a mailbox command and store it in @rpl in big-endian order. */ @@ -194,7 +210,6 @@ int t4_wr_mbox_meat(struct adapter *adap, int mbox, const void *cmd, int size, u64 res; int i, ms, delay_idx; const __be64 *p = cmd; - u32 data_reg = PF_REG(mbox, A_CIM_PF_MAILBOX_DATA); u32 ctl_reg = PF_REG(mbox, A_CIM_PF_MAILBOX_CTRL); @@ -281,7 +296,7 @@ int t4_mc_read(struct adapter *adap, u32 addr, __be32 *data, u64 *ecc) #define MC_DATA(i) MC_BIST_STATUS_REG(A_MC_BIST_STATUS_RDATA, i) for (i = 15; i >= 0; i--) - *data++ = htonl(t4_read_reg(adap, MC_DATA(i))); + *data++ = ntohl(t4_read_reg(adap, MC_DATA(i))); if (ecc) *ecc = t4_read_reg64(adap, MC_DATA(16)); #undef MC_DATA @@ -319,7 +334,7 @@ int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, u64 *ecc) #define EDC_DATA(i) (EDC_BIST_STATUS_REG(A_EDC_BIST_STATUS_RDATA, i) + idx) for (i = 15; i >= 0; i--) - *data++ = htonl(t4_read_reg(adap, EDC_DATA(i))); + *data++ = ntohl(t4_read_reg(adap, EDC_DATA(i))); if (ecc) *ecc = t4_read_reg64(adap, EDC_DATA(16)); #undef EDC_DATA @@ -564,7 +579,7 @@ static int get_vpd_keyword_val(const struct t4_vpd_hdr *v, const char *kw) static int get_vpd_params(struct adapter *adapter, struct vpd_params *p) { int i, ret, addr; - int ec, sn; + int ec, sn, pn, na; u8 vpd[VPD_LEN], csum; const struct t4_vpd_hdr *v; @@ -600,6 +615,8 @@ static int get_vpd_params(struct adapter *adapter, struct vpd_params *p) } FIND_VPD_KW(ec, "EC"); FIND_VPD_KW(sn, "SN"); + FIND_VPD_KW(pn, "PN"); + FIND_VPD_KW(na, "NA"); #undef FIND_VPD_KW memcpy(p->id, v->id_data, ID_LEN); @@ -609,6 +626,10 @@ static int get_vpd_params(struct adapter *adapter, struct vpd_params *p) i = vpd[sn - VPD_INFO_FLD_HDR_SIZE + 2]; memcpy(p->sn, vpd + sn, min(i, SERNUM_LEN)); strstrip(p->sn); + memcpy(p->pn, vpd + pn, min(i, PN_LEN)); + strstrip((char *)p->pn); + memcpy(p->na, vpd + na, min(i, MACADDR_LEN)); + strstrip((char *)p->na); return 0; } @@ -952,7 +973,7 @@ int t4_load_cfg(struct adapter *adap, const u8 *cfg_data, unsigned int size) if (ret || size == 0) goto out; - /* this will write to the flash up to SF_PAGE_SIZE at a time */ + /* this will write to the flash up to SF_PAGE_SIZE at a time */ for (i = 0; i< size; i+= SF_PAGE_SIZE) { if ( (size - i) < SF_PAGE_SIZE) n = size - i; @@ -1054,41 +1075,208 @@ out: return ret; } -/* BIOS boot header */ -typedef struct boot_header_s { - u8 signature[2]; /* signature */ - u8 length; /* image length (include header) */ - u8 offset[4]; /* initialization vector */ - u8 reserved[19]; /* reserved */ - u8 exheader[2]; /* offset to expansion header */ -} boot_header_t; +/* BIOS boot headers */ +typedef struct pci_expansion_rom_header { + u8 signature[2]; /* ROM Signature. Should be 0xaa55 */ + u8 reserved[22]; /* Reserved per processor Architecture data */ + u8 pcir_offset[2]; /* Offset to PCI Data Structure */ +} pci_exp_rom_header_t; /* PCI_EXPANSION_ROM_HEADER */ +/* Legacy PCI Expansion ROM Header */ +typedef struct legacy_pci_expansion_rom_header { + u8 signature[2]; /* ROM Signature. Should be 0xaa55 */ + u8 size512; /* Current Image Size in units of 512 bytes */ + u8 initentry_point[4]; + u8 cksum; /* Checksum computed on the entire Image */ + u8 reserved[16]; /* Reserved */ + u8 pcir_offset[2]; /* Offset to PCI Data Struture */ +} legacy_pci_exp_rom_header_t; /* LEGACY_PCI_EXPANSION_ROM_HEADER */ + +/* EFI PCI Expansion ROM Header */ +typedef struct efi_pci_expansion_rom_header { + u8 signature[2]; // ROM signature. The value 0xaa55 + u8 initialization_size[2]; /* Units 512. Includes this header */ + u8 efi_signature[4]; /* Signature from EFI image header. 0x0EF1 */ + u8 efi_subsystem[2]; /* Subsystem value for EFI image header */ + u8 efi_machine_type[2]; /* Machine type from EFI image header */ + u8 compression_type[2]; /* Compression type. */ + /* + * Compression type definition + * 0x0: uncompressed + * 0x1: Compressed + * 0x2-0xFFFF: Reserved + */ + u8 reserved[8]; /* Reserved */ + u8 efi_image_header_offset[2]; /* Offset to EFI Image */ + u8 pcir_offset[2]; /* Offset to PCI Data Structure */ +} efi_pci_exp_rom_header_t; /* EFI PCI Expansion ROM Header */ + +/* PCI Data Structure Format */ +typedef struct pcir_data_structure { /* PCI Data Structure */ + u8 signature[4]; /* Signature. The string "PCIR" */ + u8 vendor_id[2]; /* Vendor Identification */ + u8 device_id[2]; /* Device Identification */ + u8 vital_product[2]; /* Pointer to Vital Product Data */ + u8 length[2]; /* PCIR Data Structure Length */ + u8 revision; /* PCIR Data Structure Revision */ + u8 class_code[3]; /* Class Code */ + u8 image_length[2]; /* Image Length. Multiple of 512B */ + u8 code_revision[2]; /* Revision Level of Code/Data */ + u8 code_type; /* Code Type. */ + /* + * PCI Expansion ROM Code Types + * 0x00: Intel IA-32, PC-AT compatible. Legacy + * 0x01: Open Firmware standard for PCI. FCODE + * 0x02: Hewlett-Packard PA RISC. HP reserved + * 0x03: EFI Image. EFI + * 0x04-0xFF: Reserved. + */ + u8 indicator; /* Indicator. Identifies the last image in the ROM */ + u8 reserved[2]; /* Reserved */ +} pcir_data_t; /* PCI__DATA_STRUCTURE */ + +/* BOOT constants */ enum { BOOT_FLASH_BOOT_ADDR = 0x0,/* start address of boot image in flash */ BOOT_SIGNATURE = 0xaa55, /* signature of BIOS boot ROM */ BOOT_SIZE_INC = 512, /* image size measured in 512B chunks */ - BOOT_MIN_SIZE = sizeof(boot_header_t), /* at least basic header */ - BOOT_MAX_SIZE = 1024*BOOT_SIZE_INC /* 1 byte * length increment */ + BOOT_MIN_SIZE = sizeof(pci_exp_rom_header_t), /* basic header */ + BOOT_MAX_SIZE = 1024*BOOT_SIZE_INC, /* 1 byte * length increment */ + VENDOR_ID = 0x1425, /* Vendor ID */ + PCIR_SIGNATURE = 0x52494350 /* PCIR signature */ }; +/* + * modify_device_id - Modifies the device ID of the Boot BIOS image + * @adatper: the device ID to write. + * @boot_data: the boot image to modify. + * + * Write the supplied device ID to the boot BIOS image. + */ +static void modify_device_id(int device_id, u8 *boot_data) +{ + legacy_pci_exp_rom_header_t *header; + pcir_data_t *pcir_header; + u32 cur_header = 0; + + /* + * Loop through all chained images and change the device ID's + */ + while (1) { + header = (legacy_pci_exp_rom_header_t *) &boot_data[cur_header]; + pcir_header = (pcir_data_t *) &boot_data[cur_header + + le16_to_cpu(*(u16*)header->pcir_offset)]; + + /* + * Only modify the Device ID if code type is Legacy or HP. + * 0x00: Okay to modify + * 0x01: FCODE. Do not be modify + * 0x03: Okay to modify + * 0x04-0xFF: Do not modify + */ + if (pcir_header->code_type == 0x00) { + u8 csum = 0; + int i; + + /* + * Modify Device ID to match current adatper + */ + *(u16*) pcir_header->device_id = device_id; + + /* + * Set checksum temporarily to 0. + * We will recalculate it later. + */ + header->cksum = 0x0; + + /* + * Calculate and update checksum + */ + for (i = 0; i < (header->size512 * 512); i++) + csum += (u8)boot_data[cur_header + i]; + + /* + * Invert summed value to create the checksum + * Writing new checksum value directly to the boot data + */ + boot_data[cur_header + 7] = -csum; + + } else if (pcir_header->code_type == 0x03) { + + /* + * Modify Device ID to match current adatper + */ + *(u16*) pcir_header->device_id = device_id; + + } + + + /* + * Check indicator element to identify if this is the last + * image in the ROM. + */ + if (pcir_header->indicator & 0x80) + break; + + /* + * Move header pointer up to the next image in the ROM. + */ + cur_header += header->size512 * 512; + } +} + /* * t4_load_boot - download boot flash * @adapter: the adapter * @boot_data: the boot image to write + * @boot_addr: offset in flash to write boot_data * @size: image size * * Write the supplied boot image to the card's serial flash. * The boot image has the following sections: a 28-byte header and the * boot image. */ -int t4_load_boot(struct adapter *adap, const u8 *boot_data, +int t4_load_boot(struct adapter *adap, u8 *boot_data, unsigned int boot_addr, unsigned int size) { + pci_exp_rom_header_t *header; + int pcir_offset ; + pcir_data_t *pcir_header; int ret, addr; + uint16_t device_id; unsigned int i; unsigned int boot_sector = boot_addr * 1024; unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec; + /* + * Make sure the boot image does not encroach on the firmware region + */ + if ((boot_sector + size) >> 16 > FLASH_FW_START_SEC) { + CH_ERR(adap, "boot image encroaching on firmware region\n"); + return -EFBIG; + } + + /* + * Number of sectors spanned + */ + i = DIV_ROUND_UP(size ? size : FLASH_BOOTCFG_MAX_SIZE, + sf_sec_size); + ret = t4_flash_erase_sectors(adap, boot_sector >> 16, + (boot_sector >> 16) + i - 1); + + /* + * If size == 0 then we're simply erasing the FLASH sectors associated + * with the on-adapter option ROM file + */ + if (ret || (size == 0)) + goto out; + + /* Get boot header */ + header = (pci_exp_rom_header_t *)boot_data; + pcir_offset = le16_to_cpu(*(u16 *)header->pcir_offset); + /* PCIR Data Structure */ + pcir_header = (pcir_data_t *) &boot_data[pcir_offset]; + /* * Perform some primitive sanity testing to avoid accidentally * writing garbage over the boot sectors. We ought to check for @@ -1100,18 +1288,46 @@ int t4_load_boot(struct adapter *adap, const u8 *boot_data, } /* - * Make sure the boot image does not encroach on the firmware region + * Check BOOT ROM header signature */ - if ((boot_sector + size) >> 16 > FLASH_FW_START_SEC) { - CH_ERR(adap, "boot image encroaching on firmware region\n"); - return -EFBIG; + if (le16_to_cpu(*(u16*)header->signature) != BOOT_SIGNATURE ) { + CH_ERR(adap, "Boot image missing signature\n"); + return -EINVAL; } - i = DIV_ROUND_UP(size, sf_sec_size); /* # of sectors spanned */ - ret = t4_flash_erase_sectors(adap, boot_sector >> 16, - (boot_sector >> 16) + i - 1); - if (ret) - goto out; + /* + * Check PCI header signature + */ + if (le32_to_cpu(*(u32*)pcir_header->signature) != PCIR_SIGNATURE) { + CH_ERR(adap, "PCI header missing signature\n"); + return -EINVAL; + } + + /* + * Check Vendor ID matches Chelsio ID + */ + if (le16_to_cpu(*(u16*)pcir_header->vendor_id) != VENDOR_ID) { + CH_ERR(adap, "Vendor ID missing signature\n"); + return -EINVAL; + } + + /* + * Retrieve adapter's device ID + */ + t4_os_pci_read_cfg2(adap, PCI_DEVICE_ID, &device_id); + /* Want to deal with PF 0 so I strip off PF 4 indicator */ + device_id = (device_id & 0xff) | 0x4000; + + /* + * Check PCIE Device ID + */ + if (le16_to_cpu(*(u16*)pcir_header->device_id) != device_id) { + /* + * Change the device ID in the Boot BIOS image to match + * the Device ID of the current adapter. + */ + modify_device_id(device_id, boot_data); + } /* * Skip over the first SF_PAGE_SIZE worth of data and write it after @@ -3204,7 +3420,11 @@ void t4_get_chan_txrate(struct adapter *adap, u64 *nic_rate, u64 *ofld_rate) * @enable: whether to enable or disable the filter * * Configures one of the tracing filters available in HW. If @enable is - * %0 @tp is not examined and may be %NULL. + * %0 @tp is not examined and may be %NULL. The user is responsible to + * set the single/multiple trace mode by writing to A_MPS_TRC_CFG register + * by using "cxgbtool iface reg reg_addr=val" command. See t4_sniffer/ + * docs/readme.txt for a complete description of how to setup traceing on + * T4. */ int t4_set_trace_filter(struct adapter *adap, const struct trace_params *tp, int idx, int enable) @@ -3215,45 +3435,45 @@ int t4_set_trace_filter(struct adapter *adap, const struct trace_params *tp, int if (!enable) { t4_write_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A + ofst, 0); - goto out; + return 0; } - if (tp->port > 11 || tp->invert > 1 || tp->skip_len > M_TFLENGTH || - tp->skip_ofst > M_TFOFFSET || tp->min_len > M_TFMINPKTSIZE || - tp->snap_len > 9600 || (idx && tp->snap_len > 256)) - return -EINVAL; - - if (tp->snap_len > 256) { /* must be tracer 0 */ - if ((t4_read_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A + 4) | - t4_read_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A + 8) | - t4_read_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A + 12)) & - F_TFEN) - return -EINVAL; /* other tracers are enabled */ + /* + * TODO - After T4 data book is updated, specify the exact + * section below. + * + * See T4 data book - MPS section for a complete description + * of the below if..else handling of A_MPS_TRC_CFG register + * value. + */ + cfg = t4_read_reg(adap, A_MPS_TRC_CFG); + if (cfg & F_TRCMULTIFILTER) { + /* + * If multiple tracers are enabled, then maximum + * capture size is 2.5KB (FIFO size of a single channel) + * minus 2 flits for CPL_TRACE_PKT header. + */ + if (tp->snap_len > ((10 * 1024 / 4) - (2 * 8))) + return -EINVAL; + } + else { + /* + * If multiple tracers are disabled, to avoid deadlocks + * maximum packet capture size of 9600 bytes is recommended. + * Also in this mode, only trace0 can be enabled and running. + */ multitrc = 0; - } else if (idx) { - i = t4_read_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_B); - if (G_TFCAPTUREMAX(i) > 256 && - (t4_read_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A) & F_TFEN)) + if (tp->snap_len > 9600 || idx) return -EINVAL; } + if (tp->port > 11 || tp->invert > 1 || tp->skip_len > M_TFLENGTH || + tp->skip_ofst > M_TFOFFSET || tp->min_len > M_TFMINPKTSIZE) + return -EINVAL; + /* stop the tracer we'll be changing */ t4_write_reg(adap, A_MPS_TRC_FILTER_MATCH_CTL_A + ofst, 0); - /* disable tracing globally if running in the wrong single/multi mode */ - cfg = t4_read_reg(adap, A_MPS_TRC_CFG); - if ((cfg & F_TRCEN) && multitrc != (cfg & F_TRCMULTIFILTER)) { - t4_write_reg(adap, A_MPS_TRC_CFG, cfg ^ F_TRCEN); - t4_read_reg(adap, A_MPS_TRC_CFG); /* flush */ - msleep(1); - if (!(t4_read_reg(adap, A_MPS_TRC_CFG) & F_TRCFIFOEMPTY)) - return -ETIMEDOUT; - } - /* - * At this point either the tracing is enabled and in the right mode or - * disabled. - */ - idx *= (A_MPS_TRC_FILTER1_MATCH - A_MPS_TRC_FILTER0_MATCH); data_reg = A_MPS_TRC_FILTER0_MATCH + idx; mask_reg = A_MPS_TRC_FILTER0_DONT_CARE + idx; @@ -3269,9 +3489,6 @@ int t4_set_trace_filter(struct adapter *adap, const struct trace_params *tp, int V_TFOFFSET(tp->skip_ofst) | V_TFLENGTH(tp->skip_len) | V_TFPORT(tp->port) | F_TFEN | V_TFINVERTMATCH(tp->invert)); - cfg &= ~F_TRCMULTIFILTER; - t4_write_reg(adap, A_MPS_TRC_CFG, cfg | F_TRCEN | multitrc); -out: t4_read_reg(adap, A_MPS_TRC_CFG); /* flush */ return 0; } @@ -3370,6 +3587,28 @@ static unsigned int get_mps_bg_map(struct adapter *adap, int idx) return 1 << idx; } +/** + * t4_get_port_stats_offset - collect port stats relative to a previous + * snapshot + * @adap: The adapter + * @idx: The port + * @stats: Current stats to fill + * @offset: Previous stats snapshot + */ +void t4_get_port_stats_offset(struct adapter *adap, int idx, + struct port_stats *stats, + struct port_stats *offset) +{ + u64 *s, *o; + int i; + + t4_get_port_stats(adap, idx, stats); + for (i = 0, s = (u64 *)stats, o = (u64 *)offset ; + i < (sizeof(struct port_stats)/sizeof(u64)) ; + i++, s++, o++) + *s -= *o; +} + /** * t4_get_port_stats - collect port statistics * @adap: the adapter @@ -3631,6 +3870,20 @@ void t4_mk_filtdelwr(unsigned int ftid, struct fw_filter_wr *wr, int qid) (var).retval_len16 = htonl(FW_LEN16(var)); \ } while (0) +int t4_fwaddrspace_write(struct adapter *adap, unsigned int mbox, u32 addr, u32 val) +{ + struct fw_ldst_cmd c; + + memset(&c, 0, sizeof(c)); + c.op_to_addrspace = htonl(V_FW_CMD_OP(FW_LDST_CMD) | F_FW_CMD_REQUEST | + F_FW_CMD_WRITE | V_FW_LDST_CMD_ADDRSPACE(FW_LDST_ADDRSPC_FIRMWARE)); + c.cycles_to_len16 = htonl(FW_LEN16(c)); + c.u.addrval.addr = htonl(addr); + c.u.addrval.val = htonl(val); + + return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); +} + /** * t4_mdio_rd - read a PHY register through MDIO * @adap: the adapter @@ -3690,6 +3943,30 @@ int t4_mdio_wr(struct adapter *adap, unsigned int mbox, unsigned int phy_addr, return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); } +/** + * t4_sge_ctxt_flush - flush the SGE context cache + * @adap: the adapter + * @mbox: mailbox to use for the FW command + * + * Issues a FW command through the given mailbox to flush the + * SGE context cache. + */ +int t4_sge_ctxt_flush(struct adapter *adap, unsigned int mbox) +{ + int ret; + struct fw_ldst_cmd c; + + memset(&c, 0, sizeof(c)); + c.op_to_addrspace = htonl(V_FW_CMD_OP(FW_LDST_CMD) | F_FW_CMD_REQUEST | + F_FW_CMD_READ | + V_FW_LDST_CMD_ADDRSPACE(FW_LDST_ADDRSPC_SGE_EGRC)); + c.cycles_to_len16 = htonl(FW_LEN16(c)); + c.u.idctxt.msg_ctxtflush = htonl(F_FW_LDST_CMD_CTXTFLUSH); + + ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c); + return ret; +} + /** * t4_sge_ctxt_rd - read an SGE context through FW * @adap: the adapter @@ -3762,9 +4039,10 @@ int t4_sge_ctxt_rd_bd(struct adapter *adap, unsigned int cid, enum ctxt_type cty * @mbox: mailbox to use for the FW command * @evt_mbox: mailbox to receive async FW events * @master: specifies the caller's willingness to be the device master - * @state: returns the current device state + * @state: returns the current device state (if non-NULL) * - * Issues a command to establish communication with FW. + * Issues a command to establish communication with FW. Returns either + * an error (negative integer) or the mailbox of the Master PF. */ int t4_fw_hello(struct adapter *adap, unsigned int mbox, unsigned int evt_mbox, enum dev_master master, enum dev_state *state) @@ -3915,6 +4193,175 @@ int t4_fw_reset(struct adapter *adap, unsigned int mbox, int reset) return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); } +/** + * t4_fw_halt - issue a reset/halt to FW and put uP into RESET + * @adap: the adapter + * @mbox: mailbox to use for the FW RESET command (if desired) + * @force: force uP into RESET even if FW RESET command fails + * + * Issues a RESET command to firmware (if desired) with a HALT indication + * and then puts the microprocessor into RESET state. The RESET command + * will only be issued if a legitimate mailbox is provided (mbox <= + * M_PCIE_FW_MASTER). + * + * This is generally used in order for the host to safely manipulate the + * adapter without fear of conflicting with whatever the firmware might + * be doing. The only way out of this state is to RESTART the firmware + * ... + */ +int t4_fw_halt(struct adapter *adap, unsigned int mbox, int force) +{ + int ret = 0; + + /* + * If a legitimate mailbox is provided, issue a RESET command + * with a HALT indication. + */ + if (mbox <= M_PCIE_FW_MASTER) { + struct fw_reset_cmd c; + + memset(&c, 0, sizeof(c)); + INIT_CMD(c, RESET, WRITE); + c.val = htonl(F_PIORST | F_PIORSTMODE); + c.halt_pkd = htonl(F_FW_RESET_CMD_HALT); + ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); + } + + /* + * Normally we won't complete the operation if the firmware RESET + * command fails but if our caller insists we'll go ahead and put the + * uP into RESET. This can be useful if the firmware is hung or even + * missing ... We'll have to take the risk of putting the uP into + * RESET without the cooperation of firmware in that case. + * + * We also force the firmware's HALT flag to be on in case we bypassed + * the firmware RESET command above or we're dealing with old firmware + * which doesn't have the HALT capability. This will serve as a flag + * for the incoming firmware to know that it's coming out of a HALT + * rather than a RESET ... if it's new enough to understand that ... + */ + if (ret == 0 || force) { + t4_set_reg_field(adap, A_CIM_BOOT_CFG, F_UPCRST, F_UPCRST); + t4_set_reg_field(adap, A_PCIE_FW, F_PCIE_FW_HALT, F_PCIE_FW_HALT); + } + + /* + * And we always return the result of the firmware RESET command + * even when we force the uP into RESET ... + */ + return ret; +} + +/** + * t4_fw_restart - restart the firmware by taking the uP out of RESET + * @adap: the adapter + * @reset: if we want to do a RESET to restart things + * + * Restart firmware previously halted by t4_fw_halt(). On successful + * return the previous PF Master remains as the new PF Master and there + * is no need to issue a new HELLO command, etc. + * + * We do this in two ways: + * + * 1. If we're dealing with newer firmware we'll simply want to take + * the chip's microprocessor out of RESET. This will cause the + * firmware to start up from its start vector. And then we'll loop + * until the firmware indicates it's started again (PCIE_FW.HALT + * reset to 0) or we timeout. + * + * 2. If we're dealing with older firmware then we'll need to RESET + * the chip since older firmware won't recognize the PCIE_FW.HALT + * flag and automatically RESET itself on startup. + */ +int t4_fw_restart(struct adapter *adap, unsigned int mbox, int reset) +{ + if (reset) { + /* + * Since we're directing the RESET instead of the firmware + * doing it automatically, we need to clear the PCIE_FW.HALT + * bit. + */ + t4_set_reg_field(adap, A_PCIE_FW, F_PCIE_FW_HALT, 0); + + /* + * If we've been given a valid mailbox, first try to get the + * firmware to do the RESET. If that works, great and we can + * return success. Otherwise, if we haven't been given a + * valid mailbox or the RESET command failed, fall back to + * hitting the chip with a hammer. + */ + if (mbox <= M_PCIE_FW_MASTER) { + t4_set_reg_field(adap, A_CIM_BOOT_CFG, F_UPCRST, 0); + msleep(100); + if (t4_fw_reset(adap, mbox, + F_PIORST | F_PIORSTMODE) == 0) + return 0; + } + + t4_write_reg(adap, A_PL_RST, F_PIORST | F_PIORSTMODE); + msleep(2000); + } else { + int ms; + + t4_set_reg_field(adap, A_CIM_BOOT_CFG, F_UPCRST, 0); + for (ms = 0; ms < FW_CMD_MAX_TIMEOUT; ) { + if (!(t4_read_reg(adap, A_PCIE_FW) & F_PCIE_FW_HALT)) + return FW_SUCCESS; + msleep(100); + ms += 100; + } + return -ETIMEDOUT; + } + return 0; +} + +/** + * t4_fw_upgrade - perform all of the steps necessary to upgrade FW + * @adap: the adapter + * @mbox: mailbox to use for the FW RESET command (if desired) + * @fw_data: the firmware image to write + * @size: image size + * @force: force upgrade even if firmware doesn't cooperate + * + * Perform all of the steps necessary for upgrading an adapter's + * firmware image. Normally this requires the cooperation of the + * existing firmware in order to halt all existing activities + * but if an invalid mailbox token is passed in we skip that step + * (though we'll still put the adapter microprocessor into RESET in + * that case). + * + * On successful return the new firmware will have been loaded and + * the adapter will have been fully RESET losing all previous setup + * state. On unsuccessful return the adapter may be completely hosed ... + * positive errno indicates that the adapter is ~probably~ intact, a + * negative errno indicates that things are looking bad ... + */ +int t4_fw_upgrade(struct adapter *adap, unsigned int mbox, + const u8 *fw_data, unsigned int size, int force) +{ + const struct fw_hdr *fw_hdr = (const struct fw_hdr *)fw_data; + int reset, ret; + + ret = t4_fw_halt(adap, mbox, force); + if (ret < 0 && !force) + return ret; + + ret = t4_load_fw(adap, fw_data, size); + if (ret < 0) + return ret; + + /* + * Older versions of the firmware don't understand the new + * PCIE_FW.HALT flag and so won't know to perform a RESET when they + * restart. So for newly loaded older firmware we'll have to do the + * RESET for it so it starts up on a clean slate. We can tell if + * the newly loaded firmware will handle this right by checking + * its header flags to see if it advertises the capability. + */ + reset = ((ntohl(fw_hdr->flags) & FW_HDR_FLAGS_RESET_HALT) == 0); + return t4_fw_restart(adap, mbox, reset); +} + /** * t4_fw_initialize - ask FW to initialize the device * @adap: the adapter @@ -4057,7 +4504,7 @@ int t4_cfg_pfvf(struct adapter *adap, unsigned int mbox, unsigned int pf, } /** - * t4_alloc_vi - allocate a virtual interface + * t4_alloc_vi_func - allocate a virtual interface * @adap: the adapter * @mbox: mailbox to use for the FW command * @port: physical port associated with the VI @@ -4066,6 +4513,8 @@ int t4_cfg_pfvf(struct adapter *adap, unsigned int mbox, unsigned int pf, * @nmac: number of MAC addresses needed (1 to 5) * @mac: the MAC addresses of the VI * @rss_size: size of RSS table slice associated with this VI + * @portfunc: which Port Application Function MAC Address is desired + * @idstype: Intrusion Detection Type * * Allocates a virtual interface for the given physical port. If @mac is * not %NULL it contains the MAC addresses of the VI as assigned by FW. @@ -4073,9 +4522,10 @@ int t4_cfg_pfvf(struct adapter *adap, unsigned int mbox, unsigned int pf, * stored consecutively so the space needed is @nmac * 6 bytes. * Returns a negative error number or the non-negative VI id. */ -int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port, - unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac, - unsigned int *rss_size) +int t4_alloc_vi_func(struct adapter *adap, unsigned int mbox, + unsigned int port, unsigned int pf, unsigned int vf, + unsigned int nmac, u8 *mac, unsigned int *rss_size, + unsigned int portfunc, unsigned int idstype) { int ret; struct fw_vi_cmd c; @@ -4085,6 +4535,8 @@ int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port, F_FW_CMD_WRITE | F_FW_CMD_EXEC | V_FW_VI_CMD_PFN(pf) | V_FW_VI_CMD_VFN(vf)); c.alloc_to_len16 = htonl(F_FW_VI_CMD_ALLOC | FW_LEN16(c)); + c.type_to_viid = htons(V_FW_VI_CMD_TYPE(idstype) | + V_FW_VI_CMD_FUNC(portfunc)); c.portid_pkd = V_FW_VI_CMD_PORTID(port); c.nmac = nmac - 1; @@ -4107,7 +4559,30 @@ int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port, } if (rss_size) *rss_size = G_FW_VI_CMD_RSSSIZE(ntohs(c.rsssize_pkd)); - return G_FW_VI_CMD_VIID(ntohs(c.type_to_viid)); + return G_FW_VI_CMD_VIID(htons(c.type_to_viid)); +} + +/** + * t4_alloc_vi - allocate an [Ethernet Function] virtual interface + * @adap: the adapter + * @mbox: mailbox to use for the FW command + * @port: physical port associated with the VI + * @pf: the PF owning the VI + * @vf: the VF owning the VI + * @nmac: number of MAC addresses needed (1 to 5) + * @mac: the MAC addresses of the VI + * @rss_size: size of RSS table slice associated with this VI + * + * backwards compatible and convieniance routine to allocate a Virtual + * Interface with a Ethernet Port Application Function and Intrustion + * Detection System disabled. + */ +int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port, + unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac, + unsigned int *rss_size) +{ + return t4_alloc_vi_func(adap, mbox, port, pf, vf, nmac, mac, rss_size, + FW_VI_FUNC_ETH, 0); } /** @@ -4212,7 +4687,7 @@ int t4_alloc_mac_filt(struct adapter *adap, unsigned int mbox, unsigned int nfilters = 0; unsigned int rem = naddr; - if (naddr > FW_CLS_TCAM_NUM_ENTRIES) + if (naddr > NUM_MPS_CLS_SRAM_L_INSTANCES) return -EINVAL; for (offset = 0; offset < naddr ; /**/) { @@ -4253,10 +4728,10 @@ int t4_alloc_mac_filt(struct adapter *adap, unsigned int mbox, u16 index = G_FW_VI_MAC_CMD_IDX(ntohs(p->valid_to_idx)); if (idx) - idx[offset+i] = (index >= FW_CLS_TCAM_NUM_ENTRIES + idx[offset+i] = (index >= NUM_MPS_CLS_SRAM_L_INSTANCES ? 0xffff : index); - if (index < FW_CLS_TCAM_NUM_ENTRIES) + if (index < NUM_MPS_CLS_SRAM_L_INSTANCES) nfilters++; else if (hash) *hash |= (1ULL << hash_mac_addr(addr[offset+i])); @@ -4317,7 +4792,7 @@ int t4_change_mac(struct adapter *adap, unsigned int mbox, unsigned int viid, ret = t4_wr_mbox_ns(adap, mbox, &c, sizeof(c), &c); if (ret == 0) { ret = G_FW_VI_MAC_CMD_IDX(ntohs(p->valid_to_idx)); - if (ret >= FW_CLS_TCAM_NUM_ENTRIES) + if (ret >= NUM_MPS_CLS_SRAM_L_INSTANCES) ret = -ENOMEM; } return ret; @@ -4538,10 +5013,12 @@ int t4_ofld_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf, int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl) { u8 opcode = *(const u8 *)rpl; + const struct fw_port_cmd *p = (const void *)rpl; + unsigned int action = G_FW_PORT_CMD_ACTION(ntohl(p->action_to_len16)); - if (opcode == FW_PORT_CMD) { /* link/module state change message */ + if (opcode == FW_PORT_CMD && action == FW_PORT_ACTION_GET_PORT_INFO) { + /* link/module state change message */ int speed = 0, fc = 0, i; - const struct fw_port_cmd *p = (const void *)rpl; int chan = G_FW_PORT_CMD_PORTID(ntohl(p->op_to_portid)); struct port_info *pi = NULL; struct link_config *lc; @@ -4578,6 +5055,10 @@ int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl) pi->mod_type = mod; t4_os_portmod_changed(adap, i); } + } else { + CH_WARN_RATELIMIT(adap, + "Unknown firmware reply 0x%x (0x%x)\n", opcode, action); + return -EINVAL; } return 0; } @@ -4704,6 +5185,11 @@ int __devinit t4_prep_adapter(struct adapter *adapter) get_pci_mode(adapter, &adapter->params.pci); adapter->params.rev = t4_read_reg(adapter, A_PL_REV); + /* T4A1 chip is no longer supported */ + if (adapter->params.rev == 1) { + CH_ALERT(adapter, "T4 rev 1 chip is no longer supported\n"); + return -EINVAL; + } adapter->params.pci.vpd_cap_addr = t4_os_find_pci_capability(adapter, PCI_CAP_ID_VPD); @@ -4715,9 +5201,11 @@ int __devinit t4_prep_adapter(struct adapter *adapter) if (ret < 0) return ret; - if (t4_read_reg(adapter, A_SGE_PC0_REQ_BIST_CMD) != 0xffffffff) { + if (t4_read_reg(adapter, A_PCIE_REVISION) != 0) { + /* FPGA */ adapter->params.cim_la_size = 2 * CIMLA_SIZE; } else { + /* ASIC */ adapter->params.cim_la_size = CIMLA_SIZE; } @@ -4781,3 +5269,43 @@ int __devinit t4_port_init(struct port_info *p, int mbox, int pf, int vf) return 0; } + +int t4_config_scheduler(struct adapter *adapter, int mode, int level, + int pktsize, int sched_class, int port, int unit, + int rate, int weight, int minrate, int maxrate) +{ + struct fw_sched_cmd cmd, rpl; + + if (rate < 0 || unit < 0) + return -EINVAL; + + memset(&cmd, 0, sizeof(cmd)); + cmd.op_to_write = cpu_to_be32(V_FW_CMD_OP(FW_SCHED_CMD) | + F_FW_CMD_REQUEST | F_FW_CMD_WRITE); + cmd.retval_len16 = cpu_to_be32(V_FW_CMD_LEN16(sizeof(cmd)/16)); + + cmd.u.params.sc = 1; + cmd.u.params.level = level; + cmd.u.params.mode = mode; + cmd.u.params.ch = port; + cmd.u.params.cl = sched_class; + cmd.u.params.rate = rate; + cmd.u.params.unit = unit; + + switch (level) { + case FW_SCHED_PARAMS_LEVEL_CH_WRR: + case FW_SCHED_PARAMS_LEVEL_CL_WRR: + cmd.u.params.weight = cpu_to_be16(weight); + break; + case FW_SCHED_PARAMS_LEVEL_CH_RL: + case FW_SCHED_PARAMS_LEVEL_CL_RL: + cmd.u.params.max = cpu_to_be32(maxrate); + cmd.u.params.min = cpu_to_be32(minrate); + cmd.u.params.pktsize = cpu_to_be16(pktsize); + break; + default: + return -EINVAL; + } + + return t4_wr_mbox_meat(adapter, adapter->mbox, &cmd, sizeof(cmd), &rpl, 1); +} diff --git a/sys/dev/cxgbe/common/t4_msg.h b/sys/dev/cxgbe/common/t4_msg.h index d3def609ec3..f1d86b22400 100644 --- a/sys/dev/cxgbe/common/t4_msg.h +++ b/sys/dev/cxgbe/common/t4_msg.h @@ -37,7 +37,6 @@ enum { CPL_SET_TCB = 0x4, CPL_SET_TCB_FIELD = 0x5, CPL_GET_TCB = 0x6, - CPL_PCMD = 0x7, CPL_CLOSE_CON_REQ = 0x8, CPL_CLOSE_LISTSRV_REQ = 0x9, CPL_ABORT_REQ = 0xA, @@ -52,9 +51,12 @@ enum { CPL_L2T_READ_REQ = 0x13, CPL_SMT_WRITE_REQ = 0x14, CPL_SMT_READ_REQ = 0x15, + CPL_TAG_WRITE_REQ = 0x16, CPL_BARRIER = 0x18, CPL_TID_RELEASE = 0x1A, - CPL_RX_MPS_PKT = 0x1B, + CPL_TAG_READ_REQ = 0x1B, + CPL_TX_PKT_FSO = 0x1E, + CPL_TX_PKT_ISO = 0x1F, CPL_CLOSE_LISTSRV_RPL = 0x20, CPL_ERROR = 0x21, @@ -66,6 +68,7 @@ enum { CPL_RTE_DELETE_RPL = 0x27, CPL_RTE_WRITE_RPL = 0x28, CPL_RX_URG_PKT = 0x29, + CPL_TAG_WRITE_RPL = 0x2A, CPL_ABORT_REQ_RSS = 0x2B, CPL_RX_URG_NOTIFY = 0x2C, CPL_ABORT_RPL_RSS = 0x2D, @@ -84,7 +87,7 @@ enum { CPL_RX_DATA = 0x39, CPL_SET_TCB_RPL = 0x3A, CPL_RX_PKT = 0x3B, - CPL_PCMD_RPL = 0x3C, + CPL_TAG_READ_RPL = 0x3C, CPL_HIT_NOTIFY = 0x3D, CPL_PKT_NOTIFY = 0x3E, CPL_RX_DDP_COMPLETE = 0x3F, @@ -97,23 +100,34 @@ enum { CPL_RX2TX_PKT = 0x45, CPL_RX_FCOE_DDP = 0x46, CPL_FCOE_HDR = 0x47, + CPL_T5_TRACE_PKT = 0x48, + CPL_RX_ISCSI_DDP = 0x49, + CPL_RX_FCOE_DIF = 0x4A, + CPL_RX_DATA_DIF = 0x4B, CPL_RDMA_READ_REQ = 0x60, + CPL_RX_ISCSI_DIF = 0x60, CPL_SET_LE_REQ = 0x80, CPL_PASS_OPEN_REQ6 = 0x81, CPL_ACT_OPEN_REQ6 = 0x83, - CPL_TX_DMA_ACK = 0xA0, CPL_RDMA_TERMINATE = 0xA2, CPL_RDMA_WRITE = 0xA4, CPL_SGE_EGR_UPDATE = 0xA5, CPL_SET_LE_RPL = 0xA6, CPL_FW2_MSG = 0xA7, CPL_FW2_PLD = 0xA8, + CPL_T5_RDMA_READ_REQ = 0xA9, + CPL_RDMA_ATOMIC_REQ = 0xAA, + CPL_RDMA_ATOMIC_RPL = 0xAB, + CPL_RDMA_IMM_DATA = 0xAC, + CPL_RDMA_IMM_DATA_SE = 0xAD, CPL_TRACE_PKT = 0xB0, CPL_RX2TX_DATA = 0xB1, + CPL_ISCSI_DATA = 0xB2, + CPL_FCOE_DATA = 0xB3, CPL_FW4_MSG = 0xC0, CPL_FW4_PLD = 0xC1, @@ -278,13 +292,13 @@ struct tcp_options { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 :4; __u8 unknown:1; - __u8 :1; + __u8 ecn:1; __u8 sack:1; __u8 tstamp:1; #else __u8 tstamp:1; __u8 sack:1; - __u8 :1; + __u8 ecn:1; __u8 unknown:1; __u8 :4; #endif @@ -625,7 +639,7 @@ struct cpl_pass_accept_req { #define G_IP_HDR_LEN(x) (((x) >> S_IP_HDR_LEN) & M_IP_HDR_LEN) #define S_ETH_HDR_LEN 26 -#define M_ETH_HDR_LEN 0x1F +#define M_ETH_HDR_LEN 0x3F #define V_ETH_HDR_LEN(x) ((x) << S_ETH_HDR_LEN) #define G_ETH_HDR_LEN(x) (((x) >> S_ETH_HDR_LEN) & M_ETH_HDR_LEN) @@ -663,34 +677,18 @@ struct cpl_act_open_req { __be32 opt2; }; -/* cpl_act_open_req.params fields XXX */ -#define S_AOPEN_VLAN_PRI 9 -#define M_AOPEN_VLAN_PRI 0x3 -#define V_AOPEN_VLAN_PRI(x) ((x) << S_AOPEN_VLAN_PRI) -#define G_AOPEN_VLAN_PRI(x) (((x) >> S_AOPEN_VLAN_PRI) & M_AOPEN_VLAN_PRI) - -#define S_AOPEN_VLAN_PRI_VALID 11 -#define V_AOPEN_VLAN_PRI_VALID(x) ((x) << S_AOPEN_VLAN_PRI_VALID) -#define F_AOPEN_VLAN_PRI_VALID V_AOPEN_VLAN_PRI_VALID(1U) - -#define S_AOPEN_PKT_TYPE 12 -#define M_AOPEN_PKT_TYPE 0x3 -#define V_AOPEN_PKT_TYPE(x) ((x) << S_AOPEN_PKT_TYPE) -#define G_AOPEN_PKT_TYPE(x) (((x) >> S_AOPEN_PKT_TYPE) & M_AOPEN_PKT_TYPE) - -#define S_AOPEN_MAC_MATCH 14 -#define M_AOPEN_MAC_MATCH 0x1F -#define V_AOPEN_MAC_MATCH(x) ((x) << S_AOPEN_MAC_MATCH) -#define G_AOPEN_MAC_MATCH(x) (((x) >> S_AOPEN_MAC_MATCH) & M_AOPEN_MAC_MATCH) - -#define S_AOPEN_MAC_MATCH_VALID 19 -#define V_AOPEN_MAC_MATCH_VALID(x) ((x) << S_AOPEN_MAC_MATCH_VALID) -#define F_AOPEN_MAC_MATCH_VALID V_AOPEN_MAC_MATCH_VALID(1U) - -#define S_AOPEN_IFF_VLAN 20 -#define M_AOPEN_IFF_VLAN 0xFFF -#define V_AOPEN_IFF_VLAN(x) ((x) << S_AOPEN_IFF_VLAN) -#define G_AOPEN_IFF_VLAN(x) (((x) >> S_AOPEN_IFF_VLAN) & M_AOPEN_IFF_VLAN) +struct cpl_t5_act_open_req { + WR_HDR; + union opcode_tid ot; + __be16 local_port; + __be16 peer_port; + __be32 local_ip; + __be32 peer_ip; + __be64 opt0; + __be32 rsvd; + __be32 opt2; + __be64 params; +}; struct cpl_act_open_req6 { WR_HDR; @@ -706,6 +704,21 @@ struct cpl_act_open_req6 { __be32 opt2; }; +struct cpl_t5_act_open_req6 { + WR_HDR; + union opcode_tid ot; + __be16 local_port; + __be16 peer_port; + __be64 local_ip_hi; + __be64 local_ip_lo; + __be64 peer_ip_hi; + __be64 peer_ip_lo; + __be64 opt0; + __be32 rsvd; + __be32 opt2; + __be64 params; +}; + struct cpl_act_open_rpl { RSS_HDR union opcode_tid ot; @@ -1051,6 +1064,10 @@ struct cpl_tx_pkt { #define V_TXPKT_LOOPBACK(x) ((x) << S_TXPKT_LOOPBACK) #define F_TXPKT_LOOPBACK V_TXPKT_LOOPBACK(1U) +#define S_TXPKT_TSTAMP 23 +#define V_TXPKT_TSTAMP(x) ((x) << S_TXPKT_TSTAMP) +#define F_TXPKT_TSTAMP V_TXPKT_TSTAMP(1U) + #define S_TXPKT_OPCODE 24 #define M_TXPKT_OPCODE 0xFF #define V_TXPKT_OPCODE(x) ((x) << S_TXPKT_OPCODE) @@ -1113,7 +1130,7 @@ struct cpl_tx_pkt { #define V_TXPKT_L4CSUM_DIS(x) ((__u64)(x) << S_TXPKT_L4CSUM_DIS) #define F_TXPKT_L4CSUM_DIS V_TXPKT_L4CSUM_DIS(1ULL) -struct cpl_tx_pkt_lso { +struct cpl_tx_pkt_lso_core { __be32 lso_ctrl; __be16 ipid_ofst; __be16 mss; @@ -1122,7 +1139,29 @@ struct cpl_tx_pkt_lso { /* encapsulated CPL (TX_PKT, TX_PKT_XT or TX_DATA) follows here */ }; -/* cpl_tx_pkt_lso.lso_ctrl fields */ +struct cpl_tx_pkt_lso { + WR_HDR; + struct cpl_tx_pkt_lso_core c; + /* encapsulated CPL (TX_PKT, TX_PKT_XT or TX_DATA) follows here */ +}; + +struct cpl_tx_pkt_ufo_core { + __be16 ethlen; + __be16 iplen; + __be16 udplen; + __be16 mss; + __be32 len; + __be32 r1; + /* encapsulated CPL (TX_PKT, TX_PKT_XT or TX_DATA) follows here */ +}; + +struct cpl_tx_pkt_ufo { + WR_HDR; + struct cpl_tx_pkt_ufo_core c; + /* encapsulated CPL (TX_PKT, TX_PKT_XT or TX_DATA) follows here */ +}; + +/* cpl_tx_pkt_lso_core.lso_ctrl fields */ #define S_LSO_TCPHDR_LEN 0 #define M_LSO_TCPHDR_LEN 0xF #define V_LSO_TCPHDR_LEN(x) ((x) << S_LSO_TCPHDR_LEN) @@ -1159,7 +1198,7 @@ struct cpl_tx_pkt_lso { #define V_LSO_OPCODE(x) ((x) << S_LSO_OPCODE) #define G_LSO_OPCODE(x) (((x) >> S_LSO_OPCODE) & M_LSO_OPCODE) -/* cpl_tx_pkt_lso.mss fields */ +/* cpl_tx_pkt_lso_core.mss fields */ #define S_LSO_MSS 0 #define M_LSO_MSS 0x3FFF #define V_LSO_MSS(x) ((x) << S_LSO_MSS) @@ -1169,31 +1208,29 @@ struct cpl_tx_pkt_lso { #define V_LSO_IPID_SPLIT(x) ((x) << S_LSO_IPID_SPLIT) #define F_LSO_IPID_SPLIT V_LSO_IPID_SPLIT(1U) -struct cpl_tx_pkt_coalesce { - __be32 cntrl; - __be32 len; - __be64 addr; -}; - -struct tx_pkt_coalesce_wr { +struct cpl_tx_pkt_fso { WR_HDR; -#if !(defined C99_NOT_SUPPORTED) - struct cpl_tx_pkt_coalesce cpl[0]; -#endif + __be32 fso_ctrl; + __be16 seqcnt_ofst; + __be16 mtu; + __be32 param_offset; + __be32 len; + /* encapsulated CPL (TX_PKT or TX_PKT_XT) follows here */ }; -struct mngt_pktsched_wr { - __be32 wr_hi; - __be32 wr_lo; - __u8 mngt_opcode; - __u8 rsvd[7]; - __u8 sched; - __u8 idx; - __u8 min; - __u8 max; - __u8 binding; - __u8 rsvd1[3]; -}; +/* cpl_tx_pkt_fso.fso_ctrl fields different from cpl_tx_pkt_lso.lso_ctrl */ +#define S_FSO_XCHG_CLASS 21 +#define V_FSO_XCHG_CLASS(x) ((x) << S_FSO_XCHG_CLASS) +#define F_FSO_XCHG_CLASS V_FSO_XCHG_CLASS(1U) + +#define S_FSO_INITIATOR 20 +#define V_FSO_INITIATOR(x) ((x) << S_FSO_INITIATOR) +#define F_FSO_INITIATOR V_FSO_INITIATOR(1U) + +#define S_FSO_FCHDR_LEN 12 +#define M_FSO_FCHDR_LEN 0xF +#define V_FSO_FCHDR_LEN(x) ((x) << S_FSO_FCHDR_LEN) +#define G_FSO_FCHDR_LEN(x) (((x) >> S_FSO_FCHDR_LEN) & M_FSO_FCHDR_LEN) struct cpl_iscsi_hdr_no_rss { union opcode_tid ot; @@ -1205,6 +1242,40 @@ struct cpl_iscsi_hdr_no_rss { __u8 status; }; +struct cpl_tx_data_iso { + WR_HDR; + __be32 iso_ctrl; + __u8 rsvd; + __u8 ahs_len; + __be16 mss; + __be32 burst_size; + __be32 len; + /* encapsulated CPL_TX_DATA follows here */ +}; + +/* cpl_tx_data_iso.iso_ctrl fields different from cpl_tx_pkt_lso.lso_ctrl */ +#define S_ISO_CPLHDR_LEN 18 +#define M_ISO_CPLHDR_LEN 0xF +#define V_ISO_CPLHDR_LEN(x) ((x) << S_ISO_CPLHDR_LEN) +#define G_ISO_CPLHDR_LEN(x) (((x) >> S_ISO_CPLHDR_LEN) & M_ISO_CPLHDR_LEN) + +#define S_ISO_HDR_CRC 17 +#define V_ISO_HDR_CRC(x) ((x) << S_ISO_HDR_CRC) +#define F_ISO_HDR_CRC V_ISO_HDR_CRC(1U) + +#define S_ISO_DATA_CRC 16 +#define V_ISO_DATA_CRC(x) ((x) << S_ISO_DATA_CRC) +#define F_ISO_DATA_CRC V_ISO_DATA_CRC(1U) + +#define S_ISO_IMD_DATA_EN 15 +#define V_ISO_IMD_DATA_EN(x) ((x) << S_ISO_IMD_DATA_EN) +#define F_ISO_IMD_DATA_EN V_ISO_IMD_DATA_EN(1U) + +#define S_ISO_PDU_TYPE 13 +#define M_ISO_PDU_TYPE 0x3 +#define V_ISO_PDU_TYPE(x) ((x) << S_ISO_PDU_TYPE) +#define G_ISO_PDU_TYPE(x) (((x) >> S_ISO_PDU_TYPE) & M_ISO_PDU_TYPE) + struct cpl_iscsi_hdr { RSS_HDR union opcode_tid ot; @@ -1226,6 +1297,17 @@ struct cpl_iscsi_hdr { #define V_ISCSI_DDP(x) ((x) << S_ISCSI_DDP) #define F_ISCSI_DDP V_ISCSI_DDP(1U) +struct cpl_iscsi_data { + RSS_HDR + union opcode_tid ot; + __u8 rsvd0[2]; + __be16 len; + __be32 seq; + __be16 urg; + __u8 rsvd1; + __u8 status; +}; + struct cpl_rx_data { RSS_HDR union opcode_tid ot; @@ -1265,6 +1347,16 @@ struct cpl_fcoe_hdr { __be32 param; }; +struct cpl_fcoe_data { + RSS_HDR + union opcode_tid ot; + __u8 rsvd0[2]; + __be16 len; + __be32 seq; + __u8 rsvd1[3]; + __u8 status; +}; + struct cpl_rx_urg_notify { RSS_HDR union opcode_tid ot; @@ -1333,6 +1425,8 @@ struct cpl_rx_data_ddp { __be32 ddpvld; }; +#define cpl_rx_iscsi_ddp cpl_rx_data_ddp + struct cpl_rx_fcoe_ddp { RSS_HDR union opcode_tid ot; @@ -1344,7 +1438,49 @@ struct cpl_rx_fcoe_ddp { __be32 ddpvld; }; -/* cpl_rx_{data,fcoe}_ddp.ddpvld fields */ +struct cpl_rx_data_dif { + RSS_HDR + union opcode_tid ot; + __be16 ddp_len; + __be16 msg_len; + __be32 seq; + union { + __be32 nxt_seq; + __be32 ddp_report; + } u; + __be32 err_vec; + __be32 ddpvld; +}; + +struct cpl_rx_iscsi_dif { + RSS_HDR + union opcode_tid ot; + __be16 ddp_len; + __be16 msg_len; + __be32 seq; + union { + __be32 nxt_seq; + __be32 ddp_report; + } u; + __be32 ulp_crc; + __be32 ddpvld; + __u8 rsvd0[8]; + __be32 err_vec; + __u8 rsvd1[4]; +}; + +struct cpl_rx_fcoe_dif { + RSS_HDR + union opcode_tid ot; + __be16 ddp_len; + __be16 msg_len; + __be32 seq; + __be32 ddp_report; + __be32 err_vec; + __be32 ddpvld; +}; + +/* cpl_rx_{data,iscsi,fcoe}_{ddp,dif}.ddpvld fields */ #define S_DDP_VALID 15 #define M_DDP_VALID 0x1FFFF #define V_DDP_VALID(x) ((x) << S_DDP_VALID) @@ -1407,7 +1543,7 @@ struct cpl_rx_fcoe_ddp { #define V_DDP_ULP_MODE(x) ((x) << S_DDP_ULP_MODE) #define G_DDP_ULP_MODE(x) (((x) >> S_DDP_ULP_MODE) & M_DDP_ULP_MODE) -/* cpl_rx_{data,fcoe}_ddp.ddp_report fields */ +/* cpl_rx_{data,iscsi,fcoe}_{ddp,dif}.ddp_report fields */ #define S_DDP_OFFSET 0 #define M_DDP_OFFSET 0xFFFFFF #define V_DDP_OFFSET(x) ((x) << S_DDP_OFFSET) @@ -1472,16 +1608,31 @@ struct cpl_rx_pkt { #define V_RX_ETHHDR_LEN(x) ((x) << S_RX_ETHHDR_LEN) #define G_RX_ETHHDR_LEN(x) (((x) >> S_RX_ETHHDR_LEN) & M_RX_ETHHDR_LEN) +#define S_RX_T5_ETHHDR_LEN 0 +#define M_RX_T5_ETHHDR_LEN 0x3F +#define V_RX_T5_ETHHDR_LEN(x) ((x) << S_RX_T5_ETHHDR_LEN) +#define G_RX_T5_ETHHDR_LEN(x) (((x) >> S_RX_T5_ETHHDR_LEN) & M_RX_T5_ETHHDR_LEN) + #define S_RX_PKTYPE 5 #define M_RX_PKTYPE 0x7 #define V_RX_PKTYPE(x) ((x) << S_RX_PKTYPE) #define G_RX_PKTYPE(x) (((x) >> S_RX_PKTYPE) & M_RX_PKTYPE) +#define S_RX_T5_DATYPE 6 +#define M_RX_T5_DATYPE 0x3 +#define V_RX_T5_DATYPE(x) ((x) << S_RX_T5_DATYPE) +#define G_RX_T5_DATYPE(x) (((x) >> S_RX_T5_DATYPE) & M_RX_T5_DATYPE) + #define S_RX_MACIDX 8 #define M_RX_MACIDX 0x1FF #define V_RX_MACIDX(x) ((x) << S_RX_MACIDX) #define G_RX_MACIDX(x) (((x) >> S_RX_MACIDX) & M_RX_MACIDX) +#define S_RX_T5_PKTYPE 17 +#define M_RX_T5_PKTYPE 0x7 +#define V_RX_T5_PKTYPE(x) ((x) << S_RX_T5_PKTYPE) +#define G_RX_T5_PKTYPE(x) (((x) >> S_RX_T5_PKTYPE) & M_RX_T5_PKTYPE) + #define S_RX_DATYPE 18 #define M_RX_DATYPE 0x3 #define V_RX_DATYPE(x) ((x) << S_RX_DATYPE) @@ -1614,6 +1765,29 @@ struct cpl_trace_pkt { __be64 tstamp; }; +struct cpl_t5_trace_pkt { + RSS_HDR + __u8 opcode; + __u8 intf; +#if defined(__LITTLE_ENDIAN_BITFIELD) + __u8 runt:4; + __u8 filter_hit:4; + __u8 :6; + __u8 err:1; + __u8 trunc:1; +#else + __u8 filter_hit:4; + __u8 runt:4; + __u8 trunc:1; + __u8 err:1; + __u8 :6; +#endif + __be16 rsvd; + __be16 len; + __be64 tstamp; + __be64 rsvd1; +}; + struct cpl_rte_delete_req { WR_HDR; union opcode_tid ot; @@ -1764,6 +1938,31 @@ struct cpl_smt_write_req { __u8 src_mac0[6]; }; +struct cpl_smt_write_rpl { + RSS_HDR + union opcode_tid ot; + __u8 status; + __u8 rsvd[3]; +}; + +struct cpl_smt_read_req { + WR_HDR; + union opcode_tid ot; + __be32 params; +}; + +struct cpl_smt_read_rpl { + RSS_HDR + union opcode_tid ot; + __u8 status; + __u8 ovlan_idx; + __be16 rsvd; + __be16 pfvf1; + __u8 src_mac1[6]; + __be16 pfvf0; + __u8 src_mac0[6]; +}; + /* cpl_smt_{read,write}_req.params fields */ #define S_SMTW_OVLAN_IDX 16 #define M_SMTW_OVLAN_IDX 0xF @@ -1794,31 +1993,65 @@ struct cpl_smt_write_req { #define V_SMTW_VF_VLD(x) ((x) << S_SMTW_VF_VLD) #define F_SMTW_VF_VLD V_SMTW_VF_VLD(1U) -struct cpl_smt_write_rpl { +struct cpl_tag_write_req { + WR_HDR; + union opcode_tid ot; + __be32 params; + __be64 tag_val; +}; + +struct cpl_tag_write_rpl { RSS_HDR union opcode_tid ot; __u8 status; - __u8 rsvd[3]; + __u8 rsvd[2]; + __u8 idx; }; -struct cpl_smt_read_req { +struct cpl_tag_read_req { WR_HDR; union opcode_tid ot; __be32 params; }; -struct cpl_smt_read_rpl { +struct cpl_tag_read_rpl { RSS_HDR union opcode_tid ot; __u8 status; - __u8 ovlan_idx; - __be16 rsvd; - __be16 pfvf1; - __u8 src_mac1[6]; - __be16 pfvf0; - __u8 src_mac0[6]; +#if defined(__LITTLE_ENDIAN_BITFIELD) + __u8 :4; + __u8 tag_len:1; + __u8 :2; + __u8 ins_enable:1; +#else + __u8 ins_enable:1; + __u8 :2; + __u8 tag_len:1; + __u8 :4; +#endif + __u8 rsvd; + __u8 tag_idx; + __be64 tag_val; }; +/* cpl_tag{read,write}_req.params fields */ +#define S_TAGW_IDX 0 +#define M_TAGW_IDX 0x7F +#define V_TAGW_IDX(x) ((x) << S_TAGW_IDX) +#define G_TAGW_IDX(x) (((x) >> S_TAGW_IDX) & M_TAGW_IDX) + +#define S_TAGW_LEN 20 +#define V_TAGW_LEN(x) ((x) << S_TAGW_LEN) +#define F_TAGW_LEN V_TAGW_LEN(1U) + +#define S_TAGW_INS_ENABLE 23 +#define V_TAGW_INS_ENABLE(x) ((x) << S_TAGW_INS_ENABLE) +#define F_TAGW_INS_ENABLE V_TAGW_INS_ENABLE(1U) + +#define S_TAGW_NORPL 31 +#define V_TAGW_NORPL(x) ((x) << S_TAGW_NORPL) +#define F_TAGW_NORPL V_TAGW_NORPL(1U) + struct cpl_barrier { WR_HDR; __u8 opcode; @@ -1882,6 +2115,16 @@ struct cpl_pkt_notify { #define V_NTFY_ETHHDR_LEN(x) ((x) << S_NTFY_ETHHDR_LEN) #define G_NTFY_ETHHDR_LEN(x) (((x) >> S_NTFY_ETHHDR_LEN) & M_NTFY_ETHHDR_LEN) +#define S_NTFY_T5_IPHDR_LEN 18 +#define M_NTFY_T5_IPHDR_LEN 0xFF +#define V_NTFY_T5_IPHDR_LEN(x) ((x) << S_NTFY_T5_IPHDR_LEN) +#define G_NTFY_T5_IPHDR_LEN(x) (((x) >> S_NTFY_T5_IPHDR_LEN) & M_NTFY_T5_IPHDR_LEN) + +#define S_NTFY_T5_ETHHDR_LEN 26 +#define M_NTFY_T5_ETHHDR_LEN 0x3F +#define V_NTFY_T5_ETHHDR_LEN(x) ((x) << S_NTFY_T5_ETHHDR_LEN) +#define G_NTFY_T5_ETHHDR_LEN(x) (((x) >> S_NTFY_T5_ETHHDR_LEN) & M_NTFY_T5_ETHHDR_LEN) + struct cpl_rdma_terminate { RSS_HDR union opcode_tid ot; @@ -2011,12 +2254,18 @@ struct cpl_fw4_ack { union opcode_tid ot; u8 credits; u8 rsvd0[2]; - u8 seq_vld; + u8 flags; __be32 snd_nxt; __be32 snd_una; __be64 rsvd1; }; +enum { + CPL_FW4_ACK_FLAGS_SEQVAL = 0x1, /* seqn valid */ + CPL_FW4_ACK_FLAGS_CH = 0x2, /* channel change complete */ + CPL_FW4_ACK_FLAGS_FLOWC = 0x4, /* fw_flowc_wr complete */ +}; + struct cpl_fw6_msg { RSS_HDR u8 opcode; @@ -2029,6 +2278,17 @@ struct cpl_fw6_msg { /* cpl_fw6_msg.type values */ enum { FW6_TYPE_CMD_RPL = 0, + FW6_TYPE_WR_RPL = 1, + FW6_TYPE_CQE = 2, + FW6_TYPE_OFLD_CONNECTION_WR_RPL = 3, +}; + +struct cpl_fw6_msg_ofld_connection_wr_rpl { + __u64 cookie; + __be32 tid; /* or atid in case of active failure */ + __u8 t_state; + __u8 retval; + __u8 rsvd[2]; }; /* ULP_TX opcodes */ @@ -2135,4 +2395,8 @@ struct ulp_txpkt { #define M_ULP_TXPKT_FID 0x7ff #define V_ULP_TXPKT_FID(x) ((x) << S_ULP_TXPKT_FID) +#define S_ULP_TXPKT_RO 3 +#define V_ULP_TXPKT_RO(x) ((x) << S_ULP_TXPKT_RO) +#define F_ULP_TXPKT_RO V_ULP_TXPKT_RO(1U) + #endif /* T4_MSG_H */ diff --git a/sys/dev/cxgbe/firmware/t4fw_cfg.txt b/sys/dev/cxgbe/firmware/t4fw_cfg.txt index 65d6f0bf011..fe13f32c69b 100644 --- a/sys/dev/cxgbe/firmware/t4fw_cfg.txt +++ b/sys/dev/cxgbe/firmware/t4fw_cfg.txt @@ -1,8 +1,6 @@ # Firmware configuration file. # # Global limits (some are hardware limits, others are due to the firmware). -# Also note that the firmware reserves some of these resources for its own use -# so it's not always possible for the drivers to grab everything listed here. # nvi = 128 virtual interfaces # niqflint = 1023 ingress queues with freelists and/or interrupts # nethctrl = 64K Ethernet or ctrl egress queues @@ -58,11 +56,11 @@ [function "4"] wx_caps = all r_caps = all - nvi = 48 + nvi = 54 niqflint = 256 nethctrl = 128 neq = 256 - nexactf = 300 + nexactf = 328 cmask = all pmask = all @@ -76,7 +74,7 @@ # TCAM iff there is room left (that is, the rest don't add up to 2048). nroute = 32 nclip = 0 # needed only for IPv6 offload - nfilter = 1504 + nfilter = 1488 nserver = 512 nhash = 16384 @@ -90,6 +88,18 @@ [function "6"] nvi = 1 +# The following function, 1023, is not an actual PCIE function but is used to +# configure and reserve firmware internal resources that come from the global +# resource pool. +[function "1023"] + wx_caps = all + r_caps = all + nvi = 4 + cmask = all + pmask = all + nexactf = 8 + nfilter = 16 + # MPS has 192K buffer space for ingress packets from the wire as well as # loopback path of the L2 switch. [port "0"] @@ -126,7 +136,7 @@ [fini] version = 0x1 - checksum = 0xb31cdfac + checksum = 0xdb5813f9 # # $FreeBSD$ # diff --git a/sys/dev/cxgbe/firmware/t4fw_cfg_uwire.txt b/sys/dev/cxgbe/firmware/t4fw_cfg_uwire.txt index 134d60c4d27..ca8de4953e9 100644 --- a/sys/dev/cxgbe/firmware/t4fw_cfg_uwire.txt +++ b/sys/dev/cxgbe/firmware/t4fw_cfg_uwire.txt @@ -1,7 +1,10 @@ # Chelsio T4 Factory Default configuration file. # -# Copyright (C) 2010 Chelsio Communications. All rights reserved. +# Copyright (C) 2010-2012 Chelsio Communications. All rights reserved. # +# DO NOT MODIFY THIS FILE UNDER ANY CIRCUMSTANCES. MODIFICATION OF +# THIS FILE WILL RESULT IN A NON-FUNCTIONAL T4 ADAPTER AND MAY RESULT +# IN PHYSICAL DAMAGE TO T4 ADAPTERS. # This file provides the default, power-on configuration for 4-port T4-based # adapters shipped from the factory. These defaults are designed to address @@ -112,7 +115,7 @@ # must sum to <= 36): { IP Fragment (1), MPS Match Type (3), # IP Protocol (8), [Inner] VLAN (17), Port (3), FCoE (1) } # - filterMode = fragmentation, mpshittype, protocol, vnic_id, port, fcoe + filterMode = fragmentation, mpshittype, protocol, vlan, port, fcoe # Percentage of dynamic memory (in either the EDRAM or external MEM) # to use for TP RX payload @@ -339,18 +342,19 @@ r_caps = all # read permissions for all commands nvi = 28 # NVI_UNIFIED niqflint = 170 # NFLIQ_UNIFIED + NLFIQ_WD - nethctrl = 96 # NETHCTRL_UNIFIED + NETHCTRL_WD - neq = 252 # NEQ_UNIFIED + NEQ_WD + nethctrl = 100 # NETHCTRL_UNIFIED + NETHCTRL_WD + neq = 256 # NEQ_UNIFIED + NEQ_WD nexactf = 40 # NMPSTCAM_UNIFIED cmask = all # access to all channels pmask = all # access to all four ports ... + nethofld = 1024 # number of user mode ethernet flow contexts nroute = 32 # number of routing region entries nclip = 32 # number of clip region entries - nfilter = 768 # number of filter region entries - nserver = 256 # number of server region entries - nhash = 0 # number of hash region entries + nfilter = 496 # number of filter region entries + nserver = 496 # number of server region entries + nhash = 12288 # number of hash region entries protocol = nic_vm, ofld, rddp, rdmac, iscsi_initiator_pdu, iscsi_target_pdu - tp_l2t = 100 + tp_l2t = 3072 tp_ddp = 2 tp_ddp_iscsi = 2 tp_stag = 2 @@ -371,6 +375,15 @@ nexactf = 4 # NPORTS cmask = all # access to all channels pmask = all # access to all four ports ... + nserver = 16 + nhash = 2048 + tp_l2t = 1024 + protocol = iscsi_initiator_fofld + tp_ddp_iscsi = 2 + iscsi_ntask = 2048 + iscsi_nsess = 2048 + iscsi_nconn_per_session = 1 + iscsi_ninitiator_instance = 64 [function "6"] wx_caps = all # write/execute permissions for all commands @@ -384,13 +397,26 @@ # and we never load PF0..3 and PF4 concurrently cmask = all # access to all channels pmask = all # access to all four ports ... - nhash = 0 + nhash = 2048 protocol = fcoe_initiator tp_ddp = 2 fcoe_nfcf = 16 fcoe_nvnp = 32 fcoe_nssn = 1024 +# The following function, 1023, is not an actual PCIE function but is used to +# configure and reserve firmware internal resources that come from the global +# resource pool. +# +[function "1023"] + wx_caps = all # write/execute permissions for all commands + r_caps = all # read permissions for all commands + nvi = 4 # NVI_UNIFIED + cmask = all # access to all channels + pmask = all # access to all four ports ... + nexactf = 8 # NPORTS + DCBX + + nfilter = 16 # number of filter region entries + # For Virtual functions, we only allow NIC functionality and we only allow # access to one port (1 << PF). Note that because of limitations in the # Scatter Gather Engine (SGE) hardware which checks writes to VF KDOORBELL @@ -488,8 +514,8 @@ dwm = 30 [fini] - version = 0x14250007 - checksum = 0xfcbadefb + version = 0x1425000b + checksum = 0x7690f7a5 # Total resources used by above allocations: # Virtual Interfaces: 104 diff --git a/sys/dev/cxgbe/firmware/t4fw_interface.h b/sys/dev/cxgbe/firmware/t4fw_interface.h index 6d259a5d260..65c85a5bd9d 100644 --- a/sys/dev/cxgbe/firmware/t4fw_interface.h +++ b/sys/dev/cxgbe/firmware/t4fw_interface.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 Chelsio Communications, Inc. + * Copyright (c) 2012 Chelsio Communications, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -83,7 +83,9 @@ enum fw_wr_opcodes { FW_TP_WR = 0x05, FW_ETH_TX_PKT_WR = 0x08, FW_ETH_TX_PKTS_WR = 0x09, + FW_ETH_TX_UO_WR = 0x1c, FW_EQ_FLUSH_WR = 0x1b, + FW_OFLD_CONNECTION_WR = 0x2f, FW_FLOWC_WR = 0x0a, FW_OFLD_TX_DATA_WR = 0x0b, FW_CMD_WR = 0x10, @@ -96,9 +98,23 @@ enum fw_wr_opcodes { FW_RI_BIND_MW_WR = 0x18, FW_RI_FR_NSMR_WR = 0x19, FW_RI_INV_LSTAG_WR = 0x1a, + FW_RI_SEND_IMMEDIATE_WR = 0x15, + FW_RI_ATOMIC_WR = 0x16, FW_RI_WR = 0x0d, - FW_ISCSI_NODE_WR = 0x4a, - FW_LASTC2E_WR = 0x50 + FW_CHNET_IFCONF_WR = 0x6b, + FW_RDEV_WR = 0x38, + FW_FOISCSI_NODE_WR = 0x60, + FW_FOISCSI_CTRL_WR = 0x6a, + FW_FOISCSI_CHAP_WR = 0x6c, + FW_FCOE_ELS_CT_WR = 0x30, + FW_SCSI_WRITE_WR = 0x31, + FW_SCSI_READ_WR = 0x32, + FW_SCSI_CMD_WR = 0x33, + FW_SCSI_ABRT_CLS_WR = 0x34, + FW_SCSI_TGT_ACC_WR = 0x35, + FW_SCSI_TGT_XMIT_WR = 0x36, + FW_SCSI_TGT_RSP_WR = 0x37, + FW_LASTC2E_WR = 0x70 }; /* @@ -536,6 +552,18 @@ struct fw_eth_tx_pkts_wr { __u8 type; }; +struct fw_eth_tx_uo_wr { + __be32 op_immdlen; + __be32 equiq_to_len16; + __be64 r3; + __be16 ethlen; + __be16 iplen; + __be16 udplen; + __be16 mss; + __be32 length; + __be32 r4; +}; + struct fw_eq_flush_wr { __u8 opcode; __u8 r1[3]; @@ -543,6 +571,142 @@ struct fw_eq_flush_wr { __be64 r3; }; +struct fw_ofld_connection_wr { + __be32 op_compl; + __be32 len16_pkd; + __u64 cookie; + __be64 r2; + __be64 r3; + struct fw_ofld_connection_le { + __be32 version_cpl; + __be32 filter; + __be32 r1; + __be16 lport; + __be16 pport; + union fw_ofld_connection_leip { + struct fw_ofld_connection_le_ipv4 { + __be32 pip; + __be32 lip; + __be64 r0; + __be64 r1; + __be64 r2; + } ipv4; + struct fw_ofld_connection_le_ipv6 { + __be64 pip_hi; + __be64 pip_lo; + __be64 lip_hi; + __be64 lip_lo; + } ipv6; + } u; + } le; + struct fw_ofld_connection_tcb { + __be32 t_state_to_astid; + __be16 cplrxdataack_cplpassacceptrpl; + __be16 rcv_adv; + __be32 rcv_nxt; + __be32 tx_max; + __be64 opt0; + __be32 opt2; + __be32 r1; + __be64 r2; + __be64 r3; + } tcb; +}; + +#define S_FW_OFLD_CONNECTION_WR_VERSION 31 +#define M_FW_OFLD_CONNECTION_WR_VERSION 0x1 +#define V_FW_OFLD_CONNECTION_WR_VERSION(x) \ + ((x) << S_FW_OFLD_CONNECTION_WR_VERSION) +#define G_FW_OFLD_CONNECTION_WR_VERSION(x) \ + (((x) >> S_FW_OFLD_CONNECTION_WR_VERSION) & \ + M_FW_OFLD_CONNECTION_WR_VERSION) +#define F_FW_OFLD_CONNECTION_WR_VERSION V_FW_OFLD_CONNECTION_WR_VERSION(1U) + +#define S_FW_OFLD_CONNECTION_WR_CPL 30 +#define M_FW_OFLD_CONNECTION_WR_CPL 0x1 +#define V_FW_OFLD_CONNECTION_WR_CPL(x) ((x) << S_FW_OFLD_CONNECTION_WR_CPL) +#define G_FW_OFLD_CONNECTION_WR_CPL(x) \ + (((x) >> S_FW_OFLD_CONNECTION_WR_CPL) & M_FW_OFLD_CONNECTION_WR_CPL) +#define F_FW_OFLD_CONNECTION_WR_CPL V_FW_OFLD_CONNECTION_WR_CPL(1U) + +#define S_FW_OFLD_CONNECTION_WR_T_STATE 28 +#define M_FW_OFLD_CONNECTION_WR_T_STATE 0xf +#define V_FW_OFLD_CONNECTION_WR_T_STATE(x) \ + ((x) << S_FW_OFLD_CONNECTION_WR_T_STATE) +#define G_FW_OFLD_CONNECTION_WR_T_STATE(x) \ + (((x) >> S_FW_OFLD_CONNECTION_WR_T_STATE) & \ + M_FW_OFLD_CONNECTION_WR_T_STATE) + +#define S_FW_OFLD_CONNECTION_WR_RCV_SCALE 24 +#define M_FW_OFLD_CONNECTION_WR_RCV_SCALE 0xf +#define V_FW_OFLD_CONNECTION_WR_RCV_SCALE(x) \ + ((x) << S_FW_OFLD_CONNECTION_WR_RCV_SCALE) +#define G_FW_OFLD_CONNECTION_WR_RCV_SCALE(x) \ + (((x) >> S_FW_OFLD_CONNECTION_WR_RCV_SCALE) & \ + M_FW_OFLD_CONNECTION_WR_RCV_SCALE) + +#define S_FW_OFLD_CONNECTION_WR_ASTID 0 +#define M_FW_OFLD_CONNECTION_WR_ASTID 0xffffff +#define V_FW_OFLD_CONNECTION_WR_ASTID(x) \ + ((x) << S_FW_OFLD_CONNECTION_WR_ASTID) +#define G_FW_OFLD_CONNECTION_WR_ASTID(x) \ + (((x) >> S_FW_OFLD_CONNECTION_WR_ASTID) & M_FW_OFLD_CONNECTION_WR_ASTID) + +#define S_FW_OFLD_CONNECTION_WR_CPLRXDATAACK 15 +#define M_FW_OFLD_CONNECTION_WR_CPLRXDATAACK 0x1 +#define V_FW_OFLD_CONNECTION_WR_CPLRXDATAACK(x) \ + ((x) << S_FW_OFLD_CONNECTION_WR_CPLRXDATAACK) +#define G_FW_OFLD_CONNECTION_WR_CPLRXDATAACK(x) \ + (((x) >> S_FW_OFLD_CONNECTION_WR_CPLRXDATAACK) & \ + M_FW_OFLD_CONNECTION_WR_CPLRXDATAACK) +#define F_FW_OFLD_CONNECTION_WR_CPLRXDATAACK \ + V_FW_OFLD_CONNECTION_WR_CPLRXDATAACK(1U) + +#define S_FW_OFLD_CONNECTION_WR_CPLPASSACCEPTRPL 14 +#define M_FW_OFLD_CONNECTION_WR_CPLPASSACCEPTRPL 0x1 +#define V_FW_OFLD_CONNECTION_WR_CPLPASSACCEPTRPL(x) \ + ((x) << S_FW_OFLD_CONNECTION_WR_CPLPASSACCEPTRPL) +#define G_FW_OFLD_CONNECTION_WR_CPLPASSACCEPTRPL(x) \ + (((x) >> S_FW_OFLD_CONNECTION_WR_CPLPASSACCEPTRPL) & \ + M_FW_OFLD_CONNECTION_WR_CPLPASSACCEPTRPL) +#define F_FW_OFLD_CONNECTION_WR_CPLPASSACCEPTRPL \ + V_FW_OFLD_CONNECTION_WR_CPLPASSACCEPTRPL(1U) + +enum fw_flowc_mnem_tcpstate { + FW_FLOWC_MNEM_TCPSTATE_CLOSED = 0, /* illegal */ + FW_FLOWC_MNEM_TCPSTATE_LISTEN = 1, /* illegal */ + FW_FLOWC_MNEM_TCPSTATE_SYNSENT = 2, /* illegal */ + FW_FLOWC_MNEM_TCPSTATE_SYNRECEIVED = 3, /* illegal */ + FW_FLOWC_MNEM_TCPSTATE_ESTABLISHED = 4, /* default */ + FW_FLOWC_MNEM_TCPSTATE_CLOSEWAIT = 5, /* got peer close already */ + FW_FLOWC_MNEM_TCPSTATE_FINWAIT1 = 6, /* haven't gotten ACK for FIN and + * will resend FIN - equiv ESTAB + */ + FW_FLOWC_MNEM_TCPSTATE_CLOSING = 7, /* haven't gotten ACK for FIN and + * will resend FIN but have + * received FIN + */ + FW_FLOWC_MNEM_TCPSTATE_LASTACK = 8, /* haven't gotten ACK for FIN and + * will resend FIN but have + * received FIN + */ + FW_FLOWC_MNEM_TCPSTATE_FINWAIT2 = 9, /* sent FIN and got FIN + ACK, + * waiting for FIN + */ + FW_FLOWC_MNEM_TCPSTATE_TIMEWAIT = 10, /* not expected */ +}; + +enum fw_flowc_mnem_uostate { + FW_FLOWC_MNEM_UOSTATE_CLOSED = 0, /* illegal */ + FW_FLOWC_MNEM_UOSTATE_ESTABLISHED = 1, /* default */ + FW_FLOWC_MNEM_UOSTATE_CLOSING = 2, /* graceful close, after sending + * outstanding payload + */ + FW_FLOWC_MNEM_UOSTATE_ABORTING = 3, /* immediate close, after + * discarding outstanding payload + */ +}; + enum fw_flowc_mnem { FW_FLOWC_MNEM_PFNVFN, /* PFN [15:8] VFN [7:0] */ FW_FLOWC_MNEM_CH, @@ -553,6 +717,9 @@ enum fw_flowc_mnem { FW_FLOWC_MNEM_SNDBUF, FW_FLOWC_MNEM_MSS, FW_FLOWC_MNEM_TXDATAPLEN_MAX, + FW_FLOWC_MNEM_TCPSTATE, + FW_FLOWC_MNEM_UOSTATE, + FW_FLOWC_MNEM_SCHEDCLASS, }; struct fw_flowc_mnemval { @@ -672,7 +839,7 @@ struct fw_eth_tx_pkt_vm_wr { **************************************/ enum fw_ri_wr_opcode { - FW_RI_RDMA_WRITE = 0x0, /* IETF RDMAP v1.0 ... */ + FW_RI_RDMA_WRITE = 0x0, /* IETF RDMAP v1.0 ... */ FW_RI_READ_REQ = 0x1, FW_RI_READ_RESP = 0x2, FW_RI_SEND = 0x3, @@ -680,14 +847,23 @@ enum fw_ri_wr_opcode { FW_RI_SEND_WITH_SE = 0x5, FW_RI_SEND_WITH_SE_INV = 0x6, FW_RI_TERMINATE = 0x7, - FW_RI_RDMA_INIT = 0x8, /* CHELSIO RI specific ... */ + FW_RI_RDMA_INIT = 0x8, /* CHELSIO RI specific ... */ FW_RI_BIND_MW = 0x9, FW_RI_FAST_REGISTER = 0xa, FW_RI_LOCAL_INV = 0xb, FW_RI_QP_MODIFY = 0xc, FW_RI_BYPASS = 0xd, FW_RI_RECEIVE = 0xe, +#if 0 + FW_RI_SEND_IMMEDIATE = 0x8, + FW_RI_SEND_IMMEDIATE_WITH_SE = 0x9, + FW_RI_ATOMIC_REQUEST = 0xa, + FW_RI_ATOMIC_RESPONSE = 0xb, + FW_RI_BIND_MW = 0xc, /* CHELSIO RI specific ... */ + FW_RI_FAST_REGISTER = 0xd, + FW_RI_LOCAL_INV = 0xe, +#endif FW_RI_SGE_EC_CR_RETURN = 0xf }; @@ -1403,6 +1579,72 @@ struct fw_ri_inv_lstag_wr { __be32 stag_inv; }; +struct fw_ri_send_immediate_wr { + __u8 opcode; + __u8 flags; + __u16 wrid; + __u8 r1[3]; + __u8 len16; + __be32 sendimmop_pkd; + __be32 r3; + __be32 plen; + __be32 r4; + __be64 r5; +#ifndef C99_NOT_SUPPORTED + struct fw_ri_immd immd_src[0]; +#endif +}; + +#define S_FW_RI_SEND_IMMEDIATE_WR_SENDIMMOP 0 +#define M_FW_RI_SEND_IMMEDIATE_WR_SENDIMMOP 0xf +#define V_FW_RI_SEND_IMMEDIATE_WR_SENDIMMOP(x) \ + ((x) << S_FW_RI_SEND_IMMEDIATE_WR_SENDIMMOP) +#define G_FW_RI_SEND_IMMEDIATE_WR_SENDIMMOP(x) \ + (((x) >> S_FW_RI_SEND_IMMEDIATE_WR_SENDIMMOP) & \ + M_FW_RI_SEND_IMMEDIATE_WR_SENDIMMOP) + +enum fw_ri_atomic_op { + FW_RI_ATOMIC_OP_FETCHADD, + FW_RI_ATOMIC_OP_SWAP, + FW_RI_ATOMIC_OP_CMDSWAP, +}; + +struct fw_ri_atomic_wr { + __u8 opcode; + __u8 flags; + __u16 wrid; + __u8 r1[3]; + __u8 len16; + __be32 atomicop_pkd; + __be64 r3; + __be32 aopcode_pkd; + __be32 reqid; + __be32 stag; + __be32 to_hi; + __be32 to_lo; + __be32 addswap_data_hi; + __be32 addswap_data_lo; + __be32 addswap_mask_hi; + __be32 addswap_mask_lo; + __be32 compare_data_hi; + __be32 compare_data_lo; + __be32 compare_mask_hi; + __be32 compare_mask_lo; + __be32 r5; +}; + +#define S_FW_RI_ATOMIC_WR_ATOMICOP 0 +#define M_FW_RI_ATOMIC_WR_ATOMICOP 0xf +#define V_FW_RI_ATOMIC_WR_ATOMICOP(x) ((x) << S_FW_RI_ATOMIC_WR_ATOMICOP) +#define G_FW_RI_ATOMIC_WR_ATOMICOP(x) \ + (((x) >> S_FW_RI_ATOMIC_WR_ATOMICOP) & M_FW_RI_ATOMIC_WR_ATOMICOP) + +#define S_FW_RI_ATOMIC_WR_AOPCODE 0 +#define M_FW_RI_ATOMIC_WR_AOPCODE 0xf +#define V_FW_RI_ATOMIC_WR_AOPCODE(x) ((x) << S_FW_RI_ATOMIC_WR_AOPCODE) +#define G_FW_RI_ATOMIC_WR_AOPCODE(x) \ + (((x) >> S_FW_RI_ATOMIC_WR_AOPCODE) & M_FW_RI_ATOMIC_WR_AOPCODE) + enum fw_ri_type { FW_RI_TYPE_INIT, FW_RI_TYPE_FINI, @@ -1485,273 +1727,1057 @@ struct fw_ri_wr { (((x) >> S_FW_RI_WR_P2PTYPE) & M_FW_RI_WR_P2PTYPE) /****************************************************************************** - * S C S I W O R K R E Q U E S T s - **********************************************/ + * F O i S C S I W O R K R E Q U E S T s + *********************************************/ +#define FW_FOISCSI_NAME_MAX_LEN 224 +#define FW_FOISCSI_ALIAS_MAX_LEN 224 +#define FW_FOISCSI_MAX_CHAP_NAME_LEN 64 +#define FW_FOISCSI_INIT_NODE_MAX 8 -/****************************************************************************** - * F O i S C S I W O R K R E Q U E S T s - **********************************************/ +enum fw_chnet_ifconf_wr_subop { + FW_CHNET_IFCONF_WR_SUBOP_NONE = 0, + + FW_CHNET_IFCONF_WR_SUBOP_IPV4_SET, + FW_CHNET_IFCONF_WR_SUBOP_IPV4_GET, + + FW_CHNET_IFCONF_WR_SUBOP_VLAN_IPV4_SET, + FW_CHNET_IFCONF_WR_SUBOP_VLAN_IPV4_GET, -#define ISCSI_NAME_MAX_LEN 224 -#define ISCSI_ALIAS_MAX_LEN 224 + FW_CHNET_IFCONF_WR_SUBOP_IPV6_SET, + FW_CHNET_IFCONF_WR_SUBOP_IPV6_GET, -enum session_type { - ISCSI_SESSION_DISCOVERY = 0, - ISCSI_SESSION_NORMAL, + FW_CHNET_IFCONF_WR_SUBOP_VLAN_SET, + FW_CHNET_IFCONF_WR_SUBOP_VLAN_GET, + + FW_CHNET_IFCONF_WR_SUBOP_MTU_SET, + FW_CHNET_IFCONF_WR_SUBOP_MTU_GET, + + FW_CHNET_IFCONF_WR_SUBOP_DHCP_SET, + FW_CHNET_IFCONF_WR_SUBOP_DHCP_GET, + + FW_CHNET_IFCONF_WR_SUBOP_MAX, }; -enum digest_val { - DIGEST_NONE = 0, - DIGEST_CRC32, - DIGEST_BOTH, -}; - -enum fw_iscsi_subops { - NODE_ONLINE = 1, - SESS_ONLINE, - CONN_ONLINE, - NODE_OFFLINE, - SESS_OFFLINE, - CONN_OFFLINE, - NODE_STATS, - SESS_STATS, - CONN_STATS, - UPDATE_IOHANDLE, -}; - -struct fw_iscsi_node_attr { - __u8 name_len; - __u8 node_name[ISCSI_NAME_MAX_LEN]; - __u8 alias_len; - __u8 node_alias[ISCSI_ALIAS_MAX_LEN]; -}; - -struct fw_iscsi_sess_attr { - __u8 sess_type; - __u8 seq_inorder; - __u8 pdu_inorder; - __u8 immd_data_en; - __u8 init_r2t_en; - __u8 erl; - __be16 max_conn; - __be16 max_r2t; - __be16 time2wait; - __be16 time2retain; - __be32 max_burst; - __be32 first_burst; -}; - -struct fw_iscsi_conn_attr { - __u8 hdr_digest; - __u8 data_digest; - __be32 max_rcv_dsl; - __be16 dst_port; - __be32 dst_addr; - __be16 src_port; - __be32 src_addr; - __be32 ping_tmo; -}; - -struct fw_iscsi_node_stats { - __be16 sess_count; - __be16 chap_fail_count; - __be16 login_count; - __be16 r1; -}; - -struct fw_iscsi_sess_stats { - __be32 rxbytes; - __be32 txbytes; - __be32 scmd_count; - __be32 read_cmds; - __be32 write_cmds; - __be32 read_bytes; - __be32 write_bytes; - __be32 scsi_err_count; - __be32 scsi_rst_count; - __be32 iscsi_tmf_count; - __be32 conn_count; -}; - -struct fw_iscsi_conn_stats { - __be32 txbytes; - __be32 rxbytes; - __be32 dataout; - __be32 datain; -}; - -struct fw_iscsi_node_wr { - __u8 opcode; - __u8 subop; - __be16 immd_len; +struct fw_chnet_ifconf_wr { + __be32 op_compl; __be32 flowid_len16; __be64 cookie; - __u8 node_attr_to_compl; + __be32 if_flowid; + __u8 idx; + __u8 subop; + __u8 retval; + __u8 r2; + __be64 r3; + struct fw_chnet_ifconf_params { + __be32 r0; + __be16 vlanid; + __be16 mtu; + union fw_chnet_ifconf_addr_type { + struct fw_chnet_ifconf_ipv4 { + __be32 addr; + __be32 mask; + __be32 router; + __be32 r0; + __be64 r1; + } ipv4; + struct fw_chnet_ifconf_ipv6 { + __be64 linklocal_lo; + __be64 linklocal_hi; + __be64 router_hi; + __be64 router_lo; + __be64 aconf_hi; + __be64 aconf_lo; + __be64 linklocal_aconf_hi; + __be64 linklocal_aconf_lo; + __be64 router_aconf_hi; + __be64 router_aconf_lo; + __be64 r0; + } ipv6; + } in_attr; + } param; +}; + +enum fw_foiscsi_session_type { + FW_FOISCSI_SESSION_TYPE_DISCOVERY = 0, + FW_FOISCSI_SESSION_TYPE_NORMAL, +}; + +enum fw_foiscsi_auth_policy { + FW_FOISCSI_AUTH_POLICY_ONEWAY = 0, + FW_FOISCSI_AUTH_POLICY_MUTUAL, +}; + +enum fw_foiscsi_auth_method { + FW_FOISCSI_AUTH_METHOD_NONE = 0, + FW_FOISCSI_AUTH_METHOD_CHAP, + FW_FOISCSI_AUTH_METHOD_CHAP_FST, + FW_FOISCSI_AUTH_METHOD_CHAP_SEC, +}; + +enum fw_foiscsi_digest_type { + FW_FOISCSI_DIGEST_TYPE_NONE = 0, + FW_FOISCSI_DIGEST_TYPE_CRC32, + FW_FOISCSI_DIGEST_TYPE_CRC32_FST, + FW_FOISCSI_DIGEST_TYPE_CRC32_SEC, +}; + +enum fw_foiscsi_wr_subop { + FW_FOISCSI_WR_SUBOP_ADD = 1, + FW_FOISCSI_WR_SUBOP_DEL = 2, + FW_FOISCSI_WR_SUBOP_MOD = 4, +}; + +enum fw_foiscsi_ctrl_state { + FW_FOISCSI_CTRL_STATE_FREE = 0, + FW_FOISCSI_CTRL_STATE_ONLINE = 1, + FW_FOISCSI_CTRL_STATE_FAILED, + FW_FOISCSI_CTRL_STATE_IN_RECOVERY, + FW_FOISCSI_CTRL_STATE_REDIRECT, +}; + +struct fw_rdev_wr { + __be32 op_to_immdlen; + __be32 alloc_to_len16; + __be64 cookie; + __u8 protocol; + __u8 event_cause; + __u8 cur_state; + __u8 prev_state; + __be32 flags_to_assoc_flowid; + union rdev_entry { + struct fcoe_rdev_entry { + __be32 flowid; + __u8 protocol; + __u8 event_cause; + __u8 flags; + __u8 rjt_reason; + __u8 cur_login_st; + __u8 prev_login_st; + __be16 rcv_fr_sz; + __u8 rd_xfer_rdy_to_rport_type; + __u8 vft_to_qos; + __u8 org_proc_assoc_to_acc_rsp_code; + __u8 enh_disc_to_tgt; + __u8 wwnn[8]; + __u8 wwpn[8]; + __be16 iqid; + __u8 fc_oui[3]; + __u8 r_id[3]; + } fcoe_rdev; + struct iscsi_rdev_entry { + __be32 flowid; + __u8 protocol; + __u8 event_cause; + __u8 flags; + __u8 r3; + __be16 iscsi_opts; + __be16 tcp_opts; + __be16 ip_opts; + __be16 max_rcv_len; + __be16 max_snd_len; + __be16 first_brst_len; + __be16 max_brst_len; + __be16 r4; + __be16 def_time2wait; + __be16 def_time2ret; + __be16 nop_out_intrvl; + __be16 non_scsi_to; + __be16 isid; + __be16 tsid; + __be16 port; + __be16 tpgt; + __u8 r5[6]; + __be16 iqid; + } iscsi_rdev; + } u; +}; + +#define S_FW_RDEV_WR_IMMDLEN 0 +#define M_FW_RDEV_WR_IMMDLEN 0xff +#define V_FW_RDEV_WR_IMMDLEN(x) ((x) << S_FW_RDEV_WR_IMMDLEN) +#define G_FW_RDEV_WR_IMMDLEN(x) \ + (((x) >> S_FW_RDEV_WR_IMMDLEN) & M_FW_RDEV_WR_IMMDLEN) + +#define S_FW_RDEV_WR_ALLOC 31 +#define M_FW_RDEV_WR_ALLOC 0x1 +#define V_FW_RDEV_WR_ALLOC(x) ((x) << S_FW_RDEV_WR_ALLOC) +#define G_FW_RDEV_WR_ALLOC(x) \ + (((x) >> S_FW_RDEV_WR_ALLOC) & M_FW_RDEV_WR_ALLOC) +#define F_FW_RDEV_WR_ALLOC V_FW_RDEV_WR_ALLOC(1U) + +#define S_FW_RDEV_WR_FREE 30 +#define M_FW_RDEV_WR_FREE 0x1 +#define V_FW_RDEV_WR_FREE(x) ((x) << S_FW_RDEV_WR_FREE) +#define G_FW_RDEV_WR_FREE(x) \ + (((x) >> S_FW_RDEV_WR_FREE) & M_FW_RDEV_WR_FREE) +#define F_FW_RDEV_WR_FREE V_FW_RDEV_WR_FREE(1U) + +#define S_FW_RDEV_WR_MODIFY 29 +#define M_FW_RDEV_WR_MODIFY 0x1 +#define V_FW_RDEV_WR_MODIFY(x) ((x) << S_FW_RDEV_WR_MODIFY) +#define G_FW_RDEV_WR_MODIFY(x) \ + (((x) >> S_FW_RDEV_WR_MODIFY) & M_FW_RDEV_WR_MODIFY) +#define F_FW_RDEV_WR_MODIFY V_FW_RDEV_WR_MODIFY(1U) + +#define S_FW_RDEV_WR_FLOWID 8 +#define M_FW_RDEV_WR_FLOWID 0xfffff +#define V_FW_RDEV_WR_FLOWID(x) ((x) << S_FW_RDEV_WR_FLOWID) +#define G_FW_RDEV_WR_FLOWID(x) \ + (((x) >> S_FW_RDEV_WR_FLOWID) & M_FW_RDEV_WR_FLOWID) + +#define S_FW_RDEV_WR_LEN16 0 +#define M_FW_RDEV_WR_LEN16 0xff +#define V_FW_RDEV_WR_LEN16(x) ((x) << S_FW_RDEV_WR_LEN16) +#define G_FW_RDEV_WR_LEN16(x) \ + (((x) >> S_FW_RDEV_WR_LEN16) & M_FW_RDEV_WR_LEN16) + +#define S_FW_RDEV_WR_FLAGS 24 +#define M_FW_RDEV_WR_FLAGS 0xff +#define V_FW_RDEV_WR_FLAGS(x) ((x) << S_FW_RDEV_WR_FLAGS) +#define G_FW_RDEV_WR_FLAGS(x) \ + (((x) >> S_FW_RDEV_WR_FLAGS) & M_FW_RDEV_WR_FLAGS) + +#define S_FW_RDEV_WR_GET_NEXT 20 +#define M_FW_RDEV_WR_GET_NEXT 0xf +#define V_FW_RDEV_WR_GET_NEXT(x) ((x) << S_FW_RDEV_WR_GET_NEXT) +#define G_FW_RDEV_WR_GET_NEXT(x) \ + (((x) >> S_FW_RDEV_WR_GET_NEXT) & M_FW_RDEV_WR_GET_NEXT) + +#define S_FW_RDEV_WR_ASSOC_FLOWID 0 +#define M_FW_RDEV_WR_ASSOC_FLOWID 0xfffff +#define V_FW_RDEV_WR_ASSOC_FLOWID(x) ((x) << S_FW_RDEV_WR_ASSOC_FLOWID) +#define G_FW_RDEV_WR_ASSOC_FLOWID(x) \ + (((x) >> S_FW_RDEV_WR_ASSOC_FLOWID) & M_FW_RDEV_WR_ASSOC_FLOWID) + +#define S_FW_RDEV_WR_RJT 7 +#define M_FW_RDEV_WR_RJT 0x1 +#define V_FW_RDEV_WR_RJT(x) ((x) << S_FW_RDEV_WR_RJT) +#define G_FW_RDEV_WR_RJT(x) (((x) >> S_FW_RDEV_WR_RJT) & M_FW_RDEV_WR_RJT) +#define F_FW_RDEV_WR_RJT V_FW_RDEV_WR_RJT(1U) + +#define S_FW_RDEV_WR_REASON 0 +#define M_FW_RDEV_WR_REASON 0x7f +#define V_FW_RDEV_WR_REASON(x) ((x) << S_FW_RDEV_WR_REASON) +#define G_FW_RDEV_WR_REASON(x) \ + (((x) >> S_FW_RDEV_WR_REASON) & M_FW_RDEV_WR_REASON) + +#define S_FW_RDEV_WR_RD_XFER_RDY 7 +#define M_FW_RDEV_WR_RD_XFER_RDY 0x1 +#define V_FW_RDEV_WR_RD_XFER_RDY(x) ((x) << S_FW_RDEV_WR_RD_XFER_RDY) +#define G_FW_RDEV_WR_RD_XFER_RDY(x) \ + (((x) >> S_FW_RDEV_WR_RD_XFER_RDY) & M_FW_RDEV_WR_RD_XFER_RDY) +#define F_FW_RDEV_WR_RD_XFER_RDY V_FW_RDEV_WR_RD_XFER_RDY(1U) + +#define S_FW_RDEV_WR_WR_XFER_RDY 6 +#define M_FW_RDEV_WR_WR_XFER_RDY 0x1 +#define V_FW_RDEV_WR_WR_XFER_RDY(x) ((x) << S_FW_RDEV_WR_WR_XFER_RDY) +#define G_FW_RDEV_WR_WR_XFER_RDY(x) \ + (((x) >> S_FW_RDEV_WR_WR_XFER_RDY) & M_FW_RDEV_WR_WR_XFER_RDY) +#define F_FW_RDEV_WR_WR_XFER_RDY V_FW_RDEV_WR_WR_XFER_RDY(1U) + +#define S_FW_RDEV_WR_FC_SP 5 +#define M_FW_RDEV_WR_FC_SP 0x1 +#define V_FW_RDEV_WR_FC_SP(x) ((x) << S_FW_RDEV_WR_FC_SP) +#define G_FW_RDEV_WR_FC_SP(x) \ + (((x) >> S_FW_RDEV_WR_FC_SP) & M_FW_RDEV_WR_FC_SP) +#define F_FW_RDEV_WR_FC_SP V_FW_RDEV_WR_FC_SP(1U) + +#define S_FW_RDEV_WR_RPORT_TYPE 0 +#define M_FW_RDEV_WR_RPORT_TYPE 0x1f +#define V_FW_RDEV_WR_RPORT_TYPE(x) ((x) << S_FW_RDEV_WR_RPORT_TYPE) +#define G_FW_RDEV_WR_RPORT_TYPE(x) \ + (((x) >> S_FW_RDEV_WR_RPORT_TYPE) & M_FW_RDEV_WR_RPORT_TYPE) + +#define S_FW_RDEV_WR_VFT 7 +#define M_FW_RDEV_WR_VFT 0x1 +#define V_FW_RDEV_WR_VFT(x) ((x) << S_FW_RDEV_WR_VFT) +#define G_FW_RDEV_WR_VFT(x) (((x) >> S_FW_RDEV_WR_VFT) & M_FW_RDEV_WR_VFT) +#define F_FW_RDEV_WR_VFT V_FW_RDEV_WR_VFT(1U) + +#define S_FW_RDEV_WR_NPIV 6 +#define M_FW_RDEV_WR_NPIV 0x1 +#define V_FW_RDEV_WR_NPIV(x) ((x) << S_FW_RDEV_WR_NPIV) +#define G_FW_RDEV_WR_NPIV(x) \ + (((x) >> S_FW_RDEV_WR_NPIV) & M_FW_RDEV_WR_NPIV) +#define F_FW_RDEV_WR_NPIV V_FW_RDEV_WR_NPIV(1U) + +#define S_FW_RDEV_WR_CLASS 4 +#define M_FW_RDEV_WR_CLASS 0x3 +#define V_FW_RDEV_WR_CLASS(x) ((x) << S_FW_RDEV_WR_CLASS) +#define G_FW_RDEV_WR_CLASS(x) \ + (((x) >> S_FW_RDEV_WR_CLASS) & M_FW_RDEV_WR_CLASS) + +#define S_FW_RDEV_WR_SEQ_DEL 3 +#define M_FW_RDEV_WR_SEQ_DEL 0x1 +#define V_FW_RDEV_WR_SEQ_DEL(x) ((x) << S_FW_RDEV_WR_SEQ_DEL) +#define G_FW_RDEV_WR_SEQ_DEL(x) \ + (((x) >> S_FW_RDEV_WR_SEQ_DEL) & M_FW_RDEV_WR_SEQ_DEL) +#define F_FW_RDEV_WR_SEQ_DEL V_FW_RDEV_WR_SEQ_DEL(1U) + +#define S_FW_RDEV_WR_PRIO_PREEMP 2 +#define M_FW_RDEV_WR_PRIO_PREEMP 0x1 +#define V_FW_RDEV_WR_PRIO_PREEMP(x) ((x) << S_FW_RDEV_WR_PRIO_PREEMP) +#define G_FW_RDEV_WR_PRIO_PREEMP(x) \ + (((x) >> S_FW_RDEV_WR_PRIO_PREEMP) & M_FW_RDEV_WR_PRIO_PREEMP) +#define F_FW_RDEV_WR_PRIO_PREEMP V_FW_RDEV_WR_PRIO_PREEMP(1U) + +#define S_FW_RDEV_WR_PREF 1 +#define M_FW_RDEV_WR_PREF 0x1 +#define V_FW_RDEV_WR_PREF(x) ((x) << S_FW_RDEV_WR_PREF) +#define G_FW_RDEV_WR_PREF(x) \ + (((x) >> S_FW_RDEV_WR_PREF) & M_FW_RDEV_WR_PREF) +#define F_FW_RDEV_WR_PREF V_FW_RDEV_WR_PREF(1U) + +#define S_FW_RDEV_WR_QOS 0 +#define M_FW_RDEV_WR_QOS 0x1 +#define V_FW_RDEV_WR_QOS(x) ((x) << S_FW_RDEV_WR_QOS) +#define G_FW_RDEV_WR_QOS(x) (((x) >> S_FW_RDEV_WR_QOS) & M_FW_RDEV_WR_QOS) +#define F_FW_RDEV_WR_QOS V_FW_RDEV_WR_QOS(1U) + +#define S_FW_RDEV_WR_ORG_PROC_ASSOC 7 +#define M_FW_RDEV_WR_ORG_PROC_ASSOC 0x1 +#define V_FW_RDEV_WR_ORG_PROC_ASSOC(x) ((x) << S_FW_RDEV_WR_ORG_PROC_ASSOC) +#define G_FW_RDEV_WR_ORG_PROC_ASSOC(x) \ + (((x) >> S_FW_RDEV_WR_ORG_PROC_ASSOC) & M_FW_RDEV_WR_ORG_PROC_ASSOC) +#define F_FW_RDEV_WR_ORG_PROC_ASSOC V_FW_RDEV_WR_ORG_PROC_ASSOC(1U) + +#define S_FW_RDEV_WR_RSP_PROC_ASSOC 6 +#define M_FW_RDEV_WR_RSP_PROC_ASSOC 0x1 +#define V_FW_RDEV_WR_RSP_PROC_ASSOC(x) ((x) << S_FW_RDEV_WR_RSP_PROC_ASSOC) +#define G_FW_RDEV_WR_RSP_PROC_ASSOC(x) \ + (((x) >> S_FW_RDEV_WR_RSP_PROC_ASSOC) & M_FW_RDEV_WR_RSP_PROC_ASSOC) +#define F_FW_RDEV_WR_RSP_PROC_ASSOC V_FW_RDEV_WR_RSP_PROC_ASSOC(1U) + +#define S_FW_RDEV_WR_IMAGE_PAIR 5 +#define M_FW_RDEV_WR_IMAGE_PAIR 0x1 +#define V_FW_RDEV_WR_IMAGE_PAIR(x) ((x) << S_FW_RDEV_WR_IMAGE_PAIR) +#define G_FW_RDEV_WR_IMAGE_PAIR(x) \ + (((x) >> S_FW_RDEV_WR_IMAGE_PAIR) & M_FW_RDEV_WR_IMAGE_PAIR) +#define F_FW_RDEV_WR_IMAGE_PAIR V_FW_RDEV_WR_IMAGE_PAIR(1U) + +#define S_FW_RDEV_WR_ACC_RSP_CODE 0 +#define M_FW_RDEV_WR_ACC_RSP_CODE 0x1f +#define V_FW_RDEV_WR_ACC_RSP_CODE(x) ((x) << S_FW_RDEV_WR_ACC_RSP_CODE) +#define G_FW_RDEV_WR_ACC_RSP_CODE(x) \ + (((x) >> S_FW_RDEV_WR_ACC_RSP_CODE) & M_FW_RDEV_WR_ACC_RSP_CODE) + +#define S_FW_RDEV_WR_ENH_DISC 7 +#define M_FW_RDEV_WR_ENH_DISC 0x1 +#define V_FW_RDEV_WR_ENH_DISC(x) ((x) << S_FW_RDEV_WR_ENH_DISC) +#define G_FW_RDEV_WR_ENH_DISC(x) \ + (((x) >> S_FW_RDEV_WR_ENH_DISC) & M_FW_RDEV_WR_ENH_DISC) +#define F_FW_RDEV_WR_ENH_DISC V_FW_RDEV_WR_ENH_DISC(1U) + +#define S_FW_RDEV_WR_REC 6 +#define M_FW_RDEV_WR_REC 0x1 +#define V_FW_RDEV_WR_REC(x) ((x) << S_FW_RDEV_WR_REC) +#define G_FW_RDEV_WR_REC(x) (((x) >> S_FW_RDEV_WR_REC) & M_FW_RDEV_WR_REC) +#define F_FW_RDEV_WR_REC V_FW_RDEV_WR_REC(1U) + +#define S_FW_RDEV_WR_TASK_RETRY_ID 5 +#define M_FW_RDEV_WR_TASK_RETRY_ID 0x1 +#define V_FW_RDEV_WR_TASK_RETRY_ID(x) ((x) << S_FW_RDEV_WR_TASK_RETRY_ID) +#define G_FW_RDEV_WR_TASK_RETRY_ID(x) \ + (((x) >> S_FW_RDEV_WR_TASK_RETRY_ID) & M_FW_RDEV_WR_TASK_RETRY_ID) +#define F_FW_RDEV_WR_TASK_RETRY_ID V_FW_RDEV_WR_TASK_RETRY_ID(1U) + +#define S_FW_RDEV_WR_RETRY 4 +#define M_FW_RDEV_WR_RETRY 0x1 +#define V_FW_RDEV_WR_RETRY(x) ((x) << S_FW_RDEV_WR_RETRY) +#define G_FW_RDEV_WR_RETRY(x) \ + (((x) >> S_FW_RDEV_WR_RETRY) & M_FW_RDEV_WR_RETRY) +#define F_FW_RDEV_WR_RETRY V_FW_RDEV_WR_RETRY(1U) + +#define S_FW_RDEV_WR_CONF_CMPL 3 +#define M_FW_RDEV_WR_CONF_CMPL 0x1 +#define V_FW_RDEV_WR_CONF_CMPL(x) ((x) << S_FW_RDEV_WR_CONF_CMPL) +#define G_FW_RDEV_WR_CONF_CMPL(x) \ + (((x) >> S_FW_RDEV_WR_CONF_CMPL) & M_FW_RDEV_WR_CONF_CMPL) +#define F_FW_RDEV_WR_CONF_CMPL V_FW_RDEV_WR_CONF_CMPL(1U) + +#define S_FW_RDEV_WR_DATA_OVLY 2 +#define M_FW_RDEV_WR_DATA_OVLY 0x1 +#define V_FW_RDEV_WR_DATA_OVLY(x) ((x) << S_FW_RDEV_WR_DATA_OVLY) +#define G_FW_RDEV_WR_DATA_OVLY(x) \ + (((x) >> S_FW_RDEV_WR_DATA_OVLY) & M_FW_RDEV_WR_DATA_OVLY) +#define F_FW_RDEV_WR_DATA_OVLY V_FW_RDEV_WR_DATA_OVLY(1U) + +#define S_FW_RDEV_WR_INI 1 +#define M_FW_RDEV_WR_INI 0x1 +#define V_FW_RDEV_WR_INI(x) ((x) << S_FW_RDEV_WR_INI) +#define G_FW_RDEV_WR_INI(x) (((x) >> S_FW_RDEV_WR_INI) & M_FW_RDEV_WR_INI) +#define F_FW_RDEV_WR_INI V_FW_RDEV_WR_INI(1U) + +#define S_FW_RDEV_WR_TGT 0 +#define M_FW_RDEV_WR_TGT 0x1 +#define V_FW_RDEV_WR_TGT(x) ((x) << S_FW_RDEV_WR_TGT) +#define G_FW_RDEV_WR_TGT(x) (((x) >> S_FW_RDEV_WR_TGT) & M_FW_RDEV_WR_TGT) +#define F_FW_RDEV_WR_TGT V_FW_RDEV_WR_TGT(1U) + +struct fw_foiscsi_node_wr { + __be32 op_to_immdlen; + __be32 flowid_len16; + __u64 cookie; + __u8 subop; __u8 status; - __be16 r1; + __u8 alias_len; + __u8 iqn_len; + __be32 node_flowid; + __be16 nodeid; + __be16 login_retry; + __be16 retry_timeout; + __be16 r3; + __u8 iqn[224]; + __u8 alias[224]; +}; + +#define S_FW_FOISCSI_NODE_WR_IMMDLEN 0 +#define M_FW_FOISCSI_NODE_WR_IMMDLEN 0xffff +#define V_FW_FOISCSI_NODE_WR_IMMDLEN(x) ((x) << S_FW_FOISCSI_NODE_WR_IMMDLEN) +#define G_FW_FOISCSI_NODE_WR_IMMDLEN(x) \ + (((x) >> S_FW_FOISCSI_NODE_WR_IMMDLEN) & M_FW_FOISCSI_NODE_WR_IMMDLEN) + +struct fw_foiscsi_ctrl_wr { + __be32 op_compl; + __be32 flowid_len16; + __u64 cookie; + __u8 subop; + __u8 status; + __u8 ctrl_state; + __u8 io_state; __be32 node_id; - __be32 ctrl_handle; - __be32 io_handle; + __be32 ctrl_id; + __be32 io_id; + struct fw_foiscsi_sess_attr { + __be32 sess_type_to_erl; + __be16 max_conn; + __be16 max_r2t; + __be16 time2wait; + __be16 time2retain; + __be32 max_burst; + __be32 first_burst; + __be32 r1; + } sess_attr; + struct fw_foiscsi_conn_attr { + __be32 hdigest_to_auth_policy; + __be32 max_rcv_dsl; + __be32 ping_tmo; + __be16 dst_port; + __be16 src_port; + union fw_foiscsi_conn_attr_addr { + struct fw_foiscsi_conn_attr_ipv6 { + __be64 dst_addr[2]; + __be64 src_addr[2]; + } ipv6_addr; + struct fw_foiscsi_conn_attr_ipv4 { + __be32 dst_addr; + __be32 src_addr; + } ipv4_addr; + } u; + } conn_attr; + __u8 tgt_name_len; + __u8 r3[7]; + __u8 tgt_name[224]; }; -#define S_FW_ISCSI_NODE_WR_FLOWID 8 -#define M_FW_ISCSI_NODE_WR_FLOWID 0xfffff -#define V_FW_ISCSI_NODE_WR_FLOWID(x) ((x) << S_FW_ISCSI_NODE_WR_FLOWID) -#define G_FW_ISCSI_NODE_WR_FLOWID(x) \ - (((x) >> S_FW_ISCSI_NODE_WR_FLOWID) & M_FW_ISCSI_NODE_WR_FLOWID) +#define S_FW_FOISCSI_CTRL_WR_SESS_TYPE 30 +#define M_FW_FOISCSI_CTRL_WR_SESS_TYPE 0x3 +#define V_FW_FOISCSI_CTRL_WR_SESS_TYPE(x) \ + ((x) << S_FW_FOISCSI_CTRL_WR_SESS_TYPE) +#define G_FW_FOISCSI_CTRL_WR_SESS_TYPE(x) \ + (((x) >> S_FW_FOISCSI_CTRL_WR_SESS_TYPE) & M_FW_FOISCSI_CTRL_WR_SESS_TYPE) -#define S_FW_ISCSI_NODE_WR_LEN16 0 -#define M_FW_ISCSI_NODE_WR_LEN16 0xff -#define V_FW_ISCSI_NODE_WR_LEN16(x) ((x) << S_FW_ISCSI_NODE_WR_LEN16) -#define G_FW_ISCSI_NODE_WR_LEN16(x) \ - (((x) >> S_FW_ISCSI_NODE_WR_LEN16) & M_FW_ISCSI_NODE_WR_LEN16) +#define S_FW_FOISCSI_CTRL_WR_SEQ_INORDER 29 +#define M_FW_FOISCSI_CTRL_WR_SEQ_INORDER 0x1 +#define V_FW_FOISCSI_CTRL_WR_SEQ_INORDER(x) \ + ((x) << S_FW_FOISCSI_CTRL_WR_SEQ_INORDER) +#define G_FW_FOISCSI_CTRL_WR_SEQ_INORDER(x) \ + (((x) >> S_FW_FOISCSI_CTRL_WR_SEQ_INORDER) & \ + M_FW_FOISCSI_CTRL_WR_SEQ_INORDER) +#define F_FW_FOISCSI_CTRL_WR_SEQ_INORDER \ + V_FW_FOISCSI_CTRL_WR_SEQ_INORDER(1U) -#define S_FW_ISCSI_NODE_WR_NODE_ATTR 7 -#define M_FW_ISCSI_NODE_WR_NODE_ATTR 0x1 -#define V_FW_ISCSI_NODE_WR_NODE_ATTR(x) ((x) << S_FW_ISCSI_NODE_WR_NODE_ATTR) -#define G_FW_ISCSI_NODE_WR_NODE_ATTR(x) \ - (((x) >> S_FW_ISCSI_NODE_WR_NODE_ATTR) & M_FW_ISCSI_NODE_WR_NODE_ATTR) -#define F_FW_ISCSI_NODE_WR_NODE_ATTR V_FW_ISCSI_NODE_WR_NODE_ATTR(1U) +#define S_FW_FOISCSI_CTRL_WR_PDU_INORDER 28 +#define M_FW_FOISCSI_CTRL_WR_PDU_INORDER 0x1 +#define V_FW_FOISCSI_CTRL_WR_PDU_INORDER(x) \ + ((x) << S_FW_FOISCSI_CTRL_WR_PDU_INORDER) +#define G_FW_FOISCSI_CTRL_WR_PDU_INORDER(x) \ + (((x) >> S_FW_FOISCSI_CTRL_WR_PDU_INORDER) & \ + M_FW_FOISCSI_CTRL_WR_PDU_INORDER) +#define F_FW_FOISCSI_CTRL_WR_PDU_INORDER \ + V_FW_FOISCSI_CTRL_WR_PDU_INORDER(1U) -#define S_FW_ISCSI_NODE_WR_SESS_ATTR 6 -#define M_FW_ISCSI_NODE_WR_SESS_ATTR 0x1 -#define V_FW_ISCSI_NODE_WR_SESS_ATTR(x) ((x) << S_FW_ISCSI_NODE_WR_SESS_ATTR) -#define G_FW_ISCSI_NODE_WR_SESS_ATTR(x) \ - (((x) >> S_FW_ISCSI_NODE_WR_SESS_ATTR) & M_FW_ISCSI_NODE_WR_SESS_ATTR) -#define F_FW_ISCSI_NODE_WR_SESS_ATTR V_FW_ISCSI_NODE_WR_SESS_ATTR(1U) +#define S_FW_FOISCSI_CTRL_WR_IMMD_DATA_EN 27 +#define M_FW_FOISCSI_CTRL_WR_IMMD_DATA_EN 0x1 +#define V_FW_FOISCSI_CTRL_WR_IMMD_DATA_EN(x) \ + ((x) << S_FW_FOISCSI_CTRL_WR_IMMD_DATA_EN) +#define G_FW_FOISCSI_CTRL_WR_IMMD_DATA_EN(x) \ + (((x) >> S_FW_FOISCSI_CTRL_WR_IMMD_DATA_EN) & \ + M_FW_FOISCSI_CTRL_WR_IMMD_DATA_EN) +#define F_FW_FOISCSI_CTRL_WR_IMMD_DATA_EN \ + V_FW_FOISCSI_CTRL_WR_IMMD_DATA_EN(1U) -#define S_FW_ISCSI_NODE_WR_CONN_ATTR 5 -#define M_FW_ISCSI_NODE_WR_CONN_ATTR 0x1 -#define V_FW_ISCSI_NODE_WR_CONN_ATTR(x) ((x) << S_FW_ISCSI_NODE_WR_CONN_ATTR) -#define G_FW_ISCSI_NODE_WR_CONN_ATTR(x) \ - (((x) >> S_FW_ISCSI_NODE_WR_CONN_ATTR) & M_FW_ISCSI_NODE_WR_CONN_ATTR) -#define F_FW_ISCSI_NODE_WR_CONN_ATTR V_FW_ISCSI_NODE_WR_CONN_ATTR(1U) +#define S_FW_FOISCSI_CTRL_WR_INIT_R2T_EN 26 +#define M_FW_FOISCSI_CTRL_WR_INIT_R2T_EN 0x1 +#define V_FW_FOISCSI_CTRL_WR_INIT_R2T_EN(x) \ + ((x) << S_FW_FOISCSI_CTRL_WR_INIT_R2T_EN) +#define G_FW_FOISCSI_CTRL_WR_INIT_R2T_EN(x) \ + (((x) >> S_FW_FOISCSI_CTRL_WR_INIT_R2T_EN) & \ + M_FW_FOISCSI_CTRL_WR_INIT_R2T_EN) +#define F_FW_FOISCSI_CTRL_WR_INIT_R2T_EN \ + V_FW_FOISCSI_CTRL_WR_INIT_R2T_EN(1U) -#define S_FW_ISCSI_NODE_WR_TGT_ATTR 4 -#define M_FW_ISCSI_NODE_WR_TGT_ATTR 0x1 -#define V_FW_ISCSI_NODE_WR_TGT_ATTR(x) ((x) << S_FW_ISCSI_NODE_WR_TGT_ATTR) -#define G_FW_ISCSI_NODE_WR_TGT_ATTR(x) \ - (((x) >> S_FW_ISCSI_NODE_WR_TGT_ATTR) & M_FW_ISCSI_NODE_WR_TGT_ATTR) -#define F_FW_ISCSI_NODE_WR_TGT_ATTR V_FW_ISCSI_NODE_WR_TGT_ATTR(1U) +#define S_FW_FOISCSI_CTRL_WR_ERL 24 +#define M_FW_FOISCSI_CTRL_WR_ERL 0x3 +#define V_FW_FOISCSI_CTRL_WR_ERL(x) ((x) << S_FW_FOISCSI_CTRL_WR_ERL) +#define G_FW_FOISCSI_CTRL_WR_ERL(x) \ + (((x) >> S_FW_FOISCSI_CTRL_WR_ERL) & M_FW_FOISCSI_CTRL_WR_ERL) -#define S_FW_ISCSI_NODE_WR_NODE_TYPE 3 -#define M_FW_ISCSI_NODE_WR_NODE_TYPE 0x1 -#define V_FW_ISCSI_NODE_WR_NODE_TYPE(x) ((x) << S_FW_ISCSI_NODE_WR_NODE_TYPE) -#define G_FW_ISCSI_NODE_WR_NODE_TYPE(x) \ - (((x) >> S_FW_ISCSI_NODE_WR_NODE_TYPE) & M_FW_ISCSI_NODE_WR_NODE_TYPE) -#define F_FW_ISCSI_NODE_WR_NODE_TYPE V_FW_ISCSI_NODE_WR_NODE_TYPE(1U) +#define S_FW_FOISCSI_CTRL_WR_HDIGEST 30 +#define M_FW_FOISCSI_CTRL_WR_HDIGEST 0x3 +#define V_FW_FOISCSI_CTRL_WR_HDIGEST(x) ((x) << S_FW_FOISCSI_CTRL_WR_HDIGEST) +#define G_FW_FOISCSI_CTRL_WR_HDIGEST(x) \ + (((x) >> S_FW_FOISCSI_CTRL_WR_HDIGEST) & M_FW_FOISCSI_CTRL_WR_HDIGEST) -#define S_FW_ISCSI_NODE_WR_COMPL 0 -#define M_FW_ISCSI_NODE_WR_COMPL 0x1 -#define V_FW_ISCSI_NODE_WR_COMPL(x) ((x) << S_FW_ISCSI_NODE_WR_COMPL) -#define G_FW_ISCSI_NODE_WR_COMPL(x) \ - (((x) >> S_FW_ISCSI_NODE_WR_COMPL) & M_FW_ISCSI_NODE_WR_COMPL) -#define F_FW_ISCSI_NODE_WR_COMPL V_FW_ISCSI_NODE_WR_COMPL(1U) +#define S_FW_FOISCSI_CTRL_WR_DDIGEST 28 +#define M_FW_FOISCSI_CTRL_WR_DDIGEST 0x3 +#define V_FW_FOISCSI_CTRL_WR_DDIGEST(x) ((x) << S_FW_FOISCSI_CTRL_WR_DDIGEST) +#define G_FW_FOISCSI_CTRL_WR_DDIGEST(x) \ + (((x) >> S_FW_FOISCSI_CTRL_WR_DDIGEST) & M_FW_FOISCSI_CTRL_WR_DDIGEST) -#define FW_ISCSI_NODE_INVALID_ID 0xffffffff +#define S_FW_FOISCSI_CTRL_WR_AUTH_METHOD 25 +#define M_FW_FOISCSI_CTRL_WR_AUTH_METHOD 0x7 +#define V_FW_FOISCSI_CTRL_WR_AUTH_METHOD(x) \ + ((x) << S_FW_FOISCSI_CTRL_WR_AUTH_METHOD) +#define G_FW_FOISCSI_CTRL_WR_AUTH_METHOD(x) \ + (((x) >> S_FW_FOISCSI_CTRL_WR_AUTH_METHOD) & \ + M_FW_FOISCSI_CTRL_WR_AUTH_METHOD) -struct fw_scsi_iscsi_data { - __u8 r0; - __u8 fbit_to_tattr; - __be16 r2; - __be32 r3; - __u8 lun[8]; - __be32 r4; - __be32 dlen; - __be32 r5; - __be32 r6; - __u8 cdb[16]; -}; +#define S_FW_FOISCSI_CTRL_WR_AUTH_POLICY 23 +#define M_FW_FOISCSI_CTRL_WR_AUTH_POLICY 0x3 +#define V_FW_FOISCSI_CTRL_WR_AUTH_POLICY(x) \ + ((x) << S_FW_FOISCSI_CTRL_WR_AUTH_POLICY) +#define G_FW_FOISCSI_CTRL_WR_AUTH_POLICY(x) \ + (((x) >> S_FW_FOISCSI_CTRL_WR_AUTH_POLICY) & \ + M_FW_FOISCSI_CTRL_WR_AUTH_POLICY) -#define S_FW_SCSI_ISCSI_DATA_FBIT 7 -#define M_FW_SCSI_ISCSI_DATA_FBIT 0x1 -#define V_FW_SCSI_ISCSI_DATA_FBIT(x) ((x) << S_FW_SCSI_ISCSI_DATA_FBIT) -#define G_FW_SCSI_ISCSI_DATA_FBIT(x) \ - (((x) >> S_FW_SCSI_ISCSI_DATA_FBIT) & M_FW_SCSI_ISCSI_DATA_FBIT) -#define F_FW_SCSI_ISCSI_DATA_FBIT V_FW_SCSI_ISCSI_DATA_FBIT(1U) - -#define S_FW_SCSI_ISCSI_DATA_RBIT 6 -#define M_FW_SCSI_ISCSI_DATA_RBIT 0x1 -#define V_FW_SCSI_ISCSI_DATA_RBIT(x) ((x) << S_FW_SCSI_ISCSI_DATA_RBIT) -#define G_FW_SCSI_ISCSI_DATA_RBIT(x) \ - (((x) >> S_FW_SCSI_ISCSI_DATA_RBIT) & M_FW_SCSI_ISCSI_DATA_RBIT) -#define F_FW_SCSI_ISCSI_DATA_RBIT V_FW_SCSI_ISCSI_DATA_RBIT(1U) - -#define S_FW_SCSI_ISCSI_DATA_WBIT 5 -#define M_FW_SCSI_ISCSI_DATA_WBIT 0x1 -#define V_FW_SCSI_ISCSI_DATA_WBIT(x) ((x) << S_FW_SCSI_ISCSI_DATA_WBIT) -#define G_FW_SCSI_ISCSI_DATA_WBIT(x) \ - (((x) >> S_FW_SCSI_ISCSI_DATA_WBIT) & M_FW_SCSI_ISCSI_DATA_WBIT) -#define F_FW_SCSI_ISCSI_DATA_WBIT V_FW_SCSI_ISCSI_DATA_WBIT(1U) - -#define S_FW_SCSI_ISCSI_DATA_TATTR 0 -#define M_FW_SCSI_ISCSI_DATA_TATTR 0x7 -#define V_FW_SCSI_ISCSI_DATA_TATTR(x) ((x) << S_FW_SCSI_ISCSI_DATA_TATTR) -#define G_FW_SCSI_ISCSI_DATA_TATTR(x) \ - (((x) >> S_FW_SCSI_ISCSI_DATA_TATTR) & M_FW_SCSI_ISCSI_DATA_TATTR) - -#define FW_SCSI_ISCSI_DATA_TATTR_UNTAGGED 0 -#define FW_SCSI_ISCSI_DATA_TATTR_SIMPLE 1 -#define FW_SCSI_ISCSI_DATA_TATTR_ORDERED 2 -#define FW_SCSI_ISCSI_DATA_TATTR_HEADOQ 3 -#define FW_SCSI_ISCSI_DATA_TATTR_ACA 4 - -#define FW_SCSI_ISCSI_TMF_OP 0x02 -#define FW_SCSI_ISCSI_ABORT_FUNC 0x01 -#define FW_SCSI_ISCSI_LUN_RESET_FUNC 0x05 -#define FW_SCSI_ISCSI_RESERVED_TAG 0xffffffff - -struct fw_scsi_iscsi_rsp { - __u8 r0; - __u8 sbit_to_uflow; - __u8 response; +struct fw_foiscsi_chap_wr { + __be32 op_compl; + __be32 flowid_len16; + __u64 cookie; __u8 status; - __be32 r4; - __u8 r5[32]; - __be32 bidir_res_cnt; - __be32 res_cnt; - __u8 sense_data[128]; + __u8 id_len; + __u8 sec_len; + __u8 tgt_id_len; + __u8 tgt_sec_len; + __be16 node_id; + __u8 r2; + __u8 chap_id[64]; + __u8 chap_sec[16]; + __u8 tgt_id[64]; + __u8 tgt_sec[16]; }; -#define S_FW_SCSI_ISCSI_RSP_SBIT 7 -#define M_FW_SCSI_ISCSI_RSP_SBIT 0x1 -#define V_FW_SCSI_ISCSI_RSP_SBIT(x) ((x) << S_FW_SCSI_ISCSI_RSP_SBIT) -#define G_FW_SCSI_ISCSI_RSP_SBIT(x) \ - (((x) >> S_FW_SCSI_ISCSI_RSP_SBIT) & M_FW_SCSI_ISCSI_RSP_SBIT) -#define F_FW_SCSI_ISCSI_RSP_SBIT V_FW_SCSI_ISCSI_RSP_SBIT(1U) +/****************************************************************************** + * F O F C O E W O R K R E Q U E S T s + *******************************************/ -#define S_FW_SCSI_ISCSI_RSP_BIDIR_OFLOW 4 -#define M_FW_SCSI_ISCSI_RSP_BIDIR_OFLOW 0x1 -#define V_FW_SCSI_ISCSI_RSP_BIDIR_OFLOW(x) \ - ((x) << S_FW_SCSI_ISCSI_RSP_BIDIR_OFLOW) -#define G_FW_SCSI_ISCSI_RSP_BIDIR_OFLOW(x) \ - (((x) >> S_FW_SCSI_ISCSI_RSP_BIDIR_OFLOW) & \ - M_FW_SCSI_ISCSI_RSP_BIDIR_OFLOW) -#define F_FW_SCSI_ISCSI_RSP_BIDIR_OFLOW V_FW_SCSI_ISCSI_RSP_BIDIR_OFLOW(1U) +struct fw_fcoe_els_ct_wr { + __be32 op_immdlen; + __be32 flowid_len16; + __be64 cookie; + __be16 iqid; + __u8 tmo_val; + __u8 els_ct_type; + __u8 ctl_pri; + __u8 cp_en_class; + __be16 xfer_cnt; + __u8 fl_to_sp; + __u8 l_id[3]; + __u8 r5; + __u8 r_id[3]; + __be64 rsp_dmaaddr; + __be32 rsp_dmalen; + __be32 r6; +}; -#define S_FW_SCSI_ISCSI_RSP_BIDIR_UFLOW 3 -#define M_FW_SCSI_ISCSI_RSP_BIDIR_UFLOW 0x1 -#define V_FW_SCSI_ISCSI_RSP_BIDIR_UFLOW(x) \ - ((x) << S_FW_SCSI_ISCSI_RSP_BIDIR_UFLOW) -#define G_FW_SCSI_ISCSI_RSP_BIDIR_UFLOW(x) \ - (((x) >> S_FW_SCSI_ISCSI_RSP_BIDIR_UFLOW) & \ - M_FW_SCSI_ISCSI_RSP_BIDIR_UFLOW) -#define F_FW_SCSI_ISCSI_RSP_BIDIR_UFLOW V_FW_SCSI_ISCSI_RSP_BIDIR_UFLOW(1U) +#define S_FW_FCOE_ELS_CT_WR_OPCODE 24 +#define M_FW_FCOE_ELS_CT_WR_OPCODE 0xff +#define V_FW_FCOE_ELS_CT_WR_OPCODE(x) ((x) << S_FW_FCOE_ELS_CT_WR_OPCODE) +#define G_FW_FCOE_ELS_CT_WR_OPCODE(x) \ + (((x) >> S_FW_FCOE_ELS_CT_WR_OPCODE) & M_FW_FCOE_ELS_CT_WR_OPCODE) -#define S_FW_SCSI_ISCSI_RSP_OFLOW 2 -#define M_FW_SCSI_ISCSI_RSP_OFLOW 0x1 -#define V_FW_SCSI_ISCSI_RSP_OFLOW(x) ((x) << S_FW_SCSI_ISCSI_RSP_OFLOW) -#define G_FW_SCSI_ISCSI_RSP_OFLOW(x) \ - (((x) >> S_FW_SCSI_ISCSI_RSP_OFLOW) & M_FW_SCSI_ISCSI_RSP_OFLOW) -#define F_FW_SCSI_ISCSI_RSP_OFLOW V_FW_SCSI_ISCSI_RSP_OFLOW(1U) +#define S_FW_FCOE_ELS_CT_WR_IMMDLEN 0 +#define M_FW_FCOE_ELS_CT_WR_IMMDLEN 0xff +#define V_FW_FCOE_ELS_CT_WR_IMMDLEN(x) ((x) << S_FW_FCOE_ELS_CT_WR_IMMDLEN) +#define G_FW_FCOE_ELS_CT_WR_IMMDLEN(x) \ + (((x) >> S_FW_FCOE_ELS_CT_WR_IMMDLEN) & M_FW_FCOE_ELS_CT_WR_IMMDLEN) -#define S_FW_SCSI_ISCSI_RSP_UFLOW 1 -#define M_FW_SCSI_ISCSI_RSP_UFLOW 0x1 -#define V_FW_SCSI_ISCSI_RSP_UFLOW(x) ((x) << S_FW_SCSI_ISCSI_RSP_UFLOW) -#define G_FW_SCSI_ISCSI_RSP_UFLOW(x) \ - (((x) >> S_FW_SCSI_ISCSI_RSP_UFLOW) & M_FW_SCSI_ISCSI_RSP_UFLOW) -#define F_FW_SCSI_ISCSI_RSP_UFLOW V_FW_SCSI_ISCSI_RSP_UFLOW(1U) +#define S_FW_FCOE_ELS_CT_WR_FLOWID 8 +#define M_FW_FCOE_ELS_CT_WR_FLOWID 0xfffff +#define V_FW_FCOE_ELS_CT_WR_FLOWID(x) ((x) << S_FW_FCOE_ELS_CT_WR_FLOWID) +#define G_FW_FCOE_ELS_CT_WR_FLOWID(x) \ + (((x) >> S_FW_FCOE_ELS_CT_WR_FLOWID) & M_FW_FCOE_ELS_CT_WR_FLOWID) + +#define S_FW_FCOE_ELS_CT_WR_LEN16 0 +#define M_FW_FCOE_ELS_CT_WR_LEN16 0xff +#define V_FW_FCOE_ELS_CT_WR_LEN16(x) ((x) << S_FW_FCOE_ELS_CT_WR_LEN16) +#define G_FW_FCOE_ELS_CT_WR_LEN16(x) \ + (((x) >> S_FW_FCOE_ELS_CT_WR_LEN16) & M_FW_FCOE_ELS_CT_WR_LEN16) + +#define S_FW_FCOE_ELS_CT_WR_CP_EN 6 +#define M_FW_FCOE_ELS_CT_WR_CP_EN 0x3 +#define V_FW_FCOE_ELS_CT_WR_CP_EN(x) ((x) << S_FW_FCOE_ELS_CT_WR_CP_EN) +#define G_FW_FCOE_ELS_CT_WR_CP_EN(x) \ + (((x) >> S_FW_FCOE_ELS_CT_WR_CP_EN) & M_FW_FCOE_ELS_CT_WR_CP_EN) + +#define S_FW_FCOE_ELS_CT_WR_CLASS 4 +#define M_FW_FCOE_ELS_CT_WR_CLASS 0x3 +#define V_FW_FCOE_ELS_CT_WR_CLASS(x) ((x) << S_FW_FCOE_ELS_CT_WR_CLASS) +#define G_FW_FCOE_ELS_CT_WR_CLASS(x) \ + (((x) >> S_FW_FCOE_ELS_CT_WR_CLASS) & M_FW_FCOE_ELS_CT_WR_CLASS) + +#define S_FW_FCOE_ELS_CT_WR_FL 2 +#define M_FW_FCOE_ELS_CT_WR_FL 0x1 +#define V_FW_FCOE_ELS_CT_WR_FL(x) ((x) << S_FW_FCOE_ELS_CT_WR_FL) +#define G_FW_FCOE_ELS_CT_WR_FL(x) \ + (((x) >> S_FW_FCOE_ELS_CT_WR_FL) & M_FW_FCOE_ELS_CT_WR_FL) +#define F_FW_FCOE_ELS_CT_WR_FL V_FW_FCOE_ELS_CT_WR_FL(1U) + +#define S_FW_FCOE_ELS_CT_WR_NPIV 1 +#define M_FW_FCOE_ELS_CT_WR_NPIV 0x1 +#define V_FW_FCOE_ELS_CT_WR_NPIV(x) ((x) << S_FW_FCOE_ELS_CT_WR_NPIV) +#define G_FW_FCOE_ELS_CT_WR_NPIV(x) \ + (((x) >> S_FW_FCOE_ELS_CT_WR_NPIV) & M_FW_FCOE_ELS_CT_WR_NPIV) +#define F_FW_FCOE_ELS_CT_WR_NPIV V_FW_FCOE_ELS_CT_WR_NPIV(1U) + +#define S_FW_FCOE_ELS_CT_WR_SP 0 +#define M_FW_FCOE_ELS_CT_WR_SP 0x1 +#define V_FW_FCOE_ELS_CT_WR_SP(x) ((x) << S_FW_FCOE_ELS_CT_WR_SP) +#define G_FW_FCOE_ELS_CT_WR_SP(x) \ + (((x) >> S_FW_FCOE_ELS_CT_WR_SP) & M_FW_FCOE_ELS_CT_WR_SP) +#define F_FW_FCOE_ELS_CT_WR_SP V_FW_FCOE_ELS_CT_WR_SP(1U) + +/****************************************************************************** + * S C S I W O R K R E Q U E S T s (FOiSCSI and FCOE unified data path) + *****************************************************************************/ + +struct fw_scsi_write_wr { + __be32 op_immdlen; + __be32 flowid_len16; + __be64 cookie; + __be16 iqid; + __u8 tmo_val; + __u8 use_xfer_cnt; + union fw_scsi_write_priv { + struct fcoe_write_priv { + __u8 ctl_pri; + __u8 cp_en_class; + __u8 r3_lo[2]; + } fcoe; + struct iscsi_write_priv { + __u8 r3[4]; + } iscsi; + } u; + __be32 xfer_cnt; + __be32 ini_xfer_cnt; + __be64 rsp_dmaaddr; + __be32 rsp_dmalen; + __be32 r4; +}; + +#define S_FW_SCSI_WRITE_WR_OPCODE 24 +#define M_FW_SCSI_WRITE_WR_OPCODE 0xff +#define V_FW_SCSI_WRITE_WR_OPCODE(x) ((x) << S_FW_SCSI_WRITE_WR_OPCODE) +#define G_FW_SCSI_WRITE_WR_OPCODE(x) \ + (((x) >> S_FW_SCSI_WRITE_WR_OPCODE) & M_FW_SCSI_WRITE_WR_OPCODE) + +#define S_FW_SCSI_WRITE_WR_IMMDLEN 0 +#define M_FW_SCSI_WRITE_WR_IMMDLEN 0xff +#define V_FW_SCSI_WRITE_WR_IMMDLEN(x) ((x) << S_FW_SCSI_WRITE_WR_IMMDLEN) +#define G_FW_SCSI_WRITE_WR_IMMDLEN(x) \ + (((x) >> S_FW_SCSI_WRITE_WR_IMMDLEN) & M_FW_SCSI_WRITE_WR_IMMDLEN) + +#define S_FW_SCSI_WRITE_WR_FLOWID 8 +#define M_FW_SCSI_WRITE_WR_FLOWID 0xfffff +#define V_FW_SCSI_WRITE_WR_FLOWID(x) ((x) << S_FW_SCSI_WRITE_WR_FLOWID) +#define G_FW_SCSI_WRITE_WR_FLOWID(x) \ + (((x) >> S_FW_SCSI_WRITE_WR_FLOWID) & M_FW_SCSI_WRITE_WR_FLOWID) + +#define S_FW_SCSI_WRITE_WR_LEN16 0 +#define M_FW_SCSI_WRITE_WR_LEN16 0xff +#define V_FW_SCSI_WRITE_WR_LEN16(x) ((x) << S_FW_SCSI_WRITE_WR_LEN16) +#define G_FW_SCSI_WRITE_WR_LEN16(x) \ + (((x) >> S_FW_SCSI_WRITE_WR_LEN16) & M_FW_SCSI_WRITE_WR_LEN16) + +#define S_FW_SCSI_WRITE_WR_CP_EN 6 +#define M_FW_SCSI_WRITE_WR_CP_EN 0x3 +#define V_FW_SCSI_WRITE_WR_CP_EN(x) ((x) << S_FW_SCSI_WRITE_WR_CP_EN) +#define G_FW_SCSI_WRITE_WR_CP_EN(x) \ + (((x) >> S_FW_SCSI_WRITE_WR_CP_EN) & M_FW_SCSI_WRITE_WR_CP_EN) + +#define S_FW_SCSI_WRITE_WR_CLASS 4 +#define M_FW_SCSI_WRITE_WR_CLASS 0x3 +#define V_FW_SCSI_WRITE_WR_CLASS(x) ((x) << S_FW_SCSI_WRITE_WR_CLASS) +#define G_FW_SCSI_WRITE_WR_CLASS(x) \ + (((x) >> S_FW_SCSI_WRITE_WR_CLASS) & M_FW_SCSI_WRITE_WR_CLASS) + +struct fw_scsi_read_wr { + __be32 op_immdlen; + __be32 flowid_len16; + __be64 cookie; + __be16 iqid; + __u8 tmo_val; + __u8 use_xfer_cnt; + union fw_scsi_read_priv { + struct fcoe_read_priv { + __u8 ctl_pri; + __u8 cp_en_class; + __u8 r3_lo[2]; + } fcoe; + struct iscsi_read_priv { + __u8 r3[4]; + } iscsi; + } u; + __be32 xfer_cnt; + __be32 ini_xfer_cnt; + __be64 rsp_dmaaddr; + __be32 rsp_dmalen; + __be32 r4; +}; + +#define S_FW_SCSI_READ_WR_OPCODE 24 +#define M_FW_SCSI_READ_WR_OPCODE 0xff +#define V_FW_SCSI_READ_WR_OPCODE(x) ((x) << S_FW_SCSI_READ_WR_OPCODE) +#define G_FW_SCSI_READ_WR_OPCODE(x) \ + (((x) >> S_FW_SCSI_READ_WR_OPCODE) & M_FW_SCSI_READ_WR_OPCODE) + +#define S_FW_SCSI_READ_WR_IMMDLEN 0 +#define M_FW_SCSI_READ_WR_IMMDLEN 0xff +#define V_FW_SCSI_READ_WR_IMMDLEN(x) ((x) << S_FW_SCSI_READ_WR_IMMDLEN) +#define G_FW_SCSI_READ_WR_IMMDLEN(x) \ + (((x) >> S_FW_SCSI_READ_WR_IMMDLEN) & M_FW_SCSI_READ_WR_IMMDLEN) + +#define S_FW_SCSI_READ_WR_FLOWID 8 +#define M_FW_SCSI_READ_WR_FLOWID 0xfffff +#define V_FW_SCSI_READ_WR_FLOWID(x) ((x) << S_FW_SCSI_READ_WR_FLOWID) +#define G_FW_SCSI_READ_WR_FLOWID(x) \ + (((x) >> S_FW_SCSI_READ_WR_FLOWID) & M_FW_SCSI_READ_WR_FLOWID) + +#define S_FW_SCSI_READ_WR_LEN16 0 +#define M_FW_SCSI_READ_WR_LEN16 0xff +#define V_FW_SCSI_READ_WR_LEN16(x) ((x) << S_FW_SCSI_READ_WR_LEN16) +#define G_FW_SCSI_READ_WR_LEN16(x) \ + (((x) >> S_FW_SCSI_READ_WR_LEN16) & M_FW_SCSI_READ_WR_LEN16) + +#define S_FW_SCSI_READ_WR_CP_EN 6 +#define M_FW_SCSI_READ_WR_CP_EN 0x3 +#define V_FW_SCSI_READ_WR_CP_EN(x) ((x) << S_FW_SCSI_READ_WR_CP_EN) +#define G_FW_SCSI_READ_WR_CP_EN(x) \ + (((x) >> S_FW_SCSI_READ_WR_CP_EN) & M_FW_SCSI_READ_WR_CP_EN) + +#define S_FW_SCSI_READ_WR_CLASS 4 +#define M_FW_SCSI_READ_WR_CLASS 0x3 +#define V_FW_SCSI_READ_WR_CLASS(x) ((x) << S_FW_SCSI_READ_WR_CLASS) +#define G_FW_SCSI_READ_WR_CLASS(x) \ + (((x) >> S_FW_SCSI_READ_WR_CLASS) & M_FW_SCSI_READ_WR_CLASS) + +struct fw_scsi_cmd_wr { + __be32 op_immdlen; + __be32 flowid_len16; + __be64 cookie; + __be16 iqid; + __u8 tmo_val; + __u8 r3; + union fw_scsi_cmd_priv { + struct fcoe_cmd_priv { + __u8 ctl_pri; + __u8 cp_en_class; + __u8 r4_lo[2]; + } fcoe; + struct iscsi_cmd_priv { + __u8 r4[4]; + } iscsi; + } u; + __u8 r5[8]; + __be64 rsp_dmaaddr; + __be32 rsp_dmalen; + __be32 r6; +}; + +#define S_FW_SCSI_CMD_WR_OPCODE 24 +#define M_FW_SCSI_CMD_WR_OPCODE 0xff +#define V_FW_SCSI_CMD_WR_OPCODE(x) ((x) << S_FW_SCSI_CMD_WR_OPCODE) +#define G_FW_SCSI_CMD_WR_OPCODE(x) \ + (((x) >> S_FW_SCSI_CMD_WR_OPCODE) & M_FW_SCSI_CMD_WR_OPCODE) + +#define S_FW_SCSI_CMD_WR_IMMDLEN 0 +#define M_FW_SCSI_CMD_WR_IMMDLEN 0xff +#define V_FW_SCSI_CMD_WR_IMMDLEN(x) ((x) << S_FW_SCSI_CMD_WR_IMMDLEN) +#define G_FW_SCSI_CMD_WR_IMMDLEN(x) \ + (((x) >> S_FW_SCSI_CMD_WR_IMMDLEN) & M_FW_SCSI_CMD_WR_IMMDLEN) + +#define S_FW_SCSI_CMD_WR_FLOWID 8 +#define M_FW_SCSI_CMD_WR_FLOWID 0xfffff +#define V_FW_SCSI_CMD_WR_FLOWID(x) ((x) << S_FW_SCSI_CMD_WR_FLOWID) +#define G_FW_SCSI_CMD_WR_FLOWID(x) \ + (((x) >> S_FW_SCSI_CMD_WR_FLOWID) & M_FW_SCSI_CMD_WR_FLOWID) + +#define S_FW_SCSI_CMD_WR_LEN16 0 +#define M_FW_SCSI_CMD_WR_LEN16 0xff +#define V_FW_SCSI_CMD_WR_LEN16(x) ((x) << S_FW_SCSI_CMD_WR_LEN16) +#define G_FW_SCSI_CMD_WR_LEN16(x) \ + (((x) >> S_FW_SCSI_CMD_WR_LEN16) & M_FW_SCSI_CMD_WR_LEN16) + +#define S_FW_SCSI_CMD_WR_CP_EN 6 +#define M_FW_SCSI_CMD_WR_CP_EN 0x3 +#define V_FW_SCSI_CMD_WR_CP_EN(x) ((x) << S_FW_SCSI_CMD_WR_CP_EN) +#define G_FW_SCSI_CMD_WR_CP_EN(x) \ + (((x) >> S_FW_SCSI_CMD_WR_CP_EN) & M_FW_SCSI_CMD_WR_CP_EN) + +#define S_FW_SCSI_CMD_WR_CLASS 4 +#define M_FW_SCSI_CMD_WR_CLASS 0x3 +#define V_FW_SCSI_CMD_WR_CLASS(x) ((x) << S_FW_SCSI_CMD_WR_CLASS) +#define G_FW_SCSI_CMD_WR_CLASS(x) \ + (((x) >> S_FW_SCSI_CMD_WR_CLASS) & M_FW_SCSI_CMD_WR_CLASS) + +struct fw_scsi_abrt_cls_wr { + __be32 op_immdlen; + __be32 flowid_len16; + __be64 cookie; + __be16 iqid; + __u8 tmo_val; + __u8 sub_opcode_to_chk_all_io; + __u8 r3[4]; + __be64 t_cookie; +}; + +#define S_FW_SCSI_ABRT_CLS_WR_OPCODE 24 +#define M_FW_SCSI_ABRT_CLS_WR_OPCODE 0xff +#define V_FW_SCSI_ABRT_CLS_WR_OPCODE(x) ((x) << S_FW_SCSI_ABRT_CLS_WR_OPCODE) +#define G_FW_SCSI_ABRT_CLS_WR_OPCODE(x) \ + (((x) >> S_FW_SCSI_ABRT_CLS_WR_OPCODE) & M_FW_SCSI_ABRT_CLS_WR_OPCODE) + +#define S_FW_SCSI_ABRT_CLS_WR_IMMDLEN 0 +#define M_FW_SCSI_ABRT_CLS_WR_IMMDLEN 0xff +#define V_FW_SCSI_ABRT_CLS_WR_IMMDLEN(x) \ + ((x) << S_FW_SCSI_ABRT_CLS_WR_IMMDLEN) +#define G_FW_SCSI_ABRT_CLS_WR_IMMDLEN(x) \ + (((x) >> S_FW_SCSI_ABRT_CLS_WR_IMMDLEN) & M_FW_SCSI_ABRT_CLS_WR_IMMDLEN) + +#define S_FW_SCSI_ABRT_CLS_WR_FLOWID 8 +#define M_FW_SCSI_ABRT_CLS_WR_FLOWID 0xfffff +#define V_FW_SCSI_ABRT_CLS_WR_FLOWID(x) ((x) << S_FW_SCSI_ABRT_CLS_WR_FLOWID) +#define G_FW_SCSI_ABRT_CLS_WR_FLOWID(x) \ + (((x) >> S_FW_SCSI_ABRT_CLS_WR_FLOWID) & M_FW_SCSI_ABRT_CLS_WR_FLOWID) + +#define S_FW_SCSI_ABRT_CLS_WR_LEN16 0 +#define M_FW_SCSI_ABRT_CLS_WR_LEN16 0xff +#define V_FW_SCSI_ABRT_CLS_WR_LEN16(x) ((x) << S_FW_SCSI_ABRT_CLS_WR_LEN16) +#define G_FW_SCSI_ABRT_CLS_WR_LEN16(x) \ + (((x) >> S_FW_SCSI_ABRT_CLS_WR_LEN16) & M_FW_SCSI_ABRT_CLS_WR_LEN16) + +#define S_FW_SCSI_ABRT_CLS_WR_SUB_OPCODE 2 +#define M_FW_SCSI_ABRT_CLS_WR_SUB_OPCODE 0x3f +#define V_FW_SCSI_ABRT_CLS_WR_SUB_OPCODE(x) \ + ((x) << S_FW_SCSI_ABRT_CLS_WR_SUB_OPCODE) +#define G_FW_SCSI_ABRT_CLS_WR_SUB_OPCODE(x) \ + (((x) >> S_FW_SCSI_ABRT_CLS_WR_SUB_OPCODE) & \ + M_FW_SCSI_ABRT_CLS_WR_SUB_OPCODE) + +#define S_FW_SCSI_ABRT_CLS_WR_UNSOL 1 +#define M_FW_SCSI_ABRT_CLS_WR_UNSOL 0x1 +#define V_FW_SCSI_ABRT_CLS_WR_UNSOL(x) ((x) << S_FW_SCSI_ABRT_CLS_WR_UNSOL) +#define G_FW_SCSI_ABRT_CLS_WR_UNSOL(x) \ + (((x) >> S_FW_SCSI_ABRT_CLS_WR_UNSOL) & M_FW_SCSI_ABRT_CLS_WR_UNSOL) +#define F_FW_SCSI_ABRT_CLS_WR_UNSOL V_FW_SCSI_ABRT_CLS_WR_UNSOL(1U) + +#define S_FW_SCSI_ABRT_CLS_WR_CHK_ALL_IO 0 +#define M_FW_SCSI_ABRT_CLS_WR_CHK_ALL_IO 0x1 +#define V_FW_SCSI_ABRT_CLS_WR_CHK_ALL_IO(x) \ + ((x) << S_FW_SCSI_ABRT_CLS_WR_CHK_ALL_IO) +#define G_FW_SCSI_ABRT_CLS_WR_CHK_ALL_IO(x) \ + (((x) >> S_FW_SCSI_ABRT_CLS_WR_CHK_ALL_IO) & \ + M_FW_SCSI_ABRT_CLS_WR_CHK_ALL_IO) +#define F_FW_SCSI_ABRT_CLS_WR_CHK_ALL_IO \ + V_FW_SCSI_ABRT_CLS_WR_CHK_ALL_IO(1U) + +struct fw_scsi_tgt_acc_wr { + __be32 op_immdlen; + __be32 flowid_len16; + __be64 cookie; + __be16 iqid; + __u8 r3; + __u8 use_burst_len; + union fw_scsi_tgt_acc_priv { + struct fcoe_tgt_acc_priv { + __u8 ctl_pri; + __u8 cp_en_class; + __u8 r4_lo[2]; + } fcoe; + struct iscsi_tgt_acc_priv { + __u8 r4[4]; + } iscsi; + } u; + __be32 burst_len; + __be32 rel_off; + __be64 r5; + __be32 r6; + __be32 tot_xfer_len; +}; + +#define S_FW_SCSI_TGT_ACC_WR_OPCODE 24 +#define M_FW_SCSI_TGT_ACC_WR_OPCODE 0xff +#define V_FW_SCSI_TGT_ACC_WR_OPCODE(x) ((x) << S_FW_SCSI_TGT_ACC_WR_OPCODE) +#define G_FW_SCSI_TGT_ACC_WR_OPCODE(x) \ + (((x) >> S_FW_SCSI_TGT_ACC_WR_OPCODE) & M_FW_SCSI_TGT_ACC_WR_OPCODE) + +#define S_FW_SCSI_TGT_ACC_WR_IMMDLEN 0 +#define M_FW_SCSI_TGT_ACC_WR_IMMDLEN 0xff +#define V_FW_SCSI_TGT_ACC_WR_IMMDLEN(x) ((x) << S_FW_SCSI_TGT_ACC_WR_IMMDLEN) +#define G_FW_SCSI_TGT_ACC_WR_IMMDLEN(x) \ + (((x) >> S_FW_SCSI_TGT_ACC_WR_IMMDLEN) & M_FW_SCSI_TGT_ACC_WR_IMMDLEN) + +#define S_FW_SCSI_TGT_ACC_WR_FLOWID 8 +#define M_FW_SCSI_TGT_ACC_WR_FLOWID 0xfffff +#define V_FW_SCSI_TGT_ACC_WR_FLOWID(x) ((x) << S_FW_SCSI_TGT_ACC_WR_FLOWID) +#define G_FW_SCSI_TGT_ACC_WR_FLOWID(x) \ + (((x) >> S_FW_SCSI_TGT_ACC_WR_FLOWID) & M_FW_SCSI_TGT_ACC_WR_FLOWID) + +#define S_FW_SCSI_TGT_ACC_WR_LEN16 0 +#define M_FW_SCSI_TGT_ACC_WR_LEN16 0xff +#define V_FW_SCSI_TGT_ACC_WR_LEN16(x) ((x) << S_FW_SCSI_TGT_ACC_WR_LEN16) +#define G_FW_SCSI_TGT_ACC_WR_LEN16(x) \ + (((x) >> S_FW_SCSI_TGT_ACC_WR_LEN16) & M_FW_SCSI_TGT_ACC_WR_LEN16) + +#define S_FW_SCSI_TGT_ACC_WR_CP_EN 6 +#define M_FW_SCSI_TGT_ACC_WR_CP_EN 0x3 +#define V_FW_SCSI_TGT_ACC_WR_CP_EN(x) ((x) << S_FW_SCSI_TGT_ACC_WR_CP_EN) +#define G_FW_SCSI_TGT_ACC_WR_CP_EN(x) \ + (((x) >> S_FW_SCSI_TGT_ACC_WR_CP_EN) & M_FW_SCSI_TGT_ACC_WR_CP_EN) + +#define S_FW_SCSI_TGT_ACC_WR_CLASS 4 +#define M_FW_SCSI_TGT_ACC_WR_CLASS 0x3 +#define V_FW_SCSI_TGT_ACC_WR_CLASS(x) ((x) << S_FW_SCSI_TGT_ACC_WR_CLASS) +#define G_FW_SCSI_TGT_ACC_WR_CLASS(x) \ + (((x) >> S_FW_SCSI_TGT_ACC_WR_CLASS) & M_FW_SCSI_TGT_ACC_WR_CLASS) + +struct fw_scsi_tgt_xmit_wr { + __be32 op_immdlen; + __be32 flowid_len16; + __be64 cookie; + __be16 iqid; + __u8 auto_rsp; + __u8 use_xfer_cnt; + union fw_scsi_tgt_xmit_priv { + struct fcoe_tgt_xmit_priv { + __u8 ctl_pri; + __u8 cp_en_class; + __u8 r3_lo[2]; + } fcoe; + struct iscsi_tgt_xmit_priv { + __u8 r3[4]; + } iscsi; + } u; + __be32 xfer_cnt; + __be32 r4; + __be64 r5; + __be32 r6; + __be32 tot_xfer_len; +}; + +#define S_FW_SCSI_TGT_XMIT_WR_OPCODE 24 +#define M_FW_SCSI_TGT_XMIT_WR_OPCODE 0xff +#define V_FW_SCSI_TGT_XMIT_WR_OPCODE(x) ((x) << S_FW_SCSI_TGT_XMIT_WR_OPCODE) +#define G_FW_SCSI_TGT_XMIT_WR_OPCODE(x) \ + (((x) >> S_FW_SCSI_TGT_XMIT_WR_OPCODE) & M_FW_SCSI_TGT_XMIT_WR_OPCODE) + +#define S_FW_SCSI_TGT_XMIT_WR_IMMDLEN 0 +#define M_FW_SCSI_TGT_XMIT_WR_IMMDLEN 0xff +#define V_FW_SCSI_TGT_XMIT_WR_IMMDLEN(x) \ + ((x) << S_FW_SCSI_TGT_XMIT_WR_IMMDLEN) +#define G_FW_SCSI_TGT_XMIT_WR_IMMDLEN(x) \ + (((x) >> S_FW_SCSI_TGT_XMIT_WR_IMMDLEN) & M_FW_SCSI_TGT_XMIT_WR_IMMDLEN) + +#define S_FW_SCSI_TGT_XMIT_WR_FLOWID 8 +#define M_FW_SCSI_TGT_XMIT_WR_FLOWID 0xfffff +#define V_FW_SCSI_TGT_XMIT_WR_FLOWID(x) ((x) << S_FW_SCSI_TGT_XMIT_WR_FLOWID) +#define G_FW_SCSI_TGT_XMIT_WR_FLOWID(x) \ + (((x) >> S_FW_SCSI_TGT_XMIT_WR_FLOWID) & M_FW_SCSI_TGT_XMIT_WR_FLOWID) + +#define S_FW_SCSI_TGT_XMIT_WR_LEN16 0 +#define M_FW_SCSI_TGT_XMIT_WR_LEN16 0xff +#define V_FW_SCSI_TGT_XMIT_WR_LEN16(x) ((x) << S_FW_SCSI_TGT_XMIT_WR_LEN16) +#define G_FW_SCSI_TGT_XMIT_WR_LEN16(x) \ + (((x) >> S_FW_SCSI_TGT_XMIT_WR_LEN16) & M_FW_SCSI_TGT_XMIT_WR_LEN16) + +#define S_FW_SCSI_TGT_XMIT_WR_CP_EN 6 +#define M_FW_SCSI_TGT_XMIT_WR_CP_EN 0x3 +#define V_FW_SCSI_TGT_XMIT_WR_CP_EN(x) ((x) << S_FW_SCSI_TGT_XMIT_WR_CP_EN) +#define G_FW_SCSI_TGT_XMIT_WR_CP_EN(x) \ + (((x) >> S_FW_SCSI_TGT_XMIT_WR_CP_EN) & M_FW_SCSI_TGT_XMIT_WR_CP_EN) + +#define S_FW_SCSI_TGT_XMIT_WR_CLASS 4 +#define M_FW_SCSI_TGT_XMIT_WR_CLASS 0x3 +#define V_FW_SCSI_TGT_XMIT_WR_CLASS(x) ((x) << S_FW_SCSI_TGT_XMIT_WR_CLASS) +#define G_FW_SCSI_TGT_XMIT_WR_CLASS(x) \ + (((x) >> S_FW_SCSI_TGT_XMIT_WR_CLASS) & M_FW_SCSI_TGT_XMIT_WR_CLASS) + +struct fw_scsi_tgt_rsp_wr { + __be32 op_immdlen; + __be32 flowid_len16; + __be64 cookie; + __be16 iqid; + __u8 r3[2]; + union fw_scsi_tgt_rsp_priv { + struct fcoe_tgt_rsp_priv { + __u8 ctl_pri; + __u8 cp_en_class; + __u8 r4_lo[2]; + } fcoe; + struct iscsi_tgt_rsp_priv { + __u8 r4[4]; + } iscsi; + } u; + __u8 r5[8]; +}; + +#define S_FW_SCSI_TGT_RSP_WR_OPCODE 24 +#define M_FW_SCSI_TGT_RSP_WR_OPCODE 0xff +#define V_FW_SCSI_TGT_RSP_WR_OPCODE(x) ((x) << S_FW_SCSI_TGT_RSP_WR_OPCODE) +#define G_FW_SCSI_TGT_RSP_WR_OPCODE(x) \ + (((x) >> S_FW_SCSI_TGT_RSP_WR_OPCODE) & M_FW_SCSI_TGT_RSP_WR_OPCODE) + +#define S_FW_SCSI_TGT_RSP_WR_IMMDLEN 0 +#define M_FW_SCSI_TGT_RSP_WR_IMMDLEN 0xff +#define V_FW_SCSI_TGT_RSP_WR_IMMDLEN(x) ((x) << S_FW_SCSI_TGT_RSP_WR_IMMDLEN) +#define G_FW_SCSI_TGT_RSP_WR_IMMDLEN(x) \ + (((x) >> S_FW_SCSI_TGT_RSP_WR_IMMDLEN) & M_FW_SCSI_TGT_RSP_WR_IMMDLEN) + +#define S_FW_SCSI_TGT_RSP_WR_FLOWID 8 +#define M_FW_SCSI_TGT_RSP_WR_FLOWID 0xfffff +#define V_FW_SCSI_TGT_RSP_WR_FLOWID(x) ((x) << S_FW_SCSI_TGT_RSP_WR_FLOWID) +#define G_FW_SCSI_TGT_RSP_WR_FLOWID(x) \ + (((x) >> S_FW_SCSI_TGT_RSP_WR_FLOWID) & M_FW_SCSI_TGT_RSP_WR_FLOWID) + +#define S_FW_SCSI_TGT_RSP_WR_LEN16 0 +#define M_FW_SCSI_TGT_RSP_WR_LEN16 0xff +#define V_FW_SCSI_TGT_RSP_WR_LEN16(x) ((x) << S_FW_SCSI_TGT_RSP_WR_LEN16) +#define G_FW_SCSI_TGT_RSP_WR_LEN16(x) \ + (((x) >> S_FW_SCSI_TGT_RSP_WR_LEN16) & M_FW_SCSI_TGT_RSP_WR_LEN16) + +#define S_FW_SCSI_TGT_RSP_WR_CP_EN 6 +#define M_FW_SCSI_TGT_RSP_WR_CP_EN 0x3 +#define V_FW_SCSI_TGT_RSP_WR_CP_EN(x) ((x) << S_FW_SCSI_TGT_RSP_WR_CP_EN) +#define G_FW_SCSI_TGT_RSP_WR_CP_EN(x) \ + (((x) >> S_FW_SCSI_TGT_RSP_WR_CP_EN) & M_FW_SCSI_TGT_RSP_WR_CP_EN) + +#define S_FW_SCSI_TGT_RSP_WR_CLASS 4 +#define M_FW_SCSI_TGT_RSP_WR_CLASS 0x3 +#define V_FW_SCSI_TGT_RSP_WR_CLASS(x) ((x) << S_FW_SCSI_TGT_RSP_WR_CLASS) +#define G_FW_SCSI_TGT_RSP_WR_CLASS(x) \ + (((x) >> S_FW_SCSI_TGT_RSP_WR_CLASS) & M_FW_SCSI_TGT_RSP_WR_CLASS) /****************************************************************************** * C O M M A N D s @@ -1808,9 +2834,15 @@ enum fw_cmd_opcodes { FW_RSS_VI_CONFIG_CMD = 0x23, FW_SCHED_CMD = 0x24, FW_DEVLOG_CMD = 0x25, - FW_NETIF_CMD = 0x26, FW_WATCHDOG_CMD = 0x27, FW_CLIP_CMD = 0x28, + FW_CHNET_IFACE_CMD = 0x26, + FW_FCOE_RES_INFO_CMD = 0x31, + FW_FCOE_LINK_CMD = 0x32, + FW_FCOE_VNP_CMD = 0x33, + FW_FCOE_SPARAMS_CMD = 0x35, + FW_FCOE_STATS_CMD = 0x37, + FW_FCOE_FCF_CMD = 0x38, FW_LASTC2E_CMD = 0x40, FW_ERROR_CMD = 0x80, FW_DEBUG_CMD = 0x81, @@ -1896,6 +2928,7 @@ enum fw_ldst_addrspc { FW_LDST_ADDRSPC_FUNC = 0x0028, FW_LDST_ADDRSPC_FUNC_PCIE = 0x0029, FW_LDST_ADDRSPC_FUNC_I2C = 0x002A, + FW_LDST_ADDRSPC_LE = 0x0030, }; /* @@ -1982,6 +3015,11 @@ struct fw_ldst_cmd { __u8 data; __be32 r9; } i2c; + struct fw_ldst_le { + __be16 region; + __be16 nval; + __u32 val[12]; + } le; } u; }; @@ -2291,6 +3329,7 @@ enum fw_memtype_cf { FW_MEMTYPE_CF_EDC1 = 0x1, FW_MEMTYPE_CF_EXTMEM = 0x2, FW_MEMTYPE_CF_FLASH = 0x4, + FW_MEMTYPE_CF_INTERNAL = 0x5, }; struct fw_caps_config_cmd { @@ -2409,7 +3448,11 @@ enum fw_params_param_pfvf { FW_PARAMS_PARAM_PFVF_IQFLINT_START = 0x29, FW_PARAMS_PARAM_PFVF_IQFLINT_END = 0x2A, FW_PARAMS_PARAM_PFVF_EQ_START = 0x2B, - FW_PARAMS_PARAM_PFVF_EQ_END = 0x2C + FW_PARAMS_PARAM_PFVF_EQ_END = 0x2C, + FW_PARAMS_PARAM_PFVF_ACTIVE_FILTER_START = 0x2D, + FW_PARAMS_PARAM_PFVF_ACTIVE_FILTER_END = 0x2E, + FW_PARAMS_PARAM_PFVF_ETHOFLD_START = 0x2F, + FW_PARAMS_PARAM_PFVF_ETHOFLD_END = 0x30 }; /* @@ -2421,6 +3464,7 @@ enum fw_params_param_dmaq { FW_PARAMS_PARAM_DMAQ_EQ_CMPLIQID_MNGT = 0x10, FW_PARAMS_PARAM_DMAQ_EQ_CMPLIQID_CTRL = 0x11, FW_PARAMS_PARAM_DMAQ_EQ_SCHEDCLASS_ETH = 0x12, + FW_PARAMS_PARAM_DMAQ_EQ_DCBPRIO_ETH = 0x13 }; /* @@ -3954,7 +4998,6 @@ struct fw_vi_cmd { #define FW_VI_MAC_ADD_MAC 0x3FF #define FW_VI_MAC_ADD_PERSIST_MAC 0x3FE #define FW_VI_MAC_MAC_BASED_FREE 0x3FD -#define FW_CLS_TCAM_NUM_ENTRIES 336 enum fw_vi_mac_smac { FW_VI_MAC_MPS_TCAM_ENTRY, @@ -5662,110 +6705,6 @@ struct fw_devlog_cmd { (((x) >> S_FW_DEVLOG_CMD_MEMADDR16_DEVLOG) & \ M_FW_DEVLOG_CMD_MEMADDR16_DEVLOG) -struct fw_netif_cmd { - __be32 op_to_ipv4gw; - __be32 retval_len16; - __be32 netifi_ifadridx; - __be32 portid_to_mtuval; - __be32 gwaddr; - __be32 addr; - __be32 nmask; - __be32 bcaddr; -}; - -#define S_FW_NETIF_CMD_ADD 20 -#define M_FW_NETIF_CMD_ADD 0x1 -#define V_FW_NETIF_CMD_ADD(x) ((x) << S_FW_NETIF_CMD_ADD) -#define G_FW_NETIF_CMD_ADD(x) \ - (((x) >> S_FW_NETIF_CMD_ADD) & M_FW_NETIF_CMD_ADD) -#define F_FW_NETIF_CMD_ADD V_FW_NETIF_CMD_ADD(1U) - -#define S_FW_NETIF_CMD_LINK 19 -#define M_FW_NETIF_CMD_LINK 0x1 -#define V_FW_NETIF_CMD_LINK(x) ((x) << S_FW_NETIF_CMD_LINK) -#define G_FW_NETIF_CMD_LINK(x) \ - (((x) >> S_FW_NETIF_CMD_LINK) & M_FW_NETIF_CMD_LINK) -#define F_FW_NETIF_CMD_LINK V_FW_NETIF_CMD_LINK(1U) - -#define S_FW_NETIF_CMD_VLAN 18 -#define M_FW_NETIF_CMD_VLAN 0x1 -#define V_FW_NETIF_CMD_VLAN(x) ((x) << S_FW_NETIF_CMD_VLAN) -#define G_FW_NETIF_CMD_VLAN(x) \ - (((x) >> S_FW_NETIF_CMD_VLAN) & M_FW_NETIF_CMD_VLAN) -#define F_FW_NETIF_CMD_VLAN V_FW_NETIF_CMD_VLAN(1U) - -#define S_FW_NETIF_CMD_MTU 17 -#define M_FW_NETIF_CMD_MTU 0x1 -#define V_FW_NETIF_CMD_MTU(x) ((x) << S_FW_NETIF_CMD_MTU) -#define G_FW_NETIF_CMD_MTU(x) \ - (((x) >> S_FW_NETIF_CMD_MTU) & M_FW_NETIF_CMD_MTU) -#define F_FW_NETIF_CMD_MTU V_FW_NETIF_CMD_MTU(1U) - -#define S_FW_NETIF_CMD_DHCP 16 -#define M_FW_NETIF_CMD_DHCP 0x1 -#define V_FW_NETIF_CMD_DHCP(x) ((x) << S_FW_NETIF_CMD_DHCP) -#define G_FW_NETIF_CMD_DHCP(x) \ - (((x) >> S_FW_NETIF_CMD_DHCP) & M_FW_NETIF_CMD_DHCP) -#define F_FW_NETIF_CMD_DHCP V_FW_NETIF_CMD_DHCP(1U) - -#define S_FW_NETIF_CMD_IPV4BCADDR 15 -#define M_FW_NETIF_CMD_IPV4BCADDR 0x1 -#define V_FW_NETIF_CMD_IPV4BCADDR(x) ((x) << S_FW_NETIF_CMD_IPV4BCADDR) -#define G_FW_NETIF_CMD_IPV4BCADDR(x) \ - (((x) >> S_FW_NETIF_CMD_IPV4BCADDR) & M_FW_NETIF_CMD_IPV4BCADDR) -#define F_FW_NETIF_CMD_IPV4BCADDR V_FW_NETIF_CMD_IPV4BCADDR(1U) - -#define S_FW_NETIF_CMD_IPV4NMASK 14 -#define M_FW_NETIF_CMD_IPV4NMASK 0x1 -#define V_FW_NETIF_CMD_IPV4NMASK(x) ((x) << S_FW_NETIF_CMD_IPV4NMASK) -#define G_FW_NETIF_CMD_IPV4NMASK(x) \ - (((x) >> S_FW_NETIF_CMD_IPV4NMASK) & M_FW_NETIF_CMD_IPV4NMASK) -#define F_FW_NETIF_CMD_IPV4NMASK V_FW_NETIF_CMD_IPV4NMASK(1U) - -#define S_FW_NETIF_CMD_IPV4ADDR 13 -#define M_FW_NETIF_CMD_IPV4ADDR 0x1 -#define V_FW_NETIF_CMD_IPV4ADDR(x) ((x) << S_FW_NETIF_CMD_IPV4ADDR) -#define G_FW_NETIF_CMD_IPV4ADDR(x) \ - (((x) >> S_FW_NETIF_CMD_IPV4ADDR) & M_FW_NETIF_CMD_IPV4ADDR) -#define F_FW_NETIF_CMD_IPV4ADDR V_FW_NETIF_CMD_IPV4ADDR(1U) - -#define S_FW_NETIF_CMD_IPV4GW 12 -#define M_FW_NETIF_CMD_IPV4GW 0x1 -#define V_FW_NETIF_CMD_IPV4GW(x) ((x) << S_FW_NETIF_CMD_IPV4GW) -#define G_FW_NETIF_CMD_IPV4GW(x) \ - (((x) >> S_FW_NETIF_CMD_IPV4GW) & M_FW_NETIF_CMD_IPV4GW) -#define F_FW_NETIF_CMD_IPV4GW V_FW_NETIF_CMD_IPV4GW(1U) - -#define S_FW_NETIF_CMD_NETIFI 8 -#define M_FW_NETIF_CMD_NETIFI 0xffffff -#define V_FW_NETIF_CMD_NETIFI(x) ((x) << S_FW_NETIF_CMD_NETIFI) -#define G_FW_NETIF_CMD_NETIFI(x) \ - (((x) >> S_FW_NETIF_CMD_NETIFI) & M_FW_NETIF_CMD_NETIFI) - -#define S_FW_NETIF_CMD_IFADRIDX 0 -#define M_FW_NETIF_CMD_IFADRIDX 0xff -#define V_FW_NETIF_CMD_IFADRIDX(x) ((x) << S_FW_NETIF_CMD_IFADRIDX) -#define G_FW_NETIF_CMD_IFADRIDX(x) \ - (((x) >> S_FW_NETIF_CMD_IFADRIDX) & M_FW_NETIF_CMD_IFADRIDX) - -#define S_FW_NETIF_CMD_PORTID 28 -#define M_FW_NETIF_CMD_PORTID 0xf -#define V_FW_NETIF_CMD_PORTID(x) ((x) << S_FW_NETIF_CMD_PORTID) -#define G_FW_NETIF_CMD_PORTID(x) \ - (((x) >> S_FW_NETIF_CMD_PORTID) & M_FW_NETIF_CMD_PORTID) - -#define S_FW_NETIF_CMD_VLANID 16 -#define M_FW_NETIF_CMD_VLANID 0xfff -#define V_FW_NETIF_CMD_VLANID(x) ((x) << S_FW_NETIF_CMD_VLANID) -#define G_FW_NETIF_CMD_VLANID(x) \ - (((x) >> S_FW_NETIF_CMD_VLANID) & M_FW_NETIF_CMD_VLANID) - -#define S_FW_NETIF_CMD_MTUVAL 0 -#define M_FW_NETIF_CMD_MTUVAL 0xffff -#define V_FW_NETIF_CMD_MTUVAL(x) ((x) << S_FW_NETIF_CMD_MTUVAL) -#define G_FW_NETIF_CMD_MTUVAL(x) \ - (((x) >> S_FW_NETIF_CMD_MTUVAL) & M_FW_NETIF_CMD_MTUVAL) - enum fw_watchdog_actions { FW_WATCHDOG_ACTION_FLR = 0x1, FW_WATCHDOG_ACTION_BYPASS = 0x2, @@ -5802,6 +6741,421 @@ struct fw_clip_cmd { (((x) >> S_FW_CLIP_CMD_FREE) & M_FW_CLIP_CMD_FREE) #define F_FW_CLIP_CMD_FREE V_FW_CLIP_CMD_FREE(1U) +/****************************************************************************** + * F O i S C S I C O M M A N D s + **************************************/ + +#define FW_CHNET_IFACE_ADDR_MAX 3 + +enum fw_chnet_iface_cmd_subop { + FW_CHNET_IFACE_CMD_SUBOP_NOOP = 0, + + FW_CHNET_IFACE_CMD_SUBOP_LINK_UP, + FW_CHNET_IFACE_CMD_SUBOP_LINK_DOWN, + + FW_CHNET_IFACE_CMD_SUBOP_MTU_SET, + FW_CHNET_IFACE_CMD_SUBOP_MTU_GET, + + FW_CHNET_IFACE_CMD_SUBOP_MAX, +}; + +struct fw_chnet_iface_cmd { + __be32 op_to_portid; + __be32 retval_len16; + __u8 subop; + __u8 r2[3]; + __be32 ifid_ifstate; + __be16 mtu; + __be16 vlanid; + __be32 r3; + __be16 r4; + __u8 mac[6]; +}; + +#define S_FW_CHNET_IFACE_CMD_PORTID 0 +#define M_FW_CHNET_IFACE_CMD_PORTID 0xf +#define V_FW_CHNET_IFACE_CMD_PORTID(x) ((x) << S_FW_CHNET_IFACE_CMD_PORTID) +#define G_FW_CHNET_IFACE_CMD_PORTID(x) \ + (((x) >> S_FW_CHNET_IFACE_CMD_PORTID) & M_FW_CHNET_IFACE_CMD_PORTID) + +#define S_FW_CHNET_IFACE_CMD_IFID 8 +#define M_FW_CHNET_IFACE_CMD_IFID 0xffffff +#define V_FW_CHNET_IFACE_CMD_IFID(x) ((x) << S_FW_CHNET_IFACE_CMD_IFID) +#define G_FW_CHNET_IFACE_CMD_IFID(x) \ + (((x) >> S_FW_CHNET_IFACE_CMD_IFID) & M_FW_CHNET_IFACE_CMD_IFID) + +#define S_FW_CHNET_IFACE_CMD_IFSTATE 0 +#define M_FW_CHNET_IFACE_CMD_IFSTATE 0xff +#define V_FW_CHNET_IFACE_CMD_IFSTATE(x) ((x) << S_FW_CHNET_IFACE_CMD_IFSTATE) +#define G_FW_CHNET_IFACE_CMD_IFSTATE(x) \ + (((x) >> S_FW_CHNET_IFACE_CMD_IFSTATE) & M_FW_CHNET_IFACE_CMD_IFSTATE) + +/****************************************************************************** + * F O F C O E C O M M A N D s + ************************************/ + +struct fw_fcoe_res_info_cmd { + __be32 op_to_read; + __be32 retval_len16; + __be16 e_d_tov; + __be16 r_a_tov_seq; + __be16 r_a_tov_els; + __be16 r_r_tov; + __be32 max_xchgs; + __be32 max_ssns; + __be32 used_xchgs; + __be32 used_ssns; + __be32 max_fcfs; + __be32 max_vnps; + __be32 used_fcfs; + __be32 used_vnps; +}; + +struct fw_fcoe_link_cmd { + __be32 op_to_portid; + __be32 retval_len16; + __be32 sub_opcode_fcfi; + __u8 r3; + __u8 lstatus; + __be16 flags; + __u8 r4; + __u8 set_vlan; + __be16 vlan_id; + __be32 vnpi_pkd; + __be16 r6; + __u8 phy_mac[6]; + __u8 vnport_wwnn[8]; + __u8 vnport_wwpn[8]; +}; + +#define S_FW_FCOE_LINK_CMD_PORTID 0 +#define M_FW_FCOE_LINK_CMD_PORTID 0xf +#define V_FW_FCOE_LINK_CMD_PORTID(x) ((x) << S_FW_FCOE_LINK_CMD_PORTID) +#define G_FW_FCOE_LINK_CMD_PORTID(x) \ + (((x) >> S_FW_FCOE_LINK_CMD_PORTID) & M_FW_FCOE_LINK_CMD_PORTID) + +#define S_FW_FCOE_LINK_CMD_SUB_OPCODE 24 +#define M_FW_FCOE_LINK_CMD_SUB_OPCODE 0xff +#define V_FW_FCOE_LINK_CMD_SUB_OPCODE(x) \ + ((x) << S_FW_FCOE_LINK_CMD_SUB_OPCODE) +#define G_FW_FCOE_LINK_CMD_SUB_OPCODE(x) \ + (((x) >> S_FW_FCOE_LINK_CMD_SUB_OPCODE) & M_FW_FCOE_LINK_CMD_SUB_OPCODE) + +#define S_FW_FCOE_LINK_CMD_FCFI 0 +#define M_FW_FCOE_LINK_CMD_FCFI 0xffffff +#define V_FW_FCOE_LINK_CMD_FCFI(x) ((x) << S_FW_FCOE_LINK_CMD_FCFI) +#define G_FW_FCOE_LINK_CMD_FCFI(x) \ + (((x) >> S_FW_FCOE_LINK_CMD_FCFI) & M_FW_FCOE_LINK_CMD_FCFI) + +#define S_FW_FCOE_LINK_CMD_VNPI 0 +#define M_FW_FCOE_LINK_CMD_VNPI 0xfffff +#define V_FW_FCOE_LINK_CMD_VNPI(x) ((x) << S_FW_FCOE_LINK_CMD_VNPI) +#define G_FW_FCOE_LINK_CMD_VNPI(x) \ + (((x) >> S_FW_FCOE_LINK_CMD_VNPI) & M_FW_FCOE_LINK_CMD_VNPI) + +struct fw_fcoe_vnp_cmd { + __be32 op_to_fcfi; + __be32 alloc_to_len16; + __be32 gen_wwn_to_vnpi; + __be32 vf_id; + __be16 iqid; + __u8 vnport_mac[6]; + __u8 vnport_wwnn[8]; + __u8 vnport_wwpn[8]; + __u8 cmn_srv_parms[16]; + __u8 clsp_word_0_1[8]; +}; + +#define S_FW_FCOE_VNP_CMD_FCFI 0 +#define M_FW_FCOE_VNP_CMD_FCFI 0xfffff +#define V_FW_FCOE_VNP_CMD_FCFI(x) ((x) << S_FW_FCOE_VNP_CMD_FCFI) +#define G_FW_FCOE_VNP_CMD_FCFI(x) \ + (((x) >> S_FW_FCOE_VNP_CMD_FCFI) & M_FW_FCOE_VNP_CMD_FCFI) + +#define S_FW_FCOE_VNP_CMD_ALLOC 31 +#define M_FW_FCOE_VNP_CMD_ALLOC 0x1 +#define V_FW_FCOE_VNP_CMD_ALLOC(x) ((x) << S_FW_FCOE_VNP_CMD_ALLOC) +#define G_FW_FCOE_VNP_CMD_ALLOC(x) \ + (((x) >> S_FW_FCOE_VNP_CMD_ALLOC) & M_FW_FCOE_VNP_CMD_ALLOC) +#define F_FW_FCOE_VNP_CMD_ALLOC V_FW_FCOE_VNP_CMD_ALLOC(1U) + +#define S_FW_FCOE_VNP_CMD_FREE 30 +#define M_FW_FCOE_VNP_CMD_FREE 0x1 +#define V_FW_FCOE_VNP_CMD_FREE(x) ((x) << S_FW_FCOE_VNP_CMD_FREE) +#define G_FW_FCOE_VNP_CMD_FREE(x) \ + (((x) >> S_FW_FCOE_VNP_CMD_FREE) & M_FW_FCOE_VNP_CMD_FREE) +#define F_FW_FCOE_VNP_CMD_FREE V_FW_FCOE_VNP_CMD_FREE(1U) + +#define S_FW_FCOE_VNP_CMD_MODIFY 29 +#define M_FW_FCOE_VNP_CMD_MODIFY 0x1 +#define V_FW_FCOE_VNP_CMD_MODIFY(x) ((x) << S_FW_FCOE_VNP_CMD_MODIFY) +#define G_FW_FCOE_VNP_CMD_MODIFY(x) \ + (((x) >> S_FW_FCOE_VNP_CMD_MODIFY) & M_FW_FCOE_VNP_CMD_MODIFY) +#define F_FW_FCOE_VNP_CMD_MODIFY V_FW_FCOE_VNP_CMD_MODIFY(1U) + +#define S_FW_FCOE_VNP_CMD_GEN_WWN 22 +#define M_FW_FCOE_VNP_CMD_GEN_WWN 0x1 +#define V_FW_FCOE_VNP_CMD_GEN_WWN(x) ((x) << S_FW_FCOE_VNP_CMD_GEN_WWN) +#define G_FW_FCOE_VNP_CMD_GEN_WWN(x) \ + (((x) >> S_FW_FCOE_VNP_CMD_GEN_WWN) & M_FW_FCOE_VNP_CMD_GEN_WWN) +#define F_FW_FCOE_VNP_CMD_GEN_WWN V_FW_FCOE_VNP_CMD_GEN_WWN(1U) + +#define S_FW_FCOE_VNP_CMD_PERSIST 21 +#define M_FW_FCOE_VNP_CMD_PERSIST 0x1 +#define V_FW_FCOE_VNP_CMD_PERSIST(x) ((x) << S_FW_FCOE_VNP_CMD_PERSIST) +#define G_FW_FCOE_VNP_CMD_PERSIST(x) \ + (((x) >> S_FW_FCOE_VNP_CMD_PERSIST) & M_FW_FCOE_VNP_CMD_PERSIST) +#define F_FW_FCOE_VNP_CMD_PERSIST V_FW_FCOE_VNP_CMD_PERSIST(1U) + +#define S_FW_FCOE_VNP_CMD_VFID_EN 20 +#define M_FW_FCOE_VNP_CMD_VFID_EN 0x1 +#define V_FW_FCOE_VNP_CMD_VFID_EN(x) ((x) << S_FW_FCOE_VNP_CMD_VFID_EN) +#define G_FW_FCOE_VNP_CMD_VFID_EN(x) \ + (((x) >> S_FW_FCOE_VNP_CMD_VFID_EN) & M_FW_FCOE_VNP_CMD_VFID_EN) +#define F_FW_FCOE_VNP_CMD_VFID_EN V_FW_FCOE_VNP_CMD_VFID_EN(1U) + +#define S_FW_FCOE_VNP_CMD_VNPI 0 +#define M_FW_FCOE_VNP_CMD_VNPI 0xfffff +#define V_FW_FCOE_VNP_CMD_VNPI(x) ((x) << S_FW_FCOE_VNP_CMD_VNPI) +#define G_FW_FCOE_VNP_CMD_VNPI(x) \ + (((x) >> S_FW_FCOE_VNP_CMD_VNPI) & M_FW_FCOE_VNP_CMD_VNPI) + +struct fw_fcoe_sparams_cmd { + __be32 op_to_portid; + __be32 retval_len16; + __u8 r3[7]; + __u8 cos; + __u8 lport_wwnn[8]; + __u8 lport_wwpn[8]; + __u8 cmn_srv_parms[16]; + __u8 cls_srv_parms[16]; +}; + +#define S_FW_FCOE_SPARAMS_CMD_PORTID 0 +#define M_FW_FCOE_SPARAMS_CMD_PORTID 0xf +#define V_FW_FCOE_SPARAMS_CMD_PORTID(x) ((x) << S_FW_FCOE_SPARAMS_CMD_PORTID) +#define G_FW_FCOE_SPARAMS_CMD_PORTID(x) \ + (((x) >> S_FW_FCOE_SPARAMS_CMD_PORTID) & M_FW_FCOE_SPARAMS_CMD_PORTID) + +struct fw_fcoe_stats_cmd { + __be32 op_to_flowid; + __be32 free_to_len16; + union fw_fcoe_stats { + struct fw_fcoe_stats_ctl { + __u8 nstats_port; + __u8 port_valid_ix; + __be16 r6; + __be32 r7; + __be64 stat0; + __be64 stat1; + __be64 stat2; + __be64 stat3; + __be64 stat4; + __be64 stat5; + } ctl; + struct fw_fcoe_port_stats { + __be64 tx_bcast_bytes; + __be64 tx_bcast_frames; + __be64 tx_mcast_bytes; + __be64 tx_mcast_frames; + __be64 tx_ucast_bytes; + __be64 tx_ucast_frames; + __be64 tx_drop_frames; + __be64 tx_offload_bytes; + __be64 tx_offload_frames; + __be64 rx_bcast_bytes; + __be64 rx_bcast_frames; + __be64 rx_mcast_bytes; + __be64 rx_mcast_frames; + __be64 rx_ucast_bytes; + __be64 rx_ucast_frames; + __be64 rx_err_frames; + } port_stats; + struct fw_fcoe_fcf_stats { + __be32 fip_tx_bytes; + __be32 fip_tx_fr; + __be64 fcf_ka; + __be64 mcast_adv_rcvd; + __be16 ucast_adv_rcvd; + __be16 sol_sent; + __be16 vlan_req; + __be16 vlan_rpl; + __be16 clr_vlink; + __be16 link_down; + __be16 link_up; + __be16 logo; + __be16 flogi_req; + __be16 flogi_rpl; + __be16 fdisc_req; + __be16 fdisc_rpl; + __be16 fka_prd_chg; + __be16 fc_map_chg; + __be16 vfid_chg; + __u8 no_fka_req; + __u8 no_vnp; + } fcf_stats; + struct fw_fcoe_pcb_stats { + __be64 tx_bytes; + __be64 tx_frames; + __be64 rx_bytes; + __be64 rx_frames; + __be32 vnp_ka; + __be32 unsol_els_rcvd; + __be64 unsol_cmd_rcvd; + __be16 implicit_logo; + __be16 flogi_inv_sparm; + __be16 fdisc_inv_sparm; + __be16 flogi_rjt; + __be16 fdisc_rjt; + __be16 no_ssn; + __be16 mac_flt_fail; + __be16 inv_fr_rcvd; + } pcb_stats; + struct fw_fcoe_scb_stats { + __be64 tx_bytes; + __be64 tx_frames; + __be64 rx_bytes; + __be64 rx_frames; + __be32 host_abrt_req; + __be32 adap_auto_abrt; + __be32 adap_abrt_rsp; + __be32 host_ios_req; + __be16 ssn_offl_ios; + __be16 ssn_not_rdy_ios; + __u8 rx_data_ddp_err; + __u8 ddp_flt_set_err; + __be16 rx_data_fr_err; + __u8 bad_st_abrt_req; + __u8 no_io_abrt_req; + __u8 abort_tmo; + __u8 abort_tmo_2; + __be32 abort_req; + __u8 no_ppod_res_tmo; + __u8 bp_tmo; + __u8 adap_auto_cls; + __u8 no_io_cls_req; + __be32 host_cls_req; + __be64 unsol_cmd_rcvd; + __be32 plogi_req_rcvd; + __be32 prli_req_rcvd; + __be16 logo_req_rcvd; + __be16 prlo_req_rcvd; + __be16 plogi_rjt_rcvd; + __be16 prli_rjt_rcvd; + __be32 adisc_req_rcvd; + __be32 rscn_rcvd; + __be32 rrq_req_rcvd; + __be32 unsol_els_rcvd; + __u8 adisc_rjt_rcvd; + __u8 scr_rjt; + __u8 ct_rjt; + __u8 inval_bls_rcvd; + __be32 ba_rjt_rcvd; + } scb_stats; + } u; +}; + +#define S_FW_FCOE_STATS_CMD_FLOWID 0 +#define M_FW_FCOE_STATS_CMD_FLOWID 0xfffff +#define V_FW_FCOE_STATS_CMD_FLOWID(x) ((x) << S_FW_FCOE_STATS_CMD_FLOWID) +#define G_FW_FCOE_STATS_CMD_FLOWID(x) \ + (((x) >> S_FW_FCOE_STATS_CMD_FLOWID) & M_FW_FCOE_STATS_CMD_FLOWID) + +#define S_FW_FCOE_STATS_CMD_FREE 30 +#define M_FW_FCOE_STATS_CMD_FREE 0x1 +#define V_FW_FCOE_STATS_CMD_FREE(x) ((x) << S_FW_FCOE_STATS_CMD_FREE) +#define G_FW_FCOE_STATS_CMD_FREE(x) \ + (((x) >> S_FW_FCOE_STATS_CMD_FREE) & M_FW_FCOE_STATS_CMD_FREE) +#define F_FW_FCOE_STATS_CMD_FREE V_FW_FCOE_STATS_CMD_FREE(1U) + +#define S_FW_FCOE_STATS_CMD_NSTATS 4 +#define M_FW_FCOE_STATS_CMD_NSTATS 0x7 +#define V_FW_FCOE_STATS_CMD_NSTATS(x) ((x) << S_FW_FCOE_STATS_CMD_NSTATS) +#define G_FW_FCOE_STATS_CMD_NSTATS(x) \ + (((x) >> S_FW_FCOE_STATS_CMD_NSTATS) & M_FW_FCOE_STATS_CMD_NSTATS) + +#define S_FW_FCOE_STATS_CMD_PORT 0 +#define M_FW_FCOE_STATS_CMD_PORT 0x3 +#define V_FW_FCOE_STATS_CMD_PORT(x) ((x) << S_FW_FCOE_STATS_CMD_PORT) +#define G_FW_FCOE_STATS_CMD_PORT(x) \ + (((x) >> S_FW_FCOE_STATS_CMD_PORT) & M_FW_FCOE_STATS_CMD_PORT) + +#define S_FW_FCOE_STATS_CMD_PORT_VALID 7 +#define M_FW_FCOE_STATS_CMD_PORT_VALID 0x1 +#define V_FW_FCOE_STATS_CMD_PORT_VALID(x) \ + ((x) << S_FW_FCOE_STATS_CMD_PORT_VALID) +#define G_FW_FCOE_STATS_CMD_PORT_VALID(x) \ + (((x) >> S_FW_FCOE_STATS_CMD_PORT_VALID) & M_FW_FCOE_STATS_CMD_PORT_VALID) +#define F_FW_FCOE_STATS_CMD_PORT_VALID V_FW_FCOE_STATS_CMD_PORT_VALID(1U) + +#define S_FW_FCOE_STATS_CMD_IX 0 +#define M_FW_FCOE_STATS_CMD_IX 0x3f +#define V_FW_FCOE_STATS_CMD_IX(x) ((x) << S_FW_FCOE_STATS_CMD_IX) +#define G_FW_FCOE_STATS_CMD_IX(x) \ + (((x) >> S_FW_FCOE_STATS_CMD_IX) & M_FW_FCOE_STATS_CMD_IX) + +struct fw_fcoe_fcf_cmd { + __be32 op_to_fcfi; + __be32 retval_len16; + __be16 priority_pkd; + __u8 mac[6]; + __u8 name_id[8]; + __u8 fabric[8]; + __be16 vf_id; + __be16 max_fcoe_size; + __u8 vlan_id; + __u8 fc_map[3]; + __be32 fka_adv; + __be32 r6; + __u8 r7_hi; + __u8 fpma_to_portid; + __u8 spma_mac[6]; + __be64 r8; +}; + +#define S_FW_FCOE_FCF_CMD_FCFI 0 +#define M_FW_FCOE_FCF_CMD_FCFI 0xfffff +#define V_FW_FCOE_FCF_CMD_FCFI(x) ((x) << S_FW_FCOE_FCF_CMD_FCFI) +#define G_FW_FCOE_FCF_CMD_FCFI(x) \ + (((x) >> S_FW_FCOE_FCF_CMD_FCFI) & M_FW_FCOE_FCF_CMD_FCFI) + +#define S_FW_FCOE_FCF_CMD_PRIORITY 0 +#define M_FW_FCOE_FCF_CMD_PRIORITY 0xff +#define V_FW_FCOE_FCF_CMD_PRIORITY(x) ((x) << S_FW_FCOE_FCF_CMD_PRIORITY) +#define G_FW_FCOE_FCF_CMD_PRIORITY(x) \ + (((x) >> S_FW_FCOE_FCF_CMD_PRIORITY) & M_FW_FCOE_FCF_CMD_PRIORITY) + +#define S_FW_FCOE_FCF_CMD_FPMA 6 +#define M_FW_FCOE_FCF_CMD_FPMA 0x1 +#define V_FW_FCOE_FCF_CMD_FPMA(x) ((x) << S_FW_FCOE_FCF_CMD_FPMA) +#define G_FW_FCOE_FCF_CMD_FPMA(x) \ + (((x) >> S_FW_FCOE_FCF_CMD_FPMA) & M_FW_FCOE_FCF_CMD_FPMA) +#define F_FW_FCOE_FCF_CMD_FPMA V_FW_FCOE_FCF_CMD_FPMA(1U) + +#define S_FW_FCOE_FCF_CMD_SPMA 5 +#define M_FW_FCOE_FCF_CMD_SPMA 0x1 +#define V_FW_FCOE_FCF_CMD_SPMA(x) ((x) << S_FW_FCOE_FCF_CMD_SPMA) +#define G_FW_FCOE_FCF_CMD_SPMA(x) \ + (((x) >> S_FW_FCOE_FCF_CMD_SPMA) & M_FW_FCOE_FCF_CMD_SPMA) +#define F_FW_FCOE_FCF_CMD_SPMA V_FW_FCOE_FCF_CMD_SPMA(1U) + +#define S_FW_FCOE_FCF_CMD_LOGIN 4 +#define M_FW_FCOE_FCF_CMD_LOGIN 0x1 +#define V_FW_FCOE_FCF_CMD_LOGIN(x) ((x) << S_FW_FCOE_FCF_CMD_LOGIN) +#define G_FW_FCOE_FCF_CMD_LOGIN(x) \ + (((x) >> S_FW_FCOE_FCF_CMD_LOGIN) & M_FW_FCOE_FCF_CMD_LOGIN) +#define F_FW_FCOE_FCF_CMD_LOGIN V_FW_FCOE_FCF_CMD_LOGIN(1U) + +#define S_FW_FCOE_FCF_CMD_PORTID 0 +#define M_FW_FCOE_FCF_CMD_PORTID 0xf +#define V_FW_FCOE_FCF_CMD_PORTID(x) ((x) << S_FW_FCOE_FCF_CMD_PORTID) +#define G_FW_FCOE_FCF_CMD_PORTID(x) \ + (((x) >> S_FW_FCOE_FCF_CMD_PORTID) & M_FW_FCOE_FCF_CMD_PORTID) + +/****************************************************************************** + * E R R O R a n d D E B U G C O M M A N D s + ******************************************************/ + enum fw_error_type { FW_ERROR_TYPE_EXCEPTION = 0x0, FW_ERROR_TYPE_HWMODULE = 0x1, @@ -5911,7 +7265,6 @@ struct fw_debug_cmd { #define G_FW_DEBUG_CMD_TYPE(x) \ (((x) >> S_FW_DEBUG_CMD_TYPE) & M_FW_DEBUG_CMD_TYPE) - /****************************************************************************** * P C I E F W R E G I S T E R **************************************/ diff --git a/sys/dev/cxgbe/offload.h b/sys/dev/cxgbe/offload.h index f6ada9d0934..1ae9f1fa53c 100644 --- a/sys/dev/cxgbe/offload.h +++ b/sys/dev/cxgbe/offload.h @@ -31,12 +31,6 @@ #ifndef __T4_OFFLOAD_H__ #define __T4_OFFLOAD_H__ -/* XXX: flagrant misuse of mbuf fields (during tx by TOM) */ -#define MBUF_EQ(m) (*((void **)(&(m)->m_pkthdr.rcvif))) -/* These have to work for !M_PKTHDR so we use a field from m_hdr. */ -#define MBUF_TX_CREDITS(m) ((m)->m_hdr.pad[0]) -#define MBUF_DMA_MAPPED(m) ((m)->m_hdr.pad[1]) - #define INIT_ULPTX_WR(w, wrlen, atomic, tid) do { \ (w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_ULPTX_WR) | V_FW_WR_ATOMIC(atomic)); \ (w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(wrlen, 16)) | \ @@ -119,7 +113,7 @@ struct t4_virt_res { /* virtualized HW resources */ struct t4_range ocq; }; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD enum { ULD_TOM = 1, }; @@ -130,13 +124,8 @@ struct uld_info { SLIST_ENTRY(uld_info) link; int refcount; int uld_id; - int (*attach)(struct adapter *, void **); - int (*detach)(void *); -}; - -struct uld_softc { - struct uld_info *uld; - void *softc; + int (*activate)(struct adapter *); + int (*deactivate)(struct adapter *); }; struct tom_tunables { @@ -148,6 +137,8 @@ struct tom_tunables { int t4_register_uld(struct uld_info *); int t4_unregister_uld(struct uld_info *); +int t4_activate_uld(struct adapter *, int); +int t4_deactivate_uld(struct adapter *, int); #endif #endif diff --git a/sys/dev/cxgbe/osdep.h b/sys/dev/cxgbe/osdep.h index 40ed61b3d91..0d9c80fe04b 100644 --- a/sys/dev/cxgbe/osdep.h +++ b/sys/dev/cxgbe/osdep.h @@ -111,6 +111,7 @@ typedef boolean_t bool; #define AUTONEG_DISABLE 0 #define AUTONEG_ENABLE 1 +#define PCI_DEVICE_ID PCIR_DEVICE #define PCI_CAP_ID_VPD PCIY_VPD #define PCI_VPD_ADDR PCIR_VPD_ADDR #define PCI_VPD_ADDR_F 0x8000 diff --git a/sys/dev/cxgbe/t4_l2t.c b/sys/dev/cxgbe/t4_l2t.c index 55491cda304..6476b9b5ecc 100644 --- a/sys/dev/cxgbe/t4_l2t.c +++ b/sys/dev/cxgbe/t4_l2t.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 Chelsio Communications, Inc. + * Copyright (c) 2012 Chelsio Communications, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,6 +27,7 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" +#include "opt_inet6.h" #include #include @@ -38,16 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include #include "common/common.h" #include "common/jhash.h" @@ -72,42 +64,11 @@ __FBSDID("$FreeBSD$"); * lifetime of an L2T entry is fully contained in the lifetime of the TOE. */ -/* identifies sync vs async L2T_WRITE_REQs */ -#define S_SYNC_WR 12 -#define V_SYNC_WR(x) ((x) << S_SYNC_WR) -#define F_SYNC_WR V_SYNC_WR(1) - -enum { - L2T_STATE_VALID, /* entry is up to date */ - L2T_STATE_STALE, /* entry may be used but needs revalidation */ - L2T_STATE_RESOLVING, /* entry needs address resolution */ - L2T_STATE_SYNC_WRITE, /* synchronous write of entry underway */ - - /* when state is one of the below the entry is not hashed */ - L2T_STATE_SWITCHING, /* entry is being used by a switching filter */ - L2T_STATE_UNUSED /* entry not in use */ -}; - -struct l2t_data { - struct rwlock lock; - volatile int nfree; /* number of free entries */ - struct l2t_entry *rover;/* starting point for next allocation */ - struct l2t_entry l2tab[L2T_SIZE]; -}; - -static int do_l2t_write_rpl(struct sge_iq *, const struct rss_header *, - struct mbuf *); - -#define VLAN_NONE 0xfff -#define SA(x) ((struct sockaddr *)(x)) -#define SIN(x) ((struct sockaddr_in *)(x)) -#define SINADDR(x) (SIN(x)->sin_addr.s_addr) - /* * Allocate a free L2T entry. Must be called with l2t_data.lock held. */ -static struct l2t_entry * -alloc_l2e(struct l2t_data *d) +struct l2t_entry * +t4_alloc_l2e(struct l2t_data *d) { struct l2t_entry *end, *e, **p; @@ -121,7 +82,8 @@ alloc_l2e(struct l2t_data *d) if (atomic_load_acq_int(&e->refcnt) == 0) goto found; - for (e = d->l2tab; atomic_load_acq_int(&e->refcnt); ++e) ; + for (e = d->l2tab; atomic_load_acq_int(&e->refcnt); ++e) + continue; found: d->rover = e + 1; atomic_subtract_int(&d->nfree, 1); @@ -148,19 +110,18 @@ found: * Write an L2T entry. Must be called with the entry locked. * The write may be synchronous or asynchronous. */ -static int -write_l2e(struct adapter *sc, struct l2t_entry *e, int sync) +int +t4_write_l2e(struct adapter *sc, struct l2t_entry *e, int sync) { - struct mbuf *m; + struct wrqe *wr; struct cpl_l2t_write_req *req; mtx_assert(&e->lock, MA_OWNED); - if ((m = m_gethdr(M_NOWAIT, MT_DATA)) == NULL) + wr = alloc_wrqe(sizeof(*req), &sc->sge.mgmtq); + if (wr == NULL) return (ENOMEM); - - req = mtod(m, struct cpl_l2t_write_req *); - m->m_pkthdr.len = m->m_len = sizeof(*req); + req = wrtod(wr); INIT_TP_WR(req, 0); OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_L2T_WRITE_REQ, e->idx | @@ -170,7 +131,7 @@ write_l2e(struct adapter *sc, struct l2t_entry *e, int sync) req->vlan = htons(e->vlan); memcpy(req->dst_mac, e->dmac, sizeof(req->dst_mac)); - t4_mgmt_tx(sc, m); + t4_wrq_tx(sc, wr); if (sync && e->state != L2T_STATE_SWITCHING) e->state = L2T_STATE_SYNC_WRITE; @@ -189,7 +150,7 @@ t4_l2t_alloc_switching(struct l2t_data *d) struct l2t_entry *e; rw_rlock(&d->lock); - e = alloc_l2e(d); + e = t4_alloc_l2e(d); if (e) { mtx_lock(&e->lock); /* avoid race with t4_l2t_free */ e->state = L2T_STATE_SWITCHING; @@ -214,7 +175,7 @@ t4_l2t_set_switching(struct adapter *sc, struct l2t_entry *e, uint16_t vlan, e->lport = port; memcpy(e->dmac, eth_addr, ETHER_ADDR_LEN); mtx_lock(&e->lock); - rc = write_l2e(sc, e, 0); + rc = t4_write_l2e(sc, e, 0); mtx_unlock(&e->lock); return (rc); } @@ -234,10 +195,13 @@ t4_init_l2t(struct adapter *sc, int flags) rw_init(&d->lock, "L2T"); for (i = 0; i < L2T_SIZE; i++) { - d->l2tab[i].idx = i; - d->l2tab[i].state = L2T_STATE_UNUSED; - mtx_init(&d->l2tab[i].lock, "L2T_E", NULL, MTX_DEF); - atomic_store_rel_int(&d->l2tab[i].refcnt, 0); + struct l2t_entry *e = &d->l2tab[i]; + + e->idx = i; + e->state = L2T_STATE_UNUSED; + mtx_init(&e->lock, "L2T_E", NULL, MTX_DEF); + STAILQ_INIT(&e->wr_list); + atomic_store_rel_int(&e->refcnt, 0); } sc->l2t = d; @@ -259,6 +223,24 @@ t4_free_l2t(struct l2t_data *d) return (0); } +int +do_l2t_write_rpl(struct sge_iq *iq, const struct rss_header *rss, + struct mbuf *m) +{ + const struct cpl_l2t_write_rpl *rpl = (const void *)(rss + 1); + unsigned int tid = GET_TID(rpl); + unsigned int idx = tid & (L2T_SIZE - 1); + + if (__predict_false(rpl->status != CPL_ERR_NONE)) { + log(LOG_ERR, + "Unexpected L2T_WRITE_RPL status %u for entry %u\n", + rpl->status, idx); + return (EINVAL); + } + + return (0); +} + #ifdef SBUF_DRAIN static inline unsigned int vlan_prio(const struct l2t_entry *e) @@ -273,7 +255,7 @@ l2e_state(const struct l2t_entry *e) case L2T_STATE_VALID: return 'V'; /* valid, fast-path entry */ case L2T_STATE_STALE: return 'S'; /* needs revalidation, but usable */ case L2T_STATE_SYNC_WRITE: return 'W'; - case L2T_STATE_RESOLVING: return e->arpq_head ? 'A' : 'R'; + case L2T_STATE_RESOLVING: return STAILQ_EMPTY(&e->wr_list) ? 'R' : 'A'; case L2T_STATE_SWITCHING: return 'X'; default: return 'U'; } @@ -311,20 +293,20 @@ sysctl_l2t(SYSCTL_HANDLER_ARGS) "Ethernet address VLAN/P LP State Users Port"); header = 1; } - if (e->state == L2T_STATE_SWITCHING || e->v6) + if (e->state == L2T_STATE_SWITCHING) ip[0] = 0; else snprintf(ip, sizeof(ip), "%s", - inet_ntoa(*(struct in_addr *)&e->addr[0])); + inet_ntoa(*(struct in_addr *)&e->addr)); - /* XXX: accessing lle probably not safe? */ + /* XXX: e->ifp may not be around */ sbuf_printf(sb, "\n%4u %-15s %02x:%02x:%02x:%02x:%02x:%02x %4d" " %u %2u %c %5u %s", e->idx, ip, e->dmac[0], e->dmac[1], e->dmac[2], e->dmac[3], e->dmac[4], e->dmac[5], e->vlan & 0xfff, vlan_prio(e), e->lport, l2e_state(e), atomic_load_acq_int(&e->refcnt), - e->lle ? e->lle->lle_tbl->llt_ifp->if_xname : ""); + e->ifp->if_xname); skip: mtx_unlock(&e->lock); } @@ -335,459 +317,3 @@ skip: return (rc); } #endif - -#ifndef TCP_OFFLOAD_DISABLE -static inline void -l2t_hold(struct l2t_data *d, struct l2t_entry *e) -{ - if (atomic_fetchadd_int(&e->refcnt, 1) == 0) /* 0 -> 1 transition */ - atomic_subtract_int(&d->nfree, 1); -} - -/* - * To avoid having to check address families we do not allow v4 and v6 - * neighbors to be on the same hash chain. We keep v4 entries in the first - * half of available hash buckets and v6 in the second. - */ -enum { - L2T_SZ_HALF = L2T_SIZE / 2, - L2T_HASH_MASK = L2T_SZ_HALF - 1 -}; - -static inline unsigned int -arp_hash(const uint32_t *key, int ifindex) -{ - return jhash_2words(*key, ifindex, 0) & L2T_HASH_MASK; -} - -static inline unsigned int -ipv6_hash(const uint32_t *key, int ifindex) -{ - uint32_t xor = key[0] ^ key[1] ^ key[2] ^ key[3]; - - return L2T_SZ_HALF + (jhash_2words(xor, ifindex, 0) & L2T_HASH_MASK); -} - -static inline unsigned int -addr_hash(const uint32_t *addr, int addr_len, int ifindex) -{ - return addr_len == 4 ? arp_hash(addr, ifindex) : - ipv6_hash(addr, ifindex); -} - -/* - * Checks if an L2T entry is for the given IP/IPv6 address. It does not check - * whether the L2T entry and the address are of the same address family. - * Callers ensure an address is only checked against L2T entries of the same - * family, something made trivial by the separation of IP and IPv6 hash chains - * mentioned above. Returns 0 if there's a match, - */ -static inline int -addreq(const struct l2t_entry *e, const uint32_t *addr) -{ - if (e->v6) - return (e->addr[0] ^ addr[0]) | (e->addr[1] ^ addr[1]) | - (e->addr[2] ^ addr[2]) | (e->addr[3] ^ addr[3]); - return e->addr[0] ^ addr[0]; -} - -/* - * Add a packet to an L2T entry's queue of packets awaiting resolution. - * Must be called with the entry's lock held. - */ -static inline void -arpq_enqueue(struct l2t_entry *e, struct mbuf *m) -{ - mtx_assert(&e->lock, MA_OWNED); - - KASSERT(m->m_nextpkt == NULL, ("%s: m_nextpkt not NULL", __func__)); - if (e->arpq_head) - e->arpq_tail->m_nextpkt = m; - else - e->arpq_head = m; - e->arpq_tail = m; -} - -static inline void -send_pending(struct adapter *sc, struct l2t_entry *e) -{ - struct mbuf *m, *next; - - mtx_assert(&e->lock, MA_OWNED); - - for (m = e->arpq_head; m; m = next) { - next = m->m_nextpkt; - m->m_nextpkt = NULL; - t4_wrq_tx(sc, MBUF_EQ(m), m); - } - e->arpq_head = e->arpq_tail = NULL; -} - -#ifdef INET -/* - * Looks up and fills up an l2t_entry's lle. We grab all the locks that we need - * ourself, and update e->state at the end if e->lle was successfully filled. - * - * The lle passed in comes from arpresolve and is ignored as it does not appear - * to be of much use. - */ -static int -l2t_fill_lle(struct adapter *sc, struct l2t_entry *e, struct llentry *unused) -{ - int rc = 0; - struct sockaddr_in sin; - struct ifnet *ifp = e->ifp; - struct llentry *lle; - - bzero(&sin, sizeof(struct sockaddr_in)); - if (e->v6) - panic("%s: IPv6 L2 resolution not supported yet.", __func__); - - sin.sin_family = AF_INET; - sin.sin_len = sizeof(struct sockaddr_in); - memcpy(&sin.sin_addr, e->addr, sizeof(struct sockaddr_in)); - - mtx_assert(&e->lock, MA_NOTOWNED); - KASSERT(e->addr && ifp, ("%s: bad prep before call", __func__)); - - IF_AFDATA_LOCK(ifp); - lle = lla_lookup(LLTABLE(ifp), LLE_EXCLUSIVE, SA(&sin)); - IF_AFDATA_UNLOCK(ifp); - if (!LLE_IS_VALID(lle)) - return (ENOMEM); - if (!(lle->la_flags & LLE_VALID)) { - rc = EINVAL; - goto done; - } - - LLE_ADDREF(lle); - - mtx_lock(&e->lock); - if (e->state == L2T_STATE_RESOLVING) { - KASSERT(e->lle == NULL, ("%s: lle already valid", __func__)); - e->lle = lle; - memcpy(e->dmac, &lle->ll_addr, ETHER_ADDR_LEN); - write_l2e(sc, e, 1); - } else { - KASSERT(e->lle == lle, ("%s: lle changed", __func__)); - LLE_REMREF(lle); - } - mtx_unlock(&e->lock); -done: - LLE_WUNLOCK(lle); - return (rc); -} -#endif - -int -t4_l2t_send(struct adapter *sc, struct mbuf *m, struct l2t_entry *e) -{ -#ifndef INET - return (EINVAL); -#else - struct llentry *lle = NULL; - struct sockaddr_in sin; - struct ifnet *ifp = e->ifp; - - if (e->v6) - panic("%s: IPv6 L2 resolution not supported yet.", __func__); - - bzero(&sin, sizeof(struct sockaddr_in)); - sin.sin_family = AF_INET; - sin.sin_len = sizeof(struct sockaddr_in); - memcpy(&sin.sin_addr, e->addr, sizeof(struct sockaddr_in)); - -again: - switch (e->state) { - case L2T_STATE_STALE: /* entry is stale, kick off revalidation */ - if (arpresolve(ifp, NULL, NULL, SA(&sin), e->dmac, &lle) == 0) - l2t_fill_lle(sc, e, lle); - - /* Fall through */ - - case L2T_STATE_VALID: /* fast-path, send the packet on */ - return t4_wrq_tx(sc, MBUF_EQ(m), m); - - case L2T_STATE_RESOLVING: - case L2T_STATE_SYNC_WRITE: - mtx_lock(&e->lock); - if (e->state != L2T_STATE_SYNC_WRITE && - e->state != L2T_STATE_RESOLVING) { - /* state changed by the time we got here */ - mtx_unlock(&e->lock); - goto again; - } - arpq_enqueue(e, m); - mtx_unlock(&e->lock); - - if (e->state == L2T_STATE_RESOLVING && - arpresolve(ifp, NULL, NULL, SA(&sin), e->dmac, &lle) == 0) - l2t_fill_lle(sc, e, lle); - } - - return (0); -#endif -} - -/* - * Called when an L2T entry has no more users. The entry is left in the hash - * table since it is likely to be reused but we also bump nfree to indicate - * that the entry can be reallocated for a different neighbor. We also drop - * the existing neighbor reference in case the neighbor is going away and is - * waiting on our reference. - * - * Because entries can be reallocated to other neighbors once their ref count - * drops to 0 we need to take the entry's lock to avoid races with a new - * incarnation. - */ -static void -t4_l2e_free(struct l2t_entry *e) -{ - struct llentry *lle = NULL; - struct l2t_data *d; - - mtx_lock(&e->lock); - if (atomic_load_acq_int(&e->refcnt) == 0) { /* hasn't been recycled */ - lle = e->lle; - e->lle = NULL; - /* - * Don't need to worry about the arpq, an L2T entry can't be - * released if any packets are waiting for resolution as we - * need to be able to communicate with the device to close a - * connection. - */ - } - mtx_unlock(&e->lock); - - d = container_of(e, struct l2t_data, l2tab[e->idx]); - atomic_add_int(&d->nfree, 1); - - if (lle) - LLE_FREE(lle); -} - -void -t4_l2t_release(struct l2t_entry *e) -{ - if (atomic_fetchadd_int(&e->refcnt, -1) == 1) - t4_l2e_free(e); -} - -static int -do_l2t_write_rpl(struct sge_iq *iq, const struct rss_header *rss, - struct mbuf *m) -{ - struct adapter *sc = iq->adapter; - const struct cpl_l2t_write_rpl *rpl = (const void *)(rss + 1); - unsigned int tid = GET_TID(rpl); - unsigned int idx = tid & (L2T_SIZE - 1); - - if (__predict_false(rpl->status != CPL_ERR_NONE)) { - log(LOG_ERR, - "Unexpected L2T_WRITE_RPL status %u for entry %u\n", - rpl->status, idx); - return (EINVAL); - } - - if (tid & F_SYNC_WR) { - struct l2t_entry *e = &sc->l2t->l2tab[idx]; - - mtx_lock(&e->lock); - if (e->state != L2T_STATE_SWITCHING) { - send_pending(sc, e); - e->state = L2T_STATE_VALID; - } - mtx_unlock(&e->lock); - } - - return (0); -} - -/* - * Reuse an L2T entry that was previously used for the same next hop. - */ -static void -reuse_entry(struct l2t_entry *e) -{ - struct llentry *lle; - - mtx_lock(&e->lock); /* avoid race with t4_l2t_free */ - lle = e->lle; - if (lle) { - KASSERT(lle->la_flags & LLE_VALID, - ("%s: invalid lle stored in l2t_entry", __func__)); - - if (lle->la_expire >= time_uptime) - e->state = L2T_STATE_STALE; - else - e->state = L2T_STATE_VALID; - } else - e->state = L2T_STATE_RESOLVING; - mtx_unlock(&e->lock); -} - -/* - * The TOE wants an L2 table entry that it can use to reach the next hop over - * the specified port. Produce such an entry - create one if needed. - * - * Note that the ifnet could be a pseudo-device like if_vlan, if_lagg, etc. on - * top of the real cxgbe interface. - */ -struct l2t_entry * -t4_l2t_get(struct port_info *pi, struct ifnet *ifp, struct sockaddr *sa) -{ - struct l2t_entry *e; - struct l2t_data *d = pi->adapter->l2t; - int addr_len; - uint32_t *addr; - int hash; - struct sockaddr_in6 *sin6; - unsigned int smt_idx = pi->port_id; - - if (sa->sa_family == AF_INET) { - addr = (uint32_t *)&SINADDR(sa); - addr_len = sizeof(SINADDR(sa)); - } else if (sa->sa_family == AF_INET6) { - sin6 = (struct sockaddr_in6 *)sa; - addr = (uint32_t *)&sin6->sin6_addr.s6_addr; - addr_len = sizeof(sin6->sin6_addr.s6_addr); - } else - return (NULL); - -#ifndef VLAN_TAG - if (ifp->if_type == IFT_L2VLAN) - return (NULL); -#endif - - hash = addr_hash(addr, addr_len, ifp->if_index); - - rw_wlock(&d->lock); - for (e = d->l2tab[hash].first; e; e = e->next) { - if (!addreq(e, addr) && e->ifp == ifp && e->smt_idx == smt_idx){ - l2t_hold(d, e); - if (atomic_load_acq_int(&e->refcnt) == 1) - reuse_entry(e); - goto done; - } - } - - /* Need to allocate a new entry */ - e = alloc_l2e(d); - if (e) { - mtx_lock(&e->lock); /* avoid race with t4_l2t_free */ - e->state = L2T_STATE_RESOLVING; - memcpy(e->addr, addr, addr_len); - e->ifindex = ifp->if_index; - e->smt_idx = smt_idx; - e->ifp = ifp; - e->hash = hash; - e->lport = pi->lport; - e->v6 = (addr_len == 16); - e->lle = NULL; - atomic_store_rel_int(&e->refcnt, 1); -#ifdef VLAN_TAG - if (ifp->if_type == IFT_L2VLAN) - VLAN_TAG(ifp, &e->vlan); - else - e->vlan = VLAN_NONE; -#endif - e->next = d->l2tab[hash].first; - d->l2tab[hash].first = e; - mtx_unlock(&e->lock); - } -done: - rw_wunlock(&d->lock); - return e; -} - -/* - * Called when the host's neighbor layer makes a change to some entry that is - * loaded into the HW L2 table. - */ -void -t4_l2t_update(struct adapter *sc, struct llentry *lle) -{ - struct l2t_entry *e; - struct l2t_data *d = sc->l2t; - struct sockaddr *sa = L3_ADDR(lle); - struct llentry *old_lle = NULL; - uint32_t *addr = (uint32_t *)&SINADDR(sa); - struct ifnet *ifp = lle->lle_tbl->llt_ifp; - int hash = addr_hash(addr, sizeof(*addr), ifp->if_index); - - KASSERT(d != NULL, ("%s: no L2 table", __func__)); - LLE_WLOCK_ASSERT(lle); - KASSERT(lle->la_flags & LLE_VALID || lle->la_flags & LLE_DELETED, - ("%s: entry neither valid nor deleted.", __func__)); - - rw_rlock(&d->lock); - for (e = d->l2tab[hash].first; e; e = e->next) { - if (!addreq(e, addr) && e->ifp == ifp) { - mtx_lock(&e->lock); - if (atomic_load_acq_int(&e->refcnt)) - goto found; - e->state = L2T_STATE_STALE; - mtx_unlock(&e->lock); - break; - } - } - rw_runlock(&d->lock); - - /* The TOE has no interest in this LLE */ - return; - - found: - rw_runlock(&d->lock); - - if (atomic_load_acq_int(&e->refcnt)) { - - /* Entry is referenced by at least 1 offloaded connection. */ - - /* Handle deletes first */ - if (lle->la_flags & LLE_DELETED) { - if (lle == e->lle) { - e->lle = NULL; - e->state = L2T_STATE_RESOLVING; - LLE_REMREF(lle); - } - goto done; - } - - if (lle != e->lle) { - old_lle = e->lle; - LLE_ADDREF(lle); - e->lle = lle; - } - - if (e->state == L2T_STATE_RESOLVING || - memcmp(e->dmac, &lle->ll_addr, ETHER_ADDR_LEN)) { - - /* unresolved -> resolved; or dmac changed */ - - memcpy(e->dmac, &lle->ll_addr, ETHER_ADDR_LEN); - write_l2e(sc, e, 1); - } else { - - /* +ve reinforcement of a valid or stale entry */ - - } - - e->state = L2T_STATE_VALID; - - } else { - /* - * Entry was used previously but is unreferenced right now. - * e->lle has been released and NULL'd out by t4_l2t_free, or - * l2t_release is about to call t4_l2t_free and do that. - * - * Either way this is of no interest to us. - */ - } - -done: - mtx_unlock(&e->lock); - if (old_lle) - LLE_FREE(old_lle); -} - -#endif diff --git a/sys/dev/cxgbe/t4_l2t.h b/sys/dev/cxgbe/t4_l2t.h index 5dfce839b8b..03038856c6c 100644 --- a/sys/dev/cxgbe/t4_l2t.h +++ b/sys/dev/cxgbe/t4_l2t.h @@ -30,8 +30,25 @@ #ifndef __T4_L2T_H #define __T4_L2T_H +/* identifies sync vs async L2T_WRITE_REQs */ +#define S_SYNC_WR 12 +#define V_SYNC_WR(x) ((x) << S_SYNC_WR) +#define F_SYNC_WR V_SYNC_WR(1) + enum { L2T_SIZE = 4096 }; /* # of L2T entries */ +enum { + L2T_STATE_VALID, /* entry is up to date */ + L2T_STATE_STALE, /* entry may be used but needs revalidation */ + L2T_STATE_RESOLVING, /* entry needs address resolution */ + L2T_STATE_FAILED, /* failed to resolve */ + L2T_STATE_SYNC_WRITE, /* synchronous write of entry underway */ + + /* when state is one of the below the entry is not hashed */ + L2T_STATE_SWITCHING, /* entry is being used by a switching filter */ + L2T_STATE_UNUSED /* entry not in use */ +}; + /* * Each L2T entry plays multiple roles. First of all, it keeps state for the * corresponding entry of the HW L2 table and maintains a queue of offload @@ -43,39 +60,49 @@ enum { L2T_SIZE = 4096 }; /* # of L2T entries */ struct l2t_entry { uint16_t state; /* entry state */ uint16_t idx; /* entry index */ - uint32_t addr[4]; /* next hop IP or IPv6 address */ + uint32_t addr; /* next hop IP address */ struct ifnet *ifp; /* outgoing interface */ uint16_t smt_idx; /* SMT index */ uint16_t vlan; /* VLAN TCI (id: 0-11, prio: 13-15) */ - int ifindex; /* interface index */ - struct llentry *lle; /* llentry for next hop */ struct l2t_entry *first; /* start of hash chain */ struct l2t_entry *next; /* next l2t_entry on chain */ - struct mbuf *arpq_head; /* list of mbufs awaiting resolution */ - struct mbuf *arpq_tail; + STAILQ_HEAD(, wrqe) wr_list; /* list of WRs awaiting resolution */ struct mtx lock; volatile int refcnt; /* entry reference count */ uint16_t hash; /* hash bucket the entry is on */ - uint8_t v6; /* whether entry is for IPv6 */ uint8_t lport; /* associated offload logical port */ uint8_t dmac[ETHER_ADDR_LEN]; /* next hop's MAC address */ }; +struct l2t_data { + struct rwlock lock; + volatile int nfree; /* number of free entries */ + struct l2t_entry *rover;/* starting point for next allocation */ + struct l2t_entry l2tab[L2T_SIZE]; +}; + + int t4_init_l2t(struct adapter *, int); int t4_free_l2t(struct l2t_data *); +struct l2t_entry *t4_alloc_l2e(struct l2t_data *); struct l2t_entry *t4_l2t_alloc_switching(struct l2t_data *); int t4_l2t_set_switching(struct adapter *, struct l2t_entry *, uint16_t, uint8_t, uint8_t *); -void t4_l2t_release(struct l2t_entry *); +int t4_write_l2e(struct adapter *, struct l2t_entry *, int); +int do_l2t_write_rpl(struct sge_iq *, const struct rss_header *, struct mbuf *); + +static inline void +t4_l2t_release(struct l2t_entry *e) +{ + struct l2t_data *d = container_of(e, struct l2t_data, l2tab[e->idx]); + + if (atomic_fetchadd_int(&e->refcnt, -1) == 1) + atomic_add_int(&d->nfree, 1); +} + + #ifdef SBUF_DRAIN int sysctl_l2t(SYSCTL_HANDLER_ARGS); #endif -#ifndef TCP_OFFLOAD_DISABLE -struct l2t_entry *t4_l2t_get(struct port_info *, struct ifnet *, - struct sockaddr *); -int t4_l2t_send(struct adapter *, struct mbuf *, struct l2t_entry *); -void t4_l2t_update(struct adapter *, struct llentry *); -#endif - #endif /* __T4_L2T_H */ diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c index a344952fcae..02d25da9704 100644 --- a/sys/dev/cxgbe/t4_main.c +++ b/sys/dev/cxgbe/t4_main.c @@ -29,6 +29,7 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" +#include "opt_inet6.h" #include #include @@ -119,9 +120,13 @@ static void cxgbe_media_status(struct ifnet *, struct ifmediareq *); MALLOC_DEFINE(M_CXGBE, "cxgbe", "Chelsio T4 Ethernet driver and services"); +/* + * Correct lock order when you need to acquire multiple locks is t4_list_lock, + * then ADAPTER_LOCK, then t4_uld_list_lock. + */ static struct mtx t4_list_lock; static SLIST_HEAD(, adapter) t4_list; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD static struct mtx t4_uld_list_lock; static SLIST_HEAD(, uld_info) t4_uld_list; #endif @@ -149,7 +154,7 @@ TUNABLE_INT("hw.cxgbe.ntxq1g", &t4_ntxq1g); static int t4_nrxq1g = -1; TUNABLE_INT("hw.cxgbe.nrxq1g", &t4_nrxq1g); -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD #define NOFLDTXQ_10G 8 static int t4_nofldtxq10g = -1; TUNABLE_INT("hw.cxgbe.nofldtxq10g", &t4_nofldtxq10g); @@ -174,7 +179,7 @@ TUNABLE_INT("hw.cxgbe.nofldrxq1g", &t4_nofldrxq1g); static int t4_tmr_idx_10g = TMR_IDX_10G; TUNABLE_INT("hw.cxgbe.holdoff_timer_idx_10G", &t4_tmr_idx_10g); -#define PKTC_IDX_10G 2 +#define PKTC_IDX_10G (-1) static int t4_pktc_idx_10g = PKTC_IDX_10G; TUNABLE_INT("hw.cxgbe.holdoff_pktc_idx_10G", &t4_pktc_idx_10g); @@ -182,7 +187,7 @@ TUNABLE_INT("hw.cxgbe.holdoff_pktc_idx_10G", &t4_pktc_idx_10g); static int t4_tmr_idx_1g = TMR_IDX_1G; TUNABLE_INT("hw.cxgbe.holdoff_timer_idx_1G", &t4_tmr_idx_1g); -#define PKTC_IDX_1G 2 +#define PKTC_IDX_1G (-1) static int t4_pktc_idx_1g = PKTC_IDX_1G; TUNABLE_INT("hw.cxgbe.holdoff_pktc_idx_1G", &t4_pktc_idx_1g); @@ -217,7 +222,7 @@ TUNABLE_INT("hw.cxgbe.linkcaps_allowed", &t4_linkcaps_allowed); static int t4_niccaps_allowed = FW_CAPS_CONFIG_NIC; TUNABLE_INT("hw.cxgbe.niccaps_allowed", &t4_niccaps_allowed); -static int t4_toecaps_allowed = FW_CAPS_CONFIG_TOE; +static int t4_toecaps_allowed = -1; TUNABLE_INT("hw.cxgbe.toecaps_allowed", &t4_toecaps_allowed); static int t4_rdmacaps_allowed = 0; @@ -237,7 +242,7 @@ struct intrs_and_queues { int nrxq10g; /* # of NIC rxq's for each 10G port */ int ntxq1g; /* # of NIC txq's for each 1G port */ int nrxq1g; /* # of NIC rxq's for each 1G port */ -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD int nofldtxq10g; /* # of TOE txq's for each 10G port */ int nofldrxq10g; /* # of TOE rxq's for each 10G port */ int nofldtxq1g; /* # of TOE txq's for each 1G port */ @@ -297,8 +302,10 @@ static void reg_block_dump(struct adapter *, uint8_t *, unsigned int, unsigned int); static void t4_get_regs(struct adapter *, struct t4_regdump *, uint8_t *); static void cxgbe_tick(void *); +static void cxgbe_vlan_config(void *, struct ifnet *, uint16_t); static int cpl_not_handled(struct sge_iq *, const struct rss_header *, struct mbuf *); +static int an_not_handled(struct sge_iq *, const struct rsp_ctrl *); static int t4_sysctls(struct adapter *); static int cxgbe_sysctls(struct port_info *); static int sysctl_int_array(SYSCTL_HANDLER_ARGS); @@ -342,34 +349,35 @@ static int filter_rpl(struct sge_iq *, const struct rss_header *, struct mbuf *); static int get_sge_context(struct adapter *, struct t4_sge_context *); static int read_card_mem(struct adapter *, struct t4_mem_range *); -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD static int toe_capability(struct port_info *, int); -static int activate_uld(struct adapter *, int, struct uld_softc *); -static int deactivate_uld(struct uld_softc *); #endif static int t4_mod_event(module_t, int, void *); struct t4_pciids { uint16_t device; - uint8_t mpf; char *desc; } t4_pciids[] = { - {0xa000, 0, "Chelsio Terminator 4 FPGA"}, - {0x4400, 4, "Chelsio T440-dbg"}, - {0x4401, 4, "Chelsio T420-CR"}, - {0x4402, 4, "Chelsio T422-CR"}, - {0x4403, 4, "Chelsio T440-CR"}, - {0x4404, 4, "Chelsio T420-BCH"}, - {0x4405, 4, "Chelsio T440-BCH"}, - {0x4406, 4, "Chelsio T440-CH"}, - {0x4407, 4, "Chelsio T420-SO"}, - {0x4408, 4, "Chelsio T420-CX"}, - {0x4409, 4, "Chelsio T420-BT"}, - {0x440a, 4, "Chelsio T404-BT"}, + {0xa000, "Chelsio Terminator 4 FPGA"}, + {0x4400, "Chelsio T440-dbg"}, + {0x4401, "Chelsio T420-CR"}, + {0x4402, "Chelsio T422-CR"}, + {0x4403, "Chelsio T440-CR"}, + {0x4404, "Chelsio T420-BCH"}, + {0x4405, "Chelsio T440-BCH"}, + {0x4406, "Chelsio T440-CH"}, + {0x4407, "Chelsio T420-SO"}, + {0x4408, "Chelsio T420-CX"}, + {0x4409, "Chelsio T420-BT"}, + {0x440a, "Chelsio T404-BT"}, }; -#ifndef TCP_OFFLOAD_DISABLE -/* This is used in service_iq() to get to the fl associated with an iq. */ +#ifdef TCP_OFFLOAD +/* + * service_iq() has an iq and needs the fl. Offset of fl from the iq should be + * exactly the same for both rxq and ofld_rxq. + */ +CTASSERT(offsetof(struct sge_ofld_rxq, iq) == offsetof(struct sge_rxq, iq)); CTASSERT(offsetof(struct sge_ofld_rxq, fl) == offsetof(struct sge_rxq, fl)); #endif @@ -379,13 +387,17 @@ t4_probe(device_t dev) int i; uint16_t v = pci_get_vendor(dev); uint16_t d = pci_get_device(dev); + uint8_t f = pci_get_function(dev); if (v != PCI_VENDOR_ID_CHELSIO) return (ENXIO); + /* Attach only to PF0 of the FPGA */ + if (d == 0xa000 && f != 0) + return (ENXIO); + for (i = 0; i < ARRAY_SIZE(t4_pciids); i++) { - if (d == t4_pciids[i].device && - pci_get_function(dev) == t4_pciids[i].mpf) { + if (d == t4_pciids[i].device) { device_set_desc(dev, t4_pciids[i].desc); return (BUS_PROBE_DEFAULT); } @@ -401,14 +413,12 @@ t4_attach(device_t dev) int rc = 0, i, n10g, n1g, rqidx, tqidx; struct intrs_and_queues iaq; struct sge *s; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD int ofld_rqidx, ofld_tqidx; #endif sc = device_get_softc(dev); sc->dev = dev; - sc->pf = pci_get_function(dev); - sc->mbox = sc->pf; pci_enable_busmaster(dev); if (pci_find_cap(dev, PCIY_EXPRESS, &i) == 0) { @@ -435,7 +445,17 @@ t4_attach(device_t dev) if (rc != 0) goto done; /* error message displayed already */ + /* + * This is the real PF# to which we're attaching. Works from within PCI + * passthrough environments too, where pci_get_function() could return a + * different PF# depending on the passthrough configuration. We need to + * use the real PF# in all our communication with the firmware. + */ + sc->pf = G_SOURCEPF(t4_read_reg(sc, A_PL_WHOAMI)); + sc->mbox = sc->pf; + memset(sc->chan_map, 0xff, sizeof(sc->chan_map)); + sc->an_handler = an_not_handled; for (i = 0; i < ARRAY_SIZE(sc->cpl_handler); i++) sc->cpl_handler[i] = cpl_not_handled; t4_register_cpl_handler(sc, CPL_SET_TCB_RPL, filter_rpl); @@ -595,7 +615,7 @@ t4_attach(device_t dev) s->neq += sc->params.nports + 1;/* ctrl queues: 1 per port + 1 mgmt */ s->niq = s->nrxq + 1; /* 1 extra for firmware event queue */ -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD if (is_offload(sc)) { s->nofldrxq = n10g * iaq.nofldrxq10g + n1g * iaq.nofldrxq1g; @@ -631,7 +651,7 @@ t4_attach(device_t dev) * tx queues that each port should get. */ rqidx = tqidx = 0; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD ofld_rqidx = ofld_tqidx = 0; #endif for_each_port(sc, i) { @@ -653,7 +673,7 @@ t4_attach(device_t dev) rqidx += pi->nrxq; tqidx += pi->ntxq; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD if (is_offload(sc)) { pi->first_ofld_rxq = ofld_rqidx; pi->first_ofld_txq = ofld_tqidx; @@ -761,7 +781,7 @@ t4_detach(device_t dev) if (sc->l2t) t4_free_l2t(sc->l2t); -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD free(sc->sge.ofld_rxq, M_CXGBE); free(sc->sge.ofld_txq, M_CXGBE); #endif @@ -803,8 +823,8 @@ cxgbe_probe(device_t dev) #define T4_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | \ IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO | \ - IFCAP_VLAN_HWTSO) -#define T4_CAP_ENABLE (T4_CAP & ~IFCAP_TSO6) + IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE | IFCAP_HWCSUM_IPV6) +#define T4_CAP_ENABLE (T4_CAP) static int cxgbe_attach(device_t dev) @@ -832,21 +852,25 @@ cxgbe_attach(device_t dev) ifp->if_qflush = cxgbe_qflush; ifp->if_capabilities = T4_CAP; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD if (is_offload(pi->adapter)) ifp->if_capabilities |= IFCAP_TOE4; #endif ifp->if_capenable = T4_CAP_ENABLE; - ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO; + ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO | + CSUM_UDP_IPV6 | CSUM_TCP_IPV6; /* Initialize ifmedia for this port */ ifmedia_init(&pi->media, IFM_IMASK, cxgbe_media_change, cxgbe_media_status); build_medialist(pi); + pi->vlan_c = EVENTHANDLER_REGISTER(vlan_config, cxgbe_vlan_config, ifp, + EVENTHANDLER_PRI_ANY); + ether_ifattach(ifp, pi->hw_addr); -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD if (is_offload(pi->adapter)) { device_printf(dev, "%d txq, %d rxq (NIC); %d txq, %d rxq (TOE)\n", @@ -876,6 +900,9 @@ cxgbe_detach(device_t dev) SET_BUSY(sc); ADAPTER_UNLOCK(sc); + if (pi->vlan_c) + EVENTHANDLER_DEREGISTER(vlan_config, pi->vlan_c); + PORT_LOCK(pi); ifp->if_drv_flags &= ~IFF_DRV_RUNNING; callout_stop(&pi->tick); @@ -1001,35 +1028,55 @@ fail: ifp->if_capenable ^= IFCAP_TXCSUM; ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP); - if (IFCAP_TSO & ifp->if_capenable && + if (IFCAP_TSO4 & ifp->if_capenable && !(IFCAP_TXCSUM & ifp->if_capenable)) { - ifp->if_capenable &= ~IFCAP_TSO; - ifp->if_hwassist &= ~CSUM_TSO; + ifp->if_capenable &= ~IFCAP_TSO4; if_printf(ifp, - "tso disabled due to -txcsum.\n"); + "tso4 disabled due to -txcsum.\n"); + } + } + if (mask & IFCAP_TXCSUM_IPV6) { + ifp->if_capenable ^= IFCAP_TXCSUM_IPV6; + ifp->if_hwassist ^= (CSUM_UDP_IPV6 | CSUM_TCP_IPV6); + + if (IFCAP_TSO6 & ifp->if_capenable && + !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) { + ifp->if_capenable &= ~IFCAP_TSO6; + if_printf(ifp, + "tso6 disabled due to -txcsum6.\n"); } } if (mask & IFCAP_RXCSUM) ifp->if_capenable ^= IFCAP_RXCSUM; - if (mask & IFCAP_TSO4) { - ifp->if_capenable ^= IFCAP_TSO4; + if (mask & IFCAP_RXCSUM_IPV6) + ifp->if_capenable ^= IFCAP_RXCSUM_IPV6; - if (IFCAP_TSO & ifp->if_capenable) { - if (IFCAP_TXCSUM & ifp->if_capenable) - ifp->if_hwassist |= CSUM_TSO; - else { - ifp->if_capenable &= ~IFCAP_TSO; - ifp->if_hwassist &= ~CSUM_TSO; - if_printf(ifp, - "enable txcsum first.\n"); - rc = EAGAIN; - goto fail; - } - } else - ifp->if_hwassist &= ~CSUM_TSO; + /* + * Note that we leave CSUM_TSO alone (it is always set). The + * kernel takes both IFCAP_TSOx and CSUM_TSO into account before + * sending a TSO request our way, so it's sufficient to toggle + * IFCAP_TSOx only. + */ + if (mask & IFCAP_TSO4) { + if (!(IFCAP_TSO4 & ifp->if_capenable) && + !(IFCAP_TXCSUM & ifp->if_capenable)) { + if_printf(ifp, "enable txcsum first.\n"); + rc = EAGAIN; + goto fail; + } + ifp->if_capenable ^= IFCAP_TSO4; + } + if (mask & IFCAP_TSO6) { + if (!(IFCAP_TSO6 & ifp->if_capenable) && + !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) { + if_printf(ifp, "enable txcsum6 first.\n"); + rc = EAGAIN; + goto fail; + } + ifp->if_capenable ^= IFCAP_TSO6; } if (mask & IFCAP_LRO) { -#ifdef INET +#if defined(INET) || defined(INET6) int i; struct sge_rxq *rxq; @@ -1042,7 +1089,7 @@ fail: } #endif } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD if (mask & IFCAP_TOE) { int enable = (ifp->if_capenable ^ mask) & IFCAP_TOE; @@ -1262,9 +1309,17 @@ map_bars(struct adapter *sc) static void setup_memwin(struct adapter *sc) { - u_long bar0; + uint32_t bar0; - bar0 = rman_get_start(sc->regs_res); + /* + * Read low 32b of bar0 indirectly via the hardware backdoor mechanism. + * Works from within PCI passthrough environments too, where + * rman_get_start() can return a different value. We need to program + * the memory window decoders with the actual addresses that will be + * coming across the PCIe link. + */ + bar0 = t4_hw_pci_read_cfg4(sc, PCIR_BAR(0)); + bar0 &= (uint32_t) PCIM_BAR_MEM_BASE; t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 0), (bar0 + MEMWIN0_BASE) | V_BIR(0) | @@ -1277,6 +1332,9 @@ setup_memwin(struct adapter *sc) t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 2), (bar0 + MEMWIN2_BASE) | V_BIR(0) | V_WINDOW(ilog2(MEMWIN2_APERTURE) - 10)); + + /* flush */ + t4_read_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 2)); } static int @@ -1292,11 +1350,13 @@ cfg_itype_and_nqueues(struct adapter *sc, int n10g, int n1g, iaq->ntxq1g = t4_ntxq1g; iaq->nrxq10g = nrxq10g = t4_nrxq10g; iaq->nrxq1g = nrxq1g = t4_nrxq1g; -#ifndef TCP_OFFLOAD_DISABLE - iaq->nofldtxq10g = t4_nofldtxq10g; - iaq->nofldtxq1g = t4_nofldtxq1g; - iaq->nofldrxq10g = nofldrxq10g = t4_nofldrxq10g; - iaq->nofldrxq1g = nofldrxq1g = t4_nofldrxq1g; +#ifdef TCP_OFFLOAD + if (is_offload(sc)) { + iaq->nofldtxq10g = t4_nofldtxq10g; + iaq->nofldtxq1g = t4_nofldtxq1g; + iaq->nofldrxq10g = nofldrxq10g = t4_nofldrxq10g; + iaq->nofldrxq1g = nofldrxq1g = t4_nofldrxq1g; + } #endif for (itype = INTR_MSIX; itype; itype >>= 1) { @@ -1364,8 +1424,9 @@ restart: n++; } iaq->nrxq10g = min(n, nrxq10g); -#ifndef TCP_OFFLOAD_DISABLE - iaq->nofldrxq10g = min(n, nofldrxq10g); +#ifdef TCP_OFFLOAD + if (is_offload(sc)) + iaq->nofldrxq10g = min(n, nofldrxq10g); #endif } @@ -1379,8 +1440,9 @@ restart: n++; } iaq->nrxq1g = min(n, nrxq1g); -#ifndef TCP_OFFLOAD_DISABLE - iaq->nofldrxq1g = min(n, nofldrxq1g); +#ifdef TCP_OFFLOAD + if (is_offload(sc)) + iaq->nofldrxq1g = min(n, nofldrxq1g); #endif } @@ -1392,8 +1454,9 @@ restart: * Least desirable option: one interrupt vector for everything. */ iaq->nirq = iaq->nrxq10g = iaq->nrxq1g = 1; -#ifndef TCP_OFFLOAD_DISABLE - iaq->nofldrxq10g = iaq->nofldrxq1g = 1; +#ifdef TCP_OFFLOAD + if (is_offload(sc)) + iaq->nofldrxq10g = iaq->nofldrxq1g = 1; #endif allocate: @@ -1449,6 +1512,11 @@ prep_firmware(struct adapter *sc) /* Check firmware version and install a different one if necessary */ rc = t4_check_fw_version(sc); + snprintf(sc->fw_version, sizeof(sc->fw_version), "%u.%u.%u.%u", + G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers), + G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers), + G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers), + G_FW_HDR_FW_VER_BUILD(sc->params.fw_vers)); if (rc != 0) { uint32_t v = 0; @@ -1505,6 +1573,12 @@ prep_firmware(struct adapter *sc) } else { /* refresh */ (void) t4_check_fw_version(sc); + snprintf(sc->fw_version, + sizeof(sc->fw_version), "%u.%u.%u.%u", + G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers), + G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers), + G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers), + G_FW_HDR_FW_VER_BUILD(sc->params.fw_vers)); } } } @@ -1548,11 +1622,6 @@ prep_firmware(struct adapter *sc) goto done; /* error message displayed already */ } - snprintf(sc->fw_version, sizeof(sc->fw_version), "%u.%u.%u.%u", - G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers), - G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers), - G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers), - G_FW_HDR_FW_VER_BUILD(sc->params.fw_vers)); sc->flags |= FW_OK; done: @@ -2074,7 +2143,7 @@ update_mac_settings(struct port_info *pi, int flags) if_maddr_rlock(ifp); TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family == AF_LINK) + if (ifma->ifma_addr->sa_family != AF_LINK) continue; mcaddr[i++] = LLADDR((struct sockaddr_dl *)ifma->ifma_addr); @@ -2299,7 +2368,7 @@ adapter_full_init(struct adapter *sc) struct irq *irq; struct port_info *pi; struct sge_rxq *rxq; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD struct sge_ofld_rxq *ofld_rxq; #endif @@ -2363,7 +2432,7 @@ adapter_full_init(struct adapter *sc) for_each_port(sc, p) { pi = sc->port[p]; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD /* * Skip over the NIC queues if they aren't taking direct * interrupts. @@ -2380,7 +2449,7 @@ adapter_full_init(struct adapter *sc) rid++; } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD /* * Skip over the offload queues if they aren't taking * direct interrupts. @@ -2488,7 +2557,7 @@ port_full_uninit(struct port_info *pi) int i; struct sge_rxq *rxq; struct sge_txq *txq; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD struct sge_ofld_rxq *ofld_rxq; struct sge_wrq *ofld_txq; #endif @@ -2501,7 +2570,7 @@ port_full_uninit(struct port_info *pi) quiesce_eq(sc, &txq->eq); } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD for_each_ofld_txq(pi, i, ofld_txq) { quiesce_eq(sc, &ofld_txq->eq); } @@ -2512,7 +2581,7 @@ port_full_uninit(struct port_info *pi) quiesce_fl(sc, &rxq->fl); } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD for_each_ofld_rxq(pi, i, ofld_rxq) { quiesce_iq(sc, &ofld_rxq->iq); quiesce_fl(sc, &ofld_rxq->fl); @@ -2684,7 +2753,9 @@ t4_get_regs(struct adapter *sc, struct t4_regdump *regs, uint8_t *buf) 0xdfc0, 0xdfe0, 0xe000, 0xea7c, 0xf000, 0x11190, - 0x19040, 0x19124, + 0x19040, 0x1906c, + 0x19078, 0x19080, + 0x1908c, 0x19124, 0x19150, 0x191b0, 0x191d0, 0x191e8, 0x19238, 0x1924c, @@ -2697,49 +2768,49 @@ t4_get_regs(struct adapter *sc, struct t4_regdump *regs, uint8_t *buf) 0x1a190, 0x1a1c4, 0x1a1fc, 0x1a1fc, 0x1e040, 0x1e04c, - 0x1e240, 0x1e28c, + 0x1e284, 0x1e28c, 0x1e2c0, 0x1e2c0, 0x1e2e0, 0x1e2e0, 0x1e300, 0x1e384, 0x1e3c0, 0x1e3c8, 0x1e440, 0x1e44c, - 0x1e640, 0x1e68c, + 0x1e684, 0x1e68c, 0x1e6c0, 0x1e6c0, 0x1e6e0, 0x1e6e0, 0x1e700, 0x1e784, 0x1e7c0, 0x1e7c8, 0x1e840, 0x1e84c, - 0x1ea40, 0x1ea8c, + 0x1ea84, 0x1ea8c, 0x1eac0, 0x1eac0, 0x1eae0, 0x1eae0, 0x1eb00, 0x1eb84, 0x1ebc0, 0x1ebc8, 0x1ec40, 0x1ec4c, - 0x1ee40, 0x1ee8c, + 0x1ee84, 0x1ee8c, 0x1eec0, 0x1eec0, 0x1eee0, 0x1eee0, 0x1ef00, 0x1ef84, 0x1efc0, 0x1efc8, 0x1f040, 0x1f04c, - 0x1f240, 0x1f28c, + 0x1f284, 0x1f28c, 0x1f2c0, 0x1f2c0, 0x1f2e0, 0x1f2e0, 0x1f300, 0x1f384, 0x1f3c0, 0x1f3c8, 0x1f440, 0x1f44c, - 0x1f640, 0x1f68c, + 0x1f684, 0x1f68c, 0x1f6c0, 0x1f6c0, 0x1f6e0, 0x1f6e0, 0x1f700, 0x1f784, 0x1f7c0, 0x1f7c8, 0x1f840, 0x1f84c, - 0x1fa40, 0x1fa8c, + 0x1fa84, 0x1fa8c, 0x1fac0, 0x1fac0, 0x1fae0, 0x1fae0, 0x1fb00, 0x1fb84, 0x1fbc0, 0x1fbc8, 0x1fc40, 0x1fc4c, - 0x1fe40, 0x1fe8c, + 0x1fe84, 0x1fe8c, 0x1fec0, 0x1fec0, 0x1fee0, 0x1fee0, 0x1ff00, 0x1ff84, @@ -2886,14 +2957,27 @@ cxgbe_tick(void *arg) PORT_UNLOCK(pi); } +static void +cxgbe_vlan_config(void *arg, struct ifnet *ifp, uint16_t vid) +{ + struct ifnet *vlan; + + if (arg != ifp) + return; + + vlan = VLAN_DEVAT(ifp, vid); + VLAN_SETCOOKIE(vlan, ifp); +} + static int cpl_not_handled(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) { + #ifdef INVARIANTS - panic("%s: opcode %02x on iq %p with payload %p", + panic("%s: opcode 0x%02x on iq %p with payload %p", __func__, rss->opcode, iq, m); #else - log(LOG_ERR, "%s: opcode %02x on iq %p with payload %p", + log(LOG_ERR, "%s: opcode 0x%02x on iq %p with payload %p", __func__, rss->opcode, iq, m); m_freem(m); #endif @@ -2915,6 +2999,31 @@ t4_register_cpl_handler(struct adapter *sc, int opcode, cpl_handler_t h) return (0); } +static int +an_not_handled(struct sge_iq *iq, const struct rsp_ctrl *ctrl) +{ + +#ifdef INVARIANTS + panic("%s: async notification on iq %p (ctrl %p)", __func__, iq, ctrl); +#else + log(LOG_ERR, "%s: async notification on iq %p (ctrl %p)", + __func__, iq, ctrl); +#endif + return (EDOOFUS); +} + +int +t4_register_an_handler(struct adapter *sc, an_handler_t h) +{ + uintptr_t *loc, new; + + new = h ? (uintptr_t)h : (uintptr_t)an_not_handled; + loc = (uintptr_t *) &sc->an_handler; + atomic_store_rel_ptr(loc, new); + + return (0); +} + static int t4_sysctls(struct adapter *sc) { @@ -3066,7 +3175,7 @@ t4_sysctls(struct adapter *sc) sysctl_tx_rate, "A", "Tx rate"); #endif -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD if (is_offload(sc)) { /* * dev.t4nex.X.toe. @@ -3119,7 +3228,7 @@ cxgbe_sysctls(struct port_info *pi) SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_txq", CTLFLAG_RD, &pi->first_txq, 0, "index of first tx queue"); -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD if (is_offload(pi->adapter)) { SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nofldrxq", CTLFLAG_RD, &pi->nofldrxq, 0, @@ -4537,7 +4646,7 @@ set_filter_mode(struct adapter *sc, uint32_t mode) goto done; } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD if (sc->offload_map) { rc = EBUSY; goto done; @@ -4728,7 +4837,7 @@ static int set_filter_wr(struct adapter *sc, int fidx) { struct filter_entry *f = &sc->tids.ftid_tab[fidx]; - struct mbuf *m; + struct wrqe *wr; struct fw_filter_wr *fwr; unsigned int ftid; @@ -4749,12 +4858,11 @@ set_filter_wr(struct adapter *sc, int fidx) ftid = sc->tids.ftid_base + fidx; - m = m_gethdr(M_NOWAIT, MT_DATA); - if (m == NULL) + wr = alloc_wrqe(sizeof(*fwr), &sc->sge.mgmtq); + if (wr == NULL) return (ENOMEM); - fwr = mtod(m, struct fw_filter_wr *); - m->m_len = m->m_pkthdr.len = sizeof(*fwr); + fwr = wrtod(wr); bzero(fwr, sizeof (*fwr)); fwr->op_pkd = htobe32(V_FW_WR_OP(FW_FILTER_WR)); @@ -4824,7 +4932,7 @@ set_filter_wr(struct adapter *sc, int fidx) f->pending = 1; sc->tids.ftids_in_use++; - t4_mgmt_tx(sc, m); + t4_wrq_tx(sc, wr); return (0); } @@ -4832,7 +4940,7 @@ static int del_filter_wr(struct adapter *sc, int fidx) { struct filter_entry *f = &sc->tids.ftid_tab[fidx]; - struct mbuf *m; + struct wrqe *wr; struct fw_filter_wr *fwr; unsigned int ftid; @@ -4840,18 +4948,16 @@ del_filter_wr(struct adapter *sc, int fidx) ftid = sc->tids.ftid_base + fidx; - m = m_gethdr(M_NOWAIT, MT_DATA); - if (m == NULL) + wr = alloc_wrqe(sizeof(*fwr), &sc->sge.mgmtq); + if (wr == NULL) return (ENOMEM); - - fwr = mtod(m, struct fw_filter_wr *); - m->m_len = m->m_pkthdr.len = sizeof(*fwr); + fwr = wrtod(wr); bzero(fwr, sizeof (*fwr)); t4_mk_filtdelwr(ftid, fwr, sc->sge.fwq.abs_id); f->pending = 1; - t4_mgmt_tx(sc, m); + t4_wrq_tx(sc, wr); return (0); } @@ -5209,7 +5315,7 @@ t4_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data, int fflag, return (rc); } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD static int toe_capability(struct port_info *pi, int enable) { @@ -5222,13 +5328,28 @@ toe_capability(struct port_info *pi, int enable) return (ENODEV); if (enable) { + if (!(sc->flags & FULL_INIT_DONE)) { + log(LOG_WARNING, + "You must enable a cxgbe interface first\n"); + return (EAGAIN); + } + if (isset(&sc->offload_map, pi->port_id)) return (0); - if (sc->offload_map == 0) { - rc = activate_uld(sc, ULD_TOM, &sc->tom); + if (!(sc->flags & TOM_INIT_DONE)) { + rc = t4_activate_uld(sc, ULD_TOM); + if (rc == EAGAIN) { + log(LOG_WARNING, + "You must kldload t4_tom.ko before trying " + "to enable TOE on a cxgbe interface.\n"); + } if (rc != 0) return (rc); + KASSERT(sc->tom_softc != NULL, + ("%s: TOM activated but softc NULL", __func__)); + KASSERT(sc->flags & TOM_INIT_DONE, + ("%s: TOM activated but flag not set", __func__)); } setbit(&sc->offload_map, pi->port_id); @@ -5236,15 +5357,9 @@ toe_capability(struct port_info *pi, int enable) if (!isset(&sc->offload_map, pi->port_id)) return (0); + KASSERT(sc->flags & TOM_INIT_DONE, + ("%s: TOM never initialized?", __func__)); clrbit(&sc->offload_map, pi->port_id); - - if (sc->offload_map == 0) { - rc = deactivate_uld(&sc->tom); - if (rc != 0) { - setbit(&sc->offload_map, pi->port_id); - return (rc); - } - } } return (0); @@ -5299,8 +5414,8 @@ done: return (rc); } -static int -activate_uld(struct adapter *sc, int id, struct uld_softc *usc) +int +t4_activate_uld(struct adapter *sc, int id) { int rc = EAGAIN; struct uld_info *ui; @@ -5309,13 +5424,9 @@ activate_uld(struct adapter *sc, int id, struct uld_softc *usc) SLIST_FOREACH(ui, &t4_uld_list, link) { if (ui->uld_id == id) { - rc = ui->attach(sc, &usc->softc); - if (rc == 0) { - KASSERT(usc->softc != NULL, - ("%s: ULD %d has no state", __func__, id)); + rc = ui->activate(sc); + if (rc == 0) ui->refcount++; - usc->uld = ui; - } goto done; } } @@ -5325,25 +5436,21 @@ done: return (rc); } -static int -deactivate_uld(struct uld_softc *usc) +int +t4_deactivate_uld(struct adapter *sc, int id) { - int rc; + int rc = EINVAL; + struct uld_info *ui; mtx_lock(&t4_uld_list_lock); - if (usc->uld == NULL || usc->softc == NULL) { - rc = EINVAL; - goto done; - } - - rc = usc->uld->detach(usc->softc); - if (rc == 0) { - KASSERT(usc->uld->refcount > 0, - ("%s: ULD has bad refcount", __func__)); - usc->uld->refcount--; - usc->uld = NULL; - usc->softc = NULL; + SLIST_FOREACH(ui, &t4_uld_list, link) { + if (ui->uld_id == id) { + rc = ui->deactivate(sc); + if (rc == 0) + ui->refcount--; + goto done; + } } done: mtx_unlock(&t4_uld_list_lock); @@ -5373,7 +5480,7 @@ tweak_tunables(void) if (t4_nrxq1g < 1) t4_nrxq1g = min(nc, NRXQ_1G); -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD if (t4_nofldtxq10g < 1) t4_nofldtxq10g = min(nc, NOFLDTXQ_10G); @@ -5385,6 +5492,12 @@ tweak_tunables(void) if (t4_nofldrxq1g < 1) t4_nofldrxq1g = min(nc, NOFLDRXQ_1G); + + if (t4_toecaps_allowed == -1) + t4_toecaps_allowed = FW_CAPS_CONFIG_TOE; +#else + if (t4_toecaps_allowed == -1) + t4_toecaps_allowed = 0; #endif if (t4_tmr_idx_10g < 0 || t4_tmr_idx_10g >= SGE_NTIMERS) @@ -5420,7 +5533,7 @@ t4_mod_event(module_t mod, int cmd, void *arg) t4_sge_modload(); mtx_init(&t4_list_lock, "T4 adapters", 0, MTX_DEF); SLIST_INIT(&t4_list); -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD mtx_init(&t4_uld_list_lock, "T4 ULDs", 0, MTX_DEF); SLIST_INIT(&t4_uld_list); #endif @@ -5428,7 +5541,7 @@ t4_mod_event(module_t mod, int cmd, void *arg) break; case MOD_UNLOAD: -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD mtx_lock(&t4_uld_list_lock); if (!SLIST_EMPTY(&t4_uld_list)) { rc = EBUSY; diff --git a/sys/dev/cxgbe/t4_sge.c b/sys/dev/cxgbe/t4_sge.c index 41630e4f9cf..4ded12d965c 100644 --- a/sys/dev/cxgbe/t4_sge.c +++ b/sys/dev/cxgbe/t4_sge.c @@ -29,11 +29,13 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" +#include "opt_inet6.h" #include #include #include #include +#include #include #include #include @@ -45,13 +47,13 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include "common/common.h" #include "common/t4_regs.h" #include "common/t4_regs_values.h" #include "common/t4_msg.h" -#include "t4_l2t.h" struct fl_buf_info { int size; @@ -70,12 +72,8 @@ enum { FL_PKTSHIFT = 2 }; -#define FL_ALIGN min(CACHE_LINE_SIZE, 32) -#if CACHE_LINE_SIZE > 64 -#define SPG_LEN 128 -#else -#define SPG_LEN 64 -#endif +static int fl_pad = CACHE_LINE_SIZE; +static int spg_len = 64; /* Used to track coalesced tx work request */ struct txpkts { @@ -115,14 +113,14 @@ static int free_mgmtq(struct adapter *); static int alloc_rxq(struct port_info *, struct sge_rxq *, int, int, struct sysctl_oid *); static int free_rxq(struct port_info *, struct sge_rxq *); -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD static int alloc_ofld_rxq(struct port_info *, struct sge_ofld_rxq *, int, int, struct sysctl_oid *); static int free_ofld_rxq(struct port_info *, struct sge_ofld_rxq *); #endif static int ctrl_eq_alloc(struct adapter *, struct sge_eq *); static int eth_eq_alloc(struct adapter *, struct port_info *, struct sge_eq *); -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD static int ofld_eq_alloc(struct adapter *, struct port_info *, struct sge_eq *); #endif static int alloc_eq(struct adapter *, struct port_info *, struct sge_eq *); @@ -167,6 +165,10 @@ static int handle_fw_rpl(struct sge_iq *, const struct rss_header *, static int sysctl_uint16(SYSCTL_HANDLER_ARGS); +#if defined(__i386__) || defined(__amd64__) +extern u_int cpu_clflush_line_size; +#endif + /* * Called on MOD_LOAD and fills up fl_buf_info[]. */ @@ -188,6 +190,11 @@ t4_sge_modload(void) FL_BUF_TYPE(i) = m_gettype(bufsize[i]); FL_BUF_ZONE(i) = m_getzone(bufsize[i]); } + +#if defined(__i386__) || defined(__amd64__) + fl_pad = max(cpu_clflush_line_size, 32); + spg_len = cpu_clflush_line_size > 64 ? 128 : 64; +#endif } /** @@ -209,8 +216,8 @@ t4_sge_init(struct adapter *sc) V_INGPADBOUNDARY(M_INGPADBOUNDARY) | F_EGRSTATUSPAGESIZE; ctrl_val = V_PKTSHIFT(FL_PKTSHIFT) | F_RXPKTCPLMODE | - V_INGPADBOUNDARY(ilog2(FL_ALIGN) - 5) | - V_EGRSTATUSPAGESIZE(SPG_LEN == 128); + V_INGPADBOUNDARY(ilog2(fl_pad) - 5) | + V_EGRSTATUSPAGESIZE(spg_len == 128); hpsize = V_HOSTPAGESIZEPF0(PAGE_SHIFT - 10) | V_HOSTPAGESIZEPF1(PAGE_SHIFT - 10) | @@ -394,14 +401,16 @@ first_vector(struct port_info *pi) return (0); for_each_port(sc, i) { + struct port_info *p = sc->port[i]; + if (i == pi->port_id) break; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD if (sc->flags & INTR_DIRECT) - rc += pi->nrxq + pi->nofldrxq; + rc += p->nrxq + p->nofldrxq; else - rc += max(pi->nrxq, pi->nofldrxq); + rc += max(p->nrxq, p->nofldrxq); #else /* * Not compiled with offload support and intr_count > 1. Only @@ -412,7 +421,7 @@ first_vector(struct port_info *pi) ("%s: intr_count %d, !INTR_DIRECT", __func__, sc->intr_count)); - rc += pi->nrxq; + rc += p->nrxq; #endif } @@ -434,7 +443,7 @@ port_intr_iq(struct port_info *pi, int idx) if (sc->intr_count == 1) return (&sc->sge.fwq); -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD if (sc->flags & INTR_DIRECT) { idx %= pi->nrxq + pi->nofldrxq; @@ -475,19 +484,20 @@ t4_setup_port_queues(struct port_info *pi) struct sge_rxq *rxq; struct sge_txq *txq; struct sge_wrq *ctrlq; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD struct sge_ofld_rxq *ofld_rxq; struct sge_wrq *ofld_txq; + struct sysctl_oid *oid2 = NULL; #endif char name[16]; struct adapter *sc = pi->adapter; - struct sysctl_oid *oid = device_get_sysctl_tree(pi->dev), *oid2 = NULL; + struct sysctl_oid *oid = device_get_sysctl_tree(pi->dev); struct sysctl_oid_list *children = SYSCTL_CHILDREN(oid); oid = SYSCTL_ADD_NODE(&pi->ctx, children, OID_AUTO, "rxq", CTLFLAG_RD, NULL, "rx queues"); -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD if (is_offload(sc)) { oid2 = SYSCTL_ADD_NODE(&pi->ctx, children, OID_AUTO, "ofld_rxq", CTLFLAG_RD, NULL, @@ -515,7 +525,7 @@ t4_setup_port_queues(struct port_info *pi) init_fl(&rxq->fl, pi->qsize_rxq / 8, pi->ifp->if_mtu, name); if (sc->flags & INTR_DIRECT -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD || (sc->intr_count > 1 && pi->nrxq >= pi->nofldrxq) #endif ) { @@ -527,7 +537,7 @@ t4_setup_port_queues(struct port_info *pi) } } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD for_each_ofld_rxq(pi, i, ofld_rxq) { snprintf(name, sizeof(name), "%s ofld_rxq%d-iq", @@ -567,7 +577,7 @@ t4_setup_port_queues(struct port_info *pi) j++; } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD for_each_ofld_rxq(pi, i, ofld_rxq) { if (ofld_rxq->iq.flags & IQ_INTR) continue; @@ -603,7 +613,7 @@ t4_setup_port_queues(struct port_info *pi) j++; } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD oid = SYSCTL_ADD_NODE(&pi->ctx, children, OID_AUTO, "ofld_txq", CTLFLAG_RD, NULL, "tx queues for offloaded TCP connections"); for_each_ofld_txq(pi, i, ofld_txq) { @@ -655,7 +665,7 @@ t4_teardown_port_queues(struct port_info *pi) struct adapter *sc = pi->adapter; struct sge_rxq *rxq; struct sge_txq *txq; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD struct sge_ofld_rxq *ofld_rxq; struct sge_wrq *ofld_txq; #endif @@ -677,7 +687,7 @@ t4_teardown_port_queues(struct port_info *pi) free_txq(pi, txq); } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD for_each_ofld_txq(pi, i, ofld_txq) { free_wrq(sc, ofld_txq); } @@ -693,7 +703,7 @@ t4_teardown_port_queues(struct port_info *pi) free_rxq(pi, rxq); } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD for_each_ofld_rxq(pi, i, ofld_rxq) { if ((ofld_rxq->iq.flags & IQ_INTR) == 0) free_ofld_rxq(pi, ofld_rxq); @@ -709,7 +719,7 @@ t4_teardown_port_queues(struct port_info *pi) free_rxq(pi, rxq); } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD for_each_ofld_rxq(pi, i, ofld_rxq) { if (ofld_rxq->iq.flags & IQ_INTR) free_ofld_rxq(pi, ofld_rxq); @@ -775,7 +785,7 @@ static int service_iq(struct sge_iq *iq, int budget) { struct sge_iq *q; - struct sge_rxq *rxq = (void *)iq; /* Use iff iq is part of rxq */ + struct sge_rxq *rxq = iq_to_rxq(iq); /* Use iff iq is part of rxq */ struct sge_fl *fl = &rxq->fl; /* Use iff IQ_HAS_FL */ struct adapter *sc = iq->adapter; struct rsp_ctrl *ctrl; @@ -862,7 +872,8 @@ service_iq(struct sge_iq *iq, int budget) break; default: - panic("%s: rsp_type %u", __func__, rsp_type); + sc->an_handler(iq, ctrl); + break; } iq_next(iq); @@ -901,7 +912,7 @@ service_iq(struct sge_iq *iq, int budget) STAILQ_INSERT_TAIL(&iql, q, link); } -#ifdef INET +#if defined(INET) || defined(INET6) if (iq->flags & IQ_LRO_ENABLED) { struct lro_ctrl *lro = &rxq->lro; struct lro_entry *l; @@ -1029,10 +1040,10 @@ get_fl_payload(struct adapter *sc, struct sge_fl *fl, uint32_t len_newbuf, static int t4_eth_rx(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m0) { - struct sge_rxq *rxq = (void *)iq; + struct sge_rxq *rxq = iq_to_rxq(iq); struct ifnet *ifp = rxq->ifp; const struct cpl_rx_pkt *cpl = (const void *)(rss + 1); -#ifdef INET +#if defined(INET) || defined(INET6) struct lro_ctrl *lro = &rxq->lro; #endif @@ -1047,15 +1058,23 @@ t4_eth_rx(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m0) m0->m_flags |= M_FLOWID; m0->m_pkthdr.flowid = rss->hash_val; - if (cpl->csum_calc && !cpl->err_vec && - ifp->if_capenable & IFCAP_RXCSUM) { - m0->m_pkthdr.csum_flags |= (CSUM_IP_CHECKED | - CSUM_IP_VALID | CSUM_DATA_VALID | CSUM_PSEUDO_HDR); - if (cpl->ip_frag) + if (cpl->csum_calc && !cpl->err_vec) { + if (ifp->if_capenable & IFCAP_RXCSUM && + cpl->l2info & htobe32(F_RXF_IP)) { + m0->m_pkthdr.csum_flags = (CSUM_IP_CHECKED | + CSUM_IP_VALID | CSUM_DATA_VALID | CSUM_PSEUDO_HDR); + rxq->rxcsum++; + } else if (ifp->if_capenable & IFCAP_RXCSUM_IPV6 && + cpl->l2info & htobe32(F_RXF_IP6)) { + m0->m_pkthdr.csum_flags = (CSUM_DATA_VALID_IPV6 | + CSUM_PSEUDO_HDR); + rxq->rxcsum++; + } + + if (__predict_false(cpl->ip_frag)) m0->m_pkthdr.csum_data = be16toh(cpl->csum); else m0->m_pkthdr.csum_data = 0xffff; - rxq->rxcsum++; } if (cpl->vlan_ex) { @@ -1064,7 +1083,7 @@ t4_eth_rx(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m0) rxq->vlan_extraction++; } -#ifdef INET +#if defined(INET) || defined(INET6) if (cpl->l2info & htobe32(F_RXF_LRO) && iq->flags & IQ_LRO_ENABLED && tcp_lro_rx(lro, m0, 0) == 0) { @@ -1076,42 +1095,33 @@ t4_eth_rx(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m0) return (0); } -int -t4_mgmt_tx(struct adapter *sc, struct mbuf *m) -{ - return t4_wrq_tx(sc, &sc->sge.mgmtq, m); -} - /* * Doesn't fail. Holds on to work requests it can't send right away. */ -int -t4_wrq_tx_locked(struct adapter *sc, struct sge_wrq *wrq, struct mbuf *m0) +void +t4_wrq_tx_locked(struct adapter *sc, struct sge_wrq *wrq, struct wrqe *wr) { struct sge_eq *eq = &wrq->eq; int can_reclaim; caddr_t dst; - struct mbuf *wr, *next; TXQ_LOCK_ASSERT_OWNED(wrq); +#ifdef TCP_OFFLOAD KASSERT((eq->flags & EQ_TYPEMASK) == EQ_OFLD || (eq->flags & EQ_TYPEMASK) == EQ_CTRL, ("%s: eq type %d", __func__, eq->flags & EQ_TYPEMASK)); +#else + KASSERT((eq->flags & EQ_TYPEMASK) == EQ_CTRL, + ("%s: eq type %d", __func__, eq->flags & EQ_TYPEMASK)); +#endif - if (__predict_true(m0 != NULL)) { - if (wrq->head) - wrq->tail->m_nextpkt = m0; - else - wrq->head = m0; - while (m0->m_nextpkt) - m0 = m0->m_nextpkt; - wrq->tail = m0; - } + if (__predict_true(wr != NULL)) + STAILQ_INSERT_TAIL(&wrq->wr_list, wr, link); can_reclaim = reclaimable(eq); if (__predict_false(eq->flags & EQ_STALLED)) { if (can_reclaim < tx_resume_threshold(eq)) - return (0); + return; eq->flags &= ~EQ_STALLED; eq->unstalled++; } @@ -1120,39 +1130,34 @@ t4_wrq_tx_locked(struct adapter *sc, struct sge_wrq *wrq, struct mbuf *m0) if (__predict_false(eq->cidx >= eq->cap)) eq->cidx -= eq->cap; - for (wr = wrq->head; wr; wr = next) { + while ((wr = STAILQ_FIRST(&wrq->wr_list)) != NULL) { int ndesc; - struct mbuf *m; - next = wr->m_nextpkt; - wr->m_nextpkt = NULL; + if (__predict_false(wr->wr_len < 0 || + wr->wr_len > SGE_MAX_WR_LEN || (wr->wr_len & 0x7))) { - M_ASSERTPKTHDR(wr); - KASSERT(wr->m_pkthdr.len > 0 && (wr->m_pkthdr.len & 0x7) == 0, - ("%s: work request len %d.", __func__, wr->m_pkthdr.len)); - - if (wr->m_pkthdr.len > SGE_MAX_WR_LEN) { #ifdef INVARIANTS - panic("%s: oversized work request", __func__); -#else - log(LOG_ERR, "%s: %s work request too long (%d)", - device_get_nameunit(sc->dev), __func__, - wr->m_pkthdr.len); - m_freem(wr); - continue; + panic("%s: work request with length %d", __func__, + wr->wr_len); #endif +#ifdef KDB + kdb_backtrace(); +#endif + log(LOG_ERR, "%s: %s work request with length %d", + device_get_nameunit(sc->dev), __func__, wr->wr_len); + STAILQ_REMOVE_HEAD(&wrq->wr_list, link); + free_wrqe(wr); + continue; } - ndesc = howmany(wr->m_pkthdr.len, EQ_ESIZE); + ndesc = howmany(wr->wr_len, EQ_ESIZE); if (eq->avail < ndesc) { - wr->m_nextpkt = next; wrq->no_desc++; break; } dst = (void *)&eq->desc[eq->pidx]; - for (m = wr; m; m = m->m_next) - copy_to_txd(eq, mtod(m, caddr_t), &dst, m->m_len); + copy_to_txd(eq, wrtod(wr), &dst, wr->wr_len); eq->pidx += ndesc; eq->avail -= ndesc; @@ -1164,7 +1169,8 @@ t4_wrq_tx_locked(struct adapter *sc, struct sge_wrq *wrq, struct mbuf *m0) ring_eq_db(sc, eq); wrq->tx_wrs++; - m_freem(wr); + STAILQ_REMOVE_HEAD(&wrq->wr_list, link); + free_wrqe(wr); if (eq->avail < 8) { can_reclaim = reclaimable(eq); @@ -1178,20 +1184,11 @@ t4_wrq_tx_locked(struct adapter *sc, struct sge_wrq *wrq, struct mbuf *m0) if (eq->pending) ring_eq_db(sc, eq); - if (wr == NULL) - wrq->head = wrq->tail = NULL; - else { - wrq->head = wr; - - KASSERT(wrq->tail->m_nextpkt == NULL, - ("%s: wrq->tail grew a tail of its own", __func__)); - + if (wr != NULL) { eq->flags |= EQ_STALLED; if (callout_pending(&eq->tx_callout) == 0) callout_reset(&eq->tx_callout, 1, t4_tx_callout, eq); } - - return (0); } /* Per-packet header in a coalesced tx WR, before the SGL starts (in flits) */ @@ -1215,7 +1212,7 @@ t4_wrq_tx_locked(struct adapter *sc, struct sge_wrq *wrq, struct mbuf *m0) /* Header of a tx LSO WR, before SGL of first packet (in flits) */ #define TXPKT_LSO_WR_HDR ((\ sizeof(struct fw_eth_tx_pkt_wr) + \ - sizeof(struct cpl_tx_pkt_lso) + \ + sizeof(struct cpl_tx_pkt_lso_core) + \ sizeof(struct cpl_tx_pkt_core) \ ) / 8 ) @@ -1392,8 +1389,8 @@ t4_update_fl_bufsize(struct ifnet *ifp) int i, bufsize; /* large enough for a frame even when VLAN extraction is disabled */ - bufsize = FL_PKTSHIFT + ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + - ifp->if_mtu; + bufsize = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + ifp->if_mtu; + bufsize = roundup(bufsize + FL_PKTSHIFT, fl_pad); for_each_rxq(pi, i, rxq) { fl = &rxq->fl; @@ -1420,9 +1417,12 @@ init_iq(struct sge_iq *iq, struct adapter *sc, int tmr_idx, int pktc_idx, iq->flags = 0; iq->adapter = sc; - iq->intr_params = V_QINTR_TIMER_IDX(tmr_idx) | - V_QINTR_CNT_EN(pktc_idx >= 0); - iq->intr_pktc_idx = pktc_idx; + iq->intr_params = V_QINTR_TIMER_IDX(tmr_idx); + iq->intr_pktc_idx = SGE_NCOUNTERS - 1; + if (pktc_idx >= 0) { + iq->intr_params |= F_QINTR_CNT_EN; + iq->intr_pktc_idx = pktc_idx; + } iq->qsize = roundup(qsize, 16); /* See FW_IQ_CMD/iqsize */ iq->esize = max(esize, 16); /* See FW_IQ_CMD/iqesize */ strlcpy(iq->lockname, name, sizeof(iq->lockname)); @@ -1587,7 +1587,7 @@ alloc_iq_fl(struct port_info *pi, struct sge_iq *iq, struct sge_fl *fl, return (rc); /* Allocate space for one software descriptor per buffer. */ - fl->cap = (fl->qsize - SPG_LEN / RX_FL_ESIZE) * 8; + fl->cap = (fl->qsize - spg_len / RX_FL_ESIZE) * 8; FL_LOCK(fl); rc = alloc_fl_sdesc(fl); FL_UNLOCK(fl); @@ -1789,6 +1789,7 @@ alloc_mgmtq(struct adapter *sc) static int free_mgmtq(struct adapter *sc) { + return free_wrq(sc, &sc->sge.mgmtq); } @@ -1808,7 +1809,7 @@ alloc_rxq(struct port_info *pi, struct sge_rxq *rxq, int intr_idx, int idx, refill_fl(pi->adapter, &rxq->fl, rxq->fl.needed / 8); FL_UNLOCK(&rxq->fl); -#ifdef INET +#if defined(INET) || defined(INET6) rc = tcp_lro_init(&rxq->lro); if (rc != 0) return (rc); @@ -1835,7 +1836,7 @@ alloc_rxq(struct port_info *pi, struct sge_rxq *rxq, int intr_idx, int idx, SYSCTL_ADD_PROC(&pi->ctx, children, OID_AUTO, "cidx", CTLTYPE_INT | CTLFLAG_RD, &rxq->iq.cidx, 0, sysctl_uint16, "I", "consumer index"); -#ifdef INET +#if defined(INET) || defined(INET6) SYSCTL_ADD_INT(&pi->ctx, children, OID_AUTO, "lro_queued", CTLFLAG_RD, &rxq->lro.lro_queued, 0, NULL); SYSCTL_ADD_INT(&pi->ctx, children, OID_AUTO, "lro_flushed", CTLFLAG_RD, @@ -1868,7 +1869,7 @@ free_rxq(struct port_info *pi, struct sge_rxq *rxq) { int rc; -#ifdef INET +#if defined(INET) || defined(INET6) if (rxq->lro.ifp) { tcp_lro_free(&rxq->lro); rxq->lro.ifp = NULL; @@ -1882,7 +1883,7 @@ free_rxq(struct port_info *pi, struct sge_rxq *rxq) return (rc); } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD static int alloc_ofld_rxq(struct port_info *pi, struct sge_ofld_rxq *ofld_rxq, int intr_idx, int idx, struct sysctl_oid *oid) @@ -2028,7 +2029,7 @@ eth_eq_alloc(struct adapter *sc, struct port_info *pi, struct sge_eq *eq) return (rc); } -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD static int ofld_eq_alloc(struct adapter *sc, struct port_info *pi, struct sge_eq *eq) { @@ -2086,7 +2087,7 @@ alloc_eq(struct adapter *sc, struct port_info *pi, struct sge_eq *eq) if (rc) return (rc); - eq->cap = eq->qsize - SPG_LEN / EQ_ESIZE; + eq->cap = eq->qsize - spg_len / EQ_ESIZE; eq->spg = (void *)&eq->desc[eq->cap]; eq->avail = eq->cap - 1; /* one less to avoid cidx = pidx */ eq->pidx = eq->cidx = 0; @@ -2100,7 +2101,7 @@ alloc_eq(struct adapter *sc, struct port_info *pi, struct sge_eq *eq) rc = eth_eq_alloc(sc, pi, eq); break; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD case EQ_OFLD: rc = ofld_eq_alloc(sc, pi, eq); break; @@ -2138,7 +2139,7 @@ free_eq(struct adapter *sc, struct sge_eq *eq) eq->cntxt_id); break; -#ifndef TCP_OFFLOAD_DISABLE +#ifdef TCP_OFFLOAD case EQ_OFLD: rc = -t4_ofld_eq_free(sc, sc->mbox, sc->pf, 0, eq->cntxt_id); @@ -2180,6 +2181,7 @@ alloc_wrq(struct adapter *sc, struct port_info *pi, struct sge_wrq *wrq, return (rc); wrq->adapter = sc; + STAILQ_INIT(&wrq->wr_list); SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "cntxt_id", CTLFLAG_RD, &wrq->eq.cntxt_id, 0, "SGE context id of the queue"); @@ -2275,7 +2277,7 @@ alloc_txq(struct port_info *pi, struct sge_txq *txq, int idx, CTLFLAG_RD, &txq->vlan_insertion, "# of times hardware inserted 802.1Q tag"); SYSCTL_ADD_UQUAD(&pi->ctx, children, OID_AUTO, "tso_wrs", CTLFLAG_RD, - &txq->tso_wrs, "# of IPv4 TSO work requests"); + &txq->tso_wrs, "# of TSO work requests"); SYSCTL_ADD_UQUAD(&pi->ctx, children, OID_AUTO, "imm_wrs", CTLFLAG_RD, &txq->imm_wrs, "# of work requests with immediate data"); SYSCTL_ADD_UQUAD(&pi->ctx, children, OID_AUTO, "sgl_wrs", CTLFLAG_RD, @@ -2772,7 +2774,7 @@ write_txpkt_wr(struct port_info *pi, struct sge_txq *txq, struct mbuf *m, ctrl = sizeof(struct cpl_tx_pkt_core); if (m->m_pkthdr.tso_segsz) { nflits = TXPKT_LSO_WR_HDR; - ctrl += sizeof(struct cpl_tx_pkt_lso); + ctrl += sizeof(struct cpl_tx_pkt_lso_core); } else nflits = TXPKT_WR_HDR; if (sgl->nsegs > 0) @@ -2802,24 +2804,62 @@ write_txpkt_wr(struct port_info *pi, struct sge_txq *txq, struct mbuf *m, wr->r3 = 0; if (m->m_pkthdr.tso_segsz) { - struct cpl_tx_pkt_lso *lso = (void *)(wr + 1); + struct cpl_tx_pkt_lso_core *lso = (void *)(wr + 1); struct ether_header *eh; - struct ip *ip; + void *l3hdr; +#if defined(INET) || defined(INET6) struct tcphdr *tcp; +#endif + uint16_t eh_type; ctrl = V_LSO_OPCODE(CPL_TX_PKT_LSO) | F_LSO_FIRST_SLICE | F_LSO_LAST_SLICE; eh = mtod(m, struct ether_header *); - if (eh->ether_type == htons(ETHERTYPE_VLAN)) { - ctrl |= V_LSO_ETHHDR_LEN(1); - ip = (void *)((struct ether_vlan_header *)eh + 1); - } else - ip = (void *)(eh + 1); + eh_type = ntohs(eh->ether_type); + if (eh_type == ETHERTYPE_VLAN) { + struct ether_vlan_header *evh = (void *)eh; - tcp = (void *)((uintptr_t)ip + ip->ip_hl * 4); - ctrl |= V_LSO_IPHDR_LEN(ip->ip_hl) | - V_LSO_TCPHDR_LEN(tcp->th_off); + ctrl |= V_LSO_ETHHDR_LEN(1); + l3hdr = evh + 1; + eh_type = ntohs(evh->evl_proto); + } else + l3hdr = eh + 1; + + switch (eh_type) { +#ifdef INET6 + case ETHERTYPE_IPV6: + { + struct ip6_hdr *ip6 = l3hdr; + + /* + * XXX-BZ For now we do not pretend to support + * IPv6 extension headers. + */ + KASSERT(ip6->ip6_nxt == IPPROTO_TCP, ("%s: CSUM_TSO " + "with ip6_nxt != TCP: %u", __func__, ip6->ip6_nxt)); + tcp = (struct tcphdr *)(ip6 + 1); + ctrl |= F_LSO_IPV6; + ctrl |= V_LSO_IPHDR_LEN(sizeof(*ip6) >> 2) | + V_LSO_TCPHDR_LEN(tcp->th_off); + break; + } +#endif +#ifdef INET + case ETHERTYPE_IP: + { + struct ip *ip = l3hdr; + + tcp = (void *)((uintptr_t)ip + ip->ip_hl * 4); + ctrl |= V_LSO_IPHDR_LEN(ip->ip_hl) | + V_LSO_TCPHDR_LEN(tcp->th_off); + break; + } +#endif + default: + panic("%s: CSUM_TSO but no supported IP version " + "(0x%04x)", __func__, eh_type); + } lso->lso_ctrl = htobe32(ctrl); lso->ipid_ofst = htobe16(0); @@ -2837,9 +2877,11 @@ write_txpkt_wr(struct port_info *pi, struct sge_txq *txq, struct mbuf *m, ctrl1 = 0; if (!(m->m_pkthdr.csum_flags & CSUM_IP)) ctrl1 |= F_TXPKT_IPCSUM_DIS; - if (!(m->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP))) + if (!(m->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP | CSUM_UDP_IPV6 | + CSUM_TCP_IPV6))) ctrl1 |= F_TXPKT_L4CSUM_DIS; - if (m->m_pkthdr.csum_flags & (CSUM_IP | CSUM_TCP | CSUM_UDP)) + if (m->m_pkthdr.csum_flags & (CSUM_IP | CSUM_TCP | CSUM_UDP | + CSUM_UDP_IPV6 | CSUM_TCP_IPV6)) txq->txcsum++; /* some hardware assistance provided */ /* VLAN tag insertion */ @@ -3176,7 +3218,7 @@ write_sgl_to_txd(struct sge_eq *eq, struct sgl *sgl, caddr_t *to) static inline void copy_to_txd(struct sge_eq *eq, caddr_t from, caddr_t *to, int len) { - if ((uintptr_t)(*to) + len <= (uintptr_t)eq->spg) { + if (__predict_true((uintptr_t)(*to) + len <= (uintptr_t)eq->spg)) { bcopy(from, *to, len); (*to) += len; } else { diff --git a/sys/dev/cxgbe/tom/t4_connect.c b/sys/dev/cxgbe/tom/t4_connect.c new file mode 100644 index 00000000000..bc591716aea --- /dev/null +++ b/sys/dev/cxgbe/tom/t4_connect.c @@ -0,0 +1,377 @@ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * Written by: Navdeep Parhar + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define TCPSTATES +#include +#include + +#include "common/common.h" +#include "common/t4_msg.h" +#include "common/t4_regs.h" +#include "tom/t4_tom_l2t.h" +#include "tom/t4_tom.h" + +/* atid services */ +static int alloc_atid(struct adapter *, void *); +static void *lookup_atid(struct adapter *, int); +static void free_atid(struct adapter *, int); + +static int +alloc_atid(struct adapter *sc, void *ctx) +{ + struct tid_info *t = &sc->tids; + int atid = -1; + + mtx_lock(&t->atid_lock); + if (t->afree) { + union aopen_entry *p = t->afree; + + atid = p - t->atid_tab; + t->afree = p->next; + p->data = ctx; + t->atids_in_use++; + } + mtx_unlock(&t->atid_lock); + return (atid); +} + +static void * +lookup_atid(struct adapter *sc, int atid) +{ + struct tid_info *t = &sc->tids; + + return (t->atid_tab[atid].data); +} + +static void +free_atid(struct adapter *sc, int atid) +{ + struct tid_info *t = &sc->tids; + union aopen_entry *p = &t->atid_tab[atid]; + + mtx_lock(&t->atid_lock); + p->next = t->afree; + t->afree = p; + t->atids_in_use--; + mtx_unlock(&t->atid_lock); +} + +/* + * Active open failed. + */ +static int +do_act_establish(struct sge_iq *iq, const struct rss_header *rss, + struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_act_establish *cpl = (const void *)(rss + 1); + unsigned int tid = GET_TID(cpl); + unsigned int atid = G_TID_TID(ntohl(cpl->tos_atid)); + struct toepcb *toep = lookup_atid(sc, atid); + struct inpcb *inp = toep->inp; + + KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__)); + KASSERT(toep->tid == atid, ("%s: toep tid/atid mismatch", __func__)); + + CTR3(KTR_CXGBE, "%s: atid %u, tid %u", __func__, atid, tid); + free_atid(sc, atid); + + INP_WLOCK(inp); + toep->tid = tid; + insert_tid(sc, tid, toep); + if (inp->inp_flags & INP_DROPPED) { + + /* socket closed by the kernel before hw told us it connected */ + + send_flowc_wr(toep, NULL); + send_reset(sc, toep, be32toh(cpl->snd_isn)); + goto done; + } + + make_established(toep, cpl->snd_isn, cpl->rcv_isn, cpl->tcp_opt); +done: + INP_WUNLOCK(inp); + return (0); +} + +static inline int +act_open_has_tid(unsigned int status) +{ + + return (status != CPL_ERR_TCAM_FULL && + status != CPL_ERR_TCAM_PARITY && + status != CPL_ERR_CONN_EXIST && + status != CPL_ERR_ARP_MISS); +} + +/* + * Convert an ACT_OPEN_RPL status to an errno. + */ +static inline int +act_open_rpl_status_to_errno(int status) +{ + + switch (status) { + case CPL_ERR_CONN_RESET: + return (ECONNREFUSED); + case CPL_ERR_ARP_MISS: + return (EHOSTUNREACH); + case CPL_ERR_CONN_TIMEDOUT: + return (ETIMEDOUT); + case CPL_ERR_TCAM_FULL: + return (ENOMEM); + case CPL_ERR_CONN_EXIST: + log(LOG_ERR, "ACTIVE_OPEN_RPL: 4-tuple in use\n"); + return (EADDRINUSE); + default: + return (EIO); + } +} + +static int +do_act_open_rpl(struct sge_iq *iq, const struct rss_header *rss, + struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_act_open_rpl *cpl = (const void *)(rss + 1); + unsigned int atid = G_TID_TID(G_AOPEN_ATID(be32toh(cpl->atid_status))); + unsigned int status = G_AOPEN_STATUS(be32toh(cpl->atid_status)); + struct toepcb *toep = lookup_atid(sc, atid); + struct inpcb *inp = toep->inp; + struct tcpcb *tp = intotcpcb(inp); + struct toedev *tod = &toep->td->tod; + + KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__)); + KASSERT(toep->tid == atid, ("%s: toep tid/atid mismatch", __func__)); + + CTR3(KTR_CXGBE, "%s: atid %u, status %u ", __func__, atid, status); + + /* Ignore negative advice */ + if (status == CPL_ERR_RTX_NEG_ADVICE) + return (0); + + free_atid(sc, atid); + toep->tid = -1; + + if (status && act_open_has_tid(status)) + release_tid(sc, GET_TID(cpl), toep->ctrlq); + + if (status == CPL_ERR_TCAM_FULL) { + INP_WLOCK(inp); + toe_connect_failed(tod, tp, EAGAIN); + final_cpl_received(toep); /* unlocks inp */ + } else { + INP_INFO_WLOCK(&V_tcbinfo); + INP_WLOCK(inp); + toe_connect_failed(tod, tp, act_open_rpl_status_to_errno(status)); + final_cpl_received(toep); /* unlocks inp */ + INP_INFO_WUNLOCK(&V_tcbinfo); + } + + return (0); +} + +/* + * Options2 for active open. + */ +static uint32_t +calc_opt2a(struct socket *so) +{ + struct tcpcb *tp = so_sototcpcb(so); + struct toepcb *toep = tp->t_toe; + struct port_info *pi = toep->port; + struct adapter *sc = pi->adapter; + uint32_t opt2 = 0; + + if (tp->t_flags & TF_SACK_PERMIT) + opt2 |= F_SACK_EN; + + if (tp->t_flags & TF_REQ_TSTMP) + opt2 |= F_TSTAMPS_EN; + + if (tp->t_flags & TF_REQ_SCALE) + opt2 |= F_WND_SCALE_EN; + + if (V_tcp_do_ecn) + opt2 |= F_CCTRL_ECN; + + opt2 |= V_TX_QUEUE(sc->params.tp.tx_modq[pi->tx_chan]); + opt2 |= F_RX_COALESCE_VALID | V_RX_COALESCE(M_RX_COALESCE); + opt2 |= F_RSS_QUEUE_VALID | V_RSS_QUEUE(toep->ofld_rxq->iq.abs_id); + + return (htobe32(opt2)); +} + + +void +t4_init_connect_cpl_handlers(struct adapter *sc) +{ + + t4_register_cpl_handler(sc, CPL_ACT_ESTABLISH, do_act_establish); + t4_register_cpl_handler(sc, CPL_ACT_OPEN_RPL, do_act_open_rpl); +} + +/* + * active open (soconnect). + * + * State of affairs on entry: + * soisconnecting (so_state |= SS_ISCONNECTING) + * tcbinfo not locked (This has changed - used to be WLOCKed) + * inp WLOCKed + * tp->t_state = TCPS_SYN_SENT + * rtalloc1, RT_UNLOCK on rt. + */ +int +t4_connect(struct toedev *tod, struct socket *so, struct rtentry *rt, + struct sockaddr *nam) +{ + struct adapter *sc = tod->tod_softc; + struct toepcb *toep = NULL; + struct wrqe *wr = NULL; + struct cpl_act_open_req *cpl; + struct l2t_entry *e = NULL; + struct ifnet *rt_ifp = rt->rt_ifp; + struct port_info *pi; + int atid = -1, mtu_idx, rscale, qid_atid, rc = ENOMEM; + struct inpcb *inp = sotoinpcb(so); + struct tcpcb *tp = intotcpcb(inp); + + INP_WLOCK_ASSERT(inp); + + if (nam->sa_family != AF_INET) + CXGBE_UNIMPLEMENTED("IPv6 connect"); + + if (rt_ifp->if_type == IFT_ETHER) + pi = rt_ifp->if_softc; + else if (rt_ifp->if_type == IFT_L2VLAN) { + struct ifnet *ifp = VLAN_COOKIE(rt_ifp); + + pi = ifp->if_softc; + } else if (rt_ifp->if_type == IFT_IEEE8023ADLAG) + return (ENOSYS); /* XXX: implement lagg support */ + else + return (ENOTSUP); + + toep = alloc_toepcb(pi, -1, -1, M_NOWAIT); + if (toep == NULL) + goto failed; + + atid = alloc_atid(sc, toep); + if (atid < 0) + goto failed; + + e = t4_l2t_get(pi, rt_ifp, + rt->rt_flags & RTF_GATEWAY ? rt->rt_gateway : nam); + if (e == NULL) + goto failed; + + wr = alloc_wrqe(sizeof(*cpl), toep->ctrlq); + if (wr == NULL) + goto failed; + cpl = wrtod(wr); + + toep->tid = atid; + toep->l2te = e; + toep->ulp_mode = ULP_MODE_NONE; + SOCKBUF_LOCK(&so->so_rcv); + /* opt0 rcv_bufsiz initially, assumes its normal meaning later */ + toep->rx_credits = min(select_rcv_wnd(so) >> 10, M_RCV_BUFSIZ); + SOCKBUF_UNLOCK(&so->so_rcv); + + offload_socket(so, toep); + + /* + * The kernel sets request_r_scale based on sb_max whereas we need to + * take hardware's MAX_RCV_WND into account too. This is normally a + * no-op as MAX_RCV_WND is much larger than the default sb_max. + */ + if (tp->t_flags & TF_REQ_SCALE) + rscale = tp->request_r_scale = select_rcv_wscale(); + else + rscale = 0; + mtu_idx = find_best_mtu_idx(sc, &inp->inp_inc, 0); + qid_atid = (toep->ofld_rxq->iq.abs_id << 14) | atid; + + INIT_TP_WR(cpl, 0); + OPCODE_TID(cpl) = htobe32(MK_OPCODE_TID(CPL_ACT_OPEN_REQ, qid_atid)); + inp_4tuple_get(inp, &cpl->local_ip, &cpl->local_port, &cpl->peer_ip, + &cpl->peer_port); + cpl->opt0 = calc_opt0(so, pi, e, mtu_idx, rscale, toep->rx_credits, + toep->ulp_mode); + cpl->params = select_ntuple(pi, e, sc->filter_mode); + cpl->opt2 = calc_opt2a(so); + + CTR5(KTR_CXGBE, "%s: atid %u (%s), toep %p, inp %p", __func__, + toep->tid, tcpstates[tp->t_state], toep, inp); + + rc = t4_l2t_send(sc, wr, e); + if (rc == 0) { + toepcb_set_flag(toep, TPF_CPL_PENDING); + return (0); + } + + undo_offload_socket(so); +failed: + CTR5(KTR_CXGBE, "%s: FAILED, atid %d, toep %p, l2te %p, wr %p", + __func__, atid, toep, e, wr); + + if (e) + t4_l2t_release(e); + if (wr) + free_wrqe(wr); + if (atid >= 0) + free_atid(sc, atid); + if (toep) + free_toepcb(toep); + + return (rc); +} +#endif diff --git a/sys/dev/cxgbe/tom/t4_cpl_io.c b/sys/dev/cxgbe/tom/t4_cpl_io.c new file mode 100644 index 00000000000..2c1b7527930 --- /dev/null +++ b/sys/dev/cxgbe/tom/t4_cpl_io.c @@ -0,0 +1,1276 @@ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * Written by: Navdeep Parhar + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define TCPSTATES +#include +#include +#include + +#include "common/common.h" +#include "common/t4_msg.h" +#include "common/t4_regs.h" +#include "tom/t4_tom_l2t.h" +#include "tom/t4_tom.h" + +VNET_DECLARE(int, tcp_do_autosndbuf); +#define V_tcp_do_autosndbuf VNET(tcp_do_autosndbuf) +VNET_DECLARE(int, tcp_autosndbuf_inc); +#define V_tcp_autosndbuf_inc VNET(tcp_autosndbuf_inc) +VNET_DECLARE(int, tcp_autosndbuf_max); +#define V_tcp_autosndbuf_max VNET(tcp_autosndbuf_max) +VNET_DECLARE(int, tcp_do_autorcvbuf); +#define V_tcp_do_autorcvbuf VNET(tcp_do_autorcvbuf) +VNET_DECLARE(int, tcp_autorcvbuf_inc); +#define V_tcp_autorcvbuf_inc VNET(tcp_autorcvbuf_inc) +VNET_DECLARE(int, tcp_autorcvbuf_max); +#define V_tcp_autorcvbuf_max VNET(tcp_autorcvbuf_max) + +void +send_flowc_wr(struct toepcb *toep, struct flowc_tx_params *ftxp) +{ + struct wrqe *wr; + struct fw_flowc_wr *flowc; + unsigned int nparams = ftxp ? 8 : 4, flowclen; + struct port_info *pi = toep->port; + struct adapter *sc = pi->adapter; + unsigned int pfvf = G_FW_VIID_PFN(pi->viid) << S_FW_VIID_PFN; + struct ofld_tx_sdesc *txsd = &toep->txsd[toep->txsd_pidx]; + + KASSERT(!toepcb_flag(toep, TPF_FLOWC_WR_SENT), + ("%s: flowc for tid %u sent already", __func__, toep->tid)); + + CTR2(KTR_CXGBE, "%s: tid %u", __func__, toep->tid); + + flowclen = sizeof(*flowc) + nparams * sizeof(struct fw_flowc_mnemval); + + wr = alloc_wrqe(roundup(flowclen, 16), toep->ofld_txq); + if (wr == NULL) { + /* XXX */ + panic("%s: allocation failure.", __func__); + } + flowc = wrtod(wr); + memset(flowc, 0, wr->wr_len); + + flowc->op_to_nparams = htobe32(V_FW_WR_OP(FW_FLOWC_WR) | + V_FW_FLOWC_WR_NPARAMS(nparams)); + flowc->flowid_len16 = htonl(V_FW_WR_LEN16(howmany(flowclen, 16)) | + V_FW_WR_FLOWID(toep->tid)); + + flowc->mnemval[0].mnemonic = FW_FLOWC_MNEM_PFNVFN; + flowc->mnemval[0].val = htobe32(pfvf); + flowc->mnemval[1].mnemonic = FW_FLOWC_MNEM_CH; + flowc->mnemval[1].val = htobe32(pi->tx_chan); + flowc->mnemval[2].mnemonic = FW_FLOWC_MNEM_PORT; + flowc->mnemval[2].val = htobe32(pi->tx_chan); + flowc->mnemval[3].mnemonic = FW_FLOWC_MNEM_IQID; + flowc->mnemval[3].val = htobe32(toep->ofld_rxq->iq.abs_id); + if (ftxp) { + uint32_t sndbuf = min(ftxp->snd_space, sc->tt.sndbuf); + + flowc->mnemval[4].mnemonic = FW_FLOWC_MNEM_SNDNXT; + flowc->mnemval[4].val = htobe32(ftxp->snd_nxt); + flowc->mnemval[5].mnemonic = FW_FLOWC_MNEM_RCVNXT; + flowc->mnemval[5].val = htobe32(ftxp->rcv_nxt); + flowc->mnemval[6].mnemonic = FW_FLOWC_MNEM_SNDBUF; + flowc->mnemval[6].val = htobe32(sndbuf); + flowc->mnemval[7].mnemonic = FW_FLOWC_MNEM_MSS; + flowc->mnemval[7].val = htobe32(ftxp->mss); + } + + txsd->tx_credits = howmany(flowclen, 16); + txsd->plen = 0; + KASSERT(toep->tx_credits >= txsd->tx_credits && toep->txsd_avail > 0, + ("%s: not enough credits (%d)", __func__, toep->tx_credits)); + toep->tx_credits -= txsd->tx_credits; + if (__predict_false(++toep->txsd_pidx == toep->txsd_total)) + toep->txsd_pidx = 0; + toep->txsd_avail--; + + toepcb_set_flag(toep, TPF_FLOWC_WR_SENT); + t4_wrq_tx(sc, wr); +} + +void +send_reset(struct adapter *sc, struct toepcb *toep, uint32_t snd_nxt) +{ + struct wrqe *wr; + struct cpl_abort_req *req; + int tid = toep->tid; + struct inpcb *inp = toep->inp; + struct tcpcb *tp = intotcpcb(inp); /* don't use if INP_DROPPED */ + + INP_WLOCK_ASSERT(inp); + + CTR6(KTR_CXGBE, "%s: tid %d (%s), toep_flags 0x%x, inp_flags 0x%x%s", + __func__, toep->tid, + inp->inp_flags & INP_DROPPED ? "inp dropped" : + tcpstates[tp->t_state], + toep->flags, inp->inp_flags, + toepcb_flag(toep, TPF_ABORT_SHUTDOWN) ? + " (abort already in progress)" : ""); + + if (toepcb_flag(toep, TPF_ABORT_SHUTDOWN)) + return; /* abort already in progress */ + + toepcb_set_flag(toep, TPF_ABORT_SHUTDOWN); + + KASSERT(toepcb_flag(toep, TPF_FLOWC_WR_SENT), + ("%s: flowc_wr not sent for tid %d.", __func__, tid)); + + wr = alloc_wrqe(sizeof(*req), toep->ofld_txq); + if (wr == NULL) { + /* XXX */ + panic("%s: allocation failure.", __func__); + } + req = wrtod(wr); + + INIT_TP_WR_MIT_CPL(req, CPL_ABORT_REQ, tid); + if (inp->inp_flags & INP_DROPPED) + req->rsvd0 = htobe32(snd_nxt); + else + req->rsvd0 = htobe32(tp->snd_nxt); + req->rsvd1 = !toepcb_flag(toep, TPF_TX_DATA_SENT); + req->cmd = CPL_ABORT_SEND_RST; + + /* + * XXX: What's the correct way to tell that the inp hasn't been detached + * from its socket? Should I even be flushing the snd buffer here? + */ + if ((inp->inp_flags & (INP_DROPPED | INP_TIMEWAIT)) == 0) { + struct socket *so = inp->inp_socket; + + if (so != NULL) /* because I'm not sure. See comment above */ + sbflush(&so->so_snd); + } + + t4_l2t_send(sc, wr, toep->l2te); +} + +/* + * Called when a connection is established to translate the TCP options + * reported by HW to FreeBSD's native format. + */ +static void +assign_rxopt(struct tcpcb *tp, unsigned int opt) +{ + struct toepcb *toep = tp->t_toe; + struct adapter *sc = td_adapter(toep->td); + + INP_LOCK_ASSERT(tp->t_inpcb); + + tp->t_maxseg = tp->t_maxopd = sc->params.mtus[G_TCPOPT_MSS(opt)] - 40; + + if (G_TCPOPT_TSTAMP(opt)) { + tp->t_flags |= TF_RCVD_TSTMP; /* timestamps ok */ + tp->ts_recent = 0; /* hmmm */ + tp->ts_recent_age = tcp_ts_getticks(); + tp->t_maxseg -= TCPOLEN_TSTAMP_APPA; + } + + if (G_TCPOPT_SACK(opt)) + tp->t_flags |= TF_SACK_PERMIT; /* should already be set */ + else + tp->t_flags &= ~TF_SACK_PERMIT; /* sack disallowed by peer */ + + if (G_TCPOPT_WSCALE_OK(opt)) + tp->t_flags |= TF_RCVD_SCALE; + + /* Doing window scaling? */ + if ((tp->t_flags & (TF_RCVD_SCALE | TF_REQ_SCALE)) == + (TF_RCVD_SCALE | TF_REQ_SCALE)) { + tp->rcv_scale = tp->request_r_scale; + tp->snd_scale = G_TCPOPT_SND_WSCALE(opt); + } +} + +/* + * Completes some final bits of initialization for just established connections + * and changes their state to TCPS_ESTABLISHED. + * + * The ISNs are from after the exchange of SYNs. i.e., the true ISN + 1. + */ +void +make_established(struct toepcb *toep, uint32_t snd_isn, uint32_t rcv_isn, + uint16_t opt) +{ + struct inpcb *inp = toep->inp; + struct socket *so = inp->inp_socket; + struct tcpcb *tp = intotcpcb(inp); + long bufsize; + uint32_t iss = be32toh(snd_isn) - 1; /* true ISS */ + uint32_t irs = be32toh(rcv_isn) - 1; /* true IRS */ + uint16_t tcpopt = be16toh(opt); + struct flowc_tx_params ftxp; + + INP_WLOCK_ASSERT(inp); + KASSERT(tp->t_state == TCPS_SYN_SENT || + tp->t_state == TCPS_SYN_RECEIVED, + ("%s: TCP state %s", __func__, tcpstates[tp->t_state])); + + CTR4(KTR_CXGBE, "%s: tid %d, toep %p, inp %p", + __func__, toep->tid, toep, inp); + + tp->t_state = TCPS_ESTABLISHED; + tp->t_starttime = ticks; + TCPSTAT_INC(tcps_connects); + + tp->irs = irs; + tcp_rcvseqinit(tp); + tp->rcv_wnd = toep->rx_credits << 10; + tp->rcv_adv += tp->rcv_wnd; + tp->last_ack_sent = tp->rcv_nxt; + + /* + * If we were unable to send all rx credits via opt0, save the remainder + * in rx_credits so that they can be handed over with the next credit + * update. + */ + SOCKBUF_LOCK(&so->so_rcv); + bufsize = select_rcv_wnd(so); + SOCKBUF_UNLOCK(&so->so_rcv); + toep->rx_credits = bufsize - tp->rcv_wnd; + + tp->iss = iss; + tcp_sendseqinit(tp); + tp->snd_una = iss + 1; + tp->snd_nxt = iss + 1; + tp->snd_max = iss + 1; + + assign_rxopt(tp, tcpopt); + + SOCKBUF_LOCK(&so->so_snd); + if (so->so_snd.sb_flags & SB_AUTOSIZE && V_tcp_do_autosndbuf) + bufsize = V_tcp_autosndbuf_max; + else + bufsize = sbspace(&so->so_snd); + SOCKBUF_UNLOCK(&so->so_snd); + + ftxp.snd_nxt = tp->snd_nxt; + ftxp.rcv_nxt = tp->rcv_nxt; + ftxp.snd_space = bufsize; + ftxp.mss = tp->t_maxseg; + send_flowc_wr(toep, &ftxp); + + soisconnected(so); +} + +static int +send_rx_credits(struct adapter *sc, struct toepcb *toep, uint32_t credits) +{ + struct wrqe *wr; + struct cpl_rx_data_ack *req; + uint32_t dack = F_RX_DACK_CHANGE | V_RX_DACK_MODE(1); + + wr = alloc_wrqe(sizeof(*req), toep->ctrlq); + if (wr == NULL) + return (0); + req = wrtod(wr); + + INIT_TP_WR_MIT_CPL(req, CPL_RX_DATA_ACK, toep->tid); + req->credit_dack = htobe32(dack | V_RX_CREDITS(credits)); + + t4_wrq_tx(sc, wr); + return (credits); +} + +void +t4_rcvd(struct toedev *tod, struct tcpcb *tp) +{ + struct adapter *sc = tod->tod_softc; + struct inpcb *inp = tp->t_inpcb; + struct socket *so = inp->inp_socket; + struct sockbuf *so_rcv = &so->so_rcv; + struct toepcb *toep = tp->t_toe; + int must_send; + + INP_WLOCK_ASSERT(inp); + + SOCKBUF_LOCK(so_rcv); + KASSERT(toep->enqueued >= so_rcv->sb_cc, + ("%s: so_rcv->sb_cc > enqueued", __func__)); + toep->rx_credits += toep->enqueued - so_rcv->sb_cc; + toep->enqueued = so_rcv->sb_cc; + SOCKBUF_UNLOCK(so_rcv); + + must_send = toep->rx_credits + 16384 >= tp->rcv_wnd; + if (must_send || toep->rx_credits >= 15 * 1024) { + int credits; + + credits = send_rx_credits(sc, toep, toep->rx_credits); + toep->rx_credits -= credits; + tp->rcv_wnd += credits; + tp->rcv_adv += credits; + } +} + +/* + * Close a connection by sending a CPL_CLOSE_CON_REQ message. + */ +static int +close_conn(struct adapter *sc, struct toepcb *toep) +{ + struct wrqe *wr; + struct cpl_close_con_req *req; + unsigned int tid = toep->tid; + + CTR3(KTR_CXGBE, "%s: tid %u%s", __func__, toep->tid, + toepcb_flag(toep, TPF_FIN_SENT) ? ", IGNORED" : ""); + + if (toepcb_flag(toep, TPF_FIN_SENT)) + return (0); + + KASSERT(toepcb_flag(toep, TPF_FLOWC_WR_SENT), + ("%s: flowc_wr not sent for tid %u.", __func__, tid)); + + wr = alloc_wrqe(sizeof(*req), toep->ofld_txq); + if (wr == NULL) { + /* XXX */ + panic("%s: allocation failure.", __func__); + } + req = wrtod(wr); + + req->wr.wr_hi = htonl(V_FW_WR_OP(FW_TP_WR) | + V_FW_WR_IMMDLEN(sizeof(*req) - sizeof(req->wr))); + req->wr.wr_mid = htonl(V_FW_WR_LEN16(howmany(sizeof(*req), 16)) | + V_FW_WR_FLOWID(tid)); + req->wr.wr_lo = cpu_to_be64(0); + OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_CON_REQ, tid)); + req->rsvd = 0; + + toepcb_set_flag(toep, TPF_FIN_SENT); + toepcb_clr_flag(toep, TPF_SEND_FIN); + t4_l2t_send(sc, wr, toep->l2te); + + return (0); +} + +#define MAX_OFLD_TX_CREDITS (SGE_MAX_WR_LEN / 16) +#define MIN_OFLD_TX_CREDITS (howmany(sizeof(struct fw_ofld_tx_data_wr) + 1, 16)) + +/* Maximum amount of immediate data we could stuff in a WR */ +static inline int +max_imm_payload(int tx_credits) +{ + const int n = 2; /* Use only up to 2 desc for imm. data WR */ + + KASSERT(tx_credits >= 0 && + tx_credits <= MAX_OFLD_TX_CREDITS, + ("%s: %d credits", __func__, tx_credits)); + + if (tx_credits < MIN_OFLD_TX_CREDITS) + return (0); + + if (tx_credits >= (n * EQ_ESIZE) / 16) + return ((n * EQ_ESIZE) - sizeof(struct fw_ofld_tx_data_wr)); + else + return (tx_credits * 16 - sizeof(struct fw_ofld_tx_data_wr)); +} + +/* Maximum number of SGL entries we could stuff in a WR */ +static inline int +max_dsgl_nsegs(int tx_credits) +{ + int nseg = 1; /* ulptx_sgl has room for 1, rest ulp_tx_sge_pair */ + int sge_pair_credits = tx_credits - MIN_OFLD_TX_CREDITS; + + KASSERT(tx_credits >= 0 && + tx_credits <= MAX_OFLD_TX_CREDITS, + ("%s: %d credits", __func__, tx_credits)); + + if (tx_credits < MIN_OFLD_TX_CREDITS) + return (0); + + nseg += 2 * (sge_pair_credits * 16 / 24); + if ((sge_pair_credits * 16) % 24 == 16) + nseg++; + + return (nseg); +} + +static inline void +write_tx_wr(void *dst, struct toepcb *toep, unsigned int immdlen, + unsigned int plen, uint8_t credits, int more_to_come) +{ + struct fw_ofld_tx_data_wr *txwr = dst; + int shove = !more_to_come; + int compl = 1; + + /* + * We always request completion notifications from the firmware. The + * only exception is when we know we'll get more data to send shortly + * and that we'll have some tx credits remaining to transmit that data. + */ + if (more_to_come && toep->tx_credits - credits >= MIN_OFLD_TX_CREDITS) + compl = 0; + + txwr->op_to_immdlen = htobe32(V_WR_OP(FW_OFLD_TX_DATA_WR) | + V_FW_WR_COMPL(compl) | V_FW_WR_IMMDLEN(immdlen)); + txwr->flowid_len16 = htobe32(V_FW_WR_FLOWID(toep->tid) | + V_FW_WR_LEN16(credits)); + txwr->tunnel_to_proxy = + htobe32(V_FW_OFLD_TX_DATA_WR_ULPMODE(toep->ulp_mode) | + V_FW_OFLD_TX_DATA_WR_URGENT(0) | /* XXX */ + V_FW_OFLD_TX_DATA_WR_SHOVE(shove)); + txwr->plen = htobe32(plen); +} + +/* + * Generate a DSGL from a starting mbuf. The total number of segments and the + * maximum segments in any one mbuf are provided. + */ +static void +write_tx_sgl(void *dst, struct mbuf *start, struct mbuf *stop, int nsegs, int n) +{ + struct mbuf *m; + struct ulptx_sgl *usgl = dst; + int i, j, rc; + struct sglist sg; + struct sglist_seg segs[n]; + + KASSERT(nsegs > 0, ("%s: nsegs 0", __func__)); + + sglist_init(&sg, n, segs); + usgl->cmd_nsge = htobe32(V_ULPTX_CMD(ULP_TX_SC_DSGL) | + V_ULPTX_NSGE(nsegs)); + + i = -1; + for (m = start; m != stop; m = m->m_next) { + rc = sglist_append(&sg, mtod(m, void *), m->m_len); + if (__predict_false(rc != 0)) + panic("%s: sglist_append %d", __func__, rc); + + for (j = 0; j < sg.sg_nseg; i++, j++) { + if (i < 0) { + usgl->len0 = htobe32(segs[j].ss_len); + usgl->addr0 = htobe64(segs[j].ss_paddr); + } else { + usgl->sge[i / 2].len[i & 1] = + htobe32(segs[j].ss_len); + usgl->sge[i / 2].addr[i & 1] = + htobe64(segs[j].ss_paddr); + } +#ifdef INVARIANTS + nsegs--; +#endif + } + sglist_reset(&sg); + } + if (i & 1) + usgl->sge[i / 2].len[1] = htobe32(0); + KASSERT(nsegs == 0, ("%s: nsegs %d, start %p, stop %p", + __func__, nsegs, start, stop)); +} + +/* + * Max number of SGL entries an offload tx work request can have. This is 41 + * (1 + 40) for a full 512B work request. + * fw_ofld_tx_data_wr(16B) + ulptx_sgl(16B, 1) + ulptx_sge_pair(480B, 40) + */ +#define OFLD_SGL_LEN (41) + +/* + * Send data and/or a FIN to the peer. + * + * The socket's so_snd buffer consists of a stream of data starting with sb_mb + * and linked together with m_next. sb_sndptr, if set, is the last mbuf that + * was transmitted. + */ +static void +t4_push_frames(struct adapter *sc, struct toepcb *toep) +{ + struct mbuf *sndptr, *m, *sb_sndptr; + struct fw_ofld_tx_data_wr *txwr; + struct wrqe *wr; + unsigned int plen, nsegs, credits, max_imm, max_nsegs, max_nsegs_1mbuf; + struct inpcb *inp = toep->inp; + struct tcpcb *tp = intotcpcb(inp); + struct socket *so = inp->inp_socket; + struct sockbuf *sb = &so->so_snd; + int tx_credits; + struct ofld_tx_sdesc *txsd = &toep->txsd[toep->txsd_pidx]; + + INP_WLOCK_ASSERT(inp); + KASSERT(toepcb_flag(toep, TPF_FLOWC_WR_SENT), + ("%s: flowc_wr not sent for tid %u.", __func__, toep->tid)); + + if (toep->ulp_mode != ULP_MODE_NONE) + CXGBE_UNIMPLEMENTED("ulp_mode"); + + /* + * This function doesn't resume by itself. Someone else must clear the + * flag and call this function. + */ + if (__predict_false(toepcb_flag(toep, TPF_TX_SUSPENDED))) + return; + + do { + tx_credits = min(toep->tx_credits, MAX_OFLD_TX_CREDITS); + max_imm = max_imm_payload(tx_credits); + max_nsegs = max_dsgl_nsegs(tx_credits); + + SOCKBUF_LOCK(sb); + sb_sndptr = sb->sb_sndptr; + sndptr = sb_sndptr ? sb_sndptr->m_next : sb->sb_mb; + plen = 0; + nsegs = 0; + max_nsegs_1mbuf = 0; /* max # of SGL segments in any one mbuf */ + for (m = sndptr; m != NULL; m = m->m_next) { + int n = sglist_count(mtod(m, void *), m->m_len); + + nsegs += n; + plen += m->m_len; + + /* This mbuf sent us _over_ the nsegs limit, back out */ + if (plen > max_imm && nsegs > max_nsegs) { + nsegs -= n; + plen -= m->m_len; + if (plen == 0) { + /* Too few credits */ + toepcb_set_flag(toep, TPF_TX_SUSPENDED); + SOCKBUF_UNLOCK(sb); + return; + } + break; + } + + if (max_nsegs_1mbuf < n) + max_nsegs_1mbuf = n; + sb_sndptr = m; /* new sb->sb_sndptr if all goes well */ + + /* This mbuf put us right at the max_nsegs limit */ + if (plen > max_imm && nsegs == max_nsegs) { + m = m->m_next; + break; + } + } + + if (sb->sb_flags & SB_AUTOSIZE && + V_tcp_do_autosndbuf && + sb->sb_hiwat < V_tcp_autosndbuf_max && + sbspace(sb) < sb->sb_hiwat / 8 * 7) { + int newsize = min(sb->sb_hiwat + V_tcp_autosndbuf_inc, + V_tcp_autosndbuf_max); + + if (!sbreserve_locked(sb, newsize, so, NULL)) + sb->sb_flags &= ~SB_AUTOSIZE; + else { + sowwakeup_locked(so); /* room available */ + SOCKBUF_UNLOCK_ASSERT(sb); + goto unlocked; + } + } + SOCKBUF_UNLOCK(sb); +unlocked: + + /* nothing to send */ + if (plen == 0) { + KASSERT(m == NULL, + ("%s: nothing to send, but m != NULL", __func__)); + break; + } + + if (__predict_false(toepcb_flag(toep, TPF_FIN_SENT))) + panic("%s: excess tx.", __func__); + + if (plen <= max_imm) { + + /* Immediate data tx */ + + wr = alloc_wrqe(roundup(sizeof(*txwr) + plen, 16), + toep->ofld_txq); + if (wr == NULL) { + /* XXX: how will we recover from this? */ + toepcb_set_flag(toep, TPF_TX_SUSPENDED); + return; + } + txwr = wrtod(wr); + credits = howmany(wr->wr_len, 16); + write_tx_wr(txwr, toep, plen, plen, credits, + tp->t_flags & TF_MORETOCOME); + m_copydata(sndptr, 0, plen, (void *)(txwr + 1)); + } else { + int wr_len; + + /* DSGL tx */ + + wr_len = sizeof(*txwr) + sizeof(struct ulptx_sgl) + + ((3 * (nsegs - 1)) / 2 + ((nsegs - 1) & 1)) * 8; + wr = alloc_wrqe(roundup(wr_len, 16), toep->ofld_txq); + if (wr == NULL) { + /* XXX: how will we recover from this? */ + toepcb_set_flag(toep, TPF_TX_SUSPENDED); + return; + } + txwr = wrtod(wr); + credits = howmany(wr_len, 16); + write_tx_wr(txwr, toep, 0, plen, credits, + tp->t_flags & TF_MORETOCOME); + write_tx_sgl(txwr + 1, sndptr, m, nsegs, + max_nsegs_1mbuf); + if (wr_len & 0xf) { + uint64_t *pad = (uint64_t *) + ((uintptr_t)txwr + wr_len); + *pad = 0; + } + } + + KASSERT(toep->tx_credits >= credits, + ("%s: not enough credits", __func__)); + + toep->tx_credits -= credits; + + tp->snd_nxt += plen; + tp->snd_max += plen; + + SOCKBUF_LOCK(sb); + KASSERT(sb_sndptr, ("%s: sb_sndptr is NULL", __func__)); + sb->sb_sndptr = sb_sndptr; + SOCKBUF_UNLOCK(sb); + + toepcb_set_flag(toep, TPF_TX_DATA_SENT); + + KASSERT(toep->txsd_avail > 0, ("%s: no txsd", __func__)); + txsd->plen = plen; + txsd->tx_credits = credits; + txsd++; + if (__predict_false(++toep->txsd_pidx == toep->txsd_total)) { + toep->txsd_pidx = 0; + txsd = &toep->txsd[0]; + } + toep->txsd_avail--; + + t4_l2t_send(sc, wr, toep->l2te); + } while (m != NULL); + + /* Send a FIN if requested, but only if there's no more data to send */ + if (m == NULL && toepcb_flag(toep, TPF_SEND_FIN)) + close_conn(sc, toep); +} + +int +t4_tod_output(struct toedev *tod, struct tcpcb *tp) +{ + struct adapter *sc = tod->tod_softc; +#ifdef INVARIANTS + struct inpcb *inp = tp->t_inpcb; +#endif + struct toepcb *toep = tp->t_toe; + + INP_WLOCK_ASSERT(inp); + KASSERT((inp->inp_flags & INP_DROPPED) == 0, + ("%s: inp %p dropped.", __func__, inp)); + KASSERT(toep != NULL, ("%s: toep is NULL", __func__)); + + t4_push_frames(sc, toep); + + return (0); +} + +int +t4_send_fin(struct toedev *tod, struct tcpcb *tp) +{ + struct adapter *sc = tod->tod_softc; +#ifdef INVARIANTS + struct inpcb *inp = tp->t_inpcb; +#endif + struct toepcb *toep = tp->t_toe; + + INP_WLOCK_ASSERT(inp); + KASSERT((inp->inp_flags & INP_DROPPED) == 0, + ("%s: inp %p dropped.", __func__, inp)); + KASSERT(toep != NULL, ("%s: toep is NULL", __func__)); + + toepcb_set_flag(toep, TPF_SEND_FIN); + t4_push_frames(sc, toep); + + return (0); +} + +int +t4_send_rst(struct toedev *tod, struct tcpcb *tp) +{ + struct adapter *sc = tod->tod_softc; +#if defined(INVARIANTS) + struct inpcb *inp = tp->t_inpcb; +#endif + struct toepcb *toep = tp->t_toe; + + INP_WLOCK_ASSERT(inp); + KASSERT((inp->inp_flags & INP_DROPPED) == 0, + ("%s: inp %p dropped.", __func__, inp)); + KASSERT(toep != NULL, ("%s: toep is NULL", __func__)); + + /* hmmmm */ + KASSERT(toepcb_flag(toep, TPF_FLOWC_WR_SENT), + ("%s: flowc for tid %u [%s] not sent already", + __func__, toep->tid, tcpstates[tp->t_state])); + + send_reset(sc, toep, 0); + return (0); +} + +/* + * Peer has sent us a FIN. + */ +static int +do_peer_close(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_peer_close *cpl = (const void *)(rss + 1); + unsigned int tid = GET_TID(cpl); + struct toepcb *toep = lookup_tid(sc, tid); + struct inpcb *inp = toep->inp; + struct tcpcb *tp = NULL; + struct socket *so = NULL; +#ifdef INVARIANTS + unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl))); +#endif + + KASSERT(opcode == CPL_PEER_CLOSE, + ("%s: unexpected opcode 0x%x", __func__, opcode)); + KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__)); + KASSERT(toep->tid == tid, ("%s: toep tid mismatch", __func__)); + + INP_INFO_WLOCK(&V_tcbinfo); + INP_WLOCK(inp); + tp = intotcpcb(inp); + + CTR5(KTR_CXGBE, "%s: tid %u (%s), toep_flags 0x%x, inp %p", __func__, + tid, tp ? tcpstates[tp->t_state] : "no tp", toep->flags, inp); + + if (toepcb_flag(toep, TPF_ABORT_SHUTDOWN)) + goto done; + + so = inp->inp_socket; + + socantrcvmore(so); + tp->rcv_nxt++; /* FIN */ + KASSERT(tp->rcv_nxt == be32toh(cpl->rcv_nxt), + ("%s: rcv_nxt mismatch: %u %u", __func__, tp->rcv_nxt, + be32toh(cpl->rcv_nxt))); + + switch (tp->t_state) { + case TCPS_SYN_RECEIVED: + tp->t_starttime = ticks; + /* FALLTHROUGH */ + + case TCPS_ESTABLISHED: + tp->t_state = TCPS_CLOSE_WAIT; + break; + + case TCPS_FIN_WAIT_1: + tp->t_state = TCPS_CLOSING; + break; + + case TCPS_FIN_WAIT_2: + tcp_twstart(tp); + INP_UNLOCK_ASSERT(inp); /* safe, we have a ref on the inp */ + INP_INFO_WUNLOCK(&V_tcbinfo); + + INP_WLOCK(inp); + final_cpl_received(toep); + return (0); + + default: + log(LOG_ERR, "%s: TID %u received CPL_PEER_CLOSE in state %d\n", + __func__, tid, tp->t_state); + } +done: + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + return (0); +} + +/* + * Peer has ACK'd our FIN. + */ +static int +do_close_con_rpl(struct sge_iq *iq, const struct rss_header *rss, + struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_close_con_rpl *cpl = (const void *)(rss + 1); + unsigned int tid = GET_TID(cpl); + struct toepcb *toep = lookup_tid(sc, tid); + struct inpcb *inp = toep->inp; + struct tcpcb *tp = NULL; + struct socket *so = NULL; +#ifdef INVARIANTS + unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl))); +#endif + + KASSERT(opcode == CPL_CLOSE_CON_RPL, + ("%s: unexpected opcode 0x%x", __func__, opcode)); + KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__)); + KASSERT(toep->tid == tid, ("%s: toep tid mismatch", __func__)); + + INP_INFO_WLOCK(&V_tcbinfo); + INP_WLOCK(inp); + tp = intotcpcb(inp); + + CTR4(KTR_CXGBE, "%s: tid %u (%s), toep_flags 0x%x", + __func__, tid, tp ? tcpstates[tp->t_state] : "no tp", toep->flags); + + if (toepcb_flag(toep, TPF_ABORT_SHUTDOWN)) + goto done; + + so = inp->inp_socket; + tp->snd_una = be32toh(cpl->snd_nxt) - 1; /* exclude FIN */ + + switch (tp->t_state) { + case TCPS_CLOSING: /* see TCPS_FIN_WAIT_2 in do_peer_close too */ + tcp_twstart(tp); +release: + INP_UNLOCK_ASSERT(inp); /* safe, we have a ref on the inp */ + INP_INFO_WUNLOCK(&V_tcbinfo); + + INP_WLOCK(inp); + final_cpl_received(toep); /* no more CPLs expected */ + + return (0); + case TCPS_LAST_ACK: + if (tcp_close(tp)) + INP_WUNLOCK(inp); + goto release; + + case TCPS_FIN_WAIT_1: + if (so->so_rcv.sb_state & SBS_CANTRCVMORE) + soisdisconnected(so); + tp->t_state = TCPS_FIN_WAIT_2; + break; + + default: + log(LOG_ERR, + "%s: TID %u received CPL_CLOSE_CON_RPL in state %s\n", + __func__, tid, tcpstates[tp->t_state]); + } +done: + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + return (0); +} + +void +send_abort_rpl(struct adapter *sc, struct sge_wrq *ofld_txq, int tid, + int rst_status) +{ + struct wrqe *wr; + struct cpl_abort_rpl *cpl; + + wr = alloc_wrqe(sizeof(*cpl), ofld_txq); + if (wr == NULL) { + /* XXX */ + panic("%s: allocation failure.", __func__); + } + cpl = wrtod(wr); + + INIT_TP_WR_MIT_CPL(cpl, CPL_ABORT_RPL, tid); + cpl->cmd = rst_status; + + t4_wrq_tx(sc, wr); +} + +static int +abort_status_to_errno(struct tcpcb *tp, unsigned int abort_reason) +{ + switch (abort_reason) { + case CPL_ERR_BAD_SYN: + case CPL_ERR_CONN_RESET: + return (tp->t_state == TCPS_CLOSE_WAIT ? EPIPE : ECONNRESET); + case CPL_ERR_XMIT_TIMEDOUT: + case CPL_ERR_PERSIST_TIMEDOUT: + case CPL_ERR_FINWAIT2_TIMEDOUT: + case CPL_ERR_KEEPALIVE_TIMEDOUT: + return (ETIMEDOUT); + default: + return (EIO); + } +} + +/* + * TCP RST from the peer, timeout, or some other such critical error. + */ +static int +do_abort_req(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_abort_req_rss *cpl = (const void *)(rss + 1); + unsigned int tid = GET_TID(cpl); + struct toepcb *toep = lookup_tid(sc, tid); + struct sge_wrq *ofld_txq = toep->ofld_txq; + struct inpcb *inp; + struct tcpcb *tp; + struct socket *so; +#ifdef INVARIANTS + unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl))); +#endif + + KASSERT(opcode == CPL_ABORT_REQ_RSS, + ("%s: unexpected opcode 0x%x", __func__, opcode)); + KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__)); + + if (toepcb_flag(toep, TPF_SYNQE)) + return (do_abort_req_synqe(iq, rss, m)); + + KASSERT(toep->tid == tid, ("%s: toep tid mismatch", __func__)); + + if (cpl->status == CPL_ERR_RTX_NEG_ADVICE || + cpl->status == CPL_ERR_PERSIST_NEG_ADVICE) { + CTR4(KTR_CXGBE, "%s: negative advice %d for tid %d (0x%x)", + __func__, cpl->status, tid, toep->flags); + return (0); /* Ignore negative advice */ + } + + inp = toep->inp; + INP_INFO_WLOCK(&V_tcbinfo); /* for tcp_close */ + INP_WLOCK(inp); + + tp = intotcpcb(inp); + so = inp->inp_socket; + + CTR6(KTR_CXGBE, + "%s: tid %d (%s), toep_flags 0x%x, inp_flags 0x%x, status %d", + __func__, tid, tcpstates[tp->t_state], toep->flags, inp->inp_flags, + cpl->status); + + /* + * If we'd initiated an abort earlier the reply to it is responsible for + * cleaning up resources. Otherwise we tear everything down right here + * right now. We owe the T4 a CPL_ABORT_RPL no matter what. + */ + if (toepcb_flag(toep, TPF_ABORT_SHUTDOWN)) { + INP_WUNLOCK(inp); + goto done; + } + toepcb_set_flag(toep, TPF_ABORT_SHUTDOWN); + + so_error_set(so, abort_status_to_errno(tp, cpl->status)); + tp = tcp_close(tp); + if (tp == NULL) + INP_WLOCK(inp); /* re-acquire */ + + final_cpl_received(toep); +done: + INP_INFO_WUNLOCK(&V_tcbinfo); + send_abort_rpl(sc, ofld_txq, tid, CPL_ABORT_NO_RST); + return (0); +} + +/* + * Reply to the CPL_ABORT_REQ (send_reset) + */ +static int +do_abort_rpl(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_abort_rpl_rss *cpl = (const void *)(rss + 1); + unsigned int tid = GET_TID(cpl); + struct toepcb *toep = lookup_tid(sc, tid); + struct inpcb *inp = toep->inp; +#ifdef INVARIANTS + unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl))); +#endif + + KASSERT(opcode == CPL_ABORT_RPL_RSS, + ("%s: unexpected opcode 0x%x", __func__, opcode)); + KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__)); + + if (toepcb_flag(toep, TPF_SYNQE)) + return (do_abort_rpl_synqe(iq, rss, m)); + + KASSERT(toep->tid == tid, ("%s: toep tid mismatch", __func__)); + + CTR5(KTR_CXGBE, "%s: tid %u, toep %p, inp %p, status %d", + __func__, tid, toep, inp, cpl->status); + + KASSERT(toepcb_flag(toep, TPF_ABORT_SHUTDOWN), + ("%s: wasn't expecting abort reply", __func__)); + + INP_WLOCK(inp); + final_cpl_received(toep); + + return (0); +} + +static int +do_rx_data(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_rx_data *cpl = mtod(m, const void *); + unsigned int tid = GET_TID(cpl); + struct toepcb *toep = lookup_tid(sc, tid); + struct inpcb *inp = toep->inp; + struct tcpcb *tp; + struct socket *so; + struct sockbuf *so_rcv; + + if (__predict_false(toepcb_flag(toep, TPF_SYNQE))) { + /* + * do_pass_establish failed and must be attempting to abort the + * synqe's tid. Meanwhile, the T4 has sent us data for such a + * connection. + */ + KASSERT(toepcb_flag(toep, TPF_ABORT_SHUTDOWN), + ("%s: synqe and tid isn't being aborted.", __func__)); + m_freem(m); + return (0); + } + + KASSERT(toep->tid == tid, ("%s: toep tid mismatch", __func__)); + + /* strip off CPL header */ + m_adj(m, sizeof(*cpl)); + + INP_WLOCK(inp); + if (inp->inp_flags & (INP_DROPPED | INP_TIMEWAIT)) { + CTR4(KTR_CXGBE, "%s: tid %u, rx (%d bytes), inp_flags 0x%x", + __func__, tid, m->m_pkthdr.len, inp->inp_flags); + INP_WUNLOCK(inp); + m_freem(m); + return (0); + } + + tp = intotcpcb(inp); + +#ifdef INVARIANTS + if (__predict_false(tp->rcv_nxt != be32toh(cpl->seq))) { + log(LOG_ERR, + "%s: unexpected seq# %x for TID %u, rcv_nxt %x\n", + __func__, be32toh(cpl->seq), toep->tid, tp->rcv_nxt); + } +#endif + + tp->rcv_nxt += m->m_pkthdr.len; + KASSERT(tp->rcv_wnd >= m->m_pkthdr.len, + ("%s: negative window size", __func__)); + tp->rcv_wnd -= m->m_pkthdr.len; + tp->t_rcvtime = ticks; + + so = inp_inpcbtosocket(inp); + so_rcv = &so->so_rcv; + SOCKBUF_LOCK(so_rcv); + + if (__predict_false(so_rcv->sb_state & SBS_CANTRCVMORE)) { + CTR3(KTR_CXGBE, "%s: tid %u, excess rx (%d bytes)", + __func__, tid, m->m_pkthdr.len); + m_freem(m); + SOCKBUF_UNLOCK(so_rcv); + INP_WUNLOCK(inp); + + INP_INFO_WLOCK(&V_tcbinfo); + INP_WLOCK(inp); + tp = tcp_drop(tp, ECONNRESET); + if (tp) + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + + return (0); + } + + /* receive buffer autosize */ + if (so_rcv->sb_flags & SB_AUTOSIZE && + V_tcp_do_autorcvbuf && + so_rcv->sb_hiwat < V_tcp_autorcvbuf_max && + m->m_pkthdr.len > (sbspace(so_rcv) / 8 * 7)) { + unsigned int hiwat = so_rcv->sb_hiwat; + unsigned int newsize = min(hiwat + V_tcp_autorcvbuf_inc, + V_tcp_autorcvbuf_max); + + if (!sbreserve_locked(so_rcv, newsize, so, NULL)) + so_rcv->sb_flags &= ~SB_AUTOSIZE; + else + toep->rx_credits += newsize - hiwat; + } + toep->enqueued += m->m_pkthdr.len; + sbappendstream_locked(so_rcv, m); + sorwakeup_locked(so); + SOCKBUF_UNLOCK_ASSERT(so_rcv); + + INP_WUNLOCK(inp); + return (0); +} + +#define S_CPL_FW4_ACK_OPCODE 24 +#define M_CPL_FW4_ACK_OPCODE 0xff +#define V_CPL_FW4_ACK_OPCODE(x) ((x) << S_CPL_FW4_ACK_OPCODE) +#define G_CPL_FW4_ACK_OPCODE(x) \ + (((x) >> S_CPL_FW4_ACK_OPCODE) & M_CPL_FW4_ACK_OPCODE) + +#define S_CPL_FW4_ACK_FLOWID 0 +#define M_CPL_FW4_ACK_FLOWID 0xffffff +#define V_CPL_FW4_ACK_FLOWID(x) ((x) << S_CPL_FW4_ACK_FLOWID) +#define G_CPL_FW4_ACK_FLOWID(x) \ + (((x) >> S_CPL_FW4_ACK_FLOWID) & M_CPL_FW4_ACK_FLOWID) + +#define S_CPL_FW4_ACK_CR 24 +#define M_CPL_FW4_ACK_CR 0xff +#define V_CPL_FW4_ACK_CR(x) ((x) << S_CPL_FW4_ACK_CR) +#define G_CPL_FW4_ACK_CR(x) (((x) >> S_CPL_FW4_ACK_CR) & M_CPL_FW4_ACK_CR) + +#define S_CPL_FW4_ACK_SEQVAL 0 +#define M_CPL_FW4_ACK_SEQVAL 0x1 +#define V_CPL_FW4_ACK_SEQVAL(x) ((x) << S_CPL_FW4_ACK_SEQVAL) +#define G_CPL_FW4_ACK_SEQVAL(x) \ + (((x) >> S_CPL_FW4_ACK_SEQVAL) & M_CPL_FW4_ACK_SEQVAL) +#define F_CPL_FW4_ACK_SEQVAL V_CPL_FW4_ACK_SEQVAL(1U) + +static int +do_fw4_ack(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_fw4_ack *cpl = (const void *)(rss + 1); + unsigned int tid = G_CPL_FW4_ACK_FLOWID(be32toh(OPCODE_TID(cpl))); + struct toepcb *toep = lookup_tid(sc, tid); + struct inpcb *inp; + struct tcpcb *tp; + struct socket *so; + uint8_t credits = cpl->credits; + struct ofld_tx_sdesc *txsd; + int plen; +#ifdef INVARIANTS + unsigned int opcode = G_CPL_FW4_ACK_OPCODE(be32toh(OPCODE_TID(cpl))); +#endif + + /* + * Very unusual case: we'd sent a flowc + abort_req for a synq entry and + * now this comes back carrying the credits for the flowc. + */ + if (__predict_false(toepcb_flag(toep, TPF_SYNQE))) { + KASSERT(toepcb_flag(toep, TPF_ABORT_SHUTDOWN), + ("%s: credits for a synq entry %p", __func__, toep)); + return (0); + } + + inp = toep->inp; + + KASSERT(opcode == CPL_FW4_ACK, + ("%s: unexpected opcode 0x%x", __func__, opcode)); + KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__)); + KASSERT(toep->tid == tid, ("%s: toep tid mismatch", __func__)); + + INP_WLOCK(inp); + + if (__predict_false(toepcb_flag(toep, TPF_ABORT_SHUTDOWN))) { + INP_WUNLOCK(inp); + return (0); + } + + KASSERT((inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) == 0, + ("%s: inp_flags 0x%x", __func__, inp->inp_flags)); + + tp = intotcpcb(inp); + + if (cpl->flags & CPL_FW4_ACK_FLAGS_SEQVAL) { + tcp_seq snd_una = be32toh(cpl->snd_una); + +#ifdef INVARIANTS + if (__predict_false(SEQ_LT(snd_una, tp->snd_una))) { + log(LOG_ERR, + "%s: unexpected seq# %x for TID %u, snd_una %x\n", + __func__, snd_una, toep->tid, tp->snd_una); + } +#endif + + if (tp->snd_una != snd_una) { + tp->snd_una = snd_una; + tp->ts_recent_age = tcp_ts_getticks(); + } + } + + so = inp->inp_socket; + txsd = &toep->txsd[toep->txsd_cidx]; + plen = 0; + while (credits) { + KASSERT(credits >= txsd->tx_credits, + ("%s: too many (or partial) credits", __func__)); + credits -= txsd->tx_credits; + toep->tx_credits += txsd->tx_credits; + plen += txsd->plen; + txsd++; + toep->txsd_avail++; + KASSERT(toep->txsd_avail <= toep->txsd_total, + ("%s: txsd avail > total", __func__)); + if (__predict_false(++toep->txsd_cidx == toep->txsd_total)) { + txsd = &toep->txsd[0]; + toep->txsd_cidx = 0; + } + } + + if (plen > 0) { + struct sockbuf *sb = &so->so_snd; + + SOCKBUF_LOCK(sb); + sbdrop_locked(sb, plen); + sowwakeup_locked(so); + SOCKBUF_UNLOCK_ASSERT(sb); + } + + /* XXX */ + if ((toepcb_flag(toep, TPF_TX_SUSPENDED) && + toep->tx_credits >= MIN_OFLD_TX_CREDITS) || + toep->tx_credits == toep->txsd_total * + howmany((sizeof(struct fw_ofld_tx_data_wr) + 1), 16)) { + toepcb_clr_flag(toep, TPF_TX_SUSPENDED); + t4_push_frames(sc, toep); + } + INP_WUNLOCK(inp); + + return (0); +} + +void +t4_init_cpl_io_handlers(struct adapter *sc) +{ + + t4_register_cpl_handler(sc, CPL_PEER_CLOSE, do_peer_close); + t4_register_cpl_handler(sc, CPL_CLOSE_CON_RPL, do_close_con_rpl); + t4_register_cpl_handler(sc, CPL_ABORT_REQ_RSS, do_abort_req); + t4_register_cpl_handler(sc, CPL_ABORT_RPL_RSS, do_abort_rpl); + t4_register_cpl_handler(sc, CPL_RX_DATA, do_rx_data); + t4_register_cpl_handler(sc, CPL_FW4_ACK, do_fw4_ack); +} +#endif diff --git a/sys/dev/cxgbe/tom/t4_listen.c b/sys/dev/cxgbe/tom/t4_listen.c new file mode 100644 index 00000000000..895e57ad073 --- /dev/null +++ b/sys/dev/cxgbe/tom/t4_listen.c @@ -0,0 +1,1362 @@ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * Written by: Navdeep Parhar + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define TCPSTATES +#include +#include + +#include "common/common.h" +#include "common/t4_msg.h" +#include "common/t4_regs.h" +#include "tom/t4_tom_l2t.h" +#include "tom/t4_tom.h" + +/* stid services */ +static int alloc_stid(struct adapter *, void *); +static void *lookup_stid(struct adapter *, int); +static void free_stid(struct adapter *, int); + +/* lctx services */ +static struct listen_ctx *alloc_lctx(struct adapter *, struct inpcb *, + struct port_info *); +static int free_lctx(struct adapter *, struct listen_ctx *); +static void hold_lctx(struct listen_ctx *); +static void listen_hash_add(struct adapter *, struct listen_ctx *); +static struct listen_ctx *listen_hash_find(struct adapter *, struct inpcb *); +static struct listen_ctx *listen_hash_del(struct adapter *, struct inpcb *); +static struct inpcb *release_lctx(struct adapter *, struct listen_ctx *); + +static inline void save_qids_in_mbuf(struct mbuf *, struct port_info *); +static inline void get_qids_from_mbuf(struct mbuf *m, int *, int *); +static void send_reset_synqe(struct toedev *, struct synq_entry *); + +/* XXX: won't work for IPv6 */ +static int +alloc_stid(struct adapter *sc, void *ctx) +{ + struct tid_info *t = &sc->tids; + int stid = -1; + + mtx_lock(&t->stid_lock); + if (t->sfree) { + union serv_entry *p = t->sfree; + + stid = p - t->stid_tab; + stid += t->stid_base; + t->sfree = p->next; + p->data = ctx; + t->stids_in_use++; + } + mtx_unlock(&t->stid_lock); + return (stid); +} + +static void * +lookup_stid(struct adapter *sc, int stid) +{ + struct tid_info *t = &sc->tids; + + return (t->stid_tab[stid - t->stid_base].data); +} + +static void +free_stid(struct adapter *sc, int stid) +{ + struct tid_info *t = &sc->tids; + union serv_entry *p = &t->stid_tab[stid - t->stid_base]; + + mtx_lock(&t->stid_lock); + p->next = t->sfree; + t->sfree = p; + t->stids_in_use--; + mtx_unlock(&t->stid_lock); +} + +static struct listen_ctx * +alloc_lctx(struct adapter *sc, struct inpcb *inp, struct port_info *pi) +{ + struct listen_ctx *lctx; + + INP_WLOCK_ASSERT(inp); + + lctx = malloc(sizeof(struct listen_ctx), M_CXGBE, M_NOWAIT | M_ZERO); + if (lctx == NULL) + return (NULL); + + lctx->stid = alloc_stid(sc, lctx); + if (lctx->stid < 0) { + free(lctx, M_CXGBE); + return (NULL); + } + + lctx->ctrlq = &sc->sge.ctrlq[pi->port_id]; + lctx->ofld_rxq = &sc->sge.ofld_rxq[pi->first_ofld_rxq]; + refcount_init(&lctx->refcount, 1); + TAILQ_INIT(&lctx->synq); + + lctx->inp = inp; + in_pcbref(inp); + + return (lctx); +} + +/* Don't call this directly, use release_lctx instead */ +static int +free_lctx(struct adapter *sc, struct listen_ctx *lctx) +{ + struct inpcb *inp = lctx->inp; + + INP_WLOCK_ASSERT(inp); + KASSERT(lctx->refcount == 0, + ("%s: refcount %d", __func__, lctx->refcount)); + KASSERT(TAILQ_EMPTY(&lctx->synq), + ("%s: synq not empty.", __func__)); + KASSERT(lctx->stid >= 0, ("%s: bad stid %d.", __func__, lctx->stid)); + + CTR4(KTR_CXGBE, "%s: stid %u, lctx %p, inp %p", + __func__, lctx->stid, lctx, lctx->inp); + + free_stid(sc, lctx->stid); + free(lctx, M_CXGBE); + + return (in_pcbrele_wlocked(inp)); +} + +static void +hold_lctx(struct listen_ctx *lctx) +{ + + refcount_acquire(&lctx->refcount); +} + +static inline uint32_t +listen_hashfn(void *key, u_long mask) +{ + + return (fnv_32_buf(&key, sizeof(key), FNV1_32_INIT) & mask); +} + +/* + * Add a listen_ctx entry to the listen hash table. + */ +static void +listen_hash_add(struct adapter *sc, struct listen_ctx *lctx) +{ + struct tom_data *td = sc->tom_softc; + int bucket = listen_hashfn(lctx->inp, td->listen_mask); + + mtx_lock(&td->lctx_hash_lock); + LIST_INSERT_HEAD(&td->listen_hash[bucket], lctx, link); + td->lctx_count++; + mtx_unlock(&td->lctx_hash_lock); +} + +/* + * Look for the listening socket's context entry in the hash and return it. + */ +static struct listen_ctx * +listen_hash_find(struct adapter *sc, struct inpcb *inp) +{ + struct tom_data *td = sc->tom_softc; + int bucket = listen_hashfn(inp, td->listen_mask); + struct listen_ctx *lctx; + + mtx_lock(&td->lctx_hash_lock); + LIST_FOREACH(lctx, &td->listen_hash[bucket], link) { + if (lctx->inp == inp) + break; + } + mtx_unlock(&td->lctx_hash_lock); + + return (lctx); +} + +/* + * Removes the listen_ctx structure for inp from the hash and returns it. + */ +static struct listen_ctx * +listen_hash_del(struct adapter *sc, struct inpcb *inp) +{ + struct tom_data *td = sc->tom_softc; + int bucket = listen_hashfn(inp, td->listen_mask); + struct listen_ctx *lctx, *l; + + mtx_lock(&td->lctx_hash_lock); + LIST_FOREACH_SAFE(lctx, &td->listen_hash[bucket], link, l) { + if (lctx->inp == inp) { + LIST_REMOVE(lctx, link); + td->lctx_count--; + break; + } + } + mtx_unlock(&td->lctx_hash_lock); + + return (lctx); +} + +/* + * Releases a hold on the lctx. Must be called with the listening socket's inp + * locked. The inp may be freed by this function and it returns NULL to + * indicate this. + */ +static struct inpcb * +release_lctx(struct adapter *sc, struct listen_ctx *lctx) +{ + struct inpcb *inp = lctx->inp; + int inp_freed = 0; + + INP_WLOCK_ASSERT(inp); + if (refcount_release(&lctx->refcount)) + inp_freed = free_lctx(sc, lctx); + + return (inp_freed ? NULL : inp); +} + +static void +send_reset_synqe(struct toedev *tod, struct synq_entry *synqe) +{ + struct adapter *sc = tod->tod_softc; + struct mbuf *m = synqe->syn; + struct ifnet *ifp = m->m_pkthdr.rcvif; + struct port_info *pi = ifp->if_softc; + struct l2t_entry *e = &sc->l2t->l2tab[synqe->l2e_idx]; + struct wrqe *wr; + struct fw_flowc_wr *flowc; + struct cpl_abort_req *req; + int txqid, rxqid, flowclen; + struct sge_wrq *ofld_txq; + struct sge_ofld_rxq *ofld_rxq; + const int nparams = 4; + unsigned int pfvf = G_FW_VIID_PFN(pi->viid) << S_FW_VIID_PFN; + + INP_WLOCK_ASSERT(synqe->lctx->inp); + + CTR4(KTR_CXGBE, "%s: synqe %p, tid %d%s", + __func__, synqe, synqe->tid, + synqe_flag(synqe, TPF_ABORT_SHUTDOWN) ? + " (abort already in progress)" : ""); + if (synqe_flag(synqe, TPF_ABORT_SHUTDOWN)) + return; /* abort already in progress */ + synqe_set_flag(synqe, TPF_ABORT_SHUTDOWN); + + get_qids_from_mbuf(m, &txqid, &rxqid); + ofld_txq = &sc->sge.ofld_txq[txqid]; + ofld_rxq = &sc->sge.ofld_rxq[rxqid]; + + /* The wrqe will have two WRs - a flowc followed by an abort_req */ + flowclen = sizeof(*flowc) + nparams * sizeof(struct fw_flowc_mnemval); + + wr = alloc_wrqe(roundup(flowclen, EQ_ESIZE) + sizeof(*req), ofld_txq); + if (wr == NULL) { + /* XXX */ + panic("%s: allocation failure.", __func__); + } + flowc = wrtod(wr); + req = (void *)((caddr_t)flowc + roundup(flowclen, EQ_ESIZE)); + + /* First the flowc ... */ + memset(flowc, 0, wr->wr_len); + flowc->op_to_nparams = htobe32(V_FW_WR_OP(FW_FLOWC_WR) | + V_FW_FLOWC_WR_NPARAMS(nparams)); + flowc->flowid_len16 = htonl(V_FW_WR_LEN16(howmany(flowclen, 16)) | + V_FW_WR_FLOWID(synqe->tid)); + flowc->mnemval[0].mnemonic = FW_FLOWC_MNEM_PFNVFN; + flowc->mnemval[0].val = htobe32(pfvf); + flowc->mnemval[1].mnemonic = FW_FLOWC_MNEM_CH; + flowc->mnemval[1].val = htobe32(pi->tx_chan); + flowc->mnemval[2].mnemonic = FW_FLOWC_MNEM_PORT; + flowc->mnemval[2].val = htobe32(pi->tx_chan); + flowc->mnemval[3].mnemonic = FW_FLOWC_MNEM_IQID; + flowc->mnemval[3].val = htobe32(ofld_rxq->iq.abs_id); + synqe_set_flag(synqe, TPF_FLOWC_WR_SENT); + + /* ... then ABORT request */ + INIT_TP_WR_MIT_CPL(req, CPL_ABORT_REQ, synqe->tid); + req->rsvd0 = 0; /* don't have a snd_nxt */ + req->rsvd1 = 1; /* no data sent yet */ + req->cmd = CPL_ABORT_SEND_RST; + + t4_l2t_send(sc, wr, e); +} + +static int +create_server(struct adapter *sc, struct listen_ctx *lctx) +{ + struct wrqe *wr; + struct cpl_pass_open_req *req; + struct in_conninfo *inc = &lctx->inp->inp_inc; + + wr = alloc_wrqe(sizeof(*req), lctx->ctrlq); + if (wr == NULL) { + log(LOG_ERR, "%s: allocation failure", __func__); + return (ENOMEM); + } + req = wrtod(wr); + + INIT_TP_WR(req, 0); + OPCODE_TID(req) = htobe32(MK_OPCODE_TID(CPL_PASS_OPEN_REQ, lctx->stid)); + req->local_port = inc->inc_lport; + req->peer_port = 0; + req->local_ip = inc->inc_laddr.s_addr; + req->peer_ip = 0; + req->opt0 = htobe64(V_TX_CHAN(lctx->ctrlq->eq.tx_chan)); + req->opt1 = htobe64(V_CONN_POLICY(CPL_CONN_POLICY_ASK) | + F_SYN_RSS_ENABLE | V_SYN_RSS_QUEUE(lctx->ofld_rxq->iq.abs_id)); + + t4_wrq_tx(sc, wr); + return (0); +} + +static int +destroy_server(struct adapter *sc, struct listen_ctx *lctx) +{ + struct wrqe *wr; + struct cpl_close_listsvr_req *req; + + wr = alloc_wrqe(sizeof(*req), lctx->ctrlq); + if (wr == NULL) { + /* XXX */ + panic("%s: allocation failure.", __func__); + } + req = wrtod(wr); + + INIT_TP_WR(req, 0); + OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_LISTSRV_REQ, + lctx->stid)); + req->reply_ctrl = htobe16(lctx->ofld_rxq->iq.abs_id); + req->rsvd = htobe16(0); + + t4_wrq_tx(sc, wr); + return (0); +} + +/* + * Start a listening server by sending a passive open request to HW. + * + * Can't take adapter lock here and access to sc->flags, sc->open_device_map, + * sc->offload_map, if_capenable are all race prone. + */ +int +t4_listen_start(struct toedev *tod, struct tcpcb *tp) +{ + struct adapter *sc = tod->tod_softc; + struct port_info *pi; + struct inpcb *inp = tp->t_inpcb; + struct listen_ctx *lctx; + int i; + + INP_WLOCK_ASSERT(inp); + + if ((inp->inp_vflag & INP_IPV4) == 0) + return (0); + +#if 0 + ADAPTER_LOCK(sc); + if (IS_BUSY(sc)) { + log(LOG_ERR, "%s: listen request ignored, %s is busy", + __func__, device_get_nameunit(sc->dev)); + goto done; + } + + KASSERT(sc->flags & TOM_INIT_DONE, + ("%s: TOM not initialized", __func__)); +#endif + + if ((sc->open_device_map & sc->offload_map) == 0) + goto done; /* no port that's UP with IFCAP_TOE enabled */ + + /* + * Find a running port with IFCAP_TOE4. We'll use the first such port's + * queues to send the passive open and receive the reply to it. + * + * XXX: need a way to mark a port in use by offload. if_cxgbe should + * then reject any attempt to bring down such a port (and maybe reject + * attempts to disable IFCAP_TOE on that port too?). + */ + for_each_port(sc, i) { + if (isset(&sc->open_device_map, i) && + sc->port[i]->ifp->if_capenable & IFCAP_TOE4) + break; + } + KASSERT(i < sc->params.nports, + ("%s: no running port with TOE capability enabled.", __func__)); + pi = sc->port[i]; + + if (listen_hash_find(sc, inp) != NULL) + goto done; /* already setup */ + + lctx = alloc_lctx(sc, inp, pi); + if (lctx == NULL) { + log(LOG_ERR, + "%s: listen request ignored, %s couldn't allocate lctx\n", + __func__, device_get_nameunit(sc->dev)); + goto done; + } + listen_hash_add(sc, lctx); + + CTR5(KTR_CXGBE, "%s: stid %u (%s), lctx %p, inp %p", __func__, + lctx->stid, tcpstates[tp->t_state], lctx, inp); + + if (create_server(sc, lctx) != 0) { + log(LOG_ERR, "%s: %s failed to create hw listener.\n", __func__, + device_get_nameunit(sc->dev)); + (void) listen_hash_del(sc, inp); + inp = release_lctx(sc, lctx); + /* can't be freed, host stack has a reference */ + KASSERT(inp != NULL, ("%s: inp freed", __func__)); + goto done; + } + lctx->flags |= LCTX_RPL_PENDING; +done: +#if 0 + ADAPTER_UNLOCK(sc); +#endif + return (0); +} + +int +t4_listen_stop(struct toedev *tod, struct tcpcb *tp) +{ + struct listen_ctx *lctx; + struct adapter *sc = tod->tod_softc; + struct inpcb *inp = tp->t_inpcb; + struct synq_entry *synqe; + + INP_WLOCK_ASSERT(inp); + + lctx = listen_hash_del(sc, inp); + if (lctx == NULL) + return (ENOENT); /* no hardware listener for this inp */ + + CTR4(KTR_CXGBE, "%s: stid %u, lctx %p, flags %x", __func__, lctx->stid, + lctx, lctx->flags); + + /* + * If the reply to the PASS_OPEN is still pending we'll wait for it to + * arrive and clean up when it does. + */ + if (lctx->flags & LCTX_RPL_PENDING) { + KASSERT(TAILQ_EMPTY(&lctx->synq), + ("%s: synq not empty.", __func__)); + return (EINPROGRESS); + } + + /* + * The host stack will abort all the connections on the listening + * socket's so_comp. It doesn't know about the connections on the synq + * so we need to take care of those. + */ + TAILQ_FOREACH(synqe, &lctx->synq, link) + send_reset_synqe(tod, synqe); + + destroy_server(sc, lctx); + return (0); +} + +static inline void +hold_synqe(struct synq_entry *synqe) +{ + + refcount_acquire(&synqe->refcnt); +} + +static inline void +release_synqe(struct synq_entry *synqe) +{ + + if (refcount_release(&synqe->refcnt)) { + int needfree = synqe_flag(synqe, TPF_SYNQE_NEEDFREE); + + m_freem(synqe->syn); + if (needfree) + free(synqe, M_CXGBE); + } +} + +void +t4_syncache_added(struct toedev *tod __unused, void *arg) +{ + struct synq_entry *synqe = arg; + + hold_synqe(synqe); +} + +void +t4_syncache_removed(struct toedev *tod __unused, void *arg) +{ + struct synq_entry *synqe = arg; + + release_synqe(synqe); +} + +/* XXX */ +extern void tcp_dooptions(struct tcpopt *, u_char *, int, int); + +int +t4_syncache_respond(struct toedev *tod, void *arg, struct mbuf *m) +{ + struct adapter *sc = tod->tod_softc; + struct synq_entry *synqe = arg; + struct wrqe *wr; + struct l2t_entry *e; + struct tcpopt to; + struct ip *ip = mtod(m, struct ip *); + struct tcphdr *th = (void *)(ip + 1); + + wr = (struct wrqe *)atomic_readandclear_ptr(&synqe->wr); + if (wr == NULL) + return (EALREADY); + + bzero(&to, sizeof(to)); + tcp_dooptions(&to, (void *)(th + 1), (th->th_off << 2) - sizeof(*th), + TO_SYN); + + /* save these for later */ + synqe->iss = be32toh(th->th_seq); + synqe->ts = to.to_tsval; + + e = &sc->l2t->l2tab[synqe->l2e_idx]; + t4_l2t_send(sc, wr, e); + + m_freem(m); /* don't need this any more */ + return (0); +} + +static int +do_pass_open_rpl(struct sge_iq *iq, const struct rss_header *rss, + struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_pass_open_rpl *cpl = (const void *)(rss + 1); + int stid = GET_TID(cpl); + unsigned int status = cpl->status; + struct listen_ctx *lctx = lookup_stid(sc, stid); + struct inpcb *inp = lctx->inp; +#ifdef INVARIANTS + unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl))); +#endif + + KASSERT(opcode == CPL_PASS_OPEN_RPL, + ("%s: unexpected opcode 0x%x", __func__, opcode)); + KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__)); + KASSERT(lctx->stid == stid, ("%s: lctx stid mismatch", __func__)); + + INP_WLOCK(inp); + + CTR4(KTR_CXGBE, "%s: stid %d, status %u, flags 0x%x", + __func__, stid, status, lctx->flags); + + lctx->flags &= ~LCTX_RPL_PENDING; + + if (status != CPL_ERR_NONE) + log(LOG_ERR, "listener with stid %u failed: %d", stid, status); + +#ifdef INVARIANTS + /* + * If the inp has been dropped (listening socket closed) then + * listen_stop must have run and taken the inp out of the hash. + */ + if (inp->inp_flags & INP_DROPPED) { + KASSERT(listen_hash_del(sc, inp) == NULL, + ("%s: inp %p still in listen hash", __func__, inp)); + } +#endif + + if (inp->inp_flags & INP_DROPPED && status != CPL_ERR_NONE) { + if (release_lctx(sc, lctx) != NULL) + INP_WUNLOCK(inp); + return (status); + } + + /* + * Listening socket stopped listening earlier and now the chip tells us + * it has started the hardware listener. Stop it; the lctx will be + * released in do_close_server_rpl. + */ + if (inp->inp_flags & INP_DROPPED) { + destroy_server(sc, lctx); + INP_WUNLOCK(inp); + return (status); + } + + /* + * Failed to start hardware listener. Take inp out of the hash and + * release our reference on it. An error message has been logged + * already. + */ + if (status != CPL_ERR_NONE) { + listen_hash_del(sc, inp); + if (release_lctx(sc, lctx) != NULL) + INP_WUNLOCK(inp); + return (status); + } + + /* hardware listener open for business */ + + INP_WUNLOCK(inp); + return (status); +} + +static int +do_close_server_rpl(struct sge_iq *iq, const struct rss_header *rss, + struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_close_listsvr_rpl *cpl = (const void *)(rss + 1); + int stid = GET_TID(cpl); + unsigned int status = cpl->status; + struct listen_ctx *lctx = lookup_stid(sc, stid); + struct inpcb *inp = lctx->inp; +#ifdef INVARIANTS + unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl))); +#endif + + KASSERT(opcode == CPL_CLOSE_LISTSRV_RPL, + ("%s: unexpected opcode 0x%x", __func__, opcode)); + KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__)); + KASSERT(lctx->stid == stid, ("%s: lctx stid mismatch", __func__)); + + CTR3(KTR_CXGBE, "%s: stid %u, status %u", __func__, stid, status); + + if (status != CPL_ERR_NONE) { + log(LOG_ERR, "%s: failed (%u) to close listener for stid %u", + __func__, status, stid); + return (status); + } + + INP_WLOCK(inp); + inp = release_lctx(sc, lctx); + if (inp != NULL) + INP_WUNLOCK(inp); + + return (status); +} + +static void +done_with_synqe(struct adapter *sc, struct synq_entry *synqe) +{ + struct listen_ctx *lctx = synqe->lctx; + struct inpcb *inp = lctx->inp; + struct port_info *pi = synqe->syn->m_pkthdr.rcvif->if_softc; + struct l2t_entry *e = &sc->l2t->l2tab[synqe->l2e_idx]; + + INP_WLOCK_ASSERT(inp); + + TAILQ_REMOVE(&lctx->synq, synqe, link); + inp = release_lctx(sc, lctx); + if (inp) + INP_WUNLOCK(inp); + remove_tid(sc, synqe->tid); + release_tid(sc, synqe->tid, &sc->sge.ctrlq[pi->port_id]); + t4_l2t_release(e); + release_synqe(synqe); /* removed from synq list */ +} + +int +do_abort_req_synqe(struct sge_iq *iq, const struct rss_header *rss, + struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_abort_req_rss *cpl = (const void *)(rss + 1); + unsigned int tid = GET_TID(cpl); + struct synq_entry *synqe = lookup_tid(sc, tid); + struct listen_ctx *lctx = synqe->lctx; + struct inpcb *inp = lctx->inp; + int txqid; + struct sge_wrq *ofld_txq; +#ifdef INVARIANTS + unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl))); +#endif + + KASSERT(opcode == CPL_ABORT_REQ_RSS, + ("%s: unexpected opcode 0x%x", __func__, opcode)); + KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__)); + KASSERT(synqe->tid == tid, ("%s: toep tid mismatch", __func__)); + + CTR6(KTR_CXGBE, "%s: tid %u, synqe %p (0x%x), lctx %p, status %d", + __func__, tid, synqe, synqe->flags, synqe->lctx, cpl->status); + + if (cpl->status == CPL_ERR_RTX_NEG_ADVICE || + cpl->status == CPL_ERR_PERSIST_NEG_ADVICE) + return (0); /* Ignore negative advice */ + + INP_WLOCK(inp); + + get_qids_from_mbuf(synqe->syn, &txqid, NULL); + ofld_txq = &sc->sge.ofld_txq[txqid]; + + /* + * If we'd initiated an abort earlier the reply to it is responsible for + * cleaning up resources. Otherwise we tear everything down right here + * right now. We owe the T4 a CPL_ABORT_RPL no matter what. + */ + if (synqe_flag(synqe, TPF_ABORT_SHUTDOWN)) { + INP_WUNLOCK(inp); + goto done; + } + + done_with_synqe(sc, synqe); + /* inp lock released by done_with_synqe */ +done: + send_abort_rpl(sc, ofld_txq, tid, CPL_ABORT_NO_RST); + return (0); +} + +int +do_abort_rpl_synqe(struct sge_iq *iq, const struct rss_header *rss, + struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_abort_rpl_rss *cpl = (const void *)(rss + 1); + unsigned int tid = GET_TID(cpl); + struct synq_entry *synqe = lookup_tid(sc, tid); + struct listen_ctx *lctx = synqe->lctx; + struct inpcb *inp = lctx->inp; +#ifdef INVARIANTS + unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl))); +#endif + + KASSERT(opcode == CPL_ABORT_RPL_RSS, + ("%s: unexpected opcode 0x%x", __func__, opcode)); + KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__)); + KASSERT(synqe->tid == tid, ("%s: toep tid mismatch", __func__)); + + CTR6(KTR_CXGBE, "%s: tid %u, synqe %p (0x%x), lctx %p, status %d", + __func__, tid, synqe, synqe->flags, synqe->lctx, cpl->status); + + INP_WLOCK(inp); + KASSERT(synqe_flag(synqe, TPF_ABORT_SHUTDOWN), + ("%s: wasn't expecting abort reply for synqe %p (0x%x)", + __func__, synqe, synqe->flags)); + + done_with_synqe(sc, synqe); + /* inp lock released by done_with_synqe */ + + return (0); +} + +void +t4_offload_socket(struct toedev *tod, void *arg, struct socket *so) +{ + struct adapter *sc = tod->tod_softc; + struct synq_entry *synqe = arg; +#ifdef INVARIANTS + struct inpcb *inp = sotoinpcb(so); +#endif + struct cpl_pass_establish *cpl = mtod(synqe->syn, void *); + struct toepcb *toep = *(struct toepcb **)(cpl + 1); + + INP_INFO_LOCK_ASSERT(&V_tcbinfo); /* prevents bad race with accept() */ + INP_WLOCK_ASSERT(inp); + KASSERT(synqe_flag(synqe, TPF_SYNQE), + ("%s: %p not a synq_entry?", __func__, arg)); + + offload_socket(so, toep); + make_established(toep, cpl->snd_isn, cpl->rcv_isn, cpl->tcp_opt); + toepcb_set_flag(toep, TPF_CPL_PENDING); + update_tid(sc, synqe->tid, toep); +} + +static inline void +save_qids_in_mbuf(struct mbuf *m, struct port_info *pi) +{ + uint32_t txqid, rxqid; + + txqid = (arc4random() % pi->nofldtxq) + pi->first_ofld_txq; + rxqid = (arc4random() % pi->nofldrxq) + pi->first_ofld_rxq; + + m->m_pkthdr.flowid = (txqid << 16) | (rxqid & 0xffff); +} + +static inline void +get_qids_from_mbuf(struct mbuf *m, int *txqid, int *rxqid) +{ + + if (txqid) + *txqid = m->m_pkthdr.flowid >> 16; + if (rxqid) + *rxqid = m->m_pkthdr.flowid & 0xffff; +} + +/* + * Use the trailing space in the mbuf in which the PASS_ACCEPT_REQ arrived to + * store some state temporarily. + */ +static struct synq_entry * +mbuf_to_synqe(struct mbuf *m) +{ + int len = roundup(sizeof (struct synq_entry), 8); + int tspace = M_TRAILINGSPACE(m); + struct synq_entry *synqe = NULL; + + if (tspace < len) { + synqe = malloc(sizeof(*synqe), M_CXGBE, M_NOWAIT); + if (synqe == NULL) + return (NULL); + } else + synqe = (void *)(m->m_data + m->m_len + tspace - sizeof(*synqe)); + + synqe->flags = 0; + synqe_set_flag(synqe, TPF_SYNQE); + if (tspace < len) + synqe_set_flag(synqe, TPF_SYNQE_NEEDFREE); + + return (synqe); +} + +static void +t4opt_to_tcpopt(const struct tcp_options *t4opt, struct tcpopt *to) +{ + bzero(to, sizeof(*to)); + + if (t4opt->mss) { + to->to_flags |= TOF_MSS; + to->to_mss = be16toh(t4opt->mss); + } + + if (t4opt->wsf) { + to->to_flags |= TOF_SCALE; + to->to_wscale = t4opt->wsf; + } + + if (t4opt->tstamp) + to->to_flags |= TOF_TS; + + if (t4opt->sack) + to->to_flags |= TOF_SACKPERM; +} + +/* + * Options2 for passive open. + */ +static uint32_t +calc_opt2p(struct adapter *sc, struct port_info *pi, int rxqid, + const struct tcp_options *tcpopt, struct tcphdr *th) +{ + uint32_t opt2 = 0; + struct sge_ofld_rxq *ofld_rxq = &sc->sge.ofld_rxq[rxqid]; + + if (V_tcp_do_rfc1323) { + if (tcpopt->tstamp) + opt2 |= F_TSTAMPS_EN; + if (tcpopt->sack) + opt2 |= F_SACK_EN; + if (tcpopt->wsf > 0) + opt2 |= F_WND_SCALE_EN; + } + + if (V_tcp_do_ecn && th->th_flags & (TH_ECE | TH_CWR)) + opt2 |= F_CCTRL_ECN; + + opt2 |= V_TX_QUEUE(sc->params.tp.tx_modq[pi->tx_chan]); + opt2 |= F_RX_COALESCE_VALID | V_RX_COALESCE(M_RX_COALESCE); + opt2 |= F_RSS_QUEUE_VALID | V_RSS_QUEUE(ofld_rxq->iq.abs_id); + + return htobe32(opt2); +} + +/* XXX: duplication. */ +static inline void +tcp_fields_to_host(struct tcphdr *th) +{ + + th->th_seq = ntohl(th->th_seq); + th->th_ack = ntohl(th->th_ack); + th->th_win = ntohs(th->th_win); + th->th_urp = ntohs(th->th_urp); +} + +static void +pass_accept_req_to_protohdrs(const struct mbuf *m, struct in_conninfo *inc, + struct tcphdr *th) +{ + const struct cpl_pass_accept_req *cpl = mtod(m, const void *); + const struct ether_header *eh; + unsigned int hlen = be32toh(cpl->hdr_len); + const struct ip *ip; + const struct tcphdr *tcp; + + eh = (const void *)(cpl + 1); + ip = (const void *)((uintptr_t)eh + G_ETH_HDR_LEN(hlen)); + tcp = (const void *)((uintptr_t)ip + G_IP_HDR_LEN(hlen)); + + if (inc) { + bzero(inc, sizeof(*inc)); + inc->inc_faddr = ip->ip_src; + inc->inc_laddr = ip->ip_dst; + inc->inc_fport = tcp->th_sport; + inc->inc_lport = tcp->th_dport; + if (ip->ip_v == 6) + inc->inc_flags |= INC_ISIPV6; + } + + if (th) { + bcopy(tcp, th, sizeof(*th)); + tcp_fields_to_host(th); /* just like tcp_input */ + } +} + +#define REJECT_PASS_ACCEPT() do { \ + reject_reason = __LINE__; \ + goto reject; \ +} while (0) + +/* + * The context associated with a tid entry via insert_tid could be a synq_entry + * or a toepcb. The only way CPL handlers can tell is via a bit in these flags. + */ +CTASSERT(offsetof(struct toepcb, flags) == offsetof(struct synq_entry, flags)); + +/* + * Incoming SYN on a listening socket. + * + * XXX: Every use of ifp in this routine has a bad race with up/down, toe/-toe, + * etc. + */ +static int +do_pass_accept_req(struct sge_iq *iq, const struct rss_header *rss, + struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + struct toedev *tod; + const struct cpl_pass_accept_req *cpl = mtod(m, const void *); + struct cpl_pass_accept_rpl *rpl; + struct wrqe *wr; + unsigned int stid = G_PASS_OPEN_TID(be32toh(cpl->tos_stid)); + unsigned int tid = GET_TID(cpl); + struct listen_ctx *lctx = lookup_stid(sc, stid); + struct inpcb *inp; + struct socket *so; + struct in_conninfo inc; + struct tcphdr th; + struct tcpopt to; + struct port_info *pi; + struct ifnet *ifp, *ifp_vlan = NULL; + struct l2t_entry *e = NULL; + struct rtentry *rt; + struct sockaddr_in nam; + int rscale, mtu_idx, rx_credits, rxqid; + struct synq_entry *synqe = NULL; + int reject_reason; + uint16_t vid; +#ifdef INVARIANTS + unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl))); +#endif + + KASSERT(opcode == CPL_PASS_ACCEPT_REQ, + ("%s: unexpected opcode 0x%x", __func__, opcode)); + KASSERT(lctx->stid == stid, ("%s: lctx stid mismatch", __func__)); + + CTR4(KTR_CXGBE, "%s: stid %u, tid %u, lctx %p", __func__, stid, tid, + lctx); + + pass_accept_req_to_protohdrs(m, &inc, &th); + t4opt_to_tcpopt(&cpl->tcpopt, &to); + + pi = sc->port[G_SYN_INTF(be16toh(cpl->l2info))]; + ifp = pi->ifp; + m->m_pkthdr.rcvif = ifp; + tod = TOEDEV(ifp); + + /* + * Don't offload if the interface that received the SYN doesn't have + * IFCAP_TOE enabled. + */ + if ((ifp->if_capenable & IFCAP_TOE4) == 0) + REJECT_PASS_ACCEPT(); + + /* Don't offload IPv6 connections. XXX: add IPv6 support */ + if (inc.inc_flags & INC_ISIPV6) + REJECT_PASS_ACCEPT(); + + /* + * Don't offload if the SYN had a VLAN tag and the vid doesn't match + * anything on this interface. + */ + vid = EVL_VLANOFTAG(be16toh(cpl->vlan)); + if (vid != 0xfff) { + ifp_vlan = VLAN_DEVAT(ifp, vid); + if (ifp_vlan == NULL) + REJECT_PASS_ACCEPT(); + } + + /* + * Don't offload if the peer requested a TCP option that's not known to + * the silicon. + */ + if (cpl->tcpopt.unknown) + REJECT_PASS_ACCEPT(); + + /* + * Don't offload if the outgoing interface for the route back to the + * peer is not the same as the interface that received the SYN. + * XXX: too restrictive. + */ + nam.sin_len = sizeof(nam); + nam.sin_family = AF_INET; + nam.sin_addr = inc.inc_faddr; + rt = rtalloc1((struct sockaddr *)&nam, 0, 0); + if (rt == NULL) + REJECT_PASS_ACCEPT(); + else { + struct sockaddr *nexthop; + + RT_UNLOCK(rt); + nexthop = rt->rt_flags & RTF_GATEWAY ? rt->rt_gateway : + (struct sockaddr *)&nam; + if (rt->rt_ifp == ifp || + (ifp_vlan != NULL && rt->rt_ifp == ifp_vlan)) + e = t4_l2t_get(pi, rt->rt_ifp, nexthop); + RTFREE(rt); + if (e == NULL) + REJECT_PASS_ACCEPT(); /* no l2te, or ifp mismatch */ + } + + synqe = mbuf_to_synqe(m); + if (synqe == NULL) + REJECT_PASS_ACCEPT(); + + wr = alloc_wrqe(sizeof(*rpl), &sc->sge.ctrlq[pi->port_id]); + if (wr == NULL) + REJECT_PASS_ACCEPT(); + rpl = wrtod(wr); + + INP_INFO_WLOCK(&V_tcbinfo); /* for 4-tuple check, syncache_add */ + + /* Don't offload if the 4-tuple is already in use */ + if (toe_4tuple_check(&inc, &th, ifp) != 0) { + INP_INFO_WUNLOCK(&V_tcbinfo); + free(wr, M_CXGBE); + REJECT_PASS_ACCEPT(); + } + + inp = lctx->inp; /* listening socket, not owned by TOE */ + INP_WLOCK(inp); + + /* Don't offload if the listening socket has closed */ + if (__predict_false(inp->inp_flags & INP_DROPPED)) { + /* + * The listening socket has closed. The reply from the TOE to + * our CPL_CLOSE_LISTSRV_REQ will ultimately release all + * resources tied to this listen context. + */ + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + free(wr, M_CXGBE); + REJECT_PASS_ACCEPT(); + } + so = inp->inp_socket; + + mtu_idx = find_best_mtu_idx(sc, &inc, be16toh(cpl->tcpopt.mss)); + rscale = cpl->tcpopt.wsf && V_tcp_do_rfc1323 ? select_rcv_wscale() : 0; + SOCKBUF_LOCK(&so->so_rcv); + /* opt0 rcv_bufsiz initially, assumes its normal meaning later */ + rx_credits = min(select_rcv_wnd(so) >> 10, M_RCV_BUFSIZ); + SOCKBUF_UNLOCK(&so->so_rcv); + + save_qids_in_mbuf(m, pi); + get_qids_from_mbuf(m, NULL, &rxqid); + + INIT_TP_WR_MIT_CPL(rpl, CPL_PASS_ACCEPT_RPL, tid); + rpl->opt0 = calc_opt0(so, pi, e, mtu_idx, rscale, rx_credits, + ULP_MODE_NONE); + rpl->opt2 = calc_opt2p(sc, pi, rxqid, &cpl->tcpopt, &th); + + synqe->tid = tid; + synqe->lctx = lctx; + synqe->syn = m; + m = NULL; + refcount_init(&synqe->refcnt, 1); /* 1 so that it is held for the + duration of this function */ + synqe->l2e_idx = e->idx; + synqe->rcv_bufsize = rx_credits; + atomic_store_rel_ptr(&synqe->wr, (uintptr_t)wr); + + insert_tid(sc, tid, synqe); + TAILQ_INSERT_TAIL(&lctx->synq, synqe, link); + hold_synqe(synqe); /* hold for the duration it's in the synq */ + hold_lctx(lctx); /* A synqe on the list has a ref on its lctx */ + + /* + * If all goes well t4_syncache_respond will get called during + * syncache_add. Also note that syncache_add releases both pcbinfo and + * pcb locks. + */ + toe_syncache_add(&inc, &to, &th, inp, tod, synqe); + INP_UNLOCK_ASSERT(inp); /* ok to assert, we have a ref on the inp */ + INP_INFO_UNLOCK_ASSERT(&V_tcbinfo); + + /* + * If we replied during syncache_add (synqe->wr has been consumed), + * good. Otherwise, set it to 0 so that further syncache_respond + * attempts by the kernel will be ignored. + * + * The extra hold on the synqe makes sure that it is still around, even + * if the listener has been dropped and the synqe was aborted and the + * reply to the abort has removed and released the synqe from the synq + * list. + */ + if (atomic_cmpset_ptr(&synqe->wr, (uintptr_t)wr, 0)) { + + INP_WLOCK(inp); + if (__predict_false(inp->inp_flags & INP_DROPPED)) { + /* listener closed. synqe must have been aborted. */ + KASSERT(synqe_flag(synqe, TPF_ABORT_SHUTDOWN), + ("%s: listener %p closed but synqe %p not aborted", + __func__, inp, synqe)); + + CTR5(KTR_CXGBE, + "%s: stid %u, tid %u, lctx %p, synqe %p, ABORTED", + __func__, stid, tid, lctx, synqe); + INP_WUNLOCK(inp); + free(wr, M_CXGBE); + release_synqe(synqe); /* about to exit function */ + return (__LINE__); + } + + /* + * synqe aborted before TOM replied to PASS_ACCEPT_REQ. But + * that can only happen if the listener was closed and we just + * checked for that. + */ + KASSERT(!synqe_flag(synqe, TPF_ABORT_SHUTDOWN), + ("%s: synqe %p aborted, but listener %p not dropped.", + __func__, synqe, inp)); + + /* Yank the synqe out of the lctx synq. */ + TAILQ_REMOVE(&lctx->synq, synqe, link); + release_synqe(synqe); /* removed from synq list */ + inp = release_lctx(sc, lctx); + if (inp) + INP_WUNLOCK(inp); + + /* + * syncache may or may not have a hold on the synqe, which may + * or may not be stashed in the original SYN mbuf passed to us. + * Just copy it over instead of dealing with all possibilities. + */ + m = m_dup(synqe->syn, M_DONTWAIT); + if (m) + m->m_pkthdr.rcvif = ifp; + + release_synqe(synqe); /* about to exit function */ + free(wr, M_CXGBE); + REJECT_PASS_ACCEPT(); + } + release_synqe(synqe); /* about to exit function */ + CTR5(KTR_CXGBE, "%s: stid %u, tid %u, lctx %p, synqe %p, SYNACK", + __func__, stid, tid, lctx, synqe); + return (0); +reject: + CTR4(KTR_CXGBE, "%s: stid %u, tid %u, REJECT (%d)", __func__, stid, tid, + reject_reason); + + if (e) + t4_l2t_release(e); + release_tid(sc, tid, lctx->ctrlq); + + if (__predict_true(m != NULL)) { + m_adj(m, sizeof(*cpl)); + m->m_pkthdr.csum_flags |= (CSUM_IP_CHECKED | CSUM_IP_VALID | + CSUM_DATA_VALID | CSUM_PSEUDO_HDR); + m->m_pkthdr.csum_data = 0xffff; + ifp->if_input(ifp, m); + } + + return (reject_reason); +} + +static void +synqe_to_protohdrs(struct synq_entry *synqe, + const struct cpl_pass_establish *cpl, struct in_conninfo *inc, + struct tcphdr *th, struct tcpopt *to) +{ + uint16_t tcp_opt = be16toh(cpl->tcp_opt); + + /* start off with the original SYN */ + pass_accept_req_to_protohdrs(synqe->syn, inc, th); + + /* modify parts to make it look like the ACK to our SYN|ACK */ + th->th_flags = TH_ACK; + th->th_ack = synqe->iss + 1; + th->th_seq = be32toh(cpl->rcv_isn); + bzero(to, sizeof(*to)); + if (G_TCPOPT_TSTAMP(tcp_opt)) { + to->to_flags |= TOF_TS; + to->to_tsecr = synqe->ts; + } +} + +static int +do_pass_establish(struct sge_iq *iq, const struct rss_header *rss, + struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + struct port_info *pi; + struct ifnet *ifp; + const struct cpl_pass_establish *cpl = (const void *)(rss + 1); +#if defined(KTR) || defined(INVARIANTS) + unsigned int stid = G_PASS_OPEN_TID(be32toh(cpl->tos_stid)); +#endif + unsigned int tid = GET_TID(cpl); + struct synq_entry *synqe = lookup_tid(sc, tid); + struct listen_ctx *lctx = synqe->lctx; + struct inpcb *inp = lctx->inp; + struct socket *so; + struct tcphdr th; + struct tcpopt to; + struct in_conninfo inc; + struct toepcb *toep; + u_int txqid, rxqid; +#ifdef INVARIANTS + unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl))); +#endif + + KASSERT(opcode == CPL_PASS_ESTABLISH, + ("%s: unexpected opcode 0x%x", __func__, opcode)); + KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__)); + KASSERT(lctx->stid == stid, ("%s: lctx stid mismatch", __func__)); + KASSERT(synqe_flag(synqe, TPF_SYNQE), + ("%s: tid %u (ctx %p) not a synqe", __func__, tid, synqe)); + + INP_INFO_WLOCK(&V_tcbinfo); /* for syncache_expand */ + INP_WLOCK(inp); + + CTR6(KTR_CXGBE, + "%s: stid %u, tid %u, synqe %p (0x%x), inp_flags 0x%x", + __func__, stid, tid, synqe, synqe->flags, inp->inp_flags); + + if (__predict_false(inp->inp_flags & INP_DROPPED)) { + /* + * The listening socket has closed. The TOM must have aborted + * all the embryonic connections (including this one) that were + * on the lctx's synq. do_abort_rpl for the tid is responsible + * for cleaning up. + */ + KASSERT(synqe_flag(synqe, TPF_ABORT_SHUTDOWN), + ("%s: listen socket dropped but tid %u not aborted.", + __func__, tid)); + + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + return (0); + } + + ifp = synqe->syn->m_pkthdr.rcvif; + pi = ifp->if_softc; + KASSERT(pi->adapter == sc, + ("%s: pi %p, sc %p mismatch", __func__, pi, sc)); + + get_qids_from_mbuf(synqe->syn, &txqid, &rxqid); + KASSERT(rxqid == iq_to_ofld_rxq(iq) - &sc->sge.ofld_rxq[0], + ("%s: CPL arrived on unexpected rxq. %d %d", __func__, rxqid, + (int)(iq_to_ofld_rxq(iq) - &sc->sge.ofld_rxq[0]))); + + toep = alloc_toepcb(pi, txqid, rxqid, M_NOWAIT); + if (toep == NULL) { +reset: + /* The reply to this abort will perform final cleanup */ + send_reset_synqe(TOEDEV(ifp), synqe); + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + return (0); + } + toep->tid = tid; + toep->l2te = &sc->l2t->l2tab[synqe->l2e_idx]; + toep->ulp_mode = ULP_MODE_NONE; + /* opt0 rcv_bufsiz initially, assumes its normal meaning later */ + toep->rx_credits = synqe->rcv_bufsize; + + so = inp->inp_socket; + KASSERT(so != NULL, ("%s: socket is NULL", __func__)); + + /* Come up with something that syncache_expand should be ok with. */ + synqe_to_protohdrs(synqe, cpl, &inc, &th, &to); + + /* + * No more need for anything in the mbuf that carried the + * CPL_PASS_ACCEPT_REQ. Drop the CPL_PASS_ESTABLISH and toep pointer + * there. XXX: bad form but I don't want to increase the size of synqe. + */ + m = synqe->syn; + KASSERT(sizeof(*cpl) + sizeof(toep) <= m->m_len, + ("%s: no room in mbuf %p (m_len %d)", __func__, m, m->m_len)); + bcopy(cpl, mtod(m, void *), sizeof(*cpl)); + *(struct toepcb **)(mtod(m, struct cpl_pass_establish *) + 1) = toep; + + if (!toe_syncache_expand(&inc, &to, &th, &so) || so == NULL) { + free_toepcb(toep); + goto reset; + } + + /* Done with the synqe */ + TAILQ_REMOVE(&lctx->synq, synqe, link); + inp = release_lctx(sc, lctx); + if (inp != NULL) + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + release_synqe(synqe); + + return (0); +} + +void +t4_init_listen_cpl_handlers(struct adapter *sc) +{ + + t4_register_cpl_handler(sc, CPL_PASS_OPEN_RPL, do_pass_open_rpl); + t4_register_cpl_handler(sc, CPL_CLOSE_LISTSRV_RPL, do_close_server_rpl); + t4_register_cpl_handler(sc, CPL_PASS_ACCEPT_REQ, do_pass_accept_req); + t4_register_cpl_handler(sc, CPL_PASS_ESTABLISH, do_pass_establish); +} +#endif diff --git a/sys/dev/cxgbe/tom/t4_tom.c b/sys/dev/cxgbe/tom/t4_tom.c new file mode 100644 index 00000000000..c6e9a1ffb2e --- /dev/null +++ b/sys/dev/cxgbe/tom/t4_tom.c @@ -0,0 +1,755 @@ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * Written by: Navdeep Parhar + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_inet.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define TCPSTATES +#include +#include + +#ifdef TCP_OFFLOAD +#include "common/common.h" +#include "common/t4_msg.h" +#include "common/t4_regs.h" +#include "tom/t4_tom_l2t.h" +#include "tom/t4_tom.h" + +/* Module ops */ +static int t4_tom_mod_load(void); +static int t4_tom_mod_unload(void); +static int t4_tom_modevent(module_t, int, void *); + +/* ULD ops and helpers */ +static int t4_tom_activate(struct adapter *); +static int t4_tom_deactivate(struct adapter *); + +static struct uld_info tom_uld_info = { + .uld_id = ULD_TOM, + .activate = t4_tom_activate, + .deactivate = t4_tom_deactivate, +}; + +static void queue_tid_release(struct adapter *, int); +static void release_offload_resources(struct toepcb *); +static int alloc_tid_tabs(struct tid_info *); +static void free_tid_tabs(struct tid_info *); +static void free_tom_data(struct adapter *, struct tom_data *); + +struct toepcb * +alloc_toepcb(struct port_info *pi, int txqid, int rxqid, int flags) +{ + struct adapter *sc = pi->adapter; + struct toepcb *toep; + int tx_credits, txsd_total, len; + + /* + * The firmware counts tx work request credits in units of 16 bytes + * each. Reserve room for an ABORT_REQ so the driver never has to worry + * about tx credits if it wants to abort a connection. + */ + tx_credits = sc->params.ofldq_wr_cred; + tx_credits -= howmany(sizeof(struct cpl_abort_req), 16); + + /* + * Shortest possible tx work request is a fw_ofld_tx_data_wr + 1 byte + * immediate payload, and firmware counts tx work request credits in + * units of 16 byte. Calculate the maximum work requests possible. + */ + txsd_total = tx_credits / + howmany((sizeof(struct fw_ofld_tx_data_wr) + 1), 16); + + if (txqid < 0) + txqid = (arc4random() % pi->nofldtxq) + pi->first_ofld_txq; + KASSERT(txqid >= pi->first_ofld_txq && + txqid < pi->first_ofld_txq + pi->nofldtxq, + ("%s: txqid %d for port %p (first %d, n %d)", __func__, txqid, pi, + pi->first_ofld_txq, pi->nofldtxq)); + + if (rxqid < 0) + rxqid = (arc4random() % pi->nofldrxq) + pi->first_ofld_rxq; + KASSERT(rxqid >= pi->first_ofld_rxq && + rxqid < pi->first_ofld_rxq + pi->nofldrxq, + ("%s: rxqid %d for port %p (first %d, n %d)", __func__, rxqid, pi, + pi->first_ofld_rxq, pi->nofldrxq)); + + len = offsetof(struct toepcb, txsd) + + txsd_total * sizeof(struct ofld_tx_sdesc); + + toep = malloc(len, M_CXGBE, M_ZERO | flags); + if (toep == NULL) + return (NULL); + + toep->td = sc->tom_softc; + toep->port = pi; + toep->tx_credits = tx_credits; + toep->ofld_txq = &sc->sge.ofld_txq[txqid]; + toep->ofld_rxq = &sc->sge.ofld_rxq[rxqid]; + toep->ctrlq = &sc->sge.ctrlq[pi->port_id]; + toep->txsd_total = txsd_total; + toep->txsd_avail = txsd_total; + toep->txsd_pidx = 0; + toep->txsd_cidx = 0; + + return (toep); +} + +void +free_toepcb(struct toepcb *toep) +{ + + KASSERT(toepcb_flag(toep, TPF_ATTACHED) == 0, + ("%s: attached to an inpcb", __func__)); + KASSERT(toepcb_flag(toep, TPF_CPL_PENDING) == 0, + ("%s: CPL pending", __func__)); + + free(toep, M_CXGBE); +} + +/* + * Set up the socket for TCP offload. + */ +void +offload_socket(struct socket *so, struct toepcb *toep) +{ + struct tom_data *td = toep->td; + struct inpcb *inp = sotoinpcb(so); + struct tcpcb *tp = intotcpcb(inp); + struct sockbuf *sb; + + INP_WLOCK_ASSERT(inp); + + /* Update socket */ + sb = &so->so_snd; + SOCKBUF_LOCK(sb); + sb->sb_flags |= SB_NOCOALESCE; + SOCKBUF_UNLOCK(sb); + sb = &so->so_rcv; + SOCKBUF_LOCK(sb); + sb->sb_flags |= SB_NOCOALESCE; + SOCKBUF_UNLOCK(sb); + + /* Update TCP PCB */ + tp->tod = &td->tod; + tp->t_toe = toep; + tp->t_flags |= TF_TOE; + + /* Install an extra hold on inp */ + toep->inp = inp; + toepcb_set_flag(toep, TPF_ATTACHED); + in_pcbref(inp); + + /* Add the TOE PCB to the active list */ + mtx_lock(&td->toep_list_lock); + TAILQ_INSERT_HEAD(&td->toep_list, toep, link); + mtx_unlock(&td->toep_list_lock); +} + +/* This is _not_ the normal way to "unoffload" a socket. */ +void +undo_offload_socket(struct socket *so) +{ + struct inpcb *inp = sotoinpcb(so); + struct tcpcb *tp = intotcpcb(inp); + struct toepcb *toep = tp->t_toe; + struct tom_data *td = toep->td; + struct sockbuf *sb; + + INP_WLOCK_ASSERT(inp); + + sb = &so->so_snd; + SOCKBUF_LOCK(sb); + sb->sb_flags &= ~SB_NOCOALESCE; + SOCKBUF_UNLOCK(sb); + sb = &so->so_rcv; + SOCKBUF_LOCK(sb); + sb->sb_flags &= ~SB_NOCOALESCE; + SOCKBUF_UNLOCK(sb); + + tp->tod = NULL; + tp->t_toe = NULL; + tp->t_flags &= ~TF_TOE; + + toep->inp = NULL; + toepcb_clr_flag(toep, TPF_ATTACHED); + if (in_pcbrele_wlocked(inp)) + panic("%s: inp freed.", __func__); + + mtx_lock(&td->toep_list_lock); + TAILQ_REMOVE(&td->toep_list, toep, link); + mtx_unlock(&td->toep_list_lock); +} + +static void +release_offload_resources(struct toepcb *toep) +{ + struct tom_data *td = toep->td; + struct adapter *sc = td_adapter(td); + int tid = toep->tid; + + KASSERT(toepcb_flag(toep, TPF_CPL_PENDING) == 0, + ("%s: %p has CPL pending.", __func__, toep)); + KASSERT(toepcb_flag(toep, TPF_ATTACHED) == 0, + ("%s: %p is still attached.", __func__, toep)); + + CTR4(KTR_CXGBE, "%s: toep %p (tid %d, l2te %p)", + __func__, toep, tid, toep->l2te); + + if (toep->l2te) + t4_l2t_release(toep->l2te); + + if (tid >= 0) { + remove_tid(sc, tid); + release_tid(sc, tid, toep->ctrlq); + } + + mtx_lock(&td->toep_list_lock); + TAILQ_REMOVE(&td->toep_list, toep, link); + mtx_unlock(&td->toep_list_lock); + + free_toepcb(toep); +} + +/* + * The kernel is done with the TCP PCB and this is our opportunity to unhook the + * toepcb hanging off of it. If the TOE driver is also done with the toepcb (no + * pending CPL) then it is time to release all resources tied to the toepcb. + * + * Also gets called when an offloaded active open fails and the TOM wants the + * kernel to take the TCP PCB back. + */ +static void +t4_pcb_detach(struct toedev *tod __unused, struct tcpcb *tp) +{ +#if defined(KTR) || defined(INVARIANTS) + struct inpcb *inp = tp->t_inpcb; +#endif + struct toepcb *toep = tp->t_toe; + + INP_WLOCK_ASSERT(inp); + + KASSERT(toep != NULL, ("%s: toep is NULL", __func__)); + KASSERT(toepcb_flag(toep, TPF_ATTACHED), + ("%s: not attached", __func__)); + +#ifdef KTR + if (tp->t_state == TCPS_SYN_SENT) { + CTR6(KTR_CXGBE, "%s: atid %d, toep %p (0x%x), inp %p (0x%x)", + __func__, toep->tid, toep, toep->flags, inp, + inp->inp_flags); + } else { + CTR6(KTR_CXGBE, + "t4_pcb_detach: tid %d (%s), toep %p (0x%x), inp %p (0x%x)", + toep->tid, tcpstates[tp->t_state], toep, toep->flags, inp, + inp->inp_flags); + } +#endif + + tp->t_toe = NULL; + tp->t_flags &= ~TF_TOE; + toepcb_clr_flag(toep, TPF_ATTACHED); + + if (toepcb_flag(toep, TPF_CPL_PENDING) == 0) + release_offload_resources(toep); +} + +/* + * The TOE driver will not receive any more CPLs for the tid associated with the + * toepcb; release the hold on the inpcb. + */ +void +final_cpl_received(struct toepcb *toep) +{ + struct inpcb *inp = toep->inp; + + KASSERT(inp != NULL, ("%s: inp is NULL", __func__)); + INP_WLOCK_ASSERT(inp); + KASSERT(toepcb_flag(toep, TPF_CPL_PENDING), + ("%s: CPL not pending already?", __func__)); + + CTR6(KTR_CXGBE, "%s: tid %d, toep %p (0x%x), inp %p (0x%x)", + __func__, toep->tid, toep, toep->flags, inp, inp->inp_flags); + + toep->inp = NULL; + toepcb_clr_flag(toep, TPF_CPL_PENDING); + + if (toepcb_flag(toep, TPF_ATTACHED) == 0) + release_offload_resources(toep); + + if (!in_pcbrele_wlocked(inp)) + INP_WUNLOCK(inp); +} + +void +insert_tid(struct adapter *sc, int tid, void *ctx) +{ + struct tid_info *t = &sc->tids; + + t->tid_tab[tid] = ctx; + atomic_add_int(&t->tids_in_use, 1); +} + +void * +lookup_tid(struct adapter *sc, int tid) +{ + struct tid_info *t = &sc->tids; + + return (t->tid_tab[tid]); +} + +void +update_tid(struct adapter *sc, int tid, void *ctx) +{ + struct tid_info *t = &sc->tids; + + t->tid_tab[tid] = ctx; +} + +void +remove_tid(struct adapter *sc, int tid) +{ + struct tid_info *t = &sc->tids; + + t->tid_tab[tid] = NULL; + atomic_subtract_int(&t->tids_in_use, 1); +} + +void +release_tid(struct adapter *sc, int tid, struct sge_wrq *ctrlq) +{ + struct wrqe *wr; + struct cpl_tid_release *req; + + wr = alloc_wrqe(sizeof(*req), ctrlq); + if (wr == NULL) { + queue_tid_release(sc, tid); /* defer */ + return; + } + req = wrtod(wr); + + INIT_TP_WR_MIT_CPL(req, CPL_TID_RELEASE, tid); + + t4_wrq_tx(sc, wr); +} + +static void +queue_tid_release(struct adapter *sc, int tid) +{ + + CXGBE_UNIMPLEMENTED("deferred tid release"); +} + +/* + * What mtu_idx to use, given a 4-tuple and/or an MSS cap + */ +int +find_best_mtu_idx(struct adapter *sc, struct in_conninfo *inc, int pmss) +{ + unsigned short *mtus = &sc->params.mtus[0]; + int i = 0, mss; + + KASSERT(inc != NULL || pmss > 0, + ("%s: at least one of inc/pmss must be specified", __func__)); + + mss = inc ? tcp_mssopt(inc) : pmss; + if (pmss > 0 && mss > pmss) + mss = pmss; + + while (i < NMTUS - 1 && mtus[i + 1] <= mss + 40) + ++i; + + return (i); +} + +/* + * Determine the receive window size for a socket. + */ +u_long +select_rcv_wnd(struct socket *so) +{ + unsigned long wnd; + + SOCKBUF_LOCK_ASSERT(&so->so_rcv); + + wnd = sbspace(&so->so_rcv); + if (wnd < MIN_RCV_WND) + wnd = MIN_RCV_WND; + + return min(wnd, MAX_RCV_WND); +} + +int +select_rcv_wscale(void) +{ + int wscale = 0; + unsigned long space = sb_max; + + if (space > MAX_RCV_WND) + space = MAX_RCV_WND; + + while (wscale < TCP_MAX_WINSHIFT && (TCP_MAXWIN << wscale) < space) + wscale++; + + return (wscale); +} + +extern int always_keepalive; +#define VIID_SMACIDX(v) (((unsigned int)(v) & 0x7f) << 1) + +/* + * socket so could be a listening socket too. + */ +uint64_t +calc_opt0(struct socket *so, struct port_info *pi, struct l2t_entry *e, + int mtu_idx, int rscale, int rx_credits, int ulp_mode) +{ + uint64_t opt0; + + KASSERT(rx_credits <= M_RCV_BUFSIZ, + ("%s: rcv_bufsiz too high", __func__)); + + opt0 = F_TCAM_BYPASS | V_WND_SCALE(rscale) | V_MSS_IDX(mtu_idx) | + V_ULP_MODE(ulp_mode) | V_RCV_BUFSIZ(rx_credits); + + if (so != NULL) { + struct inpcb *inp = sotoinpcb(so); + struct tcpcb *tp = intotcpcb(inp); + int keepalive = always_keepalive || + so_options_get(so) & SO_KEEPALIVE; + + opt0 |= V_NAGLE((tp->t_flags & TF_NODELAY) == 0); + opt0 |= V_KEEP_ALIVE(keepalive != 0); + } + + if (e != NULL) + opt0 |= V_L2T_IDX(e->idx); + + if (pi != NULL) { + opt0 |= V_SMAC_SEL(VIID_SMACIDX(pi->viid)); + opt0 |= V_TX_CHAN(pi->tx_chan); + } + + return htobe64(opt0); +} + +#define FILTER_SEL_WIDTH_P_FC (3 + 1) +#define FILTER_SEL_WIDTH_VIN_P_FC (6 + 7 + FILTER_SEL_WIDTH_P_FC) +#define FILTER_SEL_WIDTH_TAG_P_FC (3 + FILTER_SEL_WIDTH_VIN_P_FC) +#define FILTER_SEL_WIDTH_VLD_TAG_P_FC (1 + FILTER_SEL_WIDTH_TAG_P_FC) +#define VLAN_NONE 0xfff +#define FILTER_SEL_VLAN_NONE 0xffff + +uint32_t +select_ntuple(struct port_info *pi, struct l2t_entry *e, uint32_t filter_mode) +{ + uint16_t viid = pi->viid; + uint32_t ntuple = 0; + + if (filter_mode == HW_TPL_FR_MT_PR_IV_P_FC) { + if (e->vlan == VLAN_NONE) + ntuple |= FILTER_SEL_VLAN_NONE << FILTER_SEL_WIDTH_P_FC; + else { + ntuple |= e->vlan << FILTER_SEL_WIDTH_P_FC; + ntuple |= 1 << FILTER_SEL_WIDTH_VLD_TAG_P_FC; + } + ntuple |= e->lport << S_PORT; + ntuple |= IPPROTO_TCP << FILTER_SEL_WIDTH_VLD_TAG_P_FC; + } else if (filter_mode == HW_TPL_FR_MT_PR_OV_P_FC) { + ntuple |= G_FW_VIID_VIN(viid) << FILTER_SEL_WIDTH_P_FC; + ntuple |= G_FW_VIID_PFN(viid) << FILTER_SEL_WIDTH_VIN_P_FC; + ntuple |= G_FW_VIID_VIVLD(viid) << FILTER_SEL_WIDTH_TAG_P_FC; + ntuple |= e->lport << S_PORT; + ntuple |= IPPROTO_TCP << FILTER_SEL_WIDTH_VLD_TAG_P_FC; + } + + return (htobe32(ntuple)); +} + +static int +alloc_tid_tabs(struct tid_info *t) +{ + size_t size; + unsigned int i; + + size = t->ntids * sizeof(*t->tid_tab) + + t->natids * sizeof(*t->atid_tab) + + t->nstids * sizeof(*t->stid_tab); + + t->tid_tab = malloc(size, M_CXGBE, M_ZERO | M_NOWAIT); + if (t->tid_tab == NULL) + return (ENOMEM); + + mtx_init(&t->atid_lock, "atid lock", NULL, MTX_DEF); + t->atid_tab = (union aopen_entry *)&t->tid_tab[t->ntids]; + t->afree = t->atid_tab; + t->atids_in_use = 0; + for (i = 1; i < t->natids; i++) + t->atid_tab[i - 1].next = &t->atid_tab[i]; + t->atid_tab[t->natids - 1].next = NULL; + + mtx_init(&t->stid_lock, "stid lock", NULL, MTX_DEF); + t->stid_tab = (union serv_entry *)&t->atid_tab[t->natids]; + t->sfree = t->stid_tab; + t->stids_in_use = 0; + for (i = 1; i < t->nstids; i++) + t->stid_tab[i - 1].next = &t->stid_tab[i]; + t->stid_tab[t->nstids - 1].next = NULL; + + atomic_store_rel_int(&t->tids_in_use, 0); + + return (0); +} + +static void +free_tid_tabs(struct tid_info *t) +{ + KASSERT(t->tids_in_use == 0, + ("%s: %d tids still in use.", __func__, t->tids_in_use)); + KASSERT(t->atids_in_use == 0, + ("%s: %d atids still in use.", __func__, t->atids_in_use)); + KASSERT(t->stids_in_use == 0, + ("%s: %d tids still in use.", __func__, t->stids_in_use)); + + free(t->tid_tab, M_CXGBE); + t->tid_tab = NULL; + + if (mtx_initialized(&t->atid_lock)) + mtx_destroy(&t->atid_lock); + if (mtx_initialized(&t->stid_lock)) + mtx_destroy(&t->stid_lock); +} + +static void +free_tom_data(struct adapter *sc, struct tom_data *td) +{ + KASSERT(TAILQ_EMPTY(&td->toep_list), + ("%s: TOE PCB list is not empty.", __func__)); + KASSERT(td->lctx_count == 0, + ("%s: lctx hash table is not empty.", __func__)); + + t4_uninit_l2t_cpl_handlers(sc); + + if (td->listen_mask != 0) + hashdestroy(td->listen_hash, M_CXGBE, td->listen_mask); + + if (mtx_initialized(&td->lctx_hash_lock)) + mtx_destroy(&td->lctx_hash_lock); + if (mtx_initialized(&td->toep_list_lock)) + mtx_destroy(&td->toep_list_lock); + + free_tid_tabs(&sc->tids); + free(td, M_CXGBE); +} + +/* + * Ground control to Major TOM + * Commencing countdown, engines on + */ +static int +t4_tom_activate(struct adapter *sc) +{ + struct tom_data *td; + struct toedev *tod; + int i, rc; + + ADAPTER_LOCK_ASSERT_OWNED(sc); /* for sc->flags */ + + /* per-adapter softc for TOM */ + td = malloc(sizeof(*td), M_CXGBE, M_ZERO | M_NOWAIT); + if (td == NULL) + return (ENOMEM); + + /* List of TOE PCBs and associated lock */ + mtx_init(&td->toep_list_lock, "PCB list lock", NULL, MTX_DEF); + TAILQ_INIT(&td->toep_list); + + /* Listen context */ + mtx_init(&td->lctx_hash_lock, "lctx hash lock", NULL, MTX_DEF); + td->listen_hash = hashinit_flags(LISTEN_HASH_SIZE, M_CXGBE, + &td->listen_mask, HASH_NOWAIT); + + /* TID tables */ + rc = alloc_tid_tabs(&sc->tids); + if (rc != 0) + goto done; + + /* CPL handlers */ + t4_init_connect_cpl_handlers(sc); + t4_init_l2t_cpl_handlers(sc); + t4_init_listen_cpl_handlers(sc); + t4_init_cpl_io_handlers(sc); + + /* toedev ops */ + tod = &td->tod; + init_toedev(tod); + tod->tod_softc = sc; + tod->tod_connect = t4_connect; + tod->tod_listen_start = t4_listen_start; + tod->tod_listen_stop = t4_listen_stop; + tod->tod_rcvd = t4_rcvd; + tod->tod_output = t4_tod_output; + tod->tod_send_rst = t4_send_rst; + tod->tod_send_fin = t4_send_fin; + tod->tod_pcb_detach = t4_pcb_detach; + tod->tod_l2_update = t4_l2_update; + tod->tod_syncache_added = t4_syncache_added; + tod->tod_syncache_removed = t4_syncache_removed; + tod->tod_syncache_respond = t4_syncache_respond; + tod->tod_offload_socket = t4_offload_socket; + + for_each_port(sc, i) + TOEDEV(sc->port[i]->ifp) = &td->tod; + + sc->tom_softc = td; + sc->flags |= TOM_INIT_DONE; + register_toedev(sc->tom_softc); + +done: + if (rc != 0) + free_tom_data(sc, td); + return (rc); +} + +static int +t4_tom_deactivate(struct adapter *sc) +{ + int rc = 0; + struct tom_data *td = sc->tom_softc; + + ADAPTER_LOCK_ASSERT_OWNED(sc); /* for sc->flags */ + + if (td == NULL) + return (0); /* XXX. KASSERT? */ + + if (sc->offload_map != 0) + return (EBUSY); /* at least one port has IFCAP_TOE enabled */ + + mtx_lock(&td->toep_list_lock); + if (!TAILQ_EMPTY(&td->toep_list)) + rc = EBUSY; + mtx_unlock(&td->toep_list_lock); + + mtx_lock(&td->lctx_hash_lock); + if (td->lctx_count > 0) + rc = EBUSY; + mtx_unlock(&td->lctx_hash_lock); + + if (rc == 0) { + unregister_toedev(sc->tom_softc); + free_tom_data(sc, td); + sc->tom_softc = NULL; + sc->flags &= ~TOM_INIT_DONE; + } + + return (rc); +} + +static int +t4_tom_mod_load(void) +{ + int rc; + + rc = t4_register_uld(&tom_uld_info); + if (rc != 0) + t4_tom_mod_unload(); + + return (rc); +} + +static void +tom_uninit(struct adapter *sc, void *arg __unused) +{ + /* Try to free resources (works only if no port has IFCAP_TOE) */ + ADAPTER_LOCK(sc); + if (sc->flags & TOM_INIT_DONE) + t4_deactivate_uld(sc, ULD_TOM); + ADAPTER_UNLOCK(sc); +} + +static int +t4_tom_mod_unload(void) +{ + t4_iterate(tom_uninit, NULL); + + if (t4_unregister_uld(&tom_uld_info) == EBUSY) + return (EBUSY); + + return (0); +} +#endif /* TCP_OFFLOAD */ + +static int +t4_tom_modevent(module_t mod, int cmd, void *arg) +{ + int rc = 0; + +#ifdef TCP_OFFLOAD + switch (cmd) { + case MOD_LOAD: + rc = t4_tom_mod_load(); + break; + + case MOD_UNLOAD: + rc = t4_tom_mod_unload(); + break; + + default: + rc = EINVAL; + } +#else + printf("t4_tom: compiled without TCP_OFFLOAD support.\n"); + rc = EOPNOTSUPP; +#endif + return (rc); +} + +static moduledata_t t4_tom_moddata= { + "t4_tom", + t4_tom_modevent, + 0 +}; + +MODULE_VERSION(t4_tom, 1); +MODULE_DEPEND(t4_tom, toecore, 1, 1, 1); +MODULE_DEPEND(t4_tom, t4nex, 1, 1, 1); +DECLARE_MODULE(t4_tom, t4_tom_moddata, SI_SUB_EXEC, SI_ORDER_ANY); diff --git a/sys/dev/cxgbe/tom/t4_tom.h b/sys/dev/cxgbe/tom/t4_tom.h new file mode 100644 index 00000000000..4e171e7b5b5 --- /dev/null +++ b/sys/dev/cxgbe/tom/t4_tom.h @@ -0,0 +1,248 @@ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * Written by: Navdeep Parhar + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + * + */ + +#ifndef __T4_TOM_H__ +#define __T4_TOM_H__ + +#define KTR_CXGBE KTR_SPARE3 +#define LISTEN_HASH_SIZE 32 + +/* + * Min receive window. We want it to be large enough to accommodate receive + * coalescing, handle jumbo frames, and not trigger sender SWS avoidance. + */ +#define MIN_RCV_WND (24 * 1024U) + +/* + * Max receive window supported by HW in bytes. Only a small part of it can + * be set through option0, the rest needs to be set through RX_DATA_ACK. + */ +#define MAX_RCV_WND ((1U << 27) - 1) + +/* TOE PCB flags */ +enum { + TPF_ATTACHED, /* a tcpcb refers to this toepcb */ + TPF_FLOWC_WR_SENT, /* firmware flow context WR sent */ + TPF_TX_DATA_SENT, /* some data sent */ + TPF_TX_SUSPENDED, /* tx suspended for lack of resources */ + TPF_SEND_FIN, /* send FIN after sending all pending data */ + TPF_FIN_SENT, /* FIN has been sent */ + TPF_ABORT_SHUTDOWN, /* connection abort is in progress */ + TPF_CPL_PENDING, /* haven't received the last CPL */ + TPF_SYNQE, /* synq_entry, not really a toepcb */ + TPF_SYNQE_NEEDFREE, /* synq_entry was allocated externally */ +}; + +struct ofld_tx_sdesc { + uint32_t plen; /* payload length */ + uint8_t tx_credits; /* firmware tx credits (unit is 16B) */ +}; + +struct toepcb { + TAILQ_ENTRY(toepcb) link; /* toep_list */ + unsigned int flags; /* miscellaneous flags */ + struct tom_data *td; + struct inpcb *inp; /* backpointer to host stack's PCB */ + struct port_info *port; /* physical port */ + struct sge_wrq *ofld_txq; + struct sge_ofld_rxq *ofld_rxq; + struct sge_wrq *ctrlq; + struct l2t_entry *l2te; /* L2 table entry used by this connection */ + int tid; /* Connection identifier */ + unsigned int tx_credits;/* tx WR credits (in 16 byte units) remaining */ + unsigned int enqueued; /* # of bytes added to so_rcv (not yet read) */ + int rx_credits; /* rx credits (in bytes) to be returned to hw */ + + unsigned int ulp_mode; /* ULP mode */ + + /* Tx software descriptor */ + uint8_t txsd_total; + uint8_t txsd_pidx; + uint8_t txsd_cidx; + uint8_t txsd_avail; + struct ofld_tx_sdesc txsd[]; +}; + +struct flowc_tx_params { + uint32_t snd_nxt; + uint32_t rcv_nxt; + unsigned int snd_space; + unsigned int mss; +}; + +static inline int +toepcb_flag(struct toepcb *toep, int flag) +{ + + return isset(&toep->flags, flag); +} + +static inline void +toepcb_set_flag(struct toepcb *toep, int flag) +{ + + setbit(&toep->flags, flag); +} + +static inline void +toepcb_clr_flag(struct toepcb *toep, int flag) +{ + + clrbit(&toep->flags, flag); +} + +/* + * Compressed state for embryonic connections for a listener. Barely fits in + * 64B, try not to grow it further. + */ +struct synq_entry { + TAILQ_ENTRY(synq_entry) link; /* listen_ctx's synq link */ + int flags; /* same as toepcb's tp_flags */ + int tid; + struct listen_ctx *lctx; /* backpointer to listen ctx */ + struct mbuf *syn; + uint32_t iss; + uint32_t ts; + volatile uintptr_t wr; + volatile u_int refcnt; + uint16_t l2e_idx; + uint16_t rcv_bufsize; +}; + +static inline int +synqe_flag(struct synq_entry *synqe, int flag) +{ + + return isset(&synqe->flags, flag); +} + +static inline void +synqe_set_flag(struct synq_entry *synqe, int flag) +{ + + setbit(&synqe->flags, flag); +} + +static inline void +synqe_clr_flag(struct synq_entry *synqe, int flag) +{ + + clrbit(&synqe->flags, flag); +} + +/* listen_ctx flags */ +#define LCTX_RPL_PENDING 1 /* waiting for a CPL_PASS_OPEN_RPL */ + +struct listen_ctx { + LIST_ENTRY(listen_ctx) link; /* listen hash linkage */ + volatile int refcount; + int stid; + int flags; + struct inpcb *inp; /* listening socket's inp */ + struct sge_wrq *ctrlq; + struct sge_ofld_rxq *ofld_rxq; + TAILQ_HEAD(, synq_entry) synq; +}; + +struct tom_data { + struct toedev tod; + + /* toepcb's associated with this TOE device */ + struct mtx toep_list_lock; + TAILQ_HEAD(, toepcb) toep_list; + + LIST_HEAD(, listen_ctx) *listen_hash; + u_long listen_mask; + int lctx_count; /* # of lctx in the hash table */ + struct mtx lctx_hash_lock; +}; + +static inline struct tom_data * +tod_td(struct toedev *tod) +{ + + return (member2struct(tom_data, tod, tod)); +} + +static inline struct adapter * +td_adapter(struct tom_data *td) +{ + + return (td->tod.tod_softc); +} + +/* t4_tom.c */ +struct toepcb *alloc_toepcb(struct port_info *, int, int, int); +void free_toepcb(struct toepcb *); +void offload_socket(struct socket *, struct toepcb *); +void undo_offload_socket(struct socket *); +void final_cpl_received(struct toepcb *); +void insert_tid(struct adapter *, int, void *); +void *lookup_tid(struct adapter *, int); +void update_tid(struct adapter *, int, void *); +void remove_tid(struct adapter *, int); +void release_tid(struct adapter *, int, struct sge_wrq *); +int find_best_mtu_idx(struct adapter *, struct in_conninfo *, int); +u_long select_rcv_wnd(struct socket *); +int select_rcv_wscale(void); +uint64_t calc_opt0(struct socket *, struct port_info *, struct l2t_entry *, + int, int, int, int); +uint32_t select_ntuple(struct port_info *, struct l2t_entry *, uint32_t); + +/* t4_connect.c */ +void t4_init_connect_cpl_handlers(struct adapter *); +int t4_connect(struct toedev *, struct socket *, struct rtentry *, + struct sockaddr *); + +/* t4_listen.c */ +void t4_init_listen_cpl_handlers(struct adapter *); +int t4_listen_start(struct toedev *, struct tcpcb *); +int t4_listen_stop(struct toedev *, struct tcpcb *); +void t4_syncache_added(struct toedev *, void *); +void t4_syncache_removed(struct toedev *, void *); +int t4_syncache_respond(struct toedev *, void *, struct mbuf *); +int do_abort_req_synqe(struct sge_iq *, const struct rss_header *, + struct mbuf *); +int do_abort_rpl_synqe(struct sge_iq *, const struct rss_header *, + struct mbuf *); +void t4_offload_socket(struct toedev *, void *, struct socket *); + +/* t4_cpl_io.c */ +void t4_init_cpl_io_handlers(struct adapter *); +void send_abort_rpl(struct adapter *, struct sge_wrq *, int , int); +void send_flowc_wr(struct toepcb *, struct flowc_tx_params *); +void send_reset(struct adapter *, struct toepcb *, uint32_t); +void make_established(struct toepcb *, uint32_t, uint32_t, uint16_t); +void t4_rcvd(struct toedev *, struct tcpcb *); +int t4_tod_output(struct toedev *, struct tcpcb *); +int t4_send_fin(struct toedev *, struct tcpcb *); +int t4_send_rst(struct toedev *, struct tcpcb *); + +#endif diff --git a/sys/dev/cxgbe/tom/t4_tom_l2t.c b/sys/dev/cxgbe/tom/t4_tom_l2t.c new file mode 100644 index 00000000000..ffe64c5be6e --- /dev/null +++ b/sys/dev/cxgbe/tom/t4_tom_l2t.c @@ -0,0 +1,405 @@ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +__FBSDID("$FreeBSD$"); + +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common/common.h" +#include "common/jhash.h" +#include "common/t4_msg.h" +#include "tom/t4_tom_l2t.h" +#include "tom/t4_tom.h" + +#define VLAN_NONE 0xfff + +#define SA(x) ((struct sockaddr *)(x)) +#define SIN(x) ((struct sockaddr_in *)(x)) +#define SINADDR(x) (SIN(x)->sin_addr.s_addr) + +static inline void +l2t_hold(struct l2t_data *d, struct l2t_entry *e) +{ + if (atomic_fetchadd_int(&e->refcnt, 1) == 0) /* 0 -> 1 transition */ + atomic_subtract_int(&d->nfree, 1); +} + +static inline unsigned int +arp_hash(const uint32_t key, int ifindex) +{ + return jhash_2words(key, ifindex, 0) & (L2T_SIZE - 1); +} + +/* + * Add a WR to an L2T entry's queue of work requests awaiting resolution. + * Must be called with the entry's lock held. + */ +static inline void +arpq_enqueue(struct l2t_entry *e, struct wrqe *wr) +{ + mtx_assert(&e->lock, MA_OWNED); + + STAILQ_INSERT_TAIL(&e->wr_list, wr, link); +} + +static inline void +send_pending(struct adapter *sc, struct l2t_entry *e) +{ + struct wrqe *wr; + + mtx_assert(&e->lock, MA_OWNED); + + while ((wr = STAILQ_FIRST(&e->wr_list)) != NULL) { + STAILQ_REMOVE_HEAD(&e->wr_list, link); + t4_wrq_tx(sc, wr); + } +} + +static void +resolution_failed_for_wr(struct wrqe *wr) +{ + log(LOG_ERR, "%s: leaked work request %p, wr_len %d", __func__, wr, + wr->wr_len); + + /* free(wr, M_CXGBE); */ +} + +static void +resolution_failed(struct l2t_entry *e) +{ + struct wrqe *wr; + + mtx_assert(&e->lock, MA_OWNED); + + while ((wr = STAILQ_FIRST(&e->wr_list)) != NULL) { + STAILQ_REMOVE_HEAD(&e->wr_list, link); + resolution_failed_for_wr(wr); + } +} + +static void +update_entry(struct adapter *sc, struct l2t_entry *e, uint8_t *lladdr, + uint16_t vtag) +{ + + mtx_assert(&e->lock, MA_OWNED); + + /* + * The entry may be in active use (e->refcount > 0) or not. We update + * it even when it's not as this simplifies the case where we decide to + * reuse the entry later. + */ + + if (lladdr == NULL && + (e->state == L2T_STATE_RESOLVING || e->state == L2T_STATE_FAILED)) { + /* + * Never got a valid L2 address for this one. Just mark it as + * failed instead of removing it from the hash (for which we'd + * need to wlock the table). + */ + e->state = L2T_STATE_FAILED; + resolution_failed(e); + return; + + } else if (lladdr == NULL) { + + /* Valid or already-stale entry was deleted (or expired) */ + + KASSERT(e->state == L2T_STATE_VALID || + e->state == L2T_STATE_STALE, + ("%s: lladdr NULL, state %d", __func__, e->state)); + + e->state = L2T_STATE_STALE; + + } else { + + if (e->state == L2T_STATE_RESOLVING || + e->state == L2T_STATE_FAILED || + memcmp(e->dmac, lladdr, ETHER_ADDR_LEN)) { + + /* unresolved -> resolved; or dmac changed */ + + memcpy(e->dmac, lladdr, ETHER_ADDR_LEN); + e->vlan = vtag; + t4_write_l2e(sc, e, 1); + } + e->state = L2T_STATE_VALID; + } +} + +static int +resolve_entry(struct adapter *sc, struct l2t_entry *e) +{ + struct tom_data *td = sc->tom_softc; + struct toedev *tod = &td->tod; + struct sockaddr_in sin = {0}; + uint8_t dmac[ETHER_ADDR_LEN]; + uint16_t vtag = VLAN_NONE; + int rc; + + sin.sin_family = AF_INET; + sin.sin_len = sizeof(struct sockaddr_in); + SINADDR(&sin) = e->addr; + + rc = toe_l2_resolve(tod, e->ifp, SA(&sin), dmac, &vtag); + if (rc == EWOULDBLOCK) + return (rc); + + mtx_lock(&e->lock); + update_entry(sc, e, rc == 0 ? dmac : NULL, vtag); + mtx_unlock(&e->lock); + + return (rc); +} + +int +t4_l2t_send_slow(struct adapter *sc, struct wrqe *wr, struct l2t_entry *e) +{ + +again: + switch (e->state) { + case L2T_STATE_STALE: /* entry is stale, kick off revalidation */ + + if (resolve_entry(sc, e) != EWOULDBLOCK) + goto again; /* entry updated, re-examine state */ + + /* Fall through */ + + case L2T_STATE_VALID: /* fast-path, send the packet on */ + + t4_wrq_tx(sc, wr); + return (0); + + case L2T_STATE_RESOLVING: + case L2T_STATE_SYNC_WRITE: + + mtx_lock(&e->lock); + if (e->state != L2T_STATE_SYNC_WRITE && + e->state != L2T_STATE_RESOLVING) { + /* state changed by the time we got here */ + mtx_unlock(&e->lock); + goto again; + } + arpq_enqueue(e, wr); + mtx_unlock(&e->lock); + + if (resolve_entry(sc, e) == EWOULDBLOCK) + break; + + mtx_lock(&e->lock); + if (e->state == L2T_STATE_VALID && !STAILQ_EMPTY(&e->wr_list)) + send_pending(sc, e); + if (e->state == L2T_STATE_FAILED) + resolution_failed(e); + mtx_unlock(&e->lock); + break; + + case L2T_STATE_FAILED: + resolution_failed_for_wr(wr); + return (EHOSTUNREACH); + } + + return (0); +} + +/* + * Called when an L2T entry has no more users. The entry is left in the hash + * table since it is likely to be reused but we also bump nfree to indicate + * that the entry can be reallocated for a different neighbor. We also drop + * the existing neighbor reference in case the neighbor is going away and is + * waiting on our reference. + * + * Because entries can be reallocated to other neighbors once their ref count + * drops to 0 we need to take the entry's lock to avoid races with a new + * incarnation. + */ + +static int +do_l2t_write_rpl2(struct sge_iq *iq, const struct rss_header *rss, + struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_l2t_write_rpl *rpl = (const void *)(rss + 1); + unsigned int tid = GET_TID(rpl); + unsigned int idx = tid & (L2T_SIZE - 1); + int rc; + + rc = do_l2t_write_rpl(iq, rss, m); + if (rc != 0) + return (rc); + + if (tid & F_SYNC_WR) { + struct l2t_entry *e = &sc->l2t->l2tab[idx]; + + mtx_lock(&e->lock); + if (e->state != L2T_STATE_SWITCHING) { + send_pending(sc, e); + e->state = L2T_STATE_VALID; + } + mtx_unlock(&e->lock); + } + + return (0); +} + +void +t4_init_l2t_cpl_handlers(struct adapter *sc) +{ + + t4_register_cpl_handler(sc, CPL_L2T_WRITE_RPL, do_l2t_write_rpl2); +} + +void +t4_uninit_l2t_cpl_handlers(struct adapter *sc) +{ + + t4_register_cpl_handler(sc, CPL_L2T_WRITE_RPL, do_l2t_write_rpl); +} + +/* + * The TOE wants an L2 table entry that it can use to reach the next hop over + * the specified port. Produce such an entry - create one if needed. + * + * Note that the ifnet could be a pseudo-device like if_vlan, if_lagg, etc. on + * top of the real cxgbe interface. + */ +struct l2t_entry * +t4_l2t_get(struct port_info *pi, struct ifnet *ifp, struct sockaddr *sa) +{ + struct l2t_entry *e; + struct l2t_data *d = pi->adapter->l2t; + uint32_t addr = SINADDR(sa); + int hash = arp_hash(addr, ifp->if_index); + unsigned int smt_idx = pi->port_id; + + if (sa->sa_family != AF_INET) + return (NULL); /* XXX: no IPv6 support right now */ + +#ifndef VLAN_TAG + if (ifp->if_type == IFT_L2VLAN) + return (NULL); +#endif + + rw_wlock(&d->lock); + for (e = d->l2tab[hash].first; e; e = e->next) { + if (e->addr == addr && e->ifp == ifp && e->smt_idx == smt_idx) { + l2t_hold(d, e); + goto done; + } + } + + /* Need to allocate a new entry */ + e = t4_alloc_l2e(d); + if (e) { + mtx_lock(&e->lock); /* avoid race with t4_l2t_free */ + e->next = d->l2tab[hash].first; + d->l2tab[hash].first = e; + + e->state = L2T_STATE_RESOLVING; + e->addr = addr; + e->ifp = ifp; + e->smt_idx = smt_idx; + e->hash = hash; + e->lport = pi->lport; + atomic_store_rel_int(&e->refcnt, 1); +#ifdef VLAN_TAG + if (ifp->if_type == IFT_L2VLAN) + VLAN_TAG(ifp, &e->vlan); + else + e->vlan = VLAN_NONE; +#endif + mtx_unlock(&e->lock); + } +done: + rw_wunlock(&d->lock); + return e; +} + +/* + * Called when the host's ARP layer makes a change to some entry that is loaded + * into the HW L2 table. + */ +void +t4_l2_update(struct toedev *tod, struct ifnet *ifp, struct sockaddr *sa, + uint8_t *lladdr, uint16_t vtag) +{ + struct adapter *sc = tod->tod_softc; + struct l2t_entry *e; + struct l2t_data *d = sc->l2t; + uint32_t addr = SINADDR(sa); + int hash = arp_hash(addr, ifp->if_index); + + KASSERT(d != NULL, ("%s: no L2 table", __func__)); + + rw_rlock(&d->lock); + for (e = d->l2tab[hash].first; e; e = e->next) { + if (e->addr == addr && e->ifp == ifp) { + mtx_lock(&e->lock); + if (atomic_load_acq_int(&e->refcnt)) + goto found; + e->state = L2T_STATE_STALE; + mtx_unlock(&e->lock); + break; + } + } + rw_runlock(&d->lock); + + /* + * This is of no interest to us. We've never had an offloaded + * connection to this destination, and we aren't attempting one right + * now. + */ + return; + +found: + rw_runlock(&d->lock); + + KASSERT(e->state != L2T_STATE_UNUSED, + ("%s: unused entry in the hash.", __func__)); + + update_entry(sc, e, lladdr, vtag); + mtx_unlock(&e->lock); +} +#endif diff --git a/sys/dev/cxgbe/tom/t4_tom_l2t.h b/sys/dev/cxgbe/tom/t4_tom_l2t.h new file mode 100644 index 00000000000..3d76735707e --- /dev/null +++ b/sys/dev/cxgbe/tom/t4_tom_l2t.h @@ -0,0 +1,53 @@ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + * + */ + +#ifndef __T4_TOM_L2T_H +#define __T4_TOM_L2T_H + +#include "t4_l2t.h" + +int t4_l2t_send_slow(struct adapter *, struct wrqe *, struct l2t_entry *); +struct l2t_entry *t4_l2t_get(struct port_info *, struct ifnet *, + struct sockaddr *); +void t4_l2_update(struct toedev *, struct ifnet *, struct sockaddr *, + uint8_t *, uint16_t); +void t4_init_l2t_cpl_handlers(struct adapter *); +void t4_uninit_l2t_cpl_handlers(struct adapter *); + +static inline int +t4_l2t_send(struct adapter *sc, struct wrqe *wr, struct l2t_entry *e) +{ + if (__predict_true(e->state == L2T_STATE_VALID)) { + t4_wrq_tx(sc, wr); + return (0); + } else + return (t4_l2t_send_slow(sc, wr, e)); +} + +#endif /* __T4_TOM_L2T_H */ diff --git a/sys/dev/dc/if_dc.c b/sys/dev/dc/if_dc.c index 0ace34ef1a8..f8f9af23676 100644 --- a/sys/dev/dc/if_dc.c +++ b/sys/dev/dc/if_dc.c @@ -354,8 +354,9 @@ static driver_t dc_driver = { static devclass_t dc_devclass; -DRIVER_MODULE(dc, pci, dc_driver, dc_devclass, 0, 0); -DRIVER_MODULE(miibus, dc, miibus_driver, miibus_devclass, 0, 0); +DRIVER_MODULE_ORDERED(dc, pci, dc_driver, dc_devclass, NULL, NULL, + SI_ORDER_ANY); +DRIVER_MODULE(miibus, dc, miibus_driver, miibus_devclass, NULL, NULL); #define DC_SETBIT(sc, reg, x) \ CSR_WRITE_4(sc, reg, CSR_READ_4(sc, reg) | (x)) diff --git a/sys/dev/drm2/drm.h b/sys/dev/drm2/drm.h new file mode 100644 index 00000000000..d7e57adda23 --- /dev/null +++ b/sys/dev/drm2/drm.h @@ -0,0 +1,1214 @@ +/** + * \file drm.h + * Header for the Direct Rendering Manager + * + * \author Rickard E. (Rik) Faith + * + * \par Acknowledgments: + * Dec 1999, Richard Henderson , move to generic \c cmpxchg. + */ + +/*- + * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +/** + * \mainpage + * + * The Direct Rendering Manager (DRM) is a device-independent kernel-level + * device driver that provides support for the XFree86 Direct Rendering + * Infrastructure (DRI). + * + * The DRM supports the Direct Rendering Infrastructure (DRI) in four major + * ways: + * -# The DRM provides synchronized access to the graphics hardware via + * the use of an optimized two-tiered lock. + * -# The DRM enforces the DRI security policy for access to the graphics + * hardware by only allowing authenticated X11 clients access to + * restricted regions of memory. + * -# The DRM provides a generic DMA engine, complete with multiple + * queues and the ability to detect the need for an OpenGL context + * switch. + * -# The DRM is extensible via the use of small device-specific modules + * that rely extensively on the API exported by the DRM module. + * + */ + +#ifndef _DRM_H_ +#define _DRM_H_ + +#ifndef __user +#define __user +#endif +#ifndef __iomem +#define __iomem +#endif + +#ifdef __GNUC__ +# define DEPRECATED __attribute__ ((deprecated)) +#else +# define DEPRECATED +#endif + +#if defined(__linux__) +#include /* For _IO* macros */ +#define DRM_IOCTL_NR(n) _IOC_NR(n) +#define DRM_IOC_VOID _IOC_NONE +#define DRM_IOC_READ _IOC_READ +#define DRM_IOC_WRITE _IOC_WRITE +#define DRM_IOC_READWRITE _IOC_READ|_IOC_WRITE +#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) +#include +#define DRM_IOCTL_NR(n) ((n) & 0xff) +#define DRM_IOC_VOID IOC_VOID +#define DRM_IOC_READ IOC_OUT +#define DRM_IOC_WRITE IOC_IN +#define DRM_IOC_READWRITE IOC_INOUT +#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size) +#endif + +#ifdef __OpenBSD__ +#define DRM_MAJOR 81 +#endif +#if defined(__linux__) || defined(__NetBSD__) +#define DRM_MAJOR 226 +#endif +#define DRM_MAX_MINOR 15 + +#define DRM_NAME "drm" /**< Name in kernel, /dev, and /proc */ +#define DRM_MIN_ORDER 5 /**< At least 2^5 bytes = 32 bytes */ +#define DRM_MAX_ORDER 22 /**< Up to 2^22 bytes = 4MB */ +#define DRM_RAM_PERCENT 10 /**< How much system ram can we lock? */ + +#define _DRM_LOCK_HELD 0x80000000U /**< Hardware lock is held */ +#define _DRM_LOCK_CONT 0x40000000U /**< Hardware lock is contended */ +#define _DRM_LOCK_IS_HELD(lock) ((lock) & _DRM_LOCK_HELD) +#define _DRM_LOCK_IS_CONT(lock) ((lock) & _DRM_LOCK_CONT) +#define _DRM_LOCKING_CONTEXT(lock) ((lock) & ~(_DRM_LOCK_HELD|_DRM_LOCK_CONT)) + +#if defined(__linux__) +typedef unsigned int drm_handle_t; +#else +#include +typedef unsigned long drm_handle_t; /**< To mapped regions */ +#endif +typedef unsigned int drm_context_t; /**< GLXContext handle */ +typedef unsigned int drm_drawable_t; +typedef unsigned int drm_magic_t; /**< Magic for authentication */ + +/** + * Cliprect. + * + * \warning If you change this structure, make sure you change + * XF86DRIClipRectRec in the server as well + * + * \note KW: Actually it's illegal to change either for + * backwards-compatibility reasons. + */ +struct drm_clip_rect { + unsigned short x1; + unsigned short y1; + unsigned short x2; + unsigned short y2; +}; + +/** + * Texture region, + */ +struct drm_tex_region { + unsigned char next; + unsigned char prev; + unsigned char in_use; + unsigned char padding; + unsigned int age; +}; + +/** + * Hardware lock. + * + * The lock structure is a simple cache-line aligned integer. To avoid + * processor bus contention on a multiprocessor system, there should not be any + * other data stored in the same cache line. + */ +struct drm_hw_lock { + __volatile__ unsigned int lock; /**< lock variable */ + char padding[60]; /**< Pad to cache line */ +}; + +/* This is beyond ugly, and only works on GCC. However, it allows me to use + * drm.h in places (i.e., in the X-server) where I can't use size_t. The real + * fix is to use uint32_t instead of size_t, but that fix will break existing + * LP64 (i.e., PowerPC64, SPARC64, IA-64, Alpha, etc.) systems. That *will* + * eventually happen, though. I chose 'unsigned long' to be the fallback type + * because that works on all the platforms I know about. Hopefully, the + * real fix will happen before that bites us. + */ + +#ifdef __SIZE_TYPE__ +# define DRM_SIZE_T __SIZE_TYPE__ +#else +# warning "__SIZE_TYPE__ not defined. Assuming sizeof(size_t) == sizeof(unsigned long)!" +# define DRM_SIZE_T unsigned long +#endif + +/** + * DRM_IOCTL_VERSION ioctl argument type. + * + * \sa drmGetVersion(). + */ +struct drm_version { + int version_major; /**< Major version */ + int version_minor; /**< Minor version */ + int version_patchlevel; /**< Patch level */ + DRM_SIZE_T name_len; /**< Length of name buffer */ + char __user *name; /**< Name of driver */ + DRM_SIZE_T date_len; /**< Length of date buffer */ + char __user *date; /**< User-space buffer to hold date */ + DRM_SIZE_T desc_len; /**< Length of desc buffer */ + char __user *desc; /**< User-space buffer to hold desc */ +}; + +/** + * DRM_IOCTL_GET_UNIQUE ioctl argument type. + * + * \sa drmGetBusid() and drmSetBusId(). + */ +struct drm_unique { + DRM_SIZE_T unique_len; /**< Length of unique */ + char __user *unique; /**< Unique name for driver instantiation */ +}; + +#undef DRM_SIZE_T + +struct drm_list { + int count; /**< Length of user-space structures */ + struct drm_version __user *version; +}; + +struct drm_block { + int unused; +}; + +/** + * DRM_IOCTL_CONTROL ioctl argument type. + * + * \sa drmCtlInstHandler() and drmCtlUninstHandler(). + */ +struct drm_control { + enum { + DRM_ADD_COMMAND, + DRM_RM_COMMAND, + DRM_INST_HANDLER, + DRM_UNINST_HANDLER + } func; + int irq; +}; + +/** + * Type of memory to map. + */ +enum drm_map_type { + _DRM_FRAME_BUFFER = 0, /**< WC (no caching), no core dump */ + _DRM_REGISTERS = 1, /**< no caching, no core dump */ + _DRM_SHM = 2, /**< shared, cached */ + _DRM_AGP = 3, /**< AGP/GART */ + _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */ + _DRM_CONSISTENT = 5, /**< Consistent memory for PCI DMA */ + _DRM_GEM = 6 /**< GEM */ +}; + +/** + * Memory mapping flags. + */ +enum drm_map_flags { + _DRM_RESTRICTED = 0x01, /**< Cannot be mapped to user-virtual */ + _DRM_READ_ONLY = 0x02, + _DRM_LOCKED = 0x04, /**< shared, cached, locked */ + _DRM_KERNEL = 0x08, /**< kernel requires access */ + _DRM_WRITE_COMBINING = 0x10, /**< use write-combining if available */ + _DRM_CONTAINS_LOCK = 0x20, /**< SHM page that contains lock */ + _DRM_REMOVABLE = 0x40, /**< Removable mapping */ + _DRM_DRIVER = 0x80 /**< Managed by driver */ +}; + +struct drm_ctx_priv_map { + unsigned int ctx_id; /**< Context requesting private mapping */ + void *handle; /**< Handle of map */ +}; + +/** + * DRM_IOCTL_GET_MAP, DRM_IOCTL_ADD_MAP and DRM_IOCTL_RM_MAP ioctls + * argument type. + * + * \sa drmAddMap(). + */ +struct drm_map { + unsigned long offset; /**< Requested physical address (0 for SAREA)*/ + unsigned long size; /**< Requested physical size (bytes) */ + enum drm_map_type type; /**< Type of memory to map */ + enum drm_map_flags flags; /**< Flags */ + void *handle; /**< User-space: "Handle" to pass to mmap() */ + /**< Kernel-space: kernel-virtual address */ + int mtrr; /**< MTRR slot used */ + /* Private data */ +}; + +/** + * DRM_IOCTL_GET_CLIENT ioctl argument type. + */ +struct drm_client { + int idx; /**< Which client desired? */ + int auth; /**< Is client authenticated? */ + unsigned long pid; /**< Process ID */ + unsigned long uid; /**< User ID */ + unsigned long magic; /**< Magic */ + unsigned long iocs; /**< Ioctl count */ +}; + +enum drm_stat_type { + _DRM_STAT_LOCK, + _DRM_STAT_OPENS, + _DRM_STAT_CLOSES, + _DRM_STAT_IOCTLS, + _DRM_STAT_LOCKS, + _DRM_STAT_UNLOCKS, + _DRM_STAT_VALUE, /**< Generic value */ + _DRM_STAT_BYTE, /**< Generic byte counter (1024bytes/K) */ + _DRM_STAT_COUNT, /**< Generic non-byte counter (1000/k) */ + + _DRM_STAT_IRQ, /**< IRQ */ + _DRM_STAT_PRIMARY, /**< Primary DMA bytes */ + _DRM_STAT_SECONDARY, /**< Secondary DMA bytes */ + _DRM_STAT_DMA, /**< DMA */ + _DRM_STAT_SPECIAL, /**< Special DMA (e.g., priority or polled) */ + _DRM_STAT_MISSED /**< Missed DMA opportunity */ + /* Add to the *END* of the list */ +}; + +/** + * DRM_IOCTL_GET_STATS ioctl argument type. + */ +struct drm_stats { + unsigned long count; + struct { + unsigned long value; + enum drm_stat_type type; + } data[15]; +}; + +/** + * Hardware locking flags. + */ +enum drm_lock_flags { + _DRM_LOCK_READY = 0x01, /**< Wait until hardware is ready for DMA */ + _DRM_LOCK_QUIESCENT = 0x02, /**< Wait until hardware quiescent */ + _DRM_LOCK_FLUSH = 0x04, /**< Flush this context's DMA queue first */ + _DRM_LOCK_FLUSH_ALL = 0x08, /**< Flush all DMA queues first */ + /* These *HALT* flags aren't supported yet + -- they will be used to support the + full-screen DGA-like mode. */ + _DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */ + _DRM_HALT_CUR_QUEUES = 0x20 /**< Halt all current queues */ +}; + +/** + * DRM_IOCTL_LOCK, DRM_IOCTL_UNLOCK and DRM_IOCTL_FINISH ioctl argument type. + * + * \sa drmGetLock() and drmUnlock(). + */ +struct drm_lock { + int context; + enum drm_lock_flags flags; +}; + +/** + * DMA flags + * + * \warning + * These values \e must match xf86drm.h. + * + * \sa drm_dma. + */ +enum drm_dma_flags { + /* Flags for DMA buffer dispatch */ + _DRM_DMA_BLOCK = 0x01, /**< + * Block until buffer dispatched. + * + * \note The buffer may not yet have + * been processed by the hardware -- + * getting a hardware lock with the + * hardware quiescent will ensure + * that the buffer has been + * processed. + */ + _DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */ + _DRM_DMA_PRIORITY = 0x04, /**< High priority dispatch */ + + /* Flags for DMA buffer request */ + _DRM_DMA_WAIT = 0x10, /**< Wait for free buffers */ + _DRM_DMA_SMALLER_OK = 0x20, /**< Smaller-than-requested buffers OK */ + _DRM_DMA_LARGER_OK = 0x40 /**< Larger-than-requested buffers OK */ +}; + +/** + * DRM_IOCTL_ADD_BUFS and DRM_IOCTL_MARK_BUFS ioctl argument type. + * + * \sa drmAddBufs(). + */ +struct drm_buf_desc { + int count; /**< Number of buffers of this size */ + int size; /**< Size in bytes */ + int low_mark; /**< Low water mark */ + int high_mark; /**< High water mark */ + enum { + _DRM_PAGE_ALIGN = 0x01, /**< Align on page boundaries for DMA */ + _DRM_AGP_BUFFER = 0x02, /**< Buffer is in AGP space */ + _DRM_SG_BUFFER = 0x04, /**< Scatter/gather memory buffer */ + _DRM_FB_BUFFER = 0x08, /**< Buffer is in frame buffer */ + _DRM_PCI_BUFFER_RO = 0x10 /**< Map PCI DMA buffer read-only */ + } flags; + unsigned long agp_start; /**< + * Start address of where the AGP buffers are + * in the AGP aperture + */ +}; + +/** + * DRM_IOCTL_INFO_BUFS ioctl argument type. + */ +struct drm_buf_info { + int count; /**< Number of buffers described in list */ + struct drm_buf_desc __user *list; /**< List of buffer descriptions */ +}; + +/** + * DRM_IOCTL_FREE_BUFS ioctl argument type. + */ +struct drm_buf_free { + int count; + int __user *list; +}; + +/** + * Buffer information + * + * \sa drm_buf_map. + */ +struct drm_buf_pub { + int idx; /**< Index into the master buffer list */ + int total; /**< Buffer size */ + int used; /**< Amount of buffer in use (for DMA) */ + void __user *address; /**< Address of buffer */ +}; + +/** + * DRM_IOCTL_MAP_BUFS ioctl argument type. + */ +struct drm_buf_map { + int count; /**< Length of the buffer list */ +#if defined(__cplusplus) + void __user *c_virtual; +#else + void __user *virtual; /**< Mmap'd area in user-virtual */ +#endif + struct drm_buf_pub __user *list; /**< Buffer information */ +}; + +/** + * DRM_IOCTL_DMA ioctl argument type. + * + * Indices here refer to the offset into the buffer list in drm_buf_get. + * + * \sa drmDMA(). + */ +struct drm_dma { + int context; /**< Context handle */ + int send_count; /**< Number of buffers to send */ + int __user *send_indices; /**< List of handles to buffers */ + int __user *send_sizes; /**< Lengths of data to send */ + enum drm_dma_flags flags; /**< Flags */ + int request_count; /**< Number of buffers requested */ + int request_size; /**< Desired size for buffers */ + int __user *request_indices; /**< Buffer information */ + int __user *request_sizes; + int granted_count; /**< Number of buffers granted */ +}; + +enum drm_ctx_flags { + _DRM_CONTEXT_PRESERVED = 0x01, + _DRM_CONTEXT_2DONLY = 0x02 +}; + +/** + * DRM_IOCTL_ADD_CTX ioctl argument type. + * + * \sa drmCreateContext() and drmDestroyContext(). + */ +struct drm_ctx { + drm_context_t handle; + enum drm_ctx_flags flags; +}; + +/** + * DRM_IOCTL_RES_CTX ioctl argument type. + */ +struct drm_ctx_res { + int count; + struct drm_ctx __user *contexts; +}; + +/** + * DRM_IOCTL_ADD_DRAW and DRM_IOCTL_RM_DRAW ioctl argument type. + */ +struct drm_draw { + drm_drawable_t handle; +}; + +/** + * DRM_IOCTL_UPDATE_DRAW ioctl argument type. + */ +typedef enum { + DRM_DRAWABLE_CLIPRECTS, +} drm_drawable_info_type_t; + +struct drm_update_draw { + drm_drawable_t handle; + unsigned int type; + unsigned int num; + unsigned long long data; +}; + +/** + * DRM_IOCTL_GET_MAGIC and DRM_IOCTL_AUTH_MAGIC ioctl argument type. + */ +struct drm_auth { + drm_magic_t magic; +}; + +/** + * DRM_IOCTL_IRQ_BUSID ioctl argument type. + * + * \sa drmGetInterruptFromBusID(). + */ +struct drm_irq_busid { + int irq; /**< IRQ number */ + int busnum; /**< bus number */ + int devnum; /**< device number */ + int funcnum; /**< function number */ +}; + +enum drm_vblank_seq_type { + _DRM_VBLANK_ABSOLUTE = 0x0, /**< Wait for specific vblank sequence number */ + _DRM_VBLANK_RELATIVE = 0x1, /**< Wait for given number of vblanks */ + _DRM_VBLANK_HIGH_CRTC_MASK = 0x0000003e, + _DRM_VBLANK_EVENT = 0x4000000, /**< Send event instead of blocking */ + _DRM_VBLANK_FLIP = 0x8000000, /**< Scheduled buffer swap should flip */ + _DRM_VBLANK_NEXTONMISS = 0x10000000, /**< If missed, wait for next vblank */ + _DRM_VBLANK_SECONDARY = 0x20000000, /**< Secondary display controller */ + _DRM_VBLANK_SIGNAL = 0x40000000 /**< Send signal instead of blocking */ +}; +#define _DRM_VBLANK_HIGH_CRTC_SHIFT 1 + +#define _DRM_VBLANK_TYPES_MASK (_DRM_VBLANK_ABSOLUTE | _DRM_VBLANK_RELATIVE) +#define _DRM_VBLANK_FLAGS_MASK (_DRM_VBLANK_EVENT | _DRM_VBLANK_SIGNAL | \ + _DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS) + +struct drm_wait_vblank_request { + enum drm_vblank_seq_type type; + unsigned int sequence; + unsigned long signal; +}; + +struct drm_wait_vblank_reply { + enum drm_vblank_seq_type type; + unsigned int sequence; + long tval_sec; + long tval_usec; +}; + +/** + * DRM_IOCTL_WAIT_VBLANK ioctl argument type. + * + * \sa drmWaitVBlank(). + */ +union drm_wait_vblank { + struct drm_wait_vblank_request request; + struct drm_wait_vblank_reply reply; +}; + + +#define _DRM_PRE_MODESET 1 +#define _DRM_POST_MODESET 2 + +/** + * DRM_IOCTL_MODESET_CTL ioctl argument type + * + * \sa drmModesetCtl(). + */ +struct drm_modeset_ctl { + uint32_t crtc; + uint32_t cmd; +}; + +/** + * DRM_IOCTL_AGP_ENABLE ioctl argument type. + * + * \sa drmAgpEnable(). + */ +struct drm_agp_mode { + unsigned long mode; /**< AGP mode */ +}; + +/** + * DRM_IOCTL_AGP_ALLOC and DRM_IOCTL_AGP_FREE ioctls argument type. + * + * \sa drmAgpAlloc() and drmAgpFree(). + */ +struct drm_agp_buffer { + unsigned long size; /**< In bytes -- will round to page boundary */ + unsigned long handle; /**< Used for binding / unbinding */ + unsigned long type; /**< Type of memory to allocate */ + unsigned long physical; /**< Physical used by i810 */ +}; + +/** + * DRM_IOCTL_AGP_BIND and DRM_IOCTL_AGP_UNBIND ioctls argument type. + * + * \sa drmAgpBind() and drmAgpUnbind(). + */ +struct drm_agp_binding { + unsigned long handle; /**< From drm_agp_buffer */ + unsigned long offset; /**< In bytes -- will round to page boundary */ +}; + +/** + * DRM_IOCTL_AGP_INFO ioctl argument type. + * + * \sa drmAgpVersionMajor(), drmAgpVersionMinor(), drmAgpGetMode(), + * drmAgpBase(), drmAgpSize(), drmAgpMemoryUsed(), drmAgpMemoryAvail(), + * drmAgpVendorId() and drmAgpDeviceId(). + */ +struct drm_agp_info { + int agp_version_major; + int agp_version_minor; + unsigned long mode; + unsigned long aperture_base; /**< physical address */ + unsigned long aperture_size; /**< bytes */ + unsigned long memory_allowed; /**< bytes */ + unsigned long memory_used; + + /** \name PCI information */ + /*@{ */ + unsigned short id_vendor; + unsigned short id_device; + /*@} */ +}; + +/** + * DRM_IOCTL_SG_ALLOC ioctl argument type. + */ +struct drm_scatter_gather { + unsigned long size; /**< In bytes -- will round to page boundary */ + unsigned long handle; /**< Used for mapping / unmapping */ +}; + +/** + * DRM_IOCTL_SET_VERSION ioctl argument type. + */ +struct drm_set_version { + int drm_di_major; + int drm_di_minor; + int drm_dd_major; + int drm_dd_minor; +}; + +#define DRM_FENCE_FLAG_EMIT 0x00000001 +#define DRM_FENCE_FLAG_SHAREABLE 0x00000002 +/** + * On hardware with no interrupt events for operation completion, + * indicates that the kernel should sleep while waiting for any blocking + * operation to complete rather than spinning. + * + * Has no effect otherwise. + */ +#define DRM_FENCE_FLAG_WAIT_LAZY 0x00000004 +#define DRM_FENCE_FLAG_NO_USER 0x00000010 + +/* Reserved for driver use */ +#define DRM_FENCE_MASK_DRIVER 0xFF000000 + +#define DRM_FENCE_TYPE_EXE 0x00000001 + +struct drm_fence_arg { + unsigned int handle; + unsigned int fence_class; + unsigned int type; + unsigned int flags; + unsigned int signaled; + unsigned int error; + unsigned int sequence; + unsigned int pad64; + uint64_t expand_pad[2]; /* Future expansion */ +}; + +/* Buffer permissions, referring to how the GPU uses the buffers. + * these translate to fence types used for the buffers. + * Typically a texture buffer is read, A destination buffer is write and + * a command (batch-) buffer is exe. Can be or-ed together. + */ + +#define DRM_BO_FLAG_READ (1ULL << 0) +#define DRM_BO_FLAG_WRITE (1ULL << 1) +#define DRM_BO_FLAG_EXE (1ULL << 2) + +/* + * All of the bits related to access mode + */ +#define DRM_BO_MASK_ACCESS (DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE | DRM_BO_FLAG_EXE) +/* + * Status flags. Can be read to determine the actual state of a buffer. + * Can also be set in the buffer mask before validation. + */ + +/* + * Mask: Never evict this buffer. Not even with force. This type of buffer is only + * available to root and must be manually removed before buffer manager shutdown + * or lock. + * Flags: Acknowledge + */ +#define DRM_BO_FLAG_NO_EVICT (1ULL << 4) + +/* + * Mask: Require that the buffer is placed in mappable memory when validated. + * If not set the buffer may or may not be in mappable memory when validated. + * Flags: If set, the buffer is in mappable memory. + */ +#define DRM_BO_FLAG_MAPPABLE (1ULL << 5) + +/* Mask: The buffer should be shareable with other processes. + * Flags: The buffer is shareable with other processes. + */ +#define DRM_BO_FLAG_SHAREABLE (1ULL << 6) + +/* Mask: If set, place the buffer in cache-coherent memory if available. + * If clear, never place the buffer in cache coherent memory if validated. + * Flags: The buffer is currently in cache-coherent memory. + */ +#define DRM_BO_FLAG_CACHED (1ULL << 7) + +/* Mask: Make sure that every time this buffer is validated, + * it ends up on the same location provided that the memory mask is the same. + * The buffer will also not be evicted when claiming space for + * other buffers. Basically a pinned buffer but it may be thrown out as + * part of buffer manager shutdown or locking. + * Flags: Acknowledge. + */ +#define DRM_BO_FLAG_NO_MOVE (1ULL << 8) + +/* Mask: Make sure the buffer is in cached memory when mapped. In conjunction + * with DRM_BO_FLAG_CACHED it also allows the buffer to be bound into the GART + * with unsnooped PTEs instead of snooped, by using chipset-specific cache + * flushing at bind time. A better name might be DRM_BO_FLAG_TT_UNSNOOPED, + * as the eviction to local memory (TTM unbind) on map is just a side effect + * to prevent aggressive cache prefetch from the GPU disturbing the cache + * management that the DRM is doing. + * + * Flags: Acknowledge. + * Buffers allocated with this flag should not be used for suballocators + * This type may have issues on CPUs with over-aggressive caching + * http://marc.info/?l=linux-kernel&m=102376926732464&w=2 + */ +#define DRM_BO_FLAG_CACHED_MAPPED (1ULL << 19) + + +/* Mask: Force DRM_BO_FLAG_CACHED flag strictly also if it is set. + * Flags: Acknowledge. + */ +#define DRM_BO_FLAG_FORCE_CACHING (1ULL << 13) + +/* + * Mask: Force DRM_BO_FLAG_MAPPABLE flag strictly also if it is clear. + * Flags: Acknowledge. + */ +#define DRM_BO_FLAG_FORCE_MAPPABLE (1ULL << 14) +#define DRM_BO_FLAG_TILE (1ULL << 15) + +/* + * Memory type flags that can be or'ed together in the mask, but only + * one appears in flags. + */ + +/* System memory */ +#define DRM_BO_FLAG_MEM_LOCAL (1ULL << 24) +/* Translation table memory */ +#define DRM_BO_FLAG_MEM_TT (1ULL << 25) +/* Vram memory */ +#define DRM_BO_FLAG_MEM_VRAM (1ULL << 26) +/* Up to the driver to define. */ +#define DRM_BO_FLAG_MEM_PRIV0 (1ULL << 27) +#define DRM_BO_FLAG_MEM_PRIV1 (1ULL << 28) +#define DRM_BO_FLAG_MEM_PRIV2 (1ULL << 29) +#define DRM_BO_FLAG_MEM_PRIV3 (1ULL << 30) +#define DRM_BO_FLAG_MEM_PRIV4 (1ULL << 31) +/* We can add more of these now with a 64-bit flag type */ + +/* + * This is a mask covering all of the memory type flags; easier to just + * use a single constant than a bunch of | values. It covers + * DRM_BO_FLAG_MEM_LOCAL through DRM_BO_FLAG_MEM_PRIV4 + */ +#define DRM_BO_MASK_MEM 0x00000000FF000000ULL +/* + * This adds all of the CPU-mapping options in with the memory + * type to label all bits which change how the page gets mapped + */ +#define DRM_BO_MASK_MEMTYPE (DRM_BO_MASK_MEM | \ + DRM_BO_FLAG_CACHED_MAPPED | \ + DRM_BO_FLAG_CACHED | \ + DRM_BO_FLAG_MAPPABLE) + +/* Driver-private flags */ +#define DRM_BO_MASK_DRIVER 0xFFFF000000000000ULL + +/* + * Don't block on validate and map. Instead, return EBUSY. + */ +#define DRM_BO_HINT_DONT_BLOCK 0x00000002 +/* + * Don't place this buffer on the unfenced list. This means + * that the buffer will not end up having a fence associated + * with it as a result of this operation + */ +#define DRM_BO_HINT_DONT_FENCE 0x00000004 +/** + * On hardware with no interrupt events for operation completion, + * indicates that the kernel should sleep while waiting for any blocking + * operation to complete rather than spinning. + * + * Has no effect otherwise. + */ +#define DRM_BO_HINT_WAIT_LAZY 0x00000008 +/* + * The client has compute relocations refering to this buffer using the + * offset in the presumed_offset field. If that offset ends up matching + * where this buffer lands, the kernel is free to skip executing those + * relocations + */ +#define DRM_BO_HINT_PRESUMED_OFFSET 0x00000010 + +#define DRM_BO_INIT_MAGIC 0xfe769812 +#define DRM_BO_INIT_MAJOR 1 +#define DRM_BO_INIT_MINOR 0 +#define DRM_BO_INIT_PATCH 0 + + +struct drm_bo_info_req { + uint64_t mask; + uint64_t flags; + unsigned int handle; + unsigned int hint; + unsigned int fence_class; + unsigned int desired_tile_stride; + unsigned int tile_info; + unsigned int pad64; + uint64_t presumed_offset; +}; + +struct drm_bo_create_req { + uint64_t flags; + uint64_t size; + uint64_t buffer_start; + unsigned int hint; + unsigned int page_alignment; +}; + + +/* + * Reply flags + */ + +#define DRM_BO_REP_BUSY 0x00000001 + +struct drm_bo_info_rep { + uint64_t flags; + uint64_t proposed_flags; + uint64_t size; + uint64_t offset; + uint64_t arg_handle; + uint64_t buffer_start; + unsigned int handle; + unsigned int fence_flags; + unsigned int rep_flags; + unsigned int page_alignment; + unsigned int desired_tile_stride; + unsigned int hw_tile_stride; + unsigned int tile_info; + unsigned int pad64; + uint64_t expand_pad[4]; /*Future expansion */ +}; + +struct drm_bo_arg_rep { + struct drm_bo_info_rep bo_info; + int ret; + unsigned int pad64; +}; + +struct drm_bo_create_arg { + union { + struct drm_bo_create_req req; + struct drm_bo_info_rep rep; + } d; +}; + +struct drm_bo_handle_arg { + unsigned int handle; +}; + +struct drm_bo_reference_info_arg { + union { + struct drm_bo_handle_arg req; + struct drm_bo_info_rep rep; + } d; +}; + +struct drm_bo_map_wait_idle_arg { + union { + struct drm_bo_info_req req; + struct drm_bo_info_rep rep; + } d; +}; + +struct drm_bo_op_req { + enum { + drm_bo_validate, + drm_bo_fence, + drm_bo_ref_fence, + } op; + unsigned int arg_handle; + struct drm_bo_info_req bo_req; +}; + + +struct drm_bo_op_arg { + uint64_t next; + union { + struct drm_bo_op_req req; + struct drm_bo_arg_rep rep; + } d; + int handled; + unsigned int pad64; +}; + + +#define DRM_BO_MEM_LOCAL 0 +#define DRM_BO_MEM_TT 1 +#define DRM_BO_MEM_VRAM 2 +#define DRM_BO_MEM_PRIV0 3 +#define DRM_BO_MEM_PRIV1 4 +#define DRM_BO_MEM_PRIV2 5 +#define DRM_BO_MEM_PRIV3 6 +#define DRM_BO_MEM_PRIV4 7 + +#define DRM_BO_MEM_TYPES 8 /* For now. */ + +#define DRM_BO_LOCK_UNLOCK_BM (1 << 0) +#define DRM_BO_LOCK_IGNORE_NO_EVICT (1 << 1) + +struct drm_bo_version_arg { + uint32_t major; + uint32_t minor; + uint32_t patchlevel; +}; + +struct drm_mm_type_arg { + unsigned int mem_type; + unsigned int lock_flags; +}; + +struct drm_mm_init_arg { + unsigned int magic; + unsigned int major; + unsigned int minor; + unsigned int mem_type; + uint64_t p_offset; + uint64_t p_size; +}; + +struct drm_mm_info_arg { + unsigned int mem_type; + uint64_t p_size; +}; + +struct drm_gem_close { + /** Handle of the object to be closed. */ + uint32_t handle; + uint32_t pad; +}; + +struct drm_gem_flink { + /** Handle for the object being named */ + uint32_t handle; + + /** Returned global name */ + uint32_t name; +}; + +struct drm_gem_open { + /** Name of object being opened */ + uint32_t name; + + /** Returned handle for the object */ + uint32_t handle; + + /** Returned size of the object */ + uint64_t size; +}; + +struct drm_get_cap { + uint64_t capability; + uint64_t value; +}; + +struct drm_event { + uint32_t type; + uint32_t length; +}; + +#define DRM_EVENT_VBLANK 0x01 +#define DRM_EVENT_FLIP_COMPLETE 0x02 + +struct drm_event_vblank { + struct drm_event base; + uint64_t user_data; + uint32_t tv_sec; + uint32_t tv_usec; + uint32_t sequence; + uint32_t reserved; +}; + +#define DRM_CAP_DUMB_BUFFER 0x1 +#define DRM_CAP_VBLANK_HIGH_CRTC 0x2 +#define DRM_CAP_DUMB_PREFERRED_DEPTH 0x3 +#define DRM_CAP_DUMB_PREFER_SHADOW 0x4 + +#include "drm_mode.h" + +/** + * \name Ioctls Definitions + */ +/*@{*/ + +#define DRM_IOCTL_BASE 'd' +#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr) +#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type) +#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE,nr,type) +#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type) + +#define DRM_IOCTL_VERSION DRM_IOWR(0x00, struct drm_version) +#define DRM_IOCTL_GET_UNIQUE DRM_IOWR(0x01, struct drm_unique) +#define DRM_IOCTL_GET_MAGIC DRM_IOR( 0x02, struct drm_auth) +#define DRM_IOCTL_IRQ_BUSID DRM_IOWR(0x03, struct drm_irq_busid) +#define DRM_IOCTL_GET_MAP DRM_IOWR(0x04, struct drm_map) +#define DRM_IOCTL_GET_CLIENT DRM_IOWR(0x05, struct drm_client) +#define DRM_IOCTL_GET_STATS DRM_IOR( 0x06, struct drm_stats) +#define DRM_IOCTL_SET_VERSION DRM_IOWR(0x07, struct drm_set_version) +#define DRM_IOCTL_MODESET_CTL DRM_IOW(0x08, struct drm_modeset_ctl) + +#define DRM_IOCTL_GEM_CLOSE DRM_IOW (0x09, struct drm_gem_close) +#define DRM_IOCTL_GEM_FLINK DRM_IOWR(0x0a, struct drm_gem_flink) +#define DRM_IOCTL_GEM_OPEN DRM_IOWR(0x0b, struct drm_gem_open) + +#define DRM_IOCTL_GET_CAP DRM_IOWR(0x0c, struct drm_get_cap) + +#define DRM_IOCTL_SET_UNIQUE DRM_IOW( 0x10, struct drm_unique) +#define DRM_IOCTL_AUTH_MAGIC DRM_IOW( 0x11, struct drm_auth) +#define DRM_IOCTL_BLOCK DRM_IOWR(0x12, struct drm_block) +#define DRM_IOCTL_UNBLOCK DRM_IOWR(0x13, struct drm_block) +#define DRM_IOCTL_CONTROL DRM_IOW( 0x14, struct drm_control) +#define DRM_IOCTL_ADD_MAP DRM_IOWR(0x15, struct drm_map) +#define DRM_IOCTL_ADD_BUFS DRM_IOWR(0x16, struct drm_buf_desc) +#define DRM_IOCTL_MARK_BUFS DRM_IOW( 0x17, struct drm_buf_desc) +#define DRM_IOCTL_INFO_BUFS DRM_IOWR(0x18, struct drm_buf_info) +#define DRM_IOCTL_MAP_BUFS DRM_IOWR(0x19, struct drm_buf_map) +#define DRM_IOCTL_FREE_BUFS DRM_IOW( 0x1a, struct drm_buf_free) + +#define DRM_IOCTL_RM_MAP DRM_IOW( 0x1b, struct drm_map) + +#define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, struct drm_ctx_priv_map) +#define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, struct drm_ctx_priv_map) + +#define DRM_IOCTL_SET_MASTER DRM_IO(0x1e) +#define DRM_IOCTL_DROP_MASTER DRM_IO(0x1f) + +#define DRM_IOCTL_ADD_CTX DRM_IOWR(0x20, struct drm_ctx) +#define DRM_IOCTL_RM_CTX DRM_IOWR(0x21, struct drm_ctx) +#define DRM_IOCTL_MOD_CTX DRM_IOW( 0x22, struct drm_ctx) +#define DRM_IOCTL_GET_CTX DRM_IOWR(0x23, struct drm_ctx) +#define DRM_IOCTL_SWITCH_CTX DRM_IOW( 0x24, struct drm_ctx) +#define DRM_IOCTL_NEW_CTX DRM_IOW( 0x25, struct drm_ctx) +#define DRM_IOCTL_RES_CTX DRM_IOWR(0x26, struct drm_ctx_res) +#define DRM_IOCTL_ADD_DRAW DRM_IOWR(0x27, struct drm_draw) +#define DRM_IOCTL_RM_DRAW DRM_IOWR(0x28, struct drm_draw) +#define DRM_IOCTL_DMA DRM_IOWR(0x29, struct drm_dma) +#define DRM_IOCTL_LOCK DRM_IOW( 0x2a, struct drm_lock) +#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, struct drm_lock) +#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, struct drm_lock) + +#define DRM_IOCTL_GEM_PRIME_OPEN DRM_IOWR(0x2e, struct drm_gem_open) + +#define DRM_IOCTL_AGP_ACQUIRE DRM_IO( 0x30) +#define DRM_IOCTL_AGP_RELEASE DRM_IO( 0x31) +#define DRM_IOCTL_AGP_ENABLE DRM_IOW( 0x32, struct drm_agp_mode) +#define DRM_IOCTL_AGP_INFO DRM_IOR( 0x33, struct drm_agp_info) +#define DRM_IOCTL_AGP_ALLOC DRM_IOWR(0x34, struct drm_agp_buffer) +#define DRM_IOCTL_AGP_FREE DRM_IOW( 0x35, struct drm_agp_buffer) +#define DRM_IOCTL_AGP_BIND DRM_IOW( 0x36, struct drm_agp_binding) +#define DRM_IOCTL_AGP_UNBIND DRM_IOW( 0x37, struct drm_agp_binding) + +#define DRM_IOCTL_SG_ALLOC DRM_IOWR(0x38, struct drm_scatter_gather) +#define DRM_IOCTL_SG_FREE DRM_IOW( 0x39, struct drm_scatter_gather) + +#define DRM_IOCTL_WAIT_VBLANK DRM_IOWR(0x3a, union drm_wait_vblank) + +#define DRM_IOCTL_UPDATE_DRAW DRM_IOW(0x3f, struct drm_update_draw) + +#define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res) +#define DRM_IOCTL_MODE_GETCRTC DRM_IOWR(0xA1, struct drm_mode_crtc) +#define DRM_IOCTL_MODE_SETCRTC DRM_IOWR(0xA2, struct drm_mode_crtc) +#define DRM_IOCTL_MODE_CURSOR DRM_IOWR(0xA3, struct drm_mode_cursor) +#define DRM_IOCTL_MODE_GETGAMMA DRM_IOWR(0xA4, struct drm_mode_crtc_lut) +#define DRM_IOCTL_MODE_SETGAMMA DRM_IOWR(0xA5, struct drm_mode_crtc_lut) +#define DRM_IOCTL_MODE_GETENCODER DRM_IOWR(0xA6, struct drm_mode_get_encoder) +#define DRM_IOCTL_MODE_GETCONNECTOR DRM_IOWR(0xA7, struct drm_mode_get_connector) +#define DRM_IOCTL_MODE_ATTACHMODE DRM_IOWR(0xA8, struct drm_mode_mode_cmd) +#define DRM_IOCTL_MODE_DETACHMODE DRM_IOWR(0xA9, struct drm_mode_mode_cmd) + +#define DRM_IOCTL_MODE_GETPROPERTY DRM_IOWR(0xAA, struct drm_mode_get_property) +#define DRM_IOCTL_MODE_SETPROPERTY DRM_IOWR(0xAB, struct drm_mode_connector_set_property) +#define DRM_IOCTL_MODE_GETPROPBLOB DRM_IOWR(0xAC, struct drm_mode_get_blob) +#define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xAD, struct drm_mode_fb_cmd) +#define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xAE, struct drm_mode_fb_cmd) +#define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xAF, unsigned int) +#define DRM_IOCTL_MODE_PAGE_FLIP DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip) +#define DRM_IOCTL_MODE_DIRTYFB DRM_IOWR(0xB1, struct drm_mode_fb_dirty_cmd) + +#define DRM_IOCTL_MODE_CREATE_DUMB DRM_IOWR(0xB2, struct drm_mode_create_dumb) +#define DRM_IOCTL_MODE_MAP_DUMB DRM_IOWR(0xB3, struct drm_mode_map_dumb) +#define DRM_IOCTL_MODE_DESTROY_DUMB DRM_IOWR(0xB4, struct drm_mode_destroy_dumb) +#define DRM_IOCTL_MODE_GETPLANERESOURCES DRM_IOWR(0xB5, struct drm_mode_get_plane_res) +#define DRM_IOCTL_MODE_GETPLANE DRM_IOWR(0xB6, struct drm_mode_get_plane) +#define DRM_IOCTL_MODE_SETPLANE DRM_IOWR(0xB7, struct drm_mode_set_plane) +#define DRM_IOCTL_MODE_ADDFB2 DRM_IOWR(0xB8, struct drm_mode_fb_cmd2) + +#define DRM_IOCTL_MM_INIT DRM_IOWR(0xc0, struct drm_mm_init_arg) +#define DRM_IOCTL_MM_TAKEDOWN DRM_IOWR(0xc1, struct drm_mm_type_arg) +#define DRM_IOCTL_MM_LOCK DRM_IOWR(0xc2, struct drm_mm_type_arg) +#define DRM_IOCTL_MM_UNLOCK DRM_IOWR(0xc3, struct drm_mm_type_arg) + +#define DRM_IOCTL_FENCE_CREATE DRM_IOWR(0xc4, struct drm_fence_arg) +#define DRM_IOCTL_FENCE_REFERENCE DRM_IOWR(0xc6, struct drm_fence_arg) +#define DRM_IOCTL_FENCE_UNREFERENCE DRM_IOWR(0xc7, struct drm_fence_arg) +#define DRM_IOCTL_FENCE_SIGNALED DRM_IOWR(0xc8, struct drm_fence_arg) +#define DRM_IOCTL_FENCE_FLUSH DRM_IOWR(0xc9, struct drm_fence_arg) +#define DRM_IOCTL_FENCE_WAIT DRM_IOWR(0xca, struct drm_fence_arg) +#define DRM_IOCTL_FENCE_EMIT DRM_IOWR(0xcb, struct drm_fence_arg) +#define DRM_IOCTL_FENCE_BUFFERS DRM_IOWR(0xcc, struct drm_fence_arg) + +#define DRM_IOCTL_BO_CREATE DRM_IOWR(0xcd, struct drm_bo_create_arg) +#define DRM_IOCTL_BO_MAP DRM_IOWR(0xcf, struct drm_bo_map_wait_idle_arg) +#define DRM_IOCTL_BO_UNMAP DRM_IOWR(0xd0, struct drm_bo_handle_arg) +#define DRM_IOCTL_BO_REFERENCE DRM_IOWR(0xd1, struct drm_bo_reference_info_arg) +#define DRM_IOCTL_BO_UNREFERENCE DRM_IOWR(0xd2, struct drm_bo_handle_arg) +#define DRM_IOCTL_BO_SETSTATUS DRM_IOWR(0xd3, struct drm_bo_map_wait_idle_arg) +#define DRM_IOCTL_BO_INFO DRM_IOWR(0xd4, struct drm_bo_reference_info_arg) +#define DRM_IOCTL_BO_WAIT_IDLE DRM_IOWR(0xd5, struct drm_bo_map_wait_idle_arg) +#define DRM_IOCTL_BO_VERSION DRM_IOR(0xd6, struct drm_bo_version_arg) +#define DRM_IOCTL_MM_INFO DRM_IOWR(0xd7, struct drm_mm_info_arg) + +/*@}*/ + +/** + * Device specific ioctls should only be in their respective headers + * The device specific ioctl range is from 0x40 to 0x99. + * Generic IOCTLS restart at 0xA0. + * + * \sa drmCommandNone(), drmCommandRead(), drmCommandWrite(), and + * drmCommandReadWrite(). + */ +#define DRM_COMMAND_BASE 0x40 +#define DRM_COMMAND_END 0xA0 + +/* typedef area */ +#ifndef __KERNEL__ +typedef struct drm_clip_rect drm_clip_rect_t; +typedef struct drm_tex_region drm_tex_region_t; +typedef struct drm_hw_lock drm_hw_lock_t; +typedef struct drm_version drm_version_t; +typedef struct drm_unique drm_unique_t; +typedef struct drm_list drm_list_t; +typedef struct drm_block drm_block_t; +typedef struct drm_control drm_control_t; +typedef enum drm_map_type drm_map_type_t; +typedef enum drm_map_flags drm_map_flags_t; +typedef struct drm_ctx_priv_map drm_ctx_priv_map_t; +typedef struct drm_map drm_map_t; +typedef struct drm_client drm_client_t; +typedef enum drm_stat_type drm_stat_type_t; +typedef struct drm_stats drm_stats_t; +typedef enum drm_lock_flags drm_lock_flags_t; +typedef struct drm_lock drm_lock_t; +typedef enum drm_dma_flags drm_dma_flags_t; +typedef struct drm_buf_desc drm_buf_desc_t; +typedef struct drm_buf_info drm_buf_info_t; +typedef struct drm_buf_free drm_buf_free_t; +typedef struct drm_buf_pub drm_buf_pub_t; +typedef struct drm_buf_map drm_buf_map_t; +typedef struct drm_dma drm_dma_t; +typedef union drm_wait_vblank drm_wait_vblank_t; +typedef struct drm_agp_mode drm_agp_mode_t; +typedef enum drm_ctx_flags drm_ctx_flags_t; +typedef struct drm_ctx drm_ctx_t; +typedef struct drm_ctx_res drm_ctx_res_t; +typedef struct drm_draw drm_draw_t; +typedef struct drm_update_draw drm_update_draw_t; +typedef struct drm_auth drm_auth_t; +typedef struct drm_irq_busid drm_irq_busid_t; +typedef enum drm_vblank_seq_type drm_vblank_seq_type_t; +typedef struct drm_agp_buffer drm_agp_buffer_t; +typedef struct drm_agp_binding drm_agp_binding_t; +typedef struct drm_agp_info drm_agp_info_t; +typedef struct drm_scatter_gather drm_scatter_gather_t; +typedef struct drm_set_version drm_set_version_t; + +typedef struct drm_fence_arg drm_fence_arg_t; +typedef struct drm_mm_type_arg drm_mm_type_arg_t; +typedef struct drm_mm_init_arg drm_mm_init_arg_t; +typedef enum drm_bo_type drm_bo_type_t; +#endif + +#endif diff --git a/sys/dev/drm2/drmP.h b/sys/dev/drm2/drmP.h new file mode 100644 index 00000000000..16227b59fe5 --- /dev/null +++ b/sys/dev/drm2/drmP.h @@ -0,0 +1,1400 @@ +/* drmP.h -- Private header for Direct Rendering Manager -*- linux-c -*- + * Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com + */ +/*- + * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef _DRM_P_H_ +#define _DRM_P_H_ + +#if defined(_KERNEL) || defined(__KERNEL__) + +struct drm_device; +struct drm_file; + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(__i386__) || defined(__amd64__) +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "opt_drm.h" +#ifdef DRM_DEBUG +#undef DRM_DEBUG +#define DRM_DEBUG_DEFAULT_ON 1 +#endif /* DRM_DEBUG */ + +#define DRM_DEBUGBITS_DEBUG 0x1 +#define DRM_DEBUGBITS_KMS 0x2 +#define DRM_DEBUGBITS_FAILED_IOCTL 0x4 + +#undef DRM_LINUX +#define DRM_LINUX 0 + +/* driver capabilities and requirements mask */ +#define DRIVER_USE_AGP 0x1 +#define DRIVER_REQUIRE_AGP 0x2 +#define DRIVER_USE_MTRR 0x4 +#define DRIVER_PCI_DMA 0x8 +#define DRIVER_SG 0x10 +#define DRIVER_HAVE_DMA 0x20 +#define DRIVER_HAVE_IRQ 0x40 +#define DRIVER_IRQ_SHARED 0x80 +#define DRIVER_IRQ_VBL 0x100 +#define DRIVER_DMA_QUEUE 0x200 +#define DRIVER_FB_DMA 0x400 +#define DRIVER_IRQ_VBL2 0x800 +#define DRIVER_GEM 0x1000 +#define DRIVER_MODESET 0x2000 +#define DRIVER_USE_PLATFORM_DEVICE 0x4000 +#define DRIVER_LOCKLESS_IRQ 0x8000 + + +#define DRM_HASH_SIZE 16 /* Size of key hash table */ +#define DRM_KERNEL_CONTEXT 0 /* Change drm_resctx if changed */ +#define DRM_RESERVED_CONTEXTS 1 /* Change drm_resctx if changed */ + +#define DRM_GEM_MAPPING_MASK (3ULL << 62) +#define DRM_GEM_MAPPING_KEY (2ULL << 62) /* Non-canonical address form */ +#define DRM_GEM_MAX_IDX 0x3fffff +#define DRM_GEM_MAPPING_IDX(o) (((o) >> 40) & DRM_GEM_MAX_IDX) +#define DRM_GEM_MAPPING_OFF(i) (((uint64_t)(i)) << 40) +#define DRM_GEM_MAPPING_MAPOFF(o) \ + ((o) & ~(DRM_GEM_MAPPING_OFF(DRM_GEM_MAX_IDX) | DRM_GEM_MAPPING_KEY)) + +MALLOC_DECLARE(DRM_MEM_DMA); +MALLOC_DECLARE(DRM_MEM_SAREA); +MALLOC_DECLARE(DRM_MEM_DRIVER); +MALLOC_DECLARE(DRM_MEM_MAGIC); +MALLOC_DECLARE(DRM_MEM_IOCTLS); +MALLOC_DECLARE(DRM_MEM_MAPS); +MALLOC_DECLARE(DRM_MEM_BUFS); +MALLOC_DECLARE(DRM_MEM_SEGS); +MALLOC_DECLARE(DRM_MEM_PAGES); +MALLOC_DECLARE(DRM_MEM_FILES); +MALLOC_DECLARE(DRM_MEM_QUEUES); +MALLOC_DECLARE(DRM_MEM_CMDS); +MALLOC_DECLARE(DRM_MEM_MAPPINGS); +MALLOC_DECLARE(DRM_MEM_BUFLISTS); +MALLOC_DECLARE(DRM_MEM_AGPLISTS); +MALLOC_DECLARE(DRM_MEM_CTXBITMAP); +MALLOC_DECLARE(DRM_MEM_SGLISTS); +MALLOC_DECLARE(DRM_MEM_DRAWABLE); +MALLOC_DECLARE(DRM_MEM_MM); +MALLOC_DECLARE(DRM_MEM_HASHTAB); +MALLOC_DECLARE(DRM_MEM_KMS); + +SYSCTL_DECL(_hw_drm); + +#define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8) + + /* Internal types and structures */ +#define DRM_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) +#define DRM_MIN(a,b) ((a)<(b)?(a):(b)) +#define DRM_MAX(a,b) ((a)>(b)?(a):(b)) + +#define DRM_IF_VERSION(maj, min) (maj << 16 | min) + +#define __OS_HAS_AGP 1 + +#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) +#define DRM_DEV_UID 0 +#define DRM_DEV_GID 0 + +#define wait_queue_head_t atomic_t +#define DRM_WAKEUP(w) wakeup((void *)w) +#define DRM_WAKEUP_INT(w) wakeup(w) +#define DRM_INIT_WAITQUEUE(queue) do {(void)(queue);} while (0) + +#define DRM_CURPROC curthread +#define DRM_STRUCTPROC struct thread +#define DRM_SPINTYPE struct mtx +#define DRM_SPININIT(l,name) mtx_init(l, name, NULL, MTX_DEF) +#define DRM_SPINUNINIT(l) mtx_destroy(l) +#define DRM_SPINLOCK(l) mtx_lock(l) +#define DRM_SPINUNLOCK(u) mtx_unlock(u) +#define DRM_SPINLOCK_IRQSAVE(l, irqflags) do { \ + mtx_lock(l); \ + (void)irqflags; \ +} while (0) +#define DRM_SPINUNLOCK_IRQRESTORE(u, irqflags) mtx_unlock(u) +#define DRM_SPINLOCK_ASSERT(l) mtx_assert(l, MA_OWNED) +#define DRM_CURRENTPID curthread->td_proc->p_pid +#define DRM_LOCK(dev) sx_xlock(&(dev)->dev_struct_lock) +#define DRM_UNLOCK(dev) sx_xunlock(&(dev)->dev_struct_lock) +#define DRM_LOCK_SLEEP(dev, chan, flags, msg, timeout) \ + (sx_sleep((chan), &(dev)->dev_struct_lock, (flags), (msg), (timeout))) +#if defined(INVARIANTS) +#define DRM_LOCK_ASSERT(dev) sx_assert(&(dev)->dev_struct_lock, SA_XLOCKED) +#define DRM_UNLOCK_ASSERT(dev) sx_assert(&(dev)->dev_struct_lock, SA_UNLOCKED) +#else +#define DRM_LOCK_ASSERT(d) +#define DRM_UNLOCK_ASSERT(d) +#endif + +#define DRM_SYSCTL_HANDLER_ARGS (SYSCTL_HANDLER_ARGS) + +#define DRM_IRQ_ARGS void *arg +typedef void irqreturn_t; +#define IRQ_HANDLED /* nothing */ +#define IRQ_NONE /* nothing */ + +#define unlikely(x) __builtin_expect(!!(x), 0) +#define container_of(ptr, type, member) ({ \ + __typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +enum { + DRM_IS_NOT_AGP, + DRM_IS_AGP, + DRM_MIGHT_BE_AGP +}; +#define DRM_AGP_MEM struct agp_memory_info + +#define drm_get_device_from_kdev(_kdev) (_kdev->si_drv1) + +#define PAGE_ALIGN(addr) round_page(addr) +/* DRM_SUSER returns true if the user is superuser */ +#define DRM_SUSER(p) (priv_check(p, PRIV_DRIVER) == 0) +#define DRM_AGP_FIND_DEVICE() agp_find_device() +#define DRM_MTRR_WC MDF_WRITECOMBINE +#define jiffies ticks +#define jiffies_to_msecs(x) (((int64_t)(x)) * 1000 / hz) +#define msecs_to_jiffies(x) (((int64_t)(x)) * hz / 1000) +#define time_after(a,b) ((long)(b) - (long)(a) < 0) +#define time_after_eq(a,b) ((long)(b) - (long)(a) <= 0) +#define drm_msleep(x, msg) pause((msg), ((int64_t)(x)) * hz / 1000) + +typedef vm_paddr_t dma_addr_t; +typedef uint64_t u64; +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; +typedef int64_t s64; +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +/* DRM_READMEMORYBARRIER() prevents reordering of reads. + * DRM_WRITEMEMORYBARRIER() prevents reordering of writes. + * DRM_MEMORYBARRIER() prevents reordering of reads and writes. + */ +#define DRM_READMEMORYBARRIER() rmb() +#define DRM_WRITEMEMORYBARRIER() wmb() +#define DRM_MEMORYBARRIER() mb() + +#define DRM_READ8(map, offset) \ + *(volatile u_int8_t *)(((vm_offset_t)(map)->virtual) + \ + (vm_offset_t)(offset)) +#define DRM_READ16(map, offset) \ + le16toh(*(volatile u_int16_t *)(((vm_offset_t)(map)->virtual) + \ + (vm_offset_t)(offset))) +#define DRM_READ32(map, offset) \ + le32toh(*(volatile u_int32_t *)(((vm_offset_t)(map)->virtual) + \ + (vm_offset_t)(offset))) +#define DRM_READ64(map, offset) \ + le64toh(*(volatile u_int64_t *)(((vm_offset_t)(map)->virtual) + \ + (vm_offset_t)(offset))) +#define DRM_WRITE8(map, offset, val) \ + *(volatile u_int8_t *)(((vm_offset_t)(map)->virtual) + \ + (vm_offset_t)(offset)) = val +#define DRM_WRITE16(map, offset, val) \ + *(volatile u_int16_t *)(((vm_offset_t)(map)->virtual) + \ + (vm_offset_t)(offset)) = htole16(val) +#define DRM_WRITE32(map, offset, val) \ + *(volatile u_int32_t *)(((vm_offset_t)(map)->virtual) + \ + (vm_offset_t)(offset)) = htole32(val) +#define DRM_WRITE64(map, offset, val) \ + *(volatile u_int64_t *)(((vm_offset_t)(map)->virtual) + \ + (vm_offset_t)(offset)) = htole64(val) + +#define DRM_VERIFYAREA_READ( uaddr, size ) \ + (!useracc(__DECONST(caddr_t, uaddr), size, VM_PROT_READ)) + +#define DRM_COPY_TO_USER(user, kern, size) \ + copyout(kern, user, size) +#define DRM_COPY_FROM_USER(kern, user, size) \ + copyin(user, kern, size) +#define DRM_COPY_FROM_USER_UNCHECKED(arg1, arg2, arg3) \ + copyin(arg2, arg1, arg3) +#define DRM_COPY_TO_USER_UNCHECKED(arg1, arg2, arg3) \ + copyout(arg2, arg1, arg3) +#define DRM_GET_USER_UNCHECKED(val, uaddr) \ + ((val) = fuword32(uaddr), 0) + +#define cpu_to_le32(x) htole32(x) +#define le32_to_cpu(x) le32toh(x) + +#define DRM_HZ hz +#define DRM_UDELAY(udelay) DELAY(udelay) +#define DRM_TIME_SLICE (hz/20) /* Time slice for GLXContexts */ + +#define DRM_GET_PRIV_SAREA(_dev, _ctx, _map) do { \ + (_map) = (_dev)->context_sareas[_ctx]; \ +} while(0) + +#define LOCK_TEST_WITH_RETURN(dev, file_priv) \ +do { \ + if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) || \ + dev->lock.file_priv != file_priv) { \ + DRM_ERROR("%s called without lock held\n", \ + __FUNCTION__); \ + return EINVAL; \ + } \ +} while (0) + +/* Returns -errno to shared code */ +#define DRM_WAIT_ON( ret, queue, timeout, condition ) \ +for ( ret = 0 ; !ret && !(condition) ; ) { \ + DRM_UNLOCK(dev); \ + mtx_lock(&dev->irq_lock); \ + if (!(condition)) \ + ret = -mtx_sleep(&(queue), &dev->irq_lock, \ + PCATCH, "drmwtq", (timeout)); \ + mtx_unlock(&dev->irq_lock); \ + DRM_LOCK(dev); \ +} + +#define DRM_ERROR(fmt, ...) \ + printf("error: [" DRM_NAME ":pid%d:%s] *ERROR* " fmt, \ + DRM_CURRENTPID, __func__ , ##__VA_ARGS__) + +#define DRM_INFO(fmt, ...) printf("info: [" DRM_NAME "] " fmt , ##__VA_ARGS__) + +#define DRM_DEBUG(fmt, ...) do { \ + if ((drm_debug_flag & DRM_DEBUGBITS_DEBUG) != 0) \ + printf("[" DRM_NAME ":pid%d:%s] " fmt, DRM_CURRENTPID, \ + __func__ , ##__VA_ARGS__); \ +} while (0) + +#define DRM_DEBUG_KMS(fmt, ...) do { \ + if ((drm_debug_flag & DRM_DEBUGBITS_KMS) != 0) \ + printf("[" DRM_NAME ":KMS:pid%d:%s] " fmt, DRM_CURRENTPID,\ + __func__ , ##__VA_ARGS__); \ +} while (0) + +#define DRM_DEBUG_DRIVER(fmt, ...) do { \ + if ((drm_debug_flag & DRM_DEBUGBITS_KMS) != 0) \ + printf("[" DRM_NAME ":KMS:pid%d:%s] " fmt, DRM_CURRENTPID,\ + __func__ , ##__VA_ARGS__); \ +} while (0) + +typedef struct drm_pci_id_list +{ + int vendor; + int device; + long driver_private; + char *name; +} drm_pci_id_list_t; + +struct drm_msi_blacklist_entry +{ + int vendor; + int device; +}; + +#define DRM_AUTH 0x1 +#define DRM_MASTER 0x2 +#define DRM_ROOT_ONLY 0x4 +#define DRM_CONTROL_ALLOW 0x8 +#define DRM_UNLOCKED 0x10 + +typedef struct drm_ioctl_desc { + unsigned long cmd; + int (*func)(struct drm_device *dev, void *data, + struct drm_file *file_priv); + int flags; +} drm_ioctl_desc_t; +/** + * Creates a driver or general drm_ioctl_desc array entry for the given + * ioctl, for use by drm_ioctl(). + */ +#define DRM_IOCTL_DEF(ioctl, func, flags) \ + [DRM_IOCTL_NR(ioctl)] = {ioctl, func, flags} + +typedef struct drm_magic_entry { + drm_magic_t magic; + struct drm_file *priv; + struct drm_magic_entry *next; +} drm_magic_entry_t; + +typedef struct drm_magic_head { + struct drm_magic_entry *head; + struct drm_magic_entry *tail; +} drm_magic_head_t; + +typedef struct drm_buf { + int idx; /* Index into master buflist */ + int total; /* Buffer size */ + int order; /* log-base-2(total) */ + int used; /* Amount of buffer in use (for DMA) */ + unsigned long offset; /* Byte offset (used internally) */ + void *address; /* Address of buffer */ + unsigned long bus_address; /* Bus address of buffer */ + struct drm_buf *next; /* Kernel-only: used for free list */ + __volatile__ int pending; /* On hardware DMA queue */ + struct drm_file *file_priv; /* Unique identifier of holding process */ + int context; /* Kernel queue for this buffer */ + enum { + DRM_LIST_NONE = 0, + DRM_LIST_FREE = 1, + DRM_LIST_WAIT = 2, + DRM_LIST_PEND = 3, + DRM_LIST_PRIO = 4, + DRM_LIST_RECLAIM = 5 + } list; /* Which list we're on */ + + int dev_priv_size; /* Size of buffer private stoarge */ + void *dev_private; /* Per-buffer private storage */ +} drm_buf_t; + +typedef struct drm_freelist { + int initialized; /* Freelist in use */ + atomic_t count; /* Number of free buffers */ + drm_buf_t *next; /* End pointer */ + + int low_mark; /* Low water mark */ + int high_mark; /* High water mark */ +} drm_freelist_t; + +typedef struct drm_dma_handle { + void *vaddr; + bus_addr_t busaddr; + bus_dma_tag_t tag; + bus_dmamap_t map; +} drm_dma_handle_t; + +typedef struct drm_buf_entry { + int buf_size; + int buf_count; + drm_buf_t *buflist; + int seg_count; + drm_dma_handle_t **seglist; + int page_order; + + drm_freelist_t freelist; +} drm_buf_entry_t; + +/* Event queued up for userspace to read */ +struct drm_pending_event { + struct drm_event *event; + struct list_head link; + struct drm_file *file_priv; + pid_t pid; /* pid of requester, no guarantee it's valid by the time + we deliver the event, for tracing only */ + void (*destroy)(struct drm_pending_event *event); +}; + +typedef TAILQ_HEAD(drm_file_list, drm_file) drm_file_list_t; +struct drm_file { + TAILQ_ENTRY(drm_file) link; + struct drm_device *dev; + int authenticated; + int master; + pid_t pid; + uid_t uid; + drm_magic_t magic; + unsigned long ioctl_count; + + void *driver_priv; + struct drm_gem_names object_names; + + int is_master; + struct drm_master *masterp; + + struct list_head fbs; + + struct list_head event_list; + int event_space; + struct selinfo event_poll; +}; + +typedef struct drm_lock_data { + struct drm_hw_lock *hw_lock; /* Hardware lock */ + struct drm_file *file_priv; /* Unique identifier of holding process (NULL is kernel)*/ + int lock_queue; /* Queue of blocked processes */ + unsigned long lock_time; /* Time of last lock in jiffies */ +} drm_lock_data_t; + +/* This structure, in the struct drm_device, is always initialized while the + * device + * is open. dev->dma_lock protects the incrementing of dev->buf_use, which + * when set marks that no further bufs may be allocated until device teardown + * occurs (when the last open of the device has closed). The high/low + * watermarks of bufs are only touched by the X Server, and thus not + * concurrently accessed, so no locking is needed. + */ +typedef struct drm_device_dma { + drm_buf_entry_t bufs[DRM_MAX_ORDER+1]; + int buf_count; + drm_buf_t **buflist; /* Vector of pointers info bufs */ + int seg_count; + int page_count; + unsigned long *pagelist; + unsigned long byte_count; + enum { + _DRM_DMA_USE_AGP = 0x01, + _DRM_DMA_USE_SG = 0x02 + } flags; +} drm_device_dma_t; + +typedef struct drm_agp_mem { + void *handle; + unsigned long bound; /* address */ + int pages; + struct drm_agp_mem *prev; + struct drm_agp_mem *next; +} drm_agp_mem_t; + +typedef struct drm_agp_head { + device_t agpdev; + struct agp_info info; + const char *chipset; + drm_agp_mem_t *memory; + unsigned long mode; + int enabled; + int acquired; + unsigned long base; + int mtrr; + int cant_use_aperture; + unsigned long page_mask; +} drm_agp_head_t; + +typedef struct drm_sg_mem { + vm_offset_t vaddr; + vm_paddr_t *busaddr; + vm_pindex_t pages; +} drm_sg_mem_t; + +#define DRM_MAP_HANDLE_BITS (sizeof(void *) == 4 ? 4 : 24) +#define DRM_MAP_HANDLE_SHIFT (sizeof(void *) * 8 - DRM_MAP_HANDLE_BITS) +typedef TAILQ_HEAD(drm_map_list, drm_local_map) drm_map_list_t; + +typedef struct drm_local_map { + unsigned long offset; /* Physical address (0 for SAREA) */ + unsigned long size; /* Physical size (bytes) */ + enum drm_map_type type; /* Type of memory mapped */ + enum drm_map_flags flags; /* Flags */ + void *handle; /* User-space: "Handle" to pass to mmap */ + /* Kernel-space: kernel-virtual address */ + int mtrr; /* Boolean: MTRR used */ + /* Private data */ + int rid; /* PCI resource ID for bus_space */ + void *virtual; /* Kernel-space: kernel-virtual address */ + struct resource *bsr; + bus_space_tag_t bst; + bus_space_handle_t bsh; + drm_dma_handle_t *dmah; + TAILQ_ENTRY(drm_local_map) link; +} drm_local_map_t; + +struct drm_vblank_info { + wait_queue_head_t queue; /* vblank wait queue */ + atomic_t count; /* number of VBLANK interrupts */ + /* (driver must alloc the right number of counters) */ + atomic_t refcount; /* number of users of vblank interrupts */ + u32 last; /* protected by dev->vbl_lock, used */ + /* for wraparound handling */ + int enabled; /* so we don't call enable more than */ + /* once per disable */ + int inmodeset; /* Display driver is setting mode */ +}; + +/* Size of ringbuffer for vblank timestamps. Just double-buffer + * in initial implementation. + */ +#define DRM_VBLANKTIME_RBSIZE 2 + +/* Flags and return codes for get_vblank_timestamp() driver function. */ +#define DRM_CALLED_FROM_VBLIRQ 1 +#define DRM_VBLANKTIME_SCANOUTPOS_METHOD (1 << 0) +#define DRM_VBLANKTIME_INVBL (1 << 1) + +/* get_scanout_position() return flags */ +#define DRM_SCANOUTPOS_VALID (1 << 0) +#define DRM_SCANOUTPOS_INVBL (1 << 1) +#define DRM_SCANOUTPOS_ACCURATE (1 << 2) + +/* location of GART table */ +#define DRM_ATI_GART_MAIN 1 +#define DRM_ATI_GART_FB 2 + +#define DRM_ATI_GART_PCI 1 +#define DRM_ATI_GART_PCIE 2 +#define DRM_ATI_GART_IGP 3 + +struct drm_ati_pcigart_info { + int gart_table_location; + int gart_reg_if; + void *addr; + dma_addr_t bus_addr; + dma_addr_t table_mask; + dma_addr_t member_mask; + struct drm_dma_handle *table_handle; + drm_local_map_t mapping; + int table_size; + struct drm_dma_handle *dmah; /* handle for ATI PCIGART table */ +}; + +typedef vm_paddr_t resource_size_t; + +/** + * GEM specific mm private for tracking GEM objects + */ +struct drm_gem_mm { + struct drm_open_hash offset_hash; /**< User token hash table for maps */ + struct unrhdr *idxunr; +}; + +struct drm_gem_object { + /** Reference count of this object */ + u_int refcount; + + /** Handle count of this object. Each handle also holds a reference */ + u_int handle_count; /* number of handles on this object */ + + /** Related drm device */ + struct drm_device *dev; + + /** File representing the shmem storage: filp in Linux parlance */ + vm_object_t vm_obj; + + bool on_map; + struct drm_hash_item map_list; + + /** + * Size of the object, in bytes. Immutable over the object's + * lifetime. + */ + size_t size; + + /** + * Global name for this object, starts at 1. 0 means unnamed. + * Access is covered by the object_name_lock in the related drm_device + */ + int name; + + /** + * Memory domains. These monitor which caches contain read/write data + * related to the object. When transitioning from one set of domains + * to another, the driver is called to ensure that caches are suitably + * flushed and invalidated + */ + uint32_t read_domains; + uint32_t write_domain; + + /** + * While validating an exec operation, the + * new read/write domain values are computed here. + * They will be transferred to the above values + * at the point that any cache flushing occurs + */ + uint32_t pending_read_domains; + uint32_t pending_write_domain; + + void *driver_private; +}; + +#include "drm_crtc.h" + +#ifndef DMA_BIT_MASK +#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : (1ULL<<(n)) - 1) +#endif + +#define upper_32_bits(n) ((u32)(((n) >> 16) >> 16)) + +struct drm_driver_info { + int (*load)(struct drm_device *, unsigned long flags); + int (*firstopen)(struct drm_device *); + int (*open)(struct drm_device *, struct drm_file *); + void (*preclose)(struct drm_device *, struct drm_file *file_priv); + void (*postclose)(struct drm_device *, struct drm_file *); + void (*lastclose)(struct drm_device *); + int (*unload)(struct drm_device *); + void (*reclaim_buffers_locked)(struct drm_device *, + struct drm_file *file_priv); + int (*dma_ioctl)(struct drm_device *dev, void *data, + struct drm_file *file_priv); + void (*dma_ready)(struct drm_device *); + int (*dma_quiescent)(struct drm_device *); + int (*dma_flush_block_and_flush)(struct drm_device *, int context, + enum drm_lock_flags flags); + int (*dma_flush_unblock)(struct drm_device *, int context, + enum drm_lock_flags flags); + int (*context_ctor)(struct drm_device *dev, int context); + int (*context_dtor)(struct drm_device *dev, int context); + int (*kernel_context_switch)(struct drm_device *dev, int old, + int new); + int (*kernel_context_switch_unlock)(struct drm_device *dev); + void (*irq_preinstall)(struct drm_device *dev); + int (*irq_postinstall)(struct drm_device *dev); + void (*irq_uninstall)(struct drm_device *dev); + void (*irq_handler)(DRM_IRQ_ARGS); + + u32 (*get_vblank_counter)(struct drm_device *dev, int crtc); + int (*enable_vblank)(struct drm_device *dev, int crtc); + void (*disable_vblank)(struct drm_device *dev, int crtc); + int (*get_scanout_position)(struct drm_device *dev, int crtc, + int *vpos, int *hpos); + + int (*get_vblank_timestamp)(struct drm_device *dev, int crtc, + int *max_error, struct timeval *vblank_time, + unsigned flags); + + int (*gem_init_object)(struct drm_gem_object *obj); + void (*gem_free_object)(struct drm_gem_object *obj); + + struct cdev_pager_ops *gem_pager_ops; + + int (*dumb_create)(struct drm_file *file_priv, + struct drm_device *dev, struct drm_mode_create_dumb *args); + int (*dumb_map_offset)(struct drm_file *file_priv, + struct drm_device *dev, uint32_t handle, uint64_t *offset); + int (*dumb_destroy)(struct drm_file *file_priv, + struct drm_device *dev, uint32_t handle); + + int (*sysctl_init)(struct drm_device *dev, + struct sysctl_ctx_list *ctx, struct sysctl_oid *top); + void (*sysctl_cleanup)(struct drm_device *dev); + + drm_pci_id_list_t *id_entry; /* PCI ID, name, and chipset private */ + + /** + * Called by \c drm_device_is_agp. Typically used to determine if a + * card is really attached to AGP or not. + * + * \param dev DRM device handle + * + * \returns + * One of three values is returned depending on whether or not the + * card is absolutely \b not AGP (return of 0), absolutely \b is AGP + * (return of 1), or may or may not be AGP (return of 2). + */ + int (*device_is_agp) (struct drm_device * dev); + + drm_ioctl_desc_t *ioctls; + int max_ioctl; + + int buf_priv_size; + + int major; + int minor; + int patchlevel; + const char *name; /* Simple driver name */ + const char *desc; /* Longer driver name */ + const char *date; /* Date of last major changes. */ + + u32 driver_features; +}; + +/** + * DRM minor structure. This structure represents a drm minor number. + */ +struct drm_minor { + int index; /**< Minor device number */ + int type; /**< Control or render */ + device_t kdev; /**< OS device */ + struct drm_device *dev; + + struct drm_master *master; /* currently active master for this node */ + struct list_head master_list; + struct drm_mode_group mode_group; +}; + +/* mode specified on the command line */ +struct drm_cmdline_mode { + bool specified; + bool refresh_specified; + bool bpp_specified; + int xres, yres; + int bpp; + int refresh; + bool rb; + bool interlace; + bool cvt; + bool margins; + enum drm_connector_force force; +}; + +struct drm_pending_vblank_event { + struct drm_pending_event base; + int pipe; + struct drm_event_vblank event; +}; + +/* Length for the array of resource pointers for drm_get_resource_*. */ +#define DRM_MAX_PCI_RESOURCE 6 + +/** + * DRM device functions structure + */ +struct drm_device { + struct drm_driver_info *driver; + drm_pci_id_list_t *id_entry; /* PCI ID, name, and chipset private */ + + u_int16_t pci_device; /* PCI device id */ + u_int16_t pci_vendor; /* PCI vendor id */ + + char *unique; /* Unique identifier: e.g., busid */ + int unique_len; /* Length of unique field */ + device_t device; /* Device instance from newbus */ + struct cdev *devnode; /* Device number for mknod */ + int if_version; /* Highest interface version set */ + + int flags; /* Flags to open(2) */ + + /* Locks */ + struct mtx dma_lock; /* protects dev->dma */ + struct mtx irq_lock; /* protects irq condition checks */ + struct mtx dev_lock; /* protects everything else */ + struct sx dev_struct_lock; + DRM_SPINTYPE drw_lock; + + /* Usage Counters */ + int open_count; /* Outstanding files open */ + int buf_use; /* Buffers in use -- cannot alloc */ + + /* Performance counters */ + unsigned long counters; + enum drm_stat_type types[15]; + atomic_t counts[15]; + + /* Authentication */ + drm_file_list_t files; + drm_magic_head_t magiclist[DRM_HASH_SIZE]; + + /* Linked list of mappable regions. Protected by dev_lock */ + drm_map_list_t maplist; + struct unrhdr *map_unrhdr; + + drm_local_map_t **context_sareas; + int max_context; + + drm_lock_data_t lock; /* Information on hardware lock */ + + /* DMA queues (contexts) */ + drm_device_dma_t *dma; /* Optional pointer for DMA support */ + + /* Context support */ + int irq; /* Interrupt used by board */ + int irq_enabled; /* True if the irq handler is enabled */ + int msi_enabled; /* MSI enabled */ + int irqrid; /* Interrupt used by board */ + struct resource *irqr; /* Resource for interrupt used by board */ + void *irqh; /* Handle from bus_setup_intr */ + + /* Storage of resource pointers for drm_get_resource_* */ + struct resource *pcir[DRM_MAX_PCI_RESOURCE]; + int pcirid[DRM_MAX_PCI_RESOURCE]; + + int pci_domain; + int pci_bus; + int pci_slot; + int pci_func; + + atomic_t context_flag; /* Context swapping flag */ + int last_context; /* Last current context */ + + int num_crtcs; + + struct sigio *buf_sigio; /* Processes waiting for SIGIO */ + + /* Sysctl support */ + struct drm_sysctl_info *sysctl; + int sysctl_node_idx; + + drm_agp_head_t *agp; + drm_sg_mem_t *sg; /* Scatter gather memory */ + atomic_t *ctx_bitmap; + void *dev_private; + unsigned int agp_buffer_token; + drm_local_map_t *agp_buffer_map; + + struct drm_minor *control; /**< Control node for card */ + struct drm_minor *primary; /**< render type primary screen head */ + + struct unrhdr *drw_unrhdr; + /* RB tree of drawable infos */ + RB_HEAD(drawable_tree, bsd_drm_drawable_info) drw_head; + + int vblank_disable_allowed; + + atomic_t *_vblank_count; /**< number of VBLANK interrupts (driver must alloc the right number of counters) */ + struct timeval *_vblank_time; /**< timestamp of current vblank_count (drivers must alloc right number of fields) */ + struct mtx vblank_time_lock; /**< Protects vblank count and time updates during vblank enable/disable */ + struct mtx vbl_lock; + atomic_t *vblank_refcount; /* number of users of vblank interruptsper crtc */ + u32 *last_vblank; /* protected by dev->vbl_lock, used */ + /* for wraparound handling */ + int *vblank_enabled; /* so we don't call enable more than + once per disable */ + int *vblank_inmodeset; /* Display driver is setting mode */ + u32 *last_vblank_wait; /* Last vblank seqno waited per CRTC */ + struct callout vblank_disable_callout; + + u32 max_vblank_count; /**< size of vblank counter register */ + + struct list_head vblank_event_list; + struct mtx event_lock; + + struct drm_mode_config mode_config; /**< Current mode config */ + + /* GEM part */ + struct sx object_name_lock; + struct drm_gem_names object_names; + void *mm_private; + + void *sysctl_private; + char busid_str[128]; + int modesetting; +}; + +static __inline__ int drm_core_check_feature(struct drm_device *dev, + int feature) +{ + return ((dev->driver->driver_features & feature) ? 1 : 0); +} + +#if __OS_HAS_AGP +static inline int drm_core_has_AGP(struct drm_device *dev) +{ + return drm_core_check_feature(dev, DRIVER_USE_AGP); +} +#else +#define drm_core_has_AGP(dev) (0) +#endif + +enum dmi_field { + DMI_NONE, + DMI_BIOS_VENDOR, + DMI_BIOS_VERSION, + DMI_BIOS_DATE, + DMI_SYS_VENDOR, + DMI_PRODUCT_NAME, + DMI_PRODUCT_VERSION, + DMI_PRODUCT_SERIAL, + DMI_PRODUCT_UUID, + DMI_BOARD_VENDOR, + DMI_BOARD_NAME, + DMI_BOARD_VERSION, + DMI_BOARD_SERIAL, + DMI_BOARD_ASSET_TAG, + DMI_CHASSIS_VENDOR, + DMI_CHASSIS_TYPE, + DMI_CHASSIS_VERSION, + DMI_CHASSIS_SERIAL, + DMI_CHASSIS_ASSET_TAG, + DMI_STRING_MAX, +}; + +struct dmi_strmatch { + unsigned char slot; + char substr[79]; +}; + +struct dmi_system_id { + int (*callback)(const struct dmi_system_id *); + const char *ident; + struct dmi_strmatch matches[4]; +}; +#define DMI_MATCH(a, b) {(a), (b)} +bool dmi_check_system(const struct dmi_system_id *); + +extern int drm_debug_flag; +extern int drm_notyet_flag; +extern unsigned int drm_vblank_offdelay; +extern unsigned int drm_timestamp_precision; + +/* Device setup support (drm_drv.c) */ +int drm_probe(device_t kdev, drm_pci_id_list_t *idlist); +int drm_attach(device_t kdev, drm_pci_id_list_t *idlist); +int drm_create_cdevs(device_t kdev); +void drm_close(void *data); +int drm_detach(device_t kdev); +d_ioctl_t drm_ioctl; +d_open_t drm_open; +d_read_t drm_read; +d_poll_t drm_poll; +d_mmap_t drm_mmap; +extern drm_local_map_t *drm_getsarea(struct drm_device *dev); + +void drm_event_wakeup(struct drm_pending_event *e); + +int drm_add_busid_modesetting(struct drm_device *dev, + struct sysctl_ctx_list *ctx, struct sysctl_oid *top); + +/* File operations helpers (drm_fops.c) */ +extern int drm_open_helper(struct cdev *kdev, int flags, int fmt, + DRM_STRUCTPROC *p, + struct drm_device *dev); + +/* Memory management support (drm_memory.c) */ +void drm_mem_init(void); +void drm_mem_uninit(void); +void *drm_ioremap_wc(struct drm_device *dev, drm_local_map_t *map); +void *drm_ioremap(struct drm_device *dev, drm_local_map_t *map); +void drm_ioremapfree(drm_local_map_t *map); +int drm_mtrr_add(unsigned long offset, size_t size, int flags); +int drm_mtrr_del(int handle, unsigned long offset, size_t size, int flags); + +int drm_context_switch(struct drm_device *dev, int old, int new); +int drm_context_switch_complete(struct drm_device *dev, int new); + +int drm_ctxbitmap_init(struct drm_device *dev); +void drm_ctxbitmap_cleanup(struct drm_device *dev); +void drm_ctxbitmap_free(struct drm_device *dev, int ctx_handle); +int drm_ctxbitmap_next(struct drm_device *dev); + +/* Locking IOCTL support (drm_lock.c) */ +int drm_lock_take(struct drm_lock_data *lock_data, + unsigned int context); +int drm_lock_transfer(struct drm_lock_data *lock_data, + unsigned int context); +int drm_lock_free(struct drm_lock_data *lock_data, + unsigned int context); + +/* Buffer management support (drm_bufs.c) */ +unsigned long drm_get_resource_start(struct drm_device *dev, + unsigned int resource); +unsigned long drm_get_resource_len(struct drm_device *dev, + unsigned int resource); +void drm_rmmap(struct drm_device *dev, drm_local_map_t *map); +int drm_order(unsigned long size); +int drm_addmap(struct drm_device *dev, unsigned long offset, + unsigned long size, + enum drm_map_type type, enum drm_map_flags flags, + drm_local_map_t **map_ptr); +int drm_addbufs_pci(struct drm_device *dev, struct drm_buf_desc *request); +int drm_addbufs_sg(struct drm_device *dev, struct drm_buf_desc *request); +int drm_addbufs_agp(struct drm_device *dev, struct drm_buf_desc *request); + +/* DMA support (drm_dma.c) */ +int drm_dma_setup(struct drm_device *dev); +void drm_dma_takedown(struct drm_device *dev); +void drm_free_buffer(struct drm_device *dev, drm_buf_t *buf); +void drm_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv); +#define drm_core_reclaim_buffers drm_reclaim_buffers + +/* IRQ support (drm_irq.c) */ +int drm_irq_install(struct drm_device *dev); +int drm_irq_uninstall(struct drm_device *dev); +irqreturn_t drm_irq_handler(DRM_IRQ_ARGS); +void drm_driver_irq_preinstall(struct drm_device *dev); +void drm_driver_irq_postinstall(struct drm_device *dev); +void drm_driver_irq_uninstall(struct drm_device *dev); + +void drm_vblank_pre_modeset(struct drm_device *dev, int crtc); +void drm_vblank_post_modeset(struct drm_device *dev, int crtc); +int drm_modeset_ctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +extern int drm_vblank_init(struct drm_device *dev, int num_crtcs); +extern int drm_wait_vblank(struct drm_device *dev, void *data, + struct drm_file *filp); +extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq); +extern u32 drm_vblank_count(struct drm_device *dev, int crtc); +extern u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, + struct timeval *vblanktime); +extern bool drm_handle_vblank(struct drm_device *dev, int crtc); +void drm_handle_vblank_events(struct drm_device *dev, int crtc); +extern int drm_vblank_get(struct drm_device *dev, int crtc); +extern void drm_vblank_put(struct drm_device *dev, int crtc); +extern void drm_vblank_off(struct drm_device *dev, int crtc); +extern void drm_vblank_cleanup(struct drm_device *dev); +extern u32 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, + struct timeval *tvblank, unsigned flags); +extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, + int crtc, int *max_error, + struct timeval *vblank_time, + unsigned flags, + struct drm_crtc *refcrtc); +extern void drm_calc_timestamping_constants(struct drm_crtc *crtc); + +struct timeval ns_to_timeval(const int64_t nsec); +int64_t timeval_to_ns(const struct timeval *tv); + +/* AGP/PCI Express/GART support (drm_agpsupport.c) */ +int drm_device_is_agp(struct drm_device *dev); +int drm_device_is_pcie(struct drm_device *dev); +drm_agp_head_t *drm_agp_init(void); +int drm_agp_acquire(struct drm_device *dev); +int drm_agp_release(struct drm_device *dev); +int drm_agp_info(struct drm_device * dev, struct drm_agp_info *info); +int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode); +void *drm_agp_allocate_memory(size_t pages, u32 type); +int drm_agp_free_memory(void *handle); +int drm_agp_bind_memory(void *handle, off_t start); +int drm_agp_unbind_memory(void *handle); +int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request); +int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request); +int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request); +int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request); + +/* Scatter Gather Support (drm_scatter.c) */ +void drm_sg_cleanup(drm_sg_mem_t *entry); +int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request); + +/* sysctl support (drm_sysctl.h) */ +extern int drm_sysctl_init(struct drm_device *dev); +extern int drm_sysctl_cleanup(struct drm_device *dev); + +/* ATI PCIGART support (ati_pcigart.c) */ +int drm_ati_pcigart_init(struct drm_device *dev, + struct drm_ati_pcigart_info *gart_info); +int drm_ati_pcigart_cleanup(struct drm_device *dev, + struct drm_ati_pcigart_info *gart_info); + +/* Cache management (drm_memory.c) */ +void drm_clflush_pages(vm_page_t *pages, unsigned long num_pages); + +/* Locking IOCTL support (drm_drv.c) */ +int drm_lock(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_unlock(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_version(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_setversion(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +/* Misc. IOCTL support (drm_ioctl.c) */ +int drm_irq_by_busid(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_getunique(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_setunique(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_getmap(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_getclient(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_getstats(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_getcap(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_noop(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +/* Context IOCTL support (drm_context.c) */ +int drm_resctx(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_addctx(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_modctx(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_getctx(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_switchctx(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_newctx(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_rmctx(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_setsareactx(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_getsareactx(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +/* Drawable IOCTL support (drm_drawable.c) */ +int drm_adddraw(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_rmdraw(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_update_draw(struct drm_device *dev, void *data, + struct drm_file *file_priv); +struct drm_drawable_info *drm_get_drawable_info(struct drm_device *dev, + int handle); + +/* Drawable support (drm_drawable.c) */ +void drm_drawable_free_all(struct drm_device *dev); + +/* Authentication IOCTL support (drm_auth.c) */ +int drm_getmagic(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_authmagic(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +/* Buffer management support (drm_bufs.c) */ +int drm_addmap_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_rmmap_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_addbufs(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_infobufs(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_markbufs(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_freebufs(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_mapbufs(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +/* DMA support (drm_dma.c) */ +int drm_dma(struct drm_device *dev, void *data, struct drm_file *file_priv); + +/* IRQ support (drm_irq.c) */ +int drm_control(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +/* AGP/GART support (drm_agpsupport.c) */ +int drm_agp_acquire_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_agp_release_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_agp_enable_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_agp_info_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_agp_alloc_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_agp_free_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_agp_unbind_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_agp_bind_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); + + /* Stub support (drm_stub.h) */ +extern int drm_setmaster_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +extern int drm_dropmaster_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +/* Scatter Gather Support (drm_scatter.c) */ +int drm_sg_alloc_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_sg_free(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +/* consistent PCI memory functions (drm_pci.c) */ +drm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size, + size_t align, dma_addr_t maxaddr); +void drm_pci_free(struct drm_device *dev, drm_dma_handle_t *dmah); + +/* Graphics Execution Manager library functions (drm_gem.c) */ +int drm_gem_init(struct drm_device *dev); +void drm_gem_destroy(struct drm_device *dev); + +int drm_gem_close_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_gem_flink_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_gem_open_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int drm_gem_handle_create(struct drm_file *file_priv, + struct drm_gem_object *obj, + u32 *handlep); +int drm_gem_handle_delete(struct drm_file *file_priv, uint32_t handle); +void drm_gem_object_handle_reference(struct drm_gem_object *obj); +void drm_gem_object_handle_unreference(struct drm_gem_object *obj); +void drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj); +void drm_gem_object_handle_free(struct drm_gem_object *obj); +void drm_gem_object_reference(struct drm_gem_object *obj); +void drm_gem_object_unreference(struct drm_gem_object *obj); +void drm_gem_object_unreference_unlocked(struct drm_gem_object *obj); +void drm_gem_object_release(struct drm_gem_object *obj); +void drm_gem_object_free(struct drm_gem_object *obj); +int drm_gem_object_init(struct drm_device *dev, struct drm_gem_object *obj, + size_t size); +int drm_gem_private_object_init(struct drm_device *dev, + struct drm_gem_object *obj, size_t size); +struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev, + size_t size); +struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev, + struct drm_file *file_priv, uint32_t handle); + +void drm_gem_open(struct drm_device *dev, struct drm_file *file_priv); +void drm_gem_release(struct drm_device *dev, struct drm_file *file_priv); + +int drm_gem_create_mmap_offset(struct drm_gem_object *obj); +void drm_gem_free_mmap_offset(struct drm_gem_object *obj); +int drm_gem_mmap_single(struct cdev *kdev, vm_ooffset_t *offset, vm_size_t size, + struct vm_object **obj_res, int nprot); +void drm_gem_pager_dtr(void *obj); + +void drm_device_lock_mtx(struct drm_device *dev); +void drm_device_unlock_mtx(struct drm_device *dev); +int drm_device_sleep_mtx(struct drm_device *dev, void *chan, int flags, + const char *msg, int timeout); +void drm_device_assert_mtx_locked(struct drm_device *dev); +void drm_device_assert_mtx_unlocked(struct drm_device *dev); + +void drm_device_lock_struct(struct drm_device *dev); +void drm_device_unlock_struct(struct drm_device *dev); +int drm_device_sleep_struct(struct drm_device *dev, void *chan, int flags, + const char *msg, int timeout); +void drm_device_assert_struct_locked(struct drm_device *dev); +void drm_device_assert_struct_unlocked(struct drm_device *dev); + +void drm_compat_locking_init(struct drm_device *dev); +void drm_sleep_locking_init(struct drm_device *dev); + +/* drm_modes.c */ +bool drm_mode_parse_command_line_for_connector(const char *mode_option, + struct drm_connector *connector, struct drm_cmdline_mode *mode); +struct drm_display_mode *drm_mode_create_from_cmdline_mode( + struct drm_device *dev, struct drm_cmdline_mode *cmd); + +/* drm_edid.c */ +u8 *drm_find_cea_extension(struct edid *edid); + +/* Inline replacements for drm_alloc and friends */ +static __inline__ void * +drm_alloc(size_t size, struct malloc_type *area) +{ + return malloc(size, area, M_NOWAIT); +} + +static __inline__ void * +drm_calloc(size_t nmemb, size_t size, struct malloc_type *area) +{ + return malloc(size * nmemb, area, M_NOWAIT | M_ZERO); +} + +static __inline__ void * +drm_realloc(void *oldpt, size_t oldsize, size_t size, + struct malloc_type *area) +{ + return reallocf(oldpt, size, area, M_NOWAIT); +} + +static __inline__ void +drm_free(void *pt, size_t size, struct malloc_type *area) +{ + free(pt, area); +} + +/* Inline replacements for DRM_IOREMAP macros */ +static __inline__ void +drm_core_ioremap_wc(struct drm_local_map *map, struct drm_device *dev) +{ + map->virtual = drm_ioremap_wc(dev, map); +} +static __inline__ void +drm_core_ioremap(struct drm_local_map *map, struct drm_device *dev) +{ + map->virtual = drm_ioremap(dev, map); +} +static __inline__ void +drm_core_ioremapfree(struct drm_local_map *map, struct drm_device *dev) +{ + if ( map->virtual && map->size ) + drm_ioremapfree(map); +} + +static __inline__ struct drm_local_map * +drm_core_findmap(struct drm_device *dev, unsigned long offset) +{ + drm_local_map_t *map; + + DRM_LOCK_ASSERT(dev); + TAILQ_FOREACH(map, &dev->maplist, link) { + if (offset == (unsigned long)map->handle) + return map; + } + return NULL; +} + +static __inline__ void drm_core_dropmap(struct drm_map *map) +{ +} + +#define KIB_NOTYET() \ +do { \ + if (drm_debug_flag && drm_notyet_flag) \ + printf("NOTYET: %s at %s:%d\n", __func__, __FILE__, __LINE__); \ +} while (0) + +#define KTR_DRM KTR_DEV +#define KTR_DRM_REG KTR_SPARE3 + +#endif /* __KERNEL__ */ +#endif /* _DRM_P_H_ */ diff --git a/sys/dev/drm2/drm_agpsupport.c b/sys/dev/drm2/drm_agpsupport.c new file mode 100644 index 00000000000..eafe11759df --- /dev/null +++ b/sys/dev/drm2/drm_agpsupport.c @@ -0,0 +1,434 @@ +/*- + * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Author: + * Rickard E. (Rik) Faith + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_agpsupport.c + * Support code for tying the kernel AGP support to DRM drivers and + * the DRM's AGP ioctls. + */ + +#include + +#include +#include + +/* Returns 1 if AGP or 0 if not. */ +static int +drm_device_find_capability(struct drm_device *dev, int cap) +{ + + return (pci_find_cap(dev->device, cap, NULL) == 0); +} + +int drm_device_is_agp(struct drm_device *dev) +{ + if (dev->driver->device_is_agp != NULL) { + int ret; + + /* device_is_agp returns a tristate, 0 = not AGP, 1 = definitely + * AGP, 2 = fall back to PCI capability + */ + ret = (*dev->driver->device_is_agp)(dev); + if (ret != DRM_MIGHT_BE_AGP) + return ret; + } + + return (drm_device_find_capability(dev, PCIY_AGP)); +} + +int drm_device_is_pcie(struct drm_device *dev) +{ + return (drm_device_find_capability(dev, PCIY_EXPRESS)); +} + +int drm_agp_info(struct drm_device * dev, struct drm_agp_info *info) +{ + struct agp_info *kern; + + if (!dev->agp || !dev->agp->acquired) + return EINVAL; + + kern = &dev->agp->info; + agp_get_info(dev->agp->agpdev, kern); + info->agp_version_major = 1; + info->agp_version_minor = 0; + info->mode = kern->ai_mode; + info->aperture_base = kern->ai_aperture_base; + info->aperture_size = kern->ai_aperture_size; + info->memory_allowed = kern->ai_memory_allowed; + info->memory_used = kern->ai_memory_used; + info->id_vendor = kern->ai_devid & 0xffff; + info->id_device = kern->ai_devid >> 16; + + return 0; +} + +int drm_agp_info_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + int err; + struct drm_agp_info info; + + err = drm_agp_info(dev, &info); + if (err != 0) + return err; + + *(struct drm_agp_info *) data = info; + return 0; +} + +int drm_agp_acquire_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + + return drm_agp_acquire(dev); +} + +int drm_agp_acquire(struct drm_device *dev) +{ + int retcode; + + if (!dev->agp || dev->agp->acquired) + return EINVAL; + + retcode = agp_acquire(dev->agp->agpdev); + if (retcode) + return retcode; + + dev->agp->acquired = 1; + return 0; +} + +int drm_agp_release_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + + return drm_agp_release(dev); +} + +int drm_agp_release(struct drm_device * dev) +{ + if (!dev->agp || !dev->agp->acquired) + return EINVAL; + agp_release(dev->agp->agpdev); + dev->agp->acquired = 0; + return 0; +} + +int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode) +{ + + if (!dev->agp || !dev->agp->acquired) + return EINVAL; + + dev->agp->mode = mode.mode; + agp_enable(dev->agp->agpdev, mode.mode); + dev->agp->enabled = 1; + return 0; +} + +int drm_agp_enable_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_agp_mode mode; + + mode = *(struct drm_agp_mode *) data; + + return drm_agp_enable(dev, mode); +} + +int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request) +{ + drm_agp_mem_t *entry; + void *handle; + unsigned long pages; + u_int32_t type; + struct agp_memory_info info; + + if (!dev->agp || !dev->agp->acquired) + return EINVAL; + + entry = malloc(sizeof(*entry), DRM_MEM_AGPLISTS, M_NOWAIT | M_ZERO); + if (entry == NULL) + return ENOMEM; + + pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE; + type = (u_int32_t) request->type; + + DRM_UNLOCK(dev); + handle = drm_agp_allocate_memory(pages, type); + DRM_LOCK(dev); + if (handle == NULL) { + free(entry, DRM_MEM_AGPLISTS); + return ENOMEM; + } + + entry->handle = handle; + entry->bound = 0; + entry->pages = pages; + entry->prev = NULL; + entry->next = dev->agp->memory; + if (dev->agp->memory) + dev->agp->memory->prev = entry; + dev->agp->memory = entry; + + agp_memory_info(dev->agp->agpdev, entry->handle, &info); + + request->handle = (unsigned long) entry->handle; + request->physical = info.ami_physical; + + return 0; +} + +int drm_agp_alloc_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_agp_buffer request; + int retcode; + + request = *(struct drm_agp_buffer *) data; + + DRM_LOCK(dev); + retcode = drm_agp_alloc(dev, &request); + DRM_UNLOCK(dev); + + *(struct drm_agp_buffer *) data = request; + + return retcode; +} + +static drm_agp_mem_t * drm_agp_lookup_entry(struct drm_device *dev, + void *handle) +{ + drm_agp_mem_t *entry; + + for (entry = dev->agp->memory; entry; entry = entry->next) { + if (entry->handle == handle) return entry; + } + return NULL; +} + +int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request) +{ + drm_agp_mem_t *entry; + int retcode; + + if (!dev->agp || !dev->agp->acquired) + return EINVAL; + + entry = drm_agp_lookup_entry(dev, (void *)request->handle); + if (entry == NULL || !entry->bound) + return EINVAL; + + DRM_UNLOCK(dev); + retcode = drm_agp_unbind_memory(entry->handle); + DRM_LOCK(dev); + + if (retcode == 0) + entry->bound = 0; + + return retcode; +} + +int drm_agp_unbind_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_agp_binding request; + int retcode; + + request = *(struct drm_agp_binding *) data; + + DRM_LOCK(dev); + retcode = drm_agp_unbind(dev, &request); + DRM_UNLOCK(dev); + + return retcode; +} + +int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request) +{ + drm_agp_mem_t *entry; + int retcode; + int page; + + if (!dev->agp || !dev->agp->acquired) + return EINVAL; + + DRM_DEBUG("agp_bind, page_size=%x\n", (int)PAGE_SIZE); + + entry = drm_agp_lookup_entry(dev, (void *)request->handle); + if (entry == NULL || entry->bound) + return EINVAL; + + page = (request->offset + PAGE_SIZE - 1) / PAGE_SIZE; + + DRM_UNLOCK(dev); + retcode = drm_agp_bind_memory(entry->handle, page); + DRM_LOCK(dev); + if (retcode == 0) + entry->bound = dev->agp->base + (page << PAGE_SHIFT); + + return retcode; +} + +int drm_agp_bind_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_agp_binding request; + int retcode; + + request = *(struct drm_agp_binding *) data; + + DRM_LOCK(dev); + retcode = drm_agp_bind(dev, &request); + DRM_UNLOCK(dev); + + return retcode; +} + +int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request) +{ + drm_agp_mem_t *entry; + + if (!dev->agp || !dev->agp->acquired) + return EINVAL; + + entry = drm_agp_lookup_entry(dev, (void*)request->handle); + if (entry == NULL) + return EINVAL; + + if (entry->prev) + entry->prev->next = entry->next; + else + dev->agp->memory = entry->next; + if (entry->next) + entry->next->prev = entry->prev; + + DRM_UNLOCK(dev); + if (entry->bound) + drm_agp_unbind_memory(entry->handle); + drm_agp_free_memory(entry->handle); + DRM_LOCK(dev); + + free(entry, DRM_MEM_AGPLISTS); + + return 0; + +} + +int drm_agp_free_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_agp_buffer request; + int retcode; + + request = *(struct drm_agp_buffer *) data; + + DRM_LOCK(dev); + retcode = drm_agp_free(dev, &request); + DRM_UNLOCK(dev); + + return retcode; +} + +drm_agp_head_t *drm_agp_init(void) +{ + device_t agpdev; + drm_agp_head_t *head = NULL; + int agp_available = 1; + + agpdev = DRM_AGP_FIND_DEVICE(); + if (!agpdev) + agp_available = 0; + + DRM_DEBUG("agp_available = %d\n", agp_available); + + if (agp_available) { + head = malloc(sizeof(*head), DRM_MEM_AGPLISTS, + M_NOWAIT | M_ZERO); + if (head == NULL) + return NULL; + head->agpdev = agpdev; + agp_get_info(agpdev, &head->info); + head->base = head->info.ai_aperture_base; + head->memory = NULL; + DRM_INFO("AGP at 0x%08lx %dMB\n", + (long)head->info.ai_aperture_base, + (int)(head->info.ai_aperture_size >> 20)); + } + return head; +} + +void *drm_agp_allocate_memory(size_t pages, u32 type) +{ + device_t agpdev; + + agpdev = DRM_AGP_FIND_DEVICE(); + if (!agpdev) + return NULL; + + return agp_alloc_memory(agpdev, type, pages << AGP_PAGE_SHIFT); +} + +int drm_agp_free_memory(void *handle) +{ + device_t agpdev; + + agpdev = DRM_AGP_FIND_DEVICE(); + if (!agpdev || !handle) + return 0; + + agp_free_memory(agpdev, handle); + return 1; +} + +int drm_agp_bind_memory(void *handle, off_t start) +{ + device_t agpdev; + + agpdev = DRM_AGP_FIND_DEVICE(); + if (!agpdev || !handle) + return EINVAL; + + return agp_bind_memory(agpdev, handle, start * PAGE_SIZE); +} + +int drm_agp_unbind_memory(void *handle) +{ + device_t agpdev; + + agpdev = DRM_AGP_FIND_DEVICE(); + if (!agpdev || !handle) + return EINVAL; + + return agp_unbind_memory(agpdev, handle); +} diff --git a/sys/dev/drm2/drm_atomic.h b/sys/dev/drm2/drm_atomic.h new file mode 100644 index 00000000000..e7dbed98be8 --- /dev/null +++ b/sys/dev/drm2/drm_atomic.h @@ -0,0 +1,93 @@ +/** + * \file drm_atomic.h + * Atomic operations used in the DRM which may or may not be provided by the OS. + * + * \author Eric Anholt + */ + +/*- + * Copyright 2004 Eric Anholt + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* Many of these implementations are rather fake, but good enough. */ + +typedef u_int32_t atomic_t; + +#define atomic_set(p, v) (*(p) = (v)) +#define atomic_read(p) (*(p)) +#define atomic_inc(p) atomic_add_int(p, 1) +#define atomic_dec(p) atomic_subtract_int(p, 1) +#define atomic_add(n, p) atomic_add_int(p, n) +#define atomic_sub(n, p) atomic_subtract_int(p, n) + +static __inline atomic_t +test_and_set_bit(int b, volatile void *p) +{ + int s = splhigh(); + unsigned int m = 1<> 5), 1 << (b & 0x1f)); +} + +static __inline void +set_bit(int b, volatile void *p) +{ + atomic_set_int(((volatile int *)p) + (b >> 5), 1 << (b & 0x1f)); +} + +static __inline int +test_bit(int b, volatile void *p) +{ + return ((volatile int *)p)[b >> 5] & (1 << (b & 0x1f)); +} + +static __inline int +find_first_zero_bit(volatile void *p, int max) +{ + int b; + volatile int *ptr = (volatile int *)p; + + for (b = 0; b < max; b += 32) { + if (ptr[b >> 5] != ~0) { + for (;;) { + if ((ptr[b >> 5] & (1 << (b & 0x1f))) == 0) + return b; + b++; + } + } + } + return max; +} + +#define BITS_TO_LONGS(x) (howmany((x), NBBY * sizeof(long))) diff --git a/sys/dev/drm2/drm_auth.c b/sys/dev/drm2/drm_auth.c new file mode 100644 index 00000000000..69acff9df5a --- /dev/null +++ b/sys/dev/drm2/drm_auth.c @@ -0,0 +1,190 @@ +/*- + * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_auth.c + * Implementation of the get/authmagic ioctls implementing the authentication + * scheme between the master and clients. + */ + +#include + +static int drm_hash_magic(drm_magic_t magic) +{ + return magic & (DRM_HASH_SIZE-1); +} + +/** + * Returns the file private associated with the given magic number. + */ +static struct drm_file *drm_find_file(struct drm_device *dev, drm_magic_t magic) +{ + drm_magic_entry_t *pt; + int hash = drm_hash_magic(magic); + + DRM_LOCK_ASSERT(dev); + + for (pt = dev->magiclist[hash].head; pt; pt = pt->next) { + if (pt->magic == magic) { + return pt->priv; + } + } + + return NULL; +} + +/** + * Inserts the given magic number into the hash table of used magic number + * lists. + */ +static int drm_add_magic(struct drm_device *dev, struct drm_file *priv, + drm_magic_t magic) +{ + int hash; + drm_magic_entry_t *entry; + + DRM_DEBUG("%d\n", magic); + + DRM_LOCK_ASSERT(dev); + + hash = drm_hash_magic(magic); + entry = malloc(sizeof(*entry), DRM_MEM_MAGIC, M_ZERO | M_NOWAIT); + if (!entry) + return ENOMEM; + entry->magic = magic; + entry->priv = priv; + entry->next = NULL; + + if (dev->magiclist[hash].tail) { + dev->magiclist[hash].tail->next = entry; + dev->magiclist[hash].tail = entry; + } else { + dev->magiclist[hash].head = entry; + dev->magiclist[hash].tail = entry; + } + + return 0; +} + +/** + * Removes the given magic number from the hash table of used magic number + * lists. + */ +static int drm_remove_magic(struct drm_device *dev, drm_magic_t magic) +{ + drm_magic_entry_t *prev = NULL; + drm_magic_entry_t *pt; + int hash; + + DRM_LOCK_ASSERT(dev); + + DRM_DEBUG("%d\n", magic); + hash = drm_hash_magic(magic); + + for (pt = dev->magiclist[hash].head; pt; prev = pt, pt = pt->next) { + if (pt->magic == magic) { + if (dev->magiclist[hash].head == pt) { + dev->magiclist[hash].head = pt->next; + } + if (dev->magiclist[hash].tail == pt) { + dev->magiclist[hash].tail = prev; + } + if (prev) { + prev->next = pt->next; + } + free(pt, DRM_MEM_MAGIC); + return 0; + } + } + + return EINVAL; +} + +/** + * Called by the client, this returns a unique magic number to be authorized + * by the master. + * + * The master may use its own knowledge of the client (such as the X + * connection that the magic is passed over) to determine if the magic number + * should be authenticated. + */ +int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + static drm_magic_t sequence = 0; + struct drm_auth *auth = data; + + /* Find unique magic */ + if (file_priv->magic) { + auth->magic = file_priv->magic; + } else { + DRM_LOCK(dev); + do { + int old = sequence; + + auth->magic = old+1; + + if (!atomic_cmpset_int(&sequence, old, auth->magic)) + continue; + } while (drm_find_file(dev, auth->magic)); + file_priv->magic = auth->magic; + drm_add_magic(dev, file_priv, auth->magic); + DRM_UNLOCK(dev); + } + + DRM_DEBUG("%u\n", auth->magic); + + return 0; +} + +/** + * Marks the client associated with the given magic number as authenticated. + */ +int drm_authmagic(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_auth *auth = data; + struct drm_file *priv; + + DRM_DEBUG("%u\n", auth->magic); + + DRM_LOCK(dev); + priv = drm_find_file(dev, auth->magic); + if (priv != NULL) { + priv->authenticated = 1; + drm_remove_magic(dev, auth->magic); + DRM_UNLOCK(dev); + return 0; + } else { + DRM_UNLOCK(dev); + return EINVAL; + } +} diff --git a/sys/dev/drm2/drm_bufs.c b/sys/dev/drm2/drm_bufs.c new file mode 100644 index 00000000000..410c88fa65e --- /dev/null +++ b/sys/dev/drm2/drm_bufs.c @@ -0,0 +1,1130 @@ +/*- + * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_bufs.c + * Implementation of the ioctls for setup of DRM mappings and DMA buffers. + */ + +#include + +#include + +/* Allocation of PCI memory resources (framebuffer, registers, etc.) for + * drm_get_resource_*. Note that they are not RF_ACTIVE, so there's no virtual + * address for accessing them. Cleaned up at unload. + */ +static int drm_alloc_resource(struct drm_device *dev, int resource) +{ + struct resource *res; + int rid; + + DRM_LOCK_ASSERT(dev); + + if (resource >= DRM_MAX_PCI_RESOURCE) { + DRM_ERROR("Resource %d too large\n", resource); + return 1; + } + + if (dev->pcir[resource] != NULL) { + return 0; + } + + DRM_UNLOCK(dev); + rid = PCIR_BAR(resource); + res = bus_alloc_resource_any(dev->device, SYS_RES_MEMORY, &rid, + RF_SHAREABLE); + DRM_LOCK(dev); + if (res == NULL) { + DRM_ERROR("Couldn't find resource 0x%x\n", resource); + return 1; + } + + if (dev->pcir[resource] == NULL) { + dev->pcirid[resource] = rid; + dev->pcir[resource] = res; + } + + return 0; +} + +unsigned long drm_get_resource_start(struct drm_device *dev, + unsigned int resource) +{ + if (drm_alloc_resource(dev, resource) != 0) + return 0; + + return rman_get_start(dev->pcir[resource]); +} + +unsigned long drm_get_resource_len(struct drm_device *dev, + unsigned int resource) +{ + if (drm_alloc_resource(dev, resource) != 0) + return 0; + + return rman_get_size(dev->pcir[resource]); +} + +int drm_addmap(struct drm_device * dev, unsigned long offset, + unsigned long size, + enum drm_map_type type, enum drm_map_flags flags, drm_local_map_t **map_ptr) +{ + drm_local_map_t *map; + int align; + /*drm_agp_mem_t *entry; + int valid;*/ + + /* Only allow shared memory to be removable since we only keep enough + * book keeping information about shared memory to allow for removal + * when processes fork. + */ + if ((flags & _DRM_REMOVABLE) && type != _DRM_SHM) { + DRM_ERROR("Requested removable map for non-DRM_SHM\n"); + return EINVAL; + } + if ((offset & PAGE_MASK) || (size & PAGE_MASK)) { + DRM_ERROR("offset/size not page aligned: 0x%lx/0x%lx\n", + offset, size); + return EINVAL; + } + if (offset + size < offset) { + DRM_ERROR("offset and size wrap around: 0x%lx/0x%lx\n", + offset, size); + return EINVAL; + } + + DRM_DEBUG("offset = 0x%08lx, size = 0x%08lx, type = %d\n", offset, + size, type); + + /* Check if this is just another version of a kernel-allocated map, and + * just hand that back if so. + */ + if (type == _DRM_REGISTERS || type == _DRM_FRAME_BUFFER || + type == _DRM_SHM) { + TAILQ_FOREACH(map, &dev->maplist, link) { + if (map->type == type && (map->offset == offset || + (map->type == _DRM_SHM && + map->flags == _DRM_CONTAINS_LOCK))) { + map->size = size; + DRM_DEBUG("Found kernel map %d\n", type); + goto done; + } + } + } + DRM_UNLOCK(dev); + + /* Allocate a new map structure, fill it in, and do any type-specific + * initialization necessary. + */ + map = malloc(sizeof(*map), DRM_MEM_MAPS, M_ZERO | M_NOWAIT); + if (!map) { + DRM_LOCK(dev); + return ENOMEM; + } + + map->offset = offset; + map->size = size; + map->type = type; + map->flags = flags; + map->handle = (void *)((unsigned long)alloc_unr(dev->map_unrhdr) << + DRM_MAP_HANDLE_SHIFT); + + switch (map->type) { + case _DRM_REGISTERS: + map->virtual = drm_ioremap(dev, map); + if (!(map->flags & _DRM_WRITE_COMBINING)) + break; + /* FALLTHROUGH */ + case _DRM_FRAME_BUFFER: + if (drm_mtrr_add(map->offset, map->size, DRM_MTRR_WC) == 0) + map->mtrr = 1; + break; + case _DRM_SHM: + map->virtual = malloc(map->size, DRM_MEM_MAPS, M_NOWAIT); + DRM_DEBUG("%lu %d %p\n", + map->size, drm_order(map->size), map->virtual); + if (!map->virtual) { + free(map, DRM_MEM_MAPS); + DRM_LOCK(dev); + return ENOMEM; + } + map->offset = (unsigned long)map->virtual; + if (map->flags & _DRM_CONTAINS_LOCK) { + /* Prevent a 2nd X Server from creating a 2nd lock */ + DRM_LOCK(dev); + if (dev->lock.hw_lock != NULL) { + DRM_UNLOCK(dev); + free(map->virtual, DRM_MEM_MAPS); + free(map, DRM_MEM_MAPS); + return EBUSY; + } + dev->lock.hw_lock = map->virtual; /* Pointer to lock */ + DRM_UNLOCK(dev); + } + break; + case _DRM_AGP: + /*valid = 0;*/ + /* In some cases (i810 driver), user space may have already + * added the AGP base itself, because dev->agp->base previously + * only got set during AGP enable. So, only add the base + * address if the map's offset isn't already within the + * aperture. + */ + if (map->offset < dev->agp->base || + map->offset > dev->agp->base + + dev->agp->info.ai_aperture_size - 1) { + map->offset += dev->agp->base; + } + map->mtrr = dev->agp->mtrr; /* for getmap */ + /*for (entry = dev->agp->memory; entry; entry = entry->next) { + if ((map->offset >= entry->bound) && + (map->offset + map->size <= + entry->bound + entry->pages * PAGE_SIZE)) { + valid = 1; + break; + } + } + if (!valid) { + free(map, DRM_MEM_MAPS); + DRM_LOCK(dev); + return EACCES; + }*/ + break; + case _DRM_SCATTER_GATHER: + if (!dev->sg) { + free(map, DRM_MEM_MAPS); + DRM_LOCK(dev); + return EINVAL; + } + map->virtual = (void *)(dev->sg->vaddr + offset); + map->offset = dev->sg->vaddr + offset; + break; + case _DRM_CONSISTENT: + /* Unfortunately, we don't get any alignment specification from + * the caller, so we have to guess. drm_pci_alloc requires + * a power-of-two alignment, so try to align the bus address of + * the map to it size if possible, otherwise just assume + * PAGE_SIZE alignment. + */ + align = map->size; + if ((align & (align - 1)) != 0) + align = PAGE_SIZE; + map->dmah = drm_pci_alloc(dev, map->size, align, 0xfffffffful); + if (map->dmah == NULL) { + free(map, DRM_MEM_MAPS); + DRM_LOCK(dev); + return ENOMEM; + } + map->virtual = map->dmah->vaddr; + map->offset = map->dmah->busaddr; + break; + default: + DRM_ERROR("Bad map type %d\n", map->type); + free(map, DRM_MEM_MAPS); + DRM_LOCK(dev); + return EINVAL; + } + + DRM_LOCK(dev); + TAILQ_INSERT_TAIL(&dev->maplist, map, link); + +done: + /* Jumped to, with lock held, when a kernel map is found. */ + + DRM_DEBUG("Added map %d 0x%lx/0x%lx\n", map->type, map->offset, + map->size); + + *map_ptr = map; + + return 0; +} + +int drm_addmap_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_map *request = data; + drm_local_map_t *map; + int err; + + if (!(dev->flags & (FREAD|FWRITE))) + return EACCES; /* Require read/write */ + + if (!DRM_SUSER(DRM_CURPROC) && request->type != _DRM_AGP) + return EACCES; + + DRM_LOCK(dev); + err = drm_addmap(dev, request->offset, request->size, request->type, + request->flags, &map); + DRM_UNLOCK(dev); + if (err != 0) + return err; + + request->offset = map->offset; + request->size = map->size; + request->type = map->type; + request->flags = map->flags; + request->mtrr = map->mtrr; + request->handle = (void *)map->handle; + + return 0; +} + +void drm_rmmap(struct drm_device *dev, drm_local_map_t *map) +{ + DRM_LOCK_ASSERT(dev); + + if (map == NULL) + return; + + TAILQ_REMOVE(&dev->maplist, map, link); + + switch (map->type) { + case _DRM_REGISTERS: + if (map->bsr == NULL) + drm_ioremapfree(map); + /* FALLTHROUGH */ + case _DRM_FRAME_BUFFER: + if (map->mtrr) { + int __unused retcode; + + retcode = drm_mtrr_del(0, map->offset, map->size, + DRM_MTRR_WC); + DRM_DEBUG("mtrr_del = %d\n", retcode); + } + break; + case _DRM_SHM: + free(map->virtual, DRM_MEM_MAPS); + break; + case _DRM_AGP: + case _DRM_SCATTER_GATHER: + break; + case _DRM_CONSISTENT: + drm_pci_free(dev, map->dmah); + break; + default: + DRM_ERROR("Bad map type %d\n", map->type); + break; + } + + if (map->bsr != NULL) { + bus_release_resource(dev->device, SYS_RES_MEMORY, map->rid, + map->bsr); + } + + DRM_UNLOCK(dev); + if (map->handle) + free_unr(dev->map_unrhdr, (unsigned long)map->handle >> + DRM_MAP_HANDLE_SHIFT); + DRM_LOCK(dev); + + free(map, DRM_MEM_MAPS); +} + +/* Remove a map private from list and deallocate resources if the mapping + * isn't in use. + */ + +int drm_rmmap_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_local_map_t *map; + struct drm_map *request = data; + + DRM_LOCK(dev); + TAILQ_FOREACH(map, &dev->maplist, link) { + if (map->handle == request->handle && + map->flags & _DRM_REMOVABLE) + break; + } + + /* No match found. */ + if (map == NULL) { + DRM_UNLOCK(dev); + return EINVAL; + } + + drm_rmmap(dev, map); + + DRM_UNLOCK(dev); + + return 0; +} + + +static void drm_cleanup_buf_error(struct drm_device *dev, + drm_buf_entry_t *entry) +{ + int i; + + if (entry->seg_count) { + for (i = 0; i < entry->seg_count; i++) { + drm_pci_free(dev, entry->seglist[i]); + } + free(entry->seglist, DRM_MEM_SEGS); + + entry->seg_count = 0; + } + + if (entry->buf_count) { + for (i = 0; i < entry->buf_count; i++) { + free(entry->buflist[i].dev_private, DRM_MEM_BUFS); + } + free(entry->buflist, DRM_MEM_BUFS); + + entry->buf_count = 0; + } +} + +static int drm_do_addbufs_agp(struct drm_device *dev, struct drm_buf_desc *request) +{ + drm_device_dma_t *dma = dev->dma; + drm_buf_entry_t *entry; + /*drm_agp_mem_t *agp_entry; + int valid*/ + drm_buf_t *buf; + unsigned long offset; + unsigned long agp_offset; + int count; + int order; + int size; + int alignment; + int page_order; + int total; + int byte_count; + int i; + drm_buf_t **temp_buflist; + + count = request->count; + order = drm_order(request->size); + size = 1 << order; + + alignment = (request->flags & _DRM_PAGE_ALIGN) + ? round_page(size) : size; + page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0; + total = PAGE_SIZE << page_order; + + byte_count = 0; + agp_offset = dev->agp->base + request->agp_start; + + DRM_DEBUG("count: %d\n", count); + DRM_DEBUG("order: %d\n", order); + DRM_DEBUG("size: %d\n", size); + DRM_DEBUG("agp_offset: 0x%lx\n", agp_offset); + DRM_DEBUG("alignment: %d\n", alignment); + DRM_DEBUG("page_order: %d\n", page_order); + DRM_DEBUG("total: %d\n", total); + + /* Make sure buffers are located in AGP memory that we own */ + /* Breaks MGA due to drm_alloc_agp not setting up entries for the + * memory. Safe to ignore for now because these ioctls are still + * root-only. + */ + /*valid = 0; + for (agp_entry = dev->agp->memory; agp_entry; + agp_entry = agp_entry->next) { + if ((agp_offset >= agp_entry->bound) && + (agp_offset + total * count <= + agp_entry->bound + agp_entry->pages * PAGE_SIZE)) { + valid = 1; + break; + } + } + if (!valid) { + DRM_DEBUG("zone invalid\n"); + return EINVAL; + }*/ + + entry = &dma->bufs[order]; + + entry->buflist = malloc(count * sizeof(*entry->buflist), DRM_MEM_BUFS, + M_NOWAIT | M_ZERO); + if (!entry->buflist) { + return ENOMEM; + } + + entry->buf_size = size; + entry->page_order = page_order; + + offset = 0; + + while (entry->buf_count < count) { + buf = &entry->buflist[entry->buf_count]; + buf->idx = dma->buf_count + entry->buf_count; + buf->total = alignment; + buf->order = order; + buf->used = 0; + + buf->offset = (dma->byte_count + offset); + buf->bus_address = agp_offset + offset; + buf->address = (void *)(agp_offset + offset); + buf->next = NULL; + buf->pending = 0; + buf->file_priv = NULL; + + buf->dev_priv_size = dev->driver->buf_priv_size; + buf->dev_private = malloc(buf->dev_priv_size, DRM_MEM_BUFS, + M_NOWAIT | M_ZERO); + if (buf->dev_private == NULL) { + /* Set count correctly so we free the proper amount. */ + entry->buf_count = count; + drm_cleanup_buf_error(dev, entry); + return ENOMEM; + } + + offset += alignment; + entry->buf_count++; + byte_count += PAGE_SIZE << page_order; + } + + DRM_DEBUG("byte_count: %d\n", byte_count); + + temp_buflist = realloc(dma->buflist, + (dma->buf_count + entry->buf_count) * sizeof(*dma->buflist), + DRM_MEM_BUFS, M_NOWAIT); + if (temp_buflist == NULL) { + /* Free the entry because it isn't valid */ + drm_cleanup_buf_error(dev, entry); + return ENOMEM; + } + dma->buflist = temp_buflist; + + for (i = 0; i < entry->buf_count; i++) { + dma->buflist[i + dma->buf_count] = &entry->buflist[i]; + } + + dma->buf_count += entry->buf_count; + dma->byte_count += byte_count; + + DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count); + DRM_DEBUG("entry->buf_count : %d\n", entry->buf_count); + + request->count = entry->buf_count; + request->size = size; + + dma->flags = _DRM_DMA_USE_AGP; + + return 0; +} + +static int drm_do_addbufs_pci(struct drm_device *dev, struct drm_buf_desc *request) +{ + drm_device_dma_t *dma = dev->dma; + int count; + int order; + int size; + int total; + int page_order; + drm_buf_entry_t *entry; + drm_buf_t *buf; + int alignment; + unsigned long offset; + int i; + int byte_count; + int page_count; + unsigned long *temp_pagelist; + drm_buf_t **temp_buflist; + + count = request->count; + order = drm_order(request->size); + size = 1 << order; + + DRM_DEBUG("count=%d, size=%d (%d), order=%d\n", + request->count, request->size, size, order); + + alignment = (request->flags & _DRM_PAGE_ALIGN) + ? round_page(size) : size; + page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0; + total = PAGE_SIZE << page_order; + + entry = &dma->bufs[order]; + + entry->buflist = malloc(count * sizeof(*entry->buflist), DRM_MEM_BUFS, + M_NOWAIT | M_ZERO); + entry->seglist = malloc(count * sizeof(*entry->seglist), DRM_MEM_SEGS, + M_NOWAIT | M_ZERO); + + /* Keep the original pagelist until we know all the allocations + * have succeeded + */ + temp_pagelist = malloc((dma->page_count + (count << page_order)) * + sizeof(*dma->pagelist), DRM_MEM_PAGES, M_NOWAIT); + + if (entry->buflist == NULL || entry->seglist == NULL || + temp_pagelist == NULL) { + free(temp_pagelist, DRM_MEM_PAGES); + free(entry->seglist, DRM_MEM_SEGS); + free(entry->buflist, DRM_MEM_BUFS); + return ENOMEM; + } + + memcpy(temp_pagelist, dma->pagelist, dma->page_count * + sizeof(*dma->pagelist)); + + DRM_DEBUG("pagelist: %d entries\n", + dma->page_count + (count << page_order)); + + entry->buf_size = size; + entry->page_order = page_order; + byte_count = 0; + page_count = 0; + + while (entry->buf_count < count) { + DRM_SPINUNLOCK(&dev->dma_lock); + drm_dma_handle_t *dmah = drm_pci_alloc(dev, size, alignment, + 0xfffffffful); + DRM_SPINLOCK(&dev->dma_lock); + if (dmah == NULL) { + /* Set count correctly so we free the proper amount. */ + entry->buf_count = count; + entry->seg_count = count; + drm_cleanup_buf_error(dev, entry); + free(temp_pagelist, DRM_MEM_PAGES); + return ENOMEM; + } + + entry->seglist[entry->seg_count++] = dmah; + for (i = 0; i < (1 << page_order); i++) { + DRM_DEBUG("page %d @ %p\n", + dma->page_count + page_count, + (char *)dmah->vaddr + PAGE_SIZE * i); + temp_pagelist[dma->page_count + page_count++] = + (long)dmah->vaddr + PAGE_SIZE * i; + } + for (offset = 0; + offset + size <= total && entry->buf_count < count; + offset += alignment, ++entry->buf_count) { + buf = &entry->buflist[entry->buf_count]; + buf->idx = dma->buf_count + entry->buf_count; + buf->total = alignment; + buf->order = order; + buf->used = 0; + buf->offset = (dma->byte_count + byte_count + offset); + buf->address = ((char *)dmah->vaddr + offset); + buf->bus_address = dmah->busaddr + offset; + buf->next = NULL; + buf->pending = 0; + buf->file_priv = NULL; + + buf->dev_priv_size = dev->driver->buf_priv_size; + buf->dev_private = malloc(buf->dev_priv_size, + DRM_MEM_BUFS, M_NOWAIT | M_ZERO); + if (buf->dev_private == NULL) { + /* Set count correctly so we free the proper amount. */ + entry->buf_count = count; + entry->seg_count = count; + drm_cleanup_buf_error(dev, entry); + free(temp_pagelist, DRM_MEM_PAGES); + return ENOMEM; + } + + DRM_DEBUG("buffer %d @ %p\n", + entry->buf_count, buf->address); + } + byte_count += PAGE_SIZE << page_order; + } + + temp_buflist = realloc(dma->buflist, + (dma->buf_count + entry->buf_count) * sizeof(*dma->buflist), + DRM_MEM_BUFS, M_NOWAIT); + if (temp_buflist == NULL) { + /* Free the entry because it isn't valid */ + drm_cleanup_buf_error(dev, entry); + free(temp_pagelist, DRM_MEM_PAGES); + return ENOMEM; + } + dma->buflist = temp_buflist; + + for (i = 0; i < entry->buf_count; i++) { + dma->buflist[i + dma->buf_count] = &entry->buflist[i]; + } + + /* No allocations failed, so now we can replace the orginal pagelist + * with the new one. + */ + free(dma->pagelist, DRM_MEM_PAGES); + dma->pagelist = temp_pagelist; + + dma->buf_count += entry->buf_count; + dma->seg_count += entry->seg_count; + dma->page_count += entry->seg_count << page_order; + dma->byte_count += PAGE_SIZE * (entry->seg_count << page_order); + + request->count = entry->buf_count; + request->size = size; + + return 0; + +} + +static int drm_do_addbufs_sg(struct drm_device *dev, struct drm_buf_desc *request) +{ + drm_device_dma_t *dma = dev->dma; + drm_buf_entry_t *entry; + drm_buf_t *buf; + unsigned long offset; + unsigned long agp_offset; + int count; + int order; + int size; + int alignment; + int page_order; + int total; + int byte_count; + int i; + drm_buf_t **temp_buflist; + + count = request->count; + order = drm_order(request->size); + size = 1 << order; + + alignment = (request->flags & _DRM_PAGE_ALIGN) + ? round_page(size) : size; + page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0; + total = PAGE_SIZE << page_order; + + byte_count = 0; + agp_offset = request->agp_start; + + DRM_DEBUG("count: %d\n", count); + DRM_DEBUG("order: %d\n", order); + DRM_DEBUG("size: %d\n", size); + DRM_DEBUG("agp_offset: %ld\n", agp_offset); + DRM_DEBUG("alignment: %d\n", alignment); + DRM_DEBUG("page_order: %d\n", page_order); + DRM_DEBUG("total: %d\n", total); + + entry = &dma->bufs[order]; + + entry->buflist = malloc(count * sizeof(*entry->buflist), DRM_MEM_BUFS, + M_NOWAIT | M_ZERO); + if (entry->buflist == NULL) + return ENOMEM; + + entry->buf_size = size; + entry->page_order = page_order; + + offset = 0; + + while (entry->buf_count < count) { + buf = &entry->buflist[entry->buf_count]; + buf->idx = dma->buf_count + entry->buf_count; + buf->total = alignment; + buf->order = order; + buf->used = 0; + + buf->offset = (dma->byte_count + offset); + buf->bus_address = agp_offset + offset; + buf->address = (void *)(agp_offset + offset + dev->sg->vaddr); + buf->next = NULL; + buf->pending = 0; + buf->file_priv = NULL; + + buf->dev_priv_size = dev->driver->buf_priv_size; + buf->dev_private = malloc(buf->dev_priv_size, DRM_MEM_BUFS, + M_NOWAIT | M_ZERO); + if (buf->dev_private == NULL) { + /* Set count correctly so we free the proper amount. */ + entry->buf_count = count; + drm_cleanup_buf_error(dev, entry); + return ENOMEM; + } + + DRM_DEBUG("buffer %d @ %p\n", + entry->buf_count, buf->address); + + offset += alignment; + entry->buf_count++; + byte_count += PAGE_SIZE << page_order; + } + + DRM_DEBUG("byte_count: %d\n", byte_count); + + temp_buflist = realloc(dma->buflist, + (dma->buf_count + entry->buf_count) * sizeof(*dma->buflist), + DRM_MEM_BUFS, M_NOWAIT); + if (temp_buflist == NULL) { + /* Free the entry because it isn't valid */ + drm_cleanup_buf_error(dev, entry); + return ENOMEM; + } + dma->buflist = temp_buflist; + + for (i = 0; i < entry->buf_count; i++) { + dma->buflist[i + dma->buf_count] = &entry->buflist[i]; + } + + dma->buf_count += entry->buf_count; + dma->byte_count += byte_count; + + DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count); + DRM_DEBUG("entry->buf_count : %d\n", entry->buf_count); + + request->count = entry->buf_count; + request->size = size; + + dma->flags = _DRM_DMA_USE_SG; + + return 0; +} + +int drm_addbufs_agp(struct drm_device *dev, struct drm_buf_desc *request) +{ + int order, ret; + + if (request->count < 0 || request->count > 4096) + return EINVAL; + + order = drm_order(request->size); + if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) + return EINVAL; + + DRM_SPINLOCK(&dev->dma_lock); + + /* No more allocations after first buffer-using ioctl. */ + if (dev->buf_use != 0) { + DRM_SPINUNLOCK(&dev->dma_lock); + return EBUSY; + } + /* No more than one allocation per order */ + if (dev->dma->bufs[order].buf_count != 0) { + DRM_SPINUNLOCK(&dev->dma_lock); + return ENOMEM; + } + + ret = drm_do_addbufs_agp(dev, request); + + DRM_SPINUNLOCK(&dev->dma_lock); + + return ret; +} + +int drm_addbufs_sg(struct drm_device *dev, struct drm_buf_desc *request) +{ + int order, ret; + + if (!DRM_SUSER(DRM_CURPROC)) + return EACCES; + + if (request->count < 0 || request->count > 4096) + return EINVAL; + + order = drm_order(request->size); + if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) + return EINVAL; + + DRM_SPINLOCK(&dev->dma_lock); + + /* No more allocations after first buffer-using ioctl. */ + if (dev->buf_use != 0) { + DRM_SPINUNLOCK(&dev->dma_lock); + return EBUSY; + } + /* No more than one allocation per order */ + if (dev->dma->bufs[order].buf_count != 0) { + DRM_SPINUNLOCK(&dev->dma_lock); + return ENOMEM; + } + + ret = drm_do_addbufs_sg(dev, request); + + DRM_SPINUNLOCK(&dev->dma_lock); + + return ret; +} + +int drm_addbufs_pci(struct drm_device *dev, struct drm_buf_desc *request) +{ + int order, ret; + + if (!DRM_SUSER(DRM_CURPROC)) + return EACCES; + + if (request->count < 0 || request->count > 4096) + return EINVAL; + + order = drm_order(request->size); + if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) + return EINVAL; + + DRM_SPINLOCK(&dev->dma_lock); + + /* No more allocations after first buffer-using ioctl. */ + if (dev->buf_use != 0) { + DRM_SPINUNLOCK(&dev->dma_lock); + return EBUSY; + } + /* No more than one allocation per order */ + if (dev->dma->bufs[order].buf_count != 0) { + DRM_SPINUNLOCK(&dev->dma_lock); + return ENOMEM; + } + + ret = drm_do_addbufs_pci(dev, request); + + DRM_SPINUNLOCK(&dev->dma_lock); + + return ret; +} + +int drm_addbufs(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_buf_desc *request = data; + int err; + + if (request->flags & _DRM_AGP_BUFFER) + err = drm_addbufs_agp(dev, request); + else if (request->flags & _DRM_SG_BUFFER) + err = drm_addbufs_sg(dev, request); + else + err = drm_addbufs_pci(dev, request); + + return err; +} + +int drm_infobufs(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_device_dma_t *dma = dev->dma; + struct drm_buf_info *request = data; + int i; + int count; + int retcode = 0; + + DRM_SPINLOCK(&dev->dma_lock); + ++dev->buf_use; /* Can't allocate more after this call */ + DRM_SPINUNLOCK(&dev->dma_lock); + + for (i = 0, count = 0; i < DRM_MAX_ORDER + 1; i++) { + if (dma->bufs[i].buf_count) + ++count; + } + + DRM_DEBUG("count = %d\n", count); + + if (request->count >= count) { + for (i = 0, count = 0; i < DRM_MAX_ORDER + 1; i++) { + if (dma->bufs[i].buf_count) { + struct drm_buf_desc from; + + from.count = dma->bufs[i].buf_count; + from.size = dma->bufs[i].buf_size; + from.low_mark = dma->bufs[i].freelist.low_mark; + from.high_mark = dma->bufs[i].freelist.high_mark; + + if (DRM_COPY_TO_USER(&request->list[count], &from, + sizeof(struct drm_buf_desc)) != 0) { + retcode = EFAULT; + break; + } + + DRM_DEBUG("%d %d %d %d %d\n", + i, dma->bufs[i].buf_count, + dma->bufs[i].buf_size, + dma->bufs[i].freelist.low_mark, + dma->bufs[i].freelist.high_mark); + ++count; + } + } + } + request->count = count; + + return retcode; +} + +int drm_markbufs(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_device_dma_t *dma = dev->dma; + struct drm_buf_desc *request = data; + int order; + + DRM_DEBUG("%d, %d, %d\n", + request->size, request->low_mark, request->high_mark); + + + order = drm_order(request->size); + if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER || + request->low_mark < 0 || request->high_mark < 0) { + return EINVAL; + } + + DRM_SPINLOCK(&dev->dma_lock); + if (request->low_mark > dma->bufs[order].buf_count || + request->high_mark > dma->bufs[order].buf_count) { + DRM_SPINUNLOCK(&dev->dma_lock); + return EINVAL; + } + + dma->bufs[order].freelist.low_mark = request->low_mark; + dma->bufs[order].freelist.high_mark = request->high_mark; + DRM_SPINUNLOCK(&dev->dma_lock); + + return 0; +} + +int drm_freebufs(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_device_dma_t *dma = dev->dma; + struct drm_buf_free *request = data; + int i; + int idx; + drm_buf_t *buf; + int retcode = 0; + + DRM_DEBUG("%d\n", request->count); + + DRM_SPINLOCK(&dev->dma_lock); + for (i = 0; i < request->count; i++) { + if (DRM_COPY_FROM_USER(&idx, &request->list[i], sizeof(idx))) { + retcode = EFAULT; + break; + } + if (idx < 0 || idx >= dma->buf_count) { + DRM_ERROR("Index %d (of %d max)\n", + idx, dma->buf_count - 1); + retcode = EINVAL; + break; + } + buf = dma->buflist[idx]; + if (buf->file_priv != file_priv) { + DRM_ERROR("Process %d freeing buffer not owned\n", + DRM_CURRENTPID); + retcode = EINVAL; + break; + } + drm_free_buffer(dev, buf); + } + DRM_SPINUNLOCK(&dev->dma_lock); + + return retcode; +} + +int drm_mapbufs(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_device_dma_t *dma = dev->dma; + int retcode = 0; + const int zero = 0; + vm_offset_t address; + struct vmspace *vms; + vm_ooffset_t foff; + vm_size_t size; + vm_offset_t vaddr; + struct drm_buf_map *request = data; + int i; + + vms = DRM_CURPROC->td_proc->p_vmspace; + + DRM_SPINLOCK(&dev->dma_lock); + dev->buf_use++; /* Can't allocate more after this call */ + DRM_SPINUNLOCK(&dev->dma_lock); + + if (request->count < dma->buf_count) + goto done; + + if ((drm_core_has_AGP(dev) && (dma->flags & _DRM_DMA_USE_AGP)) || + (drm_core_check_feature(dev, DRIVER_SG) && + (dma->flags & _DRM_DMA_USE_SG))) { + drm_local_map_t *map = dev->agp_buffer_map; + + if (map == NULL) { + retcode = EINVAL; + goto done; + } + size = round_page(map->size); + foff = (unsigned long)map->handle; + } else { + size = round_page(dma->byte_count), + foff = 0; + } + + vaddr = round_page((vm_offset_t)vms->vm_daddr + MAXDSIZ); +#if __FreeBSD_version >= 600023 + retcode = vm_mmap(&vms->vm_map, &vaddr, size, PROT_READ | PROT_WRITE, + VM_PROT_ALL, MAP_SHARED | MAP_NOSYNC, OBJT_DEVICE, + dev->devnode, foff); +#else + retcode = vm_mmap(&vms->vm_map, &vaddr, size, PROT_READ | PROT_WRITE, + VM_PROT_ALL, MAP_SHARED | MAP_NOSYNC, + SLIST_FIRST(&dev->devnode->si_hlist), foff); +#endif + if (retcode) + goto done; + + request->virtual = (void *)vaddr; + + for (i = 0; i < dma->buf_count; i++) { + if (DRM_COPY_TO_USER(&request->list[i].idx, + &dma->buflist[i]->idx, sizeof(request->list[0].idx))) { + retcode = EFAULT; + goto done; + } + if (DRM_COPY_TO_USER(&request->list[i].total, + &dma->buflist[i]->total, sizeof(request->list[0].total))) { + retcode = EFAULT; + goto done; + } + if (DRM_COPY_TO_USER(&request->list[i].used, &zero, + sizeof(zero))) { + retcode = EFAULT; + goto done; + } + address = vaddr + dma->buflist[i]->offset; /* *** */ + if (DRM_COPY_TO_USER(&request->list[i].address, &address, + sizeof(address))) { + retcode = EFAULT; + goto done; + } + } + + done: + request->count = dma->buf_count; + + DRM_DEBUG("%d buffers, retcode = %d\n", request->count, retcode); + + return retcode; +} + +/* + * Compute order. Can be made faster. + */ +int drm_order(unsigned long size) +{ + int order; + + if (size == 0) + return 0; + + order = flsl(size) - 1; + if (size & ~(1ul << order)) + ++order; + + return order; +} diff --git a/sys/dev/drm2/drm_context.c b/sys/dev/drm2/drm_context.c new file mode 100644 index 00000000000..c844a39dff2 --- /dev/null +++ b/sys/dev/drm2/drm_context.c @@ -0,0 +1,312 @@ +/*- + * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_context.c + * Implementation of the context management ioctls. + */ + +#include + +/* ================================================================ + * Context bitmap support + */ + +void drm_ctxbitmap_free(struct drm_device *dev, int ctx_handle) +{ + if (ctx_handle < 0 || ctx_handle >= DRM_MAX_CTXBITMAP || + dev->ctx_bitmap == NULL) { + DRM_ERROR("Attempt to free invalid context handle: %d\n", + ctx_handle); + return; + } + + DRM_LOCK(dev); + clear_bit(ctx_handle, dev->ctx_bitmap); + dev->context_sareas[ctx_handle] = NULL; + DRM_UNLOCK(dev); + return; +} + +int drm_ctxbitmap_next(struct drm_device *dev) +{ + int bit; + + if (dev->ctx_bitmap == NULL) + return -1; + + DRM_LOCK(dev); + bit = find_first_zero_bit(dev->ctx_bitmap, DRM_MAX_CTXBITMAP); + if (bit >= DRM_MAX_CTXBITMAP) { + DRM_UNLOCK(dev); + return -1; + } + + set_bit(bit, dev->ctx_bitmap); + DRM_DEBUG("bit : %d\n", bit); + if ((bit+1) > dev->max_context) { + drm_local_map_t **ctx_sareas; + int max_ctx = (bit+1); + + ctx_sareas = realloc(dev->context_sareas, + max_ctx * sizeof(*dev->context_sareas), + DRM_MEM_SAREA, M_NOWAIT); + if (ctx_sareas == NULL) { + clear_bit(bit, dev->ctx_bitmap); + DRM_DEBUG("failed to allocate bit : %d\n", bit); + DRM_UNLOCK(dev); + return -1; + } + dev->max_context = max_ctx; + dev->context_sareas = ctx_sareas; + dev->context_sareas[bit] = NULL; + } + DRM_UNLOCK(dev); + return bit; +} + +int drm_ctxbitmap_init(struct drm_device *dev) +{ + int i; + int temp; + + DRM_LOCK(dev); + dev->ctx_bitmap = malloc(PAGE_SIZE, DRM_MEM_CTXBITMAP, + M_NOWAIT | M_ZERO); + if (dev->ctx_bitmap == NULL) { + DRM_UNLOCK(dev); + return ENOMEM; + } + dev->context_sareas = NULL; + dev->max_context = -1; + DRM_UNLOCK(dev); + + for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) { + temp = drm_ctxbitmap_next(dev); + DRM_DEBUG("drm_ctxbitmap_init : %d\n", temp); + } + + return 0; +} + +void drm_ctxbitmap_cleanup(struct drm_device *dev) +{ + DRM_LOCK(dev); + if (dev->context_sareas != NULL) + free(dev->context_sareas, DRM_MEM_SAREA); + free(dev->ctx_bitmap, DRM_MEM_CTXBITMAP); + DRM_UNLOCK(dev); +} + +/* ================================================================ + * Per Context SAREA Support + */ + +int drm_getsareactx(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_ctx_priv_map *request = data; + drm_local_map_t *map; + + DRM_LOCK(dev); + if (dev->max_context < 0 || + request->ctx_id >= (unsigned) dev->max_context) { + DRM_UNLOCK(dev); + return EINVAL; + } + + map = dev->context_sareas[request->ctx_id]; + DRM_UNLOCK(dev); + + request->handle = (void *)map->handle; + + return 0; +} + +int drm_setsareactx(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_ctx_priv_map *request = data; + drm_local_map_t *map = NULL; + + DRM_LOCK(dev); + TAILQ_FOREACH(map, &dev->maplist, link) { + if (map->handle == request->handle) { + if (dev->max_context < 0) + goto bad; + if (request->ctx_id >= (unsigned) dev->max_context) + goto bad; + dev->context_sareas[request->ctx_id] = map; + DRM_UNLOCK(dev); + return 0; + } + } + +bad: + DRM_UNLOCK(dev); + return EINVAL; +} + +/* ================================================================ + * The actual DRM context handling routines + */ + +int drm_context_switch(struct drm_device *dev, int old, int new) +{ + if (test_and_set_bit(0, &dev->context_flag)) { + DRM_ERROR("Reentering -- FIXME\n"); + return EBUSY; + } + + DRM_DEBUG("Context switch from %d to %d\n", old, new); + + if (new == dev->last_context) { + clear_bit(0, &dev->context_flag); + return 0; + } + + return 0; +} + +int drm_context_switch_complete(struct drm_device *dev, int new) +{ + dev->last_context = new; /* PRE/POST: This is the _only_ writer. */ + + if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { + DRM_ERROR("Lock isn't held after context switch\n"); + } + + /* If a context switch is ever initiated + when the kernel holds the lock, release + that lock here. */ + clear_bit(0, &dev->context_flag); + + return 0; +} + +int drm_resctx(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_ctx_res *res = data; + struct drm_ctx ctx; + int i; + + if (res->count >= DRM_RESERVED_CONTEXTS) { + bzero(&ctx, sizeof(ctx)); + for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) { + ctx.handle = i; + if (DRM_COPY_TO_USER(&res->contexts[i], + &ctx, sizeof(ctx))) + return EFAULT; + } + } + res->count = DRM_RESERVED_CONTEXTS; + + return 0; +} + +int drm_addctx(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_ctx *ctx = data; + + ctx->handle = drm_ctxbitmap_next(dev); + if (ctx->handle == DRM_KERNEL_CONTEXT) { + /* Skip kernel's context and get a new one. */ + ctx->handle = drm_ctxbitmap_next(dev); + } + DRM_DEBUG("%d\n", ctx->handle); + if (ctx->handle == -1) { + DRM_DEBUG("Not enough free contexts.\n"); + /* Should this return -EBUSY instead? */ + return ENOMEM; + } + + if (dev->driver->context_ctor && ctx->handle != DRM_KERNEL_CONTEXT) { + DRM_LOCK(dev); + dev->driver->context_ctor(dev, ctx->handle); + DRM_UNLOCK(dev); + } + + return 0; +} + +int drm_modctx(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + /* This does nothing */ + return 0; +} + +int drm_getctx(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_ctx *ctx = data; + + /* This is 0, because we don't handle any context flags */ + ctx->flags = 0; + + return 0; +} + +int drm_switchctx(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_ctx *ctx = data; + + DRM_DEBUG("%d\n", ctx->handle); + return drm_context_switch(dev, dev->last_context, ctx->handle); +} + +int drm_newctx(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_ctx *ctx = data; + + DRM_DEBUG("%d\n", ctx->handle); + drm_context_switch_complete(dev, ctx->handle); + + return 0; +} + +int drm_rmctx(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_ctx *ctx = data; + + DRM_DEBUG("%d\n", ctx->handle); + if (ctx->handle != DRM_KERNEL_CONTEXT) { + if (dev->driver->context_dtor) { + DRM_LOCK(dev); + dev->driver->context_dtor(dev, ctx->handle); + DRM_UNLOCK(dev); + } + + drm_ctxbitmap_free(dev, ctx->handle); + } + + return 0; +} diff --git a/sys/dev/drm2/drm_crtc.c b/sys/dev/drm2/drm_crtc.c new file mode 100644 index 00000000000..f6e462e7193 --- /dev/null +++ b/sys/dev/drm2/drm_crtc.c @@ -0,0 +1,3413 @@ +/* + * Copyright (c) 2006-2008 Intel Corporation + * Copyright (c) 2007 Dave Airlie + * Copyright (c) 2008 Red Hat Inc. + * + * DRM core CRTC related functions + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + * + * Authors: + * Keith Packard + * Eric Anholt + * Dave Airlie + * Jesse Barnes + */ +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Avoid boilerplate. I'm tired of typing. */ +#define DRM_ENUM_NAME_FN(fnname, list) \ + char *fnname(int val) \ + { \ + int i; \ + for (i = 0; i < DRM_ARRAY_SIZE(list); i++) { \ + if (list[i].type == val) \ + return list[i].name; \ + } \ + return "(unknown)"; \ + } + +/* + * Global properties + */ +static struct drm_prop_enum_list drm_dpms_enum_list[] = +{ { DRM_MODE_DPMS_ON, "On" }, + { DRM_MODE_DPMS_STANDBY, "Standby" }, + { DRM_MODE_DPMS_SUSPEND, "Suspend" }, + { DRM_MODE_DPMS_OFF, "Off" } +}; + +DRM_ENUM_NAME_FN(drm_get_dpms_name, drm_dpms_enum_list) + +/* + * Optional properties + */ +static struct drm_prop_enum_list drm_scaling_mode_enum_list[] = +{ + { DRM_MODE_SCALE_NONE, "None" }, + { DRM_MODE_SCALE_FULLSCREEN, "Full" }, + { DRM_MODE_SCALE_CENTER, "Center" }, + { DRM_MODE_SCALE_ASPECT, "Full aspect" }, +}; + +static struct drm_prop_enum_list drm_dithering_mode_enum_list[] = +{ + { DRM_MODE_DITHERING_OFF, "Off" }, + { DRM_MODE_DITHERING_ON, "On" }, + { DRM_MODE_DITHERING_AUTO, "Automatic" }, +}; + +/* + * Non-global properties, but "required" for certain connectors. + */ +static struct drm_prop_enum_list drm_dvi_i_select_enum_list[] = +{ + { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */ + { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */ + { DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */ +}; + +DRM_ENUM_NAME_FN(drm_get_dvi_i_select_name, drm_dvi_i_select_enum_list) + +static struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = +{ + { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I and TV-out */ + { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */ + { DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */ +}; + +DRM_ENUM_NAME_FN(drm_get_dvi_i_subconnector_name, + drm_dvi_i_subconnector_enum_list) + +static struct drm_prop_enum_list drm_tv_select_enum_list[] = +{ + { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */ + { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */ + { DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */ + { DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */ + { DRM_MODE_SUBCONNECTOR_SCART, "SCART" }, /* TV-out */ +}; + +DRM_ENUM_NAME_FN(drm_get_tv_select_name, drm_tv_select_enum_list) + +static struct drm_prop_enum_list drm_tv_subconnector_enum_list[] = +{ + { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I and TV-out */ + { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */ + { DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */ + { DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */ + { DRM_MODE_SUBCONNECTOR_SCART, "SCART" }, /* TV-out */ +}; + +DRM_ENUM_NAME_FN(drm_get_tv_subconnector_name, + drm_tv_subconnector_enum_list) + +static struct drm_prop_enum_list drm_dirty_info_enum_list[] = { + { DRM_MODE_DIRTY_OFF, "Off" }, + { DRM_MODE_DIRTY_ON, "On" }, + { DRM_MODE_DIRTY_ANNOTATE, "Annotate" }, +}; + +DRM_ENUM_NAME_FN(drm_get_dirty_info_name, + drm_dirty_info_enum_list) + +struct drm_conn_prop_enum_list { + int type; + char *name; + int count; +}; + +/* + * Connector and encoder types. + */ +static struct drm_conn_prop_enum_list drm_connector_enum_list[] = +{ { DRM_MODE_CONNECTOR_Unknown, "Unknown", 0 }, + { DRM_MODE_CONNECTOR_VGA, "VGA", 0 }, + { DRM_MODE_CONNECTOR_DVII, "DVI-I", 0 }, + { DRM_MODE_CONNECTOR_DVID, "DVI-D", 0 }, + { DRM_MODE_CONNECTOR_DVIA, "DVI-A", 0 }, + { DRM_MODE_CONNECTOR_Composite, "Composite", 0 }, + { DRM_MODE_CONNECTOR_SVIDEO, "SVIDEO", 0 }, + { DRM_MODE_CONNECTOR_LVDS, "LVDS", 0 }, + { DRM_MODE_CONNECTOR_Component, "Component", 0 }, + { DRM_MODE_CONNECTOR_9PinDIN, "DIN", 0 }, + { DRM_MODE_CONNECTOR_DisplayPort, "DP", 0 }, + { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A", 0 }, + { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B", 0 }, + { DRM_MODE_CONNECTOR_TV, "TV", 0 }, + { DRM_MODE_CONNECTOR_eDP, "eDP", 0 }, +}; + +static struct drm_prop_enum_list drm_encoder_enum_list[] = +{ { DRM_MODE_ENCODER_NONE, "None" }, + { DRM_MODE_ENCODER_DAC, "DAC" }, + { DRM_MODE_ENCODER_TMDS, "TMDS" }, + { DRM_MODE_ENCODER_LVDS, "LVDS" }, + { DRM_MODE_ENCODER_TVDAC, "TV" }, +}; + +char *drm_get_encoder_name(struct drm_encoder *encoder) +{ + static char buf[32]; + + snprintf(buf, 32, "%s-%d", + drm_encoder_enum_list[encoder->encoder_type].name, + encoder->base.id); + return buf; +} + +char *drm_get_connector_name(struct drm_connector *connector) +{ + static char buf[32]; + + snprintf(buf, 32, "%s-%d", + drm_connector_enum_list[connector->connector_type].name, + connector->connector_type_id); + return buf; +} + +char *drm_get_connector_status_name(enum drm_connector_status status) +{ + if (status == connector_status_connected) + return "connected"; + else if (status == connector_status_disconnected) + return "disconnected"; + else + return "unknown"; +} + +/** + * drm_mode_object_get - allocate a new identifier + * @dev: DRM device + * @ptr: object pointer, used to generate unique ID + * @type: object type + * + * LOCKING: + * + * Create a unique identifier based on @ptr in @dev's identifier space. Used + * for tracking modes, CRTCs and connectors. + * + * RETURNS: + * New unique (relative to other objects in @dev) integer identifier for the + * object. + */ +static int drm_mode_object_get(struct drm_device *dev, + struct drm_mode_object *obj, uint32_t obj_type) +{ + int new_id; + int ret; + + new_id = 0; + ret = drm_gem_name_create(&dev->mode_config.crtc_names, obj, &new_id); + if (ret != 0) + return (ret); + + obj->id = new_id; + obj->type = obj_type; + return 0; +} + +/** + * drm_mode_object_put - free an identifer + * @dev: DRM device + * @id: ID to free + * + * LOCKING: + * Caller must hold DRM mode_config lock. + * + * Free @id from @dev's unique identifier pool. + */ +static void drm_mode_object_put(struct drm_device *dev, + struct drm_mode_object *object) +{ + + drm_gem_names_remove(&dev->mode_config.crtc_names, object->id); +} + +struct drm_mode_object *drm_mode_object_find(struct drm_device *dev, + uint32_t id, uint32_t type) +{ + struct drm_mode_object *obj; + + obj = drm_gem_name_ref(&dev->mode_config.crtc_names, id, NULL); + if (!obj || (obj->type != type) || (obj->id != id)) + obj = NULL; + + return obj; +} + +/** + * drm_framebuffer_init - initialize a framebuffer + * @dev: DRM device + * + * LOCKING: + * Caller must hold mode config lock. + * + * Allocates an ID for the framebuffer's parent mode object, sets its mode + * functions & device file and adds it to the master fd list. + * + * RETURNS: + * Zero on success, error code on failure. + */ +int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb, + const struct drm_framebuffer_funcs *funcs) +{ + int ret; + + DRM_MODE_CONFIG_ASSERT_LOCKED(dev); + + ret = drm_mode_object_get(dev, &fb->base, DRM_MODE_OBJECT_FB); + if (ret) + return ret; + + fb->dev = dev; + fb->funcs = funcs; + dev->mode_config.num_fb++; + list_add(&fb->head, &dev->mode_config.fb_list); + + return 0; +} + +/** + * drm_framebuffer_cleanup - remove a framebuffer object + * @fb: framebuffer to remove + * + * LOCKING: + * Caller must hold mode config lock. + * + * Scans all the CRTCs in @dev's mode_config. If they're using @fb, removes + * it, setting it to NULL. + */ +void drm_framebuffer_cleanup(struct drm_framebuffer *fb) +{ + struct drm_device *dev = fb->dev; + struct drm_crtc *crtc; + struct drm_plane *plane; + struct drm_mode_set set; + int ret; + + DRM_MODE_CONFIG_ASSERT_LOCKED(dev); + + /* remove from any CRTC */ + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + if (crtc->fb == fb) { + /* should turn off the crtc */ + memset(&set, 0, sizeof(struct drm_mode_set)); + set.crtc = crtc; + set.fb = NULL; + ret = crtc->funcs->set_config(&set); + if (ret) + DRM_ERROR("failed to reset crtc %p when fb was deleted\n", crtc); + } + } + + list_for_each_entry(plane, &dev->mode_config.plane_list, head) { + if (plane->fb == fb) { + /* should turn off the crtc */ + ret = plane->funcs->disable_plane(plane); + if (ret) + DRM_ERROR("failed to disable plane with busy fb\n"); + /* disconnect the plane from the fb and crtc: */ + plane->fb = NULL; + plane->crtc = NULL; + } + } + + drm_mode_object_put(dev, &fb->base); + list_del(&fb->head); + dev->mode_config.num_fb--; +} + +/** + * drm_crtc_init - Initialise a new CRTC object + * @dev: DRM device + * @crtc: CRTC object to init + * @funcs: callbacks for the new CRTC + * + * LOCKING: + * Caller must hold mode config lock. + * + * Inits a new object created as base part of an driver crtc object. + * + * RETURNS: + * Zero on success, error code on failure. + */ +int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, + const struct drm_crtc_funcs *funcs) +{ + int ret; + + crtc->dev = dev; + crtc->funcs = funcs; + + sx_xlock(&dev->mode_config.mutex); + ret = drm_mode_object_get(dev, &crtc->base, DRM_MODE_OBJECT_CRTC); + if (ret) + goto out; + + list_add_tail(&crtc->head, &dev->mode_config.crtc_list); + dev->mode_config.num_crtc++; +out: + sx_xunlock(&dev->mode_config.mutex); + + return ret; +} + +/** + * drm_crtc_cleanup - Cleans up the core crtc usage. + * @crtc: CRTC to cleanup + * + * LOCKING: + * Caller must hold mode config lock. + * + * Cleanup @crtc. Removes from drm modesetting space + * does NOT free object, caller does that. + */ +void drm_crtc_cleanup(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + + DRM_MODE_CONFIG_ASSERT_LOCKED(dev); + + if (crtc->gamma_store) { + free(crtc->gamma_store, DRM_MEM_KMS); + crtc->gamma_store = NULL; + } + + drm_mode_object_put(dev, &crtc->base); + list_del(&crtc->head); + dev->mode_config.num_crtc--; +} + +/** + * drm_mode_probed_add - add a mode to a connector's probed mode list + * @connector: connector the new mode + * @mode: mode data + * + * LOCKING: + * Caller must hold mode config lock. + * + * Add @mode to @connector's mode list for later use. + */ +void drm_mode_probed_add(struct drm_connector *connector, + struct drm_display_mode *mode) +{ + + DRM_MODE_CONFIG_ASSERT_LOCKED(connector->dev); + + list_add(&mode->head, &connector->probed_modes); +} + +/** + * drm_mode_remove - remove and free a mode + * @connector: connector list to modify + * @mode: mode to remove + * + * LOCKING: + * Caller must hold mode config lock. + * + * Remove @mode from @connector's mode list, then free it. + */ +void drm_mode_remove(struct drm_connector *connector, + struct drm_display_mode *mode) +{ + + DRM_MODE_CONFIG_ASSERT_LOCKED(connector->dev); + + list_del(&mode->head); + drm_mode_destroy(connector->dev, mode); +} + +/** + * drm_connector_init - Init a preallocated connector + * @dev: DRM device + * @connector: the connector to init + * @funcs: callbacks for this connector + * @name: user visible name of the connector + * + * LOCKING: + * Takes mode config lock. + * + * Initialises a preallocated connector. Connectors should be + * subclassed as part of driver connector objects. + * + * RETURNS: + * Zero on success, error code on failure. + */ +int drm_connector_init(struct drm_device *dev, + struct drm_connector *connector, + const struct drm_connector_funcs *funcs, + int connector_type) +{ + int ret; + + sx_xlock(&dev->mode_config.mutex); + + ret = drm_mode_object_get(dev, &connector->base, DRM_MODE_OBJECT_CONNECTOR); + if (ret) + goto out; + + connector->dev = dev; + connector->funcs = funcs; + connector->connector_type = connector_type; + connector->connector_type_id = + ++drm_connector_enum_list[connector_type].count; /* TODO */ + INIT_LIST_HEAD(&connector->user_modes); + INIT_LIST_HEAD(&connector->probed_modes); + INIT_LIST_HEAD(&connector->modes); + connector->edid_blob_ptr = NULL; + + list_add_tail(&connector->head, &dev->mode_config.connector_list); + dev->mode_config.num_connector++; + + drm_connector_attach_property(connector, + dev->mode_config.edid_property, 0); + + drm_connector_attach_property(connector, + dev->mode_config.dpms_property, 0); + +out: + sx_xunlock(&dev->mode_config.mutex); + + return ret; +} + +/** + * drm_connector_cleanup - cleans up an initialised connector + * @connector: connector to cleanup + * + * LOCKING: + * Takes mode config lock. + * + * Cleans up the connector but doesn't free the object. + */ +void drm_connector_cleanup(struct drm_connector *connector) +{ + struct drm_device *dev = connector->dev; + struct drm_display_mode *mode, *t; + + list_for_each_entry_safe(mode, t, &connector->probed_modes, head) + drm_mode_remove(connector, mode); + + list_for_each_entry_safe(mode, t, &connector->modes, head) + drm_mode_remove(connector, mode); + + list_for_each_entry_safe(mode, t, &connector->user_modes, head) + drm_mode_remove(connector, mode); + + sx_xlock(&dev->mode_config.mutex); + drm_mode_object_put(dev, &connector->base); + list_del(&connector->head); + dev->mode_config.num_connector--; + sx_xunlock(&dev->mode_config.mutex); +} + +int drm_encoder_init(struct drm_device *dev, + struct drm_encoder *encoder, + const struct drm_encoder_funcs *funcs, + int encoder_type) +{ + int ret; + + sx_xlock(&dev->mode_config.mutex); + + ret = drm_mode_object_get(dev, &encoder->base, DRM_MODE_OBJECT_ENCODER); + if (ret) + goto out; + + encoder->dev = dev; + encoder->encoder_type = encoder_type; + encoder->funcs = funcs; + + list_add_tail(&encoder->head, &dev->mode_config.encoder_list); + dev->mode_config.num_encoder++; + +out: + sx_xunlock(&dev->mode_config.mutex); + + return ret; +} + +void drm_encoder_cleanup(struct drm_encoder *encoder) +{ + struct drm_device *dev = encoder->dev; + + sx_xlock(&dev->mode_config.mutex); + drm_mode_object_put(dev, &encoder->base); + list_del(&encoder->head); + dev->mode_config.num_encoder--; + sx_xunlock(&dev->mode_config.mutex); +} + +int drm_plane_init(struct drm_device *dev, struct drm_plane *plane, + unsigned long possible_crtcs, + const struct drm_plane_funcs *funcs, + const uint32_t *formats, uint32_t format_count, + bool priv) +{ + int ret; + + sx_xlock(&dev->mode_config.mutex); + + ret = drm_mode_object_get(dev, &plane->base, DRM_MODE_OBJECT_PLANE); + if (ret) + goto out; + + plane->dev = dev; + plane->funcs = funcs; + plane->format_types = malloc(sizeof(uint32_t) * format_count, + DRM_MEM_KMS, M_WAITOK); + + memcpy(plane->format_types, formats, format_count * sizeof(uint32_t)); + plane->format_count = format_count; + plane->possible_crtcs = possible_crtcs; + + /* private planes are not exposed to userspace, but depending on + * display hardware, might be convenient to allow sharing programming + * for the scanout engine with the crtc implementation. + */ + if (!priv) { + list_add_tail(&plane->head, &dev->mode_config.plane_list); + dev->mode_config.num_plane++; + } else { + INIT_LIST_HEAD(&plane->head); + } + +out: + sx_xunlock(&dev->mode_config.mutex); + + return ret; +} + +void drm_plane_cleanup(struct drm_plane *plane) +{ + struct drm_device *dev = plane->dev; + + sx_xlock(&dev->mode_config.mutex); + free(plane->format_types, DRM_MEM_KMS); + drm_mode_object_put(dev, &plane->base); + /* if not added to a list, it must be a private plane */ + if (!list_empty(&plane->head)) { + list_del(&plane->head); + dev->mode_config.num_plane--; + } + sx_xunlock(&dev->mode_config.mutex); +} + +/** + * drm_mode_create - create a new display mode + * @dev: DRM device + * + * LOCKING: + * Caller must hold DRM mode_config lock. + * + * Create a new drm_display_mode, give it an ID, and return it. + * + * RETURNS: + * Pointer to new mode on success, NULL on error. + */ +struct drm_display_mode *drm_mode_create(struct drm_device *dev) +{ + struct drm_display_mode *nmode; + + nmode = malloc(sizeof(struct drm_display_mode), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + if (drm_mode_object_get(dev, &nmode->base, DRM_MODE_OBJECT_MODE)) { + free(nmode, DRM_MEM_KMS); + return (NULL); + } + return nmode; +} + +/** + * drm_mode_destroy - remove a mode + * @dev: DRM device + * @mode: mode to remove + * + * LOCKING: + * Caller must hold mode config lock. + * + * Free @mode's unique identifier, then free it. + */ +void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode) +{ + if (!mode) + return; + + drm_mode_object_put(dev, &mode->base); + + free(mode, DRM_MEM_KMS); +} + +static int drm_mode_create_standard_connector_properties(struct drm_device *dev) +{ + struct drm_property *edid; + struct drm_property *dpms; + + /* + * Standard properties (apply to all connectors) + */ + edid = drm_property_create(dev, DRM_MODE_PROP_BLOB | + DRM_MODE_PROP_IMMUTABLE, + "EDID", 0); + dev->mode_config.edid_property = edid; + + dpms = drm_property_create_enum(dev, 0, + "DPMS", drm_dpms_enum_list, + DRM_ARRAY_SIZE(drm_dpms_enum_list)); + dev->mode_config.dpms_property = dpms; + + return 0; +} + +/** + * drm_mode_create_dvi_i_properties - create DVI-I specific connector properties + * @dev: DRM device + * + * Called by a driver the first time a DVI-I connector is made. + */ +int drm_mode_create_dvi_i_properties(struct drm_device *dev) +{ + struct drm_property *dvi_i_selector; + struct drm_property *dvi_i_subconnector; + + if (dev->mode_config.dvi_i_select_subconnector_property) + return 0; + + dvi_i_selector = + drm_property_create_enum(dev, 0, + "select subconnector", + drm_dvi_i_select_enum_list, + DRM_ARRAY_SIZE(drm_dvi_i_select_enum_list)); + dev->mode_config.dvi_i_select_subconnector_property = dvi_i_selector; + + dvi_i_subconnector = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE, + "subconnector", + drm_dvi_i_subconnector_enum_list, + DRM_ARRAY_SIZE(drm_dvi_i_subconnector_enum_list)); + dev->mode_config.dvi_i_subconnector_property = dvi_i_subconnector; + + return 0; +} + +/** + * drm_create_tv_properties - create TV specific connector properties + * @dev: DRM device + * @num_modes: number of different TV formats (modes) supported + * @modes: array of pointers to strings containing name of each format + * + * Called by a driver's TV initialization routine, this function creates + * the TV specific connector properties for a given device. Caller is + * responsible for allocating a list of format names and passing them to + * this routine. + */ +int drm_mode_create_tv_properties(struct drm_device *dev, int num_modes, + char *modes[]) +{ + struct drm_property *tv_selector; + struct drm_property *tv_subconnector; + int i; + + if (dev->mode_config.tv_select_subconnector_property) + return 0; + + /* + * Basic connector properties + */ + tv_selector = drm_property_create_enum(dev, 0, + "select subconnector", + drm_tv_select_enum_list, + DRM_ARRAY_SIZE(drm_tv_select_enum_list)); + dev->mode_config.tv_select_subconnector_property = tv_selector; + + tv_subconnector = + drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE, + "subconnector", + drm_tv_subconnector_enum_list, + DRM_ARRAY_SIZE(drm_tv_subconnector_enum_list)); + dev->mode_config.tv_subconnector_property = tv_subconnector; + + /* + * Other, TV specific properties: margins & TV modes. + */ + dev->mode_config.tv_left_margin_property = + drm_property_create_range(dev, 0, "left margin", 0, 100); + + dev->mode_config.tv_right_margin_property = + drm_property_create_range(dev, 0, "right margin", 0, 100); + + dev->mode_config.tv_top_margin_property = + drm_property_create_range(dev, 0, "top margin", 0, 100); + + dev->mode_config.tv_bottom_margin_property = + drm_property_create_range(dev, 0, "bottom margin", 0, 100); + + dev->mode_config.tv_mode_property = + drm_property_create(dev, DRM_MODE_PROP_ENUM, + "mode", num_modes); + for (i = 0; i < num_modes; i++) + drm_property_add_enum(dev->mode_config.tv_mode_property, i, + i, modes[i]); + + dev->mode_config.tv_brightness_property = + drm_property_create_range(dev, 0, "brightness", 0, 100); + + dev->mode_config.tv_contrast_property = + drm_property_create_range(dev, 0, "contrast", 0, 100); + + dev->mode_config.tv_flicker_reduction_property = + drm_property_create_range(dev, 0, "flicker reduction", 0, 100); + + dev->mode_config.tv_overscan_property = + drm_property_create_range(dev, 0, "overscan", 0, 100); + + dev->mode_config.tv_saturation_property = + drm_property_create_range(dev, 0, "saturation", 0, 100); + + dev->mode_config.tv_hue_property = + drm_property_create_range(dev, 0, "hue", 0, 100); + + return 0; +} + +/** + * drm_mode_create_scaling_mode_property - create scaling mode property + * @dev: DRM device + * + * Called by a driver the first time it's needed, must be attached to desired + * connectors. + */ +int drm_mode_create_scaling_mode_property(struct drm_device *dev) +{ + struct drm_property *scaling_mode; + + if (dev->mode_config.scaling_mode_property) + return 0; + + scaling_mode = + drm_property_create_enum(dev, 0, "scaling mode", + drm_scaling_mode_enum_list, + DRM_ARRAY_SIZE(drm_scaling_mode_enum_list)); + + dev->mode_config.scaling_mode_property = scaling_mode; + + return 0; +} + +/** + * drm_mode_create_dithering_property - create dithering property + * @dev: DRM device + * + * Called by a driver the first time it's needed, must be attached to desired + * connectors. + */ +int drm_mode_create_dithering_property(struct drm_device *dev) +{ + struct drm_property *dithering_mode; + + if (dev->mode_config.dithering_mode_property) + return 0; + + dithering_mode = + drm_property_create_enum(dev, 0, "dithering", + drm_dithering_mode_enum_list, + DRM_ARRAY_SIZE(drm_dithering_mode_enum_list)); + dev->mode_config.dithering_mode_property = dithering_mode; + + return 0; +} + +/** + * drm_mode_create_dirty_property - create dirty property + * @dev: DRM device + * + * Called by a driver the first time it's needed, must be attached to desired + * connectors. + */ +int drm_mode_create_dirty_info_property(struct drm_device *dev) +{ + struct drm_property *dirty_info; + + if (dev->mode_config.dirty_info_property) + return 0; + + dirty_info = + drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE, + "dirty", + drm_dirty_info_enum_list, + DRM_ARRAY_SIZE(drm_dirty_info_enum_list)); + dev->mode_config.dirty_info_property = dirty_info; + + return 0; +} + +/** + * drm_mode_config_init - initialize DRM mode_configuration structure + * @dev: DRM device + * + * LOCKING: + * None, should happen single threaded at init time. + * + * Initialize @dev's mode_config structure, used for tracking the graphics + * configuration of @dev. + */ +void drm_mode_config_init(struct drm_device *dev) +{ + sx_init(&dev->mode_config.mutex, "kmslk"); + INIT_LIST_HEAD(&dev->mode_config.fb_list); + INIT_LIST_HEAD(&dev->mode_config.crtc_list); + INIT_LIST_HEAD(&dev->mode_config.connector_list); + INIT_LIST_HEAD(&dev->mode_config.encoder_list); + INIT_LIST_HEAD(&dev->mode_config.property_list); + INIT_LIST_HEAD(&dev->mode_config.property_blob_list); + INIT_LIST_HEAD(&dev->mode_config.plane_list); + drm_gem_names_init(&dev->mode_config.crtc_names); + + sx_xlock(&dev->mode_config.mutex); + drm_mode_create_standard_connector_properties(dev); + sx_xunlock(&dev->mode_config.mutex); + + /* Just to be sure */ + dev->mode_config.num_fb = 0; + dev->mode_config.num_connector = 0; + dev->mode_config.num_crtc = 0; + dev->mode_config.num_encoder = 0; +} + +static int +drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *group) +{ + uint32_t total_objects = 0; + + total_objects += dev->mode_config.num_crtc; + total_objects += dev->mode_config.num_connector; + total_objects += dev->mode_config.num_encoder; + + group->id_list = malloc(total_objects * sizeof(uint32_t), + DRM_MEM_KMS, M_WAITOK | M_ZERO); + + group->num_crtcs = 0; + group->num_connectors = 0; + group->num_encoders = 0; + return 0; +} + +int drm_mode_group_init_legacy_group(struct drm_device *dev, + struct drm_mode_group *group) +{ + struct drm_crtc *crtc; + struct drm_encoder *encoder; + struct drm_connector *connector; + int ret; + + if ((ret = drm_mode_group_init(dev, group))) + return ret; + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) + group->id_list[group->num_crtcs++] = crtc->base.id; + + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) + group->id_list[group->num_crtcs + group->num_encoders++] = + encoder->base.id; + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) + group->id_list[group->num_crtcs + group->num_encoders + + group->num_connectors++] = connector->base.id; + + return 0; +} + +/** + * drm_mode_config_cleanup - free up DRM mode_config info + * @dev: DRM device + * + * LOCKING: + * Caller must hold mode config lock. + * + * Free up all the connectors and CRTCs associated with this DRM device, then + * free up the framebuffers and associated buffer objects. + * + * FIXME: cleanup any dangling user buffer objects too + */ +void drm_mode_config_cleanup(struct drm_device *dev) +{ + struct drm_connector *connector, *ot; + struct drm_crtc *crtc, *ct; + struct drm_encoder *encoder, *enct; + struct drm_framebuffer *fb, *fbt; + struct drm_property *property, *pt; + struct drm_plane *plane, *plt; + + list_for_each_entry_safe(encoder, enct, &dev->mode_config.encoder_list, + head) { + encoder->funcs->destroy(encoder); + } + + list_for_each_entry_safe(connector, ot, + &dev->mode_config.connector_list, head) { + connector->funcs->destroy(connector); + } + + list_for_each_entry_safe(property, pt, &dev->mode_config.property_list, + head) { + drm_property_destroy(dev, property); + } + + list_for_each_entry_safe(fb, fbt, &dev->mode_config.fb_list, head) { + fb->funcs->destroy(fb); + } + + list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) { + crtc->funcs->destroy(crtc); + } + + list_for_each_entry_safe(plane, plt, &dev->mode_config.plane_list, + head) { + plane->funcs->destroy(plane); + } + drm_gem_names_fini(&dev->mode_config.crtc_names); +} + +/** + * drm_crtc_convert_to_umode - convert a drm_display_mode into a modeinfo + * @out: drm_mode_modeinfo struct to return to the user + * @in: drm_display_mode to use + * + * LOCKING: + * None. + * + * Convert a drm_display_mode into a drm_mode_modeinfo structure to return to + * the user. + */ +static void drm_crtc_convert_to_umode(struct drm_mode_modeinfo *out, + const struct drm_display_mode *in) +{ + if (in->hdisplay > USHRT_MAX || in->hsync_start > USHRT_MAX || + in->hsync_end > USHRT_MAX || in->htotal > USHRT_MAX || + in->hskew > USHRT_MAX || in->vdisplay > USHRT_MAX || + in->vsync_start > USHRT_MAX || in->vsync_end > USHRT_MAX || + in->vtotal > USHRT_MAX || in->vscan > USHRT_MAX) + printf("timing values too large for mode info\n"); + + out->clock = in->clock; + out->hdisplay = in->hdisplay; + out->hsync_start = in->hsync_start; + out->hsync_end = in->hsync_end; + out->htotal = in->htotal; + out->hskew = in->hskew; + out->vdisplay = in->vdisplay; + out->vsync_start = in->vsync_start; + out->vsync_end = in->vsync_end; + out->vtotal = in->vtotal; + out->vscan = in->vscan; + out->vrefresh = in->vrefresh; + out->flags = in->flags; + out->type = in->type; + strncpy(out->name, in->name, DRM_DISPLAY_MODE_LEN); + out->name[DRM_DISPLAY_MODE_LEN-1] = 0; +} + +/** + * drm_crtc_convert_to_umode - convert a modeinfo into a drm_display_mode + * @out: drm_display_mode to return to the user + * @in: drm_mode_modeinfo to use + * + * LOCKING: + * None. + * + * Convert a drm_mode_modeinfo into a drm_display_mode structure to return to + * the caller. + * + * RETURNS: + * Zero on success, errno on failure. + */ +static int drm_crtc_convert_umode(struct drm_display_mode *out, + const struct drm_mode_modeinfo *in) +{ + if (in->clock > INT_MAX || in->vrefresh > INT_MAX) + return ERANGE; + + out->clock = in->clock; + out->hdisplay = in->hdisplay; + out->hsync_start = in->hsync_start; + out->hsync_end = in->hsync_end; + out->htotal = in->htotal; + out->hskew = in->hskew; + out->vdisplay = in->vdisplay; + out->vsync_start = in->vsync_start; + out->vsync_end = in->vsync_end; + out->vtotal = in->vtotal; + out->vscan = in->vscan; + out->vrefresh = in->vrefresh; + out->flags = in->flags; + out->type = in->type; + strncpy(out->name, in->name, DRM_DISPLAY_MODE_LEN); + out->name[DRM_DISPLAY_MODE_LEN-1] = 0; + + return 0; +} + +/** + * drm_mode_getresources - get graphics configuration + * @inode: inode from the ioctl + * @filp: file * from the ioctl + * @cmd: cmd from ioctl + * @arg: arg from ioctl + * + * LOCKING: + * Takes mode config lock. + * + * Construct a set of configuration description structures and return + * them to the user, including CRTC, connector and framebuffer configuration. + * + * Called by the user via ioctl. + * + * RETURNS: + * Zero on success, errno on failure. + */ +int drm_mode_getresources(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_mode_card_res *card_res = data; + struct list_head *lh; + struct drm_framebuffer *fb; + struct drm_connector *connector; + struct drm_crtc *crtc; + struct drm_encoder *encoder; + int ret = 0; + int connector_count = 0; + int crtc_count = 0; + int fb_count = 0; + int encoder_count = 0; + int copied = 0, i; + uint32_t __user *fb_id; + uint32_t __user *crtc_id; + uint32_t __user *connector_id; + uint32_t __user *encoder_id; + struct drm_mode_group *mode_group; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + sx_xlock(&dev->mode_config.mutex); + + /* + * For the non-control nodes we need to limit the list of resources + * by IDs in the group list for this node + */ + list_for_each(lh, &file_priv->fbs) + fb_count++; + +#if 1 + mode_group = NULL; /* XXXKIB */ + if (1 || file_priv->master) { +#else + mode_group = &file_priv->masterp->minor->mode_group; + if (file_priv->masterp->minor->type == DRM_MINOR_CONTROL) { +#endif + + list_for_each(lh, &dev->mode_config.crtc_list) + crtc_count++; + + list_for_each(lh, &dev->mode_config.connector_list) + connector_count++; + + list_for_each(lh, &dev->mode_config.encoder_list) + encoder_count++; + } else { + + crtc_count = mode_group->num_crtcs; + connector_count = mode_group->num_connectors; + encoder_count = mode_group->num_encoders; + } + + card_res->max_height = dev->mode_config.max_height; + card_res->min_height = dev->mode_config.min_height; + card_res->max_width = dev->mode_config.max_width; + card_res->min_width = dev->mode_config.min_width; + + /* handle this in 4 parts */ + /* FBs */ + if (card_res->count_fbs >= fb_count) { + copied = 0; + fb_id = (uint32_t *)(uintptr_t)card_res->fb_id_ptr; + list_for_each_entry(fb, &file_priv->fbs, filp_head) { + if (copyout(&fb->base.id, fb_id + copied, + sizeof(uint32_t))) { + ret = EFAULT; + goto out; + } + copied++; + } + } + card_res->count_fbs = fb_count; + + /* CRTCs */ + if (card_res->count_crtcs >= crtc_count) { + copied = 0; + crtc_id = (uint32_t *)(uintptr_t)card_res->crtc_id_ptr; +#if 1 + if (1 || file_priv->master) { +#else + if (file_priv->masterp->minor->type == DRM_MINOR_CONTROL) { +#endif + list_for_each_entry(crtc, &dev->mode_config.crtc_list, + head) { + DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id); + if (copyout(&crtc->base.id, crtc_id + + copied, sizeof(uint32_t))) { + ret = EFAULT; + goto out; + } + copied++; + } + } else { + for (i = 0; i < mode_group->num_crtcs; i++) { + if (copyout(&mode_group->id_list[i], + crtc_id + copied, sizeof(uint32_t))) { + ret = EFAULT; + goto out; + } + copied++; + } + } + } + card_res->count_crtcs = crtc_count; + + /* Encoders */ + if (card_res->count_encoders >= encoder_count) { + copied = 0; + encoder_id = (uint32_t *)(uintptr_t)card_res->encoder_id_ptr; +#if 1 + if (file_priv->master) { +#else + if (file_priv->masterp->minor->type == DRM_MINOR_CONTROL) { +#endif + list_for_each_entry(encoder, + &dev->mode_config.encoder_list, + head) { + DRM_DEBUG_KMS("[ENCODER:%d:%s]\n", encoder->base.id, + drm_get_encoder_name(encoder)); + if (copyout(&encoder->base.id, encoder_id + + copied, sizeof(uint32_t))) { + ret = EFAULT; + goto out; + } + copied++; + } + } else { + for (i = mode_group->num_crtcs; + i < mode_group->num_crtcs + mode_group->num_encoders; + i++) { + if (copyout(&mode_group->id_list[i], + encoder_id + copied, sizeof(uint32_t))) { + ret = EFAULT; + goto out; + } + copied++; + } + + } + } + card_res->count_encoders = encoder_count; + + /* Connectors */ + if (card_res->count_connectors >= connector_count) { + copied = 0; + connector_id = (uint32_t *)(uintptr_t)card_res->connector_id_ptr; +#if 1 + if (file_priv->master) { +#else + if (file_priv->masterp->minor->type == DRM_MINOR_CONTROL) { +#endif + list_for_each_entry(connector, + &dev->mode_config.connector_list, + head) { + DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", + connector->base.id, + drm_get_connector_name(connector)); + if (copyout(&connector->base.id, + connector_id + copied, sizeof(uint32_t))) { + ret = EFAULT; + goto out; + } + copied++; + } + } else { + int start = mode_group->num_crtcs + + mode_group->num_encoders; + for (i = start; i < start + mode_group->num_connectors; i++) { + if (copyout(&mode_group->id_list[i], + connector_id + copied, sizeof(uint32_t))) { + ret = EFAULT; + goto out; + } + copied++; + } + } + } + card_res->count_connectors = connector_count; + + DRM_DEBUG_KMS("CRTC[%d] CONNECTORS[%d] ENCODERS[%d]\n", card_res->count_crtcs, + card_res->count_connectors, card_res->count_encoders); + +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +/** + * drm_mode_getcrtc - get CRTC configuration + * @inode: inode from the ioctl + * @filp: file * from the ioctl + * @cmd: cmd from ioctl + * @arg: arg from ioctl + * + * LOCKING: + * Takes mode config lock. + * + * Construct a CRTC configuration structure to return to the user. + * + * Called by the user via ioctl. + * + * RETURNS: + * Zero on success, errno on failure. + */ +int drm_mode_getcrtc(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_crtc *crtc_resp = data; + struct drm_crtc *crtc; + struct drm_mode_object *obj; + int ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + sx_xlock(&dev->mode_config.mutex); + + obj = drm_mode_object_find(dev, crtc_resp->crtc_id, + DRM_MODE_OBJECT_CRTC); + if (!obj) { + ret = (EINVAL); + goto out; + } + crtc = obj_to_crtc(obj); + + crtc_resp->x = crtc->x; + crtc_resp->y = crtc->y; + crtc_resp->gamma_size = crtc->gamma_size; + if (crtc->fb) + crtc_resp->fb_id = crtc->fb->base.id; + else + crtc_resp->fb_id = 0; + + if (crtc->enabled) { + + drm_crtc_convert_to_umode(&crtc_resp->mode, &crtc->mode); + crtc_resp->mode_valid = 1; + + } else { + crtc_resp->mode_valid = 0; + } + +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +/** + * drm_mode_getconnector - get connector configuration + * @inode: inode from the ioctl + * @filp: file * from the ioctl + * @cmd: cmd from ioctl + * @arg: arg from ioctl + * + * LOCKING: + * Takes mode config lock. + * + * Construct a connector configuration structure to return to the user. + * + * Called by the user via ioctl. + * + * RETURNS: + * Zero on success, errno on failure. + */ +int drm_mode_getconnector(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_mode_get_connector *out_resp = data; + struct drm_mode_object *obj; + struct drm_connector *connector; + struct drm_display_mode *mode; + int mode_count = 0; + int props_count = 0; + int encoders_count = 0; + int ret = 0; + int copied = 0; + int i; + struct drm_mode_modeinfo u_mode; + struct drm_mode_modeinfo __user *mode_ptr; + uint32_t *prop_ptr; + uint64_t *prop_values; + uint32_t *encoder_ptr; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo)); + + DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); + + sx_xlock(&dev->mode_config.mutex); + + obj = drm_mode_object_find(dev, out_resp->connector_id, + DRM_MODE_OBJECT_CONNECTOR); + if (!obj) { + ret = EINVAL; + goto out; + } + connector = obj_to_connector(obj); + + for (i = 0; i < DRM_CONNECTOR_MAX_PROPERTY; i++) { + if (connector->property_ids[i] != 0) { + props_count++; + } + } + + for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { + if (connector->encoder_ids[i] != 0) { + encoders_count++; + } + } + + if (out_resp->count_modes == 0) { + connector->funcs->fill_modes(connector, + dev->mode_config.max_width, + dev->mode_config.max_height); + } + + /* delayed so we get modes regardless of pre-fill_modes state */ + list_for_each_entry(mode, &connector->modes, head) + mode_count++; + + out_resp->connector_id = connector->base.id; + out_resp->connector_type = connector->connector_type; + out_resp->connector_type_id = connector->connector_type_id; + out_resp->mm_width = connector->display_info.width_mm; + out_resp->mm_height = connector->display_info.height_mm; + out_resp->subpixel = connector->display_info.subpixel_order; + out_resp->connection = connector->status; + if (connector->encoder) + out_resp->encoder_id = connector->encoder->base.id; + else + out_resp->encoder_id = 0; + + /* + * This ioctl is called twice, once to determine how much space is + * needed, and the 2nd time to fill it. + */ + if ((out_resp->count_modes >= mode_count) && mode_count) { + copied = 0; + mode_ptr = (struct drm_mode_modeinfo *)(uintptr_t)out_resp->modes_ptr; + list_for_each_entry(mode, &connector->modes, head) { + drm_crtc_convert_to_umode(&u_mode, mode); + if (copyout(&u_mode, mode_ptr + copied, + sizeof(u_mode))) { + ret = EFAULT; + goto out; + } + copied++; + } + } + out_resp->count_modes = mode_count; + + if ((out_resp->count_props >= props_count) && props_count) { + copied = 0; + prop_ptr = (uint32_t *)(uintptr_t)(out_resp->props_ptr); + prop_values = (uint64_t *)(uintptr_t)(out_resp->prop_values_ptr); + for (i = 0; i < DRM_CONNECTOR_MAX_PROPERTY; i++) { + if (connector->property_ids[i] != 0) { + if (copyout(&connector->property_ids[i], + prop_ptr + copied, sizeof(uint32_t))) { + ret = EFAULT; + goto out; + } + + if (copyout(&connector->property_values[i], + prop_values + copied, sizeof(uint64_t))) { + ret = EFAULT; + goto out; + } + copied++; + } + } + } + out_resp->count_props = props_count; + + if ((out_resp->count_encoders >= encoders_count) && encoders_count) { + copied = 0; + encoder_ptr = (uint32_t *)(uintptr_t)(out_resp->encoders_ptr); + for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { + if (connector->encoder_ids[i] != 0) { + if (copyout(&connector->encoder_ids[i], + encoder_ptr + copied, sizeof(uint32_t))) { + ret = EFAULT; + goto out; + } + copied++; + } + } + } + out_resp->count_encoders = encoders_count; + +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +int drm_mode_getencoder(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_mode_get_encoder *enc_resp = data; + struct drm_mode_object *obj; + struct drm_encoder *encoder; + int ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + sx_xlock(&dev->mode_config.mutex); + obj = drm_mode_object_find(dev, enc_resp->encoder_id, + DRM_MODE_OBJECT_ENCODER); + if (!obj) { + ret = EINVAL; + goto out; + } + encoder = obj_to_encoder(obj); + + if (encoder->crtc) + enc_resp->crtc_id = encoder->crtc->base.id; + else + enc_resp->crtc_id = 0; + enc_resp->encoder_type = encoder->encoder_type; + enc_resp->encoder_id = encoder->base.id; + enc_resp->possible_crtcs = encoder->possible_crtcs; + enc_resp->possible_clones = encoder->possible_clones; + +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +/** + * drm_mode_getplane_res - get plane info + * @dev: DRM device + * @data: ioctl data + * @file_priv: DRM file info + * + * LOCKING: + * Takes mode config lock. + * + * Return an plane count and set of IDs. + */ +int drm_mode_getplane_res(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_mode_get_plane_res *plane_resp = data; + struct drm_mode_config *config; + struct drm_plane *plane; + uint32_t *plane_ptr; + int copied = 0, ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + sx_xlock(&dev->mode_config.mutex); + config = &dev->mode_config; + + /* + * This ioctl is called twice, once to determine how much space is + * needed, and the 2nd time to fill it. + */ + if (config->num_plane && + (plane_resp->count_planes >= config->num_plane)) { + plane_ptr = (uint32_t *)(unsigned long)plane_resp->plane_id_ptr; + + list_for_each_entry(plane, &config->plane_list, head) { + if (copyout(&plane->base.id, plane_ptr + copied, + sizeof(uint32_t))) { + ret = EFAULT; + goto out; + } + copied++; + } + } + plane_resp->count_planes = config->num_plane; + +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +/** + * drm_mode_getplane - get plane info + * @dev: DRM device + * @data: ioctl data + * @file_priv: DRM file info + * + * LOCKING: + * Takes mode config lock. + * + * Return plane info, including formats supported, gamma size, any + * current fb, etc. + */ +int drm_mode_getplane(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_mode_get_plane *plane_resp = data; + struct drm_mode_object *obj; + struct drm_plane *plane; + uint32_t *format_ptr; + int ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + sx_xlock(&dev->mode_config.mutex); + obj = drm_mode_object_find(dev, plane_resp->plane_id, + DRM_MODE_OBJECT_PLANE); + if (!obj) { + ret = ENOENT; + goto out; + } + plane = obj_to_plane(obj); + + if (plane->crtc) + plane_resp->crtc_id = plane->crtc->base.id; + else + plane_resp->crtc_id = 0; + + if (plane->fb) + plane_resp->fb_id = plane->fb->base.id; + else + plane_resp->fb_id = 0; + + plane_resp->plane_id = plane->base.id; + plane_resp->possible_crtcs = plane->possible_crtcs; + plane_resp->gamma_size = plane->gamma_size; + + /* + * This ioctl is called twice, once to determine how much space is + * needed, and the 2nd time to fill it. + */ + if (plane->format_count && + (plane_resp->count_format_types >= plane->format_count)) { + format_ptr = (uint32_t *)(unsigned long)plane_resp->format_type_ptr; + if (copyout(format_ptr, + plane->format_types, + sizeof(uint32_t) * plane->format_count)) { + ret = EFAULT; + goto out; + } + } + plane_resp->count_format_types = plane->format_count; + +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +/** + * drm_mode_setplane - set up or tear down an plane + * @dev: DRM device + * @data: ioctl data* + * @file_prive: DRM file info + * + * LOCKING: + * Takes mode config lock. + * + * Set plane info, including placement, fb, scaling, and other factors. + * Or pass a NULL fb to disable. + */ +int drm_mode_setplane(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_mode_set_plane *plane_req = data; + struct drm_mode_object *obj; + struct drm_plane *plane; + struct drm_crtc *crtc; + struct drm_framebuffer *fb; + int ret = 0; + unsigned int fb_width, fb_height; + int i; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + sx_xlock(&dev->mode_config.mutex); + + /* + * First, find the plane, crtc, and fb objects. If not available, + * we don't bother to call the driver. + */ + obj = drm_mode_object_find(dev, plane_req->plane_id, + DRM_MODE_OBJECT_PLANE); + if (!obj) { + DRM_DEBUG_KMS("Unknown plane ID %d\n", + plane_req->plane_id); + ret = ENOENT; + goto out; + } + plane = obj_to_plane(obj); + + /* No fb means shut it down */ + if (!plane_req->fb_id) { + plane->funcs->disable_plane(plane); + plane->crtc = NULL; + plane->fb = NULL; + goto out; + } + + obj = drm_mode_object_find(dev, plane_req->crtc_id, + DRM_MODE_OBJECT_CRTC); + if (!obj) { + DRM_DEBUG_KMS("Unknown crtc ID %d\n", + plane_req->crtc_id); + ret = ENOENT; + goto out; + } + crtc = obj_to_crtc(obj); + + obj = drm_mode_object_find(dev, plane_req->fb_id, + DRM_MODE_OBJECT_FB); + if (!obj) { + DRM_DEBUG_KMS("Unknown framebuffer ID %d\n", + plane_req->fb_id); + ret = ENOENT; + goto out; + } + fb = obj_to_fb(obj); + + /* Check whether this plane supports the fb pixel format. */ + for (i = 0; i < plane->format_count; i++) + if (fb->pixel_format == plane->format_types[i]) + break; + if (i == plane->format_count) { + DRM_DEBUG_KMS("Invalid pixel format 0x%08x\n", fb->pixel_format); + ret = EINVAL; + goto out; + } + + fb_width = fb->width << 16; + fb_height = fb->height << 16; + + /* Make sure source coordinates are inside the fb. */ + if (plane_req->src_w > fb_width || + plane_req->src_x > fb_width - plane_req->src_w || + plane_req->src_h > fb_height || + plane_req->src_y > fb_height - plane_req->src_h) { + DRM_DEBUG_KMS("Invalid source coordinates " + "%u.%06ux%u.%06u+%u.%06u+%u.%06u\n", + plane_req->src_w >> 16, + ((plane_req->src_w & 0xffff) * 15625) >> 10, + plane_req->src_h >> 16, + ((plane_req->src_h & 0xffff) * 15625) >> 10, + plane_req->src_x >> 16, + ((plane_req->src_x & 0xffff) * 15625) >> 10, + plane_req->src_y >> 16, + ((plane_req->src_y & 0xffff) * 15625) >> 10); + ret = ENOSPC; + goto out; + } + + /* Give drivers some help against integer overflows */ + if (plane_req->crtc_w > INT_MAX || + plane_req->crtc_x > INT_MAX - (int32_t) plane_req->crtc_w || + plane_req->crtc_h > INT_MAX || + plane_req->crtc_y > INT_MAX - (int32_t) plane_req->crtc_h) { + DRM_DEBUG_KMS("Invalid CRTC coordinates %ux%u+%d+%d\n", + plane_req->crtc_w, plane_req->crtc_h, + plane_req->crtc_x, plane_req->crtc_y); + ret = ERANGE; + goto out; + } + + ret = -plane->funcs->update_plane(plane, crtc, fb, + plane_req->crtc_x, plane_req->crtc_y, + plane_req->crtc_w, plane_req->crtc_h, + plane_req->src_x, plane_req->src_y, + plane_req->src_w, plane_req->src_h); + if (!ret) { + plane->crtc = crtc; + plane->fb = fb; + } + +out: + sx_xunlock(&dev->mode_config.mutex); + + return ret; +} + +/** + * drm_mode_setcrtc - set CRTC configuration + * @inode: inode from the ioctl + * @filp: file * from the ioctl + * @cmd: cmd from ioctl + * @arg: arg from ioctl + * + * LOCKING: + * Takes mode config lock. + * + * Build a new CRTC configuration based on user request. + * + * Called by the user via ioctl. + * + * RETURNS: + * Zero on success, errno on failure. + */ +int drm_mode_setcrtc(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_mode_config *config = &dev->mode_config; + struct drm_mode_crtc *crtc_req = data; + struct drm_mode_object *obj; + struct drm_crtc *crtc; + struct drm_connector **connector_set = NULL, *connector; + struct drm_framebuffer *fb = NULL; + struct drm_display_mode *mode = NULL; + struct drm_mode_set set; + uint32_t *set_connectors_ptr; + int ret = 0; + int i; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + /* For some reason crtc x/y offsets are signed internally. */ + if (crtc_req->x > INT_MAX || crtc_req->y > INT_MAX) + return (ERANGE); + + sx_xlock(&dev->mode_config.mutex); + obj = drm_mode_object_find(dev, crtc_req->crtc_id, + DRM_MODE_OBJECT_CRTC); + if (!obj) { + DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id); + ret = EINVAL; + goto out; + } + crtc = obj_to_crtc(obj); + DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id); + + if (crtc_req->mode_valid) { + /* If we have a mode we need a framebuffer. */ + /* If we pass -1, set the mode with the currently bound fb */ + if (crtc_req->fb_id == -1) { + if (!crtc->fb) { + DRM_DEBUG_KMS("CRTC doesn't have current FB\n"); + ret = -EINVAL; + goto out; + } + fb = crtc->fb; + } else { + obj = drm_mode_object_find(dev, crtc_req->fb_id, + DRM_MODE_OBJECT_FB); + if (!obj) { + DRM_DEBUG_KMS("Unknown FB ID%d\n", + crtc_req->fb_id); + ret = EINVAL; + goto out; + } + fb = obj_to_fb(obj); + } + + mode = drm_mode_create(dev); + if (!mode) { + ret = ENOMEM; + goto out; + } + + ret = drm_crtc_convert_umode(mode, &crtc_req->mode); + if (ret) { + DRM_DEBUG_KMS("Invalid mode\n"); + goto out; + } + + drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); + + if (mode->hdisplay > fb->width || + mode->vdisplay > fb->height || + crtc_req->x > fb->width - mode->hdisplay || + crtc_req->y > fb->height - mode->vdisplay) { + DRM_DEBUG_KMS("Invalid CRTC viewport %ux%u+%u+%u for fb size %ux%u.\n", + mode->hdisplay, mode->vdisplay, + crtc_req->x, crtc_req->y, + fb->width, fb->height); + ret = ENOSPC; + goto out; + } + } + + if (crtc_req->count_connectors == 0 && mode) { + DRM_DEBUG_KMS("Count connectors is 0 but mode set\n"); + ret = EINVAL; + goto out; + } + + if (crtc_req->count_connectors > 0 && (!mode || !fb)) { + DRM_DEBUG_KMS("Count connectors is %d but no mode or fb set\n", + crtc_req->count_connectors); + ret = EINVAL; + goto out; + } + + if (crtc_req->count_connectors > 0) { + u32 out_id; + + /* Avoid unbounded kernel memory allocation */ + if (crtc_req->count_connectors > config->num_connector) { + ret = EINVAL; + goto out; + } + + connector_set = malloc(crtc_req->count_connectors * + sizeof(struct drm_connector *), DRM_MEM_KMS, M_WAITOK); + + for (i = 0; i < crtc_req->count_connectors; i++) { + set_connectors_ptr = (uint32_t *)(uintptr_t)crtc_req->set_connectors_ptr; + if (copyin(&set_connectors_ptr[i], &out_id, sizeof(uint32_t))) { + ret = EFAULT; + goto out; + } + + obj = drm_mode_object_find(dev, out_id, + DRM_MODE_OBJECT_CONNECTOR); + if (!obj) { + DRM_DEBUG_KMS("Connector id %d unknown\n", + out_id); + ret = EINVAL; + goto out; + } + connector = obj_to_connector(obj); + DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", + connector->base.id, + drm_get_connector_name(connector)); + + connector_set[i] = connector; + } + } + + set.crtc = crtc; + set.x = crtc_req->x; + set.y = crtc_req->y; + set.mode = mode; + set.connectors = connector_set; + set.num_connectors = crtc_req->count_connectors; + set.fb = fb; + ret = crtc->funcs->set_config(&set); + +out: + free(connector_set, DRM_MEM_KMS); + drm_mode_destroy(dev, mode); + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +int drm_mode_cursor_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_cursor *req = data; + struct drm_mode_object *obj; + struct drm_crtc *crtc; + int ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + if (!req->flags) + return (EINVAL); + + sx_xlock(&dev->mode_config.mutex); + obj = drm_mode_object_find(dev, req->crtc_id, DRM_MODE_OBJECT_CRTC); + if (!obj) { + DRM_DEBUG_KMS("Unknown CRTC ID %d\n", req->crtc_id); + ret = EINVAL; + goto out; + } + crtc = obj_to_crtc(obj); + + if (req->flags & DRM_MODE_CURSOR_BO) { + if (!crtc->funcs->cursor_set) { + ret = ENXIO; + goto out; + } + /* Turns off the cursor if handle is 0 */ + ret = -crtc->funcs->cursor_set(crtc, file_priv, req->handle, + req->width, req->height); + } + + if (req->flags & DRM_MODE_CURSOR_MOVE) { + if (crtc->funcs->cursor_move) { + ret = crtc->funcs->cursor_move(crtc, req->x, req->y); + } else { + ret = EFAULT; + goto out; + } + } +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +/* Original addfb only supported RGB formats, so figure out which one */ +uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth) +{ + uint32_t fmt; + + switch (bpp) { + case 8: + fmt = DRM_FORMAT_RGB332; + break; + case 16: + if (depth == 15) + fmt = DRM_FORMAT_XRGB1555; + else + fmt = DRM_FORMAT_RGB565; + break; + case 24: + fmt = DRM_FORMAT_RGB888; + break; + case 32: + if (depth == 24) + fmt = DRM_FORMAT_XRGB8888; + else if (depth == 30) + fmt = DRM_FORMAT_XRGB2101010; + else + fmt = DRM_FORMAT_ARGB8888; + break; + default: + DRM_ERROR("bad bpp, assuming RGB24 pixel format\n"); + fmt = DRM_FORMAT_XRGB8888; + break; + } + + return fmt; +} + +/** + * drm_mode_addfb - add an FB to the graphics configuration + * @inode: inode from the ioctl + * @filp: file * from the ioctl + * @cmd: cmd from ioctl + * @arg: arg from ioctl + * + * LOCKING: + * Takes mode config lock. + * + * Add a new FB to the specified CRTC, given a user request. + * + * Called by the user via ioctl. + * + * RETURNS: + * Zero on success, errno on failure. + */ +int drm_mode_addfb(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_fb_cmd *or = data; + struct drm_mode_fb_cmd2 r = {}; + struct drm_mode_config *config = &dev->mode_config; + struct drm_framebuffer *fb; + int ret = 0; + + /* Use new struct with format internally */ + r.fb_id = or->fb_id; + r.width = or->width; + r.height = or->height; + r.pitches[0] = or->pitch; + r.pixel_format = drm_mode_legacy_fb_format(or->bpp, or->depth); + r.handles[0] = or->handle; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + if ((config->min_width > r.width) || (r.width > config->max_width)) + return (EINVAL); + if ((config->min_height > r.height) || (r.height > config->max_height)) + return (EINVAL); + + sx_xlock(&dev->mode_config.mutex); + + ret = -dev->mode_config.funcs->fb_create(dev, file_priv, &r, &fb); + if (ret != 0) { + DRM_ERROR("could not create framebuffer, error %d\n", ret); + goto out; + } + + or->fb_id = fb->base.id; + list_add(&fb->filp_head, &file_priv->fbs); + DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id); + +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +static int format_check(struct drm_mode_fb_cmd2 *r) +{ + uint32_t format = r->pixel_format & ~DRM_FORMAT_BIG_ENDIAN; + + switch (format) { + case DRM_FORMAT_C8: + case DRM_FORMAT_RGB332: + case DRM_FORMAT_BGR233: + case DRM_FORMAT_XRGB4444: + case DRM_FORMAT_XBGR4444: + case DRM_FORMAT_RGBX4444: + case DRM_FORMAT_BGRX4444: + case DRM_FORMAT_ARGB4444: + case DRM_FORMAT_ABGR4444: + case DRM_FORMAT_RGBA4444: + case DRM_FORMAT_BGRA4444: + case DRM_FORMAT_XRGB1555: + case DRM_FORMAT_XBGR1555: + case DRM_FORMAT_RGBX5551: + case DRM_FORMAT_BGRX5551: + case DRM_FORMAT_ARGB1555: + case DRM_FORMAT_ABGR1555: + case DRM_FORMAT_RGBA5551: + case DRM_FORMAT_BGRA5551: + case DRM_FORMAT_RGB565: + case DRM_FORMAT_BGR565: + case DRM_FORMAT_RGB888: + case DRM_FORMAT_BGR888: + case DRM_FORMAT_XRGB8888: + case DRM_FORMAT_XBGR8888: + case DRM_FORMAT_RGBX8888: + case DRM_FORMAT_BGRX8888: + case DRM_FORMAT_ARGB8888: + case DRM_FORMAT_ABGR8888: + case DRM_FORMAT_RGBA8888: + case DRM_FORMAT_BGRA8888: + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_XBGR2101010: + case DRM_FORMAT_RGBX1010102: + case DRM_FORMAT_BGRX1010102: + case DRM_FORMAT_ARGB2101010: + case DRM_FORMAT_ABGR2101010: + case DRM_FORMAT_RGBA1010102: + case DRM_FORMAT_BGRA1010102: + case DRM_FORMAT_YUYV: + case DRM_FORMAT_YVYU: + case DRM_FORMAT_UYVY: + case DRM_FORMAT_VYUY: + case DRM_FORMAT_AYUV: + case DRM_FORMAT_NV12: + case DRM_FORMAT_NV21: + case DRM_FORMAT_NV16: + case DRM_FORMAT_NV61: + case DRM_FORMAT_YUV410: + case DRM_FORMAT_YVU410: + case DRM_FORMAT_YUV411: + case DRM_FORMAT_YVU411: + case DRM_FORMAT_YUV420: + case DRM_FORMAT_YVU420: + case DRM_FORMAT_YUV422: + case DRM_FORMAT_YVU422: + case DRM_FORMAT_YUV444: + case DRM_FORMAT_YVU444: + return 0; + default: + return (EINVAL); + } +} + +/** + * drm_mode_addfb2 - add an FB to the graphics configuration + * @inode: inode from the ioctl + * @filp: file * from the ioctl + * @cmd: cmd from ioctl + * @arg: arg from ioctl + * + * LOCKING: + * Takes mode config lock. + * + * Add a new FB to the specified CRTC, given a user request with format. + * + * Called by the user via ioctl. + * + * RETURNS: + * Zero on success, errno on failure. + */ +int drm_mode_addfb2(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_fb_cmd2 *r = data; + struct drm_mode_config *config = &dev->mode_config; + struct drm_framebuffer *fb; + int ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + if ((config->min_width > r->width) || (r->width > config->max_width)) { + DRM_ERROR("bad framebuffer width %d, should be >= %d && <= %d\n", + r->width, config->min_width, config->max_width); + return (EINVAL); + } + if ((config->min_height > r->height) || (r->height > config->max_height)) { + DRM_ERROR("bad framebuffer height %d, should be >= %d && <= %d\n", + r->height, config->min_height, config->max_height); + return (EINVAL); + } + + ret = format_check(r); + if (ret) { + DRM_ERROR("bad framebuffer format 0x%08x\n", r->pixel_format); + return ret; + } + + sx_xlock(&dev->mode_config.mutex); + + /* TODO check buffer is sufficiently large */ + /* TODO setup destructor callback */ + + ret = -dev->mode_config.funcs->fb_create(dev, file_priv, r, &fb); + if (ret != 0) { + DRM_ERROR("could not create framebuffer, error %d\n", ret); + goto out; + } + + r->fb_id = fb->base.id; + list_add(&fb->filp_head, &file_priv->fbs); + DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id); + +out: + sx_xunlock(&dev->mode_config.mutex); + return (ret); +} + +/** + * drm_mode_rmfb - remove an FB from the configuration + * @inode: inode from the ioctl + * @filp: file * from the ioctl + * @cmd: cmd from ioctl + * @arg: arg from ioctl + * + * LOCKING: + * Takes mode config lock. + * + * Remove the FB specified by the user. + * + * Called by the user via ioctl. + * + * RETURNS: + * Zero on success, errno on failure. + */ +int drm_mode_rmfb(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_object *obj; + struct drm_framebuffer *fb = NULL; + struct drm_framebuffer *fbl = NULL; + uint32_t *id = data; + int ret = 0; + int found = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + sx_xlock(&dev->mode_config.mutex); + obj = drm_mode_object_find(dev, *id, DRM_MODE_OBJECT_FB); + /* TODO check that we really get a framebuffer back. */ + if (!obj) { + ret = EINVAL; + goto out; + } + fb = obj_to_fb(obj); + + list_for_each_entry(fbl, &file_priv->fbs, filp_head) + if (fb == fbl) + found = 1; + + if (!found) { + ret = EINVAL; + goto out; + } + + /* TODO release all crtc connected to the framebuffer */ + /* TODO unhock the destructor from the buffer object */ + + list_del(&fb->filp_head); + fb->funcs->destroy(fb); + +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +/** + * drm_mode_getfb - get FB info + * @inode: inode from the ioctl + * @filp: file * from the ioctl + * @cmd: cmd from ioctl + * @arg: arg from ioctl + * + * LOCKING: + * Takes mode config lock. + * + * Lookup the FB given its ID and return info about it. + * + * Called by the user via ioctl. + * + * RETURNS: + * Zero on success, errno on failure. + */ +int drm_mode_getfb(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_fb_cmd *r = data; + struct drm_mode_object *obj; + struct drm_framebuffer *fb; + int ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + sx_xlock(&dev->mode_config.mutex); + obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); + if (!obj) { + ret = EINVAL; + goto out; + } + fb = obj_to_fb(obj); + + r->height = fb->height; + r->width = fb->width; + r->depth = fb->depth; + r->bpp = fb->bits_per_pixel; + r->pitch = fb->pitches[0]; + fb->funcs->create_handle(fb, file_priv, &r->handle); + +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +int drm_mode_dirtyfb_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_clip_rect __user *clips_ptr; + struct drm_clip_rect *clips = NULL; + struct drm_mode_fb_dirty_cmd *r = data; + struct drm_mode_object *obj; + struct drm_framebuffer *fb; + unsigned flags; + int num_clips; + int ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return (EINVAL); + + sx_xlock(&dev->mode_config.mutex); + obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); + if (!obj) { + ret = EINVAL; + goto out_err1; + } + fb = obj_to_fb(obj); + + num_clips = r->num_clips; + clips_ptr = (struct drm_clip_rect *)(unsigned long)r->clips_ptr; + + if (!num_clips != !clips_ptr) { + ret = EINVAL; + goto out_err1; + } + + flags = DRM_MODE_FB_DIRTY_FLAGS & r->flags; + + /* If userspace annotates copy, clips must come in pairs */ + if (flags & DRM_MODE_FB_DIRTY_ANNOTATE_COPY && (num_clips % 2)) { + ret = EINVAL; + goto out_err1; + } + + if (num_clips && clips_ptr) { + if (num_clips < 0 || num_clips > DRM_MODE_FB_DIRTY_MAX_CLIPS) { + ret = EINVAL; + goto out_err1; + } + clips = malloc(num_clips * sizeof(*clips), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + ret = copyin(clips_ptr, clips, num_clips * sizeof(*clips)); + if (ret) + goto out_err2; + } + + if (fb->funcs->dirty) { + ret = -fb->funcs->dirty(fb, file_priv, flags, r->color, + clips, num_clips); + } else { + ret = ENOSYS; + goto out_err2; + } + +out_err2: + free(clips, DRM_MEM_KMS); +out_err1: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + + +/** + * drm_fb_release - remove and free the FBs on this file + * @filp: file * from the ioctl + * + * LOCKING: + * Takes mode config lock. + * + * Destroy all the FBs associated with @filp. + * + * Called by the user via ioctl. + * + * RETURNS: + * Zero on success, errno on failure. + */ +void drm_fb_release(struct drm_file *priv) +{ +#if 1 + struct drm_device *dev = priv->dev; +#else + struct drm_device *dev = priv->minor->dev; +#endif + struct drm_framebuffer *fb, *tfb; + + sx_xlock(&dev->mode_config.mutex); + list_for_each_entry_safe(fb, tfb, &priv->fbs, filp_head) { + list_del(&fb->filp_head); + fb->funcs->destroy(fb); + } + sx_xunlock(&dev->mode_config.mutex); +} + +/** + * drm_mode_attachmode - add a mode to the user mode list + * @dev: DRM device + * @connector: connector to add the mode to + * @mode: mode to add + * + * Add @mode to @connector's user mode list. + */ +static void drm_mode_attachmode(struct drm_device *dev, + struct drm_connector *connector, + struct drm_display_mode *mode) +{ + list_add_tail(&mode->head, &connector->user_modes); +} + +int drm_mode_attachmode_crtc(struct drm_device *dev, struct drm_crtc *crtc, + const struct drm_display_mode *mode) +{ + struct drm_connector *connector; + int ret = 0; + struct drm_display_mode *dup_mode, *next; + DRM_LIST_HEAD(list); + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + if (!connector->encoder) + continue; + if (connector->encoder->crtc == crtc) { + dup_mode = drm_mode_duplicate(dev, mode); + if (!dup_mode) { + ret = ENOMEM; + goto out; + } + list_add_tail(&dup_mode->head, &list); + } + } + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + if (!connector->encoder) + continue; + if (connector->encoder->crtc == crtc) + list_move_tail(list.next, &connector->user_modes); + } + + MPASS(!list_empty(&list)); + + out: + list_for_each_entry_safe(dup_mode, next, &list, head) + drm_mode_destroy(dev, dup_mode); + + return ret; +} + +static int drm_mode_detachmode(struct drm_device *dev, + struct drm_connector *connector, + struct drm_display_mode *mode) +{ + int found = 0; + int ret = 0; + struct drm_display_mode *match_mode, *t; + + list_for_each_entry_safe(match_mode, t, &connector->user_modes, head) { + if (drm_mode_equal(match_mode, mode)) { + list_del(&match_mode->head); + drm_mode_destroy(dev, match_mode); + found = 1; + break; + } + } + + if (!found) + ret = -EINVAL; + + return ret; +} + +int drm_mode_detachmode_crtc(struct drm_device *dev, struct drm_display_mode *mode) +{ + struct drm_connector *connector; + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + drm_mode_detachmode(dev, connector, mode); + } + return 0; +} + +/** + * drm_fb_attachmode - Attach a user mode to an connector + * @inode: inode from the ioctl + * @filp: file * from the ioctl + * @cmd: cmd from ioctl + * @arg: arg from ioctl + * + * This attaches a user specified mode to an connector. + * Called by the user via ioctl. + * + * RETURNS: + * Zero on success, errno on failure. + */ +int drm_mode_attachmode_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_mode_cmd *mode_cmd = data; + struct drm_connector *connector; + struct drm_display_mode *mode; + struct drm_mode_object *obj; + struct drm_mode_modeinfo *umode = &mode_cmd->mode; + int ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return -EINVAL; + + sx_xlock(&dev->mode_config.mutex); + + obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); + if (!obj) { + ret = -EINVAL; + goto out; + } + connector = obj_to_connector(obj); + + mode = drm_mode_create(dev); + if (!mode) { + ret = -ENOMEM; + goto out; + } + + ret = drm_crtc_convert_umode(mode, umode); + if (ret) { + DRM_DEBUG_KMS("Invalid mode\n"); + drm_mode_destroy(dev, mode); + goto out; + } + + drm_mode_attachmode(dev, connector, mode); +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + + +/** + * drm_fb_detachmode - Detach a user specified mode from an connector + * @inode: inode from the ioctl + * @filp: file * from the ioctl + * @cmd: cmd from ioctl + * @arg: arg from ioctl + * + * Called by the user via ioctl. + * + * RETURNS: + * Zero on success, errno on failure. + */ +int drm_mode_detachmode_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_object *obj; + struct drm_mode_mode_cmd *mode_cmd = data; + struct drm_connector *connector; + struct drm_display_mode mode; + struct drm_mode_modeinfo *umode = &mode_cmd->mode; + int ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return -EINVAL; + + sx_xlock(&dev->mode_config.mutex); + + obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); + if (!obj) { + ret = -EINVAL; + goto out; + } + connector = obj_to_connector(obj); + + ret = drm_crtc_convert_umode(&mode, umode); + if (ret) { + DRM_DEBUG_KMS("Invalid mode\n"); + goto out; + } + + ret = drm_mode_detachmode(dev, connector, &mode); +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +struct drm_property *drm_property_create(struct drm_device *dev, int flags, + const char *name, int num_values) +{ + struct drm_property *property = NULL; + int ret; + + property = malloc(sizeof(struct drm_property), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + if (num_values) { + property->values = malloc(sizeof(uint64_t)*num_values, DRM_MEM_KMS, + M_WAITOK | M_ZERO); + } + + ret = drm_mode_object_get(dev, &property->base, DRM_MODE_OBJECT_PROPERTY); + if (ret) + goto fail; + property->flags = flags; + property->num_values = num_values; + INIT_LIST_HEAD(&property->enum_blob_list); + + if (name) { + strncpy(property->name, name, DRM_PROP_NAME_LEN); + property->name[DRM_PROP_NAME_LEN-1] = '\0'; + } + + list_add_tail(&property->head, &dev->mode_config.property_list); + return property; + +fail: + free(property->values, DRM_MEM_KMS); + free(property, DRM_MEM_KMS); + return (NULL); +} + +struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags, + const char *name, + const struct drm_prop_enum_list *props, + int num_values) +{ + struct drm_property *property; + int i, ret; + + flags |= DRM_MODE_PROP_ENUM; + + property = drm_property_create(dev, flags, name, num_values); + if (!property) + return NULL; + + for (i = 0; i < num_values; i++) { + ret = drm_property_add_enum(property, i, + props[i].type, + props[i].name); + if (ret) { + drm_property_destroy(dev, property); + return NULL; + } + } + + return property; +} + +struct drm_property *drm_property_create_range(struct drm_device *dev, int flags, + const char *name, + uint64_t min, uint64_t max) +{ + struct drm_property *property; + + flags |= DRM_MODE_PROP_RANGE; + + property = drm_property_create(dev, flags, name, 2); + if (!property) + return NULL; + + property->values[0] = min; + property->values[1] = max; + + return property; +} + +int drm_property_add_enum(struct drm_property *property, int index, + uint64_t value, const char *name) +{ + struct drm_property_enum *prop_enum; + + if (!(property->flags & DRM_MODE_PROP_ENUM)) + return -EINVAL; + + if (!list_empty(&property->enum_blob_list)) { + list_for_each_entry(prop_enum, &property->enum_blob_list, head) { + if (prop_enum->value == value) { + strncpy(prop_enum->name, name, DRM_PROP_NAME_LEN); + prop_enum->name[DRM_PROP_NAME_LEN-1] = '\0'; + return 0; + } + } + } + + prop_enum = malloc(sizeof(struct drm_property_enum), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + strncpy(prop_enum->name, name, DRM_PROP_NAME_LEN); + prop_enum->name[DRM_PROP_NAME_LEN-1] = '\0'; + prop_enum->value = value; + + property->values[index] = value; + list_add_tail(&prop_enum->head, &property->enum_blob_list); + return 0; +} + +void drm_property_destroy(struct drm_device *dev, struct drm_property *property) +{ + struct drm_property_enum *prop_enum, *pt; + + list_for_each_entry_safe(prop_enum, pt, &property->enum_blob_list, head) { + list_del(&prop_enum->head); + free(prop_enum, DRM_MEM_KMS); + } + + if (property->num_values) + free(property->values, DRM_MEM_KMS); + drm_mode_object_put(dev, &property->base); + list_del(&property->head); + free(property, DRM_MEM_KMS); +} + +int drm_connector_attach_property(struct drm_connector *connector, + struct drm_property *property, uint64_t init_val) +{ + int i; + + for (i = 0; i < DRM_CONNECTOR_MAX_PROPERTY; i++) { + if (connector->property_ids[i] == 0) { + connector->property_ids[i] = property->base.id; + connector->property_values[i] = init_val; + break; + } + } + + if (i == DRM_CONNECTOR_MAX_PROPERTY) + return -EINVAL; + return 0; +} + +int drm_connector_property_set_value(struct drm_connector *connector, + struct drm_property *property, uint64_t value) +{ + int i; + + for (i = 0; i < DRM_CONNECTOR_MAX_PROPERTY; i++) { + if (connector->property_ids[i] == property->base.id) { + connector->property_values[i] = value; + break; + } + } + + if (i == DRM_CONNECTOR_MAX_PROPERTY) + return -EINVAL; + return 0; +} + +int drm_connector_property_get_value(struct drm_connector *connector, + struct drm_property *property, uint64_t *val) +{ + int i; + + for (i = 0; i < DRM_CONNECTOR_MAX_PROPERTY; i++) { + if (connector->property_ids[i] == property->base.id) { + *val = connector->property_values[i]; + break; + } + } + + if (i == DRM_CONNECTOR_MAX_PROPERTY) + return -EINVAL; + return 0; +} + +int drm_mode_getproperty_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_object *obj; + struct drm_mode_get_property *out_resp = data; + struct drm_property *property; + int enum_count = 0; + int blob_count = 0; + int value_count = 0; + int ret = 0, i; + int copied; + struct drm_property_enum *prop_enum; + struct drm_mode_property_enum __user *enum_ptr; + struct drm_property_blob *prop_blob; + uint32_t *blob_id_ptr; + uint64_t *values_ptr; + uint32_t *blob_length_ptr; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return -EINVAL; + + sx_xlock(&dev->mode_config.mutex); + obj = drm_mode_object_find(dev, out_resp->prop_id, DRM_MODE_OBJECT_PROPERTY); + if (!obj) { + ret = -EINVAL; + goto done; + } + property = obj_to_property(obj); + + if (property->flags & DRM_MODE_PROP_ENUM) { + list_for_each_entry(prop_enum, &property->enum_blob_list, head) + enum_count++; + } else if (property->flags & DRM_MODE_PROP_BLOB) { + list_for_each_entry(prop_blob, &property->enum_blob_list, head) + blob_count++; + } + + value_count = property->num_values; + + strncpy(out_resp->name, property->name, DRM_PROP_NAME_LEN); + out_resp->name[DRM_PROP_NAME_LEN-1] = 0; + out_resp->flags = property->flags; + + if ((out_resp->count_values >= value_count) && value_count) { + values_ptr = (uint64_t *)(uintptr_t)out_resp->values_ptr; + for (i = 0; i < value_count; i++) { + if (copyout(&property->values[i], values_ptr + i, sizeof(uint64_t))) { + ret = -EFAULT; + goto done; + } + } + } + out_resp->count_values = value_count; + + if (property->flags & DRM_MODE_PROP_ENUM) { + if ((out_resp->count_enum_blobs >= enum_count) && enum_count) { + copied = 0; + enum_ptr = (struct drm_mode_property_enum *)(uintptr_t)out_resp->enum_blob_ptr; + list_for_each_entry(prop_enum, &property->enum_blob_list, head) { + + if (copyout(&prop_enum->value, &enum_ptr[copied].value, sizeof(uint64_t))) { + ret = -EFAULT; + goto done; + } + + if (copyout(&prop_enum->name, + &enum_ptr[copied].name,DRM_PROP_NAME_LEN)) { + ret = -EFAULT; + goto done; + } + copied++; + } + } + out_resp->count_enum_blobs = enum_count; + } + + if (property->flags & DRM_MODE_PROP_BLOB) { + if ((out_resp->count_enum_blobs >= blob_count) && blob_count) { + copied = 0; + blob_id_ptr = (uint32_t *)(uintptr_t)out_resp->enum_blob_ptr; + blob_length_ptr = (uint32_t *)(uintptr_t)out_resp->values_ptr; + + list_for_each_entry(prop_blob, &property->enum_blob_list, head) { + if (copyout(&prop_blob->base.id, + blob_id_ptr + copied, sizeof(uint32_t))) { + ret = -EFAULT; + goto done; + } + + if (copyout(&prop_blob->length, + blob_length_ptr + copied, sizeof(uint32_t))) { + ret = -EFAULT; + goto done; + } + + copied++; + } + } + out_resp->count_enum_blobs = blob_count; + } +done: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +static struct drm_property_blob *drm_property_create_blob(struct drm_device *dev, int length, + void *data) +{ + struct drm_property_blob *blob; + int ret; + + if (!length || !data) + return NULL; + + blob = malloc(sizeof(struct drm_property_blob) + length, DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + ret = drm_mode_object_get(dev, &blob->base, DRM_MODE_OBJECT_BLOB); + if (ret) { + free(blob, DRM_MEM_KMS); + return (NULL); + } + + blob->length = length; + + memcpy(blob->data, data, length); + + list_add_tail(&blob->head, &dev->mode_config.property_blob_list); + return blob; +} + +static void drm_property_destroy_blob(struct drm_device *dev, + struct drm_property_blob *blob) +{ + drm_mode_object_put(dev, &blob->base); + list_del(&blob->head); + free(blob, DRM_MEM_KMS); +} + +int drm_mode_getblob_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_object *obj; + struct drm_mode_get_blob *out_resp = data; + struct drm_property_blob *blob; + int ret = 0; + void *blob_ptr; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return -EINVAL; + + sx_xlock(&dev->mode_config.mutex); + obj = drm_mode_object_find(dev, out_resp->blob_id, DRM_MODE_OBJECT_BLOB); + if (!obj) { + ret = -EINVAL; + goto done; + } + blob = obj_to_blob(obj); + + if (out_resp->length == blob->length) { + blob_ptr = (void *)(unsigned long)out_resp->data; + if (copyout(blob->data, blob_ptr, blob->length)){ + ret = -EFAULT; + goto done; + } + } + out_resp->length = blob->length; + +done: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +int drm_mode_connector_update_edid_property(struct drm_connector *connector, + struct edid *edid) +{ + struct drm_device *dev = connector->dev; + int ret = 0, size; + + if (connector->edid_blob_ptr) + drm_property_destroy_blob(dev, connector->edid_blob_ptr); + + /* Delete edid, when there is none. */ + if (!edid) { + connector->edid_blob_ptr = NULL; + ret = drm_connector_property_set_value(connector, dev->mode_config.edid_property, 0); + return ret; + } + + size = EDID_LENGTH * (1 + edid->extensions); + connector->edid_blob_ptr = drm_property_create_blob(connector->dev, + size, edid); + + ret = drm_connector_property_set_value(connector, + dev->mode_config.edid_property, + connector->edid_blob_ptr->base.id); + + return ret; +} + +int drm_mode_connector_property_set_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_connector_set_property *out_resp = data; + struct drm_mode_object *obj; + struct drm_property *property; + struct drm_connector *connector; + int ret = -EINVAL; + int i; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return -EINVAL; + + sx_xlock(&dev->mode_config.mutex); + + obj = drm_mode_object_find(dev, out_resp->connector_id, DRM_MODE_OBJECT_CONNECTOR); + if (!obj) { + goto out; + } + connector = obj_to_connector(obj); + + for (i = 0; i < DRM_CONNECTOR_MAX_PROPERTY; i++) { + if (connector->property_ids[i] == out_resp->prop_id) + break; + } + + if (i == DRM_CONNECTOR_MAX_PROPERTY) { + goto out; + } + + obj = drm_mode_object_find(dev, out_resp->prop_id, DRM_MODE_OBJECT_PROPERTY); + if (!obj) { + goto out; + } + property = obj_to_property(obj); + + if (property->flags & DRM_MODE_PROP_IMMUTABLE) + goto out; + + if (property->flags & DRM_MODE_PROP_RANGE) { + if (out_resp->value < property->values[0]) + goto out; + + if (out_resp->value > property->values[1]) + goto out; + } else { + int found = 0; + for (i = 0; i < property->num_values; i++) { + if (property->values[i] == out_resp->value) { + found = 1; + break; + } + } + if (!found) { + goto out; + } + } + + /* Do DPMS ourselves */ + if (property == connector->dev->mode_config.dpms_property) { + if (connector->funcs->dpms) + (*connector->funcs->dpms)(connector, (int) out_resp->value); + ret = 0; + } else if (connector->funcs->set_property) + ret = connector->funcs->set_property(connector, property, out_resp->value); + + /* store the property value if successful */ + if (!ret) + drm_connector_property_set_value(connector, property, out_resp->value); +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +int drm_mode_connector_attach_encoder(struct drm_connector *connector, + struct drm_encoder *encoder) +{ + int i; + + for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { + if (connector->encoder_ids[i] == 0) { + connector->encoder_ids[i] = encoder->base.id; + return 0; + } + } + return -ENOMEM; +} + +void drm_mode_connector_detach_encoder(struct drm_connector *connector, + struct drm_encoder *encoder) +{ + int i; + for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { + if (connector->encoder_ids[i] == encoder->base.id) { + connector->encoder_ids[i] = 0; + if (connector->encoder == encoder) + connector->encoder = NULL; + break; + } + } +} + +int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, + int gamma_size) +{ + crtc->gamma_size = gamma_size; + + crtc->gamma_store = malloc(gamma_size * sizeof(uint16_t) * 3, + DRM_MEM_KMS, M_WAITOK | M_ZERO); + + return 0; +} + +int drm_mode_gamma_set_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_crtc_lut *crtc_lut = data; + struct drm_mode_object *obj; + struct drm_crtc *crtc; + void *r_base, *g_base, *b_base; + int size; + int ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return -EINVAL; + + sx_xlock(&dev->mode_config.mutex); + obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); + if (!obj) { + ret = -EINVAL; + goto out; + } + crtc = obj_to_crtc(obj); + + /* memcpy into gamma store */ + if (crtc_lut->gamma_size != crtc->gamma_size) { + ret = -EINVAL; + goto out; + } + + size = crtc_lut->gamma_size * (sizeof(uint16_t)); + r_base = crtc->gamma_store; + if (copyin((void *)(uintptr_t)crtc_lut->red, r_base, size)) { + ret = -EFAULT; + goto out; + } + + g_base = (char *)r_base + size; + if (copyin((void *)(uintptr_t)crtc_lut->green, g_base, size)) { + ret = -EFAULT; + goto out; + } + + b_base = (char *)g_base + size; + if (copyin((void *)(uintptr_t)crtc_lut->blue, b_base, size)) { + ret = -EFAULT; + goto out; + } + + crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, 0, crtc->gamma_size); + +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; + +} + +int drm_mode_gamma_get_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_crtc_lut *crtc_lut = data; + struct drm_mode_object *obj; + struct drm_crtc *crtc; + void *r_base, *g_base, *b_base; + int size; + int ret = 0; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return -EINVAL; + + sx_xlock(&dev->mode_config.mutex); + obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); + if (!obj) { + ret = -EINVAL; + goto out; + } + crtc = obj_to_crtc(obj); + + /* memcpy into gamma store */ + if (crtc_lut->gamma_size != crtc->gamma_size) { + ret = -EINVAL; + goto out; + } + + size = crtc_lut->gamma_size * (sizeof(uint16_t)); + r_base = crtc->gamma_store; + if (copyout(r_base, (void *)(uintptr_t)crtc_lut->red, size)) { + ret = -EFAULT; + goto out; + } + + g_base = (char *)r_base + size; + if (copyout(g_base, (void *)(uintptr_t)crtc_lut->green, size)) { + ret = -EFAULT; + goto out; + } + + b_base = (char *)g_base + size; + if (copyout(b_base, (void *)(uintptr_t)crtc_lut->blue, size)) { + ret = -EFAULT; + goto out; + } +out: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +static void +drm_kms_free(void *arg) +{ + + free(arg, DRM_MEM_KMS); +} + +int drm_mode_page_flip_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_mode_crtc_page_flip *page_flip = data; + struct drm_mode_object *obj; + struct drm_crtc *crtc; + struct drm_framebuffer *fb; + struct drm_pending_vblank_event *e = NULL; + int ret = EINVAL; + + if (page_flip->flags & ~DRM_MODE_PAGE_FLIP_FLAGS || + page_flip->reserved != 0) + return (EINVAL); + + sx_xlock(&dev->mode_config.mutex); + obj = drm_mode_object_find(dev, page_flip->crtc_id, DRM_MODE_OBJECT_CRTC); + if (!obj) + goto out; + crtc = obj_to_crtc(obj); + + if (crtc->fb == NULL) { + /* The framebuffer is currently unbound, presumably + * due to a hotplug event, that userspace has not + * yet discovered. + */ + ret = EBUSY; + goto out; + } + + if (crtc->funcs->page_flip == NULL) + goto out; + + obj = drm_mode_object_find(dev, page_flip->fb_id, DRM_MODE_OBJECT_FB); + if (!obj) + goto out; + fb = obj_to_fb(obj); + + if (crtc->mode.hdisplay > fb->width || + crtc->mode.vdisplay > fb->height || + crtc->x > fb->width - crtc->mode.hdisplay || + crtc->y > fb->height - crtc->mode.vdisplay) { + DRM_DEBUG_KMS("Invalid fb size %ux%u for CRTC viewport %ux%u+%d+%d.\n", + fb->width, fb->height, + crtc->mode.hdisplay, crtc->mode.vdisplay, + crtc->x, crtc->y); + ret = ENOSPC; + goto out; + } + + if (page_flip->flags & DRM_MODE_PAGE_FLIP_EVENT) { + ret = ENOMEM; + mtx_lock(&dev->event_lock); + if (file_priv->event_space < sizeof e->event) { + mtx_unlock(&dev->event_lock); + goto out; + } + file_priv->event_space -= sizeof e->event; + mtx_unlock(&dev->event_lock); + + e = malloc(sizeof *e, DRM_MEM_KMS, M_WAITOK | M_ZERO); + + e->event.base.type = DRM_EVENT_FLIP_COMPLETE; + e->event.base.length = sizeof e->event; + e->event.user_data = page_flip->user_data; + e->base.event = &e->event.base; + e->base.file_priv = file_priv; + e->base.destroy = + (void (*) (struct drm_pending_event *))drm_kms_free; + } + + ret = -crtc->funcs->page_flip(crtc, fb, e); + if (ret != 0) { + if (page_flip->flags & DRM_MODE_PAGE_FLIP_EVENT) { + mtx_lock(&dev->event_lock); + file_priv->event_space += sizeof e->event; + mtx_unlock(&dev->event_lock); + free(e, DRM_MEM_KMS); + } + } + +out: + sx_xunlock(&dev->mode_config.mutex); + CTR3(KTR_DRM, "page_flip_ioctl %d %d %d", curproc->p_pid, + page_flip->crtc_id, ret); + return (ret); +} + +void drm_mode_config_reset(struct drm_device *dev) +{ + struct drm_crtc *crtc; + struct drm_encoder *encoder; + struct drm_connector *connector; + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) + if (crtc->funcs->reset) + crtc->funcs->reset(crtc); + + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) + if (encoder->funcs->reset) + encoder->funcs->reset(encoder); + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) + if (connector->funcs->reset) + connector->funcs->reset(connector); +} + +int drm_mode_create_dumb_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_create_dumb *args = data; + + if (!dev->driver->dumb_create) + return -ENOTSUP; + return dev->driver->dumb_create(file_priv, dev, args); +} + +int drm_mode_mmap_dumb_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_map_dumb *args = data; + + /* call driver ioctl to get mmap offset */ + if (!dev->driver->dumb_map_offset) + return -ENOTSUP; + + return dev->driver->dumb_map_offset(file_priv, dev, args->handle, &args->offset); +} + +int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv) +{ + struct drm_mode_destroy_dumb *args = data; + + if (!dev->driver->dumb_destroy) + return -ENOTSUP; + + return dev->driver->dumb_destroy(file_priv, dev, args->handle); +} + +/* + * Just need to support RGB formats here for compat with code that doesn't + * use pixel formats directly yet. + */ +void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth, + int *bpp) +{ + switch (format) { + case DRM_FORMAT_RGB332: + case DRM_FORMAT_BGR233: + *depth = 8; + *bpp = 8; + break; + case DRM_FORMAT_XRGB1555: + case DRM_FORMAT_XBGR1555: + case DRM_FORMAT_RGBX5551: + case DRM_FORMAT_BGRX5551: + case DRM_FORMAT_ARGB1555: + case DRM_FORMAT_ABGR1555: + case DRM_FORMAT_RGBA5551: + case DRM_FORMAT_BGRA5551: + *depth = 15; + *bpp = 16; + break; + case DRM_FORMAT_RGB565: + case DRM_FORMAT_BGR565: + *depth = 16; + *bpp = 16; + break; + case DRM_FORMAT_RGB888: + case DRM_FORMAT_BGR888: + *depth = 24; + *bpp = 24; + break; + case DRM_FORMAT_XRGB8888: + case DRM_FORMAT_XBGR8888: + case DRM_FORMAT_RGBX8888: + case DRM_FORMAT_BGRX8888: + *depth = 24; + *bpp = 32; + break; + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_XBGR2101010: + case DRM_FORMAT_RGBX1010102: + case DRM_FORMAT_BGRX1010102: + case DRM_FORMAT_ARGB2101010: + case DRM_FORMAT_ABGR2101010: + case DRM_FORMAT_RGBA1010102: + case DRM_FORMAT_BGRA1010102: + *depth = 30; + *bpp = 32; + break; + case DRM_FORMAT_ARGB8888: + case DRM_FORMAT_ABGR8888: + case DRM_FORMAT_RGBA8888: + case DRM_FORMAT_BGRA8888: + *depth = 32; + *bpp = 32; + break; + default: + DRM_DEBUG_KMS("unsupported pixel format\n"); + *depth = 0; + *bpp = 0; + break; + } +} diff --git a/sys/dev/drm2/drm_crtc.h b/sys/dev/drm2/drm_crtc.h new file mode 100644 index 00000000000..a69c5378f57 --- /dev/null +++ b/sys/dev/drm2/drm_crtc.h @@ -0,0 +1,935 @@ +/* + * Copyright © 2006 Keith Packard + * Copyright © 2007-2008 Dave Airlie + * Copyright © 2007-2008 Intel Corporation + * Jesse Barnes + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * $FreeBSD$ + */ +#ifndef __DRM_CRTC_H__ +#define __DRM_CRTC_H__ + +#include +#include + +struct drm_device; +struct drm_mode_set; +struct drm_framebuffer; +struct i2c_adapter; + +#define DRM_MODE_OBJECT_CRTC 0xcccccccc +#define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0 +#define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0 +#define DRM_MODE_OBJECT_MODE 0xdededede +#define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0 +#define DRM_MODE_OBJECT_FB 0xfbfbfbfb +#define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb +#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee + +struct drm_mode_object { + uint32_t id; + uint32_t type; +}; + +/* + * Note on terminology: here, for brevity and convenience, we refer to connector + * control chips as 'CRTCs'. They can control any type of connector, VGA, LVDS, + * DVI, etc. And 'screen' refers to the whole of the visible display, which + * may span multiple monitors (and therefore multiple CRTC and connector + * structures). + */ + +enum drm_mode_status { + MODE_OK = 0, /* Mode OK */ + MODE_HSYNC, /* hsync out of range */ + MODE_VSYNC, /* vsync out of range */ + MODE_H_ILLEGAL, /* mode has illegal horizontal timings */ + MODE_V_ILLEGAL, /* mode has illegal horizontal timings */ + MODE_BAD_WIDTH, /* requires an unsupported linepitch */ + MODE_NOMODE, /* no mode with a maching name */ + MODE_NO_INTERLACE, /* interlaced mode not supported */ + MODE_NO_DBLESCAN, /* doublescan mode not supported */ + MODE_NO_VSCAN, /* multiscan mode not supported */ + MODE_MEM, /* insufficient video memory */ + MODE_VIRTUAL_X, /* mode width too large for specified virtual size */ + MODE_VIRTUAL_Y, /* mode height too large for specified virtual size */ + MODE_MEM_VIRT, /* insufficient video memory given virtual size */ + MODE_NOCLOCK, /* no fixed clock available */ + MODE_CLOCK_HIGH, /* clock required is too high */ + MODE_CLOCK_LOW, /* clock required is too low */ + MODE_CLOCK_RANGE, /* clock/mode isn't in a ClockRange */ + MODE_BAD_HVALUE, /* horizontal timing was out of range */ + MODE_BAD_VVALUE, /* vertical timing was out of range */ + MODE_BAD_VSCAN, /* VScan value out of range */ + MODE_HSYNC_NARROW, /* horizontal sync too narrow */ + MODE_HSYNC_WIDE, /* horizontal sync too wide */ + MODE_HBLANK_NARROW, /* horizontal blanking too narrow */ + MODE_HBLANK_WIDE, /* horizontal blanking too wide */ + MODE_VSYNC_NARROW, /* vertical sync too narrow */ + MODE_VSYNC_WIDE, /* vertical sync too wide */ + MODE_VBLANK_NARROW, /* vertical blanking too narrow */ + MODE_VBLANK_WIDE, /* vertical blanking too wide */ + MODE_PANEL, /* exceeds panel dimensions */ + MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */ + MODE_ONE_WIDTH, /* only one width is supported */ + MODE_ONE_HEIGHT, /* only one height is supported */ + MODE_ONE_SIZE, /* only one resolution is supported */ + MODE_NO_REDUCED, /* monitor doesn't accept reduced blanking */ + MODE_UNVERIFIED = -3, /* mode needs to reverified */ + MODE_BAD = -2, /* unspecified reason */ + MODE_ERROR = -1 /* error condition */ +}; + +#define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \ + DRM_MODE_TYPE_CRTC_C) + +#define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \ + .name = nm, .status = 0, .type = (t), .clock = (c), \ + .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ + .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \ + .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \ + .vscan = (vs), .flags = (f), .vrefresh = 0 + +#define CRTC_INTERLACE_HALVE_V 0x1 /* halve V values for interlacing */ + +struct drm_display_mode { + /* Header */ + struct list_head head; + struct drm_mode_object base; + + char name[DRM_DISPLAY_MODE_LEN]; + + int connector_count; + enum drm_mode_status status; + int type; + + /* Proposed mode values */ + int clock; /* in kHz */ + int hdisplay; + int hsync_start; + int hsync_end; + int htotal; + int hskew; + int vdisplay; + int vsync_start; + int vsync_end; + int vtotal; + int vscan; + unsigned int flags; + + /* Addressable image size (may be 0 for projectors, etc.) */ + int width_mm; + int height_mm; + + /* Actual mode we give to hw */ + int clock_index; + int synth_clock; + int crtc_hdisplay; + int crtc_hblank_start; + int crtc_hblank_end; + int crtc_hsync_start; + int crtc_hsync_end; + int crtc_htotal; + int crtc_hskew; + int crtc_vdisplay; + int crtc_vblank_start; + int crtc_vblank_end; + int crtc_vsync_start; + int crtc_vsync_end; + int crtc_vtotal; + int crtc_hadjusted; + int crtc_vadjusted; + + /* Driver private mode info */ + int private_size; + int *private; + int private_flags; + + int vrefresh; /* in Hz */ + int hsync; /* in kHz */ +}; + +enum drm_connector_status { + connector_status_connected = 1, + connector_status_disconnected = 2, + connector_status_unknown = 3, +}; + +enum subpixel_order { + SubPixelUnknown = 0, + SubPixelHorizontalRGB, + SubPixelHorizontalBGR, + SubPixelVerticalRGB, + SubPixelVerticalBGR, + SubPixelNone, +}; + +#define DRM_COLOR_FORMAT_RGB444 (1<<0) +#define DRM_COLOR_FORMAT_YCRCB444 (1<<1) +#define DRM_COLOR_FORMAT_YCRCB422 (1<<2) +/* + * Describes a given display (e.g. CRT or flat panel) and its limitations. + */ +struct drm_display_info { + char name[DRM_DISPLAY_INFO_LEN]; + + /* Physical size */ + unsigned int width_mm; + unsigned int height_mm; + + /* Clock limits FIXME: storage format */ + unsigned int min_vfreq, max_vfreq; + unsigned int min_hfreq, max_hfreq; + unsigned int pixel_clock; + unsigned int bpc; + + enum subpixel_order subpixel_order; + u32 color_formats; + + u8 cea_rev; + + char *raw_edid; /* if any */ +}; + +struct drm_framebuffer_funcs { + void (*destroy)(struct drm_framebuffer *framebuffer); + int (*create_handle)(struct drm_framebuffer *fb, + struct drm_file *file_priv, + unsigned int *handle); + /** + * Optinal callback for the dirty fb ioctl. + * + * Userspace can notify the driver via this callback + * that a area of the framebuffer has changed and should + * be flushed to the display hardware. + * + * See documentation in drm_mode.h for the struct + * drm_mode_fb_dirty_cmd for more information as all + * the semantics and arguments have a one to one mapping + * on this function. + */ + int (*dirty)(struct drm_framebuffer *framebuffer, + struct drm_file *file_priv, unsigned flags, + unsigned color, struct drm_clip_rect *clips, + unsigned num_clips); +}; + +struct drm_framebuffer { + struct drm_device *dev; + struct list_head head; + struct drm_mode_object base; + const struct drm_framebuffer_funcs *funcs; + unsigned int pitches[4]; + unsigned int offsets[4]; + unsigned int width; + unsigned int height; + /* depth can be 15 or 16 */ + unsigned int depth; + int bits_per_pixel; + int flags; + uint32_t pixel_format; /* fourcc format */ + struct list_head filp_head; + /* if you are using the helper */ + void *helper_private; +}; + +struct drm_property_blob { + struct drm_mode_object base; + struct list_head head; + unsigned int length; + unsigned char data[]; +}; + +struct drm_property_enum { + uint64_t value; + struct list_head head; + char name[DRM_PROP_NAME_LEN]; +}; + +struct drm_property { + struct list_head head; + struct drm_mode_object base; + uint32_t flags; + char name[DRM_PROP_NAME_LEN]; + uint32_t num_values; + uint64_t *values; + + struct list_head enum_blob_list; +}; + +struct drm_crtc; +struct drm_connector; +struct drm_encoder; +struct drm_pending_vblank_event; +struct drm_plane; + +/** + * drm_crtc_funcs - control CRTCs for a given device + * @reset: reset CRTC after state has been invalidate (e.g. resume) + * @dpms: control display power levels + * @save: save CRTC state + * @resore: restore CRTC state + * @lock: lock the CRTC + * @unlock: unlock the CRTC + * @shadow_allocate: allocate shadow pixmap + * @shadow_create: create shadow pixmap for rotation support + * @shadow_destroy: free shadow pixmap + * @mode_fixup: fixup proposed mode + * @mode_set: set the desired mode on the CRTC + * @gamma_set: specify color ramp for CRTC + * @destroy: deinit and free object. + * + * The drm_crtc_funcs structure is the central CRTC management structure + * in the DRM. Each CRTC controls one or more connectors (note that the name + * CRTC is simply historical, a CRTC may control LVDS, VGA, DVI, TV out, etc. + * connectors, not just CRTs). + * + * Each driver is responsible for filling out this structure at startup time, + * in addition to providing other modesetting features, like i2c and DDC + * bus accessors. + */ +struct drm_crtc_funcs { + /* Save CRTC state */ + void (*save)(struct drm_crtc *crtc); /* suspend? */ + /* Restore CRTC state */ + void (*restore)(struct drm_crtc *crtc); /* resume? */ + /* Reset CRTC state */ + void (*reset)(struct drm_crtc *crtc); + + /* cursor controls */ + int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv, + uint32_t handle, uint32_t width, uint32_t height); + int (*cursor_move)(struct drm_crtc *crtc, int x, int y); + + /* Set gamma on the CRTC */ + void (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b, + uint32_t start, uint32_t size); + /* Object destroy routine */ + void (*destroy)(struct drm_crtc *crtc); + + int (*set_config)(struct drm_mode_set *set); + + /* + * Flip to the given framebuffer. This implements the page + * flip ioctl descibed in drm_mode.h, specifically, the + * implementation must return immediately and block all + * rendering to the current fb until the flip has completed. + * If userspace set the event flag in the ioctl, the event + * argument will point to an event to send back when the flip + * completes, otherwise it will be NULL. + */ + int (*page_flip)(struct drm_crtc *crtc, + struct drm_framebuffer *fb, + struct drm_pending_vblank_event *event); +}; + +/** + * drm_crtc - central CRTC control structure + * @enabled: is this CRTC enabled? + * @x: x position on screen + * @y: y position on screen + * @funcs: CRTC control functions + * + * Each CRTC may have one or more connectors associated with it. This structure + * allows the CRTC to be controlled. + */ +struct drm_crtc { + struct drm_device *dev; + struct list_head head; + + struct drm_mode_object base; + + /* framebuffer the connector is currently bound to */ + struct drm_framebuffer *fb; + + bool enabled; + + /* Requested mode from modesetting. */ + struct drm_display_mode mode; + + /* Programmed mode in hw, after adjustments for encoders, + * crtc, panel scaling etc. Needed for timestamping etc. + */ + struct drm_display_mode hwmode; + + int x, y; + const struct drm_crtc_funcs *funcs; + + /* CRTC gamma size for reporting to userspace */ + uint32_t gamma_size; + uint16_t *gamma_store; + + /* Constants needed for precise vblank and swap timestamping. */ + int64_t framedur_ns, linedur_ns, pixeldur_ns; + + /* if you are using the helper */ + void *helper_private; +}; + + +/** + * drm_connector_funcs - control connectors on a given device + * @dpms: set power state (see drm_crtc_funcs above) + * @save: save connector state + * @restore: restore connector state + * @reset: reset connector after state has been invalidate (e.g. resume) + * @mode_valid: is this mode valid on the given connector? + * @mode_fixup: try to fixup proposed mode for this connector + * @mode_set: set this mode + * @detect: is this connector active? + * @get_modes: get mode list for this connector + * @set_property: property for this connector may need update + * @destroy: make object go away + * @force: notify the driver the connector is forced on + * + * Each CRTC may have one or more connectors attached to it. The functions + * below allow the core DRM code to control connectors, enumerate available modes, + * etc. + */ +struct drm_connector_funcs { + void (*dpms)(struct drm_connector *connector, int mode); + void (*save)(struct drm_connector *connector); + void (*restore)(struct drm_connector *connector); + void (*reset)(struct drm_connector *connector); + + /* Check to see if anything is attached to the connector. + * @force is set to false whilst polling, true when checking the + * connector due to user request. @force can be used by the driver + * to avoid expensive, destructive operations during automated + * probing. + */ + enum drm_connector_status (*detect)(struct drm_connector *connector, + bool force); + int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height); + int (*set_property)(struct drm_connector *connector, struct drm_property *property, + uint64_t val); + void (*destroy)(struct drm_connector *connector); + void (*force)(struct drm_connector *connector); +}; + +struct drm_encoder_funcs { + void (*reset)(struct drm_encoder *encoder); + void (*destroy)(struct drm_encoder *encoder); +}; + +#define DRM_CONNECTOR_MAX_UMODES 16 +#define DRM_CONNECTOR_MAX_PROPERTY 16 +#define DRM_CONNECTOR_LEN 32 +#define DRM_CONNECTOR_MAX_ENCODER 2 + +/** + * drm_encoder - central DRM encoder structure + */ +struct drm_encoder { + struct drm_device *dev; + struct list_head head; + + struct drm_mode_object base; + int encoder_type; + uint32_t possible_crtcs; + uint32_t possible_clones; + + struct drm_crtc *crtc; + const struct drm_encoder_funcs *funcs; + void *helper_private; +}; + +enum drm_connector_force { + DRM_FORCE_UNSPECIFIED, + DRM_FORCE_OFF, + DRM_FORCE_ON, /* force on analog part normally */ + DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */ +}; + +/* should we poll this connector for connects and disconnects */ +/* hot plug detectable */ +#define DRM_CONNECTOR_POLL_HPD (1 << 0) +/* poll for connections */ +#define DRM_CONNECTOR_POLL_CONNECT (1 << 1) +/* can cleanly poll for disconnections without flickering the screen */ +/* DACs should rarely do this without a lot of testing */ +#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2) + +#define MAX_ELD_BYTES 128 + +/** + * drm_connector - central DRM connector control structure + * @crtc: CRTC this connector is currently connected to, NULL if none + * @interlace_allowed: can this connector handle interlaced modes? + * @doublescan_allowed: can this connector handle doublescan? + * @available_modes: modes available on this connector (from get_modes() + user) + * @initial_x: initial x position for this connector + * @initial_y: initial y position for this connector + * @status: connector connected? + * @funcs: connector control functions + * + * Each connector may be connected to one or more CRTCs, or may be clonable by + * another connector if they can share a CRTC. Each connector also has a specific + * position in the broader display (referred to as a 'screen' though it could + * span multiple monitors). + */ +struct drm_connector { + struct drm_device *dev; + /* struct device kdev; XXXKIB */ + struct device_attribute *attr; + struct list_head head; + + struct drm_mode_object base; + + int connector_type; + int connector_type_id; + bool interlace_allowed; + bool doublescan_allowed; + struct list_head modes; /* list of modes on this connector */ + + int initial_x, initial_y; + enum drm_connector_status status; + + /* these are modes added by probing with DDC or the BIOS */ + struct list_head probed_modes; + + struct drm_display_info display_info; + const struct drm_connector_funcs *funcs; + + struct list_head user_modes; + struct drm_property_blob *edid_blob_ptr; + u32 property_ids[DRM_CONNECTOR_MAX_PROPERTY]; + uint64_t property_values[DRM_CONNECTOR_MAX_PROPERTY]; + + uint8_t polled; /* DRM_CONNECTOR_POLL_* */ + + /* requested DPMS state */ + int dpms; + + void *helper_private; + + /* forced on connector */ + enum drm_connector_force force; + uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER]; + uint32_t force_encoder_id; + struct drm_encoder *encoder; /* currently active encoder */ + + /* EDID bits */ + uint8_t eld[MAX_ELD_BYTES]; + bool dvi_dual; + int max_tmds_clock; /* in MHz */ + bool latency_present[2]; + int video_latency[2]; /* [0]: progressive, [1]: interlaced */ + int audio_latency[2]; + + int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */ +}; + +/** + * drm_plane_funcs - driver plane control functions + * @update_plane: update the plane configuration + * @disable_plane: shut down the plane + * @destroy: clean up plane resources + */ +struct drm_plane_funcs { + int (*update_plane)(struct drm_plane *plane, + struct drm_crtc *crtc, struct drm_framebuffer *fb, + int crtc_x, int crtc_y, + unsigned int crtc_w, unsigned int crtc_h, + uint32_t src_x, uint32_t src_y, + uint32_t src_w, uint32_t src_h); + int (*disable_plane)(struct drm_plane *plane); + void (*destroy)(struct drm_plane *plane); +}; + +/** + * drm_plane - central DRM plane control structure + * @dev: DRM device this plane belongs to + * @head: for list management + * @base: base mode object + * @possible_crtcs: pipes this plane can be bound to + * @format_types: array of formats supported by this plane + * @format_count: number of formats supported + * @crtc: currently bound CRTC + * @fb: currently bound fb + * @gamma_size: size of gamma table + * @gamma_store: gamma correction table + * @enabled: enabled flag + * @funcs: helper functions + * @helper_private: storage for drver layer + */ +struct drm_plane { + struct drm_device *dev; + struct list_head head; + + struct drm_mode_object base; + + uint32_t possible_crtcs; + uint32_t *format_types; + uint32_t format_count; + + struct drm_crtc *crtc; + struct drm_framebuffer *fb; + + /* CRTC gamma size for reporting to userspace */ + uint32_t gamma_size; + uint16_t *gamma_store; + + bool enabled; + + const struct drm_plane_funcs *funcs; + void *helper_private; +}; + +/** + * struct drm_mode_set + * + * Represents a single crtc the connectors that it drives with what mode + * and from which framebuffer it scans out from. + * + * This is used to set modes. + */ +struct drm_mode_set { + struct list_head head; + + struct drm_framebuffer *fb; + struct drm_crtc *crtc; + struct drm_display_mode *mode; + + uint32_t x; + uint32_t y; + + struct drm_connector **connectors; + size_t num_connectors; +}; + +/** + * struct drm_mode_config_funcs - configure CRTCs for a given screen layout + */ +struct drm_mode_config_funcs { + int (*fb_create)(struct drm_device *dev, + struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd, + struct drm_framebuffer **res); + void (*output_poll_changed)(struct drm_device *dev); +}; + +struct drm_mode_group { + uint32_t num_crtcs; + uint32_t num_encoders; + uint32_t num_connectors; + + /* list of object IDs for this group */ + uint32_t *id_list; +}; + +/** + * drm_mode_config - Mode configuration control structure + * + */ +struct drm_mode_config { + struct sx mutex; /* protects configuration (mode lists etc.) */ + struct drm_gem_names crtc_names; /* use this idr for all IDs, fb, crtc, connector, modes */ + /* this is limited to one for now */ + int num_fb; + struct list_head fb_list; + int num_connector; + struct list_head connector_list; + int num_encoder; + struct list_head encoder_list; + int num_plane; + struct list_head plane_list; + + int num_crtc; + struct list_head crtc_list; + + struct list_head property_list; + + int min_width, min_height; + int max_width, max_height; + struct drm_mode_config_funcs *funcs; + resource_size_t fb_base; + + /* output poll support */ + bool poll_enabled; + struct timeout_task output_poll_task; + + /* pointers to standard properties */ + struct list_head property_blob_list; + struct drm_property *edid_property; + struct drm_property *dpms_property; + + /* DVI-I properties */ + struct drm_property *dvi_i_subconnector_property; + struct drm_property *dvi_i_select_subconnector_property; + + /* TV properties */ + struct drm_property *tv_subconnector_property; + struct drm_property *tv_select_subconnector_property; + struct drm_property *tv_mode_property; + struct drm_property *tv_left_margin_property; + struct drm_property *tv_right_margin_property; + struct drm_property *tv_top_margin_property; + struct drm_property *tv_bottom_margin_property; + struct drm_property *tv_brightness_property; + struct drm_property *tv_contrast_property; + struct drm_property *tv_flicker_reduction_property; + struct drm_property *tv_overscan_property; + struct drm_property *tv_saturation_property; + struct drm_property *tv_hue_property; + + /* Optional properties */ + struct drm_property *scaling_mode_property; + struct drm_property *dithering_mode_property; + struct drm_property *dirty_info_property; + + /* dumb ioctl parameters */ + uint32_t preferred_depth, prefer_shadow; +}; + +#define obj_to_crtc(x) container_of(x, struct drm_crtc, base) +#define obj_to_connector(x) container_of(x, struct drm_connector, base) +#define obj_to_encoder(x) container_of(x, struct drm_encoder, base) +#define obj_to_mode(x) container_of(x, struct drm_display_mode, base) +#define obj_to_fb(x) container_of(x, struct drm_framebuffer, base) +#define obj_to_property(x) container_of(x, struct drm_property, base) +#define obj_to_blob(x) container_of(x, struct drm_property_blob, base) +#define obj_to_plane(x) container_of(x, struct drm_plane, base) + +struct drm_prop_enum_list { + int type; + char *name; +}; + +#if defined(MODE_SETTING_LOCKING_IS_NOT_BROKEN) +#define DRM_MODE_CONFIG_ASSERT_LOCKED(dev) \ + sx_assert(&dev->mode_config.mutex, SA_XLOCKED) +#else +#define DRM_MODE_CONFIG_ASSERT_LOCKED(dev) +#endif + +extern char *drm_get_dirty_info_name(int val); +extern char *drm_get_connector_status_name(enum drm_connector_status status); + +extern int drm_crtc_init(struct drm_device *dev, + struct drm_crtc *crtc, + const struct drm_crtc_funcs *funcs); +extern void drm_crtc_cleanup(struct drm_crtc *crtc); + +extern int drm_connector_init(struct drm_device *dev, + struct drm_connector *connector, + const struct drm_connector_funcs *funcs, + int connector_type); + +extern void drm_connector_cleanup(struct drm_connector *connector); + +extern int drm_encoder_init(struct drm_device *dev, + struct drm_encoder *encoder, + const struct drm_encoder_funcs *funcs, + int encoder_type); + +extern int drm_plane_init(struct drm_device *dev, + struct drm_plane *plane, + unsigned long possible_crtcs, + const struct drm_plane_funcs *funcs, + const uint32_t *formats, uint32_t format_count, + bool priv); +extern void drm_plane_cleanup(struct drm_plane *plane); + +extern void drm_encoder_cleanup(struct drm_encoder *encoder); + +extern char *drm_get_connector_name(struct drm_connector *connector); +extern char *drm_get_dpms_name(int val); +extern char *drm_get_dvi_i_subconnector_name(int val); +extern char *drm_get_dvi_i_select_name(int val); +extern char *drm_get_tv_subconnector_name(int val); +extern char *drm_get_tv_select_name(int val); +extern void drm_fb_release(struct drm_file *file_priv); +extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group); +extern struct edid *drm_get_edid(struct drm_connector *connector, + device_t adapter); +extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid); +extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode); +extern void drm_mode_remove(struct drm_connector *connector, struct drm_display_mode *mode); +extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, + const struct drm_display_mode *mode); +extern void drm_mode_debug_printmodeline(struct drm_display_mode *mode); +extern void drm_mode_config_init(struct drm_device *dev); +extern void drm_mode_config_reset(struct drm_device *dev); +extern void drm_mode_config_cleanup(struct drm_device *dev); +extern void drm_mode_set_name(struct drm_display_mode *mode); +extern bool drm_mode_equal(struct drm_display_mode *mode1, struct drm_display_mode *mode2); +extern int drm_mode_width(struct drm_display_mode *mode); +extern int drm_mode_height(struct drm_display_mode *mode); + +/* for us by fb module */ +extern int drm_mode_attachmode_crtc(struct drm_device *dev, + struct drm_crtc *crtc, + const struct drm_display_mode *mode); +extern int drm_mode_detachmode_crtc(struct drm_device *dev, struct drm_display_mode *mode); + +extern struct drm_display_mode *drm_mode_create(struct drm_device *dev); +extern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode); +extern void drm_mode_list_concat(struct list_head *head, + struct list_head *new); +extern void drm_mode_validate_size(struct drm_device *dev, + struct list_head *mode_list, + int maxX, int maxY, int maxPitch); +extern void drm_mode_validate_clocks(struct drm_device *dev, + struct list_head *mode_list, + int *min, int *max, int n_ranges); +extern void drm_mode_prune_invalid(struct drm_device *dev, + struct list_head *mode_list, bool verbose); +extern void drm_mode_sort(struct list_head *mode_list); +extern int drm_mode_hsync(const struct drm_display_mode *mode); +extern int drm_mode_vrefresh(const struct drm_display_mode *mode); +extern void drm_mode_set_crtcinfo(struct drm_display_mode *p, + int adjust_flags); +extern void drm_mode_connector_list_update(struct drm_connector *connector); +extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, + struct edid *edid); +extern int drm_connector_property_set_value(struct drm_connector *connector, + struct drm_property *property, + uint64_t value); +extern int drm_connector_property_get_value(struct drm_connector *connector, + struct drm_property *property, + uint64_t *value); +extern struct drm_display_mode *drm_crtc_mode_create(struct drm_device *dev); +extern void drm_framebuffer_set_object(struct drm_device *dev, + unsigned long handle); +extern int drm_framebuffer_init(struct drm_device *dev, + struct drm_framebuffer *fb, + const struct drm_framebuffer_funcs *funcs); +extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb); +extern int drmfb_probe(struct drm_device *dev, struct drm_crtc *crtc); +extern int drmfb_remove(struct drm_device *dev, struct drm_framebuffer *fb); +extern void drm_crtc_probe_connector_modes(struct drm_device *dev, int maxX, int maxY); +extern bool drm_crtc_in_use(struct drm_crtc *crtc); + +extern int drm_connector_attach_property(struct drm_connector *connector, + struct drm_property *property, uint64_t init_val); +extern struct drm_property *drm_property_create(struct drm_device *dev, int flags, + const char *name, int num_values); +extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags, + const char *name, + const struct drm_prop_enum_list *props, + int num_values); +struct drm_property *drm_property_create_range(struct drm_device *dev, int flags, + const char *name, + uint64_t min, uint64_t max); +extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property); +extern int drm_property_add_enum(struct drm_property *property, int index, + uint64_t value, const char *name); +extern int drm_mode_create_dvi_i_properties(struct drm_device *dev); +extern int drm_mode_create_tv_properties(struct drm_device *dev, int num_formats, + char *formats[]); +extern int drm_mode_create_scaling_mode_property(struct drm_device *dev); +extern int drm_mode_create_dithering_property(struct drm_device *dev); +extern int drm_mode_create_dirty_info_property(struct drm_device *dev); +extern char *drm_get_encoder_name(struct drm_encoder *encoder); + +extern int drm_mode_connector_attach_encoder(struct drm_connector *connector, + struct drm_encoder *encoder); +extern void drm_mode_connector_detach_encoder(struct drm_connector *connector, + struct drm_encoder *encoder); +extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, + int gamma_size); +extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev, + uint32_t id, uint32_t type); +/* IOCTLs */ +extern int drm_mode_getresources(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_getplane_res(struct drm_device *dev, void *data, + struct drm_file *file_priv); +extern int drm_mode_getcrtc(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_getconnector(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_setcrtc(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_getplane(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_setplane(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_cursor_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_addfb(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_addfb2(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth); +extern int drm_mode_rmfb(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_getfb(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_dirtyfb_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_addmode_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_rmmode_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_attachmode_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_detachmode_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); + +extern int drm_mode_getproperty_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_getblob_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_hotplug_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_replacefb(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_getencoder(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_gamma_get_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_gamma_set_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern bool drm_detect_hdmi_monitor(struct edid *edid); +extern bool drm_detect_monitor_audio(struct edid *edid); +extern int drm_mode_page_flip_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, + int hdisplay, int vdisplay, int vrefresh, + bool reduced, bool interlaced, bool margins); +extern struct drm_display_mode *drm_gtf_mode(struct drm_device *dev, + int hdisplay, int vdisplay, int vrefresh, + bool interlaced, int margins); +extern struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev, + int hdisplay, int vdisplay, int vrefresh, + bool interlaced, int margins, int GTF_M, + int GTF_2C, int GTF_K, int GTF_2J); +extern int drm_add_modes_noedid(struct drm_connector *connector, + int hdisplay, int vdisplay); + +extern int drm_edid_header_is_valid(const u8 *raw_edid); +extern bool drm_edid_is_valid(struct edid *edid); +struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, + int hsize, int vsize, int fresh); + +extern int drm_mode_create_dumb_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_mmap_dumb_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); +extern int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, + void *data, struct drm_file *file_priv); + +extern void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth, + int *bpp); +#endif /* __DRM_CRTC_H__ */ diff --git a/sys/dev/drm2/drm_crtc_helper.c b/sys/dev/drm2/drm_crtc_helper.c new file mode 100644 index 00000000000..b798a57bae1 --- /dev/null +++ b/sys/dev/drm2/drm_crtc_helper.c @@ -0,0 +1,1043 @@ +/* + * Copyright (c) 2006-2008 Intel Corporation + * Copyright (c) 2007 Dave Airlie + * + * DRM core CRTC related functions + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + * + * Authors: + * Keith Packard + * Eric Anholt + * Dave Airlie + * Jesse Barnes + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +bool +drm_fetch_cmdline_mode_from_kenv(struct drm_connector *connector, + struct drm_cmdline_mode *cmdline_mode) +{ + char *tun_var_name, *tun_mode; + static const char tun_prefix[] = "drm_mode."; + bool res; + + res = false; + tun_var_name = malloc(sizeof(tun_prefix) + + strlen(drm_get_connector_name(connector)), M_TEMP, M_WAITOK); + strcpy(tun_var_name, tun_prefix); + strcat(tun_var_name, drm_get_connector_name(connector)); + tun_mode = getenv(tun_var_name); + if (tun_mode != NULL) { + res = drm_mode_parse_command_line_for_connector(tun_mode, + connector, cmdline_mode); + freeenv(tun_mode); + } + free(tun_var_name, M_TEMP); + return (res); +} + +static bool drm_kms_helper_poll = true; + +static void drm_mode_validate_flag(struct drm_connector *connector, + int flags) +{ + struct drm_display_mode *mode, *t; + + if (flags == (DRM_MODE_FLAG_DBLSCAN | DRM_MODE_FLAG_INTERLACE)) + return; + + list_for_each_entry_safe(mode, t, &connector->modes, head) { + if ((mode->flags & DRM_MODE_FLAG_INTERLACE) && + !(flags & DRM_MODE_FLAG_INTERLACE)) + mode->status = MODE_NO_INTERLACE; + if ((mode->flags & DRM_MODE_FLAG_DBLSCAN) && + !(flags & DRM_MODE_FLAG_DBLSCAN)) + mode->status = MODE_NO_DBLESCAN; + } + + return; +} + +/** + * drm_helper_probe_single_connector_modes - get complete set of display modes + * @dev: DRM device + * @maxX: max width for modes + * @maxY: max height for modes + * + * LOCKING: + * Caller must hold mode config lock. + * + * Based on @dev's mode_config layout, scan all the connectors and try to detect + * modes on them. Modes will first be added to the connector's probed_modes + * list, then culled (based on validity and the @maxX, @maxY parameters) and + * put into the normal modes list. + * + * Intended to be used either at bootup time or when major configuration + * changes have occurred. + * + * FIXME: take into account monitor limits + * + * RETURNS: + * Number of modes found on @connector. + */ +int drm_helper_probe_single_connector_modes(struct drm_connector *connector, + uint32_t maxX, uint32_t maxY) +{ + struct drm_device *dev = connector->dev; + struct drm_display_mode *mode, *t; + struct drm_connector_helper_funcs *connector_funcs = + connector->helper_private; + struct drm_cmdline_mode cmdline_mode; + int count = 0; + int mode_flags = 0; + + DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id, + drm_get_connector_name(connector)); + /* set all modes to the unverified state */ + list_for_each_entry_safe(mode, t, &connector->modes, head) + mode->status = MODE_UNVERIFIED; + + if (connector->force) { + if (connector->force == DRM_FORCE_ON) + connector->status = connector_status_connected; + else + connector->status = connector_status_disconnected; + if (connector->funcs->force) + connector->funcs->force(connector); + } else { + connector->status = connector->funcs->detect(connector, true); + drm_kms_helper_poll_enable(dev); + } + + if (connector->status == connector_status_disconnected) { + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] disconnected\n", + connector->base.id, drm_get_connector_name(connector)); + drm_mode_connector_update_edid_property(connector, NULL); + goto prune; + } + + count = (*connector_funcs->get_modes)(connector); + if (count == 0 && drm_fetch_cmdline_mode_from_kenv(connector, + &cmdline_mode)) { + mode = drm_mode_create_from_cmdline_mode(dev, + &cmdline_mode); + if (mode != NULL) { + DRM_DEBUG_KMS( + "[CONNECTOR:%d:%s] found manual override ", + connector->base.id, + drm_get_connector_name(connector)); + drm_mode_debug_printmodeline(mode); + drm_mode_probed_add(connector, mode); + count++; + } else { + DRM_ERROR( + "[CONNECTOR:%d:%s] manual override mode: parse error\n", + connector->base.id, + drm_get_connector_name(connector)); + } + } + if (count == 0 && connector->status == connector_status_connected) + count = drm_add_modes_noedid(connector, 1024, 768); + if (count == 0) + goto prune; + + drm_mode_connector_list_update(connector); + + if (maxX && maxY) + drm_mode_validate_size(dev, &connector->modes, maxX, + maxY, 0); + + if (connector->interlace_allowed) + mode_flags |= DRM_MODE_FLAG_INTERLACE; + if (connector->doublescan_allowed) + mode_flags |= DRM_MODE_FLAG_DBLSCAN; + drm_mode_validate_flag(connector, mode_flags); + + list_for_each_entry_safe(mode, t, &connector->modes, head) { + if (mode->status == MODE_OK) + mode->status = connector_funcs->mode_valid(connector, + mode); + } + +prune: + drm_mode_prune_invalid(dev, &connector->modes, true); + + if (list_empty(&connector->modes)) + return 0; + + drm_mode_sort(&connector->modes); + + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] probed modes :\n", connector->base.id, + drm_get_connector_name(connector)); + list_for_each_entry_safe(mode, t, &connector->modes, head) { + mode->vrefresh = drm_mode_vrefresh(mode); + + drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); + drm_mode_debug_printmodeline(mode); + } + + return count; +} + +/** + * drm_helper_encoder_in_use - check if a given encoder is in use + * @encoder: encoder to check + * + * LOCKING: + * Caller must hold mode config lock. + * + * Walk @encoders's DRM device's mode_config and see if it's in use. + * + * RETURNS: + * True if @encoder is part of the mode_config, false otherwise. + */ +bool drm_helper_encoder_in_use(struct drm_encoder *encoder) +{ + struct drm_connector *connector; + struct drm_device *dev = encoder->dev; + list_for_each_entry(connector, &dev->mode_config.connector_list, head) + if (connector->encoder == encoder) + return true; + return false; +} + +/** + * drm_helper_crtc_in_use - check if a given CRTC is in a mode_config + * @crtc: CRTC to check + * + * LOCKING: + * Caller must hold mode config lock. + * + * Walk @crtc's DRM device's mode_config and see if it's in use. + * + * RETURNS: + * True if @crtc is part of the mode_config, false otherwise. + */ +bool drm_helper_crtc_in_use(struct drm_crtc *crtc) +{ + struct drm_encoder *encoder; + struct drm_device *dev = crtc->dev; + /* FIXME: Locking around list access? */ + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) + if (encoder->crtc == crtc && drm_helper_encoder_in_use(encoder)) + return true; + return false; +} + +static void +drm_encoder_disable(struct drm_encoder *encoder) +{ + struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; + + if (encoder_funcs->disable) + (*encoder_funcs->disable)(encoder); + else + (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF); +} + +/** + * drm_helper_disable_unused_functions - disable unused objects + * @dev: DRM device + * + * LOCKING: + * Caller must hold mode config lock. + * + * If an connector or CRTC isn't part of @dev's mode_config, it can be disabled + * by calling its dpms function, which should power it off. + */ +void drm_helper_disable_unused_functions(struct drm_device *dev) +{ + struct drm_encoder *encoder; + struct drm_connector *connector; + struct drm_crtc *crtc; + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + if (!connector->encoder) + continue; + if (connector->status == connector_status_disconnected) + connector->encoder = NULL; + } + + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + if (!drm_helper_encoder_in_use(encoder)) { + drm_encoder_disable(encoder); + /* disconnector encoder from any connector */ + encoder->crtc = NULL; + } + } + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; + crtc->enabled = drm_helper_crtc_in_use(crtc); + if (!crtc->enabled) { + if (crtc_funcs->disable) + (*crtc_funcs->disable)(crtc); + else + (*crtc_funcs->dpms)(crtc, DRM_MODE_DPMS_OFF); + crtc->fb = NULL; + } + } +} + +/** + * drm_encoder_crtc_ok - can a given crtc drive a given encoder? + * @encoder: encoder to test + * @crtc: crtc to test + * + * Return false if @encoder can't be driven by @crtc, true otherwise. + */ +static bool drm_encoder_crtc_ok(struct drm_encoder *encoder, + struct drm_crtc *crtc) +{ + struct drm_device *dev; + struct drm_crtc *tmp; + int crtc_mask = 1; + + if (crtc == NULL) + printf("checking null crtc?\n"); + + dev = crtc->dev; + + list_for_each_entry(tmp, &dev->mode_config.crtc_list, head) { + if (tmp == crtc) + break; + crtc_mask <<= 1; + } + + if (encoder->possible_crtcs & crtc_mask) + return true; + return false; +} + +/* + * Check the CRTC we're going to map each output to vs. its current + * CRTC. If they don't match, we have to disable the output and the CRTC + * since the driver will have to re-route things. + */ +static void +drm_crtc_prepare_encoders(struct drm_device *dev) +{ + struct drm_encoder_helper_funcs *encoder_funcs; + struct drm_encoder *encoder; + + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + encoder_funcs = encoder->helper_private; + /* Disable unused encoders */ + if (encoder->crtc == NULL) + drm_encoder_disable(encoder); + /* Disable encoders whose CRTC is about to change */ + if (encoder_funcs->get_crtc && + encoder->crtc != (*encoder_funcs->get_crtc)(encoder)) + drm_encoder_disable(encoder); + } +} + +/** + * drm_crtc_set_mode - set a mode + * @crtc: CRTC to program + * @mode: mode to use + * @x: width of mode + * @y: height of mode + * + * LOCKING: + * Caller must hold mode config lock. + * + * Try to set @mode on @crtc. Give @crtc and its associated connectors a chance + * to fixup or reject the mode prior to trying to set it. + * + * RETURNS: + * True if the mode was set successfully, or false otherwise. + */ +bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, + struct drm_display_mode *mode, + int x, int y, + struct drm_framebuffer *old_fb) +{ + struct drm_device *dev = crtc->dev; + struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode; + struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; + struct drm_encoder_helper_funcs *encoder_funcs; + int saved_x, saved_y; + struct drm_encoder *encoder; + bool ret = true; + + crtc->enabled = drm_helper_crtc_in_use(crtc); + if (!crtc->enabled) + return true; + + adjusted_mode = drm_mode_duplicate(dev, mode); + if (!adjusted_mode) + return false; + + saved_hwmode = crtc->hwmode; + saved_mode = crtc->mode; + saved_x = crtc->x; + saved_y = crtc->y; + + /* Update crtc values up front so the driver can rely on them for mode + * setting. + */ + crtc->mode = *mode; + crtc->x = x; + crtc->y = y; + + /* Pass our mode to the connectors and the CRTC to give them a chance to + * adjust it according to limitations or connector properties, and also + * a chance to reject the mode entirely. + */ + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + + if (encoder->crtc != crtc) + continue; + encoder_funcs = encoder->helper_private; + if (!(ret = encoder_funcs->mode_fixup(encoder, mode, + adjusted_mode))) { + goto done; + } + } + + if (!(ret = crtc_funcs->mode_fixup(crtc, mode, adjusted_mode))) { + goto done; + } + DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id); + + /* Prepare the encoders and CRTCs before setting the mode. */ + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + + if (encoder->crtc != crtc) + continue; + encoder_funcs = encoder->helper_private; + /* Disable the encoders as the first thing we do. */ + encoder_funcs->prepare(encoder); + } + + drm_crtc_prepare_encoders(dev); + + crtc_funcs->prepare(crtc); + + /* Set up the DPLL and any encoders state that needs to adjust or depend + * on the DPLL. + */ + ret = !crtc_funcs->mode_set(crtc, mode, adjusted_mode, x, y, old_fb); + if (!ret) + goto done; + + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + + if (encoder->crtc != crtc) + continue; + + DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%d:%s]\n", + encoder->base.id, drm_get_encoder_name(encoder), + mode->base.id, mode->name); + encoder_funcs = encoder->helper_private; + encoder_funcs->mode_set(encoder, mode, adjusted_mode); + } + + /* Now enable the clocks, plane, pipe, and connectors that we set up. */ + crtc_funcs->commit(crtc); + + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + + if (encoder->crtc != crtc) + continue; + + encoder_funcs = encoder->helper_private; + encoder_funcs->commit(encoder); + + } + + /* Store real post-adjustment hardware mode. */ + crtc->hwmode = *adjusted_mode; + + /* Calculate and store various constants which + * are later needed by vblank and swap-completion + * timestamping. They are derived from true hwmode. + */ + drm_calc_timestamping_constants(crtc); + + /* FIXME: add subpixel order */ +done: + drm_mode_destroy(dev, adjusted_mode); + if (!ret) { + crtc->hwmode = saved_hwmode; + crtc->mode = saved_mode; + crtc->x = saved_x; + crtc->y = saved_y; + } + + return ret; +} + +static int +drm_crtc_helper_disable(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_connector *connector; + struct drm_encoder *encoder; + + /* Decouple all encoders and their attached connectors from this crtc */ + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + if (encoder->crtc != crtc) + continue; + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + if (connector->encoder != encoder) + continue; + + connector->encoder = NULL; + } + } + + drm_helper_disable_unused_functions(dev); + return 0; +} + +/** + * drm_crtc_helper_set_config - set a new config from userspace + * @crtc: CRTC to setup + * @crtc_info: user provided configuration + * @new_mode: new mode to set + * @connector_set: set of connectors for the new config + * @fb: new framebuffer + * + * LOCKING: + * Caller must hold mode config lock. + * + * Setup a new configuration, provided by the user in @crtc_info, and enable + * it. + * + * RETURNS: + * Zero. (FIXME) + */ +int drm_crtc_helper_set_config(struct drm_mode_set *set) +{ + struct drm_device *dev; + struct drm_crtc *save_crtcs, *new_crtc, *crtc; + struct drm_encoder *save_encoders, *new_encoder, *encoder; + struct drm_framebuffer *old_fb = NULL; + bool mode_changed = false; /* if true do a full mode set */ + bool fb_changed = false; /* if true and !mode_changed just do a flip */ + struct drm_connector *save_connectors, *connector; + int count = 0, ro, fail = 0; + struct drm_crtc_helper_funcs *crtc_funcs; + struct drm_mode_set save_set; + int ret = 0; + int i; + + DRM_DEBUG_KMS("\n"); + + if (!set) + return -EINVAL; + + if (!set->crtc) + return -EINVAL; + + if (!set->crtc->helper_private) + return -EINVAL; + + crtc_funcs = set->crtc->helper_private; + + if (!set->mode) + set->fb = NULL; + + if (set->fb) { + DRM_DEBUG_KMS("[CRTC:%d] [FB:%d] #connectors=%d (x y) (%i %i)\n", + set->crtc->base.id, set->fb->base.id, + (int)set->num_connectors, set->x, set->y); + } else { + DRM_DEBUG_KMS("[CRTC:%d] [NOFB]\n", set->crtc->base.id); + return drm_crtc_helper_disable(set->crtc); + } + + dev = set->crtc->dev; + + /* Allocate space for the backup of all (non-pointer) crtc, encoder and + * connector data. */ + save_crtcs = malloc(dev->mode_config.num_crtc * sizeof(struct drm_crtc), + DRM_MEM_KMS, M_WAITOK | M_ZERO); + save_encoders = malloc(dev->mode_config.num_encoder * + sizeof(struct drm_encoder), DRM_MEM_KMS, M_WAITOK | M_ZERO); + save_connectors = malloc(dev->mode_config.num_connector * + sizeof(struct drm_connector), DRM_MEM_KMS, M_WAITOK | M_ZERO); + + /* Copy data. Note that driver private data is not affected. + * Should anything bad happen only the expected state is + * restored, not the drivers personal bookkeeping. + */ + count = 0; + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + save_crtcs[count++] = *crtc; + } + + count = 0; + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + save_encoders[count++] = *encoder; + } + + count = 0; + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + save_connectors[count++] = *connector; + } + + save_set.crtc = set->crtc; + save_set.mode = &set->crtc->mode; + save_set.x = set->crtc->x; + save_set.y = set->crtc->y; + save_set.fb = set->crtc->fb; + + /* We should be able to check here if the fb has the same properties + * and then just flip_or_move it */ + if (set->crtc->fb != set->fb) { + /* If we have no fb then treat it as a full mode set */ + if (set->crtc->fb == NULL) { + DRM_DEBUG_KMS("crtc has no fb, full mode set\n"); + mode_changed = true; + } else if (set->fb == NULL) { + mode_changed = true; + } else + fb_changed = true; + } + + if (set->x != set->crtc->x || set->y != set->crtc->y) + fb_changed = true; + + if (set->mode && !drm_mode_equal(set->mode, &set->crtc->mode)) { + DRM_DEBUG_KMS("modes are different, full mode set\n"); + drm_mode_debug_printmodeline(&set->crtc->mode); + drm_mode_debug_printmodeline(set->mode); + mode_changed = true; + } + + /* a) traverse passed in connector list and get encoders for them */ + count = 0; + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + struct drm_connector_helper_funcs *connector_funcs = + connector->helper_private; + new_encoder = connector->encoder; + for (ro = 0; ro < set->num_connectors; ro++) { + if (set->connectors[ro] == connector) { + new_encoder = connector_funcs->best_encoder(connector); + /* if we can't get an encoder for a connector + we are setting now - then fail */ + if (new_encoder == NULL) + /* don't break so fail path works correct */ + fail = 1; + break; + } + } + + if (new_encoder != connector->encoder) { + DRM_DEBUG_KMS("encoder changed, full mode switch\n"); + mode_changed = true; + /* If the encoder is reused for another connector, then + * the appropriate crtc will be set later. + */ + if (connector->encoder) + connector->encoder->crtc = NULL; + connector->encoder = new_encoder; + } + } + + if (fail) { + ret = -EINVAL; + goto fail; + } + + count = 0; + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + if (!connector->encoder) + continue; + + if (connector->encoder->crtc == set->crtc) + new_crtc = NULL; + else + new_crtc = connector->encoder->crtc; + + for (ro = 0; ro < set->num_connectors; ro++) { + if (set->connectors[ro] == connector) + new_crtc = set->crtc; + } + + /* Make sure the new CRTC will work with the encoder */ + if (new_crtc && + !drm_encoder_crtc_ok(connector->encoder, new_crtc)) { + ret = -EINVAL; + goto fail; + } + if (new_crtc != connector->encoder->crtc) { + DRM_DEBUG_KMS("crtc changed, full mode switch\n"); + mode_changed = true; + connector->encoder->crtc = new_crtc; + } + if (new_crtc) { + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] to [CRTC:%d]\n", + connector->base.id, drm_get_connector_name(connector), + new_crtc->base.id); + } else { + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] to [NOCRTC]\n", + connector->base.id, drm_get_connector_name(connector)); + } + } + + /* mode_set_base is not a required function */ + if (fb_changed && !crtc_funcs->mode_set_base) + mode_changed = true; + + if (mode_changed) { + set->crtc->enabled = drm_helper_crtc_in_use(set->crtc); + if (set->crtc->enabled) { + DRM_DEBUG_KMS("attempting to set mode from" + " userspace\n"); + drm_mode_debug_printmodeline(set->mode); + old_fb = set->crtc->fb; + set->crtc->fb = set->fb; + if (!drm_crtc_helper_set_mode(set->crtc, set->mode, + set->x, set->y, + old_fb)) { + DRM_ERROR("failed to set mode on [CRTC:%d]\n", + set->crtc->base.id); + set->crtc->fb = old_fb; + ret = -EINVAL; + goto fail; + } + DRM_DEBUG_KMS("Setting connector DPMS state to on\n"); + for (i = 0; i < set->num_connectors; i++) { + DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS on\n", set->connectors[i]->base.id, + drm_get_connector_name(set->connectors[i])); + set->connectors[i]->dpms = DRM_MODE_DPMS_ON; + } + } + drm_helper_disable_unused_functions(dev); + } else if (fb_changed) { + set->crtc->x = set->x; + set->crtc->y = set->y; + + old_fb = set->crtc->fb; + if (set->crtc->fb != set->fb) + set->crtc->fb = set->fb; + ret = crtc_funcs->mode_set_base(set->crtc, + set->x, set->y, old_fb); + if (ret != 0) { + set->crtc->fb = old_fb; + goto fail; + } + } + + free(save_connectors, DRM_MEM_KMS); + free(save_encoders, DRM_MEM_KMS); + free(save_crtcs, DRM_MEM_KMS); + return 0; + +fail: + /* Restore all previous data. */ + count = 0; + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + *crtc = save_crtcs[count++]; + } + + count = 0; + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + *encoder = save_encoders[count++]; + } + + count = 0; + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + *connector = save_connectors[count++]; + } + + /* Try to restore the config */ + if (mode_changed && + !drm_crtc_helper_set_mode(save_set.crtc, save_set.mode, save_set.x, + save_set.y, save_set.fb)) + DRM_ERROR("failed to restore config after modeset failure\n"); + + free(save_connectors, DRM_MEM_KMS); + free(save_encoders, DRM_MEM_KMS); + free(save_crtcs, DRM_MEM_KMS); + return ret; +} + +static int drm_helper_choose_encoder_dpms(struct drm_encoder *encoder) +{ + int dpms = DRM_MODE_DPMS_OFF; + struct drm_connector *connector; + struct drm_device *dev = encoder->dev; + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) + if (connector->encoder == encoder) + if (connector->dpms < dpms) + dpms = connector->dpms; + return dpms; +} + +static int drm_helper_choose_crtc_dpms(struct drm_crtc *crtc) +{ + int dpms = DRM_MODE_DPMS_OFF; + struct drm_connector *connector; + struct drm_device *dev = crtc->dev; + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) + if (connector->encoder && connector->encoder->crtc == crtc) + if (connector->dpms < dpms) + dpms = connector->dpms; + return dpms; +} + +/** + * drm_helper_connector_dpms + * @connector affected connector + * @mode DPMS mode + * + * Calls the low-level connector DPMS function, then + * calls appropriate encoder and crtc DPMS functions as well + */ +void drm_helper_connector_dpms(struct drm_connector *connector, int mode) +{ + struct drm_encoder *encoder = connector->encoder; + struct drm_crtc *crtc = encoder ? encoder->crtc : NULL; + int old_dpms; + + if (mode == connector->dpms) + return; + + old_dpms = connector->dpms; + connector->dpms = mode; + + /* from off to on, do crtc then encoder */ + if (mode < old_dpms) { + if (crtc) { + struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; + if (crtc_funcs->dpms) + (*crtc_funcs->dpms) (crtc, + drm_helper_choose_crtc_dpms(crtc)); + } + if (encoder) { + struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; + if (encoder_funcs->dpms) + (*encoder_funcs->dpms) (encoder, + drm_helper_choose_encoder_dpms(encoder)); + } + } + + /* from on to off, do encoder then crtc */ + if (mode > old_dpms) { + if (encoder) { + struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; + if (encoder_funcs->dpms) + (*encoder_funcs->dpms) (encoder, + drm_helper_choose_encoder_dpms(encoder)); + } + if (crtc) { + struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; + if (crtc_funcs->dpms) + (*crtc_funcs->dpms) (crtc, + drm_helper_choose_crtc_dpms(crtc)); + } + } + + return; +} + +int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, + struct drm_mode_fb_cmd2 *mode_cmd) +{ + int i; + + fb->width = mode_cmd->width; + fb->height = mode_cmd->height; + for (i = 0; i < 4; i++) { + fb->pitches[i] = mode_cmd->pitches[i]; + fb->offsets[i] = mode_cmd->offsets[i]; + } + drm_fb_get_bpp_depth(mode_cmd->pixel_format, &fb->depth, + &fb->bits_per_pixel); + fb->pixel_format = mode_cmd->pixel_format; + + return 0; +} + +int drm_helper_resume_force_mode(struct drm_device *dev) +{ + struct drm_crtc *crtc; + struct drm_encoder *encoder; + struct drm_encoder_helper_funcs *encoder_funcs; + struct drm_crtc_helper_funcs *crtc_funcs; + int ret; + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + + if (!crtc->enabled) + continue; + + ret = drm_crtc_helper_set_mode(crtc, &crtc->mode, + crtc->x, crtc->y, crtc->fb); + + if (!ret) + DRM_ERROR("failed to set mode on crtc %p\n", crtc); + + /* Turn off outputs that were already powered off */ + if (drm_helper_choose_crtc_dpms(crtc)) { + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + + if(encoder->crtc != crtc) + continue; + + encoder_funcs = encoder->helper_private; + if (encoder_funcs->dpms) + (*encoder_funcs->dpms) (encoder, + drm_helper_choose_encoder_dpms(encoder)); + } + + crtc_funcs = crtc->helper_private; + if (crtc_funcs->dpms) + (*crtc_funcs->dpms) (crtc, + drm_helper_choose_crtc_dpms(crtc)); + } + } + /* disable the unused connectors while restoring the modesetting */ + drm_helper_disable_unused_functions(dev); + return 0; +} + +#define DRM_OUTPUT_POLL_PERIOD (10 * hz) +static void output_poll_execute(void *ctx, int pending) +{ + struct drm_device *dev; + struct drm_connector *connector; + enum drm_connector_status old_status; + bool repoll = false, changed = false; + + if (!drm_kms_helper_poll) + return; + + dev = ctx; + + sx_xlock(&dev->mode_config.mutex); + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + + /* if this is HPD or polled don't check it - + TV out for instance */ + if (!connector->polled) + continue; + + else if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | + DRM_CONNECTOR_POLL_DISCONNECT)) + repoll = true; + + old_status = connector->status; + /* if we are connected and don't want to poll for disconnect + skip it */ + if (old_status == connector_status_connected && + !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT) && + !(connector->polled & DRM_CONNECTOR_POLL_HPD)) + continue; + + connector->status = connector->funcs->detect(connector, false); + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %d to %d\n", + connector->base.id, + drm_get_connector_name(connector), + old_status, connector->status); + if (old_status != connector->status) + changed = true; + } + + sx_xunlock(&dev->mode_config.mutex); + + if (changed) { +#if 0 + /* send a uevent + call fbdev */ + drm_sysfs_hotplug_event(dev); +#endif + if (dev->mode_config.funcs->output_poll_changed) + dev->mode_config.funcs->output_poll_changed(dev); + } + + if (repoll) { + taskqueue_enqueue_timeout(taskqueue_thread, + &dev->mode_config.output_poll_task, + DRM_OUTPUT_POLL_PERIOD); + } +} + +void drm_kms_helper_poll_disable(struct drm_device *dev) +{ + if (!dev->mode_config.poll_enabled) + return; + taskqueue_cancel_timeout(taskqueue_thread, + &dev->mode_config.output_poll_task, NULL); +} + +void drm_kms_helper_poll_enable(struct drm_device *dev) +{ + bool poll = false; + struct drm_connector *connector; + + if (!dev->mode_config.poll_enabled || !drm_kms_helper_poll) + return; + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + if (connector->polled) + poll = true; + } + + if (poll) { + taskqueue_enqueue_timeout(taskqueue_thread, + &dev->mode_config.output_poll_task, DRM_OUTPUT_POLL_PERIOD); + } +} + +void drm_kms_helper_poll_init(struct drm_device *dev) +{ + + TIMEOUT_TASK_INIT(taskqueue_thread, &dev->mode_config.output_poll_task, + 0, output_poll_execute, dev); + dev->mode_config.poll_enabled = true; + + drm_kms_helper_poll_enable(dev); +} + +void drm_kms_helper_poll_fini(struct drm_device *dev) +{ + drm_kms_helper_poll_disable(dev); +} + +void drm_helper_hpd_irq_event(struct drm_device *dev) +{ + if (!dev->mode_config.poll_enabled) + return; + + /* kill timer and schedule immediate execution, this doesn't block */ + taskqueue_cancel_timeout(taskqueue_thread, + &dev->mode_config.output_poll_task, NULL); + if (drm_kms_helper_poll) + taskqueue_enqueue_timeout(taskqueue_thread, + &dev->mode_config.output_poll_task, 0); +} diff --git a/sys/dev/drm2/drm_crtc_helper.h b/sys/dev/drm2/drm_crtc_helper.h new file mode 100644 index 00000000000..76542632fa3 --- /dev/null +++ b/sys/dev/drm2/drm_crtc_helper.h @@ -0,0 +1,146 @@ +/* + * Copyright © 2006 Keith Packard + * Copyright © 2007-2008 Dave Airlie + * Copyright © 2007-2008 Intel Corporation + * Jesse Barnes + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * $FreeBSD$ + */ + +/* + * The DRM mode setting helper functions are common code for drivers to use if + * they wish. Drivers are not forced to use this code in their + * implementations but it would be useful if they code they do use at least + * provides a consistent interface and operation to userspace + */ + +#ifndef __DRM_CRTC_HELPER_H__ +#define __DRM_CRTC_HELPER_H__ + +enum mode_set_atomic { + LEAVE_ATOMIC_MODE_SET, + ENTER_ATOMIC_MODE_SET, +}; + +struct drm_crtc_helper_funcs { + /* + * Control power levels on the CRTC. If the mode passed in is + * unsupported, the provider must use the next lowest power level. + */ + void (*dpms)(struct drm_crtc *crtc, int mode); + void (*prepare)(struct drm_crtc *crtc); + void (*commit)(struct drm_crtc *crtc); + + /* Provider can fixup or change mode timings before modeset occurs */ + bool (*mode_fixup)(struct drm_crtc *crtc, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode); + /* Actually set the mode */ + int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode, int x, int y, + struct drm_framebuffer *old_fb); + + /* Move the crtc on the current fb to the given position *optional* */ + int (*mode_set_base)(struct drm_crtc *crtc, int x, int y, + struct drm_framebuffer *old_fb); + int (*mode_set_base_atomic)(struct drm_crtc *crtc, + struct drm_framebuffer *fb, int x, int y, + enum mode_set_atomic); + + /* reload the current crtc LUT */ + void (*load_lut)(struct drm_crtc *crtc); + + /* disable crtc when not in use - more explicit than dpms off */ + void (*disable)(struct drm_crtc *crtc); +}; + +struct drm_encoder_helper_funcs { + void (*dpms)(struct drm_encoder *encoder, int mode); + void (*save)(struct drm_encoder *encoder); + void (*restore)(struct drm_encoder *encoder); + + bool (*mode_fixup)(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode); + void (*prepare)(struct drm_encoder *encoder); + void (*commit)(struct drm_encoder *encoder); + void (*mode_set)(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode); + struct drm_crtc *(*get_crtc)(struct drm_encoder *encoder); + /* detect for DAC style encoders */ + enum drm_connector_status (*detect)(struct drm_encoder *encoder, + struct drm_connector *connector); + /* disable encoder when not in use - more explicit than dpms off */ + void (*disable)(struct drm_encoder *encoder); +}; + +struct drm_connector_helper_funcs { + int (*get_modes)(struct drm_connector *connector); + int (*mode_valid)(struct drm_connector *connector, + struct drm_display_mode *mode); + struct drm_encoder *(*best_encoder)(struct drm_connector *connector); +}; + +extern int drm_helper_probe_single_connector_modes(struct drm_connector *connector, uint32_t maxX, uint32_t maxY); +extern void drm_helper_disable_unused_functions(struct drm_device *dev); +extern int drm_crtc_helper_set_config(struct drm_mode_set *set); +extern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, + struct drm_display_mode *mode, + int x, int y, + struct drm_framebuffer *old_fb); +extern bool drm_helper_crtc_in_use(struct drm_crtc *crtc); +extern bool drm_helper_encoder_in_use(struct drm_encoder *encoder); + +extern void drm_helper_connector_dpms(struct drm_connector *connector, int mode); + +extern int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, + struct drm_mode_fb_cmd2 *mode_cmd); + +static inline void drm_crtc_helper_add(struct drm_crtc *crtc, + const struct drm_crtc_helper_funcs *funcs) +{ + crtc->helper_private = __DECONST(void *, funcs); +} + +static inline void drm_encoder_helper_add(struct drm_encoder *encoder, + const struct drm_encoder_helper_funcs *funcs) +{ + encoder->helper_private = __DECONST(void *, funcs); +} + +static inline void drm_connector_helper_add(struct drm_connector *connector, + const struct drm_connector_helper_funcs *funcs) +{ + connector->helper_private = __DECONST(void *, funcs); +} + +extern int drm_helper_resume_force_mode(struct drm_device *dev); +extern void drm_kms_helper_poll_init(struct drm_device *dev); +extern void drm_kms_helper_poll_fini(struct drm_device *dev); +extern void drm_helper_hpd_irq_event(struct drm_device *dev); + +extern void drm_kms_helper_poll_disable(struct drm_device *dev); +extern void drm_kms_helper_poll_enable(struct drm_device *dev); + +extern bool drm_fetch_cmdline_mode_from_kenv(struct drm_connector *connector, + struct drm_cmdline_mode *cmdline_mode); +#endif diff --git a/sys/dev/drm2/drm_dma.c b/sys/dev/drm2/drm_dma.c new file mode 100644 index 00000000000..c0a1c809bf9 --- /dev/null +++ b/sys/dev/drm2/drm_dma.c @@ -0,0 +1,139 @@ +/*- + * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_dma.c + * Support code for DMA buffer management. + * + * The implementation used to be significantly more complicated, but the + * complexity has been moved into the drivers as different buffer management + * schemes evolved. + */ + +#include + +int drm_dma_setup(struct drm_device *dev) +{ + + dev->dma = malloc(sizeof(*dev->dma), DRM_MEM_DRIVER, M_NOWAIT | M_ZERO); + if (dev->dma == NULL) + return ENOMEM; + + DRM_SPININIT(&dev->dma_lock, "drmdma"); + + return 0; +} + +void drm_dma_takedown(struct drm_device *dev) +{ + drm_device_dma_t *dma = dev->dma; + int i, j; + + if (dma == NULL) + return; + + /* Clear dma buffers */ + for (i = 0; i <= DRM_MAX_ORDER; i++) { + if (dma->bufs[i].seg_count) { + DRM_DEBUG("order %d: buf_count = %d," + " seg_count = %d\n", i, dma->bufs[i].buf_count, + dma->bufs[i].seg_count); + for (j = 0; j < dma->bufs[i].seg_count; j++) { + drm_pci_free(dev, dma->bufs[i].seglist[j]); + } + free(dma->bufs[i].seglist, DRM_MEM_SEGS); + } + + if (dma->bufs[i].buf_count) { + for (j = 0; j < dma->bufs[i].buf_count; j++) { + free(dma->bufs[i].buflist[j].dev_private, + DRM_MEM_BUFS); + } + free(dma->bufs[i].buflist, DRM_MEM_BUFS); + } + } + + free(dma->buflist, DRM_MEM_BUFS); + free(dma->pagelist, DRM_MEM_PAGES); + free(dev->dma, DRM_MEM_DRIVER); + dev->dma = NULL; + DRM_SPINUNINIT(&dev->dma_lock); +} + + +void drm_free_buffer(struct drm_device *dev, drm_buf_t *buf) +{ + if (!buf) + return; + + buf->pending = 0; + buf->file_priv= NULL; + buf->used = 0; +} + +void drm_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv) +{ + drm_device_dma_t *dma = dev->dma; + int i; + + if (!dma) + return; + + for (i = 0; i < dma->buf_count; i++) { + if (dma->buflist[i]->file_priv == file_priv) { + switch (dma->buflist[i]->list) { + case DRM_LIST_NONE: + drm_free_buffer(dev, dma->buflist[i]); + break; + case DRM_LIST_WAIT: + dma->buflist[i]->list = DRM_LIST_RECLAIM; + break; + default: + /* Buffer already on hardware. */ + break; + } + } + } +} + +/* Call into the driver-specific DMA handler */ +int drm_dma(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + + if (dev->driver->dma_ioctl) { + /* shared code returns -errno */ + return -dev->driver->dma_ioctl(dev, data, file_priv); + } else { + DRM_DEBUG("DMA ioctl on driver with no dma handler\n"); + return EINVAL; + } +} diff --git a/sys/dev/drm2/drm_dp_helper.h b/sys/dev/drm2/drm_dp_helper.h new file mode 100644 index 00000000000..4eea73beec8 --- /dev/null +++ b/sys/dev/drm2/drm_dp_helper.h @@ -0,0 +1,250 @@ +/* + * Copyright © 2008 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef _DRM_DP_HELPER_H_ +#define _DRM_DP_HELPER_H_ + +/* From the VESA DisplayPort spec */ + +#define AUX_NATIVE_WRITE 0x8 +#define AUX_NATIVE_READ 0x9 +#define AUX_I2C_WRITE 0x0 +#define AUX_I2C_READ 0x1 +#define AUX_I2C_STATUS 0x2 +#define AUX_I2C_MOT 0x4 + +#define AUX_NATIVE_REPLY_ACK (0x0 << 4) +#define AUX_NATIVE_REPLY_NACK (0x1 << 4) +#define AUX_NATIVE_REPLY_DEFER (0x2 << 4) +#define AUX_NATIVE_REPLY_MASK (0x3 << 4) + +#define AUX_I2C_REPLY_ACK (0x0 << 6) +#define AUX_I2C_REPLY_NACK (0x1 << 6) +#define AUX_I2C_REPLY_DEFER (0x2 << 6) +#define AUX_I2C_REPLY_MASK (0x3 << 6) + +/* AUX CH addresses */ +/* DPCD */ +#define DP_DPCD_REV 0x000 + +#define DP_MAX_LINK_RATE 0x001 + +#define DP_MAX_LANE_COUNT 0x002 +# define DP_MAX_LANE_COUNT_MASK 0x1f +# define DP_TPS3_SUPPORTED (1 << 6) +# define DP_ENHANCED_FRAME_CAP (1 << 7) + +#define DP_MAX_DOWNSPREAD 0x003 +# define DP_NO_AUX_HANDSHAKE_LINK_TRAINING (1 << 6) + +#define DP_NORP 0x004 + +#define DP_DOWNSTREAMPORT_PRESENT 0x005 +# define DP_DWN_STRM_PORT_PRESENT (1 << 0) +# define DP_DWN_STRM_PORT_TYPE_MASK 0x06 +/* 00b = DisplayPort */ +/* 01b = Analog */ +/* 10b = TMDS or HDMI */ +/* 11b = Other */ +# define DP_FORMAT_CONVERSION (1 << 3) + +#define DP_MAIN_LINK_CHANNEL_CODING 0x006 + +#define DP_TRAINING_AUX_RD_INTERVAL 0x00e + +#define DP_PSR_SUPPORT 0x070 +# define DP_PSR_IS_SUPPORTED 1 +#define DP_PSR_CAPS 0x071 +# define DP_PSR_NO_TRAIN_ON_EXIT 1 +# define DP_PSR_SETUP_TIME_330 (0 << 1) +# define DP_PSR_SETUP_TIME_275 (1 << 1) +# define DP_PSR_SETUP_TIME_220 (2 << 1) +# define DP_PSR_SETUP_TIME_165 (3 << 1) +# define DP_PSR_SETUP_TIME_110 (4 << 1) +# define DP_PSR_SETUP_TIME_55 (5 << 1) +# define DP_PSR_SETUP_TIME_0 (6 << 1) +# define DP_PSR_SETUP_TIME_MASK (7 << 1) +# define DP_PSR_SETUP_TIME_SHIFT 1 + +/* link configuration */ +#define DP_LINK_BW_SET 0x100 +# define DP_LINK_BW_1_62 0x06 +# define DP_LINK_BW_2_7 0x0a +# define DP_LINK_BW_5_4 0x14 + +#define DP_LANE_COUNT_SET 0x101 +# define DP_LANE_COUNT_MASK 0x0f +# define DP_LANE_COUNT_ENHANCED_FRAME_EN (1 << 7) + +#define DP_TRAINING_PATTERN_SET 0x102 +# define DP_TRAINING_PATTERN_DISABLE 0 +# define DP_TRAINING_PATTERN_1 1 +# define DP_TRAINING_PATTERN_2 2 +# define DP_TRAINING_PATTERN_3 3 +# define DP_TRAINING_PATTERN_MASK 0x3 + +# define DP_LINK_QUAL_PATTERN_DISABLE (0 << 2) +# define DP_LINK_QUAL_PATTERN_D10_2 (1 << 2) +# define DP_LINK_QUAL_PATTERN_ERROR_RATE (2 << 2) +# define DP_LINK_QUAL_PATTERN_PRBS7 (3 << 2) +# define DP_LINK_QUAL_PATTERN_MASK (3 << 2) + +# define DP_RECOVERED_CLOCK_OUT_EN (1 << 4) +# define DP_LINK_SCRAMBLING_DISABLE (1 << 5) + +# define DP_SYMBOL_ERROR_COUNT_BOTH (0 << 6) +# define DP_SYMBOL_ERROR_COUNT_DISPARITY (1 << 6) +# define DP_SYMBOL_ERROR_COUNT_SYMBOL (2 << 6) +# define DP_SYMBOL_ERROR_COUNT_MASK (3 << 6) + +#define DP_TRAINING_LANE0_SET 0x103 +#define DP_TRAINING_LANE1_SET 0x104 +#define DP_TRAINING_LANE2_SET 0x105 +#define DP_TRAINING_LANE3_SET 0x106 + +# define DP_TRAIN_VOLTAGE_SWING_MASK 0x3 +# define DP_TRAIN_VOLTAGE_SWING_SHIFT 0 +# define DP_TRAIN_MAX_SWING_REACHED (1 << 2) +# define DP_TRAIN_VOLTAGE_SWING_400 (0 << 0) +# define DP_TRAIN_VOLTAGE_SWING_600 (1 << 0) +# define DP_TRAIN_VOLTAGE_SWING_800 (2 << 0) +# define DP_TRAIN_VOLTAGE_SWING_1200 (3 << 0) + +# define DP_TRAIN_PRE_EMPHASIS_MASK (3 << 3) +# define DP_TRAIN_PRE_EMPHASIS_0 (0 << 3) +# define DP_TRAIN_PRE_EMPHASIS_3_5 (1 << 3) +# define DP_TRAIN_PRE_EMPHASIS_6 (2 << 3) +# define DP_TRAIN_PRE_EMPHASIS_9_5 (3 << 3) + +# define DP_TRAIN_PRE_EMPHASIS_SHIFT 3 +# define DP_TRAIN_MAX_PRE_EMPHASIS_REACHED (1 << 5) + +#define DP_DOWNSPREAD_CTRL 0x107 +# define DP_SPREAD_AMP_0_5 (1 << 4) + +#define DP_MAIN_LINK_CHANNEL_CODING_SET 0x108 +# define DP_SET_ANSI_8B10B (1 << 0) + +#define DP_PSR_EN_CFG 0x170 +# define DP_PSR_ENABLE (1 << 0) +# define DP_PSR_MAIN_LINK_ACTIVE (1 << 1) +# define DP_PSR_CRC_VERIFICATION (1 << 2) +# define DP_PSR_FRAME_CAPTURE (1 << 3) + +#define DP_DEVICE_SERVICE_IRQ_VECTOR 0x201 +# define DP_REMOTE_CONTROL_COMMAND_PENDING (1 << 0) +# define DP_AUTOMATED_TEST_REQUEST (1 << 1) +# define DP_CP_IRQ (1 << 2) +# define DP_SINK_SPECIFIC_IRQ (1 << 6) + +#define DP_LANE0_1_STATUS 0x202 +#define DP_LANE2_3_STATUS 0x203 +# define DP_LANE_CR_DONE (1 << 0) +# define DP_LANE_CHANNEL_EQ_DONE (1 << 1) +# define DP_LANE_SYMBOL_LOCKED (1 << 2) + +#define DP_CHANNEL_EQ_BITS (DP_LANE_CR_DONE | \ + DP_LANE_CHANNEL_EQ_DONE | \ + DP_LANE_SYMBOL_LOCKED) + +#define DP_LANE_ALIGN_STATUS_UPDATED 0x204 + +#define DP_INTERLANE_ALIGN_DONE (1 << 0) +#define DP_DOWNSTREAM_PORT_STATUS_CHANGED (1 << 6) +#define DP_LINK_STATUS_UPDATED (1 << 7) + +#define DP_SINK_STATUS 0x205 + +#define DP_RECEIVE_PORT_0_STATUS (1 << 0) +#define DP_RECEIVE_PORT_1_STATUS (1 << 1) + +#define DP_ADJUST_REQUEST_LANE0_1 0x206 +#define DP_ADJUST_REQUEST_LANE2_3 0x207 +# define DP_ADJUST_VOLTAGE_SWING_LANE0_MASK 0x03 +# define DP_ADJUST_VOLTAGE_SWING_LANE0_SHIFT 0 +# define DP_ADJUST_PRE_EMPHASIS_LANE0_MASK 0x0c +# define DP_ADJUST_PRE_EMPHASIS_LANE0_SHIFT 2 +# define DP_ADJUST_VOLTAGE_SWING_LANE1_MASK 0x30 +# define DP_ADJUST_VOLTAGE_SWING_LANE1_SHIFT 4 +# define DP_ADJUST_PRE_EMPHASIS_LANE1_MASK 0xc0 +# define DP_ADJUST_PRE_EMPHASIS_LANE1_SHIFT 6 + +#define DP_TEST_REQUEST 0x218 +# define DP_TEST_LINK_TRAINING (1 << 0) +# define DP_TEST_LINK_PATTERN (1 << 1) +# define DP_TEST_LINK_EDID_READ (1 << 2) +# define DP_TEST_LINK_PHY_TEST_PATTERN (1 << 3) /* DPCD >= 1.1 */ + +#define DP_TEST_LINK_RATE 0x219 +# define DP_LINK_RATE_162 (0x6) +# define DP_LINK_RATE_27 (0xa) + +#define DP_TEST_LANE_COUNT 0x220 + +#define DP_TEST_PATTERN 0x221 + +#define DP_TEST_RESPONSE 0x260 +# define DP_TEST_ACK (1 << 0) +# define DP_TEST_NAK (1 << 1) +# define DP_TEST_EDID_CHECKSUM_WRITE (1 << 2) + +#define DP_SET_POWER 0x600 +# define DP_SET_POWER_D0 0x1 +# define DP_SET_POWER_D3 0x2 + +#define DP_PSR_ERROR_STATUS 0x2006 +# define DP_PSR_LINK_CRC_ERROR (1 << 0) +# define DP_PSR_RFB_STORAGE_ERROR (1 << 1) + +#define DP_PSR_ESI 0x2007 +# define DP_PSR_CAPS_CHANGE (1 << 0) + +#define DP_PSR_STATUS 0x2008 +# define DP_PSR_SINK_INACTIVE 0 +# define DP_PSR_SINK_ACTIVE_SRC_SYNCED 1 +# define DP_PSR_SINK_ACTIVE_RFB 2 +# define DP_PSR_SINK_ACTIVE_SINK_SYNCED 3 +# define DP_PSR_SINK_ACTIVE_RESYNC 4 +# define DP_PSR_SINK_INTERNAL_ERROR 7 +# define DP_PSR_SINK_STATE_MASK 0x07 + +#define MODE_I2C_START 1 +#define MODE_I2C_WRITE 2 +#define MODE_I2C_READ 4 +#define MODE_I2C_STOP 8 + +struct iic_dp_aux_data { + bool running; + u16 address; + void *priv; + int (*aux_ch)(device_t adapter, int mode, uint8_t write_byte, + uint8_t *read_byte); + device_t port; +}; + +int iic_dp_aux_add_bus(device_t dev, const char *name, + int (*ch)(device_t idev, int mode, uint8_t write_byte, uint8_t *read_byte), + void *priv, device_t *bus, device_t *adapter); + +#endif /* _DRM_DP_HELPER_H_ */ diff --git a/sys/dev/drm2/drm_dp_iic_helper.c b/sys/dev/drm2/drm_dp_iic_helper.c new file mode 100644 index 00000000000..6d54170e722 --- /dev/null +++ b/sys/dev/drm2/drm_dp_iic_helper.c @@ -0,0 +1,292 @@ +/* + * Copyright © 2009 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include "iicbus_if.h" +#include +#include +#include + +static int +iic_dp_aux_transaction(device_t idev, int mode, uint8_t write_byte, + uint8_t *read_byte) +{ + struct iic_dp_aux_data *aux_data; + int ret; + + aux_data = device_get_softc(idev); + ret = (*aux_data->aux_ch)(idev, mode, write_byte, read_byte); + return (ret); +} + +/* + * I2C over AUX CH + */ + +/* + * Send the address. If the I2C link is running, this 'restarts' + * the connection with the new address, this is used for doing + * a write followed by a read (as needed for DDC) + */ +static int +iic_dp_aux_address(device_t idev, u16 address, bool reading) +{ + struct iic_dp_aux_data *aux_data; + int mode, ret; + + aux_data = device_get_softc(idev); + mode = MODE_I2C_START; + if (reading) + mode |= MODE_I2C_READ; + else + mode |= MODE_I2C_WRITE; + aux_data->address = address; + aux_data->running = true; + ret = iic_dp_aux_transaction(idev, mode, 0, NULL); + return (ret); +} + +/* + * Stop the I2C transaction. This closes out the link, sending + * a bare address packet with the MOT bit turned off + */ +static void +iic_dp_aux_stop(device_t idev, bool reading) +{ + struct iic_dp_aux_data *aux_data; + int mode; + + aux_data = device_get_softc(idev); + mode = MODE_I2C_STOP; + if (reading) + mode |= MODE_I2C_READ; + else + mode |= MODE_I2C_WRITE; + if (aux_data->running) { + (void)iic_dp_aux_transaction(idev, mode, 0, NULL); + aux_data->running = false; + } +} + +/* + * Write a single byte to the current I2C address, the + * the I2C link must be running or this returns -EIO + */ +static int +iic_dp_aux_put_byte(device_t idev, u8 byte) +{ + struct iic_dp_aux_data *aux_data; + int ret; + + aux_data = device_get_softc(idev); + + if (!aux_data->running) + return (EIO); + + ret = iic_dp_aux_transaction(idev, MODE_I2C_WRITE, byte, NULL); + return (ret); +} + +/* + * Read a single byte from the current I2C address, the + * I2C link must be running or this returns -EIO + */ +static int +iic_dp_aux_get_byte(device_t idev, u8 *byte_ret) +{ + struct iic_dp_aux_data *aux_data; + int ret; + + aux_data = device_get_softc(idev); + + if (!aux_data->running) + return (EIO); + + ret = iic_dp_aux_transaction(idev, MODE_I2C_READ, 0, byte_ret); + return (ret); +} + +static int +iic_dp_aux_xfer(device_t idev, struct iic_msg *msgs, uint32_t num) +{ + u8 *buf; + int b, m, ret; + u16 len; + bool reading; + + ret = 0; + reading = false; + + for (m = 0; m < num; m++) { + len = msgs[m].len; + buf = msgs[m].buf; + reading = (msgs[m].flags & IIC_M_RD) != 0; + ret = iic_dp_aux_address(idev, msgs[m].slave, reading); + if (ret != 0) + break; + if (reading) { + for (b = 0; b < len; b++) { + ret = iic_dp_aux_get_byte(idev, &buf[b]); + if (ret != 0) + break; + } + } else { + for (b = 0; b < len; b++) { + ret = iic_dp_aux_put_byte(idev, buf[b]); + if (ret != 0) + break; + } + } + if (ret != 0) + break; + } + iic_dp_aux_stop(idev, reading); + DRM_DEBUG_KMS("dp_aux_xfer return %d\n", ret); + return (ret); +} + +static void +iic_dp_aux_reset_bus(device_t idev) +{ + + (void)iic_dp_aux_address(idev, 0, false); + (void)iic_dp_aux_stop(idev, false); +} + +static int +iic_dp_aux_reset(device_t idev, u_char speed, u_char addr, u_char *oldaddr) +{ + + iic_dp_aux_reset_bus(idev); + return (0); +} + +static int +iic_dp_aux_prepare_bus(device_t idev) +{ + + /* adapter->retries = 3; */ + iic_dp_aux_reset_bus(idev); + return (0); +} + +static int +iic_dp_aux_probe(device_t idev) +{ + + return (BUS_PROBE_DEFAULT); +} + +static int +iic_dp_aux_attach(device_t idev) +{ + struct iic_dp_aux_data *aux_data; + + aux_data = device_get_softc(idev); + aux_data->port = device_add_child(idev, "iicbus", -1); + if (aux_data->port == NULL) + return (ENXIO); + device_quiet(aux_data->port); + bus_generic_attach(idev); + return (0); +} + +static int +iic_dp_aux_detach(device_t idev) +{ + struct iic_dp_aux_data *aux_data; + device_t port; + + aux_data = device_get_softc(idev); + + port = aux_data->port; + bus_generic_detach(idev); + if (port != NULL) + device_delete_child(idev, port); + + return (0); +} + +int +iic_dp_aux_add_bus(device_t dev, const char *name, + int (*ch)(device_t idev, int mode, uint8_t write_byte, uint8_t *read_byte), + void *priv, device_t *bus, device_t *adapter) +{ + device_t ibus; + struct iic_dp_aux_data *data; + int idx, error; + static int dp_bus_counter; + + mtx_lock(&Giant); + + idx = atomic_fetchadd_int(&dp_bus_counter, 1); + ibus = device_add_child(dev, "drm_iic_dp_aux", idx); + if (ibus == NULL) { + mtx_unlock(&Giant); + DRM_ERROR("drm_iic_dp_aux bus %d creation error\n", idx); + return (-ENXIO); + } + device_quiet(ibus); + error = device_probe_and_attach(ibus); + if (error != 0) { + device_delete_child(dev, ibus); + mtx_unlock(&Giant); + DRM_ERROR("drm_iic_dp_aux bus %d attach failed, %d\n", + idx, error); + return (-error); + } + data = device_get_softc(ibus); + data->running = false; + data->address = 0; + data->aux_ch = ch; + data->priv = priv; + error = iic_dp_aux_prepare_bus(ibus); + if (error == 0) { + *bus = ibus; + *adapter = data->port; + } + mtx_unlock(&Giant); + return (error); +} + +static device_method_t drm_iic_dp_aux_methods[] = { + DEVMETHOD(device_probe, iic_dp_aux_probe), + DEVMETHOD(device_attach, iic_dp_aux_attach), + DEVMETHOD(device_detach, iic_dp_aux_detach), + DEVMETHOD(iicbus_reset, iic_dp_aux_reset), + DEVMETHOD(iicbus_transfer, iic_dp_aux_xfer), + DEVMETHOD_END +}; +static driver_t drm_iic_dp_aux_driver = { + "drm_iic_dp_aux", + drm_iic_dp_aux_methods, + sizeof(struct iic_dp_aux_data) +}; +static devclass_t drm_iic_dp_aux_devclass; +DRIVER_MODULE_ORDERED(drm_iic_dp_aux, drmn, drm_iic_dp_aux_driver, + drm_iic_dp_aux_devclass, 0, 0, SI_ORDER_SECOND); diff --git a/sys/dev/drm2/drm_drawable.c b/sys/dev/drm2/drm_drawable.c new file mode 100644 index 00000000000..e8c4e02eaf4 --- /dev/null +++ b/sys/dev/drm2/drm_drawable.c @@ -0,0 +1,173 @@ +/*- + * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_drawable.c + * This file implements ioctls to store information along with DRM drawables, + * such as the current set of cliprects for vblank-synced buffer swaps. + */ + +#include + +struct bsd_drm_drawable_info { + struct drm_drawable_info info; + int handle; + RB_ENTRY(bsd_drm_drawable_info) tree; +}; + +static int +drm_drawable_compare(struct bsd_drm_drawable_info *a, + struct bsd_drm_drawable_info *b) +{ + if (a->handle > b->handle) + return 1; + if (a->handle < b->handle) + return -1; + return 0; +} + +RB_GENERATE_STATIC(drawable_tree, bsd_drm_drawable_info, tree, + drm_drawable_compare); + +struct drm_drawable_info * +drm_get_drawable_info(struct drm_device *dev, int handle) +{ + struct bsd_drm_drawable_info find, *result; + + find.handle = handle; + result = RB_FIND(drawable_tree, &dev->drw_head, &find); + + return &result->info; +} + +int drm_adddraw(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_draw *draw = data; + struct bsd_drm_drawable_info *info; + + info = malloc(sizeof(struct bsd_drm_drawable_info), DRM_MEM_DRAWABLE, + M_NOWAIT | M_ZERO); + if (info == NULL) + return ENOMEM; + + info->handle = alloc_unr(dev->drw_unrhdr); + DRM_SPINLOCK(&dev->drw_lock); + RB_INSERT(drawable_tree, &dev->drw_head, info); + draw->handle = info->handle; + DRM_SPINUNLOCK(&dev->drw_lock); + + DRM_DEBUG("%d\n", draw->handle); + + return 0; +} + +int drm_rmdraw(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_draw *draw = (struct drm_draw *)data; + struct drm_drawable_info *info; + + DRM_SPINLOCK(&dev->drw_lock); + info = drm_get_drawable_info(dev, draw->handle); + if (info != NULL) { + RB_REMOVE(drawable_tree, &dev->drw_head, + (struct bsd_drm_drawable_info *)info); + DRM_SPINUNLOCK(&dev->drw_lock); + free_unr(dev->drw_unrhdr, draw->handle); + free(info->rects, DRM_MEM_DRAWABLE); + free(info, DRM_MEM_DRAWABLE); + return 0; + } else { + DRM_SPINUNLOCK(&dev->drw_lock); + return EINVAL; + } +} + +int drm_update_draw(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_drawable_info *info; + struct drm_update_draw *update = (struct drm_update_draw *)data; + int ret; + + info = drm_get_drawable_info(dev, update->handle); + if (info == NULL) + return EINVAL; + + switch (update->type) { + case DRM_DRAWABLE_CLIPRECTS: + DRM_SPINLOCK(&dev->drw_lock); + if (update->num != info->num_rects) { + free(info->rects, DRM_MEM_DRAWABLE); + info->rects = NULL; + info->num_rects = 0; + } + if (update->num == 0) { + DRM_SPINUNLOCK(&dev->drw_lock); + return 0; + } + if (info->rects == NULL) { + info->rects = malloc(sizeof(*info->rects) * + update->num, DRM_MEM_DRAWABLE, M_NOWAIT); + if (info->rects == NULL) { + DRM_SPINUNLOCK(&dev->drw_lock); + return ENOMEM; + } + info->num_rects = update->num; + } + /* For some reason the pointer arg is unsigned long long. */ + ret = copyin((void *)(intptr_t)update->data, info->rects, + sizeof(*info->rects) * info->num_rects); + DRM_SPINUNLOCK(&dev->drw_lock); + return ret; + default: + return EINVAL; + } +} + +void drm_drawable_free_all(struct drm_device *dev) +{ + struct bsd_drm_drawable_info *info, *next; + + DRM_SPINLOCK(&dev->drw_lock); + for (info = RB_MIN(drawable_tree, &dev->drw_head); + info != NULL ; info = next) { + next = RB_NEXT(drawable_tree, &dev->drw_head, info); + RB_REMOVE(drawable_tree, &dev->drw_head, + (struct bsd_drm_drawable_info *)info); + DRM_SPINUNLOCK(&dev->drw_lock); + free_unr(dev->drw_unrhdr, info->handle); + free(info->info.rects, DRM_MEM_DRAWABLE); + free(info, DRM_MEM_DRAWABLE); + DRM_SPINLOCK(&dev->drw_lock); + } + DRM_SPINUNLOCK(&dev->drw_lock); +} diff --git a/sys/dev/drm2/drm_drv.c b/sys/dev/drm2/drm_drv.c new file mode 100644 index 00000000000..42ff1944bcd --- /dev/null +++ b/sys/dev/drm2/drm_drv.c @@ -0,0 +1,980 @@ +/*- + * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_drv.c + * The catch-all file for DRM device support, including module setup/teardown, + * open/close, and ioctl dispatch. + */ + + +#include +#include +#include +#include +#include + +#ifdef DRM_DEBUG_DEFAULT_ON +int drm_debug_flag = 1; +#else +int drm_debug_flag = 2; +#endif +int drm_notyet_flag = 0; + +unsigned int drm_vblank_offdelay = 5000; /* Default to 5000 msecs. */ +unsigned int drm_timestamp_precision = 20; /* Default to 20 usecs. */ + +static int drm_load(struct drm_device *dev); +static void drm_unload(struct drm_device *dev); +static drm_pci_id_list_t *drm_find_description(int vendor, int device, + drm_pci_id_list_t *idlist); + +static int +drm_modevent(module_t mod, int type, void *data) +{ + + switch (type) { + case MOD_LOAD: + TUNABLE_INT_FETCH("drm.debug", &drm_debug_flag); + TUNABLE_INT_FETCH("drm.notyet", &drm_notyet_flag); + break; + } + return (0); +} + +static moduledata_t drm_mod = { + "drmn", + drm_modevent, + 0 +}; +DECLARE_MODULE(drmn, drm_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); +MODULE_VERSION(drmn, 1); +MODULE_DEPEND(drmn, agp, 1, 1, 1); +MODULE_DEPEND(drmn, pci, 1, 1, 1); +MODULE_DEPEND(drmn, mem, 1, 1, 1); +MODULE_DEPEND(drmn, iicbus, 1, 1, 1); + +static drm_ioctl_desc_t drm_ioctls[256] = { + DRM_IOCTL_DEF(DRM_IOCTL_VERSION, drm_version, 0), + DRM_IOCTL_DEF(DRM_IOCTL_GET_UNIQUE, drm_getunique, 0), + DRM_IOCTL_DEF(DRM_IOCTL_GET_MAGIC, drm_getmagic, 0), + DRM_IOCTL_DEF(DRM_IOCTL_IRQ_BUSID, drm_irq_by_busid, DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_getmap, 0), + DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, 0), + DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, 0), + DRM_IOCTL_DEF(DRM_IOCTL_GET_CAP, drm_getcap, DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_MASTER|DRM_ROOT_ONLY), + + DRM_IOCTL_DEF(DRM_IOCTL_SET_UNIQUE, drm_setunique, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_BLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_UNBLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_AUTH_MAGIC, drm_authmagic, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + + DRM_IOCTL_DEF(DRM_IOCTL_ADD_MAP, drm_addmap_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_RM_MAP, drm_rmmap_ioctl, DRM_AUTH), + + DRM_IOCTL_DEF(DRM_IOCTL_SET_SAREA_CTX, drm_setsareactx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_GET_SAREA_CTX, drm_getsareactx, DRM_AUTH), + + DRM_IOCTL_DEF(DRM_IOCTL_SET_MASTER, drm_setmaster_ioctl, DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_DROP_MASTER, drm_dropmaster_ioctl, DRM_ROOT_ONLY), + + DRM_IOCTL_DEF(DRM_IOCTL_ADD_CTX, drm_addctx, DRM_AUTH|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_RM_CTX, drm_rmctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_MOD_CTX, drm_modctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_GET_CTX, drm_getctx, DRM_AUTH), + DRM_IOCTL_DEF(DRM_IOCTL_SWITCH_CTX, drm_switchctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_NEW_CTX, drm_newctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_RES_CTX, drm_resctx, DRM_AUTH), + + DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_adddraw, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_rmdraw, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + + DRM_IOCTL_DEF(DRM_IOCTL_LOCK, drm_lock, DRM_AUTH), + DRM_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_unlock, DRM_AUTH), + + DRM_IOCTL_DEF(DRM_IOCTL_FINISH, drm_noop, DRM_AUTH), + + DRM_IOCTL_DEF(DRM_IOCTL_ADD_BUFS, drm_addbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_MARK_BUFS, drm_markbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_INFO_BUFS, drm_infobufs, DRM_AUTH), + DRM_IOCTL_DEF(DRM_IOCTL_MAP_BUFS, drm_mapbufs, DRM_AUTH), + DRM_IOCTL_DEF(DRM_IOCTL_FREE_BUFS, drm_freebufs, DRM_AUTH), + DRM_IOCTL_DEF(DRM_IOCTL_DMA, drm_dma, DRM_AUTH), + + DRM_IOCTL_DEF(DRM_IOCTL_CONTROL, drm_control, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + + DRM_IOCTL_DEF(DRM_IOCTL_AGP_ACQUIRE, drm_agp_acquire_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_AGP_RELEASE, drm_agp_release_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_AGP_ENABLE, drm_agp_enable_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_AGP_INFO, drm_agp_info_ioctl, DRM_AUTH), + DRM_IOCTL_DEF(DRM_IOCTL_AGP_ALLOC, drm_agp_alloc_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_AGP_FREE, drm_agp_free_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_AGP_BIND, drm_agp_bind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_AGP_UNBIND, drm_agp_unbind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + + DRM_IOCTL_DEF(DRM_IOCTL_SG_ALLOC, drm_sg_alloc_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_SG_FREE, drm_sg_free, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_IOCTL_WAIT_VBLANK, drm_wait_vblank, DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODESET_CTL, drm_modeset_ctl, 0), + DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_update_draw, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + + DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH|DRM_UNLOCKED), + + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANERESOURCES, drm_mode_getplane_res, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANE, drm_mode_getplane, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPLANE, drm_mode_setplane, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, DRM_MASTER|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_mode_attachmode_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_mode_detachmode_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, DRM_MASTER | DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_mode_connector_property_set_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB2, drm_mode_addfb2, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), +}; + +static struct cdevsw drm_cdevsw = { + .d_version = D_VERSION, + .d_open = drm_open, + .d_read = drm_read, + .d_ioctl = drm_ioctl, + .d_poll = drm_poll, + .d_mmap = drm_mmap, + .d_mmap_single = drm_gem_mmap_single, + .d_name = "drm", + .d_flags = D_TRACKCLOSE +}; + +static int drm_msi = 1; /* Enable by default. */ +TUNABLE_INT("hw.drm.msi", &drm_msi); +SYSCTL_NODE(_hw, OID_AUTO, drm, CTLFLAG_RW, NULL, "DRM device"); +SYSCTL_INT(_hw_drm, OID_AUTO, msi, CTLFLAG_RDTUN, &drm_msi, 1, + "Enable MSI interrupts for drm devices"); + +static struct drm_msi_blacklist_entry drm_msi_blacklist[] = { + {0x8086, 0x2772}, /* Intel i945G */ \ + {0x8086, 0x27A2}, /* Intel i945GM */ \ + {0x8086, 0x27AE}, /* Intel i945GME */ \ + {0, 0} +}; + +static int drm_msi_is_blacklisted(int vendor, int device) +{ + int i = 0; + + for (i = 0; drm_msi_blacklist[i].vendor != 0; i++) { + if ((drm_msi_blacklist[i].vendor == vendor) && + (drm_msi_blacklist[i].device == device)) { + return 1; + } + } + + return 0; +} + +int drm_probe(device_t kdev, drm_pci_id_list_t *idlist) +{ + drm_pci_id_list_t *id_entry; + int vendor, device; + + vendor = pci_get_vendor(kdev); + device = pci_get_device(kdev); + + if (pci_get_class(kdev) != PCIC_DISPLAY + || pci_get_subclass(kdev) != PCIS_DISPLAY_VGA) + return ENXIO; + + id_entry = drm_find_description(vendor, device, idlist); + if (id_entry != NULL) { + if (!device_get_desc(kdev)) { + DRM_DEBUG("desc : %s\n", device_get_desc(kdev)); + device_set_desc(kdev, id_entry->name); + } + return 0; + } + + return ENXIO; +} + +int drm_attach(device_t kdev, drm_pci_id_list_t *idlist) +{ + struct drm_device *dev; + drm_pci_id_list_t *id_entry; + int error, msicount; + + dev = device_get_softc(kdev); + + dev->device = kdev; + + dev->pci_domain = pci_get_domain(dev->device); + dev->pci_bus = pci_get_bus(dev->device); + dev->pci_slot = pci_get_slot(dev->device); + dev->pci_func = pci_get_function(dev->device); + + dev->pci_vendor = pci_get_vendor(dev->device); + dev->pci_device = pci_get_device(dev->device); + + if (drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) { + if (drm_msi && + !drm_msi_is_blacklisted(dev->pci_vendor, dev->pci_device)) { + msicount = pci_msi_count(dev->device); + DRM_DEBUG("MSI count = %d\n", msicount); + if (msicount > 1) + msicount = 1; + + if (pci_alloc_msi(dev->device, &msicount) == 0) { + DRM_INFO("MSI enabled %d message(s)\n", + msicount); + dev->msi_enabled = 1; + dev->irqrid = 1; + } + } + + dev->irqr = bus_alloc_resource_any(dev->device, SYS_RES_IRQ, + &dev->irqrid, RF_SHAREABLE); + if (!dev->irqr) { + return (ENOENT); + } + + dev->irq = (int) rman_get_start(dev->irqr); + } + + mtx_init(&dev->dev_lock, "drmdev", NULL, MTX_DEF); + mtx_init(&dev->irq_lock, "drmirq", NULL, MTX_DEF); + mtx_init(&dev->vbl_lock, "drmvbl", NULL, MTX_DEF); + mtx_init(&dev->drw_lock, "drmdrw", NULL, MTX_DEF); + mtx_init(&dev->event_lock, "drmev", NULL, MTX_DEF); + sx_init(&dev->dev_struct_lock, "drmslk"); + + id_entry = drm_find_description(dev->pci_vendor, + dev->pci_device, idlist); + dev->id_entry = id_entry; + + error = drm_load(dev); + if (error == 0) + error = drm_create_cdevs(kdev); + return (error); +} + +int +drm_create_cdevs(device_t kdev) +{ + struct drm_device *dev; + int error, unit; + + unit = device_get_unit(kdev); + dev = device_get_softc(kdev); + + error = make_dev_p(MAKEDEV_WAITOK | MAKEDEV_CHECKNAME, &dev->devnode, + &drm_cdevsw, 0, DRM_DEV_UID, DRM_DEV_GID, + DRM_DEV_MODE, "dri/card%d", unit); + if (error == 0) + dev->devnode->si_drv1 = dev; + return (error); +} + +int drm_detach(device_t kdev) +{ + struct drm_device *dev; + + dev = device_get_softc(kdev); + drm_unload(dev); + if (dev->irqr) { + bus_release_resource(dev->device, SYS_RES_IRQ, dev->irqrid, + dev->irqr); + if (dev->msi_enabled) { + pci_release_msi(dev->device); + DRM_INFO("MSI released\n"); + } + } + return (0); +} + +#ifndef DRM_DEV_NAME +#define DRM_DEV_NAME "drm" +#endif + +devclass_t drm_devclass; + +drm_pci_id_list_t *drm_find_description(int vendor, int device, + drm_pci_id_list_t *idlist) +{ + int i = 0; + + for (i = 0; idlist[i].vendor != 0; i++) { + if ((idlist[i].vendor == vendor) && + ((idlist[i].device == device) || + (idlist[i].device == 0))) { + return &idlist[i]; + } + } + return NULL; +} + +static int drm_firstopen(struct drm_device *dev) +{ + drm_local_map_t *map; + int i; + + DRM_LOCK_ASSERT(dev); + + /* prebuild the SAREA */ + i = drm_addmap(dev, 0, SAREA_MAX, _DRM_SHM, + _DRM_CONTAINS_LOCK, &map); + if (i != 0) + return i; + + if (dev->driver->firstopen) + dev->driver->firstopen(dev); + + dev->buf_use = 0; + + if (drm_core_check_feature(dev, DRIVER_HAVE_DMA)) { + i = drm_dma_setup(dev); + if (i != 0) + return i; + } + + for (i = 0; i < DRM_HASH_SIZE; i++) { + dev->magiclist[i].head = NULL; + dev->magiclist[i].tail = NULL; + } + + dev->lock.lock_queue = 0; + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + dev->irq_enabled = 0; + dev->context_flag = 0; + dev->last_context = 0; + dev->if_version = 0; + + dev->buf_sigio = NULL; + + DRM_DEBUG("\n"); + + return 0; +} + +static int drm_lastclose(struct drm_device *dev) +{ + drm_magic_entry_t *pt, *next; + drm_local_map_t *map, *mapsave; + int i; + + DRM_LOCK_ASSERT(dev); + + DRM_DEBUG("\n"); + + if (dev->driver->lastclose != NULL) + dev->driver->lastclose(dev); + + if (!drm_core_check_feature(dev, DRIVER_MODESET) && dev->irq_enabled) + drm_irq_uninstall(dev); + + if (dev->unique) { + free(dev->unique, DRM_MEM_DRIVER); + dev->unique = NULL; + dev->unique_len = 0; + } + /* Clear pid list */ + for (i = 0; i < DRM_HASH_SIZE; i++) { + for (pt = dev->magiclist[i].head; pt; pt = next) { + next = pt->next; + free(pt, DRM_MEM_MAGIC); + } + dev->magiclist[i].head = dev->magiclist[i].tail = NULL; + } + + DRM_UNLOCK(dev); + drm_drawable_free_all(dev); + DRM_LOCK(dev); + + /* Clear AGP information */ + if (dev->agp) { + drm_agp_mem_t *entry; + drm_agp_mem_t *nexte; + + /* Remove AGP resources, but leave dev->agp intact until + * drm_unload is called. + */ + for (entry = dev->agp->memory; entry; entry = nexte) { + nexte = entry->next; + if (entry->bound) + drm_agp_unbind_memory(entry->handle); + drm_agp_free_memory(entry->handle); + free(entry, DRM_MEM_AGPLISTS); + } + dev->agp->memory = NULL; + + if (dev->agp->acquired) + drm_agp_release(dev); + + dev->agp->acquired = 0; + dev->agp->enabled = 0; + } + if (dev->sg != NULL) { + drm_sg_cleanup(dev->sg); + dev->sg = NULL; + } + + TAILQ_FOREACH_SAFE(map, &dev->maplist, link, mapsave) { + if (!(map->flags & _DRM_DRIVER)) + drm_rmmap(dev, map); + } + + drm_dma_takedown(dev); + if (dev->lock.hw_lock) { + dev->lock.hw_lock = NULL; /* SHM removed */ + dev->lock.file_priv = NULL; + DRM_WAKEUP_INT((void *)&dev->lock.lock_queue); + } + + return 0; +} + +static int drm_load(struct drm_device *dev) +{ + int i, retcode; + + DRM_DEBUG("\n"); + + TAILQ_INIT(&dev->maplist); + dev->map_unrhdr = new_unrhdr(1, ((1 << DRM_MAP_HANDLE_BITS) - 1), NULL); + if (dev->map_unrhdr == NULL) { + DRM_ERROR("Couldn't allocate map number allocator\n"); + return EINVAL; + } + + + drm_mem_init(); + drm_sysctl_init(dev); + TAILQ_INIT(&dev->files); + + dev->counters = 6; + dev->types[0] = _DRM_STAT_LOCK; + dev->types[1] = _DRM_STAT_OPENS; + dev->types[2] = _DRM_STAT_CLOSES; + dev->types[3] = _DRM_STAT_IOCTLS; + dev->types[4] = _DRM_STAT_LOCKS; + dev->types[5] = _DRM_STAT_UNLOCKS; + + for (i = 0; i < DRM_ARRAY_SIZE(dev->counts); i++) + atomic_set(&dev->counts[i], 0); + + INIT_LIST_HEAD(&dev->vblank_event_list); + + if (drm_core_has_AGP(dev)) { + if (drm_device_is_agp(dev)) + dev->agp = drm_agp_init(); + if (drm_core_check_feature(dev, DRIVER_REQUIRE_AGP) && + dev->agp == NULL) { + DRM_ERROR("Card isn't AGP, or couldn't initialize " + "AGP.\n"); + retcode = ENOMEM; + goto error; + } + if (dev->agp != NULL && dev->agp->info.ai_aperture_base != 0) { + if (drm_mtrr_add(dev->agp->info.ai_aperture_base, + dev->agp->info.ai_aperture_size, DRM_MTRR_WC) == 0) + dev->agp->mtrr = 1; + } + } + + retcode = drm_ctxbitmap_init(dev); + if (retcode != 0) { + DRM_ERROR("Cannot allocate memory for context bitmap.\n"); + goto error; + } + + dev->drw_unrhdr = new_unrhdr(1, INT_MAX, NULL); + if (dev->drw_unrhdr == NULL) { + DRM_ERROR("Couldn't allocate drawable number allocator\n"); + retcode = ENOMEM; + goto error; + } + + if (dev->driver->driver_features & DRIVER_GEM) { + retcode = drm_gem_init(dev); + if (retcode != 0) { + DRM_ERROR("Cannot initialize graphics execution " + "manager (GEM)\n"); + goto error1; + } + } + + if (dev->driver->load != NULL) { + DRM_LOCK(dev); + /* Shared code returns -errno. */ + retcode = -dev->driver->load(dev, + dev->id_entry->driver_private); + if (pci_enable_busmaster(dev->device)) + DRM_ERROR("Request to enable bus-master failed.\n"); + DRM_UNLOCK(dev); + if (retcode != 0) + goto error; + } + + DRM_INFO("Initialized %s %d.%d.%d %s\n", + dev->driver->name, + dev->driver->major, + dev->driver->minor, + dev->driver->patchlevel, + dev->driver->date); + + return 0; + +error1: + delete_unrhdr(dev->drw_unrhdr); +error: + drm_sysctl_cleanup(dev); + DRM_LOCK(dev); + drm_lastclose(dev); + DRM_UNLOCK(dev); + if (dev->devnode != NULL) + destroy_dev(dev->devnode); + + mtx_destroy(&dev->drw_lock); + mtx_destroy(&dev->vbl_lock); + mtx_destroy(&dev->irq_lock); + mtx_destroy(&dev->dev_lock); + mtx_destroy(&dev->event_lock); + sx_destroy(&dev->dev_struct_lock); + + return retcode; +} + +static void drm_unload(struct drm_device *dev) +{ + int i; + + DRM_DEBUG("\n"); + + drm_sysctl_cleanup(dev); + if (dev->devnode != NULL) + destroy_dev(dev->devnode); + + drm_ctxbitmap_cleanup(dev); + + if (dev->driver->driver_features & DRIVER_GEM) + drm_gem_destroy(dev); + + if (dev->agp && dev->agp->mtrr) { + int __unused retcode; + + retcode = drm_mtrr_del(0, dev->agp->info.ai_aperture_base, + dev->agp->info.ai_aperture_size, DRM_MTRR_WC); + DRM_DEBUG("mtrr_del = %d", retcode); + } + + drm_vblank_cleanup(dev); + + DRM_LOCK(dev); + drm_lastclose(dev); + DRM_UNLOCK(dev); + + /* Clean up PCI resources allocated by drm_bufs.c. We're not really + * worried about resource consumption while the DRM is inactive (between + * lastclose and firstopen or unload) because these aren't actually + * taking up KVA, just keeping the PCI resource allocated. + */ + for (i = 0; i < DRM_MAX_PCI_RESOURCE; i++) { + if (dev->pcir[i] == NULL) + continue; + bus_release_resource(dev->device, SYS_RES_MEMORY, + dev->pcirid[i], dev->pcir[i]); + dev->pcir[i] = NULL; + } + + if (dev->agp) { + free(dev->agp, DRM_MEM_AGPLISTS); + dev->agp = NULL; + } + + if (dev->driver->unload != NULL) { + DRM_LOCK(dev); + dev->driver->unload(dev); + DRM_UNLOCK(dev); + } + + delete_unrhdr(dev->drw_unrhdr); + delete_unrhdr(dev->map_unrhdr); + + drm_mem_uninit(); + + if (pci_disable_busmaster(dev->device)) + DRM_ERROR("Request to disable bus-master failed.\n"); + + mtx_destroy(&dev->drw_lock); + mtx_destroy(&dev->vbl_lock); + mtx_destroy(&dev->irq_lock); + mtx_destroy(&dev->dev_lock); + mtx_destroy(&dev->event_lock); + sx_destroy(&dev->dev_struct_lock); +} + +int drm_version(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_version *version = data; + int len; + +#define DRM_COPY( name, value ) \ + len = strlen( value ); \ + if ( len > name##_len ) len = name##_len; \ + name##_len = strlen( value ); \ + if ( len && name ) { \ + if ( DRM_COPY_TO_USER( name, value, len ) ) \ + return EFAULT; \ + } + + version->version_major = dev->driver->major; + version->version_minor = dev->driver->minor; + version->version_patchlevel = dev->driver->patchlevel; + + DRM_COPY(version->name, dev->driver->name); + DRM_COPY(version->date, dev->driver->date); + DRM_COPY(version->desc, dev->driver->desc); + + return 0; +} + +int +drm_open(struct cdev *kdev, int flags, int fmt, DRM_STRUCTPROC *p) +{ + struct drm_device *dev; + int retcode; + + dev = kdev->si_drv1; + if (dev == NULL) + return (ENXIO); + + DRM_DEBUG("open_count = %d\n", dev->open_count); + + retcode = drm_open_helper(kdev, flags, fmt, p, dev); + + if (retcode == 0) { + atomic_inc(&dev->counts[_DRM_STAT_OPENS]); + DRM_LOCK(dev); + mtx_lock(&Giant); + device_busy(dev->device); + mtx_unlock(&Giant); + if (!dev->open_count++) + retcode = drm_firstopen(dev); + DRM_UNLOCK(dev); + } + + return (retcode); +} + +void drm_close(void *data) +{ + struct drm_file *file_priv = data; + struct drm_device *dev = file_priv->dev; + int retcode = 0; + + DRM_DEBUG("open_count = %d\n", dev->open_count); + + DRM_LOCK(dev); + + if (dev->driver->preclose != NULL) + dev->driver->preclose(dev, file_priv); + + /* ======================================================== + * Begin inline drm_release + */ + + DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n", + DRM_CURRENTPID, (long)dev->device, dev->open_count); + + if (dev->driver->driver_features & DRIVER_GEM) + drm_gem_release(dev, file_priv); + + if (dev->lock.hw_lock && _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) + && dev->lock.file_priv == file_priv) { + DRM_DEBUG("Process %d dead, freeing lock for context %d\n", + DRM_CURRENTPID, + _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock)); + if (dev->driver->reclaim_buffers_locked != NULL) + dev->driver->reclaim_buffers_locked(dev, file_priv); + + drm_lock_free(&dev->lock, + _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock)); + + /* FIXME: may require heavy-handed reset of + hardware at this point, possibly + processed via a callback to the X + server. */ + } else if (dev->driver->reclaim_buffers_locked != NULL && + dev->lock.hw_lock != NULL) { + /* The lock is required to reclaim buffers */ + for (;;) { + if (!dev->lock.hw_lock) { + /* Device has been unregistered */ + retcode = EINTR; + break; + } + if (drm_lock_take(&dev->lock, DRM_KERNEL_CONTEXT)) { + dev->lock.file_priv = file_priv; + dev->lock.lock_time = jiffies; + atomic_inc(&dev->counts[_DRM_STAT_LOCKS]); + break; /* Got lock */ + } + /* Contention */ + retcode = DRM_LOCK_SLEEP(dev, &dev->lock.lock_queue, + PCATCH, "drmlk2", 0); + if (retcode) + break; + } + if (retcode == 0) { + dev->driver->reclaim_buffers_locked(dev, file_priv); + drm_lock_free(&dev->lock, DRM_KERNEL_CONTEXT); + } + } + + if (drm_core_check_feature(dev, DRIVER_HAVE_DMA) && + !dev->driver->reclaim_buffers_locked) + drm_reclaim_buffers(dev, file_priv); + + funsetown(&dev->buf_sigio); + seldrain(&file_priv->event_poll); + + if (dev->driver->postclose != NULL) + dev->driver->postclose(dev, file_priv); + TAILQ_REMOVE(&dev->files, file_priv, link); + free(file_priv, DRM_MEM_FILES); + + /* ======================================================== + * End inline drm_release + */ + + atomic_inc(&dev->counts[_DRM_STAT_CLOSES]); + mtx_lock(&Giant); + device_unbusy(dev->device); + mtx_unlock(&Giant); + if (--dev->open_count == 0) { + retcode = drm_lastclose(dev); + } + + DRM_UNLOCK(dev); +} + +/* drm_ioctl is called whenever a process performs an ioctl on /dev/drm. + */ +int drm_ioctl(struct cdev *kdev, u_long cmd, caddr_t data, int flags, + DRM_STRUCTPROC *p) +{ + struct drm_device *dev = drm_get_device_from_kdev(kdev); + int retcode = 0; + drm_ioctl_desc_t *ioctl; + int (*func)(struct drm_device *dev, void *data, struct drm_file *file_priv); + int nr = DRM_IOCTL_NR(cmd); + int is_driver_ioctl = 0; + struct drm_file *file_priv; + + retcode = devfs_get_cdevpriv((void **)&file_priv); + if (retcode != 0) { + DRM_ERROR("can't find authenticator\n"); + return EINVAL; + } + + atomic_inc(&dev->counts[_DRM_STAT_IOCTLS]); + ++file_priv->ioctl_count; + + DRM_DEBUG("pid=%d, cmd=0x%02lx, nr=0x%02x, dev 0x%lx, auth=%d\n", + DRM_CURRENTPID, cmd, nr, (long)dev->device, + file_priv->authenticated); + + switch (cmd) { + case FIONBIO: + case FIOASYNC: + return 0; + + case FIOSETOWN: + return fsetown(*(int *)data, &dev->buf_sigio); + + case FIOGETOWN: + *(int *) data = fgetown(&dev->buf_sigio); + return 0; + } + + if (IOCGROUP(cmd) != DRM_IOCTL_BASE) { + DRM_DEBUG("Bad ioctl group 0x%x\n", (int)IOCGROUP(cmd)); + return EINVAL; + } + + ioctl = &drm_ioctls[nr]; + /* It's not a core DRM ioctl, try driver-specific. */ + if (ioctl->func == NULL && nr >= DRM_COMMAND_BASE) { + /* The array entries begin at DRM_COMMAND_BASE ioctl nr */ + nr -= DRM_COMMAND_BASE; + if (nr > dev->driver->max_ioctl) { + DRM_DEBUG("Bad driver ioctl number, 0x%x (of 0x%x)\n", + nr, dev->driver->max_ioctl); + return EINVAL; + } + ioctl = &dev->driver->ioctls[nr]; + is_driver_ioctl = 1; + } + func = ioctl->func; + + if (func == NULL) { + DRM_DEBUG("no function\n"); + return EINVAL; + } + + if (((ioctl->flags & DRM_ROOT_ONLY) && !DRM_SUSER(p)) || + ((ioctl->flags & DRM_AUTH) && !file_priv->authenticated) || + ((ioctl->flags & DRM_MASTER) && !file_priv->master)) + return EACCES; + + if (is_driver_ioctl) { + if ((ioctl->flags & DRM_UNLOCKED) == 0) + DRM_LOCK(dev); + /* shared code returns -errno */ + retcode = -func(dev, data, file_priv); + if ((ioctl->flags & DRM_UNLOCKED) == 0) + DRM_UNLOCK(dev); + } else { + retcode = func(dev, data, file_priv); + } + + if (retcode != 0) + DRM_DEBUG(" returning %d\n", retcode); + if (retcode != 0 && + (drm_debug_flag & DRM_DEBUGBITS_FAILED_IOCTL) != 0) { + printf( +"pid %d, cmd 0x%02lx, nr 0x%02x/%1d, dev 0x%lx, auth %d, res %d\n", + DRM_CURRENTPID, cmd, nr, is_driver_ioctl, (long)dev->device, + file_priv->authenticated, retcode); + } + + return retcode; +} + +drm_local_map_t *drm_getsarea(struct drm_device *dev) +{ + drm_local_map_t *map; + + DRM_LOCK_ASSERT(dev); + TAILQ_FOREACH(map, &dev->maplist, link) { + if (map->type == _DRM_SHM && (map->flags & _DRM_CONTAINS_LOCK)) + return map; + } + + return NULL; +} + +int +drm_add_busid_modesetting(struct drm_device *dev, struct sysctl_ctx_list *ctx, + struct sysctl_oid *top) +{ + struct sysctl_oid *oid; + + snprintf(dev->busid_str, sizeof(dev->busid_str), + "pci:%04x:%02x:%02x.%d", dev->pci_domain, dev->pci_bus, + dev->pci_slot, dev->pci_func); + oid = SYSCTL_ADD_STRING(ctx, SYSCTL_CHILDREN(top), OID_AUTO, "busid", + CTLFLAG_RD, dev->busid_str, 0, NULL); + if (oid == NULL) + return (ENOMEM); + dev->modesetting = (dev->driver->driver_features & DRIVER_MODESET) != 0; + oid = SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(top), OID_AUTO, + "modesetting", CTLFLAG_RD, &dev->modesetting, 0, NULL); + if (oid == NULL) + return (ENOMEM); + + return (0); +} + +#if DRM_LINUX + +#include + +MODULE_DEPEND(DRIVER_NAME, linux, 1, 1, 1); + +#define LINUX_IOCTL_DRM_MIN 0x6400 +#define LINUX_IOCTL_DRM_MAX 0x64ff + +static linux_ioctl_function_t drm_linux_ioctl; +static struct linux_ioctl_handler drm_handler = {drm_linux_ioctl, + LINUX_IOCTL_DRM_MIN, LINUX_IOCTL_DRM_MAX}; + +SYSINIT(drm_register, SI_SUB_KLD, SI_ORDER_MIDDLE, + linux_ioctl_register_handler, &drm_handler); +SYSUNINIT(drm_unregister, SI_SUB_KLD, SI_ORDER_MIDDLE, + linux_ioctl_unregister_handler, &drm_handler); + +/* The bits for in/out are switched on Linux */ +#define LINUX_IOC_IN IOC_OUT +#define LINUX_IOC_OUT IOC_IN + +static int +drm_linux_ioctl(DRM_STRUCTPROC *p, struct linux_ioctl_args* args) +{ + int error; + int cmd = args->cmd; + + args->cmd &= ~(LINUX_IOC_IN | LINUX_IOC_OUT); + if (cmd & LINUX_IOC_IN) + args->cmd |= IOC_IN; + if (cmd & LINUX_IOC_OUT) + args->cmd |= IOC_OUT; + + error = ioctl(p, (struct ioctl_args *)args); + + return error; +} +#endif /* DRM_LINUX */ + +bool +dmi_check_system(const struct dmi_system_id *sysid) +{ + + /* XXXKIB */ + return (false); +} + diff --git a/sys/dev/drm2/drm_edid.c b/sys/dev/drm2/drm_edid.c new file mode 100644 index 00000000000..edd33b005de --- /dev/null +++ b/sys/dev/drm2/drm_edid.c @@ -0,0 +1,1781 @@ +/* + * Copyright (c) 2006 Luc Verhaegen (quirks list) + * Copyright (c) 2007-2008 Intel Corporation + * Jesse Barnes + * Copyright 2010 Red Hat, Inc. + * + * DDC probing routines (drm_ddc_read & drm_do_probe_ddc_edid) originally from + * FB layer. + * Copyright (C) 2006 Dennis Munsie + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include "iicbus_if.h" + +#define version_greater(edid, maj, min) \ + (((edid)->version > (maj)) || \ + ((edid)->version == (maj) && (edid)->revision > (min))) + +#define EDID_EST_TIMINGS 16 +#define EDID_STD_TIMINGS 8 +#define EDID_DETAILED_TIMINGS 4 + +/* + * EDID blocks out in the wild have a variety of bugs, try to collect + * them here (note that userspace may work around broken monitors first, + * but fixes should make their way here so that the kernel "just works" + * on as many displays as possible). + */ + +/* First detailed mode wrong, use largest 60Hz mode */ +#define EDID_QUIRK_PREFER_LARGE_60 (1 << 0) +/* Reported 135MHz pixel clock is too high, needs adjustment */ +#define EDID_QUIRK_135_CLOCK_TOO_HIGH (1 << 1) +/* Prefer the largest mode at 75 Hz */ +#define EDID_QUIRK_PREFER_LARGE_75 (1 << 2) +/* Detail timing is in cm not mm */ +#define EDID_QUIRK_DETAILED_IN_CM (1 << 3) +/* Detailed timing descriptors have bogus size values, so just take the + * maximum size and use that. + */ +#define EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE (1 << 4) +/* Monitor forgot to set the first detailed is preferred bit. */ +#define EDID_QUIRK_FIRST_DETAILED_PREFERRED (1 << 5) +/* use +hsync +vsync for detailed mode */ +#define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6) + +struct detailed_mode_closure { + struct drm_connector *connector; + struct edid *edid; + bool preferred; + u32 quirks; + int modes; +}; + +#define LEVEL_DMT 0 +#define LEVEL_GTF 1 +#define LEVEL_GTF2 2 +#define LEVEL_CVT 3 + +static struct edid_quirk { + char *vendor; + int product_id; + u32 quirks; +} edid_quirk_list[] = { + /* Acer AL1706 */ + { "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 }, + /* Acer F51 */ + { "API", 0x7602, EDID_QUIRK_PREFER_LARGE_60 }, + /* Unknown Acer */ + { "ACR", 2423, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, + + /* Belinea 10 15 55 */ + { "MAX", 1516, EDID_QUIRK_PREFER_LARGE_60 }, + { "MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60 }, + + /* Envision Peripherals, Inc. EN-7100e */ + { "EPI", 59264, EDID_QUIRK_135_CLOCK_TOO_HIGH }, + /* Envision EN2028 */ + { "EPI", 8232, EDID_QUIRK_PREFER_LARGE_60 }, + + /* Funai Electronics PM36B */ + { "FCM", 13600, EDID_QUIRK_PREFER_LARGE_75 | + EDID_QUIRK_DETAILED_IN_CM }, + + /* LG Philips LCD LP154W01-A5 */ + { "LPL", 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE }, + { "LPL", 0x2a00, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE }, + + /* Philips 107p5 CRT */ + { "PHL", 57364, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, + + /* Proview AY765C */ + { "PTS", 765, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, + + /* Samsung SyncMaster 205BW. Note: irony */ + { "SAM", 541, EDID_QUIRK_DETAILED_SYNC_PP }, + /* Samsung SyncMaster 22[5-6]BW */ + { "SAM", 596, EDID_QUIRK_PREFER_LARGE_60 }, + { "SAM", 638, EDID_QUIRK_PREFER_LARGE_60 }, +}; + +/*** DDC fetch and block validation ***/ + +static const u8 edid_header[] = { + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 +}; + + /* + * Sanity check the header of the base EDID block. Return 8 if the header + * is perfect, down to 0 if it's totally wrong. + */ +int drm_edid_header_is_valid(const u8 *raw_edid) +{ + int i, score = 0; + + for (i = 0; i < sizeof(edid_header); i++) + if (raw_edid[i] == edid_header[i]) + score++; + + return score; +} + +/* + * Sanity check the EDID block (base or extension). Return 0 if the block + * doesn't check out, or 1 if it's valid. + */ +static bool +drm_edid_block_valid(u8 *raw_edid) +{ + int i; + u8 csum = 0; + struct edid *edid = (struct edid *)raw_edid; + + if (raw_edid[0] == 0x00) { + int score = drm_edid_header_is_valid(raw_edid); + if (score == 8) ; + else if (score >= 6) { + DRM_DEBUG("Fixing EDID header, your hardware may be failing\n"); + memcpy(raw_edid, edid_header, sizeof(edid_header)); + } else { + goto bad; + } + } + + for (i = 0; i < EDID_LENGTH; i++) + csum += raw_edid[i]; + if (csum) { + DRM_ERROR("EDID checksum is invalid, remainder is %d\n", csum); + + /* allow CEA to slide through, switches mangle this */ + if (raw_edid[0] != 0x02) + goto bad; + } + + /* per-block-type checks */ + switch (raw_edid[0]) { + case 0: /* base */ + if (edid->version != 1) { + DRM_ERROR("EDID has major version %d, instead of 1\n", edid->version); + goto bad; + } + + if (edid->revision > 4) + DRM_DEBUG("EDID minor > 4, assuming backward compatibility\n"); + break; + + default: + break; + } + + return 1; + +bad: + if (raw_edid) { + DRM_DEBUG_KMS("Raw EDID:\n"); + if ((drm_debug_flag & DRM_DEBUGBITS_KMS) != 0) { + for (i = 0; i < EDID_LENGTH; ) { + printf("%02x", raw_edid[i]); + i++; + if (i % 16 == 0 || i == EDID_LENGTH) + printf("\n"); + else if (i % 8 == 0) + printf(" "); + else + printf(" "); + } + } + } + return 0; +} + +/** + * drm_edid_is_valid - sanity check EDID data + * @edid: EDID data + * + * Sanity-check an entire EDID record (including extensions) + */ +bool drm_edid_is_valid(struct edid *edid) +{ + int i; + u8 *raw = (u8 *)edid; + + if (!edid) + return false; + + for (i = 0; i <= edid->extensions; i++) + if (!drm_edid_block_valid(raw + i * EDID_LENGTH)) + return false; + + return true; +} + +#define DDC_ADDR 0x50 +#define DDC_SEGMENT_ADDR 0x30 +/** + * Get EDID information via I2C. + * + * \param adapter : i2c device adaptor + * \param buf : EDID data buffer to be filled + * \param len : EDID data buffer length + * \return 0 on success or -1 on failure. + * + * Try to fetch EDID information by calling i2c driver function. + */ +static int +drm_do_probe_ddc_edid(device_t adapter, unsigned char *buf, + int block, int len) +{ + unsigned char start = block * EDID_LENGTH; + int ret, retries = 5; + + /* The core i2c driver will automatically retry the transfer if the + * adapter reports EAGAIN. However, we find that bit-banging transfers + * are susceptible to errors under a heavily loaded machine and + * generate spurious NAKs and timeouts. Retrying the transfer + * of the individual block a few times seems to overcome this. + */ + do { + struct iic_msg msgs[] = { + { + .slave = DDC_ADDR, + .flags = IIC_M_WR, + .len = 1, + .buf = &start, + }, { + .slave = DDC_ADDR, + .flags = IIC_M_RD, + .len = len, + .buf = buf, + } + }; + ret = iicbus_transfer(adapter, msgs, 2); + if (ret != 0) + DRM_DEBUG_KMS("iicbus_transfer countdown %d error %d\n", + retries, ret); + } while (ret != 0 && --retries); + + return (ret == 0 ? 0 : -1); +} + +static bool drm_edid_is_zero(u8 *in_edid, int length) +{ + int i; + u32 *raw_edid = (u32 *)in_edid; + + for (i = 0; i < length / 4; i++) + if (*(raw_edid + i) != 0) + return false; + return true; +} + +static u8 * +drm_do_get_edid(struct drm_connector *connector, device_t adapter) +{ + int i, j = 0, valid_extensions = 0; + u8 *block, *new; + + block = malloc(EDID_LENGTH, DRM_MEM_KMS, M_WAITOK | M_ZERO); + + /* base block fetch */ + for (i = 0; i < 4; i++) { + if (drm_do_probe_ddc_edid(adapter, block, 0, EDID_LENGTH)) + goto out; + if (drm_edid_block_valid(block)) + break; + if (i == 0 && drm_edid_is_zero(block, EDID_LENGTH)) { + connector->null_edid_counter++; + goto carp; + } + } + if (i == 4) + goto carp; + + /* if there's no extensions, we're done */ + if (block[0x7e] == 0) + return block; + + new = reallocf(block, (block[0x7e] + 1) * EDID_LENGTH, DRM_MEM_KMS, + M_WAITOK); + block = new; + + for (j = 1; j <= block[0x7e]; j++) { + for (i = 0; i < 4; i++) { + if (drm_do_probe_ddc_edid(adapter, + block + (valid_extensions + 1) * EDID_LENGTH, + j, EDID_LENGTH)) + goto out; + if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH)) { + valid_extensions++; + break; + } + } + if (i == 4) + DRM_DEBUG_KMS("%s: Ignoring invalid EDID block %d.\n", + drm_get_connector_name(connector), j); + } + + if (valid_extensions != block[0x7e]) { + block[EDID_LENGTH-1] += block[0x7e] - valid_extensions; + block[0x7e] = valid_extensions; + new = reallocf(block, (valid_extensions + 1) * EDID_LENGTH, + DRM_MEM_KMS, M_WAITOK); + block = new; + } + + DRM_DEBUG_KMS("got EDID from %s\n", drm_get_connector_name(connector)); + return block; + +carp: + DRM_ERROR("%s: EDID block %d invalid.\n", + drm_get_connector_name(connector), j); + +out: + free(block, DRM_MEM_KMS); + return NULL; +} + +/** + * Probe DDC presence. + * + * \param adapter : i2c device adaptor + * \return 1 on success + */ +static bool +drm_probe_ddc(device_t adapter) +{ + unsigned char out; + + return (drm_do_probe_ddc_edid(adapter, &out, 0, 1) == 0); +} + +/** + * drm_get_edid - get EDID data, if available + * @connector: connector we're probing + * @adapter: i2c adapter to use for DDC + * + * Poke the given i2c channel to grab EDID data if possible. If found, + * attach it to the connector. + * + * Return edid data or NULL if we couldn't find any. + */ +struct edid *drm_get_edid(struct drm_connector *connector, + device_t adapter) +{ + struct edid *edid = NULL; + + if (drm_probe_ddc(adapter)) + edid = (struct edid *)drm_do_get_edid(connector, adapter); + + connector->display_info.raw_edid = (char *)edid; + + return edid; + +} + +/*** EDID parsing ***/ + +/** + * edid_vendor - match a string against EDID's obfuscated vendor field + * @edid: EDID to match + * @vendor: vendor string + * + * Returns true if @vendor is in @edid, false otherwise + */ +static bool edid_vendor(struct edid *edid, char *vendor) +{ + char edid_vendor[3]; + + edid_vendor[0] = ((edid->mfg_id[0] & 0x7c) >> 2) + '@'; + edid_vendor[1] = (((edid->mfg_id[0] & 0x3) << 3) | + ((edid->mfg_id[1] & 0xe0) >> 5)) + '@'; + edid_vendor[2] = (edid->mfg_id[1] & 0x1f) + '@'; + + return !strncmp(edid_vendor, vendor, 3); +} + +/** + * edid_get_quirks - return quirk flags for a given EDID + * @edid: EDID to process + * + * This tells subsequent routines what fixes they need to apply. + */ +static u32 edid_get_quirks(struct edid *edid) +{ + struct edid_quirk *quirk; + int i; + + for (i = 0; i < DRM_ARRAY_SIZE(edid_quirk_list); i++) { + quirk = &edid_quirk_list[i]; + + if (edid_vendor(edid, quirk->vendor) && + (EDID_PRODUCT_ID(edid) == quirk->product_id)) + return quirk->quirks; + } + + return 0; +} + +#define MODE_SIZE(m) ((m)->hdisplay * (m)->vdisplay) +#define MODE_REFRESH_DIFF(m,r) (abs((m)->vrefresh - target_refresh)) + +/** + * edid_fixup_preferred - set preferred modes based on quirk list + * @connector: has mode list to fix up + * @quirks: quirks list + * + * Walk the mode list for @connector, clearing the preferred status + * on existing modes and setting it anew for the right mode ala @quirks. + */ +static void edid_fixup_preferred(struct drm_connector *connector, + u32 quirks) +{ + struct drm_display_mode *t, *cur_mode, *preferred_mode; + int target_refresh = 0; + + if (list_empty(&connector->probed_modes)) + return; + + if (quirks & EDID_QUIRK_PREFER_LARGE_60) + target_refresh = 60; + if (quirks & EDID_QUIRK_PREFER_LARGE_75) + target_refresh = 75; + + preferred_mode = list_first_entry(&connector->probed_modes, + struct drm_display_mode, head); + + list_for_each_entry_safe(cur_mode, t, &connector->probed_modes, head) { + cur_mode->type &= ~DRM_MODE_TYPE_PREFERRED; + + if (cur_mode == preferred_mode) + continue; + + /* Largest mode is preferred */ + if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode)) + preferred_mode = cur_mode; + + /* At a given size, try to get closest to target refresh */ + if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) && + MODE_REFRESH_DIFF(cur_mode, target_refresh) < + MODE_REFRESH_DIFF(preferred_mode, target_refresh)) { + preferred_mode = cur_mode; + } + } + + preferred_mode->type |= DRM_MODE_TYPE_PREFERRED; +} + +struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, + int hsize, int vsize, int fresh) +{ + struct drm_display_mode *mode = NULL; + int i; + + for (i = 0; i < drm_num_dmt_modes; i++) { + struct drm_display_mode *ptr = &drm_dmt_modes[i]; + if (hsize == ptr->hdisplay && + vsize == ptr->vdisplay && + fresh == drm_mode_vrefresh(ptr)) { + /* get the expected default mode */ + mode = drm_mode_duplicate(dev, ptr); + break; + } + } + return mode; +} + +typedef void detailed_cb(struct detailed_timing *timing, void *closure); + +static void +cea_for_each_detailed_block(u8 *ext, detailed_cb *cb, void *closure) +{ + int i, n = 0; + u8 rev = ext[0x01], d = ext[0x02]; + u8 *det_base = ext + d; + + switch (rev) { + case 0: + /* can't happen */ + return; + case 1: + /* have to infer how many blocks we have, check pixel clock */ + for (i = 0; i < 6; i++) + if (det_base[18*i] || det_base[18*i+1]) + n++; + break; + default: + /* explicit count */ + n = min(ext[0x03] & 0x0f, 6); + break; + } + + for (i = 0; i < n; i++) + cb((struct detailed_timing *)(det_base + 18 * i), closure); +} + +static void +vtb_for_each_detailed_block(u8 *ext, detailed_cb *cb, void *closure) +{ + unsigned int i, n = min((int)ext[0x02], 6); + u8 *det_base = ext + 5; + + if (ext[0x01] != 1) + return; /* unknown version */ + + for (i = 0; i < n; i++) + cb((struct detailed_timing *)(det_base + 18 * i), closure); +} + +static void +drm_for_each_detailed_block(u8 *raw_edid, detailed_cb *cb, void *closure) +{ + int i; + struct edid *edid = (struct edid *)raw_edid; + + if (edid == NULL) + return; + + for (i = 0; i < EDID_DETAILED_TIMINGS; i++) + cb(&(edid->detailed_timings[i]), closure); + + for (i = 1; i <= raw_edid[0x7e]; i++) { + u8 *ext = raw_edid + (i * EDID_LENGTH); + switch (*ext) { + case CEA_EXT: + cea_for_each_detailed_block(ext, cb, closure); + break; + case VTB_EXT: + vtb_for_each_detailed_block(ext, cb, closure); + break; + default: + break; + } + } +} + +static void +is_rb(struct detailed_timing *t, void *data) +{ + u8 *r = (u8 *)t; + if (r[3] == EDID_DETAIL_MONITOR_RANGE) + if (r[15] & 0x10) + *(bool *)data = true; +} + +/* EDID 1.4 defines this explicitly. For EDID 1.3, we guess, badly. */ +static bool +drm_monitor_supports_rb(struct edid *edid) +{ + if (edid->revision >= 4) { + bool ret; + drm_for_each_detailed_block((u8 *)edid, is_rb, &ret); + return ret; + } + + return ((edid->input & DRM_EDID_INPUT_DIGITAL) != 0); +} + +static void +find_gtf2(struct detailed_timing *t, void *data) +{ + u8 *r = (u8 *)t; + if (r[3] == EDID_DETAIL_MONITOR_RANGE && r[10] == 0x02) + *(u8 **)data = r; +} + +/* Secondary GTF curve kicks in above some break frequency */ +static int +drm_gtf2_hbreak(struct edid *edid) +{ + u8 *r = NULL; + drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); + return r ? (r[12] * 2) : 0; +} + +static int +drm_gtf2_2c(struct edid *edid) +{ + u8 *r = NULL; + drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); + return r ? r[13] : 0; +} + +static int +drm_gtf2_m(struct edid *edid) +{ + u8 *r = NULL; + drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); + return r ? (r[15] << 8) + r[14] : 0; +} + +static int +drm_gtf2_k(struct edid *edid) +{ + u8 *r = NULL; + drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); + return r ? r[16] : 0; +} + +static int +drm_gtf2_2j(struct edid *edid) +{ + u8 *r = NULL; + drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); + return r ? r[17] : 0; +} + +/** + * standard_timing_level - get std. timing level(CVT/GTF/DMT) + * @edid: EDID block to scan + */ +static int standard_timing_level(struct edid *edid) +{ + if (edid->revision >= 2) { + if (edid->revision >= 4 && (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)) + return LEVEL_CVT; + if (drm_gtf2_hbreak(edid)) + return LEVEL_GTF2; + return LEVEL_GTF; + } + return LEVEL_DMT; +} + +/* + * 0 is reserved. The spec says 0x01 fill for unused timings. Some old + * monitors fill with ascii space (0x20) instead. + */ +static int +bad_std_timing(u8 a, u8 b) +{ + return (a == 0x00 && b == 0x00) || + (a == 0x01 && b == 0x01) || + (a == 0x20 && b == 0x20); +} + +/** + * drm_mode_std - convert standard mode info (width, height, refresh) into mode + * @t: standard timing params + * @timing_level: standard timing level + * + * Take the standard timing params (in this case width, aspect, and refresh) + * and convert them into a real mode using CVT/GTF/DMT. + */ +static struct drm_display_mode * +drm_mode_std(struct drm_connector *connector, struct edid *edid, + struct std_timing *t, int revision) +{ + struct drm_device *dev = connector->dev; + struct drm_display_mode *m, *mode = NULL; + int hsize, vsize; + int vrefresh_rate; + unsigned aspect_ratio = (t->vfreq_aspect & EDID_TIMING_ASPECT_MASK) + >> EDID_TIMING_ASPECT_SHIFT; + unsigned vfreq = (t->vfreq_aspect & EDID_TIMING_VFREQ_MASK) + >> EDID_TIMING_VFREQ_SHIFT; + int timing_level = standard_timing_level(edid); + + if (bad_std_timing(t->hsize, t->vfreq_aspect)) + return NULL; + + /* According to the EDID spec, the hdisplay = hsize * 8 + 248 */ + hsize = t->hsize * 8 + 248; + /* vrefresh_rate = vfreq + 60 */ + vrefresh_rate = vfreq + 60; + /* the vdisplay is calculated based on the aspect ratio */ + if (aspect_ratio == 0) { + if (revision < 3) + vsize = hsize; + else + vsize = (hsize * 10) / 16; + } else if (aspect_ratio == 1) + vsize = (hsize * 3) / 4; + else if (aspect_ratio == 2) + vsize = (hsize * 4) / 5; + else + vsize = (hsize * 9) / 16; + + /* HDTV hack, part 1 */ + if (vrefresh_rate == 60 && + ((hsize == 1360 && vsize == 765) || + (hsize == 1368 && vsize == 769))) { + hsize = 1366; + vsize = 768; + } + + /* + * If this connector already has a mode for this size and refresh + * rate (because it came from detailed or CVT info), use that + * instead. This way we don't have to guess at interlace or + * reduced blanking. + */ + list_for_each_entry(m, &connector->probed_modes, head) + if (m->hdisplay == hsize && m->vdisplay == vsize && + drm_mode_vrefresh(m) == vrefresh_rate) + return NULL; + + /* HDTV hack, part 2 */ + if (hsize == 1366 && vsize == 768 && vrefresh_rate == 60) { + mode = drm_cvt_mode(dev, 1366, 768, vrefresh_rate, 0, 0, + false); + mode->hdisplay = 1366; + mode->hsync_start = mode->hsync_start - 1; + mode->hsync_end = mode->hsync_end - 1; + return mode; + } + + /* check whether it can be found in default mode table */ + mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate); + if (mode) + return mode; + + switch (timing_level) { + case LEVEL_DMT: + break; + case LEVEL_GTF: + mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0); + break; + case LEVEL_GTF2: + /* + * This is potentially wrong if there's ever a monitor with + * more than one ranges section, each claiming a different + * secondary GTF curve. Please don't do that. + */ + mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0); + if (drm_mode_hsync(mode) > drm_gtf2_hbreak(edid)) { + free(mode, DRM_MEM_KMS); + mode = drm_gtf_mode_complex(dev, hsize, vsize, + vrefresh_rate, 0, 0, + drm_gtf2_m(edid), + drm_gtf2_2c(edid), + drm_gtf2_k(edid), + drm_gtf2_2j(edid)); + } + break; + case LEVEL_CVT: + mode = drm_cvt_mode(dev, hsize, vsize, vrefresh_rate, 0, 0, + false); + break; + } + return mode; +} + +/* + * EDID is delightfully ambiguous about how interlaced modes are to be + * encoded. Our internal representation is of frame height, but some + * HDTV detailed timings are encoded as field height. + * + * The format list here is from CEA, in frame size. Technically we + * should be checking refresh rate too. Whatever. + */ +static void +drm_mode_do_interlace_quirk(struct drm_display_mode *mode, + struct detailed_pixel_timing *pt) +{ + int i; + static const struct { + int w, h; + } cea_interlaced[] = { + { 1920, 1080 }, + { 720, 480 }, + { 1440, 480 }, + { 2880, 480 }, + { 720, 576 }, + { 1440, 576 }, + { 2880, 576 }, + }; + + if (!(pt->misc & DRM_EDID_PT_INTERLACED)) + return; + + for (i = 0; i < DRM_ARRAY_SIZE(cea_interlaced); i++) { + if ((mode->hdisplay == cea_interlaced[i].w) && + (mode->vdisplay == cea_interlaced[i].h / 2)) { + mode->vdisplay *= 2; + mode->vsync_start *= 2; + mode->vsync_end *= 2; + mode->vtotal *= 2; + mode->vtotal |= 1; + } + } + + mode->flags |= DRM_MODE_FLAG_INTERLACE; +} + +/** + * drm_mode_detailed - create a new mode from an EDID detailed timing section + * @dev: DRM device (needed to create new mode) + * @edid: EDID block + * @timing: EDID detailed timing info + * @quirks: quirks to apply + * + * An EDID detailed timing block contains enough info for us to create and + * return a new struct drm_display_mode. + */ +static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, + struct edid *edid, + struct detailed_timing *timing, + u32 quirks) +{ + struct drm_display_mode *mode; + struct detailed_pixel_timing *pt = &timing->data.pixel_data; + unsigned hactive = (pt->hactive_hblank_hi & 0xf0) << 4 | pt->hactive_lo; + unsigned vactive = (pt->vactive_vblank_hi & 0xf0) << 4 | pt->vactive_lo; + unsigned hblank = (pt->hactive_hblank_hi & 0xf) << 8 | pt->hblank_lo; + unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | pt->vblank_lo; + unsigned hsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2 | pt->hsync_offset_lo; + unsigned hsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x30) << 4 | pt->hsync_pulse_width_lo; + unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) >> 2 | pt->vsync_offset_pulse_width_lo >> 4; + unsigned vsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 4 | (pt->vsync_offset_pulse_width_lo & 0xf); + + /* ignore tiny modes */ + if (hactive < 64 || vactive < 64) + return NULL; + + if (pt->misc & DRM_EDID_PT_STEREO) { + printf("stereo mode not supported\n"); + return NULL; + } + if (!(pt->misc & DRM_EDID_PT_SEPARATE_SYNC)) { + printf("composite sync not supported\n"); + } + + /* it is incorrect if hsync/vsync width is zero */ + if (!hsync_pulse_width || !vsync_pulse_width) { + DRM_DEBUG_KMS("Incorrect Detailed timing. " + "Wrong Hsync/Vsync pulse width\n"); + return NULL; + } + mode = drm_mode_create(dev); + if (!mode) + return NULL; + + mode->type = DRM_MODE_TYPE_DRIVER; + + if (quirks & EDID_QUIRK_135_CLOCK_TOO_HIGH) + timing->pixel_clock = htole16(1088); + + mode->clock = le16toh(timing->pixel_clock) * 10; + + mode->hdisplay = hactive; + mode->hsync_start = mode->hdisplay + hsync_offset; + mode->hsync_end = mode->hsync_start + hsync_pulse_width; + mode->htotal = mode->hdisplay + hblank; + + mode->vdisplay = vactive; + mode->vsync_start = mode->vdisplay + vsync_offset; + mode->vsync_end = mode->vsync_start + vsync_pulse_width; + mode->vtotal = mode->vdisplay + vblank; + + /* Some EDIDs have bogus h/vtotal values */ + if (mode->hsync_end > mode->htotal) + mode->htotal = mode->hsync_end + 1; + if (mode->vsync_end > mode->vtotal) + mode->vtotal = mode->vsync_end + 1; + + drm_mode_do_interlace_quirk(mode, pt); + + drm_mode_set_name(mode); + + if (quirks & EDID_QUIRK_DETAILED_SYNC_PP) { + pt->misc |= DRM_EDID_PT_HSYNC_POSITIVE | DRM_EDID_PT_VSYNC_POSITIVE; + } + + mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ? + DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC; + mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ? + DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC; + + mode->width_mm = pt->width_mm_lo | (pt->width_height_mm_hi & 0xf0) << 4; + mode->height_mm = pt->height_mm_lo | (pt->width_height_mm_hi & 0xf) << 8; + + if (quirks & EDID_QUIRK_DETAILED_IN_CM) { + mode->width_mm *= 10; + mode->height_mm *= 10; + } + + if (quirks & EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE) { + mode->width_mm = edid->width_cm * 10; + mode->height_mm = edid->height_cm * 10; + } + + return mode; +} + +static bool +mode_is_rb(const struct drm_display_mode *mode) +{ + return (mode->htotal - mode->hdisplay == 160) && + (mode->hsync_end - mode->hdisplay == 80) && + (mode->hsync_end - mode->hsync_start == 32) && + (mode->vsync_start - mode->vdisplay == 3); +} + +static bool +mode_in_hsync_range(struct drm_display_mode *mode, + struct edid *edid, u8 *t) +{ + int hsync, hmin, hmax; + + hmin = t[7]; + if (edid->revision >= 4) + hmin += ((t[4] & 0x04) ? 255 : 0); + hmax = t[8]; + if (edid->revision >= 4) + hmax += ((t[4] & 0x08) ? 255 : 0); + hsync = drm_mode_hsync(mode); + + return (hsync <= hmax && hsync >= hmin); +} + +static bool +mode_in_vsync_range(struct drm_display_mode *mode, + struct edid *edid, u8 *t) +{ + int vsync, vmin, vmax; + + vmin = t[5]; + if (edid->revision >= 4) + vmin += ((t[4] & 0x01) ? 255 : 0); + vmax = t[6]; + if (edid->revision >= 4) + vmax += ((t[4] & 0x02) ? 255 : 0); + vsync = drm_mode_vrefresh(mode); + + return (vsync <= vmax && vsync >= vmin); +} + +static u32 +range_pixel_clock(struct edid *edid, u8 *t) +{ + /* unspecified */ + if (t[9] == 0 || t[9] == 255) + return 0; + + /* 1.4 with CVT support gives us real precision, yay */ + if (edid->revision >= 4 && t[10] == 0x04) + return (t[9] * 10000) - ((t[12] >> 2) * 250); + + /* 1.3 is pathetic, so fuzz up a bit */ + return t[9] * 10000 + 5001; +} + +static bool +mode_in_range(struct drm_display_mode *mode, struct edid *edid, + struct detailed_timing *timing) +{ + u32 max_clock; + u8 *t = (u8 *)timing; + + if (!mode_in_hsync_range(mode, edid, t)) + return false; + + if (!mode_in_vsync_range(mode, edid, t)) + return false; + + if ((max_clock = range_pixel_clock(edid, t))) + if (mode->clock > max_clock) + return false; + + /* 1.4 max horizontal check */ + if (edid->revision >= 4 && t[10] == 0x04) + if (t[13] && mode->hdisplay > 8 * (t[13] + (256 * (t[12]&0x3)))) + return false; + + if (mode_is_rb(mode) && !drm_monitor_supports_rb(edid)) + return false; + + return true; +} + +/* + * XXX If drm_dmt_modes ever regrows the CVT-R modes (and it will) this will + * need to account for them. + */ +static int +drm_gtf_modes_for_range(struct drm_connector *connector, struct edid *edid, + struct detailed_timing *timing) +{ + int i, modes = 0; + struct drm_display_mode *newmode; + struct drm_device *dev = connector->dev; + + for (i = 0; i < drm_num_dmt_modes; i++) { + if (mode_in_range(drm_dmt_modes + i, edid, timing)) { + newmode = drm_mode_duplicate(dev, &drm_dmt_modes[i]); + if (newmode) { + drm_mode_probed_add(connector, newmode); + modes++; + } + } + } + + return modes; +} + +static void +do_inferred_modes(struct detailed_timing *timing, void *c) +{ + struct detailed_mode_closure *closure = c; + struct detailed_non_pixel *data = &timing->data.other_data; + int gtf = (closure->edid->features & DRM_EDID_FEATURE_DEFAULT_GTF); + + if (gtf && data->type == EDID_DETAIL_MONITOR_RANGE) + closure->modes += drm_gtf_modes_for_range(closure->connector, + closure->edid, + timing); +} + +static int +add_inferred_modes(struct drm_connector *connector, struct edid *edid) +{ + struct detailed_mode_closure closure = { + connector, edid, 0, 0, 0 + }; + + if (version_greater(edid, 1, 0)) + drm_for_each_detailed_block((u8 *)edid, do_inferred_modes, + &closure); + + return closure.modes; +} + +static int +drm_est3_modes(struct drm_connector *connector, struct detailed_timing *timing) +{ + int i, j, m, modes = 0; + struct drm_display_mode *mode; + u8 *est = ((u8 *)timing) + 5; + + for (i = 0; i < 6; i++) { + for (j = 7; j > 0; j--) { + m = (i * 8) + (7 - j); + if (m >= DRM_ARRAY_SIZE(est3_modes)) + break; + if (est[i] & (1 << j)) { + mode = drm_mode_find_dmt(connector->dev, + est3_modes[m].w, + est3_modes[m].h, + est3_modes[m].r + /*, est3_modes[m].rb */); + if (mode) { + drm_mode_probed_add(connector, mode); + modes++; + } + } + } + } + + return modes; +} + +static void +do_established_modes(struct detailed_timing *timing, void *c) +{ + struct detailed_mode_closure *closure = c; + struct detailed_non_pixel *data = &timing->data.other_data; + + if (data->type == EDID_DETAIL_EST_TIMINGS) + closure->modes += drm_est3_modes(closure->connector, timing); +} + +/** + * add_established_modes - get est. modes from EDID and add them + * @edid: EDID block to scan + * + * Each EDID block contains a bitmap of the supported "established modes" list + * (defined above). Tease them out and add them to the global modes list. + */ +static int +add_established_modes(struct drm_connector *connector, struct edid *edid) +{ + struct drm_device *dev = connector->dev; + unsigned long est_bits = edid->established_timings.t1 | + (edid->established_timings.t2 << 8) | + ((edid->established_timings.mfg_rsvd & 0x80) << 9); + int i, modes = 0; + struct detailed_mode_closure closure = { + connector, edid, 0, 0, 0 + }; + + for (i = 0; i <= EDID_EST_TIMINGS; i++) { + if (est_bits & (1<data.other_data; + struct drm_connector *connector = closure->connector; + struct edid *edid = closure->edid; + + if (data->type == EDID_DETAIL_STD_MODES) { + int i; + for (i = 0; i < 6; i++) { + struct std_timing *std; + struct drm_display_mode *newmode; + + std = &data->data.timings[i]; + newmode = drm_mode_std(connector, edid, std, + edid->revision); + if (newmode) { + drm_mode_probed_add(connector, newmode); + closure->modes++; + } + } + } +} + +/** + * add_standard_modes - get std. modes from EDID and add them + * @edid: EDID block to scan + * + * Standard modes can be calculated using the appropriate standard (DMT, + * GTF or CVT. Grab them from @edid and add them to the list. + */ +static int +add_standard_modes(struct drm_connector *connector, struct edid *edid) +{ + int i, modes = 0; + struct detailed_mode_closure closure = { + connector, edid, 0, 0, 0 + }; + + for (i = 0; i < EDID_STD_TIMINGS; i++) { + struct drm_display_mode *newmode; + + newmode = drm_mode_std(connector, edid, + &edid->standard_timings[i], + edid->revision); + if (newmode) { + drm_mode_probed_add(connector, newmode); + modes++; + } + } + + if (version_greater(edid, 1, 0)) + drm_for_each_detailed_block((u8 *)edid, do_standard_modes, + &closure); + + /* XXX should also look for standard codes in VTB blocks */ + + return modes + closure.modes; +} + +static int drm_cvt_modes(struct drm_connector *connector, + struct detailed_timing *timing) +{ + int i, j, modes = 0; + struct drm_display_mode *newmode; + struct drm_device *dev = connector->dev; + struct cvt_timing *cvt; + const int rates[] = { 60, 85, 75, 60, 50 }; + const u8 empty[3] = { 0, 0, 0 }; + + for (i = 0; i < 4; i++) { + int width = 0, height; + cvt = &(timing->data.other_data.data.cvt[i]); + + if (!memcmp(cvt->code, empty, 3)) + continue; + + height = (cvt->code[0] + ((cvt->code[1] & 0xf0) << 4) + 1) * 2; + switch (cvt->code[1] & 0x0c) { + case 0x00: + width = height * 4 / 3; + break; + case 0x04: + width = height * 16 / 9; + break; + case 0x08: + width = height * 16 / 10; + break; + case 0x0c: + width = height * 15 / 9; + break; + } + + for (j = 1; j < 5; j++) { + if (cvt->code[2] & (1 << j)) { + newmode = drm_cvt_mode(dev, width, height, + rates[j], j == 0, + false, false); + if (newmode) { + drm_mode_probed_add(connector, newmode); + modes++; + } + } + } + } + + return modes; +} + +static void +do_cvt_mode(struct detailed_timing *timing, void *c) +{ + struct detailed_mode_closure *closure = c; + struct detailed_non_pixel *data = &timing->data.other_data; + + if (data->type == EDID_DETAIL_CVT_3BYTE) + closure->modes += drm_cvt_modes(closure->connector, timing); +} + +static int +add_cvt_modes(struct drm_connector *connector, struct edid *edid) +{ + struct detailed_mode_closure closure = { + connector, edid, 0, 0, 0 + }; + + if (version_greater(edid, 1, 2)) + drm_for_each_detailed_block((u8 *)edid, do_cvt_mode, &closure); + + /* XXX should also look for CVT codes in VTB blocks */ + + return closure.modes; +} + +static void +do_detailed_mode(struct detailed_timing *timing, void *c) +{ + struct detailed_mode_closure *closure = c; + struct drm_display_mode *newmode; + + if (timing->pixel_clock) { + newmode = drm_mode_detailed(closure->connector->dev, + closure->edid, timing, + closure->quirks); + if (!newmode) + return; + + if (closure->preferred) + newmode->type |= DRM_MODE_TYPE_PREFERRED; + + drm_mode_probed_add(closure->connector, newmode); + closure->modes++; + closure->preferred = 0; + } +} + +/* + * add_detailed_modes - Add modes from detailed timings + * @connector: attached connector + * @edid: EDID block to scan + * @quirks: quirks to apply + */ +static int +add_detailed_modes(struct drm_connector *connector, struct edid *edid, + u32 quirks) +{ + struct detailed_mode_closure closure = { + connector, + edid, + 1, + quirks, + 0 + }; + + if (closure.preferred && !version_greater(edid, 1, 3)) + closure.preferred = + (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING); + + drm_for_each_detailed_block((u8 *)edid, do_detailed_mode, &closure); + + return closure.modes; +} + +#define HDMI_IDENTIFIER 0x000C03 +#define AUDIO_BLOCK 0x01 +#define VENDOR_BLOCK 0x03 +#define SPEAKER_BLOCK 0x04 +#define EDID_BASIC_AUDIO (1 << 6) + +/** + * Search EDID for CEA extension block. + */ +u8 *drm_find_cea_extension(struct edid *edid) +{ + u8 *edid_ext = NULL; + int i; + + /* No EDID or EDID extensions */ + if (edid == NULL || edid->extensions == 0) + return NULL; + + /* Find CEA extension */ + for (i = 0; i < edid->extensions; i++) { + edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1); + if (edid_ext[0] == CEA_EXT) + break; + } + + if (i == edid->extensions) + return NULL; + + return edid_ext; +} + +static void +parse_hdmi_vsdb(struct drm_connector *connector, uint8_t *db) +{ + connector->eld[5] |= (db[6] >> 7) << 1; /* Supports_AI */ + + connector->dvi_dual = db[6] & 1; + connector->max_tmds_clock = db[7] * 5; + + connector->latency_present[0] = db[8] >> 7; + connector->latency_present[1] = (db[8] >> 6) & 1; + connector->video_latency[0] = db[9]; + connector->audio_latency[0] = db[10]; + connector->video_latency[1] = db[11]; + connector->audio_latency[1] = db[12]; + + DRM_DEBUG_KMS("HDMI: DVI dual %d, " + "max TMDS clock %d, " + "latency present %d %d, " + "video latency %d %d, " + "audio latency %d %d\n", + connector->dvi_dual, + connector->max_tmds_clock, + (int) connector->latency_present[0], + (int) connector->latency_present[1], + connector->video_latency[0], + connector->video_latency[1], + connector->audio_latency[0], + connector->audio_latency[1]); +} + +static void +monitor_name(struct detailed_timing *t, void *data) +{ + if (t->data.other_data.type == EDID_DETAIL_MONITOR_NAME) + *(u8 **)data = t->data.other_data.data.str.str; +} + +/** + * drm_edid_to_eld - build ELD from EDID + * @connector: connector corresponding to the HDMI/DP sink + * @edid: EDID to parse + * + * Fill the ELD (EDID-Like Data) buffer for passing to the audio driver. + * Some ELD fields are left to the graphics driver caller: + * - Conn_Type + * - HDCP + * - Port_ID + */ +void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid) +{ + uint8_t *eld = connector->eld; + u8 *cea; + u8 *name; + u8 *db; + int sad_count = 0; + int mnl; + int dbl; + + memset(eld, 0, sizeof(connector->eld)); + + cea = drm_find_cea_extension(edid); + if (!cea) { + DRM_DEBUG_KMS("ELD: no CEA Extension found\n"); + return; + } + + name = NULL; + drm_for_each_detailed_block((u8 *)edid, monitor_name, &name); + for (mnl = 0; name && mnl < 13; mnl++) { + if (name[mnl] == 0x0a) + break; + eld[20 + mnl] = name[mnl]; + } + eld[4] = (cea[1] << 5) | mnl; + DRM_DEBUG_KMS("ELD monitor %s\n", eld + 20); + + eld[0] = 2 << 3; /* ELD version: 2 */ + + eld[16] = edid->mfg_id[0]; + eld[17] = edid->mfg_id[1]; + eld[18] = edid->prod_code[0]; + eld[19] = edid->prod_code[1]; + + for (db = cea + 4; db < cea + cea[2]; db += dbl + 1) { + dbl = db[0] & 0x1f; + + switch ((db[0] & 0xe0) >> 5) { + case AUDIO_BLOCK: /* Audio Data Block, contains SADs */ + sad_count = dbl / 3; + memcpy(eld + 20 + mnl, &db[1], dbl); + break; + case SPEAKER_BLOCK: /* Speaker Allocation Data Block */ + eld[7] = db[1]; + break; + case VENDOR_BLOCK: + /* HDMI Vendor-Specific Data Block */ + if (db[1] == 0x03 && db[2] == 0x0c && db[3] == 0) + parse_hdmi_vsdb(connector, db); + break; + default: + break; + } + } + eld[5] |= sad_count << 4; + eld[2] = (20 + mnl + sad_count * 3 + 3) / 4; + + DRM_DEBUG_KMS("ELD size %d, SAD count %d\n", (int)eld[2], sad_count); +} + +/** + * drm_av_sync_delay - HDMI/DP sink audio-video sync delay in millisecond + * @connector: connector associated with the HDMI/DP sink + * @mode: the display mode + */ +int drm_av_sync_delay(struct drm_connector *connector, + struct drm_display_mode *mode) +{ + int i = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); + int a, v; + + if (!connector->latency_present[0]) + return 0; + if (!connector->latency_present[1]) + i = 0; + + a = connector->audio_latency[i]; + v = connector->video_latency[i]; + + /* + * HDMI/DP sink doesn't support audio or video? + */ + if (a == 255 || v == 255) + return 0; + + /* + * Convert raw EDID values to millisecond. + * Treat unknown latency as 0ms. + */ + if (a) + a = min(2 * (a - 1), 500); + if (v) + v = min(2 * (v - 1), 500); + + return max(v - a, 0); +} + +/** + * drm_select_eld - select one ELD from multiple HDMI/DP sinks + * @encoder: the encoder just changed display mode + * @mode: the adjusted display mode + * + * It's possible for one encoder to be associated with multiple HDMI/DP sinks. + * The policy is now hard coded to simply use the first HDMI/DP sink's ELD. + */ +struct drm_connector *drm_select_eld(struct drm_encoder *encoder, + struct drm_display_mode *mode) +{ + struct drm_connector *connector; + struct drm_device *dev = encoder->dev; + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) + if (connector->encoder == encoder && connector->eld[0]) + return connector; + + return NULL; +} + +/** + * drm_detect_hdmi_monitor - detect whether monitor is hdmi. + * @edid: monitor EDID information + * + * Parse the CEA extension according to CEA-861-B. + * Return true if HDMI, false if not or unknown. + */ +bool drm_detect_hdmi_monitor(struct edid *edid) +{ + u8 *edid_ext; + int i, hdmi_id; + int start_offset, end_offset; + bool is_hdmi = false; + + edid_ext = drm_find_cea_extension(edid); + if (!edid_ext) + goto end; + + /* Data block offset in CEA extension block */ + start_offset = 4; + end_offset = edid_ext[2]; + + /* + * Because HDMI identifier is in Vendor Specific Block, + * search it from all data blocks of CEA extension. + */ + for (i = start_offset; i < end_offset; + /* Increased by data block len */ + i += ((edid_ext[i] & 0x1f) + 1)) { + /* Find vendor specific block */ + if ((edid_ext[i] >> 5) == VENDOR_BLOCK) { + hdmi_id = edid_ext[i + 1] | (edid_ext[i + 2] << 8) | + edid_ext[i + 3] << 16; + /* Find HDMI identifier */ + if (hdmi_id == HDMI_IDENTIFIER) + is_hdmi = true; + break; + } + } + +end: + return is_hdmi; +} + +/** + * drm_detect_monitor_audio - check monitor audio capability + * + * Monitor should have CEA extension block. + * If monitor has 'basic audio', but no CEA audio blocks, it's 'basic + * audio' only. If there is any audio extension block and supported + * audio format, assume at least 'basic audio' support, even if 'basic + * audio' is not defined in EDID. + * + */ +bool drm_detect_monitor_audio(struct edid *edid) +{ + u8 *edid_ext; + int i, j; + bool has_audio = false; + int start_offset, end_offset; + + edid_ext = drm_find_cea_extension(edid); + if (!edid_ext) + goto end; + + has_audio = ((edid_ext[3] & EDID_BASIC_AUDIO) != 0); + + if (has_audio) { + DRM_DEBUG_KMS("Monitor has basic audio support\n"); + goto end; + } + + /* Data block offset in CEA extension block */ + start_offset = 4; + end_offset = edid_ext[2]; + + for (i = start_offset; i < end_offset; + i += ((edid_ext[i] & 0x1f) + 1)) { + if ((edid_ext[i] >> 5) == AUDIO_BLOCK) { + has_audio = true; + for (j = 1; j < (edid_ext[i] & 0x1f); j += 3) + DRM_DEBUG_KMS("CEA audio format %d\n", + (edid_ext[i + j] >> 3) & 0xf); + goto end; + } + } +end: + return has_audio; +} + +/** + * drm_add_display_info - pull display info out if present + * @edid: EDID data + * @info: display info (attached to connector) + * + * Grab any available display info and stuff it into the drm_display_info + * structure that's part of the connector. Useful for tracking bpp and + * color spaces. + */ +static void drm_add_display_info(struct edid *edid, + struct drm_display_info *info) +{ + u8 *edid_ext; + + info->width_mm = edid->width_cm * 10; + info->height_mm = edid->height_cm * 10; + + /* driver figures it out in this case */ + info->bpc = 0; + info->color_formats = 0; + + /* Only defined for 1.4 with digital displays */ + if (edid->revision < 4) + return; + + if (!(edid->input & DRM_EDID_INPUT_DIGITAL)) + return; + + switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) { + case DRM_EDID_DIGITAL_DEPTH_6: + info->bpc = 6; + break; + case DRM_EDID_DIGITAL_DEPTH_8: + info->bpc = 8; + break; + case DRM_EDID_DIGITAL_DEPTH_10: + info->bpc = 10; + break; + case DRM_EDID_DIGITAL_DEPTH_12: + info->bpc = 12; + break; + case DRM_EDID_DIGITAL_DEPTH_14: + info->bpc = 14; + break; + case DRM_EDID_DIGITAL_DEPTH_16: + info->bpc = 16; + break; + case DRM_EDID_DIGITAL_DEPTH_UNDEF: + default: + info->bpc = 0; + break; + } + + info->color_formats = DRM_COLOR_FORMAT_RGB444; + if (info->color_formats & DRM_EDID_FEATURE_RGB_YCRCB444) + info->color_formats = DRM_COLOR_FORMAT_YCRCB444; + if (info->color_formats & DRM_EDID_FEATURE_RGB_YCRCB422) + info->color_formats = DRM_COLOR_FORMAT_YCRCB422; + + /* Get data from CEA blocks if present */ + edid_ext = drm_find_cea_extension(edid); + if (!edid_ext) + return; + + info->cea_rev = edid_ext[1]; +} + +/** + * drm_add_edid_modes - add modes from EDID data, if available + * @connector: connector we're probing + * @edid: edid data + * + * Add the specified modes to the connector's mode list. + * + * Return number of modes added or 0 if we couldn't find any. + */ +int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) +{ + int num_modes = 0; + u32 quirks; + + if (edid == NULL) { + return 0; + } + if (!drm_edid_is_valid(edid)) { + device_printf(connector->dev->device, "%s: EDID invalid.\n", + drm_get_connector_name(connector)); + return 0; + } + + quirks = edid_get_quirks(edid); + + /* + * EDID spec says modes should be preferred in this order: + * - preferred detailed mode + * - other detailed modes from base block + * - detailed modes from extension blocks + * - CVT 3-byte code modes + * - standard timing codes + * - established timing codes + * - modes inferred from GTF or CVT range information + * + * We get this pretty much right. + * + * XXX order for additional mode types in extension blocks? + */ + num_modes += add_detailed_modes(connector, edid, quirks); + num_modes += add_cvt_modes(connector, edid); + num_modes += add_standard_modes(connector, edid); + num_modes += add_established_modes(connector, edid); + num_modes += add_inferred_modes(connector, edid); + + if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) + edid_fixup_preferred(connector, quirks); + + drm_add_display_info(edid, &connector->display_info); + + return num_modes; +} + +/** + * drm_add_modes_noedid - add modes for the connectors without EDID + * @connector: connector we're probing + * @hdisplay: the horizontal display limit + * @vdisplay: the vertical display limit + * + * Add the specified modes to the connector's mode list. Only when the + * hdisplay/vdisplay is not beyond the given limit, it will be added. + * + * Return number of modes added or 0 if we couldn't find any. + */ +int drm_add_modes_noedid(struct drm_connector *connector, + int hdisplay, int vdisplay) +{ + int i, count, num_modes = 0; + struct drm_display_mode *mode; + struct drm_device *dev = connector->dev; + + count = sizeof(drm_dmt_modes) / sizeof(struct drm_display_mode); + if (hdisplay < 0) + hdisplay = 0; + if (vdisplay < 0) + vdisplay = 0; + + for (i = 0; i < count; i++) { + struct drm_display_mode *ptr = &drm_dmt_modes[i]; + if (hdisplay && vdisplay) { + /* + * Only when two are valid, they will be used to check + * whether the mode should be added to the mode list of + * the connector. + */ + if (ptr->hdisplay > hdisplay || + ptr->vdisplay > vdisplay) + continue; + } + if (drm_mode_vrefresh(ptr) > 61) + continue; + mode = drm_mode_duplicate(dev, ptr); + if (mode) { + drm_mode_probed_add(connector, mode); + num_modes++; + } + } + return num_modes; +} diff --git a/sys/dev/drm2/drm_edid.h b/sys/dev/drm2/drm_edid.h new file mode 100644 index 00000000000..e0c14705438 --- /dev/null +++ b/sys/dev/drm2/drm_edid.h @@ -0,0 +1,244 @@ +/* + * Copyright © 2007-2008 Intel Corporation + * Jesse Barnes + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * $FreeBSD$ + */ +#ifndef __DRM_EDID_H__ +#define __DRM_EDID_H__ + +#include +#include + +#define EDID_LENGTH 128 +#define DDC_ADDR 0x50 + +#define CEA_EXT 0x02 +#define VTB_EXT 0x10 +#define DI_EXT 0x40 +#define LS_EXT 0x50 +#define MI_EXT 0x60 + +struct est_timings { + u8 t1; + u8 t2; + u8 mfg_rsvd; +} __attribute__((packed)); + +/* 00=16:10, 01=4:3, 10=5:4, 11=16:9 */ +#define EDID_TIMING_ASPECT_SHIFT 6 +#define EDID_TIMING_ASPECT_MASK (0x3 << EDID_TIMING_ASPECT_SHIFT) + +/* need to add 60 */ +#define EDID_TIMING_VFREQ_SHIFT 0 +#define EDID_TIMING_VFREQ_MASK (0x3f << EDID_TIMING_VFREQ_SHIFT) + +struct std_timing { + u8 hsize; /* need to multiply by 8 then add 248 */ + u8 vfreq_aspect; +} __attribute__((packed)); + +#define DRM_EDID_PT_HSYNC_POSITIVE (1 << 1) +#define DRM_EDID_PT_VSYNC_POSITIVE (1 << 2) +#define DRM_EDID_PT_SEPARATE_SYNC (3 << 3) +#define DRM_EDID_PT_STEREO (1 << 5) +#define DRM_EDID_PT_INTERLACED (1 << 7) + +/* If detailed data is pixel timing */ +struct detailed_pixel_timing { + u8 hactive_lo; + u8 hblank_lo; + u8 hactive_hblank_hi; + u8 vactive_lo; + u8 vblank_lo; + u8 vactive_vblank_hi; + u8 hsync_offset_lo; + u8 hsync_pulse_width_lo; + u8 vsync_offset_pulse_width_lo; + u8 hsync_vsync_offset_pulse_width_hi; + u8 width_mm_lo; + u8 height_mm_lo; + u8 width_height_mm_hi; + u8 hborder; + u8 vborder; + u8 misc; +} __attribute__((packed)); + +/* If it's not pixel timing, it'll be one of the below */ +struct detailed_data_string { + u8 str[13]; +} __attribute__((packed)); + +struct detailed_data_monitor_range { + u8 min_vfreq; + u8 max_vfreq; + u8 min_hfreq_khz; + u8 max_hfreq_khz; + u8 pixel_clock_mhz; /* need to multiply by 10 */ + u16 sec_gtf_toggle; /* A000=use above, 20=use below */ + u8 hfreq_start_khz; /* need to multiply by 2 */ + u8 c; /* need to divide by 2 */ + u16 m; + u8 k; + u8 j; /* need to divide by 2 */ +} __attribute__((packed)); + +struct detailed_data_wpindex { + u8 white_yx_lo; /* Lower 2 bits each */ + u8 white_x_hi; + u8 white_y_hi; + u8 gamma; /* need to divide by 100 then add 1 */ +} __attribute__((packed)); + +struct detailed_data_color_point { + u8 windex1; + u8 wpindex1[3]; + u8 windex2; + u8 wpindex2[3]; +} __attribute__((packed)); + +struct cvt_timing { + u8 code[3]; +} __attribute__((packed)); + +struct detailed_non_pixel { + u8 pad1; + u8 type; /* ff=serial, fe=string, fd=monitor range, fc=monitor name + fb=color point data, fa=standard timing data, + f9=undefined, f8=mfg. reserved */ + u8 pad2; + union { + struct detailed_data_string str; + struct detailed_data_monitor_range range; + struct detailed_data_wpindex color; + struct std_timing timings[6]; + struct cvt_timing cvt[4]; + } data; +} __attribute__((packed)); + +#define EDID_DETAIL_EST_TIMINGS 0xf7 +#define EDID_DETAIL_CVT_3BYTE 0xf8 +#define EDID_DETAIL_COLOR_MGMT_DATA 0xf9 +#define EDID_DETAIL_STD_MODES 0xfa +#define EDID_DETAIL_MONITOR_CPDATA 0xfb +#define EDID_DETAIL_MONITOR_NAME 0xfc +#define EDID_DETAIL_MONITOR_RANGE 0xfd +#define EDID_DETAIL_MONITOR_STRING 0xfe +#define EDID_DETAIL_MONITOR_SERIAL 0xff + +struct detailed_timing { + u16 pixel_clock; /* need to multiply by 10 KHz */ + union { + struct detailed_pixel_timing pixel_data; + struct detailed_non_pixel other_data; + } data; +} __attribute__((packed)); + +#define DRM_EDID_INPUT_SERRATION_VSYNC (1 << 0) +#define DRM_EDID_INPUT_SYNC_ON_GREEN (1 << 1) +#define DRM_EDID_INPUT_COMPOSITE_SYNC (1 << 2) +#define DRM_EDID_INPUT_SEPARATE_SYNCS (1 << 3) +#define DRM_EDID_INPUT_BLANK_TO_BLACK (1 << 4) +#define DRM_EDID_INPUT_VIDEO_LEVEL (3 << 5) +#define DRM_EDID_INPUT_DIGITAL (1 << 7) +#define DRM_EDID_DIGITAL_DEPTH_MASK (7 << 4) +#define DRM_EDID_DIGITAL_DEPTH_UNDEF (0 << 4) +#define DRM_EDID_DIGITAL_DEPTH_6 (1 << 4) +#define DRM_EDID_DIGITAL_DEPTH_8 (2 << 4) +#define DRM_EDID_DIGITAL_DEPTH_10 (3 << 4) +#define DRM_EDID_DIGITAL_DEPTH_12 (4 << 4) +#define DRM_EDID_DIGITAL_DEPTH_14 (5 << 4) +#define DRM_EDID_DIGITAL_DEPTH_16 (6 << 4) +#define DRM_EDID_DIGITAL_DEPTH_RSVD (7 << 4) +#define DRM_EDID_DIGITAL_TYPE_UNDEF (0) +#define DRM_EDID_DIGITAL_TYPE_DVI (1) +#define DRM_EDID_DIGITAL_TYPE_HDMI_A (2) +#define DRM_EDID_DIGITAL_TYPE_HDMI_B (3) +#define DRM_EDID_DIGITAL_TYPE_MDDI (4) +#define DRM_EDID_DIGITAL_TYPE_DP (5) + +#define DRM_EDID_FEATURE_DEFAULT_GTF (1 << 0) +#define DRM_EDID_FEATURE_PREFERRED_TIMING (1 << 1) +#define DRM_EDID_FEATURE_STANDARD_COLOR (1 << 2) +#define DRM_EDID_FEATURE_DISPLAY_TYPE (3 << 3) /* 00=mono, 01=rgb, 10=non-rgb, 11=unknown */ +/* If digital */ +#define DRM_EDID_FEATURE_COLOR_MASK (3 << 3) +#define DRM_EDID_FEATURE_RGB (0 << 3) +#define DRM_EDID_FEATURE_RGB_YCRCB444 (1 << 3) +#define DRM_EDID_FEATURE_RGB_YCRCB422 (2 << 3) +#define DRM_EDID_FEATURE_RGB_YCRCB (3 << 3) /* both 4:4:4 and 4:2:2 */ + +#define DRM_EDID_FEATURE_PM_ACTIVE_OFF (1 << 5) +#define DRM_EDID_FEATURE_PM_SUSPEND (1 << 6) +#define DRM_EDID_FEATURE_PM_STANDBY (1 << 7) + +struct edid { + u8 header[8]; + /* Vendor & product info */ + u8 mfg_id[2]; + u8 prod_code[2]; + u32 serial; /* FIXME: byte order */ + u8 mfg_week; + u8 mfg_year; + /* EDID version */ + u8 version; + u8 revision; + /* Display info: */ + u8 input; + u8 width_cm; + u8 height_cm; + u8 gamma; + u8 features; + /* Color characteristics */ + u8 red_green_lo; + u8 black_white_lo; + u8 red_x; + u8 red_y; + u8 green_x; + u8 green_y; + u8 blue_x; + u8 blue_y; + u8 white_x; + u8 white_y; + /* Est. timings and mfg rsvd timings*/ + struct est_timings established_timings; + /* Standard timings 1-8*/ + struct std_timing standard_timings[8]; + /* Detailing timings 1-4 */ + struct detailed_timing detailed_timings[4]; + /* Number of 128 byte ext. blocks */ + u8 extensions; + /* Checksum */ + u8 checksum; +} __attribute__((packed)); + +#define EDID_PRODUCT_ID(e) ((e)->prod_code[0] | ((e)->prod_code[1] << 8)) + +struct drm_encoder; +struct drm_connector; +struct drm_display_mode; +void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid); +int drm_av_sync_delay(struct drm_connector *connector, + struct drm_display_mode *mode); +struct drm_connector *drm_select_eld(struct drm_encoder *encoder, + struct drm_display_mode *mode); + +#endif /* __DRM_EDID_H__ */ diff --git a/sys/dev/drm2/drm_edid_modes.h b/sys/dev/drm2/drm_edid_modes.h new file mode 100644 index 00000000000..beded269bf4 --- /dev/null +++ b/sys/dev/drm2/drm_edid_modes.h @@ -0,0 +1,381 @@ +/* + * Copyright (c) 2007-2008 Intel Corporation + * Jesse Barnes + * Copyright 2010 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * $FreeBSD$ + */ + +#include +#include + +/* + * Autogenerated from the DMT spec. + * This table is copied from xfree86/modes/xf86EdidModes.c. + * But the mode with Reduced blank feature is deleted. + */ +static struct drm_display_mode drm_dmt_modes[] = { + /* 640x350@85Hz */ + { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 31500, 640, 672, + 736, 832, 0, 350, 382, 385, 445, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, + /* 640x400@85Hz */ + { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 31500, 640, 672, + 736, 832, 0, 400, 401, 404, 445, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 720x400@85Hz */ + { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 756, + 828, 936, 0, 400, 401, 404, 446, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 640x480@60Hz */ + { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656, + 752, 800, 0, 480, 489, 492, 525, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, + /* 640x480@72Hz */ + { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664, + 704, 832, 0, 480, 489, 492, 520, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, + /* 640x480@75Hz */ + { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656, + 720, 840, 0, 480, 481, 484, 500, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, + /* 640x480@85Hz */ + { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 36000, 640, 696, + 752, 832, 0, 480, 481, 484, 509, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, + /* 800x600@56Hz */ + { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824, + 896, 1024, 0, 600, 601, 603, 625, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 800x600@60Hz */ + { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840, + 968, 1056, 0, 600, 601, 605, 628, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 800x600@72Hz */ + { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856, + 976, 1040, 0, 600, 637, 643, 666, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 800x600@75Hz */ + { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816, + 896, 1056, 0, 600, 601, 604, 625, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 800x600@85Hz */ + { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 56250, 800, 832, + 896, 1048, 0, 600, 601, 604, 631, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 848x480@60Hz */ + { DRM_MODE("848x480", DRM_MODE_TYPE_DRIVER, 33750, 848, 864, + 976, 1088, 0, 480, 486, 494, 517, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1024x768@43Hz, interlace */ + { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 44900, 1024, 1032, + 1208, 1264, 0, 768, 768, 772, 817, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | + DRM_MODE_FLAG_INTERLACE) }, + /* 1024x768@60Hz */ + { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048, + 1184, 1344, 0, 768, 771, 777, 806, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, + /* 1024x768@70Hz */ + { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048, + 1184, 1328, 0, 768, 771, 777, 806, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, + /* 1024x768@75Hz */ + { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78750, 1024, 1040, + 1136, 1312, 0, 768, 769, 772, 800, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1024x768@85Hz */ + { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 94500, 1024, 1072, + 1168, 1376, 0, 768, 769, 772, 808, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1152x864@75Hz */ + { DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216, + 1344, 1600, 0, 864, 865, 868, 900, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1280x768@60Hz */ + { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 79500, 1280, 1344, + 1472, 1664, 0, 768, 771, 778, 798, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1280x768@75Hz */ + { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 102250, 1280, 1360, + 1488, 1696, 0, 768, 771, 778, 805, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, + /* 1280x768@85Hz */ + { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 117500, 1280, 1360, + 1496, 1712, 0, 768, 771, 778, 809, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1280x800@60Hz */ + { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 83500, 1280, 1352, + 1480, 1680, 0, 800, 803, 809, 831, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, + /* 1280x800@75Hz */ + { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 106500, 1280, 1360, + 1488, 1696, 0, 800, 803, 809, 838, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1280x800@85Hz */ + { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 122500, 1280, 1360, + 1496, 1712, 0, 800, 803, 809, 843, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1280x960@60Hz */ + { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1376, + 1488, 1800, 0, 960, 961, 964, 1000, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1280x960@85Hz */ + { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1344, + 1504, 1728, 0, 960, 961, 964, 1011, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1280x1024@60Hz */ + { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1328, + 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1280x1024@75Hz */ + { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296, + 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1280x1024@85Hz */ + { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 157500, 1280, 1344, + 1504, 1728, 0, 1024, 1025, 1028, 1072, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1360x768@60Hz */ + { DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 85500, 1360, 1424, + 1536, 1792, 0, 768, 771, 777, 795, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1440x1050@60Hz */ + { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 121750, 1400, 1488, + 1632, 1864, 0, 1050, 1053, 1057, 1089, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1440x1050@75Hz */ + { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 156000, 1400, 1504, + 1648, 1896, 0, 1050, 1053, 1057, 1099, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1440x1050@85Hz */ + { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 179500, 1400, 1504, + 1656, 1912, 0, 1050, 1053, 1057, 1105, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1440x900@60Hz */ + { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 106500, 1440, 1520, + 1672, 1904, 0, 900, 903, 909, 934, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1440x900@75Hz */ + { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 136750, 1440, 1536, + 1688, 1936, 0, 900, 903, 909, 942, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1440x900@85Hz */ + { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 157000, 1440, 1544, + 1696, 1952, 0, 900, 903, 909, 948, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1600x1200@60Hz */ + { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 162000, 1600, 1664, + 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1600x1200@65Hz */ + { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 175500, 1600, 1664, + 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1600x1200@70Hz */ + { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 189000, 1600, 1664, + 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1600x1200@75Hz */ + { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 202500, 1600, 1664, + 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1600x1200@85Hz */ + { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 229500, 1600, 1664, + 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1680x1050@60Hz */ + { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 146250, 1680, 1784, + 1960, 2240, 0, 1050, 1053, 1059, 1089, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1680x1050@75Hz */ + { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 187000, 1680, 1800, + 1976, 2272, 0, 1050, 1053, 1059, 1099, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1680x1050@85Hz */ + { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 214750, 1680, 1808, + 1984, 2288, 0, 1050, 1053, 1059, 1105, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1792x1344@60Hz */ + { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 204750, 1792, 1920, + 2120, 2448, 0, 1344, 1345, 1348, 1394, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1729x1344@75Hz */ + { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 261000, 1792, 1888, + 2104, 2456, 0, 1344, 1345, 1348, 1417, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1853x1392@60Hz */ + { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 218250, 1856, 1952, + 2176, 2528, 0, 1392, 1393, 1396, 1439, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1856x1392@75Hz */ + { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 288000, 1856, 1984, + 2208, 2560, 0, 1392, 1395, 1399, 1500, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1920x1200@60Hz */ + { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 193250, 1920, 2056, + 2256, 2592, 0, 1200, 1203, 1209, 1245, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1920x1200@75Hz */ + { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 245250, 1920, 2056, + 2264, 2608, 0, 1200, 1203, 1209, 1255, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1920x1200@85Hz */ + { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 281250, 1920, 2064, + 2272, 2624, 0, 1200, 1203, 1209, 1262, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1920x1440@60Hz */ + { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 234000, 1920, 2048, + 2256, 2600, 0, 1440, 1441, 1444, 1500, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 1920x1440@75Hz */ + { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2064, + 2288, 2640, 0, 1440, 1441, 1444, 1500, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 2560x1600@60Hz */ + { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 348500, 2560, 2752, + 3032, 3504, 0, 1600, 1603, 1609, 1658, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 2560x1600@75HZ */ + { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 443250, 2560, 2768, + 3048, 3536, 0, 1600, 1603, 1609, 1672, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, + /* 2560x1600@85HZ */ + { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 505250, 2560, 2768, + 3048, 3536, 0, 1600, 1603, 1609, 1682, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, +}; +static const int drm_num_dmt_modes = + sizeof(drm_dmt_modes) / sizeof(struct drm_display_mode); + +static struct drm_display_mode edid_est_modes[] = { + { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840, + 968, 1056, 0, 600, 601, 605, 628, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@60Hz */ + { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824, + 896, 1024, 0, 600, 601, 603, 625, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@56Hz */ + { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656, + 720, 840, 0, 480, 481, 484, 500, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@75Hz */ + { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664, + 704, 832, 0, 480, 489, 491, 520, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@72Hz */ + { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 30240, 640, 704, + 768, 864, 0, 480, 483, 486, 525, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@67Hz */ + { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25200, 640, 656, + 752, 800, 0, 480, 490, 492, 525, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@60Hz */ + { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 738, + 846, 900, 0, 400, 421, 423, 449, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 720x400@88Hz */ + { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 28320, 720, 738, + 846, 900, 0, 400, 412, 414, 449, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 720x400@70Hz */ + { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296, + 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1280x1024@75Hz */ + { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78800, 1024, 1040, + 1136, 1312, 0, 768, 769, 772, 800, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1024x768@75Hz */ + { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048, + 1184, 1328, 0, 768, 771, 777, 806, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@70Hz */ + { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048, + 1184, 1344, 0, 768, 771, 777, 806, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@60Hz */ + { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER,44900, 1024, 1032, + 1208, 1264, 0, 768, 768, 776, 817, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* 1024x768@43Hz */ + { DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 57284, 832, 864, + 928, 1152, 0, 624, 625, 628, 667, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 832x624@75Hz */ + { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816, + 896, 1056, 0, 600, 601, 604, 625, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@75Hz */ + { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856, + 976, 1040, 0, 600, 637, 643, 666, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@72Hz */ + { DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216, + 1344, 1600, 0, 864, 865, 868, 900, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1152x864@75Hz */ +}; + +static const struct { + short w; + short h; + short r; + short rb; +} est3_modes[] = { + /* byte 6 */ + { 640, 350, 85, 0 }, + { 640, 400, 85, 0 }, + { 720, 400, 85, 0 }, + { 640, 480, 85, 0 }, + { 848, 480, 60, 0 }, + { 800, 600, 85, 0 }, + { 1024, 768, 85, 0 }, + { 1152, 864, 75, 0 }, + /* byte 7 */ + { 1280, 768, 60, 1 }, + { 1280, 768, 60, 0 }, + { 1280, 768, 75, 0 }, + { 1280, 768, 85, 0 }, + { 1280, 960, 60, 0 }, + { 1280, 960, 85, 0 }, + { 1280, 1024, 60, 0 }, + { 1280, 1024, 85, 0 }, + /* byte 8 */ + { 1360, 768, 60, 0 }, + { 1440, 900, 60, 1 }, + { 1440, 900, 60, 0 }, + { 1440, 900, 75, 0 }, + { 1440, 900, 85, 0 }, + { 1400, 1050, 60, 1 }, + { 1400, 1050, 60, 0 }, + { 1400, 1050, 75, 0 }, + /* byte 9 */ + { 1400, 1050, 85, 0 }, + { 1680, 1050, 60, 1 }, + { 1680, 1050, 60, 0 }, + { 1680, 1050, 75, 0 }, + { 1680, 1050, 85, 0 }, + { 1600, 1200, 60, 0 }, + { 1600, 1200, 65, 0 }, + { 1600, 1200, 70, 0 }, + /* byte 10 */ + { 1600, 1200, 75, 0 }, + { 1600, 1200, 85, 0 }, + { 1792, 1344, 60, 0 }, + { 1792, 1344, 85, 0 }, + { 1856, 1392, 60, 0 }, + { 1856, 1392, 75, 0 }, + { 1920, 1200, 60, 1 }, + { 1920, 1200, 60, 0 }, + /* byte 11 */ + { 1920, 1200, 75, 0 }, + { 1920, 1200, 85, 0 }, + { 1920, 1440, 60, 0 }, + { 1920, 1440, 75, 0 }, +}; +static const int num_est3_modes = sizeof(est3_modes) / sizeof(est3_modes[0]); diff --git a/sys/dev/drm2/drm_fb_helper.c b/sys/dev/drm2/drm_fb_helper.c new file mode 100644 index 00000000000..2f24ec4a404 --- /dev/null +++ b/sys/dev/drm2/drm_fb_helper.c @@ -0,0 +1,1568 @@ +/* + * Copyright (c) 2006-2009 Red Hat Inc. + * Copyright (c) 2006-2008 Intel Corporation + * Copyright (c) 2007 Dave Airlie + * + * DRM framebuffer helper functions + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + * + * Authors: + * Dave Airlie + * Jesse Barnes + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +static DRM_LIST_HEAD(kernel_fb_helper_list); + +/* simple single crtc case helper function */ +int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper) +{ + struct drm_device *dev = fb_helper->dev; + struct drm_connector *connector; + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + struct drm_fb_helper_connector *fb_helper_connector; + + fb_helper_connector = malloc( + sizeof(struct drm_fb_helper_connector), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + fb_helper_connector->connector = connector; + fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector; + } + return 0; +} + +const char *fb_mode_option; + +/** + * drm_fb_helper_connector_parse_command_line - parse command line for connector + * @connector - connector to parse line for + * @mode_option - per connector mode option + * + * This parses the connector specific then generic command lines for + * modes and options to configure the connector. + * + * This uses the same parameters as the fb modedb.c, except for extra + * x[M][R][-][@][i][m][eDd] + * + * enable/enable Digital/disable bit at the end + */ +static bool drm_fb_helper_connector_parse_command_line(struct drm_fb_helper_connector *fb_helper_conn, + const char *mode_option) +{ + const char *name; + unsigned int namelen; + int res_specified = 0, bpp_specified = 0, refresh_specified = 0; + unsigned int xres = 0, yres = 0, bpp = 32, refresh = 0; + int yres_specified = 0, cvt = 0, rb = 0, interlace = 0, margins = 0; + int i; + enum drm_connector_force force = DRM_FORCE_UNSPECIFIED; + struct drm_fb_helper_cmdline_mode *cmdline_mode; + struct drm_connector *connector; + + if (!fb_helper_conn) + return false; + connector = fb_helper_conn->connector; + + cmdline_mode = &fb_helper_conn->cmdline_mode; + if (!mode_option) + mode_option = fb_mode_option; + + if (!mode_option) { + cmdline_mode->specified = false; + return false; + } + + name = mode_option; + namelen = strlen(name); + for (i = namelen-1; i >= 0; i--) { + switch (name[i]) { + case '@': + namelen = i; + if (!refresh_specified && !bpp_specified && + !yres_specified) { + refresh = strtol(&name[i+1], NULL, 10); + refresh_specified = 1; + if (cvt || rb) + cvt = 0; + } else + goto done; + break; + case '-': + namelen = i; + if (!bpp_specified && !yres_specified) { + bpp = strtol(&name[i+1], NULL, 10); + bpp_specified = 1; + if (cvt || rb) + cvt = 0; + } else + goto done; + break; + case 'x': + if (!yres_specified) { + yres = strtol(&name[i+1], NULL, 10); + yres_specified = 1; + } else + goto done; + case '0' ... '9': + break; + case 'M': + if (!yres_specified) + cvt = 1; + break; + case 'R': + if (cvt) + rb = 1; + break; + case 'm': + if (!cvt) + margins = 1; + break; + case 'i': + if (!cvt) + interlace = 1; + break; + case 'e': + force = DRM_FORCE_ON; + break; + case 'D': + if ((connector->connector_type != DRM_MODE_CONNECTOR_DVII) && + (connector->connector_type != DRM_MODE_CONNECTOR_HDMIB)) + force = DRM_FORCE_ON; + else + force = DRM_FORCE_ON_DIGITAL; + break; + case 'd': + force = DRM_FORCE_OFF; + break; + default: + goto done; + } + } + if (i < 0 && yres_specified) { + xres = strtol(name, NULL, 10); + res_specified = 1; + } +done: + + DRM_DEBUG_KMS("cmdline mode for connector %s %dx%d@%dHz%s%s%s\n", + drm_get_connector_name(connector), xres, yres, + (refresh) ? refresh : 60, (rb) ? " reduced blanking" : + "", (margins) ? " with margins" : "", (interlace) ? + " interlaced" : ""); + + if (force) { + const char *s; + switch (force) { + case DRM_FORCE_OFF: s = "OFF"; break; + case DRM_FORCE_ON_DIGITAL: s = "ON - dig"; break; + default: + case DRM_FORCE_ON: s = "ON"; break; + } + + DRM_INFO("forcing %s connector %s\n", + drm_get_connector_name(connector), s); + connector->force = force; + } + + if (res_specified) { + cmdline_mode->specified = true; + cmdline_mode->xres = xres; + cmdline_mode->yres = yres; + } + + if (refresh_specified) { + cmdline_mode->refresh_specified = true; + cmdline_mode->refresh = refresh; + } + + if (bpp_specified) { + cmdline_mode->bpp_specified = true; + cmdline_mode->bpp = bpp; + } + cmdline_mode->rb = rb ? true : false; + cmdline_mode->cvt = cvt ? true : false; + cmdline_mode->interlace = interlace ? true : false; + + return true; +} + +static int +fb_get_options(const char *connector_name, char **option) +{ + + return (1); +} + +static int drm_fb_helper_parse_command_line(struct drm_fb_helper *fb_helper) +{ + struct drm_fb_helper_connector *fb_helper_conn; + int i; + + for (i = 0; i < fb_helper->connector_count; i++) { + char *option = NULL; + + fb_helper_conn = fb_helper->connector_info[i]; + + /* do something on return - turn off connector maybe */ + if (fb_get_options(drm_get_connector_name(fb_helper_conn->connector), &option)) + continue; + + drm_fb_helper_connector_parse_command_line(fb_helper_conn, option); + } + return 0; +} + +#if 0 +static void drm_fb_helper_save_lut_atomic(struct drm_crtc *crtc, struct drm_fb_helper *helper) +{ + uint16_t *r_base, *g_base, *b_base; + int i; + + r_base = crtc->gamma_store; + g_base = r_base + crtc->gamma_size; + b_base = g_base + crtc->gamma_size; + + for (i = 0; i < crtc->gamma_size; i++) + helper->funcs->gamma_get(crtc, &r_base[i], &g_base[i], &b_base[i], i); +} + +static void drm_fb_helper_restore_lut_atomic(struct drm_crtc *crtc) +{ + uint16_t *r_base, *g_base, *b_base; + + r_base = crtc->gamma_store; + g_base = r_base + crtc->gamma_size; + b_base = g_base + crtc->gamma_size; + + crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, 0, crtc->gamma_size); +} +#endif + +#if 0 +int drm_fb_helper_debug_enter(struct fb_info *info) +{ + struct drm_fb_helper *helper = info->par; + struct drm_crtc_helper_funcs *funcs; + int i; + + if (list_empty(&kernel_fb_helper_list)) + return false; + + list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) { + for (i = 0; i < helper->crtc_count; i++) { + struct drm_mode_set *mode_set = + &helper->crtc_info[i].mode_set; + + if (!mode_set->crtc->enabled) + continue; + + funcs = mode_set->crtc->helper_private; + drm_fb_helper_save_lut_atomic(mode_set->crtc, helper); + funcs->mode_set_base_atomic(mode_set->crtc, + mode_set->fb, + mode_set->x, + mode_set->y, + ENTER_ATOMIC_MODE_SET); + } + } + + return 0; +} +#endif + +#if 0 +/* Find the real fb for a given fb helper CRTC */ +static struct drm_framebuffer *drm_mode_config_fb(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_crtc *c; + + list_for_each_entry(c, &dev->mode_config.crtc_list, head) { + if (crtc->base.id == c->base.id) + return c->fb; + } + + return NULL; +} +#endif + +#if 0 +int drm_fb_helper_debug_leave(struct fb_info *info) +{ + struct drm_fb_helper *helper = info->par; + struct drm_crtc *crtc; + struct drm_crtc_helper_funcs *funcs; + struct drm_framebuffer *fb; + int i; + + for (i = 0; i < helper->crtc_count; i++) { + struct drm_mode_set *mode_set = &helper->crtc_info[i].mode_set; + crtc = mode_set->crtc; + funcs = crtc->helper_private; + fb = drm_mode_config_fb(crtc); + + if (!crtc->enabled) + continue; + + if (!fb) { + DRM_ERROR("no fb to restore??\n"); + continue; + } + + drm_fb_helper_restore_lut_atomic(mode_set->crtc); + funcs->mode_set_base_atomic(mode_set->crtc, fb, crtc->x, + crtc->y, LEAVE_ATOMIC_MODE_SET); + } + + return 0; +} +#endif + +bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper) +{ + bool error = false; + int i, ret; + for (i = 0; i < fb_helper->crtc_count; i++) { + struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set; + ret = drm_crtc_helper_set_config(mode_set); + if (ret) + error = true; + } + return error; +} + +#if 0 +bool drm_fb_helper_force_kernel_mode(void) +{ + bool ret, error = false; + struct drm_fb_helper *helper; + + if (list_empty(&kernel_fb_helper_list)) + return false; + + list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) { + if (helper->dev->switch_power_state == DRM_SWITCH_POWER_OFF) + continue; + + ret = drm_fb_helper_restore_fbdev_mode(helper); + if (ret) + error = true; + } + return error; +} +#endif + +#if 0 +int drm_fb_helper_panic(struct notifier_block *n, unsigned long ununsed, + void *panic_str) +{ + printf("panic occurred, switching back to text console\n"); + return drm_fb_helper_force_kernel_mode(); + return 0; +} + +static struct notifier_block paniced = { + .notifier_call = drm_fb_helper_panic, +}; + +/** + * drm_fb_helper_restore - restore the framebuffer console (kernel) config + * + * Restore's the kernel's fbcon mode, used for lastclose & panic paths. + */ +void drm_fb_helper_restore(void) +{ + bool ret; + ret = drm_fb_helper_force_kernel_mode(); + if (ret == true) + DRM_ERROR("Failed to restore crtc configuration\n"); +} + +#ifdef CONFIG_MAGIC_SYSRQ +static void drm_fb_helper_restore_work_fn(struct work_struct *ignored) +{ + drm_fb_helper_restore(); +} +static DECLARE_WORK(drm_fb_helper_restore_work, drm_fb_helper_restore_work_fn); + +static void drm_fb_helper_sysrq(int dummy1) +{ + schedule_work(&drm_fb_helper_restore_work); +} + +static struct sysrq_key_op sysrq_drm_fb_helper_restore_op = { + .handler = drm_fb_helper_sysrq, + .help_msg = "force-fb(V)", + .action_msg = "Restore framebuffer console", +}; +#else +static struct sysrq_key_op sysrq_drm_fb_helper_restore_op = { }; +#endif +#endif + +#if 0 +static void drm_fb_helper_on(struct fb_info *info) +{ + struct drm_fb_helper *fb_helper = info->par; + struct drm_device *dev = fb_helper->dev; + struct drm_crtc *crtc; + struct drm_crtc_helper_funcs *crtc_funcs; + struct drm_connector *connector; + struct drm_encoder *encoder; + int i, j; + + /* + * For each CRTC in this fb, turn the crtc on then, + * find all associated encoders and turn them on. + */ + sx_xlock(&dev->mode_config.mutex); + for (i = 0; i < fb_helper->crtc_count; i++) { + crtc = fb_helper->crtc_info[i].mode_set.crtc; + crtc_funcs = crtc->helper_private; + + if (!crtc->enabled) + continue; + + crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON); + + /* Walk the connectors & encoders on this fb turning them on */ + for (j = 0; j < fb_helper->connector_count; j++) { + connector = fb_helper->connector_info[j]->connector; + connector->dpms = DRM_MODE_DPMS_ON; + drm_connector_property_set_value(connector, + dev->mode_config.dpms_property, + DRM_MODE_DPMS_ON); + } + /* Found a CRTC on this fb, now find encoders */ + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + if (encoder->crtc == crtc) { + struct drm_encoder_helper_funcs *encoder_funcs; + + encoder_funcs = encoder->helper_private; + encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON); + } + } + } + sx_xunlock(&dev->mode_config.mutex); +} +#endif + +#if 0 +static void drm_fb_helper_off(struct fb_info *info, int dpms_mode) +{ + struct drm_fb_helper *fb_helper = info->par; + struct drm_device *dev = fb_helper->dev; + struct drm_crtc *crtc; + struct drm_crtc_helper_funcs *crtc_funcs; + struct drm_connector *connector; + struct drm_encoder *encoder; + int i, j; + + /* + * For each CRTC in this fb, find all associated encoders + * and turn them off, then turn off the CRTC. + */ + sx_xlock(&dev->mode_config.mutex); + for (i = 0; i < fb_helper->crtc_count; i++) { + crtc = fb_helper->crtc_info[i].mode_set.crtc; + crtc_funcs = crtc->helper_private; + + if (!crtc->enabled) + continue; + + /* Walk the connectors on this fb and mark them off */ + for (j = 0; j < fb_helper->connector_count; j++) { + connector = fb_helper->connector_info[j]->connector; + connector->dpms = dpms_mode; + drm_connector_property_set_value(connector, + dev->mode_config.dpms_property, + dpms_mode); + } + /* Found a CRTC on this fb, now find encoders */ + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + if (encoder->crtc == crtc) { + struct drm_encoder_helper_funcs *encoder_funcs; + + encoder_funcs = encoder->helper_private; + encoder_funcs->dpms(encoder, dpms_mode); + } + } + crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); + } + sx_xunlock(&dev->mode_config.mutex); +} +#endif + +#if 0 +int drm_fb_helper_blank(int blank, struct fb_info *info) +{ + switch (blank) { + /* Display: On; HSync: On, VSync: On */ + case FB_BLANK_UNBLANK: + drm_fb_helper_on(info); + break; + /* Display: Off; HSync: On, VSync: On */ + case FB_BLANK_NORMAL: + drm_fb_helper_off(info, DRM_MODE_DPMS_STANDBY); + break; + /* Display: Off; HSync: Off, VSync: On */ + case FB_BLANK_HSYNC_SUSPEND: + drm_fb_helper_off(info, DRM_MODE_DPMS_STANDBY); + break; + /* Display: Off; HSync: On, VSync: Off */ + case FB_BLANK_VSYNC_SUSPEND: + drm_fb_helper_off(info, DRM_MODE_DPMS_SUSPEND); + break; + /* Display: Off; HSync: Off, VSync: Off */ + case FB_BLANK_POWERDOWN: + drm_fb_helper_off(info, DRM_MODE_DPMS_OFF); + break; + } + return 0; +} +#endif + +static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper) +{ + int i; + + for (i = 0; i < helper->connector_count; i++) + free(helper->connector_info[i], DRM_MEM_KMS); + free(helper->connector_info, DRM_MEM_KMS); + for (i = 0; i < helper->crtc_count; i++) + free(helper->crtc_info[i].mode_set.connectors, DRM_MEM_KMS); + free(helper->crtc_info, DRM_MEM_KMS); +} + +int drm_fb_helper_init(struct drm_device *dev, + struct drm_fb_helper *fb_helper, + int crtc_count, int max_conn_count) +{ + struct drm_crtc *crtc; + int i; + + fb_helper->dev = dev; + + INIT_LIST_HEAD(&fb_helper->kernel_fb_list); + + fb_helper->crtc_info = malloc(crtc_count * + sizeof(struct drm_fb_helper_crtc), DRM_MEM_KMS, M_WAITOK | M_ZERO); + + fb_helper->crtc_count = crtc_count; + fb_helper->connector_info = malloc(dev->mode_config.num_connector * + sizeof(struct drm_fb_helper_connector *), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + fb_helper->connector_count = 0; + + for (i = 0; i < crtc_count; i++) { + fb_helper->crtc_info[i].mode_set.connectors = + malloc(max_conn_count * sizeof(struct drm_connector *), + DRM_MEM_KMS, M_WAITOK | M_ZERO); + + fb_helper->crtc_info[i].mode_set.num_connectors = 0; + } + + i = 0; + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + fb_helper->crtc_info[i].crtc_id = crtc->base.id; + fb_helper->crtc_info[i].mode_set.crtc = crtc; + i++; + } + fb_helper->conn_limit = max_conn_count; + return 0; +} + +void drm_fb_helper_fini(struct drm_fb_helper *fb_helper) +{ + if (!list_empty(&fb_helper->kernel_fb_list)) { + list_del(&fb_helper->kernel_fb_list); + if (list_empty(&kernel_fb_helper_list)) { +#if 0 + printk(KERN_INFO "drm: unregistered panic notifier\n"); + atomic_notifier_chain_unregister(&panic_notifier_list, + &paniced); + unregister_sysrq_key('v', &sysrq_drm_fb_helper_restore_op); +#endif + } + } + + drm_fb_helper_crtc_free(fb_helper); + +} + +#if 0 +static int setcolreg(struct drm_crtc *crtc, u16 red, u16 green, + u16 blue, u16 regno, struct fb_info *info) +{ + struct drm_fb_helper *fb_helper = info->par; + struct drm_framebuffer *fb = fb_helper->fb; + int pindex; + + if (info->fix.visual == FB_VISUAL_trueCOLOR) { + u32 *palette; + u32 value; + /* place color in psuedopalette */ + if (regno > 16) + return -EINVAL; + palette = (u32 *)info->pseudo_palette; + red >>= (16 - info->var.red.length); + green >>= (16 - info->var.green.length); + blue >>= (16 - info->var.blue.length); + value = (red << info->var.red.offset) | + (green << info->var.green.offset) | + (blue << info->var.blue.offset); + if (info->var.transp.length > 0) { + u32 mask = (1 << info->var.transp.length) - 1; + mask <<= info->var.transp.offset; + value |= mask; + } + palette[regno] = value; + return 0; + } + + pindex = regno; + + if (fb->bits_per_pixel == 16) { + pindex = regno << 3; + + if (fb->depth == 16 && regno > 63) + return -EINVAL; + if (fb->depth == 15 && regno > 31) + return -EINVAL; + + if (fb->depth == 16) { + u16 r, g, b; + int i; + if (regno < 32) { + for (i = 0; i < 8; i++) + fb_helper->funcs->gamma_set(crtc, red, + green, blue, pindex + i); + } + + fb_helper->funcs->gamma_get(crtc, &r, + &g, &b, + pindex >> 1); + + for (i = 0; i < 4; i++) + fb_helper->funcs->gamma_set(crtc, r, + green, b, + (pindex >> 1) + i); + } + } + + if (fb->depth != 16) + fb_helper->funcs->gamma_set(crtc, red, green, blue, pindex); + return 0; +} +#endif + +#if 0 +int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) +{ + struct drm_fb_helper *fb_helper = info->par; + struct drm_crtc_helper_funcs *crtc_funcs; + u16 *red, *green, *blue, *transp; + struct drm_crtc *crtc; + int i, j, rc = 0; + int start; + + for (i = 0; i < fb_helper->crtc_count; i++) { + crtc = fb_helper->crtc_info[i].mode_set.crtc; + crtc_funcs = crtc->helper_private; + + red = cmap->red; + green = cmap->green; + blue = cmap->blue; + transp = cmap->transp; + start = cmap->start; + + for (j = 0; j < cmap->len; j++) { + u16 hred, hgreen, hblue, htransp = 0xffff; + + hred = *red++; + hgreen = *green++; + hblue = *blue++; + + if (transp) + htransp = *transp++; + + rc = setcolreg(crtc, hred, hgreen, hblue, start++, info); + if (rc) + return rc; + } + crtc_funcs->load_lut(crtc); + } + return rc; +} +#endif + +#if 0 +int drm_fb_helper_check_var(struct fb_var_screeninfo *var, + struct fb_info *info) +{ + struct drm_fb_helper *fb_helper = info->par; + struct drm_framebuffer *fb = fb_helper->fb; + int depth; + + if (var->pixclock != 0 || in_dbg_master()) + return -EINVAL; + + /* Need to resize the fb object !!! */ + if (var->bits_per_pixel > fb->bits_per_pixel || + var->xres > fb->width || var->yres > fb->height || + var->xres_virtual > fb->width || var->yres_virtual > fb->height) { + DRM_DEBUG("fb userspace requested width/height/bpp is greater than current fb " + "request %dx%d-%d (virtual %dx%d) > %dx%d-%d\n", + var->xres, var->yres, var->bits_per_pixel, + var->xres_virtual, var->yres_virtual, + fb->width, fb->height, fb->bits_per_pixel); + return -EINVAL; + } + + switch (var->bits_per_pixel) { + case 16: + depth = (var->green.length == 6) ? 16 : 15; + break; + case 32: + depth = (var->transp.length > 0) ? 32 : 24; + break; + default: + depth = var->bits_per_pixel; + break; + } + + switch (depth) { + case 8: + var->red.offset = 0; + var->green.offset = 0; + var->blue.offset = 0; + var->red.length = 8; + var->green.length = 8; + var->blue.length = 8; + var->transp.length = 0; + var->transp.offset = 0; + break; + case 15: + var->red.offset = 10; + var->green.offset = 5; + var->blue.offset = 0; + var->red.length = 5; + var->green.length = 5; + var->blue.length = 5; + var->transp.length = 1; + var->transp.offset = 15; + break; + case 16: + var->red.offset = 11; + var->green.offset = 5; + var->blue.offset = 0; + var->red.length = 5; + var->green.length = 6; + var->blue.length = 5; + var->transp.length = 0; + var->transp.offset = 0; + break; + case 24: + var->red.offset = 16; + var->green.offset = 8; + var->blue.offset = 0; + var->red.length = 8; + var->green.length = 8; + var->blue.length = 8; + var->transp.length = 0; + var->transp.offset = 0; + break; + case 32: + var->red.offset = 16; + var->green.offset = 8; + var->blue.offset = 0; + var->red.length = 8; + var->green.length = 8; + var->blue.length = 8; + var->transp.length = 8; + var->transp.offset = 24; + break; + default: + return -EINVAL; + } + return 0; +} +#endif + +#if 0 +/* this will let fbcon do the mode init */ +int drm_fb_helper_set_par(struct fb_info *info) +{ + struct drm_fb_helper *fb_helper = info->par; + struct drm_device *dev = fb_helper->dev; + struct fb_var_screeninfo *var = &info->var; + struct drm_crtc *crtc; + int ret; + int i; + + if (var->pixclock != 0) { + DRM_ERROR("PIXEL CLOCK SET\n"); + return -EINVAL; + } + + mutex_lock(&dev->mode_config.mutex); + for (i = 0; i < fb_helper->crtc_count; i++) { + crtc = fb_helper->crtc_info[i].mode_set.crtc; + ret = crtc->funcs->set_config(&fb_helper->crtc_info[i].mode_set); + if (ret) { + mutex_unlock(&dev->mode_config.mutex); + return ret; + } + } + mutex_unlock(&dev->mode_config.mutex); + + if (fb_helper->delayed_hotplug) { + fb_helper->delayed_hotplug = false; + drm_fb_helper_hotplug_event(fb_helper); + } + return 0; +} +#endif + +#if 0 +int drm_fb_helper_pan_display(struct fb_var_screeninfo *var, + struct fb_info *info) +{ + struct drm_fb_helper *fb_helper = info->par; + struct drm_device *dev = fb_helper->dev; + struct drm_mode_set *modeset; + struct drm_crtc *crtc; + int ret = 0; + int i; + + mutex_lock(&dev->mode_config.mutex); + for (i = 0; i < fb_helper->crtc_count; i++) { + crtc = fb_helper->crtc_info[i].mode_set.crtc; + + modeset = &fb_helper->crtc_info[i].mode_set; + + modeset->x = var->xoffset; + modeset->y = var->yoffset; + + if (modeset->num_connectors) { + ret = crtc->funcs->set_config(modeset); + if (!ret) { + info->var.xoffset = var->xoffset; + info->var.yoffset = var->yoffset; + } + } + } + mutex_unlock(&dev->mode_config.mutex); + return ret; +} +#endif + +int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper, + int preferred_bpp) +{ + int new_fb = 0; + int crtc_count = 0; + int i; +#if 0 + struct fb_info *info; +#endif + struct drm_fb_helper_surface_size sizes; + int gamma_size = 0; + + memset(&sizes, 0, sizeof(struct drm_fb_helper_surface_size)); + sizes.surface_depth = 24; + sizes.surface_bpp = 32; + sizes.fb_width = (unsigned)-1; + sizes.fb_height = (unsigned)-1; + + /* if driver picks 8 or 16 by default use that + for both depth/bpp */ + if (preferred_bpp != sizes.surface_bpp) { + sizes.surface_depth = sizes.surface_bpp = preferred_bpp; + } + /* first up get a count of crtcs now in use and new min/maxes width/heights */ + for (i = 0; i < fb_helper->connector_count; i++) { + struct drm_fb_helper_connector *fb_helper_conn = fb_helper->connector_info[i]; + struct drm_fb_helper_cmdline_mode *cmdline_mode; + + cmdline_mode = &fb_helper_conn->cmdline_mode; + + if (cmdline_mode->bpp_specified) { + switch (cmdline_mode->bpp) { + case 8: + sizes.surface_depth = sizes.surface_bpp = 8; + break; + case 15: + sizes.surface_depth = 15; + sizes.surface_bpp = 16; + break; + case 16: + sizes.surface_depth = sizes.surface_bpp = 16; + break; + case 24: + sizes.surface_depth = sizes.surface_bpp = 24; + break; + case 32: + sizes.surface_depth = 24; + sizes.surface_bpp = 32; + break; + } + break; + } + } + + crtc_count = 0; + for (i = 0; i < fb_helper->crtc_count; i++) { + struct drm_display_mode *desired_mode; + desired_mode = fb_helper->crtc_info[i].desired_mode; + + if (desired_mode) { + if (gamma_size == 0) + gamma_size = fb_helper->crtc_info[i].mode_set.crtc->gamma_size; + if (desired_mode->hdisplay < sizes.fb_width) + sizes.fb_width = desired_mode->hdisplay; + if (desired_mode->vdisplay < sizes.fb_height) + sizes.fb_height = desired_mode->vdisplay; + if (desired_mode->hdisplay > sizes.surface_width) + sizes.surface_width = desired_mode->hdisplay; + if (desired_mode->vdisplay > sizes.surface_height) + sizes.surface_height = desired_mode->vdisplay; + crtc_count++; + } + } + + if (crtc_count == 0 || sizes.fb_width == -1 || sizes.fb_height == -1) { + /* hmm everyone went away - assume VGA cable just fell out + and will come back later. */ + DRM_INFO("Cannot find any crtc or sizes - going 1024x768\n"); + sizes.fb_width = sizes.surface_width = 1024; + sizes.fb_height = sizes.surface_height = 768; + } + + /* push down into drivers */ + new_fb = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes); + if (new_fb < 0) + return new_fb; + +#if 0 + info = fb_helper->fbdev; +#endif + + /* set the fb pointer */ + for (i = 0; i < fb_helper->crtc_count; i++) { + fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb; + } + +#if 0 + if (new_fb) { + info->var.pixclock = 0; + if (register_framebuffer(info) < 0) { + return -EINVAL; + } + + printf("fb%d: %s frame buffer device\n", info->node, + info->fix.id); + + } else { + drm_fb_helper_set_par(info); + } + + /* Switch back to kernel console on panic */ + /* multi card linked list maybe */ + if (list_empty(&kernel_fb_helper_list)) { + printf("drm: registered panic notifier\n"); + atomic_notifier_chain_register(&panic_notifier_list, + &paniced); + } + if (new_fb) + list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list); +#endif + + return 0; +} + +#if 0 +void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, + uint32_t depth) +{ + info->fix.type = FB_TYPE_PACKED_PIXELS; + info->fix.visual = depth == 8 ? FB_VISUAL_PSEUDOCOLOR : + FB_VISUAL_trueCOLOR; + info->fix.mmio_start = 0; + info->fix.mmio_len = 0; + info->fix.type_aux = 0; + info->fix.xpanstep = 1; /* doing it in hw */ + info->fix.ypanstep = 1; /* doing it in hw */ + info->fix.ywrapstep = 0; + info->fix.accel = FB_ACCEL_NONE; + info->fix.type_aux = 0; + + info->fix.line_length = pitch; + return; +} + +void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper, + uint32_t fb_width, uint32_t fb_height) +{ + struct drm_framebuffer *fb = fb_helper->fb; + info->pseudo_palette = fb_helper->pseudo_palette; + info->var.xres_virtual = fb->width; + info->var.yres_virtual = fb->height; + info->var.bits_per_pixel = fb->bits_per_pixel; + info->var.accel_flags = FB_ACCELF_TEXT; + info->var.xoffset = 0; + info->var.yoffset = 0; + info->var.activate = FB_ACTIVATE_NOW; + info->var.height = -1; + info->var.width = -1; + + switch (fb->depth) { + case 8: + info->var.red.offset = 0; + info->var.green.offset = 0; + info->var.blue.offset = 0; + info->var.red.length = 8; /* 8bit DAC */ + info->var.green.length = 8; + info->var.blue.length = 8; + info->var.transp.offset = 0; + info->var.transp.length = 0; + break; + case 15: + info->var.red.offset = 10; + info->var.green.offset = 5; + info->var.blue.offset = 0; + info->var.red.length = 5; + info->var.green.length = 5; + info->var.blue.length = 5; + info->var.transp.offset = 15; + info->var.transp.length = 1; + break; + case 16: + info->var.red.offset = 11; + info->var.green.offset = 5; + info->var.blue.offset = 0; + info->var.red.length = 5; + info->var.green.length = 6; + info->var.blue.length = 5; + info->var.transp.offset = 0; + break; + case 24: + info->var.red.offset = 16; + info->var.green.offset = 8; + info->var.blue.offset = 0; + info->var.red.length = 8; + info->var.green.length = 8; + info->var.blue.length = 8; + info->var.transp.offset = 0; + info->var.transp.length = 0; + break; + case 32: + info->var.red.offset = 16; + info->var.green.offset = 8; + info->var.blue.offset = 0; + info->var.red.length = 8; + info->var.green.length = 8; + info->var.blue.length = 8; + info->var.transp.offset = 24; + info->var.transp.length = 8; + break; + default: + break; + } + + info->var.xres = fb_width; + info->var.yres = fb_height; +} +#endif + +static int drm_fb_helper_probe_connector_modes(struct drm_fb_helper *fb_helper, + uint32_t maxX, + uint32_t maxY) +{ + struct drm_connector *connector; + int count = 0; + int i; + + for (i = 0; i < fb_helper->connector_count; i++) { + connector = fb_helper->connector_info[i]->connector; + count += connector->funcs->fill_modes(connector, maxX, maxY); + } + + return count; +} + +static struct drm_display_mode *drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector, int width, int height) +{ + struct drm_display_mode *mode; + + list_for_each_entry(mode, &fb_connector->connector->modes, head) { + if (drm_mode_width(mode) > width || + drm_mode_height(mode) > height) + continue; + if (mode->type & DRM_MODE_TYPE_PREFERRED) + return mode; + } + return NULL; +} + +static bool drm_has_cmdline_mode(struct drm_fb_helper_connector *fb_connector) +{ + struct drm_fb_helper_cmdline_mode *cmdline_mode; + cmdline_mode = &fb_connector->cmdline_mode; + return cmdline_mode->specified; +} + +static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn, + int width, int height) +{ + struct drm_cmdline_mode *cmdline_mode; + struct drm_display_mode *mode = NULL; + + cmdline_mode = &fb_helper_conn->cmdline_mode1; + if (cmdline_mode->specified == false && + !drm_fetch_cmdline_mode_from_kenv(fb_helper_conn->connector, + cmdline_mode)) + return (NULL); + + /* attempt to find a matching mode in the list of modes + * we have gotten so far, if not add a CVT mode that conforms + */ + if (cmdline_mode->rb || cmdline_mode->margins) + goto create_mode; + + list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) { + /* check width/height */ + if (mode->hdisplay != cmdline_mode->xres || + mode->vdisplay != cmdline_mode->yres) + continue; + + if (cmdline_mode->refresh_specified) { + if (mode->vrefresh != cmdline_mode->refresh) + continue; + } + + if (cmdline_mode->interlace) { + if (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) + continue; + } + return mode; + } + +create_mode: + if (cmdline_mode->cvt) + mode = drm_cvt_mode(fb_helper_conn->connector->dev, + cmdline_mode->xres, cmdline_mode->yres, + cmdline_mode->refresh_specified ? cmdline_mode->refresh : 60, + cmdline_mode->rb, cmdline_mode->interlace, + cmdline_mode->margins); + else + mode = drm_gtf_mode(fb_helper_conn->connector->dev, + cmdline_mode->xres, cmdline_mode->yres, + cmdline_mode->refresh_specified ? cmdline_mode->refresh : 60, + cmdline_mode->interlace, + cmdline_mode->margins); + drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); + list_add(&mode->head, &fb_helper_conn->connector->modes); + return mode; +} + +static bool drm_connector_enabled(struct drm_connector *connector, bool strict) +{ + bool enable; + + if (strict) { + enable = connector->status == connector_status_connected; + } else { + enable = connector->status != connector_status_disconnected; + } + return enable; +} + +static void drm_enable_connectors(struct drm_fb_helper *fb_helper, + bool *enabled) +{ + bool any_enabled = false; + struct drm_connector *connector; + int i = 0; + + for (i = 0; i < fb_helper->connector_count; i++) { + connector = fb_helper->connector_info[i]->connector; + enabled[i] = drm_connector_enabled(connector, true); + DRM_DEBUG_KMS("connector %d enabled? %s\n", connector->base.id, + enabled[i] ? "yes" : "no"); + any_enabled |= enabled[i]; + } + + if (any_enabled) + return; + + for (i = 0; i < fb_helper->connector_count; i++) { + connector = fb_helper->connector_info[i]->connector; + enabled[i] = drm_connector_enabled(connector, false); + } +} + +static bool drm_target_cloned(struct drm_fb_helper *fb_helper, + struct drm_display_mode **modes, + bool *enabled, int width, int height) +{ + int count, i, j; + bool can_clone = false; + struct drm_fb_helper_connector *fb_helper_conn; + struct drm_display_mode *dmt_mode, *mode; + + /* only contemplate cloning in the single crtc case */ + if (fb_helper->crtc_count > 1) + return false; + + count = 0; + for (i = 0; i < fb_helper->connector_count; i++) { + if (enabled[i]) + count++; + } + + /* only contemplate cloning if more than one connector is enabled */ + if (count <= 1) + return false; + + /* check the command line or if nothing common pick 1024x768 */ + can_clone = true; + for (i = 0; i < fb_helper->connector_count; i++) { + if (!enabled[i]) + continue; + fb_helper_conn = fb_helper->connector_info[i]; + modes[i] = drm_pick_cmdline_mode(fb_helper_conn, width, height); + if (!modes[i]) { + can_clone = false; + break; + } + for (j = 0; j < i; j++) { + if (!enabled[j]) + continue; + if (!drm_mode_equal(modes[j], modes[i])) + can_clone = false; + } + } + + if (can_clone) { + DRM_DEBUG_KMS("can clone using command line\n"); + return true; + } + + /* try and find a 1024x768 mode on each connector */ + can_clone = true; + dmt_mode = drm_mode_find_dmt(fb_helper->dev, 1024, 768, 60); + + for (i = 0; i < fb_helper->connector_count; i++) { + + if (!enabled[i]) + continue; + + fb_helper_conn = fb_helper->connector_info[i]; + list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) { + if (drm_mode_equal(mode, dmt_mode)) + modes[i] = mode; + } + if (!modes[i]) + can_clone = false; + } + + if (can_clone) { + DRM_DEBUG_KMS("can clone using 1024x768\n"); + return true; + } + DRM_INFO("kms: can't enable cloning when we probably wanted to.\n"); + return false; +} + +static bool drm_target_preferred(struct drm_fb_helper *fb_helper, + struct drm_display_mode **modes, + bool *enabled, int width, int height) +{ + struct drm_fb_helper_connector *fb_helper_conn; + int i; + + for (i = 0; i < fb_helper->connector_count; i++) { + fb_helper_conn = fb_helper->connector_info[i]; + + if (enabled[i] == false) + continue; + + DRM_DEBUG_KMS("looking for cmdline mode on connector %d\n", + fb_helper_conn->connector->base.id); + + /* got for command line mode first */ + modes[i] = drm_pick_cmdline_mode(fb_helper_conn, width, height); + if (!modes[i]) { + DRM_DEBUG_KMS("looking for preferred mode on connector %d\n", + fb_helper_conn->connector->base.id); + modes[i] = drm_has_preferred_mode(fb_helper_conn, width, height); + } + /* No preferred modes, pick one off the list */ + if (!modes[i] && !list_empty(&fb_helper_conn->connector->modes)) { + list_for_each_entry(modes[i], &fb_helper_conn->connector->modes, head) + break; + } + DRM_DEBUG_KMS("found mode %s\n", modes[i] ? modes[i]->name : + "none"); + } + return true; +} + +static int drm_pick_crtcs(struct drm_fb_helper *fb_helper, + struct drm_fb_helper_crtc **best_crtcs, + struct drm_display_mode **modes, + int n, int width, int height) +{ + int c, o; + struct drm_device *dev = fb_helper->dev; + struct drm_connector *connector; + struct drm_connector_helper_funcs *connector_funcs; + struct drm_encoder *encoder; + struct drm_fb_helper_crtc *best_crtc; + int my_score, best_score, score; + struct drm_fb_helper_crtc **crtcs, *crtc; + struct drm_fb_helper_connector *fb_helper_conn; + + if (n == fb_helper->connector_count) + return 0; + + fb_helper_conn = fb_helper->connector_info[n]; + connector = fb_helper_conn->connector; + + best_crtcs[n] = NULL; + best_crtc = NULL; + best_score = drm_pick_crtcs(fb_helper, best_crtcs, modes, n+1, width, height); + if (modes[n] == NULL) + return best_score; + + crtcs = malloc(dev->mode_config.num_connector * + sizeof(struct drm_fb_helper_crtc *), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + my_score = 1; + if (connector->status == connector_status_connected) + my_score++; + if (drm_has_cmdline_mode(fb_helper_conn)) + my_score++; + if (drm_has_preferred_mode(fb_helper_conn, width, height)) + my_score++; + + connector_funcs = connector->helper_private; + encoder = connector_funcs->best_encoder(connector); + if (!encoder) + goto out; + + /* select a crtc for this connector and then attempt to configure + remaining connectors */ + for (c = 0; c < fb_helper->crtc_count; c++) { + crtc = &fb_helper->crtc_info[c]; + + if ((encoder->possible_crtcs & (1 << c)) == 0) { + continue; + } + + for (o = 0; o < n; o++) + if (best_crtcs[o] == crtc) + break; + + if (o < n) { + /* ignore cloning unless only a single crtc */ + if (fb_helper->crtc_count > 1) + continue; + + if (!drm_mode_equal(modes[o], modes[n])) + continue; + } + + crtcs[n] = crtc; + memcpy(crtcs, best_crtcs, n * sizeof(struct drm_fb_helper_crtc *)); + score = my_score + drm_pick_crtcs(fb_helper, crtcs, modes, n + 1, + width, height); + if (score > best_score) { + best_crtc = crtc; + best_score = score; + memcpy(best_crtcs, crtcs, + dev->mode_config.num_connector * + sizeof(struct drm_fb_helper_crtc *)); + } + } +out: + free(crtcs, DRM_MEM_KMS); + return best_score; +} + +static void drm_setup_crtcs(struct drm_fb_helper *fb_helper) +{ + struct drm_device *dev = fb_helper->dev; + struct drm_fb_helper_crtc **crtcs; + struct drm_display_mode **modes; + struct drm_encoder *encoder; + struct drm_mode_set *modeset; + bool *enabled; + int width, height; + int i, ret; + + DRM_DEBUG_KMS("\n"); + + width = dev->mode_config.max_width; + height = dev->mode_config.max_height; + + /* clean out all the encoder/crtc combos */ + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + encoder->crtc = NULL; + } + + crtcs = malloc(dev->mode_config.num_connector * + sizeof(struct drm_fb_helper_crtc *), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + modes = malloc(dev->mode_config.num_connector * + sizeof(struct drm_display_mode *), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + enabled = malloc(dev->mode_config.num_connector * + sizeof(bool), DRM_MEM_KMS, M_WAITOK | M_ZERO); + + drm_enable_connectors(fb_helper, enabled); + + ret = drm_target_cloned(fb_helper, modes, enabled, width, height); + if (!ret) { + ret = drm_target_preferred(fb_helper, modes, enabled, width, height); + if (!ret) + DRM_ERROR("Unable to find initial modes\n"); + } + + DRM_DEBUG_KMS("picking CRTCs for %dx%d config\n", width, height); + + drm_pick_crtcs(fb_helper, crtcs, modes, 0, width, height); + + /* need to set the modesets up here for use later */ + /* fill out the connector<->crtc mappings into the modesets */ + for (i = 0; i < fb_helper->crtc_count; i++) { + modeset = &fb_helper->crtc_info[i].mode_set; + modeset->num_connectors = 0; + } + + for (i = 0; i < fb_helper->connector_count; i++) { + struct drm_display_mode *mode = modes[i]; + struct drm_fb_helper_crtc *fb_crtc = crtcs[i]; + modeset = &fb_crtc->mode_set; + + if (mode && fb_crtc) { + DRM_DEBUG_KMS("desired mode %s set on crtc %d\n", + mode->name, fb_crtc->mode_set.crtc->base.id); + fb_crtc->desired_mode = mode; + if (modeset->mode) + drm_mode_destroy(dev, modeset->mode); + modeset->mode = drm_mode_duplicate(dev, + fb_crtc->desired_mode); + modeset->connectors[modeset->num_connectors++] = fb_helper->connector_info[i]->connector; + } + } + + free(crtcs, DRM_MEM_KMS); + free(modes, DRM_MEM_KMS); + free(enabled, DRM_MEM_KMS); +} + +/** + * drm_helper_initial_config - setup a sane initial connector configuration + * @dev: DRM device + * + * LOCKING: + * Called at init time, must take mode config lock. + * + * Scan the CRTCs and connectors and try to put together an initial setup. + * At the moment, this is a cloned configuration across all heads with + * a new framebuffer object as the backing store. + * + * RETURNS: + * Zero if everything went ok, nonzero otherwise. + */ +bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) +{ + struct drm_device *dev = fb_helper->dev; + int count = 0; + + /* disable all the possible outputs/crtcs before entering KMS mode */ + drm_helper_disable_unused_functions(fb_helper->dev); + + drm_fb_helper_parse_command_line(fb_helper); + + count = drm_fb_helper_probe_connector_modes(fb_helper, + dev->mode_config.max_width, + dev->mode_config.max_height); + /* + * we shouldn't end up with no modes here. + */ + if (count == 0) { + printf("No connectors reported connected with modes\n"); + } + drm_setup_crtcs(fb_helper); + + return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel); +} + +int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) +{ + struct drm_device *dev = fb_helper->dev; + int count = 0; + u32 max_width, max_height, bpp_sel; + bool bound = false, crtcs_bound = false; + struct drm_crtc *crtc; + + if (!fb_helper->fb) + return 0; + + sx_xlock(&dev->mode_config.mutex); + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + if (crtc->fb) + crtcs_bound = true; + if (crtc->fb == fb_helper->fb) + bound = true; + } + + if (!bound && crtcs_bound) { + fb_helper->delayed_hotplug = true; + sx_xunlock(&dev->mode_config.mutex); + return 0; + } + DRM_DEBUG_KMS("\n"); + + max_width = fb_helper->fb->width; + max_height = fb_helper->fb->height; + bpp_sel = fb_helper->fb->bits_per_pixel; + + count = drm_fb_helper_probe_connector_modes(fb_helper, max_width, + max_height); + drm_setup_crtcs(fb_helper); + sx_xunlock(&dev->mode_config.mutex); + + return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel); +} + diff --git a/sys/dev/drm2/drm_fb_helper.h b/sys/dev/drm2/drm_fb_helper.h new file mode 100644 index 00000000000..4b5ef85c2e8 --- /dev/null +++ b/sys/dev/drm2/drm_fb_helper.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2006-2009 Red Hat Inc. + * Copyright (c) 2006-2008 Intel Corporation + * Copyright (c) 2007 Dave Airlie + * + * DRM framebuffer helper functions + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + * + * Authors: + * Dave Airlie + * Jesse Barnes + * + * $FreeBSD$ + */ +#ifndef DRM_FB_HELPER_H +#define DRM_FB_HELPER_H + +struct drm_fb_helper; + +struct drm_fb_helper_crtc { + uint32_t crtc_id; + struct drm_mode_set mode_set; + struct drm_display_mode *desired_mode; +}; + +/* mode specified on the command line */ +struct drm_fb_helper_cmdline_mode { + bool specified; + bool refresh_specified; + bool bpp_specified; + int xres, yres; + int bpp; + int refresh; + bool rb; + bool interlace; + bool cvt; + bool margins; +}; + +struct drm_fb_helper_surface_size { + u32 fb_width; + u32 fb_height; + u32 surface_width; + u32 surface_height; + u32 surface_bpp; + u32 surface_depth; +}; + +struct drm_fb_helper_funcs { + void (*gamma_set)(struct drm_crtc *crtc, u16 red, u16 green, + u16 blue, int regno); + void (*gamma_get)(struct drm_crtc *crtc, u16 *red, u16 *green, + u16 *blue, int regno); + + int (*fb_probe)(struct drm_fb_helper *helper, + struct drm_fb_helper_surface_size *sizes); +}; + +struct drm_fb_helper_connector { + struct drm_fb_helper_cmdline_mode cmdline_mode; + struct drm_cmdline_mode cmdline_mode1; + struct drm_connector *connector; +}; + +struct drm_fb_helper { + struct drm_framebuffer *fb; + struct drm_framebuffer *saved_fb; + struct drm_device *dev; + struct drm_display_mode *mode; + int crtc_count; + struct drm_fb_helper_crtc *crtc_info; + int connector_count; + struct drm_fb_helper_connector **connector_info; + struct drm_fb_helper_funcs *funcs; + int conn_limit; + struct fb_info *fbdev; + u32 pseudo_palette[17]; + struct list_head kernel_fb_list; + + /* we got a hotplug but fbdev wasn't running the console + delay until next set_par */ + bool delayed_hotplug; +}; + +struct fb_var_screeninfo; +struct fb_cmap; + +int drm_fb_helper_single_fb_probe(struct drm_fb_helper *helper, + int preferred_bpp); + +int drm_fb_helper_init(struct drm_device *dev, + struct drm_fb_helper *helper, int crtc_count, + int max_conn); +void drm_fb_helper_fini(struct drm_fb_helper *helper); +int drm_fb_helper_blank(int blank, struct fb_info *info); +int drm_fb_helper_pan_display(struct fb_var_screeninfo *var, + struct fb_info *info); +int drm_fb_helper_set_par(struct fb_info *info); +int drm_fb_helper_check_var(struct fb_var_screeninfo *var, + struct fb_info *info); +int drm_fb_helper_setcolreg(unsigned regno, + unsigned red, + unsigned green, + unsigned blue, + unsigned transp, + struct fb_info *info); + +bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper); +void drm_fb_helper_restore(void); +void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper, + uint32_t fb_width, uint32_t fb_height); +void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, + uint32_t depth); + +int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info); + +int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper); +bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel); +int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper); +int drm_fb_helper_debug_enter(struct fb_info *info); +int drm_fb_helper_debug_leave(struct fb_info *info); +bool drm_fb_helper_force_kernel_mode(void); + +#endif diff --git a/sys/dev/drm2/drm_fops.c b/sys/dev/drm2/drm_fops.c new file mode 100644 index 00000000000..00717837041 --- /dev/null +++ b/sys/dev/drm2/drm_fops.c @@ -0,0 +1,202 @@ +/*- + * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith + * Daryll Strauss + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_fops.c + * Support code for dealing with the file privates associated with each + * open of the DRM device. + */ + +#include + +/* drm_open_helper is called whenever a process opens /dev/drm. */ +int drm_open_helper(struct cdev *kdev, int flags, int fmt, DRM_STRUCTPROC *p, + struct drm_device *dev) +{ + struct drm_file *priv; + int retcode; + + if (flags & O_EXCL) + return EBUSY; /* No exclusive opens */ + dev->flags = flags; + + DRM_DEBUG("pid = %d, device = %s\n", DRM_CURRENTPID, devtoname(kdev)); + + priv = malloc(sizeof(*priv), DRM_MEM_FILES, M_NOWAIT | M_ZERO); + if (priv == NULL) { + return ENOMEM; + } + + retcode = devfs_set_cdevpriv(priv, drm_close); + if (retcode != 0) { + free(priv, DRM_MEM_FILES); + return retcode; + } + + DRM_LOCK(dev); + priv->dev = dev; + priv->uid = p->td_ucred->cr_svuid; + priv->pid = p->td_proc->p_pid; + priv->ioctl_count = 0; + + /* for compatibility root is always authenticated */ + priv->authenticated = DRM_SUSER(p); + + INIT_LIST_HEAD(&priv->fbs); + INIT_LIST_HEAD(&priv->event_list); + priv->event_space = 4096; /* set aside 4k for event buffer */ + + if (dev->driver->driver_features & DRIVER_GEM) + drm_gem_open(dev, priv); + + if (dev->driver->open) { + /* shared code returns -errno */ + retcode = -dev->driver->open(dev, priv); + if (retcode != 0) { + devfs_clear_cdevpriv(); + free(priv, DRM_MEM_FILES); + DRM_UNLOCK(dev); + return retcode; + } + } + + /* first opener automatically becomes master */ + priv->master = TAILQ_EMPTY(&dev->files); + + TAILQ_INSERT_TAIL(&dev->files, priv, link); + DRM_UNLOCK(dev); + kdev->si_drv1 = dev; + return 0; +} + +static bool +drm_dequeue_event(struct drm_device *dev, struct drm_file *file_priv, + struct uio *uio, struct drm_pending_event **out) +{ + struct drm_pending_event *e; + + if (list_empty(&file_priv->event_list)) + return (false); + e = list_first_entry(&file_priv->event_list, + struct drm_pending_event, link); + if (e->event->length > uio->uio_resid) + return (false); + + file_priv->event_space += e->event->length; + list_del(&e->link); + *out = e; + return (true); +} + +int +drm_read(struct cdev *kdev, struct uio *uio, int ioflag) +{ + struct drm_file *file_priv; + struct drm_device *dev; + struct drm_pending_event *e; + int error; + + error = devfs_get_cdevpriv((void **)&file_priv); + if (error != 0) { + DRM_ERROR("can't find authenticator\n"); + return (EINVAL); + } + dev = drm_get_device_from_kdev(kdev); + mtx_lock(&dev->event_lock); + while (list_empty(&file_priv->event_list)) { + if ((ioflag & O_NONBLOCK) != 0) { + error = EAGAIN; + goto out; + } + error = msleep(&file_priv->event_space, &dev->event_lock, + PCATCH, "drmrea", 0); + if (error != 0) + goto out; + } + while (drm_dequeue_event(dev, file_priv, uio, &e)) { + mtx_unlock(&dev->event_lock); + error = uiomove(e->event, e->event->length, uio); + CTR3(KTR_DRM, "drm_event_dequeued %d %d %d", curproc->p_pid, + e->event->type, e->event->length); + e->destroy(e); + if (error != 0) + return (error); + mtx_lock(&dev->event_lock); + } +out: + mtx_unlock(&dev->event_lock); + return (error); +} + +void +drm_event_wakeup(struct drm_pending_event *e) +{ + struct drm_file *file_priv; + struct drm_device *dev; + + file_priv = e->file_priv; + dev = file_priv->dev; + mtx_assert(&dev->event_lock, MA_OWNED); + + wakeup(&file_priv->event_space); + selwakeup(&file_priv->event_poll); +} + +int +drm_poll(struct cdev *kdev, int events, struct thread *td) +{ + struct drm_file *file_priv; + struct drm_device *dev; + int error, revents; + + error = devfs_get_cdevpriv((void **)&file_priv); + if (error != 0) { + DRM_ERROR("can't find authenticator\n"); + return (EINVAL); + } + dev = drm_get_device_from_kdev(kdev); + + revents = 0; + mtx_lock(&dev->event_lock); + if ((events & (POLLIN | POLLRDNORM)) != 0) { + if (list_empty(&file_priv->event_list)) { + CTR0(KTR_DRM, "drm_poll empty list"); + selrecord(td, &file_priv->event_poll); + } else { + revents |= events & (POLLIN | POLLRDNORM); + CTR1(KTR_DRM, "drm_poll revents %x", revents); + } + } + mtx_unlock(&dev->event_lock); + return (revents); +} diff --git a/sys/dev/drm2/drm_fourcc.h b/sys/dev/drm2/drm_fourcc.h new file mode 100644 index 00000000000..0e871df25d5 --- /dev/null +++ b/sys/dev/drm2/drm_fourcc.h @@ -0,0 +1,139 @@ +/* + * Copyright 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef DRM_FOURCC_H +#define DRM_FOURCC_H + +#include + +#define fourcc_code(a, b, c, d) ((uint32_t)(a) | ((uint32_t)(b) << 8) | \ + ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24)) + +#define DRM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */ + +/* color index */ +#define DRM_FORMAT_C8 fourcc_code('C', '8', ' ', ' ') /* [7:0] C */ + +/* 8 bpp RGB */ +#define DRM_FORMAT_RGB332 fourcc_code('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */ +#define DRM_FORMAT_BGR233 fourcc_code('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */ + +/* 16 bpp RGB */ +#define DRM_FORMAT_XRGB4444 fourcc_code('X', 'R', '1', '2') /* [15:0] x:R:G:B 4:4:4:4 little endian */ +#define DRM_FORMAT_XBGR4444 fourcc_code('X', 'B', '1', '2') /* [15:0] x:B:G:R 4:4:4:4 little endian */ +#define DRM_FORMAT_RGBX4444 fourcc_code('R', 'X', '1', '2') /* [15:0] R:G:B:x 4:4:4:4 little endian */ +#define DRM_FORMAT_BGRX4444 fourcc_code('B', 'X', '1', '2') /* [15:0] B:G:R:x 4:4:4:4 little endian */ + +#define DRM_FORMAT_ARGB4444 fourcc_code('A', 'R', '1', '2') /* [15:0] A:R:G:B 4:4:4:4 little endian */ +#define DRM_FORMAT_ABGR4444 fourcc_code('A', 'B', '1', '2') /* [15:0] A:B:G:R 4:4:4:4 little endian */ +#define DRM_FORMAT_RGBA4444 fourcc_code('R', 'A', '1', '2') /* [15:0] R:G:B:A 4:4:4:4 little endian */ +#define DRM_FORMAT_BGRA4444 fourcc_code('B', 'A', '1', '2') /* [15:0] B:G:R:A 4:4:4:4 little endian */ + +#define DRM_FORMAT_XRGB1555 fourcc_code('X', 'R', '1', '5') /* [15:0] x:R:G:B 1:5:5:5 little endian */ +#define DRM_FORMAT_XBGR1555 fourcc_code('X', 'B', '1', '5') /* [15:0] x:B:G:R 1:5:5:5 little endian */ +#define DRM_FORMAT_RGBX5551 fourcc_code('R', 'X', '1', '5') /* [15:0] R:G:B:x 5:5:5:1 little endian */ +#define DRM_FORMAT_BGRX5551 fourcc_code('B', 'X', '1', '5') /* [15:0] B:G:R:x 5:5:5:1 little endian */ + +#define DRM_FORMAT_ARGB1555 fourcc_code('A', 'R', '1', '5') /* [15:0] A:R:G:B 1:5:5:5 little endian */ +#define DRM_FORMAT_ABGR1555 fourcc_code('A', 'B', '1', '5') /* [15:0] A:B:G:R 1:5:5:5 little endian */ +#define DRM_FORMAT_RGBA5551 fourcc_code('R', 'A', '1', '5') /* [15:0] R:G:B:A 5:5:5:1 little endian */ +#define DRM_FORMAT_BGRA5551 fourcc_code('B', 'A', '1', '5') /* [15:0] B:G:R:A 5:5:5:1 little endian */ + +#define DRM_FORMAT_RGB565 fourcc_code('R', 'G', '1', '6') /* [15:0] R:G:B 5:6:5 little endian */ +#define DRM_FORMAT_BGR565 fourcc_code('B', 'G', '1', '6') /* [15:0] B:G:R 5:6:5 little endian */ + +/* 24 bpp RGB */ +#define DRM_FORMAT_RGB888 fourcc_code('R', 'G', '2', '4') /* [23:0] R:G:B little endian */ +#define DRM_FORMAT_BGR888 fourcc_code('B', 'G', '2', '4') /* [23:0] B:G:R little endian */ + +/* 32 bpp RGB */ +#define DRM_FORMAT_XRGB8888 fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */ +#define DRM_FORMAT_XBGR8888 fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */ +#define DRM_FORMAT_RGBX8888 fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */ +#define DRM_FORMAT_BGRX8888 fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */ + +#define DRM_FORMAT_ARGB8888 fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */ +#define DRM_FORMAT_ABGR8888 fourcc_code('A', 'B', '2', '4') /* [31:0] A:B:G:R 8:8:8:8 little endian */ +#define DRM_FORMAT_RGBA8888 fourcc_code('R', 'A', '2', '4') /* [31:0] R:G:B:A 8:8:8:8 little endian */ +#define DRM_FORMAT_BGRA8888 fourcc_code('B', 'A', '2', '4') /* [31:0] B:G:R:A 8:8:8:8 little endian */ + +#define DRM_FORMAT_XRGB2101010 fourcc_code('X', 'R', '3', '0') /* [31:0] x:R:G:B 2:10:10:10 little endian */ +#define DRM_FORMAT_XBGR2101010 fourcc_code('X', 'B', '3', '0') /* [31:0] x:B:G:R 2:10:10:10 little endian */ +#define DRM_FORMAT_RGBX1010102 fourcc_code('R', 'X', '3', '0') /* [31:0] R:G:B:x 10:10:10:2 little endian */ +#define DRM_FORMAT_BGRX1010102 fourcc_code('B', 'X', '3', '0') /* [31:0] B:G:R:x 10:10:10:2 little endian */ + +#define DRM_FORMAT_ARGB2101010 fourcc_code('A', 'R', '3', '0') /* [31:0] A:R:G:B 2:10:10:10 little endian */ +#define DRM_FORMAT_ABGR2101010 fourcc_code('A', 'B', '3', '0') /* [31:0] A:B:G:R 2:10:10:10 little endian */ +#define DRM_FORMAT_RGBA1010102 fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */ +#define DRM_FORMAT_BGRA1010102 fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */ + +/* packed YCbCr */ +#define DRM_FORMAT_YUYV fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */ +#define DRM_FORMAT_YVYU fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */ +#define DRM_FORMAT_UYVY fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */ +#define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */ + +#define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */ + +/* + * 2 plane YCbCr + * index 0 = Y plane, [7:0] Y + * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian + * or + * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian + */ +#define DRM_FORMAT_NV12 fourcc_code('N', 'V', '1', '2') /* 2x2 subsampled Cr:Cb plane */ +#define DRM_FORMAT_NV21 fourcc_code('N', 'V', '2', '1') /* 2x2 subsampled Cb:Cr plane */ +#define DRM_FORMAT_NV16 fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */ +#define DRM_FORMAT_NV61 fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */ + +/* 2 non contiguous plane YCbCr */ +#define DRM_FORMAT_NV12M fourcc_code('N', 'M', '1', '2') /* 2x2 subsampled Cr:Cb plane */ +#define DRM_FORMAT_NV12MT fourcc_code('T', 'M', '1', '2') /* 2x2 subsampled Cr:Cb plane 64x32 macroblocks */ + +/* + * 3 plane YCbCr + * index 0: Y plane, [7:0] Y + * index 1: Cb plane, [7:0] Cb + * index 2: Cr plane, [7:0] Cr + * or + * index 1: Cr plane, [7:0] Cr + * index 2: Cb plane, [7:0] Cb + */ +#define DRM_FORMAT_YUV410 fourcc_code('Y', 'U', 'V', '9') /* 4x4 subsampled Cb (1) and Cr (2) planes */ +#define DRM_FORMAT_YVU410 fourcc_code('Y', 'V', 'U', '9') /* 4x4 subsampled Cr (1) and Cb (2) planes */ +#define DRM_FORMAT_YUV411 fourcc_code('Y', 'U', '1', '1') /* 4x1 subsampled Cb (1) and Cr (2) planes */ +#define DRM_FORMAT_YVU411 fourcc_code('Y', 'V', '1', '1') /* 4x1 subsampled Cr (1) and Cb (2) planes */ +#define DRM_FORMAT_YUV420 fourcc_code('Y', 'U', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */ +#define DRM_FORMAT_YVU420 fourcc_code('Y', 'V', '1', '2') /* 2x2 subsampled Cr (1) and Cb (2) planes */ +#define DRM_FORMAT_YUV422 fourcc_code('Y', 'U', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes */ +#define DRM_FORMAT_YVU422 fourcc_code('Y', 'V', '1', '6') /* 2x1 subsampled Cr (1) and Cb (2) planes */ +#define DRM_FORMAT_YUV444 fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */ +#define DRM_FORMAT_YVU444 fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */ + +/* 3 non contiguous plane YCbCr */ +#define DRM_FORMAT_YUV420M fourcc_code('Y', 'M', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */ + +#endif /* DRM_FOURCC_H */ diff --git a/sys/dev/drm2/drm_gem.c b/sys/dev/drm2/drm_gem.c new file mode 100644 index 00000000000..3401de88ee5 --- /dev/null +++ b/sys/dev/drm2/drm_gem.c @@ -0,0 +1,487 @@ +/*- + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Konstantin Belousov under sponsorship from + * the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_vm.h" + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +/* + * We make up offsets for buffer objects so we can recognize them at + * mmap time. + */ + +/* pgoff in mmap is an unsigned long, so we need to make sure that + * the faked up offset will fit + */ + +#if ULONG_MAX == UINT64_MAX +#define DRM_FILE_PAGE_OFFSET_START ((0xFFFFFFFFUL >> PAGE_SHIFT) + 1) +#define DRM_FILE_PAGE_OFFSET_SIZE ((0xFFFFFFFFUL >> PAGE_SHIFT) * 16) +#else +#define DRM_FILE_PAGE_OFFSET_START ((0xFFFFFFFUL >> PAGE_SHIFT) + 1) +#define DRM_FILE_PAGE_OFFSET_SIZE ((0xFFFFFFFUL >> PAGE_SHIFT) * 16) +#endif + +int +drm_gem_init(struct drm_device *dev) +{ + struct drm_gem_mm *mm; + + drm_gem_names_init(&dev->object_names); + mm = malloc(sizeof(*mm), DRM_MEM_DRIVER, M_WAITOK); + dev->mm_private = mm; + if (drm_ht_create(&mm->offset_hash, 19) != 0) { + free(mm, DRM_MEM_DRIVER); + return (ENOMEM); + } + mm->idxunr = new_unrhdr(0, DRM_GEM_MAX_IDX, NULL); + return (0); +} + +void +drm_gem_destroy(struct drm_device *dev) +{ + struct drm_gem_mm *mm; + + mm = dev->mm_private; + dev->mm_private = NULL; + drm_ht_remove(&mm->offset_hash); + delete_unrhdr(mm->idxunr); + free(mm, DRM_MEM_DRIVER); + drm_gem_names_fini(&dev->object_names); +} + +int +drm_gem_object_init(struct drm_device *dev, struct drm_gem_object *obj, + size_t size) +{ + + KASSERT((size & (PAGE_SIZE - 1)) == 0, + ("Bad size %ju", (uintmax_t)size)); + + obj->dev = dev; + obj->vm_obj = vm_pager_allocate(OBJT_DEFAULT, NULL, size, + VM_PROT_READ | VM_PROT_WRITE, 0, curthread->td_ucred); + + obj->refcount = 1; + obj->handle_count = 0; + obj->size = size; + + return (0); +} + +int +drm_gem_private_object_init(struct drm_device *dev, struct drm_gem_object *obj, + size_t size) +{ + + MPASS((size & (PAGE_SIZE - 1)) == 0); + + obj->dev = dev; + obj->vm_obj = NULL; + + obj->refcount = 1; + atomic_set(&obj->handle_count, 0); + obj->size = size; + + return (0); +} + + +struct drm_gem_object * +drm_gem_object_alloc(struct drm_device *dev, size_t size) +{ + struct drm_gem_object *obj; + + obj = malloc(sizeof(*obj), DRM_MEM_DRIVER, M_WAITOK | M_ZERO); + if (drm_gem_object_init(dev, obj, size) != 0) + goto free; + + if (dev->driver->gem_init_object != NULL && + dev->driver->gem_init_object(obj) != 0) + goto dealloc; + return (obj); +dealloc: + vm_object_deallocate(obj->vm_obj); +free: + free(obj, DRM_MEM_DRIVER); + return (NULL); +} + +void +drm_gem_object_free(struct drm_gem_object *obj) +{ + struct drm_device *dev; + + dev = obj->dev; + DRM_LOCK_ASSERT(dev); + if (dev->driver->gem_free_object != NULL) + dev->driver->gem_free_object(obj); +} + +void +drm_gem_object_reference(struct drm_gem_object *obj) +{ + + KASSERT(obj->refcount > 0, ("Dandling obj %p", obj)); + refcount_acquire(&obj->refcount); +} + +void +drm_gem_object_unreference(struct drm_gem_object *obj) +{ + + if (obj == NULL) + return; + if (refcount_release(&obj->refcount)) + drm_gem_object_free(obj); +} + +void +drm_gem_object_unreference_unlocked(struct drm_gem_object *obj) +{ + struct drm_device *dev; + + if (obj == NULL) + return; + dev = obj->dev; + DRM_LOCK(dev); + drm_gem_object_unreference(obj); + DRM_UNLOCK(dev); +} + +void +drm_gem_object_handle_reference(struct drm_gem_object *obj) +{ + + drm_gem_object_reference(obj); + atomic_add_rel_int(&obj->handle_count, 1); +} + +void +drm_gem_object_handle_free(struct drm_gem_object *obj) +{ + struct drm_device *dev; + struct drm_gem_object *obj1; + + dev = obj->dev; + if (obj->name != 0) { + obj1 = drm_gem_names_remove(&dev->object_names, obj->name); + obj->name = 0; + drm_gem_object_unreference(obj1); + } +} + +void +drm_gem_object_handle_unreference(struct drm_gem_object *obj) +{ + + if (obj == NULL || + atomic_load_acq_int(&obj->handle_count) == 0) + return; + + if (atomic_fetchadd_int(&obj->handle_count, -1) == 1) + drm_gem_object_handle_free(obj); + drm_gem_object_unreference(obj); +} + +void +drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj) +{ + + if (obj == NULL || + atomic_load_acq_int(&obj->handle_count) == 0) + return; + + if (atomic_fetchadd_int(&obj->handle_count, -1) == 1) + drm_gem_object_handle_free(obj); + drm_gem_object_unreference_unlocked(obj); +} + +int +drm_gem_handle_create(struct drm_file *file_priv, struct drm_gem_object *obj, + uint32_t *handle) +{ + int error; + + error = drm_gem_name_create(&file_priv->object_names, obj, handle); + if (error != 0) + return (error); + drm_gem_object_handle_reference(obj); + return (0); +} + +int +drm_gem_handle_delete(struct drm_file *file_priv, uint32_t handle) +{ + struct drm_gem_object *obj; + + obj = drm_gem_names_remove(&file_priv->object_names, handle); + if (obj == NULL) + return (EINVAL); + drm_gem_object_handle_unreference_unlocked(obj); + return (0); +} + +void +drm_gem_object_release(struct drm_gem_object *obj) +{ + + /* + * obj->vm_obj can be NULL for private gem objects. + */ + vm_object_deallocate(obj->vm_obj); +} + +int +drm_gem_open_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_gem_open *args; + struct drm_gem_object *obj; + int ret; + uint32_t handle; + + if (!drm_core_check_feature(dev, DRIVER_GEM)) + return (ENODEV); + args = data; + + obj = drm_gem_name_ref(&dev->object_names, args->name, + (void (*)(void *))drm_gem_object_reference); + if (obj == NULL) + return (ENOENT); + handle = 0; + ret = drm_gem_handle_create(file_priv, obj, &handle); + drm_gem_object_unreference_unlocked(obj); + if (ret != 0) + return (ret); + + args->handle = handle; + args->size = obj->size; + + return (0); +} + +void +drm_gem_open(struct drm_device *dev, struct drm_file *file_priv) +{ + + drm_gem_names_init(&file_priv->object_names); +} + +static int +drm_gem_object_release_handle(uint32_t name, void *ptr, void *arg) +{ + struct drm_gem_object *obj; + + obj = ptr; + drm_gem_object_handle_unreference(obj); + return (0); +} + +void +drm_gem_release(struct drm_device *dev, struct drm_file *file_priv) +{ + + drm_gem_names_foreach(&file_priv->object_names, + drm_gem_object_release_handle, NULL); + drm_gem_names_fini(&file_priv->object_names); +} + +int +drm_gem_close_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_gem_close *args; + + if (!drm_core_check_feature(dev, DRIVER_GEM)) + return (ENODEV); + args = data; + + return (drm_gem_handle_delete(file_priv, args->handle)); +} + +int +drm_gem_flink_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_gem_flink *args; + struct drm_gem_object *obj; + int error; + + if (!drm_core_check_feature(dev, DRIVER_GEM)) + return (ENODEV); + args = data; + + obj = drm_gem_name_ref(&file_priv->object_names, args->handle, + (void (*)(void *))drm_gem_object_reference); + if (obj == NULL) + return (ENOENT); + error = drm_gem_name_create(&dev->object_names, obj, &obj->name); + if (error != 0) { + if (error == EALREADY) + error = 0; + drm_gem_object_unreference_unlocked(obj); + } + if (error == 0) + args->name = obj->name; + return (error); +} + +struct drm_gem_object * +drm_gem_object_lookup(struct drm_device *dev, struct drm_file *file_priv, + uint32_t handle) +{ + struct drm_gem_object *obj; + + obj = drm_gem_name_ref(&file_priv->object_names, handle, + (void (*)(void *))drm_gem_object_reference); + return (obj); +} + +static struct drm_gem_object * +drm_gem_object_from_offset(struct drm_device *dev, vm_ooffset_t offset) +{ + struct drm_gem_object *obj; + struct drm_gem_mm *mm; + struct drm_hash_item *map_list; + + if ((offset & DRM_GEM_MAPPING_MASK) != DRM_GEM_MAPPING_KEY) + return (NULL); + offset &= ~DRM_GEM_MAPPING_KEY; + mm = dev->mm_private; + if (drm_ht_find_item(&mm->offset_hash, DRM_GEM_MAPPING_IDX(offset), + &map_list) != 0) { + DRM_DEBUG("drm_gem_object_from_offset: offset 0x%jx obj not found\n", + (uintmax_t)offset); + return (NULL); + } + obj = member2struct(drm_gem_object, map_list, map_list); + return (obj); +} + +int +drm_gem_create_mmap_offset(struct drm_gem_object *obj) +{ + struct drm_device *dev; + struct drm_gem_mm *mm; + int ret; + + if (obj->on_map) + return (0); + dev = obj->dev; + mm = dev->mm_private; + ret = 0; + + obj->map_list.key = alloc_unr(mm->idxunr); + ret = drm_ht_insert_item(&mm->offset_hash, &obj->map_list); + if (ret != 0) { + DRM_ERROR("failed to add to map hash\n"); + free_unr(mm->idxunr, obj->map_list.key); + return (ret); + } + obj->on_map = true; + return (0); +} + +void +drm_gem_free_mmap_offset(struct drm_gem_object *obj) +{ + struct drm_hash_item *list; + struct drm_gem_mm *mm; + + if (!obj->on_map) + return; + mm = obj->dev->mm_private; + list = &obj->map_list; + + drm_ht_remove_item(&mm->offset_hash, list); + free_unr(mm->idxunr, list->key); + obj->on_map = false; +} + +int +drm_gem_mmap_single(struct cdev *kdev, vm_ooffset_t *offset, vm_size_t size, + struct vm_object **obj_res, int nprot) +{ + struct drm_device *dev; + struct drm_gem_object *gem_obj; + struct vm_object *vm_obj; + + dev = drm_get_device_from_kdev(kdev); + if ((dev->driver->driver_features & DRIVER_GEM) == 0) + return (ENODEV); + DRM_LOCK(dev); + gem_obj = drm_gem_object_from_offset(dev, *offset); + if (gem_obj == NULL) { + DRM_UNLOCK(dev); + return (ENODEV); + } + drm_gem_object_reference(gem_obj); + DRM_UNLOCK(dev); + vm_obj = cdev_pager_allocate(gem_obj, OBJT_MGTDEVICE, + dev->driver->gem_pager_ops, size, nprot, + DRM_GEM_MAPPING_MAPOFF(*offset), curthread->td_ucred); + if (vm_obj == NULL) { + drm_gem_object_unreference_unlocked(gem_obj); + return (EINVAL); + } + *offset = DRM_GEM_MAPPING_MAPOFF(*offset); + *obj_res = vm_obj; + return (0); +} + +void +drm_gem_pager_dtr(void *handle) +{ + struct drm_gem_object *obj; + struct drm_device *dev; + + obj = handle; + dev = obj->dev; + + DRM_LOCK(dev); + drm_gem_free_mmap_offset(obj); + drm_gem_object_unreference(obj); + DRM_UNLOCK(dev); +} diff --git a/sys/dev/drm2/drm_gem_names.c b/sys/dev/drm2/drm_gem_names.c new file mode 100644 index 00000000000..2577d132206 --- /dev/null +++ b/sys/dev/drm2/drm_gem_names.c @@ -0,0 +1,211 @@ +/*- + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Konstantin Belousov under sponsorship from + * the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include + +MALLOC_DEFINE(M_GEM_NAMES, "gem_name", "Hash headers for the gem names"); + +static void drm_gem_names_delete_name(struct drm_gem_names *names, + struct drm_gem_name *np); + +void +drm_gem_names_init(struct drm_gem_names *names) +{ + + names->unr = new_unrhdr(1, INT_MAX, NULL); /* XXXKIB */ + names->names_hash = hashinit(1000 /* XXXKIB */, M_GEM_NAMES, + &names->hash_mask); + mtx_init(&names->lock, "drmnames", NULL, MTX_DEF); +} + +void +drm_gem_names_fini(struct drm_gem_names *names) +{ + struct drm_gem_name *np; + int i; + + mtx_lock(&names->lock); + for (i = 0; i <= names->hash_mask; i++) { + while ((np = LIST_FIRST(&names->names_hash[i])) != NULL) { + drm_gem_names_delete_name(names, np); + mtx_lock(&names->lock); + } + } + mtx_unlock(&names->lock); + mtx_destroy(&names->lock); + hashdestroy(names->names_hash, M_GEM_NAMES, names->hash_mask); + delete_unrhdr(names->unr); +} + +static struct drm_gem_names_head * +gem_name_hash_index(struct drm_gem_names *names, int name) +{ + + return (&names->names_hash[name & names->hash_mask]); +} + +void * +drm_gem_name_ref(struct drm_gem_names *names, uint32_t name, + void (*ref)(void *)) +{ + struct drm_gem_name *n; + + mtx_lock(&names->lock); + LIST_FOREACH(n, gem_name_hash_index(names, name), link) { + if (n->name == name) { + if (ref != NULL) + ref(n->ptr); + mtx_unlock(&names->lock); + return (n->ptr); + } + } + mtx_unlock(&names->lock); + return (NULL); +} + +struct drm_gem_ptr_match_arg { + uint32_t res; + void *ptr; +}; + +static int +drm_gem_ptr_match(uint32_t name, void *ptr, void *arg) +{ + struct drm_gem_ptr_match_arg *a; + + a = arg; + if (ptr == a->ptr) { + a->res = name; + return (1); + } else + return (0); +} + +uint32_t +drm_gem_find_name(struct drm_gem_names *names, void *ptr) +{ + struct drm_gem_ptr_match_arg arg; + + arg.res = 0; + arg.ptr = ptr; + drm_gem_names_foreach(names, drm_gem_ptr_match, &arg); + return (arg.res); +} + +int +drm_gem_name_create(struct drm_gem_names *names, void *p, uint32_t *name) +{ + struct drm_gem_name *np; + + np = malloc(sizeof(struct drm_gem_name), M_GEM_NAMES, M_WAITOK); + mtx_lock(&names->lock); + if (*name != 0) { + mtx_unlock(&names->lock); + return (EALREADY); + } + np->name = alloc_unr(names->unr); + if (np->name == -1) { + mtx_unlock(&names->lock); + free(np, M_GEM_NAMES); + return (ENOMEM); + } + *name = np->name; + np->ptr = p; + LIST_INSERT_HEAD(gem_name_hash_index(names, np->name), np, link); + mtx_unlock(&names->lock); + return (0); +} + +static void +drm_gem_names_delete_name(struct drm_gem_names *names, struct drm_gem_name *np) +{ + + mtx_assert(&names->lock, MA_OWNED); + LIST_REMOVE(np, link); + mtx_unlock(&names->lock); + free_unr(names->unr, np->name); + free(np, M_GEM_NAMES); +} + +void * +drm_gem_names_remove(struct drm_gem_names *names, uint32_t name) +{ + struct drm_gem_name *n; + void *res; + + mtx_lock(&names->lock); + LIST_FOREACH(n, gem_name_hash_index(names, name), link) { + if (n->name == name) { + res = n->ptr; + drm_gem_names_delete_name(names, n); + return (res); + } + } + mtx_unlock(&names->lock); + return (NULL); +} + +void +drm_gem_names_foreach(struct drm_gem_names *names, + int (*f)(uint32_t, void *, void *), void *arg) +{ + struct drm_gem_name *np; + struct drm_gem_name marker; + int i, fres; + + bzero(&marker, sizeof(marker)); + marker.name = -1; + mtx_lock(&names->lock); + for (i = 0; i <= names->hash_mask; i++) { + for (np = LIST_FIRST(&names->names_hash[i]); np != NULL; ) { + if (np->name == -1) { + np = LIST_NEXT(np, link); + continue; + } + LIST_INSERT_AFTER(np, &marker, link); + mtx_unlock(&names->lock); + fres = f(np->name, np->ptr, arg); + mtx_lock(&names->lock); + np = LIST_NEXT(&marker, link); + LIST_REMOVE(&marker, link); + if (fres) + break; + } + } + mtx_unlock(&names->lock); +} diff --git a/sys/dev/drm2/drm_gem_names.h b/sys/dev/drm2/drm_gem_names.h new file mode 100644 index 00000000000..0fe4edd9921 --- /dev/null +++ b/sys/dev/drm2/drm_gem_names.h @@ -0,0 +1,64 @@ +/*- + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Konstantin Belousov under sponsorship from + * the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + * + */ + +#ifndef DRM_GEM_NAMES_H +#define DRM_GEM_NAMES_H + +#include +#include +#include +#include + +struct drm_gem_name { + uint32_t name; + void *ptr; + LIST_ENTRY(drm_gem_name) link; +}; + +struct drm_gem_names { + struct mtx lock; + LIST_HEAD(drm_gem_names_head, drm_gem_name) *names_hash; + u_long hash_mask; + struct unrhdr *unr; +}; + +void drm_gem_names_init(struct drm_gem_names *names); +void drm_gem_names_fini(struct drm_gem_names *names); +uint32_t drm_gem_find_name(struct drm_gem_names *names, void *ptr); +void *drm_gem_name_ref(struct drm_gem_names *names, uint32_t name, + void (*ref)(void *)); +int drm_gem_name_create(struct drm_gem_names *names, void *obj, uint32_t *name); +void drm_gem_names_foreach(struct drm_gem_names *names, + int (*f)(uint32_t, void *, void *), void *arg); +void *drm_gem_names_remove(struct drm_gem_names *names, uint32_t name); + +#endif diff --git a/sys/dev/drm2/drm_hashtab.c b/sys/dev/drm2/drm_hashtab.c new file mode 100644 index 00000000000..8536fb89a86 --- /dev/null +++ b/sys/dev/drm2/drm_hashtab.c @@ -0,0 +1,181 @@ +/************************************************************************** + * + * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND. USA. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + **************************************************************************/ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Simple open hash tab implementation. + * + * Authors: + * Thomas Hellström + */ + +#include +#include + +#include + +int drm_ht_create(struct drm_open_hash *ht, unsigned int order) +{ + ht->size = 1 << order; + ht->order = order; + ht->table = NULL; + ht->table = hashinit_flags(ht->size, DRM_MEM_HASHTAB, &ht->mask, + HASH_NOWAIT); + if (!ht->table) { + DRM_ERROR("Out of memory for hash table\n"); + return -ENOMEM; + } + return 0; +} + +void drm_ht_verbose_list(struct drm_open_hash *ht, unsigned long key) +{ + struct drm_hash_item *entry; + struct drm_hash_item_list *h_list; + unsigned int hashed_key; + int count = 0; + + hashed_key = hash32_buf(&key, sizeof(key), ht->order); + DRM_DEBUG("Key is 0x%08lx, Hashed key is 0x%08x\n", key, hashed_key); + h_list = &ht->table[hashed_key & ht->mask]; + LIST_FOREACH(entry, h_list, head) + DRM_DEBUG("count %d, key: 0x%08lx\n", count++, entry->key); +} + +static struct drm_hash_item * +drm_ht_find_key(struct drm_open_hash *ht, unsigned long key) +{ + struct drm_hash_item *entry; + struct drm_hash_item_list *h_list; + unsigned int hashed_key; + + hashed_key = hash32_buf(&key, sizeof(key), ht->order); + h_list = &ht->table[hashed_key & ht->mask]; + LIST_FOREACH(entry, h_list, head) { + if (entry->key == key) + return entry; + if (entry->key > key) + break; + } + return NULL; +} + + +int drm_ht_insert_item(struct drm_open_hash *ht, struct drm_hash_item *item) +{ + struct drm_hash_item *entry, *parent; + struct drm_hash_item_list *h_list; + unsigned int hashed_key; + unsigned long key = item->key; + + hashed_key = hash32_buf(&key, sizeof(key), ht->order); + h_list = &ht->table[hashed_key & ht->mask]; + parent = NULL; + LIST_FOREACH(entry, h_list, head) { + if (entry->key == key) + return -EINVAL; + if (entry->key > key) + break; + parent = entry; + } + if (parent) { + LIST_INSERT_AFTER(parent, item, head); + } else { + LIST_INSERT_HEAD(h_list, item, head); + } + return 0; +} + +/* + * Just insert an item and return any "bits" bit key that hasn't been + * used before. + */ +int drm_ht_just_insert_please(struct drm_open_hash *ht, struct drm_hash_item *item, + unsigned long seed, int bits, int shift, + unsigned long add) +{ + int ret; + unsigned long mask = (1 << bits) - 1; + unsigned long first, unshifted_key = 0; + + unshifted_key = hash32_buf(&seed, sizeof(seed), unshifted_key); + first = unshifted_key; + do { + item->key = (unshifted_key << shift) + add; + ret = drm_ht_insert_item(ht, item); + if (ret) + unshifted_key = (unshifted_key + 1) & mask; + } while(ret && (unshifted_key != first)); + + if (ret) { + DRM_ERROR("Available key bit space exhausted\n"); + return -EINVAL; + } + return 0; +} + +int drm_ht_find_item(struct drm_open_hash *ht, unsigned long key, + struct drm_hash_item **item) +{ + struct drm_hash_item *entry; + + entry = drm_ht_find_key(ht, key); + if (!entry) + return -EINVAL; + + *item = entry; + return 0; +} + +int drm_ht_remove_key(struct drm_open_hash *ht, unsigned long key) +{ + struct drm_hash_item *entry; + + entry = drm_ht_find_key(ht, key); + if (entry) { + LIST_REMOVE(entry, head); + return 0; + } + return -EINVAL; +} + +int drm_ht_remove_item(struct drm_open_hash *ht, struct drm_hash_item *item) +{ + LIST_REMOVE(item, head); + return 0; +} + +void drm_ht_remove(struct drm_open_hash *ht) +{ + if (ht->table) { + hashdestroy(ht->table, DRM_MEM_HASHTAB, ht->mask); + ht->table = NULL; + } +} diff --git a/sys/dev/drm2/drm_hashtab.h b/sys/dev/drm2/drm_hashtab.h new file mode 100644 index 00000000000..fc200b5223e --- /dev/null +++ b/sys/dev/drm2/drm_hashtab.h @@ -0,0 +1,68 @@ +/************************************************************************** + * + * Copyright 2006 Tungsten Graphics, Inc., Bismack, ND. USA. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + **************************************************************************/ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Simple open hash tab implementation. + * + * Authors: + * Thomas Hellström + */ + +#ifndef DRM_HASHTAB_H +#define DRM_HASHTAB_H + +#define drm_hash_entry(_ptr, _type, _member) container_of(_ptr, _type, _member) + +struct drm_hash_item { + LIST_ENTRY(drm_hash_item) head; + unsigned long key; +}; + +struct drm_open_hash { + LIST_HEAD(drm_hash_item_list, drm_hash_item) *table; + unsigned int size; + unsigned int order; + unsigned long mask; +}; + +extern int drm_ht_create(struct drm_open_hash *ht, unsigned int order); +extern int drm_ht_insert_item(struct drm_open_hash *ht, struct drm_hash_item *item); +extern int drm_ht_just_insert_please(struct drm_open_hash *ht, struct drm_hash_item *item, + unsigned long seed, int bits, int shift, + unsigned long add); +extern int drm_ht_find_item(struct drm_open_hash *ht, unsigned long key, struct drm_hash_item **item); + +extern void drm_ht_verbose_list(struct drm_open_hash *ht, unsigned long key); +extern int drm_ht_remove_key(struct drm_open_hash *ht, unsigned long key); +extern int drm_ht_remove_item(struct drm_open_hash *ht, struct drm_hash_item *item); +extern void drm_ht_remove(struct drm_open_hash *ht); + +#endif diff --git a/sys/dev/drm2/drm_internal.h b/sys/dev/drm2/drm_internal.h new file mode 100644 index 00000000000..0ed1b6f78ee --- /dev/null +++ b/sys/dev/drm2/drm_internal.h @@ -0,0 +1,43 @@ +/*- + * Copyright 2007 Red Hat, Inc + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* This header file holds function prototypes and data types that are + * internal to the drm (not exported to user space) but shared across + * drivers and platforms */ + +#ifndef __DRM_INTERNAL_H__ +#define __DRM_INTERNAL_H__ + +/** + * Drawable information. + */ +struct drm_drawable_info { + unsigned int num_rects; + struct drm_clip_rect *rects; +}; + +#endif diff --git a/sys/dev/drm2/drm_ioctl.c b/sys/dev/drm2/drm_ioctl.c new file mode 100644 index 00000000000..b2c7affc593 --- /dev/null +++ b/sys/dev/drm2/drm_ioctl.c @@ -0,0 +1,320 @@ +/*- + * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_ioctl.c + * Varios minor DRM ioctls not applicable to other files, such as versioning + * information and reporting DRM information to userland. + */ + +#include + +/* + * Beginning in revision 1.1 of the DRM interface, getunique will return + * a unique in the form pci:oooo:bb:dd.f (o=domain, b=bus, d=device, f=function) + * before setunique has been called. The format for the bus-specific part of + * the unique is not defined for any other bus. + */ +int drm_getunique(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_unique *u = data; + + if (u->unique_len >= dev->unique_len) { + if (DRM_COPY_TO_USER(u->unique, dev->unique, dev->unique_len)) + return EFAULT; + } + u->unique_len = dev->unique_len; + + return 0; +} + +/* Deprecated in DRM version 1.1, and will return EBUSY when setversion has + * requested version 1.1 or greater. + */ +int drm_setunique(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_unique *u = data; + int domain, bus, slot, func, ret; + char *busid; + + /* Check and copy in the submitted Bus ID */ + if (!u->unique_len || u->unique_len > 1024) + return EINVAL; + + busid = malloc(u->unique_len + 1, DRM_MEM_DRIVER, M_WAITOK); + if (busid == NULL) + return ENOMEM; + + if (DRM_COPY_FROM_USER(busid, u->unique, u->unique_len)) { + free(busid, DRM_MEM_DRIVER); + return EFAULT; + } + busid[u->unique_len] = '\0'; + + /* Return error if the busid submitted doesn't match the device's actual + * busid. + */ + ret = sscanf(busid, "PCI:%d:%d:%d", &bus, &slot, &func); + if (ret != 3) { + free(busid, DRM_MEM_DRIVER); + return EINVAL; + } + domain = bus >> 8; + bus &= 0xff; + + if ((domain != dev->pci_domain) || + (bus != dev->pci_bus) || + (slot != dev->pci_slot) || + (func != dev->pci_func)) { + free(busid, DRM_MEM_DRIVER); + return EINVAL; + } + + /* Actually set the device's busid now. */ + DRM_LOCK(dev); + if (dev->unique_len || dev->unique) { + DRM_UNLOCK(dev); + return EBUSY; + } + + dev->unique_len = u->unique_len; + dev->unique = busid; + DRM_UNLOCK(dev); + + return 0; +} + + +static int +drm_set_busid(struct drm_device *dev) +{ + + DRM_LOCK(dev); + + if (dev->unique != NULL) { + DRM_UNLOCK(dev); + return EBUSY; + } + + dev->unique_len = 20; + dev->unique = malloc(dev->unique_len + 1, DRM_MEM_DRIVER, M_NOWAIT); + if (dev->unique == NULL) { + DRM_UNLOCK(dev); + return ENOMEM; + } + + snprintf(dev->unique, dev->unique_len, "pci:%04x:%02x:%02x.%1x", + dev->pci_domain, dev->pci_bus, dev->pci_slot, dev->pci_func); + + DRM_UNLOCK(dev); + + return 0; +} + +int drm_getmap(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_map *map = data; + drm_local_map_t *mapinlist; + int idx; + int i = 0; + + idx = map->offset; + + DRM_LOCK(dev); + if (idx < 0) { + DRM_UNLOCK(dev); + return EINVAL; + } + + TAILQ_FOREACH(mapinlist, &dev->maplist, link) { + if (i == idx) { + map->offset = mapinlist->offset; + map->size = mapinlist->size; + map->type = mapinlist->type; + map->flags = mapinlist->flags; + map->handle = mapinlist->handle; + map->mtrr = mapinlist->mtrr; + break; + } + i++; + } + + DRM_UNLOCK(dev); + + if (mapinlist == NULL) + return EINVAL; + + return 0; +} + +int drm_getclient(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_client *client = data; + struct drm_file *pt; + int idx; + int i = 0; + + idx = client->idx; + DRM_LOCK(dev); + TAILQ_FOREACH(pt, &dev->files, link) { + if (i == idx) { + client->auth = pt->authenticated; + client->pid = pt->pid; + client->uid = pt->uid; + client->magic = pt->magic; + client->iocs = pt->ioctl_count; + DRM_UNLOCK(dev); + return 0; + } + i++; + } + DRM_UNLOCK(dev); + + return EINVAL; +} + +int drm_getstats(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_stats *stats = data; + int i; + + memset(stats, 0, sizeof(struct drm_stats)); + + DRM_LOCK(dev); + + for (i = 0; i < dev->counters; i++) { + if (dev->types[i] == _DRM_STAT_LOCK) + stats->data[i].value = + (dev->lock.hw_lock ? dev->lock.hw_lock->lock : 0); + else + stats->data[i].value = atomic_read(&dev->counts[i]); + stats->data[i].type = dev->types[i]; + } + + stats->count = dev->counters; + + DRM_UNLOCK(dev); + + return 0; +} + +int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_get_cap *req = data; + + req->value = 0; + switch (req->capability) { + case DRM_CAP_DUMB_BUFFER: + if (dev->driver->dumb_create) + req->value = 1; + break; + case DRM_CAP_VBLANK_HIGH_CRTC: + req->value = 1; + break; + case DRM_CAP_DUMB_PREFERRED_DEPTH: + req->value = dev->mode_config.preferred_depth; + break; + case DRM_CAP_DUMB_PREFER_SHADOW: + req->value = dev->mode_config.prefer_shadow; + break; + default: + return EINVAL; + } + return 0; +} + + +#define DRM_IF_MAJOR 1 +#define DRM_IF_MINOR 2 + +int drm_setversion(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_set_version *sv = data; + struct drm_set_version ver; + int if_version; + + /* Save the incoming data, and set the response before continuing + * any further. + */ + ver = *sv; + sv->drm_di_major = DRM_IF_MAJOR; + sv->drm_di_minor = DRM_IF_MINOR; + sv->drm_dd_major = dev->driver->major; + sv->drm_dd_minor = dev->driver->minor; + + DRM_DEBUG("ver.drm_di_major %d ver.drm_di_minor %d " + "ver.drm_dd_major %d ver.drm_dd_minor %d\n", + ver.drm_di_major, ver.drm_di_minor, ver.drm_dd_major, + ver.drm_dd_minor); + DRM_DEBUG("sv->drm_di_major %d sv->drm_di_minor %d " + "sv->drm_dd_major %d sv->drm_dd_minor %d\n", + sv->drm_di_major, sv->drm_di_minor, sv->drm_dd_major, + sv->drm_dd_minor); + + if (ver.drm_di_major != -1) { + if (ver.drm_di_major != DRM_IF_MAJOR || + ver.drm_di_minor < 0 || ver.drm_di_minor > DRM_IF_MINOR) { + return EINVAL; + } + if_version = DRM_IF_VERSION(ver.drm_di_major, + ver.drm_dd_minor); + dev->if_version = DRM_MAX(if_version, dev->if_version); + if (ver.drm_di_minor >= 1) { + /* + * Version 1.1 includes tying of DRM to specific device + */ + drm_set_busid(dev); + } + } + + if (ver.drm_dd_major != -1) { + if (ver.drm_dd_major != dev->driver->major || + ver.drm_dd_minor < 0 || + ver.drm_dd_minor > dev->driver->minor) + { + return EINVAL; + } + } + + return 0; +} + + +int drm_noop(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + DRM_DEBUG("\n"); + return 0; +} diff --git a/sys/dev/drm2/drm_irq.c b/sys/dev/drm2/drm_irq.c new file mode 100644 index 00000000000..0324e8cff1a --- /dev/null +++ b/sys/dev/drm2/drm_irq.c @@ -0,0 +1,1253 @@ +/*- + * Copyright 2003 Eric Anholt + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * ERIC ANHOLT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_irq.c + * Support code for handling setup/teardown of interrupt handlers and + * handing interrupt handlers off to the drivers. + */ + +#include +#include + +MALLOC_DEFINE(DRM_MEM_VBLANK, "drm_vblank", "DRM VBLANK Handling Data"); + +/* Access macro for slots in vblank timestamp ringbuffer. */ +#define vblanktimestamp(dev, crtc, count) ( \ + (dev)->_vblank_time[(crtc) * DRM_VBLANKTIME_RBSIZE + \ + ((count) % DRM_VBLANKTIME_RBSIZE)]) + +/* Retry timestamp calculation up to 3 times to satisfy + * drm_timestamp_precision before giving up. + */ +#define DRM_TIMESTAMP_MAXRETRIES 3 + +/* Threshold in nanoseconds for detection of redundant + * vblank irq in drm_handle_vblank(). 1 msec should be ok. + */ +#define DRM_REDUNDANT_VBLIRQ_THRESH_NS 1000000 + +int drm_irq_by_busid(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_irq_busid *irq = data; + + if ((irq->busnum >> 8) != dev->pci_domain || + (irq->busnum & 0xff) != dev->pci_bus || + irq->devnum != dev->pci_slot || + irq->funcnum != dev->pci_func) + return EINVAL; + + irq->irq = dev->irq; + + DRM_DEBUG("%d:%d:%d => IRQ %d\n", + irq->busnum, irq->devnum, irq->funcnum, irq->irq); + + return 0; +} + +static void +drm_irq_handler_wrap(void *arg) +{ + struct drm_device *dev = arg; + + mtx_lock(&dev->irq_lock); + dev->driver->irq_handler(arg); + mtx_unlock(&dev->irq_lock); +} + +int +drm_irq_install(struct drm_device *dev) +{ + int retcode; + + if (dev->irq == 0 || dev->dev_private == NULL) + return (EINVAL); + + DRM_DEBUG("irq=%d\n", dev->irq); + + DRM_LOCK(dev); + if (dev->irq_enabled) { + DRM_UNLOCK(dev); + return EBUSY; + } + dev->irq_enabled = 1; + + dev->context_flag = 0; + + /* Before installing handler */ + if (dev->driver->irq_preinstall) + dev->driver->irq_preinstall(dev); + DRM_UNLOCK(dev); + + /* Install handler */ + retcode = bus_setup_intr(dev->device, dev->irqr, + INTR_TYPE_TTY | INTR_MPSAFE, NULL, + (dev->driver->driver_features & DRIVER_LOCKLESS_IRQ) != 0 ? + drm_irq_handler_wrap : dev->driver->irq_handler, + dev, &dev->irqh); + if (retcode != 0) + goto err; + + /* After installing handler */ + DRM_LOCK(dev); + if (dev->driver->irq_postinstall) + dev->driver->irq_postinstall(dev); + DRM_UNLOCK(dev); + + return (0); +err: + device_printf(dev->device, "Error setting interrupt: %d\n", retcode); + dev->irq_enabled = 0; + + return (retcode); +} + +int drm_irq_uninstall(struct drm_device *dev) +{ + int i; + + if (!dev->irq_enabled) + return EINVAL; + + dev->irq_enabled = 0; + + /* + * Wake up any waiters so they don't hang. + */ + if (dev->num_crtcs) { + mtx_lock(&dev->vbl_lock); + for (i = 0; i < dev->num_crtcs; i++) { + wakeup(&dev->_vblank_count[i]); + dev->vblank_enabled[i] = 0; + dev->last_vblank[i] = + dev->driver->get_vblank_counter(dev, i); + } + mtx_unlock(&dev->vbl_lock); + } + + DRM_DEBUG("irq=%d\n", dev->irq); + + if (dev->driver->irq_uninstall) + dev->driver->irq_uninstall(dev); + + DRM_UNLOCK(dev); + bus_teardown_intr(dev->device, dev->irqr, dev->irqh); + DRM_LOCK(dev); + + return 0; +} + +int drm_control(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_control *ctl = data; + int err; + + switch (ctl->func) { + case DRM_INST_HANDLER: + /* Handle drivers whose DRM used to require IRQ setup but the + * no longer does. + */ + if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) + return 0; + if (drm_core_check_feature(dev, DRIVER_MODESET)) + return 0; + if (dev->if_version < DRM_IF_VERSION(1, 2) && + ctl->irq != dev->irq) + return EINVAL; + return drm_irq_install(dev); + case DRM_UNINST_HANDLER: + if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) + return 0; + if (drm_core_check_feature(dev, DRIVER_MODESET)) + return 0; + DRM_LOCK(dev); + err = drm_irq_uninstall(dev); + DRM_UNLOCK(dev); + return err; + default: + return EINVAL; + } +} + +#define NSEC_PER_USEC 1000L +#define NSEC_PER_SEC 1000000000L + +int64_t +timeval_to_ns(const struct timeval *tv) +{ + return ((int64_t)tv->tv_sec * NSEC_PER_SEC) + + tv->tv_usec * NSEC_PER_USEC; +} + +struct timeval +ns_to_timeval(const int64_t nsec) +{ + struct timeval tv; + uint32_t rem; + + if (nsec == 0) { + tv.tv_sec = 0; + tv.tv_usec = 0; + return (tv); + } + + tv.tv_sec = nsec / NSEC_PER_SEC; + rem = nsec % NSEC_PER_SEC; + if (rem < 0) { + tv.tv_sec--; + rem += NSEC_PER_SEC; + } + tv.tv_usec = rem / 1000; + return (tv); +} + +/* + * Clear vblank timestamp buffer for a crtc. + */ +static void clear_vblank_timestamps(struct drm_device *dev, int crtc) +{ + memset(&dev->_vblank_time[crtc * DRM_VBLANKTIME_RBSIZE], 0, + DRM_VBLANKTIME_RBSIZE * sizeof(struct timeval)); +} + +static int64_t +abs64(int64_t x) +{ + + return (x < 0 ? -x : x); +} + +/* + * Disable vblank irq's on crtc, make sure that last vblank count + * of hardware and corresponding consistent software vblank counter + * are preserved, even if there are any spurious vblank irq's after + * disable. + */ +static void vblank_disable_and_save(struct drm_device *dev, int crtc) +{ + u32 vblcount; + int64_t diff_ns; + int vblrc; + struct timeval tvblank; + + /* Prevent vblank irq processing while disabling vblank irqs, + * so no updates of timestamps or count can happen after we've + * disabled. Needed to prevent races in case of delayed irq's. + */ + mtx_lock(&dev->vblank_time_lock); + + dev->driver->disable_vblank(dev, crtc); + dev->vblank_enabled[crtc] = 0; + + /* No further vblank irq's will be processed after + * this point. Get current hardware vblank count and + * vblank timestamp, repeat until they are consistent. + * + * FIXME: There is still a race condition here and in + * drm_update_vblank_count() which can cause off-by-one + * reinitialization of software vblank counter. If gpu + * vblank counter doesn't increment exactly at the leading + * edge of a vblank interval, then we can lose 1 count if + * we happen to execute between start of vblank and the + * delayed gpu counter increment. + */ + do { + dev->last_vblank[crtc] = dev->driver->get_vblank_counter(dev, crtc); + vblrc = drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0); + } while (dev->last_vblank[crtc] != dev->driver->get_vblank_counter(dev, crtc)); + + /* Compute time difference to stored timestamp of last vblank + * as updated by last invocation of drm_handle_vblank() in vblank irq. + */ + vblcount = atomic_read(&dev->_vblank_count[crtc]); + diff_ns = timeval_to_ns(&tvblank) - + timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount)); + + /* If there is at least 1 msec difference between the last stored + * timestamp and tvblank, then we are currently executing our + * disable inside a new vblank interval, the tvblank timestamp + * corresponds to this new vblank interval and the irq handler + * for this vblank didn't run yet and won't run due to our disable. + * Therefore we need to do the job of drm_handle_vblank() and + * increment the vblank counter by one to account for this vblank. + * + * Skip this step if there isn't any high precision timestamp + * available. In that case we can't account for this and just + * hope for the best. + */ + if ((vblrc > 0) && (abs64(diff_ns) > 1000000)) { + atomic_inc(&dev->_vblank_count[crtc]); + } + + /* Invalidate all timestamps while vblank irq's are off. */ + clear_vblank_timestamps(dev, crtc); + + mtx_unlock(&dev->vblank_time_lock); +} + +static void vblank_disable_fn(void * arg) +{ + struct drm_device *dev = (struct drm_device *)arg; + int i; + + if (!dev->vblank_disable_allowed) + return; + + for (i = 0; i < dev->num_crtcs; i++) { + mtx_lock(&dev->vbl_lock); + if (atomic_read(&dev->vblank_refcount[i]) == 0 && + dev->vblank_enabled[i]) { + DRM_DEBUG("disabling vblank on crtc %d\n", i); + vblank_disable_and_save(dev, i); + } + mtx_unlock(&dev->vbl_lock); + } +} + +void drm_vblank_cleanup(struct drm_device *dev) +{ + /* Bail if the driver didn't call drm_vblank_init() */ + if (dev->num_crtcs == 0) + return; + + callout_stop(&dev->vblank_disable_callout); + + vblank_disable_fn(dev); + + free(dev->_vblank_count, DRM_MEM_VBLANK); + free(dev->vblank_refcount, DRM_MEM_VBLANK); + free(dev->vblank_enabled, DRM_MEM_VBLANK); + free(dev->last_vblank, DRM_MEM_VBLANK); + free(dev->last_vblank_wait, DRM_MEM_VBLANK); + free(dev->vblank_inmodeset, DRM_MEM_VBLANK); + free(dev->_vblank_time, DRM_MEM_VBLANK); + + dev->num_crtcs = 0; +} + +int drm_vblank_init(struct drm_device *dev, int num_crtcs) +{ + int i; + + callout_init(&dev->vblank_disable_callout, CALLOUT_MPSAFE); +#if 0 + mtx_init(&dev->vbl_lock, "drmvbl", NULL, MTX_DEF); +#endif + mtx_init(&dev->vblank_time_lock, "drmvtl", NULL, MTX_DEF); + + dev->num_crtcs = num_crtcs; + + dev->_vblank_count = malloc(sizeof(atomic_t) * num_crtcs, + DRM_MEM_VBLANK, M_WAITOK); + dev->vblank_refcount = malloc(sizeof(atomic_t) * num_crtcs, + DRM_MEM_VBLANK, M_WAITOK); + dev->vblank_enabled = malloc(num_crtcs * sizeof(int), + DRM_MEM_VBLANK, M_WAITOK | M_ZERO); + dev->last_vblank = malloc(num_crtcs * sizeof(u32), + DRM_MEM_VBLANK, M_WAITOK | M_ZERO); + dev->last_vblank_wait = malloc(num_crtcs * sizeof(u32), + DRM_MEM_VBLANK, M_WAITOK | M_ZERO); + dev->vblank_inmodeset = malloc(num_crtcs * sizeof(int), + DRM_MEM_VBLANK, M_WAITOK | M_ZERO); + dev->_vblank_time = malloc(num_crtcs * DRM_VBLANKTIME_RBSIZE * + sizeof(struct timeval), DRM_MEM_VBLANK, M_WAITOK | M_ZERO); + DRM_INFO("Supports vblank timestamp caching Rev 1 (10.10.2010).\n"); + + /* Driver specific high-precision vblank timestamping supported? */ + if (dev->driver->get_vblank_timestamp) + DRM_INFO("Driver supports precise vblank timestamp query.\n"); + else + DRM_INFO("No driver support for vblank timestamp query.\n"); + + /* Zero per-crtc vblank stuff */ + for (i = 0; i < num_crtcs; i++) { + atomic_set(&dev->_vblank_count[i], 0); + atomic_set(&dev->vblank_refcount[i], 0); + } + + dev->vblank_disable_allowed = 0; + return 0; +} + +void +drm_calc_timestamping_constants(struct drm_crtc *crtc) +{ + int64_t linedur_ns = 0, pixeldur_ns = 0, framedur_ns = 0; + uint64_t dotclock; + + /* Dot clock in Hz: */ + dotclock = (uint64_t) crtc->hwmode.clock * 1000; + + /* Fields of interlaced scanout modes are only halve a frame duration. + * Double the dotclock to get halve the frame-/line-/pixelduration. + */ + if (crtc->hwmode.flags & DRM_MODE_FLAG_INTERLACE) + dotclock *= 2; + + /* Valid dotclock? */ + if (dotclock > 0) { + /* Convert scanline length in pixels and video dot clock to + * line duration, frame duration and pixel duration in + * nanoseconds: + */ + pixeldur_ns = (int64_t)1000000000 / dotclock; + linedur_ns = ((uint64_t)crtc->hwmode.crtc_htotal * + 1000000000) / dotclock; + framedur_ns = (int64_t)crtc->hwmode.crtc_vtotal * linedur_ns; + } else + DRM_ERROR("crtc %d: Can't calculate constants, dotclock = 0!\n", + crtc->base.id); + + crtc->pixeldur_ns = pixeldur_ns; + crtc->linedur_ns = linedur_ns; + crtc->framedur_ns = framedur_ns; + + DRM_DEBUG("crtc %d: hwmode: htotal %d, vtotal %d, vdisplay %d\n", + crtc->base.id, crtc->hwmode.crtc_htotal, + crtc->hwmode.crtc_vtotal, crtc->hwmode.crtc_vdisplay); + DRM_DEBUG("crtc %d: clock %d kHz framedur %d linedur %d, pixeldur %d\n", + crtc->base.id, (int) dotclock/1000, (int) framedur_ns, + (int) linedur_ns, (int) pixeldur_ns); +} + +/** + * drm_calc_vbltimestamp_from_scanoutpos - helper routine for kms + * drivers. Implements calculation of exact vblank timestamps from + * given drm_display_mode timings and current video scanout position + * of a crtc. This can be called from within get_vblank_timestamp() + * implementation of a kms driver to implement the actual timestamping. + * + * Should return timestamps conforming to the OML_sync_control OpenML + * extension specification. The timestamp corresponds to the end of + * the vblank interval, aka start of scanout of topmost-leftmost display + * pixel in the following video frame. + * + * Requires support for optional dev->driver->get_scanout_position() + * in kms driver, plus a bit of setup code to provide a drm_display_mode + * that corresponds to the true scanout timing. + * + * The current implementation only handles standard video modes. It + * returns as no operation if a doublescan or interlaced video mode is + * active. Higher level code is expected to handle this. + * + * @dev: DRM device. + * @crtc: Which crtc's vblank timestamp to retrieve. + * @max_error: Desired maximum allowable error in timestamps (nanosecs). + * On return contains true maximum error of timestamp. + * @vblank_time: Pointer to struct timeval which should receive the timestamp. + * @flags: Flags to pass to driver: + * 0 = Default. + * DRM_CALLED_FROM_VBLIRQ = If function is called from vbl irq handler. + * @refcrtc: drm_crtc* of crtc which defines scanout timing. + * + * Returns negative value on error, failure or if not supported in current + * video mode: + * + * -EINVAL - Invalid crtc. + * -EAGAIN - Temporary unavailable, e.g., called before initial modeset. + * -ENOTSUPP - Function not supported in current display mode. + * -EIO - Failed, e.g., due to failed scanout position query. + * + * Returns or'ed positive status flags on success: + * + * DRM_VBLANKTIME_SCANOUTPOS_METHOD - Signal this method used for timestamping. + * DRM_VBLANKTIME_INVBL - Timestamp taken while scanout was in vblank interval. + * + */ +int +drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc, + int *max_error, struct timeval *vblank_time, unsigned flags, + struct drm_crtc *refcrtc) +{ + struct timeval stime, raw_time; + struct drm_display_mode *mode; + int vbl_status, vtotal, vdisplay; + int vpos, hpos, i; + int64_t framedur_ns, linedur_ns, pixeldur_ns, delta_ns, duration_ns; + bool invbl; + + if (crtc < 0 || crtc >= dev->num_crtcs) { + DRM_ERROR("Invalid crtc %d\n", crtc); + return -EINVAL; + } + + /* Scanout position query not supported? Should not happen. */ + if (!dev->driver->get_scanout_position) { + DRM_ERROR("Called from driver w/o get_scanout_position()!?\n"); + return -EIO; + } + + mode = &refcrtc->hwmode; + vtotal = mode->crtc_vtotal; + vdisplay = mode->crtc_vdisplay; + + /* Durations of frames, lines, pixels in nanoseconds. */ + framedur_ns = refcrtc->framedur_ns; + linedur_ns = refcrtc->linedur_ns; + pixeldur_ns = refcrtc->pixeldur_ns; + + /* If mode timing undefined, just return as no-op: + * Happens during initial modesetting of a crtc. + */ + if (vtotal <= 0 || vdisplay <= 0 || framedur_ns == 0) { + DRM_DEBUG("crtc %d: Noop due to uninitialized mode.\n", crtc); + return -EAGAIN; + } + + /* Get current scanout position with system timestamp. + * Repeat query up to DRM_TIMESTAMP_MAXRETRIES times + * if single query takes longer than max_error nanoseconds. + * + * This guarantees a tight bound on maximum error if + * code gets preempted or delayed for some reason. + */ + for (i = 0; i < DRM_TIMESTAMP_MAXRETRIES; i++) { + /* Disable preemption to make it very likely to + * succeed in the first iteration. + */ + critical_enter(); + + /* Get system timestamp before query. */ + getmicrouptime(&stime); + + /* Get vertical and horizontal scanout pos. vpos, hpos. */ + vbl_status = dev->driver->get_scanout_position(dev, crtc, &vpos, &hpos); + + /* Get system timestamp after query. */ + getmicrouptime(&raw_time); + + critical_exit(); + + /* Return as no-op if scanout query unsupported or failed. */ + if (!(vbl_status & DRM_SCANOUTPOS_VALID)) { + DRM_DEBUG("crtc %d : scanoutpos query failed [%d].\n", + crtc, vbl_status); + return -EIO; + } + + duration_ns = timeval_to_ns(&raw_time) - timeval_to_ns(&stime); + + /* Accept result with < max_error nsecs timing uncertainty. */ + if (duration_ns <= (int64_t) *max_error) + break; + } + + /* Noisy system timing? */ + if (i == DRM_TIMESTAMP_MAXRETRIES) { + DRM_DEBUG("crtc %d: Noisy timestamp %d us > %d us [%d reps].\n", + crtc, (int) duration_ns/1000, *max_error/1000, i); + } + + /* Return upper bound of timestamp precision error. */ + *max_error = (int) duration_ns; + + /* Check if in vblank area: + * vpos is >=0 in video scanout area, but negative + * within vblank area, counting down the number of lines until + * start of scanout. + */ + invbl = vbl_status & DRM_SCANOUTPOS_INVBL; + + /* Convert scanout position into elapsed time at raw_time query + * since start of scanout at first display scanline. delta_ns + * can be negative if start of scanout hasn't happened yet. + */ + delta_ns = (int64_t)vpos * linedur_ns + (int64_t)hpos * pixeldur_ns; + + /* Is vpos outside nominal vblank area, but less than + * 1/100 of a frame height away from start of vblank? + * If so, assume this isn't a massively delayed vblank + * interrupt, but a vblank interrupt that fired a few + * microseconds before true start of vblank. Compensate + * by adding a full frame duration to the final timestamp. + * Happens, e.g., on ATI R500, R600. + * + * We only do this if DRM_CALLED_FROM_VBLIRQ. + */ + if ((flags & DRM_CALLED_FROM_VBLIRQ) && !invbl && + ((vdisplay - vpos) < vtotal / 100)) { + delta_ns = delta_ns - framedur_ns; + + /* Signal this correction as "applied". */ + vbl_status |= 0x8; + } + + /* Subtract time delta from raw timestamp to get final + * vblank_time timestamp for end of vblank. + */ + *vblank_time = ns_to_timeval(timeval_to_ns(&raw_time) - delta_ns); + + DRM_DEBUG("crtc %d : v %d p(%d,%d)@ %jd.%jd -> %jd.%jd [e %d us, %d rep]\n", + crtc, (int)vbl_status, hpos, vpos, (uintmax_t)raw_time.tv_sec, + (uintmax_t)raw_time.tv_usec, (uintmax_t)vblank_time->tv_sec, + (uintmax_t)vblank_time->tv_usec, (int)duration_ns/1000, i); + + vbl_status = DRM_VBLANKTIME_SCANOUTPOS_METHOD; + if (invbl) + vbl_status |= DRM_VBLANKTIME_INVBL; + + return vbl_status; +} + +/** + * drm_get_last_vbltimestamp - retrieve raw timestamp for the most recent + * vblank interval. + * + * @dev: DRM device + * @crtc: which crtc's vblank timestamp to retrieve + * @tvblank: Pointer to target struct timeval which should receive the timestamp + * @flags: Flags to pass to driver: + * 0 = Default. + * DRM_CALLED_FROM_VBLIRQ = If function is called from vbl irq handler. + * + * Fetches the system timestamp corresponding to the time of the most recent + * vblank interval on specified crtc. May call into kms-driver to + * compute the timestamp with a high-precision GPU specific method. + * + * Returns zero if timestamp originates from uncorrected do_gettimeofday() + * call, i.e., it isn't very precisely locked to the true vblank. + * + * Returns non-zero if timestamp is considered to be very precise. + */ +u32 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, + struct timeval *tvblank, unsigned flags) +{ + int ret = 0; + + /* Define requested maximum error on timestamps (nanoseconds). */ + int max_error = (int) drm_timestamp_precision * 1000; + + /* Query driver if possible and precision timestamping enabled. */ + if (dev->driver->get_vblank_timestamp && (max_error > 0)) { + ret = dev->driver->get_vblank_timestamp(dev, crtc, &max_error, + tvblank, flags); + if (ret > 0) + return (u32) ret; + } + + /* GPU high precision timestamp query unsupported or failed. + * Return gettimeofday timestamp as best estimate. + */ + microtime(tvblank); + + return 0; +} + +/** + * drm_vblank_count - retrieve "cooked" vblank counter value + * @dev: DRM device + * @crtc: which counter to retrieve + * + * Fetches the "cooked" vblank count value that represents the number of + * vblank events since the system was booted, including lost events due to + * modesetting activity. + */ +u32 drm_vblank_count(struct drm_device *dev, int crtc) +{ + return atomic_read(&dev->_vblank_count[crtc]); +} + +/** + * drm_vblank_count_and_time - retrieve "cooked" vblank counter value + * and the system timestamp corresponding to that vblank counter value. + * + * @dev: DRM device + * @crtc: which counter to retrieve + * @vblanktime: Pointer to struct timeval to receive the vblank timestamp. + * + * Fetches the "cooked" vblank count value that represents the number of + * vblank events since the system was booted, including lost events due to + * modesetting activity. Returns corresponding system timestamp of the time + * of the vblank interval that corresponds to the current value vblank counter + * value. + */ +u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, + struct timeval *vblanktime) +{ + u32 cur_vblank; + + /* Read timestamp from slot of _vblank_time ringbuffer + * that corresponds to current vblank count. Retry if + * count has incremented during readout. This works like + * a seqlock. + */ + do { + cur_vblank = atomic_read(&dev->_vblank_count[crtc]); + *vblanktime = vblanktimestamp(dev, crtc, cur_vblank); + rmb(); + } while (cur_vblank != atomic_read(&dev->_vblank_count[crtc])); + + return cur_vblank; +} + +/** + * drm_update_vblank_count - update the master vblank counter + * @dev: DRM device + * @crtc: counter to update + * + * Call back into the driver to update the appropriate vblank counter + * (specified by @crtc). Deal with wraparound, if it occurred, and + * update the last read value so we can deal with wraparound on the next + * call if necessary. + * + * Only necessary when going from off->on, to account for frames we + * didn't get an interrupt for. + * + * Note: caller must hold dev->vbl_lock since this reads & writes + * device vblank fields. + */ +static void drm_update_vblank_count(struct drm_device *dev, int crtc) +{ + u32 cur_vblank, diff, tslot, rc; + struct timeval t_vblank; + + /* + * Interrupts were disabled prior to this call, so deal with counter + * wrap if needed. + * NOTE! It's possible we lost a full dev->max_vblank_count events + * here if the register is small or we had vblank interrupts off for + * a long time. + * + * We repeat the hardware vblank counter & timestamp query until + * we get consistent results. This to prevent races between gpu + * updating its hardware counter while we are retrieving the + * corresponding vblank timestamp. + */ + do { + cur_vblank = dev->driver->get_vblank_counter(dev, crtc); + rc = drm_get_last_vbltimestamp(dev, crtc, &t_vblank, 0); + } while (cur_vblank != dev->driver->get_vblank_counter(dev, crtc)); + + /* Deal with counter wrap */ + diff = cur_vblank - dev->last_vblank[crtc]; + if (cur_vblank < dev->last_vblank[crtc]) { + diff += dev->max_vblank_count; + + DRM_DEBUG("last_vblank[%d]=0x%x, cur_vblank=0x%x => diff=0x%x\n", + crtc, dev->last_vblank[crtc], cur_vblank, diff); + } + + DRM_DEBUG("enabling vblank interrupts on crtc %d, missed %d\n", + crtc, diff); + + /* Reinitialize corresponding vblank timestamp if high-precision query + * available. Skip this step if query unsupported or failed. Will + * reinitialize delayed at next vblank interrupt in that case. + */ + if (rc) { + tslot = atomic_read(&dev->_vblank_count[crtc]) + diff; + vblanktimestamp(dev, crtc, tslot) = t_vblank; + } + + atomic_add(diff, &dev->_vblank_count[crtc]); +} + +/** + * drm_vblank_get - get a reference count on vblank events + * @dev: DRM device + * @crtc: which CRTC to own + * + * Acquire a reference count on vblank events to avoid having them disabled + * while in use. + * + * RETURNS + * Zero on success, nonzero on failure. + */ +int drm_vblank_get(struct drm_device *dev, int crtc) +{ + int ret = 0; + + mtx_lock(&dev->vbl_lock); + /* Going from 0->1 means we have to enable interrupts again */ + if (atomic_fetchadd_int(&dev->vblank_refcount[crtc], 1) == 0) { + mtx_lock(&dev->vblank_time_lock); + if (!dev->vblank_enabled[crtc]) { + /* Enable vblank irqs under vblank_time_lock protection. + * All vblank count & timestamp updates are held off + * until we are done reinitializing master counter and + * timestamps. Filtercode in drm_handle_vblank() will + * prevent double-accounting of same vblank interval. + */ + ret = -dev->driver->enable_vblank(dev, crtc); + DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n", + crtc, ret); + if (ret) + atomic_dec(&dev->vblank_refcount[crtc]); + else { + dev->vblank_enabled[crtc] = 1; + drm_update_vblank_count(dev, crtc); + } + } + mtx_unlock(&dev->vblank_time_lock); + } else { + if (!dev->vblank_enabled[crtc]) { + atomic_dec(&dev->vblank_refcount[crtc]); + ret = EINVAL; + } + } + mtx_unlock(&dev->vbl_lock); + + return ret; +} + +/** + * drm_vblank_put - give up ownership of vblank events + * @dev: DRM device + * @crtc: which counter to give up + * + * Release ownership of a given vblank counter, turning off interrupts + * if possible. Disable interrupts after drm_vblank_offdelay milliseconds. + */ +void drm_vblank_put(struct drm_device *dev, int crtc) +{ + KASSERT(atomic_read(&dev->vblank_refcount[crtc]) != 0, + ("Too many drm_vblank_put for crtc %d", crtc)); + + /* Last user schedules interrupt disable */ + if (atomic_fetchadd_int(&dev->vblank_refcount[crtc], -1) == 1 && + (drm_vblank_offdelay > 0)) + callout_reset(&dev->vblank_disable_callout, + (drm_vblank_offdelay * DRM_HZ) / 1000, + vblank_disable_fn, dev); +} + +void drm_vblank_off(struct drm_device *dev, int crtc) +{ + struct drm_pending_vblank_event *e, *t; + struct timeval now; + unsigned int seq; + + mtx_lock(&dev->vbl_lock); + vblank_disable_and_save(dev, crtc); + mtx_lock(&dev->event_lock); + wakeup(&dev->_vblank_count[crtc]); + + /* Send any queued vblank events, lest the natives grow disquiet */ + seq = drm_vblank_count_and_time(dev, crtc, &now); + list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) { + if (e->pipe != crtc) + continue; + DRM_DEBUG("Sending premature vblank event on disable: \ + wanted %d, current %d\n", + e->event.sequence, seq); + + e->event.sequence = seq; + e->event.tv_sec = now.tv_sec; + e->event.tv_usec = now.tv_usec; + drm_vblank_put(dev, e->pipe); + list_move_tail(&e->base.link, &e->base.file_priv->event_list); + drm_event_wakeup(&e->base); + CTR3(KTR_DRM, "vblank_event_delivered %d %d %d", + e->base.pid, e->pipe, e->event.sequence); + } + + mtx_unlock(&dev->event_lock); + mtx_unlock(&dev->vbl_lock); +} + +/** + * drm_vblank_pre_modeset - account for vblanks across mode sets + * @dev: DRM device + * @crtc: CRTC in question + * @post: post or pre mode set? + * + * Account for vblank events across mode setting events, which will likely + * reset the hardware frame counter. + */ +void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) +{ + /* vblank is not initialized (IRQ not installed ?) */ + if (!dev->num_crtcs) + return; + /* + * To avoid all the problems that might happen if interrupts + * were enabled/disabled around or between these calls, we just + * have the kernel take a reference on the CRTC (just once though + * to avoid corrupting the count if multiple, mismatch calls occur), + * so that interrupts remain enabled in the interim. + */ + if (!dev->vblank_inmodeset[crtc]) { + dev->vblank_inmodeset[crtc] = 0x1; + if (drm_vblank_get(dev, crtc) == 0) + dev->vblank_inmodeset[crtc] |= 0x2; + } +} + +void drm_vblank_post_modeset(struct drm_device *dev, int crtc) +{ + + if (dev->vblank_inmodeset[crtc]) { + mtx_lock(&dev->vbl_lock); + dev->vblank_disable_allowed = 1; + mtx_unlock(&dev->vbl_lock); + + if (dev->vblank_inmodeset[crtc] & 0x2) + drm_vblank_put(dev, crtc); + + dev->vblank_inmodeset[crtc] = 0; + } +} + +/** + * drm_modeset_ctl - handle vblank event counter changes across mode switch + * @DRM_IOCTL_ARGS: standard ioctl arguments + * + * Applications should call the %_DRM_PRE_MODESET and %_DRM_POST_MODESET + * ioctls around modesetting so that any lost vblank events are accounted for. + * + * Generally the counter will reset across mode sets. If interrupts are + * enabled around this call, we don't have to do anything since the counter + * will have already been incremented. + */ +int drm_modeset_ctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_modeset_ctl *modeset = data; + int ret = 0; + unsigned int crtc; + + /* If drm_vblank_init() hasn't been called yet, just no-op */ + if (!dev->num_crtcs) + goto out; + + crtc = modeset->crtc; + if (crtc >= dev->num_crtcs) { + ret = -EINVAL; + goto out; + } + + switch (modeset->cmd) { + case _DRM_PRE_MODESET: + drm_vblank_pre_modeset(dev, crtc); + break; + case _DRM_POST_MODESET: + drm_vblank_post_modeset(dev, crtc); + break; + default: + ret = -EINVAL; + break; + } + +out: + return ret; +} + +static void +drm_vblank_event_destroy(struct drm_pending_event *e) +{ + + free(e, DRM_MEM_VBLANK); +} + +static int drm_queue_vblank_event(struct drm_device *dev, int pipe, + union drm_wait_vblank *vblwait, + struct drm_file *file_priv) +{ + struct drm_pending_vblank_event *e; + struct timeval now; + unsigned int seq; + int ret; + + e = malloc(sizeof *e, DRM_MEM_VBLANK, M_WAITOK | M_ZERO); + + e->pipe = pipe; + e->base.pid = curproc->p_pid; + e->event.base.type = DRM_EVENT_VBLANK; + e->event.base.length = sizeof e->event; + e->event.user_data = vblwait->request.signal; + e->base.event = &e->event.base; + e->base.file_priv = file_priv; + e->base.destroy = drm_vblank_event_destroy; + + mtx_lock(&dev->event_lock); + + if (file_priv->event_space < sizeof e->event) { + ret = EBUSY; + goto err_unlock; + } + + file_priv->event_space -= sizeof e->event; + seq = drm_vblank_count_and_time(dev, pipe, &now); + + if ((vblwait->request.type & _DRM_VBLANK_NEXTONMISS) && + (seq - vblwait->request.sequence) <= (1 << 23)) { + vblwait->request.sequence = seq + 1; + vblwait->reply.sequence = vblwait->request.sequence; + } + + DRM_DEBUG("event on vblank count %d, current %d, crtc %d\n", + vblwait->request.sequence, seq, pipe); + + CTR4(KTR_DRM, "vblank_event_queued %d %d rt %x %d", curproc->p_pid, pipe, + vblwait->request.type, vblwait->request.sequence); + + e->event.sequence = vblwait->request.sequence; + if ((seq - vblwait->request.sequence) <= (1 << 23)) { + e->event.sequence = seq; + e->event.tv_sec = now.tv_sec; + e->event.tv_usec = now.tv_usec; + drm_vblank_put(dev, pipe); + list_add_tail(&e->base.link, &e->base.file_priv->event_list); + drm_event_wakeup(&e->base); + vblwait->reply.sequence = seq; + CTR3(KTR_DRM, "vblank_event_wakeup p1 %d %d %d", curproc->p_pid, + pipe, vblwait->request.sequence); + } else { + /* drm_handle_vblank_events will call drm_vblank_put */ + list_add_tail(&e->base.link, &dev->vblank_event_list); + vblwait->reply.sequence = vblwait->request.sequence; + } + + mtx_unlock(&dev->event_lock); + + return 0; + +err_unlock: + mtx_unlock(&dev->event_lock); + free(e, DRM_MEM_VBLANK); + drm_vblank_put(dev, pipe); + return ret; +} + +/** + * Wait for VBLANK. + * + * \param inode device inode. + * \param file_priv DRM file private. + * \param cmd command. + * \param data user argument, pointing to a drm_wait_vblank structure. + * \return zero on success or a negative number on failure. + * + * This function enables the vblank interrupt on the pipe requested, then + * sleeps waiting for the requested sequence number to occur, and drops + * the vblank interrupt refcount afterwards. (vblank irq disable follows that + * after a timeout with no further vblank waits scheduled). + */ +int drm_wait_vblank(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + union drm_wait_vblank *vblwait = data; + int ret = 0; + unsigned int flags, seq, crtc, high_crtc; + + if (/*(!drm_dev_to_irq(dev)) || */(!dev->irq_enabled)) + return (EINVAL); + + if (vblwait->request.type & _DRM_VBLANK_SIGNAL) + return (EINVAL); + + if (vblwait->request.type & + ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK | + _DRM_VBLANK_HIGH_CRTC_MASK)) { + DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n", + vblwait->request.type, + (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK | + _DRM_VBLANK_HIGH_CRTC_MASK)); + return (EINVAL); + } + + flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK; + high_crtc = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK); + if (high_crtc) + crtc = high_crtc >> _DRM_VBLANK_HIGH_CRTC_SHIFT; + else + crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0; + if (crtc >= dev->num_crtcs) + return (EINVAL); + + ret = drm_vblank_get(dev, crtc); + if (ret) { + DRM_DEBUG("failed to acquire vblank counter, %d\n", ret); + return (ret); + } + seq = drm_vblank_count(dev, crtc); + + switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) { + case _DRM_VBLANK_RELATIVE: + vblwait->request.sequence += seq; + vblwait->request.type &= ~_DRM_VBLANK_RELATIVE; + case _DRM_VBLANK_ABSOLUTE: + break; + default: + ret = (EINVAL); + goto done; + } + + if (flags & _DRM_VBLANK_EVENT) { + /* must hold on to the vblank ref until the event fires + * drm_vblank_put will be called asynchronously + */ + return drm_queue_vblank_event(dev, crtc, vblwait, file_priv); + } + + if ((flags & _DRM_VBLANK_NEXTONMISS) && + (seq - vblwait->request.sequence) <= (1<<23)) { + vblwait->request.sequence = seq + 1; + } + + dev->last_vblank_wait[crtc] = vblwait->request.sequence; + mtx_lock(&dev->vblank_time_lock); + while (((drm_vblank_count(dev, crtc) - vblwait->request.sequence) > + (1 << 23)) && dev->irq_enabled) { + /* + * The wakeups from the drm_irq_uninstall() and + * drm_vblank_off() may be lost there since vbl_lock + * is not held. Then, the timeout will wake us; the 3 + * seconds delay should not be a problem for + * application when crtc is disabled or irq + * uninstalled anyway. + */ + ret = msleep(&dev->_vblank_count[crtc], &dev->vblank_time_lock, + PCATCH, "drmvbl", 3 * hz); + if (ret != 0) + break; + } + mtx_unlock(&dev->vblank_time_lock); + if (ret != EINTR) { + struct timeval now; + long reply_seq; + + reply_seq = drm_vblank_count_and_time(dev, crtc, &now); + CTR5(KTR_DRM, "wait_vblank %d %d rt %x success %d %d", + curproc->p_pid, crtc, vblwait->request.type, + vblwait->request.sequence, reply_seq); + vblwait->reply.sequence = reply_seq; + vblwait->reply.tval_sec = now.tv_sec; + vblwait->reply.tval_usec = now.tv_usec; + } else { + CTR5(KTR_DRM, "wait_vblank %d %d rt %x error %d %d", + curproc->p_pid, crtc, vblwait->request.type, ret, + vblwait->request.sequence); + } + +done: + drm_vblank_put(dev, crtc); + return ret; +} + +void drm_handle_vblank_events(struct drm_device *dev, int crtc) +{ + struct drm_pending_vblank_event *e, *t; + struct timeval now; + unsigned int seq; + + seq = drm_vblank_count_and_time(dev, crtc, &now); + CTR2(KTR_DRM, "drm_handle_vblank_events %d %d", seq, crtc); + + mtx_lock(&dev->event_lock); + + list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) { + if (e->pipe != crtc) + continue; + if ((seq - e->event.sequence) > (1<<23)) + continue; + + e->event.sequence = seq; + e->event.tv_sec = now.tv_sec; + e->event.tv_usec = now.tv_usec; + drm_vblank_put(dev, e->pipe); + list_move_tail(&e->base.link, &e->base.file_priv->event_list); + drm_event_wakeup(&e->base); + CTR3(KTR_DRM, "vblank_event_wakeup p2 %d %d %d", e->base.pid, + e->pipe, e->event.sequence); + } + + mtx_unlock(&dev->event_lock); +} + +/** + * drm_handle_vblank - handle a vblank event + * @dev: DRM device + * @crtc: where this event occurred + * + * Drivers should call this routine in their vblank interrupt handlers to + * update the vblank counter and send any signals that may be pending. + */ +bool drm_handle_vblank(struct drm_device *dev, int crtc) +{ + u32 vblcount; + int64_t diff_ns; + struct timeval tvblank; + + if (!dev->num_crtcs) + return false; + + /* Need timestamp lock to prevent concurrent execution with + * vblank enable/disable, as this would cause inconsistent + * or corrupted timestamps and vblank counts. + */ + mtx_lock(&dev->vblank_time_lock); + + /* Vblank irq handling disabled. Nothing to do. */ + if (!dev->vblank_enabled[crtc]) { + mtx_unlock(&dev->vblank_time_lock); + return false; + } + + /* Fetch corresponding timestamp for this vblank interval from + * driver and store it in proper slot of timestamp ringbuffer. + */ + + /* Get current timestamp and count. */ + vblcount = atomic_read(&dev->_vblank_count[crtc]); + drm_get_last_vbltimestamp(dev, crtc, &tvblank, DRM_CALLED_FROM_VBLIRQ); + + /* Compute time difference to timestamp of last vblank */ + diff_ns = timeval_to_ns(&tvblank) - + timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount)); + + /* Update vblank timestamp and count if at least + * DRM_REDUNDANT_VBLIRQ_THRESH_NS nanoseconds + * difference between last stored timestamp and current + * timestamp. A smaller difference means basically + * identical timestamps. Happens if this vblank has + * been already processed and this is a redundant call, + * e.g., due to spurious vblank interrupts. We need to + * ignore those for accounting. + */ + if (abs64(diff_ns) > DRM_REDUNDANT_VBLIRQ_THRESH_NS) { + /* Store new timestamp in ringbuffer. */ + vblanktimestamp(dev, crtc, vblcount + 1) = tvblank; + + /* Increment cooked vblank count. This also atomically commits + * the timestamp computed above. + */ + atomic_inc(&dev->_vblank_count[crtc]); + } else { + DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n", + crtc, (int) diff_ns); + } + + wakeup(&dev->_vblank_count[crtc]); + drm_handle_vblank_events(dev, crtc); + + mtx_unlock(&dev->vblank_time_lock); + return true; +} diff --git a/sys/dev/drm2/drm_linux_list.h b/sys/dev/drm2/drm_linux_list.h new file mode 100644 index 00000000000..3b23a30de64 --- /dev/null +++ b/sys/dev/drm2/drm_linux_list.h @@ -0,0 +1,177 @@ +/* drm_linux_list.h -- linux list functions for the BSDs. + * Created: Mon Apr 7 14:30:16 1999 by anholt@FreeBSD.org + */ +/*- + * Copyright 2003 Eric Anholt + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef _DRM_LINUX_LIST_H_ +#define _DRM_LINUX_LIST_H_ + +struct list_head { + struct list_head *next, *prev; +}; + +#define list_entry(ptr, type, member) container_of(ptr,type,member) +#define hlist_entry(ptr, type, member) container_of(ptr,type,member) + +static __inline__ void +INIT_LIST_HEAD(struct list_head *head) { + (head)->next = head; + (head)->prev = head; +} + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define DRM_LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +static __inline__ int +list_empty(const struct list_head *head) { + return (head)->next == head; +} + +static __inline__ void +list_add(struct list_head *new, struct list_head *head) { + (head)->next->prev = new; + (new)->next = (head)->next; + (new)->prev = head; + (head)->next = new; +} + +static __inline__ void +list_add_tail(struct list_head *entry, struct list_head *head) { + (entry)->prev = (head)->prev; + (entry)->next = head; + (head)->prev->next = entry; + (head)->prev = entry; +} + +static __inline__ void +list_del(struct list_head *entry) { + (entry)->next->prev = (entry)->prev; + (entry)->prev->next = (entry)->next; +} + +static inline void list_replace(struct list_head *old, + struct list_head *new) +{ + new->next = old->next; + new->next->prev = new; + new->prev = old->prev; + new->prev->next = new; +} + +static inline void list_move(struct list_head *list, struct list_head *head) +{ + list_del(list); + list_add(list, head); +} + +static inline void list_move_tail(struct list_head *list, + struct list_head *head) +{ + list_del(list); + list_add_tail(list, head); +} + +static __inline__ void +list_del_init(struct list_head *entry) { + (entry)->next->prev = (entry)->prev; + (entry)->prev->next = (entry)->next; + INIT_LIST_HEAD(entry); +} + +#define list_for_each(entry, head) \ + for (entry = (head)->next; entry != head; entry = (entry)->next) + +#define list_for_each_prev(entry, head) \ + for (entry = (head)->prev; entry != (head); \ + entry = entry->prev) + +#define list_for_each_safe(entry, temp, head) \ + for (entry = (head)->next, temp = (entry)->next; \ + entry != head; \ + entry = temp, temp = entry->next) + +#define list_for_each_entry(pos, head, member) \ + for (pos = list_entry((head)->next, __typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, __typeof(*pos), member)) + +#define list_for_each_entry_continue_reverse(pos, head, member) \ + for (pos = list_entry(pos->member.prev, __typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.prev, __typeof(*pos), member)) + +/** + * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_entry((head)->next, __typeof(*pos), member), \ + n = list_entry(pos->member.next, __typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, __typeof(*n), member)) + +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) + + +static inline void +__list_splice(const struct list_head *list, struct list_head *prev, + struct list_head *next) +{ + struct list_head *first = list->next; + struct list_head *last = list->prev; + + first->prev = prev; + prev->next = first; + + last->next = next; + next->prev = last; +} + +static inline void +list_splice(const struct list_head *list, struct list_head *head) +{ + if (list_empty(list)) + return; + + __list_splice(list, head, head->next); +} + +void drm_list_sort(void *priv, struct list_head *head, int (*cmp)(void *priv, + struct list_head *a, struct list_head *b)); + +#endif /* _DRM_LINUX_LIST_H_ */ diff --git a/sys/dev/drm2/drm_linux_list_sort.c b/sys/dev/drm2/drm_linux_list_sort.c new file mode 100644 index 00000000000..973ce4a4be9 --- /dev/null +++ b/sys/dev/drm2/drm_linux_list_sort.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Konstantin Belousov under sponsorship from + * the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +struct drm_list_sort_thunk { + int (*cmp)(void *, struct list_head *, struct list_head *); + void *priv; +}; + +static int +drm_le_cmp(void *priv, const void *d1, const void *d2) +{ + struct list_head *le1, *le2; + struct drm_list_sort_thunk *thunk; + + thunk = priv; + le1 = __DECONST(struct list_head *, d1); + le2 = __DECONST(struct list_head *, d2); + return ((thunk->cmp)(thunk->priv, le1, le2)); +} + +/* + * Punt and use array sort. + */ +void +drm_list_sort(void *priv, struct list_head *head, int (*cmp)(void *priv, + struct list_head *a, struct list_head *b)) +{ + struct drm_list_sort_thunk thunk; + struct list_head **ar, *le; + int count, i; + + count = 0; + list_for_each(le, head) + count++; + ar = malloc(sizeof(struct list_head *) * count, M_TEMP, M_WAITOK); + i = 0; + list_for_each(le, head) + ar[i++] = le; + thunk.cmp = cmp; + thunk.priv = priv; + qsort_r(ar, count, sizeof(struct list_head *), &thunk, drm_le_cmp); + INIT_LIST_HEAD(head); + for (i = 0; i < count; i++) + list_add_tail(ar[i], head); + free(ar, M_TEMP); +} diff --git a/sys/dev/drm2/drm_lock.c b/sys/dev/drm2/drm_lock.c new file mode 100644 index 00000000000..8ae230510d1 --- /dev/null +++ b/sys/dev/drm2/drm_lock.c @@ -0,0 +1,199 @@ +/*- + * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_lock.c + * Implementation of the ioctls and other support code for dealing with the + * hardware lock. + * + * The DRM hardware lock is a shared structure between the kernel and userland. + * + * On uncontended access where the new context was the last context, the + * client may take the lock without dropping down into the kernel, using atomic + * compare-and-set. + * + * If the client finds during compare-and-set that it was not the last owner + * of the lock, it calls the DRM lock ioctl, which may sleep waiting for the + * lock, and may have side-effects of kernel-managed context switching. + * + * When the client releases the lock, if the lock is marked as being contended + * by another client, then the DRM unlock ioctl is called so that the + * contending client may be woken up. + */ + +#include + +int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_lock *lock = data; + int ret = 0; + + if (lock->context == DRM_KERNEL_CONTEXT) { + DRM_ERROR("Process %d using kernel context %d\n", + DRM_CURRENTPID, lock->context); + return EINVAL; + } + + DRM_DEBUG("%d (pid %d) requests lock (0x%08x), flags = 0x%08x\n", + lock->context, DRM_CURRENTPID, dev->lock.hw_lock->lock, + lock->flags); + + if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE) && + lock->context < 0) + return EINVAL; + + DRM_LOCK(dev); + for (;;) { + if (drm_lock_take(&dev->lock, lock->context)) { + dev->lock.file_priv = file_priv; + dev->lock.lock_time = jiffies; + atomic_inc(&dev->counts[_DRM_STAT_LOCKS]); + break; /* Got lock */ + } + + /* Contention */ + ret = DRM_LOCK_SLEEP(dev, &dev->lock.lock_queue, + PCATCH, "drmlk2", 0); + if (ret != 0) + break; + } + DRM_UNLOCK(dev); + + if (ret == ERESTART) + DRM_DEBUG("restarting syscall\n"); + else + DRM_DEBUG("%d %s\n", lock->context, + ret ? "interrupted" : "has lock"); + + if (ret != 0) + return ret; + + /* XXX: Add signal blocking here */ + + if (dev->driver->dma_quiescent != NULL && + (lock->flags & _DRM_LOCK_QUIESCENT)) + dev->driver->dma_quiescent(dev); + + return 0; +} + +int drm_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_lock *lock = data; + + DRM_DEBUG("%d (pid %d) requests unlock (0x%08x), flags = 0x%08x\n", + lock->context, DRM_CURRENTPID, dev->lock.hw_lock->lock, + lock->flags); + + if (lock->context == DRM_KERNEL_CONTEXT) { + DRM_ERROR("Process %d using kernel context %d\n", + DRM_CURRENTPID, lock->context); + return EINVAL; + } + + atomic_inc(&dev->counts[_DRM_STAT_UNLOCKS]); + + DRM_LOCK(dev); + drm_lock_transfer(&dev->lock, DRM_KERNEL_CONTEXT); + + if (drm_lock_free(&dev->lock, DRM_KERNEL_CONTEXT)) { + DRM_ERROR("\n"); + } + DRM_UNLOCK(dev); + + return 0; +} + +int drm_lock_take(struct drm_lock_data *lock_data, unsigned int context) +{ + volatile unsigned int *lock = &lock_data->hw_lock->lock; + unsigned int old, new; + + do { + old = *lock; + if (old & _DRM_LOCK_HELD) + new = old | _DRM_LOCK_CONT; + else + new = context | _DRM_LOCK_HELD; + } while (!atomic_cmpset_int(lock, old, new)); + + if (_DRM_LOCKING_CONTEXT(old) == context) { + if (old & _DRM_LOCK_HELD) { + if (context != DRM_KERNEL_CONTEXT) { + DRM_ERROR("%d holds heavyweight lock\n", + context); + } + return 0; + } + } + if (new == (context | _DRM_LOCK_HELD)) { + /* Have lock */ + return 1; + } + return 0; +} + +/* This takes a lock forcibly and hands it to context. Should ONLY be used + inside *_unlock to give lock to kernel before calling *_dma_schedule. */ +int drm_lock_transfer(struct drm_lock_data *lock_data, unsigned int context) +{ + volatile unsigned int *lock = &lock_data->hw_lock->lock; + unsigned int old, new; + + lock_data->file_priv = NULL; + do { + old = *lock; + new = context | _DRM_LOCK_HELD; + } while (!atomic_cmpset_int(lock, old, new)); + + return 1; +} + +int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context) +{ + volatile unsigned int *lock = &lock_data->hw_lock->lock; + unsigned int old, new; + + lock_data->file_priv = NULL; + do { + old = *lock; + new = 0; + } while (!atomic_cmpset_int(lock, old, new)); + + if (_DRM_LOCK_IS_HELD(old) && _DRM_LOCKING_CONTEXT(old) != context) { + DRM_ERROR("%d freed heavyweight lock held by %d\n", + context, _DRM_LOCKING_CONTEXT(old)); + return 1; + } + DRM_WAKEUP_INT((void *)&lock_data->lock_queue); + return 0; +} diff --git a/sys/dev/drm2/drm_memory.c b/sys/dev/drm2/drm_memory.c new file mode 100644 index 00000000000..fa48197388c --- /dev/null +++ b/sys/dev/drm2/drm_memory.c @@ -0,0 +1,127 @@ +/*- + *Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * + * Portions of this software were developed by Konstantin Belousov + * under sponsorship from the FreeBSD Foundation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_memory.c + * Wrappers for kernel memory allocation routines, and MTRR management support. + * + * This file previously implemented a memory consumption tracking system using + * the "area" argument for various different types of allocations, but that + * has been stripped out for now. + */ + +#include + +MALLOC_DEFINE(DRM_MEM_DMA, "drm_dma", "DRM DMA Data Structures"); +MALLOC_DEFINE(DRM_MEM_SAREA, "drm_sarea", "DRM SAREA Data Structures"); +MALLOC_DEFINE(DRM_MEM_DRIVER, "drm_driver", "DRM DRIVER Data Structures"); +MALLOC_DEFINE(DRM_MEM_MAGIC, "drm_magic", "DRM MAGIC Data Structures"); +MALLOC_DEFINE(DRM_MEM_IOCTLS, "drm_ioctls", "DRM IOCTL Data Structures"); +MALLOC_DEFINE(DRM_MEM_MAPS, "drm_maps", "DRM MAP Data Structures"); +MALLOC_DEFINE(DRM_MEM_BUFS, "drm_bufs", "DRM BUFFER Data Structures"); +MALLOC_DEFINE(DRM_MEM_SEGS, "drm_segs", "DRM SEGMENTS Data Structures"); +MALLOC_DEFINE(DRM_MEM_PAGES, "drm_pages", "DRM PAGES Data Structures"); +MALLOC_DEFINE(DRM_MEM_FILES, "drm_files", "DRM FILE Data Structures"); +MALLOC_DEFINE(DRM_MEM_QUEUES, "drm_queues", "DRM QUEUE Data Structures"); +MALLOC_DEFINE(DRM_MEM_CMDS, "drm_cmds", "DRM COMMAND Data Structures"); +MALLOC_DEFINE(DRM_MEM_MAPPINGS, "drm_mapping", "DRM MAPPING Data Structures"); +MALLOC_DEFINE(DRM_MEM_BUFLISTS, "drm_buflists", "DRM BUFLISTS Data Structures"); +MALLOC_DEFINE(DRM_MEM_AGPLISTS, "drm_agplists", "DRM AGPLISTS Data Structures"); +MALLOC_DEFINE(DRM_MEM_CTXBITMAP, "drm_ctxbitmap", + "DRM CTXBITMAP Data Structures"); +MALLOC_DEFINE(DRM_MEM_SGLISTS, "drm_sglists", "DRM SGLISTS Data Structures"); +MALLOC_DEFINE(DRM_MEM_DRAWABLE, "drm_drawable", "DRM DRAWABLE Data Structures"); +MALLOC_DEFINE(DRM_MEM_MM, "drm_sman", "DRM MEMORY MANAGER Data Structures"); +MALLOC_DEFINE(DRM_MEM_HASHTAB, "drm_hashtab", "DRM HASHTABLE Data Structures"); +MALLOC_DEFINE(DRM_MEM_KMS, "drm_kms", "DRM KMS Data Structures"); + +void drm_mem_init(void) +{ +} + +void drm_mem_uninit(void) +{ +} + +void *drm_ioremap_wc(struct drm_device *dev, drm_local_map_t *map) +{ + return pmap_mapdev_attr(map->offset, map->size, VM_MEMATTR_WRITE_COMBINING); +} + +void *drm_ioremap(struct drm_device *dev, drm_local_map_t *map) +{ + return pmap_mapdev(map->offset, map->size); +} + +void drm_ioremapfree(drm_local_map_t *map) +{ + pmap_unmapdev((vm_offset_t) map->virtual, map->size); +} + +int +drm_mtrr_add(unsigned long offset, size_t size, int flags) +{ + int act; + struct mem_range_desc mrdesc; + + mrdesc.mr_base = offset; + mrdesc.mr_len = size; + mrdesc.mr_flags = flags; + act = MEMRANGE_SET_UPDATE; + strlcpy(mrdesc.mr_owner, "drm", sizeof(mrdesc.mr_owner)); + return mem_range_attr_set(&mrdesc, &act); +} + +int +drm_mtrr_del(int __unused handle, unsigned long offset, size_t size, int flags) +{ + int act; + struct mem_range_desc mrdesc; + + mrdesc.mr_base = offset; + mrdesc.mr_len = size; + mrdesc.mr_flags = flags; + act = MEMRANGE_SET_REMOVE; + strlcpy(mrdesc.mr_owner, "drm", sizeof(mrdesc.mr_owner)); + return mem_range_attr_set(&mrdesc, &act); +} + +void +drm_clflush_pages(vm_page_t *pages, unsigned long num_pages) +{ + + pmap_invalidate_cache_pages(pages, num_pages); +} diff --git a/sys/dev/drm2/drm_mm.c b/sys/dev/drm2/drm_mm.c new file mode 100644 index 00000000000..cb35fc0d3df --- /dev/null +++ b/sys/dev/drm2/drm_mm.c @@ -0,0 +1,563 @@ +/************************************************************************** + * + * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + **************************************************************************/ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Generic simple memory manager implementation. Intended to be used as a base + * class implementation for more advanced memory managers. + * + * Note that the algorithm used is quite simple and there might be substantial + * performance gains if a smarter free list is implemented. Currently it is just an + * unordered stack of free regions. This could easily be improved if an RB-tree + * is used instead. At least if we expect heavy fragmentation. + * + * Aligned allocations can also see improvement. + * + * Authors: + * Thomas Hellström + */ + +#include +#include + +#define MM_UNUSED_TARGET 4 + +static struct drm_mm_node *drm_mm_kmalloc(struct drm_mm *mm, int atomic) +{ + struct drm_mm_node *child; + + child = malloc(sizeof(*child), DRM_MEM_MM, M_ZERO | + (atomic ? M_NOWAIT : M_WAITOK)); + + if (unlikely(child == NULL)) { + mtx_lock(&mm->unused_lock); + if (list_empty(&mm->unused_nodes)) + child = NULL; + else { + child = + list_entry(mm->unused_nodes.next, + struct drm_mm_node, node_list); + list_del(&child->node_list); + --mm->num_unused; + } + mtx_unlock(&mm->unused_lock); + } + return child; +} + +int drm_mm_pre_get(struct drm_mm *mm) +{ + struct drm_mm_node *node; + + mtx_lock(&mm->unused_lock); + while (mm->num_unused < MM_UNUSED_TARGET) { + mtx_unlock(&mm->unused_lock); + node = malloc(sizeof(*node), DRM_MEM_MM, M_WAITOK); + mtx_lock(&mm->unused_lock); + + if (unlikely(node == NULL)) { + int ret = (mm->num_unused < 2) ? -ENOMEM : 0; + mtx_unlock(&mm->unused_lock); + return ret; + } + ++mm->num_unused; + list_add_tail(&node->node_list, &mm->unused_nodes); + } + mtx_unlock(&mm->unused_lock); + return 0; +} + +static inline unsigned long drm_mm_hole_node_start(struct drm_mm_node *hole_node) +{ + return hole_node->start + hole_node->size; +} + +static inline unsigned long drm_mm_hole_node_end(struct drm_mm_node *hole_node) +{ + struct drm_mm_node *next_node = + list_entry(hole_node->node_list.next, struct drm_mm_node, + node_list); + + return next_node->start; +} + +static void drm_mm_insert_helper(struct drm_mm_node *hole_node, + struct drm_mm_node *node, + unsigned long size, unsigned alignment) +{ + struct drm_mm *mm = hole_node->mm; + unsigned long tmp = 0, wasted = 0; + unsigned long hole_start = drm_mm_hole_node_start(hole_node); + unsigned long hole_end = drm_mm_hole_node_end(hole_node); + + KASSERT(hole_node->hole_follows && !node->allocated, ("hole_node")); + + if (alignment) + tmp = hole_start % alignment; + + if (!tmp) { + hole_node->hole_follows = 0; + list_del_init(&hole_node->hole_stack); + } else + wasted = alignment - tmp; + + node->start = hole_start + wasted; + node->size = size; + node->mm = mm; + node->allocated = 1; + + INIT_LIST_HEAD(&node->hole_stack); + list_add(&node->node_list, &hole_node->node_list); + + KASSERT(node->start + node->size <= hole_end, ("hole pos")); + + if (node->start + node->size < hole_end) { + list_add(&node->hole_stack, &mm->hole_stack); + node->hole_follows = 1; + } else { + node->hole_follows = 0; + } +} + +struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *hole_node, + unsigned long size, + unsigned alignment, + int atomic) +{ + struct drm_mm_node *node; + + node = drm_mm_kmalloc(hole_node->mm, atomic); + if (unlikely(node == NULL)) + return NULL; + + drm_mm_insert_helper(hole_node, node, size, alignment); + + return node; +} + +int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node, + unsigned long size, unsigned alignment) +{ + struct drm_mm_node *hole_node; + + hole_node = drm_mm_search_free(mm, size, alignment, 0); + if (!hole_node) + return -ENOSPC; + + drm_mm_insert_helper(hole_node, node, size, alignment); + + return 0; +} + +static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node, + struct drm_mm_node *node, + unsigned long size, unsigned alignment, + unsigned long start, unsigned long end) +{ + struct drm_mm *mm = hole_node->mm; + unsigned long tmp = 0, wasted = 0; + unsigned long hole_start = drm_mm_hole_node_start(hole_node); + unsigned long hole_end = drm_mm_hole_node_end(hole_node); + + KASSERT(hole_node->hole_follows && !node->allocated, ("hole_node")); + + if (hole_start < start) + wasted += start - hole_start; + if (alignment) + tmp = (hole_start + wasted) % alignment; + + if (tmp) + wasted += alignment - tmp; + + if (!wasted) { + hole_node->hole_follows = 0; + list_del_init(&hole_node->hole_stack); + } + + node->start = hole_start + wasted; + node->size = size; + node->mm = mm; + node->allocated = 1; + + INIT_LIST_HEAD(&node->hole_stack); + list_add(&node->node_list, &hole_node->node_list); + + KASSERT(node->start + node->size <= hole_end, ("hole_end")); + KASSERT(node->start + node->size <= end, ("end")); + + if (node->start + node->size < hole_end) { + list_add(&node->hole_stack, &mm->hole_stack); + node->hole_follows = 1; + } else { + node->hole_follows = 0; + } +} + +struct drm_mm_node *drm_mm_get_block_range_generic(struct drm_mm_node *hole_node, + unsigned long size, + unsigned alignment, + unsigned long start, + unsigned long end, + int atomic) +{ + struct drm_mm_node *node; + + node = drm_mm_kmalloc(hole_node->mm, atomic); + if (unlikely(node == NULL)) + return NULL; + + drm_mm_insert_helper_range(hole_node, node, size, alignment, + start, end); + + return node; +} + +int drm_mm_insert_node_in_range(struct drm_mm *mm, struct drm_mm_node *node, + unsigned long size, unsigned alignment, + unsigned long start, unsigned long end) +{ + struct drm_mm_node *hole_node; + + hole_node = drm_mm_search_free_in_range(mm, size, alignment, + start, end, 0); + if (!hole_node) + return -ENOSPC; + + drm_mm_insert_helper_range(hole_node, node, size, alignment, + start, end); + + return 0; +} + +void drm_mm_remove_node(struct drm_mm_node *node) +{ + struct drm_mm *mm = node->mm; + struct drm_mm_node *prev_node; + + KASSERT(!node->scanned_block && !node->scanned_prev_free + && !node->scanned_next_free, ("node")); + + prev_node = + list_entry(node->node_list.prev, struct drm_mm_node, node_list); + + if (node->hole_follows) { + KASSERT(drm_mm_hole_node_start(node) + != drm_mm_hole_node_end(node), ("hole_follows")); + list_del(&node->hole_stack); + } else + KASSERT(drm_mm_hole_node_start(node) + == drm_mm_hole_node_end(node), ("!hole_follows")); + + if (!prev_node->hole_follows) { + prev_node->hole_follows = 1; + list_add(&prev_node->hole_stack, &mm->hole_stack); + } else + list_move(&prev_node->hole_stack, &mm->hole_stack); + + list_del(&node->node_list); + node->allocated = 0; +} + +/* + * Put a block. Merge with the previous and / or next block if they are free. + * Otherwise add to the free stack. + */ + +void drm_mm_put_block(struct drm_mm_node *node) +{ + struct drm_mm *mm = node->mm; + + drm_mm_remove_node(node); + + mtx_lock(&mm->unused_lock); + if (mm->num_unused < MM_UNUSED_TARGET) { + list_add(&node->node_list, &mm->unused_nodes); + ++mm->num_unused; + } else + free(node, DRM_MEM_MM); + mtx_unlock(&mm->unused_lock); +} + +static int check_free_hole(unsigned long start, unsigned long end, + unsigned long size, unsigned alignment) +{ + unsigned wasted = 0; + + if (end - start < size) + return 0; + + if (alignment) { + unsigned tmp = start % alignment; + if (tmp) + wasted = alignment - tmp; + } + + if (end >= start + size + wasted) { + return 1; + } + + return 0; +} + + +struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, + unsigned long size, + unsigned alignment, int best_match) +{ + struct drm_mm_node *entry; + struct drm_mm_node *best; + unsigned long best_size; + + best = NULL; + best_size = ~0UL; + + list_for_each_entry(entry, &mm->hole_stack, hole_stack) { + KASSERT(entry->hole_follows, ("hole_follows")); + if (!check_free_hole(drm_mm_hole_node_start(entry), + drm_mm_hole_node_end(entry), + size, alignment)) + continue; + + if (!best_match) + return entry; + + if (entry->size < best_size) { + best = entry; + best_size = entry->size; + } + } + + return best; +} + +struct drm_mm_node *drm_mm_search_free_in_range(const struct drm_mm *mm, + unsigned long size, + unsigned alignment, + unsigned long start, + unsigned long end, + int best_match) +{ + struct drm_mm_node *entry; + struct drm_mm_node *best; + unsigned long best_size; + + KASSERT(!mm->scanned_blocks, ("scanned")); + + best = NULL; + best_size = ~0UL; + + list_for_each_entry(entry, &mm->hole_stack, hole_stack) { + unsigned long adj_start = drm_mm_hole_node_start(entry) < start ? + start : drm_mm_hole_node_start(entry); + unsigned long adj_end = drm_mm_hole_node_end(entry) > end ? + end : drm_mm_hole_node_end(entry); + + KASSERT(entry->hole_follows, ("hole_follows")); + if (!check_free_hole(adj_start, adj_end, size, alignment)) + continue; + + if (!best_match) + return entry; + + if (entry->size < best_size) { + best = entry; + best_size = entry->size; + } + } + + return best; +} + +void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new) +{ + list_replace(&old->node_list, &new->node_list); + list_replace(&old->hole_stack, &new->hole_stack); + new->hole_follows = old->hole_follows; + new->mm = old->mm; + new->start = old->start; + new->size = old->size; + + old->allocated = 0; + new->allocated = 1; +} + +void drm_mm_init_scan(struct drm_mm *mm, unsigned long size, + unsigned alignment) +{ + mm->scan_alignment = alignment; + mm->scan_size = size; + mm->scanned_blocks = 0; + mm->scan_hit_start = 0; + mm->scan_hit_size = 0; + mm->scan_check_range = 0; + mm->prev_scanned_node = NULL; +} + +void drm_mm_init_scan_with_range(struct drm_mm *mm, unsigned long size, + unsigned alignment, + unsigned long start, + unsigned long end) +{ + mm->scan_alignment = alignment; + mm->scan_size = size; + mm->scanned_blocks = 0; + mm->scan_hit_start = 0; + mm->scan_hit_size = 0; + mm->scan_start = start; + mm->scan_end = end; + mm->scan_check_range = 1; + mm->prev_scanned_node = NULL; +} + +int drm_mm_scan_add_block(struct drm_mm_node *node) +{ + struct drm_mm *mm = node->mm; + struct drm_mm_node *prev_node; + unsigned long hole_start, hole_end; + unsigned long adj_start; + unsigned long adj_end; + + mm->scanned_blocks++; + + KASSERT(!node->scanned_block, ("node->scanned_block")); + node->scanned_block = 1; + + prev_node = list_entry(node->node_list.prev, struct drm_mm_node, + node_list); + + node->scanned_preceeds_hole = prev_node->hole_follows; + prev_node->hole_follows = 1; + list_del(&node->node_list); + node->node_list.prev = &prev_node->node_list; + node->node_list.next = &mm->prev_scanned_node->node_list; + mm->prev_scanned_node = node; + + hole_start = drm_mm_hole_node_start(prev_node); + hole_end = drm_mm_hole_node_end(prev_node); + if (mm->scan_check_range) { + adj_start = hole_start < mm->scan_start ? + mm->scan_start : hole_start; + adj_end = hole_end > mm->scan_end ? + mm->scan_end : hole_end; + } else { + adj_start = hole_start; + adj_end = hole_end; + } + + if (check_free_hole(adj_start , adj_end, + mm->scan_size, mm->scan_alignment)) { + mm->scan_hit_start = hole_start; + mm->scan_hit_size = hole_end; + + return 1; + } + + return 0; +} + +int drm_mm_scan_remove_block(struct drm_mm_node *node) +{ + struct drm_mm *mm = node->mm; + struct drm_mm_node *prev_node; + + mm->scanned_blocks--; + + KASSERT(node->scanned_block, ("scanned_block")); + node->scanned_block = 0; + + prev_node = list_entry(node->node_list.prev, struct drm_mm_node, + node_list); + + prev_node->hole_follows = node->scanned_preceeds_hole; + INIT_LIST_HEAD(&node->node_list); + list_add(&node->node_list, &prev_node->node_list); + + /* Only need to check for containement because start&size for the + * complete resulting free block (not just the desired part) is + * stored. */ + if (node->start >= mm->scan_hit_start && + node->start + node->size + <= mm->scan_hit_start + mm->scan_hit_size) { + return 1; + } + + return 0; +} + +int drm_mm_clean(struct drm_mm * mm) +{ + struct list_head *head = &mm->head_node.node_list; + + return (head->next->next == head); +} + +int drm_mm_init(struct drm_mm * mm, unsigned long start, unsigned long size) +{ + INIT_LIST_HEAD(&mm->hole_stack); + INIT_LIST_HEAD(&mm->unused_nodes); + mm->num_unused = 0; + mm->scanned_blocks = 0; + mtx_init(&mm->unused_lock, "drm_unused", NULL, MTX_DEF); + + INIT_LIST_HEAD(&mm->head_node.node_list); + INIT_LIST_HEAD(&mm->head_node.hole_stack); + mm->head_node.hole_follows = 1; + mm->head_node.scanned_block = 0; + mm->head_node.scanned_prev_free = 0; + mm->head_node.scanned_next_free = 0; + mm->head_node.mm = mm; + mm->head_node.start = start + size; + mm->head_node.size = start - mm->head_node.start; + list_add_tail(&mm->head_node.hole_stack, &mm->hole_stack); + + return 0; +} + +void drm_mm_takedown(struct drm_mm * mm) +{ + struct drm_mm_node *entry, *next; + + if (!list_empty(&mm->head_node.node_list)) { + DRM_ERROR("Memory manager not clean. Delaying takedown\n"); + return; + } + + mtx_lock(&mm->unused_lock); + list_for_each_entry_safe(entry, next, &mm->unused_nodes, node_list) { + list_del(&entry->node_list); + free(entry, DRM_MEM_MM); + --mm->num_unused; + } + mtx_unlock(&mm->unused_lock); + + mtx_destroy(&mm->unused_lock); + + KASSERT(mm->num_unused == 0, ("num_unused != 0")); +} diff --git a/sys/dev/drm2/drm_mm.h b/sys/dev/drm2/drm_mm.h new file mode 100644 index 00000000000..7b173af897b --- /dev/null +++ b/sys/dev/drm2/drm_mm.h @@ -0,0 +1,185 @@ +/************************************************************************** + * + * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX. USA. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + **************************************************************************/ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Authors: + * Thomas Hellstrom + */ + +#ifndef _DRM_MM_H_ +#define _DRM_MM_H_ + +#include + +struct drm_mm_node { + struct list_head node_list; + struct list_head hole_stack; + unsigned hole_follows : 1; + unsigned scanned_block : 1; + unsigned scanned_prev_free : 1; + unsigned scanned_next_free : 1; + unsigned scanned_preceeds_hole : 1; + unsigned allocated : 1; + unsigned long start; + unsigned long size; + struct drm_mm *mm; + void *private; +}; + +struct drm_mm { + struct list_head hole_stack; + struct drm_mm_node head_node; + struct list_head unused_nodes; + int num_unused; + struct mtx unused_lock; + unsigned int scan_check_range : 1; + unsigned scan_alignment; + unsigned long scan_size; + unsigned long scan_hit_start; + unsigned scan_hit_size; + unsigned scanned_blocks; + unsigned long scan_start; + unsigned long scan_end; + struct drm_mm_node *prev_scanned_node; +}; + +static inline bool drm_mm_node_allocated(struct drm_mm_node *node) +{ + return node->allocated; +} + +static inline bool drm_mm_initialized(struct drm_mm *mm) +{ + return (mm->hole_stack.next != NULL); +} +#define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ + &(mm)->head_node.node_list, \ + node_list) +#define drm_mm_for_each_scanned_node_reverse(entry, n, mm) \ + for (entry = (mm)->prev_scanned_node, \ + next = entry ? list_entry(entry->node_list.next, \ + struct drm_mm_node, node_list) : NULL; \ + entry != NULL; entry = next, \ + next = entry ? list_entry(entry->node_list.next, \ + struct drm_mm_node, node_list) : NULL) + +/* + * Basic range manager support (drm_mm.c) + */ +extern struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node, + unsigned long size, + unsigned alignment, + int atomic); +extern struct drm_mm_node *drm_mm_get_block_range_generic( + struct drm_mm_node *node, + unsigned long size, + unsigned alignment, + unsigned long start, + unsigned long end, + int atomic); +static inline struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *parent, + unsigned long size, + unsigned alignment) +{ + return drm_mm_get_block_generic(parent, size, alignment, 0); +} +static inline struct drm_mm_node *drm_mm_get_block_atomic(struct drm_mm_node *parent, + unsigned long size, + unsigned alignment) +{ + return drm_mm_get_block_generic(parent, size, alignment, 1); +} +static inline struct drm_mm_node *drm_mm_get_block_range( + struct drm_mm_node *parent, + unsigned long size, + unsigned alignment, + unsigned long start, + unsigned long end) +{ + return drm_mm_get_block_range_generic(parent, size, alignment, + start, end, 0); +} +static inline struct drm_mm_node *drm_mm_get_block_atomic_range( + struct drm_mm_node *parent, + unsigned long size, + unsigned alignment, + unsigned long start, + unsigned long end) +{ + return drm_mm_get_block_range_generic(parent, size, alignment, + start, end, 1); +} +extern int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node, + unsigned long size, unsigned alignment); +extern int drm_mm_insert_node_in_range(struct drm_mm *mm, + struct drm_mm_node *node, + unsigned long size, unsigned alignment, + unsigned long start, unsigned long end); +extern void drm_mm_put_block(struct drm_mm_node *cur); +extern void drm_mm_remove_node(struct drm_mm_node *node); +extern void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); +extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, + unsigned long size, + unsigned alignment, + int best_match); +extern struct drm_mm_node *drm_mm_search_free_in_range( + const struct drm_mm *mm, + unsigned long size, + unsigned alignment, + unsigned long start, + unsigned long end, + int best_match); +extern int drm_mm_init(struct drm_mm *mm, unsigned long start, + unsigned long size); +extern void drm_mm_takedown(struct drm_mm *mm); +extern int drm_mm_clean(struct drm_mm *mm); +extern unsigned long drm_mm_tail_space(struct drm_mm *mm); +extern int drm_mm_remove_space_from_tail(struct drm_mm *mm, + unsigned long size); +extern int drm_mm_add_space_to_tail(struct drm_mm *mm, + unsigned long size, int atomic); +extern int drm_mm_pre_get(struct drm_mm *mm); + +static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) +{ + return block->mm; +} + +void drm_mm_init_scan(struct drm_mm *mm, unsigned long size, + unsigned alignment); +void drm_mm_init_scan_with_range(struct drm_mm *mm, unsigned long size, + unsigned alignment, + unsigned long start, + unsigned long end); +int drm_mm_scan_add_block(struct drm_mm_node *node); +int drm_mm_scan_remove_block(struct drm_mm_node *node); + +#endif diff --git a/sys/dev/drm2/drm_mode.h b/sys/dev/drm2/drm_mode.h new file mode 100644 index 00000000000..bc2824011d1 --- /dev/null +++ b/sys/dev/drm2/drm_mode.h @@ -0,0 +1,444 @@ +/* + * Copyright (c) 2007 Dave Airlie + * Copyright (c) 2007 Jakob Bornecrantz + * Copyright (c) 2008 Red Hat Inc. + * Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA + * Copyright (c) 2007-2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef _DRM_MODE_H +#define _DRM_MODE_H + +#define DRM_DISPLAY_INFO_LEN 32 +#define DRM_CONNECTOR_NAME_LEN 32 +#define DRM_DISPLAY_MODE_LEN 32 +#define DRM_PROP_NAME_LEN 32 + +#define DRM_MODE_TYPE_BUILTIN (1<<0) +#define DRM_MODE_TYPE_CLOCK_C ((1<<1) | DRM_MODE_TYPE_BUILTIN) +#define DRM_MODE_TYPE_CRTC_C ((1<<2) | DRM_MODE_TYPE_BUILTIN) +#define DRM_MODE_TYPE_PREFERRED (1<<3) +#define DRM_MODE_TYPE_DEFAULT (1<<4) +#define DRM_MODE_TYPE_USERDEF (1<<5) +#define DRM_MODE_TYPE_DRIVER (1<<6) + +/* Video mode flags */ +/* bit compatible with the xorg definitions. */ +#define DRM_MODE_FLAG_PHSYNC (1<<0) +#define DRM_MODE_FLAG_NHSYNC (1<<1) +#define DRM_MODE_FLAG_PVSYNC (1<<2) +#define DRM_MODE_FLAG_NVSYNC (1<<3) +#define DRM_MODE_FLAG_INTERLACE (1<<4) +#define DRM_MODE_FLAG_DBLSCAN (1<<5) +#define DRM_MODE_FLAG_CSYNC (1<<6) +#define DRM_MODE_FLAG_PCSYNC (1<<7) +#define DRM_MODE_FLAG_NCSYNC (1<<8) +#define DRM_MODE_FLAG_HSKEW (1<<9) /* hskew provided */ +#define DRM_MODE_FLAG_BCAST (1<<10) +#define DRM_MODE_FLAG_PIXMUX (1<<11) +#define DRM_MODE_FLAG_DBLCLK (1<<12) +#define DRM_MODE_FLAG_CLKDIV2 (1<<13) + +/* DPMS flags */ +/* bit compatible with the xorg definitions. */ +#define DRM_MODE_DPMS_ON 0 +#define DRM_MODE_DPMS_STANDBY 1 +#define DRM_MODE_DPMS_SUSPEND 2 +#define DRM_MODE_DPMS_OFF 3 + +/* Scaling mode options */ +#define DRM_MODE_SCALE_NONE 0 /* Unmodified timing (display or + software can still scale) */ +#define DRM_MODE_SCALE_FULLSCREEN 1 /* Full screen, ignore aspect */ +#define DRM_MODE_SCALE_CENTER 2 /* Centered, no scaling */ +#define DRM_MODE_SCALE_ASPECT 3 /* Full screen, preserve aspect */ + +/* Dithering mode options */ +#define DRM_MODE_DITHERING_OFF 0 +#define DRM_MODE_DITHERING_ON 1 +#define DRM_MODE_DITHERING_AUTO 2 + +/* Dirty info options */ +#define DRM_MODE_DIRTY_OFF 0 +#define DRM_MODE_DIRTY_ON 1 +#define DRM_MODE_DIRTY_ANNOTATE 2 + +struct drm_mode_modeinfo { + uint32_t clock; + uint16_t hdisplay, hsync_start, hsync_end, htotal, hskew; + uint16_t vdisplay, vsync_start, vsync_end, vtotal, vscan; + + uint32_t vrefresh; + + uint32_t flags; + uint32_t type; + char name[DRM_DISPLAY_MODE_LEN]; +}; + +struct drm_mode_card_res { + uint64_t fb_id_ptr; + uint64_t crtc_id_ptr; + uint64_t connector_id_ptr; + uint64_t encoder_id_ptr; + uint32_t count_fbs; + uint32_t count_crtcs; + uint32_t count_connectors; + uint32_t count_encoders; + uint32_t min_width, max_width; + uint32_t min_height, max_height; +}; + +struct drm_mode_crtc { + uint64_t set_connectors_ptr; + uint32_t count_connectors; + + uint32_t crtc_id; /**< Id */ + uint32_t fb_id; /**< Id of framebuffer */ + + uint32_t x, y; /**< Position on the frameuffer */ + + uint32_t gamma_size; + uint32_t mode_valid; + struct drm_mode_modeinfo mode; +}; + +#define DRM_MODE_PRESENT_TOP_FIELD (1<<0) +#define DRM_MODE_PRESENT_BOTTOM_FIELD (1<<1) + +/* Planes blend with or override other bits on the CRTC */ +struct drm_mode_set_plane { + uint32_t plane_id; + uint32_t crtc_id; + uint32_t fb_id; /* fb object contains surface format type */ + uint32_t flags; /* see above flags */ + + /* Signed dest location allows it to be partially off screen */ + int32_t crtc_x, crtc_y; + uint32_t crtc_w, crtc_h; + + /* Source values are 16.16 fixed point */ + uint32_t src_x, src_y; + uint32_t src_h, src_w; +}; + +struct drm_mode_get_plane { + uint32_t plane_id; + + uint32_t crtc_id; + uint32_t fb_id; + + uint32_t possible_crtcs; + uint32_t gamma_size; + + uint32_t count_format_types; + uint64_t format_type_ptr; +}; + +struct drm_mode_get_plane_res { + uint64_t plane_id_ptr; + uint32_t count_planes; +}; + +#define DRM_MODE_ENCODER_NONE 0 +#define DRM_MODE_ENCODER_DAC 1 +#define DRM_MODE_ENCODER_TMDS 2 +#define DRM_MODE_ENCODER_LVDS 3 +#define DRM_MODE_ENCODER_TVDAC 4 + +struct drm_mode_get_encoder { + uint32_t encoder_id; + uint32_t encoder_type; + + uint32_t crtc_id; /**< Id of crtc */ + + uint32_t possible_crtcs; + uint32_t possible_clones; +}; + +/* This is for connectors with multiple signal types. */ +/* Try to match DRM_MODE_CONNECTOR_X as closely as possible. */ +#define DRM_MODE_SUBCONNECTOR_Automatic 0 +#define DRM_MODE_SUBCONNECTOR_Unknown 0 +#define DRM_MODE_SUBCONNECTOR_DVID 3 +#define DRM_MODE_SUBCONNECTOR_DVIA 4 +#define DRM_MODE_SUBCONNECTOR_Composite 5 +#define DRM_MODE_SUBCONNECTOR_SVIDEO 6 +#define DRM_MODE_SUBCONNECTOR_Component 8 +#define DRM_MODE_SUBCONNECTOR_SCART 9 + +#define DRM_MODE_CONNECTOR_Unknown 0 +#define DRM_MODE_CONNECTOR_VGA 1 +#define DRM_MODE_CONNECTOR_DVII 2 +#define DRM_MODE_CONNECTOR_DVID 3 +#define DRM_MODE_CONNECTOR_DVIA 4 +#define DRM_MODE_CONNECTOR_Composite 5 +#define DRM_MODE_CONNECTOR_SVIDEO 6 +#define DRM_MODE_CONNECTOR_LVDS 7 +#define DRM_MODE_CONNECTOR_Component 8 +#define DRM_MODE_CONNECTOR_9PinDIN 9 +#define DRM_MODE_CONNECTOR_DisplayPort 10 +#define DRM_MODE_CONNECTOR_HDMIA 11 +#define DRM_MODE_CONNECTOR_HDMIB 12 +#define DRM_MODE_CONNECTOR_TV 13 +#define DRM_MODE_CONNECTOR_eDP 14 + +struct drm_mode_get_connector { + + uint64_t encoders_ptr; + uint64_t modes_ptr; + uint64_t props_ptr; + uint64_t prop_values_ptr; + + uint32_t count_modes; + uint32_t count_props; + uint32_t count_encoders; + + uint32_t encoder_id; /**< Current Encoder */ + uint32_t connector_id; /**< Id */ + uint32_t connector_type; + uint32_t connector_type_id; + + uint32_t connection; + uint32_t mm_width, mm_height; /**< HxW in millimeters */ + uint32_t subpixel; +}; + +#define DRM_MODE_PROP_PENDING (1<<0) +#define DRM_MODE_PROP_RANGE (1<<1) +#define DRM_MODE_PROP_IMMUTABLE (1<<2) +#define DRM_MODE_PROP_ENUM (1<<3) /* enumerated type with text strings */ +#define DRM_MODE_PROP_BLOB (1<<4) + +struct drm_mode_property_enum { + uint64_t value; + char name[DRM_PROP_NAME_LEN]; +}; + +struct drm_mode_get_property { + uint64_t values_ptr; /* values and blob lengths */ + uint64_t enum_blob_ptr; /* enum and blob id ptrs */ + + uint32_t prop_id; + uint32_t flags; + char name[DRM_PROP_NAME_LEN]; + + uint32_t count_values; + uint32_t count_enum_blobs; +}; + +struct drm_mode_connector_set_property { + uint64_t value; + uint32_t prop_id; + uint32_t connector_id; +}; + +struct drm_mode_get_blob { + uint32_t blob_id; + uint32_t length; + uint64_t data; +}; + +struct drm_mode_fb_cmd { + uint32_t fb_id; + uint32_t width, height; + uint32_t pitch; + uint32_t bpp; + uint32_t depth; + /* driver specific handle */ + uint32_t handle; +}; + +#define DRM_MODE_FB_INTERLACED (1<<0 /* for interlaced framebuffers */ + +struct drm_mode_fb_cmd2 { + uint32_t fb_id; + uint32_t width, height; + uint32_t pixel_format; /* fourcc code from drm_fourcc.h */ + uint32_t flags; /* see above flags */ + + /* + * In case of planar formats, this ioctl allows up to 4 + * buffer objects with offets and pitches per plane. + * The pitch and offset order is dictated by the fourcc, + * e.g. NV12 (http://fourcc.org/yuv.php#NV12) is described as: + * + * YUV 4:2:0 image with a plane of 8 bit Y samples + * followed by an interleaved U/V plane containing + * 8 bit 2x2 subsampled colour difference samples. + * + * So it would consist of Y as offset[0] and UV as + * offeset[1]. Note that offset[0] will generally + * be 0. + */ + uint32_t handles[4]; + uint32_t pitches[4]; /* pitch for each plane */ + uint32_t offsets[4]; /* offset of each plane */ +}; + +#define DRM_MODE_FB_DIRTY_ANNOTATE_COPY 0x01 +#define DRM_MODE_FB_DIRTY_ANNOTATE_FILL 0x02 +#define DRM_MODE_FB_DIRTY_FLAGS 0x03 + +#define DRM_MODE_FB_DIRTY_MAX_CLIPS 256 + +/* + * Mark a region of a framebuffer as dirty. + * + * Some hardware does not automatically update display contents + * as a hardware or software draw to a framebuffer. This ioctl + * allows userspace to tell the kernel and the hardware what + * regions of the framebuffer have changed. + * + * The kernel or hardware is free to update more then just the + * region specified by the clip rects. The kernel or hardware + * may also delay and/or coalesce several calls to dirty into a + * single update. + * + * Userspace may annotate the updates, the annotates are a + * promise made by the caller that the change is either a copy + * of pixels or a fill of a single color in the region specified. + * + * If the DRM_MODE_FB_DIRTY_ANNOTATE_COPY flag is given then + * the number of updated regions are half of num_clips given, + * where the clip rects are paired in src and dst. The width and + * height of each one of the pairs must match. + * + * If the DRM_MODE_FB_DIRTY_ANNOTATE_FILL flag is given the caller + * promises that the region specified of the clip rects is filled + * completely with a single color as given in the color argument. + */ + +struct drm_mode_fb_dirty_cmd { + uint32_t fb_id; + uint32_t flags; + uint32_t color; + uint32_t num_clips; + uint64_t clips_ptr; +}; + +struct drm_mode_mode_cmd { + uint32_t connector_id; + struct drm_mode_modeinfo mode; +}; + +#define DRM_MODE_CURSOR_BO (1<<0) +#define DRM_MODE_CURSOR_MOVE (1<<1) + +/* + * depending on the value in flags diffrent members are used. + * + * CURSOR_BO uses + * crtc + * width + * height + * handle - if 0 turns the cursor of + * + * CURSOR_MOVE uses + * crtc + * x + * y + */ +struct drm_mode_cursor { + uint32_t flags; + uint32_t crtc_id; + int32_t x; + int32_t y; + uint32_t width; + uint32_t height; + /* driver specific handle */ + uint32_t handle; +}; + +struct drm_mode_crtc_lut { + uint32_t crtc_id; + uint32_t gamma_size; + + /* pointers to arrays */ + uint64_t red; + uint64_t green; + uint64_t blue; +}; + +#define DRM_MODE_PAGE_FLIP_EVENT 0x01 +#define DRM_MODE_PAGE_FLIP_FLAGS DRM_MODE_PAGE_FLIP_EVENT + +/* + * Request a page flip on the specified crtc. + * + * This ioctl will ask KMS to schedule a page flip for the specified + * crtc. Once any pending rendering targeting the specified fb (as of + * ioctl time) has completed, the crtc will be reprogrammed to display + * that fb after the next vertical refresh. The ioctl returns + * immediately, but subsequent rendering to the current fb will block + * in the execbuffer ioctl until the page flip happens. If a page + * flip is already pending as the ioctl is called, EBUSY will be + * returned. + * + * The ioctl supports one flag, DRM_MODE_PAGE_FLIP_EVENT, which will + * request that drm sends back a vblank event (see drm.h: struct + * drm_event_vblank) when the page flip is done. The user_data field + * passed in with this ioctl will be returned as the user_data field + * in the vblank event struct. + * + * The reserved field must be zero until we figure out something + * clever to use it for. + */ + +struct drm_mode_crtc_page_flip { + uint32_t crtc_id; + uint32_t fb_id; + uint32_t flags; + uint32_t reserved; + uint64_t user_data; +}; + +/* create a dumb scanout buffer */ +struct drm_mode_create_dumb { + uint32_t height; + uint32_t width; + uint32_t bpp; + uint32_t flags; + /* handle, pitch, size will be returned */ + uint32_t handle; + uint32_t pitch; + uint64_t size; +}; + +/* set up for mmap of a dumb scanout buffer */ +struct drm_mode_map_dumb { + /** Handle for the object being mapped. */ + uint32_t handle; + uint32_t pad; + /** + * Fake offset to use for subsequent mmap call + * + * This is a fixed-size type for 32/64 compatibility. + */ + uint64_t offset; +}; + +struct drm_mode_destroy_dumb { + uint32_t handle; +}; + +#endif diff --git a/sys/dev/drm2/drm_modes.c b/sys/dev/drm2/drm_modes.c new file mode 100644 index 00000000000..a2dbbdd58a5 --- /dev/null +++ b/sys/dev/drm2/drm_modes.c @@ -0,0 +1,1147 @@ +/* + * Copyright © 1997-2003 by The XFree86 Project, Inc. + * Copyright © 2007 Dave Airlie + * Copyright © 2007-2008 Intel Corporation + * Jesse Barnes + * Copyright 2005-2006 Luc Verhaegen + * Copyright (c) 2001, Andy Ritger aritger@nvidia.com + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of the copyright holder(s) + * and author(s) shall not be used in advertising or otherwise to promote + * the sale, use or other dealings in this Software without prior written + * authorization from the copyright holder(s) and author(s). + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +#define KHZ2PICOS(a) (1000000000UL/(a)) + +/** + * drm_mode_debug_printmodeline - debug print a mode + * @dev: DRM device + * @mode: mode to print + * + * LOCKING: + * None. + * + * Describe @mode using DRM_DEBUG. + */ +void drm_mode_debug_printmodeline(struct drm_display_mode *mode) +{ + DRM_DEBUG_KMS("Modeline %d:\"%s\" %d %d %d %d %d %d %d %d %d %d " + "0x%x 0x%x\n", + mode->base.id, mode->name, mode->vrefresh, mode->clock, + mode->hdisplay, mode->hsync_start, + mode->hsync_end, mode->htotal, + mode->vdisplay, mode->vsync_start, + mode->vsync_end, mode->vtotal, mode->type, mode->flags); +} + +/** + * drm_cvt_mode -create a modeline based on CVT algorithm + * @dev: DRM device + * @hdisplay: hdisplay size + * @vdisplay: vdisplay size + * @vrefresh : vrefresh rate + * @reduced : Whether the GTF calculation is simplified + * @interlaced:Whether the interlace is supported + * + * LOCKING: + * none. + * + * return the modeline based on CVT algorithm + * + * This function is called to generate the modeline based on CVT algorithm + * according to the hdisplay, vdisplay, vrefresh. + * It is based from the VESA(TM) Coordinated Video Timing Generator by + * Graham Loveridge April 9, 2003 available at + * http://www.elo.utfsm.cl/~elo212/docs/CVTd6r1.xls + * + * And it is copied from xf86CVTmode in xserver/hw/xfree86/modes/xf86cvt.c. + * What I have done is to translate it by using integer calculation. + */ +#define HV_FACTOR 1000 +struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, int hdisplay, + int vdisplay, int vrefresh, + bool reduced, bool interlaced, bool margins) +{ + /* 1) top/bottom margin size (% of height) - default: 1.8, */ +#define CVT_MARGIN_PERCENTAGE 18 + /* 2) character cell horizontal granularity (pixels) - default 8 */ +#define CVT_H_GRANULARITY 8 + /* 3) Minimum vertical porch (lines) - default 3 */ +#define CVT_MIN_V_PORCH 3 + /* 4) Minimum number of vertical back porch lines - default 6 */ +#define CVT_MIN_V_BPORCH 6 + /* Pixel Clock step (kHz) */ +#define CVT_CLOCK_STEP 250 + struct drm_display_mode *drm_mode; + unsigned int vfieldrate, hperiod; + int hdisplay_rnd, hmargin, vdisplay_rnd, vmargin, vsync; + int interlace; + + /* allocate the drm_display_mode structure. If failure, we will + * return directly + */ + drm_mode = drm_mode_create(dev); + if (!drm_mode) + return NULL; + + /* the CVT default refresh rate is 60Hz */ + if (!vrefresh) + vrefresh = 60; + + /* the required field fresh rate */ + if (interlaced) + vfieldrate = vrefresh * 2; + else + vfieldrate = vrefresh; + + /* horizontal pixels */ + hdisplay_rnd = hdisplay - (hdisplay % CVT_H_GRANULARITY); + + /* determine the left&right borders */ + hmargin = 0; + if (margins) { + hmargin = hdisplay_rnd * CVT_MARGIN_PERCENTAGE / 1000; + hmargin -= hmargin % CVT_H_GRANULARITY; + } + /* find the total active pixels */ + drm_mode->hdisplay = hdisplay_rnd + 2 * hmargin; + + /* find the number of lines per field */ + if (interlaced) + vdisplay_rnd = vdisplay / 2; + else + vdisplay_rnd = vdisplay; + + /* find the top & bottom borders */ + vmargin = 0; + if (margins) + vmargin = vdisplay_rnd * CVT_MARGIN_PERCENTAGE / 1000; + + drm_mode->vdisplay = vdisplay + 2 * vmargin; + + /* Interlaced */ + if (interlaced) + interlace = 1; + else + interlace = 0; + + /* Determine VSync Width from aspect ratio */ + if (!(vdisplay % 3) && ((vdisplay * 4 / 3) == hdisplay)) + vsync = 4; + else if (!(vdisplay % 9) && ((vdisplay * 16 / 9) == hdisplay)) + vsync = 5; + else if (!(vdisplay % 10) && ((vdisplay * 16 / 10) == hdisplay)) + vsync = 6; + else if (!(vdisplay % 4) && ((vdisplay * 5 / 4) == hdisplay)) + vsync = 7; + else if (!(vdisplay % 9) && ((vdisplay * 15 / 9) == hdisplay)) + vsync = 7; + else /* custom */ + vsync = 10; + + if (!reduced) { + /* simplify the GTF calculation */ + /* 4) Minimum time of vertical sync + back porch interval (µs) + * default 550.0 + */ + int tmp1, tmp2; +#define CVT_MIN_VSYNC_BP 550 + /* 3) Nominal HSync width (% of line period) - default 8 */ +#define CVT_HSYNC_PERCENTAGE 8 + unsigned int hblank_percentage; + int vsyncandback_porch, vback_porch, hblank; + + /* estimated the horizontal period */ + tmp1 = HV_FACTOR * 1000000 - + CVT_MIN_VSYNC_BP * HV_FACTOR * vfieldrate; + tmp2 = (vdisplay_rnd + 2 * vmargin + CVT_MIN_V_PORCH) * 2 + + interlace; + hperiod = tmp1 * 2 / (tmp2 * vfieldrate); + + tmp1 = CVT_MIN_VSYNC_BP * HV_FACTOR / hperiod + 1; + /* 9. Find number of lines in sync + backporch */ + if (tmp1 < (vsync + CVT_MIN_V_PORCH)) + vsyncandback_porch = vsync + CVT_MIN_V_PORCH; + else + vsyncandback_porch = tmp1; + /* 10. Find number of lines in back porch */ + vback_porch = vsyncandback_porch - vsync; + drm_mode->vtotal = vdisplay_rnd + 2 * vmargin + + vsyncandback_porch + CVT_MIN_V_PORCH; + /* 5) Definition of Horizontal blanking time limitation */ + /* Gradient (%/kHz) - default 600 */ +#define CVT_M_FACTOR 600 + /* Offset (%) - default 40 */ +#define CVT_C_FACTOR 40 + /* Blanking time scaling factor - default 128 */ +#define CVT_K_FACTOR 128 + /* Scaling factor weighting - default 20 */ +#define CVT_J_FACTOR 20 +#define CVT_M_PRIME (CVT_M_FACTOR * CVT_K_FACTOR / 256) +#define CVT_C_PRIME ((CVT_C_FACTOR - CVT_J_FACTOR) * CVT_K_FACTOR / 256 + \ + CVT_J_FACTOR) + /* 12. Find ideal blanking duty cycle from formula */ + hblank_percentage = CVT_C_PRIME * HV_FACTOR - CVT_M_PRIME * + hperiod / 1000; + /* 13. Blanking time */ + if (hblank_percentage < 20 * HV_FACTOR) + hblank_percentage = 20 * HV_FACTOR; + hblank = drm_mode->hdisplay * hblank_percentage / + (100 * HV_FACTOR - hblank_percentage); + hblank -= hblank % (2 * CVT_H_GRANULARITY); + /* 14. find the total pixes per line */ + drm_mode->htotal = drm_mode->hdisplay + hblank; + drm_mode->hsync_end = drm_mode->hdisplay + hblank / 2; + drm_mode->hsync_start = drm_mode->hsync_end - + (drm_mode->htotal * CVT_HSYNC_PERCENTAGE) / 100; + drm_mode->hsync_start += CVT_H_GRANULARITY - + drm_mode->hsync_start % CVT_H_GRANULARITY; + /* fill the Vsync values */ + drm_mode->vsync_start = drm_mode->vdisplay + CVT_MIN_V_PORCH; + drm_mode->vsync_end = drm_mode->vsync_start + vsync; + } else { + /* Reduced blanking */ + /* Minimum vertical blanking interval time (µs)- default 460 */ +#define CVT_RB_MIN_VBLANK 460 + /* Fixed number of clocks for horizontal sync */ +#define CVT_RB_H_SYNC 32 + /* Fixed number of clocks for horizontal blanking */ +#define CVT_RB_H_BLANK 160 + /* Fixed number of lines for vertical front porch - default 3*/ +#define CVT_RB_VFPORCH 3 + int vbilines; + int tmp1, tmp2; + /* 8. Estimate Horizontal period. */ + tmp1 = HV_FACTOR * 1000000 - + CVT_RB_MIN_VBLANK * HV_FACTOR * vfieldrate; + tmp2 = vdisplay_rnd + 2 * vmargin; + hperiod = tmp1 / (tmp2 * vfieldrate); + /* 9. Find number of lines in vertical blanking */ + vbilines = CVT_RB_MIN_VBLANK * HV_FACTOR / hperiod + 1; + /* 10. Check if vertical blanking is sufficient */ + if (vbilines < (CVT_RB_VFPORCH + vsync + CVT_MIN_V_BPORCH)) + vbilines = CVT_RB_VFPORCH + vsync + CVT_MIN_V_BPORCH; + /* 11. Find total number of lines in vertical field */ + drm_mode->vtotal = vdisplay_rnd + 2 * vmargin + vbilines; + /* 12. Find total number of pixels in a line */ + drm_mode->htotal = drm_mode->hdisplay + CVT_RB_H_BLANK; + /* Fill in HSync values */ + drm_mode->hsync_end = drm_mode->hdisplay + CVT_RB_H_BLANK / 2; + drm_mode->hsync_start = drm_mode->hsync_end - CVT_RB_H_SYNC; + /* Fill in VSync values */ + drm_mode->vsync_start = drm_mode->vdisplay + CVT_RB_VFPORCH; + drm_mode->vsync_end = drm_mode->vsync_start + vsync; + } + /* 15/13. Find pixel clock frequency (kHz for xf86) */ + drm_mode->clock = drm_mode->htotal * HV_FACTOR * 1000 / hperiod; + drm_mode->clock -= drm_mode->clock % CVT_CLOCK_STEP; + /* 18/16. Find actual vertical frame frequency */ + /* ignore - just set the mode flag for interlaced */ + if (interlaced) { + drm_mode->vtotal *= 2; + drm_mode->flags |= DRM_MODE_FLAG_INTERLACE; + } + /* Fill the mode line name */ + drm_mode_set_name(drm_mode); + if (reduced) + drm_mode->flags |= (DRM_MODE_FLAG_PHSYNC | + DRM_MODE_FLAG_NVSYNC); + else + drm_mode->flags |= (DRM_MODE_FLAG_PVSYNC | + DRM_MODE_FLAG_NHSYNC); + + return drm_mode; +} + +/** + * drm_gtf_mode_complex - create the modeline based on full GTF algorithm + * + * @dev :drm device + * @hdisplay :hdisplay size + * @vdisplay :vdisplay size + * @vrefresh :vrefresh rate. + * @interlaced :whether the interlace is supported + * @margins :desired margin size + * @GTF_[MCKJ] :extended GTF formula parameters + * + * LOCKING. + * none. + * + * return the modeline based on full GTF algorithm. + * + * GTF feature blocks specify C and J in multiples of 0.5, so we pass them + * in here multiplied by two. For a C of 40, pass in 80. + */ +struct drm_display_mode * +drm_gtf_mode_complex(struct drm_device *dev, int hdisplay, int vdisplay, + int vrefresh, bool interlaced, int margins, + int GTF_M, int GTF_2C, int GTF_K, int GTF_2J) +{ /* 1) top/bottom margin size (% of height) - default: 1.8, */ +#define GTF_MARGIN_PERCENTAGE 18 + /* 2) character cell horizontal granularity (pixels) - default 8 */ +#define GTF_CELL_GRAN 8 + /* 3) Minimum vertical porch (lines) - default 3 */ +#define GTF_MIN_V_PORCH 1 + /* width of vsync in lines */ +#define V_SYNC_RQD 3 + /* width of hsync as % of total line */ +#define H_SYNC_PERCENT 8 + /* min time of vsync + back porch (microsec) */ +#define MIN_VSYNC_PLUS_BP 550 + /* C' and M' are part of the Blanking Duty Cycle computation */ +#define GTF_C_PRIME ((((GTF_2C - GTF_2J) * GTF_K / 256) + GTF_2J) / 2) +#define GTF_M_PRIME (GTF_K * GTF_M / 256) + struct drm_display_mode *drm_mode; + unsigned int hdisplay_rnd, vdisplay_rnd, vfieldrate_rqd; + int top_margin, bottom_margin; + int interlace; + unsigned int hfreq_est; + int vsync_plus_bp, vback_porch; + unsigned int vtotal_lines, vfieldrate_est, hperiod; + unsigned int vfield_rate, vframe_rate; + int left_margin, right_margin; + unsigned int total_active_pixels, ideal_duty_cycle; + unsigned int hblank, total_pixels, pixel_freq; + int hsync, hfront_porch, vodd_front_porch_lines; + unsigned int tmp1, tmp2; + + drm_mode = drm_mode_create(dev); + if (!drm_mode) + return NULL; + + /* 1. In order to give correct results, the number of horizontal + * pixels requested is first processed to ensure that it is divisible + * by the character size, by rounding it to the nearest character + * cell boundary: + */ + hdisplay_rnd = (hdisplay + GTF_CELL_GRAN / 2) / GTF_CELL_GRAN; + hdisplay_rnd = hdisplay_rnd * GTF_CELL_GRAN; + + /* 2. If interlace is requested, the number of vertical lines assumed + * by the calculation must be halved, as the computation calculates + * the number of vertical lines per field. + */ + if (interlaced) + vdisplay_rnd = vdisplay / 2; + else + vdisplay_rnd = vdisplay; + + /* 3. Find the frame rate required: */ + if (interlaced) + vfieldrate_rqd = vrefresh * 2; + else + vfieldrate_rqd = vrefresh; + + /* 4. Find number of lines in Top margin: */ + top_margin = 0; + if (margins) + top_margin = (vdisplay_rnd * GTF_MARGIN_PERCENTAGE + 500) / + 1000; + /* 5. Find number of lines in bottom margin: */ + bottom_margin = top_margin; + + /* 6. If interlace is required, then set variable interlace: */ + if (interlaced) + interlace = 1; + else + interlace = 0; + + /* 7. Estimate the Horizontal frequency */ + { + tmp1 = (1000000 - MIN_VSYNC_PLUS_BP * vfieldrate_rqd) / 500; + tmp2 = (vdisplay_rnd + 2 * top_margin + GTF_MIN_V_PORCH) * + 2 + interlace; + hfreq_est = (tmp2 * 1000 * vfieldrate_rqd) / tmp1; + } + + /* 8. Find the number of lines in V sync + back porch */ + /* [V SYNC+BP] = RINT(([MIN VSYNC+BP] * hfreq_est / 1000000)) */ + vsync_plus_bp = MIN_VSYNC_PLUS_BP * hfreq_est / 1000; + vsync_plus_bp = (vsync_plus_bp + 500) / 1000; + /* 9. Find the number of lines in V back porch alone: */ + vback_porch = vsync_plus_bp - V_SYNC_RQD; + /* 10. Find the total number of lines in Vertical field period: */ + vtotal_lines = vdisplay_rnd + top_margin + bottom_margin + + vsync_plus_bp + GTF_MIN_V_PORCH; + /* 11. Estimate the Vertical field frequency: */ + vfieldrate_est = hfreq_est / vtotal_lines; + /* 12. Find the actual horizontal period: */ + hperiod = 1000000 / (vfieldrate_rqd * vtotal_lines); + + /* 13. Find the actual Vertical field frequency: */ + vfield_rate = hfreq_est / vtotal_lines; + /* 14. Find the Vertical frame frequency: */ + if (interlaced) + vframe_rate = vfield_rate / 2; + else + vframe_rate = vfield_rate; + /* 15. Find number of pixels in left margin: */ + if (margins) + left_margin = (hdisplay_rnd * GTF_MARGIN_PERCENTAGE + 500) / + 1000; + else + left_margin = 0; + + /* 16.Find number of pixels in right margin: */ + right_margin = left_margin; + /* 17.Find total number of active pixels in image and left and right */ + total_active_pixels = hdisplay_rnd + left_margin + right_margin; + /* 18.Find the ideal blanking duty cycle from blanking duty cycle */ + ideal_duty_cycle = GTF_C_PRIME * 1000 - + (GTF_M_PRIME * 1000000 / hfreq_est); + /* 19.Find the number of pixels in the blanking time to the nearest + * double character cell: */ + hblank = total_active_pixels * ideal_duty_cycle / + (100000 - ideal_duty_cycle); + hblank = (hblank + GTF_CELL_GRAN) / (2 * GTF_CELL_GRAN); + hblank = hblank * 2 * GTF_CELL_GRAN; + /* 20.Find total number of pixels: */ + total_pixels = total_active_pixels + hblank; + /* 21.Find pixel clock frequency: */ + pixel_freq = total_pixels * hfreq_est / 1000; + /* Stage 1 computations are now complete; I should really pass + * the results to another function and do the Stage 2 computations, + * but I only need a few more values so I'll just append the + * computations here for now */ + /* 17. Find the number of pixels in the horizontal sync period: */ + hsync = H_SYNC_PERCENT * total_pixels / 100; + hsync = (hsync + GTF_CELL_GRAN / 2) / GTF_CELL_GRAN; + hsync = hsync * GTF_CELL_GRAN; + /* 18. Find the number of pixels in horizontal front porch period */ + hfront_porch = hblank / 2 - hsync; + /* 36. Find the number of lines in the odd front porch period: */ + vodd_front_porch_lines = GTF_MIN_V_PORCH ; + + /* finally, pack the results in the mode struct */ + drm_mode->hdisplay = hdisplay_rnd; + drm_mode->hsync_start = hdisplay_rnd + hfront_porch; + drm_mode->hsync_end = drm_mode->hsync_start + hsync; + drm_mode->htotal = total_pixels; + drm_mode->vdisplay = vdisplay_rnd; + drm_mode->vsync_start = vdisplay_rnd + vodd_front_porch_lines; + drm_mode->vsync_end = drm_mode->vsync_start + V_SYNC_RQD; + drm_mode->vtotal = vtotal_lines; + + drm_mode->clock = pixel_freq; + + if (interlaced) { + drm_mode->vtotal *= 2; + drm_mode->flags |= DRM_MODE_FLAG_INTERLACE; + } + + drm_mode_set_name(drm_mode); + if (GTF_M == 600 && GTF_2C == 80 && GTF_K == 128 && GTF_2J == 40) + drm_mode->flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC; + else + drm_mode->flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC; + + return drm_mode; +} + +/** + * drm_gtf_mode - create the modeline based on GTF algorithm + * + * @dev :drm device + * @hdisplay :hdisplay size + * @vdisplay :vdisplay size + * @vrefresh :vrefresh rate. + * @interlaced :whether the interlace is supported + * @margins :whether the margin is supported + * + * LOCKING. + * none. + * + * return the modeline based on GTF algorithm + * + * This function is to create the modeline based on the GTF algorithm. + * Generalized Timing Formula is derived from: + * GTF Spreadsheet by Andy Morrish (1/5/97) + * available at http://www.vesa.org + * + * And it is copied from the file of xserver/hw/xfree86/modes/xf86gtf.c. + * What I have done is to translate it by using integer calculation. + * I also refer to the function of fb_get_mode in the file of + * drivers/video/fbmon.c + * + * Standard GTF parameters: + * M = 600 + * C = 40 + * K = 128 + * J = 20 + */ +struct drm_display_mode * +drm_gtf_mode(struct drm_device *dev, int hdisplay, int vdisplay, int vrefresh, + bool lace, int margins) +{ + return drm_gtf_mode_complex(dev, hdisplay, vdisplay, vrefresh, lace, + margins, 600, 40 * 2, 128, 20 * 2); +} + +/** + * drm_mode_set_name - set the name on a mode + * @mode: name will be set in this mode + * + * LOCKING: + * None. + * + * Set the name of @mode to a standard format. + */ +void drm_mode_set_name(struct drm_display_mode *mode) +{ + bool interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); + + snprintf(mode->name, DRM_DISPLAY_MODE_LEN, "%dx%d%s", + mode->hdisplay, mode->vdisplay, + interlaced ? "i" : ""); +} + +/** + * drm_mode_list_concat - move modes from one list to another + * @head: source list + * @new: dst list + * + * LOCKING: + * Caller must ensure both lists are locked. + * + * Move all the modes from @head to @new. + */ +void drm_mode_list_concat(struct list_head *head, struct list_head *new) +{ + + struct list_head *entry, *tmp; + + list_for_each_safe(entry, tmp, head) { + list_move_tail(entry, new); + } +} + +/** + * drm_mode_width - get the width of a mode + * @mode: mode + * + * LOCKING: + * None. + * + * Return @mode's width (hdisplay) value. + * + * FIXME: is this needed? + * + * RETURNS: + * @mode->hdisplay + */ +int drm_mode_width(struct drm_display_mode *mode) +{ + return mode->hdisplay; + +} + +/** + * drm_mode_height - get the height of a mode + * @mode: mode + * + * LOCKING: + * None. + * + * Return @mode's height (vdisplay) value. + * + * FIXME: is this needed? + * + * RETURNS: + * @mode->vdisplay + */ +int drm_mode_height(struct drm_display_mode *mode) +{ + return mode->vdisplay; +} + +/** drm_mode_hsync - get the hsync of a mode + * @mode: mode + * + * LOCKING: + * None. + * + * Return @modes's hsync rate in kHz, rounded to the nearest int. + */ +int drm_mode_hsync(const struct drm_display_mode *mode) +{ + unsigned int calc_val; + + if (mode->hsync) + return mode->hsync; + + if (mode->htotal < 0) + return 0; + + calc_val = (mode->clock * 1000) / mode->htotal; /* hsync in Hz */ + calc_val += 500; /* round to 1000Hz */ + calc_val /= 1000; /* truncate to kHz */ + + return calc_val; +} + +/** + * drm_mode_vrefresh - get the vrefresh of a mode + * @mode: mode + * + * LOCKING: + * None. + * + * Return @mode's vrefresh rate in Hz or calculate it if necessary. + * + * FIXME: why is this needed? shouldn't vrefresh be set already? + * + * RETURNS: + * Vertical refresh rate. It will be the result of actual value plus 0.5. + * If it is 70.288, it will return 70Hz. + * If it is 59.6, it will return 60Hz. + */ +int drm_mode_vrefresh(const struct drm_display_mode *mode) +{ + int refresh = 0; + unsigned int calc_val; + + if (mode->vrefresh > 0) + refresh = mode->vrefresh; + else if (mode->htotal > 0 && mode->vtotal > 0) { + int vtotal; + vtotal = mode->vtotal; + /* work out vrefresh the value will be x1000 */ + calc_val = (mode->clock * 1000); + calc_val /= mode->htotal; + refresh = (calc_val + vtotal / 2) / vtotal; + + if (mode->flags & DRM_MODE_FLAG_INTERLACE) + refresh *= 2; + if (mode->flags & DRM_MODE_FLAG_DBLSCAN) + refresh /= 2; + if (mode->vscan > 1) + refresh /= mode->vscan; + } + return refresh; +} + +/** + * drm_mode_set_crtcinfo - set CRTC modesetting parameters + * @p: mode + * @adjust_flags: unused? (FIXME) + * + * LOCKING: + * None. + * + * Setup the CRTC modesetting parameters for @p, adjusting if necessary. + */ +void drm_mode_set_crtcinfo(struct drm_display_mode *p, int adjust_flags) +{ + if ((p == NULL) || ((p->type & DRM_MODE_TYPE_CRTC_C) == DRM_MODE_TYPE_BUILTIN)) + return; + + p->crtc_hdisplay = p->hdisplay; + p->crtc_hsync_start = p->hsync_start; + p->crtc_hsync_end = p->hsync_end; + p->crtc_htotal = p->htotal; + p->crtc_hskew = p->hskew; + p->crtc_vdisplay = p->vdisplay; + p->crtc_vsync_start = p->vsync_start; + p->crtc_vsync_end = p->vsync_end; + p->crtc_vtotal = p->vtotal; + + if (p->flags & DRM_MODE_FLAG_INTERLACE) { + if (adjust_flags & CRTC_INTERLACE_HALVE_V) { + p->crtc_vdisplay /= 2; + p->crtc_vsync_start /= 2; + p->crtc_vsync_end /= 2; + p->crtc_vtotal /= 2; + } + + p->crtc_vtotal |= 1; + } + + if (p->flags & DRM_MODE_FLAG_DBLSCAN) { + p->crtc_vdisplay *= 2; + p->crtc_vsync_start *= 2; + p->crtc_vsync_end *= 2; + p->crtc_vtotal *= 2; + } + + if (p->vscan > 1) { + p->crtc_vdisplay *= p->vscan; + p->crtc_vsync_start *= p->vscan; + p->crtc_vsync_end *= p->vscan; + p->crtc_vtotal *= p->vscan; + } + + p->crtc_vblank_start = min(p->crtc_vsync_start, p->crtc_vdisplay); + p->crtc_vblank_end = max(p->crtc_vsync_end, p->crtc_vtotal); + p->crtc_hblank_start = min(p->crtc_hsync_start, p->crtc_hdisplay); + p->crtc_hblank_end = max(p->crtc_hsync_end, p->crtc_htotal); + + p->crtc_hadjusted = false; + p->crtc_vadjusted = false; +} + + +/** + * drm_mode_duplicate - allocate and duplicate an existing mode + * @m: mode to duplicate + * + * LOCKING: + * None. + * + * Just allocate a new mode, copy the existing mode into it, and return + * a pointer to it. Used to create new instances of established modes. + */ +struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, + const struct drm_display_mode *mode) +{ + struct drm_display_mode *nmode; + int new_id; + + nmode = drm_mode_create(dev); + if (!nmode) + return NULL; + + new_id = nmode->base.id; + *nmode = *mode; + nmode->base.id = new_id; + INIT_LIST_HEAD(&nmode->head); + return nmode; +} + +/** + * drm_mode_equal - test modes for equality + * @mode1: first mode + * @mode2: second mode + * + * LOCKING: + * None. + * + * Check to see if @mode1 and @mode2 are equivalent. + * + * RETURNS: + * true if the modes are equal, false otherwise. + */ +bool drm_mode_equal(struct drm_display_mode *mode1, struct drm_display_mode *mode2) +{ + /* do clock check convert to PICOS so fb modes get matched + * the same */ + if (mode1->clock && mode2->clock) { + if (KHZ2PICOS(mode1->clock) != KHZ2PICOS(mode2->clock)) + return false; + } else if (mode1->clock != mode2->clock) + return false; + + if (mode1->hdisplay == mode2->hdisplay && + mode1->hsync_start == mode2->hsync_start && + mode1->hsync_end == mode2->hsync_end && + mode1->htotal == mode2->htotal && + mode1->hskew == mode2->hskew && + mode1->vdisplay == mode2->vdisplay && + mode1->vsync_start == mode2->vsync_start && + mode1->vsync_end == mode2->vsync_end && + mode1->vtotal == mode2->vtotal && + mode1->vscan == mode2->vscan && + mode1->flags == mode2->flags) + return true; + + return false; +} + +/** + * drm_mode_validate_size - make sure modes adhere to size constraints + * @dev: DRM device + * @mode_list: list of modes to check + * @maxX: maximum width + * @maxY: maximum height + * @maxPitch: max pitch + * + * LOCKING: + * Caller must hold a lock protecting @mode_list. + * + * The DRM device (@dev) has size and pitch limits. Here we validate the + * modes we probed for @dev against those limits and set their status as + * necessary. + */ +void drm_mode_validate_size(struct drm_device *dev, + struct list_head *mode_list, + int maxX, int maxY, int maxPitch) +{ + struct drm_display_mode *mode; + + list_for_each_entry(mode, mode_list, head) { + if (maxPitch > 0 && mode->hdisplay > maxPitch) + mode->status = MODE_BAD_WIDTH; + + if (maxX > 0 && mode->hdisplay > maxX) + mode->status = MODE_VIRTUAL_X; + + if (maxY > 0 && mode->vdisplay > maxY) + mode->status = MODE_VIRTUAL_Y; + } +} + +/** + * drm_mode_validate_clocks - validate modes against clock limits + * @dev: DRM device + * @mode_list: list of modes to check + * @min: minimum clock rate array + * @max: maximum clock rate array + * @n_ranges: number of clock ranges (size of arrays) + * + * LOCKING: + * Caller must hold a lock protecting @mode_list. + * + * Some code may need to check a mode list against the clock limits of the + * device in question. This function walks the mode list, testing to make + * sure each mode falls within a given range (defined by @min and @max + * arrays) and sets @mode->status as needed. + */ +void drm_mode_validate_clocks(struct drm_device *dev, + struct list_head *mode_list, + int *min, int *max, int n_ranges) +{ + struct drm_display_mode *mode; + int i; + + list_for_each_entry(mode, mode_list, head) { + bool good = false; + for (i = 0; i < n_ranges; i++) { + if (mode->clock >= min[i] && mode->clock <= max[i]) { + good = true; + break; + } + } + if (!good) + mode->status = MODE_CLOCK_RANGE; + } +} + +/** + * drm_mode_prune_invalid - remove invalid modes from mode list + * @dev: DRM device + * @mode_list: list of modes to check + * @verbose: be verbose about it + * + * LOCKING: + * Caller must hold a lock protecting @mode_list. + * + * Once mode list generation is complete, a caller can use this routine to + * remove invalid modes from a mode list. If any of the modes have a + * status other than %MODE_OK, they are removed from @mode_list and freed. + */ +void drm_mode_prune_invalid(struct drm_device *dev, + struct list_head *mode_list, bool verbose) +{ + struct drm_display_mode *mode, *t; + + list_for_each_entry_safe(mode, t, mode_list, head) { + if (mode->status != MODE_OK) { + list_del(&mode->head); + if (verbose) { + drm_mode_debug_printmodeline(mode); + DRM_DEBUG_KMS("Not using %s mode %d\n", + mode->name, mode->status); + } + drm_mode_destroy(dev, mode); + } + } +} + +/** + * drm_mode_compare - compare modes for favorability + * @priv: unused + * @lh_a: list_head for first mode + * @lh_b: list_head for second mode + * + * LOCKING: + * None. + * + * Compare two modes, given by @lh_a and @lh_b, returning a value indicating + * which is better. + * + * RETURNS: + * Negative if @lh_a is better than @lh_b, zero if they're equivalent, or + * positive if @lh_b is better than @lh_a. + */ +static int drm_mode_compare(void *priv, struct list_head *lh_a, struct list_head *lh_b) +{ + struct drm_display_mode *a = list_entry(lh_a, struct drm_display_mode, head); + struct drm_display_mode *b = list_entry(lh_b, struct drm_display_mode, head); + int diff; + + diff = ((b->type & DRM_MODE_TYPE_PREFERRED) != 0) - + ((a->type & DRM_MODE_TYPE_PREFERRED) != 0); + if (diff) + return diff; + diff = b->hdisplay * b->vdisplay - a->hdisplay * a->vdisplay; + if (diff) + return diff; + diff = b->clock - a->clock; + return diff; +} + +/** + * drm_mode_sort - sort mode list + * @mode_list: list to sort + * + * LOCKING: + * Caller must hold a lock protecting @mode_list. + * + * Sort @mode_list by favorability, putting good modes first. + */ +void drm_mode_sort(struct list_head *mode_list) +{ + drm_list_sort(NULL, mode_list, drm_mode_compare); +} + +/** + * drm_mode_connector_list_update - update the mode list for the connector + * @connector: the connector to update + * + * LOCKING: + * Caller must hold a lock protecting @mode_list. + * + * This moves the modes from the @connector probed_modes list + * to the actual mode list. It compares the probed mode against the current + * list and only adds different modes. All modes unverified after this point + * will be removed by the prune invalid modes. + */ +void drm_mode_connector_list_update(struct drm_connector *connector) +{ + struct drm_display_mode *mode; + struct drm_display_mode *pmode, *pt; + int found_it; + + list_for_each_entry_safe(pmode, pt, &connector->probed_modes, + head) { + found_it = 0; + /* go through current modes checking for the new probed mode */ + list_for_each_entry(mode, &connector->modes, head) { + if (drm_mode_equal(pmode, mode)) { + found_it = 1; + /* if equal delete the probed mode */ + mode->status = pmode->status; + /* Merge type bits together */ + mode->type |= pmode->type; + list_del(&pmode->head); + drm_mode_destroy(connector->dev, pmode); + break; + } + } + + if (!found_it) { + list_move_tail(&pmode->head, &connector->modes); + } + } +} + +/** + * drm_mode_parse_command_line_for_connector - parse command line for connector + * @mode_option - per connector mode option + * @connector - connector to parse line for + * + * This parses the connector specific then generic command lines for + * modes and options to configure the connector. + * + * This uses the same parameters as the fb modedb.c, except for extra + * x[M][R][-][@][i][m][eDd] + * + * enable/enable Digital/disable bit at the end + */ +bool drm_mode_parse_command_line_for_connector(const char *mode_option, + struct drm_connector *connector, + struct drm_cmdline_mode *mode) +{ + const char *name; + unsigned int namelen; + bool res_specified = false, bpp_specified = false, refresh_specified = false; + unsigned int xres = 0, yres = 0, bpp = 32, refresh = 0; + bool yres_specified = false, cvt = false, rb = false; + bool interlace = false, margins = false, was_digit = false; + int i; + enum drm_connector_force force = DRM_FORCE_UNSPECIFIED; + +#ifdef XXX_CONFIG_FB + if (!mode_option) + mode_option = fb_mode_option; +#endif + + if (!mode_option) { + mode->specified = false; + return false; + } + + name = mode_option; + namelen = strlen(name); + for (i = namelen-1; i >= 0; i--) { + switch (name[i]) { + case '@': + if (!refresh_specified && !bpp_specified && + !yres_specified && !cvt && !rb && was_digit) { + refresh = strtol(&name[i+1], NULL, 10); + refresh_specified = true; + was_digit = false; + } else + goto done; + break; + case '-': + if (!bpp_specified && !yres_specified && !cvt && + !rb && was_digit) { + bpp = strtol(&name[i+1], NULL, 10); + bpp_specified = true; + was_digit = false; + } else + goto done; + break; + case 'x': + if (!yres_specified && was_digit) { + yres = strtol(&name[i+1], NULL, 10); + yres_specified = true; + was_digit = false; + } else + goto done; + case '0' ... '9': + was_digit = true; + break; + case 'M': + if (yres_specified || cvt || was_digit) + goto done; + cvt = true; + break; + case 'R': + if (yres_specified || cvt || rb || was_digit) + goto done; + rb = true; + break; + case 'm': + if (cvt || yres_specified || was_digit) + goto done; + margins = true; + break; + case 'i': + if (cvt || yres_specified || was_digit) + goto done; + interlace = true; + break; + case 'e': + if (yres_specified || bpp_specified || refresh_specified || + was_digit || (force != DRM_FORCE_UNSPECIFIED)) + goto done; + + force = DRM_FORCE_ON; + break; + case 'D': + if (yres_specified || bpp_specified || refresh_specified || + was_digit || (force != DRM_FORCE_UNSPECIFIED)) + goto done; + + if ((connector->connector_type != DRM_MODE_CONNECTOR_DVII) && + (connector->connector_type != DRM_MODE_CONNECTOR_HDMIB)) + force = DRM_FORCE_ON; + else + force = DRM_FORCE_ON_DIGITAL; + break; + case 'd': + if (yres_specified || bpp_specified || refresh_specified || + was_digit || (force != DRM_FORCE_UNSPECIFIED)) + goto done; + + force = DRM_FORCE_OFF; + break; + default: + goto done; + } + } + + if (i < 0 && yres_specified) { + char *ch; + xres = strtol(name, &ch, 10); + if ((ch != NULL) && (*ch == 'x')) + res_specified = true; + else + i = ch - name; + } else if (!yres_specified && was_digit) { + /* catch mode that begins with digits but has no 'x' */ + i = 0; + } +done: + if (i >= 0) { + printf("parse error at position %i in video mode '%s'\n", + i, name); + mode->specified = false; + return false; + } + + if (res_specified) { + mode->specified = true; + mode->xres = xres; + mode->yres = yres; + } + + if (refresh_specified) { + mode->refresh_specified = true; + mode->refresh = refresh; + } + + if (bpp_specified) { + mode->bpp_specified = true; + mode->bpp = bpp; + } + mode->rb = rb; + mode->cvt = cvt; + mode->interlace = interlace; + mode->margins = margins; + mode->force = force; + + return true; +} + +struct drm_display_mode * +drm_mode_create_from_cmdline_mode(struct drm_device *dev, + struct drm_cmdline_mode *cmd) +{ + struct drm_display_mode *mode; + + if (cmd->cvt) + mode = drm_cvt_mode(dev, + cmd->xres, cmd->yres, + cmd->refresh_specified ? cmd->refresh : 60, + cmd->rb, cmd->interlace, + cmd->margins); + else + mode = drm_gtf_mode(dev, + cmd->xres, cmd->yres, + cmd->refresh_specified ? cmd->refresh : 60, + cmd->interlace, + cmd->margins); + if (!mode) + return NULL; + + drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); + return mode; +} diff --git a/sys/dev/drm2/drm_pci.c b/sys/dev/drm2/drm_pci.c new file mode 100644 index 00000000000..3d7a3cc7feb --- /dev/null +++ b/sys/dev/drm2/drm_pci.c @@ -0,0 +1,125 @@ +/*- + * Copyright 2003 Eric Anholt. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +/** + * \file drm_pci.h + * \brief PCI consistent, DMA-accessible memory allocation. + * + * \author Eric Anholt + */ + +#include + +/**********************************************************************/ +/** \name PCI memory */ +/*@{*/ + +static void +drm_pci_busdma_callback(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +{ + drm_dma_handle_t *dmah = arg; + + if (error != 0) + return; + + KASSERT(nsegs == 1, ("drm_pci_busdma_callback: bad dma segment count")); + dmah->busaddr = segs[0].ds_addr; +} + +/** + * \brief Allocate a physically contiguous DMA-accessible consistent + * memory block. + */ +drm_dma_handle_t * +drm_pci_alloc(struct drm_device *dev, size_t size, + size_t align, dma_addr_t maxaddr) +{ + drm_dma_handle_t *dmah; + int ret; + + /* Need power-of-two alignment, so fail the allocation if it isn't. */ + if ((align & (align - 1)) != 0) { + DRM_ERROR("drm_pci_alloc with non-power-of-two alignment %d\n", + (int)align); + return NULL; + } + + dmah = malloc(sizeof(drm_dma_handle_t), DRM_MEM_DMA, M_ZERO | M_NOWAIT); + if (dmah == NULL) + return NULL; + + /* Make sure we aren't holding mutexes here */ + mtx_assert(&dev->dma_lock, MA_NOTOWNED); + if (mtx_owned(&dev->dma_lock)) + DRM_ERROR("called while holding dma_lock\n"); + + ret = bus_dma_tag_create(NULL, align, 0, /* tag, align, boundary */ + maxaddr, BUS_SPACE_MAXADDR, /* lowaddr, highaddr */ + NULL, NULL, /* filtfunc, filtfuncargs */ + size, 1, size, /* maxsize, nsegs, maxsegsize */ + 0, NULL, NULL, /* flags, lockfunc, lockfuncargs */ + &dmah->tag); + if (ret != 0) { + free(dmah, DRM_MEM_DMA); + return NULL; + } + + ret = bus_dmamem_alloc(dmah->tag, &dmah->vaddr, + BUS_DMA_WAITOK | BUS_DMA_ZERO | BUS_DMA_NOCACHE, &dmah->map); + if (ret != 0) { + bus_dma_tag_destroy(dmah->tag); + free(dmah, DRM_MEM_DMA); + return NULL; + } + + ret = bus_dmamap_load(dmah->tag, dmah->map, dmah->vaddr, size, + drm_pci_busdma_callback, dmah, BUS_DMA_NOWAIT); + if (ret != 0) { + bus_dmamem_free(dmah->tag, dmah->vaddr, dmah->map); + bus_dma_tag_destroy(dmah->tag); + free(dmah, DRM_MEM_DMA); + return NULL; + } + + return dmah; +} + +/** + * \brief Free a DMA-accessible consistent memory block. + */ +void +drm_pci_free(struct drm_device *dev, drm_dma_handle_t *dmah) +{ + if (dmah == NULL) + return; + + bus_dmamem_free(dmah->tag, dmah->vaddr, dmah->map); + bus_dma_tag_destroy(dmah->tag); + + free(dmah, DRM_MEM_DMA); +} + +/*@}*/ diff --git a/sys/dev/drm2/drm_pciids.h b/sys/dev/drm2/drm_pciids.h new file mode 100644 index 00000000000..0a9bc4ddb61 --- /dev/null +++ b/sys/dev/drm2/drm_pciids.h @@ -0,0 +1,770 @@ +/* + * $FreeBSD$ + */ +/* + This file is auto-generated from the drm_pciids.txt in the DRM CVS + Please contact dri-devel@lists.sf.net to add new cards to this list +*/ +#define radeon_PCI_IDS \ + {0x1002, 0x3150, CHIP_RV380|RADEON_IS_MOBILITY, "ATI Radeon Mobility X600 M24"}, \ + {0x1002, 0x3152, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Radeon Mobility X300 M24"}, \ + {0x1002, 0x3154, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI FireGL M24 GL"}, \ + {0x1002, 0x3E50, CHIP_RV380|RADEON_NEW_MEMMAP, "ATI Radeon RV380 X600"}, \ + {0x1002, 0x3E54, CHIP_RV380|RADEON_NEW_MEMMAP, "ATI FireGL V3200 RV380"}, \ + {0x1002, 0x4136, CHIP_RS100|RADEON_IS_IGP, "ATI Radeon RS100 IGP 320"}, \ + {0x1002, 0x4137, CHIP_RS200|RADEON_IS_IGP, "ATI Radeon RS200 IGP 340"}, \ + {0x1002, 0x4144, CHIP_R300, "ATI Radeon AD 9500"}, \ + {0x1002, 0x4145, CHIP_R300, "ATI Radeon AE 9700 Pro"}, \ + {0x1002, 0x4146, CHIP_R300, "ATI Radeon AF R300 9600TX"}, \ + {0x1002, 0x4147, CHIP_R300, "ATI FireGL AG Z1"}, \ + {0x1002, 0x4148, CHIP_R350, "ATI Radeon AH 9800 SE"}, \ + {0x1002, 0x4149, CHIP_R350, "ATI Radeon AI 9800"}, \ + {0x1002, 0x414A, CHIP_R350, "ATI Radeon AJ 9800"}, \ + {0x1002, 0x414B, CHIP_R350, "ATI FireGL AK X2"}, \ + {0x1002, 0x4150, CHIP_RV350, "ATI Radeon AP 9600"}, \ + {0x1002, 0x4151, CHIP_RV350, "ATI Radeon AQ 9600 SE"}, \ + {0x1002, 0x4152, CHIP_RV350, "ATI Radeon AR 9600 XT"}, \ + {0x1002, 0x4153, CHIP_RV350, "ATI Radeon AS 9550"}, \ + {0x1002, 0x4154, CHIP_RV350, "ATI FireGL AT T2"}, \ + {0x1002, 0x4155, CHIP_RV350, "ATI Radeon 9650"}, \ + {0x1002, 0x4156, CHIP_RV350, "ATI FireGL AV RV360 T2"}, \ + {0x1002, 0x4237, CHIP_RS200|RADEON_IS_IGP, "ATI Radeon RS250 IGP"}, \ + {0x1002, 0x4242, CHIP_R200, "ATI Radeon BB R200 AIW 8500DV"}, \ + {0x1002, 0x4243, CHIP_R200, "ATI Radeon BC R200"}, \ + {0x1002, 0x4336, CHIP_RS100|RADEON_IS_IGP|RADEON_IS_MOBILITY, "ATI Radeon RS100 Mobility U1"}, \ + {0x1002, 0x4337, CHIP_RS200|RADEON_IS_IGP|RADEON_IS_MOBILITY, "ATI Radeon RS200 Mobility IGP 340M"}, \ + {0x1002, 0x4437, CHIP_RS200|RADEON_IS_IGP|RADEON_IS_MOBILITY, "ATI Radeon RS250 Mobility IGP"}, \ + {0x1002, 0x4966, CHIP_RV250, "ATI Radeon If RV250 9000"}, \ + {0x1002, 0x4967, CHIP_RV250, "ATI Radeon Ig RV250 9000"}, \ + {0x1002, 0x4A48, CHIP_R420|RADEON_NEW_MEMMAP, "ATI Radeon JH R420 X800"}, \ + {0x1002, 0x4A49, CHIP_R420|RADEON_NEW_MEMMAP, "ATI Radeon JI R420 X800 Pro"}, \ + {0x1002, 0x4A4A, CHIP_R420|RADEON_NEW_MEMMAP, "ATI Radeon JJ R420 X800 SE"}, \ + {0x1002, 0x4A4B, CHIP_R420|RADEON_NEW_MEMMAP, "ATI Radeon JK R420 X800 XT"}, \ + {0x1002, 0x4A4C, CHIP_R420|RADEON_NEW_MEMMAP, "ATI Radeon JL R420 X800"}, \ + {0x1002, 0x4A4D, CHIP_R420|RADEON_NEW_MEMMAP, "ATI FireGL JM X3-256"}, \ + {0x1002, 0x4A4E, CHIP_R420|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Radeon JN R420 Mobility M18"}, \ + {0x1002, 0x4A4F, CHIP_R420|RADEON_NEW_MEMMAP, "ATI Radeon JO R420 X800 SE"}, \ + {0x1002, 0x4A50, CHIP_R420|RADEON_NEW_MEMMAP, "ATI Radeon JP R420 X800 XT PE"}, \ + {0x1002, 0x4A54, CHIP_R420|RADEON_NEW_MEMMAP, "ATI Radeon JT R420 AIW X800 VE"}, \ + {0x1002, 0x4B49, CHIP_R420|RADEON_NEW_MEMMAP, "ATI Radeon R481 X850 XT"}, \ + {0x1002, 0x4B4A, CHIP_R420|RADEON_NEW_MEMMAP, "ATI Radeon R481 X850 SE"}, \ + {0x1002, 0x4B4B, CHIP_R420|RADEON_NEW_MEMMAP, "ATI Radeon R481 X850 Pro"}, \ + {0x1002, 0x4B4C, CHIP_R420|RADEON_NEW_MEMMAP, "ATI Radeon R481 X850 XT PE"}, \ + {0x1002, 0x4C57, CHIP_RV200|RADEON_IS_MOBILITY, "ATI Radeon LW RV200 Mobility 7500 M7"}, \ + {0x1002, 0x4C58, CHIP_RV200|RADEON_IS_MOBILITY, "ATI Radeon LX RV200 Mobility FireGL 7800 M7"}, \ + {0x1002, 0x4C59, CHIP_RV100|RADEON_IS_MOBILITY, "ATI Radeon LY RV100 Mobility M6"}, \ + {0x1002, 0x4C5A, CHIP_RV100|RADEON_IS_MOBILITY, "ATI Radeon LZ RV100 Mobility M6"}, \ + {0x1002, 0x4C64, CHIP_RV250|RADEON_IS_MOBILITY, "ATI Radeon Ld RV250 Mobility 9000 M9"}, \ + {0x1002, 0x4C66, CHIP_RV250, "ATI Radeon Lf RV250 Mobility 9000 M9 / FireMV 2400 PCI"}, \ + {0x1002, 0x4C67, CHIP_RV250|RADEON_IS_MOBILITY, "ATI Radeon Lg RV250 Mobility 9000 M9"}, \ + {0x1002, 0x4E44, CHIP_R300, "ATI Radeon ND R300 9700 Pro"}, \ + {0x1002, 0x4E45, CHIP_R300, "ATI Radeon NE R300 9500 Pro / 9700"}, \ + {0x1002, 0x4E46, CHIP_R300, "ATI Radeon NF R300 9600TX"}, \ + {0x1002, 0x4E47, CHIP_R300, "ATI Radeon NG R300 FireGL X1"}, \ + {0x1002, 0x4E48, CHIP_R350, "ATI Radeon NH R350 9800 Pro"}, \ + {0x1002, 0x4E49, CHIP_R350, "ATI Radeon NI R350 9800"}, \ + {0x1002, 0x4E4A, CHIP_R350, "ATI Radeon NJ R360 9800 XT"}, \ + {0x1002, 0x4E4B, CHIP_R350, "ATI FireGL NK X2"}, \ + {0x1002, 0x4E50, CHIP_RV350|RADEON_IS_MOBILITY, "ATI Radeon RV350 Mobility 9600 M10 NP"}, \ + {0x1002, 0x4E51, CHIP_RV350|RADEON_IS_MOBILITY, "ATI Radeon RV350 Mobility 9600 M10 NQ"}, \ + {0x1002, 0x4E52, CHIP_RV350|RADEON_IS_MOBILITY, "ATI Radeon RV350 Mobility 9600 M11 NR"}, \ + {0x1002, 0x4E53, CHIP_RV350|RADEON_IS_MOBILITY, "ATI Radeon RV350 Mobility 9600 M10 NS"}, \ + {0x1002, 0x4E54, CHIP_RV350|RADEON_IS_MOBILITY, "ATI FireGL T2/T2e"}, \ + {0x1002, 0x4E56, CHIP_RV350|RADEON_IS_MOBILITY, "ATI Radeon Mobility 9550"}, \ + {0x1002, 0x5144, CHIP_R100|RADEON_SINGLE_CRTC, "ATI Radeon QD R100"}, \ + {0x1002, 0x5145, CHIP_R100|RADEON_SINGLE_CRTC, "ATI Radeon QE R100"}, \ + {0x1002, 0x5146, CHIP_R100|RADEON_SINGLE_CRTC, "ATI Radeon QF R100"}, \ + {0x1002, 0x5147, CHIP_R100|RADEON_SINGLE_CRTC, "ATI Radeon QG R100"}, \ + {0x1002, 0x5148, CHIP_R200, "ATI Radeon QH R200 8500"}, \ + {0x1002, 0x514C, CHIP_R200, "ATI Radeon QL R200 8500 LE"}, \ + {0x1002, 0x514D, CHIP_R200, "ATI Radeon QM R200 9100"}, \ + {0x1002, 0x5157, CHIP_RV200, "ATI Radeon QW RV200 7500"}, \ + {0x1002, 0x5158, CHIP_RV200, "ATI Radeon QX RV200 7500"}, \ + {0x1002, 0x5159, CHIP_RV100, "ATI Radeon QY RV100 7000/VE"}, \ + {0x1002, 0x515A, CHIP_RV100, "ATI Radeon QZ RV100 7000/VE"}, \ + {0x1002, 0x515E, CHIP_RV100, "ATI ES1000 RN50"}, \ + {0x1002, 0x5460, CHIP_RV380|RADEON_IS_MOBILITY, "ATI Radeon Mobility X300 M22"}, \ + {0x1002, 0x5462, CHIP_RV380|RADEON_IS_MOBILITY, "ATI Radeon Mobility X600 SE M24C"}, \ + {0x1002, 0x5464, CHIP_RV380|RADEON_IS_MOBILITY, "ATI FireGL M22 GL 5464"}, \ + {0x1002, 0x5548, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R423 X800"}, \ + {0x1002, 0x5549, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R423 X800 Pro"}, \ + {0x1002, 0x554A, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R423 X800 XT PE"}, \ + {0x1002, 0x554B, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R423 X800 SE"}, \ + {0x1002, 0x554C, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R430 X800 XTP"}, \ + {0x1002, 0x554D, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R430 X800 XL"}, \ + {0x1002, 0x554E, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R430 X800 SE"}, \ + {0x1002, 0x554F, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R430 X800"}, \ + {0x1002, 0x5550, CHIP_R423|RADEON_NEW_MEMMAP, "ATI FireGL V7100 R423"}, \ + {0x1002, 0x5551, CHIP_R423|RADEON_NEW_MEMMAP, "ATI FireGL V5100 R423 UQ"}, \ + {0x1002, 0x5552, CHIP_R423|RADEON_NEW_MEMMAP, "ATI FireGL unknown R423 UR"}, \ + {0x1002, 0x5554, CHIP_R423|RADEON_NEW_MEMMAP, "ATI FireGL unknown R423 UT"}, \ + {0x1002, 0x564A, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility FireGL V5000 M26"}, \ + {0x1002, 0x564B, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility FireGL V5000 M26"}, \ + {0x1002, 0x564F, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Radeon Mobility X700 XL M26"}, \ + {0x1002, 0x5652, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Radeon Mobility X700 M26"}, \ + {0x1002, 0x5653, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Radeon Mobility X700 M26"}, \ + {0x1002, 0x5657, CHIP_RV410|RADEON_NEW_MEMMAP, "ATI Radeon X550XTX"}, \ + {0x1002, 0x5834, CHIP_RS300|RADEON_IS_IGP, "ATI Radeon RS300 9100 IGP"}, \ + {0x1002, 0x5835, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY, "ATI Radeon RS300 Mobility IGP"}, \ + {0x1002, 0x5954, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_IGPGART, "ATI RS480 XPRESS 200G"}, \ + {0x1002, 0x5955, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART, "ATI Radeon XPRESS 200M 5955"}, \ + {0x1002, 0x5974, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART, "ATI Radeon RS482 XPRESS 200"}, \ + {0x1002, 0x5975, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART, "ATI Radeon RS485 XPRESS 1100 IGP"}, \ + {0x1002, 0x5960, CHIP_RV280, "ATI Radeon RV280 9250"}, \ + {0x1002, 0x5961, CHIP_RV280, "ATI Radeon RV280 9200"}, \ + {0x1002, 0x5962, CHIP_RV280, "ATI Radeon RV280 9200"}, \ + {0x1002, 0x5964, CHIP_RV280, "ATI Radeon RV280 9200 SE"}, \ + {0x1002, 0x5965, CHIP_RV280, "ATI FireMV 2200 PCI"}, \ + {0x1002, 0x5969, CHIP_RV100, "ATI ES1000 RN50"}, \ + {0x1002, 0x5a41, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_IGPGART, "ATI Radeon XPRESS 200 5A41 (PCIE)"}, \ + {0x1002, 0x5a42, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART, "ATI Radeon XPRESS 200M 5A42 (PCIE)"}, \ + {0x1002, 0x5a61, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_IGPGART, "ATI Radeon RC410 XPRESS 200"}, \ + {0x1002, 0x5a62, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART, "ATI Radeon RC410 XPRESS 200M"}, \ + {0x1002, 0x5b60, CHIP_RV380|RADEON_NEW_MEMMAP, "ATI Radeon RV370 X300 SE"}, \ + {0x1002, 0x5b62, CHIP_RV380|RADEON_NEW_MEMMAP, "ATI Radeon RV370 X600 Pro"}, \ + {0x1002, 0x5b63, CHIP_RV380|RADEON_NEW_MEMMAP, "ATI Radeon RV370 X550"}, \ + {0x1002, 0x5b64, CHIP_RV380|RADEON_NEW_MEMMAP, "ATI FireGL V3100 (RV370) 5B64"}, \ + {0x1002, 0x5b65, CHIP_RV380|RADEON_NEW_MEMMAP, "ATI FireMV 2200 PCIE (RV370) 5B65"}, \ + {0x1002, 0x5c61, CHIP_RV280|RADEON_IS_MOBILITY, "ATI Radeon RV280 Mobility"}, \ + {0x1002, 0x5c63, CHIP_RV280|RADEON_IS_MOBILITY, "ATI Radeon RV280 Mobility"}, \ + {0x1002, 0x5d48, CHIP_R423|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X800 XT M28"}, \ + {0x1002, 0x5d49, CHIP_R423|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility FireGL V5100 M28"}, \ + {0x1002, 0x5d4a, CHIP_R423|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X800 M28"}, \ + {0x1002, 0x5d4c, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R480 X850"}, \ + {0x1002, 0x5d4d, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R480 X850 XT PE"}, \ + {0x1002, 0x5d4e, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R480 X850 SE"}, \ + {0x1002, 0x5d4f, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R480 X850 Pro"}, \ + {0x1002, 0x5d50, CHIP_R423|RADEON_NEW_MEMMAP, "ATI unknown Radeon / FireGL R480"}, \ + {0x1002, 0x5d52, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R480 X850 XT"}, \ + {0x1002, 0x5d57, CHIP_R423|RADEON_NEW_MEMMAP, "ATI Radeon R423 X800 XT"}, \ + {0x1002, 0x5e48, CHIP_RV410|RADEON_NEW_MEMMAP, "ATI FireGL V5000 RV410"}, \ + {0x1002, 0x5e4a, CHIP_RV410|RADEON_NEW_MEMMAP, "ATI Radeon RV410 X700 XT"}, \ + {0x1002, 0x5e4b, CHIP_RV410|RADEON_NEW_MEMMAP, "ATI Radeon RV410 X700 Pro"}, \ + {0x1002, 0x5e4c, CHIP_RV410|RADEON_NEW_MEMMAP, "ATI Radeon RV410 X700 SE"}, \ + {0x1002, 0x5e4d, CHIP_RV410|RADEON_NEW_MEMMAP, "ATI Radeon RV410 X700"}, \ + {0x1002, 0x5e4f, CHIP_RV410|RADEON_NEW_MEMMAP, "ATI Radeon RV410 X700 SE"}, \ + {0x1002, 0x7100, CHIP_R520|RADEON_NEW_MEMMAP, "ATI Radeon X1800"}, \ + {0x1002, 0x7101, CHIP_R520|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1800 XT"}, \ + {0x1002, 0x7102, CHIP_R520|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1800"}, \ + {0x1002, 0x7103, CHIP_R520|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility FireGL V7200"}, \ + {0x1002, 0x7104, CHIP_R520|RADEON_NEW_MEMMAP, "ATI FireGL V7200"}, \ + {0x1002, 0x7105, CHIP_R520|RADEON_NEW_MEMMAP, "ATI FireGL V5300"}, \ + {0x1002, 0x7106, CHIP_R520|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility FireGL V7100"}, \ + {0x1002, 0x7108, CHIP_R520|RADEON_NEW_MEMMAP, "ATI Radeon X1800"}, \ + {0x1002, 0x7109, CHIP_R520|RADEON_NEW_MEMMAP, "ATI Radeon X1800"}, \ + {0x1002, 0x710A, CHIP_R520|RADEON_NEW_MEMMAP, "ATI Radeon X1800"}, \ + {0x1002, 0x710B, CHIP_R520|RADEON_NEW_MEMMAP, "ATI Radeon X1800"}, \ + {0x1002, 0x710C, CHIP_R520|RADEON_NEW_MEMMAP, "ATI Radeon X1800"}, \ + {0x1002, 0x710E, CHIP_R520|RADEON_NEW_MEMMAP, "ATI FireGL V7300"}, \ + {0x1002, 0x710F, CHIP_R520|RADEON_NEW_MEMMAP, "ATI FireGL V7350"}, \ + {0x1002, 0x7140, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1600"}, \ + {0x1002, 0x7141, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI RV505"}, \ + {0x1002, 0x7142, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1300/X1550"}, \ + {0x1002, 0x7143, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1550"}, \ + {0x1002, 0x7144, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI M54-GL"}, \ + {0x1002, 0x7145, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1400"}, \ + {0x1002, 0x7146, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1300/X1550"}, \ + {0x1002, 0x7147, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1550 64-bit"}, \ + {0x1002, 0x7149, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1300"}, \ + {0x1002, 0x714A, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1300"}, \ + {0x1002, 0x714B, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1300"}, \ + {0x1002, 0x714C, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1300"}, \ + {0x1002, 0x714D, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1300"}, \ + {0x1002, 0x714E, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1300"}, \ + {0x1002, 0x714F, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI RV505"}, \ + {0x1002, 0x7151, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI RV505"}, \ + {0x1002, 0x7152, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI FireGL V3300"}, \ + {0x1002, 0x7153, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI FireGL V3350"}, \ + {0x1002, 0x715E, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1300"}, \ + {0x1002, 0x715F, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1550 64-bit"}, \ + {0x1002, 0x7180, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1300/X1550"}, \ + {0x1002, 0x7181, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1600"}, \ + {0x1002, 0x7183, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1300/X1550"}, \ + {0x1002, 0x7186, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1450"}, \ + {0x1002, 0x7187, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1300/X1550"}, \ + {0x1002, 0x7188, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X2300"}, \ + {0x1002, 0x718A, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X2300"}, \ + {0x1002, 0x718B, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1350"}, \ + {0x1002, 0x718C, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1350"}, \ + {0x1002, 0x718D, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1450"}, \ + {0x1002, 0x718F, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1300"}, \ + {0x1002, 0x7193, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1550"}, \ + {0x1002, 0x7196, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1350"}, \ + {0x1002, 0x719B, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI FireMV 2250"}, \ + {0x1002, 0x719F, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X1550 64-bit"}, \ + {0x1002, 0x71C0, CHIP_RV530|RADEON_NEW_MEMMAP, "ATI Radeon X1600"}, \ + {0x1002, 0x71C1, CHIP_RV530|RADEON_NEW_MEMMAP, "ATI Radeon X1650"}, \ + {0x1002, 0x71C2, CHIP_RV530|RADEON_NEW_MEMMAP, "ATI Radeon X1600"}, \ + {0x1002, 0x71C3, CHIP_RV530|RADEON_NEW_MEMMAP, "ATI Radeon X1600"}, \ + {0x1002, 0x71C4, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility FireGL V5200"}, \ + {0x1002, 0x71C5, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1600"}, \ + {0x1002, 0x71C6, CHIP_RV530|RADEON_NEW_MEMMAP, "ATI Radeon X1650"}, \ + {0x1002, 0x71C7, CHIP_RV530|RADEON_NEW_MEMMAP, "ATI Radeon X1650"}, \ + {0x1002, 0x71CD, CHIP_RV530|RADEON_NEW_MEMMAP, "ATI Radeon X1600"}, \ + {0x1002, 0x71CE, CHIP_RV530|RADEON_NEW_MEMMAP, "ATI Radeon X1300 XT/X1600 Pro"}, \ + {0x1002, 0x71D2, CHIP_RV530|RADEON_NEW_MEMMAP, "ATI FireGL V3400"}, \ + {0x1002, 0x71D4, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility FireGL V5250"}, \ + {0x1002, 0x71D5, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1700"}, \ + {0x1002, 0x71D6, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1700 XT"}, \ + {0x1002, 0x71DA, CHIP_RV530|RADEON_NEW_MEMMAP, "ATI FireGL V5200"}, \ + {0x1002, 0x71DE, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1700"}, \ + {0x1002, 0x7200, CHIP_RV515|RADEON_NEW_MEMMAP, "ATI Radeon X2300HD"}, \ + {0x1002, 0x7210, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 2300"}, \ + {0x1002, 0x7211, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 2300"}, \ + {0x1002, 0x7240, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1950"}, \ + {0x1002, 0x7243, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1900"}, \ + {0x1002, 0x7244, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1950"}, \ + {0x1002, 0x7245, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1900"}, \ + {0x1002, 0x7246, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1900"}, \ + {0x1002, 0x7247, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1900"}, \ + {0x1002, 0x7248, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1900"}, \ + {0x1002, 0x7249, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1900"}, \ + {0x1002, 0x724A, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1900"}, \ + {0x1002, 0x724B, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1900"}, \ + {0x1002, 0x724C, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1900"}, \ + {0x1002, 0x724D, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1900"}, \ + {0x1002, 0x724E, CHIP_R580|RADEON_NEW_MEMMAP, "ATI AMD Stream Processor"}, \ + {0x1002, 0x724F, CHIP_R580|RADEON_NEW_MEMMAP, "ATI Radeon X1900"}, \ + {0x1002, 0x7280, CHIP_RV570|RADEON_NEW_MEMMAP, "ATI Radeon X1950"}, \ + {0x1002, 0x7281, CHIP_RV560|RADEON_NEW_MEMMAP, "ATI RV560"}, \ + {0x1002, 0x7283, CHIP_RV560|RADEON_NEW_MEMMAP, "ATI RV560"}, \ + {0x1002, 0x7284, CHIP_R580|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon X1900"}, \ + {0x1002, 0x7287, CHIP_RV560|RADEON_NEW_MEMMAP, "ATI RV560"}, \ + {0x1002, 0x7288, CHIP_RV570|RADEON_NEW_MEMMAP, "ATI Radeon X1950 GT"}, \ + {0x1002, 0x7289, CHIP_RV570|RADEON_NEW_MEMMAP, "ATI RV570"}, \ + {0x1002, 0x728B, CHIP_RV570|RADEON_NEW_MEMMAP, "ATI RV570"}, \ + {0x1002, 0x728C, CHIP_RV570|RADEON_NEW_MEMMAP, "ATI ATI FireGL V7400"}, \ + {0x1002, 0x7290, CHIP_RV560|RADEON_NEW_MEMMAP, "ATI RV560"}, \ + {0x1002, 0x7291, CHIP_RV560|RADEON_NEW_MEMMAP, "ATI Radeon X1650"}, \ + {0x1002, 0x7293, CHIP_RV560|RADEON_NEW_MEMMAP, "ATI Radeon X1650"}, \ + {0x1002, 0x7297, CHIP_RV560|RADEON_NEW_MEMMAP, "ATI RV560"}, \ + {0x1002, 0x7834, CHIP_RS300|RADEON_IS_IGP|RADEON_NEW_MEMMAP, "ATI Radeon RS350 9000/9100 IGP"}, \ + {0x1002, 0x7835, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Radeon RS350 Mobility IGP"}, \ + {0x1002, 0x793f, CHIP_RS600|RADEON_IS_IGP|RADEON_NEW_MEMMAP, "ATI Radeon X1200"}, \ + {0x1002, 0x7941, CHIP_RS600|RADEON_IS_IGP|RADEON_NEW_MEMMAP, "ATI Radeon X1200"}, \ + {0x1002, 0x7942, CHIP_RS600|RADEON_IS_IGP|RADEON_NEW_MEMMAP, "ATI Radeon X1200"}, \ + {0x1002, 0x791e, CHIP_RS690|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART, "ATI Radeon RS690 X1250 IGP"}, \ + {0x1002, 0x791f, CHIP_RS690|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART, "ATI Radeon RS690 X1270 IGP"}, \ + {0x1002, 0x796c, CHIP_RS740|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART, "ATI Radeon RS740 HD2100 IGP"}, \ + {0x1002, 0x796d, CHIP_RS740|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART, "ATI Radeon RS740 HD2100 IGP"}, \ + {0x1002, 0x796e, CHIP_RS740|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART, "ATI Radeon RS740 HD2100 IGP"}, \ + {0x1002, 0x796f, CHIP_RS740|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART, "ATI Radeon RS740 HD2100 IGP"}, \ + {0x1002, 0x9400, CHIP_R600|RADEON_NEW_MEMMAP, "ATI Radeon HD 2900 XT"}, \ + {0x1002, 0x9401, CHIP_R600|RADEON_NEW_MEMMAP, "ATI Radeon HD 2900 XT"}, \ + {0x1002, 0x9402, CHIP_R600|RADEON_NEW_MEMMAP, "ATI Radeon HD 2900 XT"}, \ + {0x1002, 0x9403, CHIP_R600|RADEON_NEW_MEMMAP, "ATI Radeon HD 2900 Pro"}, \ + {0x1002, 0x9405, CHIP_R600|RADEON_NEW_MEMMAP, "ATI Radeon HD 2900 GT"}, \ + {0x1002, 0x940A, CHIP_R600|RADEON_NEW_MEMMAP, "ATI FireGL V8650"}, \ + {0x1002, 0x940B, CHIP_R600|RADEON_NEW_MEMMAP, "ATI FireGL V8600"}, \ + {0x1002, 0x940F, CHIP_R600|RADEON_NEW_MEMMAP, "ATI FireGL V7600"}, \ + {0x1002, 0x94A0, CHIP_RV740|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 4830"}, \ + {0x1002, 0x94A1, CHIP_RV740|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 4850"}, \ + {0x1002, 0x94A3, CHIP_RV740|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI FirePro M7740"}, \ + {0x1002, 0x94B1, CHIP_RV740|RADEON_NEW_MEMMAP, "ATI RV740"}, \ + {0x1002, 0x94B3, CHIP_RV740|RADEON_NEW_MEMMAP, "ATI Radeon HD 4770"}, \ + {0x1002, 0x94B4, CHIP_RV740|RADEON_NEW_MEMMAP, "ATI Radeon HD 4700 Series"}, \ + {0x1002, 0x94B5, CHIP_RV740|RADEON_NEW_MEMMAP, "ATI Radeon HD 4770"}, \ + {0x1002, 0x94B9, CHIP_RV740|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI FirePro M5750"}, \ + {0x1002, 0x94C0, CHIP_RV610|RADEON_NEW_MEMMAP, "RV610"}, \ + {0x1002, 0x94C1, CHIP_RV610|RADEON_NEW_MEMMAP, "Radeon HD 2400 XT"}, \ + {0x1002, 0x94C3, CHIP_RV610|RADEON_NEW_MEMMAP, "Radeon HD 2400 Pro"}, \ + {0x1002, 0x94C4, CHIP_RV610|RADEON_NEW_MEMMAP, "Radeon HD 2400 PRO AGP"}, \ + {0x1002, 0x94C5, CHIP_RV610|RADEON_NEW_MEMMAP, "FireGL V4000"}, \ + {0x1002, 0x94C6, CHIP_RV610|RADEON_NEW_MEMMAP, "RV610"}, \ + {0x1002, 0x94C7, CHIP_RV610|RADEON_NEW_MEMMAP, "ATI Radeon HD 2350"}, \ + {0x1002, 0x94C8, CHIP_RV610|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 2400 XT"}, \ + {0x1002, 0x94C9, CHIP_RV610|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 2400"}, \ + {0x1002, 0x94CB, CHIP_RV610|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI RADEON E2400"}, \ + {0x1002, 0x94CC, CHIP_RV610|RADEON_NEW_MEMMAP, "ATI RV610"}, \ + {0x1002, 0x94CD, CHIP_RV610|RADEON_NEW_MEMMAP, "ATI FireMV 2260"}, \ + {0x1002, 0x9500, CHIP_RV670|RADEON_NEW_MEMMAP, "ATI RV670"}, \ + {0x1002, 0x9501, CHIP_RV670|RADEON_NEW_MEMMAP, "ATI Radeon HD3870"}, \ + {0x1002, 0x9504, CHIP_RV670|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 3850"}, \ + {0x1002, 0x9505, CHIP_RV670|RADEON_NEW_MEMMAP, "ATI Radeon HD3850"}, \ + {0x1002, 0x9506, CHIP_RV670|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 3850 X2"}, \ + {0x1002, 0x9507, CHIP_RV670|RADEON_NEW_MEMMAP, "ATI RV670"}, \ + {0x1002, 0x9508, CHIP_RV670|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 3870"}, \ + {0x1002, 0x9509, CHIP_RV670|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 3870 X2"}, \ + {0x1002, 0x950F, CHIP_RV670|RADEON_NEW_MEMMAP, "ATI Radeon HD3870 X2"}, \ + {0x1002, 0x9511, CHIP_RV670|RADEON_NEW_MEMMAP, "ATI FireGL V7700"}, \ + {0x1002, 0x9515, CHIP_RV670|RADEON_NEW_MEMMAP, "ATI Radeon HD3850"}, \ + {0x1002, 0x9517, CHIP_RV670|RADEON_NEW_MEMMAP, "ATI Radeon HD3690"}, \ + {0x1002, 0x9519, CHIP_RV670|RADEON_NEW_MEMMAP, "AMD Firestream 9170"}, \ + {0x1002, 0x9580, CHIP_RV630|RADEON_NEW_MEMMAP, "ATI RV630"}, \ + {0x1002, 0x9581, CHIP_RV630|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 2600"}, \ + {0x1002, 0x9583, CHIP_RV630|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 2600 XT"}, \ + {0x1002, 0x9586, CHIP_RV630|RADEON_NEW_MEMMAP, "ATI Radeon HD 2600 XT AGP"}, \ + {0x1002, 0x9587, CHIP_RV630|RADEON_NEW_MEMMAP, "ATI Radeon HD 2600 Pro AGP"}, \ + {0x1002, 0x9588, CHIP_RV630|RADEON_NEW_MEMMAP, "ATI Radeon HD 2600 XT"}, \ + {0x1002, 0x9589, CHIP_RV630|RADEON_NEW_MEMMAP, "ATI Radeon HD 2600 Pro"}, \ + {0x1002, 0x958A, CHIP_RV630|RADEON_NEW_MEMMAP, "ATI Gemini RV630"}, \ + {0x1002, 0x958B, CHIP_RV630|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Gemini Mobility Radeon HD 2600 XT"}, \ + {0x1002, 0x958C, CHIP_RV630|RADEON_NEW_MEMMAP, "ATI FireGL V5600"}, \ + {0x1002, 0x958D, CHIP_RV630|RADEON_NEW_MEMMAP, "ATI FireGL V3600"}, \ + {0x1002, 0x958E, CHIP_RV630|RADEON_NEW_MEMMAP, "ATI Radeon HD 2600 LE"}, \ + {0x1002, 0x958F, CHIP_RV630|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility FireGL Graphics Processor"}, \ + {0x1002, 0x95C0, CHIP_RV620|RADEON_NEW_MEMMAP, "ATI Radeon HD 3470"}, \ + {0x1002, 0x95C5, CHIP_RV620|RADEON_NEW_MEMMAP, "ATI Radeon HD 3450"}, \ + {0x1002, 0x95C6, CHIP_RV620|RADEON_NEW_MEMMAP, "ATI Radeon HD 3450"}, \ + {0x1002, 0x95C7, CHIP_RV620|RADEON_NEW_MEMMAP, "ATI Radeon HD 3430"}, \ + {0x1002, 0x95C9, CHIP_RV620|RADEON_NEW_MEMMAP, "ATI Radeon HD 3450"}, \ + {0x1002, 0x95C2, CHIP_RV620|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 3430"}, \ + {0x1002, 0x95C4, CHIP_RV620|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 3400 Series"}, \ + {0x1002, 0x95CC, CHIP_RV620|RADEON_NEW_MEMMAP, "ATI FirePro V3700"}, \ + {0x1002, 0x95CD, CHIP_RV620|RADEON_NEW_MEMMAP, "ATI FireMV 2450"}, \ + {0x1002, 0x95CE, CHIP_RV620|RADEON_NEW_MEMMAP, "ATI FireMV 2260"}, \ + {0x1002, 0x95CF, CHIP_RV620|RADEON_NEW_MEMMAP, "ATI FireMV 2260"}, \ + {0x1002, 0x9590, CHIP_RV635|RADEON_NEW_MEMMAP, "ATI ATI Radeon HD 3600 Series"}, \ + {0x1002, 0x9596, CHIP_RV635|RADEON_NEW_MEMMAP, "ATI ATI Radeon HD 3650 AGP"}, \ + {0x1002, 0x9597, CHIP_RV635|RADEON_NEW_MEMMAP, "ATI ATI Radeon HD 3600 PRO"}, \ + {0x1002, 0x9598, CHIP_RV635|RADEON_NEW_MEMMAP, "ATI ATI Radeon HD 3600 XT"}, \ + {0x1002, 0x9599, CHIP_RV635|RADEON_NEW_MEMMAP, "ATI ATI Radeon HD 3600 PRO"}, \ + {0x1002, 0x9591, CHIP_RV635|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 3650"}, \ + {0x1002, 0x9593, CHIP_RV635|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 3670"}, \ + {0x1002, 0x9595, CHIP_RV635|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility FireGL V5700"}, \ + {0x1002, 0x959B, CHIP_RV635|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility FireGL V5725"}, \ + {0x1002, 0x9610, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon HD 3200 Graphics"}, \ + {0x1002, 0x9611, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon 3100 Graphics"}, \ + {0x1002, 0x9612, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon HD 3200 Graphics"}, \ + {0x1002, 0x9613, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon 3100 Graphics"}, \ + {0x1002, 0x9614, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon 3300 Graphics"}, \ + {0x1002, 0x9615, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon 3200 Graphics"}, \ + {0x1002, 0x9616, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon 3000 Graphics"}, \ + {0x1002, 0x9710, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon HD 4200"}, \ + {0x1002, 0x9711, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon 4100"}, \ + {0x1002, 0x9712, CHIP_RS880|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Mobility Radeon HD 4200"}, \ + {0x1002, 0x9713, CHIP_RS880|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Mobility Radeon 4100"}, \ + {0x1002, 0x9714, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI RS880"}, \ + {0x1002, 0x9715, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon HD 4250"}, \ + {0x1002, 0x9440, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI Radeon 4800 Series"}, \ + {0x1002, 0x9441, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI Radeon 4870 X2"}, \ + {0x1002, 0x9442, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI Radeon 4800 Series"}, \ + {0x1002, 0x9443, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI Radeon 4850 X2"}, \ + {0x1002, 0x944C, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI Radeon 4800 Series"}, \ + {0x1002, 0x9450, CHIP_RV770|RADEON_NEW_MEMMAP, "AMD FireStream 9270"}, \ + {0x1002, 0x9452, CHIP_RV770|RADEON_NEW_MEMMAP, "AMD FireStream 9250"}, \ + {0x1002, 0x9444, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI FirePro V8750 (FireGL)"}, \ + {0x1002, 0x9446, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI FirePro V7760 (FireGL)"}, \ + {0x1002, 0x9456, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI FirePro V8700 (FireGL)"}, \ + {0x1002, 0x944E, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI FirePro RV770"}, \ + {0x1002, 0x944A, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 4850"}, \ + {0x1002, 0x944B, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 4850 X2"}, \ + {0x1002, 0x945A, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 4870"}, \ + {0x1002, 0x945B, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon M98"}, \ + {0x1002, 0x9460, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI Radeon 4800 Series"}, \ + {0x1002, 0x9462, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI Radeon 4800 Series"}, \ + {0x1002, 0x946A, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI FirePro M7750"}, \ + {0x1002, 0x946B, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI M98"}, \ + {0x1002, 0x947A, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI M98"}, \ + {0x1002, 0x947B, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI M98"}, \ + {0x1002, 0x9487, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI Radeon RV730 (AGP)"}, \ + {0x1002, 0x948F, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI Radeon RV730 (AGP)"}, \ + {0x1002, 0x9490, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI Radeon HD 4670"}, \ + {0x1002, 0x9495, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI Radeon HD 4600 Series"}, \ + {0x1002, 0x9498, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI Radeon HD 4650"}, \ + {0x1002, 0x9480, CHIP_RV730|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 4650"}, \ + {0x1002, 0x9488, CHIP_RV730|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 4670"}, \ + {0x1002, 0x9489, CHIP_RV730|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI FirePro M5750"}, \ + {0x1002, 0x9491, CHIP_RV730|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI RADEON E4600"}, \ + {0x1002, 0x949C, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI FirePro V7750 (FireGL)"}, \ + {0x1002, 0x949E, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI FirePro V5700 (FireGL)"}, \ + {0x1002, 0x949F, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI FirePro V3750 (FireGL)"}, \ + {0x1002, 0x9540, CHIP_RV710|RADEON_NEW_MEMMAP, "ATI Radeon HD 4550"}, \ + {0x1002, 0x9541, CHIP_RV710|RADEON_NEW_MEMMAP, "ATI Radeon RV710"}, \ + {0x1002, 0x9542, CHIP_RV710|RADEON_NEW_MEMMAP, "ATI Radeon RV710"}, \ + {0x1002, 0x954E, CHIP_RV710|RADEON_NEW_MEMMAP, "ATI Radeon RV710"}, \ + {0x1002, 0x954F, CHIP_RV710|RADEON_NEW_MEMMAP, "ATI Radeon HD 4350"}, \ + {0x1002, 0x9552, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon 4300 Series"}, \ + {0x1002, 0x9553, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon 4500 Series"}, \ + {0x1002, 0x9555, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon 4500 Series"}, \ + {0x1002, 0x9557, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI FirePro RG220"}, \ + {0, 0, 0, NULL} + +#define r128_PCI_IDS \ + {0x1002, 0x4c45, 0, "ATI Rage 128 Mobility LE (PCI)"}, \ + {0x1002, 0x4c46, 0, "ATI Rage 128 Mobility LF (AGP)"}, \ + {0x1002, 0x4d46, 0, "ATI Rage 128 Mobility MF (AGP)"}, \ + {0x1002, 0x4d4c, 0, "ATI Rage 128 Mobility ML (AGP)"}, \ + {0x1002, 0x5041, 0, "ATI Rage 128 Pro PA (PCI)"}, \ + {0x1002, 0x5042, 0, "ATI Rage 128 Pro PB (AGP)"}, \ + {0x1002, 0x5043, 0, "ATI Rage 128 Pro PC (AGP)"}, \ + {0x1002, 0x5044, 0, "ATI Rage 128 Pro PD (PCI)"}, \ + {0x1002, 0x5045, 0, "ATI Rage 128 Pro PE (AGP)"}, \ + {0x1002, 0x5046, 0, "ATI Rage 128 Pro PF (AGP)"}, \ + {0x1002, 0x5047, 0, "ATI Rage 128 Pro PG (PCI)"}, \ + {0x1002, 0x5048, 0, "ATI Rage 128 Pro PH (AGP)"}, \ + {0x1002, 0x5049, 0, "ATI Rage 128 Pro PI (AGP)"}, \ + {0x1002, 0x504A, 0, "ATI Rage 128 Pro PJ (PCI)"}, \ + {0x1002, 0x504B, 0, "ATI Rage 128 Pro PK (AGP)"}, \ + {0x1002, 0x504C, 0, "ATI Rage 128 Pro PL (AGP)"}, \ + {0x1002, 0x504D, 0, "ATI Rage 128 Pro PM (PCI)"}, \ + {0x1002, 0x504E, 0, "ATI Rage 128 Pro PN (AGP)"}, \ + {0x1002, 0x504F, 0, "ATI Rage 128 Pro PO (AGP)"}, \ + {0x1002, 0x5050, 0, "ATI Rage 128 Pro PP (PCI)"}, \ + {0x1002, 0x5051, 0, "ATI Rage 128 Pro PQ (AGP)"}, \ + {0x1002, 0x5052, 0, "ATI Rage 128 Pro PR (PCI)"}, \ + {0x1002, 0x5053, 0, "ATI Rage 128 Pro PS (PCI)"}, \ + {0x1002, 0x5054, 0, "ATI Rage 128 Pro PT (AGP)"}, \ + {0x1002, 0x5055, 0, "ATI Rage 128 Pro PU (AGP)"}, \ + {0x1002, 0x5056, 0, "ATI Rage 128 Pro PV (PCI)"}, \ + {0x1002, 0x5057, 0, "ATI Rage 128 Pro PW (AGP)"}, \ + {0x1002, 0x5058, 0, "ATI Rage 128 Pro PX (AGP)"}, \ + {0x1002, 0x5245, 0, "ATI Rage 128 RE (PCI)"}, \ + {0x1002, 0x5246, 0, "ATI Rage 128 RF (AGP)"}, \ + {0x1002, 0x5247, 0, "ATI Rage 128 RG (AGP)"}, \ + {0x1002, 0x524b, 0, "ATI Rage 128 RK (PCI)"}, \ + {0x1002, 0x524c, 0, "ATI Rage 128 RL (AGP)"}, \ + {0x1002, 0x534d, 0, "ATI Rage 128 SM (AGP)"}, \ + {0x1002, 0x5446, 0, "ATI Rage 128 Pro Ultra TF (AGP)"}, \ + {0x1002, 0x544C, 0, "ATI Rage 128 Pro Ultra TL (AGP)"}, \ + {0x1002, 0x5452, 0, "ATI Rage 128 Pro Ultra TR (AGP)"}, \ + {0, 0, 0, NULL} + +#define mga_PCI_IDS \ + {0x102b, 0x0520, MGA_CARD_TYPE_G200, "Matrox G200 (PCI)"}, \ + {0x102b, 0x0521, MGA_CARD_TYPE_G200, "Matrox G200 (AGP)"}, \ + {0x102b, 0x0525, MGA_CARD_TYPE_G400, "Matrox G400/G450 (AGP)"}, \ + {0x102b, 0x2527, MGA_CARD_TYPE_G550, "Matrox G550 (AGP)"}, \ + {0, 0, 0, NULL} + +#define mach64_PCI_IDS \ + {0x1002, 0x4749, 0, "3D Rage Pro"}, \ + {0x1002, 0x4750, 0, "3D Rage Pro 215GP"}, \ + {0x1002, 0x4751, 0, "3D Rage Pro 215GQ"}, \ + {0x1002, 0x4742, 0, "3D Rage Pro AGP 1X/2X"}, \ + {0x1002, 0x4744, 0, "3D Rage Pro AGP 1X"}, \ + {0x1002, 0x4c49, 0, "3D Rage LT Pro"}, \ + {0x1002, 0x4c50, 0, "3D Rage LT Pro"}, \ + {0x1002, 0x4c51, 0, "3D Rage LT Pro"}, \ + {0x1002, 0x4c42, 0, "3D Rage LT Pro AGP-133"}, \ + {0x1002, 0x4c44, 0, "3D Rage LT Pro AGP-66"}, \ + {0x1002, 0x474c, 0, "Rage XC"}, \ + {0x1002, 0x474f, 0, "Rage XL"}, \ + {0x1002, 0x4752, 0, "Rage XL"}, \ + {0x1002, 0x4753, 0, "Rage XC"}, \ + {0x1002, 0x474d, 0, "Rage XL AGP 2X"}, \ + {0x1002, 0x474e, 0, "Rage XC AGP"}, \ + {0x1002, 0x4c52, 0, "Rage Mobility P/M"}, \ + {0x1002, 0x4c53, 0, "Rage Mobility L"}, \ + {0x1002, 0x4c4d, 0, "Rage Mobility P/M AGP 2X"}, \ + {0x1002, 0x4c4e, 0, "Rage Mobility L AGP 2X"}, \ + {0, 0, 0, NULL} + +#define sis_PCI_IDS \ + {0x1039, 0x0300, 0, "SiS 300/305"}, \ + {0x1039, 0x5300, 0, "SiS 540"}, \ + {0x1039, 0x6300, 0, "SiS 630"}, \ + {0x1039, 0x6330, SIS_CHIP_315, "SiS 661"}, \ + {0x1039, 0x7300, 0, "SiS 730"}, \ + {0x18CA, 0x0040, SIS_CHIP_315, "Volari V3XT/V5/V8"}, \ + {0x18CA, 0x0042, SIS_CHIP_315, "Volari Unknown"}, \ + {0, 0, 0, NULL} + +#define tdfx_PCI_IDS \ + {0x121a, 0x0003, 0, "3dfx Voodoo Banshee"}, \ + {0x121a, 0x0004, 0, "3dfx Voodoo3 2000"}, \ + {0x121a, 0x0005, 0, "3dfx Voodoo3 3000"}, \ + {0x121a, 0x0007, 0, "3dfx Voodoo4 4500"}, \ + {0x121a, 0x0009, 0, "3dfx Voodoo5 5500"}, \ + {0x121a, 0x000b, 0, "3dfx Voodoo4 4200"}, \ + {0, 0, 0, NULL} + +#define viadrv_PCI_IDS \ + {0x1106, 0x3022, 0, "VIA CLE266 3022"}, \ + {0x1106, 0x3118, VIA_PRO_GROUP_A, "VIA CN400 / PM8X0"}, \ + {0x1106, 0x3122, 0, "VIA CLE266"}, \ + {0x1106, 0x7205, 0, "VIA KM400"}, \ + {0x1106, 0x3108, 0, "VIA K8M800"}, \ + {0x1106, 0x3344, 0, "VIA CN700 / VM800 / P4M800Pro"}, \ + {0x1106, 0x3343, 0, "VIA P4M890"}, \ + {0x1106, 0x3230, VIA_DX9_0, "VIA K8M890"}, \ + {0x1106, 0x3157, VIA_PRO_GROUP_A, "VIA CX700"}, \ + {0x1106, 0x3371, VIA_DX9_0, "VIA P4M900 / VN896"}, \ + {0, 0, 0, NULL} + +#define i810_PCI_IDS \ + {0x8086, 0x7121, 0, "Intel i810 GMCH"}, \ + {0x8086, 0x7123, 0, "Intel i810-DC100 GMCH"}, \ + {0x8086, 0x7125, 0, "Intel i810E GMCH"}, \ + {0x8086, 0x1132, 0, "Intel i815 GMCH"}, \ + {0, 0, 0, NULL} + +#define i830_PCI_IDS \ + {0x8086, 0x3577, 0, "Intel i830M GMCH"}, \ + {0x8086, 0x2562, 0, "Intel i845G GMCH"}, \ + {0x8086, 0x3582, 0, "Intel i852GM/i855GM GMCH"}, \ + {0x8086, 0x2572, 0, "Intel i865G GMCH"}, \ + {0, 0, 0, NULL} + +#define gamma_PCI_IDS \ + {0x3d3d, 0x0008, 0, "3DLabs GLINT Gamma G1"}, \ + {0, 0, 0, NULL} + +#define savage_PCI_IDS \ + {0x5333, 0x8a20, S3_SAVAGE3D, "Savage 3D"}, \ + {0x5333, 0x8a21, S3_SAVAGE3D, "Savage 3D/MV"}, \ + {0x5333, 0x8a22, S3_SAVAGE4, "Savage4"}, \ + {0x5333, 0x8a23, S3_SAVAGE4, "Savage4"}, \ + {0x5333, 0x8c10, S3_SAVAGE_MX, "Savage/MX-MV"}, \ + {0x5333, 0x8c11, S3_SAVAGE_MX, "Savage/MX"}, \ + {0x5333, 0x8c12, S3_SAVAGE_MX, "Savage/IX-MV"}, \ + {0x5333, 0x8c13, S3_SAVAGE_MX, "Savage/IX"}, \ + {0x5333, 0x8c22, S3_SUPERSAVAGE, "SuperSavage MX/128"}, \ + {0x5333, 0x8c24, S3_SUPERSAVAGE, "SuperSavage MX/64"}, \ + {0x5333, 0x8c26, S3_SUPERSAVAGE, "SuperSavage MX/64C"}, \ + {0x5333, 0x8c2a, S3_SUPERSAVAGE, "SuperSavage IX/128 SDR"}, \ + {0x5333, 0x8c2b, S3_SUPERSAVAGE, "SuperSavage IX/128 DDR"}, \ + {0x5333, 0x8c2c, S3_SUPERSAVAGE, "SuperSavage IX/64 SDR"}, \ + {0x5333, 0x8c2d, S3_SUPERSAVAGE, "SuperSavage IX/64 DDR"}, \ + {0x5333, 0x8c2e, S3_SUPERSAVAGE, "SuperSavage IX/C SDR"}, \ + {0x5333, 0x8c2f, S3_SUPERSAVAGE, "SuperSavage IX/C DDR"}, \ + {0x5333, 0x8a25, S3_PROSAVAGE, "ProSavage PM133"}, \ + {0x5333, 0x8a26, S3_PROSAVAGE, "ProSavage KM133"}, \ + {0x5333, 0x8d01, S3_TWISTER, "ProSavage Twister PN133"}, \ + {0x5333, 0x8d02, S3_TWISTER, "ProSavage Twister KN133"}, \ + {0x5333, 0x8d03, S3_PROSAVAGEDDR, "ProSavage DDR"}, \ + {0x5333, 0x8d04, S3_PROSAVAGEDDR, "ProSavage DDR-K"}, \ + {0, 0, 0, NULL} + +#define ffb_PCI_IDS \ + {0, 0, 0, NULL} + +#define i915_PCI_IDS \ + {0x8086, 0x3577, CHIP_I8XX, "Intel i830M GMCH"}, \ + {0x8086, 0x2562, CHIP_I8XX, "Intel i845G GMCH"}, \ + {0x8086, 0x3582, CHIP_I8XX, "Intel i852GM/i855GM GMCH"}, \ + {0x8086, 0x358e, CHIP_I8XX, "Intel i852GM/i855GM GMCH"}, \ + {0x8086, 0x2572, CHIP_I8XX, "Intel i865G GMCH"}, \ + {0x8086, 0x2582, CHIP_I9XX|CHIP_I915, "Intel i915G"}, \ + {0x8086, 0x258a, CHIP_I9XX|CHIP_I915, "Intel E7221 (i915)"}, \ + {0x8086, 0x2592, CHIP_I9XX|CHIP_I915, "Intel i915GM"}, \ + {0x8086, 0x2772, CHIP_I9XX|CHIP_I915, "Intel i945G"}, \ + {0x8086, 0x27A2, CHIP_I9XX|CHIP_I915, "Intel i945GM"}, \ + {0x8086, 0x27AE, CHIP_I9XX|CHIP_I915, "Intel i945GME"}, \ + {0x8086, 0x2972, CHIP_I9XX|CHIP_I965, "Intel i946GZ"}, \ + {0x8086, 0x2982, CHIP_I9XX|CHIP_I965, "Intel i965G"}, \ + {0x8086, 0x2992, CHIP_I9XX|CHIP_I965, "Intel i965Q"}, \ + {0x8086, 0x29A2, CHIP_I9XX|CHIP_I965, "Intel i965G"}, \ + {0x8086, 0x29B2, CHIP_I9XX|CHIP_I915, "Intel Q35"}, \ + {0x8086, 0x29C2, CHIP_I9XX|CHIP_I915, "Intel G33"}, \ + {0x8086, 0x29D2, CHIP_I9XX|CHIP_I915, "Intel Q33"}, \ + {0x8086, 0x2A02, CHIP_I9XX|CHIP_I965, "Intel i965GM"}, \ + {0x8086, 0x2A12, CHIP_I9XX|CHIP_I965, "Intel i965GME/GLE"}, \ + {0x8086, 0x2A42, CHIP_I9XX|CHIP_I965, "Mobile Intel® GM45 Express Chipset"}, \ + {0x8086, 0x2E02, CHIP_I9XX|CHIP_I965, "Intel Eaglelake"}, \ + {0x8086, 0x2E12, CHIP_I9XX|CHIP_I965, "Intel Q45/Q43"}, \ + {0x8086, 0x2E22, CHIP_I9XX|CHIP_I965, "Intel G45/G43"}, \ + {0x8086, 0x2E32, CHIP_I9XX|CHIP_I965, "Intel G41"}, \ + {0x8086, 0x2e42, CHIP_I9XX|CHIP_I915, "Intel G43 ?"}, \ + {0x8086, 0x2e92, CHIP_I9XX|CHIP_I915, "Intel G43 ?"}, \ + {0x8086, 0x0042, CHIP_I9XX|CHIP_I915, "Intel IronLake"}, \ + {0x8086, 0x0046, CHIP_I9XX|CHIP_I915, "Intel IronLake"}, \ + {0x8086, 0x0102, CHIP_I9XX|CHIP_I915, "Intel SandyBridge"}, \ + {0x8086, 0x0112, CHIP_I9XX|CHIP_I915, "Intel SandyBridge"}, \ + {0x8086, 0x0122, CHIP_I9XX|CHIP_I915, "Intel SandyBridge"}, \ + {0x8086, 0x0106, CHIP_I9XX|CHIP_I915, "Intel SandyBridge (M)"}, \ + {0x8086, 0x0116, CHIP_I9XX|CHIP_I915, "Intel SandyBridge (M)"}, \ + {0x8086, 0x0126, CHIP_I9XX|CHIP_I915, "Intel SandyBridge (M)"}, \ + {0x8086, 0x010A, CHIP_I9XX|CHIP_I915, "Intel SandyBridge (M)"}, \ + {0x8086, 0x0152, CHIP_I9XX|CHIP_I915, "Intel IvyBridge"}, \ + {0x8086, 0x0162, CHIP_I9XX|CHIP_I915, "Intel IvyBridge"}, \ + {0x8086, 0x0156, CHIP_I9XX|CHIP_I915, "Intel IvyBridge (M)"}, \ + {0x8086, 0x0166, CHIP_I9XX|CHIP_I915, "Intel IvyBridge (M)"}, \ + {0x8086, 0x015A, CHIP_I9XX|CHIP_I915, "Intel IvyBridge (S)"}, \ + {0x8086, 0x016A, CHIP_I9XX|CHIP_I915, "Intel IvyBridge (S)"}, \ + {0x8086, 0xA001, CHIP_I9XX|CHIP_I965, "Intel Pineview"}, \ + {0x8086, 0xA011, CHIP_I9XX|CHIP_I965, "Intel Pineview (M)"}, \ + {0, 0, 0, NULL} + +#define imagine_PCI_IDS \ + {0x105d, 0x2309, IMAGINE_128, "Imagine 128"}, \ + {0x105d, 0x2339, IMAGINE_128_2, "Imagine 128-II"}, \ + {0x105d, 0x493d, IMAGINE_T2R, "Ticket to Ride"}, \ + {0x105d, 0x5348, IMAGINE_REV4, "Revolution IV"}, \ + {0, 0, 0, NULL} + +#define nv_PCI_IDS \ + {0x10DE, 0x0020, NV04, "NVidia RIVA TNT"}, \ + {0x10DE, 0x0028, NV04, "NVidia RIVA TNT2"}, \ + {0x10DE, 0x002A, NV04, "NVidia Unknown TNT2"}, \ + {0x10DE, 0x002C, NV04, "NVidia Vanta"}, \ + {0x10DE, 0x0029, NV04, "NVidia RIVA TNT2 Ultra"}, \ + {0x10DE, 0x002D, NV04, "NVidia RIVA TNT2 Model 64"}, \ + {0x10DE, 0x00A0, NV04, "NVidia Aladdin TNT2"}, \ + {0x10DE, 0x0100, NV10, "NVidia GeForce 256"}, \ + {0x10DE, 0x0101, NV10, "NVidia GeForce DDR"}, \ + {0x10DE, 0x0103, NV10, "NVidia Quadro"}, \ + {0x10DE, 0x0110, NV10, "NVidia GeForce2 MX/MX 400"}, \ + {0x10DE, 0x0111, NV10, "NVidia GeForce2 MX 100/200"}, \ + {0x10DE, 0x0112, NV10, "NVidia GeForce2 Go"}, \ + {0x10DE, 0x0113, NV10, "NVidia Quadro2 MXR/EX/Go"}, \ + {0x10DE, 0x0150, NV10, "NVidia GeForce2 GTS"}, \ + {0x10DE, 0x0151, NV10, "NVidia GeForce2 Ti"}, \ + {0x10DE, 0x0152, NV10, "NVidia GeForce2 Ultra"}, \ + {0x10DE, 0x0153, NV10, "NVidia Quadro2 Pro"}, \ + {0x10DE, 0x0170, NV10, "NVidia GeForce4 MX 460"}, \ + {0x10DE, 0x0171, NV10, "NVidia GeForce4 MX 440"}, \ + {0x10DE, 0x0172, NV10, "NVidia GeForce4 MX 420"}, \ + {0x10DE, 0x0173, NV10, "NVidia GeForce4 MX 440-SE"}, \ + {0x10DE, 0x0174, NV10, "NVidia GeForce4 440 Go"}, \ + {0x10DE, 0x0175, NV10, "NVidia GeForce4 420 Go"}, \ + {0x10DE, 0x0176, NV10, "NVidia GeForce4 420 Go 32M"}, \ + {0x10DE, 0x0177, NV10, "NVidia GeForce4 460 Go"}, \ + {0x10DE, 0x0178, NV10, "NVidia Quadro4 550 XGL"}, \ + {0x10DE, 0x0179, NV10, "NVidia GeForce4"}, \ + {0x10DE, 0x017A, NV10, "NVidia Quadro4 NVS"}, \ + {0x10DE, 0x017C, NV10, "NVidia Quadro4 500 GoGL"}, \ + {0x10DE, 0x017D, NV10, "NVidia GeForce4 410 Go 16M"}, \ + {0x10DE, 0x0181, NV10, "NVidia GeForce4 MX 440 with AGP8X"}, \ + {0x10DE, 0x0182, NV10, "NVidia GeForce4 MX 440SE with AGP8X"}, \ + {0x10DE, 0x0183, NV10, "NVidia GeForce4 MX 420 with AGP8X"}, \ + {0x10DE, 0x0185, NV10, "NVidia GeForce4 MX 4000"}, \ + {0x10DE, 0x0186, NV10, "NVidia GeForce4 448 Go"}, \ + {0x10DE, 0x0187, NV10, "NVidia GeForce4 488 Go"}, \ + {0x10DE, 0x0188, NV10, "NVidia Quadro4 580 XGL"}, \ + {0x10DE, 0x0189, NV10, "NVidia GeForce4 MX with AGP8X (Mac)"}, \ + {0x10DE, 0x018A, NV10, "NVidia Quadro4 280 NVS"}, \ + {0x10DE, 0x018B, NV10, "NVidia Quadro4 380 XGL"}, \ + {0x10DE, 0x018C, NV10, "NVidia Quadro NVS 50 PCI"}, \ + {0x10DE, 0x018D, NV10, "NVidia GeForce4 448 Go"}, \ + {0x10DE, 0x01A0, NV10, "NVidia GeForce2 Integrated GPU"}, \ + {0x10DE, 0x01F0, NV10, "NVidia GeForce4 MX Integrated GPU"}, \ + {0x10DE, 0x0200, NV20, "NVidia GeForce3"}, \ + {0x10DE, 0x0201, NV20, "NVidia GeForce3 Ti 200"}, \ + {0x10DE, 0x0202, NV20, "NVidia GeForce3 Ti 500"}, \ + {0x10DE, 0x0203, NV20, "NVidia Quadro DCC"}, \ + {0x10DE, 0x0250, NV20, "NVidia GeForce4 Ti 4600"}, \ + {0x10DE, 0x0251, NV20, "NVidia GeForce4 Ti 4400"}, \ + {0x10DE, 0x0252, NV20, "NVidia 0x0252"}, \ + {0x10DE, 0x0253, NV20, "NVidia GeForce4 Ti 4200"}, \ + {0x10DE, 0x0258, NV20, "NVidia Quadro4 900 XGL"}, \ + {0x10DE, 0x0259, NV20, "NVidia Quadro4 750 XGL"}, \ + {0x10DE, 0x025B, NV20, "NVidia Quadro4 700 XGL"}, \ + {0x10DE, 0x0280, NV20, "NVidia GeForce4 Ti 4800"}, \ + {0x10DE, 0x0281, NV20, "NVidia GeForce4 Ti 4200 with AGP8X"}, \ + {0x10DE, 0x0282, NV20, "NVidia GeForce4 Ti 4800 SE"}, \ + {0x10DE, 0x0286, NV20, "NVidia GeForce4 4200 Go"}, \ + {0x10DE, 0x028C, NV20, "NVidia Quadro4 700 GoGL"}, \ + {0x10DE, 0x0288, NV20, "NVidia Quadro4 980 XGL"}, \ + {0x10DE, 0x0289, NV20, "NVidia Quadro4 780 XGL"}, \ + {0x10DE, 0x0301, NV30, "NVidia GeForce FX 5800 Ultra"}, \ + {0x10DE, 0x0302, NV30, "NVidia GeForce FX 5800"}, \ + {0x10DE, 0x0308, NV30, "NVidia Quadro FX 2000"}, \ + {0x10DE, 0x0309, NV30, "NVidia Quadro FX 1000"}, \ + {0x10DE, 0x0311, NV30, "NVidia GeForce FX 5600 Ultra"}, \ + {0x10DE, 0x0312, NV30, "NVidia GeForce FX 5600"}, \ + {0x10DE, 0x0313, NV30, "NVidia 0x0313"}, \ + {0x10DE, 0x0314, NV30, "NVidia GeForce FX 5600SE"}, \ + {0x10DE, 0x0316, NV30, "NVidia 0x0316"}, \ + {0x10DE, 0x0317, NV30, "NVidia 0x0317"}, \ + {0x10DE, 0x031A, NV30, "NVidia GeForce FX Go5600"}, \ + {0x10DE, 0x031B, NV30, "NVidia GeForce FX Go5650"}, \ + {0x10DE, 0x031C, NV30, "NVidia Quadro FX Go700"}, \ + {0x10DE, 0x031D, NV30, "NVidia 0x031D"}, \ + {0x10DE, 0x031E, NV30, "NVidia 0x031E"}, \ + {0x10DE, 0x031F, NV30, "NVidia 0x031F"}, \ + {0x10DE, 0x0320, NV30, "NVidia GeForce FX 5200"}, \ + {0x10DE, 0x0321, NV30, "NVidia GeForce FX 5200 Ultra"}, \ + {0x10DE, 0x0322, NV30, "NVidia GeForce FX 5200"}, \ + {0x10DE, 0x0323, NV30, "NVidia GeForce FX 5200SE"}, \ + {0x10DE, 0x0324, NV30, "NVidia GeForce FX Go5200"}, \ + {0x10DE, 0x0325, NV30, "NVidia GeForce FX Go5250"}, \ + {0x10DE, 0x0326, NV30, "NVidia GeForce FX 5500"}, \ + {0x10DE, 0x0327, NV30, "NVidia GeForce FX 5100"}, \ + {0x10DE, 0x0328, NV30, "NVidia GeForce FX Go5200 32M/64M"}, \ + {0x10DE, 0x0329, NV30, "NVidia GeForce FX 5200 (Mac)"}, \ + {0x10DE, 0x032A, NV30, "NVidia Quadro NVS 280 PCI"}, \ + {0x10DE, 0x032B, NV30, "NVidia Quadro FX 500/600 PCI"}, \ + {0x10DE, 0x032C, NV30, "NVidia GeForce FX Go53xx Series"}, \ + {0x10DE, 0x032D, NV30, "NVidia GeForce FX Go5100"}, \ + {0x10DE, 0x032F, NV30, "NVidia 0x032F"}, \ + {0x10DE, 0x0330, NV30, "NVidia GeForce FX 5900 Ultra"}, \ + {0x10DE, 0x0331, NV30, "NVidia GeForce FX 5900"}, \ + {0x10DE, 0x0332, NV30, "NVidia GeForce FX 5900XT"}, \ + {0x10DE, 0x0333, NV30, "NVidia GeForce FX 5950 Ultra"}, \ + {0x10DE, 0x033F, NV30, "NVidia Quadro FX 700"}, \ + {0x10DE, 0x0334, NV30, "NVidia GeForce FX 5900ZT"}, \ + {0x10DE, 0x0338, NV30, "NVidia Quadro FX 3000"}, \ + {0x10DE, 0x0341, NV30, "NVidia GeForce FX 5700 Ultra"}, \ + {0x10DE, 0x0342, NV30, "NVidia GeForce FX 5700"}, \ + {0x10DE, 0x0343, NV30, "NVidia GeForce FX 5700LE"}, \ + {0x10DE, 0x0344, NV30, "NVidia GeForce FX 5700VE"}, \ + {0x10DE, 0x0345, NV30, "NVidia 0x0345"}, \ + {0x10DE, 0x0347, NV30, "NVidia GeForce FX Go5700"}, \ + {0x10DE, 0x0348, NV30, "NVidia GeForce FX Go5700"}, \ + {0x10DE, 0x0349, NV30, "NVidia 0x0349"}, \ + {0x10DE, 0x034B, NV30, "NVidia 0x034B"}, \ + {0x10DE, 0x034C, NV30, "NVidia Quadro FX Go1000"}, \ + {0x10DE, 0x034E, NV30, "NVidia Quadro FX 1100"}, \ + {0x10DE, 0x034F, NV30, "NVidia 0x034F"}, \ + {0x10DE, 0x0040, NV40, "NVidia GeForce 6800 Ultra"}, \ + {0x10DE, 0x0041, NV40, "NVidia GeForce 6800"}, \ + {0x10DE, 0x0042, NV40, "NVidia GeForce 6800 LE"}, \ + {0x10DE, 0x0043, NV40, "NVidia 0x0043"}, \ + {0x10DE, 0x0045, NV40, "NVidia GeForce 6800 GT"}, \ + {0x10DE, 0x0046, NV40, "NVidia GeForce 6800 GT"}, \ + {0x10DE, 0x0049, NV40, "NVidia 0x0049"}, \ + {0x10DE, 0x004E, NV40, "NVidia Quadro FX 4000"}, \ + {0x10DE, 0x00C0, NV40, "NVidia 0x00C0"}, \ + {0x10DE, 0x00C1, NV40, "NVidia GeForce 6800"}, \ + {0x10DE, 0x00C2, NV40, "NVidia GeForce 6800 LE"}, \ + {0x10DE, 0x00C8, NV40, "NVidia GeForce Go 6800"}, \ + {0x10DE, 0x00C9, NV40, "NVidia GeForce Go 6800 Ultra"}, \ + {0x10DE, 0x00CC, NV40, "NVidia Quadro FX Go1400"}, \ + {0x10DE, 0x00CD, NV40, "NVidia Quadro FX 3450/4000 SDI"}, \ + {0x10DE, 0x00CE, NV40, "NVidia Quadro FX 1400"}, \ + {0x10de, 0x00f0, NV40, "Nvidia GeForce 6600 GT"}, \ + {0x10de, 0x00f1, NV40, "Nvidia GeForce 6600 GT"}, \ + {0x10DE, 0x0140, NV40, "NVidia GeForce 6600 GT"}, \ + {0x10DE, 0x0141, NV40, "NVidia GeForce 6600"}, \ + {0x10DE, 0x0142, NV40, "NVidia GeForce 6600 LE"}, \ + {0x10DE, 0x0143, NV40, "NVidia 0x0143"}, \ + {0x10DE, 0x0144, NV40, "NVidia GeForce Go 6600"}, \ + {0x10DE, 0x0145, NV40, "NVidia GeForce 6610 XL"}, \ + {0x10DE, 0x0146, NV40, "NVidia GeForce Go 6600 TE/6200 TE"}, \ + {0x10DE, 0x0147, NV40, "NVidia GeForce 6700 XL"}, \ + {0x10DE, 0x0148, NV40, "NVidia GeForce Go 6600"}, \ + {0x10DE, 0x0149, NV40, "NVidia GeForce Go 6600 GT"}, \ + {0x10DE, 0x014B, NV40, "NVidia 0x014B"}, \ + {0x10DE, 0x014C, NV40, "NVidia 0x014C"}, \ + {0x10DE, 0x014D, NV40, "NVidia 0x014D"}, \ + {0x10DE, 0x014E, NV40, "NVidia Quadro FX 540"}, \ + {0x10DE, 0x014F, NV40, "NVidia GeForce 6200"}, \ + {0x10DE, 0x0160, NV40, "NVidia 0x0160"}, \ + {0x10DE, 0x0161, NV40, "NVidia GeForce 6200 TurboCache(TM)"}, \ + {0x10DE, 0x0162, NV40, "NVidia GeForce 6200SE TurboCache(TM)"}, \ + {0x10DE, 0x0163, NV40, "NVidia 0x0163"}, \ + {0x10DE, 0x0164, NV40, "NVidia GeForce Go 6200"}, \ + {0x10DE, 0x0165, NV40, "NVidia Quadro NVS 285"}, \ + {0x10DE, 0x0166, NV40, "NVidia GeForce Go 6400"}, \ + {0x10DE, 0x0167, NV40, "NVidia GeForce Go 6200"}, \ + {0x10DE, 0x0168, NV40, "NVidia GeForce Go 6400"}, \ + {0x10DE, 0x0169, NV40, "NVidia 0x0169"}, \ + {0x10DE, 0x016B, NV40, "NVidia 0x016B"}, \ + {0x10DE, 0x016C, NV40, "NVidia 0x016C"}, \ + {0x10DE, 0x016D, NV40, "NVidia 0x016D"}, \ + {0x10DE, 0x016E, NV40, "NVidia 0x016E"}, \ + {0x10DE, 0x0210, NV40, "NVidia 0x0210"}, \ + {0x10DE, 0x0211, NV40, "NVidia GeForce 6800"}, \ + {0x10DE, 0x0212, NV40, "NVidia GeForce 6800 LE"}, \ + {0x10DE, 0x0215, NV40, "NVidia GeForce 6800 GT"}, \ + {0x10DE, 0x0220, NV40, "NVidia 0x0220"}, \ + {0x10DE, 0x0221, NV40, "NVidia GeForce 6200"}, \ + {0x10DE, 0x0222, NV40, "NVidia 0x0222"}, \ + {0x10DE, 0x0228, NV40, "NVidia 0x0228"}, \ + {0x10DE, 0x0090, NV40, "NVidia 0x0090"}, \ + {0x10DE, 0x0091, NV40, "NVidia GeForce 7800 GTX"}, \ + {0x10DE, 0x0092, NV40, "NVidia 0x0092"}, \ + {0x10DE, 0x0093, NV40, "NVidia 0x0093"}, \ + {0x10DE, 0x0094, NV40, "NVidia 0x0094"}, \ + {0x10DE, 0x0098, NV40, "NVidia 0x0098"}, \ + {0x10DE, 0x0099, NV40, "NVidia GeForce Go 7800 GTX"}, \ + {0x10DE, 0x009C, NV40, "NVidia 0x009C"}, \ + {0x10DE, 0x009D, NV40, "NVidia Quadro FX 4500"}, \ + {0x10DE, 0x009E, NV40, "NVidia 0x009E"}, \ + {0, 0, 0, NULL} + +#define xgi_PCI_IDS \ + {0x18ca, 0x2200, 0, "XP5"}, \ + {0x18ca, 0x0047, 0, "XP10 / XG47"}, \ + {0, 0, 0, NULL} diff --git a/sys/dev/drm2/drm_sarea.h b/sys/dev/drm2/drm_sarea.h new file mode 100644 index 00000000000..9f37fcba6ed --- /dev/null +++ b/sys/dev/drm2/drm_sarea.h @@ -0,0 +1,87 @@ +/** + * \file drm_sarea.h + * \brief SAREA definitions + * + * \author Michel D�zer + */ + +/*- + * Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef _DRM_SAREA_H_ +#define _DRM_SAREA_H_ + +#include + +/* SAREA area needs to be at least a page */ +#if defined(__alpha__) +#define SAREA_MAX 0x2000 +#elif defined(__ia64__) +#define SAREA_MAX 0x10000 /* 64kB */ +#else +/* Intel 830M driver needs at least 8k SAREA */ +#define SAREA_MAX 0x2000UL +#endif + +/** Maximum number of drawables in the SAREA */ +#define SAREA_MAX_DRAWABLES 256 + +#define SAREA_DRAWABLE_CLAIMED_ENTRY 0x80000000 + +/** SAREA drawable */ +struct drm_sarea_drawable { + unsigned int stamp; + unsigned int flags; +}; + +/** SAREA frame */ +struct drm_sarea_frame { + unsigned int x; + unsigned int y; + unsigned int width; + unsigned int height; + unsigned int fullscreen; +}; + +/** SAREA */ +struct drm_sarea { + /** first thing is always the DRM locking structure */ + struct drm_hw_lock lock; + /** \todo Use readers/writer lock for drm_sarea::drawable_lock */ + struct drm_hw_lock drawable_lock; + struct drm_sarea_drawable drawableTable[SAREA_MAX_DRAWABLES]; /**< drawables */ + struct drm_sarea_frame frame; /**< frame */ + drm_context_t dummy_context; +}; + +#ifndef __KERNEL__ +typedef struct drm_sarea_drawable drm_sarea_drawable_t; +typedef struct drm_sarea_frame drm_sarea_frame_t; +typedef struct drm_sarea drm_sarea_t; +#endif + +#endif /* _DRM_SAREA_H_ */ diff --git a/sys/dev/drm2/drm_scatter.c b/sys/dev/drm2/drm_scatter.c new file mode 100644 index 00000000000..ecf231f27c7 --- /dev/null +++ b/sys/dev/drm2/drm_scatter.c @@ -0,0 +1,129 @@ +/*- + * Copyright (c) 2009 Robert C. Noland III + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_scatter.c + * Allocation of memory for scatter-gather mappings by the graphics chip. + * The memory allocated here is then made into an aperture in the card + * by mapping the pages into the GART. + */ + +#include + +int +drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather *request) +{ + struct drm_sg_mem *entry; + vm_size_t size; + vm_pindex_t pindex; + + if (dev->sg) + return EINVAL; + + DRM_DEBUG("request size=%ld\n", request->size); + + entry = malloc(sizeof(*entry), DRM_MEM_DRIVER, M_WAITOK | M_ZERO); + + size = round_page(request->size); + entry->pages = OFF_TO_IDX(size); + entry->busaddr = malloc(entry->pages * sizeof(*entry->busaddr), + DRM_MEM_SGLISTS, M_WAITOK | M_ZERO); + + entry->vaddr = kmem_alloc_attr(kernel_map, size, M_WAITOK | M_ZERO, + 0, BUS_SPACE_MAXADDR_32BIT, VM_MEMATTR_WRITE_COMBINING); + if (entry->vaddr == 0) { + drm_sg_cleanup(entry); + return (ENOMEM); + } + + for(pindex = 0; pindex < entry->pages; pindex++) { + entry->busaddr[pindex] = + vtophys(entry->vaddr + IDX_TO_OFF(pindex)); + } + + DRM_LOCK(dev); + if (dev->sg) { + DRM_UNLOCK(dev); + drm_sg_cleanup(entry); + return (EINVAL); + } + dev->sg = entry; + DRM_UNLOCK(dev); + + request->handle = entry->vaddr; + + DRM_DEBUG("allocated %ju pages @ 0x%08zx, contents=%08lx\n", + entry->pages, entry->vaddr, *(unsigned long *)entry->vaddr); + + return (0); +} + +int +drm_sg_alloc_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_scatter_gather *request = data; + + DRM_DEBUG("\n"); + + return (drm_sg_alloc(dev, request)); +} + +void +drm_sg_cleanup(struct drm_sg_mem *entry) +{ + if (entry == NULL) + return; + + if (entry->vaddr != 0) + kmem_free(kernel_map, entry->vaddr, IDX_TO_OFF(entry->pages)); + + free(entry->busaddr, DRM_MEM_SGLISTS); + free(entry, DRM_MEM_DRIVER); + + return; +} + +int +drm_sg_free(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + struct drm_scatter_gather *request = data; + struct drm_sg_mem *entry; + + DRM_LOCK(dev); + entry = dev->sg; + dev->sg = NULL; + DRM_UNLOCK(dev); + + if (!entry || entry->vaddr != request->handle) + return (EINVAL); + + DRM_DEBUG("free 0x%zx\n", entry->vaddr); + + drm_sg_cleanup(entry); + + return (0); +} diff --git a/sys/dev/drm2/drm_sman.c b/sys/dev/drm2/drm_sman.c new file mode 100644 index 00000000000..1c1e4af3225 --- /dev/null +++ b/sys/dev/drm2/drm_sman.c @@ -0,0 +1,352 @@ +/************************************************************************** + * + * Copyright 2006 Tungsten Graphics, Inc., Bismarck., ND., USA. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * + **************************************************************************/ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Simple memory manager interface that keeps track on allocate regions on a + * per "owner" basis. All regions associated with an "owner" can be released + * with a simple call. Typically if the "owner" exists. The owner is any + * "unsigned long" identifier. Can typically be a pointer to a file private + * struct or a context identifier. + * + * Authors: + * Thomas Hellström + */ + +#include +#include + +struct drm_owner_item { + struct drm_hash_item owner_hash; + struct list_head sman_list; + struct list_head mem_blocks; +}; + +void drm_sman_takedown(struct drm_sman * sman) +{ + drm_ht_remove(&sman->user_hash_tab); + drm_ht_remove(&sman->owner_hash_tab); + if (sman->mm) + drm_free(sman->mm, sman->num_managers * sizeof(*sman->mm), + DRM_MEM_MM); +} + +int +drm_sman_init(struct drm_sman * sman, unsigned int num_managers, + unsigned int user_order, unsigned int owner_order) +{ + int ret = 0; + + sman->mm = (struct drm_sman_mm *) drm_calloc(num_managers, + sizeof(*sman->mm), DRM_MEM_MM); + if (!sman->mm) { + ret = -ENOMEM; + goto out; + } + sman->num_managers = num_managers; + INIT_LIST_HEAD(&sman->owner_items); + ret = drm_ht_create(&sman->owner_hash_tab, owner_order); + if (ret) + goto out1; + ret = drm_ht_create(&sman->user_hash_tab, user_order); + if (!ret) + goto out; + + drm_ht_remove(&sman->owner_hash_tab); +out1: + drm_free(sman->mm, num_managers * sizeof(*sman->mm), DRM_MEM_MM); +out: + return ret; +} + +static void *drm_sman_mm_allocate(void *private, unsigned long size, + unsigned alignment) +{ + struct drm_mm *mm = (struct drm_mm *) private; + struct drm_mm_node *tmp; + + tmp = drm_mm_search_free(mm, size, alignment, 1); + if (!tmp) { + return NULL; + } + /* This could be non-atomic, but we are called from a locked path */ + tmp = drm_mm_get_block_atomic(tmp, size, alignment); + return tmp; +} + +static void drm_sman_mm_free(void *private, void *ref) +{ + struct drm_mm_node *node = (struct drm_mm_node *) ref; + + drm_mm_put_block(node); +} + +static void drm_sman_mm_destroy(void *private) +{ + struct drm_mm *mm = (struct drm_mm *) private; + drm_mm_takedown(mm); + drm_free(mm, sizeof(*mm), DRM_MEM_MM); +} + +static unsigned long drm_sman_mm_offset(void *private, void *ref) +{ + struct drm_mm_node *node = (struct drm_mm_node *) ref; + return node->start; +} + +int +drm_sman_set_range(struct drm_sman * sman, unsigned int manager, + unsigned long start, unsigned long size) +{ + struct drm_sman_mm *sman_mm; + struct drm_mm *mm; + int ret; + + KASSERT(manager < sman->num_managers, ("Invalid manager")); + + sman_mm = &sman->mm[manager]; + mm = malloc(sizeof(*mm), DRM_MEM_MM, M_NOWAIT | M_ZERO); + if (!mm) { + return -ENOMEM; + } + sman_mm->private = mm; + ret = drm_mm_init(mm, start, size); + + if (ret) { + drm_free(mm, sizeof(*mm), DRM_MEM_MM); + return ret; + } + + sman_mm->allocate = drm_sman_mm_allocate; + sman_mm->free = drm_sman_mm_free; + sman_mm->destroy = drm_sman_mm_destroy; + sman_mm->offset = drm_sman_mm_offset; + + return 0; +} + +int +drm_sman_set_manager(struct drm_sman * sman, unsigned int manager, + struct drm_sman_mm * allocator) +{ + KASSERT(manager < sman->num_managers, ("Invalid manager")); + sman->mm[manager] = *allocator; + + return 0; +} + +static struct drm_owner_item *drm_sman_get_owner_item(struct drm_sman * sman, + unsigned long owner) +{ + int ret; + struct drm_hash_item *owner_hash_item; + struct drm_owner_item *owner_item; + + ret = drm_ht_find_item(&sman->owner_hash_tab, owner, &owner_hash_item); + if (!ret) { + return drm_hash_entry(owner_hash_item, struct drm_owner_item, + owner_hash); + } + + owner_item = malloc(sizeof(*owner_item), DRM_MEM_MM, M_NOWAIT | M_ZERO); + if (!owner_item) + goto out; + + INIT_LIST_HEAD(&owner_item->mem_blocks); + owner_item->owner_hash.key = owner; + DRM_DEBUG("owner_item = %p, mem_blocks = %p\n", owner_item, &owner_item->mem_blocks); + if (drm_ht_insert_item(&sman->owner_hash_tab, &owner_item->owner_hash)) + goto out1; + + list_add_tail(&owner_item->sman_list, &sman->owner_items); + return owner_item; + +out1: + drm_free(owner_item, sizeof(*owner_item), DRM_MEM_MM); +out: + return NULL; +} + +struct drm_memblock_item *drm_sman_alloc(struct drm_sman *sman, unsigned int manager, + unsigned long size, unsigned alignment, + unsigned long owner) +{ + void *tmp; + struct drm_sman_mm *sman_mm; + struct drm_owner_item *owner_item; + struct drm_memblock_item *memblock; + + KASSERT(manager < sman->num_managers, ("Invalid manager")); + + sman_mm = &sman->mm[manager]; + tmp = sman_mm->allocate(sman_mm->private, size, alignment); + if (!tmp) { + return NULL; + } + + memblock = malloc(sizeof(*memblock), DRM_MEM_MM, M_NOWAIT | M_ZERO); + DRM_DEBUG("allocated mem_block %p\n", memblock); + if (!memblock) + goto out; + + memblock->mm_info = tmp; + memblock->mm = sman_mm; + memblock->sman = sman; + INIT_LIST_HEAD(&memblock->owner_list); + + if (drm_ht_just_insert_please + (&sman->user_hash_tab, &memblock->user_hash, + (unsigned long)memblock, 32, 0, 0)) + goto out1; + + owner_item = drm_sman_get_owner_item(sman, owner); + if (!owner_item) + goto out2; + + DRM_DEBUG("owner_item = %p, mem_blocks = %p\n", owner_item, &owner_item->mem_blocks); + DRM_DEBUG("owner_list.prev = %p, mem_blocks.prev = %p\n", memblock->owner_list.prev, owner_item->mem_blocks.prev); + DRM_DEBUG("owner_list.next = %p, mem_blocks.next = %p\n", memblock->owner_list.next, owner_item->mem_blocks.next); + list_add_tail(&memblock->owner_list, &owner_item->mem_blocks); + + DRM_DEBUG("Complete\n"); + return memblock; + +out2: + drm_ht_remove_item(&sman->user_hash_tab, &memblock->user_hash); +out1: + drm_free(memblock, sizeof(*memblock), DRM_MEM_MM); +out: + sman_mm->free(sman_mm->private, tmp); + + return NULL; +} + +static void drm_sman_free(struct drm_memblock_item *item) +{ + struct drm_sman *sman = item->sman; + + list_del(&item->owner_list); + drm_ht_remove_item(&sman->user_hash_tab, &item->user_hash); + item->mm->free(item->mm->private, item->mm_info); + drm_free(item, sizeof(*item), DRM_MEM_MM); +} + +int drm_sman_free_key(struct drm_sman *sman, unsigned int key) +{ + struct drm_hash_item *hash_item; + struct drm_memblock_item *memblock_item; + + if (drm_ht_find_item(&sman->user_hash_tab, key, &hash_item)) + return -EINVAL; + + memblock_item = drm_hash_entry(hash_item, struct drm_memblock_item, + user_hash); + drm_sman_free(memblock_item); + return 0; +} + +static void drm_sman_remove_owner(struct drm_sman *sman, + struct drm_owner_item *owner_item) +{ + list_del(&owner_item->sman_list); + drm_ht_remove_item(&sman->owner_hash_tab, &owner_item->owner_hash); + drm_free(owner_item, sizeof(*owner_item), DRM_MEM_MM); +} + +int drm_sman_owner_clean(struct drm_sman *sman, unsigned long owner) +{ + + struct drm_hash_item *hash_item; + struct drm_owner_item *owner_item; + + if (drm_ht_find_item(&sman->owner_hash_tab, owner, &hash_item)) { + return -1; + } + + owner_item = drm_hash_entry(hash_item, struct drm_owner_item, owner_hash); + DRM_DEBUG("cleaning owner_item %p\n", owner_item); + if (owner_item->mem_blocks.next == &owner_item->mem_blocks) { + drm_sman_remove_owner(sman, owner_item); + return -1; + } + + return 0; +} + +static void drm_sman_do_owner_cleanup(struct drm_sman *sman, + struct drm_owner_item *owner_item) +{ + struct drm_memblock_item *entry, *next; + + list_for_each_entry_safe(entry, next, &owner_item->mem_blocks, + owner_list) { + DRM_DEBUG("freeing mem_block %p\n", entry); + drm_sman_free(entry); + } + drm_sman_remove_owner(sman, owner_item); +} + +void drm_sman_owner_cleanup(struct drm_sman *sman, unsigned long owner) +{ + + struct drm_hash_item *hash_item; + struct drm_owner_item *owner_item; + + if (drm_ht_find_item(&sman->owner_hash_tab, owner, &hash_item)) { + + return; + } + + owner_item = drm_hash_entry(hash_item, struct drm_owner_item, owner_hash); + drm_sman_do_owner_cleanup(sman, owner_item); +} + +void drm_sman_cleanup(struct drm_sman *sman) +{ + struct drm_owner_item *entry, *next; + unsigned int i; + struct drm_sman_mm *sman_mm; + + DRM_DEBUG("sman = %p, owner_items = %p\n", + sman, &sman->owner_items); + list_for_each_entry_safe(entry, next, &sman->owner_items, sman_list) { + DRM_DEBUG("cleaning owner_item = %p\n", entry); + drm_sman_do_owner_cleanup(sman, entry); + } + if (sman->mm) { + for (i = 0; i < sman->num_managers; ++i) { + sman_mm = &sman->mm[i]; + if (sman_mm->private) { + sman_mm->destroy(sman_mm->private); + sman_mm->private = NULL; + } + } + } +} diff --git a/sys/dev/drm2/drm_sman.h b/sys/dev/drm2/drm_sman.h new file mode 100644 index 00000000000..3b1693fb0ba --- /dev/null +++ b/sys/dev/drm2/drm_sman.h @@ -0,0 +1,181 @@ +/************************************************************************** + * + * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + **************************************************************************/ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Simple memory MANager interface that keeps track on allocate regions on a + * per "owner" basis. All regions associated with an "owner" can be released + * with a simple call. Typically if the "owner" exists. The owner is any + * "unsigned long" identifier. Can typically be a pointer to a file private + * struct or a context identifier. + * + * Authors: + * Thomas Hellström + */ + +#ifndef DRM_SMAN_H +#define DRM_SMAN_H + +#include +#include +#include + +/* + * A class that is an abstration of a simple memory allocator. + * The sman implementation provides a default such allocator + * using the drm_mm.c implementation. But the user can replace it. + * See the SiS implementation, which may use the SiS FB kernel module + * for memory management. + */ + +struct drm_sman_mm { + /* private info. If allocated, needs to be destroyed by the destroy + function */ + void *private; + + /* Allocate a memory block with given size and alignment. + Return an opaque reference to the memory block */ + + void *(*allocate) (void *private, unsigned long size, + unsigned alignment); + + /* Free a memory block. "ref" is the opaque reference that we got from + the "alloc" function */ + + void (*free) (void *private, void *ref); + + /* Free all resources associated with this allocator */ + + void (*destroy) (void *private); + + /* Return a memory offset from the opaque reference returned from the + "alloc" function */ + + unsigned long (*offset) (void *private, void *ref); +}; + +struct drm_memblock_item { + struct list_head owner_list; + struct drm_hash_item user_hash; + void *mm_info; + struct drm_sman_mm *mm; + struct drm_sman *sman; +}; + +struct drm_sman { + struct drm_sman_mm *mm; + int num_managers; + struct drm_open_hash owner_hash_tab; + struct drm_open_hash user_hash_tab; + struct list_head owner_items; +}; + +/* + * Take down a memory manager. This function should only be called after a + * successful init and after a call to drm_sman_cleanup. + */ + +extern void drm_sman_takedown(struct drm_sman * sman); + +/* + * Allocate structures for a manager. + * num_managers are the number of memory pools to manage. (VRAM, AGP, ....) + * user_order is the log2 of the number of buckets in the user hash table. + * set this to approximately log2 of the max number of memory regions + * that will be allocated for _all_ pools together. + * owner_order is the log2 of the number of buckets in the owner hash table. + * set this to approximately log2 of + * the number of client file connections that will + * be using the manager. + * + */ + +extern int drm_sman_init(struct drm_sman * sman, unsigned int num_managers, + unsigned int user_order, unsigned int owner_order); + +/* + * Initialize a drm_mm.c allocator. Should be called only once for each + * manager unless a customized allogator is used. + */ + +extern int drm_sman_set_range(struct drm_sman * sman, unsigned int manager, + unsigned long start, unsigned long size); + +/* + * Initialize a customized allocator for one of the managers. + * (See the SiS module). The object pointed to by "allocator" is copied, + * so it can be destroyed after this call. + */ + +extern int drm_sman_set_manager(struct drm_sman * sman, unsigned int mananger, + struct drm_sman_mm * allocator); + +/* + * Allocate a memory block. Aligment is not implemented yet. + */ + +extern struct drm_memblock_item *drm_sman_alloc(struct drm_sman * sman, + unsigned int manager, + unsigned long size, + unsigned alignment, + unsigned long owner); +/* + * Free a memory block identified by its user hash key. + */ + +extern int drm_sman_free_key(struct drm_sman * sman, unsigned int key); + +/* + * returns 1 iff there are no stale memory blocks associated with this owner. + * Typically called to determine if we need to idle the hardware and call + * drm_sman_owner_cleanup. If there are no stale memory blocks, it removes all + * resources associated with owner. + */ + +extern int drm_sman_owner_clean(struct drm_sman * sman, unsigned long owner); + +/* + * Frees all stale memory blocks associated with this owner. Note that this + * requires that the hardware is finished with all blocks, so the graphics engine + * should be idled before this call is made. This function also frees + * any resources associated with "owner" and should be called when owner + * is not going to be referenced anymore. + */ + +extern void drm_sman_owner_cleanup(struct drm_sman * sman, unsigned long owner); + +/* + * Frees all stale memory blocks associated with the memory manager. + * See idling above. + */ + +extern void drm_sman_cleanup(struct drm_sman * sman); + +#endif diff --git a/sys/dev/drm2/drm_stub.c b/sys/dev/drm2/drm_stub.c new file mode 100644 index 00000000000..2c87dec7915 --- /dev/null +++ b/sys/dev/drm2/drm_stub.c @@ -0,0 +1,60 @@ +/** + * \file drm_stub.h + * Stub support + * + * \author Rickard E. (Rik) Faith + */ + +/* + * Created: Fri Jan 19 10:48:35 2001 by faith@acm.org + * + * Copyright 2001 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "drmP.h" + +int +drm_setmaster_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + + DRM_DEBUG("setmaster\n"); + + if (file_priv->master != 0) + return (0); + return (-EPERM); +} + +int +drm_dropmaster_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + + DRM_DEBUG("dropmaster\n"); + if (file_priv->master != 0) + return (-EINVAL); + return (0); +} diff --git a/sys/dev/drm2/drm_sysctl.c b/sys/dev/drm2/drm_sysctl.c new file mode 100644 index 00000000000..33048c78a5d --- /dev/null +++ b/sys/dev/drm2/drm_sysctl.c @@ -0,0 +1,364 @@ +/*- + * Copyright 2003 Eric Anholt + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * ERIC ANHOLT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_sysctl.c + * Implementation of various sysctls for controlling DRM behavior and reporting + * debug information. + */ + +#include +#include + +#include + +static int drm_name_info DRM_SYSCTL_HANDLER_ARGS; +static int drm_vm_info DRM_SYSCTL_HANDLER_ARGS; +static int drm_clients_info DRM_SYSCTL_HANDLER_ARGS; +static int drm_bufs_info DRM_SYSCTL_HANDLER_ARGS; +static int drm_vblank_info DRM_SYSCTL_HANDLER_ARGS; + +struct drm_sysctl_list { + const char *name; + int (*f) DRM_SYSCTL_HANDLER_ARGS; +} drm_sysctl_list[] = { + {"name", drm_name_info}, + {"vm", drm_vm_info}, + {"clients", drm_clients_info}, + {"bufs", drm_bufs_info}, + {"vblank", drm_vblank_info}, +}; +#define DRM_SYSCTL_ENTRIES (sizeof(drm_sysctl_list)/sizeof(drm_sysctl_list[0])) + +struct drm_sysctl_info { + struct sysctl_ctx_list ctx; + char name[2]; +}; + +int drm_sysctl_init(struct drm_device *dev) +{ + struct drm_sysctl_info *info; + struct sysctl_oid *oid; + struct sysctl_oid *top, *drioid; + int i; + + info = malloc(sizeof *info, DRM_MEM_DRIVER, M_WAITOK | M_ZERO); + dev->sysctl = info; + + /* Add the sysctl node for DRI if it doesn't already exist */ + drioid = SYSCTL_ADD_NODE(&info->ctx, &sysctl__hw_children, OID_AUTO, + "dri", CTLFLAG_RW, NULL, "DRI Graphics"); + if (!drioid) + return 1; + + /* Find the next free slot under hw.dri */ + i = 0; + SLIST_FOREACH(oid, SYSCTL_CHILDREN(drioid), oid_link) { + if (i <= oid->oid_arg2) + i = oid->oid_arg2 + 1; + } + if (i > 9) + return (1); + + dev->sysctl_node_idx = i; + /* Add the hw.dri.x for our device */ + info->name[0] = '0' + i; + info->name[1] = 0; + top = SYSCTL_ADD_NODE(&info->ctx, SYSCTL_CHILDREN(drioid), + OID_AUTO, info->name, CTLFLAG_RW, NULL, NULL); + if (!top) + return 1; + + for (i = 0; i < DRM_SYSCTL_ENTRIES; i++) { + oid = SYSCTL_ADD_OID(&info->ctx, + SYSCTL_CHILDREN(top), + OID_AUTO, + drm_sysctl_list[i].name, + CTLTYPE_STRING | CTLFLAG_RD, + dev, + 0, + drm_sysctl_list[i].f, + "A", + NULL); + if (!oid) + return 1; + } + SYSCTL_ADD_INT(&info->ctx, SYSCTL_CHILDREN(drioid), OID_AUTO, "debug", + CTLFLAG_RW, &drm_debug_flag, sizeof(drm_debug_flag), + "Enable debugging output"); + SYSCTL_ADD_INT(&info->ctx, SYSCTL_CHILDREN(drioid), OID_AUTO, "notyet", + CTLFLAG_RW, &drm_notyet_flag, sizeof(drm_debug_flag), + "Enable notyet reminders"); + + if (dev->driver->sysctl_init != NULL) + dev->driver->sysctl_init(dev, &info->ctx, top); + + SYSCTL_ADD_INT(&info->ctx, SYSCTL_CHILDREN(drioid), OID_AUTO, + "vblank_offdelay", CTLFLAG_RW, &drm_vblank_offdelay, + sizeof(drm_vblank_offdelay), + ""); + SYSCTL_ADD_INT(&info->ctx, SYSCTL_CHILDREN(drioid), OID_AUTO, + "timestamp_precision", CTLFLAG_RW, &drm_timestamp_precision, + sizeof(drm_timestamp_precision), + ""); + + return (0); +} + +int drm_sysctl_cleanup(struct drm_device *dev) +{ + int error; + + error = sysctl_ctx_free(&dev->sysctl->ctx); + free(dev->sysctl, DRM_MEM_DRIVER); + dev->sysctl = NULL; + if (dev->driver->sysctl_cleanup != NULL) + dev->driver->sysctl_cleanup(dev); + + return (error); +} + +#define DRM_SYSCTL_PRINT(fmt, arg...) \ +do { \ + snprintf(buf, sizeof(buf), fmt, ##arg); \ + retcode = SYSCTL_OUT(req, buf, strlen(buf)); \ + if (retcode) \ + goto done; \ +} while (0) + +static int drm_name_info DRM_SYSCTL_HANDLER_ARGS +{ + struct drm_device *dev = arg1; + char buf[128]; + int retcode; + int hasunique = 0; + + DRM_SYSCTL_PRINT("%s 0x%x", dev->driver->name, dev2udev(dev->devnode)); + + DRM_LOCK(dev); + if (dev->unique) { + snprintf(buf, sizeof(buf), " %s", dev->unique); + hasunique = 1; + } + DRM_UNLOCK(dev); + + if (hasunique) + SYSCTL_OUT(req, buf, strlen(buf)); + + SYSCTL_OUT(req, "", 1); + +done: + return retcode; +} + +static int drm_vm_info DRM_SYSCTL_HANDLER_ARGS +{ + struct drm_device *dev = arg1; + drm_local_map_t *map, *tempmaps; + const char *types[] = { "FB", "REG", "SHM", "AGP", "SG" }; + const char *type, *yesno; + int i, mapcount; + char buf[128]; + int retcode; + + /* We can't hold the lock while doing SYSCTL_OUTs, so allocate a + * temporary copy of all the map entries and then SYSCTL_OUT that. + */ + DRM_LOCK(dev); + + mapcount = 0; + TAILQ_FOREACH(map, &dev->maplist, link) + mapcount++; + + tempmaps = malloc(sizeof(drm_local_map_t) * mapcount, DRM_MEM_DRIVER, + M_NOWAIT); + if (tempmaps == NULL) { + DRM_UNLOCK(dev); + return ENOMEM; + } + + i = 0; + TAILQ_FOREACH(map, &dev->maplist, link) + tempmaps[i++] = *map; + + DRM_UNLOCK(dev); + + DRM_SYSCTL_PRINT("\nslot offset size " + "type flags address handle mtrr\n"); + + for (i = 0; i < mapcount; i++) { + map = &tempmaps[i]; + + if (map->type < 0 || map->type > 4) + type = "??"; + else + type = types[map->type]; + + if (!map->mtrr) + yesno = "no"; + else + yesno = "yes"; + + DRM_SYSCTL_PRINT( + "%4d 0x%016lx 0x%08lx %4.4s 0x%02x 0x%016lx %6d %s\n", + i, map->offset, map->size, type, map->flags, + (unsigned long)map->virtual, + (unsigned int)((unsigned long)map->handle >> + DRM_MAP_HANDLE_SHIFT), yesno); + } + SYSCTL_OUT(req, "", 1); + +done: + free(tempmaps, DRM_MEM_DRIVER); + return retcode; +} + +static int drm_bufs_info DRM_SYSCTL_HANDLER_ARGS +{ + struct drm_device *dev = arg1; + drm_device_dma_t *dma = dev->dma; + drm_device_dma_t tempdma; + int *templists; + int i; + char buf[128]; + int retcode; + + /* We can't hold the locks around DRM_SYSCTL_PRINT, so make a temporary + * copy of the whole structure and the relevant data from buflist. + */ + DRM_LOCK(dev); + if (dma == NULL) { + DRM_UNLOCK(dev); + return 0; + } + DRM_SPINLOCK(&dev->dma_lock); + tempdma = *dma; + templists = malloc(sizeof(int) * dma->buf_count, DRM_MEM_DRIVER, + M_NOWAIT); + for (i = 0; i < dma->buf_count; i++) + templists[i] = dma->buflist[i]->list; + dma = &tempdma; + DRM_SPINUNLOCK(&dev->dma_lock); + DRM_UNLOCK(dev); + + DRM_SYSCTL_PRINT("\n o size count free segs pages kB\n"); + for (i = 0; i <= DRM_MAX_ORDER; i++) { + if (dma->bufs[i].buf_count) + DRM_SYSCTL_PRINT("%2d %8d %5d %5d %5d %5d %5d\n", + i, + dma->bufs[i].buf_size, + dma->bufs[i].buf_count, + atomic_read(&dma->bufs[i] + .freelist.count), + dma->bufs[i].seg_count, + dma->bufs[i].seg_count + *(1 << dma->bufs[i].page_order), + (dma->bufs[i].seg_count + * (1 << dma->bufs[i].page_order)) + * (int)PAGE_SIZE / 1024); + } + DRM_SYSCTL_PRINT("\n"); + for (i = 0; i < dma->buf_count; i++) { + if (i && !(i%32)) DRM_SYSCTL_PRINT("\n"); + DRM_SYSCTL_PRINT(" %d", templists[i]); + } + DRM_SYSCTL_PRINT("\n"); + + SYSCTL_OUT(req, "", 1); +done: + free(templists, DRM_MEM_DRIVER); + return retcode; +} + +static int drm_clients_info DRM_SYSCTL_HANDLER_ARGS +{ + struct drm_device *dev = arg1; + struct drm_file *priv, *tempprivs; + char buf[128]; + int retcode; + int privcount, i; + + DRM_LOCK(dev); + + privcount = 0; + TAILQ_FOREACH(priv, &dev->files, link) + privcount++; + + tempprivs = malloc(sizeof(struct drm_file) * privcount, DRM_MEM_DRIVER, + M_NOWAIT); + if (tempprivs == NULL) { + DRM_UNLOCK(dev); + return ENOMEM; + } + i = 0; + TAILQ_FOREACH(priv, &dev->files, link) + tempprivs[i++] = *priv; + + DRM_UNLOCK(dev); + + DRM_SYSCTL_PRINT( + "\na dev pid uid magic ioctls\n"); + for (i = 0; i < privcount; i++) { + priv = &tempprivs[i]; + DRM_SYSCTL_PRINT("%c %-12s %5d %5d %10u %10lu\n", + priv->authenticated ? 'y' : 'n', + devtoname(priv->dev->devnode), + priv->pid, + priv->uid, + priv->magic, + priv->ioctl_count); + } + + SYSCTL_OUT(req, "", 1); +done: + free(tempprivs, DRM_MEM_DRIVER); + return retcode; +} + +static int drm_vblank_info DRM_SYSCTL_HANDLER_ARGS +{ + struct drm_device *dev = arg1; + char buf[128]; + int retcode; + int i; + + DRM_SYSCTL_PRINT("\ncrtc ref count last enabled inmodeset\n"); + DRM_LOCK(dev); + if (dev->_vblank_count == NULL) + goto done; + for (i = 0 ; i < dev->num_crtcs ; i++) { + DRM_SYSCTL_PRINT(" %02d %02d %08d %08d %02d %02d\n", + i, dev->vblank_refcount[i], + dev->_vblank_count[i], + dev->last_vblank[i], + dev->vblank_enabled[i], + dev->vblank_inmodeset[i]); + } +done: + DRM_UNLOCK(dev); + + SYSCTL_OUT(req, "", -1); + return retcode; +} diff --git a/sys/dev/drm2/drm_vm.c b/sys/dev/drm2/drm_vm.c new file mode 100644 index 00000000000..a70fe7b504f --- /dev/null +++ b/sys/dev/drm2/drm_vm.c @@ -0,0 +1,134 @@ +/*- + * Copyright 2003 Eric Anholt + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * ERIC ANHOLT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +/** @file drm_vm.c + * Support code for mmaping of DRM maps. + */ + +#include +#include + +int +drm_mmap(struct cdev *kdev, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) +{ + struct drm_device *dev = drm_get_device_from_kdev(kdev); + struct drm_file *file_priv = NULL; + drm_local_map_t *map; + enum drm_map_type type; + vm_paddr_t phys; + int error; + + /* d_mmap gets called twice, we can only reference file_priv during + * the first call. We need to assume that if error is EBADF the + * call was succesful and the client is authenticated. + */ + error = devfs_get_cdevpriv((void **)&file_priv); + if (error == ENOENT) { + DRM_ERROR("Could not find authenticator!\n"); + return EINVAL; + } + + if (file_priv && !file_priv->authenticated) + return EACCES; + + DRM_DEBUG("called with offset %016jx\n", offset); + if (dev->dma && offset < ptoa(dev->dma->page_count)) { + drm_device_dma_t *dma = dev->dma; + + DRM_SPINLOCK(&dev->dma_lock); + + if (dma->pagelist != NULL) { + unsigned long page = offset >> PAGE_SHIFT; + unsigned long phys = dma->pagelist[page]; + + DRM_SPINUNLOCK(&dev->dma_lock); + *paddr = phys; + return 0; + } else { + DRM_SPINUNLOCK(&dev->dma_lock); + return -1; + } + } + + /* A sequential search of a linked list is + fine here because: 1) there will only be + about 5-10 entries in the list and, 2) a + DRI client only has to do this mapping + once, so it doesn't have to be optimized + for performance, even if the list was a + bit longer. + */ + DRM_LOCK(dev); + TAILQ_FOREACH(map, &dev->maplist, link) { + if (offset >> DRM_MAP_HANDLE_SHIFT == + (unsigned long)map->handle >> DRM_MAP_HANDLE_SHIFT) + break; + } + + if (map == NULL) { + DRM_DEBUG("Can't find map, request offset = %016jx\n", offset); + TAILQ_FOREACH(map, &dev->maplist, link) { + DRM_DEBUG("map offset = %016lx, handle = %016lx\n", + map->offset, (unsigned long)map->handle); + } + DRM_UNLOCK(dev); + return -1; + } + if (((map->flags & _DRM_RESTRICTED) && !DRM_SUSER(DRM_CURPROC))) { + DRM_UNLOCK(dev); + DRM_DEBUG("restricted map\n"); + return -1; + } + type = map->type; + DRM_UNLOCK(dev); + + offset = offset & ((1ULL << DRM_MAP_HANDLE_SHIFT) - 1); + + switch (type) { + case _DRM_FRAME_BUFFER: + case _DRM_AGP: + *memattr = VM_MEMATTR_WRITE_COMBINING; + /* FALLTHROUGH */ + case _DRM_REGISTERS: + phys = map->offset + offset; + break; + case _DRM_SCATTER_GATHER: + *memattr = VM_MEMATTR_WRITE_COMBINING; + /* FALLTHROUGH */ + case _DRM_CONSISTENT: + case _DRM_SHM: + phys = vtophys((char *)map->virtual + offset); + break; + default: + DRM_ERROR("bad map type %d\n", type); + return -1; /* This should never happen. */ + } + + *paddr = phys; + return 0; +} + diff --git a/sys/dev/drm2/i915/i915_debug.c b/sys/dev/drm2/i915/i915_debug.c new file mode 100644 index 00000000000..384ed4ae843 --- /dev/null +++ b/sys/dev/drm2/i915/i915_debug.c @@ -0,0 +1,1683 @@ +/* + * Copyright © 2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * Keith Packard + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include + +enum { + ACTIVE_LIST, + FLUSHING_LIST, + INACTIVE_LIST, + PINNED_LIST, + DEFERRED_FREE_LIST, +}; + +static const char * +yesno(int v) +{ + return (v ? "yes" : "no"); +} + +static int +i915_capabilities(struct drm_device *dev, struct sbuf *m, void *data) +{ + const struct intel_device_info *info = INTEL_INFO(dev); + + sbuf_printf(m, "gen: %d\n", info->gen); + if (HAS_PCH_SPLIT(dev)) + sbuf_printf(m, "pch: %d\n", INTEL_PCH_TYPE(dev)); +#define B(x) sbuf_printf(m, #x ": %s\n", yesno(info->x)) + B(is_mobile); + B(is_i85x); + B(is_i915g); + B(is_i945gm); + B(is_g33); + B(need_gfx_hws); + B(is_g4x); + B(is_pineview); + B(has_fbc); + B(has_pipe_cxsr); + B(has_hotplug); + B(cursor_needs_physical); + B(has_overlay); + B(overlay_needs_physical); + B(supports_tv); + B(has_bsd_ring); + B(has_blt_ring); + B(has_llc); +#undef B + + return (0); +} + +static const char * +get_pin_flag(struct drm_i915_gem_object *obj) +{ + if (obj->user_pin_count > 0) + return "P"; + else if (obj->pin_count > 0) + return "p"; + else + return " "; +} + +static const char * +get_tiling_flag(struct drm_i915_gem_object *obj) +{ + switch (obj->tiling_mode) { + default: + case I915_TILING_NONE: return (" "); + case I915_TILING_X: return ("X"); + case I915_TILING_Y: return ("Y"); + } +} + +static const char * +cache_level_str(int type) +{ + switch (type) { + case I915_CACHE_NONE: return " uncached"; + case I915_CACHE_LLC: return " snooped (LLC)"; + case I915_CACHE_LLC_MLC: return " snooped (LLC+MLC)"; + default: return (""); + } +} + +static void +describe_obj(struct sbuf *m, struct drm_i915_gem_object *obj) +{ + + sbuf_printf(m, "%p: %s%s %8zdKiB %04x %04x %d %d%s%s%s", + &obj->base, + get_pin_flag(obj), + get_tiling_flag(obj), + obj->base.size / 1024, + obj->base.read_domains, + obj->base.write_domain, + obj->last_rendering_seqno, + obj->last_fenced_seqno, + cache_level_str(obj->cache_level), + obj->dirty ? " dirty" : "", + obj->madv == I915_MADV_DONTNEED ? " purgeable" : ""); + if (obj->base.name) + sbuf_printf(m, " (name: %d)", obj->base.name); + if (obj->fence_reg != I915_FENCE_REG_NONE) + sbuf_printf(m, " (fence: %d)", obj->fence_reg); + if (obj->gtt_space != NULL) + sbuf_printf(m, " (gtt offset: %08x, size: %08x)", + obj->gtt_offset, (unsigned int)obj->gtt_space->size); + if (obj->pin_mappable || obj->fault_mappable) { + char s[3], *t = s; + if (obj->pin_mappable) + *t++ = 'p'; + if (obj->fault_mappable) + *t++ = 'f'; + *t = '\0'; + sbuf_printf(m, " (%s mappable)", s); + } + if (obj->ring != NULL) + sbuf_printf(m, " (%s)", obj->ring->name); +} + +static int +i915_gem_object_list_info(struct drm_device *dev, struct sbuf *m, void *data) +{ + uintptr_t list = (uintptr_t)data; + struct list_head *head; + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_i915_gem_object *obj; + size_t total_obj_size, total_gtt_size; + int count; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + + switch (list) { + case ACTIVE_LIST: + sbuf_printf(m, "Active:\n"); + head = &dev_priv->mm.active_list; + break; + case INACTIVE_LIST: + sbuf_printf(m, "Inactive:\n"); + head = &dev_priv->mm.inactive_list; + break; + case PINNED_LIST: + sbuf_printf(m, "Pinned:\n"); + head = &dev_priv->mm.pinned_list; + break; + case FLUSHING_LIST: + sbuf_printf(m, "Flushing:\n"); + head = &dev_priv->mm.flushing_list; + break; + case DEFERRED_FREE_LIST: + sbuf_printf(m, "Deferred free:\n"); + head = &dev_priv->mm.deferred_free_list; + break; + default: + DRM_UNLOCK(dev); + return (EINVAL); + } + + total_obj_size = total_gtt_size = count = 0; + list_for_each_entry(obj, head, mm_list) { + sbuf_printf(m, " "); + describe_obj(m, obj); + sbuf_printf(m, "\n"); + total_obj_size += obj->base.size; + total_gtt_size += obj->gtt_space->size; + count++; + } + DRM_UNLOCK(dev); + + sbuf_printf(m, "Total %d objects, %zu bytes, %zu GTT size\n", + count, total_obj_size, total_gtt_size); + return (0); +} + +#define count_objects(list, member) do { \ + list_for_each_entry(obj, list, member) { \ + size += obj->gtt_space->size; \ + ++count; \ + if (obj->map_and_fenceable) { \ + mappable_size += obj->gtt_space->size; \ + ++mappable_count; \ + } \ + } \ +} while (0) + +static int +i915_gem_object_info(struct drm_device *dev, struct sbuf *m, void *data) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 count, mappable_count; + size_t size, mappable_size; + struct drm_i915_gem_object *obj; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + sbuf_printf(m, "%u objects, %zu bytes\n", + dev_priv->mm.object_count, + dev_priv->mm.object_memory); + + size = count = mappable_size = mappable_count = 0; + count_objects(&dev_priv->mm.gtt_list, gtt_list); + sbuf_printf(m, "%u [%u] objects, %zu [%zu] bytes in gtt\n", + count, mappable_count, size, mappable_size); + + size = count = mappable_size = mappable_count = 0; + count_objects(&dev_priv->mm.active_list, mm_list); + count_objects(&dev_priv->mm.flushing_list, mm_list); + sbuf_printf(m, " %u [%u] active objects, %zu [%zu] bytes\n", + count, mappable_count, size, mappable_size); + + size = count = mappable_size = mappable_count = 0; + count_objects(&dev_priv->mm.pinned_list, mm_list); + sbuf_printf(m, " %u [%u] pinned objects, %zu [%zu] bytes\n", + count, mappable_count, size, mappable_size); + + size = count = mappable_size = mappable_count = 0; + count_objects(&dev_priv->mm.inactive_list, mm_list); + sbuf_printf(m, " %u [%u] inactive objects, %zu [%zu] bytes\n", + count, mappable_count, size, mappable_size); + + size = count = mappable_size = mappable_count = 0; + count_objects(&dev_priv->mm.deferred_free_list, mm_list); + sbuf_printf(m, " %u [%u] freed objects, %zu [%zu] bytes\n", + count, mappable_count, size, mappable_size); + + size = count = mappable_size = mappable_count = 0; + list_for_each_entry(obj, &dev_priv->mm.gtt_list, gtt_list) { + if (obj->fault_mappable) { + size += obj->gtt_space->size; + ++count; + } + if (obj->pin_mappable) { + mappable_size += obj->gtt_space->size; + ++mappable_count; + } + } + sbuf_printf(m, "%u pinned mappable objects, %zu bytes\n", + mappable_count, mappable_size); + sbuf_printf(m, "%u fault mappable objects, %zu bytes\n", + count, size); + + sbuf_printf(m, "%zu [%zu] gtt total\n", + dev_priv->mm.gtt_total, dev_priv->mm.mappable_gtt_total); + DRM_UNLOCK(dev); + + return (0); +} + +static int +i915_gem_gtt_info(struct drm_device *dev, struct sbuf *m, void* data) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_i915_gem_object *obj; + size_t total_obj_size, total_gtt_size; + int count; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + + total_obj_size = total_gtt_size = count = 0; + list_for_each_entry(obj, &dev_priv->mm.gtt_list, gtt_list) { + sbuf_printf(m, " "); + describe_obj(m, obj); + sbuf_printf(m, "\n"); + total_obj_size += obj->base.size; + total_gtt_size += obj->gtt_space->size; + count++; + } + + DRM_UNLOCK(dev); + + sbuf_printf(m, "Total %d objects, %zu bytes, %zu GTT size\n", + count, total_obj_size, total_gtt_size); + + return (0); +} + +static int +i915_gem_pageflip_info(struct drm_device *dev, struct sbuf *m, void *data) +{ + struct intel_crtc *crtc; + struct drm_i915_gem_object *obj; + struct intel_unpin_work *work; + char pipe; + char plane; + + if ((dev->driver->driver_features & DRIVER_MODESET) == 0) + return (0); + list_for_each_entry(crtc, &dev->mode_config.crtc_list, base.head) { + pipe = pipe_name(crtc->pipe); + plane = plane_name(crtc->plane); + + mtx_lock(&dev->event_lock); + work = crtc->unpin_work; + if (work == NULL) { + sbuf_printf(m, "No flip due on pipe %c (plane %c)\n", + pipe, plane); + } else { + if (!work->pending) { + sbuf_printf(m, "Flip queued on pipe %c (plane %c)\n", + pipe, plane); + } else { + sbuf_printf(m, "Flip pending (waiting for vsync) on pipe %c (plane %c)\n", + pipe, plane); + } + if (work->enable_stall_check) + sbuf_printf(m, "Stall check enabled, "); + else + sbuf_printf(m, "Stall check waiting for page flip ioctl, "); + sbuf_printf(m, "%d prepares\n", work->pending); + + if (work->old_fb_obj) { + obj = work->old_fb_obj; + if (obj) + sbuf_printf(m, "Old framebuffer gtt_offset 0x%08x\n", obj->gtt_offset); + } + if (work->pending_flip_obj) { + obj = work->pending_flip_obj; + if (obj) + sbuf_printf(m, "New framebuffer gtt_offset 0x%08x\n", obj->gtt_offset); + } + } + mtx_unlock(&dev->event_lock); + } + + return (0); +} + +static int +i915_gem_request_info(struct drm_device *dev, struct sbuf *m, void *data) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_i915_gem_request *gem_request; + int count; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + + count = 0; + if (!list_empty(&dev_priv->rings[RCS].request_list)) { + sbuf_printf(m, "Render requests:\n"); + list_for_each_entry(gem_request, + &dev_priv->rings[RCS].request_list, + list) { + sbuf_printf(m, " %d @ %d\n", + gem_request->seqno, + (int) (jiffies - gem_request->emitted_jiffies)); + } + count++; + } + if (!list_empty(&dev_priv->rings[VCS].request_list)) { + sbuf_printf(m, "BSD requests:\n"); + list_for_each_entry(gem_request, + &dev_priv->rings[VCS].request_list, + list) { + sbuf_printf(m, " %d @ %d\n", + gem_request->seqno, + (int) (jiffies - gem_request->emitted_jiffies)); + } + count++; + } + if (!list_empty(&dev_priv->rings[BCS].request_list)) { + sbuf_printf(m, "BLT requests:\n"); + list_for_each_entry(gem_request, + &dev_priv->rings[BCS].request_list, + list) { + sbuf_printf(m, " %d @ %d\n", + gem_request->seqno, + (int) (jiffies - gem_request->emitted_jiffies)); + } + count++; + } + DRM_UNLOCK(dev); + + if (count == 0) + sbuf_printf(m, "No requests\n"); + + return 0; +} + +static void +i915_ring_seqno_info(struct sbuf *m, struct intel_ring_buffer *ring) +{ + if (ring->get_seqno) { + sbuf_printf(m, "Current sequence (%s): %d\n", + ring->name, ring->get_seqno(ring)); + sbuf_printf(m, "Waiter sequence (%s): %d\n", + ring->name, ring->waiting_seqno); + sbuf_printf(m, "IRQ sequence (%s): %d\n", + ring->name, ring->irq_seqno); + } +} + +static int +i915_gem_seqno_info(struct drm_device *dev, struct sbuf *m, void *data) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int i; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + for (i = 0; i < I915_NUM_RINGS; i++) + i915_ring_seqno_info(m, &dev_priv->rings[i]); + DRM_UNLOCK(dev); + return (0); +} + + +static int +i915_interrupt_info(struct drm_device *dev, struct sbuf *m, void *data) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int i, pipe; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + + if (!HAS_PCH_SPLIT(dev)) { + sbuf_printf(m, "Interrupt enable: %08x\n", + I915_READ(IER)); + sbuf_printf(m, "Interrupt identity: %08x\n", + I915_READ(IIR)); + sbuf_printf(m, "Interrupt mask: %08x\n", + I915_READ(IMR)); + for_each_pipe(pipe) + sbuf_printf(m, "Pipe %c stat: %08x\n", + pipe_name(pipe), + I915_READ(PIPESTAT(pipe))); + } else { + sbuf_printf(m, "North Display Interrupt enable: %08x\n", + I915_READ(DEIER)); + sbuf_printf(m, "North Display Interrupt identity: %08x\n", + I915_READ(DEIIR)); + sbuf_printf(m, "North Display Interrupt mask: %08x\n", + I915_READ(DEIMR)); + sbuf_printf(m, "South Display Interrupt enable: %08x\n", + I915_READ(SDEIER)); + sbuf_printf(m, "South Display Interrupt identity: %08x\n", + I915_READ(SDEIIR)); + sbuf_printf(m, "South Display Interrupt mask: %08x\n", + I915_READ(SDEIMR)); + sbuf_printf(m, "Graphics Interrupt enable: %08x\n", + I915_READ(GTIER)); + sbuf_printf(m, "Graphics Interrupt identity: %08x\n", + I915_READ(GTIIR)); + sbuf_printf(m, "Graphics Interrupt mask: %08x\n", + I915_READ(GTIMR)); + } + sbuf_printf(m, "Interrupts received: %d\n", + atomic_read(&dev_priv->irq_received)); + for (i = 0; i < I915_NUM_RINGS; i++) { + if (IS_GEN6(dev) || IS_GEN7(dev)) { + sbuf_printf(m, "Graphics Interrupt mask (%s): %08x\n", + dev_priv->rings[i].name, + I915_READ_IMR(&dev_priv->rings[i])); + } + i915_ring_seqno_info(m, &dev_priv->rings[i]); + } + DRM_UNLOCK(dev); + + return (0); +} + +static int +i915_gem_fence_regs_info(struct drm_device *dev, struct sbuf *m, void *data) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int i; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + + sbuf_printf(m, "Reserved fences = %d\n", dev_priv->fence_reg_start); + sbuf_printf(m, "Total fences = %d\n", dev_priv->num_fence_regs); + for (i = 0; i < dev_priv->num_fence_regs; i++) { + struct drm_i915_gem_object *obj = dev_priv->fence_regs[i].obj; + + sbuf_printf(m, "Fenced object[%2d] = ", i); + if (obj == NULL) + sbuf_printf(m, "unused"); + else + describe_obj(m, obj); + sbuf_printf(m, "\n"); + } + + DRM_UNLOCK(dev); + return (0); +} + +static int +i915_hws_info(struct drm_device *dev, struct sbuf *m, void *data) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_ring_buffer *ring; + const volatile u32 *hws; + int i; + + ring = &dev_priv->rings[(uintptr_t)data]; + hws = (volatile u32 *)ring->status_page.page_addr; + if (hws == NULL) + return (0); + + for (i = 0; i < 4096 / sizeof(u32) / 4; i += 4) { + sbuf_printf(m, "0x%08x: 0x%08x 0x%08x 0x%08x 0x%08x\n", + i * 4, + hws[i], hws[i + 1], hws[i + 2], hws[i + 3]); + } + return (0); +} + +static int +i915_ringbuffer_data(struct drm_device *dev, struct sbuf *m, void *data) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_ring_buffer *ring; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + ring = &dev_priv->rings[(uintptr_t)data]; + if (!ring->obj) { + sbuf_printf(m, "No ringbuffer setup\n"); + } else { + u8 *virt = ring->virtual_start; + uint32_t off; + + for (off = 0; off < ring->size; off += 4) { + uint32_t *ptr = (uint32_t *)(virt + off); + sbuf_printf(m, "%08x : %08x\n", off, *ptr); + } + } + DRM_UNLOCK(dev); + return (0); +} + +static int +i915_ringbuffer_info(struct drm_device *dev, struct sbuf *m, void *data) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_ring_buffer *ring; + + ring = &dev_priv->rings[(uintptr_t)data]; + if (ring->size == 0) + return (0); + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + + sbuf_printf(m, "Ring %s:\n", ring->name); + sbuf_printf(m, " Head : %08x\n", I915_READ_HEAD(ring) & HEAD_ADDR); + sbuf_printf(m, " Tail : %08x\n", I915_READ_TAIL(ring) & TAIL_ADDR); + sbuf_printf(m, " Size : %08x\n", ring->size); + sbuf_printf(m, " Active : %08x\n", intel_ring_get_active_head(ring)); + sbuf_printf(m, " NOPID : %08x\n", I915_READ_NOPID(ring)); + if (IS_GEN6(dev) || IS_GEN7(dev)) { + sbuf_printf(m, " Sync 0 : %08x\n", I915_READ_SYNC_0(ring)); + sbuf_printf(m, " Sync 1 : %08x\n", I915_READ_SYNC_1(ring)); + } + sbuf_printf(m, " Control : %08x\n", I915_READ_CTL(ring)); + sbuf_printf(m, " Start : %08x\n", I915_READ_START(ring)); + + DRM_UNLOCK(dev); + + return (0); +} + +static const char * +ring_str(int ring) +{ + switch (ring) { + case RCS: return (" render"); + case VCS: return (" bsd"); + case BCS: return (" blt"); + default: return (""); + } +} + +static const char * +pin_flag(int pinned) +{ + if (pinned > 0) + return (" P"); + else if (pinned < 0) + return (" p"); + else + return (""); +} + +static const char *tiling_flag(int tiling) +{ + switch (tiling) { + default: + case I915_TILING_NONE: return ""; + case I915_TILING_X: return " X"; + case I915_TILING_Y: return " Y"; + } +} + +static const char *dirty_flag(int dirty) +{ + return dirty ? " dirty" : ""; +} + +static const char *purgeable_flag(int purgeable) +{ + return purgeable ? " purgeable" : ""; +} + +static void print_error_buffers(struct sbuf *m, const char *name, + struct drm_i915_error_buffer *err, int count) +{ + + sbuf_printf(m, "%s [%d]:\n", name, count); + + while (count--) { + sbuf_printf(m, " %08x %8u %04x %04x %08x%s%s%s%s%s%s%s", + err->gtt_offset, + err->size, + err->read_domains, + err->write_domain, + err->seqno, + pin_flag(err->pinned), + tiling_flag(err->tiling), + dirty_flag(err->dirty), + purgeable_flag(err->purgeable), + err->ring != -1 ? " " : "", + ring_str(err->ring), + cache_level_str(err->cache_level)); + + if (err->name) + sbuf_printf(m, " (name: %d)", err->name); + if (err->fence_reg != I915_FENCE_REG_NONE) + sbuf_printf(m, " (fence: %d)", err->fence_reg); + + sbuf_printf(m, "\n"); + err++; + } +} + +static void +i915_ring_error_state(struct sbuf *m, struct drm_device *dev, + struct drm_i915_error_state *error, unsigned ring) +{ + + sbuf_printf(m, "%s command stream:\n", ring_str(ring)); + sbuf_printf(m, " HEAD: 0x%08x\n", error->head[ring]); + sbuf_printf(m, " TAIL: 0x%08x\n", error->tail[ring]); + sbuf_printf(m, " ACTHD: 0x%08x\n", error->acthd[ring]); + sbuf_printf(m, " IPEIR: 0x%08x\n", error->ipeir[ring]); + sbuf_printf(m, " IPEHR: 0x%08x\n", error->ipehr[ring]); + sbuf_printf(m, " INSTDONE: 0x%08x\n", error->instdone[ring]); + if (ring == RCS && INTEL_INFO(dev)->gen >= 4) { + sbuf_printf(m, " INSTDONE1: 0x%08x\n", error->instdone1); + sbuf_printf(m, " BBADDR: 0x%08jx\n", (uintmax_t)error->bbaddr); + } + if (INTEL_INFO(dev)->gen >= 4) + sbuf_printf(m, " INSTPS: 0x%08x\n", error->instps[ring]); + sbuf_printf(m, " INSTPM: 0x%08x\n", error->instpm[ring]); + if (INTEL_INFO(dev)->gen >= 6) { + sbuf_printf(m, " FADDR: 0x%08x\n", error->faddr[ring]); + sbuf_printf(m, " FAULT_REG: 0x%08x\n", error->fault_reg[ring]); + sbuf_printf(m, " SYNC_0: 0x%08x\n", + error->semaphore_mboxes[ring][0]); + sbuf_printf(m, " SYNC_1: 0x%08x\n", + error->semaphore_mboxes[ring][1]); + } + sbuf_printf(m, " seqno: 0x%08x\n", error->seqno[ring]); + sbuf_printf(m, " ring->head: 0x%08x\n", error->cpu_ring_head[ring]); + sbuf_printf(m, " ring->tail: 0x%08x\n", error->cpu_ring_tail[ring]); +} + +static int i915_error_state(struct drm_device *dev, struct sbuf *m, + void *unused) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_i915_error_state *error; + int i, j, page, offset, elt; + + mtx_lock(&dev_priv->error_lock); + if (!dev_priv->first_error) { + sbuf_printf(m, "no error state collected\n"); + goto out; + } + + error = dev_priv->first_error; + + sbuf_printf(m, "Time: %jd s %jd us\n", (intmax_t)error->time.tv_sec, + (intmax_t)error->time.tv_usec); + sbuf_printf(m, "PCI ID: 0x%04x\n", dev->pci_device); + sbuf_printf(m, "EIR: 0x%08x\n", error->eir); + sbuf_printf(m, "PGTBL_ER: 0x%08x\n", error->pgtbl_er); + + for (i = 0; i < dev_priv->num_fence_regs; i++) + sbuf_printf(m, " fence[%d] = %08jx\n", i, + (uintmax_t)error->fence[i]); + + if (INTEL_INFO(dev)->gen >= 6) { + sbuf_printf(m, "ERROR: 0x%08x\n", error->error); + sbuf_printf(m, "DONE_REG: 0x%08x\n", error->done_reg); + } + + i915_ring_error_state(m, dev, error, RCS); + if (HAS_BLT(dev)) + i915_ring_error_state(m, dev, error, BCS); + if (HAS_BSD(dev)) + i915_ring_error_state(m, dev, error, VCS); + + if (error->active_bo) + print_error_buffers(m, "Active", + error->active_bo, + error->active_bo_count); + + if (error->pinned_bo) + print_error_buffers(m, "Pinned", + error->pinned_bo, + error->pinned_bo_count); + + for (i = 0; i < DRM_ARRAY_SIZE(error->ring); i++) { + struct drm_i915_error_object *obj; + + if ((obj = error->ring[i].batchbuffer)) { + sbuf_printf(m, "%s --- gtt_offset = 0x%08x\n", + dev_priv->rings[i].name, + obj->gtt_offset); + offset = 0; + for (page = 0; page < obj->page_count; page++) { + for (elt = 0; elt < PAGE_SIZE/4; elt++) { + sbuf_printf(m, "%08x : %08x\n", + offset, obj->pages[page][elt]); + offset += 4; + } + } + } + + if (error->ring[i].num_requests) { + sbuf_printf(m, "%s --- %d requests\n", + dev_priv->rings[i].name, + error->ring[i].num_requests); + for (j = 0; j < error->ring[i].num_requests; j++) { + sbuf_printf(m, " seqno 0x%08x, emitted %ld, tail 0x%08x\n", + error->ring[i].requests[j].seqno, + error->ring[i].requests[j].jiffies, + error->ring[i].requests[j].tail); + } + } + + if ((obj = error->ring[i].ringbuffer)) { + sbuf_printf(m, "%s --- ringbuffer = 0x%08x\n", + dev_priv->rings[i].name, + obj->gtt_offset); + offset = 0; + for (page = 0; page < obj->page_count; page++) { + for (elt = 0; elt < PAGE_SIZE/4; elt++) { + sbuf_printf(m, "%08x : %08x\n", + offset, + obj->pages[page][elt]); + offset += 4; + } + } + } + } + + if (error->overlay) + intel_overlay_print_error_state(m, error->overlay); + + if (error->display) + intel_display_print_error_state(m, dev, error->display); + +out: + mtx_unlock(&dev_priv->error_lock); + + return (0); +} + +static int +i915_rstdby_delays(struct drm_device *dev, struct sbuf *m, void *unused) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + u16 crstanddelay; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + crstanddelay = I915_READ16(CRSTANDVID); + DRM_UNLOCK(dev); + + sbuf_printf(m, "w/ctx: %d, w/o ctx: %d\n", + (crstanddelay >> 8) & 0x3f, (crstanddelay & 0x3f)); + + return 0; +} + +static int +i915_cur_delayinfo(struct drm_device *dev, struct sbuf *m, void *unused) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + + if (IS_GEN5(dev)) { + u16 rgvswctl = I915_READ16(MEMSWCTL); + u16 rgvstat = I915_READ16(MEMSTAT_ILK); + + sbuf_printf(m, "Requested P-state: %d\n", (rgvswctl >> 8) & 0xf); + sbuf_printf(m, "Requested VID: %d\n", rgvswctl & 0x3f); + sbuf_printf(m, "Current VID: %d\n", (rgvstat & MEMSTAT_VID_MASK) >> + MEMSTAT_VID_SHIFT); + sbuf_printf(m, "Current P-state: %d\n", + (rgvstat & MEMSTAT_PSTATE_MASK) >> MEMSTAT_PSTATE_SHIFT); + } else if (IS_GEN6(dev)) { + u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS); + u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS); + u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); + u32 rpstat; + u32 rpupei, rpcurup, rpprevup; + u32 rpdownei, rpcurdown, rpprevdown; + int max_freq; + + /* RPSTAT1 is in the GT power well */ + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + gen6_gt_force_wake_get(dev_priv); + + rpstat = I915_READ(GEN6_RPSTAT1); + rpupei = I915_READ(GEN6_RP_CUR_UP_EI); + rpcurup = I915_READ(GEN6_RP_CUR_UP); + rpprevup = I915_READ(GEN6_RP_PREV_UP); + rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI); + rpcurdown = I915_READ(GEN6_RP_CUR_DOWN); + rpprevdown = I915_READ(GEN6_RP_PREV_DOWN); + + gen6_gt_force_wake_put(dev_priv); + DRM_UNLOCK(dev); + + sbuf_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status); + sbuf_printf(m, "RPSTAT1: 0x%08x\n", rpstat); + sbuf_printf(m, "Render p-state ratio: %d\n", + (gt_perf_status & 0xff00) >> 8); + sbuf_printf(m, "Render p-state VID: %d\n", + gt_perf_status & 0xff); + sbuf_printf(m, "Render p-state limit: %d\n", + rp_state_limits & 0xff); + sbuf_printf(m, "CAGF: %dMHz\n", ((rpstat & GEN6_CAGF_MASK) >> + GEN6_CAGF_SHIFT) * 50); + sbuf_printf(m, "RP CUR UP EI: %dus\n", rpupei & + GEN6_CURICONT_MASK); + sbuf_printf(m, "RP CUR UP: %dus\n", rpcurup & + GEN6_CURBSYTAVG_MASK); + sbuf_printf(m, "RP PREV UP: %dus\n", rpprevup & + GEN6_CURBSYTAVG_MASK); + sbuf_printf(m, "RP CUR DOWN EI: %dus\n", rpdownei & + GEN6_CURIAVG_MASK); + sbuf_printf(m, "RP CUR DOWN: %dus\n", rpcurdown & + GEN6_CURBSYTAVG_MASK); + sbuf_printf(m, "RP PREV DOWN: %dus\n", rpprevdown & + GEN6_CURBSYTAVG_MASK); + + max_freq = (rp_state_cap & 0xff0000) >> 16; + sbuf_printf(m, "Lowest (RPN) frequency: %dMHz\n", + max_freq * 50); + + max_freq = (rp_state_cap & 0xff00) >> 8; + sbuf_printf(m, "Nominal (RP1) frequency: %dMHz\n", + max_freq * 50); + + max_freq = rp_state_cap & 0xff; + sbuf_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n", + max_freq * 50); + } else { + sbuf_printf(m, "no P-state info available\n"); + } + + return 0; +} + +static int +i915_delayfreq_table(struct drm_device *dev, struct sbuf *m, void *unused) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + u32 delayfreq; + int i; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + for (i = 0; i < 16; i++) { + delayfreq = I915_READ(PXVFREQ_BASE + i * 4); + sbuf_printf(m, "P%02dVIDFREQ: 0x%08x (VID: %d)\n", i, delayfreq, + (delayfreq & PXVFREQ_PX_MASK) >> PXVFREQ_PX_SHIFT); + } + DRM_UNLOCK(dev); + return (0); +} + +static inline int +MAP_TO_MV(int map) +{ + return 1250 - (map * 25); +} + +static int +i915_inttoext_table(struct drm_device *dev, struct sbuf *m, void *unused) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + u32 inttoext; + int i; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + for (i = 1; i <= 32; i++) { + inttoext = I915_READ(INTTOEXT_BASE_ILK + i * 4); + sbuf_printf(m, "INTTOEXT%02d: 0x%08x\n", i, inttoext); + } + DRM_UNLOCK(dev); + + return (0); +} + +static int +ironlake_drpc_info(struct drm_device *dev, struct sbuf *m) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + u32 rgvmodectl; + u32 rstdbyctl; + u16 crstandvid; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + rgvmodectl = I915_READ(MEMMODECTL); + rstdbyctl = I915_READ(RSTDBYCTL); + crstandvid = I915_READ16(CRSTANDVID); + DRM_UNLOCK(dev); + + sbuf_printf(m, "HD boost: %s\n", (rgvmodectl & MEMMODE_BOOST_EN) ? + "yes" : "no"); + sbuf_printf(m, "Boost freq: %d\n", + (rgvmodectl & MEMMODE_BOOST_FREQ_MASK) >> + MEMMODE_BOOST_FREQ_SHIFT); + sbuf_printf(m, "HW control enabled: %s\n", + rgvmodectl & MEMMODE_HWIDLE_EN ? "yes" : "no"); + sbuf_printf(m, "SW control enabled: %s\n", + rgvmodectl & MEMMODE_SWMODE_EN ? "yes" : "no"); + sbuf_printf(m, "Gated voltage change: %s\n", + rgvmodectl & MEMMODE_RCLK_GATE ? "yes" : "no"); + sbuf_printf(m, "Starting frequency: P%d\n", + (rgvmodectl & MEMMODE_FSTART_MASK) >> MEMMODE_FSTART_SHIFT); + sbuf_printf(m, "Max P-state: P%d\n", + (rgvmodectl & MEMMODE_FMAX_MASK) >> MEMMODE_FMAX_SHIFT); + sbuf_printf(m, "Min P-state: P%d\n", (rgvmodectl & MEMMODE_FMIN_MASK)); + sbuf_printf(m, "RS1 VID: %d\n", (crstandvid & 0x3f)); + sbuf_printf(m, "RS2 VID: %d\n", ((crstandvid >> 8) & 0x3f)); + sbuf_printf(m, "Render standby enabled: %s\n", + (rstdbyctl & RCX_SW_EXIT) ? "no" : "yes"); + sbuf_printf(m, "Current RS state: "); + switch (rstdbyctl & RSX_STATUS_MASK) { + case RSX_STATUS_ON: + sbuf_printf(m, "on\n"); + break; + case RSX_STATUS_RC1: + sbuf_printf(m, "RC1\n"); + break; + case RSX_STATUS_RC1E: + sbuf_printf(m, "RC1E\n"); + break; + case RSX_STATUS_RS1: + sbuf_printf(m, "RS1\n"); + break; + case RSX_STATUS_RS2: + sbuf_printf(m, "RS2 (RC6)\n"); + break; + case RSX_STATUS_RS3: + sbuf_printf(m, "RC3 (RC6+)\n"); + break; + default: + sbuf_printf(m, "unknown\n"); + break; + } + + return 0; +} + +static int +gen6_drpc_info(struct drm_device *dev, struct sbuf *m) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + u32 rpmodectl1, gt_core_status, rcctl1; + unsigned forcewake_count; + int count=0; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + + mtx_lock(&dev_priv->gt_lock); + forcewake_count = dev_priv->forcewake_count; + mtx_unlock(&dev_priv->gt_lock); + + if (forcewake_count) { + sbuf_printf(m, "RC information inaccurate because userspace " + "holds a reference \n"); + } else { + /* NB: we cannot use forcewake, else we read the wrong values */ + while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1)) + DRM_UDELAY(10); + sbuf_printf(m, "RC information accurate: %s\n", yesno(count < 51)); + } + + gt_core_status = DRM_READ32(dev_priv->mmio_map, GEN6_GT_CORE_STATUS); + trace_i915_reg_rw(false, GEN6_GT_CORE_STATUS, gt_core_status, 4); + + rpmodectl1 = I915_READ(GEN6_RP_CONTROL); + rcctl1 = I915_READ(GEN6_RC_CONTROL); + DRM_UNLOCK(dev); + + sbuf_printf(m, "Video Turbo Mode: %s\n", + yesno(rpmodectl1 & GEN6_RP_MEDIA_TURBO)); + sbuf_printf(m, "HW control enabled: %s\n", + yesno(rpmodectl1 & GEN6_RP_ENABLE)); + sbuf_printf(m, "SW control enabled: %s\n", + yesno((rpmodectl1 & GEN6_RP_MEDIA_MODE_MASK) == + GEN6_RP_MEDIA_SW_MODE)); + sbuf_printf(m, "RC1e Enabled: %s\n", + yesno(rcctl1 & GEN6_RC_CTL_RC1e_ENABLE)); + sbuf_printf(m, "RC6 Enabled: %s\n", + yesno(rcctl1 & GEN6_RC_CTL_RC6_ENABLE)); + sbuf_printf(m, "Deep RC6 Enabled: %s\n", + yesno(rcctl1 & GEN6_RC_CTL_RC6p_ENABLE)); + sbuf_printf(m, "Deepest RC6 Enabled: %s\n", + yesno(rcctl1 & GEN6_RC_CTL_RC6pp_ENABLE)); + sbuf_printf(m, "Current RC state: "); + switch (gt_core_status & GEN6_RCn_MASK) { + case GEN6_RC0: + if (gt_core_status & GEN6_CORE_CPD_STATE_MASK) + sbuf_printf(m, "Core Power Down\n"); + else + sbuf_printf(m, "on\n"); + break; + case GEN6_RC3: + sbuf_printf(m, "RC3\n"); + break; + case GEN6_RC6: + sbuf_printf(m, "RC6\n"); + break; + case GEN6_RC7: + sbuf_printf(m, "RC7\n"); + break; + default: + sbuf_printf(m, "Unknown\n"); + break; + } + + sbuf_printf(m, "Core Power Down: %s\n", + yesno(gt_core_status & GEN6_CORE_CPD_STATE_MASK)); + return 0; +} + +static int i915_drpc_info(struct drm_device *dev, struct sbuf *m, void *unused) +{ + + if (IS_GEN6(dev) || IS_GEN7(dev)) + return (gen6_drpc_info(dev, m)); + else + return (ironlake_drpc_info(dev, m)); +} +static int +i915_fbc_status(struct drm_device *dev, struct sbuf *m, void *unused) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + + if (!I915_HAS_FBC(dev)) { + sbuf_printf(m, "FBC unsupported on this chipset"); + return 0; + } + + if (intel_fbc_enabled(dev)) { + sbuf_printf(m, "FBC enabled"); + } else { + sbuf_printf(m, "FBC disabled: "); + switch (dev_priv->no_fbc_reason) { + case FBC_NO_OUTPUT: + sbuf_printf(m, "no outputs"); + break; + case FBC_STOLEN_TOO_SMALL: + sbuf_printf(m, "not enough stolen memory"); + break; + case FBC_UNSUPPORTED_MODE: + sbuf_printf(m, "mode not supported"); + break; + case FBC_MODE_TOO_LARGE: + sbuf_printf(m, "mode too large"); + break; + case FBC_BAD_PLANE: + sbuf_printf(m, "FBC unsupported on plane"); + break; + case FBC_NOT_TILED: + sbuf_printf(m, "scanout buffer not tiled"); + break; + case FBC_MULTIPLE_PIPES: + sbuf_printf(m, "multiple pipes are enabled"); + break; + default: + sbuf_printf(m, "unknown reason"); + } + } + return 0; +} + +static int +i915_sr_status(struct drm_device *dev, struct sbuf *m, void *unused) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + bool sr_enabled = false; + + if (HAS_PCH_SPLIT(dev)) + sr_enabled = I915_READ(WM1_LP_ILK) & WM1_LP_SR_EN; + else if (IS_CRESTLINE(dev) || IS_I945G(dev) || IS_I945GM(dev)) + sr_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN; + else if (IS_I915GM(dev)) + sr_enabled = I915_READ(INSTPM) & INSTPM_SELF_EN; + else if (IS_PINEVIEW(dev)) + sr_enabled = I915_READ(DSPFW3) & PINEVIEW_SELF_REFRESH_EN; + + sbuf_printf(m, "self-refresh: %s", + sr_enabled ? "enabled" : "disabled"); + + return (0); +} + +static int i915_ring_freq_table(struct drm_device *dev, struct sbuf *m, + void *unused) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int gpu_freq, ia_freq; + + if (!(IS_GEN6(dev) || IS_GEN7(dev))) { + sbuf_printf(m, "unsupported on this chipset"); + return (0); + } + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + + sbuf_printf(m, "GPU freq (MHz)\tEffective CPU freq (MHz)\n"); + + for (gpu_freq = dev_priv->min_delay; gpu_freq <= dev_priv->max_delay; + gpu_freq++) { + I915_WRITE(GEN6_PCODE_DATA, gpu_freq); + I915_WRITE(GEN6_PCODE_MAILBOX, GEN6_PCODE_READY | + GEN6_PCODE_READ_MIN_FREQ_TABLE); + if (_intel_wait_for(dev, + (I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0, + 10, 1, "915frq")) { + DRM_ERROR("pcode read of freq table timed out\n"); + continue; + } + ia_freq = I915_READ(GEN6_PCODE_DATA); + sbuf_printf(m, "%d\t\t%d\n", gpu_freq * 50, ia_freq * 100); + } + + DRM_UNLOCK(dev); + + return (0); +} + +static int +i915_emon_status(struct drm_device *dev, struct sbuf *m, void *unused) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + unsigned long temp, chipset, gfx; + + if (!IS_GEN5(dev)) { + sbuf_printf(m, "Not supported\n"); + return (0); + } + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + temp = i915_mch_val(dev_priv); + chipset = i915_chipset_val(dev_priv); + gfx = i915_gfx_val(dev_priv); + DRM_UNLOCK(dev); + + sbuf_printf(m, "GMCH temp: %ld\n", temp); + sbuf_printf(m, "Chipset power: %ld\n", chipset); + sbuf_printf(m, "GFX power: %ld\n", gfx); + sbuf_printf(m, "Total power: %ld\n", chipset + gfx); + + return (0); +} + +static int +i915_gfxec(struct drm_device *dev, struct sbuf *m, void *unused) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + sbuf_printf(m, "GFXEC: %ld\n", (unsigned long)I915_READ(0x112f4)); + DRM_UNLOCK(dev); + + return (0); +} + +#if 0 +static int +i915_opregion(struct drm_device *dev, struct sbuf *m, void *unused) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_opregion *opregion = &dev_priv->opregion; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + if (opregion->header) + seq_write(m, opregion->header, OPREGION_SIZE); + DRM_UNLOCK(dev); + + return 0; +} +#endif + +static int +i915_gem_framebuffer_info(struct drm_device *dev, struct sbuf *m, void *data) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_fbdev *ifbdev; + struct intel_framebuffer *fb; + + if (sx_xlock_sig(&dev->dev_struct_lock)) + return (EINTR); + + ifbdev = dev_priv->fbdev; + if (ifbdev == NULL) { + DRM_UNLOCK(dev); + return (0); + } + fb = to_intel_framebuffer(ifbdev->helper.fb); + + sbuf_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, obj ", + fb->base.width, + fb->base.height, + fb->base.depth, + fb->base.bits_per_pixel); + describe_obj(m, fb->obj); + sbuf_printf(m, "\n"); + + list_for_each_entry(fb, &dev->mode_config.fb_list, base.head) { + if (&fb->base == ifbdev->helper.fb) + continue; + + sbuf_printf(m, "user size: %d x %d, depth %d, %d bpp, obj ", + fb->base.width, + fb->base.height, + fb->base.depth, + fb->base.bits_per_pixel); + describe_obj(m, fb->obj); + sbuf_printf(m, "\n"); + } + + DRM_UNLOCK(dev); + + return (0); +} + +static int +i915_context_status(struct drm_device *dev, struct sbuf *m, void *data) +{ + drm_i915_private_t *dev_priv; + int ret; + + if ((dev->driver->driver_features & DRIVER_MODESET) == 0) + return (0); + + dev_priv = dev->dev_private; + ret = sx_xlock_sig(&dev->mode_config.mutex); + if (ret != 0) + return (EINTR); + + if (dev_priv->pwrctx != NULL) { + sbuf_printf(m, "power context "); + describe_obj(m, dev_priv->pwrctx); + sbuf_printf(m, "\n"); + } + + if (dev_priv->renderctx != NULL) { + sbuf_printf(m, "render context "); + describe_obj(m, dev_priv->renderctx); + sbuf_printf(m, "\n"); + } + + sx_xunlock(&dev->mode_config.mutex); + + return (0); +} + +static int +i915_gen6_forcewake_count_info(struct drm_device *dev, struct sbuf *m, + void *data) +{ + struct drm_i915_private *dev_priv; + unsigned forcewake_count; + + dev_priv = dev->dev_private; + mtx_lock(&dev_priv->gt_lock); + forcewake_count = dev_priv->forcewake_count; + mtx_unlock(&dev_priv->gt_lock); + + sbuf_printf(m, "forcewake count = %u\n", forcewake_count); + + return (0); +} + +static const char * +swizzle_string(unsigned swizzle) +{ + + switch(swizzle) { + case I915_BIT_6_SWIZZLE_NONE: + return "none"; + case I915_BIT_6_SWIZZLE_9: + return "bit9"; + case I915_BIT_6_SWIZZLE_9_10: + return "bit9/bit10"; + case I915_BIT_6_SWIZZLE_9_11: + return "bit9/bit11"; + case I915_BIT_6_SWIZZLE_9_10_11: + return "bit9/bit10/bit11"; + case I915_BIT_6_SWIZZLE_9_17: + return "bit9/bit17"; + case I915_BIT_6_SWIZZLE_9_10_17: + return "bit9/bit10/bit17"; + case I915_BIT_6_SWIZZLE_UNKNOWN: + return "unknown"; + } + + return "bug"; +} + +static int +i915_swizzle_info(struct drm_device *dev, struct sbuf *m, void *data) +{ + struct drm_i915_private *dev_priv; + int ret; + + dev_priv = dev->dev_private; + ret = sx_xlock_sig(&dev->dev_struct_lock); + if (ret != 0) + return (EINTR); + + sbuf_printf(m, "bit6 swizzle for X-tiling = %s\n", + swizzle_string(dev_priv->mm.bit_6_swizzle_x)); + sbuf_printf(m, "bit6 swizzle for Y-tiling = %s\n", + swizzle_string(dev_priv->mm.bit_6_swizzle_y)); + + if (IS_GEN3(dev) || IS_GEN4(dev)) { + sbuf_printf(m, "DDC = 0x%08x\n", + I915_READ(DCC)); + sbuf_printf(m, "C0DRB3 = 0x%04x\n", + I915_READ16(C0DRB3)); + sbuf_printf(m, "C1DRB3 = 0x%04x\n", + I915_READ16(C1DRB3)); + } else if (IS_GEN6(dev) || IS_GEN7(dev)) { + sbuf_printf(m, "MAD_DIMM_C0 = 0x%08x\n", + I915_READ(MAD_DIMM_C0)); + sbuf_printf(m, "MAD_DIMM_C1 = 0x%08x\n", + I915_READ(MAD_DIMM_C1)); + sbuf_printf(m, "MAD_DIMM_C2 = 0x%08x\n", + I915_READ(MAD_DIMM_C2)); + sbuf_printf(m, "TILECTL = 0x%08x\n", + I915_READ(TILECTL)); + sbuf_printf(m, "ARB_MODE = 0x%08x\n", + I915_READ(ARB_MODE)); + sbuf_printf(m, "DISP_ARB_CTL = 0x%08x\n", + I915_READ(DISP_ARB_CTL)); + } + DRM_UNLOCK(dev); + + return (0); +} + +static int +i915_ppgtt_info(struct drm_device *dev, struct sbuf *m, void *data) +{ + struct drm_i915_private *dev_priv; + struct intel_ring_buffer *ring; + int i, ret; + + dev_priv = dev->dev_private; + + ret = sx_xlock_sig(&dev->dev_struct_lock); + if (ret != 0) + return (EINTR); + if (INTEL_INFO(dev)->gen == 6) + sbuf_printf(m, "GFX_MODE: 0x%08x\n", I915_READ(GFX_MODE)); + + for (i = 0; i < I915_NUM_RINGS; i++) { + ring = &dev_priv->rings[i]; + + sbuf_printf(m, "%s\n", ring->name); + if (INTEL_INFO(dev)->gen == 7) + sbuf_printf(m, "GFX_MODE: 0x%08x\n", I915_READ(RING_MODE_GEN7(ring))); + sbuf_printf(m, "PP_DIR_BASE: 0x%08x\n", I915_READ(RING_PP_DIR_BASE(ring))); + sbuf_printf(m, "PP_DIR_BASE_READ: 0x%08x\n", I915_READ(RING_PP_DIR_BASE_READ(ring))); + sbuf_printf(m, "PP_DIR_DCLV: 0x%08x\n", I915_READ(RING_PP_DIR_DCLV(ring))); + } + if (dev_priv->mm.aliasing_ppgtt) { + struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt; + + sbuf_printf(m, "aliasing PPGTT:\n"); + sbuf_printf(m, "pd gtt offset: 0x%08x\n", ppgtt->pd_offset); + } + sbuf_printf(m, "ECOCHK: 0x%08x\n", I915_READ(GAM_ECOCHK)); + DRM_UNLOCK(dev); + + return (0); +} + +static int +i915_debug_set_wedged(SYSCTL_HANDLER_ARGS) +{ + struct drm_device *dev; + drm_i915_private_t *dev_priv; + int error, wedged; + + dev = arg1; + dev_priv = dev->dev_private; + if (dev_priv == NULL) + return (EBUSY); + wedged = dev_priv->mm.wedged; + error = sysctl_handle_int(oidp, &wedged, 0, req); + if (error || !req->newptr) + return (error); + DRM_INFO("Manually setting wedged to %d\n", wedged); + i915_handle_error(dev, wedged); + return (error); +} + +static int +i915_max_freq(SYSCTL_HANDLER_ARGS) +{ + struct drm_device *dev; + drm_i915_private_t *dev_priv; + int error, max_freq; + + dev = arg1; + dev_priv = dev->dev_private; + if (dev_priv == NULL) + return (EBUSY); + max_freq = dev_priv->max_delay * 50; + error = sysctl_handle_int(oidp, &max_freq, 0, req); + if (error || !req->newptr) + return (error); + DRM_DEBUG("Manually setting max freq to %d\n", max_freq); + /* + * Turbo will still be enabled, but won't go above the set value. + */ + dev_priv->max_delay = max_freq / 50; + gen6_set_rps(dev, max_freq / 50); + return (error); +} + +static int +i915_cache_sharing(SYSCTL_HANDLER_ARGS) +{ + struct drm_device *dev; + drm_i915_private_t *dev_priv; + int error, snpcr, cache_sharing; + + dev = arg1; + dev_priv = dev->dev_private; + if (dev_priv == NULL) + return (EBUSY); + DRM_LOCK(dev); + snpcr = I915_READ(GEN6_MBCUNIT_SNPCR); + DRM_UNLOCK(dev); + cache_sharing = (snpcr & GEN6_MBC_SNPCR_MASK) >> GEN6_MBC_SNPCR_SHIFT; + error = sysctl_handle_int(oidp, &cache_sharing, 0, req); + if (error || !req->newptr) + return (error); + if (cache_sharing < 0 || cache_sharing > 3) + return (EINVAL); + DRM_DEBUG("Manually setting uncore sharing to %d\n", cache_sharing); + + DRM_LOCK(dev); + /* Update the cache sharing policy here as well */ + snpcr = I915_READ(GEN6_MBCUNIT_SNPCR); + snpcr &= ~GEN6_MBC_SNPCR_MASK; + snpcr |= (cache_sharing << GEN6_MBC_SNPCR_SHIFT); + I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr); + DRM_UNLOCK(dev); + return (0); +} + +static struct i915_info_sysctl_list { + const char *name; + int (*ptr)(struct drm_device *dev, struct sbuf *m, void *data); + int flags; + void *data; +} i915_info_sysctl_list[] = { + {"i915_capabilities", i915_capabilities, 0}, + {"i915_gem_objects", i915_gem_object_info, 0}, + {"i915_gem_gtt", i915_gem_gtt_info, 0}, + {"i915_gem_active", i915_gem_object_list_info, 0, (void *)ACTIVE_LIST}, + {"i915_gem_flushing", i915_gem_object_list_info, 0, + (void *)FLUSHING_LIST}, + {"i915_gem_inactive", i915_gem_object_list_info, 0, + (void *)INACTIVE_LIST}, + {"i915_gem_pinned", i915_gem_object_list_info, 0, + (void *)PINNED_LIST}, + {"i915_gem_deferred_free", i915_gem_object_list_info, 0, + (void *)DEFERRED_FREE_LIST}, + {"i915_gem_pageflip", i915_gem_pageflip_info, 0}, + {"i915_gem_request", i915_gem_request_info, 0}, + {"i915_gem_seqno", i915_gem_seqno_info, 0}, + {"i915_gem_fence_regs", i915_gem_fence_regs_info, 0}, + {"i915_gem_interrupt", i915_interrupt_info, 0}, + {"i915_gem_hws", i915_hws_info, 0, (void *)RCS}, + {"i915_gem_hws_blt", i915_hws_info, 0, (void *)BCS}, + {"i915_gem_hws_bsd", i915_hws_info, 0, (void *)VCS}, + {"i915_ringbuffer_data", i915_ringbuffer_data, 0, (void *)RCS}, + {"i915_ringbuffer_info", i915_ringbuffer_info, 0, (void *)RCS}, + {"i915_bsd_ringbuffer_data", i915_ringbuffer_data, 0, (void *)VCS}, + {"i915_bsd_ringbuffer_info", i915_ringbuffer_info, 0, (void *)VCS}, + {"i915_blt_ringbuffer_data", i915_ringbuffer_data, 0, (void *)BCS}, + {"i915_blt_ringbuffer_info", i915_ringbuffer_info, 0, (void *)BCS}, + {"i915_error_state", i915_error_state, 0}, + {"i915_rstdby_delays", i915_rstdby_delays, 0}, + {"i915_cur_delayinfo", i915_cur_delayinfo, 0}, + {"i915_delayfreq_table", i915_delayfreq_table, 0}, + {"i915_inttoext_table", i915_inttoext_table, 0}, + {"i915_drpc_info", i915_drpc_info, 0}, + {"i915_emon_status", i915_emon_status, 0}, + {"i915_ring_freq_table", i915_ring_freq_table, 0}, + {"i915_gfxec", i915_gfxec, 0}, + {"i915_fbc_status", i915_fbc_status, 0}, + {"i915_sr_status", i915_sr_status, 0}, +#if 0 + {"i915_opregion", i915_opregion, 0}, +#endif + {"i915_gem_framebuffer", i915_gem_framebuffer_info, 0}, + {"i915_context_status", i915_context_status, 0}, + {"i915_gen6_forcewake_count_info", i915_gen6_forcewake_count_info, 0}, + {"i915_swizzle_info", i915_swizzle_info, 0}, + {"i915_ppgtt_info", i915_ppgtt_info, 0}, +}; + +struct i915_info_sysctl_thunk { + struct drm_device *dev; + int idx; + void *arg; +}; + +static int +i915_info_sysctl_handler(SYSCTL_HANDLER_ARGS) +{ + struct sbuf m; + struct i915_info_sysctl_thunk *thunk; + struct drm_device *dev; + drm_i915_private_t *dev_priv; + int error; + + thunk = arg1; + dev = thunk->dev; + dev_priv = dev->dev_private; + if (dev_priv == NULL) + return (EBUSY); + error = sysctl_wire_old_buffer(req, 0); + if (error != 0) + return (error); + sbuf_new_for_sysctl(&m, NULL, 128, req); + error = i915_info_sysctl_list[thunk->idx].ptr(dev, &m, + thunk->arg); + if (error == 0) + error = sbuf_finish(&m); + sbuf_delete(&m); + return (error); +} + +extern int i915_gem_sync_exec_requests; +extern int i915_fix_mi_batchbuffer_end; +extern int i915_intr_pf; +extern long i915_gem_wired_pages_cnt; + +int +i915_sysctl_init(struct drm_device *dev, struct sysctl_ctx_list *ctx, + struct sysctl_oid *top) +{ + struct sysctl_oid *oid, *info; + struct i915_info_sysctl_thunk *thunks; + int i, error; + + thunks = malloc(sizeof(*thunks) * DRM_ARRAY_SIZE(i915_info_sysctl_list), + DRM_MEM_DRIVER, M_WAITOK | M_ZERO); + for (i = 0; i < DRM_ARRAY_SIZE(i915_info_sysctl_list); i++) { + thunks[i].dev = dev; + thunks[i].idx = i; + thunks[i].arg = i915_info_sysctl_list[i].data; + } + dev->sysctl_private = thunks; + info = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(top), OID_AUTO, "info", + CTLFLAG_RW, NULL, NULL); + if (info == NULL) + return (ENOMEM); + for (i = 0; i < DRM_ARRAY_SIZE(i915_info_sysctl_list); i++) { + oid = SYSCTL_ADD_OID(ctx, SYSCTL_CHILDREN(info), OID_AUTO, + i915_info_sysctl_list[i].name, CTLTYPE_STRING | CTLFLAG_RD, + &thunks[i], 0, i915_info_sysctl_handler, "A", NULL); + if (oid == NULL) + return (ENOMEM); + } + oid = SYSCTL_ADD_LONG(ctx, SYSCTL_CHILDREN(info), OID_AUTO, + "i915_gem_wired_pages", CTLFLAG_RD, &i915_gem_wired_pages_cnt, + NULL); + oid = SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(top), OID_AUTO, "wedged", + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, dev, 0, + i915_debug_set_wedged, "I", NULL); + if (oid == NULL) + return (ENOMEM); + oid = SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(top), OID_AUTO, "max_freq", + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, dev, 0, i915_max_freq, + "I", NULL); + if (oid == NULL) + return (ENOMEM); + oid = SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(top), OID_AUTO, + "cache_sharing", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, dev, + 0, i915_cache_sharing, "I", NULL); + if (oid == NULL) + return (ENOMEM); + oid = SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(top), OID_AUTO, "sync_exec", + CTLFLAG_RW, &i915_gem_sync_exec_requests, 0, NULL); + if (oid == NULL) + return (ENOMEM); + oid = SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(top), OID_AUTO, "fix_mi", + CTLFLAG_RW, &i915_fix_mi_batchbuffer_end, 0, NULL); + if (oid == NULL) + return (ENOMEM); + oid = SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(top), OID_AUTO, "intr_pf", + CTLFLAG_RW, &i915_intr_pf, 0, NULL); + if (oid == NULL) + return (ENOMEM); + + error = drm_add_busid_modesetting(dev, ctx, top); + if (error != 0) + return (error); + + return (0); +} + +void +i915_sysctl_cleanup(struct drm_device *dev) +{ + + free(dev->sysctl_private, DRM_MEM_DRIVER); +} diff --git a/sys/dev/drm2/i915/i915_dma.c b/sys/dev/drm2/i915/i915_dma.c new file mode 100644 index 00000000000..f78553e2a9f --- /dev/null +++ b/sys/dev/drm2/i915/i915_dma.c @@ -0,0 +1,2075 @@ +/* i915_dma.c -- DMA support for the I915 -*- linux-c -*- + */ +/*- + * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +static struct drm_i915_private *i915_mch_dev; +/* + * Lock protecting IPS related data structures + * - i915_mch_dev + * - dev_priv->max_delay + * - dev_priv->min_delay + * - dev_priv->fmax + * - dev_priv->gpu_busy + */ +static struct mtx mchdev_lock; +MTX_SYSINIT(mchdev, &mchdev_lock, "mchdev", MTX_DEF); + +static void i915_pineview_get_mem_freq(struct drm_device *dev); +static void i915_ironlake_get_mem_freq(struct drm_device *dev); +static int i915_driver_unload_int(struct drm_device *dev, bool locked); + +static void i915_write_hws_pga(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + u32 addr; + + addr = dev_priv->status_page_dmah->busaddr; + if (INTEL_INFO(dev)->gen >= 4) + addr |= (dev_priv->status_page_dmah->busaddr >> 28) & 0xf0; + I915_WRITE(HWS_PGA, addr); +} + +/** + * Sets up the hardware status page for devices that need a physical address + * in the register. + */ +static int i915_init_phys_hws(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_ring_buffer *ring = LP_RING(dev_priv); + + /* + * Program Hardware Status Page + * XXXKIB Keep 4GB limit for allocation for now. This method + * of allocation is used on <= 965 hardware, that has several + * erratas regarding the use of physical memory > 4 GB. + */ + DRM_UNLOCK(dev); + dev_priv->status_page_dmah = + drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 0xffffffff); + DRM_LOCK(dev); + if (!dev_priv->status_page_dmah) { + DRM_ERROR("Can not allocate hardware status page\n"); + return -ENOMEM; + } + ring->status_page.page_addr = dev_priv->hw_status_page = + dev_priv->status_page_dmah->vaddr; + dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr; + + memset(dev_priv->hw_status_page, 0, PAGE_SIZE); + + i915_write_hws_pga(dev); + DRM_DEBUG("Enabled hardware status page, phys %jx\n", + (uintmax_t)dev_priv->dma_status_page); + return 0; +} + +/** + * Frees the hardware status page, whether it's a physical address or a virtual + * address set up by the X Server. + */ +static void i915_free_hws(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_ring_buffer *ring = LP_RING(dev_priv); + + if (dev_priv->status_page_dmah) { + drm_pci_free(dev, dev_priv->status_page_dmah); + dev_priv->status_page_dmah = NULL; + } + + if (dev_priv->status_gfx_addr) { + dev_priv->status_gfx_addr = 0; + ring->status_page.gfx_addr = 0; + drm_core_ioremapfree(&dev_priv->hws_map, dev); + } + + /* Need to rewrite hardware status page */ + I915_WRITE(HWS_PGA, 0x1ffff000); +} + +void i915_kernel_lost_context(struct drm_device * dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_ring_buffer *ring = LP_RING(dev_priv); + + /* + * We should never lose context on the ring with modesetting + * as we don't expose it to userspace + */ + if (drm_core_check_feature(dev, DRIVER_MODESET)) + return; + + ring->head = I915_READ_HEAD(ring) & HEAD_ADDR; + ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR; + ring->space = ring->head - (ring->tail + 8); + if (ring->space < 0) + ring->space += ring->size; + +#if 1 + KIB_NOTYET(); +#else + if (!dev->primary->master) + return; +#endif + + if (ring->head == ring->tail && dev_priv->sarea_priv) + dev_priv->sarea_priv->perf_boxes |= I915_BOX_RING_EMPTY; +} + +static int i915_dma_cleanup(struct drm_device * dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int i; + + + /* Make sure interrupts are disabled here because the uninstall ioctl + * may not have been called from userspace and after dev_private + * is freed, it's too late. + */ + if (dev->irq_enabled) + drm_irq_uninstall(dev); + + for (i = 0; i < I915_NUM_RINGS; i++) + intel_cleanup_ring_buffer(&dev_priv->rings[i]); + + /* Clear the HWS virtual address at teardown */ + if (I915_NEED_GFX_HWS(dev)) + i915_free_hws(dev); + + return 0; +} + +static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int ret; + + dev_priv->sarea = drm_getsarea(dev); + if (!dev_priv->sarea) { + DRM_ERROR("can not find sarea!\n"); + i915_dma_cleanup(dev); + return -EINVAL; + } + + dev_priv->sarea_priv = (drm_i915_sarea_t *) + ((u8 *) dev_priv->sarea->virtual + init->sarea_priv_offset); + + if (init->ring_size != 0) { + if (LP_RING(dev_priv)->obj != NULL) { + i915_dma_cleanup(dev); + DRM_ERROR("Client tried to initialize ringbuffer in " + "GEM mode\n"); + return -EINVAL; + } + + ret = intel_render_ring_init_dri(dev, + init->ring_start, + init->ring_size); + if (ret) { + i915_dma_cleanup(dev); + return ret; + } + } + + dev_priv->cpp = init->cpp; + dev_priv->back_offset = init->back_offset; + dev_priv->front_offset = init->front_offset; + dev_priv->current_page = 0; + dev_priv->sarea_priv->pf_current_page = 0; + + /* Allow hardware batchbuffers unless told otherwise. + */ + dev_priv->allow_batchbuffer = 1; + + return 0; +} + +static int i915_dma_resume(struct drm_device * dev) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + struct intel_ring_buffer *ring = LP_RING(dev_priv); + + DRM_DEBUG("\n"); + + if (ring->map.handle == NULL) { + DRM_ERROR("can not ioremap virtual address for" + " ring buffer\n"); + return -ENOMEM; + } + + /* Program Hardware Status Page */ + if (!ring->status_page.page_addr) { + DRM_ERROR("Can not find hardware status page\n"); + return -EINVAL; + } + DRM_DEBUG("hw status page @ %p\n", ring->status_page.page_addr); + if (ring->status_page.gfx_addr != 0) + intel_ring_setup_status_page(ring); + else + i915_write_hws_pga(dev); + + DRM_DEBUG("Enabled hardware status page\n"); + + return 0; +} + +static int i915_dma_init(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_i915_init_t *init = data; + int retcode = 0; + + switch (init->func) { + case I915_INIT_DMA: + retcode = i915_initialize(dev, init); + break; + case I915_CLEANUP_DMA: + retcode = i915_dma_cleanup(dev); + break; + case I915_RESUME_DMA: + retcode = i915_dma_resume(dev); + break; + default: + retcode = -EINVAL; + break; + } + + return retcode; +} + +/* Implement basically the same security restrictions as hardware does + * for MI_BATCH_NON_SECURE. These can be made stricter at any time. + * + * Most of the calculations below involve calculating the size of a + * particular instruction. It's important to get the size right as + * that tells us where the next instruction to check is. Any illegal + * instruction detected will be given a size of zero, which is a + * signal to abort the rest of the buffer. + */ +static int do_validate_cmd(int cmd) +{ + switch (((cmd >> 29) & 0x7)) { + case 0x0: + switch ((cmd >> 23) & 0x3f) { + case 0x0: + return 1; /* MI_NOOP */ + case 0x4: + return 1; /* MI_FLUSH */ + default: + return 0; /* disallow everything else */ + } + break; + case 0x1: + return 0; /* reserved */ + case 0x2: + return (cmd & 0xff) + 2; /* 2d commands */ + case 0x3: + if (((cmd >> 24) & 0x1f) <= 0x18) + return 1; + + switch ((cmd >> 24) & 0x1f) { + case 0x1c: + return 1; + case 0x1d: + switch ((cmd >> 16) & 0xff) { + case 0x3: + return (cmd & 0x1f) + 2; + case 0x4: + return (cmd & 0xf) + 2; + default: + return (cmd & 0xffff) + 2; + } + case 0x1e: + if (cmd & (1 << 23)) + return (cmd & 0xffff) + 1; + else + return 1; + case 0x1f: + if ((cmd & (1 << 23)) == 0) /* inline vertices */ + return (cmd & 0x1ffff) + 2; + else if (cmd & (1 << 17)) /* indirect random */ + if ((cmd & 0xffff) == 0) + return 0; /* unknown length, too hard */ + else + return (((cmd & 0xffff) + 1) / 2) + 1; + else + return 2; /* indirect sequential */ + default: + return 0; + } + default: + return 0; + } + + return 0; +} + +static int validate_cmd(int cmd) +{ + int ret = do_validate_cmd(cmd); + +/* printk("validate_cmd( %x ): %d\n", cmd, ret); */ + + return ret; +} + +static int i915_emit_cmds(struct drm_device *dev, int __user *buffer, + int dwords) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int i; + + if ((dwords+1) * sizeof(int) >= LP_RING(dev_priv)->size - 8) + return -EINVAL; + + BEGIN_LP_RING((dwords+1)&~1); + + for (i = 0; i < dwords;) { + int cmd, sz; + + if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i], sizeof(cmd))) + return -EINVAL; + + if ((sz = validate_cmd(cmd)) == 0 || i + sz > dwords) + return -EINVAL; + + OUT_RING(cmd); + + while (++i, --sz) { + if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i], + sizeof(cmd))) { + return -EINVAL; + } + OUT_RING(cmd); + } + } + + if (dwords & 1) + OUT_RING(0); + + ADVANCE_LP_RING(); + + return 0; +} + +int i915_emit_box(struct drm_device * dev, + struct drm_clip_rect *boxes, + int i, int DR1, int DR4) +{ + struct drm_clip_rect box; + + if (DRM_COPY_FROM_USER_UNCHECKED(&box, &boxes[i], sizeof(box))) { + return -EFAULT; + } + + return (i915_emit_box_p(dev, &box, DR1, DR4)); +} + +int +i915_emit_box_p(struct drm_device *dev, struct drm_clip_rect *box, + int DR1, int DR4) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int ret; + + if (box->y2 <= box->y1 || box->x2 <= box->x1 || box->y2 <= 0 || + box->x2 <= 0) { + DRM_ERROR("Bad box %d,%d..%d,%d\n", + box->x1, box->y1, box->x2, box->y2); + return -EINVAL; + } + + if (INTEL_INFO(dev)->gen >= 4) { + ret = BEGIN_LP_RING(4); + if (ret != 0) + return (ret); + + OUT_RING(GFX_OP_DRAWRECT_INFO_I965); + OUT_RING((box->x1 & 0xffff) | (box->y1 << 16)); + OUT_RING(((box->x2 - 1) & 0xffff) | ((box->y2 - 1) << 16)); + OUT_RING(DR4); + } else { + ret = BEGIN_LP_RING(6); + if (ret != 0) + return (ret); + + OUT_RING(GFX_OP_DRAWRECT_INFO); + OUT_RING(DR1); + OUT_RING((box->x1 & 0xffff) | (box->y1 << 16)); + OUT_RING(((box->x2 - 1) & 0xffff) | ((box->y2 - 1) << 16)); + OUT_RING(DR4); + OUT_RING(0); + } + ADVANCE_LP_RING(); + + return 0; +} + +/* XXX: Emitting the counter should really be moved to part of the IRQ + * emit. For now, do it in both places: + */ + +static void i915_emit_breadcrumb(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + + if (++dev_priv->counter > 0x7FFFFFFFUL) + dev_priv->counter = 0; + if (dev_priv->sarea_priv) + dev_priv->sarea_priv->last_enqueue = dev_priv->counter; + + if (BEGIN_LP_RING(4) == 0) { + OUT_RING(MI_STORE_DWORD_INDEX); + OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT); + OUT_RING(dev_priv->counter); + OUT_RING(0); + ADVANCE_LP_RING(); + } +} + +static int i915_dispatch_cmdbuffer(struct drm_device * dev, + drm_i915_cmdbuffer_t * cmd, struct drm_clip_rect *cliprects, void *cmdbuf) +{ + int nbox = cmd->num_cliprects; + int i = 0, count, ret; + + if (cmd->sz & 0x3) { + DRM_ERROR("alignment\n"); + return -EINVAL; + } + + i915_kernel_lost_context(dev); + + count = nbox ? nbox : 1; + + for (i = 0; i < count; i++) { + if (i < nbox) { + ret = i915_emit_box_p(dev, &cmd->cliprects[i], + cmd->DR1, cmd->DR4); + if (ret) + return ret; + } + + ret = i915_emit_cmds(dev, cmdbuf, cmd->sz / 4); + if (ret) + return ret; + } + + i915_emit_breadcrumb(dev); + return 0; +} + +static int +i915_dispatch_batchbuffer(struct drm_device * dev, + drm_i915_batchbuffer_t * batch, struct drm_clip_rect *cliprects) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int nbox = batch->num_cliprects; + int i, count, ret; + + if ((batch->start | batch->used) & 0x7) { + DRM_ERROR("alignment\n"); + return -EINVAL; + } + + i915_kernel_lost_context(dev); + + count = nbox ? nbox : 1; + + for (i = 0; i < count; i++) { + if (i < nbox) { + int ret = i915_emit_box_p(dev, &cliprects[i], + batch->DR1, batch->DR4); + if (ret) + return ret; + } + + if (!IS_I830(dev) && !IS_845G(dev)) { + ret = BEGIN_LP_RING(2); + if (ret != 0) + return (ret); + + if (INTEL_INFO(dev)->gen >= 4) { + OUT_RING(MI_BATCH_BUFFER_START | (2 << 6) | + MI_BATCH_NON_SECURE_I965); + OUT_RING(batch->start); + } else { + OUT_RING(MI_BATCH_BUFFER_START | (2 << 6)); + OUT_RING(batch->start | MI_BATCH_NON_SECURE); + } + } else { + ret = BEGIN_LP_RING(4); + if (ret != 0) + return (ret); + + OUT_RING(MI_BATCH_BUFFER); + OUT_RING(batch->start | MI_BATCH_NON_SECURE); + OUT_RING(batch->start + batch->used - 4); + OUT_RING(0); + } + ADVANCE_LP_RING(); + } + + i915_emit_breadcrumb(dev); + + return 0; +} + +static int i915_dispatch_flip(struct drm_device * dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int ret; + + if (!dev_priv->sarea_priv) + return -EINVAL; + + DRM_DEBUG("%s: page=%d pfCurrentPage=%d\n", + __func__, + dev_priv->current_page, + dev_priv->sarea_priv->pf_current_page); + + i915_kernel_lost_context(dev); + + ret = BEGIN_LP_RING(10); + if (ret) + return ret; + OUT_RING(MI_FLUSH | MI_READ_FLUSH); + OUT_RING(0); + + OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | ASYNC_FLIP); + OUT_RING(0); + if (dev_priv->current_page == 0) { + OUT_RING(dev_priv->back_offset); + dev_priv->current_page = 1; + } else { + OUT_RING(dev_priv->front_offset); + dev_priv->current_page = 0; + } + OUT_RING(0); + + OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_PLANE_A_FLIP); + OUT_RING(0); + + ADVANCE_LP_RING(); + + if (++dev_priv->counter > 0x7FFFFFFFUL) + dev_priv->counter = 0; + if (dev_priv->sarea_priv) + dev_priv->sarea_priv->last_enqueue = dev_priv->counter; + + if (BEGIN_LP_RING(4) == 0) { + OUT_RING(MI_STORE_DWORD_INDEX); + OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT); + OUT_RING(dev_priv->counter); + OUT_RING(0); + ADVANCE_LP_RING(); + } + + dev_priv->sarea_priv->pf_current_page = dev_priv->current_page; + return 0; +} + +static int +i915_quiescent(struct drm_device *dev) +{ + struct intel_ring_buffer *ring = LP_RING(dev->dev_private); + + i915_kernel_lost_context(dev); + return (intel_wait_ring_idle(ring)); +} + +static int +i915_flush_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + int ret; + + RING_LOCK_TEST_WITH_RETURN(dev, file_priv); + + DRM_LOCK(dev); + ret = i915_quiescent(dev); + DRM_UNLOCK(dev); + + return (ret); +} + +static int i915_batchbuffer(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + drm_i915_sarea_t *sarea_priv; + drm_i915_batchbuffer_t *batch = data; + struct drm_clip_rect *cliprects; + size_t cliplen; + int ret; + + if (!dev_priv->allow_batchbuffer) { + DRM_ERROR("Batchbuffer ioctl disabled\n"); + return -EINVAL; + } + DRM_UNLOCK(dev); + + DRM_DEBUG("i915 batchbuffer, start %x used %d cliprects %d\n", + batch->start, batch->used, batch->num_cliprects); + + cliplen = batch->num_cliprects * sizeof(struct drm_clip_rect); + if (batch->num_cliprects < 0) + return -EFAULT; + if (batch->num_cliprects != 0) { + cliprects = malloc(batch->num_cliprects * + sizeof(struct drm_clip_rect), DRM_MEM_DMA, + M_WAITOK | M_ZERO); + + ret = -copyin(batch->cliprects, cliprects, + batch->num_cliprects * sizeof(struct drm_clip_rect)); + if (ret != 0) { + DRM_LOCK(dev); + goto fail_free; + } + } else + cliprects = NULL; + + DRM_LOCK(dev); + RING_LOCK_TEST_WITH_RETURN(dev, file_priv); + ret = i915_dispatch_batchbuffer(dev, batch, cliprects); + + sarea_priv = (drm_i915_sarea_t *)dev_priv->sarea_priv; + if (sarea_priv) + sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); + +fail_free: + free(cliprects, DRM_MEM_DMA); + return ret; +} + +static int i915_cmdbuffer(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + drm_i915_sarea_t *sarea_priv; + drm_i915_cmdbuffer_t *cmdbuf = data; + struct drm_clip_rect *cliprects = NULL; + void *batch_data; + int ret; + + DRM_DEBUG("i915 cmdbuffer, buf %p sz %d cliprects %d\n", + cmdbuf->buf, cmdbuf->sz, cmdbuf->num_cliprects); + + if (cmdbuf->num_cliprects < 0) + return -EINVAL; + + DRM_UNLOCK(dev); + + batch_data = malloc(cmdbuf->sz, DRM_MEM_DMA, M_WAITOK); + + ret = -copyin(cmdbuf->buf, batch_data, cmdbuf->sz); + if (ret != 0) { + DRM_LOCK(dev); + goto fail_batch_free; + } + + if (cmdbuf->num_cliprects) { + cliprects = malloc(cmdbuf->num_cliprects * + sizeof(struct drm_clip_rect), DRM_MEM_DMA, + M_WAITOK | M_ZERO); + ret = -copyin(cmdbuf->cliprects, cliprects, + cmdbuf->num_cliprects * sizeof(struct drm_clip_rect)); + if (ret != 0) { + DRM_LOCK(dev); + goto fail_clip_free; + } + } + + DRM_LOCK(dev); + RING_LOCK_TEST_WITH_RETURN(dev, file_priv); + ret = i915_dispatch_cmdbuffer(dev, cmdbuf, cliprects, batch_data); + if (ret) { + DRM_ERROR("i915_dispatch_cmdbuffer failed\n"); + goto fail_clip_free; + } + + sarea_priv = (drm_i915_sarea_t *)dev_priv->sarea_priv; + if (sarea_priv) + sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); + +fail_clip_free: + free(cliprects, DRM_MEM_DMA); +fail_batch_free: + free(batch_data, DRM_MEM_DMA); + return ret; +} + +static int i915_flip_bufs(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + int ret; + + DRM_DEBUG("%s\n", __func__); + + RING_LOCK_TEST_WITH_RETURN(dev, file_priv); + + ret = i915_dispatch_flip(dev); + + return ret; +} + +static int i915_getparam(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + drm_i915_getparam_t *param = data; + int value; + + if (!dev_priv) { + DRM_ERROR("called with no initialization\n"); + return -EINVAL; + } + + switch (param->param) { + case I915_PARAM_IRQ_ACTIVE: + value = dev->irq_enabled ? 1 : 0; + break; + case I915_PARAM_ALLOW_BATCHBUFFER: + value = dev_priv->allow_batchbuffer ? 1 : 0; + break; + case I915_PARAM_LAST_DISPATCH: + value = READ_BREADCRUMB(dev_priv); + break; + case I915_PARAM_CHIPSET_ID: + value = dev->pci_device; + break; + case I915_PARAM_HAS_GEM: + value = 1; + break; + case I915_PARAM_NUM_FENCES_AVAIL: + value = dev_priv->num_fence_regs - dev_priv->fence_reg_start; + break; + case I915_PARAM_HAS_OVERLAY: + value = dev_priv->overlay ? 1 : 0; + break; + case I915_PARAM_HAS_PAGEFLIPPING: + value = 1; + break; + case I915_PARAM_HAS_EXECBUF2: + value = 1; + break; + case I915_PARAM_HAS_BSD: + value = HAS_BSD(dev); + break; + case I915_PARAM_HAS_BLT: + value = HAS_BLT(dev); + break; + case I915_PARAM_HAS_RELAXED_FENCING: + value = 1; + break; + case I915_PARAM_HAS_COHERENT_RINGS: + value = 1; + break; + case I915_PARAM_HAS_EXEC_CONSTANTS: + value = INTEL_INFO(dev)->gen >= 4; + break; + case I915_PARAM_HAS_RELAXED_DELTA: + value = 1; + break; + case I915_PARAM_HAS_GEN7_SOL_RESET: + value = 1; + break; + case I915_PARAM_HAS_LLC: + value = HAS_LLC(dev); + break; + default: + DRM_DEBUG_DRIVER("Unknown parameter %d\n", + param->param); + return -EINVAL; + } + + if (DRM_COPY_TO_USER(param->value, &value, sizeof(int))) { + DRM_ERROR("DRM_COPY_TO_USER failed\n"); + return -EFAULT; + } + + return 0; +} + +static int i915_setparam(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + drm_i915_setparam_t *param = data; + + if (!dev_priv) { + DRM_ERROR("called with no initialization\n"); + return -EINVAL; + } + + switch (param->param) { + case I915_SETPARAM_USE_MI_BATCHBUFFER_START: + break; + case I915_SETPARAM_TEX_LRU_LOG_GRANULARITY: + dev_priv->tex_lru_log_granularity = param->value; + break; + case I915_SETPARAM_ALLOW_BATCHBUFFER: + dev_priv->allow_batchbuffer = param->value; + break; + case I915_SETPARAM_NUM_USED_FENCES: + if (param->value > dev_priv->num_fence_regs || + param->value < 0) + return -EINVAL; + /* Userspace can use first N regs */ + dev_priv->fence_reg_start = param->value; + break; + default: + DRM_DEBUG("unknown parameter %d\n", param->param); + return -EINVAL; + } + + return 0; +} + +static int i915_set_status_page(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + drm_i915_hws_addr_t *hws = data; + struct intel_ring_buffer *ring = LP_RING(dev_priv); + + if (!I915_NEED_GFX_HWS(dev)) + return -EINVAL; + + if (!dev_priv) { + DRM_ERROR("called with no initialization\n"); + return -EINVAL; + } + + DRM_DEBUG("set status page addr 0x%08x\n", (u32)hws->addr); + if (drm_core_check_feature(dev, DRIVER_MODESET)) { + DRM_ERROR("tried to set status page when mode setting active\n"); + return 0; + } + + ring->status_page.gfx_addr = dev_priv->status_gfx_addr = + hws->addr & (0x1ffff<<12); + + dev_priv->hws_map.offset = dev->agp->base + hws->addr; + dev_priv->hws_map.size = 4*1024; + dev_priv->hws_map.type = 0; + dev_priv->hws_map.flags = 0; + dev_priv->hws_map.mtrr = 0; + + drm_core_ioremap_wc(&dev_priv->hws_map, dev); + if (dev_priv->hws_map.virtual == NULL) { + i915_dma_cleanup(dev); + ring->status_page.gfx_addr = dev_priv->status_gfx_addr = 0; + DRM_ERROR("can not ioremap virtual address for" + " G33 hw status page\n"); + return -ENOMEM; + } + ring->status_page.page_addr = dev_priv->hw_status_page = + dev_priv->hws_map.virtual; + + memset(dev_priv->hw_status_page, 0, PAGE_SIZE); + I915_WRITE(HWS_PGA, dev_priv->status_gfx_addr); + DRM_DEBUG("load hws HWS_PGA with gfx mem 0x%x\n", + dev_priv->status_gfx_addr); + DRM_DEBUG("load hws at %p\n", dev_priv->hw_status_page); + return 0; +} + +static bool +intel_enable_ppgtt(struct drm_device *dev) +{ + if (i915_enable_ppgtt >= 0) + return i915_enable_ppgtt; + + /* Disable ppgtt on SNB if VT-d is on. */ + if (INTEL_INFO(dev)->gen == 6 && intel_iommu_enabled) + return false; + + return true; +} + +static int +i915_load_gem_init(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + unsigned long prealloc_size, gtt_size, mappable_size; + int ret; + + prealloc_size = dev_priv->mm.gtt.stolen_size; + gtt_size = dev_priv->mm.gtt.gtt_total_entries << PAGE_SHIFT; + mappable_size = dev_priv->mm.gtt.gtt_mappable_entries << PAGE_SHIFT; + + /* Basic memrange allocator for stolen space */ + drm_mm_init(&dev_priv->mm.stolen, 0, prealloc_size); + + DRM_LOCK(dev); + if (intel_enable_ppgtt(dev) && HAS_ALIASING_PPGTT(dev)) { + /* PPGTT pdes are stolen from global gtt ptes, so shrink the + * aperture accordingly when using aliasing ppgtt. */ + gtt_size -= I915_PPGTT_PD_ENTRIES*PAGE_SIZE; + /* For paranoia keep the guard page in between. */ + gtt_size -= PAGE_SIZE; + + i915_gem_do_init(dev, 0, mappable_size, gtt_size); + + ret = i915_gem_init_aliasing_ppgtt(dev); + if (ret) { + DRM_UNLOCK(dev); + return ret; + } + } else { + /* Let GEM Manage all of the aperture. + * + * However, leave one page at the end still bound to the scratch + * page. There are a number of places where the hardware + * apparently prefetches past the end of the object, and we've + * seen multiple hangs with the GPU head pointer stuck in a + * batchbuffer bound at the last page of the aperture. One page + * should be enough to keep any prefetching inside of the + * aperture. + */ + i915_gem_do_init(dev, 0, mappable_size, gtt_size - PAGE_SIZE); + } + + ret = i915_gem_init_hw(dev); + DRM_UNLOCK(dev); + if (ret != 0) { + i915_gem_cleanup_aliasing_ppgtt(dev); + return (ret); + } + +#if 0 + /* Try to set up FBC with a reasonable compressed buffer size */ + if (I915_HAS_FBC(dev) && i915_powersave) { + int cfb_size; + + /* Leave 1M for line length buffer & misc. */ + + /* Try to get a 32M buffer... */ + if (prealloc_size > (36*1024*1024)) + cfb_size = 32*1024*1024; + else /* fall back to 7/8 of the stolen space */ + cfb_size = prealloc_size * 7 / 8; + i915_setup_compression(dev, cfb_size); + } +#endif + + /* Allow hardware batchbuffers unless told otherwise. */ + dev_priv->allow_batchbuffer = 1; + return 0; +} + +static int +i915_load_modeset_init(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int ret; + + ret = intel_parse_bios(dev); + if (ret) + DRM_INFO("failed to find VBIOS tables\n"); + +#if 0 + intel_register_dsm_handler(); +#endif + + /* IIR "flip pending" bit means done if this bit is set */ + if (IS_GEN3(dev) && (I915_READ(ECOSKPD) & ECO_FLIP_DONE)) + dev_priv->flip_pending_is_done = true; + + intel_modeset_init(dev); + + ret = i915_load_gem_init(dev); + if (ret != 0) + goto cleanup_gem; + + intel_modeset_gem_init(dev); + + ret = drm_irq_install(dev); + if (ret) + goto cleanup_gem; + + dev->vblank_disable_allowed = 1; + + ret = intel_fbdev_init(dev); + if (ret) + goto cleanup_gem; + + drm_kms_helper_poll_init(dev); + + /* We're off and running w/KMS */ + dev_priv->mm.suspended = 0; + + return (0); + +cleanup_gem: + DRM_LOCK(dev); + i915_gem_cleanup_ringbuffer(dev); + DRM_UNLOCK(dev); + i915_gem_cleanup_aliasing_ppgtt(dev); + return (ret); +} + +static int +i915_get_bridge_dev(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv; + + dev_priv = dev->dev_private; + + dev_priv->bridge_dev = intel_gtt_get_bridge_device(); + if (dev_priv->bridge_dev == NULL) { + DRM_ERROR("bridge device not found\n"); + return (-1); + } + return (0); +} + +#define MCHBAR_I915 0x44 +#define MCHBAR_I965 0x48 +#define MCHBAR_SIZE (4*4096) + +#define DEVEN_REG 0x54 +#define DEVEN_MCHBAR_EN (1 << 28) + +/* Allocate space for the MCH regs if needed, return nonzero on error */ +static int +intel_alloc_mchbar_resource(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv; + device_t vga; + int reg; + u32 temp_lo, temp_hi; + u64 mchbar_addr, temp; + + dev_priv = dev->dev_private; + reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915; + + if (INTEL_INFO(dev)->gen >= 4) + temp_hi = pci_read_config(dev_priv->bridge_dev, reg + 4, 4); + else + temp_hi = 0; + temp_lo = pci_read_config(dev_priv->bridge_dev, reg, 4); + mchbar_addr = ((u64)temp_hi << 32) | temp_lo; + + /* If ACPI doesn't have it, assume we need to allocate it ourselves */ +#ifdef XXX_CONFIG_PNP + if (mchbar_addr && + pnp_range_reserved(mchbar_addr, mchbar_addr + MCHBAR_SIZE)) + return 0; +#endif + + /* Get some space for it */ + vga = device_get_parent(dev->device); + dev_priv->mch_res_rid = 0x100; + dev_priv->mch_res = BUS_ALLOC_RESOURCE(device_get_parent(vga), + dev->device, SYS_RES_MEMORY, &dev_priv->mch_res_rid, 0, ~0UL, + MCHBAR_SIZE, RF_ACTIVE | RF_SHAREABLE); + if (dev_priv->mch_res == NULL) { + DRM_ERROR("failed mchbar resource alloc\n"); + return (-ENOMEM); + } + + if (INTEL_INFO(dev)->gen >= 4) { + temp = rman_get_start(dev_priv->mch_res); + temp >>= 32; + pci_write_config(dev_priv->bridge_dev, reg + 4, temp, 4); + } + pci_write_config(dev_priv->bridge_dev, reg, + rman_get_start(dev_priv->mch_res) & UINT32_MAX, 4); + return (0); +} + +static void +intel_setup_mchbar(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv; + int mchbar_reg; + u32 temp; + bool enabled; + + dev_priv = dev->dev_private; + mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915; + + dev_priv->mchbar_need_disable = false; + + if (IS_I915G(dev) || IS_I915GM(dev)) { + temp = pci_read_config(dev_priv->bridge_dev, DEVEN_REG, 4); + enabled = (temp & DEVEN_MCHBAR_EN) != 0; + } else { + temp = pci_read_config(dev_priv->bridge_dev, mchbar_reg, 4); + enabled = temp & 1; + } + + /* If it's already enabled, don't have to do anything */ + if (enabled) { + DRM_DEBUG("mchbar already enabled\n"); + return; + } + + if (intel_alloc_mchbar_resource(dev)) + return; + + dev_priv->mchbar_need_disable = true; + + /* Space is allocated or reserved, so enable it. */ + if (IS_I915G(dev) || IS_I915GM(dev)) { + pci_write_config(dev_priv->bridge_dev, DEVEN_REG, + temp | DEVEN_MCHBAR_EN, 4); + } else { + temp = pci_read_config(dev_priv->bridge_dev, mchbar_reg, 4); + pci_write_config(dev_priv->bridge_dev, mchbar_reg, temp | 1, 4); + } +} + +static void +intel_teardown_mchbar(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv; + device_t vga; + int mchbar_reg; + u32 temp; + + dev_priv = dev->dev_private; + mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915; + + if (dev_priv->mchbar_need_disable) { + if (IS_I915G(dev) || IS_I915GM(dev)) { + temp = pci_read_config(dev_priv->bridge_dev, + DEVEN_REG, 4); + temp &= ~DEVEN_MCHBAR_EN; + pci_write_config(dev_priv->bridge_dev, DEVEN_REG, + temp, 4); + } else { + temp = pci_read_config(dev_priv->bridge_dev, + mchbar_reg, 4); + temp &= ~1; + pci_write_config(dev_priv->bridge_dev, mchbar_reg, + temp, 4); + } + } + + if (dev_priv->mch_res != NULL) { + vga = device_get_parent(dev->device); + BUS_DEACTIVATE_RESOURCE(device_get_parent(vga), dev->device, + SYS_RES_MEMORY, dev_priv->mch_res_rid, dev_priv->mch_res); + BUS_RELEASE_RESOURCE(device_get_parent(vga), dev->device, + SYS_RES_MEMORY, dev_priv->mch_res_rid, dev_priv->mch_res); + dev_priv->mch_res = NULL; + } +} + +int +i915_driver_load(struct drm_device *dev, unsigned long flags) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + unsigned long base, size; + int mmio_bar, ret; + + ret = 0; + + /* i915 has 4 more counters */ + dev->counters += 4; + dev->types[6] = _DRM_STAT_IRQ; + dev->types[7] = _DRM_STAT_PRIMARY; + dev->types[8] = _DRM_STAT_SECONDARY; + dev->types[9] = _DRM_STAT_DMA; + + dev_priv = malloc(sizeof(drm_i915_private_t), DRM_MEM_DRIVER, + M_ZERO | M_WAITOK); + if (dev_priv == NULL) + return -ENOMEM; + + dev->dev_private = (void *)dev_priv; + dev_priv->dev = dev; + dev_priv->info = i915_get_device_id(dev->pci_device); + + if (i915_get_bridge_dev(dev)) { + free(dev_priv, DRM_MEM_DRIVER); + return (-EIO); + } + dev_priv->mm.gtt = intel_gtt_get(); + + /* Add register map (needed for suspend/resume) */ + mmio_bar = IS_GEN2(dev) ? 1 : 0; + base = drm_get_resource_start(dev, mmio_bar); + size = drm_get_resource_len(dev, mmio_bar); + + ret = drm_addmap(dev, base, size, _DRM_REGISTERS, + _DRM_KERNEL | _DRM_DRIVER, &dev_priv->mmio_map); + + dev_priv->tq = taskqueue_create("915", M_WAITOK, + taskqueue_thread_enqueue, &dev_priv->tq); + taskqueue_start_threads(&dev_priv->tq, 1, PWAIT, "i915 taskq"); + mtx_init(&dev_priv->gt_lock, "915gt", NULL, MTX_DEF); + mtx_init(&dev_priv->error_lock, "915err", NULL, MTX_DEF); + mtx_init(&dev_priv->error_completion_lock, "915cmp", NULL, MTX_DEF); + mtx_init(&dev_priv->rps_lock, "915rps", NULL, MTX_DEF); + + dev_priv->has_gem = 1; + intel_irq_init(dev); + + intel_setup_mchbar(dev); + intel_setup_gmbus(dev); + intel_opregion_setup(dev); + + intel_setup_bios(dev); + + i915_gem_load(dev); + + /* Init HWS */ + if (!I915_NEED_GFX_HWS(dev)) { + ret = i915_init_phys_hws(dev); + if (ret != 0) { + drm_rmmap(dev, dev_priv->mmio_map); + drm_free(dev_priv, sizeof(struct drm_i915_private), + DRM_MEM_DRIVER); + return ret; + } + } + + if (IS_PINEVIEW(dev)) + i915_pineview_get_mem_freq(dev); + else if (IS_GEN5(dev)) + i915_ironlake_get_mem_freq(dev); + + mtx_init(&dev_priv->irq_lock, "userirq", NULL, MTX_DEF); + + if (IS_IVYBRIDGE(dev)) + dev_priv->num_pipe = 3; + else if (IS_MOBILE(dev) || !IS_GEN2(dev)) + dev_priv->num_pipe = 2; + else + dev_priv->num_pipe = 1; + + ret = drm_vblank_init(dev, dev_priv->num_pipe); + if (ret) + goto out_gem_unload; + + /* Start out suspended */ + dev_priv->mm.suspended = 1; + + intel_detect_pch(dev); + + if (drm_core_check_feature(dev, DRIVER_MODESET)) { + DRM_UNLOCK(dev); + ret = i915_load_modeset_init(dev); + DRM_LOCK(dev); + if (ret < 0) { + DRM_ERROR("failed to init modeset\n"); + goto out_gem_unload; + } + } + + intel_opregion_init(dev); + + callout_init(&dev_priv->hangcheck_timer, 1); + callout_reset(&dev_priv->hangcheck_timer, DRM_I915_HANGCHECK_PERIOD, + i915_hangcheck_elapsed, dev); + + if (IS_GEN5(dev)) { + mtx_lock(&mchdev_lock); + i915_mch_dev = dev_priv; + dev_priv->mchdev_lock = &mchdev_lock; + mtx_unlock(&mchdev_lock); + } + + return (0); + +out_gem_unload: + /* XXXKIB */ + (void) i915_driver_unload_int(dev, true); + return (ret); +} + +static int +i915_driver_unload_int(struct drm_device *dev, bool locked) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int ret; + + if (!locked) + DRM_LOCK(dev); + ret = i915_gpu_idle(dev, true); + if (ret) + DRM_ERROR("failed to idle hardware: %d\n", ret); + if (!locked) + DRM_UNLOCK(dev); + + i915_free_hws(dev); + + intel_teardown_mchbar(dev); + + if (locked) + DRM_UNLOCK(dev); + if (drm_core_check_feature(dev, DRIVER_MODESET)) { + intel_fbdev_fini(dev); + intel_modeset_cleanup(dev); + } + + /* Free error state after interrupts are fully disabled. */ + callout_stop(&dev_priv->hangcheck_timer); + callout_drain(&dev_priv->hangcheck_timer); + + i915_destroy_error_state(dev); + + intel_opregion_fini(dev); + + if (locked) + DRM_LOCK(dev); + + if (drm_core_check_feature(dev, DRIVER_MODESET)) { + if (!locked) + DRM_LOCK(dev); + i915_gem_free_all_phys_object(dev); + i915_gem_cleanup_ringbuffer(dev); + if (!locked) + DRM_UNLOCK(dev); + i915_gem_cleanup_aliasing_ppgtt(dev); +#if 1 + KIB_NOTYET(); +#else + if (I915_HAS_FBC(dev) && i915_powersave) + i915_cleanup_compression(dev); +#endif + drm_mm_takedown(&dev_priv->mm.stolen); + + intel_cleanup_overlay(dev); + + if (!I915_NEED_GFX_HWS(dev)) + i915_free_hws(dev); + } + + i915_gem_unload(dev); + + mtx_destroy(&dev_priv->irq_lock); + + if (dev_priv->tq != NULL) + taskqueue_free(dev_priv->tq); + + bus_generic_detach(dev->device); + drm_rmmap(dev, dev_priv->mmio_map); + intel_teardown_gmbus(dev); + + mtx_destroy(&dev_priv->error_lock); + mtx_destroy(&dev_priv->error_completion_lock); + mtx_destroy(&dev_priv->rps_lock); + drm_free(dev->dev_private, sizeof(drm_i915_private_t), + DRM_MEM_DRIVER); + + return (0); +} + +int +i915_driver_unload(struct drm_device *dev) +{ + + return (i915_driver_unload_int(dev, true)); +} + +int +i915_driver_open(struct drm_device *dev, struct drm_file *file_priv) +{ + struct drm_i915_file_private *i915_file_priv; + + i915_file_priv = malloc(sizeof(*i915_file_priv), DRM_MEM_FILES, + M_WAITOK | M_ZERO); + + mtx_init(&i915_file_priv->mm.lck, "915fp", NULL, MTX_DEF); + INIT_LIST_HEAD(&i915_file_priv->mm.request_list); + file_priv->driver_priv = i915_file_priv; + + return (0); +} + +void +i915_driver_lastclose(struct drm_device * dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + + if (!dev_priv || drm_core_check_feature(dev, DRIVER_MODESET)) { +#if 1 + KIB_NOTYET(); +#else + drm_fb_helper_restore(); + vga_switcheroo_process_delayed_switch(); +#endif + return; + } + i915_gem_lastclose(dev); + i915_dma_cleanup(dev); +} + +void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv) +{ + + i915_gem_release(dev, file_priv); +} + +void i915_driver_postclose(struct drm_device *dev, struct drm_file *file_priv) +{ + struct drm_i915_file_private *i915_file_priv = file_priv->driver_priv; + + mtx_destroy(&i915_file_priv->mm.lck); + drm_free(i915_file_priv, sizeof(*i915_file_priv), DRM_MEM_FILES); +} + +struct drm_ioctl_desc i915_ioctls[] = { + DRM_IOCTL_DEF(DRM_I915_INIT, i915_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_I915_FLUSH, i915_flush_ioctl, DRM_AUTH), + DRM_IOCTL_DEF(DRM_I915_FLIP, i915_flip_bufs, DRM_AUTH), + DRM_IOCTL_DEF(DRM_I915_BATCHBUFFER, i915_batchbuffer, DRM_AUTH), + DRM_IOCTL_DEF(DRM_I915_IRQ_EMIT, i915_irq_emit, DRM_AUTH), + DRM_IOCTL_DEF(DRM_I915_IRQ_WAIT, i915_irq_wait, DRM_AUTH), + DRM_IOCTL_DEF(DRM_I915_GETPARAM, i915_getparam, DRM_AUTH), + DRM_IOCTL_DEF(DRM_I915_SETPARAM, i915_setparam, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_I915_ALLOC, drm_noop, DRM_AUTH), + DRM_IOCTL_DEF(DRM_I915_FREE, drm_noop, DRM_AUTH), + DRM_IOCTL_DEF(DRM_I915_INIT_HEAP, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_I915_CMDBUFFER, i915_cmdbuffer, DRM_AUTH), + DRM_IOCTL_DEF(DRM_I915_DESTROY_HEAP, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY ), + DRM_IOCTL_DEF(DRM_I915_SET_VBLANK_PIPE, i915_vblank_pipe_set, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY ), + DRM_IOCTL_DEF(DRM_I915_GET_VBLANK_PIPE, i915_vblank_pipe_get, DRM_AUTH ), + DRM_IOCTL_DEF(DRM_I915_VBLANK_SWAP, i915_vblank_swap, DRM_AUTH), + DRM_IOCTL_DEF(DRM_I915_HWS_ADDR, i915_set_status_page, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_I915_GEM_INIT, i915_gem_init_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_I915_GEM_EXECBUFFER, i915_gem_execbuffer, DRM_AUTH | DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GEM_EXECBUFFER2, i915_gem_execbuffer2, DRM_AUTH | DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GEM_PIN, i915_gem_pin_ioctl, DRM_AUTH|DRM_ROOT_ONLY|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GEM_UNPIN, i915_gem_unpin_ioctl, DRM_AUTH|DRM_ROOT_ONLY|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GEM_BUSY, i915_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GEM_THROTTLE, i915_gem_throttle_ioctl, DRM_AUTH), + DRM_IOCTL_DEF(DRM_I915_GEM_ENTERVT, i915_gem_entervt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_I915_GEM_LEAVEVT, i915_gem_leavevt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), + DRM_IOCTL_DEF(DRM_I915_GEM_CREATE, i915_gem_create_ioctl, 0), + DRM_IOCTL_DEF(DRM_I915_GEM_PREAD, i915_gem_pread_ioctl, DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GEM_PWRITE, i915_gem_pwrite_ioctl, DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GEM_MMAP, i915_gem_mmap_ioctl, 0), + DRM_IOCTL_DEF(DRM_I915_GEM_MMAP_GTT, i915_gem_mmap_gtt_ioctl, DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GEM_SET_DOMAIN, i915_gem_set_domain_ioctl, DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GEM_SW_FINISH, i915_gem_sw_finish_ioctl, DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GEM_SET_TILING, i915_gem_set_tiling, 0), + DRM_IOCTL_DEF(DRM_I915_GEM_GET_TILING, i915_gem_get_tiling, 0), + DRM_IOCTL_DEF(DRM_I915_GEM_GET_APERTURE, i915_gem_get_aperture_ioctl, DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GET_PIPE_FROM_CRTC_ID, intel_get_pipe_from_crtc_id, DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GEM_MADVISE, i915_gem_madvise_ioctl, DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_OVERLAY_PUT_IMAGE, intel_overlay_put_image, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_OVERLAY_ATTRS, intel_overlay_attrs, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_SET_SPRITE_COLORKEY, intel_sprite_set_colorkey, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), + DRM_IOCTL_DEF(DRM_I915_GET_SPRITE_COLORKEY, intel_sprite_get_colorkey, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), +}; + +struct drm_driver_info i915_driver_info = { + .driver_features = DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | + DRIVER_USE_MTRR | DRIVER_HAVE_IRQ | DRIVER_LOCKLESS_IRQ | + DRIVER_GEM /*| DRIVER_MODESET*/, + + .buf_priv_size = sizeof(drm_i915_private_t), + .load = i915_driver_load, + .open = i915_driver_open, + .unload = i915_driver_unload, + .preclose = i915_driver_preclose, + .lastclose = i915_driver_lastclose, + .postclose = i915_driver_postclose, + .device_is_agp = i915_driver_device_is_agp, + .gem_init_object = i915_gem_init_object, + .gem_free_object = i915_gem_free_object, + .gem_pager_ops = &i915_gem_pager_ops, + .dumb_create = i915_gem_dumb_create, + .dumb_map_offset = i915_gem_mmap_gtt, + .dumb_destroy = i915_gem_dumb_destroy, + .sysctl_init = i915_sysctl_init, + .sysctl_cleanup = i915_sysctl_cleanup, + + .ioctls = i915_ioctls, + .max_ioctl = DRM_ARRAY_SIZE(i915_ioctls), + + .name = DRIVER_NAME, + .desc = DRIVER_DESC, + .date = DRIVER_DATE, + .major = DRIVER_MAJOR, + .minor = DRIVER_MINOR, + .patchlevel = DRIVER_PATCHLEVEL, +}; + +/** + * Determine if the device really is AGP or not. + * + * All Intel graphics chipsets are treated as AGP, even if they are really + * built-in. + * + * \param dev The device to be tested. + * + * \returns + * A value of 1 is always retured to indictate every i9x5 is AGP. + */ +int i915_driver_device_is_agp(struct drm_device * dev) +{ + return 1; +} + +static void i915_pineview_get_mem_freq(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + u32 tmp; + + tmp = I915_READ(CLKCFG); + + switch (tmp & CLKCFG_FSB_MASK) { + case CLKCFG_FSB_533: + dev_priv->fsb_freq = 533; /* 133*4 */ + break; + case CLKCFG_FSB_800: + dev_priv->fsb_freq = 800; /* 200*4 */ + break; + case CLKCFG_FSB_667: + dev_priv->fsb_freq = 667; /* 167*4 */ + break; + case CLKCFG_FSB_400: + dev_priv->fsb_freq = 400; /* 100*4 */ + break; + } + + switch (tmp & CLKCFG_MEM_MASK) { + case CLKCFG_MEM_533: + dev_priv->mem_freq = 533; + break; + case CLKCFG_MEM_667: + dev_priv->mem_freq = 667; + break; + case CLKCFG_MEM_800: + dev_priv->mem_freq = 800; + break; + } + + /* detect pineview DDR3 setting */ + tmp = I915_READ(CSHRDDR3CTL); + dev_priv->is_ddr3 = (tmp & CSHRDDR3CTL_DDR3) ? 1 : 0; +} + +static void i915_ironlake_get_mem_freq(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + u16 ddrpll, csipll; + + ddrpll = I915_READ16(DDRMPLL1); + csipll = I915_READ16(CSIPLL0); + + switch (ddrpll & 0xff) { + case 0xc: + dev_priv->mem_freq = 800; + break; + case 0x10: + dev_priv->mem_freq = 1066; + break; + case 0x14: + dev_priv->mem_freq = 1333; + break; + case 0x18: + dev_priv->mem_freq = 1600; + break; + default: + DRM_DEBUG("unknown memory frequency 0x%02x\n", + ddrpll & 0xff); + dev_priv->mem_freq = 0; + break; + } + + dev_priv->r_t = dev_priv->mem_freq; + + switch (csipll & 0x3ff) { + case 0x00c: + dev_priv->fsb_freq = 3200; + break; + case 0x00e: + dev_priv->fsb_freq = 3733; + break; + case 0x010: + dev_priv->fsb_freq = 4266; + break; + case 0x012: + dev_priv->fsb_freq = 4800; + break; + case 0x014: + dev_priv->fsb_freq = 5333; + break; + case 0x016: + dev_priv->fsb_freq = 5866; + break; + case 0x018: + dev_priv->fsb_freq = 6400; + break; + default: + DRM_DEBUG("unknown fsb frequency 0x%04x\n", + csipll & 0x3ff); + dev_priv->fsb_freq = 0; + break; + } + + if (dev_priv->fsb_freq == 3200) { + dev_priv->c_m = 0; + } else if (dev_priv->fsb_freq > 3200 && dev_priv->fsb_freq <= 4800) { + dev_priv->c_m = 1; + } else { + dev_priv->c_m = 2; + } +} + +static const struct cparams { + u16 i; + u16 t; + u16 m; + u16 c; +} cparams[] = { + { 1, 1333, 301, 28664 }, + { 1, 1066, 294, 24460 }, + { 1, 800, 294, 25192 }, + { 0, 1333, 276, 27605 }, + { 0, 1066, 276, 27605 }, + { 0, 800, 231, 23784 }, +}; + +unsigned long i915_chipset_val(struct drm_i915_private *dev_priv) +{ + u64 total_count, diff, ret; + u32 count1, count2, count3, m = 0, c = 0; + unsigned long now = jiffies_to_msecs(jiffies), diff1; + int i; + + diff1 = now - dev_priv->last_time1; + /* + * sysctl(8) reads the value of sysctl twice in rapid + * succession. There is high chance that it happens in the + * same timer tick. Use the cached value to not divide by + * zero and give the hw a chance to gather more samples. + */ + if (diff1 <= 10) + return (dev_priv->chipset_power); + + count1 = I915_READ(DMIEC); + count2 = I915_READ(DDREC); + count3 = I915_READ(CSIEC); + + total_count = count1 + count2 + count3; + + /* FIXME: handle per-counter overflow */ + if (total_count < dev_priv->last_count1) { + diff = ~0UL - dev_priv->last_count1; + diff += total_count; + } else { + diff = total_count - dev_priv->last_count1; + } + + for (i = 0; i < DRM_ARRAY_SIZE(cparams); i++) { + if (cparams[i].i == dev_priv->c_m && + cparams[i].t == dev_priv->r_t) { + m = cparams[i].m; + c = cparams[i].c; + break; + } + } + + diff = diff / diff1; + ret = ((m * diff) + c); + ret = ret / 10; + + dev_priv->last_count1 = total_count; + dev_priv->last_time1 = now; + + dev_priv->chipset_power = ret; + return (ret); +} + +unsigned long i915_mch_val(struct drm_i915_private *dev_priv) +{ + unsigned long m, x, b; + u32 tsfs; + + tsfs = I915_READ(TSFS); + + m = ((tsfs & TSFS_SLOPE_MASK) >> TSFS_SLOPE_SHIFT); + x = I915_READ8(I915_TR1); + + b = tsfs & TSFS_INTR_MASK; + + return ((m * x) / 127) - b; +} + +static u16 pvid_to_extvid(struct drm_i915_private *dev_priv, u8 pxvid) +{ + static const struct v_table { + u16 vd; /* in .1 mil */ + u16 vm; /* in .1 mil */ + } v_table[] = { + { 0, 0, }, + { 375, 0, }, + { 500, 0, }, + { 625, 0, }, + { 750, 0, }, + { 875, 0, }, + { 1000, 0, }, + { 1125, 0, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4125, 3000, }, + { 4250, 3125, }, + { 4375, 3250, }, + { 4500, 3375, }, + { 4625, 3500, }, + { 4750, 3625, }, + { 4875, 3750, }, + { 5000, 3875, }, + { 5125, 4000, }, + { 5250, 4125, }, + { 5375, 4250, }, + { 5500, 4375, }, + { 5625, 4500, }, + { 5750, 4625, }, + { 5875, 4750, }, + { 6000, 4875, }, + { 6125, 5000, }, + { 6250, 5125, }, + { 6375, 5250, }, + { 6500, 5375, }, + { 6625, 5500, }, + { 6750, 5625, }, + { 6875, 5750, }, + { 7000, 5875, }, + { 7125, 6000, }, + { 7250, 6125, }, + { 7375, 6250, }, + { 7500, 6375, }, + { 7625, 6500, }, + { 7750, 6625, }, + { 7875, 6750, }, + { 8000, 6875, }, + { 8125, 7000, }, + { 8250, 7125, }, + { 8375, 7250, }, + { 8500, 7375, }, + { 8625, 7500, }, + { 8750, 7625, }, + { 8875, 7750, }, + { 9000, 7875, }, + { 9125, 8000, }, + { 9250, 8125, }, + { 9375, 8250, }, + { 9500, 8375, }, + { 9625, 8500, }, + { 9750, 8625, }, + { 9875, 8750, }, + { 10000, 8875, }, + { 10125, 9000, }, + { 10250, 9125, }, + { 10375, 9250, }, + { 10500, 9375, }, + { 10625, 9500, }, + { 10750, 9625, }, + { 10875, 9750, }, + { 11000, 9875, }, + { 11125, 10000, }, + { 11250, 10125, }, + { 11375, 10250, }, + { 11500, 10375, }, + { 11625, 10500, }, + { 11750, 10625, }, + { 11875, 10750, }, + { 12000, 10875, }, + { 12125, 11000, }, + { 12250, 11125, }, + { 12375, 11250, }, + { 12500, 11375, }, + { 12625, 11500, }, + { 12750, 11625, }, + { 12875, 11750, }, + { 13000, 11875, }, + { 13125, 12000, }, + { 13250, 12125, }, + { 13375, 12250, }, + { 13500, 12375, }, + { 13625, 12500, }, + { 13750, 12625, }, + { 13875, 12750, }, + { 14000, 12875, }, + { 14125, 13000, }, + { 14250, 13125, }, + { 14375, 13250, }, + { 14500, 13375, }, + { 14625, 13500, }, + { 14750, 13625, }, + { 14875, 13750, }, + { 15000, 13875, }, + { 15125, 14000, }, + { 15250, 14125, }, + { 15375, 14250, }, + { 15500, 14375, }, + { 15625, 14500, }, + { 15750, 14625, }, + { 15875, 14750, }, + { 16000, 14875, }, + { 16125, 15000, }, + }; + if (dev_priv->info->is_mobile) + return v_table[pxvid].vm; + else + return v_table[pxvid].vd; +} + +void i915_update_gfx_val(struct drm_i915_private *dev_priv) +{ + struct timespec now, diff1; + u64 diff; + unsigned long diffms; + u32 count; + + if (dev_priv->info->gen != 5) + return; + + nanotime(&now); + diff1 = now; + timespecsub(&diff1, &dev_priv->last_time2); + + /* Don't divide by 0 */ + diffms = diff1.tv_sec * 1000 + diff1.tv_nsec / 1000000; + if (!diffms) + return; + + count = I915_READ(GFXEC); + + if (count < dev_priv->last_count2) { + diff = ~0UL - dev_priv->last_count2; + diff += count; + } else { + diff = count - dev_priv->last_count2; + } + + dev_priv->last_count2 = count; + dev_priv->last_time2 = now; + + /* More magic constants... */ + diff = diff * 1181; + diff = diff / (diffms * 10); + dev_priv->gfx_power = diff; +} + +unsigned long i915_gfx_val(struct drm_i915_private *dev_priv) +{ + unsigned long t, corr, state1, corr2, state2; + u32 pxvid, ext_v; + + pxvid = I915_READ(PXVFREQ_BASE + (dev_priv->cur_delay * 4)); + pxvid = (pxvid >> 24) & 0x7f; + ext_v = pvid_to_extvid(dev_priv, pxvid); + + state1 = ext_v; + + t = i915_mch_val(dev_priv); + + /* Revel in the empirically derived constants */ + + /* Correction factor in 1/100000 units */ + if (t > 80) + corr = ((t * 2349) + 135940); + else if (t >= 50) + corr = ((t * 964) + 29317); + else /* < 50 */ + corr = ((t * 301) + 1004); + + corr = corr * ((150142 * state1) / 10000 - 78642); + corr /= 100000; + corr2 = (corr * dev_priv->corr); + + state2 = (corr2 * state1) / 10000; + state2 /= 100; /* convert to mW */ + + i915_update_gfx_val(dev_priv); + + return dev_priv->gfx_power + state2; +} + +/** + * i915_read_mch_val - return value for IPS use + * + * Calculate and return a value for the IPS driver to use when deciding whether + * we have thermal and power headroom to increase CPU or GPU power budget. + */ +unsigned long i915_read_mch_val(void) +{ + struct drm_i915_private *dev_priv; + unsigned long chipset_val, graphics_val, ret = 0; + + mtx_lock(&mchdev_lock); + if (!i915_mch_dev) + goto out_unlock; + dev_priv = i915_mch_dev; + + chipset_val = i915_chipset_val(dev_priv); + graphics_val = i915_gfx_val(dev_priv); + + ret = chipset_val + graphics_val; + +out_unlock: + mtx_unlock(&mchdev_lock); + + return ret; +} + +/** + * i915_gpu_raise - raise GPU frequency limit + * + * Raise the limit; IPS indicates we have thermal headroom. + */ +bool i915_gpu_raise(void) +{ + struct drm_i915_private *dev_priv; + bool ret = true; + + mtx_lock(&mchdev_lock); + if (!i915_mch_dev) { + ret = false; + goto out_unlock; + } + dev_priv = i915_mch_dev; + + if (dev_priv->max_delay > dev_priv->fmax) + dev_priv->max_delay--; + +out_unlock: + mtx_unlock(&mchdev_lock); + + return ret; +} + +/** + * i915_gpu_lower - lower GPU frequency limit + * + * IPS indicates we're close to a thermal limit, so throttle back the GPU + * frequency maximum. + */ +bool i915_gpu_lower(void) +{ + struct drm_i915_private *dev_priv; + bool ret = true; + + mtx_lock(&mchdev_lock); + if (!i915_mch_dev) { + ret = false; + goto out_unlock; + } + dev_priv = i915_mch_dev; + + if (dev_priv->max_delay < dev_priv->min_delay) + dev_priv->max_delay++; + +out_unlock: + mtx_unlock(&mchdev_lock); + + return ret; +} + +/** + * i915_gpu_busy - indicate GPU business to IPS + * + * Tell the IPS driver whether or not the GPU is busy. + */ +bool i915_gpu_busy(void) +{ + struct drm_i915_private *dev_priv; + bool ret = false; + + mtx_lock(&mchdev_lock); + if (!i915_mch_dev) + goto out_unlock; + dev_priv = i915_mch_dev; + + ret = dev_priv->busy; + +out_unlock: + mtx_unlock(&mchdev_lock); + + return ret; +} + +/** + * i915_gpu_turbo_disable - disable graphics turbo + * + * Disable graphics turbo by resetting the max frequency and setting the + * current frequency to the default. + */ +bool i915_gpu_turbo_disable(void) +{ + struct drm_i915_private *dev_priv; + bool ret = true; + + mtx_lock(&mchdev_lock); + if (!i915_mch_dev) { + ret = false; + goto out_unlock; + } + dev_priv = i915_mch_dev; + + dev_priv->max_delay = dev_priv->fstart; + + if (!ironlake_set_drps(dev_priv->dev, dev_priv->fstart)) + ret = false; + +out_unlock: + mtx_unlock(&mchdev_lock); + + return ret; +} diff --git a/sys/dev/drm2/i915/i915_drm.h b/sys/dev/drm2/i915/i915_drm.h new file mode 100644 index 00000000000..d4b0ae8386d --- /dev/null +++ b/sys/dev/drm2/i915/i915_drm.h @@ -0,0 +1,971 @@ +/*- + * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef _I915_DRM_H_ +#define _I915_DRM_H_ + +/* Please note that modifications to all structs defined here are + * subject to backwards-compatibility constraints. + */ + +#include + +/* Each region is a minimum of 16k, and there are at most 255 of them. + */ +#define I915_NR_TEX_REGIONS 255 /* table size 2k - maximum due to use + * of chars for next/prev indices */ +#define I915_LOG_MIN_TEX_REGION_SIZE 14 + +typedef struct _drm_i915_init { + enum { + I915_INIT_DMA = 0x01, + I915_CLEANUP_DMA = 0x02, + I915_RESUME_DMA = 0x03, + + /* Since this struct isn't versioned, just used a new + * 'func' code to indicate the presence of dri2 sarea + * info. */ + I915_INIT_DMA2 = 0x04 + } func; + unsigned int mmio_offset; + int sarea_priv_offset; + unsigned int ring_start; + unsigned int ring_end; + unsigned int ring_size; + unsigned int front_offset; + unsigned int back_offset; + unsigned int depth_offset; + unsigned int w; + unsigned int h; + unsigned int pitch; + unsigned int pitch_bits; + unsigned int back_pitch; + unsigned int depth_pitch; + unsigned int cpp; + unsigned int chipset; + unsigned int sarea_handle; +} drm_i915_init_t; + +typedef struct drm_i915_sarea { + struct drm_tex_region texList[I915_NR_TEX_REGIONS + 1]; + int last_upload; /* last time texture was uploaded */ + int last_enqueue; /* last time a buffer was enqueued */ + int last_dispatch; /* age of the most recently dispatched buffer */ + int ctxOwner; /* last context to upload state */ + int texAge; + int pf_enabled; /* is pageflipping allowed? */ + int pf_active; + int pf_current_page; /* which buffer is being displayed? */ + int perf_boxes; /* performance boxes to be displayed */ + int width, height; /* screen size in pixels */ + + drm_handle_t front_handle; + int front_offset; + int front_size; + + drm_handle_t back_handle; + int back_offset; + int back_size; + + drm_handle_t depth_handle; + int depth_offset; + int depth_size; + + drm_handle_t tex_handle; + int tex_offset; + int tex_size; + int log_tex_granularity; + int pitch; + int rotation; /* 0, 90, 180 or 270 */ + int rotated_offset; + int rotated_size; + int rotated_pitch; + int virtualX, virtualY; + + unsigned int front_tiled; + unsigned int back_tiled; + unsigned int depth_tiled; + unsigned int rotated_tiled; + unsigned int rotated2_tiled; + + int planeA_x; + int planeA_y; + int planeA_w; + int planeA_h; + int planeB_x; + int planeB_y; + int planeB_w; + int planeB_h; + + /* Triple buffering */ + drm_handle_t third_handle; + int third_offset; + int third_size; + unsigned int third_tiled; + + /* buffer object handles for the static buffers. May change + * over the lifetime of the client, though it doesn't in our current + * implementation. + */ + unsigned int front_bo_handle; + unsigned int back_bo_handle; + unsigned int third_bo_handle; + unsigned int depth_bo_handle; +} drm_i915_sarea_t; + +/* Driver specific fence types and classes. + */ + +/* The only fence class we support */ +#define DRM_I915_FENCE_CLASS_ACCEL 0 +/* Fence type that guarantees read-write flush */ +#define DRM_I915_FENCE_TYPE_RW 2 +/* MI_FLUSH programmed just before the fence */ +#define DRM_I915_FENCE_FLAG_FLUSHED 0x01000000 + +/* Flags for perf_boxes + */ +#define I915_BOX_RING_EMPTY 0x1 +#define I915_BOX_FLIP 0x2 +#define I915_BOX_WAIT 0x4 +#define I915_BOX_TEXTURE_LOAD 0x8 +#define I915_BOX_LOST_CONTEXT 0x10 + +/* I915 specific ioctls + * The device specific ioctl range is 0x40 to 0x79. + */ +#define DRM_I915_INIT 0x00 +#define DRM_I915_FLUSH 0x01 +#define DRM_I915_FLIP 0x02 +#define DRM_I915_BATCHBUFFER 0x03 +#define DRM_I915_IRQ_EMIT 0x04 +#define DRM_I915_IRQ_WAIT 0x05 +#define DRM_I915_GETPARAM 0x06 +#define DRM_I915_SETPARAM 0x07 +#define DRM_I915_ALLOC 0x08 +#define DRM_I915_FREE 0x09 +#define DRM_I915_INIT_HEAP 0x0a +#define DRM_I915_CMDBUFFER 0x0b +#define DRM_I915_DESTROY_HEAP 0x0c +#define DRM_I915_SET_VBLANK_PIPE 0x0d +#define DRM_I915_GET_VBLANK_PIPE 0x0e +#define DRM_I915_VBLANK_SWAP 0x0f +#define DRM_I915_MMIO 0x10 +#define DRM_I915_HWS_ADDR 0x11 +#define DRM_I915_EXECBUFFER 0x12 +#define DRM_I915_GEM_INIT 0x13 +#define DRM_I915_GEM_EXECBUFFER 0x14 +#define DRM_I915_GEM_PIN 0x15 +#define DRM_I915_GEM_UNPIN 0x16 +#define DRM_I915_GEM_BUSY 0x17 +#define DRM_I915_GEM_THROTTLE 0x18 +#define DRM_I915_GEM_ENTERVT 0x19 +#define DRM_I915_GEM_LEAVEVT 0x1a +#define DRM_I915_GEM_CREATE 0x1b +#define DRM_I915_GEM_PREAD 0x1c +#define DRM_I915_GEM_PWRITE 0x1d +#define DRM_I915_GEM_MMAP 0x1e +#define DRM_I915_GEM_SET_DOMAIN 0x1f +#define DRM_I915_GEM_SW_FINISH 0x20 +#define DRM_I915_GEM_SET_TILING 0x21 +#define DRM_I915_GEM_GET_TILING 0x22 +#define DRM_I915_GEM_GET_APERTURE 0x23 +#define DRM_I915_GEM_MMAP_GTT 0x24 +#define DRM_I915_GET_PIPE_FROM_CRTC_ID 0x25 +#define DRM_I915_GEM_MADVISE 0x26 +#define DRM_I915_OVERLAY_PUT_IMAGE 0x27 +#define DRM_I915_OVERLAY_ATTRS 0x28 +#define DRM_I915_GEM_EXECBUFFER2 0x29 +#define DRM_I915_GET_SPRITE_COLORKEY 0x2a +#define DRM_I915_SET_SPRITE_COLORKEY 0x2b + +#define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) +#define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH) +#define DRM_IOCTL_I915_FLIP DRM_IOW( DRM_COMMAND_BASE + DRM_I915_FLIP, drm_i915_flip_t) +#define DRM_IOCTL_I915_BATCHBUFFER DRM_IOW( DRM_COMMAND_BASE + DRM_I915_BATCHBUFFER, drm_i915_batchbuffer_t) +#define DRM_IOCTL_I915_IRQ_EMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_IRQ_EMIT, drm_i915_irq_emit_t) +#define DRM_IOCTL_I915_IRQ_WAIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_IRQ_WAIT, drm_i915_irq_wait_t) +#define DRM_IOCTL_I915_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GETPARAM, drm_i915_getparam_t) +#define DRM_IOCTL_I915_SETPARAM DRM_IOW( DRM_COMMAND_BASE + DRM_I915_SETPARAM, drm_i915_setparam_t) +#define DRM_IOCTL_I915_ALLOC DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_ALLOC, drm_i915_mem_alloc_t) +#define DRM_IOCTL_I915_FREE DRM_IOW( DRM_COMMAND_BASE + DRM_I915_FREE, drm_i915_mem_free_t) +#define DRM_IOCTL_I915_INIT_HEAP DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT_HEAP, drm_i915_mem_init_heap_t) +#define DRM_IOCTL_I915_CMDBUFFER DRM_IOW( DRM_COMMAND_BASE + DRM_I915_CMDBUFFER, drm_i915_cmdbuffer_t) +#define DRM_IOCTL_I915_DESTROY_HEAP DRM_IOW( DRM_COMMAND_BASE + DRM_I915_DESTROY_HEAP, drm_i915_mem_destroy_heap_t) +#define DRM_IOCTL_I915_SET_VBLANK_PIPE DRM_IOW( DRM_COMMAND_BASE + DRM_I915_SET_VBLANK_PIPE, drm_i915_vblank_pipe_t) +#define DRM_IOCTL_I915_GET_VBLANK_PIPE DRM_IOR( DRM_COMMAND_BASE + DRM_I915_GET_VBLANK_PIPE, drm_i915_vblank_pipe_t) +#define DRM_IOCTL_I915_VBLANK_SWAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_VBLANK_SWAP, drm_i915_vblank_swap_t) +#define DRM_IOCTL_I915_MMIO DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_MMIO, drm_i915_mmio) +#define DRM_IOCTL_I915_EXECBUFFER DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_EXECBUFFER, struct drm_i915_execbuffer) +#define DRM_IOCTL_I915_GEM_INIT DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_INIT, struct drm_i915_gem_init) +#define DRM_IOCTL_I915_GEM_EXECBUFFER DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER, struct drm_i915_gem_execbuffer) +#define DRM_IOCTL_I915_GEM_EXECBUFFER2 DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER2, struct drm_i915_gem_execbuffer2) +#define DRM_IOCTL_I915_GEM_PIN DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_PIN, struct drm_i915_gem_pin) +#define DRM_IOCTL_I915_GEM_UNPIN DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_UNPIN, struct drm_i915_gem_unpin) +#define DRM_IOCTL_I915_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_BUSY, struct drm_i915_gem_busy) +#define DRM_IOCTL_I915_GEM_THROTTLE DRM_IO ( DRM_COMMAND_BASE + DRM_I915_GEM_THROTTLE) +#define DRM_IOCTL_I915_GEM_ENTERVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_ENTERVT) +#define DRM_IOCTL_I915_GEM_LEAVEVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_LEAVEVT) +#define DRM_IOCTL_I915_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CREATE, struct drm_i915_gem_create) +#define DRM_IOCTL_I915_GEM_PREAD DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread) +#define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite) +#define DRM_IOCTL_I915_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap) +#define DRM_IOCTL_I915_GEM_MMAP_GTT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP_GTT, struct drm_i915_gem_mmap_gtt) +#define DRM_IOCTL_I915_GEM_SET_DOMAIN DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SET_DOMAIN, struct drm_i915_gem_set_domain) +#define DRM_IOCTL_I915_GEM_SW_FINISH DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SW_FINISH, struct drm_i915_gem_sw_finish) +#define DRM_IOCTL_I915_GEM_SET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_SET_TILING, struct drm_i915_gem_set_tiling) +#define DRM_IOCTL_I915_GEM_GET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_TILING, struct drm_i915_gem_get_tiling) +#define DRM_IOCTL_I915_GEM_GET_APERTURE DRM_IOR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture) +#define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_i915_get_pipe_from_crtc_id) +#define DRM_IOCTL_I915_GEM_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MADVISE, struct drm_i915_gem_madvise) +#define DRM_IOCTL_I915_OVERLAY_PUT_IMAGE DRM_IOW(DRM_COMMAND_BASE + DRM_IOCTL_I915_OVERLAY_PUT_IMAGE, struct drm_intel_overlay_put_image) +#define DRM_IOCTL_I915_OVERLAY_ATTRS DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_OVERLAY_ATTRS, struct drm_intel_overlay_attrs) +#define DRM_IOCTL_I915_SET_SPRITE_COLORKEY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_SET_SPRITE_COLORKEY, struct drm_intel_sprite_colorkey) +#define DRM_IOCTL_I915_GET_SPRITE_COLORKEY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_SET_SPRITE_COLORKEY, struct drm_intel_sprite_colorkey) + +/* Asynchronous page flipping: + */ +typedef struct drm_i915_flip { + /* + * This is really talking about planes, and we could rename it + * except for the fact that some of the duplicated i915_drm.h files + * out there check for HAVE_I915_FLIP and so might pick up this + * version. + */ + int pipes; +} drm_i915_flip_t; + +/* Allow drivers to submit batchbuffers directly to hardware, relying + * on the security mechanisms provided by hardware. + */ +typedef struct drm_i915_batchbuffer { + int start; /* agp offset */ + int used; /* nr bytes in use */ + int DR1; /* hw flags for GFX_OP_DRAWRECT_INFO */ + int DR4; /* window origin for GFX_OP_DRAWRECT_INFO */ + int num_cliprects; /* mulitpass with multiple cliprects? */ + struct drm_clip_rect __user *cliprects; /* pointer to userspace cliprects */ +} drm_i915_batchbuffer_t; + +/* As above, but pass a pointer to userspace buffer which can be + * validated by the kernel prior to sending to hardware. + */ +typedef struct _drm_i915_cmdbuffer { + char __user *buf; /* pointer to userspace command buffer */ + int sz; /* nr bytes in buf */ + int DR1; /* hw flags for GFX_OP_DRAWRECT_INFO */ + int DR4; /* window origin for GFX_OP_DRAWRECT_INFO */ + int num_cliprects; /* mulitpass with multiple cliprects? */ + struct drm_clip_rect __user *cliprects; /* pointer to userspace cliprects */ +} drm_i915_cmdbuffer_t; + +/* Userspace can request & wait on irq's: + */ +typedef struct drm_i915_irq_emit { + int __user *irq_seq; +} drm_i915_irq_emit_t; + +typedef struct drm_i915_irq_wait { + int irq_seq; +} drm_i915_irq_wait_t; + +/* Ioctl to query kernel params: + */ +#define I915_PARAM_IRQ_ACTIVE 1 +#define I915_PARAM_ALLOW_BATCHBUFFER 2 +#define I915_PARAM_LAST_DISPATCH 3 +#define I915_PARAM_CHIPSET_ID 4 +#define I915_PARAM_HAS_GEM 5 +#define I915_PARAM_NUM_FENCES_AVAIL 6 +#define I915_PARAM_HAS_OVERLAY 7 +#define I915_PARAM_HAS_PAGEFLIPPING 8 +#define I915_PARAM_HAS_EXECBUF2 9 +#define I915_PARAM_HAS_BSD 10 +#define I915_PARAM_HAS_BLT 11 +#define I915_PARAM_HAS_RELAXED_FENCING 12 +#define I915_PARAM_HAS_COHERENT_RINGS 13 +#define I915_PARAM_HAS_EXEC_CONSTANTS 14 +#define I915_PARAM_HAS_RELAXED_DELTA 15 +#define I915_PARAM_HAS_GEN7_SOL_RESET 16 +#define I915_PARAM_HAS_LLC 17 + +typedef struct drm_i915_getparam { + int param; + int __user *value; +} drm_i915_getparam_t; + +/* Ioctl to set kernel params: + */ +#define I915_SETPARAM_USE_MI_BATCHBUFFER_START 1 +#define I915_SETPARAM_TEX_LRU_LOG_GRANULARITY 2 +#define I915_SETPARAM_ALLOW_BATCHBUFFER 3 +#define I915_SETPARAM_NUM_USED_FENCES 4 + +typedef struct drm_i915_setparam { + int param; + int value; +} drm_i915_setparam_t; + +/* A memory manager for regions of shared memory: + */ +#define I915_MEM_REGION_AGP 1 + +typedef struct drm_i915_mem_alloc { + int region; + int alignment; + int size; + int __user *region_offset; /* offset from start of fb or agp */ +} drm_i915_mem_alloc_t; + +typedef struct drm_i915_mem_free { + int region; + int region_offset; +} drm_i915_mem_free_t; + +typedef struct drm_i915_mem_init_heap { + int region; + int size; + int start; +} drm_i915_mem_init_heap_t; + +/* Allow memory manager to be torn down and re-initialized (eg on + * rotate): + */ +typedef struct drm_i915_mem_destroy_heap { + int region; +} drm_i915_mem_destroy_heap_t; + +/* Allow X server to configure which pipes to monitor for vblank signals + */ +#define DRM_I915_VBLANK_PIPE_A 1 +#define DRM_I915_VBLANK_PIPE_B 2 + +typedef struct drm_i915_vblank_pipe { + int pipe; +} drm_i915_vblank_pipe_t; + +/* Schedule buffer swap at given vertical blank: + */ +typedef struct drm_i915_vblank_swap { + drm_drawable_t drawable; + enum drm_vblank_seq_type seqtype; + unsigned int sequence; +} drm_i915_vblank_swap_t; + +#define I915_MMIO_READ 0 +#define I915_MMIO_WRITE 1 + +#define I915_MMIO_MAY_READ 0x1 +#define I915_MMIO_MAY_WRITE 0x2 + +#define MMIO_REGS_IA_PRIMATIVES_COUNT 0 +#define MMIO_REGS_IA_VERTICES_COUNT 1 +#define MMIO_REGS_VS_INVOCATION_COUNT 2 +#define MMIO_REGS_GS_PRIMITIVES_COUNT 3 +#define MMIO_REGS_GS_INVOCATION_COUNT 4 +#define MMIO_REGS_CL_PRIMITIVES_COUNT 5 +#define MMIO_REGS_CL_INVOCATION_COUNT 6 +#define MMIO_REGS_PS_INVOCATION_COUNT 7 +#define MMIO_REGS_PS_DEPTH_COUNT 8 + +typedef struct drm_i915_mmio_entry { + unsigned int flag; + unsigned int offset; + unsigned int size; +} drm_i915_mmio_entry_t; + +typedef struct drm_i915_mmio { + unsigned int read_write:1; + unsigned int reg:31; + void __user *data; +} drm_i915_mmio_t; + +typedef struct drm_i915_hws_addr { + uint64_t addr; +} drm_i915_hws_addr_t; + +/* + * Relocation header is 4 uint32_ts + * 0 - 32 bit reloc count + * 1 - 32-bit relocation type + * 2-3 - 64-bit user buffer handle ptr for another list of relocs. + */ +#define I915_RELOC_HEADER 4 + +/* + * type 0 relocation has 4-uint32_t stride + * 0 - offset into buffer + * 1 - delta to add in + * 2 - buffer handle + * 3 - reserved (for optimisations later). + */ +/* + * type 1 relocation has 4-uint32_t stride. + * Hangs off the first item in the op list. + * Performed after all valiations are done. + * Try to group relocs into the same relocatee together for + * performance reasons. + * 0 - offset into buffer + * 1 - delta to add in + * 2 - buffer index in op list. + * 3 - relocatee index in op list. + */ +#define I915_RELOC_TYPE_0 0 +#define I915_RELOC0_STRIDE 4 +#define I915_RELOC_TYPE_1 1 +#define I915_RELOC1_STRIDE 4 + + +struct drm_i915_op_arg { + uint64_t next; + uint64_t reloc_ptr; + int handled; + unsigned int pad64; + union { + struct drm_bo_op_req req; + struct drm_bo_arg_rep rep; + } d; + +}; + +struct drm_i915_execbuffer { + uint64_t ops_list; + uint32_t num_buffers; + struct drm_i915_batchbuffer batch; + drm_context_t context; /* for lockless use in the future */ + struct drm_fence_arg fence_arg; +}; + +struct drm_i915_gem_init { + /** + * Beginning offset in the GTT to be managed by the DRM memory + * manager. + */ + uint64_t gtt_start; + /** + * Ending offset in the GTT to be managed by the DRM memory + * manager. + */ + uint64_t gtt_end; +}; + +struct drm_i915_gem_create { + /** + * Requested size for the object. + * + * The (page-aligned) allocated size for the object will be returned. + */ + uint64_t size; + /** + * Returned handle for the object. + * + * Object handles are nonzero. + */ + uint32_t handle; + uint32_t pad; +}; + +struct drm_i915_gem_pread { + /** Handle for the object being read. */ + uint32_t handle; + uint32_t pad; + /** Offset into the object to read from */ + uint64_t offset; + /** Length of data to read */ + uint64_t size; + /** Pointer to write the data into. */ + uint64_t data_ptr; /* void *, but pointers are not 32/64 compatible */ +}; + +struct drm_i915_gem_pwrite { + /** Handle for the object being written to. */ + uint32_t handle; + uint32_t pad; + /** Offset into the object to write to */ + uint64_t offset; + /** Length of data to write */ + uint64_t size; + /** Pointer to read the data from. */ + uint64_t data_ptr; /* void *, but pointers are not 32/64 compatible */ +}; + +struct drm_i915_gem_mmap { + /** Handle for the object being mapped. */ + uint32_t handle; + uint32_t pad; + /** Offset in the object to map. */ + uint64_t offset; + /** + * Length of data to map. + * + * The value will be page-aligned. + */ + uint64_t size; + /** Returned pointer the data was mapped at */ + uint64_t addr_ptr; /* void *, but pointers are not 32/64 compatible */ +}; + +struct drm_i915_gem_mmap_gtt { + /** Handle for the object being mapped. */ + uint32_t handle; + uint32_t pad; + /** + * Fake offset to use for subsequent mmap call + * + * This is a fixed-size type for 32/64 compatibility. + */ + uint64_t offset; +}; + +struct drm_i915_gem_set_domain { + /** Handle for the object */ + uint32_t handle; + + /** New read domains */ + uint32_t read_domains; + + /** New write domain */ + uint32_t write_domain; +}; + +struct drm_i915_gem_sw_finish { + /** Handle for the object */ + uint32_t handle; +}; + +struct drm_i915_gem_relocation_entry { + /** + * Handle of the buffer being pointed to by this relocation entry. + * + * It's appealing to make this be an index into the mm_validate_entry + * list to refer to the buffer, but this allows the driver to create + * a relocation list for state buffers and not re-write it per + * exec using the buffer. + */ + uint32_t target_handle; + + /** + * Value to be added to the offset of the target buffer to make up + * the relocation entry. + */ + uint32_t delta; + + /** Offset in the buffer the relocation entry will be written into */ + uint64_t offset; + + /** + * Offset value of the target buffer that the relocation entry was last + * written as. + * + * If the buffer has the same offset as last time, we can skip syncing + * and writing the relocation. This value is written back out by + * the execbuffer ioctl when the relocation is written. + */ + uint64_t presumed_offset; + + /** + * Target memory domains read by this operation. + */ + uint32_t read_domains; + + /** + * Target memory domains written by this operation. + * + * Note that only one domain may be written by the whole + * execbuffer operation, so that where there are conflicts, + * the application will get -EINVAL back. + */ + uint32_t write_domain; +}; + +/** @{ + * Intel memory domains + * + * Most of these just align with the various caches in + * the system and are used to flush and invalidate as + * objects end up cached in different domains. + */ +/** CPU cache */ +#define I915_GEM_DOMAIN_CPU 0x00000001 +/** Render cache, used by 2D and 3D drawing */ +#define I915_GEM_DOMAIN_RENDER 0x00000002 +/** Sampler cache, used by texture engine */ +#define I915_GEM_DOMAIN_SAMPLER 0x00000004 +/** Command queue, used to load batch buffers */ +#define I915_GEM_DOMAIN_COMMAND 0x00000008 +/** Instruction cache, used by shader programs */ +#define I915_GEM_DOMAIN_INSTRUCTION 0x00000010 +/** Vertex address cache */ +#define I915_GEM_DOMAIN_VERTEX 0x00000020 +/** GTT domain - aperture and scanout */ +#define I915_GEM_DOMAIN_GTT 0x00000040 +/** @} */ + +struct drm_i915_gem_exec_object { + /** + * User's handle for a buffer to be bound into the GTT for this + * operation. + */ + uint32_t handle; + + /** Number of relocations to be performed on this buffer */ + uint32_t relocation_count; + /** + * Pointer to array of struct drm_i915_gem_relocation_entry containing + * the relocations to be performed in this buffer. + */ + uint64_t relocs_ptr; + + /** Required alignment in graphics aperture */ + uint64_t alignment; + + /** + * Returned value of the updated offset of the object, for future + * presumed_offset writes. + */ + uint64_t offset; +}; + +struct drm_i915_gem_execbuffer { + /** + * List of buffers to be validated with their relocations to be + * performend on them. + * + * This is a pointer to an array of struct drm_i915_gem_validate_entry. + * + * These buffers must be listed in an order such that all relocations + * a buffer is performing refer to buffers that have already appeared + * in the validate list. + */ + uint64_t buffers_ptr; + uint32_t buffer_count; + + /** Offset in the batchbuffer to start execution from. */ + uint32_t batch_start_offset; + /** Bytes used in batchbuffer from batch_start_offset */ + uint32_t batch_len; + uint32_t DR1; + uint32_t DR4; + uint32_t num_cliprects; + uint64_t cliprects_ptr; /* struct drm_clip_rect *cliprects */ +}; + +struct drm_i915_gem_exec_object2 { + /** + * User's handle for a buffer to be bound into the GTT for this + * operation. + */ + uint32_t handle; + + /** Number of relocations to be performed on this buffer */ + uint32_t relocation_count; + /** + * Pointer to array of struct drm_i915_gem_relocation_entry containing + * the relocations to be performed in this buffer. + */ + uint64_t relocs_ptr; + + /** Required alignment in graphics aperture */ + uint64_t alignment; + + /** + * Returned value of the updated offset of the object, for future + * presumed_offset writes. + */ + uint64_t offset; + +#define EXEC_OBJECT_NEEDS_FENCE (1<<0) + uint64_t flags; + uint64_t rsvd1; + uint64_t rsvd2; +}; + +struct drm_i915_gem_execbuffer2 { + /** + * List of gem_exec_object2 structs + */ + uint64_t buffers_ptr; + uint32_t buffer_count; + + /** Offset in the batchbuffer to start execution from. */ + uint32_t batch_start_offset; + /** Bytes used in batchbuffer from batch_start_offset */ + uint32_t batch_len; + uint32_t DR1; + uint32_t DR4; + uint32_t num_cliprects; + /** This is a struct drm_clip_rect *cliprects */ + uint64_t cliprects_ptr; +#define I915_EXEC_RING_MASK (7<<0) +#define I915_EXEC_DEFAULT (0<<0) +#define I915_EXEC_RENDER (1<<0) +#define I915_EXEC_BSD (2<<0) +#define I915_EXEC_BLT (3<<0) + +/* Used for switching the constants addressing mode on gen4+ RENDER ring. + * Gen6+ only supports relative addressing to dynamic state (default) and + * absolute addressing. + * + * These flags are ignored for the BSD and BLT rings. + */ +#define I915_EXEC_CONSTANTS_MASK (3<<6) +#define I915_EXEC_CONSTANTS_REL_GENERAL (0<<6) /* default */ +#define I915_EXEC_CONSTANTS_ABSOLUTE (1<<6) +#define I915_EXEC_CONSTANTS_REL_SURFACE (2<<6) /* gen4/5 only */ + uint64_t flags; + uint64_t rsvd1; + uint64_t rsvd2; +}; + +/** Resets the SO write offset registers for transform feedback on gen7. */ +#define I915_EXEC_GEN7_SOL_RESET (1<<8) + +struct drm_i915_gem_pin { + /** Handle of the buffer to be pinned. */ + uint32_t handle; + uint32_t pad; + + /** alignment required within the aperture */ + uint64_t alignment; + + /** Returned GTT offset of the buffer. */ + uint64_t offset; +}; + +struct drm_i915_gem_unpin { + /** Handle of the buffer to be unpinned. */ + uint32_t handle; + uint32_t pad; +}; + +struct drm_i915_gem_busy { + /** Handle of the buffer to check for busy */ + uint32_t handle; + + /** Return busy status (1 if busy, 0 if idle) */ + uint32_t busy; +}; + +#define I915_TILING_NONE 0 +#define I915_TILING_X 1 +#define I915_TILING_Y 2 + +#define I915_BIT_6_SWIZZLE_NONE 0 +#define I915_BIT_6_SWIZZLE_9 1 +#define I915_BIT_6_SWIZZLE_9_10 2 +#define I915_BIT_6_SWIZZLE_9_11 3 +#define I915_BIT_6_SWIZZLE_9_10_11 4 +/* Not seen by userland */ +#define I915_BIT_6_SWIZZLE_UNKNOWN 5 +/* Seen by userland. */ +#define I915_BIT_6_SWIZZLE_9_17 6 +#define I915_BIT_6_SWIZZLE_9_10_17 7 + +struct drm_i915_gem_set_tiling { + /** Handle of the buffer to have its tiling state updated */ + uint32_t handle; + + /** + * Tiling mode for the object (I915_TILING_NONE, I915_TILING_X, + * I915_TILING_Y). + * + * This value is to be set on request, and will be updated by the + * kernel on successful return with the actual chosen tiling layout. + * + * The tiling mode may be demoted to I915_TILING_NONE when the system + * has bit 6 swizzling that can't be managed correctly by GEM. + * + * Buffer contents become undefined when changing tiling_mode. + */ + uint32_t tiling_mode; + + /** + * Stride in bytes for the object when in I915_TILING_X or + * I915_TILING_Y. + */ + uint32_t stride; + + /** + * Returned address bit 6 swizzling required for CPU access through + * mmap mapping. + */ + uint32_t swizzle_mode; +}; + +struct drm_i915_gem_get_tiling { + /** Handle of the buffer to get tiling state for. */ + uint32_t handle; + + /** + * Current tiling mode for the object (I915_TILING_NONE, I915_TILING_X, + * I915_TILING_Y). + */ + uint32_t tiling_mode; + + /** + * Returned address bit 6 swizzling required for CPU access through + * mmap mapping. + */ + uint32_t swizzle_mode; +}; + +struct drm_i915_gem_get_aperture { + /** Total size of the aperture used by i915_gem_execbuffer, in bytes */ + uint64_t aper_size; + + /** + * Available space in the aperture used by i915_gem_execbuffer, in + * bytes + */ + uint64_t aper_available_size; +}; + +struct drm_i915_get_pipe_from_crtc_id { + /** ID of CRTC being requested **/ + uint32_t crtc_id; + + /** pipe of requested CRTC **/ + uint32_t pipe; +}; + +#define I915_MADV_WILLNEED 0 +#define I915_MADV_DONTNEED 1 +#define I915_MADV_PURGED_INTERNAL 2 /* internal state */ + +struct drm_i915_gem_madvise { + /** Handle of the buffer to change the backing store advice */ + uint32_t handle; + + /* Advice: either the buffer will be needed again in the near future, + * or wont be and could be discarded under memory pressure. + */ + uint32_t madv; + + /** Whether the backing store still exists. */ + uint32_t retained; +}; + +#define I915_OVERLAY_TYPE_MASK 0xff +#define I915_OVERLAY_YUV_PLANAR 0x01 +#define I915_OVERLAY_YUV_PACKED 0x02 +#define I915_OVERLAY_RGB 0x03 + +#define I915_OVERLAY_DEPTH_MASK 0xff00 +#define I915_OVERLAY_RGB24 0x1000 +#define I915_OVERLAY_RGB16 0x2000 +#define I915_OVERLAY_RGB15 0x3000 +#define I915_OVERLAY_YUV422 0x0100 +#define I915_OVERLAY_YUV411 0x0200 +#define I915_OVERLAY_YUV420 0x0300 +#define I915_OVERLAY_YUV410 0x0400 + +#define I915_OVERLAY_SWAP_MASK 0xff0000 +#define I915_OVERLAY_NO_SWAP 0x000000 +#define I915_OVERLAY_UV_SWAP 0x010000 +#define I915_OVERLAY_Y_SWAP 0x020000 +#define I915_OVERLAY_Y_AND_UV_SWAP 0x030000 + +#define I915_OVERLAY_FLAGS_MASK 0xff000000 +#define I915_OVERLAY_ENABLE 0x01000000 + +struct drm_intel_overlay_put_image { + /* various flags and src format description */ + uint32_t flags; + /* source picture description */ + uint32_t bo_handle; + /* stride values and offsets are in bytes, buffer relative */ + uint16_t stride_Y; /* stride for packed formats */ + uint16_t stride_UV; + uint32_t offset_Y; /* offset for packet formats */ + uint32_t offset_U; + uint32_t offset_V; + /* in pixels */ + uint16_t src_width; + uint16_t src_height; + /* to compensate the scaling factors for partially covered surfaces */ + uint16_t src_scan_width; + uint16_t src_scan_height; + /* output crtc description */ + uint32_t crtc_id; + uint16_t dst_x; + uint16_t dst_y; + uint16_t dst_width; + uint16_t dst_height; +}; + +/* flags */ +#define I915_OVERLAY_UPDATE_ATTRS (1<<0) +#define I915_OVERLAY_UPDATE_GAMMA (1<<1) +struct drm_intel_overlay_attrs { + uint32_t flags; + uint32_t color_key; + int32_t brightness; + uint32_t contrast; + uint32_t saturation; + uint32_t gamma0; + uint32_t gamma1; + uint32_t gamma2; + uint32_t gamma3; + uint32_t gamma4; + uint32_t gamma5; +}; + +/* + * Intel sprite handling + * + * Color keying works with a min/mask/max tuple. Both source and destination + * color keying is allowed. + * + * Source keying: + * Sprite pixels within the min & max values, masked against the color channels + * specified in the mask field, will be transparent. All other pixels will + * be displayed on top of the primary plane. For RGB surfaces, only the min + * and mask fields will be used; ranged compares are not allowed. + * + * Destination keying: + * Primary plane pixels that match the min value, masked against the color + * channels specified in the mask field, will be replaced by corresponding + * pixels from the sprite plane. + * + * Note that source & destination keying are exclusive; only one can be + * active on a given plane. + */ + +#define I915_SET_COLORKEY_NONE (1<<0) /* disable color key matching */ +#define I915_SET_COLORKEY_DESTINATION (1<<1) +#define I915_SET_COLORKEY_SOURCE (1<<2) +struct drm_intel_sprite_colorkey { + uint32_t plane_id; + uint32_t min_value; + uint32_t channel_mask; + uint32_t max_value; + uint32_t flags; +}; + +#endif /* _I915_DRM_H_ */ diff --git a/sys/dev/drm2/i915/i915_drv.c b/sys/dev/drm2/i915/i915_drv.c new file mode 100644 index 00000000000..79ab6d55eca --- /dev/null +++ b/sys/dev/drm2/i915/i915_drv.c @@ -0,0 +1,821 @@ +/* i915_drv.c -- Intel i915 driver -*- linux-c -*- + * Created: Wed Feb 14 17:10:04 2001 by gareth@valinux.com + */ +/*- + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Gareth Hughes + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +/* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */ +static drm_pci_id_list_t i915_pciidlist[] = { + i915_PCI_IDS +}; + +static const struct intel_device_info intel_i830_info = { + .gen = 2, .is_mobile = 1, .cursor_needs_physical = 1, + .has_overlay = 1, .overlay_needs_physical = 1, +}; + +static const struct intel_device_info intel_845g_info = { + .gen = 2, + .has_overlay = 1, .overlay_needs_physical = 1, +}; + +static const struct intel_device_info intel_i85x_info = { + .gen = 2, .is_i85x = 1, .is_mobile = 1, + .cursor_needs_physical = 1, + .has_overlay = 1, .overlay_needs_physical = 1, +}; + +static const struct intel_device_info intel_i865g_info = { + .gen = 2, + .has_overlay = 1, .overlay_needs_physical = 1, +}; + +static const struct intel_device_info intel_i915g_info = { + .gen = 3, .is_i915g = 1, .cursor_needs_physical = 1, + .has_overlay = 1, .overlay_needs_physical = 1, +}; +static const struct intel_device_info intel_i915gm_info = { + .gen = 3, .is_mobile = 1, + .cursor_needs_physical = 1, + .has_overlay = 1, .overlay_needs_physical = 1, + .supports_tv = 1, +}; +static const struct intel_device_info intel_i945g_info = { + .gen = 3, .has_hotplug = 1, .cursor_needs_physical = 1, + .has_overlay = 1, .overlay_needs_physical = 1, +}; +static const struct intel_device_info intel_i945gm_info = { + .gen = 3, .is_i945gm = 1, .is_mobile = 1, + .has_hotplug = 1, .cursor_needs_physical = 1, + .has_overlay = 1, .overlay_needs_physical = 1, + .supports_tv = 1, +}; + +static const struct intel_device_info intel_i965g_info = { + .gen = 4, .is_broadwater = 1, + .has_hotplug = 1, + .has_overlay = 1, +}; + +static const struct intel_device_info intel_i965gm_info = { + .gen = 4, .is_crestline = 1, + .is_mobile = 1, .has_fbc = 1, .has_hotplug = 1, + .has_overlay = 1, + .supports_tv = 1, +}; + +static const struct intel_device_info intel_g33_info = { + .gen = 3, .is_g33 = 1, + .need_gfx_hws = 1, .has_hotplug = 1, + .has_overlay = 1, +}; + +static const struct intel_device_info intel_g45_info = { + .gen = 4, .is_g4x = 1, .need_gfx_hws = 1, + .has_pipe_cxsr = 1, .has_hotplug = 1, + .has_bsd_ring = 1, +}; + +static const struct intel_device_info intel_gm45_info = { + .gen = 4, .is_g4x = 1, + .is_mobile = 1, .need_gfx_hws = 1, .has_fbc = 1, + .has_pipe_cxsr = 1, .has_hotplug = 1, + .supports_tv = 1, + .has_bsd_ring = 1, +}; + +static const struct intel_device_info intel_pineview_info = { + .gen = 3, .is_g33 = 1, .is_pineview = 1, .is_mobile = 1, + .need_gfx_hws = 1, .has_hotplug = 1, + .has_overlay = 1, +}; + +static const struct intel_device_info intel_ironlake_d_info = { + .gen = 5, + .need_gfx_hws = 1, .has_hotplug = 1, + .has_bsd_ring = 1, +}; + +static const struct intel_device_info intel_ironlake_m_info = { + .gen = 5, .is_mobile = 1, + .need_gfx_hws = 1, .has_hotplug = 1, + .has_fbc = 0, /* disabled due to buggy hardware */ + .has_bsd_ring = 1, +}; + +static const struct intel_device_info intel_sandybridge_d_info = { + .gen = 6, + .need_gfx_hws = 1, .has_hotplug = 1, + .has_bsd_ring = 1, + .has_blt_ring = 1, + .has_llc = 1, +}; + +static const struct intel_device_info intel_sandybridge_m_info = { + .gen = 6, .is_mobile = 1, + .need_gfx_hws = 1, .has_hotplug = 1, + .has_fbc = 1, + .has_bsd_ring = 1, + .has_blt_ring = 1, + .has_llc = 1, +}; + +static const struct intel_device_info intel_ivybridge_d_info = { + .is_ivybridge = 1, .gen = 7, + .need_gfx_hws = 1, .has_hotplug = 1, + .has_bsd_ring = 1, + .has_blt_ring = 1, + .has_llc = 1, +}; + +static const struct intel_device_info intel_ivybridge_m_info = { + .is_ivybridge = 1, .gen = 7, .is_mobile = 1, + .need_gfx_hws = 1, .has_hotplug = 1, + .has_fbc = 0, /* FBC is not enabled on Ivybridge mobile yet */ + .has_bsd_ring = 1, + .has_blt_ring = 1, + .has_llc = 1, +}; + +#define INTEL_VGA_DEVICE(id, info_) { \ + .device = id, \ + .info = info_, \ +} + +static const struct intel_gfx_device_id { + int device; + const struct intel_device_info *info; +} pciidlist[] = { /* aka */ + INTEL_VGA_DEVICE(0x3577, &intel_i830_info), + INTEL_VGA_DEVICE(0x2562, &intel_845g_info), + INTEL_VGA_DEVICE(0x3582, &intel_i85x_info), + INTEL_VGA_DEVICE(0x358e, &intel_i85x_info), + INTEL_VGA_DEVICE(0x2572, &intel_i865g_info), + INTEL_VGA_DEVICE(0x2582, &intel_i915g_info), + INTEL_VGA_DEVICE(0x258a, &intel_i915g_info), + INTEL_VGA_DEVICE(0x2592, &intel_i915gm_info), + INTEL_VGA_DEVICE(0x2772, &intel_i945g_info), + INTEL_VGA_DEVICE(0x27a2, &intel_i945gm_info), + INTEL_VGA_DEVICE(0x27ae, &intel_i945gm_info), + INTEL_VGA_DEVICE(0x2972, &intel_i965g_info), + INTEL_VGA_DEVICE(0x2982, &intel_i965g_info), + INTEL_VGA_DEVICE(0x2992, &intel_i965g_info), + INTEL_VGA_DEVICE(0x29a2, &intel_i965g_info), + INTEL_VGA_DEVICE(0x29b2, &intel_g33_info), + INTEL_VGA_DEVICE(0x29c2, &intel_g33_info), + INTEL_VGA_DEVICE(0x29d2, &intel_g33_info), + INTEL_VGA_DEVICE(0x2a02, &intel_i965gm_info), + INTEL_VGA_DEVICE(0x2a12, &intel_i965gm_info), + INTEL_VGA_DEVICE(0x2a42, &intel_gm45_info), + INTEL_VGA_DEVICE(0x2e02, &intel_g45_info), + INTEL_VGA_DEVICE(0x2e12, &intel_g45_info), + INTEL_VGA_DEVICE(0x2e22, &intel_g45_info), + INTEL_VGA_DEVICE(0x2e32, &intel_g45_info), + INTEL_VGA_DEVICE(0x2e42, &intel_g45_info), + INTEL_VGA_DEVICE(0x2e92, &intel_g45_info), + INTEL_VGA_DEVICE(0xa001, &intel_pineview_info), + INTEL_VGA_DEVICE(0xa011, &intel_pineview_info), + INTEL_VGA_DEVICE(0x0042, &intel_ironlake_d_info), + INTEL_VGA_DEVICE(0x0046, &intel_ironlake_m_info), + INTEL_VGA_DEVICE(0x0102, &intel_sandybridge_d_info), + INTEL_VGA_DEVICE(0x0112, &intel_sandybridge_d_info), + INTEL_VGA_DEVICE(0x0122, &intel_sandybridge_d_info), + INTEL_VGA_DEVICE(0x0106, &intel_sandybridge_m_info), + INTEL_VGA_DEVICE(0x0116, &intel_sandybridge_m_info), + INTEL_VGA_DEVICE(0x0126, &intel_sandybridge_m_info), + INTEL_VGA_DEVICE(0x010A, &intel_sandybridge_d_info), + INTEL_VGA_DEVICE(0x0156, &intel_ivybridge_m_info), /* GT1 mobile */ + INTEL_VGA_DEVICE(0x0166, &intel_ivybridge_m_info), /* GT2 mobile */ + INTEL_VGA_DEVICE(0x0152, &intel_ivybridge_d_info), /* GT1 desktop */ + INTEL_VGA_DEVICE(0x0162, &intel_ivybridge_d_info), /* GT2 desktop */ + INTEL_VGA_DEVICE(0x015a, &intel_ivybridge_d_info), /* GT1 server */ + INTEL_VGA_DEVICE(0x016a, &intel_ivybridge_d_info), /* GT2 server */ + {0, 0} +}; + +static int i915_drm_freeze(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv; + int error; + + dev_priv = dev->dev_private; + drm_kms_helper_poll_disable(dev); + +#if 0 + pci_save_state(dev->pdev); +#endif + + DRM_LOCK(dev); + /* If KMS is active, we do the leavevt stuff here */ + if (drm_core_check_feature(dev, DRIVER_MODESET)) { + error = -i915_gem_idle(dev); + if (error) { + DRM_UNLOCK(dev); + device_printf(dev->device, + "GEM idle failed, resume might fail\n"); + return (error); + } + drm_irq_uninstall(dev); + } + + i915_save_state(dev); + + intel_opregion_fini(dev); + + /* Modeset on resume, not lid events */ + dev_priv->modeset_on_lid = 0; + DRM_UNLOCK(dev); + + return 0; +} + +static int +i915_suspend(device_t kdev) +{ + struct drm_device *dev; + int error; + + dev = device_get_softc(kdev); + if (dev == NULL || dev->dev_private == NULL) { + DRM_ERROR("DRM not initialized, aborting suspend.\n"); + return -ENODEV; + } + + DRM_DEBUG_KMS("starting suspend\n"); + error = i915_drm_freeze(dev); + if (error) + return (error); + + error = bus_generic_suspend(kdev); + DRM_DEBUG_KMS("finished suspend %d\n", error); + return (error); +} + +static int i915_drm_thaw(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int error = 0; + + DRM_LOCK(dev); + if (drm_core_check_feature(dev, DRIVER_MODESET)) { + i915_gem_restore_gtt_mappings(dev); + } + + i915_restore_state(dev); + intel_opregion_setup(dev); + + /* KMS EnterVT equivalent */ + if (drm_core_check_feature(dev, DRIVER_MODESET)) { + dev_priv->mm.suspended = 0; + + error = i915_gem_init_hw(dev); + + if (HAS_PCH_SPLIT(dev)) + ironlake_init_pch_refclk(dev); + + DRM_UNLOCK(dev); + sx_xlock(&dev->mode_config.mutex); + drm_mode_config_reset(dev); + sx_xunlock(&dev->mode_config.mutex); + drm_irq_install(dev); + + sx_xlock(&dev->mode_config.mutex); + /* Resume the modeset for every activated CRTC */ + drm_helper_resume_force_mode(dev); + sx_xunlock(&dev->mode_config.mutex); + + if (IS_IRONLAKE_M(dev)) + ironlake_enable_rc6(dev); + DRM_LOCK(dev); + } + + intel_opregion_init(dev); + + dev_priv->modeset_on_lid = 0; + + DRM_UNLOCK(dev); + + return error; +} + +static int +i915_resume(device_t kdev) +{ + struct drm_device *dev; + int ret; + + dev = device_get_softc(kdev); + DRM_DEBUG_KMS("starting resume\n"); +#if 0 + if (pci_enable_device(dev->pdev)) + return -EIO; + + pci_set_master(dev->pdev); +#endif + + ret = -i915_drm_thaw(dev); + if (ret != 0) + return (ret); + + drm_kms_helper_poll_enable(dev); + ret = bus_generic_resume(kdev); + DRM_DEBUG_KMS("finished resume %d\n", ret); + return (ret); +} + +static int +i915_probe(device_t kdev) +{ + + return drm_probe(kdev, i915_pciidlist); +} + +int i915_modeset; + +static int +i915_attach(device_t kdev) +{ + struct drm_device *dev; + + dev = device_get_softc(kdev); + if (i915_modeset == 1) + i915_driver_info.driver_features |= DRIVER_MODESET; + dev->driver = &i915_driver_info; + return (drm_attach(kdev, i915_pciidlist)); +} + +const struct intel_device_info * +i915_get_device_id(int device) +{ + const struct intel_gfx_device_id *did; + + for (did = &pciidlist[0]; did->device != 0; did++) { + if (did->device != device) + continue; + return (did->info); + } + return (NULL); +} + +static device_method_t i915_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, i915_probe), + DEVMETHOD(device_attach, i915_attach), + DEVMETHOD(device_suspend, i915_suspend), + DEVMETHOD(device_resume, i915_resume), + DEVMETHOD(device_detach, drm_detach), + DEVMETHOD_END +}; + +static driver_t i915_driver = { + "drmn", + i915_methods, + sizeof(struct drm_device) +}; + +extern devclass_t drm_devclass; +DRIVER_MODULE_ORDERED(i915kms, vgapci, i915_driver, drm_devclass, 0, 0, + SI_ORDER_ANY); +MODULE_DEPEND(i915kms, drmn, 1, 1, 1); +MODULE_DEPEND(i915kms, agp, 1, 1, 1); +MODULE_DEPEND(i915kms, iicbus, 1, 1, 1); +MODULE_DEPEND(i915kms, iic, 1, 1, 1); +MODULE_DEPEND(i915kms, iicbb, 1, 1, 1); + +int intel_iommu_enabled = 0; +TUNABLE_INT("drm.i915.intel_iommu_enabled", &intel_iommu_enabled); + +int i915_semaphores = -1; +TUNABLE_INT("drm.i915.semaphores", &i915_semaphores); +static int i915_try_reset = 1; +TUNABLE_INT("drm.i915.try_reset", &i915_try_reset); +unsigned int i915_lvds_downclock = 0; +TUNABLE_INT("drm.i915.lvds_downclock", &i915_lvds_downclock); +int i915_vbt_sdvo_panel_type = -1; +TUNABLE_INT("drm.i915.vbt_sdvo_panel_type", &i915_vbt_sdvo_panel_type); +unsigned int i915_powersave = 1; +TUNABLE_INT("drm.i915.powersave", &i915_powersave); +int i915_enable_fbc = 0; +TUNABLE_INT("drm.i915.enable_fbc", &i915_enable_fbc); +int i915_enable_rc6 = 0; +TUNABLE_INT("drm.i915.enable_rc6", &i915_enable_rc6); +int i915_panel_use_ssc = -1; +TUNABLE_INT("drm.i915.panel_use_ssc", &i915_panel_use_ssc); +int i915_panel_ignore_lid = 0; +TUNABLE_INT("drm.i915.panel_ignore_lid", &i915_panel_ignore_lid); +int i915_modeset = 1; +TUNABLE_INT("drm.i915.modeset", &i915_modeset); +int i915_enable_ppgtt = -1; +TUNABLE_INT("drm.i915.enable_ppgtt", &i915_enable_ppgtt); +int i915_enable_hangcheck = 1; +TUNABLE_INT("drm.i915.enable_hangcheck", &i915_enable_hangcheck); + +#define PCI_VENDOR_INTEL 0x8086 +#define INTEL_PCH_DEVICE_ID_MASK 0xff00 +#define INTEL_PCH_IBX_DEVICE_ID_TYPE 0x3b00 +#define INTEL_PCH_CPT_DEVICE_ID_TYPE 0x1c00 +#define INTEL_PCH_PPT_DEVICE_ID_TYPE 0x1e00 + +void +intel_detect_pch(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv; + device_t pch; + uint32_t id; + + dev_priv = dev->dev_private; + pch = pci_find_class(PCIC_BRIDGE, PCIS_BRIDGE_ISA); + if (pch != NULL && pci_get_vendor(pch) == PCI_VENDOR_INTEL) { + id = pci_get_device(pch) & INTEL_PCH_DEVICE_ID_MASK; + if (id == INTEL_PCH_IBX_DEVICE_ID_TYPE) { + dev_priv->pch_type = PCH_IBX; + DRM_DEBUG_KMS("Found Ibex Peak PCH\n"); + } else if (id == INTEL_PCH_CPT_DEVICE_ID_TYPE) { + dev_priv->pch_type = PCH_CPT; + DRM_DEBUG_KMS("Found CougarPoint PCH\n"); + } else if (id == INTEL_PCH_PPT_DEVICE_ID_TYPE) { + /* PantherPoint is CPT compatible */ + dev_priv->pch_type = PCH_CPT; + DRM_DEBUG_KMS("Found PatherPoint PCH\n"); + } else + DRM_DEBUG_KMS("No PCH detected\n"); + } else + DRM_DEBUG_KMS("No Intel PCI-ISA bridge found\n"); +} + +void +__gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) +{ + int count; + + count = 0; + while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1)) + DELAY(10000); + + I915_WRITE_NOTRACE(FORCEWAKE, 1); + POSTING_READ(FORCEWAKE); + + count = 0; + while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1) == 0) + DELAY(10000); +} + +void +__gen6_gt_force_wake_mt_get(struct drm_i915_private *dev_priv) +{ + int count; + + count = 0; + while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_MT_ACK) & 1)) + DELAY(10000); + + I915_WRITE_NOTRACE(FORCEWAKE_MT, (1<<16) | 1); + POSTING_READ(FORCEWAKE_MT); + + count = 0; + while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_MT_ACK) & 1) == 0) + DELAY(10000); +} + +void +gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) +{ + + mtx_lock(&dev_priv->gt_lock); + if (dev_priv->forcewake_count++ == 0) + dev_priv->display.force_wake_get(dev_priv); + mtx_unlock(&dev_priv->gt_lock); +} + +static void +gen6_gt_check_fifodbg(struct drm_i915_private *dev_priv) +{ + u32 gtfifodbg; + + gtfifodbg = I915_READ_NOTRACE(GTFIFODBG); + if ((gtfifodbg & GT_FIFO_CPU_ERROR_MASK) != 0) { + printf("MMIO read or write has been dropped %x\n", gtfifodbg); + I915_WRITE_NOTRACE(GTFIFODBG, GT_FIFO_CPU_ERROR_MASK); + } +} + +void +__gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) +{ + + I915_WRITE_NOTRACE(FORCEWAKE, 0); + /* The below doubles as a POSTING_READ */ + gen6_gt_check_fifodbg(dev_priv); +} + +void +__gen6_gt_force_wake_mt_put(struct drm_i915_private *dev_priv) +{ + + I915_WRITE_NOTRACE(FORCEWAKE_MT, (1<<16) | 0); + /* The below doubles as a POSTING_READ */ + gen6_gt_check_fifodbg(dev_priv); +} + +void +gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) +{ + + mtx_lock(&dev_priv->gt_lock); + if (--dev_priv->forcewake_count == 0) + dev_priv->display.force_wake_put(dev_priv); + mtx_unlock(&dev_priv->gt_lock); +} + +int +__gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) +{ + int ret = 0; + + if (dev_priv->gt_fifo_count < GT_FIFO_NUM_RESERVED_ENTRIES) { + int loop = 500; + u32 fifo = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES); + while (fifo <= GT_FIFO_NUM_RESERVED_ENTRIES && loop--) { + DELAY(10000); + fifo = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES); + } + if (loop < 0 && fifo <= GT_FIFO_NUM_RESERVED_ENTRIES) { + printf("%s loop\n", __func__); + ++ret; + } + dev_priv->gt_fifo_count = fifo; + } + dev_priv->gt_fifo_count--; + + return (ret); +} + +static int +i8xx_do_reset(struct drm_device *dev, u8 flags) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int onems; + + if (IS_I85X(dev)) + return -ENODEV; + + onems = hz / 1000; + if (onems == 0) + onems = 1; + + I915_WRITE(D_STATE, I915_READ(D_STATE) | DSTATE_GFX_RESET_I830); + POSTING_READ(D_STATE); + + if (IS_I830(dev) || IS_845G(dev)) { + I915_WRITE(DEBUG_RESET_I830, + DEBUG_RESET_DISPLAY | + DEBUG_RESET_RENDER | + DEBUG_RESET_FULL); + POSTING_READ(DEBUG_RESET_I830); + pause("i8xxrst1", onems); + + I915_WRITE(DEBUG_RESET_I830, 0); + POSTING_READ(DEBUG_RESET_I830); + } + + pause("i8xxrst2", onems); + + I915_WRITE(D_STATE, I915_READ(D_STATE) & ~DSTATE_GFX_RESET_I830); + POSTING_READ(D_STATE); + + return 0; +} + +static int +i965_reset_complete(struct drm_device *dev) +{ + u8 gdrst; + + gdrst = pci_read_config(dev->device, I965_GDRST, 1); + return (gdrst & 0x1); +} + +static int +i965_do_reset(struct drm_device *dev, u8 flags) +{ + u8 gdrst; + + /* + * Set the domains we want to reset (GRDOM/bits 2 and 3) as + * well as the reset bit (GR/bit 0). Setting the GR bit + * triggers the reset; when done, the hardware will clear it. + */ + gdrst = pci_read_config(dev->device, I965_GDRST, 1); + pci_write_config(dev->device, I965_GDRST, gdrst | flags | 0x1, 1); + + return (_intel_wait_for(dev, i965_reset_complete(dev), 500, 1, + "915rst")); +} + +static int +ironlake_do_reset(struct drm_device *dev, u8 flags) +{ + struct drm_i915_private *dev_priv; + u32 gdrst; + + dev_priv = dev->dev_private; + gdrst = I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR); + I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR, gdrst | flags | 0x1); + return (_intel_wait_for(dev, + (I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR) & 0x1) != 0, + 500, 1, "915rst")); +} + +static int +gen6_do_reset(struct drm_device *dev, u8 flags) +{ + struct drm_i915_private *dev_priv; + int ret; + + dev_priv = dev->dev_private; + + /* Hold gt_lock across reset to prevent any register access + * with forcewake not set correctly + */ + mtx_lock(&dev_priv->gt_lock); + + /* Reset the chip */ + + /* GEN6_GDRST is not in the gt power well, no need to check + * for fifo space for the write or forcewake the chip for + * the read + */ + I915_WRITE_NOTRACE(GEN6_GDRST, GEN6_GRDOM_FULL); + + /* Spin waiting for the device to ack the reset request */ + ret = _intel_wait_for(dev, + (I915_READ(GEN6_GDRST) & GEN6_GRDOM_FULL) == 0, + 500, 1, "915rst"); + + /* If reset with a user forcewake, try to restore, otherwise turn it off */ + if (dev_priv->forcewake_count) + dev_priv->display.force_wake_get(dev_priv); + else + dev_priv->display.force_wake_put(dev_priv); + + /* Restore fifo count */ + dev_priv->gt_fifo_count = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES); + + mtx_unlock(&dev_priv->gt_lock); + return (ret); +} + +int +i915_reset(struct drm_device *dev, u8 flags) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + /* + * We really should only reset the display subsystem if we actually + * need to + */ + bool need_display = true; + int ret; + + if (!i915_try_reset) + return (0); + + if (!sx_try_xlock(&dev->dev_struct_lock)) + return (-EBUSY); + + i915_gem_reset(dev); + + ret = -ENODEV; + if (time_second - dev_priv->last_gpu_reset < 5) { + DRM_ERROR("GPU hanging too fast, declaring wedged!\n"); + } else { + switch (INTEL_INFO(dev)->gen) { + case 7: + case 6: + ret = gen6_do_reset(dev, flags); + break; + case 5: + ret = ironlake_do_reset(dev, flags); + break; + case 4: + ret = i965_do_reset(dev, flags); + break; + case 2: + ret = i8xx_do_reset(dev, flags); + break; + } + } + dev_priv->last_gpu_reset = time_second; + if (ret) { + DRM_ERROR("Failed to reset chip.\n"); + DRM_UNLOCK(dev); + return (ret); + } + + if (drm_core_check_feature(dev, DRIVER_MODESET) || + !dev_priv->mm.suspended) { + dev_priv->mm.suspended = 0; + + i915_gem_init_swizzling(dev); + + dev_priv->rings[RCS].init(&dev_priv->rings[RCS]); + if (HAS_BSD(dev)) + dev_priv->rings[VCS].init(&dev_priv->rings[VCS]); + if (HAS_BLT(dev)) + dev_priv->rings[BCS].init(&dev_priv->rings[BCS]); + + i915_gem_init_ppgtt(dev); + + drm_irq_uninstall(dev); + drm_mode_config_reset(dev); + DRM_UNLOCK(dev); + drm_irq_install(dev); + DRM_LOCK(dev); + } + DRM_UNLOCK(dev); + + if (need_display) { + sx_xlock(&dev->mode_config.mutex); + drm_helper_resume_force_mode(dev); + sx_xunlock(&dev->mode_config.mutex); + } + + return (0); +} + +#define __i915_read(x, y) \ +u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ + u##x val = 0; \ + if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ + mtx_lock(&dev_priv->gt_lock); \ + if (dev_priv->forcewake_count == 0) \ + dev_priv->display.force_wake_get(dev_priv); \ + val = DRM_READ##y(dev_priv->mmio_map, reg); \ + if (dev_priv->forcewake_count == 0) \ + dev_priv->display.force_wake_put(dev_priv); \ + mtx_unlock(&dev_priv->gt_lock); \ + } else { \ + val = DRM_READ##y(dev_priv->mmio_map, reg); \ + } \ + trace_i915_reg_rw(false, reg, val, sizeof(val)); \ + return val; \ +} + +__i915_read(8, 8) +__i915_read(16, 16) +__i915_read(32, 32) +__i915_read(64, 64) +#undef __i915_read + +#define __i915_write(x, y) \ +void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \ + u32 __fifo_ret = 0; \ + trace_i915_reg_rw(true, reg, val, sizeof(val)); \ + if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ + __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ + } \ + DRM_WRITE##y(dev_priv->mmio_map, reg, val); \ + if (__predict_false(__fifo_ret)) { \ + gen6_gt_check_fifodbg(dev_priv); \ + } \ +} +__i915_write(8, 8) +__i915_write(16, 16) +__i915_write(32, 32) +__i915_write(64, 64) +#undef __i915_write diff --git a/sys/dev/drm2/i915/i915_drv.h b/sys/dev/drm2/i915/i915_drv.h new file mode 100644 index 00000000000..bf1f99281eb --- /dev/null +++ b/sys/dev/drm2/i915/i915_drv.h @@ -0,0 +1,1481 @@ +/* i915_drv.h -- Private header for the I915 driver -*- linux-c -*- + */ +/* + * + * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef _I915_DRV_H_ +#define _I915_DRV_H_ + +#include +#include +#include +#include +#include + +/* General customization: + */ + +#define DRIVER_AUTHOR "Tungsten Graphics, Inc." + +#define DRIVER_NAME "i915" +#define DRIVER_DESC "Intel Graphics" +#define DRIVER_DATE "20080730" + +MALLOC_DECLARE(DRM_I915_GEM); + +enum pipe { + PIPE_A = 0, + PIPE_B, + PIPE_C, + I915_MAX_PIPES +}; +#define pipe_name(p) ((p) + 'A') +#define I915_NUM_PIPE 2 + +enum plane { + PLANE_A = 0, + PLANE_B, + PLANE_C, +}; +#define plane_name(p) ((p) + 'A') + +#define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT)) + +#define for_each_pipe(p) for ((p) = 0; (p) < dev_priv->num_pipe; (p)++) + +/* Interface history: + * + * 1.1: Original. + * 1.2: Add Power Management + * 1.3: Add vblank support + * 1.4: Fix cmdbuffer path, add heap destroy + * 1.5: Add vblank pipe configuration + * 1.6: - New ioctl for scheduling buffer swaps on vertical blank + * - Support vertical blank on secondary display pipe + */ +#define DRIVER_MAJOR 1 +#define DRIVER_MINOR 6 +#define DRIVER_PATCHLEVEL 0 + +#define WATCH_COHERENCY 0 +#define WATCH_BUF 0 +#define WATCH_EXEC 0 +#define WATCH_LRU 0 +#define WATCH_RELOC 0 +#define WATCH_INACTIVE 0 +#define WATCH_PWRITE 0 + +#define I915_GEM_PHYS_CURSOR_0 1 +#define I915_GEM_PHYS_CURSOR_1 2 +#define I915_GEM_PHYS_OVERLAY_REGS 3 +#define I915_MAX_PHYS_OBJECT (I915_GEM_PHYS_OVERLAY_REGS) + +struct drm_i915_gem_phys_object { + int id; + drm_dma_handle_t *handle; + struct drm_i915_gem_object *cur_obj; +}; + +struct drm_i915_private; + +struct drm_i915_display_funcs { + void (*dpms)(struct drm_crtc *crtc, int mode); + bool (*fbc_enabled)(struct drm_device *dev); + void (*enable_fbc)(struct drm_crtc *crtc, unsigned long interval); + void (*disable_fbc)(struct drm_device *dev); + int (*get_display_clock_speed)(struct drm_device *dev); + int (*get_fifo_size)(struct drm_device *dev, int plane); + void (*update_wm)(struct drm_device *dev); + void (*update_sprite_wm)(struct drm_device *dev, int pipe, + uint32_t sprite_width, int pixel_size); + int (*crtc_mode_set)(struct drm_crtc *crtc, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode, + int x, int y, + struct drm_framebuffer *old_fb); + void (*write_eld)(struct drm_connector *connector, + struct drm_crtc *crtc); + void (*fdi_link_train)(struct drm_crtc *crtc); + void (*init_clock_gating)(struct drm_device *dev); + void (*init_pch_clock_gating)(struct drm_device *dev); + int (*queue_flip)(struct drm_device *dev, struct drm_crtc *crtc, + struct drm_framebuffer *fb, + struct drm_i915_gem_object *obj); + void (*force_wake_get)(struct drm_i915_private *dev_priv); + void (*force_wake_put)(struct drm_i915_private *dev_priv); + int (*update_plane)(struct drm_crtc *crtc, struct drm_framebuffer *fb, + int x, int y); + /* clock updates for mode set */ + /* cursor updates */ + /* render clock increase/decrease */ + /* display clock increase/decrease */ + /* pll clock increase/decrease */ +}; + +struct intel_device_info { + u8 gen; + u8 is_mobile:1; + u8 is_i85x:1; + u8 is_i915g:1; + u8 is_i945gm:1; + u8 is_g33:1; + u8 need_gfx_hws:1; + u8 is_g4x:1; + u8 is_pineview:1; + u8 is_broadwater:1; + u8 is_crestline:1; + u8 is_ivybridge:1; + u8 has_fbc:1; + u8 has_pipe_cxsr:1; + u8 has_hotplug:1; + u8 cursor_needs_physical:1; + u8 has_overlay:1; + u8 overlay_needs_physical:1; + u8 supports_tv:1; + u8 has_bsd_ring:1; + u8 has_blt_ring:1; + u8 has_llc:1; +}; + +#define I915_PPGTT_PD_ENTRIES 512 +#define I915_PPGTT_PT_ENTRIES 1024 +struct i915_hw_ppgtt { + unsigned num_pd_entries; + vm_page_t *pt_pages; + uint32_t pd_offset; + vm_paddr_t *pt_dma_addr; + vm_paddr_t scratch_page_dma_addr; +}; + +enum no_fbc_reason { + FBC_NO_OUTPUT, /* no outputs enabled to compress */ + FBC_STOLEN_TOO_SMALL, /* not enough space to hold compressed buffers */ + FBC_UNSUPPORTED_MODE, /* interlace or doublescanned mode */ + FBC_MODE_TOO_LARGE, /* mode too large for compression */ + FBC_BAD_PLANE, /* fbc not supported on plane */ + FBC_NOT_TILED, /* buffer not tiled */ + FBC_MULTIPLE_PIPES, /* more than one pipe active */ + FBC_MODULE_PARAM, +}; + +struct mem_block { + struct mem_block *next; + struct mem_block *prev; + int start; + int size; + struct drm_file *file_priv; /* NULL: free, -1: heap, other: real files */ +}; + +struct opregion_header; +struct opregion_acpi; +struct opregion_swsci; +struct opregion_asle; + +struct intel_opregion { + struct opregion_header *header; + struct opregion_acpi *acpi; + struct opregion_swsci *swsci; + struct opregion_asle *asle; + void *vbt; + u32 *lid_state; +}; +#define OPREGION_SIZE (8*1024) + +#define I915_FENCE_REG_NONE -1 +#define I915_MAX_NUM_FENCES 16 +/* 16 fences + sign bit for FENCE_REG_NONE */ +#define I915_MAX_NUM_FENCE_BITS 5 + +struct drm_i915_fence_reg { + struct list_head lru_list; + struct drm_i915_gem_object *obj; + uint32_t setup_seqno; + int pin_count; +}; + +struct sdvo_device_mapping { + u8 initialized; + u8 dvo_port; + u8 slave_addr; + u8 dvo_wiring; + u8 i2c_pin; + u8 ddc_pin; +}; + +enum intel_pch { + PCH_IBX, /* Ibexpeak PCH */ + PCH_CPT, /* Cougarpoint PCH */ +}; + +#define QUIRK_PIPEA_FORCE (1<<0) +#define QUIRK_LVDS_SSC_DISABLE (1<<1) + +struct intel_fbdev; +struct intel_fbc_work; + +typedef struct drm_i915_private { + struct drm_device *dev; + + device_t *gmbus_bridge; + device_t *bbbus_bridge; + device_t *gmbus; + device_t *bbbus; + /** gmbus_sx protects against concurrent usage of the single hw gmbus + * controller on different i2c buses. */ + struct sx gmbus_sx; + + int has_gem; + int relative_constants_mode; + + drm_local_map_t *sarea; + drm_local_map_t *mmio_map; + + /** gt_fifo_count and the subsequent register write are synchronized + * with dev->struct_mutex. */ + unsigned gt_fifo_count; + /** forcewake_count is protected by gt_lock */ + unsigned forcewake_count; + /** gt_lock is also taken in irq contexts. */ + struct mtx gt_lock; + + drm_i915_sarea_t *sarea_priv; + /* drm_i915_ring_buffer_t ring; */ + struct intel_ring_buffer rings[I915_NUM_RINGS]; + uint32_t next_seqno; + + drm_dma_handle_t *status_page_dmah; + void *hw_status_page; + dma_addr_t dma_status_page; + uint32_t counter; + unsigned int status_gfx_addr; + drm_local_map_t hws_map; + struct drm_gem_object *hws_obj; + + struct drm_i915_gem_object *pwrctx; + struct drm_i915_gem_object *renderctx; + + unsigned int cpp; + int back_offset; + int front_offset; + int current_page; + int page_flipping; + + atomic_t irq_received; + u32 trace_irq_seqno; + + /** Cached value of IER to avoid reads in updating the bitfield */ + u32 pipestat[2]; + u32 irq_mask; + u32 gt_irq_mask; + u32 pch_irq_mask; + struct mtx irq_lock; + + u32 hotplug_supported_mask; + + int tex_lru_log_granularity; + int allow_batchbuffer; + unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds; + int vblank_pipe; + int num_pipe; + + /* For hangcheck timer */ +#define DRM_I915_HANGCHECK_PERIOD ((1500 /* in ms */ * hz) / 1000) + int hangcheck_count; + uint32_t last_acthd; + uint32_t last_acthd_bsd; + uint32_t last_acthd_blt; + uint32_t last_instdone; + uint32_t last_instdone1; + + struct intel_opregion opregion; + + + /* overlay */ + struct intel_overlay *overlay; + bool sprite_scaling_enabled; + + /* LVDS info */ + int backlight_level; /* restore backlight to this value */ + bool backlight_enabled; + struct drm_display_mode *lfp_lvds_vbt_mode; /* if any */ + struct drm_display_mode *sdvo_lvds_vbt_mode; /* if any */ + + /* Feature bits from the VBIOS */ + unsigned int int_tv_support:1; + unsigned int lvds_dither:1; + unsigned int lvds_vbt:1; + unsigned int int_crt_support:1; + unsigned int lvds_use_ssc:1; + unsigned int display_clock_mode:1; + int lvds_ssc_freq; + struct { + int rate; + int lanes; + int preemphasis; + int vswing; + + bool initialized; + bool support; + int bpp; + struct edp_power_seq pps; + } edp; + bool no_aux_handshake; + + int crt_ddc_pin; + struct drm_i915_fence_reg fence_regs[I915_MAX_NUM_FENCES]; /* assume 965 */ + int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */ + int num_fence_regs; /* 8 on pre-965, 16 otherwise */ + + /* PCH chipset type */ + enum intel_pch pch_type; + + /* Display functions */ + struct drm_i915_display_funcs display; + + unsigned long quirks; + + /* Register state */ + bool modeset_on_lid; + u8 saveLBB; + u32 saveDSPACNTR; + u32 saveDSPBCNTR; + u32 saveDSPARB; + u32 saveHWS; + u32 savePIPEACONF; + u32 savePIPEBCONF; + u32 savePIPEASRC; + u32 savePIPEBSRC; + u32 saveFPA0; + u32 saveFPA1; + u32 saveDPLL_A; + u32 saveDPLL_A_MD; + u32 saveHTOTAL_A; + u32 saveHBLANK_A; + u32 saveHSYNC_A; + u32 saveVTOTAL_A; + u32 saveVBLANK_A; + u32 saveVSYNC_A; + u32 saveBCLRPAT_A; + u32 saveTRANSACONF; + u32 saveTRANS_HTOTAL_A; + u32 saveTRANS_HBLANK_A; + u32 saveTRANS_HSYNC_A; + u32 saveTRANS_VTOTAL_A; + u32 saveTRANS_VBLANK_A; + u32 saveTRANS_VSYNC_A; + u32 savePIPEASTAT; + u32 saveDSPASTRIDE; + u32 saveDSPASIZE; + u32 saveDSPAPOS; + u32 saveDSPAADDR; + u32 saveDSPASURF; + u32 saveDSPATILEOFF; + u32 savePFIT_PGM_RATIOS; + u32 saveBLC_HIST_CTL; + u32 saveBLC_PWM_CTL; + u32 saveBLC_PWM_CTL2; + u32 saveBLC_CPU_PWM_CTL; + u32 saveBLC_CPU_PWM_CTL2; + u32 saveFPB0; + u32 saveFPB1; + u32 saveDPLL_B; + u32 saveDPLL_B_MD; + u32 saveHTOTAL_B; + u32 saveHBLANK_B; + u32 saveHSYNC_B; + u32 saveVTOTAL_B; + u32 saveVBLANK_B; + u32 saveVSYNC_B; + u32 saveBCLRPAT_B; + u32 saveTRANSBCONF; + u32 saveTRANS_HTOTAL_B; + u32 saveTRANS_HBLANK_B; + u32 saveTRANS_HSYNC_B; + u32 saveTRANS_VTOTAL_B; + u32 saveTRANS_VBLANK_B; + u32 saveTRANS_VSYNC_B; + u32 savePIPEBSTAT; + u32 saveDSPBSTRIDE; + u32 saveDSPBSIZE; + u32 saveDSPBPOS; + u32 saveDSPBADDR; + u32 saveDSPBSURF; + u32 saveDSPBTILEOFF; + u32 saveVGA0; + u32 saveVGA1; + u32 saveVGA_PD; + u32 saveVGACNTRL; + u32 saveADPA; + u32 saveLVDS; + u32 savePP_ON_DELAYS; + u32 savePP_OFF_DELAYS; + u32 saveDVOA; + u32 saveDVOB; + u32 saveDVOC; + u32 savePP_ON; + u32 savePP_OFF; + u32 savePP_CONTROL; + u32 savePP_DIVISOR; + u32 savePFIT_CONTROL; + u32 save_palette_a[256]; + u32 save_palette_b[256]; + u32 saveDPFC_CB_BASE; + u32 saveFBC_CFB_BASE; + u32 saveFBC_LL_BASE; + u32 saveFBC_CONTROL; + u32 saveFBC_CONTROL2; + u32 saveIER; + u32 saveIIR; + u32 saveIMR; + u32 saveDEIER; + u32 saveDEIMR; + u32 saveGTIER; + u32 saveGTIMR; + u32 saveFDI_RXA_IMR; + u32 saveFDI_RXB_IMR; + u32 saveCACHE_MODE_0; + u32 saveMI_ARB_STATE; + u32 saveSWF0[16]; + u32 saveSWF1[16]; + u32 saveSWF2[3]; + u8 saveMSR; + u8 saveSR[8]; + u8 saveGR[25]; + u8 saveAR_INDEX; + u8 saveAR[21]; + u8 saveDACMASK; + u8 saveCR[37]; + uint64_t saveFENCE[I915_MAX_NUM_FENCES]; + u32 saveCURACNTR; + u32 saveCURAPOS; + u32 saveCURABASE; + u32 saveCURBCNTR; + u32 saveCURBPOS; + u32 saveCURBBASE; + u32 saveCURSIZE; + u32 saveDP_B; + u32 saveDP_C; + u32 saveDP_D; + u32 savePIPEA_GMCH_DATA_M; + u32 savePIPEB_GMCH_DATA_M; + u32 savePIPEA_GMCH_DATA_N; + u32 savePIPEB_GMCH_DATA_N; + u32 savePIPEA_DP_LINK_M; + u32 savePIPEB_DP_LINK_M; + u32 savePIPEA_DP_LINK_N; + u32 savePIPEB_DP_LINK_N; + u32 saveFDI_RXA_CTL; + u32 saveFDI_TXA_CTL; + u32 saveFDI_RXB_CTL; + u32 saveFDI_TXB_CTL; + u32 savePFA_CTL_1; + u32 savePFB_CTL_1; + u32 savePFA_WIN_SZ; + u32 savePFB_WIN_SZ; + u32 savePFA_WIN_POS; + u32 savePFB_WIN_POS; + u32 savePCH_DREF_CONTROL; + u32 saveDISP_ARB_CTL; + u32 savePIPEA_DATA_M1; + u32 savePIPEA_DATA_N1; + u32 savePIPEA_LINK_M1; + u32 savePIPEA_LINK_N1; + u32 savePIPEB_DATA_M1; + u32 savePIPEB_DATA_N1; + u32 savePIPEB_LINK_M1; + u32 savePIPEB_LINK_N1; + u32 saveMCHBAR_RENDER_STANDBY; + u32 savePCH_PORT_HOTPLUG; + + struct { + /** Memory allocator for GTT stolen memory */ + struct drm_mm stolen; + /** Memory allocator for GTT */ + struct drm_mm gtt_space; + /** List of all objects in gtt_space. Used to restore gtt + * mappings on resume */ + struct list_head gtt_list; + + /** Usable portion of the GTT for GEM */ + unsigned long gtt_start; + unsigned long gtt_mappable_end; + unsigned long gtt_end; + + /** PPGTT used for aliasing the PPGTT with the GTT */ + struct i915_hw_ppgtt *aliasing_ppgtt; + + /** + * List of objects currently involved in rendering from the + * ringbuffer. + * + * Includes buffers having the contents of their GPU caches + * flushed, not necessarily primitives. last_rendering_seqno + * represents when the rendering involved will be completed. + * + * A reference is held on the buffer while on this list. + */ + struct list_head active_list; + + /** + * List of objects which are not in the ringbuffer but which + * still have a write_domain which needs to be flushed before + * unbinding. + * + * A reference is held on the buffer while on this list. + */ + struct list_head flushing_list; + + /** + * LRU list of objects which are not in the ringbuffer and + * are ready to unbind, but are still in the GTT. + * + * last_rendering_seqno is 0 while an object is in this list. + * + * A reference is not held on the buffer while on this list, + * as merely being GTT-bound shouldn't prevent its being + * freed, and we'll pull it off the list in the free path. + */ + struct list_head inactive_list; + + /** + * LRU list of objects which are not in the ringbuffer but + * are still pinned in the GTT. + */ + struct list_head pinned_list; + + /** LRU list of objects with fence regs on them. */ + struct list_head fence_list; + + /** + * List of objects currently pending being freed. + * + * These objects are no longer in use, but due to a signal + * we were prevented from freeing them at the appointed time. + */ + struct list_head deferred_free_list; + + /** + * We leave the user IRQ off as much as possible, + * but this means that requests will finish and never + * be retired once the system goes idle. Set a timer to + * fire periodically while the ring is running. When it + * fires, go retire requests. + */ + struct timeout_task retire_task; + + /** + * Are we in a non-interruptible section of code like + * modesetting? + */ + bool interruptible; + + uint32_t next_gem_seqno; + + /** + * Waiting sequence number, if any + */ + uint32_t waiting_gem_seqno; + + /** + * Last seq seen at irq time + */ + uint32_t irq_gem_seqno; + + /** + * Flag if the X Server, and thus DRM, is not currently in + * control of the device. + * + * This is set between LeaveVT and EnterVT. It needs to be + * replaced with a semaphore. It also needs to be + * transitioned away from for kernel modesetting. + */ + int suspended; + + /** + * Flag if the hardware appears to be wedged. + * + * This is set when attempts to idle the device timeout. + * It prevents command submission from occuring and makes + * every pending request fail + */ + int wedged; + + /** Bit 6 swizzling required for X tiling */ + uint32_t bit_6_swizzle_x; + /** Bit 6 swizzling required for Y tiling */ + uint32_t bit_6_swizzle_y; + + /* storage for physical objects */ + struct drm_i915_gem_phys_object *phys_objs[I915_MAX_PHYS_OBJECT]; + + /* accounting, useful for userland debugging */ + size_t gtt_total; + size_t mappable_gtt_total; + size_t object_memory; + u32 object_count; + + struct intel_gtt gtt; + eventhandler_tag i915_lowmem; + } mm; + + const struct intel_device_info *info; + + struct sdvo_device_mapping sdvo_mappings[2]; + /* indicate whether the LVDS_BORDER should be enabled or not */ + unsigned int lvds_border_bits; + /* Panel fitter placement and size for Ironlake+ */ + u32 pch_pf_pos, pch_pf_size; + + struct drm_crtc *plane_to_crtc_mapping[3]; + struct drm_crtc *pipe_to_crtc_mapping[3]; + /* wait_queue_head_t pending_flip_queue; XXXKIB */ + bool flip_pending_is_done; + + /* Reclocking support */ + bool render_reclock_avail; + bool lvds_downclock_avail; + /* indicates the reduced downclock for LVDS*/ + int lvds_downclock; + struct task idle_task; + struct callout idle_callout; + bool busy; + u16 orig_clock; + int child_dev_num; + struct child_device_config *child_dev; + struct drm_connector *int_lvds_connector; + struct drm_connector *int_edp_connector; + + device_t bridge_dev; + bool mchbar_need_disable; + int mch_res_rid; + struct resource *mch_res; + + struct mtx rps_lock; + u32 pm_iir; + struct task rps_task; + + u8 cur_delay; + u8 min_delay; + u8 max_delay; + u8 fmax; + u8 fstart; + + u64 last_count1; + unsigned long last_time1; + unsigned long chipset_power; + u64 last_count2; + struct timespec last_time2; + unsigned long gfx_power; + int c_m; + int r_t; + u8 corr; + struct mtx *mchdev_lock; + + enum no_fbc_reason no_fbc_reason; + + unsigned long cfb_size; + unsigned int cfb_fb; + int cfb_plane; + int cfb_y; + struct intel_fbc_work *fbc_work; + + unsigned int fsb_freq, mem_freq, is_ddr3; + + struct taskqueue *tq; + struct task error_task; + struct task hotplug_task; + int error_completion; + struct mtx error_completion_lock; + struct drm_i915_error_state *first_error; + struct mtx error_lock; + struct callout hangcheck_timer; + + unsigned long last_gpu_reset; + + struct intel_fbdev *fbdev; + + struct drm_property *broadcast_rgb_property; + struct drm_property *force_audio_property; +} drm_i915_private_t; + +enum hdmi_force_audio { + HDMI_AUDIO_OFF_DVI = -2, /* no aux data for HDMI-DVI converter */ + HDMI_AUDIO_OFF, /* force turn off HDMI audio */ + HDMI_AUDIO_AUTO, /* trust EDID */ + HDMI_AUDIO_ON, /* force turn on HDMI audio */ +}; + +enum i915_cache_level { + I915_CACHE_NONE, + I915_CACHE_LLC, + I915_CACHE_LLC_MLC, /* gen6+ */ +}; + +enum intel_chip_family { + CHIP_I8XX = 0x01, + CHIP_I9XX = 0x02, + CHIP_I915 = 0x04, + CHIP_I965 = 0x08, +}; + +/** driver private structure attached to each drm_gem_object */ +struct drm_i915_gem_object { + struct drm_gem_object base; + + /** Current space allocated to this object in the GTT, if any. */ + struct drm_mm_node *gtt_space; + struct list_head gtt_list; + /** This object's place on the active/flushing/inactive lists */ + struct list_head ring_list; + struct list_head mm_list; + /** This object's place on GPU write list */ + struct list_head gpu_write_list; + /** This object's place in the batchbuffer or on the eviction list */ + struct list_head exec_list; + + /** + * This is set if the object is on the active or flushing lists + * (has pending rendering), and is not set if it's on inactive (ready + * to be unbound). + */ + unsigned int active:1; + + /** + * This is set if the object has been written to since last bound + * to the GTT + */ + unsigned int dirty:1; + + /** + * This is set if the object has been written to since the last + * GPU flush. + */ + unsigned int pending_gpu_write:1; + + /** + * Fence register bits (if any) for this object. Will be set + * as needed when mapped into the GTT. + * Protected by dev->struct_mutex. + */ + signed int fence_reg:I915_MAX_NUM_FENCE_BITS; + + /** + * Advice: are the backing pages purgeable? + */ + unsigned int madv:2; + + /** + * Current tiling mode for the object. + */ + unsigned int tiling_mode:2; + unsigned int tiling_changed:1; + + /** How many users have pinned this object in GTT space. The following + * users can each hold at most one reference: pwrite/pread, pin_ioctl + * (via user_pin_count), execbuffer (objects are not allowed multiple + * times for the same batchbuffer), and the framebuffer code. When + * switching/pageflipping, the framebuffer code has at most two buffers + * pinned per crtc. + * + * In the worst case this is 1 + 1 + 1 + 2*2 = 7. That would fit into 3 + * bits with absolutely no headroom. So use 4 bits. */ + unsigned int pin_count:4; +#define DRM_I915_GEM_OBJECT_MAX_PIN_COUNT 0xf + + /** + * Is the object at the current location in the gtt mappable and + * fenceable? Used to avoid costly recalculations. + */ + unsigned int map_and_fenceable:1; + + /** + * Whether the current gtt mapping needs to be mappable (and isn't just + * mappable by accident). Track pin and fault separate for a more + * accurate mappable working set. + */ + unsigned int fault_mappable:1; + unsigned int pin_mappable:1; + + /* + * Is the GPU currently using a fence to access this buffer, + */ + unsigned int pending_fenced_gpu_access:1; + unsigned int fenced_gpu_access:1; + + unsigned int cache_level:2; + + unsigned int has_aliasing_ppgtt_mapping:1; + + vm_page_t *pages; + + /** + * DMAR support + */ + struct sglist *sg_list; + + /** + * Used for performing relocations during execbuffer insertion. + */ + LIST_ENTRY(drm_i915_gem_object) exec_node; + unsigned long exec_handle; + struct drm_i915_gem_exec_object2 *exec_entry; + + /** + * Current offset of the object in GTT space. + * + * This is the same as gtt_space->start + */ + uint32_t gtt_offset; + + /** Breadcrumb of last rendering to the buffer. */ + uint32_t last_rendering_seqno; + struct intel_ring_buffer *ring; + + /** Breadcrumb of last fenced GPU access to the buffer. */ + uint32_t last_fenced_seqno; + struct intel_ring_buffer *last_fenced_ring; + + /** Current tiling stride for the object, if it's tiled. */ + uint32_t stride; + + /** Record of address bit 17 of each page at last unbind. */ + unsigned long *bit_17; + + /** + * If present, while GEM_DOMAIN_CPU is in the read domain this array + * flags which individual pages are valid. + */ + uint8_t *page_cpu_valid; + + /** User space pin count and filp owning the pin */ + uint32_t user_pin_count; + struct drm_file *pin_filp; + + /** for phy allocated objects */ + struct drm_i915_gem_phys_object *phys_obj; + + /** + * Number of crtcs where this object is currently the fb, but + * will be page flipped away on the next vblank. When it + * reaches 0, dev_priv->pending_flip_queue will be woken up. + */ + int pending_flip; +}; + +#define to_intel_bo(x) member2struct(drm_i915_gem_object, base, (x)) + +/** + * Request queue structure. + * + * The request queue allows us to note sequence numbers that have been emitted + * and may be associated with active buffers to be retired. + * + * By keeping this list, we can avoid having to do questionable + * sequence-number comparisons on buffer last_rendering_seqnos, and associate + * an emission time with seqnos for tracking how far ahead of the GPU we are. + */ +struct drm_i915_gem_request { + /** On Which ring this request was generated */ + struct intel_ring_buffer *ring; + + /** GEM sequence number associated with this request. */ + uint32_t seqno; + + /** Postion in the ringbuffer of the end of the request */ + u32 tail; + + /** Time at which this request was emitted, in jiffies. */ + unsigned long emitted_jiffies; + + /** global list entry for this request */ + struct list_head list; + + struct drm_i915_file_private *file_priv; + /** file_priv list entry for this request */ + struct list_head client_list; +}; + +struct drm_i915_file_private { + struct { + struct list_head request_list; + struct mtx lck; + } mm; +}; + +struct drm_i915_error_state { + u32 eir; + u32 pgtbl_er; + u32 pipestat[I915_MAX_PIPES]; + u32 tail[I915_NUM_RINGS]; + u32 head[I915_NUM_RINGS]; + u32 ipeir[I915_NUM_RINGS]; + u32 ipehr[I915_NUM_RINGS]; + u32 instdone[I915_NUM_RINGS]; + u32 acthd[I915_NUM_RINGS]; + u32 semaphore_mboxes[I915_NUM_RINGS][I915_NUM_RINGS - 1]; + /* our own tracking of ring head and tail */ + u32 cpu_ring_head[I915_NUM_RINGS]; + u32 cpu_ring_tail[I915_NUM_RINGS]; + u32 error; /* gen6+ */ + u32 instpm[I915_NUM_RINGS]; + u32 instps[I915_NUM_RINGS]; + u32 instdone1; + u32 seqno[I915_NUM_RINGS]; + u64 bbaddr; + u32 fault_reg[I915_NUM_RINGS]; + u32 done_reg; + u32 faddr[I915_NUM_RINGS]; + u64 fence[I915_MAX_NUM_FENCES]; + struct timeval time; + struct drm_i915_error_ring { + struct drm_i915_error_object { + int page_count; + u32 gtt_offset; + u32 *pages[0]; + } *ringbuffer, *batchbuffer; + struct drm_i915_error_request { + long jiffies; + u32 seqno; + u32 tail; + } *requests; + int num_requests; + } ring[I915_NUM_RINGS]; + struct drm_i915_error_buffer { + u32 size; + u32 name; + u32 seqno; + u32 gtt_offset; + u32 read_domains; + u32 write_domain; + s32 fence_reg:I915_MAX_NUM_FENCE_BITS; + s32 pinned:2; + u32 tiling:2; + u32 dirty:1; + u32 purgeable:1; + s32 ring:4; + u32 cache_level:2; + } *active_bo, *pinned_bo; + u32 active_bo_count, pinned_bo_count; + struct intel_overlay_error_state *overlay; + struct intel_display_error_state *display; +}; + +/** + * RC6 is a special power stage which allows the GPU to enter an very + * low-voltage mode when idle, using down to 0V while at this stage. This + * stage is entered automatically when the GPU is idle when RC6 support is + * enabled, and as soon as new workload arises GPU wakes up automatically as well. + * + * There are different RC6 modes available in Intel GPU, which differentiate + * among each other with the latency required to enter and leave RC6 and + * voltage consumed by the GPU in different states. + * + * The combination of the following flags define which states GPU is allowed + * to enter, while RC6 is the normal RC6 state, RC6p is the deep RC6, and + * RC6pp is deepest RC6. Their support by hardware varies according to the + * GPU, BIOS, chipset and platform. RC6 is usually the safest one and the one + * which brings the most power savings; deeper states save more power, but + * require higher latency to switch to and wake up. + */ +#define INTEL_RC6_ENABLE (1<<0) +#define INTEL_RC6p_ENABLE (1<<1) +#define INTEL_RC6pp_ENABLE (1<<2) + +extern int intel_iommu_enabled; +extern struct drm_ioctl_desc i915_ioctls[]; +extern struct drm_driver_info i915_driver_info; +extern struct cdev_pager_ops i915_gem_pager_ops; +extern unsigned int i915_fbpercrtc; +extern int i915_panel_ignore_lid; +extern unsigned int i915_powersave; +extern int i915_semaphores; +extern unsigned int i915_lvds_downclock; +extern int i915_panel_use_ssc; +extern int i915_vbt_sdvo_panel_type; +extern int i915_enable_rc6; +extern int i915_enable_fbc; +extern int i915_enable_ppgtt; +extern int i915_enable_hangcheck; + +const struct intel_device_info *i915_get_device_id(int device); + +int i915_reset(struct drm_device *dev, u8 flags); + +/* i915_debug.c */ +int i915_sysctl_init(struct drm_device *dev, struct sysctl_ctx_list *ctx, + struct sysctl_oid *top); +void i915_sysctl_cleanup(struct drm_device *dev); + + /* i915_dma.c */ +extern void i915_kernel_lost_context(struct drm_device * dev); +extern int i915_driver_load(struct drm_device *, unsigned long flags); +extern int i915_driver_unload(struct drm_device *); +extern int i915_driver_open(struct drm_device *dev, struct drm_file *file_priv); +extern void i915_driver_lastclose(struct drm_device * dev); +extern void i915_driver_preclose(struct drm_device *dev, + struct drm_file *file_priv); +extern void i915_driver_postclose(struct drm_device *dev, + struct drm_file *file_priv); +extern int i915_driver_device_is_agp(struct drm_device * dev); +extern long i915_compat_ioctl(struct file *filp, unsigned int cmd, + unsigned long arg); +extern int i915_emit_box(struct drm_device *dev, + struct drm_clip_rect __user *boxes, + int i, int DR1, int DR4); +int i915_emit_box_p(struct drm_device *dev, struct drm_clip_rect *box, + int DR1, int DR4); + +unsigned long i915_chipset_val(struct drm_i915_private *dev_priv); +unsigned long i915_mch_val(struct drm_i915_private *dev_priv); +void i915_update_gfx_val(struct drm_i915_private *dev_priv); +unsigned long i915_gfx_val(struct drm_i915_private *dev_priv); +unsigned long i915_read_mch_val(void); +bool i915_gpu_raise(void); +bool i915_gpu_lower(void); +bool i915_gpu_busy(void); +bool i915_gpu_turbo_disable(void); + +/* i915_irq.c */ +extern int i915_irq_emit(struct drm_device *dev, void *data, + struct drm_file *file_priv); +extern int i915_irq_wait(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +extern void intel_irq_init(struct drm_device *dev); + +extern int i915_vblank_pipe_set(struct drm_device *dev, void *data, + struct drm_file *file_priv); +extern int i915_vblank_pipe_get(struct drm_device *dev, void *data, + struct drm_file *file_priv); +extern int i915_vblank_swap(struct drm_device *dev, void *data, + struct drm_file *file_priv); +void intel_enable_asle(struct drm_device *dev); +void i915_hangcheck_elapsed(void *context); +void i915_handle_error(struct drm_device *dev, bool wedged); + +void i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); +void i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); + +void i915_destroy_error_state(struct drm_device *dev); + +/* i915_gem.c */ +int i915_gem_create(struct drm_file *file, struct drm_device *dev, uint64_t size, + uint32_t *handle_p); +int i915_gem_init_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_create_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_pread_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_mmap_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_execbuffer(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_execbuffer2(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_pin_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_unpin_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_busy_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_throttle_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_madvise_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_entervt_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_leavevt_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_set_tiling(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_get_tiling(struct drm_device *dev, void *data, + struct drm_file *file_priv); +int i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); +void i915_gem_load(struct drm_device *dev); +void i915_gem_unload(struct drm_device *dev); +int i915_gem_init_object(struct drm_gem_object *obj); +void i915_gem_free_object(struct drm_gem_object *obj); +int i915_gem_object_pin(struct drm_i915_gem_object *obj, uint32_t alignment, + bool map_and_fenceable); +void i915_gem_object_unpin(struct drm_i915_gem_object *obj); +int i915_gem_object_unbind(struct drm_i915_gem_object *obj); +void i915_gem_lastclose(struct drm_device *dev); +uint32_t i915_get_gem_seqno(struct drm_device *dev); + +static inline void +i915_gem_object_pin_fence(struct drm_i915_gem_object *obj) +{ + if (obj->fence_reg != I915_FENCE_REG_NONE) { + struct drm_i915_private *dev_priv = obj->base.dev->dev_private; + dev_priv->fence_regs[obj->fence_reg].pin_count++; + } +} + +static inline void +i915_gem_object_unpin_fence(struct drm_i915_gem_object *obj) +{ + if (obj->fence_reg != I915_FENCE_REG_NONE) { + struct drm_i915_private *dev_priv = obj->base.dev->dev_private; + dev_priv->fence_regs[obj->fence_reg].pin_count--; + } +} + +void i915_gem_retire_requests(struct drm_device *dev); +void i915_gem_retire_requests_ring(struct intel_ring_buffer *ring); +void i915_gem_clflush_object(struct drm_i915_gem_object *obj); +struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, + size_t size); +int i915_gem_do_init(struct drm_device *dev, unsigned long start, + unsigned long mappable_end, unsigned long end); +uint32_t i915_gem_get_unfenced_gtt_alignment(struct drm_device *dev, + uint32_t size, int tiling_mode); +int i915_mutex_lock_interruptible(struct drm_device *dev); +int i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, + bool write); +int i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj, + u32 alignment, struct intel_ring_buffer *pipelined); +int i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj); +int i915_gem_flush_ring(struct intel_ring_buffer *ring, + uint32_t invalidate_domains, uint32_t flush_domains); +void i915_gem_release_mmap(struct drm_i915_gem_object *obj); +int i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj); +int i915_gem_object_put_fence(struct drm_i915_gem_object *obj); +int i915_gem_idle(struct drm_device *dev); +int i915_gem_init_hw(struct drm_device *dev); +void i915_gem_init_swizzling(struct drm_device *dev); +void i915_gem_init_ppgtt(struct drm_device *dev); +void i915_gem_cleanup_ringbuffer(struct drm_device *dev); +int i915_gpu_idle(struct drm_device *dev, bool do_retire); +void i915_gem_object_move_to_active(struct drm_i915_gem_object *obj, + struct intel_ring_buffer *ring, uint32_t seqno); +int i915_add_request(struct intel_ring_buffer *ring, struct drm_file *file, + struct drm_i915_gem_request *request); +int i915_gem_object_get_fence(struct drm_i915_gem_object *obj, + struct intel_ring_buffer *pipelined); +void i915_gem_reset(struct drm_device *dev); +int i915_wait_request(struct intel_ring_buffer *ring, uint32_t seqno, + bool do_retire); +int i915_gem_mmap(struct drm_device *dev, uint64_t offset, int prot); +int i915_gem_fault(struct drm_device *dev, uint64_t offset, int prot, + uint64_t *phys); +void i915_gem_release(struct drm_device *dev, struct drm_file *file); +int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj, + enum i915_cache_level cache_level); + +void i915_gem_free_all_phys_object(struct drm_device *dev); +void i915_gem_detach_phys_object(struct drm_device *dev, + struct drm_i915_gem_object *obj); +int i915_gem_attach_phys_object(struct drm_device *dev, + struct drm_i915_gem_object *obj, int id, int align); + +int i915_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev, + struct drm_mode_create_dumb *args); +int i915_gem_mmap_gtt(struct drm_file *file_priv, struct drm_device *dev, + uint32_t handle, uint64_t *offset); +int i915_gem_dumb_destroy(struct drm_file *file_priv, struct drm_device *dev, + uint32_t handle); + +/* i915_gem_tiling.c */ +void i915_gem_detect_bit_6_swizzle(struct drm_device *dev); +void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj); +void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj); + +/* i915_gem_evict.c */ +int i915_gem_evict_something(struct drm_device *dev, int min_size, + unsigned alignment, bool mappable); +int i915_gem_evict_everything(struct drm_device *dev, bool purgeable_only); +int i915_gem_evict_inactive(struct drm_device *dev, bool purgeable_only); + +/* i915_suspend.c */ +extern int i915_save_state(struct drm_device *dev); +extern int i915_restore_state(struct drm_device *dev); + +/* intel_iic.c */ +extern int intel_setup_gmbus(struct drm_device *dev); +extern void intel_teardown_gmbus(struct drm_device *dev); +extern void intel_gmbus_set_speed(device_t idev, int speed); +extern void intel_gmbus_force_bit(device_t idev, bool force_bit); +extern void intel_iic_reset(struct drm_device *dev); + +/* intel_opregion.c */ +int intel_opregion_setup(struct drm_device *dev); +extern int intel_opregion_init(struct drm_device *dev); +extern void intel_opregion_fini(struct drm_device *dev); +extern void opregion_asle_intr(struct drm_device *dev); +extern void opregion_enable_asle(struct drm_device *dev); + +/* i915_gem_gtt.c */ +int i915_gem_init_aliasing_ppgtt(struct drm_device *dev); +void i915_gem_cleanup_aliasing_ppgtt(struct drm_device *dev); +void i915_ppgtt_bind_object(struct i915_hw_ppgtt *ppgtt, + struct drm_i915_gem_object *obj, enum i915_cache_level cache_level); +void i915_ppgtt_unbind_object(struct i915_hw_ppgtt *ppgtt, + struct drm_i915_gem_object *obj); + +void i915_gem_restore_gtt_mappings(struct drm_device *dev); +int i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj); +void i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj); +void i915_gem_gtt_rebind_object(struct drm_i915_gem_object *obj, + enum i915_cache_level cache_level); + +/* modesetting */ +extern void intel_modeset_init(struct drm_device *dev); +extern void intel_modeset_gem_init(struct drm_device *dev); +extern void intel_modeset_cleanup(struct drm_device *dev); +extern int intel_modeset_vga_set_state(struct drm_device *dev, bool state); +extern bool intel_fbc_enabled(struct drm_device *dev); +extern void intel_disable_fbc(struct drm_device *dev); +extern bool ironlake_set_drps(struct drm_device *dev, u8 val); +extern void ironlake_init_pch_refclk(struct drm_device *dev); +extern void ironlake_enable_rc6(struct drm_device *dev); +extern void gen6_set_rps(struct drm_device *dev, u8 val); +extern void intel_detect_pch(struct drm_device *dev); +extern int intel_trans_dp_port_sel(struct drm_crtc *crtc); + +extern void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); +extern void __gen6_gt_force_wake_mt_get(struct drm_i915_private *dev_priv); +extern void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); +extern void __gen6_gt_force_wake_mt_put(struct drm_i915_private *dev_priv); + +extern struct intel_overlay_error_state *intel_overlay_capture_error_state( + struct drm_device *dev); +extern void intel_overlay_print_error_state(struct sbuf *m, + struct intel_overlay_error_state *error); +extern struct intel_display_error_state *intel_display_capture_error_state( + struct drm_device *dev); +extern void intel_display_print_error_state(struct sbuf *m, + struct drm_device *dev, struct intel_display_error_state *error); + +static inline void +trace_i915_reg_rw(boolean_t rw, int reg, uint64_t val, int sz) +{ + + CTR4(KTR_DRM_REG, "[%x/%d] %c %x", reg, sz, rw ? "w" : "r", val); +} + +/* On SNB platform, before reading ring registers forcewake bit + * must be set to prevent GT core from power down and stale values being + * returned. + */ +void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); +void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); +int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); + +/* We give fast paths for the really cool registers */ +#define NEEDS_FORCE_WAKE(dev_priv, reg) \ + (((dev_priv)->info->gen >= 6) && \ + ((reg) < 0x40000) && \ + ((reg) != FORCEWAKE)) + +#define __i915_read(x, y) \ + u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg); + +__i915_read(8, 8) +__i915_read(16, 16) +__i915_read(32, 32) +__i915_read(64, 64) +#undef __i915_read + +#define __i915_write(x, y) \ + void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val); + +__i915_write(8, 8) +__i915_write(16, 16) +__i915_write(32, 32) +__i915_write(64, 64) +#undef __i915_write + +#define I915_READ8(reg) i915_read8(dev_priv, (reg)) +#define I915_WRITE8(reg, val) i915_write8(dev_priv, (reg), (val)) + +#define I915_READ16(reg) i915_read16(dev_priv, (reg)) +#define I915_WRITE16(reg, val) i915_write16(dev_priv, (reg), (val)) +#define I915_READ16_NOTRACE(reg) DRM_READ16(dev_priv->mmio_map, (reg)) +#define I915_WRITE16_NOTRACE(reg, val) DRM_WRITE16(dev_priv->mmio_map, (reg), (val)) + +#define I915_READ(reg) i915_read32(dev_priv, (reg)) +#define I915_WRITE(reg, val) i915_write32(dev_priv, (reg), (val)) +#define I915_READ_NOTRACE(reg) DRM_READ32(dev_priv->mmio_map, (reg)) +#define I915_WRITE_NOTRACE(reg, val) DRM_WRITE32(dev_priv->mmio_map, (reg), (val)) + +#define I915_WRITE64(reg, val) i915_write64(dev_priv, (reg), (val)) +#define I915_READ64(reg) i915_read64(dev_priv, (reg)) + +#define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) +#define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg) + +#define I915_VERBOSE 0 + +#define LP_RING(d) (&((struct drm_i915_private *)(d))->rings[RCS]) + +#define BEGIN_LP_RING(n) \ + intel_ring_begin(LP_RING(dev_priv), (n)) + +#define OUT_RING(x) \ + intel_ring_emit(LP_RING(dev_priv), x) + +#define ADVANCE_LP_RING() \ + intel_ring_advance(LP_RING(dev_priv)) + +#define RING_LOCK_TEST_WITH_RETURN(dev, file) do { \ + if (LP_RING(dev->dev_private)->obj == NULL) \ + LOCK_TEST_WITH_RETURN(dev, file); \ +} while (0) + +/** + * Reads a dword out of the status page, which is written to from the command + * queue by automatic updates, MI_REPORT_HEAD, MI_STORE_DATA_INDEX, or + * MI_STORE_DATA_IMM. + * + * The following dwords have a reserved meaning: + * 0x00: ISR copy, updated when an ISR bit not set in the HWSTAM changes. + * 0x04: ring 0 head pointer + * 0x05: ring 1 head pointer (915-class) + * 0x06: ring 2 head pointer (915-class) + * 0x10-0x1b: Context status DWords (GM45) + * 0x1f: Last written status offset. (GM45) + * + * The area from dword 0x20 to 0x3ff is available for driver usage. + */ +#define READ_HWSP(dev_priv, reg) (((volatile u32*)(dev_priv->hw_status_page))[reg]) +#define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, I915_BREADCRUMB_INDEX) +#define I915_GEM_HWS_INDEX 0x20 +#define I915_BREADCRUMB_INDEX 0x21 + +#define INTEL_INFO(dev) (((struct drm_i915_private *) (dev)->dev_private)->info) + +#define IS_I830(dev) ((dev)->pci_device == 0x3577) +#define IS_845G(dev) ((dev)->pci_device == 0x2562) +#define IS_I85X(dev) (INTEL_INFO(dev)->is_i85x) +#define IS_I865G(dev) ((dev)->pci_device == 0x2572) +#define IS_I915G(dev) (INTEL_INFO(dev)->is_i915g) +#define IS_I915GM(dev) ((dev)->pci_device == 0x2592) +#define IS_I945G(dev) ((dev)->pci_device == 0x2772) +#define IS_I945GM(dev) (INTEL_INFO(dev)->is_i945gm) +#define IS_BROADWATER(dev) (INTEL_INFO(dev)->is_broadwater) +#define IS_CRESTLINE(dev) (INTEL_INFO(dev)->is_crestline) +#define IS_GM45(dev) ((dev)->pci_device == 0x2A42) +#define IS_G4X(dev) (INTEL_INFO(dev)->is_g4x) +#define IS_PINEVIEW_G(dev) ((dev)->pci_device == 0xa001) +#define IS_PINEVIEW_M(dev) ((dev)->pci_device == 0xa011) +#define IS_PINEVIEW(dev) (INTEL_INFO(dev)->is_pineview) +#define IS_G33(dev) (INTEL_INFO(dev)->is_g33) +#define IS_IRONLAKE_D(dev) ((dev)->pci_device == 0x0042) +#define IS_IRONLAKE_M(dev) ((dev)->pci_device == 0x0046) +#define IS_IVYBRIDGE(dev) (INTEL_INFO(dev)->is_ivybridge) +#define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) + +/* XXXKIB LEGACY */ +#define IS_I965G(dev) ((dev)->pci_device == 0x2972 || \ + (dev)->pci_device == 0x2982 || \ + (dev)->pci_device == 0x2992 || \ + (dev)->pci_device == 0x29A2 || \ + (dev)->pci_device == 0x2A02 || \ + (dev)->pci_device == 0x2A12 || \ + (dev)->pci_device == 0x2A42 || \ + (dev)->pci_device == 0x2E02 || \ + (dev)->pci_device == 0x2E12 || \ + (dev)->pci_device == 0x2E22 || \ + (dev)->pci_device == 0x2E32) + +#define IS_I965GM(dev) ((dev)->pci_device == 0x2A02) + +#define IS_IGDG(dev) ((dev)->pci_device == 0xa001) +#define IS_IGDGM(dev) ((dev)->pci_device == 0xa011) +#define IS_IGD(dev) (IS_IGDG(dev) || IS_IGDGM(dev)) + +#define IS_I9XX(dev) (IS_I915G(dev) || IS_I915GM(dev) || IS_I945G(dev) || \ + IS_I945GM(dev) || IS_I965G(dev) || IS_G33(dev)) +/* XXXKIB LEGACY END */ + +#define IS_GEN2(dev) (INTEL_INFO(dev)->gen == 2) +#define IS_GEN3(dev) (INTEL_INFO(dev)->gen == 3) +#define IS_GEN4(dev) (INTEL_INFO(dev)->gen == 4) +#define IS_GEN5(dev) (INTEL_INFO(dev)->gen == 5) +#define IS_GEN6(dev) (INTEL_INFO(dev)->gen == 6) +#define IS_GEN7(dev) (INTEL_INFO(dev)->gen == 7) + +#define HAS_BSD(dev) (INTEL_INFO(dev)->has_bsd_ring) +#define HAS_BLT(dev) (INTEL_INFO(dev)->has_blt_ring) +#define HAS_LLC(dev) (INTEL_INFO(dev)->has_llc) +#define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws) + +#define HAS_ALIASING_PPGTT(dev) (INTEL_INFO(dev)->gen >=6) + +#define HAS_OVERLAY(dev) (INTEL_INFO(dev)->has_overlay) +#define OVERLAY_NEEDS_PHYSICAL(dev) (INTEL_INFO(dev)->overlay_needs_physical) + +/* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte + * rows, which changed the alignment requirements and fence programming. + */ +#define HAS_128_BYTE_Y_TILING(dev) (!IS_GEN2(dev) && !(IS_I915G(dev) || \ + IS_I915GM(dev))) +#define SUPPORTS_DIGITAL_OUTPUTS(dev) (!IS_GEN2(dev) && !IS_PINEVIEW(dev)) +#define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_GEN5(dev)) +#define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_GEN5(dev)) +#define SUPPORTS_EDP(dev) (IS_IRONLAKE_M(dev)) +#define SUPPORTS_TV(dev) (INTEL_INFO(dev)->supports_tv) +#define I915_HAS_HOTPLUG(dev) (INTEL_INFO(dev)->has_hotplug) +/* dsparb controlled by hw only */ +#define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IRONLAKE(dev)) + +#define HAS_FW_BLC(dev) (INTEL_INFO(dev)->gen > 2) +#define HAS_PIPE_CXSR(dev) (INTEL_INFO(dev)->has_pipe_cxsr) +#define I915_HAS_FBC(dev) (INTEL_INFO(dev)->has_fbc) + +#define HAS_PCH_SPLIT(dev) (IS_GEN5(dev) || IS_GEN6(dev) || IS_IVYBRIDGE(dev)) +#define HAS_PIPE_CONTROL(dev) (INTEL_INFO(dev)->gen >= 5) + +#define INTEL_PCH_TYPE(dev) (((struct drm_i915_private *)(dev)->dev_private)->pch_type) +#define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT) +#define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX) + +#define PRIMARY_RINGBUFFER_SIZE (128*1024) + +static inline bool +i915_seqno_passed(uint32_t seq1, uint32_t seq2) +{ + + return ((int32_t)(seq1 - seq2) >= 0); +} + +u32 i915_gem_next_request_seqno(struct intel_ring_buffer *ring); + +#endif diff --git a/sys/dev/drm2/i915/i915_gem.c b/sys/dev/drm2/i915/i915_gem.c new file mode 100644 index 00000000000..73c0b53f809 --- /dev/null +++ b/sys/dev/drm2/i915/i915_gem.c @@ -0,0 +1,3760 @@ +/*- + * Copyright © 2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Konstantin Belousov under sponsorship from + * the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void i915_gem_object_flush_cpu_write_domain( + struct drm_i915_gem_object *obj); +static uint32_t i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size, + int tiling_mode); +static uint32_t i915_gem_get_gtt_alignment(struct drm_device *dev, + uint32_t size, int tiling_mode); +static int i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj, + unsigned alignment, bool map_and_fenceable); +static int i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj, + int flags); +static void i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj); +static int i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, + bool write); +static void i915_gem_object_set_to_full_cpu_read_domain( + struct drm_i915_gem_object *obj); +static int i915_gem_object_set_cpu_read_domain_range( + struct drm_i915_gem_object *obj, uint64_t offset, uint64_t size); +static void i915_gem_object_finish_gtt(struct drm_i915_gem_object *obj); +static void i915_gem_object_truncate(struct drm_i915_gem_object *obj); +static int i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj); +static bool i915_gem_object_is_inactive(struct drm_i915_gem_object *obj); +static int i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj); +static vm_page_t i915_gem_wire_page(vm_object_t object, vm_pindex_t pindex); +static void i915_gem_process_flushing_list(struct intel_ring_buffer *ring, + uint32_t flush_domains); +static void i915_gem_clear_fence_reg(struct drm_device *dev, + struct drm_i915_fence_reg *reg); +static void i915_gem_reset_fences(struct drm_device *dev); +static void i915_gem_retire_task_handler(void *arg, int pending); +static int i915_gem_phys_pwrite(struct drm_device *dev, + struct drm_i915_gem_object *obj, uint64_t data_ptr, uint64_t offset, + uint64_t size, struct drm_file *file_priv); +static void i915_gem_lowmem(void *arg); + +MALLOC_DEFINE(DRM_I915_GEM, "i915gem", "Allocations from i915 gem"); +long i915_gem_wired_pages_cnt; + +static void +i915_gem_info_add_obj(struct drm_i915_private *dev_priv, size_t size) +{ + + dev_priv->mm.object_count++; + dev_priv->mm.object_memory += size; +} + +static void +i915_gem_info_remove_obj(struct drm_i915_private *dev_priv, size_t size) +{ + + dev_priv->mm.object_count--; + dev_priv->mm.object_memory -= size; +} + +static int +i915_gem_wait_for_error(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv; + int ret; + + dev_priv = dev->dev_private; + if (!atomic_load_acq_int(&dev_priv->mm.wedged)) + return (0); + + mtx_lock(&dev_priv->error_completion_lock); + while (dev_priv->error_completion == 0) { + ret = -msleep(&dev_priv->error_completion, + &dev_priv->error_completion_lock, PCATCH, "915wco", 0); + if (ret != 0) { + mtx_unlock(&dev_priv->error_completion_lock); + return (ret); + } + } + mtx_unlock(&dev_priv->error_completion_lock); + + if (atomic_read(&dev_priv->mm.wedged)) { + mtx_lock(&dev_priv->error_completion_lock); + dev_priv->error_completion++; + mtx_unlock(&dev_priv->error_completion_lock); + } + return (0); +} + +int +i915_mutex_lock_interruptible(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv; + int ret; + + dev_priv = dev->dev_private; + ret = i915_gem_wait_for_error(dev); + if (ret != 0) + return (ret); + + /* + * interruptible shall it be. might indeed be if dev_lock is + * changed to sx + */ + ret = sx_xlock_sig(&dev->dev_struct_lock); + if (ret != 0) + return (-ret); + + return (0); +} + + +static void +i915_gem_free_object_tail(struct drm_i915_gem_object *obj) +{ + struct drm_device *dev; + drm_i915_private_t *dev_priv; + int ret; + + dev = obj->base.dev; + dev_priv = dev->dev_private; + + ret = i915_gem_object_unbind(obj); + if (ret == -ERESTART) { + list_move(&obj->mm_list, &dev_priv->mm.deferred_free_list); + return; + } + + CTR1(KTR_DRM, "object_destroy_tail %p", obj); + drm_gem_free_mmap_offset(&obj->base); + drm_gem_object_release(&obj->base); + i915_gem_info_remove_obj(dev_priv, obj->base.size); + + free(obj->page_cpu_valid, DRM_I915_GEM); + free(obj->bit_17, DRM_I915_GEM); + free(obj, DRM_I915_GEM); +} + +void +i915_gem_free_object(struct drm_gem_object *gem_obj) +{ + struct drm_i915_gem_object *obj; + struct drm_device *dev; + + obj = to_intel_bo(gem_obj); + dev = obj->base.dev; + + while (obj->pin_count > 0) + i915_gem_object_unpin(obj); + + if (obj->phys_obj != NULL) + i915_gem_detach_phys_object(dev, obj); + + i915_gem_free_object_tail(obj); +} + +static void +init_ring_lists(struct intel_ring_buffer *ring) +{ + + INIT_LIST_HEAD(&ring->active_list); + INIT_LIST_HEAD(&ring->request_list); + INIT_LIST_HEAD(&ring->gpu_write_list); +} + +void +i915_gem_load(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv; + int i; + + dev_priv = dev->dev_private; + + INIT_LIST_HEAD(&dev_priv->mm.active_list); + INIT_LIST_HEAD(&dev_priv->mm.flushing_list); + INIT_LIST_HEAD(&dev_priv->mm.inactive_list); + INIT_LIST_HEAD(&dev_priv->mm.pinned_list); + INIT_LIST_HEAD(&dev_priv->mm.fence_list); + INIT_LIST_HEAD(&dev_priv->mm.deferred_free_list); + INIT_LIST_HEAD(&dev_priv->mm.gtt_list); + for (i = 0; i < I915_NUM_RINGS; i++) + init_ring_lists(&dev_priv->rings[i]); + for (i = 0; i < I915_MAX_NUM_FENCES; i++) + INIT_LIST_HEAD(&dev_priv->fence_regs[i].lru_list); + TIMEOUT_TASK_INIT(dev_priv->tq, &dev_priv->mm.retire_task, 0, + i915_gem_retire_task_handler, dev_priv); + dev_priv->error_completion = 0; + + /* On GEN3 we really need to make sure the ARB C3 LP bit is set */ + if (IS_GEN3(dev)) { + u32 tmp = I915_READ(MI_ARB_STATE); + if (!(tmp & MI_ARB_C3_LP_WRITE_ENABLE)) { + /* + * arb state is a masked write, so set bit + + * bit in mask. + */ + tmp = MI_ARB_C3_LP_WRITE_ENABLE | + (MI_ARB_C3_LP_WRITE_ENABLE << MI_ARB_MASK_SHIFT); + I915_WRITE(MI_ARB_STATE, tmp); + } + } + + dev_priv->relative_constants_mode = I915_EXEC_CONSTANTS_REL_GENERAL; + + /* Old X drivers will take 0-2 for front, back, depth buffers */ + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + dev_priv->fence_reg_start = 3; + + if (INTEL_INFO(dev)->gen >= 4 || IS_I945G(dev) || IS_I945GM(dev) || + IS_G33(dev)) + dev_priv->num_fence_regs = 16; + else + dev_priv->num_fence_regs = 8; + + /* Initialize fence registers to zero */ + for (i = 0; i < dev_priv->num_fence_regs; i++) { + i915_gem_clear_fence_reg(dev, &dev_priv->fence_regs[i]); + } + i915_gem_detect_bit_6_swizzle(dev); + dev_priv->mm.interruptible = true; + + dev_priv->mm.i915_lowmem = EVENTHANDLER_REGISTER(vm_lowmem, + i915_gem_lowmem, dev, EVENTHANDLER_PRI_ANY); +} + +int +i915_gem_do_init(struct drm_device *dev, unsigned long start, + unsigned long mappable_end, unsigned long end) +{ + drm_i915_private_t *dev_priv; + unsigned long mappable; + int error; + + dev_priv = dev->dev_private; + mappable = min(end, mappable_end) - start; + + drm_mm_init(&dev_priv->mm.gtt_space, start, end - start); + + dev_priv->mm.gtt_start = start; + dev_priv->mm.gtt_mappable_end = mappable_end; + dev_priv->mm.gtt_end = end; + dev_priv->mm.gtt_total = end - start; + dev_priv->mm.mappable_gtt_total = mappable; + + /* Take over this portion of the GTT */ + intel_gtt_clear_range(start / PAGE_SIZE, (end-start) / PAGE_SIZE); + device_printf(dev->device, + "taking over the fictitious range 0x%lx-0x%lx\n", + dev->agp->base + start, dev->agp->base + start + mappable); + error = -vm_phys_fictitious_reg_range(dev->agp->base + start, + dev->agp->base + start + mappable, VM_MEMATTR_WRITE_COMBINING); + return (error); +} + +int +i915_gem_init_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_gem_init *args; + drm_i915_private_t *dev_priv; + + dev_priv = dev->dev_private; + args = data; + + if (args->gtt_start >= args->gtt_end || + (args->gtt_end | args->gtt_start) & (PAGE_SIZE - 1)) + return (-EINVAL); + + if (mtx_initialized(&dev_priv->mm.gtt_space.unused_lock)) + return (-EBUSY); + /* + * XXXKIB. The second-time initialization should be guarded + * against. + */ + return (i915_gem_do_init(dev, args->gtt_start, args->gtt_end, + args->gtt_end)); +} + +int +i915_gem_idle(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv; + int ret; + + dev_priv = dev->dev_private; + if (dev_priv->mm.suspended) + return (0); + + ret = i915_gpu_idle(dev, true); + if (ret != 0) + return (ret); + + /* Under UMS, be paranoid and evict. */ + if (!drm_core_check_feature(dev, DRIVER_MODESET)) { + ret = i915_gem_evict_inactive(dev, false); + if (ret != 0) + return ret; + } + + i915_gem_reset_fences(dev); + + /* Hack! Don't let anybody do execbuf while we don't control the chip. + * We need to replace this with a semaphore, or something. + * And not confound mm.suspended! + */ + dev_priv->mm.suspended = 1; + callout_stop(&dev_priv->hangcheck_timer); + + i915_kernel_lost_context(dev); + i915_gem_cleanup_ringbuffer(dev); + + /* Cancel the retire work handler, which should be idle now. */ + taskqueue_cancel_timeout(dev_priv->tq, &dev_priv->mm.retire_task, NULL); + return (ret); +} + +void +i915_gem_init_swizzling(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv; + + dev_priv = dev->dev_private; + + if (INTEL_INFO(dev)->gen < 5 || + dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_NONE) + return; + + I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) | + DISP_TILE_SURFACE_SWIZZLING); + + if (IS_GEN5(dev)) + return; + + I915_WRITE(TILECTL, I915_READ(TILECTL) | TILECTL_SWZCTL); + if (IS_GEN6(dev)) + I915_WRITE(ARB_MODE, ARB_MODE_ENABLE(ARB_MODE_SWIZZLE_SNB)); + else + I915_WRITE(ARB_MODE, ARB_MODE_ENABLE(ARB_MODE_SWIZZLE_IVB)); +} + +void +i915_gem_init_ppgtt(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv; + struct i915_hw_ppgtt *ppgtt; + uint32_t pd_offset, pd_entry; + vm_paddr_t pt_addr; + struct intel_ring_buffer *ring; + u_int first_pd_entry_in_global_pt, i; + + dev_priv = dev->dev_private; + ppgtt = dev_priv->mm.aliasing_ppgtt; + if (ppgtt == NULL) + return; + + first_pd_entry_in_global_pt = 512 * 1024 - I915_PPGTT_PD_ENTRIES; + for (i = 0; i < ppgtt->num_pd_entries; i++) { + pt_addr = VM_PAGE_TO_PHYS(ppgtt->pt_pages[i]); + pd_entry = GEN6_PDE_ADDR_ENCODE(pt_addr); + pd_entry |= GEN6_PDE_VALID; + intel_gtt_write(first_pd_entry_in_global_pt + i, pd_entry); + } + intel_gtt_read_pte(first_pd_entry_in_global_pt); + + pd_offset = ppgtt->pd_offset; + pd_offset /= 64; /* in cachelines, */ + pd_offset <<= 16; + + if (INTEL_INFO(dev)->gen == 6) { + uint32_t ecochk = I915_READ(GAM_ECOCHK); + I915_WRITE(GAM_ECOCHK, ecochk | ECOCHK_SNB_BIT | + ECOCHK_PPGTT_CACHE64B); + I915_WRITE(GFX_MODE, GFX_MODE_ENABLE(GFX_PPGTT_ENABLE)); + } else if (INTEL_INFO(dev)->gen >= 7) { + I915_WRITE(GAM_ECOCHK, ECOCHK_PPGTT_CACHE64B); + /* GFX_MODE is per-ring on gen7+ */ + } + + for (i = 0; i < I915_NUM_RINGS; i++) { + ring = &dev_priv->rings[i]; + + if (INTEL_INFO(dev)->gen >= 7) + I915_WRITE(RING_MODE_GEN7(ring), + GFX_MODE_ENABLE(GFX_PPGTT_ENABLE)); + + I915_WRITE(RING_PP_DIR_DCLV(ring), PP_DIR_DCLV_2G); + I915_WRITE(RING_PP_DIR_BASE(ring), pd_offset); + } +} + +int +i915_gem_init_hw(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv; + int ret; + + dev_priv = dev->dev_private; + + i915_gem_init_swizzling(dev); + + ret = intel_init_render_ring_buffer(dev); + if (ret != 0) + return (ret); + + if (HAS_BSD(dev)) { + ret = intel_init_bsd_ring_buffer(dev); + if (ret != 0) + goto cleanup_render_ring; + } + + if (HAS_BLT(dev)) { + ret = intel_init_blt_ring_buffer(dev); + if (ret != 0) + goto cleanup_bsd_ring; + } + + dev_priv->next_seqno = 1; + i915_gem_init_ppgtt(dev); + return (0); + +cleanup_bsd_ring: + intel_cleanup_ring_buffer(&dev_priv->rings[VCS]); +cleanup_render_ring: + intel_cleanup_ring_buffer(&dev_priv->rings[RCS]); + return (ret); +} + +int +i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_private *dev_priv; + struct drm_i915_gem_get_aperture *args; + struct drm_i915_gem_object *obj; + size_t pinned; + + dev_priv = dev->dev_private; + args = data; + + if (!(dev->driver->driver_features & DRIVER_GEM)) + return (-ENODEV); + + pinned = 0; + DRM_LOCK(dev); + list_for_each_entry(obj, &dev_priv->mm.pinned_list, mm_list) + pinned += obj->gtt_space->size; + DRM_UNLOCK(dev); + + args->aper_size = dev_priv->mm.gtt_total; + args->aper_available_size = args->aper_size - pinned; + + return (0); +} + +int +i915_gem_object_pin(struct drm_i915_gem_object *obj, uint32_t alignment, + bool map_and_fenceable) +{ + struct drm_device *dev; + struct drm_i915_private *dev_priv; + int ret; + + dev = obj->base.dev; + dev_priv = dev->dev_private; + + KASSERT(obj->pin_count != DRM_I915_GEM_OBJECT_MAX_PIN_COUNT, + ("Max pin count")); + + if (obj->gtt_space != NULL) { + if ((alignment && obj->gtt_offset & (alignment - 1)) || + (map_and_fenceable && !obj->map_and_fenceable)) { + DRM_DEBUG("bo is already pinned with incorrect alignment:" + " offset=%x, req.alignment=%x, req.map_and_fenceable=%d," + " obj->map_and_fenceable=%d\n", + obj->gtt_offset, alignment, + map_and_fenceable, + obj->map_and_fenceable); + ret = i915_gem_object_unbind(obj); + if (ret != 0) + return (ret); + } + } + + if (obj->gtt_space == NULL) { + ret = i915_gem_object_bind_to_gtt(obj, alignment, + map_and_fenceable); + if (ret) + return (ret); + } + + if (obj->pin_count++ == 0 && !obj->active) + list_move_tail(&obj->mm_list, &dev_priv->mm.pinned_list); + obj->pin_mappable |= map_and_fenceable; + +#if 1 + KIB_NOTYET(); +#else + WARN_ON(i915_verify_lists(dev)); +#endif + return (0); +} + +void +i915_gem_object_unpin(struct drm_i915_gem_object *obj) +{ + struct drm_device *dev; + drm_i915_private_t *dev_priv; + + dev = obj->base.dev; + dev_priv = dev->dev_private; + +#if 1 + KIB_NOTYET(); +#else + WARN_ON(i915_verify_lists(dev)); +#endif + + KASSERT(obj->pin_count != 0, ("zero pin count")); + KASSERT(obj->gtt_space != NULL, ("No gtt mapping")); + + if (--obj->pin_count == 0) { + if (!obj->active) + list_move_tail(&obj->mm_list, + &dev_priv->mm.inactive_list); + obj->pin_mappable = false; + } +#if 1 + KIB_NOTYET(); +#else + WARN_ON(i915_verify_lists(dev)); +#endif +} + +int +i915_gem_pin_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_gem_pin *args; + struct drm_i915_gem_object *obj; + struct drm_gem_object *gobj; + int ret; + + args = data; + + ret = i915_mutex_lock_interruptible(dev); + if (ret != 0) + return ret; + + gobj = drm_gem_object_lookup(dev, file, args->handle); + if (gobj == NULL) { + ret = -ENOENT; + goto unlock; + } + obj = to_intel_bo(gobj); + + if (obj->madv != I915_MADV_WILLNEED) { + DRM_ERROR("Attempting to pin a purgeable buffer\n"); + ret = -EINVAL; + goto out; + } + + if (obj->pin_filp != NULL && obj->pin_filp != file) { + DRM_ERROR("Already pinned in i915_gem_pin_ioctl(): %d\n", + args->handle); + ret = -EINVAL; + goto out; + } + + obj->user_pin_count++; + obj->pin_filp = file; + if (obj->user_pin_count == 1) { + ret = i915_gem_object_pin(obj, args->alignment, true); + if (ret != 0) + goto out; + } + + /* XXX - flush the CPU caches for pinned objects + * as the X server doesn't manage domains yet + */ + i915_gem_object_flush_cpu_write_domain(obj); + args->offset = obj->gtt_offset; +out: + drm_gem_object_unreference(&obj->base); +unlock: + DRM_UNLOCK(dev); + return (ret); +} + +int +i915_gem_unpin_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_gem_pin *args; + struct drm_i915_gem_object *obj; + int ret; + + args = data; + ret = i915_mutex_lock_interruptible(dev); + if (ret != 0) + return (ret); + + obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); + if (&obj->base == NULL) { + ret = -ENOENT; + goto unlock; + } + + if (obj->pin_filp != file) { + DRM_ERROR("Not pinned by caller in i915_gem_pin_ioctl(): %d\n", + args->handle); + ret = -EINVAL; + goto out; + } + obj->user_pin_count--; + if (obj->user_pin_count == 0) { + obj->pin_filp = NULL; + i915_gem_object_unpin(obj); + } + +out: + drm_gem_object_unreference(&obj->base); +unlock: + DRM_UNLOCK(dev); + return (ret); +} + +int +i915_gem_busy_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_gem_busy *args; + struct drm_i915_gem_object *obj; + struct drm_i915_gem_request *request; + int ret; + + args = data; + + ret = i915_mutex_lock_interruptible(dev); + if (ret != 0) + return ret; + + obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); + if (&obj->base == NULL) { + ret = -ENOENT; + goto unlock; + } + + args->busy = obj->active; + if (args->busy) { + if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) { + ret = i915_gem_flush_ring(obj->ring, + 0, obj->base.write_domain); + } else if (obj->ring->outstanding_lazy_request == + obj->last_rendering_seqno) { + request = malloc(sizeof(*request), DRM_I915_GEM, + M_WAITOK | M_ZERO); + ret = i915_add_request(obj->ring, NULL, request); + if (ret != 0) + free(request, DRM_I915_GEM); + } + + i915_gem_retire_requests_ring(obj->ring); + args->busy = obj->active; + } + + drm_gem_object_unreference(&obj->base); +unlock: + DRM_UNLOCK(dev); + return (ret); +} + +static int +i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file) +{ + struct drm_i915_private *dev_priv; + struct drm_i915_file_private *file_priv; + unsigned long recent_enough; + struct drm_i915_gem_request *request; + struct intel_ring_buffer *ring; + u32 seqno; + int ret; + + dev_priv = dev->dev_private; + if (atomic_read(&dev_priv->mm.wedged)) + return (-EIO); + + file_priv = file->driver_priv; + recent_enough = ticks - (20 * hz / 1000); + ring = NULL; + seqno = 0; + + mtx_lock(&file_priv->mm.lck); + list_for_each_entry(request, &file_priv->mm.request_list, client_list) { + if (time_after_eq(request->emitted_jiffies, recent_enough)) + break; + ring = request->ring; + seqno = request->seqno; + } + mtx_unlock(&file_priv->mm.lck); + if (seqno == 0) + return (0); + + ret = 0; + mtx_lock(&ring->irq_lock); + if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) { + if (ring->irq_get(ring)) { + while (ret == 0 && + !(i915_seqno_passed(ring->get_seqno(ring), seqno) || + atomic_read(&dev_priv->mm.wedged))) + ret = -msleep(ring, &ring->irq_lock, PCATCH, + "915thr", 0); + ring->irq_put(ring); + if (ret == 0 && atomic_read(&dev_priv->mm.wedged)) + ret = -EIO; + } else if (_intel_wait_for(dev, + i915_seqno_passed(ring->get_seqno(ring), seqno) || + atomic_read(&dev_priv->mm.wedged), 3000, 0, "915rtr")) { + ret = -EBUSY; + } + } + mtx_unlock(&ring->irq_lock); + + if (ret == 0) + taskqueue_enqueue_timeout(dev_priv->tq, + &dev_priv->mm.retire_task, 0); + + return (ret); +} + +int +i915_gem_throttle_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + + return (i915_gem_ring_throttle(dev, file_priv)); +} + +int +i915_gem_madvise_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_i915_gem_madvise *args; + struct drm_i915_gem_object *obj; + int ret; + + args = data; + switch (args->madv) { + case I915_MADV_DONTNEED: + case I915_MADV_WILLNEED: + break; + default: + return (-EINVAL); + } + + ret = i915_mutex_lock_interruptible(dev); + if (ret != 0) + return (ret); + + obj = to_intel_bo(drm_gem_object_lookup(dev, file_priv, args->handle)); + if (&obj->base == NULL) { + ret = -ENOENT; + goto unlock; + } + + if (obj->pin_count != 0) { + ret = -EINVAL; + goto out; + } + + if (obj->madv != I915_MADV_PURGED_INTERNAL) + obj->madv = args->madv; + if (i915_gem_object_is_purgeable(obj) && obj->gtt_space == NULL) + i915_gem_object_truncate(obj); + args->retained = obj->madv != I915_MADV_PURGED_INTERNAL; + +out: + drm_gem_object_unreference(&obj->base); +unlock: + DRM_UNLOCK(dev); + return (ret); +} + +void +i915_gem_cleanup_ringbuffer(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv; + int i; + + dev_priv = dev->dev_private; + for (i = 0; i < I915_NUM_RINGS; i++) + intel_cleanup_ring_buffer(&dev_priv->rings[i]); +} + +int +i915_gem_entervt_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_i915_private_t *dev_priv; + int ret, i; + + if (drm_core_check_feature(dev, DRIVER_MODESET)) + return (0); + dev_priv = dev->dev_private; + if (atomic_load_acq_int(&dev_priv->mm.wedged) != 0) { + DRM_ERROR("Reenabling wedged hardware, good luck\n"); + atomic_store_rel_int(&dev_priv->mm.wedged, 0); + } + + dev_priv->mm.suspended = 0; + + ret = i915_gem_init_hw(dev); + if (ret != 0) { + return (ret); + } + + KASSERT(list_empty(&dev_priv->mm.active_list), ("active list")); + KASSERT(list_empty(&dev_priv->mm.flushing_list), ("flushing list")); + KASSERT(list_empty(&dev_priv->mm.inactive_list), ("inactive list")); + for (i = 0; i < I915_NUM_RINGS; i++) { + KASSERT(list_empty(&dev_priv->rings[i].active_list), + ("ring %d active list", i)); + KASSERT(list_empty(&dev_priv->rings[i].request_list), + ("ring %d request list", i)); + } + + DRM_UNLOCK(dev); + ret = drm_irq_install(dev); + DRM_LOCK(dev); + if (ret) + goto cleanup_ringbuffer; + + return (0); + +cleanup_ringbuffer: + i915_gem_cleanup_ringbuffer(dev); + dev_priv->mm.suspended = 1; + + return (ret); +} + +int +i915_gem_leavevt_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + + if (drm_core_check_feature(dev, DRIVER_MODESET)) + return 0; + + drm_irq_uninstall(dev); + return (i915_gem_idle(dev)); +} + +int +i915_gem_create(struct drm_file *file, struct drm_device *dev, uint64_t size, + uint32_t *handle_p) +{ + struct drm_i915_gem_object *obj; + uint32_t handle; + int ret; + + size = roundup(size, PAGE_SIZE); + if (size == 0) + return (-EINVAL); + + obj = i915_gem_alloc_object(dev, size); + if (obj == NULL) + return (-ENOMEM); + + handle = 0; + ret = drm_gem_handle_create(file, &obj->base, &handle); + if (ret != 0) { + drm_gem_object_release(&obj->base); + i915_gem_info_remove_obj(dev->dev_private, obj->base.size); + free(obj, DRM_I915_GEM); + return (-ret); + } + + /* drop reference from allocate - handle holds it now */ + drm_gem_object_unreference(&obj->base); + CTR2(KTR_DRM, "object_create %p %x", obj, size); + *handle_p = handle; + return (0); +} + +int +i915_gem_dumb_create(struct drm_file *file, struct drm_device *dev, + struct drm_mode_create_dumb *args) +{ + + /* have to work out size/pitch and return them */ + args->pitch = roundup2(args->width * ((args->bpp + 7) / 8), 64); + args->size = args->pitch * args->height; + return (i915_gem_create(file, dev, args->size, &args->handle)); +} + +int +i915_gem_dumb_destroy(struct drm_file *file, struct drm_device *dev, + uint32_t handle) +{ + + return (drm_gem_handle_delete(file, handle)); +} + +int +i915_gem_create_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_gem_create *args = data; + + return (i915_gem_create(file, dev, args->size, &args->handle)); +} + +static int +i915_gem_swap_io(struct drm_device *dev, struct drm_i915_gem_object *obj, + uint64_t data_ptr, uint64_t size, uint64_t offset, enum uio_rw rw, + struct drm_file *file) +{ + vm_object_t vm_obj; + vm_page_t m; + struct sf_buf *sf; + vm_offset_t mkva; + vm_pindex_t obj_pi; + int cnt, do_bit17_swizzling, length, obj_po, ret, swizzled_po; + + if (obj->gtt_offset != 0 && rw == UIO_READ) + do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj); + else + do_bit17_swizzling = 0; + + obj->dirty = 1; + vm_obj = obj->base.vm_obj; + ret = 0; + + VM_OBJECT_LOCK(vm_obj); + vm_object_pip_add(vm_obj, 1); + while (size > 0) { + obj_pi = OFF_TO_IDX(offset); + obj_po = offset & PAGE_MASK; + + m = i915_gem_wire_page(vm_obj, obj_pi); + VM_OBJECT_UNLOCK(vm_obj); + + sched_pin(); + sf = sf_buf_alloc(m, SFB_CPUPRIVATE); + mkva = sf_buf_kva(sf); + length = min(size, PAGE_SIZE - obj_po); + while (length > 0) { + if (do_bit17_swizzling && + (VM_PAGE_TO_PHYS(m) & (1 << 17)) != 0) { + cnt = roundup2(obj_po + 1, 64); + cnt = min(cnt - obj_po, length); + swizzled_po = obj_po ^ 64; + } else { + cnt = length; + swizzled_po = obj_po; + } + if (rw == UIO_READ) + ret = -copyout_nofault( + (char *)mkva + swizzled_po, + (void *)(uintptr_t)data_ptr, cnt); + else + ret = -copyin_nofault( + (void *)(uintptr_t)data_ptr, + (char *)mkva + swizzled_po, cnt); + if (ret != 0) + break; + data_ptr += cnt; + size -= cnt; + length -= cnt; + offset += cnt; + obj_po += cnt; + } + sf_buf_free(sf); + sched_unpin(); + VM_OBJECT_LOCK(vm_obj); + if (rw == UIO_WRITE) + vm_page_dirty(m); + vm_page_reference(m); + vm_page_lock(m); + vm_page_unwire(m, 1); + vm_page_unlock(m); + atomic_add_long(&i915_gem_wired_pages_cnt, -1); + + if (ret != 0) + break; + } + vm_object_pip_wakeup(vm_obj); + VM_OBJECT_UNLOCK(vm_obj); + + return (ret); +} + +static int +i915_gem_gtt_write(struct drm_device *dev, struct drm_i915_gem_object *obj, + uint64_t data_ptr, uint64_t size, uint64_t offset, struct drm_file *file) +{ + vm_offset_t mkva; + vm_pindex_t obj_pi; + int obj_po, ret; + + obj_pi = OFF_TO_IDX(offset); + obj_po = offset & PAGE_MASK; + + mkva = (vm_offset_t)pmap_mapdev_attr(dev->agp->base + obj->gtt_offset + + IDX_TO_OFF(obj_pi), size, PAT_WRITE_COMBINING); + ret = -copyin_nofault((void *)(uintptr_t)data_ptr, (char *)mkva + + obj_po, size); + pmap_unmapdev(mkva, size); + return (ret); +} + +static int +i915_gem_obj_io(struct drm_device *dev, uint32_t handle, uint64_t data_ptr, + uint64_t size, uint64_t offset, enum uio_rw rw, struct drm_file *file) +{ + struct drm_i915_gem_object *obj; + vm_page_t *ma; + vm_offset_t start, end; + int npages, ret; + + if (size == 0) + return (0); + start = trunc_page(data_ptr); + end = round_page(data_ptr + size); + npages = howmany(end - start, PAGE_SIZE); + ma = malloc(npages * sizeof(vm_page_t), DRM_I915_GEM, M_WAITOK | + M_ZERO); + npages = vm_fault_quick_hold_pages(&curproc->p_vmspace->vm_map, + (vm_offset_t)data_ptr, size, + (rw == UIO_READ ? VM_PROT_WRITE : 0 ) | VM_PROT_READ, ma, npages); + if (npages == -1) { + ret = -EFAULT; + goto free_ma; + } + + ret = i915_mutex_lock_interruptible(dev); + if (ret != 0) + goto unlocked; + + obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle)); + if (&obj->base == NULL) { + ret = -ENOENT; + goto unlock; + } + if (offset > obj->base.size || size > obj->base.size - offset) { + ret = -EINVAL; + goto out; + } + + if (rw == UIO_READ) { + CTR3(KTR_DRM, "object_pread %p %jx %jx", obj, offset, size); + ret = i915_gem_object_set_cpu_read_domain_range(obj, + offset, size); + if (ret != 0) + goto out; + ret = i915_gem_swap_io(dev, obj, data_ptr, size, offset, + UIO_READ, file); + } else { + if (obj->phys_obj) { + CTR3(KTR_DRM, "object_phys_write %p %jx %jx", obj, + offset, size); + ret = i915_gem_phys_pwrite(dev, obj, data_ptr, offset, + size, file); + } else if (obj->gtt_space && + obj->base.write_domain != I915_GEM_DOMAIN_CPU) { + CTR3(KTR_DRM, "object_gtt_write %p %jx %jx", obj, + offset, size); + ret = i915_gem_object_pin(obj, 0, true); + if (ret != 0) + goto out; + ret = i915_gem_object_set_to_gtt_domain(obj, true); + if (ret != 0) + goto out_unpin; + ret = i915_gem_object_put_fence(obj); + if (ret != 0) + goto out_unpin; + ret = i915_gem_gtt_write(dev, obj, data_ptr, size, + offset, file); +out_unpin: + i915_gem_object_unpin(obj); + } else { + CTR3(KTR_DRM, "object_pwrite %p %jx %jx", obj, + offset, size); + ret = i915_gem_object_set_to_cpu_domain(obj, true); + if (ret != 0) + goto out; + ret = i915_gem_swap_io(dev, obj, data_ptr, size, offset, + UIO_WRITE, file); + } + } +out: + drm_gem_object_unreference(&obj->base); +unlock: + DRM_UNLOCK(dev); +unlocked: + vm_page_unhold_pages(ma, npages); +free_ma: + free(ma, DRM_I915_GEM); + return (ret); +} + +int +i915_gem_pread_ioctl(struct drm_device *dev, void *data, struct drm_file *file) +{ + struct drm_i915_gem_pread *args; + + args = data; + return (i915_gem_obj_io(dev, args->handle, args->data_ptr, args->size, + args->offset, UIO_READ, file)); +} + +int +i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, struct drm_file *file) +{ + struct drm_i915_gem_pwrite *args; + + args = data; + return (i915_gem_obj_io(dev, args->handle, args->data_ptr, args->size, + args->offset, UIO_WRITE, file)); +} + +int +i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_gem_set_domain *args; + struct drm_i915_gem_object *obj; + uint32_t read_domains; + uint32_t write_domain; + int ret; + + if ((dev->driver->driver_features & DRIVER_GEM) == 0) + return (-ENODEV); + + args = data; + read_domains = args->read_domains; + write_domain = args->write_domain; + + if ((write_domain & I915_GEM_GPU_DOMAINS) != 0 || + (read_domains & I915_GEM_GPU_DOMAINS) != 0 || + (write_domain != 0 && read_domains != write_domain)) + return (-EINVAL); + + ret = i915_mutex_lock_interruptible(dev); + if (ret != 0) + return (ret); + + obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); + if (&obj->base == NULL) { + ret = -ENOENT; + goto unlock; + } + + if ((read_domains & I915_GEM_DOMAIN_GTT) != 0) { + ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0); + if (ret == -EINVAL) + ret = 0; + } else + ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0); + + drm_gem_object_unreference(&obj->base); +unlock: + DRM_UNLOCK(dev); + return (ret); +} + +int +i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_gem_sw_finish *args; + struct drm_i915_gem_object *obj; + int ret; + + args = data; + ret = 0; + if ((dev->driver->driver_features & DRIVER_GEM) == 0) + return (ENODEV); + ret = i915_mutex_lock_interruptible(dev); + if (ret != 0) + return (ret); + obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); + if (&obj->base == NULL) { + ret = -ENOENT; + goto unlock; + } + if (obj->pin_count != 0) + i915_gem_object_flush_cpu_write_domain(obj); + drm_gem_object_unreference(&obj->base); +unlock: + DRM_UNLOCK(dev); + return (ret); +} + +int +i915_gem_mmap_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_gem_mmap *args; + struct drm_gem_object *obj; + struct proc *p; + vm_map_t map; + vm_offset_t addr; + vm_size_t size; + int error, rv; + + args = data; + + if ((dev->driver->driver_features & DRIVER_GEM) == 0) + return (-ENODEV); + + obj = drm_gem_object_lookup(dev, file, args->handle); + if (obj == NULL) + return (-ENOENT); + error = 0; + if (args->size == 0) + goto out; + p = curproc; + map = &p->p_vmspace->vm_map; + size = round_page(args->size); + PROC_LOCK(p); + if (map->size + size > lim_cur(p, RLIMIT_VMEM)) { + PROC_UNLOCK(p); + error = ENOMEM; + goto out; + } + PROC_UNLOCK(p); + + addr = 0; + vm_object_reference(obj->vm_obj); + DRM_UNLOCK(dev); + rv = vm_map_find(map, obj->vm_obj, args->offset, &addr, args->size, + VMFS_ANY_SPACE, VM_PROT_READ | VM_PROT_WRITE, + VM_PROT_READ | VM_PROT_WRITE, MAP_SHARED); + if (rv != KERN_SUCCESS) { + vm_object_deallocate(obj->vm_obj); + error = -vm_mmap_to_errno(rv); + } else { + args->addr_ptr = (uint64_t)addr; + } + DRM_LOCK(dev); +out: + drm_gem_object_unreference(obj); + return (error); +} + +static int +i915_gem_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot, + vm_ooffset_t foff, struct ucred *cred, u_short *color) +{ + + *color = 0; /* XXXKIB */ + return (0); +} + +int i915_intr_pf; + +static int +i915_gem_pager_fault(vm_object_t vm_obj, vm_ooffset_t offset, int prot, + vm_page_t *mres) +{ + struct drm_gem_object *gem_obj; + struct drm_i915_gem_object *obj; + struct drm_device *dev; + drm_i915_private_t *dev_priv; + vm_page_t m, oldm; + int cause, ret; + bool write; + + gem_obj = vm_obj->handle; + obj = to_intel_bo(gem_obj); + dev = obj->base.dev; + dev_priv = dev->dev_private; +#if 0 + write = (prot & VM_PROT_WRITE) != 0; +#else + write = true; +#endif + vm_object_pip_add(vm_obj, 1); + + /* + * Remove the placeholder page inserted by vm_fault() from the + * object before dropping the object lock. If + * i915_gem_release_mmap() is active in parallel on this gem + * object, then it owns the drm device sx and might find the + * placeholder already. Then, since the page is busy, + * i915_gem_release_mmap() sleeps waiting for the busy state + * of the page cleared. We will be not able to acquire drm + * device lock until i915_gem_release_mmap() is able to make a + * progress. + */ + if (*mres != NULL) { + oldm = *mres; + vm_page_lock(oldm); + vm_page_remove(oldm); + vm_page_unlock(oldm); + *mres = NULL; + } else + oldm = NULL; +retry: + VM_OBJECT_UNLOCK(vm_obj); +unlocked_vmobj: + cause = ret = 0; + m = NULL; + + + if (i915_intr_pf) { + ret = i915_mutex_lock_interruptible(dev); + if (ret != 0) { + cause = 10; + goto out; + } + } else + DRM_LOCK(dev); + + /* Now bind it into the GTT if needed */ + if (!obj->map_and_fenceable) { + ret = i915_gem_object_unbind(obj); + if (ret != 0) { + cause = 20; + goto unlock; + } + } + if (!obj->gtt_space) { + ret = i915_gem_object_bind_to_gtt(obj, 0, true); + if (ret != 0) { + cause = 30; + goto unlock; + } + + ret = i915_gem_object_set_to_gtt_domain(obj, write); + if (ret != 0) { + cause = 40; + goto unlock; + } + } + + if (obj->tiling_mode == I915_TILING_NONE) + ret = i915_gem_object_put_fence(obj); + else + ret = i915_gem_object_get_fence(obj, NULL); + if (ret != 0) { + cause = 50; + goto unlock; + } + + if (i915_gem_object_is_inactive(obj)) + list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list); + + obj->fault_mappable = true; + VM_OBJECT_LOCK(vm_obj); + m = vm_phys_fictitious_to_vm_page(dev->agp->base + obj->gtt_offset + + offset); + if (m == NULL) { + cause = 60; + ret = -EFAULT; + goto unlock; + } + KASSERT((m->flags & PG_FICTITIOUS) != 0, + ("not fictitious %p", m)); + KASSERT(m->wire_count == 1, ("wire_count not 1 %p", m)); + + if ((m->flags & VPO_BUSY) != 0) { + DRM_UNLOCK(dev); + vm_page_sleep(m, "915pbs"); + goto retry; + } + m->valid = VM_PAGE_BITS_ALL; + *mres = m; + vm_page_lock(m); + vm_page_insert(m, vm_obj, OFF_TO_IDX(offset)); + vm_page_unlock(m); + vm_page_busy(m); + + CTR4(KTR_DRM, "fault %p %jx %x phys %x", gem_obj, offset, prot, + m->phys_addr); + DRM_UNLOCK(dev); + if (oldm != NULL) { + vm_page_lock(oldm); + vm_page_free(oldm); + vm_page_unlock(oldm); + } + vm_object_pip_wakeup(vm_obj); + return (VM_PAGER_OK); + +unlock: + DRM_UNLOCK(dev); +out: + KASSERT(ret != 0, ("i915_gem_pager_fault: wrong return")); + CTR5(KTR_DRM, "fault_fail %p %jx %x err %d %d", gem_obj, offset, prot, + -ret, cause); + if (ret == -EAGAIN || ret == -EIO || ret == -EINTR) { + kern_yield(PRI_USER); + goto unlocked_vmobj; + } + VM_OBJECT_LOCK(vm_obj); + vm_object_pip_wakeup(vm_obj); + return (VM_PAGER_ERROR); +} + +static void +i915_gem_pager_dtor(void *handle) +{ + struct drm_gem_object *obj; + struct drm_device *dev; + + obj = handle; + dev = obj->dev; + + DRM_LOCK(dev); + drm_gem_free_mmap_offset(obj); + i915_gem_release_mmap(to_intel_bo(obj)); + drm_gem_object_unreference(obj); + DRM_UNLOCK(dev); +} + +struct cdev_pager_ops i915_gem_pager_ops = { + .cdev_pg_fault = i915_gem_pager_fault, + .cdev_pg_ctor = i915_gem_pager_ctor, + .cdev_pg_dtor = i915_gem_pager_dtor +}; + +int +i915_gem_mmap_gtt(struct drm_file *file, struct drm_device *dev, + uint32_t handle, uint64_t *offset) +{ + struct drm_i915_private *dev_priv; + struct drm_i915_gem_object *obj; + int ret; + + if (!(dev->driver->driver_features & DRIVER_GEM)) + return (-ENODEV); + + dev_priv = dev->dev_private; + + ret = i915_mutex_lock_interruptible(dev); + if (ret != 0) + return (ret); + + obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle)); + if (&obj->base == NULL) { + ret = -ENOENT; + goto unlock; + } + + if (obj->base.size > dev_priv->mm.gtt_mappable_end) { + ret = -E2BIG; + goto out; + } + + if (obj->madv != I915_MADV_WILLNEED) { + DRM_ERROR("Attempting to mmap a purgeable buffer\n"); + ret = -EINVAL; + goto out; + } + + ret = drm_gem_create_mmap_offset(&obj->base); + if (ret != 0) + goto out; + + *offset = DRM_GEM_MAPPING_OFF(obj->base.map_list.key) | + DRM_GEM_MAPPING_KEY; +out: + drm_gem_object_unreference(&obj->base); +unlock: + DRM_UNLOCK(dev); + return (ret); +} + +int +i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_private *dev_priv; + struct drm_i915_gem_mmap_gtt *args; + + dev_priv = dev->dev_private; + args = data; + + return (i915_gem_mmap_gtt(file, dev, args->handle, &args->offset)); +} + +struct drm_i915_gem_object * +i915_gem_alloc_object(struct drm_device *dev, size_t size) +{ + struct drm_i915_private *dev_priv; + struct drm_i915_gem_object *obj; + + dev_priv = dev->dev_private; + + obj = malloc(sizeof(*obj), DRM_I915_GEM, M_WAITOK | M_ZERO); + + if (drm_gem_object_init(dev, &obj->base, size) != 0) { + free(obj, DRM_I915_GEM); + return (NULL); + } + + obj->base.write_domain = I915_GEM_DOMAIN_CPU; + obj->base.read_domains = I915_GEM_DOMAIN_CPU; + + if (HAS_LLC(dev)) + obj->cache_level = I915_CACHE_LLC; + else + obj->cache_level = I915_CACHE_NONE; + obj->base.driver_private = NULL; + obj->fence_reg = I915_FENCE_REG_NONE; + INIT_LIST_HEAD(&obj->mm_list); + INIT_LIST_HEAD(&obj->gtt_list); + INIT_LIST_HEAD(&obj->ring_list); + INIT_LIST_HEAD(&obj->exec_list); + INIT_LIST_HEAD(&obj->gpu_write_list); + obj->madv = I915_MADV_WILLNEED; + /* Avoid an unnecessary call to unbind on the first bind. */ + obj->map_and_fenceable = true; + + i915_gem_info_add_obj(dev_priv, size); + + return (obj); +} + +void +i915_gem_clflush_object(struct drm_i915_gem_object *obj) +{ + + /* If we don't have a page list set up, then we're not pinned + * to GPU, and we can ignore the cache flush because it'll happen + * again at bind time. + */ + if (obj->pages == NULL) + return; + + /* If the GPU is snooping the contents of the CPU cache, + * we do not need to manually clear the CPU cache lines. However, + * the caches are only snooped when the render cache is + * flushed/invalidated. As we always have to emit invalidations + * and flushes when moving into and out of the RENDER domain, correct + * snooping behaviour occurs naturally as the result of our domain + * tracking. + */ + if (obj->cache_level != I915_CACHE_NONE) + return; + + CTR1(KTR_DRM, "object_clflush %p", obj); + drm_clflush_pages(obj->pages, obj->base.size / PAGE_SIZE); +} + +static void +i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj) +{ + uint32_t old_write_domain; + + if (obj->base.write_domain != I915_GEM_DOMAIN_CPU) + return; + + i915_gem_clflush_object(obj); + intel_gtt_chipset_flush(); + old_write_domain = obj->base.write_domain; + obj->base.write_domain = 0; + + CTR3(KTR_DRM, "object_change_domain flush_cpu_write %p %x %x", obj, + obj->base.read_domains, old_write_domain); +} + +static int +i915_gem_object_flush_gpu_write_domain(struct drm_i915_gem_object *obj) +{ + + if ((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0) + return (0); + return (i915_gem_flush_ring(obj->ring, 0, obj->base.write_domain)); +} + +static void +i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj) +{ + uint32_t old_write_domain; + + if (obj->base.write_domain != I915_GEM_DOMAIN_GTT) + return; + + wmb(); + + old_write_domain = obj->base.write_domain; + obj->base.write_domain = 0; + + CTR3(KTR_DRM, "object_change_domain flush gtt_write %p %x %x", obj, + obj->base.read_domains, old_write_domain); +} + +int +i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write) +{ + uint32_t old_write_domain, old_read_domains; + int ret; + + if (obj->gtt_space == NULL) + return (-EINVAL); + + if (obj->base.write_domain == I915_GEM_DOMAIN_GTT) + return 0; + + ret = i915_gem_object_flush_gpu_write_domain(obj); + if (ret != 0) + return (ret); + + if (obj->pending_gpu_write || write) { + ret = i915_gem_object_wait_rendering(obj); + if (ret != 0) + return (ret); + } + + i915_gem_object_flush_cpu_write_domain(obj); + + old_write_domain = obj->base.write_domain; + old_read_domains = obj->base.read_domains; + + KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) == 0, + ("In GTT write domain")); + obj->base.read_domains |= I915_GEM_DOMAIN_GTT; + if (write) { + obj->base.read_domains = I915_GEM_DOMAIN_GTT; + obj->base.write_domain = I915_GEM_DOMAIN_GTT; + obj->dirty = 1; + } + + CTR3(KTR_DRM, "object_change_domain set_to_gtt %p %x %x", obj, + old_read_domains, old_write_domain); + return (0); +} + +int +i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj, + enum i915_cache_level cache_level) +{ + struct drm_device *dev; + drm_i915_private_t *dev_priv; + int ret; + + if (obj->cache_level == cache_level) + return 0; + + if (obj->pin_count) { + DRM_DEBUG("can not change the cache level of pinned objects\n"); + return (-EBUSY); + } + + dev = obj->base.dev; + dev_priv = dev->dev_private; + if (obj->gtt_space) { + ret = i915_gem_object_finish_gpu(obj); + if (ret != 0) + return (ret); + + i915_gem_object_finish_gtt(obj); + + /* Before SandyBridge, you could not use tiling or fence + * registers with snooped memory, so relinquish any fences + * currently pointing to our region in the aperture. + */ + if (INTEL_INFO(obj->base.dev)->gen < 6) { + ret = i915_gem_object_put_fence(obj); + if (ret != 0) + return (ret); + } + + i915_gem_gtt_rebind_object(obj, cache_level); + if (obj->has_aliasing_ppgtt_mapping) + i915_ppgtt_bind_object(dev_priv->mm.aliasing_ppgtt, + obj, cache_level); + } + + if (cache_level == I915_CACHE_NONE) { + u32 old_read_domains, old_write_domain; + + /* If we're coming from LLC cached, then we haven't + * actually been tracking whether the data is in the + * CPU cache or not, since we only allow one bit set + * in obj->write_domain and have been skipping the clflushes. + * Just set it to the CPU cache for now. + */ + KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) == 0, + ("obj %p in CPU write domain", obj)); + KASSERT((obj->base.read_domains & ~I915_GEM_DOMAIN_CPU) == 0, + ("obj %p in CPU read domain", obj)); + + old_read_domains = obj->base.read_domains; + old_write_domain = obj->base.write_domain; + + obj->base.read_domains = I915_GEM_DOMAIN_CPU; + obj->base.write_domain = I915_GEM_DOMAIN_CPU; + + CTR3(KTR_DRM, "object_change_domain set_cache_level %p %x %x", + obj, old_read_domains, old_write_domain); + } + + obj->cache_level = cache_level; + return (0); +} + +int +i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj, + u32 alignment, struct intel_ring_buffer *pipelined) +{ + u32 old_read_domains, old_write_domain; + int ret; + + ret = i915_gem_object_flush_gpu_write_domain(obj); + if (ret != 0) + return (ret); + + if (pipelined != obj->ring) { + ret = i915_gem_object_wait_rendering(obj); + if (ret == -ERESTART || ret == -EINTR) + return (ret); + } + + ret = i915_gem_object_set_cache_level(obj, I915_CACHE_NONE); + if (ret != 0) + return (ret); + + ret = i915_gem_object_pin(obj, alignment, true); + if (ret != 0) + return (ret); + + i915_gem_object_flush_cpu_write_domain(obj); + + old_write_domain = obj->base.write_domain; + old_read_domains = obj->base.read_domains; + + KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) == 0, + ("obj %p in GTT write domain", obj)); + obj->base.read_domains |= I915_GEM_DOMAIN_GTT; + + CTR3(KTR_DRM, "object_change_domain pin_to_display_plan %p %x %x", + obj, old_read_domains, obj->base.write_domain); + return (0); +} + +int +i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj) +{ + int ret; + + if ((obj->base.read_domains & I915_GEM_GPU_DOMAINS) == 0) + return (0); + + if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) { + ret = i915_gem_flush_ring(obj->ring, 0, obj->base.write_domain); + if (ret != 0) + return (ret); + } + + ret = i915_gem_object_wait_rendering(obj); + if (ret != 0) + return (ret); + + obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS; + + return (0); +} + +static int +i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write) +{ + uint32_t old_write_domain, old_read_domains; + int ret; + + if (obj->base.write_domain == I915_GEM_DOMAIN_CPU) + return 0; + + ret = i915_gem_object_flush_gpu_write_domain(obj); + if (ret != 0) + return (ret); + + ret = i915_gem_object_wait_rendering(obj); + if (ret != 0) + return (ret); + + i915_gem_object_flush_gtt_write_domain(obj); + i915_gem_object_set_to_full_cpu_read_domain(obj); + + old_write_domain = obj->base.write_domain; + old_read_domains = obj->base.read_domains; + + if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0) { + i915_gem_clflush_object(obj); + obj->base.read_domains |= I915_GEM_DOMAIN_CPU; + } + + KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) == 0, + ("In cpu write domain")); + + if (write) { + obj->base.read_domains = I915_GEM_DOMAIN_CPU; + obj->base.write_domain = I915_GEM_DOMAIN_CPU; + } + + CTR3(KTR_DRM, "object_change_domain set_to_cpu %p %x %x", obj, + old_read_domains, old_write_domain); + return (0); +} + +static void +i915_gem_object_set_to_full_cpu_read_domain(struct drm_i915_gem_object *obj) +{ + int i; + + if (obj->page_cpu_valid == NULL) + return; + + if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) != 0) { + for (i = 0; i <= (obj->base.size - 1) / PAGE_SIZE; i++) { + if (obj->page_cpu_valid[i] != 0) + continue; + drm_clflush_pages(obj->pages + i, 1); + } + } + + free(obj->page_cpu_valid, DRM_I915_GEM); + obj->page_cpu_valid = NULL; +} + +static int +i915_gem_object_set_cpu_read_domain_range(struct drm_i915_gem_object *obj, + uint64_t offset, uint64_t size) +{ + uint32_t old_read_domains; + int i, ret; + + if (offset == 0 && size == obj->base.size) + return (i915_gem_object_set_to_cpu_domain(obj, 0)); + + ret = i915_gem_object_flush_gpu_write_domain(obj); + if (ret != 0) + return (ret); + ret = i915_gem_object_wait_rendering(obj); + if (ret != 0) + return (ret); + + i915_gem_object_flush_gtt_write_domain(obj); + + if (obj->page_cpu_valid == NULL && + (obj->base.read_domains & I915_GEM_DOMAIN_CPU) != 0) + return (0); + + if (obj->page_cpu_valid == NULL) { + obj->page_cpu_valid = malloc(obj->base.size / PAGE_SIZE, + DRM_I915_GEM, M_WAITOK | M_ZERO); + } else if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0) + memset(obj->page_cpu_valid, 0, obj->base.size / PAGE_SIZE); + + for (i = offset / PAGE_SIZE; i <= (offset + size - 1) / PAGE_SIZE; + i++) { + if (obj->page_cpu_valid[i]) + continue; + drm_clflush_pages(obj->pages + i, 1); + obj->page_cpu_valid[i] = 1; + } + + KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) == 0, + ("In gpu write domain")); + + old_read_domains = obj->base.read_domains; + obj->base.read_domains |= I915_GEM_DOMAIN_CPU; + + CTR3(KTR_DRM, "object_change_domain set_cpu_read %p %x %x", obj, + old_read_domains, obj->base.write_domain); + return (0); +} + +static uint32_t +i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size, int tiling_mode) +{ + uint32_t gtt_size; + + if (INTEL_INFO(dev)->gen >= 4 || + tiling_mode == I915_TILING_NONE) + return (size); + + /* Previous chips need a power-of-two fence region when tiling */ + if (INTEL_INFO(dev)->gen == 3) + gtt_size = 1024*1024; + else + gtt_size = 512*1024; + + while (gtt_size < size) + gtt_size <<= 1; + + return (gtt_size); +} + +/** + * i915_gem_get_gtt_alignment - return required GTT alignment for an object + * @obj: object to check + * + * Return the required GTT alignment for an object, taking into account + * potential fence register mapping. + */ +static uint32_t +i915_gem_get_gtt_alignment(struct drm_device *dev, uint32_t size, + int tiling_mode) +{ + + /* + * Minimum alignment is 4k (GTT page size), but might be greater + * if a fence register is needed for the object. + */ + if (INTEL_INFO(dev)->gen >= 4 || + tiling_mode == I915_TILING_NONE) + return (4096); + + /* + * Previous chips need to be aligned to the size of the smallest + * fence register that can contain the object. + */ + return (i915_gem_get_gtt_size(dev, size, tiling_mode)); +} + +uint32_t +i915_gem_get_unfenced_gtt_alignment(struct drm_device *dev, uint32_t size, + int tiling_mode) +{ + + if (tiling_mode == I915_TILING_NONE) + return (4096); + + /* + * Minimum alignment is 4k (GTT page size) for sane hw. + */ + if (INTEL_INFO(dev)->gen >= 4 || IS_G33(dev)) + return (4096); + + /* + * Previous hardware however needs to be aligned to a power-of-two + * tile height. The simplest method for determining this is to reuse + * the power-of-tile object size. + */ + return (i915_gem_get_gtt_size(dev, size, tiling_mode)); +} + +static int +i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj, + unsigned alignment, bool map_and_fenceable) +{ + struct drm_device *dev; + struct drm_i915_private *dev_priv; + struct drm_mm_node *free_space; + uint32_t size, fence_size, fence_alignment, unfenced_alignment; + bool mappable, fenceable; + int ret; + + dev = obj->base.dev; + dev_priv = dev->dev_private; + + if (obj->madv != I915_MADV_WILLNEED) { + DRM_ERROR("Attempting to bind a purgeable object\n"); + return (-EINVAL); + } + + fence_size = i915_gem_get_gtt_size(dev, obj->base.size, + obj->tiling_mode); + fence_alignment = i915_gem_get_gtt_alignment(dev, obj->base.size, + obj->tiling_mode); + unfenced_alignment = i915_gem_get_unfenced_gtt_alignment(dev, + obj->base.size, obj->tiling_mode); + if (alignment == 0) + alignment = map_and_fenceable ? fence_alignment : + unfenced_alignment; + if (map_and_fenceable && (alignment & (fence_alignment - 1)) != 0) { + DRM_ERROR("Invalid object alignment requested %u\n", alignment); + return (-EINVAL); + } + + size = map_and_fenceable ? fence_size : obj->base.size; + + /* If the object is bigger than the entire aperture, reject it early + * before evicting everything in a vain attempt to find space. + */ + if (obj->base.size > (map_and_fenceable ? + dev_priv->mm.gtt_mappable_end : dev_priv->mm.gtt_total)) { + DRM_ERROR( +"Attempting to bind an object larger than the aperture\n"); + return (-E2BIG); + } + + search_free: + if (map_and_fenceable) + free_space = drm_mm_search_free_in_range( + &dev_priv->mm.gtt_space, size, alignment, 0, + dev_priv->mm.gtt_mappable_end, 0); + else + free_space = drm_mm_search_free(&dev_priv->mm.gtt_space, + size, alignment, 0); + if (free_space != NULL) { + if (map_and_fenceable) + obj->gtt_space = drm_mm_get_block_range_generic( + free_space, size, alignment, 0, + dev_priv->mm.gtt_mappable_end, 1); + else + obj->gtt_space = drm_mm_get_block_generic(free_space, + size, alignment, 1); + } + if (obj->gtt_space == NULL) { + ret = i915_gem_evict_something(dev, size, alignment, + map_and_fenceable); + if (ret != 0) + return (ret); + goto search_free; + } + ret = i915_gem_object_get_pages_gtt(obj, 0); + if (ret != 0) { + drm_mm_put_block(obj->gtt_space); + obj->gtt_space = NULL; + /* + * i915_gem_object_get_pages_gtt() cannot return + * ENOMEM, since we use vm_page_grab(VM_ALLOC_RETRY) + * (which does not support operation without a flag + * anyway). + */ + return (ret); + } + + ret = i915_gem_gtt_bind_object(obj); + if (ret != 0) { + i915_gem_object_put_pages_gtt(obj); + drm_mm_put_block(obj->gtt_space); + obj->gtt_space = NULL; + if (i915_gem_evict_everything(dev, false)) + return (ret); + goto search_free; + } + + list_add_tail(&obj->gtt_list, &dev_priv->mm.gtt_list); + list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list); + + KASSERT((obj->base.read_domains & I915_GEM_GPU_DOMAINS) == 0, + ("Object in gpu read domain")); + KASSERT((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0, + ("Object in gpu write domain")); + + obj->gtt_offset = obj->gtt_space->start; + + fenceable = + obj->gtt_space->size == fence_size && + (obj->gtt_space->start & (fence_alignment - 1)) == 0; + + mappable = + obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end; + obj->map_and_fenceable = mappable && fenceable; + + CTR4(KTR_DRM, "object_bind %p %x %x %d", obj, obj->gtt_offset, + obj->base.size, map_and_fenceable); + return (0); +} + +static void +i915_gem_object_finish_gtt(struct drm_i915_gem_object *obj) +{ + u32 old_write_domain, old_read_domains; + + /* Act a barrier for all accesses through the GTT */ + mb(); + + /* Force a pagefault for domain tracking on next user access */ + i915_gem_release_mmap(obj); + + if ((obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0) + return; + + old_read_domains = obj->base.read_domains; + old_write_domain = obj->base.write_domain; + + obj->base.read_domains &= ~I915_GEM_DOMAIN_GTT; + obj->base.write_domain &= ~I915_GEM_DOMAIN_GTT; + + CTR3(KTR_DRM, "object_change_domain finish gtt %p %x %x", + obj, old_read_domains, old_write_domain); +} + +int +i915_gem_object_unbind(struct drm_i915_gem_object *obj) +{ + drm_i915_private_t *dev_priv; + int ret; + + dev_priv = obj->base.dev->dev_private; + ret = 0; + if (obj->gtt_space == NULL) + return (0); + if (obj->pin_count != 0) { + DRM_ERROR("Attempting to unbind pinned buffer\n"); + return (-EINVAL); + } + + ret = i915_gem_object_finish_gpu(obj); + if (ret == -ERESTART || ret == -EINTR) + return (ret); + + i915_gem_object_finish_gtt(obj); + + if (ret == 0) + ret = i915_gem_object_set_to_cpu_domain(obj, 1); + if (ret == -ERESTART || ret == -EINTR) + return (ret); + if (ret != 0) { + i915_gem_clflush_object(obj); + obj->base.read_domains = obj->base.write_domain = + I915_GEM_DOMAIN_CPU; + } + + ret = i915_gem_object_put_fence(obj); + if (ret == -ERESTART) + return (ret); + + i915_gem_gtt_unbind_object(obj); + if (obj->has_aliasing_ppgtt_mapping) { + i915_ppgtt_unbind_object(dev_priv->mm.aliasing_ppgtt, obj); + obj->has_aliasing_ppgtt_mapping = 0; + } + i915_gem_object_put_pages_gtt(obj); + + list_del_init(&obj->gtt_list); + list_del_init(&obj->mm_list); + obj->map_and_fenceable = true; + + drm_mm_put_block(obj->gtt_space); + obj->gtt_space = NULL; + obj->gtt_offset = 0; + + if (i915_gem_object_is_purgeable(obj)) + i915_gem_object_truncate(obj); + CTR1(KTR_DRM, "object_unbind %p", obj); + + return (ret); +} + +static int +i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj, + int flags) +{ + struct drm_device *dev; + vm_object_t vm_obj; + vm_page_t m; + int page_count, i, j; + + dev = obj->base.dev; + KASSERT(obj->pages == NULL, ("Obj already has pages")); + page_count = obj->base.size / PAGE_SIZE; + obj->pages = malloc(page_count * sizeof(vm_page_t), DRM_I915_GEM, + M_WAITOK); + vm_obj = obj->base.vm_obj; + VM_OBJECT_LOCK(vm_obj); + for (i = 0; i < page_count; i++) { + if ((obj->pages[i] = i915_gem_wire_page(vm_obj, i)) == NULL) + goto failed; + } + VM_OBJECT_UNLOCK(vm_obj); + if (i915_gem_object_needs_bit17_swizzle(obj)) + i915_gem_object_do_bit_17_swizzle(obj); + return (0); + +failed: + for (j = 0; j < i; j++) { + m = obj->pages[j]; + vm_page_lock(m); + vm_page_unwire(m, 0); + vm_page_unlock(m); + atomic_add_long(&i915_gem_wired_pages_cnt, -1); + } + VM_OBJECT_UNLOCK(vm_obj); + free(obj->pages, DRM_I915_GEM); + obj->pages = NULL; + return (-EIO); +} + +#define GEM_PARANOID_CHECK_GTT 0 +#if GEM_PARANOID_CHECK_GTT +static void +i915_gem_assert_pages_not_mapped(struct drm_device *dev, vm_page_t *ma, + int page_count) +{ + struct drm_i915_private *dev_priv; + vm_paddr_t pa; + unsigned long start, end; + u_int i; + int j; + + dev_priv = dev->dev_private; + start = OFF_TO_IDX(dev_priv->mm.gtt_start); + end = OFF_TO_IDX(dev_priv->mm.gtt_end); + for (i = start; i < end; i++) { + pa = intel_gtt_read_pte_paddr(i); + for (j = 0; j < page_count; j++) { + if (pa == VM_PAGE_TO_PHYS(ma[j])) { + panic("Page %p in GTT pte index %d pte %x", + ma[i], i, intel_gtt_read_pte(i)); + } + } + } +} +#endif + +static void +i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj) +{ + vm_page_t m; + int page_count, i; + + KASSERT(obj->madv != I915_MADV_PURGED_INTERNAL, ("Purged object")); + + if (obj->tiling_mode != I915_TILING_NONE) + i915_gem_object_save_bit_17_swizzle(obj); + if (obj->madv == I915_MADV_DONTNEED) + obj->dirty = 0; + page_count = obj->base.size / PAGE_SIZE; + VM_OBJECT_LOCK(obj->base.vm_obj); +#if GEM_PARANOID_CHECK_GTT + i915_gem_assert_pages_not_mapped(obj->base.dev, obj->pages, page_count); +#endif + for (i = 0; i < page_count; i++) { + m = obj->pages[i]; + if (obj->dirty) + vm_page_dirty(m); + if (obj->madv == I915_MADV_WILLNEED) + vm_page_reference(m); + vm_page_lock(m); + vm_page_unwire(obj->pages[i], 1); + vm_page_unlock(m); + atomic_add_long(&i915_gem_wired_pages_cnt, -1); + } + VM_OBJECT_UNLOCK(obj->base.vm_obj); + obj->dirty = 0; + free(obj->pages, DRM_I915_GEM); + obj->pages = NULL; +} + +void +i915_gem_release_mmap(struct drm_i915_gem_object *obj) +{ + vm_object_t devobj; + vm_page_t m; + int i, page_count; + + if (!obj->fault_mappable) + return; + + CTR3(KTR_DRM, "release_mmap %p %x %x", obj, obj->gtt_offset, + OFF_TO_IDX(obj->base.size)); + devobj = cdev_pager_lookup(obj); + if (devobj != NULL) { + page_count = OFF_TO_IDX(obj->base.size); + + VM_OBJECT_LOCK(devobj); +retry: + for (i = 0; i < page_count; i++) { + m = vm_page_lookup(devobj, i); + if (m == NULL) + continue; + if (vm_page_sleep_if_busy(m, true, "915unm")) + goto retry; + cdev_pager_free_page(devobj, m); + } + VM_OBJECT_UNLOCK(devobj); + vm_object_deallocate(devobj); + } + + obj->fault_mappable = false; +} + +int +i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj) +{ + int ret; + + KASSERT((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0, + ("In GPU write domain")); + + CTR5(KTR_DRM, "object_wait_rendering %p %s %x %d %d", obj, + obj->ring != NULL ? obj->ring->name : "none", obj->gtt_offset, + obj->active, obj->last_rendering_seqno); + if (obj->active) { + ret = i915_wait_request(obj->ring, obj->last_rendering_seqno, + true); + if (ret != 0) + return (ret); + } + return (0); +} + +void +i915_gem_object_move_to_active(struct drm_i915_gem_object *obj, + struct intel_ring_buffer *ring, uint32_t seqno) +{ + struct drm_device *dev = obj->base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_i915_fence_reg *reg; + + obj->ring = ring; + KASSERT(ring != NULL, ("NULL ring")); + + /* Add a reference if we're newly entering the active list. */ + if (!obj->active) { + drm_gem_object_reference(&obj->base); + obj->active = 1; + } + + /* Move from whatever list we were on to the tail of execution. */ + list_move_tail(&obj->mm_list, &dev_priv->mm.active_list); + list_move_tail(&obj->ring_list, &ring->active_list); + + obj->last_rendering_seqno = seqno; + if (obj->fenced_gpu_access) { + obj->last_fenced_seqno = seqno; + obj->last_fenced_ring = ring; + + /* Bump MRU to take account of the delayed flush */ + if (obj->fence_reg != I915_FENCE_REG_NONE) { + reg = &dev_priv->fence_regs[obj->fence_reg]; + list_move_tail(®->lru_list, + &dev_priv->mm.fence_list); + } + } +} + +static void +i915_gem_object_move_off_active(struct drm_i915_gem_object *obj) +{ + list_del_init(&obj->ring_list); + obj->last_rendering_seqno = 0; + obj->last_fenced_seqno = 0; +} + +static void +i915_gem_object_move_to_flushing(struct drm_i915_gem_object *obj) +{ + struct drm_device *dev = obj->base.dev; + drm_i915_private_t *dev_priv = dev->dev_private; + + KASSERT(obj->active, ("Object not active")); + list_move_tail(&obj->mm_list, &dev_priv->mm.flushing_list); + + i915_gem_object_move_off_active(obj); +} + +static void +i915_gem_object_move_to_inactive(struct drm_i915_gem_object *obj) +{ + struct drm_device *dev = obj->base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + + if (obj->pin_count != 0) + list_move_tail(&obj->mm_list, &dev_priv->mm.pinned_list); + else + list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list); + + KASSERT(list_empty(&obj->gpu_write_list), ("On gpu_write_list")); + KASSERT(obj->active, ("Object not active")); + obj->ring = NULL; + obj->last_fenced_ring = NULL; + + i915_gem_object_move_off_active(obj); + obj->fenced_gpu_access = false; + + obj->active = 0; + obj->pending_gpu_write = false; + drm_gem_object_unreference(&obj->base); + +#if 1 + KIB_NOTYET(); +#else + WARN_ON(i915_verify_lists(dev)); +#endif +} + +static void +i915_gem_object_truncate(struct drm_i915_gem_object *obj) +{ + vm_object_t vm_obj; + + vm_obj = obj->base.vm_obj; + VM_OBJECT_LOCK(vm_obj); + vm_object_page_remove(vm_obj, 0, 0, false); + VM_OBJECT_UNLOCK(vm_obj); + obj->madv = I915_MADV_PURGED_INTERNAL; +} + +static inline int +i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj) +{ + + return (obj->madv == I915_MADV_DONTNEED); +} + +static void +i915_gem_process_flushing_list(struct intel_ring_buffer *ring, + uint32_t flush_domains) +{ + struct drm_i915_gem_object *obj, *next; + uint32_t old_write_domain; + + list_for_each_entry_safe(obj, next, &ring->gpu_write_list, + gpu_write_list) { + if (obj->base.write_domain & flush_domains) { + old_write_domain = obj->base.write_domain; + obj->base.write_domain = 0; + list_del_init(&obj->gpu_write_list); + i915_gem_object_move_to_active(obj, ring, + i915_gem_next_request_seqno(ring)); + + CTR3(KTR_DRM, "object_change_domain process_flush %p %x %x", + obj, obj->base.read_domains, old_write_domain); + } + } +} + +static int +i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj) +{ + drm_i915_private_t *dev_priv; + + dev_priv = obj->base.dev->dev_private; + return (dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_9_10_17 && + obj->tiling_mode != I915_TILING_NONE); +} + +static vm_page_t +i915_gem_wire_page(vm_object_t object, vm_pindex_t pindex) +{ + vm_page_t m; + int rv; + + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); + m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_RETRY); + if (m->valid != VM_PAGE_BITS_ALL) { + if (vm_pager_has_page(object, pindex, NULL, NULL)) { + rv = vm_pager_get_pages(object, &m, 1, 0); + m = vm_page_lookup(object, pindex); + if (m == NULL) + return (NULL); + if (rv != VM_PAGER_OK) { + vm_page_lock(m); + vm_page_free(m); + vm_page_unlock(m); + return (NULL); + } + } else { + pmap_zero_page(m); + m->valid = VM_PAGE_BITS_ALL; + m->dirty = 0; + } + } + vm_page_lock(m); + vm_page_wire(m); + vm_page_unlock(m); + vm_page_wakeup(m); + atomic_add_long(&i915_gem_wired_pages_cnt, 1); + return (m); +} + +int +i915_gem_flush_ring(struct intel_ring_buffer *ring, uint32_t invalidate_domains, + uint32_t flush_domains) +{ + int ret; + + if (((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) == 0) + return 0; + + CTR3(KTR_DRM, "ring_flush %s %x %x", ring->name, invalidate_domains, + flush_domains); + ret = ring->flush(ring, invalidate_domains, flush_domains); + if (ret) + return ret; + + if (flush_domains & I915_GEM_GPU_DOMAINS) + i915_gem_process_flushing_list(ring, flush_domains); + return 0; +} + +static int +i915_ring_idle(struct intel_ring_buffer *ring, bool do_retire) +{ + int ret; + + if (list_empty(&ring->gpu_write_list) && list_empty(&ring->active_list)) + return 0; + + if (!list_empty(&ring->gpu_write_list)) { + ret = i915_gem_flush_ring(ring, I915_GEM_GPU_DOMAINS, + I915_GEM_GPU_DOMAINS); + if (ret != 0) + return ret; + } + + return (i915_wait_request(ring, i915_gem_next_request_seqno(ring), + do_retire)); +} + +int +i915_gpu_idle(struct drm_device *dev, bool do_retire) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int ret, i; + + /* Flush everything onto the inactive list. */ + for (i = 0; i < I915_NUM_RINGS; i++) { + ret = i915_ring_idle(&dev_priv->rings[i], do_retire); + if (ret) + return ret; + } + + return 0; +} + +int +i915_wait_request(struct intel_ring_buffer *ring, uint32_t seqno, bool do_retire) +{ + drm_i915_private_t *dev_priv; + struct drm_i915_gem_request *request; + uint32_t ier; + int flags, ret; + bool recovery_complete; + + KASSERT(seqno != 0, ("Zero seqno")); + + dev_priv = ring->dev->dev_private; + ret = 0; + + if (atomic_load_acq_int(&dev_priv->mm.wedged) != 0) { + /* Give the error handler a chance to run. */ + mtx_lock(&dev_priv->error_completion_lock); + recovery_complete = (&dev_priv->error_completion) > 0; + mtx_unlock(&dev_priv->error_completion_lock); + return (recovery_complete ? -EIO : -EAGAIN); + } + + if (seqno == ring->outstanding_lazy_request) { + request = malloc(sizeof(*request), DRM_I915_GEM, + M_WAITOK | M_ZERO); + if (request == NULL) + return (-ENOMEM); + + ret = i915_add_request(ring, NULL, request); + if (ret != 0) { + free(request, DRM_I915_GEM); + return (ret); + } + + seqno = request->seqno; + } + + if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) { + if (HAS_PCH_SPLIT(ring->dev)) + ier = I915_READ(DEIER) | I915_READ(GTIER); + else + ier = I915_READ(IER); + if (!ier) { + DRM_ERROR("something (likely vbetool) disabled " + "interrupts, re-enabling\n"); + ring->dev->driver->irq_preinstall(ring->dev); + ring->dev->driver->irq_postinstall(ring->dev); + } + + CTR2(KTR_DRM, "request_wait_begin %s %d", ring->name, seqno); + + ring->waiting_seqno = seqno; + mtx_lock(&ring->irq_lock); + if (ring->irq_get(ring)) { + flags = dev_priv->mm.interruptible ? PCATCH : 0; + while (!i915_seqno_passed(ring->get_seqno(ring), seqno) + && !atomic_load_acq_int(&dev_priv->mm.wedged) && + ret == 0) { + ret = -msleep(ring, &ring->irq_lock, flags, + "915gwr", 0); + } + ring->irq_put(ring); + mtx_unlock(&ring->irq_lock); + } else { + mtx_unlock(&ring->irq_lock); + if (_intel_wait_for(ring->dev, + i915_seqno_passed(ring->get_seqno(ring), seqno) || + atomic_load_acq_int(&dev_priv->mm.wedged), 3000, + 0, "i915wrq") != 0) + ret = -EBUSY; + } + ring->waiting_seqno = 0; + + CTR3(KTR_DRM, "request_wait_end %s %d %d", ring->name, seqno, + ret); + } + if (atomic_load_acq_int(&dev_priv->mm.wedged)) + ret = -EAGAIN; + + /* Directly dispatch request retiring. While we have the work queue + * to handle this, the waiter on a request often wants an associated + * buffer to have made it to the inactive list, and we would need + * a separate wait queue to handle that. + */ + if (ret == 0 && do_retire) + i915_gem_retire_requests_ring(ring); + + return (ret); +} + +static u32 +i915_gem_get_seqno(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + u32 seqno = dev_priv->next_seqno; + + /* reserve 0 for non-seqno */ + if (++dev_priv->next_seqno == 0) + dev_priv->next_seqno = 1; + + return seqno; +} + +u32 +i915_gem_next_request_seqno(struct intel_ring_buffer *ring) +{ + if (ring->outstanding_lazy_request == 0) + ring->outstanding_lazy_request = i915_gem_get_seqno(ring->dev); + + return ring->outstanding_lazy_request; +} + +int +i915_add_request(struct intel_ring_buffer *ring, struct drm_file *file, + struct drm_i915_gem_request *request) +{ + drm_i915_private_t *dev_priv; + struct drm_i915_file_private *file_priv; + uint32_t seqno; + u32 request_ring_position; + int was_empty; + int ret; + + KASSERT(request != NULL, ("NULL request in add")); + DRM_LOCK_ASSERT(ring->dev); + dev_priv = ring->dev->dev_private; + + seqno = i915_gem_next_request_seqno(ring); + request_ring_position = intel_ring_get_tail(ring); + + ret = ring->add_request(ring, &seqno); + if (ret != 0) + return ret; + + CTR2(KTR_DRM, "request_add %s %d", ring->name, seqno); + + request->seqno = seqno; + request->ring = ring; + request->tail = request_ring_position; + request->emitted_jiffies = ticks; + was_empty = list_empty(&ring->request_list); + list_add_tail(&request->list, &ring->request_list); + + if (file != NULL) { + file_priv = file->driver_priv; + + mtx_lock(&file_priv->mm.lck); + request->file_priv = file_priv; + list_add_tail(&request->client_list, + &file_priv->mm.request_list); + mtx_unlock(&file_priv->mm.lck); + } + + ring->outstanding_lazy_request = 0; + + if (!dev_priv->mm.suspended) { + if (i915_enable_hangcheck) { + callout_schedule(&dev_priv->hangcheck_timer, + DRM_I915_HANGCHECK_PERIOD); + } + if (was_empty) + taskqueue_enqueue_timeout(dev_priv->tq, + &dev_priv->mm.retire_task, hz); + } + return (0); +} + +static inline void +i915_gem_request_remove_from_client(struct drm_i915_gem_request *request) +{ + struct drm_i915_file_private *file_priv = request->file_priv; + + if (!file_priv) + return; + + DRM_LOCK_ASSERT(request->ring->dev); + + mtx_lock(&file_priv->mm.lck); + if (request->file_priv != NULL) { + list_del(&request->client_list); + request->file_priv = NULL; + } + mtx_unlock(&file_priv->mm.lck); +} + +void +i915_gem_release(struct drm_device *dev, struct drm_file *file) +{ + struct drm_i915_file_private *file_priv; + struct drm_i915_gem_request *request; + + file_priv = file->driver_priv; + + /* Clean up our request list when the client is going away, so that + * later retire_requests won't dereference our soon-to-be-gone + * file_priv. + */ + mtx_lock(&file_priv->mm.lck); + while (!list_empty(&file_priv->mm.request_list)) { + request = list_first_entry(&file_priv->mm.request_list, + struct drm_i915_gem_request, + client_list); + list_del(&request->client_list); + request->file_priv = NULL; + } + mtx_unlock(&file_priv->mm.lck); +} + +static void +i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv, + struct intel_ring_buffer *ring) +{ + + if (ring->dev != NULL) + DRM_LOCK_ASSERT(ring->dev); + + while (!list_empty(&ring->request_list)) { + struct drm_i915_gem_request *request; + + request = list_first_entry(&ring->request_list, + struct drm_i915_gem_request, list); + + list_del(&request->list); + i915_gem_request_remove_from_client(request); + free(request, DRM_I915_GEM); + } + + while (!list_empty(&ring->active_list)) { + struct drm_i915_gem_object *obj; + + obj = list_first_entry(&ring->active_list, + struct drm_i915_gem_object, ring_list); + + obj->base.write_domain = 0; + list_del_init(&obj->gpu_write_list); + i915_gem_object_move_to_inactive(obj); + } +} + +static void +i915_gem_reset_fences(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int i; + + for (i = 0; i < dev_priv->num_fence_regs; i++) { + struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i]; + struct drm_i915_gem_object *obj = reg->obj; + + if (!obj) + continue; + + if (obj->tiling_mode) + i915_gem_release_mmap(obj); + + reg->obj->fence_reg = I915_FENCE_REG_NONE; + reg->obj->fenced_gpu_access = false; + reg->obj->last_fenced_seqno = 0; + reg->obj->last_fenced_ring = NULL; + i915_gem_clear_fence_reg(dev, reg); + } +} + +void +i915_gem_reset(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_i915_gem_object *obj; + int i; + + for (i = 0; i < I915_NUM_RINGS; i++) + i915_gem_reset_ring_lists(dev_priv, &dev_priv->rings[i]); + + /* Remove anything from the flushing lists. The GPU cache is likely + * to be lost on reset along with the data, so simply move the + * lost bo to the inactive list. + */ + while (!list_empty(&dev_priv->mm.flushing_list)) { + obj = list_first_entry(&dev_priv->mm.flushing_list, + struct drm_i915_gem_object, + mm_list); + + obj->base.write_domain = 0; + list_del_init(&obj->gpu_write_list); + i915_gem_object_move_to_inactive(obj); + } + + /* Move everything out of the GPU domains to ensure we do any + * necessary invalidation upon reuse. + */ + list_for_each_entry(obj, &dev_priv->mm.inactive_list, mm_list) { + obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS; + } + + /* The fence registers are invalidated so clear them out */ + i915_gem_reset_fences(dev); +} + +/** + * This function clears the request list as sequence numbers are passed. + */ +void +i915_gem_retire_requests_ring(struct intel_ring_buffer *ring) +{ + uint32_t seqno; + int i; + + if (list_empty(&ring->request_list)) + return; + + seqno = ring->get_seqno(ring); + CTR2(KTR_DRM, "retire_request_ring %s %d", ring->name, seqno); + + for (i = 0; i < DRM_ARRAY_SIZE(ring->sync_seqno); i++) + if (seqno >= ring->sync_seqno[i]) + ring->sync_seqno[i] = 0; + + while (!list_empty(&ring->request_list)) { + struct drm_i915_gem_request *request; + + request = list_first_entry(&ring->request_list, + struct drm_i915_gem_request, + list); + + if (!i915_seqno_passed(seqno, request->seqno)) + break; + + CTR2(KTR_DRM, "retire_request_seqno_passed %s %d", + ring->name, seqno); + ring->last_retired_head = request->tail; + + list_del(&request->list); + i915_gem_request_remove_from_client(request); + free(request, DRM_I915_GEM); + } + + /* Move any buffers on the active list that are no longer referenced + * by the ringbuffer to the flushing/inactive lists as appropriate. + */ + while (!list_empty(&ring->active_list)) { + struct drm_i915_gem_object *obj; + + obj = list_first_entry(&ring->active_list, + struct drm_i915_gem_object, + ring_list); + + if (!i915_seqno_passed(seqno, obj->last_rendering_seqno)) + break; + + if (obj->base.write_domain != 0) + i915_gem_object_move_to_flushing(obj); + else + i915_gem_object_move_to_inactive(obj); + } + + if (ring->trace_irq_seqno && + i915_seqno_passed(seqno, ring->trace_irq_seqno)) { + mtx_lock(&ring->irq_lock); + ring->irq_put(ring); + mtx_unlock(&ring->irq_lock); + ring->trace_irq_seqno = 0; + } +} + +void +i915_gem_retire_requests(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_i915_gem_object *obj, *next; + int i; + + if (!list_empty(&dev_priv->mm.deferred_free_list)) { + list_for_each_entry_safe(obj, next, + &dev_priv->mm.deferred_free_list, mm_list) + i915_gem_free_object_tail(obj); + } + + for (i = 0; i < I915_NUM_RINGS; i++) + i915_gem_retire_requests_ring(&dev_priv->rings[i]); +} + +static int +sandybridge_write_fence_reg(struct drm_i915_gem_object *obj, + struct intel_ring_buffer *pipelined) +{ + struct drm_device *dev = obj->base.dev; + drm_i915_private_t *dev_priv = dev->dev_private; + u32 size = obj->gtt_space->size; + int regnum = obj->fence_reg; + uint64_t val; + + val = (uint64_t)((obj->gtt_offset + size - 4096) & + 0xfffff000) << 32; + val |= obj->gtt_offset & 0xfffff000; + val |= (uint64_t)((obj->stride / 128) - 1) << + SANDYBRIDGE_FENCE_PITCH_SHIFT; + + if (obj->tiling_mode == I915_TILING_Y) + val |= 1 << I965_FENCE_TILING_Y_SHIFT; + val |= I965_FENCE_REG_VALID; + + if (pipelined) { + int ret = intel_ring_begin(pipelined, 6); + if (ret) + return ret; + + intel_ring_emit(pipelined, MI_NOOP); + intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(2)); + intel_ring_emit(pipelined, FENCE_REG_SANDYBRIDGE_0 + regnum*8); + intel_ring_emit(pipelined, (u32)val); + intel_ring_emit(pipelined, FENCE_REG_SANDYBRIDGE_0 + regnum*8 + 4); + intel_ring_emit(pipelined, (u32)(val >> 32)); + intel_ring_advance(pipelined); + } else + I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + regnum * 8, val); + + return 0; +} + +static int +i965_write_fence_reg(struct drm_i915_gem_object *obj, + struct intel_ring_buffer *pipelined) +{ + struct drm_device *dev = obj->base.dev; + drm_i915_private_t *dev_priv = dev->dev_private; + u32 size = obj->gtt_space->size; + int regnum = obj->fence_reg; + uint64_t val; + + val = (uint64_t)((obj->gtt_offset + size - 4096) & + 0xfffff000) << 32; + val |= obj->gtt_offset & 0xfffff000; + val |= ((obj->stride / 128) - 1) << I965_FENCE_PITCH_SHIFT; + if (obj->tiling_mode == I915_TILING_Y) + val |= 1 << I965_FENCE_TILING_Y_SHIFT; + val |= I965_FENCE_REG_VALID; + + if (pipelined) { + int ret = intel_ring_begin(pipelined, 6); + if (ret) + return ret; + + intel_ring_emit(pipelined, MI_NOOP); + intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(2)); + intel_ring_emit(pipelined, FENCE_REG_965_0 + regnum*8); + intel_ring_emit(pipelined, (u32)val); + intel_ring_emit(pipelined, FENCE_REG_965_0 + regnum*8 + 4); + intel_ring_emit(pipelined, (u32)(val >> 32)); + intel_ring_advance(pipelined); + } else + I915_WRITE64(FENCE_REG_965_0 + regnum * 8, val); + + return 0; +} + +static int +i915_write_fence_reg(struct drm_i915_gem_object *obj, + struct intel_ring_buffer *pipelined) +{ + struct drm_device *dev = obj->base.dev; + drm_i915_private_t *dev_priv = dev->dev_private; + u32 size = obj->gtt_space->size; + u32 fence_reg, val, pitch_val; + int tile_width; + + if ((obj->gtt_offset & ~I915_FENCE_START_MASK) || + (size & -size) != size || (obj->gtt_offset & (size - 1))) { + printf( +"object 0x%08x [fenceable? %d] not 1M or pot-size (0x%08x) aligned\n", + obj->gtt_offset, obj->map_and_fenceable, size); + return -EINVAL; + } + + if (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev)) + tile_width = 128; + else + tile_width = 512; + + /* Note: pitch better be a power of two tile widths */ + pitch_val = obj->stride / tile_width; + pitch_val = ffs(pitch_val) - 1; + + val = obj->gtt_offset; + if (obj->tiling_mode == I915_TILING_Y) + val |= 1 << I830_FENCE_TILING_Y_SHIFT; + val |= I915_FENCE_SIZE_BITS(size); + val |= pitch_val << I830_FENCE_PITCH_SHIFT; + val |= I830_FENCE_REG_VALID; + + fence_reg = obj->fence_reg; + if (fence_reg < 8) + fence_reg = FENCE_REG_830_0 + fence_reg * 4; + else + fence_reg = FENCE_REG_945_8 + (fence_reg - 8) * 4; + + if (pipelined) { + int ret = intel_ring_begin(pipelined, 4); + if (ret) + return ret; + + intel_ring_emit(pipelined, MI_NOOP); + intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(1)); + intel_ring_emit(pipelined, fence_reg); + intel_ring_emit(pipelined, val); + intel_ring_advance(pipelined); + } else + I915_WRITE(fence_reg, val); + + return 0; +} + +static int +i830_write_fence_reg(struct drm_i915_gem_object *obj, + struct intel_ring_buffer *pipelined) +{ + struct drm_device *dev = obj->base.dev; + drm_i915_private_t *dev_priv = dev->dev_private; + u32 size = obj->gtt_space->size; + int regnum = obj->fence_reg; + uint32_t val; + uint32_t pitch_val; + + if ((obj->gtt_offset & ~I830_FENCE_START_MASK) || + (size & -size) != size || (obj->gtt_offset & (size - 1))) { + printf( +"object 0x%08x not 512K or pot-size 0x%08x aligned\n", + obj->gtt_offset, size); + return -EINVAL; + } + + pitch_val = obj->stride / 128; + pitch_val = ffs(pitch_val) - 1; + + val = obj->gtt_offset; + if (obj->tiling_mode == I915_TILING_Y) + val |= 1 << I830_FENCE_TILING_Y_SHIFT; + val |= I830_FENCE_SIZE_BITS(size); + val |= pitch_val << I830_FENCE_PITCH_SHIFT; + val |= I830_FENCE_REG_VALID; + + if (pipelined) { + int ret = intel_ring_begin(pipelined, 4); + if (ret) + return ret; + + intel_ring_emit(pipelined, MI_NOOP); + intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(1)); + intel_ring_emit(pipelined, FENCE_REG_830_0 + regnum*4); + intel_ring_emit(pipelined, val); + intel_ring_advance(pipelined); + } else + I915_WRITE(FENCE_REG_830_0 + regnum * 4, val); + + return 0; +} + +static bool ring_passed_seqno(struct intel_ring_buffer *ring, u32 seqno) +{ + return i915_seqno_passed(ring->get_seqno(ring), seqno); +} + +static int +i915_gem_object_flush_fence(struct drm_i915_gem_object *obj, + struct intel_ring_buffer *pipelined) +{ + int ret; + + if (obj->fenced_gpu_access) { + if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) { + ret = i915_gem_flush_ring(obj->last_fenced_ring, 0, + obj->base.write_domain); + if (ret) + return ret; + } + + obj->fenced_gpu_access = false; + } + + if (obj->last_fenced_seqno && pipelined != obj->last_fenced_ring) { + if (!ring_passed_seqno(obj->last_fenced_ring, + obj->last_fenced_seqno)) { + ret = i915_wait_request(obj->last_fenced_ring, + obj->last_fenced_seqno, + true); + if (ret) + return ret; + } + + obj->last_fenced_seqno = 0; + obj->last_fenced_ring = NULL; + } + + /* Ensure that all CPU reads are completed before installing a fence + * and all writes before removing the fence. + */ + if (obj->base.read_domains & I915_GEM_DOMAIN_GTT) + mb(); + + return 0; +} + +int +i915_gem_object_put_fence(struct drm_i915_gem_object *obj) +{ + int ret; + + if (obj->tiling_mode) + i915_gem_release_mmap(obj); + + ret = i915_gem_object_flush_fence(obj, NULL); + if (ret) + return ret; + + if (obj->fence_reg != I915_FENCE_REG_NONE) { + struct drm_i915_private *dev_priv = obj->base.dev->dev_private; + + if (dev_priv->fence_regs[obj->fence_reg].pin_count != 0) + printf("%s: pin_count %d\n", __func__, + dev_priv->fence_regs[obj->fence_reg].pin_count); + i915_gem_clear_fence_reg(obj->base.dev, + &dev_priv->fence_regs[obj->fence_reg]); + + obj->fence_reg = I915_FENCE_REG_NONE; + } + + return 0; +} + +static struct drm_i915_fence_reg * +i915_find_fence_reg(struct drm_device *dev, struct intel_ring_buffer *pipelined) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_i915_fence_reg *reg, *first, *avail; + int i; + + /* First try to find a free reg */ + avail = NULL; + for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) { + reg = &dev_priv->fence_regs[i]; + if (!reg->obj) + return reg; + + if (!reg->pin_count) + avail = reg; + } + + if (avail == NULL) + return NULL; + + /* None available, try to steal one or wait for a user to finish */ + avail = first = NULL; + list_for_each_entry(reg, &dev_priv->mm.fence_list, lru_list) { + if (reg->pin_count) + continue; + + if (first == NULL) + first = reg; + + if (!pipelined || + !reg->obj->last_fenced_ring || + reg->obj->last_fenced_ring == pipelined) { + avail = reg; + break; + } + } + + if (avail == NULL) + avail = first; + + return avail; +} + +int +i915_gem_object_get_fence(struct drm_i915_gem_object *obj, + struct intel_ring_buffer *pipelined) +{ + struct drm_device *dev = obj->base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_i915_fence_reg *reg; + int ret; + + pipelined = NULL; + ret = 0; + + if (obj->fence_reg != I915_FENCE_REG_NONE) { + reg = &dev_priv->fence_regs[obj->fence_reg]; + list_move_tail(®->lru_list, &dev_priv->mm.fence_list); + + if (obj->tiling_changed) { + ret = i915_gem_object_flush_fence(obj, pipelined); + if (ret) + return ret; + + if (!obj->fenced_gpu_access && !obj->last_fenced_seqno) + pipelined = NULL; + + if (pipelined) { + reg->setup_seqno = + i915_gem_next_request_seqno(pipelined); + obj->last_fenced_seqno = reg->setup_seqno; + obj->last_fenced_ring = pipelined; + } + + goto update; + } + + if (!pipelined) { + if (reg->setup_seqno) { + if (!ring_passed_seqno(obj->last_fenced_ring, + reg->setup_seqno)) { + ret = i915_wait_request( + obj->last_fenced_ring, + reg->setup_seqno, + true); + if (ret) + return ret; + } + + reg->setup_seqno = 0; + } + } else if (obj->last_fenced_ring && + obj->last_fenced_ring != pipelined) { + ret = i915_gem_object_flush_fence(obj, pipelined); + if (ret) + return ret; + } + + if (!obj->fenced_gpu_access && !obj->last_fenced_seqno) + pipelined = NULL; + KASSERT(pipelined || reg->setup_seqno == 0, ("!pipelined")); + + if (obj->tiling_changed) { + if (pipelined) { + reg->setup_seqno = + i915_gem_next_request_seqno(pipelined); + obj->last_fenced_seqno = reg->setup_seqno; + obj->last_fenced_ring = pipelined; + } + goto update; + } + + return 0; + } + + reg = i915_find_fence_reg(dev, pipelined); + if (reg == NULL) + return -EDEADLK; + + ret = i915_gem_object_flush_fence(obj, pipelined); + if (ret) + return ret; + + if (reg->obj) { + struct drm_i915_gem_object *old = reg->obj; + + drm_gem_object_reference(&old->base); + + if (old->tiling_mode) + i915_gem_release_mmap(old); + + ret = i915_gem_object_flush_fence(old, pipelined); + if (ret) { + drm_gem_object_unreference(&old->base); + return ret; + } + + if (old->last_fenced_seqno == 0 && obj->last_fenced_seqno == 0) + pipelined = NULL; + + old->fence_reg = I915_FENCE_REG_NONE; + old->last_fenced_ring = pipelined; + old->last_fenced_seqno = + pipelined ? i915_gem_next_request_seqno(pipelined) : 0; + + drm_gem_object_unreference(&old->base); + } else if (obj->last_fenced_seqno == 0) + pipelined = NULL; + + reg->obj = obj; + list_move_tail(®->lru_list, &dev_priv->mm.fence_list); + obj->fence_reg = reg - dev_priv->fence_regs; + obj->last_fenced_ring = pipelined; + + reg->setup_seqno = + pipelined ? i915_gem_next_request_seqno(pipelined) : 0; + obj->last_fenced_seqno = reg->setup_seqno; + +update: + obj->tiling_changed = false; + switch (INTEL_INFO(dev)->gen) { + case 7: + case 6: + ret = sandybridge_write_fence_reg(obj, pipelined); + break; + case 5: + case 4: + ret = i965_write_fence_reg(obj, pipelined); + break; + case 3: + ret = i915_write_fence_reg(obj, pipelined); + break; + case 2: + ret = i830_write_fence_reg(obj, pipelined); + break; + } + + return ret; +} + +static void +i915_gem_clear_fence_reg(struct drm_device *dev, struct drm_i915_fence_reg *reg) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + uint32_t fence_reg = reg - dev_priv->fence_regs; + + switch (INTEL_INFO(dev)->gen) { + case 7: + case 6: + I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + fence_reg*8, 0); + break; + case 5: + case 4: + I915_WRITE64(FENCE_REG_965_0 + fence_reg*8, 0); + break; + case 3: + if (fence_reg >= 8) + fence_reg = FENCE_REG_945_8 + (fence_reg - 8) * 4; + else + case 2: + fence_reg = FENCE_REG_830_0 + fence_reg * 4; + + I915_WRITE(fence_reg, 0); + break; + } + + list_del_init(®->lru_list); + reg->obj = NULL; + reg->setup_seqno = 0; + reg->pin_count = 0; +} + +int +i915_gem_init_object(struct drm_gem_object *obj) +{ + + printf("i915_gem_init_object called\n"); + return (0); +} + +static bool +i915_gem_object_is_inactive(struct drm_i915_gem_object *obj) +{ + + return (obj->gtt_space && !obj->active && obj->pin_count == 0); +} + +static void +i915_gem_retire_task_handler(void *arg, int pending) +{ + drm_i915_private_t *dev_priv; + struct drm_device *dev; + bool idle; + int i; + + dev_priv = arg; + dev = dev_priv->dev; + + /* Come back later if the device is busy... */ + if (!sx_try_xlock(&dev->dev_struct_lock)) { + taskqueue_enqueue_timeout(dev_priv->tq, + &dev_priv->mm.retire_task, hz); + return; + } + + CTR0(KTR_DRM, "retire_task"); + + i915_gem_retire_requests(dev); + + /* Send a periodic flush down the ring so we don't hold onto GEM + * objects indefinitely. + */ + idle = true; + for (i = 0; i < I915_NUM_RINGS; i++) { + struct intel_ring_buffer *ring = &dev_priv->rings[i]; + + if (!list_empty(&ring->gpu_write_list)) { + struct drm_i915_gem_request *request; + int ret; + + ret = i915_gem_flush_ring(ring, + 0, I915_GEM_GPU_DOMAINS); + request = malloc(sizeof(*request), DRM_I915_GEM, + M_WAITOK | M_ZERO); + if (ret || request == NULL || + i915_add_request(ring, NULL, request)) + free(request, DRM_I915_GEM); + } + + idle &= list_empty(&ring->request_list); + } + + if (!dev_priv->mm.suspended && !idle) + taskqueue_enqueue_timeout(dev_priv->tq, + &dev_priv->mm.retire_task, hz); + + DRM_UNLOCK(dev); +} + +void +i915_gem_lastclose(struct drm_device *dev) +{ + int ret; + + if (drm_core_check_feature(dev, DRIVER_MODESET)) + return; + + ret = i915_gem_idle(dev); + if (ret != 0) + DRM_ERROR("failed to idle hardware: %d\n", ret); +} + +static int +i915_gem_init_phys_object(struct drm_device *dev, int id, int size, int align) +{ + drm_i915_private_t *dev_priv; + struct drm_i915_gem_phys_object *phys_obj; + int ret; + + dev_priv = dev->dev_private; + if (dev_priv->mm.phys_objs[id - 1] != NULL || size == 0) + return (0); + + phys_obj = malloc(sizeof(struct drm_i915_gem_phys_object), DRM_I915_GEM, + M_WAITOK | M_ZERO); + + phys_obj->id = id; + + phys_obj->handle = drm_pci_alloc(dev, size, align, ~0); + if (phys_obj->handle == NULL) { + ret = -ENOMEM; + goto free_obj; + } + pmap_change_attr((vm_offset_t)phys_obj->handle->vaddr, + size / PAGE_SIZE, PAT_WRITE_COMBINING); + + dev_priv->mm.phys_objs[id - 1] = phys_obj; + + return (0); + +free_obj: + free(phys_obj, DRM_I915_GEM); + return (ret); +} + +static void +i915_gem_free_phys_object(struct drm_device *dev, int id) +{ + drm_i915_private_t *dev_priv; + struct drm_i915_gem_phys_object *phys_obj; + + dev_priv = dev->dev_private; + if (dev_priv->mm.phys_objs[id - 1] == NULL) + return; + + phys_obj = dev_priv->mm.phys_objs[id - 1]; + if (phys_obj->cur_obj != NULL) + i915_gem_detach_phys_object(dev, phys_obj->cur_obj); + + drm_pci_free(dev, phys_obj->handle); + free(phys_obj, DRM_I915_GEM); + dev_priv->mm.phys_objs[id - 1] = NULL; +} + +void +i915_gem_free_all_phys_object(struct drm_device *dev) +{ + int i; + + for (i = I915_GEM_PHYS_CURSOR_0; i <= I915_MAX_PHYS_OBJECT; i++) + i915_gem_free_phys_object(dev, i); +} + +void +i915_gem_detach_phys_object(struct drm_device *dev, + struct drm_i915_gem_object *obj) +{ + vm_page_t m; + struct sf_buf *sf; + char *vaddr, *dst; + int i, page_count; + + if (obj->phys_obj == NULL) + return; + vaddr = obj->phys_obj->handle->vaddr; + + page_count = obj->base.size / PAGE_SIZE; + VM_OBJECT_LOCK(obj->base.vm_obj); + for (i = 0; i < page_count; i++) { + m = i915_gem_wire_page(obj->base.vm_obj, i); + if (m == NULL) + continue; /* XXX */ + + VM_OBJECT_UNLOCK(obj->base.vm_obj); + sf = sf_buf_alloc(m, 0); + if (sf != NULL) { + dst = (char *)sf_buf_kva(sf); + memcpy(dst, vaddr + IDX_TO_OFF(i), PAGE_SIZE); + sf_buf_free(sf); + } + drm_clflush_pages(&m, 1); + + VM_OBJECT_LOCK(obj->base.vm_obj); + vm_page_reference(m); + vm_page_lock(m); + vm_page_dirty(m); + vm_page_unwire(m, 0); + vm_page_unlock(m); + atomic_add_long(&i915_gem_wired_pages_cnt, -1); + } + VM_OBJECT_UNLOCK(obj->base.vm_obj); + intel_gtt_chipset_flush(); + + obj->phys_obj->cur_obj = NULL; + obj->phys_obj = NULL; +} + +int +i915_gem_attach_phys_object(struct drm_device *dev, + struct drm_i915_gem_object *obj, int id, int align) +{ + drm_i915_private_t *dev_priv; + vm_page_t m; + struct sf_buf *sf; + char *dst, *src; + int i, page_count, ret; + + if (id > I915_MAX_PHYS_OBJECT) + return (-EINVAL); + + if (obj->phys_obj != NULL) { + if (obj->phys_obj->id == id) + return (0); + i915_gem_detach_phys_object(dev, obj); + } + + dev_priv = dev->dev_private; + if (dev_priv->mm.phys_objs[id - 1] == NULL) { + ret = i915_gem_init_phys_object(dev, id, obj->base.size, align); + if (ret != 0) { + DRM_ERROR("failed to init phys object %d size: %zu\n", + id, obj->base.size); + return (ret); + } + } + + /* bind to the object */ + obj->phys_obj = dev_priv->mm.phys_objs[id - 1]; + obj->phys_obj->cur_obj = obj; + + page_count = obj->base.size / PAGE_SIZE; + + VM_OBJECT_LOCK(obj->base.vm_obj); + ret = 0; + for (i = 0; i < page_count; i++) { + m = i915_gem_wire_page(obj->base.vm_obj, i); + if (m == NULL) { + ret = -EIO; + break; + } + VM_OBJECT_UNLOCK(obj->base.vm_obj); + sf = sf_buf_alloc(m, 0); + src = (char *)sf_buf_kva(sf); + dst = (char *)obj->phys_obj->handle->vaddr + IDX_TO_OFF(i); + memcpy(dst, src, PAGE_SIZE); + sf_buf_free(sf); + + VM_OBJECT_LOCK(obj->base.vm_obj); + + vm_page_reference(m); + vm_page_lock(m); + vm_page_unwire(m, 0); + vm_page_unlock(m); + atomic_add_long(&i915_gem_wired_pages_cnt, -1); + } + VM_OBJECT_UNLOCK(obj->base.vm_obj); + + return (0); +} + +static int +i915_gem_phys_pwrite(struct drm_device *dev, struct drm_i915_gem_object *obj, + uint64_t data_ptr, uint64_t offset, uint64_t size, + struct drm_file *file_priv) +{ + char *user_data, *vaddr; + int ret; + + vaddr = (char *)obj->phys_obj->handle->vaddr + offset; + user_data = (char *)(uintptr_t)data_ptr; + + if (copyin_nofault(user_data, vaddr, size) != 0) { + /* The physical object once assigned is fixed for the lifetime + * of the obj, so we can safely drop the lock and continue + * to access vaddr. + */ + DRM_UNLOCK(dev); + ret = -copyin(user_data, vaddr, size); + DRM_LOCK(dev); + if (ret != 0) + return (ret); + } + + intel_gtt_chipset_flush(); + return (0); +} + +static int +i915_gpu_is_active(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv; + + dev_priv = dev->dev_private; + return (!list_empty(&dev_priv->mm.flushing_list) || + !list_empty(&dev_priv->mm.active_list)); +} + +static void +i915_gem_lowmem(void *arg) +{ + struct drm_device *dev; + struct drm_i915_private *dev_priv; + struct drm_i915_gem_object *obj, *next; + int cnt, cnt_fail, cnt_total; + + dev = arg; + dev_priv = dev->dev_private; + + if (!sx_try_xlock(&dev->dev_struct_lock)) + return; + + CTR0(KTR_DRM, "gem_lowmem"); + +rescan: + /* first scan for clean buffers */ + i915_gem_retire_requests(dev); + + cnt_total = cnt_fail = cnt = 0; + + list_for_each_entry_safe(obj, next, &dev_priv->mm.inactive_list, + mm_list) { + if (i915_gem_object_is_purgeable(obj)) { + if (i915_gem_object_unbind(obj) != 0) + cnt_total++; + } else + cnt_total++; + } + + /* second pass, evict/count anything still on the inactive list */ + list_for_each_entry_safe(obj, next, &dev_priv->mm.inactive_list, + mm_list) { + if (i915_gem_object_unbind(obj) == 0) + cnt++; + else + cnt_fail++; + } + + if (cnt_fail > cnt_total / 100 && i915_gpu_is_active(dev)) { + /* + * We are desperate for pages, so as a last resort, wait + * for the GPU to finish and discard whatever we can. + * This has a dramatic impact to reduce the number of + * OOM-killer events whilst running the GPU aggressively. + */ + if (i915_gpu_idle(dev, true) == 0) + goto rescan; + } + DRM_UNLOCK(dev); +} + +void +i915_gem_unload(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv; + + dev_priv = dev->dev_private; + EVENTHANDLER_DEREGISTER(vm_lowmem, dev_priv->mm.i915_lowmem); +} diff --git a/sys/dev/drm2/i915/i915_gem_evict.c b/sys/dev/drm2/i915/i915_gem_evict.c new file mode 100644 index 00000000000..0d8ac80d4d7 --- /dev/null +++ b/sys/dev/drm2/i915/i915_gem_evict.c @@ -0,0 +1,213 @@ +/* + * Copyright © 2008-2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * Chris Wilson + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +static bool +mark_free(struct drm_i915_gem_object *obj, struct list_head *unwind) +{ + list_add(&obj->exec_list, unwind); + return drm_mm_scan_add_block(obj->gtt_space); +} + +int +i915_gem_evict_something(struct drm_device *dev, int min_size, + unsigned alignment, bool mappable) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct list_head eviction_list, unwind_list; + struct drm_i915_gem_object *obj; + int ret = 0; + + CTR4(KTR_DRM, "evict_something %p %d %u %d", dev, min_size, + alignment, mappable); + + /* + * The goal is to evict objects and amalgamate space in LRU order. + * The oldest idle objects reside on the inactive list, which is in + * retirement order. The next objects to retire are those on the (per + * ring) active list that do not have an outstanding flush. Once the + * hardware reports completion (the seqno is updated after the + * batchbuffer has been finished) the clean buffer objects would + * be retired to the inactive list. Any dirty objects would be added + * to the tail of the flushing list. So after processing the clean + * active objects we need to emit a MI_FLUSH to retire the flushing + * list, hence the retirement order of the flushing list is in + * advance of the dirty objects on the active lists. + * + * The retirement sequence is thus: + * 1. Inactive objects (already retired) + * 2. Clean active objects + * 3. Flushing list + * 4. Dirty active objects. + * + * On each list, the oldest objects lie at the HEAD with the freshest + * object on the TAIL. + */ + + INIT_LIST_HEAD(&unwind_list); + if (mappable) + drm_mm_init_scan_with_range(&dev_priv->mm.gtt_space, min_size, + alignment, 0, + dev_priv->mm.gtt_mappable_end); + else + drm_mm_init_scan(&dev_priv->mm.gtt_space, min_size, alignment); + + /* First see if there is a large enough contiguous idle region... */ + list_for_each_entry(obj, &dev_priv->mm.inactive_list, mm_list) { + if (mark_free(obj, &unwind_list)) + goto found; + } + + /* Now merge in the soon-to-be-expired objects... */ + list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) { + /* Does the object require an outstanding flush? */ + if (obj->base.write_domain || obj->pin_count) + continue; + + if (mark_free(obj, &unwind_list)) + goto found; + } + + /* Finally add anything with a pending flush (in order of retirement) */ + list_for_each_entry(obj, &dev_priv->mm.flushing_list, mm_list) { + if (obj->pin_count) + continue; + + if (mark_free(obj, &unwind_list)) + goto found; + } + list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) { + if (!obj->base.write_domain || obj->pin_count) + continue; + + if (mark_free(obj, &unwind_list)) + goto found; + } + + /* Nothing found, clean up and bail out! */ + while (!list_empty(&unwind_list)) { + obj = list_first_entry(&unwind_list, + struct drm_i915_gem_object, + exec_list); + + ret = drm_mm_scan_remove_block(obj->gtt_space); + KASSERT(ret == 0, ("drm_mm_scan_remove_block failed %d", ret)); + + list_del_init(&obj->exec_list); + } + + /* We expect the caller to unpin, evict all and try again, or give up. + * So calling i915_gem_evict_everything() is unnecessary. + */ + return -ENOSPC; + +found: + /* drm_mm doesn't allow any other other operations while + * scanning, therefore store to be evicted objects on a + * temporary list. */ + INIT_LIST_HEAD(&eviction_list); + while (!list_empty(&unwind_list)) { + obj = list_first_entry(&unwind_list, + struct drm_i915_gem_object, + exec_list); + if (drm_mm_scan_remove_block(obj->gtt_space)) { + list_move(&obj->exec_list, &eviction_list); + drm_gem_object_reference(&obj->base); + continue; + } + list_del_init(&obj->exec_list); + } + + /* Unbinding will emit any required flushes */ + while (!list_empty(&eviction_list)) { + obj = list_first_entry(&eviction_list, + struct drm_i915_gem_object, + exec_list); + if (ret == 0) + ret = i915_gem_object_unbind(obj); + + list_del_init(&obj->exec_list); + drm_gem_object_unreference(&obj->base); + } + + return ret; +} + +int +i915_gem_evict_everything(struct drm_device *dev, bool purgeable_only) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int ret; + bool lists_empty; + + lists_empty = (list_empty(&dev_priv->mm.inactive_list) && + list_empty(&dev_priv->mm.flushing_list) && + list_empty(&dev_priv->mm.active_list)); + if (lists_empty) + return -ENOSPC; + + CTR2(KTR_DRM, "evict_everything %p %d", dev, purgeable_only); + + /* Flush everything (on to the inactive lists) and evict */ + ret = i915_gpu_idle(dev, true); + if (ret) + return ret; + + KASSERT(list_empty(&dev_priv->mm.flushing_list), + ("flush list not empty")); + + return i915_gem_evict_inactive(dev, purgeable_only); +} + +/** Unbinds all inactive objects. */ +int +i915_gem_evict_inactive(struct drm_device *dev, bool purgeable_only) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_i915_gem_object *obj, *next; + + CTR2(KTR_DRM, "evict_inactive %p %d", dev, purgeable_only); + + list_for_each_entry_safe(obj, next, + &dev_priv->mm.inactive_list, mm_list) { + if (!purgeable_only || obj->madv != I915_MADV_WILLNEED) { + int ret = i915_gem_object_unbind(obj); + if (ret) + return ret; + } + } + + return 0; +} diff --git a/sys/dev/drm2/i915/i915_gem_execbuffer.c b/sys/dev/drm2/i915/i915_gem_execbuffer.c new file mode 100644 index 00000000000..dbd5c4e09f6 --- /dev/null +++ b/sys/dev/drm2/i915/i915_gem_execbuffer.c @@ -0,0 +1,1528 @@ +/* + * Copyright © 2008,2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * Chris Wilson + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +struct change_domains { + uint32_t invalidate_domains; + uint32_t flush_domains; + uint32_t flush_rings; + uint32_t flips; +}; + +/* + * Set the next domain for the specified object. This + * may not actually perform the necessary flushing/invaliding though, + * as that may want to be batched with other set_domain operations + * + * This is (we hope) the only really tricky part of gem. The goal + * is fairly simple -- track which caches hold bits of the object + * and make sure they remain coherent. A few concrete examples may + * help to explain how it works. For shorthand, we use the notation + * (read_domains, write_domain), e.g. (CPU, CPU) to indicate the + * a pair of read and write domain masks. + * + * Case 1: the batch buffer + * + * 1. Allocated + * 2. Written by CPU + * 3. Mapped to GTT + * 4. Read by GPU + * 5. Unmapped from GTT + * 6. Freed + * + * Let's take these a step at a time + * + * 1. Allocated + * Pages allocated from the kernel may still have + * cache contents, so we set them to (CPU, CPU) always. + * 2. Written by CPU (using pwrite) + * The pwrite function calls set_domain (CPU, CPU) and + * this function does nothing (as nothing changes) + * 3. Mapped by GTT + * This function asserts that the object is not + * currently in any GPU-based read or write domains + * 4. Read by GPU + * i915_gem_execbuffer calls set_domain (COMMAND, 0). + * As write_domain is zero, this function adds in the + * current read domains (CPU+COMMAND, 0). + * flush_domains is set to CPU. + * invalidate_domains is set to COMMAND + * clflush is run to get data out of the CPU caches + * then i915_dev_set_domain calls i915_gem_flush to + * emit an MI_FLUSH and drm_agp_chipset_flush + * 5. Unmapped from GTT + * i915_gem_object_unbind calls set_domain (CPU, CPU) + * flush_domains and invalidate_domains end up both zero + * so no flushing/invalidating happens + * 6. Freed + * yay, done + * + * Case 2: The shared render buffer + * + * 1. Allocated + * 2. Mapped to GTT + * 3. Read/written by GPU + * 4. set_domain to (CPU,CPU) + * 5. Read/written by CPU + * 6. Read/written by GPU + * + * 1. Allocated + * Same as last example, (CPU, CPU) + * 2. Mapped to GTT + * Nothing changes (assertions find that it is not in the GPU) + * 3. Read/written by GPU + * execbuffer calls set_domain (RENDER, RENDER) + * flush_domains gets CPU + * invalidate_domains gets GPU + * clflush (obj) + * MI_FLUSH and drm_agp_chipset_flush + * 4. set_domain (CPU, CPU) + * flush_domains gets GPU + * invalidate_domains gets CPU + * wait_rendering (obj) to make sure all drawing is complete. + * This will include an MI_FLUSH to get the data from GPU + * to memory + * clflush (obj) to invalidate the CPU cache + * Another MI_FLUSH in i915_gem_flush (eliminate this somehow?) + * 5. Read/written by CPU + * cache lines are loaded and dirtied + * 6. Read written by GPU + * Same as last GPU access + * + * Case 3: The constant buffer + * + * 1. Allocated + * 2. Written by CPU + * 3. Read by GPU + * 4. Updated (written) by CPU again + * 5. Read by GPU + * + * 1. Allocated + * (CPU, CPU) + * 2. Written by CPU + * (CPU, CPU) + * 3. Read by GPU + * (CPU+RENDER, 0) + * flush_domains = CPU + * invalidate_domains = RENDER + * clflush (obj) + * MI_FLUSH + * drm_agp_chipset_flush + * 4. Updated (written) by CPU again + * (CPU, CPU) + * flush_domains = 0 (no previous write domain) + * invalidate_domains = 0 (no new read domains) + * 5. Read by GPU + * (CPU+RENDER, 0) + * flush_domains = CPU + * invalidate_domains = RENDER + * clflush (obj) + * MI_FLUSH + * drm_agp_chipset_flush + */ +static void +i915_gem_object_set_to_gpu_domain(struct drm_i915_gem_object *obj, + struct intel_ring_buffer *ring, + struct change_domains *cd) +{ + uint32_t invalidate_domains = 0, flush_domains = 0; + + /* + * If the object isn't moving to a new write domain, + * let the object stay in multiple read domains + */ + if (obj->base.pending_write_domain == 0) + obj->base.pending_read_domains |= obj->base.read_domains; + + /* + * Flush the current write domain if + * the new read domains don't match. Invalidate + * any read domains which differ from the old + * write domain + */ + if (obj->base.write_domain && + (((obj->base.write_domain != obj->base.pending_read_domains || + obj->ring != ring)) || + (obj->fenced_gpu_access && !obj->pending_fenced_gpu_access))) { + flush_domains |= obj->base.write_domain; + invalidate_domains |= + obj->base.pending_read_domains & ~obj->base.write_domain; + } + /* + * Invalidate any read caches which may have + * stale data. That is, any new read domains. + */ + invalidate_domains |= obj->base.pending_read_domains & ~obj->base.read_domains; + if ((flush_domains | invalidate_domains) & I915_GEM_DOMAIN_CPU) + i915_gem_clflush_object(obj); + + if (obj->base.pending_write_domain) + cd->flips |= atomic_read(&obj->pending_flip); + + /* The actual obj->write_domain will be updated with + * pending_write_domain after we emit the accumulated flush for all + * of our domain changes in execbuffers (which clears objects' + * write_domains). So if we have a current write domain that we + * aren't changing, set pending_write_domain to that. + */ + if (flush_domains == 0 && obj->base.pending_write_domain == 0) + obj->base.pending_write_domain = obj->base.write_domain; + + cd->invalidate_domains |= invalidate_domains; + cd->flush_domains |= flush_domains; + if (flush_domains & I915_GEM_GPU_DOMAINS) + cd->flush_rings |= intel_ring_flag(obj->ring); + if (invalidate_domains & I915_GEM_GPU_DOMAINS) + cd->flush_rings |= intel_ring_flag(ring); +} + +struct eb_objects { + u_long hashmask; + LIST_HEAD(, drm_i915_gem_object) *buckets; +}; + +static struct eb_objects * +eb_create(int size) +{ + struct eb_objects *eb; + + eb = malloc(sizeof(*eb), DRM_I915_GEM, M_WAITOK | M_ZERO); + eb->buckets = hashinit(size, DRM_I915_GEM, &eb->hashmask); + return (eb); +} + +static void +eb_reset(struct eb_objects *eb) +{ + int i; + + for (i = 0; i <= eb->hashmask; i++) + LIST_INIT(&eb->buckets[i]); +} + +static void +eb_add_object(struct eb_objects *eb, struct drm_i915_gem_object *obj) +{ + + LIST_INSERT_HEAD(&eb->buckets[obj->exec_handle & eb->hashmask], + obj, exec_node); +} + +static struct drm_i915_gem_object * +eb_get_object(struct eb_objects *eb, unsigned long handle) +{ + struct drm_i915_gem_object *obj; + + LIST_FOREACH(obj, &eb->buckets[handle & eb->hashmask], exec_node) { + if (obj->exec_handle == handle) + return (obj); + } + return (NULL); +} + +static void +eb_destroy(struct eb_objects *eb) +{ + + free(eb->buckets, DRM_I915_GEM); + free(eb, DRM_I915_GEM); +} + +static int +i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj, + struct eb_objects *eb, + struct drm_i915_gem_relocation_entry *reloc) +{ + struct drm_device *dev = obj->base.dev; + struct drm_gem_object *target_obj; + uint32_t target_offset; + int ret = -EINVAL; + + /* we've already hold a reference to all valid objects */ + target_obj = &eb_get_object(eb, reloc->target_handle)->base; + if (unlikely(target_obj == NULL)) + return -ENOENT; + + target_offset = to_intel_bo(target_obj)->gtt_offset; + +#if WATCH_RELOC + DRM_INFO("%s: obj %p offset %08x target %d " + "read %08x write %08x gtt %08x " + "presumed %08x delta %08x\n", + __func__, + obj, + (int) reloc->offset, + (int) reloc->target_handle, + (int) reloc->read_domains, + (int) reloc->write_domain, + (int) target_offset, + (int) reloc->presumed_offset, + reloc->delta); +#endif + + /* The target buffer should have appeared before us in the + * exec_object list, so it should have a GTT space bound by now. + */ + if (unlikely(target_offset == 0)) { + DRM_DEBUG("No GTT space found for object %d\n", + reloc->target_handle); + return ret; + } + + /* Validate that the target is in a valid r/w GPU domain */ + if (unlikely(reloc->write_domain & (reloc->write_domain - 1))) { + DRM_DEBUG("reloc with multiple write domains: " + "obj %p target %d offset %d " + "read %08x write %08x", + obj, reloc->target_handle, + (int) reloc->offset, + reloc->read_domains, + reloc->write_domain); + return ret; + } + if (unlikely((reloc->write_domain | reloc->read_domains) + & ~I915_GEM_GPU_DOMAINS)) { + DRM_DEBUG("reloc with read/write non-GPU domains: " + "obj %p target %d offset %d " + "read %08x write %08x", + obj, reloc->target_handle, + (int) reloc->offset, + reloc->read_domains, + reloc->write_domain); + return ret; + } + if (unlikely(reloc->write_domain && target_obj->pending_write_domain && + reloc->write_domain != target_obj->pending_write_domain)) { + DRM_DEBUG("Write domain conflict: " + "obj %p target %d offset %d " + "new %08x old %08x\n", + obj, reloc->target_handle, + (int) reloc->offset, + reloc->write_domain, + target_obj->pending_write_domain); + return ret; + } + + target_obj->pending_read_domains |= reloc->read_domains; + target_obj->pending_write_domain |= reloc->write_domain; + + /* If the relocation already has the right value in it, no + * more work needs to be done. + */ + if (target_offset == reloc->presumed_offset) + return 0; + + /* Check that the relocation address is valid... */ + if (unlikely(reloc->offset > obj->base.size - 4)) { + DRM_DEBUG("Relocation beyond object bounds: " + "obj %p target %d offset %d size %d.\n", + obj, reloc->target_handle, + (int) reloc->offset, + (int) obj->base.size); + return ret; + } + if (unlikely(reloc->offset & 3)) { + DRM_DEBUG("Relocation not 4-byte aligned: " + "obj %p target %d offset %d.\n", + obj, reloc->target_handle, + (int) reloc->offset); + return ret; + } + + reloc->delta += target_offset; + if (obj->base.write_domain == I915_GEM_DOMAIN_CPU) { + uint32_t page_offset = reloc->offset & PAGE_MASK; + char *vaddr; + struct sf_buf *sf; + + sf = sf_buf_alloc(obj->pages[OFF_TO_IDX(reloc->offset)], + SFB_NOWAIT); + if (sf == NULL) + return (-ENOMEM); + vaddr = (void *)sf_buf_kva(sf); + *(uint32_t *)(vaddr + page_offset) = reloc->delta; + sf_buf_free(sf); + } else { + uint32_t *reloc_entry; + char *reloc_page; + + /* We can't wait for rendering with pagefaults disabled */ + if (obj->active && (curthread->td_pflags & TDP_NOFAULTING) != 0) + return (-EFAULT); + ret = i915_gem_object_set_to_gtt_domain(obj, 1); + if (ret) + return ret; + + /* + * Map the page containing the relocation we're going + * to perform. + */ + reloc->offset += obj->gtt_offset; + reloc_page = pmap_mapdev_attr(dev->agp->base + (reloc->offset & + ~PAGE_MASK), PAGE_SIZE, PAT_WRITE_COMBINING); + reloc_entry = (uint32_t *)(reloc_page + (reloc->offset & + PAGE_MASK)); + *(volatile uint32_t *)reloc_entry = reloc->delta; + pmap_unmapdev((vm_offset_t)reloc_page, PAGE_SIZE); + } + + /* and update the user's relocation entry */ + reloc->presumed_offset = target_offset; + + return 0; +} + +static int +i915_gem_execbuffer_relocate_object(struct drm_i915_gem_object *obj, + struct eb_objects *eb) +{ + struct drm_i915_gem_relocation_entry *user_relocs; + struct drm_i915_gem_exec_object2 *entry = obj->exec_entry; + struct drm_i915_gem_relocation_entry reloc; + int i, ret; + + user_relocs = (void *)(uintptr_t)entry->relocs_ptr; + for (i = 0; i < entry->relocation_count; i++) { + ret = -copyin_nofault(user_relocs + i, &reloc, sizeof(reloc)); + if (ret != 0) + return (ret); + + ret = i915_gem_execbuffer_relocate_entry(obj, eb, &reloc); + if (ret != 0) + return (ret); + + ret = -copyout_nofault(&reloc.presumed_offset, + &user_relocs[i].presumed_offset, + sizeof(reloc.presumed_offset)); + if (ret != 0) + return (ret); + } + + return (0); +} + +static int +i915_gem_execbuffer_relocate_object_slow(struct drm_i915_gem_object *obj, + struct eb_objects *eb, struct drm_i915_gem_relocation_entry *relocs) +{ + const struct drm_i915_gem_exec_object2 *entry = obj->exec_entry; + int i, ret; + + for (i = 0; i < entry->relocation_count; i++) { + ret = i915_gem_execbuffer_relocate_entry(obj, eb, &relocs[i]); + if (ret) + return ret; + } + + return 0; +} + +static int +i915_gem_execbuffer_relocate(struct drm_device *dev, + struct eb_objects *eb, + struct list_head *objects) +{ + struct drm_i915_gem_object *obj; + int ret, pflags; + + /* Try to move as many of the relocation targets off the active list + * to avoid unnecessary fallbacks to the slow path, as we cannot wait + * for the retirement with pagefaults disabled. + */ + i915_gem_retire_requests(dev); + + ret = 0; + pflags = vm_fault_disable_pagefaults(); + /* This is the fast path and we cannot handle a pagefault whilst + * holding the device lock lest the user pass in the relocations + * contained within a mmaped bo. For in such a case we, the page + * fault handler would call i915_gem_fault() and we would try to + * acquire the device lock again. Obviously this is bad. + */ + + list_for_each_entry(obj, objects, exec_list) { + ret = i915_gem_execbuffer_relocate_object(obj, eb); + if (ret != 0) + break; + } + vm_fault_enable_pagefaults(pflags); + return (ret); +} + +#define __EXEC_OBJECT_HAS_FENCE (1<<31) + +static int +pin_and_fence_object(struct drm_i915_gem_object *obj, + struct intel_ring_buffer *ring) +{ + struct drm_i915_gem_exec_object2 *entry = obj->exec_entry; + bool has_fenced_gpu_access = INTEL_INFO(ring->dev)->gen < 4; + bool need_fence, need_mappable; + int ret; + + need_fence = + has_fenced_gpu_access && + entry->flags & EXEC_OBJECT_NEEDS_FENCE && + obj->tiling_mode != I915_TILING_NONE; + need_mappable = + entry->relocation_count ? true : need_fence; + + ret = i915_gem_object_pin(obj, entry->alignment, need_mappable); + if (ret) + return ret; + + if (has_fenced_gpu_access) { + if (entry->flags & EXEC_OBJECT_NEEDS_FENCE) { + if (obj->tiling_mode) { + ret = i915_gem_object_get_fence(obj, ring); + if (ret) + goto err_unpin; + + entry->flags |= __EXEC_OBJECT_HAS_FENCE; + i915_gem_object_pin_fence(obj); + } else { + ret = i915_gem_object_put_fence(obj); + if (ret) + goto err_unpin; + } + obj->pending_fenced_gpu_access = true; + } + } + + entry->offset = obj->gtt_offset; + return 0; + +err_unpin: + i915_gem_object_unpin(obj); + return ret; +} + +static int +i915_gem_execbuffer_reserve(struct intel_ring_buffer *ring, + struct drm_file *file, + struct list_head *objects) +{ + drm_i915_private_t *dev_priv; + struct drm_i915_gem_object *obj; + int ret, retry; + bool has_fenced_gpu_access = INTEL_INFO(ring->dev)->gen < 4; + struct list_head ordered_objects; + + dev_priv = ring->dev->dev_private; + INIT_LIST_HEAD(&ordered_objects); + while (!list_empty(objects)) { + struct drm_i915_gem_exec_object2 *entry; + bool need_fence, need_mappable; + + obj = list_first_entry(objects, + struct drm_i915_gem_object, + exec_list); + entry = obj->exec_entry; + + need_fence = + has_fenced_gpu_access && + entry->flags & EXEC_OBJECT_NEEDS_FENCE && + obj->tiling_mode != I915_TILING_NONE; + need_mappable = + entry->relocation_count ? true : need_fence; + + if (need_mappable) + list_move(&obj->exec_list, &ordered_objects); + else + list_move_tail(&obj->exec_list, &ordered_objects); + + obj->base.pending_read_domains = 0; + obj->base.pending_write_domain = 0; + } + list_splice(&ordered_objects, objects); + + /* Attempt to pin all of the buffers into the GTT. + * This is done in 3 phases: + * + * 1a. Unbind all objects that do not match the GTT constraints for + * the execbuffer (fenceable, mappable, alignment etc). + * 1b. Increment pin count for already bound objects and obtain + * a fence register if required. + * 2. Bind new objects. + * 3. Decrement pin count. + * + * This avoid unnecessary unbinding of later objects in order to makr + * room for the earlier objects *unless* we need to defragment. + */ + retry = 0; + do { + ret = 0; + + /* Unbind any ill-fitting objects or pin. */ + list_for_each_entry(obj, objects, exec_list) { + struct drm_i915_gem_exec_object2 *entry = obj->exec_entry; + bool need_fence, need_mappable; + + if (!obj->gtt_space) + continue; + + need_fence = + has_fenced_gpu_access && + entry->flags & EXEC_OBJECT_NEEDS_FENCE && + obj->tiling_mode != I915_TILING_NONE; + need_mappable = + entry->relocation_count ? true : need_fence; + + if ((entry->alignment && obj->gtt_offset & (entry->alignment - 1)) || + (need_mappable && !obj->map_and_fenceable)) + ret = i915_gem_object_unbind(obj); + else + ret = pin_and_fence_object(obj, ring); + if (ret) + goto err; + } + + /* Bind fresh objects */ + list_for_each_entry(obj, objects, exec_list) { + if (obj->gtt_space) + continue; + + ret = pin_and_fence_object(obj, ring); + if (ret) { + int ret_ignore; + + /* This can potentially raise a harmless + * -EINVAL if we failed to bind in the above + * call. It cannot raise -EINTR since we know + * that the bo is freshly bound and so will + * not need to be flushed or waited upon. + */ + ret_ignore = i915_gem_object_unbind(obj); + (void)ret_ignore; + if (obj->gtt_space != NULL) + printf("%s: gtt_space\n", __func__); + break; + } + } + + /* Decrement pin count for bound objects */ + list_for_each_entry(obj, objects, exec_list) { + struct drm_i915_gem_exec_object2 *entry; + + if (!obj->gtt_space) + continue; + + entry = obj->exec_entry; + if (entry->flags & __EXEC_OBJECT_HAS_FENCE) { + i915_gem_object_unpin_fence(obj); + entry->flags &= ~__EXEC_OBJECT_HAS_FENCE; + } + + i915_gem_object_unpin(obj); + + /* ... and ensure ppgtt mapping exist if needed. */ + if (dev_priv->mm.aliasing_ppgtt && !obj->has_aliasing_ppgtt_mapping) { + i915_ppgtt_bind_object(dev_priv->mm.aliasing_ppgtt, + obj, obj->cache_level); + + obj->has_aliasing_ppgtt_mapping = 1; + } + } + + if (ret != -ENOSPC || retry > 1) + return ret; + + /* First attempt, just clear anything that is purgeable. + * Second attempt, clear the entire GTT. + */ + ret = i915_gem_evict_everything(ring->dev, retry == 0); + if (ret) + return ret; + + retry++; + } while (1); + +err: + list_for_each_entry_continue_reverse(obj, objects, exec_list) { + struct drm_i915_gem_exec_object2 *entry; + + if (!obj->gtt_space) + continue; + + entry = obj->exec_entry; + if (entry->flags & __EXEC_OBJECT_HAS_FENCE) { + i915_gem_object_unpin_fence(obj); + entry->flags &= ~__EXEC_OBJECT_HAS_FENCE; + } + + i915_gem_object_unpin(obj); + } + + return ret; +} + +static int +i915_gem_execbuffer_relocate_slow(struct drm_device *dev, + struct drm_file *file, struct intel_ring_buffer *ring, + struct list_head *objects, struct eb_objects *eb, + struct drm_i915_gem_exec_object2 *exec, int count) +{ + struct drm_i915_gem_relocation_entry *reloc; + struct drm_i915_gem_object *obj; + int *reloc_offset; + int i, total, ret; + + /* We may process another execbuffer during the unlock... */ + while (!list_empty(objects)) { + obj = list_first_entry(objects, + struct drm_i915_gem_object, + exec_list); + list_del_init(&obj->exec_list); + drm_gem_object_unreference(&obj->base); + } + + DRM_UNLOCK(dev); + + total = 0; + for (i = 0; i < count; i++) + total += exec[i].relocation_count; + + reloc_offset = malloc(count * sizeof(*reloc_offset), DRM_I915_GEM, + M_WAITOK | M_ZERO); + reloc = malloc(total * sizeof(*reloc), DRM_I915_GEM, M_WAITOK | M_ZERO); + + total = 0; + for (i = 0; i < count; i++) { + struct drm_i915_gem_relocation_entry *user_relocs; + + user_relocs = (void *)(uintptr_t)exec[i].relocs_ptr; + ret = -copyin(user_relocs, reloc + total, + exec[i].relocation_count * sizeof(*reloc)); + if (ret != 0) { + DRM_LOCK(dev); + goto err; + } + + reloc_offset[i] = total; + total += exec[i].relocation_count; + } + + ret = i915_mutex_lock_interruptible(dev); + if (ret) { + DRM_LOCK(dev); + goto err; + } + + /* reacquire the objects */ + eb_reset(eb); + for (i = 0; i < count; i++) { + struct drm_i915_gem_object *obj; + + obj = to_intel_bo(drm_gem_object_lookup(dev, file, + exec[i].handle)); + if (&obj->base == NULL) { + DRM_DEBUG("Invalid object handle %d at index %d\n", + exec[i].handle, i); + ret = -ENOENT; + goto err; + } + + list_add_tail(&obj->exec_list, objects); + obj->exec_handle = exec[i].handle; + obj->exec_entry = &exec[i]; + eb_add_object(eb, obj); + } + + ret = i915_gem_execbuffer_reserve(ring, file, objects); + if (ret) + goto err; + + list_for_each_entry(obj, objects, exec_list) { + int offset = obj->exec_entry - exec; + ret = i915_gem_execbuffer_relocate_object_slow(obj, eb, + reloc + reloc_offset[offset]); + if (ret) + goto err; + } + + /* Leave the user relocations as are, this is the painfully slow path, + * and we want to avoid the complication of dropping the lock whilst + * having buffers reserved in the aperture and so causing spurious + * ENOSPC for random operations. + */ + +err: + free(reloc, DRM_I915_GEM); + free(reloc_offset, DRM_I915_GEM); + return ret; +} + +static int +i915_gem_execbuffer_flush(struct drm_device *dev, + uint32_t invalidate_domains, + uint32_t flush_domains, + uint32_t flush_rings) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int i, ret; + + if (flush_domains & I915_GEM_DOMAIN_CPU) + intel_gtt_chipset_flush(); + + if (flush_domains & I915_GEM_DOMAIN_GTT) + wmb(); + + if ((flush_domains | invalidate_domains) & I915_GEM_GPU_DOMAINS) { + for (i = 0; i < I915_NUM_RINGS; i++) + if (flush_rings & (1 << i)) { + ret = i915_gem_flush_ring(&dev_priv->rings[i], + invalidate_domains, flush_domains); + if (ret) + return ret; + } + } + + return 0; +} + +static bool +intel_enable_semaphores(struct drm_device *dev) +{ + if (INTEL_INFO(dev)->gen < 6) + return 0; + + if (i915_semaphores >= 0) + return i915_semaphores; + + /* Enable semaphores on SNB when IO remapping is off */ + if (INTEL_INFO(dev)->gen == 6) + return !intel_iommu_enabled; + + return 1; +} + +static int +i915_gem_execbuffer_sync_rings(struct drm_i915_gem_object *obj, + struct intel_ring_buffer *to) +{ + struct intel_ring_buffer *from = obj->ring; + u32 seqno; + int ret, idx; + + if (from == NULL || to == from) + return 0; + + /* XXX gpu semaphores are implicated in various hard hangs on SNB */ + if (!intel_enable_semaphores(obj->base.dev)) + return i915_gem_object_wait_rendering(obj); + + idx = intel_ring_sync_index(from, to); + + seqno = obj->last_rendering_seqno; + if (seqno <= from->sync_seqno[idx]) + return 0; + + if (seqno == from->outstanding_lazy_request) { + struct drm_i915_gem_request *request; + + request = malloc(sizeof(*request), DRM_I915_GEM, + M_WAITOK | M_ZERO); + ret = i915_add_request(from, NULL, request); + if (ret) { + free(request, DRM_I915_GEM); + return ret; + } + + seqno = request->seqno; + } + + from->sync_seqno[idx] = seqno; + + return to->sync_to(to, from, seqno - 1); +} + +static int +i915_gem_execbuffer_wait_for_flips(struct intel_ring_buffer *ring, u32 flips) +{ + u32 plane, flip_mask; + int ret; + + /* Check for any pending flips. As we only maintain a flip queue depth + * of 1, we can simply insert a WAIT for the next display flip prior + * to executing the batch and avoid stalling the CPU. + */ + + for (plane = 0; flips >> plane; plane++) { + if (((flips >> plane) & 1) == 0) + continue; + + if (plane) + flip_mask = MI_WAIT_FOR_PLANE_B_FLIP; + else + flip_mask = MI_WAIT_FOR_PLANE_A_FLIP; + + ret = intel_ring_begin(ring, 2); + if (ret) + return ret; + + intel_ring_emit(ring, MI_WAIT_FOR_EVENT | flip_mask); + intel_ring_emit(ring, MI_NOOP); + intel_ring_advance(ring); + } + + return 0; +} + +static int +i915_gem_execbuffer_move_to_gpu(struct intel_ring_buffer *ring, + struct list_head *objects) +{ + struct drm_i915_gem_object *obj; + struct change_domains cd; + int ret; + + memset(&cd, 0, sizeof(cd)); + list_for_each_entry(obj, objects, exec_list) + i915_gem_object_set_to_gpu_domain(obj, ring, &cd); + + if (cd.invalidate_domains | cd.flush_domains) { +#if WATCH_EXEC + DRM_INFO("%s: invalidate_domains %08x flush_domains %08x\n", + __func__, + cd.invalidate_domains, + cd.flush_domains); +#endif + ret = i915_gem_execbuffer_flush(ring->dev, + cd.invalidate_domains, + cd.flush_domains, + cd.flush_rings); + if (ret) + return ret; + } + + if (cd.flips) { + ret = i915_gem_execbuffer_wait_for_flips(ring, cd.flips); + if (ret) + return ret; + } + + list_for_each_entry(obj, objects, exec_list) { + ret = i915_gem_execbuffer_sync_rings(obj, ring); + if (ret) + return ret; + } + + return 0; +} + +static bool +i915_gem_check_execbuffer(struct drm_i915_gem_execbuffer2 *exec) +{ + return ((exec->batch_start_offset | exec->batch_len) & 0x7) == 0; +} + +static int +validate_exec_list(struct drm_i915_gem_exec_object2 *exec, int count, + vm_page_t ***map) +{ + vm_page_t *ma; + int i, length, page_count; + + /* XXXKIB various limits checking is missing there */ + *map = malloc(count * sizeof(*ma), DRM_I915_GEM, M_WAITOK | M_ZERO); + for (i = 0; i < count; i++) { + /* First check for malicious input causing overflow */ + if (exec[i].relocation_count > + INT_MAX / sizeof(struct drm_i915_gem_relocation_entry)) + return -EINVAL; + + length = exec[i].relocation_count * + sizeof(struct drm_i915_gem_relocation_entry); + if (length == 0) { + (*map)[i] = NULL; + continue; + } + /* + * Since both start and end of the relocation region + * may be not aligned on the page boundary, be + * conservative and request a page slot for each + * partial page. Thus +2. + */ + page_count = howmany(length, PAGE_SIZE) + 2; + ma = (*map)[i] = malloc(page_count * sizeof(vm_page_t), + DRM_I915_GEM, M_WAITOK | M_ZERO); + if (vm_fault_quick_hold_pages(&curproc->p_vmspace->vm_map, + exec[i].relocs_ptr, length, VM_PROT_READ | VM_PROT_WRITE, + ma, page_count) == -1) { + free(ma, DRM_I915_GEM); + (*map)[i] = NULL; + return (-EFAULT); + } + } + + return 0; +} + +static void +i915_gem_execbuffer_move_to_active(struct list_head *objects, + struct intel_ring_buffer *ring, + u32 seqno) +{ + struct drm_i915_gem_object *obj; + uint32_t old_read, old_write; + + list_for_each_entry(obj, objects, exec_list) { + old_read = obj->base.read_domains; + old_write = obj->base.write_domain; + + obj->base.read_domains = obj->base.pending_read_domains; + obj->base.write_domain = obj->base.pending_write_domain; + obj->fenced_gpu_access = obj->pending_fenced_gpu_access; + + i915_gem_object_move_to_active(obj, ring, seqno); + if (obj->base.write_domain) { + obj->dirty = 1; + obj->pending_gpu_write = true; + list_move_tail(&obj->gpu_write_list, + &ring->gpu_write_list); + intel_mark_busy(ring->dev, obj); + } + CTR3(KTR_DRM, "object_change_domain move_to_active %p %x %x", + obj, old_read, old_write); + } +} + +int i915_gem_sync_exec_requests; + +static void +i915_gem_execbuffer_retire_commands(struct drm_device *dev, + struct drm_file *file, + struct intel_ring_buffer *ring) +{ + struct drm_i915_gem_request *request; + u32 invalidate; + + /* + * Ensure that the commands in the batch buffer are + * finished before the interrupt fires. + * + * The sampler always gets flushed on i965 (sigh). + */ + invalidate = I915_GEM_DOMAIN_COMMAND; + if (INTEL_INFO(dev)->gen >= 4) + invalidate |= I915_GEM_DOMAIN_SAMPLER; + if (ring->flush(ring, invalidate, 0)) { + i915_gem_next_request_seqno(ring); + return; + } + + /* Add a breadcrumb for the completion of the batch buffer */ + request = malloc(sizeof(*request), DRM_I915_GEM, M_WAITOK | M_ZERO); + if (request == NULL || i915_add_request(ring, file, request)) { + i915_gem_next_request_seqno(ring); + free(request, DRM_I915_GEM); + } else if (i915_gem_sync_exec_requests) + i915_wait_request(ring, request->seqno, true); +} + +static void +i915_gem_fix_mi_batchbuffer_end(struct drm_i915_gem_object *batch_obj, + uint32_t batch_start_offset, uint32_t batch_len) +{ + char *mkva; + uint64_t po_r, po_w; + uint32_t cmd; + + po_r = batch_obj->base.dev->agp->base + batch_obj->gtt_offset + + batch_start_offset + batch_len; + if (batch_len > 0) + po_r -= 4; + mkva = pmap_mapdev_attr(trunc_page(po_r), 2 * PAGE_SIZE, + PAT_WRITE_COMBINING); + po_r &= PAGE_MASK; + cmd = *(uint32_t *)(mkva + po_r); + + if (cmd != MI_BATCH_BUFFER_END) { + /* + * batch_len != 0 due to the check at the start of + * i915_gem_do_execbuffer + */ + if (batch_obj->base.size > batch_start_offset + batch_len) { + po_w = po_r + 4; +/* DRM_DEBUG("batchbuffer does not end by MI_BATCH_BUFFER_END !\n"); */ + } else { + po_w = po_r; +DRM_DEBUG("batchbuffer does not end by MI_BATCH_BUFFER_END, overwriting last bo cmd !\n"); + } + *(uint32_t *)(mkva + po_w) = MI_BATCH_BUFFER_END; + } + + pmap_unmapdev((vm_offset_t)mkva, 2 * PAGE_SIZE); +} + +int i915_fix_mi_batchbuffer_end = 0; + + static int +i915_reset_gen7_sol_offsets(struct drm_device *dev, + struct intel_ring_buffer *ring) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int ret, i; + + if (!IS_GEN7(dev) || ring != &dev_priv->rings[RCS]) + return 0; + + ret = intel_ring_begin(ring, 4 * 3); + if (ret) + return ret; + + for (i = 0; i < 4; i++) { + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); + intel_ring_emit(ring, GEN7_SO_WRITE_OFFSET(i)); + intel_ring_emit(ring, 0); + } + + intel_ring_advance(ring); + + return 0; +} + +static int +i915_gem_do_execbuffer(struct drm_device *dev, void *data, + struct drm_file *file, + struct drm_i915_gem_execbuffer2 *args, + struct drm_i915_gem_exec_object2 *exec) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct list_head objects; + struct eb_objects *eb; + struct drm_i915_gem_object *batch_obj; + struct drm_clip_rect *cliprects = NULL; + struct intel_ring_buffer *ring; + vm_page_t **relocs_ma; + u32 exec_start, exec_len; + u32 seqno; + u32 mask; + int ret, mode, i; + + if (!i915_gem_check_execbuffer(args)) { + DRM_DEBUG("execbuf with invalid offset/length\n"); + return -EINVAL; + } + + if (args->batch_len == 0) + return (0); + + ret = validate_exec_list(exec, args->buffer_count, &relocs_ma); + if (ret != 0) + goto pre_struct_lock_err; + + switch (args->flags & I915_EXEC_RING_MASK) { + case I915_EXEC_DEFAULT: + case I915_EXEC_RENDER: + ring = &dev_priv->rings[RCS]; + break; + case I915_EXEC_BSD: + if (!HAS_BSD(dev)) { + DRM_DEBUG("execbuf with invalid ring (BSD)\n"); + return -EINVAL; + } + ring = &dev_priv->rings[VCS]; + break; + case I915_EXEC_BLT: + if (!HAS_BLT(dev)) { + DRM_DEBUG("execbuf with invalid ring (BLT)\n"); + return -EINVAL; + } + ring = &dev_priv->rings[BCS]; + break; + default: + DRM_DEBUG("execbuf with unknown ring: %d\n", + (int)(args->flags & I915_EXEC_RING_MASK)); + ret = -EINVAL; + goto pre_struct_lock_err; + } + + mode = args->flags & I915_EXEC_CONSTANTS_MASK; + mask = I915_EXEC_CONSTANTS_MASK; + switch (mode) { + case I915_EXEC_CONSTANTS_REL_GENERAL: + case I915_EXEC_CONSTANTS_ABSOLUTE: + case I915_EXEC_CONSTANTS_REL_SURFACE: + if (ring == &dev_priv->rings[RCS] && + mode != dev_priv->relative_constants_mode) { + if (INTEL_INFO(dev)->gen < 4) { + ret = -EINVAL; + goto pre_struct_lock_err; + } + + if (INTEL_INFO(dev)->gen > 5 && + mode == I915_EXEC_CONSTANTS_REL_SURFACE) { + ret = -EINVAL; + goto pre_struct_lock_err; + } + + /* The HW changed the meaning on this bit on gen6 */ + if (INTEL_INFO(dev)->gen >= 6) + mask &= ~I915_EXEC_CONSTANTS_REL_SURFACE; + } + break; + default: + DRM_DEBUG("execbuf with unknown constants: %d\n", mode); + ret = -EINVAL; + goto pre_struct_lock_err; + } + + if (args->buffer_count < 1) { + DRM_DEBUG("execbuf with %d buffers\n", args->buffer_count); + ret = -EINVAL; + goto pre_struct_lock_err; + } + + if (args->num_cliprects != 0) { + if (ring != &dev_priv->rings[RCS]) { + DRM_DEBUG("clip rectangles are only valid with the render ring\n"); + ret = -EINVAL; + goto pre_struct_lock_err; + } + + if (args->num_cliprects > UINT_MAX / sizeof(*cliprects)) { + DRM_DEBUG("execbuf with %u cliprects\n", + args->num_cliprects); + ret = -EINVAL; + goto pre_struct_lock_err; + } + cliprects = malloc( sizeof(*cliprects) * args->num_cliprects, + DRM_I915_GEM, M_WAITOK | M_ZERO); + ret = -copyin((void *)(uintptr_t)args->cliprects_ptr, cliprects, + sizeof(*cliprects) * args->num_cliprects); + if (ret != 0) + goto pre_struct_lock_err; + } + + ret = i915_mutex_lock_interruptible(dev); + if (ret) + goto pre_struct_lock_err; + + if (dev_priv->mm.suspended) { + ret = -EBUSY; + goto struct_lock_err; + } + + eb = eb_create(args->buffer_count); + if (eb == NULL) { + ret = -ENOMEM; + goto struct_lock_err; + } + + /* Look up object handles */ + INIT_LIST_HEAD(&objects); + for (i = 0; i < args->buffer_count; i++) { + struct drm_i915_gem_object *obj; + obj = to_intel_bo(drm_gem_object_lookup(dev, file, + exec[i].handle)); + if (&obj->base == NULL) { + DRM_DEBUG("Invalid object handle %d at index %d\n", + exec[i].handle, i); + /* prevent error path from reading uninitialized data */ + ret = -ENOENT; + goto err; + } + + if (!list_empty(&obj->exec_list)) { + DRM_DEBUG("Object %p [handle %d, index %d] appears more than once in object list\n", + obj, exec[i].handle, i); + ret = -EINVAL; + goto err; + } + + list_add_tail(&obj->exec_list, &objects); + obj->exec_handle = exec[i].handle; + obj->exec_entry = &exec[i]; + eb_add_object(eb, obj); + } + + /* take note of the batch buffer before we might reorder the lists */ + batch_obj = list_entry(objects.prev, + struct drm_i915_gem_object, + exec_list); + + /* Move the objects en-masse into the GTT, evicting if necessary. */ + ret = i915_gem_execbuffer_reserve(ring, file, &objects); + if (ret) + goto err; + + /* The objects are in their final locations, apply the relocations. */ + ret = i915_gem_execbuffer_relocate(dev, eb, &objects); + if (ret) { + if (ret == -EFAULT) { + ret = i915_gem_execbuffer_relocate_slow(dev, file, ring, + &objects, eb, exec, args->buffer_count); + DRM_LOCK_ASSERT(dev); + } + if (ret) + goto err; + } + + /* Set the pending read domains for the batch buffer to COMMAND */ + if (batch_obj->base.pending_write_domain) { + DRM_DEBUG("Attempting to use self-modifying batch buffer\n"); + ret = -EINVAL; + goto err; + } + batch_obj->base.pending_read_domains |= I915_GEM_DOMAIN_COMMAND; + + ret = i915_gem_execbuffer_move_to_gpu(ring, &objects); + if (ret) + goto err; + + seqno = i915_gem_next_request_seqno(ring); + for (i = 0; i < I915_NUM_RINGS - 1; i++) { + if (seqno < ring->sync_seqno[i]) { + /* The GPU can not handle its semaphore value wrapping, + * so every billion or so execbuffers, we need to stall + * the GPU in order to reset the counters. + */ + ret = i915_gpu_idle(dev, true); + if (ret) + goto err; + + KASSERT(ring->sync_seqno[i] == 0, ("Non-zero sync_seqno")); + } + } + + if (ring == &dev_priv->rings[RCS] && + mode != dev_priv->relative_constants_mode) { + ret = intel_ring_begin(ring, 4); + if (ret) + goto err; + + intel_ring_emit(ring, MI_NOOP); + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); + intel_ring_emit(ring, INSTPM); + intel_ring_emit(ring, mask << 16 | mode); + intel_ring_advance(ring); + + dev_priv->relative_constants_mode = mode; + } + + if (args->flags & I915_EXEC_GEN7_SOL_RESET) { + ret = i915_reset_gen7_sol_offsets(dev, ring); + if (ret) + goto err; + } + + exec_start = batch_obj->gtt_offset + args->batch_start_offset; + exec_len = args->batch_len; + + if (i915_fix_mi_batchbuffer_end) { + i915_gem_fix_mi_batchbuffer_end(batch_obj, + args->batch_start_offset, args->batch_len); + } + + CTR4(KTR_DRM, "ring_dispatch %s %d exec %x %x", ring->name, seqno, + exec_start, exec_len); + + if (cliprects) { + for (i = 0; i < args->num_cliprects; i++) { + ret = i915_emit_box_p(dev, &cliprects[i], + args->DR1, args->DR4); + if (ret) + goto err; + + ret = ring->dispatch_execbuffer(ring, exec_start, + exec_len); + if (ret) + goto err; + } + } else { + ret = ring->dispatch_execbuffer(ring, exec_start, exec_len); + if (ret) + goto err; + } + + i915_gem_execbuffer_move_to_active(&objects, ring, seqno); + i915_gem_execbuffer_retire_commands(dev, file, ring); + +err: + eb_destroy(eb); + while (!list_empty(&objects)) { + struct drm_i915_gem_object *obj; + + obj = list_first_entry(&objects, struct drm_i915_gem_object, + exec_list); + list_del_init(&obj->exec_list); + drm_gem_object_unreference(&obj->base); + } +struct_lock_err: + DRM_UNLOCK(dev); + +pre_struct_lock_err: + for (i = 0; i < args->buffer_count; i++) { + if (relocs_ma[i] != NULL) { + vm_page_unhold_pages(relocs_ma[i], howmany( + exec[i].relocation_count * + sizeof(struct drm_i915_gem_relocation_entry), + PAGE_SIZE)); + free(relocs_ma[i], DRM_I915_GEM); + } + } + free(relocs_ma, DRM_I915_GEM); + free(cliprects, DRM_I915_GEM); + return ret; +} + +/* + * Legacy execbuffer just creates an exec2 list from the original exec object + * list array and passes it to the real function. + */ +int +i915_gem_execbuffer(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_gem_execbuffer *args = data; + struct drm_i915_gem_execbuffer2 exec2; + struct drm_i915_gem_exec_object *exec_list = NULL; + struct drm_i915_gem_exec_object2 *exec2_list = NULL; + int ret, i; + + DRM_DEBUG("buffers_ptr %d buffer_count %d len %08x\n", + (int) args->buffers_ptr, args->buffer_count, args->batch_len); + + if (args->buffer_count < 1) { + DRM_DEBUG("execbuf with %d buffers\n", args->buffer_count); + return -EINVAL; + } + + /* Copy in the exec list from userland */ + /* XXXKIB user-controlled malloc size */ + exec_list = malloc(sizeof(*exec_list) * args->buffer_count, + DRM_I915_GEM, M_WAITOK); + exec2_list = malloc(sizeof(*exec2_list) * args->buffer_count, + DRM_I915_GEM, M_WAITOK); + ret = -copyin((void *)(uintptr_t)args->buffers_ptr, exec_list, + sizeof(*exec_list) * args->buffer_count); + if (ret != 0) { + DRM_DEBUG("copy %d exec entries failed %d\n", + args->buffer_count, ret); + free(exec_list, DRM_I915_GEM); + free(exec2_list, DRM_I915_GEM); + return (ret); + } + + for (i = 0; i < args->buffer_count; i++) { + exec2_list[i].handle = exec_list[i].handle; + exec2_list[i].relocation_count = exec_list[i].relocation_count; + exec2_list[i].relocs_ptr = exec_list[i].relocs_ptr; + exec2_list[i].alignment = exec_list[i].alignment; + exec2_list[i].offset = exec_list[i].offset; + if (INTEL_INFO(dev)->gen < 4) + exec2_list[i].flags = EXEC_OBJECT_NEEDS_FENCE; + else + exec2_list[i].flags = 0; + } + + exec2.buffers_ptr = args->buffers_ptr; + exec2.buffer_count = args->buffer_count; + exec2.batch_start_offset = args->batch_start_offset; + exec2.batch_len = args->batch_len; + exec2.DR1 = args->DR1; + exec2.DR4 = args->DR4; + exec2.num_cliprects = args->num_cliprects; + exec2.cliprects_ptr = args->cliprects_ptr; + exec2.flags = I915_EXEC_RENDER; + + ret = i915_gem_do_execbuffer(dev, data, file, &exec2, exec2_list); + if (!ret) { + /* Copy the new buffer offsets back to the user's exec list. */ + for (i = 0; i < args->buffer_count; i++) + exec_list[i].offset = exec2_list[i].offset; + /* ... and back out to userspace */ + ret = -copyout(exec_list, (void *)(uintptr_t)args->buffers_ptr, + sizeof(*exec_list) * args->buffer_count); + if (ret != 0) { + DRM_DEBUG("failed to copy %d exec entries " + "back to user (%d)\n", + args->buffer_count, ret); + } + } + + free(exec_list, DRM_I915_GEM); + free(exec2_list, DRM_I915_GEM); + return ret; +} + +int +i915_gem_execbuffer2(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_gem_execbuffer2 *args = data; + struct drm_i915_gem_exec_object2 *exec2_list = NULL; + int ret; + + DRM_DEBUG("buffers_ptr %jx buffer_count %d len %08x\n", + (uintmax_t)args->buffers_ptr, args->buffer_count, args->batch_len); + + if (args->buffer_count < 1 || + args->buffer_count > UINT_MAX / sizeof(*exec2_list)) { + DRM_DEBUG("execbuf2 with %d buffers\n", args->buffer_count); + return -EINVAL; + } + + /* XXXKIB user-controllable malloc size */ + exec2_list = malloc(sizeof(*exec2_list) * args->buffer_count, + DRM_I915_GEM, M_WAITOK); + ret = -copyin((void *)(uintptr_t)args->buffers_ptr, exec2_list, + sizeof(*exec2_list) * args->buffer_count); + if (ret != 0) { + DRM_DEBUG("copy %d exec entries failed %d\n", + args->buffer_count, ret); + free(exec2_list, DRM_I915_GEM); + return (ret); + } + + ret = i915_gem_do_execbuffer(dev, data, file, args, exec2_list); + if (!ret) { + /* Copy the new buffer offsets back to the user's exec list. */ + ret = -copyout(exec2_list, (void *)(uintptr_t)args->buffers_ptr, + sizeof(*exec2_list) * args->buffer_count); + if (ret) { + DRM_DEBUG("failed to copy %d exec entries " + "back to user (%d)\n", + args->buffer_count, ret); + } + } + + free(exec2_list, DRM_I915_GEM); + return ret; +} diff --git a/sys/dev/drm2/i915/i915_gem_gtt.c b/sys/dev/drm2/i915/i915_gem_gtt.c new file mode 100644 index 00000000000..90899dede22 --- /dev/null +++ b/sys/dev/drm2/i915/i915_gem_gtt.c @@ -0,0 +1,329 @@ +/* + * Copyright © 2010 Daniel Vetter + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +/* PPGTT support for Sandybdrige/Gen6 and later */ +static void +i915_ppgtt_clear_range(struct i915_hw_ppgtt *ppgtt, + unsigned first_entry, unsigned num_entries) +{ + uint32_t *pt_vaddr; + uint32_t scratch_pte; + struct sf_buf *sf; + unsigned act_pd, first_pte, last_pte, i; + + act_pd = first_entry / I915_PPGTT_PT_ENTRIES; + first_pte = first_entry % I915_PPGTT_PT_ENTRIES; + + scratch_pte = GEN6_PTE_ADDR_ENCODE(ppgtt->scratch_page_dma_addr); + scratch_pte |= GEN6_PTE_VALID | GEN6_PTE_CACHE_LLC; + + while (num_entries) { + last_pte = first_pte + num_entries; + if (last_pte > I915_PPGTT_PT_ENTRIES) + last_pte = I915_PPGTT_PT_ENTRIES; + + sched_pin(); + sf = sf_buf_alloc(ppgtt->pt_pages[act_pd], SFB_CPUPRIVATE); + pt_vaddr = (uint32_t *)(uintptr_t)sf_buf_kva(sf); + + for (i = first_pte; i < last_pte; i++) + pt_vaddr[i] = scratch_pte; + + sf_buf_free(sf); + sched_unpin(); + + num_entries -= last_pte - first_pte; + first_pte = 0; + act_pd++; + } + +} + +int +i915_gem_init_aliasing_ppgtt(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv; + struct i915_hw_ppgtt *ppgtt; + u_int first_pd_entry_in_global_pt, i; + + dev_priv = dev->dev_private; + + /* + * ppgtt PDEs reside in the global gtt pagetable, which has 512*1024 + * entries. For aliasing ppgtt support we just steal them at the end for + * now. + */ + first_pd_entry_in_global_pt = 512 * 1024 - I915_PPGTT_PD_ENTRIES; + + ppgtt = malloc(sizeof(*ppgtt), DRM_I915_GEM, M_WAITOK | M_ZERO); + + ppgtt->num_pd_entries = I915_PPGTT_PD_ENTRIES; + ppgtt->pt_pages = malloc(sizeof(vm_page_t) * ppgtt->num_pd_entries, + DRM_I915_GEM, M_WAITOK | M_ZERO); + + for (i = 0; i < ppgtt->num_pd_entries; i++) { + ppgtt->pt_pages[i] = vm_page_alloc(NULL, 0, + VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | + VM_ALLOC_ZERO); + if (ppgtt->pt_pages[i] == NULL) { + dev_priv->mm.aliasing_ppgtt = ppgtt; + i915_gem_cleanup_aliasing_ppgtt(dev); + return (-ENOMEM); + } + } + + ppgtt->scratch_page_dma_addr = dev_priv->mm.gtt.scratch_page_dma; + + i915_ppgtt_clear_range(ppgtt, 0, ppgtt->num_pd_entries * + I915_PPGTT_PT_ENTRIES); + ppgtt->pd_offset = (first_pd_entry_in_global_pt) * sizeof(uint32_t); + dev_priv->mm.aliasing_ppgtt = ppgtt; + return (0); +} + +static void +i915_ppgtt_insert_pages(struct i915_hw_ppgtt *ppgtt, unsigned first_entry, + unsigned num_entries, vm_page_t *pages, uint32_t pte_flags) +{ + uint32_t *pt_vaddr, pte; + struct sf_buf *sf; + unsigned act_pd, first_pte; + unsigned last_pte, i; + vm_paddr_t page_addr; + + act_pd = first_entry / I915_PPGTT_PT_ENTRIES; + first_pte = first_entry % I915_PPGTT_PT_ENTRIES; + + while (num_entries) { + last_pte = first_pte + num_entries; + if (last_pte > I915_PPGTT_PT_ENTRIES) + last_pte = I915_PPGTT_PT_ENTRIES; + + sched_pin(); + sf = sf_buf_alloc(ppgtt->pt_pages[act_pd], SFB_CPUPRIVATE); + pt_vaddr = (uint32_t *)(uintptr_t)sf_buf_kva(sf); + + for (i = first_pte; i < last_pte; i++) { + page_addr = VM_PAGE_TO_PHYS(*pages); + pte = GEN6_PTE_ADDR_ENCODE(page_addr); + pt_vaddr[i] = pte | pte_flags; + + pages++; + } + + sf_buf_free(sf); + sched_unpin(); + + num_entries -= last_pte - first_pte; + first_pte = 0; + act_pd++; + } +} + +void +i915_ppgtt_bind_object(struct i915_hw_ppgtt *ppgtt, + struct drm_i915_gem_object *obj, enum i915_cache_level cache_level) +{ + struct drm_device *dev; + struct drm_i915_private *dev_priv; + uint32_t pte_flags; + + dev = obj->base.dev; + dev_priv = dev->dev_private; + pte_flags = GEN6_PTE_VALID; + + switch (cache_level) { + case I915_CACHE_LLC_MLC: + pte_flags |= GEN6_PTE_CACHE_LLC_MLC; + break; + case I915_CACHE_LLC: + pte_flags |= GEN6_PTE_CACHE_LLC; + break; + case I915_CACHE_NONE: + pte_flags |= GEN6_PTE_UNCACHED; + break; + default: + panic("cache mode"); + } + + i915_ppgtt_insert_pages(ppgtt, obj->gtt_space->start >> PAGE_SHIFT, + obj->base.size >> PAGE_SHIFT, obj->pages, pte_flags); +} + +void i915_ppgtt_unbind_object(struct i915_hw_ppgtt *ppgtt, + struct drm_i915_gem_object *obj) +{ + i915_ppgtt_clear_range(ppgtt, obj->gtt_space->start >> PAGE_SHIFT, + obj->base.size >> PAGE_SHIFT); +} + +void +i915_gem_cleanup_aliasing_ppgtt(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv; + struct i915_hw_ppgtt *ppgtt; + vm_page_t m; + int i; + + dev_priv = dev->dev_private; + ppgtt = dev_priv->mm.aliasing_ppgtt; + if (ppgtt == NULL) + return; + dev_priv->mm.aliasing_ppgtt = NULL; + + for (i = 0; i < ppgtt->num_pd_entries; i++) { + m = ppgtt->pt_pages[i]; + if (m != NULL) { + vm_page_unwire(m, 0); + vm_page_free(m); + } + } + free(ppgtt->pt_pages, DRM_I915_GEM); + free(ppgtt, DRM_I915_GEM); +} + + +static unsigned int +cache_level_to_agp_type(struct drm_device *dev, enum i915_cache_level + cache_level) +{ + + switch (cache_level) { + case I915_CACHE_LLC_MLC: + if (INTEL_INFO(dev)->gen >= 6) + return (AGP_USER_CACHED_MEMORY_LLC_MLC); + /* + * Older chipsets do not have this extra level of CPU + * cacheing, so fallthrough and request the PTE simply + * as cached. + */ + case I915_CACHE_LLC: + return (AGP_USER_CACHED_MEMORY); + + default: + case I915_CACHE_NONE: + return (AGP_USER_MEMORY); + } +} + +static bool +do_idling(struct drm_i915_private *dev_priv) +{ + bool ret = dev_priv->mm.interruptible; + + if (dev_priv->mm.gtt.do_idle_maps) { + dev_priv->mm.interruptible = false; + if (i915_gpu_idle(dev_priv->dev, false)) { + DRM_ERROR("Couldn't idle GPU\n"); + /* Wait a bit, in hopes it avoids the hang */ + DELAY(10); + } + } + + return ret; +} + +static void +undo_idling(struct drm_i915_private *dev_priv, bool interruptible) +{ + + if (dev_priv->mm.gtt.do_idle_maps) + dev_priv->mm.interruptible = interruptible; +} + +void +i915_gem_restore_gtt_mappings(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv; + struct drm_i915_gem_object *obj; + + dev_priv = dev->dev_private; + + /* First fill our portion of the GTT with scratch pages */ + intel_gtt_clear_range(dev_priv->mm.gtt_start / PAGE_SIZE, + (dev_priv->mm.gtt_end - dev_priv->mm.gtt_start) / PAGE_SIZE); + + list_for_each_entry(obj, &dev_priv->mm.gtt_list, gtt_list) { + i915_gem_clflush_object(obj); + i915_gem_gtt_rebind_object(obj, obj->cache_level); + } + + intel_gtt_chipset_flush(); +} + +int +i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj) +{ + unsigned int agp_type; + + agp_type = cache_level_to_agp_type(obj->base.dev, obj->cache_level); + intel_gtt_insert_pages(obj->gtt_space->start >> PAGE_SHIFT, + obj->base.size >> PAGE_SHIFT, obj->pages, agp_type); + return (0); +} + +void +i915_gem_gtt_rebind_object(struct drm_i915_gem_object *obj, + enum i915_cache_level cache_level) +{ + struct drm_device *dev; + struct drm_i915_private *dev_priv; + unsigned int agp_type; + + dev = obj->base.dev; + dev_priv = dev->dev_private; + agp_type = cache_level_to_agp_type(dev, cache_level); + + intel_gtt_insert_pages(obj->gtt_space->start >> PAGE_SHIFT, + obj->base.size >> PAGE_SHIFT, obj->pages, agp_type); +} + +void +i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj) +{ + struct drm_device *dev = obj->base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + bool interruptible; + + dev = obj->base.dev; + dev_priv = dev->dev_private; + + interruptible = do_idling(dev_priv); + + intel_gtt_clear_range(obj->gtt_space->start >> PAGE_SHIFT, + obj->base.size >> PAGE_SHIFT); + + undo_idling(dev_priv, interruptible); +} diff --git a/sys/dev/drm2/i915/i915_gem_tiling.c b/sys/dev/drm2/i915/i915_gem_tiling.c new file mode 100644 index 00000000000..b3d98c8768d --- /dev/null +++ b/sys/dev/drm2/i915/i915_gem_tiling.c @@ -0,0 +1,495 @@ +/* + * Copyright © 2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include + +/** @file i915_gem_tiling.c + * + * Support for managing tiling state of buffer objects. + * + * The idea behind tiling is to increase cache hit rates by rearranging + * pixel data so that a group of pixel accesses are in the same cacheline. + * Performance improvement from doing this on the back/depth buffer are on + * the order of 30%. + * + * Intel architectures make this somewhat more complicated, though, by + * adjustments made to addressing of data when the memory is in interleaved + * mode (matched pairs of DIMMS) to improve memory bandwidth. + * For interleaved memory, the CPU sends every sequential 64 bytes + * to an alternate memory channel so it can get the bandwidth from both. + * + * The GPU also rearranges its accesses for increased bandwidth to interleaved + * memory, and it matches what the CPU does for non-tiled. However, when tiled + * it does it a little differently, since one walks addresses not just in the + * X direction but also Y. So, along with alternating channels when bit + * 6 of the address flips, it also alternates when other bits flip -- Bits 9 + * (every 512 bytes, an X tile scanline) and 10 (every two X tile scanlines) + * are common to both the 915 and 965-class hardware. + * + * The CPU also sometimes XORs in higher bits as well, to improve + * bandwidth doing strided access like we do so frequently in graphics. This + * is called "Channel XOR Randomization" in the MCH documentation. The result + * is that the CPU is XORing in either bit 11 or bit 17 to bit 6 of its address + * decode. + * + * All of this bit 6 XORing has an effect on our memory management, + * as we need to make sure that the 3d driver can correctly address object + * contents. + * + * If we don't have interleaved memory, all tiling is safe and no swizzling is + * required. + * + * When bit 17 is XORed in, we simply refuse to tile at all. Bit + * 17 is not just a page offset, so as we page an objet out and back in, + * individual pages in it will have different bit 17 addresses, resulting in + * each 64 bytes being swapped with its neighbor! + * + * Otherwise, if interleaved, we have to tell the 3d driver what the address + * swizzling it needs to do is, since it's writing with the CPU to the pages + * (bit 6 and potentially bit 11 XORed in), and the GPU is reading from the + * pages (bit 6, 9, and 10 XORed in), resulting in a cumulative bit swizzling + * required by the CPU of XORing in bit 6, 9, 10, and potentially 11, in order + * to match what the GPU expects. + */ + +/** + * Detects bit 6 swizzling of address lookup between IGD access and CPU + * access through main memory. + */ +void +i915_gem_detect_bit_6_swizzle(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + uint32_t swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN; + uint32_t swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; + + if (INTEL_INFO(dev)->gen >= 6) { + uint32_t dimm_c0, dimm_c1; + dimm_c0 = I915_READ(MAD_DIMM_C0); + dimm_c1 = I915_READ(MAD_DIMM_C1); + dimm_c0 &= MAD_DIMM_A_SIZE_MASK | MAD_DIMM_B_SIZE_MASK; + dimm_c1 &= MAD_DIMM_A_SIZE_MASK | MAD_DIMM_B_SIZE_MASK; + /* Enable swizzling when the channels are populated with + * identically sized dimms. We don't need to check the 3rd + * channel because no cpu with gpu attached ships in that + * configuration. Also, swizzling only makes sense for 2 + * channels anyway. */ + if (dimm_c0 == dimm_c1) { + swizzle_x = I915_BIT_6_SWIZZLE_9_10; + swizzle_y = I915_BIT_6_SWIZZLE_9; + } else { + swizzle_x = I915_BIT_6_SWIZZLE_NONE; + swizzle_y = I915_BIT_6_SWIZZLE_NONE; + } + } else if (IS_GEN5(dev)) { + /* On Ironlake whatever DRAM config, GPU always do + * same swizzling setup. + */ + swizzle_x = I915_BIT_6_SWIZZLE_9_10; + swizzle_y = I915_BIT_6_SWIZZLE_9; + } else if (IS_GEN2(dev)) { + /* As far as we know, the 865 doesn't have these bit 6 + * swizzling issues. + */ + swizzle_x = I915_BIT_6_SWIZZLE_NONE; + swizzle_y = I915_BIT_6_SWIZZLE_NONE; + } else if (IS_MOBILE(dev) || (IS_GEN3(dev) && !IS_G33(dev))) { + uint32_t dcc; + + /* On 9xx chipsets, channel interleave by the CPU is + * determined by DCC. For single-channel, neither the CPU + * nor the GPU do swizzling. For dual channel interleaved, + * the GPU's interleave is bit 9 and 10 for X tiled, and bit + * 9 for Y tiled. The CPU's interleave is independent, and + * can be based on either bit 11 (haven't seen this yet) or + * bit 17 (common). + */ + dcc = I915_READ(DCC); + switch (dcc & DCC_ADDRESSING_MODE_MASK) { + case DCC_ADDRESSING_MODE_SINGLE_CHANNEL: + case DCC_ADDRESSING_MODE_DUAL_CHANNEL_ASYMMETRIC: + swizzle_x = I915_BIT_6_SWIZZLE_NONE; + swizzle_y = I915_BIT_6_SWIZZLE_NONE; + break; + case DCC_ADDRESSING_MODE_DUAL_CHANNEL_INTERLEAVED: + if (dcc & DCC_CHANNEL_XOR_DISABLE) { + /* This is the base swizzling by the GPU for + * tiled buffers. + */ + swizzle_x = I915_BIT_6_SWIZZLE_9_10; + swizzle_y = I915_BIT_6_SWIZZLE_9; + } else if ((dcc & DCC_CHANNEL_XOR_BIT_17) == 0) { + /* Bit 11 swizzling by the CPU in addition. */ + swizzle_x = I915_BIT_6_SWIZZLE_9_10_11; + swizzle_y = I915_BIT_6_SWIZZLE_9_11; + } else { + /* Bit 17 swizzling by the CPU in addition. */ + swizzle_x = I915_BIT_6_SWIZZLE_9_10_17; + swizzle_y = I915_BIT_6_SWIZZLE_9_17; + } + break; + } + if (dcc == 0xffffffff) { + DRM_ERROR("Couldn't read from MCHBAR. " + "Disabling tiling.\n"); + swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN; + swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; + } + } else { + /* The 965, G33, and newer, have a very flexible memory + * configuration. It will enable dual-channel mode + * (interleaving) on as much memory as it can, and the GPU + * will additionally sometimes enable different bit 6 + * swizzling for tiled objects from the CPU. + * + * Here's what I found on the G965: + * slot fill memory size swizzling + * 0A 0B 1A 1B 1-ch 2-ch + * 512 0 0 0 512 0 O + * 512 0 512 0 16 1008 X + * 512 0 0 512 16 1008 X + * 0 512 0 512 16 1008 X + * 1024 1024 1024 0 2048 1024 O + * + * We could probably detect this based on either the DRB + * matching, which was the case for the swizzling required in + * the table above, or from the 1-ch value being less than + * the minimum size of a rank. + */ + if (I915_READ16(C0DRB3) != I915_READ16(C1DRB3)) { + swizzle_x = I915_BIT_6_SWIZZLE_NONE; + swizzle_y = I915_BIT_6_SWIZZLE_NONE; + } else { + swizzle_x = I915_BIT_6_SWIZZLE_9_10; + swizzle_y = I915_BIT_6_SWIZZLE_9; + } + } + + dev_priv->mm.bit_6_swizzle_x = swizzle_x; + dev_priv->mm.bit_6_swizzle_y = swizzle_y; +} + +/* Check pitch constriants for all chips & tiling formats */ +static bool +i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) +{ + int tile_width; + + /* Linear is always fine */ + if (tiling_mode == I915_TILING_NONE) + return (true); + + if (IS_GEN2(dev) || + (tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))) + tile_width = 128; + else + tile_width = 512; + + /* check maximum stride & object size */ + if (INTEL_INFO(dev)->gen >= 4) { + /* i965 stores the end address of the gtt mapping in the fence + * reg, so dont bother to check the size */ + if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) + return (false); + } else { + if (stride > 8192) + return (false); + + if (IS_GEN3(dev)) { + if (size > I830_FENCE_MAX_SIZE_VAL << 20) + return (false); + } else { + if (size > I830_FENCE_MAX_SIZE_VAL << 19) + return (false); + } + } + + /* 965+ just needs multiples of tile width */ + if (INTEL_INFO(dev)->gen >= 4) { + if (stride & (tile_width - 1)) + return (false); + return (true); + } + + /* Pre-965 needs power of two tile widths */ + if (stride < tile_width) + return (false); + + if (stride & (stride - 1)) + return (false); + + return (true); +} + +/* Is the current GTT allocation valid for the change in tiling? */ +static bool +i915_gem_object_fence_ok(struct drm_i915_gem_object *obj, int tiling_mode) +{ + u32 size; + + if (tiling_mode == I915_TILING_NONE) + return (true); + + if (INTEL_INFO(obj->base.dev)->gen >= 4) + return (true); + + if (INTEL_INFO(obj->base.dev)->gen == 3) { + if (obj->gtt_offset & ~I915_FENCE_START_MASK) + return (false); + } else { + if (obj->gtt_offset & ~I830_FENCE_START_MASK) + return (false); + } + + /* + * Previous chips need to be aligned to the size of the smallest + * fence register that can contain the object. + */ + if (INTEL_INFO(obj->base.dev)->gen == 3) + size = 1024*1024; + else + size = 512*1024; + + while (size < obj->base.size) + size <<= 1; + + if (obj->gtt_space->size != size) + return (false); + + if (obj->gtt_offset & (size - 1)) + return (false); + + return (true); +} + +/** + * Sets the tiling mode of an object, returning the required swizzling of + * bit 6 of addresses in the object. + */ +int +i915_gem_set_tiling(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_gem_set_tiling *args = data; + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_i915_gem_object *obj; + int ret; + + ret = 0; + obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); + if (&obj->base == NULL) + return -ENOENT; + + if (!i915_tiling_ok(dev, + args->stride, obj->base.size, args->tiling_mode)) { + drm_gem_object_unreference(&obj->base); + return -EINVAL; + } + + if (obj->pin_count) { + drm_gem_object_unreference(&obj->base); + return -EBUSY; + } + + if (args->tiling_mode == I915_TILING_NONE) { + args->swizzle_mode = I915_BIT_6_SWIZZLE_NONE; + args->stride = 0; + } else { + if (args->tiling_mode == I915_TILING_X) + args->swizzle_mode = dev_priv->mm.bit_6_swizzle_x; + else + args->swizzle_mode = dev_priv->mm.bit_6_swizzle_y; + + /* Hide bit 17 swizzling from the user. This prevents old Mesa + * from aborting the application on sw fallbacks to bit 17, + * and we use the pread/pwrite bit17 paths to swizzle for it. + * If there was a user that was relying on the swizzle + * information for drm_intel_bo_map()ed reads/writes this would + * break it, but we don't have any of those. + */ + if (args->swizzle_mode == I915_BIT_6_SWIZZLE_9_17) + args->swizzle_mode = I915_BIT_6_SWIZZLE_9; + if (args->swizzle_mode == I915_BIT_6_SWIZZLE_9_10_17) + args->swizzle_mode = I915_BIT_6_SWIZZLE_9_10; + + /* If we can't handle the swizzling, make it untiled. */ + if (args->swizzle_mode == I915_BIT_6_SWIZZLE_UNKNOWN) { + args->tiling_mode = I915_TILING_NONE; + args->swizzle_mode = I915_BIT_6_SWIZZLE_NONE; + args->stride = 0; + } + } + + if (args->tiling_mode != obj->tiling_mode || + args->stride != obj->stride) { + /* We need to rebind the object if its current allocation + * no longer meets the alignment restrictions for its new + * tiling mode. Otherwise we can just leave it alone, but + * need to ensure that any fence register is cleared. + */ + i915_gem_release_mmap(obj); + + obj->map_and_fenceable = obj->gtt_space == NULL || + (obj->gtt_offset + obj->base.size <= + dev_priv->mm.gtt_mappable_end && + i915_gem_object_fence_ok(obj, args->tiling_mode)); + + /* Rebind if we need a change of alignment */ + if (!obj->map_and_fenceable) { + uint32_t unfenced_alignment = + i915_gem_get_unfenced_gtt_alignment(dev, + obj->base.size, args->tiling_mode); + if (obj->gtt_offset & (unfenced_alignment - 1)) + ret = i915_gem_object_unbind(obj); + } + if (ret == 0) { + obj->tiling_changed = true; + obj->tiling_mode = args->tiling_mode; + obj->stride = args->stride; + } + } + /* we have to maintain this existing ABI... */ + args->stride = obj->stride; + args->tiling_mode = obj->tiling_mode; + drm_gem_object_unreference(&obj->base); + + return (ret); +} + +/** + * Returns the current tiling mode and required bit 6 swizzling for the object. + */ +int +i915_gem_get_tiling(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_i915_gem_get_tiling *args = data; + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_i915_gem_object *obj; + + obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); + if (&obj->base == NULL) + return -ENOENT; + + args->tiling_mode = obj->tiling_mode; + switch (obj->tiling_mode) { + case I915_TILING_X: + args->swizzle_mode = dev_priv->mm.bit_6_swizzle_x; + break; + case I915_TILING_Y: + args->swizzle_mode = dev_priv->mm.bit_6_swizzle_y; + break; + case I915_TILING_NONE: + args->swizzle_mode = I915_BIT_6_SWIZZLE_NONE; + break; + default: + DRM_ERROR("unknown tiling mode\n"); + } + + /* Hide bit 17 from the user -- see comment in i915_gem_set_tiling */ + if (args->swizzle_mode == I915_BIT_6_SWIZZLE_9_17) + args->swizzle_mode = I915_BIT_6_SWIZZLE_9; + if (args->swizzle_mode == I915_BIT_6_SWIZZLE_9_10_17) + args->swizzle_mode = I915_BIT_6_SWIZZLE_9_10; + + drm_gem_object_unreference(&obj->base); + + return 0; +} + +/** + * Swap every 64 bytes of this page around, to account for it having a new + * bit 17 of its physical address and therefore being interpreted differently + * by the GPU. + */ +static void +i915_gem_swizzle_page(vm_page_t m) +{ + char temp[64]; + char *vaddr; + struct sf_buf *sf; + int i; + + /* XXXKIB sleep */ + sf = sf_buf_alloc(m, SFB_DEFAULT); + vaddr = (char *)sf_buf_kva(sf); + + for (i = 0; i < PAGE_SIZE; i += 128) { + memcpy(temp, &vaddr[i], 64); + memcpy(&vaddr[i], &vaddr[i + 64], 64); + memcpy(&vaddr[i + 64], temp, 64); + } + + sf_buf_free(sf); +} + +void +i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj) +{ + int page_count = obj->base.size >> PAGE_SHIFT; + int i; + + if (obj->bit_17 == NULL) + return; + + for (i = 0; i < page_count; i++) { + char new_bit_17 = VM_PAGE_TO_PHYS(obj->pages[i]) >> 17; + if ((new_bit_17 & 0x1) != + (test_bit(i, obj->bit_17) != 0)) { + i915_gem_swizzle_page(obj->pages[i]); + vm_page_dirty(obj->pages[i]); + } + } +} + +void +i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj) +{ + int page_count = obj->base.size >> PAGE_SHIFT; + int i; + + if (obj->bit_17 == NULL) { + obj->bit_17 = malloc(BITS_TO_LONGS(page_count) * + sizeof(long), DRM_I915_GEM, M_WAITOK); + } + + /* XXXKIB: review locking, atomics might be not needed there */ + for (i = 0; i < page_count; i++) { + if (VM_PAGE_TO_PHYS(obj->pages[i]) & (1 << 17)) + set_bit(i, obj->bit_17); + else + clear_bit(i, obj->bit_17); + } +} diff --git a/sys/dev/drm2/i915/i915_irq.c b/sys/dev/drm2/i915/i915_irq.c new file mode 100644 index 00000000000..52233ea1229 --- /dev/null +++ b/sys/dev/drm2/i915/i915_irq.c @@ -0,0 +1,2278 @@ +/* i915_irq.c -- IRQ support for the I915 -*- linux-c -*- + */ +/*- + * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +static void i915_capture_error_state(struct drm_device *dev); +static u32 ring_last_seqno(struct intel_ring_buffer *ring); + +/** + * Interrupts that are always left unmasked. + * + * Since pipe events are edge-triggered from the PIPESTAT register to IIR, + * we leave them always unmasked in IMR and then control enabling them through + * PIPESTAT alone. + */ +#define I915_INTERRUPT_ENABLE_FIX \ + (I915_ASLE_INTERRUPT | \ + I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | \ + I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | \ + I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | \ + I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT | \ + I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) + +/** Interrupts that we mask and unmask at runtime. */ +#define I915_INTERRUPT_ENABLE_VAR (I915_USER_INTERRUPT | I915_BSD_USER_INTERRUPT) + +#define I915_PIPE_VBLANK_STATUS (PIPE_START_VBLANK_INTERRUPT_STATUS |\ + PIPE_VBLANK_INTERRUPT_STATUS) + +#define I915_PIPE_VBLANK_ENABLE (PIPE_START_VBLANK_INTERRUPT_ENABLE |\ + PIPE_VBLANK_INTERRUPT_ENABLE) + +#define DRM_I915_VBLANK_PIPE_ALL (DRM_I915_VBLANK_PIPE_A | \ + DRM_I915_VBLANK_PIPE_B) + +/* For display hotplug interrupt */ +static void +ironlake_enable_display_irq(drm_i915_private_t *dev_priv, u32 mask) +{ + if ((dev_priv->irq_mask & mask) != 0) { + dev_priv->irq_mask &= ~mask; + I915_WRITE(DEIMR, dev_priv->irq_mask); + POSTING_READ(DEIMR); + } +} + +static inline void +ironlake_disable_display_irq(drm_i915_private_t *dev_priv, u32 mask) +{ + if ((dev_priv->irq_mask & mask) != mask) { + dev_priv->irq_mask |= mask; + I915_WRITE(DEIMR, dev_priv->irq_mask); + POSTING_READ(DEIMR); + } +} + +void +i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) +{ + if ((dev_priv->pipestat[pipe] & mask) != mask) { + u32 reg = PIPESTAT(pipe); + + dev_priv->pipestat[pipe] |= mask; + /* Enable the interrupt, clear any pending status */ + I915_WRITE(reg, dev_priv->pipestat[pipe] | (mask >> 16)); + POSTING_READ(reg); + } +} + +void +i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) +{ + if ((dev_priv->pipestat[pipe] & mask) != 0) { + u32 reg = PIPESTAT(pipe); + + dev_priv->pipestat[pipe] &= ~mask; + I915_WRITE(reg, dev_priv->pipestat[pipe]); + POSTING_READ(reg); + } +} + +/** + * intel_enable_asle - enable ASLE interrupt for OpRegion + */ +void intel_enable_asle(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + + mtx_lock(&dev_priv->irq_lock); + + if (HAS_PCH_SPLIT(dev)) + ironlake_enable_display_irq(dev_priv, DE_GSE); + else { + i915_enable_pipestat(dev_priv, 1, + PIPE_LEGACY_BLC_EVENT_ENABLE); + if (INTEL_INFO(dev)->gen >= 4) + i915_enable_pipestat(dev_priv, 0, + PIPE_LEGACY_BLC_EVENT_ENABLE); + } + + mtx_unlock(&dev_priv->irq_lock); +} + +/** + * i915_pipe_enabled - check if a pipe is enabled + * @dev: DRM device + * @pipe: pipe to check + * + * Reading certain registers when the pipe is disabled can hang the chip. + * Use this routine to make sure the PLL is running and the pipe is active + * before reading such registers if unsure. + */ +static int +i915_pipe_enabled(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + return I915_READ(PIPECONF(pipe)) & PIPECONF_ENABLE; +} + +/* Called from drm generic code, passed a 'crtc', which + * we use as a pipe index + */ +static u32 +i915_get_vblank_counter(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + unsigned long high_frame; + unsigned long low_frame; + u32 high1, high2, low; + + if (!i915_pipe_enabled(dev, pipe)) { + DRM_DEBUG("trying to get vblank count for disabled " + "pipe %c\n", pipe_name(pipe)); + return 0; + } + + high_frame = PIPEFRAME(pipe); + low_frame = PIPEFRAMEPIXEL(pipe); + + /* + * High & low register fields aren't synchronized, so make sure + * we get a low value that's stable across two reads of the high + * register. + */ + do { + high1 = I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK; + low = I915_READ(low_frame) & PIPE_FRAME_LOW_MASK; + high2 = I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK; + } while (high1 != high2); + + high1 >>= PIPE_FRAME_HIGH_SHIFT; + low >>= PIPE_FRAME_LOW_SHIFT; + return (high1 << 8) | low; +} + +static u32 +gm45_get_vblank_counter(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + int reg = PIPE_FRMCOUNT_GM45(pipe); + + if (!i915_pipe_enabled(dev, pipe)) { + DRM_DEBUG("i915: trying to get vblank count for disabled " + "pipe %c\n", pipe_name(pipe)); + return 0; + } + + return I915_READ(reg); +} + +static int +i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, + int *vpos, int *hpos) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + u32 vbl = 0, position = 0; + int vbl_start, vbl_end, htotal, vtotal; + bool in_vbl = true; + int ret = 0; + + if (!i915_pipe_enabled(dev, pipe)) { + DRM_DEBUG("i915: trying to get scanoutpos for disabled " + "pipe %c\n", pipe_name(pipe)); + return 0; + } + + /* Get vtotal. */ + vtotal = 1 + ((I915_READ(VTOTAL(pipe)) >> 16) & 0x1fff); + + if (INTEL_INFO(dev)->gen >= 4) { + /* No obvious pixelcount register. Only query vertical + * scanout position from Display scan line register. + */ + position = I915_READ(PIPEDSL(pipe)); + + /* Decode into vertical scanout position. Don't have + * horizontal scanout position. + */ + *vpos = position & 0x1fff; + *hpos = 0; + } else { + /* Have access to pixelcount since start of frame. + * We can split this into vertical and horizontal + * scanout position. + */ + position = (I915_READ(PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT; + + htotal = 1 + ((I915_READ(HTOTAL(pipe)) >> 16) & 0x1fff); + *vpos = position / htotal; + *hpos = position - (*vpos * htotal); + } + + /* Query vblank area. */ + vbl = I915_READ(VBLANK(pipe)); + + /* Test position against vblank region. */ + vbl_start = vbl & 0x1fff; + vbl_end = (vbl >> 16) & 0x1fff; + + if ((*vpos < vbl_start) || (*vpos > vbl_end)) + in_vbl = false; + + /* Inside "upper part" of vblank area? Apply corrective offset: */ + if (in_vbl && (*vpos >= vbl_start)) + *vpos = *vpos - vtotal; + + /* Readouts valid? */ + if (vbl > 0) + ret |= DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_ACCURATE; + + /* In vblank? */ + if (in_vbl) + ret |= DRM_SCANOUTPOS_INVBL; + + return ret; +} + +static int +i915_get_vblank_timestamp(struct drm_device *dev, int pipe, int *max_error, + struct timeval *vblank_time, unsigned flags) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_crtc *crtc; + + if (pipe < 0 || pipe >= dev_priv->num_pipe) { + DRM_ERROR("Invalid crtc %d\n", pipe); + return -EINVAL; + } + + /* Get drm_crtc to timestamp: */ + crtc = intel_get_crtc_for_pipe(dev, pipe); + if (crtc == NULL) { + DRM_ERROR("Invalid crtc %d\n", pipe); + return -EINVAL; + } + + if (!crtc->enabled) { +#if 0 + DRM_DEBUG("crtc %d is disabled\n", pipe); +#endif + return -EBUSY; + } + + /* Helper routine in DRM core does all the work: */ + return drm_calc_vbltimestamp_from_scanoutpos(dev, pipe, max_error, + vblank_time, flags, + crtc); +} + +/* + * Handle hotplug events outside the interrupt handler proper. + */ +static void +i915_hotplug_work_func(void *context, int pending) +{ + drm_i915_private_t *dev_priv = context; + struct drm_device *dev = dev_priv->dev; + struct drm_mode_config *mode_config; + struct intel_encoder *encoder; + + DRM_DEBUG("running encoder hotplug functions\n"); + dev_priv = context; + dev = dev_priv->dev; + + mode_config = &dev->mode_config; + + sx_xlock(&mode_config->mutex); + DRM_DEBUG_KMS("running encoder hotplug functions\n"); + + list_for_each_entry(encoder, &mode_config->encoder_list, base.head) + if (encoder->hot_plug) + encoder->hot_plug(encoder); + + sx_xunlock(&mode_config->mutex); + + /* Just fire off a uevent and let userspace tell us what to do */ +#if 0 + drm_helper_hpd_irq_event(dev); +#endif +} + +static void i915_handle_rps_change(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + u32 busy_up, busy_down, max_avg, min_avg; + u8 new_delay = dev_priv->cur_delay; + + I915_WRITE16(MEMINTRSTS, MEMINT_EVAL_CHG); + busy_up = I915_READ(RCPREVBSYTUPAVG); + busy_down = I915_READ(RCPREVBSYTDNAVG); + max_avg = I915_READ(RCBMAXAVG); + min_avg = I915_READ(RCBMINAVG); + + /* Handle RCS change request from hw */ + if (busy_up > max_avg) { + if (dev_priv->cur_delay != dev_priv->max_delay) + new_delay = dev_priv->cur_delay - 1; + if (new_delay < dev_priv->max_delay) + new_delay = dev_priv->max_delay; + } else if (busy_down < min_avg) { + if (dev_priv->cur_delay != dev_priv->min_delay) + new_delay = dev_priv->cur_delay + 1; + if (new_delay > dev_priv->min_delay) + new_delay = dev_priv->min_delay; + } + + if (ironlake_set_drps(dev, new_delay)) + dev_priv->cur_delay = new_delay; + + return; +} + +static void notify_ring(struct drm_device *dev, + struct intel_ring_buffer *ring) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 seqno; + + if (ring->obj == NULL) + return; + + seqno = ring->get_seqno(ring); + CTR2(KTR_DRM, "request_complete %s %d", ring->name, seqno); + + mtx_lock(&ring->irq_lock); + ring->irq_seqno = seqno; + wakeup(ring); + mtx_unlock(&ring->irq_lock); + + if (i915_enable_hangcheck) { + dev_priv->hangcheck_count = 0; + callout_schedule(&dev_priv->hangcheck_timer, + DRM_I915_HANGCHECK_PERIOD); + } +} + +static void +gen6_pm_rps_work_func(void *arg, int pending) +{ + struct drm_device *dev; + drm_i915_private_t *dev_priv; + u8 new_delay; + u32 pm_iir, pm_imr; + + dev_priv = (drm_i915_private_t *)arg; + dev = dev_priv->dev; + new_delay = dev_priv->cur_delay; + + mtx_lock(&dev_priv->rps_lock); + pm_iir = dev_priv->pm_iir; + dev_priv->pm_iir = 0; + pm_imr = I915_READ(GEN6_PMIMR); + I915_WRITE(GEN6_PMIMR, 0); + mtx_unlock(&dev_priv->rps_lock); + + if (!pm_iir) + return; + + DRM_LOCK(dev); + if (pm_iir & GEN6_PM_RP_UP_THRESHOLD) { + if (dev_priv->cur_delay != dev_priv->max_delay) + new_delay = dev_priv->cur_delay + 1; + if (new_delay > dev_priv->max_delay) + new_delay = dev_priv->max_delay; + } else if (pm_iir & (GEN6_PM_RP_DOWN_THRESHOLD | GEN6_PM_RP_DOWN_TIMEOUT)) { + gen6_gt_force_wake_get(dev_priv); + if (dev_priv->cur_delay != dev_priv->min_delay) + new_delay = dev_priv->cur_delay - 1; + if (new_delay < dev_priv->min_delay) { + new_delay = dev_priv->min_delay; + I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, + I915_READ(GEN6_RP_INTERRUPT_LIMITS) | + ((new_delay << 16) & 0x3f0000)); + } else { + /* Make sure we continue to get down interrupts + * until we hit the minimum frequency */ + I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, + I915_READ(GEN6_RP_INTERRUPT_LIMITS) & ~0x3f0000); + } + gen6_gt_force_wake_put(dev_priv); + } + + gen6_set_rps(dev, new_delay); + dev_priv->cur_delay = new_delay; + + /* + * rps_lock not held here because clearing is non-destructive. There is + * an *extremely* unlikely race with gen6_rps_enable() that is prevented + * by holding struct_mutex for the duration of the write. + */ + DRM_UNLOCK(dev); +} + +static void pch_irq_handler(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + u32 pch_iir; + int pipe; + + pch_iir = I915_READ(SDEIIR); + + if (pch_iir & SDE_AUDIO_POWER_MASK) + DRM_DEBUG("i915: PCH audio power change on port %d\n", + (pch_iir & SDE_AUDIO_POWER_MASK) >> + SDE_AUDIO_POWER_SHIFT); + + if (pch_iir & SDE_GMBUS) + DRM_DEBUG("i915: PCH GMBUS interrupt\n"); + + if (pch_iir & SDE_AUDIO_HDCP_MASK) + DRM_DEBUG("i915: PCH HDCP audio interrupt\n"); + + if (pch_iir & SDE_AUDIO_TRANS_MASK) + DRM_DEBUG("i915: PCH transcoder audio interrupt\n"); + + if (pch_iir & SDE_POISON) + DRM_ERROR("i915: PCH poison interrupt\n"); + + if (pch_iir & SDE_FDI_MASK) + for_each_pipe(pipe) + DRM_DEBUG(" pipe %c FDI IIR: 0x%08x\n", + pipe_name(pipe), + I915_READ(FDI_RX_IIR(pipe))); + + if (pch_iir & (SDE_TRANSB_CRC_DONE | SDE_TRANSA_CRC_DONE)) + DRM_DEBUG("i915: PCH transcoder CRC done interrupt\n"); + + if (pch_iir & (SDE_TRANSB_CRC_ERR | SDE_TRANSA_CRC_ERR)) + DRM_DEBUG("i915: PCH transcoder CRC error interrupt\n"); + + if (pch_iir & SDE_TRANSB_FIFO_UNDER) + DRM_DEBUG("i915: PCH transcoder B underrun interrupt\n"); + if (pch_iir & SDE_TRANSA_FIFO_UNDER) + DRM_DEBUG("PCH transcoder A underrun interrupt\n"); +} + +static void +ivybridge_irq_handler(void *arg) +{ + struct drm_device *dev = (struct drm_device *) arg; + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + u32 de_iir, gt_iir, de_ier, pch_iir, pm_iir; +#if 0 + struct drm_i915_master_private *master_priv; +#endif + + atomic_inc(&dev_priv->irq_received); + + /* disable master interrupt before clearing iir */ + de_ier = I915_READ(DEIER); + I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); + POSTING_READ(DEIER); + + de_iir = I915_READ(DEIIR); + gt_iir = I915_READ(GTIIR); + pch_iir = I915_READ(SDEIIR); + pm_iir = I915_READ(GEN6_PMIIR); + + CTR4(KTR_DRM, "ivybridge_irq de %x gt %x pch %x pm %x", de_iir, + gt_iir, pch_iir, pm_iir); + + if (de_iir == 0 && gt_iir == 0 && pch_iir == 0 && pm_iir == 0) + goto done; + +#if 0 + if (dev->primary->master) { + master_priv = dev->primary->master->driver_priv; + if (master_priv->sarea_priv) + master_priv->sarea_priv->last_dispatch = + READ_BREADCRUMB(dev_priv); + } +#else + if (dev_priv->sarea_priv) + dev_priv->sarea_priv->last_dispatch = + READ_BREADCRUMB(dev_priv); +#endif + + if (gt_iir & (GT_USER_INTERRUPT | GT_PIPE_NOTIFY)) + notify_ring(dev, &dev_priv->rings[RCS]); + if (gt_iir & GT_GEN6_BSD_USER_INTERRUPT) + notify_ring(dev, &dev_priv->rings[VCS]); + if (gt_iir & GT_BLT_USER_INTERRUPT) + notify_ring(dev, &dev_priv->rings[BCS]); + + if (de_iir & DE_GSE_IVB) { +#if 1 + KIB_NOTYET(); +#else + intel_opregion_gse_intr(dev); +#endif + } + + if (de_iir & DE_PLANEA_FLIP_DONE_IVB) { + intel_prepare_page_flip(dev, 0); + intel_finish_page_flip_plane(dev, 0); + } + + if (de_iir & DE_PLANEB_FLIP_DONE_IVB) { + intel_prepare_page_flip(dev, 1); + intel_finish_page_flip_plane(dev, 1); + } + + if (de_iir & DE_PIPEA_VBLANK_IVB) + drm_handle_vblank(dev, 0); + + if (de_iir & DE_PIPEB_VBLANK_IVB) + drm_handle_vblank(dev, 1); + + /* check event from PCH */ + if (de_iir & DE_PCH_EVENT_IVB) { + if (pch_iir & SDE_HOTPLUG_MASK_CPT) + taskqueue_enqueue(dev_priv->tq, &dev_priv->hotplug_task); + pch_irq_handler(dev); + } + + if (pm_iir & GEN6_PM_DEFERRED_EVENTS) { + mtx_lock(&dev_priv->rps_lock); + if ((dev_priv->pm_iir & pm_iir) != 0) + printf("Missed a PM interrupt\n"); + dev_priv->pm_iir |= pm_iir; + I915_WRITE(GEN6_PMIMR, dev_priv->pm_iir); + POSTING_READ(GEN6_PMIMR); + mtx_unlock(&dev_priv->rps_lock); + taskqueue_enqueue(dev_priv->tq, &dev_priv->rps_task); + } + + /* should clear PCH hotplug event before clear CPU irq */ + I915_WRITE(SDEIIR, pch_iir); + I915_WRITE(GTIIR, gt_iir); + I915_WRITE(DEIIR, de_iir); + I915_WRITE(GEN6_PMIIR, pm_iir); + +done: + I915_WRITE(DEIER, de_ier); + POSTING_READ(DEIER); +} + +static void +ironlake_irq_handler(void *arg) +{ + struct drm_device *dev = arg; + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + u32 de_iir, gt_iir, de_ier, pch_iir, pm_iir; + u32 hotplug_mask; +#if 0 + struct drm_i915_master_private *master_priv; +#endif + u32 bsd_usr_interrupt = GT_BSD_USER_INTERRUPT; + + atomic_inc(&dev_priv->irq_received); + + if (IS_GEN6(dev)) + bsd_usr_interrupt = GT_GEN6_BSD_USER_INTERRUPT; + + /* disable master interrupt before clearing iir */ + de_ier = I915_READ(DEIER); + I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); + POSTING_READ(DEIER); + + de_iir = I915_READ(DEIIR); + gt_iir = I915_READ(GTIIR); + pch_iir = I915_READ(SDEIIR); + pm_iir = I915_READ(GEN6_PMIIR); + + CTR4(KTR_DRM, "ironlake_irq de %x gt %x pch %x pm %x", de_iir, + gt_iir, pch_iir, pm_iir); + + if (de_iir == 0 && gt_iir == 0 && pch_iir == 0 && + (!IS_GEN6(dev) || pm_iir == 0)) + goto done; + + if (HAS_PCH_CPT(dev)) + hotplug_mask = SDE_HOTPLUG_MASK_CPT; + else + hotplug_mask = SDE_HOTPLUG_MASK; + +#if 0 + if (dev->primary->master) { + master_priv = dev->primary->master->driver_priv; + if (master_priv->sarea_priv) + master_priv->sarea_priv->last_dispatch = + READ_BREADCRUMB(dev_priv); + } +#else + if (dev_priv->sarea_priv) + dev_priv->sarea_priv->last_dispatch = + READ_BREADCRUMB(dev_priv); +#endif + + if (gt_iir & (GT_USER_INTERRUPT | GT_PIPE_NOTIFY)) + notify_ring(dev, &dev_priv->rings[RCS]); + if (gt_iir & bsd_usr_interrupt) + notify_ring(dev, &dev_priv->rings[VCS]); + if (gt_iir & GT_BLT_USER_INTERRUPT) + notify_ring(dev, &dev_priv->rings[BCS]); + + if (de_iir & DE_GSE) { +#if 1 + KIB_NOTYET(); +#else + intel_opregion_gse_intr(dev); +#endif + } + + if (de_iir & DE_PLANEA_FLIP_DONE) { + intel_prepare_page_flip(dev, 0); + intel_finish_page_flip_plane(dev, 0); + } + + if (de_iir & DE_PLANEB_FLIP_DONE) { + intel_prepare_page_flip(dev, 1); + intel_finish_page_flip_plane(dev, 1); + } + + if (de_iir & DE_PIPEA_VBLANK) + drm_handle_vblank(dev, 0); + + if (de_iir & DE_PIPEB_VBLANK) + drm_handle_vblank(dev, 1); + + /* check event from PCH */ + if (de_iir & DE_PCH_EVENT) { + if (pch_iir & hotplug_mask) + taskqueue_enqueue(dev_priv->tq, + &dev_priv->hotplug_task); + pch_irq_handler(dev); + } + + if (de_iir & DE_PCU_EVENT) { + I915_WRITE16(MEMINTRSTS, I915_READ(MEMINTRSTS)); + i915_handle_rps_change(dev); + } + + if (pm_iir & GEN6_PM_DEFERRED_EVENTS) { + mtx_lock(&dev_priv->rps_lock); + if ((dev_priv->pm_iir & pm_iir) != 0) + printf("Missed a PM interrupt\n"); + dev_priv->pm_iir |= pm_iir; + I915_WRITE(GEN6_PMIMR, dev_priv->pm_iir); + POSTING_READ(GEN6_PMIMR); + mtx_unlock(&dev_priv->rps_lock); + taskqueue_enqueue(dev_priv->tq, &dev_priv->rps_task); + } + + /* should clear PCH hotplug event before clear CPU irq */ + I915_WRITE(SDEIIR, pch_iir); + I915_WRITE(GTIIR, gt_iir); + I915_WRITE(DEIIR, de_iir); + I915_WRITE(GEN6_PMIIR, pm_iir); + +done: + I915_WRITE(DEIER, de_ier); + POSTING_READ(DEIER); +} + +/** + * i915_error_work_func - do process context error handling work + * @work: work struct + * + * Fire an error uevent so userspace can see that a hang or error + * was detected. + */ +static void +i915_error_work_func(void *context, int pending) +{ + drm_i915_private_t *dev_priv = context; + struct drm_device *dev = dev_priv->dev; + + /* kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, error_event); */ + + if (atomic_load_acq_int(&dev_priv->mm.wedged)) { + DRM_DEBUG("i915: resetting chip\n"); + /* kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, reset_event); */ + if (!i915_reset(dev, GRDOM_RENDER)) { + atomic_store_rel_int(&dev_priv->mm.wedged, 0); + /* kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, reset_done_event); */ + } + mtx_lock(&dev_priv->error_completion_lock); + dev_priv->error_completion++; + wakeup(&dev_priv->error_completion); + mtx_unlock(&dev_priv->error_completion_lock); + } +} + +static void i915_report_and_clear_eir(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 eir = I915_READ(EIR); + int pipe; + + if (!eir) + return; + + printf("i915: render error detected, EIR: 0x%08x\n", eir); + + if (IS_G4X(dev)) { + if (eir & (GM45_ERROR_MEM_PRIV | GM45_ERROR_CP_PRIV)) { + u32 ipeir = I915_READ(IPEIR_I965); + + printf(" IPEIR: 0x%08x\n", + I915_READ(IPEIR_I965)); + printf(" IPEHR: 0x%08x\n", + I915_READ(IPEHR_I965)); + printf(" INSTDONE: 0x%08x\n", + I915_READ(INSTDONE_I965)); + printf(" INSTPS: 0x%08x\n", + I915_READ(INSTPS)); + printf(" INSTDONE1: 0x%08x\n", + I915_READ(INSTDONE1)); + printf(" ACTHD: 0x%08x\n", + I915_READ(ACTHD_I965)); + I915_WRITE(IPEIR_I965, ipeir); + POSTING_READ(IPEIR_I965); + } + if (eir & GM45_ERROR_PAGE_TABLE) { + u32 pgtbl_err = I915_READ(PGTBL_ER); + printf("page table error\n"); + printf(" PGTBL_ER: 0x%08x\n", + pgtbl_err); + I915_WRITE(PGTBL_ER, pgtbl_err); + POSTING_READ(PGTBL_ER); + } + } + + if (!IS_GEN2(dev)) { + if (eir & I915_ERROR_PAGE_TABLE) { + u32 pgtbl_err = I915_READ(PGTBL_ER); + printf("page table error\n"); + printf(" PGTBL_ER: 0x%08x\n", + pgtbl_err); + I915_WRITE(PGTBL_ER, pgtbl_err); + POSTING_READ(PGTBL_ER); + } + } + + if (eir & I915_ERROR_MEMORY_REFRESH) { + printf("memory refresh error:\n"); + for_each_pipe(pipe) + printf("pipe %c stat: 0x%08x\n", + pipe_name(pipe), I915_READ(PIPESTAT(pipe))); + /* pipestat has already been acked */ + } + if (eir & I915_ERROR_INSTRUCTION) { + printf("instruction error\n"); + printf(" INSTPM: 0x%08x\n", + I915_READ(INSTPM)); + if (INTEL_INFO(dev)->gen < 4) { + u32 ipeir = I915_READ(IPEIR); + + printf(" IPEIR: 0x%08x\n", + I915_READ(IPEIR)); + printf(" IPEHR: 0x%08x\n", + I915_READ(IPEHR)); + printf(" INSTDONE: 0x%08x\n", + I915_READ(INSTDONE)); + printf(" ACTHD: 0x%08x\n", + I915_READ(ACTHD)); + I915_WRITE(IPEIR, ipeir); + POSTING_READ(IPEIR); + } else { + u32 ipeir = I915_READ(IPEIR_I965); + + printf(" IPEIR: 0x%08x\n", + I915_READ(IPEIR_I965)); + printf(" IPEHR: 0x%08x\n", + I915_READ(IPEHR_I965)); + printf(" INSTDONE: 0x%08x\n", + I915_READ(INSTDONE_I965)); + printf(" INSTPS: 0x%08x\n", + I915_READ(INSTPS)); + printf(" INSTDONE1: 0x%08x\n", + I915_READ(INSTDONE1)); + printf(" ACTHD: 0x%08x\n", + I915_READ(ACTHD_I965)); + I915_WRITE(IPEIR_I965, ipeir); + POSTING_READ(IPEIR_I965); + } + } + + I915_WRITE(EIR, eir); + POSTING_READ(EIR); + eir = I915_READ(EIR); + if (eir) { + /* + * some errors might have become stuck, + * mask them. + */ + DRM_ERROR("EIR stuck: 0x%08x, masking\n", eir); + I915_WRITE(EMR, I915_READ(EMR) | eir); + I915_WRITE(IIR, I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT); + } +} + +/** + * i915_handle_error - handle an error interrupt + * @dev: drm device + * + * Do some basic checking of regsiter state at error interrupt time and + * dump it to the syslog. Also call i915_capture_error_state() to make + * sure we get a record and make it available in debugfs. Fire a uevent + * so userspace knows something bad happened (should trigger collection + * of a ring dump etc.). + */ +void i915_handle_error(struct drm_device *dev, bool wedged) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + i915_capture_error_state(dev); + i915_report_and_clear_eir(dev); + + if (wedged) { + mtx_lock(&dev_priv->error_completion_lock); + dev_priv->error_completion = 0; + dev_priv->mm.wedged = 1; + /* unlock acts as rel barrier for store to wedged */ + mtx_unlock(&dev_priv->error_completion_lock); + + /* + * Wakeup waiting processes so they don't hang + */ + mtx_lock(&dev_priv->rings[RCS].irq_lock); + wakeup(&dev_priv->rings[RCS]); + mtx_unlock(&dev_priv->rings[RCS].irq_lock); + if (HAS_BSD(dev)) { + mtx_lock(&dev_priv->rings[VCS].irq_lock); + wakeup(&dev_priv->rings[VCS]); + mtx_unlock(&dev_priv->rings[VCS].irq_lock); + } + if (HAS_BLT(dev)) { + mtx_lock(&dev_priv->rings[BCS].irq_lock); + wakeup(&dev_priv->rings[BCS]); + mtx_unlock(&dev_priv->rings[BCS].irq_lock); + } + } + + taskqueue_enqueue(dev_priv->tq, &dev_priv->error_task); +} + +static void i915_pageflip_stall_check(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct drm_i915_gem_object *obj; + struct intel_unpin_work *work; + bool stall_detected; + + /* Ignore early vblank irqs */ + if (intel_crtc == NULL) + return; + + mtx_lock(&dev->event_lock); + work = intel_crtc->unpin_work; + + if (work == NULL || work->pending || !work->enable_stall_check) { + /* Either the pending flip IRQ arrived, or we're too early. Don't check */ + mtx_unlock(&dev->event_lock); + return; + } + + /* Potential stall - if we see that the flip has happened, assume a missed interrupt */ + obj = work->pending_flip_obj; + if (INTEL_INFO(dev)->gen >= 4) { + int dspsurf = DSPSURF(intel_crtc->plane); + stall_detected = I915_READ(dspsurf) == obj->gtt_offset; + } else { + int dspaddr = DSPADDR(intel_crtc->plane); + stall_detected = I915_READ(dspaddr) == (obj->gtt_offset + + crtc->y * crtc->fb->pitches[0] + + crtc->x * crtc->fb->bits_per_pixel/8); + } + + mtx_unlock(&dev->event_lock); + + if (stall_detected) { + DRM_DEBUG("Pageflip stall detected\n"); + intel_prepare_page_flip(dev, intel_crtc->plane); + } +} + +static void +i915_driver_irq_handler(void *arg) +{ + struct drm_device *dev = (struct drm_device *)arg; + drm_i915_private_t *dev_priv = (drm_i915_private_t *)dev->dev_private; +#if 0 + struct drm_i915_master_private *master_priv; +#endif + u32 iir, new_iir; + u32 pipe_stats[I915_MAX_PIPES]; + u32 vblank_status; + int vblank = 0; + int irq_received; + int pipe; + bool blc_event = false; + + atomic_inc(&dev_priv->irq_received); + + iir = I915_READ(IIR); + + CTR1(KTR_DRM, "driver_irq_handler %x", iir); + + if (INTEL_INFO(dev)->gen >= 4) + vblank_status = PIPE_START_VBLANK_INTERRUPT_STATUS; + else + vblank_status = PIPE_VBLANK_INTERRUPT_STATUS; + + for (;;) { + irq_received = iir != 0; + + /* Can't rely on pipestat interrupt bit in iir as it might + * have been cleared after the pipestat interrupt was received. + * It doesn't set the bit in iir again, but it still produces + * interrupts (for non-MSI). + */ + mtx_lock(&dev_priv->irq_lock); + if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) + i915_handle_error(dev, false); + + for_each_pipe(pipe) { + int reg = PIPESTAT(pipe); + pipe_stats[pipe] = I915_READ(reg); + + /* + * Clear the PIPE*STAT regs before the IIR + */ + if (pipe_stats[pipe] & 0x8000ffff) { + if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS) + DRM_DEBUG("pipe %c underrun\n", + pipe_name(pipe)); + I915_WRITE(reg, pipe_stats[pipe]); + irq_received = 1; + } + } + mtx_unlock(&dev_priv->irq_lock); + + if (!irq_received) + break; + + /* Consume port. Then clear IIR or we'll miss events */ + if ((I915_HAS_HOTPLUG(dev)) && + (iir & I915_DISPLAY_PORT_INTERRUPT)) { + u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT); + + DRM_DEBUG("i915: hotplug event received, stat 0x%08x\n", + hotplug_status); + if (hotplug_status & dev_priv->hotplug_supported_mask) + taskqueue_enqueue(dev_priv->tq, + &dev_priv->hotplug_task); + + I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); + I915_READ(PORT_HOTPLUG_STAT); + } + + I915_WRITE(IIR, iir); + new_iir = I915_READ(IIR); /* Flush posted writes */ + +#if 0 + if (dev->primary->master) { + master_priv = dev->primary->master->driver_priv; + if (master_priv->sarea_priv) + master_priv->sarea_priv->last_dispatch = + READ_BREADCRUMB(dev_priv); + } +#else + if (dev_priv->sarea_priv) + dev_priv->sarea_priv->last_dispatch = + READ_BREADCRUMB(dev_priv); +#endif + + if (iir & I915_USER_INTERRUPT) + notify_ring(dev, &dev_priv->rings[RCS]); + if (iir & I915_BSD_USER_INTERRUPT) + notify_ring(dev, &dev_priv->rings[VCS]); + + if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT) { + intel_prepare_page_flip(dev, 0); + if (dev_priv->flip_pending_is_done) + intel_finish_page_flip_plane(dev, 0); + } + + if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT) { + intel_prepare_page_flip(dev, 1); + if (dev_priv->flip_pending_is_done) + intel_finish_page_flip_plane(dev, 1); + } + + for_each_pipe(pipe) { + if (pipe_stats[pipe] & vblank_status && + drm_handle_vblank(dev, pipe)) { + vblank++; + if (!dev_priv->flip_pending_is_done) { + i915_pageflip_stall_check(dev, pipe); + intel_finish_page_flip(dev, pipe); + } + } + + if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS) + blc_event = true; + } + + + if (blc_event || (iir & I915_ASLE_INTERRUPT)) { +#if 1 + KIB_NOTYET(); +#else + intel_opregion_asle_intr(dev); +#endif + } + + /* With MSI, interrupts are only generated when iir + * transitions from zero to nonzero. If another bit got + * set while we were handling the existing iir bits, then + * we would never get another interrupt. + * + * This is fine on non-MSI as well, as if we hit this path + * we avoid exiting the interrupt handler only to generate + * another one. + * + * Note that for MSI this could cause a stray interrupt report + * if an interrupt landed in the time between writing IIR and + * the posting read. This should be rare enough to never + * trigger the 99% of 100,000 interrupts test for disabling + * stray interrupts. + */ + iir = new_iir; + } +} + +static int i915_emit_irq(struct drm_device * dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; +#if 0 + struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; +#endif + + i915_kernel_lost_context(dev); + + DRM_DEBUG("i915: emit_irq\n"); + + dev_priv->counter++; + if (dev_priv->counter > 0x7FFFFFFFUL) + dev_priv->counter = 1; +#if 0 + if (master_priv->sarea_priv) + master_priv->sarea_priv->last_enqueue = dev_priv->counter; +#else + if (dev_priv->sarea_priv) + dev_priv->sarea_priv->last_enqueue = dev_priv->counter; +#endif + + if (BEGIN_LP_RING(4) == 0) { + OUT_RING(MI_STORE_DWORD_INDEX); + OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT); + OUT_RING(dev_priv->counter); + OUT_RING(MI_USER_INTERRUPT); + ADVANCE_LP_RING(); + } + + return dev_priv->counter; +} + +static int i915_wait_irq(struct drm_device * dev, int irq_nr) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; +#if 0 + struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; +#endif + int ret; + struct intel_ring_buffer *ring = LP_RING(dev_priv); + + DRM_DEBUG("irq_nr=%d breadcrumb=%d\n", irq_nr, + READ_BREADCRUMB(dev_priv)); + +#if 0 + if (READ_BREADCRUMB(dev_priv) >= irq_nr) { + if (master_priv->sarea_priv) + master_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); + return 0; + } + + if (master_priv->sarea_priv) + master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT; +#else + if (READ_BREADCRUMB(dev_priv) >= irq_nr) { + if (dev_priv->sarea_priv) { + dev_priv->sarea_priv->last_dispatch = + READ_BREADCRUMB(dev_priv); + } + return 0; + } + + if (dev_priv->sarea_priv) + dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT; +#endif + + ret = 0; + mtx_lock(&ring->irq_lock); + if (ring->irq_get(ring)) { + DRM_UNLOCK(dev); + while (ret == 0 && READ_BREADCRUMB(dev_priv) < irq_nr) { + ret = -msleep(ring, &ring->irq_lock, PCATCH, + "915wtq", 3 * hz); + } + ring->irq_put(ring); + mtx_unlock(&ring->irq_lock); + DRM_LOCK(dev); + } else { + mtx_unlock(&ring->irq_lock); + if (_intel_wait_for(dev, READ_BREADCRUMB(dev_priv) >= irq_nr, + 3000, 1, "915wir")) + ret = -EBUSY; + } + + if (ret == -EBUSY) { + DRM_ERROR("EBUSY -- rec: %d emitted: %d\n", + READ_BREADCRUMB(dev_priv), (int)dev_priv->counter); + } + + return ret; +} + +/* Needs the lock as it touches the ring. + */ +int i915_irq_emit(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + drm_i915_irq_emit_t *emit = data; + int result; + + if (!dev_priv || !LP_RING(dev_priv)->virtual_start) { + DRM_ERROR("called with no initialization\n"); + return -EINVAL; + } + + RING_LOCK_TEST_WITH_RETURN(dev, file_priv); + + DRM_LOCK(dev); + result = i915_emit_irq(dev); + DRM_UNLOCK(dev); + + if (DRM_COPY_TO_USER(emit->irq_seq, &result, sizeof(int))) { + DRM_ERROR("copy_to_user\n"); + return -EFAULT; + } + + return 0; +} + +/* Doesn't need the hardware lock. + */ +int i915_irq_wait(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + drm_i915_irq_wait_t *irqwait = data; + + if (!dev_priv) { + DRM_ERROR("called with no initialization\n"); + return -EINVAL; + } + + return i915_wait_irq(dev, irqwait->irq_seq); +} + +/* Called from drm generic code, passed 'crtc' which + * we use as a pipe index + */ +static int +i915_enable_vblank(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + + if (!i915_pipe_enabled(dev, pipe)) + return -EINVAL; + + mtx_lock(&dev_priv->irq_lock); + if (INTEL_INFO(dev)->gen >= 4) + i915_enable_pipestat(dev_priv, pipe, + PIPE_START_VBLANK_INTERRUPT_ENABLE); + else + i915_enable_pipestat(dev_priv, pipe, + PIPE_VBLANK_INTERRUPT_ENABLE); + + /* maintain vblank delivery even in deep C-states */ + if (dev_priv->info->gen == 3) + I915_WRITE(INSTPM, INSTPM_AGPBUSY_DIS << 16); + mtx_unlock(&dev_priv->irq_lock); + CTR1(KTR_DRM, "i915_enable_vblank %d", pipe); + + return 0; +} + +static int +ironlake_enable_vblank(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + + if (!i915_pipe_enabled(dev, pipe)) + return -EINVAL; + + mtx_lock(&dev_priv->irq_lock); + ironlake_enable_display_irq(dev_priv, (pipe == 0) ? + DE_PIPEA_VBLANK : DE_PIPEB_VBLANK); + mtx_unlock(&dev_priv->irq_lock); + CTR1(KTR_DRM, "ironlake_enable_vblank %d", pipe); + + return 0; +} + +static int +ivybridge_enable_vblank(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + + if (!i915_pipe_enabled(dev, pipe)) + return -EINVAL; + + mtx_lock(&dev_priv->irq_lock); + ironlake_enable_display_irq(dev_priv, (pipe == 0) ? + DE_PIPEA_VBLANK_IVB : DE_PIPEB_VBLANK_IVB); + mtx_unlock(&dev_priv->irq_lock); + CTR1(KTR_DRM, "ivybridge_enable_vblank %d", pipe); + + return 0; +} + + +/* Called from drm generic code, passed 'crtc' which + * we use as a pipe index + */ +static void +i915_disable_vblank(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + + mtx_lock(&dev_priv->irq_lock); + if (dev_priv->info->gen == 3) + I915_WRITE(INSTPM, + INSTPM_AGPBUSY_DIS << 16 | INSTPM_AGPBUSY_DIS); + + i915_disable_pipestat(dev_priv, pipe, + PIPE_VBLANK_INTERRUPT_ENABLE | + PIPE_START_VBLANK_INTERRUPT_ENABLE); + mtx_unlock(&dev_priv->irq_lock); + CTR1(KTR_DRM, "i915_disable_vblank %d", pipe); +} + +static void +ironlake_disable_vblank(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + + mtx_lock(&dev_priv->irq_lock); + ironlake_disable_display_irq(dev_priv, (pipe == 0) ? + DE_PIPEA_VBLANK : DE_PIPEB_VBLANK); + mtx_unlock(&dev_priv->irq_lock); + CTR1(KTR_DRM, "ironlake_disable_vblank %d", pipe); +} + +static void +ivybridge_disable_vblank(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + + mtx_lock(&dev_priv->irq_lock); + ironlake_disable_display_irq(dev_priv, (pipe == 0) ? + DE_PIPEA_VBLANK_IVB : DE_PIPEB_VBLANK_IVB); + mtx_unlock(&dev_priv->irq_lock); + CTR1(KTR_DRM, "ivybridge_disable_vblank %d", pipe); +} + +/* Set the vblank monitor pipe + */ +int i915_vblank_pipe_set(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + + if (!dev_priv) { + DRM_ERROR("called with no initialization\n"); + return -EINVAL; + } + + return 0; +} + +int i915_vblank_pipe_get(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + drm_i915_vblank_pipe_t *pipe = data; + + if (!dev_priv) { + DRM_ERROR("called with no initialization\n"); + return -EINVAL; + } + + pipe->pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; + + return 0; +} + +/** + * Schedule buffer swap at given vertical blank. + */ +int i915_vblank_swap(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + /* The delayed swap mechanism was fundamentally racy, and has been + * removed. The model was that the client requested a delayed flip/swap + * from the kernel, then waited for vblank before continuing to perform + * rendering. The problem was that the kernel might wake the client + * up before it dispatched the vblank swap (since the lock has to be + * held while touching the ringbuffer), in which case the client would + * clear and start the next frame before the swap occurred, and + * flicker would occur in addition to likely missing the vblank. + * + * In the absence of this ioctl, userland falls back to a correct path + * of waiting for a vblank, then dispatching the swap on its own. + * Context switching to userland and back is plenty fast enough for + * meeting the requirements of vblank swapping. + */ + return -EINVAL; +} + +static u32 +ring_last_seqno(struct intel_ring_buffer *ring) +{ + + if (list_empty(&ring->request_list)) + return (0); + else + return (list_entry(ring->request_list.prev, + struct drm_i915_gem_request, list)->seqno); +} + +static bool i915_hangcheck_ring_idle(struct intel_ring_buffer *ring, bool *err) +{ + if (list_empty(&ring->request_list) || + i915_seqno_passed(ring->get_seqno(ring), ring_last_seqno(ring))) { + /* Issue a wake-up to catch stuck h/w. */ + if (ring->waiting_seqno) { + DRM_ERROR( +"Hangcheck timer elapsed... %s idle [waiting on %d, at %d], missed IRQ?\n", + ring->name, + ring->waiting_seqno, + ring->get_seqno(ring)); + wakeup(ring); + *err = true; + } + return true; + } + return false; +} + +static bool kick_ring(struct intel_ring_buffer *ring) +{ + struct drm_device *dev = ring->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 tmp = I915_READ_CTL(ring); + if (tmp & RING_WAIT) { + DRM_ERROR("Kicking stuck wait on %s\n", + ring->name); + I915_WRITE_CTL(ring, tmp); + return true; + } + return false; +} + +/** + * This is called when the chip hasn't reported back with completed + * batchbuffers in a long time. The first time this is called we simply record + * ACTHD. If ACTHD hasn't changed by the time the hangcheck timer elapses + * again, we assume the chip is wedged and try to fix it. + */ +void +i915_hangcheck_elapsed(void *context) +{ + struct drm_device *dev = (struct drm_device *)context; + drm_i915_private_t *dev_priv = dev->dev_private; + uint32_t acthd, instdone, instdone1, acthd_bsd, acthd_blt; + bool err = false; + + if (!i915_enable_hangcheck) + return; + + /* If all work is done then ACTHD clearly hasn't advanced. */ + if (i915_hangcheck_ring_idle(&dev_priv->rings[RCS], &err) && + i915_hangcheck_ring_idle(&dev_priv->rings[VCS], &err) && + i915_hangcheck_ring_idle(&dev_priv->rings[BCS], &err)) { + dev_priv->hangcheck_count = 0; + if (err) + goto repeat; + return; + } + + if (INTEL_INFO(dev)->gen < 4) { + instdone = I915_READ(INSTDONE); + instdone1 = 0; + } else { + instdone = I915_READ(INSTDONE_I965); + instdone1 = I915_READ(INSTDONE1); + } + acthd = intel_ring_get_active_head(&dev_priv->rings[RCS]); + acthd_bsd = HAS_BSD(dev) ? + intel_ring_get_active_head(&dev_priv->rings[VCS]) : 0; + acthd_blt = HAS_BLT(dev) ? + intel_ring_get_active_head(&dev_priv->rings[BCS]) : 0; + + if (dev_priv->last_acthd == acthd && + dev_priv->last_acthd_bsd == acthd_bsd && + dev_priv->last_acthd_blt == acthd_blt && + dev_priv->last_instdone == instdone && + dev_priv->last_instdone1 == instdone1) { + if (dev_priv->hangcheck_count++ > 1) { + DRM_ERROR("Hangcheck timer elapsed... GPU hung\n"); + i915_handle_error(dev, true); + + if (!IS_GEN2(dev)) { + /* Is the chip hanging on a WAIT_FOR_EVENT? + * If so we can simply poke the RB_WAIT bit + * and break the hang. This should work on + * all but the second generation chipsets. + */ + if (kick_ring(&dev_priv->rings[RCS])) + goto repeat; + + if (HAS_BSD(dev) && + kick_ring(&dev_priv->rings[VCS])) + goto repeat; + + if (HAS_BLT(dev) && + kick_ring(&dev_priv->rings[BCS])) + goto repeat; + } + + return; + } + } else { + dev_priv->hangcheck_count = 0; + + dev_priv->last_acthd = acthd; + dev_priv->last_acthd_bsd = acthd_bsd; + dev_priv->last_acthd_blt = acthd_blt; + dev_priv->last_instdone = instdone; + dev_priv->last_instdone1 = instdone1; + } + +repeat: + /* Reset timer case chip hangs without another request being added */ + callout_schedule(&dev_priv->hangcheck_timer, DRM_I915_HANGCHECK_PERIOD); +} + +/* drm_dma.h hooks +*/ +static void +ironlake_irq_preinstall(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + + atomic_set(&dev_priv->irq_received, 0); + + TASK_INIT(&dev_priv->hotplug_task, 0, i915_hotplug_work_func, + dev->dev_private); + TASK_INIT(&dev_priv->error_task, 0, i915_error_work_func, + dev->dev_private); + TASK_INIT(&dev_priv->rps_task, 0, gen6_pm_rps_work_func, + dev->dev_private); + + I915_WRITE(HWSTAM, 0xeffe); + + /* XXX hotplug from PCH */ + + I915_WRITE(DEIMR, 0xffffffff); + I915_WRITE(DEIER, 0x0); + POSTING_READ(DEIER); + + /* and GT */ + I915_WRITE(GTIMR, 0xffffffff); + I915_WRITE(GTIER, 0x0); + POSTING_READ(GTIER); + + /* south display irq */ + I915_WRITE(SDEIMR, 0xffffffff); + I915_WRITE(SDEIER, 0x0); + POSTING_READ(SDEIER); +} + +/* + * Enable digital hotplug on the PCH, and configure the DP short pulse + * duration to 2ms (which is the minimum in the Display Port spec) + * + * This register is the same on all known PCH chips. + */ + +static void ironlake_enable_pch_hotplug(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + u32 hotplug; + + hotplug = I915_READ(PCH_PORT_HOTPLUG); + hotplug &= ~(PORTD_PULSE_DURATION_MASK|PORTC_PULSE_DURATION_MASK|PORTB_PULSE_DURATION_MASK); + hotplug |= PORTD_HOTPLUG_ENABLE | PORTD_PULSE_DURATION_2ms; + hotplug |= PORTC_HOTPLUG_ENABLE | PORTC_PULSE_DURATION_2ms; + hotplug |= PORTB_HOTPLUG_ENABLE | PORTB_PULSE_DURATION_2ms; + I915_WRITE(PCH_PORT_HOTPLUG, hotplug); +} + +static int ironlake_irq_postinstall(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + /* enable kind of interrupts always enabled */ + u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | + DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE; + u32 render_irqs; + u32 hotplug_mask; + + dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; + dev_priv->irq_mask = ~display_mask; + + /* should always can generate irq */ + I915_WRITE(DEIIR, I915_READ(DEIIR)); + I915_WRITE(DEIMR, dev_priv->irq_mask); + I915_WRITE(DEIER, display_mask | DE_PIPEA_VBLANK | DE_PIPEB_VBLANK); + POSTING_READ(DEIER); + + dev_priv->gt_irq_mask = ~0; + + I915_WRITE(GTIIR, I915_READ(GTIIR)); + I915_WRITE(GTIMR, dev_priv->gt_irq_mask); + + if (IS_GEN6(dev)) + render_irqs = + GT_USER_INTERRUPT | + GT_GEN6_BSD_USER_INTERRUPT | + GT_BLT_USER_INTERRUPT; + else + render_irqs = + GT_USER_INTERRUPT | + GT_PIPE_NOTIFY | + GT_BSD_USER_INTERRUPT; + I915_WRITE(GTIER, render_irqs); + POSTING_READ(GTIER); + + if (HAS_PCH_CPT(dev)) { + hotplug_mask = (SDE_CRT_HOTPLUG_CPT | + SDE_PORTB_HOTPLUG_CPT | + SDE_PORTC_HOTPLUG_CPT | + SDE_PORTD_HOTPLUG_CPT); + } else { + hotplug_mask = (SDE_CRT_HOTPLUG | + SDE_PORTB_HOTPLUG | + SDE_PORTC_HOTPLUG | + SDE_PORTD_HOTPLUG | + SDE_AUX_MASK); + } + + dev_priv->pch_irq_mask = ~hotplug_mask; + + I915_WRITE(SDEIIR, I915_READ(SDEIIR)); + I915_WRITE(SDEIMR, dev_priv->pch_irq_mask); + I915_WRITE(SDEIER, hotplug_mask); + POSTING_READ(SDEIER); + + ironlake_enable_pch_hotplug(dev); + + if (IS_IRONLAKE_M(dev)) { + /* Clear & enable PCU event interrupts */ + I915_WRITE(DEIIR, DE_PCU_EVENT); + I915_WRITE(DEIER, I915_READ(DEIER) | DE_PCU_EVENT); + ironlake_enable_display_irq(dev_priv, DE_PCU_EVENT); + } + + return 0; +} + +static int +ivybridge_irq_postinstall(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + /* enable kind of interrupts always enabled */ + u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE_IVB | + DE_PCH_EVENT_IVB | DE_PLANEA_FLIP_DONE_IVB | + DE_PLANEB_FLIP_DONE_IVB; + u32 render_irqs; + u32 hotplug_mask; + + dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; + dev_priv->irq_mask = ~display_mask; + + /* should always can generate irq */ + I915_WRITE(DEIIR, I915_READ(DEIIR)); + I915_WRITE(DEIMR, dev_priv->irq_mask); + I915_WRITE(DEIER, display_mask | DE_PIPEA_VBLANK_IVB | + DE_PIPEB_VBLANK_IVB); + POSTING_READ(DEIER); + + dev_priv->gt_irq_mask = ~0; + + I915_WRITE(GTIIR, I915_READ(GTIIR)); + I915_WRITE(GTIMR, dev_priv->gt_irq_mask); + + render_irqs = GT_USER_INTERRUPT | GT_GEN6_BSD_USER_INTERRUPT | + GT_BLT_USER_INTERRUPT; + I915_WRITE(GTIER, render_irqs); + POSTING_READ(GTIER); + + hotplug_mask = (SDE_CRT_HOTPLUG_CPT | + SDE_PORTB_HOTPLUG_CPT | + SDE_PORTC_HOTPLUG_CPT | + SDE_PORTD_HOTPLUG_CPT); + dev_priv->pch_irq_mask = ~hotplug_mask; + + I915_WRITE(SDEIIR, I915_READ(SDEIIR)); + I915_WRITE(SDEIMR, dev_priv->pch_irq_mask); + I915_WRITE(SDEIER, hotplug_mask); + POSTING_READ(SDEIER); + + ironlake_enable_pch_hotplug(dev); + + return 0; +} + +static void +i915_driver_irq_preinstall(struct drm_device * dev) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + int pipe; + + atomic_set(&dev_priv->irq_received, 0); + + TASK_INIT(&dev_priv->hotplug_task, 0, i915_hotplug_work_func, + dev->dev_private); + TASK_INIT(&dev_priv->error_task, 0, i915_error_work_func, + dev->dev_private); + TASK_INIT(&dev_priv->rps_task, 0, gen6_pm_rps_work_func, + dev->dev_private); + + if (I915_HAS_HOTPLUG(dev)) { + I915_WRITE(PORT_HOTPLUG_EN, 0); + I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT)); + } + + I915_WRITE(HWSTAM, 0xeffe); + for_each_pipe(pipe) + I915_WRITE(PIPESTAT(pipe), 0); + I915_WRITE(IMR, 0xffffffff); + I915_WRITE(IER, 0x0); + POSTING_READ(IER); +} + +/* + * Must be called after intel_modeset_init or hotplug interrupts won't be + * enabled correctly. + */ +static int +i915_driver_irq_postinstall(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + u32 enable_mask = I915_INTERRUPT_ENABLE_FIX | I915_INTERRUPT_ENABLE_VAR; + u32 error_mask; + + dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; + + /* Unmask the interrupts that we always want on. */ + dev_priv->irq_mask = ~I915_INTERRUPT_ENABLE_FIX; + + dev_priv->pipestat[0] = 0; + dev_priv->pipestat[1] = 0; + + if (I915_HAS_HOTPLUG(dev)) { + /* Enable in IER... */ + enable_mask |= I915_DISPLAY_PORT_INTERRUPT; + /* and unmask in IMR */ + dev_priv->irq_mask &= ~I915_DISPLAY_PORT_INTERRUPT; + } + + /* + * Enable some error detection, note the instruction error mask + * bit is reserved, so we leave it masked. + */ + if (IS_G4X(dev)) { + error_mask = ~(GM45_ERROR_PAGE_TABLE | + GM45_ERROR_MEM_PRIV | + GM45_ERROR_CP_PRIV | + I915_ERROR_MEMORY_REFRESH); + } else { + error_mask = ~(I915_ERROR_PAGE_TABLE | + I915_ERROR_MEMORY_REFRESH); + } + I915_WRITE(EMR, error_mask); + + I915_WRITE(IMR, dev_priv->irq_mask); + I915_WRITE(IER, enable_mask); + POSTING_READ(IER); + + if (I915_HAS_HOTPLUG(dev)) { + u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN); + + /* Note HDMI and DP share bits */ + if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS) + hotplug_en |= HDMIB_HOTPLUG_INT_EN; + if (dev_priv->hotplug_supported_mask & HDMIC_HOTPLUG_INT_STATUS) + hotplug_en |= HDMIC_HOTPLUG_INT_EN; + if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS) + hotplug_en |= HDMID_HOTPLUG_INT_EN; + if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS) + hotplug_en |= SDVOC_HOTPLUG_INT_EN; + if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS) + hotplug_en |= SDVOB_HOTPLUG_INT_EN; + if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) { + hotplug_en |= CRT_HOTPLUG_INT_EN; + + /* Programming the CRT detection parameters tends + to generate a spurious hotplug event about three + seconds later. So just do it once. + */ + if (IS_G4X(dev)) + hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64; + hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; + } + + /* Ignore TV since it's buggy */ + + I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); + } + +#if 1 + KIB_NOTYET(); +#else + intel_opregion_enable_asle(dev); +#endif + + return 0; +} + +static void +ironlake_irq_uninstall(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + + if (dev_priv == NULL) + return; + + dev_priv->vblank_pipe = 0; + + I915_WRITE(HWSTAM, 0xffffffff); + + I915_WRITE(DEIMR, 0xffffffff); + I915_WRITE(DEIER, 0x0); + I915_WRITE(DEIIR, I915_READ(DEIIR)); + + I915_WRITE(GTIMR, 0xffffffff); + I915_WRITE(GTIER, 0x0); + I915_WRITE(GTIIR, I915_READ(GTIIR)); + + I915_WRITE(SDEIMR, 0xffffffff); + I915_WRITE(SDEIER, 0x0); + I915_WRITE(SDEIIR, I915_READ(SDEIIR)); + + taskqueue_drain(dev_priv->tq, &dev_priv->hotplug_task); + taskqueue_drain(dev_priv->tq, &dev_priv->error_task); + taskqueue_drain(dev_priv->tq, &dev_priv->rps_task); +} + +static void i915_driver_irq_uninstall(struct drm_device * dev) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + int pipe; + + if (!dev_priv) + return; + + dev_priv->vblank_pipe = 0; + + if (I915_HAS_HOTPLUG(dev)) { + I915_WRITE(PORT_HOTPLUG_EN, 0); + I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT)); + } + + I915_WRITE(HWSTAM, 0xffffffff); + for_each_pipe(pipe) + I915_WRITE(PIPESTAT(pipe), 0); + I915_WRITE(IMR, 0xffffffff); + I915_WRITE(IER, 0x0); + + for_each_pipe(pipe) + I915_WRITE(PIPESTAT(pipe), + I915_READ(PIPESTAT(pipe)) & 0x8000ffff); + I915_WRITE(IIR, I915_READ(IIR)); + + taskqueue_drain(dev_priv->tq, &dev_priv->hotplug_task); + taskqueue_drain(dev_priv->tq, &dev_priv->error_task); + taskqueue_drain(dev_priv->tq, &dev_priv->rps_task); +} + +void +intel_irq_init(struct drm_device *dev) +{ + + dev->driver->get_vblank_counter = i915_get_vblank_counter; + dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ + if (IS_G4X(dev) || IS_GEN5(dev) || IS_GEN6(dev) || IS_IVYBRIDGE(dev)) { + dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */ + dev->driver->get_vblank_counter = gm45_get_vblank_counter; + } + + if (drm_core_check_feature(dev, DRIVER_MODESET)) + dev->driver->get_vblank_timestamp = i915_get_vblank_timestamp; + else + dev->driver->get_vblank_timestamp = NULL; + dev->driver->get_scanout_position = i915_get_crtc_scanoutpos; + + if (IS_IVYBRIDGE(dev)) { + /* Share pre & uninstall handlers with ILK/SNB */ + dev->driver->irq_handler = ivybridge_irq_handler; + dev->driver->irq_preinstall = ironlake_irq_preinstall; + dev->driver->irq_postinstall = ivybridge_irq_postinstall; + dev->driver->irq_uninstall = ironlake_irq_uninstall; + dev->driver->enable_vblank = ivybridge_enable_vblank; + dev->driver->disable_vblank = ivybridge_disable_vblank; + } else if (HAS_PCH_SPLIT(dev)) { + dev->driver->irq_handler = ironlake_irq_handler; + dev->driver->irq_preinstall = ironlake_irq_preinstall; + dev->driver->irq_postinstall = ironlake_irq_postinstall; + dev->driver->irq_uninstall = ironlake_irq_uninstall; + dev->driver->enable_vblank = ironlake_enable_vblank; + dev->driver->disable_vblank = ironlake_disable_vblank; + } else { + dev->driver->irq_preinstall = i915_driver_irq_preinstall; + dev->driver->irq_postinstall = i915_driver_irq_postinstall; + dev->driver->irq_uninstall = i915_driver_irq_uninstall; + dev->driver->irq_handler = i915_driver_irq_handler; + dev->driver->enable_vblank = i915_enable_vblank; + dev->driver->disable_vblank = i915_disable_vblank; + } +} + +static struct drm_i915_error_object * +i915_error_object_create(struct drm_i915_private *dev_priv, + struct drm_i915_gem_object *src) +{ + struct drm_i915_error_object *dst; + struct sf_buf *sf; + void *d, *s; + int page, page_count; + u32 reloc_offset; + + if (src == NULL || src->pages == NULL) + return NULL; + + page_count = src->base.size / PAGE_SIZE; + + dst = malloc(sizeof(*dst) + page_count * sizeof(u32 *), DRM_I915_GEM, + M_NOWAIT); + if (dst == NULL) + return (NULL); + + reloc_offset = src->gtt_offset; + for (page = 0; page < page_count; page++) { + d = malloc(PAGE_SIZE, DRM_I915_GEM, M_NOWAIT); + if (d == NULL) + goto unwind; + + if (reloc_offset < dev_priv->mm.gtt_mappable_end) { + /* Simply ignore tiling or any overlapping fence. + * It's part of the error state, and this hopefully + * captures what the GPU read. + */ + s = pmap_mapdev_attr(src->base.dev->agp->base + + reloc_offset, PAGE_SIZE, PAT_WRITE_COMBINING); + memcpy(d, s, PAGE_SIZE); + pmap_unmapdev((vm_offset_t)s, PAGE_SIZE); + } else { + drm_clflush_pages(&src->pages[page], 1); + + sched_pin(); + sf = sf_buf_alloc(src->pages[page], SFB_CPUPRIVATE | + SFB_NOWAIT); + if (sf != NULL) { + s = (void *)(uintptr_t)sf_buf_kva(sf); + memcpy(d, s, PAGE_SIZE); + sf_buf_free(sf); + } else { + bzero(d, PAGE_SIZE); + strcpy(d, "XXXKIB"); + } + sched_unpin(); + + drm_clflush_pages(&src->pages[page], 1); + } + + dst->pages[page] = d; + + reloc_offset += PAGE_SIZE; + } + dst->page_count = page_count; + dst->gtt_offset = src->gtt_offset; + + return (dst); + +unwind: + while (page--) + free(dst->pages[page], DRM_I915_GEM); + free(dst, DRM_I915_GEM); + return (NULL); +} + +static void +i915_error_object_free(struct drm_i915_error_object *obj) +{ + int page; + + if (obj == NULL) + return; + + for (page = 0; page < obj->page_count; page++) + free(obj->pages[page], DRM_I915_GEM); + + free(obj, DRM_I915_GEM); +} + +static void +i915_error_state_free(struct drm_device *dev, + struct drm_i915_error_state *error) +{ + int i; + + for (i = 0; i < DRM_ARRAY_SIZE(error->ring); i++) { + i915_error_object_free(error->ring[i].batchbuffer); + i915_error_object_free(error->ring[i].ringbuffer); + free(error->ring[i].requests, DRM_I915_GEM); + } + + free(error->active_bo, DRM_I915_GEM); + free(error->overlay, DRM_I915_GEM); + free(error, DRM_I915_GEM); +} + +static u32 +capture_bo_list(struct drm_i915_error_buffer *err, int count, + struct list_head *head) +{ + struct drm_i915_gem_object *obj; + int i = 0; + + list_for_each_entry(obj, head, mm_list) { + err->size = obj->base.size; + err->name = obj->base.name; + err->seqno = obj->last_rendering_seqno; + err->gtt_offset = obj->gtt_offset; + err->read_domains = obj->base.read_domains; + err->write_domain = obj->base.write_domain; + err->fence_reg = obj->fence_reg; + err->pinned = 0; + if (obj->pin_count > 0) + err->pinned = 1; + if (obj->user_pin_count > 0) + err->pinned = -1; + err->tiling = obj->tiling_mode; + err->dirty = obj->dirty; + err->purgeable = obj->madv != I915_MADV_WILLNEED; + err->ring = obj->ring ? obj->ring->id : -1; + err->cache_level = obj->cache_level; + + if (++i == count) + break; + + err++; + } + + return (i); +} + +static void +i915_gem_record_fences(struct drm_device *dev, + struct drm_i915_error_state *error) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int i; + + /* Fences */ + switch (INTEL_INFO(dev)->gen) { + case 7: + case 6: + for (i = 0; i < 16; i++) + error->fence[i] = I915_READ64(FENCE_REG_SANDYBRIDGE_0 + (i * 8)); + break; + case 5: + case 4: + for (i = 0; i < 16; i++) + error->fence[i] = I915_READ64(FENCE_REG_965_0 + + (i * 8)); + break; + case 3: + if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) + for (i = 0; i < 8; i++) + error->fence[i+8] = I915_READ(FENCE_REG_945_8 + + (i * 4)); + case 2: + for (i = 0; i < 8; i++) + error->fence[i] = I915_READ(FENCE_REG_830_0 + (i * 4)); + break; + + } +} + +static struct drm_i915_error_object * +i915_error_first_batchbuffer(struct drm_i915_private *dev_priv, + struct intel_ring_buffer *ring) +{ + struct drm_i915_gem_object *obj; + u32 seqno; + + if (!ring->get_seqno) + return (NULL); + + seqno = ring->get_seqno(ring); + list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) { + if (obj->ring != ring) + continue; + + if (i915_seqno_passed(seqno, obj->last_rendering_seqno)) + continue; + + if ((obj->base.read_domains & I915_GEM_DOMAIN_COMMAND) == 0) + continue; + + /* We need to copy these to an anonymous buffer as the simplest + * method to avoid being overwritten by userspace. + */ + return (i915_error_object_create(dev_priv, obj)); + } + + return NULL; +} + +static void +i915_record_ring_state(struct drm_device *dev, + struct drm_i915_error_state *error, + struct intel_ring_buffer *ring) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + if (INTEL_INFO(dev)->gen >= 6) { + error->faddr[ring->id] = I915_READ(RING_DMA_FADD(ring->mmio_base)); + error->fault_reg[ring->id] = I915_READ(RING_FAULT_REG(ring)); + error->semaphore_mboxes[ring->id][0] + = I915_READ(RING_SYNC_0(ring->mmio_base)); + error->semaphore_mboxes[ring->id][1] + = I915_READ(RING_SYNC_1(ring->mmio_base)); + } + + if (INTEL_INFO(dev)->gen >= 4) { + error->ipeir[ring->id] = I915_READ(RING_IPEIR(ring->mmio_base)); + error->ipehr[ring->id] = I915_READ(RING_IPEHR(ring->mmio_base)); + error->instdone[ring->id] = I915_READ(RING_INSTDONE(ring->mmio_base)); + error->instps[ring->id] = I915_READ(RING_INSTPS(ring->mmio_base)); + if (ring->id == RCS) { + error->instdone1 = I915_READ(INSTDONE1); + error->bbaddr = I915_READ64(BB_ADDR); + } + } else { + error->ipeir[ring->id] = I915_READ(IPEIR); + error->ipehr[ring->id] = I915_READ(IPEHR); + error->instdone[ring->id] = I915_READ(INSTDONE); + } + + error->instpm[ring->id] = I915_READ(RING_INSTPM(ring->mmio_base)); + error->seqno[ring->id] = ring->get_seqno(ring); + error->acthd[ring->id] = intel_ring_get_active_head(ring); + error->head[ring->id] = I915_READ_HEAD(ring); + error->tail[ring->id] = I915_READ_TAIL(ring); + + error->cpu_ring_head[ring->id] = ring->head; + error->cpu_ring_tail[ring->id] = ring->tail; +} + +static void +i915_gem_record_rings(struct drm_device *dev, + struct drm_i915_error_state *error) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_i915_gem_request *request; + int i, count; + + for (i = 0; i < I915_NUM_RINGS; i++) { + struct intel_ring_buffer *ring = &dev_priv->rings[i]; + + if (ring->obj == NULL) + continue; + + i915_record_ring_state(dev, error, ring); + + error->ring[i].batchbuffer = + i915_error_first_batchbuffer(dev_priv, ring); + + error->ring[i].ringbuffer = + i915_error_object_create(dev_priv, ring->obj); + + count = 0; + list_for_each_entry(request, &ring->request_list, list) + count++; + + error->ring[i].num_requests = count; + error->ring[i].requests = malloc(count * + sizeof(struct drm_i915_error_request), DRM_I915_GEM, + M_WAITOK); + if (error->ring[i].requests == NULL) { + error->ring[i].num_requests = 0; + continue; + } + + count = 0; + list_for_each_entry(request, &ring->request_list, list) { + struct drm_i915_error_request *erq; + + erq = &error->ring[i].requests[count++]; + erq->seqno = request->seqno; + erq->jiffies = request->emitted_jiffies; + erq->tail = request->tail; + } + } +} + +static void +i915_capture_error_state(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_i915_gem_object *obj; + struct drm_i915_error_state *error; + int i, pipe; + + mtx_lock(&dev_priv->error_lock); + error = dev_priv->first_error; + mtx_unlock(&dev_priv->error_lock); + if (error != NULL) + return; + + /* Account for pipe specific data like PIPE*STAT */ + error = malloc(sizeof(*error), DRM_I915_GEM, M_NOWAIT | M_ZERO); + if (error == NULL) { + DRM_DEBUG("out of memory, not capturing error state\n"); + return; + } + + DRM_INFO("capturing error event; look for more information in " + "sysctl hw.dri.%d.info.i915_error_state\n", dev->sysctl_node_idx); + + error->eir = I915_READ(EIR); + error->pgtbl_er = I915_READ(PGTBL_ER); + for_each_pipe(pipe) + error->pipestat[pipe] = I915_READ(PIPESTAT(pipe)); + + if (INTEL_INFO(dev)->gen >= 6) { + error->error = I915_READ(ERROR_GEN6); + error->done_reg = I915_READ(DONE_REG); + } + + i915_gem_record_fences(dev, error); + i915_gem_record_rings(dev, error); + + /* Record buffers on the active and pinned lists. */ + error->active_bo = NULL; + error->pinned_bo = NULL; + + i = 0; + list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) + i++; + error->active_bo_count = i; + list_for_each_entry(obj, &dev_priv->mm.pinned_list, mm_list) + i++; + error->pinned_bo_count = i - error->active_bo_count; + + error->active_bo = NULL; + error->pinned_bo = NULL; + if (i) { + error->active_bo = malloc(sizeof(*error->active_bo) * i, + DRM_I915_GEM, M_NOWAIT); + if (error->active_bo) + error->pinned_bo = error->active_bo + + error->active_bo_count; + } + + if (error->active_bo) + error->active_bo_count = capture_bo_list(error->active_bo, + error->active_bo_count, &dev_priv->mm.active_list); + + if (error->pinned_bo) + error->pinned_bo_count = capture_bo_list(error->pinned_bo, + error->pinned_bo_count, &dev_priv->mm.pinned_list); + + microtime(&error->time); + + error->overlay = intel_overlay_capture_error_state(dev); + error->display = intel_display_capture_error_state(dev); + + mtx_lock(&dev_priv->error_lock); + if (dev_priv->first_error == NULL) { + dev_priv->first_error = error; + error = NULL; + } + mtx_unlock(&dev_priv->error_lock); + + if (error != NULL) + i915_error_state_free(dev, error); +} + +void +i915_destroy_error_state(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_i915_error_state *error; + + mtx_lock(&dev_priv->error_lock); + error = dev_priv->first_error; + dev_priv->first_error = NULL; + mtx_unlock(&dev_priv->error_lock); + + if (error != NULL) + i915_error_state_free(dev, error); +} diff --git a/sys/dev/drm2/i915/i915_reg.h b/sys/dev/drm2/i915/i915_reg.h new file mode 100644 index 00000000000..754e535f78f --- /dev/null +++ b/sys/dev/drm2/i915/i915_reg.h @@ -0,0 +1,3876 @@ +/* Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef _I915_REG_H_ +#define _I915_REG_H_ + +#define _PIPE(pipe, a, b) ((a) + (pipe)*((b)-(a))) + +/* + * The Bridge device's PCI config space has information about the + * fb aperture size and the amount of pre-reserved memory. + * This is all handled in the intel-gtt.ko module. i915.ko only + * cares about the vga bit for the vga rbiter. + */ +#define INTEL_GMCH_CTRL 0x52 +#define INTEL_GMCH_VGA_DISABLE (1 << 1) + +/* PCI config space */ + +#define HPLLCC 0xc0 /* 855 only */ +#define GC_CLOCK_CONTROL_MASK (0xf << 0) +#define GC_CLOCK_133_200 (0 << 0) +#define GC_CLOCK_100_200 (1 << 0) +#define GC_CLOCK_100_133 (2 << 0) +#define GC_CLOCK_166_250 (3 << 0) +#define GCFGC2 0xda +#define GCFGC 0xf0 /* 915+ only */ +#define GC_LOW_FREQUENCY_ENABLE (1 << 7) +#define GC_DISPLAY_CLOCK_190_200_MHZ (0 << 4) +#define GC_DISPLAY_CLOCK_333_MHZ (4 << 4) +#define GC_DISPLAY_CLOCK_MASK (7 << 4) +#define GM45_GC_RENDER_CLOCK_MASK (0xf << 0) +#define GM45_GC_RENDER_CLOCK_266_MHZ (8 << 0) +#define GM45_GC_RENDER_CLOCK_320_MHZ (9 << 0) +#define GM45_GC_RENDER_CLOCK_400_MHZ (0xb << 0) +#define GM45_GC_RENDER_CLOCK_533_MHZ (0xc << 0) +#define I965_GC_RENDER_CLOCK_MASK (0xf << 0) +#define I965_GC_RENDER_CLOCK_267_MHZ (2 << 0) +#define I965_GC_RENDER_CLOCK_333_MHZ (3 << 0) +#define I965_GC_RENDER_CLOCK_444_MHZ (4 << 0) +#define I965_GC_RENDER_CLOCK_533_MHZ (5 << 0) +#define I945_GC_RENDER_CLOCK_MASK (7 << 0) +#define I945_GC_RENDER_CLOCK_166_MHZ (0 << 0) +#define I945_GC_RENDER_CLOCK_200_MHZ (1 << 0) +#define I945_GC_RENDER_CLOCK_250_MHZ (3 << 0) +#define I945_GC_RENDER_CLOCK_400_MHZ (5 << 0) +#define I915_GC_RENDER_CLOCK_MASK (7 << 0) +#define I915_GC_RENDER_CLOCK_166_MHZ (0 << 0) +#define I915_GC_RENDER_CLOCK_200_MHZ (1 << 0) +#define I915_GC_RENDER_CLOCK_333_MHZ (4 << 0) +#define LBB 0xf4 + +/* Graphics reset regs */ +#define I965_GDRST 0xc0 /* PCI config register */ +#define ILK_GDSR 0x2ca4 /* MCHBAR offset */ +#define GRDOM_FULL (0<<2) +#define GRDOM_RENDER (1<<2) +#define GRDOM_MEDIA (3<<2) + +#define GEN6_MBCUNIT_SNPCR 0x900c /* for LLC config */ +#define GEN6_MBC_SNPCR_SHIFT 21 +#define GEN6_MBC_SNPCR_MASK (3<<21) +#define GEN6_MBC_SNPCR_MAX (0<<21) +#define GEN6_MBC_SNPCR_MED (1<<21) +#define GEN6_MBC_SNPCR_LOW (2<<21) +#define GEN6_MBC_SNPCR_MIN (3<<21) /* only 1/16th of the cache is shared */ + +#define GEN6_MBCTL 0x0907c +#define GEN6_MBCTL_ENABLE_BOOT_FETCH (1 << 4) +#define GEN6_MBCTL_CTX_FETCH_NEEDED (1 << 3) +#define GEN6_MBCTL_BME_UPDATE_ENABLE (1 << 2) +#define GEN6_MBCTL_MAE_UPDATE_ENABLE (1 << 1) +#define GEN6_MBCTL_BOOT_FETCH_MECH (1 << 0) + +#define GEN6_GDRST 0x941c +#define GEN6_GRDOM_FULL (1 << 0) +#define GEN6_GRDOM_RENDER (1 << 1) +#define GEN6_GRDOM_MEDIA (1 << 2) +#define GEN6_GRDOM_BLT (1 << 3) + +/* PPGTT stuff */ +#define GEN6_GTT_ADDR_ENCODE(addr) ((addr) | (((addr) >> 28) & 0xff0)) + +#define GEN6_PDE_VALID (1 << 0) +#define GEN6_PDE_LARGE_PAGE (2 << 0) /* use 32kb pages */ +/* gen6+ has bit 11-4 for physical addr bit 39-32 */ +#define GEN6_PDE_ADDR_ENCODE(addr) GEN6_GTT_ADDR_ENCODE(addr) + +#define GEN6_PTE_VALID (1 << 0) +#define GEN6_PTE_UNCACHED (1 << 1) +#define GEN6_PTE_CACHE_LLC (2 << 1) +#define GEN6_PTE_CACHE_LLC_MLC (3 << 1) +#define GEN6_PTE_CACHE_BITS (3 << 1) +#define GEN6_PTE_GFDT (1 << 3) +#define GEN6_PTE_ADDR_ENCODE(addr) GEN6_GTT_ADDR_ENCODE(addr) + +#define RING_PP_DIR_BASE(ring) ((ring)->mmio_base+0x228) +#define RING_PP_DIR_BASE_READ(ring) ((ring)->mmio_base+0x518) +#define RING_PP_DIR_DCLV(ring) ((ring)->mmio_base+0x220) +#define PP_DIR_DCLV_2G 0xffffffff + +#define GAM_ECOCHK 0x4090 +#define ECOCHK_SNB_BIT (1<<10) +#define ECOCHK_PPGTT_CACHE64B (0x3<<3) +#define ECOCHK_PPGTT_CACHE4B (0x0<<3) + +/* VGA stuff */ + +#define VGA_ST01_MDA 0x3ba +#define VGA_ST01_CGA 0x3da + +#define VGA_MSR_WRITE 0x3c2 +#define VGA_MSR_READ 0x3cc +#define VGA_MSR_MEM_EN (1<<1) +#define VGA_MSR_CGA_MODE (1<<0) + +#define VGA_SR_INDEX 0x3c4 +#define VGA_SR_DATA 0x3c5 + +#define VGA_AR_INDEX 0x3c0 +#define VGA_AR_VID_EN (1<<5) +#define VGA_AR_DATA_WRITE 0x3c0 +#define VGA_AR_DATA_READ 0x3c1 + +#define VGA_GR_INDEX 0x3ce +#define VGA_GR_DATA 0x3cf +/* GR05 */ +#define VGA_GR_MEM_READ_MODE_SHIFT 3 +#define VGA_GR_MEM_READ_MODE_PLANE 1 +/* GR06 */ +#define VGA_GR_MEM_MODE_MASK 0xc +#define VGA_GR_MEM_MODE_SHIFT 2 +#define VGA_GR_MEM_A0000_AFFFF 0 +#define VGA_GR_MEM_A0000_BFFFF 1 +#define VGA_GR_MEM_B0000_B7FFF 2 +#define VGA_GR_MEM_B0000_BFFFF 3 + +#define VGA_DACMASK 0x3c6 +#define VGA_DACRX 0x3c7 +#define VGA_DACWX 0x3c8 +#define VGA_DACDATA 0x3c9 + +#define VGA_CR_INDEX_MDA 0x3b4 +#define VGA_CR_DATA_MDA 0x3b5 +#define VGA_CR_INDEX_CGA 0x3d4 +#define VGA_CR_DATA_CGA 0x3d5 + +/* + * Memory interface instructions used by the kernel + */ +#define MI_INSTR(opcode, flags) (((opcode) << 23) | (flags)) + +#define MI_NOOP MI_INSTR(0, 0) +#define MI_USER_INTERRUPT MI_INSTR(0x02, 0) +#define MI_WAIT_FOR_EVENT MI_INSTR(0x03, 0) +#define MI_WAIT_FOR_OVERLAY_FLIP (1<<16) +#define MI_WAIT_FOR_PLANE_B_FLIP (1<<6) +#define MI_WAIT_FOR_PLANE_A_FLIP (1<<2) +#define MI_WAIT_FOR_PLANE_A_SCANLINES (1<<1) +#define MI_FLUSH MI_INSTR(0x04, 0) +#define MI_READ_FLUSH (1 << 0) +#define MI_EXE_FLUSH (1 << 1) +#define MI_NO_WRITE_FLUSH (1 << 2) +#define MI_SCENE_COUNT (1 << 3) /* just increment scene count */ +#define MI_END_SCENE (1 << 4) /* flush binner and incr scene count */ +#define MI_INVALIDATE_ISP (1 << 5) /* invalidate indirect state pointers */ +#define MI_BATCH_BUFFER_END MI_INSTR(0x0a, 0) +#define MI_SUSPEND_FLUSH MI_INSTR(0x0b, 0) +#define MI_SUSPEND_FLUSH_EN (1<<0) +#define MI_REPORT_HEAD MI_INSTR(0x07, 0) +#define MI_OVERLAY_FLIP MI_INSTR(0x11, 0) +#define MI_OVERLAY_CONTINUE (0x0<<21) +#define MI_OVERLAY_ON (0x1<<21) +#define MI_OVERLAY_OFF (0x2<<21) +#define MI_LOAD_SCAN_LINES_INCL MI_INSTR(0x12, 0) +#define MI_DISPLAY_FLIP MI_INSTR(0x14, 2) +#define MI_DISPLAY_FLIP_I915 MI_INSTR(0x14, 1) +#define MI_DISPLAY_FLIP_PLANE(n) ((n) << 20) +#define MI_SET_CONTEXT MI_INSTR(0x18, 0) +#define MI_MM_SPACE_GTT (1<<8) +#define MI_MM_SPACE_PHYSICAL (0<<8) +#define MI_SAVE_EXT_STATE_EN (1<<3) +#define MI_RESTORE_EXT_STATE_EN (1<<2) +#define MI_FORCE_RESTORE (1<<1) +#define MI_RESTORE_INHIBIT (1<<0) +#define MI_STORE_DWORD_IMM MI_INSTR(0x20, 1) +#define MI_MEM_VIRTUAL (1 << 22) /* 965+ only */ +#define MI_STORE_DWORD_INDEX MI_INSTR(0x21, 1) +#define MI_STORE_DWORD_INDEX_SHIFT 2 +/* Official intel docs are somewhat sloppy concerning MI_LOAD_REGISTER_IMM: + * - Always issue a MI_NOOP _before_ the MI_LOAD_REGISTER_IMM - otherwise hw + * simply ignores the register load under certain conditions. + * - One can actually load arbitrary many arbitrary registers: Simply issue x + * address/value pairs. Don't overdue it, though, x <= 2^4 must hold! + */ +#define MI_LOAD_REGISTER_IMM(x) MI_INSTR(0x22, 2*x-1) +#define MI_FLUSH_DW MI_INSTR(0x26, 1) /* for GEN6 */ +#define MI_INVALIDATE_TLB (1<<18) +#define MI_INVALIDATE_BSD (1<<7) +#define MI_BATCH_BUFFER MI_INSTR(0x30, 1) +#define MI_BATCH_NON_SECURE (1) +#define MI_BATCH_NON_SECURE_I965 (1<<8) +#define MI_BATCH_BUFFER_START MI_INSTR(0x31, 0) +#define MI_SEMAPHORE_MBOX MI_INSTR(0x16, 1) /* gen6+ */ +#define MI_SEMAPHORE_GLOBAL_GTT (1<<22) +#define MI_SEMAPHORE_UPDATE (1<<21) +#define MI_SEMAPHORE_COMPARE (1<<20) +#define MI_SEMAPHORE_REGISTER (1<<18) +#define MI_SEMAPHORE_SYNC_RV (2<<16) +#define MI_SEMAPHORE_SYNC_RB (0<<16) +#define MI_SEMAPHORE_SYNC_VR (0<<16) +#define MI_SEMAPHORE_SYNC_VB (2<<16) +#define MI_SEMAPHORE_SYNC_BR (2<<16) +#define MI_SEMAPHORE_SYNC_BV (0<<16) +#define MI_SEMAPHORE_SYNC_INVALID (1<<0) +/* + * 3D instructions used by the kernel + */ +#define GFX_INSTR(opcode, flags) ((0x3 << 29) | ((opcode) << 24) | (flags)) + +#define GFX_OP_RASTER_RULES ((0x3<<29)|(0x7<<24)) +#define GFX_OP_SCISSOR ((0x3<<29)|(0x1c<<24)|(0x10<<19)) +#define SC_UPDATE_SCISSOR (0x1<<1) +#define SC_ENABLE_MASK (0x1<<0) +#define SC_ENABLE (0x1<<0) +#define GFX_OP_LOAD_INDIRECT ((0x3<<29)|(0x1d<<24)|(0x7<<16)) +#define GFX_OP_SCISSOR_INFO ((0x3<<29)|(0x1d<<24)|(0x81<<16)|(0x1)) +#define SCI_YMIN_MASK (0xffff<<16) +#define SCI_XMIN_MASK (0xffff<<0) +#define SCI_YMAX_MASK (0xffff<<16) +#define SCI_XMAX_MASK (0xffff<<0) +#define GFX_OP_SCISSOR_ENABLE ((0x3<<29)|(0x1c<<24)|(0x10<<19)) +#define GFX_OP_SCISSOR_RECT ((0x3<<29)|(0x1d<<24)|(0x81<<16)|1) +#define GFX_OP_COLOR_FACTOR ((0x3<<29)|(0x1d<<24)|(0x1<<16)|0x0) +#define GFX_OP_STIPPLE ((0x3<<29)|(0x1d<<24)|(0x83<<16)) +#define GFX_OP_MAP_INFO ((0x3<<29)|(0x1d<<24)|0x4) +#define GFX_OP_DESTBUFFER_VARS ((0x3<<29)|(0x1d<<24)|(0x85<<16)|0x0) +#define GFX_OP_DESTBUFFER_INFO ((0x3<<29)|(0x1d<<24)|(0x8e<<16)|1) +#define GFX_OP_DRAWRECT_INFO ((0x3<<29)|(0x1d<<24)|(0x80<<16)|(0x3)) +#define GFX_OP_DRAWRECT_INFO_I965 ((0x7900<<16)|0x2) +#define SRC_COPY_BLT_CMD ((2<<29)|(0x43<<22)|4) +#define XY_SRC_COPY_BLT_CMD ((2<<29)|(0x53<<22)|6) +#define XY_MONO_SRC_COPY_IMM_BLT ((2<<29)|(0x71<<22)|5) +#define XY_SRC_COPY_BLT_WRITE_ALPHA (1<<21) +#define XY_SRC_COPY_BLT_WRITE_RGB (1<<20) +#define BLT_DEPTH_8 (0<<24) +#define BLT_DEPTH_16_565 (1<<24) +#define BLT_DEPTH_16_1555 (2<<24) +#define BLT_DEPTH_32 (3<<24) +#define BLT_ROP_GXCOPY (0xcc<<16) +#define XY_SRC_COPY_BLT_SRC_TILED (1<<15) /* 965+ only */ +#define XY_SRC_COPY_BLT_DST_TILED (1<<11) /* 965+ only */ +#define CMD_OP_DISPLAYBUFFER_INFO ((0x0<<29)|(0x14<<23)|2) +#define ASYNC_FLIP (1<<22) +#define DISPLAY_PLANE_A (0<<20) +#define DISPLAY_PLANE_B (1<<20) +#define GFX_OP_PIPE_CONTROL(len) ((0x3<<29)|(0x3<<27)|(0x2<<24)|(len-2)) +#define PIPE_CONTROL_CS_STALL (1<<20) +#define PIPE_CONTROL_QW_WRITE (1<<14) +#define PIPE_CONTROL_DEPTH_STALL (1<<13) +#define PIPE_CONTROL_WRITE_FLUSH (1<<12) +#define PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH (1<<12) /* gen6+ */ +#define PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE (1<<11) /* MBZ on Ironlake */ +#define PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE (1<<10) /* GM45+ only */ +#define PIPE_CONTROL_INDIRECT_STATE_DISABLE (1<<9) +#define PIPE_CONTROL_NOTIFY (1<<8) +#define PIPE_CONTROL_VF_CACHE_INVALIDATE (1<<4) +#define PIPE_CONTROL_CONST_CACHE_INVALIDATE (1<<3) +#define PIPE_CONTROL_STATE_CACHE_INVALIDATE (1<<2) +#define PIPE_CONTROL_STALL_AT_SCOREBOARD (1<<1) +#define PIPE_CONTROL_DEPTH_CACHE_FLUSH (1<<0) +#define PIPE_CONTROL_GLOBAL_GTT (1<<2) /* in addr dword */ + + +/* + * Reset registers + */ +#define DEBUG_RESET_I830 0x6070 +#define DEBUG_RESET_FULL (1<<7) +#define DEBUG_RESET_RENDER (1<<8) +#define DEBUG_RESET_DISPLAY (1<<9) + + +/* + * Fence registers + */ +#define FENCE_REG_830_0 0x2000 +#define FENCE_REG_945_8 0x3000 +#define I830_FENCE_START_MASK 0x07f80000 +#define I830_FENCE_TILING_Y_SHIFT 12 +#define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8) +#define I830_FENCE_PITCH_SHIFT 4 +#define I830_FENCE_REG_VALID (1<<0) +#define I915_FENCE_MAX_PITCH_VAL 4 +#define I830_FENCE_MAX_PITCH_VAL 6 +#define I830_FENCE_MAX_SIZE_VAL (1<<8) + +#define I915_FENCE_START_MASK 0x0ff00000 +#define I915_FENCE_SIZE_BITS(size) ((ffs((size) >> 20) - 1) << 8) + +#define FENCE_REG_965_0 0x03000 +#define I965_FENCE_PITCH_SHIFT 2 +#define I965_FENCE_TILING_Y_SHIFT 1 +#define I965_FENCE_REG_VALID (1<<0) +#define I965_FENCE_MAX_PITCH_VAL 0x0400 + +#define FENCE_REG_SANDYBRIDGE_0 0x100000 +#define SANDYBRIDGE_FENCE_PITCH_SHIFT 32 + +/* control register for cpu gtt access */ +#define TILECTL 0x101000 +#define TILECTL_SWZCTL (1 << 0) +#define TILECTL_TLB_PREFETCH_DIS (1 << 2) +#define TILECTL_BACKSNOOP_DIS (1 << 3) + +/* + * Instruction and interrupt control regs + */ +#define PGTBL_ER 0x02024 +#define RENDER_RING_BASE 0x02000 +#define BSD_RING_BASE 0x04000 +#define GEN6_BSD_RING_BASE 0x12000 +#define BLT_RING_BASE 0x22000 +#define RING_TAIL(base) ((base)+0x30) +#define RING_HEAD(base) ((base)+0x34) +#define RING_START(base) ((base)+0x38) +#define RING_CTL(base) ((base)+0x3c) +#define RING_SYNC_0(base) ((base)+0x40) +#define RING_SYNC_1(base) ((base)+0x44) +#define GEN6_RVSYNC (RING_SYNC_0(RENDER_RING_BASE)) +#define GEN6_RBSYNC (RING_SYNC_1(RENDER_RING_BASE)) +#define GEN6_VRSYNC (RING_SYNC_1(GEN6_BSD_RING_BASE)) +#define GEN6_VBSYNC (RING_SYNC_0(GEN6_BSD_RING_BASE)) +#define GEN6_BRSYNC (RING_SYNC_0(BLT_RING_BASE)) +#define GEN6_BVSYNC (RING_SYNC_1(BLT_RING_BASE)) +#define RING_MAX_IDLE(base) ((base)+0x54) +#define RING_HWS_PGA(base) ((base)+0x80) +#define RING_HWS_PGA_GEN6(base) ((base)+0x2080) +#define ARB_MODE 0x04030 +#define ARB_MODE_SWIZZLE_SNB (1<<4) +#define ARB_MODE_SWIZZLE_IVB (1<<5) +#define ARB_MODE_ENABLE(x) GFX_MODE_ENABLE(x) +#define ARB_MODE_DISABLE(x) GFX_MODE_DISABLE(x) +#define RENDER_HWS_PGA_GEN7 (0x04080) +#define RING_FAULT_REG(ring) (0x4094 + 0x100*(ring)->id) +#define DONE_REG 0x40b0 +#define BSD_HWS_PGA_GEN7 (0x04180) +#define BLT_HWS_PGA_GEN7 (0x04280) +#define RING_ACTHD(base) ((base)+0x74) +#define RING_NOPID(base) ((base)+0x94) +#define RING_IMR(base) ((base)+0xa8) +#define TAIL_ADDR 0x001FFFF8 +#define HEAD_WRAP_COUNT 0xFFE00000 +#define HEAD_WRAP_ONE 0x00200000 +#define HEAD_ADDR 0x001FFFFC +#define RING_NR_PAGES 0x001FF000 +#define RING_REPORT_MASK 0x00000006 +#define RING_REPORT_64K 0x00000002 +#define RING_REPORT_128K 0x00000004 +#define RING_NO_REPORT 0x00000000 +#define RING_VALID_MASK 0x00000001 +#define RING_VALID 0x00000001 +#define RING_INVALID 0x00000000 +#define RING_WAIT_I8XX (1<<0) /* gen2, PRBx_HEAD */ +#define RING_WAIT (1<<11) /* gen3+, PRBx_CTL */ +#define RING_WAIT_SEMAPHORE (1<<10) /* gen6+ */ +#if 0 +#define PRB0_TAIL 0x02030 +#define PRB0_HEAD 0x02034 +#define PRB0_START 0x02038 +#define PRB0_CTL 0x0203c +#define PRB1_TAIL 0x02040 /* 915+ only */ +#define PRB1_HEAD 0x02044 /* 915+ only */ +#define PRB1_START 0x02048 /* 915+ only */ +#define PRB1_CTL 0x0204c /* 915+ only */ +#endif +#define IPEIR_I965 0x02064 +#define IPEHR_I965 0x02068 +#define INSTDONE_I965 0x0206c +#define RING_IPEIR(base) ((base)+0x64) +#define RING_IPEHR(base) ((base)+0x68) +#define RING_INSTDONE(base) ((base)+0x6c) +#define RING_INSTPS(base) ((base)+0x70) +#define RING_DMA_FADD(base) ((base)+0x78) +#define RING_INSTPM(base) ((base)+0xc0) +#define INSTPS 0x02070 /* 965+ only */ +#define INSTDONE1 0x0207c /* 965+ only */ +#define ACTHD_I965 0x02074 +#define HWS_PGA 0x02080 +#define HWS_ADDRESS_MASK 0xfffff000 +#define HWS_START_ADDRESS_SHIFT 4 +#define PWRCTXA 0x2088 /* 965GM+ only */ +#define PWRCTX_EN (1<<0) +#define IPEIR 0x02088 +#define IPEHR 0x0208c +#define INSTDONE 0x02090 +#define NOPID 0x02094 +#define HWSTAM 0x02098 + +#define ERROR_GEN6 0x040a0 + +/* GM45+ chicken bits -- debug workaround bits that may be required + * for various sorts of correct behavior. The top 16 bits of each are + * the enables for writing to the corresponding low bit. + */ +#define _3D_CHICKEN 0x02084 +#define _3D_CHICKEN2 0x0208c +/* Disables pipelining of read flushes past the SF-WIZ interface. + * Required on all Ironlake steppings according to the B-Spec, but the + * particular danger of not doing so is not specified. + */ +# define _3D_CHICKEN2_WM_READ_PIPELINED (1 << 14) +#define _3D_CHICKEN3 0x02090 + +#define MI_MODE 0x0209c +# define VS_TIMER_DISPATCH (1 << 6) +# define MI_FLUSH_ENABLE (1 << 12) + +#define GFX_MODE 0x02520 +#define GFX_MODE_GEN7 0x0229c +#define RING_MODE_GEN7(ring) ((ring)->mmio_base+0x29c) +#define GFX_RUN_LIST_ENABLE (1<<15) +#define GFX_TLB_INVALIDATE_ALWAYS (1<<13) +#define GFX_SURFACE_FAULT_ENABLE (1<<12) +#define GFX_REPLAY_MODE (1<<11) +#define GFX_PSMI_GRANULARITY (1<<10) +#define GFX_PPGTT_ENABLE (1<<9) + +#define GFX_MODE_ENABLE(bit) (((bit) << 16) | (bit)) +#define GFX_MODE_DISABLE(bit) (((bit) << 16) | (0)) + +#define SCPD0 0x0209c /* 915+ only */ +#define IER 0x020a0 +#define IIR 0x020a4 +#define IMR 0x020a8 +#define ISR 0x020ac +#define I915_PIPE_CONTROL_NOTIFY_INTERRUPT (1<<18) +#define I915_DISPLAY_PORT_INTERRUPT (1<<17) +#define I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT (1<<15) +#define I915_GMCH_THERMAL_SENSOR_EVENT_INTERRUPT (1<<14) /* p-state */ +#define I915_HWB_OOM_INTERRUPT (1<<13) +#define I915_SYNC_STATUS_INTERRUPT (1<<12) +#define I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT (1<<11) +#define I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT (1<<10) +#define I915_OVERLAY_PLANE_FLIP_PENDING_INTERRUPT (1<<9) +#define I915_DISPLAY_PLANE_C_FLIP_PENDING_INTERRUPT (1<<8) +#define I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT (1<<7) +#define I915_DISPLAY_PIPE_A_EVENT_INTERRUPT (1<<6) +#define I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT (1<<5) +#define I915_DISPLAY_PIPE_B_EVENT_INTERRUPT (1<<4) +#define I915_DEBUG_INTERRUPT (1<<2) +#define I915_USER_INTERRUPT (1<<1) +#define I915_ASLE_INTERRUPT (1<<0) +#define I915_BSD_USER_INTERRUPT (1<<25) +#define EIR 0x020b0 +#define EMR 0x020b4 +#define ESR 0x020b8 +#define GM45_ERROR_PAGE_TABLE (1<<5) +#define GM45_ERROR_MEM_PRIV (1<<4) +#define I915_ERROR_PAGE_TABLE (1<<4) +#define GM45_ERROR_CP_PRIV (1<<3) +#define I915_ERROR_MEMORY_REFRESH (1<<1) +#define I915_ERROR_INSTRUCTION (1<<0) +#define INSTPM 0x020c0 +#define INSTPM_SELF_EN (1<<12) /* 915GM only */ +#define INSTPM_AGPBUSY_DIS (1<<11) /* gen3: when disabled, pending interrupts + will not assert AGPBUSY# and will only + be delivered when out of C3. */ +#define INSTPM_FORCE_ORDERING (1<<7) /* GEN6+ */ +#define ACTHD 0x020c8 +#define FW_BLC 0x020d8 +#define FW_BLC2 0x020dc +#define FW_BLC_SELF 0x020e0 /* 915+ only */ +#define FW_BLC_SELF_EN_MASK (1<<31) +#define FW_BLC_SELF_FIFO_MASK (1<<16) /* 945 only */ +#define FW_BLC_SELF_EN (1<<15) /* 945 only */ +#define MM_BURST_LENGTH 0x00700000 +#define MM_FIFO_WATERMARK 0x0001F000 +#define LM_BURST_LENGTH 0x00000700 +#define LM_FIFO_WATERMARK 0x0000001F +#define MI_ARB_STATE 0x020e4 /* 915+ only */ +#define MI_ARB_MASK_SHIFT 16 /* shift for enable bits */ + +/* Make render/texture TLB fetches lower priorty than associated data + * fetches. This is not turned on by default + */ +#define MI_ARB_RENDER_TLB_LOW_PRIORITY (1 << 15) + +/* Isoch request wait on GTT enable (Display A/B/C streams). + * Make isoch requests stall on the TLB update. May cause + * display underruns (test mode only) + */ +#define MI_ARB_ISOCH_WAIT_GTT (1 << 14) + +/* Block grant count for isoch requests when block count is + * set to a finite value. + */ +#define MI_ARB_BLOCK_GRANT_MASK (3 << 12) +#define MI_ARB_BLOCK_GRANT_8 (0 << 12) /* for 3 display planes */ +#define MI_ARB_BLOCK_GRANT_4 (1 << 12) /* for 2 display planes */ +#define MI_ARB_BLOCK_GRANT_2 (2 << 12) /* for 1 display plane */ +#define MI_ARB_BLOCK_GRANT_0 (3 << 12) /* don't use */ + +/* Enable render writes to complete in C2/C3/C4 power states. + * If this isn't enabled, render writes are prevented in low + * power states. That seems bad to me. + */ +#define MI_ARB_C3_LP_WRITE_ENABLE (1 << 11) + +/* This acknowledges an async flip immediately instead + * of waiting for 2TLB fetches. + */ +#define MI_ARB_ASYNC_FLIP_ACK_IMMEDIATE (1 << 10) + +/* Enables non-sequential data reads through arbiter + */ +#define MI_ARB_DUAL_DATA_PHASE_DISABLE (1 << 9) + +/* Disable FSB snooping of cacheable write cycles from binner/render + * command stream + */ +#define MI_ARB_CACHE_SNOOP_DISABLE (1 << 8) + +/* Arbiter time slice for non-isoch streams */ +#define MI_ARB_TIME_SLICE_MASK (7 << 5) +#define MI_ARB_TIME_SLICE_1 (0 << 5) +#define MI_ARB_TIME_SLICE_2 (1 << 5) +#define MI_ARB_TIME_SLICE_4 (2 << 5) +#define MI_ARB_TIME_SLICE_6 (3 << 5) +#define MI_ARB_TIME_SLICE_8 (4 << 5) +#define MI_ARB_TIME_SLICE_10 (5 << 5) +#define MI_ARB_TIME_SLICE_14 (6 << 5) +#define MI_ARB_TIME_SLICE_16 (7 << 5) + +/* Low priority grace period page size */ +#define MI_ARB_LOW_PRIORITY_GRACE_4KB (0 << 4) /* default */ +#define MI_ARB_LOW_PRIORITY_GRACE_8KB (1 << 4) + +/* Disable display A/B trickle feed */ +#define MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE (1 << 2) + +/* Set display plane priority */ +#define MI_ARB_DISPLAY_PRIORITY_A_B (0 << 0) /* display A > display B */ +#define MI_ARB_DISPLAY_PRIORITY_B_A (1 << 0) /* display B > display A */ + +#define CACHE_MODE_0 0x02120 /* 915+ only */ +#define CM0_MASK_SHIFT 16 +#define CM0_IZ_OPT_DISABLE (1<<6) +#define CM0_ZR_OPT_DISABLE (1<<5) +#define CM0_STC_EVICT_DISABLE_LRA_SNB (1<<5) +#define CM0_DEPTH_EVICT_DISABLE (1<<4) +#define CM0_COLOR_EVICT_DISABLE (1<<3) +#define CM0_DEPTH_WRITE_DISABLE (1<<1) +#define CM0_RC_OP_FLUSH_DISABLE (1<<0) +#define BB_ADDR 0x02140 /* 8 bytes */ +#define GFX_FLSH_CNTL 0x02170 /* 915+ only */ +#define ECOSKPD 0x021d0 +#define ECO_GATING_CX_ONLY (1<<3) +#define ECO_FLIP_DONE (1<<0) + +/* GEN6 interrupt control */ +#define GEN6_RENDER_HWSTAM 0x2098 +#define GEN6_RENDER_IMR 0x20a8 +#define GEN6_RENDER_CONTEXT_SWITCH_INTERRUPT (1 << 8) +#define GEN6_RENDER_PPGTT_PAGE_FAULT (1 << 7) +#define GEN6_RENDER_TIMEOUT_COUNTER_EXPIRED (1 << 6) +#define GEN6_RENDER_L3_PARITY_ERROR (1 << 5) +#define GEN6_RENDER_PIPE_CONTROL_NOTIFY_INTERRUPT (1 << 4) +#define GEN6_RENDER_COMMAND_PARSER_MASTER_ERROR (1 << 3) +#define GEN6_RENDER_SYNC_STATUS (1 << 2) +#define GEN6_RENDER_DEBUG_INTERRUPT (1 << 1) +#define GEN6_RENDER_USER_INTERRUPT (1 << 0) + +#define GEN6_BLITTER_HWSTAM 0x22098 +#define GEN6_BLITTER_IMR 0x220a8 +#define GEN6_BLITTER_MI_FLUSH_DW_NOTIFY_INTERRUPT (1 << 26) +#define GEN6_BLITTER_COMMAND_PARSER_MASTER_ERROR (1 << 25) +#define GEN6_BLITTER_SYNC_STATUS (1 << 24) +#define GEN6_BLITTER_USER_INTERRUPT (1 << 22) + +#define GEN6_BLITTER_ECOSKPD 0x221d0 +#define GEN6_BLITTER_LOCK_SHIFT 16 +#define GEN6_BLITTER_FBC_NOTIFY (1<<3) + +#define GEN6_BSD_SLEEP_PSMI_CONTROL 0x12050 +#define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK (1 << 16) +#define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE (1 << 0) +#define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE 0 +#define GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR (1 << 3) + +#define GEN6_BSD_HWSTAM 0x12098 +#define GEN6_BSD_IMR 0x120a8 +#define GEN6_BSD_USER_INTERRUPT (1 << 12) + +#define GEN6_BSD_RNCID 0x12198 + +/* + * Framebuffer compression (915+ only) + */ + +#define FBC_CFB_BASE 0x03200 /* 4k page aligned */ +#define FBC_LL_BASE 0x03204 /* 4k page aligned */ +#define FBC_CONTROL 0x03208 +#define FBC_CTL_EN (1<<31) +#define FBC_CTL_PERIODIC (1<<30) +#define FBC_CTL_INTERVAL_SHIFT (16) +#define FBC_CTL_UNCOMPRESSIBLE (1<<14) +#define FBC_CTL_C3_IDLE (1<<13) +#define FBC_CTL_STRIDE_SHIFT (5) +#define FBC_CTL_FENCENO (1<<0) +#define FBC_COMMAND 0x0320c +#define FBC_CMD_COMPRESS (1<<0) +#define FBC_STATUS 0x03210 +#define FBC_STAT_COMPRESSING (1<<31) +#define FBC_STAT_COMPRESSED (1<<30) +#define FBC_STAT_MODIFIED (1<<29) +#define FBC_STAT_CURRENT_LINE (1<<0) +#define FBC_CONTROL2 0x03214 +#define FBC_CTL_FENCE_DBL (0<<4) +#define FBC_CTL_IDLE_IMM (0<<2) +#define FBC_CTL_IDLE_FULL (1<<2) +#define FBC_CTL_IDLE_LINE (2<<2) +#define FBC_CTL_IDLE_DEBUG (3<<2) +#define FBC_CTL_CPU_FENCE (1<<1) +#define FBC_CTL_PLANEA (0<<0) +#define FBC_CTL_PLANEB (1<<0) +#define FBC_FENCE_OFF 0x0321b +#define FBC_TAG 0x03300 + +#define FBC_LL_SIZE (1536) + +/* Framebuffer compression for GM45+ */ +#define DPFC_CB_BASE 0x3200 +#define DPFC_CONTROL 0x3208 +#define DPFC_CTL_EN (1<<31) +#define DPFC_CTL_PLANEA (0<<30) +#define DPFC_CTL_PLANEB (1<<30) +#define DPFC_CTL_FENCE_EN (1<<29) +#define DPFC_CTL_PERSISTENT_MODE (1<<25) +#define DPFC_SR_EN (1<<10) +#define DPFC_CTL_LIMIT_1X (0<<6) +#define DPFC_CTL_LIMIT_2X (1<<6) +#define DPFC_CTL_LIMIT_4X (2<<6) +#define DPFC_RECOMP_CTL 0x320c +#define DPFC_RECOMP_STALL_EN (1<<27) +#define DPFC_RECOMP_STALL_WM_SHIFT (16) +#define DPFC_RECOMP_STALL_WM_MASK (0x07ff0000) +#define DPFC_RECOMP_TIMER_COUNT_SHIFT (0) +#define DPFC_RECOMP_TIMER_COUNT_MASK (0x0000003f) +#define DPFC_STATUS 0x3210 +#define DPFC_INVAL_SEG_SHIFT (16) +#define DPFC_INVAL_SEG_MASK (0x07ff0000) +#define DPFC_COMP_SEG_SHIFT (0) +#define DPFC_COMP_SEG_MASK (0x000003ff) +#define DPFC_STATUS2 0x3214 +#define DPFC_FENCE_YOFF 0x3218 +#define DPFC_CHICKEN 0x3224 +#define DPFC_HT_MODIFY (1<<31) + +/* Framebuffer compression for Ironlake */ +#define ILK_DPFC_CB_BASE 0x43200 +#define ILK_DPFC_CONTROL 0x43208 +/* The bit 28-8 is reserved */ +#define DPFC_RESERVED (0x1FFFFF00) +#define ILK_DPFC_RECOMP_CTL 0x4320c +#define ILK_DPFC_STATUS 0x43210 +#define ILK_DPFC_FENCE_YOFF 0x43218 +#define ILK_DPFC_CHICKEN 0x43224 +#define ILK_FBC_RT_BASE 0x2128 +#define ILK_FBC_RT_VALID (1<<0) + +#define ILK_DISPLAY_CHICKEN1 0x42000 +#define ILK_FBCQ_DIS (1<<22) +#define ILK_PABSTRETCH_DIS (1<<21) + + +/* + * Framebuffer compression for Sandybridge + * + * The following two registers are of type GTTMMADR + */ +#define SNB_DPFC_CTL_SA 0x100100 +#define SNB_CPU_FENCE_ENABLE (1<<29) +#define DPFC_CPU_FENCE_OFFSET 0x100104 + + +/* + * GPIO regs + */ +#define GPIOA 0x5010 +#define GPIOB 0x5014 +#define GPIOC 0x5018 +#define GPIOD 0x501c +#define GPIOE 0x5020 +#define GPIOF 0x5024 +#define GPIOG 0x5028 +#define GPIOH 0x502c +# define GPIO_CLOCK_DIR_MASK (1 << 0) +# define GPIO_CLOCK_DIR_IN (0 << 1) +# define GPIO_CLOCK_DIR_OUT (1 << 1) +# define GPIO_CLOCK_VAL_MASK (1 << 2) +# define GPIO_CLOCK_VAL_OUT (1 << 3) +# define GPIO_CLOCK_VAL_IN (1 << 4) +# define GPIO_CLOCK_PULLUP_DISABLE (1 << 5) +# define GPIO_DATA_DIR_MASK (1 << 8) +# define GPIO_DATA_DIR_IN (0 << 9) +# define GPIO_DATA_DIR_OUT (1 << 9) +# define GPIO_DATA_VAL_MASK (1 << 10) +# define GPIO_DATA_VAL_OUT (1 << 11) +# define GPIO_DATA_VAL_IN (1 << 12) +# define GPIO_DATA_PULLUP_DISABLE (1 << 13) + +#define GMBUS0 0x5100 /* clock/port select */ +#define GMBUS_RATE_100KHZ (0<<8) +#define GMBUS_RATE_50KHZ (1<<8) +#define GMBUS_RATE_400KHZ (2<<8) /* reserved on Pineview */ +#define GMBUS_RATE_1MHZ (3<<8) /* reserved on Pineview */ +#define GMBUS_HOLD_EXT (1<<7) /* 300ns hold time, rsvd on Pineview */ +#define GMBUS_PORT_DISABLED 0 +#define GMBUS_PORT_SSC 1 +#define GMBUS_PORT_VGADDC 2 +#define GMBUS_PORT_PANEL 3 +#define GMBUS_PORT_DPC 4 /* HDMIC */ +#define GMBUS_PORT_DPB 5 /* SDVO, HDMIB */ + /* 6 reserved */ +#define GMBUS_PORT_DPD 7 /* HDMID */ +#define GMBUS_NUM_PORTS 8 +#define GMBUS1 0x5104 /* command/status */ +#define GMBUS_SW_CLR_INT (1<<31) +#define GMBUS_SW_RDY (1<<30) +#define GMBUS_ENT (1<<29) /* enable timeout */ +#define GMBUS_CYCLE_NONE (0<<25) +#define GMBUS_CYCLE_WAIT (1<<25) +#define GMBUS_CYCLE_INDEX (2<<25) +#define GMBUS_CYCLE_STOP (4<<25) +#define GMBUS_BYTE_COUNT_SHIFT 16 +#define GMBUS_SLAVE_INDEX_SHIFT 8 +#define GMBUS_SLAVE_ADDR_SHIFT 1 +#define GMBUS_SLAVE_READ (1<<0) +#define GMBUS_SLAVE_WRITE (0<<0) +#define GMBUS2 0x5108 /* status */ +#define GMBUS_INUSE (1<<15) +#define GMBUS_HW_WAIT_PHASE (1<<14) +#define GMBUS_STALL_TIMEOUT (1<<13) +#define GMBUS_INT (1<<12) +#define GMBUS_HW_RDY (1<<11) +#define GMBUS_SATOER (1<<10) +#define GMBUS_ACTIVE (1<<9) +#define GMBUS3 0x510c /* data buffer bytes 3-0 */ +#define GMBUS4 0x5110 /* interrupt mask (Pineview+) */ +#define GMBUS_SLAVE_TIMEOUT_EN (1<<4) +#define GMBUS_NAK_EN (1<<3) +#define GMBUS_IDLE_EN (1<<2) +#define GMBUS_HW_WAIT_EN (1<<1) +#define GMBUS_HW_RDY_EN (1<<0) +#define GMBUS5 0x5120 /* byte index */ +#define GMBUS_2BYTE_INDEX_EN (1<<31) + +/* + * Clock control & power management + */ + +#define VGA0 0x6000 +#define VGA1 0x6004 +#define VGA_PD 0x6010 +#define VGA0_PD_P2_DIV_4 (1 << 7) +#define VGA0_PD_P1_DIV_2 (1 << 5) +#define VGA0_PD_P1_SHIFT 0 +#define VGA0_PD_P1_MASK (0x1f << 0) +#define VGA1_PD_P2_DIV_4 (1 << 15) +#define VGA1_PD_P1_DIV_2 (1 << 13) +#define VGA1_PD_P1_SHIFT 8 +#define VGA1_PD_P1_MASK (0x1f << 8) +#define _DPLL_A 0x06014 +#define _DPLL_B 0x06018 +#define DPLL(pipe) _PIPE(pipe, _DPLL_A, _DPLL_B) +#define DPLL_VCO_ENABLE (1 << 31) +#define DPLL_DVO_HIGH_SPEED (1 << 30) +#define DPLL_SYNCLOCK_ENABLE (1 << 29) +#define DPLL_VGA_MODE_DIS (1 << 28) +#define DPLLB_MODE_DAC_SERIAL (1 << 26) /* i915 */ +#define DPLLB_MODE_LVDS (2 << 26) /* i915 */ +#define DPLL_MODE_MASK (3 << 26) +#define DPLL_DAC_SERIAL_P2_CLOCK_DIV_10 (0 << 24) /* i915 */ +#define DPLL_DAC_SERIAL_P2_CLOCK_DIV_5 (1 << 24) /* i915 */ +#define DPLLB_LVDS_P2_CLOCK_DIV_14 (0 << 24) /* i915 */ +#define DPLLB_LVDS_P2_CLOCK_DIV_7 (1 << 24) /* i915 */ +#define DPLL_P2_CLOCK_DIV_MASK 0x03000000 /* i915 */ +#define DPLL_FPA01_P1_POST_DIV_MASK 0x00ff0000 /* i915 */ +#define DPLL_FPA01_P1_POST_DIV_MASK_PINEVIEW 0x00ff8000 /* Pineview */ + +#define SRX_INDEX 0x3c4 +#define SRX_DATA 0x3c5 +#define SR01 1 +#define SR01_SCREEN_OFF (1<<5) + +#define PPCR 0x61204 +#define PPCR_ON (1<<0) + +#define DVOB 0x61140 +#define DVOB_ON (1<<31) +#define DVOC 0x61160 +#define DVOC_ON (1<<31) +#define LVDS 0x61180 +#define LVDS_ON (1<<31) + +/* Scratch pad debug 0 reg: + */ +#define DPLL_FPA01_P1_POST_DIV_MASK_I830 0x001f0000 +/* + * The i830 generation, in LVDS mode, defines P1 as the bit number set within + * this field (only one bit may be set). + */ +#define DPLL_FPA01_P1_POST_DIV_MASK_I830_LVDS 0x003f0000 +#define DPLL_FPA01_P1_POST_DIV_SHIFT 16 +#define DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW 15 +/* i830, required in DVO non-gang */ +#define PLL_P2_DIVIDE_BY_4 (1 << 23) +#define PLL_P1_DIVIDE_BY_TWO (1 << 21) /* i830 */ +#define PLL_REF_INPUT_DREFCLK (0 << 13) +#define PLL_REF_INPUT_TVCLKINA (1 << 13) /* i830 */ +#define PLL_REF_INPUT_TVCLKINBC (2 << 13) /* SDVO TVCLKIN */ +#define PLLB_REF_INPUT_SPREADSPECTRUMIN (3 << 13) +#define PLL_REF_INPUT_MASK (3 << 13) +#define PLL_LOAD_PULSE_PHASE_SHIFT 9 +/* Ironlake */ +# define PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT 9 +# define PLL_REF_SDVO_HDMI_MULTIPLIER_MASK (7 << 9) +# define PLL_REF_SDVO_HDMI_MULTIPLIER(x) (((x)-1) << 9) +# define DPLL_FPA1_P1_POST_DIV_SHIFT 0 +# define DPLL_FPA1_P1_POST_DIV_MASK 0xff + +/* + * Parallel to Serial Load Pulse phase selection. + * Selects the phase for the 10X DPLL clock for the PCIe + * digital display port. The range is 4 to 13; 10 or more + * is just a flip delay. The default is 6 + */ +#define PLL_LOAD_PULSE_PHASE_MASK (0xf << PLL_LOAD_PULSE_PHASE_SHIFT) +#define DISPLAY_RATE_SELECT_FPA1 (1 << 8) +/* + * SDVO multiplier for 945G/GM. Not used on 965. + */ +#define SDVO_MULTIPLIER_MASK 0x000000ff +#define SDVO_MULTIPLIER_SHIFT_HIRES 4 +#define SDVO_MULTIPLIER_SHIFT_VGA 0 +#define _DPLL_A_MD 0x0601c /* 965+ only */ +/* + * UDI pixel divider, controlling how many pixels are stuffed into a packet. + * + * Value is pixels minus 1. Must be set to 1 pixel for SDVO. + */ +#define DPLL_MD_UDI_DIVIDER_MASK 0x3f000000 +#define DPLL_MD_UDI_DIVIDER_SHIFT 24 +/* UDI pixel divider for VGA, same as DPLL_MD_UDI_DIVIDER_MASK. */ +#define DPLL_MD_VGA_UDI_DIVIDER_MASK 0x003f0000 +#define DPLL_MD_VGA_UDI_DIVIDER_SHIFT 16 +/* + * SDVO/UDI pixel multiplier. + * + * SDVO requires that the bus clock rate be between 1 and 2 Ghz, and the bus + * clock rate is 10 times the DPLL clock. At low resolution/refresh rate + * modes, the bus rate would be below the limits, so SDVO allows for stuffing + * dummy bytes in the datastream at an increased clock rate, with both sides of + * the link knowing how many bytes are fill. + * + * So, for a mode with a dotclock of 65Mhz, we would want to double the clock + * rate to 130Mhz to get a bus rate of 1.30Ghz. The DPLL clock rate would be + * set to 130Mhz, and the SDVO multiplier set to 2x in this register and + * through an SDVO command. + * + * This register field has values of multiplication factor minus 1, with + * a maximum multiplier of 5 for SDVO. + */ +#define DPLL_MD_UDI_MULTIPLIER_MASK 0x00003f00 +#define DPLL_MD_UDI_MULTIPLIER_SHIFT 8 +/* + * SDVO/UDI pixel multiplier for VGA, same as DPLL_MD_UDI_MULTIPLIER_MASK. + * This best be set to the default value (3) or the CRT won't work. No, + * I don't entirely understand what this does... + */ +#define DPLL_MD_VGA_UDI_MULTIPLIER_MASK 0x0000003f +#define DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT 0 +#define _DPLL_B_MD 0x06020 /* 965+ only */ +#define DPLL_MD(pipe) _PIPE(pipe, _DPLL_A_MD, _DPLL_B_MD) +#define _FPA0 0x06040 +#define _FPA1 0x06044 +#define _FPB0 0x06048 +#define _FPB1 0x0604c +#define FP0(pipe) _PIPE(pipe, _FPA0, _FPB0) +#define FP1(pipe) _PIPE(pipe, _FPA1, _FPB1) +#define FP_N_DIV_MASK 0x003f0000 +#define FP_N_PINEVIEW_DIV_MASK 0x00ff0000 +#define FP_N_DIV_SHIFT 16 +#define FP_M1_DIV_MASK 0x00003f00 +#define FP_M1_DIV_SHIFT 8 +#define FP_M2_DIV_MASK 0x0000003f +#define FP_M2_PINEVIEW_DIV_MASK 0x000000ff +#define FP_M2_DIV_SHIFT 0 +#define DPLL_TEST 0x606c +#define DPLLB_TEST_SDVO_DIV_1 (0 << 22) +#define DPLLB_TEST_SDVO_DIV_2 (1 << 22) +#define DPLLB_TEST_SDVO_DIV_4 (2 << 22) +#define DPLLB_TEST_SDVO_DIV_MASK (3 << 22) +#define DPLLB_TEST_N_BYPASS (1 << 19) +#define DPLLB_TEST_M_BYPASS (1 << 18) +#define DPLLB_INPUT_BUFFER_ENABLE (1 << 16) +#define DPLLA_TEST_N_BYPASS (1 << 3) +#define DPLLA_TEST_M_BYPASS (1 << 2) +#define DPLLA_INPUT_BUFFER_ENABLE (1 << 0) +#define D_STATE 0x6104 +#define DSTATE_GFX_RESET_I830 (1<<6) +#define DSTATE_PLL_D3_OFF (1<<3) +#define DSTATE_GFX_CLOCK_GATING (1<<1) +#define DSTATE_DOT_CLOCK_GATING (1<<0) +#define DSPCLK_GATE_D 0x6200 +# define DPUNIT_B_CLOCK_GATE_DISABLE (1 << 30) /* 965 */ +# define VSUNIT_CLOCK_GATE_DISABLE (1 << 29) /* 965 */ +# define VRHUNIT_CLOCK_GATE_DISABLE (1 << 28) /* 965 */ +# define VRDUNIT_CLOCK_GATE_DISABLE (1 << 27) /* 965 */ +# define AUDUNIT_CLOCK_GATE_DISABLE (1 << 26) /* 965 */ +# define DPUNIT_A_CLOCK_GATE_DISABLE (1 << 25) /* 965 */ +# define DPCUNIT_CLOCK_GATE_DISABLE (1 << 24) /* 965 */ +# define TVRUNIT_CLOCK_GATE_DISABLE (1 << 23) /* 915-945 */ +# define TVCUNIT_CLOCK_GATE_DISABLE (1 << 22) /* 915-945 */ +# define TVFUNIT_CLOCK_GATE_DISABLE (1 << 21) /* 915-945 */ +# define TVEUNIT_CLOCK_GATE_DISABLE (1 << 20) /* 915-945 */ +# define DVSUNIT_CLOCK_GATE_DISABLE (1 << 19) /* 915-945 */ +# define DSSUNIT_CLOCK_GATE_DISABLE (1 << 18) /* 915-945 */ +# define DDBUNIT_CLOCK_GATE_DISABLE (1 << 17) /* 915-945 */ +# define DPRUNIT_CLOCK_GATE_DISABLE (1 << 16) /* 915-945 */ +# define DPFUNIT_CLOCK_GATE_DISABLE (1 << 15) /* 915-945 */ +# define DPBMUNIT_CLOCK_GATE_DISABLE (1 << 14) /* 915-945 */ +# define DPLSUNIT_CLOCK_GATE_DISABLE (1 << 13) /* 915-945 */ +# define DPLUNIT_CLOCK_GATE_DISABLE (1 << 12) /* 915-945 */ +# define DPOUNIT_CLOCK_GATE_DISABLE (1 << 11) +# define DPBUNIT_CLOCK_GATE_DISABLE (1 << 10) +# define DCUNIT_CLOCK_GATE_DISABLE (1 << 9) +# define DPUNIT_CLOCK_GATE_DISABLE (1 << 8) +# define VRUNIT_CLOCK_GATE_DISABLE (1 << 7) /* 915+: reserved */ +# define OVHUNIT_CLOCK_GATE_DISABLE (1 << 6) /* 830-865 */ +# define DPIOUNIT_CLOCK_GATE_DISABLE (1 << 6) /* 915-945 */ +# define OVFUNIT_CLOCK_GATE_DISABLE (1 << 5) +# define OVBUNIT_CLOCK_GATE_DISABLE (1 << 4) +/** + * This bit must be set on the 830 to prevent hangs when turning off the + * overlay scaler. + */ +# define OVRUNIT_CLOCK_GATE_DISABLE (1 << 3) +# define OVCUNIT_CLOCK_GATE_DISABLE (1 << 2) +# define OVUUNIT_CLOCK_GATE_DISABLE (1 << 1) +# define ZVUNIT_CLOCK_GATE_DISABLE (1 << 0) /* 830 */ +# define OVLUNIT_CLOCK_GATE_DISABLE (1 << 0) /* 845,865 */ + +#define RENCLK_GATE_D1 0x6204 +# define BLITTER_CLOCK_GATE_DISABLE (1 << 13) /* 945GM only */ +# define MPEG_CLOCK_GATE_DISABLE (1 << 12) /* 945GM only */ +# define PC_FE_CLOCK_GATE_DISABLE (1 << 11) +# define PC_BE_CLOCK_GATE_DISABLE (1 << 10) +# define WINDOWER_CLOCK_GATE_DISABLE (1 << 9) +# define INTERPOLATOR_CLOCK_GATE_DISABLE (1 << 8) +# define COLOR_CALCULATOR_CLOCK_GATE_DISABLE (1 << 7) +# define MOTION_COMP_CLOCK_GATE_DISABLE (1 << 6) +# define MAG_CLOCK_GATE_DISABLE (1 << 5) +/** This bit must be unset on 855,865 */ +# define MECI_CLOCK_GATE_DISABLE (1 << 4) +# define DCMP_CLOCK_GATE_DISABLE (1 << 3) +# define MEC_CLOCK_GATE_DISABLE (1 << 2) +# define MECO_CLOCK_GATE_DISABLE (1 << 1) +/** This bit must be set on 855,865. */ +# define SV_CLOCK_GATE_DISABLE (1 << 0) +# define I915_MPEG_CLOCK_GATE_DISABLE (1 << 16) +# define I915_VLD_IP_PR_CLOCK_GATE_DISABLE (1 << 15) +# define I915_MOTION_COMP_CLOCK_GATE_DISABLE (1 << 14) +# define I915_BD_BF_CLOCK_GATE_DISABLE (1 << 13) +# define I915_SF_SE_CLOCK_GATE_DISABLE (1 << 12) +# define I915_WM_CLOCK_GATE_DISABLE (1 << 11) +# define I915_IZ_CLOCK_GATE_DISABLE (1 << 10) +# define I915_PI_CLOCK_GATE_DISABLE (1 << 9) +# define I915_DI_CLOCK_GATE_DISABLE (1 << 8) +# define I915_SH_SV_CLOCK_GATE_DISABLE (1 << 7) +# define I915_PL_DG_QC_FT_CLOCK_GATE_DISABLE (1 << 6) +# define I915_SC_CLOCK_GATE_DISABLE (1 << 5) +# define I915_FL_CLOCK_GATE_DISABLE (1 << 4) +# define I915_DM_CLOCK_GATE_DISABLE (1 << 3) +# define I915_PS_CLOCK_GATE_DISABLE (1 << 2) +# define I915_CC_CLOCK_GATE_DISABLE (1 << 1) +# define I915_BY_CLOCK_GATE_DISABLE (1 << 0) + +# define I965_RCZ_CLOCK_GATE_DISABLE (1 << 30) +/** This bit must always be set on 965G/965GM */ +# define I965_RCC_CLOCK_GATE_DISABLE (1 << 29) +# define I965_RCPB_CLOCK_GATE_DISABLE (1 << 28) +# define I965_DAP_CLOCK_GATE_DISABLE (1 << 27) +# define I965_ROC_CLOCK_GATE_DISABLE (1 << 26) +# define I965_GW_CLOCK_GATE_DISABLE (1 << 25) +# define I965_TD_CLOCK_GATE_DISABLE (1 << 24) +/** This bit must always be set on 965G */ +# define I965_ISC_CLOCK_GATE_DISABLE (1 << 23) +# define I965_IC_CLOCK_GATE_DISABLE (1 << 22) +# define I965_EU_CLOCK_GATE_DISABLE (1 << 21) +# define I965_IF_CLOCK_GATE_DISABLE (1 << 20) +# define I965_TC_CLOCK_GATE_DISABLE (1 << 19) +# define I965_SO_CLOCK_GATE_DISABLE (1 << 17) +# define I965_FBC_CLOCK_GATE_DISABLE (1 << 16) +# define I965_MARI_CLOCK_GATE_DISABLE (1 << 15) +# define I965_MASF_CLOCK_GATE_DISABLE (1 << 14) +# define I965_MAWB_CLOCK_GATE_DISABLE (1 << 13) +# define I965_EM_CLOCK_GATE_DISABLE (1 << 12) +# define I965_UC_CLOCK_GATE_DISABLE (1 << 11) +# define I965_SI_CLOCK_GATE_DISABLE (1 << 6) +# define I965_MT_CLOCK_GATE_DISABLE (1 << 5) +# define I965_PL_CLOCK_GATE_DISABLE (1 << 4) +# define I965_DG_CLOCK_GATE_DISABLE (1 << 3) +# define I965_QC_CLOCK_GATE_DISABLE (1 << 2) +# define I965_FT_CLOCK_GATE_DISABLE (1 << 1) +# define I965_DM_CLOCK_GATE_DISABLE (1 << 0) + +#define RENCLK_GATE_D2 0x6208 +#define VF_UNIT_CLOCK_GATE_DISABLE (1 << 9) +#define GS_UNIT_CLOCK_GATE_DISABLE (1 << 7) +#define CL_UNIT_CLOCK_GATE_DISABLE (1 << 6) +#define RAMCLK_GATE_D 0x6210 /* CRL only */ +#define DEUC 0x6214 /* CRL only */ + +/* + * Palette regs + */ + +#define _PALETTE_A 0x0a000 +#define _PALETTE_B 0x0a800 +#define PALETTE(pipe) _PIPE(pipe, _PALETTE_A, _PALETTE_B) + +/* MCH MMIO space */ + +/* + * MCHBAR mirror. + * + * This mirrors the MCHBAR MMIO space whose location is determined by + * device 0 function 0's pci config register 0x44 or 0x48 and matches it in + * every way. It is not accessible from the CP register read instructions. + * + */ +#define MCHBAR_MIRROR_BASE 0x10000 + +#define MCHBAR_MIRROR_BASE_SNB 0x140000 + +/** 915-945 and GM965 MCH register controlling DRAM channel access */ +#define DCC 0x10200 +#define DCC_ADDRESSING_MODE_SINGLE_CHANNEL (0 << 0) +#define DCC_ADDRESSING_MODE_DUAL_CHANNEL_ASYMMETRIC (1 << 0) +#define DCC_ADDRESSING_MODE_DUAL_CHANNEL_INTERLEAVED (2 << 0) +#define DCC_ADDRESSING_MODE_MASK (3 << 0) +#define DCC_CHANNEL_XOR_DISABLE (1 << 10) +#define DCC_CHANNEL_XOR_BIT_17 (1 << 9) + +/** Pineview MCH register contains DDR3 setting */ +#define CSHRDDR3CTL 0x101a8 +#define CSHRDDR3CTL_DDR3 (1 << 2) + +/** 965 MCH register controlling DRAM channel configuration */ +#define C0DRB3 0x10206 +#define C1DRB3 0x10606 + +/** snb MCH registers for reading the DRAM channel configuration */ +#define MAD_DIMM_C0 (MCHBAR_MIRROR_BASE_SNB + 0x5004) +#define MAD_DIMM_C1 (MCHBAR_MIRROR_BASE_SNB + 0x5008) +#define MAD_DIMM_C2 (MCHBAR_MIRROR_BASE_SNB + 0x500C) +#define MAD_DIMM_ECC_MASK (0x3 << 24) +#define MAD_DIMM_ECC_OFF (0x0 << 24) +#define MAD_DIMM_ECC_IO_ON_LOGIC_OFF (0x1 << 24) +#define MAD_DIMM_ECC_IO_OFF_LOGIC_ON (0x2 << 24) +#define MAD_DIMM_ECC_ON (0x3 << 24) +#define MAD_DIMM_ENH_INTERLEAVE (0x1 << 22) +#define MAD_DIMM_RANK_INTERLEAVE (0x1 << 21) +#define MAD_DIMM_B_WIDTH_X16 (0x1 << 20) /* X8 chips if unset */ +#define MAD_DIMM_A_WIDTH_X16 (0x1 << 19) /* X8 chips if unset */ +#define MAD_DIMM_B_DUAL_RANK (0x1 << 18) +#define MAD_DIMM_A_DUAL_RANK (0x1 << 17) +#define MAD_DIMM_A_SELECT (0x1 << 16) +/* DIMM sizes are in multiples of 256mb. */ +#define MAD_DIMM_B_SIZE_SHIFT 8 +#define MAD_DIMM_B_SIZE_MASK (0xff << MAD_DIMM_B_SIZE_SHIFT) +#define MAD_DIMM_A_SIZE_SHIFT 0 +#define MAD_DIMM_A_SIZE_MASK (0xff << MAD_DIMM_A_SIZE_SHIFT) + + +/* Clocking configuration register */ +#define CLKCFG 0x10c00 +#define CLKCFG_FSB_400 (5 << 0) /* hrawclk 100 */ +#define CLKCFG_FSB_533 (1 << 0) /* hrawclk 133 */ +#define CLKCFG_FSB_667 (3 << 0) /* hrawclk 166 */ +#define CLKCFG_FSB_800 (2 << 0) /* hrawclk 200 */ +#define CLKCFG_FSB_1067 (6 << 0) /* hrawclk 266 */ +#define CLKCFG_FSB_1333 (7 << 0) /* hrawclk 333 */ +/* Note, below two are guess */ +#define CLKCFG_FSB_1600 (4 << 0) /* hrawclk 400 */ +#define CLKCFG_FSB_1600_ALT (0 << 0) /* hrawclk 400 */ +#define CLKCFG_FSB_MASK (7 << 0) +#define CLKCFG_MEM_533 (1 << 4) +#define CLKCFG_MEM_667 (2 << 4) +#define CLKCFG_MEM_800 (3 << 4) +#define CLKCFG_MEM_MASK (7 << 4) + +#define TSC1 0x11001 +#define TSE (1<<0) +#define I915_TR1 0x11006 +#define TSFS 0x11020 +#define TSFS_SLOPE_MASK 0x0000ff00 +#define TSFS_SLOPE_SHIFT 8 +#define TSFS_INTR_MASK 0x000000ff + +#define CRSTANDVID 0x11100 +#define PXVFREQ_BASE 0x11110 /* P[0-15]VIDFREQ (0x1114c) (Ironlake) */ +#define PXVFREQ_PX_MASK 0x7f000000 +#define PXVFREQ_PX_SHIFT 24 +#define VIDFREQ_BASE 0x11110 +#define VIDFREQ1 0x11110 /* VIDFREQ1-4 (0x1111c) (Cantiga) */ +#define VIDFREQ2 0x11114 +#define VIDFREQ3 0x11118 +#define VIDFREQ4 0x1111c +#define VIDFREQ_P0_MASK 0x1f000000 +#define VIDFREQ_P0_SHIFT 24 +#define VIDFREQ_P0_CSCLK_MASK 0x00f00000 +#define VIDFREQ_P0_CSCLK_SHIFT 20 +#define VIDFREQ_P0_CRCLK_MASK 0x000f0000 +#define VIDFREQ_P0_CRCLK_SHIFT 16 +#define VIDFREQ_P1_MASK 0x00001f00 +#define VIDFREQ_P1_SHIFT 8 +#define VIDFREQ_P1_CSCLK_MASK 0x000000f0 +#define VIDFREQ_P1_CSCLK_SHIFT 4 +#define VIDFREQ_P1_CRCLK_MASK 0x0000000f +#define INTTOEXT_BASE_ILK 0x11300 +#define INTTOEXT_BASE 0x11120 /* INTTOEXT1-8 (0x1113c) */ +#define INTTOEXT_MAP3_SHIFT 24 +#define INTTOEXT_MAP3_MASK (0x1f << INTTOEXT_MAP3_SHIFT) +#define INTTOEXT_MAP2_SHIFT 16 +#define INTTOEXT_MAP2_MASK (0x1f << INTTOEXT_MAP2_SHIFT) +#define INTTOEXT_MAP1_SHIFT 8 +#define INTTOEXT_MAP1_MASK (0x1f << INTTOEXT_MAP1_SHIFT) +#define INTTOEXT_MAP0_SHIFT 0 +#define INTTOEXT_MAP0_MASK (0x1f << INTTOEXT_MAP0_SHIFT) +#define MEMSWCTL 0x11170 /* Ironlake only */ +#define MEMCTL_CMD_MASK 0xe000 +#define MEMCTL_CMD_SHIFT 13 +#define MEMCTL_CMD_RCLK_OFF 0 +#define MEMCTL_CMD_RCLK_ON 1 +#define MEMCTL_CMD_CHFREQ 2 +#define MEMCTL_CMD_CHVID 3 +#define MEMCTL_CMD_VMMOFF 4 +#define MEMCTL_CMD_VMMON 5 +#define MEMCTL_CMD_STS (1<<12) /* write 1 triggers command, clears + when command complete */ +#define MEMCTL_FREQ_MASK 0x0f00 /* jitter, from 0-15 */ +#define MEMCTL_FREQ_SHIFT 8 +#define MEMCTL_SFCAVM (1<<7) +#define MEMCTL_TGT_VID_MASK 0x007f +#define MEMIHYST 0x1117c +#define MEMINTREN 0x11180 /* 16 bits */ +#define MEMINT_RSEXIT_EN (1<<8) +#define MEMINT_CX_SUPR_EN (1<<7) +#define MEMINT_CONT_BUSY_EN (1<<6) +#define MEMINT_AVG_BUSY_EN (1<<5) +#define MEMINT_EVAL_CHG_EN (1<<4) +#define MEMINT_MON_IDLE_EN (1<<3) +#define MEMINT_UP_EVAL_EN (1<<2) +#define MEMINT_DOWN_EVAL_EN (1<<1) +#define MEMINT_SW_CMD_EN (1<<0) +#define MEMINTRSTR 0x11182 /* 16 bits */ +#define MEM_RSEXIT_MASK 0xc000 +#define MEM_RSEXIT_SHIFT 14 +#define MEM_CONT_BUSY_MASK 0x3000 +#define MEM_CONT_BUSY_SHIFT 12 +#define MEM_AVG_BUSY_MASK 0x0c00 +#define MEM_AVG_BUSY_SHIFT 10 +#define MEM_EVAL_CHG_MASK 0x0300 +#define MEM_EVAL_BUSY_SHIFT 8 +#define MEM_MON_IDLE_MASK 0x00c0 +#define MEM_MON_IDLE_SHIFT 6 +#define MEM_UP_EVAL_MASK 0x0030 +#define MEM_UP_EVAL_SHIFT 4 +#define MEM_DOWN_EVAL_MASK 0x000c +#define MEM_DOWN_EVAL_SHIFT 2 +#define MEM_SW_CMD_MASK 0x0003 +#define MEM_INT_STEER_GFX 0 +#define MEM_INT_STEER_CMR 1 +#define MEM_INT_STEER_SMI 2 +#define MEM_INT_STEER_SCI 3 +#define MEMINTRSTS 0x11184 +#define MEMINT_RSEXIT (1<<7) +#define MEMINT_CONT_BUSY (1<<6) +#define MEMINT_AVG_BUSY (1<<5) +#define MEMINT_EVAL_CHG (1<<4) +#define MEMINT_MON_IDLE (1<<3) +#define MEMINT_UP_EVAL (1<<2) +#define MEMINT_DOWN_EVAL (1<<1) +#define MEMINT_SW_CMD (1<<0) +#define MEMMODECTL 0x11190 +#define MEMMODE_BOOST_EN (1<<31) +#define MEMMODE_BOOST_FREQ_MASK 0x0f000000 /* jitter for boost, 0-15 */ +#define MEMMODE_BOOST_FREQ_SHIFT 24 +#define MEMMODE_IDLE_MODE_MASK 0x00030000 +#define MEMMODE_IDLE_MODE_SHIFT 16 +#define MEMMODE_IDLE_MODE_EVAL 0 +#define MEMMODE_IDLE_MODE_CONT 1 +#define MEMMODE_HWIDLE_EN (1<<15) +#define MEMMODE_SWMODE_EN (1<<14) +#define MEMMODE_RCLK_GATE (1<<13) +#define MEMMODE_HW_UPDATE (1<<12) +#define MEMMODE_FSTART_MASK 0x00000f00 /* starting jitter, 0-15 */ +#define MEMMODE_FSTART_SHIFT 8 +#define MEMMODE_FMAX_MASK 0x000000f0 /* max jitter, 0-15 */ +#define MEMMODE_FMAX_SHIFT 4 +#define MEMMODE_FMIN_MASK 0x0000000f /* min jitter, 0-15 */ +#define RCBMAXAVG 0x1119c +#define MEMSWCTL2 0x1119e /* Cantiga only */ +#define SWMEMCMD_RENDER_OFF (0 << 13) +#define SWMEMCMD_RENDER_ON (1 << 13) +#define SWMEMCMD_SWFREQ (2 << 13) +#define SWMEMCMD_TARVID (3 << 13) +#define SWMEMCMD_VRM_OFF (4 << 13) +#define SWMEMCMD_VRM_ON (5 << 13) +#define CMDSTS (1<<12) +#define SFCAVM (1<<11) +#define SWFREQ_MASK 0x0380 /* P0-7 */ +#define SWFREQ_SHIFT 7 +#define TARVID_MASK 0x001f +#define MEMSTAT_CTG 0x111a0 +#define RCBMINAVG 0x111a0 +#define RCUPEI 0x111b0 +#define RCDNEI 0x111b4 +#define RSTDBYCTL 0x111b8 +#define RS1EN (1<<31) +#define RS2EN (1<<30) +#define RS3EN (1<<29) +#define D3RS3EN (1<<28) /* Display D3 imlies RS3 */ +#define SWPROMORSX (1<<27) /* RSx promotion timers ignored */ +#define RCWAKERW (1<<26) /* Resetwarn from PCH causes wakeup */ +#define DPRSLPVREN (1<<25) /* Fast voltage ramp enable */ +#define GFXTGHYST (1<<24) /* Hysteresis to allow trunk gating */ +#define RCX_SW_EXIT (1<<23) /* Leave RSx and prevent re-entry */ +#define RSX_STATUS_MASK (7<<20) +#define RSX_STATUS_ON (0<<20) +#define RSX_STATUS_RC1 (1<<20) +#define RSX_STATUS_RC1E (2<<20) +#define RSX_STATUS_RS1 (3<<20) +#define RSX_STATUS_RS2 (4<<20) /* aka rc6 */ +#define RSX_STATUS_RSVD (5<<20) /* deep rc6 unsupported on ilk */ +#define RSX_STATUS_RS3 (6<<20) /* rs3 unsupported on ilk */ +#define RSX_STATUS_RSVD2 (7<<20) +#define UWRCRSXE (1<<19) /* wake counter limit prevents rsx */ +#define RSCRP (1<<18) /* rs requests control on rs1/2 reqs */ +#define JRSC (1<<17) /* rsx coupled to cpu c-state */ +#define RS2INC0 (1<<16) /* allow rs2 in cpu c0 */ +#define RS1CONTSAV_MASK (3<<14) +#define RS1CONTSAV_NO_RS1 (0<<14) /* rs1 doesn't save/restore context */ +#define RS1CONTSAV_RSVD (1<<14) +#define RS1CONTSAV_SAVE_RS1 (2<<14) /* rs1 saves context */ +#define RS1CONTSAV_FULL_RS1 (3<<14) /* rs1 saves and restores context */ +#define NORMSLEXLAT_MASK (3<<12) +#define SLOW_RS123 (0<<12) +#define SLOW_RS23 (1<<12) +#define SLOW_RS3 (2<<12) +#define NORMAL_RS123 (3<<12) +#define RCMODE_TIMEOUT (1<<11) /* 0 is eval interval method */ +#define IMPROMOEN (1<<10) /* promo is immediate or delayed until next idle interval (only for timeout method above) */ +#define RCENTSYNC (1<<9) /* rs coupled to cpu c-state (3/6/7) */ +#define STATELOCK (1<<7) /* locked to rs_cstate if 0 */ +#define RS_CSTATE_MASK (3<<4) +#define RS_CSTATE_C367_RS1 (0<<4) +#define RS_CSTATE_C36_RS1_C7_RS2 (1<<4) +#define RS_CSTATE_RSVD (2<<4) +#define RS_CSTATE_C367_RS2 (3<<4) +#define REDSAVES (1<<3) /* no context save if was idle during rs0 */ +#define REDRESTORES (1<<2) /* no restore if was idle during rs0 */ +#define VIDCTL 0x111c0 +#define VIDSTS 0x111c8 +#define VIDSTART 0x111cc /* 8 bits */ +#define MEMSTAT_ILK 0x111f8 +#define MEMSTAT_VID_MASK 0x7f00 +#define MEMSTAT_VID_SHIFT 8 +#define MEMSTAT_PSTATE_MASK 0x00f8 +#define MEMSTAT_PSTATE_SHIFT 3 +#define MEMSTAT_MON_ACTV (1<<2) +#define MEMSTAT_SRC_CTL_MASK 0x0003 +#define MEMSTAT_SRC_CTL_CORE 0 +#define MEMSTAT_SRC_CTL_TRB 1 +#define MEMSTAT_SRC_CTL_THM 2 +#define MEMSTAT_SRC_CTL_STDBY 3 +#define RCPREVBSYTUPAVG 0x113b8 +#define RCPREVBSYTDNAVG 0x113bc +#define PMMISC 0x11214 +#define MCPPCE_EN (1<<0) /* enable PM_MSG from PCH->MPC */ +#define SDEW 0x1124c +#define CSIEW0 0x11250 +#define CSIEW1 0x11254 +#define CSIEW2 0x11258 +#define PEW 0x1125c +#define DEW 0x11270 +#define MCHAFE 0x112c0 +#define CSIEC 0x112e0 +#define DMIEC 0x112e4 +#define DDREC 0x112e8 +#define PEG0EC 0x112ec +#define PEG1EC 0x112f0 +#define GFXEC 0x112f4 +#define RPPREVBSYTUPAVG 0x113b8 +#define RPPREVBSYTDNAVG 0x113bc +#define ECR 0x11600 +#define ECR_GPFE (1<<31) +#define ECR_IMONE (1<<30) +#define ECR_CAP_MASK 0x0000001f /* Event range, 0-31 */ +#define OGW0 0x11608 +#define OGW1 0x1160c +#define EG0 0x11610 +#define EG1 0x11614 +#define EG2 0x11618 +#define EG3 0x1161c +#define EG4 0x11620 +#define EG5 0x11624 +#define EG6 0x11628 +#define EG7 0x1162c +#define PXW 0x11664 +#define PXWL 0x11680 +#define LCFUSE02 0x116c0 +#define LCFUSE_HIV_MASK 0x000000ff +#define CSIPLL0 0x12c10 +#define DDRMPLL1 0X12c20 +#define PEG_BAND_GAP_DATA 0x14d68 + +#define GEN6_GT_PERF_STATUS 0x145948 +#define GEN6_RP_STATE_LIMITS 0x145994 +#define GEN6_RP_STATE_CAP 0x145998 + +/* + * Logical Context regs + */ +#define CCID 0x2180 +#define CCID_EN (1<<0) +/* + * Overlay regs + */ + +#define OVADD 0x30000 +#define DOVSTA 0x30008 +#define OC_BUF (0x3<<20) +#define OGAMC5 0x30010 +#define OGAMC4 0x30014 +#define OGAMC3 0x30018 +#define OGAMC2 0x3001c +#define OGAMC1 0x30020 +#define OGAMC0 0x30024 + +/* + * Display engine regs + */ + +/* Pipe A timing regs */ +#define _HTOTAL_A 0x60000 +#define _HBLANK_A 0x60004 +#define _HSYNC_A 0x60008 +#define _VTOTAL_A 0x6000c +#define _VBLANK_A 0x60010 +#define _VSYNC_A 0x60014 +#define _PIPEASRC 0x6001c +#define _BCLRPAT_A 0x60020 +#define _VSYNCSHIFT_A 0x60028 + +/* Pipe B timing regs */ +#define _HTOTAL_B 0x61000 +#define _HBLANK_B 0x61004 +#define _HSYNC_B 0x61008 +#define _VTOTAL_B 0x6100c +#define _VBLANK_B 0x61010 +#define _VSYNC_B 0x61014 +#define _PIPEBSRC 0x6101c +#define _BCLRPAT_B 0x61020 +#define _VSYNCSHIFT_B 0x61028 + + +#define HTOTAL(pipe) _PIPE(pipe, _HTOTAL_A, _HTOTAL_B) +#define HBLANK(pipe) _PIPE(pipe, _HBLANK_A, _HBLANK_B) +#define HSYNC(pipe) _PIPE(pipe, _HSYNC_A, _HSYNC_B) +#define VTOTAL(pipe) _PIPE(pipe, _VTOTAL_A, _VTOTAL_B) +#define VBLANK(pipe) _PIPE(pipe, _VBLANK_A, _VBLANK_B) +#define VSYNC(pipe) _PIPE(pipe, _VSYNC_A, _VSYNC_B) +#define BCLRPAT(pipe) _PIPE(pipe, _BCLRPAT_A, _BCLRPAT_B) +#define VSYNCSHIFT(pipe) _PIPE(pipe, _VSYNCSHIFT_A, _VSYNCSHIFT_B) + +/* VGA port control */ +#define ADPA 0x61100 +#define ADPA_DAC_ENABLE (1<<31) +#define ADPA_DAC_DISABLE 0 +#define ADPA_PIPE_SELECT_MASK (1<<30) +#define ADPA_PIPE_A_SELECT 0 +#define ADPA_PIPE_B_SELECT (1<<30) +#define ADPA_PIPE_SELECT(pipe) ((pipe) << 30) +#define ADPA_USE_VGA_HVPOLARITY (1<<15) +#define ADPA_SETS_HVPOLARITY 0 +#define ADPA_VSYNC_CNTL_DISABLE (1<<11) +#define ADPA_VSYNC_CNTL_ENABLE 0 +#define ADPA_HSYNC_CNTL_DISABLE (1<<10) +#define ADPA_HSYNC_CNTL_ENABLE 0 +#define ADPA_VSYNC_ACTIVE_HIGH (1<<4) +#define ADPA_VSYNC_ACTIVE_LOW 0 +#define ADPA_HSYNC_ACTIVE_HIGH (1<<3) +#define ADPA_HSYNC_ACTIVE_LOW 0 +#define ADPA_DPMS_MASK (~(3<<10)) +#define ADPA_DPMS_ON (0<<10) +#define ADPA_DPMS_SUSPEND (1<<10) +#define ADPA_DPMS_STANDBY (2<<10) +#define ADPA_DPMS_OFF (3<<10) + + +/* Hotplug control (945+ only) */ +#define PORT_HOTPLUG_EN 0x61110 +#define HDMIB_HOTPLUG_INT_EN (1 << 29) +#define DPB_HOTPLUG_INT_EN (1 << 29) +#define HDMIC_HOTPLUG_INT_EN (1 << 28) +#define DPC_HOTPLUG_INT_EN (1 << 28) +#define HDMID_HOTPLUG_INT_EN (1 << 27) +#define DPD_HOTPLUG_INT_EN (1 << 27) +#define SDVOB_HOTPLUG_INT_EN (1 << 26) +#define SDVOC_HOTPLUG_INT_EN (1 << 25) +#define TV_HOTPLUG_INT_EN (1 << 18) +#define CRT_HOTPLUG_INT_EN (1 << 9) +#define CRT_HOTPLUG_FORCE_DETECT (1 << 3) +#define CRT_HOTPLUG_ACTIVATION_PERIOD_32 (0 << 8) +/* must use period 64 on GM45 according to docs */ +#define CRT_HOTPLUG_ACTIVATION_PERIOD_64 (1 << 8) +#define CRT_HOTPLUG_DAC_ON_TIME_2M (0 << 7) +#define CRT_HOTPLUG_DAC_ON_TIME_4M (1 << 7) +#define CRT_HOTPLUG_VOLTAGE_COMPARE_40 (0 << 5) +#define CRT_HOTPLUG_VOLTAGE_COMPARE_50 (1 << 5) +#define CRT_HOTPLUG_VOLTAGE_COMPARE_60 (2 << 5) +#define CRT_HOTPLUG_VOLTAGE_COMPARE_70 (3 << 5) +#define CRT_HOTPLUG_VOLTAGE_COMPARE_MASK (3 << 5) +#define CRT_HOTPLUG_DETECT_DELAY_1G (0 << 4) +#define CRT_HOTPLUG_DETECT_DELAY_2G (1 << 4) +#define CRT_HOTPLUG_DETECT_VOLTAGE_325MV (0 << 2) +#define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2) + +#define PORT_HOTPLUG_STAT 0x61114 +#define HDMIB_HOTPLUG_INT_STATUS (1 << 29) +#define DPB_HOTPLUG_INT_STATUS (1 << 29) +#define HDMIC_HOTPLUG_INT_STATUS (1 << 28) +#define DPC_HOTPLUG_INT_STATUS (1 << 28) +#define HDMID_HOTPLUG_INT_STATUS (1 << 27) +#define DPD_HOTPLUG_INT_STATUS (1 << 27) +#define CRT_HOTPLUG_INT_STATUS (1 << 11) +#define TV_HOTPLUG_INT_STATUS (1 << 10) +#define CRT_HOTPLUG_MONITOR_MASK (3 << 8) +#define CRT_HOTPLUG_MONITOR_COLOR (3 << 8) +#define CRT_HOTPLUG_MONITOR_MONO (2 << 8) +#define CRT_HOTPLUG_MONITOR_NONE (0 << 8) +#define SDVOC_HOTPLUG_INT_STATUS (1 << 7) +#define SDVOB_HOTPLUG_INT_STATUS (1 << 6) + +/* SDVO port control */ +#define SDVOB 0x61140 +#define SDVOC 0x61160 +#define SDVO_ENABLE (1 << 31) +#define SDVO_PIPE_B_SELECT (1 << 30) +#define SDVO_STALL_SELECT (1 << 29) +#define SDVO_INTERRUPT_ENABLE (1 << 26) +/** + * 915G/GM SDVO pixel multiplier. + * + * Programmed value is multiplier - 1, up to 5x. + * + * \sa DPLL_MD_UDI_MULTIPLIER_MASK + */ +#define SDVO_PORT_MULTIPLY_MASK (7 << 23) +#define SDVO_PORT_MULTIPLY_SHIFT 23 +#define SDVO_PHASE_SELECT_MASK (15 << 19) +#define SDVO_PHASE_SELECT_DEFAULT (6 << 19) +#define SDVO_CLOCK_OUTPUT_INVERT (1 << 18) +#define SDVOC_GANG_MODE (1 << 16) +#define SDVO_ENCODING_SDVO (0x0 << 10) +#define SDVO_ENCODING_HDMI (0x2 << 10) +/** Requird for HDMI operation */ +#define SDVO_NULL_PACKETS_DURING_VSYNC (1 << 9) +#define SDVO_COLOR_RANGE_16_235 (1 << 8) +#define SDVO_BORDER_ENABLE (1 << 7) +#define SDVO_AUDIO_ENABLE (1 << 6) +/** New with 965, default is to be set */ +#define SDVO_VSYNC_ACTIVE_HIGH (1 << 4) +/** New with 965, default is to be set */ +#define SDVO_HSYNC_ACTIVE_HIGH (1 << 3) +#define SDVOB_PCIE_CONCURRENCY (1 << 3) +#define SDVO_DETECTED (1 << 2) +/* Bits to be preserved when writing */ +#define SDVOB_PRESERVE_MASK ((1 << 17) | (1 << 16) | (1 << 14) | (1 << 26)) +#define SDVOC_PRESERVE_MASK ((1 << 17) | (1 << 26)) + +/* DVO port control */ +#define DVOA 0x61120 +#define DVOB 0x61140 +#define DVOC 0x61160 +#define DVO_ENABLE (1 << 31) +#define DVO_PIPE_B_SELECT (1 << 30) +#define DVO_PIPE_STALL_UNUSED (0 << 28) +#define DVO_PIPE_STALL (1 << 28) +#define DVO_PIPE_STALL_TV (2 << 28) +#define DVO_PIPE_STALL_MASK (3 << 28) +#define DVO_USE_VGA_SYNC (1 << 15) +#define DVO_DATA_ORDER_I740 (0 << 14) +#define DVO_DATA_ORDER_FP (1 << 14) +#define DVO_VSYNC_DISABLE (1 << 11) +#define DVO_HSYNC_DISABLE (1 << 10) +#define DVO_VSYNC_TRISTATE (1 << 9) +#define DVO_HSYNC_TRISTATE (1 << 8) +#define DVO_BORDER_ENABLE (1 << 7) +#define DVO_DATA_ORDER_GBRG (1 << 6) +#define DVO_DATA_ORDER_RGGB (0 << 6) +#define DVO_DATA_ORDER_GBRG_ERRATA (0 << 6) +#define DVO_DATA_ORDER_RGGB_ERRATA (1 << 6) +#define DVO_VSYNC_ACTIVE_HIGH (1 << 4) +#define DVO_HSYNC_ACTIVE_HIGH (1 << 3) +#define DVO_BLANK_ACTIVE_HIGH (1 << 2) +#define DVO_OUTPUT_CSTATE_PIXELS (1 << 1) /* SDG only */ +#define DVO_OUTPUT_SOURCE_SIZE_PIXELS (1 << 0) /* SDG only */ +#define DVO_PRESERVE_MASK (0x7<<24) +#define DVOA_SRCDIM 0x61124 +#define DVOB_SRCDIM 0x61144 +#define DVOC_SRCDIM 0x61164 +#define DVO_SRCDIM_HORIZONTAL_SHIFT 12 +#define DVO_SRCDIM_VERTICAL_SHIFT 0 + +/* LVDS port control */ +#define LVDS 0x61180 +/* + * Enables the LVDS port. This bit must be set before DPLLs are enabled, as + * the DPLL semantics change when the LVDS is assigned to that pipe. + */ +#define LVDS_PORT_EN (1 << 31) +/* Selects pipe B for LVDS data. Must be set on pre-965. */ +#define LVDS_PIPEB_SELECT (1 << 30) +#define LVDS_PIPE_MASK (1 << 30) +#define LVDS_PIPE(pipe) ((pipe) << 30) +/* LVDS dithering flag on 965/g4x platform */ +#define LVDS_ENABLE_DITHER (1 << 25) +/* LVDS sync polarity flags. Set to invert (i.e. negative) */ +#define LVDS_VSYNC_POLARITY (1 << 21) +#define LVDS_HSYNC_POLARITY (1 << 20) + +/* Enable border for unscaled (or aspect-scaled) display */ +#define LVDS_BORDER_ENABLE (1 << 15) +/* + * Enables the A0-A2 data pairs and CLKA, containing 18 bits of color data per + * pixel. + */ +#define LVDS_A0A2_CLKA_POWER_MASK (3 << 8) +#define LVDS_A0A2_CLKA_POWER_DOWN (0 << 8) +#define LVDS_A0A2_CLKA_POWER_UP (3 << 8) +/* + * Controls the A3 data pair, which contains the additional LSBs for 24 bit + * mode. Only enabled if LVDS_A0A2_CLKA_POWER_UP also indicates it should be + * on. + */ +#define LVDS_A3_POWER_MASK (3 << 6) +#define LVDS_A3_POWER_DOWN (0 << 6) +#define LVDS_A3_POWER_UP (3 << 6) +/* + * Controls the CLKB pair. This should only be set when LVDS_B0B3_POWER_UP + * is set. + */ +#define LVDS_CLKB_POWER_MASK (3 << 4) +#define LVDS_CLKB_POWER_DOWN (0 << 4) +#define LVDS_CLKB_POWER_UP (3 << 4) +/* + * Controls the B0-B3 data pairs. This must be set to match the DPLL p2 + * setting for whether we are in dual-channel mode. The B3 pair will + * additionally only be powered up when LVDS_A3_POWER_UP is set. + */ +#define LVDS_B0B3_POWER_MASK (3 << 2) +#define LVDS_B0B3_POWER_DOWN (0 << 2) +#define LVDS_B0B3_POWER_UP (3 << 2) + +/* Video Data Island Packet control */ +#define VIDEO_DIP_DATA 0x61178 +#define VIDEO_DIP_CTL 0x61170 +#define VIDEO_DIP_ENABLE (1 << 31) +#define VIDEO_DIP_PORT_B (1 << 29) +#define VIDEO_DIP_PORT_C (2 << 29) +#define VIDEO_DIP_ENABLE_AVI (1 << 21) +#define VIDEO_DIP_ENABLE_VENDOR (2 << 21) +#define VIDEO_DIP_ENABLE_SPD (8 << 21) +#define VIDEO_DIP_SELECT_MASK (3 << 19) +#define VIDEO_DIP_SELECT_AVI (0 << 19) +#define VIDEO_DIP_SELECT_VENDOR (1 << 19) +#define VIDEO_DIP_SELECT_SPD (3 << 19) +#define VIDEO_DIP_FREQ_ONCE (0 << 16) +#define VIDEO_DIP_FREQ_VSYNC (1 << 16) +#define VIDEO_DIP_FREQ_2VSYNC (2 << 16) + +/* Panel power sequencing */ +#define PP_STATUS 0x61200 +#define PP_ON (1 << 31) +/* + * Indicates that all dependencies of the panel are on: + * + * - PLL enabled + * - pipe enabled + * - LVDS/DVOB/DVOC on + */ +#define PP_READY (1 << 30) +#define PP_SEQUENCE_NONE (0 << 28) +#define PP_SEQUENCE_POWER_UP (1 << 28) +#define PP_SEQUENCE_POWER_DOWN (2 << 28) +#define PP_SEQUENCE_MASK (3 << 28) +#define PP_SEQUENCE_SHIFT 28 +#define PP_CYCLE_DELAY_ACTIVE (1 << 27) +#define PP_SEQUENCE_STATE_MASK 0x0000000f +#define PP_SEQUENCE_STATE_OFF_IDLE (0x0 << 0) +#define PP_SEQUENCE_STATE_OFF_S0_1 (0x1 << 0) +#define PP_SEQUENCE_STATE_OFF_S0_2 (0x2 << 0) +#define PP_SEQUENCE_STATE_OFF_S0_3 (0x3 << 0) +#define PP_SEQUENCE_STATE_ON_IDLE (0x8 << 0) +#define PP_SEQUENCE_STATE_ON_S1_0 (0x9 << 0) +#define PP_SEQUENCE_STATE_ON_S1_2 (0xa << 0) +#define PP_SEQUENCE_STATE_ON_S1_3 (0xb << 0) +#define PP_SEQUENCE_STATE_RESET (0xf << 0) +#define PP_CONTROL 0x61204 +#define POWER_TARGET_ON (1 << 0) +#define PP_ON_DELAYS 0x61208 +#define PP_OFF_DELAYS 0x6120c +#define PP_DIVISOR 0x61210 + +/* Panel fitting */ +#define PFIT_CONTROL 0x61230 +#define PFIT_ENABLE (1 << 31) +#define PFIT_PIPE_MASK (3 << 29) +#define PFIT_PIPE_SHIFT 29 +#define VERT_INTERP_DISABLE (0 << 10) +#define VERT_INTERP_BILINEAR (1 << 10) +#define VERT_INTERP_MASK (3 << 10) +#define VERT_AUTO_SCALE (1 << 9) +#define HORIZ_INTERP_DISABLE (0 << 6) +#define HORIZ_INTERP_BILINEAR (1 << 6) +#define HORIZ_INTERP_MASK (3 << 6) +#define HORIZ_AUTO_SCALE (1 << 5) +#define PANEL_8TO6_DITHER_ENABLE (1 << 3) +#define PFIT_FILTER_FUZZY (0 << 24) +#define PFIT_SCALING_AUTO (0 << 26) +#define PFIT_SCALING_PROGRAMMED (1 << 26) +#define PFIT_SCALING_PILLAR (2 << 26) +#define PFIT_SCALING_LETTER (3 << 26) +#define PFIT_PGM_RATIOS 0x61234 +#define PFIT_VERT_SCALE_MASK 0xfff00000 +#define PFIT_HORIZ_SCALE_MASK 0x0000fff0 +/* Pre-965 */ +#define PFIT_VERT_SCALE_SHIFT 20 +#define PFIT_VERT_SCALE_MASK 0xfff00000 +#define PFIT_HORIZ_SCALE_SHIFT 4 +#define PFIT_HORIZ_SCALE_MASK 0x0000fff0 +/* 965+ */ +#define PFIT_VERT_SCALE_SHIFT_965 16 +#define PFIT_VERT_SCALE_MASK_965 0x1fff0000 +#define PFIT_HORIZ_SCALE_SHIFT_965 0 +#define PFIT_HORIZ_SCALE_MASK_965 0x00001fff + +#define PFIT_AUTO_RATIOS 0x61238 + +/* Backlight control */ +#define BLC_PWM_CTL 0x61254 +#define BACKLIGHT_MODULATION_FREQ_SHIFT (17) +#define BLC_PWM_CTL2 0x61250 /* 965+ only */ +#define BLM_COMBINATION_MODE (1 << 30) +/* + * This is the most significant 15 bits of the number of backlight cycles in a + * complete cycle of the modulated backlight control. + * + * The actual value is this field multiplied by two. + */ +#define BACKLIGHT_MODULATION_FREQ_MASK (0x7fff << 17) +#define BLM_LEGACY_MODE (1 << 16) +/* + * This is the number of cycles out of the backlight modulation cycle for which + * the backlight is on. + * + * This field must be no greater than the number of cycles in the complete + * backlight modulation cycle. + */ +#define BACKLIGHT_DUTY_CYCLE_SHIFT (0) +#define BACKLIGHT_DUTY_CYCLE_MASK (0xffff) + +#define BLC_HIST_CTL 0x61260 + +/* TV port control */ +#define TV_CTL 0x68000 +/** Enables the TV encoder */ +# define TV_ENC_ENABLE (1 << 31) +/** Sources the TV encoder input from pipe B instead of A. */ +# define TV_ENC_PIPEB_SELECT (1 << 30) +/** Outputs composite video (DAC A only) */ +# define TV_ENC_OUTPUT_COMPOSITE (0 << 28) +/** Outputs SVideo video (DAC B/C) */ +# define TV_ENC_OUTPUT_SVIDEO (1 << 28) +/** Outputs Component video (DAC A/B/C) */ +# define TV_ENC_OUTPUT_COMPONENT (2 << 28) +/** Outputs Composite and SVideo (DAC A/B/C) */ +# define TV_ENC_OUTPUT_SVIDEO_COMPOSITE (3 << 28) +# define TV_TRILEVEL_SYNC (1 << 21) +/** Enables slow sync generation (945GM only) */ +# define TV_SLOW_SYNC (1 << 20) +/** Selects 4x oversampling for 480i and 576p */ +# define TV_OVERSAMPLE_4X (0 << 18) +/** Selects 2x oversampling for 720p and 1080i */ +# define TV_OVERSAMPLE_2X (1 << 18) +/** Selects no oversampling for 1080p */ +# define TV_OVERSAMPLE_NONE (2 << 18) +/** Selects 8x oversampling */ +# define TV_OVERSAMPLE_8X (3 << 18) +/** Selects progressive mode rather than interlaced */ +# define TV_PROGRESSIVE (1 << 17) +/** Sets the colorburst to PAL mode. Required for non-M PAL modes. */ +# define TV_PAL_BURST (1 << 16) +/** Field for setting delay of Y compared to C */ +# define TV_YC_SKEW_MASK (7 << 12) +/** Enables a fix for 480p/576p standard definition modes on the 915GM only */ +# define TV_ENC_SDP_FIX (1 << 11) +/** + * Enables a fix for the 915GM only. + * + * Not sure what it does. + */ +# define TV_ENC_C0_FIX (1 << 10) +/** Bits that must be preserved by software */ +# define TV_CTL_SAVE ((1 << 11) | (3 << 9) | (7 << 6) | 0xf) +# define TV_FUSE_STATE_MASK (3 << 4) +/** Read-only state that reports all features enabled */ +# define TV_FUSE_STATE_ENABLED (0 << 4) +/** Read-only state that reports that Macrovision is disabled in hardware*/ +# define TV_FUSE_STATE_NO_MACROVISION (1 << 4) +/** Read-only state that reports that TV-out is disabled in hardware. */ +# define TV_FUSE_STATE_DISABLED (2 << 4) +/** Normal operation */ +# define TV_TEST_MODE_NORMAL (0 << 0) +/** Encoder test pattern 1 - combo pattern */ +# define TV_TEST_MODE_PATTERN_1 (1 << 0) +/** Encoder test pattern 2 - full screen vertical 75% color bars */ +# define TV_TEST_MODE_PATTERN_2 (2 << 0) +/** Encoder test pattern 3 - full screen horizontal 75% color bars */ +# define TV_TEST_MODE_PATTERN_3 (3 << 0) +/** Encoder test pattern 4 - random noise */ +# define TV_TEST_MODE_PATTERN_4 (4 << 0) +/** Encoder test pattern 5 - linear color ramps */ +# define TV_TEST_MODE_PATTERN_5 (5 << 0) +/** + * This test mode forces the DACs to 50% of full output. + * + * This is used for load detection in combination with TVDAC_SENSE_MASK + */ +# define TV_TEST_MODE_MONITOR_DETECT (7 << 0) +# define TV_TEST_MODE_MASK (7 << 0) + +#define TV_DAC 0x68004 +# define TV_DAC_SAVE 0x00ffff00 +/** + * Reports that DAC state change logic has reported change (RO). + * + * This gets cleared when TV_DAC_STATE_EN is cleared +*/ +# define TVDAC_STATE_CHG (1 << 31) +# define TVDAC_SENSE_MASK (7 << 28) +/** Reports that DAC A voltage is above the detect threshold */ +# define TVDAC_A_SENSE (1 << 30) +/** Reports that DAC B voltage is above the detect threshold */ +# define TVDAC_B_SENSE (1 << 29) +/** Reports that DAC C voltage is above the detect threshold */ +# define TVDAC_C_SENSE (1 << 28) +/** + * Enables DAC state detection logic, for load-based TV detection. + * + * The PLL of the chosen pipe (in TV_CTL) must be running, and the encoder set + * to off, for load detection to work. + */ +# define TVDAC_STATE_CHG_EN (1 << 27) +/** Sets the DAC A sense value to high */ +# define TVDAC_A_SENSE_CTL (1 << 26) +/** Sets the DAC B sense value to high */ +# define TVDAC_B_SENSE_CTL (1 << 25) +/** Sets the DAC C sense value to high */ +# define TVDAC_C_SENSE_CTL (1 << 24) +/** Overrides the ENC_ENABLE and DAC voltage levels */ +# define DAC_CTL_OVERRIDE (1 << 7) +/** Sets the slew rate. Must be preserved in software */ +# define ENC_TVDAC_SLEW_FAST (1 << 6) +# define DAC_A_1_3_V (0 << 4) +# define DAC_A_1_1_V (1 << 4) +# define DAC_A_0_7_V (2 << 4) +# define DAC_A_MASK (3 << 4) +# define DAC_B_1_3_V (0 << 2) +# define DAC_B_1_1_V (1 << 2) +# define DAC_B_0_7_V (2 << 2) +# define DAC_B_MASK (3 << 2) +# define DAC_C_1_3_V (0 << 0) +# define DAC_C_1_1_V (1 << 0) +# define DAC_C_0_7_V (2 << 0) +# define DAC_C_MASK (3 << 0) + +/** + * CSC coefficients are stored in a floating point format with 9 bits of + * mantissa and 2 or 3 bits of exponent. The exponent is represented as 2**-n, + * where 2-bit exponents are unsigned n, and 3-bit exponents are signed n with + * -1 (0x3) being the only legal negative value. + */ +#define TV_CSC_Y 0x68010 +# define TV_RY_MASK 0x07ff0000 +# define TV_RY_SHIFT 16 +# define TV_GY_MASK 0x00000fff +# define TV_GY_SHIFT 0 + +#define TV_CSC_Y2 0x68014 +# define TV_BY_MASK 0x07ff0000 +# define TV_BY_SHIFT 16 +/** + * Y attenuation for component video. + * + * Stored in 1.9 fixed point. + */ +# define TV_AY_MASK 0x000003ff +# define TV_AY_SHIFT 0 + +#define TV_CSC_U 0x68018 +# define TV_RU_MASK 0x07ff0000 +# define TV_RU_SHIFT 16 +# define TV_GU_MASK 0x000007ff +# define TV_GU_SHIFT 0 + +#define TV_CSC_U2 0x6801c +# define TV_BU_MASK 0x07ff0000 +# define TV_BU_SHIFT 16 +/** + * U attenuation for component video. + * + * Stored in 1.9 fixed point. + */ +# define TV_AU_MASK 0x000003ff +# define TV_AU_SHIFT 0 + +#define TV_CSC_V 0x68020 +# define TV_RV_MASK 0x0fff0000 +# define TV_RV_SHIFT 16 +# define TV_GV_MASK 0x000007ff +# define TV_GV_SHIFT 0 + +#define TV_CSC_V2 0x68024 +# define TV_BV_MASK 0x07ff0000 +# define TV_BV_SHIFT 16 +/** + * V attenuation for component video. + * + * Stored in 1.9 fixed point. + */ +# define TV_AV_MASK 0x000007ff +# define TV_AV_SHIFT 0 + +#define TV_CLR_KNOBS 0x68028 +/** 2s-complement brightness adjustment */ +# define TV_BRIGHTNESS_MASK 0xff000000 +# define TV_BRIGHTNESS_SHIFT 24 +/** Contrast adjustment, as a 2.6 unsigned floating point number */ +# define TV_CONTRAST_MASK 0x00ff0000 +# define TV_CONTRAST_SHIFT 16 +/** Saturation adjustment, as a 2.6 unsigned floating point number */ +# define TV_SATURATION_MASK 0x0000ff00 +# define TV_SATURATION_SHIFT 8 +/** Hue adjustment, as an integer phase angle in degrees */ +# define TV_HUE_MASK 0x000000ff +# define TV_HUE_SHIFT 0 + +#define TV_CLR_LEVEL 0x6802c +/** Controls the DAC level for black */ +# define TV_BLACK_LEVEL_MASK 0x01ff0000 +# define TV_BLACK_LEVEL_SHIFT 16 +/** Controls the DAC level for blanking */ +# define TV_BLANK_LEVEL_MASK 0x000001ff +# define TV_BLANK_LEVEL_SHIFT 0 + +#define TV_H_CTL_1 0x68030 +/** Number of pixels in the hsync. */ +# define TV_HSYNC_END_MASK 0x1fff0000 +# define TV_HSYNC_END_SHIFT 16 +/** Total number of pixels minus one in the line (display and blanking). */ +# define TV_HTOTAL_MASK 0x00001fff +# define TV_HTOTAL_SHIFT 0 + +#define TV_H_CTL_2 0x68034 +/** Enables the colorburst (needed for non-component color) */ +# define TV_BURST_ENA (1 << 31) +/** Offset of the colorburst from the start of hsync, in pixels minus one. */ +# define TV_HBURST_START_SHIFT 16 +# define TV_HBURST_START_MASK 0x1fff0000 +/** Length of the colorburst */ +# define TV_HBURST_LEN_SHIFT 0 +# define TV_HBURST_LEN_MASK 0x0001fff + +#define TV_H_CTL_3 0x68038 +/** End of hblank, measured in pixels minus one from start of hsync */ +# define TV_HBLANK_END_SHIFT 16 +# define TV_HBLANK_END_MASK 0x1fff0000 +/** Start of hblank, measured in pixels minus one from start of hsync */ +# define TV_HBLANK_START_SHIFT 0 +# define TV_HBLANK_START_MASK 0x0001fff + +#define TV_V_CTL_1 0x6803c +/** XXX */ +# define TV_NBR_END_SHIFT 16 +# define TV_NBR_END_MASK 0x07ff0000 +/** XXX */ +# define TV_VI_END_F1_SHIFT 8 +# define TV_VI_END_F1_MASK 0x00003f00 +/** XXX */ +# define TV_VI_END_F2_SHIFT 0 +# define TV_VI_END_F2_MASK 0x0000003f + +#define TV_V_CTL_2 0x68040 +/** Length of vsync, in half lines */ +# define TV_VSYNC_LEN_MASK 0x07ff0000 +# define TV_VSYNC_LEN_SHIFT 16 +/** Offset of the start of vsync in field 1, measured in one less than the + * number of half lines. + */ +# define TV_VSYNC_START_F1_MASK 0x00007f00 +# define TV_VSYNC_START_F1_SHIFT 8 +/** + * Offset of the start of vsync in field 2, measured in one less than the + * number of half lines. + */ +# define TV_VSYNC_START_F2_MASK 0x0000007f +# define TV_VSYNC_START_F2_SHIFT 0 + +#define TV_V_CTL_3 0x68044 +/** Enables generation of the equalization signal */ +# define TV_EQUAL_ENA (1 << 31) +/** Length of vsync, in half lines */ +# define TV_VEQ_LEN_MASK 0x007f0000 +# define TV_VEQ_LEN_SHIFT 16 +/** Offset of the start of equalization in field 1, measured in one less than + * the number of half lines. + */ +# define TV_VEQ_START_F1_MASK 0x0007f00 +# define TV_VEQ_START_F1_SHIFT 8 +/** + * Offset of the start of equalization in field 2, measured in one less than + * the number of half lines. + */ +# define TV_VEQ_START_F2_MASK 0x000007f +# define TV_VEQ_START_F2_SHIFT 0 + +#define TV_V_CTL_4 0x68048 +/** + * Offset to start of vertical colorburst, measured in one less than the + * number of lines from vertical start. + */ +# define TV_VBURST_START_F1_MASK 0x003f0000 +# define TV_VBURST_START_F1_SHIFT 16 +/** + * Offset to the end of vertical colorburst, measured in one less than the + * number of lines from the start of NBR. + */ +# define TV_VBURST_END_F1_MASK 0x000000ff +# define TV_VBURST_END_F1_SHIFT 0 + +#define TV_V_CTL_5 0x6804c +/** + * Offset to start of vertical colorburst, measured in one less than the + * number of lines from vertical start. + */ +# define TV_VBURST_START_F2_MASK 0x003f0000 +# define TV_VBURST_START_F2_SHIFT 16 +/** + * Offset to the end of vertical colorburst, measured in one less than the + * number of lines from the start of NBR. + */ +# define TV_VBURST_END_F2_MASK 0x000000ff +# define TV_VBURST_END_F2_SHIFT 0 + +#define TV_V_CTL_6 0x68050 +/** + * Offset to start of vertical colorburst, measured in one less than the + * number of lines from vertical start. + */ +# define TV_VBURST_START_F3_MASK 0x003f0000 +# define TV_VBURST_START_F3_SHIFT 16 +/** + * Offset to the end of vertical colorburst, measured in one less than the + * number of lines from the start of NBR. + */ +# define TV_VBURST_END_F3_MASK 0x000000ff +# define TV_VBURST_END_F3_SHIFT 0 + +#define TV_V_CTL_7 0x68054 +/** + * Offset to start of vertical colorburst, measured in one less than the + * number of lines from vertical start. + */ +# define TV_VBURST_START_F4_MASK 0x003f0000 +# define TV_VBURST_START_F4_SHIFT 16 +/** + * Offset to the end of vertical colorburst, measured in one less than the + * number of lines from the start of NBR. + */ +# define TV_VBURST_END_F4_MASK 0x000000ff +# define TV_VBURST_END_F4_SHIFT 0 + +#define TV_SC_CTL_1 0x68060 +/** Turns on the first subcarrier phase generation DDA */ +# define TV_SC_DDA1_EN (1 << 31) +/** Turns on the first subcarrier phase generation DDA */ +# define TV_SC_DDA2_EN (1 << 30) +/** Turns on the first subcarrier phase generation DDA */ +# define TV_SC_DDA3_EN (1 << 29) +/** Sets the subcarrier DDA to reset frequency every other field */ +# define TV_SC_RESET_EVERY_2 (0 << 24) +/** Sets the subcarrier DDA to reset frequency every fourth field */ +# define TV_SC_RESET_EVERY_4 (1 << 24) +/** Sets the subcarrier DDA to reset frequency every eighth field */ +# define TV_SC_RESET_EVERY_8 (2 << 24) +/** Sets the subcarrier DDA to never reset the frequency */ +# define TV_SC_RESET_NEVER (3 << 24) +/** Sets the peak amplitude of the colorburst.*/ +# define TV_BURST_LEVEL_MASK 0x00ff0000 +# define TV_BURST_LEVEL_SHIFT 16 +/** Sets the increment of the first subcarrier phase generation DDA */ +# define TV_SCDDA1_INC_MASK 0x00000fff +# define TV_SCDDA1_INC_SHIFT 0 + +#define TV_SC_CTL_2 0x68064 +/** Sets the rollover for the second subcarrier phase generation DDA */ +# define TV_SCDDA2_SIZE_MASK 0x7fff0000 +# define TV_SCDDA2_SIZE_SHIFT 16 +/** Sets the increent of the second subcarrier phase generation DDA */ +# define TV_SCDDA2_INC_MASK 0x00007fff +# define TV_SCDDA2_INC_SHIFT 0 + +#define TV_SC_CTL_3 0x68068 +/** Sets the rollover for the third subcarrier phase generation DDA */ +# define TV_SCDDA3_SIZE_MASK 0x7fff0000 +# define TV_SCDDA3_SIZE_SHIFT 16 +/** Sets the increent of the third subcarrier phase generation DDA */ +# define TV_SCDDA3_INC_MASK 0x00007fff +# define TV_SCDDA3_INC_SHIFT 0 + +#define TV_WIN_POS 0x68070 +/** X coordinate of the display from the start of horizontal active */ +# define TV_XPOS_MASK 0x1fff0000 +# define TV_XPOS_SHIFT 16 +/** Y coordinate of the display from the start of vertical active (NBR) */ +# define TV_YPOS_MASK 0x00000fff +# define TV_YPOS_SHIFT 0 + +#define TV_WIN_SIZE 0x68074 +/** Horizontal size of the display window, measured in pixels*/ +# define TV_XSIZE_MASK 0x1fff0000 +# define TV_XSIZE_SHIFT 16 +/** + * Vertical size of the display window, measured in pixels. + * + * Must be even for interlaced modes. + */ +# define TV_YSIZE_MASK 0x00000fff +# define TV_YSIZE_SHIFT 0 + +#define TV_FILTER_CTL_1 0x68080 +/** + * Enables automatic scaling calculation. + * + * If set, the rest of the registers are ignored, and the calculated values can + * be read back from the register. + */ +# define TV_AUTO_SCALE (1 << 31) +/** + * Disables the vertical filter. + * + * This is required on modes more than 1024 pixels wide */ +# define TV_V_FILTER_BYPASS (1 << 29) +/** Enables adaptive vertical filtering */ +# define TV_VADAPT (1 << 28) +# define TV_VADAPT_MODE_MASK (3 << 26) +/** Selects the least adaptive vertical filtering mode */ +# define TV_VADAPT_MODE_LEAST (0 << 26) +/** Selects the moderately adaptive vertical filtering mode */ +# define TV_VADAPT_MODE_MODERATE (1 << 26) +/** Selects the most adaptive vertical filtering mode */ +# define TV_VADAPT_MODE_MOST (3 << 26) +/** + * Sets the horizontal scaling factor. + * + * This should be the fractional part of the horizontal scaling factor divided + * by the oversampling rate. TV_HSCALE should be less than 1, and set to: + * + * (src width - 1) / ((oversample * dest width) - 1) + */ +# define TV_HSCALE_FRAC_MASK 0x00003fff +# define TV_HSCALE_FRAC_SHIFT 0 + +#define TV_FILTER_CTL_2 0x68084 +/** + * Sets the integer part of the 3.15 fixed-point vertical scaling factor. + * + * TV_VSCALE should be (src height - 1) / ((interlace * dest height) - 1) + */ +# define TV_VSCALE_INT_MASK 0x00038000 +# define TV_VSCALE_INT_SHIFT 15 +/** + * Sets the fractional part of the 3.15 fixed-point vertical scaling factor. + * + * \sa TV_VSCALE_INT_MASK + */ +# define TV_VSCALE_FRAC_MASK 0x00007fff +# define TV_VSCALE_FRAC_SHIFT 0 + +#define TV_FILTER_CTL_3 0x68088 +/** + * Sets the integer part of the 3.15 fixed-point vertical scaling factor. + * + * TV_VSCALE should be (src height - 1) / (1/4 * (dest height - 1)) + * + * For progressive modes, TV_VSCALE_IP_INT should be set to zeroes. + */ +# define TV_VSCALE_IP_INT_MASK 0x00038000 +# define TV_VSCALE_IP_INT_SHIFT 15 +/** + * Sets the fractional part of the 3.15 fixed-point vertical scaling factor. + * + * For progressive modes, TV_VSCALE_IP_INT should be set to zeroes. + * + * \sa TV_VSCALE_IP_INT_MASK + */ +# define TV_VSCALE_IP_FRAC_MASK 0x00007fff +# define TV_VSCALE_IP_FRAC_SHIFT 0 + +#define TV_CC_CONTROL 0x68090 +# define TV_CC_ENABLE (1 << 31) +/** + * Specifies which field to send the CC data in. + * + * CC data is usually sent in field 0. + */ +# define TV_CC_FID_MASK (1 << 27) +# define TV_CC_FID_SHIFT 27 +/** Sets the horizontal position of the CC data. Usually 135. */ +# define TV_CC_HOFF_MASK 0x03ff0000 +# define TV_CC_HOFF_SHIFT 16 +/** Sets the vertical position of the CC data. Usually 21 */ +# define TV_CC_LINE_MASK 0x0000003f +# define TV_CC_LINE_SHIFT 0 + +#define TV_CC_DATA 0x68094 +# define TV_CC_RDY (1 << 31) +/** Second word of CC data to be transmitted. */ +# define TV_CC_DATA_2_MASK 0x007f0000 +# define TV_CC_DATA_2_SHIFT 16 +/** First word of CC data to be transmitted. */ +# define TV_CC_DATA_1_MASK 0x0000007f +# define TV_CC_DATA_1_SHIFT 0 + +#define TV_H_LUMA_0 0x68100 +#define TV_H_LUMA_59 0x681ec +#define TV_H_CHROMA_0 0x68200 +#define TV_H_CHROMA_59 0x682ec +#define TV_V_LUMA_0 0x68300 +#define TV_V_LUMA_42 0x683a8 +#define TV_V_CHROMA_0 0x68400 +#define TV_V_CHROMA_42 0x684a8 + +/* Display Port */ +#define DP_A 0x64000 /* eDP */ +#define DP_B 0x64100 +#define DP_C 0x64200 +#define DP_D 0x64300 + +#define DP_PORT_EN (1 << 31) +#define DP_PIPEB_SELECT (1 << 30) +#define DP_PIPE_MASK (1 << 30) + +/* Link training mode - select a suitable mode for each stage */ +#define DP_LINK_TRAIN_PAT_1 (0 << 28) +#define DP_LINK_TRAIN_PAT_2 (1 << 28) +#define DP_LINK_TRAIN_PAT_IDLE (2 << 28) +#define DP_LINK_TRAIN_OFF (3 << 28) +#define DP_LINK_TRAIN_MASK (3 << 28) +#define DP_LINK_TRAIN_SHIFT 28 + +/* CPT Link training mode */ +#define DP_LINK_TRAIN_PAT_1_CPT (0 << 8) +#define DP_LINK_TRAIN_PAT_2_CPT (1 << 8) +#define DP_LINK_TRAIN_PAT_IDLE_CPT (2 << 8) +#define DP_LINK_TRAIN_OFF_CPT (3 << 8) +#define DP_LINK_TRAIN_MASK_CPT (7 << 8) +#define DP_LINK_TRAIN_SHIFT_CPT 8 + +/* Signal voltages. These are mostly controlled by the other end */ +#define DP_VOLTAGE_0_4 (0 << 25) +#define DP_VOLTAGE_0_6 (1 << 25) +#define DP_VOLTAGE_0_8 (2 << 25) +#define DP_VOLTAGE_1_2 (3 << 25) +#define DP_VOLTAGE_MASK (7 << 25) +#define DP_VOLTAGE_SHIFT 25 + +/* Signal pre-emphasis levels, like voltages, the other end tells us what + * they want + */ +#define DP_PRE_EMPHASIS_0 (0 << 22) +#define DP_PRE_EMPHASIS_3_5 (1 << 22) +#define DP_PRE_EMPHASIS_6 (2 << 22) +#define DP_PRE_EMPHASIS_9_5 (3 << 22) +#define DP_PRE_EMPHASIS_MASK (7 << 22) +#define DP_PRE_EMPHASIS_SHIFT 22 + +/* How many wires to use. I guess 3 was too hard */ +#define DP_PORT_WIDTH_1 (0 << 19) +#define DP_PORT_WIDTH_2 (1 << 19) +#define DP_PORT_WIDTH_4 (3 << 19) +#define DP_PORT_WIDTH_MASK (7 << 19) + +/* Mystic DPCD version 1.1 special mode */ +#define DP_ENHANCED_FRAMING (1 << 18) + +/* eDP */ +#define DP_PLL_FREQ_270MHZ (0 << 16) +#define DP_PLL_FREQ_160MHZ (1 << 16) +#define DP_PLL_FREQ_MASK (3 << 16) + +/** locked once port is enabled */ +#define DP_PORT_REVERSAL (1 << 15) + +/* eDP */ +#define DP_PLL_ENABLE (1 << 14) + +/** sends the clock on lane 15 of the PEG for debug */ +#define DP_CLOCK_OUTPUT_ENABLE (1 << 13) + +#define DP_SCRAMBLING_DISABLE (1 << 12) +#define DP_SCRAMBLING_DISABLE_IRONLAKE (1 << 7) + +/** limit RGB values to avoid confusing TVs */ +#define DP_COLOR_RANGE_16_235 (1 << 8) + +/** Turn on the audio link */ +#define DP_AUDIO_OUTPUT_ENABLE (1 << 6) + +/** vs and hs sync polarity */ +#define DP_SYNC_VS_HIGH (1 << 4) +#define DP_SYNC_HS_HIGH (1 << 3) + +/** A fantasy */ +#define DP_DETECTED (1 << 2) + +/** The aux channel provides a way to talk to the + * signal sink for DDC etc. Max packet size supported + * is 20 bytes in each direction, hence the 5 fixed + * data registers + */ +#define DPA_AUX_CH_CTL 0x64010 +#define DPA_AUX_CH_DATA1 0x64014 +#define DPA_AUX_CH_DATA2 0x64018 +#define DPA_AUX_CH_DATA3 0x6401c +#define DPA_AUX_CH_DATA4 0x64020 +#define DPA_AUX_CH_DATA5 0x64024 + +#define DPB_AUX_CH_CTL 0x64110 +#define DPB_AUX_CH_DATA1 0x64114 +#define DPB_AUX_CH_DATA2 0x64118 +#define DPB_AUX_CH_DATA3 0x6411c +#define DPB_AUX_CH_DATA4 0x64120 +#define DPB_AUX_CH_DATA5 0x64124 + +#define DPC_AUX_CH_CTL 0x64210 +#define DPC_AUX_CH_DATA1 0x64214 +#define DPC_AUX_CH_DATA2 0x64218 +#define DPC_AUX_CH_DATA3 0x6421c +#define DPC_AUX_CH_DATA4 0x64220 +#define DPC_AUX_CH_DATA5 0x64224 + +#define DPD_AUX_CH_CTL 0x64310 +#define DPD_AUX_CH_DATA1 0x64314 +#define DPD_AUX_CH_DATA2 0x64318 +#define DPD_AUX_CH_DATA3 0x6431c +#define DPD_AUX_CH_DATA4 0x64320 +#define DPD_AUX_CH_DATA5 0x64324 + +#define DP_AUX_CH_CTL_SEND_BUSY (1 << 31) +#define DP_AUX_CH_CTL_DONE (1 << 30) +#define DP_AUX_CH_CTL_INTERRUPT (1 << 29) +#define DP_AUX_CH_CTL_TIME_OUT_ERROR (1 << 28) +#define DP_AUX_CH_CTL_TIME_OUT_400us (0 << 26) +#define DP_AUX_CH_CTL_TIME_OUT_600us (1 << 26) +#define DP_AUX_CH_CTL_TIME_OUT_800us (2 << 26) +#define DP_AUX_CH_CTL_TIME_OUT_1600us (3 << 26) +#define DP_AUX_CH_CTL_TIME_OUT_MASK (3 << 26) +#define DP_AUX_CH_CTL_RECEIVE_ERROR (1 << 25) +#define DP_AUX_CH_CTL_MESSAGE_SIZE_MASK (0x1f << 20) +#define DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT 20 +#define DP_AUX_CH_CTL_PRECHARGE_2US_MASK (0xf << 16) +#define DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT 16 +#define DP_AUX_CH_CTL_AUX_AKSV_SELECT (1 << 15) +#define DP_AUX_CH_CTL_MANCHESTER_TEST (1 << 14) +#define DP_AUX_CH_CTL_SYNC_TEST (1 << 13) +#define DP_AUX_CH_CTL_DEGLITCH_TEST (1 << 12) +#define DP_AUX_CH_CTL_PRECHARGE_TEST (1 << 11) +#define DP_AUX_CH_CTL_BIT_CLOCK_2X_MASK (0x7ff) +#define DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT 0 + +/* + * Computing GMCH M and N values for the Display Port link + * + * GMCH M/N = dot clock * bytes per pixel / ls_clk * # of lanes + * + * ls_clk (we assume) is the DP link clock (1.62 or 2.7 GHz) + * + * The GMCH value is used internally + * + * bytes_per_pixel is the number of bytes coming out of the plane, + * which is after the LUTs, so we want the bytes for our color format. + * For our current usage, this is always 3, one byte for R, G and B. + */ +#define _PIPEA_GMCH_DATA_M 0x70050 +#define _PIPEB_GMCH_DATA_M 0x71050 + +/* Transfer unit size for display port - 1, default is 0x3f (for TU size 64) */ +#define PIPE_GMCH_DATA_M_TU_SIZE_MASK (0x3f << 25) +#define PIPE_GMCH_DATA_M_TU_SIZE_SHIFT 25 + +#define PIPE_GMCH_DATA_M_MASK (0xffffff) + +#define _PIPEA_GMCH_DATA_N 0x70054 +#define _PIPEB_GMCH_DATA_N 0x71054 +#define PIPE_GMCH_DATA_N_MASK (0xffffff) + +/* + * Computing Link M and N values for the Display Port link + * + * Link M / N = pixel_clock / ls_clk + * + * (the DP spec calls pixel_clock the 'strm_clk') + * + * The Link value is transmitted in the Main Stream + * Attributes and VB-ID. + */ + +#define _PIPEA_DP_LINK_M 0x70060 +#define _PIPEB_DP_LINK_M 0x71060 +#define PIPEA_DP_LINK_M_MASK (0xffffff) + +#define _PIPEA_DP_LINK_N 0x70064 +#define _PIPEB_DP_LINK_N 0x71064 +#define PIPEA_DP_LINK_N_MASK (0xffffff) + +#define PIPE_GMCH_DATA_M(pipe) _PIPE(pipe, _PIPEA_GMCH_DATA_M, _PIPEB_GMCH_DATA_M) +#define PIPE_GMCH_DATA_N(pipe) _PIPE(pipe, _PIPEA_GMCH_DATA_N, _PIPEB_GMCH_DATA_N) +#define PIPE_DP_LINK_M(pipe) _PIPE(pipe, _PIPEA_DP_LINK_M, _PIPEB_DP_LINK_M) +#define PIPE_DP_LINK_N(pipe) _PIPE(pipe, _PIPEA_DP_LINK_N, _PIPEB_DP_LINK_N) + +/* Display & cursor control */ + +/* Pipe A */ +#define _PIPEADSL 0x70000 +#define DSL_LINEMASK 0x00000fff +#define _PIPEACONF 0x70008 +#define PIPECONF_ENABLE (1<<31) +#define PIPECONF_DISABLE 0 +#define PIPECONF_DOUBLE_WIDE (1<<30) +#define I965_PIPECONF_ACTIVE (1<<30) +#define PIPECONF_FRAME_START_DELAY_MASK (3<<27) +#define PIPECONF_SINGLE_WIDE 0 +#define PIPECONF_PIPE_UNLOCKED 0 +#define PIPECONF_PIPE_LOCKED (1<<25) +#define PIPECONF_PALETTE 0 +#define PIPECONF_GAMMA (1<<24) +#define PIPECONF_FORCE_BORDER (1<<25) +#define PIPECONF_INTERLACE_MASK (7 << 21) +/* Note that pre-gen3 does not support interlaced display directly. Panel + * fitting must be disabled on pre-ilk for interlaced. */ +#define PIPECONF_PROGRESSIVE (0 << 21) +#define PIPECONF_INTERLACE_W_SYNC_SHIFT_PANEL (4 << 21) /* gen4 only */ +#define PIPECONF_INTERLACE_W_SYNC_SHIFT (5 << 21) /* gen4 only */ +#define PIPECONF_INTERLACE_W_FIELD_INDICATION (6 << 21) +#define PIPECONF_INTERLACE_FIELD_0_ONLY (7 << 21) /* gen3 only */ +/* Ironlake and later have a complete new set of values for interlaced. PFIT + * means panel fitter required, PF means progressive fetch, DBL means power + * saving pixel doubling. */ +#define PIPECONF_PFIT_PF_INTERLACED_ILK (1 << 21) +#define PIPECONF_INTERLACED_ILK (3 << 21) +#define PIPECONF_INTERLACED_DBL_ILK (4 << 21) /* ilk/snb only */ +#define PIPECONF_PFIT_PF_INTERLACED_DBL_ILK (5 << 21) /* ilk/snb only */ +#define PIPECONF_CXSR_DOWNCLOCK (1<<16) +#define PIPECONF_BPP_MASK (0x000000e0) +#define PIPECONF_BPP_8 (0<<5) +#define PIPECONF_BPP_10 (1<<5) +#define PIPECONF_BPP_6 (2<<5) +#define PIPECONF_BPP_12 (3<<5) +#define PIPECONF_DITHER_EN (1<<4) +#define PIPECONF_DITHER_TYPE_MASK (0x0000000c) +#define PIPECONF_DITHER_TYPE_SP (0<<2) +#define PIPECONF_DITHER_TYPE_ST1 (1<<2) +#define PIPECONF_DITHER_TYPE_ST2 (2<<2) +#define PIPECONF_DITHER_TYPE_TEMP (3<<2) +#define _PIPEASTAT 0x70024 +#define PIPE_FIFO_UNDERRUN_STATUS (1UL<<31) +#define PIPE_CRC_ERROR_ENABLE (1UL<<29) +#define PIPE_CRC_DONE_ENABLE (1UL<<28) +#define PIPE_GMBUS_EVENT_ENABLE (1UL<<27) +#define PIPE_HOTPLUG_INTERRUPT_ENABLE (1UL<<26) +#define PIPE_VSYNC_INTERRUPT_ENABLE (1UL<<25) +#define PIPE_DISPLAY_LINE_COMPARE_ENABLE (1UL<<24) +#define PIPE_DPST_EVENT_ENABLE (1UL<<23) +#define PIPE_LEGACY_BLC_EVENT_ENABLE (1UL<<22) +#define PIPE_ODD_FIELD_INTERRUPT_ENABLE (1UL<<21) +#define PIPE_EVEN_FIELD_INTERRUPT_ENABLE (1UL<<20) +#define PIPE_HOTPLUG_TV_INTERRUPT_ENABLE (1UL<<18) /* pre-965 */ +#define PIPE_START_VBLANK_INTERRUPT_ENABLE (1UL<<18) /* 965 or later */ +#define PIPE_VBLANK_INTERRUPT_ENABLE (1UL<<17) +#define PIPE_OVERLAY_UPDATED_ENABLE (1UL<<16) +#define PIPE_CRC_ERROR_INTERRUPT_STATUS (1UL<<13) +#define PIPE_CRC_DONE_INTERRUPT_STATUS (1UL<<12) +#define PIPE_GMBUS_INTERRUPT_STATUS (1UL<<11) +#define PIPE_HOTPLUG_INTERRUPT_STATUS (1UL<<10) +#define PIPE_VSYNC_INTERRUPT_STATUS (1UL<<9) +#define PIPE_DISPLAY_LINE_COMPARE_STATUS (1UL<<8) +#define PIPE_DPST_EVENT_STATUS (1UL<<7) +#define PIPE_LEGACY_BLC_EVENT_STATUS (1UL<<6) +#define PIPE_ODD_FIELD_INTERRUPT_STATUS (1UL<<5) +#define PIPE_EVEN_FIELD_INTERRUPT_STATUS (1UL<<4) +#define PIPE_HOTPLUG_TV_INTERRUPT_STATUS (1UL<<2) /* pre-965 */ +#define PIPE_START_VBLANK_INTERRUPT_STATUS (1UL<<2) /* 965 or later */ +#define PIPE_VBLANK_INTERRUPT_STATUS (1UL<<1) +#define PIPE_OVERLAY_UPDATED_STATUS (1UL<<0) +#define PIPE_BPC_MASK (7 << 5) /* Ironlake */ +#define PIPE_8BPC (0 << 5) +#define PIPE_10BPC (1 << 5) +#define PIPE_6BPC (2 << 5) +#define PIPE_12BPC (3 << 5) + +#define PIPESRC(pipe) _PIPE(pipe, _PIPEASRC, _PIPEBSRC) +#define PIPECONF(pipe) _PIPE(pipe, _PIPEACONF, _PIPEBCONF) +#define PIPEDSL(pipe) _PIPE(pipe, _PIPEADSL, _PIPEBDSL) +#define PIPEFRAME(pipe) _PIPE(pipe, _PIPEAFRAMEHIGH, _PIPEBFRAMEHIGH) +#define PIPEFRAMEPIXEL(pipe) _PIPE(pipe, _PIPEAFRAMEPIXEL, _PIPEBFRAMEPIXEL) +#define PIPESTAT(pipe) _PIPE(pipe, _PIPEASTAT, _PIPEBSTAT) + +#define DSPARB 0x70030 +#define DSPARB_CSTART_MASK (0x7f << 7) +#define DSPARB_CSTART_SHIFT 7 +#define DSPARB_BSTART_MASK (0x7f) +#define DSPARB_BSTART_SHIFT 0 +#define DSPARB_BEND_SHIFT 9 /* on 855 */ +#define DSPARB_AEND_SHIFT 0 + +#define DSPFW1 0x70034 +#define DSPFW_SR_SHIFT 23 +#define DSPFW_SR_MASK (0x1ff<<23) +#define DSPFW_CURSORB_SHIFT 16 +#define DSPFW_CURSORB_MASK (0x3f<<16) +#define DSPFW_PLANEB_SHIFT 8 +#define DSPFW_PLANEB_MASK (0x7f<<8) +#define DSPFW_PLANEA_MASK (0x7f) +#define DSPFW2 0x70038 +#define DSPFW_CURSORA_MASK 0x00003f00 +#define DSPFW_CURSORA_SHIFT 8 +#define DSPFW_PLANEC_MASK (0x7f) +#define DSPFW3 0x7003c +#define DSPFW_HPLL_SR_EN (1<<31) +#define DSPFW_CURSOR_SR_SHIFT 24 +#define PINEVIEW_SELF_REFRESH_EN (1<<30) +#define DSPFW_CURSOR_SR_MASK (0x3f<<24) +#define DSPFW_HPLL_CURSOR_SHIFT 16 +#define DSPFW_HPLL_CURSOR_MASK (0x3f<<16) +#define DSPFW_HPLL_SR_MASK (0x1ff) + +/* FIFO watermark sizes etc */ +#define G4X_FIFO_LINE_SIZE 64 +#define I915_FIFO_LINE_SIZE 64 +#define I830_FIFO_LINE_SIZE 32 + +#define G4X_FIFO_SIZE 127 +#define I965_FIFO_SIZE 512 +#define I945_FIFO_SIZE 127 +#define I915_FIFO_SIZE 95 +#define I855GM_FIFO_SIZE 127 /* In cachelines */ +#define I830_FIFO_SIZE 95 + +#define G4X_MAX_WM 0x3f +#define I915_MAX_WM 0x3f + +#define PINEVIEW_DISPLAY_FIFO 512 /* in 64byte unit */ +#define PINEVIEW_FIFO_LINE_SIZE 64 +#define PINEVIEW_MAX_WM 0x1ff +#define PINEVIEW_DFT_WM 0x3f +#define PINEVIEW_DFT_HPLLOFF_WM 0 +#define PINEVIEW_GUARD_WM 10 +#define PINEVIEW_CURSOR_FIFO 64 +#define PINEVIEW_CURSOR_MAX_WM 0x3f +#define PINEVIEW_CURSOR_DFT_WM 0 +#define PINEVIEW_CURSOR_GUARD_WM 5 + +#define I965_CURSOR_FIFO 64 +#define I965_CURSOR_MAX_WM 32 +#define I965_CURSOR_DFT_WM 8 + +/* define the Watermark register on Ironlake */ +#define WM0_PIPEA_ILK 0x45100 +#define WM0_PIPE_PLANE_MASK (0x7f<<16) +#define WM0_PIPE_PLANE_SHIFT 16 +#define WM0_PIPE_SPRITE_MASK (0x3f<<8) +#define WM0_PIPE_SPRITE_SHIFT 8 +#define WM0_PIPE_CURSOR_MASK (0x1f) + +#define WM0_PIPEB_ILK 0x45104 +#define WM0_PIPEC_IVB 0x45200 +#define WM1_LP_ILK 0x45108 +#define WM1_LP_SR_EN (1<<31) +#define WM1_LP_LATENCY_SHIFT 24 +#define WM1_LP_LATENCY_MASK (0x7f<<24) +#define WM1_LP_FBC_MASK (0xf<<20) +#define WM1_LP_FBC_SHIFT 20 +#define WM1_LP_SR_MASK (0x1ff<<8) +#define WM1_LP_SR_SHIFT 8 +#define WM1_LP_CURSOR_MASK (0x3f) +#define WM2_LP_ILK 0x4510c +#define WM2_LP_EN (1<<31) +#define WM3_LP_ILK 0x45110 +#define WM3_LP_EN (1<<31) +#define WM1S_LP_ILK 0x45120 +#define WM2S_LP_IVB 0x45124 +#define WM3S_LP_IVB 0x45128 +#define WM1S_LP_EN (1<<31) + +/* Memory latency timer register */ +#define MLTR_ILK 0x11222 +#define MLTR_WM1_SHIFT 0 +#define MLTR_WM2_SHIFT 8 +/* the unit of memory self-refresh latency time is 0.5us */ +#define ILK_SRLT_MASK 0x3f +#define ILK_LATENCY(shift) (I915_READ(MLTR_ILK) >> (shift) & ILK_SRLT_MASK) +#define ILK_READ_WM1_LATENCY() ILK_LATENCY(MLTR_WM1_SHIFT) +#define ILK_READ_WM2_LATENCY() ILK_LATENCY(MLTR_WM2_SHIFT) + +/* define the fifo size on Ironlake */ +#define ILK_DISPLAY_FIFO 128 +#define ILK_DISPLAY_MAXWM 64 +#define ILK_DISPLAY_DFTWM 8 +#define ILK_CURSOR_FIFO 32 +#define ILK_CURSOR_MAXWM 16 +#define ILK_CURSOR_DFTWM 8 + +#define ILK_DISPLAY_SR_FIFO 512 +#define ILK_DISPLAY_MAX_SRWM 0x1ff +#define ILK_DISPLAY_DFT_SRWM 0x3f +#define ILK_CURSOR_SR_FIFO 64 +#define ILK_CURSOR_MAX_SRWM 0x3f +#define ILK_CURSOR_DFT_SRWM 8 + +#define ILK_FIFO_LINE_SIZE 64 + +/* define the WM info on Sandybridge */ +#define SNB_DISPLAY_FIFO 128 +#define SNB_DISPLAY_MAXWM 0x7f /* bit 16:22 */ +#define SNB_DISPLAY_DFTWM 8 +#define SNB_CURSOR_FIFO 32 +#define SNB_CURSOR_MAXWM 0x1f /* bit 4:0 */ +#define SNB_CURSOR_DFTWM 8 + +#define SNB_DISPLAY_SR_FIFO 512 +#define SNB_DISPLAY_MAX_SRWM 0x1ff /* bit 16:8 */ +#define SNB_DISPLAY_DFT_SRWM 0x3f +#define SNB_CURSOR_SR_FIFO 64 +#define SNB_CURSOR_MAX_SRWM 0x3f /* bit 5:0 */ +#define SNB_CURSOR_DFT_SRWM 8 + +#define SNB_FBC_MAX_SRWM 0xf /* bit 23:20 */ + +#define SNB_FIFO_LINE_SIZE 64 + + +/* the address where we get all kinds of latency value */ +#define SSKPD 0x5d10 +#define SSKPD_WM_MASK 0x3f +#define SSKPD_WM0_SHIFT 0 +#define SSKPD_WM1_SHIFT 8 +#define SSKPD_WM2_SHIFT 16 +#define SSKPD_WM3_SHIFT 24 + +#define SNB_LATENCY(shift) (I915_READ(MCHBAR_MIRROR_BASE_SNB + SSKPD) >> (shift) & SSKPD_WM_MASK) +#define SNB_READ_WM0_LATENCY() SNB_LATENCY(SSKPD_WM0_SHIFT) +#define SNB_READ_WM1_LATENCY() SNB_LATENCY(SSKPD_WM1_SHIFT) +#define SNB_READ_WM2_LATENCY() SNB_LATENCY(SSKPD_WM2_SHIFT) +#define SNB_READ_WM3_LATENCY() SNB_LATENCY(SSKPD_WM3_SHIFT) + +/* + * The two pipe frame counter registers are not synchronized, so + * reading a stable value is somewhat tricky. The following code + * should work: + * + * do { + * high1 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >> + * PIPE_FRAME_HIGH_SHIFT; + * low1 = ((INREG(PIPEAFRAMEPIXEL) & PIPE_FRAME_LOW_MASK) >> + * PIPE_FRAME_LOW_SHIFT); + * high2 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >> + * PIPE_FRAME_HIGH_SHIFT); + * } while (high1 != high2); + * frame = (high1 << 8) | low1; + */ +#define _PIPEAFRAMEHIGH 0x70040 +#define PIPE_FRAME_HIGH_MASK 0x0000ffff +#define PIPE_FRAME_HIGH_SHIFT 0 +#define _PIPEAFRAMEPIXEL 0x70044 +#define PIPE_FRAME_LOW_MASK 0xff000000 +#define PIPE_FRAME_LOW_SHIFT 24 +#define PIPE_PIXEL_MASK 0x00ffffff +#define PIPE_PIXEL_SHIFT 0 +/* GM45+ just has to be different */ +#define _PIPEA_FRMCOUNT_GM45 0x70040 +#define _PIPEA_FLIPCOUNT_GM45 0x70044 +#define PIPE_FRMCOUNT_GM45(pipe) _PIPE(pipe, _PIPEA_FRMCOUNT_GM45, _PIPEB_FRMCOUNT_GM45) + +/* Cursor A & B regs */ +#define _CURACNTR 0x70080 +/* Old style CUR*CNTR flags (desktop 8xx) */ +#define CURSOR_ENABLE 0x80000000 +#define CURSOR_GAMMA_ENABLE 0x40000000 +#define CURSOR_STRIDE_MASK 0x30000000 +#define CURSOR_FORMAT_SHIFT 24 +#define CURSOR_FORMAT_MASK (0x07 << CURSOR_FORMAT_SHIFT) +#define CURSOR_FORMAT_2C (0x00 << CURSOR_FORMAT_SHIFT) +#define CURSOR_FORMAT_3C (0x01 << CURSOR_FORMAT_SHIFT) +#define CURSOR_FORMAT_4C (0x02 << CURSOR_FORMAT_SHIFT) +#define CURSOR_FORMAT_ARGB (0x04 << CURSOR_FORMAT_SHIFT) +#define CURSOR_FORMAT_XRGB (0x05 << CURSOR_FORMAT_SHIFT) +/* New style CUR*CNTR flags */ +#define CURSOR_MODE 0x27 +#define CURSOR_MODE_DISABLE 0x00 +#define CURSOR_MODE_64_32B_AX 0x07 +#define CURSOR_MODE_64_ARGB_AX ((1 << 5) | CURSOR_MODE_64_32B_AX) +#define MCURSOR_PIPE_SELECT (1 << 28) +#define MCURSOR_PIPE_A 0x00 +#define MCURSOR_PIPE_B (1 << 28) +#define MCURSOR_GAMMA_ENABLE (1 << 26) +#define _CURABASE 0x70084 +#define _CURAPOS 0x70088 +#define CURSOR_POS_MASK 0x007FF +#define CURSOR_POS_SIGN 0x8000 +#define CURSOR_X_SHIFT 0 +#define CURSOR_Y_SHIFT 16 +#define CURSIZE 0x700a0 +#define _CURBCNTR 0x700c0 +#define _CURBBASE 0x700c4 +#define _CURBPOS 0x700c8 + +#define _CURBCNTR_IVB 0x71080 +#define _CURBBASE_IVB 0x71084 +#define _CURBPOS_IVB 0x71088 + +#define CURCNTR(pipe) _PIPE(pipe, _CURACNTR, _CURBCNTR) +#define CURBASE(pipe) _PIPE(pipe, _CURABASE, _CURBBASE) +#define CURPOS(pipe) _PIPE(pipe, _CURAPOS, _CURBPOS) + +#define CURCNTR_IVB(pipe) _PIPE(pipe, _CURACNTR, _CURBCNTR_IVB) +#define CURBASE_IVB(pipe) _PIPE(pipe, _CURABASE, _CURBBASE_IVB) +#define CURPOS_IVB(pipe) _PIPE(pipe, _CURAPOS, _CURBPOS_IVB) + +/* Display A control */ +#define _DSPACNTR 0x70180 +#define DISPLAY_PLANE_ENABLE (1<<31) +#define DISPLAY_PLANE_DISABLE 0 +#define DISPPLANE_GAMMA_ENABLE (1<<30) +#define DISPPLANE_GAMMA_DISABLE 0 +#define DISPPLANE_PIXFORMAT_MASK (0xf<<26) +#define DISPPLANE_8BPP (0x2<<26) +#define DISPPLANE_15_16BPP (0x4<<26) +#define DISPPLANE_16BPP (0x5<<26) +#define DISPPLANE_32BPP_NO_ALPHA (0x6<<26) +#define DISPPLANE_32BPP (0x7<<26) +#define DISPPLANE_32BPP_30BIT_NO_ALPHA (0xa<<26) +#define DISPPLANE_STEREO_ENABLE (1<<25) +#define DISPPLANE_STEREO_DISABLE 0 +#define DISPPLANE_SEL_PIPE_SHIFT 24 +#define DISPPLANE_SEL_PIPE_MASK (3< + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 dpll_reg; + + /* On IVB, 3rd pipe shares PLL with another one */ + if (pipe > 1) + return false; + + if (HAS_PCH_SPLIT(dev)) + dpll_reg = PCH_DPLL(pipe); + else + dpll_reg = (pipe == PIPE_A) ? _DPLL_A : _DPLL_B; + + return (I915_READ(dpll_reg) & DPLL_VCO_ENABLE); +} + +static void i915_save_palette(struct drm_device *dev, enum pipe pipe) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + unsigned long reg = (pipe == PIPE_A ? _PALETTE_A : _PALETTE_B); + u32 *array; + int i; + + if (!i915_pipe_enabled(dev, pipe)) + return; + + if (HAS_PCH_SPLIT(dev)) + reg = (pipe == PIPE_A) ? _LGC_PALETTE_A : _LGC_PALETTE_B; + + if (pipe == PIPE_A) + array = dev_priv->save_palette_a; + else + array = dev_priv->save_palette_b; + + for (i = 0; i < 256; i++) + array[i] = I915_READ(reg + (i << 2)); +} + +static void i915_restore_palette(struct drm_device *dev, enum pipe pipe) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + unsigned long reg = (pipe == PIPE_A ? _PALETTE_A : _PALETTE_B); + u32 *array; + int i; + + if (!i915_pipe_enabled(dev, pipe)) + return; + + if (HAS_PCH_SPLIT(dev)) + reg = (pipe == PIPE_A) ? _LGC_PALETTE_A : _LGC_PALETTE_B; + + if (pipe == PIPE_A) + array = dev_priv->save_palette_a; + else + array = dev_priv->save_palette_b; + + for (i = 0; i < 256; i++) + I915_WRITE(reg + (i << 2), array[i]); +} + +static u8 i915_read_indexed(struct drm_device *dev, u16 index_port, u16 data_port, u8 reg) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + I915_WRITE8(index_port, reg); + return I915_READ8(data_port); +} + +static u8 i915_read_ar(struct drm_device *dev, u16 st01, u8 reg, u16 palette_enable) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + I915_READ8(st01); + I915_WRITE8(VGA_AR_INDEX, palette_enable | reg); + return I915_READ8(VGA_AR_DATA_READ); +} + +static void i915_write_ar(struct drm_device *dev, u16 st01, u8 reg, u8 val, u16 palette_enable) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + I915_READ8(st01); + I915_WRITE8(VGA_AR_INDEX, palette_enable | reg); + I915_WRITE8(VGA_AR_DATA_WRITE, val); +} + +static void i915_write_indexed(struct drm_device *dev, u16 index_port, u16 data_port, u8 reg, u8 val) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + I915_WRITE8(index_port, reg); + I915_WRITE8(data_port, val); +} + +static void i915_save_vga(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int i; + u16 cr_index, cr_data, st01; + + /* VGA color palette registers */ + dev_priv->saveDACMASK = I915_READ8(VGA_DACMASK); + + /* MSR bits */ + dev_priv->saveMSR = I915_READ8(VGA_MSR_READ); + if (dev_priv->saveMSR & VGA_MSR_CGA_MODE) { + cr_index = VGA_CR_INDEX_CGA; + cr_data = VGA_CR_DATA_CGA; + st01 = VGA_ST01_CGA; + } else { + cr_index = VGA_CR_INDEX_MDA; + cr_data = VGA_CR_DATA_MDA; + st01 = VGA_ST01_MDA; + } + + /* CRT controller regs */ + i915_write_indexed(dev, cr_index, cr_data, 0x11, + i915_read_indexed(dev, cr_index, cr_data, 0x11) & + (~0x80)); + for (i = 0; i <= 0x24; i++) + dev_priv->saveCR[i] = + i915_read_indexed(dev, cr_index, cr_data, i); + /* Make sure we don't turn off CR group 0 writes */ + dev_priv->saveCR[0x11] &= ~0x80; + + /* Attribute controller registers */ + I915_READ8(st01); + dev_priv->saveAR_INDEX = I915_READ8(VGA_AR_INDEX); + for (i = 0; i <= 0x14; i++) + dev_priv->saveAR[i] = i915_read_ar(dev, st01, i, 0); + I915_READ8(st01); + I915_WRITE8(VGA_AR_INDEX, dev_priv->saveAR_INDEX); + I915_READ8(st01); + + /* Graphics controller registers */ + for (i = 0; i < 9; i++) + dev_priv->saveGR[i] = + i915_read_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, i); + + dev_priv->saveGR[0x10] = + i915_read_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, 0x10); + dev_priv->saveGR[0x11] = + i915_read_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, 0x11); + dev_priv->saveGR[0x18] = + i915_read_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, 0x18); + + /* Sequencer registers */ + for (i = 0; i < 8; i++) + dev_priv->saveSR[i] = + i915_read_indexed(dev, VGA_SR_INDEX, VGA_SR_DATA, i); +} + +static void i915_restore_vga(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int i; + u16 cr_index, cr_data, st01; + + /* MSR bits */ + I915_WRITE8(VGA_MSR_WRITE, dev_priv->saveMSR); + if (dev_priv->saveMSR & VGA_MSR_CGA_MODE) { + cr_index = VGA_CR_INDEX_CGA; + cr_data = VGA_CR_DATA_CGA; + st01 = VGA_ST01_CGA; + } else { + cr_index = VGA_CR_INDEX_MDA; + cr_data = VGA_CR_DATA_MDA; + st01 = VGA_ST01_MDA; + } + + /* Sequencer registers, don't write SR07 */ + for (i = 0; i < 7; i++) + i915_write_indexed(dev, VGA_SR_INDEX, VGA_SR_DATA, i, + dev_priv->saveSR[i]); + + /* CRT controller regs */ + /* Enable CR group 0 writes */ + i915_write_indexed(dev, cr_index, cr_data, 0x11, dev_priv->saveCR[0x11]); + for (i = 0; i <= 0x24; i++) + i915_write_indexed(dev, cr_index, cr_data, i, dev_priv->saveCR[i]); + + /* Graphics controller regs */ + for (i = 0; i < 9; i++) + i915_write_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, i, + dev_priv->saveGR[i]); + + i915_write_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, 0x10, + dev_priv->saveGR[0x10]); + i915_write_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, 0x11, + dev_priv->saveGR[0x11]); + i915_write_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, 0x18, + dev_priv->saveGR[0x18]); + + /* Attribute controller registers */ + I915_READ8(st01); /* switch back to index mode */ + for (i = 0; i <= 0x14; i++) + i915_write_ar(dev, st01, i, dev_priv->saveAR[i], 0); + I915_READ8(st01); /* switch back to index mode */ + I915_WRITE8(VGA_AR_INDEX, dev_priv->saveAR_INDEX | 0x20); + I915_READ8(st01); + + /* VGA color palette registers */ + I915_WRITE8(VGA_DACMASK, dev_priv->saveDACMASK); +} + +static void i915_save_modeset_reg(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int i; + + if (drm_core_check_feature(dev, DRIVER_MODESET)) + return; + + /* Cursor state */ + dev_priv->saveCURACNTR = I915_READ(_CURACNTR); + dev_priv->saveCURAPOS = I915_READ(_CURAPOS); + dev_priv->saveCURABASE = I915_READ(_CURABASE); + dev_priv->saveCURBCNTR = I915_READ(_CURBCNTR); + dev_priv->saveCURBPOS = I915_READ(_CURBPOS); + dev_priv->saveCURBBASE = I915_READ(_CURBBASE); + if (IS_GEN2(dev)) + dev_priv->saveCURSIZE = I915_READ(CURSIZE); + + if (HAS_PCH_SPLIT(dev)) { + dev_priv->savePCH_DREF_CONTROL = I915_READ(PCH_DREF_CONTROL); + dev_priv->saveDISP_ARB_CTL = I915_READ(DISP_ARB_CTL); + } + + /* Pipe & plane A info */ + dev_priv->savePIPEACONF = I915_READ(_PIPEACONF); + dev_priv->savePIPEASRC = I915_READ(_PIPEASRC); + if (HAS_PCH_SPLIT(dev)) { + dev_priv->saveFPA0 = I915_READ(_PCH_FPA0); + dev_priv->saveFPA1 = I915_READ(_PCH_FPA1); + dev_priv->saveDPLL_A = I915_READ(_PCH_DPLL_A); + } else { + dev_priv->saveFPA0 = I915_READ(_FPA0); + dev_priv->saveFPA1 = I915_READ(_FPA1); + dev_priv->saveDPLL_A = I915_READ(_DPLL_A); + } + if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) + dev_priv->saveDPLL_A_MD = I915_READ(_DPLL_A_MD); + dev_priv->saveHTOTAL_A = I915_READ(_HTOTAL_A); + dev_priv->saveHBLANK_A = I915_READ(_HBLANK_A); + dev_priv->saveHSYNC_A = I915_READ(_HSYNC_A); + dev_priv->saveVTOTAL_A = I915_READ(_VTOTAL_A); + dev_priv->saveVBLANK_A = I915_READ(_VBLANK_A); + dev_priv->saveVSYNC_A = I915_READ(_VSYNC_A); + if (!HAS_PCH_SPLIT(dev)) + dev_priv->saveBCLRPAT_A = I915_READ(_BCLRPAT_A); + + if (HAS_PCH_SPLIT(dev)) { + dev_priv->savePIPEA_DATA_M1 = I915_READ(_PIPEA_DATA_M1); + dev_priv->savePIPEA_DATA_N1 = I915_READ(_PIPEA_DATA_N1); + dev_priv->savePIPEA_LINK_M1 = I915_READ(_PIPEA_LINK_M1); + dev_priv->savePIPEA_LINK_N1 = I915_READ(_PIPEA_LINK_N1); + + dev_priv->saveFDI_TXA_CTL = I915_READ(_FDI_TXA_CTL); + dev_priv->saveFDI_RXA_CTL = I915_READ(_FDI_RXA_CTL); + + dev_priv->savePFA_CTL_1 = I915_READ(_PFA_CTL_1); + dev_priv->savePFA_WIN_SZ = I915_READ(_PFA_WIN_SZ); + dev_priv->savePFA_WIN_POS = I915_READ(_PFA_WIN_POS); + + dev_priv->saveTRANSACONF = I915_READ(_TRANSACONF); + dev_priv->saveTRANS_HTOTAL_A = I915_READ(_TRANS_HTOTAL_A); + dev_priv->saveTRANS_HBLANK_A = I915_READ(_TRANS_HBLANK_A); + dev_priv->saveTRANS_HSYNC_A = I915_READ(_TRANS_HSYNC_A); + dev_priv->saveTRANS_VTOTAL_A = I915_READ(_TRANS_VTOTAL_A); + dev_priv->saveTRANS_VBLANK_A = I915_READ(_TRANS_VBLANK_A); + dev_priv->saveTRANS_VSYNC_A = I915_READ(_TRANS_VSYNC_A); + } + + dev_priv->saveDSPACNTR = I915_READ(_DSPACNTR); + dev_priv->saveDSPASTRIDE = I915_READ(_DSPASTRIDE); + dev_priv->saveDSPASIZE = I915_READ(_DSPASIZE); + dev_priv->saveDSPAPOS = I915_READ(_DSPAPOS); + dev_priv->saveDSPAADDR = I915_READ(_DSPAADDR); + if (INTEL_INFO(dev)->gen >= 4) { + dev_priv->saveDSPASURF = I915_READ(_DSPASURF); + dev_priv->saveDSPATILEOFF = I915_READ(_DSPATILEOFF); + } + i915_save_palette(dev, PIPE_A); + dev_priv->savePIPEASTAT = I915_READ(_PIPEASTAT); + + /* Pipe & plane B info */ + dev_priv->savePIPEBCONF = I915_READ(_PIPEBCONF); + dev_priv->savePIPEBSRC = I915_READ(_PIPEBSRC); + if (HAS_PCH_SPLIT(dev)) { + dev_priv->saveFPB0 = I915_READ(_PCH_FPB0); + dev_priv->saveFPB1 = I915_READ(_PCH_FPB1); + dev_priv->saveDPLL_B = I915_READ(_PCH_DPLL_B); + } else { + dev_priv->saveFPB0 = I915_READ(_FPB0); + dev_priv->saveFPB1 = I915_READ(_FPB1); + dev_priv->saveDPLL_B = I915_READ(_DPLL_B); + } + if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) + dev_priv->saveDPLL_B_MD = I915_READ(_DPLL_B_MD); + dev_priv->saveHTOTAL_B = I915_READ(_HTOTAL_B); + dev_priv->saveHBLANK_B = I915_READ(_HBLANK_B); + dev_priv->saveHSYNC_B = I915_READ(_HSYNC_B); + dev_priv->saveVTOTAL_B = I915_READ(_VTOTAL_B); + dev_priv->saveVBLANK_B = I915_READ(_VBLANK_B); + dev_priv->saveVSYNC_B = I915_READ(_VSYNC_B); + if (!HAS_PCH_SPLIT(dev)) + dev_priv->saveBCLRPAT_B = I915_READ(_BCLRPAT_B); + + if (HAS_PCH_SPLIT(dev)) { + dev_priv->savePIPEB_DATA_M1 = I915_READ(_PIPEB_DATA_M1); + dev_priv->savePIPEB_DATA_N1 = I915_READ(_PIPEB_DATA_N1); + dev_priv->savePIPEB_LINK_M1 = I915_READ(_PIPEB_LINK_M1); + dev_priv->savePIPEB_LINK_N1 = I915_READ(_PIPEB_LINK_N1); + + dev_priv->saveFDI_TXB_CTL = I915_READ(_FDI_TXB_CTL); + dev_priv->saveFDI_RXB_CTL = I915_READ(_FDI_RXB_CTL); + + dev_priv->savePFB_CTL_1 = I915_READ(_PFB_CTL_1); + dev_priv->savePFB_WIN_SZ = I915_READ(_PFB_WIN_SZ); + dev_priv->savePFB_WIN_POS = I915_READ(_PFB_WIN_POS); + + dev_priv->saveTRANSBCONF = I915_READ(_TRANSBCONF); + dev_priv->saveTRANS_HTOTAL_B = I915_READ(_TRANS_HTOTAL_B); + dev_priv->saveTRANS_HBLANK_B = I915_READ(_TRANS_HBLANK_B); + dev_priv->saveTRANS_HSYNC_B = I915_READ(_TRANS_HSYNC_B); + dev_priv->saveTRANS_VTOTAL_B = I915_READ(_TRANS_VTOTAL_B); + dev_priv->saveTRANS_VBLANK_B = I915_READ(_TRANS_VBLANK_B); + dev_priv->saveTRANS_VSYNC_B = I915_READ(_TRANS_VSYNC_B); + } + + dev_priv->saveDSPBCNTR = I915_READ(_DSPBCNTR); + dev_priv->saveDSPBSTRIDE = I915_READ(_DSPBSTRIDE); + dev_priv->saveDSPBSIZE = I915_READ(_DSPBSIZE); + dev_priv->saveDSPBPOS = I915_READ(_DSPBPOS); + dev_priv->saveDSPBADDR = I915_READ(_DSPBADDR); + if (INTEL_INFO(dev)->gen >= 4) { + dev_priv->saveDSPBSURF = I915_READ(_DSPBSURF); + dev_priv->saveDSPBTILEOFF = I915_READ(_DSPBTILEOFF); + } + i915_save_palette(dev, PIPE_B); + dev_priv->savePIPEBSTAT = I915_READ(_PIPEBSTAT); + + /* Fences */ + switch (INTEL_INFO(dev)->gen) { + case 7: + case 6: + for (i = 0; i < 16; i++) + dev_priv->saveFENCE[i] = I915_READ64(FENCE_REG_SANDYBRIDGE_0 + (i * 8)); + break; + case 5: + case 4: + for (i = 0; i < 16; i++) + dev_priv->saveFENCE[i] = I915_READ64(FENCE_REG_965_0 + (i * 8)); + break; + case 3: + if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) + for (i = 0; i < 8; i++) + dev_priv->saveFENCE[i+8] = I915_READ(FENCE_REG_945_8 + (i * 4)); + case 2: + for (i = 0; i < 8; i++) + dev_priv->saveFENCE[i] = I915_READ(FENCE_REG_830_0 + (i * 4)); + break; + } + + return; +} + +static void i915_restore_modeset_reg(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int dpll_a_reg, fpa0_reg, fpa1_reg; + int dpll_b_reg, fpb0_reg, fpb1_reg; + int i; + + if (drm_core_check_feature(dev, DRIVER_MODESET)) + return; + + /* Fences */ + switch (INTEL_INFO(dev)->gen) { + case 7: + case 6: + for (i = 0; i < 16; i++) + I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + (i * 8), dev_priv->saveFENCE[i]); + break; + case 5: + case 4: + for (i = 0; i < 16; i++) + I915_WRITE64(FENCE_REG_965_0 + (i * 8), dev_priv->saveFENCE[i]); + break; + case 3: + case 2: + if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) + for (i = 0; i < 8; i++) + I915_WRITE(FENCE_REG_945_8 + (i * 4), dev_priv->saveFENCE[i+8]); + for (i = 0; i < 8; i++) + I915_WRITE(FENCE_REG_830_0 + (i * 4), dev_priv->saveFENCE[i]); + break; + } + + + if (HAS_PCH_SPLIT(dev)) { + dpll_a_reg = _PCH_DPLL_A; + dpll_b_reg = _PCH_DPLL_B; + fpa0_reg = _PCH_FPA0; + fpb0_reg = _PCH_FPB0; + fpa1_reg = _PCH_FPA1; + fpb1_reg = _PCH_FPB1; + } else { + dpll_a_reg = _DPLL_A; + dpll_b_reg = _DPLL_B; + fpa0_reg = _FPA0; + fpb0_reg = _FPB0; + fpa1_reg = _FPA1; + fpb1_reg = _FPB1; + } + + if (HAS_PCH_SPLIT(dev)) { + I915_WRITE(PCH_DREF_CONTROL, dev_priv->savePCH_DREF_CONTROL); + I915_WRITE(DISP_ARB_CTL, dev_priv->saveDISP_ARB_CTL); + } + + /* Pipe & plane A info */ + /* Prime the clock */ + if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) { + I915_WRITE(dpll_a_reg, dev_priv->saveDPLL_A & + ~DPLL_VCO_ENABLE); + POSTING_READ(dpll_a_reg); + DRM_UDELAY(150); + } + I915_WRITE(fpa0_reg, dev_priv->saveFPA0); + I915_WRITE(fpa1_reg, dev_priv->saveFPA1); + /* Actually enable it */ + I915_WRITE(dpll_a_reg, dev_priv->saveDPLL_A); + POSTING_READ(dpll_a_reg); + DRM_UDELAY(150); + if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) { + I915_WRITE(_DPLL_A_MD, dev_priv->saveDPLL_A_MD); + POSTING_READ(_DPLL_A_MD); + } + DRM_UDELAY(150); + + /* Restore mode */ + I915_WRITE(_HTOTAL_A, dev_priv->saveHTOTAL_A); + I915_WRITE(_HBLANK_A, dev_priv->saveHBLANK_A); + I915_WRITE(_HSYNC_A, dev_priv->saveHSYNC_A); + I915_WRITE(_VTOTAL_A, dev_priv->saveVTOTAL_A); + I915_WRITE(_VBLANK_A, dev_priv->saveVBLANK_A); + I915_WRITE(_VSYNC_A, dev_priv->saveVSYNC_A); + if (!HAS_PCH_SPLIT(dev)) + I915_WRITE(_BCLRPAT_A, dev_priv->saveBCLRPAT_A); + + if (HAS_PCH_SPLIT(dev)) { + I915_WRITE(_PIPEA_DATA_M1, dev_priv->savePIPEA_DATA_M1); + I915_WRITE(_PIPEA_DATA_N1, dev_priv->savePIPEA_DATA_N1); + I915_WRITE(_PIPEA_LINK_M1, dev_priv->savePIPEA_LINK_M1); + I915_WRITE(_PIPEA_LINK_N1, dev_priv->savePIPEA_LINK_N1); + + I915_WRITE(_FDI_RXA_CTL, dev_priv->saveFDI_RXA_CTL); + I915_WRITE(_FDI_TXA_CTL, dev_priv->saveFDI_TXA_CTL); + + I915_WRITE(_PFA_CTL_1, dev_priv->savePFA_CTL_1); + I915_WRITE(_PFA_WIN_SZ, dev_priv->savePFA_WIN_SZ); + I915_WRITE(_PFA_WIN_POS, dev_priv->savePFA_WIN_POS); + + I915_WRITE(_TRANSACONF, dev_priv->saveTRANSACONF); + I915_WRITE(_TRANS_HTOTAL_A, dev_priv->saveTRANS_HTOTAL_A); + I915_WRITE(_TRANS_HBLANK_A, dev_priv->saveTRANS_HBLANK_A); + I915_WRITE(_TRANS_HSYNC_A, dev_priv->saveTRANS_HSYNC_A); + I915_WRITE(_TRANS_VTOTAL_A, dev_priv->saveTRANS_VTOTAL_A); + I915_WRITE(_TRANS_VBLANK_A, dev_priv->saveTRANS_VBLANK_A); + I915_WRITE(_TRANS_VSYNC_A, dev_priv->saveTRANS_VSYNC_A); + } + + /* Restore plane info */ + I915_WRITE(_DSPASIZE, dev_priv->saveDSPASIZE); + I915_WRITE(_DSPAPOS, dev_priv->saveDSPAPOS); + I915_WRITE(_PIPEASRC, dev_priv->savePIPEASRC); + I915_WRITE(_DSPAADDR, dev_priv->saveDSPAADDR); + I915_WRITE(_DSPASTRIDE, dev_priv->saveDSPASTRIDE); + if (INTEL_INFO(dev)->gen >= 4) { + I915_WRITE(_DSPASURF, dev_priv->saveDSPASURF); + I915_WRITE(_DSPATILEOFF, dev_priv->saveDSPATILEOFF); + } + + I915_WRITE(_PIPEACONF, dev_priv->savePIPEACONF); + + i915_restore_palette(dev, PIPE_A); + /* Enable the plane */ + I915_WRITE(_DSPACNTR, dev_priv->saveDSPACNTR); + I915_WRITE(_DSPAADDR, I915_READ(_DSPAADDR)); + + /* Pipe & plane B info */ + if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) { + I915_WRITE(dpll_b_reg, dev_priv->saveDPLL_B & + ~DPLL_VCO_ENABLE); + POSTING_READ(dpll_b_reg); + DRM_UDELAY(150); + } + I915_WRITE(fpb0_reg, dev_priv->saveFPB0); + I915_WRITE(fpb1_reg, dev_priv->saveFPB1); + /* Actually enable it */ + I915_WRITE(dpll_b_reg, dev_priv->saveDPLL_B); + POSTING_READ(dpll_b_reg); + DRM_UDELAY(150); + if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) { + I915_WRITE(_DPLL_B_MD, dev_priv->saveDPLL_B_MD); + POSTING_READ(_DPLL_B_MD); + } + DRM_UDELAY(150); + + /* Restore mode */ + I915_WRITE(_HTOTAL_B, dev_priv->saveHTOTAL_B); + I915_WRITE(_HBLANK_B, dev_priv->saveHBLANK_B); + I915_WRITE(_HSYNC_B, dev_priv->saveHSYNC_B); + I915_WRITE(_VTOTAL_B, dev_priv->saveVTOTAL_B); + I915_WRITE(_VBLANK_B, dev_priv->saveVBLANK_B); + I915_WRITE(_VSYNC_B, dev_priv->saveVSYNC_B); + if (!HAS_PCH_SPLIT(dev)) + I915_WRITE(_BCLRPAT_B, dev_priv->saveBCLRPAT_B); + + if (HAS_PCH_SPLIT(dev)) { + I915_WRITE(_PIPEB_DATA_M1, dev_priv->savePIPEB_DATA_M1); + I915_WRITE(_PIPEB_DATA_N1, dev_priv->savePIPEB_DATA_N1); + I915_WRITE(_PIPEB_LINK_M1, dev_priv->savePIPEB_LINK_M1); + I915_WRITE(_PIPEB_LINK_N1, dev_priv->savePIPEB_LINK_N1); + + I915_WRITE(_FDI_RXB_CTL, dev_priv->saveFDI_RXB_CTL); + I915_WRITE(_FDI_TXB_CTL, dev_priv->saveFDI_TXB_CTL); + + I915_WRITE(_PFB_CTL_1, dev_priv->savePFB_CTL_1); + I915_WRITE(_PFB_WIN_SZ, dev_priv->savePFB_WIN_SZ); + I915_WRITE(_PFB_WIN_POS, dev_priv->savePFB_WIN_POS); + + I915_WRITE(_TRANSBCONF, dev_priv->saveTRANSBCONF); + I915_WRITE(_TRANS_HTOTAL_B, dev_priv->saveTRANS_HTOTAL_B); + I915_WRITE(_TRANS_HBLANK_B, dev_priv->saveTRANS_HBLANK_B); + I915_WRITE(_TRANS_HSYNC_B, dev_priv->saveTRANS_HSYNC_B); + I915_WRITE(_TRANS_VTOTAL_B, dev_priv->saveTRANS_VTOTAL_B); + I915_WRITE(_TRANS_VBLANK_B, dev_priv->saveTRANS_VBLANK_B); + I915_WRITE(_TRANS_VSYNC_B, dev_priv->saveTRANS_VSYNC_B); + } + + /* Restore plane info */ + I915_WRITE(_DSPBSIZE, dev_priv->saveDSPBSIZE); + I915_WRITE(_DSPBPOS, dev_priv->saveDSPBPOS); + I915_WRITE(_PIPEBSRC, dev_priv->savePIPEBSRC); + I915_WRITE(_DSPBADDR, dev_priv->saveDSPBADDR); + I915_WRITE(_DSPBSTRIDE, dev_priv->saveDSPBSTRIDE); + if (INTEL_INFO(dev)->gen >= 4) { + I915_WRITE(_DSPBSURF, dev_priv->saveDSPBSURF); + I915_WRITE(_DSPBTILEOFF, dev_priv->saveDSPBTILEOFF); + } + + I915_WRITE(_PIPEBCONF, dev_priv->savePIPEBCONF); + + i915_restore_palette(dev, PIPE_B); + /* Enable the plane */ + I915_WRITE(_DSPBCNTR, dev_priv->saveDSPBCNTR); + I915_WRITE(_DSPBADDR, I915_READ(_DSPBADDR)); + + /* Cursor state */ + I915_WRITE(_CURAPOS, dev_priv->saveCURAPOS); + I915_WRITE(_CURACNTR, dev_priv->saveCURACNTR); + I915_WRITE(_CURABASE, dev_priv->saveCURABASE); + I915_WRITE(_CURBPOS, dev_priv->saveCURBPOS); + I915_WRITE(_CURBCNTR, dev_priv->saveCURBCNTR); + I915_WRITE(_CURBBASE, dev_priv->saveCURBBASE); + if (IS_GEN2(dev)) + I915_WRITE(CURSIZE, dev_priv->saveCURSIZE); + + return; +} + +static void i915_save_display(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + /* Display arbitration control */ + dev_priv->saveDSPARB = I915_READ(DSPARB); + + /* This is only meaningful in non-KMS mode */ + /* Don't save them in KMS mode */ + i915_save_modeset_reg(dev); + + /* CRT state */ + if (HAS_PCH_SPLIT(dev)) { + dev_priv->saveADPA = I915_READ(PCH_ADPA); + } else { + dev_priv->saveADPA = I915_READ(ADPA); + } + + /* LVDS state */ + if (HAS_PCH_SPLIT(dev)) { + dev_priv->savePP_CONTROL = I915_READ(PCH_PP_CONTROL); + dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_PCH_CTL1); + dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_PCH_CTL2); + dev_priv->saveBLC_CPU_PWM_CTL = I915_READ(BLC_PWM_CPU_CTL); + dev_priv->saveBLC_CPU_PWM_CTL2 = I915_READ(BLC_PWM_CPU_CTL2); + dev_priv->saveLVDS = I915_READ(PCH_LVDS); + } else { + dev_priv->savePP_CONTROL = I915_READ(PP_CONTROL); + dev_priv->savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS); + dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL); + dev_priv->saveBLC_HIST_CTL = I915_READ(BLC_HIST_CTL); + if (INTEL_INFO(dev)->gen >= 4) + dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2); + if (IS_MOBILE(dev) && !IS_I830(dev)) + dev_priv->saveLVDS = I915_READ(LVDS); + } + + if (!IS_I830(dev) && !IS_845G(dev) && !HAS_PCH_SPLIT(dev)) + dev_priv->savePFIT_CONTROL = I915_READ(PFIT_CONTROL); + + if (HAS_PCH_SPLIT(dev)) { + dev_priv->savePP_ON_DELAYS = I915_READ(PCH_PP_ON_DELAYS); + dev_priv->savePP_OFF_DELAYS = I915_READ(PCH_PP_OFF_DELAYS); + dev_priv->savePP_DIVISOR = I915_READ(PCH_PP_DIVISOR); + } else { + dev_priv->savePP_ON_DELAYS = I915_READ(PP_ON_DELAYS); + dev_priv->savePP_OFF_DELAYS = I915_READ(PP_OFF_DELAYS); + dev_priv->savePP_DIVISOR = I915_READ(PP_DIVISOR); + } + + /* Display Port state */ + if (SUPPORTS_INTEGRATED_DP(dev)) { + dev_priv->saveDP_B = I915_READ(DP_B); + dev_priv->saveDP_C = I915_READ(DP_C); + dev_priv->saveDP_D = I915_READ(DP_D); + dev_priv->savePIPEA_GMCH_DATA_M = I915_READ(_PIPEA_GMCH_DATA_M); + dev_priv->savePIPEB_GMCH_DATA_M = I915_READ(_PIPEB_GMCH_DATA_M); + dev_priv->savePIPEA_GMCH_DATA_N = I915_READ(_PIPEA_GMCH_DATA_N); + dev_priv->savePIPEB_GMCH_DATA_N = I915_READ(_PIPEB_GMCH_DATA_N); + dev_priv->savePIPEA_DP_LINK_M = I915_READ(_PIPEA_DP_LINK_M); + dev_priv->savePIPEB_DP_LINK_M = I915_READ(_PIPEB_DP_LINK_M); + dev_priv->savePIPEA_DP_LINK_N = I915_READ(_PIPEA_DP_LINK_N); + dev_priv->savePIPEB_DP_LINK_N = I915_READ(_PIPEB_DP_LINK_N); + } + /* FIXME: save TV & SDVO state */ + + /* Only save FBC state on the platform that supports FBC */ + if (I915_HAS_FBC(dev)) { + if (HAS_PCH_SPLIT(dev)) { + dev_priv->saveDPFC_CB_BASE = I915_READ(ILK_DPFC_CB_BASE); + } else if (IS_GM45(dev)) { + dev_priv->saveDPFC_CB_BASE = I915_READ(DPFC_CB_BASE); + } else { + dev_priv->saveFBC_CFB_BASE = I915_READ(FBC_CFB_BASE); + dev_priv->saveFBC_LL_BASE = I915_READ(FBC_LL_BASE); + dev_priv->saveFBC_CONTROL2 = I915_READ(FBC_CONTROL2); + dev_priv->saveFBC_CONTROL = I915_READ(FBC_CONTROL); + } + } + + /* VGA state */ + dev_priv->saveVGA0 = I915_READ(VGA0); + dev_priv->saveVGA1 = I915_READ(VGA1); + dev_priv->saveVGA_PD = I915_READ(VGA_PD); + if (HAS_PCH_SPLIT(dev)) + dev_priv->saveVGACNTRL = I915_READ(CPU_VGACNTRL); + else + dev_priv->saveVGACNTRL = I915_READ(VGACNTRL); + + i915_save_vga(dev); +} + +static void i915_restore_display(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + /* Display arbitration */ + I915_WRITE(DSPARB, dev_priv->saveDSPARB); + + /* Display port ratios (must be done before clock is set) */ + if (SUPPORTS_INTEGRATED_DP(dev)) { + I915_WRITE(_PIPEA_GMCH_DATA_M, dev_priv->savePIPEA_GMCH_DATA_M); + I915_WRITE(_PIPEB_GMCH_DATA_M, dev_priv->savePIPEB_GMCH_DATA_M); + I915_WRITE(_PIPEA_GMCH_DATA_N, dev_priv->savePIPEA_GMCH_DATA_N); + I915_WRITE(_PIPEB_GMCH_DATA_N, dev_priv->savePIPEB_GMCH_DATA_N); + I915_WRITE(_PIPEA_DP_LINK_M, dev_priv->savePIPEA_DP_LINK_M); + I915_WRITE(_PIPEB_DP_LINK_M, dev_priv->savePIPEB_DP_LINK_M); + I915_WRITE(_PIPEA_DP_LINK_N, dev_priv->savePIPEA_DP_LINK_N); + I915_WRITE(_PIPEB_DP_LINK_N, dev_priv->savePIPEB_DP_LINK_N); + } + + /* This is only meaningful in non-KMS mode */ + /* Don't restore them in KMS mode */ + i915_restore_modeset_reg(dev); + + /* CRT state */ + if (HAS_PCH_SPLIT(dev)) + I915_WRITE(PCH_ADPA, dev_priv->saveADPA); + else + I915_WRITE(ADPA, dev_priv->saveADPA); + + /* LVDS state */ + if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) + I915_WRITE(BLC_PWM_CTL2, dev_priv->saveBLC_PWM_CTL2); + + if (HAS_PCH_SPLIT(dev)) { + I915_WRITE(PCH_LVDS, dev_priv->saveLVDS); + } else if (IS_MOBILE(dev) && !IS_I830(dev)) + I915_WRITE(LVDS, dev_priv->saveLVDS); + + if (!IS_I830(dev) && !IS_845G(dev) && !HAS_PCH_SPLIT(dev)) + I915_WRITE(PFIT_CONTROL, dev_priv->savePFIT_CONTROL); + + if (HAS_PCH_SPLIT(dev)) { + I915_WRITE(BLC_PWM_PCH_CTL1, dev_priv->saveBLC_PWM_CTL); + I915_WRITE(BLC_PWM_PCH_CTL2, dev_priv->saveBLC_PWM_CTL2); + I915_WRITE(BLC_PWM_CPU_CTL, dev_priv->saveBLC_CPU_PWM_CTL); + I915_WRITE(BLC_PWM_CPU_CTL2, dev_priv->saveBLC_CPU_PWM_CTL2); + I915_WRITE(PCH_PP_ON_DELAYS, dev_priv->savePP_ON_DELAYS); + I915_WRITE(PCH_PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); + I915_WRITE(PCH_PP_DIVISOR, dev_priv->savePP_DIVISOR); + I915_WRITE(PCH_PP_CONTROL, dev_priv->savePP_CONTROL); + I915_WRITE(RSTDBYCTL, + dev_priv->saveMCHBAR_RENDER_STANDBY); + } else { + I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS); + I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); + I915_WRITE(BLC_HIST_CTL, dev_priv->saveBLC_HIST_CTL); + I915_WRITE(PP_ON_DELAYS, dev_priv->savePP_ON_DELAYS); + I915_WRITE(PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); + I915_WRITE(PP_DIVISOR, dev_priv->savePP_DIVISOR); + I915_WRITE(PP_CONTROL, dev_priv->savePP_CONTROL); + } + + /* Display Port state */ + if (SUPPORTS_INTEGRATED_DP(dev)) { + I915_WRITE(DP_B, dev_priv->saveDP_B); + I915_WRITE(DP_C, dev_priv->saveDP_C); + I915_WRITE(DP_D, dev_priv->saveDP_D); + } + /* FIXME: restore TV & SDVO state */ + + /* only restore FBC info on the platform that supports FBC*/ + intel_disable_fbc(dev); + if (I915_HAS_FBC(dev)) { + if (HAS_PCH_SPLIT(dev)) { + I915_WRITE(ILK_DPFC_CB_BASE, dev_priv->saveDPFC_CB_BASE); + } else if (IS_GM45(dev)) { + I915_WRITE(DPFC_CB_BASE, dev_priv->saveDPFC_CB_BASE); + } else { + I915_WRITE(FBC_CFB_BASE, dev_priv->saveFBC_CFB_BASE); + I915_WRITE(FBC_LL_BASE, dev_priv->saveFBC_LL_BASE); + I915_WRITE(FBC_CONTROL2, dev_priv->saveFBC_CONTROL2); + I915_WRITE(FBC_CONTROL, dev_priv->saveFBC_CONTROL); + } + } + /* VGA state */ + if (HAS_PCH_SPLIT(dev)) + I915_WRITE(CPU_VGACNTRL, dev_priv->saveVGACNTRL); + else + I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); + + I915_WRITE(VGA0, dev_priv->saveVGA0); + I915_WRITE(VGA1, dev_priv->saveVGA1); + I915_WRITE(VGA_PD, dev_priv->saveVGA_PD); + POSTING_READ(VGA_PD); + DRM_UDELAY(150); + + i915_restore_vga(dev); +} + +int i915_save_state(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int i; + + dev_priv->saveLBB = pci_read_config(dev->device, LBB, 1); + + /* Hardware status page */ + dev_priv->saveHWS = I915_READ(HWS_PGA); + + i915_save_display(dev); + + /* Interrupt state */ + if (HAS_PCH_SPLIT(dev)) { + dev_priv->saveDEIER = I915_READ(DEIER); + dev_priv->saveDEIMR = I915_READ(DEIMR); + dev_priv->saveGTIER = I915_READ(GTIER); + dev_priv->saveGTIMR = I915_READ(GTIMR); + dev_priv->saveFDI_RXA_IMR = I915_READ(_FDI_RXA_IMR); + dev_priv->saveFDI_RXB_IMR = I915_READ(_FDI_RXB_IMR); + dev_priv->saveMCHBAR_RENDER_STANDBY = + I915_READ(RSTDBYCTL); + dev_priv->savePCH_PORT_HOTPLUG = I915_READ(PCH_PORT_HOTPLUG); + } else { + dev_priv->saveIER = I915_READ(IER); + dev_priv->saveIMR = I915_READ(IMR); + } + + if (IS_IRONLAKE_M(dev)) + ironlake_disable_drps(dev); + if (INTEL_INFO(dev)->gen >= 6) + gen6_disable_rps(dev); + + /* Cache mode state */ + dev_priv->saveCACHE_MODE_0 = I915_READ(CACHE_MODE_0); + + /* Memory Arbitration state */ + dev_priv->saveMI_ARB_STATE = I915_READ(MI_ARB_STATE); + + /* Scratch space */ + for (i = 0; i < 16; i++) { + dev_priv->saveSWF0[i] = I915_READ(SWF00 + (i << 2)); + dev_priv->saveSWF1[i] = I915_READ(SWF10 + (i << 2)); + } + for (i = 0; i < 3; i++) + dev_priv->saveSWF2[i] = I915_READ(SWF30 + (i << 2)); + + return 0; +} + +int i915_restore_state(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int i; + + pci_write_config(dev->device, LBB, dev_priv->saveLBB, 1); + + + /* Hardware status page */ + I915_WRITE(HWS_PGA, dev_priv->saveHWS); + + i915_restore_display(dev); + + /* Interrupt state */ + if (HAS_PCH_SPLIT(dev)) { + I915_WRITE(DEIER, dev_priv->saveDEIER); + I915_WRITE(DEIMR, dev_priv->saveDEIMR); + I915_WRITE(GTIER, dev_priv->saveGTIER); + I915_WRITE(GTIMR, dev_priv->saveGTIMR); + I915_WRITE(_FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR); + I915_WRITE(_FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR); + I915_WRITE(PCH_PORT_HOTPLUG, dev_priv->savePCH_PORT_HOTPLUG); + } else { + I915_WRITE(IER, dev_priv->saveIER); + I915_WRITE(IMR, dev_priv->saveIMR); + } + DRM_UNLOCK(dev); + + if (drm_core_check_feature(dev, DRIVER_MODESET)) + intel_init_clock_gating(dev); + + if (IS_IRONLAKE_M(dev)) { + ironlake_enable_drps(dev); + intel_init_emon(dev); + } + + if (INTEL_INFO(dev)->gen >= 6) { + gen6_enable_rps(dev_priv); + gen6_update_ring_freq(dev_priv); + } + + DRM_LOCK(dev); + + /* Cache mode state */ + I915_WRITE(CACHE_MODE_0, dev_priv->saveCACHE_MODE_0 | 0xffff0000); + + /* Memory arbitration state */ + I915_WRITE(MI_ARB_STATE, dev_priv->saveMI_ARB_STATE | 0xffff0000); + + for (i = 0; i < 16; i++) { + I915_WRITE(SWF00 + (i << 2), dev_priv->saveSWF0[i]); + I915_WRITE(SWF10 + (i << 2), dev_priv->saveSWF1[i]); + } + for (i = 0; i < 3; i++) + I915_WRITE(SWF30 + (i << 2), dev_priv->saveSWF2[i]); + + intel_iic_reset(dev); + + return 0; +} diff --git a/sys/dev/drm2/i915/intel_bios.c b/sys/dev/drm2/i915/intel_bios.c new file mode 100644 index 00000000000..8bf38a5722c --- /dev/null +++ b/sys/dev/drm2/i915/intel_bios.c @@ -0,0 +1,737 @@ +/* + * Copyright © 2006 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Eric Anholt + * + * $FreeBSD$ + */ +#include +#include +#include +#include +#include +#include + +#define SLAVE_ADDR1 0x70 +#define SLAVE_ADDR2 0x72 + +static int panel_type; + +static void * +find_section(struct bdb_header *bdb, int section_id) +{ + u8 *base = (u8 *)bdb; + int index = 0; + u16 total, current_size; + u8 current_id; + + /* skip to first section */ + index += bdb->header_size; + total = bdb->bdb_size; + + /* walk the sections looking for section_id */ + while (index < total) { + current_id = *(base + index); + index++; + current_size = *((u16 *)(base + index)); + index += 2; + if (current_id == section_id) + return base + index; + index += current_size; + } + + return NULL; +} + +static u16 +get_blocksize(void *p) +{ + u16 *block_ptr, block_size; + + block_ptr = (u16 *)((char *)p - 2); + block_size = *block_ptr; + return block_size; +} + +static void +fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode, + const struct lvds_dvo_timing *dvo_timing) +{ + panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) | + dvo_timing->hactive_lo; + panel_fixed_mode->hsync_start = panel_fixed_mode->hdisplay + + ((dvo_timing->hsync_off_hi << 8) | dvo_timing->hsync_off_lo); + panel_fixed_mode->hsync_end = panel_fixed_mode->hsync_start + + dvo_timing->hsync_pulse_width; + panel_fixed_mode->htotal = panel_fixed_mode->hdisplay + + ((dvo_timing->hblank_hi << 8) | dvo_timing->hblank_lo); + + panel_fixed_mode->vdisplay = (dvo_timing->vactive_hi << 8) | + dvo_timing->vactive_lo; + panel_fixed_mode->vsync_start = panel_fixed_mode->vdisplay + + dvo_timing->vsync_off; + panel_fixed_mode->vsync_end = panel_fixed_mode->vsync_start + + dvo_timing->vsync_pulse_width; + panel_fixed_mode->vtotal = panel_fixed_mode->vdisplay + + ((dvo_timing->vblank_hi << 8) | dvo_timing->vblank_lo); + panel_fixed_mode->clock = dvo_timing->clock * 10; + panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED; + + if (dvo_timing->hsync_positive) + panel_fixed_mode->flags |= DRM_MODE_FLAG_PHSYNC; + else + panel_fixed_mode->flags |= DRM_MODE_FLAG_NHSYNC; + + if (dvo_timing->vsync_positive) + panel_fixed_mode->flags |= DRM_MODE_FLAG_PVSYNC; + else + panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC; + + /* Some VBTs have bogus h/vtotal values */ + if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal) + panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1; + if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal) + panel_fixed_mode->vtotal = panel_fixed_mode->vsync_end + 1; + + drm_mode_set_name(panel_fixed_mode); +} + +static bool +lvds_dvo_timing_equal_size(const struct lvds_dvo_timing *a, + const struct lvds_dvo_timing *b) +{ + if (a->hactive_hi != b->hactive_hi || + a->hactive_lo != b->hactive_lo) + return false; + + if (a->hsync_off_hi != b->hsync_off_hi || + a->hsync_off_lo != b->hsync_off_lo) + return false; + + if (a->hsync_pulse_width != b->hsync_pulse_width) + return false; + + if (a->hblank_hi != b->hblank_hi || + a->hblank_lo != b->hblank_lo) + return false; + + if (a->vactive_hi != b->vactive_hi || + a->vactive_lo != b->vactive_lo) + return false; + + if (a->vsync_off != b->vsync_off) + return false; + + if (a->vsync_pulse_width != b->vsync_pulse_width) + return false; + + if (a->vblank_hi != b->vblank_hi || + a->vblank_lo != b->vblank_lo) + return false; + + return true; +} + +static const struct lvds_dvo_timing * +get_lvds_dvo_timing(const struct bdb_lvds_lfp_data *lvds_lfp_data, + const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs, + int index) +{ + /* + * the size of fp_timing varies on the different platform. + * So calculate the DVO timing relative offset in LVDS data + * entry to get the DVO timing entry + */ + + int lfp_data_size = + lvds_lfp_data_ptrs->ptr[1].dvo_timing_offset - + lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset; + int dvo_timing_offset = + lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset - + lvds_lfp_data_ptrs->ptr[0].fp_timing_offset; + const char *entry = (const char *)lvds_lfp_data->data + + lfp_data_size * index; + + return (const struct lvds_dvo_timing *)(entry + dvo_timing_offset); +} + +/* Try to find integrated panel data */ +static void +parse_lfp_panel_data(struct drm_i915_private *dev_priv, + struct bdb_header *bdb) +{ + const struct bdb_lvds_options *lvds_options; + const struct bdb_lvds_lfp_data *lvds_lfp_data; + const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs; + const struct lvds_dvo_timing *panel_dvo_timing; + struct drm_display_mode *panel_fixed_mode; + int i, downclock; + + lvds_options = find_section(bdb, BDB_LVDS_OPTIONS); + if (!lvds_options) + return; + + dev_priv->lvds_dither = lvds_options->pixel_dither; + if (lvds_options->panel_type == 0xff) + return; + + panel_type = lvds_options->panel_type; + + lvds_lfp_data = find_section(bdb, BDB_LVDS_LFP_DATA); + if (!lvds_lfp_data) + return; + + lvds_lfp_data_ptrs = find_section(bdb, BDB_LVDS_LFP_DATA_PTRS); + if (!lvds_lfp_data_ptrs) + return; + + dev_priv->lvds_vbt = 1; + + panel_dvo_timing = get_lvds_dvo_timing(lvds_lfp_data, + lvds_lfp_data_ptrs, + lvds_options->panel_type); + + panel_fixed_mode = malloc(sizeof(*panel_fixed_mode), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + fill_detail_timing_data(panel_fixed_mode, panel_dvo_timing); + + dev_priv->lfp_lvds_vbt_mode = panel_fixed_mode; + + DRM_DEBUG_KMS("Found panel mode in BIOS VBT tables:\n"); + drm_mode_debug_printmodeline(panel_fixed_mode); + + /* + * Iterate over the LVDS panel timing info to find the lowest clock + * for the native resolution. + */ + downclock = panel_dvo_timing->clock; + for (i = 0; i < 16; i++) { + const struct lvds_dvo_timing *dvo_timing; + + dvo_timing = get_lvds_dvo_timing(lvds_lfp_data, + lvds_lfp_data_ptrs, + i); + if (lvds_dvo_timing_equal_size(dvo_timing, panel_dvo_timing) && + dvo_timing->clock < downclock) + downclock = dvo_timing->clock; + } + + if (downclock < panel_dvo_timing->clock && i915_lvds_downclock) { + dev_priv->lvds_downclock_avail = 1; + dev_priv->lvds_downclock = downclock * 10; + DRM_DEBUG("LVDS downclock is found in VBT. " + "Normal Clock %dKHz, downclock %dKHz\n", + panel_fixed_mode->clock, 10 * downclock); + } +} + +/* Try to find sdvo panel data */ +static void +parse_sdvo_panel_data(struct drm_i915_private *dev_priv, + struct bdb_header *bdb) +{ + struct lvds_dvo_timing *dvo_timing; + struct drm_display_mode *panel_fixed_mode; + int index; + + index = i915_vbt_sdvo_panel_type; + if (index == -1) { + struct bdb_sdvo_lvds_options *sdvo_lvds_options; + + sdvo_lvds_options = find_section(bdb, BDB_SDVO_LVDS_OPTIONS); + if (!sdvo_lvds_options) + return; + + index = sdvo_lvds_options->panel_type; + } + + dvo_timing = find_section(bdb, BDB_SDVO_PANEL_DTDS); + if (!dvo_timing) + return; + + panel_fixed_mode = malloc(sizeof(*panel_fixed_mode), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + fill_detail_timing_data(panel_fixed_mode, dvo_timing + index); + + dev_priv->sdvo_lvds_vbt_mode = panel_fixed_mode; + + DRM_DEBUG_KMS("Found SDVO panel mode in BIOS VBT tables:\n"); + drm_mode_debug_printmodeline(panel_fixed_mode); +} + +static int intel_bios_ssc_frequency(struct drm_device *dev, + bool alternate) +{ + switch (INTEL_INFO(dev)->gen) { + case 2: + return alternate ? 66 : 48; + case 3: + case 4: + return alternate ? 100 : 96; + default: + return alternate ? 100 : 120; + } +} + +static void +parse_general_features(struct drm_i915_private *dev_priv, + struct bdb_header *bdb) +{ + struct drm_device *dev = dev_priv->dev; + struct bdb_general_features *general; + + general = find_section(bdb, BDB_GENERAL_FEATURES); + if (general) { + dev_priv->int_tv_support = general->int_tv_support; + dev_priv->int_crt_support = general->int_crt_support; + dev_priv->lvds_use_ssc = general->enable_ssc; + dev_priv->lvds_ssc_freq = + intel_bios_ssc_frequency(dev, general->ssc_freq); + dev_priv->display_clock_mode = general->display_clock_mode; + DRM_DEBUG_KMS("BDB_GENERAL_FEATURES int_tv_support %d int_crt_support %d lvds_use_ssc %d lvds_ssc_freq %d display_clock_mode %d\n", + dev_priv->int_tv_support, + dev_priv->int_crt_support, + dev_priv->lvds_use_ssc, + dev_priv->lvds_ssc_freq, + dev_priv->display_clock_mode); + } +} + +static void +parse_general_definitions(struct drm_i915_private *dev_priv, + struct bdb_header *bdb) +{ + struct bdb_general_definitions *general; + + general = find_section(bdb, BDB_GENERAL_DEFINITIONS); + if (general) { + u16 block_size = get_blocksize(general); + if (block_size >= sizeof(*general)) { + int bus_pin = general->crt_ddc_gmbus_pin; + DRM_DEBUG_KMS("crt_ddc_bus_pin: %d\n", bus_pin); + if (bus_pin >= 1 && bus_pin <= 6) + dev_priv->crt_ddc_pin = bus_pin; + } else { + DRM_DEBUG_KMS("BDB_GD too small (%d). Invalid.\n", + block_size); + } + } +} + +static void +parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, + struct bdb_header *bdb) +{ + struct sdvo_device_mapping *p_mapping; + struct bdb_general_definitions *p_defs; + struct child_device_config *p_child; + int i, child_device_num, count; + u16 block_size; + + p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); + if (!p_defs) { + DRM_DEBUG_KMS("No general definition block is found, unable to construct sdvo mapping.\n"); + return; + } + /* judge whether the size of child device meets the requirements. + * If the child device size obtained from general definition block + * is different with sizeof(struct child_device_config), skip the + * parsing of sdvo device info + */ + if (p_defs->child_dev_size != sizeof(*p_child)) { + /* different child dev size . Ignore it */ + DRM_DEBUG_KMS("different child size is found. Invalid.\n"); + return; + } + /* get the block size of general definitions */ + block_size = get_blocksize(p_defs); + /* get the number of child device */ + child_device_num = (block_size - sizeof(*p_defs)) / + sizeof(*p_child); + count = 0; + for (i = 0; i < child_device_num; i++) { + p_child = &(p_defs->devices[i]); + if (!p_child->device_type) { + /* skip the device block if device type is invalid */ + continue; + } + if (p_child->slave_addr != SLAVE_ADDR1 && + p_child->slave_addr != SLAVE_ADDR2) { + /* + * If the slave address is neither 0x70 nor 0x72, + * it is not a SDVO device. Skip it. + */ + continue; + } + if (p_child->dvo_port != DEVICE_PORT_DVOB && + p_child->dvo_port != DEVICE_PORT_DVOC) { + /* skip the incorrect SDVO port */ + DRM_DEBUG_KMS("Incorrect SDVO port. Skip it\n"); + continue; + } + DRM_DEBUG_KMS("the SDVO device with slave addr %2x is found on" + " %s port\n", + p_child->slave_addr, + (p_child->dvo_port == DEVICE_PORT_DVOB) ? + "SDVOB" : "SDVOC"); + p_mapping = &(dev_priv->sdvo_mappings[p_child->dvo_port - 1]); + if (!p_mapping->initialized) { + p_mapping->dvo_port = p_child->dvo_port; + p_mapping->slave_addr = p_child->slave_addr; + p_mapping->dvo_wiring = p_child->dvo_wiring; + p_mapping->ddc_pin = p_child->ddc_pin; + p_mapping->i2c_pin = p_child->i2c_pin; + p_mapping->initialized = 1; + DRM_DEBUG_KMS("SDVO device: dvo=%x, addr=%x, wiring=%d, ddc_pin=%d, i2c_pin=%d\n", + p_mapping->dvo_port, + p_mapping->slave_addr, + p_mapping->dvo_wiring, + p_mapping->ddc_pin, + p_mapping->i2c_pin); + } else { + DRM_DEBUG_KMS("Maybe one SDVO port is shared by " + "two SDVO device.\n"); + } + if (p_child->slave2_addr) { + /* Maybe this is a SDVO device with multiple inputs */ + /* And the mapping info is not added */ + DRM_DEBUG_KMS("there exists the slave2_addr. Maybe this" + " is a SDVO device with multiple inputs.\n"); + } + count++; + } + + if (!count) { + /* No SDVO device info is found */ + DRM_DEBUG_KMS("No SDVO device info is found in VBT\n"); + } + return; +} + +static void +parse_driver_features(struct drm_i915_private *dev_priv, + struct bdb_header *bdb) +{ + struct drm_device *dev = dev_priv->dev; + struct bdb_driver_features *driver; + + driver = find_section(bdb, BDB_DRIVER_FEATURES); + if (!driver) + return; + + if (SUPPORTS_EDP(dev) && + driver->lvds_config == BDB_DRIVER_FEATURE_EDP) + dev_priv->edp.support = 1; + + if (driver->dual_frequency) + dev_priv->render_reclock_avail = true; +} + +static void +parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb) +{ + struct bdb_edp *edp; + struct edp_power_seq *edp_pps; + struct edp_link_params *edp_link_params; + + edp = find_section(bdb, BDB_EDP); + if (!edp) { + if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp.support) { + DRM_DEBUG_KMS("No eDP BDB found but eDP panel " + "supported, assume %dbpp panel color " + "depth.\n", + dev_priv->edp.bpp); + } + return; + } + + switch ((edp->color_depth >> (panel_type * 2)) & 3) { + case EDP_18BPP: + dev_priv->edp.bpp = 18; + break; + case EDP_24BPP: + dev_priv->edp.bpp = 24; + break; + case EDP_30BPP: + dev_priv->edp.bpp = 30; + break; + } + + /* Get the eDP sequencing and link info */ + edp_pps = &edp->power_seqs[panel_type]; + edp_link_params = &edp->link_params[panel_type]; + + dev_priv->edp.pps = *edp_pps; + + dev_priv->edp.rate = edp_link_params->rate ? DP_LINK_BW_2_7 : + DP_LINK_BW_1_62; + switch (edp_link_params->lanes) { + case 0: + dev_priv->edp.lanes = 1; + break; + case 1: + dev_priv->edp.lanes = 2; + break; + case 3: + default: + dev_priv->edp.lanes = 4; + break; + } + switch (edp_link_params->preemphasis) { + case 0: + dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_0; + break; + case 1: + dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_3_5; + break; + case 2: + dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_6; + break; + case 3: + dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_9_5; + break; + } + switch (edp_link_params->vswing) { + case 0: + dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_400; + break; + case 1: + dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_600; + break; + case 2: + dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_800; + break; + case 3: + dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_1200; + break; + } +} + +static void +parse_device_mapping(struct drm_i915_private *dev_priv, + struct bdb_header *bdb) +{ + struct bdb_general_definitions *p_defs; + struct child_device_config *p_child, *child_dev_ptr; + int i, child_device_num, count; + u16 block_size; + + p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); + if (!p_defs) { + DRM_DEBUG_KMS("No general definition block is found, no devices defined.\n"); + return; + } + /* judge whether the size of child device meets the requirements. + * If the child device size obtained from general definition block + * is different with sizeof(struct child_device_config), skip the + * parsing of sdvo device info + */ + if (p_defs->child_dev_size != sizeof(*p_child)) { + /* different child dev size . Ignore it */ + DRM_DEBUG_KMS("different child size is found. Invalid.\n"); + return; + } + /* get the block size of general definitions */ + block_size = get_blocksize(p_defs); + /* get the number of child device */ + child_device_num = (block_size - sizeof(*p_defs)) / + sizeof(*p_child); + count = 0; + /* get the number of child device that is present */ + for (i = 0; i < child_device_num; i++) { + p_child = &(p_defs->devices[i]); + if (!p_child->device_type) { + /* skip the device block if device type is invalid */ + continue; + } + count++; + } + if (!count) { + DRM_DEBUG_KMS("no child dev is parsed from VBT\n"); + return; + } + dev_priv->child_dev = malloc(sizeof(*p_child) * count, DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + dev_priv->child_dev_num = count; + count = 0; + for (i = 0; i < child_device_num; i++) { + p_child = &(p_defs->devices[i]); + if (!p_child->device_type) { + /* skip the device block if device type is invalid */ + continue; + } + child_dev_ptr = dev_priv->child_dev + count; + count++; + memcpy((void *)child_dev_ptr, (void *)p_child, + sizeof(*p_child)); + } + return; +} + +static void +init_vbt_defaults(struct drm_i915_private *dev_priv) +{ + struct drm_device *dev = dev_priv->dev; + + dev_priv->crt_ddc_pin = GMBUS_PORT_VGADDC; + + /* LFP panel data */ + dev_priv->lvds_dither = 1; + dev_priv->lvds_vbt = 0; + + /* SDVO panel data */ + dev_priv->sdvo_lvds_vbt_mode = NULL; + + /* general features */ + dev_priv->int_tv_support = 1; + dev_priv->int_crt_support = 1; + + /* Default to using SSC */ + dev_priv->lvds_use_ssc = 1; + dev_priv->lvds_ssc_freq = intel_bios_ssc_frequency(dev, 1); + DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq); + + /* eDP data */ + dev_priv->edp.bpp = 18; +} + +static int intel_no_opregion_vbt_callback(const struct dmi_system_id *id) +{ + DRM_DEBUG_KMS("Falling back to manually reading VBT from " + "VBIOS ROM for %s\n", + id->ident); + return 1; +} + +static const struct dmi_system_id intel_no_opregion_vbt[] = { + { + .callback = intel_no_opregion_vbt_callback, + .ident = "ThinkCentre A57", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "97027RG"), + }, + }, + { } +}; + +/** + * intel_parse_bios - find VBT and initialize settings from the BIOS + * @dev: DRM device + * + * Loads the Video BIOS and checks that the VBT exists. Sets scratch registers + * to appropriate values. + * + * Returns 0 on success, nonzero on failure. + */ +bool +intel_parse_bios(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct bdb_header *bdb = NULL; + u8 *bios; + + init_vbt_defaults(dev_priv); + + /* XXX Should this validation be moved to intel_opregion.c? */ + if (!dmi_check_system(intel_no_opregion_vbt) && dev_priv->opregion.vbt) { + struct vbt_header *vbt = dev_priv->opregion.vbt; + if (memcmp(vbt->signature, "$VBT", 4) == 0) { + DRM_DEBUG_KMS("Using VBT from OpRegion: %20s\n", + vbt->signature); + bdb = (struct bdb_header *)((char *)vbt + vbt->bdb_offset); + } else + dev_priv->opregion.vbt = NULL; + } + bios = NULL; + +#if 1 + if (bdb == NULL) { + KIB_NOTYET(); + return (-1); + } +#else + if (bdb == NULL) { + struct vbt_header *vbt = NULL; + size_t size; + int i; + + bios = pci_map_rom(pdev, &size); + if (!bios) + return -1; + + /* Scour memory looking for the VBT signature */ + for (i = 0; i + 4 < size; i++) { + if (!memcmp(bios + i, "$VBT", 4)) { + vbt = (struct vbt_header *)(bios + i); + break; + } + } + + if (!vbt) { + DRM_DEBUG_DRIVER("VBT signature missing\n"); + pci_unmap_rom(pdev, bios); + return -1; + } + + bdb = (struct bdb_header *)(bios + i + vbt->bdb_offset); + } +#endif + + /* Grab useful general definitions */ + parse_general_features(dev_priv, bdb); + parse_general_definitions(dev_priv, bdb); + parse_lfp_panel_data(dev_priv, bdb); + parse_sdvo_panel_data(dev_priv, bdb); + parse_sdvo_device_mapping(dev_priv, bdb); + parse_device_mapping(dev_priv, bdb); + parse_driver_features(dev_priv, bdb); + parse_edp(dev_priv, bdb); + +#if 0 + if (bios) + pci_unmap_rom(pdev, bios); +#endif + + return 0; +} + +/* Ensure that vital registers have been initialised, even if the BIOS + * is absent or just failing to do its job. + */ +void intel_setup_bios(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + /* Set the Panel Power On/Off timings if uninitialized. */ + if ((I915_READ(PP_ON_DELAYS) == 0) && (I915_READ(PP_OFF_DELAYS) == 0)) { + /* Set T2 to 40ms and T5 to 200ms */ + I915_WRITE(PP_ON_DELAYS, 0x019007d0); + + /* Set T3 to 35ms and Tx to 200ms */ + I915_WRITE(PP_OFF_DELAYS, 0x015e07d0); + } +} diff --git a/sys/dev/drm2/i915/intel_bios.h b/sys/dev/drm2/i915/intel_bios.h new file mode 100644 index 00000000000..186409c5e83 --- /dev/null +++ b/sys/dev/drm2/i915/intel_bios.h @@ -0,0 +1,620 @@ +/* + * Copyright © 2006 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Eric Anholt + * + * $FreeBSD$ + */ + +#ifndef _I830_BIOS_H_ +#define _I830_BIOS_H_ + +#include + +struct vbt_header { + u8 signature[20]; /**< Always starts with 'VBT$' */ + u16 version; /**< decimal */ + u16 header_size; /**< in bytes */ + u16 vbt_size; /**< in bytes */ + u8 vbt_checksum; + u8 reserved0; + u32 bdb_offset; /**< from beginning of VBT */ + u32 aim_offset[4]; /**< from beginning of VBT */ +} __attribute__((packed)); + +struct bdb_header { + u8 signature[16]; /**< Always 'BIOS_DATA_BLOCK' */ + u16 version; /**< decimal */ + u16 header_size; /**< in bytes */ + u16 bdb_size; /**< in bytes */ +}; + +/* strictly speaking, this is a "skip" block, but it has interesting info */ +struct vbios_data { + u8 type; /* 0 == desktop, 1 == mobile */ + u8 relstage; + u8 chipset; + u8 lvds_present:1; + u8 tv_present:1; + u8 rsvd2:6; /* finish byte */ + u8 rsvd3[4]; + u8 signon[155]; + u8 copyright[61]; + u16 code_segment; + u8 dos_boot_mode; + u8 bandwidth_percent; + u8 rsvd4; /* popup memory size */ + u8 resize_pci_bios; + u8 rsvd5; /* is crt already on ddc2 */ +} __attribute__((packed)); + +/* + * There are several types of BIOS data blocks (BDBs), each block has + * an ID and size in the first 3 bytes (ID in first, size in next 2). + * Known types are listed below. + */ +#define BDB_GENERAL_FEATURES 1 +#define BDB_GENERAL_DEFINITIONS 2 +#define BDB_OLD_TOGGLE_LIST 3 +#define BDB_MODE_SUPPORT_LIST 4 +#define BDB_GENERIC_MODE_TABLE 5 +#define BDB_EXT_MMIO_REGS 6 +#define BDB_SWF_IO 7 +#define BDB_SWF_MMIO 8 +#define BDB_DOT_CLOCK_TABLE 9 +#define BDB_MODE_REMOVAL_TABLE 10 +#define BDB_CHILD_DEVICE_TABLE 11 +#define BDB_DRIVER_FEATURES 12 +#define BDB_DRIVER_PERSISTENCE 13 +#define BDB_EXT_TABLE_PTRS 14 +#define BDB_DOT_CLOCK_OVERRIDE 15 +#define BDB_DISPLAY_SELECT 16 +/* 17 rsvd */ +#define BDB_DRIVER_ROTATION 18 +#define BDB_DISPLAY_REMOVE 19 +#define BDB_OEM_CUSTOM 20 +#define BDB_EFP_LIST 21 /* workarounds for VGA hsync/vsync */ +#define BDB_SDVO_LVDS_OPTIONS 22 +#define BDB_SDVO_PANEL_DTDS 23 +#define BDB_SDVO_LVDS_PNP_IDS 24 +#define BDB_SDVO_LVDS_POWER_SEQ 25 +#define BDB_TV_OPTIONS 26 +#define BDB_EDP 27 +#define BDB_LVDS_OPTIONS 40 +#define BDB_LVDS_LFP_DATA_PTRS 41 +#define BDB_LVDS_LFP_DATA 42 +#define BDB_LVDS_BACKLIGHT 43 +#define BDB_LVDS_POWER 44 +#define BDB_SKIP 254 /* VBIOS private block, ignore */ + +struct bdb_general_features { + /* bits 1 */ + u8 panel_fitting:2; + u8 flexaim:1; + u8 msg_enable:1; + u8 clear_screen:3; + u8 color_flip:1; + + /* bits 2 */ + u8 download_ext_vbt:1; + u8 enable_ssc:1; + u8 ssc_freq:1; + u8 enable_lfp_on_override:1; + u8 disable_ssc_ddt:1; + u8 rsvd7:1; + u8 display_clock_mode:1; + u8 rsvd8:1; /* finish byte */ + + /* bits 3 */ + u8 disable_smooth_vision:1; + u8 single_dvi:1; + u8 rsvd9:6; /* finish byte */ + + /* bits 4 */ + u8 legacy_monitor_detect; + + /* bits 5 */ + u8 int_crt_support:1; + u8 int_tv_support:1; + u8 int_efp_support:1; + u8 dp_ssc_enb:1; /* PCH attached eDP supports SSC */ + u8 dp_ssc_freq:1; /* SSC freq for PCH attached eDP */ + u8 rsvd11:3; /* finish byte */ +} __attribute__((packed)); + +/* pre-915 */ +#define GPIO_PIN_DVI_LVDS 0x03 /* "DVI/LVDS DDC GPIO pins" */ +#define GPIO_PIN_ADD_I2C 0x05 /* "ADDCARD I2C GPIO pins" */ +#define GPIO_PIN_ADD_DDC 0x04 /* "ADDCARD DDC GPIO pins" */ +#define GPIO_PIN_ADD_DDC_I2C 0x06 /* "ADDCARD DDC/I2C GPIO pins" */ + +/* Pre 915 */ +#define DEVICE_TYPE_NONE 0x00 +#define DEVICE_TYPE_CRT 0x01 +#define DEVICE_TYPE_TV 0x09 +#define DEVICE_TYPE_EFP 0x12 +#define DEVICE_TYPE_LFP 0x22 +/* On 915+ */ +#define DEVICE_TYPE_CRT_DPMS 0x6001 +#define DEVICE_TYPE_CRT_DPMS_HOTPLUG 0x4001 +#define DEVICE_TYPE_TV_COMPOSITE 0x0209 +#define DEVICE_TYPE_TV_MACROVISION 0x0289 +#define DEVICE_TYPE_TV_RF_COMPOSITE 0x020c +#define DEVICE_TYPE_TV_SVIDEO_COMPOSITE 0x0609 +#define DEVICE_TYPE_TV_SCART 0x0209 +#define DEVICE_TYPE_TV_CODEC_HOTPLUG_PWR 0x6009 +#define DEVICE_TYPE_EFP_HOTPLUG_PWR 0x6012 +#define DEVICE_TYPE_EFP_DVI_HOTPLUG_PWR 0x6052 +#define DEVICE_TYPE_EFP_DVI_I 0x6053 +#define DEVICE_TYPE_EFP_DVI_D_DUAL 0x6152 +#define DEVICE_TYPE_EFP_DVI_D_HDCP 0x60d2 +#define DEVICE_TYPE_OPENLDI_HOTPLUG_PWR 0x6062 +#define DEVICE_TYPE_OPENLDI_DUALPIX 0x6162 +#define DEVICE_TYPE_LFP_PANELLINK 0x5012 +#define DEVICE_TYPE_LFP_CMOS_PWR 0x5042 +#define DEVICE_TYPE_LFP_LVDS_PWR 0x5062 +#define DEVICE_TYPE_LFP_LVDS_DUAL 0x5162 +#define DEVICE_TYPE_LFP_LVDS_DUAL_HDCP 0x51e2 + +#define DEVICE_CFG_NONE 0x00 +#define DEVICE_CFG_12BIT_DVOB 0x01 +#define DEVICE_CFG_12BIT_DVOC 0x02 +#define DEVICE_CFG_24BIT_DVOBC 0x09 +#define DEVICE_CFG_24BIT_DVOCB 0x0a +#define DEVICE_CFG_DUAL_DVOB 0x11 +#define DEVICE_CFG_DUAL_DVOC 0x12 +#define DEVICE_CFG_DUAL_DVOBC 0x13 +#define DEVICE_CFG_DUAL_LINK_DVOBC 0x19 +#define DEVICE_CFG_DUAL_LINK_DVOCB 0x1a + +#define DEVICE_WIRE_NONE 0x00 +#define DEVICE_WIRE_DVOB 0x01 +#define DEVICE_WIRE_DVOC 0x02 +#define DEVICE_WIRE_DVOBC 0x03 +#define DEVICE_WIRE_DVOBB 0x05 +#define DEVICE_WIRE_DVOCC 0x06 +#define DEVICE_WIRE_DVOB_MASTER 0x0d +#define DEVICE_WIRE_DVOC_MASTER 0x0e + +#define DEVICE_PORT_DVOA 0x00 /* none on 845+ */ +#define DEVICE_PORT_DVOB 0x01 +#define DEVICE_PORT_DVOC 0x02 + +struct child_device_config { + u16 handle; + u16 device_type; + u8 device_id[10]; /* ascii string */ + u16 addin_offset; + u8 dvo_port; /* See Device_PORT_* above */ + u8 i2c_pin; + u8 slave_addr; + u8 ddc_pin; + u16 edid_ptr; + u8 dvo_cfg; /* See DEVICE_CFG_* above */ + u8 dvo2_port; + u8 i2c2_pin; + u8 slave2_addr; + u8 ddc2_pin; + u8 capabilities; + u8 dvo_wiring;/* See DEVICE_WIRE_* above */ + u8 dvo2_wiring; + u16 extended_type; + u8 dvo_function; +} __attribute__((packed)); + +struct bdb_general_definitions { + /* DDC GPIO */ + u8 crt_ddc_gmbus_pin; + + /* DPMS bits */ + u8 dpms_acpi:1; + u8 skip_boot_crt_detect:1; + u8 dpms_aim:1; + u8 rsvd1:5; /* finish byte */ + + /* boot device bits */ + u8 boot_display[2]; + u8 child_dev_size; + + /* + * Device info: + * If TV is present, it'll be at devices[0]. + * LVDS will be next, either devices[0] or [1], if present. + * On some platforms the number of device is 6. But could be as few as + * 4 if both TV and LVDS are missing. + * And the device num is related with the size of general definition + * block. It is obtained by using the following formula: + * number = (block_size - sizeof(bdb_general_definitions))/ + * sizeof(child_device_config); + */ + struct child_device_config devices[0]; +} __attribute__((packed)); + +struct bdb_lvds_options { + u8 panel_type; + u8 rsvd1; + /* LVDS capabilities, stored in a dword */ + u8 pfit_mode:2; + u8 pfit_text_mode_enhanced:1; + u8 pfit_gfx_mode_enhanced:1; + u8 pfit_ratio_auto:1; + u8 pixel_dither:1; + u8 lvds_edid:1; + u8 rsvd2:1; + u8 rsvd4; +} __attribute__((packed)); + +/* LFP pointer table contains entries to the struct below */ +struct bdb_lvds_lfp_data_ptr { + u16 fp_timing_offset; /* offsets are from start of bdb */ + u8 fp_table_size; + u16 dvo_timing_offset; + u8 dvo_table_size; + u16 panel_pnp_id_offset; + u8 pnp_table_size; +} __attribute__((packed)); + +struct bdb_lvds_lfp_data_ptrs { + u8 lvds_entries; /* followed by one or more lvds_data_ptr structs */ + struct bdb_lvds_lfp_data_ptr ptr[16]; +} __attribute__((packed)); + +/* LFP data has 3 blocks per entry */ +struct lvds_fp_timing { + u16 x_res; + u16 y_res; + u32 lvds_reg; + u32 lvds_reg_val; + u32 pp_on_reg; + u32 pp_on_reg_val; + u32 pp_off_reg; + u32 pp_off_reg_val; + u32 pp_cycle_reg; + u32 pp_cycle_reg_val; + u32 pfit_reg; + u32 pfit_reg_val; + u16 terminator; +} __attribute__((packed)); + +struct lvds_dvo_timing { + u16 clock; /**< In 10khz */ + u8 hactive_lo; + u8 hblank_lo; + u8 hblank_hi:4; + u8 hactive_hi:4; + u8 vactive_lo; + u8 vblank_lo; + u8 vblank_hi:4; + u8 vactive_hi:4; + u8 hsync_off_lo; + u8 hsync_pulse_width; + u8 vsync_pulse_width:4; + u8 vsync_off:4; + u8 rsvd0:6; + u8 hsync_off_hi:2; + u8 h_image; + u8 v_image; + u8 max_hv; + u8 h_border; + u8 v_border; + u8 rsvd1:3; + u8 digital:2; + u8 vsync_positive:1; + u8 hsync_positive:1; + u8 rsvd2:1; +} __attribute__((packed)); + +struct lvds_pnp_id { + u16 mfg_name; + u16 product_code; + u32 serial; + u8 mfg_week; + u8 mfg_year; +} __attribute__((packed)); + +struct bdb_lvds_lfp_data_entry { + struct lvds_fp_timing fp_timing; + struct lvds_dvo_timing dvo_timing; + struct lvds_pnp_id pnp_id; +} __attribute__((packed)); + +struct bdb_lvds_lfp_data { + struct bdb_lvds_lfp_data_entry data[16]; +} __attribute__((packed)); + +struct aimdb_header { + char signature[16]; + char oem_device[20]; + u16 aimdb_version; + u16 aimdb_header_size; + u16 aimdb_size; +} __attribute__((packed)); + +struct aimdb_block { + u8 aimdb_id; + u16 aimdb_size; +} __attribute__((packed)); + +struct vch_panel_data { + u16 fp_timing_offset; + u8 fp_timing_size; + u16 dvo_timing_offset; + u8 dvo_timing_size; + u16 text_fitting_offset; + u8 text_fitting_size; + u16 graphics_fitting_offset; + u8 graphics_fitting_size; +} __attribute__((packed)); + +struct vch_bdb_22 { + struct aimdb_block aimdb_block; + struct vch_panel_data panels[16]; +} __attribute__((packed)); + +struct bdb_sdvo_lvds_options { + u8 panel_backlight; + u8 h40_set_panel_type; + u8 panel_type; + u8 ssc_clk_freq; + u16 als_low_trip; + u16 als_high_trip; + u8 sclalarcoeff_tab_row_num; + u8 sclalarcoeff_tab_row_size; + u8 coefficient[8]; + u8 panel_misc_bits_1; + u8 panel_misc_bits_2; + u8 panel_misc_bits_3; + u8 panel_misc_bits_4; +} __attribute__((packed)); + + +#define BDB_DRIVER_FEATURE_NO_LVDS 0 +#define BDB_DRIVER_FEATURE_INT_LVDS 1 +#define BDB_DRIVER_FEATURE_SDVO_LVDS 2 +#define BDB_DRIVER_FEATURE_EDP 3 + +struct bdb_driver_features { + u8 boot_dev_algorithm:1; + u8 block_display_switch:1; + u8 allow_display_switch:1; + u8 hotplug_dvo:1; + u8 dual_view_zoom:1; + u8 int15h_hook:1; + u8 sprite_in_clone:1; + u8 primary_lfp_id:1; + + u16 boot_mode_x; + u16 boot_mode_y; + u8 boot_mode_bpp; + u8 boot_mode_refresh; + + u16 enable_lfp_primary:1; + u16 selective_mode_pruning:1; + u16 dual_frequency:1; + u16 render_clock_freq:1; /* 0: high freq; 1: low freq */ + u16 nt_clone_support:1; + u16 power_scheme_ui:1; /* 0: CUI; 1: 3rd party */ + u16 sprite_display_assign:1; /* 0: secondary; 1: primary */ + u16 cui_aspect_scaling:1; + u16 preserve_aspect_ratio:1; + u16 sdvo_device_power_down:1; + u16 crt_hotplug:1; + u16 lvds_config:2; + u16 tv_hotplug:1; + u16 hdmi_config:2; + + u8 static_display:1; + u8 reserved2:7; + u16 legacy_crt_max_x; + u16 legacy_crt_max_y; + u8 legacy_crt_max_refresh; + + u8 hdmi_termination; + u8 custom_vbt_version; +} __attribute__((packed)); + +#define EDP_18BPP 0 +#define EDP_24BPP 1 +#define EDP_30BPP 2 +#define EDP_RATE_1_62 0 +#define EDP_RATE_2_7 1 +#define EDP_LANE_1 0 +#define EDP_LANE_2 1 +#define EDP_LANE_4 3 +#define EDP_PREEMPHASIS_NONE 0 +#define EDP_PREEMPHASIS_3_5dB 1 +#define EDP_PREEMPHASIS_6dB 2 +#define EDP_PREEMPHASIS_9_5dB 3 +#define EDP_VSWING_0_4V 0 +#define EDP_VSWING_0_6V 1 +#define EDP_VSWING_0_8V 2 +#define EDP_VSWING_1_2V 3 + +struct edp_power_seq { + u16 t1_t3; + u16 t8; + u16 t9; + u16 t10; + u16 t11_t12; +} __attribute__ ((packed)); + +struct edp_link_params { + u8 rate:4; + u8 lanes:4; + u8 preemphasis:4; + u8 vswing:4; +} __attribute__ ((packed)); + +struct bdb_edp { + struct edp_power_seq power_seqs[16]; + u32 color_depth; + struct edp_link_params link_params[16]; + u32 sdrrs_msa_timing_delay; + + /* ith bit indicates enabled/disabled for (i+1)th panel */ + u16 edp_s3d_feature; + u16 edp_t3_optimization; +} __attribute__ ((packed)); + +void intel_setup_bios(struct drm_device *dev); +bool intel_parse_bios(struct drm_device *dev); + +/* + * Driver<->VBIOS interaction occurs through scratch bits in + * GR18 & SWF*. + */ + +/* GR18 bits are set on display switch and hotkey events */ +#define GR18_DRIVER_SWITCH_EN (1<<7) /* 0: VBIOS control, 1: driver control */ +#define GR18_HOTKEY_MASK 0x78 /* See also SWF4 15:0 */ +#define GR18_HK_NONE (0x0<<3) +#define GR18_HK_LFP_STRETCH (0x1<<3) +#define GR18_HK_TOGGLE_DISP (0x2<<3) +#define GR18_HK_DISP_SWITCH (0x4<<3) /* see SWF14 15:0 for what to enable */ +#define GR18_HK_POPUP_DISABLED (0x6<<3) +#define GR18_HK_POPUP_ENABLED (0x7<<3) +#define GR18_HK_PFIT (0x8<<3) +#define GR18_HK_APM_CHANGE (0xa<<3) +#define GR18_HK_MULTIPLE (0xc<<3) +#define GR18_USER_INT_EN (1<<2) +#define GR18_A0000_FLUSH_EN (1<<1) +#define GR18_SMM_EN (1<<0) + +/* Set by driver, cleared by VBIOS */ +#define SWF00_YRES_SHIFT 16 +#define SWF00_XRES_SHIFT 0 +#define SWF00_RES_MASK 0xffff + +/* Set by VBIOS at boot time and driver at runtime */ +#define SWF01_TV2_FORMAT_SHIFT 8 +#define SWF01_TV1_FORMAT_SHIFT 0 +#define SWF01_TV_FORMAT_MASK 0xffff + +#define SWF10_VBIOS_BLC_I2C_EN (1<<29) +#define SWF10_GTT_OVERRIDE_EN (1<<28) +#define SWF10_LFP_DPMS_OVR (1<<27) /* override DPMS on display switch */ +#define SWF10_ACTIVE_TOGGLE_LIST_MASK (7<<24) +#define SWF10_OLD_TOGGLE 0x0 +#define SWF10_TOGGLE_LIST_1 0x1 +#define SWF10_TOGGLE_LIST_2 0x2 +#define SWF10_TOGGLE_LIST_3 0x3 +#define SWF10_TOGGLE_LIST_4 0x4 +#define SWF10_PANNING_EN (1<<23) +#define SWF10_DRIVER_LOADED (1<<22) +#define SWF10_EXTENDED_DESKTOP (1<<21) +#define SWF10_EXCLUSIVE_MODE (1<<20) +#define SWF10_OVERLAY_EN (1<<19) +#define SWF10_PLANEB_HOLDOFF (1<<18) +#define SWF10_PLANEA_HOLDOFF (1<<17) +#define SWF10_VGA_HOLDOFF (1<<16) +#define SWF10_ACTIVE_DISP_MASK 0xffff +#define SWF10_PIPEB_LFP2 (1<<15) +#define SWF10_PIPEB_EFP2 (1<<14) +#define SWF10_PIPEB_TV2 (1<<13) +#define SWF10_PIPEB_CRT2 (1<<12) +#define SWF10_PIPEB_LFP (1<<11) +#define SWF10_PIPEB_EFP (1<<10) +#define SWF10_PIPEB_TV (1<<9) +#define SWF10_PIPEB_CRT (1<<8) +#define SWF10_PIPEA_LFP2 (1<<7) +#define SWF10_PIPEA_EFP2 (1<<6) +#define SWF10_PIPEA_TV2 (1<<5) +#define SWF10_PIPEA_CRT2 (1<<4) +#define SWF10_PIPEA_LFP (1<<3) +#define SWF10_PIPEA_EFP (1<<2) +#define SWF10_PIPEA_TV (1<<1) +#define SWF10_PIPEA_CRT (1<<0) + +#define SWF11_MEMORY_SIZE_SHIFT 16 +#define SWF11_SV_TEST_EN (1<<15) +#define SWF11_IS_AGP (1<<14) +#define SWF11_DISPLAY_HOLDOFF (1<<13) +#define SWF11_DPMS_REDUCED (1<<12) +#define SWF11_IS_VBE_MODE (1<<11) +#define SWF11_PIPEB_ACCESS (1<<10) /* 0 here means pipe a */ +#define SWF11_DPMS_MASK 0x07 +#define SWF11_DPMS_OFF (1<<2) +#define SWF11_DPMS_SUSPEND (1<<1) +#define SWF11_DPMS_STANDBY (1<<0) +#define SWF11_DPMS_ON 0 + +#define SWF14_GFX_PFIT_EN (1<<31) +#define SWF14_TEXT_PFIT_EN (1<<30) +#define SWF14_LID_STATUS_CLOSED (1<<29) /* 0 here means open */ +#define SWF14_POPUP_EN (1<<28) +#define SWF14_DISPLAY_HOLDOFF (1<<27) +#define SWF14_DISP_DETECT_EN (1<<26) +#define SWF14_DOCKING_STATUS_DOCKED (1<<25) /* 0 here means undocked */ +#define SWF14_DRIVER_STATUS (1<<24) +#define SWF14_OS_TYPE_WIN9X (1<<23) +#define SWF14_OS_TYPE_WINNT (1<<22) +/* 21:19 rsvd */ +#define SWF14_PM_TYPE_MASK 0x00070000 +#define SWF14_PM_ACPI_VIDEO (0x4 << 16) +#define SWF14_PM_ACPI (0x3 << 16) +#define SWF14_PM_APM_12 (0x2 << 16) +#define SWF14_PM_APM_11 (0x1 << 16) +#define SWF14_HK_REQUEST_MASK 0x0000ffff /* see GR18 6:3 for event type */ + /* if GR18 indicates a display switch */ +#define SWF14_DS_PIPEB_LFP2_EN (1<<15) +#define SWF14_DS_PIPEB_EFP2_EN (1<<14) +#define SWF14_DS_PIPEB_TV2_EN (1<<13) +#define SWF14_DS_PIPEB_CRT2_EN (1<<12) +#define SWF14_DS_PIPEB_LFP_EN (1<<11) +#define SWF14_DS_PIPEB_EFP_EN (1<<10) +#define SWF14_DS_PIPEB_TV_EN (1<<9) +#define SWF14_DS_PIPEB_CRT_EN (1<<8) +#define SWF14_DS_PIPEA_LFP2_EN (1<<7) +#define SWF14_DS_PIPEA_EFP2_EN (1<<6) +#define SWF14_DS_PIPEA_TV2_EN (1<<5) +#define SWF14_DS_PIPEA_CRT2_EN (1<<4) +#define SWF14_DS_PIPEA_LFP_EN (1<<3) +#define SWF14_DS_PIPEA_EFP_EN (1<<2) +#define SWF14_DS_PIPEA_TV_EN (1<<1) +#define SWF14_DS_PIPEA_CRT_EN (1<<0) + /* if GR18 indicates a panel fitting request */ +#define SWF14_PFIT_EN (1<<0) /* 0 means disable */ + /* if GR18 indicates an APM change request */ +#define SWF14_APM_HIBERNATE 0x4 +#define SWF14_APM_SUSPEND 0x3 +#define SWF14_APM_STANDBY 0x1 +#define SWF14_APM_RESTORE 0x0 + +/* Add the device class for LFP, TV, HDMI */ +#define DEVICE_TYPE_INT_LFP 0x1022 +#define DEVICE_TYPE_INT_TV 0x1009 +#define DEVICE_TYPE_HDMI 0x60D2 +#define DEVICE_TYPE_DP 0x68C6 +#define DEVICE_TYPE_eDP 0x78C6 + +/* define the DVO port for HDMI output type */ +#define DVO_B 1 +#define DVO_C 2 +#define DVO_D 3 + +/* define the PORT for DP output type */ +#define PORT_IDPB 7 +#define PORT_IDPC 8 +#define PORT_IDPD 9 + +#endif /* _I830_BIOS_H_ */ diff --git a/sys/dev/drm2/i915/intel_crt.c b/sys/dev/drm2/i915/intel_crt.c new file mode 100644 index 00000000000..9072553285a --- /dev/null +++ b/sys/dev/drm2/i915/intel_crt.c @@ -0,0 +1,624 @@ +/* + * Copyright © 2006-2007 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +/* Here's the desired hotplug mode */ +#define ADPA_HOTPLUG_BITS (ADPA_CRT_HOTPLUG_PERIOD_128 | \ + ADPA_CRT_HOTPLUG_WARMUP_10MS | \ + ADPA_CRT_HOTPLUG_SAMPLE_4S | \ + ADPA_CRT_HOTPLUG_VOLTAGE_50 | \ + ADPA_CRT_HOTPLUG_VOLREF_325MV | \ + ADPA_CRT_HOTPLUG_ENABLE) + +struct intel_crt { + struct intel_encoder base; + bool force_hotplug_required; +}; + +static struct intel_crt *intel_attached_crt(struct drm_connector *connector) +{ + return container_of(intel_attached_encoder(connector), + struct intel_crt, base); +} + +static void intel_crt_dpms(struct drm_encoder *encoder, int mode) +{ + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 temp, reg; + + if (HAS_PCH_SPLIT(dev)) + reg = PCH_ADPA; + else + reg = ADPA; + + temp = I915_READ(reg); + temp &= ~(ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE); + temp &= ~ADPA_DAC_ENABLE; + + switch (mode) { + case DRM_MODE_DPMS_ON: + temp |= ADPA_DAC_ENABLE; + break; + case DRM_MODE_DPMS_STANDBY: + temp |= ADPA_DAC_ENABLE | ADPA_HSYNC_CNTL_DISABLE; + break; + case DRM_MODE_DPMS_SUSPEND: + temp |= ADPA_DAC_ENABLE | ADPA_VSYNC_CNTL_DISABLE; + break; + case DRM_MODE_DPMS_OFF: + temp |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE; + break; + } + + I915_WRITE(reg, temp); +} + +static int intel_crt_mode_valid(struct drm_connector *connector, + struct drm_display_mode *mode) +{ + struct drm_device *dev = connector->dev; + + int max_clock = 0; + if (mode->flags & DRM_MODE_FLAG_DBLSCAN) + return MODE_NO_DBLESCAN; + + if (mode->clock < 25000) + return MODE_CLOCK_LOW; + + if (IS_GEN2(dev)) + max_clock = 350000; + else + max_clock = 400000; + if (mode->clock > max_clock) + return MODE_CLOCK_HIGH; + + return MODE_OK; +} + +static bool intel_crt_mode_fixup(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + return true; +} + +static void intel_crt_mode_set(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + + struct drm_device *dev = encoder->dev; + struct drm_crtc *crtc = encoder->crtc; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct drm_i915_private *dev_priv = dev->dev_private; + int dpll_md_reg; + u32 adpa, dpll_md; + u32 adpa_reg; + + dpll_md_reg = DPLL_MD(intel_crtc->pipe); + + if (HAS_PCH_SPLIT(dev)) + adpa_reg = PCH_ADPA; + else + adpa_reg = ADPA; + + /* + * Disable separate mode multiplier used when cloning SDVO to CRT + * XXX this needs to be adjusted when we really are cloning + */ + if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) { + dpll_md = I915_READ(dpll_md_reg); + I915_WRITE(dpll_md_reg, + dpll_md & ~DPLL_MD_UDI_MULTIPLIER_MASK); + } + + adpa = ADPA_HOTPLUG_BITS; + if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) + adpa |= ADPA_HSYNC_ACTIVE_HIGH; + if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) + adpa |= ADPA_VSYNC_ACTIVE_HIGH; + + /* For CPT allow 3 pipe config, for others just use A or B */ + if (HAS_PCH_CPT(dev)) + adpa |= PORT_TRANS_SEL_CPT(intel_crtc->pipe); + else if (intel_crtc->pipe == 0) + adpa |= ADPA_PIPE_A_SELECT; + else + adpa |= ADPA_PIPE_B_SELECT; + + if (!HAS_PCH_SPLIT(dev)) + I915_WRITE(BCLRPAT(intel_crtc->pipe), 0); + + I915_WRITE(adpa_reg, adpa); +} + +static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector) +{ + struct drm_device *dev = connector->dev; + struct intel_crt *crt = intel_attached_crt(connector); + struct drm_i915_private *dev_priv = dev->dev_private; + u32 adpa; + bool ret; + + /* The first time through, trigger an explicit detection cycle */ + if (crt->force_hotplug_required) { + bool turn_off_dac = HAS_PCH_SPLIT(dev); + u32 save_adpa; + + crt->force_hotplug_required = 0; + + save_adpa = adpa = I915_READ(PCH_ADPA); + DRM_DEBUG_KMS("trigger hotplug detect cycle: adpa=0x%x\n", adpa); + + adpa |= ADPA_CRT_HOTPLUG_FORCE_TRIGGER; + if (turn_off_dac) + adpa &= ~ADPA_DAC_ENABLE; + + I915_WRITE(PCH_ADPA, adpa); + + if (_intel_wait_for(dev, + (I915_READ(PCH_ADPA) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) == 0, + 1000, 1, "915crt")) + DRM_DEBUG_KMS("timed out waiting for FORCE_TRIGGER\n"); + + if (turn_off_dac) { + I915_WRITE(PCH_ADPA, save_adpa); + POSTING_READ(PCH_ADPA); + } + } + + /* Check the status to see if both blue and green are on now */ + adpa = I915_READ(PCH_ADPA); + if ((adpa & ADPA_CRT_HOTPLUG_MONITOR_MASK) != 0) + ret = true; + else + ret = false; + DRM_DEBUG_KMS("ironlake hotplug adpa=0x%x, result %d\n", adpa, ret); + + return ret; +} + +/** + * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect CRT presence. + * + * Not for i915G/i915GM + * + * \return true if CRT is connected. + * \return false if CRT is disconnected. + */ +static bool intel_crt_detect_hotplug(struct drm_connector *connector) +{ + struct drm_device *dev = connector->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 hotplug_en, orig, stat; + bool ret = false; + int i, tries = 0; + + if (HAS_PCH_SPLIT(dev)) + return intel_ironlake_crt_detect_hotplug(connector); + + /* + * On 4 series desktop, CRT detect sequence need to be done twice + * to get a reliable result. + */ + + if (IS_G4X(dev) && !IS_GM45(dev)) + tries = 2; + else + tries = 1; + hotplug_en = orig = I915_READ(PORT_HOTPLUG_EN); + hotplug_en |= CRT_HOTPLUG_FORCE_DETECT; + + for (i = 0; i < tries ; i++) { + /* turn on the FORCE_DETECT */ + I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); + /* wait for FORCE_DETECT to go off */ + if (_intel_wait_for(dev, + (I915_READ(PORT_HOTPLUG_EN) & CRT_HOTPLUG_FORCE_DETECT) == 0, + 1000, 1, "915cr2")) + DRM_DEBUG_KMS("timed out waiting for FORCE_DETECT to go off"); + } + + stat = I915_READ(PORT_HOTPLUG_STAT); + if ((stat & CRT_HOTPLUG_MONITOR_MASK) != CRT_HOTPLUG_MONITOR_NONE) + ret = true; + + /* clear the interrupt we just generated, if any */ + I915_WRITE(PORT_HOTPLUG_STAT, CRT_HOTPLUG_INT_STATUS); + + /* and put the bits back */ + I915_WRITE(PORT_HOTPLUG_EN, orig); + + return ret; +} + +static bool intel_crt_detect_ddc(struct drm_connector *connector) +{ + struct intel_crt *crt = intel_attached_crt(connector); + struct drm_i915_private *dev_priv = crt->base.base.dev->dev_private; + + /* CRT should always be at 0, but check anyway */ + if (crt->base.type != INTEL_OUTPUT_ANALOG) + return false; + + if (intel_ddc_probe(&crt->base, dev_priv->crt_ddc_pin)) { + struct edid *edid; + bool is_digital = false; + + edid = drm_get_edid(connector, + dev_priv->gmbus[dev_priv->crt_ddc_pin]); + /* + * This may be a DVI-I connector with a shared DDC + * link between analog and digital outputs, so we + * have to check the EDID input spec of the attached device. + * + * On the other hand, what should we do if it is a broken EDID? + */ + if (edid != NULL) { + is_digital = edid->input & DRM_EDID_INPUT_DIGITAL; + connector->display_info.raw_edid = NULL; + free(edid, DRM_MEM_KMS); + } + + if (!is_digital) { + DRM_DEBUG_KMS("CRT detected via DDC:0x50 [EDID]\n"); + return true; + } else { + DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [EDID reports a digital panel]\n"); + } + } + + return false; +} + +static enum drm_connector_status +intel_crt_load_detect(struct intel_crt *crt) +{ + struct drm_device *dev = crt->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t pipe = to_intel_crtc(crt->base.base.crtc)->pipe; + uint32_t save_bclrpat; + uint32_t save_vtotal; + uint32_t vtotal, vactive; + uint32_t vsample; + uint32_t vblank, vblank_start, vblank_end; + uint32_t dsl; + uint32_t bclrpat_reg; + uint32_t vtotal_reg; + uint32_t vblank_reg; + uint32_t vsync_reg; + uint32_t pipeconf_reg; + uint32_t pipe_dsl_reg; + uint8_t st00; + enum drm_connector_status status; + + DRM_DEBUG_KMS("starting load-detect on CRT\n"); + + bclrpat_reg = BCLRPAT(pipe); + vtotal_reg = VTOTAL(pipe); + vblank_reg = VBLANK(pipe); + vsync_reg = VSYNC(pipe); + pipeconf_reg = PIPECONF(pipe); + pipe_dsl_reg = PIPEDSL(pipe); + + save_bclrpat = I915_READ(bclrpat_reg); + save_vtotal = I915_READ(vtotal_reg); + vblank = I915_READ(vblank_reg); + + vtotal = ((save_vtotal >> 16) & 0xfff) + 1; + vactive = (save_vtotal & 0x7ff) + 1; + + vblank_start = (vblank & 0xfff) + 1; + vblank_end = ((vblank >> 16) & 0xfff) + 1; + + /* Set the border color to purple. */ + I915_WRITE(bclrpat_reg, 0x500050); + + if (!IS_GEN2(dev)) { + uint32_t pipeconf = I915_READ(pipeconf_reg); + I915_WRITE(pipeconf_reg, pipeconf | PIPECONF_FORCE_BORDER); + POSTING_READ(pipeconf_reg); + /* Wait for next Vblank to substitue + * border color for Color info */ + intel_wait_for_vblank(dev, pipe); + st00 = I915_READ8(VGA_MSR_WRITE); + status = ((st00 & (1 << 4)) != 0) ? + connector_status_connected : + connector_status_disconnected; + + I915_WRITE(pipeconf_reg, pipeconf); + } else { + bool restore_vblank = false; + int count, detect; + + /* + * If there isn't any border, add some. + * Yes, this will flicker + */ + if (vblank_start <= vactive && vblank_end >= vtotal) { + uint32_t vsync = I915_READ(vsync_reg); + uint32_t vsync_start = (vsync & 0xffff) + 1; + + vblank_start = vsync_start; + I915_WRITE(vblank_reg, + (vblank_start - 1) | + ((vblank_end - 1) << 16)); + restore_vblank = true; + } + /* sample in the vertical border, selecting the larger one */ + if (vblank_start - vactive >= vtotal - vblank_end) + vsample = (vblank_start + vactive) >> 1; + else + vsample = (vtotal + vblank_end) >> 1; + + /* + * Wait for the border to be displayed + */ + while (I915_READ(pipe_dsl_reg) >= vactive) + ; + while ((dsl = I915_READ(pipe_dsl_reg)) <= vsample) + ; + /* + * Watch ST00 for an entire scanline + */ + detect = 0; + count = 0; + do { + count++; + /* Read the ST00 VGA status register */ + st00 = I915_READ8(VGA_MSR_WRITE); + if (st00 & (1 << 4)) + detect++; + } while ((I915_READ(pipe_dsl_reg) == dsl)); + + /* restore vblank if necessary */ + if (restore_vblank) + I915_WRITE(vblank_reg, vblank); + /* + * If more than 3/4 of the scanline detected a monitor, + * then it is assumed to be present. This works even on i830, + * where there isn't any way to force the border color across + * the screen + */ + status = detect * 4 > count * 3 ? + connector_status_connected : + connector_status_disconnected; + } + + /* Restore previous settings */ + I915_WRITE(bclrpat_reg, save_bclrpat); + + return status; +} + +static enum drm_connector_status +intel_crt_detect(struct drm_connector *connector, bool force) +{ + struct drm_device *dev = connector->dev; + struct intel_crt *crt = intel_attached_crt(connector); + enum drm_connector_status status; + struct intel_load_detect_pipe tmp; + + if (I915_HAS_HOTPLUG(dev)) { + if (intel_crt_detect_hotplug(connector)) { + DRM_DEBUG_KMS("CRT detected via hotplug\n"); + return connector_status_connected; + } else { + DRM_DEBUG_KMS("CRT not detected via hotplug\n"); + return connector_status_disconnected; + } + } + + if (intel_crt_detect_ddc(connector)) + return connector_status_connected; + + if (!force) + return connector->status; + + /* for pre-945g platforms use load detect */ + if (intel_get_load_detect_pipe(&crt->base, connector, NULL, + &tmp)) { + if (intel_crt_detect_ddc(connector)) + status = connector_status_connected; + else + status = intel_crt_load_detect(crt); + intel_release_load_detect_pipe(&crt->base, connector, + &tmp); + } else + status = connector_status_unknown; + + return status; +} + +static void intel_crt_destroy(struct drm_connector *connector) +{ + +#if 0 + drm_sysfs_connector_remove(connector); +#endif + drm_connector_cleanup(connector); + free(connector, DRM_MEM_KMS); +} + +static int intel_crt_get_modes(struct drm_connector *connector) +{ + struct drm_device *dev = connector->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + int ret; + + ret = intel_ddc_get_modes(connector, + dev_priv->gmbus[dev_priv->crt_ddc_pin]); + if (ret || !IS_G4X(dev)) + return ret; + + /* Try to probe digital port for output in DVI-I -> VGA mode. */ + return (intel_ddc_get_modes(connector, + dev_priv->gmbus[GMBUS_PORT_DPB])); +} + +static int intel_crt_set_property(struct drm_connector *connector, + struct drm_property *property, + uint64_t value) +{ + return 0; +} + +static void intel_crt_reset(struct drm_connector *connector) +{ + struct drm_device *dev = connector->dev; + struct intel_crt *crt = intel_attached_crt(connector); + + if (HAS_PCH_SPLIT(dev)) + crt->force_hotplug_required = 1; +} + +/* + * Routines for controlling stuff on the analog port + */ + +static const struct drm_encoder_helper_funcs intel_crt_helper_funcs = { + .dpms = intel_crt_dpms, + .mode_fixup = intel_crt_mode_fixup, + .prepare = intel_encoder_prepare, + .commit = intel_encoder_commit, + .mode_set = intel_crt_mode_set, +}; + +static const struct drm_connector_funcs intel_crt_connector_funcs = { + .reset = intel_crt_reset, + .dpms = drm_helper_connector_dpms, + .detect = intel_crt_detect, + .fill_modes = drm_helper_probe_single_connector_modes, + .destroy = intel_crt_destroy, + .set_property = intel_crt_set_property, +}; + +static const struct drm_connector_helper_funcs intel_crt_connector_helper_funcs = { + .mode_valid = intel_crt_mode_valid, + .get_modes = intel_crt_get_modes, + .best_encoder = intel_best_encoder, +}; + +static const struct drm_encoder_funcs intel_crt_enc_funcs = { + .destroy = intel_encoder_destroy, +}; + +static int intel_no_crt_dmi_callback(const struct dmi_system_id *id) +{ + DRM_DEBUG_KMS("Skipping CRT initialization for %s\n", id->ident); + return 1; +} + +static const struct dmi_system_id intel_no_crt[] = { + { + .callback = intel_no_crt_dmi_callback, + .ident = "ACER ZGB", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ACER"), + DMI_MATCH(DMI_PRODUCT_NAME, "ZGB"), + }, + }, + { } +}; + +void intel_crt_init(struct drm_device *dev) +{ + struct drm_connector *connector; + struct intel_crt *crt; + struct intel_connector *intel_connector; + struct drm_i915_private *dev_priv = dev->dev_private; + + /* Skip machines without VGA that falsely report hotplug events */ + if (dmi_check_system(intel_no_crt)) + return; + + crt = malloc(sizeof(struct intel_crt), DRM_MEM_KMS, M_WAITOK | M_ZERO); + intel_connector = malloc(sizeof(struct intel_connector), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + connector = &intel_connector->base; + drm_connector_init(dev, &intel_connector->base, + &intel_crt_connector_funcs, DRM_MODE_CONNECTOR_VGA); + + drm_encoder_init(dev, &crt->base.base, &intel_crt_enc_funcs, + DRM_MODE_ENCODER_DAC); + + intel_connector_attach_encoder(intel_connector, &crt->base); + + crt->base.type = INTEL_OUTPUT_ANALOG; + crt->base.clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT | + 1 << INTEL_ANALOG_CLONE_BIT | + 1 << INTEL_SDVO_LVDS_CLONE_BIT); + crt->base.crtc_mask = (1 << 0) | (1 << 1); + if (IS_GEN2(dev)) + connector->interlace_allowed = 0; + else + connector->interlace_allowed = 1; + connector->doublescan_allowed = 0; + + drm_encoder_helper_add(&crt->base.base, &intel_crt_helper_funcs); + drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs); + +#if 0 + drm_sysfs_connector_add(connector); +#endif + + if (I915_HAS_HOTPLUG(dev)) + connector->polled = DRM_CONNECTOR_POLL_HPD; + else + connector->polled = DRM_CONNECTOR_POLL_CONNECT; + + /* + * Configure the automatic hotplug detection stuff + */ + crt->force_hotplug_required = 0; + if (HAS_PCH_SPLIT(dev)) { + u32 adpa; + + adpa = I915_READ(PCH_ADPA); + adpa &= ~ADPA_CRT_HOTPLUG_MASK; + adpa |= ADPA_HOTPLUG_BITS; + I915_WRITE(PCH_ADPA, adpa); + POSTING_READ(PCH_ADPA); + + DRM_DEBUG_KMS("pch crt adpa set to 0x%x\n", adpa); + crt->force_hotplug_required = 1; + } + + dev_priv->hotplug_supported_mask |= CRT_HOTPLUG_INT_STATUS; +} diff --git a/sys/dev/drm2/i915/intel_display.c b/sys/dev/drm2/i915/intel_display.c new file mode 100644 index 00000000000..21f8f535566 --- /dev/null +++ b/sys/dev/drm2/i915/intel_display.c @@ -0,0 +1,9532 @@ +/* + * Copyright © 2006-2007 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define HAS_eDP (intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP)) + +bool intel_pipe_has_type(struct drm_crtc *crtc, int type); +static void intel_update_watermarks(struct drm_device *dev); +static void intel_increase_pllclock(struct drm_crtc *crtc); +static void intel_crtc_update_cursor(struct drm_crtc *crtc, bool on); + +typedef struct { + /* given values */ + int n; + int m1, m2; + int p1, p2; + /* derived values */ + int dot; + int vco; + int m; + int p; +} intel_clock_t; + +typedef struct { + int min, max; +} intel_range_t; + +typedef struct { + int dot_limit; + int p2_slow, p2_fast; +} intel_p2_t; + +#define INTEL_P2_NUM 2 +typedef struct intel_limit intel_limit_t; +struct intel_limit { + intel_range_t dot, vco, n, m, m1, m2, p, p1; + intel_p2_t p2; + bool (* find_pll)(const intel_limit_t *, struct drm_crtc *, + int, int, intel_clock_t *, intel_clock_t *); +}; + +/* FDI */ +#define IRONLAKE_FDI_FREQ 2700000 /* in kHz for mode->clock */ + +static bool +intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, + int target, int refclk, intel_clock_t *match_clock, + intel_clock_t *best_clock); +static bool +intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, + int target, int refclk, intel_clock_t *match_clock, + intel_clock_t *best_clock); + +static bool +intel_find_pll_g4x_dp(const intel_limit_t *, struct drm_crtc *crtc, + int target, int refclk, intel_clock_t *match_clock, + intel_clock_t *best_clock); +static bool +intel_find_pll_ironlake_dp(const intel_limit_t *, struct drm_crtc *crtc, + int target, int refclk, intel_clock_t *match_clock, + intel_clock_t *best_clock); + +static inline u32 /* units of 100MHz */ +intel_fdi_link_freq(struct drm_device *dev) +{ + if (IS_GEN5(dev)) { + struct drm_i915_private *dev_priv = dev->dev_private; + return (I915_READ(FDI_PLL_BIOS_0) & FDI_PLL_FB_CLOCK_MASK) + 2; + } else + return 27; +} + +static const intel_limit_t intel_limits_i8xx_dvo = { + .dot = { .min = 25000, .max = 350000 }, + .vco = { .min = 930000, .max = 1400000 }, + .n = { .min = 3, .max = 16 }, + .m = { .min = 96, .max = 140 }, + .m1 = { .min = 18, .max = 26 }, + .m2 = { .min = 6, .max = 16 }, + .p = { .min = 4, .max = 128 }, + .p1 = { .min = 2, .max = 33 }, + .p2 = { .dot_limit = 165000, + .p2_slow = 4, .p2_fast = 2 }, + .find_pll = intel_find_best_PLL, +}; + +static const intel_limit_t intel_limits_i8xx_lvds = { + .dot = { .min = 25000, .max = 350000 }, + .vco = { .min = 930000, .max = 1400000 }, + .n = { .min = 3, .max = 16 }, + .m = { .min = 96, .max = 140 }, + .m1 = { .min = 18, .max = 26 }, + .m2 = { .min = 6, .max = 16 }, + .p = { .min = 4, .max = 128 }, + .p1 = { .min = 1, .max = 6 }, + .p2 = { .dot_limit = 165000, + .p2_slow = 14, .p2_fast = 7 }, + .find_pll = intel_find_best_PLL, +}; + +static const intel_limit_t intel_limits_i9xx_sdvo = { + .dot = { .min = 20000, .max = 400000 }, + .vco = { .min = 1400000, .max = 2800000 }, + .n = { .min = 1, .max = 6 }, + .m = { .min = 70, .max = 120 }, + .m1 = { .min = 10, .max = 22 }, + .m2 = { .min = 5, .max = 9 }, + .p = { .min = 5, .max = 80 }, + .p1 = { .min = 1, .max = 8 }, + .p2 = { .dot_limit = 200000, + .p2_slow = 10, .p2_fast = 5 }, + .find_pll = intel_find_best_PLL, +}; + +static const intel_limit_t intel_limits_i9xx_lvds = { + .dot = { .min = 20000, .max = 400000 }, + .vco = { .min = 1400000, .max = 2800000 }, + .n = { .min = 1, .max = 6 }, + .m = { .min = 70, .max = 120 }, + .m1 = { .min = 10, .max = 22 }, + .m2 = { .min = 5, .max = 9 }, + .p = { .min = 7, .max = 98 }, + .p1 = { .min = 1, .max = 8 }, + .p2 = { .dot_limit = 112000, + .p2_slow = 14, .p2_fast = 7 }, + .find_pll = intel_find_best_PLL, +}; + + +static const intel_limit_t intel_limits_g4x_sdvo = { + .dot = { .min = 25000, .max = 270000 }, + .vco = { .min = 1750000, .max = 3500000}, + .n = { .min = 1, .max = 4 }, + .m = { .min = 104, .max = 138 }, + .m1 = { .min = 17, .max = 23 }, + .m2 = { .min = 5, .max = 11 }, + .p = { .min = 10, .max = 30 }, + .p1 = { .min = 1, .max = 3}, + .p2 = { .dot_limit = 270000, + .p2_slow = 10, + .p2_fast = 10 + }, + .find_pll = intel_g4x_find_best_PLL, +}; + +static const intel_limit_t intel_limits_g4x_hdmi = { + .dot = { .min = 22000, .max = 400000 }, + .vco = { .min = 1750000, .max = 3500000}, + .n = { .min = 1, .max = 4 }, + .m = { .min = 104, .max = 138 }, + .m1 = { .min = 16, .max = 23 }, + .m2 = { .min = 5, .max = 11 }, + .p = { .min = 5, .max = 80 }, + .p1 = { .min = 1, .max = 8}, + .p2 = { .dot_limit = 165000, + .p2_slow = 10, .p2_fast = 5 }, + .find_pll = intel_g4x_find_best_PLL, +}; + +static const intel_limit_t intel_limits_g4x_single_channel_lvds = { + .dot = { .min = 20000, .max = 115000 }, + .vco = { .min = 1750000, .max = 3500000 }, + .n = { .min = 1, .max = 3 }, + .m = { .min = 104, .max = 138 }, + .m1 = { .min = 17, .max = 23 }, + .m2 = { .min = 5, .max = 11 }, + .p = { .min = 28, .max = 112 }, + .p1 = { .min = 2, .max = 8 }, + .p2 = { .dot_limit = 0, + .p2_slow = 14, .p2_fast = 14 + }, + .find_pll = intel_g4x_find_best_PLL, +}; + +static const intel_limit_t intel_limits_g4x_dual_channel_lvds = { + .dot = { .min = 80000, .max = 224000 }, + .vco = { .min = 1750000, .max = 3500000 }, + .n = { .min = 1, .max = 3 }, + .m = { .min = 104, .max = 138 }, + .m1 = { .min = 17, .max = 23 }, + .m2 = { .min = 5, .max = 11 }, + .p = { .min = 14, .max = 42 }, + .p1 = { .min = 2, .max = 6 }, + .p2 = { .dot_limit = 0, + .p2_slow = 7, .p2_fast = 7 + }, + .find_pll = intel_g4x_find_best_PLL, +}; + +static const intel_limit_t intel_limits_g4x_display_port = { + .dot = { .min = 161670, .max = 227000 }, + .vco = { .min = 1750000, .max = 3500000}, + .n = { .min = 1, .max = 2 }, + .m = { .min = 97, .max = 108 }, + .m1 = { .min = 0x10, .max = 0x12 }, + .m2 = { .min = 0x05, .max = 0x06 }, + .p = { .min = 10, .max = 20 }, + .p1 = { .min = 1, .max = 2}, + .p2 = { .dot_limit = 0, + .p2_slow = 10, .p2_fast = 10 }, + .find_pll = intel_find_pll_g4x_dp, +}; + +static const intel_limit_t intel_limits_pineview_sdvo = { + .dot = { .min = 20000, .max = 400000}, + .vco = { .min = 1700000, .max = 3500000 }, + /* Pineview's Ncounter is a ring counter */ + .n = { .min = 3, .max = 6 }, + .m = { .min = 2, .max = 256 }, + /* Pineview only has one combined m divider, which we treat as m2. */ + .m1 = { .min = 0, .max = 0 }, + .m2 = { .min = 0, .max = 254 }, + .p = { .min = 5, .max = 80 }, + .p1 = { .min = 1, .max = 8 }, + .p2 = { .dot_limit = 200000, + .p2_slow = 10, .p2_fast = 5 }, + .find_pll = intel_find_best_PLL, +}; + +static const intel_limit_t intel_limits_pineview_lvds = { + .dot = { .min = 20000, .max = 400000 }, + .vco = { .min = 1700000, .max = 3500000 }, + .n = { .min = 3, .max = 6 }, + .m = { .min = 2, .max = 256 }, + .m1 = { .min = 0, .max = 0 }, + .m2 = { .min = 0, .max = 254 }, + .p = { .min = 7, .max = 112 }, + .p1 = { .min = 1, .max = 8 }, + .p2 = { .dot_limit = 112000, + .p2_slow = 14, .p2_fast = 14 }, + .find_pll = intel_find_best_PLL, +}; + +/* Ironlake / Sandybridge + * + * We calculate clock using (register_value + 2) for N/M1/M2, so here + * the range value for them is (actual_value - 2). + */ +static const intel_limit_t intel_limits_ironlake_dac = { + .dot = { .min = 25000, .max = 350000 }, + .vco = { .min = 1760000, .max = 3510000 }, + .n = { .min = 1, .max = 5 }, + .m = { .min = 79, .max = 127 }, + .m1 = { .min = 12, .max = 22 }, + .m2 = { .min = 5, .max = 9 }, + .p = { .min = 5, .max = 80 }, + .p1 = { .min = 1, .max = 8 }, + .p2 = { .dot_limit = 225000, + .p2_slow = 10, .p2_fast = 5 }, + .find_pll = intel_g4x_find_best_PLL, +}; + +static const intel_limit_t intel_limits_ironlake_single_lvds = { + .dot = { .min = 25000, .max = 350000 }, + .vco = { .min = 1760000, .max = 3510000 }, + .n = { .min = 1, .max = 3 }, + .m = { .min = 79, .max = 118 }, + .m1 = { .min = 12, .max = 22 }, + .m2 = { .min = 5, .max = 9 }, + .p = { .min = 28, .max = 112 }, + .p1 = { .min = 2, .max = 8 }, + .p2 = { .dot_limit = 225000, + .p2_slow = 14, .p2_fast = 14 }, + .find_pll = intel_g4x_find_best_PLL, +}; + +static const intel_limit_t intel_limits_ironlake_dual_lvds = { + .dot = { .min = 25000, .max = 350000 }, + .vco = { .min = 1760000, .max = 3510000 }, + .n = { .min = 1, .max = 3 }, + .m = { .min = 79, .max = 127 }, + .m1 = { .min = 12, .max = 22 }, + .m2 = { .min = 5, .max = 9 }, + .p = { .min = 14, .max = 56 }, + .p1 = { .min = 2, .max = 8 }, + .p2 = { .dot_limit = 225000, + .p2_slow = 7, .p2_fast = 7 }, + .find_pll = intel_g4x_find_best_PLL, +}; + +/* LVDS 100mhz refclk limits. */ +static const intel_limit_t intel_limits_ironlake_single_lvds_100m = { + .dot = { .min = 25000, .max = 350000 }, + .vco = { .min = 1760000, .max = 3510000 }, + .n = { .min = 1, .max = 2 }, + .m = { .min = 79, .max = 126 }, + .m1 = { .min = 12, .max = 22 }, + .m2 = { .min = 5, .max = 9 }, + .p = { .min = 28, .max = 112 }, + .p1 = { .min = 2, .max = 8 }, + .p2 = { .dot_limit = 225000, + .p2_slow = 14, .p2_fast = 14 }, + .find_pll = intel_g4x_find_best_PLL, +}; + +static const intel_limit_t intel_limits_ironlake_dual_lvds_100m = { + .dot = { .min = 25000, .max = 350000 }, + .vco = { .min = 1760000, .max = 3510000 }, + .n = { .min = 1, .max = 3 }, + .m = { .min = 79, .max = 126 }, + .m1 = { .min = 12, .max = 22 }, + .m2 = { .min = 5, .max = 9 }, + .p = { .min = 14, .max = 42 }, + .p1 = { .min = 2, .max = 6 }, + .p2 = { .dot_limit = 225000, + .p2_slow = 7, .p2_fast = 7 }, + .find_pll = intel_g4x_find_best_PLL, +}; + +static const intel_limit_t intel_limits_ironlake_display_port = { + .dot = { .min = 25000, .max = 350000 }, + .vco = { .min = 1760000, .max = 3510000}, + .n = { .min = 1, .max = 2 }, + .m = { .min = 81, .max = 90 }, + .m1 = { .min = 12, .max = 22 }, + .m2 = { .min = 5, .max = 9 }, + .p = { .min = 10, .max = 20 }, + .p1 = { .min = 1, .max = 2}, + .p2 = { .dot_limit = 0, + .p2_slow = 10, .p2_fast = 10 }, + .find_pll = intel_find_pll_ironlake_dp, +}; + +static const intel_limit_t *intel_ironlake_limit(struct drm_crtc *crtc, + int refclk) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + const intel_limit_t *limit; + + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { + if ((I915_READ(PCH_LVDS) & LVDS_CLKB_POWER_MASK) == + LVDS_CLKB_POWER_UP) { + /* LVDS dual channel */ + if (refclk == 100000) + limit = &intel_limits_ironlake_dual_lvds_100m; + else + limit = &intel_limits_ironlake_dual_lvds; + } else { + if (refclk == 100000) + limit = &intel_limits_ironlake_single_lvds_100m; + else + limit = &intel_limits_ironlake_single_lvds; + } + } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT) || + HAS_eDP) + limit = &intel_limits_ironlake_display_port; + else + limit = &intel_limits_ironlake_dac; + + return limit; +} + +static const intel_limit_t *intel_g4x_limit(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + const intel_limit_t *limit; + + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { + if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) == + LVDS_CLKB_POWER_UP) + /* LVDS with dual channel */ + limit = &intel_limits_g4x_dual_channel_lvds; + else + /* LVDS with dual channel */ + limit = &intel_limits_g4x_single_channel_lvds; + } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_HDMI) || + intel_pipe_has_type(crtc, INTEL_OUTPUT_ANALOG)) { + limit = &intel_limits_g4x_hdmi; + } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_SDVO)) { + limit = &intel_limits_g4x_sdvo; + } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) { + limit = &intel_limits_g4x_display_port; + } else /* The option is for other outputs */ + limit = &intel_limits_i9xx_sdvo; + + return limit; +} + +static const intel_limit_t *intel_limit(struct drm_crtc *crtc, int refclk) +{ + struct drm_device *dev = crtc->dev; + const intel_limit_t *limit; + + if (HAS_PCH_SPLIT(dev)) + limit = intel_ironlake_limit(crtc, refclk); + else if (IS_G4X(dev)) { + limit = intel_g4x_limit(crtc); + } else if (IS_PINEVIEW(dev)) { + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) + limit = &intel_limits_pineview_lvds; + else + limit = &intel_limits_pineview_sdvo; + } else if (!IS_GEN2(dev)) { + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) + limit = &intel_limits_i9xx_lvds; + else + limit = &intel_limits_i9xx_sdvo; + } else { + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) + limit = &intel_limits_i8xx_lvds; + else + limit = &intel_limits_i8xx_dvo; + } + return limit; +} + +/* m1 is reserved as 0 in Pineview, n is a ring counter */ +static void pineview_clock(int refclk, intel_clock_t *clock) +{ + clock->m = clock->m2 + 2; + clock->p = clock->p1 * clock->p2; + clock->vco = refclk * clock->m / clock->n; + clock->dot = clock->vco / clock->p; +} + +static void intel_clock(struct drm_device *dev, int refclk, intel_clock_t *clock) +{ + if (IS_PINEVIEW(dev)) { + pineview_clock(refclk, clock); + return; + } + clock->m = 5 * (clock->m1 + 2) + (clock->m2 + 2); + clock->p = clock->p1 * clock->p2; + clock->vco = refclk * clock->m / (clock->n + 2); + clock->dot = clock->vco / clock->p; +} + +/** + * Returns whether any output on the specified pipe is of the specified type + */ +bool intel_pipe_has_type(struct drm_crtc *crtc, int type) +{ + struct drm_device *dev = crtc->dev; + struct drm_mode_config *mode_config = &dev->mode_config; + struct intel_encoder *encoder; + + list_for_each_entry(encoder, &mode_config->encoder_list, base.head) + if (encoder->base.crtc == crtc && encoder->type == type) + return true; + + return false; +} + +#define INTELPllInvalid(s) do { /* DRM_DEBUG(s); */ return false; } while (0) +/** + * Returns whether the given set of divisors are valid for a given refclk with + * the given connectors. + */ + +static bool intel_PLL_is_valid(struct drm_device *dev, + const intel_limit_t *limit, + const intel_clock_t *clock) +{ + if (clock->p1 < limit->p1.min || limit->p1.max < clock->p1) + INTELPllInvalid("p1 out of range\n"); + if (clock->p < limit->p.min || limit->p.max < clock->p) + INTELPllInvalid("p out of range\n"); + if (clock->m2 < limit->m2.min || limit->m2.max < clock->m2) + INTELPllInvalid("m2 out of range\n"); + if (clock->m1 < limit->m1.min || limit->m1.max < clock->m1) + INTELPllInvalid("m1 out of range\n"); + if (clock->m1 <= clock->m2 && !IS_PINEVIEW(dev)) + INTELPllInvalid("m1 <= m2\n"); + if (clock->m < limit->m.min || limit->m.max < clock->m) + INTELPllInvalid("m out of range\n"); + if (clock->n < limit->n.min || limit->n.max < clock->n) + INTELPllInvalid("n out of range\n"); + if (clock->vco < limit->vco.min || limit->vco.max < clock->vco) + INTELPllInvalid("vco out of range\n"); + /* XXX: We may need to be checking "Dot clock" depending on the multiplier, + * connector, etc., rather than just a single range. + */ + if (clock->dot < limit->dot.min || limit->dot.max < clock->dot) + INTELPllInvalid("dot out of range\n"); + + return true; +} + +static bool +intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, + int target, int refclk, intel_clock_t *match_clock, + intel_clock_t *best_clock) + +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + intel_clock_t clock; + int err = target; + + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && + (I915_READ(LVDS)) != 0) { + /* + * For LVDS, if the panel is on, just rely on its current + * settings for dual-channel. We haven't figured out how to + * reliably set up different single/dual channel state, if we + * even can. + */ + if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) == + LVDS_CLKB_POWER_UP) + clock.p2 = limit->p2.p2_fast; + else + clock.p2 = limit->p2.p2_slow; + } else { + if (target < limit->p2.dot_limit) + clock.p2 = limit->p2.p2_slow; + else + clock.p2 = limit->p2.p2_fast; + } + + memset(best_clock, 0, sizeof(*best_clock)); + + for (clock.m1 = limit->m1.min; clock.m1 <= limit->m1.max; + clock.m1++) { + for (clock.m2 = limit->m2.min; + clock.m2 <= limit->m2.max; clock.m2++) { + /* m1 is always 0 in Pineview */ + if (clock.m2 >= clock.m1 && !IS_PINEVIEW(dev)) + break; + for (clock.n = limit->n.min; + clock.n <= limit->n.max; clock.n++) { + for (clock.p1 = limit->p1.min; + clock.p1 <= limit->p1.max; clock.p1++) { + int this_err; + + intel_clock(dev, refclk, &clock); + if (!intel_PLL_is_valid(dev, limit, + &clock)) + continue; + if (match_clock && + clock.p != match_clock->p) + continue; + + this_err = abs(clock.dot - target); + if (this_err < err) { + *best_clock = clock; + err = this_err; + } + } + } + } + } + + return (err != target); +} + +static bool +intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, + int target, int refclk, intel_clock_t *match_clock, + intel_clock_t *best_clock) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + intel_clock_t clock; + int max_n; + bool found; + /* approximately equals target * 0.00585 */ + int err_most = (target >> 8) + (target >> 9); + found = false; + + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { + int lvds_reg; + + if (HAS_PCH_SPLIT(dev)) + lvds_reg = PCH_LVDS; + else + lvds_reg = LVDS; + if ((I915_READ(lvds_reg) & LVDS_CLKB_POWER_MASK) == + LVDS_CLKB_POWER_UP) + clock.p2 = limit->p2.p2_fast; + else + clock.p2 = limit->p2.p2_slow; + } else { + if (target < limit->p2.dot_limit) + clock.p2 = limit->p2.p2_slow; + else + clock.p2 = limit->p2.p2_fast; + } + + memset(best_clock, 0, sizeof(*best_clock)); + max_n = limit->n.max; + /* based on hardware requirement, prefer smaller n to precision */ + for (clock.n = limit->n.min; clock.n <= max_n; clock.n++) { + /* based on hardware requirement, prefere larger m1,m2 */ + for (clock.m1 = limit->m1.max; + clock.m1 >= limit->m1.min; clock.m1--) { + for (clock.m2 = limit->m2.max; + clock.m2 >= limit->m2.min; clock.m2--) { + for (clock.p1 = limit->p1.max; + clock.p1 >= limit->p1.min; clock.p1--) { + int this_err; + + intel_clock(dev, refclk, &clock); + if (!intel_PLL_is_valid(dev, limit, + &clock)) + continue; + if (match_clock && + clock.p != match_clock->p) + continue; + + this_err = abs(clock.dot - target); + if (this_err < err_most) { + *best_clock = clock; + err_most = this_err; + max_n = clock.n; + found = true; + } + } + } + } + } + return found; +} + +static bool +intel_find_pll_ironlake_dp(const intel_limit_t *limit, struct drm_crtc *crtc, + int target, int refclk, intel_clock_t *match_clock, + intel_clock_t *best_clock) +{ + struct drm_device *dev = crtc->dev; + intel_clock_t clock; + + if (target < 200000) { + clock.n = 1; + clock.p1 = 2; + clock.p2 = 10; + clock.m1 = 12; + clock.m2 = 9; + } else { + clock.n = 2; + clock.p1 = 1; + clock.p2 = 10; + clock.m1 = 14; + clock.m2 = 8; + } + intel_clock(dev, refclk, &clock); + memcpy(best_clock, &clock, sizeof(intel_clock_t)); + return true; +} + +/* DisplayPort has only two frequencies, 162MHz and 270MHz */ +static bool +intel_find_pll_g4x_dp(const intel_limit_t *limit, struct drm_crtc *crtc, + int target, int refclk, intel_clock_t *match_clock, + intel_clock_t *best_clock) +{ + intel_clock_t clock; + if (target < 200000) { + clock.p1 = 2; + clock.p2 = 10; + clock.n = 2; + clock.m1 = 23; + clock.m2 = 8; + } else { + clock.p1 = 1; + clock.p2 = 10; + clock.n = 1; + clock.m1 = 14; + clock.m2 = 2; + } + clock.m = 5 * (clock.m1 + 2) + (clock.m2 + 2); + clock.p = (clock.p1 * clock.p2); + clock.dot = 96000 * clock.m / (clock.n + 2) / clock.p; + clock.vco = 0; + memcpy(best_clock, &clock, sizeof(intel_clock_t)); + return true; +} + +/** + * intel_wait_for_vblank - wait for vblank on a given pipe + * @dev: drm device + * @pipe: pipe to wait for + * + * Wait for vblank to occur on a given pipe. Needed for various bits of + * mode setting code. + */ +void intel_wait_for_vblank(struct drm_device *dev, int pipe) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int pipestat_reg = PIPESTAT(pipe); + + /* Clear existing vblank status. Note this will clear any other + * sticky status fields as well. + * + * This races with i915_driver_irq_handler() with the result + * that either function could miss a vblank event. Here it is not + * fatal, as we will either wait upon the next vblank interrupt or + * timeout. Generally speaking intel_wait_for_vblank() is only + * called during modeset at which time the GPU should be idle and + * should *not* be performing page flips and thus not waiting on + * vblanks... + * Currently, the result of us stealing a vblank from the irq + * handler is that a single frame will be skipped during swapbuffers. + */ + I915_WRITE(pipestat_reg, + I915_READ(pipestat_reg) | PIPE_VBLANK_INTERRUPT_STATUS); + + /* Wait for vblank interrupt bit to set */ + if (_intel_wait_for(dev, + I915_READ(pipestat_reg) & PIPE_VBLANK_INTERRUPT_STATUS, + 50, 1, "915vbl")) + DRM_DEBUG_KMS("vblank wait timed out\n"); +} + +/* + * intel_wait_for_pipe_off - wait for pipe to turn off + * @dev: drm device + * @pipe: pipe to wait for + * + * After disabling a pipe, we can't wait for vblank in the usual way, + * spinning on the vblank interrupt status bit, since we won't actually + * see an interrupt when the pipe is disabled. + * + * On Gen4 and above: + * wait for the pipe register state bit to turn off + * + * Otherwise: + * wait for the display line value to settle (it usually + * ends up stopping at the start of the next frame). + * + */ +void intel_wait_for_pipe_off(struct drm_device *dev, int pipe) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + if (INTEL_INFO(dev)->gen >= 4) { + int reg = PIPECONF(pipe); + + /* Wait for the Pipe State to go off */ + if (_intel_wait_for(dev, + (I915_READ(reg) & I965_PIPECONF_ACTIVE) == 0, 100, + 1, "915pip")) + DRM_DEBUG_KMS("pipe_off wait timed out\n"); + } else { + u32 last_line; + int reg = PIPEDSL(pipe); + unsigned long timeout = jiffies + msecs_to_jiffies(100); + + /* Wait for the display line to settle */ + do { + last_line = I915_READ(reg) & DSL_LINEMASK; + DELAY(5000); + } while (((I915_READ(reg) & DSL_LINEMASK) != last_line) && + time_after(timeout, jiffies)); + if (time_after(jiffies, timeout)) + DRM_DEBUG_KMS("pipe_off wait timed out\n"); + } +} + +static const char *state_string(bool enabled) +{ + return enabled ? "on" : "off"; +} + +/* Only for pre-ILK configs */ +static void assert_pll(struct drm_i915_private *dev_priv, + enum pipe pipe, bool state) +{ + int reg; + u32 val; + bool cur_state; + + reg = DPLL(pipe); + val = I915_READ(reg); + cur_state = !!(val & DPLL_VCO_ENABLE); + if (cur_state != state) + printf("PLL state assertion failure (expected %s, current %s)\n", + state_string(state), state_string(cur_state)); +} +#define assert_pll_enabled(d, p) assert_pll(d, p, true) +#define assert_pll_disabled(d, p) assert_pll(d, p, false) + +/* For ILK+ */ +static void assert_pch_pll(struct drm_i915_private *dev_priv, + enum pipe pipe, bool state) +{ + int reg; + u32 val; + bool cur_state; + + if (HAS_PCH_CPT(dev_priv->dev)) { + u32 pch_dpll; + + pch_dpll = I915_READ(PCH_DPLL_SEL); + + /* Make sure the selected PLL is enabled to the transcoder */ + KASSERT(((pch_dpll >> (4 * pipe)) & 8) != 0, + ("transcoder %d PLL not enabled\n", pipe)); + + /* Convert the transcoder pipe number to a pll pipe number */ + pipe = (pch_dpll >> (4 * pipe)) & 1; + } + + reg = PCH_DPLL(pipe); + val = I915_READ(reg); + cur_state = !!(val & DPLL_VCO_ENABLE); + if (cur_state != state) + printf("PCH PLL state assertion failure (expected %s, current %s)\n", + state_string(state), state_string(cur_state)); +} +#define assert_pch_pll_enabled(d, p) assert_pch_pll(d, p, true) +#define assert_pch_pll_disabled(d, p) assert_pch_pll(d, p, false) + +static void assert_fdi_tx(struct drm_i915_private *dev_priv, + enum pipe pipe, bool state) +{ + int reg; + u32 val; + bool cur_state; + + reg = FDI_TX_CTL(pipe); + val = I915_READ(reg); + cur_state = !!(val & FDI_TX_ENABLE); + if (cur_state != state) + printf("FDI TX state assertion failure (expected %s, current %s)\n", + state_string(state), state_string(cur_state)); +} +#define assert_fdi_tx_enabled(d, p) assert_fdi_tx(d, p, true) +#define assert_fdi_tx_disabled(d, p) assert_fdi_tx(d, p, false) + +static void assert_fdi_rx(struct drm_i915_private *dev_priv, + enum pipe pipe, bool state) +{ + int reg; + u32 val; + bool cur_state; + + reg = FDI_RX_CTL(pipe); + val = I915_READ(reg); + cur_state = !!(val & FDI_RX_ENABLE); + if (cur_state != state) + printf("FDI RX state assertion failure (expected %s, current %s)\n", + state_string(state), state_string(cur_state)); +} +#define assert_fdi_rx_enabled(d, p) assert_fdi_rx(d, p, true) +#define assert_fdi_rx_disabled(d, p) assert_fdi_rx(d, p, false) + +static void assert_fdi_tx_pll_enabled(struct drm_i915_private *dev_priv, + enum pipe pipe) +{ + int reg; + u32 val; + + /* ILK FDI PLL is always enabled */ + if (dev_priv->info->gen == 5) + return; + + reg = FDI_TX_CTL(pipe); + val = I915_READ(reg); + if (!(val & FDI_TX_PLL_ENABLE)) + printf("FDI TX PLL assertion failure, should be active but is disabled\n"); +} + +static void assert_fdi_rx_pll_enabled(struct drm_i915_private *dev_priv, + enum pipe pipe) +{ + int reg; + u32 val; + + reg = FDI_RX_CTL(pipe); + val = I915_READ(reg); + if (!(val & FDI_RX_PLL_ENABLE)) + printf("FDI RX PLL assertion failure, should be active but is disabled\n"); +} + +static void assert_panel_unlocked(struct drm_i915_private *dev_priv, + enum pipe pipe) +{ + int pp_reg, lvds_reg; + u32 val; + enum pipe panel_pipe = PIPE_A; + bool locked = true; + + if (HAS_PCH_SPLIT(dev_priv->dev)) { + pp_reg = PCH_PP_CONTROL; + lvds_reg = PCH_LVDS; + } else { + pp_reg = PP_CONTROL; + lvds_reg = LVDS; + } + + val = I915_READ(pp_reg); + if (!(val & PANEL_POWER_ON) || + ((val & PANEL_UNLOCK_REGS) == PANEL_UNLOCK_REGS)) + locked = false; + + if (I915_READ(lvds_reg) & LVDS_PIPEB_SELECT) + panel_pipe = PIPE_B; + + if (panel_pipe == pipe && locked) + printf("panel assertion failure, pipe %c regs locked\n", + pipe_name(pipe)); +} + +void assert_pipe(struct drm_i915_private *dev_priv, + enum pipe pipe, bool state) +{ + int reg; + u32 val; + bool cur_state; + + /* if we need the pipe A quirk it must be always on */ + if (pipe == PIPE_A && dev_priv->quirks & QUIRK_PIPEA_FORCE) + state = true; + + reg = PIPECONF(pipe); + val = I915_READ(reg); + cur_state = !!(val & PIPECONF_ENABLE); + if (cur_state != state) + printf("pipe %c assertion failure (expected %s, current %s)\n", + pipe_name(pipe), state_string(state), state_string(cur_state)); +} + +static void assert_plane(struct drm_i915_private *dev_priv, + enum plane plane, bool state) +{ + int reg; + u32 val; + bool cur_state; + + reg = DSPCNTR(plane); + val = I915_READ(reg); + cur_state = !!(val & DISPLAY_PLANE_ENABLE); + if (cur_state != state) + printf("plane %c assertion failure, (expected %s, current %s)\n", + plane_name(plane), state_string(state), state_string(cur_state)); +} + +#define assert_plane_enabled(d, p) assert_plane(d, p, true) +#define assert_plane_disabled(d, p) assert_plane(d, p, false) + +static void assert_planes_disabled(struct drm_i915_private *dev_priv, + enum pipe pipe) +{ + int reg, i; + u32 val; + int cur_pipe; + + /* Planes are fixed to pipes on ILK+ */ + if (HAS_PCH_SPLIT(dev_priv->dev)) { + reg = DSPCNTR(pipe); + val = I915_READ(reg); + if ((val & DISPLAY_PLANE_ENABLE) != 0) + printf("plane %c assertion failure, should be disabled but not\n", + plane_name(pipe)); + return; + } + + /* Need to check both planes against the pipe */ + for (i = 0; i < 2; i++) { + reg = DSPCNTR(i); + val = I915_READ(reg); + cur_pipe = (val & DISPPLANE_SEL_PIPE_MASK) >> + DISPPLANE_SEL_PIPE_SHIFT; + if ((val & DISPLAY_PLANE_ENABLE) && pipe == cur_pipe) + printf("plane %c assertion failure, should be off on pipe %c but is still active\n", + plane_name(i), pipe_name(pipe)); + } +} + +static void assert_pch_refclk_enabled(struct drm_i915_private *dev_priv) +{ + u32 val; + bool enabled; + + val = I915_READ(PCH_DREF_CONTROL); + enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK | + DREF_SUPERSPREAD_SOURCE_MASK)); + if (!enabled) + printf("PCH refclk assertion failure, should be active but is disabled\n"); +} + +static void assert_transcoder_disabled(struct drm_i915_private *dev_priv, + enum pipe pipe) +{ + int reg; + u32 val; + bool enabled; + + reg = TRANSCONF(pipe); + val = I915_READ(reg); + enabled = !!(val & TRANS_ENABLE); + if (enabled) + printf("transcoder assertion failed, should be off on pipe %c but is still active\n", + pipe_name(pipe)); +} + +static bool hdmi_pipe_enabled(struct drm_i915_private *dev_priv, + enum pipe pipe, u32 val) +{ + if ((val & PORT_ENABLE) == 0) + return false; + + if (HAS_PCH_CPT(dev_priv->dev)) { + if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe)) + return false; + } else { + if ((val & TRANSCODER_MASK) != TRANSCODER(pipe)) + return false; + } + return true; +} + +static bool lvds_pipe_enabled(struct drm_i915_private *dev_priv, + enum pipe pipe, u32 val) +{ + if ((val & LVDS_PORT_EN) == 0) + return false; + + if (HAS_PCH_CPT(dev_priv->dev)) { + if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe)) + return false; + } else { + if ((val & LVDS_PIPE_MASK) != LVDS_PIPE(pipe)) + return false; + } + return true; +} + +static bool adpa_pipe_enabled(struct drm_i915_private *dev_priv, + enum pipe pipe, u32 val) +{ + if ((val & ADPA_DAC_ENABLE) == 0) + return false; + if (HAS_PCH_CPT(dev_priv->dev)) { + if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe)) + return false; + } else { + if ((val & ADPA_PIPE_SELECT_MASK) != ADPA_PIPE_SELECT(pipe)) + return false; + } + return true; +} + +static bool dp_pipe_enabled(struct drm_i915_private *dev_priv, + enum pipe pipe, u32 port_sel, u32 val) +{ + if ((val & DP_PORT_EN) == 0) + return false; + + if (HAS_PCH_CPT(dev_priv->dev)) { + u32 trans_dp_ctl_reg = TRANS_DP_CTL(pipe); + u32 trans_dp_ctl = I915_READ(trans_dp_ctl_reg); + if ((trans_dp_ctl & TRANS_DP_PORT_SEL_MASK) != port_sel) + return false; + } else { + if ((val & DP_PIPE_MASK) != (pipe << 30)) + return false; + } + return true; +} + +static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv, + enum pipe pipe, int reg, u32 port_sel) +{ + u32 val = I915_READ(reg); + if (dp_pipe_enabled(dev_priv, pipe, port_sel, val)) + printf("PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n", + reg, pipe_name(pipe)); +} + +static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv, + enum pipe pipe, int reg) +{ + u32 val = I915_READ(reg); + if (hdmi_pipe_enabled(dev_priv, val, pipe)) + printf("PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n", + reg, pipe_name(pipe)); +} + +static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv, + enum pipe pipe) +{ + int reg; + u32 val; + + assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_B, TRANS_DP_PORT_SEL_B); + assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_C, TRANS_DP_PORT_SEL_C); + assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_D, TRANS_DP_PORT_SEL_D); + + reg = PCH_ADPA; + val = I915_READ(reg); + if (adpa_pipe_enabled(dev_priv, val, pipe)) + printf("PCH VGA enabled on transcoder %c, should be disabled\n", + pipe_name(pipe)); + + reg = PCH_LVDS; + val = I915_READ(reg); + if (lvds_pipe_enabled(dev_priv, val, pipe)) + printf("PCH LVDS enabled on transcoder %c, should be disabled\n", + pipe_name(pipe)); + + assert_pch_hdmi_disabled(dev_priv, pipe, HDMIB); + assert_pch_hdmi_disabled(dev_priv, pipe, HDMIC); + assert_pch_hdmi_disabled(dev_priv, pipe, HDMID); +} + +/** + * intel_enable_pll - enable a PLL + * @dev_priv: i915 private structure + * @pipe: pipe PLL to enable + * + * Enable @pipe's PLL so we can start pumping pixels from a plane. Check to + * make sure the PLL reg is writable first though, since the panel write + * protect mechanism may be enabled. + * + * Note! This is for pre-ILK only. + */ +static void intel_enable_pll(struct drm_i915_private *dev_priv, enum pipe pipe) +{ + int reg; + u32 val; + + /* No really, not for ILK+ */ + KASSERT(dev_priv->info->gen < 5, ("Wrong device gen")); + + /* PLL is protected by panel, make sure we can write it */ + if (IS_MOBILE(dev_priv->dev) && !IS_I830(dev_priv->dev)) + assert_panel_unlocked(dev_priv, pipe); + + reg = DPLL(pipe); + val = I915_READ(reg); + val |= DPLL_VCO_ENABLE; + + /* We do this three times for luck */ + I915_WRITE(reg, val); + POSTING_READ(reg); + DELAY(150); /* wait for warmup */ + I915_WRITE(reg, val); + POSTING_READ(reg); + DELAY(150); /* wait for warmup */ + I915_WRITE(reg, val); + POSTING_READ(reg); + DELAY(150); /* wait for warmup */ +} + +/** + * intel_disable_pll - disable a PLL + * @dev_priv: i915 private structure + * @pipe: pipe PLL to disable + * + * Disable the PLL for @pipe, making sure the pipe is off first. + * + * Note! This is for pre-ILK only. + */ +static void intel_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe) +{ + int reg; + u32 val; + + /* Don't disable pipe A or pipe A PLLs if needed */ + if (pipe == PIPE_A && (dev_priv->quirks & QUIRK_PIPEA_FORCE)) + return; + + /* Make sure the pipe isn't still relying on us */ + assert_pipe_disabled(dev_priv, pipe); + + reg = DPLL(pipe); + val = I915_READ(reg); + val &= ~DPLL_VCO_ENABLE; + I915_WRITE(reg, val); + POSTING_READ(reg); +} + +/** + * intel_enable_pch_pll - enable PCH PLL + * @dev_priv: i915 private structure + * @pipe: pipe PLL to enable + * + * The PCH PLL needs to be enabled before the PCH transcoder, since it + * drives the transcoder clock. + */ +static void intel_enable_pch_pll(struct drm_i915_private *dev_priv, + enum pipe pipe) +{ + int reg; + u32 val; + + if (pipe > 1) + return; + + /* PCH only available on ILK+ */ + KASSERT(dev_priv->info->gen >= 5, ("Wrong device gen")); + + /* PCH refclock must be enabled first */ + assert_pch_refclk_enabled(dev_priv); + + reg = PCH_DPLL(pipe); + val = I915_READ(reg); + val |= DPLL_VCO_ENABLE; + I915_WRITE(reg, val); + POSTING_READ(reg); + DELAY(200); +} + +static void intel_disable_pch_pll(struct drm_i915_private *dev_priv, + enum pipe pipe) +{ + int reg; + u32 val, pll_mask = TRANSC_DPLL_ENABLE | TRANSC_DPLLB_SEL, + pll_sel = TRANSC_DPLL_ENABLE; + + if (pipe > 1) + return; + + /* PCH only available on ILK+ */ + KASSERT(dev_priv->info->gen >= 5, ("Wrong device gen")); + + /* Make sure transcoder isn't still depending on us */ + assert_transcoder_disabled(dev_priv, pipe); + + if (pipe == 0) + pll_sel |= TRANSC_DPLLA_SEL; + else if (pipe == 1) + pll_sel |= TRANSC_DPLLB_SEL; + + + if ((I915_READ(PCH_DPLL_SEL) & pll_mask) == pll_sel) + return; + + reg = PCH_DPLL(pipe); + val = I915_READ(reg); + val &= ~DPLL_VCO_ENABLE; + I915_WRITE(reg, val); + POSTING_READ(reg); + DELAY(200); +} + +static void intel_enable_transcoder(struct drm_i915_private *dev_priv, + enum pipe pipe) +{ + int reg; + u32 val, pipeconf_val; + struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; + + /* PCH only available on ILK+ */ + KASSERT(dev_priv->info->gen >= 5, ("Wrong device gen")); + + /* Make sure PCH DPLL is enabled */ + assert_pch_pll_enabled(dev_priv, pipe); + + /* FDI must be feeding us bits for PCH ports */ + assert_fdi_tx_enabled(dev_priv, pipe); + assert_fdi_rx_enabled(dev_priv, pipe); + + + reg = TRANSCONF(pipe); + val = I915_READ(reg); + pipeconf_val = I915_READ(PIPECONF(pipe)); + + if (HAS_PCH_IBX(dev_priv->dev)) { + /* + * make the BPC in transcoder be consistent with + * that in pipeconf reg. + */ + val &= ~PIPE_BPC_MASK; + val |= pipeconf_val & PIPE_BPC_MASK; + } + + val &= ~TRANS_INTERLACE_MASK; + if ((pipeconf_val & PIPECONF_INTERLACE_MASK) == PIPECONF_INTERLACED_ILK) + if (HAS_PCH_IBX(dev_priv->dev) && + intel_pipe_has_type(crtc, INTEL_OUTPUT_SDVO)) + val |= TRANS_LEGACY_INTERLACED_ILK; + else + val |= TRANS_INTERLACED; + else + val |= TRANS_PROGRESSIVE; + + I915_WRITE(reg, val | TRANS_ENABLE); + if (_intel_wait_for(dev_priv->dev, I915_READ(reg) & TRANS_STATE_ENABLE, + 100, 1, "915trc")) + DRM_ERROR("failed to enable transcoder %d\n", pipe); +} + +static void intel_disable_transcoder(struct drm_i915_private *dev_priv, + enum pipe pipe) +{ + int reg; + u32 val; + + /* FDI relies on the transcoder */ + assert_fdi_tx_disabled(dev_priv, pipe); + assert_fdi_rx_disabled(dev_priv, pipe); + + /* Ports must be off as well */ + assert_pch_ports_disabled(dev_priv, pipe); + + reg = TRANSCONF(pipe); + val = I915_READ(reg); + val &= ~TRANS_ENABLE; + I915_WRITE(reg, val); + /* wait for PCH transcoder off, transcoder state */ + if (_intel_wait_for(dev_priv->dev, + (I915_READ(reg) & TRANS_STATE_ENABLE) == 0, 50, + 1, "915trd")) + DRM_ERROR("failed to disable transcoder %d\n", pipe); +} + +/** + * intel_enable_pipe - enable a pipe, asserting requirements + * @dev_priv: i915 private structure + * @pipe: pipe to enable + * @pch_port: on ILK+, is this pipe driving a PCH port or not + * + * Enable @pipe, making sure that various hardware specific requirements + * are met, if applicable, e.g. PLL enabled, LVDS pairs enabled, etc. + * + * @pipe should be %PIPE_A or %PIPE_B. + * + * Will wait until the pipe is actually running (i.e. first vblank) before + * returning. + */ +static void intel_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe, + bool pch_port) +{ + int reg; + u32 val; + + /* + * A pipe without a PLL won't actually be able to drive bits from + * a plane. On ILK+ the pipe PLLs are integrated, so we don't + * need the check. + */ + if (!HAS_PCH_SPLIT(dev_priv->dev)) + assert_pll_enabled(dev_priv, pipe); + else { + if (pch_port) { + /* if driving the PCH, we need FDI enabled */ + assert_fdi_rx_pll_enabled(dev_priv, pipe); + assert_fdi_tx_pll_enabled(dev_priv, pipe); + } + /* FIXME: assert CPU port conditions for SNB+ */ + } + + reg = PIPECONF(pipe); + val = I915_READ(reg); + if (val & PIPECONF_ENABLE) + return; + + I915_WRITE(reg, val | PIPECONF_ENABLE); + intel_wait_for_vblank(dev_priv->dev, pipe); +} + +/** + * intel_disable_pipe - disable a pipe, asserting requirements + * @dev_priv: i915 private structure + * @pipe: pipe to disable + * + * Disable @pipe, making sure that various hardware specific requirements + * are met, if applicable, e.g. plane disabled, panel fitter off, etc. + * + * @pipe should be %PIPE_A or %PIPE_B. + * + * Will wait until the pipe has shut down before returning. + */ +static void intel_disable_pipe(struct drm_i915_private *dev_priv, + enum pipe pipe) +{ + int reg; + u32 val; + + /* + * Make sure planes won't keep trying to pump pixels to us, + * or we might hang the display. + */ + assert_planes_disabled(dev_priv, pipe); + + /* Don't disable pipe A or pipe A PLLs if needed */ + if (pipe == PIPE_A && (dev_priv->quirks & QUIRK_PIPEA_FORCE)) + return; + + reg = PIPECONF(pipe); + val = I915_READ(reg); + if ((val & PIPECONF_ENABLE) == 0) + return; + + I915_WRITE(reg, val & ~PIPECONF_ENABLE); + intel_wait_for_pipe_off(dev_priv->dev, pipe); +} + +/* + * Plane regs are double buffered, going from enabled->disabled needs a + * trigger in order to latch. The display address reg provides this. + */ +static void intel_flush_display_plane(struct drm_i915_private *dev_priv, + enum plane plane) +{ + I915_WRITE(DSPADDR(plane), I915_READ(DSPADDR(plane))); + I915_WRITE(DSPSURF(plane), I915_READ(DSPSURF(plane))); +} + +/** + * intel_enable_plane - enable a display plane on a given pipe + * @dev_priv: i915 private structure + * @plane: plane to enable + * @pipe: pipe being fed + * + * Enable @plane on @pipe, making sure that @pipe is running first. + */ +static void intel_enable_plane(struct drm_i915_private *dev_priv, + enum plane plane, enum pipe pipe) +{ + int reg; + u32 val; + + /* If the pipe isn't enabled, we can't pump pixels and may hang */ + assert_pipe_enabled(dev_priv, pipe); + + reg = DSPCNTR(plane); + val = I915_READ(reg); + if (val & DISPLAY_PLANE_ENABLE) + return; + + I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE); + intel_flush_display_plane(dev_priv, plane); + intel_wait_for_vblank(dev_priv->dev, pipe); +} + +/** + * intel_disable_plane - disable a display plane + * @dev_priv: i915 private structure + * @plane: plane to disable + * @pipe: pipe consuming the data + * + * Disable @plane; should be an independent operation. + */ +static void intel_disable_plane(struct drm_i915_private *dev_priv, + enum plane plane, enum pipe pipe) +{ + int reg; + u32 val; + + reg = DSPCNTR(plane); + val = I915_READ(reg); + if ((val & DISPLAY_PLANE_ENABLE) == 0) + return; + + I915_WRITE(reg, val & ~DISPLAY_PLANE_ENABLE); + intel_flush_display_plane(dev_priv, plane); + intel_wait_for_vblank(dev_priv->dev, pipe); +} + +static void disable_pch_dp(struct drm_i915_private *dev_priv, + enum pipe pipe, int reg, u32 port_sel) +{ + u32 val = I915_READ(reg); + if (dp_pipe_enabled(dev_priv, pipe, port_sel, val)) { + DRM_DEBUG_KMS("Disabling pch dp %x on pipe %d\n", reg, pipe); + I915_WRITE(reg, val & ~DP_PORT_EN); + } +} + +static void disable_pch_hdmi(struct drm_i915_private *dev_priv, + enum pipe pipe, int reg) +{ + u32 val = I915_READ(reg); + if (hdmi_pipe_enabled(dev_priv, val, pipe)) { + DRM_DEBUG_KMS("Disabling pch HDMI %x on pipe %d\n", + reg, pipe); + I915_WRITE(reg, val & ~PORT_ENABLE); + } +} + +/* Disable any ports connected to this transcoder */ +static void intel_disable_pch_ports(struct drm_i915_private *dev_priv, + enum pipe pipe) +{ + u32 reg, val; + + val = I915_READ(PCH_PP_CONTROL); + I915_WRITE(PCH_PP_CONTROL, val | PANEL_UNLOCK_REGS); + + disable_pch_dp(dev_priv, pipe, PCH_DP_B, TRANS_DP_PORT_SEL_B); + disable_pch_dp(dev_priv, pipe, PCH_DP_C, TRANS_DP_PORT_SEL_C); + disable_pch_dp(dev_priv, pipe, PCH_DP_D, TRANS_DP_PORT_SEL_D); + + reg = PCH_ADPA; + val = I915_READ(reg); + if (adpa_pipe_enabled(dev_priv, val, pipe)) + I915_WRITE(reg, val & ~ADPA_DAC_ENABLE); + + reg = PCH_LVDS; + val = I915_READ(reg); + if (lvds_pipe_enabled(dev_priv, val, pipe)) { + DRM_DEBUG_KMS("disable lvds on pipe %d val 0x%08x\n", pipe, val); + I915_WRITE(reg, val & ~LVDS_PORT_EN); + POSTING_READ(reg); + DELAY(100); + } + + disable_pch_hdmi(dev_priv, pipe, HDMIB); + disable_pch_hdmi(dev_priv, pipe, HDMIC); + disable_pch_hdmi(dev_priv, pipe, HDMID); +} + +static void i8xx_disable_fbc(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 fbc_ctl; + + /* Disable compression */ + fbc_ctl = I915_READ(FBC_CONTROL); + if ((fbc_ctl & FBC_CTL_EN) == 0) + return; + + fbc_ctl &= ~FBC_CTL_EN; + I915_WRITE(FBC_CONTROL, fbc_ctl); + + /* Wait for compressing bit to clear */ + if (_intel_wait_for(dev, + (I915_READ(FBC_STATUS) & FBC_STAT_COMPRESSING) == 0, 10, + 1, "915fbd")) { + DRM_DEBUG_KMS("FBC idle timed out\n"); + return; + } + + DRM_DEBUG_KMS("disabled FBC\n"); +} + +static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_framebuffer *fb = crtc->fb; + struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); + struct drm_i915_gem_object *obj = intel_fb->obj; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int cfb_pitch; + int plane, i; + u32 fbc_ctl, fbc_ctl2; + + cfb_pitch = dev_priv->cfb_size / FBC_LL_SIZE; + if (fb->pitches[0] < cfb_pitch) + cfb_pitch = fb->pitches[0]; + + /* FBC_CTL wants 64B units */ + cfb_pitch = (cfb_pitch / 64) - 1; + plane = intel_crtc->plane == 0 ? FBC_CTL_PLANEA : FBC_CTL_PLANEB; + + /* Clear old tags */ + for (i = 0; i < (FBC_LL_SIZE / 32) + 1; i++) + I915_WRITE(FBC_TAG + (i * 4), 0); + + /* Set it up... */ + fbc_ctl2 = FBC_CTL_FENCE_DBL | FBC_CTL_IDLE_IMM | FBC_CTL_CPU_FENCE; + fbc_ctl2 |= plane; + I915_WRITE(FBC_CONTROL2, fbc_ctl2); + I915_WRITE(FBC_FENCE_OFF, crtc->y); + + /* enable it... */ + fbc_ctl = FBC_CTL_EN | FBC_CTL_PERIODIC; + if (IS_I945GM(dev)) + fbc_ctl |= FBC_CTL_C3_IDLE; /* 945 needs special SR handling */ + fbc_ctl |= (cfb_pitch & 0xff) << FBC_CTL_STRIDE_SHIFT; + fbc_ctl |= (interval & 0x2fff) << FBC_CTL_INTERVAL_SHIFT; + fbc_ctl |= obj->fence_reg; + I915_WRITE(FBC_CONTROL, fbc_ctl); + + DRM_DEBUG_KMS("enabled FBC, pitch %d, yoff %d, plane %d, ", + cfb_pitch, crtc->y, intel_crtc->plane); +} + +static bool i8xx_fbc_enabled(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + return I915_READ(FBC_CONTROL) & FBC_CTL_EN; +} + +static void g4x_enable_fbc(struct drm_crtc *crtc, unsigned long interval) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_framebuffer *fb = crtc->fb; + struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); + struct drm_i915_gem_object *obj = intel_fb->obj; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int plane = intel_crtc->plane == 0 ? DPFC_CTL_PLANEA : DPFC_CTL_PLANEB; + unsigned long stall_watermark = 200; + u32 dpfc_ctl; + + dpfc_ctl = plane | DPFC_SR_EN | DPFC_CTL_LIMIT_1X; + dpfc_ctl |= DPFC_CTL_FENCE_EN | obj->fence_reg; + I915_WRITE(DPFC_CHICKEN, DPFC_HT_MODIFY); + + I915_WRITE(DPFC_RECOMP_CTL, DPFC_RECOMP_STALL_EN | + (stall_watermark << DPFC_RECOMP_STALL_WM_SHIFT) | + (interval << DPFC_RECOMP_TIMER_COUNT_SHIFT)); + I915_WRITE(DPFC_FENCE_YOFF, crtc->y); + + /* enable it... */ + I915_WRITE(DPFC_CONTROL, I915_READ(DPFC_CONTROL) | DPFC_CTL_EN); + + DRM_DEBUG_KMS("enabled fbc on plane %d\n", intel_crtc->plane); +} + +static void g4x_disable_fbc(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 dpfc_ctl; + + /* Disable compression */ + dpfc_ctl = I915_READ(DPFC_CONTROL); + if (dpfc_ctl & DPFC_CTL_EN) { + dpfc_ctl &= ~DPFC_CTL_EN; + I915_WRITE(DPFC_CONTROL, dpfc_ctl); + + DRM_DEBUG_KMS("disabled FBC\n"); + } +} + +static bool g4x_fbc_enabled(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + return I915_READ(DPFC_CONTROL) & DPFC_CTL_EN; +} + +static void sandybridge_blit_fbc_update(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 blt_ecoskpd; + + /* Make sure blitter notifies FBC of writes */ + gen6_gt_force_wake_get(dev_priv); + blt_ecoskpd = I915_READ(GEN6_BLITTER_ECOSKPD); + blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY << + GEN6_BLITTER_LOCK_SHIFT; + I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd); + blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY; + I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd); + blt_ecoskpd &= ~(GEN6_BLITTER_FBC_NOTIFY << + GEN6_BLITTER_LOCK_SHIFT); + I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd); + POSTING_READ(GEN6_BLITTER_ECOSKPD); + gen6_gt_force_wake_put(dev_priv); +} + +static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_framebuffer *fb = crtc->fb; + struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); + struct drm_i915_gem_object *obj = intel_fb->obj; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int plane = intel_crtc->plane == 0 ? DPFC_CTL_PLANEA : DPFC_CTL_PLANEB; + unsigned long stall_watermark = 200; + u32 dpfc_ctl; + + dpfc_ctl = I915_READ(ILK_DPFC_CONTROL); + dpfc_ctl &= DPFC_RESERVED; + dpfc_ctl |= (plane | DPFC_CTL_LIMIT_1X); + /* Set persistent mode for front-buffer rendering, ala X. */ + dpfc_ctl |= DPFC_CTL_PERSISTENT_MODE; + dpfc_ctl |= (DPFC_CTL_FENCE_EN | obj->fence_reg); + I915_WRITE(ILK_DPFC_CHICKEN, DPFC_HT_MODIFY); + + I915_WRITE(ILK_DPFC_RECOMP_CTL, DPFC_RECOMP_STALL_EN | + (stall_watermark << DPFC_RECOMP_STALL_WM_SHIFT) | + (interval << DPFC_RECOMP_TIMER_COUNT_SHIFT)); + I915_WRITE(ILK_DPFC_FENCE_YOFF, crtc->y); + I915_WRITE(ILK_FBC_RT_BASE, obj->gtt_offset | ILK_FBC_RT_VALID); + /* enable it... */ + I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN); + + if (IS_GEN6(dev)) { + I915_WRITE(SNB_DPFC_CTL_SA, + SNB_CPU_FENCE_ENABLE | obj->fence_reg); + I915_WRITE(DPFC_CPU_FENCE_OFFSET, crtc->y); + sandybridge_blit_fbc_update(dev); + } + + DRM_DEBUG_KMS("enabled fbc on plane %d\n", intel_crtc->plane); +} + +static void ironlake_disable_fbc(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 dpfc_ctl; + + /* Disable compression */ + dpfc_ctl = I915_READ(ILK_DPFC_CONTROL); + if (dpfc_ctl & DPFC_CTL_EN) { + dpfc_ctl &= ~DPFC_CTL_EN; + I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl); + + DRM_DEBUG_KMS("disabled FBC\n"); + } +} + +static bool ironlake_fbc_enabled(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + return I915_READ(ILK_DPFC_CONTROL) & DPFC_CTL_EN; +} + +bool intel_fbc_enabled(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + if (!dev_priv->display.fbc_enabled) + return false; + + return dev_priv->display.fbc_enabled(dev); +} + +static void intel_fbc_work_fn(void *arg, int pending) +{ + struct intel_fbc_work *work = arg; + struct drm_device *dev = work->crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + + DRM_LOCK(dev); + if (work == dev_priv->fbc_work) { + /* Double check that we haven't switched fb without cancelling + * the prior work. + */ + if (work->crtc->fb == work->fb) { + dev_priv->display.enable_fbc(work->crtc, + work->interval); + + dev_priv->cfb_plane = to_intel_crtc(work->crtc)->plane; + dev_priv->cfb_fb = work->crtc->fb->base.id; + dev_priv->cfb_y = work->crtc->y; + } + + dev_priv->fbc_work = NULL; + } + DRM_UNLOCK(dev); + + free(work, DRM_MEM_KMS); +} + +static void intel_cancel_fbc_work(struct drm_i915_private *dev_priv) +{ + u_int pending; + + if (dev_priv->fbc_work == NULL) + return; + + DRM_DEBUG_KMS("cancelling pending FBC enable\n"); + + /* Synchronisation is provided by struct_mutex and checking of + * dev_priv->fbc_work, so we can perform the cancellation + * entirely asynchronously. + */ + if (taskqueue_cancel_timeout(dev_priv->tq, &dev_priv->fbc_work->task, + &pending) == 0) + /* tasklet was killed before being run, clean up */ + free(dev_priv->fbc_work, DRM_MEM_KMS); + + /* Mark the work as no longer wanted so that if it does + * wake-up (because the work was already running and waiting + * for our mutex), it will discover that is no longer + * necessary to run. + */ + dev_priv->fbc_work = NULL; +} + +static void intel_enable_fbc(struct drm_crtc *crtc, unsigned long interval) +{ + struct intel_fbc_work *work; + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + + if (!dev_priv->display.enable_fbc) + return; + + intel_cancel_fbc_work(dev_priv); + + work = malloc(sizeof(*work), DRM_MEM_KMS, M_WAITOK | M_ZERO); + work->crtc = crtc; + work->fb = crtc->fb; + work->interval = interval; + TIMEOUT_TASK_INIT(dev_priv->tq, &work->task, 0, intel_fbc_work_fn, + work); + + dev_priv->fbc_work = work; + + DRM_DEBUG_KMS("scheduling delayed FBC enable\n"); + + /* Delay the actual enabling to let pageflipping cease and the + * display to settle before starting the compression. Note that + * this delay also serves a second purpose: it allows for a + * vblank to pass after disabling the FBC before we attempt + * to modify the control registers. + * + * A more complicated solution would involve tracking vblanks + * following the termination of the page-flipping sequence + * and indeed performing the enable as a co-routine and not + * waiting synchronously upon the vblank. + */ + taskqueue_enqueue_timeout(dev_priv->tq, &work->task, + msecs_to_jiffies(50)); +} + +void intel_disable_fbc(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + intel_cancel_fbc_work(dev_priv); + + if (!dev_priv->display.disable_fbc) + return; + + dev_priv->display.disable_fbc(dev); + dev_priv->cfb_plane = -1; +} + +/** + * intel_update_fbc - enable/disable FBC as needed + * @dev: the drm_device + * + * Set up the framebuffer compression hardware at mode set time. We + * enable it if possible: + * - plane A only (on pre-965) + * - no pixel mulitply/line duplication + * - no alpha buffer discard + * - no dual wide + * - framebuffer <= 2048 in width, 1536 in height + * + * We can't assume that any compression will take place (worst case), + * so the compressed buffer has to be the same size as the uncompressed + * one. It also must reside (along with the line length buffer) in + * stolen memory. + * + * We need to enable/disable FBC on a global basis. + */ +static void intel_update_fbc(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_crtc *crtc = NULL, *tmp_crtc; + struct intel_crtc *intel_crtc; + struct drm_framebuffer *fb; + struct intel_framebuffer *intel_fb; + struct drm_i915_gem_object *obj; + int enable_fbc; + + DRM_DEBUG_KMS("\n"); + + if (!i915_powersave) + return; + + if (!I915_HAS_FBC(dev)) + return; + + /* + * If FBC is already on, we just have to verify that we can + * keep it that way... + * Need to disable if: + * - more than one pipe is active + * - changing FBC params (stride, fence, mode) + * - new fb is too large to fit in compressed buffer + * - going to an unsupported config (interlace, pixel multiply, etc.) + */ + list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) { + if (tmp_crtc->enabled && tmp_crtc->fb) { + if (crtc) { + DRM_DEBUG_KMS("more than one pipe active, disabling compression\n"); + dev_priv->no_fbc_reason = FBC_MULTIPLE_PIPES; + goto out_disable; + } + crtc = tmp_crtc; + } + } + + if (!crtc || crtc->fb == NULL) { + DRM_DEBUG_KMS("no output, disabling\n"); + dev_priv->no_fbc_reason = FBC_NO_OUTPUT; + goto out_disable; + } + + intel_crtc = to_intel_crtc(crtc); + fb = crtc->fb; + intel_fb = to_intel_framebuffer(fb); + obj = intel_fb->obj; + + enable_fbc = i915_enable_fbc; + if (enable_fbc < 0) { + DRM_DEBUG_KMS("fbc set to per-chip default\n"); + enable_fbc = 1; + if (INTEL_INFO(dev)->gen <= 6) + enable_fbc = 0; + } + if (!enable_fbc) { + DRM_DEBUG_KMS("fbc disabled per module param\n"); + dev_priv->no_fbc_reason = FBC_MODULE_PARAM; + goto out_disable; + } + if (intel_fb->obj->base.size > dev_priv->cfb_size) { + DRM_DEBUG_KMS("framebuffer too large, disabling " + "compression\n"); + dev_priv->no_fbc_reason = FBC_STOLEN_TOO_SMALL; + goto out_disable; + } + if ((crtc->mode.flags & DRM_MODE_FLAG_INTERLACE) || + (crtc->mode.flags & DRM_MODE_FLAG_DBLSCAN)) { + DRM_DEBUG_KMS("mode incompatible with compression, " + "disabling\n"); + dev_priv->no_fbc_reason = FBC_UNSUPPORTED_MODE; + goto out_disable; + } + if ((crtc->mode.hdisplay > 2048) || + (crtc->mode.vdisplay > 1536)) { + DRM_DEBUG_KMS("mode too large for compression, disabling\n"); + dev_priv->no_fbc_reason = FBC_MODE_TOO_LARGE; + goto out_disable; + } + if ((IS_I915GM(dev) || IS_I945GM(dev)) && intel_crtc->plane != 0) { + DRM_DEBUG_KMS("plane not 0, disabling compression\n"); + dev_priv->no_fbc_reason = FBC_BAD_PLANE; + goto out_disable; + } + if (obj->tiling_mode != I915_TILING_X || + obj->fence_reg == I915_FENCE_REG_NONE) { + DRM_DEBUG_KMS("framebuffer not tiled or fenced, disabling compression\n"); + dev_priv->no_fbc_reason = FBC_NOT_TILED; + goto out_disable; + } + + /* If the kernel debugger is active, always disable compression */ + if (kdb_active) + goto out_disable; + + /* If the scanout has not changed, don't modify the FBC settings. + * Note that we make the fundamental assumption that the fb->obj + * cannot be unpinned (and have its GTT offset and fence revoked) + * without first being decoupled from the scanout and FBC disabled. + */ + if (dev_priv->cfb_plane == intel_crtc->plane && + dev_priv->cfb_fb == fb->base.id && + dev_priv->cfb_y == crtc->y) + return; + + if (intel_fbc_enabled(dev)) { + /* We update FBC along two paths, after changing fb/crtc + * configuration (modeswitching) and after page-flipping + * finishes. For the latter, we know that not only did + * we disable the FBC at the start of the page-flip + * sequence, but also more than one vblank has passed. + * + * For the former case of modeswitching, it is possible + * to switch between two FBC valid configurations + * instantaneously so we do need to disable the FBC + * before we can modify its control registers. We also + * have to wait for the next vblank for that to take + * effect. However, since we delay enabling FBC we can + * assume that a vblank has passed since disabling and + * that we can safely alter the registers in the deferred + * callback. + * + * In the scenario that we go from a valid to invalid + * and then back to valid FBC configuration we have + * no strict enforcement that a vblank occurred since + * disabling the FBC. However, along all current pipe + * disabling paths we do need to wait for a vblank at + * some point. And we wait before enabling FBC anyway. + */ + DRM_DEBUG_KMS("disabling active FBC for update\n"); + intel_disable_fbc(dev); + } + + intel_enable_fbc(crtc, 500); + return; + +out_disable: + /* Multiple disables should be harmless */ + if (intel_fbc_enabled(dev)) { + DRM_DEBUG_KMS("unsupported config, disabling FBC\n"); + intel_disable_fbc(dev); + } +} + +int +intel_pin_and_fence_fb_obj(struct drm_device *dev, + struct drm_i915_gem_object *obj, + struct intel_ring_buffer *pipelined) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 alignment; + int ret; + + alignment = 0; /* shut gcc */ + switch (obj->tiling_mode) { + case I915_TILING_NONE: + if (IS_BROADWATER(dev) || IS_CRESTLINE(dev)) + alignment = 128 * 1024; + else if (INTEL_INFO(dev)->gen >= 4) + alignment = 4 * 1024; + else + alignment = 64 * 1024; + break; + case I915_TILING_X: + /* pin() will align the object as required by fence */ + alignment = 0; + break; + case I915_TILING_Y: + /* FIXME: Is this true? */ + DRM_ERROR("Y tiled not allowed for scan out buffers\n"); + return -EINVAL; + default: + KASSERT(0, ("Wrong tiling for fb obj")); + } + + dev_priv->mm.interruptible = false; + ret = i915_gem_object_pin_to_display_plane(obj, alignment, pipelined); + if (ret) + goto err_interruptible; + + /* Install a fence for tiled scan-out. Pre-i965 always needs a + * fence, whereas 965+ only requires a fence if using + * framebuffer compression. For simplicity, we always install + * a fence as the cost is not that onerous. + */ + if (obj->tiling_mode != I915_TILING_NONE) { + ret = i915_gem_object_get_fence(obj, pipelined); + if (ret) + goto err_unpin; + + i915_gem_object_pin_fence(obj); + } + + dev_priv->mm.interruptible = true; + return 0; + +err_unpin: + i915_gem_object_unpin(obj); +err_interruptible: + dev_priv->mm.interruptible = true; + return ret; +} + +void intel_unpin_fb_obj(struct drm_i915_gem_object *obj) +{ + i915_gem_object_unpin_fence(obj); + i915_gem_object_unpin(obj); +} + +static int i9xx_update_plane(struct drm_crtc *crtc, struct drm_framebuffer *fb, + int x, int y) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct intel_framebuffer *intel_fb; + struct drm_i915_gem_object *obj; + int plane = intel_crtc->plane; + unsigned long Start, Offset; + u32 dspcntr; + u32 reg; + + switch (plane) { + case 0: + case 1: + break; + default: + DRM_ERROR("Can't update plane %d in SAREA\n", plane); + return -EINVAL; + } + + intel_fb = to_intel_framebuffer(fb); + obj = intel_fb->obj; + + reg = DSPCNTR(plane); + dspcntr = I915_READ(reg); + /* Mask out pixel format bits in case we change it */ + dspcntr &= ~DISPPLANE_PIXFORMAT_MASK; + switch (fb->bits_per_pixel) { + case 8: + dspcntr |= DISPPLANE_8BPP; + break; + case 16: + if (fb->depth == 15) + dspcntr |= DISPPLANE_15_16BPP; + else + dspcntr |= DISPPLANE_16BPP; + break; + case 24: + case 32: + dspcntr |= DISPPLANE_32BPP_NO_ALPHA; + break; + default: + DRM_ERROR("Unknown color depth %d\n", fb->bits_per_pixel); + return -EINVAL; + } + if (INTEL_INFO(dev)->gen >= 4) { + if (obj->tiling_mode != I915_TILING_NONE) + dspcntr |= DISPPLANE_TILED; + else + dspcntr &= ~DISPPLANE_TILED; + } + + I915_WRITE(reg, dspcntr); + + Start = obj->gtt_offset; + Offset = y * fb->pitches[0] + x * (fb->bits_per_pixel / 8); + + DRM_DEBUG_KMS("Writing base %08lX %08lX %d %d %d\n", + Start, Offset, x, y, fb->pitches[0]); + I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]); + if (INTEL_INFO(dev)->gen >= 4) { + I915_WRITE(DSPSURF(plane), Start); + I915_WRITE(DSPTILEOFF(plane), (y << 16) | x); + I915_WRITE(DSPADDR(plane), Offset); + } else + I915_WRITE(DSPADDR(plane), Start + Offset); + POSTING_READ(reg); + + return (0); +} + +static int ironlake_update_plane(struct drm_crtc *crtc, + struct drm_framebuffer *fb, int x, int y) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct intel_framebuffer *intel_fb; + struct drm_i915_gem_object *obj; + int plane = intel_crtc->plane; + unsigned long Start, Offset; + u32 dspcntr; + u32 reg; + + switch (plane) { + case 0: + case 1: + case 2: + break; + default: + DRM_ERROR("Can't update plane %d in SAREA\n", plane); + return -EINVAL; + } + + intel_fb = to_intel_framebuffer(fb); + obj = intel_fb->obj; + + reg = DSPCNTR(plane); + dspcntr = I915_READ(reg); + /* Mask out pixel format bits in case we change it */ + dspcntr &= ~DISPPLANE_PIXFORMAT_MASK; + switch (fb->bits_per_pixel) { + case 8: + dspcntr |= DISPPLANE_8BPP; + break; + case 16: + if (fb->depth != 16) { + DRM_ERROR("bpp 16, depth %d\n", fb->depth); + return -EINVAL; + } + + dspcntr |= DISPPLANE_16BPP; + break; + case 24: + case 32: + if (fb->depth == 24) + dspcntr |= DISPPLANE_32BPP_NO_ALPHA; + else if (fb->depth == 30) + dspcntr |= DISPPLANE_32BPP_30BIT_NO_ALPHA; + else { + DRM_ERROR("bpp %d depth %d\n", fb->bits_per_pixel, + fb->depth); + return -EINVAL; + } + break; + default: + DRM_ERROR("Unknown color depth %d\n", fb->bits_per_pixel); + return -EINVAL; + } + + if (obj->tiling_mode != I915_TILING_NONE) + dspcntr |= DISPPLANE_TILED; + else + dspcntr &= ~DISPPLANE_TILED; + + /* must disable */ + dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE; + + I915_WRITE(reg, dspcntr); + + Start = obj->gtt_offset; + Offset = y * fb->pitches[0] + x * (fb->bits_per_pixel / 8); + + DRM_DEBUG_KMS("Writing base %08lX %08lX %d %d %d\n", + Start, Offset, x, y, fb->pitches[0]); + I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]); + I915_WRITE(DSPSURF(plane), Start); + I915_WRITE(DSPTILEOFF(plane), (y << 16) | x); + I915_WRITE(DSPADDR(plane), Offset); + POSTING_READ(reg); + + return 0; +} + +/* Assume fb object is pinned & idle & fenced and just update base pointers */ +static int +intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb, + int x, int y, enum mode_set_atomic state) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + int ret; + + ret = dev_priv->display.update_plane(crtc, fb, x, y); + if (ret) + return ret; + + intel_update_fbc(dev); + intel_increase_pllclock(crtc); + + return 0; +} + +static int +intel_finish_fb(struct drm_framebuffer *old_fb) +{ + struct drm_i915_gem_object *obj = to_intel_framebuffer(old_fb)->obj; + struct drm_device *dev = obj->base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + bool was_interruptible = dev_priv->mm.interruptible; + int ret; + + mtx_lock(&dev->event_lock); + while (!atomic_read(&dev_priv->mm.wedged) && + atomic_read(&obj->pending_flip) != 0) { + msleep(&obj->pending_flip, &dev->event_lock, + 0, "915flp", 0); + } + mtx_unlock(&dev->event_lock); + + /* Big Hammer, we also need to ensure that any pending + * MI_WAIT_FOR_EVENT inside a user batch buffer on the + * current scanout is retired before unpinning the old + * framebuffer. + * + * This should only fail upon a hung GPU, in which case we + * can safely continue. + */ + dev_priv->mm.interruptible = false; + ret = i915_gem_object_finish_gpu(obj); + dev_priv->mm.interruptible = was_interruptible; + return ret; +} + +static int +intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, + struct drm_framebuffer *old_fb) +{ + struct drm_device *dev = crtc->dev; +#if 0 + struct drm_i915_master_private *master_priv; +#else + drm_i915_private_t *dev_priv = dev->dev_private; +#endif + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int ret; + + /* no fb bound */ + if (!crtc->fb) { + DRM_ERROR("No FB bound\n"); + return 0; + } + + switch (intel_crtc->plane) { + case 0: + case 1: + break; + case 2: + if (IS_IVYBRIDGE(dev)) + break; + /* fall through otherwise */ + default: + DRM_ERROR("no plane for crtc\n"); + return -EINVAL; + } + + DRM_LOCK(dev); + ret = intel_pin_and_fence_fb_obj(dev, + to_intel_framebuffer(crtc->fb)->obj, + NULL); + if (ret != 0) { + DRM_UNLOCK(dev); + DRM_ERROR("pin & fence failed\n"); + return ret; + } + + if (old_fb) + intel_finish_fb(old_fb); + + ret = intel_pipe_set_base_atomic(crtc, crtc->fb, x, y, + LEAVE_ATOMIC_MODE_SET); + if (ret) { + intel_unpin_fb_obj(to_intel_framebuffer(crtc->fb)->obj); + DRM_UNLOCK(dev); + DRM_ERROR("failed to update base address\n"); + return ret; + } + + if (old_fb) { + intel_wait_for_vblank(dev, intel_crtc->pipe); + intel_unpin_fb_obj(to_intel_framebuffer(old_fb)->obj); + } + + DRM_UNLOCK(dev); + +#if 0 + if (!dev->primary->master) + return 0; + + master_priv = dev->primary->master->driver_priv; + if (!master_priv->sarea_priv) + return 0; + + if (intel_crtc->pipe) { + master_priv->sarea_priv->pipeB_x = x; + master_priv->sarea_priv->pipeB_y = y; + } else { + master_priv->sarea_priv->pipeA_x = x; + master_priv->sarea_priv->pipeA_y = y; + } +#else + + if (!dev_priv->sarea_priv) + return 0; + + if (intel_crtc->pipe) { + dev_priv->sarea_priv->planeB_x = x; + dev_priv->sarea_priv->planeB_y = y; + } else { + dev_priv->sarea_priv->planeA_x = x; + dev_priv->sarea_priv->planeA_y = y; + } +#endif + + return 0; +} + +static void ironlake_set_pll_edp(struct drm_crtc *crtc, int clock) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 dpa_ctl; + + DRM_DEBUG_KMS("eDP PLL enable for clock %d\n", clock); + dpa_ctl = I915_READ(DP_A); + dpa_ctl &= ~DP_PLL_FREQ_MASK; + + if (clock < 200000) { + u32 temp; + dpa_ctl |= DP_PLL_FREQ_160MHZ; + /* workaround for 160Mhz: + 1) program 0x4600c bits 15:0 = 0x8124 + 2) program 0x46010 bit 0 = 1 + 3) program 0x46034 bit 24 = 1 + 4) program 0x64000 bit 14 = 1 + */ + temp = I915_READ(0x4600c); + temp &= 0xffff0000; + I915_WRITE(0x4600c, temp | 0x8124); + + temp = I915_READ(0x46010); + I915_WRITE(0x46010, temp | 1); + + temp = I915_READ(0x46034); + I915_WRITE(0x46034, temp | (1 << 24)); + } else { + dpa_ctl |= DP_PLL_FREQ_270MHZ; + } + I915_WRITE(DP_A, dpa_ctl); + + POSTING_READ(DP_A); + DELAY(500); +} + +static void intel_fdi_normal_train(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + u32 reg, temp; + + /* enable normal train */ + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + if (IS_IVYBRIDGE(dev)) { + temp &= ~FDI_LINK_TRAIN_NONE_IVB; + temp |= FDI_LINK_TRAIN_NONE_IVB | FDI_TX_ENHANCE_FRAME_ENABLE; + } else { + temp &= ~FDI_LINK_TRAIN_NONE; + temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE; + } + I915_WRITE(reg, temp); + + reg = FDI_RX_CTL(pipe); + temp = I915_READ(reg); + if (HAS_PCH_CPT(dev)) { + temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT; + temp |= FDI_LINK_TRAIN_NORMAL_CPT; + } else { + temp &= ~FDI_LINK_TRAIN_NONE; + temp |= FDI_LINK_TRAIN_NONE; + } + I915_WRITE(reg, temp | FDI_RX_ENHANCE_FRAME_ENABLE); + + /* wait one idle pattern time */ + POSTING_READ(reg); + DELAY(1000); + + /* IVB wants error correction enabled */ + if (IS_IVYBRIDGE(dev)) + I915_WRITE(reg, I915_READ(reg) | FDI_FS_ERRC_ENABLE | + FDI_FE_ERRC_ENABLE); +} + +static void cpt_phase_pointer_enable(struct drm_device *dev, int pipe) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 flags = I915_READ(SOUTH_CHICKEN1); + + flags |= FDI_PHASE_SYNC_OVR(pipe); + I915_WRITE(SOUTH_CHICKEN1, flags); /* once to unlock... */ + flags |= FDI_PHASE_SYNC_EN(pipe); + I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to enable */ + POSTING_READ(SOUTH_CHICKEN1); +} + +/* The FDI link training functions for ILK/Ibexpeak. */ +static void ironlake_fdi_link_train(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + int plane = intel_crtc->plane; + u32 reg, temp, tries; + + /* FDI needs bits from pipe & plane first */ + assert_pipe_enabled(dev_priv, pipe); + assert_plane_enabled(dev_priv, plane); + + /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit + for train result */ + reg = FDI_RX_IMR(pipe); + temp = I915_READ(reg); + temp &= ~FDI_RX_SYMBOL_LOCK; + temp &= ~FDI_RX_BIT_LOCK; + I915_WRITE(reg, temp); + I915_READ(reg); + DELAY(150); + + /* enable CPU FDI TX and PCH FDI RX */ + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~(7 << 19); + temp |= (intel_crtc->fdi_lanes - 1) << 19; + temp &= ~FDI_LINK_TRAIN_NONE; + temp |= FDI_LINK_TRAIN_PATTERN_1; + I915_WRITE(reg, temp | FDI_TX_ENABLE); + + reg = FDI_RX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~FDI_LINK_TRAIN_NONE; + temp |= FDI_LINK_TRAIN_PATTERN_1; + I915_WRITE(reg, temp | FDI_RX_ENABLE); + + POSTING_READ(reg); + DELAY(150); + + /* Ironlake workaround, enable clock pointer after FDI enable*/ + if (HAS_PCH_IBX(dev)) { + I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR); + I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR | + FDI_RX_PHASE_SYNC_POINTER_EN); + } + + reg = FDI_RX_IIR(pipe); + for (tries = 0; tries < 5; tries++) { + temp = I915_READ(reg); + DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp); + + if ((temp & FDI_RX_BIT_LOCK)) { + DRM_DEBUG_KMS("FDI train 1 done.\n"); + I915_WRITE(reg, temp | FDI_RX_BIT_LOCK); + break; + } + } + if (tries == 5) + DRM_ERROR("FDI train 1 fail!\n"); + + /* Train 2 */ + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~FDI_LINK_TRAIN_NONE; + temp |= FDI_LINK_TRAIN_PATTERN_2; + I915_WRITE(reg, temp); + + reg = FDI_RX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~FDI_LINK_TRAIN_NONE; + temp |= FDI_LINK_TRAIN_PATTERN_2; + I915_WRITE(reg, temp); + + POSTING_READ(reg); + DELAY(150); + + reg = FDI_RX_IIR(pipe); + for (tries = 0; tries < 5; tries++) { + temp = I915_READ(reg); + DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp); + + if (temp & FDI_RX_SYMBOL_LOCK) { + I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK); + DRM_DEBUG_KMS("FDI train 2 done.\n"); + break; + } + } + if (tries == 5) + DRM_ERROR("FDI train 2 fail!\n"); + + DRM_DEBUG_KMS("FDI train done\n"); + +} + +static const int snb_b_fdi_train_param[] = { + FDI_LINK_TRAIN_400MV_0DB_SNB_B, + FDI_LINK_TRAIN_400MV_6DB_SNB_B, + FDI_LINK_TRAIN_600MV_3_5DB_SNB_B, + FDI_LINK_TRAIN_800MV_0DB_SNB_B, +}; + +/* The FDI link training functions for SNB/Cougarpoint. */ +static void gen6_fdi_link_train(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + u32 reg, temp, i; + + /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit + for train result */ + reg = FDI_RX_IMR(pipe); + temp = I915_READ(reg); + temp &= ~FDI_RX_SYMBOL_LOCK; + temp &= ~FDI_RX_BIT_LOCK; + I915_WRITE(reg, temp); + + POSTING_READ(reg); + DELAY(150); + + /* enable CPU FDI TX and PCH FDI RX */ + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~(7 << 19); + temp |= (intel_crtc->fdi_lanes - 1) << 19; + temp &= ~FDI_LINK_TRAIN_NONE; + temp |= FDI_LINK_TRAIN_PATTERN_1; + temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK; + /* SNB-B */ + temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B; + I915_WRITE(reg, temp | FDI_TX_ENABLE); + + reg = FDI_RX_CTL(pipe); + temp = I915_READ(reg); + if (HAS_PCH_CPT(dev)) { + temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT; + temp |= FDI_LINK_TRAIN_PATTERN_1_CPT; + } else { + temp &= ~FDI_LINK_TRAIN_NONE; + temp |= FDI_LINK_TRAIN_PATTERN_1; + } + I915_WRITE(reg, temp | FDI_RX_ENABLE); + + POSTING_READ(reg); + DELAY(150); + + if (HAS_PCH_CPT(dev)) + cpt_phase_pointer_enable(dev, pipe); + + for (i = 0; i < 4; i++) { + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK; + temp |= snb_b_fdi_train_param[i]; + I915_WRITE(reg, temp); + + POSTING_READ(reg); + DELAY(500); + + reg = FDI_RX_IIR(pipe); + temp = I915_READ(reg); + DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp); + + if (temp & FDI_RX_BIT_LOCK) { + I915_WRITE(reg, temp | FDI_RX_BIT_LOCK); + DRM_DEBUG_KMS("FDI train 1 done.\n"); + break; + } + } + if (i == 4) + DRM_ERROR("FDI train 1 fail!\n"); + + /* Train 2 */ + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~FDI_LINK_TRAIN_NONE; + temp |= FDI_LINK_TRAIN_PATTERN_2; + if (IS_GEN6(dev)) { + temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK; + /* SNB-B */ + temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B; + } + I915_WRITE(reg, temp); + + reg = FDI_RX_CTL(pipe); + temp = I915_READ(reg); + if (HAS_PCH_CPT(dev)) { + temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT; + temp |= FDI_LINK_TRAIN_PATTERN_2_CPT; + } else { + temp &= ~FDI_LINK_TRAIN_NONE; + temp |= FDI_LINK_TRAIN_PATTERN_2; + } + I915_WRITE(reg, temp); + + POSTING_READ(reg); + DELAY(150); + + for (i = 0; i < 4; i++) { + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK; + temp |= snb_b_fdi_train_param[i]; + I915_WRITE(reg, temp); + + POSTING_READ(reg); + DELAY(500); + + reg = FDI_RX_IIR(pipe); + temp = I915_READ(reg); + DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp); + + if (temp & FDI_RX_SYMBOL_LOCK) { + I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK); + DRM_DEBUG_KMS("FDI train 2 done.\n"); + break; + } + } + if (i == 4) + DRM_ERROR("FDI train 2 fail!\n"); + + DRM_DEBUG_KMS("FDI train done.\n"); +} + +/* Manual link training for Ivy Bridge A0 parts */ +static void ivb_manual_fdi_link_train(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + u32 reg, temp, i; + + /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit + for train result */ + reg = FDI_RX_IMR(pipe); + temp = I915_READ(reg); + temp &= ~FDI_RX_SYMBOL_LOCK; + temp &= ~FDI_RX_BIT_LOCK; + I915_WRITE(reg, temp); + + POSTING_READ(reg); + DELAY(150); + + /* enable CPU FDI TX and PCH FDI RX */ + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~(7 << 19); + temp |= (intel_crtc->fdi_lanes - 1) << 19; + temp &= ~(FDI_LINK_TRAIN_AUTO | FDI_LINK_TRAIN_NONE_IVB); + temp |= FDI_LINK_TRAIN_PATTERN_1_IVB; + temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK; + temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B; + temp |= FDI_COMPOSITE_SYNC; + I915_WRITE(reg, temp | FDI_TX_ENABLE); + + reg = FDI_RX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~FDI_LINK_TRAIN_AUTO; + temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT; + temp |= FDI_LINK_TRAIN_PATTERN_1_CPT; + temp |= FDI_COMPOSITE_SYNC; + I915_WRITE(reg, temp | FDI_RX_ENABLE); + + POSTING_READ(reg); + DELAY(150); + + for (i = 0; i < 4; i++) { + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK; + temp |= snb_b_fdi_train_param[i]; + I915_WRITE(reg, temp); + + POSTING_READ(reg); + DELAY(500); + + reg = FDI_RX_IIR(pipe); + temp = I915_READ(reg); + DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp); + + if (temp & FDI_RX_BIT_LOCK || + (I915_READ(reg) & FDI_RX_BIT_LOCK)) { + I915_WRITE(reg, temp | FDI_RX_BIT_LOCK); + DRM_DEBUG_KMS("FDI train 1 done.\n"); + break; + } + } + if (i == 4) + DRM_ERROR("FDI train 1 fail!\n"); + + /* Train 2 */ + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~FDI_LINK_TRAIN_NONE_IVB; + temp |= FDI_LINK_TRAIN_PATTERN_2_IVB; + temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK; + temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B; + I915_WRITE(reg, temp); + + reg = FDI_RX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT; + temp |= FDI_LINK_TRAIN_PATTERN_2_CPT; + I915_WRITE(reg, temp); + + POSTING_READ(reg); + DELAY(150); + + for (i = 0; i < 4; i++ ) { + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK; + temp |= snb_b_fdi_train_param[i]; + I915_WRITE(reg, temp); + + POSTING_READ(reg); + DELAY(500); + + reg = FDI_RX_IIR(pipe); + temp = I915_READ(reg); + DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp); + + if (temp & FDI_RX_SYMBOL_LOCK) { + I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK); + DRM_DEBUG_KMS("FDI train 2 done.\n"); + break; + } + } + if (i == 4) + DRM_ERROR("FDI train 2 fail!\n"); + + DRM_DEBUG_KMS("FDI train done.\n"); +} + +static void ironlake_fdi_pll_enable(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + u32 reg, temp; + + /* Write the TU size bits so error detection works */ + I915_WRITE(FDI_RX_TUSIZE1(pipe), + I915_READ(PIPE_DATA_M1(pipe)) & TU_SIZE_MASK); + + /* enable PCH FDI RX PLL, wait warmup plus DMI latency */ + reg = FDI_RX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~((0x7 << 19) | (0x7 << 16)); + temp |= (intel_crtc->fdi_lanes - 1) << 19; + temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11; + I915_WRITE(reg, temp | FDI_RX_PLL_ENABLE); + + POSTING_READ(reg); + DELAY(200); + + /* Switch from Rawclk to PCDclk */ + temp = I915_READ(reg); + I915_WRITE(reg, temp | FDI_PCDCLK); + + POSTING_READ(reg); + DELAY(200); + + /* Enable CPU FDI TX PLL, always on for Ironlake */ + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + if ((temp & FDI_TX_PLL_ENABLE) == 0) { + I915_WRITE(reg, temp | FDI_TX_PLL_ENABLE); + + POSTING_READ(reg); + DELAY(100); + } +} + +static void cpt_phase_pointer_disable(struct drm_device *dev, int pipe) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 flags = I915_READ(SOUTH_CHICKEN1); + + flags &= ~(FDI_PHASE_SYNC_EN(pipe)); + I915_WRITE(SOUTH_CHICKEN1, flags); /* once to disable... */ + flags &= ~(FDI_PHASE_SYNC_OVR(pipe)); + I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to lock */ + POSTING_READ(SOUTH_CHICKEN1); +} + +static void ironlake_fdi_disable(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + u32 reg, temp; + + /* disable CPU FDI tx and PCH FDI rx */ + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + I915_WRITE(reg, temp & ~FDI_TX_ENABLE); + POSTING_READ(reg); + + reg = FDI_RX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~(0x7 << 16); + temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11; + I915_WRITE(reg, temp & ~FDI_RX_ENABLE); + + POSTING_READ(reg); + DELAY(100); + + /* Ironlake workaround, disable clock pointer after downing FDI */ + if (HAS_PCH_IBX(dev)) { + I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR); + I915_WRITE(FDI_RX_CHICKEN(pipe), + I915_READ(FDI_RX_CHICKEN(pipe) & + ~FDI_RX_PHASE_SYNC_POINTER_EN)); + } else if (HAS_PCH_CPT(dev)) { + cpt_phase_pointer_disable(dev, pipe); + } + + /* still set train pattern 1 */ + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + temp &= ~FDI_LINK_TRAIN_NONE; + temp |= FDI_LINK_TRAIN_PATTERN_1; + I915_WRITE(reg, temp); + + reg = FDI_RX_CTL(pipe); + temp = I915_READ(reg); + if (HAS_PCH_CPT(dev)) { + temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT; + temp |= FDI_LINK_TRAIN_PATTERN_1_CPT; + } else { + temp &= ~FDI_LINK_TRAIN_NONE; + temp |= FDI_LINK_TRAIN_PATTERN_1; + } + /* BPC in FDI rx is consistent with that in PIPECONF */ + temp &= ~(0x07 << 16); + temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11; + I915_WRITE(reg, temp); + + POSTING_READ(reg); + DELAY(100); +} + +/* + * When we disable a pipe, we need to clear any pending scanline wait events + * to avoid hanging the ring, which we assume we are waiting on. + */ +static void intel_clear_scanline_wait(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_ring_buffer *ring; + u32 tmp; + + if (IS_GEN2(dev)) + /* Can't break the hang on i8xx */ + return; + + ring = LP_RING(dev_priv); + tmp = I915_READ_CTL(ring); + if (tmp & RING_WAIT) + I915_WRITE_CTL(ring, tmp); +} + +static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc) +{ + struct drm_i915_gem_object *obj; + struct drm_i915_private *dev_priv; + struct drm_device *dev; + + if (crtc->fb == NULL) + return; + + obj = to_intel_framebuffer(crtc->fb)->obj; + dev = crtc->dev; + dev_priv = dev->dev_private; + mtx_lock(&dev->event_lock); + while (atomic_read(&obj->pending_flip) != 0) + msleep(&obj->pending_flip, &dev->event_lock, 0, "915wfl", 0); + mtx_unlock(&dev->event_lock); +} + +static bool intel_crtc_driving_pch(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_mode_config *mode_config = &dev->mode_config; + struct intel_encoder *encoder; + + /* + * If there's a non-PCH eDP on this crtc, it must be DP_A, and that + * must be driven by its own crtc; no sharing is possible. + */ + list_for_each_entry(encoder, &mode_config->encoder_list, base.head) { + if (encoder->base.crtc != crtc) + continue; + + switch (encoder->type) { + case INTEL_OUTPUT_EDP: + if (!intel_encoder_is_pch_edp(&encoder->base)) + return false; + continue; + } + } + + return true; +} + +/* + * Enable PCH resources required for PCH ports: + * - PCH PLLs + * - FDI training & RX/TX + * - update transcoder timings + * - DP transcoding bits + * - transcoder + */ +static void ironlake_pch_enable(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + u32 reg, temp, transc_sel; + + /* For PCH output, training FDI link */ + dev_priv->display.fdi_link_train(crtc); + + intel_enable_pch_pll(dev_priv, pipe); + + if (HAS_PCH_CPT(dev)) { + transc_sel = intel_crtc->use_pll_a ? TRANSC_DPLLA_SEL : + TRANSC_DPLLB_SEL; + + /* Be sure PCH DPLL SEL is set */ + temp = I915_READ(PCH_DPLL_SEL); + if (pipe == 0) { + temp &= ~(TRANSA_DPLLB_SEL); + temp |= (TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL); + } else if (pipe == 1) { + temp &= ~(TRANSB_DPLLB_SEL); + temp |= (TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL); + } else if (pipe == 2) { + temp &= ~(TRANSC_DPLLB_SEL); + temp |= (TRANSC_DPLL_ENABLE | transc_sel); + } + I915_WRITE(PCH_DPLL_SEL, temp); + } + + /* set transcoder timing, panel must allow it */ + assert_panel_unlocked(dev_priv, pipe); + I915_WRITE(TRANS_HTOTAL(pipe), I915_READ(HTOTAL(pipe))); + I915_WRITE(TRANS_HBLANK(pipe), I915_READ(HBLANK(pipe))); + I915_WRITE(TRANS_HSYNC(pipe), I915_READ(HSYNC(pipe))); + + I915_WRITE(TRANS_VTOTAL(pipe), I915_READ(VTOTAL(pipe))); + I915_WRITE(TRANS_VBLANK(pipe), I915_READ(VBLANK(pipe))); + I915_WRITE(TRANS_VSYNC(pipe), I915_READ(VSYNC(pipe))); + I915_WRITE(TRANS_VSYNCSHIFT(pipe), I915_READ(VSYNCSHIFT(pipe))); + + intel_fdi_normal_train(crtc); + + /* For PCH DP, enable TRANS_DP_CTL */ + if (HAS_PCH_CPT(dev) && + (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT) || + intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP))) { + u32 bpc = (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) >> 5; + reg = TRANS_DP_CTL(pipe); + temp = I915_READ(reg); + temp &= ~(TRANS_DP_PORT_SEL_MASK | + TRANS_DP_SYNC_MASK | + TRANS_DP_BPC_MASK); + temp |= (TRANS_DP_OUTPUT_ENABLE | + TRANS_DP_ENH_FRAMING); + temp |= bpc << 9; /* same format but at 11:9 */ + + if (crtc->mode.flags & DRM_MODE_FLAG_PHSYNC) + temp |= TRANS_DP_HSYNC_ACTIVE_HIGH; + if (crtc->mode.flags & DRM_MODE_FLAG_PVSYNC) + temp |= TRANS_DP_VSYNC_ACTIVE_HIGH; + + switch (intel_trans_dp_port_sel(crtc)) { + case PCH_DP_B: + temp |= TRANS_DP_PORT_SEL_B; + break; + case PCH_DP_C: + temp |= TRANS_DP_PORT_SEL_C; + break; + case PCH_DP_D: + temp |= TRANS_DP_PORT_SEL_D; + break; + default: + DRM_DEBUG_KMS("Wrong PCH DP port return. Guess port B\n"); + temp |= TRANS_DP_PORT_SEL_B; + break; + } + + I915_WRITE(reg, temp); + } + + intel_enable_transcoder(dev_priv, pipe); +} + +void intel_cpt_verify_modeset(struct drm_device *dev, int pipe) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int dslreg = PIPEDSL(pipe), tc2reg = TRANS_CHICKEN2(pipe); + u32 temp; + + temp = I915_READ(dslreg); + DELAY(500); + if (_intel_wait_for(dev, I915_READ(dslreg) != temp, 5, 1, "915cp1")) { + /* Without this, mode sets may fail silently on FDI */ + I915_WRITE(tc2reg, TRANS_AUTOTRAIN_GEN_STALL_DIS); + DELAY(250); + I915_WRITE(tc2reg, 0); + if (_intel_wait_for(dev, I915_READ(dslreg) != temp, 5, 1, + "915cp2")) + DRM_ERROR("mode set failed: pipe %d stuck\n", pipe); + } +} + +static void ironlake_crtc_enable(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + int plane = intel_crtc->plane; + u32 temp; + bool is_pch_port; + + if (intel_crtc->active) + return; + + intel_crtc->active = true; + intel_update_watermarks(dev); + + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { + temp = I915_READ(PCH_LVDS); + if ((temp & LVDS_PORT_EN) == 0) + I915_WRITE(PCH_LVDS, temp | LVDS_PORT_EN); + } + + is_pch_port = intel_crtc_driving_pch(crtc); + + if (is_pch_port) + ironlake_fdi_pll_enable(crtc); + else + ironlake_fdi_disable(crtc); + + /* Enable panel fitting for LVDS */ + if (dev_priv->pch_pf_size && + (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) || HAS_eDP)) { + /* Force use of hard-coded filter coefficients + * as some pre-programmed values are broken, + * e.g. x201. + */ + I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3); + I915_WRITE(PF_WIN_POS(pipe), dev_priv->pch_pf_pos); + I915_WRITE(PF_WIN_SZ(pipe), dev_priv->pch_pf_size); + } + + intel_enable_pipe(dev_priv, pipe, is_pch_port); + intel_enable_plane(dev_priv, plane, pipe); + + if (is_pch_port) + ironlake_pch_enable(crtc); + + intel_crtc_load_lut(crtc); + + DRM_LOCK(dev); + intel_update_fbc(dev); + DRM_UNLOCK(dev); + + intel_crtc_update_cursor(crtc, true); +} + +static void ironlake_crtc_disable(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + int plane = intel_crtc->plane; + u32 reg, temp; + + if (!intel_crtc->active) + return; + + intel_crtc_wait_for_pending_flips(crtc); + drm_vblank_off(dev, pipe); + intel_crtc_update_cursor(crtc, false); + + intel_disable_plane(dev_priv, plane, pipe); + + if (dev_priv->cfb_plane == plane) + intel_disable_fbc(dev); + + intel_disable_pipe(dev_priv, pipe); + + /* Disable PF */ + I915_WRITE(PF_CTL(pipe), 0); + I915_WRITE(PF_WIN_SZ(pipe), 0); + + ironlake_fdi_disable(crtc); + + /* This is a horrible layering violation; we should be doing this in + * the connector/encoder ->prepare instead, but we don't always have + * enough information there about the config to know whether it will + * actually be necessary or just cause undesired flicker. + */ + intel_disable_pch_ports(dev_priv, pipe); + + intel_disable_transcoder(dev_priv, pipe); + + if (HAS_PCH_CPT(dev)) { + /* disable TRANS_DP_CTL */ + reg = TRANS_DP_CTL(pipe); + temp = I915_READ(reg); + temp &= ~(TRANS_DP_OUTPUT_ENABLE | TRANS_DP_PORT_SEL_MASK); + temp |= TRANS_DP_PORT_SEL_NONE; + I915_WRITE(reg, temp); + + /* disable DPLL_SEL */ + temp = I915_READ(PCH_DPLL_SEL); + switch (pipe) { + case 0: + temp &= ~(TRANSA_DPLL_ENABLE | TRANSA_DPLLB_SEL); + break; + case 1: + temp &= ~(TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL); + break; + case 2: + /* C shares PLL A or B */ + temp &= ~(TRANSC_DPLL_ENABLE | TRANSC_DPLLB_SEL); + break; + default: + KASSERT(1, ("Wrong pipe %d", pipe)); /* wtf */ + } + I915_WRITE(PCH_DPLL_SEL, temp); + } + + /* disable PCH DPLL */ + if (!intel_crtc->no_pll) + intel_disable_pch_pll(dev_priv, pipe); + + /* Switch from PCDclk to Rawclk */ + reg = FDI_RX_CTL(pipe); + temp = I915_READ(reg); + I915_WRITE(reg, temp & ~FDI_PCDCLK); + + /* Disable CPU FDI TX PLL */ + reg = FDI_TX_CTL(pipe); + temp = I915_READ(reg); + I915_WRITE(reg, temp & ~FDI_TX_PLL_ENABLE); + + POSTING_READ(reg); + DELAY(100); + + reg = FDI_RX_CTL(pipe); + temp = I915_READ(reg); + I915_WRITE(reg, temp & ~FDI_RX_PLL_ENABLE); + + /* Wait for the clocks to turn off. */ + POSTING_READ(reg); + DELAY(100); + + intel_crtc->active = false; + intel_update_watermarks(dev); + + DRM_LOCK(dev); + intel_update_fbc(dev); + intel_clear_scanline_wait(dev); + DRM_UNLOCK(dev); +} + +static void ironlake_crtc_dpms(struct drm_crtc *crtc, int mode) +{ + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + int plane = intel_crtc->plane; + + /* XXX: When our outputs are all unaware of DPMS modes other than off + * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC. + */ + switch (mode) { + case DRM_MODE_DPMS_ON: + case DRM_MODE_DPMS_STANDBY: + case DRM_MODE_DPMS_SUSPEND: + DRM_DEBUG_KMS("crtc %d/%d dpms on\n", pipe, plane); + ironlake_crtc_enable(crtc); + break; + + case DRM_MODE_DPMS_OFF: + DRM_DEBUG_KMS("crtc %d/%d dpms off\n", pipe, plane); + ironlake_crtc_disable(crtc); + break; + } +} + +static void intel_crtc_dpms_overlay(struct intel_crtc *intel_crtc, bool enable) +{ + if (!enable && intel_crtc->overlay) { + struct drm_device *dev = intel_crtc->base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + + DRM_LOCK(dev); + dev_priv->mm.interruptible = false; + (void) intel_overlay_switch_off(intel_crtc->overlay); + dev_priv->mm.interruptible = true; + DRM_UNLOCK(dev); + } + + /* Let userspace switch the overlay on again. In most cases userspace + * has to recompute where to put it anyway. + */ +} + +static void i9xx_crtc_enable(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + int plane = intel_crtc->plane; + + if (intel_crtc->active) + return; + + intel_crtc->active = true; + intel_update_watermarks(dev); + + intel_enable_pll(dev_priv, pipe); + intel_enable_pipe(dev_priv, pipe, false); + intel_enable_plane(dev_priv, plane, pipe); + + intel_crtc_load_lut(crtc); + intel_update_fbc(dev); + + /* Give the overlay scaler a chance to enable if it's on this pipe */ + intel_crtc_dpms_overlay(intel_crtc, true); + intel_crtc_update_cursor(crtc, true); +} + +static void i9xx_crtc_disable(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + int plane = intel_crtc->plane; + + if (!intel_crtc->active) + return; + + /* Give the overlay scaler a chance to disable if it's on this pipe */ + intel_crtc_wait_for_pending_flips(crtc); + drm_vblank_off(dev, pipe); + intel_crtc_dpms_overlay(intel_crtc, false); + intel_crtc_update_cursor(crtc, false); + + if (dev_priv->cfb_plane == plane) + intel_disable_fbc(dev); + + intel_disable_plane(dev_priv, plane, pipe); + intel_disable_pipe(dev_priv, pipe); + intel_disable_pll(dev_priv, pipe); + + intel_crtc->active = false; + intel_update_fbc(dev); + intel_update_watermarks(dev); + intel_clear_scanline_wait(dev); +} + +static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode) +{ + /* XXX: When our outputs are all unaware of DPMS modes other than off + * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC. + */ + switch (mode) { + case DRM_MODE_DPMS_ON: + case DRM_MODE_DPMS_STANDBY: + case DRM_MODE_DPMS_SUSPEND: + i9xx_crtc_enable(crtc); + break; + case DRM_MODE_DPMS_OFF: + i9xx_crtc_disable(crtc); + break; + } +} + +/** + * Sets the power management mode of the pipe and plane. + */ +static void intel_crtc_dpms(struct drm_crtc *crtc, int mode) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; +#if 0 + struct drm_i915_master_private *master_priv; +#endif + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + bool enabled; + + if (intel_crtc->dpms_mode == mode) + return; + + intel_crtc->dpms_mode = mode; + + dev_priv->display.dpms(crtc, mode); + +#if 0 + if (!dev->primary->master) + return; + + master_priv = dev->primary->master->driver_priv; + if (!master_priv->sarea_priv) + return; +#else + if (!dev_priv->sarea_priv) + return; +#endif + + enabled = crtc->enabled && mode != DRM_MODE_DPMS_OFF; + + switch (pipe) { + case 0: +#if 0 + master_priv->sarea_priv->pipeA_w = enabled ? crtc->mode.hdisplay : 0; + master_priv->sarea_priv->pipeA_h = enabled ? crtc->mode.vdisplay : 0; +#else + dev_priv->sarea_priv->planeA_w = enabled ? crtc->mode.hdisplay : 0; + dev_priv->sarea_priv->planeA_h = enabled ? crtc->mode.vdisplay : 0; +#endif + break; + case 1: +#if 0 + master_priv->sarea_priv->pipeB_w = enabled ? crtc->mode.hdisplay : 0; + master_priv->sarea_priv->pipeB_h = enabled ? crtc->mode.vdisplay : 0; +#else + dev_priv->sarea_priv->planeB_w = enabled ? crtc->mode.hdisplay : 0; + dev_priv->sarea_priv->planeB_h = enabled ? crtc->mode.vdisplay : 0; +#endif + break; + default: + DRM_ERROR("Can't update pipe %c in SAREA\n", pipe_name(pipe)); + break; + } +} + +static void intel_crtc_disable(struct drm_crtc *crtc) +{ + struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; + struct drm_device *dev = crtc->dev; + + /* Flush any pending WAITs before we disable the pipe. Note that + * we need to drop the struct_mutex in order to acquire it again + * during the lowlevel dpms routines around a couple of the + * operations. It does not look trivial nor desirable to move + * that locking higher. So instead we leave a window for the + * submission of further commands on the fb before we can actually + * disable it. This race with userspace exists anyway, and we can + * only rely on the pipe being disabled by userspace after it + * receives the hotplug notification and has flushed any pending + * batches. + */ + if (crtc->fb) { + DRM_LOCK(dev); + intel_finish_fb(crtc->fb); + DRM_UNLOCK(dev); + } + + crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); + assert_plane_disabled(dev->dev_private, to_intel_crtc(crtc)->plane); + assert_pipe_disabled(dev->dev_private, to_intel_crtc(crtc)->pipe); + + if (crtc->fb) { + DRM_LOCK(dev); + intel_unpin_fb_obj(to_intel_framebuffer(crtc->fb)->obj); + DRM_UNLOCK(dev); + } +} + +/* Prepare for a mode set. + * + * Note we could be a lot smarter here. We need to figure out which outputs + * will be enabled, which disabled (in short, how the config will changes) + * and perform the minimum necessary steps to accomplish that, e.g. updating + * watermarks, FBC configuration, making sure PLLs are programmed correctly, + * panel fitting is in the proper state, etc. + */ +static void i9xx_crtc_prepare(struct drm_crtc *crtc) +{ + i9xx_crtc_disable(crtc); +} + +static void i9xx_crtc_commit(struct drm_crtc *crtc) +{ + i9xx_crtc_enable(crtc); +} + +static void ironlake_crtc_prepare(struct drm_crtc *crtc) +{ + ironlake_crtc_disable(crtc); +} + +static void ironlake_crtc_commit(struct drm_crtc *crtc) +{ + ironlake_crtc_enable(crtc); +} + +void intel_encoder_prepare(struct drm_encoder *encoder) +{ + struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; + /* lvds has its own version of prepare see intel_lvds_prepare */ + encoder_funcs->dpms(encoder, DRM_MODE_DPMS_OFF); +} + +void intel_encoder_commit(struct drm_encoder *encoder) +{ + struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; + struct drm_device *dev = encoder->dev; + struct intel_encoder *intel_encoder = to_intel_encoder(encoder); + struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc); + + /* lvds has its own version of commit see intel_lvds_commit */ + encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON); + + if (HAS_PCH_CPT(dev)) + intel_cpt_verify_modeset(dev, intel_crtc->pipe); +} + +void intel_encoder_destroy(struct drm_encoder *encoder) +{ + struct intel_encoder *intel_encoder = to_intel_encoder(encoder); + + drm_encoder_cleanup(encoder); + free(intel_encoder, DRM_MEM_KMS); +} + +static bool intel_crtc_mode_fixup(struct drm_crtc *crtc, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct drm_device *dev = crtc->dev; + + if (HAS_PCH_SPLIT(dev)) { + /* FDI link clock is fixed at 2.7G */ + if (mode->clock * 3 > IRONLAKE_FDI_FREQ * 4) + return false; + } + + /* All interlaced capable intel hw wants timings in frames. Note though + * that intel_lvds_mode_fixup does some funny tricks with the crtc + * timings, so we need to be careful not to clobber these.*/ + if (!(adjusted_mode->private_flags & INTEL_MODE_CRTC_TIMINGS_SET)) + drm_mode_set_crtcinfo(adjusted_mode, 0); + + return true; +} + +static int i945_get_display_clock_speed(struct drm_device *dev) +{ + return 400000; +} + +static int i915_get_display_clock_speed(struct drm_device *dev) +{ + return 333000; +} + +static int i9xx_misc_get_display_clock_speed(struct drm_device *dev) +{ + return 200000; +} + +static int i915gm_get_display_clock_speed(struct drm_device *dev) +{ + u16 gcfgc = 0; + + gcfgc = pci_read_config(dev->device, GCFGC, 2); + + if (gcfgc & GC_LOW_FREQUENCY_ENABLE) + return 133000; + else { + switch (gcfgc & GC_DISPLAY_CLOCK_MASK) { + case GC_DISPLAY_CLOCK_333_MHZ: + return 333000; + default: + case GC_DISPLAY_CLOCK_190_200_MHZ: + return 190000; + } + } +} + +static int i865_get_display_clock_speed(struct drm_device *dev) +{ + return 266000; +} + +static int i855_get_display_clock_speed(struct drm_device *dev) +{ + u16 hpllcc = 0; + /* Assume that the hardware is in the high speed state. This + * should be the default. + */ + switch (hpllcc & GC_CLOCK_CONTROL_MASK) { + case GC_CLOCK_133_200: + case GC_CLOCK_100_200: + return 200000; + case GC_CLOCK_166_250: + return 250000; + case GC_CLOCK_100_133: + return 133000; + } + + /* Shouldn't happen */ + return 0; +} + +static int i830_get_display_clock_speed(struct drm_device *dev) +{ + return 133000; +} + +struct fdi_m_n { + u32 tu; + u32 gmch_m; + u32 gmch_n; + u32 link_m; + u32 link_n; +}; + +static void +fdi_reduce_ratio(u32 *num, u32 *den) +{ + while (*num > 0xffffff || *den > 0xffffff) { + *num >>= 1; + *den >>= 1; + } +} + +static void +ironlake_compute_m_n(int bits_per_pixel, int nlanes, int pixel_clock, + int link_clock, struct fdi_m_n *m_n) +{ + m_n->tu = 64; /* default size */ + + /* BUG_ON(pixel_clock > INT_MAX / 36); */ + m_n->gmch_m = bits_per_pixel * pixel_clock; + m_n->gmch_n = link_clock * nlanes * 8; + fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); + + m_n->link_m = pixel_clock; + m_n->link_n = link_clock; + fdi_reduce_ratio(&m_n->link_m, &m_n->link_n); +} + + +struct intel_watermark_params { + unsigned long fifo_size; + unsigned long max_wm; + unsigned long default_wm; + unsigned long guard_size; + unsigned long cacheline_size; +}; + +/* Pineview has different values for various configs */ +static const struct intel_watermark_params pineview_display_wm = { + PINEVIEW_DISPLAY_FIFO, + PINEVIEW_MAX_WM, + PINEVIEW_DFT_WM, + PINEVIEW_GUARD_WM, + PINEVIEW_FIFO_LINE_SIZE +}; +static const struct intel_watermark_params pineview_display_hplloff_wm = { + PINEVIEW_DISPLAY_FIFO, + PINEVIEW_MAX_WM, + PINEVIEW_DFT_HPLLOFF_WM, + PINEVIEW_GUARD_WM, + PINEVIEW_FIFO_LINE_SIZE +}; +static const struct intel_watermark_params pineview_cursor_wm = { + PINEVIEW_CURSOR_FIFO, + PINEVIEW_CURSOR_MAX_WM, + PINEVIEW_CURSOR_DFT_WM, + PINEVIEW_CURSOR_GUARD_WM, + PINEVIEW_FIFO_LINE_SIZE, +}; +static const struct intel_watermark_params pineview_cursor_hplloff_wm = { + PINEVIEW_CURSOR_FIFO, + PINEVIEW_CURSOR_MAX_WM, + PINEVIEW_CURSOR_DFT_WM, + PINEVIEW_CURSOR_GUARD_WM, + PINEVIEW_FIFO_LINE_SIZE +}; +static const struct intel_watermark_params g4x_wm_info = { + G4X_FIFO_SIZE, + G4X_MAX_WM, + G4X_MAX_WM, + 2, + G4X_FIFO_LINE_SIZE, +}; +static const struct intel_watermark_params g4x_cursor_wm_info = { + I965_CURSOR_FIFO, + I965_CURSOR_MAX_WM, + I965_CURSOR_DFT_WM, + 2, + G4X_FIFO_LINE_SIZE, +}; +static const struct intel_watermark_params i965_cursor_wm_info = { + I965_CURSOR_FIFO, + I965_CURSOR_MAX_WM, + I965_CURSOR_DFT_WM, + 2, + I915_FIFO_LINE_SIZE, +}; +static const struct intel_watermark_params i945_wm_info = { + I945_FIFO_SIZE, + I915_MAX_WM, + 1, + 2, + I915_FIFO_LINE_SIZE +}; +static const struct intel_watermark_params i915_wm_info = { + I915_FIFO_SIZE, + I915_MAX_WM, + 1, + 2, + I915_FIFO_LINE_SIZE +}; +static const struct intel_watermark_params i855_wm_info = { + I855GM_FIFO_SIZE, + I915_MAX_WM, + 1, + 2, + I830_FIFO_LINE_SIZE +}; +static const struct intel_watermark_params i830_wm_info = { + I830_FIFO_SIZE, + I915_MAX_WM, + 1, + 2, + I830_FIFO_LINE_SIZE +}; + +static const struct intel_watermark_params ironlake_display_wm_info = { + ILK_DISPLAY_FIFO, + ILK_DISPLAY_MAXWM, + ILK_DISPLAY_DFTWM, + 2, + ILK_FIFO_LINE_SIZE +}; +static const struct intel_watermark_params ironlake_cursor_wm_info = { + ILK_CURSOR_FIFO, + ILK_CURSOR_MAXWM, + ILK_CURSOR_DFTWM, + 2, + ILK_FIFO_LINE_SIZE +}; +static const struct intel_watermark_params ironlake_display_srwm_info = { + ILK_DISPLAY_SR_FIFO, + ILK_DISPLAY_MAX_SRWM, + ILK_DISPLAY_DFT_SRWM, + 2, + ILK_FIFO_LINE_SIZE +}; +static const struct intel_watermark_params ironlake_cursor_srwm_info = { + ILK_CURSOR_SR_FIFO, + ILK_CURSOR_MAX_SRWM, + ILK_CURSOR_DFT_SRWM, + 2, + ILK_FIFO_LINE_SIZE +}; + +static const struct intel_watermark_params sandybridge_display_wm_info = { + SNB_DISPLAY_FIFO, + SNB_DISPLAY_MAXWM, + SNB_DISPLAY_DFTWM, + 2, + SNB_FIFO_LINE_SIZE +}; +static const struct intel_watermark_params sandybridge_cursor_wm_info = { + SNB_CURSOR_FIFO, + SNB_CURSOR_MAXWM, + SNB_CURSOR_DFTWM, + 2, + SNB_FIFO_LINE_SIZE +}; +static const struct intel_watermark_params sandybridge_display_srwm_info = { + SNB_DISPLAY_SR_FIFO, + SNB_DISPLAY_MAX_SRWM, + SNB_DISPLAY_DFT_SRWM, + 2, + SNB_FIFO_LINE_SIZE +}; +static const struct intel_watermark_params sandybridge_cursor_srwm_info = { + SNB_CURSOR_SR_FIFO, + SNB_CURSOR_MAX_SRWM, + SNB_CURSOR_DFT_SRWM, + 2, + SNB_FIFO_LINE_SIZE +}; + + +/** + * intel_calculate_wm - calculate watermark level + * @clock_in_khz: pixel clock + * @wm: chip FIFO params + * @pixel_size: display pixel size + * @latency_ns: memory latency for the platform + * + * Calculate the watermark level (the level at which the display plane will + * start fetching from memory again). Each chip has a different display + * FIFO size and allocation, so the caller needs to figure that out and pass + * in the correct intel_watermark_params structure. + * + * As the pixel clock runs, the FIFO will be drained at a rate that depends + * on the pixel size. When it reaches the watermark level, it'll start + * fetching FIFO line sized based chunks from memory until the FIFO fills + * past the watermark point. If the FIFO drains completely, a FIFO underrun + * will occur, and a display engine hang could result. + */ +static unsigned long intel_calculate_wm(unsigned long clock_in_khz, + const struct intel_watermark_params *wm, + int fifo_size, + int pixel_size, + unsigned long latency_ns) +{ + long entries_required, wm_size; + + /* + * Note: we need to make sure we don't overflow for various clock & + * latency values. + * clocks go from a few thousand to several hundred thousand. + * latency is usually a few thousand + */ + entries_required = ((clock_in_khz / 1000) * pixel_size * latency_ns) / + 1000; + entries_required = howmany(entries_required, wm->cacheline_size); + + DRM_DEBUG_KMS("FIFO entries required for mode: %ld\n", entries_required); + + wm_size = fifo_size - (entries_required + wm->guard_size); + + DRM_DEBUG_KMS("FIFO watermark level: %ld\n", wm_size); + + /* Don't promote wm_size to unsigned... */ + if (wm_size > (long)wm->max_wm) + wm_size = wm->max_wm; + if (wm_size <= 0) + wm_size = wm->default_wm; + return wm_size; +} + +struct cxsr_latency { + int is_desktop; + int is_ddr3; + unsigned long fsb_freq; + unsigned long mem_freq; + unsigned long display_sr; + unsigned long display_hpll_disable; + unsigned long cursor_sr; + unsigned long cursor_hpll_disable; +}; + +static const struct cxsr_latency cxsr_latency_table[] = { + {1, 0, 800, 400, 3382, 33382, 3983, 33983}, /* DDR2-400 SC */ + {1, 0, 800, 667, 3354, 33354, 3807, 33807}, /* DDR2-667 SC */ + {1, 0, 800, 800, 3347, 33347, 3763, 33763}, /* DDR2-800 SC */ + {1, 1, 800, 667, 6420, 36420, 6873, 36873}, /* DDR3-667 SC */ + {1, 1, 800, 800, 5902, 35902, 6318, 36318}, /* DDR3-800 SC */ + + {1, 0, 667, 400, 3400, 33400, 4021, 34021}, /* DDR2-400 SC */ + {1, 0, 667, 667, 3372, 33372, 3845, 33845}, /* DDR2-667 SC */ + {1, 0, 667, 800, 3386, 33386, 3822, 33822}, /* DDR2-800 SC */ + {1, 1, 667, 667, 6438, 36438, 6911, 36911}, /* DDR3-667 SC */ + {1, 1, 667, 800, 5941, 35941, 6377, 36377}, /* DDR3-800 SC */ + + {1, 0, 400, 400, 3472, 33472, 4173, 34173}, /* DDR2-400 SC */ + {1, 0, 400, 667, 3443, 33443, 3996, 33996}, /* DDR2-667 SC */ + {1, 0, 400, 800, 3430, 33430, 3946, 33946}, /* DDR2-800 SC */ + {1, 1, 400, 667, 6509, 36509, 7062, 37062}, /* DDR3-667 SC */ + {1, 1, 400, 800, 5985, 35985, 6501, 36501}, /* DDR3-800 SC */ + + {0, 0, 800, 400, 3438, 33438, 4065, 34065}, /* DDR2-400 SC */ + {0, 0, 800, 667, 3410, 33410, 3889, 33889}, /* DDR2-667 SC */ + {0, 0, 800, 800, 3403, 33403, 3845, 33845}, /* DDR2-800 SC */ + {0, 1, 800, 667, 6476, 36476, 6955, 36955}, /* DDR3-667 SC */ + {0, 1, 800, 800, 5958, 35958, 6400, 36400}, /* DDR3-800 SC */ + + {0, 0, 667, 400, 3456, 33456, 4103, 34106}, /* DDR2-400 SC */ + {0, 0, 667, 667, 3428, 33428, 3927, 33927}, /* DDR2-667 SC */ + {0, 0, 667, 800, 3443, 33443, 3905, 33905}, /* DDR2-800 SC */ + {0, 1, 667, 667, 6494, 36494, 6993, 36993}, /* DDR3-667 SC */ + {0, 1, 667, 800, 5998, 35998, 6460, 36460}, /* DDR3-800 SC */ + + {0, 0, 400, 400, 3528, 33528, 4255, 34255}, /* DDR2-400 SC */ + {0, 0, 400, 667, 3500, 33500, 4079, 34079}, /* DDR2-667 SC */ + {0, 0, 400, 800, 3487, 33487, 4029, 34029}, /* DDR2-800 SC */ + {0, 1, 400, 667, 6566, 36566, 7145, 37145}, /* DDR3-667 SC */ + {0, 1, 400, 800, 6042, 36042, 6584, 36584}, /* DDR3-800 SC */ +}; + +static const struct cxsr_latency *intel_get_cxsr_latency(int is_desktop, + int is_ddr3, + int fsb, + int mem) +{ + const struct cxsr_latency *latency; + int i; + + if (fsb == 0 || mem == 0) + return NULL; + + for (i = 0; i < DRM_ARRAY_SIZE(cxsr_latency_table); i++) { + latency = &cxsr_latency_table[i]; + if (is_desktop == latency->is_desktop && + is_ddr3 == latency->is_ddr3 && + fsb == latency->fsb_freq && mem == latency->mem_freq) + return latency; + } + + DRM_DEBUG_KMS("Unknown FSB/MEM found, disable CxSR\n"); + + return NULL; +} + +static void pineview_disable_cxsr(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + /* deactivate cxsr */ + I915_WRITE(DSPFW3, I915_READ(DSPFW3) & ~PINEVIEW_SELF_REFRESH_EN); +} + +/* + * Latency for FIFO fetches is dependent on several factors: + * - memory configuration (speed, channels) + * - chipset + * - current MCH state + * It can be fairly high in some situations, so here we assume a fairly + * pessimal value. It's a tradeoff between extra memory fetches (if we + * set this value too high, the FIFO will fetch frequently to stay full) + * and power consumption (set it too low to save power and we might see + * FIFO underruns and display "flicker"). + * + * A value of 5us seems to be a good balance; safe for very low end + * platforms but not overly aggressive on lower latency configs. + */ +static const int latency_ns = 5000; + +static int i9xx_get_fifo_size(struct drm_device *dev, int plane) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t dsparb = I915_READ(DSPARB); + int size; + + size = dsparb & 0x7f; + if (plane) + size = ((dsparb >> DSPARB_CSTART_SHIFT) & 0x7f) - size; + + DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb, + plane ? "B" : "A", size); + + return size; +} + +static int i85x_get_fifo_size(struct drm_device *dev, int plane) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t dsparb = I915_READ(DSPARB); + int size; + + size = dsparb & 0x1ff; + if (plane) + size = ((dsparb >> DSPARB_BEND_SHIFT) & 0x1ff) - size; + size >>= 1; /* Convert to cachelines */ + + DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb, + plane ? "B" : "A", size); + + return size; +} + +static int i845_get_fifo_size(struct drm_device *dev, int plane) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t dsparb = I915_READ(DSPARB); + int size; + + size = dsparb & 0x7f; + size >>= 2; /* Convert to cachelines */ + + DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb, + plane ? "B" : "A", + size); + + return size; +} + +static int i830_get_fifo_size(struct drm_device *dev, int plane) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t dsparb = I915_READ(DSPARB); + int size; + + size = dsparb & 0x7f; + size >>= 1; /* Convert to cachelines */ + + DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb, + plane ? "B" : "A", size); + + return size; +} + +static struct drm_crtc *single_enabled_crtc(struct drm_device *dev) +{ + struct drm_crtc *crtc, *enabled = NULL; + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + if (crtc->enabled && crtc->fb) { + if (enabled) + return NULL; + enabled = crtc; + } + } + + return enabled; +} + +static void pineview_update_wm(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_crtc *crtc; + const struct cxsr_latency *latency; + u32 reg; + unsigned long wm; + + latency = intel_get_cxsr_latency(IS_PINEVIEW_G(dev), dev_priv->is_ddr3, + dev_priv->fsb_freq, dev_priv->mem_freq); + if (!latency) { + DRM_DEBUG_KMS("Unknown FSB/MEM found, disable CxSR\n"); + pineview_disable_cxsr(dev); + return; + } + + crtc = single_enabled_crtc(dev); + if (crtc) { + int clock = crtc->mode.clock; + int pixel_size = crtc->fb->bits_per_pixel / 8; + + /* Display SR */ + wm = intel_calculate_wm(clock, &pineview_display_wm, + pineview_display_wm.fifo_size, + pixel_size, latency->display_sr); + reg = I915_READ(DSPFW1); + reg &= ~DSPFW_SR_MASK; + reg |= wm << DSPFW_SR_SHIFT; + I915_WRITE(DSPFW1, reg); + DRM_DEBUG_KMS("DSPFW1 register is %x\n", reg); + + /* cursor SR */ + wm = intel_calculate_wm(clock, &pineview_cursor_wm, + pineview_display_wm.fifo_size, + pixel_size, latency->cursor_sr); + reg = I915_READ(DSPFW3); + reg &= ~DSPFW_CURSOR_SR_MASK; + reg |= (wm & 0x3f) << DSPFW_CURSOR_SR_SHIFT; + I915_WRITE(DSPFW3, reg); + + /* Display HPLL off SR */ + wm = intel_calculate_wm(clock, &pineview_display_hplloff_wm, + pineview_display_hplloff_wm.fifo_size, + pixel_size, latency->display_hpll_disable); + reg = I915_READ(DSPFW3); + reg &= ~DSPFW_HPLL_SR_MASK; + reg |= wm & DSPFW_HPLL_SR_MASK; + I915_WRITE(DSPFW3, reg); + + /* cursor HPLL off SR */ + wm = intel_calculate_wm(clock, &pineview_cursor_hplloff_wm, + pineview_display_hplloff_wm.fifo_size, + pixel_size, latency->cursor_hpll_disable); + reg = I915_READ(DSPFW3); + reg &= ~DSPFW_HPLL_CURSOR_MASK; + reg |= (wm & 0x3f) << DSPFW_HPLL_CURSOR_SHIFT; + I915_WRITE(DSPFW3, reg); + DRM_DEBUG_KMS("DSPFW3 register is %x\n", reg); + + /* activate cxsr */ + I915_WRITE(DSPFW3, + I915_READ(DSPFW3) | PINEVIEW_SELF_REFRESH_EN); + DRM_DEBUG_KMS("Self-refresh is enabled\n"); + } else { + pineview_disable_cxsr(dev); + DRM_DEBUG_KMS("Self-refresh is disabled\n"); + } +} + +static bool g4x_compute_wm0(struct drm_device *dev, + int plane, + const struct intel_watermark_params *display, + int display_latency_ns, + const struct intel_watermark_params *cursor, + int cursor_latency_ns, + int *plane_wm, + int *cursor_wm) +{ + struct drm_crtc *crtc; + int htotal, hdisplay, clock, pixel_size; + int line_time_us, line_count; + int entries, tlb_miss; + + crtc = intel_get_crtc_for_plane(dev, plane); + if (crtc->fb == NULL || !crtc->enabled) { + *cursor_wm = cursor->guard_size; + *plane_wm = display->guard_size; + return false; + } + + htotal = crtc->mode.htotal; + hdisplay = crtc->mode.hdisplay; + clock = crtc->mode.clock; + pixel_size = crtc->fb->bits_per_pixel / 8; + + /* Use the small buffer method to calculate plane watermark */ + entries = ((clock * pixel_size / 1000) * display_latency_ns) / 1000; + tlb_miss = display->fifo_size*display->cacheline_size - hdisplay * 8; + if (tlb_miss > 0) + entries += tlb_miss; + entries = howmany(entries, display->cacheline_size); + *plane_wm = entries + display->guard_size; + if (*plane_wm > (int)display->max_wm) + *plane_wm = display->max_wm; + + /* Use the large buffer method to calculate cursor watermark */ + line_time_us = ((htotal * 1000) / clock); + line_count = (cursor_latency_ns / line_time_us + 1000) / 1000; + entries = line_count * 64 * pixel_size; + tlb_miss = cursor->fifo_size*cursor->cacheline_size - hdisplay * 8; + if (tlb_miss > 0) + entries += tlb_miss; + entries = howmany(entries, cursor->cacheline_size); + *cursor_wm = entries + cursor->guard_size; + if (*cursor_wm > (int)cursor->max_wm) + *cursor_wm = (int)cursor->max_wm; + + return true; +} + +/* + * Check the wm result. + * + * If any calculated watermark values is larger than the maximum value that + * can be programmed into the associated watermark register, that watermark + * must be disabled. + */ +static bool g4x_check_srwm(struct drm_device *dev, + int display_wm, int cursor_wm, + const struct intel_watermark_params *display, + const struct intel_watermark_params *cursor) +{ + DRM_DEBUG_KMS("SR watermark: display plane %d, cursor %d\n", + display_wm, cursor_wm); + + if (display_wm > display->max_wm) { + DRM_DEBUG_KMS("display watermark is too large(%d/%ld), disabling\n", + display_wm, display->max_wm); + return false; + } + + if (cursor_wm > cursor->max_wm) { + DRM_DEBUG_KMS("cursor watermark is too large(%d/%ld), disabling\n", + cursor_wm, cursor->max_wm); + return false; + } + + if (!(display_wm || cursor_wm)) { + DRM_DEBUG_KMS("SR latency is 0, disabling\n"); + return false; + } + + return true; +} + +static bool g4x_compute_srwm(struct drm_device *dev, + int plane, + int latency_ns, + const struct intel_watermark_params *display, + const struct intel_watermark_params *cursor, + int *display_wm, int *cursor_wm) +{ + struct drm_crtc *crtc; + int hdisplay, htotal, pixel_size, clock; + unsigned long line_time_us; + int line_count, line_size; + int small, large; + int entries; + + if (!latency_ns) { + *display_wm = *cursor_wm = 0; + return false; + } + + crtc = intel_get_crtc_for_plane(dev, plane); + hdisplay = crtc->mode.hdisplay; + htotal = crtc->mode.htotal; + clock = crtc->mode.clock; + pixel_size = crtc->fb->bits_per_pixel / 8; + + line_time_us = (htotal * 1000) / clock; + line_count = (latency_ns / line_time_us + 1000) / 1000; + line_size = hdisplay * pixel_size; + + /* Use the minimum of the small and large buffer method for primary */ + small = ((clock * pixel_size / 1000) * latency_ns) / 1000; + large = line_count * line_size; + + entries = howmany(min(small, large), display->cacheline_size); + *display_wm = entries + display->guard_size; + + /* calculate the self-refresh watermark for display cursor */ + entries = line_count * pixel_size * 64; + entries = howmany(entries, cursor->cacheline_size); + *cursor_wm = entries + cursor->guard_size; + + return g4x_check_srwm(dev, + *display_wm, *cursor_wm, + display, cursor); +} + +#define single_plane_enabled(mask) ((mask) != 0 && powerof2(mask)) + +static void g4x_update_wm(struct drm_device *dev) +{ + static const int sr_latency_ns = 12000; + struct drm_i915_private *dev_priv = dev->dev_private; + int planea_wm, planeb_wm, cursora_wm, cursorb_wm; + int plane_sr, cursor_sr; + unsigned int enabled = 0; + + if (g4x_compute_wm0(dev, 0, + &g4x_wm_info, latency_ns, + &g4x_cursor_wm_info, latency_ns, + &planea_wm, &cursora_wm)) + enabled |= 1; + + if (g4x_compute_wm0(dev, 1, + &g4x_wm_info, latency_ns, + &g4x_cursor_wm_info, latency_ns, + &planeb_wm, &cursorb_wm)) + enabled |= 2; + + plane_sr = cursor_sr = 0; + if (single_plane_enabled(enabled) && + g4x_compute_srwm(dev, ffs(enabled) - 1, + sr_latency_ns, + &g4x_wm_info, + &g4x_cursor_wm_info, + &plane_sr, &cursor_sr)) + I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); + else + I915_WRITE(FW_BLC_SELF, + I915_READ(FW_BLC_SELF) & ~FW_BLC_SELF_EN); + + DRM_DEBUG_KMS("Setting FIFO watermarks - A: plane=%d, cursor=%d, B: plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n", + planea_wm, cursora_wm, + planeb_wm, cursorb_wm, + plane_sr, cursor_sr); + + I915_WRITE(DSPFW1, + (plane_sr << DSPFW_SR_SHIFT) | + (cursorb_wm << DSPFW_CURSORB_SHIFT) | + (planeb_wm << DSPFW_PLANEB_SHIFT) | + planea_wm); + I915_WRITE(DSPFW2, + (I915_READ(DSPFW2) & DSPFW_CURSORA_MASK) | + (cursora_wm << DSPFW_CURSORA_SHIFT)); + /* HPLL off in SR has some issues on G4x... disable it */ + I915_WRITE(DSPFW3, + (I915_READ(DSPFW3) & ~DSPFW_HPLL_SR_EN) | + (cursor_sr << DSPFW_CURSOR_SR_SHIFT)); +} + +static void i965_update_wm(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_crtc *crtc; + int srwm = 1; + int cursor_sr = 16; + + /* Calc sr entries for one plane configs */ + crtc = single_enabled_crtc(dev); + if (crtc) { + /* self-refresh has much higher latency */ + static const int sr_latency_ns = 12000; + int clock = crtc->mode.clock; + int htotal = crtc->mode.htotal; + int hdisplay = crtc->mode.hdisplay; + int pixel_size = crtc->fb->bits_per_pixel / 8; + unsigned long line_time_us; + int entries; + + line_time_us = ((htotal * 1000) / clock); + + /* Use ns/us then divide to preserve precision */ + entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * + pixel_size * hdisplay; + entries = howmany(entries, I915_FIFO_LINE_SIZE); + srwm = I965_FIFO_SIZE - entries; + if (srwm < 0) + srwm = 1; + srwm &= 0x1ff; + DRM_DEBUG_KMS("self-refresh entries: %d, wm: %d\n", + entries, srwm); + + entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * + pixel_size * 64; + entries = howmany(entries, i965_cursor_wm_info.cacheline_size); + cursor_sr = i965_cursor_wm_info.fifo_size - + (entries + i965_cursor_wm_info.guard_size); + + if (cursor_sr > i965_cursor_wm_info.max_wm) + cursor_sr = i965_cursor_wm_info.max_wm; + + DRM_DEBUG_KMS("self-refresh watermark: display plane %d " + "cursor %d\n", srwm, cursor_sr); + + if (IS_CRESTLINE(dev)) + I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); + } else { + /* Turn off self refresh if both pipes are enabled */ + if (IS_CRESTLINE(dev)) + I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF) + & ~FW_BLC_SELF_EN); + } + + DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n", + srwm); + + /* 965 has limitations... */ + I915_WRITE(DSPFW1, (srwm << DSPFW_SR_SHIFT) | + (8 << 16) | (8 << 8) | (8 << 0)); + I915_WRITE(DSPFW2, (8 << 8) | (8 << 0)); + /* update cursor SR watermark */ + I915_WRITE(DSPFW3, (cursor_sr << DSPFW_CURSOR_SR_SHIFT)); +} + +static void i9xx_update_wm(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + const struct intel_watermark_params *wm_info; + uint32_t fwater_lo; + uint32_t fwater_hi; + int cwm, srwm = 1; + int fifo_size; + int planea_wm, planeb_wm; + struct drm_crtc *crtc, *enabled = NULL; + + if (IS_I945GM(dev)) + wm_info = &i945_wm_info; + else if (!IS_GEN2(dev)) + wm_info = &i915_wm_info; + else + wm_info = &i855_wm_info; + + fifo_size = dev_priv->display.get_fifo_size(dev, 0); + crtc = intel_get_crtc_for_plane(dev, 0); + if (crtc->enabled && crtc->fb) { + planea_wm = intel_calculate_wm(crtc->mode.clock, + wm_info, fifo_size, + crtc->fb->bits_per_pixel / 8, + latency_ns); + enabled = crtc; + } else + planea_wm = fifo_size - wm_info->guard_size; + + fifo_size = dev_priv->display.get_fifo_size(dev, 1); + crtc = intel_get_crtc_for_plane(dev, 1); + if (crtc->enabled && crtc->fb) { + planeb_wm = intel_calculate_wm(crtc->mode.clock, + wm_info, fifo_size, + crtc->fb->bits_per_pixel / 8, + latency_ns); + if (enabled == NULL) + enabled = crtc; + else + enabled = NULL; + } else + planeb_wm = fifo_size - wm_info->guard_size; + + DRM_DEBUG_KMS("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm); + + /* + * Overlay gets an aggressive default since video jitter is bad. + */ + cwm = 2; + + /* Play safe and disable self-refresh before adjusting watermarks. */ + if (IS_I945G(dev) || IS_I945GM(dev)) + I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN_MASK | 0); + else if (IS_I915GM(dev)) + I915_WRITE(INSTPM, I915_READ(INSTPM) & ~INSTPM_SELF_EN); + + /* Calc sr entries for one plane configs */ + if (HAS_FW_BLC(dev) && enabled) { + /* self-refresh has much higher latency */ + static const int sr_latency_ns = 6000; + int clock = enabled->mode.clock; + int htotal = enabled->mode.htotal; + int hdisplay = enabled->mode.hdisplay; + int pixel_size = enabled->fb->bits_per_pixel / 8; + unsigned long line_time_us; + int entries; + + line_time_us = (htotal * 1000) / clock; + + /* Use ns/us then divide to preserve precision */ + entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * + pixel_size * hdisplay; + entries = howmany(entries, wm_info->cacheline_size); + DRM_DEBUG_KMS("self-refresh entries: %d\n", entries); + srwm = wm_info->fifo_size - entries; + if (srwm < 0) + srwm = 1; + + if (IS_I945G(dev) || IS_I945GM(dev)) + I915_WRITE(FW_BLC_SELF, + FW_BLC_SELF_FIFO_MASK | (srwm & 0xff)); + else if (IS_I915GM(dev)) + I915_WRITE(FW_BLC_SELF, srwm & 0x3f); + } + + DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", + planea_wm, planeb_wm, cwm, srwm); + + fwater_lo = ((planeb_wm & 0x3f) << 16) | (planea_wm & 0x3f); + fwater_hi = (cwm & 0x1f); + + /* Set request length to 8 cachelines per fetch */ + fwater_lo = fwater_lo | (1 << 24) | (1 << 8); + fwater_hi = fwater_hi | (1 << 8); + + I915_WRITE(FW_BLC, fwater_lo); + I915_WRITE(FW_BLC2, fwater_hi); + + if (HAS_FW_BLC(dev)) { + if (enabled) { + if (IS_I945G(dev) || IS_I945GM(dev)) + I915_WRITE(FW_BLC_SELF, + FW_BLC_SELF_EN_MASK | FW_BLC_SELF_EN); + else if (IS_I915GM(dev)) + I915_WRITE(INSTPM, I915_READ(INSTPM) | INSTPM_SELF_EN); + DRM_DEBUG_KMS("memory self refresh enabled\n"); + } else + DRM_DEBUG_KMS("memory self refresh disabled\n"); + } +} + +static void i830_update_wm(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_crtc *crtc; + uint32_t fwater_lo; + int planea_wm; + + crtc = single_enabled_crtc(dev); + if (crtc == NULL) + return; + + planea_wm = intel_calculate_wm(crtc->mode.clock, &i830_wm_info, + dev_priv->display.get_fifo_size(dev, 0), + crtc->fb->bits_per_pixel / 8, + latency_ns); + fwater_lo = I915_READ(FW_BLC) & ~0xfff; + fwater_lo |= (3<<8) | planea_wm; + + DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d\n", planea_wm); + + I915_WRITE(FW_BLC, fwater_lo); +} + +#define ILK_LP0_PLANE_LATENCY 700 +#define ILK_LP0_CURSOR_LATENCY 1300 + +/* + * Check the wm result. + * + * If any calculated watermark values is larger than the maximum value that + * can be programmed into the associated watermark register, that watermark + * must be disabled. + */ +static bool ironlake_check_srwm(struct drm_device *dev, int level, + int fbc_wm, int display_wm, int cursor_wm, + const struct intel_watermark_params *display, + const struct intel_watermark_params *cursor) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + DRM_DEBUG_KMS("watermark %d: display plane %d, fbc lines %d," + " cursor %d\n", level, display_wm, fbc_wm, cursor_wm); + + if (fbc_wm > SNB_FBC_MAX_SRWM) { + DRM_DEBUG_KMS("fbc watermark(%d) is too large(%d), disabling wm%d+\n", + fbc_wm, SNB_FBC_MAX_SRWM, level); + + /* fbc has it's own way to disable FBC WM */ + I915_WRITE(DISP_ARB_CTL, + I915_READ(DISP_ARB_CTL) | DISP_FBC_WM_DIS); + return false; + } + + if (display_wm > display->max_wm) { + DRM_DEBUG_KMS("display watermark(%d) is too large(%d), disabling wm%d+\n", + display_wm, SNB_DISPLAY_MAX_SRWM, level); + return false; + } + + if (cursor_wm > cursor->max_wm) { + DRM_DEBUG_KMS("cursor watermark(%d) is too large(%d), disabling wm%d+\n", + cursor_wm, SNB_CURSOR_MAX_SRWM, level); + return false; + } + + if (!(fbc_wm || display_wm || cursor_wm)) { + DRM_DEBUG_KMS("latency %d is 0, disabling wm%d+\n", level, level); + return false; + } + + return true; +} + +/* + * Compute watermark values of WM[1-3], + */ +static bool ironlake_compute_srwm(struct drm_device *dev, int level, int plane, + int latency_ns, + const struct intel_watermark_params *display, + const struct intel_watermark_params *cursor, + int *fbc_wm, int *display_wm, int *cursor_wm) +{ + struct drm_crtc *crtc; + unsigned long line_time_us; + int hdisplay, htotal, pixel_size, clock; + int line_count, line_size; + int small, large; + int entries; + + if (!latency_ns) { + *fbc_wm = *display_wm = *cursor_wm = 0; + return false; + } + + crtc = intel_get_crtc_for_plane(dev, plane); + hdisplay = crtc->mode.hdisplay; + htotal = crtc->mode.htotal; + clock = crtc->mode.clock; + pixel_size = crtc->fb->bits_per_pixel / 8; + + line_time_us = (htotal * 1000) / clock; + line_count = (latency_ns / line_time_us + 1000) / 1000; + line_size = hdisplay * pixel_size; + + /* Use the minimum of the small and large buffer method for primary */ + small = ((clock * pixel_size / 1000) * latency_ns) / 1000; + large = line_count * line_size; + + entries = howmany(min(small, large), display->cacheline_size); + *display_wm = entries + display->guard_size; + + /* + * Spec says: + * FBC WM = ((Final Primary WM * 64) / number of bytes per line) + 2 + */ + *fbc_wm = howmany(*display_wm * 64, line_size) + 2; + + /* calculate the self-refresh watermark for display cursor */ + entries = line_count * pixel_size * 64; + entries = howmany(entries, cursor->cacheline_size); + *cursor_wm = entries + cursor->guard_size; + + return ironlake_check_srwm(dev, level, + *fbc_wm, *display_wm, *cursor_wm, + display, cursor); +} + +static void ironlake_update_wm(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int fbc_wm, plane_wm, cursor_wm; + unsigned int enabled; + + enabled = 0; + if (g4x_compute_wm0(dev, 0, + &ironlake_display_wm_info, + ILK_LP0_PLANE_LATENCY, + &ironlake_cursor_wm_info, + ILK_LP0_CURSOR_LATENCY, + &plane_wm, &cursor_wm)) { + I915_WRITE(WM0_PIPEA_ILK, + (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm); + DRM_DEBUG_KMS("FIFO watermarks For pipe A -" + " plane %d, " "cursor: %d\n", + plane_wm, cursor_wm); + enabled |= 1; + } + + if (g4x_compute_wm0(dev, 1, + &ironlake_display_wm_info, + ILK_LP0_PLANE_LATENCY, + &ironlake_cursor_wm_info, + ILK_LP0_CURSOR_LATENCY, + &plane_wm, &cursor_wm)) { + I915_WRITE(WM0_PIPEB_ILK, + (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm); + DRM_DEBUG_KMS("FIFO watermarks For pipe B -" + " plane %d, cursor: %d\n", + plane_wm, cursor_wm); + enabled |= 2; + } + + /* + * Calculate and update the self-refresh watermark only when one + * display plane is used. + */ + I915_WRITE(WM3_LP_ILK, 0); + I915_WRITE(WM2_LP_ILK, 0); + I915_WRITE(WM1_LP_ILK, 0); + + if (!single_plane_enabled(enabled)) + return; + enabled = ffs(enabled) - 1; + + /* WM1 */ + if (!ironlake_compute_srwm(dev, 1, enabled, + ILK_READ_WM1_LATENCY() * 500, + &ironlake_display_srwm_info, + &ironlake_cursor_srwm_info, + &fbc_wm, &plane_wm, &cursor_wm)) + return; + + I915_WRITE(WM1_LP_ILK, + WM1_LP_SR_EN | + (ILK_READ_WM1_LATENCY() << WM1_LP_LATENCY_SHIFT) | + (fbc_wm << WM1_LP_FBC_SHIFT) | + (plane_wm << WM1_LP_SR_SHIFT) | + cursor_wm); + + /* WM2 */ + if (!ironlake_compute_srwm(dev, 2, enabled, + ILK_READ_WM2_LATENCY() * 500, + &ironlake_display_srwm_info, + &ironlake_cursor_srwm_info, + &fbc_wm, &plane_wm, &cursor_wm)) + return; + + I915_WRITE(WM2_LP_ILK, + WM2_LP_EN | + (ILK_READ_WM2_LATENCY() << WM1_LP_LATENCY_SHIFT) | + (fbc_wm << WM1_LP_FBC_SHIFT) | + (plane_wm << WM1_LP_SR_SHIFT) | + cursor_wm); + + /* + * WM3 is unsupported on ILK, probably because we don't have latency + * data for that power state + */ +} + +void sandybridge_update_wm(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int latency = SNB_READ_WM0_LATENCY() * 100; /* In unit 0.1us */ + u32 val; + int fbc_wm, plane_wm, cursor_wm; + unsigned int enabled; + + enabled = 0; + if (g4x_compute_wm0(dev, 0, + &sandybridge_display_wm_info, latency, + &sandybridge_cursor_wm_info, latency, + &plane_wm, &cursor_wm)) { + val = I915_READ(WM0_PIPEA_ILK); + val &= ~(WM0_PIPE_PLANE_MASK | WM0_PIPE_CURSOR_MASK); + I915_WRITE(WM0_PIPEA_ILK, val | + ((plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm)); + DRM_DEBUG_KMS("FIFO watermarks For pipe A -" + " plane %d, " "cursor: %d\n", + plane_wm, cursor_wm); + enabled |= 1; + } + + if (g4x_compute_wm0(dev, 1, + &sandybridge_display_wm_info, latency, + &sandybridge_cursor_wm_info, latency, + &plane_wm, &cursor_wm)) { + val = I915_READ(WM0_PIPEB_ILK); + val &= ~(WM0_PIPE_PLANE_MASK | WM0_PIPE_CURSOR_MASK); + I915_WRITE(WM0_PIPEB_ILK, val | + ((plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm)); + DRM_DEBUG_KMS("FIFO watermarks For pipe B -" + " plane %d, cursor: %d\n", + plane_wm, cursor_wm); + enabled |= 2; + } + + /* IVB has 3 pipes */ + if (IS_IVYBRIDGE(dev) && + g4x_compute_wm0(dev, 2, + &sandybridge_display_wm_info, latency, + &sandybridge_cursor_wm_info, latency, + &plane_wm, &cursor_wm)) { + val = I915_READ(WM0_PIPEC_IVB); + val &= ~(WM0_PIPE_PLANE_MASK | WM0_PIPE_CURSOR_MASK); + I915_WRITE(WM0_PIPEC_IVB, val | + ((plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm)); + DRM_DEBUG_KMS("FIFO watermarks For pipe C -" + " plane %d, cursor: %d\n", + plane_wm, cursor_wm); + enabled |= 3; + } + + /* + * Calculate and update the self-refresh watermark only when one + * display plane is used. + * + * SNB support 3 levels of watermark. + * + * WM1/WM2/WM2 watermarks have to be enabled in the ascending order, + * and disabled in the descending order + * + */ + I915_WRITE(WM3_LP_ILK, 0); + I915_WRITE(WM2_LP_ILK, 0); + I915_WRITE(WM1_LP_ILK, 0); + + if (!single_plane_enabled(enabled) || + dev_priv->sprite_scaling_enabled) + return; + enabled = ffs(enabled) - 1; + + /* WM1 */ + if (!ironlake_compute_srwm(dev, 1, enabled, + SNB_READ_WM1_LATENCY() * 500, + &sandybridge_display_srwm_info, + &sandybridge_cursor_srwm_info, + &fbc_wm, &plane_wm, &cursor_wm)) + return; + + I915_WRITE(WM1_LP_ILK, + WM1_LP_SR_EN | + (SNB_READ_WM1_LATENCY() << WM1_LP_LATENCY_SHIFT) | + (fbc_wm << WM1_LP_FBC_SHIFT) | + (plane_wm << WM1_LP_SR_SHIFT) | + cursor_wm); + + /* WM2 */ + if (!ironlake_compute_srwm(dev, 2, enabled, + SNB_READ_WM2_LATENCY() * 500, + &sandybridge_display_srwm_info, + &sandybridge_cursor_srwm_info, + &fbc_wm, &plane_wm, &cursor_wm)) + return; + + I915_WRITE(WM2_LP_ILK, + WM2_LP_EN | + (SNB_READ_WM2_LATENCY() << WM1_LP_LATENCY_SHIFT) | + (fbc_wm << WM1_LP_FBC_SHIFT) | + (plane_wm << WM1_LP_SR_SHIFT) | + cursor_wm); + + /* WM3 */ + if (!ironlake_compute_srwm(dev, 3, enabled, + SNB_READ_WM3_LATENCY() * 500, + &sandybridge_display_srwm_info, + &sandybridge_cursor_srwm_info, + &fbc_wm, &plane_wm, &cursor_wm)) + return; + + I915_WRITE(WM3_LP_ILK, + WM3_LP_EN | + (SNB_READ_WM3_LATENCY() << WM1_LP_LATENCY_SHIFT) | + (fbc_wm << WM1_LP_FBC_SHIFT) | + (plane_wm << WM1_LP_SR_SHIFT) | + cursor_wm); +} + +static bool +sandybridge_compute_sprite_wm(struct drm_device *dev, int plane, + uint32_t sprite_width, int pixel_size, + const struct intel_watermark_params *display, + int display_latency_ns, int *sprite_wm) +{ + struct drm_crtc *crtc; + int clock; + int entries, tlb_miss; + + crtc = intel_get_crtc_for_plane(dev, plane); + if (crtc->fb == NULL || !crtc->enabled) { + *sprite_wm = display->guard_size; + return false; + } + + clock = crtc->mode.clock; + + /* Use the small buffer method to calculate the sprite watermark */ + entries = ((clock * pixel_size / 1000) * display_latency_ns) / 1000; + tlb_miss = display->fifo_size*display->cacheline_size - + sprite_width * 8; + if (tlb_miss > 0) + entries += tlb_miss; + entries = howmany(entries, display->cacheline_size); + *sprite_wm = entries + display->guard_size; + if (*sprite_wm > (int)display->max_wm) + *sprite_wm = display->max_wm; + + return true; +} + +static bool +sandybridge_compute_sprite_srwm(struct drm_device *dev, int plane, + uint32_t sprite_width, int pixel_size, + const struct intel_watermark_params *display, + int latency_ns, int *sprite_wm) +{ + struct drm_crtc *crtc; + unsigned long line_time_us; + int clock; + int line_count, line_size; + int small, large; + int entries; + + if (!latency_ns) { + *sprite_wm = 0; + return false; + } + + crtc = intel_get_crtc_for_plane(dev, plane); + clock = crtc->mode.clock; + if (!clock) { + *sprite_wm = 0; + return false; + } + + line_time_us = (sprite_width * 1000) / clock; + if (!line_time_us) { + *sprite_wm = 0; + return false; + } + + line_count = (latency_ns / line_time_us + 1000) / 1000; + line_size = sprite_width * pixel_size; + + /* Use the minimum of the small and large buffer method for primary */ + small = ((clock * pixel_size / 1000) * latency_ns) / 1000; + large = line_count * line_size; + + entries = howmany(min(small, large), display->cacheline_size); + *sprite_wm = entries + display->guard_size; + + return *sprite_wm > 0x3ff ? false : true; +} + +static void sandybridge_update_sprite_wm(struct drm_device *dev, int pipe, + uint32_t sprite_width, int pixel_size) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int latency = SNB_READ_WM0_LATENCY() * 100; /* In unit 0.1us */ + u32 val; + int sprite_wm, reg; + int ret; + + switch (pipe) { + case 0: + reg = WM0_PIPEA_ILK; + break; + case 1: + reg = WM0_PIPEB_ILK; + break; + case 2: + reg = WM0_PIPEC_IVB; + break; + default: + return; /* bad pipe */ + } + + ret = sandybridge_compute_sprite_wm(dev, pipe, sprite_width, pixel_size, + &sandybridge_display_wm_info, + latency, &sprite_wm); + if (!ret) { + DRM_DEBUG_KMS("failed to compute sprite wm for pipe %d\n", + pipe); + return; + } + + val = I915_READ(reg); + val &= ~WM0_PIPE_SPRITE_MASK; + I915_WRITE(reg, val | (sprite_wm << WM0_PIPE_SPRITE_SHIFT)); + DRM_DEBUG_KMS("sprite watermarks For pipe %d - %d\n", pipe, sprite_wm); + + + ret = sandybridge_compute_sprite_srwm(dev, pipe, sprite_width, + pixel_size, + &sandybridge_display_srwm_info, + SNB_READ_WM1_LATENCY() * 500, + &sprite_wm); + if (!ret) { + DRM_DEBUG_KMS("failed to compute sprite lp1 wm on pipe %d\n", + pipe); + return; + } + I915_WRITE(WM1S_LP_ILK, sprite_wm); + + /* Only IVB has two more LP watermarks for sprite */ + if (!IS_IVYBRIDGE(dev)) + return; + + ret = sandybridge_compute_sprite_srwm(dev, pipe, sprite_width, + pixel_size, + &sandybridge_display_srwm_info, + SNB_READ_WM2_LATENCY() * 500, + &sprite_wm); + if (!ret) { + DRM_DEBUG_KMS("failed to compute sprite lp2 wm on pipe %d\n", + pipe); + return; + } + I915_WRITE(WM2S_LP_IVB, sprite_wm); + + ret = sandybridge_compute_sprite_srwm(dev, pipe, sprite_width, + pixel_size, + &sandybridge_display_srwm_info, + SNB_READ_WM3_LATENCY() * 500, + &sprite_wm); + if (!ret) { + DRM_DEBUG_KMS("failed to compute sprite lp3 wm on pipe %d\n", + pipe); + return; + } + I915_WRITE(WM3S_LP_IVB, sprite_wm); +} + +/** + * intel_update_watermarks - update FIFO watermark values based on current modes + * + * Calculate watermark values for the various WM regs based on current mode + * and plane configuration. + * + * There are several cases to deal with here: + * - normal (i.e. non-self-refresh) + * - self-refresh (SR) mode + * - lines are large relative to FIFO size (buffer can hold up to 2) + * - lines are small relative to FIFO size (buffer can hold more than 2 + * lines), so need to account for TLB latency + * + * The normal calculation is: + * watermark = dotclock * bytes per pixel * latency + * where latency is platform & configuration dependent (we assume pessimal + * values here). + * + * The SR calculation is: + * watermark = (trunc(latency/line time)+1) * surface width * + * bytes per pixel + * where + * line time = htotal / dotclock + * surface width = hdisplay for normal plane and 64 for cursor + * and latency is assumed to be high, as above. + * + * The final value programmed to the register should always be rounded up, + * and include an extra 2 entries to account for clock crossings. + * + * We don't use the sprite, so we can ignore that. And on Crestline we have + * to set the non-SR watermarks to 8. + */ +static void intel_update_watermarks(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + if (dev_priv->display.update_wm) + dev_priv->display.update_wm(dev); +} + +void intel_update_sprite_watermarks(struct drm_device *dev, int pipe, + uint32_t sprite_width, int pixel_size) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + if (dev_priv->display.update_sprite_wm) + dev_priv->display.update_sprite_wm(dev, pipe, sprite_width, + pixel_size); +} + +static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) +{ + if (i915_panel_use_ssc >= 0) + return i915_panel_use_ssc != 0; + return dev_priv->lvds_use_ssc + && !(dev_priv->quirks & QUIRK_LVDS_SSC_DISABLE); +} + +/** + * intel_choose_pipe_bpp_dither - figure out what color depth the pipe should send + * @crtc: CRTC structure + * @mode: requested mode + * + * A pipe may be connected to one or more outputs. Based on the depth of the + * attached framebuffer, choose a good color depth to use on the pipe. + * + * If possible, match the pipe depth to the fb depth. In some cases, this + * isn't ideal, because the connected output supports a lesser or restricted + * set of depths. Resolve that here: + * LVDS typically supports only 6bpc, so clamp down in that case + * HDMI supports only 8bpc or 12bpc, so clamp to 8bpc with dither for 10bpc + * Displays may support a restricted set as well, check EDID and clamp as + * appropriate. + * DP may want to dither down to 6bpc to fit larger modes + * + * RETURNS: + * Dithering requirement (i.e. false if display bpc and pipe bpc match, + * true if they don't match). + */ +static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc, + unsigned int *pipe_bpp, + struct drm_display_mode *mode) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_encoder *encoder; + struct drm_connector *connector; + unsigned int display_bpc = UINT_MAX, bpc; + + /* Walk the encoders & connectors on this crtc, get min bpc */ + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { + struct intel_encoder *intel_encoder = to_intel_encoder(encoder); + + if (encoder->crtc != crtc) + continue; + + if (intel_encoder->type == INTEL_OUTPUT_LVDS) { + unsigned int lvds_bpc; + + if ((I915_READ(PCH_LVDS) & LVDS_A3_POWER_MASK) == + LVDS_A3_POWER_UP) + lvds_bpc = 8; + else + lvds_bpc = 6; + + if (lvds_bpc < display_bpc) { + DRM_DEBUG_KMS("clamping display bpc (was %d) to LVDS (%d)\n", display_bpc, lvds_bpc); + display_bpc = lvds_bpc; + } + continue; + } + + if (intel_encoder->type == INTEL_OUTPUT_EDP) { + /* Use VBT settings if we have an eDP panel */ + unsigned int edp_bpc = dev_priv->edp.bpp / 3; + + if (edp_bpc < display_bpc) { + DRM_DEBUG_KMS("clamping display bpc (was %d) to eDP (%d)\n", display_bpc, edp_bpc); + display_bpc = edp_bpc; + } + continue; + } + + /* Not one of the known troublemakers, check the EDID */ + list_for_each_entry(connector, &dev->mode_config.connector_list, + head) { + if (connector->encoder != encoder) + continue; + + /* Don't use an invalid EDID bpc value */ + if (connector->display_info.bpc && + connector->display_info.bpc < display_bpc) { + DRM_DEBUG_KMS("clamping display bpc (was %d) to EDID reported max of %d\n", display_bpc, connector->display_info.bpc); + display_bpc = connector->display_info.bpc; + } + } + + /* + * HDMI is either 12 or 8, so if the display lets 10bpc sneak + * through, clamp it down. (Note: >12bpc will be caught below.) + */ + if (intel_encoder->type == INTEL_OUTPUT_HDMI) { + if (display_bpc > 8 && display_bpc < 12) { + DRM_DEBUG_KMS("forcing bpc to 12 for HDMI\n"); + display_bpc = 12; + } else { + DRM_DEBUG_KMS("forcing bpc to 8 for HDMI\n"); + display_bpc = 8; + } + } + } + + if (mode->private_flags & INTEL_MODE_DP_FORCE_6BPC) { + DRM_DEBUG_KMS("Dithering DP to 6bpc\n"); + display_bpc = 6; + } + + /* + * We could just drive the pipe at the highest bpc all the time and + * enable dithering as needed, but that costs bandwidth. So choose + * the minimum value that expresses the full color range of the fb but + * also stays within the max display bpc discovered above. + */ + + switch (crtc->fb->depth) { + case 8: + bpc = 8; /* since we go through a colormap */ + break; + case 15: + case 16: + bpc = 6; /* min is 18bpp */ + break; + case 24: + bpc = 8; + break; + case 30: + bpc = 10; + break; + case 48: + bpc = 12; + break; + default: + DRM_DEBUG("unsupported depth, assuming 24 bits\n"); + bpc = min((unsigned int)8, display_bpc); + break; + } + + display_bpc = min(display_bpc, bpc); + + DRM_DEBUG_KMS("setting pipe bpc to %d (max display bpc %d)\n", + bpc, display_bpc); + + *pipe_bpp = display_bpc * 3; + + return display_bpc != bpc; +} + +static int i9xx_get_refclk(struct drm_crtc *crtc, int num_connectors) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + int refclk; + + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && + intel_panel_use_ssc(dev_priv) && num_connectors < 2) { + refclk = dev_priv->lvds_ssc_freq * 1000; + DRM_DEBUG_KMS("using SSC reference clock of %d MHz\n", + refclk / 1000); + } else if (!IS_GEN2(dev)) { + refclk = 96000; + } else { + refclk = 48000; + } + + return refclk; +} + +static void i9xx_adjust_sdvo_tv_clock(struct drm_display_mode *adjusted_mode, + intel_clock_t *clock) +{ + /* SDVO TV has fixed PLL values depend on its clock range, + this mirrors vbios setting. */ + if (adjusted_mode->clock >= 100000 + && adjusted_mode->clock < 140500) { + clock->p1 = 2; + clock->p2 = 10; + clock->n = 3; + clock->m1 = 16; + clock->m2 = 8; + } else if (adjusted_mode->clock >= 140500 + && adjusted_mode->clock <= 200000) { + clock->p1 = 1; + clock->p2 = 10; + clock->n = 6; + clock->m1 = 12; + clock->m2 = 8; + } +} + +static void i9xx_update_pll_dividers(struct drm_crtc *crtc, + intel_clock_t *clock, + intel_clock_t *reduced_clock) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + u32 fp, fp2 = 0; + + if (IS_PINEVIEW(dev)) { + fp = (1 << clock->n) << 16 | clock->m1 << 8 | clock->m2; + if (reduced_clock) + fp2 = (1 << reduced_clock->n) << 16 | + reduced_clock->m1 << 8 | reduced_clock->m2; + } else { + fp = clock->n << 16 | clock->m1 << 8 | clock->m2; + if (reduced_clock) + fp2 = reduced_clock->n << 16 | reduced_clock->m1 << 8 | + reduced_clock->m2; + } + + I915_WRITE(FP0(pipe), fp); + + intel_crtc->lowfreq_avail = false; + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && + reduced_clock && i915_powersave) { + I915_WRITE(FP1(pipe), fp2); + intel_crtc->lowfreq_avail = true; + } else { + I915_WRITE(FP1(pipe), fp); + } +} + +static int i9xx_crtc_mode_set(struct drm_crtc *crtc, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode, + int x, int y, + struct drm_framebuffer *old_fb) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + int plane = intel_crtc->plane; + int refclk, num_connectors = 0; + intel_clock_t clock, reduced_clock; + u32 dpll, dspcntr, pipeconf, vsyncshift; + bool ok, has_reduced_clock = false, is_sdvo = false, is_dvo = false; + bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false; + struct drm_mode_config *mode_config = &dev->mode_config; + struct intel_encoder *encoder; + const intel_limit_t *limit; + int ret; + u32 temp; + u32 lvds_sync = 0; + + list_for_each_entry(encoder, &mode_config->encoder_list, base.head) { + if (encoder->base.crtc != crtc) + continue; + + switch (encoder->type) { + case INTEL_OUTPUT_LVDS: + is_lvds = true; + break; + case INTEL_OUTPUT_SDVO: + case INTEL_OUTPUT_HDMI: + is_sdvo = true; + if (encoder->needs_tv_clock) + is_tv = true; + break; + case INTEL_OUTPUT_DVO: + is_dvo = true; + break; + case INTEL_OUTPUT_TVOUT: + is_tv = true; + break; + case INTEL_OUTPUT_ANALOG: + is_crt = true; + break; + case INTEL_OUTPUT_DISPLAYPORT: + is_dp = true; + break; + } + + num_connectors++; + } + + refclk = i9xx_get_refclk(crtc, num_connectors); + + /* + * Returns a set of divisors for the desired target clock with the given + * refclk, or false. The returned values represent the clock equation: + * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2. + */ + limit = intel_limit(crtc, refclk); + ok = limit->find_pll(limit, crtc, adjusted_mode->clock, refclk, NULL, + &clock); + if (!ok) { + DRM_ERROR("Couldn't find PLL settings for mode!\n"); + return -EINVAL; + } + + /* Ensure that the cursor is valid for the new mode before changing... */ + intel_crtc_update_cursor(crtc, true); + + if (is_lvds && dev_priv->lvds_downclock_avail) { + /* + * Ensure we match the reduced clock's P to the target clock. + * If the clocks don't match, we can't switch the display clock + * by using the FP0/FP1. In such case we will disable the LVDS + * downclock feature. + */ + has_reduced_clock = limit->find_pll(limit, crtc, + dev_priv->lvds_downclock, + refclk, + &clock, + &reduced_clock); + } + + if (is_sdvo && is_tv) + i9xx_adjust_sdvo_tv_clock(adjusted_mode, &clock); + + i9xx_update_pll_dividers(crtc, &clock, has_reduced_clock ? + &reduced_clock : NULL); + + dpll = DPLL_VGA_MODE_DIS; + + if (!IS_GEN2(dev)) { + if (is_lvds) + dpll |= DPLLB_MODE_LVDS; + else + dpll |= DPLLB_MODE_DAC_SERIAL; + if (is_sdvo) { + int pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode); + if (pixel_multiplier > 1) { + if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) + dpll |= (pixel_multiplier - 1) << SDVO_MULTIPLIER_SHIFT_HIRES; + } + dpll |= DPLL_DVO_HIGH_SPEED; + } + if (is_dp) + dpll |= DPLL_DVO_HIGH_SPEED; + + /* compute bitmask from p1 value */ + if (IS_PINEVIEW(dev)) + dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW; + else { + dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT; + if (IS_G4X(dev) && has_reduced_clock) + dpll |= (1 << (reduced_clock.p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT; + } + switch (clock.p2) { + case 5: + dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_5; + break; + case 7: + dpll |= DPLLB_LVDS_P2_CLOCK_DIV_7; + break; + case 10: + dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_10; + break; + case 14: + dpll |= DPLLB_LVDS_P2_CLOCK_DIV_14; + break; + } + if (INTEL_INFO(dev)->gen >= 4) + dpll |= (6 << PLL_LOAD_PULSE_PHASE_SHIFT); + } else { + if (is_lvds) { + dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT; + } else { + if (clock.p1 == 2) + dpll |= PLL_P1_DIVIDE_BY_TWO; + else + dpll |= (clock.p1 - 2) << DPLL_FPA01_P1_POST_DIV_SHIFT; + if (clock.p2 == 4) + dpll |= PLL_P2_DIVIDE_BY_4; + } + } + + if (is_sdvo && is_tv) + dpll |= PLL_REF_INPUT_TVCLKINBC; + else if (is_tv) + /* XXX: just matching BIOS for now */ + /* dpll |= PLL_REF_INPUT_TVCLKINBC; */ + dpll |= 3; + else if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2) + dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN; + else + dpll |= PLL_REF_INPUT_DREFCLK; + + /* setup pipeconf */ + pipeconf = I915_READ(PIPECONF(pipe)); + + /* Set up the display plane register */ + dspcntr = DISPPLANE_GAMMA_ENABLE; + + if (pipe == 0) + dspcntr &= ~DISPPLANE_SEL_PIPE_MASK; + else + dspcntr |= DISPPLANE_SEL_PIPE_B; + + if (pipe == 0 && INTEL_INFO(dev)->gen < 4) { + /* Enable pixel doubling when the dot clock is > 90% of the (display) + * core speed. + * + * XXX: No double-wide on 915GM pipe B. Is that the only reason for the + * pipe == 0 check? + */ + if (mode->clock > + dev_priv->display.get_display_clock_speed(dev) * 9 / 10) + pipeconf |= PIPECONF_DOUBLE_WIDE; + else + pipeconf &= ~PIPECONF_DOUBLE_WIDE; + } + + /* default to 8bpc */ + pipeconf &= ~(PIPECONF_BPP_MASK | PIPECONF_DITHER_EN); + if (is_dp) { + if (mode->private_flags & INTEL_MODE_DP_FORCE_6BPC) { + pipeconf |= PIPECONF_BPP_6 | + PIPECONF_DITHER_EN | + PIPECONF_DITHER_TYPE_SP; + } + } + + dpll |= DPLL_VCO_ENABLE; + + DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B'); + drm_mode_debug_printmodeline(mode); + + I915_WRITE(DPLL(pipe), dpll & ~DPLL_VCO_ENABLE); + + POSTING_READ(DPLL(pipe)); + DELAY(150); + + /* The LVDS pin pair needs to be on before the DPLLs are enabled. + * This is an exception to the general rule that mode_set doesn't turn + * things on. + */ + if (is_lvds) { + temp = I915_READ(LVDS); + temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP; + if (pipe == 1) { + temp |= LVDS_PIPEB_SELECT; + } else { + temp &= ~LVDS_PIPEB_SELECT; + } + /* set the corresponsding LVDS_BORDER bit */ + temp |= dev_priv->lvds_border_bits; + /* Set the B0-B3 data pairs corresponding to whether we're going to + * set the DPLLs for dual-channel mode or not. + */ + if (clock.p2 == 7) + temp |= LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP; + else + temp &= ~(LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP); + + /* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP) + * appropriately here, but we need to look more thoroughly into how + * panels behave in the two modes. + */ + /* set the dithering flag on LVDS as needed */ + if (INTEL_INFO(dev)->gen >= 4) { + if (dev_priv->lvds_dither) + temp |= LVDS_ENABLE_DITHER; + else + temp &= ~LVDS_ENABLE_DITHER; + } + if (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC) + lvds_sync |= LVDS_HSYNC_POLARITY; + if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC) + lvds_sync |= LVDS_VSYNC_POLARITY; + if ((temp & (LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY)) + != lvds_sync) { + char flags[2] = "-+"; + DRM_INFO("Changing LVDS panel from " + "(%chsync, %cvsync) to (%chsync, %cvsync)\n", + flags[!(temp & LVDS_HSYNC_POLARITY)], + flags[!(temp & LVDS_VSYNC_POLARITY)], + flags[!(lvds_sync & LVDS_HSYNC_POLARITY)], + flags[!(lvds_sync & LVDS_VSYNC_POLARITY)]); + temp &= ~(LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY); + temp |= lvds_sync; + } + I915_WRITE(LVDS, temp); + } + + if (is_dp) { + intel_dp_set_m_n(crtc, mode, adjusted_mode); + } + + I915_WRITE(DPLL(pipe), dpll); + + /* Wait for the clocks to stabilize. */ + POSTING_READ(DPLL(pipe)); + DELAY(150); + + if (INTEL_INFO(dev)->gen >= 4) { + temp = 0; + if (is_sdvo) { + temp = intel_mode_get_pixel_multiplier(adjusted_mode); + if (temp > 1) + temp = (temp - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT; + else + temp = 0; + } + I915_WRITE(DPLL_MD(pipe), temp); + } else { + /* The pixel multiplier can only be updated once the + * DPLL is enabled and the clocks are stable. + * + * So write it again. + */ + I915_WRITE(DPLL(pipe), dpll); + } + + if (HAS_PIPE_CXSR(dev)) { + if (intel_crtc->lowfreq_avail) { + DRM_DEBUG_KMS("enabling CxSR downclocking\n"); + pipeconf |= PIPECONF_CXSR_DOWNCLOCK; + } else { + DRM_DEBUG_KMS("disabling CxSR downclocking\n"); + pipeconf &= ~PIPECONF_CXSR_DOWNCLOCK; + } + } + + pipeconf &= ~PIPECONF_INTERLACE_MASK; + if (!IS_GEN2(dev) && + adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) { + pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION; + /* the chip adds 2 halflines automatically */ + adjusted_mode->crtc_vtotal -= 1; + adjusted_mode->crtc_vblank_end -= 1; + vsyncshift = adjusted_mode->crtc_hsync_start + - adjusted_mode->crtc_htotal/2; + } else { + pipeconf |= PIPECONF_PROGRESSIVE; + vsyncshift = 0; + } + + if (!IS_GEN3(dev)) + I915_WRITE(VSYNCSHIFT(pipe), vsyncshift); + + I915_WRITE(HTOTAL(pipe), + (adjusted_mode->crtc_hdisplay - 1) | + ((adjusted_mode->crtc_htotal - 1) << 16)); + I915_WRITE(HBLANK(pipe), + (adjusted_mode->crtc_hblank_start - 1) | + ((adjusted_mode->crtc_hblank_end - 1) << 16)); + I915_WRITE(HSYNC(pipe), + (adjusted_mode->crtc_hsync_start - 1) | + ((adjusted_mode->crtc_hsync_end - 1) << 16)); + + I915_WRITE(VTOTAL(pipe), + (adjusted_mode->crtc_vdisplay - 1) | + ((adjusted_mode->crtc_vtotal - 1) << 16)); + I915_WRITE(VBLANK(pipe), + (adjusted_mode->crtc_vblank_start - 1) | + ((adjusted_mode->crtc_vblank_end - 1) << 16)); + I915_WRITE(VSYNC(pipe), + (adjusted_mode->crtc_vsync_start - 1) | + ((adjusted_mode->crtc_vsync_end - 1) << 16)); + + /* pipesrc and dspsize control the size that is scaled from, + * which should always be the user's requested size. + */ + I915_WRITE(DSPSIZE(plane), + ((mode->vdisplay - 1) << 16) | + (mode->hdisplay - 1)); + I915_WRITE(DSPPOS(plane), 0); + I915_WRITE(PIPESRC(pipe), + ((mode->hdisplay - 1) << 16) | (mode->vdisplay - 1)); + + I915_WRITE(PIPECONF(pipe), pipeconf); + POSTING_READ(PIPECONF(pipe)); + intel_enable_pipe(dev_priv, pipe, false); + + intel_wait_for_vblank(dev, pipe); + + I915_WRITE(DSPCNTR(plane), dspcntr); + POSTING_READ(DSPCNTR(plane)); + intel_enable_plane(dev_priv, plane, pipe); + + ret = intel_pipe_set_base(crtc, x, y, old_fb); + + intel_update_watermarks(dev); + + return ret; +} + +/* + * Initialize reference clocks when the driver loads + */ +void ironlake_init_pch_refclk(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_mode_config *mode_config = &dev->mode_config; + struct intel_encoder *encoder; + u32 temp; + bool has_lvds = false; + bool has_cpu_edp = false; + bool has_pch_edp = false; + bool has_panel = false; + bool has_ck505 = false; + bool can_ssc = false; + + /* We need to take the global config into account */ + list_for_each_entry(encoder, &mode_config->encoder_list, + base.head) { + switch (encoder->type) { + case INTEL_OUTPUT_LVDS: + has_panel = true; + has_lvds = true; + break; + case INTEL_OUTPUT_EDP: + has_panel = true; + if (intel_encoder_is_pch_edp(&encoder->base)) + has_pch_edp = true; + else + has_cpu_edp = true; + break; + } + } + + if (HAS_PCH_IBX(dev)) { + has_ck505 = dev_priv->display_clock_mode; + can_ssc = has_ck505; + } else { + has_ck505 = false; + can_ssc = true; + } + + DRM_DEBUG_KMS("has_panel %d has_lvds %d has_pch_edp %d has_cpu_edp %d has_ck505 %d\n", + has_panel, has_lvds, has_pch_edp, has_cpu_edp, + has_ck505); + + /* Ironlake: try to setup display ref clock before DPLL + * enabling. This is only under driver's control after + * PCH B stepping, previous chipset stepping should be + * ignoring this setting. + */ + temp = I915_READ(PCH_DREF_CONTROL); + /* Always enable nonspread source */ + temp &= ~DREF_NONSPREAD_SOURCE_MASK; + + if (has_ck505) + temp |= DREF_NONSPREAD_CK505_ENABLE; + else + temp |= DREF_NONSPREAD_SOURCE_ENABLE; + + if (has_panel) { + temp &= ~DREF_SSC_SOURCE_MASK; + temp |= DREF_SSC_SOURCE_ENABLE; + + /* SSC must be turned on before enabling the CPU output */ + if (intel_panel_use_ssc(dev_priv) && can_ssc) { + DRM_DEBUG_KMS("Using SSC on panel\n"); + temp |= DREF_SSC1_ENABLE; + } else + temp &= ~DREF_SSC1_ENABLE; + + /* Get SSC going before enabling the outputs */ + I915_WRITE(PCH_DREF_CONTROL, temp); + POSTING_READ(PCH_DREF_CONTROL); + DELAY(200); + + temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK; + + /* Enable CPU source on CPU attached eDP */ + if (has_cpu_edp) { + if (intel_panel_use_ssc(dev_priv) && can_ssc) { + DRM_DEBUG_KMS("Using SSC on eDP\n"); + temp |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD; + } + else + temp |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD; + } else + temp |= DREF_CPU_SOURCE_OUTPUT_DISABLE; + + I915_WRITE(PCH_DREF_CONTROL, temp); + POSTING_READ(PCH_DREF_CONTROL); + DELAY(200); + } else { + DRM_DEBUG_KMS("Disabling SSC entirely\n"); + + temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK; + + /* Turn off CPU output */ + temp |= DREF_CPU_SOURCE_OUTPUT_DISABLE; + + I915_WRITE(PCH_DREF_CONTROL, temp); + POSTING_READ(PCH_DREF_CONTROL); + DELAY(200); + + /* Turn off the SSC source */ + temp &= ~DREF_SSC_SOURCE_MASK; + temp |= DREF_SSC_SOURCE_DISABLE; + + /* Turn off SSC1 */ + temp &= ~ DREF_SSC1_ENABLE; + + I915_WRITE(PCH_DREF_CONTROL, temp); + POSTING_READ(PCH_DREF_CONTROL); + DELAY(200); + } +} + +static int ironlake_get_refclk(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_encoder *encoder; + struct drm_mode_config *mode_config = &dev->mode_config; + struct intel_encoder *edp_encoder = NULL; + int num_connectors = 0; + bool is_lvds = false; + + list_for_each_entry(encoder, &mode_config->encoder_list, base.head) { + if (encoder->base.crtc != crtc) + continue; + + switch (encoder->type) { + case INTEL_OUTPUT_LVDS: + is_lvds = true; + break; + case INTEL_OUTPUT_EDP: + edp_encoder = encoder; + break; + } + num_connectors++; + } + + if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2) { + DRM_DEBUG_KMS("using SSC reference clock of %d MHz\n", + dev_priv->lvds_ssc_freq); + return dev_priv->lvds_ssc_freq * 1000; + } + + return 120000; +} + +static int ironlake_crtc_mode_set(struct drm_crtc *crtc, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode, + int x, int y, + struct drm_framebuffer *old_fb) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + int plane = intel_crtc->plane; + int refclk, num_connectors = 0; + intel_clock_t clock, reduced_clock; + u32 dpll, fp = 0, fp2 = 0, dspcntr, pipeconf; + bool ok, has_reduced_clock = false, is_sdvo = false; + bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false; + struct intel_encoder *has_edp_encoder = NULL; + struct drm_mode_config *mode_config = &dev->mode_config; + struct intel_encoder *encoder; + const intel_limit_t *limit; + int ret; + struct fdi_m_n m_n = {0}; + u32 temp; + u32 lvds_sync = 0; + int target_clock, pixel_multiplier, lane, link_bw, factor; + unsigned int pipe_bpp; + bool dither; + + list_for_each_entry(encoder, &mode_config->encoder_list, base.head) { + if (encoder->base.crtc != crtc) + continue; + + switch (encoder->type) { + case INTEL_OUTPUT_LVDS: + is_lvds = true; + break; + case INTEL_OUTPUT_SDVO: + case INTEL_OUTPUT_HDMI: + is_sdvo = true; + if (encoder->needs_tv_clock) + is_tv = true; + break; + case INTEL_OUTPUT_TVOUT: + is_tv = true; + break; + case INTEL_OUTPUT_ANALOG: + is_crt = true; + break; + case INTEL_OUTPUT_DISPLAYPORT: + is_dp = true; + break; + case INTEL_OUTPUT_EDP: + has_edp_encoder = encoder; + break; + } + + num_connectors++; + } + + refclk = ironlake_get_refclk(crtc); + + /* + * Returns a set of divisors for the desired target clock with the given + * refclk, or false. The returned values represent the clock equation: + * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2. + */ + limit = intel_limit(crtc, refclk); + ok = limit->find_pll(limit, crtc, adjusted_mode->clock, refclk, NULL, + &clock); + if (!ok) { + DRM_ERROR("Couldn't find PLL settings for mode!\n"); + return -EINVAL; + } + + /* Ensure that the cursor is valid for the new mode before changing... */ + intel_crtc_update_cursor(crtc, true); + + if (is_lvds && dev_priv->lvds_downclock_avail) { + /* + * Ensure we match the reduced clock's P to the target clock. + * If the clocks don't match, we can't switch the display clock + * by using the FP0/FP1. In such case we will disable the LVDS + * downclock feature. + */ + has_reduced_clock = limit->find_pll(limit, crtc, + dev_priv->lvds_downclock, + refclk, + &clock, + &reduced_clock); + } + /* SDVO TV has fixed PLL values depend on its clock range, + this mirrors vbios setting. */ + if (is_sdvo && is_tv) { + if (adjusted_mode->clock >= 100000 + && adjusted_mode->clock < 140500) { + clock.p1 = 2; + clock.p2 = 10; + clock.n = 3; + clock.m1 = 16; + clock.m2 = 8; + } else if (adjusted_mode->clock >= 140500 + && adjusted_mode->clock <= 200000) { + clock.p1 = 1; + clock.p2 = 10; + clock.n = 6; + clock.m1 = 12; + clock.m2 = 8; + } + } + + /* FDI link */ + pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode); + lane = 0; + /* CPU eDP doesn't require FDI link, so just set DP M/N + according to current link config */ + if (has_edp_encoder && + !intel_encoder_is_pch_edp(&has_edp_encoder->base)) { + target_clock = mode->clock; + intel_edp_link_config(has_edp_encoder, + &lane, &link_bw); + } else { + /* [e]DP over FDI requires target mode clock + instead of link clock */ + if (is_dp || intel_encoder_is_pch_edp(&has_edp_encoder->base)) + target_clock = mode->clock; + else + target_clock = adjusted_mode->clock; + + /* FDI is a binary signal running at ~2.7GHz, encoding + * each output octet as 10 bits. The actual frequency + * is stored as a divider into a 100MHz clock, and the + * mode pixel clock is stored in units of 1KHz. + * Hence the bw of each lane in terms of the mode signal + * is: + */ + link_bw = intel_fdi_link_freq(dev) * MHz(100)/KHz(1)/10; + } + + /* determine panel color depth */ + temp = I915_READ(PIPECONF(pipe)); + temp &= ~PIPE_BPC_MASK; + dither = intel_choose_pipe_bpp_dither(crtc, &pipe_bpp, mode); + switch (pipe_bpp) { + case 18: + temp |= PIPE_6BPC; + break; + case 24: + temp |= PIPE_8BPC; + break; + case 30: + temp |= PIPE_10BPC; + break; + case 36: + temp |= PIPE_12BPC; + break; + default: + printf("intel_choose_pipe_bpp returned invalid value %d\n", + pipe_bpp); + temp |= PIPE_8BPC; + pipe_bpp = 24; + break; + } + + intel_crtc->bpp = pipe_bpp; + I915_WRITE(PIPECONF(pipe), temp); + + if (!lane) { + /* + * Account for spread spectrum to avoid + * oversubscribing the link. Max center spread + * is 2.5%; use 5% for safety's sake. + */ + u32 bps = target_clock * intel_crtc->bpp * 21 / 20; + lane = bps / (link_bw * 8) + 1; + } + + intel_crtc->fdi_lanes = lane; + + if (pixel_multiplier > 1) + link_bw *= pixel_multiplier; + ironlake_compute_m_n(intel_crtc->bpp, lane, target_clock, link_bw, + &m_n); + + fp = clock.n << 16 | clock.m1 << 8 | clock.m2; + if (has_reduced_clock) + fp2 = reduced_clock.n << 16 | reduced_clock.m1 << 8 | + reduced_clock.m2; + + /* Enable autotuning of the PLL clock (if permissible) */ + factor = 21; + if (is_lvds) { + if ((intel_panel_use_ssc(dev_priv) && + dev_priv->lvds_ssc_freq == 100) || + (I915_READ(PCH_LVDS) & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP) + factor = 25; + } else if (is_sdvo && is_tv) + factor = 20; + + if (clock.m < factor * clock.n) + fp |= FP_CB_TUNE; + + dpll = 0; + + if (is_lvds) + dpll |= DPLLB_MODE_LVDS; + else + dpll |= DPLLB_MODE_DAC_SERIAL; + if (is_sdvo) { + int pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode); + if (pixel_multiplier > 1) { + dpll |= (pixel_multiplier - 1) << PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT; + } + dpll |= DPLL_DVO_HIGH_SPEED; + } + if (is_dp || intel_encoder_is_pch_edp(&has_edp_encoder->base)) + dpll |= DPLL_DVO_HIGH_SPEED; + + /* compute bitmask from p1 value */ + dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT; + /* also FPA1 */ + dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT; + + switch (clock.p2) { + case 5: + dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_5; + break; + case 7: + dpll |= DPLLB_LVDS_P2_CLOCK_DIV_7; + break; + case 10: + dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_10; + break; + case 14: + dpll |= DPLLB_LVDS_P2_CLOCK_DIV_14; + break; + } + + if (is_sdvo && is_tv) + dpll |= PLL_REF_INPUT_TVCLKINBC; + else if (is_tv) + /* XXX: just matching BIOS for now */ + /* dpll |= PLL_REF_INPUT_TVCLKINBC; */ + dpll |= 3; + else if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2) + dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN; + else + dpll |= PLL_REF_INPUT_DREFCLK; + + /* setup pipeconf */ + pipeconf = I915_READ(PIPECONF(pipe)); + + /* Set up the display plane register */ + dspcntr = DISPPLANE_GAMMA_ENABLE; + + DRM_DEBUG_KMS("Mode for pipe %d:\n", pipe); + drm_mode_debug_printmodeline(mode); + + /* PCH eDP needs FDI, but CPU eDP does not */ + if (!intel_crtc->no_pll) { + if (!has_edp_encoder || + intel_encoder_is_pch_edp(&has_edp_encoder->base)) { + I915_WRITE(PCH_FP0(pipe), fp); + I915_WRITE(PCH_DPLL(pipe), dpll & ~DPLL_VCO_ENABLE); + + POSTING_READ(PCH_DPLL(pipe)); + DELAY(150); + } + } else { + if (dpll == (I915_READ(PCH_DPLL(0)) & 0x7fffffff) && + fp == I915_READ(PCH_FP0(0))) { + intel_crtc->use_pll_a = true; + DRM_DEBUG_KMS("using pipe a dpll\n"); + } else if (dpll == (I915_READ(PCH_DPLL(1)) & 0x7fffffff) && + fp == I915_READ(PCH_FP0(1))) { + intel_crtc->use_pll_a = false; + DRM_DEBUG_KMS("using pipe b dpll\n"); + } else { + DRM_DEBUG_KMS("no matching PLL configuration for pipe 2\n"); + return -EINVAL; + } + } + + /* The LVDS pin pair needs to be on before the DPLLs are enabled. + * This is an exception to the general rule that mode_set doesn't turn + * things on. + */ + if (is_lvds) { + temp = I915_READ(PCH_LVDS); + temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP; + if (HAS_PCH_CPT(dev)) { + temp &= ~PORT_TRANS_SEL_MASK; + temp |= PORT_TRANS_SEL_CPT(pipe); + } else { + if (pipe == 1) + temp |= LVDS_PIPEB_SELECT; + else + temp &= ~LVDS_PIPEB_SELECT; + } + + /* set the corresponsding LVDS_BORDER bit */ + temp |= dev_priv->lvds_border_bits; + /* Set the B0-B3 data pairs corresponding to whether we're going to + * set the DPLLs for dual-channel mode or not. + */ + if (clock.p2 == 7) + temp |= LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP; + else + temp &= ~(LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP); + + /* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP) + * appropriately here, but we need to look more thoroughly into how + * panels behave in the two modes. + */ + if (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC) + lvds_sync |= LVDS_HSYNC_POLARITY; + if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC) + lvds_sync |= LVDS_VSYNC_POLARITY; + if ((temp & (LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY)) + != lvds_sync) { + char flags[2] = "-+"; + DRM_INFO("Changing LVDS panel from " + "(%chsync, %cvsync) to (%chsync, %cvsync)\n", + flags[!(temp & LVDS_HSYNC_POLARITY)], + flags[!(temp & LVDS_VSYNC_POLARITY)], + flags[!(lvds_sync & LVDS_HSYNC_POLARITY)], + flags[!(lvds_sync & LVDS_VSYNC_POLARITY)]); + temp &= ~(LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY); + temp |= lvds_sync; + } + I915_WRITE(PCH_LVDS, temp); + } + + pipeconf &= ~PIPECONF_DITHER_EN; + pipeconf &= ~PIPECONF_DITHER_TYPE_MASK; + if ((is_lvds && dev_priv->lvds_dither) || dither) { + pipeconf |= PIPECONF_DITHER_EN; + pipeconf |= PIPECONF_DITHER_TYPE_SP; + } + if (is_dp || intel_encoder_is_pch_edp(&has_edp_encoder->base)) { + intel_dp_set_m_n(crtc, mode, adjusted_mode); + } else { + /* For non-DP output, clear any trans DP clock recovery setting.*/ + I915_WRITE(TRANSDATA_M1(pipe), 0); + I915_WRITE(TRANSDATA_N1(pipe), 0); + I915_WRITE(TRANSDPLINK_M1(pipe), 0); + I915_WRITE(TRANSDPLINK_N1(pipe), 0); + } + + if (!intel_crtc->no_pll && + (!has_edp_encoder || + intel_encoder_is_pch_edp(&has_edp_encoder->base))) { + I915_WRITE(PCH_DPLL(pipe), dpll); + + /* Wait for the clocks to stabilize. */ + POSTING_READ(PCH_DPLL(pipe)); + DELAY(150); + + /* The pixel multiplier can only be updated once the + * DPLL is enabled and the clocks are stable. + * + * So write it again. + */ + I915_WRITE(PCH_DPLL(pipe), dpll); + } + + intel_crtc->lowfreq_avail = false; + if (!intel_crtc->no_pll) { + if (is_lvds && has_reduced_clock && i915_powersave) { + I915_WRITE(PCH_FP1(pipe), fp2); + intel_crtc->lowfreq_avail = true; + if (HAS_PIPE_CXSR(dev)) { + DRM_DEBUG_KMS("enabling CxSR downclocking\n"); + pipeconf |= PIPECONF_CXSR_DOWNCLOCK; + } + } else { + I915_WRITE(PCH_FP1(pipe), fp); + if (HAS_PIPE_CXSR(dev)) { + DRM_DEBUG_KMS("disabling CxSR downclocking\n"); + pipeconf &= ~PIPECONF_CXSR_DOWNCLOCK; + } + } + } + + pipeconf &= ~PIPECONF_INTERLACE_MASK; + if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) { + pipeconf |= PIPECONF_INTERLACED_ILK; + /* the chip adds 2 halflines automatically */ + adjusted_mode->crtc_vtotal -= 1; + adjusted_mode->crtc_vblank_end -= 1; + I915_WRITE(VSYNCSHIFT(pipe), + adjusted_mode->crtc_hsync_start + - adjusted_mode->crtc_htotal/2); + } else { + pipeconf |= PIPECONF_PROGRESSIVE; + I915_WRITE(VSYNCSHIFT(pipe), 0); + } + + I915_WRITE(HTOTAL(pipe), + (adjusted_mode->crtc_hdisplay - 1) | + ((adjusted_mode->crtc_htotal - 1) << 16)); + I915_WRITE(HBLANK(pipe), + (adjusted_mode->crtc_hblank_start - 1) | + ((adjusted_mode->crtc_hblank_end - 1) << 16)); + I915_WRITE(HSYNC(pipe), + (adjusted_mode->crtc_hsync_start - 1) | + ((adjusted_mode->crtc_hsync_end - 1) << 16)); + + I915_WRITE(VTOTAL(pipe), + (adjusted_mode->crtc_vdisplay - 1) | + ((adjusted_mode->crtc_vtotal - 1) << 16)); + I915_WRITE(VBLANK(pipe), + (adjusted_mode->crtc_vblank_start - 1) | + ((adjusted_mode->crtc_vblank_end - 1) << 16)); + I915_WRITE(VSYNC(pipe), + (adjusted_mode->crtc_vsync_start - 1) | + ((adjusted_mode->crtc_vsync_end - 1) << 16)); + + /* pipesrc controls the size that is scaled from, which should + * always be the user's requested size. + */ + I915_WRITE(PIPESRC(pipe), + ((mode->hdisplay - 1) << 16) | (mode->vdisplay - 1)); + + I915_WRITE(PIPE_DATA_M1(pipe), TU_SIZE(m_n.tu) | m_n.gmch_m); + I915_WRITE(PIPE_DATA_N1(pipe), m_n.gmch_n); + I915_WRITE(PIPE_LINK_M1(pipe), m_n.link_m); + I915_WRITE(PIPE_LINK_N1(pipe), m_n.link_n); + + if (has_edp_encoder && + !intel_encoder_is_pch_edp(&has_edp_encoder->base)) { + ironlake_set_pll_edp(crtc, adjusted_mode->clock); + } + + I915_WRITE(PIPECONF(pipe), pipeconf); + POSTING_READ(PIPECONF(pipe)); + + intel_wait_for_vblank(dev, pipe); + + I915_WRITE(DSPCNTR(plane), dspcntr); + POSTING_READ(DSPCNTR(plane)); + + ret = intel_pipe_set_base(crtc, x, y, old_fb); + + intel_update_watermarks(dev); + + return ret; +} + +static int intel_crtc_mode_set(struct drm_crtc *crtc, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode, + int x, int y, + struct drm_framebuffer *old_fb) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + int ret; + + drm_vblank_pre_modeset(dev, pipe); + + ret = dev_priv->display.crtc_mode_set(crtc, mode, adjusted_mode, + x, y, old_fb); + drm_vblank_post_modeset(dev, pipe); + + if (ret) + intel_crtc->dpms_mode = DRM_MODE_DPMS_OFF; + else + intel_crtc->dpms_mode = DRM_MODE_DPMS_ON; + + return ret; +} + +static bool intel_eld_uptodate(struct drm_connector *connector, + int reg_eldv, uint32_t bits_eldv, + int reg_elda, uint32_t bits_elda, + int reg_edid) +{ + struct drm_i915_private *dev_priv = connector->dev->dev_private; + uint8_t *eld = connector->eld; + uint32_t i; + + i = I915_READ(reg_eldv); + i &= bits_eldv; + + if (!eld[0]) + return !i; + + if (!i) + return false; + + i = I915_READ(reg_elda); + i &= ~bits_elda; + I915_WRITE(reg_elda, i); + + for (i = 0; i < eld[2]; i++) + if (I915_READ(reg_edid) != *((uint32_t *)eld + i)) + return false; + + return true; +} + +static void g4x_write_eld(struct drm_connector *connector, + struct drm_crtc *crtc) +{ + struct drm_i915_private *dev_priv = connector->dev->dev_private; + uint8_t *eld = connector->eld; + uint32_t eldv; + uint32_t len; + uint32_t i; + + i = I915_READ(G4X_AUD_VID_DID); + + if (i == INTEL_AUDIO_DEVBLC || i == INTEL_AUDIO_DEVCL) + eldv = G4X_ELDV_DEVCL_DEVBLC; + else + eldv = G4X_ELDV_DEVCTG; + + if (intel_eld_uptodate(connector, + G4X_AUD_CNTL_ST, eldv, + G4X_AUD_CNTL_ST, G4X_ELD_ADDR, + G4X_HDMIW_HDMIEDID)) + return; + + i = I915_READ(G4X_AUD_CNTL_ST); + i &= ~(eldv | G4X_ELD_ADDR); + len = (i >> 9) & 0x1f; /* ELD buffer size */ + I915_WRITE(G4X_AUD_CNTL_ST, i); + + if (!eld[0]) + return; + + if (eld[2] < (uint8_t)len) + len = eld[2]; + DRM_DEBUG_KMS("ELD size %d\n", len); + for (i = 0; i < len; i++) + I915_WRITE(G4X_HDMIW_HDMIEDID, *((uint32_t *)eld + i)); + + i = I915_READ(G4X_AUD_CNTL_ST); + i |= eldv; + I915_WRITE(G4X_AUD_CNTL_ST, i); +} + +static void ironlake_write_eld(struct drm_connector *connector, + struct drm_crtc *crtc) +{ + struct drm_i915_private *dev_priv = connector->dev->dev_private; + uint8_t *eld = connector->eld; + uint32_t eldv; + uint32_t i; + int len; + int hdmiw_hdmiedid; + int aud_config; + int aud_cntl_st; + int aud_cntrl_st2; + + if (HAS_PCH_IBX(connector->dev)) { + hdmiw_hdmiedid = IBX_HDMIW_HDMIEDID_A; + aud_config = IBX_AUD_CONFIG_A; + aud_cntl_st = IBX_AUD_CNTL_ST_A; + aud_cntrl_st2 = IBX_AUD_CNTL_ST2; + } else { + hdmiw_hdmiedid = CPT_HDMIW_HDMIEDID_A; + aud_config = CPT_AUD_CONFIG_A; + aud_cntl_st = CPT_AUD_CNTL_ST_A; + aud_cntrl_st2 = CPT_AUD_CNTRL_ST2; + } + + i = to_intel_crtc(crtc)->pipe; + hdmiw_hdmiedid += i * 0x100; + aud_cntl_st += i * 0x100; + aud_config += i * 0x100; + + DRM_DEBUG_KMS("ELD on pipe %c\n", pipe_name(i)); + + i = I915_READ(aud_cntl_st); + i = (i >> 29) & 0x3; /* DIP_Port_Select, 0x1 = PortB */ + if (!i) { + DRM_DEBUG_KMS("Audio directed to unknown port\n"); + /* operate blindly on all ports */ + eldv = IBX_ELD_VALIDB; + eldv |= IBX_ELD_VALIDB << 4; + eldv |= IBX_ELD_VALIDB << 8; + } else { + DRM_DEBUG_KMS("ELD on port %c\n", 'A' + i); + eldv = IBX_ELD_VALIDB << ((i - 1) * 4); + } + + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) { + DRM_DEBUG_DRIVER("ELD: DisplayPort detected\n"); + eld[5] |= (1 << 2); /* Conn_Type, 0x1 = DisplayPort */ + I915_WRITE(aud_config, AUD_CONFIG_N_VALUE_INDEX); /* 0x1 = DP */ + } else + I915_WRITE(aud_config, 0); + + if (intel_eld_uptodate(connector, + aud_cntrl_st2, eldv, + aud_cntl_st, IBX_ELD_ADDRESS, + hdmiw_hdmiedid)) + return; + + i = I915_READ(aud_cntrl_st2); + i &= ~eldv; + I915_WRITE(aud_cntrl_st2, i); + + if (!eld[0]) + return; + + i = I915_READ(aud_cntl_st); + i &= ~IBX_ELD_ADDRESS; + I915_WRITE(aud_cntl_st, i); + + /* 84 bytes of hw ELD buffer */ + len = 21; + if (eld[2] < (uint8_t)len) + len = eld[2]; + DRM_DEBUG_KMS("ELD size %d\n", len); + for (i = 0; i < len; i++) + I915_WRITE(hdmiw_hdmiedid, *((uint32_t *)eld + i)); + + i = I915_READ(aud_cntrl_st2); + i |= eldv; + I915_WRITE(aud_cntrl_st2, i); +} + +void intel_write_eld(struct drm_encoder *encoder, + struct drm_display_mode *mode) +{ + struct drm_crtc *crtc = encoder->crtc; + struct drm_connector *connector; + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + + connector = drm_select_eld(encoder, mode); + if (!connector) + return; + + DRM_DEBUG_KMS("ELD on [CONNECTOR:%d:%s], [ENCODER:%d:%s]\n", + connector->base.id, + drm_get_connector_name(connector), + connector->encoder->base.id, + drm_get_encoder_name(connector->encoder)); + + connector->eld[6] = drm_av_sync_delay(connector, mode) / 2; + + if (dev_priv->display.write_eld) + dev_priv->display.write_eld(connector, crtc); +} + +/** Loads the palette/gamma unit for the CRTC with the prepared values */ +void intel_crtc_load_lut(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int palreg = PALETTE(intel_crtc->pipe); + int i; + + /* The clocks have to be on to load the palette. */ + if (!crtc->enabled || !intel_crtc->active) + return; + + /* use legacy palette for Ironlake */ + if (HAS_PCH_SPLIT(dev)) + palreg = LGC_PALETTE(intel_crtc->pipe); + + for (i = 0; i < 256; i++) { + I915_WRITE(palreg + 4 * i, + (intel_crtc->lut_r[i] << 16) | + (intel_crtc->lut_g[i] << 8) | + intel_crtc->lut_b[i]); + } +} + +static void i845_update_cursor(struct drm_crtc *crtc, u32 base) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + bool visible = base != 0; + u32 cntl; + + if (intel_crtc->cursor_visible == visible) + return; + + cntl = I915_READ(_CURACNTR); + if (visible) { + /* On these chipsets we can only modify the base whilst + * the cursor is disabled. + */ + I915_WRITE(_CURABASE, base); + + cntl &= ~(CURSOR_FORMAT_MASK); + /* XXX width must be 64, stride 256 => 0x00 << 28 */ + cntl |= CURSOR_ENABLE | + CURSOR_GAMMA_ENABLE | + CURSOR_FORMAT_ARGB; + } else + cntl &= ~(CURSOR_ENABLE | CURSOR_GAMMA_ENABLE); + I915_WRITE(_CURACNTR, cntl); + + intel_crtc->cursor_visible = visible; +} + +static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + bool visible = base != 0; + + if (intel_crtc->cursor_visible != visible) { + uint32_t cntl = I915_READ(CURCNTR(pipe)); + if (base) { + cntl &= ~(CURSOR_MODE | MCURSOR_PIPE_SELECT); + cntl |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE; + cntl |= pipe << 28; /* Connect to correct pipe */ + } else { + cntl &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE); + cntl |= CURSOR_MODE_DISABLE; + } + I915_WRITE(CURCNTR(pipe), cntl); + + intel_crtc->cursor_visible = visible; + } + /* and commit changes on next vblank */ + I915_WRITE(CURBASE(pipe), base); +} + +static void ivb_update_cursor(struct drm_crtc *crtc, u32 base) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + bool visible = base != 0; + + if (intel_crtc->cursor_visible != visible) { + uint32_t cntl = I915_READ(CURCNTR_IVB(pipe)); + if (base) { + cntl &= ~CURSOR_MODE; + cntl |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE; + } else { + cntl &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE); + cntl |= CURSOR_MODE_DISABLE; + } + I915_WRITE(CURCNTR_IVB(pipe), cntl); + + intel_crtc->cursor_visible = visible; + } + /* and commit changes on next vblank */ + I915_WRITE(CURBASE_IVB(pipe), base); +} + +/* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */ +static void intel_crtc_update_cursor(struct drm_crtc *crtc, + bool on) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + int x = intel_crtc->cursor_x; + int y = intel_crtc->cursor_y; + u32 base, pos; + bool visible; + + pos = 0; + + if (on && crtc->enabled && crtc->fb) { + base = intel_crtc->cursor_addr; + if (x > (int) crtc->fb->width) + base = 0; + + if (y > (int) crtc->fb->height) + base = 0; + } else + base = 0; + + if (x < 0) { + if (x + intel_crtc->cursor_width < 0) + base = 0; + + pos |= CURSOR_POS_SIGN << CURSOR_X_SHIFT; + x = -x; + } + pos |= x << CURSOR_X_SHIFT; + + if (y < 0) { + if (y + intel_crtc->cursor_height < 0) + base = 0; + + pos |= CURSOR_POS_SIGN << CURSOR_Y_SHIFT; + y = -y; + } + pos |= y << CURSOR_Y_SHIFT; + + visible = base != 0; + if (!visible && !intel_crtc->cursor_visible) + return; + + if (IS_IVYBRIDGE(dev)) { + I915_WRITE(CURPOS_IVB(pipe), pos); + ivb_update_cursor(crtc, base); + } else { + I915_WRITE(CURPOS(pipe), pos); + if (IS_845G(dev) || IS_I865G(dev)) + i845_update_cursor(crtc, base); + else + i9xx_update_cursor(crtc, base); + } + + if (visible) + intel_mark_busy(dev, to_intel_framebuffer(crtc->fb)->obj); +} + +static int intel_crtc_cursor_set(struct drm_crtc *crtc, + struct drm_file *file, + uint32_t handle, + uint32_t width, uint32_t height) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct drm_i915_gem_object *obj; + uint32_t addr; + int ret; + + DRM_DEBUG_KMS("\n"); + + /* if we want to turn off the cursor ignore width and height */ + if (!handle) { + DRM_DEBUG_KMS("cursor off\n"); + addr = 0; + obj = NULL; + DRM_LOCK(dev); + goto finish; + } + + /* Currently we only support 64x64 cursors */ + if (width != 64 || height != 64) { + DRM_ERROR("we currently only support 64x64 cursors\n"); + return -EINVAL; + } + + obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle)); + if (&obj->base == NULL) + return -ENOENT; + + if (obj->base.size < width * height * 4) { + DRM_ERROR("buffer is to small\n"); + ret = -ENOMEM; + goto fail; + } + + /* we only need to pin inside GTT if cursor is non-phy */ + DRM_LOCK(dev); + if (!dev_priv->info->cursor_needs_physical) { + if (obj->tiling_mode) { + DRM_ERROR("cursor cannot be tiled\n"); + ret = -EINVAL; + goto fail_locked; + } + + ret = i915_gem_object_pin_to_display_plane(obj, 0, NULL); + if (ret) { + DRM_ERROR("failed to move cursor bo into the GTT\n"); + goto fail_locked; + } + + ret = i915_gem_object_put_fence(obj); + if (ret) { + DRM_ERROR("failed to release fence for cursor\n"); + goto fail_unpin; + } + + addr = obj->gtt_offset; + } else { + int align = IS_I830(dev) ? 16 * 1024 : 256; + ret = i915_gem_attach_phys_object(dev, obj, + (intel_crtc->pipe == 0) ? I915_GEM_PHYS_CURSOR_0 : I915_GEM_PHYS_CURSOR_1, + align); + if (ret) { + DRM_ERROR("failed to attach phys object\n"); + goto fail_locked; + } + addr = obj->phys_obj->handle->busaddr; + } + + if (IS_GEN2(dev)) + I915_WRITE(CURSIZE, (height << 12) | width); + + finish: + if (intel_crtc->cursor_bo) { + if (dev_priv->info->cursor_needs_physical) { + if (intel_crtc->cursor_bo != obj) + i915_gem_detach_phys_object(dev, intel_crtc->cursor_bo); + } else + i915_gem_object_unpin(intel_crtc->cursor_bo); + drm_gem_object_unreference(&intel_crtc->cursor_bo->base); + } + + DRM_UNLOCK(dev); + + intel_crtc->cursor_addr = addr; + intel_crtc->cursor_bo = obj; + intel_crtc->cursor_width = width; + intel_crtc->cursor_height = height; + + intel_crtc_update_cursor(crtc, true); + + return 0; +fail_unpin: + i915_gem_object_unpin(obj); +fail_locked: + DRM_UNLOCK(dev); +fail: + drm_gem_object_unreference_unlocked(&obj->base); + return ret; +} + +static int intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) +{ + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + + intel_crtc->cursor_x = x; + intel_crtc->cursor_y = y; + + intel_crtc_update_cursor(crtc, true); + + return 0; +} + +/** Sets the color ramps on behalf of RandR */ +void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, + u16 blue, int regno) +{ + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + + intel_crtc->lut_r[regno] = red >> 8; + intel_crtc->lut_g[regno] = green >> 8; + intel_crtc->lut_b[regno] = blue >> 8; +} + +void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, + u16 *blue, int regno) +{ + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + + *red = intel_crtc->lut_r[regno] << 8; + *green = intel_crtc->lut_g[regno] << 8; + *blue = intel_crtc->lut_b[regno] << 8; +} + +static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, + u16 *blue, uint32_t start, uint32_t size) +{ + int end = (start + size > 256) ? 256 : start + size, i; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + + for (i = start; i < end; i++) { + intel_crtc->lut_r[i] = red[i] >> 8; + intel_crtc->lut_g[i] = green[i] >> 8; + intel_crtc->lut_b[i] = blue[i] >> 8; + } + + intel_crtc_load_lut(crtc); +} + +/** + * Get a pipe with a simple mode set on it for doing load-based monitor + * detection. + * + * It will be up to the load-detect code to adjust the pipe as appropriate for + * its requirements. The pipe will be connected to no other encoders. + * + * Currently this code will only succeed if there is a pipe with no encoders + * configured for it. In the future, it could choose to temporarily disable + * some outputs to free up a pipe for its use. + * + * \return crtc, or NULL if no pipes are available. + */ + +/* VESA 640x480x72Hz mode to set on the pipe */ +static struct drm_display_mode load_detect_mode = { + DRM_MODE("640x480", DRM_MODE_TYPE_DEFAULT, 31500, 640, 664, + 704, 832, 0, 480, 489, 491, 520, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), +}; + +static int +intel_framebuffer_create(struct drm_device *dev, + struct drm_mode_fb_cmd2 *mode_cmd, struct drm_i915_gem_object *obj, + struct drm_framebuffer **res) +{ + struct intel_framebuffer *intel_fb; + int ret; + + intel_fb = malloc(sizeof(*intel_fb), DRM_MEM_KMS, M_WAITOK | M_ZERO); + ret = intel_framebuffer_init(dev, intel_fb, mode_cmd, obj); + if (ret) { + drm_gem_object_unreference_unlocked(&obj->base); + free(intel_fb, DRM_MEM_KMS); + return (ret); + } + + *res = &intel_fb->base; + return (0); +} + +static u32 +intel_framebuffer_pitch_for_width(int width, int bpp) +{ + u32 pitch = howmany(width * bpp, 8); + return roundup2(pitch, 64); +} + +static u32 +intel_framebuffer_size_for_mode(struct drm_display_mode *mode, int bpp) +{ + u32 pitch = intel_framebuffer_pitch_for_width(mode->hdisplay, bpp); + return roundup2(pitch * mode->vdisplay, PAGE_SIZE); +} + +static int +intel_framebuffer_create_for_mode(struct drm_device *dev, + struct drm_display_mode *mode, int depth, int bpp, + struct drm_framebuffer **res) +{ + struct drm_i915_gem_object *obj; + struct drm_mode_fb_cmd2 mode_cmd; + + obj = i915_gem_alloc_object(dev, + intel_framebuffer_size_for_mode(mode, bpp)); + if (obj == NULL) + return (-ENOMEM); + + mode_cmd.width = mode->hdisplay; + mode_cmd.height = mode->vdisplay; + mode_cmd.pitches[0] = intel_framebuffer_pitch_for_width(mode_cmd.width, + bpp); + mode_cmd.pixel_format = drm_mode_legacy_fb_format(bpp, depth); + + return (intel_framebuffer_create(dev, &mode_cmd, obj, res)); +} + +static int +mode_fits_in_fbdev(struct drm_device *dev, + struct drm_display_mode *mode, struct drm_framebuffer **res) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_i915_gem_object *obj; + struct drm_framebuffer *fb; + + if (dev_priv->fbdev == NULL) { + *res = NULL; + return (0); + } + + obj = dev_priv->fbdev->ifb.obj; + if (obj == NULL) { + *res = NULL; + return (0); + } + + fb = &dev_priv->fbdev->ifb.base; + if (fb->pitches[0] < intel_framebuffer_pitch_for_width(mode->hdisplay, + fb->bits_per_pixel)) { + *res = NULL; + return (0); + } + + if (obj->base.size < mode->vdisplay * fb->pitches[0]) { + *res = NULL; + return (0); + } + + *res = fb; + return (0); +} + +bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder, + struct drm_connector *connector, + struct drm_display_mode *mode, + struct intel_load_detect_pipe *old) +{ + struct intel_crtc *intel_crtc; + struct drm_crtc *possible_crtc; + struct drm_encoder *encoder = &intel_encoder->base; + struct drm_crtc *crtc = NULL; + struct drm_device *dev = encoder->dev; + struct drm_framebuffer *old_fb; + int i = -1, r; + + DRM_DEBUG_KMS("[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n", + connector->base.id, drm_get_connector_name(connector), + encoder->base.id, drm_get_encoder_name(encoder)); + + /* + * Algorithm gets a little messy: + * + * - if the connector already has an assigned crtc, use it (but make + * sure it's on first) + * + * - try to find the first unused crtc that can drive this connector, + * and use that if we find one + */ + + /* See if we already have a CRTC for this connector */ + if (encoder->crtc) { + crtc = encoder->crtc; + + intel_crtc = to_intel_crtc(crtc); + old->dpms_mode = intel_crtc->dpms_mode; + old->load_detect_temp = false; + + /* Make sure the crtc and connector are running */ + if (intel_crtc->dpms_mode != DRM_MODE_DPMS_ON) { + struct drm_encoder_helper_funcs *encoder_funcs; + struct drm_crtc_helper_funcs *crtc_funcs; + + crtc_funcs = crtc->helper_private; + crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON); + + encoder_funcs = encoder->helper_private; + encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON); + } + + return true; + } + + /* Find an unused one (if possible) */ + list_for_each_entry(possible_crtc, &dev->mode_config.crtc_list, head) { + i++; + if (!(encoder->possible_crtcs & (1 << i))) + continue; + if (!possible_crtc->enabled) { + crtc = possible_crtc; + break; + } + } + + /* + * If we didn't find an unused CRTC, don't use any. + */ + if (!crtc) { + DRM_DEBUG_KMS("no pipe available for load-detect\n"); + return false; + } + + encoder->crtc = crtc; + connector->encoder = encoder; + + intel_crtc = to_intel_crtc(crtc); + old->dpms_mode = intel_crtc->dpms_mode; + old->load_detect_temp = true; + old->release_fb = NULL; + + if (!mode) + mode = &load_detect_mode; + + old_fb = crtc->fb; + + /* We need a framebuffer large enough to accommodate all accesses + * that the plane may generate whilst we perform load detection. + * We can not rely on the fbcon either being present (we get called + * during its initialisation to detect all boot displays, or it may + * not even exist) or that it is large enough to satisfy the + * requested mode. + */ + r = mode_fits_in_fbdev(dev, mode, &crtc->fb); + if (crtc->fb == NULL) { + DRM_DEBUG_KMS("creating tmp fb for load-detection\n"); + r = intel_framebuffer_create_for_mode(dev, mode, 24, 32, + &crtc->fb); + old->release_fb = crtc->fb; + } else + DRM_DEBUG_KMS("reusing fbdev for load-detection framebuffer\n"); + if (r != 0) { + DRM_DEBUG_KMS("failed to allocate framebuffer for load-detection\n"); + crtc->fb = old_fb; + return false; + } + + if (!drm_crtc_helper_set_mode(crtc, mode, 0, 0, old_fb)) { + DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n"); + if (old->release_fb) + old->release_fb->funcs->destroy(old->release_fb); + crtc->fb = old_fb; + return false; + } + + /* let the connector get through one full cycle before testing */ + intel_wait_for_vblank(dev, intel_crtc->pipe); + + return true; +} + +void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, + struct drm_connector *connector, + struct intel_load_detect_pipe *old) +{ + struct drm_encoder *encoder = &intel_encoder->base; + struct drm_device *dev = encoder->dev; + struct drm_crtc *crtc = encoder->crtc; + struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; + struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; + + DRM_DEBUG_KMS("[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n", + connector->base.id, drm_get_connector_name(connector), + encoder->base.id, drm_get_encoder_name(encoder)); + + if (old->load_detect_temp) { + connector->encoder = NULL; + drm_helper_disable_unused_functions(dev); + + if (old->release_fb) + old->release_fb->funcs->destroy(old->release_fb); + + return; + } + + /* Switch crtc and encoder back off if necessary */ + if (old->dpms_mode != DRM_MODE_DPMS_ON) { + encoder_funcs->dpms(encoder, old->dpms_mode); + crtc_funcs->dpms(crtc, old->dpms_mode); + } +} + +/* Returns the clock of the currently programmed mode of the given pipe. */ +static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + u32 dpll = I915_READ(DPLL(pipe)); + u32 fp; + intel_clock_t clock; + + if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0) + fp = I915_READ(FP0(pipe)); + else + fp = I915_READ(FP1(pipe)); + + clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT; + if (IS_PINEVIEW(dev)) { + clock.n = ffs((fp & FP_N_PINEVIEW_DIV_MASK) >> FP_N_DIV_SHIFT) - 1; + clock.m2 = (fp & FP_M2_PINEVIEW_DIV_MASK) >> FP_M2_DIV_SHIFT; + } else { + clock.n = (fp & FP_N_DIV_MASK) >> FP_N_DIV_SHIFT; + clock.m2 = (fp & FP_M2_DIV_MASK) >> FP_M2_DIV_SHIFT; + } + + if (!IS_GEN2(dev)) { + if (IS_PINEVIEW(dev)) + clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK_PINEVIEW) >> + DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW); + else + clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK) >> + DPLL_FPA01_P1_POST_DIV_SHIFT); + + switch (dpll & DPLL_MODE_MASK) { + case DPLLB_MODE_DAC_SERIAL: + clock.p2 = dpll & DPLL_DAC_SERIAL_P2_CLOCK_DIV_5 ? + 5 : 10; + break; + case DPLLB_MODE_LVDS: + clock.p2 = dpll & DPLLB_LVDS_P2_CLOCK_DIV_7 ? + 7 : 14; + break; + default: + DRM_DEBUG_KMS("Unknown DPLL mode %08x in programmed " + "mode\n", (int)(dpll & DPLL_MODE_MASK)); + return 0; + } + + /* XXX: Handle the 100Mhz refclk */ + intel_clock(dev, 96000, &clock); + } else { + bool is_lvds = (pipe == 1) && (I915_READ(LVDS) & LVDS_PORT_EN); + + if (is_lvds) { + clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK_I830_LVDS) >> + DPLL_FPA01_P1_POST_DIV_SHIFT); + clock.p2 = 14; + + if ((dpll & PLL_REF_INPUT_MASK) == + PLLB_REF_INPUT_SPREADSPECTRUMIN) { + /* XXX: might not be 66MHz */ + intel_clock(dev, 66000, &clock); + } else + intel_clock(dev, 48000, &clock); + } else { + if (dpll & PLL_P1_DIVIDE_BY_TWO) + clock.p1 = 2; + else { + clock.p1 = ((dpll & DPLL_FPA01_P1_POST_DIV_MASK_I830) >> + DPLL_FPA01_P1_POST_DIV_SHIFT) + 2; + } + if (dpll & PLL_P2_DIVIDE_BY_4) + clock.p2 = 4; + else + clock.p2 = 2; + + intel_clock(dev, 48000, &clock); + } + } + + /* XXX: It would be nice to validate the clocks, but we can't reuse + * i830PllIsValid() because it relies on the xf86_config connector + * configuration being accurate, which it isn't necessarily. + */ + + return clock.dot; +} + +/** Returns the currently programmed mode of the given pipe. */ +struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev, + struct drm_crtc *crtc) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + struct drm_display_mode *mode; + int htot = I915_READ(HTOTAL(pipe)); + int hsync = I915_READ(HSYNC(pipe)); + int vtot = I915_READ(VTOTAL(pipe)); + int vsync = I915_READ(VSYNC(pipe)); + + mode = malloc(sizeof(*mode), DRM_MEM_KMS, M_WAITOK | M_ZERO); + + mode->clock = intel_crtc_clock_get(dev, crtc); + mode->hdisplay = (htot & 0xffff) + 1; + mode->htotal = ((htot & 0xffff0000) >> 16) + 1; + mode->hsync_start = (hsync & 0xffff) + 1; + mode->hsync_end = ((hsync & 0xffff0000) >> 16) + 1; + mode->vdisplay = (vtot & 0xffff) + 1; + mode->vtotal = ((vtot & 0xffff0000) >> 16) + 1; + mode->vsync_start = (vsync & 0xffff) + 1; + mode->vsync_end = ((vsync & 0xffff0000) >> 16) + 1; + + drm_mode_set_name(mode); + drm_mode_set_crtcinfo(mode, 0); + + return mode; +} + +#define GPU_IDLE_TIMEOUT (500 /* ms */ * 1000 / hz) + +/* When this timer fires, we've been idle for awhile */ +static void intel_gpu_idle_timer(void *arg) +{ + struct drm_device *dev = arg; + drm_i915_private_t *dev_priv = dev->dev_private; + + if (!list_empty(&dev_priv->mm.active_list)) { + /* Still processing requests, so just re-arm the timer. */ + callout_schedule(&dev_priv->idle_callout, GPU_IDLE_TIMEOUT); + return; + } + + dev_priv->busy = false; + taskqueue_enqueue(dev_priv->tq, &dev_priv->idle_task); +} + +#define CRTC_IDLE_TIMEOUT (1000 /* ms */ * 1000 / hz) + +static void intel_crtc_idle_timer(void *arg) +{ + struct intel_crtc *intel_crtc = arg; + struct drm_crtc *crtc = &intel_crtc->base; + drm_i915_private_t *dev_priv = crtc->dev->dev_private; + struct intel_framebuffer *intel_fb; + + intel_fb = to_intel_framebuffer(crtc->fb); + if (intel_fb && intel_fb->obj->active) { + /* The framebuffer is still being accessed by the GPU. */ + callout_schedule(&intel_crtc->idle_callout, CRTC_IDLE_TIMEOUT); + return; + } + + intel_crtc->busy = false; + taskqueue_enqueue(dev_priv->tq, &dev_priv->idle_task); +} + +static void intel_increase_pllclock(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + int dpll_reg = DPLL(pipe); + int dpll; + + if (HAS_PCH_SPLIT(dev)) + return; + + if (!dev_priv->lvds_downclock_avail) + return; + + dpll = I915_READ(dpll_reg); + if (!HAS_PIPE_CXSR(dev) && (dpll & DISPLAY_RATE_SELECT_FPA1)) { + DRM_DEBUG_DRIVER("upclocking LVDS\n"); + + assert_panel_unlocked(dev_priv, pipe); + + dpll &= ~DISPLAY_RATE_SELECT_FPA1; + I915_WRITE(dpll_reg, dpll); + intel_wait_for_vblank(dev, pipe); + + dpll = I915_READ(dpll_reg); + if (dpll & DISPLAY_RATE_SELECT_FPA1) + DRM_DEBUG_DRIVER("failed to upclock LVDS!\n"); + } + + /* Schedule downclock */ + callout_reset(&intel_crtc->idle_callout, CRTC_IDLE_TIMEOUT, + intel_crtc_idle_timer, intel_crtc); +} + +static void intel_decrease_pllclock(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + + if (HAS_PCH_SPLIT(dev)) + return; + + if (!dev_priv->lvds_downclock_avail) + return; + + /* + * Since this is called by a timer, we should never get here in + * the manual case. + */ + if (!HAS_PIPE_CXSR(dev) && intel_crtc->lowfreq_avail) { + int pipe = intel_crtc->pipe; + int dpll_reg = DPLL(pipe); + u32 dpll; + + DRM_DEBUG_DRIVER("downclocking LVDS\n"); + + assert_panel_unlocked(dev_priv, pipe); + + dpll = I915_READ(dpll_reg); + dpll |= DISPLAY_RATE_SELECT_FPA1; + I915_WRITE(dpll_reg, dpll); + intel_wait_for_vblank(dev, pipe); + dpll = I915_READ(dpll_reg); + if (!(dpll & DISPLAY_RATE_SELECT_FPA1)) + DRM_DEBUG_DRIVER("failed to downclock LVDS!\n"); + } +} + +/** + * intel_idle_update - adjust clocks for idleness + * @work: work struct + * + * Either the GPU or display (or both) went idle. Check the busy status + * here and adjust the CRTC and GPU clocks as necessary. + */ +static void intel_idle_update(void *arg, int pending) +{ + drm_i915_private_t *dev_priv = arg; + struct drm_device *dev = dev_priv->dev; + struct drm_crtc *crtc; + struct intel_crtc *intel_crtc; + + if (!i915_powersave) + return; + + DRM_LOCK(dev); + + i915_update_gfx_val(dev_priv); + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + /* Skip inactive CRTCs */ + if (!crtc->fb) + continue; + + intel_crtc = to_intel_crtc(crtc); + if (!intel_crtc->busy) + intel_decrease_pllclock(crtc); + } + + DRM_UNLOCK(dev); +} + +/** + * intel_mark_busy - mark the GPU and possibly the display busy + * @dev: drm device + * @obj: object we're operating on + * + * Callers can use this function to indicate that the GPU is busy processing + * commands. If @obj matches one of the CRTC objects (i.e. it's a scanout + * buffer), we'll also mark the display as busy, so we know to increase its + * clock frequency. + */ +void intel_mark_busy(struct drm_device *dev, struct drm_i915_gem_object *obj) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_crtc *crtc = NULL; + struct intel_framebuffer *intel_fb; + struct intel_crtc *intel_crtc; + + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return; + + if (!dev_priv->busy) + dev_priv->busy = true; + else + callout_reset(&dev_priv->idle_callout, GPU_IDLE_TIMEOUT, + intel_gpu_idle_timer, dev); + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + if (!crtc->fb) + continue; + + intel_crtc = to_intel_crtc(crtc); + intel_fb = to_intel_framebuffer(crtc->fb); + if (intel_fb->obj == obj) { + if (!intel_crtc->busy) { + /* Non-busy -> busy, upclock */ + intel_increase_pllclock(crtc); + intel_crtc->busy = true; + } else { + /* Busy -> busy, put off timer */ + callout_reset(&intel_crtc->idle_callout, + CRTC_IDLE_TIMEOUT, intel_crtc_idle_timer, + intel_crtc); + } + } + } +} + +static void intel_crtc_destroy(struct drm_crtc *crtc) +{ + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_unpin_work *work; + + mtx_lock(&dev->event_lock); + work = intel_crtc->unpin_work; + intel_crtc->unpin_work = NULL; + mtx_unlock(&dev->event_lock); + + if (work) { + taskqueue_cancel(dev_priv->tq, &work->task, NULL); + taskqueue_drain(dev_priv->tq, &work->task); + free(work, DRM_MEM_KMS); + } + + drm_crtc_cleanup(crtc); + + free(intel_crtc, DRM_MEM_KMS); +} + +static void intel_unpin_work_fn(void *arg, int pending) +{ + struct intel_unpin_work *work = arg; + struct drm_device *dev; + + dev = work->dev; + DRM_LOCK(dev); + intel_unpin_fb_obj(work->old_fb_obj); + drm_gem_object_unreference(&work->pending_flip_obj->base); + drm_gem_object_unreference(&work->old_fb_obj->base); + + intel_update_fbc(work->dev); + DRM_UNLOCK(dev); + free(work, DRM_MEM_KMS); +} + +static void do_intel_finish_page_flip(struct drm_device *dev, + struct drm_crtc *crtc) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct intel_unpin_work *work; + struct drm_i915_gem_object *obj; + struct drm_pending_vblank_event *e; + struct timeval tnow, tvbl; + + /* Ignore early vblank irqs */ + if (intel_crtc == NULL) + return; + + microtime(&tnow); + + mtx_lock(&dev->event_lock); + work = intel_crtc->unpin_work; + if (work == NULL || !work->pending) { + mtx_unlock(&dev->event_lock); + return; + } + + intel_crtc->unpin_work = NULL; + + if (work->event) { + e = work->event; + e->event.sequence = drm_vblank_count_and_time(dev, intel_crtc->pipe, &tvbl); + + /* Called before vblank count and timestamps have + * been updated for the vblank interval of flip + * completion? Need to increment vblank count and + * add one videorefresh duration to returned timestamp + * to account for this. We assume this happened if we + * get called over 0.9 frame durations after the last + * timestamped vblank. + * + * This calculation can not be used with vrefresh rates + * below 5Hz (10Hz to be on the safe side) without + * promoting to 64 integers. + */ + if (10 * (timeval_to_ns(&tnow) - timeval_to_ns(&tvbl)) > + 9 * crtc->framedur_ns) { + e->event.sequence++; + tvbl = ns_to_timeval(timeval_to_ns(&tvbl) + + crtc->framedur_ns); + } + + e->event.tv_sec = tvbl.tv_sec; + e->event.tv_usec = tvbl.tv_usec; + + list_add_tail(&e->base.link, + &e->base.file_priv->event_list); + drm_event_wakeup(&e->base); + } + + drm_vblank_put(dev, intel_crtc->pipe); + + obj = work->old_fb_obj; + + atomic_clear_int(&obj->pending_flip, 1 << intel_crtc->plane); + if (atomic_read(&obj->pending_flip) == 0) + wakeup(&obj->pending_flip); + mtx_unlock(&dev->event_lock); + + taskqueue_enqueue(dev_priv->tq, &work->task); + + CTR2(KTR_DRM, "i915_flip_complete %d %p", intel_crtc->plane, + work->pending_flip_obj); +} + +void intel_finish_page_flip(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; + + do_intel_finish_page_flip(dev, crtc); +} + +void intel_finish_page_flip_plane(struct drm_device *dev, int plane) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_crtc *crtc = dev_priv->plane_to_crtc_mapping[plane]; + + do_intel_finish_page_flip(dev, crtc); +} + +void intel_prepare_page_flip(struct drm_device *dev, int plane) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = + to_intel_crtc(dev_priv->plane_to_crtc_mapping[plane]); + + mtx_lock(&dev->event_lock); + if (intel_crtc->unpin_work) { + if ((++intel_crtc->unpin_work->pending) > 1) + DRM_ERROR("Prepared flip multiple times\n"); + } else { + DRM_DEBUG("preparing flip with no unpin work?\n"); + } + mtx_unlock(&dev->event_lock); +} + +static int intel_gen2_queue_flip(struct drm_device *dev, + struct drm_crtc *crtc, + struct drm_framebuffer *fb, + struct drm_i915_gem_object *obj) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + unsigned long offset; + u32 flip_mask; + int ret; + + ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); + if (ret) + goto out; + + /* Offset into the new buffer for cases of shared fbs between CRTCs */ + offset = crtc->y * fb->pitches[0] + crtc->x * fb->bits_per_pixel/8; + + ret = BEGIN_LP_RING(6); + if (ret) + goto out; + + /* Can't queue multiple flips, so wait for the previous + * one to finish before executing the next. + */ + if (intel_crtc->plane) + flip_mask = MI_WAIT_FOR_PLANE_B_FLIP; + else + flip_mask = MI_WAIT_FOR_PLANE_A_FLIP; + OUT_RING(MI_WAIT_FOR_EVENT | flip_mask); + OUT_RING(MI_NOOP); + OUT_RING(MI_DISPLAY_FLIP | + MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); + OUT_RING(fb->pitches[0]); + OUT_RING(obj->gtt_offset + offset); + OUT_RING(0); /* aux display base address, unused */ + ADVANCE_LP_RING(); +out: + return ret; +} + +static int intel_gen3_queue_flip(struct drm_device *dev, + struct drm_crtc *crtc, + struct drm_framebuffer *fb, + struct drm_i915_gem_object *obj) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + unsigned long offset; + u32 flip_mask; + int ret; + + ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); + if (ret) + goto out; + + /* Offset into the new buffer for cases of shared fbs between CRTCs */ + offset = crtc->y * fb->pitches[0] + crtc->x * fb->bits_per_pixel/8; + + ret = BEGIN_LP_RING(6); + if (ret) + goto out; + + if (intel_crtc->plane) + flip_mask = MI_WAIT_FOR_PLANE_B_FLIP; + else + flip_mask = MI_WAIT_FOR_PLANE_A_FLIP; + OUT_RING(MI_WAIT_FOR_EVENT | flip_mask); + OUT_RING(MI_NOOP); + OUT_RING(MI_DISPLAY_FLIP_I915 | + MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); + OUT_RING(fb->pitches[0]); + OUT_RING(obj->gtt_offset + offset); + OUT_RING(MI_NOOP); + + ADVANCE_LP_RING(); +out: + return ret; +} + +static int intel_gen4_queue_flip(struct drm_device *dev, + struct drm_crtc *crtc, + struct drm_framebuffer *fb, + struct drm_i915_gem_object *obj) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + uint32_t pf, pipesrc; + int ret; + + ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); + if (ret) + goto out; + + ret = BEGIN_LP_RING(4); + if (ret) + goto out; + + /* i965+ uses the linear or tiled offsets from the + * Display Registers (which do not change across a page-flip) + * so we need only reprogram the base address. + */ + OUT_RING(MI_DISPLAY_FLIP | + MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); + OUT_RING(fb->pitches[0]); + OUT_RING(obj->gtt_offset | obj->tiling_mode); + + /* XXX Enabling the panel-fitter across page-flip is so far + * untested on non-native modes, so ignore it for now. + * pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE; + */ + pf = 0; + pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; + OUT_RING(pf | pipesrc); + ADVANCE_LP_RING(); +out: + return ret; +} + +static int intel_gen6_queue_flip(struct drm_device *dev, + struct drm_crtc *crtc, + struct drm_framebuffer *fb, + struct drm_i915_gem_object *obj) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + uint32_t pf, pipesrc; + int ret; + + ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv)); + if (ret) + goto out; + + ret = BEGIN_LP_RING(4); + if (ret) + goto out; + + OUT_RING(MI_DISPLAY_FLIP | + MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); + OUT_RING(fb->pitches[0] | obj->tiling_mode); + OUT_RING(obj->gtt_offset); + + /* Contrary to the suggestions in the documentation, + * "Enable Panel Fitter" does not seem to be required when page + * flipping with a non-native mode, and worse causes a normal + * modeset to fail. + * pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE; + */ + pf = 0; + pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; + OUT_RING(pf | pipesrc); + ADVANCE_LP_RING(); +out: + return ret; +} + +/* + * On gen7 we currently use the blit ring because (in early silicon at least) + * the render ring doesn't give us interrpts for page flip completion, which + * means clients will hang after the first flip is queued. Fortunately the + * blit ring generates interrupts properly, so use it instead. + */ +static int intel_gen7_queue_flip(struct drm_device *dev, + struct drm_crtc *crtc, + struct drm_framebuffer *fb, + struct drm_i915_gem_object *obj) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct intel_ring_buffer *ring = &dev_priv->rings[BCS]; + int ret; + + ret = intel_pin_and_fence_fb_obj(dev, obj, ring); + if (ret) + goto out; + + ret = intel_ring_begin(ring, 4); + if (ret) + goto out; + + intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | (intel_crtc->plane << 19)); + intel_ring_emit(ring, (fb->pitches[0] | obj->tiling_mode)); + intel_ring_emit(ring, (obj->gtt_offset)); + intel_ring_emit(ring, (MI_NOOP)); + intel_ring_advance(ring); +out: + return ret; +} + +static int intel_default_queue_flip(struct drm_device *dev, + struct drm_crtc *crtc, + struct drm_framebuffer *fb, + struct drm_i915_gem_object *obj) +{ + return -ENODEV; +} + +static int intel_crtc_page_flip(struct drm_crtc *crtc, + struct drm_framebuffer *fb, + struct drm_pending_vblank_event *event) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_framebuffer *intel_fb; + struct drm_i915_gem_object *obj; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct intel_unpin_work *work; + int ret; + + work = malloc(sizeof *work, DRM_MEM_KMS, M_WAITOK | M_ZERO); + + work->event = event; + work->dev = crtc->dev; + intel_fb = to_intel_framebuffer(crtc->fb); + work->old_fb_obj = intel_fb->obj; + TASK_INIT(&work->task, 0, intel_unpin_work_fn, work); + + ret = drm_vblank_get(dev, intel_crtc->pipe); + if (ret) + goto free_work; + + /* We borrow the event spin lock for protecting unpin_work */ + mtx_lock(&dev->event_lock); + if (intel_crtc->unpin_work) { + mtx_unlock(&dev->event_lock); + free(work, DRM_MEM_KMS); + drm_vblank_put(dev, intel_crtc->pipe); + + DRM_DEBUG("flip queue: crtc already busy\n"); + return -EBUSY; + } + intel_crtc->unpin_work = work; + mtx_unlock(&dev->event_lock); + + intel_fb = to_intel_framebuffer(fb); + obj = intel_fb->obj; + + DRM_LOCK(dev); + + /* Reference the objects for the scheduled work. */ + drm_gem_object_reference(&work->old_fb_obj->base); + drm_gem_object_reference(&obj->base); + + crtc->fb = fb; + + work->pending_flip_obj = obj; + + work->enable_stall_check = true; + + /* Block clients from rendering to the new back buffer until + * the flip occurs and the object is no longer visible. + */ + atomic_set_int(&work->old_fb_obj->pending_flip, 1 << intel_crtc->plane); + + ret = dev_priv->display.queue_flip(dev, crtc, fb, obj); + if (ret) + goto cleanup_pending; + intel_disable_fbc(dev); + DRM_UNLOCK(dev); + + CTR2(KTR_DRM, "i915_flip_request %d %p", intel_crtc->plane, obj); + + return 0; + +cleanup_pending: + atomic_sub(1 << intel_crtc->plane, &work->old_fb_obj->pending_flip); + drm_gem_object_unreference(&work->old_fb_obj->base); + drm_gem_object_unreference(&obj->base); + DRM_UNLOCK(dev); + + mtx_lock(&dev->event_lock); + intel_crtc->unpin_work = NULL; + mtx_unlock(&dev->event_lock); + + drm_vblank_put(dev, intel_crtc->pipe); +free_work: + free(work, DRM_MEM_KMS); + + return ret; +} + +static void intel_sanitize_modesetting(struct drm_device *dev, + int pipe, int plane) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 reg, val; + + /* Clear any frame start delays used for debugging left by the BIOS */ + for_each_pipe(pipe) { + reg = PIPECONF(pipe); + I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK); + } + + if (HAS_PCH_SPLIT(dev)) + return; + + /* Who knows what state these registers were left in by the BIOS or + * grub? + * + * If we leave the registers in a conflicting state (e.g. with the + * display plane reading from the other pipe than the one we intend + * to use) then when we attempt to teardown the active mode, we will + * not disable the pipes and planes in the correct order -- leaving + * a plane reading from a disabled pipe and possibly leading to + * undefined behaviour. + */ + + reg = DSPCNTR(plane); + val = I915_READ(reg); + + if ((val & DISPLAY_PLANE_ENABLE) == 0) + return; + if (!!(val & DISPPLANE_SEL_PIPE_MASK) == pipe) + return; + + /* This display plane is active and attached to the other CPU pipe. */ + pipe = !pipe; + + /* Disable the plane and wait for it to stop reading from the pipe. */ + intel_disable_plane(dev_priv, plane, pipe); + intel_disable_pipe(dev_priv, pipe); +} + +static void intel_crtc_reset(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + + /* Reset flags back to the 'unknown' status so that they + * will be correctly set on the initial modeset. + */ + intel_crtc->dpms_mode = -1; + + /* We need to fix up any BIOS configuration that conflicts with + * our expectations. + */ + intel_sanitize_modesetting(dev, intel_crtc->pipe, intel_crtc->plane); +} + +static struct drm_crtc_helper_funcs intel_helper_funcs = { + .dpms = intel_crtc_dpms, + .mode_fixup = intel_crtc_mode_fixup, + .mode_set = intel_crtc_mode_set, + .mode_set_base = intel_pipe_set_base, + .mode_set_base_atomic = intel_pipe_set_base_atomic, + .load_lut = intel_crtc_load_lut, + .disable = intel_crtc_disable, +}; + +static const struct drm_crtc_funcs intel_crtc_funcs = { + .reset = intel_crtc_reset, + .cursor_set = intel_crtc_cursor_set, + .cursor_move = intel_crtc_cursor_move, + .gamma_set = intel_crtc_gamma_set, + .set_config = drm_crtc_helper_set_config, + .destroy = intel_crtc_destroy, + .page_flip = intel_crtc_page_flip, +}; + +static void intel_crtc_init(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc; + int i; + + intel_crtc = malloc(sizeof(struct intel_crtc) + + (INTELFB_CONN_LIMIT * sizeof(struct drm_connector *)), + DRM_MEM_KMS, M_WAITOK | M_ZERO); + + drm_crtc_init(dev, &intel_crtc->base, &intel_crtc_funcs); + + drm_mode_crtc_set_gamma_size(&intel_crtc->base, 256); + for (i = 0; i < 256; i++) { + intel_crtc->lut_r[i] = i; + intel_crtc->lut_g[i] = i; + intel_crtc->lut_b[i] = i; + } + + /* Swap pipes & planes for FBC on pre-965 */ + intel_crtc->pipe = pipe; + intel_crtc->plane = pipe; + if (IS_MOBILE(dev) && IS_GEN3(dev)) { + DRM_DEBUG_KMS("swapping pipes & planes for FBC\n"); + intel_crtc->plane = !pipe; + } + + KASSERT(pipe < DRM_ARRAY_SIZE(dev_priv->plane_to_crtc_mapping) && + dev_priv->plane_to_crtc_mapping[intel_crtc->plane] == NULL, + ("plane_to_crtc is already initialized")); + dev_priv->plane_to_crtc_mapping[intel_crtc->plane] = &intel_crtc->base; + dev_priv->pipe_to_crtc_mapping[intel_crtc->pipe] = &intel_crtc->base; + + intel_crtc_reset(&intel_crtc->base); + intel_crtc->active = true; /* force the pipe off on setup_init_config */ + intel_crtc->bpp = 24; /* default for pre-Ironlake */ + + if (HAS_PCH_SPLIT(dev)) { + if (pipe == 2 && IS_IVYBRIDGE(dev)) + intel_crtc->no_pll = true; + intel_helper_funcs.prepare = ironlake_crtc_prepare; + intel_helper_funcs.commit = ironlake_crtc_commit; + } else { + intel_helper_funcs.prepare = i9xx_crtc_prepare; + intel_helper_funcs.commit = i9xx_crtc_commit; + } + + drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs); + + intel_crtc->busy = false; + + callout_init(&intel_crtc->idle_callout, CALLOUT_MPSAFE); +} + +int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data, + struct drm_file *file) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_i915_get_pipe_from_crtc_id *pipe_from_crtc_id = data; + struct drm_mode_object *drmmode_obj; + struct intel_crtc *crtc; + + if (!dev_priv) { + DRM_ERROR("called with no initialization\n"); + return -EINVAL; + } + + drmmode_obj = drm_mode_object_find(dev, pipe_from_crtc_id->crtc_id, + DRM_MODE_OBJECT_CRTC); + + if (!drmmode_obj) { + DRM_ERROR("no such CRTC id\n"); + return -EINVAL; + } + + crtc = to_intel_crtc(obj_to_crtc(drmmode_obj)); + pipe_from_crtc_id->pipe = crtc->pipe; + + return 0; +} + +static int intel_encoder_clones(struct drm_device *dev, int type_mask) +{ + struct intel_encoder *encoder; + int index_mask = 0; + int entry = 0; + + list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) { + if (type_mask & encoder->clone_mask) + index_mask |= (1 << entry); + entry++; + } + + return index_mask; +} + +static bool has_edp_a(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + if (!IS_MOBILE(dev)) + return false; + + if ((I915_READ(DP_A) & DP_DETECTED) == 0) + return false; + + if (IS_GEN5(dev) && + (I915_READ(ILK_DISPLAY_CHICKEN_FUSES) & ILK_eDP_A_DISABLE)) + return false; + + return true; +} + +static void intel_setup_outputs(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_encoder *encoder; + bool dpd_is_edp = false; + bool has_lvds; + + has_lvds = intel_lvds_init(dev); + if (!has_lvds && !HAS_PCH_SPLIT(dev)) { + /* disable the panel fitter on everything but LVDS */ + I915_WRITE(PFIT_CONTROL, 0); + } + + if (HAS_PCH_SPLIT(dev)) { + dpd_is_edp = intel_dpd_is_edp(dev); + + if (has_edp_a(dev)) + intel_dp_init(dev, DP_A); + + if (dpd_is_edp && (I915_READ(PCH_DP_D) & DP_DETECTED)) + intel_dp_init(dev, PCH_DP_D); + } + + intel_crt_init(dev); + + if (HAS_PCH_SPLIT(dev)) { + int found; + + DRM_DEBUG_KMS( +"HDMIB %d PCH_DP_B %d HDMIC %d HDMID %d PCH_DP_C %d PCH_DP_D %d LVDS %d\n", + (I915_READ(HDMIB) & PORT_DETECTED) != 0, + (I915_READ(PCH_DP_B) & DP_DETECTED) != 0, + (I915_READ(HDMIC) & PORT_DETECTED) != 0, + (I915_READ(HDMID) & PORT_DETECTED) != 0, + (I915_READ(PCH_DP_C) & DP_DETECTED) != 0, + (I915_READ(PCH_DP_D) & DP_DETECTED) != 0, + (I915_READ(PCH_LVDS) & LVDS_DETECTED) != 0); + + if (I915_READ(HDMIB) & PORT_DETECTED) { + /* PCH SDVOB multiplex with HDMIB */ + found = intel_sdvo_init(dev, PCH_SDVOB); + if (!found) + intel_hdmi_init(dev, HDMIB); + if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED)) + intel_dp_init(dev, PCH_DP_B); + } + + if (I915_READ(HDMIC) & PORT_DETECTED) + intel_hdmi_init(dev, HDMIC); + + if (I915_READ(HDMID) & PORT_DETECTED) + intel_hdmi_init(dev, HDMID); + + if (I915_READ(PCH_DP_C) & DP_DETECTED) + intel_dp_init(dev, PCH_DP_C); + + if (!dpd_is_edp && (I915_READ(PCH_DP_D) & DP_DETECTED)) + intel_dp_init(dev, PCH_DP_D); + + } else if (SUPPORTS_DIGITAL_OUTPUTS(dev)) { + bool found = false; + + if (I915_READ(SDVOB) & SDVO_DETECTED) { + DRM_DEBUG_KMS("probing SDVOB\n"); + found = intel_sdvo_init(dev, SDVOB); + if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) { + DRM_DEBUG_KMS("probing HDMI on SDVOB\n"); + intel_hdmi_init(dev, SDVOB); + } + + if (!found && SUPPORTS_INTEGRATED_DP(dev)) { + DRM_DEBUG_KMS("probing DP_B\n"); + intel_dp_init(dev, DP_B); + } + } + + /* Before G4X SDVOC doesn't have its own detect register */ + + if (I915_READ(SDVOB) & SDVO_DETECTED) { + DRM_DEBUG_KMS("probing SDVOC\n"); + found = intel_sdvo_init(dev, SDVOC); + } + + if (!found && (I915_READ(SDVOC) & SDVO_DETECTED)) { + + if (SUPPORTS_INTEGRATED_HDMI(dev)) { + DRM_DEBUG_KMS("probing HDMI on SDVOC\n"); + intel_hdmi_init(dev, SDVOC); + } + if (SUPPORTS_INTEGRATED_DP(dev)) { + DRM_DEBUG_KMS("probing DP_C\n"); + intel_dp_init(dev, DP_C); + } + } + + if (SUPPORTS_INTEGRATED_DP(dev) && + (I915_READ(DP_D) & DP_DETECTED)) { + DRM_DEBUG_KMS("probing DP_D\n"); + intel_dp_init(dev, DP_D); + } + } else if (IS_GEN2(dev)) { +#if 1 + KIB_NOTYET(); +#else + intel_dvo_init(dev); +#endif + } + + if (SUPPORTS_TV(dev)) + intel_tv_init(dev); + + list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) { + encoder->base.possible_crtcs = encoder->crtc_mask; + encoder->base.possible_clones = + intel_encoder_clones(dev, encoder->clone_mask); + } + + /* disable all the possible outputs/crtcs before entering KMS mode */ + drm_helper_disable_unused_functions(dev); + + if (HAS_PCH_SPLIT(dev)) + ironlake_init_pch_refclk(dev); +} + +static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb) +{ + struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); + + drm_framebuffer_cleanup(fb); + drm_gem_object_unreference_unlocked(&intel_fb->obj->base); + + free(intel_fb, DRM_MEM_KMS); +} + +static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb, + struct drm_file *file, + unsigned int *handle) +{ + struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); + struct drm_i915_gem_object *obj = intel_fb->obj; + + return drm_gem_handle_create(file, &obj->base, handle); +} + +static const struct drm_framebuffer_funcs intel_fb_funcs = { + .destroy = intel_user_framebuffer_destroy, + .create_handle = intel_user_framebuffer_create_handle, +}; + +int intel_framebuffer_init(struct drm_device *dev, + struct intel_framebuffer *intel_fb, + struct drm_mode_fb_cmd2 *mode_cmd, + struct drm_i915_gem_object *obj) +{ + int ret; + + if (obj->tiling_mode == I915_TILING_Y) + return -EINVAL; + + if (mode_cmd->pitches[0] & 63) + return -EINVAL; + + switch (mode_cmd->pixel_format) { + case DRM_FORMAT_RGB332: + case DRM_FORMAT_RGB565: + case DRM_FORMAT_XRGB8888: + case DRM_FORMAT_XBGR8888: + case DRM_FORMAT_ARGB8888: + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_ARGB2101010: + /* RGB formats are common across chipsets */ + break; + case DRM_FORMAT_YUYV: + case DRM_FORMAT_UYVY: + case DRM_FORMAT_YVYU: + case DRM_FORMAT_VYUY: + break; + default: + DRM_DEBUG_KMS("unsupported pixel format %u\n", + mode_cmd->pixel_format); + return -EINVAL; + } + + ret = drm_framebuffer_init(dev, &intel_fb->base, &intel_fb_funcs); + if (ret) { + DRM_ERROR("framebuffer init failed %d\n", ret); + return ret; + } + + drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd); + intel_fb->obj = obj; + return 0; +} + +static int +intel_user_framebuffer_create(struct drm_device *dev, + struct drm_file *filp, struct drm_mode_fb_cmd2 *mode_cmd, + struct drm_framebuffer **res) +{ + struct drm_i915_gem_object *obj; + + obj = to_intel_bo(drm_gem_object_lookup(dev, filp, + mode_cmd->handles[0])); + if (&obj->base == NULL) + return (-ENOENT); + + return (intel_framebuffer_create(dev, mode_cmd, obj, res)); +} + +static const struct drm_mode_config_funcs intel_mode_funcs = { + .fb_create = intel_user_framebuffer_create, + .output_poll_changed = intel_fb_output_poll_changed, +}; + +static struct drm_i915_gem_object * +intel_alloc_context_page(struct drm_device *dev) +{ + struct drm_i915_gem_object *ctx; + int ret; + + DRM_LOCK_ASSERT(dev); + + ctx = i915_gem_alloc_object(dev, 4096); + if (!ctx) { + DRM_DEBUG("failed to alloc power context, RC6 disabled\n"); + return NULL; + } + + ret = i915_gem_object_pin(ctx, 4096, true); + if (ret) { + DRM_ERROR("failed to pin power context: %d\n", ret); + goto err_unref; + } + + ret = i915_gem_object_set_to_gtt_domain(ctx, 1); + if (ret) { + DRM_ERROR("failed to set-domain on power context: %d\n", ret); + goto err_unpin; + } + + return ctx; + +err_unpin: + i915_gem_object_unpin(ctx); +err_unref: + drm_gem_object_unreference(&ctx->base); + DRM_UNLOCK(dev); + return NULL; +} + +bool ironlake_set_drps(struct drm_device *dev, u8 val) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u16 rgvswctl; + + rgvswctl = I915_READ16(MEMSWCTL); + if (rgvswctl & MEMCTL_CMD_STS) { + DRM_DEBUG("gpu busy, RCS change rejected\n"); + return false; /* still busy with another command */ + } + + rgvswctl = (MEMCTL_CMD_CHFREQ << MEMCTL_CMD_SHIFT) | + (val << MEMCTL_FREQ_SHIFT) | MEMCTL_SFCAVM; + I915_WRITE16(MEMSWCTL, rgvswctl); + POSTING_READ16(MEMSWCTL); + + rgvswctl |= MEMCTL_CMD_STS; + I915_WRITE16(MEMSWCTL, rgvswctl); + + return true; +} + +void ironlake_enable_drps(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 rgvmodectl = I915_READ(MEMMODECTL); + u8 fmax, fmin, fstart, vstart; + + /* Enable temp reporting */ + I915_WRITE16(PMMISC, I915_READ(PMMISC) | MCPPCE_EN); + I915_WRITE16(TSC1, I915_READ(TSC1) | TSE); + + /* 100ms RC evaluation intervals */ + I915_WRITE(RCUPEI, 100000); + I915_WRITE(RCDNEI, 100000); + + /* Set max/min thresholds to 90ms and 80ms respectively */ + I915_WRITE(RCBMAXAVG, 90000); + I915_WRITE(RCBMINAVG, 80000); + + I915_WRITE(MEMIHYST, 1); + + /* Set up min, max, and cur for interrupt handling */ + fmax = (rgvmodectl & MEMMODE_FMAX_MASK) >> MEMMODE_FMAX_SHIFT; + fmin = (rgvmodectl & MEMMODE_FMIN_MASK); + fstart = (rgvmodectl & MEMMODE_FSTART_MASK) >> + MEMMODE_FSTART_SHIFT; + + vstart = (I915_READ(PXVFREQ_BASE + (fstart * 4)) & PXVFREQ_PX_MASK) >> + PXVFREQ_PX_SHIFT; + + dev_priv->fmax = fmax; /* IPS callback will increase this */ + dev_priv->fstart = fstart; + + dev_priv->max_delay = fstart; + dev_priv->min_delay = fmin; + dev_priv->cur_delay = fstart; + + DRM_DEBUG("fmax: %d, fmin: %d, fstart: %d\n", + fmax, fmin, fstart); + + I915_WRITE(MEMINTREN, MEMINT_CX_SUPR_EN | MEMINT_EVAL_CHG_EN); + + /* + * Interrupts will be enabled in ironlake_irq_postinstall + */ + + I915_WRITE(VIDSTART, vstart); + POSTING_READ(VIDSTART); + + rgvmodectl |= MEMMODE_SWMODE_EN; + I915_WRITE(MEMMODECTL, rgvmodectl); + + if (_intel_wait_for(dev, + (I915_READ(MEMSWCTL) & MEMCTL_CMD_STS) == 0, 10, + 1, "915per")) + DRM_ERROR("stuck trying to change perf mode\n"); + pause("915dsp", 1); + + ironlake_set_drps(dev, fstart); + + dev_priv->last_count1 = I915_READ(0x112e4) + I915_READ(0x112e8) + + I915_READ(0x112e0); + dev_priv->last_time1 = jiffies_to_msecs(jiffies); + dev_priv->last_count2 = I915_READ(0x112f4); + nanotime(&dev_priv->last_time2); +} + +void ironlake_disable_drps(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u16 rgvswctl = I915_READ16(MEMSWCTL); + + /* Ack interrupts, disable EFC interrupt */ + I915_WRITE(MEMINTREN, I915_READ(MEMINTREN) & ~MEMINT_EVAL_CHG_EN); + I915_WRITE(MEMINTRSTS, MEMINT_EVAL_CHG); + I915_WRITE(DEIER, I915_READ(DEIER) & ~DE_PCU_EVENT); + I915_WRITE(DEIIR, DE_PCU_EVENT); + I915_WRITE(DEIMR, I915_READ(DEIMR) | DE_PCU_EVENT); + + /* Go back to the starting frequency */ + ironlake_set_drps(dev, dev_priv->fstart); + pause("915dsp", 1); + rgvswctl |= MEMCTL_CMD_STS; + I915_WRITE(MEMSWCTL, rgvswctl); + pause("915dsp", 1); + +} + +void gen6_set_rps(struct drm_device *dev, u8 val) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 swreq; + + swreq = (val & 0x3ff) << 25; + I915_WRITE(GEN6_RPNSWREQ, swreq); +} + +void gen6_disable_rps(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + I915_WRITE(GEN6_RPNSWREQ, 1 << 31); + I915_WRITE(GEN6_PMINTRMSK, 0xffffffff); + I915_WRITE(GEN6_PMIER, 0); + /* Complete PM interrupt masking here doesn't race with the rps work + * item again unmasking PM interrupts because that is using a different + * register (PMIMR) to mask PM interrupts. The only risk is in leaving + * stale bits in PMIIR and PMIMR which gen6_enable_rps will clean up. */ + + mtx_lock(&dev_priv->rps_lock); + dev_priv->pm_iir = 0; + mtx_unlock(&dev_priv->rps_lock); + + I915_WRITE(GEN6_PMIIR, I915_READ(GEN6_PMIIR)); +} + +static unsigned long intel_pxfreq(u32 vidfreq) +{ + unsigned long freq; + int div = (vidfreq & 0x3f0000) >> 16; + int post = (vidfreq & 0x3000) >> 12; + int pre = (vidfreq & 0x7); + + if (!pre) + return 0; + + freq = ((div * 133333) / ((1<dev_private; + u32 lcfuse; + u8 pxw[16]; + int i; + + /* Disable to program */ + I915_WRITE(ECR, 0); + POSTING_READ(ECR); + + /* Program energy weights for various events */ + I915_WRITE(SDEW, 0x15040d00); + I915_WRITE(CSIEW0, 0x007f0000); + I915_WRITE(CSIEW1, 0x1e220004); + I915_WRITE(CSIEW2, 0x04000004); + + for (i = 0; i < 5; i++) + I915_WRITE(PEW + (i * 4), 0); + for (i = 0; i < 3; i++) + I915_WRITE(DEW + (i * 4), 0); + + /* Program P-state weights to account for frequency power adjustment */ + for (i = 0; i < 16; i++) { + u32 pxvidfreq = I915_READ(PXVFREQ_BASE + (i * 4)); + unsigned long freq = intel_pxfreq(pxvidfreq); + unsigned long vid = (pxvidfreq & PXVFREQ_PX_MASK) >> + PXVFREQ_PX_SHIFT; + unsigned long val; + + val = vid * vid; + val *= (freq / 1000); + val *= 255; + val /= (127*127*900); + if (val > 0xff) + DRM_ERROR("bad pxval: %ld\n", val); + pxw[i] = val; + } + /* Render standby states get 0 weight */ + pxw[14] = 0; + pxw[15] = 0; + + for (i = 0; i < 4; i++) { + u32 val = (pxw[i*4] << 24) | (pxw[(i*4)+1] << 16) | + (pxw[(i*4)+2] << 8) | (pxw[(i*4)+3]); + I915_WRITE(PXW + (i * 4), val); + } + + /* Adjust magic regs to magic values (more experimental results) */ + I915_WRITE(OGW0, 0); + I915_WRITE(OGW1, 0); + I915_WRITE(EG0, 0x00007f00); + I915_WRITE(EG1, 0x0000000e); + I915_WRITE(EG2, 0x000e0000); + I915_WRITE(EG3, 0x68000300); + I915_WRITE(EG4, 0x42000000); + I915_WRITE(EG5, 0x00140031); + I915_WRITE(EG6, 0); + I915_WRITE(EG7, 0); + + for (i = 0; i < 8; i++) + I915_WRITE(PXWL + (i * 4), 0); + + /* Enable PMON + select events */ + I915_WRITE(ECR, 0x80000019); + + lcfuse = I915_READ(LCFUSE02); + + dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK); +} + +static int intel_enable_rc6(struct drm_device *dev) +{ + /* + * Respect the kernel parameter if it is set + */ + if (i915_enable_rc6 >= 0) + return i915_enable_rc6; + + /* + * Disable RC6 on Ironlake + */ + if (INTEL_INFO(dev)->gen == 5) + return 0; + + /* + * Enable rc6 on Sandybridge if DMA remapping is disabled + */ + if (INTEL_INFO(dev)->gen == 6) { + DRM_DEBUG_DRIVER( + "Sandybridge: intel_iommu_enabled %s -- RC6 %sabled\n", + intel_iommu_enabled ? "true" : "false", + !intel_iommu_enabled ? "en" : "dis"); + return (intel_iommu_enabled ? 0 : INTEL_RC6_ENABLE); + } + DRM_DEBUG_DRIVER("RC6 and deep RC6 enabled\n"); + return (INTEL_RC6_ENABLE | INTEL_RC6p_ENABLE); +} + +void gen6_enable_rps(struct drm_i915_private *dev_priv) +{ + struct drm_device *dev = dev_priv->dev; + u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); + u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS); + u32 pcu_mbox, rc6_mask = 0; + u32 gtfifodbg; + int cur_freq, min_freq, max_freq; + int rc6_mode; + int i; + + /* Here begins a magic sequence of register writes to enable + * auto-downclocking. + * + * Perhaps there might be some value in exposing these to + * userspace... + */ + I915_WRITE(GEN6_RC_STATE, 0); + DRM_LOCK(dev); + + /* Clear the DBG now so we don't confuse earlier errors */ + if ((gtfifodbg = I915_READ(GTFIFODBG))) { + DRM_ERROR("GT fifo had a previous error %x\n", gtfifodbg); + I915_WRITE(GTFIFODBG, gtfifodbg); + } + + gen6_gt_force_wake_get(dev_priv); + + /* disable the counters and set deterministic thresholds */ + I915_WRITE(GEN6_RC_CONTROL, 0); + + I915_WRITE(GEN6_RC1_WAKE_RATE_LIMIT, 1000 << 16); + I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 40 << 16 | 30); + I915_WRITE(GEN6_RC6pp_WAKE_RATE_LIMIT, 30); + I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000); + I915_WRITE(GEN6_RC_IDLE_HYSTERSIS, 25); + + for (i = 0; i < I915_NUM_RINGS; i++) + I915_WRITE(RING_MAX_IDLE(dev_priv->rings[i].mmio_base), 10); + + I915_WRITE(GEN6_RC_SLEEP, 0); + I915_WRITE(GEN6_RC1e_THRESHOLD, 1000); + I915_WRITE(GEN6_RC6_THRESHOLD, 50000); + I915_WRITE(GEN6_RC6p_THRESHOLD, 100000); + I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ + + rc6_mode = intel_enable_rc6(dev_priv->dev); + if (rc6_mode & INTEL_RC6_ENABLE) + rc6_mask |= GEN6_RC_CTL_RC6_ENABLE; + + if (rc6_mode & INTEL_RC6p_ENABLE) + rc6_mask |= GEN6_RC_CTL_RC6p_ENABLE; + + if (rc6_mode & INTEL_RC6pp_ENABLE) + rc6_mask |= GEN6_RC_CTL_RC6pp_ENABLE; + + DRM_INFO("Enabling RC6 states: RC6 %s, RC6p %s, RC6pp %s\n", + (rc6_mode & INTEL_RC6_ENABLE) ? "on" : "off", + (rc6_mode & INTEL_RC6p_ENABLE) ? "on" : "off", + (rc6_mode & INTEL_RC6pp_ENABLE) ? "on" : "off"); + + I915_WRITE(GEN6_RC_CONTROL, + rc6_mask | + GEN6_RC_CTL_EI_MODE(1) | + GEN6_RC_CTL_HW_ENABLE); + + I915_WRITE(GEN6_RPNSWREQ, + GEN6_FREQUENCY(10) | + GEN6_OFFSET(0) | + GEN6_AGGRESSIVE_TURBO); + I915_WRITE(GEN6_RC_VIDEO_FREQ, + GEN6_FREQUENCY(12)); + + I915_WRITE(GEN6_RP_DOWN_TIMEOUT, 1000000); + I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, + 18 << 24 | + 6 << 16); + I915_WRITE(GEN6_RP_UP_THRESHOLD, 10000); + I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 1000000); + I915_WRITE(GEN6_RP_UP_EI, 100000); + I915_WRITE(GEN6_RP_DOWN_EI, 5000000); + I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); + I915_WRITE(GEN6_RP_CONTROL, + GEN6_RP_MEDIA_TURBO | + GEN6_RP_MEDIA_HW_MODE | + GEN6_RP_MEDIA_IS_GFX | + GEN6_RP_ENABLE | + GEN6_RP_UP_BUSY_AVG | + GEN6_RP_DOWN_IDLE_CONT); + + if (_intel_wait_for(dev, + (I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0, 500, + 1, "915pr1")) + DRM_ERROR("timeout waiting for pcode mailbox to become idle\n"); + + I915_WRITE(GEN6_PCODE_DATA, 0); + I915_WRITE(GEN6_PCODE_MAILBOX, + GEN6_PCODE_READY | + GEN6_PCODE_WRITE_MIN_FREQ_TABLE); + if (_intel_wait_for(dev, + (I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0, 500, + 1, "915pr2")) + DRM_ERROR("timeout waiting for pcode mailbox to finish\n"); + + min_freq = (rp_state_cap & 0xff0000) >> 16; + max_freq = rp_state_cap & 0xff; + cur_freq = (gt_perf_status & 0xff00) >> 8; + + /* Check for overclock support */ + if (_intel_wait_for(dev, + (I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0, 500, + 1, "915pr3")) + DRM_ERROR("timeout waiting for pcode mailbox to become idle\n"); + I915_WRITE(GEN6_PCODE_MAILBOX, GEN6_READ_OC_PARAMS); + pcu_mbox = I915_READ(GEN6_PCODE_DATA); + if (_intel_wait_for(dev, + (I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0, 500, + 1, "915pr4")) + DRM_ERROR("timeout waiting for pcode mailbox to finish\n"); + if (pcu_mbox & (1<<31)) { /* OC supported */ + max_freq = pcu_mbox & 0xff; + DRM_DEBUG("overclocking supported, adjusting frequency max to %dMHz\n", pcu_mbox * 50); + } + + /* In units of 100MHz */ + dev_priv->max_delay = max_freq; + dev_priv->min_delay = min_freq; + dev_priv->cur_delay = cur_freq; + + /* requires MSI enabled */ + I915_WRITE(GEN6_PMIER, + GEN6_PM_MBOX_EVENT | + GEN6_PM_THERMAL_EVENT | + GEN6_PM_RP_DOWN_TIMEOUT | + GEN6_PM_RP_UP_THRESHOLD | + GEN6_PM_RP_DOWN_THRESHOLD | + GEN6_PM_RP_UP_EI_EXPIRED | + GEN6_PM_RP_DOWN_EI_EXPIRED); + mtx_lock(&dev_priv->rps_lock); + if (dev_priv->pm_iir != 0) + printf("pm_iir %x\n", dev_priv->pm_iir); + I915_WRITE(GEN6_PMIMR, 0); + mtx_unlock(&dev_priv->rps_lock); + /* enable all PM interrupts */ + I915_WRITE(GEN6_PMINTRMSK, 0); + + gen6_gt_force_wake_put(dev_priv); + DRM_UNLOCK(dev); +} + +void gen6_update_ring_freq(struct drm_i915_private *dev_priv) +{ + struct drm_device *dev; + int min_freq = 15; + int gpu_freq, ia_freq, max_ia_freq; + int scaling_factor = 180; + uint64_t tsc_freq; + + dev = dev_priv->dev; +#if 0 + max_ia_freq = cpufreq_quick_get_max(0); + /* + * Default to measured freq if none found, PCU will ensure we don't go + * over + */ + if (!max_ia_freq) + max_ia_freq = tsc_freq; + + /* Convert from Hz to MHz */ + max_ia_freq /= 1000; +#else + tsc_freq = atomic_load_acq_64(&tsc_freq); + max_ia_freq = tsc_freq / 1000 / 1000; +#endif + + DRM_LOCK(dev); + + /* + * For each potential GPU frequency, load a ring frequency we'd like + * to use for memory access. We do this by specifying the IA frequency + * the PCU should use as a reference to determine the ring frequency. + */ + for (gpu_freq = dev_priv->max_delay; gpu_freq >= dev_priv->min_delay; + gpu_freq--) { + int diff = dev_priv->max_delay - gpu_freq; + int d; + + /* + * For GPU frequencies less than 750MHz, just use the lowest + * ring freq. + */ + if (gpu_freq < min_freq) + ia_freq = 800; + else + ia_freq = max_ia_freq - ((diff * scaling_factor) / 2); + d = 100; + ia_freq = (ia_freq + d / 2) / d; + + I915_WRITE(GEN6_PCODE_DATA, + (ia_freq << GEN6_PCODE_FREQ_IA_RATIO_SHIFT) | + gpu_freq); + I915_WRITE(GEN6_PCODE_MAILBOX, GEN6_PCODE_READY | + GEN6_PCODE_WRITE_MIN_FREQ_TABLE); + if (_intel_wait_for(dev, + (I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0, + 10, 1, "915frq")) { + DRM_ERROR("pcode write of freq table timed out\n"); + continue; + } + } + + DRM_UNLOCK(dev); +} + +static void ironlake_init_clock_gating(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE; + + /* Required for FBC */ + dspclk_gate |= DPFCUNIT_CLOCK_GATE_DISABLE | + DPFCRUNIT_CLOCK_GATE_DISABLE | + DPFDUNIT_CLOCK_GATE_DISABLE; + /* Required for CxSR */ + dspclk_gate |= DPARBUNIT_CLOCK_GATE_DISABLE; + + I915_WRITE(PCH_3DCGDIS0, + MARIUNIT_CLOCK_GATE_DISABLE | + SVSMUNIT_CLOCK_GATE_DISABLE); + I915_WRITE(PCH_3DCGDIS1, + VFMUNIT_CLOCK_GATE_DISABLE); + + I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate); + + /* + * According to the spec the following bits should be set in + * order to enable memory self-refresh + * The bit 22/21 of 0x42004 + * The bit 5 of 0x42020 + * The bit 15 of 0x45000 + */ + I915_WRITE(ILK_DISPLAY_CHICKEN2, + (I915_READ(ILK_DISPLAY_CHICKEN2) | + ILK_DPARB_GATE | ILK_VSDPFD_FULL)); + I915_WRITE(ILK_DSPCLK_GATE, + (I915_READ(ILK_DSPCLK_GATE) | + ILK_DPARB_CLK_GATE)); + I915_WRITE(DISP_ARB_CTL, + (I915_READ(DISP_ARB_CTL) | + DISP_FBC_WM_DIS)); + I915_WRITE(WM3_LP_ILK, 0); + I915_WRITE(WM2_LP_ILK, 0); + I915_WRITE(WM1_LP_ILK, 0); + + /* + * Based on the document from hardware guys the following bits + * should be set unconditionally in order to enable FBC. + * The bit 22 of 0x42000 + * The bit 22 of 0x42004 + * The bit 7,8,9 of 0x42020. + */ + if (IS_IRONLAKE_M(dev)) { + I915_WRITE(ILK_DISPLAY_CHICKEN1, + I915_READ(ILK_DISPLAY_CHICKEN1) | + ILK_FBCQ_DIS); + I915_WRITE(ILK_DISPLAY_CHICKEN2, + I915_READ(ILK_DISPLAY_CHICKEN2) | + ILK_DPARB_GATE); + I915_WRITE(ILK_DSPCLK_GATE, + I915_READ(ILK_DSPCLK_GATE) | + ILK_DPFC_DIS1 | + ILK_DPFC_DIS2 | + ILK_CLK_FBC); + } + + I915_WRITE(ILK_DISPLAY_CHICKEN2, + I915_READ(ILK_DISPLAY_CHICKEN2) | + ILK_ELPIN_409_SELECT); + I915_WRITE(_3D_CHICKEN2, + _3D_CHICKEN2_WM_READ_PIPELINED << 16 | + _3D_CHICKEN2_WM_READ_PIPELINED); +} + +static void gen6_init_clock_gating(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int pipe; + uint32_t dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE; + + I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate); + + I915_WRITE(ILK_DISPLAY_CHICKEN2, + I915_READ(ILK_DISPLAY_CHICKEN2) | + ILK_ELPIN_409_SELECT); + + I915_WRITE(WM3_LP_ILK, 0); + I915_WRITE(WM2_LP_ILK, 0); + I915_WRITE(WM1_LP_ILK, 0); + + I915_WRITE(GEN6_UCGCTL1, + I915_READ(GEN6_UCGCTL1) | + GEN6_BLBUNIT_CLOCK_GATE_DISABLE); + + /* According to the BSpec vol1g, bit 12 (RCPBUNIT) clock + * gating disable must be set. Failure to set it results in + * flickering pixels due to Z write ordering failures after + * some amount of runtime in the Mesa "fire" demo, and Unigine + * Sanctuary and Tropics, and apparently anything else with + * alpha test or pixel discard. + * + * According to the spec, bit 11 (RCCUNIT) must also be set, + * but we didn't debug actual testcases to find it out. + */ + I915_WRITE(GEN6_UCGCTL2, + GEN6_RCPBUNIT_CLOCK_GATE_DISABLE | + GEN6_RCCUNIT_CLOCK_GATE_DISABLE); + + /* + * According to the spec the following bits should be + * set in order to enable memory self-refresh and fbc: + * The bit21 and bit22 of 0x42000 + * The bit21 and bit22 of 0x42004 + * The bit5 and bit7 of 0x42020 + * The bit14 of 0x70180 + * The bit14 of 0x71180 + */ + I915_WRITE(ILK_DISPLAY_CHICKEN1, + I915_READ(ILK_DISPLAY_CHICKEN1) | + ILK_FBCQ_DIS | ILK_PABSTRETCH_DIS); + I915_WRITE(ILK_DISPLAY_CHICKEN2, + I915_READ(ILK_DISPLAY_CHICKEN2) | + ILK_DPARB_GATE | ILK_VSDPFD_FULL); + I915_WRITE(ILK_DSPCLK_GATE, + I915_READ(ILK_DSPCLK_GATE) | + ILK_DPARB_CLK_GATE | + ILK_DPFD_CLK_GATE); + + for_each_pipe(pipe) { + I915_WRITE(DSPCNTR(pipe), + I915_READ(DSPCNTR(pipe)) | + DISPPLANE_TRICKLE_FEED_DISABLE); + intel_flush_display_plane(dev_priv, pipe); + } +} + +static void ivybridge_init_clock_gating(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int pipe; + uint32_t dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE; + + I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate); + + I915_WRITE(WM3_LP_ILK, 0); + I915_WRITE(WM2_LP_ILK, 0); + I915_WRITE(WM1_LP_ILK, 0); + + /* According to the spec, bit 13 (RCZUNIT) must be set on IVB. + * This implements the WaDisableRCZUnitClockGating workaround. + */ + I915_WRITE(GEN6_UCGCTL2, GEN6_RCZUNIT_CLOCK_GATE_DISABLE); + + I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE); + + I915_WRITE(IVB_CHICKEN3, + CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | + CHICKEN3_DGMG_DONE_FIX_DISABLE); + + /* Apply the WaDisableRHWOOptimizationForRenderHang workaround. */ + I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1, + GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC); + + /* WaApplyL3ControlAndL3ChickenMode requires those two on Ivy Bridge */ + I915_WRITE(GEN7_L3CNTLREG1, + GEN7_WA_FOR_GEN7_L3_CONTROL); + I915_WRITE(GEN7_L3_CHICKEN_MODE_REGISTER, + GEN7_WA_L3_CHICKEN_MODE); + + /* This is required by WaCatErrorRejectionIssue */ + I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, + I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | + GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); + + for_each_pipe(pipe) { + I915_WRITE(DSPCNTR(pipe), + I915_READ(DSPCNTR(pipe)) | + DISPPLANE_TRICKLE_FEED_DISABLE); + intel_flush_display_plane(dev_priv, pipe); + } +} + +static void g4x_init_clock_gating(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t dspclk_gate; + + I915_WRITE(RENCLK_GATE_D1, 0); + I915_WRITE(RENCLK_GATE_D2, VF_UNIT_CLOCK_GATE_DISABLE | + GS_UNIT_CLOCK_GATE_DISABLE | + CL_UNIT_CLOCK_GATE_DISABLE); + I915_WRITE(RAMCLK_GATE_D, 0); + dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE | + OVRUNIT_CLOCK_GATE_DISABLE | + OVCUNIT_CLOCK_GATE_DISABLE; + if (IS_GM45(dev)) + dspclk_gate |= DSSUNIT_CLOCK_GATE_DISABLE; + I915_WRITE(DSPCLK_GATE_D, dspclk_gate); +} + +static void crestline_init_clock_gating(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + I915_WRITE(RENCLK_GATE_D1, I965_RCC_CLOCK_GATE_DISABLE); + I915_WRITE(RENCLK_GATE_D2, 0); + I915_WRITE(DSPCLK_GATE_D, 0); + I915_WRITE(RAMCLK_GATE_D, 0); + I915_WRITE16(DEUC, 0); +} + +static void broadwater_init_clock_gating(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + I915_WRITE(RENCLK_GATE_D1, I965_RCZ_CLOCK_GATE_DISABLE | + I965_RCC_CLOCK_GATE_DISABLE | + I965_RCPB_CLOCK_GATE_DISABLE | + I965_ISC_CLOCK_GATE_DISABLE | + I965_FBC_CLOCK_GATE_DISABLE); + I915_WRITE(RENCLK_GATE_D2, 0); +} + +static void gen3_init_clock_gating(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 dstate = I915_READ(D_STATE); + + dstate |= DSTATE_PLL_D3_OFF | DSTATE_GFX_CLOCK_GATING | + DSTATE_DOT_CLOCK_GATING; + I915_WRITE(D_STATE, dstate); +} + +static void i85x_init_clock_gating(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + I915_WRITE(RENCLK_GATE_D1, SV_CLOCK_GATE_DISABLE); +} + +static void i830_init_clock_gating(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + I915_WRITE(DSPCLK_GATE_D, OVRUNIT_CLOCK_GATE_DISABLE); +} + +static void ibx_init_clock_gating(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + /* + * On Ibex Peak and Cougar Point, we need to disable clock + * gating for the panel power sequencer or it will fail to + * start up when no ports are active. + */ + I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE); +} + +static void cpt_init_clock_gating(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int pipe; + + /* + * On Ibex Peak and Cougar Point, we need to disable clock + * gating for the panel power sequencer or it will fail to + * start up when no ports are active. + */ + I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE); + I915_WRITE(SOUTH_CHICKEN2, I915_READ(SOUTH_CHICKEN2) | + DPLS_EDP_PPS_FIX_DIS); + /* Without this, mode sets may fail silently on FDI */ + for_each_pipe(pipe) + I915_WRITE(TRANS_CHICKEN2(pipe), TRANS_AUTOTRAIN_GEN_STALL_DIS); +} + +static void ironlake_teardown_rc6(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + if (dev_priv->renderctx) { + i915_gem_object_unpin(dev_priv->renderctx); + drm_gem_object_unreference(&dev_priv->renderctx->base); + dev_priv->renderctx = NULL; + } + + if (dev_priv->pwrctx) { + i915_gem_object_unpin(dev_priv->pwrctx); + drm_gem_object_unreference(&dev_priv->pwrctx->base); + dev_priv->pwrctx = NULL; + } +} + +static void ironlake_disable_rc6(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + if (I915_READ(PWRCTXA)) { + /* Wake the GPU, prevent RC6, then restore RSTDBYCTL */ + I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) | RCX_SW_EXIT); + (void)_intel_wait_for(dev, + ((I915_READ(RSTDBYCTL) & RSX_STATUS_MASK) == RSX_STATUS_ON), + 50, 1, "915pro"); + + I915_WRITE(PWRCTXA, 0); + POSTING_READ(PWRCTXA); + + I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) & ~RCX_SW_EXIT); + POSTING_READ(RSTDBYCTL); + } + + ironlake_teardown_rc6(dev); +} + +static int ironlake_setup_rc6(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + if (dev_priv->renderctx == NULL) + dev_priv->renderctx = intel_alloc_context_page(dev); + if (!dev_priv->renderctx) + return -ENOMEM; + + if (dev_priv->pwrctx == NULL) + dev_priv->pwrctx = intel_alloc_context_page(dev); + if (!dev_priv->pwrctx) { + ironlake_teardown_rc6(dev); + return -ENOMEM; + } + + return 0; +} + +void ironlake_enable_rc6(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int ret; + + /* rc6 disabled by default due to repeated reports of hanging during + * boot and resume. + */ + if (!intel_enable_rc6(dev)) + return; + + DRM_LOCK(dev); + ret = ironlake_setup_rc6(dev); + if (ret) { + DRM_UNLOCK(dev); + return; + } + + /* + * GPU can automatically power down the render unit if given a page + * to save state. + */ + ret = BEGIN_LP_RING(6); + if (ret) { + ironlake_teardown_rc6(dev); + DRM_UNLOCK(dev); + return; + } + + OUT_RING(MI_SUSPEND_FLUSH | MI_SUSPEND_FLUSH_EN); + OUT_RING(MI_SET_CONTEXT); + OUT_RING(dev_priv->renderctx->gtt_offset | + MI_MM_SPACE_GTT | + MI_SAVE_EXT_STATE_EN | + MI_RESTORE_EXT_STATE_EN | + MI_RESTORE_INHIBIT); + OUT_RING(MI_SUSPEND_FLUSH); + OUT_RING(MI_NOOP); + OUT_RING(MI_FLUSH); + ADVANCE_LP_RING(); + + /* + * Wait for the command parser to advance past MI_SET_CONTEXT. The HW + * does an implicit flush, combined with MI_FLUSH above, it should be + * safe to assume that renderctx is valid + */ + ret = intel_wait_ring_idle(LP_RING(dev_priv)); + if (ret) { + DRM_ERROR("failed to enable ironlake power power savings\n"); + ironlake_teardown_rc6(dev); + DRM_UNLOCK(dev); + return; + } + + I915_WRITE(PWRCTXA, dev_priv->pwrctx->gtt_offset | PWRCTX_EN); + I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) & ~RCX_SW_EXIT); + DRM_UNLOCK(dev); +} + +void intel_init_clock_gating(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + dev_priv->display.init_clock_gating(dev); + + if (dev_priv->display.init_pch_clock_gating) + dev_priv->display.init_pch_clock_gating(dev); +} + +/* Set up chip specific display functions */ +static void intel_init_display(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + /* We always want a DPMS function */ + if (HAS_PCH_SPLIT(dev)) { + dev_priv->display.dpms = ironlake_crtc_dpms; + dev_priv->display.crtc_mode_set = ironlake_crtc_mode_set; + dev_priv->display.update_plane = ironlake_update_plane; + } else { + dev_priv->display.dpms = i9xx_crtc_dpms; + dev_priv->display.crtc_mode_set = i9xx_crtc_mode_set; + dev_priv->display.update_plane = i9xx_update_plane; + } + + if (I915_HAS_FBC(dev)) { + if (HAS_PCH_SPLIT(dev)) { + dev_priv->display.fbc_enabled = ironlake_fbc_enabled; + dev_priv->display.enable_fbc = ironlake_enable_fbc; + dev_priv->display.disable_fbc = ironlake_disable_fbc; + } else if (IS_GM45(dev)) { + dev_priv->display.fbc_enabled = g4x_fbc_enabled; + dev_priv->display.enable_fbc = g4x_enable_fbc; + dev_priv->display.disable_fbc = g4x_disable_fbc; + } else if (IS_CRESTLINE(dev)) { + dev_priv->display.fbc_enabled = i8xx_fbc_enabled; + dev_priv->display.enable_fbc = i8xx_enable_fbc; + dev_priv->display.disable_fbc = i8xx_disable_fbc; + } + /* 855GM needs testing */ + } + + /* Returns the core display clock speed */ + if (IS_I945G(dev) || (IS_G33(dev) && !IS_PINEVIEW_M(dev))) + dev_priv->display.get_display_clock_speed = + i945_get_display_clock_speed; + else if (IS_I915G(dev)) + dev_priv->display.get_display_clock_speed = + i915_get_display_clock_speed; + else if (IS_I945GM(dev) || IS_845G(dev) || IS_PINEVIEW_M(dev)) + dev_priv->display.get_display_clock_speed = + i9xx_misc_get_display_clock_speed; + else if (IS_I915GM(dev)) + dev_priv->display.get_display_clock_speed = + i915gm_get_display_clock_speed; + else if (IS_I865G(dev)) + dev_priv->display.get_display_clock_speed = + i865_get_display_clock_speed; + else if (IS_I85X(dev)) + dev_priv->display.get_display_clock_speed = + i855_get_display_clock_speed; + else /* 852, 830 */ + dev_priv->display.get_display_clock_speed = + i830_get_display_clock_speed; + + /* For FIFO watermark updates */ + if (HAS_PCH_SPLIT(dev)) { + dev_priv->display.force_wake_get = __gen6_gt_force_wake_get; + dev_priv->display.force_wake_put = __gen6_gt_force_wake_put; + + /* IVB configs may use multi-threaded forcewake */ + if (IS_IVYBRIDGE(dev)) { + u32 ecobus; + + /* A small trick here - if the bios hasn't configured MT forcewake, + * and if the device is in RC6, then force_wake_mt_get will not wake + * the device and the ECOBUS read will return zero. Which will be + * (correctly) interpreted by the test below as MT forcewake being + * disabled. + */ + DRM_LOCK(dev); + __gen6_gt_force_wake_mt_get(dev_priv); + ecobus = I915_READ_NOTRACE(ECOBUS); + __gen6_gt_force_wake_mt_put(dev_priv); + DRM_UNLOCK(dev); + + if (ecobus & FORCEWAKE_MT_ENABLE) { + DRM_DEBUG_KMS("Using MT version of forcewake\n"); + dev_priv->display.force_wake_get = + __gen6_gt_force_wake_mt_get; + dev_priv->display.force_wake_put = + __gen6_gt_force_wake_mt_put; + } + } + + if (HAS_PCH_IBX(dev)) + dev_priv->display.init_pch_clock_gating = ibx_init_clock_gating; + else if (HAS_PCH_CPT(dev)) + dev_priv->display.init_pch_clock_gating = cpt_init_clock_gating; + + if (IS_GEN5(dev)) { + if (I915_READ(MLTR_ILK) & ILK_SRLT_MASK) + dev_priv->display.update_wm = ironlake_update_wm; + else { + DRM_DEBUG_KMS("Failed to get proper latency. " + "Disable CxSR\n"); + dev_priv->display.update_wm = NULL; + } + dev_priv->display.fdi_link_train = ironlake_fdi_link_train; + dev_priv->display.init_clock_gating = ironlake_init_clock_gating; + dev_priv->display.write_eld = ironlake_write_eld; + } else if (IS_GEN6(dev)) { + if (SNB_READ_WM0_LATENCY()) { + dev_priv->display.update_wm = sandybridge_update_wm; + dev_priv->display.update_sprite_wm = sandybridge_update_sprite_wm; + } else { + DRM_DEBUG_KMS("Failed to read display plane latency. " + "Disable CxSR\n"); + dev_priv->display.update_wm = NULL; + } + dev_priv->display.fdi_link_train = gen6_fdi_link_train; + dev_priv->display.init_clock_gating = gen6_init_clock_gating; + dev_priv->display.write_eld = ironlake_write_eld; + } else if (IS_IVYBRIDGE(dev)) { + /* FIXME: detect B0+ stepping and use auto training */ + dev_priv->display.fdi_link_train = ivb_manual_fdi_link_train; + if (SNB_READ_WM0_LATENCY()) { + dev_priv->display.update_wm = sandybridge_update_wm; + dev_priv->display.update_sprite_wm = sandybridge_update_sprite_wm; + } else { + DRM_DEBUG_KMS("Failed to read display plane latency. " + "Disable CxSR\n"); + dev_priv->display.update_wm = NULL; + } + dev_priv->display.init_clock_gating = ivybridge_init_clock_gating; + dev_priv->display.write_eld = ironlake_write_eld; + } else + dev_priv->display.update_wm = NULL; + } else if (IS_PINEVIEW(dev)) { + if (!intel_get_cxsr_latency(IS_PINEVIEW_G(dev), + dev_priv->is_ddr3, + dev_priv->fsb_freq, + dev_priv->mem_freq)) { + DRM_INFO("failed to find known CxSR latency " + "(found ddr%s fsb freq %d, mem freq %d), " + "disabling CxSR\n", + (dev_priv->is_ddr3 == 1) ? "3" : "2", + dev_priv->fsb_freq, dev_priv->mem_freq); + /* Disable CxSR and never update its watermark again */ + pineview_disable_cxsr(dev); + dev_priv->display.update_wm = NULL; + } else + dev_priv->display.update_wm = pineview_update_wm; + dev_priv->display.init_clock_gating = gen3_init_clock_gating; + } else if (IS_G4X(dev)) { + dev_priv->display.write_eld = g4x_write_eld; + dev_priv->display.update_wm = g4x_update_wm; + dev_priv->display.init_clock_gating = g4x_init_clock_gating; + } else if (IS_GEN4(dev)) { + dev_priv->display.update_wm = i965_update_wm; + if (IS_CRESTLINE(dev)) + dev_priv->display.init_clock_gating = crestline_init_clock_gating; + else if (IS_BROADWATER(dev)) + dev_priv->display.init_clock_gating = broadwater_init_clock_gating; + } else if (IS_GEN3(dev)) { + dev_priv->display.update_wm = i9xx_update_wm; + dev_priv->display.get_fifo_size = i9xx_get_fifo_size; + dev_priv->display.init_clock_gating = gen3_init_clock_gating; + } else if (IS_I865G(dev)) { + dev_priv->display.update_wm = i830_update_wm; + dev_priv->display.init_clock_gating = i85x_init_clock_gating; + dev_priv->display.get_fifo_size = i830_get_fifo_size; + } else if (IS_I85X(dev)) { + dev_priv->display.update_wm = i9xx_update_wm; + dev_priv->display.get_fifo_size = i85x_get_fifo_size; + dev_priv->display.init_clock_gating = i85x_init_clock_gating; + } else { + dev_priv->display.update_wm = i830_update_wm; + dev_priv->display.init_clock_gating = i830_init_clock_gating; + if (IS_845G(dev)) + dev_priv->display.get_fifo_size = i845_get_fifo_size; + else + dev_priv->display.get_fifo_size = i830_get_fifo_size; + } + + /* Default just returns -ENODEV to indicate unsupported */ + dev_priv->display.queue_flip = intel_default_queue_flip; + + switch (INTEL_INFO(dev)->gen) { + case 2: + dev_priv->display.queue_flip = intel_gen2_queue_flip; + break; + + case 3: + dev_priv->display.queue_flip = intel_gen3_queue_flip; + break; + + case 4: + case 5: + dev_priv->display.queue_flip = intel_gen4_queue_flip; + break; + + case 6: + dev_priv->display.queue_flip = intel_gen6_queue_flip; + break; + case 7: + dev_priv->display.queue_flip = intel_gen7_queue_flip; + break; + } +} + +/* + * Some BIOSes insist on assuming the GPU's pipe A is enabled at suspend, + * resume, or other times. This quirk makes sure that's the case for + * affected systems. + */ +static void quirk_pipea_force(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + dev_priv->quirks |= QUIRK_PIPEA_FORCE; + DRM_DEBUG("applying pipe a force quirk\n"); +} + +/* + * Some machines (Lenovo U160) do not work with SSC on LVDS for some reason + */ +static void quirk_ssc_force_disable(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + dev_priv->quirks |= QUIRK_LVDS_SSC_DISABLE; +} + +struct intel_quirk { + int device; + int subsystem_vendor; + int subsystem_device; + void (*hook)(struct drm_device *dev); +}; + +#define PCI_ANY_ID (~0u) + +struct intel_quirk intel_quirks[] = { + /* HP Mini needs pipe A force quirk (LP: #322104) */ + { 0x27ae, 0x103c, 0x361a, quirk_pipea_force }, + + /* Thinkpad R31 needs pipe A force quirk */ + { 0x3577, 0x1014, 0x0505, quirk_pipea_force }, + /* Toshiba Protege R-205, S-209 needs pipe A force quirk */ + { 0x2592, 0x1179, 0x0001, quirk_pipea_force }, + + /* ThinkPad X30 needs pipe A force quirk (LP: #304614) */ + { 0x3577, 0x1014, 0x0513, quirk_pipea_force }, + /* ThinkPad X40 needs pipe A force quirk */ + + /* ThinkPad T60 needs pipe A force quirk (bug #16494) */ + { 0x2782, 0x17aa, 0x201a, quirk_pipea_force }, + + /* 855 & before need to leave pipe A & dpll A up */ + { 0x3582, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force }, + { 0x2562, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force }, + + /* Lenovo U160 cannot use SSC on LVDS */ + { 0x0046, 0x17aa, 0x3920, quirk_ssc_force_disable }, + + /* Sony Vaio Y cannot use SSC on LVDS */ + { 0x0046, 0x104d, 0x9076, quirk_ssc_force_disable }, +}; + +static void intel_init_quirks(struct drm_device *dev) +{ + struct intel_quirk *q; + device_t d; + int i; + + d = dev->device; + for (i = 0; i < DRM_ARRAY_SIZE(intel_quirks); i++) { + q = &intel_quirks[i]; + if (pci_get_device(d) == q->device && + (pci_get_subvendor(d) == q->subsystem_vendor || + q->subsystem_vendor == PCI_ANY_ID) && + (pci_get_subdevice(d) == q->subsystem_device || + q->subsystem_device == PCI_ANY_ID)) + q->hook(dev); + } +} + +/* Disable the VGA plane that we never use */ +static void i915_disable_vga(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u8 sr1; + u32 vga_reg; + + if (HAS_PCH_SPLIT(dev)) + vga_reg = CPU_VGACNTRL; + else + vga_reg = VGACNTRL; + +#if 0 + vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO); +#endif + outb(VGA_SR_INDEX, 1); + sr1 = inb(VGA_SR_DATA); + outb(VGA_SR_DATA, sr1 | 1 << 5); +#if 0 + vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); +#endif + DELAY(300); + + I915_WRITE(vga_reg, VGA_DISP_DISABLE); + POSTING_READ(vga_reg); +} + +void intel_modeset_init(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int i, ret; + + drm_mode_config_init(dev); + + dev->mode_config.min_width = 0; + dev->mode_config.min_height = 0; + + dev->mode_config.preferred_depth = 24; + dev->mode_config.prefer_shadow = 1; + + dev->mode_config.funcs = __DECONST(struct drm_mode_config_funcs *, + &intel_mode_funcs); + + intel_init_quirks(dev); + + intel_init_display(dev); + + if (IS_GEN2(dev)) { + dev->mode_config.max_width = 2048; + dev->mode_config.max_height = 2048; + } else if (IS_GEN3(dev)) { + dev->mode_config.max_width = 4096; + dev->mode_config.max_height = 4096; + } else { + dev->mode_config.max_width = 8192; + dev->mode_config.max_height = 8192; + } + dev->mode_config.fb_base = dev->agp->base; + + DRM_DEBUG_KMS("%d display pipe%s available.\n", + dev_priv->num_pipe, dev_priv->num_pipe > 1 ? "s" : ""); + + for (i = 0; i < dev_priv->num_pipe; i++) { + intel_crtc_init(dev, i); + ret = intel_plane_init(dev, i); + if (ret) + DRM_DEBUG_KMS("plane %d init failed: %d\n", i, ret); + } + + /* Just disable it once at startup */ + i915_disable_vga(dev); + intel_setup_outputs(dev); + + intel_init_clock_gating(dev); + + if (IS_IRONLAKE_M(dev)) { + ironlake_enable_drps(dev); + intel_init_emon(dev); + } + + if (IS_GEN6(dev)) { + gen6_enable_rps(dev_priv); + gen6_update_ring_freq(dev_priv); + } + + TASK_INIT(&dev_priv->idle_task, 0, intel_idle_update, dev_priv); + callout_init(&dev_priv->idle_callout, CALLOUT_MPSAFE); +} + +void intel_modeset_gem_init(struct drm_device *dev) +{ + if (IS_IRONLAKE_M(dev)) + ironlake_enable_rc6(dev); + + intel_setup_overlay(dev); +} + +void intel_modeset_cleanup(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_crtc *crtc; + struct intel_crtc *intel_crtc; + + drm_kms_helper_poll_fini(dev); + DRM_LOCK(dev); + +#if 0 + intel_unregister_dsm_handler(); +#endif + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + /* Skip inactive CRTCs */ + if (!crtc->fb) + continue; + + intel_crtc = to_intel_crtc(crtc); + intel_increase_pllclock(crtc); + } + + intel_disable_fbc(dev); + + if (IS_IRONLAKE_M(dev)) + ironlake_disable_drps(dev); + if (IS_GEN6(dev)) + gen6_disable_rps(dev); + + if (IS_IRONLAKE_M(dev)) + ironlake_disable_rc6(dev); + + /* Disable the irq before mode object teardown, for the irq might + * enqueue unpin/hotplug work. */ + drm_irq_uninstall(dev); + DRM_UNLOCK(dev); + + if (taskqueue_cancel(dev_priv->tq, &dev_priv->hotplug_task, NULL)) + taskqueue_drain(dev_priv->tq, &dev_priv->hotplug_task); + if (taskqueue_cancel(dev_priv->tq, &dev_priv->rps_task, NULL)) + taskqueue_drain(dev_priv->tq, &dev_priv->rps_task); + + /* Shut off idle work before the crtcs get freed. */ + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + intel_crtc = to_intel_crtc(crtc); + callout_drain(&intel_crtc->idle_callout); + } + callout_drain(&dev_priv->idle_callout); + if (taskqueue_cancel(dev_priv->tq, &dev_priv->idle_task, NULL)) + taskqueue_drain(dev_priv->tq, &dev_priv->idle_task); + + drm_mode_config_cleanup(dev); +} + +/* + * Return which encoder is currently attached for connector. + */ +struct drm_encoder *intel_best_encoder(struct drm_connector *connector) +{ + return &intel_attached_encoder(connector)->base; +} + +void intel_connector_attach_encoder(struct intel_connector *connector, + struct intel_encoder *encoder) +{ + connector->encoder = encoder; + drm_mode_connector_attach_encoder(&connector->base, + &encoder->base); +} + +/* + * set vga decode state - true == enable VGA decode + */ +int intel_modeset_vga_set_state(struct drm_device *dev, bool state) +{ + struct drm_i915_private *dev_priv; + device_t bridge_dev; + u16 gmch_ctrl; + + dev_priv = dev->dev_private; + bridge_dev = intel_gtt_get_bridge_device(); + gmch_ctrl = pci_read_config(bridge_dev, INTEL_GMCH_CTRL, 2); + if (state) + gmch_ctrl &= ~INTEL_GMCH_VGA_DISABLE; + else + gmch_ctrl |= INTEL_GMCH_VGA_DISABLE; + pci_write_config(bridge_dev, INTEL_GMCH_CTRL, gmch_ctrl, 2); + return (0); +} + +struct intel_display_error_state { + struct intel_cursor_error_state { + u32 control; + u32 position; + u32 base; + u32 size; + } cursor[2]; + + struct intel_pipe_error_state { + u32 conf; + u32 source; + + u32 htotal; + u32 hblank; + u32 hsync; + u32 vtotal; + u32 vblank; + u32 vsync; + } pipe[2]; + + struct intel_plane_error_state { + u32 control; + u32 stride; + u32 size; + u32 pos; + u32 addr; + u32 surface; + u32 tile_offset; + } plane[2]; +}; + +struct intel_display_error_state * +intel_display_capture_error_state(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_display_error_state *error; + int i; + + error = malloc(sizeof(*error), DRM_MEM_KMS, M_NOWAIT); + if (error == NULL) + return NULL; + + for (i = 0; i < 2; i++) { + error->cursor[i].control = I915_READ(CURCNTR(i)); + error->cursor[i].position = I915_READ(CURPOS(i)); + error->cursor[i].base = I915_READ(CURBASE(i)); + + error->plane[i].control = I915_READ(DSPCNTR(i)); + error->plane[i].stride = I915_READ(DSPSTRIDE(i)); + error->plane[i].size = I915_READ(DSPSIZE(i)); + error->plane[i].pos = I915_READ(DSPPOS(i)); + error->plane[i].addr = I915_READ(DSPADDR(i)); + if (INTEL_INFO(dev)->gen >= 4) { + error->plane[i].surface = I915_READ(DSPSURF(i)); + error->plane[i].tile_offset = I915_READ(DSPTILEOFF(i)); + } + + error->pipe[i].conf = I915_READ(PIPECONF(i)); + error->pipe[i].source = I915_READ(PIPESRC(i)); + error->pipe[i].htotal = I915_READ(HTOTAL(i)); + error->pipe[i].hblank = I915_READ(HBLANK(i)); + error->pipe[i].hsync = I915_READ(HSYNC(i)); + error->pipe[i].vtotal = I915_READ(VTOTAL(i)); + error->pipe[i].vblank = I915_READ(VBLANK(i)); + error->pipe[i].vsync = I915_READ(VSYNC(i)); + } + + return error; +} + +void +intel_display_print_error_state(struct sbuf *m, + struct drm_device *dev, + struct intel_display_error_state *error) +{ + int i; + + for (i = 0; i < 2; i++) { + sbuf_printf(m, "Pipe [%d]:\n", i); + sbuf_printf(m, " CONF: %08x\n", error->pipe[i].conf); + sbuf_printf(m, " SRC: %08x\n", error->pipe[i].source); + sbuf_printf(m, " HTOTAL: %08x\n", error->pipe[i].htotal); + sbuf_printf(m, " HBLANK: %08x\n", error->pipe[i].hblank); + sbuf_printf(m, " HSYNC: %08x\n", error->pipe[i].hsync); + sbuf_printf(m, " VTOTAL: %08x\n", error->pipe[i].vtotal); + sbuf_printf(m, " VBLANK: %08x\n", error->pipe[i].vblank); + sbuf_printf(m, " VSYNC: %08x\n", error->pipe[i].vsync); + + sbuf_printf(m, "Plane [%d]:\n", i); + sbuf_printf(m, " CNTR: %08x\n", error->plane[i].control); + sbuf_printf(m, " STRIDE: %08x\n", error->plane[i].stride); + sbuf_printf(m, " SIZE: %08x\n", error->plane[i].size); + sbuf_printf(m, " POS: %08x\n", error->plane[i].pos); + sbuf_printf(m, " ADDR: %08x\n", error->plane[i].addr); + if (INTEL_INFO(dev)->gen >= 4) { + sbuf_printf(m, " SURF: %08x\n", error->plane[i].surface); + sbuf_printf(m, " TILEOFF: %08x\n", error->plane[i].tile_offset); + } + + sbuf_printf(m, "Cursor [%d]:\n", i); + sbuf_printf(m, " CNTR: %08x\n", error->cursor[i].control); + sbuf_printf(m, " POS: %08x\n", error->cursor[i].position); + sbuf_printf(m, " BASE: %08x\n", error->cursor[i].base); + } +} diff --git a/sys/dev/drm2/i915/intel_dp.c b/sys/dev/drm2/i915/intel_dp.c new file mode 100644 index 00000000000..4820e4548f3 --- /dev/null +++ b/sys/dev/drm2/i915/intel_dp.c @@ -0,0 +1,2562 @@ +/* + * Copyright © 2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Keith Packard + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DP_RECEIVER_CAP_SIZE 0xf +#define DP_LINK_STATUS_SIZE 6 +#define DP_LINK_CHECK_TIMEOUT (10 * 1000) + +#define DP_LINK_CONFIGURATION_SIZE 9 + +/* XXXKIB what is the right code for the FreeBSD ? */ +#define EREMOTEIO ENXIO + +struct intel_dp { + struct intel_encoder base; + uint32_t output_reg; + uint32_t DP; + uint8_t link_configuration[DP_LINK_CONFIGURATION_SIZE]; + bool has_audio; + enum hdmi_force_audio force_audio; + uint32_t color_range; + int dpms_mode; + uint8_t link_bw; + uint8_t lane_count; + uint8_t dpcd[DP_RECEIVER_CAP_SIZE]; + device_t dp_iic_bus; + device_t adapter; + bool is_pch_edp; + uint8_t train_set[4]; + int panel_power_up_delay; + int panel_power_down_delay; + int panel_power_cycle_delay; + int backlight_on_delay; + int backlight_off_delay; + struct drm_display_mode *panel_fixed_mode; /* for eDP */ + struct timeout_task panel_vdd_task; + bool want_panel_vdd; +}; + +/** + * is_edp - is the given port attached to an eDP panel (either CPU or PCH) + * @intel_dp: DP struct + * + * If a CPU or PCH DP output is attached to an eDP panel, this function + * will return true, and false otherwise. + */ +static bool is_edp(struct intel_dp *intel_dp) +{ + return intel_dp->base.type == INTEL_OUTPUT_EDP; +} + +/** + * is_pch_edp - is the port on the PCH and attached to an eDP panel? + * @intel_dp: DP struct + * + * Returns true if the given DP struct corresponds to a PCH DP port attached + * to an eDP panel, false otherwise. Helpful for determining whether we + * may need FDI resources for a given DP output or not. + */ +static bool is_pch_edp(struct intel_dp *intel_dp) +{ + return intel_dp->is_pch_edp; +} + +/** + * is_cpu_edp - is the port on the CPU and attached to an eDP panel? + * @intel_dp: DP struct + * + * Returns true if the given DP struct corresponds to a CPU eDP port. + */ +static bool is_cpu_edp(struct intel_dp *intel_dp) +{ + return is_edp(intel_dp) && !is_pch_edp(intel_dp); +} + +static struct intel_dp *enc_to_intel_dp(struct drm_encoder *encoder) +{ + return container_of(encoder, struct intel_dp, base.base); +} + +static struct intel_dp *intel_attached_dp(struct drm_connector *connector) +{ + return container_of(intel_attached_encoder(connector), + struct intel_dp, base); +} + +/** + * intel_encoder_is_pch_edp - is the given encoder a PCH attached eDP? + * @encoder: DRM encoder + * + * Return true if @encoder corresponds to a PCH attached eDP panel. Needed + * by intel_display.c. + */ +bool intel_encoder_is_pch_edp(struct drm_encoder *encoder) +{ + struct intel_dp *intel_dp; + + if (!encoder) + return false; + + intel_dp = enc_to_intel_dp(encoder); + + return is_pch_edp(intel_dp); +} + +static void intel_dp_start_link_train(struct intel_dp *intel_dp); +static void intel_dp_complete_link_train(struct intel_dp *intel_dp); +static void intel_dp_link_down(struct intel_dp *intel_dp); + +void +intel_edp_link_config(struct intel_encoder *intel_encoder, + int *lane_num, int *link_bw) +{ + struct intel_dp *intel_dp = container_of(intel_encoder, struct intel_dp, base); + + *lane_num = intel_dp->lane_count; + if (intel_dp->link_bw == DP_LINK_BW_1_62) + *link_bw = 162000; + else if (intel_dp->link_bw == DP_LINK_BW_2_7) + *link_bw = 270000; +} + +static int +intel_dp_max_lane_count(struct intel_dp *intel_dp) +{ + int max_lane_count = intel_dp->dpcd[DP_MAX_LANE_COUNT] & 0x1f; + switch (max_lane_count) { + case 1: case 2: case 4: + break; + default: + max_lane_count = 4; + } + return max_lane_count; +} + +static int +intel_dp_max_link_bw(struct intel_dp *intel_dp) +{ + int max_link_bw = intel_dp->dpcd[DP_MAX_LINK_RATE]; + + switch (max_link_bw) { + case DP_LINK_BW_1_62: + case DP_LINK_BW_2_7: + break; + default: + max_link_bw = DP_LINK_BW_1_62; + break; + } + return max_link_bw; +} + +static int +intel_dp_link_clock(uint8_t link_bw) +{ + if (link_bw == DP_LINK_BW_2_7) + return 270000; + else + return 162000; +} + +/* + * The units on the numbers in the next two are... bizarre. Examples will + * make it clearer; this one parallels an example in the eDP spec. + * + * intel_dp_max_data_rate for one lane of 2.7GHz evaluates as: + * + * 270000 * 1 * 8 / 10 == 216000 + * + * The actual data capacity of that configuration is 2.16Gbit/s, so the + * units are decakilobits. ->clock in a drm_display_mode is in kilohertz - + * or equivalently, kilopixels per second - so for 1680x1050R it'd be + * 119000. At 18bpp that's 2142000 kilobits per second. + * + * Thus the strange-looking division by 10 in intel_dp_link_required, to + * get the result in decakilobits instead of kilobits. + */ + +static int +intel_dp_link_required(int pixel_clock, int bpp) +{ + return (pixel_clock * bpp + 9) / 10; +} + +static int +intel_dp_max_data_rate(int max_link_clock, int max_lanes) +{ + return (max_link_clock * max_lanes * 8) / 10; +} + +static bool +intel_dp_adjust_dithering(struct intel_dp *intel_dp, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_dp)); + int max_lanes = intel_dp_max_lane_count(intel_dp); + int max_rate, mode_rate; + + mode_rate = intel_dp_link_required(mode->clock, 24); + max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes); + + if (mode_rate > max_rate) { + mode_rate = intel_dp_link_required(mode->clock, 18); + if (mode_rate > max_rate) + return false; + + if (adjusted_mode) + adjusted_mode->private_flags + |= INTEL_MODE_DP_FORCE_6BPC; + + return true; + } + + return true; +} + +static int +intel_dp_mode_valid(struct drm_connector *connector, + struct drm_display_mode *mode) +{ + struct intel_dp *intel_dp = intel_attached_dp(connector); + + if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) { + if (mode->hdisplay > intel_dp->panel_fixed_mode->hdisplay) + return MODE_PANEL; + + if (mode->vdisplay > intel_dp->panel_fixed_mode->vdisplay) + return MODE_PANEL; + } + + if (!intel_dp_adjust_dithering(intel_dp, mode, NULL)) + return MODE_CLOCK_HIGH; + + if (mode->clock < 10000) + return MODE_CLOCK_LOW; + + return MODE_OK; +} + +static uint32_t +pack_aux(uint8_t *src, int src_bytes) +{ + int i; + uint32_t v = 0; + + if (src_bytes > 4) + src_bytes = 4; + for (i = 0; i < src_bytes; i++) + v |= ((uint32_t) src[i]) << ((3-i) * 8); + return v; +} + +static void +unpack_aux(uint32_t src, uint8_t *dst, int dst_bytes) +{ + int i; + if (dst_bytes > 4) + dst_bytes = 4; + for (i = 0; i < dst_bytes; i++) + dst[i] = src >> ((3-i) * 8); +} + +/* hrawclock is 1/4 the FSB frequency */ +static int +intel_hrawclk(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t clkcfg; + + clkcfg = I915_READ(CLKCFG); + switch (clkcfg & CLKCFG_FSB_MASK) { + case CLKCFG_FSB_400: + return 100; + case CLKCFG_FSB_533: + return 133; + case CLKCFG_FSB_667: + return 166; + case CLKCFG_FSB_800: + return 200; + case CLKCFG_FSB_1067: + return 266; + case CLKCFG_FSB_1333: + return 333; + /* these two are just a guess; one of them might be right */ + case CLKCFG_FSB_1600: + case CLKCFG_FSB_1600_ALT: + return 400; + default: + return 133; + } +} + +static bool ironlake_edp_have_panel_power(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + + return (I915_READ(PCH_PP_STATUS) & PP_ON) != 0; +} + +static bool ironlake_edp_have_panel_vdd(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + + return (I915_READ(PCH_PP_CONTROL) & EDP_FORCE_VDD) != 0; +} + +static void +intel_dp_check_edp(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + + if (!is_edp(intel_dp)) + return; + if (!ironlake_edp_have_panel_power(intel_dp) && !ironlake_edp_have_panel_vdd(intel_dp)) { + printf("eDP powered off while attempting aux channel communication.\n"); + DRM_DEBUG_KMS("Status 0x%08x Control 0x%08x\n", + I915_READ(PCH_PP_STATUS), + I915_READ(PCH_PP_CONTROL)); + } +} + +static int +intel_dp_aux_ch(struct intel_dp *intel_dp, + uint8_t *send, int send_bytes, + uint8_t *recv, int recv_size) +{ + uint32_t output_reg = intel_dp->output_reg; + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t ch_ctl = output_reg + 0x10; + uint32_t ch_data = ch_ctl + 4; + int i; + int recv_bytes; + uint32_t status; + uint32_t aux_clock_divider; + int try, precharge = 5; + + intel_dp_check_edp(intel_dp); + /* The clock divider is based off the hrawclk, + * and would like to run at 2MHz. So, take the + * hrawclk value and divide by 2 and use that + * + * Note that PCH attached eDP panels should use a 125MHz input + * clock divider. + */ + if (is_cpu_edp(intel_dp)) { + if (IS_GEN6(dev) || IS_GEN7(dev)) + aux_clock_divider = 200; /* SNB & IVB eDP input clock at 400Mhz */ + else + aux_clock_divider = 225; /* eDP input clock at 450Mhz */ + } else if (HAS_PCH_SPLIT(dev)) + aux_clock_divider = 63; /* IRL input clock fixed at 125Mhz */ + else + aux_clock_divider = intel_hrawclk(dev) / 2; + + /* Try to wait for any previous AUX channel activity */ + for (try = 0; try < 3; try++) { + status = I915_READ(ch_ctl); + if ((status & DP_AUX_CH_CTL_SEND_BUSY) == 0) + break; + drm_msleep(1, "915ach"); + } + + if (try == 3) { + printf("dp_aux_ch not started status 0x%08x\n", + I915_READ(ch_ctl)); + return -EBUSY; + } + + /* Must try at least 3 times according to DP spec */ + for (try = 0; try < 5; try++) { + /* Load the send data into the aux channel data registers */ + for (i = 0; i < send_bytes; i += 4) + I915_WRITE(ch_data + i, + pack_aux(send + i, send_bytes - i)); + + /* Send the command and wait for it to complete */ + I915_WRITE(ch_ctl, + DP_AUX_CH_CTL_SEND_BUSY | + DP_AUX_CH_CTL_TIME_OUT_400us | + (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) | + (precharge << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) | + (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT) | + DP_AUX_CH_CTL_DONE | + DP_AUX_CH_CTL_TIME_OUT_ERROR | + DP_AUX_CH_CTL_RECEIVE_ERROR); + for (;;) { + status = I915_READ(ch_ctl); + if ((status & DP_AUX_CH_CTL_SEND_BUSY) == 0) + break; + DELAY(100); + } + + /* Clear done status and any errors */ + I915_WRITE(ch_ctl, + status | + DP_AUX_CH_CTL_DONE | + DP_AUX_CH_CTL_TIME_OUT_ERROR | + DP_AUX_CH_CTL_RECEIVE_ERROR); + + if (status & (DP_AUX_CH_CTL_TIME_OUT_ERROR | + DP_AUX_CH_CTL_RECEIVE_ERROR)) + continue; + if (status & DP_AUX_CH_CTL_DONE) + break; + } + + if ((status & DP_AUX_CH_CTL_DONE) == 0) { + DRM_ERROR("dp_aux_ch not done status 0x%08x\n", status); + return -EBUSY; + } + + /* Check for timeout or receive error. + * Timeouts occur when the sink is not connected + */ + if (status & DP_AUX_CH_CTL_RECEIVE_ERROR) { + DRM_ERROR("dp_aux_ch receive error status 0x%08x\n", status); + return -EIO; + } + + /* Timeouts occur when the device isn't connected, so they're + * "normal" -- don't fill the kernel log with these */ + if (status & DP_AUX_CH_CTL_TIME_OUT_ERROR) { + DRM_DEBUG_KMS("dp_aux_ch timeout status 0x%08x\n", status); + return -ETIMEDOUT; + } + + /* Unload any bytes sent back from the other side */ + recv_bytes = ((status & DP_AUX_CH_CTL_MESSAGE_SIZE_MASK) >> + DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT); + if (recv_bytes > recv_size) + recv_bytes = recv_size; + + for (i = 0; i < recv_bytes; i += 4) + unpack_aux(I915_READ(ch_data + i), + recv + i, recv_bytes - i); + + return recv_bytes; +} + +/* Write data to the aux channel in native mode */ +static int +intel_dp_aux_native_write(struct intel_dp *intel_dp, + uint16_t address, uint8_t *send, int send_bytes) +{ + int ret; + uint8_t msg[20]; + int msg_bytes; + uint8_t ack; + + intel_dp_check_edp(intel_dp); + if (send_bytes > 16) + return -1; + msg[0] = AUX_NATIVE_WRITE << 4; + msg[1] = address >> 8; + msg[2] = address & 0xff; + msg[3] = send_bytes - 1; + memcpy(&msg[4], send, send_bytes); + msg_bytes = send_bytes + 4; + for (;;) { + ret = intel_dp_aux_ch(intel_dp, msg, msg_bytes, &ack, 1); + if (ret < 0) + return ret; + if ((ack & AUX_NATIVE_REPLY_MASK) == AUX_NATIVE_REPLY_ACK) + break; + else if ((ack & AUX_NATIVE_REPLY_MASK) == AUX_NATIVE_REPLY_DEFER) + DELAY(100); + else + return -EIO; + } + return send_bytes; +} + +/* Write a single byte to the aux channel in native mode */ +static int +intel_dp_aux_native_write_1(struct intel_dp *intel_dp, + uint16_t address, uint8_t byte) +{ + return intel_dp_aux_native_write(intel_dp, address, &byte, 1); +} + +/* read bytes from a native aux channel */ +static int +intel_dp_aux_native_read(struct intel_dp *intel_dp, + uint16_t address, uint8_t *recv, int recv_bytes) +{ + uint8_t msg[4]; + int msg_bytes; + uint8_t reply[20]; + int reply_bytes; + uint8_t ack; + int ret; + + intel_dp_check_edp(intel_dp); + msg[0] = AUX_NATIVE_READ << 4; + msg[1] = address >> 8; + msg[2] = address & 0xff; + msg[3] = recv_bytes - 1; + + msg_bytes = 4; + reply_bytes = recv_bytes + 1; + + for (;;) { + ret = intel_dp_aux_ch(intel_dp, msg, msg_bytes, + reply, reply_bytes); + if (ret == 0) + return -EPROTO; + if (ret < 0) + return ret; + ack = reply[0]; + if ((ack & AUX_NATIVE_REPLY_MASK) == AUX_NATIVE_REPLY_ACK) { + memcpy(recv, reply + 1, ret - 1); + return ret - 1; + } + else if ((ack & AUX_NATIVE_REPLY_MASK) == AUX_NATIVE_REPLY_DEFER) + DELAY(100); + else + return -EIO; + } +} + +static int +intel_dp_i2c_aux_ch(device_t idev, int mode, uint8_t write_byte, + uint8_t *read_byte) +{ + struct iic_dp_aux_data *data; + struct intel_dp *intel_dp; + uint16_t address; + uint8_t msg[5]; + uint8_t reply[2]; + unsigned retry; + int msg_bytes; + int reply_bytes; + int ret; + + data = device_get_softc(idev); + intel_dp = data->priv; + address = data->address; + + intel_dp_check_edp(intel_dp); + /* Set up the command byte */ + if (mode & MODE_I2C_READ) + msg[0] = AUX_I2C_READ << 4; + else + msg[0] = AUX_I2C_WRITE << 4; + + if (!(mode & MODE_I2C_STOP)) + msg[0] |= AUX_I2C_MOT << 4; + + msg[1] = address >> 8; + msg[2] = address; + + switch (mode) { + case MODE_I2C_WRITE: + msg[3] = 0; + msg[4] = write_byte; + msg_bytes = 5; + reply_bytes = 1; + break; + case MODE_I2C_READ: + msg[3] = 0; + msg_bytes = 4; + reply_bytes = 2; + break; + default: + msg_bytes = 3; + reply_bytes = 1; + break; + } + + for (retry = 0; retry < 5; retry++) { + ret = intel_dp_aux_ch(intel_dp, + msg, msg_bytes, + reply, reply_bytes); + if (ret < 0) { + DRM_DEBUG_KMS("aux_ch failed %d\n", ret); + return (-ret); + } + + switch (reply[0] & AUX_NATIVE_REPLY_MASK) { + case AUX_NATIVE_REPLY_ACK: + /* I2C-over-AUX Reply field is only valid + * when paired with AUX ACK. + */ + break; + case AUX_NATIVE_REPLY_NACK: + DRM_DEBUG_KMS("aux_ch native nack\n"); + return (EREMOTEIO); + case AUX_NATIVE_REPLY_DEFER: + DELAY(100); + continue; + default: + DRM_ERROR("aux_ch invalid native reply 0x%02x\n", + reply[0]); + return (EREMOTEIO); + } + + switch (reply[0] & AUX_I2C_REPLY_MASK) { + case AUX_I2C_REPLY_ACK: + if (mode == MODE_I2C_READ) { + *read_byte = reply[1]; + } + return (0/*reply_bytes - 1*/); + case AUX_I2C_REPLY_NACK: + DRM_DEBUG_KMS("aux_i2c nack\n"); + return (EREMOTEIO); + case AUX_I2C_REPLY_DEFER: + DRM_DEBUG_KMS("aux_i2c defer\n"); + DELAY(100); + break; + default: + DRM_ERROR("aux_i2c invalid reply 0x%02x\n", reply[0]); + return (EREMOTEIO); + } + } + + DRM_ERROR("too many retries, giving up\n"); + return (EREMOTEIO); +} + +static void ironlake_edp_panel_vdd_on(struct intel_dp *intel_dp); +static void ironlake_edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync); + +static int +intel_dp_i2c_init(struct intel_dp *intel_dp, + struct intel_connector *intel_connector, const char *name) +{ + int ret; + + DRM_DEBUG_KMS("i2c_init %s\n", name); + + ironlake_edp_panel_vdd_on(intel_dp); + ret = iic_dp_aux_add_bus(intel_connector->base.dev->device, name, + intel_dp_i2c_aux_ch, intel_dp, &intel_dp->dp_iic_bus, + &intel_dp->adapter); + ironlake_edp_panel_vdd_off(intel_dp, false); + return (ret); +} + +static bool +intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct drm_device *dev = encoder->dev; + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); + int lane_count, clock; + int max_lane_count = intel_dp_max_lane_count(intel_dp); + int max_clock = intel_dp_max_link_bw(intel_dp) == DP_LINK_BW_2_7 ? 1 : 0; + int bpp; + static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 }; + + if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) { + intel_fixed_panel_mode(intel_dp->panel_fixed_mode, adjusted_mode); + intel_pch_panel_fitting(dev, DRM_MODE_SCALE_FULLSCREEN, + mode, adjusted_mode); + /* + * the mode->clock is used to calculate the Data&Link M/N + * of the pipe. For the eDP the fixed clock should be used. + */ + mode->clock = intel_dp->panel_fixed_mode->clock; + } + + if (!intel_dp_adjust_dithering(intel_dp, mode, adjusted_mode)) + return false; + + bpp = adjusted_mode->private_flags & INTEL_MODE_DP_FORCE_6BPC ? 18 : 24; + + for (lane_count = 1; lane_count <= max_lane_count; lane_count <<= 1) { + for (clock = 0; clock <= max_clock; clock++) { + int link_avail = intel_dp_max_data_rate(intel_dp_link_clock(bws[clock]), lane_count); + + if (intel_dp_link_required(mode->clock, bpp) + <= link_avail) { + intel_dp->link_bw = bws[clock]; + intel_dp->lane_count = lane_count; + adjusted_mode->clock = intel_dp_link_clock(intel_dp->link_bw); + DRM_DEBUG_KMS("Display port link bw %02x lane " + "count %d clock %d\n", + intel_dp->link_bw, intel_dp->lane_count, + adjusted_mode->clock); + return true; + } + } + } + + return false; +} + +struct intel_dp_m_n { + uint32_t tu; + uint32_t gmch_m; + uint32_t gmch_n; + uint32_t link_m; + uint32_t link_n; +}; + +static void +intel_reduce_ratio(uint32_t *num, uint32_t *den) +{ + while (*num > 0xffffff || *den > 0xffffff) { + *num >>= 1; + *den >>= 1; + } +} + +static void +intel_dp_compute_m_n(int bpp, + int nlanes, + int pixel_clock, + int link_clock, + struct intel_dp_m_n *m_n) +{ + m_n->tu = 64; + m_n->gmch_m = (pixel_clock * bpp) >> 3; + m_n->gmch_n = link_clock * nlanes; + intel_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); + m_n->link_m = pixel_clock; + m_n->link_n = link_clock; + intel_reduce_ratio(&m_n->link_m, &m_n->link_n); +} + +void +intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct drm_device *dev = crtc->dev; + struct drm_mode_config *mode_config = &dev->mode_config; + struct drm_encoder *encoder; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int lane_count = 4; + struct intel_dp_m_n m_n; + int pipe = intel_crtc->pipe; + + /* + * Find the lane count in the intel_encoder private + */ + list_for_each_entry(encoder, &mode_config->encoder_list, head) { + struct intel_dp *intel_dp; + + if (encoder->crtc != crtc) + continue; + + intel_dp = enc_to_intel_dp(encoder); + if (intel_dp->base.type == INTEL_OUTPUT_DISPLAYPORT || + intel_dp->base.type == INTEL_OUTPUT_EDP) + { + lane_count = intel_dp->lane_count; + break; + } + } + + /* + * Compute the GMCH and Link ratios. The '3' here is + * the number of bytes_per_pixel post-LUT, which we always + * set up for 8-bits of R/G/B, or 3 bytes total. + */ + intel_dp_compute_m_n(intel_crtc->bpp, lane_count, + mode->clock, adjusted_mode->clock, &m_n); + + if (HAS_PCH_SPLIT(dev)) { + I915_WRITE(TRANSDATA_M1(pipe), + ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | + m_n.gmch_m); + I915_WRITE(TRANSDATA_N1(pipe), m_n.gmch_n); + I915_WRITE(TRANSDPLINK_M1(pipe), m_n.link_m); + I915_WRITE(TRANSDPLINK_N1(pipe), m_n.link_n); + } else { + I915_WRITE(PIPE_GMCH_DATA_M(pipe), + ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | + m_n.gmch_m); + I915_WRITE(PIPE_GMCH_DATA_N(pipe), m_n.gmch_n); + I915_WRITE(PIPE_DP_LINK_M(pipe), m_n.link_m); + I915_WRITE(PIPE_DP_LINK_N(pipe), m_n.link_n); + } +} + +static void ironlake_edp_pll_on(struct drm_encoder *encoder); +static void ironlake_edp_pll_off(struct drm_encoder *encoder); + +static void +intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); + struct drm_crtc *crtc = intel_dp->base.base.crtc; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + + /* Turn on the eDP PLL if needed */ + if (is_edp(intel_dp)) { + if (!is_pch_edp(intel_dp)) + ironlake_edp_pll_on(encoder); + else + ironlake_edp_pll_off(encoder); + } + + /* + * There are four kinds of DP registers: + * + * IBX PCH + * SNB CPU + * IVB CPU + * CPT PCH + * + * IBX PCH and CPU are the same for almost everything, + * except that the CPU DP PLL is configured in this + * register + * + * CPT PCH is quite different, having many bits moved + * to the TRANS_DP_CTL register instead. That + * configuration happens (oddly) in ironlake_pch_enable + */ + + /* Preserve the BIOS-computed detected bit. This is + * supposed to be read-only. + */ + intel_dp->DP = I915_READ(intel_dp->output_reg) & DP_DETECTED; + intel_dp->DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0; + + /* Handle DP bits in common between all three register formats */ + + intel_dp->DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0; + + switch (intel_dp->lane_count) { + case 1: + intel_dp->DP |= DP_PORT_WIDTH_1; + break; + case 2: + intel_dp->DP |= DP_PORT_WIDTH_2; + break; + case 4: + intel_dp->DP |= DP_PORT_WIDTH_4; + break; + } + if (intel_dp->has_audio) { + DRM_DEBUG_KMS("Enabling DP audio on pipe %c\n", + pipe_name(intel_crtc->pipe)); + intel_dp->DP |= DP_AUDIO_OUTPUT_ENABLE; + intel_write_eld(encoder, adjusted_mode); + } + memset(intel_dp->link_configuration, 0, DP_LINK_CONFIGURATION_SIZE); + intel_dp->link_configuration[0] = intel_dp->link_bw; + intel_dp->link_configuration[1] = intel_dp->lane_count; + /* + * Check for DPCD version > 1.1 and enhanced framing support + */ + if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 && + (intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_ENHANCED_FRAME_CAP)) { + intel_dp->link_configuration[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN; + } + + /* Split out the IBX/CPU vs CPT settings */ + + if (is_cpu_edp(intel_dp) && IS_GEN7(dev)) { + if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) + intel_dp->DP |= DP_SYNC_HS_HIGH; + if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) + intel_dp->DP |= DP_SYNC_VS_HIGH; + intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT; + + if (intel_dp->link_configuration[1] & DP_LANE_COUNT_ENHANCED_FRAME_EN) + intel_dp->DP |= DP_ENHANCED_FRAMING; + + intel_dp->DP |= intel_crtc->pipe << 29; + + /* don't miss out required setting for eDP */ + intel_dp->DP |= DP_PLL_ENABLE; + if (adjusted_mode->clock < 200000) + intel_dp->DP |= DP_PLL_FREQ_160MHZ; + else + intel_dp->DP |= DP_PLL_FREQ_270MHZ; + } else if (!HAS_PCH_CPT(dev) || is_cpu_edp(intel_dp)) { + intel_dp->DP |= intel_dp->color_range; + + if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) + intel_dp->DP |= DP_SYNC_HS_HIGH; + if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) + intel_dp->DP |= DP_SYNC_VS_HIGH; + intel_dp->DP |= DP_LINK_TRAIN_OFF; + + if (intel_dp->link_configuration[1] & DP_LANE_COUNT_ENHANCED_FRAME_EN) + intel_dp->DP |= DP_ENHANCED_FRAMING; + + if (intel_crtc->pipe == 1) + intel_dp->DP |= DP_PIPEB_SELECT; + + if (is_cpu_edp(intel_dp)) { + /* don't miss out required setting for eDP */ + intel_dp->DP |= DP_PLL_ENABLE; + if (adjusted_mode->clock < 200000) + intel_dp->DP |= DP_PLL_FREQ_160MHZ; + else + intel_dp->DP |= DP_PLL_FREQ_270MHZ; + } + } else { + intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT; + } +} + +#define IDLE_ON_MASK (PP_ON | 0 | PP_SEQUENCE_MASK | 0 | PP_SEQUENCE_STATE_MASK) +#define IDLE_ON_VALUE (PP_ON | 0 | PP_SEQUENCE_NONE | 0 | PP_SEQUENCE_STATE_ON_IDLE) + +#define IDLE_OFF_MASK (PP_ON | 0 | PP_SEQUENCE_MASK | 0 | PP_SEQUENCE_STATE_MASK) +#define IDLE_OFF_VALUE (0 | 0 | PP_SEQUENCE_NONE | 0 | PP_SEQUENCE_STATE_OFF_IDLE) + +#define IDLE_CYCLE_MASK (PP_ON | 0 | PP_SEQUENCE_MASK | PP_CYCLE_DELAY_ACTIVE | PP_SEQUENCE_STATE_MASK) +#define IDLE_CYCLE_VALUE (0 | 0 | PP_SEQUENCE_NONE | 0 | PP_SEQUENCE_STATE_OFF_IDLE) + +static void ironlake_wait_panel_status(struct intel_dp *intel_dp, + u32 mask, + u32 value) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + + DRM_DEBUG_KMS("mask %08x value %08x status %08x control %08x\n", + mask, value, + I915_READ(PCH_PP_STATUS), + I915_READ(PCH_PP_CONTROL)); + + if (_intel_wait_for(dev, + (I915_READ(PCH_PP_STATUS) & mask) == value, 5000, 10, "915iwp")) { + DRM_ERROR("Panel status timeout: status %08x control %08x\n", + I915_READ(PCH_PP_STATUS), + I915_READ(PCH_PP_CONTROL)); + } +} + +static void ironlake_wait_panel_on(struct intel_dp *intel_dp) +{ + DRM_DEBUG_KMS("Wait for panel power on\n"); + ironlake_wait_panel_status(intel_dp, IDLE_ON_MASK, IDLE_ON_VALUE); +} + +static void ironlake_wait_panel_off(struct intel_dp *intel_dp) +{ + DRM_DEBUG_KMS("Wait for panel power off time\n"); + ironlake_wait_panel_status(intel_dp, IDLE_OFF_MASK, IDLE_OFF_VALUE); +} + +static void ironlake_wait_panel_power_cycle(struct intel_dp *intel_dp) +{ + DRM_DEBUG_KMS("Wait for panel power cycle\n"); + ironlake_wait_panel_status(intel_dp, IDLE_CYCLE_MASK, IDLE_CYCLE_VALUE); +} + + +/* Read the current pp_control value, unlocking the register if it + * is locked + */ + +static u32 ironlake_get_pp_control(struct drm_i915_private *dev_priv) +{ + u32 control = I915_READ(PCH_PP_CONTROL); + + control &= ~PANEL_UNLOCK_MASK; + control |= PANEL_UNLOCK_REGS; + return control; +} + +static void ironlake_edp_panel_vdd_on(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 pp; + + if (!is_edp(intel_dp)) + return; + DRM_DEBUG_KMS("Turn eDP VDD on\n"); + + if (intel_dp->want_panel_vdd) + printf("eDP VDD already requested on\n"); + + intel_dp->want_panel_vdd = true; + + if (ironlake_edp_have_panel_vdd(intel_dp)) { + DRM_DEBUG_KMS("eDP VDD already on\n"); + return; + } + + if (!ironlake_edp_have_panel_power(intel_dp)) + ironlake_wait_panel_power_cycle(intel_dp); + + pp = ironlake_get_pp_control(dev_priv); + pp |= EDP_FORCE_VDD; + I915_WRITE(PCH_PP_CONTROL, pp); + POSTING_READ(PCH_PP_CONTROL); + DRM_DEBUG_KMS("PCH_PP_STATUS: 0x%08x PCH_PP_CONTROL: 0x%08x\n", + I915_READ(PCH_PP_STATUS), I915_READ(PCH_PP_CONTROL)); + + /* + * If the panel wasn't on, delay before accessing aux channel + */ + if (!ironlake_edp_have_panel_power(intel_dp)) { + DRM_DEBUG_KMS("eDP was not running\n"); + drm_msleep(intel_dp->panel_power_up_delay, "915edpon"); + } +} + +static void ironlake_panel_vdd_off_sync(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 pp; + + if (!intel_dp->want_panel_vdd && ironlake_edp_have_panel_vdd(intel_dp)) { + pp = ironlake_get_pp_control(dev_priv); + pp &= ~EDP_FORCE_VDD; + I915_WRITE(PCH_PP_CONTROL, pp); + POSTING_READ(PCH_PP_CONTROL); + + /* Make sure sequencer is idle before allowing subsequent activity */ + DRM_DEBUG_KMS("PCH_PP_STATUS: 0x%08x PCH_PP_CONTROL: 0x%08x\n", + I915_READ(PCH_PP_STATUS), I915_READ(PCH_PP_CONTROL)); + + drm_msleep(intel_dp->panel_power_down_delay, "915vddo"); + } +} + +static void ironlake_panel_vdd_work(void *arg, int pending __unused) +{ + struct intel_dp *intel_dp = arg; + struct drm_device *dev = intel_dp->base.base.dev; + + sx_xlock(&dev->mode_config.mutex); + ironlake_panel_vdd_off_sync(intel_dp); + sx_xunlock(&dev->mode_config.mutex); +} + +static void ironlake_edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync) +{ + if (!is_edp(intel_dp)) + return; + + DRM_DEBUG_KMS("Turn eDP VDD off %d\n", intel_dp->want_panel_vdd); + if (!intel_dp->want_panel_vdd) + printf("eDP VDD not forced on\n"); + + intel_dp->want_panel_vdd = false; + + if (sync) { + ironlake_panel_vdd_off_sync(intel_dp); + } else { + /* + * Queue the timer to fire a long + * time from now (relative to the power down delay) + * to keep the panel power up across a sequence of operations + */ + struct drm_i915_private *dev_priv = intel_dp->base.base.dev->dev_private; + taskqueue_enqueue_timeout(dev_priv->tq, + &intel_dp->panel_vdd_task, + msecs_to_jiffies(intel_dp->panel_power_cycle_delay * 5)); + } +} + +static void ironlake_edp_panel_on(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 pp; + + if (!is_edp(intel_dp)) + return; + + DRM_DEBUG_KMS("Turn eDP power on\n"); + + if (ironlake_edp_have_panel_power(intel_dp)) { + DRM_DEBUG_KMS("eDP power already on\n"); + return; + } + + ironlake_wait_panel_power_cycle(intel_dp); + + pp = ironlake_get_pp_control(dev_priv); + if (IS_GEN5(dev)) { + /* ILK workaround: disable reset around power sequence */ + pp &= ~PANEL_POWER_RESET; + I915_WRITE(PCH_PP_CONTROL, pp); + POSTING_READ(PCH_PP_CONTROL); + } + + pp |= POWER_TARGET_ON; + if (!IS_GEN5(dev)) + pp |= PANEL_POWER_RESET; + + I915_WRITE(PCH_PP_CONTROL, pp); + POSTING_READ(PCH_PP_CONTROL); + + ironlake_wait_panel_on(intel_dp); + + if (IS_GEN5(dev)) { + pp |= PANEL_POWER_RESET; /* restore panel reset bit */ + I915_WRITE(PCH_PP_CONTROL, pp); + POSTING_READ(PCH_PP_CONTROL); + } +} + +static void ironlake_edp_panel_off(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 pp; + + if (!is_edp(intel_dp)) + return; + + DRM_DEBUG_KMS("Turn eDP power off\n"); + + if (intel_dp->want_panel_vdd) + printf("Cannot turn power off while VDD is on\n"); + + pp = ironlake_get_pp_control(dev_priv); + pp &= ~(POWER_TARGET_ON | EDP_FORCE_VDD | PANEL_POWER_RESET | EDP_BLC_ENABLE); + I915_WRITE(PCH_PP_CONTROL, pp); + POSTING_READ(PCH_PP_CONTROL); + + ironlake_wait_panel_off(intel_dp); +} + +static void ironlake_edp_backlight_on(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 pp; + + if (!is_edp(intel_dp)) + return; + + DRM_DEBUG_KMS("\n"); + /* + * If we enable the backlight right away following a panel power + * on, we may see slight flicker as the panel syncs with the eDP + * link. So delay a bit to make sure the image is solid before + * allowing it to appear. + */ + drm_msleep(intel_dp->backlight_on_delay, "915ebo"); + pp = ironlake_get_pp_control(dev_priv); + pp |= EDP_BLC_ENABLE; + I915_WRITE(PCH_PP_CONTROL, pp); + POSTING_READ(PCH_PP_CONTROL); +} + +static void ironlake_edp_backlight_off(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 pp; + + if (!is_edp(intel_dp)) + return; + + DRM_DEBUG_KMS("\n"); + pp = ironlake_get_pp_control(dev_priv); + pp &= ~EDP_BLC_ENABLE; + I915_WRITE(PCH_PP_CONTROL, pp); + POSTING_READ(PCH_PP_CONTROL); + drm_msleep(intel_dp->backlight_off_delay, "915bo1"); +} + +static void ironlake_edp_pll_on(struct drm_encoder *encoder) +{ + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 dpa_ctl; + + DRM_DEBUG_KMS("\n"); + dpa_ctl = I915_READ(DP_A); + dpa_ctl |= DP_PLL_ENABLE; + I915_WRITE(DP_A, dpa_ctl); + POSTING_READ(DP_A); + DELAY(200); +} + +static void ironlake_edp_pll_off(struct drm_encoder *encoder) +{ + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 dpa_ctl; + + dpa_ctl = I915_READ(DP_A); + dpa_ctl &= ~DP_PLL_ENABLE; + I915_WRITE(DP_A, dpa_ctl); + POSTING_READ(DP_A); + DELAY(200); +} + +/* If the sink supports it, try to set the power state appropriately */ +static void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode) +{ + int ret, i; + + /* Should have a valid DPCD by this point */ + if (intel_dp->dpcd[DP_DPCD_REV] < 0x11) + return; + + if (mode != DRM_MODE_DPMS_ON) { + ret = intel_dp_aux_native_write_1(intel_dp, DP_SET_POWER, + DP_SET_POWER_D3); + if (ret != 1) + DRM_DEBUG("failed to write sink power state\n"); + } else { + /* + * When turning on, we need to retry for 1ms to give the sink + * time to wake up. + */ + for (i = 0; i < 3; i++) { + ret = intel_dp_aux_native_write_1(intel_dp, + DP_SET_POWER, + DP_SET_POWER_D0); + if (ret == 1) + break; + drm_msleep(1, "915dps"); + } + } +} + +static void intel_dp_prepare(struct drm_encoder *encoder) +{ + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); + + ironlake_edp_backlight_off(intel_dp); + ironlake_edp_panel_off(intel_dp); + + /* Wake up the sink first */ + ironlake_edp_panel_vdd_on(intel_dp); + intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON); + intel_dp_link_down(intel_dp); + ironlake_edp_panel_vdd_off(intel_dp, false); + + /* Make sure the panel is off before trying to + * change the mode + */ +} + +static void intel_dp_commit(struct drm_encoder *encoder) +{ + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); + struct drm_device *dev = encoder->dev; + struct intel_crtc *intel_crtc = to_intel_crtc(intel_dp->base.base.crtc); + + ironlake_edp_panel_vdd_on(intel_dp); + intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON); + intel_dp_start_link_train(intel_dp); + ironlake_edp_panel_on(intel_dp); + ironlake_edp_panel_vdd_off(intel_dp, true); + intel_dp_complete_link_train(intel_dp); + ironlake_edp_backlight_on(intel_dp); + + intel_dp->dpms_mode = DRM_MODE_DPMS_ON; + + if (HAS_PCH_CPT(dev)) + intel_cpt_verify_modeset(dev, intel_crtc->pipe); +} + +static void +intel_dp_dpms(struct drm_encoder *encoder, int mode) +{ + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t dp_reg = I915_READ(intel_dp->output_reg); + + if (mode != DRM_MODE_DPMS_ON) { + ironlake_edp_backlight_off(intel_dp); + ironlake_edp_panel_off(intel_dp); + + ironlake_edp_panel_vdd_on(intel_dp); + intel_dp_sink_dpms(intel_dp, mode); + intel_dp_link_down(intel_dp); + ironlake_edp_panel_vdd_off(intel_dp, false); + + if (is_cpu_edp(intel_dp)) + ironlake_edp_pll_off(encoder); + } else { + if (is_cpu_edp(intel_dp)) + ironlake_edp_pll_on(encoder); + + ironlake_edp_panel_vdd_on(intel_dp); + intel_dp_sink_dpms(intel_dp, mode); + if (!(dp_reg & DP_PORT_EN)) { + intel_dp_start_link_train(intel_dp); + ironlake_edp_panel_on(intel_dp); + ironlake_edp_panel_vdd_off(intel_dp, true); + intel_dp_complete_link_train(intel_dp); + } else + ironlake_edp_panel_vdd_off(intel_dp, false); + ironlake_edp_backlight_on(intel_dp); + } + intel_dp->dpms_mode = mode; +} +/* + * Native read with retry for link status and receiver capability reads for + * cases where the sink may still be asleep. + */ +static bool +intel_dp_aux_native_read_retry(struct intel_dp *intel_dp, uint16_t address, + uint8_t *recv, int recv_bytes) +{ + int ret, i; + + /* + * Sinks are *supposed* to come up within 1ms from an off state, + * but we're also supposed to retry 3 times per the spec. + */ + for (i = 0; i < 3; i++) { + ret = intel_dp_aux_native_read(intel_dp, address, recv, + recv_bytes); + if (ret == recv_bytes) + return true; + drm_msleep(1, "915dpl"); + } + + return false; +} + +/* + * Fetch AUX CH registers 0x202 - 0x207 which contain + * link status information + */ +static bool +intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE]) +{ + return intel_dp_aux_native_read_retry(intel_dp, + DP_LANE0_1_STATUS, + link_status, + DP_LINK_STATUS_SIZE); +} + +static uint8_t +intel_dp_link_status(uint8_t link_status[DP_LINK_STATUS_SIZE], + int r) +{ + return link_status[r - DP_LANE0_1_STATUS]; +} + +static uint8_t +intel_get_adjust_request_voltage(uint8_t adjust_request[2], + int lane) +{ + int s = ((lane & 1) ? + DP_ADJUST_VOLTAGE_SWING_LANE1_SHIFT : + DP_ADJUST_VOLTAGE_SWING_LANE0_SHIFT); + uint8_t l = adjust_request[lane>>1]; + + return ((l >> s) & 3) << DP_TRAIN_VOLTAGE_SWING_SHIFT; +} + +static uint8_t +intel_get_adjust_request_pre_emphasis(uint8_t adjust_request[2], + int lane) +{ + int s = ((lane & 1) ? + DP_ADJUST_PRE_EMPHASIS_LANE1_SHIFT : + DP_ADJUST_PRE_EMPHASIS_LANE0_SHIFT); + uint8_t l = adjust_request[lane>>1]; + + return ((l >> s) & 3) << DP_TRAIN_PRE_EMPHASIS_SHIFT; +} + + +#if 0 +static char *voltage_names[] = { + "0.4V", "0.6V", "0.8V", "1.2V" +}; +static char *pre_emph_names[] = { + "0dB", "3.5dB", "6dB", "9.5dB" +}; +static char *link_train_names[] = { + "pattern 1", "pattern 2", "idle", "off" +}; +#endif + +/* + * These are source-specific values; current Intel hardware supports + * a maximum voltage of 800mV and a maximum pre-emphasis of 6dB + */ + +static uint8_t +intel_dp_voltage_max(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + + if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) + return DP_TRAIN_VOLTAGE_SWING_800; + else if (HAS_PCH_CPT(dev) && !is_cpu_edp(intel_dp)) + return DP_TRAIN_VOLTAGE_SWING_1200; + else + return DP_TRAIN_VOLTAGE_SWING_800; +} + +static uint8_t +intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing) +{ + struct drm_device *dev = intel_dp->base.base.dev; + + if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) { + switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) { + case DP_TRAIN_VOLTAGE_SWING_400: + return DP_TRAIN_PRE_EMPHASIS_6; + case DP_TRAIN_VOLTAGE_SWING_600: + case DP_TRAIN_VOLTAGE_SWING_800: + return DP_TRAIN_PRE_EMPHASIS_3_5; + default: + return DP_TRAIN_PRE_EMPHASIS_0; + } + } else { + switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) { + case DP_TRAIN_VOLTAGE_SWING_400: + return DP_TRAIN_PRE_EMPHASIS_6; + case DP_TRAIN_VOLTAGE_SWING_600: + return DP_TRAIN_PRE_EMPHASIS_6; + case DP_TRAIN_VOLTAGE_SWING_800: + return DP_TRAIN_PRE_EMPHASIS_3_5; + case DP_TRAIN_VOLTAGE_SWING_1200: + default: + return DP_TRAIN_PRE_EMPHASIS_0; + } + } +} + +static void +intel_get_adjust_train(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE]) +{ + uint8_t v = 0; + uint8_t p = 0; + int lane; + uint8_t *adjust_request = link_status + (DP_ADJUST_REQUEST_LANE0_1 - DP_LANE0_1_STATUS); + uint8_t voltage_max; + uint8_t preemph_max; + + for (lane = 0; lane < intel_dp->lane_count; lane++) { + uint8_t this_v = intel_get_adjust_request_voltage(adjust_request, lane); + uint8_t this_p = intel_get_adjust_request_pre_emphasis(adjust_request, lane); + + if (this_v > v) + v = this_v; + if (this_p > p) + p = this_p; + } + + voltage_max = intel_dp_voltage_max(intel_dp); + if (v >= voltage_max) + v = voltage_max | DP_TRAIN_MAX_SWING_REACHED; + + preemph_max = intel_dp_pre_emphasis_max(intel_dp, v); + if (p >= preemph_max) + p = preemph_max | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED; + + for (lane = 0; lane < 4; lane++) + intel_dp->train_set[lane] = v | p; +} + +static uint32_t +intel_dp_signal_levels(uint8_t train_set) +{ + uint32_t signal_levels = 0; + + switch (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) { + case DP_TRAIN_VOLTAGE_SWING_400: + default: + signal_levels |= DP_VOLTAGE_0_4; + break; + case DP_TRAIN_VOLTAGE_SWING_600: + signal_levels |= DP_VOLTAGE_0_6; + break; + case DP_TRAIN_VOLTAGE_SWING_800: + signal_levels |= DP_VOLTAGE_0_8; + break; + case DP_TRAIN_VOLTAGE_SWING_1200: + signal_levels |= DP_VOLTAGE_1_2; + break; + } + switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) { + case DP_TRAIN_PRE_EMPHASIS_0: + default: + signal_levels |= DP_PRE_EMPHASIS_0; + break; + case DP_TRAIN_PRE_EMPHASIS_3_5: + signal_levels |= DP_PRE_EMPHASIS_3_5; + break; + case DP_TRAIN_PRE_EMPHASIS_6: + signal_levels |= DP_PRE_EMPHASIS_6; + break; + case DP_TRAIN_PRE_EMPHASIS_9_5: + signal_levels |= DP_PRE_EMPHASIS_9_5; + break; + } + return signal_levels; +} + +/* Gen6's DP voltage swing and pre-emphasis control */ +static uint32_t +intel_gen6_edp_signal_levels(uint8_t train_set) +{ + int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK | + DP_TRAIN_PRE_EMPHASIS_MASK); + switch (signal_levels) { + case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_0: + case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_0: + return EDP_LINK_TRAIN_400_600MV_0DB_SNB_B; + case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_3_5: + return EDP_LINK_TRAIN_400MV_3_5DB_SNB_B; + case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_6: + case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_6: + return EDP_LINK_TRAIN_400_600MV_6DB_SNB_B; + case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_3_5: + case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_3_5: + return EDP_LINK_TRAIN_600_800MV_3_5DB_SNB_B; + case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_0: + case DP_TRAIN_VOLTAGE_SWING_1200 | DP_TRAIN_PRE_EMPHASIS_0: + return EDP_LINK_TRAIN_800_1200MV_0DB_SNB_B; + default: + DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:" + "0x%x\n", signal_levels); + return EDP_LINK_TRAIN_400_600MV_0DB_SNB_B; + } +} + +/* Gen7's DP voltage swing and pre-emphasis control */ +static uint32_t +intel_gen7_edp_signal_levels(uint8_t train_set) +{ + int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK | + DP_TRAIN_PRE_EMPHASIS_MASK); + switch (signal_levels) { + case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_0: + return EDP_LINK_TRAIN_400MV_0DB_IVB; + case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_3_5: + return EDP_LINK_TRAIN_400MV_3_5DB_IVB; + case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_6: + return EDP_LINK_TRAIN_400MV_6DB_IVB; + + case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_0: + return EDP_LINK_TRAIN_600MV_0DB_IVB; + case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_3_5: + return EDP_LINK_TRAIN_600MV_3_5DB_IVB; + + case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_0: + return EDP_LINK_TRAIN_800MV_0DB_IVB; + case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_3_5: + return EDP_LINK_TRAIN_800MV_3_5DB_IVB; + + default: + DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:" + "0x%x\n", signal_levels); + return EDP_LINK_TRAIN_500MV_0DB_IVB; + } +} + +static uint8_t +intel_get_lane_status(uint8_t link_status[DP_LINK_STATUS_SIZE], + int lane) +{ + int s = (lane & 1) * 4; + uint8_t l = link_status[lane>>1]; + + return (l >> s) & 0xf; +} + +/* Check for clock recovery is done on all channels */ +static bool +intel_clock_recovery_ok(uint8_t link_status[DP_LINK_STATUS_SIZE], int lane_count) +{ + int lane; + uint8_t lane_status; + + for (lane = 0; lane < lane_count; lane++) { + lane_status = intel_get_lane_status(link_status, lane); + if ((lane_status & DP_LANE_CR_DONE) == 0) + return false; + } + return true; +} + +/* Check to see if channel eq is done on all channels */ +#define CHANNEL_EQ_BITS (DP_LANE_CR_DONE|\ + DP_LANE_CHANNEL_EQ_DONE|\ + DP_LANE_SYMBOL_LOCKED) +static bool +intel_channel_eq_ok(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE]) +{ + uint8_t lane_align; + uint8_t lane_status; + int lane; + + lane_align = intel_dp_link_status(link_status, + DP_LANE_ALIGN_STATUS_UPDATED); + if ((lane_align & DP_INTERLANE_ALIGN_DONE) == 0) + return false; + for (lane = 0; lane < intel_dp->lane_count; lane++) { + lane_status = intel_get_lane_status(link_status, lane); + if ((lane_status & CHANNEL_EQ_BITS) != CHANNEL_EQ_BITS) + return false; + } + return true; +} + +static bool +intel_dp_set_link_train(struct intel_dp *intel_dp, + uint32_t dp_reg_value, + uint8_t dp_train_pat) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + int ret; + + I915_WRITE(intel_dp->output_reg, dp_reg_value); + POSTING_READ(intel_dp->output_reg); + + intel_dp_aux_native_write_1(intel_dp, + DP_TRAINING_PATTERN_SET, + dp_train_pat); + + ret = intel_dp_aux_native_write(intel_dp, + DP_TRAINING_LANE0_SET, + intel_dp->train_set, + intel_dp->lane_count); + if (ret != intel_dp->lane_count) + return false; + + return true; +} + +/* Enable corresponding port and start training pattern 1 */ +static void +intel_dp_start_link_train(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(intel_dp->base.base.crtc); + int i; + uint8_t voltage; + bool clock_recovery = false; + int voltage_tries, loop_tries; + u32 reg; + uint32_t DP = intel_dp->DP; + + /* Enable output, wait for it to become active */ + I915_WRITE(intel_dp->output_reg, intel_dp->DP); + POSTING_READ(intel_dp->output_reg); + intel_wait_for_vblank(dev, intel_crtc->pipe); + + /* Write the link configuration data */ + intel_dp_aux_native_write(intel_dp, DP_LINK_BW_SET, + intel_dp->link_configuration, + DP_LINK_CONFIGURATION_SIZE); + + DP |= DP_PORT_EN; + + if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) + DP &= ~DP_LINK_TRAIN_MASK_CPT; + else + DP &= ~DP_LINK_TRAIN_MASK; + memset(intel_dp->train_set, 0, 4); + voltage = 0xff; + voltage_tries = 0; + loop_tries = 0; + clock_recovery = false; + for (;;) { + /* Use intel_dp->train_set[0] to set the voltage and pre emphasis values */ + uint8_t link_status[DP_LINK_STATUS_SIZE]; + uint32_t signal_levels; + + + if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) { + signal_levels = intel_gen7_edp_signal_levels(intel_dp->train_set[0]); + DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_IVB) | signal_levels; + } else if (IS_GEN6(dev) && is_cpu_edp(intel_dp)) { + signal_levels = intel_gen6_edp_signal_levels(intel_dp->train_set[0]); + DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels; + } else { + signal_levels = intel_dp_signal_levels(intel_dp->train_set[0]); + DRM_DEBUG_KMS("training pattern 1 signal levels %08x\n", signal_levels); + DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels; + } + + if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) + reg = DP | DP_LINK_TRAIN_PAT_1_CPT; + else + reg = DP | DP_LINK_TRAIN_PAT_1; + + if (!intel_dp_set_link_train(intel_dp, reg, + DP_TRAINING_PATTERN_1)) + break; + /* Set training pattern 1 */ + + DELAY(100); + if (!intel_dp_get_link_status(intel_dp, link_status)) { + DRM_ERROR("failed to get link status\n"); + break; + } + + if (intel_clock_recovery_ok(link_status, intel_dp->lane_count)) { + DRM_DEBUG_KMS("clock recovery OK\n"); + clock_recovery = true; + break; + } + + /* Check to see if we've tried the max voltage */ + for (i = 0; i < intel_dp->lane_count; i++) + if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0) + break; + if (i == intel_dp->lane_count) { + ++loop_tries; + if (loop_tries == 5) { + DRM_DEBUG_KMS("too many full retries, give up\n"); + break; + } + memset(intel_dp->train_set, 0, 4); + voltage_tries = 0; + continue; + } + + /* Check to see if we've tried the same voltage 5 times */ + if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) { + ++voltage_tries; + if (voltage_tries == 5) { + DRM_DEBUG_KMS("too many voltage retries, give up\n"); + break; + } + } else + voltage_tries = 0; + voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK; + + /* Compute new intel_dp->train_set as requested by target */ + intel_get_adjust_train(intel_dp, link_status); + } + + intel_dp->DP = DP; +} + +static void +intel_dp_complete_link_train(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + bool channel_eq = false; + int tries, cr_tries; + u32 reg; + uint32_t DP = intel_dp->DP; + + /* channel equalization */ + tries = 0; + cr_tries = 0; + channel_eq = false; + for (;;) { + /* Use intel_dp->train_set[0] to set the voltage and pre emphasis values */ + uint32_t signal_levels; + uint8_t link_status[DP_LINK_STATUS_SIZE]; + + if (cr_tries > 5) { + DRM_ERROR("failed to train DP, aborting\n"); + intel_dp_link_down(intel_dp); + break; + } + + if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) { + signal_levels = intel_gen7_edp_signal_levels(intel_dp->train_set[0]); + DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_IVB) | signal_levels; + } else if (IS_GEN6(dev) && is_cpu_edp(intel_dp)) { + signal_levels = intel_gen6_edp_signal_levels(intel_dp->train_set[0]); + DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels; + } else { + signal_levels = intel_dp_signal_levels(intel_dp->train_set[0]); + DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels; + } + + if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) + reg = DP | DP_LINK_TRAIN_PAT_2_CPT; + else + reg = DP | DP_LINK_TRAIN_PAT_2; + + /* channel eq pattern */ + if (!intel_dp_set_link_train(intel_dp, reg, + DP_TRAINING_PATTERN_2)) + break; + + DELAY(400); + if (!intel_dp_get_link_status(intel_dp, link_status)) + break; + + /* Make sure clock is still ok */ + if (!intel_clock_recovery_ok(link_status, intel_dp->lane_count)) { + intel_dp_start_link_train(intel_dp); + cr_tries++; + continue; + } + + if (intel_channel_eq_ok(intel_dp, link_status)) { + channel_eq = true; + break; + } + + /* Try 5 times, then try clock recovery if that fails */ + if (tries > 5) { + intel_dp_link_down(intel_dp); + intel_dp_start_link_train(intel_dp); + tries = 0; + cr_tries++; + continue; + } + + /* Compute new intel_dp->train_set as requested by target */ + intel_get_adjust_train(intel_dp, link_status); + ++tries; + } + + if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) + reg = DP | DP_LINK_TRAIN_OFF_CPT; + else + reg = DP | DP_LINK_TRAIN_OFF; + + I915_WRITE(intel_dp->output_reg, reg); + POSTING_READ(intel_dp->output_reg); + intel_dp_aux_native_write_1(intel_dp, + DP_TRAINING_PATTERN_SET, DP_TRAINING_PATTERN_DISABLE); +} + +static void +intel_dp_link_down(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t DP = intel_dp->DP; + + if ((I915_READ(intel_dp->output_reg) & DP_PORT_EN) == 0) + return; + + DRM_DEBUG_KMS("\n"); + + if (is_edp(intel_dp)) { + DP &= ~DP_PLL_ENABLE; + I915_WRITE(intel_dp->output_reg, DP); + POSTING_READ(intel_dp->output_reg); + DELAY(100); + } + + if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) { + DP &= ~DP_LINK_TRAIN_MASK_CPT; + I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE_CPT); + } else { + DP &= ~DP_LINK_TRAIN_MASK; + I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE); + } + POSTING_READ(intel_dp->output_reg); + + drm_msleep(17, "915dlo"); + + if (is_edp(intel_dp)) { + if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) + DP |= DP_LINK_TRAIN_OFF_CPT; + else + DP |= DP_LINK_TRAIN_OFF; + } + + + if (!HAS_PCH_CPT(dev) && + I915_READ(intel_dp->output_reg) & DP_PIPEB_SELECT) { + struct drm_crtc *crtc = intel_dp->base.base.crtc; + + /* Hardware workaround: leaving our transcoder select + * set to transcoder B while it's off will prevent the + * corresponding HDMI output on transcoder A. + * + * Combine this with another hardware workaround: + * transcoder select bit can only be cleared while the + * port is enabled. + */ + DP &= ~DP_PIPEB_SELECT; + I915_WRITE(intel_dp->output_reg, DP); + + /* Changes to enable or select take place the vblank + * after being written. + */ + if (crtc == NULL) { + /* We can arrive here never having been attached + * to a CRTC, for instance, due to inheriting + * random state from the BIOS. + * + * If the pipe is not running, play safe and + * wait for the clocks to stabilise before + * continuing. + */ + POSTING_READ(intel_dp->output_reg); + drm_msleep(50, "915dla"); + } else + intel_wait_for_vblank(dev, to_intel_crtc(crtc)->pipe); + } + + DP &= ~DP_AUDIO_OUTPUT_ENABLE; + I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN); + POSTING_READ(intel_dp->output_reg); + drm_msleep(intel_dp->panel_power_down_delay, "915ldo"); +} + +static bool +intel_dp_get_dpcd(struct intel_dp *intel_dp) +{ + if (intel_dp_aux_native_read_retry(intel_dp, 0x000, intel_dp->dpcd, + sizeof(intel_dp->dpcd)) && + (intel_dp->dpcd[DP_DPCD_REV] != 0)) { + return true; + } + + return false; +} + +static bool +intel_dp_get_sink_irq(struct intel_dp *intel_dp, u8 *sink_irq_vector) +{ + int ret; + + ret = intel_dp_aux_native_read_retry(intel_dp, + DP_DEVICE_SERVICE_IRQ_VECTOR, + sink_irq_vector, 1); + if (!ret) + return false; + + return true; +} + +static void +intel_dp_handle_test_request(struct intel_dp *intel_dp) +{ + /* NAK by default */ + intel_dp_aux_native_write_1(intel_dp, DP_TEST_RESPONSE, DP_TEST_ACK); +} + +/* + * According to DP spec + * 5.1.2: + * 1. Read DPCD + * 2. Configure link according to Receiver Capabilities + * 3. Use Link Training from 2.5.3.3 and 3.5.1.3 + * 4. Check link status on receipt of hot-plug interrupt + */ + +static void +intel_dp_check_link_status(struct intel_dp *intel_dp) +{ + u8 sink_irq_vector; + u8 link_status[DP_LINK_STATUS_SIZE]; + + if (intel_dp->dpms_mode != DRM_MODE_DPMS_ON) + return; + + if (!intel_dp->base.base.crtc) + return; + + /* Try to read receiver status if the link appears to be up */ + if (!intel_dp_get_link_status(intel_dp, link_status)) { + intel_dp_link_down(intel_dp); + return; + } + + /* Now read the DPCD to see if it's actually running */ + if (!intel_dp_get_dpcd(intel_dp)) { + intel_dp_link_down(intel_dp); + return; + } + + /* Try to read the source of the interrupt */ + if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 && + intel_dp_get_sink_irq(intel_dp, &sink_irq_vector)) { + /* Clear interrupt source */ + intel_dp_aux_native_write_1(intel_dp, + DP_DEVICE_SERVICE_IRQ_VECTOR, + sink_irq_vector); + + if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST) + intel_dp_handle_test_request(intel_dp); + if (sink_irq_vector & (DP_CP_IRQ | DP_SINK_SPECIFIC_IRQ)) + DRM_DEBUG_KMS("CP or sink specific irq unhandled\n"); + } + + if (!intel_channel_eq_ok(intel_dp, link_status)) { + DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n", + drm_get_encoder_name(&intel_dp->base.base)); + intel_dp_start_link_train(intel_dp); + intel_dp_complete_link_train(intel_dp); + } +} + +static enum drm_connector_status +intel_dp_detect_dpcd(struct intel_dp *intel_dp) +{ + if (intel_dp_get_dpcd(intel_dp)) + return connector_status_connected; + return connector_status_disconnected; +} + +static enum drm_connector_status +ironlake_dp_detect(struct intel_dp *intel_dp) +{ + enum drm_connector_status status; + + /* Can't disconnect eDP, but you can close the lid... */ + if (is_edp(intel_dp)) { + status = intel_panel_detect(intel_dp->base.base.dev); + if (status == connector_status_unknown) + status = connector_status_connected; + return status; + } + + return intel_dp_detect_dpcd(intel_dp); +} + +static enum drm_connector_status +g4x_dp_detect(struct intel_dp *intel_dp) +{ + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t temp, bit; + + switch (intel_dp->output_reg) { + case DP_B: + bit = DPB_HOTPLUG_INT_STATUS; + break; + case DP_C: + bit = DPC_HOTPLUG_INT_STATUS; + break; + case DP_D: + bit = DPD_HOTPLUG_INT_STATUS; + break; + default: + return connector_status_unknown; + } + + temp = I915_READ(PORT_HOTPLUG_STAT); + + if ((temp & bit) == 0) + return connector_status_disconnected; + + return intel_dp_detect_dpcd(intel_dp); +} + +static struct edid * +intel_dp_get_edid(struct drm_connector *connector, device_t adapter) +{ + struct intel_dp *intel_dp = intel_attached_dp(connector); + struct edid *edid; + + ironlake_edp_panel_vdd_on(intel_dp); + edid = drm_get_edid(connector, adapter); + ironlake_edp_panel_vdd_off(intel_dp, false); + return edid; +} + +static int +intel_dp_get_edid_modes(struct drm_connector *connector, device_t adapter) +{ + struct intel_dp *intel_dp = intel_attached_dp(connector); + int ret; + + ironlake_edp_panel_vdd_on(intel_dp); + ret = intel_ddc_get_modes(connector, adapter); + ironlake_edp_panel_vdd_off(intel_dp, false); + return ret; +} + + +/** + * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection. + * + * \return true if DP port is connected. + * \return false if DP port is disconnected. + */ +static enum drm_connector_status +intel_dp_detect(struct drm_connector *connector, bool force) +{ + struct intel_dp *intel_dp = intel_attached_dp(connector); + struct drm_device *dev = intel_dp->base.base.dev; + enum drm_connector_status status; + struct edid *edid = NULL; + + intel_dp->has_audio = false; + + if (HAS_PCH_SPLIT(dev)) + status = ironlake_dp_detect(intel_dp); + else + status = g4x_dp_detect(intel_dp); + if (status != connector_status_connected) + return status; + + if (intel_dp->force_audio != HDMI_AUDIO_AUTO) { + intel_dp->has_audio = (intel_dp->force_audio == HDMI_AUDIO_ON); + } else { + edid = intel_dp_get_edid(connector, intel_dp->adapter); + if (edid) { + intel_dp->has_audio = drm_detect_monitor_audio(edid); + connector->display_info.raw_edid = NULL; + free(edid, DRM_MEM_KMS); + } + } + + return connector_status_connected; +} + +static int intel_dp_get_modes(struct drm_connector *connector) +{ + struct intel_dp *intel_dp = intel_attached_dp(connector); + struct drm_device *dev = intel_dp->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + int ret; + + /* We should parse the EDID data and find out if it has an audio sink + */ + + ret = intel_dp_get_edid_modes(connector, intel_dp->adapter); + if (ret) { + if (is_edp(intel_dp) && !intel_dp->panel_fixed_mode) { + struct drm_display_mode *newmode; + list_for_each_entry(newmode, &connector->probed_modes, + head) { + if ((newmode->type & DRM_MODE_TYPE_PREFERRED)) { + intel_dp->panel_fixed_mode = + drm_mode_duplicate(dev, newmode); + break; + } + } + } + return ret; + } + + /* if eDP has no EDID, try to use fixed panel mode from VBT */ + if (is_edp(intel_dp)) { + /* initialize panel mode from VBT if available for eDP */ + if (intel_dp->panel_fixed_mode == NULL && dev_priv->lfp_lvds_vbt_mode != NULL) { + intel_dp->panel_fixed_mode = + drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode); + if (intel_dp->panel_fixed_mode) { + intel_dp->panel_fixed_mode->type |= + DRM_MODE_TYPE_PREFERRED; + } + } + if (intel_dp->panel_fixed_mode) { + struct drm_display_mode *mode; + mode = drm_mode_duplicate(dev, intel_dp->panel_fixed_mode); + drm_mode_probed_add(connector, mode); + return 1; + } + } + return 0; +} + +static bool +intel_dp_detect_audio(struct drm_connector *connector) +{ + struct intel_dp *intel_dp = intel_attached_dp(connector); + struct edid *edid; + bool has_audio = false; + + edid = intel_dp_get_edid(connector, intel_dp->adapter); + if (edid) { + has_audio = drm_detect_monitor_audio(edid); + + connector->display_info.raw_edid = NULL; + free(edid, DRM_MEM_KMS); + } + + return has_audio; +} + +static int +intel_dp_set_property(struct drm_connector *connector, + struct drm_property *property, + uint64_t val) +{ + struct drm_i915_private *dev_priv = connector->dev->dev_private; + struct intel_dp *intel_dp = intel_attached_dp(connector); + int ret; + + ret = drm_connector_property_set_value(connector, property, val); + if (ret) + return ret; + + if (property == dev_priv->force_audio_property) { + int i = val; + bool has_audio; + + if (i == intel_dp->force_audio) + return 0; + + intel_dp->force_audio = i; + + if (i == HDMI_AUDIO_AUTO) + has_audio = intel_dp_detect_audio(connector); + else + has_audio = (i == HDMI_AUDIO_ON); + + if (has_audio == intel_dp->has_audio) + return 0; + + intel_dp->has_audio = has_audio; + goto done; + } + + if (property == dev_priv->broadcast_rgb_property) { + if (val == !!intel_dp->color_range) + return 0; + + intel_dp->color_range = val ? DP_COLOR_RANGE_16_235 : 0; + goto done; + } + + return -EINVAL; + +done: + if (intel_dp->base.base.crtc) { + struct drm_crtc *crtc = intel_dp->base.base.crtc; + drm_crtc_helper_set_mode(crtc, &crtc->mode, + crtc->x, crtc->y, + crtc->fb); + } + + return 0; +} + +static void +intel_dp_destroy(struct drm_connector *connector) +{ + struct drm_device *dev = connector->dev; + + if (intel_dpd_is_edp(dev)) + intel_panel_destroy_backlight(dev); + +#if 0 + drm_sysfs_connector_remove(connector); +#endif + drm_connector_cleanup(connector); + free(connector, DRM_MEM_KMS); +} + +static void intel_dp_encoder_destroy(struct drm_encoder *encoder) +{ + struct drm_device *dev; + struct intel_dp *intel_dp; + + intel_dp = enc_to_intel_dp(encoder); + dev = encoder->dev; + + if (intel_dp->dp_iic_bus != NULL) { + if (intel_dp->adapter != NULL) { + device_delete_child(intel_dp->dp_iic_bus, + intel_dp->adapter); + } + device_delete_child(dev->device, intel_dp->dp_iic_bus); + } + drm_encoder_cleanup(encoder); + if (is_edp(intel_dp)) { + struct drm_i915_private *dev_priv = intel_dp->base.base.dev->dev_private; + + taskqueue_cancel_timeout(dev_priv->tq, + &intel_dp->panel_vdd_task, NULL); + taskqueue_drain_timeout(dev_priv->tq, + &intel_dp->panel_vdd_task); + ironlake_panel_vdd_off_sync(intel_dp); + } + free(intel_dp, DRM_MEM_KMS); +} + +static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = { + .dpms = intel_dp_dpms, + .mode_fixup = intel_dp_mode_fixup, + .prepare = intel_dp_prepare, + .mode_set = intel_dp_mode_set, + .commit = intel_dp_commit, +}; + +static const struct drm_connector_funcs intel_dp_connector_funcs = { + .dpms = drm_helper_connector_dpms, + .detect = intel_dp_detect, + .fill_modes = drm_helper_probe_single_connector_modes, + .set_property = intel_dp_set_property, + .destroy = intel_dp_destroy, +}; + +static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = { + .get_modes = intel_dp_get_modes, + .mode_valid = intel_dp_mode_valid, + .best_encoder = intel_best_encoder, +}; + +static const struct drm_encoder_funcs intel_dp_enc_funcs = { + .destroy = intel_dp_encoder_destroy, +}; + +static void +intel_dp_hot_plug(struct intel_encoder *intel_encoder) +{ + struct intel_dp *intel_dp = container_of(intel_encoder, struct intel_dp, base); + + intel_dp_check_link_status(intel_dp); +} + +/* Return which DP Port should be selected for Transcoder DP control */ +int +intel_trans_dp_port_sel(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_mode_config *mode_config = &dev->mode_config; + struct drm_encoder *encoder; + + list_for_each_entry(encoder, &mode_config->encoder_list, head) { + struct intel_dp *intel_dp; + + if (encoder->crtc != crtc) + continue; + + intel_dp = enc_to_intel_dp(encoder); + if (intel_dp->base.type == INTEL_OUTPUT_DISPLAYPORT || + intel_dp->base.type == INTEL_OUTPUT_EDP) + return intel_dp->output_reg; + } + + return -1; +} + +/* check the VBT to see whether the eDP is on DP-D port */ +bool intel_dpd_is_edp(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct child_device_config *p_child; + int i; + + if (!dev_priv->child_dev_num) + return false; + + for (i = 0; i < dev_priv->child_dev_num; i++) { + p_child = dev_priv->child_dev + i; + + if (p_child->dvo_port == PORT_IDPD && + p_child->device_type == DEVICE_TYPE_eDP) + return true; + } + return false; +} + +static void +intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector) +{ + intel_attach_force_audio_property(connector); + intel_attach_broadcast_rgb_property(connector); +} + +void +intel_dp_init(struct drm_device *dev, int output_reg) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_connector *connector; + struct intel_dp *intel_dp; + struct intel_encoder *intel_encoder; + struct intel_connector *intel_connector; + const char *name = NULL; + int type; + + intel_dp = malloc(sizeof(struct intel_dp), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + intel_dp->output_reg = output_reg; + intel_dp->dpms_mode = -1; + + intel_connector = malloc(sizeof(struct intel_connector), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + intel_encoder = &intel_dp->base; + + if (HAS_PCH_SPLIT(dev) && output_reg == PCH_DP_D) + if (intel_dpd_is_edp(dev)) + intel_dp->is_pch_edp = true; + + if (output_reg == DP_A || is_pch_edp(intel_dp)) { + type = DRM_MODE_CONNECTOR_eDP; + intel_encoder->type = INTEL_OUTPUT_EDP; + } else { + type = DRM_MODE_CONNECTOR_DisplayPort; + intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT; + } + + connector = &intel_connector->base; + drm_connector_init(dev, connector, &intel_dp_connector_funcs, type); + drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs); + + connector->polled = DRM_CONNECTOR_POLL_HPD; + + if (output_reg == DP_B || output_reg == PCH_DP_B) + intel_encoder->clone_mask = (1 << INTEL_DP_B_CLONE_BIT); + else if (output_reg == DP_C || output_reg == PCH_DP_C) + intel_encoder->clone_mask = (1 << INTEL_DP_C_CLONE_BIT); + else if (output_reg == DP_D || output_reg == PCH_DP_D) + intel_encoder->clone_mask = (1 << INTEL_DP_D_CLONE_BIT); + + if (is_edp(intel_dp)) { + intel_encoder->clone_mask = (1 << INTEL_EDP_CLONE_BIT); + TIMEOUT_TASK_INIT(dev_priv->tq, &intel_dp->panel_vdd_task, 0, + ironlake_panel_vdd_work, intel_dp); + } + + intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2); + connector->interlace_allowed = true; + connector->doublescan_allowed = 0; + + drm_encoder_init(dev, &intel_encoder->base, &intel_dp_enc_funcs, + DRM_MODE_ENCODER_TMDS); + drm_encoder_helper_add(&intel_encoder->base, &intel_dp_helper_funcs); + + intel_connector_attach_encoder(intel_connector, intel_encoder); +#if 0 + drm_sysfs_connector_add(connector); +#endif + + /* Set up the DDC bus. */ + switch (output_reg) { + case DP_A: + name = "DPDDC-A"; + break; + case DP_B: + case PCH_DP_B: + dev_priv->hotplug_supported_mask |= + HDMIB_HOTPLUG_INT_STATUS; + name = "DPDDC-B"; + break; + case DP_C: + case PCH_DP_C: + dev_priv->hotplug_supported_mask |= + HDMIC_HOTPLUG_INT_STATUS; + name = "DPDDC-C"; + break; + case DP_D: + case PCH_DP_D: + dev_priv->hotplug_supported_mask |= + HDMID_HOTPLUG_INT_STATUS; + name = "DPDDC-D"; + break; + } + + /* Cache some DPCD data in the eDP case */ + if (is_edp(intel_dp)) { + bool ret; + struct edp_power_seq cur, vbt; + u32 pp_on, pp_off, pp_div; + + pp_on = I915_READ(PCH_PP_ON_DELAYS); + pp_off = I915_READ(PCH_PP_OFF_DELAYS); + pp_div = I915_READ(PCH_PP_DIVISOR); + + /* Pull timing values out of registers */ + cur.t1_t3 = (pp_on & PANEL_POWER_UP_DELAY_MASK) >> + PANEL_POWER_UP_DELAY_SHIFT; + + cur.t8 = (pp_on & PANEL_LIGHT_ON_DELAY_MASK) >> + PANEL_LIGHT_ON_DELAY_SHIFT; + + cur.t9 = (pp_off & PANEL_LIGHT_OFF_DELAY_MASK) >> + PANEL_LIGHT_OFF_DELAY_SHIFT; + + cur.t10 = (pp_off & PANEL_POWER_DOWN_DELAY_MASK) >> + PANEL_POWER_DOWN_DELAY_SHIFT; + + cur.t11_t12 = ((pp_div & PANEL_POWER_CYCLE_DELAY_MASK) >> + PANEL_POWER_CYCLE_DELAY_SHIFT) * 1000; + + DRM_DEBUG_KMS("cur t1_t3 %d t8 %d t9 %d t10 %d t11_t12 %d\n", + cur.t1_t3, cur.t8, cur.t9, cur.t10, cur.t11_t12); + + vbt = dev_priv->edp.pps; + + DRM_DEBUG_KMS("vbt t1_t3 %d t8 %d t9 %d t10 %d t11_t12 %d\n", + vbt.t1_t3, vbt.t8, vbt.t9, vbt.t10, vbt.t11_t12); + +#define get_delay(field) ((max(cur.field, vbt.field) + 9) / 10) + + intel_dp->panel_power_up_delay = get_delay(t1_t3); + intel_dp->backlight_on_delay = get_delay(t8); + intel_dp->backlight_off_delay = get_delay(t9); + intel_dp->panel_power_down_delay = get_delay(t10); + intel_dp->panel_power_cycle_delay = get_delay(t11_t12); + + DRM_DEBUG_KMS("panel power up delay %d, power down delay %d, power cycle delay %d\n", + intel_dp->panel_power_up_delay, intel_dp->panel_power_down_delay, + intel_dp->panel_power_cycle_delay); + + DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n", + intel_dp->backlight_on_delay, intel_dp->backlight_off_delay); + + ironlake_edp_panel_vdd_on(intel_dp); + ret = intel_dp_get_dpcd(intel_dp); + ironlake_edp_panel_vdd_off(intel_dp, false); + + if (ret) { + if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11) + dev_priv->no_aux_handshake = + intel_dp->dpcd[DP_MAX_DOWNSPREAD] & + DP_NO_AUX_HANDSHAKE_LINK_TRAINING; + } else { + /* if this fails, presume the device is a ghost */ + DRM_INFO("failed to retrieve link info, disabling eDP\n"); + intel_dp_encoder_destroy(&intel_dp->base.base); + intel_dp_destroy(&intel_connector->base); + return; + } + } + + intel_dp_i2c_init(intel_dp, intel_connector, name); + + intel_encoder->hot_plug = intel_dp_hot_plug; + + if (is_edp(intel_dp)) { + dev_priv->int_edp_connector = connector; + intel_panel_setup_backlight(dev); + } + + intel_dp_add_properties(intel_dp, connector); + + /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written + * 0xd. Failure to do so will result in spurious interrupts being + * generated on the port when a cable is not attached. + */ + if (IS_G4X(dev) && !IS_GM45(dev)) { + u32 temp = I915_READ(PEG_BAND_GAP_DATA); + I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd); + } +} diff --git a/sys/dev/drm2/i915/intel_drv.h b/sys/dev/drm2/i915/intel_drv.h new file mode 100644 index 00000000000..803966278c7 --- /dev/null +++ b/sys/dev/drm2/i915/intel_drv.h @@ -0,0 +1,428 @@ +/* + * Copyright (c) 2006 Dave Airlie + * Copyright (c) 2007-2008 Intel Corporation + * Jesse Barnes + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef DRM_INTEL_DRV_H +#define DRM_INTEL_DRV_H + +#include +#include +#include +#include +#include + +#define _intel_wait_for(DEV, COND, MS, W, WMSG) \ +({ \ + int end, ret; \ + \ + end = ticks + (MS) * hz / 1000; \ + ret = 0; \ + \ + while (!(COND)) { \ + if (time_after(ticks, end)) { \ + ret = -ETIMEDOUT; \ + break; \ + } \ + if (W) \ + pause((WMSG), 1); \ + else \ + DELAY(1000); \ + } \ + \ + ret; \ +}) + +#define KHz(x) (1000*x) +#define MHz(x) KHz(1000*x) + +/* store information about an Ixxx DVO */ +/* The i830->i865 use multiple DVOs with multiple i2cs */ +/* the i915, i945 have a single sDVO i2c bus - which is different */ +#define MAX_OUTPUTS 6 +/* maximum connectors per crtcs in the mode set */ +#define INTELFB_CONN_LIMIT 4 + +#define INTEL_I2C_BUS_DVO 1 +#define INTEL_I2C_BUS_SDVO 2 + +/* these are outputs from the chip - integrated only + external chips are via DVO or SDVO output */ +#define INTEL_OUTPUT_UNUSED 0 +#define INTEL_OUTPUT_ANALOG 1 +#define INTEL_OUTPUT_DVO 2 +#define INTEL_OUTPUT_SDVO 3 +#define INTEL_OUTPUT_LVDS 4 +#define INTEL_OUTPUT_TVOUT 5 +#define INTEL_OUTPUT_HDMI 6 +#define INTEL_OUTPUT_DISPLAYPORT 7 +#define INTEL_OUTPUT_EDP 8 + +/* Intel Pipe Clone Bit */ +#define INTEL_HDMIB_CLONE_BIT 1 +#define INTEL_HDMIC_CLONE_BIT 2 +#define INTEL_HDMID_CLONE_BIT 3 +#define INTEL_HDMIE_CLONE_BIT 4 +#define INTEL_HDMIF_CLONE_BIT 5 +#define INTEL_SDVO_NON_TV_CLONE_BIT 6 +#define INTEL_SDVO_TV_CLONE_BIT 7 +#define INTEL_SDVO_LVDS_CLONE_BIT 8 +#define INTEL_ANALOG_CLONE_BIT 9 +#define INTEL_TV_CLONE_BIT 10 +#define INTEL_DP_B_CLONE_BIT 11 +#define INTEL_DP_C_CLONE_BIT 12 +#define INTEL_DP_D_CLONE_BIT 13 +#define INTEL_LVDS_CLONE_BIT 14 +#define INTEL_DVO_TMDS_CLONE_BIT 15 +#define INTEL_DVO_LVDS_CLONE_BIT 16 +#define INTEL_EDP_CLONE_BIT 17 + +#define INTEL_DVO_CHIP_NONE 0 +#define INTEL_DVO_CHIP_LVDS 1 +#define INTEL_DVO_CHIP_TMDS 2 +#define INTEL_DVO_CHIP_TVOUT 4 + +/* drm_display_mode->private_flags */ +#define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0) +#define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT) +#define INTEL_MODE_DP_FORCE_6BPC (0x10) +/* This flag must be set by the encoder's mode_fixup if it changes the crtc + * timings in the mode to prevent the crtc fixup from overwriting them. + * Currently only lvds needs that. */ +#define INTEL_MODE_CRTC_TIMINGS_SET (0x20) + +static inline void +intel_mode_set_pixel_multiplier(struct drm_display_mode *mode, + int multiplier) +{ + mode->clock *= multiplier; + mode->private_flags |= multiplier; +} + +static inline int +intel_mode_get_pixel_multiplier(const struct drm_display_mode *mode) +{ + return (mode->private_flags & INTEL_MODE_PIXEL_MULTIPLIER_MASK) >> INTEL_MODE_PIXEL_MULTIPLIER_SHIFT; +} + +struct intel_framebuffer { + struct drm_framebuffer base; + struct drm_i915_gem_object *obj; +}; + +struct intel_fbdev { + struct drm_fb_helper helper; + struct intel_framebuffer ifb; + struct list_head fbdev_list; + struct drm_display_mode *our_mode; +}; + +struct intel_encoder { + struct drm_encoder base; + int type; + bool needs_tv_clock; + void (*hot_plug)(struct intel_encoder *); + int crtc_mask; + int clone_mask; +}; + +struct intel_connector { + struct drm_connector base; + struct intel_encoder *encoder; +}; + +struct intel_crtc { + struct drm_crtc base; + enum pipe pipe; + enum plane plane; + u8 lut_r[256], lut_g[256], lut_b[256]; + int dpms_mode; + bool active; /* is the crtc on? independent of the dpms mode */ + bool busy; /* is scanout buffer being updated frequently? */ + struct callout idle_callout; + bool lowfreq_avail; + struct intel_overlay *overlay; + struct intel_unpin_work *unpin_work; + int fdi_lanes; + + struct drm_i915_gem_object *cursor_bo; + uint32_t cursor_addr; + int16_t cursor_x, cursor_y; + int16_t cursor_width, cursor_height; + bool cursor_visible; + unsigned int bpp; + + bool no_pll; /* tertiary pipe for IVB */ + bool use_pll_a; +}; + +struct intel_plane { + struct drm_plane base; + enum pipe pipe; + struct drm_i915_gem_object *obj; + bool primary_disabled; + int max_downscale; + u32 lut_r[1024], lut_g[1024], lut_b[1024]; + void (*update_plane)(struct drm_plane *plane, + struct drm_framebuffer *fb, + struct drm_i915_gem_object *obj, + int crtc_x, int crtc_y, + unsigned int crtc_w, unsigned int crtc_h, + uint32_t x, uint32_t y, + uint32_t src_w, uint32_t src_h); + void (*disable_plane)(struct drm_plane *plane); + int (*update_colorkey)(struct drm_plane *plane, + struct drm_intel_sprite_colorkey *key); + void (*get_colorkey)(struct drm_plane *plane, + struct drm_intel_sprite_colorkey *key); +}; + +#define to_intel_crtc(x) container_of(x, struct intel_crtc, base) +#define to_intel_connector(x) container_of(x, struct intel_connector, base) +#define to_intel_encoder(x) container_of(x, struct intel_encoder, base) +#define to_intel_framebuffer(x) container_of(x, struct intel_framebuffer, base) +#define to_intel_plane(x) container_of(x, struct intel_plane, base) + +#define DIP_HEADER_SIZE 5 + +#define DIP_TYPE_AVI 0x82 +#define DIP_VERSION_AVI 0x2 +#define DIP_LEN_AVI 13 + +#define DIP_TYPE_SPD 0x83 +#define DIP_VERSION_SPD 0x1 +#define DIP_LEN_SPD 25 +#define DIP_SPD_UNKNOWN 0 +#define DIP_SPD_DSTB 0x1 +#define DIP_SPD_DVDP 0x2 +#define DIP_SPD_DVHS 0x3 +#define DIP_SPD_HDDVR 0x4 +#define DIP_SPD_DVC 0x5 +#define DIP_SPD_DSC 0x6 +#define DIP_SPD_VCD 0x7 +#define DIP_SPD_GAME 0x8 +#define DIP_SPD_PC 0x9 +#define DIP_SPD_BD 0xa +#define DIP_SPD_SCD 0xb + +struct dip_infoframe { + uint8_t type; /* HB0 */ + uint8_t ver; /* HB1 */ + uint8_t len; /* HB2 - body len, not including checksum */ + uint8_t ecc; /* Header ECC */ + uint8_t checksum; /* PB0 */ + union { + struct { + /* PB1 - Y 6:5, A 4:4, B 3:2, S 1:0 */ + uint8_t Y_A_B_S; + /* PB2 - C 7:6, M 5:4, R 3:0 */ + uint8_t C_M_R; + /* PB3 - ITC 7:7, EC 6:4, Q 3:2, SC 1:0 */ + uint8_t ITC_EC_Q_SC; + /* PB4 - VIC 6:0 */ + uint8_t VIC; + /* PB5 - PR 3:0 */ + uint8_t PR; + /* PB6 to PB13 */ + uint16_t top_bar_end; + uint16_t bottom_bar_start; + uint16_t left_bar_end; + uint16_t right_bar_start; + } avi; + struct { + uint8_t vn[8]; + uint8_t pd[16]; + uint8_t sdi; + } spd; + uint8_t payload[27]; + } __attribute__ ((packed)) body; +} __attribute__((packed)); + +static inline struct drm_crtc * +intel_get_crtc_for_pipe(struct drm_device *dev, int pipe) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + return dev_priv->pipe_to_crtc_mapping[pipe]; +} + +static inline struct drm_crtc * +intel_get_crtc_for_plane(struct drm_device *dev, int plane) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + return dev_priv->plane_to_crtc_mapping[plane]; +} + +struct intel_unpin_work { + struct task task; + struct drm_device *dev; + struct drm_i915_gem_object *old_fb_obj; + struct drm_i915_gem_object *pending_flip_obj; + struct drm_pending_vblank_event *event; + int pending; + bool enable_stall_check; +}; + +struct intel_fbc_work { + struct timeout_task task; + struct drm_crtc *crtc; + struct drm_framebuffer *fb; + int interval; +}; + +int intel_ddc_get_modes(struct drm_connector *c, device_t adapter); +extern bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus); + +extern void intel_attach_force_audio_property(struct drm_connector *connector); +extern void intel_attach_broadcast_rgb_property(struct drm_connector *connector); + +extern void intel_crt_init(struct drm_device *dev); +extern void intel_hdmi_init(struct drm_device *dev, int sdvox_reg); +void intel_dip_infoframe_csum(struct dip_infoframe *avi_if); +extern bool intel_sdvo_init(struct drm_device *dev, int output_device); +extern void intel_dvo_init(struct drm_device *dev); +extern void intel_tv_init(struct drm_device *dev); +extern void intel_mark_busy(struct drm_device *dev, + struct drm_i915_gem_object *obj); +extern bool intel_lvds_init(struct drm_device *dev); +extern void intel_dp_init(struct drm_device *dev, int dp_reg); +void +intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode); +extern bool intel_dpd_is_edp(struct drm_device *dev); +extern void intel_edp_link_config(struct intel_encoder *, int *, int *); +extern bool intel_encoder_is_pch_edp(struct drm_encoder *encoder); +extern int intel_plane_init(struct drm_device *dev, enum pipe pipe); + +/* intel_panel.c */ +extern void intel_fixed_panel_mode(struct drm_display_mode *fixed_mode, + struct drm_display_mode *adjusted_mode); +extern void intel_pch_panel_fitting(struct drm_device *dev, + int fitting_mode, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode); +extern u32 intel_panel_get_max_backlight(struct drm_device *dev); +extern u32 intel_panel_get_backlight(struct drm_device *dev); +extern void intel_panel_set_backlight(struct drm_device *dev, u32 level); +extern int intel_panel_setup_backlight(struct drm_device *dev); +extern void intel_panel_enable_backlight(struct drm_device *dev); +extern void intel_panel_disable_backlight(struct drm_device *dev); +extern void intel_panel_destroy_backlight(struct drm_device *dev); +extern enum drm_connector_status intel_panel_detect(struct drm_device *dev); + +extern void intel_crtc_load_lut(struct drm_crtc *crtc); +extern void intel_encoder_prepare(struct drm_encoder *encoder); +extern void intel_encoder_commit(struct drm_encoder *encoder); +extern void intel_encoder_destroy(struct drm_encoder *encoder); + +static inline struct intel_encoder *intel_attached_encoder(struct drm_connector *connector) +{ + return to_intel_connector(connector)->encoder; +} + +extern void intel_connector_attach_encoder(struct intel_connector *connector, + struct intel_encoder *encoder); +extern struct drm_encoder *intel_best_encoder(struct drm_connector *connector); + +extern struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev, + struct drm_crtc *crtc); +int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data, + struct drm_file *file_priv); +extern void intel_wait_for_vblank(struct drm_device *dev, int pipe); +extern void intel_wait_for_pipe_off(struct drm_device *dev, int pipe); + +struct intel_load_detect_pipe { + struct drm_framebuffer *release_fb; + bool load_detect_temp; + int dpms_mode; +}; +extern bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder, + struct drm_connector *connector, + struct drm_display_mode *mode, + struct intel_load_detect_pipe *old); +extern void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, + struct drm_connector *connector, + struct intel_load_detect_pipe *old); + +extern void intelfb_restore(void); +extern void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, + u16 blue, int regno); +extern void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, + u16 *blue, int regno); +extern void intel_enable_clock_gating(struct drm_device *dev); +extern void ironlake_enable_drps(struct drm_device *dev); +extern void ironlake_disable_drps(struct drm_device *dev); +extern void gen6_enable_rps(struct drm_i915_private *dev_priv); +extern void gen6_update_ring_freq(struct drm_i915_private *dev_priv); +extern void gen6_disable_rps(struct drm_device *dev); +extern void intel_init_emon(struct drm_device *dev); + +extern int intel_pin_and_fence_fb_obj(struct drm_device *dev, + struct drm_i915_gem_object *obj, + struct intel_ring_buffer *pipelined); +extern void intel_unpin_fb_obj(struct drm_i915_gem_object *obj); + +extern int intel_framebuffer_init(struct drm_device *dev, + struct intel_framebuffer *ifb, + struct drm_mode_fb_cmd2 *mode_cmd, + struct drm_i915_gem_object *obj); +extern int intel_fbdev_init(struct drm_device *dev); +extern void intel_fbdev_fini(struct drm_device *dev); + +extern void intel_prepare_page_flip(struct drm_device *dev, int plane); +extern void intel_finish_page_flip(struct drm_device *dev, int pipe); +extern void intel_finish_page_flip_plane(struct drm_device *dev, int plane); + +extern void intel_setup_overlay(struct drm_device *dev); +extern void intel_cleanup_overlay(struct drm_device *dev); +extern int intel_overlay_switch_off(struct intel_overlay *overlay); +extern int intel_overlay_put_image(struct drm_device *dev, void *data, + struct drm_file *file_priv); +extern int intel_overlay_attrs(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +extern void intel_fb_output_poll_changed(struct drm_device *dev); +extern void intel_fb_restore_mode(struct drm_device *dev); + +extern void assert_pipe(struct drm_i915_private *dev_priv, enum pipe pipe, + bool state); +#define assert_pipe_enabled(d, p) assert_pipe(d, p, true) +#define assert_pipe_disabled(d, p) assert_pipe(d, p, false) + +extern void intel_init_clock_gating(struct drm_device *dev); +extern void intel_write_eld(struct drm_encoder *encoder, + struct drm_display_mode *mode); +extern void intel_cpt_verify_modeset(struct drm_device *dev, int pipe); + +/* For use by IVB LP watermark workaround in intel_sprite.c */ +extern void sandybridge_update_wm(struct drm_device *dev); +extern void intel_update_sprite_watermarks(struct drm_device *dev, int pipe, + uint32_t sprite_width, + int pixel_size); +extern int intel_sprite_set_colorkey(struct drm_device *dev, void *data, + struct drm_file *file_priv); +extern int intel_sprite_get_colorkey(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +#endif diff --git a/sys/dev/drm2/i915/intel_fb.c b/sys/dev/drm2/i915/intel_fb.c new file mode 100644 index 00000000000..3cb3b787c60 --- /dev/null +++ b/sys/dev/drm2/i915/intel_fb.c @@ -0,0 +1,270 @@ +/* + * Copyright © 2007 David Airlie + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * David Airlie + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +static int intelfb_create(struct intel_fbdev *ifbdev, + struct drm_fb_helper_surface_size *sizes) +{ + struct drm_device *dev = ifbdev->helper.dev; +#if 0 + struct drm_i915_private *dev_priv = dev->dev_private; + struct fb_info *info; +#endif + struct drm_framebuffer *fb; + struct drm_mode_fb_cmd2 mode_cmd; + struct drm_i915_gem_object *obj; + int size, ret; + + /* we don't do packed 24bpp */ + if (sizes->surface_bpp == 24) + sizes->surface_bpp = 32; + + mode_cmd.width = sizes->surface_width; + mode_cmd.height = sizes->surface_height; + + mode_cmd.pitches[0] = roundup2(mode_cmd.width * ((sizes->surface_bpp + 7) / + 8), 64); + mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, + sizes->surface_depth); + + size = mode_cmd.pitches[0] * mode_cmd.height; + size = roundup2(size, PAGE_SIZE); + obj = i915_gem_alloc_object(dev, size); + if (!obj) { + DRM_ERROR("failed to allocate framebuffer\n"); + ret = -ENOMEM; + goto out; + } + + DRM_LOCK(dev); + + /* Flush everything out, we'll be doing GTT only from now on */ + ret = intel_pin_and_fence_fb_obj(dev, obj, false); + if (ret) { + DRM_ERROR("failed to pin fb: %d\n", ret); + goto out_unref; + } + +#if 0 + info = framebuffer_alloc(0, device); + if (!info) { + ret = -ENOMEM; + goto out_unpin; + } + + info->par = ifbdev; +#endif + + ret = intel_framebuffer_init(dev, &ifbdev->ifb, &mode_cmd, obj); + if (ret) + goto out_unpin; + + fb = &ifbdev->ifb.base; + + ifbdev->helper.fb = fb; +#if 0 + ifbdev->helper.fbdev = info; + + strcpy(info->fix.id, "inteldrmfb"); + + info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT; + info->fbops = &intelfb_ops; + + ret = fb_alloc_cmap(&info->cmap, 256, 0); + if (ret) { + ret = -ENOMEM; + goto out_unpin; + } + /* setup aperture base/size for vesafb takeover */ + info->apertures = alloc_apertures(1); + if (!info->apertures) { + ret = -ENOMEM; + goto out_unpin; + } + info->apertures->ranges[0].base = dev->mode_config.fb_base; + info->apertures->ranges[0].size = + dev_priv->mm.gtt->gtt_mappable_entries << PAGE_SHIFT; + + info->fix.smem_start = dev->mode_config.fb_base + obj->gtt_offset; + info->fix.smem_len = size; + + info->screen_base = ioremap_wc(dev->agp->base + obj->gtt_offset, size); + if (!info->screen_base) { + ret = -ENOSPC; + goto out_unpin; + } + info->screen_size = size; + +// memset(info->screen_base, 0, size); + + drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth); + drm_fb_helper_fill_var(info, &ifbdev->helper, sizes->fb_width, sizes->fb_height); + + /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */ +#endif + + DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08x, bo %p\n", + fb->width, fb->height, + obj->gtt_offset, obj); + + DRM_UNLOCK(dev); +#if 1 + KIB_NOTYET(); +#else + vga_switcheroo_client_fb_set(dev->pdev, info); +#endif + return 0; + +out_unpin: + i915_gem_object_unpin(obj); +out_unref: + drm_gem_object_unreference(&obj->base); + DRM_UNLOCK(dev); +out: + return ret; +} + +static int intel_fb_find_or_create_single(struct drm_fb_helper *helper, + struct drm_fb_helper_surface_size *sizes) +{ + struct intel_fbdev *ifbdev = (struct intel_fbdev *)helper; + int new_fb = 0; + int ret; + + if (!helper->fb) { + ret = intelfb_create(ifbdev, sizes); + if (ret) + return ret; + new_fb = 1; + } + return new_fb; +} + +static struct drm_fb_helper_funcs intel_fb_helper_funcs = { + .gamma_set = intel_crtc_fb_gamma_set, + .gamma_get = intel_crtc_fb_gamma_get, + .fb_probe = intel_fb_find_or_create_single, +}; + +static void intel_fbdev_destroy(struct drm_device *dev, + struct intel_fbdev *ifbdev) +{ +#if 0 + struct fb_info *info; +#endif + struct intel_framebuffer *ifb = &ifbdev->ifb; + +#if 0 + if (ifbdev->helper.fbdev) { + info = ifbdev->helper.fbdev; + unregister_framebuffer(info); + iounmap(info->screen_base); + if (info->cmap.len) + fb_dealloc_cmap(&info->cmap); + framebuffer_release(info); + } +#endif + + drm_fb_helper_fini(&ifbdev->helper); + + drm_framebuffer_cleanup(&ifb->base); + if (ifb->obj) { + drm_gem_object_unreference_unlocked(&ifb->obj->base); + ifb->obj = NULL; + } +} + +int intel_fbdev_init(struct drm_device *dev) +{ + struct intel_fbdev *ifbdev; + drm_i915_private_t *dev_priv = dev->dev_private; + int ret; + + ifbdev = malloc(sizeof(struct intel_fbdev), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + dev_priv->fbdev = ifbdev; + ifbdev->helper.funcs = &intel_fb_helper_funcs; + + ret = drm_fb_helper_init(dev, &ifbdev->helper, + dev_priv->num_pipe, + INTELFB_CONN_LIMIT); + if (ret) { + free(ifbdev, DRM_MEM_KMS); + return ret; + } + + drm_fb_helper_single_add_all_connectors(&ifbdev->helper); + drm_fb_helper_initial_config(&ifbdev->helper, 32); + return 0; +} + +void intel_fbdev_fini(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + if (!dev_priv->fbdev) + return; + + intel_fbdev_destroy(dev, dev_priv->fbdev); + free(dev_priv->fbdev, DRM_MEM_KMS); + dev_priv->fbdev = NULL; +} + +void intel_fb_output_poll_changed(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper); +} + +void intel_fb_restore_mode(struct drm_device *dev) +{ + int ret; + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_mode_config *config = &dev->mode_config; + struct drm_plane *plane; + + sx_xlock(&dev->mode_config.mutex); + + ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper); + if (ret) + DRM_DEBUG("failed to restore crtc mode\n"); + + /* Be sure to shut off any planes that may be active */ + list_for_each_entry(plane, &config->plane_list, head) + plane->funcs->disable_plane(plane); + + sx_xunlock(&dev->mode_config.mutex); +} diff --git a/sys/dev/drm2/i915/intel_hdmi.c b/sys/dev/drm2/i915/intel_hdmi.c new file mode 100644 index 00000000000..ccb9dced597 --- /dev/null +++ b/sys/dev/drm2/i915/intel_hdmi.c @@ -0,0 +1,576 @@ +/* + * Copyright 2006 Dave Airlie + * Copyright © 2006-2009 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * Jesse Barnes + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +struct intel_hdmi { + struct intel_encoder base; + u32 sdvox_reg; + int ddc_bus; + uint32_t color_range; + bool has_hdmi_sink; + bool has_audio; + enum hdmi_force_audio force_audio; + void (*write_infoframe)(struct drm_encoder *encoder, + struct dip_infoframe *frame); +}; + +static struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder) +{ + return container_of(encoder, struct intel_hdmi, base.base); +} + +static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector) +{ + return container_of(intel_attached_encoder(connector), + struct intel_hdmi, base); +} + +void intel_dip_infoframe_csum(struct dip_infoframe *frame) +{ + uint8_t *data = (uint8_t *)frame; + uint8_t sum = 0; + unsigned i; + + frame->checksum = 0; + frame->ecc = 0; + + for (i = 0; i < frame->len + DIP_HEADER_SIZE; i++) + sum += data[i]; + + frame->checksum = 0x100 - sum; +} + +static u32 intel_infoframe_index(struct dip_infoframe *frame) +{ + u32 flags = 0; + + switch (frame->type) { + case DIP_TYPE_AVI: + flags |= VIDEO_DIP_SELECT_AVI; + break; + case DIP_TYPE_SPD: + flags |= VIDEO_DIP_SELECT_SPD; + break; + default: + DRM_DEBUG("unknown info frame type %d\n", frame->type); + break; + } + + return flags; +} + +static u32 intel_infoframe_flags(struct dip_infoframe *frame) +{ + u32 flags = 0; + + switch (frame->type) { + case DIP_TYPE_AVI: + flags |= VIDEO_DIP_ENABLE_AVI | VIDEO_DIP_FREQ_VSYNC; + break; + case DIP_TYPE_SPD: + flags |= VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_FREQ_VSYNC; + break; + default: + DRM_DEBUG("unknown info frame type %d\n", frame->type); + break; + } + + return flags; +} + +static void i9xx_write_infoframe(struct drm_encoder *encoder, + struct dip_infoframe *frame) +{ + uint32_t *data = (uint32_t *)frame; + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); + u32 port, flags, val = I915_READ(VIDEO_DIP_CTL); + unsigned i, len = DIP_HEADER_SIZE + frame->len; + + + /* XXX first guess at handling video port, is this corrent? */ + if (intel_hdmi->sdvox_reg == SDVOB) + port = VIDEO_DIP_PORT_B; + else if (intel_hdmi->sdvox_reg == SDVOC) + port = VIDEO_DIP_PORT_C; + else + return; + + flags = intel_infoframe_index(frame); + + val &= ~VIDEO_DIP_SELECT_MASK; + + I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | val | port | flags); + + for (i = 0; i < len; i += 4) { + I915_WRITE(VIDEO_DIP_DATA, *data); + data++; + } + + flags |= intel_infoframe_flags(frame); + + I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | val | port | flags); +} + +static void ironlake_write_infoframe(struct drm_encoder *encoder, + struct dip_infoframe *frame) +{ + uint32_t *data = (uint32_t *)frame; + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_crtc *crtc = encoder->crtc; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int reg = TVIDEO_DIP_CTL(intel_crtc->pipe); + unsigned i, len = DIP_HEADER_SIZE + frame->len; + u32 flags, val = I915_READ(reg); + + intel_wait_for_vblank(dev, intel_crtc->pipe); + + flags = intel_infoframe_index(frame); + + val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */ + + I915_WRITE(reg, VIDEO_DIP_ENABLE | val | flags); + + for (i = 0; i < len; i += 4) { + I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data); + data++; + } + + flags |= intel_infoframe_flags(frame); + + I915_WRITE(reg, VIDEO_DIP_ENABLE | val | flags); +} + +static void intel_set_infoframe(struct drm_encoder *encoder, + struct dip_infoframe *frame) +{ + struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); + + if (!intel_hdmi->has_hdmi_sink) + return; + + intel_dip_infoframe_csum(frame); + intel_hdmi->write_infoframe(encoder, frame); +} + +static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder) +{ + struct dip_infoframe avi_if = { + .type = DIP_TYPE_AVI, + .ver = DIP_VERSION_AVI, + .len = DIP_LEN_AVI, + }; + + intel_set_infoframe(encoder, &avi_if); +} + +static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder) +{ + struct dip_infoframe spd_if; + + memset(&spd_if, 0, sizeof(spd_if)); + spd_if.type = DIP_TYPE_SPD; + spd_if.ver = DIP_VERSION_SPD; + spd_if.len = DIP_LEN_SPD; + strcpy(spd_if.body.spd.vn, "Intel"); + strcpy(spd_if.body.spd.pd, "Integrated gfx"); + spd_if.body.spd.sdi = DIP_SPD_PC; + + intel_set_infoframe(encoder, &spd_if); +} + +static void intel_hdmi_mode_set(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_crtc *crtc = encoder->crtc; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); + u32 sdvox; + + sdvox = SDVO_ENCODING_HDMI | SDVO_BORDER_ENABLE; + if (!HAS_PCH_SPLIT(dev)) + sdvox |= intel_hdmi->color_range; + if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) + sdvox |= SDVO_VSYNC_ACTIVE_HIGH; + if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) + sdvox |= SDVO_HSYNC_ACTIVE_HIGH; + + if (intel_crtc->bpp > 24) + sdvox |= COLOR_FORMAT_12bpc; + else + sdvox |= COLOR_FORMAT_8bpc; + + /* Required on CPT */ + if (intel_hdmi->has_hdmi_sink && HAS_PCH_CPT(dev)) + sdvox |= HDMI_MODE_SELECT; + + if (intel_hdmi->has_audio) { + DRM_DEBUG_KMS("Enabling HDMI audio on pipe %c\n", + pipe_name(intel_crtc->pipe)); + sdvox |= SDVO_AUDIO_ENABLE; + sdvox |= SDVO_NULL_PACKETS_DURING_VSYNC; + intel_write_eld(encoder, adjusted_mode); + } + + if (HAS_PCH_CPT(dev)) + sdvox |= PORT_TRANS_SEL_CPT(intel_crtc->pipe); + else if (intel_crtc->pipe == 1) + sdvox |= SDVO_PIPE_B_SELECT; + + I915_WRITE(intel_hdmi->sdvox_reg, sdvox); + POSTING_READ(intel_hdmi->sdvox_reg); + + intel_hdmi_set_avi_infoframe(encoder); + intel_hdmi_set_spd_infoframe(encoder); +} + +static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode) +{ + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); + u32 temp; + u32 enable_bits = SDVO_ENABLE; + + if (intel_hdmi->has_audio) + enable_bits |= SDVO_AUDIO_ENABLE; + + temp = I915_READ(intel_hdmi->sdvox_reg); + + /* HW workaround, need to toggle enable bit off and on for 12bpc, but + * we do this anyway which shows more stable in testing. + */ + if (HAS_PCH_SPLIT(dev)) { + I915_WRITE(intel_hdmi->sdvox_reg, temp & ~SDVO_ENABLE); + POSTING_READ(intel_hdmi->sdvox_reg); + } + + if (mode != DRM_MODE_DPMS_ON) { + temp &= ~enable_bits; + } else { + temp |= enable_bits; + } + + I915_WRITE(intel_hdmi->sdvox_reg, temp); + POSTING_READ(intel_hdmi->sdvox_reg); + + /* HW workaround, need to write this twice for issue that may result + * in first write getting masked. + */ + if (HAS_PCH_SPLIT(dev)) { + I915_WRITE(intel_hdmi->sdvox_reg, temp); + POSTING_READ(intel_hdmi->sdvox_reg); + } +} + +static int intel_hdmi_mode_valid(struct drm_connector *connector, + struct drm_display_mode *mode) +{ + if (mode->clock > 165000) + return MODE_CLOCK_HIGH; + if (mode->clock < 20000) + return MODE_CLOCK_LOW; + + if (mode->flags & DRM_MODE_FLAG_DBLSCAN) + return MODE_NO_DBLESCAN; + + return MODE_OK; +} + +static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + return true; +} + +static enum drm_connector_status +intel_hdmi_detect(struct drm_connector *connector, bool force) +{ + struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); + struct drm_i915_private *dev_priv = connector->dev->dev_private; + struct edid *edid; + enum drm_connector_status status = connector_status_disconnected; + + intel_hdmi->has_hdmi_sink = false; + intel_hdmi->has_audio = false; + edid = drm_get_edid(connector, dev_priv->gmbus[intel_hdmi->ddc_bus]); + + if (edid) { + if (edid->input & DRM_EDID_INPUT_DIGITAL) { + status = connector_status_connected; + if (intel_hdmi->force_audio != HDMI_AUDIO_OFF_DVI) + intel_hdmi->has_hdmi_sink = + drm_detect_hdmi_monitor(edid); + intel_hdmi->has_audio = drm_detect_monitor_audio(edid); + } + connector->display_info.raw_edid = NULL; + free(edid, DRM_MEM_KMS); + } else { + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] got no edid, ddc port %d\n", + connector->base.id, drm_get_connector_name(connector), + intel_hdmi->ddc_bus); + } + + if (status == connector_status_connected) { + if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO) + intel_hdmi->has_audio = + (intel_hdmi->force_audio == HDMI_AUDIO_ON); + } + + return status; +} + +static int intel_hdmi_get_modes(struct drm_connector *connector) +{ + struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); + struct drm_i915_private *dev_priv = connector->dev->dev_private; + + /* We should parse the EDID data and find out if it's an HDMI sink so + * we can send audio to it. + */ + + return intel_ddc_get_modes(connector, + dev_priv->gmbus[intel_hdmi->ddc_bus]); +} + +static bool +intel_hdmi_detect_audio(struct drm_connector *connector) +{ + struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); + struct drm_i915_private *dev_priv = connector->dev->dev_private; + struct edid *edid; + bool has_audio = false; + + edid = drm_get_edid(connector, dev_priv->gmbus[intel_hdmi->ddc_bus]); + if (edid) { + if (edid->input & DRM_EDID_INPUT_DIGITAL) + has_audio = drm_detect_monitor_audio(edid); + + connector->display_info.raw_edid = NULL; + free(edid, DRM_MEM_KMS); + } + + return has_audio; +} + +static int +intel_hdmi_set_property(struct drm_connector *connector, + struct drm_property *property, + uint64_t val) +{ + struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); + struct drm_i915_private *dev_priv = connector->dev->dev_private; + int ret; + + ret = drm_connector_property_set_value(connector, property, val); + if (ret) + return ret; + + if (property == dev_priv->force_audio_property) { + enum hdmi_force_audio i = val; + bool has_audio; + + if (i == intel_hdmi->force_audio) + return 0; + + intel_hdmi->force_audio = i; + + if (i == HDMI_AUDIO_AUTO) + has_audio = intel_hdmi_detect_audio(connector); + else + has_audio = (i == HDMI_AUDIO_ON); + + if (i == HDMI_AUDIO_OFF_DVI) + intel_hdmi->has_hdmi_sink = 0; + + intel_hdmi->has_audio = has_audio; + goto done; + } + + if (property == dev_priv->broadcast_rgb_property) { + if (val == !!intel_hdmi->color_range) + return 0; + + intel_hdmi->color_range = val ? SDVO_COLOR_RANGE_16_235 : 0; + goto done; + } + + return -EINVAL; + +done: + if (intel_hdmi->base.base.crtc) { + struct drm_crtc *crtc = intel_hdmi->base.base.crtc; + drm_crtc_helper_set_mode(crtc, &crtc->mode, + crtc->x, crtc->y, + crtc->fb); + } + + return 0; +} + +static void intel_hdmi_destroy(struct drm_connector *connector) +{ +#if 0 + drm_sysfs_connector_remove(connector); +#endif + drm_connector_cleanup(connector); + free(connector, DRM_MEM_KMS); +} + +static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs = { + .dpms = intel_hdmi_dpms, + .mode_fixup = intel_hdmi_mode_fixup, + .prepare = intel_encoder_prepare, + .mode_set = intel_hdmi_mode_set, + .commit = intel_encoder_commit, +}; + +static const struct drm_connector_funcs intel_hdmi_connector_funcs = { + .dpms = drm_helper_connector_dpms, + .detect = intel_hdmi_detect, + .fill_modes = drm_helper_probe_single_connector_modes, + .set_property = intel_hdmi_set_property, + .destroy = intel_hdmi_destroy, +}; + +static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = { + .get_modes = intel_hdmi_get_modes, + .mode_valid = intel_hdmi_mode_valid, + .best_encoder = intel_best_encoder, +}; + +static const struct drm_encoder_funcs intel_hdmi_enc_funcs = { + .destroy = intel_encoder_destroy, +}; + +static void +intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector) +{ + intel_attach_force_audio_property(connector); + intel_attach_broadcast_rgb_property(connector); +} + +void intel_hdmi_init(struct drm_device *dev, int sdvox_reg) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_connector *connector; + struct intel_encoder *intel_encoder; + struct intel_connector *intel_connector; + struct intel_hdmi *intel_hdmi; + int i; + + intel_hdmi = malloc(sizeof(struct intel_hdmi), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + intel_connector = malloc(sizeof(struct intel_connector), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + intel_encoder = &intel_hdmi->base; + drm_encoder_init(dev, &intel_encoder->base, &intel_hdmi_enc_funcs, + DRM_MODE_ENCODER_TMDS); + + connector = &intel_connector->base; + drm_connector_init(dev, connector, &intel_hdmi_connector_funcs, + DRM_MODE_CONNECTOR_HDMIA); + drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs); + + intel_encoder->type = INTEL_OUTPUT_HDMI; + + connector->polled = DRM_CONNECTOR_POLL_HPD; + connector->interlace_allowed = 1; + connector->doublescan_allowed = 0; + intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2); + + /* Set up the DDC bus. */ + if (sdvox_reg == SDVOB) { + intel_encoder->clone_mask = (1 << INTEL_HDMIB_CLONE_BIT); + intel_hdmi->ddc_bus = GMBUS_PORT_DPB; + dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS; + } else if (sdvox_reg == SDVOC) { + intel_encoder->clone_mask = (1 << INTEL_HDMIC_CLONE_BIT); + intel_hdmi->ddc_bus = GMBUS_PORT_DPC; + dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS; + } else if (sdvox_reg == HDMIB) { + intel_encoder->clone_mask = (1 << INTEL_HDMID_CLONE_BIT); + intel_hdmi->ddc_bus = GMBUS_PORT_DPB; + dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS; + } else if (sdvox_reg == HDMIC) { + intel_encoder->clone_mask = (1 << INTEL_HDMIE_CLONE_BIT); + intel_hdmi->ddc_bus = GMBUS_PORT_DPC; + dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS; + } else if (sdvox_reg == HDMID) { + intel_encoder->clone_mask = (1 << INTEL_HDMIF_CLONE_BIT); + intel_hdmi->ddc_bus = GMBUS_PORT_DPD; + dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS; + } + + + intel_hdmi->sdvox_reg = sdvox_reg; + + if (!HAS_PCH_SPLIT(dev)) { + intel_hdmi->write_infoframe = i9xx_write_infoframe; + I915_WRITE(VIDEO_DIP_CTL, 0); + } else { + intel_hdmi->write_infoframe = ironlake_write_infoframe; + for_each_pipe(i) + I915_WRITE(TVIDEO_DIP_CTL(i), 0); + } + + drm_encoder_helper_add(&intel_encoder->base, &intel_hdmi_helper_funcs); + + intel_hdmi_add_properties(intel_hdmi, connector); + + intel_connector_attach_encoder(intel_connector, intel_encoder); +#if 0 + drm_sysfs_connector_add(connector); +#endif + + /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written + * 0xd. Failure to do so will result in spurious interrupts being + * generated on the port when a cable is not attached. + */ + if (IS_G4X(dev) && !IS_GM45(dev)) { + u32 temp = I915_READ(PEG_BAND_GAP_DATA); + I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd); + } +} diff --git a/sys/dev/drm2/i915/intel_iic.c b/sys/dev/drm2/i915/intel_iic.c new file mode 100644 index 00000000000..40e6eca927a --- /dev/null +++ b/sys/dev/drm2/i915/intel_iic.c @@ -0,0 +1,716 @@ +/* + * Copyright (c) 2006 Dave Airlie + * Copyright © 2006-2008,2010 Intel Corporation + * Jesse Barnes + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * Chris Wilson + * + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Konstantin Belousov under sponsorship from + * the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include "iicbus_if.h" +#include "iicbb_if.h" + +static int intel_iic_quirk_xfer(device_t idev, struct iic_msg *msgs, int nmsgs); +static void intel_teardown_gmbus_m(struct drm_device *dev, int m); + +/* Intel GPIO access functions */ + +#define I2C_RISEFALL_TIME 10 + +struct intel_iic_softc { + struct drm_device *drm_dev; + device_t iic_dev; + bool force_bit_dev; + char name[32]; + uint32_t reg; + uint32_t reg0; +}; + +static void +intel_iic_quirk_set(struct drm_i915_private *dev_priv, bool enable) +{ + u32 val; + + /* When using bit bashing for I2C, this bit needs to be set to 1 */ + if (!IS_PINEVIEW(dev_priv->dev)) + return; + + val = I915_READ(DSPCLK_GATE_D); + if (enable) + val |= DPCUNIT_CLOCK_GATE_DISABLE; + else + val &= ~DPCUNIT_CLOCK_GATE_DISABLE; + I915_WRITE(DSPCLK_GATE_D, val); +} + +static u32 +intel_iic_get_reserved(device_t idev) +{ + struct intel_iic_softc *sc; + struct drm_device *dev; + struct drm_i915_private *dev_priv; + u32 reserved; + + sc = device_get_softc(idev); + dev = sc->drm_dev; + dev_priv = dev->dev_private; + + if (!IS_I830(dev) && !IS_845G(dev)) { + reserved = I915_READ_NOTRACE(sc->reg) & + (GPIO_DATA_PULLUP_DISABLE | GPIO_CLOCK_PULLUP_DISABLE); + } else { + reserved = 0; + } + + return (reserved); +} + +void +intel_iic_reset(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv; + + dev_priv = dev->dev_private; + if (HAS_PCH_SPLIT(dev)) + I915_WRITE(PCH_GMBUS0, 0); + else + I915_WRITE(GMBUS0, 0); +} + +static int +intel_iicbus_reset(device_t idev, u_char speed, u_char addr, u_char *oldaddr) +{ + struct intel_iic_softc *sc; + struct drm_device *dev; + + sc = device_get_softc(idev); + dev = sc->drm_dev; + + intel_iic_reset(dev); + return (0); +} + +static void +intel_iicbb_setsda(device_t idev, int val) +{ + struct intel_iic_softc *sc; + struct drm_i915_private *dev_priv; + u32 reserved; + u32 data_bits; + + sc = device_get_softc(idev); + dev_priv = sc->drm_dev->dev_private; + + reserved = intel_iic_get_reserved(idev); + if (val) + data_bits = GPIO_DATA_DIR_IN | GPIO_DATA_DIR_MASK; + else + data_bits = GPIO_DATA_DIR_OUT | GPIO_DATA_DIR_MASK | + GPIO_DATA_VAL_MASK; + + I915_WRITE_NOTRACE(sc->reg, reserved | data_bits); + POSTING_READ(sc->reg); +} + +static void +intel_iicbb_setscl(device_t idev, int val) +{ + struct intel_iic_softc *sc; + struct drm_i915_private *dev_priv; + u32 clock_bits, reserved; + + sc = device_get_softc(idev); + dev_priv = sc->drm_dev->dev_private; + + reserved = intel_iic_get_reserved(idev); + if (val) + clock_bits = GPIO_CLOCK_DIR_IN | GPIO_CLOCK_DIR_MASK; + else + clock_bits = GPIO_CLOCK_DIR_OUT | GPIO_CLOCK_DIR_MASK | + GPIO_CLOCK_VAL_MASK; + + I915_WRITE_NOTRACE(sc->reg, reserved | clock_bits); + POSTING_READ(sc->reg); +} + +static int +intel_iicbb_getsda(device_t idev) +{ + struct intel_iic_softc *sc; + struct drm_i915_private *dev_priv; + u32 reserved; + + sc = device_get_softc(idev); + dev_priv = sc->drm_dev->dev_private; + + reserved = intel_iic_get_reserved(idev); + + I915_WRITE_NOTRACE(sc->reg, reserved | GPIO_DATA_DIR_MASK); + I915_WRITE_NOTRACE(sc->reg, reserved); + return ((I915_READ_NOTRACE(sc->reg) & GPIO_DATA_VAL_IN) != 0); +} + +static int +intel_iicbb_getscl(device_t idev) +{ + struct intel_iic_softc *sc; + struct drm_i915_private *dev_priv; + u32 reserved; + + sc = device_get_softc(idev); + dev_priv = sc->drm_dev->dev_private; + + reserved = intel_iic_get_reserved(idev); + + I915_WRITE_NOTRACE(sc->reg, reserved | GPIO_CLOCK_DIR_MASK); + I915_WRITE_NOTRACE(sc->reg, reserved); + return ((I915_READ_NOTRACE(sc->reg) & GPIO_CLOCK_VAL_IN) != 0); +} + +static int +intel_gmbus_transfer(device_t idev, struct iic_msg *msgs, uint32_t nmsgs) +{ + struct intel_iic_softc *sc; + struct drm_i915_private *dev_priv; + u8 *buf; + int error, i, reg_offset, unit; + u32 val, loop; + u16 len; + + sc = device_get_softc(idev); + dev_priv = sc->drm_dev->dev_private; + unit = device_get_unit(idev); + + sx_xlock(&dev_priv->gmbus_sx); + if (sc->force_bit_dev) { + error = intel_iic_quirk_xfer(dev_priv->bbbus[unit], msgs, nmsgs); + goto out; + } + + reg_offset = HAS_PCH_SPLIT(dev_priv->dev) ? PCH_GMBUS0 - GMBUS0 : 0; + + I915_WRITE(GMBUS0 + reg_offset, sc->reg0); + + for (i = 0; i < nmsgs; i++) { + len = msgs[i].len; + buf = msgs[i].buf; + + if ((msgs[i].flags & IIC_M_RD) != 0) { + I915_WRITE(GMBUS1 + reg_offset, GMBUS_CYCLE_WAIT | + (i + 1 == nmsgs ? GMBUS_CYCLE_STOP : 0) | + (len << GMBUS_BYTE_COUNT_SHIFT) | + (msgs[i].slave << GMBUS_SLAVE_ADDR_SHIFT) | + GMBUS_SLAVE_READ | GMBUS_SW_RDY); + POSTING_READ(GMBUS2 + reg_offset); + do { + loop = 0; + + if (_intel_wait_for(sc->drm_dev, + (I915_READ(GMBUS2 + reg_offset) & + (GMBUS_SATOER | GMBUS_HW_RDY)) != 0, + 50, 1, "915gbr")) + goto timeout; + if ((I915_READ(GMBUS2 + reg_offset) & + GMBUS_SATOER) != 0) + goto clear_err; + + val = I915_READ(GMBUS3 + reg_offset); + do { + *buf++ = val & 0xff; + val >>= 8; + } while (--len != 0 && ++loop < 4); + } while (len != 0); + } else { + val = loop = 0; + do { + val |= *buf++ << (8 * loop); + } while (--len != 0 && ++loop < 4); + + I915_WRITE(GMBUS3 + reg_offset, val); + I915_WRITE(GMBUS1 + reg_offset, GMBUS_CYCLE_WAIT | + (i + 1 == nmsgs ? GMBUS_CYCLE_STOP : 0) | + (msgs[i].len << GMBUS_BYTE_COUNT_SHIFT) | + (msgs[i].slave << GMBUS_SLAVE_ADDR_SHIFT) | + GMBUS_SLAVE_WRITE | GMBUS_SW_RDY); + POSTING_READ(GMBUS2+reg_offset); + + while (len != 0) { + if (_intel_wait_for(sc->drm_dev, + (I915_READ(GMBUS2 + reg_offset) & + (GMBUS_SATOER | GMBUS_HW_RDY)) != 0, + 50, 1, "915gbw")) + goto timeout; + if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) + goto clear_err; + + val = loop = 0; + do { + val |= *buf++ << (8 * loop); + } while (--len != 0 && ++loop < 4); + + I915_WRITE(GMBUS3 + reg_offset, val); + POSTING_READ(GMBUS2 + reg_offset); + } + } + + if (i + 1 < nmsgs && _intel_wait_for(sc->drm_dev, + (I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | + GMBUS_HW_WAIT_PHASE)) != 0, + 50, 1, "915gbh")) + goto timeout; + if ((I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) != 0) + goto clear_err; + } + + error = 0; +done: + /* Mark the GMBUS interface as disabled after waiting for idle. + * We will re-enable it at the start of the next xfer, + * till then let it sleep. + */ + if (_intel_wait_for(dev, + (I915_READ(GMBUS2 + reg_offset) & GMBUS_ACTIVE) == 0, + 10, 1, "915gbu")) + DRM_INFO("GMBUS timed out waiting for idle\n"); + I915_WRITE(GMBUS0 + reg_offset, 0); +out: + sx_xunlock(&dev_priv->gmbus_sx); + return (error); + +clear_err: + /* Toggle the Software Clear Interrupt bit. This has the effect + * of resetting the GMBUS controller and so clearing the + * BUS_ERROR raised by the slave's NAK. + */ + I915_WRITE(GMBUS1 + reg_offset, GMBUS_SW_CLR_INT); + I915_WRITE(GMBUS1 + reg_offset, 0); + error = EIO; + goto done; + +timeout: + DRM_INFO("GMBUS timed out, falling back to bit banging on pin %d [%s]\n", + sc->reg0 & 0xff, sc->name); + I915_WRITE(GMBUS0 + reg_offset, 0); + + /* + * Hardware may not support GMBUS over these pins? + * Try GPIO bitbanging instead. + */ + sc->force_bit_dev = true; + + error = intel_iic_quirk_xfer(dev_priv->bbbus[unit], msgs, nmsgs); + goto out; +} + +void +intel_gmbus_set_speed(device_t idev, int speed) +{ + struct intel_iic_softc *sc; + + sc = device_get_softc(device_get_parent(idev)); + + sc->reg0 = (sc->reg0 & ~(0x3 << 8)) | speed; +} + +void +intel_gmbus_force_bit(device_t idev, bool force_bit) +{ + struct intel_iic_softc *sc; + + sc = device_get_softc(device_get_parent(idev)); + sc->force_bit_dev = force_bit; +} + +static int +intel_iic_quirk_xfer(device_t idev, struct iic_msg *msgs, int nmsgs) +{ + device_t bridge_dev; + struct intel_iic_softc *sc; + struct drm_i915_private *dev_priv; + int ret; + int i; + + bridge_dev = device_get_parent(device_get_parent(idev)); + sc = device_get_softc(bridge_dev); + dev_priv = sc->drm_dev->dev_private; + + intel_iic_reset(sc->drm_dev); + intel_iic_quirk_set(dev_priv, true); + IICBB_SETSDA(bridge_dev, 1); + IICBB_SETSCL(bridge_dev, 1); + DELAY(I2C_RISEFALL_TIME); + + /* convert slave addresses to format expected by iicbb */ + for (i = 0; i < nmsgs; i++) { + msgs[i].slave <<= 1; + /* force use of repeated start instead of default stop+start */ + if (i != (nmsgs - 1)) + msgs[i].flags |= IIC_M_NOSTOP; + } + ret = iicbus_transfer(idev, msgs, nmsgs); + /* restore the addresses */ + for (i = 0; i < nmsgs; i++) + msgs[i].slave >>= 1; + IICBB_SETSDA(bridge_dev, 1); + IICBB_SETSCL(bridge_dev, 1); + intel_iic_quirk_set(dev_priv, false); + + return (ret); +} + +static const char *gpio_names[GMBUS_NUM_PORTS] = { + "disabled", + "ssc", + "vga", + "panel", + "dpc", + "dpb", + "reserved", + "dpd", +}; + +static int +intel_gmbus_probe(device_t dev) +{ + + return (BUS_PROBE_SPECIFIC); +} + +static int +intel_gmbus_attach(device_t idev) +{ + struct drm_i915_private *dev_priv; + struct intel_iic_softc *sc; + int pin; + + sc = device_get_softc(idev); + sc->drm_dev = device_get_softc(device_get_parent(idev)); + dev_priv = sc->drm_dev->dev_private; + pin = device_get_unit(idev); + + snprintf(sc->name, sizeof(sc->name), "gmbus bus %s", gpio_names[pin]); + device_set_desc(idev, sc->name); + + /* By default use a conservative clock rate */ + sc->reg0 = pin | GMBUS_RATE_100KHZ; + + /* XXX force bit banging until GMBUS is fully debugged */ + if (IS_GEN2(sc->drm_dev)) { + sc->force_bit_dev = true; + } + + /* add bus interface device */ + sc->iic_dev = device_add_child(idev, "iicbus", -1); + if (sc->iic_dev == NULL) + return (ENXIO); + device_quiet(sc->iic_dev); + bus_generic_attach(idev); + + return (0); +} + +static int +intel_gmbus_detach(device_t idev) +{ + struct intel_iic_softc *sc; + struct drm_i915_private *dev_priv; + device_t child; + int u; + + sc = device_get_softc(idev); + u = device_get_unit(idev); + dev_priv = sc->drm_dev->dev_private; + + child = sc->iic_dev; + bus_generic_detach(idev); + if (child != NULL) + device_delete_child(idev, child); + + return (0); +} + +static int +intel_iicbb_probe(device_t dev) +{ + + return (BUS_PROBE_DEFAULT); +} + +static int +intel_iicbb_attach(device_t idev) +{ + static const int map_pin_to_reg[] = { + 0, + GPIOB, + GPIOA, + GPIOC, + GPIOD, + GPIOE, + 0, + GPIOF + }; + + struct intel_iic_softc *sc; + struct drm_i915_private *dev_priv; + int pin; + + sc = device_get_softc(idev); + sc->drm_dev = device_get_softc(device_get_parent(idev)); + dev_priv = sc->drm_dev->dev_private; + pin = device_get_unit(idev); + + snprintf(sc->name, sizeof(sc->name), "i915 iicbb %s", gpio_names[pin]); + device_set_desc(idev, sc->name); + + sc->reg0 = pin | GMBUS_RATE_100KHZ; + sc->reg = map_pin_to_reg[pin]; + if (HAS_PCH_SPLIT(dev_priv->dev)) + sc->reg += PCH_GPIOA - GPIOA; + + /* add generic bit-banging code */ + sc->iic_dev = device_add_child(idev, "iicbb", -1); + if (sc->iic_dev == NULL) + return (ENXIO); + device_quiet(sc->iic_dev); + bus_generic_attach(idev); + + return (0); +} + +static int +intel_iicbb_detach(device_t idev) +{ + struct intel_iic_softc *sc; + device_t child; + + sc = device_get_softc(idev); + child = sc->iic_dev; + bus_generic_detach(idev); + if (child) + device_delete_child(idev, child); + return (0); +} + +static device_method_t intel_gmbus_methods[] = { + DEVMETHOD(device_probe, intel_gmbus_probe), + DEVMETHOD(device_attach, intel_gmbus_attach), + DEVMETHOD(device_detach, intel_gmbus_detach), + DEVMETHOD(iicbus_reset, intel_iicbus_reset), + DEVMETHOD(iicbus_transfer, intel_gmbus_transfer), + DEVMETHOD_END +}; +static driver_t intel_gmbus_driver = { + "intel_gmbus", + intel_gmbus_methods, + sizeof(struct intel_iic_softc) +}; +static devclass_t intel_gmbus_devclass; +DRIVER_MODULE_ORDERED(intel_gmbus, drmn, intel_gmbus_driver, + intel_gmbus_devclass, 0, 0, SI_ORDER_FIRST); +DRIVER_MODULE(iicbus, intel_gmbus, iicbus_driver, iicbus_devclass, 0, 0); + +static device_method_t intel_iicbb_methods[] = { + DEVMETHOD(device_probe, intel_iicbb_probe), + DEVMETHOD(device_attach, intel_iicbb_attach), + DEVMETHOD(device_detach, intel_iicbb_detach), + + DEVMETHOD(bus_add_child, bus_generic_add_child), + DEVMETHOD(bus_print_child, bus_generic_print_child), + + DEVMETHOD(iicbb_callback, iicbus_null_callback), + DEVMETHOD(iicbb_reset, intel_iicbus_reset), + DEVMETHOD(iicbb_setsda, intel_iicbb_setsda), + DEVMETHOD(iicbb_setscl, intel_iicbb_setscl), + DEVMETHOD(iicbb_getsda, intel_iicbb_getsda), + DEVMETHOD(iicbb_getscl, intel_iicbb_getscl), + DEVMETHOD_END +}; +static driver_t intel_iicbb_driver = { + "intel_iicbb", + intel_iicbb_methods, + sizeof(struct intel_iic_softc) +}; +static devclass_t intel_iicbb_devclass; +DRIVER_MODULE_ORDERED(intel_iicbb, drmn, intel_iicbb_driver, + intel_iicbb_devclass, 0, 0, SI_ORDER_FIRST); +DRIVER_MODULE(iicbb, intel_iicbb, iicbb_driver, iicbb_devclass, 0, 0); + +int +intel_setup_gmbus(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv; + device_t iic_dev; + int i, ret; + + dev_priv = dev->dev_private; + sx_init(&dev_priv->gmbus_sx, "gmbus"); + dev_priv->gmbus_bridge = malloc(sizeof(device_t) * GMBUS_NUM_PORTS, + DRM_MEM_DRIVER, M_WAITOK | M_ZERO); + dev_priv->bbbus_bridge = malloc(sizeof(device_t) * GMBUS_NUM_PORTS, + DRM_MEM_DRIVER, M_WAITOK | M_ZERO); + dev_priv->gmbus = malloc(sizeof(device_t) * GMBUS_NUM_PORTS, + DRM_MEM_DRIVER, M_WAITOK | M_ZERO); + dev_priv->bbbus = malloc(sizeof(device_t) * GMBUS_NUM_PORTS, + DRM_MEM_DRIVER, M_WAITOK | M_ZERO); + + /* + * The Giant there is recursed, most likely. Normally, the + * intel_setup_gmbus() is called from the attach method of the + * driver. + */ + mtx_lock(&Giant); + for (i = 0; i < GMBUS_NUM_PORTS; i++) { + /* + * Initialized bbbus_bridge before gmbus_bridge, since + * gmbus may decide to force quirk transfer in the + * attachment code. + */ + dev_priv->bbbus_bridge[i] = device_add_child(dev->device, + "intel_iicbb", i); + if (dev_priv->bbbus_bridge[i] == NULL) { + DRM_ERROR("bbbus bridge %d creation failed\n", i); + ret = ENXIO; + goto err; + } + device_quiet(dev_priv->bbbus_bridge[i]); + ret = device_probe_and_attach(dev_priv->bbbus_bridge[i]); + if (ret != 0) { + DRM_ERROR("bbbus bridge %d attach failed, %d\n", i, + ret); + goto err; + } + + iic_dev = device_find_child(dev_priv->bbbus_bridge[i], "iicbb", + -1); + if (iic_dev == NULL) { + DRM_ERROR("bbbus bridge doesn't have iicbb child\n"); + goto err; + } + iic_dev = device_find_child(iic_dev, "iicbus", -1); + if (iic_dev == NULL) { + DRM_ERROR( + "bbbus bridge doesn't have iicbus grandchild\n"); + goto err; + } + + dev_priv->bbbus[i] = iic_dev; + + dev_priv->gmbus_bridge[i] = device_add_child(dev->device, + "intel_gmbus", i); + if (dev_priv->gmbus_bridge[i] == NULL) { + DRM_ERROR("gmbus bridge %d creation failed\n", i); + ret = ENXIO; + goto err; + } + device_quiet(dev_priv->gmbus_bridge[i]); + ret = device_probe_and_attach(dev_priv->gmbus_bridge[i]); + if (ret != 0) { + DRM_ERROR("gmbus bridge %d attach failed, %d\n", i, + ret); + ret = ENXIO; + goto err; + } + + iic_dev = device_find_child(dev_priv->gmbus_bridge[i], + "iicbus", -1); + if (iic_dev == NULL) { + DRM_ERROR("gmbus bridge doesn't have iicbus child\n"); + goto err; + } + dev_priv->gmbus[i] = iic_dev; + + intel_iic_reset(dev); + } + + mtx_unlock(&Giant); + return (0); + +err: + intel_teardown_gmbus_m(dev, i); + mtx_unlock(&Giant); + return (ret); +} + +static void +intel_teardown_gmbus_m(struct drm_device *dev, int m) +{ + struct drm_i915_private *dev_priv; + + dev_priv = dev->dev_private; + + free(dev_priv->gmbus, DRM_MEM_DRIVER); + dev_priv->gmbus = NULL; + free(dev_priv->bbbus, DRM_MEM_DRIVER); + dev_priv->bbbus = NULL; + free(dev_priv->gmbus_bridge, DRM_MEM_DRIVER); + dev_priv->gmbus_bridge = NULL; + free(dev_priv->bbbus_bridge, DRM_MEM_DRIVER); + dev_priv->bbbus_bridge = NULL; + sx_destroy(&dev_priv->gmbus_sx); +} + +void +intel_teardown_gmbus(struct drm_device *dev) +{ + + mtx_lock(&Giant); + intel_teardown_gmbus_m(dev, GMBUS_NUM_PORTS); + mtx_unlock(&Giant); +} diff --git a/sys/dev/drm2/i915/intel_lvds.c b/sys/dev/drm2/i915/intel_lvds.c new file mode 100644 index 00000000000..4e29b91d6a0 --- /dev/null +++ b/sys/dev/drm2/i915/intel_lvds.c @@ -0,0 +1,1125 @@ +/* + * Copyright © 2006-2007 Intel Corporation + * Copyright (c) 2006 Dave Airlie + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * Dave Airlie + * Jesse Barnes + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +/* Private structure for the integrated LVDS support */ +struct intel_lvds { + struct intel_encoder base; + + struct edid *edid; + + int fitting_mode; + u32 pfit_control; + u32 pfit_pgm_ratios; + bool pfit_dirty; + + struct drm_display_mode *fixed_mode; +}; + +static struct intel_lvds *to_intel_lvds(struct drm_encoder *encoder) +{ + return container_of(encoder, struct intel_lvds, base.base); +} + +static struct intel_lvds *intel_attached_lvds(struct drm_connector *connector) +{ + return container_of(intel_attached_encoder(connector), + struct intel_lvds, base); +} + +/** + * Sets the power state for the panel. + */ +static void intel_lvds_enable(struct intel_lvds *intel_lvds) +{ + struct drm_device *dev = intel_lvds->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 ctl_reg, lvds_reg, stat_reg; + + if (HAS_PCH_SPLIT(dev)) { + ctl_reg = PCH_PP_CONTROL; + lvds_reg = PCH_LVDS; + stat_reg = PCH_PP_STATUS; + } else { + ctl_reg = PP_CONTROL; + lvds_reg = LVDS; + stat_reg = PP_STATUS; + } + + I915_WRITE(lvds_reg, I915_READ(lvds_reg) | LVDS_PORT_EN); + + if (intel_lvds->pfit_dirty) { + /* + * Enable automatic panel scaling so that non-native modes + * fill the screen. The panel fitter should only be + * adjusted whilst the pipe is disabled, according to + * register description and PRM. + */ + DRM_DEBUG_KMS("applying panel-fitter: %x, %x\n", + intel_lvds->pfit_control, + intel_lvds->pfit_pgm_ratios); + + I915_WRITE(PFIT_PGM_RATIOS, intel_lvds->pfit_pgm_ratios); + I915_WRITE(PFIT_CONTROL, intel_lvds->pfit_control); + intel_lvds->pfit_dirty = false; + } + + I915_WRITE(ctl_reg, I915_READ(ctl_reg) | POWER_TARGET_ON); + POSTING_READ(lvds_reg); + if (_intel_wait_for(dev, + (I915_READ(stat_reg) & PP_ON) == 0, 1000, + 1, "915lvds")) + DRM_ERROR("timed out waiting for panel to power off\n"); + + intel_panel_enable_backlight(dev); +} + +static void intel_lvds_disable(struct intel_lvds *intel_lvds) +{ + struct drm_device *dev = intel_lvds->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 ctl_reg, lvds_reg, stat_reg; + + if (HAS_PCH_SPLIT(dev)) { + ctl_reg = PCH_PP_CONTROL; + lvds_reg = PCH_LVDS; + stat_reg = PCH_PP_STATUS; + } else { + ctl_reg = PP_CONTROL; + lvds_reg = LVDS; + stat_reg = PP_STATUS; + } + + intel_panel_disable_backlight(dev); + + I915_WRITE(ctl_reg, I915_READ(ctl_reg) & ~POWER_TARGET_ON); + if (_intel_wait_for(dev, + (I915_READ(stat_reg) & PP_ON) == 0, 1000, + 1, "915lvo")) + DRM_ERROR("timed out waiting for panel to power off\n"); + + if (intel_lvds->pfit_control) { + I915_WRITE(PFIT_CONTROL, 0); + intel_lvds->pfit_dirty = true; + } + + I915_WRITE(lvds_reg, I915_READ(lvds_reg) & ~LVDS_PORT_EN); + POSTING_READ(lvds_reg); +} + +static void intel_lvds_dpms(struct drm_encoder *encoder, int mode) +{ + struct intel_lvds *intel_lvds = to_intel_lvds(encoder); + + if (mode == DRM_MODE_DPMS_ON) + intel_lvds_enable(intel_lvds); + else + intel_lvds_disable(intel_lvds); + + /* XXX: We never power down the LVDS pairs. */ +} + +static int intel_lvds_mode_valid(struct drm_connector *connector, + struct drm_display_mode *mode) +{ + struct intel_lvds *intel_lvds = intel_attached_lvds(connector); + struct drm_display_mode *fixed_mode = intel_lvds->fixed_mode; + + if (mode->hdisplay > fixed_mode->hdisplay) + return MODE_PANEL; + if (mode->vdisplay > fixed_mode->vdisplay) + return MODE_PANEL; + + return MODE_OK; +} + +static void +centre_horizontally(struct drm_display_mode *mode, + int width) +{ + u32 border, sync_pos, blank_width, sync_width; + + /* keep the hsync and hblank widths constant */ + sync_width = mode->crtc_hsync_end - mode->crtc_hsync_start; + blank_width = mode->crtc_hblank_end - mode->crtc_hblank_start; + sync_pos = (blank_width - sync_width + 1) / 2; + + border = (mode->hdisplay - width + 1) / 2; + border += border & 1; /* make the border even */ + + mode->crtc_hdisplay = width; + mode->crtc_hblank_start = width + border; + mode->crtc_hblank_end = mode->crtc_hblank_start + blank_width; + + mode->crtc_hsync_start = mode->crtc_hblank_start + sync_pos; + mode->crtc_hsync_end = mode->crtc_hsync_start + sync_width; + + mode->private_flags |= INTEL_MODE_CRTC_TIMINGS_SET; +} + +static void +centre_vertically(struct drm_display_mode *mode, + int height) +{ + u32 border, sync_pos, blank_width, sync_width; + + /* keep the vsync and vblank widths constant */ + sync_width = mode->crtc_vsync_end - mode->crtc_vsync_start; + blank_width = mode->crtc_vblank_end - mode->crtc_vblank_start; + sync_pos = (blank_width - sync_width + 1) / 2; + + border = (mode->vdisplay - height + 1) / 2; + + mode->crtc_vdisplay = height; + mode->crtc_vblank_start = height + border; + mode->crtc_vblank_end = mode->crtc_vblank_start + blank_width; + + mode->crtc_vsync_start = mode->crtc_vblank_start + sync_pos; + mode->crtc_vsync_end = mode->crtc_vsync_start + sync_width; + + mode->private_flags |= INTEL_MODE_CRTC_TIMINGS_SET; +} + +static inline u32 panel_fitter_scaling(u32 source, u32 target) +{ + /* + * Floating point operation is not supported. So the FACTOR + * is defined, which can avoid the floating point computation + * when calculating the panel ratio. + */ +#define ACCURACY 12 +#define FACTOR (1 << ACCURACY) + u32 ratio = source * FACTOR / target; + return (FACTOR * ratio + FACTOR/2) / FACTOR; +} + +static bool intel_lvds_mode_fixup(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); + struct intel_lvds *intel_lvds = to_intel_lvds(encoder); + struct drm_encoder *tmp_encoder; + u32 pfit_control = 0, pfit_pgm_ratios = 0, border = 0; + int pipe; + + /* Should never happen!! */ + if (INTEL_INFO(dev)->gen < 4 && intel_crtc->pipe == 0) { + DRM_ERROR("Can't support LVDS on pipe A\n"); + return false; + } + + /* Should never happen!! */ + list_for_each_entry(tmp_encoder, &dev->mode_config.encoder_list, head) { + if (tmp_encoder != encoder && tmp_encoder->crtc == encoder->crtc) { + DRM_ERROR("Can't enable LVDS and another " + "encoder on the same pipe\n"); + return false; + } + } + + /* + * We have timings from the BIOS for the panel, put them in + * to the adjusted mode. The CRTC will be set up for this mode, + * with the panel scaling set up to source from the H/VDisplay + * of the original mode. + */ + intel_fixed_panel_mode(intel_lvds->fixed_mode, adjusted_mode); + + if (HAS_PCH_SPLIT(dev)) { + intel_pch_panel_fitting(dev, intel_lvds->fitting_mode, + mode, adjusted_mode); + return true; + } + + /* Native modes don't need fitting */ + if (adjusted_mode->hdisplay == mode->hdisplay && + adjusted_mode->vdisplay == mode->vdisplay) + goto out; + + /* 965+ wants fuzzy fitting */ + if (INTEL_INFO(dev)->gen >= 4) + pfit_control |= ((intel_crtc->pipe << PFIT_PIPE_SHIFT) | + PFIT_FILTER_FUZZY); + + /* + * Enable automatic panel scaling for non-native modes so that they fill + * the screen. Should be enabled before the pipe is enabled, according + * to register description and PRM. + * Change the value here to see the borders for debugging + */ + for_each_pipe(pipe) + I915_WRITE(BCLRPAT(pipe), 0); + + drm_mode_set_crtcinfo(adjusted_mode, 0); + + switch (intel_lvds->fitting_mode) { + case DRM_MODE_SCALE_CENTER: + /* + * For centered modes, we have to calculate border widths & + * heights and modify the values programmed into the CRTC. + */ + centre_horizontally(adjusted_mode, mode->hdisplay); + centre_vertically(adjusted_mode, mode->vdisplay); + border = LVDS_BORDER_ENABLE; + break; + + case DRM_MODE_SCALE_ASPECT: + /* Scale but preserve the aspect ratio */ + if (INTEL_INFO(dev)->gen >= 4) { + u32 scaled_width = adjusted_mode->hdisplay * mode->vdisplay; + u32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay; + + /* 965+ is easy, it does everything in hw */ + if (scaled_width > scaled_height) + pfit_control |= PFIT_ENABLE | PFIT_SCALING_PILLAR; + else if (scaled_width < scaled_height) + pfit_control |= PFIT_ENABLE | PFIT_SCALING_LETTER; + else if (adjusted_mode->hdisplay != mode->hdisplay) + pfit_control |= PFIT_ENABLE | PFIT_SCALING_AUTO; + } else { + u32 scaled_width = adjusted_mode->hdisplay * mode->vdisplay; + u32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay; + /* + * For earlier chips we have to calculate the scaling + * ratio by hand and program it into the + * PFIT_PGM_RATIO register + */ + if (scaled_width > scaled_height) { /* pillar */ + centre_horizontally(adjusted_mode, scaled_height / mode->vdisplay); + + border = LVDS_BORDER_ENABLE; + if (mode->vdisplay != adjusted_mode->vdisplay) { + u32 bits = panel_fitter_scaling(mode->vdisplay, adjusted_mode->vdisplay); + pfit_pgm_ratios |= (bits << PFIT_HORIZ_SCALE_SHIFT | + bits << PFIT_VERT_SCALE_SHIFT); + pfit_control |= (PFIT_ENABLE | + VERT_INTERP_BILINEAR | + HORIZ_INTERP_BILINEAR); + } + } else if (scaled_width < scaled_height) { /* letter */ + centre_vertically(adjusted_mode, scaled_width / mode->hdisplay); + + border = LVDS_BORDER_ENABLE; + if (mode->hdisplay != adjusted_mode->hdisplay) { + u32 bits = panel_fitter_scaling(mode->hdisplay, adjusted_mode->hdisplay); + pfit_pgm_ratios |= (bits << PFIT_HORIZ_SCALE_SHIFT | + bits << PFIT_VERT_SCALE_SHIFT); + pfit_control |= (PFIT_ENABLE | + VERT_INTERP_BILINEAR | + HORIZ_INTERP_BILINEAR); + } + } else + /* Aspects match, Let hw scale both directions */ + pfit_control |= (PFIT_ENABLE | + VERT_AUTO_SCALE | HORIZ_AUTO_SCALE | + VERT_INTERP_BILINEAR | + HORIZ_INTERP_BILINEAR); + } + break; + + case DRM_MODE_SCALE_FULLSCREEN: + /* + * Full scaling, even if it changes the aspect ratio. + * Fortunately this is all done for us in hw. + */ + if (mode->vdisplay != adjusted_mode->vdisplay || + mode->hdisplay != adjusted_mode->hdisplay) { + pfit_control |= PFIT_ENABLE; + if (INTEL_INFO(dev)->gen >= 4) + pfit_control |= PFIT_SCALING_AUTO; + else + pfit_control |= (VERT_AUTO_SCALE | + VERT_INTERP_BILINEAR | + HORIZ_AUTO_SCALE | + HORIZ_INTERP_BILINEAR); + } + break; + + default: + break; + } + +out: + /* If not enabling scaling, be consistent and always use 0. */ + if ((pfit_control & PFIT_ENABLE) == 0) { + pfit_control = 0; + pfit_pgm_ratios = 0; + } + + /* Make sure pre-965 set dither correctly */ + if (INTEL_INFO(dev)->gen < 4 && dev_priv->lvds_dither) + pfit_control |= PANEL_8TO6_DITHER_ENABLE; + + if (pfit_control != intel_lvds->pfit_control || + pfit_pgm_ratios != intel_lvds->pfit_pgm_ratios) { + intel_lvds->pfit_control = pfit_control; + intel_lvds->pfit_pgm_ratios = pfit_pgm_ratios; + intel_lvds->pfit_dirty = true; + } + dev_priv->lvds_border_bits = border; + + /* + * XXX: It would be nice to support lower refresh rates on the + * panels to reduce power consumption, and perhaps match the + * user's requested refresh rate. + */ + + return true; +} + +static void intel_lvds_prepare(struct drm_encoder *encoder) +{ + struct intel_lvds *intel_lvds = to_intel_lvds(encoder); + + /* + * Prior to Ironlake, we must disable the pipe if we want to adjust + * the panel fitter. However at all other times we can just reset + * the registers regardless. + */ + if (!HAS_PCH_SPLIT(encoder->dev) && intel_lvds->pfit_dirty) + intel_lvds_disable(intel_lvds); +} + +static void intel_lvds_commit(struct drm_encoder *encoder) +{ + struct intel_lvds *intel_lvds = to_intel_lvds(encoder); + + /* Always do a full power on as we do not know what state + * we were left in. + */ + intel_lvds_enable(intel_lvds); +} + +static void intel_lvds_mode_set(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + /* + * The LVDS pin pair will already have been turned on in the + * intel_crtc_mode_set since it has a large impact on the DPLL + * settings. + */ +} + +/** + * Detect the LVDS connection. + * + * Since LVDS doesn't have hotlug, we use the lid as a proxy. Open means + * connected and closed means disconnected. We also send hotplug events as + * needed, using lid status notification from the input layer. + */ +static enum drm_connector_status +intel_lvds_detect(struct drm_connector *connector, bool force) +{ + struct drm_device *dev = connector->dev; + enum drm_connector_status status; + + status = intel_panel_detect(dev); + if (status != connector_status_unknown) + return status; + + return connector_status_connected; +} + +/** + * Return the list of DDC modes if available, or the BIOS fixed mode otherwise. + */ +static int intel_lvds_get_modes(struct drm_connector *connector) +{ + struct intel_lvds *intel_lvds = intel_attached_lvds(connector); + struct drm_device *dev = connector->dev; + struct drm_display_mode *mode; + + if (intel_lvds->edid) + return drm_add_edid_modes(connector, intel_lvds->edid); + + mode = drm_mode_duplicate(dev, intel_lvds->fixed_mode); + if (mode == NULL) + return 0; + + drm_mode_probed_add(connector, mode); + return 1; +} + +static int intel_no_modeset_on_lid_dmi_callback(const struct dmi_system_id *id) +{ + DRM_DEBUG_KMS("Skipping forced modeset for %s\n", id->ident); + return 1; +} + +/* The GPU hangs up on these systems if modeset is performed on LID open */ +static const struct dmi_system_id intel_no_modeset_on_lid[] = { + { + .callback = intel_no_modeset_on_lid_dmi_callback, + .ident = "Toshiba Tecra A11", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "TECRA A11"), + }, + }, + + { } /* terminating entry */ +}; + +#ifdef NOTYET +/* + * Lid events. Note the use of 'modeset_on_lid': + * - we set it on lid close, and reset it on open + * - we use it as a "only once" bit (ie we ignore + * duplicate events where it was already properly + * set/reset) + * - the suspend/resume paths will also set it to + * zero, since they restore the mode ("lid open"). + */ +static int intel_lid_notify(struct notifier_block *nb, unsigned long val, + void *unused) +{ + struct drm_i915_private *dev_priv = + container_of(nb, struct drm_i915_private, lid_notifier); + struct drm_device *dev = dev_priv->dev; + struct drm_connector *connector = dev_priv->int_lvds_connector; + + if (dev->switch_power_state != DRM_SWITCH_POWER_ON) + return NOTIFY_OK; + + /* + * check and update the status of LVDS connector after receiving + * the LID nofication event. + */ + if (connector) + connector->status = connector->funcs->detect(connector, + false); + + /* Don't force modeset on machines where it causes a GPU lockup */ + if (dmi_check_system(intel_no_modeset_on_lid)) + return NOTIFY_OK; + if (!acpi_lid_open()) { + dev_priv->modeset_on_lid = 1; + return NOTIFY_OK; + } + + if (!dev_priv->modeset_on_lid) + return NOTIFY_OK; + + dev_priv->modeset_on_lid = 0; + + mutex_lock(&dev->mode_config.mutex); + drm_helper_resume_force_mode(dev); + mutex_unlock(&dev->mode_config.mutex); + + return NOTIFY_OK; +} +#endif + +/** + * intel_lvds_destroy - unregister and free LVDS structures + * @connector: connector to free + * + * Unregister the DDC bus for this connector then free the driver private + * structure. + */ +static void intel_lvds_destroy(struct drm_connector *connector) +{ + struct drm_device *dev = connector->dev; +#if 0 + struct drm_i915_private *dev_priv = dev->dev_private; +#endif + + intel_panel_destroy_backlight(dev); + +#if 0 + if (dev_priv->lid_notifier.notifier_call) + acpi_lid_notifier_unregister(&dev_priv->lid_notifier); +#endif +#if 0 + drm_sysfs_connector_remove(connector); +#endif + drm_connector_cleanup(connector); + free(connector, DRM_MEM_KMS); +} + +static int intel_lvds_set_property(struct drm_connector *connector, + struct drm_property *property, + uint64_t value) +{ + struct intel_lvds *intel_lvds = intel_attached_lvds(connector); + struct drm_device *dev = connector->dev; + + if (property == dev->mode_config.scaling_mode_property) { + struct drm_crtc *crtc = intel_lvds->base.base.crtc; + + if (value == DRM_MODE_SCALE_NONE) { + DRM_DEBUG_KMS("no scaling not supported\n"); + return -EINVAL; + } + + if (intel_lvds->fitting_mode == value) { + /* the LVDS scaling property is not changed */ + return 0; + } + intel_lvds->fitting_mode = value; + if (crtc && crtc->enabled) { + /* + * If the CRTC is enabled, the display will be changed + * according to the new panel fitting mode. + */ + drm_crtc_helper_set_mode(crtc, &crtc->mode, + crtc->x, crtc->y, crtc->fb); + } + } + + return 0; +} + +static const struct drm_encoder_helper_funcs intel_lvds_helper_funcs = { + .dpms = intel_lvds_dpms, + .mode_fixup = intel_lvds_mode_fixup, + .prepare = intel_lvds_prepare, + .mode_set = intel_lvds_mode_set, + .commit = intel_lvds_commit, +}; + +static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs = { + .get_modes = intel_lvds_get_modes, + .mode_valid = intel_lvds_mode_valid, + .best_encoder = intel_best_encoder, +}; + +static const struct drm_connector_funcs intel_lvds_connector_funcs = { + .dpms = drm_helper_connector_dpms, + .detect = intel_lvds_detect, + .fill_modes = drm_helper_probe_single_connector_modes, + .set_property = intel_lvds_set_property, + .destroy = intel_lvds_destroy, +}; + +static const struct drm_encoder_funcs intel_lvds_enc_funcs = { + .destroy = intel_encoder_destroy, +}; + +static int intel_no_lvds_dmi_callback(const struct dmi_system_id *id) +{ + DRM_DEBUG_KMS("Skipping LVDS initialization for %s\n", id->ident); + return 1; +} + +/* These systems claim to have LVDS, but really don't */ +static const struct dmi_system_id intel_no_lvds[] = { + { + .callback = intel_no_lvds_dmi_callback, + .ident = "Apple Mac Mini (Core series)", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Apple"), + DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "Apple Mac Mini (Core 2 series)", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Apple"), + DMI_MATCH(DMI_PRODUCT_NAME, "Macmini2,1"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "MSI IM-945GSE-A", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "MSI"), + DMI_MATCH(DMI_PRODUCT_NAME, "A9830IMS"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "Dell Studio Hybrid", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Studio Hybrid 140g"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "Dell OptiPlex FX170", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex FX170"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "AOpen Mini PC", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "AOpen"), + DMI_MATCH(DMI_PRODUCT_NAME, "i965GMx-IF"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "AOpen Mini PC MP915", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"), + DMI_MATCH(DMI_BOARD_NAME, "i915GMx-F"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "AOpen i915GMm-HFS", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"), + DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "AOpen i45GMx-I", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"), + DMI_MATCH(DMI_BOARD_NAME, "i45GMx-I"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "Aopen i945GTt-VFA", + .matches = { + DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "Clientron U800", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Clientron"), + DMI_MATCH(DMI_PRODUCT_NAME, "U800"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "Clientron E830", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Clientron"), + DMI_MATCH(DMI_PRODUCT_NAME, "E830"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "Asus EeeBox PC EB1007", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_PRODUCT_NAME, "EB1007"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "Asus AT5NM10T-I", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "AT5NM10T-I"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "Hewlett-Packard t5745", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "hp t5745"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "Hewlett-Packard st5747", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "hp st5747"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "MSI Wind Box DC500", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), + DMI_MATCH(DMI_BOARD_NAME, "MS-7469"), + }, + }, + + { } /* terminating entry */ +}; + +/** + * intel_find_lvds_downclock - find the reduced downclock for LVDS in EDID + * @dev: drm device + * @connector: LVDS connector + * + * Find the reduced downclock for LVDS in EDID. + */ +static void intel_find_lvds_downclock(struct drm_device *dev, + struct drm_display_mode *fixed_mode, + struct drm_connector *connector) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_display_mode *scan; + int temp_downclock; + + temp_downclock = fixed_mode->clock; + list_for_each_entry(scan, &connector->probed_modes, head) { + /* + * If one mode has the same resolution with the fixed_panel + * mode while they have the different refresh rate, it means + * that the reduced downclock is found for the LVDS. In such + * case we can set the different FPx0/1 to dynamically select + * between low and high frequency. + */ + if (scan->hdisplay == fixed_mode->hdisplay && + scan->hsync_start == fixed_mode->hsync_start && + scan->hsync_end == fixed_mode->hsync_end && + scan->htotal == fixed_mode->htotal && + scan->vdisplay == fixed_mode->vdisplay && + scan->vsync_start == fixed_mode->vsync_start && + scan->vsync_end == fixed_mode->vsync_end && + scan->vtotal == fixed_mode->vtotal) { + if (scan->clock < temp_downclock) { + /* + * The downclock is already found. But we + * expect to find the lower downclock. + */ + temp_downclock = scan->clock; + } + } + } + if (temp_downclock < fixed_mode->clock && i915_lvds_downclock) { + /* We found the downclock for LVDS. */ + dev_priv->lvds_downclock_avail = 1; + dev_priv->lvds_downclock = temp_downclock; + DRM_DEBUG_KMS("LVDS downclock is found in EDID. " + "Normal clock %dKhz, downclock %dKhz\n", + fixed_mode->clock, temp_downclock); + } +} + +/* + * Enumerate the child dev array parsed from VBT to check whether + * the LVDS is present. + * If it is present, return 1. + * If it is not present, return false. + * If no child dev is parsed from VBT, it assumes that the LVDS is present. + */ +static bool lvds_is_present_in_vbt(struct drm_device *dev, + u8 *i2c_pin) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int i; + + if (!dev_priv->child_dev_num) + return true; + + for (i = 0; i < dev_priv->child_dev_num; i++) { + struct child_device_config *child = dev_priv->child_dev + i; + + /* If the device type is not LFP, continue. + * We have to check both the new identifiers as well as the + * old for compatibility with some BIOSes. + */ + if (child->device_type != DEVICE_TYPE_INT_LFP && + child->device_type != DEVICE_TYPE_LFP) + continue; + + if (child->i2c_pin) + *i2c_pin = child->i2c_pin; + + /* However, we cannot trust the BIOS writers to populate + * the VBT correctly. Since LVDS requires additional + * information from AIM blocks, a non-zero addin offset is + * a good indicator that the LVDS is actually present. + */ + if (child->addin_offset) + return true; + + /* But even then some BIOS writers perform some black magic + * and instantiate the device without reference to any + * additional data. Trust that if the VBT was written into + * the OpRegion then they have validated the LVDS's existence. + */ + if (dev_priv->opregion.vbt) + return true; + } + + return false; +} + +static bool intel_lvds_supported(struct drm_device *dev) +{ + /* With the introduction of the PCH we gained a dedicated + * LVDS presence pin, use it. */ + if (HAS_PCH_SPLIT(dev)) + return true; + + /* Otherwise LVDS was only attached to mobile products, + * except for the inglorious 830gm */ + return IS_MOBILE(dev) && !IS_I830(dev); +} + +/** + * intel_lvds_init - setup LVDS connectors on this device + * @dev: drm device + * + * Create the connector, register the LVDS DDC bus, and try to figure out what + * modes we can display on the LVDS panel (if present). + */ +bool intel_lvds_init(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_lvds *intel_lvds; + struct intel_encoder *intel_encoder; + struct intel_connector *intel_connector; + struct drm_connector *connector; + struct drm_encoder *encoder; + struct drm_display_mode *scan; /* *modes, *bios_mode; */ + struct drm_crtc *crtc; + u32 lvds; + int pipe; + u8 pin; + + if (!intel_lvds_supported(dev)) + return false; + + /* Skip init on machines we know falsely report LVDS */ + if (dmi_check_system(intel_no_lvds)) + return false; + + pin = GMBUS_PORT_PANEL; + if (!lvds_is_present_in_vbt(dev, &pin)) { + DRM_DEBUG_KMS("LVDS is not present in VBT\n"); + return false; + } + + if (HAS_PCH_SPLIT(dev)) { + if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0) + return false; + if (dev_priv->edp.support) { + DRM_DEBUG_KMS("disable LVDS for eDP support\n"); + return false; + } + } + + intel_lvds = malloc(sizeof(struct intel_lvds), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + intel_connector = malloc(sizeof(struct intel_connector), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + if (!HAS_PCH_SPLIT(dev)) { + intel_lvds->pfit_control = I915_READ(PFIT_CONTROL); + } + + intel_encoder = &intel_lvds->base; + encoder = &intel_encoder->base; + connector = &intel_connector->base; + drm_connector_init(dev, &intel_connector->base, &intel_lvds_connector_funcs, + DRM_MODE_CONNECTOR_LVDS); + + drm_encoder_init(dev, &intel_encoder->base, &intel_lvds_enc_funcs, + DRM_MODE_ENCODER_LVDS); + + intel_connector_attach_encoder(intel_connector, intel_encoder); + intel_encoder->type = INTEL_OUTPUT_LVDS; + + intel_encoder->clone_mask = (1 << INTEL_LVDS_CLONE_BIT); + if (HAS_PCH_SPLIT(dev)) + intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2); + else + intel_encoder->crtc_mask = (1 << 1); + + drm_encoder_helper_add(encoder, &intel_lvds_helper_funcs); + drm_connector_helper_add(connector, &intel_lvds_connector_helper_funcs); + connector->display_info.subpixel_order = SubPixelHorizontalRGB; + connector->interlace_allowed = false; + connector->doublescan_allowed = false; + + /* create the scaling mode property */ + drm_mode_create_scaling_mode_property(dev); + /* + * the initial panel fitting mode will be FULL_SCREEN. + */ + + drm_connector_attach_property(&intel_connector->base, + dev->mode_config.scaling_mode_property, + DRM_MODE_SCALE_ASPECT); + intel_lvds->fitting_mode = DRM_MODE_SCALE_ASPECT; + /* + * LVDS discovery: + * 1) check for EDID on DDC + * 2) check for VBT data + * 3) check to see if LVDS is already on + * if none of the above, no panel + * 4) make sure lid is open + * if closed, act like it's not there for now + */ + + /* + * Attempt to get the fixed panel mode from DDC. Assume that the + * preferred mode is the right one. + */ + intel_lvds->edid = drm_get_edid(connector, dev_priv->gmbus[pin]); + if (intel_lvds->edid) { + if (drm_add_edid_modes(connector, + intel_lvds->edid)) { + drm_mode_connector_update_edid_property(connector, + intel_lvds->edid); + } else { + free(intel_lvds->edid, DRM_MEM_KMS); + intel_lvds->edid = NULL; + } + } + if (!intel_lvds->edid) { + /* Didn't get an EDID, so + * Set wide sync ranges so we get all modes + * handed to valid_mode for checking + */ + connector->display_info.min_vfreq = 0; + connector->display_info.max_vfreq = 200; + connector->display_info.min_hfreq = 0; + connector->display_info.max_hfreq = 200; + } + + list_for_each_entry(scan, &connector->probed_modes, head) { + if (scan->type & DRM_MODE_TYPE_PREFERRED) { + intel_lvds->fixed_mode = + drm_mode_duplicate(dev, scan); + intel_find_lvds_downclock(dev, + intel_lvds->fixed_mode, + connector); + goto out; + } + } + + /* Failed to get EDID, what about VBT? */ + if (dev_priv->lfp_lvds_vbt_mode) { + intel_lvds->fixed_mode = + drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode); + if (intel_lvds->fixed_mode) { + intel_lvds->fixed_mode->type |= + DRM_MODE_TYPE_PREFERRED; + goto out; + } + } + + /* + * If we didn't get EDID, try checking if the panel is already turned + * on. If so, assume that whatever is currently programmed is the + * correct mode. + */ + + /* Ironlake: FIXME if still fail, not try pipe mode now */ + if (HAS_PCH_SPLIT(dev)) + goto failed; + + lvds = I915_READ(LVDS); + pipe = (lvds & LVDS_PIPEB_SELECT) ? 1 : 0; + crtc = intel_get_crtc_for_pipe(dev, pipe); + + if (crtc && (lvds & LVDS_PORT_EN)) { + intel_lvds->fixed_mode = intel_crtc_mode_get(dev, crtc); + if (intel_lvds->fixed_mode) { + intel_lvds->fixed_mode->type |= + DRM_MODE_TYPE_PREFERRED; + goto out; + } + } + + /* If we still don't have a mode after all that, give up. */ + if (!intel_lvds->fixed_mode) + goto failed; + +out: + if (HAS_PCH_SPLIT(dev)) { + u32 pwm; + + pipe = (I915_READ(PCH_LVDS) & LVDS_PIPEB_SELECT) ? 1 : 0; + + /* make sure PWM is enabled and locked to the LVDS pipe */ + pwm = I915_READ(BLC_PWM_CPU_CTL2); + if (pipe == 0 && (pwm & PWM_PIPE_B)) + I915_WRITE(BLC_PWM_CPU_CTL2, pwm & ~PWM_ENABLE); + if (pipe) + pwm |= PWM_PIPE_B; + else + pwm &= ~PWM_PIPE_B; + I915_WRITE(BLC_PWM_CPU_CTL2, pwm | PWM_ENABLE); + + pwm = I915_READ(BLC_PWM_PCH_CTL1); + pwm |= PWM_PCH_ENABLE; + I915_WRITE(BLC_PWM_PCH_CTL1, pwm); + /* + * Unlock registers and just + * leave them unlocked + */ + I915_WRITE(PCH_PP_CONTROL, + I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS); + } else { + /* + * Unlock registers and just + * leave them unlocked + */ + I915_WRITE(PP_CONTROL, + I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS); + } +#ifdef NOTYET + dev_priv->lid_notifier.notifier_call = intel_lid_notify; + if (acpi_lid_notifier_register(&dev_priv->lid_notifier)) { + DRM_DEBUG_KMS("lid notifier registration failed\n"); + dev_priv->lid_notifier.notifier_call = NULL; + } +#endif + /* keep the LVDS connector */ + dev_priv->int_lvds_connector = connector; +#if 0 + drm_sysfs_connector_add(connector); +#endif + intel_panel_setup_backlight(dev); + return true; + +failed: + DRM_DEBUG_KMS("No LVDS modes found, disabling.\n"); + drm_connector_cleanup(connector); + drm_encoder_cleanup(encoder); + free(intel_lvds, DRM_MEM_KMS); + free(intel_connector, DRM_MEM_KMS); + return false; +} diff --git a/sys/dev/drm2/i915/intel_modes.c b/sys/dev/drm2/i915/intel_modes.c new file mode 100644 index 00000000000..8bf1d59091d --- /dev/null +++ b/sys/dev/drm2/i915/intel_modes.c @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2007 Dave Airlie + * Copyright (c) 2007, 2010 Intel Corporation + * Jesse Barnes + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +/** + * intel_ddc_probe + * + */ +bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus) +{ + struct drm_i915_private *dev_priv = intel_encoder->base.dev->dev_private; + u8 out_buf[] = { 0x0, 0x0}; + u8 buf[2]; + struct iic_msg msgs[] = { + { + .slave = DDC_ADDR, + .flags = IIC_M_WR, + .len = 1, + .buf = out_buf, + }, + { + .slave = DDC_ADDR, + .flags = IIC_M_RD, + .len = 1, + .buf = buf, + } + }; + + return (iicbus_transfer(dev_priv->gmbus[ddc_bus], msgs, 2) + == 0/* XXXKIB 2*/); +} + +/** + * intel_ddc_get_modes - get modelist from monitor + * @connector: DRM connector device to use + * @adapter: i2c adapter + * + * Fetch the EDID information from @connector using the DDC bus. + */ +int +intel_ddc_get_modes(struct drm_connector *connector, device_t adapter) +{ + struct edid *edid; + int ret = 0; + + edid = drm_get_edid(connector, adapter); + if (edid) { + drm_mode_connector_update_edid_property(connector, edid); + ret = drm_add_edid_modes(connector, edid); + drm_edid_to_eld(connector, edid); + connector->display_info.raw_edid = NULL; + free(edid, DRM_MEM_KMS); + } + + return ret; +} + +static const struct drm_prop_enum_list force_audio_names[] = { + { HDMI_AUDIO_OFF_DVI, "force-dvi" }, + { HDMI_AUDIO_OFF, "off" }, + { HDMI_AUDIO_AUTO, "auto" }, + { HDMI_AUDIO_ON, "on" }, +}; + +void +intel_attach_force_audio_property(struct drm_connector *connector) +{ + struct drm_device *dev = connector->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_property *prop; + + prop = dev_priv->force_audio_property; + if (prop == NULL) { + prop = drm_property_create_enum(dev, 0, + "audio", + force_audio_names, + DRM_ARRAY_SIZE(force_audio_names)); + if (prop == NULL) + return; + + dev_priv->force_audio_property = prop; + } + drm_connector_attach_property(connector, prop, 0); +} + +static const struct drm_prop_enum_list broadcast_rgb_names[] = { + { 0, "Full" }, + { 1, "Limited 16:235" }, +}; + +void +intel_attach_broadcast_rgb_property(struct drm_connector *connector) +{ + struct drm_device *dev = connector->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_property *prop; + + prop = dev_priv->broadcast_rgb_property; + if (prop == NULL) { + prop = drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, + "Broadcast RGB", + broadcast_rgb_names, + DRM_ARRAY_SIZE(broadcast_rgb_names)); + if (prop == NULL) + return; + + dev_priv->broadcast_rgb_property = prop; + } + + drm_connector_attach_property(connector, prop, 0); +} diff --git a/sys/dev/drm2/i915/intel_opregion.c b/sys/dev/drm2/i915/intel_opregion.c new file mode 100644 index 00000000000..8229c3086ce --- /dev/null +++ b/sys/dev/drm2/i915/intel_opregion.c @@ -0,0 +1,550 @@ +/* + * Copyright 2008 Intel Corporation + * Copyright 2008 Red Hat + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NON-INFRINGEMENT. IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#define PCI_ASLE 0xe4 +#define PCI_ASLS 0xfc + +#define OPREGION_HEADER_OFFSET 0 +#define OPREGION_ACPI_OFFSET 0x100 +#define ACPI_CLID 0x01ac /* current lid state indicator */ +#define ACPI_CDCK 0x01b0 /* current docking state indicator */ +#define OPREGION_SWSCI_OFFSET 0x200 +#define OPREGION_ASLE_OFFSET 0x300 +#define OPREGION_VBT_OFFSET 0x400 + +#define OPREGION_SIGNATURE "IntelGraphicsMem" +#define MBOX_ACPI (1<<0) +#define MBOX_SWSCI (1<<1) +#define MBOX_ASLE (1<<2) + +struct opregion_header { + u8 signature[16]; + u32 size; + u32 opregion_ver; + u8 bios_ver[32]; + u8 vbios_ver[16]; + u8 driver_ver[16]; + u32 mboxes; + u8 reserved[164]; +} __attribute__((packed)); + +/* OpRegion mailbox #1: public ACPI methods */ +struct opregion_acpi { + u32 drdy; /* driver readiness */ + u32 csts; /* notification status */ + u32 cevt; /* current event */ + u8 rsvd1[20]; + u32 didl[8]; /* supported display devices ID list */ + u32 cpdl[8]; /* currently presented display list */ + u32 cadl[8]; /* currently active display list */ + u32 nadl[8]; /* next active devices list */ + u32 aslp; /* ASL sleep time-out */ + u32 tidx; /* toggle table index */ + u32 chpd; /* current hotplug enable indicator */ + u32 clid; /* current lid state*/ + u32 cdck; /* current docking state */ + u32 sxsw; /* Sx state resume */ + u32 evts; /* ASL supported events */ + u32 cnot; /* current OS notification */ + u32 nrdy; /* driver status */ + u8 rsvd2[60]; +} __attribute__((packed)); + +/* OpRegion mailbox #2: SWSCI */ +struct opregion_swsci { + u32 scic; /* SWSCI command|status|data */ + u32 parm; /* command parameters */ + u32 dslp; /* driver sleep time-out */ + u8 rsvd[244]; +} __attribute__((packed)); + +/* OpRegion mailbox #3: ASLE */ +struct opregion_asle { + u32 ardy; /* driver readiness */ + u32 aslc; /* ASLE interrupt command */ + u32 tche; /* technology enabled indicator */ + u32 alsi; /* current ALS illuminance reading */ + u32 bclp; /* backlight brightness to set */ + u32 pfit; /* panel fitting state */ + u32 cblv; /* current brightness level */ + u16 bclm[20]; /* backlight level duty cycle mapping table */ + u32 cpfm; /* current panel fitting mode */ + u32 epfm; /* enabled panel fitting modes */ + u8 plut[74]; /* panel LUT and identifier */ + u32 pfmb; /* PWM freq and min brightness */ + u8 rsvd[102]; +} __attribute__((packed)); + +/* ASLE irq request bits */ +#define ASLE_SET_ALS_ILLUM (1 << 0) +#define ASLE_SET_BACKLIGHT (1 << 1) +#define ASLE_SET_PFIT (1 << 2) +#define ASLE_SET_PWM_FREQ (1 << 3) +#define ASLE_REQ_MSK 0xf + +/* response bits of ASLE irq request */ +#define ASLE_ALS_ILLUM_FAILED (1<<10) +#define ASLE_BACKLIGHT_FAILED (1<<12) +#define ASLE_PFIT_FAILED (1<<14) +#define ASLE_PWM_FREQ_FAILED (1<<16) + +/* ASLE backlight brightness to set */ +#define ASLE_BCLP_VALID (1<<31) +#define ASLE_BCLP_MSK (~(1<<31)) + +/* ASLE panel fitting request */ +#define ASLE_PFIT_VALID (1<<31) +#define ASLE_PFIT_CENTER (1<<0) +#define ASLE_PFIT_STRETCH_TEXT (1<<1) +#define ASLE_PFIT_STRETCH_GFX (1<<2) + +/* PWM frequency and minimum brightness */ +#define ASLE_PFMB_BRIGHTNESS_MASK (0xff) +#define ASLE_PFMB_BRIGHTNESS_VALID (1<<8) +#define ASLE_PFMB_PWM_MASK (0x7ffffe00) +#define ASLE_PFMB_PWM_VALID (1<<31) + +#define ASLE_CBLV_VALID (1<<31) + +#define ACPI_OTHER_OUTPUT (0<<8) +#define ACPI_VGA_OUTPUT (1<<8) +#define ACPI_TV_OUTPUT (2<<8) +#define ACPI_DIGITAL_OUTPUT (3<<8) +#define ACPI_LVDS_OUTPUT (4<<8) + +#ifdef CONFIG_ACPI +static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct opregion_asle *asle = dev_priv->opregion.asle; + u32 max; + + if (!(bclp & ASLE_BCLP_VALID)) + return ASLE_BACKLIGHT_FAILED; + + bclp &= ASLE_BCLP_MSK; + if (bclp > 255) + return ASLE_BACKLIGHT_FAILED; + + max = intel_panel_get_max_backlight(dev); + intel_panel_set_backlight(dev, bclp * max / 255); + asle->cblv = (bclp*0x64)/0xff | ASLE_CBLV_VALID; + + return 0; +} + +static u32 asle_set_als_illum(struct drm_device *dev, u32 alsi) +{ + /* alsi is the current ALS reading in lux. 0 indicates below sensor + range, 0xffff indicates above sensor range. 1-0xfffe are valid */ + return 0; +} + +static u32 asle_set_pwm_freq(struct drm_device *dev, u32 pfmb) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + if (pfmb & ASLE_PFMB_PWM_VALID) { + u32 blc_pwm_ctl = I915_READ(BLC_PWM_CTL); + u32 pwm = pfmb & ASLE_PFMB_PWM_MASK; + blc_pwm_ctl &= BACKLIGHT_DUTY_CYCLE_MASK; + pwm = pwm >> 9; + /* FIXME - what do we do with the PWM? */ + } + return 0; +} + +static u32 asle_set_pfit(struct drm_device *dev, u32 pfit) +{ + /* Panel fitting is currently controlled by the X code, so this is a + noop until modesetting support works fully */ + if (!(pfit & ASLE_PFIT_VALID)) + return ASLE_PFIT_FAILED; + return 0; +} + +void intel_opregion_asle_intr(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct opregion_asle *asle = dev_priv->opregion.asle; + u32 asle_stat = 0; + u32 asle_req; + + if (!asle) + return; + + asle_req = asle->aslc & ASLE_REQ_MSK; + + if (!asle_req) { + DRM_DEBUG("non asle set request??\n"); + return; + } + + if (asle_req & ASLE_SET_ALS_ILLUM) + asle_stat |= asle_set_als_illum(dev, asle->alsi); + + if (asle_req & ASLE_SET_BACKLIGHT) + asle_stat |= asle_set_backlight(dev, asle->bclp); + + if (asle_req & ASLE_SET_PFIT) + asle_stat |= asle_set_pfit(dev, asle->pfit); + + if (asle_req & ASLE_SET_PWM_FREQ) + asle_stat |= asle_set_pwm_freq(dev, asle->pfmb); + + asle->aslc = asle_stat; +} + +void intel_opregion_gse_intr(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct opregion_asle *asle = dev_priv->opregion.asle; + u32 asle_stat = 0; + u32 asle_req; + + if (!asle) + return; + + asle_req = asle->aslc & ASLE_REQ_MSK; + + if (!asle_req) { + DRM_DEBUG("non asle set request??\n"); + return; + } + + if (asle_req & ASLE_SET_ALS_ILLUM) { + DRM_DEBUG("Illum is not supported\n"); + asle_stat |= ASLE_ALS_ILLUM_FAILED; + } + + if (asle_req & ASLE_SET_BACKLIGHT) + asle_stat |= asle_set_backlight(dev, asle->bclp); + + if (asle_req & ASLE_SET_PFIT) { + DRM_DEBUG("Pfit is not supported\n"); + asle_stat |= ASLE_PFIT_FAILED; + } + + if (asle_req & ASLE_SET_PWM_FREQ) { + DRM_DEBUG("PWM freq is not supported\n"); + asle_stat |= ASLE_PWM_FREQ_FAILED; + } + + asle->aslc = asle_stat; +} +#define ASLE_ALS_EN (1<<0) +#define ASLE_BLC_EN (1<<1) +#define ASLE_PFIT_EN (1<<2) +#define ASLE_PFMB_EN (1<<3) + +void intel_opregion_enable_asle(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct opregion_asle *asle = dev_priv->opregion.asle; + + if (asle) { + if (IS_MOBILE(dev)) + intel_enable_asle(dev); + + asle->tche = ASLE_ALS_EN | ASLE_BLC_EN | ASLE_PFIT_EN | + ASLE_PFMB_EN; + asle->ardy = 1; + } +} + +#define ACPI_EV_DISPLAY_SWITCH (1<<0) +#define ACPI_EV_LID (1<<1) +#define ACPI_EV_DOCK (1<<2) + +static struct intel_opregion *system_opregion; + +static int intel_opregion_video_event(struct notifier_block *nb, + unsigned long val, void *data) +{ + /* The only video events relevant to opregion are 0x80. These indicate + either a docking event, lid switch or display switch request. In + Linux, these are handled by the dock, button and video drivers. + */ + struct opregion_acpi *acpi; + struct acpi_bus_event *event = data; + int ret = NOTIFY_OK; + + if (strcmp(event->device_class, ACPI_VIDEO_CLASS) != 0) + return NOTIFY_DONE; + + if (!system_opregion) + return NOTIFY_DONE; + + acpi = system_opregion->acpi; + + if (event->type == 0x80 && !(acpi->cevt & 0x1)) + ret = NOTIFY_BAD; + + acpi->csts = 0; + + return ret; +} + +static struct notifier_block intel_opregion_notifier = { + .notifier_call = intel_opregion_video_event, +}; + +/* + * Initialise the DIDL field in opregion. This passes a list of devices to + * the firmware. Values are defined by section B.4.2 of the ACPI specification + * (version 3) + */ + +static void intel_didl_outputs(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_opregion *opregion = &dev_priv->opregion; + struct drm_connector *connector; + acpi_handle handle; + struct acpi_device *acpi_dev, *acpi_cdev, *acpi_video_bus = NULL; + unsigned long long device_id; + acpi_status status; + int i = 0; + + handle = DEVICE_ACPI_HANDLE(&dev->pdev->dev); + if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &acpi_dev))) + return; + + if (acpi_is_video_device(acpi_dev)) + acpi_video_bus = acpi_dev; + else { + list_for_each_entry(acpi_cdev, &acpi_dev->children, node) { + if (acpi_is_video_device(acpi_cdev)) { + acpi_video_bus = acpi_cdev; + break; + } + } + } + + if (!acpi_video_bus) { + printk(KERN_WARNING "No ACPI video bus found\n"); + return; + } + + list_for_each_entry(acpi_cdev, &acpi_video_bus->children, node) { + if (i >= 8) { + dev_printk(KERN_ERR, &dev->pdev->dev, + "More than 8 outputs detected\n"); + return; + } + status = + acpi_evaluate_integer(acpi_cdev->handle, "_ADR", + NULL, &device_id); + if (ACPI_SUCCESS(status)) { + if (!device_id) + goto blind_set; + opregion->acpi->didl[i] = (u32)(device_id & 0x0f0f); + i++; + } + } + +end: + /* If fewer than 8 outputs, the list must be null terminated */ + if (i < 8) + opregion->acpi->didl[i] = 0; + return; + +blind_set: + i = 0; + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + int output_type = ACPI_OTHER_OUTPUT; + if (i >= 8) { + device_printf(dev->device, + "More than 8 outputs detected\n"); + return; + } + switch (connector->connector_type) { + case DRM_MODE_CONNECTOR_VGA: + case DRM_MODE_CONNECTOR_DVIA: + output_type = ACPI_VGA_OUTPUT; + break; + case DRM_MODE_CONNECTOR_Composite: + case DRM_MODE_CONNECTOR_SVIDEO: + case DRM_MODE_CONNECTOR_Component: + case DRM_MODE_CONNECTOR_9PinDIN: + output_type = ACPI_TV_OUTPUT; + break; + case DRM_MODE_CONNECTOR_DVII: + case DRM_MODE_CONNECTOR_DVID: + case DRM_MODE_CONNECTOR_DisplayPort: + case DRM_MODE_CONNECTOR_HDMIA: + case DRM_MODE_CONNECTOR_HDMIB: + output_type = ACPI_DIGITAL_OUTPUT; + break; + case DRM_MODE_CONNECTOR_LVDS: + output_type = ACPI_LVDS_OUTPUT; + break; + } + opregion->acpi->didl[i] |= (1<<31) | output_type | i; + i++; + } + goto end; +} + +void intel_opregion_init(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_opregion *opregion = &dev_priv->opregion; + + if (!opregion->header) + return; + + if (opregion->acpi) { + if (drm_core_check_feature(dev, DRIVER_MODESET)) + intel_didl_outputs(dev); + + /* Notify BIOS we are ready to handle ACPI video ext notifs. + * Right now, all the events are handled by the ACPI video module. + * We don't actually need to do anything with them. */ + opregion->acpi->csts = 0; + opregion->acpi->drdy = 1; + + system_opregion = opregion; + register_acpi_notifier(&intel_opregion_notifier); + } + + if (opregion->asle) + intel_opregion_enable_asle(dev); +} + +void intel_opregion_fini(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_opregion *opregion = &dev_priv->opregion; + + if (!opregion->header) + return; + + if (opregion->acpi) { + opregion->acpi->drdy = 0; + + system_opregion = NULL; + unregister_acpi_notifier(&intel_opregion_notifier); + } + + /* just clear all opregion memory pointers now */ + iounmap(opregion->header); + opregion->header = NULL; + opregion->acpi = NULL; + opregion->swsci = NULL; + opregion->asle = NULL; + opregion->vbt = NULL; +} +#else +int +intel_opregion_init(struct drm_device *dev) +{ + + return (0); +} + +void +intel_opregion_fini(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv; + struct intel_opregion *opregion; + + dev_priv = dev->dev_private; + opregion = &dev_priv->opregion; + + if (opregion->header == NULL) + return; + + pmap_unmapdev((vm_offset_t)opregion->header, OPREGION_SIZE); + opregion->header = NULL; + opregion->acpi = NULL; + opregion->swsci = NULL; + opregion->asle = NULL; + opregion->vbt = NULL; +} +#endif + +int intel_opregion_setup(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_opregion *opregion = &dev_priv->opregion; + char *base; + u32 asls, mboxes; + int err = 0; + + asls = pci_read_config(dev->device, PCI_ASLS, 4); + DRM_DEBUG("graphic opregion physical addr: 0x%x\n", asls); + if (asls == 0) { + DRM_DEBUG("ACPI OpRegion not supported!\n"); + return -ENOTSUP; + } + + base = (void *)pmap_mapbios(asls, OPREGION_SIZE); + if (!base) + return -ENOMEM; + + if (memcmp(base, OPREGION_SIGNATURE, 16)) { + DRM_DEBUG("opregion signature mismatch\n"); + err = -EINVAL; + goto err_out; + } + opregion->header = (struct opregion_header *)base; + opregion->vbt = base + OPREGION_VBT_OFFSET; + + opregion->lid_state = (u32 *)(base + ACPI_CLID); + + mboxes = opregion->header->mboxes; + if (mboxes & MBOX_ACPI) { + DRM_DEBUG("Public ACPI methods supported\n"); + opregion->acpi = (struct opregion_acpi *)(base + + OPREGION_ACPI_OFFSET); + } + + if (mboxes & MBOX_SWSCI) { + DRM_DEBUG("SWSCI supported\n"); + opregion->swsci = (struct opregion_swsci *)(base + + OPREGION_SWSCI_OFFSET); + } + if (mboxes & MBOX_ASLE) { + DRM_DEBUG("ASLE supported\n"); + opregion->asle = (struct opregion_asle *)(base + + OPREGION_ASLE_OFFSET); + } + + return 0; + +err_out: + pmap_unmapdev((vm_offset_t)base, OPREGION_SIZE); + return err; +} diff --git a/sys/dev/drm2/i915/intel_overlay.c b/sys/dev/drm2/i915/intel_overlay.c new file mode 100644 index 00000000000..34f2c39224f --- /dev/null +++ b/sys/dev/drm2/i915/intel_overlay.c @@ -0,0 +1,1582 @@ +/* + * Copyright © 2009 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Daniel Vetter + * + * Derived from Xorg ddx, xf86-video-intel, src/i830_video.c + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +/* Limits for overlay size. According to intel doc, the real limits are: + * Y width: 4095, UV width (planar): 2047, Y height: 2047, + * UV width (planar): * 1023. But the xorg thinks 2048 for height and width. Use + * the mininum of both. */ +#define IMAGE_MAX_WIDTH 2048 +#define IMAGE_MAX_HEIGHT 2046 /* 2 * 1023 */ +/* on 830 and 845 these large limits result in the card hanging */ +#define IMAGE_MAX_WIDTH_LEGACY 1024 +#define IMAGE_MAX_HEIGHT_LEGACY 1088 + +/* overlay register definitions */ +/* OCMD register */ +#define OCMD_TILED_SURFACE (0x1<<19) +#define OCMD_MIRROR_MASK (0x3<<17) +#define OCMD_MIRROR_MODE (0x3<<17) +#define OCMD_MIRROR_HORIZONTAL (0x1<<17) +#define OCMD_MIRROR_VERTICAL (0x2<<17) +#define OCMD_MIRROR_BOTH (0x3<<17) +#define OCMD_BYTEORDER_MASK (0x3<<14) /* zero for YUYV or FOURCC YUY2 */ +#define OCMD_UV_SWAP (0x1<<14) /* YVYU */ +#define OCMD_Y_SWAP (0x2<<14) /* UYVY or FOURCC UYVY */ +#define OCMD_Y_AND_UV_SWAP (0x3<<14) /* VYUY */ +#define OCMD_SOURCE_FORMAT_MASK (0xf<<10) +#define OCMD_RGB_888 (0x1<<10) /* not in i965 Intel docs */ +#define OCMD_RGB_555 (0x2<<10) /* not in i965 Intel docs */ +#define OCMD_RGB_565 (0x3<<10) /* not in i965 Intel docs */ +#define OCMD_YUV_422_PACKED (0x8<<10) +#define OCMD_YUV_411_PACKED (0x9<<10) /* not in i965 Intel docs */ +#define OCMD_YUV_420_PLANAR (0xc<<10) +#define OCMD_YUV_422_PLANAR (0xd<<10) +#define OCMD_YUV_410_PLANAR (0xe<<10) /* also 411 */ +#define OCMD_TVSYNCFLIP_PARITY (0x1<<9) +#define OCMD_TVSYNCFLIP_ENABLE (0x1<<7) +#define OCMD_BUF_TYPE_MASK (0x1<<5) +#define OCMD_BUF_TYPE_FRAME (0x0<<5) +#define OCMD_BUF_TYPE_FIELD (0x1<<5) +#define OCMD_TEST_MODE (0x1<<4) +#define OCMD_BUFFER_SELECT (0x3<<2) +#define OCMD_BUFFER0 (0x0<<2) +#define OCMD_BUFFER1 (0x1<<2) +#define OCMD_FIELD_SELECT (0x1<<2) +#define OCMD_FIELD0 (0x0<<1) +#define OCMD_FIELD1 (0x1<<1) +#define OCMD_ENABLE (0x1<<0) + +/* OCONFIG register */ +#define OCONF_PIPE_MASK (0x1<<18) +#define OCONF_PIPE_A (0x0<<18) +#define OCONF_PIPE_B (0x1<<18) +#define OCONF_GAMMA2_ENABLE (0x1<<16) +#define OCONF_CSC_MODE_BT601 (0x0<<5) +#define OCONF_CSC_MODE_BT709 (0x1<<5) +#define OCONF_CSC_BYPASS (0x1<<4) +#define OCONF_CC_OUT_8BIT (0x1<<3) +#define OCONF_TEST_MODE (0x1<<2) +#define OCONF_THREE_LINE_BUFFER (0x1<<0) +#define OCONF_TWO_LINE_BUFFER (0x0<<0) + +/* DCLRKM (dst-key) register */ +#define DST_KEY_ENABLE (0x1<<31) +#define CLK_RGB24_MASK 0x0 +#define CLK_RGB16_MASK 0x070307 +#define CLK_RGB15_MASK 0x070707 +#define CLK_RGB8I_MASK 0xffffff + +#define RGB16_TO_COLORKEY(c) \ + (((c & 0xF800) << 8) | ((c & 0x07E0) << 5) | ((c & 0x001F) << 3)) +#define RGB15_TO_COLORKEY(c) \ + (((c & 0x7c00) << 9) | ((c & 0x03E0) << 6) | ((c & 0x001F) << 3)) + +/* overlay flip addr flag */ +#define OFC_UPDATE 0x1 + +/* polyphase filter coefficients */ +#define N_HORIZ_Y_TAPS 5 +#define N_VERT_Y_TAPS 3 +#define N_HORIZ_UV_TAPS 3 +#define N_VERT_UV_TAPS 3 +#define N_PHASES 17 +#define MAX_TAPS 5 + +/* memory bufferd overlay registers */ +struct overlay_registers { + u32 OBUF_0Y; + u32 OBUF_1Y; + u32 OBUF_0U; + u32 OBUF_0V; + u32 OBUF_1U; + u32 OBUF_1V; + u32 OSTRIDE; + u32 YRGB_VPH; + u32 UV_VPH; + u32 HORZ_PH; + u32 INIT_PHS; + u32 DWINPOS; + u32 DWINSZ; + u32 SWIDTH; + u32 SWIDTHSW; + u32 SHEIGHT; + u32 YRGBSCALE; + u32 UVSCALE; + u32 OCLRC0; + u32 OCLRC1; + u32 DCLRKV; + u32 DCLRKM; + u32 SCLRKVH; + u32 SCLRKVL; + u32 SCLRKEN; + u32 OCONFIG; + u32 OCMD; + u32 RESERVED1; /* 0x6C */ + u32 OSTART_0Y; + u32 OSTART_1Y; + u32 OSTART_0U; + u32 OSTART_0V; + u32 OSTART_1U; + u32 OSTART_1V; + u32 OTILEOFF_0Y; + u32 OTILEOFF_1Y; + u32 OTILEOFF_0U; + u32 OTILEOFF_0V; + u32 OTILEOFF_1U; + u32 OTILEOFF_1V; + u32 FASTHSCALE; /* 0xA0 */ + u32 UVSCALEV; /* 0xA4 */ + u32 RESERVEDC[(0x200 - 0xA8) / 4]; /* 0xA8 - 0x1FC */ + u16 Y_VCOEFS[N_VERT_Y_TAPS * N_PHASES]; /* 0x200 */ + u16 RESERVEDD[0x100 / 2 - N_VERT_Y_TAPS * N_PHASES]; + u16 Y_HCOEFS[N_HORIZ_Y_TAPS * N_PHASES]; /* 0x300 */ + u16 RESERVEDE[0x200 / 2 - N_HORIZ_Y_TAPS * N_PHASES]; + u16 UV_VCOEFS[N_VERT_UV_TAPS * N_PHASES]; /* 0x500 */ + u16 RESERVEDF[0x100 / 2 - N_VERT_UV_TAPS * N_PHASES]; + u16 UV_HCOEFS[N_HORIZ_UV_TAPS * N_PHASES]; /* 0x600 */ + u16 RESERVEDG[0x100 / 2 - N_HORIZ_UV_TAPS * N_PHASES]; +}; + +struct intel_overlay { + struct drm_device *dev; + struct intel_crtc *crtc; + struct drm_i915_gem_object *vid_bo; + struct drm_i915_gem_object *old_vid_bo; + int active; + int pfit_active; + u32 pfit_vscale_ratio; /* shifted-point number, (1<<12) == 1.0 */ + u32 color_key; + u32 brightness, contrast, saturation; + u32 old_xscale, old_yscale; + /* register access */ + u32 flip_addr; + struct drm_i915_gem_object *reg_bo; + /* flip handling */ + uint32_t last_flip_req; + void (*flip_tail)(struct intel_overlay *); +}; + +static struct overlay_registers * +intel_overlay_map_regs(struct intel_overlay *overlay) +{ + struct overlay_registers *regs; + + if (OVERLAY_NEEDS_PHYSICAL(overlay->dev)) { + regs = overlay->reg_bo->phys_obj->handle->vaddr; + } else { + regs = pmap_mapdev_attr(overlay->dev->agp->base + + overlay->reg_bo->gtt_offset, PAGE_SIZE, + PAT_WRITE_COMBINING); + } + return (regs); +} + +static void intel_overlay_unmap_regs(struct intel_overlay *overlay, + struct overlay_registers *regs) +{ + if (!OVERLAY_NEEDS_PHYSICAL(overlay->dev)) + pmap_unmapdev((vm_offset_t)regs, PAGE_SIZE); +} + +static int intel_overlay_do_wait_request(struct intel_overlay *overlay, + struct drm_i915_gem_request *request, + void (*tail)(struct intel_overlay *)) +{ + struct drm_device *dev = overlay->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + int ret; + + KASSERT(!overlay->last_flip_req, ("Overlay already has flip req")); + ret = i915_add_request(LP_RING(dev_priv), NULL, request); + if (ret) { + free(request, DRM_I915_GEM); + return ret; + } + overlay->last_flip_req = request->seqno; + overlay->flip_tail = tail; + ret = i915_wait_request(LP_RING(dev_priv), overlay->last_flip_req, + true); + if (ret) + return ret; + + overlay->last_flip_req = 0; + return 0; +} + +/* Workaround for i830 bug where pipe a must be enable to change control regs */ +static int +i830_activate_pipe_a(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_crtc *crtc; + struct drm_crtc_helper_funcs *crtc_funcs; + struct drm_display_mode vesa_640x480 = { + DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656, + 752, 800, 0, 480, 489, 492, 525, 0, + DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) + }, *mode; + + crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[0]); + if (crtc->dpms_mode == DRM_MODE_DPMS_ON) + return 0; + + /* most i8xx have pipe a forced on, so don't trust dpms mode */ + if (I915_READ(_PIPEACONF) & PIPECONF_ENABLE) + return 0; + + crtc_funcs = crtc->base.helper_private; + if (crtc_funcs->dpms == NULL) + return 0; + + DRM_DEBUG_DRIVER("Enabling pipe A in order to enable overlay\n"); + + mode = drm_mode_duplicate(dev, &vesa_640x480); + drm_mode_set_crtcinfo(mode, 0); + if (!drm_crtc_helper_set_mode(&crtc->base, mode, + crtc->base.x, crtc->base.y, + crtc->base.fb)) + return 0; + + crtc_funcs->dpms(&crtc->base, DRM_MODE_DPMS_ON); + return 1; +} + +static void +i830_deactivate_pipe_a(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[0]; + struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; + + crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); +} + +/* overlay needs to be disable in OCMD reg */ +static int intel_overlay_on(struct intel_overlay *overlay) +{ + struct drm_device *dev = overlay->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_i915_gem_request *request; + int pipe_a_quirk = 0; + int ret; + + KASSERT(!overlay->active, ("Overlay is active")); + overlay->active = 1; + + if (IS_I830(dev)) { + pipe_a_quirk = i830_activate_pipe_a(dev); + if (pipe_a_quirk < 0) + return pipe_a_quirk; + } + + request = malloc(sizeof(*request), DRM_I915_GEM, M_WAITOK | M_ZERO); + + ret = BEGIN_LP_RING(4); + if (ret) { + free(request, DRM_I915_GEM); + goto out; + } + + OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_ON); + OUT_RING(overlay->flip_addr | OFC_UPDATE); + OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); + OUT_RING(MI_NOOP); + ADVANCE_LP_RING(); + + ret = intel_overlay_do_wait_request(overlay, request, NULL); +out: + if (pipe_a_quirk) + i830_deactivate_pipe_a(dev); + + return ret; +} + +/* overlay needs to be enabled in OCMD reg */ +static int intel_overlay_continue(struct intel_overlay *overlay, + bool load_polyphase_filter) +{ + struct drm_device *dev = overlay->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_i915_gem_request *request; + u32 flip_addr = overlay->flip_addr; + u32 tmp; + int ret; + + KASSERT(overlay->active, ("Overlay not active")); + + request = malloc(sizeof(*request), DRM_I915_GEM, M_WAITOK | M_ZERO); + + if (load_polyphase_filter) + flip_addr |= OFC_UPDATE; + + /* check for underruns */ + tmp = I915_READ(DOVSTA); + if (tmp & (1 << 17)) + DRM_DEBUG("overlay underrun, DOVSTA: %x\n", tmp); + + ret = BEGIN_LP_RING(2); + if (ret) { + free(request, DRM_I915_GEM); + return ret; + } + OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE); + OUT_RING(flip_addr); + ADVANCE_LP_RING(); + + ret = i915_add_request(LP_RING(dev_priv), NULL, request); + if (ret) { + free(request, DRM_I915_GEM); + return ret; + } + + overlay->last_flip_req = request->seqno; + return 0; +} + +static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay) +{ + struct drm_i915_gem_object *obj = overlay->old_vid_bo; + + i915_gem_object_unpin(obj); + drm_gem_object_unreference(&obj->base); + + overlay->old_vid_bo = NULL; +} + +static void intel_overlay_off_tail(struct intel_overlay *overlay) +{ + struct drm_i915_gem_object *obj = overlay->vid_bo; + + /* never have the overlay hw on without showing a frame */ + KASSERT(overlay->vid_bo != NULL, ("No vid_bo")); + + i915_gem_object_unpin(obj); + drm_gem_object_unreference(&obj->base); + overlay->vid_bo = NULL; + + overlay->crtc->overlay = NULL; + overlay->crtc = NULL; + overlay->active = 0; +} + +/* overlay needs to be disabled in OCMD reg */ +static int intel_overlay_off(struct intel_overlay *overlay) +{ + struct drm_device *dev = overlay->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 flip_addr = overlay->flip_addr; + struct drm_i915_gem_request *request; + int ret; + + KASSERT(overlay->active, ("Overlay is not active")); + + request = malloc(sizeof(*request), DRM_I915_GEM, M_WAITOK | M_ZERO); + + /* According to intel docs the overlay hw may hang (when switching + * off) without loading the filter coeffs. It is however unclear whether + * this applies to the disabling of the overlay or to the switching off + * of the hw. Do it in both cases */ + flip_addr |= OFC_UPDATE; + + ret = BEGIN_LP_RING(6); + if (ret) { + free(request, DRM_I915_GEM); + return ret; + } + /* wait for overlay to go idle */ + OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE); + OUT_RING(flip_addr); + OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); + /* turn overlay off */ + OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_OFF); + OUT_RING(flip_addr); + OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); + ADVANCE_LP_RING(); + + return intel_overlay_do_wait_request(overlay, request, + intel_overlay_off_tail); +} + +/* recover from an interruption due to a signal + * We have to be careful not to repeat work forever an make forward progess. */ +static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay) +{ + struct drm_device *dev = overlay->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + int ret; + + if (overlay->last_flip_req == 0) + return 0; + + ret = i915_wait_request(LP_RING(dev_priv), overlay->last_flip_req, + true); + if (ret) + return ret; + + if (overlay->flip_tail) + overlay->flip_tail(overlay); + + overlay->last_flip_req = 0; + return 0; +} + +/* Wait for pending overlay flip and release old frame. + * Needs to be called before the overlay register are changed + * via intel_overlay_(un)map_regs + */ +static int intel_overlay_release_old_vid(struct intel_overlay *overlay) +{ + struct drm_device *dev = overlay->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + int ret; + + /* Only wait if there is actually an old frame to release to + * guarantee forward progress. + */ + if (!overlay->old_vid_bo) + return 0; + + if (I915_READ(ISR) & I915_OVERLAY_PLANE_FLIP_PENDING_INTERRUPT) { + struct drm_i915_gem_request *request; + + /* synchronous slowpath */ + request = malloc(sizeof(*request), DRM_I915_GEM, M_WAITOK | M_ZERO); + + ret = BEGIN_LP_RING(2); + if (ret) { + free(request, DRM_I915_GEM); + return ret; + } + + OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); + OUT_RING(MI_NOOP); + ADVANCE_LP_RING(); + + ret = intel_overlay_do_wait_request(overlay, request, + intel_overlay_release_old_vid_tail); + if (ret) + return ret; + } + + intel_overlay_release_old_vid_tail(overlay); + return 0; +} + +struct put_image_params { + int format; + short dst_x; + short dst_y; + short dst_w; + short dst_h; + short src_w; + short src_scan_h; + short src_scan_w; + short src_h; + short stride_Y; + short stride_UV; + int offset_Y; + int offset_U; + int offset_V; +}; + +static int packed_depth_bytes(u32 format) +{ + switch (format & I915_OVERLAY_DEPTH_MASK) { + case I915_OVERLAY_YUV422: + return 4; + case I915_OVERLAY_YUV411: + /* return 6; not implemented */ + default: + return -EINVAL; + } +} + +static int packed_width_bytes(u32 format, short width) +{ + switch (format & I915_OVERLAY_DEPTH_MASK) { + case I915_OVERLAY_YUV422: + return width << 1; + default: + return -EINVAL; + } +} + +static int uv_hsubsampling(u32 format) +{ + switch (format & I915_OVERLAY_DEPTH_MASK) { + case I915_OVERLAY_YUV422: + case I915_OVERLAY_YUV420: + return 2; + case I915_OVERLAY_YUV411: + case I915_OVERLAY_YUV410: + return 4; + default: + return -EINVAL; + } +} + +static int uv_vsubsampling(u32 format) +{ + switch (format & I915_OVERLAY_DEPTH_MASK) { + case I915_OVERLAY_YUV420: + case I915_OVERLAY_YUV410: + return 2; + case I915_OVERLAY_YUV422: + case I915_OVERLAY_YUV411: + return 1; + default: + return -EINVAL; + } +} + +static u32 calc_swidthsw(struct drm_device *dev, u32 offset, u32 width) +{ + u32 mask, shift, ret; + if (IS_GEN2(dev)) { + mask = 0x1f; + shift = 5; + } else { + mask = 0x3f; + shift = 6; + } + ret = ((offset + width + mask) >> shift) - (offset >> shift); + if (!IS_GEN2(dev)) + ret <<= 1; + ret -= 1; + return ret << 2; +} + +static const u16 y_static_hcoeffs[N_HORIZ_Y_TAPS * N_PHASES] = { + 0x3000, 0xb4a0, 0x1930, 0x1920, 0xb4a0, + 0x3000, 0xb500, 0x19d0, 0x1880, 0xb440, + 0x3000, 0xb540, 0x1a88, 0x2f80, 0xb3e0, + 0x3000, 0xb580, 0x1b30, 0x2e20, 0xb380, + 0x3000, 0xb5c0, 0x1bd8, 0x2cc0, 0xb320, + 0x3020, 0xb5e0, 0x1c60, 0x2b80, 0xb2c0, + 0x3020, 0xb5e0, 0x1cf8, 0x2a20, 0xb260, + 0x3020, 0xb5e0, 0x1d80, 0x28e0, 0xb200, + 0x3020, 0xb5c0, 0x1e08, 0x3f40, 0xb1c0, + 0x3020, 0xb580, 0x1e78, 0x3ce0, 0xb160, + 0x3040, 0xb520, 0x1ed8, 0x3aa0, 0xb120, + 0x3040, 0xb4a0, 0x1f30, 0x3880, 0xb0e0, + 0x3040, 0xb400, 0x1f78, 0x3680, 0xb0a0, + 0x3020, 0xb340, 0x1fb8, 0x34a0, 0xb060, + 0x3020, 0xb240, 0x1fe0, 0x32e0, 0xb040, + 0x3020, 0xb140, 0x1ff8, 0x3160, 0xb020, + 0xb000, 0x3000, 0x0800, 0x3000, 0xb000 +}; + +static const u16 uv_static_hcoeffs[N_HORIZ_UV_TAPS * N_PHASES] = { + 0x3000, 0x1800, 0x1800, 0xb000, 0x18d0, 0x2e60, + 0xb000, 0x1990, 0x2ce0, 0xb020, 0x1a68, 0x2b40, + 0xb040, 0x1b20, 0x29e0, 0xb060, 0x1bd8, 0x2880, + 0xb080, 0x1c88, 0x3e60, 0xb0a0, 0x1d28, 0x3c00, + 0xb0c0, 0x1db8, 0x39e0, 0xb0e0, 0x1e40, 0x37e0, + 0xb100, 0x1eb8, 0x3620, 0xb100, 0x1f18, 0x34a0, + 0xb100, 0x1f68, 0x3360, 0xb0e0, 0x1fa8, 0x3240, + 0xb0c0, 0x1fe0, 0x3140, 0xb060, 0x1ff0, 0x30a0, + 0x3000, 0x0800, 0x3000 +}; + +static void update_polyphase_filter(struct overlay_registers *regs) +{ + memcpy(regs->Y_HCOEFS, y_static_hcoeffs, sizeof(y_static_hcoeffs)); + memcpy(regs->UV_HCOEFS, uv_static_hcoeffs, sizeof(uv_static_hcoeffs)); +} + +static bool update_scaling_factors(struct intel_overlay *overlay, + struct overlay_registers *regs, + struct put_image_params *params) +{ + /* fixed point with a 12 bit shift */ + u32 xscale, yscale, xscale_UV, yscale_UV; +#define FP_SHIFT 12 +#define FRACT_MASK 0xfff + bool scale_changed = false; + int uv_hscale = uv_hsubsampling(params->format); + int uv_vscale = uv_vsubsampling(params->format); + + if (params->dst_w > 1) + xscale = ((params->src_scan_w - 1) << FP_SHIFT) + /(params->dst_w); + else + xscale = 1 << FP_SHIFT; + + if (params->dst_h > 1) + yscale = ((params->src_scan_h - 1) << FP_SHIFT) + /(params->dst_h); + else + yscale = 1 << FP_SHIFT; + + /*if (params->format & I915_OVERLAY_YUV_PLANAR) {*/ + xscale_UV = xscale/uv_hscale; + yscale_UV = yscale/uv_vscale; + /* make the Y scale to UV scale ratio an exact multiply */ + xscale = xscale_UV * uv_hscale; + yscale = yscale_UV * uv_vscale; + /*} else { + xscale_UV = 0; + yscale_UV = 0; + }*/ + + if (xscale != overlay->old_xscale || yscale != overlay->old_yscale) + scale_changed = true; + overlay->old_xscale = xscale; + overlay->old_yscale = yscale; + + regs->YRGBSCALE = (((yscale & FRACT_MASK) << 20) | + ((xscale >> FP_SHIFT) << 16) | + ((xscale & FRACT_MASK) << 3)); + + regs->UVSCALE = (((yscale_UV & FRACT_MASK) << 20) | + ((xscale_UV >> FP_SHIFT) << 16) | + ((xscale_UV & FRACT_MASK) << 3)); + + regs->UVSCALEV = ((((yscale >> FP_SHIFT) << 16) | + ((yscale_UV >> FP_SHIFT) << 0))); + + if (scale_changed) + update_polyphase_filter(regs); + + return scale_changed; +} + +static void update_colorkey(struct intel_overlay *overlay, + struct overlay_registers *regs) +{ + u32 key = overlay->color_key; + + switch (overlay->crtc->base.fb->bits_per_pixel) { + case 8: + regs->DCLRKV = 0; + regs->DCLRKM = CLK_RGB8I_MASK | DST_KEY_ENABLE; + break; + + case 16: + if (overlay->crtc->base.fb->depth == 15) { + regs->DCLRKV = RGB15_TO_COLORKEY(key); + regs->DCLRKM = CLK_RGB15_MASK | DST_KEY_ENABLE; + } else { + regs->DCLRKV = RGB16_TO_COLORKEY(key); + regs->DCLRKM = CLK_RGB16_MASK | DST_KEY_ENABLE; + } + break; + + case 24: + case 32: + regs->DCLRKV = key; + regs->DCLRKM = CLK_RGB24_MASK | DST_KEY_ENABLE; + break; + } +} + +static u32 overlay_cmd_reg(struct put_image_params *params) +{ + u32 cmd = OCMD_ENABLE | OCMD_BUF_TYPE_FRAME | OCMD_BUFFER0; + + if (params->format & I915_OVERLAY_YUV_PLANAR) { + switch (params->format & I915_OVERLAY_DEPTH_MASK) { + case I915_OVERLAY_YUV422: + cmd |= OCMD_YUV_422_PLANAR; + break; + case I915_OVERLAY_YUV420: + cmd |= OCMD_YUV_420_PLANAR; + break; + case I915_OVERLAY_YUV411: + case I915_OVERLAY_YUV410: + cmd |= OCMD_YUV_410_PLANAR; + break; + } + } else { /* YUV packed */ + switch (params->format & I915_OVERLAY_DEPTH_MASK) { + case I915_OVERLAY_YUV422: + cmd |= OCMD_YUV_422_PACKED; + break; + case I915_OVERLAY_YUV411: + cmd |= OCMD_YUV_411_PACKED; + break; + } + + switch (params->format & I915_OVERLAY_SWAP_MASK) { + case I915_OVERLAY_NO_SWAP: + break; + case I915_OVERLAY_UV_SWAP: + cmd |= OCMD_UV_SWAP; + break; + case I915_OVERLAY_Y_SWAP: + cmd |= OCMD_Y_SWAP; + break; + case I915_OVERLAY_Y_AND_UV_SWAP: + cmd |= OCMD_Y_AND_UV_SWAP; + break; + } + } + + return cmd; +} + +static u32 +max_u32(u32 a, u32 b) +{ + + return (a > b ? a : b); +} + +static int intel_overlay_do_put_image(struct intel_overlay *overlay, + struct drm_i915_gem_object *new_bo, + struct put_image_params *params) +{ + int ret, tmp_width; + struct overlay_registers *regs; + bool scale_changed = false; + + KASSERT(overlay != NULL, ("No overlay ?")); + DRM_LOCK_ASSERT(overlay->dev); + DRM_MODE_CONFIG_ASSERT_LOCKED(overlay->dev); + + ret = intel_overlay_release_old_vid(overlay); + if (ret != 0) + return ret; + + ret = i915_gem_object_pin_to_display_plane(new_bo, 0, NULL); + if (ret != 0) + goto out_unpin; + + ret = i915_gem_object_put_fence(new_bo); + if (ret) + goto out_unpin; + + if (!overlay->active) { + regs = intel_overlay_map_regs(overlay); + if (!regs) { + ret = -ENOMEM; + goto out_unpin; + } + regs->OCONFIG = OCONF_CC_OUT_8BIT; + if (IS_GEN4(overlay->dev)) + regs->OCONFIG |= OCONF_CSC_MODE_BT709; + regs->OCONFIG |= overlay->crtc->pipe == 0 ? + OCONF_PIPE_A : OCONF_PIPE_B; + intel_overlay_unmap_regs(overlay, regs); + + ret = intel_overlay_on(overlay); + if (ret != 0) + goto out_unpin; + } + + regs = intel_overlay_map_regs(overlay); + if (!regs) { + ret = -ENOMEM; + goto out_unpin; + } + + regs->DWINPOS = (params->dst_y << 16) | params->dst_x; + regs->DWINSZ = (params->dst_h << 16) | params->dst_w; + + if (params->format & I915_OVERLAY_YUV_PACKED) + tmp_width = packed_width_bytes(params->format, params->src_w); + else + tmp_width = params->src_w; + + regs->SWIDTH = params->src_w; + regs->SWIDTHSW = calc_swidthsw(overlay->dev, + params->offset_Y, tmp_width); + regs->SHEIGHT = params->src_h; + regs->OBUF_0Y = new_bo->gtt_offset + params->offset_Y; + regs->OSTRIDE = params->stride_Y; + + if (params->format & I915_OVERLAY_YUV_PLANAR) { + int uv_hscale = uv_hsubsampling(params->format); + int uv_vscale = uv_vsubsampling(params->format); + u32 tmp_U, tmp_V; + regs->SWIDTH |= (params->src_w/uv_hscale) << 16; + tmp_U = calc_swidthsw(overlay->dev, params->offset_U, + params->src_w/uv_hscale); + tmp_V = calc_swidthsw(overlay->dev, params->offset_V, + params->src_w/uv_hscale); + regs->SWIDTHSW |= max_u32(tmp_U, tmp_V) << 16; + regs->SHEIGHT |= (params->src_h/uv_vscale) << 16; + regs->OBUF_0U = new_bo->gtt_offset + params->offset_U; + regs->OBUF_0V = new_bo->gtt_offset + params->offset_V; + regs->OSTRIDE |= params->stride_UV << 16; + } + + scale_changed = update_scaling_factors(overlay, regs, params); + + update_colorkey(overlay, regs); + + regs->OCMD = overlay_cmd_reg(params); + + intel_overlay_unmap_regs(overlay, regs); + + ret = intel_overlay_continue(overlay, scale_changed); + if (ret) + goto out_unpin; + + overlay->old_vid_bo = overlay->vid_bo; + overlay->vid_bo = new_bo; + + return 0; + +out_unpin: + i915_gem_object_unpin(new_bo); + return ret; +} + +int intel_overlay_switch_off(struct intel_overlay *overlay) +{ + struct overlay_registers *regs; + int ret; + + DRM_LOCK_ASSERT(overlay->dev); + DRM_MODE_CONFIG_ASSERT_LOCKED(overlay->dev); + + ret = intel_overlay_recover_from_interrupt(overlay); + if (ret != 0) + return ret; + + if (!overlay->active) + return 0; + + ret = intel_overlay_release_old_vid(overlay); + if (ret != 0) + return ret; + + regs = intel_overlay_map_regs(overlay); + regs->OCMD = 0; + intel_overlay_unmap_regs(overlay, regs); + + ret = intel_overlay_off(overlay); + if (ret != 0) + return ret; + + intel_overlay_off_tail(overlay); + return 0; +} + +static int check_overlay_possible_on_crtc(struct intel_overlay *overlay, + struct intel_crtc *crtc) +{ + drm_i915_private_t *dev_priv = overlay->dev->dev_private; + + if (!crtc->active) + return -EINVAL; + + /* can't use the overlay with double wide pipe */ + if (INTEL_INFO(overlay->dev)->gen < 4 && + (I915_READ(PIPECONF(crtc->pipe)) & (PIPECONF_DOUBLE_WIDE | PIPECONF_ENABLE)) != PIPECONF_ENABLE) + return -EINVAL; + + return 0; +} + +static void update_pfit_vscale_ratio(struct intel_overlay *overlay) +{ + struct drm_device *dev = overlay->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + u32 pfit_control = I915_READ(PFIT_CONTROL); + u32 ratio; + + /* XXX: This is not the same logic as in the xorg driver, but more in + * line with the intel documentation for the i965 + */ + if (INTEL_INFO(dev)->gen >= 4) { + /* on i965 use the PGM reg to read out the autoscaler values */ + ratio = I915_READ(PFIT_PGM_RATIOS) >> PFIT_VERT_SCALE_SHIFT_965; + } else { + if (pfit_control & VERT_AUTO_SCALE) + ratio = I915_READ(PFIT_AUTO_RATIOS); + else + ratio = I915_READ(PFIT_PGM_RATIOS); + ratio >>= PFIT_VERT_SCALE_SHIFT; + } + + overlay->pfit_vscale_ratio = ratio; +} + +static int check_overlay_dst(struct intel_overlay *overlay, + struct drm_intel_overlay_put_image *rec) +{ + struct drm_display_mode *mode = &overlay->crtc->base.mode; + + if (rec->dst_x < mode->hdisplay && + rec->dst_x + rec->dst_width <= mode->hdisplay && + rec->dst_y < mode->vdisplay && + rec->dst_y + rec->dst_height <= mode->vdisplay) + return 0; + else + return -EINVAL; +} + +static int check_overlay_scaling(struct put_image_params *rec) +{ + u32 tmp; + + /* downscaling limit is 8.0 */ + tmp = ((rec->src_scan_h << 16) / rec->dst_h) >> 16; + if (tmp > 7) + return -EINVAL; + tmp = ((rec->src_scan_w << 16) / rec->dst_w) >> 16; + if (tmp > 7) + return -EINVAL; + + return 0; +} + +static int check_overlay_src(struct drm_device *dev, + struct drm_intel_overlay_put_image *rec, + struct drm_i915_gem_object *new_bo) +{ + int uv_hscale = uv_hsubsampling(rec->flags); + int uv_vscale = uv_vsubsampling(rec->flags); + u32 stride_mask; + int depth; + u32 tmp; + + /* check src dimensions */ + if (IS_845G(dev) || IS_I830(dev)) { + if (rec->src_height > IMAGE_MAX_HEIGHT_LEGACY || + rec->src_width > IMAGE_MAX_WIDTH_LEGACY) + return -EINVAL; + } else { + if (rec->src_height > IMAGE_MAX_HEIGHT || + rec->src_width > IMAGE_MAX_WIDTH) + return -EINVAL; + } + + /* better safe than sorry, use 4 as the maximal subsampling ratio */ + if (rec->src_height < N_VERT_Y_TAPS*4 || + rec->src_width < N_HORIZ_Y_TAPS*4) + return -EINVAL; + + /* check alignment constraints */ + switch (rec->flags & I915_OVERLAY_TYPE_MASK) { + case I915_OVERLAY_RGB: + /* not implemented */ + return -EINVAL; + + case I915_OVERLAY_YUV_PACKED: + if (uv_vscale != 1) + return -EINVAL; + + depth = packed_depth_bytes(rec->flags); + if (depth < 0) + return depth; + + /* ignore UV planes */ + rec->stride_UV = 0; + rec->offset_U = 0; + rec->offset_V = 0; + /* check pixel alignment */ + if (rec->offset_Y % depth) + return -EINVAL; + break; + + case I915_OVERLAY_YUV_PLANAR: + if (uv_vscale < 0 || uv_hscale < 0) + return -EINVAL; + /* no offset restrictions for planar formats */ + break; + + default: + return -EINVAL; + } + + if (rec->src_width % uv_hscale) + return -EINVAL; + + /* stride checking */ + if (IS_I830(dev) || IS_845G(dev)) + stride_mask = 255; + else + stride_mask = 63; + + if (rec->stride_Y & stride_mask || rec->stride_UV & stride_mask) + return -EINVAL; + if (IS_GEN4(dev) && rec->stride_Y < 512) + return -EINVAL; + + tmp = (rec->flags & I915_OVERLAY_TYPE_MASK) == I915_OVERLAY_YUV_PLANAR ? + 4096 : 8192; + if (rec->stride_Y > tmp || rec->stride_UV > 2*1024) + return -EINVAL; + + /* check buffer dimensions */ + switch (rec->flags & I915_OVERLAY_TYPE_MASK) { + case I915_OVERLAY_RGB: + case I915_OVERLAY_YUV_PACKED: + /* always 4 Y values per depth pixels */ + if (packed_width_bytes(rec->flags, rec->src_width) > rec->stride_Y) + return -EINVAL; + + tmp = rec->stride_Y*rec->src_height; + if (rec->offset_Y + tmp > new_bo->base.size) + return -EINVAL; + break; + + case I915_OVERLAY_YUV_PLANAR: + if (rec->src_width > rec->stride_Y) + return -EINVAL; + if (rec->src_width/uv_hscale > rec->stride_UV) + return -EINVAL; + + tmp = rec->stride_Y * rec->src_height; + if (rec->offset_Y + tmp > new_bo->base.size) + return -EINVAL; + + tmp = rec->stride_UV * (rec->src_height / uv_vscale); + if (rec->offset_U + tmp > new_bo->base.size || + rec->offset_V + tmp > new_bo->base.size) + return -EINVAL; + break; + } + + return 0; +} + +/** + * Return the pipe currently connected to the panel fitter, + * or -1 if the panel fitter is not present or not in use + */ +static int intel_panel_fitter_pipe(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 pfit_control; + + /* i830 doesn't have a panel fitter */ + if (IS_I830(dev)) + return -1; + + pfit_control = I915_READ(PFIT_CONTROL); + + /* See if the panel fitter is in use */ + if ((pfit_control & PFIT_ENABLE) == 0) + return -1; + + /* 965 can place panel fitter on either pipe */ + if (IS_GEN4(dev)) + return (pfit_control >> 29) & 0x3; + + /* older chips can only use pipe 1 */ + return 1; +} + +int intel_overlay_put_image(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_intel_overlay_put_image *put_image_rec = data; + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_overlay *overlay; + struct drm_mode_object *drmmode_obj; + struct intel_crtc *crtc; + struct drm_i915_gem_object *new_bo; + struct put_image_params *params; + int ret; + + if (!dev_priv) { + DRM_ERROR("called with no initialization\n"); + return -EINVAL; + } + + overlay = dev_priv->overlay; + if (!overlay) { + DRM_DEBUG("userspace bug: no overlay\n"); + return -ENODEV; + } + + if (!(put_image_rec->flags & I915_OVERLAY_ENABLE)) { + sx_xlock(&dev->mode_config.mutex); + DRM_LOCK(dev); + + ret = intel_overlay_switch_off(overlay); + + DRM_UNLOCK(dev); + sx_xunlock(&dev->mode_config.mutex); + + return ret; + } + + params = malloc(sizeof(struct put_image_params), DRM_I915_GEM, + M_WAITOK | M_ZERO); + + drmmode_obj = drm_mode_object_find(dev, put_image_rec->crtc_id, + DRM_MODE_OBJECT_CRTC); + if (!drmmode_obj) { + ret = -ENOENT; + goto out_free; + } + crtc = to_intel_crtc(obj_to_crtc(drmmode_obj)); + + new_bo = to_intel_bo(drm_gem_object_lookup(dev, file_priv, + put_image_rec->bo_handle)); + if (&new_bo->base == NULL) { + ret = -ENOENT; + goto out_free; + } + + sx_xlock(&dev->mode_config.mutex); + DRM_LOCK(dev); + + if (new_bo->tiling_mode) { + DRM_ERROR("buffer used for overlay image can not be tiled\n"); + ret = -EINVAL; + goto out_unlock; + } + + ret = intel_overlay_recover_from_interrupt(overlay); + if (ret != 0) + goto out_unlock; + + if (overlay->crtc != crtc) { + struct drm_display_mode *mode = &crtc->base.mode; + ret = intel_overlay_switch_off(overlay); + if (ret != 0) + goto out_unlock; + + ret = check_overlay_possible_on_crtc(overlay, crtc); + if (ret != 0) + goto out_unlock; + + overlay->crtc = crtc; + crtc->overlay = overlay; + + /* line too wide, i.e. one-line-mode */ + if (mode->hdisplay > 1024 && + intel_panel_fitter_pipe(dev) == crtc->pipe) { + overlay->pfit_active = 1; + update_pfit_vscale_ratio(overlay); + } else + overlay->pfit_active = 0; + } + + ret = check_overlay_dst(overlay, put_image_rec); + if (ret != 0) + goto out_unlock; + + if (overlay->pfit_active) { + params->dst_y = ((((u32)put_image_rec->dst_y) << 12) / + overlay->pfit_vscale_ratio); + /* shifting right rounds downwards, so add 1 */ + params->dst_h = ((((u32)put_image_rec->dst_height) << 12) / + overlay->pfit_vscale_ratio) + 1; + } else { + params->dst_y = put_image_rec->dst_y; + params->dst_h = put_image_rec->dst_height; + } + params->dst_x = put_image_rec->dst_x; + params->dst_w = put_image_rec->dst_width; + + params->src_w = put_image_rec->src_width; + params->src_h = put_image_rec->src_height; + params->src_scan_w = put_image_rec->src_scan_width; + params->src_scan_h = put_image_rec->src_scan_height; + if (params->src_scan_h > params->src_h || + params->src_scan_w > params->src_w) { + ret = -EINVAL; + goto out_unlock; + } + + ret = check_overlay_src(dev, put_image_rec, new_bo); + if (ret != 0) + goto out_unlock; + params->format = put_image_rec->flags & ~I915_OVERLAY_FLAGS_MASK; + params->stride_Y = put_image_rec->stride_Y; + params->stride_UV = put_image_rec->stride_UV; + params->offset_Y = put_image_rec->offset_Y; + params->offset_U = put_image_rec->offset_U; + params->offset_V = put_image_rec->offset_V; + + /* Check scaling after src size to prevent a divide-by-zero. */ + ret = check_overlay_scaling(params); + if (ret != 0) + goto out_unlock; + + ret = intel_overlay_do_put_image(overlay, new_bo, params); + if (ret != 0) + goto out_unlock; + + DRM_UNLOCK(dev); + sx_xunlock(&dev->mode_config.mutex); + + free(params, DRM_I915_GEM); + + return 0; + +out_unlock: + DRM_UNLOCK(dev); + sx_xunlock(&dev->mode_config.mutex); + drm_gem_object_unreference_unlocked(&new_bo->base); +out_free: + free(params, DRM_I915_GEM); + + return ret; +} + +static void update_reg_attrs(struct intel_overlay *overlay, + struct overlay_registers *regs) +{ + regs->OCLRC0 = (overlay->contrast << 18) | (overlay->brightness & 0xff); + regs->OCLRC1 = overlay->saturation; +} + +static bool check_gamma_bounds(u32 gamma1, u32 gamma2) +{ + int i; + + if (gamma1 & 0xff000000 || gamma2 & 0xff000000) + return false; + + for (i = 0; i < 3; i++) { + if (((gamma1 >> i*8) & 0xff) >= ((gamma2 >> i*8) & 0xff)) + return false; + } + + return true; +} + +static bool check_gamma5_errata(u32 gamma5) +{ + int i; + + for (i = 0; i < 3; i++) { + if (((gamma5 >> i*8) & 0xff) == 0x80) + return false; + } + + return true; +} + +static int check_gamma(struct drm_intel_overlay_attrs *attrs) +{ + if (!check_gamma_bounds(0, attrs->gamma0) || + !check_gamma_bounds(attrs->gamma0, attrs->gamma1) || + !check_gamma_bounds(attrs->gamma1, attrs->gamma2) || + !check_gamma_bounds(attrs->gamma2, attrs->gamma3) || + !check_gamma_bounds(attrs->gamma3, attrs->gamma4) || + !check_gamma_bounds(attrs->gamma4, attrs->gamma5) || + !check_gamma_bounds(attrs->gamma5, 0x00ffffff)) + return -EINVAL; + + if (!check_gamma5_errata(attrs->gamma5)) + return -EINVAL; + + return 0; +} + +int intel_overlay_attrs(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_intel_overlay_attrs *attrs = data; + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_overlay *overlay; + struct overlay_registers *regs; + int ret; + + if (!dev_priv) { + DRM_ERROR("called with no initialization\n"); + return -EINVAL; + } + + overlay = dev_priv->overlay; + if (!overlay) { + DRM_DEBUG("userspace bug: no overlay\n"); + return -ENODEV; + } + + sx_xlock(&dev->mode_config.mutex); + DRM_LOCK(dev); + + ret = -EINVAL; + if (!(attrs->flags & I915_OVERLAY_UPDATE_ATTRS)) { + attrs->color_key = overlay->color_key; + attrs->brightness = overlay->brightness; + attrs->contrast = overlay->contrast; + attrs->saturation = overlay->saturation; + + if (!IS_GEN2(dev)) { + attrs->gamma0 = I915_READ(OGAMC0); + attrs->gamma1 = I915_READ(OGAMC1); + attrs->gamma2 = I915_READ(OGAMC2); + attrs->gamma3 = I915_READ(OGAMC3); + attrs->gamma4 = I915_READ(OGAMC4); + attrs->gamma5 = I915_READ(OGAMC5); + } + } else { + if (attrs->brightness < -128 || attrs->brightness > 127) + goto out_unlock; + if (attrs->contrast > 255) + goto out_unlock; + if (attrs->saturation > 1023) + goto out_unlock; + + overlay->color_key = attrs->color_key; + overlay->brightness = attrs->brightness; + overlay->contrast = attrs->contrast; + overlay->saturation = attrs->saturation; + + regs = intel_overlay_map_regs(overlay); + if (!regs) { + ret = -ENOMEM; + goto out_unlock; + } + + update_reg_attrs(overlay, regs); + + intel_overlay_unmap_regs(overlay, regs); + + if (attrs->flags & I915_OVERLAY_UPDATE_GAMMA) { + if (IS_GEN2(dev)) + goto out_unlock; + + if (overlay->active) { + ret = -EBUSY; + goto out_unlock; + } + + ret = check_gamma(attrs); + if (ret) + goto out_unlock; + + I915_WRITE(OGAMC0, attrs->gamma0); + I915_WRITE(OGAMC1, attrs->gamma1); + I915_WRITE(OGAMC2, attrs->gamma2); + I915_WRITE(OGAMC3, attrs->gamma3); + I915_WRITE(OGAMC4, attrs->gamma4); + I915_WRITE(OGAMC5, attrs->gamma5); + } + } + + ret = 0; +out_unlock: + DRM_UNLOCK(dev); + sx_xunlock(&dev->mode_config.mutex); + + return ret; +} + +void intel_setup_overlay(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_overlay *overlay; + struct drm_i915_gem_object *reg_bo; + struct overlay_registers *regs; + int ret; + + if (!HAS_OVERLAY(dev)) + return; + + overlay = malloc(sizeof(struct intel_overlay), DRM_I915_GEM, + M_WAITOK | M_ZERO); + DRM_LOCK(dev); + if (dev_priv->overlay != NULL) + goto out_free; + overlay->dev = dev; + + reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE); + if (!reg_bo) + goto out_free; + overlay->reg_bo = reg_bo; + + if (OVERLAY_NEEDS_PHYSICAL(dev)) { + ret = i915_gem_attach_phys_object(dev, reg_bo, + I915_GEM_PHYS_OVERLAY_REGS, + PAGE_SIZE); + if (ret) { + DRM_ERROR("failed to attach phys overlay regs\n"); + goto out_free_bo; + } + overlay->flip_addr = reg_bo->phys_obj->handle->busaddr; + } else { + ret = i915_gem_object_pin(reg_bo, PAGE_SIZE, true); + if (ret) { + DRM_ERROR("failed to pin overlay register bo\n"); + goto out_free_bo; + } + overlay->flip_addr = reg_bo->gtt_offset; + + ret = i915_gem_object_set_to_gtt_domain(reg_bo, true); + if (ret) { + DRM_ERROR("failed to move overlay register bo into the GTT\n"); + goto out_unpin_bo; + } + } + + /* init all values */ + overlay->color_key = 0x0101fe; + overlay->brightness = -19; + overlay->contrast = 75; + overlay->saturation = 146; + + regs = intel_overlay_map_regs(overlay); + if (!regs) + goto out_unpin_bo; + + memset(regs, 0, sizeof(struct overlay_registers)); + update_polyphase_filter(regs); + update_reg_attrs(overlay, regs); + + intel_overlay_unmap_regs(overlay, regs); + + dev_priv->overlay = overlay; + DRM_INFO("initialized overlay support\n"); + DRM_UNLOCK(dev); + return; + +out_unpin_bo: + if (!OVERLAY_NEEDS_PHYSICAL(dev)) + i915_gem_object_unpin(reg_bo); +out_free_bo: + drm_gem_object_unreference(®_bo->base); +out_free: + DRM_UNLOCK(dev); + free(overlay, DRM_I915_GEM); + return; +} + +void intel_cleanup_overlay(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + + if (!dev_priv->overlay) + return; + + /* The bo's should be free'd by the generic code already. + * Furthermore modesetting teardown happens beforehand so the + * hardware should be off already */ + KASSERT(!dev_priv->overlay->active, ("Overlay still active")); + + drm_gem_object_unreference_unlocked(&dev_priv->overlay->reg_bo->base); + free(dev_priv->overlay, DRM_I915_GEM); +} + +struct intel_overlay_error_state { + struct overlay_registers regs; + unsigned long base; + u32 dovsta; + u32 isr; +}; + +struct intel_overlay_error_state * +intel_overlay_capture_error_state(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_overlay *overlay = dev_priv->overlay; + struct intel_overlay_error_state *error; + struct overlay_registers __iomem *regs; + + if (!overlay || !overlay->active) + return NULL; + + error = malloc(sizeof(*error), DRM_I915_GEM, M_NOWAIT); + if (error == NULL) + return NULL; + + error->dovsta = I915_READ(DOVSTA); + error->isr = I915_READ(ISR); + if (OVERLAY_NEEDS_PHYSICAL(overlay->dev)) + error->base = (long) overlay->reg_bo->phys_obj->handle->vaddr; + else + error->base = (long) overlay->reg_bo->gtt_offset; + + regs = intel_overlay_map_regs(overlay); + if (!regs) + goto err; + + memcpy(&error->regs, regs, sizeof(struct overlay_registers)); + intel_overlay_unmap_regs(overlay, regs); + + return (error); + +err: + free(error, DRM_I915_GEM); + return (NULL); +} + +void +intel_overlay_print_error_state(struct sbuf *m, + struct intel_overlay_error_state *error) +{ + sbuf_printf(m, "Overlay, status: 0x%08x, interrupt: 0x%08x\n", + error->dovsta, error->isr); + sbuf_printf(m, " Register file at 0x%08lx:\n", + error->base); + +#define P(x) sbuf_printf(m, " " #x ": 0x%08x\n", error->regs.x) + P(OBUF_0Y); + P(OBUF_1Y); + P(OBUF_0U); + P(OBUF_0V); + P(OBUF_1U); + P(OBUF_1V); + P(OSTRIDE); + P(YRGB_VPH); + P(UV_VPH); + P(HORZ_PH); + P(INIT_PHS); + P(DWINPOS); + P(DWINSZ); + P(SWIDTH); + P(SWIDTHSW); + P(SHEIGHT); + P(YRGBSCALE); + P(UVSCALE); + P(OCLRC0); + P(OCLRC1); + P(DCLRKV); + P(DCLRKM); + P(SCLRKVH); + P(SCLRKVL); + P(SCLRKEN); + P(OCONFIG); + P(OCMD); + P(OSTART_0Y); + P(OSTART_1Y); + P(OSTART_0U); + P(OSTART_0V); + P(OSTART_1U); + P(OSTART_1V); + P(OTILEOFF_0Y); + P(OTILEOFF_1Y); + P(OTILEOFF_0U); + P(OTILEOFF_0V); + P(OTILEOFF_1U); + P(OTILEOFF_1V); + P(FASTHSCALE); + P(UVSCALEV); +#undef P +} diff --git a/sys/dev/drm2/i915/intel_panel.c b/sys/dev/drm2/i915/intel_panel.c new file mode 100644 index 00000000000..815848b2208 --- /dev/null +++ b/sys/dev/drm2/i915/intel_panel.c @@ -0,0 +1,327 @@ +/* + * Copyright © 2006-2010 Intel Corporation + * Copyright (c) 2006 Dave Airlie + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * Dave Airlie + * Jesse Barnes + * Chris Wilson + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#define PCI_LBPC 0xf4 /* legacy/combination backlight modes */ + +void +intel_fixed_panel_mode(struct drm_display_mode *fixed_mode, + struct drm_display_mode *adjusted_mode) +{ + adjusted_mode->hdisplay = fixed_mode->hdisplay; + adjusted_mode->hsync_start = fixed_mode->hsync_start; + adjusted_mode->hsync_end = fixed_mode->hsync_end; + adjusted_mode->htotal = fixed_mode->htotal; + + adjusted_mode->vdisplay = fixed_mode->vdisplay; + adjusted_mode->vsync_start = fixed_mode->vsync_start; + adjusted_mode->vsync_end = fixed_mode->vsync_end; + adjusted_mode->vtotal = fixed_mode->vtotal; + + adjusted_mode->clock = fixed_mode->clock; +} + +/* adjusted_mode has been preset to be the panel's fixed mode */ +void +intel_pch_panel_fitting(struct drm_device *dev, + int fitting_mode, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + int x, y, width, height; + + x = y = width = height = 0; + + /* Native modes don't need fitting */ + if (adjusted_mode->hdisplay == mode->hdisplay && + adjusted_mode->vdisplay == mode->vdisplay) + goto done; + + switch (fitting_mode) { + case DRM_MODE_SCALE_CENTER: + width = mode->hdisplay; + height = mode->vdisplay; + x = (adjusted_mode->hdisplay - width + 1)/2; + y = (adjusted_mode->vdisplay - height + 1)/2; + break; + + case DRM_MODE_SCALE_ASPECT: + /* Scale but preserve the aspect ratio */ + { + u32 scaled_width = adjusted_mode->hdisplay * mode->vdisplay; + u32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay; + if (scaled_width > scaled_height) { /* pillar */ + width = scaled_height / mode->vdisplay; + if (width & 1) + width++; + x = (adjusted_mode->hdisplay - width + 1) / 2; + y = 0; + height = adjusted_mode->vdisplay; + } else if (scaled_width < scaled_height) { /* letter */ + height = scaled_width / mode->hdisplay; + if (height & 1) + height++; + y = (adjusted_mode->vdisplay - height + 1) / 2; + x = 0; + width = adjusted_mode->hdisplay; + } else { + x = y = 0; + width = adjusted_mode->hdisplay; + height = adjusted_mode->vdisplay; + } + } + break; + + default: + case DRM_MODE_SCALE_FULLSCREEN: + x = y = 0; + width = adjusted_mode->hdisplay; + height = adjusted_mode->vdisplay; + break; + } + +done: + dev_priv->pch_pf_pos = (x << 16) | y; + dev_priv->pch_pf_size = (width << 16) | height; +} + +static int is_backlight_combination_mode(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + if (INTEL_INFO(dev)->gen >= 4) + return I915_READ(BLC_PWM_CTL2) & BLM_COMBINATION_MODE; + + if (IS_GEN2(dev)) + return I915_READ(BLC_PWM_CTL) & BLM_LEGACY_MODE; + + return 0; +} + +static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv) +{ + u32 val; + + /* Restore the CTL value if it lost, e.g. GPU reset */ + + if (HAS_PCH_SPLIT(dev_priv->dev)) { + val = I915_READ(BLC_PWM_PCH_CTL2); + if (dev_priv->saveBLC_PWM_CTL2 == 0) { + dev_priv->saveBLC_PWM_CTL2 = val; + } else if (val == 0) { + I915_WRITE(BLC_PWM_PCH_CTL2, + dev_priv->saveBLC_PWM_CTL2); + val = dev_priv->saveBLC_PWM_CTL2; + } + } else { + val = I915_READ(BLC_PWM_CTL); + if (dev_priv->saveBLC_PWM_CTL == 0) { + dev_priv->saveBLC_PWM_CTL = val; + dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2); + } else if (val == 0) { + I915_WRITE(BLC_PWM_CTL, + dev_priv->saveBLC_PWM_CTL); + I915_WRITE(BLC_PWM_CTL2, + dev_priv->saveBLC_PWM_CTL2); + val = dev_priv->saveBLC_PWM_CTL; + } + } + + return val; +} + +u32 intel_panel_get_max_backlight(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 max; + + max = i915_read_blc_pwm_ctl(dev_priv); + if (max == 0) { + /* XXX add code here to query mode clock or hardware clock + * and program max PWM appropriately. + */ +#if 0 + printf("fixme: max PWM is zero.\n"); +#endif + return 1; + } + + if (HAS_PCH_SPLIT(dev)) { + max >>= 16; + } else { + if (INTEL_INFO(dev)->gen < 4) + max >>= 17; + else + max >>= 16; + + if (is_backlight_combination_mode(dev)) + max *= 0xff; + } + + DRM_DEBUG("max backlight PWM = %d\n", max); + return max; +} + +u32 intel_panel_get_backlight(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 val; + + if (HAS_PCH_SPLIT(dev)) { + val = I915_READ(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; + } else { + val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; + if (INTEL_INFO(dev)->gen < 4) + val >>= 1; + + if (is_backlight_combination_mode(dev)) { + u8 lbpc; + + lbpc = pci_read_config(dev->device, PCI_LBPC, 1); + val *= lbpc; + } + } + + DRM_DEBUG("get backlight PWM = %d\n", val); + return val; +} + +static void intel_pch_panel_set_backlight(struct drm_device *dev, u32 level) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 val = I915_READ(BLC_PWM_CPU_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK; + I915_WRITE(BLC_PWM_CPU_CTL, val | level); +} + +static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + u32 tmp; + + DRM_DEBUG("set backlight PWM = %d\n", level); + + if (HAS_PCH_SPLIT(dev)) + return intel_pch_panel_set_backlight(dev, level); + + if (is_backlight_combination_mode(dev)) { + u32 max = intel_panel_get_max_backlight(dev); + u8 lbpc; + + lbpc = level * 0xfe / max + 1; + level /= lbpc; + pci_write_config(dev->device, PCI_LBPC, lbpc, 4); + } + + tmp = I915_READ(BLC_PWM_CTL); + if (INTEL_INFO(dev)->gen < 4) + level <<= 1; + tmp &= ~BACKLIGHT_DUTY_CYCLE_MASK; + I915_WRITE(BLC_PWM_CTL, tmp | level); +} + +void intel_panel_set_backlight(struct drm_device *dev, u32 level) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + dev_priv->backlight_level = level; + if (dev_priv->backlight_enabled) + intel_panel_actually_set_backlight(dev, level); +} + +void intel_panel_disable_backlight(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + dev_priv->backlight_enabled = false; + intel_panel_actually_set_backlight(dev, 0); +} + +void intel_panel_enable_backlight(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + if (dev_priv->backlight_level == 0) + dev_priv->backlight_level = intel_panel_get_max_backlight(dev); + + dev_priv->backlight_enabled = true; + intel_panel_actually_set_backlight(dev, dev_priv->backlight_level); +} + +static void intel_panel_init_backlight(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + + dev_priv->backlight_level = intel_panel_get_backlight(dev); + dev_priv->backlight_enabled = dev_priv->backlight_level != 0; +} + +enum drm_connector_status +intel_panel_detect(struct drm_device *dev) +{ +#if 0 + struct drm_i915_private *dev_priv = dev->dev_private; +#endif + + if (i915_panel_ignore_lid) + return i915_panel_ignore_lid > 0 ? + connector_status_connected : + connector_status_disconnected; + + /* opregion lid state on HP 2540p is wrong at boot up, + * appears to be either the BIOS or Linux ACPI fault */ +#if 0 + /* Assume that the BIOS does not lie through the OpRegion... */ + if (dev_priv->opregion.lid_state) + return ioread32(dev_priv->opregion.lid_state) & 0x1 ? + connector_status_connected : + connector_status_disconnected; +#endif + + return connector_status_unknown; +} + +int intel_panel_setup_backlight(struct drm_device *dev) +{ + intel_panel_init_backlight(dev); + return 0; +} + +void intel_panel_destroy_backlight(struct drm_device *dev) +{ + return; +} diff --git a/sys/dev/drm2/i915/intel_ringbuffer.c b/sys/dev/drm2/i915/intel_ringbuffer.c new file mode 100644 index 00000000000..c0b752b2b79 --- /dev/null +++ b/sys/dev/drm2/i915/intel_ringbuffer.c @@ -0,0 +1,1623 @@ +/* + * Copyright © 2008-2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * Zou Nan hai + * Xiang Hai hao + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * 965+ support PIPE_CONTROL commands, which provide finer grained control + * over cache flushing. + */ +struct pipe_control { + struct drm_i915_gem_object *obj; + volatile u32 *cpu_page; + u32 gtt_offset; +}; + +void +i915_trace_irq_get(struct intel_ring_buffer *ring, uint32_t seqno) +{ + + if (ring->trace_irq_seqno == 0) { + mtx_lock(&ring->irq_lock); + if (ring->irq_get(ring)) + ring->trace_irq_seqno = seqno; + mtx_unlock(&ring->irq_lock); + } +} + +static inline int ring_space(struct intel_ring_buffer *ring) +{ + int space = (ring->head & HEAD_ADDR) - (ring->tail + 8); + if (space < 0) + space += ring->size; + return space; +} + +static int +render_ring_flush(struct intel_ring_buffer *ring, + uint32_t invalidate_domains, + uint32_t flush_domains) +{ + struct drm_device *dev = ring->dev; + uint32_t cmd; + int ret; + + /* + * read/write caches: + * + * I915_GEM_DOMAIN_RENDER is always invalidated, but is + * only flushed if MI_NO_WRITE_FLUSH is unset. On 965, it is + * also flushed at 2d versus 3d pipeline switches. + * + * read-only caches: + * + * I915_GEM_DOMAIN_SAMPLER is flushed on pre-965 if + * MI_READ_FLUSH is set, and is always flushed on 965. + * + * I915_GEM_DOMAIN_COMMAND may not exist? + * + * I915_GEM_DOMAIN_INSTRUCTION, which exists on 965, is + * invalidated when MI_EXE_FLUSH is set. + * + * I915_GEM_DOMAIN_VERTEX, which exists on 965, is + * invalidated with every MI_FLUSH. + * + * TLBs: + * + * On 965, TLBs associated with I915_GEM_DOMAIN_COMMAND + * and I915_GEM_DOMAIN_CPU in are invalidated at PTE write and + * I915_GEM_DOMAIN_RENDER and I915_GEM_DOMAIN_SAMPLER + * are flushed at any MI_FLUSH. + */ + + cmd = MI_FLUSH | MI_NO_WRITE_FLUSH; + if ((invalidate_domains|flush_domains) & + I915_GEM_DOMAIN_RENDER) + cmd &= ~MI_NO_WRITE_FLUSH; + if (INTEL_INFO(dev)->gen < 4) { + /* + * On the 965, the sampler cache always gets flushed + * and this bit is reserved. + */ + if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER) + cmd |= MI_READ_FLUSH; + } + if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION) + cmd |= MI_EXE_FLUSH; + + if (invalidate_domains & I915_GEM_DOMAIN_COMMAND && + (IS_G4X(dev) || IS_GEN5(dev))) + cmd |= MI_INVALIDATE_ISP; + + ret = intel_ring_begin(ring, 2); + if (ret) + return ret; + + intel_ring_emit(ring, cmd); + intel_ring_emit(ring, MI_NOOP); + intel_ring_advance(ring); + + return 0; +} + +/** + * Emits a PIPE_CONTROL with a non-zero post-sync operation, for + * implementing two workarounds on gen6. From section 1.4.7.1 + * "PIPE_CONTROL" of the Sandy Bridge PRM volume 2 part 1: + * + * [DevSNB-C+{W/A}] Before any depth stall flush (including those + * produced by non-pipelined state commands), software needs to first + * send a PIPE_CONTROL with no bits set except Post-Sync Operation != + * 0. + * + * [Dev-SNB{W/A}]: Before a PIPE_CONTROL with Write Cache Flush Enable + * =1, a PIPE_CONTROL with any non-zero post-sync-op is required. + * + * And the workaround for these two requires this workaround first: + * + * [Dev-SNB{W/A}]: Pipe-control with CS-stall bit set must be sent + * BEFORE the pipe-control with a post-sync op and no write-cache + * flushes. + * + * And this last workaround is tricky because of the requirements on + * that bit. From section 1.4.7.2.3 "Stall" of the Sandy Bridge PRM + * volume 2 part 1: + * + * "1 of the following must also be set: + * - Render Target Cache Flush Enable ([12] of DW1) + * - Depth Cache Flush Enable ([0] of DW1) + * - Stall at Pixel Scoreboard ([1] of DW1) + * - Depth Stall ([13] of DW1) + * - Post-Sync Operation ([13] of DW1) + * - Notify Enable ([8] of DW1)" + * + * The cache flushes require the workaround flush that triggered this + * one, so we can't use it. Depth stall would trigger the same. + * Post-sync nonzero is what triggered this second workaround, so we + * can't use that one either. Notify enable is IRQs, which aren't + * really our business. That leaves only stall at scoreboard. + */ +static int +intel_emit_post_sync_nonzero_flush(struct intel_ring_buffer *ring) +{ + struct pipe_control *pc = ring->private; + u32 scratch_addr = pc->gtt_offset + 128; + int ret; + + + ret = intel_ring_begin(ring, 6); + if (ret) + return ret; + + intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5)); + intel_ring_emit(ring, PIPE_CONTROL_CS_STALL | + PIPE_CONTROL_STALL_AT_SCOREBOARD); + intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); /* address */ + intel_ring_emit(ring, 0); /* low dword */ + intel_ring_emit(ring, 0); /* high dword */ + intel_ring_emit(ring, MI_NOOP); + intel_ring_advance(ring); + + ret = intel_ring_begin(ring, 6); + if (ret) + return ret; + + intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5)); + intel_ring_emit(ring, PIPE_CONTROL_QW_WRITE); + intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); /* address */ + intel_ring_emit(ring, 0); + intel_ring_emit(ring, 0); + intel_ring_emit(ring, MI_NOOP); + intel_ring_advance(ring); + + return 0; +} + +static int +gen6_render_ring_flush(struct intel_ring_buffer *ring, + u32 invalidate_domains, u32 flush_domains) +{ + u32 flags = 0; + struct pipe_control *pc = ring->private; + u32 scratch_addr = pc->gtt_offset + 128; + int ret; + + /* Force SNB workarounds for PIPE_CONTROL flushes */ + intel_emit_post_sync_nonzero_flush(ring); + + /* Just flush everything. Experiments have shown that reducing the + * number of bits based on the write domains has little performance + * impact. + */ + flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH; + flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE; + flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE; + flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH; + flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; + flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; + flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; + + ret = intel_ring_begin(ring, 6); + if (ret) + return ret; + + intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5)); + intel_ring_emit(ring, flags); + intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); + intel_ring_emit(ring, 0); /* lower dword */ + intel_ring_emit(ring, 0); /* uppwer dword */ + intel_ring_emit(ring, MI_NOOP); + intel_ring_advance(ring); + + return 0; +} + +static void ring_write_tail(struct intel_ring_buffer *ring, + uint32_t value) +{ + drm_i915_private_t *dev_priv = ring->dev->dev_private; + I915_WRITE_TAIL(ring, value); +} + +u32 intel_ring_get_active_head(struct intel_ring_buffer *ring) +{ + drm_i915_private_t *dev_priv = ring->dev->dev_private; + uint32_t acthd_reg = INTEL_INFO(ring->dev)->gen >= 4 ? + RING_ACTHD(ring->mmio_base) : ACTHD; + + return I915_READ(acthd_reg); +} + +static int init_ring_common(struct intel_ring_buffer *ring) +{ + drm_i915_private_t *dev_priv = ring->dev->dev_private; + struct drm_i915_gem_object *obj = ring->obj; + uint32_t head; + + /* Stop the ring if it's running. */ + I915_WRITE_CTL(ring, 0); + I915_WRITE_HEAD(ring, 0); + ring->write_tail(ring, 0); + + /* Initialize the ring. */ + I915_WRITE_START(ring, obj->gtt_offset); + head = I915_READ_HEAD(ring) & HEAD_ADDR; + + /* G45 ring initialization fails to reset head to zero */ + if (head != 0) { + DRM_DEBUG("%s head not reset to zero " + "ctl %08x head %08x tail %08x start %08x\n", + ring->name, + I915_READ_CTL(ring), + I915_READ_HEAD(ring), + I915_READ_TAIL(ring), + I915_READ_START(ring)); + + I915_WRITE_HEAD(ring, 0); + + if (I915_READ_HEAD(ring) & HEAD_ADDR) { + DRM_ERROR("failed to set %s head to zero " + "ctl %08x head %08x tail %08x start %08x\n", + ring->name, + I915_READ_CTL(ring), + I915_READ_HEAD(ring), + I915_READ_TAIL(ring), + I915_READ_START(ring)); + } + } + + I915_WRITE_CTL(ring, + ((ring->size - PAGE_SIZE) & RING_NR_PAGES) + | RING_VALID); + + /* If the head is still not zero, the ring is dead */ + if (_intel_wait_for(ring->dev, + (I915_READ_CTL(ring) & RING_VALID) != 0 && + I915_READ_START(ring) == obj->gtt_offset && + (I915_READ_HEAD(ring) & HEAD_ADDR) == 0, + 50, 1, "915rii")) { + DRM_ERROR("%s initialization failed " + "ctl %08x head %08x tail %08x start %08x\n", + ring->name, + I915_READ_CTL(ring), + I915_READ_HEAD(ring), + I915_READ_TAIL(ring), + I915_READ_START(ring)); + return -EIO; + } + + if (!drm_core_check_feature(ring->dev, DRIVER_MODESET)) + i915_kernel_lost_context(ring->dev); + else { + ring->head = I915_READ_HEAD(ring); + ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR; + ring->space = ring_space(ring); + } + + return 0; +} + +static int +init_pipe_control(struct intel_ring_buffer *ring) +{ + struct pipe_control *pc; + struct drm_i915_gem_object *obj; + int ret; + + if (ring->private) + return 0; + + pc = malloc(sizeof(*pc), DRM_I915_GEM, M_WAITOK); + if (!pc) + return -ENOMEM; + + obj = i915_gem_alloc_object(ring->dev, 4096); + if (obj == NULL) { + DRM_ERROR("Failed to allocate seqno page\n"); + ret = -ENOMEM; + goto err; + } + + i915_gem_object_set_cache_level(obj, I915_CACHE_LLC); + + ret = i915_gem_object_pin(obj, 4096, true); + if (ret) + goto err_unref; + + pc->gtt_offset = obj->gtt_offset; + pc->cpu_page = (uint32_t *)kmem_alloc_nofault(kernel_map, PAGE_SIZE); + if (pc->cpu_page == NULL) + goto err_unpin; + pmap_qenter((uintptr_t)pc->cpu_page, &obj->pages[0], 1); + pmap_invalidate_range(kernel_pmap, (vm_offset_t)pc->cpu_page, + (vm_offset_t)pc->cpu_page + PAGE_SIZE); + pmap_invalidate_cache_range((vm_offset_t)pc->cpu_page, + (vm_offset_t)pc->cpu_page + PAGE_SIZE); + + pc->obj = obj; + ring->private = pc; + return 0; + +err_unpin: + i915_gem_object_unpin(obj); +err_unref: + drm_gem_object_unreference(&obj->base); +err: + free(pc, DRM_I915_GEM); + return ret; +} + +static void +cleanup_pipe_control(struct intel_ring_buffer *ring) +{ + struct pipe_control *pc = ring->private; + struct drm_i915_gem_object *obj; + + if (!ring->private) + return; + + obj = pc->obj; + pmap_qremove((vm_offset_t)pc->cpu_page, 1); + pmap_invalidate_range(kernel_pmap, (vm_offset_t)pc->cpu_page, + (vm_offset_t)pc->cpu_page + PAGE_SIZE); + kmem_free(kernel_map, (uintptr_t)pc->cpu_page, PAGE_SIZE); + i915_gem_object_unpin(obj); + drm_gem_object_unreference(&obj->base); + + free(pc, DRM_I915_GEM); + ring->private = NULL; +} + +static int init_render_ring(struct intel_ring_buffer *ring) +{ + struct drm_device *dev = ring->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + int ret = init_ring_common(ring); + + if (INTEL_INFO(dev)->gen > 3) { + int mode = VS_TIMER_DISPATCH << 16 | VS_TIMER_DISPATCH; + I915_WRITE(MI_MODE, mode); + if (IS_GEN7(dev)) + I915_WRITE(GFX_MODE_GEN7, + GFX_MODE_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) | + GFX_MODE_ENABLE(GFX_REPLAY_MODE)); + } + + if (INTEL_INFO(dev)->gen >= 5) { + ret = init_pipe_control(ring); + if (ret) + return ret; + } + + + if (IS_GEN6(dev)) { + /* From the Sandybridge PRM, volume 1 part 3, page 24: + * "If this bit is set, STCunit will have LRA as replacement + * policy. [...] This bit must be reset. LRA replacement + * policy is not supported." + */ + I915_WRITE(CACHE_MODE_0, + CM0_STC_EVICT_DISABLE_LRA_SNB << CM0_MASK_SHIFT); + } + + if (INTEL_INFO(dev)->gen >= 6) { + I915_WRITE(INSTPM, + INSTPM_FORCE_ORDERING << 16 | INSTPM_FORCE_ORDERING); + } + + return ret; +} + +static void render_ring_cleanup(struct intel_ring_buffer *ring) +{ + if (!ring->private) + return; + + cleanup_pipe_control(ring); +} + +static void +update_mboxes(struct intel_ring_buffer *ring, + u32 seqno, + u32 mmio_offset) +{ + intel_ring_emit(ring, MI_SEMAPHORE_MBOX | + MI_SEMAPHORE_GLOBAL_GTT | + MI_SEMAPHORE_REGISTER | + MI_SEMAPHORE_UPDATE); + intel_ring_emit(ring, seqno); + intel_ring_emit(ring, mmio_offset); +} + +/** + * gen6_add_request - Update the semaphore mailbox registers + * + * @ring - ring that is adding a request + * @seqno - return seqno stuck into the ring + * + * Update the mailbox registers in the *other* rings with the current seqno. + * This acts like a signal in the canonical semaphore. + */ +static int +gen6_add_request(struct intel_ring_buffer *ring, + u32 *seqno) +{ + u32 mbox1_reg; + u32 mbox2_reg; + int ret; + + ret = intel_ring_begin(ring, 10); + if (ret) + return ret; + + mbox1_reg = ring->signal_mbox[0]; + mbox2_reg = ring->signal_mbox[1]; + + *seqno = i915_gem_next_request_seqno(ring); + + update_mboxes(ring, *seqno, mbox1_reg); + update_mboxes(ring, *seqno, mbox2_reg); + intel_ring_emit(ring, MI_STORE_DWORD_INDEX); + intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT); + intel_ring_emit(ring, *seqno); + intel_ring_emit(ring, MI_USER_INTERRUPT); + intel_ring_advance(ring); + + return 0; +} + +/** + * intel_ring_sync - sync the waiter to the signaller on seqno + * + * @waiter - ring that is waiting + * @signaller - ring which has, or will signal + * @seqno - seqno which the waiter will block on + */ +static int +intel_ring_sync(struct intel_ring_buffer *waiter, + struct intel_ring_buffer *signaller, + int ring, + u32 seqno) +{ + int ret; + u32 dw1 = MI_SEMAPHORE_MBOX | + MI_SEMAPHORE_COMPARE | + MI_SEMAPHORE_REGISTER; + + ret = intel_ring_begin(waiter, 4); + if (ret) + return ret; + + intel_ring_emit(waiter, dw1 | signaller->semaphore_register[ring]); + intel_ring_emit(waiter, seqno); + intel_ring_emit(waiter, 0); + intel_ring_emit(waiter, MI_NOOP); + intel_ring_advance(waiter); + + return 0; +} + +int render_ring_sync_to(struct intel_ring_buffer *waiter, + struct intel_ring_buffer *signaller, u32 seqno); +int gen6_bsd_ring_sync_to(struct intel_ring_buffer *waiter, + struct intel_ring_buffer *signaller, u32 seqno); +int gen6_blt_ring_sync_to(struct intel_ring_buffer *waiter, + struct intel_ring_buffer *signaller, u32 seqno); + +/* VCS->RCS (RVSYNC) or BCS->RCS (RBSYNC) */ +int +render_ring_sync_to(struct intel_ring_buffer *waiter, + struct intel_ring_buffer *signaller, + u32 seqno) +{ + KASSERT(signaller->semaphore_register[RCS] != MI_SEMAPHORE_SYNC_INVALID, + ("valid RCS semaphore")); + return intel_ring_sync(waiter, + signaller, + RCS, + seqno); +} + +/* RCS->VCS (VRSYNC) or BCS->VCS (VBSYNC) */ +int +gen6_bsd_ring_sync_to(struct intel_ring_buffer *waiter, + struct intel_ring_buffer *signaller, + u32 seqno) +{ + KASSERT(signaller->semaphore_register[VCS] != MI_SEMAPHORE_SYNC_INVALID, + ("Valid VCS semaphore")); + return intel_ring_sync(waiter, + signaller, + VCS, + seqno); +} + +/* RCS->BCS (BRSYNC) or VCS->BCS (BVSYNC) */ +int +gen6_blt_ring_sync_to(struct intel_ring_buffer *waiter, + struct intel_ring_buffer *signaller, + u32 seqno) +{ + KASSERT(signaller->semaphore_register[BCS] != MI_SEMAPHORE_SYNC_INVALID, + ("Valid BCS semaphore")); + return intel_ring_sync(waiter, + signaller, + BCS, + seqno); +} + +#define PIPE_CONTROL_FLUSH(ring__, addr__) \ +do { \ + intel_ring_emit(ring__, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE | \ + PIPE_CONTROL_DEPTH_STALL); \ + intel_ring_emit(ring__, (addr__) | PIPE_CONTROL_GLOBAL_GTT); \ + intel_ring_emit(ring__, 0); \ + intel_ring_emit(ring__, 0); \ +} while (0) + +static int +pc_render_add_request(struct intel_ring_buffer *ring, + uint32_t *result) +{ + u32 seqno = i915_gem_next_request_seqno(ring); + struct pipe_control *pc = ring->private; + u32 scratch_addr = pc->gtt_offset + 128; + int ret; + + /* For Ironlake, MI_USER_INTERRUPT was deprecated and apparently + * incoherent with writes to memory, i.e. completely fubar, + * so we need to use PIPE_NOTIFY instead. + * + * However, we also need to workaround the qword write + * incoherence by flushing the 6 PIPE_NOTIFY buffers out to + * memory before requesting an interrupt. + */ + ret = intel_ring_begin(ring, 32); + if (ret) + return ret; + + intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE | + PIPE_CONTROL_WRITE_FLUSH | + PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE); + intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT); + intel_ring_emit(ring, seqno); + intel_ring_emit(ring, 0); + PIPE_CONTROL_FLUSH(ring, scratch_addr); + scratch_addr += 128; /* write to separate cachelines */ + PIPE_CONTROL_FLUSH(ring, scratch_addr); + scratch_addr += 128; + PIPE_CONTROL_FLUSH(ring, scratch_addr); + scratch_addr += 128; + PIPE_CONTROL_FLUSH(ring, scratch_addr); + scratch_addr += 128; + PIPE_CONTROL_FLUSH(ring, scratch_addr); + scratch_addr += 128; + PIPE_CONTROL_FLUSH(ring, scratch_addr); + intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE | + PIPE_CONTROL_WRITE_FLUSH | + PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE | + PIPE_CONTROL_NOTIFY); + intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT); + intel_ring_emit(ring, seqno); + intel_ring_emit(ring, 0); + intel_ring_advance(ring); + + *result = seqno; + return 0; +} + +static int +render_ring_add_request(struct intel_ring_buffer *ring, + uint32_t *result) +{ + u32 seqno = i915_gem_next_request_seqno(ring); + int ret; + + ret = intel_ring_begin(ring, 4); + if (ret) + return ret; + + intel_ring_emit(ring, MI_STORE_DWORD_INDEX); + intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT); + intel_ring_emit(ring, seqno); + intel_ring_emit(ring, MI_USER_INTERRUPT); + intel_ring_advance(ring); + + *result = seqno; + return 0; +} + + static u32 +gen6_ring_get_seqno(struct intel_ring_buffer *ring) +{ + struct drm_device *dev = ring->dev; + + /* Workaround to force correct ordering between irq and seqno writes on + * ivb (and maybe also on snb) by reading from a CS register (like + * ACTHD) before reading the status page. */ + if (/* IS_GEN6(dev) || */IS_GEN7(dev)) + intel_ring_get_active_head(ring); + return intel_read_status_page(ring, I915_GEM_HWS_INDEX); +} + +static uint32_t +ring_get_seqno(struct intel_ring_buffer *ring) +{ + if (ring->status_page.page_addr == NULL) + return (-1); + return intel_read_status_page(ring, I915_GEM_HWS_INDEX); +} + +static uint32_t +pc_render_get_seqno(struct intel_ring_buffer *ring) +{ + struct pipe_control *pc = ring->private; + if (pc != NULL) + return pc->cpu_page[0]; + else + return (-1); +} + +static void +ironlake_enable_irq(drm_i915_private_t *dev_priv, uint32_t mask) +{ + dev_priv->gt_irq_mask &= ~mask; + I915_WRITE(GTIMR, dev_priv->gt_irq_mask); + POSTING_READ(GTIMR); +} + +static void +ironlake_disable_irq(drm_i915_private_t *dev_priv, uint32_t mask) +{ + dev_priv->gt_irq_mask |= mask; + I915_WRITE(GTIMR, dev_priv->gt_irq_mask); + POSTING_READ(GTIMR); +} + +static void +i915_enable_irq(drm_i915_private_t *dev_priv, uint32_t mask) +{ + dev_priv->irq_mask &= ~mask; + I915_WRITE(IMR, dev_priv->irq_mask); + POSTING_READ(IMR); +} + +static void +i915_disable_irq(drm_i915_private_t *dev_priv, uint32_t mask) +{ + dev_priv->irq_mask |= mask; + I915_WRITE(IMR, dev_priv->irq_mask); + POSTING_READ(IMR); +} + +static bool +render_ring_get_irq(struct intel_ring_buffer *ring) +{ + struct drm_device *dev = ring->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + + if (!dev->irq_enabled) + return false; + + mtx_assert(&ring->irq_lock, MA_OWNED); + if (ring->irq_refcount++ == 0) { + if (HAS_PCH_SPLIT(dev)) + ironlake_enable_irq(dev_priv, + GT_PIPE_NOTIFY | GT_USER_INTERRUPT); + else + i915_enable_irq(dev_priv, I915_USER_INTERRUPT); + } + + return true; +} + +static void +render_ring_put_irq(struct intel_ring_buffer *ring) +{ + struct drm_device *dev = ring->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + + mtx_assert(&ring->irq_lock, MA_OWNED); + if (--ring->irq_refcount == 0) { + if (HAS_PCH_SPLIT(dev)) + ironlake_disable_irq(dev_priv, + GT_USER_INTERRUPT | + GT_PIPE_NOTIFY); + else + i915_disable_irq(dev_priv, I915_USER_INTERRUPT); + } +} + +void intel_ring_setup_status_page(struct intel_ring_buffer *ring) +{ + struct drm_device *dev = ring->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + uint32_t mmio = 0; + + /* The ring status page addresses are no longer next to the rest of + * the ring registers as of gen7. + */ + if (IS_GEN7(dev)) { + switch (ring->id) { + case RCS: + mmio = RENDER_HWS_PGA_GEN7; + break; + case BCS: + mmio = BLT_HWS_PGA_GEN7; + break; + case VCS: + mmio = BSD_HWS_PGA_GEN7; + break; + } + } else if (IS_GEN6(dev)) { + mmio = RING_HWS_PGA_GEN6(ring->mmio_base); + } else { + mmio = RING_HWS_PGA(ring->mmio_base); + } + + I915_WRITE(mmio, (u32)ring->status_page.gfx_addr); + POSTING_READ(mmio); +} + +static int +bsd_ring_flush(struct intel_ring_buffer *ring, + uint32_t invalidate_domains, + uint32_t flush_domains) +{ + int ret; + + ret = intel_ring_begin(ring, 2); + if (ret) + return ret; + + intel_ring_emit(ring, MI_FLUSH); + intel_ring_emit(ring, MI_NOOP); + intel_ring_advance(ring); + return 0; +} + +static int +ring_add_request(struct intel_ring_buffer *ring, + uint32_t *result) +{ + uint32_t seqno; + int ret; + + ret = intel_ring_begin(ring, 4); + if (ret) + return ret; + + seqno = i915_gem_next_request_seqno(ring); + + intel_ring_emit(ring, MI_STORE_DWORD_INDEX); + intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT); + intel_ring_emit(ring, seqno); + intel_ring_emit(ring, MI_USER_INTERRUPT); + intel_ring_advance(ring); + + *result = seqno; + return 0; +} + +static bool +gen6_ring_get_irq(struct intel_ring_buffer *ring, uint32_t gflag, uint32_t rflag) +{ + struct drm_device *dev = ring->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + + if (!dev->irq_enabled) + return false; + + gen6_gt_force_wake_get(dev_priv); + + mtx_assert(&ring->irq_lock, MA_OWNED); + if (ring->irq_refcount++ == 0) { + ring->irq_mask &= ~rflag; + I915_WRITE_IMR(ring, ring->irq_mask); + ironlake_enable_irq(dev_priv, gflag); + } + + return true; +} + +static void +gen6_ring_put_irq(struct intel_ring_buffer *ring, uint32_t gflag, uint32_t rflag) +{ + struct drm_device *dev = ring->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + + mtx_assert(&ring->irq_lock, MA_OWNED); + if (--ring->irq_refcount == 0) { + ring->irq_mask |= rflag; + I915_WRITE_IMR(ring, ring->irq_mask); + ironlake_disable_irq(dev_priv, gflag); + } + + gen6_gt_force_wake_put(dev_priv); +} + +static bool +bsd_ring_get_irq(struct intel_ring_buffer *ring) +{ + struct drm_device *dev = ring->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + + if (!dev->irq_enabled) + return false; + + mtx_assert(&ring->irq_lock, MA_OWNED); + if (ring->irq_refcount++ == 0) { + if (IS_G4X(dev)) + i915_enable_irq(dev_priv, I915_BSD_USER_INTERRUPT); + else + ironlake_enable_irq(dev_priv, GT_BSD_USER_INTERRUPT); + } + + return true; +} +static void +bsd_ring_put_irq(struct intel_ring_buffer *ring) +{ + struct drm_device *dev = ring->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + + mtx_assert(&ring->irq_lock, MA_OWNED); + if (--ring->irq_refcount == 0) { + if (IS_G4X(dev)) + i915_disable_irq(dev_priv, I915_BSD_USER_INTERRUPT); + else + ironlake_disable_irq(dev_priv, GT_BSD_USER_INTERRUPT); + } +} + +static int +ring_dispatch_execbuffer(struct intel_ring_buffer *ring, uint32_t offset, + uint32_t length) +{ + int ret; + + ret = intel_ring_begin(ring, 2); + if (ret) + return ret; + + intel_ring_emit(ring, + MI_BATCH_BUFFER_START | (2 << 6) | + MI_BATCH_NON_SECURE_I965); + intel_ring_emit(ring, offset); + intel_ring_advance(ring); + + return 0; +} + +static int +render_ring_dispatch_execbuffer(struct intel_ring_buffer *ring, + uint32_t offset, uint32_t len) +{ + struct drm_device *dev = ring->dev; + int ret; + + if (IS_I830(dev) || IS_845G(dev)) { + ret = intel_ring_begin(ring, 4); + if (ret) + return ret; + + intel_ring_emit(ring, MI_BATCH_BUFFER); + intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE); + intel_ring_emit(ring, offset + len - 8); + intel_ring_emit(ring, 0); + } else { + ret = intel_ring_begin(ring, 2); + if (ret) + return ret; + + if (INTEL_INFO(dev)->gen >= 4) { + intel_ring_emit(ring, + MI_BATCH_BUFFER_START | (2 << 6) | + MI_BATCH_NON_SECURE_I965); + intel_ring_emit(ring, offset); + } else { + intel_ring_emit(ring, + MI_BATCH_BUFFER_START | (2 << 6)); + intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE); + } + } + intel_ring_advance(ring); + + return 0; +} + +static void cleanup_status_page(struct intel_ring_buffer *ring) +{ + drm_i915_private_t *dev_priv = ring->dev->dev_private; + struct drm_i915_gem_object *obj; + + obj = ring->status_page.obj; + if (obj == NULL) + return; + + pmap_qremove((vm_offset_t)ring->status_page.page_addr, 1); + pmap_invalidate_range(kernel_pmap, + (vm_offset_t)ring->status_page.page_addr, + (vm_offset_t)ring->status_page.page_addr + PAGE_SIZE); + kmem_free(kernel_map, (vm_offset_t)ring->status_page.page_addr, + PAGE_SIZE); + i915_gem_object_unpin(obj); + drm_gem_object_unreference(&obj->base); + ring->status_page.obj = NULL; + + memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map)); +} + +static int init_status_page(struct intel_ring_buffer *ring) +{ + struct drm_device *dev = ring->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_i915_gem_object *obj; + int ret; + + obj = i915_gem_alloc_object(dev, 4096); + if (obj == NULL) { + DRM_ERROR("Failed to allocate status page\n"); + ret = -ENOMEM; + goto err; + } + + i915_gem_object_set_cache_level(obj, I915_CACHE_LLC); + + ret = i915_gem_object_pin(obj, 4096, true); + if (ret != 0) { + goto err_unref; + } + + ring->status_page.gfx_addr = obj->gtt_offset; + ring->status_page.page_addr = (void *)kmem_alloc_nofault(kernel_map, + PAGE_SIZE); + if (ring->status_page.page_addr == NULL) { + memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map)); + goto err_unpin; + } + pmap_qenter((vm_offset_t)ring->status_page.page_addr, &obj->pages[0], + 1); + pmap_invalidate_range(kernel_pmap, + (vm_offset_t)ring->status_page.page_addr, + (vm_offset_t)ring->status_page.page_addr + PAGE_SIZE); + pmap_invalidate_cache_range((vm_offset_t)ring->status_page.page_addr, + (vm_offset_t)ring->status_page.page_addr + PAGE_SIZE); + ring->status_page.obj = obj; + memset(ring->status_page.page_addr, 0, PAGE_SIZE); + + intel_ring_setup_status_page(ring); + DRM_DEBUG("i915: init_status_page %s hws offset: 0x%08x\n", + ring->name, ring->status_page.gfx_addr); + + return 0; + +err_unpin: + i915_gem_object_unpin(obj); +err_unref: + drm_gem_object_unreference(&obj->base); +err: + return ret; +} + +static +int intel_init_ring_buffer(struct drm_device *dev, + struct intel_ring_buffer *ring) +{ + struct drm_i915_gem_object *obj; + int ret; + + ring->dev = dev; + INIT_LIST_HEAD(&ring->active_list); + INIT_LIST_HEAD(&ring->request_list); + INIT_LIST_HEAD(&ring->gpu_write_list); + + mtx_init(&ring->irq_lock, "ringb", NULL, MTX_DEF); + ring->irq_mask = ~0; + + if (I915_NEED_GFX_HWS(dev)) { + ret = init_status_page(ring); + if (ret) + return ret; + } + + obj = i915_gem_alloc_object(dev, ring->size); + if (obj == NULL) { + DRM_ERROR("Failed to allocate ringbuffer\n"); + ret = -ENOMEM; + goto err_hws; + } + + ring->obj = obj; + + ret = i915_gem_object_pin(obj, PAGE_SIZE, true); + if (ret) + goto err_unref; + + ring->map.size = ring->size; + ring->map.offset = dev->agp->base + obj->gtt_offset; + ring->map.type = 0; + ring->map.flags = 0; + ring->map.mtrr = 0; + + drm_core_ioremap_wc(&ring->map, dev); + if (ring->map.virtual == NULL) { + DRM_ERROR("Failed to map ringbuffer.\n"); + ret = -EINVAL; + goto err_unpin; + } + + ring->virtual_start = ring->map.virtual; + ret = ring->init(ring); + if (ret) + goto err_unmap; + + /* Workaround an erratum on the i830 which causes a hang if + * the TAIL pointer points to within the last 2 cachelines + * of the buffer. + */ + ring->effective_size = ring->size; + if (IS_I830(ring->dev) || IS_845G(ring->dev)) + ring->effective_size -= 128; + + return 0; + +err_unmap: + drm_core_ioremapfree(&ring->map, dev); +err_unpin: + i915_gem_object_unpin(obj); +err_unref: + drm_gem_object_unreference(&obj->base); + ring->obj = NULL; +err_hws: + cleanup_status_page(ring); + return ret; +} + +void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring) +{ + struct drm_i915_private *dev_priv; + int ret; + + if (ring->obj == NULL) + return; + + /* Disable the ring buffer. The ring must be idle at this point */ + dev_priv = ring->dev->dev_private; + ret = intel_wait_ring_idle(ring); + I915_WRITE_CTL(ring, 0); + + drm_core_ioremapfree(&ring->map, ring->dev); + + i915_gem_object_unpin(ring->obj); + drm_gem_object_unreference(&ring->obj->base); + ring->obj = NULL; + + if (ring->cleanup) + ring->cleanup(ring); + + cleanup_status_page(ring); +} + +static int intel_wrap_ring_buffer(struct intel_ring_buffer *ring) +{ + unsigned int *virt; + int rem = ring->size - ring->tail; + + if (ring->space < rem) { + int ret = intel_wait_ring_buffer(ring, rem); + if (ret) + return ret; + } + + virt = (unsigned int *)((char *)ring->virtual_start + ring->tail); + rem /= 8; + while (rem--) { + *virt++ = MI_NOOP; + *virt++ = MI_NOOP; + } + + ring->tail = 0; + ring->space = ring_space(ring); + + return 0; +} + +static int intel_ring_wait_seqno(struct intel_ring_buffer *ring, u32 seqno) +{ + struct drm_i915_private *dev_priv = ring->dev->dev_private; + bool was_interruptible; + int ret; + + /* XXX As we have not yet audited all the paths to check that + * they are ready for ERESTARTSYS from intel_ring_begin, do not + * allow us to be interruptible by a signal. + */ + was_interruptible = dev_priv->mm.interruptible; + dev_priv->mm.interruptible = false; + + ret = i915_wait_request(ring, seqno, true); + + dev_priv->mm.interruptible = was_interruptible; + + return ret; +} + +static int intel_ring_wait_request(struct intel_ring_buffer *ring, int n) +{ + struct drm_i915_gem_request *request; + u32 seqno = 0; + int ret; + + i915_gem_retire_requests_ring(ring); + + if (ring->last_retired_head != -1) { + ring->head = ring->last_retired_head; + ring->last_retired_head = -1; + ring->space = ring_space(ring); + if (ring->space >= n) + return 0; + } + + list_for_each_entry(request, &ring->request_list, list) { + int space; + + if (request->tail == -1) + continue; + + space = request->tail - (ring->tail + 8); + if (space < 0) + space += ring->size; + if (space >= n) { + seqno = request->seqno; + break; + } + + /* Consume this request in case we need more space than + * is available and so need to prevent a race between + * updating last_retired_head and direct reads of + * I915_RING_HEAD. It also provides a nice sanity check. + */ + request->tail = -1; + } + + if (seqno == 0) + return -ENOSPC; + + ret = intel_ring_wait_seqno(ring, seqno); + if (ret) + return ret; + + if (ring->last_retired_head == -1) + return -ENOSPC; + + ring->head = ring->last_retired_head; + ring->last_retired_head = -1; + ring->space = ring_space(ring); + if (ring->space < n) + return -ENOSPC; + + return 0; +} + +int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n) +{ + struct drm_device *dev = ring->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + int end; + int ret; + + ret = intel_ring_wait_request(ring, n); + if (ret != -ENOSPC) + return ret; + + CTR1(KTR_DRM, "ring_wait_begin %s", ring->name); + if (drm_core_check_feature(dev, DRIVER_GEM)) + /* With GEM the hangcheck timer should kick us out of the loop, + * leaving it early runs the risk of corrupting GEM state (due + * to running on almost untested codepaths). But on resume + * timers don't work yet, so prevent a complete hang in that + * case by choosing an insanely large timeout. */ + end = ticks + hz * 60; + else + end = ticks + hz * 3; + do { + ring->head = I915_READ_HEAD(ring); + ring->space = ring_space(ring); + if (ring->space >= n) { + CTR1(KTR_DRM, "ring_wait_end %s", ring->name); + return 0; + } + +#if 0 + if (dev->primary->master) { + struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; + if (master_priv->sarea_priv) + master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT; + } +#else + if (dev_priv->sarea_priv) + dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT; +#endif + + pause("915rng", 1); + if (atomic_load_acq_32(&dev_priv->mm.wedged) != 0) { + CTR1(KTR_DRM, "ring_wait_end %s wedged", ring->name); + return -EAGAIN; + } + } while (!time_after(ticks, end)); + CTR1(KTR_DRM, "ring_wait_end %s busy", ring->name); + return -EBUSY; +} + +int intel_ring_begin(struct intel_ring_buffer *ring, + int num_dwords) +{ + struct drm_i915_private *dev_priv = ring->dev->dev_private; + int n = 4*num_dwords; + int ret; + + if (atomic_load_acq_int(&dev_priv->mm.wedged)) + return -EIO; + + if (ring->tail + n > ring->effective_size) { + ret = intel_wrap_ring_buffer(ring); + if (ret != 0) + return ret; + } + + if (ring->space < n) { + ret = intel_wait_ring_buffer(ring, n); + if (ret != 0) + return ret; + } + + ring->space -= n; + return 0; +} + +void intel_ring_advance(struct intel_ring_buffer *ring) +{ + ring->tail &= ring->size - 1; + ring->write_tail(ring, ring->tail); +} + +static const struct intel_ring_buffer render_ring = { + .name = "render ring", + .id = RCS, + .mmio_base = RENDER_RING_BASE, + .size = 32 * PAGE_SIZE, + .init = init_render_ring, + .write_tail = ring_write_tail, + .flush = render_ring_flush, + .add_request = render_ring_add_request, + .get_seqno = ring_get_seqno, + .irq_get = render_ring_get_irq, + .irq_put = render_ring_put_irq, + .dispatch_execbuffer = render_ring_dispatch_execbuffer, + .cleanup = render_ring_cleanup, + .sync_to = render_ring_sync_to, + .semaphore_register = {MI_SEMAPHORE_SYNC_INVALID, + MI_SEMAPHORE_SYNC_RV, + MI_SEMAPHORE_SYNC_RB}, + .signal_mbox = {GEN6_VRSYNC, GEN6_BRSYNC}, +}; + +/* ring buffer for bit-stream decoder */ + +static const struct intel_ring_buffer bsd_ring = { + .name = "bsd ring", + .id = VCS, + .mmio_base = BSD_RING_BASE, + .size = 32 * PAGE_SIZE, + .init = init_ring_common, + .write_tail = ring_write_tail, + .flush = bsd_ring_flush, + .add_request = ring_add_request, + .get_seqno = ring_get_seqno, + .irq_get = bsd_ring_get_irq, + .irq_put = bsd_ring_put_irq, + .dispatch_execbuffer = ring_dispatch_execbuffer, +}; + + +static void gen6_bsd_ring_write_tail(struct intel_ring_buffer *ring, + uint32_t value) +{ + drm_i915_private_t *dev_priv = ring->dev->dev_private; + + /* Every tail move must follow the sequence below */ + I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL, + GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK | + GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE); + I915_WRITE(GEN6_BSD_RNCID, 0x0); + + if (_intel_wait_for(ring->dev, + (I915_READ(GEN6_BSD_SLEEP_PSMI_CONTROL) & + GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR) == 0, 50, + true, "915g6i") != 0) + DRM_ERROR("timed out waiting for IDLE Indicator\n"); + + I915_WRITE_TAIL(ring, value); + I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL, + GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK | + GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE); +} + +static int gen6_ring_flush(struct intel_ring_buffer *ring, + uint32_t invalidate, uint32_t flush) +{ + uint32_t cmd; + int ret; + + ret = intel_ring_begin(ring, 4); + if (ret) + return ret; + + cmd = MI_FLUSH_DW; + if (invalidate & I915_GEM_GPU_DOMAINS) + cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD; + intel_ring_emit(ring, cmd); + intel_ring_emit(ring, 0); + intel_ring_emit(ring, 0); + intel_ring_emit(ring, MI_NOOP); + intel_ring_advance(ring); + return 0; +} + +static int +gen6_ring_dispatch_execbuffer(struct intel_ring_buffer *ring, + uint32_t offset, uint32_t len) +{ + int ret; + + ret = intel_ring_begin(ring, 2); + if (ret) + return ret; + + intel_ring_emit(ring, MI_BATCH_BUFFER_START | MI_BATCH_NON_SECURE_I965); + /* bit0-7 is the length on GEN6+ */ + intel_ring_emit(ring, offset); + intel_ring_advance(ring); + + return 0; +} + +static bool +gen6_render_ring_get_irq(struct intel_ring_buffer *ring) +{ + return gen6_ring_get_irq(ring, + GT_USER_INTERRUPT, + GEN6_RENDER_USER_INTERRUPT); +} + +static void +gen6_render_ring_put_irq(struct intel_ring_buffer *ring) +{ + return gen6_ring_put_irq(ring, + GT_USER_INTERRUPT, + GEN6_RENDER_USER_INTERRUPT); +} + +static bool +gen6_bsd_ring_get_irq(struct intel_ring_buffer *ring) +{ + return gen6_ring_get_irq(ring, + GT_GEN6_BSD_USER_INTERRUPT, + GEN6_BSD_USER_INTERRUPT); +} + +static void +gen6_bsd_ring_put_irq(struct intel_ring_buffer *ring) +{ + return gen6_ring_put_irq(ring, + GT_GEN6_BSD_USER_INTERRUPT, + GEN6_BSD_USER_INTERRUPT); +} + +/* ring buffer for Video Codec for Gen6+ */ +static const struct intel_ring_buffer gen6_bsd_ring = { + .name = "gen6 bsd ring", + .id = VCS, + .mmio_base = GEN6_BSD_RING_BASE, + .size = 32 * PAGE_SIZE, + .init = init_ring_common, + .write_tail = gen6_bsd_ring_write_tail, + .flush = gen6_ring_flush, + .add_request = gen6_add_request, + .get_seqno = gen6_ring_get_seqno, + .irq_get = gen6_bsd_ring_get_irq, + .irq_put = gen6_bsd_ring_put_irq, + .dispatch_execbuffer = gen6_ring_dispatch_execbuffer, + .sync_to = gen6_bsd_ring_sync_to, + .semaphore_register = {MI_SEMAPHORE_SYNC_VR, + MI_SEMAPHORE_SYNC_INVALID, + MI_SEMAPHORE_SYNC_VB}, + .signal_mbox = {GEN6_RVSYNC, GEN6_BVSYNC}, +}; + +/* Blitter support (SandyBridge+) */ + +static bool +blt_ring_get_irq(struct intel_ring_buffer *ring) +{ + return gen6_ring_get_irq(ring, + GT_BLT_USER_INTERRUPT, + GEN6_BLITTER_USER_INTERRUPT); +} + +static void +blt_ring_put_irq(struct intel_ring_buffer *ring) +{ + gen6_ring_put_irq(ring, + GT_BLT_USER_INTERRUPT, + GEN6_BLITTER_USER_INTERRUPT); +} + +static int blt_ring_flush(struct intel_ring_buffer *ring, + uint32_t invalidate, uint32_t flush) +{ + uint32_t cmd; + int ret; + + ret = intel_ring_begin(ring, 4); + if (ret) + return ret; + + cmd = MI_FLUSH_DW; + if (invalidate & I915_GEM_DOMAIN_RENDER) + cmd |= MI_INVALIDATE_TLB; + intel_ring_emit(ring, cmd); + intel_ring_emit(ring, 0); + intel_ring_emit(ring, 0); + intel_ring_emit(ring, MI_NOOP); + intel_ring_advance(ring); + return 0; +} + +static const struct intel_ring_buffer gen6_blt_ring = { + .name = "blt ring", + .id = BCS, + .mmio_base = BLT_RING_BASE, + .size = 32 * PAGE_SIZE, + .init = init_ring_common, + .write_tail = ring_write_tail, + .flush = blt_ring_flush, + .add_request = gen6_add_request, + .get_seqno = gen6_ring_get_seqno, + .irq_get = blt_ring_get_irq, + .irq_put = blt_ring_put_irq, + .dispatch_execbuffer = gen6_ring_dispatch_execbuffer, + .sync_to = gen6_blt_ring_sync_to, + .semaphore_register = {MI_SEMAPHORE_SYNC_BR, + MI_SEMAPHORE_SYNC_BV, + MI_SEMAPHORE_SYNC_INVALID}, + .signal_mbox = {GEN6_RBSYNC, GEN6_VBSYNC}, +}; + +int intel_init_render_ring_buffer(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_ring_buffer *ring = &dev_priv->rings[RCS]; + + *ring = render_ring; + if (INTEL_INFO(dev)->gen >= 6) { + ring->add_request = gen6_add_request; + ring->flush = gen6_render_ring_flush; + ring->irq_get = gen6_render_ring_get_irq; + ring->irq_put = gen6_render_ring_put_irq; + ring->get_seqno = gen6_ring_get_seqno; + } else if (IS_GEN5(dev)) { + ring->add_request = pc_render_add_request; + ring->get_seqno = pc_render_get_seqno; + } + + if (!I915_NEED_GFX_HWS(dev)) { + ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr; + memset(ring->status_page.page_addr, 0, PAGE_SIZE); + } + + return intel_init_ring_buffer(dev, ring); +} + +int intel_render_ring_init_dri(struct drm_device *dev, uint64_t start, + uint32_t size) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_ring_buffer *ring = &dev_priv->rings[RCS]; + + *ring = render_ring; + if (INTEL_INFO(dev)->gen >= 6) { + ring->add_request = gen6_add_request; + ring->irq_get = gen6_render_ring_get_irq; + ring->irq_put = gen6_render_ring_put_irq; + } else if (IS_GEN5(dev)) { + ring->add_request = pc_render_add_request; + ring->get_seqno = pc_render_get_seqno; + } + + ring->dev = dev; + INIT_LIST_HEAD(&ring->active_list); + INIT_LIST_HEAD(&ring->request_list); + INIT_LIST_HEAD(&ring->gpu_write_list); + + ring->size = size; + ring->effective_size = ring->size; + if (IS_I830(ring->dev)) + ring->effective_size -= 128; + + ring->map.offset = start; + ring->map.size = size; + ring->map.type = 0; + ring->map.flags = 0; + ring->map.mtrr = 0; + + drm_core_ioremap_wc(&ring->map, dev); + if (ring->map.virtual == NULL) { + DRM_ERROR("can not ioremap virtual address for" + " ring buffer\n"); + return -ENOMEM; + } + + ring->virtual_start = (void *)ring->map.virtual; + return 0; +} + +int intel_init_bsd_ring_buffer(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_ring_buffer *ring = &dev_priv->rings[VCS]; + + if (IS_GEN6(dev) || IS_GEN7(dev)) + *ring = gen6_bsd_ring; + else + *ring = bsd_ring; + + return intel_init_ring_buffer(dev, ring); +} + +int intel_init_blt_ring_buffer(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + struct intel_ring_buffer *ring = &dev_priv->rings[BCS]; + + *ring = gen6_blt_ring; + + return intel_init_ring_buffer(dev, ring); +} diff --git a/sys/dev/drm2/i915/intel_ringbuffer.h b/sys/dev/drm2/i915/intel_ringbuffer.h new file mode 100644 index 00000000000..c20777fc986 --- /dev/null +++ b/sys/dev/drm2/i915/intel_ringbuffer.h @@ -0,0 +1,203 @@ +/* + * $FreeBSD$ + */ + +#ifndef _INTEL_RINGBUFFER_H_ +#define _INTEL_RINGBUFFER_H_ + +struct intel_hw_status_page { + uint32_t *page_addr; + unsigned int gfx_addr; + struct drm_i915_gem_object *obj; +}; + +#define I915_READ_TAIL(ring) I915_READ(RING_TAIL((ring)->mmio_base)) +#define I915_WRITE_TAIL(ring, val) I915_WRITE(RING_TAIL((ring)->mmio_base), val) + +#define I915_READ_START(ring) I915_READ(RING_START((ring)->mmio_base)) +#define I915_WRITE_START(ring, val) I915_WRITE(RING_START((ring)->mmio_base), val) + +#define I915_READ_HEAD(ring) I915_READ(RING_HEAD((ring)->mmio_base)) +#define I915_WRITE_HEAD(ring, val) I915_WRITE(RING_HEAD((ring)->mmio_base), val) + +#define I915_READ_CTL(ring) I915_READ(RING_CTL((ring)->mmio_base)) +#define I915_WRITE_CTL(ring, val) I915_WRITE(RING_CTL((ring)->mmio_base), val) + +#define I915_READ_IMR(ring) I915_READ(RING_IMR((ring)->mmio_base)) +#define I915_WRITE_IMR(ring, val) I915_WRITE(RING_IMR((ring)->mmio_base), val) + +#define I915_READ_NOPID(ring) I915_READ(RING_NOPID((ring)->mmio_base)) +#define I915_READ_SYNC_0(ring) I915_READ(RING_SYNC_0((ring)->mmio_base)) +#define I915_READ_SYNC_1(ring) I915_READ(RING_SYNC_1((ring)->mmio_base)) + +struct intel_ring_buffer { + const char *name; + enum intel_ring_id { + RCS = 0x0, + VCS, + BCS, + } id; +#define I915_NUM_RINGS 3 + uint32_t mmio_base; + void *virtual_start; + struct drm_device *dev; + struct drm_i915_gem_object *obj; + + uint32_t head; + uint32_t tail; + int space; + int size; + int effective_size; + struct intel_hw_status_page status_page; + + /** We track the position of the requests in the ring buffer, and + * when each is retired we increment last_retired_head as the GPU + * must have finished processing the request and so we know we + * can advance the ringbuffer up to that position. + * + * last_retired_head is set to -1 after the value is consumed so + * we can detect new retirements. + */ + u32 last_retired_head; + + struct mtx irq_lock; + uint32_t irq_refcount; + uint32_t irq_mask; + uint32_t irq_seqno; /* last seq seem at irq time */ + uint32_t trace_irq_seqno; + uint32_t waiting_seqno; + uint32_t sync_seqno[I915_NUM_RINGS-1]; + bool (*irq_get)(struct intel_ring_buffer *ring); + void (*irq_put)(struct intel_ring_buffer *ring); + + int (*init)(struct intel_ring_buffer *ring); + + void (*write_tail)(struct intel_ring_buffer *ring, + uint32_t value); + int (*flush)(struct intel_ring_buffer *ring, + uint32_t invalidate_domains, + uint32_t flush_domains); + int (*add_request)(struct intel_ring_buffer *ring, + uint32_t *seqno); + uint32_t (*get_seqno)(struct intel_ring_buffer *ring); + int (*dispatch_execbuffer)(struct intel_ring_buffer *ring, + uint32_t offset, uint32_t length); + void (*cleanup)(struct intel_ring_buffer *ring); + int (*sync_to)(struct intel_ring_buffer *ring, + struct intel_ring_buffer *to, + u32 seqno); + + u32 semaphore_register[3]; /*our mbox written by others */ + u32 signal_mbox[2]; /* mboxes this ring signals to */ + + /** + * List of objects currently involved in rendering from the + * ringbuffer. + * + * Includes buffers having the contents of their GPU caches + * flushed, not necessarily primitives. last_rendering_seqno + * represents when the rendering involved will be completed. + * + * A reference is held on the buffer while on this list. + */ + struct list_head active_list; + + /** + * List of breadcrumbs associated with GPU requests currently + * outstanding. + */ + struct list_head request_list; + + /** + * List of objects currently pending a GPU write flush. + * + * All elements on this list will belong to either the + * active_list or flushing_list, last_rendering_seqno can + * be used to differentiate between the two elements. + */ + struct list_head gpu_write_list; + + /** + * Do we have some not yet emitted requests outstanding? + */ + uint32_t outstanding_lazy_request; + + drm_local_map_t map; + + void *private; +}; + +static inline unsigned +intel_ring_flag(struct intel_ring_buffer *ring) +{ + return 1 << ring->id; +} + +static inline uint32_t +intel_ring_sync_index(struct intel_ring_buffer *ring, + struct intel_ring_buffer *other) +{ + int idx; + + /* + * cs -> 0 = vcs, 1 = bcs + * vcs -> 0 = bcs, 1 = cs, + * bcs -> 0 = cs, 1 = vcs. + */ + + idx = (other - ring) - 1; + if (idx < 0) + idx += I915_NUM_RINGS; + + return idx; +} + +static inline uint32_t +intel_read_status_page(struct intel_ring_buffer *ring, int reg) +{ + + return (atomic_load_acq_32(ring->status_page.page_addr + reg)); +} + +void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring); + +int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n); +static inline int intel_wait_ring_idle(struct intel_ring_buffer *ring) +{ + + return (intel_wait_ring_buffer(ring, ring->size - 8)); +} + +int intel_ring_begin(struct intel_ring_buffer *ring, int n); + +static inline void intel_ring_emit(struct intel_ring_buffer *ring, + uint32_t data) +{ + *(volatile uint32_t *)((char *)ring->virtual_start + + ring->tail) = data; + ring->tail += 4; +} + +void intel_ring_advance(struct intel_ring_buffer *ring); + +uint32_t intel_ring_get_seqno(struct intel_ring_buffer *ring); + +int intel_init_render_ring_buffer(struct drm_device *dev); +int intel_init_bsd_ring_buffer(struct drm_device *dev); +int intel_init_blt_ring_buffer(struct drm_device *dev); + +u32 intel_ring_get_active_head(struct intel_ring_buffer *ring); +void intel_ring_setup_status_page(struct intel_ring_buffer *ring); + +static inline u32 intel_ring_get_tail(struct intel_ring_buffer *ring) +{ + return ring->tail; +} + +void i915_trace_irq_get(struct intel_ring_buffer *ring, uint32_t seqno); + +/* DRI warts */ +int intel_render_ring_init_dri(struct drm_device *dev, uint64_t start, + uint32_t size); + +#endif /* _INTEL_RINGBUFFER_H_ */ diff --git a/sys/dev/drm2/i915/intel_sdvo.c b/sys/dev/drm2/i915/intel_sdvo.c new file mode 100644 index 00000000000..0800d384af2 --- /dev/null +++ b/sys/dev/drm2/i915/intel_sdvo.c @@ -0,0 +1,2680 @@ +/* + * Copyright 2006 Dave Airlie + * Copyright © 2006-2007 Intel Corporation + * Jesse Barnes + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "iicbus_if.h" + +#define SDVO_TMDS_MASK (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1) +#define SDVO_RGB_MASK (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_RGB1) +#define SDVO_LVDS_MASK (SDVO_OUTPUT_LVDS0 | SDVO_OUTPUT_LVDS1) +#define SDVO_TV_MASK (SDVO_OUTPUT_CVBS0 | SDVO_OUTPUT_SVID0) + +#define SDVO_OUTPUT_MASK (SDVO_TMDS_MASK | SDVO_RGB_MASK | SDVO_LVDS_MASK |\ + SDVO_TV_MASK) + +#define IS_TV(c) (c->output_flag & SDVO_TV_MASK) +#define IS_TMDS(c) (c->output_flag & SDVO_TMDS_MASK) +#define IS_LVDS(c) (c->output_flag & SDVO_LVDS_MASK) +#define IS_TV_OR_LVDS(c) (c->output_flag & (SDVO_TV_MASK | SDVO_LVDS_MASK)) +#define IS_DIGITAL(c) (c->output_flag & (SDVO_TMDS_MASK | SDVO_LVDS_MASK)) + + +static const char *tv_format_names[] = { + "NTSC_M" , "NTSC_J" , "NTSC_443", + "PAL_B" , "PAL_D" , "PAL_G" , + "PAL_H" , "PAL_I" , "PAL_M" , + "PAL_N" , "PAL_NC" , "PAL_60" , + "SECAM_B" , "SECAM_D" , "SECAM_G" , + "SECAM_K" , "SECAM_K1", "SECAM_L" , + "SECAM_60" +}; + +#define TV_FORMAT_NUM (sizeof(tv_format_names) / sizeof(*tv_format_names)) + +struct intel_sdvo { + struct intel_encoder base; + + device_t i2c; + u8 slave_addr; + + device_t ddc_iic_bus, ddc; + + /* Register for the SDVO device: SDVOB or SDVOC */ + int sdvo_reg; + + /* Active outputs controlled by this SDVO output */ + uint16_t controlled_output; + + /* + * Capabilities of the SDVO device returned by + * i830_sdvo_get_capabilities() + */ + struct intel_sdvo_caps caps; + + /* Pixel clock limitations reported by the SDVO device, in kHz */ + int pixel_clock_min, pixel_clock_max; + + /* + * For multiple function SDVO device, + * this is for current attached outputs. + */ + uint16_t attached_output; + + /* + * Hotplug activation bits for this device + */ + uint8_t hotplug_active[2]; + + /** + * This is used to select the color range of RBG outputs in HDMI mode. + * It is only valid when using TMDS encoding and 8 bit per color mode. + */ + uint32_t color_range; + + /** + * This is set if we're going to treat the device as TV-out. + * + * While we have these nice friendly flags for output types that ought + * to decide this for us, the S-Video output on our HDMI+S-Video card + * shows up as RGB1 (VGA). + */ + bool is_tv; + + /* This is for current tv format name */ + int tv_format_index; + + /** + * This is set if we treat the device as HDMI, instead of DVI. + */ + bool is_hdmi; + bool has_hdmi_monitor; + bool has_hdmi_audio; + + /** + * This is set if we detect output of sdvo device as LVDS and + * have a valid fixed mode to use with the panel. + */ + bool is_lvds; + + /** + * This is sdvo fixed pannel mode pointer + */ + struct drm_display_mode *sdvo_lvds_fixed_mode; + + /* DDC bus used by this SDVO encoder */ + uint8_t ddc_bus; + + /* Input timings for adjusted_mode */ + struct intel_sdvo_dtd input_dtd; +}; + +struct intel_sdvo_connector { + struct intel_connector base; + + /* Mark the type of connector */ + uint16_t output_flag; + + enum hdmi_force_audio force_audio; + + /* This contains all current supported TV format */ + u8 tv_format_supported[TV_FORMAT_NUM]; + int format_supported_num; + struct drm_property *tv_format; + + /* add the property for the SDVO-TV */ + struct drm_property *left; + struct drm_property *right; + struct drm_property *top; + struct drm_property *bottom; + struct drm_property *hpos; + struct drm_property *vpos; + struct drm_property *contrast; + struct drm_property *saturation; + struct drm_property *hue; + struct drm_property *sharpness; + struct drm_property *flicker_filter; + struct drm_property *flicker_filter_adaptive; + struct drm_property *flicker_filter_2d; + struct drm_property *tv_chroma_filter; + struct drm_property *tv_luma_filter; + struct drm_property *dot_crawl; + + /* add the property for the SDVO-TV/LVDS */ + struct drm_property *brightness; + + /* Add variable to record current setting for the above property */ + u32 left_margin, right_margin, top_margin, bottom_margin; + + /* this is to get the range of margin.*/ + u32 max_hscan, max_vscan; + u32 max_hpos, cur_hpos; + u32 max_vpos, cur_vpos; + u32 cur_brightness, max_brightness; + u32 cur_contrast, max_contrast; + u32 cur_saturation, max_saturation; + u32 cur_hue, max_hue; + u32 cur_sharpness, max_sharpness; + u32 cur_flicker_filter, max_flicker_filter; + u32 cur_flicker_filter_adaptive, max_flicker_filter_adaptive; + u32 cur_flicker_filter_2d, max_flicker_filter_2d; + u32 cur_tv_chroma_filter, max_tv_chroma_filter; + u32 cur_tv_luma_filter, max_tv_luma_filter; + u32 cur_dot_crawl, max_dot_crawl; +}; + +static struct intel_sdvo *to_intel_sdvo(struct drm_encoder *encoder) +{ + return container_of(encoder, struct intel_sdvo, base.base); +} + +static struct intel_sdvo *intel_attached_sdvo(struct drm_connector *connector) +{ + return container_of(intel_attached_encoder(connector), + struct intel_sdvo, base); +} + +static struct intel_sdvo_connector *to_intel_sdvo_connector(struct drm_connector *connector) +{ + return container_of(to_intel_connector(connector), struct intel_sdvo_connector, base); +} + +static bool +intel_sdvo_output_setup(struct intel_sdvo *intel_sdvo, uint16_t flags); +static bool +intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo, + struct intel_sdvo_connector *intel_sdvo_connector, + int type); +static bool +intel_sdvo_create_enhance_property(struct intel_sdvo *intel_sdvo, + struct intel_sdvo_connector *intel_sdvo_connector); + +/** + * Writes the SDVOB or SDVOC with the given value, but always writes both + * SDVOB and SDVOC to work around apparent hardware issues (according to + * comments in the BIOS). + */ +static void intel_sdvo_write_sdvox(struct intel_sdvo *intel_sdvo, u32 val) +{ + struct drm_device *dev = intel_sdvo->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 bval = val, cval = val; + int i; + + if (intel_sdvo->sdvo_reg == PCH_SDVOB) { + I915_WRITE(intel_sdvo->sdvo_reg, val); + I915_READ(intel_sdvo->sdvo_reg); + return; + } + + if (intel_sdvo->sdvo_reg == SDVOB) { + cval = I915_READ(SDVOC); + } else { + bval = I915_READ(SDVOB); + } + /* + * Write the registers twice for luck. Sometimes, + * writing them only once doesn't appear to 'stick'. + * The BIOS does this too. Yay, magic + */ + for (i = 0; i < 2; i++) + { + I915_WRITE(SDVOB, bval); + I915_READ(SDVOB); + I915_WRITE(SDVOC, cval); + I915_READ(SDVOC); + } +} + +static bool intel_sdvo_read_byte(struct intel_sdvo *intel_sdvo, u8 addr, u8 *ch) +{ + struct iic_msg msgs[] = { + { + .slave = intel_sdvo->slave_addr, + .flags = 0, + .len = 1, + .buf = &addr, + }, + { + .slave = intel_sdvo->slave_addr, + .flags = IIC_M_RD, + .len = 1, + .buf = ch, + } + }; + int ret; + + if ((ret = iicbus_transfer(intel_sdvo->i2c, msgs, 2)) == 0) + return true; + + DRM_DEBUG_KMS("i2c transfer returned %d\n", ret); + return false; +} + +#define SDVO_CMD_NAME_ENTRY(cmd) {cmd, #cmd} +/** Mapping of command numbers to names, for debug output */ +static const struct _sdvo_cmd_name { + u8 cmd; + const char *name; +} sdvo_cmd_names[] = { + SDVO_CMD_NAME_ENTRY(SDVO_CMD_RESET), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_DEVICE_CAPS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_FIRMWARE_REV), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_TRAINED_INPUTS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_ACTIVE_OUTPUTS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_ACTIVE_OUTPUTS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_IN_OUT_MAP), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_IN_OUT_MAP), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_ATTACHED_DISPLAYS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HOT_PLUG_SUPPORT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_ACTIVE_HOT_PLUG), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_ACTIVE_HOT_PLUG), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_INTERRUPT_EVENT_SOURCE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TARGET_INPUT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TARGET_OUTPUT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_INPUT_TIMINGS_PART1), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_INPUT_TIMINGS_PART2), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_INPUT_TIMINGS_PART1), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_INPUT_TIMINGS_PART2), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_INPUT_TIMINGS_PART1), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_OUTPUT_TIMINGS_PART1), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_OUTPUT_TIMINGS_PART2), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_OUTPUT_TIMINGS_PART1), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_OUTPUT_TIMINGS_PART2), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_CREATE_PREFERRED_INPUT_TIMING), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_INPUT_PIXEL_CLOCK_RANGE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_OUTPUT_PIXEL_CLOCK_RANGE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_CLOCK_RATE_MULTS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_CLOCK_RATE_MULT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_CLOCK_RATE_MULT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_TV_FORMATS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_TV_FORMAT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TV_FORMAT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_POWER_STATES), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_POWER_STATE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_ENCODER_POWER_STATE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_DISPLAY_POWER_STATE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_CONTROL_BUS_SWITCH), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SCALED_HDTV_RESOLUTION_SUPPORT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS), + + /* Add the op code for SDVO enhancements */ + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_HPOS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HPOS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HPOS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_VPOS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_VPOS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_VPOS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_SATURATION), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SATURATION), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_SATURATION), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_HUE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HUE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HUE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_CONTRAST), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_CONTRAST), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_CONTRAST), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_BRIGHTNESS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_BRIGHTNESS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_BRIGHTNESS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_OVERSCAN_H), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_OVERSCAN_H), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_OVERSCAN_H), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_OVERSCAN_V), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_OVERSCAN_V), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_OVERSCAN_V), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_FLICKER_FILTER), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_FLICKER_FILTER), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_FLICKER_FILTER), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_FLICKER_FILTER_ADAPTIVE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_FLICKER_FILTER_ADAPTIVE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_FLICKER_FILTER_ADAPTIVE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_FLICKER_FILTER_2D), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_FLICKER_FILTER_2D), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_FLICKER_FILTER_2D), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_SHARPNESS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SHARPNESS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_SHARPNESS), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_DOT_CRAWL), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_DOT_CRAWL), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_TV_CHROMA_FILTER), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_TV_CHROMA_FILTER), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TV_CHROMA_FILTER), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_MAX_TV_LUMA_FILTER), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_TV_LUMA_FILTER), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TV_LUMA_FILTER), + + /* HDMI op code */ + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPP_ENCODE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_ENCODE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_ENCODE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_PIXEL_REPLI), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_PIXEL_REPLI), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_COLORIMETRY_CAP), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_COLORIMETRY), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_COLORIMETRY), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_AUDIO_ENCRYPT_PREFER), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_AUDIO_STAT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_AUDIO_STAT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_INDEX), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HBUF_INDEX), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_INFO), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_AV_SPLIT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HBUF_AV_SPLIT), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_TXRATE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HBUF_TXRATE), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HBUF_DATA), + SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_DATA), +}; + +#define IS_SDVOB(reg) (reg == SDVOB || reg == PCH_SDVOB) +#define SDVO_NAME(svdo) (IS_SDVOB((svdo)->sdvo_reg) ? "SDVOB" : "SDVOC") + +static void +intel_sdvo_debug_write(struct intel_sdvo *intel_sdvo, u8 cmd, + const void *args, int args_len) +{ + int i; + + if ((drm_debug_flag & DRM_DEBUGBITS_KMS) == 0) + return; + DRM_DEBUG_KMS("%s: W: %02X ", SDVO_NAME(intel_sdvo), cmd); + for (i = 0; i < args_len; i++) + printf("%02X ", ((const u8 *)args)[i]); + for (; i < 8; i++) + printf(" "); + for (i = 0; i < DRM_ARRAY_SIZE(sdvo_cmd_names); i++) { + if (cmd == sdvo_cmd_names[i].cmd) { + printf("(%s)", sdvo_cmd_names[i].name); + break; + } + } + if (i == DRM_ARRAY_SIZE(sdvo_cmd_names)) + printf("(%02X)", cmd); + printf("\n"); +} + +static const char *cmd_status_names[] = { + "Power on", + "Success", + "Not supported", + "Invalid arg", + "Pending", + "Target not specified", + "Scaling not supported" +}; + +static bool +intel_sdvo_write_cmd(struct intel_sdvo *intel_sdvo, u8 cmd, const void *args, + int args_len) +{ + u8 buf[args_len*2 + 2], status; + struct iic_msg msgs[args_len + 3]; + int i, ret; + + intel_sdvo_debug_write(intel_sdvo, cmd, args, args_len); + + for (i = 0; i < args_len; i++) { + msgs[i].slave = intel_sdvo->slave_addr; + msgs[i].flags = 0; + msgs[i].len = 2; + msgs[i].buf = buf + 2 *i; + buf[2*i + 0] = SDVO_I2C_ARG_0 - i; + buf[2*i + 1] = ((const u8*)args)[i]; + } + msgs[i].slave = intel_sdvo->slave_addr; + msgs[i].flags = 0; + msgs[i].len = 2; + msgs[i].buf = buf + 2*i; + buf[2*i + 0] = SDVO_I2C_OPCODE; + buf[2*i + 1] = cmd; + + /* the following two are to read the response */ + status = SDVO_I2C_CMD_STATUS; + msgs[i+1].slave = intel_sdvo->slave_addr; + msgs[i+1].flags = 0; + msgs[i+1].len = 1; + msgs[i+1].buf = &status; + + msgs[i+2].slave = intel_sdvo->slave_addr; + msgs[i+2].flags = IIC_M_RD; + msgs[i+2].len = 1; + msgs[i+2].buf = &status; + + ret = iicbus_transfer(intel_sdvo->i2c, msgs, i+3); + if (ret != 0) { + DRM_DEBUG_KMS("I2c transfer returned %d\n", ret); + return (false); + } +#if 0 + if (ret != i+3) { + /* failure in I2C transfer */ + DRM_DEBUG_KMS("I2c transfer returned %d/%d\n", ret, i+3); + return false; + } +#endif + + return true; +} + +static bool +intel_sdvo_read_response(struct intel_sdvo *intel_sdvo, void *response, + int response_len) +{ + u8 retry = 5; + u8 status; + int i; + + DRM_DEBUG_KMS("%s: R: ", SDVO_NAME(intel_sdvo)); + + /* + * The documentation states that all commands will be + * processed within 15µs, and that we need only poll + * the status byte a maximum of 3 times in order for the + * command to be complete. + * + * Check 5 times in case the hardware failed to read the docs. + */ + if (!intel_sdvo_read_byte(intel_sdvo, SDVO_I2C_CMD_STATUS, &status)) + goto log_fail; + + while (status == SDVO_CMD_STATUS_PENDING && retry--) { + DELAY(15); + if (!intel_sdvo_read_byte(intel_sdvo, + SDVO_I2C_CMD_STATUS, &status)) + goto log_fail; + } + + if ((drm_debug_flag & DRM_DEBUGBITS_KMS) != 0) { + if (status <= SDVO_CMD_STATUS_SCALING_NOT_SUPP) + printf("(%s)", cmd_status_names[status]); + else + printf("(??? %d)", status); + } + + if (status != SDVO_CMD_STATUS_SUCCESS) + goto log_fail; + + /* Read the command response */ + for (i = 0; i < response_len; i++) { + if (!intel_sdvo_read_byte(intel_sdvo, + SDVO_I2C_RETURN_0 + i, + &((u8 *)response)[i])) + goto log_fail; + if ((drm_debug_flag & DRM_DEBUGBITS_KMS) != 0) + printf(" %02X", ((u8 *)response)[i]); + } + if ((drm_debug_flag & DRM_DEBUGBITS_KMS) != 0) + printf("\n"); + return (true); + +log_fail: + if ((drm_debug_flag & DRM_DEBUGBITS_KMS) != 0) + printf("... failed\n"); + return (false); +} + +static int intel_sdvo_get_pixel_multiplier(struct drm_display_mode *mode) +{ + if (mode->clock >= 100000) + return 1; + else if (mode->clock >= 50000) + return 2; + else + return 4; +} + +static bool intel_sdvo_set_control_bus_switch(struct intel_sdvo *intel_sdvo, + u8 ddc_bus) +{ + /* This must be the immediately preceding write before the i2c xfer */ + return intel_sdvo_write_cmd(intel_sdvo, + SDVO_CMD_SET_CONTROL_BUS_SWITCH, + &ddc_bus, 1); +} + +static bool intel_sdvo_set_value(struct intel_sdvo *intel_sdvo, u8 cmd, const void *data, int len) +{ + if (!intel_sdvo_write_cmd(intel_sdvo, cmd, data, len)) + return false; + + return intel_sdvo_read_response(intel_sdvo, NULL, 0); +} + +static bool +intel_sdvo_get_value(struct intel_sdvo *intel_sdvo, u8 cmd, void *value, int len) +{ + if (!intel_sdvo_write_cmd(intel_sdvo, cmd, NULL, 0)) + return false; + + return intel_sdvo_read_response(intel_sdvo, value, len); +} + +static bool intel_sdvo_set_target_input(struct intel_sdvo *intel_sdvo) +{ + struct intel_sdvo_set_target_input_args targets = {0}; + return intel_sdvo_set_value(intel_sdvo, + SDVO_CMD_SET_TARGET_INPUT, + &targets, sizeof(targets)); +} + +/** + * Return whether each input is trained. + * + * This function is making an assumption about the layout of the response, + * which should be checked against the docs. + */ +static bool intel_sdvo_get_trained_inputs(struct intel_sdvo *intel_sdvo, bool *input_1, bool *input_2) +{ + struct intel_sdvo_get_trained_inputs_response response; + + CTASSERT(sizeof(response) == 1); + if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_TRAINED_INPUTS, + &response, sizeof(response))) + return false; + + *input_1 = response.input0_trained; + *input_2 = response.input1_trained; + return true; +} + +static bool intel_sdvo_set_active_outputs(struct intel_sdvo *intel_sdvo, + u16 outputs) +{ + return intel_sdvo_set_value(intel_sdvo, + SDVO_CMD_SET_ACTIVE_OUTPUTS, + &outputs, sizeof(outputs)); +} + +static bool intel_sdvo_set_encoder_power_state(struct intel_sdvo *intel_sdvo, + int mode) +{ + u8 state = SDVO_ENCODER_STATE_ON; + + switch (mode) { + case DRM_MODE_DPMS_ON: + state = SDVO_ENCODER_STATE_ON; + break; + case DRM_MODE_DPMS_STANDBY: + state = SDVO_ENCODER_STATE_STANDBY; + break; + case DRM_MODE_DPMS_SUSPEND: + state = SDVO_ENCODER_STATE_SUSPEND; + break; + case DRM_MODE_DPMS_OFF: + state = SDVO_ENCODER_STATE_OFF; + break; + } + + return intel_sdvo_set_value(intel_sdvo, + SDVO_CMD_SET_ENCODER_POWER_STATE, &state, sizeof(state)); +} + +static bool intel_sdvo_get_input_pixel_clock_range(struct intel_sdvo *intel_sdvo, + int *clock_min, + int *clock_max) +{ + struct intel_sdvo_pixel_clock_range clocks; + + CTASSERT(sizeof(clocks) == 4); + if (!intel_sdvo_get_value(intel_sdvo, + SDVO_CMD_GET_INPUT_PIXEL_CLOCK_RANGE, + &clocks, sizeof(clocks))) + return false; + + /* Convert the values from units of 10 kHz to kHz. */ + *clock_min = clocks.min * 10; + *clock_max = clocks.max * 10; + return true; +} + +static bool intel_sdvo_set_target_output(struct intel_sdvo *intel_sdvo, + u16 outputs) +{ + return intel_sdvo_set_value(intel_sdvo, + SDVO_CMD_SET_TARGET_OUTPUT, + &outputs, sizeof(outputs)); +} + +static bool intel_sdvo_set_timing(struct intel_sdvo *intel_sdvo, u8 cmd, + struct intel_sdvo_dtd *dtd) +{ + return intel_sdvo_set_value(intel_sdvo, cmd, &dtd->part1, sizeof(dtd->part1)) && + intel_sdvo_set_value(intel_sdvo, cmd + 1, &dtd->part2, sizeof(dtd->part2)); +} + +static bool intel_sdvo_set_input_timing(struct intel_sdvo *intel_sdvo, + struct intel_sdvo_dtd *dtd) +{ + return intel_sdvo_set_timing(intel_sdvo, + SDVO_CMD_SET_INPUT_TIMINGS_PART1, dtd); +} + +static bool intel_sdvo_set_output_timing(struct intel_sdvo *intel_sdvo, + struct intel_sdvo_dtd *dtd) +{ + return intel_sdvo_set_timing(intel_sdvo, + SDVO_CMD_SET_OUTPUT_TIMINGS_PART1, dtd); +} + +static bool +intel_sdvo_create_preferred_input_timing(struct intel_sdvo *intel_sdvo, + uint16_t clock, + uint16_t width, + uint16_t height) +{ + struct intel_sdvo_preferred_input_timing_args args; + + memset(&args, 0, sizeof(args)); + args.clock = clock; + args.width = width; + args.height = height; + args.interlace = 0; + + if (intel_sdvo->is_lvds && + (intel_sdvo->sdvo_lvds_fixed_mode->hdisplay != width || + intel_sdvo->sdvo_lvds_fixed_mode->vdisplay != height)) + args.scaled = 1; + + return intel_sdvo_set_value(intel_sdvo, + SDVO_CMD_CREATE_PREFERRED_INPUT_TIMING, + &args, sizeof(args)); +} + +static bool intel_sdvo_get_preferred_input_timing(struct intel_sdvo *intel_sdvo, + struct intel_sdvo_dtd *dtd) +{ + CTASSERT(sizeof(dtd->part1) == 8); + CTASSERT(sizeof(dtd->part2) == 8); + return intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1, + &dtd->part1, sizeof(dtd->part1)) && + intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2, + &dtd->part2, sizeof(dtd->part2)); +} + +static bool intel_sdvo_set_clock_rate_mult(struct intel_sdvo *intel_sdvo, u8 val) +{ + return intel_sdvo_set_value(intel_sdvo, SDVO_CMD_SET_CLOCK_RATE_MULT, &val, 1); +} + +static void intel_sdvo_get_dtd_from_mode(struct intel_sdvo_dtd *dtd, + const struct drm_display_mode *mode) +{ + uint16_t width, height; + uint16_t h_blank_len, h_sync_len, v_blank_len, v_sync_len; + uint16_t h_sync_offset, v_sync_offset; + int mode_clock; + + width = mode->crtc_hdisplay; + height = mode->crtc_vdisplay; + + /* do some mode translations */ + h_blank_len = mode->crtc_hblank_end - mode->crtc_hblank_start; + h_sync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; + + v_blank_len = mode->crtc_vblank_end - mode->crtc_vblank_start; + v_sync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; + + h_sync_offset = mode->crtc_hsync_start - mode->crtc_hblank_start; + v_sync_offset = mode->crtc_vsync_start - mode->crtc_vblank_start; + + mode_clock = mode->clock; + mode_clock /= intel_mode_get_pixel_multiplier(mode) ?: 1; + mode_clock /= 10; + dtd->part1.clock = mode_clock; + + dtd->part1.h_active = width & 0xff; + dtd->part1.h_blank = h_blank_len & 0xff; + dtd->part1.h_high = (((width >> 8) & 0xf) << 4) | + ((h_blank_len >> 8) & 0xf); + dtd->part1.v_active = height & 0xff; + dtd->part1.v_blank = v_blank_len & 0xff; + dtd->part1.v_high = (((height >> 8) & 0xf) << 4) | + ((v_blank_len >> 8) & 0xf); + + dtd->part2.h_sync_off = h_sync_offset & 0xff; + dtd->part2.h_sync_width = h_sync_len & 0xff; + dtd->part2.v_sync_off_width = (v_sync_offset & 0xf) << 4 | + (v_sync_len & 0xf); + dtd->part2.sync_off_width_high = ((h_sync_offset & 0x300) >> 2) | + ((h_sync_len & 0x300) >> 4) | ((v_sync_offset & 0x30) >> 2) | + ((v_sync_len & 0x30) >> 4); + + dtd->part2.dtd_flags = 0x18; + if (mode->flags & DRM_MODE_FLAG_PHSYNC) + dtd->part2.dtd_flags |= 0x2; + if (mode->flags & DRM_MODE_FLAG_PVSYNC) + dtd->part2.dtd_flags |= 0x4; + + dtd->part2.sdvo_flags = 0; + dtd->part2.v_sync_off_high = v_sync_offset & 0xc0; + dtd->part2.reserved = 0; +} + +static void intel_sdvo_get_mode_from_dtd(struct drm_display_mode * mode, + const struct intel_sdvo_dtd *dtd) +{ + mode->hdisplay = dtd->part1.h_active; + mode->hdisplay += ((dtd->part1.h_high >> 4) & 0x0f) << 8; + mode->hsync_start = mode->hdisplay + dtd->part2.h_sync_off; + mode->hsync_start += (dtd->part2.sync_off_width_high & 0xc0) << 2; + mode->hsync_end = mode->hsync_start + dtd->part2.h_sync_width; + mode->hsync_end += (dtd->part2.sync_off_width_high & 0x30) << 4; + mode->htotal = mode->hdisplay + dtd->part1.h_blank; + mode->htotal += (dtd->part1.h_high & 0xf) << 8; + + mode->vdisplay = dtd->part1.v_active; + mode->vdisplay += ((dtd->part1.v_high >> 4) & 0x0f) << 8; + mode->vsync_start = mode->vdisplay; + mode->vsync_start += (dtd->part2.v_sync_off_width >> 4) & 0xf; + mode->vsync_start += (dtd->part2.sync_off_width_high & 0x0c) << 2; + mode->vsync_start += dtd->part2.v_sync_off_high & 0xc0; + mode->vsync_end = mode->vsync_start + + (dtd->part2.v_sync_off_width & 0xf); + mode->vsync_end += (dtd->part2.sync_off_width_high & 0x3) << 4; + mode->vtotal = mode->vdisplay + dtd->part1.v_blank; + mode->vtotal += (dtd->part1.v_high & 0xf) << 8; + + mode->clock = dtd->part1.clock * 10; + + mode->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC); + if (dtd->part2.dtd_flags & 0x2) + mode->flags |= DRM_MODE_FLAG_PHSYNC; + if (dtd->part2.dtd_flags & 0x4) + mode->flags |= DRM_MODE_FLAG_PVSYNC; +} + +static bool intel_sdvo_check_supp_encode(struct intel_sdvo *intel_sdvo) +{ + struct intel_sdvo_encode encode; + + CTASSERT(sizeof(encode) == 2); + return intel_sdvo_get_value(intel_sdvo, + SDVO_CMD_GET_SUPP_ENCODE, + &encode, sizeof(encode)); +} + +static bool intel_sdvo_set_encode(struct intel_sdvo *intel_sdvo, + uint8_t mode) +{ + return intel_sdvo_set_value(intel_sdvo, SDVO_CMD_SET_ENCODE, &mode, 1); +} + +static bool intel_sdvo_set_colorimetry(struct intel_sdvo *intel_sdvo, + uint8_t mode) +{ + return intel_sdvo_set_value(intel_sdvo, SDVO_CMD_SET_COLORIMETRY, &mode, 1); +} + +#if 0 +static void intel_sdvo_dump_hdmi_buf(struct intel_sdvo *intel_sdvo) +{ + int i, j; + uint8_t set_buf_index[2]; + uint8_t av_split; + uint8_t buf_size; + uint8_t buf[48]; + uint8_t *pos; + + intel_sdvo_get_value(encoder, SDVO_CMD_GET_HBUF_AV_SPLIT, &av_split, 1); + + for (i = 0; i <= av_split; i++) { + set_buf_index[0] = i; set_buf_index[1] = 0; + intel_sdvo_write_cmd(encoder, SDVO_CMD_SET_HBUF_INDEX, + set_buf_index, 2); + intel_sdvo_write_cmd(encoder, SDVO_CMD_GET_HBUF_INFO, NULL, 0); + intel_sdvo_read_response(encoder, &buf_size, 1); + + pos = buf; + for (j = 0; j <= buf_size; j += 8) { + intel_sdvo_write_cmd(encoder, SDVO_CMD_GET_HBUF_DATA, + NULL, 0); + intel_sdvo_read_response(encoder, pos, 8); + pos += 8; + } + } +} +#endif + +static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo) +{ + struct dip_infoframe avi_if = { + .type = DIP_TYPE_AVI, + .ver = DIP_VERSION_AVI, + .len = DIP_LEN_AVI, + }; + uint8_t tx_rate = SDVO_HBUF_TX_VSYNC; + uint8_t set_buf_index[2] = { 1, 0 }; + uint64_t *data = (uint64_t *)&avi_if; + unsigned i; + + intel_dip_infoframe_csum(&avi_if); + + if (!intel_sdvo_set_value(intel_sdvo, + SDVO_CMD_SET_HBUF_INDEX, + set_buf_index, 2)) + return false; + + for (i = 0; i < sizeof(avi_if); i += 8) { + if (!intel_sdvo_set_value(intel_sdvo, + SDVO_CMD_SET_HBUF_DATA, + data, 8)) + return false; + data++; + } + + return intel_sdvo_set_value(intel_sdvo, + SDVO_CMD_SET_HBUF_TXRATE, + &tx_rate, 1); +} + +static bool intel_sdvo_set_tv_format(struct intel_sdvo *intel_sdvo) +{ + struct intel_sdvo_tv_format format; + uint32_t format_map; + + format_map = 1 << intel_sdvo->tv_format_index; + memset(&format, 0, sizeof(format)); + memcpy(&format, &format_map, min(sizeof(format), sizeof(format_map))); + + CTASSERT(sizeof(format) == 6); + return intel_sdvo_set_value(intel_sdvo, + SDVO_CMD_SET_TV_FORMAT, + &format, sizeof(format)); +} + +static bool +intel_sdvo_set_output_timings_from_mode(struct intel_sdvo *intel_sdvo, + struct drm_display_mode *mode) +{ + struct intel_sdvo_dtd output_dtd; + + if (!intel_sdvo_set_target_output(intel_sdvo, + intel_sdvo->attached_output)) + return false; + + intel_sdvo_get_dtd_from_mode(&output_dtd, mode); + if (!intel_sdvo_set_output_timing(intel_sdvo, &output_dtd)) + return false; + + return true; +} + +static bool +intel_sdvo_set_input_timings_for_mode(struct intel_sdvo *intel_sdvo, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + /* Reset the input timing to the screen. Assume always input 0. */ + if (!intel_sdvo_set_target_input(intel_sdvo)) + return false; + + if (!intel_sdvo_create_preferred_input_timing(intel_sdvo, + mode->clock / 10, + mode->hdisplay, + mode->vdisplay)) + return false; + + if (!intel_sdvo_get_preferred_input_timing(intel_sdvo, + &intel_sdvo->input_dtd)) + return false; + + intel_sdvo_get_mode_from_dtd(adjusted_mode, &intel_sdvo->input_dtd); + + return true; +} + +static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder); + int multiplier; + + /* We need to construct preferred input timings based on our + * output timings. To do that, we have to set the output + * timings, even though this isn't really the right place in + * the sequence to do it. Oh well. + */ + if (intel_sdvo->is_tv) { + if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo, mode)) + return false; + + (void) intel_sdvo_set_input_timings_for_mode(intel_sdvo, + mode, + adjusted_mode); + } else if (intel_sdvo->is_lvds) { + if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo, + intel_sdvo->sdvo_lvds_fixed_mode)) + return false; + + (void) intel_sdvo_set_input_timings_for_mode(intel_sdvo, + mode, + adjusted_mode); + } + + /* Make the CRTC code factor in the SDVO pixel multiplier. The + * SDVO device will factor out the multiplier during mode_set. + */ + multiplier = intel_sdvo_get_pixel_multiplier(adjusted_mode); + intel_mode_set_pixel_multiplier(adjusted_mode, multiplier); + + return true; +} + +static void intel_sdvo_mode_set(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_crtc *crtc = encoder->crtc; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder); + u32 sdvox; + struct intel_sdvo_in_out_map in_out; + struct intel_sdvo_dtd input_dtd, output_dtd; + int pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode); + int rate; + + if (!mode) + return; + + /* First, set the input mapping for the first input to our controlled + * output. This is only correct if we're a single-input device, in + * which case the first input is the output from the appropriate SDVO + * channel on the motherboard. In a two-input device, the first input + * will be SDVOB and the second SDVOC. + */ + in_out.in0 = intel_sdvo->attached_output; + in_out.in1 = 0; + + intel_sdvo_set_value(intel_sdvo, + SDVO_CMD_SET_IN_OUT_MAP, + &in_out, sizeof(in_out)); + + /* Set the output timings to the screen */ + if (!intel_sdvo_set_target_output(intel_sdvo, + intel_sdvo->attached_output)) + return; + + /* lvds has a special fixed output timing. */ + if (intel_sdvo->is_lvds) + intel_sdvo_get_dtd_from_mode(&output_dtd, + intel_sdvo->sdvo_lvds_fixed_mode); + else + intel_sdvo_get_dtd_from_mode(&output_dtd, mode); + (void) intel_sdvo_set_output_timing(intel_sdvo, &output_dtd); + + /* Set the input timing to the screen. Assume always input 0. */ + if (!intel_sdvo_set_target_input(intel_sdvo)) + return; + + if (intel_sdvo->has_hdmi_monitor) { + intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_HDMI); + intel_sdvo_set_colorimetry(intel_sdvo, + SDVO_COLORIMETRY_RGB256); + intel_sdvo_set_avi_infoframe(intel_sdvo); + } else + intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_DVI); + + if (intel_sdvo->is_tv && + !intel_sdvo_set_tv_format(intel_sdvo)) + return; + + /* We have tried to get input timing in mode_fixup, and filled into + * adjusted_mode. + */ + intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode); + (void) intel_sdvo_set_input_timing(intel_sdvo, &input_dtd); + + switch (pixel_multiplier) { + default: + case 1: rate = SDVO_CLOCK_RATE_MULT_1X; break; + case 2: rate = SDVO_CLOCK_RATE_MULT_2X; break; + case 4: rate = SDVO_CLOCK_RATE_MULT_4X; break; + } + if (!intel_sdvo_set_clock_rate_mult(intel_sdvo, rate)) + return; + + /* Set the SDVO control regs. */ + if (INTEL_INFO(dev)->gen >= 4) { + /* The real mode polarity is set by the SDVO commands, using + * struct intel_sdvo_dtd. */ + sdvox = SDVO_VSYNC_ACTIVE_HIGH | SDVO_HSYNC_ACTIVE_HIGH; + if (intel_sdvo->is_hdmi) + sdvox |= intel_sdvo->color_range; + if (INTEL_INFO(dev)->gen < 5) + sdvox |= SDVO_BORDER_ENABLE; + } else { + sdvox = I915_READ(intel_sdvo->sdvo_reg); + switch (intel_sdvo->sdvo_reg) { + case SDVOB: + sdvox &= SDVOB_PRESERVE_MASK; + break; + case SDVOC: + sdvox &= SDVOC_PRESERVE_MASK; + break; + } + sdvox |= (9 << 19) | SDVO_BORDER_ENABLE; + } + + if (INTEL_PCH_TYPE(dev) >= PCH_CPT) + sdvox |= TRANSCODER_CPT(intel_crtc->pipe); + else + sdvox |= TRANSCODER(intel_crtc->pipe); + + if (intel_sdvo->has_hdmi_audio) + sdvox |= SDVO_AUDIO_ENABLE; + + if (INTEL_INFO(dev)->gen >= 4) { + /* done in crtc_mode_set as the dpll_md reg must be written early */ + } else if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) { + /* done in crtc_mode_set as it lives inside the dpll register */ + } else { + sdvox |= (pixel_multiplier - 1) << SDVO_PORT_MULTIPLY_SHIFT; + } + + if (input_dtd.part2.sdvo_flags & SDVO_NEED_TO_STALL && + INTEL_INFO(dev)->gen < 5) + sdvox |= SDVO_STALL_SELECT; + intel_sdvo_write_sdvox(intel_sdvo, sdvox); +} + +static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode) +{ + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder); + struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); + u32 temp; + + if (mode != DRM_MODE_DPMS_ON) { + intel_sdvo_set_active_outputs(intel_sdvo, 0); + if (0) + intel_sdvo_set_encoder_power_state(intel_sdvo, mode); + + if (mode == DRM_MODE_DPMS_OFF) { + temp = I915_READ(intel_sdvo->sdvo_reg); + if ((temp & SDVO_ENABLE) != 0) { + intel_sdvo_write_sdvox(intel_sdvo, temp & ~SDVO_ENABLE); + } + } + } else { + bool input1, input2; + int i; + u8 status; + + temp = I915_READ(intel_sdvo->sdvo_reg); + if ((temp & SDVO_ENABLE) == 0) + intel_sdvo_write_sdvox(intel_sdvo, temp | SDVO_ENABLE); + for (i = 0; i < 2; i++) + intel_wait_for_vblank(dev, intel_crtc->pipe); + + status = intel_sdvo_get_trained_inputs(intel_sdvo, &input1, &input2); + /* Warn if the device reported failure to sync. + * A lot of SDVO devices fail to notify of sync, but it's + * a given it the status is a success, we succeeded. + */ + if (status == SDVO_CMD_STATUS_SUCCESS && !input1) { + DRM_DEBUG_KMS("First %s output reported failure to " + "sync\n", SDVO_NAME(intel_sdvo)); + } + + if (0) + intel_sdvo_set_encoder_power_state(intel_sdvo, mode); + intel_sdvo_set_active_outputs(intel_sdvo, intel_sdvo->attached_output); + } + return; +} + +static int intel_sdvo_mode_valid(struct drm_connector *connector, + struct drm_display_mode *mode) +{ + struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector); + + if (mode->flags & DRM_MODE_FLAG_DBLSCAN) + return MODE_NO_DBLESCAN; + + if (intel_sdvo->pixel_clock_min > mode->clock) + return MODE_CLOCK_LOW; + + if (intel_sdvo->pixel_clock_max < mode->clock) + return MODE_CLOCK_HIGH; + + if (intel_sdvo->is_lvds) { + if (mode->hdisplay > intel_sdvo->sdvo_lvds_fixed_mode->hdisplay) + return MODE_PANEL; + + if (mode->vdisplay > intel_sdvo->sdvo_lvds_fixed_mode->vdisplay) + return MODE_PANEL; + } + + return MODE_OK; +} + +static bool intel_sdvo_get_capabilities(struct intel_sdvo *intel_sdvo, struct intel_sdvo_caps *caps) +{ + CTASSERT(sizeof(*caps) == 8); + if (!intel_sdvo_get_value(intel_sdvo, + SDVO_CMD_GET_DEVICE_CAPS, + caps, sizeof(*caps))) + return false; + + DRM_DEBUG_KMS("SDVO capabilities:\n" + " vendor_id: %d\n" + " device_id: %d\n" + " device_rev_id: %d\n" + " sdvo_version_major: %d\n" + " sdvo_version_minor: %d\n" + " sdvo_inputs_mask: %d\n" + " smooth_scaling: %d\n" + " sharp_scaling: %d\n" + " up_scaling: %d\n" + " down_scaling: %d\n" + " stall_support: %d\n" + " output_flags: %d\n", + caps->vendor_id, + caps->device_id, + caps->device_rev_id, + caps->sdvo_version_major, + caps->sdvo_version_minor, + caps->sdvo_inputs_mask, + caps->smooth_scaling, + caps->sharp_scaling, + caps->up_scaling, + caps->down_scaling, + caps->stall_support, + caps->output_flags); + + return true; +} + +static int intel_sdvo_supports_hotplug(struct intel_sdvo *intel_sdvo) +{ + struct drm_device *dev = intel_sdvo->base.base.dev; + u8 response[2]; + + /* HW Erratum: SDVO Hotplug is broken on all i945G chips, there's noise + * on the line. */ + if (IS_I945G(dev) || IS_I945GM(dev)) + return false; + + return intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_HOT_PLUG_SUPPORT, + &response, 2) && response[0]; +} + +static void intel_sdvo_enable_hotplug(struct intel_encoder *encoder) +{ + struct intel_sdvo *intel_sdvo = to_intel_sdvo(&encoder->base); + + intel_sdvo_write_cmd(intel_sdvo, SDVO_CMD_SET_ACTIVE_HOT_PLUG, + &intel_sdvo->hotplug_active, 2); +} + +static bool +intel_sdvo_multifunc_encoder(struct intel_sdvo *intel_sdvo) +{ + /* Is there more than one type of output? */ + return bitcount16(intel_sdvo->caps.output_flags) > 1; +} + +static struct edid * +intel_sdvo_get_edid(struct drm_connector *connector) +{ + struct intel_sdvo *sdvo = intel_attached_sdvo(connector); + return drm_get_edid(connector, sdvo->ddc); +} + +/* Mac mini hack -- use the same DDC as the analog connector */ +static struct edid * +intel_sdvo_get_analog_edid(struct drm_connector *connector) +{ + struct drm_i915_private *dev_priv = connector->dev->dev_private; + + return drm_get_edid(connector, + dev_priv->gmbus[dev_priv->crt_ddc_pin]); +} + +static enum drm_connector_status +intel_sdvo_tmds_sink_detect(struct drm_connector *connector) +{ + struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector); + enum drm_connector_status status; + struct edid *edid; + + edid = intel_sdvo_get_edid(connector); + + if (edid == NULL && intel_sdvo_multifunc_encoder(intel_sdvo)) { + u8 ddc, saved_ddc = intel_sdvo->ddc_bus; + + /* + * Don't use the 1 as the argument of DDC bus switch to get + * the EDID. It is used for SDVO SPD ROM. + */ + for (ddc = intel_sdvo->ddc_bus >> 1; ddc > 1; ddc >>= 1) { + intel_sdvo->ddc_bus = ddc; + edid = intel_sdvo_get_edid(connector); + if (edid) + break; + } + /* + * If we found the EDID on the other bus, + * assume that is the correct DDC bus. + */ + if (edid == NULL) + intel_sdvo->ddc_bus = saved_ddc; + } + + /* + * When there is no edid and no monitor is connected with VGA + * port, try to use the CRT ddc to read the EDID for DVI-connector. + */ + if (edid == NULL) + edid = intel_sdvo_get_analog_edid(connector); + + status = connector_status_unknown; + if (edid != NULL) { + /* DDC bus is shared, match EDID to connector type */ + if (edid->input & DRM_EDID_INPUT_DIGITAL) { + status = connector_status_connected; + if (intel_sdvo->is_hdmi) { + intel_sdvo->has_hdmi_monitor = drm_detect_hdmi_monitor(edid); + intel_sdvo->has_hdmi_audio = drm_detect_monitor_audio(edid); + } + } else + status = connector_status_disconnected; + connector->display_info.raw_edid = NULL; + free(edid, DRM_MEM_KMS); + } + + if (status == connector_status_connected) { + struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); + if (intel_sdvo_connector->force_audio != HDMI_AUDIO_AUTO) + intel_sdvo->has_hdmi_audio = (intel_sdvo_connector->force_audio == HDMI_AUDIO_ON); + } + + return status; +} + +static bool +intel_sdvo_connector_matches_edid(struct intel_sdvo_connector *sdvo, + struct edid *edid) +{ + bool monitor_is_digital = !!(edid->input & DRM_EDID_INPUT_DIGITAL); + bool connector_is_digital = !!IS_DIGITAL(sdvo); + + DRM_DEBUG_KMS("connector_is_digital? %d, monitor_is_digital? %d\n", + connector_is_digital, monitor_is_digital); + return connector_is_digital == monitor_is_digital; +} + +static enum drm_connector_status +intel_sdvo_detect(struct drm_connector *connector, bool force) +{ + uint16_t response; + struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector); + struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); + enum drm_connector_status ret; + + if (!intel_sdvo_write_cmd(intel_sdvo, + SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0)) + return connector_status_unknown; + + /* add 30ms delay when the output type might be TV */ + if (intel_sdvo->caps.output_flags & + (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_CVBS0)) + drm_msleep(30, "915svo"); + + if (!intel_sdvo_read_response(intel_sdvo, &response, 2)) + return connector_status_unknown; + + DRM_DEBUG_KMS("SDVO response %d %d [%x]\n", + response & 0xff, response >> 8, + intel_sdvo_connector->output_flag); + + if (response == 0) + return connector_status_disconnected; + + intel_sdvo->attached_output = response; + + intel_sdvo->has_hdmi_monitor = false; + intel_sdvo->has_hdmi_audio = false; + + if ((intel_sdvo_connector->output_flag & response) == 0) + ret = connector_status_disconnected; + else if (IS_TMDS(intel_sdvo_connector)) + ret = intel_sdvo_tmds_sink_detect(connector); + else { + struct edid *edid; + + /* if we have an edid check it matches the connection */ + edid = intel_sdvo_get_edid(connector); + if (edid == NULL) + edid = intel_sdvo_get_analog_edid(connector); + if (edid != NULL) { + if (intel_sdvo_connector_matches_edid(intel_sdvo_connector, + edid)) + ret = connector_status_connected; + else + ret = connector_status_disconnected; + + connector->display_info.raw_edid = NULL; + free(edid, DRM_MEM_KMS); + } else + ret = connector_status_connected; + } + + /* May update encoder flag for like clock for SDVO TV, etc.*/ + if (ret == connector_status_connected) { + intel_sdvo->is_tv = false; + intel_sdvo->is_lvds = false; + intel_sdvo->base.needs_tv_clock = false; + + if (response & SDVO_TV_MASK) { + intel_sdvo->is_tv = true; + intel_sdvo->base.needs_tv_clock = true; + } + if (response & SDVO_LVDS_MASK) + intel_sdvo->is_lvds = intel_sdvo->sdvo_lvds_fixed_mode != NULL; + } + + return ret; +} + +static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) +{ + struct edid *edid; + + /* set the bus switch and get the modes */ + edid = intel_sdvo_get_edid(connector); + + /* + * Mac mini hack. On this device, the DVI-I connector shares one DDC + * link between analog and digital outputs. So, if the regular SDVO + * DDC fails, check to see if the analog output is disconnected, in + * which case we'll look there for the digital DDC data. + */ + if (edid == NULL) + edid = intel_sdvo_get_analog_edid(connector); + + if (edid != NULL) { + if (intel_sdvo_connector_matches_edid(to_intel_sdvo_connector(connector), + edid)) { + drm_mode_connector_update_edid_property(connector, edid); + drm_add_edid_modes(connector, edid); + } + + connector->display_info.raw_edid = NULL; + free(edid, DRM_MEM_KMS); + } +} + +/* + * Set of SDVO TV modes. + * Note! This is in reply order (see loop in get_tv_modes). + * XXX: all 60Hz refresh? + */ +static const struct drm_display_mode sdvo_tv_modes[] = { + { DRM_MODE("320x200", DRM_MODE_TYPE_DRIVER, 5815, 320, 321, 384, + 416, 0, 200, 201, 232, 233, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("320x240", DRM_MODE_TYPE_DRIVER, 6814, 320, 321, 384, + 416, 0, 240, 241, 272, 273, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("400x300", DRM_MODE_TYPE_DRIVER, 9910, 400, 401, 464, + 496, 0, 300, 301, 332, 333, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 16913, 640, 641, 704, + 736, 0, 350, 351, 382, 383, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 19121, 640, 641, 704, + 736, 0, 400, 401, 432, 433, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 22654, 640, 641, 704, + 736, 0, 480, 481, 512, 513, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("704x480", DRM_MODE_TYPE_DRIVER, 24624, 704, 705, 768, + 800, 0, 480, 481, 512, 513, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("704x576", DRM_MODE_TYPE_DRIVER, 29232, 704, 705, 768, + 800, 0, 576, 577, 608, 609, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("720x350", DRM_MODE_TYPE_DRIVER, 18751, 720, 721, 784, + 816, 0, 350, 351, 382, 383, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 21199, 720, 721, 784, + 816, 0, 400, 401, 432, 433, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 25116, 720, 721, 784, + 816, 0, 480, 481, 512, 513, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("720x540", DRM_MODE_TYPE_DRIVER, 28054, 720, 721, 784, + 816, 0, 540, 541, 572, 573, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 29816, 720, 721, 784, + 816, 0, 576, 577, 608, 609, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("768x576", DRM_MODE_TYPE_DRIVER, 31570, 768, 769, 832, + 864, 0, 576, 577, 608, 609, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 34030, 800, 801, 864, + 896, 0, 600, 601, 632, 633, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 36581, 832, 833, 896, + 928, 0, 624, 625, 656, 657, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("920x766", DRM_MODE_TYPE_DRIVER, 48707, 920, 921, 984, + 1016, 0, 766, 767, 798, 799, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 53827, 1024, 1025, 1088, + 1120, 0, 768, 769, 800, 801, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, + { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 87265, 1280, 1281, 1344, + 1376, 0, 1024, 1025, 1056, 1057, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, +}; + +static void intel_sdvo_get_tv_modes(struct drm_connector *connector) +{ + struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector); + struct intel_sdvo_sdtv_resolution_request tv_res; + uint32_t reply = 0, format_map = 0; + int i; + + /* Read the list of supported input resolutions for the selected TV + * format. + */ + format_map = 1 << intel_sdvo->tv_format_index; + memcpy(&tv_res, &format_map, + min(sizeof(format_map), sizeof(struct intel_sdvo_sdtv_resolution_request))); + + if (!intel_sdvo_set_target_output(intel_sdvo, intel_sdvo->attached_output)) + return; + + CTASSERT(sizeof(tv_res) == 3); + if (!intel_sdvo_write_cmd(intel_sdvo, + SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT, + &tv_res, sizeof(tv_res))) + return; + if (!intel_sdvo_read_response(intel_sdvo, &reply, 3)) + return; + + for (i = 0; i < DRM_ARRAY_SIZE(sdvo_tv_modes); i++) + if (reply & (1 << i)) { + struct drm_display_mode *nmode; + nmode = drm_mode_duplicate(connector->dev, + &sdvo_tv_modes[i]); + if (nmode) + drm_mode_probed_add(connector, nmode); + } +} + +static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) +{ + struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector); + struct drm_i915_private *dev_priv = connector->dev->dev_private; + struct drm_display_mode *newmode; + + /* + * Attempt to get the mode list from DDC. + * Assume that the preferred modes are + * arranged in priority order. + */ + intel_ddc_get_modes(connector, intel_sdvo->i2c); + if (!list_empty(&connector->probed_modes)) + goto end; + + /* Fetch modes from VBT */ + if (dev_priv->sdvo_lvds_vbt_mode != NULL) { + newmode = drm_mode_duplicate(connector->dev, + dev_priv->sdvo_lvds_vbt_mode); + if (newmode != NULL) { + /* Guarantee the mode is preferred */ + newmode->type = (DRM_MODE_TYPE_PREFERRED | + DRM_MODE_TYPE_DRIVER); + drm_mode_probed_add(connector, newmode); + } + } + +end: + list_for_each_entry(newmode, &connector->probed_modes, head) { + if (newmode->type & DRM_MODE_TYPE_PREFERRED) { + intel_sdvo->sdvo_lvds_fixed_mode = + drm_mode_duplicate(connector->dev, newmode); + + drm_mode_set_crtcinfo(intel_sdvo->sdvo_lvds_fixed_mode, + 0); + + intel_sdvo->is_lvds = true; + break; + } + } + +} + +static int intel_sdvo_get_modes(struct drm_connector *connector) +{ + struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); + + if (IS_TV(intel_sdvo_connector)) + intel_sdvo_get_tv_modes(connector); + else if (IS_LVDS(intel_sdvo_connector)) + intel_sdvo_get_lvds_modes(connector); + else + intel_sdvo_get_ddc_modes(connector); + + return !list_empty(&connector->probed_modes); +} + +static void +intel_sdvo_destroy_enhance_property(struct drm_connector *connector) +{ + struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); + struct drm_device *dev = connector->dev; + + if (intel_sdvo_connector->left) + drm_property_destroy(dev, intel_sdvo_connector->left); + if (intel_sdvo_connector->right) + drm_property_destroy(dev, intel_sdvo_connector->right); + if (intel_sdvo_connector->top) + drm_property_destroy(dev, intel_sdvo_connector->top); + if (intel_sdvo_connector->bottom) + drm_property_destroy(dev, intel_sdvo_connector->bottom); + if (intel_sdvo_connector->hpos) + drm_property_destroy(dev, intel_sdvo_connector->hpos); + if (intel_sdvo_connector->vpos) + drm_property_destroy(dev, intel_sdvo_connector->vpos); + if (intel_sdvo_connector->saturation) + drm_property_destroy(dev, intel_sdvo_connector->saturation); + if (intel_sdvo_connector->contrast) + drm_property_destroy(dev, intel_sdvo_connector->contrast); + if (intel_sdvo_connector->hue) + drm_property_destroy(dev, intel_sdvo_connector->hue); + if (intel_sdvo_connector->sharpness) + drm_property_destroy(dev, intel_sdvo_connector->sharpness); + if (intel_sdvo_connector->flicker_filter) + drm_property_destroy(dev, intel_sdvo_connector->flicker_filter); + if (intel_sdvo_connector->flicker_filter_2d) + drm_property_destroy(dev, intel_sdvo_connector->flicker_filter_2d); + if (intel_sdvo_connector->flicker_filter_adaptive) + drm_property_destroy(dev, intel_sdvo_connector->flicker_filter_adaptive); + if (intel_sdvo_connector->tv_luma_filter) + drm_property_destroy(dev, intel_sdvo_connector->tv_luma_filter); + if (intel_sdvo_connector->tv_chroma_filter) + drm_property_destroy(dev, intel_sdvo_connector->tv_chroma_filter); + if (intel_sdvo_connector->dot_crawl) + drm_property_destroy(dev, intel_sdvo_connector->dot_crawl); + if (intel_sdvo_connector->brightness) + drm_property_destroy(dev, intel_sdvo_connector->brightness); +} + +static void intel_sdvo_destroy(struct drm_connector *connector) +{ + struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); + + if (intel_sdvo_connector->tv_format) + drm_property_destroy(connector->dev, + intel_sdvo_connector->tv_format); + + intel_sdvo_destroy_enhance_property(connector); +#if 0 + drm_sysfs_connector_remove(connector); +#endif + drm_connector_cleanup(connector); + free(connector, DRM_MEM_KMS); +} + +static bool intel_sdvo_detect_hdmi_audio(struct drm_connector *connector) +{ + struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector); + struct edid *edid; + bool has_audio = false; + + if (!intel_sdvo->is_hdmi) + return false; + + edid = intel_sdvo_get_edid(connector); + if (edid != NULL && edid->input & DRM_EDID_INPUT_DIGITAL) + has_audio = drm_detect_monitor_audio(edid); + + return has_audio; +} + +static int +intel_sdvo_set_property(struct drm_connector *connector, + struct drm_property *property, + uint64_t val) +{ + struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector); + struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); + struct drm_i915_private *dev_priv = connector->dev->dev_private; + uint16_t temp_value; + uint8_t cmd; + int ret; + + ret = drm_connector_property_set_value(connector, property, val); + if (ret) + return ret; + + if (property == dev_priv->force_audio_property) { + int i = val; + bool has_audio; + + if (i == intel_sdvo_connector->force_audio) + return 0; + + intel_sdvo_connector->force_audio = i; + + if (i == HDMI_AUDIO_AUTO) + has_audio = intel_sdvo_detect_hdmi_audio(connector); + else + has_audio = (i == HDMI_AUDIO_ON); + + if (has_audio == intel_sdvo->has_hdmi_audio) + return 0; + + intel_sdvo->has_hdmi_audio = has_audio; + goto done; + } + + if (property == dev_priv->broadcast_rgb_property) { + if (val == !!intel_sdvo->color_range) + return 0; + + intel_sdvo->color_range = val ? SDVO_COLOR_RANGE_16_235 : 0; + goto done; + } + +#define CHECK_PROPERTY(name, NAME) \ + if (intel_sdvo_connector->name == property) { \ + if (intel_sdvo_connector->cur_##name == temp_value) return 0; \ + if (intel_sdvo_connector->max_##name < temp_value) return -EINVAL; \ + cmd = SDVO_CMD_SET_##NAME; \ + intel_sdvo_connector->cur_##name = temp_value; \ + goto set_value; \ + } + + if (property == intel_sdvo_connector->tv_format) { + if (val >= TV_FORMAT_NUM) + return -EINVAL; + + if (intel_sdvo->tv_format_index == + intel_sdvo_connector->tv_format_supported[val]) + return 0; + + intel_sdvo->tv_format_index = intel_sdvo_connector->tv_format_supported[val]; + goto done; + } else if (IS_TV_OR_LVDS(intel_sdvo_connector)) { + temp_value = val; + if (intel_sdvo_connector->left == property) { + drm_connector_property_set_value(connector, + intel_sdvo_connector->right, val); + if (intel_sdvo_connector->left_margin == temp_value) + return 0; + + intel_sdvo_connector->left_margin = temp_value; + intel_sdvo_connector->right_margin = temp_value; + temp_value = intel_sdvo_connector->max_hscan - + intel_sdvo_connector->left_margin; + cmd = SDVO_CMD_SET_OVERSCAN_H; + goto set_value; + } else if (intel_sdvo_connector->right == property) { + drm_connector_property_set_value(connector, + intel_sdvo_connector->left, val); + if (intel_sdvo_connector->right_margin == temp_value) + return 0; + + intel_sdvo_connector->left_margin = temp_value; + intel_sdvo_connector->right_margin = temp_value; + temp_value = intel_sdvo_connector->max_hscan - + intel_sdvo_connector->left_margin; + cmd = SDVO_CMD_SET_OVERSCAN_H; + goto set_value; + } else if (intel_sdvo_connector->top == property) { + drm_connector_property_set_value(connector, + intel_sdvo_connector->bottom, val); + if (intel_sdvo_connector->top_margin == temp_value) + return 0; + + intel_sdvo_connector->top_margin = temp_value; + intel_sdvo_connector->bottom_margin = temp_value; + temp_value = intel_sdvo_connector->max_vscan - + intel_sdvo_connector->top_margin; + cmd = SDVO_CMD_SET_OVERSCAN_V; + goto set_value; + } else if (intel_sdvo_connector->bottom == property) { + drm_connector_property_set_value(connector, + intel_sdvo_connector->top, val); + if (intel_sdvo_connector->bottom_margin == temp_value) + return 0; + + intel_sdvo_connector->top_margin = temp_value; + intel_sdvo_connector->bottom_margin = temp_value; + temp_value = intel_sdvo_connector->max_vscan - + intel_sdvo_connector->top_margin; + cmd = SDVO_CMD_SET_OVERSCAN_V; + goto set_value; + } + CHECK_PROPERTY(hpos, HPOS) + CHECK_PROPERTY(vpos, VPOS) + CHECK_PROPERTY(saturation, SATURATION) + CHECK_PROPERTY(contrast, CONTRAST) + CHECK_PROPERTY(hue, HUE) + CHECK_PROPERTY(brightness, BRIGHTNESS) + CHECK_PROPERTY(sharpness, SHARPNESS) + CHECK_PROPERTY(flicker_filter, FLICKER_FILTER) + CHECK_PROPERTY(flicker_filter_2d, FLICKER_FILTER_2D) + CHECK_PROPERTY(flicker_filter_adaptive, FLICKER_FILTER_ADAPTIVE) + CHECK_PROPERTY(tv_chroma_filter, TV_CHROMA_FILTER) + CHECK_PROPERTY(tv_luma_filter, TV_LUMA_FILTER) + CHECK_PROPERTY(dot_crawl, DOT_CRAWL) + } + + return -EINVAL; /* unknown property */ + +set_value: + if (!intel_sdvo_set_value(intel_sdvo, cmd, &temp_value, 2)) + return -EIO; + + +done: + if (intel_sdvo->base.base.crtc) { + struct drm_crtc *crtc = intel_sdvo->base.base.crtc; + drm_crtc_helper_set_mode(crtc, &crtc->mode, crtc->x, + crtc->y, crtc->fb); + } + + return 0; +#undef CHECK_PROPERTY +} + +static const struct drm_encoder_helper_funcs intel_sdvo_helper_funcs = { + .dpms = intel_sdvo_dpms, + .mode_fixup = intel_sdvo_mode_fixup, + .prepare = intel_encoder_prepare, + .mode_set = intel_sdvo_mode_set, + .commit = intel_encoder_commit, +}; + +static const struct drm_connector_funcs intel_sdvo_connector_funcs = { + .dpms = drm_helper_connector_dpms, + .detect = intel_sdvo_detect, + .fill_modes = drm_helper_probe_single_connector_modes, + .set_property = intel_sdvo_set_property, + .destroy = intel_sdvo_destroy, +}; + +static const struct drm_connector_helper_funcs intel_sdvo_connector_helper_funcs = { + .get_modes = intel_sdvo_get_modes, + .mode_valid = intel_sdvo_mode_valid, + .best_encoder = intel_best_encoder, +}; + +static void intel_sdvo_enc_destroy(struct drm_encoder *encoder) +{ + struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder); + + if (intel_sdvo->sdvo_lvds_fixed_mode != NULL) + drm_mode_destroy(encoder->dev, + intel_sdvo->sdvo_lvds_fixed_mode); + + device_delete_child(intel_sdvo->base.base.dev->device, + intel_sdvo->ddc_iic_bus); + intel_encoder_destroy(encoder); +} + +static const struct drm_encoder_funcs intel_sdvo_enc_funcs = { + .destroy = intel_sdvo_enc_destroy, +}; + +static void +intel_sdvo_guess_ddc_bus(struct intel_sdvo *sdvo) +{ + uint16_t mask = 0; + unsigned int num_bits; + + /* Make a mask of outputs less than or equal to our own priority in the + * list. + */ + switch (sdvo->controlled_output) { + case SDVO_OUTPUT_LVDS1: + mask |= SDVO_OUTPUT_LVDS1; + case SDVO_OUTPUT_LVDS0: + mask |= SDVO_OUTPUT_LVDS0; + case SDVO_OUTPUT_TMDS1: + mask |= SDVO_OUTPUT_TMDS1; + case SDVO_OUTPUT_TMDS0: + mask |= SDVO_OUTPUT_TMDS0; + case SDVO_OUTPUT_RGB1: + mask |= SDVO_OUTPUT_RGB1; + case SDVO_OUTPUT_RGB0: + mask |= SDVO_OUTPUT_RGB0; + break; + } + + /* Count bits to find what number we are in the priority list. */ + mask &= sdvo->caps.output_flags; + num_bits = bitcount16(mask); + /* If more than 3 outputs, default to DDC bus 3 for now. */ + if (num_bits > 3) + num_bits = 3; + + /* Corresponds to SDVO_CONTROL_BUS_DDCx */ + sdvo->ddc_bus = 1 << num_bits; +} + +/** + * Choose the appropriate DDC bus for control bus switch command for this + * SDVO output based on the controlled output. + * + * DDC bus number assignment is in a priority order of RGB outputs, then TMDS + * outputs, then LVDS outputs. + */ +static void +intel_sdvo_select_ddc_bus(struct drm_i915_private *dev_priv, + struct intel_sdvo *sdvo, u32 reg) +{ + struct sdvo_device_mapping *mapping; + + if (IS_SDVOB(reg)) + mapping = &(dev_priv->sdvo_mappings[0]); + else + mapping = &(dev_priv->sdvo_mappings[1]); + + if (mapping->initialized) + sdvo->ddc_bus = 1 << ((mapping->ddc_pin & 0xf0) >> 4); + else + intel_sdvo_guess_ddc_bus(sdvo); +} + +static void +intel_sdvo_select_i2c_bus(struct drm_i915_private *dev_priv, + struct intel_sdvo *sdvo, u32 reg) +{ + struct sdvo_device_mapping *mapping; + u8 pin; + + if (IS_SDVOB(reg)) + mapping = &dev_priv->sdvo_mappings[0]; + else + mapping = &dev_priv->sdvo_mappings[1]; + + pin = GMBUS_PORT_DPB; + if (mapping->initialized) + pin = mapping->i2c_pin; + + if (pin < GMBUS_NUM_PORTS) { + sdvo->i2c = dev_priv->gmbus[pin]; + intel_gmbus_set_speed(sdvo->i2c, GMBUS_RATE_1MHZ); + intel_gmbus_force_bit(sdvo->i2c, true); + } else { + sdvo->i2c = dev_priv->gmbus[GMBUS_PORT_DPB]; + } +} + +static bool +intel_sdvo_is_hdmi_connector(struct intel_sdvo *intel_sdvo, int device) +{ + return intel_sdvo_check_supp_encode(intel_sdvo); +} + +static u8 +intel_sdvo_get_slave_addr(struct drm_device *dev, int sdvo_reg) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct sdvo_device_mapping *my_mapping, *other_mapping; + + if (IS_SDVOB(sdvo_reg)) { + my_mapping = &dev_priv->sdvo_mappings[0]; + other_mapping = &dev_priv->sdvo_mappings[1]; + } else { + my_mapping = &dev_priv->sdvo_mappings[1]; + other_mapping = &dev_priv->sdvo_mappings[0]; + } + + /* If the BIOS described our SDVO device, take advantage of it. */ + if (my_mapping->slave_addr) + return my_mapping->slave_addr; + + /* If the BIOS only described a different SDVO device, use the + * address that it isn't using. + */ + if (other_mapping->slave_addr) { + if (other_mapping->slave_addr == 0x70) + return 0x72; + else + return 0x70; + } + + /* No SDVO device info is found for another DVO port, + * so use mapping assumption we had before BIOS parsing. + */ + if (IS_SDVOB(sdvo_reg)) + return 0x70; + else + return 0x72; +} + +static void +intel_sdvo_connector_init(struct intel_sdvo_connector *connector, + struct intel_sdvo *encoder) +{ + drm_connector_init(encoder->base.base.dev, + &connector->base.base, + &intel_sdvo_connector_funcs, + connector->base.base.connector_type); + + drm_connector_helper_add(&connector->base.base, + &intel_sdvo_connector_helper_funcs); + + connector->base.base.interlace_allowed = 1; + connector->base.base.doublescan_allowed = 0; + connector->base.base.display_info.subpixel_order = SubPixelHorizontalRGB; + + intel_connector_attach_encoder(&connector->base, &encoder->base); +#if 0 + drm_sysfs_connector_add(&connector->base.base); +#endif +} + +static void +intel_sdvo_add_hdmi_properties(struct intel_sdvo_connector *connector) +{ + struct drm_device *dev = connector->base.base.dev; + + intel_attach_force_audio_property(&connector->base.base); + if (INTEL_INFO(dev)->gen >= 4 && IS_MOBILE(dev)) + intel_attach_broadcast_rgb_property(&connector->base.base); +} + +static bool +intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device) +{ + struct drm_encoder *encoder = &intel_sdvo->base.base; + struct drm_connector *connector; + struct intel_encoder *intel_encoder = to_intel_encoder(encoder); + struct intel_connector *intel_connector; + struct intel_sdvo_connector *intel_sdvo_connector; + + intel_sdvo_connector = malloc(sizeof(struct intel_sdvo_connector), + DRM_MEM_KMS, M_WAITOK | M_ZERO); + + if (device == 0) { + intel_sdvo->controlled_output |= SDVO_OUTPUT_TMDS0; + intel_sdvo_connector->output_flag = SDVO_OUTPUT_TMDS0; + } else if (device == 1) { + intel_sdvo->controlled_output |= SDVO_OUTPUT_TMDS1; + intel_sdvo_connector->output_flag = SDVO_OUTPUT_TMDS1; + } + + intel_connector = &intel_sdvo_connector->base; + connector = &intel_connector->base; + if (intel_sdvo_supports_hotplug(intel_sdvo) & (1 << device)) { + connector->polled = DRM_CONNECTOR_POLL_HPD; + intel_sdvo->hotplug_active[0] |= 1 << device; + /* Some SDVO devices have one-shot hotplug interrupts. + * Ensure that they get re-enabled when an interrupt happens. + */ + intel_encoder->hot_plug = intel_sdvo_enable_hotplug; + intel_sdvo_enable_hotplug(intel_encoder); + } + else + connector->polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT; + encoder->encoder_type = DRM_MODE_ENCODER_TMDS; + connector->connector_type = DRM_MODE_CONNECTOR_DVID; + + if (intel_sdvo_is_hdmi_connector(intel_sdvo, device)) { + connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; + intel_sdvo->is_hdmi = true; + } + intel_sdvo->base.clone_mask = ((1 << INTEL_SDVO_NON_TV_CLONE_BIT) | + (1 << INTEL_ANALOG_CLONE_BIT)); + + intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo); + if (intel_sdvo->is_hdmi) + intel_sdvo_add_hdmi_properties(intel_sdvo_connector); + + return true; +} + +static bool +intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type) +{ + struct drm_encoder *encoder = &intel_sdvo->base.base; + struct drm_connector *connector; + struct intel_connector *intel_connector; + struct intel_sdvo_connector *intel_sdvo_connector; + + intel_sdvo_connector = malloc(sizeof(struct intel_sdvo_connector), + DRM_MEM_KMS, M_WAITOK | M_ZERO); + if (!intel_sdvo_connector) + return false; + + intel_connector = &intel_sdvo_connector->base; + connector = &intel_connector->base; + encoder->encoder_type = DRM_MODE_ENCODER_TVDAC; + connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO; + + intel_sdvo->controlled_output |= type; + intel_sdvo_connector->output_flag = type; + + intel_sdvo->is_tv = true; + intel_sdvo->base.needs_tv_clock = true; + intel_sdvo->base.clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT; + + intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo); + + if (!intel_sdvo_tv_create_property(intel_sdvo, intel_sdvo_connector, type)) + goto err; + + if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector)) + goto err; + + return true; + +err: + intel_sdvo_destroy(connector); + return false; +} + +static bool +intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device) +{ + struct drm_encoder *encoder = &intel_sdvo->base.base; + struct drm_connector *connector; + struct intel_connector *intel_connector; + struct intel_sdvo_connector *intel_sdvo_connector; + + intel_sdvo_connector = malloc(sizeof(struct intel_sdvo_connector), + DRM_MEM_KMS, M_WAITOK | M_ZERO); + + intel_connector = &intel_sdvo_connector->base; + connector = &intel_connector->base; + connector->polled = DRM_CONNECTOR_POLL_CONNECT; + encoder->encoder_type = DRM_MODE_ENCODER_DAC; + connector->connector_type = DRM_MODE_CONNECTOR_VGA; + + if (device == 0) { + intel_sdvo->controlled_output |= SDVO_OUTPUT_RGB0; + intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB0; + } else if (device == 1) { + intel_sdvo->controlled_output |= SDVO_OUTPUT_RGB1; + intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB1; + } + + intel_sdvo->base.clone_mask = ((1 << INTEL_SDVO_NON_TV_CLONE_BIT) | + (1 << INTEL_ANALOG_CLONE_BIT)); + + intel_sdvo_connector_init(intel_sdvo_connector, + intel_sdvo); + return true; +} + +static bool +intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device) +{ + struct drm_encoder *encoder = &intel_sdvo->base.base; + struct drm_connector *connector; + struct intel_connector *intel_connector; + struct intel_sdvo_connector *intel_sdvo_connector; + + intel_sdvo_connector = malloc(sizeof(struct intel_sdvo_connector), + DRM_MEM_KMS, M_WAITOK | M_ZERO); + + intel_connector = &intel_sdvo_connector->base; + connector = &intel_connector->base; + encoder->encoder_type = DRM_MODE_ENCODER_LVDS; + connector->connector_type = DRM_MODE_CONNECTOR_LVDS; + + if (device == 0) { + intel_sdvo->controlled_output |= SDVO_OUTPUT_LVDS0; + intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS0; + } else if (device == 1) { + intel_sdvo->controlled_output |= SDVO_OUTPUT_LVDS1; + intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS1; + } + + intel_sdvo->base.clone_mask = ((1 << INTEL_ANALOG_CLONE_BIT) | + (1 << INTEL_SDVO_LVDS_CLONE_BIT)); + + intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo); + if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector)) + goto err; + + return true; + +err: + intel_sdvo_destroy(connector); + return false; +} + +static bool +intel_sdvo_output_setup(struct intel_sdvo *intel_sdvo, uint16_t flags) +{ + intel_sdvo->is_tv = false; + intel_sdvo->base.needs_tv_clock = false; + intel_sdvo->is_lvds = false; + + /* SDVO requires XXX1 function may not exist unless it has XXX0 function.*/ + + if (flags & SDVO_OUTPUT_TMDS0) + if (!intel_sdvo_dvi_init(intel_sdvo, 0)) + return false; + + if ((flags & SDVO_TMDS_MASK) == SDVO_TMDS_MASK) + if (!intel_sdvo_dvi_init(intel_sdvo, 1)) + return false; + + /* TV has no XXX1 function block */ + if (flags & SDVO_OUTPUT_SVID0) + if (!intel_sdvo_tv_init(intel_sdvo, SDVO_OUTPUT_SVID0)) + return false; + + if (flags & SDVO_OUTPUT_CVBS0) + if (!intel_sdvo_tv_init(intel_sdvo, SDVO_OUTPUT_CVBS0)) + return false; + + if (flags & SDVO_OUTPUT_RGB0) + if (!intel_sdvo_analog_init(intel_sdvo, 0)) + return false; + + if ((flags & SDVO_RGB_MASK) == SDVO_RGB_MASK) + if (!intel_sdvo_analog_init(intel_sdvo, 1)) + return false; + + if (flags & SDVO_OUTPUT_LVDS0) + if (!intel_sdvo_lvds_init(intel_sdvo, 0)) + return false; + + if ((flags & SDVO_LVDS_MASK) == SDVO_LVDS_MASK) + if (!intel_sdvo_lvds_init(intel_sdvo, 1)) + return false; + + if ((flags & SDVO_OUTPUT_MASK) == 0) { + unsigned char bytes[2]; + + intel_sdvo->controlled_output = 0; + memcpy(bytes, &intel_sdvo->caps.output_flags, 2); + DRM_DEBUG_KMS("%s: Unknown SDVO output type (0x%02x%02x)\n", + SDVO_NAME(intel_sdvo), + bytes[0], bytes[1]); + return false; + } + intel_sdvo->base.crtc_mask = (1 << 0) | (1 << 1) | (1 << 2); + + return true; +} + +static bool intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo, + struct intel_sdvo_connector *intel_sdvo_connector, + int type) +{ + struct drm_device *dev = intel_sdvo->base.base.dev; + struct intel_sdvo_tv_format format; + uint32_t format_map, i; + + if (!intel_sdvo_set_target_output(intel_sdvo, type)) + return false; + + CTASSERT(sizeof(format) == 6); + if (!intel_sdvo_get_value(intel_sdvo, + SDVO_CMD_GET_SUPPORTED_TV_FORMATS, + &format, sizeof(format))) + return false; + + memcpy(&format_map, &format, min(sizeof(format_map), sizeof(format))); + + if (format_map == 0) + return false; + + intel_sdvo_connector->format_supported_num = 0; + for (i = 0 ; i < TV_FORMAT_NUM; i++) + if (format_map & (1 << i)) + intel_sdvo_connector->tv_format_supported[intel_sdvo_connector->format_supported_num++] = i; + + + intel_sdvo_connector->tv_format = + drm_property_create(dev, DRM_MODE_PROP_ENUM, + "mode", intel_sdvo_connector->format_supported_num); + if (!intel_sdvo_connector->tv_format) + return false; + + for (i = 0; i < intel_sdvo_connector->format_supported_num; i++) + drm_property_add_enum( + intel_sdvo_connector->tv_format, i, + i, tv_format_names[intel_sdvo_connector->tv_format_supported[i]]); + + intel_sdvo->tv_format_index = intel_sdvo_connector->tv_format_supported[0]; + drm_connector_attach_property(&intel_sdvo_connector->base.base, + intel_sdvo_connector->tv_format, 0); + return true; + +} + +#define ENHANCEMENT(name, NAME) do { \ + if (enhancements.name) { \ + if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_MAX_##NAME, &data_value, 4) || \ + !intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_##NAME, &response, 2)) \ + return false; \ + intel_sdvo_connector->max_##name = data_value[0]; \ + intel_sdvo_connector->cur_##name = response; \ + intel_sdvo_connector->name = \ + drm_property_create_range(dev, 0, #name, 0, data_value[0]); \ + if (!intel_sdvo_connector->name) return false; \ + drm_connector_attach_property(connector, \ + intel_sdvo_connector->name, \ + intel_sdvo_connector->cur_##name); \ + DRM_DEBUG_KMS(#name ": max %d, default %d, current %d\n", \ + data_value[0], data_value[1], response); \ + } \ +} while (0) + +static bool +intel_sdvo_create_enhance_property_tv(struct intel_sdvo *intel_sdvo, + struct intel_sdvo_connector *intel_sdvo_connector, + struct intel_sdvo_enhancements_reply enhancements) +{ + struct drm_device *dev = intel_sdvo->base.base.dev; + struct drm_connector *connector = &intel_sdvo_connector->base.base; + uint16_t response, data_value[2]; + + /* when horizontal overscan is supported, Add the left/right property */ + if (enhancements.overscan_h) { + if (!intel_sdvo_get_value(intel_sdvo, + SDVO_CMD_GET_MAX_OVERSCAN_H, + &data_value, 4)) + return false; + + if (!intel_sdvo_get_value(intel_sdvo, + SDVO_CMD_GET_OVERSCAN_H, + &response, 2)) + return false; + + intel_sdvo_connector->max_hscan = data_value[0]; + intel_sdvo_connector->left_margin = data_value[0] - response; + intel_sdvo_connector->right_margin = intel_sdvo_connector->left_margin; + intel_sdvo_connector->left = + drm_property_create_range(dev, 0, "left_margin", 0, data_value[0]); + if (!intel_sdvo_connector->left) + return false; + + drm_connector_attach_property(connector, + intel_sdvo_connector->left, + intel_sdvo_connector->left_margin); + + intel_sdvo_connector->right = + drm_property_create_range(dev, 0, "right_margin", 0, data_value[0]); + if (!intel_sdvo_connector->right) + return false; + + drm_connector_attach_property(connector, + intel_sdvo_connector->right, + intel_sdvo_connector->right_margin); + DRM_DEBUG_KMS("h_overscan: max %d, " + "default %d, current %d\n", + data_value[0], data_value[1], response); + } + + if (enhancements.overscan_v) { + if (!intel_sdvo_get_value(intel_sdvo, + SDVO_CMD_GET_MAX_OVERSCAN_V, + &data_value, 4)) + return false; + + if (!intel_sdvo_get_value(intel_sdvo, + SDVO_CMD_GET_OVERSCAN_V, + &response, 2)) + return false; + + intel_sdvo_connector->max_vscan = data_value[0]; + intel_sdvo_connector->top_margin = data_value[0] - response; + intel_sdvo_connector->bottom_margin = intel_sdvo_connector->top_margin; + intel_sdvo_connector->top = + drm_property_create_range(dev, 0, + "top_margin", 0, data_value[0]); + if (!intel_sdvo_connector->top) + return false; + + drm_connector_attach_property(connector, + intel_sdvo_connector->top, + intel_sdvo_connector->top_margin); + + intel_sdvo_connector->bottom = + drm_property_create_range(dev, 0, + "bottom_margin", 0, data_value[0]); + if (!intel_sdvo_connector->bottom) + return false; + + drm_connector_attach_property(connector, + intel_sdvo_connector->bottom, + intel_sdvo_connector->bottom_margin); + DRM_DEBUG_KMS("v_overscan: max %d, " + "default %d, current %d\n", + data_value[0], data_value[1], response); + } + + ENHANCEMENT(hpos, HPOS); + ENHANCEMENT(vpos, VPOS); + ENHANCEMENT(saturation, SATURATION); + ENHANCEMENT(contrast, CONTRAST); + ENHANCEMENT(hue, HUE); + ENHANCEMENT(sharpness, SHARPNESS); + ENHANCEMENT(brightness, BRIGHTNESS); + ENHANCEMENT(flicker_filter, FLICKER_FILTER); + ENHANCEMENT(flicker_filter_adaptive, FLICKER_FILTER_ADAPTIVE); + ENHANCEMENT(flicker_filter_2d, FLICKER_FILTER_2D); + ENHANCEMENT(tv_chroma_filter, TV_CHROMA_FILTER); + ENHANCEMENT(tv_luma_filter, TV_LUMA_FILTER); + + if (enhancements.dot_crawl) { + if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_DOT_CRAWL, &response, 2)) + return false; + + intel_sdvo_connector->max_dot_crawl = 1; + intel_sdvo_connector->cur_dot_crawl = response & 0x1; + intel_sdvo_connector->dot_crawl = + drm_property_create_range(dev, 0, "dot_crawl", 0, 1); + if (!intel_sdvo_connector->dot_crawl) + return false; + + drm_connector_attach_property(connector, + intel_sdvo_connector->dot_crawl, + intel_sdvo_connector->cur_dot_crawl); + DRM_DEBUG_KMS("dot crawl: current %d\n", response); + } + + return true; +} + +static bool +intel_sdvo_create_enhance_property_lvds(struct intel_sdvo *intel_sdvo, + struct intel_sdvo_connector *intel_sdvo_connector, + struct intel_sdvo_enhancements_reply enhancements) +{ + struct drm_device *dev = intel_sdvo->base.base.dev; + struct drm_connector *connector = &intel_sdvo_connector->base.base; + uint16_t response, data_value[2]; + + ENHANCEMENT(brightness, BRIGHTNESS); + + return true; +} +#undef ENHANCEMENT + +static bool intel_sdvo_create_enhance_property(struct intel_sdvo *intel_sdvo, + struct intel_sdvo_connector *intel_sdvo_connector) +{ + union { + struct intel_sdvo_enhancements_reply reply; + uint16_t response; + } enhancements; + + CTASSERT(sizeof(enhancements) == 2); + + enhancements.response = 0; + intel_sdvo_get_value(intel_sdvo, + SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS, + &enhancements, sizeof(enhancements)); + if (enhancements.response == 0) { + DRM_DEBUG_KMS("No enhancement is supported\n"); + return true; + } + + if (IS_TV(intel_sdvo_connector)) + return intel_sdvo_create_enhance_property_tv(intel_sdvo, intel_sdvo_connector, enhancements.reply); + else if (IS_LVDS(intel_sdvo_connector)) + return intel_sdvo_create_enhance_property_lvds(intel_sdvo, intel_sdvo_connector, enhancements.reply); + else + return true; +} + +struct intel_sdvo_ddc_proxy_sc { + struct intel_sdvo *intel_sdvo; + device_t port; +}; + +static int +intel_sdvo_ddc_proxy_probe(device_t idev) +{ + + return (BUS_PROBE_DEFAULT); +} + +static int +intel_sdvo_ddc_proxy_attach(device_t idev) +{ + struct intel_sdvo_ddc_proxy_sc *sc; + + sc = device_get_softc(idev); + sc->port = device_add_child(idev, "iicbus", -1); + if (sc->port == NULL) + return (ENXIO); + device_quiet(sc->port); + bus_generic_attach(idev); + return (0); +} + +static int +intel_sdvo_ddc_proxy_detach(device_t idev) +{ + struct intel_sdvo_ddc_proxy_sc *sc; + device_t port; + + sc = device_get_softc(idev); + port = sc->port; + bus_generic_detach(idev); + if (port != NULL) + device_delete_child(idev, port); + return (0); +} + +static int +intel_sdvo_ddc_proxy_reset(device_t idev, u_char speed, u_char addr, + u_char *oldaddr) +{ + struct intel_sdvo_ddc_proxy_sc *sc; + struct intel_sdvo *sdvo; + + sc = device_get_softc(idev); + sdvo = sc->intel_sdvo; + + return (IICBUS_RESET(device_get_parent(sdvo->i2c), speed, addr, + oldaddr)); +} + +static int +intel_sdvo_ddc_proxy_transfer(device_t idev, struct iic_msg *msgs, uint32_t num) +{ + struct intel_sdvo_ddc_proxy_sc *sc; + struct intel_sdvo *sdvo; + + sc = device_get_softc(idev); + sdvo = sc->intel_sdvo; + + if (!intel_sdvo_set_control_bus_switch(sdvo, sdvo->ddc_bus)) + return (EIO); + + return (iicbus_transfer(sdvo->i2c, msgs, num)); +} + +static bool +intel_sdvo_init_ddc_proxy(struct intel_sdvo *sdvo, struct drm_device *dev, + int sdvo_reg) +{ + struct intel_sdvo_ddc_proxy_sc *sc; + int ret; + + sdvo->ddc_iic_bus = device_add_child(dev->device, + "intel_sdvo_ddc_proxy", sdvo_reg); + if (sdvo->ddc_iic_bus == NULL) { + DRM_ERROR("cannot create ddc proxy bus %d\n", sdvo_reg); + return (false); + } + device_quiet(sdvo->ddc_iic_bus); + ret = device_probe_and_attach(sdvo->ddc_iic_bus); + if (ret != 0) { + DRM_ERROR("cannot attach proxy bus %d error %d\n", + sdvo_reg, ret); + device_delete_child(dev->device, sdvo->ddc_iic_bus); + return (false); + } + sc = device_get_softc(sdvo->ddc_iic_bus); + sc->intel_sdvo = sdvo; + + sdvo->ddc = sc->port; + return (true); +} + +static device_method_t intel_sdvo_ddc_proxy_methods[] = { + DEVMETHOD(device_probe, intel_sdvo_ddc_proxy_probe), + DEVMETHOD(device_attach, intel_sdvo_ddc_proxy_attach), + DEVMETHOD(device_detach, intel_sdvo_ddc_proxy_detach), + DEVMETHOD(iicbus_reset, intel_sdvo_ddc_proxy_reset), + DEVMETHOD(iicbus_transfer, intel_sdvo_ddc_proxy_transfer), + DEVMETHOD_END +}; +static driver_t intel_sdvo_ddc_proxy_driver = { + "intel_sdvo_ddc_proxy", + intel_sdvo_ddc_proxy_methods, + sizeof(struct intel_sdvo_ddc_proxy_sc) +}; +static devclass_t intel_sdvo_devclass; +DRIVER_MODULE_ORDERED(intel_sdvo_ddc_proxy, drmn, intel_sdvo_ddc_proxy_driver, + intel_sdvo_devclass, 0, 0, SI_ORDER_FIRST); + + +bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_encoder *intel_encoder; + struct intel_sdvo *intel_sdvo; + int i; + + intel_sdvo = malloc(sizeof(struct intel_sdvo), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + intel_sdvo->sdvo_reg = sdvo_reg; + intel_sdvo->slave_addr = intel_sdvo_get_slave_addr(dev, sdvo_reg) >> 1; + intel_sdvo_select_i2c_bus(dev_priv, intel_sdvo, sdvo_reg); + if (!intel_sdvo_init_ddc_proxy(intel_sdvo, dev, sdvo_reg)) { + free(intel_sdvo, DRM_MEM_KMS); + return false; + } + + /* encoder type will be decided later */ + intel_encoder = &intel_sdvo->base; + intel_encoder->type = INTEL_OUTPUT_SDVO; + drm_encoder_init(dev, &intel_encoder->base, &intel_sdvo_enc_funcs, 0); + + /* Read the regs to test if we can talk to the device */ + for (i = 0; i < 0x40; i++) { + u8 byte; + + if (!intel_sdvo_read_byte(intel_sdvo, i, &byte)) { + DRM_DEBUG_KMS("No SDVO device found on SDVO%c\n", + IS_SDVOB(sdvo_reg) ? 'B' : 'C'); + goto err; + } + } + + if (IS_SDVOB(sdvo_reg)) + dev_priv->hotplug_supported_mask |= SDVOB_HOTPLUG_INT_STATUS; + else + dev_priv->hotplug_supported_mask |= SDVOC_HOTPLUG_INT_STATUS; + + drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs); + + /* In default case sdvo lvds is false */ + if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps)) + goto err; + + /* Set up hotplug command - note paranoia about contents of reply. + * We assume that the hardware is in a sane state, and only touch + * the bits we think we understand. + */ + intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_ACTIVE_HOT_PLUG, + &intel_sdvo->hotplug_active, 2); + intel_sdvo->hotplug_active[0] &= ~0x3; + + if (!intel_sdvo_output_setup(intel_sdvo, + intel_sdvo->caps.output_flags)) { + DRM_DEBUG_KMS("SDVO output failed to setup on SDVO%c\n", + IS_SDVOB(sdvo_reg) ? 'B' : 'C'); + goto err; + } + + intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg); + + /* Set the input timing to the screen. Assume always input 0. */ + if (!intel_sdvo_set_target_input(intel_sdvo)) + goto err; + + if (!intel_sdvo_get_input_pixel_clock_range(intel_sdvo, + &intel_sdvo->pixel_clock_min, + &intel_sdvo->pixel_clock_max)) + goto err; + + DRM_DEBUG_KMS("%s device VID/DID: %02X:%02X.%02X, " + "clock range %dMHz - %dMHz, " + "input 1: %c, input 2: %c, " + "output 1: %c, output 2: %c\n", + SDVO_NAME(intel_sdvo), + intel_sdvo->caps.vendor_id, intel_sdvo->caps.device_id, + intel_sdvo->caps.device_rev_id, + intel_sdvo->pixel_clock_min / 1000, + intel_sdvo->pixel_clock_max / 1000, + (intel_sdvo->caps.sdvo_inputs_mask & 0x1) ? 'Y' : 'N', + (intel_sdvo->caps.sdvo_inputs_mask & 0x2) ? 'Y' : 'N', + /* check currently supported outputs */ + intel_sdvo->caps.output_flags & + (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_RGB0) ? 'Y' : 'N', + intel_sdvo->caps.output_flags & + (SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N'); + return true; + +err: + drm_encoder_cleanup(&intel_encoder->base); + free(intel_sdvo, DRM_MEM_KMS); + + return false; +} diff --git a/sys/dev/drm2/i915/intel_sdvo_regs.h b/sys/dev/drm2/i915/intel_sdvo_regs.h new file mode 100644 index 00000000000..093719785dd --- /dev/null +++ b/sys/dev/drm2/i915/intel_sdvo_regs.h @@ -0,0 +1,725 @@ +/* + * Copyright © 2006-2007 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * + * $FreeBSD$ + */ + +/** + * @file SDVO command definitions and structures. + */ + +#define SDVO_OUTPUT_FIRST (0) +#define SDVO_OUTPUT_TMDS0 (1 << 0) +#define SDVO_OUTPUT_RGB0 (1 << 1) +#define SDVO_OUTPUT_CVBS0 (1 << 2) +#define SDVO_OUTPUT_SVID0 (1 << 3) +#define SDVO_OUTPUT_YPRPB0 (1 << 4) +#define SDVO_OUTPUT_SCART0 (1 << 5) +#define SDVO_OUTPUT_LVDS0 (1 << 6) +#define SDVO_OUTPUT_TMDS1 (1 << 8) +#define SDVO_OUTPUT_RGB1 (1 << 9) +#define SDVO_OUTPUT_CVBS1 (1 << 10) +#define SDVO_OUTPUT_SVID1 (1 << 11) +#define SDVO_OUTPUT_YPRPB1 (1 << 12) +#define SDVO_OUTPUT_SCART1 (1 << 13) +#define SDVO_OUTPUT_LVDS1 (1 << 14) +#define SDVO_OUTPUT_LAST (14) + +struct intel_sdvo_caps { + u8 vendor_id; + u8 device_id; + u8 device_rev_id; + u8 sdvo_version_major; + u8 sdvo_version_minor; + unsigned int sdvo_inputs_mask:2; + unsigned int smooth_scaling:1; + unsigned int sharp_scaling:1; + unsigned int up_scaling:1; + unsigned int down_scaling:1; + unsigned int stall_support:1; + unsigned int pad:1; + u16 output_flags; +} __attribute__((packed)); + +/** This matches the EDID DTD structure, more or less */ +struct intel_sdvo_dtd { + struct { + u16 clock; /**< pixel clock, in 10kHz units */ + u8 h_active; /**< lower 8 bits (pixels) */ + u8 h_blank; /**< lower 8 bits (pixels) */ + u8 h_high; /**< upper 4 bits each h_active, h_blank */ + u8 v_active; /**< lower 8 bits (lines) */ + u8 v_blank; /**< lower 8 bits (lines) */ + u8 v_high; /**< upper 4 bits each v_active, v_blank */ + } part1; + + struct { + u8 h_sync_off; /**< lower 8 bits, from hblank start */ + u8 h_sync_width; /**< lower 8 bits (pixels) */ + /** lower 4 bits each vsync offset, vsync width */ + u8 v_sync_off_width; + /** + * 2 high bits of hsync offset, 2 high bits of hsync width, + * bits 4-5 of vsync offset, and 2 high bits of vsync width. + */ + u8 sync_off_width_high; + u8 dtd_flags; + u8 sdvo_flags; + /** bits 6-7 of vsync offset at bits 6-7 */ + u8 v_sync_off_high; + u8 reserved; + } part2; +} __attribute__((packed)); + +struct intel_sdvo_pixel_clock_range { + u16 min; /**< pixel clock, in 10kHz units */ + u16 max; /**< pixel clock, in 10kHz units */ +} __attribute__((packed)); + +struct intel_sdvo_preferred_input_timing_args { + u16 clock; + u16 width; + u16 height; + u8 interlace:1; + u8 scaled:1; + u8 pad:6; +} __attribute__((packed)); + +/* I2C registers for SDVO */ +#define SDVO_I2C_ARG_0 0x07 +#define SDVO_I2C_ARG_1 0x06 +#define SDVO_I2C_ARG_2 0x05 +#define SDVO_I2C_ARG_3 0x04 +#define SDVO_I2C_ARG_4 0x03 +#define SDVO_I2C_ARG_5 0x02 +#define SDVO_I2C_ARG_6 0x01 +#define SDVO_I2C_ARG_7 0x00 +#define SDVO_I2C_OPCODE 0x08 +#define SDVO_I2C_CMD_STATUS 0x09 +#define SDVO_I2C_RETURN_0 0x0a +#define SDVO_I2C_RETURN_1 0x0b +#define SDVO_I2C_RETURN_2 0x0c +#define SDVO_I2C_RETURN_3 0x0d +#define SDVO_I2C_RETURN_4 0x0e +#define SDVO_I2C_RETURN_5 0x0f +#define SDVO_I2C_RETURN_6 0x10 +#define SDVO_I2C_RETURN_7 0x11 +#define SDVO_I2C_VENDOR_BEGIN 0x20 + +/* Status results */ +#define SDVO_CMD_STATUS_POWER_ON 0x0 +#define SDVO_CMD_STATUS_SUCCESS 0x1 +#define SDVO_CMD_STATUS_NOTSUPP 0x2 +#define SDVO_CMD_STATUS_INVALID_ARG 0x3 +#define SDVO_CMD_STATUS_PENDING 0x4 +#define SDVO_CMD_STATUS_TARGET_NOT_SPECIFIED 0x5 +#define SDVO_CMD_STATUS_SCALING_NOT_SUPP 0x6 + +/* SDVO commands, argument/result registers */ + +#define SDVO_CMD_RESET 0x01 + +/** Returns a struct intel_sdvo_caps */ +#define SDVO_CMD_GET_DEVICE_CAPS 0x02 + +#define SDVO_CMD_GET_FIRMWARE_REV 0x86 +# define SDVO_DEVICE_FIRMWARE_MINOR SDVO_I2C_RETURN_0 +# define SDVO_DEVICE_FIRMWARE_MAJOR SDVO_I2C_RETURN_1 +# define SDVO_DEVICE_FIRMWARE_PATCH SDVO_I2C_RETURN_2 + +/** + * Reports which inputs are trained (managed to sync). + * + * Devices must have trained within 2 vsyncs of a mode change. + */ +#define SDVO_CMD_GET_TRAINED_INPUTS 0x03 +struct intel_sdvo_get_trained_inputs_response { + unsigned int input0_trained:1; + unsigned int input1_trained:1; + unsigned int pad:6; +} __attribute__((packed)); + +/** Returns a struct intel_sdvo_output_flags of active outputs. */ +#define SDVO_CMD_GET_ACTIVE_OUTPUTS 0x04 + +/** + * Sets the current set of active outputs. + * + * Takes a struct intel_sdvo_output_flags. Must be preceded by a SET_IN_OUT_MAP + * on multi-output devices. + */ +#define SDVO_CMD_SET_ACTIVE_OUTPUTS 0x05 + +/** + * Returns the current mapping of SDVO inputs to outputs on the device. + * + * Returns two struct intel_sdvo_output_flags structures. + */ +#define SDVO_CMD_GET_IN_OUT_MAP 0x06 +struct intel_sdvo_in_out_map { + u16 in0, in1; +}; + +/** + * Sets the current mapping of SDVO inputs to outputs on the device. + * + * Takes two struct i380_sdvo_output_flags structures. + */ +#define SDVO_CMD_SET_IN_OUT_MAP 0x07 + +/** + * Returns a struct intel_sdvo_output_flags of attached displays. + */ +#define SDVO_CMD_GET_ATTACHED_DISPLAYS 0x0b + +/** + * Returns a struct intel_sdvo_ouptut_flags of displays supporting hot plugging. + */ +#define SDVO_CMD_GET_HOT_PLUG_SUPPORT 0x0c + +/** + * Takes a struct intel_sdvo_output_flags. + */ +#define SDVO_CMD_SET_ACTIVE_HOT_PLUG 0x0d + +/** + * Returns a struct intel_sdvo_output_flags of displays with hot plug + * interrupts enabled. + */ +#define SDVO_CMD_GET_ACTIVE_HOT_PLUG 0x0e + +#define SDVO_CMD_GET_INTERRUPT_EVENT_SOURCE 0x0f +struct intel_sdvo_get_interrupt_event_source_response { + u16 interrupt_status; + unsigned int ambient_light_interrupt:1; + unsigned int hdmi_audio_encrypt_change:1; + unsigned int pad:6; +} __attribute__((packed)); + +/** + * Selects which input is affected by future input commands. + * + * Commands affected include SET_INPUT_TIMINGS_PART[12], + * GET_INPUT_TIMINGS_PART[12], GET_PREFERRED_INPUT_TIMINGS_PART[12], + * GET_INPUT_PIXEL_CLOCK_RANGE, and CREATE_PREFERRED_INPUT_TIMINGS. + */ +#define SDVO_CMD_SET_TARGET_INPUT 0x10 +struct intel_sdvo_set_target_input_args { + unsigned int target_1:1; + unsigned int pad:7; +} __attribute__((packed)); + +/** + * Takes a struct intel_sdvo_output_flags of which outputs are targeted by + * future output commands. + * + * Affected commands inclue SET_OUTPUT_TIMINGS_PART[12], + * GET_OUTPUT_TIMINGS_PART[12], and GET_OUTPUT_PIXEL_CLOCK_RANGE. + */ +#define SDVO_CMD_SET_TARGET_OUTPUT 0x11 + +#define SDVO_CMD_GET_INPUT_TIMINGS_PART1 0x12 +#define SDVO_CMD_GET_INPUT_TIMINGS_PART2 0x13 +#define SDVO_CMD_SET_INPUT_TIMINGS_PART1 0x14 +#define SDVO_CMD_SET_INPUT_TIMINGS_PART2 0x15 +#define SDVO_CMD_SET_OUTPUT_TIMINGS_PART1 0x16 +#define SDVO_CMD_SET_OUTPUT_TIMINGS_PART2 0x17 +#define SDVO_CMD_GET_OUTPUT_TIMINGS_PART1 0x18 +#define SDVO_CMD_GET_OUTPUT_TIMINGS_PART2 0x19 +/* Part 1 */ +# define SDVO_DTD_CLOCK_LOW SDVO_I2C_ARG_0 +# define SDVO_DTD_CLOCK_HIGH SDVO_I2C_ARG_1 +# define SDVO_DTD_H_ACTIVE SDVO_I2C_ARG_2 +# define SDVO_DTD_H_BLANK SDVO_I2C_ARG_3 +# define SDVO_DTD_H_HIGH SDVO_I2C_ARG_4 +# define SDVO_DTD_V_ACTIVE SDVO_I2C_ARG_5 +# define SDVO_DTD_V_BLANK SDVO_I2C_ARG_6 +# define SDVO_DTD_V_HIGH SDVO_I2C_ARG_7 +/* Part 2 */ +# define SDVO_DTD_HSYNC_OFF SDVO_I2C_ARG_0 +# define SDVO_DTD_HSYNC_WIDTH SDVO_I2C_ARG_1 +# define SDVO_DTD_VSYNC_OFF_WIDTH SDVO_I2C_ARG_2 +# define SDVO_DTD_SYNC_OFF_WIDTH_HIGH SDVO_I2C_ARG_3 +# define SDVO_DTD_DTD_FLAGS SDVO_I2C_ARG_4 +# define SDVO_DTD_DTD_FLAG_INTERLACED (1 << 7) +# define SDVO_DTD_DTD_FLAG_STEREO_MASK (3 << 5) +# define SDVO_DTD_DTD_FLAG_INPUT_MASK (3 << 3) +# define SDVO_DTD_DTD_FLAG_SYNC_MASK (3 << 1) +# define SDVO_DTD_SDVO_FLAS SDVO_I2C_ARG_5 +# define SDVO_DTD_SDVO_FLAG_STALL (1 << 7) +# define SDVO_DTD_SDVO_FLAG_CENTERED (0 << 6) +# define SDVO_DTD_SDVO_FLAG_UPPER_LEFT (1 << 6) +# define SDVO_DTD_SDVO_FLAG_SCALING_MASK (3 << 4) +# define SDVO_DTD_SDVO_FLAG_SCALING_NONE (0 << 4) +# define SDVO_DTD_SDVO_FLAG_SCALING_SHARP (1 << 4) +# define SDVO_DTD_SDVO_FLAG_SCALING_SMOOTH (2 << 4) +# define SDVO_DTD_VSYNC_OFF_HIGH SDVO_I2C_ARG_6 + +/** + * Generates a DTD based on the given width, height, and flags. + * + * This will be supported by any device supporting scaling or interlaced + * modes. + */ +#define SDVO_CMD_CREATE_PREFERRED_INPUT_TIMING 0x1a +# define SDVO_PREFERRED_INPUT_TIMING_CLOCK_LOW SDVO_I2C_ARG_0 +# define SDVO_PREFERRED_INPUT_TIMING_CLOCK_HIGH SDVO_I2C_ARG_1 +# define SDVO_PREFERRED_INPUT_TIMING_WIDTH_LOW SDVO_I2C_ARG_2 +# define SDVO_PREFERRED_INPUT_TIMING_WIDTH_HIGH SDVO_I2C_ARG_3 +# define SDVO_PREFERRED_INPUT_TIMING_HEIGHT_LOW SDVO_I2C_ARG_4 +# define SDVO_PREFERRED_INPUT_TIMING_HEIGHT_HIGH SDVO_I2C_ARG_5 +# define SDVO_PREFERRED_INPUT_TIMING_FLAGS SDVO_I2C_ARG_6 +# define SDVO_PREFERRED_INPUT_TIMING_FLAGS_INTERLACED (1 << 0) +# define SDVO_PREFERRED_INPUT_TIMING_FLAGS_SCALED (1 << 1) + +#define SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1 0x1b +#define SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2 0x1c + +/** Returns a struct intel_sdvo_pixel_clock_range */ +#define SDVO_CMD_GET_INPUT_PIXEL_CLOCK_RANGE 0x1d +/** Returns a struct intel_sdvo_pixel_clock_range */ +#define SDVO_CMD_GET_OUTPUT_PIXEL_CLOCK_RANGE 0x1e + +/** Returns a byte bitfield containing SDVO_CLOCK_RATE_MULT_* flags */ +#define SDVO_CMD_GET_SUPPORTED_CLOCK_RATE_MULTS 0x1f + +/** Returns a byte containing a SDVO_CLOCK_RATE_MULT_* flag */ +#define SDVO_CMD_GET_CLOCK_RATE_MULT 0x20 +/** Takes a byte containing a SDVO_CLOCK_RATE_MULT_* flag */ +#define SDVO_CMD_SET_CLOCK_RATE_MULT 0x21 +# define SDVO_CLOCK_RATE_MULT_1X (1 << 0) +# define SDVO_CLOCK_RATE_MULT_2X (1 << 1) +# define SDVO_CLOCK_RATE_MULT_4X (1 << 3) + +#define SDVO_CMD_GET_SUPPORTED_TV_FORMATS 0x27 +/** 6 bytes of bit flags for TV formats shared by all TV format functions */ +struct intel_sdvo_tv_format { + unsigned int ntsc_m:1; + unsigned int ntsc_j:1; + unsigned int ntsc_443:1; + unsigned int pal_b:1; + unsigned int pal_d:1; + unsigned int pal_g:1; + unsigned int pal_h:1; + unsigned int pal_i:1; + + unsigned int pal_m:1; + unsigned int pal_n:1; + unsigned int pal_nc:1; + unsigned int pal_60:1; + unsigned int secam_b:1; + unsigned int secam_d:1; + unsigned int secam_g:1; + unsigned int secam_k:1; + + unsigned int secam_k1:1; + unsigned int secam_l:1; + unsigned int secam_60:1; + unsigned int hdtv_std_smpte_240m_1080i_59:1; + unsigned int hdtv_std_smpte_240m_1080i_60:1; + unsigned int hdtv_std_smpte_260m_1080i_59:1; + unsigned int hdtv_std_smpte_260m_1080i_60:1; + unsigned int hdtv_std_smpte_274m_1080i_50:1; + + unsigned int hdtv_std_smpte_274m_1080i_59:1; + unsigned int hdtv_std_smpte_274m_1080i_60:1; + unsigned int hdtv_std_smpte_274m_1080p_23:1; + unsigned int hdtv_std_smpte_274m_1080p_24:1; + unsigned int hdtv_std_smpte_274m_1080p_25:1; + unsigned int hdtv_std_smpte_274m_1080p_29:1; + unsigned int hdtv_std_smpte_274m_1080p_30:1; + unsigned int hdtv_std_smpte_274m_1080p_50:1; + + unsigned int hdtv_std_smpte_274m_1080p_59:1; + unsigned int hdtv_std_smpte_274m_1080p_60:1; + unsigned int hdtv_std_smpte_295m_1080i_50:1; + unsigned int hdtv_std_smpte_295m_1080p_50:1; + unsigned int hdtv_std_smpte_296m_720p_59:1; + unsigned int hdtv_std_smpte_296m_720p_60:1; + unsigned int hdtv_std_smpte_296m_720p_50:1; + unsigned int hdtv_std_smpte_293m_480p_59:1; + + unsigned int hdtv_std_smpte_170m_480i_59:1; + unsigned int hdtv_std_iturbt601_576i_50:1; + unsigned int hdtv_std_iturbt601_576p_50:1; + unsigned int hdtv_std_eia_7702a_480i_60:1; + unsigned int hdtv_std_eia_7702a_480p_60:1; + unsigned int pad:3; +} __attribute__((packed)); + +#define SDVO_CMD_GET_TV_FORMAT 0x28 + +#define SDVO_CMD_SET_TV_FORMAT 0x29 + +/** Returns the resolutiosn that can be used with the given TV format */ +#define SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT 0x83 +struct intel_sdvo_sdtv_resolution_request { + unsigned int ntsc_m:1; + unsigned int ntsc_j:1; + unsigned int ntsc_443:1; + unsigned int pal_b:1; + unsigned int pal_d:1; + unsigned int pal_g:1; + unsigned int pal_h:1; + unsigned int pal_i:1; + + unsigned int pal_m:1; + unsigned int pal_n:1; + unsigned int pal_nc:1; + unsigned int pal_60:1; + unsigned int secam_b:1; + unsigned int secam_d:1; + unsigned int secam_g:1; + unsigned int secam_k:1; + + unsigned int secam_k1:1; + unsigned int secam_l:1; + unsigned int secam_60:1; + unsigned int pad:5; +} __attribute__((packed)); + +struct intel_sdvo_sdtv_resolution_reply { + unsigned int res_320x200:1; + unsigned int res_320x240:1; + unsigned int res_400x300:1; + unsigned int res_640x350:1; + unsigned int res_640x400:1; + unsigned int res_640x480:1; + unsigned int res_704x480:1; + unsigned int res_704x576:1; + + unsigned int res_720x350:1; + unsigned int res_720x400:1; + unsigned int res_720x480:1; + unsigned int res_720x540:1; + unsigned int res_720x576:1; + unsigned int res_768x576:1; + unsigned int res_800x600:1; + unsigned int res_832x624:1; + + unsigned int res_920x766:1; + unsigned int res_1024x768:1; + unsigned int res_1280x1024:1; + unsigned int pad:5; +} __attribute__((packed)); + +/* Get supported resolution with squire pixel aspect ratio that can be + scaled for the requested HDTV format */ +#define SDVO_CMD_GET_SCALED_HDTV_RESOLUTION_SUPPORT 0x85 + +struct intel_sdvo_hdtv_resolution_request { + unsigned int hdtv_std_smpte_240m_1080i_59:1; + unsigned int hdtv_std_smpte_240m_1080i_60:1; + unsigned int hdtv_std_smpte_260m_1080i_59:1; + unsigned int hdtv_std_smpte_260m_1080i_60:1; + unsigned int hdtv_std_smpte_274m_1080i_50:1; + unsigned int hdtv_std_smpte_274m_1080i_59:1; + unsigned int hdtv_std_smpte_274m_1080i_60:1; + unsigned int hdtv_std_smpte_274m_1080p_23:1; + + unsigned int hdtv_std_smpte_274m_1080p_24:1; + unsigned int hdtv_std_smpte_274m_1080p_25:1; + unsigned int hdtv_std_smpte_274m_1080p_29:1; + unsigned int hdtv_std_smpte_274m_1080p_30:1; + unsigned int hdtv_std_smpte_274m_1080p_50:1; + unsigned int hdtv_std_smpte_274m_1080p_59:1; + unsigned int hdtv_std_smpte_274m_1080p_60:1; + unsigned int hdtv_std_smpte_295m_1080i_50:1; + + unsigned int hdtv_std_smpte_295m_1080p_50:1; + unsigned int hdtv_std_smpte_296m_720p_59:1; + unsigned int hdtv_std_smpte_296m_720p_60:1; + unsigned int hdtv_std_smpte_296m_720p_50:1; + unsigned int hdtv_std_smpte_293m_480p_59:1; + unsigned int hdtv_std_smpte_170m_480i_59:1; + unsigned int hdtv_std_iturbt601_576i_50:1; + unsigned int hdtv_std_iturbt601_576p_50:1; + + unsigned int hdtv_std_eia_7702a_480i_60:1; + unsigned int hdtv_std_eia_7702a_480p_60:1; + unsigned int pad:6; +} __attribute__((packed)); + +struct intel_sdvo_hdtv_resolution_reply { + unsigned int res_640x480:1; + unsigned int res_800x600:1; + unsigned int res_1024x768:1; + unsigned int res_1280x960:1; + unsigned int res_1400x1050:1; + unsigned int res_1600x1200:1; + unsigned int res_1920x1440:1; + unsigned int res_2048x1536:1; + + unsigned int res_2560x1920:1; + unsigned int res_3200x2400:1; + unsigned int res_3840x2880:1; + unsigned int pad1:5; + + unsigned int res_848x480:1; + unsigned int res_1064x600:1; + unsigned int res_1280x720:1; + unsigned int res_1360x768:1; + unsigned int res_1704x960:1; + unsigned int res_1864x1050:1; + unsigned int res_1920x1080:1; + unsigned int res_2128x1200:1; + + unsigned int res_2560x1400:1; + unsigned int res_2728x1536:1; + unsigned int res_3408x1920:1; + unsigned int res_4264x2400:1; + unsigned int res_5120x2880:1; + unsigned int pad2:3; + + unsigned int res_768x480:1; + unsigned int res_960x600:1; + unsigned int res_1152x720:1; + unsigned int res_1124x768:1; + unsigned int res_1536x960:1; + unsigned int res_1680x1050:1; + unsigned int res_1728x1080:1; + unsigned int res_1920x1200:1; + + unsigned int res_2304x1440:1; + unsigned int res_2456x1536:1; + unsigned int res_3072x1920:1; + unsigned int res_3840x2400:1; + unsigned int res_4608x2880:1; + unsigned int pad3:3; + + unsigned int res_1280x1024:1; + unsigned int pad4:7; + + unsigned int res_1280x768:1; + unsigned int pad5:7; +} __attribute__((packed)); + +/* Get supported power state returns info for encoder and monitor, rely on + last SetTargetInput and SetTargetOutput calls */ +#define SDVO_CMD_GET_SUPPORTED_POWER_STATES 0x2a +/* Get power state returns info for encoder and monitor, rely on last + SetTargetInput and SetTargetOutput calls */ +#define SDVO_CMD_GET_POWER_STATE 0x2b +#define SDVO_CMD_GET_ENCODER_POWER_STATE 0x2b +#define SDVO_CMD_SET_ENCODER_POWER_STATE 0x2c +# define SDVO_ENCODER_STATE_ON (1 << 0) +# define SDVO_ENCODER_STATE_STANDBY (1 << 1) +# define SDVO_ENCODER_STATE_SUSPEND (1 << 2) +# define SDVO_ENCODER_STATE_OFF (1 << 3) +# define SDVO_MONITOR_STATE_ON (1 << 4) +# define SDVO_MONITOR_STATE_STANDBY (1 << 5) +# define SDVO_MONITOR_STATE_SUSPEND (1 << 6) +# define SDVO_MONITOR_STATE_OFF (1 << 7) + +#define SDVO_CMD_GET_MAX_PANEL_POWER_SEQUENCING 0x2d +#define SDVO_CMD_GET_PANEL_POWER_SEQUENCING 0x2e +#define SDVO_CMD_SET_PANEL_POWER_SEQUENCING 0x2f +/** + * The panel power sequencing parameters are in units of milliseconds. + * The high fields are bits 8:9 of the 10-bit values. + */ +struct sdvo_panel_power_sequencing { + u8 t0; + u8 t1; + u8 t2; + u8 t3; + u8 t4; + + unsigned int t0_high:2; + unsigned int t1_high:2; + unsigned int t2_high:2; + unsigned int t3_high:2; + + unsigned int t4_high:2; + unsigned int pad:6; +} __attribute__((packed)); + +#define SDVO_CMD_GET_MAX_BACKLIGHT_LEVEL 0x30 +struct sdvo_max_backlight_reply { + u8 max_value; + u8 default_value; +} __attribute__((packed)); + +#define SDVO_CMD_GET_BACKLIGHT_LEVEL 0x31 +#define SDVO_CMD_SET_BACKLIGHT_LEVEL 0x32 + +#define SDVO_CMD_GET_AMBIENT_LIGHT 0x33 +struct sdvo_get_ambient_light_reply { + u16 trip_low; + u16 trip_high; + u16 value; +} __attribute__((packed)); +#define SDVO_CMD_SET_AMBIENT_LIGHT 0x34 +struct sdvo_set_ambient_light_reply { + u16 trip_low; + u16 trip_high; + unsigned int enable:1; + unsigned int pad:7; +} __attribute__((packed)); + +/* Set display power state */ +#define SDVO_CMD_SET_DISPLAY_POWER_STATE 0x7d +# define SDVO_DISPLAY_STATE_ON (1 << 0) +# define SDVO_DISPLAY_STATE_STANDBY (1 << 1) +# define SDVO_DISPLAY_STATE_SUSPEND (1 << 2) +# define SDVO_DISPLAY_STATE_OFF (1 << 3) + +#define SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS 0x84 +struct intel_sdvo_enhancements_reply { + unsigned int flicker_filter:1; + unsigned int flicker_filter_adaptive:1; + unsigned int flicker_filter_2d:1; + unsigned int saturation:1; + unsigned int hue:1; + unsigned int brightness:1; + unsigned int contrast:1; + unsigned int overscan_h:1; + + unsigned int overscan_v:1; + unsigned int hpos:1; + unsigned int vpos:1; + unsigned int sharpness:1; + unsigned int dot_crawl:1; + unsigned int dither:1; + unsigned int tv_chroma_filter:1; + unsigned int tv_luma_filter:1; +} __attribute__((packed)); + +/* Picture enhancement limits below are dependent on the current TV format, + * and thus need to be queried and set after it. + */ +#define SDVO_CMD_GET_MAX_FLICKER_FILTER 0x4d +#define SDVO_CMD_GET_MAX_FLICKER_FILTER_ADAPTIVE 0x7b +#define SDVO_CMD_GET_MAX_FLICKER_FILTER_2D 0x52 +#define SDVO_CMD_GET_MAX_SATURATION 0x55 +#define SDVO_CMD_GET_MAX_HUE 0x58 +#define SDVO_CMD_GET_MAX_BRIGHTNESS 0x5b +#define SDVO_CMD_GET_MAX_CONTRAST 0x5e +#define SDVO_CMD_GET_MAX_OVERSCAN_H 0x61 +#define SDVO_CMD_GET_MAX_OVERSCAN_V 0x64 +#define SDVO_CMD_GET_MAX_HPOS 0x67 +#define SDVO_CMD_GET_MAX_VPOS 0x6a +#define SDVO_CMD_GET_MAX_SHARPNESS 0x6d +#define SDVO_CMD_GET_MAX_TV_CHROMA_FILTER 0x74 +#define SDVO_CMD_GET_MAX_TV_LUMA_FILTER 0x77 +struct intel_sdvo_enhancement_limits_reply { + u16 max_value; + u16 default_value; +} __attribute__((packed)); + +#define SDVO_CMD_GET_LVDS_PANEL_INFORMATION 0x7f +#define SDVO_CMD_SET_LVDS_PANEL_INFORMATION 0x80 +# define SDVO_LVDS_COLOR_DEPTH_18 (0 << 0) +# define SDVO_LVDS_COLOR_DEPTH_24 (1 << 0) +# define SDVO_LVDS_CONNECTOR_SPWG (0 << 2) +# define SDVO_LVDS_CONNECTOR_OPENLDI (1 << 2) +# define SDVO_LVDS_SINGLE_CHANNEL (0 << 4) +# define SDVO_LVDS_DUAL_CHANNEL (1 << 4) + +#define SDVO_CMD_GET_FLICKER_FILTER 0x4e +#define SDVO_CMD_SET_FLICKER_FILTER 0x4f +#define SDVO_CMD_GET_FLICKER_FILTER_ADAPTIVE 0x50 +#define SDVO_CMD_SET_FLICKER_FILTER_ADAPTIVE 0x51 +#define SDVO_CMD_GET_FLICKER_FILTER_2D 0x53 +#define SDVO_CMD_SET_FLICKER_FILTER_2D 0x54 +#define SDVO_CMD_GET_SATURATION 0x56 +#define SDVO_CMD_SET_SATURATION 0x57 +#define SDVO_CMD_GET_HUE 0x59 +#define SDVO_CMD_SET_HUE 0x5a +#define SDVO_CMD_GET_BRIGHTNESS 0x5c +#define SDVO_CMD_SET_BRIGHTNESS 0x5d +#define SDVO_CMD_GET_CONTRAST 0x5f +#define SDVO_CMD_SET_CONTRAST 0x60 +#define SDVO_CMD_GET_OVERSCAN_H 0x62 +#define SDVO_CMD_SET_OVERSCAN_H 0x63 +#define SDVO_CMD_GET_OVERSCAN_V 0x65 +#define SDVO_CMD_SET_OVERSCAN_V 0x66 +#define SDVO_CMD_GET_HPOS 0x68 +#define SDVO_CMD_SET_HPOS 0x69 +#define SDVO_CMD_GET_VPOS 0x6b +#define SDVO_CMD_SET_VPOS 0x6c +#define SDVO_CMD_GET_SHARPNESS 0x6e +#define SDVO_CMD_SET_SHARPNESS 0x6f +#define SDVO_CMD_GET_TV_CHROMA_FILTER 0x75 +#define SDVO_CMD_SET_TV_CHROMA_FILTER 0x76 +#define SDVO_CMD_GET_TV_LUMA_FILTER 0x78 +#define SDVO_CMD_SET_TV_LUMA_FILTER 0x79 +struct intel_sdvo_enhancements_arg { + u16 value; +} __attribute__((packed)); + +#define SDVO_CMD_GET_DOT_CRAWL 0x70 +#define SDVO_CMD_SET_DOT_CRAWL 0x71 +# define SDVO_DOT_CRAWL_ON (1 << 0) +# define SDVO_DOT_CRAWL_DEFAULT_ON (1 << 1) + +#define SDVO_CMD_GET_DITHER 0x72 +#define SDVO_CMD_SET_DITHER 0x73 +# define SDVO_DITHER_ON (1 << 0) +# define SDVO_DITHER_DEFAULT_ON (1 << 1) + +#define SDVO_CMD_SET_CONTROL_BUS_SWITCH 0x7a +# define SDVO_CONTROL_BUS_PROM (1 << 0) +# define SDVO_CONTROL_BUS_DDC1 (1 << 1) +# define SDVO_CONTROL_BUS_DDC2 (1 << 2) +# define SDVO_CONTROL_BUS_DDC3 (1 << 3) + +/* HDMI op codes */ +#define SDVO_CMD_GET_SUPP_ENCODE 0x9d +#define SDVO_CMD_GET_ENCODE 0x9e +#define SDVO_CMD_SET_ENCODE 0x9f + #define SDVO_ENCODE_DVI 0x0 + #define SDVO_ENCODE_HDMI 0x1 +#define SDVO_CMD_SET_PIXEL_REPLI 0x8b +#define SDVO_CMD_GET_PIXEL_REPLI 0x8c +#define SDVO_CMD_GET_COLORIMETRY_CAP 0x8d +#define SDVO_CMD_SET_COLORIMETRY 0x8e + #define SDVO_COLORIMETRY_RGB256 0x0 + #define SDVO_COLORIMETRY_RGB220 0x1 + #define SDVO_COLORIMETRY_YCrCb422 0x3 + #define SDVO_COLORIMETRY_YCrCb444 0x4 +#define SDVO_CMD_GET_COLORIMETRY 0x8f +#define SDVO_CMD_GET_AUDIO_ENCRYPT_PREFER 0x90 +#define SDVO_CMD_SET_AUDIO_STAT 0x91 +#define SDVO_CMD_GET_AUDIO_STAT 0x92 +#define SDVO_CMD_SET_HBUF_INDEX 0x93 +#define SDVO_CMD_GET_HBUF_INDEX 0x94 +#define SDVO_CMD_GET_HBUF_INFO 0x95 +#define SDVO_CMD_SET_HBUF_AV_SPLIT 0x96 +#define SDVO_CMD_GET_HBUF_AV_SPLIT 0x97 +#define SDVO_CMD_SET_HBUF_DATA 0x98 +#define SDVO_CMD_GET_HBUF_DATA 0x99 +#define SDVO_CMD_SET_HBUF_TXRATE 0x9a +#define SDVO_CMD_GET_HBUF_TXRATE 0x9b + #define SDVO_HBUF_TX_DISABLED (0 << 6) + #define SDVO_HBUF_TX_ONCE (2 << 6) + #define SDVO_HBUF_TX_VSYNC (3 << 6) +#define SDVO_CMD_GET_AUDIO_TX_INFO 0x9c +#define SDVO_NEED_TO_STALL (1 << 7) + +struct intel_sdvo_encode { + u8 dvi_rev; + u8 hdmi_rev; +} __attribute__ ((packed)); diff --git a/sys/dev/drm2/i915/intel_sprite.c b/sys/dev/drm2/i915/intel_sprite.c new file mode 100644 index 00000000000..0737a5c6cf1 --- /dev/null +++ b/sys/dev/drm2/i915/intel_sprite.c @@ -0,0 +1,669 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Jesse Barnes + * + * New plane/sprite handling. + * + * The older chips had a separate interface for programming plane related + * registers; newer ones are much simpler and we can use the new DRM plane + * support. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +static void +ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb, + struct drm_i915_gem_object *obj, int crtc_x, int crtc_y, + unsigned int crtc_w, unsigned int crtc_h, + uint32_t x, uint32_t y, + uint32_t src_w, uint32_t src_h) +{ + struct drm_device *dev = plane->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_plane *intel_plane = to_intel_plane(plane); + int pipe = intel_plane->pipe; + u32 sprctl, sprscale = 0; + int pixel_size; + + sprctl = I915_READ(SPRCTL(pipe)); + + /* Mask out pixel format bits in case we change it */ + sprctl &= ~SPRITE_PIXFORMAT_MASK; + sprctl &= ~SPRITE_RGB_ORDER_RGBX; + sprctl &= ~SPRITE_YUV_BYTE_ORDER_MASK; + + switch (fb->pixel_format) { + case DRM_FORMAT_XBGR8888: + sprctl |= SPRITE_FORMAT_RGBX888; + pixel_size = 4; + break; + case DRM_FORMAT_XRGB8888: + sprctl |= SPRITE_FORMAT_RGBX888 | SPRITE_RGB_ORDER_RGBX; + pixel_size = 4; + break; + case DRM_FORMAT_YUYV: + sprctl |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_YUYV; + pixel_size = 2; + break; + case DRM_FORMAT_YVYU: + sprctl |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_YVYU; + pixel_size = 2; + break; + case DRM_FORMAT_UYVY: + sprctl |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_UYVY; + pixel_size = 2; + break; + case DRM_FORMAT_VYUY: + sprctl |= SPRITE_FORMAT_YUV422 | SPRITE_YUV_ORDER_VYUY; + pixel_size = 2; + break; + default: + DRM_DEBUG_DRIVER("bad pixel format, assuming RGBX888\n"); + sprctl |= DVS_FORMAT_RGBX888; + pixel_size = 4; + break; + } + + if (obj->tiling_mode != I915_TILING_NONE) + sprctl |= SPRITE_TILED; + + /* must disable */ + sprctl |= SPRITE_TRICKLE_FEED_DISABLE; + sprctl |= SPRITE_ENABLE; + + /* Sizes are 0 based */ + src_w--; + src_h--; + crtc_w--; + crtc_h--; + + intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size); + + /* + * IVB workaround: must disable low power watermarks for at least + * one frame before enabling scaling. LP watermarks can be re-enabled + * when scaling is disabled. + */ + if (crtc_w != src_w || crtc_h != src_h) { + dev_priv->sprite_scaling_enabled = true; + sandybridge_update_wm(dev); + intel_wait_for_vblank(dev, pipe); + sprscale = SPRITE_SCALE_ENABLE | (src_w << 16) | src_h; + } else { + dev_priv->sprite_scaling_enabled = false; + /* potentially re-enable LP watermarks */ + sandybridge_update_wm(dev); + } + + I915_WRITE(SPRSTRIDE(pipe), fb->pitches[0]); + I915_WRITE(SPRPOS(pipe), (crtc_y << 16) | crtc_x); + if (obj->tiling_mode != I915_TILING_NONE) { + I915_WRITE(SPRTILEOFF(pipe), (y << 16) | x); + } else { + unsigned long offset; + + offset = y * fb->pitches[0] + x * (fb->bits_per_pixel / 8); + I915_WRITE(SPRLINOFF(pipe), offset); + } + I915_WRITE(SPRSIZE(pipe), (crtc_h << 16) | crtc_w); + I915_WRITE(SPRSCALE(pipe), sprscale); + I915_WRITE(SPRCTL(pipe), sprctl); + I915_WRITE(SPRSURF(pipe), obj->gtt_offset); + POSTING_READ(SPRSURF(pipe)); +} + +static void +ivb_disable_plane(struct drm_plane *plane) +{ + struct drm_device *dev = plane->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_plane *intel_plane = to_intel_plane(plane); + int pipe = intel_plane->pipe; + + I915_WRITE(SPRCTL(pipe), I915_READ(SPRCTL(pipe)) & ~SPRITE_ENABLE); + /* Can't leave the scaler enabled... */ + I915_WRITE(SPRSCALE(pipe), 0); + /* Activate double buffered register update */ + I915_WRITE(SPRSURF(pipe), 0); + POSTING_READ(SPRSURF(pipe)); +} + +static int +ivb_update_colorkey(struct drm_plane *plane, + struct drm_intel_sprite_colorkey *key) +{ + struct drm_device *dev = plane->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_plane *intel_plane; + u32 sprctl; + int ret = 0; + + intel_plane = to_intel_plane(plane); + + I915_WRITE(SPRKEYVAL(intel_plane->pipe), key->min_value); + I915_WRITE(SPRKEYMAX(intel_plane->pipe), key->max_value); + I915_WRITE(SPRKEYMSK(intel_plane->pipe), key->channel_mask); + + sprctl = I915_READ(SPRCTL(intel_plane->pipe)); + sprctl &= ~(SPRITE_SOURCE_KEY | SPRITE_DEST_KEY); + if (key->flags & I915_SET_COLORKEY_DESTINATION) + sprctl |= SPRITE_DEST_KEY; + else if (key->flags & I915_SET_COLORKEY_SOURCE) + sprctl |= SPRITE_SOURCE_KEY; + I915_WRITE(SPRCTL(intel_plane->pipe), sprctl); + + POSTING_READ(SPRKEYMSK(intel_plane->pipe)); + + return ret; +} + +static void +ivb_get_colorkey(struct drm_plane *plane, struct drm_intel_sprite_colorkey *key) +{ + struct drm_device *dev = plane->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_plane *intel_plane; + u32 sprctl; + + intel_plane = to_intel_plane(plane); + + key->min_value = I915_READ(SPRKEYVAL(intel_plane->pipe)); + key->max_value = I915_READ(SPRKEYMAX(intel_plane->pipe)); + key->channel_mask = I915_READ(SPRKEYMSK(intel_plane->pipe)); + key->flags = 0; + + sprctl = I915_READ(SPRCTL(intel_plane->pipe)); + + if (sprctl & SPRITE_DEST_KEY) + key->flags = I915_SET_COLORKEY_DESTINATION; + else if (sprctl & SPRITE_SOURCE_KEY) + key->flags = I915_SET_COLORKEY_SOURCE; + else + key->flags = I915_SET_COLORKEY_NONE; +} + +static void +snb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb, + struct drm_i915_gem_object *obj, int crtc_x, int crtc_y, + unsigned int crtc_w, unsigned int crtc_h, + uint32_t x, uint32_t y, + uint32_t src_w, uint32_t src_h) +{ + struct drm_device *dev = plane->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_plane *intel_plane = to_intel_plane(plane); + int pipe = intel_plane->pipe, pixel_size; + u32 dvscntr, dvsscale = 0; + + dvscntr = I915_READ(DVSCNTR(pipe)); + + /* Mask out pixel format bits in case we change it */ + dvscntr &= ~DVS_PIXFORMAT_MASK; + dvscntr &= ~DVS_RGB_ORDER_XBGR; + dvscntr &= ~DVS_YUV_BYTE_ORDER_MASK; + + switch (fb->pixel_format) { + case DRM_FORMAT_XBGR8888: + dvscntr |= DVS_FORMAT_RGBX888 | DVS_RGB_ORDER_XBGR; + pixel_size = 4; + break; + case DRM_FORMAT_XRGB8888: + dvscntr |= DVS_FORMAT_RGBX888; + pixel_size = 4; + break; + case DRM_FORMAT_YUYV: + dvscntr |= DVS_FORMAT_YUV422 | DVS_YUV_ORDER_YUYV; + pixel_size = 2; + break; + case DRM_FORMAT_YVYU: + dvscntr |= DVS_FORMAT_YUV422 | DVS_YUV_ORDER_YVYU; + pixel_size = 2; + break; + case DRM_FORMAT_UYVY: + dvscntr |= DVS_FORMAT_YUV422 | DVS_YUV_ORDER_UYVY; + pixel_size = 2; + break; + case DRM_FORMAT_VYUY: + dvscntr |= DVS_FORMAT_YUV422 | DVS_YUV_ORDER_VYUY; + pixel_size = 2; + break; + default: + DRM_DEBUG_DRIVER("bad pixel format, assuming RGBX888\n"); + dvscntr |= DVS_FORMAT_RGBX888; + pixel_size = 4; + break; + } + + if (obj->tiling_mode != I915_TILING_NONE) + dvscntr |= DVS_TILED; + + /* must disable */ + dvscntr |= DVS_TRICKLE_FEED_DISABLE; + dvscntr |= DVS_ENABLE; + + /* Sizes are 0 based */ + src_w--; + src_h--; + crtc_w--; + crtc_h--; + + intel_update_sprite_watermarks(dev, pipe, crtc_w, pixel_size); + + if (crtc_w != src_w || crtc_h != src_h) + dvsscale = DVS_SCALE_ENABLE | (src_w << 16) | src_h; + + I915_WRITE(DVSSTRIDE(pipe), fb->pitches[0]); + I915_WRITE(DVSPOS(pipe), (crtc_y << 16) | crtc_x); + if (obj->tiling_mode != I915_TILING_NONE) { + I915_WRITE(DVSTILEOFF(pipe), (y << 16) | x); + } else { + unsigned long offset; + + offset = y * fb->pitches[0] + x * (fb->bits_per_pixel / 8); + I915_WRITE(DVSLINOFF(pipe), offset); + } + I915_WRITE(DVSSIZE(pipe), (crtc_h << 16) | crtc_w); + I915_WRITE(DVSSCALE(pipe), dvsscale); + I915_WRITE(DVSCNTR(pipe), dvscntr); + I915_WRITE(DVSSURF(pipe), obj->gtt_offset); + POSTING_READ(DVSSURF(pipe)); +} + +static void +snb_disable_plane(struct drm_plane *plane) +{ + struct drm_device *dev = plane->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_plane *intel_plane = to_intel_plane(plane); + int pipe = intel_plane->pipe; + + I915_WRITE(DVSCNTR(pipe), I915_READ(DVSCNTR(pipe)) & ~DVS_ENABLE); + /* Disable the scaler */ + I915_WRITE(DVSSCALE(pipe), 0); + /* Flush double buffered register updates */ + I915_WRITE(DVSSURF(pipe), 0); + POSTING_READ(DVSSURF(pipe)); +} + +static void +intel_enable_primary(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int reg = DSPCNTR(intel_crtc->plane); + + I915_WRITE(reg, I915_READ(reg) | DISPLAY_PLANE_ENABLE); +} + +static void +intel_disable_primary(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int reg = DSPCNTR(intel_crtc->plane); + + I915_WRITE(reg, I915_READ(reg) & ~DISPLAY_PLANE_ENABLE); +} + +static int +snb_update_colorkey(struct drm_plane *plane, + struct drm_intel_sprite_colorkey *key) +{ + struct drm_device *dev = plane->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_plane *intel_plane; + u32 dvscntr; + int ret = 0; + + intel_plane = to_intel_plane(plane); + + I915_WRITE(DVSKEYVAL(intel_plane->pipe), key->min_value); + I915_WRITE(DVSKEYMAX(intel_plane->pipe), key->max_value); + I915_WRITE(DVSKEYMSK(intel_plane->pipe), key->channel_mask); + + dvscntr = I915_READ(DVSCNTR(intel_plane->pipe)); + dvscntr &= ~(DVS_SOURCE_KEY | DVS_DEST_KEY); + if (key->flags & I915_SET_COLORKEY_DESTINATION) + dvscntr |= DVS_DEST_KEY; + else if (key->flags & I915_SET_COLORKEY_SOURCE) + dvscntr |= DVS_SOURCE_KEY; + I915_WRITE(DVSCNTR(intel_plane->pipe), dvscntr); + + POSTING_READ(DVSKEYMSK(intel_plane->pipe)); + + return ret; +} + +static void +snb_get_colorkey(struct drm_plane *plane, struct drm_intel_sprite_colorkey *key) +{ + struct drm_device *dev = plane->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_plane *intel_plane; + u32 dvscntr; + + intel_plane = to_intel_plane(plane); + + key->min_value = I915_READ(DVSKEYVAL(intel_plane->pipe)); + key->max_value = I915_READ(DVSKEYMAX(intel_plane->pipe)); + key->channel_mask = I915_READ(DVSKEYMSK(intel_plane->pipe)); + key->flags = 0; + + dvscntr = I915_READ(DVSCNTR(intel_plane->pipe)); + + if (dvscntr & DVS_DEST_KEY) + key->flags = I915_SET_COLORKEY_DESTINATION; + else if (dvscntr & DVS_SOURCE_KEY) + key->flags = I915_SET_COLORKEY_SOURCE; + else + key->flags = I915_SET_COLORKEY_NONE; +} + +static int +intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc, + struct drm_framebuffer *fb, int crtc_x, int crtc_y, + unsigned int crtc_w, unsigned int crtc_h, + uint32_t src_x, uint32_t src_y, + uint32_t src_w, uint32_t src_h) +{ + struct drm_device *dev = plane->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct intel_plane *intel_plane = to_intel_plane(plane); + struct intel_framebuffer *intel_fb; + struct drm_i915_gem_object *obj, *old_obj; + int pipe = intel_plane->pipe; + int ret = 0; + int x = src_x >> 16, y = src_y >> 16; + int primary_w = crtc->mode.hdisplay, primary_h = crtc->mode.vdisplay; + bool disable_primary = false; + + intel_fb = to_intel_framebuffer(fb); + obj = intel_fb->obj; + + old_obj = intel_plane->obj; + + src_w = src_w >> 16; + src_h = src_h >> 16; + + /* Pipe must be running... */ + if (!(I915_READ(PIPECONF(pipe)) & PIPECONF_ENABLE)) + return -EINVAL; + + if (crtc_x >= primary_w || crtc_y >= primary_h) + return -EINVAL; + + /* Don't modify another pipe's plane */ + if (intel_plane->pipe != intel_crtc->pipe) + return -EINVAL; + + /* + * Clamp the width & height into the visible area. Note we don't + * try to scale the source if part of the visible region is offscreen. + * The caller must handle that by adjusting source offset and size. + */ + if ((crtc_x < 0) && ((crtc_x + crtc_w) > 0)) { + crtc_w += crtc_x; + crtc_x = 0; + } + if ((crtc_x + crtc_w) <= 0) /* Nothing to display */ + goto out; + if ((crtc_x + crtc_w) > primary_w) + crtc_w = primary_w - crtc_x; + + if ((crtc_y < 0) && ((crtc_y + crtc_h) > 0)) { + crtc_h += crtc_y; + crtc_y = 0; + } + if ((crtc_y + crtc_h) <= 0) /* Nothing to display */ + goto out; + if (crtc_y + crtc_h > primary_h) + crtc_h = primary_h - crtc_y; + + if (!crtc_w || !crtc_h) /* Again, nothing to display */ + goto out; + + /* + * We can take a larger source and scale it down, but + * only so much... 16x is the max on SNB. + */ + if (((src_w * src_h) / (crtc_w * crtc_h)) > intel_plane->max_downscale) + return -EINVAL; + + /* + * If the sprite is completely covering the primary plane, + * we can disable the primary and save power. + */ + if ((crtc_x == 0) && (crtc_y == 0) && + (crtc_w == primary_w) && (crtc_h == primary_h)) + disable_primary = true; + + DRM_LOCK(dev); + + ret = intel_pin_and_fence_fb_obj(dev, obj, NULL); + if (ret) + goto out_unlock; + + intel_plane->obj = obj; + + /* + * Be sure to re-enable the primary before the sprite is no longer + * covering it fully. + */ + if (!disable_primary && intel_plane->primary_disabled) { + intel_enable_primary(crtc); + intel_plane->primary_disabled = false; + } + + intel_plane->update_plane(plane, fb, obj, crtc_x, crtc_y, + crtc_w, crtc_h, x, y, src_w, src_h); + + if (disable_primary) { + intel_disable_primary(crtc); + intel_plane->primary_disabled = true; + } + + /* Unpin old obj after new one is active to avoid ugliness */ + if (old_obj) { + /* + * It's fairly common to simply update the position of + * an existing object. In that case, we don't need to + * wait for vblank to avoid ugliness, we only need to + * do the pin & ref bookkeeping. + */ + if (old_obj != obj) { + DRM_UNLOCK(dev); + intel_wait_for_vblank(dev, to_intel_crtc(crtc)->pipe); + DRM_LOCK(dev); + } + intel_unpin_fb_obj(old_obj); + } + +out_unlock: + DRM_UNLOCK(dev); +out: + return ret; +} + +static int +intel_disable_plane(struct drm_plane *plane) +{ + struct drm_device *dev = plane->dev; + struct intel_plane *intel_plane = to_intel_plane(plane); + int ret = 0; + + if (intel_plane->primary_disabled) { + intel_enable_primary(plane->crtc); + intel_plane->primary_disabled = false; + } + + intel_plane->disable_plane(plane); + + if (!intel_plane->obj) + goto out; + + DRM_LOCK(dev); + intel_unpin_fb_obj(intel_plane->obj); + intel_plane->obj = NULL; + DRM_UNLOCK(dev); +out: + + return ret; +} + +static void intel_destroy_plane(struct drm_plane *plane) +{ + struct intel_plane *intel_plane = to_intel_plane(plane); + intel_disable_plane(plane); + drm_plane_cleanup(plane); + free(intel_plane, DRM_MEM_KMS); +} + +int intel_sprite_set_colorkey(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_intel_sprite_colorkey *set = data; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_mode_object *obj; + struct drm_plane *plane; + struct intel_plane *intel_plane; + int ret = 0; + + if (!dev_priv) + return -EINVAL; + + /* Make sure we don't try to enable both src & dest simultaneously */ + if ((set->flags & (I915_SET_COLORKEY_DESTINATION | I915_SET_COLORKEY_SOURCE)) == (I915_SET_COLORKEY_DESTINATION | I915_SET_COLORKEY_SOURCE)) + return -EINVAL; + + sx_xlock(&dev->mode_config.mutex); + + obj = drm_mode_object_find(dev, set->plane_id, DRM_MODE_OBJECT_PLANE); + if (!obj) { + ret = -EINVAL; + goto out_unlock; + } + + plane = obj_to_plane(obj); + intel_plane = to_intel_plane(plane); + ret = intel_plane->update_colorkey(plane, set); + +out_unlock: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +int intel_sprite_get_colorkey(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_intel_sprite_colorkey *get = data; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_mode_object *obj; + struct drm_plane *plane; + struct intel_plane *intel_plane; + int ret = 0; + + if (!dev_priv) + return -EINVAL; + + sx_xlock(&dev->mode_config.mutex); + + obj = drm_mode_object_find(dev, get->plane_id, DRM_MODE_OBJECT_PLANE); + if (!obj) { + ret = -EINVAL; + goto out_unlock; + } + + plane = obj_to_plane(obj); + intel_plane = to_intel_plane(plane); + intel_plane->get_colorkey(plane, get); + +out_unlock: + sx_xunlock(&dev->mode_config.mutex); + return ret; +} + +static const struct drm_plane_funcs intel_plane_funcs = { + .update_plane = intel_update_plane, + .disable_plane = intel_disable_plane, + .destroy = intel_destroy_plane, +}; + +static uint32_t snb_plane_formats[] = { + DRM_FORMAT_XBGR8888, + DRM_FORMAT_XRGB8888, + DRM_FORMAT_YUYV, + DRM_FORMAT_YVYU, + DRM_FORMAT_UYVY, + DRM_FORMAT_VYUY, +}; + +int +intel_plane_init(struct drm_device *dev, enum pipe pipe) +{ + struct intel_plane *intel_plane; + unsigned long possible_crtcs; + int ret; + + if (!(IS_GEN6(dev) || IS_GEN7(dev))) + return -ENODEV; + + intel_plane = malloc(sizeof(struct intel_plane), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + if (IS_GEN6(dev)) { + intel_plane->max_downscale = 16; + intel_plane->update_plane = snb_update_plane; + intel_plane->disable_plane = snb_disable_plane; + intel_plane->update_colorkey = snb_update_colorkey; + intel_plane->get_colorkey = snb_get_colorkey; + } else if (IS_GEN7(dev)) { + intel_plane->max_downscale = 2; + intel_plane->update_plane = ivb_update_plane; + intel_plane->disable_plane = ivb_disable_plane; + intel_plane->update_colorkey = ivb_update_colorkey; + intel_plane->get_colorkey = ivb_get_colorkey; + } + + intel_plane->pipe = pipe; + possible_crtcs = (1 << pipe); + ret = drm_plane_init(dev, &intel_plane->base, possible_crtcs, + &intel_plane_funcs, snb_plane_formats, + DRM_ARRAY_SIZE(snb_plane_formats), false); + if (ret) + free(intel_plane, DRM_MEM_KMS); + + return ret; +} + diff --git a/sys/dev/drm2/i915/intel_tv.c b/sys/dev/drm2/i915/intel_tv.c new file mode 100644 index 00000000000..93fcf0a3eec --- /dev/null +++ b/sys/dev/drm2/i915/intel_tv.c @@ -0,0 +1,1609 @@ +/* + * Copyright © 2006-2008 Intel Corporation + * Jesse Barnes + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * + */ + +/** @file + * Integrated TV-out support for the 915GM and 945GM. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +enum tv_margin { + TV_MARGIN_LEFT, TV_MARGIN_TOP, + TV_MARGIN_RIGHT, TV_MARGIN_BOTTOM +}; + +/** Private structure for the integrated TV support */ +struct intel_tv { + struct intel_encoder base; + + int type; + const char *tv_format; + int margin[4]; + u32 save_TV_H_CTL_1; + u32 save_TV_H_CTL_2; + u32 save_TV_H_CTL_3; + u32 save_TV_V_CTL_1; + u32 save_TV_V_CTL_2; + u32 save_TV_V_CTL_3; + u32 save_TV_V_CTL_4; + u32 save_TV_V_CTL_5; + u32 save_TV_V_CTL_6; + u32 save_TV_V_CTL_7; + u32 save_TV_SC_CTL_1, save_TV_SC_CTL_2, save_TV_SC_CTL_3; + + u32 save_TV_CSC_Y; + u32 save_TV_CSC_Y2; + u32 save_TV_CSC_U; + u32 save_TV_CSC_U2; + u32 save_TV_CSC_V; + u32 save_TV_CSC_V2; + u32 save_TV_CLR_KNOBS; + u32 save_TV_CLR_LEVEL; + u32 save_TV_WIN_POS; + u32 save_TV_WIN_SIZE; + u32 save_TV_FILTER_CTL_1; + u32 save_TV_FILTER_CTL_2; + u32 save_TV_FILTER_CTL_3; + + u32 save_TV_H_LUMA[60]; + u32 save_TV_H_CHROMA[60]; + u32 save_TV_V_LUMA[43]; + u32 save_TV_V_CHROMA[43]; + + u32 save_TV_DAC; + u32 save_TV_CTL; +}; + +struct video_levels { + int blank, black, burst; +}; + +struct color_conversion { + u16 ry, gy, by, ay; + u16 ru, gu, bu, au; + u16 rv, gv, bv, av; +}; + +static const u32 filter_table[] = { + 0xB1403000, 0x2E203500, 0x35002E20, 0x3000B140, + 0x35A0B160, 0x2DC02E80, 0xB1403480, 0xB1603000, + 0x2EA03640, 0x34002D80, 0x3000B120, 0x36E0B160, + 0x2D202EF0, 0xB1203380, 0xB1603000, 0x2F303780, + 0x33002CC0, 0x3000B100, 0x3820B160, 0x2C802F50, + 0xB10032A0, 0xB1603000, 0x2F9038C0, 0x32202C20, + 0x3000B0E0, 0x3980B160, 0x2BC02FC0, 0xB0E031C0, + 0xB1603000, 0x2FF03A20, 0x31602B60, 0xB020B0C0, + 0x3AE0B160, 0x2B001810, 0xB0C03120, 0xB140B020, + 0x18283BA0, 0x30C02A80, 0xB020B0A0, 0x3C60B140, + 0x2A201838, 0xB0A03080, 0xB120B020, 0x18383D20, + 0x304029C0, 0xB040B080, 0x3DE0B100, 0x29601848, + 0xB0803000, 0xB100B040, 0x18483EC0, 0xB0402900, + 0xB040B060, 0x3F80B0C0, 0x28801858, 0xB060B080, + 0xB0A0B060, 0x18602820, 0xB0A02820, 0x0000B060, + 0xB1403000, 0x2E203500, 0x35002E20, 0x3000B140, + 0x35A0B160, 0x2DC02E80, 0xB1403480, 0xB1603000, + 0x2EA03640, 0x34002D80, 0x3000B120, 0x36E0B160, + 0x2D202EF0, 0xB1203380, 0xB1603000, 0x2F303780, + 0x33002CC0, 0x3000B100, 0x3820B160, 0x2C802F50, + 0xB10032A0, 0xB1603000, 0x2F9038C0, 0x32202C20, + 0x3000B0E0, 0x3980B160, 0x2BC02FC0, 0xB0E031C0, + 0xB1603000, 0x2FF03A20, 0x31602B60, 0xB020B0C0, + 0x3AE0B160, 0x2B001810, 0xB0C03120, 0xB140B020, + 0x18283BA0, 0x30C02A80, 0xB020B0A0, 0x3C60B140, + 0x2A201838, 0xB0A03080, 0xB120B020, 0x18383D20, + 0x304029C0, 0xB040B080, 0x3DE0B100, 0x29601848, + 0xB0803000, 0xB100B040, 0x18483EC0, 0xB0402900, + 0xB040B060, 0x3F80B0C0, 0x28801858, 0xB060B080, + 0xB0A0B060, 0x18602820, 0xB0A02820, 0x0000B060, + 0x36403000, 0x2D002CC0, 0x30003640, 0x2D0036C0, + 0x35C02CC0, 0x37403000, 0x2C802D40, 0x30003540, + 0x2D8037C0, 0x34C02C40, 0x38403000, 0x2BC02E00, + 0x30003440, 0x2E2038C0, 0x34002B80, 0x39803000, + 0x2B402E40, 0x30003380, 0x2E603A00, 0x33402B00, + 0x3A803040, 0x2A802EA0, 0x30403300, 0x2EC03B40, + 0x32802A40, 0x3C003040, 0x2A002EC0, 0x30803240, + 0x2EC03C80, 0x320029C0, 0x3D403080, 0x29402F00, + 0x308031C0, 0x2F203DC0, 0x31802900, 0x3E8030C0, + 0x28802F40, 0x30C03140, 0x2F203F40, 0x31402840, + 0x28003100, 0x28002F00, 0x00003100, 0x36403000, + 0x2D002CC0, 0x30003640, 0x2D0036C0, + 0x35C02CC0, 0x37403000, 0x2C802D40, 0x30003540, + 0x2D8037C0, 0x34C02C40, 0x38403000, 0x2BC02E00, + 0x30003440, 0x2E2038C0, 0x34002B80, 0x39803000, + 0x2B402E40, 0x30003380, 0x2E603A00, 0x33402B00, + 0x3A803040, 0x2A802EA0, 0x30403300, 0x2EC03B40, + 0x32802A40, 0x3C003040, 0x2A002EC0, 0x30803240, + 0x2EC03C80, 0x320029C0, 0x3D403080, 0x29402F00, + 0x308031C0, 0x2F203DC0, 0x31802900, 0x3E8030C0, + 0x28802F40, 0x30C03140, 0x2F203F40, 0x31402840, + 0x28003100, 0x28002F00, 0x00003100, +}; + +/* + * Color conversion values have 3 separate fixed point formats: + * + * 10 bit fields (ay, au) + * 1.9 fixed point (b.bbbbbbbbb) + * 11 bit fields (ry, by, ru, gu, gv) + * exp.mantissa (ee.mmmmmmmmm) + * ee = 00 = 10^-1 (0.mmmmmmmmm) + * ee = 01 = 10^-2 (0.0mmmmmmmmm) + * ee = 10 = 10^-3 (0.00mmmmmmmmm) + * ee = 11 = 10^-4 (0.000mmmmmmmmm) + * 12 bit fields (gy, rv, bu) + * exp.mantissa (eee.mmmmmmmmm) + * eee = 000 = 10^-1 (0.mmmmmmmmm) + * eee = 001 = 10^-2 (0.0mmmmmmmmm) + * eee = 010 = 10^-3 (0.00mmmmmmmmm) + * eee = 011 = 10^-4 (0.000mmmmmmmmm) + * eee = 100 = reserved + * eee = 101 = reserved + * eee = 110 = reserved + * eee = 111 = 10^0 (m.mmmmmmmm) (only usable for 1.0 representation) + * + * Saturation and contrast are 8 bits, with their own representation: + * 8 bit field (saturation, contrast) + * exp.mantissa (ee.mmmmmm) + * ee = 00 = 10^-1 (0.mmmmmm) + * ee = 01 = 10^0 (m.mmmmm) + * ee = 10 = 10^1 (mm.mmmm) + * ee = 11 = 10^2 (mmm.mmm) + * + * Simple conversion function: + * + * static u32 + * float_to_csc_11(float f) + * { + * u32 exp; + * u32 mant; + * u32 ret; + * + * if (f < 0) + * f = -f; + * + * if (f >= 1) { + * exp = 0x7; + * mant = 1 << 8; + * } else { + * for (exp = 0; exp < 3 && f < 0.5; exp++) + * f *= 2.0; + * mant = (f * (1 << 9) + 0.5); + * if (mant >= (1 << 9)) + * mant = (1 << 9) - 1; + * } + * ret = (exp << 9) | mant; + * return ret; + * } + */ + +/* + * Behold, magic numbers! If we plant them they might grow a big + * s-video cable to the sky... or something. + * + * Pre-converted to appropriate hex value. + */ + +/* + * PAL & NTSC values for composite & s-video connections + */ +static const struct color_conversion ntsc_m_csc_composite = { + .ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0104, + .ru = 0x0733, .gu = 0x052d, .bu = 0x05c7, .au = 0x0200, + .rv = 0x0340, .gv = 0x030c, .bv = 0x06d0, .av = 0x0200, +}; + +static const struct video_levels ntsc_m_levels_composite = { + .blank = 225, .black = 267, .burst = 113, +}; + +static const struct color_conversion ntsc_m_csc_svideo = { + .ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0133, + .ru = 0x076a, .gu = 0x0564, .bu = 0x030d, .au = 0x0200, + .rv = 0x037a, .gv = 0x033d, .bv = 0x06f6, .av = 0x0200, +}; + +static const struct video_levels ntsc_m_levels_svideo = { + .blank = 266, .black = 316, .burst = 133, +}; + +static const struct color_conversion ntsc_j_csc_composite = { + .ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0119, + .ru = 0x074c, .gu = 0x0546, .bu = 0x05ec, .au = 0x0200, + .rv = 0x035a, .gv = 0x0322, .bv = 0x06e1, .av = 0x0200, +}; + +static const struct video_levels ntsc_j_levels_composite = { + .blank = 225, .black = 225, .burst = 113, +}; + +static const struct color_conversion ntsc_j_csc_svideo = { + .ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x014c, + .ru = 0x0788, .gu = 0x0581, .bu = 0x0322, .au = 0x0200, + .rv = 0x0399, .gv = 0x0356, .bv = 0x070a, .av = 0x0200, +}; + +static const struct video_levels ntsc_j_levels_svideo = { + .blank = 266, .black = 266, .burst = 133, +}; + +static const struct color_conversion pal_csc_composite = { + .ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0113, + .ru = 0x0745, .gu = 0x053f, .bu = 0x05e1, .au = 0x0200, + .rv = 0x0353, .gv = 0x031c, .bv = 0x06dc, .av = 0x0200, +}; + +static const struct video_levels pal_levels_composite = { + .blank = 237, .black = 237, .burst = 118, +}; + +static const struct color_conversion pal_csc_svideo = { + .ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0145, + .ru = 0x0780, .gu = 0x0579, .bu = 0x031c, .au = 0x0200, + .rv = 0x0390, .gv = 0x034f, .bv = 0x0705, .av = 0x0200, +}; + +static const struct video_levels pal_levels_svideo = { + .blank = 280, .black = 280, .burst = 139, +}; + +static const struct color_conversion pal_m_csc_composite = { + .ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0104, + .ru = 0x0733, .gu = 0x052d, .bu = 0x05c7, .au = 0x0200, + .rv = 0x0340, .gv = 0x030c, .bv = 0x06d0, .av = 0x0200, +}; + +static const struct video_levels pal_m_levels_composite = { + .blank = 225, .black = 267, .burst = 113, +}; + +static const struct color_conversion pal_m_csc_svideo = { + .ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0133, + .ru = 0x076a, .gu = 0x0564, .bu = 0x030d, .au = 0x0200, + .rv = 0x037a, .gv = 0x033d, .bv = 0x06f6, .av = 0x0200, +}; + +static const struct video_levels pal_m_levels_svideo = { + .blank = 266, .black = 316, .burst = 133, +}; + +static const struct color_conversion pal_n_csc_composite = { + .ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0104, + .ru = 0x0733, .gu = 0x052d, .bu = 0x05c7, .au = 0x0200, + .rv = 0x0340, .gv = 0x030c, .bv = 0x06d0, .av = 0x0200, +}; + +static const struct video_levels pal_n_levels_composite = { + .blank = 225, .black = 267, .burst = 118, +}; + +static const struct color_conversion pal_n_csc_svideo = { + .ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0133, + .ru = 0x076a, .gu = 0x0564, .bu = 0x030d, .au = 0x0200, + .rv = 0x037a, .gv = 0x033d, .bv = 0x06f6, .av = 0x0200, +}; + +static const struct video_levels pal_n_levels_svideo = { + .blank = 266, .black = 316, .burst = 139, +}; + +/* + * Component connections + */ +static const struct color_conversion sdtv_csc_yprpb = { + .ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0145, + .ru = 0x0559, .gu = 0x0353, .bu = 0x0100, .au = 0x0200, + .rv = 0x0100, .gv = 0x03ad, .bv = 0x074d, .av = 0x0200, +}; + +static const struct color_conversion sdtv_csc_rgb = { + .ry = 0x0000, .gy = 0x0f00, .by = 0x0000, .ay = 0x0166, + .ru = 0x0000, .gu = 0x0000, .bu = 0x0f00, .au = 0x0166, + .rv = 0x0f00, .gv = 0x0000, .bv = 0x0000, .av = 0x0166, +}; + +static const struct color_conversion hdtv_csc_yprpb = { + .ry = 0x05b3, .gy = 0x016e, .by = 0x0728, .ay = 0x0145, + .ru = 0x07d5, .gu = 0x038b, .bu = 0x0100, .au = 0x0200, + .rv = 0x0100, .gv = 0x03d1, .bv = 0x06bc, .av = 0x0200, +}; + +static const struct color_conversion hdtv_csc_rgb = { + .ry = 0x0000, .gy = 0x0f00, .by = 0x0000, .ay = 0x0166, + .ru = 0x0000, .gu = 0x0000, .bu = 0x0f00, .au = 0x0166, + .rv = 0x0f00, .gv = 0x0000, .bv = 0x0000, .av = 0x0166, +}; + +static const struct video_levels component_levels = { + .blank = 279, .black = 279, .burst = 0, +}; + + +struct tv_mode { + const char *name; + int clock; + int refresh; /* in millihertz (for precision) */ + u32 oversample; + int hsync_end, hblank_start, hblank_end, htotal; + bool progressive, trilevel_sync, component_only; + int vsync_start_f1, vsync_start_f2, vsync_len; + bool veq_ena; + int veq_start_f1, veq_start_f2, veq_len; + int vi_end_f1, vi_end_f2, nbr_end; + bool burst_ena; + int hburst_start, hburst_len; + int vburst_start_f1, vburst_end_f1; + int vburst_start_f2, vburst_end_f2; + int vburst_start_f3, vburst_end_f3; + int vburst_start_f4, vburst_end_f4; + /* + * subcarrier programming + */ + int dda2_size, dda3_size, dda1_inc, dda2_inc, dda3_inc; + u32 sc_reset; + bool pal_burst; + /* + * blank/black levels + */ + const struct video_levels *composite_levels, *svideo_levels; + const struct color_conversion *composite_color, *svideo_color; + const u32 *filter_table; + int max_srcw; +}; + + +/* + * Sub carrier DDA + * + * I think this works as follows: + * + * subcarrier freq = pixel_clock * (dda1_inc + dda2_inc / dda2_size) / 4096 + * + * Presumably, when dda3 is added in, it gets to adjust the dda2_inc value + * + * So, + * dda1_ideal = subcarrier/pixel * 4096 + * dda1_inc = floor (dda1_ideal) + * dda2 = dda1_ideal - dda1_inc + * + * then pick a ratio for dda2 that gives the closest approximation. If + * you can't get close enough, you can play with dda3 as well. This + * seems likely to happen when dda2 is small as the jumps would be larger + * + * To invert this, + * + * pixel_clock = subcarrier * 4096 / (dda1_inc + dda2_inc / dda2_size) + * + * The constants below were all computed using a 107.520MHz clock + */ + +/** + * Register programming values for TV modes. + * + * These values account for -1s required. + */ + +static const struct tv_mode tv_modes[] = { + { + .name = "NTSC-M", + .clock = 108000, + .refresh = 59940, + .oversample = TV_OVERSAMPLE_8X, + .component_only = 0, + /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */ + + .hsync_end = 64, .hblank_end = 124, + .hblank_start = 836, .htotal = 857, + + .progressive = false, .trilevel_sync = false, + + .vsync_start_f1 = 6, .vsync_start_f2 = 7, + .vsync_len = 6, + + .veq_ena = true, .veq_start_f1 = 0, + .veq_start_f2 = 1, .veq_len = 18, + + .vi_end_f1 = 20, .vi_end_f2 = 21, + .nbr_end = 240, + + .burst_ena = true, + .hburst_start = 72, .hburst_len = 34, + .vburst_start_f1 = 9, .vburst_end_f1 = 240, + .vburst_start_f2 = 10, .vburst_end_f2 = 240, + .vburst_start_f3 = 9, .vburst_end_f3 = 240, + .vburst_start_f4 = 10, .vburst_end_f4 = 240, + + /* desired 3.5800000 actual 3.5800000 clock 107.52 */ + .dda1_inc = 135, + .dda2_inc = 20800, .dda2_size = 27456, + .dda3_inc = 0, .dda3_size = 0, + .sc_reset = TV_SC_RESET_EVERY_4, + .pal_burst = false, + + .composite_levels = &ntsc_m_levels_composite, + .composite_color = &ntsc_m_csc_composite, + .svideo_levels = &ntsc_m_levels_svideo, + .svideo_color = &ntsc_m_csc_svideo, + + .filter_table = filter_table, + }, + { + .name = "NTSC-443", + .clock = 108000, + .refresh = 59940, + .oversample = TV_OVERSAMPLE_8X, + .component_only = 0, + /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 4.43MHz */ + .hsync_end = 64, .hblank_end = 124, + .hblank_start = 836, .htotal = 857, + + .progressive = false, .trilevel_sync = false, + + .vsync_start_f1 = 6, .vsync_start_f2 = 7, + .vsync_len = 6, + + .veq_ena = true, .veq_start_f1 = 0, + .veq_start_f2 = 1, .veq_len = 18, + + .vi_end_f1 = 20, .vi_end_f2 = 21, + .nbr_end = 240, + + .burst_ena = true, + .hburst_start = 72, .hburst_len = 34, + .vburst_start_f1 = 9, .vburst_end_f1 = 240, + .vburst_start_f2 = 10, .vburst_end_f2 = 240, + .vburst_start_f3 = 9, .vburst_end_f3 = 240, + .vburst_start_f4 = 10, .vburst_end_f4 = 240, + + /* desired 4.4336180 actual 4.4336180 clock 107.52 */ + .dda1_inc = 168, + .dda2_inc = 4093, .dda2_size = 27456, + .dda3_inc = 310, .dda3_size = 525, + .sc_reset = TV_SC_RESET_NEVER, + .pal_burst = false, + + .composite_levels = &ntsc_m_levels_composite, + .composite_color = &ntsc_m_csc_composite, + .svideo_levels = &ntsc_m_levels_svideo, + .svideo_color = &ntsc_m_csc_svideo, + + .filter_table = filter_table, + }, + { + .name = "NTSC-J", + .clock = 108000, + .refresh = 59940, + .oversample = TV_OVERSAMPLE_8X, + .component_only = 0, + + /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */ + .hsync_end = 64, .hblank_end = 124, + .hblank_start = 836, .htotal = 857, + + .progressive = false, .trilevel_sync = false, + + .vsync_start_f1 = 6, .vsync_start_f2 = 7, + .vsync_len = 6, + + .veq_ena = true, .veq_start_f1 = 0, + .veq_start_f2 = 1, .veq_len = 18, + + .vi_end_f1 = 20, .vi_end_f2 = 21, + .nbr_end = 240, + + .burst_ena = true, + .hburst_start = 72, .hburst_len = 34, + .vburst_start_f1 = 9, .vburst_end_f1 = 240, + .vburst_start_f2 = 10, .vburst_end_f2 = 240, + .vburst_start_f3 = 9, .vburst_end_f3 = 240, + .vburst_start_f4 = 10, .vburst_end_f4 = 240, + + /* desired 3.5800000 actual 3.5800000 clock 107.52 */ + .dda1_inc = 135, + .dda2_inc = 20800, .dda2_size = 27456, + .dda3_inc = 0, .dda3_size = 0, + .sc_reset = TV_SC_RESET_EVERY_4, + .pal_burst = false, + + .composite_levels = &ntsc_j_levels_composite, + .composite_color = &ntsc_j_csc_composite, + .svideo_levels = &ntsc_j_levels_svideo, + .svideo_color = &ntsc_j_csc_svideo, + + .filter_table = filter_table, + }, + { + .name = "PAL-M", + .clock = 108000, + .refresh = 59940, + .oversample = TV_OVERSAMPLE_8X, + .component_only = 0, + + /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */ + .hsync_end = 64, .hblank_end = 124, + .hblank_start = 836, .htotal = 857, + + .progressive = false, .trilevel_sync = false, + + .vsync_start_f1 = 6, .vsync_start_f2 = 7, + .vsync_len = 6, + + .veq_ena = true, .veq_start_f1 = 0, + .veq_start_f2 = 1, .veq_len = 18, + + .vi_end_f1 = 20, .vi_end_f2 = 21, + .nbr_end = 240, + + .burst_ena = true, + .hburst_start = 72, .hburst_len = 34, + .vburst_start_f1 = 9, .vburst_end_f1 = 240, + .vburst_start_f2 = 10, .vburst_end_f2 = 240, + .vburst_start_f3 = 9, .vburst_end_f3 = 240, + .vburst_start_f4 = 10, .vburst_end_f4 = 240, + + /* desired 3.5800000 actual 3.5800000 clock 107.52 */ + .dda1_inc = 135, + .dda2_inc = 16704, .dda2_size = 27456, + .dda3_inc = 0, .dda3_size = 0, + .sc_reset = TV_SC_RESET_EVERY_8, + .pal_burst = true, + + .composite_levels = &pal_m_levels_composite, + .composite_color = &pal_m_csc_composite, + .svideo_levels = &pal_m_levels_svideo, + .svideo_color = &pal_m_csc_svideo, + + .filter_table = filter_table, + }, + { + /* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */ + .name = "PAL-N", + .clock = 108000, + .refresh = 50000, + .oversample = TV_OVERSAMPLE_8X, + .component_only = 0, + + .hsync_end = 64, .hblank_end = 128, + .hblank_start = 844, .htotal = 863, + + .progressive = false, .trilevel_sync = false, + + + .vsync_start_f1 = 6, .vsync_start_f2 = 7, + .vsync_len = 6, + + .veq_ena = true, .veq_start_f1 = 0, + .veq_start_f2 = 1, .veq_len = 18, + + .vi_end_f1 = 24, .vi_end_f2 = 25, + .nbr_end = 286, + + .burst_ena = true, + .hburst_start = 73, .hburst_len = 34, + .vburst_start_f1 = 8, .vburst_end_f1 = 285, + .vburst_start_f2 = 8, .vburst_end_f2 = 286, + .vburst_start_f3 = 9, .vburst_end_f3 = 286, + .vburst_start_f4 = 9, .vburst_end_f4 = 285, + + + /* desired 4.4336180 actual 4.4336180 clock 107.52 */ + .dda1_inc = 135, + .dda2_inc = 23578, .dda2_size = 27648, + .dda3_inc = 134, .dda3_size = 625, + .sc_reset = TV_SC_RESET_EVERY_8, + .pal_burst = true, + + .composite_levels = &pal_n_levels_composite, + .composite_color = &pal_n_csc_composite, + .svideo_levels = &pal_n_levels_svideo, + .svideo_color = &pal_n_csc_svideo, + + .filter_table = filter_table, + }, + { + /* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */ + .name = "PAL", + .clock = 108000, + .refresh = 50000, + .oversample = TV_OVERSAMPLE_8X, + .component_only = 0, + + .hsync_end = 64, .hblank_end = 142, + .hblank_start = 844, .htotal = 863, + + .progressive = false, .trilevel_sync = false, + + .vsync_start_f1 = 5, .vsync_start_f2 = 6, + .vsync_len = 5, + + .veq_ena = true, .veq_start_f1 = 0, + .veq_start_f2 = 1, .veq_len = 15, + + .vi_end_f1 = 24, .vi_end_f2 = 25, + .nbr_end = 286, + + .burst_ena = true, + .hburst_start = 73, .hburst_len = 32, + .vburst_start_f1 = 8, .vburst_end_f1 = 285, + .vburst_start_f2 = 8, .vburst_end_f2 = 286, + .vburst_start_f3 = 9, .vburst_end_f3 = 286, + .vburst_start_f4 = 9, .vburst_end_f4 = 285, + + /* desired 4.4336180 actual 4.4336180 clock 107.52 */ + .dda1_inc = 168, + .dda2_inc = 4122, .dda2_size = 27648, + .dda3_inc = 67, .dda3_size = 625, + .sc_reset = TV_SC_RESET_EVERY_8, + .pal_burst = true, + + .composite_levels = &pal_levels_composite, + .composite_color = &pal_csc_composite, + .svideo_levels = &pal_levels_svideo, + .svideo_color = &pal_csc_svideo, + + .filter_table = filter_table, + }, + { + .name = "720p@60Hz", + .clock = 148800, + .refresh = 60000, + .oversample = TV_OVERSAMPLE_2X, + .component_only = 1, + + .hsync_end = 80, .hblank_end = 300, + .hblank_start = 1580, .htotal = 1649, + + .progressive = true, .trilevel_sync = true, + + .vsync_start_f1 = 10, .vsync_start_f2 = 10, + .vsync_len = 10, + + .veq_ena = false, + + .vi_end_f1 = 29, .vi_end_f2 = 29, + .nbr_end = 719, + + .burst_ena = false, + + .filter_table = filter_table, + }, + { + .name = "720p@50Hz", + .clock = 148800, + .refresh = 50000, + .oversample = TV_OVERSAMPLE_2X, + .component_only = 1, + + .hsync_end = 80, .hblank_end = 300, + .hblank_start = 1580, .htotal = 1979, + + .progressive = true, .trilevel_sync = true, + + .vsync_start_f1 = 10, .vsync_start_f2 = 10, + .vsync_len = 10, + + .veq_ena = false, + + .vi_end_f1 = 29, .vi_end_f2 = 29, + .nbr_end = 719, + + .burst_ena = false, + + .filter_table = filter_table, + .max_srcw = 800 + }, + { + .name = "1080i@50Hz", + .clock = 148800, + .refresh = 50000, + .oversample = TV_OVERSAMPLE_2X, + .component_only = 1, + + .hsync_end = 88, .hblank_end = 235, + .hblank_start = 2155, .htotal = 2639, + + .progressive = false, .trilevel_sync = true, + + .vsync_start_f1 = 4, .vsync_start_f2 = 5, + .vsync_len = 10, + + .veq_ena = true, .veq_start_f1 = 4, + .veq_start_f2 = 4, .veq_len = 10, + + + .vi_end_f1 = 21, .vi_end_f2 = 22, + .nbr_end = 539, + + .burst_ena = false, + + .filter_table = filter_table, + }, + { + .name = "1080i@60Hz", + .clock = 148800, + .refresh = 60000, + .oversample = TV_OVERSAMPLE_2X, + .component_only = 1, + + .hsync_end = 88, .hblank_end = 235, + .hblank_start = 2155, .htotal = 2199, + + .progressive = false, .trilevel_sync = true, + + .vsync_start_f1 = 4, .vsync_start_f2 = 5, + .vsync_len = 10, + + .veq_ena = true, .veq_start_f1 = 4, + .veq_start_f2 = 4, .veq_len = 10, + + + .vi_end_f1 = 21, .vi_end_f2 = 22, + .nbr_end = 539, + + .burst_ena = false, + + .filter_table = filter_table, + }, +}; + +static struct intel_tv *enc_to_intel_tv(struct drm_encoder *encoder) +{ + return container_of(encoder, struct intel_tv, base.base); +} + +static struct intel_tv *intel_attached_tv(struct drm_connector *connector) +{ + return container_of(intel_attached_encoder(connector), + struct intel_tv, + base); +} + +static void +intel_tv_dpms(struct drm_encoder *encoder, int mode) +{ + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + + switch (mode) { + case DRM_MODE_DPMS_ON: + I915_WRITE(TV_CTL, I915_READ(TV_CTL) | TV_ENC_ENABLE); + break; + case DRM_MODE_DPMS_STANDBY: + case DRM_MODE_DPMS_SUSPEND: + case DRM_MODE_DPMS_OFF: + I915_WRITE(TV_CTL, I915_READ(TV_CTL) & ~TV_ENC_ENABLE); + break; + } +} + +static const struct tv_mode * +intel_tv_mode_lookup(const char *tv_format) +{ + int i; + + for (i = 0; i < sizeof(tv_modes) / sizeof(tv_modes[0]); i++) { + const struct tv_mode *tv_mode = &tv_modes[i]; + + if (!strcmp(tv_format, tv_mode->name)) + return tv_mode; + } + return NULL; +} + +static const struct tv_mode * +intel_tv_mode_find(struct intel_tv *intel_tv) +{ + return intel_tv_mode_lookup(intel_tv->tv_format); +} + +static enum drm_mode_status +intel_tv_mode_valid(struct drm_connector *connector, + struct drm_display_mode *mode) +{ + struct intel_tv *intel_tv = intel_attached_tv(connector); + const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); + + /* Ensure TV refresh is close to desired refresh */ + if (tv_mode && abs(tv_mode->refresh - drm_mode_vrefresh(mode) * 1000) + < 1000) + return MODE_OK; + + return MODE_CLOCK_RANGE; +} + + +static bool +intel_tv_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct drm_device *dev = encoder->dev; + struct drm_mode_config *drm_config = &dev->mode_config; + struct intel_tv *intel_tv = enc_to_intel_tv(encoder); + const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); + struct drm_encoder *other_encoder; + + if (!tv_mode) + return false; + + /* FIXME: lock encoder list */ + list_for_each_entry(other_encoder, &drm_config->encoder_list, head) { + if (other_encoder != encoder && + other_encoder->crtc == encoder->crtc) + return false; + } + + adjusted_mode->clock = tv_mode->clock; + return true; +} + +static void +intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_crtc *crtc = encoder->crtc; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct intel_tv *intel_tv = enc_to_intel_tv(encoder); + const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); + u32 tv_ctl; + u32 hctl1, hctl2, hctl3; + u32 vctl1, vctl2, vctl3, vctl4, vctl5, vctl6, vctl7; + u32 scctl1, scctl2, scctl3; + int i, j; + const struct video_levels *video_levels; + const struct color_conversion *color_conversion; + bool burst_ena; + int pipe = intel_crtc->pipe; + + if (!tv_mode) + return; /* can't happen (mode_prepare prevents this) */ + + tv_ctl = I915_READ(TV_CTL); + tv_ctl &= TV_CTL_SAVE; + + switch (intel_tv->type) { + default: + case DRM_MODE_CONNECTOR_Unknown: + case DRM_MODE_CONNECTOR_Composite: + tv_ctl |= TV_ENC_OUTPUT_COMPOSITE; + video_levels = tv_mode->composite_levels; + color_conversion = tv_mode->composite_color; + burst_ena = tv_mode->burst_ena; + break; + case DRM_MODE_CONNECTOR_Component: + tv_ctl |= TV_ENC_OUTPUT_COMPONENT; + video_levels = &component_levels; + if (tv_mode->burst_ena) + color_conversion = &sdtv_csc_yprpb; + else + color_conversion = &hdtv_csc_yprpb; + burst_ena = false; + break; + case DRM_MODE_CONNECTOR_SVIDEO: + tv_ctl |= TV_ENC_OUTPUT_SVIDEO; + video_levels = tv_mode->svideo_levels; + color_conversion = tv_mode->svideo_color; + burst_ena = tv_mode->burst_ena; + break; + } + hctl1 = (tv_mode->hsync_end << TV_HSYNC_END_SHIFT) | + (tv_mode->htotal << TV_HTOTAL_SHIFT); + + hctl2 = (tv_mode->hburst_start << 16) | + (tv_mode->hburst_len << TV_HBURST_LEN_SHIFT); + + if (burst_ena) + hctl2 |= TV_BURST_ENA; + + hctl3 = (tv_mode->hblank_start << TV_HBLANK_START_SHIFT) | + (tv_mode->hblank_end << TV_HBLANK_END_SHIFT); + + vctl1 = (tv_mode->nbr_end << TV_NBR_END_SHIFT) | + (tv_mode->vi_end_f1 << TV_VI_END_F1_SHIFT) | + (tv_mode->vi_end_f2 << TV_VI_END_F2_SHIFT); + + vctl2 = (tv_mode->vsync_len << TV_VSYNC_LEN_SHIFT) | + (tv_mode->vsync_start_f1 << TV_VSYNC_START_F1_SHIFT) | + (tv_mode->vsync_start_f2 << TV_VSYNC_START_F2_SHIFT); + + vctl3 = (tv_mode->veq_len << TV_VEQ_LEN_SHIFT) | + (tv_mode->veq_start_f1 << TV_VEQ_START_F1_SHIFT) | + (tv_mode->veq_start_f2 << TV_VEQ_START_F2_SHIFT); + + if (tv_mode->veq_ena) + vctl3 |= TV_EQUAL_ENA; + + vctl4 = (tv_mode->vburst_start_f1 << TV_VBURST_START_F1_SHIFT) | + (tv_mode->vburst_end_f1 << TV_VBURST_END_F1_SHIFT); + + vctl5 = (tv_mode->vburst_start_f2 << TV_VBURST_START_F2_SHIFT) | + (tv_mode->vburst_end_f2 << TV_VBURST_END_F2_SHIFT); + + vctl6 = (tv_mode->vburst_start_f3 << TV_VBURST_START_F3_SHIFT) | + (tv_mode->vburst_end_f3 << TV_VBURST_END_F3_SHIFT); + + vctl7 = (tv_mode->vburst_start_f4 << TV_VBURST_START_F4_SHIFT) | + (tv_mode->vburst_end_f4 << TV_VBURST_END_F4_SHIFT); + + if (intel_crtc->pipe == 1) + tv_ctl |= TV_ENC_PIPEB_SELECT; + tv_ctl |= tv_mode->oversample; + + if (tv_mode->progressive) + tv_ctl |= TV_PROGRESSIVE; + if (tv_mode->trilevel_sync) + tv_ctl |= TV_TRILEVEL_SYNC; + if (tv_mode->pal_burst) + tv_ctl |= TV_PAL_BURST; + + scctl1 = 0; + if (tv_mode->dda1_inc) + scctl1 |= TV_SC_DDA1_EN; + if (tv_mode->dda2_inc) + scctl1 |= TV_SC_DDA2_EN; + if (tv_mode->dda3_inc) + scctl1 |= TV_SC_DDA3_EN; + scctl1 |= tv_mode->sc_reset; + if (video_levels) + scctl1 |= video_levels->burst << TV_BURST_LEVEL_SHIFT; + scctl1 |= tv_mode->dda1_inc << TV_SCDDA1_INC_SHIFT; + + scctl2 = tv_mode->dda2_size << TV_SCDDA2_SIZE_SHIFT | + tv_mode->dda2_inc << TV_SCDDA2_INC_SHIFT; + + scctl3 = tv_mode->dda3_size << TV_SCDDA3_SIZE_SHIFT | + tv_mode->dda3_inc << TV_SCDDA3_INC_SHIFT; + + /* Enable two fixes for the chips that need them. */ + if (dev->pci_device < 0x2772) + tv_ctl |= TV_ENC_C0_FIX | TV_ENC_SDP_FIX; + + I915_WRITE(TV_H_CTL_1, hctl1); + I915_WRITE(TV_H_CTL_2, hctl2); + I915_WRITE(TV_H_CTL_3, hctl3); + I915_WRITE(TV_V_CTL_1, vctl1); + I915_WRITE(TV_V_CTL_2, vctl2); + I915_WRITE(TV_V_CTL_3, vctl3); + I915_WRITE(TV_V_CTL_4, vctl4); + I915_WRITE(TV_V_CTL_5, vctl5); + I915_WRITE(TV_V_CTL_6, vctl6); + I915_WRITE(TV_V_CTL_7, vctl7); + I915_WRITE(TV_SC_CTL_1, scctl1); + I915_WRITE(TV_SC_CTL_2, scctl2); + I915_WRITE(TV_SC_CTL_3, scctl3); + + if (color_conversion) { + I915_WRITE(TV_CSC_Y, (color_conversion->ry << 16) | + color_conversion->gy); + I915_WRITE(TV_CSC_Y2, (color_conversion->by << 16) | + color_conversion->ay); + I915_WRITE(TV_CSC_U, (color_conversion->ru << 16) | + color_conversion->gu); + I915_WRITE(TV_CSC_U2, (color_conversion->bu << 16) | + color_conversion->au); + I915_WRITE(TV_CSC_V, (color_conversion->rv << 16) | + color_conversion->gv); + I915_WRITE(TV_CSC_V2, (color_conversion->bv << 16) | + color_conversion->av); + } + + if (INTEL_INFO(dev)->gen >= 4) + I915_WRITE(TV_CLR_KNOBS, 0x00404000); + else + I915_WRITE(TV_CLR_KNOBS, 0x00606000); + + if (video_levels) + I915_WRITE(TV_CLR_LEVEL, + ((video_levels->black << TV_BLACK_LEVEL_SHIFT) | + (video_levels->blank << TV_BLANK_LEVEL_SHIFT))); + { + int pipeconf_reg = PIPECONF(pipe); + int dspcntr_reg = DSPCNTR(intel_crtc->plane); + int pipeconf = I915_READ(pipeconf_reg); + int dspcntr = I915_READ(dspcntr_reg); + int dspbase_reg = DSPADDR(intel_crtc->plane); + int xpos = 0x0, ypos = 0x0; + unsigned int xsize, ysize; + /* Pipe must be off here */ + I915_WRITE(dspcntr_reg, dspcntr & ~DISPLAY_PLANE_ENABLE); + /* Flush the plane changes */ + I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); + + /* Wait for vblank for the disable to take effect */ + if (IS_GEN2(dev)) + intel_wait_for_vblank(dev, intel_crtc->pipe); + + I915_WRITE(pipeconf_reg, pipeconf & ~PIPECONF_ENABLE); + /* Wait for vblank for the disable to take effect. */ + intel_wait_for_pipe_off(dev, intel_crtc->pipe); + + /* Filter ctl must be set before TV_WIN_SIZE */ + I915_WRITE(TV_FILTER_CTL_1, TV_AUTO_SCALE); + xsize = tv_mode->hblank_start - tv_mode->hblank_end; + if (tv_mode->progressive) + ysize = tv_mode->nbr_end + 1; + else + ysize = 2*tv_mode->nbr_end + 1; + + xpos += intel_tv->margin[TV_MARGIN_LEFT]; + ypos += intel_tv->margin[TV_MARGIN_TOP]; + xsize -= (intel_tv->margin[TV_MARGIN_LEFT] + + intel_tv->margin[TV_MARGIN_RIGHT]); + ysize -= (intel_tv->margin[TV_MARGIN_TOP] + + intel_tv->margin[TV_MARGIN_BOTTOM]); + I915_WRITE(TV_WIN_POS, (xpos<<16)|ypos); + I915_WRITE(TV_WIN_SIZE, (xsize<<16)|ysize); + + I915_WRITE(pipeconf_reg, pipeconf); + I915_WRITE(dspcntr_reg, dspcntr); + /* Flush the plane changes */ + I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); + } + + j = 0; + for (i = 0; i < 60; i++) + I915_WRITE(TV_H_LUMA_0 + (i<<2), tv_mode->filter_table[j++]); + for (i = 0; i < 60; i++) + I915_WRITE(TV_H_CHROMA_0 + (i<<2), tv_mode->filter_table[j++]); + for (i = 0; i < 43; i++) + I915_WRITE(TV_V_LUMA_0 + (i<<2), tv_mode->filter_table[j++]); + for (i = 0; i < 43; i++) + I915_WRITE(TV_V_CHROMA_0 + (i<<2), tv_mode->filter_table[j++]); + I915_WRITE(TV_DAC, I915_READ(TV_DAC) & TV_DAC_SAVE); + I915_WRITE(TV_CTL, tv_ctl); +} + +static const struct drm_display_mode reported_modes[] = { + { + .name = "NTSC 480i", + .clock = 107520, + .hdisplay = 1280, + .hsync_start = 1368, + .hsync_end = 1496, + .htotal = 1712, + + .vdisplay = 1024, + .vsync_start = 1027, + .vsync_end = 1034, + .vtotal = 1104, + .type = DRM_MODE_TYPE_DRIVER, + }, +}; + +/** + * Detects TV presence by checking for load. + * + * Requires that the current pipe's DPLL is active. + + * \return true if TV is connected. + * \return false if TV is disconnected. + */ +static int +intel_tv_detect_type(struct intel_tv *intel_tv, + struct drm_connector *connector) +{ + struct drm_encoder *encoder = &intel_tv->base.base; + struct drm_crtc *crtc = encoder->crtc; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + struct drm_device *dev = encoder->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + u32 tv_ctl, save_tv_ctl; + u32 tv_dac, save_tv_dac; + int type; + + /* Disable TV interrupts around load detect or we'll recurse */ + if (connector->polled & DRM_CONNECTOR_POLL_HPD) { + mtx_lock(&dev_priv->irq_lock); + i915_disable_pipestat(dev_priv, 0, + PIPE_HOTPLUG_INTERRUPT_ENABLE | + PIPE_HOTPLUG_TV_INTERRUPT_ENABLE); + mtx_unlock(&dev_priv->irq_lock); + } + + save_tv_dac = tv_dac = I915_READ(TV_DAC); + save_tv_ctl = tv_ctl = I915_READ(TV_CTL); + + /* Poll for TV detection */ + tv_ctl &= ~(TV_ENC_ENABLE | TV_TEST_MODE_MASK); + tv_ctl |= TV_TEST_MODE_MONITOR_DETECT; + if (intel_crtc->pipe == 1) + tv_ctl |= TV_ENC_PIPEB_SELECT; + else + tv_ctl &= ~TV_ENC_PIPEB_SELECT; + + tv_dac &= ~(TVDAC_SENSE_MASK | DAC_A_MASK | DAC_B_MASK | DAC_C_MASK); + tv_dac |= (TVDAC_STATE_CHG_EN | + TVDAC_A_SENSE_CTL | + TVDAC_B_SENSE_CTL | + TVDAC_C_SENSE_CTL | + DAC_CTL_OVERRIDE | + DAC_A_0_7_V | + DAC_B_0_7_V | + DAC_C_0_7_V); + + I915_WRITE(TV_CTL, tv_ctl); + I915_WRITE(TV_DAC, tv_dac); + POSTING_READ(TV_DAC); + + intel_wait_for_vblank(intel_tv->base.base.dev, + to_intel_crtc(intel_tv->base.base.crtc)->pipe); + + type = -1; + tv_dac = I915_READ(TV_DAC); + DRM_DEBUG_KMS("TV detected: %x, %x\n", tv_ctl, tv_dac); + /* + * A B C + * 0 1 1 Composite + * 1 0 X svideo + * 0 0 0 Component + */ + if ((tv_dac & TVDAC_SENSE_MASK) == (TVDAC_B_SENSE | TVDAC_C_SENSE)) { + DRM_DEBUG_KMS("Detected Composite TV connection\n"); + type = DRM_MODE_CONNECTOR_Composite; + } else if ((tv_dac & (TVDAC_A_SENSE|TVDAC_B_SENSE)) == TVDAC_A_SENSE) { + DRM_DEBUG_KMS("Detected S-Video TV connection\n"); + type = DRM_MODE_CONNECTOR_SVIDEO; + } else if ((tv_dac & TVDAC_SENSE_MASK) == 0) { + DRM_DEBUG_KMS("Detected Component TV connection\n"); + type = DRM_MODE_CONNECTOR_Component; + } else { + DRM_DEBUG_KMS("Unrecognised TV connection\n"); + type = -1; + } + + I915_WRITE(TV_DAC, save_tv_dac & ~TVDAC_STATE_CHG_EN); + I915_WRITE(TV_CTL, save_tv_ctl); + + /* Restore interrupt config */ + if (connector->polled & DRM_CONNECTOR_POLL_HPD) { + mtx_lock(&dev_priv->irq_lock); + i915_enable_pipestat(dev_priv, 0, + PIPE_HOTPLUG_INTERRUPT_ENABLE | + PIPE_HOTPLUG_TV_INTERRUPT_ENABLE); + mtx_unlock(&dev_priv->irq_lock); + } + + return type; +} + +/* + * Here we set accurate tv format according to connector type + * i.e Component TV should not be assigned by NTSC or PAL + */ +static void intel_tv_find_better_format(struct drm_connector *connector) +{ + struct intel_tv *intel_tv = intel_attached_tv(connector); + const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); + int i; + + if ((intel_tv->type == DRM_MODE_CONNECTOR_Component) == + tv_mode->component_only) + return; + + + for (i = 0; i < sizeof(tv_modes) / sizeof(*tv_modes); i++) { + tv_mode = tv_modes + i; + + if ((intel_tv->type == DRM_MODE_CONNECTOR_Component) == + tv_mode->component_only) + break; + } + + intel_tv->tv_format = tv_mode->name; + drm_connector_property_set_value(connector, + connector->dev->mode_config.tv_mode_property, i); +} + +/** + * Detect the TV connection. + * + * Currently this always returns CONNECTOR_STATUS_UNKNOWN, as we need to be sure + * we have a pipe programmed in order to probe the TV. + */ +static enum drm_connector_status +intel_tv_detect(struct drm_connector *connector, bool force) +{ + struct drm_display_mode mode; + struct intel_tv *intel_tv = intel_attached_tv(connector); + int type; + + mode = reported_modes[0]; + drm_mode_set_crtcinfo(&mode, 0); + + if (intel_tv->base.base.crtc && intel_tv->base.base.crtc->enabled) { + type = intel_tv_detect_type(intel_tv, connector); + } else if (force) { + struct intel_load_detect_pipe tmp; + + if (intel_get_load_detect_pipe(&intel_tv->base, connector, + &mode, &tmp)) { + type = intel_tv_detect_type(intel_tv, connector); + intel_release_load_detect_pipe(&intel_tv->base, + connector, + &tmp); + } else + return connector_status_unknown; + } else + return connector->status; + + if (type < 0) + return connector_status_disconnected; + + intel_tv->type = type; + intel_tv_find_better_format(connector); + + return connector_status_connected; +} + +static const struct input_res { + const char *name; + int w, h; +} input_res_table[] = { + {"640x480", 640, 480}, + {"800x600", 800, 600}, + {"1024x768", 1024, 768}, + {"1280x1024", 1280, 1024}, + {"848x480", 848, 480}, + {"1280x720", 1280, 720}, + {"1920x1080", 1920, 1080}, +}; + +/* + * Chose preferred mode according to line number of TV format + */ +static void +intel_tv_chose_preferred_modes(struct drm_connector *connector, + struct drm_display_mode *mode_ptr) +{ + struct intel_tv *intel_tv = intel_attached_tv(connector); + const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); + + if (tv_mode->nbr_end < 480 && mode_ptr->vdisplay == 480) + mode_ptr->type |= DRM_MODE_TYPE_PREFERRED; + else if (tv_mode->nbr_end > 480) { + if (tv_mode->progressive == true && tv_mode->nbr_end < 720) { + if (mode_ptr->vdisplay == 720) + mode_ptr->type |= DRM_MODE_TYPE_PREFERRED; + } else if (mode_ptr->vdisplay == 1080) + mode_ptr->type |= DRM_MODE_TYPE_PREFERRED; + } +} + +/** + * Stub get_modes function. + * + * This should probably return a set of fixed modes, unless we can figure out + * how to probe modes off of TV connections. + */ + +static int +intel_tv_get_modes(struct drm_connector *connector) +{ + struct drm_display_mode *mode_ptr; + struct intel_tv *intel_tv = intel_attached_tv(connector); + const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); + int j, count = 0; + u64 tmp; + + for (j = 0; j < DRM_ARRAY_SIZE(input_res_table); + j++) { + const struct input_res *input = &input_res_table[j]; + unsigned int hactive_s = input->w; + unsigned int vactive_s = input->h; + + if (tv_mode->max_srcw && input->w > tv_mode->max_srcw) + continue; + + if (input->w > 1024 && (!tv_mode->progressive + && !tv_mode->component_only)) + continue; + + mode_ptr = drm_mode_create(connector->dev); + if (!mode_ptr) + continue; + strncpy(mode_ptr->name, input->name, DRM_DISPLAY_MODE_LEN); + + mode_ptr->hdisplay = hactive_s; + mode_ptr->hsync_start = hactive_s + 1; + mode_ptr->hsync_end = hactive_s + 64; + if (mode_ptr->hsync_end <= mode_ptr->hsync_start) + mode_ptr->hsync_end = mode_ptr->hsync_start + 1; + mode_ptr->htotal = hactive_s + 96; + + mode_ptr->vdisplay = vactive_s; + mode_ptr->vsync_start = vactive_s + 1; + mode_ptr->vsync_end = vactive_s + 32; + if (mode_ptr->vsync_end <= mode_ptr->vsync_start) + mode_ptr->vsync_end = mode_ptr->vsync_start + 1; + mode_ptr->vtotal = vactive_s + 33; + + tmp = (u64) tv_mode->refresh * mode_ptr->vtotal; + tmp *= mode_ptr->htotal; + tmp = tmp / 1000000; + mode_ptr->clock = (int) tmp; + + mode_ptr->type = DRM_MODE_TYPE_DRIVER; + intel_tv_chose_preferred_modes(connector, mode_ptr); + drm_mode_probed_add(connector, mode_ptr); + count++; + } + + return count; +} + +static void +intel_tv_destroy(struct drm_connector *connector) +{ +#if 0 + drm_sysfs_connector_remove(connector); +#endif + drm_connector_cleanup(connector); + free(connector, DRM_MEM_KMS); +} + + +static int +intel_tv_set_property(struct drm_connector *connector, struct drm_property *property, + uint64_t val) +{ + struct drm_device *dev = connector->dev; + struct intel_tv *intel_tv = intel_attached_tv(connector); + struct drm_crtc *crtc = intel_tv->base.base.crtc; + int ret = 0; + bool changed = false; + + ret = drm_connector_property_set_value(connector, property, val); + if (ret < 0) + goto out; + + if (property == dev->mode_config.tv_left_margin_property && + intel_tv->margin[TV_MARGIN_LEFT] != val) { + intel_tv->margin[TV_MARGIN_LEFT] = val; + changed = true; + } else if (property == dev->mode_config.tv_right_margin_property && + intel_tv->margin[TV_MARGIN_RIGHT] != val) { + intel_tv->margin[TV_MARGIN_RIGHT] = val; + changed = true; + } else if (property == dev->mode_config.tv_top_margin_property && + intel_tv->margin[TV_MARGIN_TOP] != val) { + intel_tv->margin[TV_MARGIN_TOP] = val; + changed = true; + } else if (property == dev->mode_config.tv_bottom_margin_property && + intel_tv->margin[TV_MARGIN_BOTTOM] != val) { + intel_tv->margin[TV_MARGIN_BOTTOM] = val; + changed = true; + } else if (property == dev->mode_config.tv_mode_property) { + if (val >= DRM_ARRAY_SIZE(tv_modes)) { + ret = -EINVAL; + goto out; + } + if (!strcmp(intel_tv->tv_format, tv_modes[val].name)) + goto out; + + intel_tv->tv_format = tv_modes[val].name; + changed = true; + } else { + ret = -EINVAL; + goto out; + } + + if (changed && crtc) + drm_crtc_helper_set_mode(crtc, &crtc->mode, crtc->x, + crtc->y, crtc->fb); +out: + return ret; +} + +static const struct drm_encoder_helper_funcs intel_tv_helper_funcs = { + .dpms = intel_tv_dpms, + .mode_fixup = intel_tv_mode_fixup, + .prepare = intel_encoder_prepare, + .mode_set = intel_tv_mode_set, + .commit = intel_encoder_commit, +}; + +static const struct drm_connector_funcs intel_tv_connector_funcs = { + .dpms = drm_helper_connector_dpms, + .detect = intel_tv_detect, + .destroy = intel_tv_destroy, + .set_property = intel_tv_set_property, + .fill_modes = drm_helper_probe_single_connector_modes, +}; + +static const struct drm_connector_helper_funcs intel_tv_connector_helper_funcs = { + .mode_valid = intel_tv_mode_valid, + .get_modes = intel_tv_get_modes, + .best_encoder = intel_best_encoder, +}; + +static const struct drm_encoder_funcs intel_tv_enc_funcs = { + .destroy = intel_encoder_destroy, +}; + +/* + * Enumerate the child dev array parsed from VBT to check whether + * the integrated TV is present. + * If it is present, return 1. + * If it is not present, return false. + * If no child dev is parsed from VBT, it assumes that the TV is present. + */ +static int tv_is_present_in_vbt(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct child_device_config *p_child; + int i, ret; + + if (!dev_priv->child_dev_num) + return 1; + + ret = 0; + for (i = 0; i < dev_priv->child_dev_num; i++) { + p_child = dev_priv->child_dev + i; + /* + * If the device type is not TV, continue. + */ + if (p_child->device_type != DEVICE_TYPE_INT_TV && + p_child->device_type != DEVICE_TYPE_TV) + continue; + /* Only when the addin_offset is non-zero, it is regarded + * as present. + */ + if (p_child->addin_offset) { + ret = 1; + break; + } + } + return ret; +} + +void +intel_tv_init(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_connector *connector; + struct intel_tv *intel_tv; + struct intel_encoder *intel_encoder; + struct intel_connector *intel_connector; + u32 tv_dac_on, tv_dac_off, save_tv_dac; + char *tv_format_names[DRM_ARRAY_SIZE(tv_modes)]; + int i, initial_mode = 0; + + if ((I915_READ(TV_CTL) & TV_FUSE_STATE_MASK) == TV_FUSE_STATE_DISABLED) + return; + + if (!tv_is_present_in_vbt(dev)) { + DRM_DEBUG_KMS("Integrated TV is not present.\n"); + return; + } + /* Even if we have an encoder we may not have a connector */ + if (!dev_priv->int_tv_support) + return; + + /* + * Sanity check the TV output by checking to see if the + * DAC register holds a value + */ + save_tv_dac = I915_READ(TV_DAC); + + I915_WRITE(TV_DAC, save_tv_dac | TVDAC_STATE_CHG_EN); + tv_dac_on = I915_READ(TV_DAC); + + I915_WRITE(TV_DAC, save_tv_dac & ~TVDAC_STATE_CHG_EN); + tv_dac_off = I915_READ(TV_DAC); + + I915_WRITE(TV_DAC, save_tv_dac); + + /* + * If the register does not hold the state change enable + * bit, (either as a 0 or a 1), assume it doesn't really + * exist + */ + if ((tv_dac_on & TVDAC_STATE_CHG_EN) == 0 || + (tv_dac_off & TVDAC_STATE_CHG_EN) != 0) + return; + + intel_tv = malloc(sizeof(struct intel_tv), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + intel_connector = malloc(sizeof(struct intel_connector), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + + intel_encoder = &intel_tv->base; + connector = &intel_connector->base; + + /* The documentation, for the older chipsets at least, recommend + * using a polling method rather than hotplug detection for TVs. + * This is because in order to perform the hotplug detection, the PLLs + * for the TV must be kept alive increasing power drain and starving + * bandwidth from other encoders. Notably for instance, it causes + * pipe underruns on Crestline when this encoder is supposedly idle. + * + * More recent chipsets favour HDMI rather than integrated S-Video. + */ + connector->polled = DRM_CONNECTOR_POLL_CONNECT; + + drm_connector_init(dev, connector, &intel_tv_connector_funcs, + DRM_MODE_CONNECTOR_SVIDEO); + + drm_encoder_init(dev, &intel_encoder->base, &intel_tv_enc_funcs, + DRM_MODE_ENCODER_TVDAC); + + intel_connector_attach_encoder(intel_connector, intel_encoder); + intel_encoder->type = INTEL_OUTPUT_TVOUT; + intel_encoder->crtc_mask = (1 << 0) | (1 << 1); + intel_encoder->clone_mask = (1 << INTEL_TV_CLONE_BIT); + intel_encoder->base.possible_crtcs = ((1 << 0) | (1 << 1)); + intel_encoder->base.possible_clones = (1 << INTEL_OUTPUT_TVOUT); + intel_tv->type = DRM_MODE_CONNECTOR_Unknown; + + /* BIOS margin values */ + intel_tv->margin[TV_MARGIN_LEFT] = 54; + intel_tv->margin[TV_MARGIN_TOP] = 36; + intel_tv->margin[TV_MARGIN_RIGHT] = 46; + intel_tv->margin[TV_MARGIN_BOTTOM] = 37; + + intel_tv->tv_format = tv_modes[initial_mode].name; + + drm_encoder_helper_add(&intel_encoder->base, &intel_tv_helper_funcs); + drm_connector_helper_add(connector, &intel_tv_connector_helper_funcs); + connector->interlace_allowed = false; + connector->doublescan_allowed = false; + + /* Create TV properties then attach current values */ + for (i = 0; i < DRM_ARRAY_SIZE(tv_modes); i++) + tv_format_names[i] = __DECONST(char *, tv_modes[i].name); + drm_mode_create_tv_properties(dev, + DRM_ARRAY_SIZE(tv_modes), + tv_format_names); + + drm_connector_attach_property(connector, dev->mode_config.tv_mode_property, + initial_mode); + drm_connector_attach_property(connector, + dev->mode_config.tv_left_margin_property, + intel_tv->margin[TV_MARGIN_LEFT]); + drm_connector_attach_property(connector, + dev->mode_config.tv_top_margin_property, + intel_tv->margin[TV_MARGIN_TOP]); + drm_connector_attach_property(connector, + dev->mode_config.tv_right_margin_property, + intel_tv->margin[TV_MARGIN_RIGHT]); + drm_connector_attach_property(connector, + dev->mode_config.tv_bottom_margin_property, + intel_tv->margin[TV_MARGIN_BOTTOM]); +#if 0 + drm_sysfs_connector_add(connector); +#endif +} diff --git a/sys/dev/e1000/e1000_82541.c b/sys/dev/e1000/e1000_82541.c index d13611ec33d..781aa931fb2 100644 --- a/sys/dev/e1000/e1000_82541.c +++ b/sys/dev/e1000/e1000_82541.c @@ -642,7 +642,7 @@ static s32 e1000_check_for_link_82541(struct e1000_hw *hw) * of MAC speed/duplex configuration. So we only need to * configure Collision Distance in the MAC. */ - e1000_config_collision_dist_generic(hw); + mac->ops.config_collision_dist(hw); /* * Configure Flow Control now that Auto-Neg has completed. diff --git a/sys/dev/e1000/e1000_82543.c b/sys/dev/e1000/e1000_82543.c index 1507da51c38..1c01658cfc9 100644 --- a/sys/dev/e1000/e1000_82543.c +++ b/sys/dev/e1000/e1000_82543.c @@ -1126,7 +1126,7 @@ static s32 e1000_setup_copper_link_82543(struct e1000_hw *hw) DEBUGOUT("Valid link established!!!\n"); /* Config the MAC and PHY after link is up */ if (hw->mac.type == e1000_82544) { - e1000_config_collision_dist_generic(hw); + hw->mac.ops.config_collision_dist(hw); } else { ret_val = e1000_config_mac_to_phy_82543(hw); if (ret_val) @@ -1160,7 +1160,7 @@ static s32 e1000_setup_fiber_link_82543(struct e1000_hw *hw) /* Take the link out of reset */ ctrl &= ~E1000_CTRL_LRST; - e1000_config_collision_dist_generic(hw); + hw->mac.ops.config_collision_dist(hw); ret_val = e1000_commit_fc_settings_generic(hw); if (ret_val) @@ -1259,7 +1259,7 @@ static s32 e1000_check_for_copper_link_82543(struct e1000_hw *hw) * settings. */ if (mac->type == e1000_82544) - e1000_config_collision_dist_generic(hw); + hw->mac.ops.config_collision_dist(hw); else { ret_val = e1000_config_mac_to_phy_82543(hw); if (ret_val) { @@ -1433,7 +1433,7 @@ static s32 e1000_config_mac_to_phy_82543(struct e1000_hw *hw) if (phy_data & M88E1000_PSSR_DPLX) ctrl |= E1000_CTRL_FD; - e1000_config_collision_dist_generic(hw); + hw->mac.ops.config_collision_dist(hw); /* * Set up speed in the Device Control register depending on diff --git a/sys/dev/e1000/e1000_82571.c b/sys/dev/e1000/e1000_82571.c index a2982b93ed5..30015c1eaa4 100644 --- a/sys/dev/e1000/e1000_82571.c +++ b/sys/dev/e1000/e1000_82571.c @@ -1907,7 +1907,7 @@ void e1000_set_laa_state_82571(struct e1000_hw *hw, bool state) * incoming packets directed to this port are dropped. * Eventually the LAA will be in RAR[0] and RAR[14]. */ - e1000_rar_set_generic(hw, hw->mac.addr, + hw->mac.ops.rar_set(hw, hw->mac.addr, hw->mac.rar_entry_count - 1); return; } diff --git a/sys/dev/e1000/e1000_82575.c b/sys/dev/e1000/e1000_82575.c index 75fe0a4fc9c..a04e3fad22f 100644 --- a/sys/dev/e1000/e1000_82575.c +++ b/sys/dev/e1000/e1000_82575.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2011, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -38,9 +38,12 @@ * 82575GB Gigabit Network Connection * 82576 Gigabit Network Connection * 82576 Quad Port Gigabit Mezzanine Adapter + * 82580 Gigabit Network Connection + * I350 Gigabit Network Connection */ #include "e1000_api.h" +#include "e1000_i210.h" static s32 e1000_init_phy_params_82575(struct e1000_hw *hw); static s32 e1000_init_mac_params_82575(struct e1000_hw *hw); @@ -162,6 +165,9 @@ static s32 e1000_init_phy_params_82575(struct e1000_hw *hw) DEBUGFUNC("e1000_init_phy_params_82575"); + phy->ops.read_i2c_byte = e1000_read_i2c_byte_generic; + phy->ops.write_i2c_byte = e1000_write_i2c_byte_generic; + if (hw->phy.media_type != e1000_media_type_copper) { phy->type = e1000_phy_none; goto out; @@ -195,12 +201,22 @@ static s32 e1000_init_phy_params_82575(struct e1000_hw *hw) if (e1000_sgmii_active_82575(hw) && !e1000_sgmii_uses_mdio_82575(hw)) { phy->ops.read_reg = e1000_read_phy_reg_sgmii_82575; phy->ops.write_reg = e1000_write_phy_reg_sgmii_82575; - } else if (hw->mac.type >= e1000_82580) { - phy->ops.read_reg = e1000_read_phy_reg_82580; - phy->ops.write_reg = e1000_write_phy_reg_82580; } else { - phy->ops.read_reg = e1000_read_phy_reg_igp; - phy->ops.write_reg = e1000_write_phy_reg_igp; + switch (hw->mac.type) { + case e1000_82580: + case e1000_i350: + phy->ops.read_reg = e1000_read_phy_reg_82580; + phy->ops.write_reg = e1000_write_phy_reg_82580; + break; + case e1000_i210: + case e1000_i211: + phy->ops.read_reg = e1000_read_phy_reg_gs40g; + phy->ops.write_reg = e1000_write_phy_reg_gs40g; + break; + default: + phy->ops.read_reg = e1000_read_phy_reg_igp; + phy->ops.write_reg = e1000_write_phy_reg_igp; + } } /* Set phy->phy_addr and phy->id. */ @@ -245,6 +261,15 @@ static s32 e1000_init_phy_params_82575(struct e1000_hw *hw) phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_82580; phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_82580; break; + case I210_I_PHY_ID: + phy->type = e1000_phy_i210; + phy->ops.check_polarity = e1000_check_polarity_m88; + phy->ops.get_info = e1000_get_phy_info_m88; + phy->ops.get_cable_length = e1000_get_cable_length_m88_gen2; + phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_82580; + phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_82580; + phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88; + break; default: ret_val = -E1000_ERR_PHY; goto out; @@ -281,28 +306,32 @@ s32 e1000_init_nvm_params_82575(struct e1000_hw *hw) size = 15; nvm->word_size = 1 << size; - nvm->opcode_bits = 8; - nvm->delay_usec = 1; - switch (nvm->override) { - case e1000_nvm_override_spi_large: - nvm->page_size = 32; - nvm->address_bits = 16; - break; - case e1000_nvm_override_spi_small: - nvm->page_size = 8; - nvm->address_bits = 8; - break; - default: - nvm->page_size = eecd & E1000_EECD_ADDR_BITS ? 32 : 8; - nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? 16 : 8; - break; + if (hw->mac.type < e1000_i210) { + nvm->opcode_bits = 8; + nvm->delay_usec = 1; + + switch (nvm->override) { + case e1000_nvm_override_spi_large: + nvm->page_size = 32; + nvm->address_bits = 16; + break; + case e1000_nvm_override_spi_small: + nvm->page_size = 8; + nvm->address_bits = 8; + break; + default: + nvm->page_size = eecd & E1000_EECD_ADDR_BITS ? 32 : 8; + nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? + 16 : 8; + break; + } + if (nvm->word_size == (1 << 15)) + nvm->page_size = 128; + + nvm->type = e1000_nvm_eeprom_spi; + } else { + nvm->type = e1000_nvm_flash_hw; } - - nvm->type = e1000_nvm_eeprom_spi; - - if (nvm->word_size == (1 << 15)) - nvm->page_size = 128; - /* Function Pointers */ nvm->ops.acquire = e1000_acquire_nvm_82575; nvm->ops.release = e1000_release_nvm_82575; @@ -316,7 +345,7 @@ s32 e1000_init_nvm_params_82575(struct e1000_hw *hw) nvm->ops.update = e1000_update_nvm_checksum_generic; nvm->ops.valid_led_default = e1000_valid_led_default_82575; - /* override genric family function pointers for specific descendants */ + /* override generic family function pointers for specific descendants */ switch (hw->mac.type) { case e1000_82580: nvm->ops.validate = e1000_validate_nvm_checksum_82580; @@ -368,8 +397,7 @@ static s32 e1000_init_mac_params_82575(struct e1000_hw *hw) mac->has_fwsm = TRUE; /* ARC supported; valid only if manageability features are enabled. */ mac->arc_subsystem_valid = - (E1000_READ_REG(hw, E1000_FWSM) & E1000_FWSM_MODE_MASK) - ? TRUE : FALSE; + !!(E1000_READ_REG(hw, E1000_FWSM) & E1000_FWSM_MODE_MASK); /* Function pointers */ @@ -394,8 +422,6 @@ static s32 e1000_init_mac_params_82575(struct e1000_hw *hw) mac->ops.power_up_serdes = e1000_power_up_serdes_link_82575; /* check for link */ mac->ops.check_for_link = e1000_check_for_link_82575; - /* receive address register setting */ - mac->ops.rar_set = e1000_rar_set_generic; /* read mac address */ mac->ops.read_mac_addr = e1000_read_mac_addr_82575; /* configure collision distance */ @@ -428,6 +454,13 @@ static s32 e1000_init_mac_params_82575(struct e1000_hw *hw) mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_82575; /* link info */ mac->ops.get_link_up_info = e1000_get_link_up_info_82575; + /* acquire SW_FW sync */ + mac->ops.acquire_swfw_sync = e1000_acquire_swfw_sync_82575; + mac->ops.release_swfw_sync = e1000_release_swfw_sync_82575; + if (mac->type >= e1000_i210) { + mac->ops.acquire_swfw_sync = e1000_acquire_swfw_sync_i210; + mac->ops.release_swfw_sync = e1000_release_swfw_sync_i210; + } /* set lan id for port to determine which phy lock to use */ hw->mac.ops.set_lan_id(hw); @@ -470,7 +503,7 @@ static s32 e1000_acquire_phy_82575(struct e1000_hw *hw) else if (hw->bus.func == E1000_FUNC_3) mask = E1000_SWFW_PHY3_SM; - return e1000_acquire_swfw_sync_82575(hw, mask); + return hw->mac.ops.acquire_swfw_sync(hw, mask); } /** @@ -492,7 +525,7 @@ static void e1000_release_phy_82575(struct e1000_hw *hw) else if (hw->bus.func == E1000_FUNC_3) mask = E1000_SWFW_PHY3_SM; - e1000_release_swfw_sync_82575(hw, mask); + hw->mac.ops.release_swfw_sync(hw, mask); } /** @@ -796,7 +829,7 @@ static s32 e1000_set_d0_lplu_state_82580(struct e1000_hw *hw, bool active) { struct e1000_phy_info *phy = &hw->phy; s32 ret_val = E1000_SUCCESS; - u16 data; + u32 data; DEBUGFUNC("e1000_set_d0_lplu_state_82580"); @@ -844,7 +877,7 @@ s32 e1000_set_d3_lplu_state_82580(struct e1000_hw *hw, bool active) { struct e1000_phy_info *phy = &hw->phy; s32 ret_val = E1000_SUCCESS; - u16 data; + u32 data; DEBUGFUNC("e1000_set_d3_lplu_state_82580"); @@ -918,11 +951,7 @@ static s32 e1000_acquire_nvm_82575(struct e1000_hw *hw) } - switch (hw->mac.type) { - default: - ret_val = e1000_acquire_nvm_generic(hw); - } - + ret_val = e1000_acquire_nvm_generic(hw); if (ret_val) e1000_release_swfw_sync_82575(hw, E1000_SWFW_EEP_SM); @@ -941,10 +970,8 @@ static void e1000_release_nvm_82575(struct e1000_hw *hw) { DEBUGFUNC("e1000_release_nvm_82575"); - switch (hw->mac.type) { - default: - e1000_release_nvm_generic(hw); - } + e1000_release_nvm_generic(hw); + e1000_release_swfw_sync_82575(hw, E1000_SWFW_EEP_SM); } @@ -1058,7 +1085,7 @@ static s32 e1000_get_cfg_done_82575(struct e1000_hw *hw) DEBUGOUT("MNG configuration cycle has not completed.\n"); /* If EEPROM is not marked present, init the PHY manually */ - if (((E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES) == 0) && + if (!(E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES) && (hw->phy.type == e1000_phy_igp_3)) e1000_phy_init_script_igp3(hw); @@ -1115,6 +1142,7 @@ static s32 e1000_check_for_link_82575(struct e1000_hw *hw) * continue to check for link. */ hw->mac.get_link_status = !hw->mac.serdes_has_link; + } else { ret_val = e1000_check_for_copper_link_generic(hw); } @@ -1168,11 +1196,6 @@ static s32 e1000_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, DEBUGFUNC("e1000_get_pcs_speed_and_duplex_82575"); - /* Set up defaults for the return values of this function */ - mac->serdes_has_link = FALSE; - *speed = 0; - *duplex = 0; - /* * Read the PCS Status register for link state. For non-copper mode, * the status register is not accurate. The PCS status register is @@ -1181,11 +1204,9 @@ static s32 e1000_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, pcs = E1000_READ_REG(hw, E1000_PCS_LSTAT); /* - * The link up bit determines when link is up on autoneg. The sync ok - * gets set once both sides sync up and agree upon link. Stable link - * can be determined by checking for both link up and link sync ok + * The link up bit determines when link is up on autoneg. */ - if ((pcs & E1000_PCS_LSTS_LINK_OK) && (pcs & E1000_PCS_LSTS_SYNK_OK)) { + if (pcs & E1000_PCS_LSTS_LINK_OK) { mac->serdes_has_link = TRUE; /* Detect and store PCS speed */ @@ -1201,6 +1222,10 @@ static s32 e1000_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, *duplex = FULL_DUPLEX; else *duplex = HALF_DUPLEX; + } else { + mac->serdes_has_link = FALSE; + *speed = 0; + *duplex = 0; } return E1000_SUCCESS; @@ -1293,7 +1318,7 @@ static s32 e1000_reset_hw_82575(struct e1000_hw *hw) } /* If EEPROM is not present, run manual init scripts */ - if ((E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES) == 0) + if (!(E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES)) e1000_reset_init_script_82575(hw); /* Clear any pending interrupt events. */ @@ -1396,6 +1421,7 @@ static s32 e1000_setup_copper_link_82575(struct e1000_hw *hw) } } switch (hw->phy.type) { + case e1000_phy_i210: case e1000_phy_m88: if (hw->phy.id == I347AT4_E_PHY_ID || hw->phy.id == M88E1112_E_PHY_ID || @@ -1605,31 +1631,28 @@ static s32 e1000_get_media_type_82575(struct e1000_hw *hw) } /* Read Init Control Word #3*/ hw->nvm.ops.read(hw, init_ctrl_wd_3_offset, 1, &init_ctrl_wd_3); + + /* + * Align link mode bits to + * their CTRL_EXT location. + */ current_link_mode = init_ctrl_wd_3; + current_link_mode <<= (E1000_CTRL_EXT_LINK_MODE_OFFSET - + init_ctrl_wd_3_bit_offset); + current_link_mode &= E1000_CTRL_EXT_LINK_MODE_MASK; + /* * Switch to CSR for all but internal PHY. */ - if ((init_ctrl_wd_3 << (E1000_CTRL_EXT_LINK_MODE_OFFSET - - init_ctrl_wd_3_bit_offset)) != - E1000_CTRL_EXT_LINK_MODE_GMII) { - current_link_mode = ctrl_ext; - init_ctrl_wd_3_bit_offset = - E1000_CTRL_EXT_LINK_MODE_OFFSET; - } + if (current_link_mode != E1000_CTRL_EXT_LINK_MODE_GMII) + /* Take link mode from CSR */ + current_link_mode = ctrl_ext & + E1000_CTRL_EXT_LINK_MODE_MASK; } else { /* Take link mode from CSR */ - current_link_mode = ctrl_ext; - init_ctrl_wd_3_bit_offset = E1000_CTRL_EXT_LINK_MODE_OFFSET; + current_link_mode = ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK; } - /* - * Align link mode bits to - * their CTRL_EXT location. - */ - current_link_mode <<= (E1000_CTRL_EXT_LINK_MODE_OFFSET - - init_ctrl_wd_3_bit_offset); - current_link_mode &= E1000_CTRL_EXT_LINK_MODE_MASK; - switch (current_link_mode) { case E1000_CTRL_EXT_LINK_MODE_1000BASE_KX: @@ -2331,7 +2354,7 @@ static s32 e1000_reset_hw_82580(struct e1000_hw *hw) msec_delay(10); /* Determine whether or not a global dev reset is requested */ - if (global_device_reset && e1000_acquire_swfw_sync_82575(hw, + if (global_device_reset && hw->mac.ops.acquire_swfw_sync(hw, swmbsw_mask)) global_device_reset = FALSE; @@ -2359,7 +2382,7 @@ static s32 e1000_reset_hw_82580(struct e1000_hw *hw) } /* If EEPROM is not present, run manual init scripts */ - if ((E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES) == 0) + if (!(E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES)) e1000_reset_init_script_82575(hw); /* clear global device reset status bit */ @@ -2378,7 +2401,7 @@ static s32 e1000_reset_hw_82580(struct e1000_hw *hw) /* Release semaphore */ if (global_device_reset) - e1000_release_swfw_sync_82575(hw, swmbsw_mask); + hw->mac.ops.release_swfw_sync(hw, swmbsw_mask); return ret_val; } @@ -2538,7 +2561,7 @@ static s32 e1000_update_nvm_checksum_82580(struct e1000_hw *hw) goto out; } - if ((nvm_data & NVM_COMPATIBILITY_BIT_MASK) == 0) { + if (!(nvm_data & NVM_COMPATIBILITY_BIT_MASK)) { /* set compatibility bit to validate checksums appropriately */ nvm_data = nvm_data | NVM_COMPATIBILITY_BIT_MASK; ret_val = hw->nvm.ops.write(hw, NVM_COMPATIBILITY_REG_3, 1, @@ -2737,6 +2760,7 @@ s32 e1000_set_i2c_bb(struct e1000_hw *hw) * e1000_read_i2c_byte_generic - Reads 8 bit word over I2C * @hw: pointer to hardware structure * @byte_offset: byte offset to read + * @dev_addr: device address * @data: value read * * Performs byte read operation over I2C interface at @@ -2750,14 +2774,14 @@ s32 e1000_read_i2c_byte_generic(struct e1000_hw *hw, u8 byte_offset, u32 retry = 1; u16 swfw_mask = 0; - bool nack = 1; + bool nack = TRUE; DEBUGFUNC("e1000_read_i2c_byte_generic"); swfw_mask = E1000_SWFW_PHY0_SM; do { - if (e1000_acquire_swfw_sync_82575(hw, swfw_mask) + if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) != E1000_SUCCESS) { status = E1000_ERR_SWFW_SYNC; goto read_byte_out; @@ -2805,7 +2829,7 @@ s32 e1000_read_i2c_byte_generic(struct e1000_hw *hw, u8 byte_offset, break; fail: - e1000_release_swfw_sync_82575(hw, swfw_mask); + hw->mac.ops.release_swfw_sync(hw, swfw_mask); msec_delay(100); e1000_i2c_bus_clear(hw); retry++; @@ -2816,7 +2840,7 @@ fail: } while (retry < max_retry); - e1000_release_swfw_sync_82575(hw, swfw_mask); + hw->mac.ops.release_swfw_sync(hw, swfw_mask); read_byte_out: @@ -2827,6 +2851,7 @@ read_byte_out: * e1000_write_i2c_byte_generic - Writes 8 bit word over I2C * @hw: pointer to hardware structure * @byte_offset: byte offset to write + * @dev_addr: device address * @data: value to write * * Performs byte write operation over I2C interface at @@ -2844,7 +2869,7 @@ s32 e1000_write_i2c_byte_generic(struct e1000_hw *hw, u8 byte_offset, swfw_mask = E1000_SWFW_PHY0_SM; - if (e1000_acquire_swfw_sync_82575(hw, swfw_mask) != E1000_SUCCESS) { + if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) != E1000_SUCCESS) { status = E1000_ERR_SWFW_SYNC; goto write_byte_out; } @@ -2888,7 +2913,7 @@ fail: DEBUGOUT("I2C byte write error.\n"); } while (retry < max_retry); - e1000_release_swfw_sync_82575(hw, swfw_mask); + hw->mac.ops.release_swfw_sync(hw, swfw_mask); write_byte_out: @@ -3020,7 +3045,7 @@ static s32 e1000_get_i2c_ack(struct e1000_hw *hw) u32 i = 0; u32 i2cctl = E1000_READ_REG(hw, E1000_I2CPARAMS); u32 timeout = 10; - bool ack = 1; + bool ack = TRUE; DEBUGFUNC("e1000_get_i2c_ack"); @@ -3040,7 +3065,7 @@ static s32 e1000_get_i2c_ack(struct e1000_hw *hw) return E1000_ERR_I2C; ack = e1000_get_i2c_data(&i2cctl); - if (ack == 1) { + if (ack) { DEBUGOUT("I2C ack was not received.\n"); status = E1000_ERR_I2C; } diff --git a/sys/dev/e1000/e1000_api.c b/sys/dev/e1000/e1000_api.c index fdfc4bbba94..4b2a43d7286 100644 --- a/sys/dev/e1000/e1000_api.c +++ b/sys/dev/e1000/e1000_api.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2011, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -323,6 +323,17 @@ s32 e1000_set_mac_type(struct e1000_hw *hw) case E1000_DEV_ID_I350_DA4: mac->type = e1000_i350; break; + case E1000_DEV_ID_I210_COPPER: + case E1000_DEV_ID_I210_COPPER_OEM1: + case E1000_DEV_ID_I210_COPPER_IT: + case E1000_DEV_ID_I210_FIBER: + case E1000_DEV_ID_I210_SERDES: + case E1000_DEV_ID_I210_SGMII: + mac->type = e1000_i210; + break; + case E1000_DEV_ID_I211_COPPER: + mac->type = e1000_i211; + break; case E1000_DEV_ID_82576_VF: mac->type = e1000_vfadapt; break; @@ -425,6 +436,10 @@ s32 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device) case e1000_i350: e1000_init_function_pointers_82575(hw); break; + case e1000_i210: + case e1000_i211: + e1000_init_function_pointers_i210(hw); + break; case e1000_vfadapt: e1000_init_function_pointers_vf(hw); break; diff --git a/sys/dev/e1000/e1000_api.h b/sys/dev/e1000/e1000_api.h index 70aaa153ea1..4c061c0958b 100644 --- a/sys/dev/e1000/e1000_api.h +++ b/sys/dev/e1000/e1000_api.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2011, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -49,6 +49,7 @@ extern void e1000_rx_fifo_flush_82575(struct e1000_hw *hw); extern void e1000_init_function_pointers_vf(struct e1000_hw *hw); extern void e1000_power_up_fiber_serdes_link(struct e1000_hw *hw); extern void e1000_shutdown_fiber_serdes_link(struct e1000_hw *hw); +extern void e1000_init_function_pointers_i210(struct e1000_hw *hw); s32 e1000_set_mac_type(struct e1000_hw *hw); s32 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device); @@ -118,6 +119,7 @@ s32 e1000_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length); u32 e1000_translate_register_82542(u32 reg); + /* * TBI_ACCEPT macro definition: * diff --git a/sys/dev/e1000/e1000_defines.h b/sys/dev/e1000/e1000_defines.h index 69ef386be87..a4a0ed05004 100644 --- a/sys/dev/e1000/e1000_defines.h +++ b/sys/dev/e1000/e1000_defines.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2011, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -1344,6 +1344,16 @@ #define E1000_EECD_SEC1VAL 0x00400000 /* Sector One Valid */ #define E1000_EECD_SECVAL_SHIFT 22 #define E1000_EECD_SEC1VAL_VALID_MASK (E1000_EECD_AUTO_RD | E1000_EECD_PRES) +#define E1000_EECD_FLUPD_I210 0x00800000 /* Update FLASH */ +#define E1000_EECD_FLUDONE_I210 0x04000000 /* Update FLASH done */ +#define E1000_EECD_FLASH_DETECTED_I210 0x00080000 /* FLASH detected */ +#define E1000_FLUDONE_ATTEMPTS 20000 +#define E1000_EERD_EEWR_MAX_COUNT 512 /* buffered EEPROM words rw */ +#define E1000_I210_FIFO_SEL_RX 0x00 +#define E1000_I210_FIFO_SEL_TX_QAV(_i) (0x02 + (_i)) +#define E1000_I210_FIFO_SEL_TX_LEGACY E1000_I210_FIFO_SEL_TX_QAV(0) +#define E1000_I210_FIFO_SEL_BMC2OS_TX 0x06 +#define E1000_I210_FIFO_SEL_BMC2OS_RX 0x01 #define E1000_NVM_SWDPIN0 0x0001 /* SWDPIN 0 NVM Value */ #define E1000_NVM_LED_LOGIC 0x0020 /* Led Logic Word */ @@ -1361,6 +1371,20 @@ #define NVM_VERSION 0x0005 #define NVM_SERDES_AMPLITUDE 0x0006 /* SERDES output amplitude */ #define NVM_PHY_CLASS_WORD 0x0007 +#define NVM_ETRACK_WORD 0x0042 +#define NVM_COMB_VER_OFF 0x0083 +#define NVM_COMB_VER_PTR 0x003d + +#define NVM_MAC_ADDR 0x0000 +#define NVM_SUB_DEV_ID 0x000B +#define NVM_SUB_VEN_ID 0x000C +#define NVM_DEV_ID 0x000D +#define NVM_VEN_ID 0x000E +#define NVM_INIT_CTRL_2 0x000F +#define NVM_INIT_CTRL_4 0x0013 +#define NVM_LED_1_CFG 0x001C +#define NVM_LED_0_2_CFG 0x001F + #define NVM_INIT_CONTROL1_REG 0x000A #define NVM_INIT_CONTROL2_REG 0x000F #define NVM_SWDEF_PINS_CTRL_PORT_1 0x0010 @@ -1380,12 +1404,12 @@ #define E1000_NVM_CFG_DONE_PORT_2 0x100000 /* ...for third port */ #define E1000_NVM_CFG_DONE_PORT_3 0x200000 /* ...for fourth port */ -#define NVM_82580_LAN_FUNC_OFFSET(a) (a ? (0x40 + (0x40 * a)) : 0) +#define NVM_82580_LAN_FUNC_OFFSET(a) ((a) ? (0x40 + (0x40 * (a))) : 0) /* Mask bits for fields in Word 0x24 of the NVM */ #define NVM_WORD24_COM_MDIO 0x0008 /* MDIO interface shared */ #define NVM_WORD24_EXT_MDIO 0x0004 /* MDIO accesses routed extrnl */ -/* Offset of Link Mode bits for 82575 up to Kawela */ +/* Offset of Link Mode bits for 82575/82576 */ #define NVM_WORD24_LNK_MODE_OFFSET 8 /* Offset of Link Mode bits for 82580 up */ #define NVM_WORD24_82580_LNK_MODE_OFFSET 4 @@ -1525,6 +1549,7 @@ #define I82579_E_PHY_ID 0x01540090 #define I82580_I_PHY_ID 0x015403A0 #define I350_I_PHY_ID 0x015403B0 +#define I210_I_PHY_ID 0x01410C00 #define IGP04E1000_E_PHY_ID 0x02A80391 #define M88_VENDOR 0x0141 @@ -1787,6 +1812,8 @@ #define E1000_DMACR_DMAC_LX_MASK 0x30000000 #define E1000_DMACR_DMAC_LX_SHIFT 28 #define E1000_DMACR_DMAC_EN 0x80000000 /* Enable DMA Coalescing */ +/* DMA Coalescing BMC-to-OS Watchdog Enable */ +#define E1000_DMACR_DC_BMC2OSW_EN 0x00008000 /* DMA Coalescing Transmit Threshold */ #define E1000_DMCTXTH_DMCTTHR_MASK 0x00000FFF @@ -1807,8 +1834,9 @@ /* Lx power decision based on DMA coal */ #define E1000_PCIEMISC_LX_DECISION 0x00000080 -#define E1000_LTRC_EEEMS_EN 0x00000005 /* Enable EEE LTR max send */ #define E1000_RXPBS_SIZE_I210_MASK 0x0000003F /* Rx packet buffer size */ +#define E1000_TXPB0S_SIZE_I210_MASK 0x0000003F /* Tx packet buffer 0 size */ +#define E1000_LTRC_EEEMS_EN 0x00000020 /* Enable EEE LTR max send */ /* Minimum time for 1000BASE-T where no data will be transmit following move out * of EEE LPI Tx state */ @@ -1826,12 +1854,14 @@ #define E1000_LTRMINV_SCALE_1024 2 /* Reg val to set scale to 32768 nsec */ #define E1000_LTRMINV_SCALE_32768 3 +#define E1000_LTRMINV_LSNP_REQ 0x00008000 /* LTR Snoop Requirement */ #define E1000_LTRMAXV_SCALE_MASK 0x00001C00 /* LTR maximum scale */ #define E1000_LTRMAXV_SCALE_SHIFT 10 /* Reg val to set scale to 1024 nsec */ #define E1000_LTRMAXV_SCALE_1024 2 /* Reg val to set scale to 32768 nsec */ #define E1000_LTRMAXV_SCALE_32768 3 +#define E1000_LTRMAXV_LSNP_REQ 0x00008000 /* LTR Snoop Requirement */ #define E1000_DOBFFCTL_OBFFTHR_MASK 0x000000FF /* OBFF threshold */ #define E1000_DOBFFCTL_EXIT_ACT_MASK 0x01000000 /* Exit active CB */ diff --git a/sys/dev/e1000/e1000_hw.h b/sys/dev/e1000/e1000_hw.h index 16cfa8fa0d4..50a5ce2c28d 100644 --- a/sys/dev/e1000/e1000_hw.h +++ b/sys/dev/e1000/e1000_hw.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2011, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -154,6 +154,13 @@ struct e1000_hw; #define E1000_DEV_ID_I350_SERDES 0x1523 #define E1000_DEV_ID_I350_SGMII 0x1524 #define E1000_DEV_ID_I350_DA4 0x1546 +#define E1000_DEV_ID_I210_COPPER 0x1533 +#define E1000_DEV_ID_I210_COPPER_OEM1 0x1534 +#define E1000_DEV_ID_I210_COPPER_IT 0x1535 +#define E1000_DEV_ID_I210_FIBER 0x1536 +#define E1000_DEV_ID_I210_SERDES 0x1537 +#define E1000_DEV_ID_I210_SGMII 0x1538 +#define E1000_DEV_ID_I211_COPPER 0x1539 #define E1000_DEV_ID_DH89XXCC_SGMII 0x0438 #define E1000_DEV_ID_DH89XXCC_SERDES 0x043A #define E1000_DEV_ID_DH89XXCC_BACKPLANE 0x043C @@ -203,6 +210,8 @@ enum e1000_mac_type { e1000_82576, e1000_82580, e1000_i350, + e1000_i210, + e1000_i211, e1000_vfadapt, e1000_vfadapt_i350, e1000_num_macs /* List is 1-based, so subtract 1 for TRUE count. */ @@ -248,6 +257,7 @@ enum e1000_phy_type { e1000_phy_82579, e1000_phy_82580, e1000_phy_vf, + e1000_phy_i210, }; enum e1000_bus_type { @@ -674,6 +684,8 @@ struct e1000_mac_operations { struct e1000_host_mng_command_header*); s32 (*mng_enable_host_if)(struct e1000_hw *); s32 (*wait_autoneg)(struct e1000_hw *); + s32 (*acquire_swfw_sync)(struct e1000_hw *, u16); + void (*release_swfw_sync)(struct e1000_hw *, u16); }; /* @@ -911,13 +923,13 @@ struct e1000_dev_spec_ich8lan { E1000_MUTEX nvm_mutex; E1000_MUTEX swflag_mutex; bool nvm_k1_enabled; - int eee_disable; + bool eee_disable; }; struct e1000_dev_spec_82575 { bool sgmii_active; bool global_device_reset; - int eee_disable; + bool eee_disable; bool module_plugged; u32 mtu; }; @@ -967,6 +979,7 @@ struct e1000_hw { #include "e1000_80003es2lan.h" #include "e1000_ich8lan.h" #include "e1000_82575.h" +#include "e1000_i210.h" /* These functions must be implemented by drivers */ void e1000_pci_clear_mwi(struct e1000_hw *hw); diff --git a/sys/dev/e1000/e1000_i210.c b/sys/dev/e1000/e1000_i210.c new file mode 100644 index 00000000000..f8e8bad0d84 --- /dev/null +++ b/sys/dev/e1000/e1000_i210.c @@ -0,0 +1,740 @@ +/****************************************************************************** + + Copyright (c) 2001-2012, Intel Corporation + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +******************************************************************************/ +/*$FreeBSD$*/ + +#include "e1000_api.h" + + +static s32 e1000_acquire_nvm_i210(struct e1000_hw *hw); +static void e1000_release_nvm_i210(struct e1000_hw *hw); +static s32 e1000_get_hw_semaphore_i210(struct e1000_hw *hw); +static void e1000_put_hw_semaphore_i210(struct e1000_hw *hw); +static s32 e1000_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words, + u16 *data); +static s32 e1000_pool_flash_update_done_i210(struct e1000_hw *hw); +static s32 e1000_valid_led_default_i210(struct e1000_hw *hw, u16 *data); +static s32 e1000_read_nvm_i211(struct e1000_hw *hw, u16 offset, u16 words, + u16 *data); + +/** + * e1000_acquire_nvm_i210 - Request for access to EEPROM + * @hw: pointer to the HW structure + * + * Acquire the necessary semaphores for exclusive access to the EEPROM. + * Set the EEPROM access request bit and wait for EEPROM access grant bit. + * Return successful if access grant bit set, else clear the request for + * EEPROM access and return -E1000_ERR_NVM (-1). + **/ +static s32 e1000_acquire_nvm_i210(struct e1000_hw *hw) +{ + s32 ret_val; + + DEBUGFUNC("e1000_acquire_nvm_i210"); + + ret_val = e1000_acquire_swfw_sync_i210(hw, E1000_SWFW_EEP_SM); + + return ret_val; +} + +/** + * e1000_release_nvm_i210 - Release exclusive access to EEPROM + * @hw: pointer to the HW structure + * + * Stop any current commands to the EEPROM and clear the EEPROM request bit, + * then release the semaphores acquired. + **/ +static void e1000_release_nvm_i210(struct e1000_hw *hw) +{ + DEBUGFUNC("e1000_release_nvm_i210"); + + e1000_release_swfw_sync_i210(hw, E1000_SWFW_EEP_SM); +} + +/** + * e1000_acquire_swfw_sync_i210 - Acquire SW/FW semaphore + * @hw: pointer to the HW structure + * @mask: specifies which semaphore to acquire + * + * Acquire the SW/FW semaphore to access the PHY or NVM. The mask + * will also specify which port we're acquiring the lock for. + **/ +s32 e1000_acquire_swfw_sync_i210(struct e1000_hw *hw, u16 mask) +{ + u32 swfw_sync; + u32 swmask = mask; + u32 fwmask = mask << 16; + s32 ret_val = E1000_SUCCESS; + s32 i = 0, timeout = 200; /* FIXME: find real value to use here */ + + DEBUGFUNC("e1000_acquire_swfw_sync_i210"); + + while (i < timeout) { + if (e1000_get_hw_semaphore_i210(hw)) { + ret_val = -E1000_ERR_SWFW_SYNC; + goto out; + } + + swfw_sync = E1000_READ_REG(hw, E1000_SW_FW_SYNC); + if (!(swfw_sync & fwmask)) + break; + + /* + * Firmware currently using resource (fwmask) + */ + e1000_put_hw_semaphore_i210(hw); + msec_delay_irq(5); + i++; + } + + if (i == timeout) { + DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n"); + ret_val = -E1000_ERR_SWFW_SYNC; + goto out; + } + + swfw_sync |= swmask; + E1000_WRITE_REG(hw, E1000_SW_FW_SYNC, swfw_sync); + + e1000_put_hw_semaphore_i210(hw); + +out: + return ret_val; +} + +/** + * e1000_release_swfw_sync_i210 - Release SW/FW semaphore + * @hw: pointer to the HW structure + * @mask: specifies which semaphore to acquire + * + * Release the SW/FW semaphore used to access the PHY or NVM. The mask + * will also specify which port we're releasing the lock for. + **/ +void e1000_release_swfw_sync_i210(struct e1000_hw *hw, u16 mask) +{ + u32 swfw_sync; + + DEBUGFUNC("e1000_release_swfw_sync_i210"); + + while (e1000_get_hw_semaphore_i210(hw) != E1000_SUCCESS) + ; /* Empty */ + + swfw_sync = E1000_READ_REG(hw, E1000_SW_FW_SYNC); + swfw_sync &= ~mask; + E1000_WRITE_REG(hw, E1000_SW_FW_SYNC, swfw_sync); + + e1000_put_hw_semaphore_i210(hw); +} + +/** + * e1000_get_hw_semaphore_i210 - Acquire hardware semaphore + * @hw: pointer to the HW structure + * + * Acquire the HW semaphore to access the PHY or NVM + **/ +static s32 e1000_get_hw_semaphore_i210(struct e1000_hw *hw) +{ + u32 swsm; + s32 ret_val = E1000_SUCCESS; + s32 timeout = hw->nvm.word_size + 1; + s32 i = 0; + + DEBUGFUNC("e1000_get_hw_semaphore_i210"); + + /* Get the FW semaphore. */ + for (i = 0; i < timeout; i++) { + swsm = E1000_READ_REG(hw, E1000_SWSM); + E1000_WRITE_REG(hw, E1000_SWSM, swsm | E1000_SWSM_SWESMBI); + + /* Semaphore acquired if bit latched */ + if (E1000_READ_REG(hw, E1000_SWSM) & E1000_SWSM_SWESMBI) + break; + + usec_delay(50); + } + + if (i == timeout) { + /* Release semaphores */ + e1000_put_hw_semaphore_generic(hw); + DEBUGOUT("Driver can't access the NVM\n"); + ret_val = -E1000_ERR_NVM; + goto out; + } + +out: + return ret_val; +} + +/** + * e1000_put_hw_semaphore_i210 - Release hardware semaphore + * @hw: pointer to the HW structure + * + * Release hardware semaphore used to access the PHY or NVM + **/ +static void e1000_put_hw_semaphore_i210(struct e1000_hw *hw) +{ + u32 swsm; + + DEBUGFUNC("e1000_put_hw_semaphore_i210"); + + swsm = E1000_READ_REG(hw, E1000_SWSM); + + swsm &= ~E1000_SWSM_SWESMBI; + + E1000_WRITE_REG(hw, E1000_SWSM, swsm); +} + +/** + * e1000_read_nvm_srrd_i210 - Reads Shadow Ram using EERD register + * @hw: pointer to the HW structure + * @offset: offset of word in the Shadow Ram to read + * @words: number of words to read + * @data: word read from the Shadow Ram + * + * Reads a 16 bit word from the Shadow Ram using the EERD register. + * Uses necessary synchronization semaphores. + **/ +s32 e1000_read_nvm_srrd_i210(struct e1000_hw *hw, u16 offset, u16 words, + u16 *data) +{ + s32 status = E1000_SUCCESS; + u16 i, count; + + DEBUGFUNC("e1000_read_nvm_srrd_i210"); + + /* We cannot hold synchronization semaphores for too long, + * because of forceful takeover procedure. However it is more efficient + * to read in bursts than synchronizing access for each word. */ + for (i = 0; i < words; i += E1000_EERD_EEWR_MAX_COUNT) { + count = (words - i) / E1000_EERD_EEWR_MAX_COUNT > 0 ? + E1000_EERD_EEWR_MAX_COUNT : (words - i); + if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) { + status = e1000_read_nvm_eerd(hw, offset, count, + data + i); + hw->nvm.ops.release(hw); + } else { + status = E1000_ERR_SWFW_SYNC; + } + + if (status != E1000_SUCCESS) + break; + } + + return status; +} + +/** + * e1000_write_nvm_srwr_i210 - Write to Shadow RAM using EEWR + * @hw: pointer to the HW structure + * @offset: offset within the Shadow RAM to be written to + * @words: number of words to write + * @data: 16 bit word(s) to be written to the Shadow RAM + * + * Writes data to Shadow RAM at offset using EEWR register. + * + * If e1000_update_nvm_checksum is not called after this function , the + * data will not be committed to FLASH and also Shadow RAM will most likely + * contain an invalid checksum. + * + * If error code is returned, data and Shadow RAM may be inconsistent - buffer + * partially written. + **/ +s32 e1000_write_nvm_srwr_i210(struct e1000_hw *hw, u16 offset, u16 words, + u16 *data) +{ + s32 status = E1000_SUCCESS; + u16 i, count; + + DEBUGFUNC("e1000_write_nvm_srwr_i210"); + + /* We cannot hold synchronization semaphores for too long, + * because of forceful takeover procedure. However it is more efficient + * to write in bursts than synchronizing access for each word. */ + for (i = 0; i < words; i += E1000_EERD_EEWR_MAX_COUNT) { + count = (words - i) / E1000_EERD_EEWR_MAX_COUNT > 0 ? + E1000_EERD_EEWR_MAX_COUNT : (words - i); + if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) { + status = e1000_write_nvm_srwr(hw, offset, count, + data + i); + hw->nvm.ops.release(hw); + } else { + status = E1000_ERR_SWFW_SYNC; + } + + if (status != E1000_SUCCESS) + break; + } + + return status; +} + +/** + * e1000_write_nvm_srwr - Write to Shadow Ram using EEWR + * @hw: pointer to the HW structure + * @offset: offset within the Shadow Ram to be written to + * @words: number of words to write + * @data: 16 bit word(s) to be written to the Shadow Ram + * + * Writes data to Shadow Ram at offset using EEWR register. + * + * If e1000_update_nvm_checksum is not called after this function , the + * Shadow Ram will most likely contain an invalid checksum. + **/ +static s32 e1000_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words, + u16 *data) +{ + struct e1000_nvm_info *nvm = &hw->nvm; + u32 i, k, eewr = 0; + u32 attempts = 100000; + s32 ret_val = E1000_SUCCESS; + + DEBUGFUNC("e1000_write_nvm_srwr"); + + /* + * A check for invalid values: offset too large, too many words, + * too many words for the offset, and not enough words. + */ + if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || + (words == 0)) { + DEBUGOUT("nvm parameter(s) out of bounds\n"); + ret_val = -E1000_ERR_NVM; + goto out; + } + + for (i = 0; i < words; i++) { + eewr = ((offset+i) << E1000_NVM_RW_ADDR_SHIFT) | + (data[i] << E1000_NVM_RW_REG_DATA) | + E1000_NVM_RW_REG_START; + + E1000_WRITE_REG(hw, E1000_SRWR, eewr); + + for (k = 0; k < attempts; k++) { + if (E1000_NVM_RW_REG_DONE & + E1000_READ_REG(hw, E1000_SRWR)) { + ret_val = E1000_SUCCESS; + break; + } + usec_delay(5); + } + + if (ret_val != E1000_SUCCESS) { + DEBUGOUT("Shadow RAM write EEWR timed out\n"); + break; + } + } + +out: + return ret_val; +} + +/** + * e1000_read_nvm_i211 - Read NVM wrapper function for I211 + * @hw: pointer to the HW structure + * @address: the word address (aka eeprom offset) to read + * @data: pointer to the data read + * + * Wrapper function to return data formerly found in the NVM. + **/ +static s32 e1000_read_nvm_i211(struct e1000_hw *hw, u16 offset, u16 words, + u16 *data) +{ + s32 ret_val = E1000_SUCCESS; + + DEBUGFUNC("e1000_read_nvm_i211"); + + /* Only the MAC addr is required to be present in the iNVM */ + switch (offset) { + case NVM_MAC_ADDR: + ret_val = e1000_read_invm_i211(hw, (u8)offset, &data[0]); + ret_val |= e1000_read_invm_i211(hw, (u8)offset+1, &data[1]); + ret_val |= e1000_read_invm_i211(hw, (u8)offset+2, &data[2]); + if (ret_val != E1000_SUCCESS) + DEBUGOUT("MAC Addr not found in iNVM\n"); + break; + case NVM_ID_LED_SETTINGS: + case NVM_INIT_CTRL_2: + case NVM_INIT_CTRL_4: + case NVM_LED_1_CFG: + case NVM_LED_0_2_CFG: + e1000_read_invm_i211(hw, (u8)offset, data); + break; + case NVM_COMPAT: + *data = ID_LED_DEFAULT_I210; + break; + case NVM_SUB_DEV_ID: + *data = hw->subsystem_device_id; + break; + case NVM_SUB_VEN_ID: + *data = hw->subsystem_vendor_id; + break; + case NVM_DEV_ID: + *data = hw->device_id; + break; + case NVM_VEN_ID: + *data = hw->vendor_id; + break; + default: + DEBUGOUT1("NVM word 0x%02x is not mapped.\n", offset); + *data = NVM_RESERVED_WORD; + break; + } + return ret_val; +} + +/** + * e1000_read_invm_i211 - Reads OTP + * @hw: pointer to the HW structure + * @address: the word address (aka eeprom offset) to read + * @data: pointer to the data read + * + * Reads 16-bit words from the OTP. Return error when the word is not + * stored in OTP. + **/ +s32 e1000_read_invm_i211(struct e1000_hw *hw, u8 address, u16 *data) +{ + s32 status = -E1000_ERR_INVM_VALUE_NOT_FOUND; + u32 invm_dword; + u16 i; + u8 record_type, word_address; + + DEBUGFUNC("e1000_read_invm_i211"); + + for (i = 0; i < E1000_INVM_SIZE; i++) { + invm_dword = E1000_READ_REG(hw, E1000_INVM_DATA_REG(i)); + /* Get record type */ + record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword); + if (record_type == E1000_INVM_UNINITIALIZED_STRUCTURE) + break; + if (record_type == E1000_INVM_CSR_AUTOLOAD_STRUCTURE) + i += E1000_INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS; + if (record_type == E1000_INVM_RSA_KEY_SHA256_STRUCTURE) + i += E1000_INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS; + if (record_type == E1000_INVM_WORD_AUTOLOAD_STRUCTURE) { + word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword); + if (word_address == address) { + *data = INVM_DWORD_TO_WORD_DATA(invm_dword); + DEBUGOUT2("Read INVM Word 0x%02x = %x", + address, *data); + status = E1000_SUCCESS; + break; + } + } + } + if (status != E1000_SUCCESS) + DEBUGOUT1("Requested word 0x%02x not found in OTP\n", address); + return status; +} + +/** + * e1000_validate_nvm_checksum_i210 - Validate EEPROM checksum + * @hw: pointer to the HW structure + * + * Calculates the EEPROM checksum by reading/adding each word of the EEPROM + * and then verifies that the sum of the EEPROM is equal to 0xBABA. + **/ +s32 e1000_validate_nvm_checksum_i210(struct e1000_hw *hw) +{ + s32 status = E1000_SUCCESS; + s32 (*read_op_ptr)(struct e1000_hw *, u16, u16, u16 *); + + DEBUGFUNC("e1000_validate_nvm_checksum_i210"); + + if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) { + + /* + * Replace the read function with semaphore grabbing with + * the one that skips this for a while. + * We have semaphore taken already here. + */ + read_op_ptr = hw->nvm.ops.read; + hw->nvm.ops.read = e1000_read_nvm_eerd; + + status = e1000_validate_nvm_checksum_generic(hw); + + /* Revert original read operation. */ + hw->nvm.ops.read = read_op_ptr; + + hw->nvm.ops.release(hw); + } else { + status = E1000_ERR_SWFW_SYNC; + } + + return status; +} + + +/** + * e1000_update_nvm_checksum_i210 - Update EEPROM checksum + * @hw: pointer to the HW structure + * + * Updates the EEPROM checksum by reading/adding each word of the EEPROM + * up to the checksum. Then calculates the EEPROM checksum and writes the + * value to the EEPROM. Next commit EEPROM data onto the Flash. + **/ +s32 e1000_update_nvm_checksum_i210(struct e1000_hw *hw) +{ + s32 ret_val = E1000_SUCCESS; + u16 checksum = 0; + u16 i, nvm_data; + + DEBUGFUNC("e1000_update_nvm_checksum_i210"); + + /* + * Read the first word from the EEPROM. If this times out or fails, do + * not continue or we could be in for a very long wait while every + * EEPROM read fails + */ + ret_val = e1000_read_nvm_eerd(hw, 0, 1, &nvm_data); + if (ret_val != E1000_SUCCESS) { + DEBUGOUT("EEPROM read failed\n"); + goto out; + } + + if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) { + /* + * Do not use hw->nvm.ops.write, hw->nvm.ops.read + * because we do not want to take the synchronization + * semaphores twice here. + */ + + for (i = 0; i < NVM_CHECKSUM_REG; i++) { + ret_val = e1000_read_nvm_eerd(hw, i, 1, &nvm_data); + if (ret_val) { + hw->nvm.ops.release(hw); + DEBUGOUT("NVM Read Error while updating checksum.\n"); + goto out; + } + checksum += nvm_data; + } + checksum = (u16) NVM_SUM - checksum; + ret_val = e1000_write_nvm_srwr(hw, NVM_CHECKSUM_REG, 1, + &checksum); + if (ret_val != E1000_SUCCESS) { + hw->nvm.ops.release(hw); + DEBUGOUT("NVM Write Error while updating checksum.\n"); + goto out; + } + + hw->nvm.ops.release(hw); + + ret_val = e1000_update_flash_i210(hw); + } else { + ret_val = E1000_ERR_SWFW_SYNC; + } +out: + return ret_val; +} + +/** + * e1000_get_flash_presence_i210 - Check if flash device is detected. + * @hw: pointer to the HW structure + * + **/ +static bool e1000_get_flash_presence_i210(struct e1000_hw *hw) +{ + u32 eec = 0; + bool ret_val = FALSE; + + DEBUGFUNC("e1000_get_flash_presence_i210"); + + eec = E1000_READ_REG(hw, E1000_EECD); + + if (eec & E1000_EECD_FLASH_DETECTED_I210) + ret_val = TRUE; + + return ret_val; +} + +/** + * e1000_update_flash_i210 - Commit EEPROM to the flash + * @hw: pointer to the HW structure + * + **/ +s32 e1000_update_flash_i210(struct e1000_hw *hw) +{ + s32 ret_val = E1000_SUCCESS; + u32 flup; + + DEBUGFUNC("e1000_update_flash_i210"); + + ret_val = e1000_pool_flash_update_done_i210(hw); + if (ret_val == -E1000_ERR_NVM) { + DEBUGOUT("Flash update time out\n"); + goto out; + } + + flup = E1000_READ_REG(hw, E1000_EECD) | E1000_EECD_FLUPD_I210; + E1000_WRITE_REG(hw, E1000_EECD, flup); + + ret_val = e1000_pool_flash_update_done_i210(hw); + if (ret_val == E1000_SUCCESS) + DEBUGOUT("Flash update complete\n"); + else + DEBUGOUT("Flash update time out\n"); + +out: + return ret_val; +} + +/** + * e1000_pool_flash_update_done_i210 - Pool FLUDONE status. + * @hw: pointer to the HW structure + * + **/ +s32 e1000_pool_flash_update_done_i210(struct e1000_hw *hw) +{ + s32 ret_val = -E1000_ERR_NVM; + u32 i, reg; + + DEBUGFUNC("e1000_pool_flash_update_done_i210"); + + for (i = 0; i < E1000_FLUDONE_ATTEMPTS; i++) { + reg = E1000_READ_REG(hw, E1000_EECD); + if (reg & E1000_EECD_FLUDONE_I210) { + ret_val = E1000_SUCCESS; + break; + } + usec_delay(5); + } + + return ret_val; +} + +/** + * e1000_init_nvm_params_i210 - Initialize i210 NVM function pointers + * @hw: pointer to the HW structure + * + * Initialize the i210 NVM parameters and function pointers. + **/ +static s32 e1000_init_nvm_params_i210(struct e1000_hw *hw) +{ + s32 ret_val = E1000_SUCCESS; + struct e1000_nvm_info *nvm = &hw->nvm; + + DEBUGFUNC("e1000_init_nvm_params_i210"); + + ret_val = e1000_init_nvm_params_82575(hw); + + nvm->ops.acquire = e1000_acquire_nvm_i210; + nvm->ops.release = e1000_release_nvm_i210; + nvm->ops.read = e1000_read_nvm_srrd_i210; + nvm->ops.write = e1000_write_nvm_srwr_i210; + nvm->ops.valid_led_default = e1000_valid_led_default_i210; + nvm->ops.validate = e1000_validate_nvm_checksum_i210; + nvm->ops.update = e1000_update_nvm_checksum_i210; + + return ret_val; +} + +/** + * e1000_init_nvm_params_i211 - Initialize i211 NVM function pointers + * @hw: pointer to the HW structure + * + * Initialize the NVM parameters and function pointers for i211. + **/ +static s32 e1000_init_nvm_params_i211(struct e1000_hw *hw) +{ + struct e1000_nvm_info *nvm = &hw->nvm; + + DEBUGFUNC("e1000_init_nvm_params_i211"); + + nvm->ops.acquire = e1000_acquire_nvm_i210; + nvm->ops.release = e1000_release_nvm_i210; + nvm->ops.read = e1000_read_nvm_i211; + nvm->ops.valid_led_default = e1000_valid_led_default_i210; + nvm->ops.write = e1000_null_write_nvm; + nvm->ops.validate = e1000_null_ops_generic; + nvm->ops.update = e1000_null_ops_generic; + + return E1000_SUCCESS; +} + +/** + * e1000_init_function_pointers_i210 - Init func ptrs. + * @hw: pointer to the HW structure + * + * Called to initialize all function pointers and parameters. + **/ +void e1000_init_function_pointers_i210(struct e1000_hw *hw) +{ + e1000_init_function_pointers_82575(hw); + + switch (hw->mac.type) { + case e1000_i210: + if (e1000_get_flash_presence_i210(hw)) + hw->nvm.ops.init_params = e1000_init_nvm_params_i210; + else + hw->nvm.ops.init_params = e1000_init_nvm_params_i211; + break; + case e1000_i211: + hw->nvm.ops.init_params = e1000_init_nvm_params_i211; + break; + default: + break; + } + return; +} + +/** + * e1000_valid_led_default_i210 - Verify a valid default LED config + * @hw: pointer to the HW structure + * @data: pointer to the NVM (EEPROM) + * + * Read the EEPROM for the current default LED configuration. If the + * LED configuration is not valid, set to a valid LED configuration. + **/ +static s32 e1000_valid_led_default_i210(struct e1000_hw *hw, u16 *data) +{ + s32 ret_val; + + DEBUGFUNC("e1000_valid_led_default_i210"); + + ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data); + if (ret_val) { + DEBUGOUT("NVM Read Error\n"); + goto out; + } + + if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF) { + switch (hw->phy.media_type) { + case e1000_media_type_internal_serdes: + *data = ID_LED_DEFAULT_I210_SERDES; + break; + case e1000_media_type_copper: + default: + *data = ID_LED_DEFAULT_I210; + break; + } + } +out: + return ret_val; +} diff --git a/sys/dev/e1000/e1000_i210.h b/sys/dev/e1000/e1000_i210.h new file mode 100644 index 00000000000..a0cd93576d5 --- /dev/null +++ b/sys/dev/e1000/e1000_i210.h @@ -0,0 +1,80 @@ +/****************************************************************************** + + Copyright (c) 2001-2012, Intel Corporation + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +******************************************************************************/ +/*$FreeBSD$*/ + +#ifndef _E1000_I210_H_ +#define _E1000_I210_H_ + +s32 e1000_update_flash_i210(struct e1000_hw *hw); +s32 e1000_update_nvm_checksum_i210(struct e1000_hw *hw); +s32 e1000_validate_nvm_checksum_i210(struct e1000_hw *hw); +s32 e1000_write_nvm_srwr_i210(struct e1000_hw *hw, u16 offset, + u16 words, u16 *data); +s32 e1000_read_nvm_srrd_i210(struct e1000_hw *hw, u16 offset, + u16 words, u16 *data); +s32 e1000_read_invm_i211(struct e1000_hw *hw, u8 address, u16 *data); +s32 e1000_check_for_copper_link_i210(struct e1000_hw *hw); +s32 e1000_set_ltr_i210(struct e1000_hw *hw, bool link); +s32 e1000_acquire_swfw_sync_i210(struct e1000_hw *hw, u16 mask); +void e1000_release_swfw_sync_i210(struct e1000_hw *hw, u16 mask); + +#define E1000_STM_OPCODE 0xDB00 +#define E1000_EEPROM_FLASH_SIZE_WORD 0x11 + +#define INVM_DWORD_TO_RECORD_TYPE(invm_dword) \ + (u8)((invm_dword) & 0x7) +#define INVM_DWORD_TO_WORD_ADDRESS(invm_dword) \ + (u8)(((invm_dword) & 0x0000FE00) >> 9) +#define INVM_DWORD_TO_WORD_DATA(invm_dword) \ + (u16)(((invm_dword) & 0xFFFF0000) >> 16) + +enum E1000_INVM_STRUCTURE_TYPE { + E1000_INVM_UNINITIALIZED_STRUCTURE = 0x00, + E1000_INVM_WORD_AUTOLOAD_STRUCTURE = 0x01, + E1000_INVM_CSR_AUTOLOAD_STRUCTURE = 0x02, + E1000_INVM_PHY_REGISTER_AUTOLOAD_STRUCTURE = 0x03, + E1000_INVM_RSA_KEY_SHA256_STRUCTURE = 0x04, + E1000_INVM_INVALIDATED_STRUCTURE = 0x0F, +}; + +#define E1000_INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS 8 +#define E1000_INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS 1 + +#define ID_LED_DEFAULT_I210 ((ID_LED_OFF1_ON2 << 8) | \ + (ID_LED_DEF1_DEF2 << 4) | \ + (ID_LED_OFF1_OFF2)) +#define ID_LED_DEFAULT_I210_SERDES ((ID_LED_DEF1_DEF2 << 8) | \ + (ID_LED_DEF1_DEF2 << 4) | \ + (ID_LED_DEF1_DEF2)) + +#endif diff --git a/sys/dev/e1000/e1000_ich8lan.c b/sys/dev/e1000/e1000_ich8lan.c index aa4802c3f86..98aefc4fc0b 100644 --- a/sys/dev/e1000/e1000_ich8lan.c +++ b/sys/dev/e1000/e1000_ich8lan.c @@ -738,7 +738,7 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw) * of MAC speed/duplex configuration. So we only need to * configure Collision Distance in the MAC. */ - e1000_config_collision_dist_generic(hw); + hw->mac.ops.config_collision_dist(hw); /* * Configure Flow Control now that Auto-Neg has completed. diff --git a/sys/dev/e1000/e1000_mac.c b/sys/dev/e1000/e1000_mac.c index 4fc2a7c2262..95d6873b13f 100644 --- a/sys/dev/e1000/e1000_mac.c +++ b/sys/dev/e1000/e1000_mac.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2011, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -36,6 +36,8 @@ static s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw); static void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw); +static void e1000_config_collision_dist_generic(struct e1000_hw *hw); +static void e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index); /** * e1000_init_mac_ops_generic - Initialize MAC function pointers @@ -395,30 +397,30 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw) ret_val = hw->nvm.ops.read(hw, NVM_COMPAT, 1, &nvm_data); if (ret_val) - goto out; + return ret_val; /* not supported on older hardware or 82573 */ if ((hw->mac.type < e1000_82571) || (hw->mac.type == e1000_82573)) - goto out; + return E1000_SUCCESS; /* * Alternate MAC address is handled by the option ROM for 82580 * and newer. SW support not required. */ if (hw->mac.type >= e1000_82580) - goto out; + return E1000_SUCCESS; ret_val = hw->nvm.ops.read(hw, NVM_ALT_MAC_ADDR_PTR, 1, &nvm_alt_mac_addr_offset); if (ret_val) { DEBUGOUT("NVM Read Error\n"); - goto out; + return ret_val; } if ((nvm_alt_mac_addr_offset == 0xFFFF) || (nvm_alt_mac_addr_offset == 0x0000)) /* There is no Alternate MAC Address */ - goto out; + return E1000_SUCCESS; if (hw->bus.func == E1000_FUNC_1) nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN1; @@ -432,7 +434,7 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw) ret_val = hw->nvm.ops.read(hw, offset, 1, &nvm_data); if (ret_val) { DEBUGOUT("NVM Read Error\n"); - goto out; + return ret_val; } alt_mac_addr[i] = (u8)(nvm_data & 0xFF); @@ -442,7 +444,7 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw) /* if multicast bit is set, the alternate address will not be used */ if (alt_mac_addr[0] & 0x01) { DEBUGOUT("Ignoring Alternate Mac Address with MC bit set\n"); - goto out; + return E1000_SUCCESS; } /* @@ -452,8 +454,7 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw) */ hw->mac.ops.rar_set(hw, alt_mac_addr, 0); -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -465,7 +466,7 @@ out: * Sets the receive address array register at index to the address passed * in by addr. **/ -void e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index) +static void e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index) { u32 rar_low, rar_high; @@ -495,43 +496,6 @@ void e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index) E1000_WRITE_FLUSH(hw); } -/** - * e1000_update_mc_addr_list_generic - Update Multicast addresses - * @hw: pointer to the HW structure - * @mc_addr_list: array of multicast addresses to program - * @mc_addr_count: number of multicast addresses to program - * - * Updates entire Multicast Table Array. - * The caller must have a packed mc_addr_list of multicast addresses. - **/ -void e1000_update_mc_addr_list_generic(struct e1000_hw *hw, - u8 *mc_addr_list, u32 mc_addr_count) -{ - u32 hash_value, hash_bit, hash_reg; - int i; - - DEBUGFUNC("e1000_update_mc_addr_list_generic"); - - /* clear mta_shadow */ - memset(&hw->mac.mta_shadow, 0, sizeof(hw->mac.mta_shadow)); - - /* update mta_shadow from mc_addr_list */ - for (i = 0; (u32) i < mc_addr_count; i++) { - hash_value = e1000_hash_mc_addr_generic(hw, mc_addr_list); - - hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1); - hash_bit = hash_value & 0x1F; - - hw->mac.mta_shadow[hash_reg] |= (1 << hash_bit); - mc_addr_list += (ETH_ADDR_LEN); - } - - /* replace the entire MTA table */ - for (i = hw->mac.mta_reg_count - 1; i >= 0; i--) - E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, hw->mac.mta_shadow[i]); - E1000_WRITE_FLUSH(hw); -} - /** * e1000_hash_mc_addr_generic - Generate a multicast hash value * @hw: pointer to the HW structure @@ -604,6 +568,43 @@ u32 e1000_hash_mc_addr_generic(struct e1000_hw *hw, u8 *mc_addr) return hash_value; } +/** + * e1000_update_mc_addr_list_generic - Update Multicast addresses + * @hw: pointer to the HW structure + * @mc_addr_list: array of multicast addresses to program + * @mc_addr_count: number of multicast addresses to program + * + * Updates entire Multicast Table Array. + * The caller must have a packed mc_addr_list of multicast addresses. + **/ +void e1000_update_mc_addr_list_generic(struct e1000_hw *hw, + u8 *mc_addr_list, u32 mc_addr_count) +{ + u32 hash_value, hash_bit, hash_reg; + int i; + + DEBUGFUNC("e1000_update_mc_addr_list_generic"); + + /* clear mta_shadow */ + memset(&hw->mac.mta_shadow, 0, sizeof(hw->mac.mta_shadow)); + + /* update mta_shadow from mc_addr_list */ + for (i = 0; (u32) i < mc_addr_count; i++) { + hash_value = e1000_hash_mc_addr_generic(hw, mc_addr_list); + + hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1); + hash_bit = hash_value & 0x1F; + + hw->mac.mta_shadow[hash_reg] |= (1 << hash_bit); + mc_addr_list += (ETH_ADDR_LEN); + } + + /* replace the entire MTA table */ + for (i = hw->mac.mta_reg_count - 1; i >= 0; i--) + E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, hw->mac.mta_shadow[i]); + E1000_WRITE_FLUSH(hw); +} + /** * e1000_pcix_mmrbc_workaround_generic - Fix incorrect MMRBC value * @hw: pointer to the HW structure @@ -712,10 +713,8 @@ s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw) * get_link_status flag is set upon receiving a Link Status * Change or Rx Sequence Error interrupt. */ - if (!mac->get_link_status) { - ret_val = E1000_SUCCESS; - goto out; - } + if (!mac->get_link_status) + return E1000_SUCCESS; /* * First we want to see if the MII Status Register reports @@ -724,10 +723,10 @@ s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw) */ ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); if (ret_val) - goto out; + return ret_val; if (!link) - goto out; /* No link detected */ + return E1000_SUCCESS; /* No link detected */ mac->get_link_status = FALSE; @@ -741,10 +740,8 @@ s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw) * If we are forcing speed/duplex, then we simply return since * we have already determined whether we have link or not. */ - if (!mac->autoneg) { - ret_val = -E1000_ERR_CONFIG; - goto out; - } + if (!mac->autoneg) + return -E1000_ERR_CONFIG; /* * Auto-Neg is enabled. Auto Speed Detection takes care @@ -763,7 +760,6 @@ s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw) if (ret_val) DEBUGOUT("Error configuring flow control\n"); -out: return ret_val; } @@ -780,7 +776,7 @@ s32 e1000_check_for_fiber_link_generic(struct e1000_hw *hw) u32 rxcw; u32 ctrl; u32 status; - s32 ret_val = E1000_SUCCESS; + s32 ret_val; DEBUGFUNC("e1000_check_for_fiber_link_generic"); @@ -797,11 +793,11 @@ s32 e1000_check_for_fiber_link_generic(struct e1000_hw *hw) * was just plugged in. The autoneg_failed flag does this. */ /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */ - if ((ctrl & E1000_CTRL_SWDPIN1) && (!(status & E1000_STATUS_LU)) && - (!(rxcw & E1000_RXCW_C))) { - if (mac->autoneg_failed == 0) { - mac->autoneg_failed = 1; - goto out; + if ((ctrl & E1000_CTRL_SWDPIN1) && !(status & E1000_STATUS_LU) && + !(rxcw & E1000_RXCW_C)) { + if (!mac->autoneg_failed) { + mac->autoneg_failed = TRUE; + return E1000_SUCCESS; } DEBUGOUT("NOT Rx'ing /C/, disable AutoNeg and force link.\n"); @@ -817,7 +813,7 @@ s32 e1000_check_for_fiber_link_generic(struct e1000_hw *hw) ret_val = e1000_config_fc_after_link_up_generic(hw); if (ret_val) { DEBUGOUT("Error configuring flow control\n"); - goto out; + return ret_val; } } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { /* @@ -833,8 +829,7 @@ s32 e1000_check_for_fiber_link_generic(struct e1000_hw *hw) mac->serdes_has_link = TRUE; } -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -850,7 +845,7 @@ s32 e1000_check_for_serdes_link_generic(struct e1000_hw *hw) u32 rxcw; u32 ctrl; u32 status; - s32 ret_val = E1000_SUCCESS; + s32 ret_val; DEBUGFUNC("e1000_check_for_serdes_link_generic"); @@ -866,10 +861,10 @@ s32 e1000_check_for_serdes_link_generic(struct e1000_hw *hw) * time to complete. */ /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */ - if ((!(status & E1000_STATUS_LU)) && (!(rxcw & E1000_RXCW_C))) { - if (mac->autoneg_failed == 0) { - mac->autoneg_failed = 1; - goto out; + if (!(status & E1000_STATUS_LU) && !(rxcw & E1000_RXCW_C)) { + if (!mac->autoneg_failed) { + mac->autoneg_failed = TRUE; + return E1000_SUCCESS; } DEBUGOUT("NOT Rx'ing /C/, disable AutoNeg and force link.\n"); @@ -885,7 +880,7 @@ s32 e1000_check_for_serdes_link_generic(struct e1000_hw *hw) ret_val = e1000_config_fc_after_link_up_generic(hw); if (ret_val) { DEBUGOUT("Error configuring flow control\n"); - goto out; + return ret_val; } } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { /* @@ -943,8 +938,48 @@ s32 e1000_check_for_serdes_link_generic(struct e1000_hw *hw) } } -out: - return ret_val; + return E1000_SUCCESS; +} + +/** + * e1000_set_default_fc_generic - Set flow control default values + * @hw: pointer to the HW structure + * + * Read the EEPROM for the default values for flow control and store the + * values. + **/ +s32 e1000_set_default_fc_generic(struct e1000_hw *hw) +{ + s32 ret_val; + u16 nvm_data; + + DEBUGFUNC("e1000_set_default_fc_generic"); + + /* + * Read and store word 0x0F of the EEPROM. This word contains bits + * that determine the hardware's default PAUSE (flow control) mode, + * a bit that determines whether the HW defaults to enabling or + * disabling auto-negotiation, and the direction of the + * SW defined pins. If there is no SW over-ride of the flow + * control setting, then the variable hw->fc will + * be initialized based on a value in the EEPROM. + */ + ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG, 1, &nvm_data); + + if (ret_val) { + DEBUGOUT("NVM Read Error\n"); + return ret_val; + } + + if (!(nvm_data & NVM_WORD0F_PAUSE_MASK)) + hw->fc.requested_mode = e1000_fc_none; + else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == + NVM_WORD0F_ASM_DIR) + hw->fc.requested_mode = e1000_fc_tx_pause; + else + hw->fc.requested_mode = e1000_fc_full; + + return E1000_SUCCESS; } /** @@ -959,7 +994,7 @@ out: **/ s32 e1000_setup_link_generic(struct e1000_hw *hw) { - s32 ret_val = E1000_SUCCESS; + s32 ret_val; DEBUGFUNC("e1000_setup_link_generic"); @@ -967,8 +1002,8 @@ s32 e1000_setup_link_generic(struct e1000_hw *hw) * In the case of the phy reset being blocked, we already have a link. * We do not need to set it up again. */ - if (e1000_check_reset_block(hw)) - goto out; + if (hw->phy.ops.check_reset_block && hw->phy.ops.check_reset_block(hw)) + return E1000_SUCCESS; /* * If requested flow control is set to default, set flow control @@ -977,7 +1012,7 @@ s32 e1000_setup_link_generic(struct e1000_hw *hw) if (hw->fc.requested_mode == e1000_fc_default) { ret_val = e1000_set_default_fc_generic(hw); if (ret_val) - goto out; + return ret_val; } /* @@ -992,7 +1027,7 @@ s32 e1000_setup_link_generic(struct e1000_hw *hw) /* Call the necessary media_type subroutine to configure the link. */ ret_val = hw->mac.ops.setup_physical_interface(hw); if (ret_val) - goto out; + return ret_val; /* * Initialize the flow control address, type, and PAUSE timer @@ -1007,139 +1042,7 @@ s32 e1000_setup_link_generic(struct e1000_hw *hw) E1000_WRITE_REG(hw, E1000_FCTTV, hw->fc.pause_time); - ret_val = e1000_set_fc_watermarks_generic(hw); - -out: - return ret_val; -} - -/** - * e1000_setup_fiber_serdes_link_generic - Setup link for fiber/serdes - * @hw: pointer to the HW structure - * - * Configures collision distance and flow control for fiber and serdes - * links. Upon successful setup, poll for link. - **/ -s32 e1000_setup_fiber_serdes_link_generic(struct e1000_hw *hw) -{ - struct e1000_mac_info *mac = &hw->mac; - u32 ctrl; - s32 ret_val = E1000_SUCCESS; - - DEBUGFUNC("e1000_setup_fiber_serdes_link_generic"); - - ctrl = E1000_READ_REG(hw, E1000_CTRL); - - /* Take the link out of reset */ - ctrl &= ~E1000_CTRL_LRST; - - mac->ops.config_collision_dist(hw); - - ret_val = e1000_commit_fc_settings_generic(hw); - if (ret_val) - goto out; - - /* - * Since auto-negotiation is enabled, take the link out of reset (the - * link will be in reset, because we previously reset the chip). This - * will restart auto-negotiation. If auto-negotiation is successful - * then the link-up status bit will be set and the flow control enable - * bits (RFCE and TFCE) will be set according to their negotiated value. - */ - DEBUGOUT("Auto-negotiation enabled\n"); - - E1000_WRITE_REG(hw, E1000_CTRL, ctrl); - E1000_WRITE_FLUSH(hw); - msec_delay(1); - - /* - * For these adapters, the SW definable pin 1 is set when the optics - * detect a signal. If we have a signal, then poll for a "Link-Up" - * indication. - */ - if (hw->phy.media_type == e1000_media_type_internal_serdes || - (E1000_READ_REG(hw, E1000_CTRL) & E1000_CTRL_SWDPIN1)) { - ret_val = e1000_poll_fiber_serdes_link_generic(hw); - } else { - DEBUGOUT("No signal detected\n"); - } - -out: - return ret_val; -} - -/** - * e1000_config_collision_dist_generic - Configure collision distance - * @hw: pointer to the HW structure - * - * Configures the collision distance to the default value and is used - * during link setup. - **/ -void e1000_config_collision_dist_generic(struct e1000_hw *hw) -{ - u32 tctl; - - DEBUGFUNC("e1000_config_collision_dist_generic"); - - tctl = E1000_READ_REG(hw, E1000_TCTL); - - tctl &= ~E1000_TCTL_COLD; - tctl |= E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT; - - E1000_WRITE_REG(hw, E1000_TCTL, tctl); - E1000_WRITE_FLUSH(hw); -} - -/** - * e1000_poll_fiber_serdes_link_generic - Poll for link up - * @hw: pointer to the HW structure - * - * Polls for link up by reading the status register, if link fails to come - * up with auto-negotiation, then the link is forced if a signal is detected. - **/ -s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw) -{ - struct e1000_mac_info *mac = &hw->mac; - u32 i, status; - s32 ret_val = E1000_SUCCESS; - - DEBUGFUNC("e1000_poll_fiber_serdes_link_generic"); - - /* - * If we have a signal (the cable is plugged in, or assumed TRUE for - * serdes media) then poll for a "Link-Up" indication in the Device - * Status Register. Time-out if a link isn't seen in 500 milliseconds - * seconds (Auto-negotiation should complete in less than 500 - * milliseconds even if the other end is doing it in SW). - */ - for (i = 0; i < FIBER_LINK_UP_LIMIT; i++) { - msec_delay(10); - status = E1000_READ_REG(hw, E1000_STATUS); - if (status & E1000_STATUS_LU) - break; - } - if (i == FIBER_LINK_UP_LIMIT) { - DEBUGOUT("Never got a valid link from auto-neg!!!\n"); - mac->autoneg_failed = 1; - /* - * AutoNeg failed to achieve a link, so we'll call - * mac->check_for_link. This routine will force the - * link up if we detect a signal. This will allow us to - * communicate with non-autonegotiating link partners. - */ - ret_val = mac->ops.check_for_link(hw); - if (ret_val) { - DEBUGOUT("Error while checking for link\n"); - goto out; - } - mac->autoneg_failed = 0; - } else { - mac->autoneg_failed = 0; - DEBUGOUT("Valid Link Found\n"); - } - -out: - return ret_val; + return e1000_set_fc_watermarks_generic(hw); } /** @@ -1153,7 +1056,6 @@ s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw) { struct e1000_mac_info *mac = &hw->mac; u32 txcw; - s32 ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_commit_fc_settings_generic"); @@ -1206,18 +1108,142 @@ s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw) break; default: DEBUGOUT("Flow control param set incorrectly\n"); - ret_val = -E1000_ERR_CONFIG; - goto out; + return -E1000_ERR_CONFIG; break; } E1000_WRITE_REG(hw, E1000_TXCW, txcw); mac->txcw = txcw; -out: + return E1000_SUCCESS; +} + +/** + * e1000_poll_fiber_serdes_link_generic - Poll for link up + * @hw: pointer to the HW structure + * + * Polls for link up by reading the status register, if link fails to come + * up with auto-negotiation, then the link is forced if a signal is detected. + **/ +s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw) +{ + struct e1000_mac_info *mac = &hw->mac; + u32 i, status; + s32 ret_val; + + DEBUGFUNC("e1000_poll_fiber_serdes_link_generic"); + + /* + * If we have a signal (the cable is plugged in, or assumed TRUE for + * serdes media) then poll for a "Link-Up" indication in the Device + * Status Register. Time-out if a link isn't seen in 500 milliseconds + * seconds (Auto-negotiation should complete in less than 500 + * milliseconds even if the other end is doing it in SW). + */ + for (i = 0; i < FIBER_LINK_UP_LIMIT; i++) { + msec_delay(10); + status = E1000_READ_REG(hw, E1000_STATUS); + if (status & E1000_STATUS_LU) + break; + } + if (i == FIBER_LINK_UP_LIMIT) { + DEBUGOUT("Never got a valid link from auto-neg!!!\n"); + mac->autoneg_failed = TRUE; + /* + * AutoNeg failed to achieve a link, so we'll call + * mac->check_for_link. This routine will force the + * link up if we detect a signal. This will allow us to + * communicate with non-autonegotiating link partners. + */ + ret_val = mac->ops.check_for_link(hw); + if (ret_val) { + DEBUGOUT("Error while checking for link\n"); + return ret_val; + } + mac->autoneg_failed = FALSE; + } else { + mac->autoneg_failed = FALSE; + DEBUGOUT("Valid Link Found\n"); + } + + return E1000_SUCCESS; +} + +/** + * e1000_setup_fiber_serdes_link_generic - Setup link for fiber/serdes + * @hw: pointer to the HW structure + * + * Configures collision distance and flow control for fiber and serdes + * links. Upon successful setup, poll for link. + **/ +s32 e1000_setup_fiber_serdes_link_generic(struct e1000_hw *hw) +{ + u32 ctrl; + s32 ret_val; + + DEBUGFUNC("e1000_setup_fiber_serdes_link_generic"); + + ctrl = E1000_READ_REG(hw, E1000_CTRL); + + /* Take the link out of reset */ + ctrl &= ~E1000_CTRL_LRST; + + hw->mac.ops.config_collision_dist(hw); + + ret_val = e1000_commit_fc_settings_generic(hw); + if (ret_val) + return ret_val; + + /* + * Since auto-negotiation is enabled, take the link out of reset (the + * link will be in reset, because we previously reset the chip). This + * will restart auto-negotiation. If auto-negotiation is successful + * then the link-up status bit will be set and the flow control enable + * bits (RFCE and TFCE) will be set according to their negotiated value. + */ + DEBUGOUT("Auto-negotiation enabled\n"); + + E1000_WRITE_REG(hw, E1000_CTRL, ctrl); + E1000_WRITE_FLUSH(hw); + msec_delay(1); + + /* + * For these adapters, the SW definable pin 1 is set when the optics + * detect a signal. If we have a signal, then poll for a "Link-Up" + * indication. + */ + if (hw->phy.media_type == e1000_media_type_internal_serdes || + (E1000_READ_REG(hw, E1000_CTRL) & E1000_CTRL_SWDPIN1)) { + ret_val = e1000_poll_fiber_serdes_link_generic(hw); + } else { + DEBUGOUT("No signal detected\n"); + } + return ret_val; } +/** + * e1000_config_collision_dist_generic - Configure collision distance + * @hw: pointer to the HW structure + * + * Configures the collision distance to the default value and is used + * during link setup. + **/ +static void e1000_config_collision_dist_generic(struct e1000_hw *hw) +{ + u32 tctl; + + DEBUGFUNC("e1000_config_collision_dist_generic"); + + tctl = E1000_READ_REG(hw, E1000_TCTL); + + tctl &= ~E1000_TCTL_COLD; + tctl |= E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT; + + E1000_WRITE_REG(hw, E1000_TCTL, tctl); + E1000_WRITE_FLUSH(hw); +} + /** * e1000_set_fc_watermarks_generic - Set flow control high/low watermarks * @hw: pointer to the HW structure @@ -1257,48 +1283,6 @@ s32 e1000_set_fc_watermarks_generic(struct e1000_hw *hw) return E1000_SUCCESS; } -/** - * e1000_set_default_fc_generic - Set flow control default values - * @hw: pointer to the HW structure - * - * Read the EEPROM for the default values for flow control and store the - * values. - **/ -s32 e1000_set_default_fc_generic(struct e1000_hw *hw) -{ - s32 ret_val = E1000_SUCCESS; - u16 nvm_data; - - DEBUGFUNC("e1000_set_default_fc_generic"); - - /* - * Read and store word 0x0F of the EEPROM. This word contains bits - * that determine the hardware's default PAUSE (flow control) mode, - * a bit that determines whether the HW defaults to enabling or - * disabling auto-negotiation, and the direction of the - * SW defined pins. If there is no SW over-ride of the flow - * control setting, then the variable hw->fc will - * be initialized based on a value in the EEPROM. - */ - ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG, 1, &nvm_data); - - if (ret_val) { - DEBUGOUT("NVM Read Error\n"); - goto out; - } - - if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == 0) - hw->fc.requested_mode = e1000_fc_none; - else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == - NVM_WORD0F_ASM_DIR) - hw->fc.requested_mode = e1000_fc_tx_pause; - else - hw->fc.requested_mode = e1000_fc_full; - -out: - return ret_val; -} - /** * e1000_force_mac_fc_generic - Force the MAC's flow control settings * @hw: pointer to the HW structure @@ -1312,7 +1296,6 @@ out: s32 e1000_force_mac_fc_generic(struct e1000_hw *hw) { u32 ctrl; - s32 ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_force_mac_fc_generic"); @@ -1355,14 +1338,12 @@ s32 e1000_force_mac_fc_generic(struct e1000_hw *hw) break; default: DEBUGOUT("Flow control param set incorrectly\n"); - ret_val = -E1000_ERR_CONFIG; - goto out; + return -E1000_ERR_CONFIG; } E1000_WRITE_REG(hw, E1000_CTRL, ctrl); -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -1400,7 +1381,7 @@ s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw) if (ret_val) { DEBUGOUT("Error forcing flow control settings\n"); - goto out; + return ret_val; } /* @@ -1417,14 +1398,14 @@ s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw) */ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg); if (ret_val) - goto out; + return ret_val; ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg); if (ret_val) - goto out; + return ret_val; if (!(mii_status_reg & MII_SR_AUTONEG_COMPLETE)) { DEBUGOUT("Copper PHY and Auto Neg has not completed.\n"); - goto out; + return ret_val; } /* @@ -1437,11 +1418,11 @@ s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw) ret_val = hw->phy.ops.read_reg(hw, PHY_AUTONEG_ADV, &mii_nway_adv_reg); if (ret_val) - goto out; + return ret_val; ret_val = hw->phy.ops.read_reg(hw, PHY_LP_ABILITY, &mii_nway_lp_ability_reg); if (ret_val) - goto out; + return ret_val; /* * Two bits in the Auto Negotiation Advertisement Register @@ -1540,7 +1521,7 @@ s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw) ret_val = mac->ops.get_link_up_info(hw, &speed, &duplex); if (ret_val) { DEBUGOUT("Error getting link speed and duplex\n"); - goto out; + return ret_val; } if (duplex == HALF_DUPLEX) @@ -1553,12 +1534,11 @@ s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw) ret_val = e1000_force_mac_fc_generic(hw); if (ret_val) { DEBUGOUT("Error forcing flow control settings\n"); - goto out; + return ret_val; } } -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -1629,7 +1609,6 @@ s32 e1000_get_speed_and_duplex_fiber_serdes_generic(struct e1000_hw *hw, s32 e1000_get_hw_semaphore_generic(struct e1000_hw *hw) { u32 swsm; - s32 ret_val = E1000_SUCCESS; s32 timeout = hw->nvm.word_size + 1; s32 i = 0; @@ -1647,8 +1626,7 @@ s32 e1000_get_hw_semaphore_generic(struct e1000_hw *hw) if (i == timeout) { DEBUGOUT("Driver can't access device - SMBI bit is set.\n"); - ret_val = -E1000_ERR_NVM; - goto out; + return -E1000_ERR_NVM; } /* Get the FW semaphore. */ @@ -1667,12 +1645,10 @@ s32 e1000_get_hw_semaphore_generic(struct e1000_hw *hw) /* Release semaphores */ e1000_put_hw_semaphore_generic(hw); DEBUGOUT("Driver can't access the NVM\n"); - ret_val = -E1000_ERR_NVM; - goto out; + return -E1000_ERR_NVM; } -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -1703,7 +1679,6 @@ void e1000_put_hw_semaphore_generic(struct e1000_hw *hw) s32 e1000_get_auto_rd_done_generic(struct e1000_hw *hw) { s32 i = 0; - s32 ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_get_auto_rd_done_generic"); @@ -1716,12 +1691,10 @@ s32 e1000_get_auto_rd_done_generic(struct e1000_hw *hw) if (i == AUTO_READ_DONE_TIMEOUT) { DEBUGOUT("Auto read by HW from NVM has not completed.\n"); - ret_val = -E1000_ERR_RESET; - goto out; + return -E1000_ERR_RESET; } -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -1741,14 +1714,13 @@ s32 e1000_valid_led_default_generic(struct e1000_hw *hw, u16 *data) ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data); if (ret_val) { DEBUGOUT("NVM Read Error\n"); - goto out; + return ret_val; } if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF) *data = ID_LED_DEFAULT; -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -1770,7 +1742,7 @@ s32 e1000_id_led_init_generic(struct e1000_hw *hw) ret_val = hw->nvm.ops.valid_led_default(hw, &data); if (ret_val) - goto out; + return ret_val; mac->ledctl_default = E1000_READ_REG(hw, E1000_LEDCTL); mac->ledctl_mode1 = mac->ledctl_default; @@ -1814,8 +1786,7 @@ s32 e1000_id_led_init_generic(struct e1000_hw *hw) } } -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -1828,14 +1799,11 @@ out: s32 e1000_setup_led_generic(struct e1000_hw *hw) { u32 ledctl; - s32 ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_setup_led_generic"); - if (hw->mac.ops.setup_led != e1000_setup_led_generic) { - ret_val = -E1000_ERR_CONFIG; - goto out; - } + if (hw->mac.ops.setup_led != e1000_setup_led_generic) + return -E1000_ERR_CONFIG; if (hw->phy.media_type == e1000_media_type_fiber) { ledctl = E1000_READ_REG(hw, E1000_LEDCTL); @@ -1850,8 +1818,7 @@ s32 e1000_setup_led_generic(struct e1000_hw *hw) E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1); } -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -1976,7 +1943,7 @@ void e1000_set_pcie_no_snoop_generic(struct e1000_hw *hw, u32 no_snoop) DEBUGFUNC("e1000_set_pcie_no_snoop_generic"); if (hw->bus.type != e1000_bus_type_pci_express) - goto out; + return; if (no_snoop) { gcr = E1000_READ_REG(hw, E1000_GCR); @@ -1984,8 +1951,6 @@ void e1000_set_pcie_no_snoop_generic(struct e1000_hw *hw, u32 no_snoop) gcr |= no_snoop; E1000_WRITE_REG(hw, E1000_GCR, gcr); } -out: - return; } /** @@ -2003,12 +1968,11 @@ s32 e1000_disable_pcie_master_generic(struct e1000_hw *hw) { u32 ctrl; s32 timeout = MASTER_DISABLE_TIMEOUT; - s32 ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_disable_pcie_master_generic"); if (hw->bus.type != e1000_bus_type_pci_express) - goto out; + return E1000_SUCCESS; ctrl = E1000_READ_REG(hw, E1000_CTRL); ctrl |= E1000_CTRL_GIO_MASTER_DISABLE; @@ -2024,11 +1988,10 @@ s32 e1000_disable_pcie_master_generic(struct e1000_hw *hw) if (!timeout) { DEBUGOUT("Master requests are pending.\n"); - ret_val = -E1000_ERR_MASTER_REQUESTS_PENDING; + return -E1000_ERR_MASTER_REQUESTS_PENDING; } -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -2045,7 +2008,7 @@ void e1000_reset_adaptive_generic(struct e1000_hw *hw) if (!mac->adaptive_ifs) { DEBUGOUT("Not in Adaptive IFS mode!\n"); - goto out; + return; } mac->current_ifs_val = 0; @@ -2056,8 +2019,6 @@ void e1000_reset_adaptive_generic(struct e1000_hw *hw) mac->in_ifs_mode = FALSE; E1000_WRITE_REG(hw, E1000_AIT, 0); -out: - return; } /** @@ -2075,7 +2036,7 @@ void e1000_update_adaptive_generic(struct e1000_hw *hw) if (!mac->adaptive_ifs) { DEBUGOUT("Not in Adaptive IFS mode!\n"); - goto out; + return; } if ((mac->collision_delta * mac->ifs_ratio) > mac->tx_packet_delta) { @@ -2099,8 +2060,6 @@ void e1000_update_adaptive_generic(struct e1000_hw *hw) E1000_WRITE_REG(hw, E1000_AIT, 0); } } -out: - return; } /** @@ -2112,19 +2071,15 @@ out: **/ static s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw) { - s32 ret_val = E1000_SUCCESS; - DEBUGFUNC("e1000_validate_mdi_setting_generic"); if (!hw->mac.autoneg && (hw->phy.mdix == 0 || hw->phy.mdix == 3)) { DEBUGOUT("Invalid MDI setting detected\n"); hw->phy.mdix = 1; - ret_val = -E1000_ERR_CONFIG; - goto out; + return -E1000_ERR_CONFIG; } -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -2142,7 +2097,6 @@ s32 e1000_write_8bit_ctrl_reg_generic(struct e1000_hw *hw, u32 reg, u32 offset, u8 data) { u32 i, regvalue = 0; - s32 ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_write_8bit_ctrl_reg_generic"); @@ -2159,10 +2113,8 @@ s32 e1000_write_8bit_ctrl_reg_generic(struct e1000_hw *hw, u32 reg, } if (!(regvalue & E1000_GEN_CTL_READY)) { DEBUGOUT1("Reg %08x did not indicate ready\n", reg); - ret_val = -E1000_ERR_PHY; - goto out; + return -E1000_ERR_PHY; } -out: - return ret_val; + return E1000_SUCCESS; } diff --git a/sys/dev/e1000/e1000_mac.h b/sys/dev/e1000/e1000_mac.h index 11ffab7576a..c18a7ec1293 100644 --- a/sys/dev/e1000/e1000_mac.h +++ b/sys/dev/e1000/e1000_mac.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2010, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -64,31 +64,29 @@ void e1000_set_lan_id_single_port(struct e1000_hw *hw); void e1000_set_lan_id_multi_port_pci(struct e1000_hw *hw); s32 e1000_get_hw_semaphore_generic(struct e1000_hw *hw); s32 e1000_get_speed_and_duplex_copper_generic(struct e1000_hw *hw, u16 *speed, - u16 *duplex); + u16 *duplex); s32 e1000_get_speed_and_duplex_fiber_serdes_generic(struct e1000_hw *hw, - u16 *speed, u16 *duplex); + u16 *speed, u16 *duplex); s32 e1000_id_led_init_generic(struct e1000_hw *hw); s32 e1000_led_on_generic(struct e1000_hw *hw); s32 e1000_led_off_generic(struct e1000_hw *hw); void e1000_update_mc_addr_list_generic(struct e1000_hw *hw, - u8 *mc_addr_list, u32 mc_addr_count); + u8 *mc_addr_list, u32 mc_addr_count); s32 e1000_set_default_fc_generic(struct e1000_hw *hw); s32 e1000_set_fc_watermarks_generic(struct e1000_hw *hw); s32 e1000_setup_fiber_serdes_link_generic(struct e1000_hw *hw); s32 e1000_setup_led_generic(struct e1000_hw *hw); s32 e1000_setup_link_generic(struct e1000_hw *hw); s32 e1000_write_8bit_ctrl_reg_generic(struct e1000_hw *hw, u32 reg, - u32 offset, u8 data); + u32 offset, u8 data); u32 e1000_hash_mc_addr_generic(struct e1000_hw *hw, u8 *mc_addr); void e1000_clear_hw_cntrs_base_generic(struct e1000_hw *hw); void e1000_clear_vfta_generic(struct e1000_hw *hw); -void e1000_config_collision_dist_generic(struct e1000_hw *hw); void e1000_init_rx_addrs_generic(struct e1000_hw *hw, u16 rar_count); void e1000_pcix_mmrbc_workaround_generic(struct e1000_hw *hw); void e1000_put_hw_semaphore_generic(struct e1000_hw *hw); -void e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index); s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw); void e1000_reset_adaptive_generic(struct e1000_hw *hw); void e1000_set_pcie_no_snoop_generic(struct e1000_hw *hw, u32 no_snoop); diff --git a/sys/dev/e1000/e1000_manage.c b/sys/dev/e1000/e1000_manage.c index 7782739d4b3..f11b18d20e0 100644 --- a/sys/dev/e1000/e1000_manage.c +++ b/sys/dev/e1000/e1000_manage.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2010, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -71,23 +71,20 @@ u8 e1000_calculate_checksum(u8 *buffer, u32 length) s32 e1000_mng_enable_host_if_generic(struct e1000_hw *hw) { u32 hicr; - s32 ret_val = E1000_SUCCESS; u8 i; DEBUGFUNC("e1000_mng_enable_host_if_generic"); - if (!(hw->mac.arc_subsystem_valid)) { + if (!hw->mac.arc_subsystem_valid) { DEBUGOUT("ARC subsystem not valid.\n"); - ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND; - goto out; + return -E1000_ERR_HOST_INTERFACE_COMMAND; } /* Check that the host interface is enabled. */ hicr = E1000_READ_REG(hw, E1000_HICR); - if ((hicr & E1000_HICR_EN) == 0) { + if (!(hicr & E1000_HICR_EN)) { DEBUGOUT("E1000_HOST_EN bit disabled.\n"); - ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND; - goto out; + return -E1000_ERR_HOST_INTERFACE_COMMAND; } /* check the previous command is completed */ for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) { @@ -99,12 +96,10 @@ s32 e1000_mng_enable_host_if_generic(struct e1000_hw *hw) if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) { DEBUGOUT("Previous command timeout failed .\n"); - ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND; - goto out; + return -E1000_ERR_HOST_INTERFACE_COMMAND; } -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -122,7 +117,7 @@ bool e1000_check_mng_mode_generic(struct e1000_hw *hw) return (fwsm & E1000_FWSM_MODE_MASK) == - (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT); + (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT); } /** @@ -147,7 +142,7 @@ bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw) /* No manageability, no filtering */ if (!hw->mac.ops.check_mng_mode(hw)) { hw->mac.tx_pkt_filtering = FALSE; - goto out; + return hw->mac.tx_pkt_filtering; } /* @@ -157,7 +152,7 @@ bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw) ret_val = hw->mac.ops.mng_enable_host_if(hw); if (ret_val != E1000_SUCCESS) { hw->mac.tx_pkt_filtering = FALSE; - goto out; + return hw->mac.tx_pkt_filtering; } /* Read in the header. Length and offset are in dwords. */ @@ -165,11 +160,11 @@ bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw) offset = E1000_MNG_DHCP_COOKIE_OFFSET >> 2; for (i = 0; i < len; i++) *(buffer + i) = E1000_READ_REG_ARRAY_DWORD(hw, E1000_HOST_IF, - offset + i); + offset + i); hdr_csum = hdr->checksum; hdr->checksum = 0; csum = e1000_calculate_checksum((u8 *)hdr, - E1000_MNG_DHCP_COOKIE_LENGTH); + E1000_MNG_DHCP_COOKIE_LENGTH); /* * If either the checksums or signature don't match, then * the cookie area isn't considered valid, in which case we @@ -177,66 +172,16 @@ bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw) */ if ((hdr_csum != csum) || (hdr->signature != E1000_IAMT_SIGNATURE)) { hw->mac.tx_pkt_filtering = TRUE; - goto out; + return hw->mac.tx_pkt_filtering; } /* Cookie area is valid, make the final check for filtering. */ - if (!(hdr->status & E1000_MNG_DHCP_COOKIE_STATUS_PARSING)) { + if (!(hdr->status & E1000_MNG_DHCP_COOKIE_STATUS_PARSING)) hw->mac.tx_pkt_filtering = FALSE; - goto out; - } -out: return hw->mac.tx_pkt_filtering; } -/** - * e1000_mng_write_dhcp_info_generic - Writes DHCP info to host interface - * @hw: pointer to the HW structure - * @buffer: pointer to the host interface - * @length: size of the buffer - * - * Writes the DHCP information to the host interface. - **/ -s32 e1000_mng_write_dhcp_info_generic(struct e1000_hw *hw, u8 *buffer, - u16 length) -{ - struct e1000_host_mng_command_header hdr; - s32 ret_val; - u32 hicr; - - DEBUGFUNC("e1000_mng_write_dhcp_info_generic"); - - hdr.command_id = E1000_MNG_DHCP_TX_PAYLOAD_CMD; - hdr.command_length = length; - hdr.reserved1 = 0; - hdr.reserved2 = 0; - hdr.checksum = 0; - - /* Enable the host interface */ - ret_val = hw->mac.ops.mng_enable_host_if(hw); - if (ret_val) - goto out; - - /* Populate the host interface with the contents of "buffer". */ - ret_val = hw->mac.ops.mng_host_if_write(hw, buffer, length, - sizeof(hdr), &(hdr.checksum)); - if (ret_val) - goto out; - - /* Write the manageability command header */ - ret_val = hw->mac.ops.mng_write_cmd_header(hw, &hdr); - if (ret_val) - goto out; - - /* Tell the ARC a new command is pending. */ - hicr = E1000_READ_REG(hw, E1000_HICR); - E1000_WRITE_REG(hw, E1000_HICR, hicr | E1000_HICR_C); - -out: - return ret_val; -} - /** * e1000_mng_write_cmd_header_generic - Writes manageability command header * @hw: pointer to the HW structure @@ -245,7 +190,7 @@ out: * Writes the command header after does the checksum calculation. **/ s32 e1000_mng_write_cmd_header_generic(struct e1000_hw *hw, - struct e1000_host_mng_command_header *hdr) + struct e1000_host_mng_command_header *hdr) { u16 i, length = sizeof(struct e1000_host_mng_command_header); @@ -259,7 +204,7 @@ s32 e1000_mng_write_cmd_header_generic(struct e1000_hw *hw, /* Write the relevant command block into the ram area. */ for (i = 0; i < length; i++) { E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, i, - *((u32 *) hdr + i)); + *((u32 *) hdr + i)); E1000_WRITE_FLUSH(hw); } @@ -279,22 +224,19 @@ s32 e1000_mng_write_cmd_header_generic(struct e1000_hw *hw, * way. Also fills up the sum of the buffer in *buffer parameter. **/ s32 e1000_mng_host_if_write_generic(struct e1000_hw *hw, u8 *buffer, - u16 length, u16 offset, u8 *sum) + u16 length, u16 offset, u8 *sum) { u8 *tmp; u8 *bufptr = buffer; u32 data = 0; - s32 ret_val = E1000_SUCCESS; u16 remaining, i, j, prev_bytes; DEBUGFUNC("e1000_mng_host_if_write_generic"); /* sum = only sum of the data and it is not checksum */ - if (length == 0 || offset + length > E1000_HI_MAX_MNG_DATA_LENGTH) { - ret_val = -E1000_ERR_PARAM; - goto out; - } + if (length == 0 || offset + length > E1000_HI_MAX_MNG_DATA_LENGTH) + return -E1000_ERR_PARAM; tmp = (u8 *)&data; prev_bytes = offset & 0x3; @@ -328,7 +270,7 @@ s32 e1000_mng_host_if_write_generic(struct e1000_hw *hw, u8 *buffer, } E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset + i, - data); + data); } if (remaining) { for (j = 0; j < sizeof(u32); j++) { @@ -339,11 +281,57 @@ s32 e1000_mng_host_if_write_generic(struct e1000_hw *hw, u8 *buffer, *sum += *(tmp + j); } - E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset + i, data); + E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset + i, + data); } -out: - return ret_val; + return E1000_SUCCESS; +} + +/** + * e1000_mng_write_dhcp_info_generic - Writes DHCP info to host interface + * @hw: pointer to the HW structure + * @buffer: pointer to the host interface + * @length: size of the buffer + * + * Writes the DHCP information to the host interface. + **/ +s32 e1000_mng_write_dhcp_info_generic(struct e1000_hw *hw, u8 *buffer, + u16 length) +{ + struct e1000_host_mng_command_header hdr; + s32 ret_val; + u32 hicr; + + DEBUGFUNC("e1000_mng_write_dhcp_info_generic"); + + hdr.command_id = E1000_MNG_DHCP_TX_PAYLOAD_CMD; + hdr.command_length = length; + hdr.reserved1 = 0; + hdr.reserved2 = 0; + hdr.checksum = 0; + + /* Enable the host interface */ + ret_val = hw->mac.ops.mng_enable_host_if(hw); + if (ret_val) + return ret_val; + + /* Populate the host interface with the contents of "buffer". */ + ret_val = hw->mac.ops.mng_host_if_write(hw, buffer, length, + sizeof(hdr), &(hdr.checksum)); + if (ret_val) + return ret_val; + + /* Write the manageability command header */ + ret_val = hw->mac.ops.mng_write_cmd_header(hw, &hdr); + if (ret_val) + return ret_val; + + /* Tell the ARC a new command is pending. */ + hicr = E1000_READ_REG(hw, E1000_HICR); + E1000_WRITE_REG(hw, E1000_HICR, hicr | E1000_HICR_C); + + return E1000_SUCCESS; } /** @@ -357,17 +345,16 @@ bool e1000_enable_mng_pass_thru(struct e1000_hw *hw) { u32 manc; u32 fwsm, factps; - bool ret_val = FALSE; DEBUGFUNC("e1000_enable_mng_pass_thru"); if (!hw->mac.asf_firmware_present) - goto out; + return FALSE; manc = E1000_READ_REG(hw, E1000_MANC); if (!(manc & E1000_MANC_RCV_TCO_EN)) - goto out; + return FALSE; if (hw->mac.has_fwsm) { fwsm = E1000_READ_REG(hw, E1000_FWSM); @@ -375,10 +362,8 @@ bool e1000_enable_mng_pass_thru(struct e1000_hw *hw) if (!(factps & E1000_FACTPS_MNGCG) && ((fwsm & E1000_FWSM_MODE_MASK) == - (e1000_mng_mode_pt << E1000_FWSM_MODE_SHIFT))) { - ret_val = TRUE; - goto out; - } + (e1000_mng_mode_pt << E1000_FWSM_MODE_SHIFT))) + return TRUE; } else if ((hw->mac.type == e1000_82574) || (hw->mac.type == e1000_82583)) { u16 data; @@ -388,18 +373,14 @@ bool e1000_enable_mng_pass_thru(struct e1000_hw *hw) if (!(factps & E1000_FACTPS_MNGCG) && ((data & E1000_NVM_INIT_CTRL2_MNGM) == - (e1000_mng_mode_pt << 13))) { - ret_val = TRUE; - goto out; - } + (e1000_mng_mode_pt << 13))) + return TRUE; } else if ((manc & E1000_MANC_SMBUS_EN) && - !(manc & E1000_MANC_ASF_EN)) { - ret_val = TRUE; - goto out; + !(manc & E1000_MANC_ASF_EN)) { + return TRUE; } -out: - return ret_val; + return FALSE; } /** @@ -414,33 +395,30 @@ out: s32 e1000_host_interface_command(struct e1000_hw *hw, u8 *buffer, u32 length) { u32 hicr, i; - s32 ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_host_interface_command"); if (!(hw->mac.arc_subsystem_valid)) { DEBUGOUT("Hardware doesn't support host interface command.\n"); - goto out; + return E1000_SUCCESS; } if (!hw->mac.asf_firmware_present) { DEBUGOUT("Firmware is not present.\n"); - goto out; + return E1000_SUCCESS; } if (length == 0 || length & 0x3 || length > E1000_HI_MAX_BLOCK_BYTE_LENGTH) { DEBUGOUT("Buffer length failure.\n"); - ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND; - goto out; + return -E1000_ERR_HOST_INTERFACE_COMMAND; } /* Check that the host interface is enabled. */ hicr = E1000_READ_REG(hw, E1000_HICR); - if ((hicr & E1000_HICR_EN) == 0) { + if (!(hicr & E1000_HICR_EN)) { DEBUGOUT("E1000_HOST_EN bit disabled.\n"); - ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND; - goto out; + return -E1000_ERR_HOST_INTERFACE_COMMAND; } /* Calculate length in DWORDs */ @@ -451,10 +429,8 @@ s32 e1000_host_interface_command(struct e1000_hw *hw, u8 *buffer, u32 length) * into the ram area. */ for (i = 0; i < length; i++) - E1000_WRITE_REG_ARRAY_DWORD(hw, - E1000_HOST_IF, - i, - *((u32 *)buffer + i)); + E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, i, + *((u32 *)buffer + i)); /* Setting this bit tells the ARC that a new command is pending. */ E1000_WRITE_REG(hw, E1000_HICR, hicr | E1000_HICR_C); @@ -470,16 +446,134 @@ s32 e1000_host_interface_command(struct e1000_hw *hw, u8 *buffer, u32 length) if (i == E1000_HI_COMMAND_TIMEOUT || (!(E1000_READ_REG(hw, E1000_HICR) & E1000_HICR_SV))) { DEBUGOUT("Command has failed with no status valid.\n"); - ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND; - goto out; + return -E1000_ERR_HOST_INTERFACE_COMMAND; } for (i = 0; i < length; i++) *((u32 *)buffer + i) = E1000_READ_REG_ARRAY_DWORD(hw, - E1000_HOST_IF, - i); + E1000_HOST_IF, + i); -out: - return ret_val; + return E1000_SUCCESS; +} +/** + * e1000_load_firmware - Writes proxy FW code buffer to host interface + * and execute. + * @hw: pointer to the HW structure + * @buffer: contains a firmware to write + * @length: the byte length of the buffer, must be multiple of 4 bytes + * + * Upon success returns E1000_SUCCESS, returns E1000_ERR_CONFIG if not enabled + * in HW else returns E1000_ERR_HOST_INTERFACE_COMMAND. + **/ +s32 e1000_load_firmware(struct e1000_hw *hw, u8 *buffer, u32 length) +{ + u32 hicr, hibba, fwsm, icr, i; + + DEBUGFUNC("e1000_load_firmware"); + + if (hw->mac.type < e1000_i210) { + DEBUGOUT("Hardware doesn't support loading FW by the driver\n"); + return -E1000_ERR_CONFIG; + } + + /* Check that the host interface is enabled. */ + hicr = E1000_READ_REG(hw, E1000_HICR); + if (!(hicr & E1000_HICR_EN)) { + DEBUGOUT("E1000_HOST_EN bit disabled.\n"); + return -E1000_ERR_CONFIG; + } + if (!(hicr & E1000_HICR_MEMORY_BASE_EN)) { + DEBUGOUT("E1000_HICR_MEMORY_BASE_EN bit disabled.\n"); + return -E1000_ERR_CONFIG; + } + + if (length == 0 || length & 0x3 || length > E1000_HI_FW_MAX_LENGTH) { + DEBUGOUT("Buffer length failure.\n"); + return -E1000_ERR_INVALID_ARGUMENT; + } + + /* Clear notification from ROM-FW by reading ICR register */ + icr = E1000_READ_REG(hw, E1000_ICR_V2); + + /* Reset ROM-FW */ + hicr = E1000_READ_REG(hw, E1000_HICR); + hicr |= E1000_HICR_FW_RESET_ENABLE; + E1000_WRITE_REG(hw, E1000_HICR, hicr); + hicr |= E1000_HICR_FW_RESET; + E1000_WRITE_REG(hw, E1000_HICR, hicr); + E1000_WRITE_FLUSH(hw); + + /* Wait till MAC notifies about its readiness after ROM-FW reset */ + for (i = 0; i < (E1000_HI_COMMAND_TIMEOUT * 2); i++) { + icr = E1000_READ_REG(hw, E1000_ICR_V2); + if (icr & E1000_ICR_MNG) + break; + msec_delay(1); + } + + /* Check for timeout */ + if (i == E1000_HI_COMMAND_TIMEOUT) { + DEBUGOUT("FW reset failed.\n"); + return -E1000_ERR_HOST_INTERFACE_COMMAND; + } + + /* Wait till MAC is ready to accept new FW code */ + for (i = 0; i < E1000_HI_COMMAND_TIMEOUT; i++) { + fwsm = E1000_READ_REG(hw, E1000_FWSM); + if ((fwsm & E1000_FWSM_FW_VALID) && + ((fwsm & E1000_FWSM_MODE_MASK) >> E1000_FWSM_MODE_SHIFT == + E1000_FWSM_HI_EN_ONLY_MODE)) + break; + msec_delay(1); + } + + /* Check for timeout */ + if (i == E1000_HI_COMMAND_TIMEOUT) { + DEBUGOUT("FW reset failed.\n"); + return -E1000_ERR_HOST_INTERFACE_COMMAND; + } + + /* Calculate length in DWORDs */ + length >>= 2; + + /* + * The device driver writes the relevant FW code block + * into the ram area in DWORDs via 1kB ram addressing window. + */ + for (i = 0; i < length; i++) { + if (!(i % E1000_HI_FW_BLOCK_DWORD_LENGTH)) { + /* Point to correct 1kB ram window */ + hibba = E1000_HI_FW_BASE_ADDRESS + + ((E1000_HI_FW_BLOCK_DWORD_LENGTH << 2) * + (i / E1000_HI_FW_BLOCK_DWORD_LENGTH)); + + E1000_WRITE_REG(hw, E1000_HIBBA, hibba); + } + + E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, + i % E1000_HI_FW_BLOCK_DWORD_LENGTH, + *((u32 *)buffer + i)); + } + + /* Setting this bit tells the ARC that a new FW is ready to execute. */ + hicr = E1000_READ_REG(hw, E1000_HICR); + E1000_WRITE_REG(hw, E1000_HICR, hicr | E1000_HICR_C); + + for (i = 0; i < E1000_HI_COMMAND_TIMEOUT; i++) { + hicr = E1000_READ_REG(hw, E1000_HICR); + if (!(hicr & E1000_HICR_C)) + break; + msec_delay(1); + } + + /* Check for successful FW start. */ + if (i == E1000_HI_COMMAND_TIMEOUT) { + DEBUGOUT("New FW did not start within timeout period.\n"); + return -E1000_ERR_HOST_INTERFACE_COMMAND; + } + + return E1000_SUCCESS; } + diff --git a/sys/dev/e1000/e1000_manage.h b/sys/dev/e1000/e1000_manage.h index 6a0c2a05149..51f176719cb 100644 --- a/sys/dev/e1000/e1000_manage.h +++ b/sys/dev/e1000/e1000_manage.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2010, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -39,14 +39,15 @@ bool e1000_check_mng_mode_generic(struct e1000_hw *hw); bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw); s32 e1000_mng_enable_host_if_generic(struct e1000_hw *hw); s32 e1000_mng_host_if_write_generic(struct e1000_hw *hw, u8 *buffer, - u16 length, u16 offset, u8 *sum); + u16 length, u16 offset, u8 *sum); s32 e1000_mng_write_cmd_header_generic(struct e1000_hw *hw, - struct e1000_host_mng_command_header *hdr); + struct e1000_host_mng_command_header *hdr); s32 e1000_mng_write_dhcp_info_generic(struct e1000_hw *hw, - u8 *buffer, u16 length); + u8 *buffer, u16 length); bool e1000_enable_mng_pass_thru(struct e1000_hw *hw); u8 e1000_calculate_checksum(u8 *buffer, u32 length); s32 e1000_host_interface_command(struct e1000_hw *hw, u8 *buffer, u32 length); +s32 e1000_load_firmware(struct e1000_hw *hw, u8 *buffer, u32 length); enum e1000_mng_mode { e1000_mng_mode_none = 0, @@ -56,35 +57,40 @@ enum e1000_mng_mode { e1000_mng_mode_host_if_only }; -#define E1000_FACTPS_MNGCG 0x20000000 +#define E1000_FACTPS_MNGCG 0x20000000 -#define E1000_FWSM_MODE_MASK 0xE -#define E1000_FWSM_MODE_SHIFT 1 +#define E1000_FWSM_MODE_MASK 0xE +#define E1000_FWSM_MODE_SHIFT 1 +#define E1000_FWSM_FW_VALID 0x00008000 +#define E1000_FWSM_HI_EN_ONLY_MODE 0x4 -#define E1000_MNG_IAMT_MODE 0x3 -#define E1000_MNG_DHCP_COOKIE_LENGTH 0x10 -#define E1000_MNG_DHCP_COOKIE_OFFSET 0x6F0 -#define E1000_MNG_DHCP_COMMAND_TIMEOUT 10 -#define E1000_MNG_DHCP_TX_PAYLOAD_CMD 64 -#define E1000_MNG_DHCP_COOKIE_STATUS_PARSING 0x1 -#define E1000_MNG_DHCP_COOKIE_STATUS_VLAN 0x2 +#define E1000_MNG_IAMT_MODE 0x3 +#define E1000_MNG_DHCP_COOKIE_LENGTH 0x10 +#define E1000_MNG_DHCP_COOKIE_OFFSET 0x6F0 +#define E1000_MNG_DHCP_COMMAND_TIMEOUT 10 +#define E1000_MNG_DHCP_TX_PAYLOAD_CMD 64 +#define E1000_MNG_DHCP_COOKIE_STATUS_PARSING 0x1 +#define E1000_MNG_DHCP_COOKIE_STATUS_VLAN 0x2 -#define E1000_VFTA_ENTRY_SHIFT 5 -#define E1000_VFTA_ENTRY_MASK 0x7F -#define E1000_VFTA_ENTRY_BIT_SHIFT_MASK 0x1F +#define E1000_VFTA_ENTRY_SHIFT 5 +#define E1000_VFTA_ENTRY_MASK 0x7F +#define E1000_VFTA_ENTRY_BIT_SHIFT_MASK 0x1F -#define E1000_HI_MAX_BLOCK_BYTE_LENGTH 1792 /* Num of bytes in range */ -#define E1000_HI_MAX_BLOCK_DWORD_LENGTH 448 /* Num of dwords in range */ -#define E1000_HI_COMMAND_TIMEOUT 500 /* Process HI command limit */ - -#define E1000_HICR_EN 0x01 /* Enable bit - RO */ +#define E1000_HI_MAX_BLOCK_BYTE_LENGTH 1792 /* Num of bytes in range */ +#define E1000_HI_MAX_BLOCK_DWORD_LENGTH 448 /* Num of dwords in range */ +#define E1000_HI_COMMAND_TIMEOUT 500 /* Process HI cmd limit */ +#define E1000_HI_FW_BASE_ADDRESS 0x10000 +#define E1000_HI_FW_MAX_LENGTH (64 * 1024) /* Num of bytes */ +#define E1000_HI_FW_BLOCK_DWORD_LENGTH 256 /* Num of DWORDs per page */ +#define E1000_HICR_MEMORY_BASE_EN 0x200 /* MB Enable bit - RO */ +#define E1000_HICR_EN 0x01 /* Enable bit - RO */ /* Driver sets this bit when done to put command in RAM */ -#define E1000_HICR_C 0x02 -#define E1000_HICR_SV 0x04 /* Status Validity */ -#define E1000_HICR_FW_RESET_ENABLE 0x40 -#define E1000_HICR_FW_RESET 0x80 +#define E1000_HICR_C 0x02 +#define E1000_HICR_SV 0x04 /* Status Validity */ +#define E1000_HICR_FW_RESET_ENABLE 0x40 +#define E1000_HICR_FW_RESET 0x80 /* Intel(R) Active Management Technology signature */ -#define E1000_IAMT_SIGNATURE 0x544D4149 +#define E1000_IAMT_SIGNATURE 0x544D4149 #endif diff --git a/sys/dev/e1000/e1000_phy.c b/sys/dev/e1000/e1000_phy.c index ead726904fb..fd253ba92f9 100644 --- a/sys/dev/e1000/e1000_phy.c +++ b/sys/dev/e1000/e1000_phy.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2011, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -95,8 +95,8 @@ void e1000_init_phy_ops_generic(struct e1000_hw *hw) phy->ops.write_reg_page = e1000_null_write_reg; phy->ops.power_up = e1000_null_phy_generic; phy->ops.power_down = e1000_null_phy_generic; - phy->ops.read_i2c_byte = e1000_read_i2c_byte_generic; - phy->ops.write_i2c_byte = e1000_write_i2c_byte_generic; + phy->ops.read_i2c_byte = e1000_read_i2c_byte_null; + phy->ops.write_i2c_byte = e1000_write_i2c_byte_null; phy->ops.cfg_on_link_up = e1000_null_ops_generic; } @@ -150,6 +150,36 @@ s32 e1000_null_write_reg(struct e1000_hw *hw, u32 offset, u16 data) return E1000_SUCCESS; } +/** + * e1000_read_i2c_byte_null - No-op function, return 0 + * @hw: pointer to hardware structure + * @byte_offset: byte offset to write + * @dev_addr: device address + * @data: data value read + * + **/ +s32 e1000_read_i2c_byte_null(struct e1000_hw *hw, u8 byte_offset, + u8 dev_addr, u8 *data) +{ + DEBUGFUNC("e1000_read_i2c_byte_null"); + return E1000_SUCCESS; +} + +/** + * e1000_write_i2c_byte_null - No-op function, return 0 + * @hw: pointer to hardware structure + * @byte_offset: byte offset to write + * @dev_addr: device address + * @data: data value to write + * + **/ +s32 e1000_write_i2c_byte_null(struct e1000_hw *hw, u8 byte_offset, + u8 dev_addr, u8 data) +{ + DEBUGFUNC("e1000_write_i2c_byte_null"); + return E1000_SUCCESS; +} + /** * e1000_check_reset_block_generic - Check if PHY reset is blocked * @hw: pointer to the HW structure @@ -186,30 +216,30 @@ s32 e1000_get_phy_id(struct e1000_hw *hw) DEBUGFUNC("e1000_get_phy_id"); - if (!(phy->ops.read_reg)) - goto out; + if (!phy->ops.read_reg) + return E1000_SUCCESS; while (retry_count < 2) { ret_val = phy->ops.read_reg(hw, PHY_ID1, &phy_id); if (ret_val) - goto out; + return ret_val; phy->id = (u32)(phy_id << 16); usec_delay(20); ret_val = phy->ops.read_reg(hw, PHY_ID2, &phy_id); if (ret_val) - goto out; + return ret_val; phy->id |= (u32)(phy_id & PHY_REVISION_MASK); phy->revision = (u32)(phy_id & ~PHY_REVISION_MASK); if (phy->id != 0 && phy->id != PHY_REVISION_MASK) - goto out; + return E1000_SUCCESS; retry_count++; } -out: - return ret_val; + + return E1000_SUCCESS; } /** @@ -220,21 +250,18 @@ out: **/ s32 e1000_phy_reset_dsp_generic(struct e1000_hw *hw) { - s32 ret_val = E1000_SUCCESS; + s32 ret_val; DEBUGFUNC("e1000_phy_reset_dsp_generic"); - if (!(hw->phy.ops.write_reg)) - goto out; + if (!hw->phy.ops.write_reg) + return E1000_SUCCESS; ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xC1); if (ret_val) - goto out; + return ret_val; - ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0); - -out: - return ret_val; + return hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0); } /** @@ -250,7 +277,6 @@ s32 e1000_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data) { struct e1000_phy_info *phy = &hw->phy; u32 i, mdic = 0; - s32 ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_read_phy_reg_mdic"); @@ -283,13 +309,11 @@ s32 e1000_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data) } if (!(mdic & E1000_MDIC_READY)) { DEBUGOUT("MDI Read did not complete\n"); - ret_val = -E1000_ERR_PHY; - goto out; + return -E1000_ERR_PHY; } if (mdic & E1000_MDIC_ERROR) { DEBUGOUT("MDI Error\n"); - ret_val = -E1000_ERR_PHY; - goto out; + return -E1000_ERR_PHY; } *data = (u16) mdic; @@ -300,8 +324,7 @@ s32 e1000_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data) if (hw->mac.type == e1000_pch2lan) usec_delay(100); -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -316,7 +339,6 @@ s32 e1000_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data) { struct e1000_phy_info *phy = &hw->phy; u32 i, mdic = 0; - s32 ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_write_phy_reg_mdic"); @@ -350,13 +372,11 @@ s32 e1000_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data) } if (!(mdic & E1000_MDIC_READY)) { DEBUGOUT("MDI Write did not complete\n"); - ret_val = -E1000_ERR_PHY; - goto out; + return -E1000_ERR_PHY; } if (mdic & E1000_MDIC_ERROR) { DEBUGOUT("MDI Error\n"); - ret_val = -E1000_ERR_PHY; - goto out; + return -E1000_ERR_PHY; } /* @@ -366,8 +386,7 @@ s32 e1000_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data) if (hw->mac.type == e1000_pch2lan) usec_delay(100); -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -621,23 +640,22 @@ s32 e1000_write_sfp_data_byte(struct e1000_hw *hw, u16 offset, u8 data) **/ s32 e1000_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data) { - s32 ret_val = E1000_SUCCESS; + s32 ret_val; DEBUGFUNC("e1000_read_phy_reg_m88"); - if (!(hw->phy.ops.acquire)) - goto out; + if (!hw->phy.ops.acquire) + return E1000_SUCCESS; ret_val = hw->phy.ops.acquire(hw); if (ret_val) - goto out; + return ret_val; ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, data); hw->phy.ops.release(hw); -out: return ret_val; } @@ -652,23 +670,22 @@ out: **/ s32 e1000_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data) { - s32 ret_val = E1000_SUCCESS; + s32 ret_val; DEBUGFUNC("e1000_write_phy_reg_m88"); - if (!(hw->phy.ops.acquire)) - goto out; + if (!hw->phy.ops.acquire) + return E1000_SUCCESS; ret_val = hw->phy.ops.acquire(hw); if (ret_val) - goto out; + return ret_val; ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, data); hw->phy.ops.release(hw); -out: return ret_val; } @@ -711,29 +728,25 @@ static s32 __e1000_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data, DEBUGFUNC("__e1000_read_phy_reg_igp"); if (!locked) { - if (!(hw->phy.ops.acquire)) - goto out; + if (!hw->phy.ops.acquire) + return E1000_SUCCESS; ret_val = hw->phy.ops.acquire(hw); if (ret_val) - goto out; + return ret_val; } - if (offset > MAX_PHY_MULTI_PAGE_REG) { + if (offset > MAX_PHY_MULTI_PAGE_REG) ret_val = e1000_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, (u16)offset); - if (ret_val) - goto release; - } - - ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, - data); - -release: + if (!ret_val) + ret_val = e1000_read_phy_reg_mdic(hw, + MAX_PHY_REG_ADDRESS & offset, + data); if (!locked) hw->phy.ops.release(hw); -out: + return ret_val; } @@ -784,30 +797,25 @@ static s32 __e1000_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data, DEBUGFUNC("e1000_write_phy_reg_igp"); if (!locked) { - if (!(hw->phy.ops.acquire)) - goto out; + if (!hw->phy.ops.acquire) + return E1000_SUCCESS; ret_val = hw->phy.ops.acquire(hw); if (ret_val) - goto out; + return ret_val; } - if (offset > MAX_PHY_MULTI_PAGE_REG) { + if (offset > MAX_PHY_MULTI_PAGE_REG) ret_val = e1000_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, (u16)offset); - if (ret_val) - goto release; - } - - ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, - data); - -release: + if (!ret_val) + ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & + offset, + data); if (!locked) hw->phy.ops.release(hw); -out: return ret_val; } @@ -854,17 +862,18 @@ static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data, bool locked) { u32 kmrnctrlsta; - s32 ret_val = E1000_SUCCESS; DEBUGFUNC("__e1000_read_kmrn_reg"); if (!locked) { - if (!(hw->phy.ops.acquire)) - goto out; + s32 ret_val = E1000_SUCCESS; + + if (!hw->phy.ops.acquire) + return E1000_SUCCESS; ret_val = hw->phy.ops.acquire(hw); if (ret_val) - goto out; + return ret_val; } kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & @@ -880,8 +889,7 @@ static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data, if (!locked) hw->phy.ops.release(hw); -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -929,17 +937,18 @@ static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data, bool locked) { u32 kmrnctrlsta; - s32 ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_write_kmrn_reg_generic"); if (!locked) { - if (!(hw->phy.ops.acquire)) - goto out; + s32 ret_val = E1000_SUCCESS; + + if (!hw->phy.ops.acquire) + return E1000_SUCCESS; ret_val = hw->phy.ops.acquire(hw); if (ret_val) - goto out; + return ret_val; } kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & @@ -952,8 +961,7 @@ static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data, if (!locked) hw->phy.ops.release(hw); -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -984,6 +992,46 @@ s32 e1000_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 data) return __e1000_write_kmrn_reg(hw, offset, data, TRUE); } +/** + * e1000_set_master_slave_mode - Setup PHY for Master/slave mode + * @hw: pointer to the HW structure + * + * Sets up Master/slave mode + **/ +static s32 e1000_set_master_slave_mode(struct e1000_hw *hw) +{ + s32 ret_val; + u16 phy_data; + + /* Resolve Master/Slave mode */ + ret_val = hw->phy.ops.read_reg(hw, PHY_1000T_CTRL, &phy_data); + if (ret_val) + return ret_val; + + /* load defaults for future use */ + hw->phy.original_ms_type = (phy_data & CR_1000T_MS_ENABLE) ? + ((phy_data & CR_1000T_MS_VALUE) ? + e1000_ms_force_master : + e1000_ms_force_slave) : e1000_ms_auto; + + switch (hw->phy.ms_type) { + case e1000_ms_force_master: + phy_data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE); + break; + case e1000_ms_force_slave: + phy_data |= CR_1000T_MS_ENABLE; + phy_data &= ~(CR_1000T_MS_VALUE); + break; + case e1000_ms_auto: + phy_data &= ~CR_1000T_MS_ENABLE; + /* fall-through */ + default: + break; + } + + return hw->phy.ops.write_reg(hw, PHY_1000T_CTRL, phy_data); +} + /** * e1000_copper_link_setup_82577 - Setup 82577 PHY for copper link * @hw: pointer to the HW structure @@ -1001,14 +1049,14 @@ s32 e1000_copper_link_setup_82577(struct e1000_hw *hw) ret_val = hw->phy.ops.reset(hw); if (ret_val) { DEBUGOUT("Error resetting the PHY.\n"); - goto out; + return ret_val; } } /* Enable CRS on Tx. This must be set for half-duplex operation. */ ret_val = hw->phy.ops.read_reg(hw, I82577_CFG_REG, &phy_data); if (ret_val) - goto out; + return ret_val; phy_data |= I82577_CFG_ASSERT_CRS_ON_TX; @@ -1017,39 +1065,35 @@ s32 e1000_copper_link_setup_82577(struct e1000_hw *hw) ret_val = hw->phy.ops.write_reg(hw, I82577_CFG_REG, phy_data); if (ret_val) - goto out; + return ret_val; - /* Resolve Master/Slave mode */ - ret_val = hw->phy.ops.read_reg(hw, PHY_1000T_CTRL, &phy_data); + /* Set MDI/MDIX mode */ + ret_val = hw->phy.ops.read_reg(hw, I82577_PHY_CTRL_2, &phy_data); if (ret_val) - goto out; - - /* load defaults for future use */ - hw->phy.original_ms_type = (phy_data & CR_1000T_MS_ENABLE) ? - ((phy_data & CR_1000T_MS_VALUE) ? - e1000_ms_force_master : - e1000_ms_force_slave) : e1000_ms_auto; - - switch (hw->phy.ms_type) { - case e1000_ms_force_master: - phy_data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE); + return ret_val; + phy_data &= ~I82577_PHY_CTRL2_MDIX_CFG_MASK; + /* + * Options: + * 0 - Auto (default) + * 1 - MDI mode + * 2 - MDI-X mode + */ + switch (hw->phy.mdix) { + case 1: break; - case e1000_ms_force_slave: - phy_data |= CR_1000T_MS_ENABLE; - phy_data &= ~(CR_1000T_MS_VALUE); + case 2: + phy_data |= I82577_PHY_CTRL2_MANUAL_MDIX; break; - case e1000_ms_auto: - phy_data &= ~CR_1000T_MS_ENABLE; + case 0: default: + phy_data |= I82577_PHY_CTRL2_AUTO_MDI_MDIX; break; } - - ret_val = hw->phy.ops.write_reg(hw, PHY_1000T_CTRL, phy_data); + ret_val = hw->phy.ops.write_reg(hw, I82577_PHY_CTRL_2, phy_data); if (ret_val) - goto out; + return ret_val; -out: - return ret_val; + return e1000_set_master_slave_mode(hw); } /** @@ -1071,7 +1115,7 @@ s32 e1000_copper_link_setup_m88(struct e1000_hw *hw) /* Enable CRS on Tx. This must be set for half-duplex operation. */ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); if (ret_val) - goto out; + return ret_val; /* For BM PHY this bit is downshift enable */ if (phy->type != e1000_phy_bm) @@ -1111,16 +1155,32 @@ s32 e1000_copper_link_setup_m88(struct e1000_hw *hw) * 1 - Enabled */ phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL; - if (phy->disable_polarity_correction == 1) + if (phy->disable_polarity_correction) phy_data |= M88E1000_PSCR_POLARITY_REVERSAL; /* Enable downshift on BM (disabled by default) */ - if (phy->type == e1000_phy_bm) + if (phy->type == e1000_phy_bm) { + /* For 82574/82583, first disable then enable downshift */ + if (phy->id == BME1000_E_PHY_ID_R2) { + phy_data &= ~BME1000_PSCR_ENABLE_DOWNSHIFT; + ret_val = phy->ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, + phy_data); + if (ret_val) + return ret_val; + /* Commit the changes. */ + ret_val = phy->ops.commit(hw); + if (ret_val) { + DEBUGOUT("Error committing the PHY changes\n"); + return ret_val; + } + } + phy_data |= BME1000_PSCR_ENABLE_DOWNSHIFT; + } ret_val = phy->ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); if (ret_val) - goto out; + return ret_val; if ((phy->type == e1000_phy_m88) && (phy->revision < E1000_REVISION_4) && @@ -1132,7 +1192,7 @@ s32 e1000_copper_link_setup_m88(struct e1000_hw *hw) ret_val = phy->ops.read_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data); if (ret_val) - goto out; + return ret_val; phy_data |= M88E1000_EPSCR_TX_CLK_25; @@ -1151,33 +1211,33 @@ s32 e1000_copper_link_setup_m88(struct e1000_hw *hw) ret_val = phy->ops.write_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data); if (ret_val) - goto out; + return ret_val; } if ((phy->type == e1000_phy_bm) && (phy->id == BME1000_E_PHY_ID_R2)) { /* Set PHY page 0, register 29 to 0x0003 */ ret_val = phy->ops.write_reg(hw, 29, 0x0003); if (ret_val) - goto out; + return ret_val; /* Set PHY page 0, register 30 to 0x0000 */ ret_val = phy->ops.write_reg(hw, 30, 0x0000); if (ret_val) - goto out; + return ret_val; } /* Commit the changes. */ ret_val = phy->ops.commit(hw); if (ret_val) { DEBUGOUT("Error committing the PHY changes\n"); - goto out; + return ret_val; } if (phy->type == e1000_phy_82578) { ret_val = phy->ops.read_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data); if (ret_val) - goto out; + return ret_val; /* 82578 PHY - set the downshift count to 1x. */ phy_data |= I82578_EPSCR_DOWNSHIFT_ENABLE; @@ -1185,11 +1245,16 @@ s32 e1000_copper_link_setup_m88(struct e1000_hw *hw) ret_val = phy->ops.write_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data); if (ret_val) - goto out; + return ret_val; } -out: - return ret_val; + if (phy->type == e1000_phy_i210) { + ret_val = e1000_set_master_slave_mode(hw); + if (ret_val) + return ret_val; + } + + return E1000_SUCCESS; } /** @@ -1211,7 +1276,7 @@ s32 e1000_copper_link_setup_m88_gen2(struct e1000_hw *hw) /* Enable CRS on Tx. This must be set for half-duplex operation. */ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); if (ret_val) - goto out; + return ret_val; /* * Options: @@ -1250,7 +1315,7 @@ s32 e1000_copper_link_setup_m88_gen2(struct e1000_hw *hw) * 1 - Enabled */ phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL; - if (phy->disable_polarity_correction == 1) + if (phy->disable_polarity_correction) phy_data |= M88E1000_PSCR_POLARITY_REVERSAL; /* Enable downshift and setting it to X6 */ @@ -1260,17 +1325,16 @@ s32 e1000_copper_link_setup_m88_gen2(struct e1000_hw *hw) ret_val = phy->ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); if (ret_val) - goto out; + return ret_val; /* Commit the changes. */ ret_val = phy->ops.commit(hw); if (ret_val) { DEBUGOUT("Error committing the PHY changes\n"); - goto out; + return ret_val; } -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -1292,7 +1356,7 @@ s32 e1000_copper_link_setup_igp(struct e1000_hw *hw) ret_val = hw->phy.ops.reset(hw); if (ret_val) { DEBUGOUT("Error resetting the PHY.\n"); - goto out; + return ret_val; } /* @@ -1310,7 +1374,7 @@ s32 e1000_copper_link_setup_igp(struct e1000_hw *hw) ret_val = hw->phy.ops.set_d3_lplu_state(hw, FALSE); if (ret_val) { DEBUGOUT("Error Disabling LPLU D3\n"); - goto out; + return ret_val; } } @@ -1319,13 +1383,13 @@ s32 e1000_copper_link_setup_igp(struct e1000_hw *hw) ret_val = hw->phy.ops.set_d0_lplu_state(hw, FALSE); if (ret_val) { DEBUGOUT("Error Disabling LPLU D0\n"); - goto out; + return ret_val; } } /* Configure mdi-mdix settings */ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CTRL, &data); if (ret_val) - goto out; + return ret_val; data &= ~IGP01E1000_PSCR_AUTO_MDIX; @@ -1343,7 +1407,7 @@ s32 e1000_copper_link_setup_igp(struct e1000_hw *hw) } ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CTRL, data); if (ret_val) - goto out; + return ret_val; /* set auto-master slave resolution settings */ if (hw->mac.autoneg) { @@ -1358,125 +1422,29 @@ s32 e1000_copper_link_setup_igp(struct e1000_hw *hw) IGP01E1000_PHY_PORT_CONFIG, &data); if (ret_val) - goto out; + return ret_val; data &= ~IGP01E1000_PSCFR_SMART_SPEED; ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CONFIG, data); if (ret_val) - goto out; + return ret_val; /* Set auto Master/Slave resolution process */ ret_val = phy->ops.read_reg(hw, PHY_1000T_CTRL, &data); if (ret_val) - goto out; + return ret_val; data &= ~CR_1000T_MS_ENABLE; ret_val = phy->ops.write_reg(hw, PHY_1000T_CTRL, data); if (ret_val) - goto out; + return ret_val; } - ret_val = phy->ops.read_reg(hw, PHY_1000T_CTRL, &data); - if (ret_val) - goto out; - - /* load defaults for future use */ - phy->original_ms_type = (data & CR_1000T_MS_ENABLE) ? - ((data & CR_1000T_MS_VALUE) ? - e1000_ms_force_master : - e1000_ms_force_slave) : - e1000_ms_auto; - - switch (phy->ms_type) { - case e1000_ms_force_master: - data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE); - break; - case e1000_ms_force_slave: - data |= CR_1000T_MS_ENABLE; - data &= ~(CR_1000T_MS_VALUE); - break; - case e1000_ms_auto: - data &= ~CR_1000T_MS_ENABLE; - default: - break; - } - ret_val = phy->ops.write_reg(hw, PHY_1000T_CTRL, data); - if (ret_val) - goto out; + ret_val = e1000_set_master_slave_mode(hw); } -out: - return ret_val; -} - -/** - * e1000_copper_link_autoneg - Setup/Enable autoneg for copper link - * @hw: pointer to the HW structure - * - * Performs initial bounds checking on autoneg advertisement parameter, then - * configure to advertise the full capability. Setup the PHY to autoneg - * and restart the negotiation process between the link partner. If - * autoneg_wait_to_complete, then wait for autoneg to complete before exiting. - **/ -s32 e1000_copper_link_autoneg(struct e1000_hw *hw) -{ - struct e1000_phy_info *phy = &hw->phy; - s32 ret_val; - u16 phy_ctrl; - - DEBUGFUNC("e1000_copper_link_autoneg"); - - /* - * Perform some bounds checking on the autoneg advertisement - * parameter. - */ - phy->autoneg_advertised &= phy->autoneg_mask; - - /* - * If autoneg_advertised is zero, we assume it was not defaulted - * by the calling code so we set to advertise full capability. - */ - if (phy->autoneg_advertised == 0) - phy->autoneg_advertised = phy->autoneg_mask; - - DEBUGOUT("Reconfiguring auto-neg advertisement params\n"); - ret_val = e1000_phy_setup_autoneg(hw); - if (ret_val) { - DEBUGOUT("Error Setting up Auto-Negotiation\n"); - goto out; - } - DEBUGOUT("Restarting Auto-Neg\n"); - - /* - * Restart auto-negotiation by setting the Auto Neg Enable bit and - * the Auto Neg Restart bit in the PHY control register. - */ - ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_ctrl); - if (ret_val) - goto out; - - phy_ctrl |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG); - ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_ctrl); - if (ret_val) - goto out; - - /* - * Does the user want to wait for Auto-Neg to complete here, or - * check at a later time (for example, callback routine). - */ - if (phy->autoneg_wait_to_complete) { - ret_val = hw->mac.ops.wait_autoneg(hw); - if (ret_val) { - DEBUGOUT("Error while waiting for autoneg to complete\n"); - goto out; - } - } - - hw->mac.get_link_status = TRUE; - -out: return ret_val; } @@ -1503,14 +1471,14 @@ s32 e1000_phy_setup_autoneg(struct e1000_hw *hw) /* Read the MII Auto-Neg Advertisement Register (Address 4). */ ret_val = phy->ops.read_reg(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg); if (ret_val) - goto out; + return ret_val; if (phy->autoneg_mask & ADVERTISE_1000_FULL) { /* Read the MII 1000Base-T Control Register (Address 9). */ ret_val = phy->ops.read_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg); if (ret_val) - goto out; + return ret_val; } /* @@ -1624,24 +1592,87 @@ s32 e1000_phy_setup_autoneg(struct e1000_hw *hw) break; default: DEBUGOUT("Flow control param set incorrectly\n"); - ret_val = -E1000_ERR_CONFIG; - goto out; + return -E1000_ERR_CONFIG; } ret_val = phy->ops.write_reg(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg); if (ret_val) - goto out; + return ret_val; DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg); - if (phy->autoneg_mask & ADVERTISE_1000_FULL) { + if (phy->autoneg_mask & ADVERTISE_1000_FULL) ret_val = phy->ops.write_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg); - if (ret_val) - goto out; + + return ret_val; +} + +/** + * e1000_copper_link_autoneg - Setup/Enable autoneg for copper link + * @hw: pointer to the HW structure + * + * Performs initial bounds checking on autoneg advertisement parameter, then + * configure to advertise the full capability. Setup the PHY to autoneg + * and restart the negotiation process between the link partner. If + * autoneg_wait_to_complete, then wait for autoneg to complete before exiting. + **/ +s32 e1000_copper_link_autoneg(struct e1000_hw *hw) +{ + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 phy_ctrl; + + DEBUGFUNC("e1000_copper_link_autoneg"); + + /* + * Perform some bounds checking on the autoneg advertisement + * parameter. + */ + phy->autoneg_advertised &= phy->autoneg_mask; + + /* + * If autoneg_advertised is zero, we assume it was not defaulted + * by the calling code so we set to advertise full capability. + */ + if (!phy->autoneg_advertised) + phy->autoneg_advertised = phy->autoneg_mask; + + DEBUGOUT("Reconfiguring auto-neg advertisement params\n"); + ret_val = e1000_phy_setup_autoneg(hw); + if (ret_val) { + DEBUGOUT("Error Setting up Auto-Negotiation\n"); + return ret_val; + } + DEBUGOUT("Restarting Auto-Neg\n"); + + /* + * Restart auto-negotiation by setting the Auto Neg Enable bit and + * the Auto Neg Restart bit in the PHY control register. + */ + ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_ctrl); + if (ret_val) + return ret_val; + + phy_ctrl |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG); + ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_ctrl); + if (ret_val) + return ret_val; + + /* + * Does the user want to wait for Auto-Neg to complete here, or + * check at a later time (for example, callback routine). + */ + if (phy->autoneg_wait_to_complete) { + ret_val = hw->mac.ops.wait_autoneg(hw); + if (ret_val) { + DEBUGOUT("Error while waiting for autoneg to complete\n"); + return ret_val; + } } -out: + hw->mac.get_link_status = TRUE; + return ret_val; } @@ -1668,7 +1699,7 @@ s32 e1000_setup_copper_link_generic(struct e1000_hw *hw) */ ret_val = e1000_copper_link_autoneg(hw); if (ret_val) - goto out; + return ret_val; } else { /* * PHY will be set to 10H, 10F, 100H or 100F @@ -1678,7 +1709,7 @@ s32 e1000_setup_copper_link_generic(struct e1000_hw *hw) ret_val = hw->phy.ops.force_speed_duplex(hw); if (ret_val) { DEBUGOUT("Error Forcing Speed and Duplex\n"); - goto out; + return ret_val; } } @@ -1689,17 +1720,16 @@ s32 e1000_setup_copper_link_generic(struct e1000_hw *hw) ret_val = e1000_phy_has_link_generic(hw, COPPER_LINK_UP_LIMIT, 10, &link); if (ret_val) - goto out; + return ret_val; if (link) { DEBUGOUT("Valid link established!!!\n"); - e1000_config_collision_dist_generic(hw); + hw->mac.ops.config_collision_dist(hw); ret_val = e1000_config_fc_after_link_up_generic(hw); } else { DEBUGOUT("Unable to establish link!!!\n"); } -out: return ret_val; } @@ -1722,13 +1752,13 @@ s32 e1000_phy_force_speed_duplex_igp(struct e1000_hw *hw) ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_data); if (ret_val) - goto out; + return ret_val; e1000_phy_force_speed_duplex_setup(hw, &phy_data); ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_data); if (ret_val) - goto out; + return ret_val; /* * Clear Auto-Crossover to force MDI manually. IGP requires MDI @@ -1736,14 +1766,14 @@ s32 e1000_phy_force_speed_duplex_igp(struct e1000_hw *hw) */ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data); if (ret_val) - goto out; + return ret_val; phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX; phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX; ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data); if (ret_val) - goto out; + return ret_val; DEBUGOUT1("IGP PSCR: %X\n", phy_data); @@ -1755,7 +1785,7 @@ s32 e1000_phy_force_speed_duplex_igp(struct e1000_hw *hw) ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT, 100000, &link); if (ret_val) - goto out; + return ret_val; if (!link) DEBUGOUT("Link taking longer than expected.\n"); @@ -1763,11 +1793,8 @@ s32 e1000_phy_force_speed_duplex_igp(struct e1000_hw *hw) /* Try once more */ ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT, 100000, &link); - if (ret_val) - goto out; } -out: return ret_val; } @@ -1796,29 +1823,29 @@ s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw) */ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); if (ret_val) - goto out; + return ret_val; phy_data &= ~M88E1000_PSCR_AUTO_X_MODE; ret_val = phy->ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); if (ret_val) - goto out; + return ret_val; DEBUGOUT1("M88E1000 PSCR: %X\n", phy_data); ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_data); if (ret_val) - goto out; + return ret_val; e1000_phy_force_speed_duplex_setup(hw, &phy_data); ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_data); if (ret_val) - goto out; + return ret_val; /* Reset the phy to commit changes. */ ret_val = hw->phy.ops.commit(hw); if (ret_val) - goto out; + return ret_val; if (phy->autoneg_wait_to_complete) { DEBUGOUT("Waiting for forced speed/duplex link on M88 phy.\n"); @@ -1826,13 +1853,25 @@ s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw) ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT, 100000, &link); if (ret_val) - goto out; + return ret_val; if (!link) { - if (hw->phy.type != e1000_phy_m88 || - hw->phy.id == I347AT4_E_PHY_ID || - hw->phy.id == M88E1340M_E_PHY_ID || - hw->phy.id == M88E1112_E_PHY_ID) { + bool reset_dsp = TRUE; + + switch (hw->phy.id) { + case I347AT4_E_PHY_ID: + case M88E1340M_E_PHY_ID: + case M88E1112_E_PHY_ID: + case I210_I_PHY_ID: + reset_dsp = FALSE; + break; + default: + if (hw->phy.type != e1000_phy_m88) + reset_dsp = FALSE; + break; + } + + if (!reset_dsp) { DEBUGOUT("Link taking longer than expected.\n"); } else { /* @@ -1843,10 +1882,10 @@ s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw) M88E1000_PHY_PAGE_SELECT, 0x001d); if (ret_val) - goto out; + return ret_val; ret_val = e1000_phy_reset_dsp_generic(hw); if (ret_val) - goto out; + return ret_val; } } @@ -1854,18 +1893,21 @@ s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw) ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT, 100000, &link); if (ret_val) - goto out; + return ret_val; } - if (hw->phy.type != e1000_phy_m88 || - hw->phy.id == I347AT4_E_PHY_ID || - hw->phy.id == M88E1340M_E_PHY_ID || - hw->phy.id == M88E1112_E_PHY_ID) - goto out; + if (hw->phy.type != e1000_phy_m88) + return E1000_SUCCESS; + if (hw->phy.id == I347AT4_E_PHY_ID || + hw->phy.id == M88E1340M_E_PHY_ID || + hw->phy.id == M88E1112_E_PHY_ID) + return E1000_SUCCESS; + if (hw->phy.id == I210_I_PHY_ID) + return E1000_SUCCESS; ret_val = phy->ops.read_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data); if (ret_val) - goto out; + return ret_val; /* * Resetting the phy means we need to re-force TX_CLK in the @@ -1875,7 +1917,7 @@ s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw) phy_data |= M88E1000_EPSCR_TX_CLK_25; ret_val = phy->ops.write_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data); if (ret_val) - goto out; + return ret_val; /* * In addition, we must re-enable CRS on Tx for both half and full @@ -1883,12 +1925,11 @@ s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw) */ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); if (ret_val) - goto out; + return ret_val; phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX; ret_val = phy->ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); -out: return ret_val; } @@ -1911,25 +1952,25 @@ s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw) ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &data); if (ret_val) - goto out; + return ret_val; e1000_phy_force_speed_duplex_setup(hw, &data); ret_val = phy->ops.write_reg(hw, PHY_CONTROL, data); if (ret_val) - goto out; + return ret_val; /* Disable MDI-X support for 10/100 */ ret_val = phy->ops.read_reg(hw, IFE_PHY_MDIX_CONTROL, &data); if (ret_val) - goto out; + return ret_val; data &= ~IFE_PMC_AUTO_MDIX; data &= ~IFE_PMC_FORCE_MDIX; ret_val = phy->ops.write_reg(hw, IFE_PHY_MDIX_CONTROL, data); if (ret_val) - goto out; + return ret_val; DEBUGOUT1("IFE PMC: %X\n", data); @@ -1941,7 +1982,7 @@ s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw) ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT, 100000, &link); if (ret_val) - goto out; + return ret_val; if (!link) DEBUGOUT("Link taking longer than expected.\n"); @@ -1950,11 +1991,10 @@ s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw) ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT, 100000, &link); if (ret_val) - goto out; + return ret_val; } -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -2014,7 +2054,7 @@ void e1000_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl) DEBUGOUT("Forcing 10mb\n"); } - e1000_config_collision_dist_generic(hw); + hw->mac.ops.config_collision_dist(hw); E1000_WRITE_REG(hw, E1000_CTRL, ctrl); } @@ -2036,24 +2076,24 @@ void e1000_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl) s32 e1000_set_d3_lplu_state_generic(struct e1000_hw *hw, bool active) { struct e1000_phy_info *phy = &hw->phy; - s32 ret_val = E1000_SUCCESS; + s32 ret_val; u16 data; DEBUGFUNC("e1000_set_d3_lplu_state_generic"); - if (!(hw->phy.ops.read_reg)) - goto out; + if (!hw->phy.ops.read_reg) + return E1000_SUCCESS; ret_val = phy->ops.read_reg(hw, IGP02E1000_PHY_POWER_MGMT, &data); if (ret_val) - goto out; + return ret_val; if (!active) { data &= ~IGP02E1000_PM_D3_LPLU; ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT, data); if (ret_val) - goto out; + return ret_val; /* * LPLU and SmartSpeed are mutually exclusive. LPLU is used * during Dx states where the power conservation is most @@ -2065,27 +2105,27 @@ s32 e1000_set_d3_lplu_state_generic(struct e1000_hw *hw, bool active) IGP01E1000_PHY_PORT_CONFIG, &data); if (ret_val) - goto out; + return ret_val; data |= IGP01E1000_PSCFR_SMART_SPEED; ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CONFIG, data); if (ret_val) - goto out; + return ret_val; } else if (phy->smart_speed == e1000_smart_speed_off) { ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &data); if (ret_val) - goto out; + return ret_val; data &= ~IGP01E1000_PSCFR_SMART_SPEED; ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CONFIG, data); if (ret_val) - goto out; + return ret_val; } } else if ((phy->autoneg_advertised == E1000_ALL_SPEED_DUPLEX) || (phy->autoneg_advertised == E1000_ALL_NOT_GIG) || @@ -2094,20 +2134,19 @@ s32 e1000_set_d3_lplu_state_generic(struct e1000_hw *hw, bool active) ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT, data); if (ret_val) - goto out; + return ret_val; /* When LPLU is enabled, we should disable SmartSpeed */ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &data); if (ret_val) - goto out; + return ret_val; data &= ~IGP01E1000_PSCFR_SMART_SPEED; ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CONFIG, data); } -out: return ret_val; } @@ -2128,6 +2167,7 @@ s32 e1000_check_downshift_generic(struct e1000_hw *hw) DEBUGFUNC("e1000_check_downshift_generic"); switch (phy->type) { + case e1000_phy_i210: case e1000_phy_m88: case e1000_phy_gg82563: case e1000_phy_bm: @@ -2144,16 +2184,14 @@ s32 e1000_check_downshift_generic(struct e1000_hw *hw) default: /* speed downshift not supported */ phy->speed_downgraded = FALSE; - ret_val = E1000_SUCCESS; - goto out; + return E1000_SUCCESS; } ret_val = phy->ops.read_reg(hw, offset, &phy_data); if (!ret_val) - phy->speed_downgraded = (phy_data & mask) ? TRUE : FALSE; + phy->speed_downgraded = !!(phy_data & mask); -out: return ret_val; } @@ -2206,7 +2244,7 @@ s32 e1000_check_polarity_igp(struct e1000_hw *hw) */ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_STATUS, &data); if (ret_val) - goto out; + return ret_val; if ((data & IGP01E1000_PSSR_SPEED_MASK) == IGP01E1000_PSSR_SPEED_1000MBPS) { @@ -2228,7 +2266,6 @@ s32 e1000_check_polarity_igp(struct e1000_hw *hw) ? e1000_rev_polarity_reversed : e1000_rev_polarity_normal; -out: return ret_val; } @@ -2281,7 +2318,7 @@ s32 e1000_wait_autoneg_generic(struct e1000_hw *hw) DEBUGFUNC("e1000_wait_autoneg_generic"); - if (!(hw->phy.ops.read_reg)) + if (!hw->phy.ops.read_reg) return E1000_SUCCESS; /* Break after autoneg completes or PHY_AUTO_NEG_LIMIT expires. */ @@ -2321,7 +2358,7 @@ s32 e1000_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, DEBUGFUNC("e1000_phy_has_link_generic"); - if (!(hw->phy.ops.read_reg)) + if (!hw->phy.ops.read_reg) return E1000_SUCCESS; for (i = 0; i < iterations; i++) { @@ -2349,7 +2386,7 @@ s32 e1000_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, usec_delay(usec_interval); } - *success = (i < iterations) ? TRUE : FALSE; + *success = (i < iterations); return ret_val; } @@ -2379,22 +2416,20 @@ s32 e1000_get_cable_length_m88(struct e1000_hw *hw) ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); if (ret_val) - goto out; + return ret_val; index = (phy_data & M88E1000_PSSR_CABLE_LENGTH) >> M88E1000_PSSR_CABLE_LENGTH_SHIFT; - if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE - 1) { - ret_val = -E1000_ERR_PHY; - goto out; - } + + if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE - 1) + return -E1000_ERR_PHY; phy->min_cable_length = e1000_m88_cable_length_table[index]; phy->max_cable_length = e1000_m88_cable_length_table[index + 1]; phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2; -out: - return ret_val; + return E1000_SUCCESS; } s32 e1000_get_cable_length_m88_gen2(struct e1000_hw *hw) @@ -2406,28 +2441,49 @@ s32 e1000_get_cable_length_m88_gen2(struct e1000_hw *hw) DEBUGFUNC("e1000_get_cable_length_m88_gen2"); switch (hw->phy.id) { + case I210_I_PHY_ID: + /* Get cable length from PHY Cable Diagnostics Control Reg */ + ret_val = phy->ops.read_reg(hw, (0x7 << GS40G_PAGE_SHIFT) + + (I347AT4_PCDL + phy->addr), + &phy_data); + if (ret_val) + return ret_val; + + /* Check if the unit of cable length is meters or cm */ + ret_val = phy->ops.read_reg(hw, (0x7 << GS40G_PAGE_SHIFT) + + I347AT4_PCDC, &phy_data2); + if (ret_val) + return ret_val; + + is_cm = !(phy_data2 & I347AT4_PCDC_CABLE_LENGTH_UNIT); + + /* Populate the phy structure with cable length in meters */ + phy->min_cable_length = phy_data / (is_cm ? 100 : 1); + phy->max_cable_length = phy_data / (is_cm ? 100 : 1); + phy->cable_length = phy_data / (is_cm ? 100 : 1); + break; case M88E1340M_E_PHY_ID: case I347AT4_E_PHY_ID: /* Remember the original page select and set it to 7 */ ret_val = phy->ops.read_reg(hw, I347AT4_PAGE_SELECT, &default_page); if (ret_val) - goto out; + return ret_val; ret_val = phy->ops.write_reg(hw, I347AT4_PAGE_SELECT, 0x07); if (ret_val) - goto out; + return ret_val; /* Get cable length from PHY Cable Diagnostics Control Reg */ ret_val = phy->ops.read_reg(hw, (I347AT4_PCDL + phy->addr), &phy_data); if (ret_val) - goto out; + return ret_val; /* Check if the unit of cable length is meters or cm */ ret_val = phy->ops.read_reg(hw, I347AT4_PCDC, &phy_data2); if (ret_val) - goto out; + return ret_val; is_cm = !(phy_data2 & I347AT4_PCDC_CABLE_LENGTH_UNIT); @@ -2440,30 +2496,30 @@ s32 e1000_get_cable_length_m88_gen2(struct e1000_hw *hw) ret_val = phy->ops.write_reg(hw, I347AT4_PAGE_SELECT, default_page); if (ret_val) - goto out; + return ret_val; break; + case M88E1112_E_PHY_ID: /* Remember the original page select and set it to 5 */ ret_val = phy->ops.read_reg(hw, I347AT4_PAGE_SELECT, &default_page); if (ret_val) - goto out; + return ret_val; ret_val = phy->ops.write_reg(hw, I347AT4_PAGE_SELECT, 0x05); if (ret_val) - goto out; + return ret_val; ret_val = phy->ops.read_reg(hw, M88E1112_VCT_DSP_DISTANCE, &phy_data); if (ret_val) - goto out; + return ret_val; index = (phy_data & M88E1000_PSSR_CABLE_LENGTH) >> M88E1000_PSSR_CABLE_LENGTH_SHIFT; - if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE - 1) { - ret_val = -E1000_ERR_PHY; - goto out; - } + + if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE - 1) + return -E1000_ERR_PHY; phy->min_cable_length = e1000_m88_cable_length_table[index]; phy->max_cable_length = e1000_m88_cable_length_table[index + 1]; @@ -2475,15 +2531,13 @@ s32 e1000_get_cable_length_m88_gen2(struct e1000_hw *hw) ret_val = phy->ops.write_reg(hw, I347AT4_PAGE_SELECT, default_page); if (ret_val) - goto out; + return ret_val; break; default: - ret_val = -E1000_ERR_PHY; - goto out; + return -E1000_ERR_PHY; } -out: return ret_val; } @@ -2501,7 +2555,7 @@ out: s32 e1000_get_cable_length_igp_2(struct e1000_hw *hw) { struct e1000_phy_info *phy = &hw->phy; - s32 ret_val = E1000_SUCCESS; + s32 ret_val; u16 phy_data, i, agc_value = 0; u16 cur_agc_index, max_agc_index = 0; u16 min_agc_index = IGP02E1000_CABLE_LENGTH_TABLE_SIZE - 1; @@ -2518,7 +2572,7 @@ s32 e1000_get_cable_length_igp_2(struct e1000_hw *hw) for (i = 0; i < IGP02E1000_PHY_CHANNEL_NUM; i++) { ret_val = phy->ops.read_reg(hw, agc_reg_array[i], &phy_data); if (ret_val) - goto out; + return ret_val; /* * Getting bits 15:9, which represent the combination of @@ -2531,10 +2585,8 @@ s32 e1000_get_cable_length_igp_2(struct e1000_hw *hw) /* Array index bound check. */ if ((cur_agc_index >= IGP02E1000_CABLE_LENGTH_TABLE_SIZE) || - (cur_agc_index == 0)) { - ret_val = -E1000_ERR_PHY; - goto out; - } + (cur_agc_index == 0)) + return -E1000_ERR_PHY; /* Remove min & max AGC values from calculation. */ if (e1000_igp_2_cable_length_table[min_agc_index] > @@ -2558,8 +2610,7 @@ s32 e1000_get_cable_length_igp_2(struct e1000_hw *hw) phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2; -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -2583,45 +2634,43 @@ s32 e1000_get_phy_info_m88(struct e1000_hw *hw) if (phy->media_type != e1000_media_type_copper) { DEBUGOUT("Phy info is only valid for copper media\n"); - ret_val = -E1000_ERR_CONFIG; - goto out; + return -E1000_ERR_CONFIG; } ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); if (ret_val) - goto out; + return ret_val; if (!link) { DEBUGOUT("Phy info is only valid if link is up\n"); - ret_val = -E1000_ERR_CONFIG; - goto out; + return -E1000_ERR_CONFIG; } ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); if (ret_val) - goto out; + return ret_val; - phy->polarity_correction = (phy_data & M88E1000_PSCR_POLARITY_REVERSAL) - ? TRUE : FALSE; + phy->polarity_correction = !!(phy_data & + M88E1000_PSCR_POLARITY_REVERSAL); ret_val = e1000_check_polarity_m88(hw); if (ret_val) - goto out; + return ret_val; ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); if (ret_val) - goto out; + return ret_val; - phy->is_mdix = (phy_data & M88E1000_PSSR_MDIX) ? TRUE : FALSE; + phy->is_mdix = !!(phy_data & M88E1000_PSSR_MDIX); if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) { ret_val = hw->phy.ops.get_cable_length(hw); if (ret_val) - goto out; + return ret_val; ret_val = phy->ops.read_reg(hw, PHY_1000T_STATUS, &phy_data); if (ret_val) - goto out; + return ret_val; phy->local_rx = (phy_data & SR_1000T_LOCAL_RX_STATUS) ? e1000_1000t_rx_status_ok @@ -2637,7 +2686,6 @@ s32 e1000_get_phy_info_m88(struct e1000_hw *hw) phy->remote_rx = e1000_1000t_rx_status_undefined; } -out: return ret_val; } @@ -2661,35 +2709,34 @@ s32 e1000_get_phy_info_igp(struct e1000_hw *hw) ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); if (ret_val) - goto out; + return ret_val; if (!link) { DEBUGOUT("Phy info is only valid if link is up\n"); - ret_val = -E1000_ERR_CONFIG; - goto out; + return -E1000_ERR_CONFIG; } phy->polarity_correction = TRUE; ret_val = e1000_check_polarity_igp(hw); if (ret_val) - goto out; + return ret_val; ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_STATUS, &data); if (ret_val) - goto out; + return ret_val; - phy->is_mdix = (data & IGP01E1000_PSSR_MDIX) ? TRUE : FALSE; + phy->is_mdix = !!(data & IGP01E1000_PSSR_MDIX); if ((data & IGP01E1000_PSSR_SPEED_MASK) == IGP01E1000_PSSR_SPEED_1000MBPS) { ret_val = phy->ops.get_cable_length(hw); if (ret_val) - goto out; + return ret_val; ret_val = phy->ops.read_reg(hw, PHY_1000T_STATUS, &data); if (ret_val) - goto out; + return ret_val; phy->local_rx = (data & SR_1000T_LOCAL_RX_STATUS) ? e1000_1000t_rx_status_ok @@ -2704,7 +2751,6 @@ s32 e1000_get_phy_info_igp(struct e1000_hw *hw) phy->remote_rx = e1000_1000t_rx_status_undefined; } -out: return ret_val; } @@ -2725,24 +2771,22 @@ s32 e1000_get_phy_info_ife(struct e1000_hw *hw) ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); if (ret_val) - goto out; + return ret_val; if (!link) { DEBUGOUT("Phy info is only valid if link is up\n"); - ret_val = -E1000_ERR_CONFIG; - goto out; + return -E1000_ERR_CONFIG; } ret_val = phy->ops.read_reg(hw, IFE_PHY_SPECIAL_CONTROL, &data); if (ret_val) - goto out; - phy->polarity_correction = (data & IFE_PSC_AUTO_POLARITY_DISABLE) - ? FALSE : TRUE; + return ret_val; + phy->polarity_correction = !(data & IFE_PSC_AUTO_POLARITY_DISABLE); if (phy->polarity_correction) { ret_val = e1000_check_polarity_ife(hw); if (ret_val) - goto out; + return ret_val; } else { /* Polarity is forced */ phy->cable_polarity = (data & IFE_PSC_FORCE_POLARITY) @@ -2752,17 +2796,16 @@ s32 e1000_get_phy_info_ife(struct e1000_hw *hw) ret_val = phy->ops.read_reg(hw, IFE_PHY_MDIX_CONTROL, &data); if (ret_val) - goto out; + return ret_val; - phy->is_mdix = (data & IFE_PMC_MDIX_STATUS) ? TRUE : FALSE; + phy->is_mdix = !!(data & IFE_PMC_MDIX_STATUS); /* The following parameters are undefined for 10/100 operation. */ phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED; phy->local_rx = e1000_1000t_rx_status_undefined; phy->remote_rx = e1000_1000t_rx_status_undefined; -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -2774,26 +2817,25 @@ out: **/ s32 e1000_phy_sw_reset_generic(struct e1000_hw *hw) { - s32 ret_val = E1000_SUCCESS; + s32 ret_val; u16 phy_ctrl; DEBUGFUNC("e1000_phy_sw_reset_generic"); - if (!(hw->phy.ops.read_reg)) - goto out; + if (!hw->phy.ops.read_reg) + return E1000_SUCCESS; ret_val = hw->phy.ops.read_reg(hw, PHY_CONTROL, &phy_ctrl); if (ret_val) - goto out; + return ret_val; phy_ctrl |= MII_CR_RESET; ret_val = hw->phy.ops.write_reg(hw, PHY_CONTROL, phy_ctrl); if (ret_val) - goto out; + return ret_val; usec_delay(1); -out: return ret_val; } @@ -2809,20 +2851,20 @@ out: s32 e1000_phy_hw_reset_generic(struct e1000_hw *hw) { struct e1000_phy_info *phy = &hw->phy; - s32 ret_val = E1000_SUCCESS; + s32 ret_val; u32 ctrl; DEBUGFUNC("e1000_phy_hw_reset_generic"); - ret_val = phy->ops.check_reset_block(hw); - if (ret_val) { - ret_val = E1000_SUCCESS; - goto out; + if (phy->ops.check_reset_block) { + ret_val = phy->ops.check_reset_block(hw); + if (ret_val) + return E1000_SUCCESS; } ret_val = phy->ops.acquire(hw); if (ret_val) - goto out; + return ret_val; ctrl = E1000_READ_REG(hw, E1000_CTRL); E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_PHY_RST); @@ -2837,10 +2879,7 @@ s32 e1000_phy_hw_reset_generic(struct e1000_hw *hw) phy->ops.release(hw); - ret_val = phy->ops.get_cfg_done(hw); - -out: - return ret_val; + return phy->ops.get_cfg_done(hw); } /** @@ -2994,6 +3033,9 @@ enum e1000_phy_type e1000_get_phy_type_from_id(u32 phy_id) case I82580_I_PHY_ID: phy_type = e1000_phy_82580; break; + case I210_I_PHY_ID: + phy_type = e1000_phy_i210; + break; default: phy_type = e1000_phy_unknown; break; @@ -3011,7 +3053,6 @@ enum e1000_phy_type e1000_get_phy_type_from_id(u32 phy_id) **/ s32 e1000_determine_phy_address(struct e1000_hw *hw) { - s32 ret_val = -E1000_ERR_PHY_TYPE; u32 phy_addr = 0; u32 i; enum e1000_phy_type phy_type = e1000_phy_unknown; @@ -3030,17 +3071,15 @@ s32 e1000_determine_phy_address(struct e1000_hw *hw) * If phy_type is valid, break - we found our * PHY address */ - if (phy_type != e1000_phy_unknown) { - ret_val = E1000_SUCCESS; - goto out; - } + if (phy_type != e1000_phy_unknown) + return E1000_SUCCESS; + msec_delay(1); i++; } while (i < 10); } -out: - return ret_val; + return -E1000_ERR_PHY_TYPE; } /** @@ -3083,7 +3122,7 @@ s32 e1000_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data) if (page == BM_WUC_PAGE) { ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data, FALSE, FALSE); - goto out; + goto release; } hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); @@ -3108,13 +3147,13 @@ s32 e1000_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data) ret_val = e1000_write_phy_reg_mdic(hw, page_select, (page << page_shift)); if (ret_val) - goto out; + goto release; } ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, data); -out: +release: hw->phy.ops.release(hw); return ret_val; } @@ -3144,7 +3183,7 @@ s32 e1000_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data) if (page == BM_WUC_PAGE) { ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data, TRUE, FALSE); - goto out; + goto release; } hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); @@ -3169,12 +3208,12 @@ s32 e1000_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data) ret_val = e1000_write_phy_reg_mdic(hw, page_select, (page << page_shift)); if (ret_val) - goto out; + goto release; } ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, data); -out: +release: hw->phy.ops.release(hw); return ret_val; } @@ -3204,7 +3243,7 @@ s32 e1000_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data) if (page == BM_WUC_PAGE) { ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data, TRUE, FALSE); - goto out; + goto release; } hw->phy.addr = 1; @@ -3216,12 +3255,12 @@ s32 e1000_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data) page); if (ret_val) - goto out; + goto release; } ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, data); -out: +release: hw->phy.ops.release(hw); return ret_val; } @@ -3250,7 +3289,7 @@ s32 e1000_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data) if (page == BM_WUC_PAGE) { ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data, FALSE, FALSE); - goto out; + goto release; } hw->phy.addr = 1; @@ -3261,13 +3300,13 @@ s32 e1000_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data) page); if (ret_val) - goto out; + goto release; } ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, data); -out: +release: hw->phy.ops.release(hw); return ret_val; } @@ -3287,10 +3326,8 @@ s32 e1000_enable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg) DEBUGFUNC("e1000_enable_phy_wakeup_reg_access_bm"); - if (!phy_reg) { - ret_val = -E1000_ERR_PARAM; - goto out; - } + if (!phy_reg) + return -E1000_ERR_PARAM; /* All page select, port ctrl and wakeup registers use phy address 1 */ hw->phy.addr = 1; @@ -3299,14 +3336,14 @@ s32 e1000_enable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg) ret_val = e1000_set_page_igp(hw, (BM_PORT_CTRL_PAGE << IGP_PAGE_SHIFT)); if (ret_val) { DEBUGOUT("Could not set Port Control page\n"); - goto out; + return ret_val; } ret_val = e1000_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg); if (ret_val) { DEBUGOUT2("Could not read PHY register %d.%d\n", BM_PORT_CTRL_PAGE, BM_WUC_ENABLE_REG); - goto out; + return ret_val; } /* @@ -3321,15 +3358,14 @@ s32 e1000_enable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg) if (ret_val) { DEBUGOUT2("Could not write PHY register %d.%d\n", BM_PORT_CTRL_PAGE, BM_WUC_ENABLE_REG); - goto out; + return ret_val; } - /* Select Host Wakeup Registers page */ - ret_val = e1000_set_page_igp(hw, (BM_WUC_PAGE << IGP_PAGE_SHIFT)); - - /* caller now able to write registers on the Wakeup registers page */ -out: - return ret_val; + /* + * Select Host Wakeup Registers page - caller now able to write + * registers on the Wakeup registers page + */ + return e1000_set_page_igp(hw, (BM_WUC_PAGE << IGP_PAGE_SHIFT)); } /** @@ -3356,7 +3392,7 @@ s32 e1000_disable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg) ret_val = e1000_set_page_igp(hw, (BM_PORT_CTRL_PAGE << IGP_PAGE_SHIFT)); if (ret_val) { DEBUGOUT("Could not set Port Control page\n"); - goto out; + return ret_val; } /* Restore 769.17 to its original value */ @@ -3364,7 +3400,7 @@ s32 e1000_disable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg) if (ret_val) DEBUGOUT2("Could not restore PHY register %d.%d\n", BM_PORT_CTRL_PAGE, BM_WUC_ENABLE_REG); -out: + return ret_val; } @@ -3413,7 +3449,7 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, ret_val = e1000_enable_phy_wakeup_reg_access_bm(hw, &phy_reg); if (ret_val) { DEBUGOUT("Could not enable PHY wakeup reg access\n"); - goto out; + return ret_val; } } @@ -3423,7 +3459,7 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, ret_val = e1000_write_phy_reg_mdic(hw, BM_WUC_ADDRESS_OPCODE, reg); if (ret_val) { DEBUGOUT1("Could not write address opcode to page %d\n", page); - goto out; + return ret_val; } if (read) { @@ -3438,13 +3474,12 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, if (ret_val) { DEBUGOUT2("Could not access PHY reg %d.%d\n", page, reg); - goto out; + return ret_val; } if (!page_set) ret_val = e1000_disable_phy_wakeup_reg_access_bm(hw, &phy_reg); -out: return ret_val; } @@ -3459,10 +3494,16 @@ out: void e1000_power_up_phy_copper(struct e1000_hw *hw) { u16 mii_reg = 0; + u16 power_reg = 0; /* The PHY will retain its settings across a power down/up cycle */ hw->phy.ops.read_reg(hw, PHY_CONTROL, &mii_reg); mii_reg &= ~MII_CR_POWER_DOWN; + if (hw->phy.type == e1000_phy_i210) { + hw->phy.ops.read_reg(hw, GS40G_COPPER_SPEC, &power_reg); + power_reg &= ~GS40G_CS_POWER_DOWN; + hw->phy.ops.write_reg(hw, GS40G_COPPER_SPEC, power_reg); + } hw->phy.ops.write_reg(hw, PHY_CONTROL, mii_reg); } @@ -3477,10 +3518,17 @@ void e1000_power_up_phy_copper(struct e1000_hw *hw) void e1000_power_down_phy_copper(struct e1000_hw *hw) { u16 mii_reg = 0; + u16 power_reg = 0; /* The PHY will retain its settings across a power down/up cycle */ hw->phy.ops.read_reg(hw, PHY_CONTROL, &mii_reg); mii_reg |= MII_CR_POWER_DOWN; + /* i210 Phy requires an additional bit for power up/down */ + if (hw->phy.type == e1000_phy_i210) { + hw->phy.ops.read_reg(hw, GS40G_COPPER_SPEC, &power_reg); + power_reg |= GS40G_CS_POWER_DOWN; + hw->phy.ops.write_reg(hw, GS40G_COPPER_SPEC, power_reg); + } hw->phy.ops.write_reg(hw, PHY_CONTROL, mii_reg); msec_delay(1); } @@ -3646,7 +3694,7 @@ static s32 __e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data, if ((hw->phy.type == e1000_phy_82578) && (hw->phy.revision >= 1) && (hw->phy.addr == 2) && - ((MAX_PHY_REG_ADDRESS & reg) == 0) && + !(MAX_PHY_REG_ADDRESS & reg) && (data & (1 << 11))) { u16 data2 = 0x7EFF; ret_val = e1000_access_phy_debug_regs_hv(hw, @@ -3770,7 +3818,7 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset, ret_val = e1000_write_phy_reg_mdic(hw, addr_reg, (u16)offset & 0x3F); if (ret_val) { DEBUGOUT("Could not write the Address Offset port register\n"); - goto out; + return ret_val; } /* Read or write the data value next */ @@ -3779,12 +3827,9 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset, else ret_val = e1000_write_phy_reg_mdic(hw, data_reg, *data); - if (ret_val) { + if (ret_val) DEBUGOUT("Could not access the Data port register\n"); - goto out; - } -out: return ret_val; } @@ -3807,24 +3852,24 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw) DEBUGFUNC("e1000_link_stall_workaround_hv"); if (hw->phy.type != e1000_phy_82578) - goto out; + return E1000_SUCCESS; /* Do not apply workaround if in PHY loopback bit 14 set */ hw->phy.ops.read_reg(hw, PHY_CONTROL, &data); if (data & PHY_CONTROL_LB) - goto out; + return E1000_SUCCESS; /* check if link is up and at 1Gbps */ ret_val = hw->phy.ops.read_reg(hw, BM_CS_STATUS, &data); if (ret_val) - goto out; + return ret_val; data &= BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED | BM_CS_STATUS_SPEED_MASK; if (data != (BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED | BM_CS_STATUS_SPEED_1000)) - goto out; + return E1000_SUCCESS; msec_delay(200); @@ -3833,13 +3878,10 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw) HV_MUX_DATA_CTRL_GEN_TO_MAC | HV_MUX_DATA_CTRL_FORCE_SPEED); if (ret_val) - goto out; + return ret_val; - ret_val = hw->phy.ops.write_reg(hw, HV_MUX_DATA_CTRL, - HV_MUX_DATA_CTRL_GEN_TO_MAC); - -out: - return ret_val; + return hw->phy.ops.write_reg(hw, HV_MUX_DATA_CTRL, + HV_MUX_DATA_CTRL_GEN_TO_MAC); } /** @@ -3885,13 +3927,13 @@ s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw) ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_data); if (ret_val) - goto out; + return ret_val; e1000_phy_force_speed_duplex_setup(hw, &phy_data); ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_data); if (ret_val) - goto out; + return ret_val; usec_delay(1); @@ -3901,7 +3943,7 @@ s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw) ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT, 100000, &link); if (ret_val) - goto out; + return ret_val; if (!link) DEBUGOUT("Link taking longer than expected.\n"); @@ -3909,11 +3951,8 @@ s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw) /* Try once more */ ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT, 100000, &link); - if (ret_val) - goto out; } -out: return ret_val; } @@ -3937,35 +3976,34 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw) ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); if (ret_val) - goto out; + return ret_val; if (!link) { DEBUGOUT("Phy info is only valid if link is up\n"); - ret_val = -E1000_ERR_CONFIG; - goto out; + return -E1000_ERR_CONFIG; } phy->polarity_correction = TRUE; ret_val = e1000_check_polarity_82577(hw); if (ret_val) - goto out; + return ret_val; ret_val = phy->ops.read_reg(hw, I82577_PHY_STATUS_2, &data); if (ret_val) - goto out; + return ret_val; - phy->is_mdix = (data & I82577_PHY_STATUS2_MDIX) ? TRUE : FALSE; + phy->is_mdix = !!(data & I82577_PHY_STATUS2_MDIX); if ((data & I82577_PHY_STATUS2_SPEED_MASK) == I82577_PHY_STATUS2_SPEED_1000MBPS) { ret_val = hw->phy.ops.get_cable_length(hw); if (ret_val) - goto out; + return ret_val; ret_val = phy->ops.read_reg(hw, PHY_1000T_STATUS, &data); if (ret_val) - goto out; + return ret_val; phy->local_rx = (data & SR_1000T_LOCAL_RX_STATUS) ? e1000_1000t_rx_status_ok @@ -3980,8 +4018,7 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw) phy->remote_rx = e1000_1000t_rx_status_undefined; } -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -4001,7 +4038,7 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw) ret_val = phy->ops.read_reg(hw, I82577_PHY_DIAG_STATUS, &phy_data); if (ret_val) - goto out; + return ret_val; length = (phy_data & I82577_DSTATUS_CABLE_LENGTH) >> I82577_DSTATUS_CABLE_LENGTH_SHIFT; @@ -4011,6 +4048,68 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw) phy->cable_length = length; -out: + return E1000_SUCCESS; +} + +/** + * e1000_write_phy_reg_gs40g - Write GS40G PHY register + * @hw: pointer to the HW structure + * @offset: register offset to write to + * @data: data to write at register offset + * + * Acquires semaphore, if necessary, then writes the data to PHY register + * at the offset. Release any acquired semaphores before exiting. + **/ +s32 e1000_write_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 data) +{ + s32 ret_val; + u16 page = offset >> GS40G_PAGE_SHIFT; + + DEBUGFUNC("e1000_write_phy_reg_gs40g"); + + offset = offset & GS40G_OFFSET_MASK; + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + return ret_val; + + ret_val = e1000_write_phy_reg_mdic(hw, GS40G_PAGE_SELECT, page); + if (ret_val) + goto release; + ret_val = e1000_write_phy_reg_mdic(hw, offset, data); + +release: + hw->phy.ops.release(hw); + return ret_val; +} + +/** + * e1000_read_phy_reg_gs40g - Read GS40G PHY register + * @hw: pointer to the HW structure + * @offset: lower half is register offset to read to + * upper half is page to use. + * @data: data to read at register offset + * + * Acquires semaphore, if necessary, then reads the data in the PHY register + * at the offset. Release any acquired semaphores before exiting. + **/ +s32 e1000_read_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 *data) +{ + s32 ret_val; + u16 page = offset >> GS40G_PAGE_SHIFT; + + DEBUGFUNC("e1000_read_phy_reg_gs40g"); + + offset = offset & GS40G_OFFSET_MASK; + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + return ret_val; + + ret_val = e1000_write_phy_reg_mdic(hw, GS40G_PAGE_SELECT, page); + if (ret_val) + goto release; + ret_val = e1000_read_phy_reg_mdic(hw, offset, data); + +release: + hw->phy.ops.release(hw); return ret_val; } diff --git a/sys/dev/e1000/e1000_phy.h b/sys/dev/e1000/e1000_phy.h index 93d0afc47a4..edcbcabe446 100644 --- a/sys/dev/e1000/e1000_phy.h +++ b/sys/dev/e1000/e1000_phy.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2011, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -41,6 +41,10 @@ void e1000_null_phy_generic(struct e1000_hw *hw); s32 e1000_null_lplu_state(struct e1000_hw *hw, bool active); s32 e1000_null_write_reg(struct e1000_hw *hw, u32 offset, u16 data); s32 e1000_null_set_page(struct e1000_hw *hw, u16 data); +s32 e1000_read_i2c_byte_null(struct e1000_hw *hw, u8 byte_offset, + u8 dev_addr, u8 *data); +s32 e1000_write_i2c_byte_null(struct e1000_hw *hw, u8 byte_offset, + u8 dev_addr, u8 data); s32 e1000_check_downshift_generic(struct e1000_hw *hw); s32 e1000_check_polarity_m88(struct e1000_hw *hw); s32 e1000_check_polarity_igp(struct e1000_hw *hw); @@ -112,6 +116,8 @@ s32 e1000_check_polarity_82577(struct e1000_hw *hw); s32 e1000_get_phy_info_82577(struct e1000_hw *hw); s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw); s32 e1000_get_cable_length_82577(struct e1000_hw *hw); +s32 e1000_write_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 data); +s32 e1000_read_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 *data); #define E1000_MAX_PHY_ADDR 8 @@ -128,6 +134,17 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw); #define IGP_PAGE_SHIFT 5 #define PHY_REG_MASK 0x1F +/* GS40G - I210 PHY defines */ +#define GS40G_PAGE_SELECT 0x16 +#define GS40G_PAGE_SHIFT 16 +#define GS40G_OFFSET_MASK 0xFFFF +#define GS40G_PAGE_2 0x20000 +#define GS40G_MAC_REG2 0x15 +#define GS40G_MAC_LB 0x4140 +#define GS40G_MAC_SPEED_1G 0X0006 +#define GS40G_COPPER_SPEC 0x0010 +#define GS40G_CS_POWER_DOWN 0x0002 + /* BM/HV Specific Registers */ #define BM_PORT_CTRL_PAGE 769 #define BM_PCIE_PAGE 770 @@ -174,8 +191,9 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw); #define I82577_PHY_STATUS2_SPEED_100MBPS 0x0100 /* I82577 PHY Control 2 */ -#define I82577_PHY_CTRL2_AUTO_MDIX 0x0400 -#define I82577_PHY_CTRL2_FORCE_MDI_MDIX 0x0200 +#define I82577_PHY_CTRL2_MANUAL_MDIX 0x0200 +#define I82577_PHY_CTRL2_AUTO_MDI_MDIX 0x0400 +#define I82577_PHY_CTRL2_MDIX_CFG_MASK 0x0600 /* I82577 PHY Diagnostics Status */ #define I82577_DSTATUS_CABLE_LENGTH 0x03FC diff --git a/sys/dev/e1000/e1000_regs.h b/sys/dev/e1000/e1000_regs.h index 2cc89d50824..8c4e4afd13b 100644 --- a/sys/dev/e1000/e1000_regs.h +++ b/sys/dev/e1000/e1000_regs.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2011, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -51,6 +51,7 @@ #define E1000_BARCTRL_FLSIZE 0x0700 /* BAR ctrl Flsize */ #define E1000_BARCTRL_CSRSIZE 0x2000 /* BAR ctrl CSR size */ #define E1000_I350_BARCTRL 0x5BFC /* BAR ctrl reg */ +#define E1000_I350_DTXMXPKTSZ 0x355C /* Maximum sent packet size reg*/ #define E1000_SCTL 0x00024 /* SerDes Control - RW */ #define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */ #define E1000_FCAH 0x0002C /* Flow Control Address High -RW */ @@ -143,6 +144,62 @@ #define E1000_PBRWAC 0x024E8 /* Rx packet buffer wrap around counter - RO */ #define E1000_RDTR 0x02820 /* Rx Delay Timer - RW */ #define E1000_RADV 0x0282C /* Rx Interrupt Absolute Delay Timer - RW */ +#define E1000_SRWR 0x12018 /* Shadow Ram Write Register - RW */ +#define E1000_I210_FLMNGCTL 0x12038 +#define E1000_I210_FLMNGDATA 0x1203C +#define E1000_I210_FLMNGCNT 0x12040 + +#define E1000_I210_FLSWCTL 0x12048 +#define E1000_I210_FLSWDATA 0x1204C +#define E1000_I210_FLSWCNT 0x12050 + +#define E1000_I210_FLA 0x1201C + +#define E1000_INVM_DATA_REG(_n) (0x12120 + 4*(_n)) +#define E1000_INVM_SIZE 64 /* Number of INVM Data Registers */ + +/* QAV Tx mode control register */ +#define E1000_I210_TQAVCTRL 0x3570 + +/* QAV Tx mode control register bitfields masks */ +/* QAV enable */ +#define E1000_TQAVCTRL_MODE (1 << 0) +/* Fetching arbitration type */ +#define E1000_TQAVCTRL_FETCH_ARB (1 << 4) +/* Fetching timer enable */ +#define E1000_TQAVCTRL_FETCH_TIMER_ENABLE (1 << 5) +/* Launch arbitration type */ +#define E1000_TQAVCTRL_LAUNCH_ARB (1 << 8) +/* Launch timer enable */ +#define E1000_TQAVCTRL_LAUNCH_TIMER_ENABLE (1 << 9) +/* SP waits for SR enable */ +#define E1000_TQAVCTRL_SP_WAIT_SR (1 << 10) +/* Fetching timer correction */ +#define E1000_TQAVCTRL_FETCH_TIMER_DELTA_OFFSET 16 +#define E1000_TQAVCTRL_FETCH_TIMER_DELTA \ + (0xFFFF << E1000_TQAVCTRL_FETCH_TIMER_DELTA_OFFSET) + +/* High credit registers where _n can be 0 or 1. */ +#define E1000_I210_TQAVHC(_n) (0x300C + 0x40 * (_n)) + +/* Queues fetch arbitration priority control register */ +#define E1000_I210_TQAVARBCTRL 0x3574 +/* Queues priority masks where _n and _p can be 0-3. */ +#define E1000_TQAVARBCTRL_QUEUE_PRI(_n, _p) ((_p) << (2 * _n)) +/* QAV Tx mode control registers where _n can be 0 or 1. */ +#define E1000_I210_TQAVCC(_n) (0x3004 + 0x40 * (_n)) + +/* QAV Tx mode control register bitfields masks */ +#define E1000_TQAVCC_IDLE_SLOPE 0xFFFF /* Idle slope */ +#define E1000_TQAVCC_KEEP_CREDITS (1 << 30) /* Keep credits opt enable */ +#define E1000_TQAVCC_QUEUE_MODE (1 << 31) /* SP vs. SR Tx mode */ + +/* Good transmitted packets counter registers */ +#define E1000_PQGPTC(_n) (0x010014 + (0x100 * (_n))) + +/* Queues packet buffer size masks where _n can be 0-3 and _s 0-63 [kB] */ +#define E1000_I210_TXPBS_SIZE(_n, _s) ((_s) << (6 * _n)) + /* * Convenience macros * @@ -424,10 +481,11 @@ #define E1000_HOST_IF 0x08800 /* Host Interface */ #define E1000_FFMT 0x09000 /* Flexible Filter Mask Table - RW Array */ #define E1000_FFVT 0x09800 /* Flexible Filter Value Table - RW Array */ +#define E1000_HIBBA 0x8F40 /* Host Interface Buffer Base Address */ /* Flexible Host Filter Table */ -#define E1000_FHFT(_n) (0x09000 + (_n * 0x100)) +#define E1000_FHFT(_n) (0x09000 + ((_n) * 0x100)) /* Ext Flexible Host Filter Table */ -#define E1000_FHFT_EXT(_n) (0x09A00 + (_n * 0x100)) +#define E1000_FHFT_EXT(_n) (0x09A00 + ((_n) * 0x100)) #define E1000_KMRNCTRLSTA 0x00034 /* MAC-PHY interface - RW */ @@ -590,10 +648,6 @@ /* PCIe Parity Status Register */ #define E1000_PCIEERRSTS 0x05BA8 -#define E1000_LTRMINV 0x5BB0 /* LTR Minimum Value */ -#define E1000_LTRMAXV 0x5BB4 /* LTR Maximum Value */ -#define E1000_DOBFFCTL 0x3F24 /* DMA OBFF Control Register */ - #define E1000_PROXYS 0x5F64 /* Proxying Status */ #define E1000_PROXYFC 0x5F60 /* Proxying Filter Control */ /* Thermal sensor configuration and status registers */ @@ -603,7 +657,7 @@ #define E1000_THHIGHTC 0x0810C /* High Threshold Control */ #define E1000_THSTAT 0x08110 /* Thermal Sensor Status */ -/*Energy Efficient Ethernet "EEE" registers */ +/* Energy Efficient Ethernet "EEE" registers */ #define E1000_IPCNFG 0x0E38 /* Internal PHY Configuration */ #define E1000_LTRC 0x01A0 /* Latency Tolerance Reporting Control */ #define E1000_EEER 0x0E30 /* Energy Efficient Ethernet "EEE"*/ @@ -617,4 +671,9 @@ #define E1000_O2BGPTC 0x08FE4 /* OS2BMC packets received by BMC */ #define E1000_O2BSPC 0x0415C /* OS2BMC packets transmitted by host */ +#define E1000_LTRMINV 0x5BB0 /* LTR Minimum Value */ +#define E1000_LTRMAXV 0x5BB4 /* LTR Maximum Value */ +#define E1000_DOBFFCTL 0x3F24 /* DMA OBFF Control Register */ + + #endif diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c index 9c31dad7fde..856aac7da50 100644 --- a/sys/dev/e1000/if_em.c +++ b/sys/dev/e1000/if_em.c @@ -289,6 +289,7 @@ static void em_handle_link(void *context, int pending); static void em_set_sysctl_value(struct adapter *, const char *, const char *, int *, int); static int em_set_flowcntl(SYSCTL_HANDLER_ARGS); +static int em_sysctl_eee(SYSCTL_HANDLER_ARGS); static __inline void em_rx_discard(struct rx_ring *, int); @@ -389,7 +390,7 @@ SYSCTL_INT(_hw_em, OID_AUTO, rx_process_limit, CTLFLAG_RDTUN, "at a time, -1 means unlimited"); /* Energy efficient ethernet - default to OFF */ -static int eee_setting = 0; +static int eee_setting = 1; TUNABLE_INT("hw.em.eee_setting", &eee_setting); SYSCTL_INT(_hw_em, OID_AUTO, eee_setting, CTLFLAG_RDTUN, &eee_setting, 0, "Enable Energy Efficient Ethernet"); @@ -636,9 +637,12 @@ em_attach(device_t dev) " due to SOL/IDER session.\n"); /* Sysctl for setting Energy Efficient Ethernet */ - em_set_sysctl_value(adapter, "eee_control", - "enable Energy Efficient Ethernet", - &hw->dev_spec.ich8lan.eee_disable, eee_setting); + hw->dev_spec.ich8lan.eee_disable = eee_setting; + SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), + OID_AUTO, "eee_control", CTLTYPE_INT|CTLFLAG_RW, + adapter, 0, em_sysctl_eee, "I", + "Disable Energy Efficient Ethernet"); /* ** Start from a known state, this is @@ -4046,7 +4050,7 @@ em_setup_receive_ring(struct rx_ring *rxr) struct adapter *adapter = rxr->adapter; struct em_buffer *rxbuf; bus_dma_segment_t seg[1]; - int rsize, nsegs, error; + int rsize, nsegs, error = 0; #ifdef DEV_NETMAP struct netmap_adapter *na = NA(adapter->ifp); struct netmap_slot *slot; @@ -5695,6 +5699,27 @@ em_set_flowcntl(SYSCTL_HANDLER_ARGS) return (error); } +/* +** Manage Energy Efficient Ethernet: +** Control values: +** 0/1 - enabled/disabled +*/ +static int +em_sysctl_eee(SYSCTL_HANDLER_ARGS) +{ + struct adapter *adapter = (struct adapter *) arg1; + int error, value; + + value = adapter->hw.dev_spec.ich8lan.eee_disable; + error = sysctl_handle_int(oidp, &value, 0, req); + if (error || req->newptr == NULL) + return (error); + EM_CORE_LOCK(adapter); + adapter->hw.dev_spec.ich8lan.eee_disable = (value != 0); + em_init_locked(adapter); + EM_CORE_UNLOCK(adapter); + return (0); +} static int em_sysctl_debug_info(SYSCTL_HANDLER_ARGS) diff --git a/sys/dev/e1000/if_igb.c b/sys/dev/e1000/if_igb.c index b15c38ea3c9..26d09035862 100644 --- a/sys/dev/e1000/if_igb.c +++ b/sys/dev/e1000/if_igb.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2011, Intel Corporation + Copyright (c) 2001-2012, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -100,7 +100,7 @@ int igb_display_debug_stats = 0; /********************************************************************* * Driver version: *********************************************************************/ -char igb_driver_version[] = "version - 2.3.1"; +char igb_driver_version[] = "version - 2.3.4"; /********************************************************************* @@ -150,6 +150,14 @@ static igb_vendor_info_t igb_vendor_info_array[] = { 0x8086, E1000_DEV_ID_I350_SERDES, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_I350_SGMII, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_I350_VF, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_I210_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_I210_COPPER_IT, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_I210_COPPER_OEM1, + PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_I210_FIBER, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_I210_SERDES, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_I210_SGMII, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_I211_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0}, /* required last entry */ { 0, 0, 0, 0, 0} }; @@ -269,6 +277,7 @@ static void igb_set_sysctl_value(struct adapter *, const char *, const char *, int *, int); static int igb_set_flowcntl(SYSCTL_HANDLER_ARGS); static int igb_sysctl_dmac(SYSCTL_HANDLER_ARGS); +static int igb_sysctl_eee(SYSCTL_HANDLER_ARGS); #ifdef DEVICE_POLLING static poll_handler_t igb_poll; @@ -364,6 +373,13 @@ TUNABLE_INT("hw.igb.num_queues", &igb_num_queues); SYSCTL_INT(_hw_igb, OID_AUTO, num_queues, CTLFLAG_RDTUN, &igb_num_queues, 0, "Number of queues to configure, 0 indicates autoconfigure"); +/* +** Global variable to store last used CPU when binding queues +** to CPUs in igb_allocate_msix. Starts at CPU_FIRST and increments when a +** queue is bound to a cpu. +*/ +static int igb_last_bind_cpu = -1; + /* How many packets rxeof tries to clean at a time */ static int igb_rx_process_limit = 100; TUNABLE_INT("hw.igb.rx_process_limit", &igb_rx_process_limit); @@ -571,11 +587,13 @@ igb_attach(device_t dev) SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "dmac", CTLTYPE_INT|CTLFLAG_RW, adapter, 0, igb_sysctl_dmac, "I", "DMA Coalesce"); - igb_set_sysctl_value(adapter, "eee_disabled", - "enable Energy Efficient Ethernet", - &adapter->hw.dev_spec._82575.eee_disable, - TRUE); - e1000_set_eee_i350(&adapter->hw); + SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), + OID_AUTO, "eee_disabled", CTLTYPE_INT|CTLFLAG_RW, + adapter, 0, igb_sysctl_eee, "I", + "Disable Energy Efficient Ethernet"); + if (adapter->hw.phy.media_type == e1000_media_type_copper) + e1000_set_eee_i350(&adapter->hw); } /* @@ -586,7 +604,9 @@ igb_attach(device_t dev) e1000_reset_hw(&adapter->hw); /* Make sure we have a good EEPROM before we read from it */ - if (e1000_validate_nvm_checksum(&adapter->hw) < 0) { + if (((adapter->hw.mac.type != e1000_i210) && + (adapter->hw.mac.type != e1000_i211)) && + (e1000_validate_nvm_checksum(&adapter->hw) < 0)) { /* ** Some PCI-E parts fail the first check due to ** the link being in sleep state, call it again, @@ -839,6 +859,8 @@ igb_resume(device_t dev) } +#if __FreeBSD_version < 800000 + /********************************************************************* * Transmit entry point * @@ -915,7 +937,8 @@ igb_start(struct ifnet *ifp) return; } -#if __FreeBSD_version >= 800000 +#else /* __FreeBSD_version >= 800000 */ + /* ** Multiqueue Transmit driver ** @@ -927,13 +950,11 @@ igb_mq_start(struct ifnet *ifp, struct mbuf *m) struct igb_queue *que; struct tx_ring *txr; int i, err = 0; - bool moveable = TRUE; /* Which queue to use */ - if ((m->m_flags & M_FLOWID) != 0) { + if ((m->m_flags & M_FLOWID) != 0) i = m->m_pkthdr.flowid % adapter->num_queues; - moveable = FALSE; - } else + else i = curcpu % adapter->num_queues; txr = &adapter->tx_rings[i]; @@ -1333,8 +1354,8 @@ igb_init_locked(struct adapter *adapter) } /* Set Energy Efficient Ethernet */ - - e1000_set_eee_i350(&adapter->hw); + if (adapter->hw.phy.media_type == e1000_media_type_copper) + e1000_set_eee_i350(&adapter->hw); } static void @@ -2493,8 +2514,16 @@ igb_allocate_msix(struct adapter *adapter) ** Bind the msix vector, and thus the ** rings to the corresponding cpu. */ - if (adapter->num_queues > 1) - bus_bind_intr(dev, que->res, i); + if (adapter->num_queues > 1) { + if (igb_last_bind_cpu < 0) + igb_last_bind_cpu = CPU_FIRST(); + bus_bind_intr(dev, que->res, igb_last_bind_cpu); + device_printf(dev, + "Bound queue %d to cpu %d\n", + i,igb_last_bind_cpu); + igb_last_bind_cpu = CPU_NEXT(igb_last_bind_cpu); + igb_last_bind_cpu = igb_last_bind_cpu % mp_ncpus; + } #if __FreeBSD_version >= 800000 TASK_INIT(&que->txr->txq_task, 0, igb_deferred_mq_start, que->txr); @@ -2549,6 +2578,8 @@ igb_configure_queues(struct adapter *adapter) switch (adapter->hw.mac.type) { case e1000_82580: case e1000_i350: + case e1000_i210: + case e1000_i211: case e1000_vfadapt: case e1000_vfadapt_i350: /* RX entries */ @@ -2747,7 +2778,7 @@ static int igb_setup_msix(struct adapter *adapter) { device_t dev = adapter->dev; - int rid, want, queues, msgs; + int rid, want, queues, msgs, maxqueues; /* tuneable override */ if (igb_enable_msix == 0) @@ -2778,16 +2809,29 @@ igb_setup_msix(struct adapter *adapter) /* Manual override */ if (igb_num_queues != 0) queues = igb_num_queues; - if (queues > 8) /* max queues */ - queues = 8; - /* Can have max of 4 queues on 82575 */ - if ((adapter->hw.mac.type == e1000_82575) && (queues > 4)) - queues = 4; - - /* Limit the VF devices to one queue */ - if (adapter->vf_ifp) - queues = 1; + /* Sanity check based on HW */ + switch (adapter->hw.mac.type) { + case e1000_82575: + maxqueues = 4; + break; + case e1000_82576: + case e1000_82580: + case e1000_i350: + maxqueues = 8; + break; + case e1000_i210: + maxqueues = 4; + break; + case e1000_i211: + maxqueues = 2; + break; + default: /* VF interfaces */ + maxqueues = 1; + break; + } + if (queues > maxqueues) + queues = maxqueues; /* ** One vector (RX/TX pair) per queue @@ -2858,6 +2902,9 @@ igb_reset(struct adapter *adapter) pba = E1000_READ_REG(hw, E1000_RXPBS); pba = e1000_rxpbs_adjust_82580(pba); break; + case e1000_i210: + case e1000_i211: + pba = E1000_PBA_34K; default: break; } @@ -2925,7 +2972,9 @@ igb_reset(struct adapter *adapter) device_printf(dev, "Hardware Initialization Failed\n"); /* Setup DMA Coalescing */ - if (hw->mac.type == e1000_i350) { + if ((hw->mac.type > e1000_82580) && + (hw->mac.type != e1000_i211)) { + u32 dmac; u32 reg = ~E1000_DMACR_DMAC_EN; if (adapter->dmac == 0) { /* Disabling it */ @@ -2933,26 +2982,36 @@ igb_reset(struct adapter *adapter) goto reset_out; } - hwm = (pba - 4) << 10; - reg = (((pba-6) << E1000_DMACR_DMACTHR_SHIFT) - & E1000_DMACR_DMACTHR_MASK); + /* Set starting thresholds */ + E1000_WRITE_REG(hw, E1000_DMCTXTH, 0); + E1000_WRITE_REG(hw, E1000_DMCRTRH, 0); + hwm = 64 * pba - adapter->max_frame_size / 16; + if (hwm < 64 * (pba - 6)) + hwm = 64 * (pba - 6); + reg = E1000_READ_REG(hw, E1000_FCRTC); + reg &= ~E1000_FCRTC_RTH_COAL_MASK; + reg |= ((hwm << E1000_FCRTC_RTH_COAL_SHIFT) + & E1000_FCRTC_RTH_COAL_MASK); + E1000_WRITE_REG(hw, E1000_FCRTC, reg); + + + dmac = pba - adapter->max_frame_size / 512; + if (dmac < pba - 10) + dmac = pba - 10; + reg = E1000_READ_REG(hw, E1000_DMACR); + reg &= ~E1000_DMACR_DMACTHR_MASK; + reg = ((dmac << E1000_DMACR_DMACTHR_SHIFT) + & E1000_DMACR_DMACTHR_MASK); /* transition to L0x or L1 if available..*/ reg |= (E1000_DMACR_DMAC_EN | E1000_DMACR_DMAC_LX_MASK); - /* timer = value in adapter->dmac in 32usec intervals */ reg |= (adapter->dmac >> 5); E1000_WRITE_REG(hw, E1000_DMACR, reg); - /* No lower threshold */ - E1000_WRITE_REG(hw, E1000_DMCRTRH, 0); - - /* set hwm to PBA - 2 * max frame size */ - E1000_WRITE_REG(hw, E1000_FCRTC, hwm); - /* Set the interval before transition */ reg = E1000_READ_REG(hw, E1000_DMCTLX); - reg |= 0x800000FF; /* 255 usec */ + reg |= 0x80000004; E1000_WRITE_REG(hw, E1000_DMCTLX, reg); /* free space in tx packet buffer to wake from DMA coal */ @@ -2961,9 +3020,15 @@ igb_reset(struct adapter *adapter) /* make low power state decision controlled by DMA coal */ reg = E1000_READ_REG(hw, E1000_PCIEMISC); - E1000_WRITE_REG(hw, E1000_PCIEMISC, - reg | E1000_PCIEMISC_LX_DECISION); + reg &= ~E1000_PCIEMISC_LX_DECISION; + E1000_WRITE_REG(hw, E1000_PCIEMISC, reg); device_printf(dev, "DMA Coalescing enabled\n"); + + } else if (hw->mac.type == e1000_82580) { + u32 reg = E1000_READ_REG(hw, E1000_PCIEMISC); + E1000_WRITE_REG(hw, E1000_DMACR, 0); + E1000_WRITE_REG(hw, E1000_PCIEMISC, + reg & ~E1000_PCIEMISC_LX_DECISION); } reset_out: @@ -2995,14 +3060,15 @@ igb_setup_interface(device_t dev, struct adapter *adapter) ifp->if_softc = adapter; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = igb_ioctl; - ifp->if_start = igb_start; #if __FreeBSD_version >= 800000 ifp->if_transmit = igb_mq_start; ifp->if_qflush = igb_qflush; -#endif +#else + ifp->if_start = igb_start; IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 1); ifp->if_snd.ifq_drv_maxlen = adapter->num_tx_desc - 1; IFQ_SET_READY(&ifp->if_snd); +#endif ether_ifattach(ifp, adapter->hw.mac.addr); @@ -5924,3 +5990,25 @@ igb_sysctl_dmac(SYSCTL_HANDLER_ARGS) igb_init(adapter); return (error); } + +/* +** Manage Energy Efficient Ethernet: +** Control values: +** 0/1 - enabled/disabled +*/ +static int +igb_sysctl_eee(SYSCTL_HANDLER_ARGS) +{ + struct adapter *adapter = (struct adapter *) arg1; + int error, value; + + value = adapter->hw.dev_spec._82575.eee_disable; + error = sysctl_handle_int(oidp, &value, 0, req); + if (error || req->newptr == NULL) + return (error); + IGB_CORE_LOCK(adapter); + adapter->hw.dev_spec._82575.eee_disable = (value != 0); + igb_init_locked(adapter); + IGB_CORE_UNLOCK(adapter); + return (0); +} diff --git a/sys/dev/esp/ncr53c9x.c b/sys/dev/esp/ncr53c9x.c index 93ad3371e80..0cc4387bf8c 100644 --- a/sys/dev/esp/ncr53c9x.c +++ b/sys/dev/esp/ncr53c9x.c @@ -1504,7 +1504,7 @@ ncr53c9x_dequeue(struct ncr53c9x_softc *sc, struct ncr53c9x_ecb *ecb) li = TINFO_LUN(ti, lun); #ifdef DIAGNOSTIC if (li == NULL || li->lun != lun) - panic("%s: lun %qx for ecb %p does not exist", __func__, + panic("%s: lun %llx for ecb %p does not exist", __func__, (long long)lun, ecb); #endif if (li->untagged == ecb) { @@ -1515,7 +1515,7 @@ ncr53c9x_dequeue(struct ncr53c9x_softc *sc, struct ncr53c9x_ecb *ecb) #ifdef DIAGNOSTIC if (li->queued[ecb->tag[1]] != NULL && (li->queued[ecb->tag[1]] != ecb)) - panic("%s: slot %d for lun %qx has %p instead of ecb " + panic("%s: slot %d for lun %llx has %p instead of ecb " "%p", __func__, ecb->tag[1], (long long)lun, li->queued[ecb->tag[1]], ecb); #endif diff --git a/sys/dev/etherswitch/arswitch/arswitch.c b/sys/dev/etherswitch/arswitch/arswitch.c new file mode 100644 index 00000000000..16f63f8d69a --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch.c @@ -0,0 +1,577 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * Copyright (c) 2012 Adrian Chadd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "mdio_if.h" +#include "miibus_if.h" +#include "etherswitch_if.h" + +#if defined(DEBUG) +static SYSCTL_NODE(_debug, OID_AUTO, arswitch, CTLFLAG_RD, 0, "arswitch"); +#endif + +static inline int arswitch_portforphy(int phy); +static void arswitch_tick(void *arg); +static int arswitch_ifmedia_upd(struct ifnet *); +static void arswitch_ifmedia_sts(struct ifnet *, struct ifmediareq *); + +static void +arswitch_identify(driver_t *driver, device_t parent) +{ + device_t child; + + if (device_find_child(parent, driver->name, -1) == NULL) { + child = BUS_ADD_CHILD(parent, 0, driver->name, -1); + } +} + +static int +arswitch_probe(device_t dev) +{ + struct arswitch_softc *sc; + uint32_t id; + char *chipname, desc[256]; + + sc = device_get_softc(dev); + bzero(sc, sizeof(*sc)); + sc->page = -1; + + /* AR7240 probe */ + if (ar7240_probe(dev) == 0) { + chipname = "AR7240"; + sc->sc_switchtype = AR8X16_SWITCH_AR7240; + goto done; + } + + /* AR8xxx probe */ + id = arswitch_readreg(dev, AR8X16_REG_MASK_CTRL); + switch ((id & AR8X16_MASK_CTRL_VER_MASK) >> + AR8X16_MASK_CTRL_VER_SHIFT) { + case 1: + chipname = "AR8216"; + sc->sc_switchtype = AR8X16_SWITCH_AR8216; + break; + case 2: + chipname = "AR8226"; + sc->sc_switchtype = AR8X16_SWITCH_AR8226; + break; + case 16: + chipname = "AR8316"; + sc->sc_switchtype = AR8X16_SWITCH_AR8316; + break; + default: + chipname = NULL; + } + +done: + DPRINTF(dev, "chipname=%s, rev=%02x\n", chipname, + id & AR8X16_MASK_CTRL_REV_MASK); + if (chipname != NULL) { + snprintf(desc, sizeof(desc), + "Atheros %s Ethernet Switch", + chipname); + device_set_desc_copy(dev, desc); + return (BUS_PROBE_DEFAULT); + } + return (ENXIO); +} + +static int +arswitch_attach_phys(struct arswitch_softc *sc) +{ + int phy, err = 0; + char name[IFNAMSIZ]; + + /* PHYs need an interface, so we generate a dummy one */ + snprintf(name, IFNAMSIZ, "%sport", device_get_nameunit(sc->sc_dev)); + for (phy = 0; phy < sc->numphys; phy++) { + sc->ifp[phy] = if_alloc(IFT_ETHER); + sc->ifp[phy]->if_softc = sc; + sc->ifp[phy]->if_flags |= IFF_UP | IFF_BROADCAST | + IFF_DRV_RUNNING | IFF_SIMPLEX; + sc->ifname[phy] = malloc(strlen(name)+1, M_DEVBUF, M_WAITOK); + bcopy(name, sc->ifname[phy], strlen(name)+1); + if_initname(sc->ifp[phy], sc->ifname[phy], + arswitch_portforphy(phy)); + err = mii_attach(sc->sc_dev, &sc->miibus[phy], sc->ifp[phy], + arswitch_ifmedia_upd, arswitch_ifmedia_sts, \ + BMSR_DEFCAPMASK, phy, MII_OFFSET_ANY, 0); + DPRINTF(sc->sc_dev, "%s attached to pseudo interface %s\n", + device_get_nameunit(sc->miibus[phy]), + sc->ifp[phy]->if_xname); + if (err != 0) { + device_printf(sc->sc_dev, + "attaching PHY %d failed\n", + phy); + } + } + return (err); +} + +static int +arswitch_attach(device_t dev) +{ + struct arswitch_softc *sc; + int err = 0; + + sc = device_get_softc(dev); + + /* sc->sc_switchtype is already decided in arswitch_probe() */ + sc->sc_dev = dev; + mtx_init(&sc->sc_mtx, "arswitch", NULL, MTX_DEF); + sc->page = -1; + strlcpy(sc->info.es_name, device_get_desc(dev), + sizeof(sc->info.es_name)); + + /* + * Attach switch related functions + */ + if (AR8X16_IS_SWITCH(sc, AR7240)) + ar7240_attach(sc); + else if (AR8X16_IS_SWITCH(sc, AR8216)) + ar8216_attach(sc); + else if (AR8X16_IS_SWITCH(sc, AR8226)) + ar8226_attach(sc); + else if (AR8X16_IS_SWITCH(sc, AR8316)) + ar8316_attach(sc); + else + return (ENXIO); + + /* + * XXX these two should be part of the switch attach function + */ + sc->info.es_nports = 5; /* XXX technically 6, but 6th not used */ + sc->info.es_nvlangroups = 16; + + /* XXX Defaults for externally connected AR8316 */ + sc->numphys = 4; + sc->phy4cpu = 1; + sc->is_rgmii = 1; + sc->is_gmii = 0; + + (void) resource_int_value(device_get_name(dev), device_get_unit(dev), + "numphys", &sc->numphys); + (void) resource_int_value(device_get_name(dev), device_get_unit(dev), + "phy4cpu", &sc->phy4cpu); + (void) resource_int_value(device_get_name(dev), device_get_unit(dev), + "is_rgmii", &sc->is_rgmii); + (void) resource_int_value(device_get_name(dev), device_get_unit(dev), + "is_gmii", &sc->is_gmii); + + /* + * This requires much more setup depending upon each chip, including: + * + * + Proper reinitialisation of the PHYs; + * + Initialising the VLAN table; + * + Initialising the port access table and CPU flood/broadcast + * configuration; + * + Other things I haven't yet thought of. + */ +#ifdef NOTYET + arswitch_writereg(dev, AR8X16_REG_MASK_CTRL, + AR8X16_MASK_CTRL_SOFT_RESET); + DELAY(1000); + if (arswitch_readreg(dev, AR8X16_REG_MASK_CTRL) & + AR8X16_MASK_CTRL_SOFT_RESET) { + device_printf(dev, "unable to reset switch\n"); + return (ENXIO); + } +#endif + + err = sc->hal.arswitch_hw_setup(sc); + if (err != 0) + return (err); + + err = sc->hal.arswitch_hw_global_setup(sc); + if (err != 0) + return (err); + + /* + * Attach the PHYs and complete the bus enumeration. + */ + err = arswitch_attach_phys(sc); + if (err != 0) + return (err); + + bus_generic_probe(dev); + bus_enumerate_hinted_children(dev); + err = bus_generic_attach(dev); + if (err != 0) + return (err); + + callout_init_mtx(&sc->callout_tick, &sc->sc_mtx, 0); + arswitch_tick(sc); + + return (err); +} + +static int +arswitch_detach(device_t dev) +{ + struct arswitch_softc *sc = device_get_softc(dev); + int i; + + callout_drain(&sc->callout_tick); + + for (i=0; i < sc->numphys; i++) { + if (sc->miibus[i] != NULL) + device_delete_child(dev, sc->miibus[i]); + if (sc->ifp[i] != NULL) + if_free(sc->ifp[i]); + free(sc->ifname[i], M_DEVBUF); + } + + bus_generic_detach(dev); + mtx_destroy(&sc->sc_mtx); + + return (0); +} + +/* + * Convert PHY number to port number. PHY0 is connected to port 1, PHY1 to + * port 2, etc. + */ +static inline int +arswitch_portforphy(int phy) +{ + return (phy+1); +} + +static inline struct mii_data * +arswitch_miiforport(struct arswitch_softc *sc, int port) +{ + int phy = port-1; + + if (phy < 0 || phy >= sc->numphys) + return (NULL); + return (device_get_softc(sc->miibus[phy])); +} + +static inline struct ifnet * +arswitch_ifpforport(struct arswitch_softc *sc, int port) +{ + int phy = port-1; + + if (phy < 0 || phy >= sc->numphys) + return (NULL); + return (sc->ifp[phy]); +} + +/* + * Convert port status to ifmedia. + */ +static void +arswitch_update_ifmedia(int portstatus, u_int *media_status, u_int *media_active) +{ + *media_active = IFM_ETHER; + *media_status = IFM_AVALID; + + if ((portstatus & AR8X16_PORT_STS_LINK_UP) != 0) + *media_status |= IFM_ACTIVE; + else { + *media_active |= IFM_NONE; + return; + } + switch (portstatus & AR8X16_PORT_STS_SPEED_MASK) { + case AR8X16_PORT_STS_SPEED_10: + *media_active |= IFM_10_T; + break; + case AR8X16_PORT_STS_SPEED_100: + *media_active |= IFM_100_TX; + break; + case AR8X16_PORT_STS_SPEED_1000: + *media_active |= IFM_1000_T; + break; + } + if ((portstatus & AR8X16_PORT_STS_DUPLEX) == 0) + *media_active |= IFM_FDX; + else + *media_active |= IFM_HDX; + if ((portstatus & AR8X16_PORT_STS_TXFLOW) != 0) + *media_active |= IFM_ETH_TXPAUSE; + if ((portstatus & AR8X16_PORT_STS_RXFLOW) != 0) + *media_active |= IFM_ETH_RXPAUSE; +} + +/* + * Poll the status for all PHYs. We're using the switch port status because + * thats a lot quicker to read than talking to all the PHYs. Care must be + * taken that the resulting ifmedia_active is identical to what the PHY will + * compute, or gratuitous link status changes will occur whenever the PHYs + * update function is called. + */ +static void +arswitch_miipollstat(struct arswitch_softc *sc) +{ + int i; + struct mii_data *mii; + struct mii_softc *miisc; + int portstatus; + + for (i = 0; i < sc->numphys; i++) { + if (sc->miibus[i] == NULL) + continue; + mii = device_get_softc(sc->miibus[i]); + portstatus = arswitch_readreg(sc->sc_dev, + AR8X16_REG_PORT_STS(arswitch_portforphy(i))); +#if 0 + DPRINTF(sc->sc_dev, "p[%d]=%b\n", + arge_portforphy(i), + portstatus, + "\20\3TXMAC\4RXMAC\5TXFLOW\6RXFLOW\7" + "DUPLEX\11LINK_UP\12LINK_AUTO\13LINK_PAUSE"); +#endif + arswitch_update_ifmedia(portstatus, &mii->mii_media_status, + &mii->mii_media_active); + LIST_FOREACH(miisc, &mii->mii_phys, mii_list) { + if (IFM_INST(mii->mii_media.ifm_cur->ifm_media) != + miisc->mii_inst) + continue; + mii_phy_update(miisc, MII_POLLSTAT); + } + } +} + +static void +arswitch_tick(void *arg) +{ + struct arswitch_softc *sc = arg; + + arswitch_miipollstat(sc); + callout_reset(&sc->callout_tick, hz, arswitch_tick, sc); +} + +static etherswitch_info_t * +arswitch_getinfo(device_t dev) +{ + struct arswitch_softc *sc = device_get_softc(dev); + + return (&sc->info); +} + +static int +arswitch_getport(device_t dev, etherswitch_port_t *p) +{ + struct arswitch_softc *sc = device_get_softc(dev); + struct mii_data *mii; + struct ifmediareq *ifmr = &p->es_ifmr; + int err; + + if (p->es_port < 0 || p->es_port >= AR8X16_NUM_PORTS) + return (ENXIO); + p->es_vlangroup = 0; + + mii = arswitch_miiforport(sc, p->es_port); + if (p->es_port == 0) { + /* fill in fixed values for CPU port */ + ifmr->ifm_count = 0; + ifmr->ifm_current = ifmr->ifm_active = + IFM_ETHER | IFM_1000_T | IFM_FDX; + ifmr->ifm_mask = 0; + ifmr->ifm_status = IFM_ACTIVE | IFM_AVALID; + } else if (mii != NULL) { + err = ifmedia_ioctl(mii->mii_ifp, &p->es_ifr, + &mii->mii_media, SIOCGIFMEDIA); + if (err) + return (err); + } else { + return (ENXIO); + } + return (0); +} + +/* + * XXX doesn't yet work? + */ +static int +arswitch_setport(device_t dev, etherswitch_port_t *p) +{ + int err; + struct arswitch_softc *sc; + struct ifmedia *ifm; + struct mii_data *mii; + struct ifnet *ifp; + + /* + * XXX check the sc numphys, or the #define ? + */ + if (p->es_port < 0 || p->es_port >= AR8X16_NUM_PHYS) + return (ENXIO); + + sc = device_get_softc(dev); + + /* + * XXX TODO: don't set the CPU port? + */ + + mii = arswitch_miiforport(sc, p->es_port); + if (mii == NULL) + return (ENXIO); + + ifp = arswitch_ifpforport(sc, p->es_port); + + ifm = &mii->mii_media; + err = ifmedia_ioctl(ifp, &p->es_ifr, ifm, SIOCSIFMEDIA); + return (err); +} + +static int +arswitch_getvgroup(device_t dev, etherswitch_vlangroup_t *vg) +{ + + /* XXX not implemented yet */ + vg->es_vid = 0; + vg->es_member_ports = 0; + vg->es_untagged_ports = 0; + vg->es_fid = 0; + return (0); +} + +static int +arswitch_setvgroup(device_t dev, etherswitch_vlangroup_t *vg) +{ + + /* XXX not implemented yet */ + return (0); +} + +static void +arswitch_statchg(device_t dev) +{ + + DPRINTF(dev, "%s\n", __func__); +} + +static int +arswitch_ifmedia_upd(struct ifnet *ifp) +{ + struct arswitch_softc *sc = ifp->if_softc; + struct mii_data *mii = arswitch_miiforport(sc, ifp->if_dunit); + + if (mii == NULL) + return (ENXIO); + mii_mediachg(mii); + return (0); +} + +static void +arswitch_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) +{ + struct arswitch_softc *sc = ifp->if_softc; + struct mii_data *mii = arswitch_miiforport(sc, ifp->if_dunit); + + DPRINTF(sc->sc_dev, "%s\n", __func__); + + if (mii == NULL) + return; + mii_pollstat(mii); + ifmr->ifm_active = mii->mii_media_active; + ifmr->ifm_status = mii->mii_media_status; +} + +static device_method_t arswitch_methods[] = { + /* Device interface */ + DEVMETHOD(device_identify, arswitch_identify), + DEVMETHOD(device_probe, arswitch_probe), + DEVMETHOD(device_attach, arswitch_attach), + DEVMETHOD(device_detach, arswitch_detach), + + /* bus interface */ + DEVMETHOD(bus_add_child, device_add_child_ordered), + + /* MII interface */ + DEVMETHOD(miibus_readreg, arswitch_readphy), + DEVMETHOD(miibus_writereg, arswitch_writephy), + DEVMETHOD(miibus_statchg, arswitch_statchg), + + /* MDIO interface */ + DEVMETHOD(mdio_readreg, arswitch_readphy), + DEVMETHOD(mdio_writereg, arswitch_writephy), + + /* etherswitch interface */ + DEVMETHOD(etherswitch_getinfo, arswitch_getinfo), + DEVMETHOD(etherswitch_readreg, arswitch_readreg), + DEVMETHOD(etherswitch_writereg, arswitch_writereg), + DEVMETHOD(etherswitch_readphyreg, arswitch_readphy), + DEVMETHOD(etherswitch_writephyreg, arswitch_writephy), + DEVMETHOD(etherswitch_getport, arswitch_getport), + DEVMETHOD(etherswitch_setport, arswitch_setport), + DEVMETHOD(etherswitch_getvgroup, arswitch_getvgroup), + DEVMETHOD(etherswitch_setvgroup, arswitch_setvgroup), + + DEVMETHOD_END +}; + +DEFINE_CLASS_0(arswitch, arswitch_driver, arswitch_methods, + sizeof(struct arswitch_softc)); +static devclass_t arswitch_devclass; + +DRIVER_MODULE(arswitch, mdio, arswitch_driver, arswitch_devclass, 0, 0); +DRIVER_MODULE(miibus, arswitch, miibus_driver, miibus_devclass, 0, 0); +DRIVER_MODULE(mdio, arswitch, mdio_driver, mdio_devclass, 0, 0); +DRIVER_MODULE(etherswitch, arswitch, etherswitch_driver, etherswitch_devclass, 0, 0); +MODULE_VERSION(arswitch, 1); +MODULE_DEPEND(arswitch, miibus, 1, 1, 1); /* XXX which versions? */ +MODULE_DEPEND(arswitch, etherswitch, 1, 1, 1); /* XXX which versions? */ diff --git a/sys/dev/etherswitch/arswitch/arswitch_7240.c b/sys/dev/etherswitch/arswitch/arswitch_7240.c new file mode 100644 index 00000000000..c8f6426748c --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch_7240.c @@ -0,0 +1,142 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * Copyright (c) 2012 Adrian Chadd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include /* XXX for probe */ +#include + +#include "mdio_if.h" +#include "miibus_if.h" +#include "etherswitch_if.h" + +/* + * AR7240 specific functions + */ +static int +ar7240_hw_setup(struct arswitch_softc *sc) +{ + + /* Enable CPU port; disable mirror port */ + arswitch_writereg(sc->sc_dev, AR8X16_REG_CPU_PORT, + AR8X16_CPU_PORT_EN | AR8X16_CPU_MIRROR_DIS); + + /* + * Let things settle; probing PHY4 doesn't seem reliable + * without a litle delay. + */ + DELAY(1000); + + return (0); +} + +/* + * Initialise other global values for the AR7240. + */ +static int +ar7240_hw_global_setup(struct arswitch_softc *sc) +{ + + /* Setup TAG priority mapping */ + arswitch_writereg(sc->sc_dev, AR8X16_REG_TAG_PRIO, 0xfa50); + + /* Enable broadcast frames transmitted to the CPU */ + arswitch_writereg(sc->sc_dev, AR8X16_REG_FLOOD_MASK, + AR8X16_FLOOD_MASK_BCAST_TO_CPU | 0x003f003f); + + /* Setup MTU */ + arswitch_modifyreg(sc->sc_dev, AR8X16_REG_GLOBAL_CTRL, + AR7240_GLOBAL_CTRL_MTU_MASK, + SM(1536, AR7240_GLOBAL_CTRL_MTU_MASK)); + + /* Service Tag */ + arswitch_modifyreg(sc->sc_dev, AR8X16_REG_SERVICE_TAG, + AR8X16_SERVICE_TAG_MASK, 0); + + return (0); +} + +/* + * The AR7240 probes the same as the AR8216. + * + * However, the support is slightly different. + * + * So instead of checking the PHY revision or mask register contents, + * we simply fall back to a hint check. + */ +int +ar7240_probe(device_t dev) +{ + int is_7240 = 0; + + if (resource_int_value(device_get_name(dev), device_get_unit(dev), + "is_7240", &is_7240) != 0) + return (ENXIO); + + if (is_7240 == 0) + return (ENXIO); + + return (0); +} + +void +ar7240_attach(struct arswitch_softc *sc) +{ + + sc->hal.arswitch_hw_setup = ar7240_hw_setup; + sc->hal.arswitch_hw_global_setup = ar7240_hw_global_setup; +} diff --git a/sys/dev/etherswitch/arswitch/arswitch_7240.h b/sys/dev/etherswitch/arswitch/arswitch_7240.h new file mode 100644 index 00000000000..838a6d1015a --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch_7240.h @@ -0,0 +1,35 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#ifndef __ARSWITCH_7240_H__ +#define __ARSWITCH_7240_H__ + +extern int ar7240_probe(device_t dev); +extern void ar7240_attach(struct arswitch_softc *sc); + +#endif /* __ARSWITCH_7240_H__ */ + diff --git a/sys/dev/etherswitch/arswitch/arswitch_8216.c b/sys/dev/etherswitch/arswitch/arswitch_8216.c new file mode 100644 index 00000000000..eb49abad141 --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch_8216.c @@ -0,0 +1,92 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * Copyright (c) 2012 Adrian Chadd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "mdio_if.h" +#include "miibus_if.h" +#include "etherswitch_if.h" + +/* + * AR8216 specific functions + */ +static int +ar8216_hw_setup(struct arswitch_softc *sc) +{ + + return (0); +} + +/* + * Initialise other global values, for the AR8216. + */ +static int +ar8216_hw_global_setup(struct arswitch_softc *sc) +{ + + return (0); +} + +void +ar8216_attach(struct arswitch_softc *sc) +{ + + sc->hal.arswitch_hw_setup = ar8216_hw_setup; + sc->hal.arswitch_hw_global_setup = ar8216_hw_global_setup; +} diff --git a/sys/dev/etherswitch/arswitch/arswitch_8216.h b/sys/dev/etherswitch/arswitch/arswitch_8216.h new file mode 100644 index 00000000000..1795a20b921 --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch_8216.h @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#ifndef __ARSWITCH_8216_H__ +#define __ARSWITCH_8216_H__ + +extern void ar8216_attach(struct arswitch_softc *sc); + +#endif /* __ARSWITCH_8216_H__ */ + diff --git a/sys/dev/etherswitch/arswitch/arswitch_8226.c b/sys/dev/etherswitch/arswitch/arswitch_8226.c new file mode 100644 index 00000000000..336120a7bff --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch_8226.c @@ -0,0 +1,92 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * Copyright (c) 2012 Adrian Chadd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "mdio_if.h" +#include "miibus_if.h" +#include "etherswitch_if.h" + +/* + * AR8226 specific functions + */ +static int +ar8226_hw_setup(struct arswitch_softc *sc) +{ + + return (0); +} + +/* + * Initialise other global values, for the AR8226. + */ +static int +ar8226_hw_global_setup(struct arswitch_softc *sc) +{ + + return (0); +} + +void +ar8226_attach(struct arswitch_softc *sc) +{ + + sc->hal.arswitch_hw_setup = ar8226_hw_setup; + sc->hal.arswitch_hw_global_setup = ar8226_hw_global_setup; +} diff --git a/sys/dev/etherswitch/arswitch/arswitch_8226.h b/sys/dev/etherswitch/arswitch/arswitch_8226.h new file mode 100644 index 00000000000..f430e1200f8 --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch_8226.h @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#ifndef __ARSWITCH_8226_H__ +#define __ARSWITCH_8226_H__ + +extern void ar8226_attach(struct arswitch_softc *sc); + +#endif /* __ARSWITCH_8226_H__ */ + diff --git a/sys/dev/etherswitch/arswitch/arswitch_8316.c b/sys/dev/etherswitch/arswitch/arswitch_8316.c new file mode 100644 index 00000000000..3f01aed88b3 --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch_8316.c @@ -0,0 +1,151 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * Copyright (c) 2012 Adrian Chadd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "mdio_if.h" +#include "miibus_if.h" +#include "etherswitch_if.h" + +/* + * AR8316 specific functions + */ +static int +ar8316_hw_setup(struct arswitch_softc *sc) +{ + + /* + * Configure the switch mode based on whether: + * + * + The switch port is GMII/RGMII; + * + Port 4 is either connected to the CPU or to the internal switch. + */ + if (sc->is_rgmii && sc->phy4cpu) { + arswitch_writereg(sc->sc_dev, AR8X16_REG_MODE, + AR8X16_MODE_RGMII_PORT4_ISO); + device_printf(sc->sc_dev, + "%s: MAC port == RGMII, port 4 = dedicated PHY\n", + __func__); + } else if (sc->is_rgmii) { + arswitch_writereg(sc->sc_dev, AR8X16_REG_MODE, + AR8X16_MODE_RGMII_PORT4_SWITCH); + device_printf(sc->sc_dev, + "%s: MAC port == RGMII, port 4 = switch port\n", + __func__); + } else if (sc->is_gmii) { + arswitch_writereg(sc->sc_dev, AR8X16_REG_MODE, + AR8X16_MODE_GMII); + device_printf(sc->sc_dev, "%s: MAC port == GMII\n", __func__); + } else { + device_printf(sc->sc_dev, "%s: unknown switch PHY config\n", + __func__); + return (ENXIO); + } + + DELAY(1000); /* 1ms wait for things to settle */ + + /* + * If port 4 is RGMII, force workaround + */ + if (sc->is_rgmii && sc->phy4cpu) { + device_printf(sc->sc_dev, + "%s: port 4 RGMII workaround\n", + __func__); + + /* work around for phy4 rgmii mode */ + arswitch_writedbg(sc->sc_dev, 4, 0x12, 0x480c); + /* rx delay */ + arswitch_writedbg(sc->sc_dev, 4, 0x0, 0x824e); + /* tx delay */ + arswitch_writedbg(sc->sc_dev, 4, 0x5, 0x3d47); + DELAY(1000); /* 1ms, again to let things settle */ + } + + return (0); +} + +/* + * Initialise other global values, for the AR8316. + */ +static int +ar8316_hw_global_setup(struct arswitch_softc *sc) +{ + + arswitch_writereg(sc->sc_dev, 0x38, 0xc000050e); + + /* + * Flood address table misses to all ports, and enable forwarding of + * broadcasts to the cpu port. + */ + arswitch_writereg(sc->sc_dev, AR8X16_REG_FLOOD_MASK, + AR8X16_FLOOD_MASK_BCAST_TO_CPU | 0x003f003f); + + arswitch_modifyreg(sc->sc_dev, AR8X16_REG_GLOBAL_CTRL, + AR8316_GLOBAL_CTRL_MTU_MASK, 9018 + 8 + 2); + + return (0); +} + +void +ar8316_attach(struct arswitch_softc *sc) +{ + + sc->hal.arswitch_hw_setup = ar8316_hw_setup; + sc->hal.arswitch_hw_global_setup = ar8316_hw_global_setup; +} diff --git a/sys/dev/etherswitch/arswitch/arswitch_8316.h b/sys/dev/etherswitch/arswitch/arswitch_8316.h new file mode 100644 index 00000000000..ceb8ae73ff8 --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch_8316.h @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#ifndef __ARSWITCH_8316_H__ +#define __ARSWITCH_8316_H__ + +extern void ar8316_attach(struct arswitch_softc *sc); + +#endif /* __ARSWITCH_8316_H__ */ + diff --git a/sys/dev/etherswitch/arswitch/arswitch_phy.c b/sys/dev/etherswitch/arswitch/arswitch_phy.c new file mode 100644 index 00000000000..283cdb67bd9 --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch_phy.c @@ -0,0 +1,136 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * Copyright (c) 2012 Adrian Chadd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +#include "mdio_if.h" +#include "miibus_if.h" +#include "etherswitch_if.h" + +#if defined(DEBUG) +static SYSCTL_NODE(_debug, OID_AUTO, arswitch, CTLFLAG_RD, 0, "arswitch"); +#endif + +/* + * access PHYs integrated into the switch chip through the switch's MDIO + * control register. + */ +int +arswitch_readphy(device_t dev, int phy, int reg) +{ + uint32_t data = 0, ctrl; + int err, timeout; + + if (phy < 0 || phy >= 32) + return (ENXIO); + if (reg < 0 || reg >= 32) + return (ENXIO); + err = arswitch_writereg_msb(dev, AR8X16_REG_MDIO_CTRL, + AR8X16_MDIO_CTRL_BUSY | AR8X16_MDIO_CTRL_MASTER_EN | + AR8X16_MDIO_CTRL_CMD_READ | + (phy << AR8X16_MDIO_CTRL_PHY_ADDR_SHIFT) | + (reg << AR8X16_MDIO_CTRL_REG_ADDR_SHIFT)); + DEVERR(dev, err, "arswitch_readphy()=%d: phy=%d.%02x\n", phy, reg); + if (err != 0) + return (-1); + for (timeout = 100; timeout--; ) { + ctrl = arswitch_readreg_msb(dev, AR8X16_REG_MDIO_CTRL); + if ((ctrl & AR8X16_MDIO_CTRL_BUSY) == 0) + break; + } + if (timeout < 0) + err = EIO; + data = arswitch_readreg_lsb(dev, AR8X16_REG_MDIO_CTRL) & + AR8X16_MDIO_CTRL_DATA_MASK; + return (data); +} + +int +arswitch_writephy(device_t dev, int phy, int reg, int data) +{ + uint32_t ctrl; + int err, timeout; + + if (reg < 0 || reg >= 32) + return (ENXIO); + err = arswitch_writereg_lsb(dev, AR8X16_REG_MDIO_CTRL, + (data & AR8X16_MDIO_CTRL_DATA_MASK)); + DEVERR(dev, err, "arswitch_writephy()=%d: phy=%d.%02x\n", phy, reg); + if (err != 0) + return (err); + err = arswitch_writereg_msb(dev, AR8X16_REG_MDIO_CTRL, + AR8X16_MDIO_CTRL_BUSY | + AR8X16_MDIO_CTRL_MASTER_EN | + AR8X16_MDIO_CTRL_CMD_WRITE | + (phy << AR8X16_MDIO_CTRL_PHY_ADDR_SHIFT) | + (reg << AR8X16_MDIO_CTRL_REG_ADDR_SHIFT)); + DEVERR(dev, err, "arswitch_writephy()=%d: phy=%d.%02x\n", phy, reg); + if (err != 0) + return (err); + for (timeout = 100; timeout--; ) { + ctrl = arswitch_readreg(dev, AR8X16_REG_MDIO_CTRL); + if ((ctrl & AR8X16_MDIO_CTRL_BUSY) == 0) + break; + } + if (timeout < 0) + err = EIO; + DEVERR(dev, err, "arswitch_writephy()=%d: phy=%d.%02x\n", phy, reg); + return (err); +} diff --git a/sys/dev/etherswitch/arswitch/arswitch_phy.h b/sys/dev/etherswitch/arswitch/arswitch_phy.h new file mode 100644 index 00000000000..a3b762746df --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch_phy.h @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#ifndef __ARSWITCH_PHY_H__ +#define __ARSWITCH_PHY_H__ + +extern int arswitch_readphy(device_t dev, int phy, int reg); +extern int arswitch_writephy(device_t dev, int phy, int reg, int data); + +#endif /* __ARSWITCH_PHY_H__ */ diff --git a/sys/dev/etherswitch/arswitch/arswitch_reg.c b/sys/dev/etherswitch/arswitch/arswitch_reg.c new file mode 100644 index 00000000000..0c0e9153b2e --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch_reg.c @@ -0,0 +1,180 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include "mdio_if.h" +#include "miibus_if.h" +#include "etherswitch_if.h" + +static inline void +arswitch_split_setpage(device_t dev, uint32_t addr, uint16_t *phy, + uint16_t *reg) +{ + struct arswitch_softc *sc = device_get_softc(dev); + uint16_t page; + + page = ((addr) >> 9) & 0xffff; + *phy = (((addr) >> 6) & 0x07) | 0x10; + *reg = ((addr) >> 1) & 0x1f; + + if (sc->page != page) { + MDIO_WRITEREG(device_get_parent(dev), 0x18, 0, page); + sc->page = page; + } +} + +/* + * Read half a register. Some of the registers define control bits, and + * the sequence of half-word accesses matters. The register addresses + * are word-even (mod 4). + */ +static inline int +arswitch_readreg16(device_t dev, int addr) +{ + uint16_t phy, reg; + + arswitch_split_setpage(dev, addr, &phy, ®); + return (MDIO_READREG(device_get_parent(dev), phy, reg)); +} + +/* + * XXX NOTE: + * + * This may not work for AR7240 series embedded switches - + * the per-PHY register space doesn't seem to be exposed. + * + * In that instance, it may be required to speak via + * the internal switch PHY MDIO bus indirection. + */ +void +arswitch_writedbg(device_t dev, int phy, uint16_t dbg_addr, + uint16_t dbg_data) +{ + (void) MDIO_WRITEREG(device_get_parent(dev), phy, + MII_ATH_DBG_ADDR, dbg_addr); + (void) MDIO_WRITEREG(device_get_parent(dev), phy, + MII_ATH_DBG_DATA, dbg_data); +} + +/* + * Write half a register + */ +static inline int +arswitch_writereg16(device_t dev, int addr, int data) +{ + uint16_t phy, reg; + + arswitch_split_setpage(dev, addr, &phy, ®); + return (MDIO_WRITEREG(device_get_parent(dev), phy, reg, data)); +} + +int +arswitch_readreg_lsb(device_t dev, int addr) +{ + + return (arswitch_readreg16(dev, addr)); +} + +int +arswitch_readreg_msb(device_t dev, int addr) +{ + + return (arswitch_readreg16(dev, addr + 2) << 16); +} + +int +arswitch_writereg_lsb(device_t dev, int addr, int data) +{ + + return (arswitch_writereg16(dev, addr, data & 0xffff)); +} + +int +arswitch_writereg_msb(device_t dev, int addr, int data) +{ + + return (arswitch_writereg16(dev, addr + 2, data >> 16)); +} + +int +arswitch_readreg(device_t dev, int addr) +{ + + return (arswitch_readreg_lsb(dev, addr) | + arswitch_readreg_msb(dev, addr)); +} + +int +arswitch_writereg(device_t dev, int addr, int value) +{ + + /* XXX Check the first write too? */ + arswitch_writereg_lsb(dev, addr, value); + return (arswitch_writereg_msb(dev, addr, value)); +} + +int +arswitch_modifyreg(device_t dev, int addr, int mask, int set) +{ + int value; + + value = arswitch_readreg(dev, addr); + value &= ~mask; + value |= set; + return (arswitch_writereg(dev, addr, value)); +} diff --git a/sys/dev/etherswitch/arswitch/arswitch_reg.h b/sys/dev/etherswitch/arswitch/arswitch_reg.h new file mode 100644 index 00000000000..fdac59f9d78 --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitch_reg.h @@ -0,0 +1,44 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#ifndef __ARSWITCH_REG_H__ +#define __ARSWITCH_REG_H__ + +extern void arswitch_writedbg(device_t dev, int phy, uint16_t dbg_addr, + uint16_t dbg_data); + +extern int arswitch_readreg(device_t dev, int addr); +extern int arswitch_writereg(device_t dev, int addr, int value); +extern int arswitch_modifyreg(device_t dev, int addr, int mask, int set); + +extern int arswitch_readreg_lsb(device_t dev, int addr); +extern int arswitch_readreg_msb(device_t dev, int addr); + +extern int arswitch_writereg_lsb(device_t dev, int addr, int data); +extern int arswitch_writereg_msb(device_t dev, int addr, int data); + +#endif /* __ARSWITCH_REG_H__ */ diff --git a/sys/dev/etherswitch/arswitch/arswitchreg.h b/sys/dev/etherswitch/arswitch/arswitchreg.h new file mode 100644 index 00000000000..499d94cef3e --- /dev/null +++ b/sys/dev/etherswitch/arswitch/arswitchreg.h @@ -0,0 +1,291 @@ +/*- + * Copyright (c) 2011 Aleksandr Rybalko. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef __AR8X16_SWITCHREG_H__ +#define __AR8X16_SWITCHREG_H__ + +/* XXX doesn't belong here; stolen shamelessly from ath_hal/ah_internal.h */ +/* + * Register manipulation macros that expect bit field defines + * to follow the convention that an _S suffix is appended for + * a shift count, while the field mask has no suffix. + */ +#define SM(_v, _f) (((_v) << _f##_S) & (_f)) +#define MS(_v, _f) (((_v) & (_f)) >> _f##_S) + +/* Atheros specific MII registers */ +#define MII_ATH_DBG_ADDR 0x1d +#define MII_ATH_DBG_DATA 0x1e + +#define AR8X16_REG_MASK_CTRL 0x0000 +#define AR8X16_MASK_CTRL_REV_MASK 0x000000ff +#define AR8X16_MASK_CTRL_VER_MASK 0x0000ff00 +#define AR8X16_MASK_CTRL_VER_SHIFT 8 +#define AR8X16_MASK_CTRL_SOFT_RESET (1 << 31) + +#define AR8X16_REG_MODE 0x0008 +/* DIR-615 E4 U-Boot */ +#define AR8X16_MODE_DIR_615_UBOOT 0x8d1003e0 +/* From Ubiquiti RSPRO */ +#define AR8X16_MODE_RGMII_PORT4_ISO 0x81461bea +#define AR8X16_MODE_RGMII_PORT4_SWITCH 0x01261be2 +/* AVM Fritz!Box 7390 */ +#define AR8X16_MODE_GMII 0x010e5b71 +/* from avm_cpmac/linux_ar_reg.h */ +#define AR8X16_MODE_RESERVED 0x000e1b20 +#define AR8X16_MODE_MAC0_GMII_EN (1u << 0) +#define AR8X16_MODE_MAC0_RGMII_EN (1u << 1) +#define AR8X16_MODE_PHY4_GMII_EN (1u << 2) +#define AR8X16_MODE_PHY4_RGMII_EN (1u << 3) +#define AR8X16_MODE_MAC0_MAC_MODE (1u << 4) +#define AR8X16_MODE_RGMII_RXCLK_DELAY_EN (1u << 6) +#define AR8X16_MODE_RGMII_TXCLK_DELAY_EN (1u << 7) +#define AR8X16_MODE_MAC5_MAC_MODE (1u << 14) +#define AR8X16_MODE_MAC5_PHY_MODE (1u << 15) +#define AR8X16_MODE_TXDELAY_S0 (1u << 21) +#define AR8X16_MODE_TXDELAY_S1 (1u << 22) +#define AR8X16_MODE_RXDELAY_S0 (1u << 23) +#define AR8X16_MODE_LED_OPEN_EN (1u << 24) +#define AR8X16_MODE_SPI_EN (1u << 25) +#define AR8X16_MODE_RXDELAY_S1 (1u << 26) +#define AR8X16_MODE_POWER_ON_SEL (1u << 31) + +#define AR8X16_REG_ISR 0x0010 +#define AR8X16_REG_IMR 0x0014 + +#define AR8X16_REG_SW_MAC_ADDR0 0x0020 +#define AR8X16_REG_SW_MAC_ADDR1 0x0024 + +#define AR8X16_REG_FLOOD_MASK 0x002c +#define AR8X16_FLOOD_MASK_BCAST_TO_CPU (1 << 26) + +#define AR8X16_REG_GLOBAL_CTRL 0x0030 +#define AR8216_GLOBAL_CTRL_MTU_MASK 0x00000fff +#define AR8216_GLOBAL_CTRL_MTU_MASK_S 0 +#define AR8316_GLOBAL_CTRL_MTU_MASK 0x00007fff +#define AR8316_GLOBAL_CTRL_MTU_MASK_S 0 +#define AR8236_GLOBAL_CTRL_MTU_MASK 0x00007fff +#define AR8236_GLOBAL_CTRL_MTU_MASK_S 0 +#define AR7240_GLOBAL_CTRL_MTU_MASK 0x00003fff +#define AR7240_GLOBAL_CTRL_MTU_MASK_S 0 + +#define AR8X16_REG_VLAN_CTRL 0x0040 +#define AR8X16_VLAN_OP 0x00000007 +#define AR8X16_VLAN_OP_NOOP 0x0 +#define AR8X16_VLAN_OP_FLUSH 0x1 +#define AR8X16_VLAN_OP_LOAD 0x2 +#define AR8X16_VLAN_OP_PURGE 0x3 +#define AR8X16_VLAN_OP_REMOVE_PORT 0x4 +#define AR8X16_VLAN_OP_GET_NEXT 0x5 +#define AR8X16_VLAN_OP_GET 0x6 +#define AR8X16_VLAN_ACTIVE (1 << 3) +#define AR8X16_VLAN_FULL (1 << 4) +#define AR8X16_VLAN_PORT 0x00000f00 +#define AR8X16_VLAN_PORT_SHIFT 8 +#define AR8X16_VLAN_VID 0x0fff0000 +#define AR8X16_VLAN_VID_SHIFT 16 +#define AR8X16_VLAN_PRIO 0x70000000 +#define AR8X16_VLAN_PRIO_SHIFT 28 +#define AR8X16_VLAN_PRIO_EN (1 << 31) + +#define AR8X16_REG_VLAN_DATA 0x0044 +#define AR8X16_VLAN_MEMBER 0x000003ff +#define AR8X16_VLAN_VALID (1 << 11) + +#define AR8X16_REG_ARL_CTRL0 0x0050 +#define AR8X16_REG_ARL_CTRL1 0x0054 +#define AR8X16_REG_ARL_CTRL2 0x0058 + +#define AR8X16_REG_AT_CTRL 0x005c +#define AR8X16_AT_CTRL_ARP_EN (1 << 20) + +#define AR8X16_REG_IP_PRIORITY_1 0x0060 +#define AR8X16_REG_IP_PRIORITY_2 0x0064 +#define AR8X16_REG_IP_PRIORITY_3 0x0068 +#define AR8X16_REG_IP_PRIORITY_4 0x006C + +#define AR8X16_REG_TAG_PRIO 0x0070 + +#define AR8X16_REG_SERVICE_TAG 0x0074 +#define AR8X16_SERVICE_TAG_MASK 0x0000ffff + +#define AR8X16_REG_CPU_PORT 0x0078 +#define AR8X16_MIRROR_PORT_SHIFT 4 +#define AR8X16_MIRROR_PORT_MASK (0xf << AR8X16_MIRROR_PORT_SHIFT) +#define AR8X16_CPU_MIRROR_PORT(_p) ((_p) << AR8X16_MIRROR_PORT_SHIFT) +#define AR8X16_CPU_MIRROR_DIS AR8X16_CPU_MIRROR_PORT(0xf) +#define AR8X16_CPU_PORT_EN (1 << 8) + +#define AR8X16_REG_MIB_FUNC0 0x0080 +#define AR8X16_MIB_TIMER_MASK 0x0000ffff +#define AR8X16_MIB_AT_HALF_EN (1 << 16) +#define AR8X16_MIB_BUSY (1 << 17) +#define AR8X16_MIB_FUNC_SHIFT 24 +#define AR8X16_MIB_FUNC_NO_OP 0x0 +#define AR8X16_MIB_FUNC_FLUSH 0x1 +#define AR8X16_MIB_FUNC_CAPTURE 0x3 +#define AR8X16_MIB_FUNC_XXX (1 << 30) /* 0x40000000 */ + +#define AR8X16_REG_MDIO_HIGH_ADDR 0x0094 + +#define AR8X16_REG_MDIO_CTRL 0x0098 +#define AR8X16_MDIO_CTRL_DATA_MASK 0x0000ffff +#define AR8X16_MDIO_CTRL_REG_ADDR_SHIFT 16 +#define AR8X16_MDIO_CTRL_PHY_ADDR_SHIFT 21 +#define AR8X16_MDIO_CTRL_CMD_WRITE 0 +#define AR8X16_MDIO_CTRL_CMD_READ (1 << 27) +#define AR8X16_MDIO_CTRL_MASTER_EN (1 << 30) +#define AR8X16_MDIO_CTRL_BUSY (1 << 31) + +#define AR8X16_REG_PORT_BASE(_p) (0x0100 + (_p) * 0x0100) + +#define AR8X16_REG_PORT_STS(_p) (AR8X16_REG_PORT_BASE((_p)) + 0x0000) +#define AR8X16_PORT_STS_SPEED_MASK 0x00000003 +#define AR8X16_PORT_STS_SPEED_10 0 +#define AR8X16_PORT_STS_SPEED_100 1 +#define AR8X16_PORT_STS_SPEED_1000 2 +#define AR8X16_PORT_STS_TXMAC (1 << 2) +#define AR8X16_PORT_STS_RXMAC (1 << 3) +#define AR8X16_PORT_STS_TXFLOW (1 << 4) +#define AR8X16_PORT_STS_RXFLOW (1 << 5) +#define AR8X16_PORT_STS_DUPLEX (1 << 6) +#define AR8X16_PORT_STS_LINK_UP (1 << 8) +#define AR8X16_PORT_STS_LINK_AUTO (1 << 9) +#define AR8X16_PORT_STS_LINK_PAUSE (1 << 10) + +#define AR8X16_REG_PORT_CTRL(_p) (AR8X16_REG_PORT_BASE((_p)) + 0x0004) +#define AR8X16_PORT_CTRL_STATE_MASK 0x00000007 +#define AR8X16_PORT_CTRL_STATE_DISABLED 0 +#define AR8X16_PORT_CTRL_STATE_BLOCK 1 +#define AR8X16_PORT_CTRL_STATE_LISTEN 2 +#define AR8X16_PORT_CTRL_STATE_LEARN 3 +#define AR8X16_PORT_CTRL_STATE_FORWARD 4 +#define AR8X16_PORT_CTRL_LEARN_LOCK (1 << 7) +#define AR8X16_PORT_CTRL_EGRESS_VLAN_MODE_SHIFT 8 +#define AR8X16_PORT_CTRL_EGRESS_VLAN_MODE_KEEP 0 +#define AR8X16_PORT_CTRL_EGRESS_VLAN_MODE_STRIP 1 +#define AR8X16_PORT_CTRL_EGRESS_VLAN_MODE_ADD 2 +#define AR8X16_PORT_CTRL_EGRESS_VLAN_MODE_DOUBLE_TAG 3 +#define AR8X16_PORT_CTRL_IGMP_SNOOP (1 << 10) +#define AR8X16_PORT_CTRL_HEADER (1 << 11) +#define AR8X16_PORT_CTRL_MAC_LOOP (1 << 12) +#define AR8X16_PORT_CTRL_SINGLE_VLAN (1 << 13) +#define AR8X16_PORT_CTRL_LEARN (1 << 14) +#define AR8X16_PORT_CTRL_DOUBLE_TAG (1 << 15) +#define AR8X16_PORT_CTRL_MIRROR_TX (1 << 16) +#define AR8X16_PORT_CTRL_MIRROR_RX (1 << 17) + +#define AR8X16_REG_PORT_VLAN(_p) (AR8X16_REG_PORT_BASE((_p)) + 0x0008) + +#define AR8X16_PORT_VLAN_DEFAULT_ID_SHIFT 0 +#define AR8X16_PORT_VLAN_DEST_PORTS_SHIFT 16 +#define AR8X16_PORT_VLAN_MODE_MASK 0xc0000000 +#define AR8X16_PORT_VLAN_MODE_SHIFT 30 +#define AR8X16_PORT_VLAN_MODE_PORT_ONLY 0 +#define AR8X16_PORT_VLAN_MODE_PORT_FALLBACK 1 +#define AR8X16_PORT_VLAN_MODE_VLAN_ONLY 2 +#define AR8X16_PORT_VLAN_MODE_SECURE 3 + +#define AR8X16_REG_PORT_RATE_LIM(_p) (AR8X16_REG_PORT_BASE((_p)) + 0x000c) +#define AR8X16_PORT_RATE_LIM_128KB 0 +#define AR8X16_PORT_RATE_LIM_256KB 1 +#define AR8X16_PORT_RATE_LIM_512KB 2 +#define AR8X16_PORT_RATE_LIM_1MB 3 +#define AR8X16_PORT_RATE_LIM_2MB 4 +#define AR8X16_PORT_RATE_LIM_4MB 5 +#define AR8X16_PORT_RATE_LIM_8MB 6 +#define AR8X16_PORT_RATE_LIM_16MB 7 +#define AR8X16_PORT_RATE_LIM_32MB 8 +#define AR8X16_PORT_RATE_LIM_64MB 9 +#define AR8X16_PORT_RATE_LIM_IN_EN (1 << 24) +#define AR8X16_PORT_RATE_LIM_OUT_EN (1 << 23) +#define AR8X16_PORT_RATE_LIM_IN_MASK 0x000f0000 +#define AR8X16_PORT_RATE_LIM_IN_SHIFT 16 +#define AR8X16_PORT_RATE_LIM_OUT_MASK 0x0000000f +#define AR8X16_PORT_RATE_LIM_OUT_SHIFT 0 + +#define AR8X16_REG_PORT_PRIORITY(_p) (AR8X16_REG_PORT_BASE((_p)) + 0x0010) + +#define AR8X16_REG_STATS_BASE(_p) (0x20000 + (_p) * 0x100) + +#define AR8X16_STATS_RXBROAD 0x0000 +#define AR8X16_STATS_RXPAUSE 0x0004 +#define AR8X16_STATS_RXMULTI 0x0008 +#define AR8X16_STATS_RXFCSERR 0x000c +#define AR8X16_STATS_RXALIGNERR 0x0010 +#define AR8X16_STATS_RXRUNT 0x0014 +#define AR8X16_STATS_RXFRAGMENT 0x0018 +#define AR8X16_STATS_RX64BYTE 0x001c +#define AR8X16_STATS_RX128BYTE 0x0020 +#define AR8X16_STATS_RX256BYTE 0x0024 +#define AR8X16_STATS_RX512BYTE 0x0028 +#define AR8X16_STATS_RX1024BYTE 0x002c +#define AR8X16_STATS_RX1518BYTE 0x0030 +#define AR8X16_STATS_RXMAXBYTE 0x0034 +#define AR8X16_STATS_RXTOOLONG 0x0038 +#define AR8X16_STATS_RXGOODBYTE 0x003c +#define AR8X16_STATS_RXBADBYTE 0x0044 +#define AR8X16_STATS_RXOVERFLOW 0x004c +#define AR8X16_STATS_FILTERED 0x0050 +#define AR8X16_STATS_TXBROAD 0x0054 +#define AR8X16_STATS_TXPAUSE 0x0058 +#define AR8X16_STATS_TXMULTI 0x005c +#define AR8X16_STATS_TXUNDERRUN 0x0060 +#define AR8X16_STATS_TX64BYTE 0x0064 +#define AR8X16_STATS_TX128BYTE 0x0068 +#define AR8X16_STATS_TX256BYTE 0x006c +#define AR8X16_STATS_TX512BYTE 0x0070 +#define AR8X16_STATS_TX1024BYTE 0x0074 +#define AR8X16_STATS_TX1518BYTE 0x0078 +#define AR8X16_STATS_TXMAXBYTE 0x007c +#define AR8X16_STATS_TXOVERSIZE 0x0080 +#define AR8X16_STATS_TXBYTE 0x0084 +#define AR8X16_STATS_TXCOLLISION 0x008c +#define AR8X16_STATS_TXABORTCOL 0x0090 +#define AR8X16_STATS_TXMULTICOL 0x0094 +#define AR8X16_STATS_TXSINGLECOL 0x0098 +#define AR8X16_STATS_TXEXCDEFER 0x009c +#define AR8X16_STATS_TXDEFER 0x00a0 +#define AR8X16_STATS_TXLATECOL 0x00a4 + +#define AR8X16_PORT_CPU 0 +#define AR8X16_NUM_PORTS 6 +#define AR8X16_NUM_PHYS 5 +#define AR8X16_MAGIC 0xc000050e + +#define AR8X16_PHY_ID1 0x004d +#define AR8X16_PHY_ID2 0xd041 + +#define AR8X16_PORT_MASK(_port) (1 << (_port)) +#define AR8X16_PORT_MASK_ALL ((1<sc_switchtype == AR8X16_SWITCH_ ## _type)) + +struct arswitch_softc; + +struct arswitch_softc { + struct mtx sc_mtx; /* serialize access to softc */ + device_t sc_dev; + int phy4cpu; /* PHY4 is connected to the CPU */ + int numphys; /* PHYs we manage */ + int is_rgmii; /* PHY mode is RGMII (XXX which PHY?) */ + int is_gmii; /* PHY mode is GMII (XXX which PHY?) */ + int page; + ar8x16_switch_type sc_switchtype; + char *ifname[AR8X16_NUM_PHYS]; + device_t miibus[AR8X16_NUM_PHYS]; + struct ifnet *ifp[AR8X16_NUM_PHYS]; + struct callout callout_tick; + etherswitch_info_t info; + + struct { + int (* arswitch_hw_setup) (struct arswitch_softc *); + int (* arswitch_hw_global_setup) (struct arswitch_softc *); + } hal; +}; + +#define ARSWITCH_LOCK(_sc) \ + mtx_lock(&(_sc)->sc_mtx) +#define ARSWITCH_UNLOCK(_sc) \ + mtx_unlock(&(_sc)->sc_mtx) +#define ARSWITCH_LOCK_ASSERT(_sc, _what) \ + mtx_assert(&(_s)c->sc_mtx, (_what)) +#define ARSWITCH_TRYLOCK(_sc) \ + mtx_trylock(&(_sc)->sc_mtx) + +#if defined(DEBUG) +#define DPRINTF(dev, args...) device_printf(dev, args) +#define DEVERR(dev, err, fmt, args...) do { \ + if (err != 0) device_printf(dev, fmt, err, args); \ + } while (0) +#define DEBUG_INCRVAR(var) do { \ + var++; \ + } while (0) +#else +#define DPRINTF(dev, args...) +#define DEVERR(dev, err, fmt, args...) +#define DEBUG_INCRVAR(var) +#endif + +#endif /* __ARSWITCHVAR_H__ */ + diff --git a/sys/dev/etherswitch/etherswitch.c b/sys/dev/etherswitch/etherswitch.c new file mode 100644 index 00000000000..a2162899f9f --- /dev/null +++ b/sys/dev/etherswitch/etherswitch.c @@ -0,0 +1,257 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "etherswitch_if.h" + +#define BUFSIZE 1024 + +struct etherswitch_softc { + device_t sc_dev; + int sc_count; + + struct cdev *sc_devnode; + struct sx sc_lock; +}; + +#define SWITCH_LOCK(sc) sx_xlock(&(sc)->sc_lock) +#define SWITCH_UNLOCK(sc) sx_xunlock(&(sc)->sc_lock) + +static int etherswitch_probe(device_t); +static int etherswitch_attach(device_t); +static int etherswitch_detach(device_t); +static void etherswitch_identify(driver_t *driver, device_t parent); + +devclass_t etherswitch_devclass; + +static device_method_t etherswitch_methods[] = { + /* device interface */ + DEVMETHOD(device_identify, etherswitch_identify), + DEVMETHOD(device_probe, etherswitch_probe), + DEVMETHOD(device_attach, etherswitch_attach), + DEVMETHOD(device_detach, etherswitch_detach), + + { 0, 0 } +}; + +driver_t etherswitch_driver = { + "etherswitch", + etherswitch_methods, + sizeof(struct etherswitch_softc), +}; + +static d_open_t etherswitchopen; +static d_close_t etherswitchclose; +static d_write_t etherswitchwrite; +static d_read_t etherswitchread; +static d_ioctl_t etherswitchioctl; + +static struct cdevsw etherswitch_cdevsw = { + .d_version = D_VERSION, + .d_flags = D_TRACKCLOSE, + .d_open = etherswitchopen, + .d_close = etherswitchclose, + .d_read = etherswitchread, + .d_write = etherswitchwrite, + .d_ioctl = etherswitchioctl, + .d_name = "etherswitch", +}; + +static void +etherswitch_identify(driver_t *driver, device_t parent) +{ + if (device_find_child(parent, "etherswitch", -1) == NULL) + BUS_ADD_CHILD(parent, 0, "etherswitch", -1); +} + +static int +etherswitch_probe(device_t dev) +{ + device_set_desc(dev, "Switch controller"); + + return (0); +} + +static int +etherswitch_attach(device_t dev) +{ + struct etherswitch_softc *sc = (struct etherswitch_softc *)device_get_softc(dev); + + sc->sc_dev = dev; + sx_init(&sc->sc_lock, "etherswitch"); + sc->sc_devnode = make_dev(ðerswitch_cdevsw, device_get_unit(dev), + UID_ROOT, GID_WHEEL, + 0600, "etherswitch%d", device_get_unit(dev)); + if (sc->sc_devnode == NULL) { + device_printf(dev, "failed to create character device\n"); + sx_destroy(&sc->sc_lock); + return (ENXIO); + } + sc->sc_devnode->si_drv1 = sc; + + return (0); +} + +static int +etherswitch_detach(device_t dev) +{ + struct etherswitch_softc *sc = (struct etherswitch_softc *)device_get_softc(dev); + + if (sc->sc_devnode) + destroy_dev(sc->sc_devnode); + sx_destroy(&sc->sc_lock); + + return (0); +} + +static int +etherswitchopen(struct cdev *dev, int flags, int fmt, struct thread *td) +{ + struct etherswitch_softc *sc = dev->si_drv1; + + SWITCH_LOCK(sc); + if (sc->sc_count > 0) { + SWITCH_UNLOCK(sc); + return (EBUSY); + } + + sc->sc_count++; + SWITCH_UNLOCK(sc); + + return (0); +} + +static int +etherswitchclose(struct cdev *dev, int flags, int fmt, struct thread *td) +{ + struct etherswitch_softc *sc = dev->si_drv1; + + SWITCH_LOCK(sc); + if (sc->sc_count == 0) { + SWITCH_UNLOCK(sc); + return (EINVAL); + } + + sc->sc_count--; + + if (sc->sc_count < 0) + panic("%s: etherswitch_count < 0!", __func__); + SWITCH_UNLOCK(sc); + + return (0); +} + +static int +etherswitchwrite(struct cdev *dev, struct uio * uio, int ioflag) +{ + return (EINVAL); +} + +static int +etherswitchread(struct cdev *dev, struct uio * uio, int ioflag) +{ + return (EINVAL); +} + +static int +etherswitchioctl(struct cdev *cdev, u_long cmd, caddr_t data, int flags, struct thread *td) +{ + struct etherswitch_softc *sc = cdev->si_drv1; + device_t dev = sc->sc_dev; + device_t etherswitch = device_get_parent(dev); + etherswitch_info_t *info; + etherswitch_reg_t *reg; + etherswitch_phyreg_t *phyreg; + int error = 0; + + switch (cmd) { + case IOETHERSWITCHGETINFO: + info = ETHERSWITCH_GETINFO(etherswitch); + bcopy(info, data, sizeof(etherswitch_info_t)); + break; + + case IOETHERSWITCHGETREG: + reg = (etherswitch_reg_t *)data; + reg->val = ETHERSWITCH_READREG(etherswitch, reg->reg); + break; + + case IOETHERSWITCHSETREG: + reg = (etherswitch_reg_t *)data; + error = ETHERSWITCH_WRITEREG(etherswitch, reg->reg, reg->val); + break; + + case IOETHERSWITCHGETPORT: + error = ETHERSWITCH_GETPORT(etherswitch, (etherswitch_port_t *)data); + break; + + case IOETHERSWITCHSETPORT: + error = ETHERSWITCH_SETPORT(etherswitch, (etherswitch_port_t *)data); + break; + + case IOETHERSWITCHGETVLANGROUP: + error = ETHERSWITCH_GETVGROUP(etherswitch, (etherswitch_vlangroup_t *)data); + break; + + case IOETHERSWITCHSETVLANGROUP: + error = ETHERSWITCH_SETVGROUP(etherswitch, (etherswitch_vlangroup_t *)data); + break; + + case IOETHERSWITCHGETPHYREG: + phyreg = (etherswitch_phyreg_t *)data; + phyreg->val = ETHERSWITCH_READPHYREG(etherswitch, phyreg->phy, phyreg->reg); + break; + + case IOETHERSWITCHSETPHYREG: + phyreg = (etherswitch_phyreg_t *)data; + error = ETHERSWITCH_WRITEPHYREG(etherswitch, phyreg->phy, phyreg->reg, phyreg->val); + break; + + default: + error = ENOTTY; + } + + return (error); +} + +MODULE_VERSION(etherswitch, 1); diff --git a/sys/dev/etherswitch/etherswitch.h b/sys/dev/etherswitch/etherswitch.h new file mode 100644 index 00000000000..8b02f697f2b --- /dev/null +++ b/sys/dev/etherswitch/etherswitch.h @@ -0,0 +1,70 @@ +/* + * $FreeBSD$ + */ + +#ifndef __SYS_DEV_ETHERSWITCH_ETHERSWITCH_H +#define __SYS_DEV_ETHERSWITCH_ETHERSWITCH_H + +#include + +#ifdef _KERNEL +extern devclass_t etherswitch_devclass; +extern driver_t etherswitch_driver; +#endif /* _KERNEL */ + +struct etherswitch_reg { + uint16_t reg; + uint16_t val; +}; +typedef struct etherswitch_reg etherswitch_reg_t; + +struct etherswitch_phyreg { + uint16_t phy; + uint16_t reg; + uint16_t val; +}; +typedef struct etherswitch_phyreg etherswitch_phyreg_t; + +#define ETHERSWITCH_NAMEMAX 64 + +struct etherswitch_info { + int es_nports; + int es_nvlangroups; + char es_name[ETHERSWITCH_NAMEMAX]; +}; +typedef struct etherswitch_info etherswitch_info_t; + +struct etherswitch_port { + int es_port; + int es_vlangroup; + union { + struct ifreq es_uifr; + struct ifmediareq es_uifmr; + } es_ifu; +#define es_ifr es_ifu.es_uifr +#define es_ifmr es_ifu.es_uifmr +}; +typedef struct etherswitch_port etherswitch_port_t; + +struct etherswitch_vlangroup { + int es_vlangroup; + int es_vid; + int es_member_ports; + int es_untagged_ports; + int es_fid; +}; +typedef struct etherswitch_vlangroup etherswitch_vlangroup_t; + +#define ETHERSWITCH_PORTMASK(_port) (1 << (_port)) + +#define IOETHERSWITCHGETINFO _IOR('i', 1, etherswitch_info_t) +#define IOETHERSWITCHGETREG _IOWR('i', 2, etherswitch_reg_t) +#define IOETHERSWITCHSETREG _IOW('i', 3, etherswitch_reg_t) +#define IOETHERSWITCHGETPORT _IOWR('i', 4, etherswitch_port_t) +#define IOETHERSWITCHSETPORT _IOW('i', 5, etherswitch_port_t) +#define IOETHERSWITCHGETVLANGROUP _IOWR('i', 6, etherswitch_vlangroup_t) +#define IOETHERSWITCHSETVLANGROUP _IOW('i', 7, etherswitch_vlangroup_t) +#define IOETHERSWITCHGETPHYREG _IOWR('i', 8, etherswitch_phyreg_t) +#define IOETHERSWITCHSETPHYREG _IOW('i', 9, etherswitch_phyreg_t) + +#endif diff --git a/sys/dev/etherswitch/etherswitch_if.m b/sys/dev/etherswitch/etherswitch_if.m new file mode 100644 index 00000000000..7429c04c946 --- /dev/null +++ b/sys/dev/etherswitch/etherswitch_if.m @@ -0,0 +1,86 @@ +# $FreeBSD$ + +#include + +# Needed for ifreq/ifmediareq +#include +#include + +#include + +INTERFACE etherswitch; + +# +# Return device info +# +METHOD etherswitch_info_t* getinfo { + device_t dev; +} + +# +# Read switch register +# +METHOD int readreg { + device_t dev; + int reg; +}; + +# +# Write switch register +# +METHOD int writereg { + device_t dev; + int reg; + int value; +}; + +# +# Read PHY register +# +METHOD int readphyreg { + device_t dev; + int phy; + int reg; +}; + +# +# Write PHY register +# +METHOD int writephyreg { + device_t dev; + int phy; + int reg; + int value; +}; + +# +# Get port configuration +# +METHOD int getport { + device_t dev; + etherswitch_port_t *vg; +} + +# +# Set port configuration +# +METHOD int setport { + device_t dev; + etherswitch_port_t *vg; +} + +# +# Get VLAN group configuration +# +METHOD int getvgroup { + device_t dev; + etherswitch_vlangroup_t *vg; +} + +# +# Set VLAN group configuration +# +METHOD int setvgroup { + device_t dev; + etherswitch_vlangroup_t *vg; +} diff --git a/sys/dev/etherswitch/mdio.c b/sys/dev/etherswitch/mdio.c new file mode 100644 index 00000000000..1d1d370644a --- /dev/null +++ b/sys/dev/etherswitch/mdio.c @@ -0,0 +1,117 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include + +#include + +#include "mdio_if.h" + +static void +mdio_identify(driver_t *driver, device_t parent) +{ + + if (device_find_child(parent, mdio_driver.name, -1) == NULL) + BUS_ADD_CHILD(parent, 0, mdio_driver.name, -1); +} + +static int +mdio_probe(device_t dev) +{ + + device_set_desc(dev, "MDIO"); + + return (BUS_PROBE_SPECIFIC); +} + +static int +mdio_attach(device_t dev) +{ + + bus_generic_probe(dev); + bus_enumerate_hinted_children(dev); + return (bus_generic_attach(dev)); +} + +static int +mdio_detach(device_t dev) +{ + + bus_generic_detach(dev); + return (0); +} + +static int +mdio_readreg(device_t dev, int phy, int reg) +{ + + return (MDIO_READREG(device_get_parent(dev), phy, reg)); +} + +static int +mdio_writereg(device_t dev, int phy, int reg, int val) +{ + + return (MDIO_WRITEREG(device_get_parent(dev), phy, reg, val)); +} + +static void +mdio_hinted_child(device_t dev, const char *name, int unit) +{ + + device_add_child(dev, name, unit); +} + +static device_method_t mdio_methods[] = { + /* device interface */ + DEVMETHOD(device_identify, mdio_identify), + DEVMETHOD(device_probe, mdio_probe), + DEVMETHOD(device_attach, mdio_attach), + DEVMETHOD(device_detach, mdio_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + + /* bus interface */ + DEVMETHOD(bus_add_child, device_add_child_ordered), + DEVMETHOD(bus_hinted_child, mdio_hinted_child), + + /* MDIO access */ + DEVMETHOD(mdio_readreg, mdio_readreg), + DEVMETHOD(mdio_writereg, mdio_writereg), + + DEVMETHOD_END +}; + +driver_t mdio_driver = { + "mdio", + mdio_methods, + 0 +}; + +devclass_t mdio_devclass; diff --git a/sys/dev/etherswitch/mdio.h b/sys/dev/etherswitch/mdio.h new file mode 100644 index 00000000000..82578e004d2 --- /dev/null +++ b/sys/dev/etherswitch/mdio.h @@ -0,0 +1,35 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef __DEV_ETHERSWITCH_MDIO_H__ +#define __DEV_ETHERSWITCH_MDIO_H__ + +extern driver_t mdio_driver; +extern devclass_t mdio_devclass; + +#endif /* __DEV_ETHERSWITCH_MDIO_H__ */ diff --git a/sys/dev/etherswitch/mdio_if.m b/sys/dev/etherswitch/mdio_if.m new file mode 100644 index 00000000000..9aedd92d292 --- /dev/null +++ b/sys/dev/etherswitch/mdio_if.m @@ -0,0 +1,24 @@ +# $FreeBSD$ + +#include + +INTERFACE mdio; + +# +# Read register from device on MDIO bus +# +METHOD int readreg { + device_t dev; + int phy; + int reg; +}; + +# +# Write register to device on MDIO bus +# +METHOD int writereg { + device_t dev; + int phy; + int reg; + int val; +}; diff --git a/sys/dev/etherswitch/miiproxy.c b/sys/dev/etherswitch/miiproxy.c new file mode 100644 index 00000000000..fe1685db1ed --- /dev/null +++ b/sys/dev/etherswitch/miiproxy.c @@ -0,0 +1,444 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "mdio_if.h" +#include "miibus_if.h" + + +MALLOC_DECLARE(M_MIIPROXY); +MALLOC_DEFINE(M_MIIPROXY, "miiproxy", "miiproxy data structures"); + +driver_t miiproxy_driver; +driver_t mdioproxy_driver; + +struct miiproxy_softc { + device_t parent; + device_t proxy; + device_t mdio; +}; + +struct mdioproxy_softc { +}; + +/* + * The rendevous data structures and functions allow two device endpoints to + * match up, so that the proxy endpoint can be associated with a target + * endpoint. The proxy has to know the device name of the target that it + * wants to associate with, for example through a hint. The rendevous code + * makes no assumptions about the devices that want to meet. + */ +struct rendevous_entry; + +enum rendevous_op { + RENDEVOUS_ATTACH, + RENDEVOUS_DETACH +}; + +typedef int (*rendevous_callback_t)(enum rendevous_op, + struct rendevous_entry *); + +static SLIST_HEAD(rendevoushead, rendevous_entry) rendevoushead = + SLIST_HEAD_INITIALIZER(rendevoushead); + +struct rendevous_endpoint { + device_t device; + const char *name; + rendevous_callback_t callback; +}; + +struct rendevous_entry { + SLIST_ENTRY(rendevous_entry) entries; + struct rendevous_endpoint proxy; + struct rendevous_endpoint target; +}; + +/* + * Call the callback routines for both the proxy and the target. If either + * returns an error, undo the attachment. + */ +static int +rendevous_attach(struct rendevous_entry *e, struct rendevous_endpoint *ep) +{ + int error; + + error = e->proxy.callback(RENDEVOUS_ATTACH, e); + if (error == 0) { + error = e->target.callback(RENDEVOUS_ATTACH, e); + if (error != 0) { + e->proxy.callback(RENDEVOUS_DETACH, e); + ep->device = NULL; + ep->callback = NULL; + } + } + return (error); +} + +/* + * Create an entry for the proxy in the rendevous list. The name parameter + * indicates the name of the device that is the target endpoint for this + * rendevous. The callback will be invoked as soon as the target is + * registered: either immediately if the target registered itself earlier, + * or once the target registers. Returns ENXIO if the target has not yet + * registered. + */ +static int +rendevous_register_proxy(device_t dev, const char *name, + rendevous_callback_t callback) +{ + struct rendevous_entry *e; + + KASSERT(callback != NULL, ("callback must be set")); + SLIST_FOREACH(e, &rendevoushead, entries) { + if (strcmp(name, e->target.name) == 0) { + /* the target is already attached */ + e->proxy.name = device_get_nameunit(dev); + e->proxy.device = dev; + e->proxy.callback = callback; + return (rendevous_attach(e, &e->proxy)); + } + } + e = malloc(sizeof(*e), M_MIIPROXY, M_WAITOK | M_ZERO); + e->proxy.name = device_get_nameunit(dev); + e->proxy.device = dev; + e->proxy.callback = callback; + e->target.name = name; + SLIST_INSERT_HEAD(&rendevoushead, e, entries); + return (ENXIO); +} + +/* + * Create an entry in the rendevous list for the target. + * Returns ENXIO if the proxy has not yet registered. + */ +static int +rendevous_register_target(device_t dev, rendevous_callback_t callback) +{ + struct rendevous_entry *e; + const char *name; + + KASSERT(callback != NULL, ("callback must be set")); + name = device_get_nameunit(dev); + SLIST_FOREACH(e, &rendevoushead, entries) { + if (strcmp(name, e->target.name) == 0) { + e->target.device = dev; + e->target.callback = callback; + return (rendevous_attach(e, &e->target)); + } + } + e = malloc(sizeof(*e), M_MIIPROXY, M_WAITOK | M_ZERO); + e->target.name = name; + e->target.device = dev; + e->target.callback = callback; + SLIST_INSERT_HEAD(&rendevoushead, e, entries); + return (ENXIO); +} + +/* + * Remove the registration for the proxy. + */ +static int +rendevous_unregister_proxy(device_t dev) +{ + struct rendevous_entry *e; + int error = 0; + + SLIST_FOREACH(e, &rendevoushead, entries) { + if (e->proxy.device == dev) { + if (e->target.device == NULL) { + SLIST_REMOVE(&rendevoushead, e, rendevous_entry, entries); + free(e, M_MIIPROXY); + return (0); + } else { + e->proxy.callback(RENDEVOUS_DETACH, e); + e->target.callback(RENDEVOUS_DETACH, e); + } + e->proxy.device = NULL; + e->proxy.callback = NULL; + return (error); + } + } + return (ENOENT); +} + +/* + * Remove the registration for the target. + */ +static int +rendevous_unregister_target(device_t dev) +{ + struct rendevous_entry *e; + int error = 0; + + SLIST_FOREACH(e, &rendevoushead, entries) { + if (e->target.device == dev) { + if (e->proxy.device == NULL) { + SLIST_REMOVE(&rendevoushead, e, rendevous_entry, entries); + free(e, M_MIIPROXY); + return (0); + } else { + e->proxy.callback(RENDEVOUS_DETACH, e); + e->target.callback(RENDEVOUS_DETACH, e); + } + e->target.device = NULL; + e->target.callback = NULL; + return (error); + } + } + return (ENOENT); +} + +/* + * Functions of the proxy that is interposed between the ethernet interface + * driver and the miibus device. + */ + +static int +miiproxy_rendevous_callback(enum rendevous_op op, struct rendevous_entry *rendevous) +{ + struct miiproxy_softc *sc = device_get_softc(rendevous->proxy.device); + + switch (op) { + case RENDEVOUS_ATTACH: + sc->mdio = device_get_parent(rendevous->target.device); + break; + case RENDEVOUS_DETACH: + sc->mdio = NULL; + break; + } + return (0); +} + +static int +miiproxy_probe(device_t dev) +{ + device_set_desc(dev, "MII/MDIO proxy, MII side"); + + return (BUS_PROBE_SPECIFIC); +} + +static int +miiproxy_attach(device_t dev) +{ + + /* + * The ethernet interface needs to call mii_attach_proxy() to pass + * the relevant parameters for rendevous with the MDIO target. + */ + return (bus_generic_attach(dev)); +} + +static int +miiproxy_detach(device_t dev) +{ + + rendevous_unregister_proxy(dev); + bus_generic_detach(dev); + return (0); +} + +static int +miiproxy_readreg(device_t dev, int phy, int reg) +{ + struct miiproxy_softc *sc = device_get_softc(dev); + + if (sc->mdio != NULL) + return (MDIO_READREG(sc->mdio, phy, reg)); + return (-1); +} + +static int +miiproxy_writereg(device_t dev, int phy, int reg, int val) +{ + struct miiproxy_softc *sc = device_get_softc(dev); + + if (sc->mdio != NULL) + return (MDIO_WRITEREG(sc->mdio, phy, reg, val)); + return (-1); +} + +static void +miiproxy_statchg(device_t dev) +{ + + MIIBUS_STATCHG(device_get_parent(dev)); +} + +static void +miiproxy_linkchg(device_t dev) +{ + + MIIBUS_LINKCHG(device_get_parent(dev)); +} + +static void +miiproxy_mediainit(device_t dev) +{ + + MIIBUS_MEDIAINIT(device_get_parent(dev)); +} + +/* + * Functions for the MDIO target device driver. + */ +static int +mdioproxy_rendevous_callback(enum rendevous_op op, struct rendevous_entry *rendevous) +{ + return (0); +} + +static void +mdioproxy_identify(driver_t *driver, device_t parent) +{ + device_t child; + + if (device_find_child(parent, driver->name, -1) == NULL) { + child = BUS_ADD_CHILD(parent, 0, driver->name, -1); + } +} + +static int +mdioproxy_probe(device_t dev) +{ + device_set_desc(dev, "MII/MDIO proxy, MDIO side"); + + return (BUS_PROBE_SPECIFIC); +} + +static int +mdioproxy_attach(device_t dev) +{ + + rendevous_register_target(dev, mdioproxy_rendevous_callback); + return (bus_generic_attach(dev)); +} + +static int +mdioproxy_detach(device_t dev) +{ + + rendevous_unregister_target(dev); + bus_generic_detach(dev); + return (0); +} + +/* + * Attach this proxy in place of miibus. The target MDIO must be attached + * already. Returns NULL on error. + */ +device_t +mii_attach_proxy(device_t dev) +{ + struct miiproxy_softc *sc; + int error; + const char *name; + device_t miiproxy; + + if (resource_string_value(device_get_name(dev), + device_get_unit(dev), "mdio", &name) != 0) { + if (bootverbose) + printf("mii_attach_proxy: not attaching, no mdio" + " device hint for %s\n", device_get_nameunit(dev)); + return (NULL); + } + + miiproxy = device_add_child(dev, miiproxy_driver.name, -1); + error = bus_generic_attach(dev); + if (error != 0) { + device_printf(dev, "can't attach miiproxy\n"); + return (NULL); + } + sc = device_get_softc(miiproxy); + sc->parent = dev; + sc->proxy = miiproxy; + if (rendevous_register_proxy(miiproxy, name, miiproxy_rendevous_callback) != 0) { + device_printf(dev, "can't attach proxy\n"); + return (NULL); + } + device_printf(miiproxy, "attached to target %s\n", device_get_nameunit(sc->mdio)); + return (miiproxy); +} + +static device_method_t miiproxy_methods[] = { + /* device interface */ + DEVMETHOD(device_probe, miiproxy_probe), + DEVMETHOD(device_attach, miiproxy_attach), + DEVMETHOD(device_detach, miiproxy_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + + /* MII interface */ + DEVMETHOD(miibus_readreg, miiproxy_readreg), + DEVMETHOD(miibus_writereg, miiproxy_writereg), + DEVMETHOD(miibus_statchg, miiproxy_statchg), + DEVMETHOD(miibus_linkchg, miiproxy_linkchg), + DEVMETHOD(miibus_mediainit, miiproxy_mediainit), + + DEVMETHOD_END +}; + +static device_method_t mdioproxy_methods[] = { + /* device interface */ + DEVMETHOD(device_identify, mdioproxy_identify), + DEVMETHOD(device_probe, mdioproxy_probe), + DEVMETHOD(device_attach, mdioproxy_attach), + DEVMETHOD(device_detach, mdioproxy_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + + DEVMETHOD_END +}; + +DEFINE_CLASS_0(miiproxy, miiproxy_driver, miiproxy_methods, + sizeof(struct miiproxy_softc)); +DEFINE_CLASS_0(mdioproxy, mdioproxy_driver, mdioproxy_methods, + sizeof(struct mdioproxy_softc)); + +devclass_t miiproxy_devclass; +static devclass_t mdioproxy_devclass; + +DRIVER_MODULE(mdioproxy, mdio, mdioproxy_driver, mdioproxy_devclass, 0, 0); +DRIVER_MODULE(miibus, miiproxy, miibus_driver, miibus_devclass, 0, 0); +MODULE_VERSION(miiproxy, 1); +MODULE_DEPEND(miiproxy, miibus, 1, 1, 1); diff --git a/sys/dev/etherswitch/miiproxy.h b/sys/dev/etherswitch/miiproxy.h new file mode 100644 index 00000000000..4883c57dabd --- /dev/null +++ b/sys/dev/etherswitch/miiproxy.h @@ -0,0 +1,37 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef __DEV_ETHERSWITCH_MIIPROXY_H__ +#define __DEV_ETHERSWITCH_MIIPROXY_H__ + +extern devclass_t miiproxy_devclass; +extern driver_t miiproxy_driver; + +device_t mii_attach_proxy(device_t dev); + +#endif /* __DEV_ETHERSWITCH_MIIPROXY_H__ */ diff --git a/sys/dev/etherswitch/rtl8366/rtl8366rb.c b/sys/dev/etherswitch/rtl8366/rtl8366rb.c new file mode 100644 index 00000000000..9b648515f5d --- /dev/null +++ b/sys/dev/etherswitch/rtl8366/rtl8366rb.c @@ -0,0 +1,755 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "iicbus_if.h" +#include "miibus_if.h" +#include "etherswitch_if.h" + + +struct rtl8366rb_softc { + struct mtx sc_mtx; /* serialize access to softc */ + int smi_acquired; /* serialize access to SMI/I2C bus */ + struct mtx callout_mtx; /* serialize callout */ + device_t dev; + char *ifname[RTL8366RB_NUM_PHYS]; + device_t miibus[RTL8366RB_NUM_PHYS]; + struct ifnet *ifp[RTL8366RB_NUM_PHYS]; + struct callout callout_tick; +}; + +static etherswitch_info_t etherswitch_info = { + .es_nports = 6, + .es_nvlangroups = 16, + .es_name = "Realtek RTL8366RB" +}; + +#define RTL_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) +#define RTL_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) +#define RTL_LOCK_ASSERT(_sc, _what) mtx_assert(&(_s)c->sc_mtx, (_what)) +#define RTL_TRYLOCK(_sc) mtx_trylock(&(_sc)->sc_mtx) + +#define RTL_WAITOK 0 +#define RTL_NOWAIT 1 + +#define RTL_SMI_ACQUIRED 1 +#define RTL_SMI_ACQUIRED_ASSERT(_sc) \ + KASSERT((_sc)->smi_acquired == RTL_SMI_ACQUIRED, ("smi must be acquired @%s", __FUNCTION__)) + +#if defined(DEBUG) +#define DPRINTF(dev, args...) device_printf(dev, args) +#define DEVERR(dev, err, fmt, args...) do { \ + if (err != 0) device_printf(dev, fmt, err, args); \ + } while (0) +#define DEBUG_INCRVAR(var) do { \ + var++; \ + } while (0) + +static int callout_blocked = 0; +static int iic_select_retries = 0; +static int phy_access_retries = 0; +static SYSCTL_NODE(_debug, OID_AUTO, rtl8366rb, CTLFLAG_RD, 0, "rtl8366rb"); +SYSCTL_INT(_debug_rtl8366rb, OID_AUTO, callout_blocked, CTLFLAG_RW, &callout_blocked, 0, + "number of times the callout couldn't acquire the bus"); +SYSCTL_INT(_debug_rtl8366rb, OID_AUTO, iic_select_retries, CTLFLAG_RW, &iic_select_retries, 0, + "number of times the I2C bus selection had to be retried"); +SYSCTL_INT(_debug_rtl8366rb, OID_AUTO, phy_access_retries, CTLFLAG_RW, &phy_access_retries, 0, + "number of times PHY register access had to be retried"); +#else +#define DPRINTF(dev, args...) +#define DEVERR(dev, err, fmt, args...) +#define DEBUG_INCRVAR(var) +#endif + +static int smi_probe(device_t dev); +static int smi_read(device_t dev, uint16_t addr, uint16_t *data, int sleep); +static int smi_write(device_t dev, uint16_t addr, uint16_t data, int sleep); +static int smi_rmw(device_t dev, uint16_t addr, uint16_t mask, uint16_t data, int sleep); +static void rtl8366rb_tick(void *arg); +static int rtl8366rb_ifmedia_upd(struct ifnet *); +static void rtl8366rb_ifmedia_sts(struct ifnet *, struct ifmediareq *); + +static void +rtl8366rb_identify(driver_t *driver, device_t parent) +{ + device_t child; + struct iicbus_ivar *devi; + + if (device_find_child(parent, "rtl8366rb", -1) == NULL) { + child = BUS_ADD_CHILD(parent, 0, "rtl8366rb", -1); + devi = IICBUS_IVAR(child); + devi->addr = RTL8366RB_IIC_ADDR; + } +} + +static int +rtl8366rb_probe(device_t dev) +{ + if (smi_probe(dev) != 0) + return (ENXIO); + device_set_desc(dev, "RTL8366RB Ethernet Switch Controller"); + return (BUS_PROBE_DEFAULT); +} + +static void +rtl8366rb_init(device_t dev) +{ + /* Initialisation for TL-WR1043ND */ + smi_rmw(dev, RTL8366RB_RCR, + RTL8366RB_RCR_HARD_RESET, + RTL8366RB_RCR_HARD_RESET, RTL_WAITOK); + DELAY(100000); + /* Enable 16 VLAN mode */ + smi_rmw(dev, RTL8366RB_SGCR, + RTL8366RB_SGCR_EN_VLAN | RTL8366RB_SGCR_EN_VLAN_4KTB, + RTL8366RB_SGCR_EN_VLAN, RTL_WAITOK); + /* remove port 0 form VLAN 0 */ + smi_rmw(dev, RTL8366RB_VMCR(RTL8366RB_VMCR_MU_REG, 0), + (1 << 0), 0, RTL_WAITOK); + /* add port 0 untagged and port 5 tagged to VLAN 1 */ + smi_rmw(dev, RTL8366RB_VMCR(RTL8366RB_VMCR_MU_REG, 1), + ((1 << 5 | 1 << 0) << RTL8366RB_VMCR_MU_MEMBER_SHIFT) + | ((1 << 5 | 1 << 0) << RTL8366RB_VMCR_MU_UNTAG_SHIFT), + ((1 << 5 | 1 << 0) << RTL8366RB_VMCR_MU_MEMBER_SHIFT + | ((1 << 0) << RTL8366RB_VMCR_MU_UNTAG_SHIFT)), + RTL_WAITOK); + /* set PVLAN 1 for port 0 */ + smi_rmw(dev, RTL8366RB_PVCR_REG(0), + RTL8366RB_PVCR_VAL(0, RTL8366RB_PVCR_PORT_MASK), + RTL8366RB_PVCR_VAL(0, 1), RTL_WAITOK); +} + +static int +rtl8366rb_attach(device_t dev) +{ + uint16_t rev = 0; + struct rtl8366rb_softc *sc; + char name[IFNAMSIZ]; + int err = 0; + int i; + + sc = device_get_softc(dev); + bzero(sc, sizeof(*sc)); + sc->dev = dev; + mtx_init(&sc->sc_mtx, "rtl8366rb", NULL, MTX_DEF); + sc->smi_acquired = 0; + mtx_init(&sc->callout_mtx, "rtl8366rbcallout", NULL, MTX_DEF); + + rtl8366rb_init(dev); + smi_read(dev, RTL8366RB_CVCR, &rev, RTL_WAITOK); + device_printf(dev, "rev. %d\n", rev & 0x000f); + + /* attach miibus and phys */ + /* PHYs need an interface, so we generate a dummy one */ + for (i = 0; i < RTL8366RB_NUM_PHYS; i++) { + sc->ifp[i] = if_alloc(IFT_ETHER); + sc->ifp[i]->if_softc = sc; + sc->ifp[i]->if_flags |= IFF_UP | IFF_BROADCAST | IFF_DRV_RUNNING + | IFF_SIMPLEX; + snprintf(name, IFNAMSIZ, "%sport", device_get_nameunit(dev)); + sc->ifname[i] = malloc(strlen(name)+1, M_DEVBUF, M_WAITOK); + bcopy(name, sc->ifname[i], strlen(name)+1); + if_initname(sc->ifp[i], sc->ifname[i], i); + err = mii_attach(dev, &sc->miibus[i], sc->ifp[i], rtl8366rb_ifmedia_upd, \ + rtl8366rb_ifmedia_sts, BMSR_DEFCAPMASK, \ + i, MII_OFFSET_ANY, 0); + if (err != 0) { + device_printf(dev, "attaching PHY %d failed\n", i); + return (err); + } + } + + bus_generic_probe(dev); + bus_enumerate_hinted_children(dev); + err = bus_generic_attach(dev); + if (err != 0) + return (err); + + callout_init_mtx(&sc->callout_tick, &sc->callout_mtx, 0); + rtl8366rb_tick(sc); + + return (err); +} + +static int +rtl8366rb_detach(device_t dev) +{ + struct rtl8366rb_softc *sc = device_get_softc(dev); + int i; + + for (i=0; i < RTL8366RB_NUM_PHYS; i++) { + if (sc->miibus[i]) + device_delete_child(dev, sc->miibus[i]); + if (sc->ifp[i] != NULL) + if_free(sc->ifp[i]); + free(sc->ifname[i], M_DEVBUF); + } + bus_generic_detach(dev); + callout_drain(&sc->callout_tick); + mtx_destroy(&sc->callout_mtx); + mtx_destroy(&sc->sc_mtx); + + return (0); +} + +static void +rtl8366rb_update_ifmedia(int portstatus, u_int *media_status, u_int *media_active) +{ + *media_active = IFM_ETHER; + *media_status = IFM_AVALID; + if ((portstatus & RTL8366RB_PLSR_LINK) != 0) + *media_status |= IFM_ACTIVE; + else { + *media_active |= IFM_NONE; + return; + } + switch (portstatus & RTL8366RB_PLSR_SPEED_MASK) { + case RTL8366RB_PLSR_SPEED_10: + *media_active |= IFM_10_T; + break; + case RTL8366RB_PLSR_SPEED_100: + *media_active |= IFM_100_TX; + break; + case RTL8366RB_PLSR_SPEED_1000: + *media_active |= IFM_1000_T; + break; + } + if ((portstatus & RTL8366RB_PLSR_FULLDUPLEX) == 0) + *media_active |= IFM_FDX; + else + *media_active |= IFM_HDX; + if ((portstatus & RTL8366RB_PLSR_TXPAUSE) != 0) + *media_active |= IFM_ETH_TXPAUSE; + if ((portstatus & RTL8366RB_PLSR_RXPAUSE) != 0) + *media_active |= IFM_ETH_RXPAUSE; +} + +static void +rtl833rb_miipollstat(struct rtl8366rb_softc *sc) +{ + int i; + struct mii_data *mii; + struct mii_softc *miisc; + uint16_t value; + int portstatus; + + for (i = 0; i < RTL8366RB_NUM_PHYS; i++) { + mii = device_get_softc(sc->miibus[i]); + if ((i % 2) == 0) { + if (smi_read(sc->dev, RTL8366RB_PLSR_BASE + i/2, &value, RTL_NOWAIT) != 0) { + DEBUG_INCRVAR(callout_blocked); + return; + } + portstatus = value & 0xff; + } else { + portstatus = (value >> 8) & 0xff; + } + rtl8366rb_update_ifmedia(portstatus, &mii->mii_media_status, &mii->mii_media_active); + LIST_FOREACH(miisc, &mii->mii_phys, mii_list) { + if (IFM_INST(mii->mii_media.ifm_cur->ifm_media) != miisc->mii_inst) + continue; + mii_phy_update(miisc, MII_POLLSTAT); + } + } +} + +static void +rtl8366rb_tick(void *arg) +{ + struct rtl8366rb_softc *sc = arg; + + rtl833rb_miipollstat(sc); + callout_reset(&sc->callout_tick, hz, rtl8366rb_tick, sc); +} + +static int +smi_probe(device_t dev) +{ + device_t iicbus, iicha; + int err, i; + uint16_t chipid; + char bytes[2]; + int xferd; + + bytes[0] = RTL8366RB_CIR & 0xff; + bytes[1] = (RTL8366RB_CIR >> 8) & 0xff; + iicbus = device_get_parent(dev); + iicha = device_get_parent(iicbus); + iicbus_reset(iicbus, IIC_FASTEST, RTL8366RB_IIC_ADDR, NULL); + for (i=3; i--; ) { + IICBUS_STOP(iicha); + /* + * we go directly to the host adapter because iicbus.c + * only issues a stop on a bus that was successfully started. + */ + } + err = iicbus_request_bus(iicbus, dev, IIC_WAIT); + if (err != 0) + goto out; + err = iicbus_start(iicbus, RTL8366RB_IIC_ADDR | RTL_IICBUS_READ, RTL_IICBUS_TIMEOUT); + if (err != 0) + goto out; + err = iicbus_write(iicbus, bytes, 2, &xferd, RTL_IICBUS_TIMEOUT); + if (err != 0) + goto out; + err = iicbus_read(iicbus, bytes, 2, &xferd, IIC_LAST_READ, 0); + if (err != 0) + goto out; + chipid = ((bytes[1] & 0xff) << 8) | (bytes[0] & 0xff); + DPRINTF(dev, "chip id 0x%04x\n", chipid); + if (chipid != RTL8366RB_CIR_ID8366RB) + err = ENXIO; +out: + iicbus_stop(iicbus); + iicbus_release_bus(iicbus, dev); + return (err == 0 ? 0 : ENXIO); +} + +static int +smi_acquire(struct rtl8366rb_softc *sc, int sleep) +{ + int r = 0; + if (sleep == RTL_WAITOK) + RTL_LOCK(sc); + else + if (RTL_TRYLOCK(sc) == 0) + return (EWOULDBLOCK); + if (sc->smi_acquired == RTL_SMI_ACQUIRED) + r = EBUSY; + else { + r = iicbus_request_bus(device_get_parent(sc->dev), sc->dev, \ + sleep == RTL_WAITOK ? IIC_WAIT : IIC_DONTWAIT); + if (r == 0) + sc->smi_acquired = RTL_SMI_ACQUIRED; + } + RTL_UNLOCK(sc); + return (r); +} + +static int +smi_release(struct rtl8366rb_softc *sc, int sleep) +{ + if (sleep == RTL_WAITOK) + RTL_LOCK(sc); + else + if (RTL_TRYLOCK(sc) == 0) + return (EWOULDBLOCK); + RTL_SMI_ACQUIRED_ASSERT(sc); + iicbus_release_bus(device_get_parent(sc->dev), sc->dev); + sc->smi_acquired = 0; + RTL_UNLOCK(sc); + return (0); +} + +static int +smi_select(device_t dev, int op, int sleep) +{ + int err, i; + device_t iicbus = device_get_parent(dev); + struct iicbus_ivar *devi = IICBUS_IVAR(dev); + int slave = devi->addr; + + RTL_SMI_ACQUIRED_ASSERT((struct rtl8366rb_softc *)device_get_softc(dev)); + /* + * The chip does not use clock stretching when it is busy, + * instead ignoring the command. Retry a few times. + */ + for (i = RTL_IICBUS_RETRIES; i--; ) { + err = iicbus_start(iicbus, slave | op, RTL_IICBUS_TIMEOUT); + if (err != IIC_ENOACK) + break; + if (sleep == RTL_WAITOK) { + DEBUG_INCRVAR(iic_select_retries); + pause("smi_select", RTL_IICBUS_RETRY_SLEEP); + } else + break; + } + return (err); +} + +static int +smi_read_locked(struct rtl8366rb_softc *sc, uint16_t addr, uint16_t *data, int sleep) +{ + int err; + device_t iicbus = device_get_parent(sc->dev); + char bytes[2]; + int xferd; + + RTL_SMI_ACQUIRED_ASSERT(sc); + bytes[0] = addr & 0xff; + bytes[1] = (addr >> 8) & 0xff; + err = smi_select(sc->dev, RTL_IICBUS_READ, sleep); + if (err != 0) + goto out; + err = iicbus_write(iicbus, bytes, 2, &xferd, RTL_IICBUS_TIMEOUT); + if (err != 0) + goto out; + err = iicbus_read(iicbus, bytes, 2, &xferd, IIC_LAST_READ, 0); + if (err != 0) + goto out; + *data = ((bytes[1] & 0xff) << 8) | (bytes[0] & 0xff); + +out: + iicbus_stop(iicbus); + return (err); +} + +static int +smi_write_locked(struct rtl8366rb_softc *sc, uint16_t addr, uint16_t data, int sleep) +{ + int err; + device_t iicbus = device_get_parent(sc->dev); + char bytes[4]; + int xferd; + + RTL_SMI_ACQUIRED_ASSERT(sc); + bytes[0] = addr & 0xff; + bytes[1] = (addr >> 8) & 0xff; + bytes[2] = data & 0xff; + bytes[3] = (data >> 8) & 0xff; + + err = smi_select(sc->dev, RTL_IICBUS_WRITE, sleep); + if (err == 0) + err = iicbus_write(iicbus, bytes, 4, &xferd, RTL_IICBUS_TIMEOUT); + iicbus_stop(iicbus); + + return (err); +} + +static int +smi_read(device_t dev, uint16_t addr, uint16_t *data, int sleep) +{ + struct rtl8366rb_softc *sc = device_get_softc(dev); + int err; + + err = smi_acquire(sc, sleep); + if (err != 0) + return (EBUSY); + err = smi_read_locked(sc, addr, data, sleep); + smi_release(sc, sleep); + DEVERR(dev, err, "smi_read()=%d: addr=%04x\n", addr); + return (err == 0 ? 0 : EIO); +} + +static int +smi_write(device_t dev, uint16_t addr, uint16_t data, int sleep) +{ + struct rtl8366rb_softc *sc = device_get_softc(dev); + int err; + + err = smi_acquire(sc, sleep); + if (err != 0) + return (EBUSY); + err = smi_write_locked(sc, addr, data, sleep); + smi_release(sc, sleep); + DEVERR(dev, err, "smi_write()=%d: addr=%04x\n", addr); + return (err == 0 ? 0 : EIO); +} + +static int +smi_rmw(device_t dev, uint16_t addr, uint16_t mask, uint16_t data, int sleep) +{ + struct rtl8366rb_softc *sc = device_get_softc(dev); + int err; + uint16_t oldv, newv; + + err = smi_acquire(sc, sleep); + if (err != 0) + return (EBUSY); + if (err == 0) { + err = smi_read_locked(sc, addr, &oldv, sleep); + if (err == 0) { + newv = oldv & ~mask; + newv |= data & mask; + if (newv != oldv) + err = smi_write_locked(sc, addr, newv, sleep); + } + } + smi_release(sc, sleep); + DEVERR(dev, err, "smi_rmw()=%d: addr=%04x\n", addr); + return (err == 0 ? 0 : EIO); +} + +static etherswitch_info_t * +rtl_getinfo(device_t dev) +{ + return (ðerswitch_info); +} + +static int +rtl_readreg(device_t dev, int reg) +{ + uint16_t data = 0; + + smi_read(dev, reg, &data, RTL_WAITOK); + return (data); +} + +static int +rtl_writereg(device_t dev, int reg, int value) +{ + return (smi_write(dev, reg, value, RTL_WAITOK)); +} + +static int +rtl_getport(device_t dev, etherswitch_port_t *p) +{ + struct rtl8366rb_softc *sc; + struct ifmedia *ifm; + struct mii_data *mii; + struct ifmediareq *ifmr = &p->es_ifmr; + uint16_t v; + int err; + + if (p->es_port < 0 || p->es_port >= RTL8366RB_NUM_PORTS) + return (ENXIO); + p->es_vlangroup = RTL8366RB_PVCR_GET(p->es_port, + rtl_readreg(dev, RTL8366RB_PVCR_REG(p->es_port))); + + if (p->es_port < RTL8366RB_NUM_PHYS) { + sc = device_get_softc(dev); + mii = device_get_softc(sc->miibus[p->es_port]); + ifm = &mii->mii_media; + err = ifmedia_ioctl(sc->ifp[p->es_port], &p->es_ifr, ifm, SIOCGIFMEDIA); + if (err) + return (err); + } else { + /* fill in fixed values for CPU port */ + ifmr->ifm_count = 0; + smi_read(dev, RTL8366RB_PLSR_BASE + (RTL8366RB_NUM_PHYS)/2, &v, RTL_WAITOK); + v = v >> (8 * ((RTL8366RB_NUM_PHYS) % 2)); + rtl8366rb_update_ifmedia(v, &ifmr->ifm_status, &ifmr->ifm_active); + ifmr->ifm_current = ifmr->ifm_active; + ifmr->ifm_mask = 0; + ifmr->ifm_status = IFM_ACTIVE | IFM_AVALID; + } + return (0); +} + +static int +rtl_setport(device_t dev, etherswitch_port_t *p) +{ + int err; + struct rtl8366rb_softc *sc; + struct ifmedia *ifm; + struct mii_data *mii; + + if (p->es_port < 0 || p->es_port >= RTL8366RB_NUM_PHYS) + return (ENXIO); + err = smi_rmw(dev, RTL8366RB_PVCR_REG(p->es_port), + RTL8366RB_PVCR_VAL(p->es_port, RTL8366RB_PVCR_PORT_MASK), + RTL8366RB_PVCR_VAL(p->es_port, p->es_vlangroup), RTL_WAITOK); + if (err) + return (err); + sc = device_get_softc(dev); + mii = device_get_softc(sc->miibus[p->es_port]); + ifm = &mii->mii_media; + err = ifmedia_ioctl(sc->ifp[p->es_port], &p->es_ifr, ifm, SIOCSIFMEDIA); + return (err); +} + +static int +rtl_getvgroup(device_t dev, etherswitch_vlangroup_t *vg) +{ + uint16_t vmcr[3]; + int i; + + for (i=0; i<3; i++) + vmcr[i] = rtl_readreg(dev, RTL8366RB_VMCR(i, vg->es_vlangroup)); + + vg->es_vid = RTL8366RB_VMCR_VID(vmcr); + vg->es_member_ports = RTL8366RB_VMCR_MEMBER(vmcr); + vg->es_untagged_ports = RTL8366RB_VMCR_UNTAG(vmcr); + vg->es_fid = RTL8366RB_VMCR_FID(vmcr); + return (0); +} + +static int +rtl_setvgroup(device_t dev, etherswitch_vlangroup_t *vg) +{ + int g = vg->es_vlangroup; + + rtl_writereg(dev, RTL8366RB_VMCR(RTL8366RB_VMCR_DOT1Q_REG, g), + (vg->es_vid << RTL8366RB_VMCR_DOT1Q_VID_SHIFT) & RTL8366RB_VMCR_DOT1Q_VID_MASK); + rtl_writereg(dev, RTL8366RB_VMCR(RTL8366RB_VMCR_MU_REG, g), + ((vg->es_member_ports << RTL8366RB_VMCR_MU_MEMBER_SHIFT) & RTL8366RB_VMCR_MU_MEMBER_MASK) | + ((vg->es_untagged_ports << RTL8366RB_VMCR_MU_UNTAG_SHIFT) & RTL8366RB_VMCR_MU_UNTAG_MASK)); + rtl_writereg(dev, RTL8366RB_VMCR(RTL8366RB_VMCR_FID_REG, g), + vg->es_fid); + return (0); +} + +static int +rtl_readphy(device_t dev, int phy, int reg) +{ + struct rtl8366rb_softc *sc = device_get_softc(dev); + uint16_t data = 0; + int err, i, sleep; + + if (phy < 0 || phy >= RTL8366RB_NUM_PHYS) + return (ENXIO); + if (reg < 0 || reg >= RTL8366RB_NUM_PHY_REG) + return (ENXIO); + sleep = RTL_WAITOK; + err = smi_acquire(sc, sleep); + if (err != 0) + return (EBUSY); + for (i = RTL_IICBUS_RETRIES; i--; ) { + err = smi_write_locked(sc, RTL8366RB_PACR, RTL8366RB_PACR_READ, sleep); + if (err == 0) + err = smi_write_locked(sc, RTL8366RB_PHYREG(phy, 0, reg), 0, sleep); + if (err == 0) { + err = smi_read_locked(sc, RTL8366RB_PADR, &data, sleep); + break; + } + DEBUG_INCRVAR(phy_access_retries); + DPRINTF(dev, "rtl_readphy(): chip not responsive, retrying %d more times\n", i); + pause("rtl_readphy", RTL_IICBUS_RETRY_SLEEP); + } + smi_release(sc, sleep); + DEVERR(dev, err, "rtl_readphy()=%d: phy=%d.%02x\n", phy, reg); + return (data); +} + +static int +rtl_writephy(device_t dev, int phy, int reg, int data) +{ + struct rtl8366rb_softc *sc = device_get_softc(dev); + int err, i, sleep; + + if (phy < 0 || phy >= RTL8366RB_NUM_PHYS) + return (ENXIO); + if (reg < 0 || reg >= RTL8366RB_NUM_PHY_REG) + return (ENXIO); + sleep = RTL_WAITOK; + err = smi_acquire(sc, sleep); + if (err != 0) + return (EBUSY); + for (i = RTL_IICBUS_RETRIES; i--; ) { + err = smi_write_locked(sc, RTL8366RB_PACR, RTL8366RB_PACR_WRITE, sleep); + if (err == 0) + err = smi_write_locked(sc, RTL8366RB_PHYREG(phy, 0, reg), data, sleep); + if (err == 0) { + break; + } + DEBUG_INCRVAR(phy_access_retries); + DPRINTF(dev, "rtl_writephy(): chip not responsive, retrying %d more tiems\n", i); + pause("rtl_writephy", RTL_IICBUS_RETRY_SLEEP); + } + smi_release(sc, sleep); + DEVERR(dev, err, "rtl_writephy()=%d: phy=%d.%02x\n", phy, reg); + return (err == 0 ? 0 : EIO); +} + +static int +rtl8366rb_ifmedia_upd(struct ifnet *ifp) +{ + struct rtl8366rb_softc *sc = ifp->if_softc; + struct mii_data *mii = device_get_softc(sc->miibus[ifp->if_dunit]); + + mii_mediachg(mii); + return (0); +} + +static void +rtl8366rb_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) +{ + struct rtl8366rb_softc *sc = ifp->if_softc; + struct mii_data *mii = device_get_softc(sc->miibus[ifp->if_dunit]); + + mii_pollstat(mii); + ifmr->ifm_active = mii->mii_media_active; + ifmr->ifm_status = mii->mii_media_status; +} + + +static device_method_t rtl8366rb_methods[] = { + /* Device interface */ + DEVMETHOD(device_identify, rtl8366rb_identify), + DEVMETHOD(device_probe, rtl8366rb_probe), + DEVMETHOD(device_attach, rtl8366rb_attach), + DEVMETHOD(device_detach, rtl8366rb_detach), + + /* bus interface */ + DEVMETHOD(bus_add_child, device_add_child_ordered), + + /* MII interface */ + DEVMETHOD(miibus_readreg, rtl_readphy), + DEVMETHOD(miibus_writereg, rtl_writephy), + + /* etherswitch interface */ + DEVMETHOD(etherswitch_getinfo, rtl_getinfo), + DEVMETHOD(etherswitch_readreg, rtl_readreg), + DEVMETHOD(etherswitch_writereg, rtl_writereg), + DEVMETHOD(etherswitch_readphyreg, rtl_readphy), + DEVMETHOD(etherswitch_writephyreg, rtl_writephy), + DEVMETHOD(etherswitch_getport, rtl_getport), + DEVMETHOD(etherswitch_setport, rtl_setport), + DEVMETHOD(etherswitch_getvgroup, rtl_getvgroup), + DEVMETHOD(etherswitch_setvgroup, rtl_setvgroup), + + DEVMETHOD_END +}; + +DEFINE_CLASS_0(rtl8366rb, rtl8366rb_driver, rtl8366rb_methods, + sizeof(struct rtl8366rb_softc)); +static devclass_t rtl8366rb_devclass; + +DRIVER_MODULE(rtl8366rb, iicbus, rtl8366rb_driver, rtl8366rb_devclass, 0, 0); +DRIVER_MODULE(miibus, rtl8366rb, miibus_driver, miibus_devclass, 0, 0); +DRIVER_MODULE(etherswitch, rtl8366rb, etherswitch_driver, etherswitch_devclass, 0, 0); +MODULE_VERSION(rtl8366rb, 1); +MODULE_DEPEND(rtl8366rb, iicbus, 1, 1, 1); /* XXX which versions? */ +MODULE_DEPEND(rtl8366rb, miibus, 1, 1, 1); /* XXX which versions? */ +MODULE_DEPEND(rtl8366rb, etherswitch, 1, 1, 1); /* XXX which versions? */ diff --git a/sys/dev/etherswitch/rtl8366/rtl8366rbvar.h b/sys/dev/etherswitch/rtl8366/rtl8366rbvar.h new file mode 100644 index 00000000000..4f3d1bae044 --- /dev/null +++ b/sys/dev/etherswitch/rtl8366/rtl8366rbvar.h @@ -0,0 +1,176 @@ +/*- + * Copyright (c) 2011-2012 Stefan Bethke. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _DEV_ETHERSWITCH_RTL8366RBVAR_H_ +#define _DEV_ETHERSWITCH_RTL8366RBVAR_H_ + +#define RTL8366RB_IIC_ADDR 0xa8 +#define RTL_IICBUS_TIMEOUT 100 /* us */ +#define RTL_IICBUS_READ 1 +#define RTL_IICBUS_WRITE 0 +/* number of times to try and select the chip on the I2C bus */ +#define RTL_IICBUS_RETRIES 3 +#define RTL_IICBUS_RETRY_SLEEP (hz/1000) + +/* Register definitions */ + +/* Switch Global Configuration */ +#define RTL8366RB_SGCR 0x0000 +#define RTL8366RB_SGCR_EN_BC_STORM_CTRL 0x0001 +#define RTL8366RB_SGCR_MAX_LENGTH_MASK 0x0030 +#define RTL8366RB_SGCR_MAX_LENGTH_1522 0x0000 +#define RTL8366RB_SGCR_MAX_LENGTH_1536 0x0010 +#define RTL8366RB_SGCR_MAX_LENGTH_1552 0x0020 +#define RTL8366RB_SGCR_MAX_LENGTH_9216 0x0030 +#define RTL8366RB_SGCR_EN_VLAN 0x2000 +#define RTL8366RB_SGCR_EN_VLAN_4KTB 0x4000 +#define RTL8366RB_SGCR_EN_QOS 0x8000 + +/* Port Enable Control: DISABLE_PORT[5:0] */ +#define RTL8366RB_PECR 0x0001 + +/* Switch Security Control 0: DIS_LEARN[5:0] */ +#define RTL8366RB_SSCR0 0x0002 + +/* Switch Security Control 1: DIS_AGE[5:0] */ +#define RTL8366RB_SSCR1 0x0003 + +/* Switch Security Control 2 */ +#define RTL8366RB_SSCR2 0x0004 +#define RTL8366RB_SSCR2_DROP_UNKNOWN_DA 0x0001 + +/* Port Link Status: two ports per register */ +#define RTL8366RB_PLSR_BASE 0x0014 +#define RTL8366RB_PLSR_SPEED_MASK 0x03 +#define RTL8366RB_PLSR_SPEED_10 0x00 +#define RTL8366RB_PLSR_SPEED_100 0x01 +#define RTL8366RB_PLSR_SPEED_1000 0x02 +#define RTL8366RB_PLSR_FULLDUPLEX 0x08 +#define RTL8366RB_PLSR_LINK 0x10 +#define RTL8366RB_PLSR_TXPAUSE 0x20 +#define RTL8366RB_PLSR_RXPAUSE 0x40 +#define RTL8366RB_PLSR_NO_AUTO 0x80 + +/* VLAN Member Configuration, 3 registers per VLAN */ +#define RTL8366RB_VMCR_BASE 0x0020 +#define RTL8366RB_VMCR_MULT 3 +#define RTL8366RB_VMCR_DOT1Q_REG 0 +#define RTL8366RB_VMCR_DOT1Q_VID_SHIFT 0 +#define RTL8366RB_VMCR_DOT1Q_VID_MASK 0x0fff +#define RTL8366RB_VMCR_DOT1Q_PCP_SHIFT 12 +#define RTL8366RB_VMCR_DOT1Q_PCP_MASK 0x7000 +#define RTL8366RB_VMCR_MU_REG 1 +#define RTL8366RB_VMCR_MU_MEMBER_SHIFT 0 +#define RTL8366RB_VMCR_MU_MEMBER_MASK 0x00ff +#define RTL8366RB_VMCR_MU_UNTAG_SHIFT 8 +#define RTL8366RB_VMCR_MU_UNTAG_MASK 0xff00 +#define RTL8366RB_VMCR_FID_REG 2 +#define RTL8366RB_VMCR_FID_FID_SHIFT 0 +#define RTL8366RB_VMCR_FID_FID_MASK 0x0007 +#define RTL8366RB_VMCR(_reg, _vlan) \ + (RTL8366RB_VMCR_BASE + _reg + _vlan * RTL8366RB_VMCR_MULT) +/* VLAN Identifier */ +#define RTL8366RB_VMCR_VID(_r) \ + (_r[RTL8366RB_VMCR_DOT1Q_REG] & RTL8366RB_VMCR_DOT1Q_VID_MASK) +/* Priority Code Point */ +#define RTL8366RB_VMCR_PCP(_r) \ + ((_r[RTL8366RB_VMCR_DOT1Q_REG] & RTL8366RB_VMCR_DOT1Q_PCP_MASK) \ + >> RTL8366RB_VMCR_DOT1Q_PCP_SHIFT) +/* Member ports */ +#define RTL8366RB_VMCR_MEMBER(_r) \ + (_r[RTL8366RB_VMCR_MU_REG] & RTL8366RB_VMCR_MU_MEMBER_MASK) +/* Untagged ports */ +#define RTL8366RB_VMCR_UNTAG(_r) \ + ((_r[RTL8366RB_VMCR_MU_REG] & RTL8366RB_VMCR_MU_UNTAG_MASK) \ + >> RTL8366RB_VMCR_MU_UNTAG_SHIFT) +/* Forwarding ID */ +#define RTL8366RB_VMCR_FID(_r) \ + (_r[RTL8366RB_VMCR_FID_REG] & RTL8366RB_VMCR_FID_FID_MASK) + +/* + * Port VLAN Control, 4 ports per register + * Determines the VID for untagged ingress frames through + * index into VMC. + */ +#define RTL8366RB_PVCR_BASE 0x0063 +#define RTL8366RB_PVCR_PORT_SHIFT 4 +#define RTL8366RB_PVCR_PORT_PERREG (16 / RTL8366RB_PVCR_PORT_SHIFT) +#define RTL8366RB_PVCR_PORT_MASK 0x000f +#define RTL8366RB_PVCR_REG(_port) \ + (RTL8366RB_PVCR_BASE + _port / (RTL8366RB_PVCR_PORT_PERREG)) +#define RTL8366RB_PVCR_VAL(_port, _pvlan) \ + ((_pvlan & RTL8366RB_PVCR_PORT_MASK) << \ + ((_port % RTL8366RB_PVCR_PORT_PERREG) * RTL8366RB_PVCR_PORT_SHIFT)) +#define RTL8366RB_PVCR_GET(_port, _val) \ + (((_val) >> ((_port % RTL8366RB_PVCR_PORT_PERREG) * RTL8366RB_PVCR_PORT_SHIFT)) & RTL8366RB_PVCR_PORT_MASK) + +/* Reset Control */ +#define RTL8366RB_RCR 0x0100 +#define RTL8366RB_RCR_HARD_RESET 0x0001 +#define RTL8366RB_RCR_SOFT_RESET 0x0002 + +/* Chip Version Control: CHIP_VER[3:0] */ +#define RTL8366RB_CVCR 0x050A +/* Chip Identifier */ +#define RTL8366RB_CIR 0x0509 +#define RTL8366RB_CIR_ID8366RB 0x5937 + +/* VLAN Ingress Control 2: [5:0] */ +#define RTL8366RB_VIC2R 0x037f + +/* MIB registers */ +#define RTL8366RB_MCNT_BASE 0x1000 +#define RTL8366RB_MCTLR 0x13f0 +#define RTL8366RB_MCTLR_BUSY 0x0001 +#define RTL8366RB_MCTLR_RESET 0x0002 +#define RTL8366RB_MCTLR_RESET_PORT_MASK 0x00fc +#define RTL8366RB_MCTLR_RESET_ALL 0x0800 + +#define RTL8366RB_MCNT(_port, _r) \ + (RTL8366RB_MCNT_BASE + 0x50 * (_port) + (_r)) +#define RTL8366RB_MCTLR_RESET_PORT(_p) \ + (1 << ((_p) + 2)) + +/* PHY Access Control */ +#define RTL8366RB_PACR 0x8000 +#define RTL8366RB_PACR_WRITE 0x0000 +#define RTL8366RB_PACR_READ 0x0001 + +/* PHY Access Data */ +#define RTL8366RB_PADR 0x8002 + +#define RTL8366RB_PHYREG(phy, page, reg) \ + (RTL8366RB_PACR | (1 << (((phy) & 0x1f) + 9)) | (((page) & 0xf) << 5) | ((reg) & 0x1f)) + +/* general characteristics of the chip */ +#define RTL8366RB_NUM_PORTS 6 +#define RTL8366RB_NUM_PHYS (RTL8366RB_NUM_PORTS-1) +#define RTL8366RB_NUM_VLANS 16 +#define RTL8366RB_NUM_PHY_REG 32 + +#endif diff --git a/sys/dev/fb/fbreg.h b/sys/dev/fb/fbreg.h index 623e37c3e92..c9689d38d15 100644 --- a/sys/dev/fb/fbreg.h +++ b/sys/dev/fb/fbreg.h @@ -35,9 +35,17 @@ /* some macros */ #if defined(__amd64__) || defined(__i386__) -#define bcopy_io(s, d, c) bcopy((void *)(s), (void *)(d), (c)) -#define bcopy_toio(s, d, c) bcopy((void *)(s), (void *)(d), (c)) -#define bcopy_fromio(s, d, c) bcopy((void *)(s), (void *)(d), (c)) + +static __inline void +copyw(uint16_t *src, uint16_t *dst, size_t size) +{ + size >>= 1; + while (size--) + *dst++ = *src++; +} +#define bcopy_io(s, d, c) copyw((void*)(s), (void*)(d), (c)) +#define bcopy_toio(s, d, c) copyw((void*)(s), (void*)(d), (c)) +#define bcopy_fromio(s, d, c) copyw((void*)(s), (void*)(d), (c)) #define bzero_io(d, c) bzero((void *)(d), (c)) #define fill_io(p, d, c) fill((p), (void *)(d), (c)) #define fillw_io(p, d, c) fillw((p), (void *)(d), (c)) diff --git a/sys/dev/fdt/fdt_common.h b/sys/dev/fdt/fdt_common.h index 0bedb91916a..7947428eb17 100644 --- a/sys/dev/fdt/fdt_common.h +++ b/sys/dev/fdt/fdt_common.h @@ -32,6 +32,7 @@ #ifndef _FDT_COMMON_H_ #define _FDT_COMMON_H_ +#include #include #include #include diff --git a/sys/dev/fdt/fdt_pci.c b/sys/dev/fdt/fdt_pci.c index 7f0ddd37e3e..68cf89811f3 100644 --- a/sys/dev/fdt/fdt_pci.c +++ b/sys/dev/fdt/fdt_pci.c @@ -100,6 +100,14 @@ fdt_pci_ranges_decode(phandle_t node, struct fdt_pci_range *io_space, size_cells); tuples = len / tuple_size; + /* + * Initialize the ranges so that we don't have to worry about + * having them all defined in the FDT. In particular, it is + * perfectly fine not to want I/O space on PCI busses. + */ + bzero(io_space, sizeof(*io_space)); + bzero(mem_space, sizeof(*mem_space)); + rangesptr = &ranges[0]; offset_cells = 0; for (i = 0; i < tuples; i++) { diff --git a/sys/dev/fdt/fdt_slicer.c b/sys/dev/fdt/fdt_slicer.c new file mode 100644 index 00000000000..d32d1595287 --- /dev/null +++ b/sys/dev/fdt/fdt_slicer.c @@ -0,0 +1,115 @@ +/*- + * Copyright (c) 2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include + +#define DEBUG +#undef DEBUG + +#ifdef DEBUG +#define debugf(fmt, args...) do { printf("%s(): ", __func__); \ + printf(fmt,##args); } while (0) +#else +#define debugf(fmt, args...) +#endif + +int +flash_fill_slices(device_t dev, struct flash_slice *slices, int *slices_num) +{ + char *slice_name; + phandle_t dt_node, dt_child; + u_long base, size; + int i; + ssize_t name_len; + + /* + * We assume the caller provides buffer for FLASH_SLICES_MAX_NUM + * flash_slice structures. + */ + if (slices == NULL) { + *slices_num = 0; + return (ENOMEM); + } + + dt_node = ofw_bus_get_node(dev); + for (dt_child = OF_child(dt_node), i = 0; dt_child != 0; + dt_child = OF_peer(dt_child)) { + + if (i == FLASH_SLICES_MAX_NUM) { + debugf("not enough buffer for slice i=%d\n", i); + break; + } + + /* + * Retrieve start and size of the slice. + */ + if (fdt_regsize(dt_child, &base, &size) != 0) { + debugf("error during processing reg property, i=%d\n", + i); + continue; + } + + if (size == 0) { + debugf("slice i=%d with no size\n", i); + continue; + } + + /* + * Retrieve label. + */ + name_len = OF_getprop_alloc(dt_child, "label", sizeof(char), + (void **)&slice_name); + if (name_len <= 0) { + /* Use node name if no label defined */ + name_len = OF_getprop_alloc(dt_child, "name", sizeof(char), + (void **)&slice_name); + if (name_len <= 0) { + debugf("slice i=%d with no name\n", i); + slice_name = NULL; + } + } + + /* + * Fill slice entry data. + */ + slices[i].base = base; + slices[i].size = size; + slices[i].label = slice_name; + i++; + } + + *slices_num = i; + return (0); +} diff --git a/sys/dev/fdt/fdtbus.c b/sys/dev/fdt/fdtbus.c index 577b1596a3a..a18ae57fe0e 100644 --- a/sys/dev/fdt/fdtbus.c +++ b/sys/dev/fdt/fdtbus.c @@ -89,8 +89,6 @@ static int fdtbus_deactivate_resource(device_t, device_t, int, int, struct resource *); static int fdtbus_setup_intr(device_t, device_t, struct resource *, int, driver_filter_t *, driver_intr_t *, void *, void **); -static int fdtbus_teardown_intr(device_t, device_t, struct resource *, - void *); static const char *fdtbus_ofw_get_name(device_t, device_t); static phandle_t fdtbus_ofw_get_node(device_t, device_t); @@ -121,8 +119,9 @@ static device_method_t fdtbus_methods[] = { DEVMETHOD(bus_release_resource, fdtbus_release_resource), DEVMETHOD(bus_activate_resource, fdtbus_activate_resource), DEVMETHOD(bus_deactivate_resource, fdtbus_deactivate_resource), + DEVMETHOD(bus_config_intr, bus_generic_config_intr), DEVMETHOD(bus_setup_intr, fdtbus_setup_intr), - DEVMETHOD(bus_teardown_intr, fdtbus_teardown_intr), + DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), /* OFW bus interface */ DEVMETHOD(ofw_bus_get_node, fdtbus_ofw_get_node), @@ -575,30 +574,41 @@ fdtbus_setup_intr(device_t bus, device_t child, struct resource *res, int flags, driver_filter_t *filter, driver_intr_t *ihand, void *arg, void **cookiep) { - int err; + struct fdtbus_devinfo *di; + enum intr_trigger trig; + enum intr_polarity pol; + int error, rid; - *cookiep = 0; - if ((rman_get_flags(res) & RF_SHAREABLE) == 0) - flags |= INTR_EXCL; + if (res == NULL) + return (EINVAL); - err = rman_activate_resource(res); - if (err) - return (err); + /* + * We are responsible for configuring the interrupts of our direct + * children. + */ + if (device_get_parent(child) == bus) { + di = device_get_ivars(child); + if (di == NULL) + return (ENXIO); -#if defined(__powerpc__) - err = powerpc_setup_intr(device_get_nameunit(child), - rman_get_start(res), filter, ihand, arg, flags, cookiep); -#elif defined(__mips__) - cpu_establish_hardintr(device_get_nameunit(child), - filter, ihand, arg, rman_get_start(res), flags, cookiep); -#elif defined(__arm__) - arm_setup_irqhandler(device_get_nameunit(child), - filter, ihand, arg, rman_get_start(res), flags, cookiep); - arm_unmask_irq(rman_get_start(res)); - err = 0; -#endif + rid = rman_get_rid(res); + if (rid >= DI_MAX_INTR_NUM) + return (ENOENT); - return (err); + trig = di->di_intr_sl[rid].trig; + pol = di->di_intr_sl[rid].pol; + if (trig != INTR_TRIGGER_CONFORM || + pol != INTR_POLARITY_CONFORM) { + error = bus_generic_config_intr(bus, + rman_get_start(res), trig, pol); + if (error) + return (error); + } + } + + error = bus_generic_setup_intr(bus, child, res, flags, filter, ihand, + arg, cookiep); + return (error); } static int @@ -617,21 +627,6 @@ fdtbus_deactivate_resource(device_t bus, device_t child, int type, int rid, return (rman_deactivate_resource(res)); } -static int -fdtbus_teardown_intr(device_t bus, device_t child, struct resource *res, - void *cookie) -{ - -#if defined(__powerpc__) - return (powerpc_teardown_intr(cookie)); -#elif defined(__mips__) - /* mips does not have a teardown yet */ - return (0); -#elif defined(__arm__) - return (arm_remove_irqhandler(rman_get_start(res), cookie)); -#endif -} - static const char * fdtbus_ofw_get_name(device_t bus, device_t dev) { diff --git a/sys/dev/fdt/simplebus.c b/sys/dev/fdt/simplebus.c index e6887b48c2e..0868fb0e8b5 100644 --- a/sys/dev/fdt/simplebus.c +++ b/sys/dev/fdt/simplebus.c @@ -288,39 +288,34 @@ simplebus_setup_intr(device_t bus, device_t child, struct resource *res, struct simplebus_devinfo *di; enum intr_trigger trig; enum intr_polarity pol; - int irq, rid; + int error, rid; + + if (device_get_parent(child) != bus) + return (ECHILD); + + di = device_get_ivars(child); + if (di == NULL) + return (ENXIO); if (res == NULL) - panic("simplebus_setup_intr: NULL irq resource!"); + return (EINVAL); rid = rman_get_rid(res); - if (rid > DI_MAX_INTR_NUM) { - device_printf(child, "rid out of range rid = %d\n", rid); - return (ERANGE); - } - - irq = rman_get_start(res); - - if ((di = device_get_ivars(child)) == NULL) { - device_printf(child, "could not retrieve devinfo\n"); - return (ENXIO); - } + if (rid >= DI_MAX_INTR_NUM) + return (ENOENT); trig = di->di_intr_sl[rid].trig; pol = di->di_intr_sl[rid].pol; + if (trig != INTR_TRIGGER_CONFORM || pol != INTR_POLARITY_CONFORM) { + error = bus_generic_config_intr(bus, rman_get_start(res), + trig, pol); + if (error) + return (error); + } - debugf("intr config: irq = %d, trig = %d, pol = %d\n", irq, trig, pol); - -#if defined(__powerpc__) - int err; - - err = powerpc_config_intr(irq, trig, pol); - if (err) - return (err); -#endif - - return (bus_generic_setup_intr(bus, child, res, flags, filter, ihand, - arg, cookiep)); + error = bus_generic_setup_intr(bus, child, res, flags, filter, ihand, + arg, cookiep); + return (error); } static const struct ofw_bus_devinfo * diff --git a/sys/dev/filemon/filemon.c b/sys/dev/filemon/filemon.c new file mode 100644 index 00000000000..936a09167aa --- /dev/null +++ b/sys/dev/filemon/filemon.c @@ -0,0 +1,377 @@ +/*- + * Copyright (c) 2011, David E. O'Brien. + * Copyright (c) 2009-2011, Juniper Networks, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JUNIPER NETWORKS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JUNIPER NETWORKS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if __FreeBSD_version >= 900041 +#include +#endif + +#include "filemon.h" + +#if defined(COMPAT_IA32) || defined(COMPAT_FREEBSD32) || defined(COMPAT_ARCH32) +#include +#include + +extern struct sysentvec ia32_freebsd_sysvec; +#endif + +extern struct sysentvec elf32_freebsd_sysvec; +extern struct sysentvec elf64_freebsd_sysvec; + +static d_close_t filemon_close; +static d_ioctl_t filemon_ioctl; +static d_open_t filemon_open; +static int filemon_unload(void); +static void filemon_load(void *); + +static struct cdevsw filemon_cdevsw = { + .d_version = D_VERSION, + .d_close = filemon_close, + .d_ioctl = filemon_ioctl, + .d_open = filemon_open, + .d_name = "filemon", +}; + +MALLOC_DECLARE(M_FILEMON); +MALLOC_DEFINE(M_FILEMON, "filemon", "File access monitor"); + +struct filemon { + TAILQ_ENTRY(filemon) link; /* Link into the in-use list. */ + struct mtx mtx; /* Lock mutex for this filemon. */ + struct cv cv; /* Lock condition variable for this + filemon. */ + struct file *fp; /* Output file pointer. */ + struct thread *locker; /* Ptr to the thread locking this + filemon. */ + pid_t pid; /* The process ID being monitored. */ + char fname1[MAXPATHLEN]; /* Temporary filename buffer. */ + char fname2[MAXPATHLEN]; /* Temporary filename buffer. */ + char msgbufr[1024]; /* Output message buffer. */ +}; + +static TAILQ_HEAD(, filemon) filemons_inuse = TAILQ_HEAD_INITIALIZER(filemons_inuse); +static TAILQ_HEAD(, filemon) filemons_free = TAILQ_HEAD_INITIALIZER(filemons_free); +static int n_readers = 0; +static struct mtx access_mtx; +static struct cv access_cv; +static struct thread *access_owner = NULL; +static struct thread *access_requester = NULL; + +#if __FreeBSD_version < 701000 +static struct clonedevs *filemon_clones; +static eventhandler_tag eh_tag; +#else +static struct cdev *filemon_dev; +#endif + +#include "filemon_lock.c" +#include "filemon_wrapper.c" + +#if __FreeBSD_version < 701000 +static void +filemon_clone(void *arg, struct ucred *cred, char *name, int namelen, + struct cdev **dev) +{ + int u = -1; + size_t len; + + if (*dev != NULL) + return; + + len = strlen(name); + + if (len != 7) + return; + + if (bcmp(name,"filemon", 7) != 0) + return; + + /* Clone the device to the new minor number. */ + if (clone_create(&filemon_clones, &filemon_cdevsw, &u, dev, 0) != 0) + /* Create the /dev/filemonNN entry. */ + *dev = make_dev_cred(&filemon_cdevsw, u, cred, UID_ROOT, + GID_WHEEL, 0666, "filemon%d", u); + if (*dev != NULL) { + dev_ref(*dev); + (*dev)->si_flags |= SI_CHEAPCLONE; + } +} +#endif + +static void +filemon_dtr(void *data) +{ + struct filemon *filemon = data; + + if (filemon != NULL) { + struct file *fp = filemon->fp; + + /* Get exclusive write access. */ + filemon_lock_write(); + + /* Remove from the in-use list. */ + TAILQ_REMOVE(&filemons_inuse, filemon, link); + + filemon->fp = NULL; + filemon->pid = -1; + + /* Add to the free list. */ + TAILQ_INSERT_TAIL(&filemons_free, filemon, link); + + /* Give up write access. */ + filemon_unlock_write(); + + if (fp != NULL) + fdrop(fp, curthread); + } +} + +static int +filemon_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag __unused, + struct thread *td) +{ + int error = 0; + struct filemon *filemon; + +#if __FreeBSD_version < 701000 + filemon = dev->si_drv1; +#else + devfs_get_cdevpriv((void **) &filemon); +#endif + + switch (cmd) { + /* Set the output file descriptor. */ + case FILEMON_SET_FD: +#if __FreeBSD_version < 900041 +#define FGET_WRITE(a1, a2, a3) fget_write((a1), (a2), (a3)) +#else +#define FGET_WRITE(a1, a2, a3) fget_write((a1), (a2), CAP_WRITE | CAP_SEEK, (a3)) +#endif + if ((error = FGET_WRITE(td, *(int *)data, &filemon->fp)) == 0) + /* Write the file header. */ + filemon_comment(filemon); + break; + + /* Set the monitored process ID. */ + case FILEMON_SET_PID: + filemon->pid = *((pid_t *) data); + break; + + default: + error = EINVAL; + break; + } + + return (error); +} + +static int +filemon_open(struct cdev *dev, int oflags __unused, int devtype __unused, + struct thread *td __unused) +{ + struct filemon *filemon; + + /* Get exclusive write access. */ + filemon_lock_write(); + + if ((filemon = TAILQ_FIRST(&filemons_free)) != NULL) + TAILQ_REMOVE(&filemons_free, filemon, link); + + /* Give up write access. */ + filemon_unlock_write(); + + if (filemon == NULL) { + filemon = malloc(sizeof(struct filemon), M_FILEMON, + M_WAITOK | M_ZERO); + + filemon->fp = NULL; + + mtx_init(&filemon->mtx, "filemon", "filemon", MTX_DEF); + cv_init(&filemon->cv, "filemon"); + } + + filemon->pid = curproc->p_pid; + +#if __FreeBSD_version < 701000 + dev->si_drv1 = filemon; +#else + devfs_set_cdevpriv(filemon, filemon_dtr); +#endif + + /* Get exclusive write access. */ + filemon_lock_write(); + + /* Add to the in-use list. */ + TAILQ_INSERT_TAIL(&filemons_inuse, filemon, link); + + /* Give up write access. */ + filemon_unlock_write(); + + return (0); +} + +static int +filemon_close(struct cdev *dev __unused, int flag __unused, int fmt __unused, + struct thread *td __unused) +{ +#if __FreeBSD_version < 701000 + filemon_dtr(dev->si_drv1); + + dev->si_drv1 = NULL; + + /* Schedule this cloned device to be destroyed. */ + destroy_dev_sched(dev); +#endif + + return (0); +} + +static void +filemon_load(void *dummy __unused) +{ + mtx_init(&access_mtx, "filemon", "filemon", MTX_DEF); + cv_init(&access_cv, "filemon"); + + /* Install the syscall wrappers. */ + filemon_wrapper_install(); + +#if __FreeBSD_version < 701000 + /* Enable device cloning. */ + clone_setup(&filemon_clones); + + /* Setup device cloning events. */ + eh_tag = EVENTHANDLER_REGISTER(dev_clone, filemon_clone, 0, 1000); +#else + filemon_dev = make_dev(&filemon_cdevsw, 0, UID_ROOT, GID_WHEEL, 0666, + "filemon"); +#endif +} + +static int +filemon_unload(void) +{ + struct filemon *filemon; + int error = 0; + + /* Get exclusive write access. */ + filemon_lock_write(); + + if (TAILQ_FIRST(&filemons_inuse) != NULL) + error = EBUSY; + else { +#if __FreeBSD_version >= 701000 + destroy_dev(filemon_dev); +#endif + + /* Deinstall the syscall wrappers. */ + filemon_wrapper_deinstall(); + } + + /* Give up write access. */ + filemon_unlock_write(); + + if (error == 0) { +#if __FreeBSD_version < 701000 + /* + * Check if there is still an event handler callback registered. + */ + if (eh_tag != 0) { + /* De-register the device cloning event handler. */ + EVENTHANDLER_DEREGISTER(dev_clone, eh_tag); + eh_tag = 0; + + /* Stop device cloning. */ + clone_cleanup(&filemon_clones); + } +#endif + /* free() filemon structs free list. */ + filemon_lock_write(); + while ((filemon = TAILQ_FIRST(&filemons_free)) != NULL) { + TAILQ_REMOVE(&filemons_free, filemon, link); + mtx_destroy(&filemon->mtx); + cv_destroy(&filemon->cv); + free(filemon, M_FILEMON); + } + filemon_unlock_write(); + + mtx_destroy(&access_mtx); + cv_destroy(&access_cv); + } + + return (error); +} + +static int +filemon_modevent(module_t mod __unused, int type, void *data) +{ + int error = 0; + + switch (type) { + case MOD_LOAD: + filemon_load(data); + break; + + case MOD_UNLOAD: + error = filemon_unload(); + break; + + case MOD_SHUTDOWN: + break; + + default: + error = EOPNOTSUPP; + break; + + } + + return (error); +} + +DEV_MODULE(filemon, filemon_modevent, NULL); +MODULE_VERSION(filemon, 1); diff --git a/sys/dev/filemon/filemon.h b/sys/dev/filemon/filemon.h new file mode 100644 index 00000000000..95d2ef3b17d --- /dev/null +++ b/sys/dev/filemon/filemon.h @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2011, David E. O'Brien. + * Copyright (c) 2009-2011, Juniper Networks, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JUNIPER NETWORKS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JUNIPER NETWORKS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#define FILEMON_SET_FD _IOWR('S', 1, int) +#define FILEMON_SET_PID _IOWR('S', 2, pid_t) + +#define FILEMON_VERSION 4 /* output format + (bump when adding record types) */ diff --git a/sys/dev/filemon/filemon_lock.c b/sys/dev/filemon/filemon_lock.c new file mode 100644 index 00000000000..6e836d1b26b --- /dev/null +++ b/sys/dev/filemon/filemon_lock.c @@ -0,0 +1,122 @@ +/*- + * Copyright (c) 2009-2011, Juniper Networks, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JUNIPER NETWORKS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JUNIPER NETWORKS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +static void +filemon_filemon_lock(struct filemon *filemon) +{ + mtx_lock(&filemon->mtx); + + while (filemon->locker != NULL && filemon->locker != curthread) + cv_wait(&filemon->cv, &filemon->mtx); + + filemon->locker = curthread; + + mtx_unlock(&filemon->mtx); +} + +static void +filemon_filemon_unlock(struct filemon *filemon) +{ + mtx_lock(&filemon->mtx); + + if (filemon->locker == curthread) + filemon->locker = NULL; + + /* Wake up threads waiting. */ + cv_broadcast(&filemon->cv); + + mtx_unlock(&filemon->mtx); +} + +static void +filemon_lock_read(void) +{ + mtx_lock(&access_mtx); + + while (access_owner != NULL || access_requester != NULL) + cv_wait(&access_cv, &access_mtx); + + n_readers++; + + /* Wake up threads waiting. */ + cv_broadcast(&access_cv); + + mtx_unlock(&access_mtx); +} + +static void +filemon_unlock_read(void) +{ + mtx_lock(&access_mtx); + + if (n_readers > 0) + n_readers--; + + /* Wake up a thread waiting. */ + cv_broadcast(&access_cv); + + mtx_unlock(&access_mtx); +} + +static void +filemon_lock_write(void) +{ + mtx_lock(&access_mtx); + + while (access_owner != curthread) { + if (access_owner == NULL && + (access_requester == NULL || + access_requester == curthread)) { + access_owner = curthread; + access_requester = NULL; + } else { + if (access_requester == NULL) + access_requester = curthread; + + cv_wait(&access_cv, &access_mtx); + } + } + + mtx_unlock(&access_mtx); +} + +static void +filemon_unlock_write(void) +{ + mtx_lock(&access_mtx); + + /* Sanity check that the current thread actually has the write lock. */ + if (access_owner == curthread) + access_owner = NULL; + + /* Wake up a thread waiting. */ + cv_broadcast(&access_cv); + + mtx_unlock(&access_mtx); +} diff --git a/sys/dev/filemon/filemon_wrapper.c b/sys/dev/filemon/filemon_wrapper.c new file mode 100644 index 00000000000..278faa917e5 --- /dev/null +++ b/sys/dev/filemon/filemon_wrapper.c @@ -0,0 +1,742 @@ +/*- + * Copyright (c) 2011, David E. O'Brien. + * Copyright (c) 2009-2011, Juniper Networks, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JUNIPER NETWORKS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JUNIPER NETWORKS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#if __FreeBSD_version > 800032 +#define FILEMON_HAS_LINKAT +#endif + +#if __FreeBSD_version < 900044 /* r225617 (2011-09-16) failed to bump + __FreeBSD_version. This really should + be based on "900045". "900044" is r225469 + (2011-09-10) so this code is broken for + 9-CURRENT September 10th-16th. */ +#define sys_chdir chdir +#define sys_execve execve +#define sys_fork fork +#define sys_link link +#define sys_open open +#define sys_rename rename +#define sys_stat stat +#define sys_symlink symlink +#define sys_unlink unlink +#define sys_vfork vfork +#define sys_sys_exit sys_exit +#ifdef FILEMON_HAS_LINKAT +#define sys_linkat linkat +#endif +#endif /* __FreeBSD_version */ + +static void +filemon_output(struct filemon *filemon, char *msg, size_t len) +{ + struct uio auio; + struct iovec aiov; + + if (filemon->fp == NULL) + return; + + aiov.iov_base = msg; + aiov.iov_len = len; + auio.uio_iov = &aiov; + auio.uio_iovcnt = 1; + auio.uio_resid = len; + auio.uio_segflg = UIO_SYSSPACE; + auio.uio_rw = UIO_WRITE; + auio.uio_td = curthread; + auio.uio_offset = (off_t) -1; + + bwillwrite(); + + fo_write(filemon->fp, &auio, curthread->td_ucred, 0, curthread); +} + +static struct filemon * +filemon_pid_check(struct proc *p) +{ + struct filemon *filemon; + + TAILQ_FOREACH(filemon, &filemons_inuse, link) { + if (p->p_pid == filemon->pid) + return (filemon); + } + + if (p->p_pptr == NULL) + return (NULL); + + return (filemon_pid_check(p->p_pptr)); +} + +static void +filemon_comment(struct filemon *filemon) +{ + int len; + struct timeval now; + + /* Load timestamp before locking. Less accurate but less contention. */ + getmicrotime(&now); + + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + len = snprintf(filemon->msgbufr, sizeof(filemon->msgbufr), + "# filemon version %d\n# Target pid %d\n# Start %ju.%06ju\nV %d\n", + FILEMON_VERSION, curproc->p_pid, (uintmax_t)now.tv_sec, + (uintmax_t)now.tv_usec, FILEMON_VERSION); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + + /* Release the read lock. */ + filemon_unlock_read(); +} + +static int +filemon_wrapper_chdir(struct thread *td, struct chdir_args *uap) +{ + int ret; + size_t done; + size_t len; + struct filemon *filemon; + + if ((ret = sys_chdir(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + copyinstr(uap->path, filemon->fname1, + sizeof(filemon->fname1), &done); + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "C %d %s\n", + curproc->p_pid, filemon->fname1); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} + +static int +filemon_wrapper_execve(struct thread *td, struct execve_args *uap) +{ + char fname[MAXPATHLEN]; + int ret; + size_t done; + size_t len; + struct filemon *filemon; + + copyinstr(uap->fname, fname, sizeof(fname), &done); + + if ((ret = sys_execve(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "E %d %s\n", + curproc->p_pid, fname); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} + +#if defined(COMPAT_IA32) || defined(COMPAT_FREEBSD32) || defined(COMPAT_ARCH32) +static int +filemon_wrapper_freebsd32_execve(struct thread *td, + struct freebsd32_execve_args *uap) +{ + char fname[MAXPATHLEN]; + int ret; + size_t done; + size_t len; + struct filemon *filemon; + + copyinstr(uap->fname, fname, sizeof(fname), &done); + + if ((ret = freebsd32_execve(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "E %d %s\n", + curproc->p_pid, fname); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} +#endif + +static int +filemon_wrapper_fork(struct thread *td, struct fork_args *uap) +{ + int ret; + size_t len; + struct filemon *filemon; + + if ((ret = sys_fork(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "F %d %ld\n", + curproc->p_pid, (long)curthread->td_retval[0]); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} + +static int +filemon_wrapper_open(struct thread *td, struct open_args *uap) +{ + int ret; + size_t done; + size_t len; + struct filemon *filemon; + + if ((ret = sys_open(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + copyinstr(uap->path, filemon->fname1, + sizeof(filemon->fname1), &done); + + if (uap->flags & O_RDWR) { + /* + * We'll get the W record below, but need + * to also output an R to distingish from + * O_WRONLY. + */ + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "R %d %s\n", + curproc->p_pid, filemon->fname1); + filemon_output(filemon, filemon->msgbufr, len); + } + + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "%c %d %s\n", + (uap->flags & O_ACCMODE) ? 'W':'R', + curproc->p_pid, filemon->fname1); + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} + +static int +filemon_wrapper_rename(struct thread *td, struct rename_args *uap) +{ + int ret; + size_t done; + size_t len; + struct filemon *filemon; + + if ((ret = sys_rename(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + copyinstr(uap->from, filemon->fname1, + sizeof(filemon->fname1), &done); + copyinstr(uap->to, filemon->fname2, + sizeof(filemon->fname2), &done); + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "M %d '%s' '%s'\n", + curproc->p_pid, filemon->fname1, filemon->fname2); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} + +static int +filemon_wrapper_link(struct thread *td, struct link_args *uap) +{ + int ret; + size_t done; + size_t len; + struct filemon *filemon; + + if ((ret = sys_link(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + copyinstr(uap->path, filemon->fname1, + sizeof(filemon->fname1), &done); + copyinstr(uap->link, filemon->fname2, + sizeof(filemon->fname2), &done); + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "L %d '%s' '%s'\n", + curproc->p_pid, filemon->fname1, filemon->fname2); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} + +static int +filemon_wrapper_symlink(struct thread *td, struct symlink_args *uap) +{ + int ret; + size_t done; + size_t len; + struct filemon *filemon; + + if ((ret = sys_symlink(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + copyinstr(uap->path, filemon->fname1, + sizeof(filemon->fname1), &done); + copyinstr(uap->link, filemon->fname2, + sizeof(filemon->fname2), &done); + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "L %d '%s' '%s'\n", + curproc->p_pid, filemon->fname1, filemon->fname2); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} + +#ifdef FILEMON_HAS_LINKAT +static int +filemon_wrapper_linkat(struct thread *td, struct linkat_args *uap) +{ + int ret; + size_t done; + size_t len; + struct filemon *filemon; + + if ((ret = sys_linkat(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + copyinstr(uap->path1, filemon->fname1, + sizeof(filemon->fname1), &done); + copyinstr(uap->path2, filemon->fname2, + sizeof(filemon->fname2), &done); + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "L %d '%s' '%s'\n", + curproc->p_pid, filemon->fname1, filemon->fname2); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} +#endif + +static int +filemon_wrapper_stat(struct thread *td, struct stat_args *uap) +{ + int ret; + size_t done; + size_t len; + struct filemon *filemon; + + if ((ret = sys_stat(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + copyinstr(uap->path, filemon->fname1, + sizeof(filemon->fname1), &done); + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "S %d %s\n", + curproc->p_pid, filemon->fname1); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} + +#if defined(COMPAT_IA32) || defined(COMPAT_FREEBSD32) || defined(COMPAT_ARCH32) +static int +filemon_wrapper_freebsd32_stat(struct thread *td, + struct freebsd32_stat_args *uap) +{ + int ret; + size_t done; + size_t len; + struct filemon *filemon; + + if ((ret = freebsd32_stat(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + copyinstr(uap->path, filemon->fname1, + sizeof(filemon->fname1), &done); + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "S %d %s\n", + curproc->p_pid, filemon->fname1); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} +#endif + +static void +filemon_wrapper_sys_exit(struct thread *td, struct sys_exit_args *uap) +{ + size_t len; + struct filemon *filemon; + struct timeval now; + + /* Get timestamp before locking. */ + getmicrotime(&now); + + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + len = snprintf(filemon->msgbufr, sizeof(filemon->msgbufr), + "X %d %d\n", curproc->p_pid, uap->rval); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Check if the monitored process is about to exit. */ + if (filemon->pid == curproc->p_pid) { + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), + "# Stop %ju.%06ju\n# Bye bye\n", + (uintmax_t)now.tv_sec, (uintmax_t)now.tv_usec); + + filemon_output(filemon, filemon->msgbufr, len); + } + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + + sys_sys_exit(td, uap); +} + +static int +filemon_wrapper_unlink(struct thread *td, struct unlink_args *uap) +{ + int ret; + size_t done; + size_t len; + struct filemon *filemon; + + if ((ret = sys_unlink(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + copyinstr(uap->path, filemon->fname1, + sizeof(filemon->fname1), &done); + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "D %d %s\n", + curproc->p_pid, filemon->fname1); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} + +static int +filemon_wrapper_vfork(struct thread *td, struct vfork_args *uap) +{ + int ret; + size_t len; + struct filemon *filemon; + + if ((ret = sys_vfork(td, uap)) == 0) { + /* Grab a read lock on the filemon inuse list. */ + filemon_lock_read(); + + if ((filemon = filemon_pid_check(curproc)) != NULL) { + /* Lock the found filemon structure. */ + filemon_filemon_lock(filemon); + + len = snprintf(filemon->msgbufr, + sizeof(filemon->msgbufr), "F %d %ld\n", + curproc->p_pid, (long)curthread->td_retval[0]); + + filemon_output(filemon, filemon->msgbufr, len); + + /* Unlock the found filemon structure. */ + filemon_filemon_unlock(filemon); + } + + /* Release the read lock. */ + filemon_unlock_read(); + } + + return (ret); +} + +static void +filemon_wrapper_install(void) +{ +#if defined(__LP64__) + struct sysent *sv_table = elf64_freebsd_sysvec.sv_table; +#else + struct sysent *sv_table = elf32_freebsd_sysvec.sv_table; +#endif + + sv_table[SYS_chdir].sy_call = (sy_call_t *) filemon_wrapper_chdir; + sv_table[SYS_exit].sy_call = (sy_call_t *) filemon_wrapper_sys_exit; + sv_table[SYS_execve].sy_call = (sy_call_t *) filemon_wrapper_execve; + sv_table[SYS_fork].sy_call = (sy_call_t *) filemon_wrapper_fork; + sv_table[SYS_open].sy_call = (sy_call_t *) filemon_wrapper_open; + sv_table[SYS_rename].sy_call = (sy_call_t *) filemon_wrapper_rename; + sv_table[SYS_stat].sy_call = (sy_call_t *) filemon_wrapper_stat; + sv_table[SYS_unlink].sy_call = (sy_call_t *) filemon_wrapper_unlink; + sv_table[SYS_vfork].sy_call = (sy_call_t *) filemon_wrapper_vfork; + sv_table[SYS_link].sy_call = (sy_call_t *) filemon_wrapper_link; + sv_table[SYS_symlink].sy_call = (sy_call_t *) filemon_wrapper_symlink; +#ifdef FILEMON_HAS_LINKAT + sv_table[SYS_linkat].sy_call = (sy_call_t *) filemon_wrapper_linkat; +#endif + +#if defined(COMPAT_IA32) || defined(COMPAT_FREEBSD32) || defined(COMPAT_ARCH32) + sv_table = ia32_freebsd_sysvec.sv_table; + + sv_table[FREEBSD32_SYS_chdir].sy_call = (sy_call_t *) filemon_wrapper_chdir; + sv_table[FREEBSD32_SYS_exit].sy_call = (sy_call_t *) filemon_wrapper_sys_exit; + sv_table[FREEBSD32_SYS_freebsd32_execve].sy_call = (sy_call_t *) filemon_wrapper_freebsd32_execve; + sv_table[FREEBSD32_SYS_fork].sy_call = (sy_call_t *) filemon_wrapper_fork; + sv_table[FREEBSD32_SYS_open].sy_call = (sy_call_t *) filemon_wrapper_open; + sv_table[FREEBSD32_SYS_rename].sy_call = (sy_call_t *) filemon_wrapper_rename; + sv_table[FREEBSD32_SYS_freebsd32_stat].sy_call = (sy_call_t *) filemon_wrapper_freebsd32_stat; + sv_table[FREEBSD32_SYS_unlink].sy_call = (sy_call_t *) filemon_wrapper_unlink; + sv_table[FREEBSD32_SYS_vfork].sy_call = (sy_call_t *) filemon_wrapper_vfork; + sv_table[FREEBSD32_SYS_link].sy_call = (sy_call_t *) filemon_wrapper_link; + sv_table[FREEBSD32_SYS_symlink].sy_call = (sy_call_t *) filemon_wrapper_symlink; +#ifdef FILEMON_HAS_LINKAT + sv_table[FREEBSD32_SYS_linkat].sy_call = (sy_call_t *) filemon_wrapper_linkat; +#endif +#endif /* COMPAT_ARCH32 */ +} + +static void +filemon_wrapper_deinstall(void) +{ +#if defined(__LP64__) + struct sysent *sv_table = elf64_freebsd_sysvec.sv_table; +#else + struct sysent *sv_table = elf32_freebsd_sysvec.sv_table; +#endif + + sv_table[SYS_chdir].sy_call = (sy_call_t *)sys_chdir; + sv_table[SYS_exit].sy_call = (sy_call_t *)sys_sys_exit; + sv_table[SYS_execve].sy_call = (sy_call_t *)sys_execve; + sv_table[SYS_fork].sy_call = (sy_call_t *)sys_fork; + sv_table[SYS_open].sy_call = (sy_call_t *)sys_open; + sv_table[SYS_rename].sy_call = (sy_call_t *)sys_rename; + sv_table[SYS_stat].sy_call = (sy_call_t *)sys_stat; + sv_table[SYS_unlink].sy_call = (sy_call_t *)sys_unlink; + sv_table[SYS_vfork].sy_call = (sy_call_t *)sys_vfork; + sv_table[SYS_link].sy_call = (sy_call_t *)sys_link; + sv_table[SYS_symlink].sy_call = (sy_call_t *)sys_symlink; +#ifdef FILEMON_HAS_LINKAT + sv_table[SYS_linkat].sy_call = (sy_call_t *)sys_linkat; +#endif + +#if defined(COMPAT_IA32) || defined(COMPAT_FREEBSD32) || defined(COMPAT_ARCH32) + sv_table = ia32_freebsd_sysvec.sv_table; + + sv_table[FREEBSD32_SYS_chdir].sy_call = (sy_call_t *)sys_chdir; + sv_table[FREEBSD32_SYS_exit].sy_call = (sy_call_t *)sys_sys_exit; + sv_table[FREEBSD32_SYS_freebsd32_execve].sy_call = (sy_call_t *)freebsd32_execve; + sv_table[FREEBSD32_SYS_fork].sy_call = (sy_call_t *)sys_fork; + sv_table[FREEBSD32_SYS_open].sy_call = (sy_call_t *)sys_open; + sv_table[FREEBSD32_SYS_rename].sy_call = (sy_call_t *)sys_rename; + sv_table[FREEBSD32_SYS_freebsd32_stat].sy_call = (sy_call_t *)freebsd32_stat; + sv_table[FREEBSD32_SYS_unlink].sy_call = (sy_call_t *)sys_unlink; + sv_table[FREEBSD32_SYS_vfork].sy_call = (sy_call_t *)sys_vfork; + sv_table[FREEBSD32_SYS_link].sy_call = (sy_call_t *)sys_link; + sv_table[FREEBSD32_SYS_symlink].sy_call = (sy_call_t *)sys_symlink; +#ifdef FILEMON_HAS_LINKAT + sv_table[FREEBSD32_SYS_linkat].sy_call = (sy_call_t *)sys_linkat; +#endif +#endif /* COMPAT_ARCH32 */ +} diff --git a/sys/dev/firewire/sbp_targ.c b/sys/dev/firewire/sbp_targ.c index 3a743891689..34a75cbbc1d 100644 --- a/sys/dev/firewire/sbp_targ.c +++ b/sys/dev/firewire/sbp_targ.c @@ -533,7 +533,7 @@ sbp_targ_send_lstate_events(struct sbp_targ_softc *sc, { #if 0 struct ccb_hdr *ccbh; - struct ccb_immed_notify *inot; + struct ccb_immediate_notify *inot; printf("%s: not implemented yet\n", __func__); #endif @@ -908,7 +908,7 @@ sbp_targ_abort_ccb(struct sbp_targ_softc *sc, union ccb *ccb) if (accb->ccb_h.func_code == XPT_ACCEPT_TARGET_IO) list = &lstate->accept_tios; - else if (accb->ccb_h.func_code == XPT_IMMED_NOTIFY) + else if (accb->ccb_h.func_code == XPT_IMMEDIATE_NOTIFY) list = &lstate->immed_notifies; else return (CAM_UA_ABORT); @@ -1301,8 +1301,8 @@ sbp_targ_action1(struct cam_sim *sim, union ccb *ccb) } } break; - case XPT_NOTIFY_ACK: /* recycle notify ack */ - case XPT_IMMED_NOTIFY: /* Add Immediate Notify Resource */ + case XPT_NOTIFY_ACKNOWLEDGE: /* recycle notify ack */ + case XPT_IMMEDIATE_NOTIFY: /* Add Immediate Notify Resource */ if (status != CAM_REQ_CMP) { ccb->ccb_h.status = status; xpt_done(ccb); @@ -1349,7 +1349,7 @@ sbp_targ_action1(struct cam_sim *sim, union ccb *ccb) switch (accb->ccb_h.func_code) { case XPT_ACCEPT_TARGET_IO: - case XPT_IMMED_NOTIFY: + case XPT_IMMEDIATE_NOTIFY: ccb->ccb_h.status = sbp_targ_abort_ccb(sc, ccb); break; case XPT_CONT_TARGET_IO: diff --git a/sys/dev/flash/at45d.c b/sys/dev/flash/at45d.c index 21a2056c43c..7d1172fba5a 100644 --- a/sys/dev/flash/at45d.c +++ b/sys/dev/flash/at45d.c @@ -1,5 +1,8 @@ /*- - * Copyright (c) 2006 M. Warner Losh. All rights reserved. + * Copyright (c) 2006 M. Warner Losh + * Copyright (c) 2011-2012 Ian Lepore + * Copyright (c) 2012 Marius Strobl + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -42,44 +45,82 @@ __FBSDID("$FreeBSD$"); #include #include "spibus_if.h" -struct at45d_softc +struct at45d_flash_ident { - struct intr_config_hook config_intrhook; - device_t dev; - struct mtx sc_mtx; - struct disk *disk; - struct proc *p; - struct bio_queue_head bio_queue; + const char *name; + uint32_t jedec; + uint16_t pagecount; + uint16_t pageoffset; + uint16_t pagesize; + uint16_t pagesize2n; }; -#define AT45D_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) +struct at45d_softc +{ + struct bio_queue_head bio_queue; + struct mtx sc_mtx; + struct disk *disk; + struct proc *p; + struct intr_config_hook config_intrhook; + device_t dev; + uint16_t pagecount; + uint16_t pageoffset; + uint16_t pagesize; +}; + +#define AT45D_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) #define AT45D_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) -#define AT45D_LOCK_INIT(_sc) \ +#define AT45D_LOCK_INIT(_sc) \ mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->dev), \ "at45d", MTX_DEF) -#define AT45D_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx); -#define AT45D_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED); -#define AT45D_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); +#define AT45D_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx); +#define AT45D_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED); +#define AT45D_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); -static void at45d_delayed_attach(void *xsc); +/* bus entry points */ +static device_attach_t at45d_attach; +static device_detach_t at45d_detach; +static device_probe_t at45d_probe; /* disk routines */ -static int at45d_open(struct disk *dp); static int at45d_close(struct disk *dp); +static int at45d_open(struct disk *dp); static void at45d_strategy(struct bio *bp); static void at45d_task(void *arg); -#define CONTINUOUS_ARRAY_READ 0xE8 -#define CONTINUOUS_ARRAY_READ_HF 0x0B -#define CONTINUOUS_ARRAY_READ_LF 0x03 -#define STATUS_REGISTER_READ 0xD7 -#define PROGRAM_THROUGH_BUFFER 0x82 -#define MANUFACTURER_ID 0x9F +/* helper routines */ +static void at45d_delayed_attach(void *xsc); +static int at45d_get_mfg_info(device_t dev, uint8_t *resp); +static int at45d_get_status(device_t dev, uint8_t *status); +static int at45d_wait_ready(device_t dev, uint8_t *status); -static uint8_t -at45d_get_status(device_t dev) +#define BUFFER_TRANSFER 0x53 +#define BUFFER_COMPARE 0x60 +#define PROGRAM_THROUGH_BUFFER 0x82 +#define MANUFACTURER_ID 0x9f +#define STATUS_REGISTER_READ 0xd7 +#define CONTINUOUS_ARRAY_READ 0xe8 + +/* + * A sectorsize2n != 0 is used to indicate that a device optionally supports + * 2^N byte pages. If support for the latter is enabled, the sector offset + * has to be reduced by one. + */ +static const struct at45d_flash_ident const at45d_flash_devices[] = { + { "AT45DB011B", 0x1f2200, 512, 9, 264, 256 }, + { "AT45DB021B", 0x1f2300, 1024, 9, 264, 256 }, + { "AT45DB041x", 0x1f2400, 2028, 9, 264, 256 }, + { "AT45DB081B", 0x1f2500, 4096, 9, 264, 256 }, + { "AT45DB161x", 0x1f2600, 4096, 10, 528, 512 }, + { "AT45DB321x", 0x1f2700, 8192, 10, 528, 0 }, + { "AT45DB321x", 0x1f2701, 8192, 10, 528, 512 }, + { "AT45DB642x", 0x1f2800, 8192, 11, 1056, 1024 } +}; + +static int +at45d_get_status(device_t dev, uint8_t *status) { - uint8_t txBuf[8], rxBuf[8]; + uint8_t rxBuf[8], txBuf[8]; struct spi_command cmd; int err; @@ -90,23 +131,16 @@ at45d_get_status(device_t dev) txBuf[0] = STATUS_REGISTER_READ; cmd.tx_cmd = txBuf; cmd.rx_cmd = rxBuf; - cmd.rx_cmd_sz = 2; - cmd.tx_cmd_sz = 2; + cmd.rx_cmd_sz = cmd.tx_cmd_sz = 2; err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd); - return (rxBuf[1]); -} - -static void -at45d_wait_for_device_ready(device_t dev) -{ - while (!(at45d_get_status(dev) & 0x80)) - continue; + *status = rxBuf[1]; + return (err); } static int at45d_get_mfg_info(device_t dev, uint8_t *resp) { - uint8_t txBuf[8], rxBuf[8]; + uint8_t rxBuf[8], txBuf[8]; struct spi_command cmd; int err; @@ -117,22 +151,37 @@ at45d_get_mfg_info(device_t dev, uint8_t *resp) txBuf[0] = MANUFACTURER_ID; cmd.tx_cmd = &txBuf; cmd.rx_cmd = &rxBuf; - cmd.tx_cmd_sz = 5; - cmd.rx_cmd_sz = 5; + cmd.tx_cmd_sz = cmd.rx_cmd_sz = 5; err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd); if (err) return (err); memcpy(resp, rxBuf + 1, 4); - // XXX We really should 'decode' the reply into some kind of - // XXX structure. To be generic (and not just for atmel parts) - // XXX we'd have to loop until we got a full reply. return (0); } +static int +at45d_wait_ready(device_t dev, uint8_t *status) +{ + struct timeval now, tout; + int err; + + getmicrouptime(&tout); + tout.tv_sec += 3; + do { + getmicrouptime(&now); + if (now.tv_sec > tout.tv_sec) + err = ETIMEDOUT; + else + err = at45d_get_status(dev, status); + } while (err == 0 && (*status & 0x80) == 0); + return (err); +} + static int at45d_probe(device_t dev) { - device_set_desc(dev, "AT45 Flash Family"); + + device_set_desc(dev, "AT45D Flash Family"); return (0); } @@ -156,31 +205,66 @@ at45d_attach(device_t dev) static int at45d_detach(device_t dev) { - return EIO; + + return (EBUSY) /* XXX */; } static void at45d_delayed_attach(void *xsc) { - struct at45d_softc *sc = xsc; - uint8_t buf[4]; - - at45d_get_mfg_info(sc->dev, buf); - at45d_wait_for_device_ready(sc->dev); + struct at45d_softc *sc; + const struct at45d_flash_ident *ident; + u_int i; + uint32_t jedec; + uint16_t pagesize; + uint8_t buf[4], status; - sc->disk = disk_alloc(); - sc->disk->d_open = at45d_open; - sc->disk->d_close = at45d_close; - sc->disk->d_strategy = at45d_strategy; - sc->disk->d_name = "flash/spi"; - sc->disk->d_drv1 = sc; - sc->disk->d_maxsize = DFLTPHYS; - sc->disk->d_sectorsize = 1056; /* XXX */ - sc->disk->d_mediasize = 8192 * 1056; /* XXX */ - sc->disk->d_unit = device_get_unit(sc->dev); - disk_create(sc->disk, DISK_VERSION); - bioq_init(&sc->bio_queue); - kproc_create(&at45d_task, sc, &sc->p, 0, 0, "task: at45d flash"); + sc = xsc; + ident = NULL; + jedec = 0; + + if (at45d_wait_ready(sc->dev, &status) != 0) + device_printf(sc->dev, "Error waiting for device-ready.\n"); + else if (at45d_get_mfg_info(sc->dev, buf) != 0) + device_printf(sc->dev, "Failed to get ID.\n"); + else { + jedec = buf[0] << 16 | buf[1] << 8 | buf[2]; + for (i = 0; i < nitems(at45d_flash_devices); i++) { + if (at45d_flash_devices[i].jedec == jedec) { + ident = &at45d_flash_devices[i]; + break; + } + } + } + if (ident == NULL) + device_printf(sc->dev, "JEDEC 0x%x not in list.\n", jedec); + else { + sc->pagecount = ident->pagecount; + sc->pageoffset = ident->pageoffset; + if (ident->pagesize2n != 0 && (status & 0x01) != 0) { + sc->pageoffset -= 1; + pagesize = ident->pagesize2n; + } else + pagesize = ident->pagesize; + sc->pagesize = pagesize; + + sc->disk = disk_alloc(); + sc->disk->d_open = at45d_open; + sc->disk->d_close = at45d_close; + sc->disk->d_strategy = at45d_strategy; + sc->disk->d_name = "flash/spi"; + sc->disk->d_drv1 = sc; + sc->disk->d_maxsize = DFLTPHYS; + sc->disk->d_sectorsize = pagesize; + sc->disk->d_mediasize = pagesize * ident->pagecount; + sc->disk->d_unit = device_get_unit(sc->dev); + disk_create(sc->disk, DISK_VERSION); + bioq_init(&sc->bio_queue); + kproc_create(&at45d_task, sc, &sc->p, 0, 0, + "task: at45d flash"); + device_printf(sc->dev, "%s, %d bytes per page, %d pages\n", + ident->name, pagesize, ident->pagecount); + } config_intrhook_disestablish(&sc->config_intrhook); } @@ -188,13 +272,15 @@ at45d_delayed_attach(void *xsc) static int at45d_open(struct disk *dp) { - return 0; + + return (0); } static int at45d_close(struct disk *dp) { - return 0; + + return (0); } static void @@ -212,53 +298,132 @@ at45d_strategy(struct bio *bp) static void at45d_task(void *arg) { - struct at45d_softc *sc = (struct at45d_softc*)arg; + uint8_t rxBuf[8], txBuf[8]; + struct at45d_softc *sc; struct bio *bp; - uint8_t txBuf[8], rxBuf[8]; struct spi_command cmd; - int sz; - daddr_t block, end; device_t dev, pdev; - int err; + caddr_t buf; + u_long len, resid; + u_int addr, berr, err, offset, page; + uint8_t status; + + sc = (struct at45d_softc*)arg; + dev = sc->dev; + pdev = device_get_parent(dev); + memset(&cmd, 0, sizeof(cmd)); + memset(txBuf, 0, sizeof(txBuf)); + memset(rxBuf, 0, sizeof(rxBuf)); + cmd.tx_cmd = txBuf; + cmd.rx_cmd = rxBuf; for (;;) { - dev = sc->dev; - pdev = device_get_parent(dev); AT45D_LOCK(sc); do { - bp = bioq_first(&sc->bio_queue); + bp = bioq_takefirst(&sc->bio_queue); if (bp == NULL) msleep(sc, &sc->sc_mtx, PRIBIO, "jobqueue", 0); } while (bp == NULL); - bioq_remove(&sc->bio_queue, bp); AT45D_UNLOCK(sc); - sz = sc->disk->d_sectorsize; - end = bp->bio_pblkno + (bp->bio_bcount / sz); - for (block = bp->bio_pblkno; block < end; block++) { - char *vaddr = bp->bio_data + (block - bp->bio_pblkno) * sz; - if (bp->bio_cmd == BIO_READ) { - txBuf[0] = CONTINUOUS_ARRAY_READ_HF; - cmd.tx_cmd_sz = 5; - cmd.rx_cmd_sz = 5; - } else { - txBuf[0] = PROGRAM_THROUGH_BUFFER; - cmd.tx_cmd_sz = 4; - cmd.rx_cmd_sz = 4; - } - // XXX only works on certain devices... Fixme - txBuf[1] = ((block >> 5) & 0xFF); - txBuf[2] = ((block << 3) & 0xF8); - txBuf[3] = 0; - txBuf[4] = 0; - cmd.tx_cmd = txBuf; - cmd.rx_cmd = rxBuf; - cmd.tx_data = vaddr; - cmd.tx_data_sz = sz; - cmd.rx_data = vaddr; - cmd.rx_data_sz = sz; - err = SPIBUS_TRANSFER(pdev, dev, &cmd); - // XXX err check? + + berr = 0; + buf = bp->bio_data; + len = resid = bp->bio_bcount; + page = bp->bio_offset / sc->pagesize; + offset = bp->bio_offset % sc->pagesize; + + switch (bp->bio_cmd) { + case BIO_READ: + txBuf[0] = CONTINUOUS_ARRAY_READ; + cmd.tx_cmd_sz = cmd.rx_cmd_sz = 8; + cmd.tx_data = cmd.rx_data = buf; + break; + case BIO_WRITE: + cmd.tx_cmd_sz = cmd.rx_cmd_sz = 4; + cmd.tx_data = cmd.rx_data = buf; + if (resid + offset > sc->pagesize) + len = sc->pagesize - offset; + break; + default: + berr = EINVAL; + goto out; } + + /* + * NB: for BIO_READ, this loop is only traversed once. + */ + while (resid > 0) { + if (page > sc->pagecount) { + berr = EINVAL; + goto out; + } + addr = page << sc->pageoffset; + if (bp->bio_cmd == BIO_WRITE) { + if (len != sc->pagesize) { + txBuf[0] = BUFFER_TRANSFER; + txBuf[1] = ((addr >> 16) & 0xff); + txBuf[2] = ((addr >> 8) & 0xff); + txBuf[3] = 0; + cmd.tx_data_sz = cmd.rx_data_sz = 0; + err = SPIBUS_TRANSFER(pdev, dev, + &cmd); + if (err == 0) + err = at45d_wait_ready(dev, + &status); + if (err != 0) { + berr = EIO; + goto out; + } + } + txBuf[0] = PROGRAM_THROUGH_BUFFER; + } + + addr += offset; + txBuf[1] = ((addr >> 16) & 0xff); + txBuf[2] = ((addr >> 8) & 0xff); + txBuf[3] = (addr & 0xff); + cmd.tx_data_sz = cmd.rx_data_sz = len; + err = SPIBUS_TRANSFER(pdev, dev, &cmd); + if (err == 0 && bp->bio_cmd != BIO_READ) + err = at45d_wait_ready(dev, &status); + if (err != 0) { + berr = EIO; + goto out; + } + if (bp->bio_cmd == BIO_WRITE) { + addr = page << sc->pageoffset; + txBuf[0] = BUFFER_COMPARE; + txBuf[1] = ((addr >> 16) & 0xff); + txBuf[2] = ((addr >> 8) & 0xff); + txBuf[3] = 0; + cmd.tx_data_sz = cmd.rx_data_sz = 0; + err = SPIBUS_TRANSFER(pdev, dev, &cmd); + if (err == 0) + err = at45d_wait_ready(dev, &status); + if (err != 0 || (status & 0x40) != 0) { + device_printf(dev, "comparing page " + "%d failed (status=0x%x)\n", addr, + status); + berr = EIO; + goto out; + } + } + page++; + buf += len; + offset = 0; + resid -= len; + if (resid > sc->pagesize) + len = sc->pagesize; + else + len = resid; + cmd.tx_data = cmd.rx_data = buf; + } + out: + if (berr != 0) { + bp->bio_flags |= BIO_ERROR; + bp->bio_error = berr; + } + bp->bio_resid = resid; biodone(bp); } } @@ -271,7 +436,7 @@ static device_method_t at45d_methods[] = { DEVMETHOD(device_attach, at45d_attach), DEVMETHOD(device_detach, at45d_detach), - { 0, 0 } + DEVMETHOD_END }; static driver_t at45d_driver = { @@ -280,4 +445,4 @@ static driver_t at45d_driver = { sizeof(struct at45d_softc), }; -DRIVER_MODULE(at45d, spibus, at45d_driver, at45d_devclass, 0, 0); +DRIVER_MODULE(at45d, spibus, at45d_driver, at45d_devclass, NULL, NULL); diff --git a/sys/dev/fxp/if_fxp.c b/sys/dev/fxp/if_fxp.c index f8154c604f3..3dc1e19ede0 100644 --- a/sys/dev/fxp/if_fxp.c +++ b/sys/dev/fxp/if_fxp.c @@ -290,7 +290,7 @@ static device_method_t fxp_methods[] = { DEVMETHOD(miibus_writereg, fxp_miibus_writereg), DEVMETHOD(miibus_statchg, fxp_miibus_statchg), - { 0, 0 } + DEVMETHOD_END }; static driver_t fxp_driver = { @@ -301,8 +301,9 @@ static driver_t fxp_driver = { static devclass_t fxp_devclass; -DRIVER_MODULE(fxp, pci, fxp_driver, fxp_devclass, 0, 0); -DRIVER_MODULE(miibus, fxp, miibus_driver, miibus_devclass, 0, 0); +DRIVER_MODULE_ORDERED(fxp, pci, fxp_driver, fxp_devclass, NULL, NULL, + SI_ORDER_ANY); +DRIVER_MODULE(miibus, fxp, miibus_driver, miibus_devclass, NULL, NULL); static struct resource_spec fxp_res_spec_mem[] = { { SYS_RES_MEMORY, FXP_PCI_MMBA, RF_ACTIVE }, diff --git a/sys/dev/gxemul/cons/gxemul_cons.c b/sys/dev/gxemul/cons/gxemul_cons.c new file mode 100644 index 00000000000..bb12058510b --- /dev/null +++ b/sys/dev/gxemul/cons/gxemul_cons.c @@ -0,0 +1,334 @@ +/*- + * Copyright (c) 2011-2012 Robert N. M. Watson + * All rights reserved. + * + * This software was developed by SRI International and the University of + * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237) + * ("CTSRD"), as part of the DARPA CRASH research programme. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include + +#define GC_LOCK_INIT() mtx_init(&gc_lock, "gc_lock", NULL, MTX_SPIN) + +#define GC_LOCK() do { \ + if (!kdb_active) \ + mtx_lock_spin(&gc_lock); \ +} while (0) + +#define GC_LOCK_ASSERT() do { \ + if (!kdb_active) \ + mtx_assert(&gc_lock, MA_OWNED); \ +} while (0) + +#define GC_UNLOCK() do { \ + if (!kdb_active) \ + mtx_unlock_spin(&gc_lock); \ +} while (0) + + +static struct mtx gc_lock; + +/* + * Low-level console driver functions. + */ +static cn_probe_t gxemul_cons_cnprobe; +static cn_init_t gxemul_cons_cninit; +static cn_term_t gxemul_cons_cnterm; +static cn_getc_t gxemul_cons_cngetc; +static cn_putc_t gxemul_cons_cnputc; +static cn_grab_t gxemul_cons_cngrab; +static cn_ungrab_t gxemul_cons_cnungrab; + +/* + * TTY-level fields. + */ +static tsw_outwakeup_t gxemul_cons_outwakeup; + +static struct ttydevsw gxemul_cons_ttydevsw = { + .tsw_flags = TF_NOPREFIX, + .tsw_outwakeup = gxemul_cons_outwakeup, +}; + +static struct callout gxemul_cons_callout; +static u_int gxemul_cons_polltime = 10; +#ifdef KDB +static int gxemul_cons_alt_break_state; +#endif + +static void gxemul_cons_timeout(void *); + +/* + * I/O routines lifted from Deimos. + * + * XXXRW: Should be using FreeBSD's bus routines here, but they are not + * available until later in the boot. + */ +#define MIPS_XKPHYS_UNCACHED_BASE 0x9000000000000000 + +typedef uint64_t paddr_t; +typedef uint64_t vaddr_t; + +static inline vaddr_t +mips_phys_to_uncached(paddr_t phys) +{ + + return (phys | MIPS_XKPHYS_UNCACHED_BASE); +} + +static inline uint8_t +mips_ioread_uint8(vaddr_t vaddr) +{ + uint8_t v; + + __asm__ __volatile__ ("lbu %0, 0(%1)" : "=r" (v) : "r" (vaddr)); + return (v); +} + +static inline void +mips_iowrite_uint8(vaddr_t vaddr, uint8_t v) +{ + + __asm__ __volatile__ ("sb %0, 0(%1)" : : "r" (v), "r" (vaddr)); +} + +/* + * gxemul-specific constants. + */ +#define GXEMUL_CONS_BASE 0x10000000 /* gxemul console device. */ + +/* + * Routines for interacting with the gxemul test console. Programming details + * are a result of manually inspecting the source code for gxemul's + * dev_cons.cc and dev_cons.h. + * + * Offsets of I/O channels relative to the base. + */ +#define GXEMUL_PUTGETCHAR_OFF 0x00000000 +#define GXEMUL_CONS_HALT 0x00000010 + +/* + * One-byte buffer as we can't check whether the console is readable without + * actually reading from it. + */ +static char buffer_data; +static int buffer_valid; + +/* + * Low-level read and write routines. + */ +static inline uint8_t +gxemul_cons_data_read(void) +{ + + return (mips_ioread_uint8(mips_phys_to_uncached(GXEMUL_CONS_BASE + + GXEMUL_PUTGETCHAR_OFF))); +} + +static inline void +gxemul_cons_data_write(uint8_t v) +{ + + mips_iowrite_uint8(mips_phys_to_uncached(GXEMUL_CONS_BASE + + GXEMUL_PUTGETCHAR_OFF), v); +} + +static int +gxemul_cons_writable(void) +{ + + return (1); +} + +static int +gxemul_cons_readable(void) +{ + uint32_t v; + + GC_LOCK_ASSERT(); + + if (buffer_valid) + return (1); + v = gxemul_cons_data_read(); + if (v != 0) { + buffer_valid = 1; + buffer_data = v; + return (1); + } + return (0); +} + +static void +gxemul_cons_write(char ch) +{ + + GC_LOCK_ASSERT(); + + while (!gxemul_cons_writable()); + gxemul_cons_data_write(ch); +} + +static char +gxemul_cons_read(void) +{ + + GC_LOCK_ASSERT(); + + while (!gxemul_cons_readable()); + buffer_valid = 0; + return (buffer_data); +} + +/* + * Implementation of a FreeBSD low-level, polled console driver. + */ +static void +gxemul_cons_cnprobe(struct consdev *cp) +{ + + sprintf(cp->cn_name, "gxcons"); + cp->cn_pri = CN_NORMAL; +} + +static void +gxemul_cons_cninit(struct consdev *cp) +{ + + GC_LOCK_INIT(); +} + +static void +gxemul_cons_cnterm(struct consdev *cp) +{ + +} + +static int +gxemul_cons_cngetc(struct consdev *cp) +{ + int ret; + + GC_LOCK(); + ret = gxemul_cons_read(); + GC_UNLOCK(); + return (ret); +} + +static void +gxemul_cons_cnputc(struct consdev *cp, int c) +{ + + GC_LOCK(); + gxemul_cons_write(c); + GC_UNLOCK(); +} + +static void +gxemul_cons_cngrab(struct consdev *cp) +{ + +} + +static void +gxemul_cons_cnungrab(struct consdev *cp) +{ + +} + +CONSOLE_DRIVER(gxemul_cons); + +/* + * TTY-level functions for gxemul_cons. + */ +static void +gxemul_cons_ttyinit(void *unused) +{ + struct tty *tp; + + tp = tty_alloc(&gxemul_cons_ttydevsw, NULL); + tty_init_console(tp, 0); + tty_makedev(tp, NULL, "%s", "gxcons"); + callout_init(&gxemul_cons_callout, CALLOUT_MPSAFE); + callout_reset(&gxemul_cons_callout, gxemul_cons_polltime, + gxemul_cons_timeout, tp); + +} +SYSINIT(gxemul_cons_ttyinit, SI_SUB_CONFIGURE, SI_ORDER_MIDDLE, + gxemul_cons_ttyinit, NULL); + +static void +gxemul_cons_outwakeup(struct tty *tp) +{ + int len; + u_char ch; + + /* + * XXXRW: Would be nice not to do blocking writes to the console here, + * rescheduling on our timer tick if work remains to be done.. + */ + for (;;) { + len = ttydisc_getc(tp, &ch, sizeof(ch)); + if (len == 0) + break; + GC_LOCK(); + gxemul_cons_write(ch); + GC_UNLOCK(); + } +} + +static void +gxemul_cons_timeout(void *v) +{ + struct tty *tp; + int c; + + tp = v; + tty_lock(tp); + GC_LOCK(); + while (gxemul_cons_readable()) { + c = gxemul_cons_read(); + GC_UNLOCK(); +#ifdef KDB + kdb_alt_break(c, &gxemul_cons_alt_break_state); +#endif + ttydisc_rint(tp, c, 0); + GC_LOCK(); + } + GC_UNLOCK(); + ttydisc_rint_done(tp); + tty_unlock(tp); + callout_reset(&gxemul_cons_callout, gxemul_cons_polltime, + gxemul_cons_timeout, tp); +} diff --git a/sys/dev/gxemul/disk/gxemul_disk.c b/sys/dev/gxemul/disk/gxemul_disk.c new file mode 100644 index 00000000000..988ae7dd378 --- /dev/null +++ b/sys/dev/gxemul/disk/gxemul_disk.c @@ -0,0 +1,315 @@ +/*- + * Copyright (c) 2008-2012 Juli Mallett + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include + +struct gxemul_disk_softc { + device_t sc_dev; + uint64_t sc_size; + struct g_geom *sc_geom; + struct g_provider *sc_provider; +}; + +static struct mtx gxemul_disk_controller_mutex; + +static g_start_t gxemul_disk_start; +static g_access_t gxemul_disk_access; + +struct g_class g_gxemul_disk_class = { + .name = "GXemul", + .version = G_VERSION, + .start = gxemul_disk_start, + .access = gxemul_disk_access, +}; + +DECLARE_GEOM_CLASS(g_gxemul_disk_class, g_gxemul_disk); + +static void gxemul_disk_identify(driver_t *, device_t); +static int gxemul_disk_probe(device_t); +static int gxemul_disk_attach(device_t); +static void gxemul_disk_attach_geom(void *, int); + +static int gxemul_disk_read(unsigned, void *, off_t); +static int gxemul_disk_size(unsigned, uint64_t *); +static int gxemul_disk_write(unsigned, const void *, off_t); + +static void +gxemul_disk_start(struct bio *bp) +{ + struct gxemul_disk_softc *sc; + unsigned diskid; + off_t offset; + uint8_t *buf; + int error; + + sc = bp->bio_to->geom->softc; + diskid = device_get_unit(sc->sc_dev); + + if ((bp->bio_length % GXEMUL_DISK_DEV_BLOCKSIZE) != 0) { + g_io_deliver(bp, EINVAL); + return; + } + + buf = bp->bio_data; + offset = bp->bio_offset; + bp->bio_resid = bp->bio_length; + while (bp->bio_resid != 0) { + switch (bp->bio_cmd) { + case BIO_READ: + mtx_lock(&gxemul_disk_controller_mutex); + error = gxemul_disk_read(diskid, buf, offset); + mtx_unlock(&gxemul_disk_controller_mutex); + break; + case BIO_WRITE: + mtx_lock(&gxemul_disk_controller_mutex); + error = gxemul_disk_write(diskid, buf, offset); + mtx_unlock(&gxemul_disk_controller_mutex); + break; + default: + g_io_deliver(bp, EOPNOTSUPP); + return; + } + if (error != 0) { + g_io_deliver(bp, error); + return; + } + + buf += GXEMUL_DISK_DEV_BLOCKSIZE; + offset += GXEMUL_DISK_DEV_BLOCKSIZE; + bp->bio_completed += GXEMUL_DISK_DEV_BLOCKSIZE; + bp->bio_resid -= GXEMUL_DISK_DEV_BLOCKSIZE; + } + + g_io_deliver(bp, 0); +} + +static int +gxemul_disk_access(struct g_provider *pp, int r, int w, int e) +{ + return (0); +} + +static void +gxemul_disk_identify(driver_t *drv, device_t parent) +{ + unsigned diskid; + + mtx_init(&gxemul_disk_controller_mutex, "GXemul disk controller", NULL, MTX_DEF); + + mtx_lock(&gxemul_disk_controller_mutex); + for (diskid = 0; diskid < 0x100; diskid++) { + /* + * If we can read at offset 0, this disk id must be + * present enough. If we get an error, stop looking. + * Disks in GXemul are allocated linearly from 0. + */ + if (gxemul_disk_read(diskid, NULL, 0) != 0) + break; + BUS_ADD_CHILD(parent, 0, "gxemul_disk", diskid); + } + mtx_unlock(&gxemul_disk_controller_mutex); +} + +static int +gxemul_disk_probe(device_t dev) +{ + device_set_desc(dev, "GXemul test disk"); + + return (0); +} + +static void +gxemul_disk_attach_geom(void *arg, int flag) +{ + struct gxemul_disk_softc *sc; + + sc = arg; + + sc->sc_geom = g_new_geomf(&g_gxemul_disk_class, "%s", device_get_nameunit(sc->sc_dev)); + sc->sc_geom->softc = sc; + + sc->sc_provider = g_new_providerf(sc->sc_geom, sc->sc_geom->name); + sc->sc_provider->sectorsize = GXEMUL_DISK_DEV_BLOCKSIZE; + sc->sc_provider->mediasize = sc->sc_size; + g_error_provider(sc->sc_provider, 0); +} + +static int +gxemul_disk_attach(device_t dev) +{ + struct gxemul_disk_softc *sc; + unsigned diskid; + int error; + + diskid = device_get_unit(dev); + + sc = device_get_softc(dev); + sc->sc_dev = dev; + sc->sc_geom = NULL; + sc->sc_provider = NULL; + + mtx_lock(&gxemul_disk_controller_mutex); + error = gxemul_disk_size(diskid, &sc->sc_size); + if (error != 0) { + mtx_unlock(&gxemul_disk_controller_mutex); + return (error); + } + mtx_unlock(&gxemul_disk_controller_mutex); + + g_post_event(gxemul_disk_attach_geom, sc, M_WAITOK, NULL); + + return (0); +} + +static int +gxemul_disk_read(unsigned diskid, void *buf, off_t off) +{ + const volatile void *src; + + mtx_assert(&gxemul_disk_controller_mutex, MA_OWNED); + + if (off < 0 || off % GXEMUL_DISK_DEV_BLOCKSIZE != 0) + return (EINVAL); + + GXEMUL_DISK_DEV_WRITE(GXEMUL_DISK_DEV_OFFSET, (uint64_t)off); + GXEMUL_DISK_DEV_WRITE(GXEMUL_DISK_DEV_DISKID, diskid); + GXEMUL_DISK_DEV_WRITE(GXEMUL_DISK_DEV_START, GXEMUL_DISK_DEV_START_READ); + switch (GXEMUL_DISK_DEV_READ(GXEMUL_DISK_DEV_STATUS)) { + case GXEMUL_DISK_DEV_STATUS_FAILURE: + return (EIO); + default: + break; + } + + if (buf != NULL) { + src = GXEMUL_DISK_DEV_FUNCTION(GXEMUL_DISK_DEV_BLOCK); + memcpy(buf, (const void *)(uintptr_t)src, + GXEMUL_DISK_DEV_BLOCKSIZE); + } + + return (0); +} + +static int +gxemul_disk_size(unsigned diskid, uint64_t *sizep) +{ + uint64_t offset, ogood; + uint64_t m, s; + int error; + + m = 1; + s = 3; + ogood = 0; + + for (;;) { + offset = (ogood * s) + (m * GXEMUL_DISK_DEV_BLOCKSIZE); + + error = gxemul_disk_read(diskid, NULL, offset); + if (error != 0) { + if (m == 1 && s == 1) { + *sizep = ogood + GXEMUL_DISK_DEV_BLOCKSIZE; + return (0); + } + if (m > 1) + m /= 2; + if (s > 1) + s--; + continue; + } + if (ogood == offset) { + m = 1; + continue; + } + ogood = offset; + m++; + } + + return (EDOOFUS); +} + +static int +gxemul_disk_write(unsigned diskid, const void *buf, off_t off) +{ + volatile void *dst; + + mtx_assert(&gxemul_disk_controller_mutex, MA_OWNED); + + if (off < 0 || off % GXEMUL_DISK_DEV_BLOCKSIZE != 0) + return (EINVAL); + + GXEMUL_DISK_DEV_WRITE(GXEMUL_DISK_DEV_OFFSET, (uint64_t)off); + GXEMUL_DISK_DEV_WRITE(GXEMUL_DISK_DEV_DISKID, diskid); + + dst = GXEMUL_DISK_DEV_FUNCTION(GXEMUL_DISK_DEV_BLOCK); + memcpy((void *)(uintptr_t)dst, buf, GXEMUL_DISK_DEV_BLOCKSIZE); + + GXEMUL_DISK_DEV_WRITE(GXEMUL_DISK_DEV_START, GXEMUL_DISK_DEV_START_READ); + switch (GXEMUL_DISK_DEV_READ(GXEMUL_DISK_DEV_STATUS)) { + case GXEMUL_DISK_DEV_STATUS_FAILURE: + return (EIO); + default: + break; + } + + return (0); +} + +static device_method_t gxemul_disk_methods[] = { + DEVMETHOD(device_probe, gxemul_disk_probe), + DEVMETHOD(device_identify, gxemul_disk_identify), + DEVMETHOD(device_attach, gxemul_disk_attach), + + { 0, 0 } +}; + +static driver_t gxemul_disk_driver = { + "gxemul_disk", + gxemul_disk_methods, + sizeof (struct gxemul_disk_softc) +}; + +static devclass_t gxemul_disk_devclass; +DRIVER_MODULE(gxemul_disk, nexus, gxemul_disk_driver, gxemul_disk_devclass, 0, 0); diff --git a/sys/dev/gxemul/disk/gxemul_diskreg.h b/sys/dev/gxemul/disk/gxemul_diskreg.h new file mode 100644 index 00000000000..c3460e55299 --- /dev/null +++ b/sys/dev/gxemul/disk/gxemul_diskreg.h @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 2008-2012 Juli Mallett + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _DEV_GXEMUL_DISK_GXEMUL_DISK_H_ +#define _DEV_GXEMUL_DISK_GXEMUL_DISK_H_ + +#define GXEMUL_DISK_DEV_BASE (0x13000000) + +#define GXEMUL_DISK_DEV_BLOCKSIZE (0x0200) + +#define GXEMUL_DISK_DEV_ID_START (0x0000) +#define GXEMUL_DISK_DEV_ID_END (0x0100) + +#define GXEMUL_DISK_DEV_OFFSET (0x0000) +#define GXEMUL_DISK_DEV_DISKID (0x0010) +#define GXEMUL_DISK_DEV_START (0x0020) +#define GXEMUL_DISK_DEV_STATUS (0x0030) +#define GXEMUL_DISK_DEV_BLOCK (0x4000) + +#define GXEMUL_DISK_DEV_FUNCTION(f) \ + (volatile uint64_t *)MIPS_PHYS_TO_DIRECT_UNCACHED(GXEMUL_DISK_DEV_BASE + (f)) +#define GXEMUL_DISK_DEV_READ(f) \ + (volatile uint64_t)*GXEMUL_DISK_DEV_FUNCTION(f) +#define GXEMUL_DISK_DEV_WRITE(f, v) \ + *GXEMUL_DISK_DEV_FUNCTION(f) = (v) + +#define GXEMUL_DISK_DEV_START_READ (0x00) +#define GXEMUL_DISK_DEV_START_WRITE (0x01) + +#define GXEMUL_DISK_DEV_STATUS_FAILURE (0x00) + +#endif /* !_DEV_GXEMUL_DISK_GXEMUL_DISK_H_ */ diff --git a/sys/dev/gxemul/ether/gxreg.h b/sys/dev/gxemul/ether/gxreg.h new file mode 100644 index 00000000000..e67f43d0ce8 --- /dev/null +++ b/sys/dev/gxemul/ether/gxreg.h @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 2008-2012 Juli Mallett + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _DEV_GXEMUL_ETHER_GXREG_H_ +#define _DEV_GXEMUL_ETHER_GXREG_H_ + +#define GXEMUL_ETHER_DEV_BASE (0x14000000) +#define GXEMUL_ETHER_DEV_IRQ (3) + +#define GXEMUL_ETHER_DEV_MTU (0x4000) + +#define GXEMUL_ETHER_DEV_BUFFER (0x0000) +#define GXEMUL_ETHER_DEV_STATUS (0x4000) +#define GXEMUL_ETHER_DEV_LENGTH (0x4010) +#define GXEMUL_ETHER_DEV_COMMAND (0x4020) +#define GXEMUL_ETHER_DEV_MAC (0x4040) + +#define GXEMUL_ETHER_DEV_FUNCTION(f) \ + (volatile uint64_t *)MIPS_PHYS_TO_DIRECT_UNCACHED(GXEMUL_ETHER_DEV_BASE + (f)) +#define GXEMUL_ETHER_DEV_READ(f) \ + (volatile uint64_t)*GXEMUL_ETHER_DEV_FUNCTION(f) +#define GXEMUL_ETHER_DEV_WRITE(f, v) \ + *GXEMUL_ETHER_DEV_FUNCTION(f) = (v) + +#define GXEMUL_ETHER_DEV_STATUS_RX_OK (0x01) +#define GXEMUL_ETHER_DEV_STATUS_RX_MORE (0x02) + +#define GXEMUL_ETHER_DEV_COMMAND_RX (0x00) +#define GXEMUL_ETHER_DEV_COMMAND_TX (0x01) + +#endif /* !_DEV_GXEMUL_ETHER_GXREG_H_ */ diff --git a/sys/dev/gxemul/ether/if_gx.c b/sys/dev/gxemul/ether/if_gx.c new file mode 100644 index 00000000000..b98cc7ce3c0 --- /dev/null +++ b/sys/dev/gxemul/ether/if_gx.c @@ -0,0 +1,398 @@ +/*- + * Copyright (c) 2008-2012 Juli Mallett + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include "opt_inet.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef INET +#include +#include +#endif + +#include + +#include + +struct gx_softc { + struct ifnet *sc_ifp; + device_t sc_dev; + unsigned sc_port; + int sc_flags; + struct ifmedia sc_ifmedia; + struct resource *sc_intr; + void *sc_intr_cookie; + struct mtx sc_mtx; +}; + +#define GXEMUL_ETHER_LOCK(sc) mtx_lock(&(sc)->sc_mtx) +#define GXEMUL_ETHER_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) + +static void gx_identify(driver_t *, device_t); +static int gx_probe(device_t); +static int gx_attach(device_t); +static int gx_detach(device_t); +static int gx_shutdown(device_t); + +static void gx_init(void *); +static int gx_transmit(struct ifnet *, struct mbuf *); + +static int gx_medchange(struct ifnet *); +static void gx_medstat(struct ifnet *, struct ifmediareq *); + +static int gx_ioctl(struct ifnet *, u_long, caddr_t); + +static void gx_rx_intr(void *); + +static device_method_t gx_methods[] = { + /* Device interface */ + DEVMETHOD(device_identify, gx_identify), + DEVMETHOD(device_probe, gx_probe), + DEVMETHOD(device_attach, gx_attach), + DEVMETHOD(device_detach, gx_detach), + DEVMETHOD(device_shutdown, gx_shutdown), + + { 0, 0 } +}; + +static driver_t gx_driver = { + "gx", + gx_methods, + sizeof (struct gx_softc), +}; + +static devclass_t gx_devclass; + +DRIVER_MODULE(gx, nexus, gx_driver, gx_devclass, 0, 0); + +static void +gx_identify(driver_t *drv, device_t parent) +{ + BUS_ADD_CHILD(parent, 0, "gx", 0); +} + +static int +gx_probe(device_t dev) +{ + if (device_get_unit(dev) != 0) + return (ENXIO); + + device_set_desc(dev, "GXemul test Ethernet"); + + return (0); +} + +static int +gx_attach(device_t dev) +{ + struct ifnet *ifp; + struct gx_softc *sc; + uint8_t mac[6]; + int error; + int rid; + + sc = device_get_softc(dev); + sc->sc_dev = dev; + sc->sc_port = device_get_unit(dev); + + /* Read MAC address. */ + GXEMUL_ETHER_DEV_WRITE(GXEMUL_ETHER_DEV_MAC, (uintptr_t)mac); + + /* Allocate and establish interrupt. */ + rid = 0; + sc->sc_intr = bus_alloc_resource(sc->sc_dev, SYS_RES_IRQ, &rid, + GXEMUL_ETHER_DEV_IRQ - 2, GXEMUL_ETHER_DEV_IRQ - 2, 1, RF_ACTIVE); + if (sc->sc_intr == NULL) { + device_printf(dev, "unable to allocate IRQ.\n"); + return (ENXIO); + } + + error = bus_setup_intr(sc->sc_dev, sc->sc_intr, INTR_TYPE_NET, NULL, + gx_rx_intr, sc, &sc->sc_intr_cookie); + if (error != 0) { + device_printf(dev, "unable to setup interrupt.\n"); + bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_intr); + return (ENXIO); + } + + bus_describe_intr(sc->sc_dev, sc->sc_intr, sc->sc_intr_cookie, "rx"); + + ifp = if_alloc(IFT_ETHER); + if (ifp == NULL) { + device_printf(dev, "cannot allocate ifnet.\n"); + bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_intr); + return (ENOMEM); + } + + if_initname(ifp, device_get_name(dev), device_get_unit(dev)); + ifp->if_mtu = ETHERMTU; + ifp->if_init = gx_init; + ifp->if_softc = sc; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | IFF_ALLMULTI; + ifp->if_ioctl = gx_ioctl; + + sc->sc_ifp = ifp; + sc->sc_flags = ifp->if_flags; + + ifmedia_init(&sc->sc_ifmedia, 0, gx_medchange, gx_medstat); + + ifmedia_add(&sc->sc_ifmedia, IFM_ETHER | IFM_AUTO, 0, NULL); + ifmedia_set(&sc->sc_ifmedia, IFM_ETHER | IFM_AUTO); + + mtx_init(&sc->sc_mtx, "GXemul Ethernet", NULL, MTX_DEF); + + ether_ifattach(ifp, mac); + + ifp->if_transmit = gx_transmit; + + return (bus_generic_attach(dev)); +} + +static int +gx_detach(device_t dev) +{ + struct gx_softc *sc; + + sc = device_get_softc(dev); + + bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_intr); + /* XXX Incomplete. */ + + return (0); +} + +static int +gx_shutdown(device_t dev) +{ + return (gx_detach(dev)); +} + +static void +gx_init(void *arg) +{ + struct ifnet *ifp; + struct gx_softc *sc; + + sc = arg; + ifp = sc->sc_ifp; + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + + ifp->if_drv_flags |= IFF_DRV_RUNNING; +} + +static int +gx_transmit(struct ifnet *ifp, struct mbuf *m) +{ + struct gx_softc *sc; + + sc = ifp->if_softc; + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != IFF_DRV_RUNNING) { + m_freem(m); + return (0); + } + + GXEMUL_ETHER_LOCK(sc); + GXEMUL_ETHER_DEV_WRITE(GXEMUL_ETHER_DEV_LENGTH, m->m_pkthdr.len); + m_copydata(m, 0, m->m_pkthdr.len, (void *)(uintptr_t)GXEMUL_ETHER_DEV_FUNCTION(GXEMUL_ETHER_DEV_BUFFER)); + GXEMUL_ETHER_DEV_WRITE(GXEMUL_ETHER_DEV_COMMAND, GXEMUL_ETHER_DEV_COMMAND_TX); + GXEMUL_ETHER_UNLOCK(sc); + + ETHER_BPF_MTAP(ifp, m); + + ifp->if_opackets++; + ifp->if_obytes += m->m_pkthdr.len; + + m_freem(m); + + return (0); +} + +static int +gx_medchange(struct ifnet *ifp) +{ + return (ENOTSUP); +} + +static void +gx_medstat(struct ifnet *ifp, struct ifmediareq *ifm) +{ + struct gx_softc *sc; + + sc = ifp->if_softc; + + /* Lie amazingly. */ + ifm->ifm_status = IFM_AVALID | IFM_ACTIVE; + ifm->ifm_active = IFT_ETHER | IFM_1000_T | IFM_FDX; +} + +static int +gx_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) +{ + struct gx_softc *sc; + struct ifreq *ifr; +#ifdef INET + struct ifaddr *ifa; +#endif + int error; + + sc = ifp->if_softc; + ifr = (struct ifreq *)data; +#ifdef INET + ifa = (struct ifaddr *)data; +#endif + + switch (cmd) { + case SIOCSIFADDR: +#ifdef INET + /* + * Avoid reinitialization unless it's necessary. + */ + if (ifa->ifa_addr->sa_family == AF_INET) { + ifp->if_flags |= IFF_UP; + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + gx_init(sc); + arp_ifinit(ifp, ifa); + + return (0); + } +#endif + error = ether_ioctl(ifp, cmd, data); + if (error != 0) + return (error); + return (0); + + case SIOCSIFFLAGS: + if (ifp->if_flags == sc->sc_flags) + return (0); + if ((ifp->if_flags & IFF_UP) != 0) { + gx_init(sc); + } else { + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + } + } + sc->sc_flags = ifp->if_flags; + return (0); + + case SIOCSIFMTU: + if (ifr->ifr_mtu + ifp->if_data.ifi_hdrlen > GXEMUL_ETHER_DEV_MTU) + return (ENOTSUP); + return (0); + + case SIOCSIFMEDIA: + case SIOCGIFMEDIA: + error = ifmedia_ioctl(ifp, ifr, &sc->sc_ifmedia, cmd); + if (error != 0) + return (error); + return (0); + + default: + error = ether_ioctl(ifp, cmd, data); + if (error != 0) + return (error); + return (0); + } +} + +static void +gx_rx_intr(void *arg) +{ + struct gx_softc *sc = arg; + + GXEMUL_ETHER_LOCK(sc); + for (;;) { + uint64_t status, length; + struct mbuf *m; + + /* + * XXX + * Limit number of packets received at once? + */ + status = GXEMUL_ETHER_DEV_READ(GXEMUL_ETHER_DEV_STATUS); + if (status == GXEMUL_ETHER_DEV_STATUS_RX_MORE) { + GXEMUL_ETHER_DEV_WRITE(GXEMUL_ETHER_DEV_COMMAND, GXEMUL_ETHER_DEV_COMMAND_RX); + continue; + } + if (status != GXEMUL_ETHER_DEV_STATUS_RX_OK) + break; + length = GXEMUL_ETHER_DEV_READ(GXEMUL_ETHER_DEV_LENGTH); + if (length > MCLBYTES - ETHER_ALIGN) { + sc->sc_ifp->if_ierrors++; + continue; + } + + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (m == NULL) { + device_printf(sc->sc_dev, "no memory for receive mbuf.\n"); + sc->sc_ifp->if_iqdrops++; + GXEMUL_ETHER_UNLOCK(sc); + return; + } + + /* Align incoming frame so IP headers are aligned. */ + m->m_data += ETHER_ALIGN; + + memcpy(m->m_data, (const void *)(uintptr_t)GXEMUL_ETHER_DEV_FUNCTION(GXEMUL_ETHER_DEV_BUFFER), length); + + m->m_pkthdr.rcvif = sc->sc_ifp; + m->m_pkthdr.len = m->m_len = length; + + sc->sc_ifp->if_ipackets++; + + GXEMUL_ETHER_UNLOCK(sc); + + (*sc->sc_ifp->if_input)(sc->sc_ifp, m); + + GXEMUL_ETHER_LOCK(sc); + } + GXEMUL_ETHER_UNLOCK(sc); +} diff --git a/sys/dev/hptiop/hptiop.c b/sys/dev/hptiop/hptiop.c index 188ab809757..5427eca52a2 100644 --- a/sys/dev/hptiop/hptiop.c +++ b/sys/dev/hptiop/hptiop.c @@ -1268,6 +1268,7 @@ static driver_t hptiop_pci_driver = { }; DRIVER_MODULE(hptiop, pci, hptiop_pci_driver, hptiop_devclass, 0, 0); +MODULE_DEPEND(hptiop, cam, 1, 1, 1); static int hptiop_probe(device_t dev) { diff --git a/sys/dev/hptmv/entry.c b/sys/dev/hptmv/entry.c index f525b1f98fe..7e92d4a001b 100644 --- a/sys/dev/hptmv/entry.c +++ b/sys/dev/hptmv/entry.c @@ -108,6 +108,7 @@ static devclass_t hpt_devclass; #define __DRIVER_MODULE(p1, p2, p3, p4, p5, p6) DRIVER_MODULE(p1, p2, p3, p4, p5, p6) __DRIVER_MODULE(PROC_DIR_NAME, pci, hpt_pci_driver, hpt_devclass, 0, 0); +MODULE_DEPEND(PROC_DIR_NAME, cam, 1, 1, 1); #define ccb_ccb_ptr spriv_ptr0 #define ccb_adapter ccb_h.spriv_ptr1 diff --git a/sys/dev/hptrr/hptrr_osm_bsd.c b/sys/dev/hptrr/hptrr_osm_bsd.c index 1f6b19a38e7..cff4254dd53 100644 --- a/sys/dev/hptrr/hptrr_osm_bsd.c +++ b/sys/dev/hptrr/hptrr_osm_bsd.c @@ -36,7 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include -static int attach_generic = 1; +static int attach_generic = 0; TUNABLE_INT("hw.hptrr.attach_generic", &attach_generic); static int hpt_probe(device_t dev) diff --git a/sys/dev/hwpmc/hwpmc_arm.c b/sys/dev/hwpmc/hwpmc_arm.c index 86cfaf3cd93..c2c24c226b3 100644 --- a/sys/dev/hwpmc/hwpmc_arm.c +++ b/sys/dev/hwpmc/hwpmc_arm.c @@ -30,46 +30,135 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include -#include +#include #include +#include + +#include +#include +#include struct pmc_mdep * pmc_md_initialize() { +#ifdef CPU_XSCALE_IXP425 if (cpu_class == CPU_CLASS_XSCALE) return pmc_xscale_initialize(); else +#endif return NULL; } void pmc_md_finalize(struct pmc_mdep *md) { +#ifdef CPU_XSCALE_IXP425 if (cpu_class == CPU_CLASS_XSCALE) pmc_xscale_finalize(md); else KASSERT(0, ("[arm,%d] Unknown CPU Class 0x%x", __LINE__, cpu_class)); +#endif } int pmc_save_kernel_callchain(uintptr_t *cc, int maxsamples, struct trapframe *tf) { - (void) cc; - (void) maxsamples; - (void) tf; - return (0); + uintptr_t pc, r, stackstart, stackend, fp; + struct thread *td; + int count; + + KASSERT(TRAPF_USERMODE(tf) == 0,("[arm,%d] not a kernel backtrace", + __LINE__)); + + pc = PMC_TRAPFRAME_TO_PC(tf); + *cc++ = pc; + + if ((td = curthread) == NULL) + return (1); + + if (maxsamples <= 1) + return (1); + + stackstart = (uintptr_t) td->td_kstack; + stackend = (uintptr_t) td->td_kstack + td->td_kstack_pages * PAGE_SIZE; + fp = PMC_TRAPFRAME_TO_FP(tf); + + if (!PMC_IN_KERNEL(pc) || + !PMC_IN_KERNEL_STACK(fp, stackstart, stackend)) + return (1); + + for (count = 1; count < maxsamples; count++) { + /* Use saved lr as pc. */ + r = fp - sizeof(uintptr_t); + if (!PMC_IN_KERNEL_STACK(r, stackstart, stackend)) + break; + pc = *(uintptr_t *)r; + if (!PMC_IN_KERNEL(pc)) + break; + + *cc++ = pc; + + /* Switch to next frame up */ + r = fp - 3 * sizeof(uintptr_t); + if (!PMC_IN_KERNEL_STACK(r, stackstart, stackend)) + break; + fp = *(uintptr_t *)r; + if (!PMC_IN_KERNEL_STACK(fp, stackstart, stackend)) + break; + } + + return (count); } int pmc_save_user_callchain(uintptr_t *cc, int maxsamples, struct trapframe *tf) { - (void) cc; - (void) maxsamples; - (void) tf; - return (0); + uintptr_t pc, r, oldfp, fp; + struct thread *td; + int count; + + KASSERT(TRAPF_USERMODE(tf), ("[x86,%d] Not a user trap frame tf=%p", + __LINE__, (void *) tf)); + + pc = PMC_TRAPFRAME_TO_PC(tf); + *cc++ = pc; + + if ((td = curthread) == NULL) + return (1); + + if (maxsamples <= 1) + return (1); + + oldfp = fp = PMC_TRAPFRAME_TO_FP(tf); + + if (!PMC_IN_USERSPACE(pc) || + !PMC_IN_USERSPACE(fp)) + return (1); + + for (count = 1; count < maxsamples; count++) { + /* Use saved lr as pc. */ + r = fp - sizeof(uintptr_t); + if (copyin((void *)r, &pc, sizeof(pc)) != 0) + break; + if (!PMC_IN_USERSPACE(pc)) + break; + + *cc++ = pc; + + /* Switch to next frame up */ + oldfp = fp; + r = fp - 3 * sizeof(uintptr_t); + if (copyin((void *)r, &fp, sizeof(fp)) != 0) + break; + if (fp < oldfp || !PMC_IN_USERSPACE(fp)) + break; + } + + return (count); } diff --git a/sys/dev/hwpmc/hwpmc_core.c b/sys/dev/hwpmc/hwpmc_core.c index 6209c6f09da..11245e0e9a8 100644 --- a/sys/dev/hwpmc/hwpmc_core.c +++ b/sys/dev/hwpmc/hwpmc_core.c @@ -52,7 +52,8 @@ __FBSDID("$FreeBSD$"); #define CORE_CPUID_EDX 0x3 #define IAF_PMC_CAPS \ - (PMC_CAP_READ | PMC_CAP_WRITE | PMC_CAP_INTERRUPT) + (PMC_CAP_READ | PMC_CAP_WRITE | PMC_CAP_INTERRUPT | \ + PMC_CAP_USER | PMC_CAP_SYSTEM) #define IAF_RI_TO_MSR(RI) ((RI) + (1 << 30)) #define IAP_PMC_CAPS (PMC_CAP_INTERRUPT | PMC_CAP_USER | PMC_CAP_SYSTEM | \ diff --git a/sys/dev/hwpmc/hwpmc_intel.c b/sys/dev/hwpmc/hwpmc_intel.c index f7adb6c69c3..c21f5d9a369 100644 --- a/sys/dev/hwpmc/hwpmc_intel.c +++ b/sys/dev/hwpmc/hwpmc_intel.c @@ -143,7 +143,6 @@ pmc_intel_initialize(void) nclasses = 5; break; case 0x2A: /* Per Intel document 253669-039US 05/2011. */ - case 0x2D: /* Per Intel document 253669-041US 12/2011. */ cputype = PMC_CPU_INTEL_SANDYBRIDGE; nclasses = 5; break; @@ -196,10 +195,6 @@ pmc_intel_initialize(void) case PMC_CPU_INTEL_PIV: error = pmc_p4_initialize(pmc_mdep, ncpus); - - KASSERT(pmc_mdep->pmd_npmc == TSC_NPMCS + P4_NPMCS, - ("[intel,%d] incorrect npmc count %d", __LINE__, - pmc_mdep->pmd_npmc)); break; #endif @@ -214,10 +209,6 @@ pmc_intel_initialize(void) case PMC_CPU_INTEL_PIII: case PMC_CPU_INTEL_PM: error = pmc_p6_initialize(pmc_mdep, ncpus); - - KASSERT(pmc_mdep->pmd_npmc == TSC_NPMCS + P6_NPMCS, - ("[intel,%d] incorrect npmc count %d", __LINE__, - pmc_mdep->pmd_npmc)); break; /* @@ -226,10 +217,6 @@ pmc_intel_initialize(void) case PMC_CPU_INTEL_P5: error = pmc_p5_initialize(pmc_mdep, ncpus); - - KASSERT(pmc_mdep->pmd_npmc == TSC_NPMCS + PENTIUM_NPMCS, - ("[intel,%d] incorrect npmc count %d", __LINE__, - pmc_mdep->pmd_npmc)); break; #endif diff --git a/sys/dev/iicbus/ds1374.c b/sys/dev/iicbus/ds1374.c index 2ee0c5775af..917e1b48b9a 100644 --- a/sys/dev/iicbus/ds1374.c +++ b/sys/dev/iicbus/ds1374.c @@ -39,12 +39,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include -#include -#include - #include #include diff --git a/sys/dev/isci/isci.h b/sys/dev/isci/isci.h index d6ad93cef06..cdba7de1806 100644 --- a/sys/dev/isci/isci.h +++ b/sys/dev/isci/isci.h @@ -30,6 +30,9 @@ * $FreeBSD$ */ +#ifndef _ISCI_H +#define _ISCI_H + #include #include #include @@ -86,7 +89,31 @@ struct ISCI_REMOTE_DEVICE { BOOL is_resetting; uint32_t frozen_lun_mask; SCI_FAST_LIST_ELEMENT_T pending_device_reset_element; + + /* + * This queue maintains CCBs that have been returned with + * SCI_IO_FAILURE_INVALID_STATE from the SCI layer. These CCBs + * need to be retried, but we cannot return CAM_REQUEUE_REQ because + * this status gets passed all the way back up to users of the pass(4) + * interface and breaks things like smartctl. So instead, we queue + * these CCBs internally. + */ TAILQ_HEAD(,ccb_hdr) queued_ccbs; + + /* + * Marker denoting this remote device needs its first queued ccb to + * be retried. + */ + BOOL release_queued_ccb; + + /* + * Points to a CCB in the queue that is currently being processed by + * SCIL. This allows us to keep in flight CCBs in the queue so as to + * maintain ordering (i.e. in case we retry an I/O and then find out + * it needs to be retried again - it just keeps its same place in the + * queue. + */ + union ccb * queued_ccb_in_progress; }; struct ISCI_DOMAIN { @@ -126,6 +153,7 @@ struct ISCI_CONTROLLER BOOL has_been_scanned; uint32_t initial_discovery_mask; BOOL is_frozen; + BOOL release_queued_ccbs; uint8_t *remote_device_memory; struct ISCI_MEMORY cached_controller_memory; struct ISCI_MEMORY uncached_controller_memory; @@ -291,6 +319,8 @@ int isci_controller_attach_to_cam(struct ISCI_CONTROLLER *controller); void isci_controller_start(void *controller); +void isci_controller_release_queued_ccbs(struct ISCI_CONTROLLER *controller); + void isci_domain_construct(struct ISCI_DOMAIN *domain, uint32_t domain_index, struct ISCI_CONTROLLER *controller); @@ -301,3 +331,5 @@ void isci_log_message(uint32_t verbosity, char *log_message_prefix, char *log_message, ...); extern uint32_t g_isci_debug_level; + +#endif /* #ifndef _ISCI_H */ diff --git a/sys/dev/isci/isci_controller.c b/sys/dev/isci/isci_controller.c index a4b7cfe9dae..49785cbfd15 100644 --- a/sys/dev/isci/isci_controller.c +++ b/sys/dev/isci/isci_controller.c @@ -201,6 +201,7 @@ void isci_controller_construct(struct ISCI_CONTROLLER *controller, controller->is_started = FALSE; controller->is_frozen = FALSE; + controller->release_queued_ccbs = FALSE; controller->sim = NULL; controller->initial_discovery_mask = 0; @@ -431,6 +432,8 @@ int isci_controller_allocate_memory(struct ISCI_CONTROLLER *controller) sci_fast_list_element_init(remote_device, &remote_device->pending_device_reset_element); TAILQ_INIT(&remote_device->queued_ccbs); + remote_device->release_queued_ccb = FALSE; + remote_device->queued_ccb_in_progress = NULL; /* * For the first SCI_MAX_DOMAINS device objects, do not put @@ -694,3 +697,47 @@ void isci_action(struct cam_sim *sim, union ccb *ccb) } } +/* + * Unfortunately, SCIL doesn't cleanly handle retry conditions. + * CAM_REQUEUE_REQ works only when no one is using the pass(4) interface. So + * when SCIL denotes an I/O needs to be retried (typically because of mixing + * tagged/non-tagged ATA commands, or running out of NCQ slots), we queue + * these I/O internally. Once SCIL completes an I/O to this device, or we get + * a ready notification, we will retry the first I/O on the queue. + * Unfortunately, SCIL also doesn't cleanly handle starting the new I/O within + * the context of the completion handler, so we need to retry these I/O after + * the completion handler is done executing. + */ +void +isci_controller_release_queued_ccbs(struct ISCI_CONTROLLER *controller) +{ + struct ISCI_REMOTE_DEVICE *dev; + struct ccb_hdr *ccb_h; + int dev_idx; + + KASSERT(mtx_owned(&controller->lock), ("controller lock not owned")); + + controller->release_queued_ccbs = FALSE; + for (dev_idx = 0; + dev_idx < SCI_MAX_REMOTE_DEVICES; + dev_idx++) { + + dev = controller->remote_device[dev_idx]; + if (dev != NULL && + dev->release_queued_ccb == TRUE && + dev->queued_ccb_in_progress == NULL) { + dev->release_queued_ccb = FALSE; + ccb_h = TAILQ_FIRST(&dev->queued_ccbs); + + if (ccb_h == NULL) + continue; + + isci_log_message(1, "ISCI", "release %p %x\n", ccb_h, + ((union ccb *)ccb_h)->csio.cdb_io.cdb_bytes[0]); + + dev->queued_ccb_in_progress = (union ccb *)ccb_h; + isci_io_request_execute_scsi_io( + (union ccb *)ccb_h, controller); + } + } +} diff --git a/sys/dev/isci/isci_interrupt.c b/sys/dev/isci/isci_interrupt.c index e020f831810..52c64f7c92e 100644 --- a/sys/dev/isci/isci_interrupt.c +++ b/sys/dev/isci/isci_interrupt.c @@ -177,6 +177,9 @@ isci_interrupt_legacy_handler(void *arg) if (interrupt_handler(scic_controller_handle)) { mtx_lock(&controller->lock); completion_handler(scic_controller_handle); + if (controller->release_queued_ccbs == TRUE) + isci_controller_release_queued_ccbs( + controller); mtx_unlock(&controller->lock); } } @@ -204,6 +207,13 @@ isci_interrupt_msix_handler(void *arg) if (interrupt_handler(scic_controller_handle)) { mtx_lock(&controller->lock); completion_handler(scic_controller_handle); + /* + * isci_controller_release_queued_ccb() is a relatively + * expensive routine, so we don't call it until the controller + * level flag is set to TRUE. + */ + if (controller->release_queued_ccbs == TRUE) + isci_controller_release_queued_ccbs(controller); mtx_unlock(&controller->lock); } } diff --git a/sys/dev/isci/isci_io_request.c b/sys/dev/isci/isci_io_request.c index 985a2e4b67a..67ed1da6206 100644 --- a/sys/dev/isci/isci_io_request.c +++ b/sys/dev/isci/isci_io_request.c @@ -223,7 +223,7 @@ isci_io_request_complete(SCI_CONTROLLER_HANDLE_T scif_controller, (struct ISCI_REQUEST *)isci_request); if (complete_ccb) { - if (ccb->ccb_h.status != CAM_REQ_CMP) { + if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { /* ccb will be completed with some type of non-success * status. So temporarily freeze the queue until the * upper layers can act on the status. The @@ -234,6 +234,26 @@ isci_io_request_complete(SCI_CONTROLLER_HANDLE_T scif_controller, xpt_freeze_devq(ccb->ccb_h.path, 1); } + if (ccb->ccb_h.status & CAM_SIM_QUEUED) { + + KASSERT(ccb == isci_remote_device->queued_ccb_in_progress, + ("multiple internally queued ccbs in flight")); + + TAILQ_REMOVE(&isci_remote_device->queued_ccbs, + &ccb->ccb_h, sim_links.tqe); + ccb->ccb_h.status &= ~CAM_SIM_QUEUED; + + /* + * This CCB that was in the queue was completed, so + * set the in_progress pointer to NULL denoting that + * we can retry another CCB from the queue. We only + * allow one CCB at a time from the queue to be + * in progress so that we can effectively maintain + * ordering. + */ + isci_remote_device->queued_ccb_in_progress = NULL; + } + if (isci_remote_device->frozen_lun_mask != 0) { isci_remote_device_release_device_queue(isci_remote_device); } @@ -248,11 +268,30 @@ isci_io_request_complete(SCI_CONTROLLER_HANDLE_T scif_controller, isci_remote_device_freeze_lun_queue(isci_remote_device, ccb->ccb_h.target_lun); - isci_log_message(1, "ISCI", "queue %p %x\n", ccb, - ccb->csio.cdb_io.cdb_bytes[0]); - ccb->ccb_h.status |= CAM_SIM_QUEUED; - TAILQ_INSERT_TAIL(&isci_remote_device->queued_ccbs, - &ccb->ccb_h, sim_links.tqe); + if (ccb->ccb_h.status & CAM_SIM_QUEUED) { + + KASSERT(ccb == isci_remote_device->queued_ccb_in_progress, + ("multiple internally queued ccbs in flight")); + + /* + * Do nothing, CCB is already on the device's queue. + * We leave it on the queue, to be retried again + * next time a CCB on this device completes, or we + * get a ready notification for this device. + */ + isci_log_message(1, "ISCI", "already queued %p %x\n", + ccb, ccb->csio.cdb_io.cdb_bytes[0]); + + isci_remote_device->queued_ccb_in_progress = NULL; + + } else { + isci_log_message(1, "ISCI", "queue %p %x\n", ccb, + ccb->csio.cdb_io.cdb_bytes[0]); + ccb->ccb_h.status |= CAM_SIM_QUEUED; + + TAILQ_INSERT_TAIL(&isci_remote_device->queued_ccbs, + &ccb->ccb_h, sim_links.tqe); + } } } diff --git a/sys/dev/isci/isci_remote_device.c b/sys/dev/isci/isci_remote_device.c index c9434f86326..31fcbfb75cb 100644 --- a/sys/dev/isci/isci_remote_device.c +++ b/sys/dev/isci/isci_remote_device.c @@ -297,14 +297,18 @@ isci_remote_device_release_device_queue( for (lun = 0; lun < ISCI_MAX_LUN; lun++) isci_remote_device_release_lun_queue(device, lun); } else { - struct ccb_hdr *ccb_h; + /* + * We cannot unfreeze the devq, because there are still + * CCBs in our internal queue that need to be processed + * first. Mark this device, and the controller, so that + * the first CCB in this device's internal queue will be + * resubmitted after the current completion context + * unwinds. + */ + device->release_queued_ccb = TRUE; + device->domain->controller->release_queued_ccbs = TRUE; - ccb_h = TAILQ_FIRST(&device->queued_ccbs); - TAILQ_REMOVE(&device->queued_ccbs, ccb_h, sim_links.tqe); - ccb_h->status &= ~CAM_SIM_QUEUED; - isci_log_message(1, "ISCI", "release %p %x\n", ccb_h, - ((union ccb*)ccb_h)->csio.cdb_io.cdb_bytes[0]); - isci_io_request_execute_scsi_io((union ccb *)ccb_h, - device->domain->controller); + isci_log_message(1, "ISCI", "schedule %p for release\n", + device); } } diff --git a/sys/dev/isci/scil/sati_inquiry.c b/sys/dev/isci/scil/sati_inquiry.c index 8da6325e3c5..cbf096ec544 100644 --- a/sys/dev/isci/scil/sati_inquiry.c +++ b/sys/dev/isci/scil/sati_inquiry.c @@ -359,7 +359,7 @@ void sati_inquiry_block_device_translate_data( ); //bytes 8-63 are reserved - for(offset = 8; offset < 63; offset++) + for(offset = 8; offset < 64; offset++) { sati_set_data_byte(sequence, scsi_io, offset, 0x00); } diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c index 00a04b67650..a2853a2a46d 100644 --- a/sys/dev/isp/isp.c +++ b/sys/dev/isp/isp.c @@ -159,6 +159,8 @@ void isp_reset(ispsoftc_t *isp, int do_load_defaults) { mbreg_t mbs; + char *buf; + uint64_t fwt; uint32_t code_org, val; int loops, i, dodnld = 1; const char *btype = "????"; @@ -685,9 +687,7 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) * Do some sanity checking by running a NOP command. * If it succeeds, the ROM firmware is now running. */ - ISP_MEMZERO(&mbs, sizeof (mbs)); - mbs.param[0] = MBOX_NO_OP; - mbs.logval = MBLOGALL; + MBSINIT(&mbs, MBOX_NO_OP, MBLOGALL, 0); isp_mboxcmd(isp, &mbs); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { isp_prt(isp, ISP_LOGERR, "NOP command failed (%x)", mbs.param[0]); @@ -700,29 +700,35 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) */ if (IS_SCSI(isp) || IS_24XX(isp)) { - ISP_MEMZERO(&mbs, sizeof (mbs)); - mbs.param[0] = MBOX_MAILBOX_REG_TEST; - mbs.param[1] = 0xdead; - mbs.param[2] = 0xbeef; - mbs.param[3] = 0xffff; - mbs.param[4] = 0x1111; - mbs.param[5] = 0xa5a5; - mbs.param[6] = 0x0000; - mbs.param[7] = 0x0000; - mbs.logval = MBLOGALL; + static const uint16_t patterns[MAX_MAILBOX] = { + 0x0000, 0xdead, 0xbeef, 0xffff, + 0xa5a5, 0x5a5a, 0x7f7f, 0x7ff7, + 0x3421, 0xabcd, 0xdcba, 0xfeef, + 0xbead, 0xdebe, 0x2222, 0x3333, + 0x5555, 0x6666, 0x7777, 0xaaaa, + 0xffff, 0xdddd, 0x9999, 0x1fbc, + 0x6666, 0x6677, 0x1122, 0x33ff, + 0x0000, 0x0001, 0x1000, 0x1010, + }; + int nmbox = ISP_NMBOX(isp); + if (IS_SCSI(isp)) + nmbox = 6; + MBSINIT(&mbs, MBOX_MAILBOX_REG_TEST, MBLOGALL, 0); + for (i = 1; i < nmbox; i++) { + mbs.param[i] = patterns[i]; + } isp_mboxcmd(isp, &mbs); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { ISP_RESET0(isp); return; } - if (mbs.param[1] != 0xdead || mbs.param[2] != 0xbeef || - mbs.param[3] != 0xffff || mbs.param[4] != 0x1111 || - mbs.param[5] != 0xa5a5) { - ISP_RESET0(isp); - isp_prt(isp, ISP_LOGERR, "Register Test Failed (0x%x 0x%x 0x%x 0x%x 0x%x)", mbs.param[1], mbs.param[2], mbs.param[3], mbs.param[4], mbs.param[5]); - return; + for (i = 1; i < nmbox; i++) { + if (mbs.param[i] != patterns[i]) { + ISP_RESET0(isp); + isp_prt(isp, ISP_LOGERR, "Register Test Failed at Register %d: should have 0x%04x but got 0x%04x", i, patterns[i], mbs.param[i]); + return; + } } - } /* @@ -780,7 +786,7 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) } MEMORYBARRIER(isp, SYNC_REQUEST, 0, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)), -1); again: - ISP_MEMZERO(&mbs, sizeof (mbs)); + MBSINIT(&mbs, 0, MBLOGALL, 0); if (la < 0x10000 && nw < 0x10000) { mbs.param[0] = MBOX_LOAD_RISC_RAM_2100; mbs.param[1] = la; @@ -818,7 +824,6 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) mbs.param[8] = la >> 16; isp_prt(isp, ISP_LOGDEBUG0, "LOAD RISC RAM %u words at load address 0x%x", nw, la); } - mbs.logval = MBLOGALL; isp_mboxcmd(isp, &mbs); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { if (mbs.param[0] == MBOX_HOST_INTERFACE_ERROR) { @@ -872,7 +877,7 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) wl--; } MEMORYBARRIER(isp, SYNC_REQUEST, 0, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)), -1); - ISP_MEMZERO(&mbs, sizeof (mbs)); + MBSINIT(&mbs, 0, MBLOGALL, 0); if (la < 0x10000) { mbs.param[0] = MBOX_LOAD_RISC_RAM_2100; mbs.param[1] = la; @@ -893,7 +898,6 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) mbs.param[8] = la >> 16; isp_prt(isp, ISP_LOGDEBUG1, "LOAD RISC RAM %u words at load address 0x%x\n", nw, la); } - mbs.logval = MBLOGALL; isp_mboxcmd(isp, &mbs); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { isp_prt(isp, ISP_LOGERR, "F/W Risc Ram Load Failed"); @@ -933,11 +937,9 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) isp->isp_mbxworkp = &ucd.np[1]; isp->isp_mbxwrk0 = ucd.np[3] - 1; isp->isp_mbxwrk1 = code_org + 1; - ISP_MEMZERO(&mbs, sizeof (mbs)); - mbs.param[0] = MBOX_WRITE_RAM_WORD; + MBSINIT(&mbs, MBOX_WRITE_RAM_WORD, MBLOGNONE, 0); mbs.param[1] = code_org; mbs.param[2] = ucd.np[0]; - mbs.logval = MBLOGNONE; isp_prt(isp, ISP_LOGDEBUG1, "WRITE RAM %u words at load address 0x%x\n", ucd.np[3], code_org); isp_mboxcmd(isp, &mbs); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { @@ -954,7 +956,7 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) * If we loaded firmware, verify its checksum */ if (isp->isp_loaded_fw) { - ISP_MEMZERO(&mbs, sizeof (mbs)); + MBSINIT(&mbs, MBOX_VERIFY_CHECKSUM, MBLOGNONE, 0); mbs.param[0] = MBOX_VERIFY_CHECKSUM; if (IS_24XX(isp)) { mbs.param[1] = code_org >> 16; @@ -978,7 +980,7 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) */ - MBSINIT(&mbs, MBOX_EXEC_FIRMWARE, MBLOGALL, 1000000); + MBSINIT(&mbs, MBOX_EXEC_FIRMWARE, MBLOGALL, 5000000); if (IS_24XX(isp)) { mbs.param[1] = code_org >> 16; mbs.param[2] = code_org; @@ -1071,9 +1073,6 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) isp->isp_fwrev[2] = mbs.param[3]; } - isp_prt(isp, ISP_LOGCONFIG, "Board Type %s, Chip Revision 0x%x, %s F/W Revision %d.%d.%d", - btype, isp->isp_revision, dodnld? "loaded" : "resident", isp->isp_fwrev[0], isp->isp_fwrev[1], isp->isp_fwrev[2]); - if (IS_FC(isp)) { /* * We do not believe firmware attributes for 2100 code less @@ -1090,9 +1089,11 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) #endif } else { isp->isp_fwattr = mbs.param[6]; - isp_prt(isp, ISP_LOGDEBUG0, "Firmware Attributes = 0x%x", mbs.param[6]); } - } else { + if (IS_24XX(isp) && (isp->isp_fwattr & ISP2400_FW_ATTR_EXTNDED)) { + isp->isp_fwattr |= (((uint64_t) mbs.param[15]) << 16) | (((uint64_t) mbs.param[16]) << 32) | (((uint64_t) mbs.param[17]) << 48); + } + } else if (IS_SCSI(isp)) { #ifndef ISP_TARGET_MODE isp->isp_fwattr = ISP_FW_ATTR_TMODE; #else @@ -1100,7 +1101,108 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) #endif } - if (!IS_24XX(isp)) { + isp_prt(isp, ISP_LOGCONFIG, "Board Type %s, Chip Revision 0x%x, %s F/W Revision %d.%d.%d", + btype, isp->isp_revision, dodnld? "loaded" : "resident", isp->isp_fwrev[0], isp->isp_fwrev[1], isp->isp_fwrev[2]); + + fwt = isp->isp_fwattr; + if (IS_24XX(isp)) { + buf = FCPARAM(isp, 0)->isp_scratch; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN, "Attributes:"); + if (fwt & ISP2400_FW_ATTR_CLASS2) { + fwt ^=ISP2400_FW_ATTR_CLASS2; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s Class2", buf); + } + if (fwt & ISP2400_FW_ATTR_IP) { + fwt ^=ISP2400_FW_ATTR_IP; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s IP", buf); + } + if (fwt & ISP2400_FW_ATTR_MULTIID) { + fwt ^=ISP2400_FW_ATTR_MULTIID; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s MultiID", buf); + } + if (fwt & ISP2400_FW_ATTR_SB2) { + fwt ^=ISP2400_FW_ATTR_SB2; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s SB2", buf); + } + if (fwt & ISP2400_FW_ATTR_T10CRC) { + fwt ^=ISP2400_FW_ATTR_T10CRC; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s T10CRC", buf); + } + if (fwt & ISP2400_FW_ATTR_VI) { + fwt ^=ISP2400_FW_ATTR_VI; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VI", buf); + } + if (fwt & ISP2400_FW_ATTR_VP0) { + fwt ^= ISP2400_FW_ATTR_VP0; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VP0_Decoupling", buf); + } + if (fwt & ISP2400_FW_ATTR_EXPFW) { + fwt ^= ISP2400_FW_ATTR_EXPFW; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s (Experimental)", buf); + } + fwt &= ~ISP2400_FW_ATTR_EXTNDED; + if (fwt) { + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s (unknown 0x%08x%08x)", buf, + (uint32_t) (fwt >> 32), (uint32_t) fwt); + } + isp_prt(isp, ISP_LOGCONFIG, "%s", buf); + } else if (IS_FC(isp)) { + buf = FCPARAM(isp, 0)->isp_scratch; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN, "Attributes:"); + if (fwt & ISP_FW_ATTR_TMODE) { + fwt ^=ISP_FW_ATTR_TMODE; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s TargetMode", buf); + } + if (fwt & ISP_FW_ATTR_SCCLUN) { + fwt ^=ISP_FW_ATTR_SCCLUN; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s SCC-Lun", buf); + } + if (fwt & ISP_FW_ATTR_FABRIC) { + fwt ^=ISP_FW_ATTR_FABRIC; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s Fabric", buf); + } + if (fwt & ISP_FW_ATTR_CLASS2) { + fwt ^=ISP_FW_ATTR_CLASS2; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s Class2", buf); + } + if (fwt & ISP_FW_ATTR_FCTAPE) { + fwt ^=ISP_FW_ATTR_FCTAPE; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s FC-Tape", buf); + } + if (fwt & ISP_FW_ATTR_IP) { + fwt ^=ISP_FW_ATTR_IP; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s IP", buf); + } + if (fwt & ISP_FW_ATTR_VI) { + fwt ^=ISP_FW_ATTR_VI; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VI", buf); + } + if (fwt & ISP_FW_ATTR_VI_SOLARIS) { + fwt ^=ISP_FW_ATTR_VI_SOLARIS; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VI_SOLARIS", buf); + } + if (fwt & ISP_FW_ATTR_2KLOGINS) { + fwt ^=ISP_FW_ATTR_2KLOGINS; + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s 2K-Login", buf); + } + if (fwt != 0) { + ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s (unknown 0x%08x%08x)", buf, + (uint32_t) (fwt >> 32), (uint32_t) fwt); + } + isp_prt(isp, ISP_LOGCONFIG, "%s", buf); + } + + if (IS_24XX(isp)) { + MBSINIT(&mbs, MBOX_GET_RESOURCE_COUNT, MBLOGALL, 0); + isp_mboxcmd(isp, &mbs); + if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { + ISP_RESET0(isp); + return; + } + if (isp->isp_maxcmds >= mbs.param[3]) { + isp->isp_maxcmds = mbs.param[3]; + } + } else { MBSINIT(&mbs, MBOX_GET_FIRMWARE_STATUS, MBLOGALL, 0); isp_mboxcmd(isp, &mbs); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { @@ -1118,11 +1220,12 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) * Only make this check for non-SCSI cards (I'm not sure firmware attributes * work for them). */ - if (IS_FC(isp) && ISP_CAP_MULTI_ID(isp) == 0 && isp->isp_nchan > 1) { - isp_prt(isp, ISP_LOGWARN, "non-MULTIID f/w loaded, only can enable 1 of %d channels", isp->isp_nchan); - isp->isp_nchan = 1; + if (IS_FC(isp) && isp->isp_nchan > 1) { + if (!IS_24XX(isp) || (fwt & ISP2400_FW_ATTR_MULTIID) == 0) { + isp_prt(isp, ISP_LOGWARN, "non-MULTIID f/w loaded, only can enable 1 of %d channels", isp->isp_nchan); + isp->isp_nchan = 1; + } } - for (i = 0; i < isp->isp_nchan; i++) { isp_fw_state(isp, i); } @@ -1609,21 +1712,39 @@ isp_fibre_init(ispsoftc_t *isp) */ if (IS_2200(isp) || IS_23XX(isp)) { icbp->icb_fwoptions |= ICBOPT_EXTENDED; + + icbp->icb_xfwoptions = fcp->isp_xfwoptions; + /* * Prefer or force Point-To-Point instead Loop? */ switch (isp->isp_confopts & ISP_CFG_PORT_PREF) { case ISP_CFG_NPORT: + icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK; icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP; break; case ISP_CFG_NPORT_ONLY: + icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK; icbp->icb_xfwoptions |= ICBXOPT_PTP_ONLY; break; case ISP_CFG_LPORT_ONLY: + icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK; icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY; break; default: - icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP; + /* + * Let NVRAM settings define it if they are sane + */ + switch (icbp->icb_xfwoptions & ICBXOPT_TOPO_MASK) { + case ICBXOPT_PTP_2_LOOP: + case ICBXOPT_PTP_ONLY: + case ICBXOPT_LOOP_ONLY: + case ICBXOPT_LOOP_2_PTP: + break; + default: + icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK; + icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP; + } break; } if (IS_2200(isp)) { @@ -1649,15 +1770,24 @@ isp_fibre_init(ispsoftc_t *isp) icbp->icb_xfwoptions |= ICBXOPT_ZIO; icbp->icb_idelaytimer = 10; } + icbp->icb_zfwoptions = fcp->isp_zfwoptions; if (isp->isp_confopts & ISP_CFG_ONEGB) { + icbp->icb_zfwoptions &= ~ICBZOPT_RATE_MASK; icbp->icb_zfwoptions |= ICBZOPT_RATE_ONEGB; } else if (isp->isp_confopts & ISP_CFG_TWOGB) { + icbp->icb_zfwoptions &= ~ICBZOPT_RATE_MASK; icbp->icb_zfwoptions |= ICBZOPT_RATE_TWOGB; } else { - icbp->icb_zfwoptions |= ICBZOPT_RATE_AUTO; - } - if (fcp->isp_zfwoptions & ICBZOPT_50_OHM) { - icbp->icb_zfwoptions |= ICBZOPT_50_OHM; + switch (icbp->icb_zfwoptions & ICBZOPT_RATE_MASK) { + case ICBZOPT_RATE_ONEGB: + case ICBZOPT_RATE_TWOGB: + case ICBZOPT_RATE_AUTO: + break; + default: + icbp->icb_zfwoptions &= ~ICBZOPT_RATE_MASK; + icbp->icb_zfwoptions |= ICBZOPT_RATE_AUTO; + break; + } } } } @@ -1768,6 +1898,7 @@ isp_fibre_init_2400(ispsoftc_t *isp) isp_icb_2400_t local, *icbp = &local; mbreg_t mbs; int chan; + int ownloopid = 0; /* * Check to see whether all channels have *some* kind of role @@ -1826,41 +1957,28 @@ isp_fibre_init_2400(ispsoftc_t *isp) icbp->icb_execthrottle = ICB_DFLT_THROTTLE; } + /* + * Set target exchange count. Take half if we are supporting both roles. + */ if (icbp->icb_fwoptions1 & ICB2400_OPT1_TGT_ENABLE) { - /* - * Get current resource count - */ - MBSINIT(&mbs, MBOX_GET_RESOURCE_COUNT, MBLOGALL, 0); - mbs.obits = 0x4cf; - isp_mboxcmd(isp, &mbs); - if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { - return; - } - icbp->icb_xchgcnt = mbs.param[3]; + icbp->icb_xchgcnt = isp->isp_maxcmds; + if ((icbp->icb_fwoptions1 & ICB2400_OPT1_INI_DISABLE) == 0) + icbp->icb_xchgcnt >>= 1; } + ownloopid = (isp->isp_confopts & ISP_CFG_OWNLOOPID) != 0; icbp->icb_hardaddr = fcp->isp_loopid; if (icbp->icb_hardaddr >= LOCAL_LOOP_LIM) { icbp->icb_hardaddr = 0; + ownloopid = 0; } - /* - * Force this on. - */ - icbp->icb_fwoptions1 |= ICB2400_OPT1_HARD_ADDRESS; + if (ownloopid) + icbp->icb_fwoptions1 |= ICB2400_OPT1_HARD_ADDRESS; icbp->icb_fwoptions2 = fcp->isp_xfwoptions; switch (isp->isp_confopts & ISP_CFG_PORT_PREF) { -#if 0 - case ISP_CFG_NPORT: - /* - * XXX: This causes the f/w to crash. - */ - icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK; - icbp->icb_fwoptions2 |= ICB2400_OPT2_PTP_2_LOOP; - break; -#endif case ISP_CFG_NPORT_ONLY: icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK; icbp->icb_fwoptions2 |= ICB2400_OPT2_PTP_ONLY; @@ -1870,14 +1988,12 @@ isp_fibre_init_2400(ispsoftc_t *isp) icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_ONLY; break; default: + /* ISP_CFG_PTP_2_LOOP not available in 24XX/25XX */ icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK; icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_2_PTP; break; } - /* force this on for now */ - icbp->icb_fwoptions2 |= ICB2400_OPT2_ZIO; - switch (icbp->icb_fwoptions2 & ICB2400_OPT2_TIMER_MASK) { case ICB2400_OPT2_ZIO: case ICB2400_OPT2_ZIO1: @@ -1891,12 +2007,10 @@ isp_fibre_init_2400(ispsoftc_t *isp) break; } - /* - * We don't support FCTAPE, so clear it. - */ - icbp->icb_fwoptions2 &= ~ICB2400_OPT2_FCTAPE; - icbp->icb_fwoptions3 = fcp->isp_zfwoptions; + if ((icbp->icb_fwoptions3 & ICB2400_OPT3_RSPSZ_MASK) == 0) { + icbp->icb_fwoptions3 |= ICB2400_OPT3_RSPSZ_24; + } icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_AUTO; if (isp->isp_confopts & ISP_CFG_ONEGB) { icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_ONEGB; @@ -1904,11 +2018,12 @@ isp_fibre_init_2400(ispsoftc_t *isp) icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_TWOGB; } else if (isp->isp_confopts & ISP_CFG_FOURGB) { icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_FOURGB; + } else if (IS_25XX(isp) && (isp->isp_confopts & ISP_CFG_EIGHTGB)) { + icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_EIGHTGB; } else { icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_AUTO; } - - if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0) { + if (ownloopid == 0) { icbp->icb_fwoptions3 |= ICB2400_OPT3_SOFTID; } icbp->icb_logintime = ICB_LOGIN_TOV; @@ -2306,6 +2421,11 @@ isp_port_login(ispsoftc_t *isp, uint16_t handle, uint32_t portid) } } +/* + * Pre-24XX fabric port logout + * + * Note that portid is not used + */ static int isp_port_logout(ispsoftc_t *isp, uint16_t handle, uint32_t portid) { @@ -2430,15 +2550,12 @@ isp_get_wwn(ispsoftc_t *isp, int chan, int loopid, int nodename) MBSINIT(&mbs, MBOX_GET_PORT_NAME, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR, 500000); if (ISP_CAP_2KLOGIN(isp)) { mbs.param[1] = loopid; - mbs.ibits = (1 << 10); if (nodename) { mbs.param[10] = 1; } - if (ISP_CAP_MULTI_ID(isp)) { - mbs.ibits |= (1 << 9); - mbs.param[9] = chan; - } + mbs.param[9] = chan; } else { + mbs.ibits = 3; mbs.param[1] = loopid << 8; if (nodename) { mbs.param[1] |= 1; @@ -2564,11 +2681,7 @@ isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay) * Get our Loop ID and Port ID. */ MBSINIT(&mbs, MBOX_GET_LOOP_ID, MBLOGALL, 0); - if (ISP_CAP_MULTI_ID(isp)) { - mbs.param[9] = chan; - mbs.ibits = (1 << 9); - mbs.obits = (1 << 7); - } + mbs.param[9] = chan; isp_mboxcmd(isp, &mbs); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { return (-1); @@ -2671,12 +2784,14 @@ isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay) lp->new_portid = lp->portid; lp->new_roles = lp->roles; if (IS_24XX(isp)) { - fcp->inorder = (mbs.param[7] & ISP24XX_INORDER) != 0; - if (ISP_FW_NEWER_THAN(isp, 4, 0, 27)) { - fcp->npiv_fabric = (mbs.param[7] & ISP24XX_NPIV_SAN) != 0; - if (fcp->npiv_fabric) { - isp_prt(isp, ISP_LOGCONFIG, "fabric supports NP-IV"); - } + if (check_for_fabric) { + /* + * The mbs is still hanging out from the MBOX_GET_LOOP_ID above. + */ + fcp->isp_fabric_params = mbs.param[7]; + isp_prt(isp, ISP_LOGCONFIG, "fabric params 0x%x", mbs.param[7]); + } else { + fcp->isp_fabric_params = 0; } if (chan) { fcp->isp_sns_hdl = NPH_SNS_HDLBASE + chan; @@ -2750,7 +2865,7 @@ not_on_fabric: * layer appropriately). * * We also do initiator map target id assignment here for new initiator - * devices and refresh old ones ot make sure that they point to the corret + * devices and refresh old ones ot make sure that they point to the correct * entities. */ static int @@ -4422,6 +4537,7 @@ isp_start(XS_T *xs) t7->req_lun[0] |= 0x40; } t7->req_lun[1] = XS_LUN(xs); + FCP_NEXT_CRN(isp, xs, t7->req_crn, XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); tptr = &t7->req_time; cdbp = t7->req_cdb; cdblen = ISP_MIN(cdblen, sizeof (t7->req_cdb)); @@ -4902,7 +5018,7 @@ again: if (isp->isp_mboxbsy) { int obits = isp->isp_obits; isp->isp_mboxtmp[0] = mbox; - for (i = 1; i < MAX_MAILBOX(isp); i++) { + for (i = 1; i < ISP_NMBOX(isp); i++) { if ((obits & (1 << i)) == 0) { continue; } @@ -6662,105 +6778,106 @@ isp_mbox_continue(ispsoftc_t *isp) return (0); } -#define HIWRD(x) ((x) >> 16) -#define LOWRD(x) ((x) & 0xffff) -#define ISPOPMAP(a, b) (((a) << 16) | (b)) -static const uint32_t mbpscsi[] = { - ISPOPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */ - ISPOPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */ - ISPOPMAP(0x03, 0x01), /* 0x02: MBOX_EXEC_FIRMWARE */ - ISPOPMAP(0x1f, 0x01), /* 0x03: MBOX_DUMP_RAM */ - ISPOPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */ - ISPOPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */ - ISPOPMAP(0x3f, 0x3f), /* 0x06: MBOX_MAILBOX_REG_TEST */ - ISPOPMAP(0x07, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */ - ISPOPMAP(0x01, 0x0f), /* 0x08: MBOX_ABOUT_FIRMWARE */ - ISPOPMAP(0x00, 0x00), /* 0x09: */ - ISPOPMAP(0x00, 0x00), /* 0x0a: */ - ISPOPMAP(0x00, 0x00), /* 0x0b: */ - ISPOPMAP(0x00, 0x00), /* 0x0c: */ - ISPOPMAP(0x00, 0x00), /* 0x0d: */ - ISPOPMAP(0x01, 0x05), /* 0x0e: MBOX_CHECK_FIRMWARE */ - ISPOPMAP(0x00, 0x00), /* 0x0f: */ - ISPOPMAP(0x1f, 0x1f), /* 0x10: MBOX_INIT_REQ_QUEUE */ - ISPOPMAP(0x3f, 0x3f), /* 0x11: MBOX_INIT_RES_QUEUE */ - ISPOPMAP(0x0f, 0x0f), /* 0x12: MBOX_EXECUTE_IOCB */ - ISPOPMAP(0x03, 0x03), /* 0x13: MBOX_WAKE_UP */ - ISPOPMAP(0x01, 0x3f), /* 0x14: MBOX_STOP_FIRMWARE */ - ISPOPMAP(0x0f, 0x0f), /* 0x15: MBOX_ABORT */ - ISPOPMAP(0x03, 0x03), /* 0x16: MBOX_ABORT_DEVICE */ - ISPOPMAP(0x07, 0x07), /* 0x17: MBOX_ABORT_TARGET */ - ISPOPMAP(0x07, 0x07), /* 0x18: MBOX_BUS_RESET */ - ISPOPMAP(0x03, 0x07), /* 0x19: MBOX_STOP_QUEUE */ - ISPOPMAP(0x03, 0x07), /* 0x1a: MBOX_START_QUEUE */ - ISPOPMAP(0x03, 0x07), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */ - ISPOPMAP(0x03, 0x07), /* 0x1c: MBOX_ABORT_QUEUE */ - ISPOPMAP(0x03, 0x4f), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */ - ISPOPMAP(0x00, 0x00), /* 0x1e: */ - ISPOPMAP(0x01, 0x07), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */ - ISPOPMAP(0x01, 0x07), /* 0x20: MBOX_GET_INIT_SCSI_ID */ - ISPOPMAP(0x01, 0x07), /* 0x21: MBOX_GET_SELECT_TIMEOUT */ - ISPOPMAP(0x01, 0xc7), /* 0x22: MBOX_GET_RETRY_COUNT */ - ISPOPMAP(0x01, 0x07), /* 0x23: MBOX_GET_TAG_AGE_LIMIT */ - ISPOPMAP(0x01, 0x03), /* 0x24: MBOX_GET_CLOCK_RATE */ - ISPOPMAP(0x01, 0x07), /* 0x25: MBOX_GET_ACT_NEG_STATE */ - ISPOPMAP(0x01, 0x07), /* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */ - ISPOPMAP(0x01, 0x07), /* 0x27: MBOX_GET_PCI_PARAMS */ - ISPOPMAP(0x03, 0x4f), /* 0x28: MBOX_GET_TARGET_PARAMS */ - ISPOPMAP(0x03, 0x0f), /* 0x29: MBOX_GET_DEV_QUEUE_PARAMS */ - ISPOPMAP(0x01, 0x07), /* 0x2a: MBOX_GET_RESET_DELAY_PARAMS */ - ISPOPMAP(0x00, 0x00), /* 0x2b: */ - ISPOPMAP(0x00, 0x00), /* 0x2c: */ - ISPOPMAP(0x00, 0x00), /* 0x2d: */ - ISPOPMAP(0x00, 0x00), /* 0x2e: */ - ISPOPMAP(0x00, 0x00), /* 0x2f: */ - ISPOPMAP(0x03, 0x03), /* 0x30: MBOX_SET_INIT_SCSI_ID */ - ISPOPMAP(0x07, 0x07), /* 0x31: MBOX_SET_SELECT_TIMEOUT */ - ISPOPMAP(0xc7, 0xc7), /* 0x32: MBOX_SET_RETRY_COUNT */ - ISPOPMAP(0x07, 0x07), /* 0x33: MBOX_SET_TAG_AGE_LIMIT */ - ISPOPMAP(0x03, 0x03), /* 0x34: MBOX_SET_CLOCK_RATE */ - ISPOPMAP(0x07, 0x07), /* 0x35: MBOX_SET_ACT_NEG_STATE */ - ISPOPMAP(0x07, 0x07), /* 0x36: MBOX_SET_ASYNC_DATA_SETUP_TIME */ - ISPOPMAP(0x07, 0x07), /* 0x37: MBOX_SET_PCI_CONTROL_PARAMS */ - ISPOPMAP(0x4f, 0x4f), /* 0x38: MBOX_SET_TARGET_PARAMS */ - ISPOPMAP(0x0f, 0x0f), /* 0x39: MBOX_SET_DEV_QUEUE_PARAMS */ - ISPOPMAP(0x07, 0x07), /* 0x3a: MBOX_SET_RESET_DELAY_PARAMS */ - ISPOPMAP(0x00, 0x00), /* 0x3b: */ - ISPOPMAP(0x00, 0x00), /* 0x3c: */ - ISPOPMAP(0x00, 0x00), /* 0x3d: */ - ISPOPMAP(0x00, 0x00), /* 0x3e: */ - ISPOPMAP(0x00, 0x00), /* 0x3f: */ - ISPOPMAP(0x01, 0x03), /* 0x40: MBOX_RETURN_BIOS_BLOCK_ADDR */ - ISPOPMAP(0x3f, 0x01), /* 0x41: MBOX_WRITE_FOUR_RAM_WORDS */ - ISPOPMAP(0x03, 0x07), /* 0x42: MBOX_EXEC_BIOS_IOCB */ - ISPOPMAP(0x00, 0x00), /* 0x43: */ - ISPOPMAP(0x00, 0x00), /* 0x44: */ - ISPOPMAP(0x03, 0x03), /* 0x45: SET SYSTEM PARAMETER */ - ISPOPMAP(0x01, 0x03), /* 0x46: GET SYSTEM PARAMETER */ - ISPOPMAP(0x00, 0x00), /* 0x47: */ - ISPOPMAP(0x01, 0xcf), /* 0x48: GET SCAM CONFIGURATION */ - ISPOPMAP(0xcf, 0xcf), /* 0x49: SET SCAM CONFIGURATION */ - ISPOPMAP(0x03, 0x03), /* 0x4a: MBOX_SET_FIRMWARE_FEATURES */ - ISPOPMAP(0x01, 0x03), /* 0x4b: MBOX_GET_FIRMWARE_FEATURES */ - ISPOPMAP(0x00, 0x00), /* 0x4c: */ - ISPOPMAP(0x00, 0x00), /* 0x4d: */ - ISPOPMAP(0x00, 0x00), /* 0x4e: */ - ISPOPMAP(0x00, 0x00), /* 0x4f: */ - ISPOPMAP(0xdf, 0xdf), /* 0x50: LOAD RAM A64 */ - ISPOPMAP(0xdf, 0xdf), /* 0x51: DUMP RAM A64 */ - ISPOPMAP(0xdf, 0xff), /* 0x52: INITIALIZE REQUEST QUEUE A64 */ - ISPOPMAP(0xef, 0xff), /* 0x53: INITIALIZE RESPONSE QUEUE A64 */ - ISPOPMAP(0xcf, 0x01), /* 0x54: EXECUCUTE COMMAND IOCB A64 */ - ISPOPMAP(0x07, 0x01), /* 0x55: ENABLE TARGET MODE */ - ISPOPMAP(0x03, 0x0f), /* 0x56: GET TARGET STATUS */ - ISPOPMAP(0x00, 0x00), /* 0x57: */ - ISPOPMAP(0x00, 0x00), /* 0x58: */ - ISPOPMAP(0x00, 0x00), /* 0x59: */ - ISPOPMAP(0x03, 0x03), /* 0x5a: SET DATA OVERRUN RECOVERY MODE */ - ISPOPMAP(0x01, 0x03), /* 0x5b: GET DATA OVERRUN RECOVERY MODE */ - ISPOPMAP(0x0f, 0x0f), /* 0x5c: SET HOST DATA */ - ISPOPMAP(0x01, 0x01) /* 0x5d: GET NOST DATA */ +#define ISP_SCSI_IBITS(op) (mbpscsi[((op)<<1)]) +#define ISP_SCSI_OBITS(op) (mbpscsi[((op)<<1) + 1]) +#define ISP_SCSI_OPMAP(in, out) in, out +static const uint8_t mbpscsi[] = { + ISP_SCSI_OPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */ + ISP_SCSI_OPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */ + ISP_SCSI_OPMAP(0x03, 0x01), /* 0x02: MBOX_EXEC_FIRMWARE */ + ISP_SCSI_OPMAP(0x1f, 0x01), /* 0x03: MBOX_DUMP_RAM */ + ISP_SCSI_OPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */ + ISP_SCSI_OPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */ + ISP_SCSI_OPMAP(0x3f, 0x3f), /* 0x06: MBOX_MAILBOX_REG_TEST */ + ISP_SCSI_OPMAP(0x07, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */ + ISP_SCSI_OPMAP(0x01, 0x0f), /* 0x08: MBOX_ABOUT_FIRMWARE */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x09: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x0a: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x0b: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x0c: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x0d: */ + ISP_SCSI_OPMAP(0x01, 0x05), /* 0x0e: MBOX_CHECK_FIRMWARE */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x0f: */ + ISP_SCSI_OPMAP(0x1f, 0x1f), /* 0x10: MBOX_INIT_REQ_QUEUE */ + ISP_SCSI_OPMAP(0x3f, 0x3f), /* 0x11: MBOX_INIT_RES_QUEUE */ + ISP_SCSI_OPMAP(0x0f, 0x0f), /* 0x12: MBOX_EXECUTE_IOCB */ + ISP_SCSI_OPMAP(0x03, 0x03), /* 0x13: MBOX_WAKE_UP */ + ISP_SCSI_OPMAP(0x01, 0x3f), /* 0x14: MBOX_STOP_FIRMWARE */ + ISP_SCSI_OPMAP(0x0f, 0x0f), /* 0x15: MBOX_ABORT */ + ISP_SCSI_OPMAP(0x03, 0x03), /* 0x16: MBOX_ABORT_DEVICE */ + ISP_SCSI_OPMAP(0x07, 0x07), /* 0x17: MBOX_ABORT_TARGET */ + ISP_SCSI_OPMAP(0x07, 0x07), /* 0x18: MBOX_BUS_RESET */ + ISP_SCSI_OPMAP(0x03, 0x07), /* 0x19: MBOX_STOP_QUEUE */ + ISP_SCSI_OPMAP(0x03, 0x07), /* 0x1a: MBOX_START_QUEUE */ + ISP_SCSI_OPMAP(0x03, 0x07), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */ + ISP_SCSI_OPMAP(0x03, 0x07), /* 0x1c: MBOX_ABORT_QUEUE */ + ISP_SCSI_OPMAP(0x03, 0x4f), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x1e: */ + ISP_SCSI_OPMAP(0x01, 0x07), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */ + ISP_SCSI_OPMAP(0x01, 0x07), /* 0x20: MBOX_GET_INIT_SCSI_ID */ + ISP_SCSI_OPMAP(0x01, 0x07), /* 0x21: MBOX_GET_SELECT_TIMEOUT */ + ISP_SCSI_OPMAP(0x01, 0xc7), /* 0x22: MBOX_GET_RETRY_COUNT */ + ISP_SCSI_OPMAP(0x01, 0x07), /* 0x23: MBOX_GET_TAG_AGE_LIMIT */ + ISP_SCSI_OPMAP(0x01, 0x03), /* 0x24: MBOX_GET_CLOCK_RATE */ + ISP_SCSI_OPMAP(0x01, 0x07), /* 0x25: MBOX_GET_ACT_NEG_STATE */ + ISP_SCSI_OPMAP(0x01, 0x07), /* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */ + ISP_SCSI_OPMAP(0x01, 0x07), /* 0x27: MBOX_GET_PCI_PARAMS */ + ISP_SCSI_OPMAP(0x03, 0x4f), /* 0x28: MBOX_GET_TARGET_PARAMS */ + ISP_SCSI_OPMAP(0x03, 0x0f), /* 0x29: MBOX_GET_DEV_QUEUE_PARAMS */ + ISP_SCSI_OPMAP(0x01, 0x07), /* 0x2a: MBOX_GET_RESET_DELAY_PARAMS */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x2b: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x2c: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x2d: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x2e: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x2f: */ + ISP_SCSI_OPMAP(0x03, 0x03), /* 0x30: MBOX_SET_INIT_SCSI_ID */ + ISP_SCSI_OPMAP(0x07, 0x07), /* 0x31: MBOX_SET_SELECT_TIMEOUT */ + ISP_SCSI_OPMAP(0xc7, 0xc7), /* 0x32: MBOX_SET_RETRY_COUNT */ + ISP_SCSI_OPMAP(0x07, 0x07), /* 0x33: MBOX_SET_TAG_AGE_LIMIT */ + ISP_SCSI_OPMAP(0x03, 0x03), /* 0x34: MBOX_SET_CLOCK_RATE */ + ISP_SCSI_OPMAP(0x07, 0x07), /* 0x35: MBOX_SET_ACT_NEG_STATE */ + ISP_SCSI_OPMAP(0x07, 0x07), /* 0x36: MBOX_SET_ASYNC_DATA_SETUP_TIME */ + ISP_SCSI_OPMAP(0x07, 0x07), /* 0x37: MBOX_SET_PCI_CONTROL_PARAMS */ + ISP_SCSI_OPMAP(0x4f, 0x4f), /* 0x38: MBOX_SET_TARGET_PARAMS */ + ISP_SCSI_OPMAP(0x0f, 0x0f), /* 0x39: MBOX_SET_DEV_QUEUE_PARAMS */ + ISP_SCSI_OPMAP(0x07, 0x07), /* 0x3a: MBOX_SET_RESET_DELAY_PARAMS */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x3b: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x3c: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x3d: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x3e: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x3f: */ + ISP_SCSI_OPMAP(0x01, 0x03), /* 0x40: MBOX_RETURN_BIOS_BLOCK_ADDR */ + ISP_SCSI_OPMAP(0x3f, 0x01), /* 0x41: MBOX_WRITE_FOUR_RAM_WORDS */ + ISP_SCSI_OPMAP(0x03, 0x07), /* 0x42: MBOX_EXEC_BIOS_IOCB */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x43: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x44: */ + ISP_SCSI_OPMAP(0x03, 0x03), /* 0x45: SET SYSTEM PARAMETER */ + ISP_SCSI_OPMAP(0x01, 0x03), /* 0x46: GET SYSTEM PARAMETER */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x47: */ + ISP_SCSI_OPMAP(0x01, 0xcf), /* 0x48: GET SCAM CONFIGURATION */ + ISP_SCSI_OPMAP(0xcf, 0xcf), /* 0x49: SET SCAM CONFIGURATION */ + ISP_SCSI_OPMAP(0x03, 0x03), /* 0x4a: MBOX_SET_FIRMWARE_FEATURES */ + ISP_SCSI_OPMAP(0x01, 0x03), /* 0x4b: MBOX_GET_FIRMWARE_FEATURES */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x4c: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x4d: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x4e: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x4f: */ + ISP_SCSI_OPMAP(0xdf, 0xdf), /* 0x50: LOAD RAM A64 */ + ISP_SCSI_OPMAP(0xdf, 0xdf), /* 0x51: DUMP RAM A64 */ + ISP_SCSI_OPMAP(0xdf, 0xff), /* 0x52: INITIALIZE REQUEST QUEUE A64 */ + ISP_SCSI_OPMAP(0xef, 0xff), /* 0x53: INITIALIZE RESPONSE QUEUE A64 */ + ISP_SCSI_OPMAP(0xcf, 0x01), /* 0x54: EXECUCUTE COMMAND IOCB A64 */ + ISP_SCSI_OPMAP(0x07, 0x01), /* 0x55: ENABLE TARGET MODE */ + ISP_SCSI_OPMAP(0x03, 0x0f), /* 0x56: GET TARGET STATUS */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x57: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x58: */ + ISP_SCSI_OPMAP(0x00, 0x00), /* 0x59: */ + ISP_SCSI_OPMAP(0x03, 0x03), /* 0x5a: SET DATA OVERRUN RECOVERY MODE */ + ISP_SCSI_OPMAP(0x01, 0x03), /* 0x5b: GET DATA OVERRUN RECOVERY MODE */ + ISP_SCSI_OPMAP(0x0f, 0x0f), /* 0x5c: SET HOST DATA */ + ISP_SCSI_OPMAP(0x01, 0x01) /* 0x5d: GET NOST DATA */ }; +#define MAX_SCSI_OPCODE 0x5d static const char *scsi_mbcmd_names[] = { "NO-OP", @@ -6859,135 +6976,142 @@ static const char *scsi_mbcmd_names[] = { "GET NOST DATA", }; +#define ISP_FC_IBITS(op) ((mbpfc[((op)<<3) + 0] << 24) | (mbpfc[((op)<<3) + 1] << 16) | (mbpfc[((op)<<3) + 2] << 8) | (mbpfc[((op)<<3) + 3])) +#define ISP_FC_OBITS(op) ((mbpfc[((op)<<3) + 4] << 24) | (mbpfc[((op)<<3) + 5] << 16) | (mbpfc[((op)<<3) + 6] << 8) | (mbpfc[((op)<<3) + 7])) + +#define ISP_FC_OPMAP(in0, out0) 0, 0, 0, in0, 0, 0, 0, out0 +#define ISP_FC_OPMAP_HALF(in1, in0, out1, out0) 0, 0, in1, in0, 0, 0, out1, out0 +#define ISP_FC_OPMAP_FULL(in3, in2, in1, in0, out3, out2, out1, out0) in3, in2, in1, in0, out3, out2, out1, out0 static const uint32_t mbpfc[] = { - ISPOPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */ - ISPOPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */ - ISPOPMAP(0x0f, 0x01), /* 0x02: MBOX_EXEC_FIRMWARE */ - ISPOPMAP(0xdf, 0x01), /* 0x03: MBOX_DUMP_RAM */ - ISPOPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */ - ISPOPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */ - ISPOPMAP(0xff, 0xff), /* 0x06: MBOX_MAILBOX_REG_TEST */ - ISPOPMAP(0x07, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */ - ISPOPMAP(0x01, 0x4f), /* 0x08: MBOX_ABOUT_FIRMWARE */ - ISPOPMAP(0xdf, 0x01), /* 0x09: MBOX_LOAD_RISC_RAM_2100 */ - ISPOPMAP(0xdf, 0x01), /* 0x0a: DUMP RAM */ - ISPOPMAP(0x1ff, 0x01), /* 0x0b: MBOX_LOAD_RISC_RAM */ - ISPOPMAP(0x00, 0x00), /* 0x0c: */ - ISPOPMAP(0x10f, 0x01), /* 0x0d: MBOX_WRITE_RAM_WORD_EXTENDED */ - ISPOPMAP(0x01, 0x05), /* 0x0e: MBOX_CHECK_FIRMWARE */ - ISPOPMAP(0x103, 0x0d), /* 0x0f: MBOX_READ_RAM_WORD_EXTENDED */ - ISPOPMAP(0x1f, 0x11), /* 0x10: MBOX_INIT_REQ_QUEUE */ - ISPOPMAP(0x2f, 0x21), /* 0x11: MBOX_INIT_RES_QUEUE */ - ISPOPMAP(0x0f, 0x01), /* 0x12: MBOX_EXECUTE_IOCB */ - ISPOPMAP(0x03, 0x03), /* 0x13: MBOX_WAKE_UP */ - ISPOPMAP(0x01, 0xff), /* 0x14: MBOX_STOP_FIRMWARE */ - ISPOPMAP(0x4f, 0x01), /* 0x15: MBOX_ABORT */ - ISPOPMAP(0x07, 0x01), /* 0x16: MBOX_ABORT_DEVICE */ - ISPOPMAP(0x07, 0x01), /* 0x17: MBOX_ABORT_TARGET */ - ISPOPMAP(0x03, 0x03), /* 0x18: MBOX_BUS_RESET */ - ISPOPMAP(0x07, 0x05), /* 0x19: MBOX_STOP_QUEUE */ - ISPOPMAP(0x07, 0x05), /* 0x1a: MBOX_START_QUEUE */ - ISPOPMAP(0x07, 0x05), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */ - ISPOPMAP(0x07, 0x05), /* 0x1c: MBOX_ABORT_QUEUE */ - ISPOPMAP(0x07, 0x03), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */ - ISPOPMAP(0x00, 0x00), /* 0x1e: */ - ISPOPMAP(0x01, 0x07), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */ - ISPOPMAP(0x01, 0x4f), /* 0x20: MBOX_GET_LOOP_ID */ - ISPOPMAP(0x00, 0x00), /* 0x21: */ - ISPOPMAP(0x01, 0x07), /* 0x22: MBOX_GET_RETRY_COUNT */ - ISPOPMAP(0x00, 0x00), /* 0x23: */ - ISPOPMAP(0x00, 0x00), /* 0x24: */ - ISPOPMAP(0x00, 0x00), /* 0x25: */ - ISPOPMAP(0x00, 0x00), /* 0x26: */ - ISPOPMAP(0x00, 0x00), /* 0x27: */ - ISPOPMAP(0x01, 0x03), /* 0x28: MBOX_GET_FIRMWARE_OPTIONS */ - ISPOPMAP(0x03, 0x07), /* 0x29: MBOX_GET_PORT_QUEUE_PARAMS */ - ISPOPMAP(0x00, 0x00), /* 0x2a: */ - ISPOPMAP(0x00, 0x00), /* 0x2b: */ - ISPOPMAP(0x00, 0x00), /* 0x2c: */ - ISPOPMAP(0x00, 0x00), /* 0x2d: */ - ISPOPMAP(0x00, 0x00), /* 0x2e: */ - ISPOPMAP(0x00, 0x00), /* 0x2f: */ - ISPOPMAP(0x00, 0x00), /* 0x30: */ - ISPOPMAP(0x00, 0x00), /* 0x31: */ - ISPOPMAP(0x07, 0x07), /* 0x32: MBOX_SET_RETRY_COUNT */ - ISPOPMAP(0x00, 0x00), /* 0x33: */ - ISPOPMAP(0x00, 0x00), /* 0x34: */ - ISPOPMAP(0x00, 0x00), /* 0x35: */ - ISPOPMAP(0x00, 0x00), /* 0x36: */ - ISPOPMAP(0x00, 0x00), /* 0x37: */ - ISPOPMAP(0x0f, 0x01), /* 0x38: MBOX_SET_FIRMWARE_OPTIONS */ - ISPOPMAP(0x0f, 0x07), /* 0x39: MBOX_SET_PORT_QUEUE_PARAMS */ - ISPOPMAP(0x00, 0x00), /* 0x3a: */ - ISPOPMAP(0x00, 0x00), /* 0x3b: */ - ISPOPMAP(0x00, 0x00), /* 0x3c: */ - ISPOPMAP(0x00, 0x00), /* 0x3d: */ - ISPOPMAP(0x00, 0x00), /* 0x3e: */ - ISPOPMAP(0x00, 0x00), /* 0x3f: */ - ISPOPMAP(0x03, 0x01), /* 0x40: MBOX_LOOP_PORT_BYPASS */ - ISPOPMAP(0x03, 0x01), /* 0x41: MBOX_LOOP_PORT_ENABLE */ - ISPOPMAP(0x03, 0x07), /* 0x42: MBOX_GET_RESOURCE_COUNT */ - ISPOPMAP(0x01, 0x01), /* 0x43: MBOX_REQUEST_OFFLINE_MODE */ - ISPOPMAP(0x00, 0x00), /* 0x44: */ - ISPOPMAP(0x00, 0x00), /* 0x45: */ - ISPOPMAP(0x00, 0x00), /* 0x46: */ - ISPOPMAP(0xcf, 0x03), /* 0x47: GET PORT_DATABASE ENHANCED */ - ISPOPMAP(0xcd, 0x01), /* 0x48: MBOX_INIT_FIRMWARE_MULTI_ID */ - ISPOPMAP(0xcd, 0x01), /* 0x49: MBOX_GET_VP_DATABASE */ - ISPOPMAP(0x2cd, 0x01), /* 0x4a: MBOX_GET_VP_DATABASE_ENTRY */ - ISPOPMAP(0x00, 0x00), /* 0x4b: */ - ISPOPMAP(0x00, 0x00), /* 0x4c: */ - ISPOPMAP(0x00, 0x00), /* 0x4d: */ - ISPOPMAP(0x00, 0x00), /* 0x4e: */ - ISPOPMAP(0x00, 0x00), /* 0x4f: */ - ISPOPMAP(0x00, 0x00), /* 0x50: */ - ISPOPMAP(0x00, 0x00), /* 0x51: */ - ISPOPMAP(0x00, 0x00), /* 0x52: */ - ISPOPMAP(0x00, 0x00), /* 0x53: */ - ISPOPMAP(0xcf, 0x01), /* 0x54: EXECUTE IOCB A64 */ - ISPOPMAP(0x00, 0x00), /* 0x55: */ - ISPOPMAP(0x00, 0x00), /* 0x56: */ - ISPOPMAP(0x00, 0x00), /* 0x57: */ - ISPOPMAP(0x00, 0x00), /* 0x58: */ - ISPOPMAP(0x00, 0x00), /* 0x59: */ - ISPOPMAP(0x00, 0x00), /* 0x5a: */ - ISPOPMAP(0x03, 0x01), /* 0x5b: MBOX_DRIVER_HEARTBEAT */ - ISPOPMAP(0xcf, 0x01), /* 0x5c: MBOX_FW_HEARTBEAT */ - ISPOPMAP(0x07, 0x03), /* 0x5d: MBOX_GET_SET_DATA_RATE */ - ISPOPMAP(0x00, 0x00), /* 0x5e: */ - ISPOPMAP(0x00, 0x00), /* 0x5f: */ - ISPOPMAP(0xcd, 0x01), /* 0x60: MBOX_INIT_FIRMWARE */ - ISPOPMAP(0x00, 0x00), /* 0x61: */ - ISPOPMAP(0x01, 0x01), /* 0x62: MBOX_INIT_LIP */ - ISPOPMAP(0xcd, 0x03), /* 0x63: MBOX_GET_FC_AL_POSITION_MAP */ - ISPOPMAP(0xcf, 0x01), /* 0x64: MBOX_GET_PORT_DB */ - ISPOPMAP(0x07, 0x01), /* 0x65: MBOX_CLEAR_ACA */ - ISPOPMAP(0x07, 0x01), /* 0x66: MBOX_TARGET_RESET */ - ISPOPMAP(0x07, 0x01), /* 0x67: MBOX_CLEAR_TASK_SET */ - ISPOPMAP(0x07, 0x01), /* 0x68: MBOX_ABORT_TASK_SET */ - ISPOPMAP(0x01, 0x07), /* 0x69: MBOX_GET_FW_STATE */ - ISPOPMAP(0x03, 0xcf), /* 0x6a: MBOX_GET_PORT_NAME */ - ISPOPMAP(0xcf, 0x01), /* 0x6b: MBOX_GET_LINK_STATUS */ - ISPOPMAP(0x0f, 0x01), /* 0x6c: MBOX_INIT_LIP_RESET */ - ISPOPMAP(0x00, 0x00), /* 0x6d: */ - ISPOPMAP(0xcf, 0x03), /* 0x6e: MBOX_SEND_SNS */ - ISPOPMAP(0x0f, 0x07), /* 0x6f: MBOX_FABRIC_LOGIN */ - ISPOPMAP(0x03, 0x01), /* 0x70: MBOX_SEND_CHANGE_REQUEST */ - ISPOPMAP(0x03, 0x03), /* 0x71: MBOX_FABRIC_LOGOUT */ - ISPOPMAP(0x0f, 0x0f), /* 0x72: MBOX_INIT_LIP_LOGIN */ - ISPOPMAP(0x00, 0x00), /* 0x73: */ - ISPOPMAP(0x07, 0x01), /* 0x74: LOGIN LOOP PORT */ - ISPOPMAP(0xcf, 0x03), /* 0x75: GET PORT/NODE NAME LIST */ - ISPOPMAP(0x4f, 0x01), /* 0x76: SET VENDOR ID */ - ISPOPMAP(0xcd, 0x01), /* 0x77: INITIALIZE IP MAILBOX */ - ISPOPMAP(0x00, 0x00), /* 0x78: */ - ISPOPMAP(0x00, 0x00), /* 0x79: */ - ISPOPMAP(0x00, 0x00), /* 0x7a: */ - ISPOPMAP(0x00, 0x00), /* 0x7b: */ - ISPOPMAP(0x4f, 0x03), /* 0x7c: Get ID List */ - ISPOPMAP(0xcf, 0x01), /* 0x7d: SEND LFA */ - ISPOPMAP(0x0f, 0x01) /* 0x7e: LUN RESET */ + ISP_FC_OPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */ + ISP_FC_OPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */ + ISP_FC_OPMAP(0x0f, 0x01), /* 0x02: MBOX_EXEC_FIRMWARE */ + ISP_FC_OPMAP(0xdf, 0x01), /* 0x03: MBOX_DUMP_RAM */ + ISP_FC_OPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */ + ISP_FC_OPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */ + ISP_FC_OPMAP_FULL(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff), /* 0x06: MBOX_MAILBOX_REG_TEST */ + ISP_FC_OPMAP(0x07, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */ + ISP_FC_OPMAP_FULL(0x0, 0x0, 0x0, 0x01, 0x0, 0x3, 0x80, 0x4f), /* 0x08: MBOX_ABOUT_FIRMWARE */ + ISP_FC_OPMAP(0xdf, 0x01), /* 0x09: MBOX_LOAD_RISC_RAM_2100 */ + ISP_FC_OPMAP(0xdf, 0x01), /* 0x0a: DUMP RAM */ + ISP_FC_OPMAP_HALF(0x1, 0xff, 0x0, 0x01), /* 0x0b: MBOX_LOAD_RISC_RAM */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x0c: */ + ISP_FC_OPMAP_HALF(0x1, 0x0f, 0x0, 0x01), /* 0x0d: MBOX_WRITE_RAM_WORD_EXTENDED */ + ISP_FC_OPMAP(0x01, 0x05), /* 0x0e: MBOX_CHECK_FIRMWARE */ + ISP_FC_OPMAP_HALF(0x1, 0x03, 0x0, 0x0d), /* 0x0f: MBOX_READ_RAM_WORD_EXTENDED */ + ISP_FC_OPMAP(0x1f, 0x11), /* 0x10: MBOX_INIT_REQ_QUEUE */ + ISP_FC_OPMAP(0x2f, 0x21), /* 0x11: MBOX_INIT_RES_QUEUE */ + ISP_FC_OPMAP(0x0f, 0x01), /* 0x12: MBOX_EXECUTE_IOCB */ + ISP_FC_OPMAP(0x03, 0x03), /* 0x13: MBOX_WAKE_UP */ + ISP_FC_OPMAP(0x01, 0xff), /* 0x14: MBOX_STOP_FIRMWARE */ + ISP_FC_OPMAP(0x4f, 0x01), /* 0x15: MBOX_ABORT */ + ISP_FC_OPMAP(0x07, 0x01), /* 0x16: MBOX_ABORT_DEVICE */ + ISP_FC_OPMAP(0x07, 0x01), /* 0x17: MBOX_ABORT_TARGET */ + ISP_FC_OPMAP(0x03, 0x03), /* 0x18: MBOX_BUS_RESET */ + ISP_FC_OPMAP(0x07, 0x05), /* 0x19: MBOX_STOP_QUEUE */ + ISP_FC_OPMAP(0x07, 0x05), /* 0x1a: MBOX_START_QUEUE */ + ISP_FC_OPMAP(0x07, 0x05), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */ + ISP_FC_OPMAP(0x07, 0x05), /* 0x1c: MBOX_ABORT_QUEUE */ + ISP_FC_OPMAP(0x07, 0x03), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x1e: */ + ISP_FC_OPMAP(0x01, 0x07), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */ + ISP_FC_OPMAP_HALF(0x2, 0x01, 0x0, 0xcf), /* 0x20: MBOX_GET_LOOP_ID */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x21: */ + ISP_FC_OPMAP(0x01, 0x07), /* 0x22: MBOX_GET_RETRY_COUNT */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x23: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x24: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x25: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x26: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x27: */ + ISP_FC_OPMAP(0x01, 0x03), /* 0x28: MBOX_GET_FIRMWARE_OPTIONS */ + ISP_FC_OPMAP(0x03, 0x07), /* 0x29: MBOX_GET_PORT_QUEUE_PARAMS */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x2a: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x2b: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x2c: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x2d: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x2e: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x2f: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x30: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x31: */ + ISP_FC_OPMAP(0x07, 0x07), /* 0x32: MBOX_SET_RETRY_COUNT */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x33: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x34: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x35: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x36: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x37: */ + ISP_FC_OPMAP(0x0f, 0x01), /* 0x38: MBOX_SET_FIRMWARE_OPTIONS */ + ISP_FC_OPMAP(0x0f, 0x07), /* 0x39: MBOX_SET_PORT_QUEUE_PARAMS */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x3a: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x3b: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x3c: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x3d: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x3e: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x3f: */ + ISP_FC_OPMAP(0x03, 0x01), /* 0x40: MBOX_LOOP_PORT_BYPASS */ + ISP_FC_OPMAP(0x03, 0x01), /* 0x41: MBOX_LOOP_PORT_ENABLE */ + ISP_FC_OPMAP_HALF(0x0, 0x01, 0x3, 0xcf), /* 0x42: MBOX_GET_RESOURCE_COUNT */ + ISP_FC_OPMAP(0x01, 0x01), /* 0x43: MBOX_REQUEST_OFFLINE_MODE */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x44: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x45: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x46: */ + ISP_FC_OPMAP(0xcf, 0x03), /* 0x47: GET PORT_DATABASE ENHANCED */ + ISP_FC_OPMAP(0xcd, 0x01), /* 0x48: MBOX_INIT_FIRMWARE_MULTI_ID */ + ISP_FC_OPMAP(0xcd, 0x01), /* 0x49: MBOX_GET_VP_DATABASE */ + ISP_FC_OPMAP_HALF(0x2, 0xcd, 0x0, 0x01), /* 0x4a: MBOX_GET_VP_DATABASE_ENTRY */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x4b: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x4c: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x4d: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x4e: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x4f: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x50: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x51: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x52: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x53: */ + ISP_FC_OPMAP(0xcf, 0x01), /* 0x54: EXECUTE IOCB A64 */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x55: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x56: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x57: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x58: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x59: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x5a: */ + ISP_FC_OPMAP(0x03, 0x01), /* 0x5b: MBOX_DRIVER_HEARTBEAT */ + ISP_FC_OPMAP(0xcf, 0x01), /* 0x5c: MBOX_FW_HEARTBEAT */ + ISP_FC_OPMAP(0x07, 0x03), /* 0x5d: MBOX_GET_SET_DATA_RATE */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x5e: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x5f: */ + ISP_FC_OPMAP(0xcd, 0x01), /* 0x60: MBOX_INIT_FIRMWARE */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x61: */ + ISP_FC_OPMAP(0x01, 0x01), /* 0x62: MBOX_INIT_LIP */ + ISP_FC_OPMAP(0xcd, 0x03), /* 0x63: MBOX_GET_FC_AL_POSITION_MAP */ + ISP_FC_OPMAP(0xcf, 0x01), /* 0x64: MBOX_GET_PORT_DB */ + ISP_FC_OPMAP(0x07, 0x01), /* 0x65: MBOX_CLEAR_ACA */ + ISP_FC_OPMAP(0x07, 0x01), /* 0x66: MBOX_TARGET_RESET */ + ISP_FC_OPMAP(0x07, 0x01), /* 0x67: MBOX_CLEAR_TASK_SET */ + ISP_FC_OPMAP(0x07, 0x01), /* 0x68: MBOX_ABORT_TASK_SET */ + ISP_FC_OPMAP(0x01, 0x07), /* 0x69: MBOX_GET_FW_STATE */ + ISP_FC_OPMAP_HALF(0x6, 0x03, 0x0, 0xcf), /* 0x6a: MBOX_GET_PORT_NAME */ + ISP_FC_OPMAP(0xcf, 0x01), /* 0x6b: MBOX_GET_LINK_STATUS */ + ISP_FC_OPMAP(0x0f, 0x01), /* 0x6c: MBOX_INIT_LIP_RESET */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x6d: */ + ISP_FC_OPMAP(0xcf, 0x03), /* 0x6e: MBOX_SEND_SNS */ + ISP_FC_OPMAP(0x0f, 0x07), /* 0x6f: MBOX_FABRIC_LOGIN */ + ISP_FC_OPMAP(0x03, 0x01), /* 0x70: MBOX_SEND_CHANGE_REQUEST */ + ISP_FC_OPMAP(0x03, 0x03), /* 0x71: MBOX_FABRIC_LOGOUT */ + ISP_FC_OPMAP(0x0f, 0x0f), /* 0x72: MBOX_INIT_LIP_LOGIN */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x73: */ + ISP_FC_OPMAP(0x07, 0x01), /* 0x74: LOGIN LOOP PORT */ + ISP_FC_OPMAP(0xcf, 0x03), /* 0x75: GET PORT/NODE NAME LIST */ + ISP_FC_OPMAP(0x4f, 0x01), /* 0x76: SET VENDOR ID */ + ISP_FC_OPMAP(0xcd, 0x01), /* 0x77: INITIALIZE IP MAILBOX */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x78: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x79: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x7a: */ + ISP_FC_OPMAP(0x00, 0x00), /* 0x7b: */ + ISP_FC_OPMAP(0x4f, 0x03), /* 0x7c: Get ID List */ + ISP_FC_OPMAP(0xcf, 0x01), /* 0x7d: SEND LFA */ + ISP_FC_OPMAP(0x0f, 0x01) /* 0x7e: LUN RESET */ }; +#define MAX_FC_OPCODE 0x7e /* * Footnotes * @@ -7131,19 +7255,18 @@ static void isp_mboxcmd_qnw(ispsoftc_t *isp, mbreg_t *mbp, int nodelay) { unsigned int ibits, obits, box, opcode; - const uint32_t *mcp; - if (IS_FC(isp)) { - mcp = mbpfc; - } else { - mcp = mbpscsi; - } opcode = mbp->param[0]; - ibits = HIWRD(mcp[opcode]) & NMBOX_BMASK(isp); - obits = LOWRD(mcp[opcode]) & NMBOX_BMASK(isp); + if (IS_FC(isp)) { + ibits = ISP_FC_IBITS(opcode); + obits = ISP_FC_OBITS(opcode); + } else { + ibits = ISP_SCSI_IBITS(opcode); + obits = ISP_SCSI_OBITS(opcode); + } ibits |= mbp->ibits; obits |= mbp->obits; - for (box = 0; box < MAX_MAILBOX(isp); box++) { + for (box = 0; box < ISP_NMBOX(isp); box++) { if (ibits & (1 << box)) { ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]); } @@ -7176,26 +7299,27 @@ isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp) { const char *cname, *xname; char tname[16], mname[16]; - unsigned int lim, ibits, obits, box, opcode; - const uint32_t *mcp; + unsigned int ibits, obits, box, opcode; + opcode = mbp->param[0]; if (IS_FC(isp)) { - mcp = mbpfc; - lim = (sizeof (mbpfc) / sizeof (mbpfc[0])); + if (opcode > MAX_FC_OPCODE) { + mbp->param[0] = MBOX_INVALID_COMMAND; + isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode); + return; + } + ibits = ISP_FC_IBITS(opcode); + obits = ISP_FC_OBITS(opcode); } else { - mcp = mbpscsi; - lim = (sizeof (mbpscsi) / sizeof (mbpscsi[0])); + if (opcode > MAX_SCSI_OPCODE) { + mbp->param[0] = MBOX_INVALID_COMMAND; + isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode); + return; + } + ibits = ISP_SCSI_IBITS(opcode); + obits = ISP_SCSI_OBITS(opcode); } - if ((opcode = mbp->param[0]) >= lim) { - mbp->param[0] = MBOX_INVALID_COMMAND; - isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode); - return; - } - - ibits = HIWRD(mcp[opcode]) & NMBOX_BMASK(isp); - obits = LOWRD(mcp[opcode]) & NMBOX_BMASK(isp); - /* * Pick up any additional bits that the caller might have set. */ @@ -7216,7 +7340,7 @@ isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp) goto out; } - for (box = 0; box < MAX_MAILBOX(isp); box++) { + for (box = 0; box < ISP_NMBOX(isp); box++) { if (ibits & (1 << box)) { isp_prt(isp, ISP_LOGDEBUG3, "IN mbox %d = 0x%04x", box, mbp->param[box]); @@ -7259,7 +7383,7 @@ isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp) /* * Copy back output registers. */ - for (box = 0; box < MAX_MAILBOX(isp); box++) { + for (box = 0; box < ISP_NMBOX(isp); box++) { if (obits & (1 << box)) { mbp->param[box] = isp->isp_mboxtmp[box]; isp_prt(isp, ISP_LOGDEBUG3, "OUT mbox %d = 0x%04x", box, @@ -7959,8 +8083,7 @@ isp_parse_nvram_1020(ispsoftc_t *isp, uint8_t *nvram_data) (ISP_NVRAM_FIFO_THRESHOLD_128(nvram_data) << 2); if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0) - sdp->isp_initiator_id = - ISP_NVRAM_INITIATOR_ID(nvram_data); + sdp->isp_initiator_id = ISP_NVRAM_INITIATOR_ID(nvram_data); sdp->isp_bus_reset_delay = ISP_NVRAM_BUS_RESET_DELAY(nvram_data); @@ -8071,8 +8194,7 @@ isp_parse_nvram_1080(ispsoftc_t *isp, int bus, uint8_t *nvram_data) ISP1080_NVRAM_FIFO_THRESHOLD(nvram_data); if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0) - sdp->isp_initiator_id = - ISP1080_NVRAM_INITIATOR_ID(nvram_data, bus); + sdp->isp_initiator_id = ISP1080_NVRAM_INITIATOR_ID(nvram_data, bus); sdp->isp_bus_reset_delay = ISP1080_NVRAM_BUS_RESET_DELAY(nvram_data, bus); @@ -8147,8 +8269,7 @@ isp_parse_nvram_12160(ispsoftc_t *isp, int bus, uint8_t *nvram_data) ISP12160_NVRAM_FIFO_THRESHOLD(nvram_data); if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0) - sdp->isp_initiator_id = - ISP12160_NVRAM_INITIATOR_ID(nvram_data, bus); + sdp->isp_initiator_id = ISP12160_NVRAM_INITIATOR_ID(nvram_data, bus); sdp->isp_bus_reset_delay = ISP12160_NVRAM_BUS_RESET_DELAY(nvram_data, bus); diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c index 56fedff558c..6aea12054bb 100644 --- a/sys/dev/isp/isp_freebsd.c +++ b/sys/dev/isp/isp_freebsd.c @@ -781,6 +781,9 @@ isp_free_pcmd(ispsoftc_t *isp, union ccb *ccb) */ #ifdef ISP_TARGET_MODE +static ISP_INLINE void isp_tmlock(ispsoftc_t *, const char *); +static ISP_INLINE void isp_tmunlk(ispsoftc_t *); +static ISP_INLINE int is_any_lun_enabled(ispsoftc_t *, int); static ISP_INLINE int is_lun_enabled(ispsoftc_t *, int, lun_id_t); static ISP_INLINE tstate_t *get_lun_statep(ispsoftc_t *, int, lun_id_t); static ISP_INLINE tstate_t *get_lun_statep_from_tag(ispsoftc_t *, int, uint32_t); @@ -794,10 +797,11 @@ static ISP_INLINE void isp_put_ntpd(ispsoftc_t *, tstate_t *, inot_private_data_ static cam_status create_lun_state(ispsoftc_t *, int, struct cam_path *, tstate_t **); static void destroy_lun_state(ispsoftc_t *, tstate_t *); static void isp_enable_lun(ispsoftc_t *, union ccb *); -static void isp_enable_deferred_luns(ispsoftc_t *, int); +static cam_status isp_enable_deferred_luns(ispsoftc_t *, int); static cam_status isp_enable_deferred(ispsoftc_t *, int, lun_id_t); static void isp_disable_lun(ispsoftc_t *, union ccb *); static int isp_enable_target_mode(ispsoftc_t *, int); +static int isp_disable_target_mode(ispsoftc_t *, int); static void isp_ledone(ispsoftc_t *, lun_entry_t *); static timeout_t isp_refire_putback_atio; static void isp_complete_ctio(union ccb *); @@ -815,6 +819,40 @@ static void isp_handle_platform_target_tmf(ispsoftc_t *, isp_notify_t *); static void isp_target_mark_aborted(ispsoftc_t *, union ccb *); static void isp_target_mark_aborted_early(ispsoftc_t *, tstate_t *, uint32_t); +static ISP_INLINE void +isp_tmlock(ispsoftc_t *isp, const char *msg) +{ + while (isp->isp_osinfo.tmbusy) { + isp->isp_osinfo.tmwanted = 1; + mtx_sleep(isp, &isp->isp_lock, PRIBIO, msg, 0); + } + isp->isp_osinfo.tmbusy = 1; +} + +static ISP_INLINE void +isp_tmunlk(ispsoftc_t *isp) +{ + isp->isp_osinfo.tmbusy = 0; + if (isp->isp_osinfo.tmwanted) { + isp->isp_osinfo.tmwanted = 0; + wakeup(isp); + } +} + +static ISP_INLINE int +is_any_lun_enabled(ispsoftc_t *isp, int bus) +{ + struct tslist *lhp; + int i; + + for (i = 0; i < LUN_HASH_SIZE; i++) { + ISP_GET_PC_ADDR(isp, bus, lun_hash[i], lhp); + if (SLIST_FIRST(lhp)) + return (1); + } + return (0); +} + static ISP_INLINE int is_lun_enabled(ispsoftc_t *isp, int bus, lun_id_t lun) { @@ -917,6 +955,7 @@ get_ntp_from_tagdata(ispsoftc_t *isp, uint32_t tag_id, uint32_t seq_id, tstate_t } return (NULL); } + static ISP_INLINE void rls_lun_statep(ispsoftc_t *isp, tstate_t *tptr) { @@ -1058,7 +1097,7 @@ create_lun_state(ispsoftc_t *isp, int bus, struct cam_path *path, tstate_t **rsl if (is_lun_enabled(isp, bus, lun)) { return (CAM_LUN_ALRDY_ENA); } - tptr = (tstate_t *) malloc(sizeof (tstate_t), M_DEVBUF, M_NOWAIT|M_ZERO); + tptr = malloc(sizeof (tstate_t), M_DEVBUF, M_NOWAIT|M_ZERO); if (tptr == NULL) { return (CAM_RESRC_UNAVAIL); } @@ -1087,10 +1126,12 @@ static ISP_INLINE void destroy_lun_state(ispsoftc_t *isp, tstate_t *tptr) { struct tslist *lhp; + KASSERT((tptr->hold != 0), ("tptr is not held")); KASSERT((tptr->hold == 1), ("tptr still held (%d)", tptr->hold)); ISP_GET_PC_ADDR(isp, cam_sim_bus(xpt_path_sim(tptr->owner)), lun_hash[LUN_HASH_FUNC(xpt_path_lun_id(tptr->owner))], lhp); SLIST_REMOVE(lhp, tptr, tstate, next); + ISP_PATH_PRT(isp, ISP_LOGTDEBUG0, tptr->owner, "destroyed tstate\n"); xpt_free_path(tptr->owner); free(tptr, M_DEVBUF); } @@ -1106,12 +1147,14 @@ isp_enable_lun(ispsoftc_t *isp, union ccb *ccb) target_id_t target; lun_id_t lun; + /* * We only support either a wildcard target/lun or a target ID of zero and a non-wildcard lun */ bus = XS_CHANNEL(ccb); target = ccb->ccb_h.target_id; lun = ccb->ccb_h.target_lun; + ISP_PATH_PRT(isp, ISP_LOGTDEBUG0|ISP_LOGCONFIG, ccb->ccb_h.path, "enabling lun %u\n", lun); if (target != CAM_TARGET_WILDCARD && target != 0) { ccb->ccb_h.status = CAM_TID_INVALID; xpt_done(ccb); @@ -1135,11 +1178,7 @@ isp_enable_lun(ispsoftc_t *isp, union ccb *ccb) /* * Wait until we're not busy with the lun enables subsystem */ - while (isp->isp_osinfo.tmbusy) { - isp->isp_osinfo.tmwanted = 1; - mtx_sleep(isp, &isp->isp_lock, PRIBIO, "want_isp_enable_lun", 0); - } - isp->isp_osinfo.tmbusy = 1; + isp_tmlock(isp, "isp_enable_lun"); /* * This is as a good a place as any to check f/w capabilities. @@ -1208,7 +1247,7 @@ isp_enable_lun(ispsoftc_t *isp, union ccb *ccb) if (tm_enabled == 0) { ISP_SET_PC(isp, bus, tm_enable_defer, 1); ccb->ccb_h.status = CAM_REQ_CMP; - xpt_print(ccb->ccb_h.path, "Target Mode Not Enabled Yet- Lun Enables Deferred\n"); + xpt_print(ccb->ccb_h.path, "Target Mode not enabled yet- lun enable deferred\n"); goto done; } @@ -1218,37 +1257,78 @@ isp_enable_lun(ispsoftc_t *isp, union ccb *ccb) ccb->ccb_h.status = isp_enable_deferred(isp, bus, lun); done: - if (ccb->ccb_h.status != CAM_REQ_CMP && tptr) { - destroy_lun_state(isp, tptr); - tptr = NULL; + if (ccb->ccb_h.status != CAM_REQ_CMP) { + if (tptr) { + destroy_lun_state(isp, tptr); + tptr = NULL; + } + } else { + tptr->enabled = 1; } if (tptr) { rls_lun_statep(isp, tptr); } - isp->isp_osinfo.tmbusy = 0; - if (isp->isp_osinfo.tmwanted) { - isp->isp_osinfo.tmwanted = 0; - wakeup(isp); - } + + /* + * And we're outta here.... + */ + isp_tmunlk(isp); xpt_done(ccb); } -static void +static cam_status isp_enable_deferred_luns(ispsoftc_t *isp, int bus) { + tstate_t *tptr = NULL; + struct tslist *lhp; + int i, n; + + ISP_GET_PC(isp, bus, tm_enabled, i); + if (i == 1) { + return (CAM_REQ_CMP); + } + ISP_GET_PC(isp, bus, tm_enable_defer, i); + if (i == 0) { + return (CAM_REQ_CMP); + } /* - * XXX: not entirely implemented yet + * If this succeeds, it will set tm_enable */ - (void) isp_enable_deferred(isp, bus, 0); + if (isp_enable_target_mode(isp, bus)) { + return (CAM_REQ_CMP_ERR); + } + isp_tmlock(isp, "isp_enable_deferred_luns"); + for (n = i = 0; i < LUN_HASH_SIZE; i++) { + ISP_GET_PC_ADDR(isp, bus, lun_hash[i], lhp); + SLIST_FOREACH(tptr, lhp, next) { + tptr->hold++; + if (tptr->enabled == 0) { + if (isp_enable_deferred(isp, bus, xpt_path_lun_id(tptr->owner)) == 0) { + tptr->enabled = 1; + n++; + } + } else { + n++; + } + tptr->hold--; + } + } + isp_tmunlk(isp); + if (n == 0) { + return (CAM_REQ_CMP_ERR); + } + ISP_SET_PC(isp, bus, tm_enable_defer, 0); + return (CAM_REQ_CMP); } -static uint32_t +static cam_status isp_enable_deferred(ispsoftc_t *isp, int bus, lun_id_t lun) { cam_status status; + int luns_already_enabled = ISP_FC_PC(isp, bus)->tm_luns_enabled; isp_prt(isp, ISP_LOGTINFO, "%s: bus %d lun %u", __func__, bus, lun); - if (IS_24XX(isp) || (IS_FC(isp) && ISP_FC_PC(isp, bus)->tm_luns_enabled)) { + if (IS_24XX(isp) || (IS_FC(isp) && luns_already_enabled)) { status = CAM_REQ_CMP; } else { int cmd_cnt, not_cnt; @@ -1269,10 +1349,9 @@ isp_enable_deferred(ispsoftc_t *isp, int bus, lun_id_t lun) } isp->isp_osinfo.rptr = NULL; } - if (status == CAM_REQ_CMP) { ISP_SET_PC(isp, bus, tm_luns_enabled, 1); - isp_prt(isp, ISP_LOGTINFO, "bus %d lun %u now enabled for target mode", bus, lun); + isp_prt(isp, ISP_LOGCONFIG|ISP_LOGTINFO, "bus %d lun %u now enabled for target mode", bus, lun); } return (status); } @@ -1289,11 +1368,13 @@ isp_disable_lun(ispsoftc_t *isp, union ccb *ccb) bus = XS_CHANNEL(ccb); target = ccb->ccb_h.target_id; lun = ccb->ccb_h.target_lun; + ISP_PATH_PRT(isp, ISP_LOGTDEBUG0|ISP_LOGCONFIG, ccb->ccb_h.path, "disabling lun %u\n", lun); if (target != CAM_TARGET_WILDCARD && target != 0) { ccb->ccb_h.status = CAM_TID_INVALID; xpt_done(ccb); return; } + if (target == CAM_TARGET_WILDCARD && lun != CAM_LUN_WILDCARD) { ccb->ccb_h.status = CAM_LUN_INVALID; xpt_done(ccb); @@ -1305,18 +1386,11 @@ isp_disable_lun(ispsoftc_t *isp, union ccb *ccb) xpt_done(ccb); return; } - if (isp->isp_dblev & ISP_LOGTDEBUG0) { - xpt_print(ccb->ccb_h.path, "enabling lun 0x%x on channel %d\n", lun, bus); - } /* * See if we're busy disabling a lun now. */ - while (isp->isp_osinfo.tmbusy) { - isp->isp_osinfo.tmwanted = 1; - mtx_sleep(isp, &isp->isp_lock, PRIBIO, "want_isp_disable_lun", 0); - } - isp->isp_osinfo.tmbusy = 1; + isp_tmlock(isp, "isp_disable_lun"); status = CAM_REQ_INPROG; /* @@ -1341,85 +1415,86 @@ isp_disable_lun(ispsoftc_t *isp, union ccb *ccb) if (IS_FC(isp)) { lun = 0; } - isp->isp_osinfo.rptr = &status; if (isp_lun_cmd(isp, RQSTYPE_ENABLE_LUN, bus, lun, 0, 0)) { status = CAM_RESRC_UNAVAIL; } else { mtx_sleep(ccb, &isp->isp_lock, PRIBIO, "isp_disable_lun", 0); } + isp->isp_osinfo.rptr = NULL; done: + if (status == CAM_REQ_CMP) { + tptr->enabled = 0; + /* + * If we have no more luns enabled for this bus, delete all tracked wwns for it (if we are FC) + * and disable target mode. + */ + if (is_any_lun_enabled(isp, bus) == 0) { + isp_del_all_wwn_entries(isp, bus); + if (isp_disable_target_mode(isp, bus)) { + status = CAM_REQ_CMP_ERR; + } + } + } ccb->ccb_h.status = status; if (status == CAM_REQ_CMP) { - xpt_print(ccb->ccb_h.path, "now disabled for target mode\n"); - } - if (tptr) { + xpt_print(ccb->ccb_h.path, "lun now disabled for target mode\n"); destroy_lun_state(isp, tptr); + } else { + if (tptr) + rls_lun_statep(isp, tptr); } - isp->isp_osinfo.rptr = NULL; - isp->isp_osinfo.tmbusy = 0; - if (isp->isp_osinfo.tmwanted) { - isp->isp_osinfo.tmwanted = 0; - wakeup(isp); - } + isp_tmunlk(isp); xpt_done(ccb); } static int isp_enable_target_mode(ispsoftc_t *isp, int bus) { - int ct; + int tm_enabled; - ISP_GET_PC(isp, bus, tm_enabled, ct); - if (ct != 0) { + ISP_GET_PC(isp, bus, tm_enabled, tm_enabled); + if (tm_enabled != 0) { return (0); } - if (IS_SCSI(isp)) { mbreg_t mbs; - MBSINIT(&mbs, MBOX_ENABLE_TARGET_MODE, MBLOGALL, 0); mbs.param[0] = MBOX_ENABLE_TARGET_MODE; mbs.param[1] = ENABLE_TARGET_FLAG|ENABLE_TQING_FLAG; mbs.param[2] = bus << 7; if (isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs) < 0 || mbs.param[0] != MBOX_COMMAND_COMPLETE) { - isp_prt(isp, ISP_LOGERR, "Unable to add Target Role to Bus %d", bus); + isp_prt(isp, ISP_LOGERR, "Unable to enable Target Role on Bus %d", bus); return (EIO); } - SDPARAM(isp, bus)->role |= ISP_ROLE_TARGET; } ISP_SET_PC(isp, bus, tm_enabled, 1); - isp_prt(isp, ISP_LOGINFO, "Target Role added to Bus %d", bus); + isp_prt(isp, ISP_LOGINFO, "Target Role enabled on Bus %d", bus); return (0); } -#ifdef NEEDED static int isp_disable_target_mode(ispsoftc_t *isp, int bus) { - int ct; + int tm_enabled; - ISP_GET_PC(isp, bus, tm_enabled, ct); - if (ct == 0) { + ISP_GET_PC(isp, bus, tm_enabled, tm_enabled); + if (tm_enabled == 0) { return (0); } - if (IS_SCSI(isp)) { mbreg_t mbs; - MBSINIT(&mbs, MBOX_ENABLE_TARGET_MODE, MBLOGALL, 0); mbs.param[2] = bus << 7; if (isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs) < 0 || mbs.param[0] != MBOX_COMMAND_COMPLETE) { - isp_prt(isp, ISP_LOGERR, "Unable to subtract Target Role to Bus %d", bus); + isp_prt(isp, ISP_LOGERR, "Unable to disable Target Role on Bus %d", bus); return (EIO); } - SDPARAM(isp, bus)->role &= ~ISP_ROLE_TARGET; } ISP_SET_PC(isp, bus, tm_enabled, 0); - isp_prt(isp, ISP_LOGINFO, "Target Role subtracted from Bus %d", bus); + isp_prt(isp, ISP_LOGINFO, "Target Role disabled onon Bus %d", bus); return (0); } -#endif static void isp_ledone(ispsoftc_t *isp, lun_entry_t *lep) @@ -2135,6 +2210,7 @@ isp_handle_platform_atio7(ispsoftc_t *isp, at7_entry_t *aep) tstate_t *tptr; struct ccb_accept_tio *atiop; atio_private_data_t *atp = NULL; + atio_private_data_t *oatp; inot_private_data_t *ntp; did = (aep->at_hdr.d_id[0] << 16) | (aep->at_hdr.d_id[1] << 8) | aep->at_hdr.d_id[2]; @@ -2229,6 +2305,7 @@ isp_handle_platform_atio7(ispsoftc_t *isp, at7_entry_t *aep) * it and go to noresrc. */ if (tptr->restart_queue) { + isp_prt(isp, ISP_LOGTDEBUG0, "%s: restart queue refilling", __func__); if (restart_queue) { ntp = tptr->restart_queue; tptr->restart_queue = restart_queue; @@ -2265,15 +2342,15 @@ isp_handle_platform_atio7(ispsoftc_t *isp, at7_entry_t *aep) isp_prt(isp, ISP_LOGTDEBUG0, "[0x%x] out of atps", aep->at_rxid); goto noresrc; } - if (isp_get_atpd(isp, tptr, aep->at_rxid)) { - isp_prt(isp, ISP_LOGTDEBUG0, "[0x%x] tag wraparound in isp_handle_platforms_atio7 (N-Port Handle 0x%04x S_ID 0x%04x OX_ID 0x%04x)\n", - aep->at_rxid, nphdl, sid, aep->at_hdr.ox_id); + oatp = isp_get_atpd(isp, tptr, aep->at_rxid); + if (oatp) { + isp_prt(isp, ISP_LOGTDEBUG0, "[0x%x] tag wraparound in isp_handle_platforms_atio7 (N-Port Handle 0x%04x S_ID 0x%04x OX_ID 0x%04x) oatp state %d\n", + aep->at_rxid, nphdl, sid, aep->at_hdr.ox_id, oatp->state); /* * It's not a "no resource" condition- but we can treat it like one */ goto noresrc; } - atp->tag = aep->at_rxid; atp->state = ATPD_STATE_ATIO; SLIST_REMOVE_HEAD(&tptr->atios, sim_links.sle); @@ -2319,6 +2396,7 @@ isp_handle_platform_atio7(ispsoftc_t *isp, at7_entry_t *aep) atp->nphdl = nphdl; atp->portid = sid; atp->oxid = aep->at_hdr.ox_id; + atp->rxid = aep->at_hdr.rx_id; atp->cdb0 = atiop->cdb_io.cdb_bytes[0]; atp->tattr = aep->at_cmnd.fcp_cmnd_task_attribute & FCP_CMND_TASK_ATTR_MASK; atp->state = ATPD_STATE_CAM; @@ -4439,7 +4517,7 @@ isp_action(struct cam_sim *sim, union ccb *ccb) tptr->atio_count++; SLIST_INSERT_HEAD(&tptr->atios, &ccb->ccb_h, sim_links.sle); ISP_PATH_PRT(isp, ISP_LOGTDEBUG0, ccb->ccb_h.path, "Put FREE ATIO (tag id 0x%x), count now %d\n", - ((struct ccb_accept_tio *)ccb)->tag_id, tptr->atio_count); + ccb->atio.tag_id, tptr->atio_count); } else if (ccb->ccb_h.func_code == XPT_IMMEDIATE_NOTIFY) { if (ccb->cin1.tag_id) { inot_private_data_t *ntp = isp_find_ntpd(isp, tptr, ccb->cin1.tag_id, ccb->cin1.seq_id); @@ -4450,12 +4528,12 @@ isp_action(struct cam_sim *sim, union ccb *ccb) tptr->inot_count++; SLIST_INSERT_HEAD(&tptr->inots, &ccb->ccb_h, sim_links.sle); ISP_PATH_PRT(isp, ISP_LOGTDEBUG0, ccb->ccb_h.path, "Put FREE INOT, (seq id 0x%x) count now %d\n", - ((struct ccb_immediate_notify *)ccb)->seq_id, tptr->inot_count); + ccb->cin1.seq_id, tptr->inot_count); } else if (ccb->ccb_h.func_code == XPT_IMMED_NOTIFY) { tptr->inot_count++; SLIST_INSERT_HEAD(&tptr->inots, &ccb->ccb_h, sim_links.sle); ISP_PATH_PRT(isp, ISP_LOGTDEBUG0, ccb->ccb_h.path, "Put FREE INOT, (seq id 0x%x) count now %d\n", - ((struct ccb_immediate_notify *)ccb)->seq_id, tptr->inot_count); + ccb->cin1.seq_id, tptr->inot_count); } rls_lun_statep(isp, tptr); ccb->ccb_h.status = CAM_REQ_INPROG; @@ -4738,7 +4816,6 @@ isp_action(struct cam_sim *sim, union ccb *ccb) struct ccb_sim_knob *kp = &ccb->knob; fcparam *fcp; - if (!IS_FC(isp)) { ccb->ccb_h.status = CAM_REQ_INVALID; xpt_done(ccb); @@ -4796,11 +4873,12 @@ isp_action(struct cam_sim *sim, union ccb *ccb) break; } if (rchange) { + ISP_PATH_PRT(isp, ISP_LOGCONFIG, ccb->ccb_h.path, "changing role on from %d to %d\n", fcp->role, newrole); if (isp_fc_change_role(isp, bus, newrole) != 0) { ccb->ccb_h.status = CAM_REQ_CMP_ERR; #ifdef ISP_TARGET_MODE } else if (newrole == ISP_ROLE_TARGET || newrole == ISP_ROLE_BOTH) { - isp_enable_deferred_luns(isp, bus); + ccb->ccb_h.status = isp_enable_deferred_luns(isp, bus); #endif } } @@ -4808,7 +4886,7 @@ isp_action(struct cam_sim *sim, union ccb *ccb) xpt_done(ccb); break; } - case XPT_GET_SIM_KNOB: /* Set SIM knobs */ + case XPT_GET_SIM_KNOB: /* Get SIM knobs */ { struct ccb_sim_knob *kp = &ccb->knob; diff --git a/sys/dev/isp/isp_freebsd.h b/sys/dev/isp/isp_freebsd.h index e212e119338..001c699943b 100644 --- a/sys/dev/isp/isp_freebsd.h +++ b/sys/dev/isp/isp_freebsd.h @@ -62,7 +62,7 @@ #include "opt_isp.h" #define ISP_PLATFORM_VERSION_MAJOR 7 -#define ISP_PLATFORM_VERSION_MINOR 0 +#define ISP_PLATFORM_VERSION_MINOR 10 /* * Efficiency- get rid of SBus code && tests unless we need them. @@ -93,13 +93,14 @@ typedef struct { uint32_t orig_datalen; uint32_t bytes_xfered; uint32_t last_xframt; - uint32_t tag; + uint32_t tag; /* typically f/w RX_ID */ uint32_t lun; uint32_t nphdl; uint32_t sid; uint32_t portid; + uint16_t rxid; /* wire rxid */ + uint16_t oxid; /* wire oxid */ uint32_t - oxid : 16, cdb0 : 8, : 1, dead : 1, @@ -129,8 +130,10 @@ typedef struct tstate { struct ccb_hdr_slist atios; struct ccb_hdr_slist inots; uint32_t hold; - int atio_count; - int inot_count; + uint32_t + enabled : 1, + atio_count : 15, + inot_count : 15; inot_private_data_t * restart_queue; inot_private_data_t * ntfree; inot_private_data_t ntpool[ATPDPSIZE]; @@ -151,6 +154,7 @@ struct isp_pcmd { bus_dmamap_t dmap; /* dma map for this command */ struct ispsoftc * isp; /* containing isp */ struct callout wdog; /* watchdog timer */ + uint8_t crn; /* command reference number */ }; #define ISP_PCMD(ccb) (ccb)->ccb_h.spriv_ptr1 #define PISP_PCMD(ccb) ((struct isp_pcmd *)ISP_PCMD(ccb)) @@ -199,6 +203,7 @@ struct isp_fc { struct proc * target_proc; #endif #endif + uint8_t crnseed; /* next command reference number */ }; struct isp_spi { @@ -261,7 +266,6 @@ struct isposinfo { #else : 2, #endif - forcemulti : 1, timer_active : 1, autoconf : 1, ehook_active : 1, @@ -314,6 +318,16 @@ struct isposinfo { ISP_FC_PC(isp, chan)-> tag = val; \ } +#define FCP_NEXT_CRN(isp, cmd, rslt, chan, tgt, lun) \ + if ((isp)->isp_osinfo.pc.fc[(chan)].crnseed == 0) { \ + (isp)->isp_osinfo.pc.fc[(chan)].crnseed = 1; \ + } \ + if (cmd) { \ + PISP_PCMD(cmd)->crn = (isp)->isp_osinfo.pc.fc[(chan)].crnseed; \ + } \ + (rslt) = (isp)->isp_osinfo.pc.fc[(chan)].crnseed++ + + #define isp_lock isp_osinfo.lock #define isp_bus_tag isp_osinfo.bus_tag #define isp_bus_handle isp_osinfo.bus_handle @@ -637,7 +651,6 @@ extern int isp_autoconfig; #define XS_CMD_C_WPEND(sccb) (sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_WPEND #define XS_CMD_WPEND_P(sccb) ((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_WPEND) - #define XS_CMD_S_CLEAR(sccb) (sccb)->ccb_h.spriv_field0 = 0 /* diff --git a/sys/dev/isp/isp_pci.c b/sys/dev/isp/isp_pci.c index 9a0bc4a146b..7a852cbe562 100644 --- a/sys/dev/isp/isp_pci.c +++ b/sys/dev/isp/isp_pci.c @@ -372,6 +372,9 @@ static driver_t isp_pci_driver = { }; static devclass_t isp_devclass; DRIVER_MODULE(isp, pci, isp_pci_driver, isp_devclass, 0, 0); +MODULE_DEPEND(isp, cam, 1, 1, 1); +MODULE_DEPEND(isp, firmware, 1, 1, 1); +static int isp_nvports = 0; static int isp_pci_probe(device_t dev) @@ -449,7 +452,7 @@ isp_pci_probe(device_t dev) } static void -isp_get_generic_options(device_t dev, ispsoftc_t *isp, int *nvp) +isp_get_generic_options(device_t dev, ispsoftc_t *isp) { int tval; @@ -481,11 +484,10 @@ isp_get_generic_options(device_t dev, ispsoftc_t *isp, int *nvp) if (bootverbose) { isp->isp_dblev |= ISP_LOGCONFIG|ISP_LOGINFO; } + tval = -1; (void) resource_int_value(device_get_name(dev), device_get_unit(dev), "vports", &tval); if (tval > 0 && tval < 127) { - *nvp = tval; - } else { - *nvp = 0; + isp_nvports = tval; } tval = 1; (void) resource_int_value(device_get_name(dev), device_get_unit(dev), "autoconfig", &tval); @@ -493,11 +495,6 @@ isp_get_generic_options(device_t dev, ispsoftc_t *isp, int *nvp) tval = 7; (void) resource_int_value(device_get_name(dev), device_get_unit(dev), "quickboot_time", &tval); isp_quickboot_time = tval; - - tval = 0; - if (resource_int_value(device_get_name(dev), device_get_unit(dev), "forcemulti", &tval) == 0 && tval != 0) { - isp->isp_osinfo.forcemulti = 1; - } } static void @@ -529,7 +526,7 @@ static void isp_get_specific_options(device_t dev, int chan, ispsoftc_t *isp) { const char *sptr; - int tval; + int tval = 0; if (resource_int_value(device_get_name(dev), device_get_unit(dev), "iid", &tval)) { if (IS_FC(isp)) { @@ -650,7 +647,6 @@ static int isp_pci_attach(device_t dev) { int i, m1, m2, locksetup = 0; - int isp_nvports = 0; uint32_t data, cmd, linesz, did; struct isp_pcisoftc *pcs; ispsoftc_t *isp; @@ -672,7 +668,8 @@ isp_pci_attach(device_t dev) /* * Get Generic Options */ - isp_get_generic_options(dev, isp, &isp_nvports); + isp_nvports = 0; + isp_get_generic_options(dev, isp); /* * Check to see if options have us disabled @@ -862,7 +859,7 @@ isp_pci_attach(device_t dev) if (IS_SCSI(isp) && (ISP_SPI_PC(isp, 0)->def_role & ISP_ROLE_TARGET)) { snprintf(fwname, sizeof (fwname), "isp_%04x_it", did); isp->isp_osinfo.fw = firmware_get(fwname); - } else if (IS_24XX(isp) && (isp->isp_nchan > 1 || isp->isp_osinfo.forcemulti)) { + } else if (IS_24XX(isp)) { snprintf(fwname, sizeof (fwname), "isp_%04x_multi", did); isp->isp_osinfo.fw = firmware_get(fwname); } @@ -871,28 +868,23 @@ isp_pci_attach(device_t dev) isp->isp_osinfo.fw = firmware_get(fwname); } if (isp->isp_osinfo.fw != NULL) { + isp_prt(isp, ISP_LOGCONFIG, "loaded firmware %s", fwname); isp->isp_mdvec->dv_ispfw = isp->isp_osinfo.fw->data; } /* - * Make sure that SERR, PERR, WRITE INVALIDATE and BUSMASTER - * are set. + * Make sure that SERR, PERR, WRITE INVALIDATE and BUSMASTER are set. */ - cmd |= PCIM_CMD_SEREN | PCIM_CMD_PERRESPEN | - PCIM_CMD_BUSMASTEREN | PCIM_CMD_INVEN; - + cmd |= PCIM_CMD_SEREN | PCIM_CMD_PERRESPEN | PCIM_CMD_BUSMASTEREN | PCIM_CMD_INVEN; if (IS_2300(isp)) { /* per QLogic errata */ cmd &= ~PCIM_CMD_INVEN; } - if (IS_2322(isp) || pci_get_devid(dev) == PCI_QLOGIC_ISP6312) { cmd &= ~PCIM_CMD_INTX_DISABLE; } - if (IS_24XX(isp)) { cmd &= ~PCIM_CMD_INTX_DISABLE; } - pci_write_config(dev, PCIR_COMMAND, cmd, 2); /* @@ -900,7 +892,7 @@ isp_pci_attach(device_t dev) */ data = pci_read_config(dev, PCIR_CACHELNSZ, 1); if (data == 0 || (linesz != PCI_DFLT_LNSZ && data != linesz)) { - isp_prt(isp, ISP_LOGCONFIG, "set PCI line size to %d from %d", linesz, data); + isp_prt(isp, ISP_LOGDEBUG0, "set PCI line size to %d from %d", linesz, data); data = linesz; pci_write_config(dev, PCIR_CACHELNSZ, data, 1); } @@ -911,7 +903,7 @@ isp_pci_attach(device_t dev) data = pci_read_config(dev, PCIR_LATTIMER, 1); if (data < PCI_DFLT_LTNCY) { data = PCI_DFLT_LTNCY; - isp_prt(isp, ISP_LOGCONFIG, "set PCI latency to %d", data); + isp_prt(isp, ISP_LOGDEBUG0, "set PCI latency to %d", data); pci_write_config(dev, PCIR_LATTIMER, data, 1); } diff --git a/sys/dev/isp/isp_sbus.c b/sys/dev/isp/isp_sbus.c index c4e92f202ce..26452e65b61 100644 --- a/sys/dev/isp/isp_sbus.c +++ b/sys/dev/isp/isp_sbus.c @@ -106,6 +106,8 @@ static driver_t isp_sbus_driver = { }; static devclass_t isp_devclass; DRIVER_MODULE(isp, sbus, isp_sbus_driver, isp_devclass, 0, 0); +MODULE_DEPEND(isp, cam, 1, 1, 1); +MODULE_DEPEND(isp, firmware, 1, 1, 1); static int isp_sbus_probe(device_t dev) diff --git a/sys/dev/isp/ispmbox.h b/sys/dev/isp/ispmbox.h index 36a73913ac8..c86ce603096 100644 --- a/sys/dev/isp/ispmbox.h +++ b/sys/dev/isp/ispmbox.h @@ -847,20 +847,39 @@ typedef struct { #define ISP2400_FW_ATTR_SB2 0x0008 #define ISP2400_FW_ATTR_T10CRC 0x0010 #define ISP2400_FW_ATTR_VI 0x0020 +#define ISP2400_FW_ATTR_VP0 0x1000 #define ISP2400_FW_ATTR_EXPFW 0x2000 +#define ISP2400_FW_ATTR_EXTNDED 0x8000 +/* + * These are either manifestly true or are dependent on f/w attributes + */ #define ISP_CAP_TMODE(isp) \ (IS_24XX(isp)? 1 : (isp->isp_fwattr & ISP_FW_ATTR_TMODE)) #define ISP_CAP_SCCFW(isp) \ (IS_24XX(isp)? 1 : (isp->isp_fwattr & ISP_FW_ATTR_SCCLUN)) #define ISP_CAP_2KLOGIN(isp) \ (IS_24XX(isp)? 1 : (isp->isp_fwattr & ISP_FW_ATTR_2KLOGINS)) + +/* + * This is only true for 24XX cards with this f/w attribute + */ #define ISP_CAP_MULTI_ID(isp) \ (IS_24XX(isp)? (isp->isp_fwattr & ISP2400_FW_ATTR_MULTIID) : 0) - #define ISP_GET_VPIDX(isp, tag) \ (ISP_CAP_MULTI_ID(isp) ? tag : 0) +/* + * This is true manifestly or is dependent on a f/w attribute + * but may or may not actually be *enabled*. In any case, it + * is enabled on a per-channel basis. + */ +#define ISP_CAP_FCTAPE(isp) \ + (IS_24XX(isp)? 1 : (isp->isp_fwattr & ISP_FW_ATTR_FCTAPE)) + +#define ISP_FCTAPE_ENABLED(isp, chan) \ + (IS_24XX(isp)? (FCPARAM(isp, chan)->isp_xfwoptions & ICB2400_OPT2_FCTAPE) != 0 : (FCPARAM(isp, chan)->isp_xfwoptions & ICBXOPT_FCTAPE) != 0) + /* * Reduced Interrupt Operation Response Queue Entries */ @@ -985,7 +1004,9 @@ typedef struct { #define ICB2400_OPT1_FAIRNESS 0x00000002 #define ICB2400_OPT1_HARD_ADDRESS 0x00000001 +#define ICB2400_OPT2_TPRLIC 0x00004000 #define ICB2400_OPT2_FCTAPE 0x00001000 +#define ICB2400_OPT2_FCSP 0x00000800 #define ICB2400_OPT2_CLASS2_ACK0 0x00000200 #define ICB2400_OPT2_CLASS2 0x00000100 #define ICB2400_OPT2_NO_PLAY 0x00000080 @@ -993,8 +1014,7 @@ typedef struct { #define ICB2400_OPT2_LOOP_ONLY 0x00000000 #define ICB2400_OPT2_PTP_ONLY 0x00000010 #define ICB2400_OPT2_LOOP_2_PTP 0x00000020 -#define ICB2400_OPT2_PTP_2_LOOP 0x00000030 -#define ICB2400_OPT2_TIMER_MASK 0x00000007 +#define ICB2400_OPT2_TIMER_MASK 0x0000000f #define ICB2400_OPT2_ZIO 0x00000005 #define ICB2400_OPT2_ZIO1 0x00000006 @@ -1137,7 +1157,9 @@ typedef struct { ICB2400_VPINFO_OFF + \ sizeof (isp_icb_2400_vpinfo_t) + ((chan - 1) * ICB2400_VPOPT_WRITE_SIZE) -#define ICB2400_VPGOPT_MID_DISABLE 0x02 +#define ICB2400_VPGOPT_FCA 0x01 /* Assume Clean Address bit in FLOGI ACC set (works only in static configurations) */ +#define ICB2400_VPGOPT_MID_DISABLE 0x02 /* when set, connection mode2 will work with NPIV-capable switched */ +#define ICB2400_VPGOPT_VP0_DECOUPLE 0x04 /* Allow VP0 decoupling if firmware supports it */ typedef struct { isphdr_t vp_ctrl_hdr; diff --git a/sys/dev/isp/ispreg.h b/sys/dev/isp/ispreg.h index 2d616aeb180..3460d249635 100644 --- a/sys/dev/isp/ispreg.h +++ b/sys/dev/isp/ispreg.h @@ -456,21 +456,16 @@ * 2300/2400: 32 MBOX registers */ #define MBOX_OFF(n) (MBOX_BLOCK + ((n) << 1)) -#define NMBOX(isp) \ - (((((isp)->isp_type & ISP_HA_SCSI) >= ISP_HA_SCSI_1040A) || \ - ((isp)->isp_type & ISP_HA_FC))? 12 : 6) -#define NMBOX_BMASK(isp) \ - (((((isp)->isp_type & ISP_HA_SCSI) >= ISP_HA_SCSI_1040A) || \ - ((isp)->isp_type & ISP_HA_FC))? 0xfff : 0x3f) - -#define MAX_MAILBOX(isp) ((IS_FC(isp))? 12 : 8) -#define MAILBOX_STORAGE 12 +#define ISP_NMBOX(isp) ((IS_24XX(isp) || IS_23XX(isp))? 32 : (IS_2200(isp) ? 24 : 8)) +#define ISP_NMBOX_BMASK(isp) \ + ((IS_24XX(isp) || IS_23XX(isp))? 0xffffffff : (IS_2200(isp)? 0x00ffffff : 0xff)) +#define MAX_MAILBOX 32 /* if timeout == 0, then default timeout is picked */ #define MBCMD_DEFAULT_TIMEOUT 100000 /* 100 ms */ typedef struct { - uint16_t param[MAILBOX_STORAGE]; - uint16_t ibits; - uint16_t obits; + uint16_t param[MAX_MAILBOX]; + uint32_t ibits; + uint32_t obits; uint32_t lineno : 16, : 12, diff --git a/sys/dev/isp/ispvar.h b/sys/dev/isp/ispvar.h index 55edc17228c..253cdd31137 100644 --- a/sys/dev/isp/ispvar.h +++ b/sys/dev/isp/ispvar.h @@ -448,8 +448,6 @@ typedef struct { typedef struct { uint32_t link_active : 1, - npiv_fabric : 1, - inorder : 1, sendmarker : 1, role : 2, isp_gbspeed : 4, @@ -469,6 +467,7 @@ typedef struct { uint16_t isp_sns_hdl; /* N-port handle for SNS */ uint16_t isp_lasthdl; /* only valid for channel 0 */ uint16_t isp_maxalloc; + uint16_t isp_fabric_params; uint8_t isp_retry_delay; uint8_t isp_retry_count; @@ -562,10 +561,12 @@ struct ispsoftc { */ void * isp_param; /* type specific */ + uint64_t isp_fwattr; /* firmware attributes */ uint16_t isp_fwrev[3]; /* Loaded F/W revision */ uint16_t isp_maxcmds; /* max possible I/O cmds */ uint8_t isp_type; /* HBA Chip Type */ uint8_t isp_revision; /* HBA Chip H/W Revision */ + uint16_t isp_nchan; /* number of channels */ uint32_t isp_maxluns; /* maximum luns supported */ uint32_t isp_clock : 8, /* input clock */ @@ -576,8 +577,6 @@ struct ispsoftc { isp_loaded_fw : 1, /* loaded firmware */ isp_dblev : 16; /* debug log mask */ - uint16_t isp_fwattr; /* firmware attributes */ - uint16_t isp_nchan; /* number of channels */ uint32_t isp_confopts; /* config options */ @@ -617,7 +616,7 @@ struct ispsoftc { volatile uint32_t isp_resodx; /* index of next result */ volatile uint32_t isp_obits; /* mailbox command output */ volatile uint32_t isp_serno; /* rolling serial number */ - volatile uint16_t isp_mboxtmp[MAILBOX_STORAGE]; + volatile uint16_t isp_mboxtmp[MAX_MAILBOX]; volatile uint16_t isp_lastmbxcmd; /* last mbox command sent */ volatile uint16_t isp_mbxwrk0; volatile uint16_t isp_mbxwrk1; @@ -679,7 +678,7 @@ struct ispsoftc { #define ISP_RUNSTATE 4 /* - * ISP Configuration Options + * ISP Runtime Configuration Options */ #define ISP_CFG_NORELOAD 0x80 /* don't download f/w */ #define ISP_CFG_NONVRAM 0x40 /* ignore NVRAM */ @@ -695,6 +694,7 @@ struct ispsoftc { #define ISP_CFG_OWNLOOPID 0x800 /* override NVRAM loopid */ #define ISP_CFG_OWNEXCTHROTTLE 0x1000 /* override NVRAM execution throttle */ #define ISP_CFG_FOURGB 0x2000 /* force 4GB connection (24XX only) */ +#define ISP_CFG_EIGHTGB 0x4000 /* force 8GB connection (25XX only) */ /* * For each channel, the outer layers should know what role that channel @@ -724,8 +724,17 @@ struct ispsoftc { #define ISP_ROLE_BOTH (ISP_ROLE_TARGET|ISP_ROLE_INITIATOR) #define ISP_ROLE_EITHER ISP_ROLE_BOTH #ifndef ISP_DEFAULT_ROLES +/* + * Counterintuitively, we prefer to default to role 'none' + * if we are enable target mode support. This gives us the + * maximum flexibility as to which port will do what. + */ +#ifdef ISP_TARGET_MODE +#define ISP_DEFAULT_ROLES ISP_ROLE_NONE +#else #define ISP_DEFAULT_ROLES ISP_ROLE_INITIATOR #endif +#endif /* @@ -1031,6 +1040,8 @@ void isp_prt_endcmd(ispsoftc_t *, XS_T *); * return -1 if you cannot * FC_SCRATCH_RELEASE(ispsoftc_t *, chan) acquire lock on FC scratch area * + * FCP_NEXT_CRN(ispsoftc_t *, XS_T *, rslt, channel, target, lun) generate the next command reference number. XS_T * may be null. + * * SCSI_GOOD SCSI 'Good' Status * SCSI_CHECK SCSI 'Check Condition' Status * SCSI_BUSY SCSI 'Busy' Status diff --git a/sys/dev/ispfw/asm_2400.h b/sys/dev/ispfw/asm_2400.h index e90578338b3..8891f472d4b 100644 --- a/sys/dev/ispfw/asm_2400.h +++ b/sys/dev/ispfw/asm_2400.h @@ -24,29 +24,24 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/************************************************************************ - * * - * ISP2400 Firmware * - * * - ************************************************************************/ -#ifdef ISP_2400 /* - * Firmware Version 5.04.00 (12:18 Jul 02, 2010) + * Firmware Version 5.05.00 (15:31 Dec 14, 2010) */ +#ifdef ISP_2400 static const uint32_t isp_2400_risc_code[] = { - 0x0401f195, 0x00110000, 0x00100000, 0x0000aebb, - 0x00000005, 0x00000004, 0x00000000, 0x00000482, + 0x0401f195, 0x00110000, 0x00100000, 0x0000afb1, + 0x00000005, 0x00000005, 0x00000000, 0x00008482, 0x00000003, 0x00000000, 0x20434f50, 0x59524947, 0x48542032, 0x30303720, 0x514c4f47, 0x49432043, 0x4f52504f, 0x52415449, 0x4f4e2020, 0x20495350, 0x32347878, 0x20466972, 0x6d776172, 0x65202020, - 0x56657273, 0x696f6e20, 0x2020352e, 0x30342e30, + 0x56657273, 0x696f6e20, 0x2020352e, 0x30352e30, 0x30202024, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x42001800, 0x0010014c, 0x42002000, 0x0010bcc7, + 0x42001800, 0x0010014c, 0x42002000, 0x0010bdc7, 0x500c0800, 0x800c1800, 0x500c1000, 0x800c1800, 0x54042000, 0x80102000, 0x80040800, 0x80081040, 0x040207fc, 0x500c0800, 0x800409c0, 0x040207f6, @@ -129,11 +124,11 @@ static const uint32_t isp_2400_risc_code[] = { 0x00006150, 0x00000010, 0x00006170, 0x00000010, 0x00006190, 0x00000010, 0x000061b0, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00100000, 0x00100000, 0x0000aebb, + 0x00000000, 0x00100000, 0x00100000, 0x0000afb1, 0xffffffff, 0x00110004, 0x00020000, 0x00000b53, - 0xffffffff, 0x00110b57, 0x0010d600, 0x00001ab8, - 0xffffffff, 0x0011260f, 0x0000c000, 0x000007e8, - 0x00ffffff, 0x00112df7, 0x00008000, 0x000005de, + 0xffffffff, 0x00110b57, 0x0010d700, 0x00001ac0, + 0xffffffff, 0x00112617, 0x0000c000, 0x000007e8, + 0x00ffffff, 0x00112dff, 0x00008000, 0x000005e5, 0x00ffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4203f000, 0x00021fff, 0x40000000, 0x4203e000, 0x90000100, 0x40000000, 0x42000800, @@ -141,11 +136,11 @@ static const uint32_t isp_2400_risc_code[] = { 0x00007023, 0x50000000, 0x8c000500, 0x04020003, 0x42000800, 0x00020000, 0x45780800, 0x80040800, 0x82040580, 0x00022000, 0x040207fc, 0x4178a000, - 0x4200a800, 0x0010aebb, 0x42000800, 0x0010d600, - 0x40540000, 0x8004b480, 0x0201f800, 0x0010adf8, + 0x4200a800, 0x0010afb1, 0x42000800, 0x0010d700, + 0x40540000, 0x8004b480, 0x0201f800, 0x0010aeeb, 0x0401fac9, 0x0401fa00, 0x4803c856, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24320002, - 0x0402000d, 0x0201f800, 0x0010ae33, 0x04000008, + 0x0402000d, 0x0201f800, 0x0010af26, 0x04000008, 0x42000800, 0x00007a17, 0x50040000, 0x8c00050e, 0x04020003, 0x8400054e, 0x44000800, 0x4a030000, 0x00000000, 0x4a03c020, 0x00000004, 0x4203e000, @@ -159,7 +154,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x4817c857, 0x4853c857, 0x8050a1c0, 0x0400000f, 0x4c140000, 0x5814a801, 0x4857c857, 0x40500000, 0x80540480, 0x04000005, 0x5814b002, 0x485bc857, - 0x0201f800, 0x0010adef, 0x5c002800, 0x82142c00, + 0x0201f800, 0x0010aee2, 0x5c002800, 0x82142c00, 0x00000004, 0x0401f7ee, 0x42002800, 0x0010017d, 0x58140801, 0x4817c857, 0x4807c857, 0x800409c0, 0x04000018, 0x58142002, 0x4813c857, 0x58141003, @@ -168,9 +163,9 @@ static const uint32_t isp_2400_risc_code[] = { 0x4a03c020, 0x00004010, 0x4a03c011, 0x40100011, 0x04006000, 0x4203e000, 0x40000000, 0x4a03c017, 0x00000000, 0x4203e000, 0x30000001, 0x0401f000, - 0x4803c856, 0x0201f800, 0x0010d604, 0x0401faf6, - 0x4a03c014, 0x001c001c, 0x42002000, 0x0010f0b8, - 0x0201f800, 0x0010ae00, 0x42000000, 0x00001000, + 0x4803c856, 0x0201f800, 0x0010d704, 0x0401faf6, + 0x4a03c014, 0x001c001c, 0x42002000, 0x0010f1c0, + 0x0201f800, 0x0010aef3, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24220001, 0x04000906, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24320001, 0x04000900, 0x59c40000, 0x82000500, @@ -179,28 +174,28 @@ static const uint32_t isp_2400_risc_code[] = { 0x0401f00a, 0x59e00003, 0x82000500, 0x00030000, 0x82000580, 0x00010000, 0x04020004, 0x59a8006d, 0x84000542, 0x4803506d, 0x4c140000, 0x0201f800, - 0x0010a5ad, 0x5c002800, 0x42000800, 0x00001100, + 0x0010a6a0, 0x5c002800, 0x42000800, 0x00001100, 0x42001800, 0x00000100, 0x82141480, 0x0017ffff, 0x0402100d, 0x42000800, 0x00000900, 0x82141480, 0x0013ffff, 0x04021008, 0x42000800, 0x00000480, 0x42001800, 0x00000080, 0x82141480, 0x0011ffff, 0x040018d5, 0x4807500d, 0x480f5251, 0x42001000, - 0x00000024, 0x0201f800, 0x00105f4a, 0x82040c00, - 0x0010f584, 0x4807500b, 0x4a03c810, 0x00100000, - 0x4a03c811, 0x0010aebb, 0x4a03c812, 0x0010d600, - 0x4a03c813, 0x0010f0b7, 0x4a03c829, 0x00000004, + 0x00000024, 0x0201f800, 0x00105fef, 0x82040c00, + 0x0010f694, 0x4807500b, 0x4a03c810, 0x00100000, + 0x4a03c811, 0x0010afb1, 0x4a03c812, 0x0010d700, + 0x4a03c813, 0x0010f1bf, 0x4a03c829, 0x00000004, 0x59e40001, 0x82000540, 0x0003403f, 0x4803c801, 0x42001000, 0x0000001c, 0x0401f9f0, 0x4202c000, - 0x0010f584, 0x59aab00b, 0x59aaa00b, 0x59aaa80b, + 0x0010f694, 0x59aab00b, 0x59aaa00b, 0x59aaa80b, 0x59aac80d, 0x49675050, 0x59a8000b, 0x4803500c, - 0x0201f800, 0x001070a4, 0x0401fac4, 0x0401fb14, - 0x0201f800, 0x001017f8, 0x0201f800, 0x001010e9, - 0x0401fbdb, 0x0201f800, 0x00100ca4, 0x0201f800, - 0x00105f8a, 0x0401f85c, 0x0201f800, 0x00101c0a, - 0x0201f800, 0x00104b8f, 0x0201f800, 0x001044a6, - 0x0201f800, 0x00105a28, 0x0201f800, 0x00105729, - 0x0201f800, 0x0010118e, 0x0201f800, 0x00100ff1, - 0x4203e000, 0xf0000001, 0x0201f800, 0x0010ae4f, + 0x0201f800, 0x00107133, 0x0401fac4, 0x0401fb14, + 0x0201f800, 0x001017f9, 0x0201f800, 0x001010ea, + 0x0401fbdb, 0x0201f800, 0x00100ca5, 0x0201f800, + 0x0010602f, 0x0401f85c, 0x0201f800, 0x00101c0f, + 0x0201f800, 0x00104bce, 0x0201f800, 0x001044e5, + 0x0201f800, 0x00105acd, 0x0201f800, 0x001057ce, + 0x0201f800, 0x0010118f, 0x0201f800, 0x00100ff2, + 0x4203e000, 0xf0000001, 0x0201f800, 0x0010af45, 0x4a03c018, 0x00000000, 0x4203e000, 0x20000511, 0x4203e000, 0x50010000, 0x4a03c020, 0x00000000, 0x04027010, 0x59e00020, 0x82000580, 0x00000002, @@ -212,25 +207,25 @@ static const uint32_t isp_2400_risc_code[] = { 0x4df00000, 0x4203e000, 0x50000000, 0x416c0000, 0x82000c80, 0x00000008, 0x0402186b, 0x0c01f804, 0x5c03e000, 0x0201f000, 0x00020008, 0x001002d0, - 0x0010eeff, 0x0010ee47, 0x001002cf, 0x0010ee13, + 0x0010f007, 0x0010ef4c, 0x001002cf, 0x0010ef18, 0x001002cf, 0x001002cf, 0x001002e2, 0x0401f85e, - 0x42000800, 0x0010b7fa, 0x5804001e, 0x8c000500, + 0x42000800, 0x0010b8fa, 0x5804001e, 0x8c000500, 0x0400000d, 0x84000500, 0x4800081e, 0x4202d800, 0x00000004, 0x0401f97b, 0x49f3c857, 0x5c000800, 0x5c000000, 0x82000540, 0x00003e00, 0x4c000000, 0x4c040000, 0x1c01f000, 0x4a038805, 0x000000f0, 0x1c01f000, 0x4a035048, 0x00000005, 0x4a035049, - 0x00000004, 0x4a03504a, 0x00000000, 0x4a03504b, - 0x00000482, 0x0201f800, 0x00104b59, 0x4a03541b, + 0x00000005, 0x4a03504a, 0x00000000, 0x4a03504b, + 0x00008482, 0x0201f800, 0x00104b98, 0x4a03541b, 0x0000ffff, 0x4a03500f, 0x00ffffff, 0x0201f800, - 0x00108bc4, 0x4a03501f, 0x20200000, 0x4a035020, + 0x00108c7d, 0x4a03501f, 0x20200000, 0x4a035020, 0x88000200, 0x4a035021, 0x00ff001f, 0x4a035022, 0x000007d0, 0x4a035023, 0x80000000, 0x4a035024, 0x00000200, 0x4a035025, 0x00ff0000, 0x4a035026, 0x00010000, 0x4a03502d, 0x514c4f47, 0x4a03502e, 0x49432020, 0x1c01f000, 0x4d440000, 0x417a8800, 0x4c5c0000, 0x4178b800, 0x0201f800, 0x00020319, - 0x04020005, 0x0201f800, 0x00104165, 0x04020002, + 0x04020005, 0x0201f800, 0x00104181, 0x04020002, 0x805cb800, 0x81468800, 0x83440580, 0x000007f0, 0x040207f6, 0x405c0800, 0x5c00b800, 0x5c028800, 0x1c01f000, 0x4803c857, 0x5c000000, 0x4c000000, @@ -241,7 +236,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x4200b800, 0x00008002, 0x04006000, 0x4c000000, 0x4c040000, 0x59bc00ea, 0x4803c857, 0x82000500, 0x00000007, 0x82000580, 0x00000001, 0x04020005, - 0x42000800, 0x00000000, 0x0201f800, 0x00106126, + 0x42000800, 0x00000000, 0x0201f800, 0x001061cb, 0x59b800ea, 0x4803c857, 0x4a0370e8, 0x00000004, 0x5c000800, 0x4807c025, 0x80040920, 0x4807c026, 0x5c000000, 0x4803c023, 0x80000120, 0x4803c024, @@ -249,8 +244,8 @@ static const uint32_t isp_2400_risc_code[] = { 0x4803c022, 0x41f80000, 0x4803c029, 0x80000120, 0x4803c02a, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24320001, 0x4803c857, 0x0400104b, - 0x0201f800, 0x0010ae33, 0x04000046, 0x42000800, - 0x0010c526, 0x46000800, 0xfaceface, 0x80040800, + 0x0201f800, 0x0010af26, 0x04000046, 0x42000800, + 0x0010c626, 0x46000800, 0xfaceface, 0x80040800, 0x4c080000, 0x4c0c0000, 0x42001000, 0x00007a00, 0x58080013, 0x44000800, 0x80040800, 0x58080019, 0x44000800, 0x80040800, 0x5808001a, 0x44000800, @@ -273,29 +268,29 @@ static const uint32_t isp_2400_risc_code[] = { 0x00000000, 0x4203e000, 0x30000001, 0x0401f847, 0x0401f7ff, 0x42000000, 0x00000004, 0x0401f80c, 0x4a03c855, 0x0001eb5a, 0x59e40001, 0x82000540, - 0x00000700, 0x4803c801, 0x42000000, 0x0010bcb1, + 0x00000700, 0x4803c801, 0x42000000, 0x0010bdb1, 0x49780003, 0x49780004, 0x1c01f000, 0x42000800, - 0x0010bcb3, 0x44000800, 0x59e40801, 0x82041500, + 0x0010bdb3, 0x44000800, 0x59e40801, 0x82041500, 0xfff3c0ff, 0x480bc801, 0x8c040d24, 0x0400000c, 0x4c000000, 0x59e41052, 0x59e40054, 0x800000d4, - 0x82000400, 0x0010c542, 0x80081480, 0x480bc853, + 0x82000400, 0x0010c642, 0x80081480, 0x480bc853, 0x4a03c800, 0x00000040, 0x5c000000, 0x4a03c850, - 0x0010c542, 0x800000d4, 0x82002400, 0x0010c541, + 0x0010c642, 0x800000d4, 0x82002400, 0x0010c641, 0x4813c851, 0x4a03c853, 0x00000400, 0x42000000, - 0x0010c542, 0x82001400, 0x00001000, 0x45780000, + 0x0010c642, 0x82001400, 0x00001000, 0x45780000, 0x80000000, 0x80081d80, 0x040207fd, 0x4807c801, - 0x1c01f000, 0x42002000, 0x0010bcb1, 0x59e41801, + 0x1c01f000, 0x42002000, 0x0010bdb1, 0x59e41801, 0x58100c01, 0x82040500, 0x00003800, 0x820c1d00, 0xffffc7ff, 0x800c1d40, 0x480fc801, 0x1c01f000, 0x5c036000, 0x4db00000, 0x49b3c857, 0x4803c857, 0x1c01f000, 0x1c01f000, 0x59a80059, 0x8c000530, 0x040207fe, 0x4c080000, 0x42001000, 0x00000004, 0x0401f862, 0x5c001000, 0x4201d000, 0x00028b0a, - 0x0201f800, 0x0010592d, 0x4c080000, 0x42001000, + 0x0201f800, 0x001059d2, 0x4c080000, 0x42001000, 0x00000008, 0x0401f859, 0x5c001000, 0x4201d000, - 0x00028b0a, 0x0201f800, 0x0010592d, 0x4c080000, + 0x00028b0a, 0x0201f800, 0x001059d2, 0x4c080000, 0x42001000, 0x00000010, 0x0401f850, 0x5c001000, - 0x4201d000, 0x00028b0a, 0x0201f800, 0x0010592d, + 0x4201d000, 0x00028b0a, 0x0201f800, 0x001059d2, 0x0401f7e2, 0x8c00050c, 0x59a80859, 0x04020003, 0x84040d30, 0x0401f006, 0x84040d70, 0x48075059, 0x42001000, 0x00000000, 0x0401f040, 0x48075059, @@ -334,8 +329,8 @@ static const uint32_t isp_2400_risc_code[] = { 0x41792800, 0x41793000, 0x41793800, 0x41794000, 0x41794800, 0x41795000, 0x41795800, 0x41796000, 0x41796800, 0x41797000, 0x41797800, 0x41798000, - 0x41798800, 0x42019000, 0x0010b889, 0x42019800, - 0x0010b860, 0x4179a000, 0x4179a800, 0x4179b000, + 0x41798800, 0x42019000, 0x0010b989, 0x42019800, + 0x0010b960, 0x4179a000, 0x4179a800, 0x4179b000, 0x4179b800, 0x4179c800, 0x4179c000, 0x4179d000, 0x4179d800, 0x4179e000, 0x4179e800, 0x4179f000, 0x4179f800, 0x417a0000, 0x417a0800, 0x417a1000, @@ -344,17 +339,17 @@ static const uint32_t isp_2400_risc_code[] = { 0x417a5000, 0x417a5800, 0x417a6000, 0x417a6800, 0x417a7000, 0x417a7800, 0x417a8000, 0x417a8800, 0x417a9000, 0x417a9800, 0x417ae800, 0x417af800, - 0x42030000, 0x00007c00, 0x42031000, 0x0010bb5a, + 0x42030000, 0x00007c00, 0x42031000, 0x0010bc5a, 0x42031800, 0x0000bf1d, 0x42032000, 0x0000bf32, - 0x42032800, 0x0010bb22, 0x42033000, 0x00020b5d, - 0x42034000, 0x0010b7fa, 0x42033800, 0x0010b819, - 0x42034800, 0x0010b898, 0x42035000, 0x0010b780, - 0x42035800, 0x0010af80, 0x42030800, 0x0010b85b, + 0x42032800, 0x0010bc22, 0x42033000, 0x00020b5d, + 0x42034000, 0x0010b8fa, 0x42033800, 0x0010b919, + 0x42034800, 0x0010b998, 0x42035000, 0x0010b880, + 0x42035800, 0x0010b080, 0x42030800, 0x0010b95b, 0x417b6000, 0x42036800, 0x00006f00, 0x4203c800, 0x00003000, 0x42037000, 0x0000ff00, 0x42037800, 0x0000bf00, 0x42038000, 0x00007700, 0x42038800, 0x00004000, 0x42039000, 0x00006000, 0x42039800, - 0x0010c25e, 0x4203a000, 0x00007600, 0x4203a800, + 0x0010c35e, 0x4203a000, 0x00007600, 0x4203a800, 0x00007400, 0x4203b000, 0x00007200, 0x4203b800, 0x00007100, 0x4203c000, 0x00007000, 0x4203d000, 0x00000000, 0x4203e800, 0x0002018e, 0x417bd800, @@ -379,13 +374,13 @@ static const uint32_t isp_2400_risc_code[] = { 0x412d8800, 0x1c01f000, 0x835c0480, 0x00000020, 0x0400100a, 0x496bc857, 0x815eb840, 0x416a5800, 0x592ed000, 0x497a5800, 0x497a5801, 0x497a5805, - 0x812e59c0, 0x1c01f000, 0x42000000, 0x0010bc0f, - 0x0201f800, 0x0010ad1d, 0x417a5800, 0x0401f7f9, + 0x812e59c0, 0x1c01f000, 0x42000000, 0x0010bd0f, + 0x0201f800, 0x0010ae10, 0x417a5800, 0x0401f7f9, 0x0401f803, 0x412d8800, 0x1c01f000, 0x815eb840, 0x04001009, 0x416a5800, 0x492fc857, 0x592ed000, 0x497a5800, 0x497a5801, 0x497a5805, 0x812e59c0, - 0x1c01f000, 0x42000000, 0x0010bc0f, 0x0201f800, - 0x0010ad1d, 0x417ab800, 0x417a5800, 0x0401f7f8, + 0x1c01f000, 0x42000000, 0x0010bd0f, 0x0201f800, + 0x0010ae10, 0x417ab800, 0x417a5800, 0x0401f7f8, 0x492fc857, 0x496a5800, 0x412ed000, 0x815eb800, 0x59c80000, 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, 0x492fc857, 0x812e59c0, 0x04000007, @@ -403,26 +398,26 @@ static const uint32_t isp_2400_risc_code[] = { 0x00000020, 0x497bb807, 0x8058b040, 0x040207fe, 0x4a03b805, 0x30000000, 0x59dc0006, 0x4a03b805, 0x60000001, 0x4803c856, 0x0401ff98, 0x04000d6a, - 0x42001000, 0x0010bb55, 0x452c1000, 0x4a025801, + 0x42001000, 0x0010bc55, 0x452c1000, 0x4a025801, 0x00000001, 0x4a025802, 0x00000100, 0x4a025808, - 0x00106784, 0x497a5809, 0x497a580a, 0x497a580b, - 0x0401ff8a, 0x04000d5c, 0x42001000, 0x0010bb56, + 0x00106826, 0x497a5809, 0x497a580a, 0x497a580b, + 0x0401ff8a, 0x04000d5c, 0x42001000, 0x0010bc56, 0x452c1000, 0x4a025801, 0x00000000, 0x4a025802, - 0x00000100, 0x4a025808, 0x00100f2e, 0x497a5803, + 0x00000100, 0x4a025808, 0x00100f2f, 0x497a5803, 0x497a5806, 0x497a5807, 0x497a5809, 0x59a8006d, 0x8c000500, 0x04000006, 0x4a03b805, 0xe0000001, 0x59dc0006, 0x8c000522, 0x040007fc, 0x1c01f000, 0x40681000, 0x0201f800, 0x00020016, 0x1c01f000, - 0x42001000, 0x00020026, 0x0201f800, 0x001057d8, - 0x0201f800, 0x00108cab, 0x0201f800, 0x0010a24b, + 0x42001000, 0x00020026, 0x0201f800, 0x0010587d, + 0x0201f800, 0x00108d64, 0x0201f800, 0x0010a32a, 0x04000014, 0x4a03b805, 0x30000002, 0x59dc0006, 0x4807b800, 0x480bb801, 0x42007000, 0x00020b54, 0x4a007002, 0x00000040, 0x480c7008, 0x58380007, 0x82000400, 0x00000005, 0x48007003, 0x4a007000, 0x00000003, 0x4803b803, 0x0201f000, 0x00020050, - 0x42000000, 0x0010bb77, 0x0201f800, 0x0010ad1d, - 0x0201f800, 0x00108cc3, 0x42000800, 0x00000001, - 0x42001000, 0x00020026, 0x0201f800, 0x001057b1, + 0x42000000, 0x0010bc77, 0x0201f800, 0x0010ae10, + 0x0201f800, 0x00108d7c, 0x42000800, 0x00000001, + 0x42001000, 0x00020026, 0x0201f800, 0x00105856, 0x42007000, 0x00020b54, 0x0201f000, 0x00020030, 0x58380802, 0x42001000, 0x0000ff00, 0x82040480, 0x0000ff00, 0x04021003, 0x40041000, 0x80000580, @@ -442,7 +437,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x04000003, 0x48107005, 0x0401f008, 0x49787005, 0x49787004, 0x0401f005, 0x48101800, 0x801021c0, 0x04020002, 0x480c7004, 0x1c01f000, 0x4803c856, - 0x4dc00000, 0x42007000, 0x0010bb58, 0x4a007400, + 0x4dc00000, 0x42007000, 0x0010bc58, 0x4a007400, 0x00000000, 0x49787001, 0x42038000, 0x00007720, 0x4a038006, 0x60000001, 0x4a038009, 0xf4f60000, 0x42038000, 0x00007700, 0x4a038006, 0x60000001, @@ -458,7 +453,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x4a038807, 0x00000004, 0x4a0370e5, 0x00080000, 0x59b800ea, 0x8c000510, 0x04000004, 0x59b800e0, 0x0401f879, 0x0401f7fb, 0x42038000, 0x00007720, - 0x0201f800, 0x00100c06, 0x59c00007, 0x4a038006, + 0x0201f800, 0x00100c07, 0x59c00007, 0x4a038006, 0x20000000, 0x59c00007, 0x4a038006, 0x8000000a, 0x59c00007, 0x4a038006, 0x8000000b, 0x59c00007, 0x4a038006, 0x40000001, 0x83c00580, 0x00007700, @@ -469,16 +464,16 @@ static const uint32_t isp_2400_risc_code[] = { 0x83c00580, 0x00007700, 0x04000004, 0x42038000, 0x00007700, 0x0401f7f1, 0x4178a000, 0x805cb9c0, 0x0402001d, 0x4200b000, 0x00000020, 0x83b8ac00, - 0x00000020, 0x0201f800, 0x0010adf8, 0x4a0370fb, - 0x00000001, 0x4a037020, 0x00100e39, 0x59a8002c, + 0x00000020, 0x0201f800, 0x0010aeeb, 0x4a0370fb, + 0x00000001, 0x4a037020, 0x00100e3a, 0x59a8002c, 0x82000500, 0x0000ffff, 0x48037021, 0x4a037035, - 0x0010c1a4, 0x4a037030, 0x0010b78f, 0x4a037031, - 0x0010af80, 0x4a037032, 0x0010b86b, 0x4a037036, - 0x0010b876, 0x59840002, 0x48037034, 0x4a037038, - 0x00100e30, 0x4a0370fb, 0x00000001, 0x4200b000, + 0x0010c2a4, 0x4a037030, 0x0010b88f, 0x4a037031, + 0x0010b080, 0x4a037032, 0x0010b96b, 0x4a037036, + 0x0010b976, 0x59840002, 0x48037034, 0x4a037038, + 0x00100e31, 0x4a0370fb, 0x00000001, 0x4200b000, 0x00000020, 0x83b8ac00, 0x00000000, 0x0201f800, - 0x0010adf8, 0x4200b000, 0x00000040, 0x83b8ac00, - 0x00000040, 0x0201f800, 0x0010adf8, 0x805cb9c0, + 0x0010aeeb, 0x4200b000, 0x00000040, 0x83b8ac00, + 0x00000040, 0x0201f800, 0x0010aeeb, 0x805cb9c0, 0x04020004, 0x4a0370e4, 0xaaaaaaaa, 0x0401f003, 0x4a0370e4, 0xa2aa2a82, 0x4a0370e5, 0xaaaaaaaa, 0x4a0370e6, 0xaaaaaaaa, 0x4a0370fb, 0x00000000, @@ -490,7 +485,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x1c01f000, 0x4d300000, 0x4d380000, 0x40026000, 0x82000500, 0x7f000000, 0x82000580, 0x60000000, 0x04020012, 0x83326500, 0x00ffffff, 0x0201f800, - 0x001091d9, 0x0402000d, 0x59300203, 0x82000580, + 0x00109291, 0x0402000d, 0x59300203, 0x82000580, 0x00000004, 0x04020009, 0x59300c07, 0x82040580, 0x00000009, 0x04020005, 0x42027000, 0x00000047, 0x0201f800, 0x00020a34, 0x5c027000, 0x5c026000, @@ -498,3725 +493,3732 @@ static const uint32_t isp_2400_risc_code[] = { 0x4d400000, 0x4cfc0000, 0x4d380000, 0x4d3c0000, 0x4d440000, 0x4d4c0000, 0x4d480000, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4d040000, 0x4cc80000, - 0x4ccc0000, 0x4cf40000, 0x4cf80000, 0x4cfc0000, - 0x0201f800, 0x00020095, 0x5c01f800, 0x5c01f000, - 0x5c01e800, 0x5c019800, 0x5c019000, 0x5c020800, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c029000, - 0x5c029800, 0x5c028800, 0x5c027800, 0x5c027000, - 0x5c01f800, 0x5c028000, 0x5c026800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x493bc857, 0x0201f000, - 0x000200bc, 0x83300500, 0x000000ff, 0x82000c80, - 0x00000007, 0x02021800, 0x0010032d, 0x0c01f025, - 0x1c01f000, 0x82000d00, 0xc0000038, 0x02020800, - 0x00100322, 0x0201f800, 0x0010032d, 0x00000000, - 0x00000048, 0x00000054, 0x00000053, 0x00100786, - 0x001007aa, 0x001007a5, 0x001007c9, 0x00100791, - 0x0010079d, 0x00100786, 0x001007c4, 0x00100810, - 0x00100786, 0x00100813, 0x00100786, 0x00100786, - 0x00100816, 0x0010081c, 0x00100839, 0x0010084e, - 0x00100786, 0x00100857, 0x00100863, 0x00100786, - 0x00100786, 0x00100786, 0x0201f800, 0x0010032d, - 0x0010078f, 0x001008fa, 0x001007d6, 0x001007ff, - 0x0010078f, 0x0010078f, 0x0010078f, 0x0201f800, - 0x0010032d, 0x4803c856, 0x59300004, 0x8c00053e, - 0x04020005, 0x42027000, 0x00000055, 0x0201f000, - 0x00020a34, 0x0201f800, 0x0010644d, 0x040007fa, - 0x1c01f000, 0x4803c856, 0x0401f8c7, 0x40002800, - 0x41782000, 0x42027000, 0x00000056, 0x0201f000, - 0x00020a34, 0x4803c856, 0x42027000, 0x00000057, - 0x0201f000, 0x00020a34, 0x4803c856, 0x59325809, - 0x812e59c0, 0x04000016, 0x59300008, 0x8c00051a, - 0x0402000d, 0x592c0409, 0x8c00051c, 0x04020003, - 0x4a026012, 0xffffffff, 0x59300004, 0x8c00053e, - 0x04020008, 0x42027000, 0x00000048, 0x0201f000, - 0x00020a34, 0x4a025a07, 0x00000007, 0x0401f7f5, - 0x0201f800, 0x0010644d, 0x040007f7, 0x1c01f000, - 0x4803c856, 0x83300500, 0x00ffffff, 0x0201f000, - 0x00105d72, 0x1c01f000, 0x4c040000, 0x59b808ea, - 0x82040d00, 0x00000007, 0x82040580, 0x00000003, - 0x04000004, 0x42000000, 0x60000000, 0x0401f8c6, - 0x5c000800, 0x1c01f000, 0x0401f914, 0x0400001b, - 0x59325809, 0x812e59c0, 0x04000018, 0x592c0205, - 0x82000500, 0x000000ff, 0x82000d80, 0x00000029, - 0x04020012, 0x59300203, 0x82000580, 0x00000003, - 0x0400000b, 0x59300808, 0x84040d26, 0x48066008, - 0x0201f800, 0x00020111, 0x4a03900d, 0x00000040, - 0x4a0370e5, 0x00000008, 0x1c01f000, 0x0201f800, - 0x0010644d, 0x040007f4, 0x42000000, 0x0010bc15, - 0x0201f800, 0x0010ad1d, 0x5988014a, 0x80000000, - 0x4803114a, 0x4a03900d, 0x00000040, 0x42000000, - 0xc0000000, 0x0201f000, 0x00020105, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x4200c800, 0x0010c1ab, - 0x4200b800, 0x00003000, 0x4200c000, 0x00000105, - 0x0201f800, 0x001055e9, 0x4a0370e4, 0x02000000, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x4933c857, 0x0201f000, 0x00020a10, 0x4933c857, - 0x0401fbfa, 0x1c01f000, 0x41300800, 0x800409c0, - 0x02020800, 0x0010032d, 0x0201f800, 0x00100322, - 0x42000000, 0x0010bc15, 0x0201f800, 0x0010ad1d, - 0x4933c857, 0x813261c0, 0x02000800, 0x0010032d, - 0x0401f841, 0x40002800, 0x0201f800, 0x0010ac86, - 0x4c140000, 0x59a8006a, 0x80000540, 0x04000004, - 0x8c142d2a, 0x04000002, 0x0401fbe0, 0x5c002800, - 0x0401f8ae, 0x04000007, 0x5932680a, 0x59340200, - 0x8c00050e, 0x59300415, 0x02020800, 0x00108b7a, - 0x1c01f000, 0x42000000, 0x0010bc15, 0x0201f800, - 0x0010ad1d, 0x4933c857, 0x813261c0, 0x02000800, - 0x0010032d, 0x0401f89d, 0x0400000b, 0x0201f800, - 0x0010889a, 0x04000008, 0x59325809, 0x592c0209, - 0x8400054e, 0x48025a09, 0x417a7800, 0x0201f800, - 0x00108487, 0x1c01f000, 0x485fc857, 0x5c000000, - 0x4d780000, 0x4203e000, 0x50000000, 0x4200b800, - 0x00008005, 0x0201f000, 0x00100332, 0x4933c857, - 0x83300480, 0x00000020, 0x02021800, 0x0010032d, - 0x83300c00, 0x0010bc88, 0x50040000, 0x80000000, - 0x04001002, 0x44000800, 0x1c01f000, 0x4933c857, - 0x0401f7f4, 0x4807c856, 0x59b800ea, 0x8c000510, - 0x040007fd, 0x59b800e0, 0x4803c857, 0x1c01f000, - 0x4803c856, 0x42000000, 0x10000000, 0x41300800, - 0x0401f029, 0x8c000510, 0x02000000, 0x0002010b, - 0x4c040000, 0x0401f80b, 0x5c000800, 0x82100480, - 0x00000008, 0x02001000, 0x0002010b, 0x4c040000, - 0x0401feb5, 0x5c000800, 0x0201f000, 0x0002010b, - 0x59b800e2, 0x59b820e2, 0x80100580, 0x040207fd, - 0x80102114, 0x0401f001, 0x40101800, 0x800c190a, - 0x82100500, 0x0000001f, 0x820c1d00, 0x0000001f, - 0x800c2480, 0x82102500, 0x0000001f, 0x1c01f000, - 0x40680000, 0x406c0800, 0x0401f807, 0x42018800, - 0x00000001, 0x04020003, 0x42018800, 0x00000000, - 0x1c01f000, 0x82000500, 0xf0000000, 0x82040d00, - 0x0fffffff, 0x80040d40, 0x4807c857, 0x42001000, - 0x0010bb59, 0x50080000, 0x80000540, 0x04020005, - 0x4a0370e5, 0x00000003, 0x4a0370e4, 0x00000300, - 0x80000000, 0x44001000, 0x42001000, 0x00000400, - 0x59b800ea, 0x8c000510, 0x0400000c, 0x0401ffd1, - 0x82100480, 0x00000008, 0x04001007, 0x4c040000, - 0x4c080000, 0x0401fe7c, 0x5c001000, 0x5c000800, - 0x0401f020, 0x59b800ea, 0x8c000516, 0x0402001d, - 0x4a0370e4, 0x00300000, 0x480770e1, 0x42001000, - 0x0000ff00, 0x80081040, 0x04000012, 0x59b808e4, - 0x8c040d28, 0x040207fc, 0x42001000, 0x0010bb59, - 0x50080000, 0x80000040, 0x04020005, 0x4a0370e5, - 0x00000002, 0x4a0370e4, 0x00000200, 0x02001800, - 0x0010032d, 0x44001000, 0x8c040d2c, 0x1c01f000, + 0x4ccc0000, 0x4cf40000, 0x4cf80000, 0x0201f800, + 0x00020095, 0x5c01f000, 0x5c01e800, 0x5c019800, + 0x5c019000, 0x5c020800, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x5c029000, 0x5c029800, 0x5c028800, + 0x5c027800, 0x5c027000, 0x5c01f800, 0x5c028000, + 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x493bc857, 0x0201f000, 0x000200bc, 0x83300500, + 0x000000ff, 0x82000c80, 0x00000007, 0x02021800, + 0x0010032d, 0x0c01f025, 0x1c01f000, 0x82000d00, + 0xc0000038, 0x02020800, 0x00100322, 0x0201f800, + 0x0010032d, 0x00000000, 0x00000048, 0x00000054, + 0x00000053, 0x00100784, 0x001007a8, 0x001007a3, + 0x001007c7, 0x0010078f, 0x0010079b, 0x00100784, + 0x001007c2, 0x0010080e, 0x00100784, 0x00100811, + 0x00100784, 0x00100784, 0x00100814, 0x0010081a, + 0x00100837, 0x0010084c, 0x00100784, 0x00100855, + 0x00100861, 0x00100784, 0x00100784, 0x00100784, + 0x0201f800, 0x0010032d, 0x0010078d, 0x001008f8, + 0x001007d4, 0x001007fd, 0x0010078d, 0x0010078d, + 0x0010078d, 0x0201f800, 0x0010032d, 0x4803c856, + 0x59300004, 0x8c00053e, 0x04020005, 0x42027000, + 0x00000055, 0x0201f000, 0x00020a34, 0x0201f800, + 0x001064f2, 0x040007fa, 0x1c01f000, 0x4803c856, + 0x0401f8c7, 0x40002800, 0x41782000, 0x42027000, + 0x00000056, 0x0201f000, 0x00020a34, 0x4803c856, + 0x42027000, 0x00000057, 0x0201f000, 0x00020a34, + 0x4803c856, 0x59325809, 0x812e59c0, 0x04000016, + 0x59300008, 0x8c00051a, 0x0402000d, 0x592c0409, + 0x8c00051c, 0x04020003, 0x4a026012, 0xffffffff, + 0x59300004, 0x8c00053e, 0x04020008, 0x42027000, + 0x00000048, 0x0201f000, 0x00020a34, 0x4a025a07, + 0x00000007, 0x0401f7f5, 0x0201f800, 0x001064f2, + 0x040007f7, 0x1c01f000, 0x4803c856, 0x83300500, + 0x00ffffff, 0x0201f000, 0x00105e17, 0x1c01f000, + 0x4c040000, 0x59b808ea, 0x82040d00, 0x00000007, + 0x82040580, 0x00000003, 0x04000004, 0x42000000, + 0x60000000, 0x0401f8c6, 0x5c000800, 0x1c01f000, + 0x0401f914, 0x0400001b, 0x59325809, 0x812e59c0, + 0x04000018, 0x592c0205, 0x82000500, 0x000000ff, + 0x82000d80, 0x00000029, 0x04020012, 0x59300203, + 0x82000580, 0x00000003, 0x0400000b, 0x59300808, + 0x84040d26, 0x48066008, 0x0201f800, 0x00020111, + 0x4a03900d, 0x00000040, 0x4a0370e5, 0x00000008, + 0x1c01f000, 0x0201f800, 0x001064f2, 0x040007f4, + 0x42000000, 0x0010bd15, 0x0201f800, 0x0010ae10, + 0x5988014a, 0x80000000, 0x4803114a, 0x4a03900d, + 0x00000040, 0x42000000, 0xc0000000, 0x0201f000, + 0x00020105, 0x4c5c0000, 0x4c600000, 0x4c640000, + 0x4200c800, 0x0010c2ab, 0x4200b800, 0x00003000, + 0x4200c000, 0x00000105, 0x0201f800, 0x00105655, + 0x4a0370e4, 0x02000000, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x4933c857, 0x0201f000, + 0x00020a10, 0x4933c857, 0x0401fbfd, 0x1c01f000, + 0x41300800, 0x800409c0, 0x02020800, 0x0010032d, + 0x0201f800, 0x00100322, 0x42000000, 0x0010bd15, + 0x0201f800, 0x0010ae10, 0x4933c857, 0x813261c0, + 0x02000800, 0x0010032d, 0x0401f841, 0x40002800, + 0x0201f800, 0x0010ad79, 0x4c140000, 0x59a8006a, + 0x80000540, 0x04000004, 0x8c142d2a, 0x04000002, + 0x0401fbe3, 0x5c002800, 0x0401f8ae, 0x04000007, + 0x5932680a, 0x59340200, 0x8c00050e, 0x59300415, + 0x02020800, 0x00108c33, 0x1c01f000, 0x42000000, + 0x0010bd15, 0x0201f800, 0x0010ae10, 0x4933c857, + 0x813261c0, 0x02000800, 0x0010032d, 0x0401f89d, + 0x0400000b, 0x0201f800, 0x00108953, 0x04000008, + 0x59325809, 0x592c0209, 0x8400054e, 0x48025a09, + 0x417a7800, 0x0201f800, 0x0010853c, 0x1c01f000, + 0x485fc857, 0x5c000000, 0x4d780000, 0x4203e000, + 0x50000000, 0x4200b800, 0x00008005, 0x0201f000, + 0x00100332, 0x4933c857, 0x83300480, 0x00000020, + 0x02021800, 0x0010032d, 0x83300c00, 0x0010bd88, + 0x50040000, 0x80000000, 0x04001002, 0x44000800, + 0x1c01f000, 0x4933c857, 0x0401f7f4, 0x4807c856, + 0x59b800ea, 0x8c000510, 0x040007fd, 0x59b800e0, + 0x4803c857, 0x1c01f000, 0x4803c856, 0x42000000, + 0x10000000, 0x41300800, 0x0401f029, 0x8c000510, + 0x02000000, 0x0002010b, 0x4c040000, 0x0401f80b, + 0x5c000800, 0x82100480, 0x00000008, 0x02001000, + 0x0002010b, 0x4c040000, 0x0401feb7, 0x5c000800, + 0x0201f000, 0x0002010b, 0x59b800e2, 0x59b820e2, + 0x80100580, 0x040207fd, 0x80102114, 0x0401f001, + 0x40101800, 0x800c190a, 0x82100500, 0x0000001f, + 0x820c1d00, 0x0000001f, 0x800c2480, 0x82102500, + 0x0000001f, 0x1c01f000, 0x40680000, 0x406c0800, + 0x0401f807, 0x42018800, 0x00000001, 0x04020003, + 0x42018800, 0x00000000, 0x1c01f000, 0x82000500, + 0xf0000000, 0x82040d00, 0x0fffffff, 0x80040d40, + 0x4807c857, 0x42001000, 0x0010bc59, 0x50080000, + 0x80000540, 0x04020005, 0x4a0370e5, 0x00000003, + 0x4a0370e4, 0x00000300, 0x80000000, 0x44001000, + 0x42001000, 0x00000400, 0x59b800ea, 0x8c000510, + 0x0400000c, 0x0401ffd1, 0x82100480, 0x00000008, + 0x04001007, 0x4c040000, 0x4c080000, 0x0401fe7e, + 0x5c001000, 0x5c000800, 0x0401f020, 0x59b800ea, + 0x8c000516, 0x0402001d, 0x4a0370e4, 0x00300000, + 0x480770e1, 0x42001000, 0x0000ff00, 0x80081040, + 0x04000012, 0x59b808e4, 0x8c040d28, 0x040207fc, + 0x42001000, 0x0010bc59, 0x50080000, 0x80000040, + 0x04020005, 0x4a0370e5, 0x00000002, 0x4a0370e4, + 0x00000200, 0x02001800, 0x0010032d, 0x44001000, + 0x8c040d2c, 0x1c01f000, 0x41f80000, 0x50000000, + 0x0201f800, 0x0010032d, 0x80081040, 0x040207d3, 0x41f80000, 0x50000000, 0x0201f800, 0x0010032d, - 0x80081040, 0x040207d3, 0x41f80000, 0x50000000, - 0x0201f800, 0x0010032d, 0x4d380000, 0x59300c07, - 0x82040580, 0x00000009, 0x04020006, 0x42027000, - 0x00000047, 0x0201f800, 0x00020a34, 0x80000580, - 0x5c027000, 0x1c01f000, 0x4c500000, 0x4a03900d, - 0x00000001, 0x59c8a020, 0x4a03900d, 0x00000002, - 0x59c80820, 0x8c50a52e, 0x04000002, 0x900409c0, - 0x82040d00, 0x0000ffff, 0x0201f800, 0x001055ab, - 0x5c00a000, 0x1c01f000, 0x42000000, 0x0010bc0c, - 0x0201f800, 0x0010ad1d, 0x0401ffec, 0x0400004b, - 0x4933c857, 0x59300407, 0x82000580, 0x00000000, - 0x04000046, 0x59c82021, 0x4a03900d, 0x00000001, - 0x59c82821, 0x82142d00, 0x0000ffff, 0x59325809, - 0x812e59c0, 0x0400003d, 0x5932680a, 0x0201f800, - 0x001040aa, 0x02020800, 0x00108b62, 0x599c0019, - 0x8c00050c, 0x04020018, 0x0201f800, 0x001040aa, - 0x04020015, 0x59300812, 0x4807c857, 0x592c0409, - 0x8c00051c, 0x0402000e, 0x8400055c, 0x48025c09, - 0x592c0a05, 0x82040d00, 0x000000ff, 0x82040580, - 0x00000048, 0x04000004, 0x82040580, 0x00000018, - 0x04020003, 0x59300812, 0x48065803, 0x4a026012, - 0x7fffffff, 0x48166014, 0x599c0019, 0x8c00050c, - 0x04020004, 0x59a80007, 0x8c00051e, 0x04020017, - 0x0201f800, 0x00100e59, 0x04020014, 0x0401fa2f, - 0x40280000, 0x4802600e, 0x04000005, 0x4832600c, - 0x50200000, 0x4802600b, 0x4822600d, 0x59300415, - 0x8c00051c, 0x04020004, 0x599c0019, 0x8c00050c, - 0x04020885, 0x4a03900d, 0x00000040, 0x4a0370e5, - 0x00000008, 0x1c01f000, 0x42000000, 0x0010bc15, - 0x0201f800, 0x0010ad1d, 0x5988014c, 0x80000000, - 0x4803114c, 0x4a03900d, 0x00000040, 0x42000000, - 0xc0000000, 0x0201f000, 0x00020105, 0x4cf80000, - 0x58f40000, 0x8001f540, 0x0401f820, 0x41781800, - 0x0401f8f9, 0x04020014, 0x44140800, 0x0401f82a, - 0x04000011, 0x40043800, 0x42001800, 0x00000001, - 0x40142000, 0x0401f8f0, 0x0402000b, 0x801c3800, - 0x501c0000, 0x44000800, 0x0401f810, 0x801c0580, - 0x04000004, 0x44103800, 0x801c3840, 0x44143800, - 0x0401f819, 0x5c01f000, 0x1c01f000, 0x80f9f1c0, - 0x04020003, 0x58f41202, 0x0401f003, 0x42001000, - 0x00000007, 0x1c01f000, 0x80f9f1c0, 0x04020006, - 0x58f40401, 0x82000480, 0x00000002, 0x80f40400, - 0x0401f005, 0x58f80401, 0x82000480, 0x00000002, - 0x80f80400, 0x50002800, 0x80000000, 0x50002000, - 0x1c01f000, 0x80f9f1c0, 0x04020008, 0x58f40401, + 0x4d380000, 0x59300c07, 0x82040580, 0x00000009, + 0x04020006, 0x42027000, 0x00000047, 0x0201f800, + 0x00020a34, 0x80000580, 0x5c027000, 0x1c01f000, + 0x4c500000, 0x4a03900d, 0x00000001, 0x59c8a020, + 0x4a03900d, 0x00000002, 0x59c80820, 0x8c50a52e, + 0x04000002, 0x900409c0, 0x82040d00, 0x0000ffff, + 0x0201f800, 0x00105617, 0x5c00a000, 0x1c01f000, + 0x42000000, 0x0010bd0c, 0x0201f800, 0x0010ae10, + 0x0401ffec, 0x0400004e, 0x4933c857, 0x59300407, + 0x82000580, 0x00000000, 0x04000049, 0x59c82021, + 0x4a03900d, 0x00000001, 0x59c82821, 0x82142d00, + 0x0000ffff, 0x59325809, 0x812e59c0, 0x04000040, + 0x5932680a, 0x0201f800, 0x001040c4, 0x02020800, + 0x00108c1b, 0x599c0019, 0x8c00050c, 0x04020018, + 0x0201f800, 0x001040c4, 0x04020015, 0x59300812, + 0x4807c857, 0x592c0409, 0x8c00051c, 0x0402000e, + 0x8400055c, 0x48025c09, 0x592c0a05, 0x82040d00, + 0x000000ff, 0x82040580, 0x00000048, 0x04000004, + 0x82040580, 0x00000018, 0x04020003, 0x59300812, + 0x48065803, 0x4a026012, 0x7fffffff, 0x48166014, + 0x0201f800, 0x001040c4, 0x04000004, 0x59300415, + 0x8c00051c, 0x04000004, 0x599c0019, 0x8c00050c, + 0x04000017, 0x0201f800, 0x00100e5a, 0x04020014, + 0x0401fa2f, 0x40280000, 0x4802600e, 0x04000005, + 0x4832600c, 0x50200000, 0x4802600b, 0x4822600d, + 0x59300415, 0x8c00051c, 0x04020004, 0x599c0019, + 0x8c00050c, 0x04020885, 0x4a03900d, 0x00000040, + 0x4a0370e5, 0x00000008, 0x1c01f000, 0x42000000, + 0x0010bd15, 0x0201f800, 0x0010ae10, 0x5988014c, + 0x80000000, 0x4803114c, 0x4a03900d, 0x00000040, + 0x42000000, 0xc0000000, 0x0201f000, 0x00020105, + 0x4cf80000, 0x58f40000, 0x8001f540, 0x0401f820, + 0x41781800, 0x0401f8f9, 0x04020014, 0x44140800, + 0x0401f82a, 0x04000011, 0x40043800, 0x42001800, + 0x00000001, 0x40142000, 0x0401f8f0, 0x0402000b, + 0x801c3800, 0x501c0000, 0x44000800, 0x0401f810, + 0x801c0580, 0x04000004, 0x44103800, 0x801c3840, + 0x44143800, 0x0401f819, 0x5c01f000, 0x1c01f000, + 0x80f9f1c0, 0x04020003, 0x58f41202, 0x0401f003, + 0x42001000, 0x00000007, 0x1c01f000, 0x80f9f1c0, + 0x04020006, 0x58f40401, 0x82000480, 0x00000002, + 0x80f40400, 0x0401f005, 0x58f80401, 0x82000480, + 0x00000002, 0x80f80400, 0x50002800, 0x80000000, + 0x50002000, 0x1c01f000, 0x80f9f1c0, 0x04020008, + 0x58f40401, 0x82000480, 0x00000002, 0x02001800, + 0x0010032d, 0x4801ec01, 0x0401f00b, 0x58f80401, 0x82000480, 0x00000002, 0x02001800, 0x0010032d, - 0x4801ec01, 0x0401f00b, 0x58f80401, 0x82000480, - 0x00000002, 0x02001800, 0x0010032d, 0x4801f401, - 0x82000580, 0x00000002, 0x04020002, 0x0401f81b, - 0x58f40202, 0x80000040, 0x4801ea02, 0x02000800, - 0x0010032d, 0x82000580, 0x00000001, 0x1c01f000, - 0x82f40580, 0xffffffff, 0x0400000f, 0x58f40201, + 0x4801f401, 0x82000580, 0x00000002, 0x04020002, + 0x0401f81b, 0x58f40202, 0x80000040, 0x4801ea02, + 0x02000800, 0x0010032d, 0x82000580, 0x00000001, + 0x1c01f000, 0x82f40580, 0xffffffff, 0x0400000f, + 0x58f40201, 0x82000580, 0x0000dcb3, 0x02020800, + 0x0010032d, 0x58f40000, 0x8001f540, 0x04000006, + 0x58f80201, 0x82000580, 0x0000ddb9, 0x02020800, + 0x0010032d, 0x0401f80a, 0x1c01f000, 0x4d2c0000, + 0x40fa5800, 0x0201f800, 0x00100580, 0x4979e800, + 0x4179f000, 0x5c025800, 0x1c01f000, 0x80f5e9c0, + 0x04000009, 0x80f9f1c0, 0x04020ff5, 0x4d2c0000, + 0x40f65800, 0x0201f800, 0x00100580, 0x4179e800, + 0x5c025800, 0x1c01f000, 0x4cf40000, 0x0201f800, + 0x001040c4, 0x04020036, 0x59300808, 0x82040500, + 0x00013100, 0x04020032, 0x8c040d22, 0x04000032, + 0x59300020, 0x8001ed40, 0x02000800, 0x0010032d, + 0x82000580, 0xffffffff, 0x04000029, 0x58f40201, 0x82000580, 0x0000dcb3, 0x02020800, 0x0010032d, - 0x58f40000, 0x8001f540, 0x04000006, 0x58f80201, - 0x82000580, 0x0000ddb9, 0x02020800, 0x0010032d, - 0x0401f80a, 0x1c01f000, 0x4d2c0000, 0x40fa5800, - 0x0201f800, 0x00100580, 0x4979e800, 0x4179f000, - 0x5c025800, 0x1c01f000, 0x80f5e9c0, 0x04000009, - 0x80f9f1c0, 0x04020ff5, 0x4d2c0000, 0x40f65800, - 0x0201f800, 0x00100580, 0x4179e800, 0x5c025800, - 0x1c01f000, 0x4cf40000, 0x0201f800, 0x001040aa, - 0x04020036, 0x59300808, 0x82040500, 0x00013100, - 0x04020032, 0x8c040d22, 0x04000032, 0x59300020, - 0x8001ed40, 0x02000800, 0x0010032d, 0x82000580, - 0xffffffff, 0x04000029, 0x58f40201, 0x82000580, - 0x0000dcb3, 0x02020800, 0x0010032d, 0x58f40a02, - 0x82040500, 0x0000fffe, 0x04000003, 0x0401ff74, - 0x58f40a02, 0x82040480, 0x0000000f, 0x04021059, - 0x80040800, 0x4805ea02, 0x82040580, 0x00000008, - 0x0400005d, 0x82040480, 0x00000008, 0x0400100a, - 0x58f40000, 0x8001ed40, 0x02000800, 0x0010032d, - 0x58f40201, 0x82000580, 0x0000ddb9, 0x02020800, - 0x0010032d, 0x58f40401, 0x82000c00, 0x00000002, - 0x4805ec01, 0x80f40400, 0x59300813, 0x44040000, - 0x80000000, 0x45780000, 0x5c01e800, 0x1c01f000, - 0x42001000, 0x00000400, 0x59b800e4, 0x8c000524, - 0x04020023, 0x4a0370e4, 0x00030000, 0x40000000, - 0x59b800e4, 0x8c000524, 0x0402001b, 0x59300808, - 0x84040d62, 0x48066008, 0x4a0370e4, 0x00020000, - 0x4d2c0000, 0x0201f800, 0x0010055a, 0x04000025, - 0x492e6020, 0x4a025a01, 0x0000dcb3, 0x59300009, - 0x80001d40, 0x02000800, 0x0010032d, 0x580c0810, - 0x48065803, 0x59301812, 0x40040000, 0x800c0580, - 0x0402000d, 0x497a5a02, 0x4a025c01, 0x00000004, - 0x0401f011, 0x4a0370e4, 0x00020000, 0x40000000, - 0x40000000, 0x80081040, 0x02000800, 0x0010032d, - 0x0401f7d6, 0x4a025a02, 0x00000001, 0x4a025c01, - 0x00000006, 0x497a5804, 0x400c0000, 0x80040480, - 0x48025805, 0x412de800, 0x5c025800, 0x0401f7a9, - 0x5c025800, 0x4a026020, 0xffffffff, 0x0401f7c3, - 0x4d2c0000, 0x58f65800, 0x0201f800, 0x00100580, - 0x40f65800, 0x0201f800, 0x00100580, 0x5c025800, - 0x0401f7f5, 0x4d2c0000, 0x0201f800, 0x0010055a, - 0x040007f8, 0x4a025a01, 0x0000ddb9, 0x4a025c01, - 0x00000002, 0x492de800, 0x412de800, 0x5c025800, - 0x0401f7a5, 0x0401ff1e, 0x82f40400, 0x00000004, - 0x800c0400, 0x40000800, 0x50040000, 0x80100580, - 0x04000016, 0x82040c00, 0x00000002, 0x80081040, - 0x040207fa, 0x80f9f1c0, 0x04000011, 0x58f41202, - 0x82081480, 0x00000007, 0x82f80400, 0x00000002, - 0x800c0400, 0x40000800, 0x50040000, 0x80100580, - 0x04000006, 0x82040c00, 0x00000002, 0x80081040, - 0x040207fa, 0x0401f002, 0x1c01f000, 0x82000540, - 0x00000001, 0x0401f7fd, 0x4cf40000, 0x4cf80000, - 0x4001e800, 0x812e59c0, 0x04000024, 0x592c0a07, - 0x800409c0, 0x04020021, 0x82f40580, 0xffffffff, - 0x0400001b, 0x58f40201, 0x82000580, 0x0000dcb3, - 0x02020800, 0x0010032d, 0x58f40000, 0x8001f540, - 0x04000006, 0x58f80201, 0x82000580, 0x0000ddb9, - 0x02020800, 0x0010032d, 0x41783800, 0x58f44003, - 0x0401f839, 0x04020009, 0x0401ff2c, 0x497a6020, - 0x59300808, 0x84040d22, 0x48066008, 0x5c01f000, - 0x5c01e800, 0x1c01f000, 0x0401ff24, 0x4a025a07, - 0x00000011, 0x0401f7f6, 0x0401ff06, 0x0401f7f4, - 0x4cf40000, 0x4cf80000, 0x4001e800, 0x82040580, - 0x00000001, 0x04020020, 0x82f40580, 0xffffffff, - 0x0400001a, 0x58f40201, 0x82000580, 0x0000dcb3, - 0x02020800, 0x0010032d, 0x58f40000, 0x8001f540, - 0x04000006, 0x58f80201, 0x82000580, 0x0000ddb9, - 0x02020800, 0x0010032d, 0x41783800, 0x58f44003, - 0x0401f811, 0x04020008, 0x0401ff04, 0x42000800, - 0x00000001, 0x497a6020, 0x5c01f000, 0x5c01e800, - 0x1c01f000, 0x0401fefd, 0x42000800, 0x00000011, - 0x0401f7f9, 0x4c040000, 0x0401fede, 0x5c000800, - 0x0401f7f5, 0x4803c856, 0x401c2000, 0x41781800, - 0x4c200000, 0x0401ff88, 0x5c004000, 0x0402002a, - 0x40202000, 0x42001800, 0x00000001, 0x0401ff82, - 0x04020025, 0x0401fe9e, 0x40082800, 0x82f43400, - 0x00000004, 0x50182000, 0x40100000, 0x801c0580, - 0x04000005, 0x42001800, 0x00000001, 0x0401ff76, - 0x04020019, 0x82183400, 0x00000002, 0x80142840, - 0x040207f5, 0x80f9f1c0, 0x04000012, 0x58f42a02, - 0x82142c80, 0x00000007, 0x82f83400, 0x00000002, - 0x50182000, 0x40100000, 0x801c0580, 0x04000005, - 0x42001800, 0x00000001, 0x0401ff63, 0x04020006, - 0x82183400, 0x00000002, 0x80142840, 0x040207f5, - 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fd, - 0x0201f800, 0x0010032d, 0x58380a05, 0x82040d00, - 0x000000ff, 0x82040580, 0x0000001b, 0x04000004, - 0x82040580, 0x0000002b, 0x040207f6, 0x50200000, - 0x80387c00, 0x583c2800, 0x583c2001, 0x583c1002, - 0x592c0a08, 0x58383010, 0x59303808, 0x497a6013, - 0x497a6014, 0x0201f000, 0x00020149, 0x58380208, - 0x8c000502, 0x040007e7, 0x50200000, 0x80387c00, - 0x583c2800, 0x583c2001, 0x58380405, 0x80001540, - 0x04020002, 0x58381408, 0x58c83401, 0x58380c09, - 0x59303808, 0x497a6013, 0x497a6014, 0x0201f000, - 0x00020149, 0x592c0409, 0x8c000502, 0x040007d5, - 0x592c040a, 0x80000540, 0x040007d2, 0x82000c80, - 0x00000002, 0x04001011, 0x58380001, 0x80007540, - 0x02000800, 0x0010032d, 0x58380205, 0x82000500, - 0x0000000f, 0x82000400, 0x00100e39, 0x50004000, - 0x40040000, 0x800409c0, 0x04000005, 0x82040c80, - 0x00000005, 0x040217f1, 0x80204400, 0x50200000, - 0x80387c00, 0x583c2800, 0x583c2001, 0x583c1002, - 0x592c0a08, 0x592c4c09, 0x592c300e, 0x59303808, - 0x497a6013, 0x497a6014, 0x4816600f, 0x48126010, - 0x480a6011, 0x481a6012, 0x80040840, 0x4806600e, - 0x02000000, 0x00020151, 0x80204000, 0x50201800, - 0x800c19c0, 0x0402000c, 0x58380001, 0x80007540, - 0x02000800, 0x0010032d, 0x58380205, 0x82000500, - 0x0000000f, 0x82000400, 0x00100e39, 0x50004000, - 0x50201800, 0x483a600c, 0x480e600b, 0x4822600d, - 0x0201f000, 0x00020151, 0x4803c856, 0x592c0209, - 0x8c00051e, 0x04020017, 0x50200000, 0x80306c00, - 0x40240000, 0x0c01f001, 0x00100b7e, 0x00100b7e, - 0x00100b87, 0x00100b7e, 0x00100b7e, 0x00100b7e, - 0x00100b7e, 0x00100b7e, 0x00100b87, 0x00100b7e, - 0x00100b87, 0x00100b7e, 0x00100b7e, 0x00100b87, - 0x00100b7e, 0x00100b7e, 0x0201f800, 0x0010032d, - 0x8400051e, 0x48025a09, 0x50200000, 0x80306c00, - 0x58343801, 0x481e6010, 0x0401f007, 0x58341802, - 0x58342800, 0x58343801, 0x480e6011, 0x4816600f, - 0x481e6010, 0x0401f28a, 0x4933c857, 0x5931f809, - 0x59301006, 0x800811c0, 0x0400000b, 0x41780800, - 0x42000000, 0x0000000a, 0x0201f800, 0x00105f69, - 0x80080102, 0x04020002, 0x84001542, 0x80081040, - 0x4809fc07, 0x4a026006, 0x00000002, 0x592c040a, - 0x82000500, 0x00000008, 0x0400000b, 0x0401f831, - 0x59300203, 0x82000580, 0x00000004, 0x04020005, - 0x42027000, 0x00000048, 0x0201f800, 0x00020a34, - 0x1c01f000, 0x4cfc0000, 0x58fc0205, 0x82000500, - 0x000000ff, 0x82000580, 0x00000048, 0x04020009, - 0x58fc0409, 0x8c000500, 0x04000006, 0x58fc080c, - 0x8c040d16, 0x04000017, 0x58fc0008, 0x0401f00a, - 0x58fc0409, 0x8c000512, 0x04020014, 0x58fc0c0a, - 0x8c040d16, 0x04020003, 0x5c01f800, 0x1c01f000, - 0x58fc000b, 0x59300812, 0x80040580, 0x04020009, - 0x59300008, 0x84000500, 0x48026008, 0x42027000, - 0x00000048, 0x5c01f800, 0x0201f000, 0x00020a34, - 0x5c01f800, 0x1c01f000, 0x58fdf80a, 0x0401f7ec, - 0x5c000000, 0x4c000000, 0x4803c857, 0x4933c857, - 0x59b808ea, 0x82040d00, 0x00000007, 0x82040580, - 0x00000000, 0x04000025, 0x82040580, 0x00000003, - 0x04000022, 0x59300407, 0x4c000000, 0x4a026407, - 0x00000000, 0x42003000, 0x00000041, 0x4a0370e5, - 0x00003000, 0x42000000, 0x50000000, 0x41300800, - 0x4c180000, 0x0401fcac, 0x5c003000, 0x0400000e, - 0x42000000, 0x0000001e, 0x80000040, 0x040207ff, - 0x80183040, 0x040207f4, 0x42000000, 0x40000000, - 0x41300800, 0x0401fca0, 0x59880146, 0x80000000, - 0x48031146, 0x4a0370e5, 0x00002000, 0x5c000000, - 0x48026407, 0x1c01f000, 0x59300008, 0x84000500, - 0x48026008, 0x0401f7fc, 0x59c00007, 0x4a038006, - 0x30000000, 0x40000000, 0x59c00007, 0x8c00050a, - 0x040207fe, 0x1c01f000, 0x5c000000, 0x4c000000, - 0x4803c857, 0x42000800, 0x00000001, 0x0201f800, - 0x00101993, 0x4dc00000, 0x4a0370e8, 0x00000000, - 0x42038000, 0x00007720, 0x0401ffec, 0x42038000, - 0x00007700, 0x0401ffe9, 0x0201f800, 0x00104716, - 0x04020017, 0x4a038891, 0x0000ffff, 0x497b8880, - 0x4ce80000, 0x4201d000, 0x00000016, 0x0201f800, - 0x0010592d, 0x497b8892, 0x4201d000, 0x00000016, - 0x0201f800, 0x0010592d, 0x5c01d000, 0x42000000, - 0x0010bc60, 0x0201f800, 0x0010ad1d, 0x0401f812, - 0x5c038000, 0x0201f000, 0x0010483a, 0x0401f830, - 0x4c080000, 0x4c140000, 0x42000000, 0x0010bc61, - 0x0201f800, 0x0010ad1d, 0x0401f807, 0x5c002800, - 0x5c001000, 0x48178892, 0x480b8880, 0x5c038000, - 0x1c01f000, 0x496fc857, 0x836c0580, 0x00000003, - 0x0402000b, 0x4c080000, 0x4c0c0000, 0x42001000, - 0x00008048, 0x42001800, 0x0000ffff, 0x0201f800, - 0x001031eb, 0x5c001800, 0x5c001000, 0x42000800, - 0x0000003c, 0x0201f800, 0x001010da, 0x59a8006a, - 0x80000540, 0x04000005, 0x59a8106b, 0x800811c0, - 0x02020800, 0x001018fe, 0x4a038891, 0x0000ffff, - 0x4a03900d, 0x00000040, 0x0201f800, 0x00100684, - 0x4a0370e8, 0x00000001, 0x1c01f000, 0x5c000000, - 0x4c000000, 0x4803c857, 0x59c41080, 0x497b8880, - 0x4ce80000, 0x4201d000, 0x00000016, 0x4c080000, - 0x0201f800, 0x0010592d, 0x5c001000, 0x5c01d000, - 0x59c42892, 0x497b8892, 0x0201f800, 0x00104716, - 0x04020002, 0x1c01f000, 0x42002000, 0x00000260, - 0x59c418a4, 0x820c1d00, 0x0000000f, 0x820c0580, - 0x00000000, 0x04000010, 0x59c41805, 0x820c1d00, - 0x00000001, 0x0402000e, 0x59c418a4, 0x820c1d00, - 0x0000000f, 0x820c0480, 0x00000007, 0x04001004, - 0x820c0480, 0x0000000c, 0x04001003, 0x80102040, - 0x040207ec, 0x497b8891, 0x1c01f000, 0x4c100000, - 0x42002000, 0x00000019, 0x4a038805, 0x00000001, - 0x0201f800, 0x00101730, 0x59c41805, 0x820c1d00, - 0x00000001, 0x04000005, 0x80102040, 0x040207f7, - 0x5c002000, 0x0401f7f0, 0x5c002000, 0x0401f7ec, - 0x4803c856, 0x1c01f000, 0x00100cb6, 0x00100cb6, - 0x00100cb6, 0x00100cda, 0x00100cb6, 0x00100cb6, - 0x00100cb6, 0x00100cb6, 0x00100cb6, 0x00100cda, - 0x00100cb6, 0x00100cb8, 0x00100cb6, 0x00100cb6, - 0x00100cb6, 0x00100cb6, 0x0201f800, 0x0010032d, - 0x82040580, 0x0000001b, 0x0400001a, 0x82040580, - 0x0000002b, 0x04000017, 0x82040580, 0x0000003b, - 0x02020800, 0x0010032d, 0x592c020b, 0x8c000500, - 0x04000073, 0x592c1a08, 0x82040500, 0x0000000f, - 0x82000400, 0x00100e39, 0x50001000, 0x50080000, - 0x59302014, 0x4802600b, 0x492e600c, 0x480a600d, - 0x480e600e, 0x48126013, 0x5c025800, 0x1c01f000, - 0x592c0010, 0x48026012, 0x592c0011, 0x48026014, - 0x592c1a08, 0x0401f7ed, 0x82040500, 0x0000000f, - 0x82000400, 0x00100e39, 0x50001000, 0x50080000, - 0x592c1a08, 0x4802600b, 0x492e600c, 0x480a600d, - 0x480e600e, 0x497a6013, 0x0401f7ec, 0x8c040d00, - 0x0402004f, 0x82040d00, 0x00000080, 0x0400004c, - 0x0201f000, 0x00020164, 0x59300014, 0x59301013, - 0x80080580, 0x0402000c, 0x42007800, 0x80000005, - 0x592c1209, 0x82080500, 0xffff7fff, 0x48025a09, - 0x8c08151e, 0x0402003b, 0x823c7d40, 0x00000020, - 0x0401f038, 0x480bc857, 0x42000000, 0x0010bc0d, - 0x0201f800, 0x0010ad1d, 0x59302014, 0x59300415, - 0x4803c857, 0x8c000514, 0x04020011, 0x599c1819, - 0x8c0c1d12, 0x0400000b, 0x592c0810, 0x59300016, - 0x80040c80, 0x04000005, 0x04001004, 0x80040000, - 0x80140480, 0x0400100a, 0x0201f800, 0x00107134, - 0x820c1d40, 0x00000001, 0x0401f020, 0x84000514, - 0x48026415, 0x48126016, 0x4813c857, 0x0401f93e, - 0x0402001a, 0x42007800, 0x80000005, 0x5930500e, - 0x592c0209, 0x4803c857, 0x8c00051e, 0x04020005, - 0x823c7d40, 0x00000020, 0x5930400d, 0x0401f004, - 0x8400051e, 0x48025a09, 0x0401f8ed, 0x50201800, - 0x480e600b, 0x4832600c, 0x4822600d, 0x482a600e, - 0x480fc857, 0x4833c857, 0x4823c857, 0x482bc857, - 0x80000580, 0x483e6004, 0x1c01f000, 0x0201f800, - 0x0010032d, 0x4933c857, 0x4d2c0000, 0x59900004, + 0x58f40a02, 0x82040500, 0x0000fffe, 0x04000003, + 0x0401ff74, 0x58f40a02, 0x82040480, 0x0000000f, + 0x04021059, 0x80040800, 0x4805ea02, 0x82040580, + 0x00000008, 0x0400005d, 0x82040480, 0x00000008, + 0x0400100a, 0x58f40000, 0x8001ed40, 0x02000800, + 0x0010032d, 0x58f40201, 0x82000580, 0x0000ddb9, + 0x02020800, 0x0010032d, 0x58f40401, 0x82000c00, + 0x00000002, 0x4805ec01, 0x80f40400, 0x59300813, + 0x44040000, 0x80000000, 0x45780000, 0x5c01e800, + 0x1c01f000, 0x42001000, 0x00000400, 0x59b800e4, + 0x8c000524, 0x04020023, 0x4a0370e4, 0x00030000, + 0x40000000, 0x59b800e4, 0x8c000524, 0x0402001b, + 0x59300808, 0x84040d62, 0x48066008, 0x4a0370e4, + 0x00020000, 0x4d2c0000, 0x0201f800, 0x0010055a, + 0x04000025, 0x492e6020, 0x4a025a01, 0x0000dcb3, + 0x59300009, 0x80001d40, 0x02000800, 0x0010032d, + 0x580c0810, 0x48065803, 0x59301812, 0x40040000, + 0x800c0580, 0x0402000d, 0x497a5a02, 0x4a025c01, + 0x00000004, 0x0401f011, 0x4a0370e4, 0x00020000, + 0x40000000, 0x40000000, 0x80081040, 0x02000800, + 0x0010032d, 0x0401f7d6, 0x4a025a02, 0x00000001, + 0x4a025c01, 0x00000006, 0x497a5804, 0x400c0000, + 0x80040480, 0x48025805, 0x412de800, 0x5c025800, + 0x0401f7a9, 0x5c025800, 0x4a026020, 0xffffffff, + 0x0401f7c3, 0x4d2c0000, 0x58f65800, 0x0201f800, + 0x00100580, 0x40f65800, 0x0201f800, 0x00100580, + 0x5c025800, 0x0401f7f5, 0x4d2c0000, 0x0201f800, + 0x0010055a, 0x040007f8, 0x4a025a01, 0x0000ddb9, + 0x4a025c01, 0x00000002, 0x492de800, 0x412de800, + 0x5c025800, 0x0401f7a5, 0x0401ff1e, 0x82f40400, + 0x00000004, 0x800c0400, 0x40000800, 0x50040000, + 0x80100580, 0x04000016, 0x82040c00, 0x00000002, + 0x80081040, 0x040207fa, 0x80f9f1c0, 0x04000011, + 0x58f41202, 0x82081480, 0x00000007, 0x82f80400, + 0x00000002, 0x800c0400, 0x40000800, 0x50040000, + 0x80100580, 0x04000006, 0x82040c00, 0x00000002, + 0x80081040, 0x040207fa, 0x0401f002, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fd, 0x4cf40000, + 0x4cf80000, 0x4001e800, 0x812e59c0, 0x04000024, + 0x592c0a07, 0x800409c0, 0x04020021, 0x82f40580, + 0xffffffff, 0x0400001b, 0x58f40201, 0x82000580, + 0x0000dcb3, 0x02020800, 0x0010032d, 0x58f40000, + 0x8001f540, 0x04000006, 0x58f80201, 0x82000580, + 0x0000ddb9, 0x02020800, 0x0010032d, 0x41783800, + 0x58f44003, 0x0401f839, 0x04020009, 0x0401ff2c, + 0x497a6020, 0x59300808, 0x84040d22, 0x48066008, + 0x5c01f000, 0x5c01e800, 0x1c01f000, 0x0401ff24, + 0x4a025a07, 0x00000011, 0x0401f7f6, 0x0401ff06, + 0x0401f7f4, 0x4cf40000, 0x4cf80000, 0x4001e800, + 0x82040580, 0x00000001, 0x04020020, 0x82f40580, + 0xffffffff, 0x0400001a, 0x58f40201, 0x82000580, + 0x0000dcb3, 0x02020800, 0x0010032d, 0x58f40000, + 0x8001f540, 0x04000006, 0x58f80201, 0x82000580, + 0x0000ddb9, 0x02020800, 0x0010032d, 0x41783800, + 0x58f44003, 0x0401f811, 0x04020008, 0x0401ff04, + 0x42000800, 0x00000001, 0x497a6020, 0x5c01f000, + 0x5c01e800, 0x1c01f000, 0x0401fefd, 0x42000800, + 0x00000011, 0x0401f7f9, 0x4c040000, 0x0401fede, + 0x5c000800, 0x0401f7f5, 0x4803c856, 0x401c2000, + 0x41781800, 0x4c200000, 0x0401ff88, 0x5c004000, + 0x0402002a, 0x40202000, 0x42001800, 0x00000001, + 0x0401ff82, 0x04020025, 0x0401fe9e, 0x40082800, + 0x82f43400, 0x00000004, 0x50182000, 0x40100000, + 0x801c0580, 0x04000005, 0x42001800, 0x00000001, + 0x0401ff76, 0x04020019, 0x82183400, 0x00000002, + 0x80142840, 0x040207f5, 0x80f9f1c0, 0x04000012, + 0x58f42a02, 0x82142c80, 0x00000007, 0x82f83400, + 0x00000002, 0x50182000, 0x40100000, 0x801c0580, + 0x04000005, 0x42001800, 0x00000001, 0x0401ff63, + 0x04020006, 0x82183400, 0x00000002, 0x80142840, + 0x040207f5, 0x1c01f000, 0x82000540, 0x00000001, + 0x0401f7fd, 0x0201f800, 0x0010032d, 0x58380a05, + 0x82040d00, 0x000000ff, 0x82040580, 0x0000001b, + 0x04000004, 0x82040580, 0x0000002b, 0x040207f6, + 0x50200000, 0x80387c00, 0x583c2800, 0x583c2001, + 0x583c1002, 0x592c0a08, 0x58383010, 0x59303808, + 0x497a6013, 0x497a6014, 0x0201f000, 0x00020149, + 0x58380208, 0x8c000502, 0x040007e7, 0x50200000, + 0x80387c00, 0x583c2800, 0x583c2001, 0x58380405, + 0x80001540, 0x04020002, 0x58381408, 0x58c83401, + 0x58380c09, 0x59303808, 0x497a6013, 0x497a6014, + 0x0201f000, 0x00020149, 0x592c0409, 0x8c000502, + 0x040007d5, 0x592c040a, 0x80000540, 0x040007d2, + 0x82000c80, 0x00000002, 0x04001011, 0x58380001, + 0x80007540, 0x02000800, 0x0010032d, 0x58380205, + 0x82000500, 0x0000000f, 0x82000400, 0x00100e3a, + 0x50004000, 0x40040000, 0x800409c0, 0x04000005, + 0x82040c80, 0x00000005, 0x040217f1, 0x80204400, + 0x50200000, 0x80387c00, 0x583c2800, 0x583c2001, + 0x583c1002, 0x592c0a08, 0x592c4c09, 0x592c300e, + 0x59303808, 0x497a6013, 0x497a6014, 0x4816600f, + 0x48126010, 0x480a6011, 0x481a6012, 0x80040840, + 0x4806600e, 0x02000000, 0x00020151, 0x80204000, + 0x50201800, 0x800c19c0, 0x0402000c, 0x58380001, + 0x80007540, 0x02000800, 0x0010032d, 0x58380205, + 0x82000500, 0x0000000f, 0x82000400, 0x00100e3a, + 0x50004000, 0x50201800, 0x483a600c, 0x480e600b, + 0x4822600d, 0x0201f000, 0x00020151, 0x4803c856, + 0x592c0209, 0x8c00051e, 0x04020017, 0x50200000, + 0x80306c00, 0x40240000, 0x0c01f001, 0x00100b7f, + 0x00100b7f, 0x00100b88, 0x00100b7f, 0x00100b7f, + 0x00100b7f, 0x00100b7f, 0x00100b7f, 0x00100b88, + 0x00100b7f, 0x00100b88, 0x00100b7f, 0x00100b7f, + 0x00100b88, 0x00100b7f, 0x00100b7f, 0x0201f800, + 0x0010032d, 0x8400051e, 0x48025a09, 0x50200000, + 0x80306c00, 0x58343801, 0x481e6010, 0x0401f007, + 0x58341802, 0x58342800, 0x58343801, 0x480e6011, + 0x4816600f, 0x481e6010, 0x0401f28a, 0x4933c857, + 0x5931f809, 0x59301006, 0x800811c0, 0x0400000b, + 0x41780800, 0x42000000, 0x0000000a, 0x0201f800, + 0x0010600e, 0x80080102, 0x04020002, 0x84001542, + 0x80081040, 0x4809fc07, 0x4a026006, 0x00000002, + 0x592c040a, 0x82000500, 0x00000008, 0x0400000b, + 0x0401f831, 0x59300203, 0x82000580, 0x00000004, + 0x04020005, 0x42027000, 0x00000048, 0x0201f800, + 0x00020a34, 0x1c01f000, 0x4cfc0000, 0x58fc0205, + 0x82000500, 0x000000ff, 0x82000580, 0x00000048, + 0x04020009, 0x58fc0409, 0x8c000500, 0x04000006, + 0x58fc080c, 0x8c040d16, 0x04000017, 0x58fc0008, + 0x0401f00a, 0x58fc0409, 0x8c000512, 0x04020014, + 0x58fc0c0a, 0x8c040d16, 0x04020003, 0x5c01f800, + 0x1c01f000, 0x58fc000b, 0x59300812, 0x80040580, + 0x04020009, 0x59300008, 0x84000500, 0x48026008, + 0x42027000, 0x00000048, 0x5c01f800, 0x0201f000, + 0x00020a34, 0x5c01f800, 0x1c01f000, 0x58fdf80a, + 0x0401f7ec, 0x5c000000, 0x4c000000, 0x4803c857, + 0x4933c857, 0x59b808ea, 0x82040d00, 0x00000007, + 0x82040580, 0x00000000, 0x04000025, 0x82040580, + 0x00000003, 0x04000022, 0x59300407, 0x4c000000, + 0x4a026407, 0x00000000, 0x42003000, 0x00000041, + 0x4a0370e5, 0x00003000, 0x42000000, 0x50000000, + 0x41300800, 0x4c180000, 0x0401fca9, 0x5c003000, + 0x0400000e, 0x42000000, 0x0000001e, 0x80000040, + 0x040207ff, 0x80183040, 0x040207f4, 0x42000000, + 0x40000000, 0x41300800, 0x0401fc9d, 0x59880146, + 0x80000000, 0x48031146, 0x4a0370e5, 0x00002000, + 0x5c000000, 0x48026407, 0x1c01f000, 0x59300008, + 0x84000500, 0x48026008, 0x0401f7fc, 0x59c00007, + 0x4a038006, 0x30000000, 0x40000000, 0x59c00007, + 0x8c00050a, 0x040207fe, 0x1c01f000, 0x5c000000, + 0x4c000000, 0x4803c857, 0x42000800, 0x00000001, + 0x0201f800, 0x00101994, 0x4dc00000, 0x4a0370e8, + 0x00000000, 0x42038000, 0x00007720, 0x0401ffec, + 0x42038000, 0x00007700, 0x0401ffe9, 0x0201f800, + 0x00104755, 0x04020017, 0x4a038891, 0x0000ffff, + 0x497b8880, 0x4ce80000, 0x4201d000, 0x00000016, + 0x0201f800, 0x001059d2, 0x497b8892, 0x4201d000, + 0x00000016, 0x0201f800, 0x001059d2, 0x5c01d000, + 0x42000000, 0x0010bd60, 0x0201f800, 0x0010ae10, + 0x0401f812, 0x5c038000, 0x0201f000, 0x00104879, + 0x0401f830, 0x4c080000, 0x4c140000, 0x42000000, + 0x0010bd61, 0x0201f800, 0x0010ae10, 0x0401f807, + 0x5c002800, 0x5c001000, 0x48178892, 0x480b8880, + 0x5c038000, 0x1c01f000, 0x496fc857, 0x836c0580, + 0x00000003, 0x0402000b, 0x4c080000, 0x4c0c0000, + 0x42001000, 0x00008048, 0x42001800, 0x0000ffff, + 0x0201f800, 0x001031f5, 0x5c001800, 0x5c001000, + 0x42000800, 0x0000003c, 0x0201f800, 0x001010db, + 0x59a8006a, 0x80000540, 0x04000005, 0x59a8106b, + 0x800811c0, 0x02020800, 0x001018ff, 0x4a038891, + 0x0000ffff, 0x4a03900d, 0x00000040, 0x0201f800, + 0x00100684, 0x4a0370e8, 0x00000001, 0x1c01f000, + 0x5c000000, 0x4c000000, 0x4803c857, 0x59c41080, + 0x497b8880, 0x4ce80000, 0x4201d000, 0x00000016, + 0x4c080000, 0x0201f800, 0x001059d2, 0x5c001000, + 0x5c01d000, 0x59c42892, 0x497b8892, 0x0201f800, + 0x00104755, 0x04020002, 0x1c01f000, 0x42002000, + 0x00000260, 0x59c418a4, 0x820c1d00, 0x0000000f, + 0x820c0580, 0x00000000, 0x04000010, 0x59c41805, + 0x820c1d00, 0x00000001, 0x0402000e, 0x59c418a4, + 0x820c1d00, 0x0000000f, 0x820c0480, 0x00000007, + 0x04001004, 0x820c0480, 0x0000000c, 0x04001003, + 0x80102040, 0x040207ec, 0x497b8891, 0x1c01f000, + 0x4c100000, 0x42002000, 0x00000019, 0x4a038805, + 0x00000001, 0x0201f800, 0x00101731, 0x59c41805, + 0x820c1d00, 0x00000001, 0x04000005, 0x80102040, + 0x040207f7, 0x5c002000, 0x0401f7f0, 0x5c002000, + 0x0401f7ec, 0x4803c856, 0x1c01f000, 0x00100cb7, + 0x00100cb7, 0x00100cb7, 0x00100cdb, 0x00100cb7, + 0x00100cb7, 0x00100cb7, 0x00100cb7, 0x00100cb7, + 0x00100cdb, 0x00100cb7, 0x00100cb9, 0x00100cb7, + 0x00100cb7, 0x00100cb7, 0x00100cb7, 0x0201f800, + 0x0010032d, 0x82040580, 0x0000001b, 0x0400001a, + 0x82040580, 0x0000002b, 0x04000017, 0x82040580, + 0x0000003b, 0x02020800, 0x0010032d, 0x592c020b, + 0x8c000500, 0x04000073, 0x592c1a08, 0x82040500, + 0x0000000f, 0x82000400, 0x00100e3a, 0x50001000, + 0x50080000, 0x59302014, 0x4802600b, 0x492e600c, + 0x480a600d, 0x480e600e, 0x48126013, 0x5c025800, + 0x1c01f000, 0x592c0010, 0x48026012, 0x592c0011, + 0x48026014, 0x592c1a08, 0x0401f7ed, 0x82040500, + 0x0000000f, 0x82000400, 0x00100e3a, 0x50001000, + 0x50080000, 0x592c1a08, 0x4802600b, 0x492e600c, + 0x480a600d, 0x480e600e, 0x497a6013, 0x0401f7ec, + 0x8c040d00, 0x0402004f, 0x82040d00, 0x00000080, + 0x0400004c, 0x0201f000, 0x00020164, 0x59300014, + 0x59301013, 0x80080580, 0x0402000c, 0x42007800, + 0x80000005, 0x592c1209, 0x82080500, 0xffff7fff, + 0x48025a09, 0x8c08151e, 0x0402003b, 0x823c7d40, + 0x00000020, 0x0401f038, 0x480bc857, 0x42000000, + 0x0010bd0d, 0x0201f800, 0x0010ae10, 0x59302014, + 0x59300415, 0x4803c857, 0x8c000514, 0x04020011, + 0x599c1819, 0x8c0c1d12, 0x0400000b, 0x592c0810, + 0x59300016, 0x80040c80, 0x04000005, 0x04001004, + 0x80040000, 0x80140480, 0x0400100a, 0x0201f800, + 0x001071c7, 0x820c1d40, 0x00000001, 0x0401f020, + 0x84000514, 0x48026415, 0x48126016, 0x4813c857, + 0x0401f93e, 0x0402001a, 0x42007800, 0x80000005, + 0x5930500e, 0x592c0209, 0x4803c857, 0x8c00051e, + 0x04020005, 0x823c7d40, 0x00000020, 0x5930400d, + 0x0401f004, 0x8400051e, 0x48025a09, 0x0401f8ed, + 0x50201800, 0x480e600b, 0x4832600c, 0x4822600d, + 0x482a600e, 0x480fc857, 0x4833c857, 0x4823c857, + 0x482bc857, 0x80000580, 0x483e6004, 0x1c01f000, + 0x0201f800, 0x0010032d, 0x4933c857, 0x4d2c0000, + 0x59900004, 0x81300580, 0x02020800, 0x0010032d, + 0x0201f800, 0x00108953, 0x02000800, 0x0010032d, + 0x59325809, 0x4d3c0000, 0x4d400000, 0x59300004, + 0x4803c857, 0x4c000000, 0x0201f800, 0x00106346, + 0x0201f800, 0x001060e2, 0x5c000000, 0x8c000516, + 0x04000011, 0x592c0010, 0x4803c857, 0x48025808, + 0x41780800, 0x42028000, 0x00000002, 0x0201f800, + 0x00104543, 0x4a025c07, 0x0000ffff, 0x492fc857, + 0x0201f800, 0x000203ab, 0x0201f800, 0x00107144, + 0x0401f015, 0x4a026203, 0x00000002, 0x592c0209, + 0x8400054e, 0x48025a09, 0x59300407, 0x82000580, + 0x00000006, 0x04020009, 0x811800ca, 0x81c80c00, + 0x58040939, 0x592c000e, 0x80040480, 0x592c0810, + 0x80040480, 0x4802580c, 0x417a7800, 0x0201f800, + 0x0010853c, 0x5c028000, 0x5c027800, 0x5c025800, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x59900004, 0x81300580, 0x02020800, 0x0010032d, 0x0201f800, - 0x0010889a, 0x02000800, 0x0010032d, 0x59325809, - 0x4d3c0000, 0x4d400000, 0x59300004, 0x4803c857, - 0x4c000000, 0x0201f800, 0x001062a1, 0x0201f800, - 0x0010603d, 0x5c000000, 0x8c000516, 0x04000011, - 0x592c0010, 0x4803c857, 0x48025808, 0x41780800, - 0x42028000, 0x00000002, 0x0201f800, 0x00104504, - 0x4a025c07, 0x0000ffff, 0x492fc857, 0x0201f800, - 0x000203ab, 0x0201f800, 0x001070b5, 0x0401f015, - 0x4a026203, 0x00000002, 0x592c0209, 0x8400054e, - 0x48025a09, 0x59300407, 0x82000580, 0x00000006, - 0x04020009, 0x811800ca, 0x81c80c00, 0x58040939, - 0x592c000e, 0x80040480, 0x592c0810, 0x80040480, - 0x4802580c, 0x417a7800, 0x0201f800, 0x00108487, - 0x5c028000, 0x5c027800, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x4d2c0000, 0x59900004, 0x81300580, - 0x02020800, 0x0010032d, 0x0201f800, 0x0010889a, - 0x02000800, 0x0010032d, 0x59325809, 0x592c0209, - 0x84000540, 0x48025a09, 0x0401f7be, 0x491bc857, - 0x4dd00000, 0x4c580000, 0x41780800, 0x8007a0ca, - 0x83d3a400, 0x00007600, 0x4200b000, 0x000007d0, - 0x599c0019, 0x8c000506, 0x04020003, 0x4200b000, - 0x000003e8, 0x4a03a005, 0x80000002, 0x0402400d, - 0x4c040000, 0x02004800, 0x0002090c, 0x5c000800, - 0x42000000, 0x00001000, 0x50000000, 0x82000480, - 0x24320001, 0x04001003, 0x8058b040, 0x04000016, - 0x59d01006, 0x82080500, 0x00006000, 0x82000580, - 0x00006000, 0x04000007, 0x8c08151e, 0x040007ec, - 0x59d01006, 0x82080500, 0x00006000, 0x040207e8, - 0x83d3a400, 0x00000020, 0x80040800, 0x82040480, - 0x00000005, 0x040017d9, 0x5c00b000, 0x5c03a000, - 0x1c01f000, 0x41180000, 0x80040580, 0x04000008, - 0x42003000, 0x0010b895, 0x58180401, 0x8c000504, - 0x040007f0, 0x850e1d6e, 0x0401f7ee, 0x4a03a005, - 0x30000000, 0x59d00006, 0x4a03a005, 0x30000000, - 0x59d00006, 0x497ba003, 0x497ba007, 0x4a03a005, - 0xf0000001, 0x42001800, 0x00008000, 0x59d00006, - 0x8c00050a, 0x04000005, 0x800c1840, 0x040207fc, - 0x0201f800, 0x0010032d, 0x4a03a005, 0xf0000000, - 0x59d00006, 0x850e1d2e, 0x800410c8, 0x82081400, - 0x0000bf32, 0x58081804, 0x800c19c0, 0x040007d1, - 0x580c0004, 0x84000576, 0x48001804, 0x4933c857, - 0x0401f7cc, 0x4803c856, 0x4dd00000, 0x41780800, - 0x8007a0ca, 0x83d3a400, 0x00007600, 0x4a03a005, - 0x80000001, 0x59d00006, 0x83d3a400, 0x00000020, - 0x80040800, 0x82040480, 0x00000005, 0x040017f8, - 0x5c03a000, 0x1c01f000, 0x59d00006, 0x8c00053e, - 0x0400001e, 0x59902804, 0x4817c857, 0x801429c0, - 0x04000013, 0x5990000a, 0x5990080b, 0x5990100c, - 0x5990180d, 0x4800280b, 0x4804280c, 0x4808280d, - 0x480c280e, 0x59d00000, 0x59d00801, 0x59d01002, - 0x59d01803, 0x59d02004, 0x4800280f, 0x48042810, - 0x48082811, 0x480c2812, 0x48102813, 0x59900006, - 0x82000500, 0xffff0000, 0x48032006, 0x4a03a005, - 0x30000000, 0x59d00006, 0x1c01f000, 0x4803c856, - 0x80204000, 0x50200000, 0x80000540, 0x04000003, - 0x80285040, 0x1c01f000, 0x58300001, 0x80000540, - 0x0400000e, 0x4802600c, 0x40006000, 0x58300205, - 0x82000500, 0x0000000f, 0x82000400, 0x00100e39, - 0x50004000, 0x802041c0, 0x02000800, 0x0010032d, - 0x80285040, 0x1c01f000, 0x40005000, 0x1c01f000, - 0x00000006, 0x00000009, 0x0000000c, 0x0000000f, - 0x00000012, 0x00000000, 0x00000000, 0x0000000c, - 0x00000000, 0x00000000, 0x00000000, 0x00100e34, - 0x00100e33, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00100e34, 0x00100e33, 0x00100e30, - 0x00100e34, 0x00100e33, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00100e34, + 0x00108953, 0x02000800, 0x0010032d, 0x59325809, + 0x592c0209, 0x84000540, 0x48025a09, 0x0401f7be, + 0x491bc857, 0x4dd00000, 0x4c580000, 0x41780800, + 0x8007a0ca, 0x83d3a400, 0x00007600, 0x4200b000, + 0x000007d0, 0x599c0019, 0x8c000506, 0x04020003, + 0x4200b000, 0x000003e8, 0x4a03a005, 0x80000002, + 0x0402400d, 0x4c040000, 0x02004800, 0x0002090c, + 0x5c000800, 0x42000000, 0x00001000, 0x50000000, + 0x82000480, 0x24320001, 0x04001003, 0x8058b040, + 0x04000016, 0x59d01006, 0x82080500, 0x00006000, + 0x82000580, 0x00006000, 0x04000007, 0x8c08151e, + 0x040007ec, 0x59d01006, 0x82080500, 0x00006000, + 0x040207e8, 0x83d3a400, 0x00000020, 0x80040800, + 0x82040480, 0x00000005, 0x040017d9, 0x5c00b000, + 0x5c03a000, 0x1c01f000, 0x41180000, 0x80040580, + 0x04000008, 0x42003000, 0x0010b995, 0x58180401, + 0x8c000504, 0x040007f0, 0x850e1d6e, 0x0401f7ee, + 0x4a03a005, 0x30000000, 0x59d00006, 0x4a03a005, + 0x30000000, 0x59d00006, 0x497ba003, 0x497ba007, + 0x4a03a005, 0xf0000001, 0x42001800, 0x00008000, + 0x59d00006, 0x8c00050a, 0x04000005, 0x800c1840, + 0x040207fc, 0x0201f800, 0x0010032d, 0x4a03a005, + 0xf0000000, 0x59d00006, 0x850e1d2e, 0x800410c8, + 0x82081400, 0x0000bf32, 0x58081804, 0x800c19c0, + 0x040007d1, 0x580c0004, 0x84000576, 0x48001804, + 0x4933c857, 0x0401f7cc, 0x4803c856, 0x4dd00000, + 0x41780800, 0x8007a0ca, 0x83d3a400, 0x00007600, + 0x4a03a005, 0x80000001, 0x59d00006, 0x83d3a400, + 0x00000020, 0x80040800, 0x82040480, 0x00000005, + 0x040017f8, 0x5c03a000, 0x1c01f000, 0x59d00006, + 0x8c00053e, 0x0400001e, 0x59902804, 0x4817c857, + 0x801429c0, 0x04000013, 0x5990000a, 0x5990080b, + 0x5990100c, 0x5990180d, 0x4800280b, 0x4804280c, + 0x4808280d, 0x480c280e, 0x59d00000, 0x59d00801, + 0x59d01002, 0x59d01803, 0x59d02004, 0x4800280f, + 0x48042810, 0x48082811, 0x480c2812, 0x48102813, + 0x59900006, 0x82000500, 0xffff0000, 0x48032006, + 0x4a03a005, 0x30000000, 0x59d00006, 0x1c01f000, + 0x4803c856, 0x80204000, 0x50200000, 0x80000540, + 0x04000003, 0x80285040, 0x1c01f000, 0x58300001, + 0x80000540, 0x0400000e, 0x4802600c, 0x40006000, + 0x58300205, 0x82000500, 0x0000000f, 0x82000400, + 0x00100e3a, 0x50004000, 0x802041c0, 0x02000800, + 0x0010032d, 0x80285040, 0x1c01f000, 0x40005000, + 0x1c01f000, 0x00000006, 0x00000009, 0x0000000c, + 0x0000000f, 0x00000012, 0x00000000, 0x00000000, + 0x0000000c, 0x00000000, 0x00000000, 0x00000000, + 0x00100e35, 0x00100e34, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00100e35, 0x00100e34, + 0x00100e31, 0x00100e35, 0x00100e34, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00100e34, 0x00100e34, 0x00100e34, - 0x00000000, 0x00100e34, 0x00000000, 0x00000000, - 0x00000000, 0x4813c857, 0x492fc857, 0x4933c857, - 0x48126013, 0x592c5208, 0x802851c0, 0x0400004a, - 0x412c6000, 0x0401f84b, 0x04000009, 0x82240580, - 0x00000002, 0x04020003, 0x5830000e, 0x80102480, - 0x50200000, 0x80004540, 0x0400003f, 0x50200000, - 0x80000540, 0x0400000b, 0x80301400, 0x58080002, - 0x80102480, 0x0400101e, 0x801021c0, 0x04000009, - 0x80285040, 0x04000034, 0x80204000, 0x0401f7f4, - 0x58300001, 0x80006540, 0x0400002f, 0x0401f7e6, - 0x80285040, 0x0400002c, 0x80204000, 0x50200000, - 0x80000540, 0x0402000a, 0x58300001, 0x80006540, - 0x04000025, 0x58300205, 0x82004d00, 0x0000000f, - 0x82244400, 0x00100e39, 0x50204000, 0x592c0209, - 0x8400051e, 0x48025a09, 0x0401f013, 0x80102080, - 0x80102000, 0x48126011, 0x4813c857, 0x58080802, - 0x40100000, 0x80042480, 0x02001800, 0x0010032d, - 0x58080000, 0x58081801, 0x80102400, 0x4812600f, - 0x480e6010, 0x4813c857, 0x592c0209, 0x8400055e, - 0x48025a09, 0x4833c857, 0x4823c857, 0x482bc857, - 0x4832600c, 0x4822600d, 0x482a600e, 0x80000580, - 0x0401f003, 0x82000540, 0x00000001, 0x1c01f000, - 0x58300205, 0x82004d00, 0x0000000f, 0x82244400, - 0x00100e39, 0x82000500, 0x000000ff, 0x82000580, - 0x00000029, 0x0402001b, 0x50204000, 0x592c040a, - 0x80000540, 0x02000800, 0x0010032d, 0x82000c80, - 0x00000002, 0x04001011, 0x58300001, 0x80006540, - 0x02000800, 0x0010032d, 0x58300205, 0x82000500, - 0x0000000f, 0x82000400, 0x00100e39, 0x50004000, - 0x40040000, 0x800409c0, 0x04000006, 0x82040c80, - 0x00000005, 0x040217f1, 0x80204400, 0x80000580, - 0x1c01f000, 0x4c5c0000, 0x59e4b800, 0x485fc857, - 0x825c0500, 0x0000001f, 0x04000004, 0x59e40862, - 0x0201f800, 0x0010032d, 0x825c0500, 0x000000e0, - 0x02000800, 0x0010032d, 0x8c5cbd0e, 0x04020807, - 0x8c5cbd0c, 0x04020809, 0x8c5cbd0a, 0x04020873, - 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4a03c800, - 0x00000080, 0x1c01f000, 0x4d2c0000, 0x42007800, - 0x0010bcb1, 0x583c0003, 0x583c0804, 0x80040540, - 0x0400003a, 0x42000800, 0x0010bb56, 0x50065800, - 0x592c0002, 0x82000580, 0x00000000, 0x04000033, - 0x59e40050, 0x59e40852, 0x80040480, 0x82000500, - 0xfffffc00, 0x04020005, 0x59e40050, 0x59e40851, - 0x80040800, 0x80040480, 0x82000c80, 0x00000400, - 0x59e40050, 0x80041400, 0x480bc857, 0x50080000, - 0x58080801, 0x80040540, 0x04000020, 0x480bc857, - 0x480a5803, 0x583c1009, 0x583c000a, 0x80080580, - 0x04020005, 0x583c0000, 0x84000550, 0x48007800, - 0x41781000, 0x82080400, 0x00001000, 0x4803c857, - 0x48007809, 0x583c0003, 0x80081400, 0x480bc857, - 0x583c0804, 0x4a025801, 0x00000000, 0x4a025808, - 0x00100f2e, 0x480a5806, 0x48065807, 0x59e40053, - 0x800000c4, 0x48025805, 0x412c1000, 0x492fc857, - 0x0201f800, 0x00020016, 0x5c025800, 0x4a03c800, - 0x00000040, 0x1c01f000, 0x42007800, 0x0010bb56, - 0x503c7800, 0x4a007802, 0x00000100, 0x42007800, - 0x0010bcb1, 0x583c0000, 0x84000552, 0x48007800, - 0x583c100c, 0x480bc857, 0x80081000, 0x4808780c, - 0x583c180b, 0x800c19c0, 0x04000017, 0x82080500, - 0x00000003, 0x04020014, 0x583c0007, 0x4803c857, - 0x583c2008, 0x4813c857, 0x80102000, 0x80100580, - 0x04020002, 0x41782000, 0x48107808, 0x400c0000, - 0x80080580, 0x04020008, 0x4978780c, 0x42001800, - 0x00000001, 0x42001000, 0x00008028, 0x0201f800, - 0x001031eb, 0x1c01f000, 0x4a03c800, 0x00000020, - 0x0201f800, 0x0010ad15, 0x59e40000, 0x1c01f000, - 0x42000000, 0x00001000, 0x50000000, 0x82000480, - 0x24320001, 0x0400100d, 0x0201f800, 0x0010ae33, - 0x04000008, 0x42000000, 0x00007a42, 0x50007000, - 0x8c387520, 0x04020003, 0x84387560, 0x44380000, - 0x4a030000, 0x00000000, 0x1c01f000, 0x4d2c0000, - 0x4a007000, 0x00000000, 0x82040d00, 0x43000f80, - 0x02020800, 0x0010032d, 0x58380008, 0x4803c00f, - 0x4a0370e4, 0x00003000, 0x0201f800, 0x00108cc3, - 0x583a5807, 0x592c0000, 0x48007007, 0x800001c0, - 0x04020002, 0x49787006, 0x0201f800, 0x00100580, - 0x5c025800, 0x42007000, 0x00020b54, 0x0201f000, - 0x0002002c, 0x4803c856, 0x4c3c0000, 0x4d2c0000, - 0x4d300000, 0x58300009, 0x80025d40, 0x02000800, - 0x0010032d, 0x592e6009, 0x4c300000, 0x0201f800, - 0x00108ce2, 0x5c006000, 0x02000800, 0x0010032d, - 0x58300002, 0x82000580, 0x00000100, 0x0402000f, - 0x5930780c, 0x583c0001, 0x80007d40, 0x0400000e, - 0x4802600c, 0x82000400, 0x00000002, 0x48006003, - 0x583c0000, 0x48006005, 0x40301000, 0x0201f800, - 0x00020016, 0x0401f00c, 0x4a025a07, 0x00000002, - 0x492fc857, 0x4c300000, 0x0201f800, 0x000203ab, - 0x5c025800, 0x0201f800, 0x00100580, 0x0201f800, - 0x00020a10, 0x5c026000, 0x5c025800, 0x5c007800, - 0x1c01f000, 0x4803c856, 0x4d2c0000, 0x4d300000, - 0x42007000, 0x00020b54, 0x58380800, 0x82040580, - 0x00000002, 0x04020011, 0x58386001, 0x58300009, - 0x812c0580, 0x0402000d, 0x59e00004, 0x8c00050e, - 0x040007fe, 0x59dc0006, 0x4803c857, 0x4a03b805, - 0x20000000, 0x8c00053e, 0x040007f8, 0x4a007000, - 0x00000000, 0x0401f019, 0x58386005, 0x40305000, - 0x803061c0, 0x02000800, 0x0010032d, 0x58300009, - 0x812c0580, 0x04000004, 0x40305000, 0x58306000, - 0x0401f7f8, 0x40280000, 0x80300580, 0x58300000, - 0x04000006, 0x48005000, 0x800001c0, 0x04020007, - 0x48287004, 0x0401f005, 0x800001c0, 0x04020002, - 0x48007004, 0x48007005, 0x40325800, 0x0201f800, - 0x00100580, 0x5c026000, 0x5c025800, 0x0201f000, - 0x00020026, 0x4803c856, 0x42000800, 0x0000003c, - 0x48079000, 0x59c80000, 0x80040500, 0x040207fe, - 0x497b9005, 0x4a039035, 0x00880200, 0x59a8000d, - 0x800000e0, 0x4803900e, 0x4a039011, 0x00000024, - 0x4a03900f, 0x0010f584, 0x4a039010, 0x0010f584, - 0x4a039015, 0x0000007f, 0x4a03900d, 0x00000040, - 0x4a039000, 0x00001600, 0x1c01f000, 0x59c80007, - 0x8c000508, 0x040208c9, 0x59c80800, 0x8c040d16, - 0x04020004, 0x82000500, 0x00000006, 0x0c01f005, - 0x4807c857, 0x82000500, 0x0000000e, 0x0c01f001, - 0x0010102a, 0x00101028, 0x001050fa, 0x00101028, - 0x0010102c, 0x00101028, 0x0010102c, 0x0010102c, - 0x00101028, 0x00101028, 0x00101028, 0x00101028, - 0x0010102c, 0x00101028, 0x0010102c, 0x00101028, - 0x0201f800, 0x0010032d, 0x4803c857, 0x1c01f000, - 0x59c8080c, 0x4807c857, 0x82040500, 0x00006000, - 0x04000004, 0x0201f800, 0x0010acd8, 0x0401f006, - 0x82040500, 0x007f0000, 0x04000006, 0x0201f800, - 0x0010acaa, 0x0201f800, 0x001063ad, 0x0401f03c, - 0x82040500, 0x00000014, 0x04000014, 0x0201f800, - 0x0010ad07, 0x836c0580, 0x00000003, 0x0400000d, - 0x0201f800, 0x00104716, 0x04000004, 0x0201f800, - 0x001038f5, 0x0401f007, 0x4a035014, 0x00000001, - 0x4202d800, 0x00000001, 0x0201f800, 0x00104670, - 0x0401f828, 0x0401f026, 0x82040500, 0x00001c00, - 0x04000005, 0x0201f800, 0x0010ace6, 0x0401f821, - 0x0401f01f, 0x82040500, 0x00000140, 0x04000005, - 0x0201f800, 0x0010acf9, 0x0401f81a, 0x0401f018, - 0x82040500, 0x00008000, 0x04000015, 0x0201f800, - 0x00104716, 0x0400000f, 0x59c400a4, 0x82000500, - 0x0000000f, 0x82000580, 0x0000000b, 0x04020009, - 0x4c040000, 0x0201f800, 0x00103911, 0x42000000, - 0x0000001e, 0x80000040, 0x040207ff, 0x5c000800, - 0x0201f800, 0x0010acd1, 0x0401f802, 0x1c01f000, - 0x4c0c0000, 0x4c100000, 0x4c140000, 0x0201f800, - 0x00100c0e, 0x5c002800, 0x5c002000, 0x5c001800, - 0x1c01f000, 0x4803c856, 0x59a80804, 0x59a80020, - 0x82000500, 0xfffff000, 0x80040540, 0x48035020, - 0x59a80024, 0x82000500, 0xfffff000, 0x80040540, - 0x48035024, 0x48078882, 0x82041c00, 0x0000000f, - 0x800c1908, 0x820c1c00, 0x00000004, 0x400c2000, - 0x901029c0, 0x82040480, 0x000001e4, 0x04021005, - 0x42001000, 0x00000008, 0x801020c6, 0x0401f031, - 0x82040480, 0x00000230, 0x04021009, 0x42001000, - 0x00000007, 0x801000c2, 0x800000c2, 0x80100400, - 0x80100400, 0x80102400, 0x0401f026, 0x82040480, - 0x00000298, 0x04021008, 0x42001000, 0x00000006, - 0x801000c2, 0x800000c2, 0x80100400, 0x80102400, - 0x0401f01c, 0x82040480, 0x00000328, 0x04021007, - 0x42001000, 0x00000005, 0x801000c2, 0x800000c2, - 0x80102400, 0x0401f013, 0x82040480, 0x00000404, - 0x04021005, 0x42001000, 0x00000004, 0x801020c4, - 0x0401f00c, 0x82040480, 0x0000056c, 0x04021006, - 0x42001000, 0x00000003, 0x801000c2, 0x80102400, - 0x0401f004, 0x42001000, 0x00000002, 0x801020c2, - 0x82100480, 0x00000110, 0x80000080, 0x80002000, - 0x800800d0, 0x80140540, 0x80100540, 0x48039035, - 0x48035072, 0x1c01f000, 0x59c80815, 0x0201f800, - 0x00100322, 0x40680800, 0x82040d00, 0x0000007c, - 0x48079000, 0x59c80000, 0x80040500, 0x040207fe, - 0x8c040d04, 0x04000003, 0x59c80035, 0x48039035, - 0x59c80000, 0x82000540, 0x00001200, 0x48039000, - 0x1c01f000, 0x4803c856, 0x497b88a9, 0x4a038807, - 0x00000001, 0x497b8807, 0x59c40005, 0x48038805, - 0x0201f800, 0x00101616, 0x4201d000, 0x000001f4, - 0x0201f800, 0x0010592d, 0x497b880e, 0x4200b000, - 0x000001f4, 0x42000000, 0x00000001, 0x42000800, - 0x00000014, 0x0201f800, 0x0010173f, 0x42000800, - 0x00000014, 0x0201f800, 0x00101737, 0x8c040d00, - 0x04000005, 0x8058b040, 0x040207f3, 0x0201f800, - 0x0010032d, 0x4200b000, 0x00000032, 0x42000000, - 0x00000001, 0x42000800, 0x000000b4, 0x0201f800, - 0x0010173f, 0x42000800, 0x000000b4, 0x0201f800, - 0x00101737, 0x8c040d00, 0x04000005, 0x8058b040, - 0x040207f3, 0x0201f800, 0x0010032d, 0x59c40005, - 0x48038805, 0x42000000, 0x00000083, 0x59e00803, - 0x82040d00, 0x00030000, 0x82040d80, 0x00020000, - 0x04020003, 0x42000000, 0x00000089, 0x800008d0, - 0x4a035044, 0x00008900, 0x4a035045, 0x00008900, - 0x48075046, 0x42000800, 0x000000e0, 0x0201f800, - 0x0010173f, 0x42000800, 0x000000f4, 0x0201f800, - 0x00101737, 0x82040500, 0xffffffd1, 0x82000540, - 0x00000002, 0x42000800, 0x000000f4, 0x0201f800, - 0x0010173f, 0x42000800, 0x000000a0, 0x0201f800, - 0x00101737, 0x82040540, 0x00000001, 0x42000800, - 0x000000a0, 0x0201f800, 0x0010173f, 0x42000800, - 0x00000000, 0x0201f800, 0x00101737, 0x82040540, - 0x00000001, 0x42000800, 0x00000000, 0x0201f800, - 0x0010173f, 0x4201d000, 0x0001d4c0, 0x0201f800, - 0x0010592d, 0x0401fa68, 0x4a0388a7, 0x0000f7f7, - 0x4a0388a3, 0x8000403c, 0x4a0388ae, 0x000061a8, - 0x4a038801, 0x00032063, 0x4a038810, 0x00410108, - 0x4a038811, 0x00520608, 0x4a038812, 0x00450320, - 0x4a038813, 0x00440405, 0x4a03881c, 0x004132e1, - 0x4a03881d, 0x004001fe, 0x4a038850, 0x80000108, - 0x4a038860, 0x00000008, 0x4a038870, 0x00000008, - 0x4a038851, 0x80000508, 0x4a038861, 0x00800000, - 0x4a038871, 0x00800000, 0x4a038852, 0x80000708, - 0x4a038862, 0x00800000, 0x4a038872, 0x00800000, - 0x4a038853, 0x80000608, 0x497b8863, 0x4a038873, - 0x00800000, 0x4a038882, 0x00000840, 0x4a0388a5, - 0x000000fe, 0x4a0388a6, 0x0000001e, 0x4a0388b0, - 0x00007530, 0x4a038802, 0x0000ffff, 0x4a038806, - 0xc0e00800, 0x1c01f000, 0x850e1d4e, 0x42000800, - 0x00000040, 0x0201f800, 0x00101737, 0x82040500, - 0xffffffaf, 0x82000540, 0x00000000, 0x42000800, - 0x00000040, 0x0201f800, 0x0010173f, 0x42000800, - 0x000000f4, 0x0201f800, 0x00101737, 0x4c040000, - 0x40040000, 0x84000548, 0x42000800, 0x000000f4, - 0x0201f800, 0x0010173f, 0x42000800, 0x00000000, - 0x0201f800, 0x00101737, 0x82040500, 0xffffffc1, - 0x82000540, 0x00000038, 0x42000800, 0x00000000, - 0x0201f800, 0x0010173f, 0x5c000000, 0x42000800, - 0x000000f4, 0x0201f000, 0x0010173f, 0x59c40805, - 0x59c40006, 0x80040d00, 0x02000800, 0x0010032d, - 0x82040500, 0x00e00800, 0x04020004, 0x8c040d3e, - 0x040208f9, 0x0401f007, 0x82040500, 0x00800800, - 0x02020800, 0x00100322, 0x0201f800, 0x0010032d, - 0x4c5c0000, 0x4c600000, 0x59c4b805, 0x59c40006, - 0x8c000500, 0x04000003, 0x8c5cbd00, 0x040200a2, - 0x485fc857, 0x0201f800, 0x00104716, 0x0400001e, - 0x59c40005, 0x82000500, 0x000000c0, 0x04000054, - 0x0201f800, 0x00104741, 0x04020051, 0x59c40006, - 0x82000500, 0x000000f0, 0x04020004, 0x4a038805, - 0x000000c0, 0x0401f04a, 0x59a80015, 0x84000506, - 0x48035015, 0x42006000, 0xff203fff, 0x42006800, - 0x40000000, 0x0201f800, 0x00103a6a, 0x42000800, - 0x00000010, 0x42001000, 0x001039da, 0x0201f800, - 0x00105922, 0x8c5cbd34, 0x04020039, 0x4a035013, - 0x0000aaaa, 0x59c40005, 0x8c00050c, 0x04020012, - 0x8c00050e, 0x0402001c, 0x8c00050a, 0x04020026, - 0x8c000508, 0x0400000b, 0x59a80011, 0x82000580, - 0x00000009, 0x04020007, 0x42000000, 0x0010bb72, - 0x0201f800, 0x0010ad1d, 0x0201f800, 0x00104954, - 0x0401f067, 0x42000000, 0x0010bb80, 0x0201f800, - 0x0010ad1d, 0x41781800, 0x42002000, 0x00000001, - 0x0201f800, 0x001019fa, 0x4a035014, 0x00000000, - 0x0401f014, 0x42000000, 0x0010bb81, 0x0201f800, - 0x0010ad1d, 0x41781800, 0x42002000, 0x00000002, - 0x0201f800, 0x001019fa, 0x4a035014, 0x00000002, - 0x0401f008, 0x42000000, 0x0010bb74, 0x0201f800, - 0x0010ad1d, 0x0201f800, 0x001048e2, 0x0401f048, - 0x0201f800, 0x001049bf, 0x0401f045, 0x8c5cbd34, - 0x04000041, 0x59c40005, 0x8c00053a, 0x04020005, - 0x42000000, 0x0010bb68, 0x0201f800, 0x0010ad1d, - 0x4a038805, 0x20000000, 0x0201f800, 0x00104716, - 0x04020015, 0x4a038805, 0x04000000, 0x59c418a8, - 0x42002000, 0x00000000, 0x0201f800, 0x001019fa, - 0x0201f800, 0x00104732, 0x04020008, 0x4a035014, + 0x00100e35, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00100e35, 0x00100e35, + 0x00100e35, 0x00000000, 0x00100e35, 0x00000000, + 0x00000000, 0x00000000, 0x4813c857, 0x492fc857, + 0x4933c857, 0x48126013, 0x592c5208, 0x802851c0, + 0x0400004a, 0x412c6000, 0x0401f84b, 0x04000009, + 0x82240580, 0x00000002, 0x04020003, 0x5830000e, + 0x80102480, 0x50200000, 0x80004540, 0x0400003f, + 0x50200000, 0x80000540, 0x0400000b, 0x80301400, + 0x58080002, 0x80102480, 0x0400101e, 0x801021c0, + 0x04000009, 0x80285040, 0x04000034, 0x80204000, + 0x0401f7f4, 0x58300001, 0x80006540, 0x0400002f, + 0x0401f7e6, 0x80285040, 0x0400002c, 0x80204000, + 0x50200000, 0x80000540, 0x0402000a, 0x58300001, + 0x80006540, 0x04000025, 0x58300205, 0x82004d00, + 0x0000000f, 0x82244400, 0x00100e3a, 0x50204000, + 0x592c0209, 0x8400051e, 0x48025a09, 0x0401f013, + 0x80102080, 0x80102000, 0x48126011, 0x4813c857, + 0x58080802, 0x40100000, 0x80042480, 0x02001800, + 0x0010032d, 0x58080000, 0x58081801, 0x80102400, + 0x4812600f, 0x480e6010, 0x4813c857, 0x592c0209, + 0x8400055e, 0x48025a09, 0x4833c857, 0x4823c857, + 0x482bc857, 0x4832600c, 0x4822600d, 0x482a600e, + 0x80000580, 0x0401f003, 0x82000540, 0x00000001, + 0x1c01f000, 0x58300205, 0x82004d00, 0x0000000f, + 0x82244400, 0x00100e3a, 0x82000500, 0x000000ff, + 0x82000580, 0x00000029, 0x0402001b, 0x50204000, + 0x592c040a, 0x80000540, 0x02000800, 0x0010032d, + 0x82000c80, 0x00000002, 0x04001011, 0x58300001, + 0x80006540, 0x02000800, 0x0010032d, 0x58300205, + 0x82000500, 0x0000000f, 0x82000400, 0x00100e3a, + 0x50004000, 0x40040000, 0x800409c0, 0x04000006, + 0x82040c80, 0x00000005, 0x040217f1, 0x80204400, + 0x80000580, 0x1c01f000, 0x4c5c0000, 0x59e4b800, + 0x485fc857, 0x825c0500, 0x0000001f, 0x04000004, + 0x59e40862, 0x0201f800, 0x0010032d, 0x825c0500, + 0x000000e0, 0x02000800, 0x0010032d, 0x8c5cbd0e, + 0x04020807, 0x8c5cbd0c, 0x04020809, 0x8c5cbd0a, + 0x04020873, 0x5c00b800, 0x1c01f000, 0x4803c856, + 0x4a03c800, 0x00000080, 0x1c01f000, 0x4d2c0000, + 0x42007800, 0x0010bdb1, 0x583c0003, 0x583c0804, + 0x80040540, 0x0400003a, 0x42000800, 0x0010bc56, + 0x50065800, 0x592c0002, 0x82000580, 0x00000000, + 0x04000033, 0x59e40050, 0x59e40852, 0x80040480, + 0x82000500, 0xfffffc00, 0x04020005, 0x59e40050, + 0x59e40851, 0x80040800, 0x80040480, 0x82000c80, + 0x00000400, 0x59e40050, 0x80041400, 0x480bc857, + 0x50080000, 0x58080801, 0x80040540, 0x04000020, + 0x480bc857, 0x480a5803, 0x583c1009, 0x583c000a, + 0x80080580, 0x04020005, 0x583c0000, 0x84000550, + 0x48007800, 0x41781000, 0x82080400, 0x00001000, + 0x4803c857, 0x48007809, 0x583c0003, 0x80081400, + 0x480bc857, 0x583c0804, 0x4a025801, 0x00000000, + 0x4a025808, 0x00100f2f, 0x480a5806, 0x48065807, + 0x59e40053, 0x800000c4, 0x48025805, 0x412c1000, + 0x492fc857, 0x0201f800, 0x00020016, 0x5c025800, + 0x4a03c800, 0x00000040, 0x1c01f000, 0x42007800, + 0x0010bc56, 0x503c7800, 0x4a007802, 0x00000100, + 0x42007800, 0x0010bdb1, 0x583c0000, 0x84000552, + 0x48007800, 0x583c100c, 0x480bc857, 0x80081000, + 0x4808780c, 0x583c180b, 0x800c19c0, 0x04000017, + 0x82080500, 0x00000003, 0x04020014, 0x583c0007, + 0x4803c857, 0x583c2008, 0x4813c857, 0x80102000, + 0x80100580, 0x04020002, 0x41782000, 0x48107808, + 0x400c0000, 0x80080580, 0x04020008, 0x4978780c, + 0x42001800, 0x00000001, 0x42001000, 0x00008028, + 0x0201f800, 0x001031f5, 0x1c01f000, 0x4a03c800, + 0x00000020, 0x0201f800, 0x0010ae08, 0x59e40000, + 0x1c01f000, 0x42000000, 0x00001000, 0x50000000, + 0x82000480, 0x24320001, 0x0400100d, 0x0201f800, + 0x0010af26, 0x04000008, 0x42000000, 0x00007a42, + 0x50007000, 0x8c387520, 0x04020003, 0x84387560, + 0x44380000, 0x4a030000, 0x00000000, 0x1c01f000, + 0x4d2c0000, 0x4a007000, 0x00000000, 0x82040d00, + 0x43000f80, 0x02020800, 0x0010032d, 0x58380008, + 0x4803c00f, 0x4a0370e4, 0x00003000, 0x0201f800, + 0x00108d7c, 0x583a5807, 0x592c0000, 0x48007007, + 0x800001c0, 0x04020002, 0x49787006, 0x0201f800, + 0x00100580, 0x5c025800, 0x42007000, 0x00020b54, + 0x0201f000, 0x0002002c, 0x4803c856, 0x4c3c0000, + 0x4d2c0000, 0x4d300000, 0x58300009, 0x80025d40, + 0x02000800, 0x0010032d, 0x592e6009, 0x4c300000, + 0x0201f800, 0x00108d9b, 0x5c006000, 0x02000800, + 0x0010032d, 0x58300002, 0x82000580, 0x00000100, + 0x0402000f, 0x5930780c, 0x583c0001, 0x80007d40, + 0x0400000e, 0x4802600c, 0x82000400, 0x00000002, + 0x48006003, 0x583c0000, 0x48006005, 0x40301000, + 0x0201f800, 0x00020016, 0x0401f00c, 0x4a025a07, + 0x00000002, 0x492fc857, 0x4c300000, 0x0201f800, + 0x000203ab, 0x5c025800, 0x0201f800, 0x00100580, + 0x0201f800, 0x00020a10, 0x5c026000, 0x5c025800, + 0x5c007800, 0x1c01f000, 0x4803c856, 0x4d2c0000, + 0x4d300000, 0x42007000, 0x00020b54, 0x58380800, + 0x82040580, 0x00000002, 0x04020011, 0x58386001, + 0x58300009, 0x812c0580, 0x0402000d, 0x59e00004, + 0x8c00050e, 0x040007fe, 0x59dc0006, 0x4803c857, + 0x4a03b805, 0x20000000, 0x8c00053e, 0x040007f8, + 0x4a007000, 0x00000000, 0x0401f019, 0x58386005, + 0x40305000, 0x803061c0, 0x02000800, 0x0010032d, + 0x58300009, 0x812c0580, 0x04000004, 0x40305000, + 0x58306000, 0x0401f7f8, 0x40280000, 0x80300580, + 0x58300000, 0x04000006, 0x48005000, 0x800001c0, + 0x04020007, 0x48287004, 0x0401f005, 0x800001c0, + 0x04020002, 0x48007004, 0x48007005, 0x40325800, + 0x0201f800, 0x00100580, 0x5c026000, 0x5c025800, + 0x0201f000, 0x00020026, 0x4803c856, 0x42000800, + 0x0000003c, 0x48079000, 0x59c80000, 0x80040500, + 0x040207fe, 0x497b9005, 0x4a039035, 0x00880200, + 0x59a8000d, 0x800000e0, 0x4803900e, 0x4a039011, + 0x00000024, 0x4a03900f, 0x0010f694, 0x4a039010, + 0x0010f694, 0x4a039015, 0x0000007f, 0x4a03900d, + 0x00000040, 0x4a039000, 0x00001600, 0x1c01f000, + 0x59c80007, 0x8c000508, 0x040208c9, 0x59c80800, + 0x8c040d16, 0x04020004, 0x82000500, 0x00000006, + 0x0c01f005, 0x4807c857, 0x82000500, 0x0000000e, + 0x0c01f001, 0x0010102b, 0x00101029, 0x00105150, + 0x00101029, 0x0010102d, 0x00101029, 0x0010102d, + 0x0010102d, 0x00101029, 0x00101029, 0x00101029, + 0x00101029, 0x0010102d, 0x00101029, 0x0010102d, + 0x00101029, 0x0201f800, 0x0010032d, 0x4803c857, + 0x1c01f000, 0x59c8080c, 0x4807c857, 0x82040500, + 0x00006000, 0x04000004, 0x0201f800, 0x0010adcb, + 0x0401f006, 0x82040500, 0x007f0000, 0x04000006, + 0x0201f800, 0x0010ad9d, 0x0201f800, 0x00106452, + 0x0401f03c, 0x82040500, 0x00000014, 0x04000014, + 0x0201f800, 0x0010adfa, 0x836c0580, 0x00000003, + 0x0400000d, 0x0201f800, 0x00104755, 0x04000004, + 0x0201f800, 0x00103908, 0x0401f007, 0x4a035014, 0x00000001, 0x4202d800, 0x00000001, 0x0201f800, - 0x00104670, 0x0401f06d, 0x41780000, 0x0201f800, - 0x001046e7, 0x0201f800, 0x001017f1, 0x4000c000, - 0x0201f800, 0x0010175e, 0x836c1580, 0x00000004, - 0x0402000c, 0x8c5cbd00, 0x04020017, 0x8d0e1d06, - 0x04020005, 0x59c410a3, 0x82081540, 0x00000008, - 0x480b88a3, 0x59c41006, 0x84081540, 0x480b8806, - 0x4a038805, 0x04000000, 0x4202d800, 0x00000001, - 0x497b5010, 0x8d0e1d18, 0x04020005, 0x4803c856, - 0x850e1d06, 0x0201f800, 0x00103916, 0x0201f800, - 0x0010330a, 0x8c5cbd3c, 0x04020866, 0x8c5cbd00, - 0x04000043, 0x42000000, 0x0010bc85, 0x0201f800, - 0x0010ad1d, 0x4a038805, 0x00000001, 0x4200b000, - 0x00000352, 0x4201d000, 0x00000064, 0x4c580000, - 0x0201f800, 0x0010592d, 0x0201f800, 0x001016ee, - 0x5c00b000, 0x04000004, 0x8058b040, 0x040207f6, - 0x0401f004, 0x4a038805, 0x00000001, 0x0401f02c, - 0x59c40006, 0x84000500, 0x48038806, 0x59a80873, - 0x8c040d3e, 0x04000005, 0x82040d40, 0x0000000b, - 0x48075073, 0x850e1d48, 0x0201f800, 0x001063db, - 0x497b8880, 0x59c4000d, 0x8c000506, 0x04000006, - 0x42002000, 0x00000005, 0x0201f800, 0x00104a0a, - 0x0401f005, 0x42002000, 0x00000006, 0x0201f800, - 0x00104a0a, 0x59c400a3, 0x82000500, 0xfcf8ffff, - 0x480388a3, 0x4a035058, 0x00000002, 0x4202d800, - 0x00000004, 0x4a038805, 0x00000001, 0x0201f800, - 0x00100454, 0x0401fb69, 0x497b5036, 0x4a035043, - 0x00000001, 0x0201f800, 0x0010ee13, 0x825cbd00, - 0xbbfffffe, 0x485f8805, 0x5c00c000, 0x5c00b800, - 0x1c01f000, 0x4d180000, 0x59c41004, 0x480bc857, - 0x8c081500, 0x04000006, 0x4803c856, 0x497b2807, - 0x0201f800, 0x0010649f, 0x0401f009, 0x82080500, - 0x000001f0, 0x04000006, 0x4803c856, 0x0201f800, - 0x001066c5, 0x02020800, 0x001064c4, 0x4a038805, - 0x80000000, 0x5c023000, 0x1c01f000, 0x59c408a3, - 0x4807c857, 0x84040d40, 0x480788a3, 0x1c01f000, - 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, - 0x4a038805, 0x40000000, 0x42000000, 0x0010bb7a, - 0x0201f800, 0x0010ad1d, 0x0201f800, 0x0010610d, - 0x59c41004, 0x8c081500, 0x04000055, 0x598e600f, - 0x497b2807, 0x813261c0, 0x04000032, 0x59300403, - 0x82000580, 0x00000032, 0x0402002e, 0x5930001d, - 0x48038833, 0x4a038807, 0x00018000, 0x4201d000, - 0x00000002, 0x0201f800, 0x0010592d, 0x497b8807, - 0x4201d000, 0x00000002, 0x0201f800, 0x0010592d, - 0x0201f800, 0x00106305, 0x4201d000, 0x00007530, - 0x0201f800, 0x0010592d, 0x59c408a4, 0x82040d00, - 0x0000000f, 0x82040d80, 0x00000000, 0x04000005, - 0x42000000, 0x00200000, 0x0201f800, 0x00101744, - 0x0201f800, 0x0010605d, 0x59300009, 0x80000540, - 0x02000800, 0x0010032d, 0x40025800, 0x4a025a05, - 0x00000103, 0x5931d822, 0x58ef400a, 0x58ec0008, - 0x0801f800, 0x0201f800, 0x00020a10, 0x0401f046, - 0x598c0011, 0x82001c80, 0x000000c8, 0x04021010, - 0x80000000, 0x48031811, 0x59c400a4, 0x82000500, - 0x0000000f, 0x82000580, 0x00000002, 0x04020005, - 0x42000000, 0x00200000, 0x0201f800, 0x00101744, - 0x0201f800, 0x001058c9, 0x0401f033, 0x4933c857, - 0x0201f800, 0x00106305, 0x813261c0, 0x0400002e, - 0x4a026203, 0x00000001, 0x42027000, 0x00000027, - 0x0201f800, 0x00020a34, 0x0401f027, 0x0201f800, - 0x001066c5, 0x04000024, 0x0201f800, 0x00106705, - 0x0201f800, 0x001058f4, 0x59926004, 0x813261c0, - 0x04000012, 0x42001800, 0x000000c8, 0x0201f800, - 0x001066b9, 0x0402000d, 0x59c400a4, 0x82000500, - 0x0000000f, 0x82000580, 0x00000002, 0x04020004, - 0x42000000, 0x00200000, 0x0401fbf6, 0x0201f800, - 0x001058ce, 0x0401f00c, 0x4933c857, 0x0201f800, - 0x001062a1, 0x813261c0, 0x04000007, 0x42027000, - 0x0000004f, 0x4a026203, 0x00000003, 0x0201f800, - 0x00020a34, 0x5c022800, 0x5c034800, 0x5c03a000, - 0x5c032000, 0x0201f000, 0x001060fa, 0x40680000, - 0x810c0d80, 0x8c040d0e, 0x0400004f, 0x4803c857, - 0x8d0e1d0e, 0x04000023, 0x850e1d0e, 0x497b5058, - 0x42000000, 0x0010bb61, 0x0201f800, 0x0010ad1d, - 0x0201f800, 0x0010add1, 0x42001000, 0x00008011, - 0x59c40001, 0x82000500, 0x00018000, 0x82001d80, - 0x00000000, 0x04000009, 0x82001d80, 0x00008000, - 0x04000009, 0x82001d80, 0x00010000, 0x04000009, - 0x0201f800, 0x0010032d, 0x42001800, 0x00000000, - 0x0401f006, 0x42001800, 0x00000001, 0x0401f003, - 0x42001800, 0x00000003, 0x0201f000, 0x001031eb, - 0x850e1d4e, 0x59a80858, 0x800409c0, 0x04020007, - 0x59c4000d, 0x8c000520, 0x04000004, 0x42001800, - 0x00000003, 0x0401f002, 0x40041800, 0x0201f800, - 0x0010adb5, 0x42001000, 0x00008012, 0x59a82873, - 0x8c142d3e, 0x04000006, 0x82142d00, 0x00000003, - 0x0201f800, 0x001031ec, 0x0401f003, 0x0201f800, - 0x001031eb, 0x0201f800, 0x00100454, 0x0201f800, - 0x0010ae24, 0x0402000c, 0x0401f84c, 0x4d400000, - 0x4d3c0000, 0x42028000, 0x00000028, 0x42027800, - 0x00000008, 0x0201f800, 0x0010ded4, 0x5c027800, - 0x5c028000, 0x1c01f000, 0x4803c857, 0x82000400, - 0x00101b0a, 0x50000800, 0x82040d00, 0x000000ff, - 0x1c01f000, 0x4803c856, 0x4c580000, 0x4200b000, - 0x00000010, 0x497b88ac, 0x497b88ad, 0x8058b040, - 0x040207fe, 0x5c00b000, 0x1c01f000, 0x40680800, - 0x4807c857, 0x4807500f, 0x80041108, 0x4200b000, - 0x00000010, 0x497b88ac, 0x80000580, 0x800811c0, - 0x04020006, 0x82040500, 0x0000000f, 0x82000400, - 0x0010ae3e, 0x50000000, 0x480388ad, 0x80081040, - 0x8058b040, 0x040207f5, 0x1c01f000, 0x4803c857, - 0x4c080000, 0x4c040000, 0x4c000000, 0x59c40892, - 0x4807c857, 0x80041580, 0x04000010, 0x80041480, - 0x04021007, 0x80081080, 0x80081000, 0x4008b000, - 0x42000000, 0x00000201, 0x0401f004, 0x4008b000, - 0x42000000, 0x00000210, 0x48038886, 0x8058b040, - 0x040207fe, 0x497b8886, 0x5c000000, 0x5c000800, - 0x5c001000, 0x1c01f000, 0x4803c856, 0x8d0e1d20, - 0x04000005, 0x42028000, 0x0000002e, 0x0201f000, - 0x00109f44, 0x1c01f000, 0x0401f803, 0x40058800, - 0x1c01f000, 0x59a8086d, 0x82040500, 0x00000010, - 0x04000004, 0x42000800, 0x00000002, 0x0401f010, - 0x82040500, 0x00000020, 0x42000800, 0x00000002, - 0x0402000b, 0x59c80835, 0x82040d00, 0x00001f00, - 0x80040910, 0x80040800, 0x59a8006a, 0x80000540, - 0x04000003, 0x42000800, 0x0000025a, 0x4807c857, - 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, - 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, - 0x4c000000, 0x59a80037, 0x4803c857, 0x82000580, - 0x00000000, 0x5c000000, 0x1c01f000, 0x0401f807, - 0x42018800, 0x00000001, 0x04000003, 0x42018800, - 0x00000000, 0x1c01f000, 0x4c000000, 0x59a80037, - 0x4803c857, 0x82000580, 0x00000001, 0x5c000000, - 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, - 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, - 0x4c000000, 0x59a80037, 0x4803c857, 0x82000580, - 0x00000003, 0x5c000000, 0x1c01f000, 0x0401f807, - 0x42018800, 0x00000001, 0x04000003, 0x42018800, - 0x00000000, 0x1c01f000, 0x4c000000, 0x59a80037, - 0x82000580, 0x00000002, 0x5c000000, 0x1c01f000, - 0x4c000000, 0x4c040000, 0x4c080000, 0x4c380000, - 0x59a8003a, 0x82000c80, 0x00000007, 0x02021800, - 0x0010032d, 0x0c01f806, 0x5c007000, 0x5c001000, - 0x5c000800, 0x5c000000, 0x1c01f000, 0x00101466, - 0x00101479, 0x0010148d, 0x0010148f, 0x001014b7, - 0x001014b9, 0x001014bb, 0x4803c856, 0x4a03503c, - 0x00000000, 0x42000000, 0x00000002, 0x0401fa32, - 0x42000000, 0x00000002, 0x0401f9b5, 0x0401fab1, - 0x4803c856, 0x4a03503a, 0x00000006, 0x42000800, - 0x0000001e, 0x42001000, 0x001014bc, 0x0201f000, - 0x00105904, 0x497b503f, 0x4a035034, 0x00000036, - 0x4a035033, 0x0000002a, 0x4803c856, 0x4a03503c, - 0x00000001, 0x42000000, 0x00000002, 0x0401f9a0, - 0x4803c856, 0x4a03503a, 0x00000006, 0x42000800, - 0x0000001e, 0x42001000, 0x001014bc, 0x0201f000, - 0x00105904, 0x0201f800, 0x0010032d, 0x4a035034, - 0x00000036, 0x4803c856, 0x4a03503c, 0x00000003, - 0x42000800, 0x00000000, 0x0401faa1, 0x82040d00, + 0x001046af, 0x0401f828, 0x0401f026, 0x82040500, + 0x00001c00, 0x04000005, 0x0201f800, 0x0010add9, + 0x0401f821, 0x0401f01f, 0x82040500, 0x00000140, + 0x04000005, 0x0201f800, 0x0010adec, 0x0401f81a, + 0x0401f018, 0x82040500, 0x00008000, 0x04000015, + 0x0201f800, 0x00104755, 0x0400000f, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x0000000b, + 0x04020009, 0x4c040000, 0x0201f800, 0x00103924, + 0x42000000, 0x0000001e, 0x80000040, 0x040207ff, + 0x5c000800, 0x0201f800, 0x0010adc4, 0x0401f802, + 0x1c01f000, 0x4c0c0000, 0x4c100000, 0x4c140000, + 0x0201f800, 0x00100c0f, 0x5c002800, 0x5c002000, + 0x5c001800, 0x1c01f000, 0x4803c856, 0x59a80804, + 0x59a80020, 0x82000500, 0xfffff000, 0x80040540, + 0x48035020, 0x59a80024, 0x82000500, 0xfffff000, + 0x80040540, 0x48035024, 0x48078882, 0x82041c00, + 0x0000000f, 0x800c1908, 0x820c1c00, 0x00000004, + 0x400c2000, 0x901029c0, 0x82040480, 0x000001e4, + 0x04021005, 0x42001000, 0x00000008, 0x801020c6, + 0x0401f031, 0x82040480, 0x00000230, 0x04021009, + 0x42001000, 0x00000007, 0x801000c2, 0x800000c2, + 0x80100400, 0x80100400, 0x80102400, 0x0401f026, + 0x82040480, 0x00000298, 0x04021008, 0x42001000, + 0x00000006, 0x801000c2, 0x800000c2, 0x80100400, + 0x80102400, 0x0401f01c, 0x82040480, 0x00000328, + 0x04021007, 0x42001000, 0x00000005, 0x801000c2, + 0x800000c2, 0x80102400, 0x0401f013, 0x82040480, + 0x00000404, 0x04021005, 0x42001000, 0x00000004, + 0x801020c4, 0x0401f00c, 0x82040480, 0x0000056c, + 0x04021006, 0x42001000, 0x00000003, 0x801000c2, + 0x80102400, 0x0401f004, 0x42001000, 0x00000002, + 0x801020c2, 0x82100480, 0x00000110, 0x80000080, + 0x80002000, 0x800800d0, 0x80140540, 0x80100540, + 0x48039035, 0x48035072, 0x1c01f000, 0x59c80815, + 0x0201f800, 0x00100322, 0x40680800, 0x82040d00, + 0x0000007c, 0x48079000, 0x59c80000, 0x80040500, + 0x040207fe, 0x8c040d04, 0x04000003, 0x59c80035, + 0x48039035, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x1c01f000, 0x4803c856, 0x497b88a9, + 0x4a038807, 0x00000001, 0x497b8807, 0x59c40005, + 0x48038805, 0x0201f800, 0x00101617, 0x4201d000, + 0x000001f4, 0x0201f800, 0x001059d2, 0x497b880e, + 0x4200b000, 0x000001f4, 0x42000000, 0x00000001, + 0x42000800, 0x00000014, 0x0201f800, 0x00101740, + 0x42000800, 0x00000014, 0x0201f800, 0x00101738, + 0x8c040d00, 0x04000005, 0x8058b040, 0x040207f3, + 0x0201f800, 0x0010032d, 0x4200b000, 0x00000032, + 0x42000000, 0x00000001, 0x42000800, 0x000000b4, + 0x0201f800, 0x00101740, 0x42000800, 0x000000b4, + 0x0201f800, 0x00101738, 0x8c040d00, 0x04000005, + 0x8058b040, 0x040207f3, 0x0201f800, 0x0010032d, + 0x59c40005, 0x48038805, 0x42000000, 0x00000083, + 0x59e00803, 0x82040d00, 0x00030000, 0x82040d80, + 0x00020000, 0x04020003, 0x42000000, 0x00000089, + 0x800008d0, 0x4a035044, 0x00008900, 0x4a035045, + 0x00008900, 0x48075046, 0x42000800, 0x000000e0, + 0x0201f800, 0x00101740, 0x42000800, 0x000000f4, + 0x0201f800, 0x00101738, 0x82040500, 0xffffffd1, + 0x82000540, 0x00000002, 0x42000800, 0x000000f4, + 0x0201f800, 0x00101740, 0x42000800, 0x000000a0, + 0x0201f800, 0x00101738, 0x82040540, 0x00000001, + 0x42000800, 0x000000a0, 0x0201f800, 0x00101740, + 0x42000800, 0x00000000, 0x0201f800, 0x00101738, + 0x82040540, 0x00000001, 0x42000800, 0x00000000, + 0x0201f800, 0x00101740, 0x4201d000, 0x0001d4c0, + 0x0201f800, 0x001059d2, 0x0401fa68, 0x4a0388a7, + 0x0000f7f7, 0x4a0388a3, 0x8000403c, 0x4a0388ae, + 0x000061a8, 0x4a038801, 0x00032063, 0x4a038810, + 0x00410108, 0x4a038811, 0x00520608, 0x4a038812, + 0x00450320, 0x4a038813, 0x00440405, 0x4a03881c, + 0x004132e1, 0x4a03881d, 0x004001fe, 0x4a038850, + 0x80000108, 0x4a038860, 0x00000008, 0x4a038870, + 0x00000008, 0x4a038851, 0x80000508, 0x4a038861, + 0x00800000, 0x4a038871, 0x00800000, 0x4a038852, + 0x80000708, 0x4a038862, 0x00800000, 0x4a038872, + 0x00800000, 0x4a038853, 0x80000608, 0x497b8863, + 0x4a038873, 0x00800000, 0x4a038882, 0x00000840, + 0x4a0388a5, 0x000000fe, 0x4a0388a6, 0x0000001e, + 0x4a0388b0, 0x00007530, 0x4a038802, 0x0000ffff, + 0x4a038806, 0xc0e00800, 0x1c01f000, 0x850e1d4e, + 0x42000800, 0x00000040, 0x0201f800, 0x00101738, + 0x82040500, 0xffffffaf, 0x82000540, 0x00000000, + 0x42000800, 0x00000040, 0x0201f800, 0x00101740, + 0x42000800, 0x000000f4, 0x0201f800, 0x00101738, + 0x4c040000, 0x40040000, 0x84000548, 0x42000800, + 0x000000f4, 0x0201f800, 0x00101740, 0x42000800, + 0x00000000, 0x0201f800, 0x00101738, 0x82040500, + 0xffffffc1, 0x82000540, 0x00000038, 0x42000800, + 0x00000000, 0x0201f800, 0x00101740, 0x5c000000, + 0x42000800, 0x000000f4, 0x0201f000, 0x00101740, + 0x59c40805, 0x59c40006, 0x80040d00, 0x02000800, + 0x0010032d, 0x82040500, 0x00e00800, 0x04020004, + 0x8c040d3e, 0x040208f9, 0x0401f007, 0x82040500, + 0x00800800, 0x02020800, 0x00100322, 0x0201f800, + 0x0010032d, 0x4c5c0000, 0x4c600000, 0x59c4b805, + 0x59c40006, 0x8c000500, 0x04000003, 0x8c5cbd00, + 0x040200a2, 0x485fc857, 0x0201f800, 0x00104755, + 0x0400001e, 0x59c40005, 0x82000500, 0x000000c0, + 0x04000054, 0x0201f800, 0x00104780, 0x04020051, + 0x59c40006, 0x82000500, 0x000000f0, 0x04020004, + 0x4a038805, 0x000000c0, 0x0401f04a, 0x59a80015, + 0x84000506, 0x48035015, 0x42006000, 0xff203fff, + 0x42006800, 0x40000000, 0x0201f800, 0x00103a7d, + 0x42000800, 0x00000010, 0x42001000, 0x001039ed, + 0x0201f800, 0x001059c7, 0x8c5cbd34, 0x04020039, + 0x4a035013, 0x0000aaaa, 0x59c40005, 0x8c00050c, + 0x04020012, 0x8c00050e, 0x0402001c, 0x8c00050a, + 0x04020026, 0x8c000508, 0x0400000b, 0x59a80011, + 0x82000580, 0x00000009, 0x04020007, 0x42000000, + 0x0010bc72, 0x0201f800, 0x0010ae10, 0x0201f800, + 0x00104993, 0x0401f067, 0x42000000, 0x0010bc80, + 0x0201f800, 0x0010ae10, 0x41781800, 0x42002000, + 0x00000001, 0x0201f800, 0x001019fb, 0x4a035014, + 0x00000000, 0x0401f014, 0x42000000, 0x0010bc81, + 0x0201f800, 0x0010ae10, 0x41781800, 0x42002000, + 0x00000002, 0x0201f800, 0x001019fb, 0x4a035014, + 0x00000002, 0x0401f008, 0x42000000, 0x0010bc74, + 0x0201f800, 0x0010ae10, 0x0201f800, 0x00104921, + 0x0401f048, 0x0201f800, 0x001049fe, 0x0401f045, + 0x8c5cbd34, 0x04000041, 0x59c40005, 0x8c00053a, + 0x04020005, 0x42000000, 0x0010bc68, 0x0201f800, + 0x0010ae10, 0x4a038805, 0x20000000, 0x0201f800, + 0x00104755, 0x04020015, 0x4a038805, 0x04000000, + 0x59c418a8, 0x42002000, 0x00000000, 0x0201f800, + 0x001019fb, 0x0201f800, 0x00104771, 0x04020008, + 0x4a035014, 0x00000001, 0x4202d800, 0x00000001, + 0x0201f800, 0x001046af, 0x0401f06d, 0x41780000, + 0x0201f800, 0x00104726, 0x0201f800, 0x001017f2, + 0x4000c000, 0x0201f800, 0x0010175f, 0x836c1580, + 0x00000004, 0x0402000c, 0x8c5cbd00, 0x04020017, + 0x8d0e1d06, 0x04020005, 0x59c410a3, 0x82081540, + 0x00000008, 0x480b88a3, 0x59c41006, 0x84081540, + 0x480b8806, 0x4a038805, 0x04000000, 0x4202d800, + 0x00000001, 0x497b5010, 0x8d0e1d18, 0x04020005, + 0x4803c856, 0x850e1d06, 0x0201f800, 0x00103929, + 0x0201f800, 0x0010331d, 0x8c5cbd3c, 0x04020866, + 0x8c5cbd00, 0x04000043, 0x42000000, 0x0010bd85, + 0x0201f800, 0x0010ae10, 0x4a038805, 0x00000001, + 0x4200b000, 0x00000352, 0x4201d000, 0x00000064, + 0x4c580000, 0x0201f800, 0x001059d2, 0x0201f800, + 0x001016ef, 0x5c00b000, 0x04000004, 0x8058b040, + 0x040207f6, 0x0401f004, 0x4a038805, 0x00000001, + 0x0401f02c, 0x59c40006, 0x84000500, 0x48038806, + 0x59a80873, 0x8c040d3e, 0x04000005, 0x82040d40, + 0x0000000b, 0x48075073, 0x850e1d48, 0x0201f800, + 0x00106480, 0x497b8880, 0x59c4000d, 0x8c000506, + 0x04000006, 0x42002000, 0x00000005, 0x0201f800, + 0x00104a49, 0x0401f005, 0x42002000, 0x00000006, + 0x0201f800, 0x00104a49, 0x59c400a3, 0x82000500, + 0xfcf8ffff, 0x480388a3, 0x4a035058, 0x00000002, + 0x4202d800, 0x00000004, 0x4a038805, 0x00000001, + 0x0201f800, 0x00100454, 0x0401fb69, 0x497b5036, + 0x4a035043, 0x00000001, 0x0201f800, 0x0010ef18, + 0x825cbd00, 0xbbfffffe, 0x485f8805, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x4d180000, 0x59c41004, + 0x480bc857, 0x8c081500, 0x04000006, 0x4803c856, + 0x497b2807, 0x0201f800, 0x00106544, 0x0401f009, + 0x82080500, 0x000001f0, 0x04000006, 0x4803c856, + 0x0201f800, 0x0010676a, 0x02020800, 0x00106569, + 0x4a038805, 0x80000000, 0x5c023000, 0x1c01f000, + 0x59c408a3, 0x4807c857, 0x84040d40, 0x480788a3, + 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x4a038805, 0x40000000, 0x42000000, + 0x0010bc7a, 0x0201f800, 0x0010ae10, 0x0201f800, + 0x001061b2, 0x59c41004, 0x8c081500, 0x04000055, + 0x598e600f, 0x497b2807, 0x813261c0, 0x04000032, + 0x59300403, 0x82000580, 0x00000032, 0x0402002e, + 0x5930001d, 0x48038833, 0x4a038807, 0x00018000, + 0x4201d000, 0x00000002, 0x0201f800, 0x001059d2, + 0x497b8807, 0x4201d000, 0x00000002, 0x0201f800, + 0x001059d2, 0x0201f800, 0x001063aa, 0x4201d000, + 0x00007530, 0x0201f800, 0x001059d2, 0x59c408a4, + 0x82040d00, 0x0000000f, 0x82040d80, 0x00000000, + 0x04000005, 0x42000000, 0x00200000, 0x0201f800, + 0x00101745, 0x0201f800, 0x00106102, 0x59300009, + 0x80000540, 0x02000800, 0x0010032d, 0x40025800, + 0x4a025a05, 0x00000103, 0x5931d822, 0x58ef400a, + 0x58ec0008, 0x0801f800, 0x0201f800, 0x00020a10, + 0x0401f046, 0x598c0011, 0x82001c80, 0x000000c8, + 0x04021010, 0x80000000, 0x48031811, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x00000002, + 0x04020005, 0x42000000, 0x00200000, 0x0201f800, + 0x00101745, 0x0201f800, 0x0010596e, 0x0401f033, + 0x4933c857, 0x0201f800, 0x001063aa, 0x813261c0, + 0x0400002e, 0x4a026203, 0x00000001, 0x42027000, + 0x00000027, 0x0201f800, 0x00020a34, 0x0401f027, + 0x0201f800, 0x0010676a, 0x04000024, 0x0201f800, + 0x001067aa, 0x0201f800, 0x00105999, 0x59926004, + 0x813261c0, 0x04000012, 0x42001800, 0x000000c8, + 0x0201f800, 0x0010675e, 0x0402000d, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x00000002, + 0x04020004, 0x42000000, 0x00200000, 0x0401fbf6, + 0x0201f800, 0x00105973, 0x0401f00c, 0x4933c857, + 0x0201f800, 0x00106346, 0x813261c0, 0x04000007, + 0x42027000, 0x0000004f, 0x4a026203, 0x00000003, + 0x0201f800, 0x00020a34, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x0201f000, 0x0010619f, + 0x40680000, 0x810c0d80, 0x8c040d0e, 0x0400004f, + 0x4803c857, 0x8d0e1d0e, 0x04000023, 0x850e1d0e, + 0x497b5058, 0x42000000, 0x0010bc61, 0x0201f800, + 0x0010ae10, 0x0201f800, 0x0010aec4, 0x42001000, + 0x00008011, 0x59c40001, 0x82000500, 0x00018000, + 0x82001d80, 0x00000000, 0x04000009, 0x82001d80, + 0x00008000, 0x04000009, 0x82001d80, 0x00010000, + 0x04000009, 0x0201f800, 0x0010032d, 0x42001800, + 0x00000000, 0x0401f006, 0x42001800, 0x00000001, + 0x0401f003, 0x42001800, 0x00000003, 0x0201f000, + 0x001031f5, 0x850e1d4e, 0x59a80858, 0x800409c0, + 0x04020007, 0x59c4000d, 0x8c000520, 0x04000004, + 0x42001800, 0x00000003, 0x0401f002, 0x40041800, + 0x0201f800, 0x0010aea8, 0x42001000, 0x00008012, + 0x59a82873, 0x8c142d3e, 0x04000006, 0x82142d00, + 0x00000003, 0x0201f800, 0x001031f6, 0x0401f003, + 0x0201f800, 0x001031f5, 0x0201f800, 0x00100454, + 0x0201f800, 0x0010af17, 0x0402000c, 0x0401f84c, + 0x4d400000, 0x4d3c0000, 0x42028000, 0x00000028, + 0x42027800, 0x00000008, 0x0201f800, 0x0010dfe1, + 0x5c027800, 0x5c028000, 0x1c01f000, 0x4803c857, + 0x82000400, 0x00101b0f, 0x50000800, 0x82040d00, + 0x000000ff, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x4200b000, 0x00000010, 0x497b88ac, 0x497b88ad, + 0x8058b040, 0x040207fe, 0x5c00b000, 0x1c01f000, + 0x40680800, 0x4807c857, 0x4807500f, 0x80041108, + 0x4200b000, 0x00000010, 0x497b88ac, 0x80000580, + 0x800811c0, 0x04020006, 0x82040500, 0x0000000f, + 0x82000400, 0x0010af34, 0x50000000, 0x480388ad, + 0x80081040, 0x8058b040, 0x040207f5, 0x1c01f000, + 0x4803c857, 0x4c080000, 0x4c040000, 0x4c000000, + 0x59c40892, 0x4807c857, 0x80041580, 0x04000010, + 0x80041480, 0x04021007, 0x80081080, 0x80081000, + 0x4008b000, 0x42000000, 0x00000201, 0x0401f004, + 0x4008b000, 0x42000000, 0x00000210, 0x48038886, + 0x8058b040, 0x040207fe, 0x497b8886, 0x5c000000, + 0x5c000800, 0x5c001000, 0x1c01f000, 0x4803c856, + 0x8d0e1d20, 0x04000005, 0x42028000, 0x0000002e, + 0x0201f000, 0x0010a01b, 0x1c01f000, 0x0401f803, + 0x40058800, 0x1c01f000, 0x59a8086d, 0x82040500, + 0x00000010, 0x04000004, 0x42000800, 0x00000002, + 0x0401f010, 0x82040500, 0x00000020, 0x42000800, + 0x00000002, 0x0402000b, 0x59c80835, 0x82040d00, + 0x00001f00, 0x80040910, 0x80040800, 0x59a8006a, + 0x80000540, 0x04000003, 0x42000800, 0x0000025a, + 0x4807c857, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, + 0x1c01f000, 0x4c000000, 0x59a80037, 0x4803c857, + 0x82000580, 0x00000000, 0x5c000000, 0x1c01f000, + 0x0401f807, 0x42018800, 0x00000001, 0x04000003, + 0x42018800, 0x00000000, 0x1c01f000, 0x4c000000, + 0x59a80037, 0x4803c857, 0x82000580, 0x00000001, + 0x5c000000, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, + 0x1c01f000, 0x4c000000, 0x59a80037, 0x4803c857, + 0x82000580, 0x00000003, 0x5c000000, 0x1c01f000, + 0x0401f807, 0x42018800, 0x00000001, 0x04000003, + 0x42018800, 0x00000000, 0x1c01f000, 0x4c000000, + 0x59a80037, 0x82000580, 0x00000002, 0x5c000000, + 0x1c01f000, 0x4c000000, 0x4c040000, 0x4c080000, + 0x4c380000, 0x59a8003a, 0x82000c80, 0x00000007, + 0x02021800, 0x0010032d, 0x0c01f806, 0x5c007000, + 0x5c001000, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x00101467, 0x0010147a, 0x0010148e, 0x00101490, + 0x001014b8, 0x001014ba, 0x001014bc, 0x4803c856, + 0x4a03503c, 0x00000000, 0x42000000, 0x00000002, + 0x0401fa32, 0x42000000, 0x00000002, 0x0401f9b5, + 0x0401fab1, 0x4803c856, 0x4a03503a, 0x00000006, + 0x42000800, 0x0000001e, 0x42001000, 0x001014bd, + 0x0201f000, 0x001059a9, 0x497b503f, 0x4a035034, + 0x00000036, 0x4a035033, 0x0000002a, 0x4803c856, + 0x4a03503c, 0x00000001, 0x42000000, 0x00000002, + 0x0401f9a0, 0x4803c856, 0x4a03503a, 0x00000006, + 0x42000800, 0x0000001e, 0x42001000, 0x001014bd, + 0x0201f000, 0x001059a9, 0x0201f800, 0x0010032d, + 0x4a035034, 0x00000036, 0x4803c856, 0x4a03503c, + 0x00000003, 0x42000800, 0x00000000, 0x0401faa1, + 0x82040d00, 0x00000090, 0x82040580, 0x00000090, + 0x04000009, 0x82040580, 0x00000010, 0x04000009, + 0x82040580, 0x00000000, 0x04000009, 0x0201f800, + 0x0010032d, 0x42000000, 0x00000001, 0x0401f006, + 0x42000000, 0x00000000, 0x0401f003, 0x42000000, + 0x00000002, 0x0401f977, 0x497b5040, 0x4803c856, + 0x4a03503a, 0x00000006, 0x42000800, 0x0000001e, + 0x42001000, 0x001014bd, 0x0201f000, 0x001059a9, + 0x0201f800, 0x0010032d, 0x0201f800, 0x0010032d, + 0x1c01f000, 0x4c000000, 0x4c040000, 0x4c080000, + 0x4c380000, 0x59a8003c, 0x82000c80, 0x00000007, + 0x02021800, 0x0010032d, 0x0c01f806, 0x5c007000, + 0x5c001000, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x001014d3, 0x001014f2, 0x00101547, 0x0010155e, + 0x00101575, 0x0010157e, 0x00101580, 0x0401fa1c, + 0x0402001b, 0x59a81042, 0x42000800, 0x00000000, + 0x0401fa60, 0x82040d00, 0x00000090, 0x82040580, + 0x00000090, 0x04000009, 0x82040580, 0x00000010, + 0x04000008, 0x82040580, 0x00000000, 0x04000007, + 0x0201f800, 0x0010032d, 0x84081540, 0x0401f004, + 0x84081542, 0x0401f002, 0x84081544, 0x480b5042, + 0x4a03503a, 0x00000001, 0x0401f003, 0x0401f8ce, + 0x0401ff81, 0x1c01f000, 0x0401f890, 0x04000053, + 0x0401f9fb, 0x0402002a, 0x42000800, 0x00000000, + 0x0401fa40, 0x82040d00, 0x00000090, 0x82040580, + 0x00000000, 0x04000045, 0x82040580, 0x00000010, + 0x04000006, 0x82040580, 0x00000090, 0x04000009, + 0x0201f800, 0x0010032d, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04000037, + 0x42000800, 0x00000000, 0x0401fa2a, 0x82040d00, + 0x00000090, 0x82040580, 0x00000010, 0x04000006, + 0x82040580, 0x00000090, 0x04000006, 0x02020800, + 0x0010032d, 0x59a80042, 0x84000542, 0x0401f003, + 0x59a80042, 0x84000540, 0x48035042, 0x59a8003f, + 0x80000000, 0x4803503f, 0x82000580, 0x00000005, + 0x04000003, 0x0401f862, 0x0401f01f, 0x497b503f, + 0x59c40801, 0x82040d00, 0x00018000, 0x82040580, + 0x00000000, 0x04000009, 0x82040580, 0x00008000, + 0x04000009, 0x82040580, 0x00010000, 0x04000009, + 0x0201f800, 0x0010032d, 0x42000000, 0x00000001, + 0x0401f006, 0x42000000, 0x00000000, 0x0401f003, + 0x42000000, 0x00000002, 0x0401f960, 0x4a03503c, + 0x00000002, 0x0401f004, 0x4a03503a, 0x00000003, + 0x0401f002, 0x0401ff40, 0x1c01f000, 0x0401f83b, + 0x04000015, 0x59a80033, 0x80000040, 0x48035033, + 0x0401f9a3, 0x04020005, 0x4a03503a, 0x00000003, + 0x497b503b, 0x0401f00c, 0x59a80033, 0x80000540, + 0x04020003, 0x0401f8a2, 0x0401f002, 0x0401f84c, + 0x0401f82f, 0x497b503f, 0x4a03503c, 0x00000001, + 0x0401ff29, 0x1c01f000, 0x0401f824, 0x04000015, + 0x0401f98f, 0x0402000f, 0x59a80040, 0x80000000, + 0x48035040, 0x82000580, 0x00000007, 0x0402000c, + 0x4a035036, 0x0000000a, 0x497b5043, 0x59a80042, + 0x8400055e, 0x48035042, 0x4803c857, 0x0401f005, + 0x0401f817, 0x4a03503c, 0x00000004, 0x0401ff3c, + 0x1c01f000, 0x0401f80d, 0x04000007, 0x0401f978, + 0x04020003, 0x0401ff19, 0x0401f003, 0x0401f80c, + 0x0401ff33, 0x1c01f000, 0x0201f800, 0x0010032d, + 0x0201f800, 0x0010032d, 0x59a80034, 0x80000040, + 0x48035034, 0x04000892, 0x1c01f000, 0x4c040000, + 0x42000800, 0x00000000, 0x0401f9ae, 0x82040d00, 0x00000090, 0x82040580, 0x00000090, 0x04000009, 0x82040580, 0x00000010, 0x04000009, 0x82040580, 0x00000000, 0x04000009, 0x0201f800, 0x0010032d, - 0x42000000, 0x00000001, 0x0401f006, 0x42000000, - 0x00000000, 0x0401f003, 0x42000000, 0x00000002, - 0x0401f977, 0x497b5040, 0x4803c856, 0x4a03503a, - 0x00000006, 0x42000800, 0x0000001e, 0x42001000, - 0x001014bc, 0x0201f000, 0x00105904, 0x0201f800, - 0x0010032d, 0x0201f800, 0x0010032d, 0x1c01f000, - 0x4c000000, 0x4c040000, 0x4c080000, 0x4c380000, - 0x59a8003c, 0x82000c80, 0x00000007, 0x02021800, - 0x0010032d, 0x0c01f806, 0x5c007000, 0x5c001000, - 0x5c000800, 0x5c000000, 0x1c01f000, 0x001014d2, - 0x001014f1, 0x00101546, 0x0010155d, 0x00101574, - 0x0010157d, 0x0010157f, 0x0401fa1c, 0x0402001b, - 0x59a81042, 0x42000800, 0x00000000, 0x0401fa60, - 0x82040d00, 0x00000090, 0x82040580, 0x00000090, - 0x04000009, 0x82040580, 0x00000010, 0x04000008, - 0x82040580, 0x00000000, 0x04000007, 0x0201f800, - 0x0010032d, 0x84081540, 0x0401f004, 0x84081542, - 0x0401f002, 0x84081544, 0x480b5042, 0x4a03503a, - 0x00000001, 0x0401f003, 0x0401f8ce, 0x0401ff81, - 0x1c01f000, 0x0401f890, 0x04000053, 0x0401f9fb, - 0x0402002a, 0x42000800, 0x00000000, 0x0401fa40, - 0x82040d00, 0x00000090, 0x82040580, 0x00000000, - 0x04000045, 0x82040580, 0x00000010, 0x04000006, - 0x82040580, 0x00000090, 0x04000009, 0x0201f800, - 0x0010032d, 0x59c40801, 0x82040d00, 0x00018000, - 0x82040580, 0x00000000, 0x04000037, 0x42000800, - 0x00000000, 0x0401fa2a, 0x82040d00, 0x00000090, - 0x82040580, 0x00000010, 0x04000006, 0x82040580, - 0x00000090, 0x04000006, 0x02020800, 0x0010032d, - 0x59a80042, 0x84000542, 0x0401f003, 0x59a80042, - 0x84000540, 0x48035042, 0x59a8003f, 0x80000000, - 0x4803503f, 0x82000580, 0x00000005, 0x04000003, - 0x0401f862, 0x0401f01f, 0x497b503f, 0x59c40801, - 0x82040d00, 0x00018000, 0x82040580, 0x00000000, - 0x04000009, 0x82040580, 0x00008000, 0x04000009, - 0x82040580, 0x00010000, 0x04000009, 0x0201f800, - 0x0010032d, 0x42000000, 0x00000001, 0x0401f006, - 0x42000000, 0x00000000, 0x0401f003, 0x42000000, - 0x00000002, 0x0401f960, 0x4a03503c, 0x00000002, - 0x0401f004, 0x4a03503a, 0x00000003, 0x0401f002, - 0x0401ff40, 0x1c01f000, 0x0401f83b, 0x04000015, - 0x59a80033, 0x80000040, 0x48035033, 0x0401f9a3, - 0x04020005, 0x4a03503a, 0x00000003, 0x497b503b, - 0x0401f00c, 0x59a80033, 0x80000540, 0x04020003, - 0x0401f8a2, 0x0401f002, 0x0401f84c, 0x0401f82f, - 0x497b503f, 0x4a03503c, 0x00000001, 0x0401ff29, - 0x1c01f000, 0x0401f824, 0x04000015, 0x0401f98f, - 0x0402000f, 0x59a80040, 0x80000000, 0x48035040, - 0x82000580, 0x00000007, 0x0402000c, 0x4a035036, - 0x0000000a, 0x497b5043, 0x59a80042, 0x8400055e, - 0x48035042, 0x4803c857, 0x0401f005, 0x0401f817, - 0x4a03503c, 0x00000004, 0x0401ff3c, 0x1c01f000, - 0x0401f80d, 0x04000007, 0x0401f978, 0x04020003, - 0x0401ff19, 0x0401f003, 0x0401f80c, 0x0401ff33, - 0x1c01f000, 0x0201f800, 0x0010032d, 0x0201f800, - 0x0010032d, 0x59a80034, 0x80000040, 0x48035034, - 0x04000892, 0x1c01f000, 0x4c040000, 0x42000800, - 0x00000000, 0x0401f9ae, 0x82040d00, 0x00000090, - 0x82040580, 0x00000090, 0x04000009, 0x82040580, - 0x00000010, 0x04000009, 0x82040580, 0x00000000, - 0x04000009, 0x0201f800, 0x0010032d, 0x42000000, - 0x00000002, 0x0401f006, 0x42000000, 0x00000001, - 0x0401f003, 0x42000000, 0x00000000, 0x0401f8fe, - 0x5c000800, 0x1c01f000, 0x4c040000, 0x59c40801, - 0x82040d00, 0x00018000, 0x82040580, 0x00000000, - 0x04000009, 0x82040580, 0x00008000, 0x04000009, - 0x82040580, 0x00010000, 0x04000009, 0x0201f800, - 0x0010032d, 0x42000000, 0x00000002, 0x0401f006, - 0x42000000, 0x00000001, 0x0401f003, 0x42000000, - 0x00000000, 0x0401f86a, 0x5c000800, 0x1c01f000, - 0x4c040000, 0x59a8003f, 0x80000000, 0x4803503f, - 0x82000580, 0x00000005, 0x04020019, 0x497b503f, + 0x42000000, 0x00000002, 0x0401f006, 0x42000000, + 0x00000001, 0x0401f003, 0x42000000, 0x00000000, + 0x0401f8fe, 0x5c000800, 0x1c01f000, 0x4c040000, 0x59c40801, 0x82040d00, 0x00018000, 0x82040580, 0x00000000, 0x04000009, 0x82040580, 0x00008000, 0x04000009, 0x82040580, 0x00010000, 0x04000009, 0x0201f800, 0x0010032d, 0x42000000, 0x00000002, 0x0401f006, 0x42000000, 0x00000001, 0x0401f003, - 0x42000000, 0x00000000, 0x0401f849, 0x42000800, - 0x00000000, 0x0401f95a, 0x82040d00, 0x00000090, - 0x82040580, 0x00000090, 0x04000009, 0x82040580, - 0x00000010, 0x04000009, 0x82040580, 0x00000000, + 0x42000000, 0x00000000, 0x0401f86a, 0x5c000800, + 0x1c01f000, 0x4c040000, 0x59a8003f, 0x80000000, + 0x4803503f, 0x82000580, 0x00000005, 0x04020019, + 0x497b503f, 0x59c40801, 0x82040d00, 0x00018000, + 0x82040580, 0x00000000, 0x04000009, 0x82040580, + 0x00008000, 0x04000009, 0x82040580, 0x00010000, 0x04000009, 0x0201f800, 0x0010032d, 0x42000000, 0x00000002, 0x0401f006, 0x42000000, 0x00000001, - 0x0401f003, 0x42000000, 0x00000000, 0x0401f8aa, - 0x5c000800, 0x1c01f000, 0x4c200000, 0x59a80042, - 0x82000500, 0x00007fff, 0x02000800, 0x0010032d, - 0x59a84041, 0x80204102, 0x02001800, 0x0010032d, - 0x48235041, 0x80204500, 0x040007fa, 0x8c000504, - 0x04020007, 0x8c000502, 0x04020008, 0x8c000500, - 0x04020009, 0x0201f800, 0x0010032d, 0x42000000, - 0x00000002, 0x0401f006, 0x42000000, 0x00000000, - 0x0401f003, 0x42000000, 0x00000001, 0x0401f810, - 0x5c004000, 0x1c01f000, 0x04011000, 0x4a03c840, - 0x0010b7ba, 0x4a03c842, 0x00000009, 0x40000000, - 0x040117ff, 0x4a035041, 0x00000004, 0x4a035038, - 0x00000000, 0x1c01f000, 0x40680000, 0x59a80873, + 0x0401f003, 0x42000000, 0x00000000, 0x0401f849, + 0x42000800, 0x00000000, 0x0401f95a, 0x82040d00, + 0x00000090, 0x82040580, 0x00000090, 0x04000009, + 0x82040580, 0x00000010, 0x04000009, 0x82040580, + 0x00000000, 0x04000009, 0x0201f800, 0x0010032d, + 0x42000000, 0x00000002, 0x0401f006, 0x42000000, + 0x00000001, 0x0401f003, 0x42000000, 0x00000000, + 0x0401f8aa, 0x5c000800, 0x1c01f000, 0x4c200000, + 0x59a80042, 0x82000500, 0x00007fff, 0x02000800, + 0x0010032d, 0x59a84041, 0x80204102, 0x02001800, + 0x0010032d, 0x48235041, 0x80204500, 0x040007fa, + 0x8c000504, 0x04020007, 0x8c000502, 0x04020008, + 0x8c000500, 0x04020009, 0x0201f800, 0x0010032d, + 0x42000000, 0x00000002, 0x0401f006, 0x42000000, + 0x00000000, 0x0401f003, 0x42000000, 0x00000001, + 0x0401f810, 0x5c004000, 0x1c01f000, 0x04011000, + 0x4a03c840, 0x0010b8ba, 0x4a03c842, 0x00000009, + 0x40000000, 0x040117ff, 0x4a035041, 0x00000004, + 0x4a035038, 0x00000000, 0x1c01f000, 0x40680000, + 0x59a80873, 0x8c040d3e, 0x0402000c, 0x59a80847, + 0x82040d80, 0x01391077, 0x04020008, 0x59e00813, + 0x8c040d00, 0x04000005, 0x82000d80, 0x00000002, + 0x04020002, 0x41780000, 0x59a80847, 0x82040d80, + 0x015b1077, 0x0402000b, 0x4a03c014, 0x00200020, + 0x82000d80, 0x00000001, 0x42000800, 0x00200000, + 0x04000003, 0x42000800, 0x00200020, 0x4807c013, + 0x800001c0, 0x04000040, 0x82000d80, 0x00000001, + 0x0402001d, 0x42000800, 0x000000a0, 0x0401f8f1, + 0x82040540, 0x00000004, 0x42000800, 0x000000a0, + 0x0401f8f4, 0x42000800, 0x000000c0, 0x0401f8e9, + 0x82040540, 0x00000020, 0x42000800, 0x000000c0, + 0x0401f8ec, 0x59c40001, 0x82000500, 0xfffe7fff, + 0x82000540, 0x00000000, 0x48038801, 0x59a80044, + 0x80000110, 0x42000800, 0x000000e0, 0x0401f8e1, + 0x0401f03c, 0x82000d80, 0x00000002, 0x02020800, + 0x0010032d, 0x42000800, 0x000000a0, 0x0401f8d1, + 0x82040500, 0xfffffffb, 0x42000800, 0x000000a0, + 0x0401f8d4, 0x42000800, 0x000000c0, 0x0401f8c9, + 0x82040500, 0xffffffdf, 0x42000800, 0x000000c0, + 0x0401f8cc, 0x59c40001, 0x82000500, 0xfffe7fff, + 0x82000540, 0x00010000, 0x48038801, 0x59a80046, + 0x80000110, 0x42000800, 0x000000e0, 0x0401f8c1, + 0x0401f01c, 0x42000800, 0x000000a0, 0x0401f8b5, + 0x82040540, 0x00000004, 0x42000800, 0x000000a0, + 0x0401f8b8, 0x42000800, 0x000000c0, 0x0401f8ad, + 0x82040500, 0xffffffdf, 0x42000800, 0x000000c0, + 0x0401f8b0, 0x59c40001, 0x82000500, 0xfffe7fff, + 0x82000540, 0x00008000, 0x48038801, 0x59a80045, + 0x80000110, 0x42000800, 0x000000e0, 0x0401f8a5, + 0x1c01f000, 0x40680000, 0x4803c857, 0x59a80873, 0x8c040d3e, 0x0402000c, 0x59a80847, 0x82040d80, 0x01391077, 0x04020008, 0x59e00813, 0x8c040d00, 0x04000005, 0x82000d80, 0x00000002, 0x04020002, - 0x41780000, 0x59a80847, 0x82040d80, 0x015b1077, - 0x0402000b, 0x4a03c014, 0x00200020, 0x82000d80, - 0x00000001, 0x42000800, 0x00200000, 0x04000003, - 0x42000800, 0x00200020, 0x4807c013, 0x800001c0, - 0x04000040, 0x82000d80, 0x00000001, 0x0402001d, - 0x42000800, 0x000000a0, 0x0401f8f1, 0x82040540, - 0x00000004, 0x42000800, 0x000000a0, 0x0401f8f4, - 0x42000800, 0x000000c0, 0x0401f8e9, 0x82040540, - 0x00000020, 0x42000800, 0x000000c0, 0x0401f8ec, - 0x59c40001, 0x82000500, 0xfffe7fff, 0x82000540, - 0x00000000, 0x48038801, 0x59a80044, 0x80000110, - 0x42000800, 0x000000e0, 0x0401f8e1, 0x0401f03c, + 0x41780000, 0x4c000000, 0x0401f934, 0x5c000000, + 0x800001c0, 0x04000026, 0x82000d80, 0x00000001, + 0x04020010, 0x59a8006a, 0x80000540, 0x04000004, + 0x42001000, 0x00000000, 0x0401fa45, 0x42000800, + 0x00000000, 0x0401f87b, 0x82040540, 0x00000090, + 0x42000800, 0x00000000, 0x0401f87e, 0x0401f024, 0x82000d80, 0x00000002, 0x02020800, 0x0010032d, - 0x42000800, 0x000000a0, 0x0401f8d1, 0x82040500, - 0xfffffffb, 0x42000800, 0x000000a0, 0x0401f8d4, - 0x42000800, 0x000000c0, 0x0401f8c9, 0x82040500, - 0xffffffdf, 0x42000800, 0x000000c0, 0x0401f8cc, - 0x59c40001, 0x82000500, 0xfffe7fff, 0x82000540, - 0x00010000, 0x48038801, 0x59a80046, 0x80000110, - 0x42000800, 0x000000e0, 0x0401f8c1, 0x0401f01c, - 0x42000800, 0x000000a0, 0x0401f8b5, 0x82040540, - 0x00000004, 0x42000800, 0x000000a0, 0x0401f8b8, - 0x42000800, 0x000000c0, 0x0401f8ad, 0x82040500, - 0xffffffdf, 0x42000800, 0x000000c0, 0x0401f8b0, - 0x59c40001, 0x82000500, 0xfffe7fff, 0x82000540, - 0x00008000, 0x48038801, 0x59a80045, 0x80000110, - 0x42000800, 0x000000e0, 0x0401f8a5, 0x1c01f000, - 0x40680000, 0x4803c857, 0x59a80873, 0x8c040d3e, - 0x0402000c, 0x59a80847, 0x82040d80, 0x01391077, - 0x04020008, 0x59e00813, 0x8c040d00, 0x04000005, - 0x82000d80, 0x00000002, 0x04020002, 0x41780000, - 0x4c000000, 0x0401f934, 0x5c000000, 0x800001c0, - 0x04000026, 0x82000d80, 0x00000001, 0x04020010, 0x59a8006a, 0x80000540, 0x04000004, 0x42001000, - 0x00000000, 0x0401fa45, 0x42000800, 0x00000000, - 0x0401f87b, 0x82040540, 0x00000090, 0x42000800, - 0x00000000, 0x0401f87e, 0x0401f024, 0x82000d80, - 0x00000002, 0x02020800, 0x0010032d, 0x59a8006a, - 0x80000540, 0x04000004, 0x42001000, 0x00010000, - 0x0401fa32, 0x42000800, 0x00000000, 0x0401f868, - 0x82040500, 0xffffff6f, 0x42000800, 0x00000000, - 0x0401f86b, 0x0401f011, 0x59a8006a, 0x80000540, - 0x04000004, 0x42001000, 0x00008000, 0x0401fa23, - 0x42000800, 0x00000000, 0x0401f859, 0x82040500, - 0xffffff6f, 0x82000540, 0x00000010, 0x42000800, - 0x00000000, 0x0401f85a, 0x0401f103, 0x0401f807, - 0x42018800, 0x00000001, 0x04000003, 0x42018800, - 0x00000000, 0x1c01f000, 0x4c580000, 0x4200b000, - 0x00000014, 0x8058b040, 0x0400002a, 0x59c4000d, - 0x8c000520, 0x040207fc, 0x0401f83a, 0x59c4000d, - 0x8c000520, 0x040207f8, 0x59c40808, 0x82040d40, - 0x00000100, 0x48078808, 0x4200b000, 0x000000c8, - 0x8058b040, 0x040207ff, 0x4200b000, 0x00000014, - 0x8058b040, 0x04000017, 0x59c4000d, 0x8c000520, - 0x04020014, 0x0401f827, 0x59c4000d, 0x8c000520, - 0x04020010, 0x4200b000, 0x0000000a, 0x8058b040, - 0x04000003, 0x0401f81f, 0x0401f7fd, 0x4200b000, - 0x00000064, 0x59c4000d, 0x8c00051e, 0x04000005, - 0x8058b040, 0x040207fc, 0x80000580, 0x0401f003, - 0x82000540, 0x00000001, 0x5c00b000, 0x1c01f000, - 0x42000800, 0x000000a0, 0x0401f815, 0x82040500, - 0xfffffffe, 0x42000800, 0x000000a0, 0x0401f818, - 0x42000800, 0x00000000, 0x0401f80d, 0x82040500, - 0xfffffffe, 0x42000800, 0x00000000, 0x0401f010, - 0x40000000, 0x40000000, 0x40000000, 0x40000000, - 0x40000000, 0x1c01f000, 0x40680800, 0x4807880e, - 0x59c4080f, 0x82040d00, 0x000000ff, 0x40058800, - 0x1c01f000, 0x40680800, 0x406c0000, 0x900001c0, - 0x80040d40, 0x84040d40, 0x4807880e, 0x1c01f000, - 0x82000d80, 0x00200000, 0x04000009, 0x82000d80, - 0x02000000, 0x04000006, 0x82000d80, 0x01000000, - 0x04000006, 0x59c408a3, 0x0401f006, 0x59c408a3, - 0x84040d30, 0x0401f003, 0x59c408a3, 0x84040d32, - 0x80040540, 0x480388a3, 0x480788a3, 0x1c01f000, - 0x59c400a3, 0x84000556, 0x480388a3, 0x84000516, - 0x480388a3, 0x1c01f000, 0x485fc857, 0x4863c857, - 0x4c640000, 0x4d3c0000, 0x4d400000, 0x0201f800, - 0x001063db, 0x48635009, 0x40601800, 0x42002000, - 0x00000000, 0x0401fa91, 0x42000000, 0x0010bb7f, - 0x0201f800, 0x0010ad1d, 0x82600500, 0x0000ff00, - 0x82000580, 0x0000f700, 0x04020005, 0x42000000, - 0x0010bb67, 0x0201f800, 0x0010ad1d, 0x0201f800, - 0x0010ae24, 0x04020063, 0x82600d00, 0x0000ff00, - 0x800409c0, 0x0400000c, 0x4200c800, 0x00000001, - 0x59a8000f, 0x82000500, 0x000000ff, 0x80041110, - 0x80081580, 0x0400001f, 0x82041580, 0x0000ff00, - 0x0400000a, 0x59c410a3, 0x82081500, 0x00008000, - 0x04000009, 0x59c410a7, 0x82081500, 0x0000ff00, - 0x82081580, 0x0000ff00, 0x4200c800, 0x00000000, - 0x04000010, 0x8d0e1d02, 0x04020007, 0x8d0e1d00, - 0x0402000c, 0x599c1017, 0x8c08151a, 0x04000037, - 0x850e1d42, 0x4200c800, 0x00000002, 0x42028000, - 0x00000004, 0x42027800, 0x00000008, 0x0401f005, - 0x850e1d40, 0x42028000, 0x00000004, 0x417a7800, - 0x59a80005, 0x8c000502, 0x04020004, 0x8d0e1d0a, - 0x04020030, 0x850e1d4a, 0x42000000, 0x0010bb66, - 0x0201f800, 0x0010ad1d, 0x59a81809, 0x42001000, - 0x00008013, 0x0201f800, 0x001031eb, 0x8d0e1d20, - 0x04000015, 0x4d400000, 0x82600500, 0x000000ff, - 0x42028800, 0x0000ffff, 0x40643000, 0x42028000, - 0x0000000e, 0x0201f800, 0x00109f41, 0x42000800, - 0x00000001, 0x42001000, 0x00000100, 0x0201f800, - 0x00105a1f, 0x5c028000, 0x599c0817, 0x8c040d0a, - 0x04020010, 0x493fc857, 0x4943c857, 0x0201f800, - 0x0010ded4, 0x0401f00b, 0x8d0e1d20, 0x04000009, - 0x42028000, 0x0000000f, 0x42028800, 0x0000ffff, - 0x42003000, 0x00000000, 0x0201f800, 0x00109f44, - 0x497b8880, 0x5c028000, 0x5c027800, 0x5c00c800, - 0x1c01f000, 0x42000800, 0x00000000, 0x0401ff54, - 0x82040540, 0x00000002, 0x42000800, 0x00000000, - 0x0401f757, 0x42000800, 0x00000000, 0x0401ff4c, - 0x82040500, 0xfffffffd, 0x42000800, 0x00000000, - 0x0401f74f, 0x59c408a8, 0x0401ff3e, 0x0401ff3d, - 0x59c400a8, 0x80040d80, 0x040207fb, 0x1c01f000, - 0x4803c856, 0x4a038807, 0x00000001, 0x497b8807, - 0x59c40005, 0x48038805, 0x497b506a, 0x497b506b, - 0x59e00024, 0x8c000510, 0x04020038, 0x41785800, - 0x42006000, 0x00000001, 0x42006800, 0x00000003, - 0x0401f87c, 0x0401f887, 0x40400000, 0x4803c857, - 0x82408580, 0x00000000, 0x0402002c, 0x41785800, - 0x42006000, 0x00000004, 0x42006800, 0x00000006, - 0x0401f870, 0x0401f87b, 0x40400000, 0x4803c857, - 0x82408580, 0x0000001a, 0x04020020, 0x42005800, - 0x00000001, 0x42006000, 0x0000001e, 0x42006800, - 0x00000014, 0x0401f863, 0x0401f86e, 0x40400000, - 0x4803c857, 0x82408580, 0x0000ffff, 0x04020013, - 0x4a03506a, 0x00000001, 0x4803c856, 0x42001800, - 0x001200f5, 0x0401f9b3, 0x42001800, 0x003a0001, - 0x0401f9b0, 0x42001800, 0x000200f5, 0x0401f9ad, - 0x42001800, 0x00020001, 0x0401f9aa, 0x42001800, - 0x00000001, 0x0401f9a7, 0x1c01f000, 0x42005800, - 0x00000000, 0x42006000, 0x0000001e, 0x40006800, - 0x0401f844, 0x0401f84f, 0x40400000, 0x1c01f000, - 0x59a8006a, 0x80000540, 0x0400003d, 0x5c036000, - 0x4db00000, 0x49b3c857, 0x4c5c0000, 0x4c600000, - 0x42000800, 0x00000001, 0x0401f945, 0x42000000, - 0x0000000a, 0x0401ffea, 0x4000b800, 0x825c0480, - 0x00000005, 0x02021800, 0x0010032d, 0x4200c000, - 0x00000008, 0x825c0480, 0x00000004, 0x04001003, - 0x4200c000, 0x00000004, 0x59c8000b, 0x4803c857, - 0x59c4009e, 0x82000d80, 0x00000003, 0x0402001e, - 0x825c0d80, 0x00000003, 0x0400001b, 0x485fc857, - 0x42000000, 0x00000015, 0x0401ffd1, 0x80600540, - 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, - 0x42006800, 0x00000015, 0x0401f812, 0x5c000000, - 0x40006800, 0x0401f815, 0x82600580, 0x00000004, - 0x04000003, 0x805cb800, 0x0401f7ea, 0x805cb840, - 0x825c0580, 0x00000003, 0x02020800, 0x0010032d, - 0x0401f7e4, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x41785000, 0x0401f812, 0x0401f838, 0x40347000, - 0x40340800, 0x0401f03d, 0x42005000, 0x00000001, - 0x0401f80b, 0x0401f831, 0x40340800, 0x0401f037, - 0x42005000, 0x00000002, 0x0401f805, 0x0401f81d, - 0x0401f835, 0x40048000, 0x1c01f000, 0x0401f808, - 0x0401f814, 0x40280800, 0x0401f826, 0x402c0800, - 0x0401f827, 0x40300800, 0x0401f025, 0x42000800, - 0x0000ffff, 0x42001000, 0x00000001, 0x0401f829, - 0x42001000, 0x00000010, 0x0401f826, 0x42000800, - 0x0000ffff, 0x42001000, 0x00000010, 0x0401f021, - 0x41780800, 0x42001000, 0x00000002, 0x0401f01d, - 0x0401f946, 0x4a03d000, 0x00050004, 0x0401f943, - 0x4a03d000, 0x00050005, 0x0401f940, 0x4a03d000, - 0x00050004, 0x42000800, 0x00000001, 0x42001000, - 0x00000001, 0x0401f00f, 0x42000800, 0x00000002, - 0x42001000, 0x00000002, 0x0401f00a, 0x42001000, - 0x00000005, 0x0401f007, 0x42001000, 0x00000010, - 0x0401f004, 0x42001000, 0x00000010, 0x0401f01b, - 0x0401f92a, 0x82082c00, 0x0010ae3e, 0x50142800, - 0x82081500, 0xffffffff, 0x04000013, 0x0401f923, - 0x80081040, 0x80142902, 0x40040000, 0x80140500, - 0x04000007, 0x4a03d000, 0x00070006, 0x0401f91b, - 0x4a03d000, 0x00070007, 0x0401f006, 0x4a03d000, - 0x00070004, 0x0401f915, 0x4a03d000, 0x00070005, - 0x0401f7ec, 0x1c01f000, 0x41780800, 0x82082c00, - 0x0010ae3e, 0x50142800, 0x82081500, 0xffffffff, - 0x04000010, 0x0401f909, 0x4a03d000, 0x00050001, - 0x0401f906, 0x59e81800, 0x80081040, 0x80142902, - 0x8c0c1d06, 0x04000004, 0x40140000, 0x80040d40, - 0x0401f8fe, 0x4a03d000, 0x00070000, 0x0401f7ef, - 0x1c01f000, 0x40681000, 0x4c5c0000, 0x4c080000, - 0x42000000, 0x00000014, 0x0401ff39, 0x4000b800, - 0x42000800, 0x00000001, 0x0401f88d, 0x5c001000, - 0x480bc857, 0x480b506b, 0x59c40001, 0x82000500, - 0xffffefff, 0x48038801, 0x41781800, 0x0401f8d1, + 0x00010000, 0x0401fa32, 0x42000800, 0x00000000, + 0x0401f868, 0x82040500, 0xffffff6f, 0x42000800, + 0x00000000, 0x0401f86b, 0x0401f011, 0x59a8006a, + 0x80000540, 0x04000004, 0x42001000, 0x00008000, + 0x0401fa23, 0x42000800, 0x00000000, 0x0401f859, + 0x82040500, 0xffffff6f, 0x82000540, 0x00000010, + 0x42000800, 0x00000000, 0x0401f85a, 0x0401f103, + 0x0401f807, 0x42018800, 0x00000001, 0x04000003, + 0x42018800, 0x00000000, 0x1c01f000, 0x4c580000, + 0x4200b000, 0x00000014, 0x8058b040, 0x0400002a, + 0x59c4000d, 0x8c000520, 0x040207fc, 0x0401f83a, + 0x59c4000d, 0x8c000520, 0x040207f8, 0x59c40808, + 0x82040d40, 0x00000100, 0x48078808, 0x4200b000, + 0x000000c8, 0x8058b040, 0x040207ff, 0x4200b000, + 0x00000014, 0x8058b040, 0x04000017, 0x59c4000d, + 0x8c000520, 0x04020014, 0x0401f827, 0x59c4000d, + 0x8c000520, 0x04020010, 0x4200b000, 0x0000000a, + 0x8058b040, 0x04000003, 0x0401f81f, 0x0401f7fd, + 0x4200b000, 0x00000064, 0x59c4000d, 0x8c00051e, + 0x04000005, 0x8058b040, 0x040207fc, 0x80000580, + 0x0401f003, 0x82000540, 0x00000001, 0x5c00b000, + 0x1c01f000, 0x42000800, 0x000000a0, 0x0401f815, + 0x82040500, 0xfffffffe, 0x42000800, 0x000000a0, + 0x0401f818, 0x42000800, 0x00000000, 0x0401f80d, + 0x82040500, 0xfffffffe, 0x42000800, 0x00000000, + 0x0401f010, 0x40000000, 0x40000000, 0x40000000, + 0x40000000, 0x40000000, 0x1c01f000, 0x40680800, + 0x4807880e, 0x59c4080f, 0x82040d00, 0x000000ff, + 0x40058800, 0x1c01f000, 0x40680800, 0x406c0000, + 0x900001c0, 0x80040d40, 0x84040d40, 0x4807880e, + 0x1c01f000, 0x82000d80, 0x00200000, 0x04000009, + 0x82000d80, 0x02000000, 0x04000006, 0x82000d80, + 0x01000000, 0x04000006, 0x59c408a3, 0x0401f006, + 0x59c408a3, 0x84040d30, 0x0401f003, 0x59c408a3, + 0x84040d32, 0x80040540, 0x480388a3, 0x480788a3, + 0x1c01f000, 0x59c400a3, 0x84000556, 0x480388a3, + 0x84000516, 0x480388a3, 0x1c01f000, 0x485fc857, + 0x4863c857, 0x4c640000, 0x4d3c0000, 0x4d400000, + 0x0201f800, 0x00106480, 0x48635009, 0x40601800, + 0x42002000, 0x00000000, 0x0401fa91, 0x42000000, + 0x0010bc7f, 0x0201f800, 0x0010ae10, 0x82600500, + 0x0000ff00, 0x82000580, 0x0000f700, 0x04020005, + 0x42000000, 0x0010bc67, 0x0201f800, 0x0010ae10, + 0x0201f800, 0x0010af17, 0x04020063, 0x82600d00, + 0x0000ff00, 0x800409c0, 0x0400000c, 0x4200c800, + 0x00000001, 0x59a8000f, 0x82000500, 0x000000ff, + 0x80041110, 0x80081580, 0x0400001f, 0x82041580, + 0x0000ff00, 0x0400000a, 0x59c410a3, 0x82081500, + 0x00008000, 0x04000009, 0x59c410a7, 0x82081500, + 0x0000ff00, 0x82081580, 0x0000ff00, 0x4200c800, + 0x00000000, 0x04000010, 0x8d0e1d02, 0x04020007, + 0x8d0e1d00, 0x0402000c, 0x599c1017, 0x8c08151a, + 0x04000037, 0x850e1d42, 0x4200c800, 0x00000002, + 0x42028000, 0x00000004, 0x42027800, 0x00000008, + 0x0401f005, 0x850e1d40, 0x42028000, 0x00000004, + 0x417a7800, 0x59a80005, 0x8c000502, 0x04020004, + 0x8d0e1d0a, 0x04020030, 0x850e1d4a, 0x42000000, + 0x0010bc66, 0x0201f800, 0x0010ae10, 0x59a81809, + 0x42001000, 0x00008013, 0x0201f800, 0x001031f5, + 0x8d0e1d20, 0x04000015, 0x4d400000, 0x82600500, + 0x000000ff, 0x42028800, 0x0000ffff, 0x40643000, + 0x42028000, 0x0000000e, 0x0201f800, 0x0010a018, + 0x42000800, 0x00000001, 0x42001000, 0x00000100, + 0x0201f800, 0x00105ac4, 0x5c028000, 0x599c0817, + 0x8c040d0a, 0x04020010, 0x493fc857, 0x4943c857, + 0x0201f800, 0x0010dfe1, 0x0401f00b, 0x8d0e1d20, + 0x04000009, 0x42028000, 0x0000000f, 0x42028800, + 0x0000ffff, 0x42003000, 0x00000000, 0x0201f800, + 0x0010a01b, 0x497b8880, 0x5c028000, 0x5c027800, + 0x5c00c800, 0x1c01f000, 0x42000800, 0x00000000, + 0x0401ff54, 0x82040540, 0x00000002, 0x42000800, + 0x00000000, 0x0401f757, 0x42000800, 0x00000000, + 0x0401ff4c, 0x82040500, 0xfffffffd, 0x42000800, + 0x00000000, 0x0401f74f, 0x59c408a8, 0x0401ff3e, + 0x0401ff3d, 0x59c400a8, 0x80040d80, 0x040207fb, + 0x1c01f000, 0x4803c856, 0x4a038807, 0x00000001, + 0x497b8807, 0x59c40005, 0x48038805, 0x497b506a, + 0x497b506b, 0x59e00024, 0x8c000510, 0x04020038, + 0x41785800, 0x42006000, 0x00000001, 0x42006800, + 0x00000003, 0x0401f87c, 0x0401f887, 0x40400000, + 0x4803c857, 0x82408580, 0x00000000, 0x0402002c, + 0x41785800, 0x42006000, 0x00000004, 0x42006800, + 0x00000006, 0x0401f870, 0x0401f87b, 0x40400000, + 0x4803c857, 0x82408580, 0x0000001a, 0x04020020, + 0x42005800, 0x00000001, 0x42006000, 0x0000001e, + 0x42006800, 0x00000014, 0x0401f863, 0x0401f86e, + 0x40400000, 0x4803c857, 0x82408580, 0x0000ffff, + 0x04020013, 0x4a03506a, 0x00000001, 0x4803c856, + 0x42001800, 0x001200f5, 0x0401f9b3, 0x42001800, + 0x003a0001, 0x0401f9b0, 0x42001800, 0x000200f5, + 0x0401f9ad, 0x42001800, 0x00020001, 0x0401f9aa, + 0x42001800, 0x00000001, 0x0401f9a7, 0x1c01f000, + 0x42005800, 0x00000000, 0x42006000, 0x0000001e, + 0x40006800, 0x0401f844, 0x0401f84f, 0x40400000, + 0x1c01f000, 0x59a8006a, 0x80000540, 0x0400003d, + 0x5c036000, 0x4db00000, 0x49b3c857, 0x4c5c0000, + 0x4c600000, 0x42000800, 0x00000001, 0x0401f945, + 0x42000000, 0x0000000a, 0x0401ffea, 0x4000b800, + 0x825c0480, 0x00000005, 0x02021800, 0x0010032d, + 0x4200c000, 0x00000008, 0x825c0480, 0x00000004, + 0x04001003, 0x4200c000, 0x00000004, 0x59c8000b, + 0x4803c857, 0x59c4009e, 0x82000d80, 0x00000003, + 0x0402001e, 0x825c0d80, 0x00000003, 0x0400001b, + 0x485fc857, 0x42000000, 0x00000015, 0x0401ffd1, + 0x80600540, 0x4c000000, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000015, 0x0401f812, + 0x5c000000, 0x40006800, 0x0401f815, 0x82600580, + 0x00000004, 0x04000003, 0x805cb800, 0x0401f7ea, + 0x805cb840, 0x825c0580, 0x00000003, 0x02020800, + 0x0010032d, 0x0401f7e4, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x41785000, 0x0401f812, 0x0401f838, + 0x40347000, 0x40340800, 0x0401f03d, 0x42005000, + 0x00000001, 0x0401f80b, 0x0401f831, 0x40340800, + 0x0401f037, 0x42005000, 0x00000002, 0x0401f805, + 0x0401f81d, 0x0401f835, 0x40048000, 0x1c01f000, + 0x0401f808, 0x0401f814, 0x40280800, 0x0401f826, + 0x402c0800, 0x0401f827, 0x40300800, 0x0401f025, + 0x42000800, 0x0000ffff, 0x42001000, 0x00000001, + 0x0401f829, 0x42001000, 0x00000010, 0x0401f826, + 0x42000800, 0x0000ffff, 0x42001000, 0x00000010, + 0x0401f021, 0x41780800, 0x42001000, 0x00000002, + 0x0401f01d, 0x0401f946, 0x4a03d000, 0x00050004, + 0x0401f943, 0x4a03d000, 0x00050005, 0x0401f940, + 0x4a03d000, 0x00050004, 0x42000800, 0x00000001, + 0x42001000, 0x00000001, 0x0401f00f, 0x42000800, + 0x00000002, 0x42001000, 0x00000002, 0x0401f00a, + 0x42001000, 0x00000005, 0x0401f007, 0x42001000, + 0x00000010, 0x0401f004, 0x42001000, 0x00000010, + 0x0401f01b, 0x0401f92a, 0x82082c00, 0x0010af34, + 0x50142800, 0x82081500, 0xffffffff, 0x04000013, + 0x0401f923, 0x80081040, 0x80142902, 0x40040000, + 0x80140500, 0x04000007, 0x4a03d000, 0x00070006, + 0x0401f91b, 0x4a03d000, 0x00070007, 0x0401f006, + 0x4a03d000, 0x00070004, 0x0401f915, 0x4a03d000, + 0x00070005, 0x0401f7ec, 0x1c01f000, 0x41780800, + 0x82082c00, 0x0010af34, 0x50142800, 0x82081500, + 0xffffffff, 0x04000010, 0x0401f909, 0x4a03d000, + 0x00050001, 0x0401f906, 0x59e81800, 0x80081040, + 0x80142902, 0x8c0c1d06, 0x04000004, 0x40140000, + 0x80040d40, 0x0401f8fe, 0x4a03d000, 0x00070000, + 0x0401f7ef, 0x1c01f000, 0x40681000, 0x4c5c0000, + 0x4c080000, 0x42000000, 0x00000014, 0x0401ff39, + 0x4000b800, 0x42000800, 0x00000001, 0x0401f88d, + 0x5c001000, 0x480bc857, 0x480b506b, 0x59c40001, + 0x82000500, 0xffffefff, 0x48038801, 0x41781800, + 0x0401f8d1, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000004, 0x0401ff6f, 0x42006800, + 0x0000003c, 0x0401ff72, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000004, 0x0401ff66, + 0x41786800, 0x0401ff6a, 0x41785800, 0x42006000, + 0x0000001e, 0x41786800, 0x0401ff5f, 0x42006800, + 0x00000002, 0x0401ff62, 0x42006800, 0x00000001, + 0x0401ff59, 0x42006800, 0x000000f5, 0x0401ff5c, 0x41785800, 0x42006000, 0x0000001e, 0x42006800, - 0x00000004, 0x0401ff6f, 0x42006800, 0x0000003c, - 0x0401ff72, 0x41785800, 0x42006000, 0x0000001e, - 0x42006800, 0x00000004, 0x0401ff66, 0x41786800, - 0x0401ff6a, 0x41785800, 0x42006000, 0x0000001e, - 0x41786800, 0x0401ff5f, 0x42006800, 0x00000002, - 0x0401ff62, 0x42006800, 0x00000001, 0x0401ff59, - 0x42006800, 0x000000f5, 0x0401ff5c, 0x41785800, - 0x42006000, 0x0000001e, 0x42006800, 0x00000004, - 0x0401ff50, 0x42006800, 0x00000020, 0x0401ff53, - 0x59a8106b, 0x0401f872, 0x42001800, 0x000200f5, - 0x0401f8a4, 0x59a8106b, 0x0401f886, 0x41785800, - 0x42006000, 0x0000001e, 0x42006800, 0x00000004, - 0x0401ff40, 0x41786800, 0x0401ff44, 0x42000000, - 0x00000015, 0x0401fef2, 0x82000540, 0x00000002, - 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, - 0x42006800, 0x00000015, 0x0401ff32, 0x5c000000, - 0x40006800, 0x0401ff35, 0x42000000, 0x00000015, - 0x0401fee3, 0x82000500, 0x0000fffd, 0x4c000000, + 0x00000004, 0x0401ff50, 0x42006800, 0x00000020, + 0x0401ff53, 0x59a8106b, 0x0401f872, 0x42001800, + 0x000200f5, 0x0401f8a4, 0x59a8106b, 0x0401f886, 0x41785800, 0x42006000, 0x0000001e, 0x42006800, - 0x00000015, 0x0401ff23, 0x5c000000, 0x40006800, - 0x0401ff26, 0x42000000, 0x00000014, 0x0401fed4, - 0x82000540, 0x00000040, 0x4c000000, 0x41785800, + 0x00000004, 0x0401ff40, 0x41786800, 0x0401ff44, + 0x42000000, 0x00000015, 0x0401fef2, 0x82000540, + 0x00000002, 0x4c000000, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000015, 0x0401ff32, + 0x5c000000, 0x40006800, 0x0401ff35, 0x42000000, + 0x00000015, 0x0401fee3, 0x82000500, 0x0000fffd, + 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000015, 0x0401ff23, 0x5c000000, + 0x40006800, 0x0401ff26, 0x42000000, 0x00000014, + 0x0401fed4, 0x82000540, 0x00000040, 0x4c000000, + 0x41785800, 0x42006000, 0x0000001e, 0x42006800, + 0x00000014, 0x0401ff14, 0x5c000000, 0x40006800, + 0x0401ff17, 0x42000000, 0x00000014, 0x0401fec5, + 0x82000500, 0x0000ffbf, 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, 0x42006800, 0x00000014, - 0x0401ff14, 0x5c000000, 0x40006800, 0x0401ff17, - 0x42000000, 0x00000014, 0x0401fec5, 0x82000500, - 0x0000ffbf, 0x4c000000, 0x41785800, 0x42006000, - 0x0000001e, 0x42006800, 0x00000014, 0x0401ff05, - 0x5c000000, 0x40006800, 0x0401ff08, 0x4a038886, - 0x00002020, 0x41780800, 0x8c5cbd06, 0x04000003, - 0x42000800, 0x00000001, 0x0401f809, 0x59c40001, - 0x82000540, 0x00001000, 0x48038801, 0x0401f867, - 0x0401feb4, 0x5c00b800, 0x1c01f000, 0x59a8006a, - 0x80000540, 0x04000015, 0x4807c857, 0x42000000, - 0x00000014, 0x4c040000, 0x0401fea1, 0x5c000800, - 0x84000546, 0x800409c0, 0x04020002, 0x84000506, - 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, - 0x42006800, 0x00000014, 0x0401fede, 0x5c000000, - 0x40006800, 0x0401fee1, 0x1c01f000, 0x480bc857, - 0x82080580, 0x00010000, 0x04020007, 0x82040d40, - 0x00010000, 0x42001800, 0x00000001, 0x0401f82d, - 0x0401f00f, 0x82080580, 0x00008000, 0x04000007, - 0x82040d40, 0x00000000, 0x42001800, 0x00900001, - 0x0401f824, 0x0401f006, 0x82040d40, 0x00008000, - 0x42001800, 0x00100001, 0x0401f81e, 0x1c01f000, - 0x480bc857, 0x82080580, 0x00010000, 0x04020008, - 0x42001800, 0x000000a1, 0x0401f816, 0x42001800, - 0x000000c1, 0x0401f813, 0x0401f011, 0x82080580, - 0x00008000, 0x04000008, 0x42001800, 0x000400a1, - 0x0401f80c, 0x42001800, 0x002000c1, 0x0401f809, - 0x0401f007, 0x42001800, 0x000400a1, 0x0401f805, - 0x42001800, 0x000000c1, 0x0401f802, 0x1c01f000, - 0x480fc857, 0x41785800, 0x42006000, 0x0000001e, - 0x41786800, 0x0401fe9f, 0x400c6800, 0x80346960, - 0x0401fea2, 0x42006800, 0x00000001, 0x0401fe99, - 0x400c6800, 0x0401fe9d, 0x42006800, 0x00000003, - 0x0401fe94, 0x0401fe9f, 0x40400000, 0x8c000504, - 0x040207fc, 0x1c01f000, 0x40000000, 0x40000000, - 0x40000000, 0x1c01f000, 0x59a80005, 0x8c000500, - 0x0400000a, 0x59a80008, 0x8c000500, 0x04020007, - 0x84000540, 0x48035008, 0x42001000, 0x00008016, - 0x0201f800, 0x001031eb, 0x1c01f000, 0x4803c856, - 0x59a80006, 0x8c00051e, 0x0402000a, 0x42028800, - 0x000007fc, 0x42003000, 0x00fffffc, 0x0201f800, - 0x00103dcb, 0x04020008, 0x0401f809, 0x04000006, - 0x4a03501c, 0x0000ffff, 0x82000540, 0x00000001, - 0x1c01f000, 0x80000580, 0x0401f7fe, 0x4937c857, - 0x0201f800, 0x001070f5, 0x04000016, 0x4936600a, - 0x4a026407, 0x00000001, 0x417a7800, 0x0201f800, - 0x00103d7f, 0x42000800, 0x00000003, 0x0201f800, - 0x00103d8a, 0x59a8001d, 0x80000000, 0x4803501d, - 0x599c0208, 0x48026c12, 0x42027000, 0x00000002, + 0x0401ff05, 0x5c000000, 0x40006800, 0x0401ff08, + 0x4a038886, 0x00002020, 0x41780800, 0x8c5cbd06, + 0x04000003, 0x42000800, 0x00000001, 0x0401f809, + 0x59c40001, 0x82000540, 0x00001000, 0x48038801, + 0x0401f867, 0x0401feb4, 0x5c00b800, 0x1c01f000, + 0x59a8006a, 0x80000540, 0x04000015, 0x4807c857, + 0x42000000, 0x00000014, 0x4c040000, 0x0401fea1, + 0x5c000800, 0x84000546, 0x800409c0, 0x04020002, + 0x84000506, 0x4c000000, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000014, 0x0401fede, + 0x5c000000, 0x40006800, 0x0401fee1, 0x1c01f000, + 0x480bc857, 0x82080580, 0x00010000, 0x04020007, + 0x82040d40, 0x00010000, 0x42001800, 0x00000001, + 0x0401f82d, 0x0401f00f, 0x82080580, 0x00008000, + 0x04000007, 0x82040d40, 0x00000000, 0x42001800, + 0x00900001, 0x0401f824, 0x0401f006, 0x82040d40, + 0x00008000, 0x42001800, 0x00100001, 0x0401f81e, + 0x1c01f000, 0x480bc857, 0x82080580, 0x00010000, + 0x04020008, 0x42001800, 0x000000a1, 0x0401f816, + 0x42001800, 0x000000c1, 0x0401f813, 0x0401f011, + 0x82080580, 0x00008000, 0x04000008, 0x42001800, + 0x000400a1, 0x0401f80c, 0x42001800, 0x002000c1, + 0x0401f809, 0x0401f007, 0x42001800, 0x000400a1, + 0x0401f805, 0x42001800, 0x000000c1, 0x0401f802, + 0x1c01f000, 0x480fc857, 0x41785800, 0x42006000, + 0x0000001e, 0x41786800, 0x0401fe9f, 0x400c6800, + 0x80346960, 0x0401fea2, 0x42006800, 0x00000001, + 0x0401fe99, 0x400c6800, 0x0401fe9d, 0x42006800, + 0x00000003, 0x0401fe94, 0x0401fe9f, 0x40400000, + 0x8c000504, 0x040207fc, 0x1c01f000, 0x40000000, + 0x40000000, 0x40000000, 0x1c01f000, 0x59a80005, + 0x8c000500, 0x0400000a, 0x59a80008, 0x8c000500, + 0x04020007, 0x84000540, 0x48035008, 0x42001000, + 0x00008016, 0x0201f800, 0x001031f5, 0x1c01f000, + 0x4803c856, 0x59a80006, 0x8c00051e, 0x0402000a, + 0x42028800, 0x000007fc, 0x42003000, 0x00fffffc, + 0x0201f800, 0x00103de1, 0x04020008, 0x0401f809, + 0x04000006, 0x4a03501c, 0x0000ffff, 0x82000540, + 0x00000001, 0x1c01f000, 0x80000580, 0x0401f7fe, + 0x4937c857, 0x0201f800, 0x00107188, 0x04000016, + 0x4936600a, 0x4a026407, 0x00000001, 0x417a7800, + 0x0201f800, 0x00103d92, 0x42000800, 0x00000003, + 0x0201f800, 0x00103d9d, 0x59a8001d, 0x80000000, + 0x4803501d, 0x599c0208, 0x48026c12, 0x42027000, + 0x00000002, 0x0201f800, 0x00020a34, 0x82000540, + 0x00000001, 0x1c01f000, 0x40681000, 0x0401f807, + 0x42018800, 0x00000000, 0x04000003, 0x42018800, + 0x00000001, 0x1c01f000, 0x480bc857, 0x492fc857, + 0x4c5c0000, 0x4008b800, 0x42028800, 0x000007fd, + 0x42003000, 0x00fffffd, 0x0201f800, 0x00103de1, + 0x0402001e, 0x5934000a, 0x84000544, 0x4802680a, + 0x0201f800, 0x00107188, 0x04000018, 0x4936600a, + 0x812e59c0, 0x04000006, 0x592c0405, 0x8c00051e, + 0x04000003, 0x48ee6022, 0x0401f004, 0x59a8021b, + 0x8400055c, 0x4803521b, 0x492e6009, 0x4a026407, + 0x00000001, 0x485e601d, 0x42027000, 0x00000022, 0x0201f800, 0x00020a34, 0x82000540, 0x00000001, - 0x1c01f000, 0x40681000, 0x0401f807, 0x42018800, - 0x00000000, 0x04000003, 0x42018800, 0x00000001, - 0x1c01f000, 0x480bc857, 0x492fc857, 0x4c5c0000, - 0x4008b800, 0x42028800, 0x000007fd, 0x42003000, - 0x00fffffd, 0x0201f800, 0x00103dcb, 0x0402001e, - 0x5934000a, 0x84000544, 0x4802680a, 0x0201f800, - 0x001070f5, 0x04000018, 0x4936600a, 0x812e59c0, - 0x04000006, 0x592c0405, 0x8c00051e, 0x04000003, - 0x48ee6022, 0x0401f004, 0x59a8021b, 0x8400055c, - 0x4803521b, 0x492e6009, 0x4a026407, 0x00000001, - 0x485e601d, 0x42027000, 0x00000022, 0x0201f800, - 0x00020a34, 0x82000540, 0x00000001, 0x5c00b800, - 0x1c01f000, 0x80000580, 0x0401f7fd, 0x4933c857, - 0x59a8021b, 0x8c000508, 0x04020012, 0x5930500a, - 0x482bc857, 0x836c0580, 0x00000002, 0x0402000d, - 0x0401f813, 0x0402000b, 0x58280403, 0x82000580, - 0x000007fc, 0x04000008, 0x59a80016, 0x80000040, - 0x4803c857, 0x02001800, 0x0010032d, 0x48035016, - 0x1c01f000, 0x59a8001d, 0x80000040, 0x4803c857, - 0x040017fc, 0x4803501d, 0x1c01f000, 0x59300009, - 0x800001c0, 0x04020009, 0x59300403, 0x82000580, - 0x00000001, 0x04020004, 0x82000540, 0x00000001, - 0x0401f002, 0x80000580, 0x1c01f000, 0x4933c857, - 0x493fc857, 0x4947c857, 0x4d400000, 0x4d340000, - 0x4d440000, 0x4c580000, 0x0201f800, 0x0010610d, - 0x4df00000, 0x8060c1c0, 0x04020004, 0x4200b000, - 0x00000001, 0x0401f004, 0x4200b000, 0x000007f0, - 0x417a8800, 0x41440000, 0x81ac0400, 0x50000000, - 0x80026d40, 0x0400001a, 0x4d3c0000, 0x42027800, - 0x00000001, 0x0201f800, 0x001040d5, 0x5c027800, - 0x42028000, 0x00000029, 0x0201f800, 0x0010e4c8, - 0x0201f800, 0x0010e5a4, 0x0201f800, 0x0010e63d, - 0x0201f800, 0x00104165, 0x04020005, 0x4937c857, - 0x4a026c00, 0x00000404, 0x0401f003, 0x0201f800, - 0x001041a0, 0x0201f800, 0x0010ea62, 0x81468800, - 0x8058b040, 0x040207e0, 0x5c03e000, 0x02000800, - 0x001060fa, 0x5c00b000, 0x5c028800, 0x5c026800, - 0x5c028000, 0x1c01f000, 0x0401f807, 0x42018800, - 0x00000001, 0x04000003, 0x42018800, 0x00000000, - 0x1c01f000, 0x4937c857, 0x4947c857, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x59a80056, 0x8c000500, - 0x0400001f, 0x599c0017, 0x8c00050a, 0x0402001c, - 0x5934ba02, 0x825cbd00, 0x000000ff, 0x485fc857, - 0x4178c000, 0x4178c800, 0x82600400, 0x0010c1c7, - 0x50002000, 0x8060c1c0, 0x04000008, 0x82100500, - 0x000000ff, 0x82002d80, 0x000000ff, 0x0400000c, - 0x805c0580, 0x0400000d, 0x80102110, 0x8064c800, - 0x82640580, 0x00000004, 0x040207f5, 0x8060c000, - 0x82600580, 0x00000020, 0x040207eb, 0x4813c857, - 0x82000540, 0x00000001, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x0401f807, 0x42018800, - 0x00000001, 0x04020003, 0x42018800, 0x00000000, - 0x1c01f000, 0x59a8021b, 0x8c000512, 0x02020800, - 0x001003f4, 0x1c01f000, 0x00007eef, 0x00007de8, - 0x00007ce4, 0x000080e2, 0x00007be1, 0x000080e0, - 0x000080dc, 0x000080da, 0x00007ad9, 0x000080d6, - 0x000080d5, 0x000080d4, 0x000080d3, 0x000080d2, - 0x000080d1, 0x000079ce, 0x000078cd, 0x000080cc, - 0x000080cb, 0x000080ca, 0x000080c9, 0x000080c7, - 0x000080c6, 0x000077c5, 0x000076c3, 0x000080bc, - 0x000080ba, 0x000075b9, 0x000080b6, 0x000074b5, - 0x000073b4, 0x000072b3, 0x000080b2, 0x000080b1, - 0x000080ae, 0x000071ad, 0x000080ac, 0x000070ab, - 0x00006faa, 0x00006ea9, 0x000080a7, 0x00006da6, - 0x00006ca5, 0x00006ba3, 0x00006a9f, 0x0000699e, - 0x0000689d, 0x0000809b, 0x00008098, 0x00006797, - 0x00006690, 0x0000658f, 0x00006488, 0x00006384, - 0x00006282, 0x00008081, 0x00008080, 0x0000617c, - 0x0000607a, 0x00008079, 0x00005f76, 0x00008075, - 0x00008074, 0x00008073, 0x00008072, 0x00008071, - 0x0000806e, 0x00005e6d, 0x0000806c, 0x00005d6b, - 0x00005c6a, 0x00005b69, 0x00008067, 0x00005a66, - 0x00005965, 0x00005863, 0x0000575c, 0x0000565a, - 0x00005559, 0x00008056, 0x00008055, 0x00005454, - 0x00005353, 0x00005252, 0x00005151, 0x0000504e, - 0x00004f4d, 0x0000804c, 0x0000804b, 0x00004e4a, - 0x00004d49, 0x00008047, 0x00004c46, 0x00008045, - 0x00008043, 0x0000803c, 0x0000803a, 0x00008039, - 0x00008036, 0x00004b35, 0x00008034, 0x00004a33, - 0x00004932, 0x00004831, 0x0000802e, 0x0000472d, - 0x0000462c, 0x0000452b, 0x0000442a, 0x00004329, - 0x00004227, 0x00008026, 0x00008025, 0x00004123, - 0x0000401f, 0x00003f1e, 0x00003e1d, 0x00003d1b, - 0x00003c18, 0x00008017, 0x00008010, 0x00003b0f, - 0x00003a08, 0x00008004, 0x00003902, 0x00008001, - 0x00008000, 0x00008000, 0x00003800, 0x00003700, - 0x00003600, 0x00008000, 0x00003500, 0x00008000, - 0x00008000, 0x00008000, 0x00003400, 0x00008000, + 0x5c00b800, 0x1c01f000, 0x80000580, 0x0401f7fd, + 0x4933c857, 0x59a8021b, 0x8c000508, 0x04020012, + 0x5930500a, 0x482bc857, 0x836c0580, 0x00000002, + 0x0402000d, 0x0401f817, 0x0402000b, 0x58280403, + 0x82000580, 0x000007fc, 0x04000008, 0x59a80016, + 0x80000040, 0x4803c857, 0x02001800, 0x0010032d, + 0x48035016, 0x1c01f000, 0x5930041e, 0x82000580, + 0x00000021, 0x040007fc, 0x59a8001d, 0x80000040, + 0x4803c857, 0x040017f8, 0x4803501d, 0x1c01f000, + 0x59300009, 0x800001c0, 0x04020009, 0x59300403, + 0x82000580, 0x00000001, 0x04020004, 0x82000540, + 0x00000001, 0x0401f002, 0x80000580, 0x1c01f000, + 0x4933c857, 0x493fc857, 0x4947c857, 0x4d400000, + 0x4d340000, 0x4d440000, 0x4c580000, 0x0201f800, + 0x001061b2, 0x4df00000, 0x8060c1c0, 0x04020004, + 0x4200b000, 0x00000001, 0x0401f004, 0x4200b000, + 0x000007f0, 0x417a8800, 0x41440000, 0x81ac0400, + 0x50000000, 0x80026d40, 0x0400001a, 0x4d3c0000, + 0x42027800, 0x00000001, 0x0201f800, 0x001040ef, + 0x5c027800, 0x42028000, 0x00000029, 0x0201f800, + 0x0010e5d8, 0x0201f800, 0x0010e6a9, 0x0201f800, + 0x0010e742, 0x0201f800, 0x00104181, 0x04020005, + 0x4937c857, 0x4a026c00, 0x00000404, 0x0401f003, + 0x0201f800, 0x001041bc, 0x0201f800, 0x0010eb5d, + 0x81468800, 0x8058b040, 0x040207e0, 0x5c03e000, + 0x02000800, 0x0010619f, 0x5c00b000, 0x5c028800, + 0x5c026800, 0x5c028000, 0x1c01f000, 0x0401f807, + 0x42018800, 0x00000001, 0x04000003, 0x42018800, + 0x00000000, 0x1c01f000, 0x4937c857, 0x4947c857, + 0x4c5c0000, 0x4c600000, 0x4c640000, 0x59a80056, + 0x8c000500, 0x0400001f, 0x599c0017, 0x8c00050a, + 0x0402001c, 0x5934ba02, 0x825cbd00, 0x000000ff, + 0x485fc857, 0x4178c000, 0x4178c800, 0x82600400, + 0x0010c2c7, 0x50002000, 0x8060c1c0, 0x04000008, + 0x82100500, 0x000000ff, 0x82002d80, 0x000000ff, + 0x0400000c, 0x805c0580, 0x0400000d, 0x80102110, + 0x8064c800, 0x82640580, 0x00000004, 0x040207f5, + 0x8060c000, 0x82600580, 0x00000020, 0x040207eb, + 0x4813c857, 0x82000540, 0x00000001, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x0401f807, + 0x42018800, 0x00000001, 0x04020003, 0x42018800, + 0x00000000, 0x1c01f000, 0x59a8021b, 0x8c000512, + 0x02020800, 0x001003f4, 0x1c01f000, 0x00007eef, + 0x00007de8, 0x00007ce4, 0x000080e2, 0x00007be1, + 0x000080e0, 0x000080dc, 0x000080da, 0x00007ad9, + 0x000080d6, 0x000080d5, 0x000080d4, 0x000080d3, + 0x000080d2, 0x000080d1, 0x000079ce, 0x000078cd, + 0x000080cc, 0x000080cb, 0x000080ca, 0x000080c9, + 0x000080c7, 0x000080c6, 0x000077c5, 0x000076c3, + 0x000080bc, 0x000080ba, 0x000075b9, 0x000080b6, + 0x000074b5, 0x000073b4, 0x000072b3, 0x000080b2, + 0x000080b1, 0x000080ae, 0x000071ad, 0x000080ac, + 0x000070ab, 0x00006faa, 0x00006ea9, 0x000080a7, + 0x00006da6, 0x00006ca5, 0x00006ba3, 0x00006a9f, + 0x0000699e, 0x0000689d, 0x0000809b, 0x00008098, + 0x00006797, 0x00006690, 0x0000658f, 0x00006488, + 0x00006384, 0x00006282, 0x00008081, 0x00008080, + 0x0000617c, 0x0000607a, 0x00008079, 0x00005f76, + 0x00008075, 0x00008074, 0x00008073, 0x00008072, + 0x00008071, 0x0000806e, 0x00005e6d, 0x0000806c, + 0x00005d6b, 0x00005c6a, 0x00005b69, 0x00008067, + 0x00005a66, 0x00005965, 0x00005863, 0x0000575c, + 0x0000565a, 0x00005559, 0x00008056, 0x00008055, + 0x00005454, 0x00005353, 0x00005252, 0x00005151, + 0x0000504e, 0x00004f4d, 0x0000804c, 0x0000804b, + 0x00004e4a, 0x00004d49, 0x00008047, 0x00004c46, + 0x00008045, 0x00008043, 0x0000803c, 0x0000803a, + 0x00008039, 0x00008036, 0x00004b35, 0x00008034, + 0x00004a33, 0x00004932, 0x00004831, 0x0000802e, + 0x0000472d, 0x0000462c, 0x0000452b, 0x0000442a, + 0x00004329, 0x00004227, 0x00008026, 0x00008025, + 0x00004123, 0x0000401f, 0x00003f1e, 0x00003e1d, + 0x00003d1b, 0x00003c18, 0x00008017, 0x00008010, + 0x00003b0f, 0x00003a08, 0x00008004, 0x00003902, + 0x00008001, 0x00008000, 0x00008000, 0x00003800, + 0x00003700, 0x00003600, 0x00008000, 0x00003500, + 0x00008000, 0x00008000, 0x00008000, 0x00003400, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00003300, 0x00003200, 0x00008000, + 0x00008000, 0x00008000, 0x00003300, 0x00003200, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00003100, 0x00003000, 0x00008000, - 0x00008000, 0x00002f00, 0x00008000, 0x00002e00, - 0x00002d00, 0x00002c00, 0x00008000, 0x00008000, - 0x00008000, 0x00002b00, 0x00008000, 0x00002a00, - 0x00002900, 0x00002800, 0x00008000, 0x00002700, - 0x00002600, 0x00002500, 0x00002400, 0x00002300, - 0x00002200, 0x00008000, 0x00008000, 0x00002100, - 0x00002000, 0x00001f00, 0x00001e00, 0x00001d00, - 0x00001c00, 0x00008000, 0x00008000, 0x00001b00, - 0x00001a00, 0x00008000, 0x00001900, 0x00008000, + 0x00008000, 0x00008000, 0x00003100, 0x00003000, + 0x00008000, 0x00008000, 0x00002f00, 0x00008000, + 0x00002e00, 0x00002d00, 0x00002c00, 0x00008000, + 0x00008000, 0x00008000, 0x00002b00, 0x00008000, + 0x00002a00, 0x00002900, 0x00002800, 0x00008000, + 0x00002700, 0x00002600, 0x00002500, 0x00002400, + 0x00002300, 0x00002200, 0x00008000, 0x00008000, + 0x00002100, 0x00002000, 0x00001f00, 0x00001e00, + 0x00001d00, 0x00001c00, 0x00008000, 0x00008000, + 0x00001b00, 0x00001a00, 0x00008000, 0x00001900, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00001800, 0x00008000, 0x00001700, - 0x00001600, 0x00001500, 0x00008000, 0x00001400, - 0x00001300, 0x00001200, 0x00001100, 0x00001000, - 0x00000f00, 0x00008000, 0x00008000, 0x00000e00, - 0x00000d00, 0x00000c00, 0x00000b00, 0x00000a00, - 0x00000900, 0x00008000, 0x00008000, 0x00000800, - 0x00000700, 0x00008000, 0x00000600, 0x00008000, - 0x00008000, 0x00008000, 0x00000500, 0x00000400, - 0x00000300, 0x00008000, 0x00000200, 0x00008000, - 0x00008000, 0x00008000, 0x00000100, 0x00008000, + 0x00008000, 0x00008000, 0x00001800, 0x00008000, + 0x00001700, 0x00001600, 0x00001500, 0x00008000, + 0x00001400, 0x00001300, 0x00001200, 0x00001100, + 0x00001000, 0x00000f00, 0x00008000, 0x00008000, + 0x00000e00, 0x00000d00, 0x00000c00, 0x00000b00, + 0x00000a00, 0x00000900, 0x00008000, 0x00008000, + 0x00000800, 0x00000700, 0x00008000, 0x00000600, + 0x00008000, 0x00008000, 0x00008000, 0x00000500, + 0x00000400, 0x00000300, 0x00008000, 0x00000200, + 0x00008000, 0x00008000, 0x00008000, 0x00000100, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00000000, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x00000000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00008000, 0x0201f800, 0x0010055a, - 0x02000800, 0x0010032d, 0x492f4017, 0x1c01f000, - 0x83a0ac00, 0x00000007, 0x83a00580, 0x0010b7fa, - 0x0400000c, 0x492fc857, 0x812e59c0, 0x02000800, - 0x0010032d, 0x832ca400, 0x00000007, 0x4200b000, - 0x0000000d, 0x0201f800, 0x0010adef, 0x0401f00f, - 0x4200b000, 0x00000010, 0x83e0a400, 0x00000020, - 0x50500000, 0x8050a000, 0x50500800, 0x900409c0, - 0x80040540, 0x4400a800, 0x8050a000, 0x8054a800, - 0x8058b040, 0x040207f7, 0x1c01f000, 0x59a00207, - 0x82000c80, 0x0000007f, 0x040210bf, 0x0c01f001, - 0x00101cba, 0x00101cf1, 0x00101cf1, 0x00101d40, - 0x00101d5c, 0x00101cf1, 0x00101cba, 0x00101d78, - 0x00101d89, 0x00101cf1, 0x00101cf1, 0x00101d96, - 0x00101dae, 0x00101dc6, 0x00101cf1, 0x00101ded, - 0x00101e17, 0x00101cf1, 0x00101e40, 0x00101cf1, - 0x00101f07, 0x00101cf1, 0x00101cf1, 0x00101cf1, - 0x00101cf1, 0x00101f32, 0x00101f95, 0x00101cf1, - 0x00101cf1, 0x00101cf1, 0x00101cf1, 0x00101cf1, - 0x00101fed, 0x00101cf1, 0x0010203f, 0x00101cf1, - 0x00101cf1, 0x00101cf1, 0x00101cf1, 0x00102044, - 0x001020d5, 0x00101cf1, 0x001020dd, 0x00101cf1, - 0x00101cf1, 0x00101cf1, 0x00101cf1, 0x00101cf1, - 0x001020df, 0x00102168, 0x00102343, 0x00101cf1, - 0x00101cf1, 0x00101cf1, 0x00101cf1, 0x00101cf1, - 0x00102352, 0x00101cf1, 0x0010236f, 0x00101cf1, - 0x00101cf1, 0x00101cf1, 0x00101cf1, 0x00101cf1, - 0x0010239a, 0x001023ed, 0x00102449, 0x00102460, - 0x0010d714, 0x0010dcf5, 0x001024ac, 0x00101cf1, - 0x00101cf1, 0x00101cf1, 0x00101cf1, 0x00101cf1, - 0x00101cf1, 0x00101cf1, 0x00101cf1, 0x00101cf1, - 0x00101cf1, 0x00101cf1, 0x00101cf1, 0x00102603, - 0x00102677, 0x00101cf1, 0x00101cf1, 0x001026e5, - 0x00101cf1, 0x00102784, 0x00102834, 0x00101cf1, - 0x00101cf1, 0x001028c6, 0x00102930, 0x00101cf1, - 0x00102988, 0x00102b0b, 0x00101cf1, 0x00102b1f, - 0x00102baa, 0x00101cf1, 0x00101cf1, 0x00101cf1, - 0x00101cf1, 0x00102c1a, 0x00102c2c, 0x00102c4b, - 0x00101cf1, 0x00102ced, 0x00101cf1, 0x00101cf1, - 0x00102d31, 0x00101cf1, 0x00102d60, 0x00101cf1, - 0x00101cf1, 0x00102dc7, 0x00102f20, 0x00102f7d, - 0x00101cf1, 0x00102fdf, 0x00101cf1, 0x00101cf1, - 0x00103034, 0x001030c6, 0x00101cf1, 0x48efc857, - 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, - 0x00000200, 0x0400003c, 0x48efc857, 0x4a034207, - 0x00004000, 0x0201f800, 0x001031ba, 0x83a00580, - 0x0010b7fa, 0x0400000e, 0x58ee5809, 0x4d2c0000, - 0x0401f84d, 0x41a25800, 0x0201f800, 0x00100580, - 0x40ee5800, 0x0201f800, 0x00100580, 0x5c025800, - 0x492fc857, 0x0201f000, 0x000203ab, 0x04026007, - 0x59a0001e, 0x84000542, 0x4803401e, 0x4a01d808, - 0x00101ccf, 0x1c01f000, 0x59a00207, 0x82000d80, - 0x00004000, 0x04000006, 0x900001c0, 0x82000540, - 0x00000011, 0x4803c011, 0x0401f005, 0x900001c0, - 0x82000540, 0x00000010, 0x4803c011, 0x0401f841, - 0x4a03c017, 0x00000000, 0x4203e000, 0x30000001, - 0x4203e000, 0x40000000, 0x40ee5800, 0x0201f800, - 0x00100580, 0x59a0001e, 0x84000504, 0x4803401e, - 0x1c01f000, 0x4803c856, 0x4a034207, 0x00004001, - 0x0401f7c9, 0x4803c856, 0x4a034207, 0x00004002, - 0x0401f7c5, 0x4803c856, 0x4a034207, 0x00004003, - 0x0401f7c1, 0x4803c856, 0x4a034207, 0x00004005, - 0x0401f7bd, 0x4803c856, 0x4a034207, 0x00004006, - 0x0401f7b9, 0x4803c856, 0x4a034207, 0x0000400b, - 0x0401f7b5, 0x4803c856, 0x4a034207, 0x0000400c, - 0x0401f7b1, 0x4803c856, 0x4a034207, 0x0000400c, - 0x0401f7ad, 0x4c580000, 0x4c500000, 0x4c540000, - 0x58eca809, 0x8054a9c0, 0x02000800, 0x0010032d, - 0x83a0a400, 0x00000007, 0x8254ac00, 0x00000007, - 0x4200b000, 0x0000000d, 0x0201f800, 0x0010adef, - 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x1c01f000, - 0x4c580000, 0x4c500000, 0x4c540000, 0x59a00007, - 0x4803c857, 0x59a00008, 0x4803c857, 0x59a00009, - 0x4803c857, 0x83e0ac00, 0x00000020, 0x83a0a400, - 0x00000007, 0x4200b000, 0x00000010, 0x50500000, - 0x4400a800, 0x8054a800, 0x900001c0, 0x4400a800, - 0x8054a800, 0x8050a000, 0x8058b040, 0x040207f8, - 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x1c01f000, - 0x59a00407, 0x800000c2, 0x59a00a08, 0x900409c0, - 0x80040540, 0x84000540, 0x59a00c08, 0x8c040d00, - 0x04000012, 0x59a8086d, 0x8c040d00, 0x040207b6, - 0x4c000000, 0x0201f800, 0x0010ae33, 0x5c000000, - 0x04000005, 0x48030004, 0x4a030000, 0x00000000, - 0x0401f766, 0x4a030000, 0x00000000, 0x4a034407, - 0x00000004, 0x040007a4, 0x4803880e, 0x0401f75f, - 0x59a00407, 0x800000c2, 0x59a00c08, 0x8c040d00, - 0x04000014, 0x59a8086d, 0x8c040d00, 0x0402079e, - 0x4c000000, 0x0201f800, 0x0010ae33, 0x5c000000, - 0x04000007, 0x48030004, 0x59800805, 0x48074407, - 0x4a030000, 0x00000000, 0x0401f74c, 0x4a030000, - 0x00000000, 0x4a034407, 0x00000004, 0x0400078a, - 0x4803880e, 0x59c4080f, 0x48074407, 0x0401f743, - 0x59a01c07, 0x59a00208, 0x900c19c0, 0x800c1d40, - 0x580c0803, 0x80000580, 0x500c1000, 0x80080400, - 0x800c1800, 0x80040840, 0x040207fc, 0x48034407, - 0x900001c0, 0x48034208, 0x800001c0, 0x04000733, - 0x0401f771, 0x4a034407, 0x00000005, 0x4a034208, - 0x00000004, 0x4a034408, 0x00000000, 0x59a8000a, - 0x48034209, 0x900001c0, 0x48034409, 0x4a03420a, - 0x00000482, 0x0401f725, 0x59a00408, 0x59a01208, - 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, - 0x900c19c0, 0x800c1d40, 0x59a00a09, 0x59a00409, - 0x900409c0, 0x80040d40, 0x59a0020b, 0x82002480, - 0x00000010, 0x0400175c, 0x59a02407, 0x900001c0, - 0x80100540, 0x59a8280a, 0x80142480, 0x04001756, - 0x0201f000, 0x001031c9, 0x59a00408, 0x59a01208, - 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, - 0x900c19c0, 0x800c1d40, 0x59a00a09, 0x59a00409, - 0x900409c0, 0x80040d40, 0x59a0020b, 0x82002480, - 0x00000010, 0x04001744, 0x59a02407, 0x900001c0, - 0x80100540, 0x59a8280a, 0x80142480, 0x0400173e, - 0x0201f000, 0x001031d2, 0x59a02408, 0x59a00208, - 0x901021c0, 0x80102540, 0x59a01a0b, 0x59a00407, - 0x900c19c0, 0x800c1d40, 0x41781000, 0x42000000, - 0x00001000, 0x50000000, 0x82000480, 0x24320001, - 0x0400100e, 0x820c0580, 0x00007c00, 0x0400000b, - 0x820c0480, 0x00007a00, 0x04001008, 0x820c0480, - 0x00007cff, 0x04021005, 0x0201f800, 0x0010ae33, - 0x04000008, 0x80081000, 0x44101800, 0x800811c0, - 0x040006d6, 0x4a030000, 0x00000000, 0x0401f6d3, + 0x00008000, 0x00008000, 0x00008000, 0x0201f800, + 0x0010055a, 0x02000800, 0x0010032d, 0x492f4017, + 0x1c01f000, 0x83a0ac00, 0x00000007, 0x83a00580, + 0x0010b8fa, 0x0400000c, 0x492fc857, 0x812e59c0, + 0x02000800, 0x0010032d, 0x832ca400, 0x00000007, + 0x4200b000, 0x0000000d, 0x0201f800, 0x0010aee2, + 0x0401f00f, 0x4200b000, 0x00000010, 0x83e0a400, + 0x00000020, 0x50500000, 0x8050a000, 0x50500800, + 0x900409c0, 0x80040540, 0x4400a800, 0x8050a000, + 0x8054a800, 0x8058b040, 0x040207f7, 0x1c01f000, + 0x59a00207, 0x82000c80, 0x0000007f, 0x040210bf, + 0x0c01f001, 0x00101cbf, 0x00101cf6, 0x00101cf6, + 0x00101d45, 0x00101d61, 0x00101cf6, 0x00101cbf, + 0x00101d7d, 0x00101d8e, 0x00101cf6, 0x00101cf6, + 0x00101da0, 0x00101db8, 0x00101dd0, 0x00101cf6, + 0x00101df7, 0x00101e21, 0x00101cf6, 0x00101e4a, + 0x00101cf6, 0x00101f11, 0x00101cf6, 0x00101cf6, + 0x00101cf6, 0x00101cf6, 0x00101f3c, 0x00101f9f, + 0x00101cf6, 0x00101cf6, 0x00101cf6, 0x00101cf6, + 0x00101cf6, 0x00101ff7, 0x00101cf6, 0x00102049, + 0x00101cf6, 0x00101cf6, 0x00101cf6, 0x00101cf6, + 0x0010204e, 0x001020df, 0x00101cf6, 0x001020e7, + 0x00101cf6, 0x00101cf6, 0x00101cf6, 0x00101cf6, + 0x00101cf6, 0x001020e9, 0x00102172, 0x0010234d, + 0x00101cf6, 0x00101cf6, 0x00101cf6, 0x00101cf6, + 0x00101cf6, 0x0010235c, 0x00101cf6, 0x00102379, + 0x00101cf6, 0x00101cf6, 0x00101cf6, 0x00101cf6, + 0x00101cf6, 0x001023a4, 0x001023f7, 0x00102453, + 0x0010246a, 0x0010d814, 0x0010ddf5, 0x001024b6, + 0x00101cf6, 0x00101cf6, 0x00101cf6, 0x00101cf6, + 0x00101cf6, 0x00101cf6, 0x00101cf6, 0x00101cf6, + 0x00101cf6, 0x00101cf6, 0x00101cf6, 0x00101cf6, + 0x0010260d, 0x00102681, 0x00101cf6, 0x00101cf6, + 0x001026ef, 0x00101cf6, 0x0010278e, 0x0010283e, + 0x00101cf6, 0x00101cf6, 0x001028d0, 0x0010293a, + 0x00101cf6, 0x00102992, 0x00102b15, 0x00101cf6, + 0x00102b29, 0x00102bb4, 0x00101cf6, 0x00101cf6, + 0x00101cf6, 0x00101cf6, 0x00102c24, 0x00102c36, + 0x00102c55, 0x00101cf6, 0x00102cf7, 0x00101cf6, + 0x00101cf6, 0x00102d3b, 0x00101cf6, 0x00102d6a, + 0x00101cf6, 0x00101cf6, 0x00102dd1, 0x00102f2a, + 0x00102f87, 0x00101cf6, 0x00102fe9, 0x00101cf6, + 0x00101cf6, 0x0010303e, 0x001030d0, 0x00101cf6, + 0x48efc857, 0x4031d800, 0x58ef400a, 0x58ec0002, + 0x82000580, 0x00000200, 0x0400003c, 0x48efc857, + 0x4a034207, 0x00004000, 0x0201f800, 0x001031c4, + 0x83a00580, 0x0010b8fa, 0x0400000e, 0x58ee5809, + 0x4d2c0000, 0x0401f84d, 0x41a25800, 0x0201f800, + 0x00100580, 0x40ee5800, 0x0201f800, 0x00100580, + 0x5c025800, 0x492fc857, 0x0201f000, 0x000203ab, + 0x04026007, 0x59a0001e, 0x84000542, 0x4803401e, + 0x4a01d808, 0x00101cd4, 0x1c01f000, 0x59a00207, + 0x82000d80, 0x00004000, 0x04000006, 0x900001c0, + 0x82000540, 0x00000011, 0x4803c011, 0x0401f005, + 0x900001c0, 0x82000540, 0x00000010, 0x4803c011, + 0x0401f841, 0x4a03c017, 0x00000000, 0x4203e000, + 0x30000001, 0x4203e000, 0x40000000, 0x40ee5800, + 0x0201f800, 0x00100580, 0x59a0001e, 0x84000504, + 0x4803401e, 0x1c01f000, 0x4803c856, 0x4a034207, + 0x00004001, 0x0401f7c9, 0x4803c856, 0x4a034207, + 0x00004002, 0x0401f7c5, 0x4803c856, 0x4a034207, + 0x00004003, 0x0401f7c1, 0x4803c856, 0x4a034207, + 0x00004005, 0x0401f7bd, 0x4803c856, 0x4a034207, + 0x00004006, 0x0401f7b9, 0x4803c856, 0x4a034207, + 0x0000400b, 0x0401f7b5, 0x4803c856, 0x4a034207, + 0x0000400c, 0x0401f7b1, 0x4803c856, 0x4a034207, + 0x0000400c, 0x0401f7ad, 0x4c580000, 0x4c500000, + 0x4c540000, 0x58eca809, 0x8054a9c0, 0x02000800, + 0x0010032d, 0x83a0a400, 0x00000007, 0x8254ac00, + 0x00000007, 0x4200b000, 0x0000000d, 0x0201f800, + 0x0010aee2, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x1c01f000, 0x4c580000, 0x4c500000, 0x4c540000, + 0x59a00007, 0x4803c857, 0x59a00008, 0x4803c857, + 0x59a00009, 0x4803c857, 0x83e0ac00, 0x00000020, + 0x83a0a400, 0x00000007, 0x4200b000, 0x00000010, + 0x50500000, 0x4400a800, 0x8054a800, 0x900001c0, + 0x4400a800, 0x8054a800, 0x8050a000, 0x8058b040, + 0x040207f8, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x1c01f000, 0x59a00407, 0x800000c2, 0x59a00a08, + 0x900409c0, 0x80040540, 0x84000540, 0x59a00c08, + 0x8c040d00, 0x04000012, 0x59a8086d, 0x8c040d00, + 0x040207b6, 0x4c000000, 0x0201f800, 0x0010af26, + 0x5c000000, 0x04000005, 0x48030004, 0x4a030000, + 0x00000000, 0x0401f766, 0x4a030000, 0x00000000, + 0x4a034407, 0x00000004, 0x040007a4, 0x4803880e, + 0x0401f75f, 0x59a00407, 0x800000c2, 0x59a00c08, + 0x8c040d00, 0x04000014, 0x59a8086d, 0x8c040d00, + 0x0402079e, 0x4c000000, 0x0201f800, 0x0010af26, + 0x5c000000, 0x04000007, 0x48030004, 0x59800805, + 0x48074407, 0x4a030000, 0x00000000, 0x0401f74c, 0x4a030000, 0x00000000, 0x4a034407, 0x00000004, - 0x0401f711, 0x59a01a0b, 0x59a00407, 0x900c19c0, - 0x800c1d40, 0x41781000, 0x42000000, 0x00001000, - 0x50000000, 0x82000480, 0x24320001, 0x0400100e, - 0x820c0580, 0x00007c00, 0x0400000b, 0x820c0480, - 0x00007a00, 0x04001008, 0x820c0480, 0x00007cff, - 0x04021005, 0x0201f800, 0x0010ae33, 0x0400000f, - 0x80081000, 0x500c0000, 0x82000d00, 0x0000ffff, - 0x48074208, 0x82000d00, 0xffff0000, 0x900409c0, - 0x48074408, 0x800811c0, 0x040006ac, 0x4a030000, - 0x00000000, 0x0401f6a9, 0x4a030000, 0x00000000, - 0x4a034407, 0x00000004, 0x0401f6e7, 0x59a00407, - 0x8c000500, 0x04000020, 0x59a01208, 0x59a01c08, - 0x59a02209, 0x480b5044, 0x480f5045, 0x48135046, - 0x59c40801, 0x82040d00, 0x00018000, 0x82040580, - 0x00000000, 0x04000009, 0x82040580, 0x00008000, - 0x04000008, 0x82040580, 0x00010000, 0x04000007, - 0x0201f800, 0x0010032d, 0x40080000, 0x0401f004, - 0x400c0000, 0x0401f002, 0x40100000, 0x80000110, - 0x42000800, 0x000000e0, 0x0201f800, 0x0010173f, - 0x0401f007, 0x59a81044, 0x59a81845, 0x59a82046, - 0x480b4208, 0x480f4408, 0x48134209, 0x0401f67b, - 0x4d2c0000, 0x4d340000, 0x4d300000, 0x4d440000, - 0x59a28c07, 0x0201f800, 0x00020319, 0x04000006, - 0x5c028800, 0x5c026000, 0x5c026800, 0x5c025800, - 0x0401f6b5, 0x4937c857, 0x59a04408, 0x59a00208, - 0x900001c0, 0x80204540, 0x4823c857, 0x0401f88a, - 0x04000009, 0x4a034209, 0x00000001, 0x4a034407, - 0x0000ffff, 0x4a034208, 0x0000ffff, 0x497b4408, - 0x0401f04b, 0x497b4407, 0x0401f88b, 0x0400004d, - 0x59300402, 0x48034407, 0x59300202, 0x48034208, - 0x59300006, 0x48034408, 0x59a0020c, 0x8c000500, - 0x0400003d, 0x4933c857, 0x0201f800, 0x00104178, - 0x04000004, 0x4a034407, 0x00000009, 0x0401f03d, - 0x8d0e1d0e, 0x04000004, 0x4a034407, 0x00000001, - 0x0401f038, 0x836c0580, 0x00000003, 0x04000004, - 0x4a034407, 0x00000007, 0x0401f032, 0x59340200, - 0x8c00050e, 0x04000004, 0x4a034407, 0x00000020, - 0x0401f02c, 0x59300407, 0x82000d80, 0x00000003, - 0x04020009, 0x59300804, 0x82040500, 0x0000001f, - 0x82000580, 0x00000004, 0x04020003, 0x8c040d3e, - 0x04020019, 0x0201f800, 0x001031a5, 0x04020004, - 0x4a034407, 0x00000002, 0x0401f01a, 0x492fc857, - 0x4a025c05, 0x00008000, 0x497a5a05, 0x497a5806, - 0x0201f800, 0x00109209, 0x04020004, 0x4a034407, - 0x00000003, 0x0401f00f, 0x4a01d808, 0x00101eb1, - 0x5c028800, 0x5c026000, 0x5c026800, 0x5c025800, - 0x1c01f000, 0x4a034209, 0x00000002, 0x5c028800, - 0x5c026000, 0x5c026800, 0x5c025800, 0x0401f60f, - 0x5c028800, 0x5c026000, 0x5c026800, 0x5c025800, - 0x0401f64d, 0x492fc857, 0x4933c857, 0x497a601f, - 0x592c0006, 0x82000580, 0x01000000, 0x04020004, - 0x4a034407, 0x00000004, 0x0401f643, 0x4d2c0000, - 0x832e5c00, 0x00000007, 0x592c0000, 0x82000580, - 0x02000000, 0x04020012, 0x4803c856, 0x4a034209, - 0x00000004, 0x592c0804, 0x82040500, 0x0000ffff, - 0x48034409, 0x80040920, 0x4807420a, 0x592c0805, - 0x82040500, 0x0000ffff, 0x4803440a, 0x80040920, - 0x4807420b, 0x5c025800, 0x0401f5e8, 0x4803c856, - 0x4a034209, 0x00000005, 0x592c0801, 0x82040500, - 0x0000ffff, 0x48034409, 0x80040920, 0x4807420a, - 0x0401f7f5, 0x4937c857, 0x4823c857, 0x5934000f, - 0x80001d40, 0x04000005, 0x580c0006, 0x80200580, - 0x04020003, 0x81780000, 0x1c01f000, 0x580c0000, - 0x0401f7f8, 0x4823c857, 0x4d2c0000, 0x42026000, - 0x0010f584, 0x59300407, 0x82000d80, 0x00000003, - 0x04000004, 0x82000d80, 0x00000006, 0x04020007, - 0x59325809, 0x812e59c0, 0x04000004, 0x592c0006, - 0x80200580, 0x0400000a, 0x83326400, 0x00000024, - 0x59a8000b, 0x81300480, 0x040017ef, 0x417a6000, - 0x80000580, 0x5c025800, 0x1c01f000, 0x82000540, - 0x00000001, 0x5c025800, 0x1c01f000, 0x83a00580, - 0x0010b7fa, 0x040205e8, 0x59a8006d, 0x8c000500, - 0x04020003, 0x4a030000, 0x00000000, 0x4a034207, - 0x00004000, 0x4a03c011, 0x40000010, 0x0401fe11, - 0x4a03c017, 0x00000000, 0x59e00002, 0x8c00051e, - 0x04020008, 0x42000000, 0x00001000, 0x50000000, - 0x82000480, 0x24320002, 0x02000000, 0x00020238, - 0x59a80073, 0x8c00053e, 0x0400000b, 0x42000800, - 0x000000a0, 0x0201f800, 0x00101737, 0x82040540, - 0x00000001, 0x42000800, 0x000000a0, 0x0201f800, - 0x0010173f, 0x4203e000, 0x30000001, 0x4203e000, - 0x40000000, 0x0401f000, 0x59a00c07, 0x800409c0, - 0x04000007, 0x836c0580, 0x00000000, 0x04000004, - 0x4a034407, 0x0000001a, 0x0401f5c3, 0x42007000, - 0x0010b895, 0x58381c01, 0x58382201, 0x58383202, - 0x8c040d00, 0x0400000b, 0x59a01208, 0x82080500, - 0x0000f003, 0x040205bc, 0x82080480, 0x00000841, - 0x040215b9, 0x82080480, 0x00000100, 0x040015b6, - 0x40040000, 0x800c0540, 0x82000500, 0x00000028, - 0x82000580, 0x00000028, 0x040005af, 0x8c040d0a, - 0x04000008, 0x59a03c08, 0x821c0480, 0x00000006, - 0x040215a9, 0x821c0480, 0x00000001, 0x040015a6, - 0x8c040d06, 0x04000003, 0x4a0378e4, 0x000c0000, - 0x8c040d04, 0x04000004, 0x59e00002, 0x84000548, - 0x4803c002, 0x8c040d02, 0x04000005, 0x42002800, - 0x00007600, 0x4a002805, 0xd0000000, 0x40040000, - 0x800c0540, 0x48007401, 0x8c040d00, 0x04000002, - 0x48087201, 0x8c040d0a, 0x0400001f, 0x481c7202, - 0x4c0c0000, 0x4c100000, 0x4c180000, 0x0201f800, - 0x0010610d, 0x4df00000, 0x58383a02, 0x481fc857, - 0x41780000, 0x801c3840, 0x800010c8, 0x82081400, - 0x0000bf32, 0x4a001001, 0x00000000, 0x801c1c80, - 0x04021003, 0x4a001001, 0x00000002, 0x80000000, - 0x82001c80, 0x00000005, 0x040017f4, 0x5c03e000, - 0x02000800, 0x001060fa, 0x5c003000, 0x5c002000, - 0x5c001800, 0x480f4407, 0x48134208, 0x481b4408, - 0x0401f526, 0x4d440000, 0x4d340000, 0x59a28c07, - 0x0201f800, 0x00020319, 0x04020009, 0x0201f800, - 0x00104178, 0x04000009, 0x4a034407, 0x00000009, - 0x5c026800, 0x5c028800, 0x0401f55b, 0x5c026800, - 0x5c028800, 0x0401f55c, 0x59a01208, 0x59a01c08, - 0x5934400a, 0x82203d00, 0x0000e000, 0x801c391a, - 0x8c081500, 0x04000024, 0x820c0d00, 0x00000007, - 0x82040580, 0x00000000, 0x04000010, 0x82040580, - 0x00000001, 0x0400000d, 0x82040580, 0x00000003, - 0x0400000a, 0x82040580, 0x00000004, 0x04000007, - 0x82040580, 0x00000013, 0x04000004, 0x4937c857, - 0x42000800, 0x00000003, 0x82204500, 0xffff1fff, - 0x800400da, 0x80200540, 0x4802680a, 0x4c080000, - 0x4c1c0000, 0x0201f800, 0x0010610d, 0x0201f800, - 0x0010444c, 0x0201f800, 0x001060fa, 0x5c003800, - 0x5c001000, 0x481f4408, 0x5934400a, 0x82203d00, - 0x0f000000, 0x801c3930, 0x8c081504, 0x04020012, - 0x8c081502, 0x0400000c, 0x4823c857, 0x82204500, - 0xf0ffffff, 0x59a01a09, 0x820c0d00, 0x0000000f, - 0x800400f0, 0x8400056e, 0x80200540, 0x4802680a, - 0x4803c857, 0x481f4209, 0x5c026800, 0x5c028800, - 0x0401f4d2, 0x82204500, 0xf07fffff, 0x4822680a, - 0x0401f7f9, 0x8d0e1d0e, 0x04000004, 0x4a034407, - 0x00000001, 0x0401f50c, 0x836c0580, 0x00000003, - 0x04020010, 0x59a8000f, 0x497b4407, 0x0201f800, - 0x00104716, 0x0400000f, 0x82000d00, 0x00ffff00, - 0x0402000c, 0x82000c00, 0x00101b0a, 0x50040800, - 0x80040910, 0x82041580, 0x00000080, 0x04020004, - 0x4a034407, 0x00000007, 0x0401f4f7, 0x48074407, - 0x82000d00, 0x0000ffff, 0x48074208, 0x80000120, - 0x48034408, 0x59a8021b, 0x82001500, 0x00002100, - 0x480b440a, 0x8c000502, 0x0400001f, 0x8c000506, - 0x04000009, 0x82000d00, 0x0000000a, 0x82040d80, - 0x0000000a, 0x04020004, 0x4a03420a, 0x00000001, - 0x0401f022, 0x8c00050a, 0x04000009, 0x82000d00, - 0x00000022, 0x82040d80, 0x00000022, 0x04020004, - 0x4a03420a, 0x00000003, 0x0401f018, 0x8c000508, - 0x04000009, 0x82000d00, 0x00000012, 0x82040d80, - 0x00000012, 0x04020004, 0x4a03420a, 0x00000002, - 0x0401f00e, 0x0201f800, 0x00104716, 0x04020004, - 0x4a03420a, 0x00000004, 0x0401f484, 0x8c000506, - 0x04000004, 0x4a034407, 0x00000005, 0x0401f4c2, - 0x4a03420a, 0x00000000, 0x0401f47c, 0x59a8002a, - 0x48034408, 0x59a8002b, 0x4803420a, 0x0401f477, - 0x42007800, 0x0010bcb1, 0x59a00407, 0x4803c857, - 0x82000c80, 0x0000000a, 0x040214b7, 0x0c01f001, - 0x001020c7, 0x0010205f, 0x0010206d, 0x00102080, - 0x001020a1, 0x001020c9, 0x00102057, 0x00102057, - 0x00102057, 0x00102057, 0x00102058, 0x0401f4aa, - 0x59a00208, 0x48007c01, 0x59a00408, 0x48007a01, - 0x0201f800, 0x001003e9, 0x0401f069, 0x836c0580, - 0x00000000, 0x0400049c, 0x59a00a08, 0x59a00408, - 0x900001c0, 0x80040d40, 0x4807c857, 0x59a00a09, - 0x59a00409, 0x900001c0, 0x80040d40, 0x4807c857, - 0x0401f05b, 0x836c0580, 0x00000000, 0x0400048e, - 0x59a00408, 0x59a01208, 0x900001c0, 0x80081540, - 0x59a00409, 0x59a01a09, 0x900001c0, 0x800c1d40, - 0x42000000, 0x0010c542, 0x480fc857, 0x480bc857, - 0x42000800, 0x00001000, 0x0201f000, 0x001031d2, - 0x59a00a08, 0x59a00408, 0x900001c0, 0x80041d40, - 0x820c0c80, 0x0010aebb, 0x0402147b, 0x820c0c80, - 0x00100000, 0x04001478, 0x480fc857, 0x823c7c00, - 0x0000000d, 0x503c0800, 0x800409c0, 0x04000006, - 0x823c0580, 0x00000011, 0x0400046f, 0x803c7800, - 0x0401f7f9, 0x59e41001, 0x82080d00, 0xfffeffcf, - 0x4807c801, 0x440c7800, 0x46001800, 0x0201f800, - 0x800c1800, 0x46001800, 0x0010031d, 0x480bc801, - 0x0401f027, 0x59a01a08, 0x59a00408, 0x900001c0, - 0x800c1d40, 0x480c7803, 0x59a02209, 0x59a00409, - 0x900001c0, 0x80102540, 0x48107804, 0x59a0020a, - 0x40001000, 0x48007807, 0x80000040, 0x04001452, - 0x48007808, 0x42000800, 0x00004000, 0x0201f800, - 0x00105f4a, 0x80000540, 0x04000002, 0x0401f44a, - 0x40040000, 0x800c1c00, 0x04001447, 0x4800780a, - 0x480c7805, 0x48107806, 0x4978780c, 0x59a0040a, - 0x800000c4, 0x4800780b, 0x59e40001, 0x4803c857, - 0x82000540, 0x00040000, 0x4803c801, 0x0201f000, - 0x00101cba, 0x49787803, 0x49787804, 0x49787808, - 0x49787807, 0x49787803, 0x49787805, 0x49787806, - 0x4978780c, 0x4978780b, 0x59e40001, 0x84000524, - 0x0401f7f2, 0x59a80005, 0x48034407, 0x59a80006, - 0x48034208, 0x59a80007, 0x48034408, 0x0201f000, - 0x00101cba, 0x0201f800, 0x0010032d, 0x4803c856, - 0x4a03c013, 0x03800300, 0x4a03c014, 0x03800380, - 0x59a00c07, 0x82040580, 0x000000a0, 0x04000004, - 0x82040580, 0x000000a2, 0x04020021, 0x59a0140b, - 0x82080480, 0x00000100, 0x0402101d, 0x59a0020c, - 0x8c000500, 0x04020026, 0x59a00a0b, 0x800409c0, - 0x04000017, 0x82040480, 0x00000041, 0x04021014, - 0x0201f800, 0x001031a5, 0x0400000b, 0x59a01008, - 0x900811c0, 0x59a0180a, 0x900c19c0, 0x59a00a0b, - 0x0201f800, 0x001031cc, 0x4a01d808, 0x0010210f, - 0x1c01f000, 0x4a034407, 0x00000002, 0x4a03c014, - 0x03800000, 0x0201f000, 0x00101cfd, 0x4a03c014, - 0x03800000, 0x0201f000, 0x00101d01, 0x4031d800, - 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x00101cf5, 0x59a00c07, - 0x59a0140b, 0x59a0020c, 0x8c000500, 0x04020039, - 0x832e5c00, 0x00000005, 0x4178c000, 0x59a0ba0b, - 0x40600000, 0x812c0400, 0x5000c800, 0x82641d00, - 0x000000ff, 0x4c040000, 0x4c080000, 0x0401f8c9, - 0x5c001000, 0x5c000800, 0x04000038, 0x805cb840, - 0x04000032, 0x80081000, 0x82641d00, 0x0000ff00, - 0x800c1910, 0x4c040000, 0x4c080000, 0x0401f8bd, - 0x5c001000, 0x5c000800, 0x0400002c, 0x805cb840, - 0x04000026, 0x80081000, 0x82641d00, 0x00ff0000, - 0x800c1920, 0x4c040000, 0x4c080000, 0x0401f8b1, - 0x5c001000, 0x5c000800, 0x04000020, 0x805cb840, - 0x0400001a, 0x80081000, 0x82641d00, 0xff000000, - 0x800c1930, 0x4c040000, 0x4c080000, 0x0401f8a5, - 0x5c001000, 0x5c000800, 0x04000014, 0x805cb840, - 0x0400000e, 0x80081000, 0x8060c000, 0x0401f7cd, - 0x59a0020b, 0x82000500, 0x000000ff, 0x40001800, - 0x4c040000, 0x4c080000, 0x0401f896, 0x5c001000, - 0x5c000800, 0x04000005, 0x4a03c014, 0x03800000, - 0x0201f000, 0x00101cba, 0x4a03c014, 0x03800000, - 0x4a034407, 0x00000004, 0x0201f000, 0x00101cfd, - 0x4803c856, 0x59a80873, 0x8c040d3e, 0x04020005, - 0x4a03c013, 0x03800300, 0x4a03c014, 0x03800380, - 0x59a00c07, 0x82040580, 0x000000a0, 0x04000004, - 0x82040580, 0x000000a2, 0x04020076, 0x59a0140b, - 0x82080480, 0x00000100, 0x04021072, 0x59a0020c, - 0x8c000500, 0x0402005d, 0x59a01a0b, 0x800c19c0, - 0x0400006c, 0x820c0480, 0x00000041, 0x04021069, - 0x0201f800, 0x001031a5, 0x0402000b, 0x4a034407, - 0x00000002, 0x59a80873, 0x8c040d3e, 0x04020003, - 0x4a03c014, 0x03800000, 0x4803c857, 0x0201f000, - 0x00101cfd, 0x59a80073, 0x8c00053e, 0x02020000, - 0x0010a6f8, 0x832e5c00, 0x00000005, 0x4178c000, - 0x59a0ba0b, 0x4803c857, 0x40600000, 0x812c0400, - 0x4000c800, 0x4c040000, 0x4c080000, 0x0401f887, - 0x5c001000, 0x5c000800, 0x04000044, 0x4414c800, - 0x805cb840, 0x0400002b, 0x80081000, 0x4c040000, - 0x4c080000, 0x0401f87d, 0x5c001000, 0x5c000800, - 0x0400003a, 0x50640000, 0x801428d0, 0x80140540, - 0x4400c800, 0x805cb840, 0x0400001e, 0x80081000, - 0x4c040000, 0x4c080000, 0x0401f870, 0x5c001000, - 0x5c000800, 0x0400002d, 0x50640000, 0x801428e0, - 0x80140540, 0x4400c800, 0x805cb840, 0x04000011, - 0x80081000, 0x4c040000, 0x4c080000, 0x0401f863, - 0x5c001000, 0x5c000800, 0x04000020, 0x50640000, - 0x801428f0, 0x80140540, 0x4400c800, 0x805cb840, - 0x04000004, 0x80081000, 0x8060c000, 0x0401f7ca, - 0x59a00a0b, 0x59a01008, 0x900811c0, 0x59a0180a, - 0x900c19c0, 0x4a03c014, 0x03800000, 0x412c0000, - 0x0201f000, 0x001031cf, 0x4803c857, 0x59a80073, - 0x8c00053e, 0x02020000, 0x00101d01, 0x0401f847, - 0x04000006, 0x48174407, 0x4a03c014, 0x03800000, - 0x0201f000, 0x00101cba, 0x4a03c014, 0x03800000, - 0x4a034407, 0x00000004, 0x0201f000, 0x00101cfd, - 0x4a03c014, 0x03800000, 0x0201f000, 0x00101d01, - 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4004b800, - 0x4008c000, 0x400cc800, 0x0401f87a, 0x04000012, - 0x0401f8b2, 0x04020014, 0x4060b800, 0x0401f8af, - 0x04020011, 0x4064b800, 0x0401f8ac, 0x0402000e, - 0x0401f896, 0x4ce80000, 0x4201d000, 0x00001388, - 0x0201f800, 0x0010592d, 0x5c01d000, 0x82000540, - 0x00000001, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x1c01f000, 0x0401f889, 0x80000580, 0x0401f7fa, - 0x4c5c0000, 0x485fc857, 0x0401f85e, 0x0400000a, - 0x825cbd40, 0x00000001, 0x0401f894, 0x0402000a, - 0x0401f8dc, 0x0401f916, 0x0401f87c, 0x82000540, - 0x00000001, 0x4803c857, 0x4867c857, 0x5c00b800, - 0x1c01f000, 0x0401f875, 0x80000580, 0x4803c857, - 0x485fc857, 0x0401f7f8, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x4807c857, 0x480bc857, 0x4004b800, - 0x4008c000, 0x0401f843, 0x0400000d, 0x0401f87b, - 0x04020010, 0x4c5c0000, 0x4060b800, 0x0401f877, - 0x5c00b800, 0x0402000b, 0x0401ffda, 0x04000004, - 0x0401f85e, 0x82000540, 0x00000001, 0x40642800, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x0401f856, 0x80000580, 0x4803c857, 0x4867c857, - 0x0401f7f7, 0x4ce80000, 0x4c580000, 0x4803c856, - 0x4200b000, 0x0000000c, 0x4201d000, 0x0000000a, - 0x0201f800, 0x0010592d, 0x4a03c013, 0x02000200, - 0x4201d000, 0x0000000a, 0x0201f800, 0x0010592d, - 0x4a03c013, 0x02000000, 0x8058b040, 0x040207f3, - 0x42000800, 0x000003e8, 0x4a03c013, 0x03800300, - 0x80040840, 0x04000010, 0x4a03c014, 0x03800000, - 0x59e00013, 0x4a03c014, 0x03800380, 0x82000500, - 0x00000300, 0x82000580, 0x00000300, 0x040207f3, - 0x82000540, 0x00000001, 0x5c00b000, 0x5c01d000, - 0x1c01f000, 0x4803c857, 0x80000580, 0x0401f7fb, - 0x4ce80000, 0x4803c856, 0x42000800, 0x000003e8, - 0x4a03c013, 0x03800300, 0x80040840, 0x0400001b, + 0x0400078a, 0x4803880e, 0x59c4080f, 0x48074407, + 0x0401f743, 0x59a01c07, 0x59a00208, 0x900c19c0, + 0x800c1d40, 0x580c0803, 0x80000580, 0x500c1000, + 0x80080400, 0x800c1800, 0x80040840, 0x040207fc, + 0x48034407, 0x900001c0, 0x48034208, 0x800001c0, + 0x04000733, 0x0401f771, 0x4a034407, 0x00000005, + 0x4a034208, 0x00000005, 0x4a034408, 0x00000000, + 0x59a8000a, 0x48034209, 0x900001c0, 0x48034409, + 0x42000000, 0x00008482, 0x4803420a, 0x900001c0, + 0x4803440e, 0x4a03400f, 0x00000000, 0x0401f720, + 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, + 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, + 0x59a00a09, 0x59a00409, 0x900409c0, 0x80040d40, + 0x59a0020b, 0x82002480, 0x00000010, 0x04001757, + 0x59a02407, 0x900001c0, 0x80100540, 0x59a8280a, + 0x80142480, 0x04001751, 0x0201f000, 0x001031d3, + 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, + 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, + 0x59a00a09, 0x59a00409, 0x900409c0, 0x80040d40, + 0x59a0020b, 0x82002480, 0x00000010, 0x0400173f, + 0x59a02407, 0x900001c0, 0x80100540, 0x59a8280a, + 0x80142480, 0x04001739, 0x0201f000, 0x001031dc, + 0x59a02408, 0x59a00208, 0x901021c0, 0x80102540, + 0x59a01a0b, 0x59a00407, 0x900c19c0, 0x800c1d40, + 0x41781000, 0x42000000, 0x00001000, 0x50000000, + 0x82000480, 0x24320001, 0x0400100e, 0x820c0580, + 0x00007c00, 0x0400000b, 0x820c0480, 0x00007a00, + 0x04001008, 0x820c0480, 0x00007cff, 0x04021005, + 0x0201f800, 0x0010af26, 0x04000008, 0x80081000, + 0x44101800, 0x800811c0, 0x040006d1, 0x4a030000, + 0x00000000, 0x0401f6ce, 0x4a030000, 0x00000000, + 0x4a034407, 0x00000004, 0x0401f70c, 0x59a01a0b, + 0x59a00407, 0x900c19c0, 0x800c1d40, 0x41781000, + 0x42000000, 0x00001000, 0x50000000, 0x82000480, + 0x24320001, 0x0400100e, 0x820c0580, 0x00007c00, + 0x0400000b, 0x820c0480, 0x00007a00, 0x04001008, + 0x820c0480, 0x00007cff, 0x04021005, 0x0201f800, + 0x0010af26, 0x0400000f, 0x80081000, 0x500c0000, + 0x82000d00, 0x0000ffff, 0x48074208, 0x82000d00, + 0xffff0000, 0x900409c0, 0x48074408, 0x800811c0, + 0x040006a7, 0x4a030000, 0x00000000, 0x0401f6a4, + 0x4a030000, 0x00000000, 0x4a034407, 0x00000004, + 0x0401f6e2, 0x59a00407, 0x8c000500, 0x04000020, + 0x59a01208, 0x59a01c08, 0x59a02209, 0x480b5044, + 0x480f5045, 0x48135046, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04000009, + 0x82040580, 0x00008000, 0x04000008, 0x82040580, + 0x00010000, 0x04000007, 0x0201f800, 0x0010032d, + 0x40080000, 0x0401f004, 0x400c0000, 0x0401f002, + 0x40100000, 0x80000110, 0x42000800, 0x000000e0, + 0x0201f800, 0x00101740, 0x0401f007, 0x59a81044, + 0x59a81845, 0x59a82046, 0x480b4208, 0x480f4408, + 0x48134209, 0x0401f676, 0x4d2c0000, 0x4d340000, + 0x4d300000, 0x4d440000, 0x59a28c07, 0x0201f800, + 0x00020319, 0x04000006, 0x5c028800, 0x5c026000, + 0x5c026800, 0x5c025800, 0x0401f6b0, 0x4937c857, + 0x59a04408, 0x59a00208, 0x900001c0, 0x80204540, + 0x4823c857, 0x0401f88a, 0x04000009, 0x4a034209, + 0x00000001, 0x4a034407, 0x0000ffff, 0x4a034208, + 0x0000ffff, 0x497b4408, 0x0401f04b, 0x497b4407, + 0x0401f88b, 0x0400004d, 0x59300402, 0x48034407, + 0x59300202, 0x48034208, 0x59300006, 0x48034408, + 0x59a0020c, 0x8c000500, 0x0400003d, 0x4933c857, + 0x0201f800, 0x00104194, 0x04000004, 0x4a034407, + 0x00000009, 0x0401f03d, 0x8d0e1d0e, 0x04000004, + 0x4a034407, 0x00000001, 0x0401f038, 0x836c0580, + 0x00000003, 0x04000004, 0x4a034407, 0x00000007, + 0x0401f032, 0x59340200, 0x8c00050e, 0x04000004, + 0x4a034407, 0x00000020, 0x0401f02c, 0x59300407, + 0x82000d80, 0x00000003, 0x04020009, 0x59300804, + 0x82040500, 0x0000001f, 0x82000580, 0x00000004, + 0x04020003, 0x8c040d3e, 0x04020019, 0x0201f800, + 0x001031af, 0x04020004, 0x4a034407, 0x00000002, + 0x0401f01a, 0x492fc857, 0x4a025c05, 0x00008000, + 0x497a5a05, 0x497a5806, 0x0201f800, 0x001092c1, + 0x04020004, 0x4a034407, 0x00000003, 0x0401f00f, + 0x4a01d808, 0x00101ebb, 0x5c028800, 0x5c026000, + 0x5c026800, 0x5c025800, 0x1c01f000, 0x4a034209, + 0x00000002, 0x5c028800, 0x5c026000, 0x5c026800, + 0x5c025800, 0x0401f60a, 0x5c028800, 0x5c026000, + 0x5c026800, 0x5c025800, 0x0401f648, 0x492fc857, + 0x4933c857, 0x497a601f, 0x592c0006, 0x82000580, + 0x01000000, 0x04020004, 0x4a034407, 0x00000004, + 0x0401f63e, 0x4d2c0000, 0x832e5c00, 0x00000007, + 0x592c0000, 0x82000580, 0x02000000, 0x04020012, + 0x4803c856, 0x4a034209, 0x00000004, 0x592c0804, + 0x82040500, 0x0000ffff, 0x48034409, 0x80040920, + 0x4807420a, 0x592c0805, 0x82040500, 0x0000ffff, + 0x4803440a, 0x80040920, 0x4807420b, 0x5c025800, + 0x0401f5e3, 0x4803c856, 0x4a034209, 0x00000005, + 0x592c0801, 0x82040500, 0x0000ffff, 0x48034409, + 0x80040920, 0x4807420a, 0x0401f7f5, 0x4937c857, + 0x4823c857, 0x5934000f, 0x80001d40, 0x04000005, + 0x580c0006, 0x80200580, 0x04020003, 0x81780000, + 0x1c01f000, 0x580c0000, 0x0401f7f8, 0x4823c857, + 0x4d2c0000, 0x42026000, 0x0010f694, 0x59300407, + 0x82000d80, 0x00000003, 0x04000004, 0x82000d80, + 0x00000006, 0x04020007, 0x59325809, 0x812e59c0, + 0x04000004, 0x592c0006, 0x80200580, 0x0400000a, + 0x83326400, 0x00000024, 0x59a8000b, 0x81300480, + 0x040017ef, 0x417a6000, 0x80000580, 0x5c025800, + 0x1c01f000, 0x82000540, 0x00000001, 0x5c025800, + 0x1c01f000, 0x83a00580, 0x0010b8fa, 0x040205e3, + 0x59a8006d, 0x8c000500, 0x04020003, 0x4a030000, + 0x00000000, 0x4a034207, 0x00004000, 0x4a03c011, + 0x40000010, 0x0401fe0c, 0x4a03c017, 0x00000000, + 0x59e00002, 0x8c00051e, 0x04020008, 0x42000000, + 0x00001000, 0x50000000, 0x82000480, 0x24320002, + 0x02000000, 0x00020238, 0x59a80073, 0x8c00053e, + 0x0400000b, 0x42000800, 0x000000a0, 0x0201f800, + 0x00101738, 0x82040540, 0x00000001, 0x42000800, + 0x000000a0, 0x0201f800, 0x00101740, 0x4203e000, + 0x30000001, 0x4203e000, 0x40000000, 0x0401f000, + 0x59a00c07, 0x800409c0, 0x04000007, 0x836c0580, + 0x00000000, 0x04000004, 0x4a034407, 0x0000001a, + 0x0401f5be, 0x42007000, 0x0010b995, 0x58381c01, + 0x58382201, 0x58383202, 0x8c040d00, 0x0400000b, + 0x59a01208, 0x82080500, 0x0000f003, 0x040205b7, + 0x82080480, 0x00000841, 0x040215b4, 0x82080480, + 0x00000100, 0x040015b1, 0x40040000, 0x800c0540, + 0x82000500, 0x00000028, 0x82000580, 0x00000028, + 0x040005aa, 0x8c040d0a, 0x04000008, 0x59a03c08, + 0x821c0480, 0x00000006, 0x040215a4, 0x821c0480, + 0x00000001, 0x040015a1, 0x8c040d06, 0x04000003, + 0x4a0378e4, 0x000c0000, 0x8c040d04, 0x04000004, + 0x59e00002, 0x84000548, 0x4803c002, 0x8c040d02, + 0x04000005, 0x42002800, 0x00007600, 0x4a002805, + 0xd0000000, 0x40040000, 0x800c0540, 0x48007401, + 0x8c040d00, 0x04000002, 0x48087201, 0x8c040d0a, + 0x0400001f, 0x481c7202, 0x4c0c0000, 0x4c100000, + 0x4c180000, 0x0201f800, 0x001061b2, 0x4df00000, + 0x58383a02, 0x481fc857, 0x41780000, 0x801c3840, + 0x800010c8, 0x82081400, 0x0000bf32, 0x4a001001, + 0x00000000, 0x801c1c80, 0x04021003, 0x4a001001, + 0x00000002, 0x80000000, 0x82001c80, 0x00000005, + 0x040017f4, 0x5c03e000, 0x02000800, 0x0010619f, + 0x5c003000, 0x5c002000, 0x5c001800, 0x480f4407, + 0x48134208, 0x481b4408, 0x0401f521, 0x4d440000, + 0x4d340000, 0x59a28c07, 0x0201f800, 0x00020319, + 0x04020009, 0x0201f800, 0x00104194, 0x04000009, + 0x4a034407, 0x00000009, 0x5c026800, 0x5c028800, + 0x0401f556, 0x5c026800, 0x5c028800, 0x0401f557, + 0x59a01208, 0x59a01c08, 0x5934400a, 0x82203d00, + 0x0000e000, 0x801c391a, 0x8c081500, 0x04000024, + 0x820c0d00, 0x00000007, 0x82040580, 0x00000000, + 0x04000010, 0x82040580, 0x00000001, 0x0400000d, + 0x82040580, 0x00000003, 0x0400000a, 0x82040580, + 0x00000004, 0x04000007, 0x82040580, 0x00000013, + 0x04000004, 0x4937c857, 0x42000800, 0x00000003, + 0x82204500, 0xffff1fff, 0x800400da, 0x80200540, + 0x4802680a, 0x4c080000, 0x4c1c0000, 0x0201f800, + 0x001061b2, 0x0201f800, 0x0010446b, 0x0201f800, + 0x0010619f, 0x5c003800, 0x5c001000, 0x481f4408, + 0x5934400a, 0x82203d00, 0x0f000000, 0x801c3930, + 0x8c081504, 0x04020012, 0x8c081502, 0x0400000c, + 0x4823c857, 0x82204500, 0xf0ffffff, 0x59a01a09, + 0x820c0d00, 0x0000000f, 0x800400f0, 0x8400056e, + 0x80200540, 0x4802680a, 0x4803c857, 0x481f4209, + 0x5c026800, 0x5c028800, 0x0401f4cd, 0x82204500, + 0xf07fffff, 0x4822680a, 0x0401f7f9, 0x8d0e1d0e, + 0x04000004, 0x4a034407, 0x00000001, 0x0401f507, + 0x836c0580, 0x00000003, 0x04020010, 0x59a8000f, + 0x497b4407, 0x0201f800, 0x00104755, 0x0400000f, + 0x82000d00, 0x00ffff00, 0x0402000c, 0x82000c00, + 0x00101b0f, 0x50040800, 0x80040910, 0x82041580, + 0x00000080, 0x04020004, 0x4a034407, 0x00000007, + 0x0401f4f2, 0x48074407, 0x82000d00, 0x0000ffff, + 0x48074208, 0x80000120, 0x48034408, 0x59a8021b, + 0x82001500, 0x00002100, 0x480b440a, 0x8c000502, + 0x0400001f, 0x8c000506, 0x04000009, 0x82000d00, + 0x0000000a, 0x82040d80, 0x0000000a, 0x04020004, + 0x4a03420a, 0x00000001, 0x0401f022, 0x8c00050a, + 0x04000009, 0x82000d00, 0x00000022, 0x82040d80, + 0x00000022, 0x04020004, 0x4a03420a, 0x00000003, + 0x0401f018, 0x8c000508, 0x04000009, 0x82000d00, + 0x00000012, 0x82040d80, 0x00000012, 0x04020004, + 0x4a03420a, 0x00000002, 0x0401f00e, 0x0201f800, + 0x00104755, 0x04020004, 0x4a03420a, 0x00000004, + 0x0401f47f, 0x8c000506, 0x04000004, 0x4a034407, + 0x00000005, 0x0401f4bd, 0x4a03420a, 0x00000000, + 0x0401f477, 0x59a8002a, 0x48034408, 0x59a8002b, + 0x4803420a, 0x0401f472, 0x42007800, 0x0010bdb1, + 0x59a00407, 0x4803c857, 0x82000c80, 0x0000000a, + 0x040214b2, 0x0c01f001, 0x001020d1, 0x00102069, + 0x00102077, 0x0010208a, 0x001020ab, 0x001020d3, + 0x00102061, 0x00102061, 0x00102061, 0x00102061, + 0x00102062, 0x0401f4a5, 0x59a00208, 0x48007c01, + 0x59a00408, 0x48007a01, 0x0201f800, 0x001003e9, + 0x0401f069, 0x836c0580, 0x00000000, 0x04000497, + 0x59a00a08, 0x59a00408, 0x900001c0, 0x80040d40, + 0x4807c857, 0x59a00a09, 0x59a00409, 0x900001c0, + 0x80040d40, 0x4807c857, 0x0401f05b, 0x836c0580, + 0x00000000, 0x04000489, 0x59a00408, 0x59a01208, + 0x900001c0, 0x80081540, 0x59a00409, 0x59a01a09, + 0x900001c0, 0x800c1d40, 0x42000000, 0x0010c642, + 0x480fc857, 0x480bc857, 0x42000800, 0x00001000, + 0x0201f000, 0x001031dc, 0x59a00a08, 0x59a00408, + 0x900001c0, 0x80041d40, 0x820c0c80, 0x0010afb1, + 0x04021476, 0x820c0c80, 0x00100000, 0x04001473, + 0x480fc857, 0x823c7c00, 0x0000000d, 0x503c0800, + 0x800409c0, 0x04000006, 0x823c0580, 0x00000011, + 0x0400046a, 0x803c7800, 0x0401f7f9, 0x59e41001, + 0x82080d00, 0xfffeffcf, 0x4807c801, 0x440c7800, + 0x46001800, 0x0201f800, 0x800c1800, 0x46001800, + 0x0010031d, 0x480bc801, 0x0401f027, 0x59a01a08, + 0x59a00408, 0x900001c0, 0x800c1d40, 0x480c7803, + 0x59a02209, 0x59a00409, 0x900001c0, 0x80102540, + 0x48107804, 0x59a0020a, 0x40001000, 0x48007807, + 0x80000040, 0x0400144d, 0x48007808, 0x42000800, + 0x00004000, 0x0201f800, 0x00105fef, 0x80000540, + 0x04000002, 0x0401f445, 0x40040000, 0x800c1c00, + 0x04001442, 0x4800780a, 0x480c7805, 0x48107806, + 0x4978780c, 0x59a0040a, 0x800000c4, 0x4800780b, + 0x59e40001, 0x4803c857, 0x82000540, 0x00040000, + 0x4803c801, 0x0201f000, 0x00101cbf, 0x49787803, + 0x49787804, 0x49787808, 0x49787807, 0x49787803, + 0x49787805, 0x49787806, 0x4978780c, 0x4978780b, + 0x59e40001, 0x84000524, 0x0401f7f2, 0x59a80005, + 0x48034407, 0x59a80006, 0x48034208, 0x59a80007, + 0x48034408, 0x0201f000, 0x00101cbf, 0x0201f800, + 0x0010032d, 0x4803c856, 0x4a03c013, 0x03800300, + 0x4a03c014, 0x03800380, 0x59a00c07, 0x82040580, + 0x000000a0, 0x04000004, 0x82040580, 0x000000a2, + 0x04020021, 0x59a0140b, 0x82080480, 0x00000100, + 0x0402101d, 0x59a0020c, 0x8c000500, 0x04020026, + 0x59a00a0b, 0x800409c0, 0x04000017, 0x82040480, + 0x00000041, 0x04021014, 0x0201f800, 0x001031af, + 0x0400000b, 0x59a01008, 0x900811c0, 0x59a0180a, + 0x900c19c0, 0x59a00a0b, 0x0201f800, 0x001031d6, + 0x4a01d808, 0x00102119, 0x1c01f000, 0x4a034407, + 0x00000002, 0x4a03c014, 0x03800000, 0x0201f000, + 0x00101d02, 0x4a03c014, 0x03800000, 0x0201f000, + 0x00101d06, 0x4031d800, 0x58ef400a, 0x58ee580c, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00101cfa, 0x59a00c07, 0x59a0140b, 0x59a0020c, + 0x8c000500, 0x04020039, 0x832e5c00, 0x00000005, + 0x4178c000, 0x59a0ba0b, 0x40600000, 0x812c0400, + 0x5000c800, 0x82641d00, 0x000000ff, 0x4c040000, + 0x4c080000, 0x0401f8c9, 0x5c001000, 0x5c000800, + 0x04000038, 0x805cb840, 0x04000032, 0x80081000, + 0x82641d00, 0x0000ff00, 0x800c1910, 0x4c040000, + 0x4c080000, 0x0401f8bd, 0x5c001000, 0x5c000800, + 0x0400002c, 0x805cb840, 0x04000026, 0x80081000, + 0x82641d00, 0x00ff0000, 0x800c1920, 0x4c040000, + 0x4c080000, 0x0401f8b1, 0x5c001000, 0x5c000800, + 0x04000020, 0x805cb840, 0x0400001a, 0x80081000, + 0x82641d00, 0xff000000, 0x800c1930, 0x4c040000, + 0x4c080000, 0x0401f8a5, 0x5c001000, 0x5c000800, + 0x04000014, 0x805cb840, 0x0400000e, 0x80081000, + 0x8060c000, 0x0401f7cd, 0x59a0020b, 0x82000500, + 0x000000ff, 0x40001800, 0x4c040000, 0x4c080000, + 0x0401f896, 0x5c001000, 0x5c000800, 0x04000005, + 0x4a03c014, 0x03800000, 0x0201f000, 0x00101cbf, + 0x4a03c014, 0x03800000, 0x4a034407, 0x00000004, + 0x0201f000, 0x00101d02, 0x4803c856, 0x59a80873, + 0x8c040d3e, 0x04020005, 0x4a03c013, 0x03800300, + 0x4a03c014, 0x03800380, 0x59a00c07, 0x82040580, + 0x000000a0, 0x04000004, 0x82040580, 0x000000a2, + 0x04020076, 0x59a0140b, 0x82080480, 0x00000100, + 0x04021072, 0x59a0020c, 0x8c000500, 0x0402005d, + 0x59a01a0b, 0x800c19c0, 0x0400006c, 0x820c0480, + 0x00000041, 0x04021069, 0x0201f800, 0x001031af, + 0x0402000b, 0x4a034407, 0x00000002, 0x59a80873, + 0x8c040d3e, 0x04020003, 0x4a03c014, 0x03800000, + 0x4803c857, 0x0201f000, 0x00101d02, 0x59a80073, + 0x8c00053e, 0x02020000, 0x0010a7eb, 0x832e5c00, + 0x00000005, 0x4178c000, 0x59a0ba0b, 0x4803c857, + 0x40600000, 0x812c0400, 0x4000c800, 0x4c040000, + 0x4c080000, 0x0401f887, 0x5c001000, 0x5c000800, + 0x04000044, 0x4414c800, 0x805cb840, 0x0400002b, + 0x80081000, 0x4c040000, 0x4c080000, 0x0401f87d, + 0x5c001000, 0x5c000800, 0x0400003a, 0x50640000, + 0x801428d0, 0x80140540, 0x4400c800, 0x805cb840, + 0x0400001e, 0x80081000, 0x4c040000, 0x4c080000, + 0x0401f870, 0x5c001000, 0x5c000800, 0x0400002d, + 0x50640000, 0x801428e0, 0x80140540, 0x4400c800, + 0x805cb840, 0x04000011, 0x80081000, 0x4c040000, + 0x4c080000, 0x0401f863, 0x5c001000, 0x5c000800, + 0x04000020, 0x50640000, 0x801428f0, 0x80140540, + 0x4400c800, 0x805cb840, 0x04000004, 0x80081000, + 0x8060c000, 0x0401f7ca, 0x59a00a0b, 0x59a01008, + 0x900811c0, 0x59a0180a, 0x900c19c0, 0x4a03c014, + 0x03800000, 0x412c0000, 0x0201f000, 0x001031d9, + 0x4803c857, 0x59a80073, 0x8c00053e, 0x02020000, + 0x00101d06, 0x0401f847, 0x04000006, 0x48174407, + 0x4a03c014, 0x03800000, 0x0201f000, 0x00101cbf, + 0x4a03c014, 0x03800000, 0x4a034407, 0x00000004, + 0x0201f000, 0x00101d02, 0x4a03c014, 0x03800000, + 0x0201f000, 0x00101d06, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4004b800, 0x4008c000, 0x400cc800, + 0x0401f87a, 0x04000012, 0x0401f8b2, 0x04020014, + 0x4060b800, 0x0401f8af, 0x04020011, 0x4064b800, + 0x0401f8ac, 0x0402000e, 0x0401f896, 0x4ce80000, + 0x4201d000, 0x00001388, 0x0201f800, 0x001059d2, + 0x5c01d000, 0x82000540, 0x00000001, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x0401f889, + 0x80000580, 0x0401f7fa, 0x4c5c0000, 0x485fc857, + 0x0401f85e, 0x0400000a, 0x825cbd40, 0x00000001, + 0x0401f894, 0x0402000a, 0x0401f8dc, 0x0401f916, + 0x0401f87c, 0x82000540, 0x00000001, 0x4803c857, + 0x4867c857, 0x5c00b800, 0x1c01f000, 0x0401f875, + 0x80000580, 0x4803c857, 0x485fc857, 0x0401f7f8, + 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4807c857, + 0x480bc857, 0x4004b800, 0x4008c000, 0x0401f843, + 0x0400000d, 0x0401f87b, 0x04020010, 0x4c5c0000, + 0x4060b800, 0x0401f877, 0x5c00b800, 0x0402000b, + 0x0401ffda, 0x04000004, 0x0401f85e, 0x82000540, + 0x00000001, 0x40642800, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x0401f856, 0x80000580, + 0x4803c857, 0x4867c857, 0x0401f7f7, 0x4ce80000, + 0x4c580000, 0x4803c856, 0x4200b000, 0x0000000c, + 0x4201d000, 0x0000000a, 0x0201f800, 0x001059d2, + 0x4a03c013, 0x02000200, 0x4201d000, 0x0000000a, + 0x0201f800, 0x001059d2, 0x4a03c013, 0x02000000, + 0x8058b040, 0x040207f3, 0x42000800, 0x000003e8, + 0x4a03c013, 0x03800300, 0x80040840, 0x04000010, 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, 0x03800380, 0x82000500, 0x00000300, 0x82000580, - 0x00000300, 0x040207f3, 0x4201d000, 0x0000000a, - 0x0201f800, 0x0010592d, 0x4a03c013, 0x01000000, - 0x4201d000, 0x0000000a, 0x0201f800, 0x0010592d, - 0x4a03c013, 0x02000000, 0x82000540, 0x00000001, - 0x5c01d000, 0x1c01f000, 0x4803c857, 0x0401ffb2, - 0x040207ee, 0x0401f7fb, 0x4803c856, 0x4a03c013, - 0x01000000, 0x4ce80000, 0x4201d000, 0x0000000a, - 0x0201f800, 0x0010592d, 0x5c01d000, 0x4a03c013, - 0x02000200, 0x4ce80000, 0x4201d000, 0x0000000a, - 0x0201f800, 0x0010592d, 0x5c01d000, 0x4a03c013, - 0x01000100, 0x1c01f000, 0x4c5c0000, 0x4c600000, - 0x485fc857, 0x4200c000, 0x00000008, 0x825c0500, - 0x00000080, 0x800000c2, 0x82000540, 0x01000000, - 0x4803c013, 0x4ce80000, 0x4201d000, 0x0000000a, - 0x0201f800, 0x0010592d, 0x5c01d000, 0x4a03c013, - 0x02000200, 0x4ce80000, 0x4201d000, 0x0000000a, - 0x0201f800, 0x0010592d, 0x5c01d000, 0x4a03c013, - 0x02000000, 0x805cb8c2, 0x8060c040, 0x040207e8, - 0x4a03c013, 0x01000100, 0x4ce80000, 0x4201d000, - 0x0000000a, 0x0201f800, 0x0010592d, 0x5c01d000, - 0x4a03c013, 0x02000200, 0x4ce80000, 0x4201d000, - 0x0000000a, 0x0201f800, 0x0010592d, 0x5c01d000, - 0x4a03c014, 0x03800000, 0x42000800, 0x000003e8, - 0x59e0b813, 0x825cbd00, 0x00000100, 0x80040840, - 0x04000004, 0x405c0000, 0x80000540, 0x040207f9, - 0x4a03c014, 0x03800380, 0x4a03c013, 0x02000000, - 0x4ce80000, 0x4201d000, 0x0000000a, 0x0201f800, - 0x0010592d, 0x5c01d000, 0x485fc857, 0x405c0000, - 0x80000540, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x4c600000, 0x4803c856, 0x4a03c013, 0x01000100, - 0x4200c000, 0x00000008, 0x4200c800, 0x000003e8, - 0x4ce80000, 0x4201d000, 0x0000000a, 0x0201f800, - 0x0010592d, 0x5c01d000, 0x4a03c013, 0x02000200, - 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, - 0x03800380, 0x82000500, 0x00000200, 0x04020003, - 0x8064c840, 0x040207f7, 0x4178c800, 0x0401f009, - 0x4ce80000, 0x4201d000, 0x0000000a, 0x0201f800, - 0x0010592d, 0x5c01d000, 0x4a03c013, 0x02000200, - 0x4ce80000, 0x4201d000, 0x0000000a, 0x0201f800, - 0x0010592d, 0x5c01d000, 0x4a03c014, 0x03800000, + 0x00000300, 0x040207f3, 0x82000540, 0x00000001, + 0x5c00b000, 0x5c01d000, 0x1c01f000, 0x4803c857, + 0x80000580, 0x0401f7fb, 0x4ce80000, 0x4803c856, + 0x42000800, 0x000003e8, 0x4a03c013, 0x03800300, + 0x80040840, 0x0400001b, 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, 0x03800380, 0x82000500, - 0x00000100, 0x80000110, 0x8064c8c2, 0x8064cd40, - 0x4a03c013, 0x02000000, 0x8060c040, 0x040207e5, - 0x4867c857, 0x5c00c000, 0x1c01f000, 0x4803c856, - 0x4a03c013, 0x01000100, 0x4ce80000, 0x4201d000, - 0x0000000a, 0x0201f800, 0x0010592d, 0x5c01d000, + 0x00000300, 0x82000580, 0x00000300, 0x040207f3, + 0x4201d000, 0x0000000a, 0x0201f800, 0x001059d2, + 0x4a03c013, 0x01000000, 0x4201d000, 0x0000000a, + 0x0201f800, 0x001059d2, 0x4a03c013, 0x02000000, + 0x82000540, 0x00000001, 0x5c01d000, 0x1c01f000, + 0x4803c857, 0x0401ffb2, 0x040207ee, 0x0401f7fb, + 0x4803c856, 0x4a03c013, 0x01000000, 0x4ce80000, + 0x4201d000, 0x0000000a, 0x0201f800, 0x001059d2, + 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, + 0x4201d000, 0x0000000a, 0x0201f800, 0x001059d2, + 0x5c01d000, 0x4a03c013, 0x01000100, 0x1c01f000, + 0x4c5c0000, 0x4c600000, 0x485fc857, 0x4200c000, + 0x00000008, 0x825c0500, 0x00000080, 0x800000c2, + 0x82000540, 0x01000000, 0x4803c013, 0x4ce80000, + 0x4201d000, 0x0000000a, 0x0201f800, 0x001059d2, + 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, + 0x4201d000, 0x0000000a, 0x0201f800, 0x001059d2, + 0x5c01d000, 0x4a03c013, 0x02000000, 0x805cb8c2, + 0x8060c040, 0x040207e8, 0x4a03c013, 0x01000100, + 0x4ce80000, 0x4201d000, 0x0000000a, 0x0201f800, + 0x001059d2, 0x5c01d000, 0x4a03c013, 0x02000200, + 0x4ce80000, 0x4201d000, 0x0000000a, 0x0201f800, + 0x001059d2, 0x5c01d000, 0x4a03c014, 0x03800000, + 0x42000800, 0x000003e8, 0x59e0b813, 0x825cbd00, + 0x00000100, 0x80040840, 0x04000004, 0x405c0000, + 0x80000540, 0x040207f9, 0x4a03c014, 0x03800380, + 0x4a03c013, 0x02000000, 0x4ce80000, 0x4201d000, + 0x0000000a, 0x0201f800, 0x001059d2, 0x5c01d000, + 0x485fc857, 0x405c0000, 0x80000540, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x4c600000, 0x4803c856, + 0x4a03c013, 0x01000100, 0x4200c000, 0x00000008, + 0x4200c800, 0x000003e8, 0x4ce80000, 0x4201d000, + 0x0000000a, 0x0201f800, 0x001059d2, 0x5c01d000, + 0x4a03c013, 0x02000200, 0x4a03c014, 0x03800000, + 0x59e00013, 0x4a03c014, 0x03800380, 0x82000500, + 0x00000200, 0x04020003, 0x8064c840, 0x040207f7, + 0x4178c800, 0x0401f009, 0x4ce80000, 0x4201d000, + 0x0000000a, 0x0201f800, 0x001059d2, 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, 0x4201d000, - 0x0000000a, 0x0201f800, 0x0010592d, 0x5c01d000, - 0x4a03c013, 0x02000000, 0x1c01f000, 0x59a00408, - 0x59a8082a, 0x4803502a, 0x48074408, 0x59a00a0a, - 0x82040480, 0x00000014, 0x04021003, 0x42000800, - 0x000007d0, 0x59a8002b, 0x4807502b, 0x4803420a, - 0x0201f000, 0x00101cba, 0x836c0580, 0x00000000, - 0x0400000e, 0x59a80005, 0x59a00c07, 0x80041580, - 0x82081500, 0x00000040, 0x02000000, 0x00101cba, - 0x80080580, 0x48035005, 0x0201f800, 0x00100419, - 0x0201f000, 0x00101cba, 0x59a00407, 0x59a80805, - 0x48035005, 0x80040d80, 0x8c040d0c, 0x02020800, - 0x00100419, 0x59a00208, 0x48035006, 0x59a00408, - 0x48035007, 0x0201f000, 0x00101cba, 0x59a80073, - 0x8c00053e, 0x02000000, 0x00101cf1, 0x59a00c07, - 0x8c040d00, 0x04000021, 0x4a034407, 0x00000001, - 0x8c000506, 0x02020000, 0x00101cfd, 0x4a034407, - 0x00000009, 0x59aa6874, 0x0201f800, 0x0010416b, - 0x02020000, 0x00101cfd, 0x4a034407, 0x00000003, - 0x0201f800, 0x000209ee, 0x02000000, 0x00101cfd, - 0x48ee6022, 0x4a01d808, 0x00102392, 0x4a026407, - 0x00000012, 0x4936600a, 0x42027000, 0x000000d7, - 0x0201f000, 0x00020a34, 0x59a00407, 0x800001c0, - 0x02020000, 0x00101cfd, 0x0201f800, 0x0010a616, - 0x0201f000, 0x00101cba, 0x8d0e1d0e, 0x04000005, - 0x4a034407, 0x00000001, 0x0201f000, 0x00101cfd, - 0x0201f800, 0x00104716, 0x04020005, 0x4a034407, - 0x00000016, 0x0201f000, 0x00101cfd, 0x836c0580, - 0x00000003, 0x04000005, 0x4a034407, 0x00000007, - 0x0201f000, 0x00101cfd, 0x59a00c07, 0x82040500, - 0xffffff00, 0x02020000, 0x00101d01, 0x82041580, - 0x000000ff, 0x04020007, 0x59a8000f, 0x82000500, - 0x000000ff, 0x82001540, 0x0000ff00, 0x0401f011, - 0x82040400, 0x00101b0a, 0x50000000, 0x80000110, - 0x82000580, 0x00000080, 0x02000000, 0x00101d01, - 0x59a8000f, 0x82000500, 0x000000ff, 0x80041580, - 0x02000000, 0x00101d01, 0x840409c0, 0x80041540, - 0x0201f800, 0x001070f5, 0x04020005, 0x4a034407, - 0x00000003, 0x0201f000, 0x00101cfd, 0x48ee6022, - 0x480a621d, 0x4a02641d, 0x0000bc09, 0x4a026407, - 0x00000001, 0x0201f800, 0x001031a5, 0x04020007, - 0x0201f800, 0x00020a10, 0x4a034407, 0x00000002, - 0x0201f000, 0x00101cfd, 0x497a5a05, 0x497a5806, - 0x4a025c05, 0x00008000, 0x4a01d808, 0x00102440, - 0x492e6009, 0x42027000, 0x00000032, 0x0201f000, - 0x00020a34, 0x8d0e1d0e, 0x04000005, 0x4a034407, - 0x00000001, 0x0201f000, 0x00101cfd, 0x0201f800, - 0x00104716, 0x04020005, 0x4a034407, 0x00000016, - 0x0201f000, 0x00101cfd, 0x836c0580, 0x00000003, - 0x04000005, 0x4a034407, 0x00000007, 0x0201f000, - 0x00101cfd, 0x59a00c07, 0x82040500, 0xffffff00, - 0x02020000, 0x00101d01, 0x82041580, 0x000000ff, - 0x04020007, 0x59a8000f, 0x82000500, 0x000000ff, - 0x82001540, 0x0000ff00, 0x0401f011, 0x82040400, - 0x00101b0a, 0x50000000, 0x80000110, 0x82000580, - 0x00000080, 0x02000000, 0x00101d01, 0x59a8000f, - 0x82000500, 0x000000ff, 0x80041580, 0x02000000, - 0x00101d01, 0x840409c0, 0x80041540, 0x0201f800, - 0x001070f5, 0x04020005, 0x4a034407, 0x00000003, - 0x0201f000, 0x00101cfd, 0x48ee6022, 0x480a621d, - 0x4a02641d, 0x0000bc05, 0x4a026407, 0x00000001, - 0x0201f800, 0x001031a5, 0x04020007, 0x0201f800, - 0x00020a10, 0x4a034407, 0x00000002, 0x0201f000, - 0x00101cfd, 0x497a5a05, 0x497a5806, 0x4a025c05, - 0x00008000, 0x4a01d808, 0x00102440, 0x492e6009, - 0x42027000, 0x00000032, 0x0201f000, 0x00020a34, - 0x592c0006, 0x82000580, 0x01000000, 0x02020000, - 0x00101cba, 0x4a034407, 0x00000004, 0x0201f000, - 0x00101cfd, 0x497b4407, 0x497b4208, 0x8d0e1d20, - 0x04000008, 0x59a8004d, 0x59a8084e, 0x80040480, - 0x59a8084f, 0x48074407, 0x80041480, 0x480b4208, - 0x0201f800, 0x001032e6, 0x48034408, 0x59a8100d, - 0x59a80251, 0x80080480, 0x4803420a, 0x495f440a, - 0x59a8001a, 0x4803420c, 0x0201f000, 0x00101cba, + 0x0000000a, 0x0201f800, 0x001059d2, 0x5c01d000, + 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, + 0x03800380, 0x82000500, 0x00000100, 0x80000110, + 0x8064c8c2, 0x8064cd40, 0x4a03c013, 0x02000000, + 0x8060c040, 0x040207e5, 0x4867c857, 0x5c00c000, + 0x1c01f000, 0x4803c856, 0x4a03c013, 0x01000100, + 0x4ce80000, 0x4201d000, 0x0000000a, 0x0201f800, + 0x001059d2, 0x5c01d000, 0x4a03c013, 0x02000200, + 0x4ce80000, 0x4201d000, 0x0000000a, 0x0201f800, + 0x001059d2, 0x5c01d000, 0x4a03c013, 0x02000000, + 0x1c01f000, 0x59a00408, 0x59a8082a, 0x4803502a, + 0x48074408, 0x59a00a0a, 0x82040480, 0x00000014, + 0x04021003, 0x42000800, 0x000007d0, 0x59a8002b, + 0x4807502b, 0x4803420a, 0x0201f000, 0x00101cbf, + 0x836c0580, 0x00000000, 0x0400000e, 0x59a80005, + 0x59a00c07, 0x80041580, 0x82081500, 0x00000040, + 0x02000000, 0x00101cbf, 0x80080580, 0x48035005, + 0x0201f800, 0x00100419, 0x0201f000, 0x00101cbf, + 0x59a00407, 0x59a80805, 0x48035005, 0x80040d80, + 0x8c040d0c, 0x02020800, 0x00100419, 0x59a00208, + 0x48035006, 0x59a00408, 0x48035007, 0x0201f000, + 0x00101cbf, 0x59a80073, 0x8c00053e, 0x02000000, + 0x00101cf6, 0x59a00c07, 0x8c040d00, 0x04000021, + 0x4a034407, 0x00000001, 0x8c000506, 0x02020000, + 0x00101d02, 0x4a034407, 0x00000009, 0x59aa6874, + 0x0201f800, 0x00104187, 0x02020000, 0x00101d02, + 0x4a034407, 0x00000003, 0x0201f800, 0x000209ee, + 0x02000000, 0x00101d02, 0x48ee6022, 0x4a01d808, + 0x0010239c, 0x4a026407, 0x00000012, 0x4936600a, + 0x42027000, 0x000000d7, 0x0201f000, 0x00020a34, + 0x59a00407, 0x800001c0, 0x02020000, 0x00101d02, + 0x0201f800, 0x0010a709, 0x0201f000, 0x00101cbf, 0x8d0e1d0e, 0x04000005, 0x4a034407, 0x00000001, - 0x0201f000, 0x00101cfd, 0x59a00407, 0x8c000500, - 0x0402000f, 0x59a80050, 0x81640480, 0x04001008, - 0x59a8000b, 0x81500580, 0x04000009, 0x59a8004e, - 0x59a8104d, 0x80080580, 0x04000005, 0x4a034407, - 0x00000018, 0x0201f000, 0x00101cfd, 0x850e1d58, - 0x4803c856, 0x850e1d46, 0x0201f800, 0x00103461, - 0x0201f000, 0x00101cba, 0x599c0201, 0x48035061, - 0x41780800, 0x42001000, 0x00003b10, 0x0201f800, - 0x00105f69, 0x480b5062, 0x1c01f000, 0x0401f807, - 0x42018800, 0x00000000, 0x04020003, 0x42018800, - 0x00000001, 0x1c01f000, 0x82000540, 0x00000001, - 0x0402500d, 0x4203e000, 0x80000000, 0x40e81000, - 0x41780800, 0x42000000, 0x00000064, 0x0201f800, - 0x00105f69, 0x5994002e, 0x80080400, 0x4803282e, - 0x80000580, 0x1c01f000, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x417a3000, 0x0201f800, - 0x00106705, 0x0201f800, 0x001062a1, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, - 0x42000800, 0x0000007c, 0x0201f800, 0x001010da, - 0x4a03902c, 0x00200000, 0x4200b000, 0x000001f4, - 0x59c8002c, 0x8c00052c, 0x04000007, 0x8058b040, - 0x040207fc, 0x42000000, 0x00004003, 0x41781000, - 0x0401f131, 0x4a035068, 0x00000002, 0x42006000, - 0x00102601, 0x50301000, 0x41784800, 0x4a03902d, - 0x00008000, 0x4200b000, 0x000001f4, 0x59c8002c, - 0x8c000534, 0x04000007, 0x8058b040, 0x040207fc, - 0x42000000, 0x00004003, 0x41781000, 0x0401f11e, - 0x0401f8a2, 0x80244800, 0x82240580, 0x000003b1, - 0x040207fc, 0x0401f927, 0x41784800, 0x0401f8c8, - 0x80244800, 0x82240580, 0x000003b1, 0x040207fc, - 0x80306000, 0x82300580, 0x00102603, 0x040207e2, - 0x59a80867, 0x800409c0, 0x04000007, 0x42000000, - 0x00004004, 0x42001000, 0x00000002, 0x59a81866, - 0x0401f105, 0x42006000, 0x00102601, 0x4a035068, - 0x00000010, 0x50301000, 0x41784800, 0x4a03902d, - 0x00000800, 0x0401f881, 0x80244800, 0x82240580, - 0x00000018, 0x040207fc, 0x0401f906, 0x41784800, - 0x0401f8a7, 0x80244800, 0x82240580, 0x00000018, - 0x040207fc, 0x80306000, 0x82300580, 0x00102603, - 0x040207ed, 0x59a80867, 0x800409c0, 0x04000007, - 0x42000000, 0x00004004, 0x42001000, 0x00000010, - 0x59a81866, 0x0401f0e4, 0x42006000, 0x00102601, - 0x4a035068, 0x00000008, 0x50301000, 0x41784800, - 0x4a03902d, 0x00000400, 0x0401f860, 0x80244800, - 0x82240580, 0x00000088, 0x040207fc, 0x0401f8e5, - 0x41784800, 0x0401f886, 0x80244800, 0x82240580, - 0x00000088, 0x040207fc, 0x80306000, 0x82300580, - 0x00102603, 0x040207ed, 0x59a80867, 0x800409c0, - 0x04000007, 0x42000000, 0x00004004, 0x42001000, - 0x00000008, 0x59a81866, 0x0401f0c3, 0x42006000, - 0x00102601, 0x4a035068, 0x00000020, 0x50301000, - 0x41784800, 0x4a03902d, 0x00002000, 0x4200b000, - 0x000001f4, 0x59c8002c, 0x8c000530, 0x04000007, + 0x0201f000, 0x00101d02, 0x0201f800, 0x00104755, + 0x04020005, 0x4a034407, 0x00000016, 0x0201f000, + 0x00101d02, 0x836c0580, 0x00000003, 0x04000005, + 0x4a034407, 0x00000007, 0x0201f000, 0x00101d02, + 0x59a00c07, 0x82040500, 0xffffff00, 0x02020000, + 0x00101d06, 0x82041580, 0x000000ff, 0x04020007, + 0x59a8000f, 0x82000500, 0x000000ff, 0x82001540, + 0x0000ff00, 0x0401f011, 0x82040400, 0x00101b0f, + 0x50000000, 0x80000110, 0x82000580, 0x00000080, + 0x02000000, 0x00101d06, 0x59a8000f, 0x82000500, + 0x000000ff, 0x80041580, 0x02000000, 0x00101d06, + 0x840409c0, 0x80041540, 0x0201f800, 0x00107188, + 0x04020005, 0x4a034407, 0x00000003, 0x0201f000, + 0x00101d02, 0x48ee6022, 0x480a621d, 0x4a02641d, + 0x0000bc09, 0x4a026407, 0x00000001, 0x0201f800, + 0x001031af, 0x04020007, 0x0201f800, 0x00020a10, + 0x4a034407, 0x00000002, 0x0201f000, 0x00101d02, + 0x497a5a05, 0x497a5806, 0x4a025c05, 0x00008000, + 0x4a01d808, 0x0010244a, 0x492e6009, 0x42027000, + 0x00000032, 0x0201f000, 0x00020a34, 0x8d0e1d0e, + 0x04000005, 0x4a034407, 0x00000001, 0x0201f000, + 0x00101d02, 0x0201f800, 0x00104755, 0x04020005, + 0x4a034407, 0x00000016, 0x0201f000, 0x00101d02, + 0x836c0580, 0x00000003, 0x04000005, 0x4a034407, + 0x00000007, 0x0201f000, 0x00101d02, 0x59a00c07, + 0x82040500, 0xffffff00, 0x02020000, 0x00101d06, + 0x82041580, 0x000000ff, 0x04020007, 0x59a8000f, + 0x82000500, 0x000000ff, 0x82001540, 0x0000ff00, + 0x0401f011, 0x82040400, 0x00101b0f, 0x50000000, + 0x80000110, 0x82000580, 0x00000080, 0x02000000, + 0x00101d06, 0x59a8000f, 0x82000500, 0x000000ff, + 0x80041580, 0x02000000, 0x00101d06, 0x840409c0, + 0x80041540, 0x0201f800, 0x00107188, 0x04020005, + 0x4a034407, 0x00000003, 0x0201f000, 0x00101d02, + 0x48ee6022, 0x480a621d, 0x4a02641d, 0x0000bc05, + 0x4a026407, 0x00000001, 0x0201f800, 0x001031af, + 0x04020007, 0x0201f800, 0x00020a10, 0x4a034407, + 0x00000002, 0x0201f000, 0x00101d02, 0x497a5a05, + 0x497a5806, 0x4a025c05, 0x00008000, 0x4a01d808, + 0x0010244a, 0x492e6009, 0x42027000, 0x00000032, + 0x0201f000, 0x00020a34, 0x592c0006, 0x82000580, + 0x01000000, 0x02020000, 0x00101cbf, 0x4a034407, + 0x00000004, 0x0201f000, 0x00101d02, 0x497b4407, + 0x497b4208, 0x8d0e1d20, 0x04000008, 0x59a8004d, + 0x59a8084e, 0x80040480, 0x59a8084f, 0x48074407, + 0x80041480, 0x480b4208, 0x0201f800, 0x001032f0, + 0x48034408, 0x59a8100d, 0x59a80251, 0x80080480, + 0x4803420a, 0x495f440a, 0x59a8001a, 0x4803420c, + 0x0201f000, 0x00101cbf, 0x8d0e1d0e, 0x04000005, + 0x4a034407, 0x00000001, 0x0201f000, 0x00101d02, + 0x59a00407, 0x8c000500, 0x0402000f, 0x59a80050, + 0x81640480, 0x04001008, 0x59a8000b, 0x81500580, + 0x04000009, 0x59a8004e, 0x59a8104d, 0x80080580, + 0x04000005, 0x4a034407, 0x00000018, 0x0201f000, + 0x00101d02, 0x850e1d58, 0x4803c856, 0x850e1d46, + 0x0201f800, 0x00103474, 0x0201f000, 0x00101cbf, + 0x599c0201, 0x48035061, 0x41780800, 0x42001000, + 0x00003b10, 0x0201f800, 0x0010600e, 0x480b5062, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000000, + 0x04020003, 0x42018800, 0x00000001, 0x1c01f000, + 0x82000540, 0x00000001, 0x0402500d, 0x4203e000, + 0x80000000, 0x40e81000, 0x41780800, 0x42000000, + 0x00000064, 0x0201f800, 0x0010600e, 0x5994002e, + 0x80080400, 0x4803282e, 0x80000580, 0x1c01f000, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x417a3000, 0x0201f800, 0x001067aa, 0x0201f800, + 0x00106346, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x1c01f000, 0x42000800, 0x0000007c, + 0x0201f800, 0x001010db, 0x4a03902c, 0x00200000, + 0x4200b000, 0x000001f4, 0x59c8002c, 0x8c00052c, + 0x04000007, 0x8058b040, 0x040207fc, 0x42000000, + 0x00004003, 0x41781000, 0x0401f131, 0x4a035068, + 0x00000002, 0x42006000, 0x0010260b, 0x50301000, + 0x41784800, 0x4a03902d, 0x00008000, 0x4200b000, + 0x000001f4, 0x59c8002c, 0x8c000534, 0x04000007, 0x8058b040, 0x040207fc, 0x42000000, 0x00004003, - 0x41781000, 0x0401f0b0, 0x59c8002c, 0x82000500, - 0xffe0ffff, 0x82080d00, 0x001f0000, 0x80040540, - 0x4803902c, 0x0401f82d, 0x80244800, 0x82240580, - 0x00000110, 0x040207fc, 0x0401f8b2, 0x41784800, - 0x0401f853, 0x59c80034, 0x82080d00, 0x001f0000, - 0x82000500, 0x001f0000, 0x80040580, 0x04000006, - 0x59a80067, 0x80000000, 0x48035067, 0x40240000, - 0x48035066, 0x80244800, 0x82240580, 0x00000110, - 0x040207f0, 0x80306000, 0x82300580, 0x00102603, - 0x040207cf, 0x59a80867, 0x800409c0, 0x04000006, - 0x42000000, 0x00004004, 0x42001000, 0x00000020, - 0x59a81866, 0x59c8002c, 0x8400052a, 0x4803902c, - 0x42000800, 0x0000007c, 0x0201f800, 0x001010da, - 0x0201f000, 0x00101cba, 0x59c8002c, 0x82000500, - 0xffff0000, 0x82080d00, 0x0000ffff, 0x80040540, - 0x4803902c, 0x480b9028, 0x480b9029, 0x59a80068, - 0x82004580, 0x00000004, 0x04000003, 0x480b902a, - 0x480b902b, 0x59c8002d, 0x82000500, 0xfffffc00, - 0x80240540, 0x4803902d, 0x4200b000, 0x000001f4, - 0x59c8002c, 0x82000500, 0x18000000, 0x04000007, - 0x8058b040, 0x040207fb, 0x42000000, 0x00004003, - 0x41781000, 0x0401f05c, 0x4a03902e, 0x00000001, - 0x4200b000, 0x000001f4, 0x59c8002e, 0x8c000500, - 0x04000006, 0x8058b040, 0x040207fc, 0x42000000, - 0x00004003, 0x0401f050, 0x1c01f000, 0x41783800, - 0x59c8002d, 0x82000500, 0xfffffc00, 0x80240d40, - 0x4807902d, 0x4200b000, 0x000001f4, 0x59c8002c, - 0x82000500, 0x18000000, 0x04000007, 0x8058b040, - 0x040207fb, 0x42000000, 0x00004003, 0x41781000, - 0x0401f03d, 0x59c81830, 0x59c80030, 0x800c0d80, - 0x040207fd, 0x80080d80, 0x04000002, 0x801c3800, - 0x59c82031, 0x59c80031, 0x80100d80, 0x040207fd, - 0x80080d80, 0x04000002, 0x801c3800, 0x59a80068, - 0x82004580, 0x00000004, 0x0400001b, 0x42004000, - 0x0000ffff, 0x59c82832, 0x59c80032, 0x80140d80, - 0x040207fd, 0x80080d80, 0x04000002, 0x801c3800, - 0x59c83033, 0x59c80033, 0x80180d80, 0x040207fd, - 0x80080d80, 0x04000002, 0x801c3800, 0x59c80034, - 0x59c80834, 0x80040d80, 0x040207fd, 0x80080d80, - 0x40200000, 0x80040d00, 0x0400000c, 0x801c3800, - 0x0401f00a, 0x59c80034, 0x59c80834, 0x80040d80, - 0x040207fd, 0x80080d80, 0x82040d00, 0x000000ff, - 0x04000002, 0x801c3800, 0x801c39c0, 0x04000005, - 0x59a80067, 0x801c0400, 0x48035067, 0x48275066, - 0x1c01f000, 0x48034207, 0x48074407, 0x480b4208, - 0x480f4408, 0x48134209, 0x48174409, 0x59c8002c, + 0x41781000, 0x0401f11e, 0x0401f8a2, 0x80244800, + 0x82240580, 0x000003b1, 0x040207fc, 0x0401f927, + 0x41784800, 0x0401f8c8, 0x80244800, 0x82240580, + 0x000003b1, 0x040207fc, 0x80306000, 0x82300580, + 0x0010260d, 0x040207e2, 0x59a80867, 0x800409c0, + 0x04000007, 0x42000000, 0x00004004, 0x42001000, + 0x00000002, 0x59a81866, 0x0401f105, 0x42006000, + 0x0010260b, 0x4a035068, 0x00000010, 0x50301000, + 0x41784800, 0x4a03902d, 0x00000800, 0x0401f881, + 0x80244800, 0x82240580, 0x00000018, 0x040207fc, + 0x0401f906, 0x41784800, 0x0401f8a7, 0x80244800, + 0x82240580, 0x00000018, 0x040207fc, 0x80306000, + 0x82300580, 0x0010260d, 0x040207ed, 0x59a80867, + 0x800409c0, 0x04000007, 0x42000000, 0x00004004, + 0x42001000, 0x00000010, 0x59a81866, 0x0401f0e4, + 0x42006000, 0x0010260b, 0x4a035068, 0x00000008, + 0x50301000, 0x41784800, 0x4a03902d, 0x00000400, + 0x0401f860, 0x80244800, 0x82240580, 0x00000088, + 0x040207fc, 0x0401f8e5, 0x41784800, 0x0401f886, + 0x80244800, 0x82240580, 0x00000088, 0x040207fc, + 0x80306000, 0x82300580, 0x0010260d, 0x040207ed, + 0x59a80867, 0x800409c0, 0x04000007, 0x42000000, + 0x00004004, 0x42001000, 0x00000008, 0x59a81866, + 0x0401f0c3, 0x42006000, 0x0010260b, 0x4a035068, + 0x00000020, 0x50301000, 0x41784800, 0x4a03902d, + 0x00002000, 0x4200b000, 0x000001f4, 0x59c8002c, + 0x8c000530, 0x04000007, 0x8058b040, 0x040207fc, + 0x42000000, 0x00004003, 0x41781000, 0x0401f0b0, + 0x59c8002c, 0x82000500, 0xffe0ffff, 0x82080d00, + 0x001f0000, 0x80040540, 0x4803902c, 0x0401f82d, + 0x80244800, 0x82240580, 0x00000110, 0x040207fc, + 0x0401f8b2, 0x41784800, 0x0401f853, 0x59c80034, + 0x82080d00, 0x001f0000, 0x82000500, 0x001f0000, + 0x80040580, 0x04000006, 0x59a80067, 0x80000000, + 0x48035067, 0x40240000, 0x48035066, 0x80244800, + 0x82240580, 0x00000110, 0x040207f0, 0x80306000, + 0x82300580, 0x0010260d, 0x040207cf, 0x59a80867, + 0x800409c0, 0x04000006, 0x42000000, 0x00004004, + 0x42001000, 0x00000020, 0x59a81866, 0x59c8002c, 0x8400052a, 0x4803902c, 0x42000800, 0x0000007c, - 0x0201f800, 0x001010da, 0x0201f000, 0x00101cbd, - 0x42000000, 0x00600000, 0x80000040, 0x040207ff, - 0x1c01f000, 0x5a5a5a5a, 0xa5a5a5a5, 0x59a00c0b, - 0x800409c0, 0x02000000, 0x00101d01, 0x82040480, - 0x00000021, 0x02021000, 0x00101d01, 0x82040480, - 0x00000011, 0x04001003, 0x42000800, 0x00000010, - 0x59a00209, 0x59a01408, 0x900811c0, 0x80081540, - 0x59a00208, 0x59a01c07, 0x900c19c0, 0x800c1d40, - 0x0201f800, 0x001031a5, 0x04000006, 0x0201f800, - 0x001031c9, 0x4a01d808, 0x00102624, 0x1c01f000, - 0x4a034407, 0x00000002, 0x0201f000, 0x00101cfd, - 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x00101cf5, 0x59a00c0b, - 0x82040480, 0x00000011, 0x04001003, 0x42000800, + 0x0201f800, 0x001010db, 0x0201f000, 0x00101cbf, + 0x59c8002c, 0x82000500, 0xffff0000, 0x82080d00, + 0x0000ffff, 0x80040540, 0x4803902c, 0x480b9028, + 0x480b9029, 0x59a80068, 0x82004580, 0x00000004, + 0x04000003, 0x480b902a, 0x480b902b, 0x59c8002d, + 0x82000500, 0xfffffc00, 0x80240540, 0x4803902d, + 0x4200b000, 0x000001f4, 0x59c8002c, 0x82000500, + 0x18000000, 0x04000007, 0x8058b040, 0x040207fb, + 0x42000000, 0x00004003, 0x41781000, 0x0401f05c, + 0x4a03902e, 0x00000001, 0x4200b000, 0x000001f4, + 0x59c8002e, 0x8c000500, 0x04000006, 0x8058b040, + 0x040207fc, 0x42000000, 0x00004003, 0x0401f050, + 0x1c01f000, 0x41783800, 0x59c8002d, 0x82000500, + 0xfffffc00, 0x80240d40, 0x4807902d, 0x4200b000, + 0x000001f4, 0x59c8002c, 0x82000500, 0x18000000, + 0x04000007, 0x8058b040, 0x040207fb, 0x42000000, + 0x00004003, 0x41781000, 0x0401f03d, 0x59c81830, + 0x59c80030, 0x800c0d80, 0x040207fd, 0x80080d80, + 0x04000002, 0x801c3800, 0x59c82031, 0x59c80031, + 0x80100d80, 0x040207fd, 0x80080d80, 0x04000002, + 0x801c3800, 0x59a80068, 0x82004580, 0x00000004, + 0x0400001b, 0x42004000, 0x0000ffff, 0x59c82832, + 0x59c80032, 0x80140d80, 0x040207fd, 0x80080d80, + 0x04000002, 0x801c3800, 0x59c83033, 0x59c80033, + 0x80180d80, 0x040207fd, 0x80080d80, 0x04000002, + 0x801c3800, 0x59c80034, 0x59c80834, 0x80040d80, + 0x040207fd, 0x80080d80, 0x40200000, 0x80040d00, + 0x0400000c, 0x801c3800, 0x0401f00a, 0x59c80034, + 0x59c80834, 0x80040d80, 0x040207fd, 0x80080d80, + 0x82040d00, 0x000000ff, 0x04000002, 0x801c3800, + 0x801c39c0, 0x04000005, 0x59a80067, 0x801c0400, + 0x48035067, 0x48275066, 0x1c01f000, 0x48034207, + 0x48074407, 0x480b4208, 0x480f4408, 0x48134209, + 0x48174409, 0x59c8002c, 0x8400052a, 0x4803902c, + 0x42000800, 0x0000007c, 0x0201f800, 0x001010db, + 0x0201f000, 0x00101cc2, 0x42000000, 0x00600000, + 0x80000040, 0x040207ff, 0x1c01f000, 0x5a5a5a5a, + 0xa5a5a5a5, 0x59a00c0b, 0x800409c0, 0x02000000, + 0x00101d06, 0x82040480, 0x00000021, 0x02021000, + 0x00101d06, 0x82040480, 0x00000011, 0x04001003, + 0x42000800, 0x00000010, 0x59a00209, 0x59a01408, + 0x900811c0, 0x80081540, 0x59a00208, 0x59a01c07, + 0x900c19c0, 0x800c1d40, 0x0201f800, 0x001031af, + 0x04000006, 0x0201f800, 0x001031d3, 0x4a01d808, + 0x0010262e, 0x1c01f000, 0x4a034407, 0x00000002, + 0x0201f000, 0x00101d02, 0x4031d800, 0x58ef400a, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00101cfa, 0x59a00c0b, 0x82040480, 0x00000011, + 0x04001003, 0x42000800, 0x00000010, 0x59a0040c, + 0x59a0120c, 0x900811c0, 0x80081540, 0x59a0020a, + 0x59a01c09, 0x900c19c0, 0x800c1d40, 0x58ec0003, + 0x0201f800, 0x001031dc, 0x4a01d808, 0x00102649, + 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, + 0x82000580, 0x00000200, 0x02000000, 0x00101cfa, + 0x59a00c0b, 0x82040480, 0x00000011, 0x02001000, + 0x00101cbf, 0x82040c80, 0x00000010, 0x59a00209, + 0x59a01408, 0x900811c0, 0x80081540, 0x59a00208, + 0x59a01c07, 0x900c19c0, 0x800c1d40, 0x82081400, + 0x00000040, 0x58ec0003, 0x0201f800, 0x001031d3, + 0x4a01d808, 0x00102667, 0x1c01f000, 0x4031d800, + 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00101cfa, 0x59a0040b, 0x82000c80, 0x00000010, 0x59a0040c, 0x59a0120c, 0x900811c0, 0x80081540, 0x59a0020a, 0x59a01c09, 0x900c19c0, - 0x800c1d40, 0x58ec0003, 0x0201f800, 0x001031d2, - 0x4a01d808, 0x0010263f, 0x1c01f000, 0x4031d800, - 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x00101cf5, 0x59a00c0b, 0x82040480, - 0x00000011, 0x02001000, 0x00101cba, 0x82040c80, - 0x00000010, 0x59a00209, 0x59a01408, 0x900811c0, - 0x80081540, 0x59a00208, 0x59a01c07, 0x900c19c0, 0x800c1d40, 0x82081400, 0x00000040, 0x58ec0003, - 0x0201f800, 0x001031c9, 0x4a01d808, 0x0010265d, - 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x00101cf5, - 0x59a0040b, 0x82000c80, 0x00000010, 0x59a0040c, - 0x59a0120c, 0x900811c0, 0x80081540, 0x59a0020a, - 0x59a01c09, 0x900c19c0, 0x800c1d40, 0x82081400, - 0x00000040, 0x58ec0003, 0x0201f800, 0x001031d2, - 0x4a01d808, 0x00101cb3, 0x1c01f000, 0x48efc857, - 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, - 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, - 0x59a00407, 0x48034000, 0x480b4001, 0x480f4002, - 0x0201f800, 0x001031a5, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x00101cfd, 0x42000800, - 0x00000010, 0x0201f800, 0x001031c9, 0x4a01d808, - 0x00102692, 0x1c01f000, 0x4031d800, 0x58ef400a, - 0x58ee580c, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x00101cf5, 0x48efc857, 0x49a3c857, - 0x492fc857, 0x592c0a05, 0x80040910, 0x04020005, - 0x4a034407, 0x00000019, 0x0201f000, 0x00101cfd, - 0x4805d80b, 0x0401f00a, 0x4031d800, 0x58ef400a, - 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x00101cf5, 0x48efc857, 0x49a3c857, 0x48efc857, - 0x49a3c857, 0x58ec000b, 0x80000040, 0x04000012, - 0x4801d80b, 0x0201f800, 0x001031a5, 0x04020005, - 0x4a034407, 0x00000002, 0x0201f000, 0x00101cfd, - 0x42000800, 0x00000010, 0x58ec1006, 0x58ec1807, - 0x0201f800, 0x001031c9, 0x4a01d808, 0x001026a6, - 0x1c01f000, 0x58ee580c, 0x48efc857, 0x49a3c857, - 0x492fc857, 0x492f3004, 0x592c0405, 0x8400055e, - 0x48025c05, 0x4a01d808, 0x001026d0, 0x1c01f000, - 0x4d2c0000, 0x58ee580c, 0x48efc857, 0x49a3c857, - 0x492fc857, 0x592c0405, 0x8400051e, 0x48025c05, - 0x59a00000, 0x59a01001, 0x59a01802, 0x80081400, - 0x820c1c40, 0x00000000, 0x832c0400, 0x00000005, - 0x42000800, 0x00000010, 0x5c025800, 0x0201f000, - 0x001031d2, 0x8d0e1d0e, 0x04000005, 0x4a034407, - 0x00000001, 0x0201f000, 0x00101cfd, 0x836c0580, - 0x00000003, 0x04000005, 0x4a034407, 0x00000007, - 0x0201f000, 0x00101cfd, 0x59a0320c, 0x82183500, - 0x000000ff, 0x59a28c07, 0x0201f800, 0x00020319, - 0x02020000, 0x00101d01, 0x83440580, 0x000007fd, - 0x04000008, 0x0201f800, 0x00104165, 0x04000005, - 0x4a034407, 0x00000009, 0x0201f000, 0x00101cfd, - 0x0201f800, 0x001031a5, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x00101cfd, 0x801831c0, - 0x0400000a, 0x412c0800, 0x0201f800, 0x001031a5, - 0x04020005, 0x4a034407, 0x00000002, 0x0201f000, - 0x00101cfd, 0x40065800, 0x4a025c05, 0x00008000, - 0x497a5a05, 0x0201f800, 0x00108972, 0x04020005, - 0x4a034407, 0x00000003, 0x0201f000, 0x00101cfd, - 0x4a01d808, 0x00102723, 0x1c01f000, 0x592c0006, - 0x82000580, 0x01000000, 0x04020005, 0x4a034407, - 0x00000004, 0x0201f000, 0x00101cfd, 0x592c0407, - 0x82002d00, 0x0000ff00, 0x82000500, 0x000000ff, - 0x80000904, 0x80040800, 0x82040480, 0x00000006, - 0x04001003, 0x42000800, 0x00000005, 0x4c500000, - 0x4c540000, 0x4c580000, 0x832ca400, 0x00000007, - 0x4050a800, 0x4004b000, 0x0201f800, 0x0010ae19, - 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, - 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, - 0x832c0400, 0x00000007, 0x4c140000, 0x0201f800, - 0x001031d2, 0x5c002800, 0x801429c0, 0x04000003, - 0x4a01d808, 0x00102756, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x1c01f000, 0x4031d800, 0x58ef400a, - 0x58ee580c, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x00101cf5, 0x812e59c0, 0x02000800, - 0x0010032d, 0x592c0007, 0x82000500, 0xff000000, - 0x80000904, 0x800409c0, 0x02000000, 0x00101cba, - 0x4807c857, 0x82040480, 0x0000000e, 0x04001003, - 0x42000800, 0x0000000d, 0x592e5801, 0x812e59c0, - 0x02000800, 0x0010032d, 0x4c500000, 0x4c540000, - 0x4c580000, 0x832ca400, 0x00000006, 0x4050a800, - 0x4004b000, 0x0201f800, 0x0010ae19, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x58ec1006, 0x58ec1807, - 0x832c0400, 0x00000006, 0x0201f000, 0x001031d2, - 0x0201f800, 0x001031a5, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x00101cfd, 0x59a00c07, - 0x82040500, 0x0000ff00, 0x840001c0, 0x82001480, - 0x00000007, 0x02021000, 0x00101d01, 0x0c01f001, - 0x0010279b, 0x001027a2, 0x001027a9, 0x001027a9, - 0x001027a9, 0x001027ab, 0x001027b0, 0x42000800, - 0x0000000d, 0x42003800, 0x001027c4, 0x4a034000, - 0x0010b841, 0x0401f013, 0x42000800, 0x0000000d, - 0x42003800, 0x001027c4, 0x4a034000, 0x0010b84e, - 0x0401f00c, 0x0201f000, 0x00101d01, 0x42000800, - 0x00000008, 0x42003800, 0x001027d7, 0x0401f005, - 0x42000800, 0x00000004, 0x42003800, 0x00102821, - 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, - 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, - 0x832c0400, 0x00000006, 0x4c1c0000, 0x0201f800, - 0x001031c9, 0x5c003800, 0x481dd808, 0x1c01f000, - 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x00101cf5, - 0x4a035019, 0x00000001, 0x4200b000, 0x0000000d, - 0x59a0a800, 0x832ca400, 0x00000006, 0x0201f800, - 0x0010ae19, 0x0201f000, 0x00101cba, 0x4031d800, - 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x00101cf5, 0x832ca400, - 0x00000006, 0x50500000, 0x82001500, 0x000c0016, - 0x02020000, 0x00101d01, 0x82500c00, 0x00000003, - 0x50040000, 0x82001500, 0x00000001, 0x02020000, - 0x00101d01, 0x50500000, 0x82001500, 0x00000028, - 0x0400001d, 0x82081580, 0x00000028, 0x02020000, - 0x00101d01, 0x80500800, 0x50040000, 0x82001500, - 0x00000013, 0x82081580, 0x00000013, 0x02020000, - 0x00101d01, 0x80040800, 0x50040000, 0x82001500, - 0x00050000, 0x82081580, 0x00050000, 0x02020000, - 0x00101d01, 0x836c0580, 0x00000000, 0x04000012, - 0x599c0019, 0x8c00050e, 0x0402000f, 0x0201f000, - 0x00101d01, 0x80500800, 0x50040000, 0x82001500, - 0x00000013, 0x02020000, 0x00101d01, 0x80040800, - 0x50040000, 0x82001500, 0x00050000, 0x02020000, - 0x00101d01, 0x4200b000, 0x00000008, 0x4200a800, - 0x0010b839, 0x0201f800, 0x0010adef, 0x0201f000, - 0x00101cba, 0x4031d800, 0x58ef400a, 0x58ee580c, - 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x00101cf5, 0x4200b000, 0x00000004, 0x4200a800, - 0x0010bcc3, 0x832ca400, 0x00000006, 0x0201f800, - 0x0010adef, 0x850e1d50, 0x0201f000, 0x00101cba, - 0x0201f800, 0x001031a5, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x00101cfd, 0x832cac00, - 0x00000006, 0x59a00c07, 0x82040500, 0x0000ff00, - 0x840001c0, 0x82001480, 0x00000008, 0x02021000, - 0x00101d01, 0x0c01f001, 0x0010284e, 0x00102851, - 0x00102854, 0x00102854, 0x00102854, 0x00102856, - 0x00102854, 0x0010285e, 0x4200a000, 0x0010b841, - 0x0401f055, 0x4200a000, 0x0010b84e, 0x0401f052, - 0x0201f000, 0x00101d01, 0x4200b000, 0x00000008, - 0x40580800, 0x4200a000, 0x0010b839, 0x0201f800, - 0x0010adef, 0x0401f04d, 0x59a00a0b, 0x4a03420b, - 0x0000001c, 0x82040480, 0x0000001c, 0x02001000, - 0x00101d01, 0x4200b000, 0x0000000f, 0x4178a000, - 0x0201f800, 0x0010adf8, 0x832cac00, 0x00000006, - 0x4200b000, 0x00000004, 0x83a8a400, 0x0000001f, - 0x0201f800, 0x0010adef, 0x836c0580, 0x00000000, - 0x04000007, 0x4200b000, 0x00000004, 0x83a8a400, - 0x00000000, 0x0201f800, 0x0010adef, 0x492f4000, - 0x0201f800, 0x001031a5, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x00101cfd, 0x832cac00, - 0x00000006, 0x4200b000, 0x0000000f, 0x4178a000, - 0x0201f800, 0x0010adf8, 0x832cac00, 0x00000007, - 0x4200b000, 0x00000004, 0x83a8a400, 0x00000023, - 0x0201f800, 0x0010adef, 0x492f4001, 0x59a25800, - 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, - 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, - 0x832c0400, 0x00000006, 0x42000800, 0x0000000f, - 0x0201f800, 0x001031d2, 0x4a01d808, 0x001028b6, - 0x1c01f000, 0x4200b000, 0x0000000d, 0x40580800, - 0x0201f800, 0x0010ae19, 0x59a00208, 0x59a01408, + 0x0201f800, 0x001031dc, 0x4a01d808, 0x00101cb8, + 0x1c01f000, 0x48efc857, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, - 0x900001c0, 0x800c1d40, 0x832c0400, 0x00000006, - 0x0201f000, 0x001031d2, 0x4031d800, 0x58ef400a, - 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x00101cf5, 0x59a25801, 0x58ec1006, 0x58ec1807, - 0x832c0400, 0x00000006, 0x42000800, 0x0000000d, - 0x0201f000, 0x001031d2, 0x836c0580, 0x00000000, - 0x04020005, 0x4a034407, 0x00000007, 0x0201f000, - 0x00101cfd, 0x59a01407, 0x800811c0, 0x04020017, - 0x59c40801, 0x82040d00, 0x00018000, 0x82040580, - 0x00000000, 0x04020004, 0x4a034407, 0x00000000, - 0x0401f056, 0x82040580, 0x00008000, 0x04020004, - 0x4a034407, 0x00000001, 0x0401f050, 0x82040580, - 0x00010000, 0x02020800, 0x0010032d, 0x4a034407, - 0x00000003, 0x0401f049, 0x59a80073, 0x8c00053e, - 0x0400000d, 0x59a00a08, 0x82040580, 0x00000003, - 0x04000005, 0x82040580, 0x00000002, 0x02020000, - 0x00101d01, 0x42000000, 0x00000003, 0x40000800, - 0x0401f00b, 0x59a8006d, 0x8c000508, 0x04000005, - 0x42000000, 0x00000001, 0x40000800, 0x0401f004, - 0x59a00208, 0x48034002, 0x59a80837, 0x48035037, - 0x599c7819, 0x823c7d00, 0xffff1fff, 0x800000da, - 0x803c7d40, 0x483f3819, 0x0201f800, 0x00101420, - 0x0400000d, 0x0201f800, 0x0010142e, 0x0400000a, - 0x0201f800, 0x0010143c, 0x04000007, 0x0201f800, - 0x0010144a, 0x04000004, 0x48075037, 0x0201f000, - 0x00101d01, 0x82080580, 0x00000002, 0x04020017, - 0x59c40006, 0x84000500, 0x48038806, 0x0201f800, - 0x001063db, 0x497b8880, 0x42000000, 0x0010bc85, - 0x0201f800, 0x0010ad1d, 0x4803c856, 0x850e1d48, - 0x4a038808, 0x00000000, 0x4202d800, 0x00000004, - 0x4a038805, 0x00000001, 0x4a035043, 0x00000001, - 0x0201f800, 0x00100454, 0x0201f000, 0x00101cba, - 0x8d0e1d0e, 0x04000005, 0x4a034407, 0x00000001, - 0x0201f000, 0x00101cfd, 0x836c0580, 0x00000003, - 0x04000005, 0x4a034407, 0x00000007, 0x0201f000, - 0x00101cfd, 0x59a28c07, 0x59a0320c, 0x82183500, - 0x000000ff, 0x0201f800, 0x00020319, 0x02020000, - 0x00101d01, 0x83440580, 0x000007fd, 0x04000008, - 0x0201f800, 0x00104165, 0x04000005, 0x42000800, - 0x00000009, 0x0201f000, 0x00101cfd, 0x0201f800, - 0x001031a5, 0x04020005, 0x4a034407, 0x00000002, - 0x0201f000, 0x00101cfd, 0x497a5a05, 0x4a025c05, - 0x00008000, 0x0201f800, 0x00108987, 0x04020005, - 0x4a034407, 0x00000003, 0x0201f000, 0x00101cfd, - 0x4a01d808, 0x00102963, 0x1c01f000, 0x592c0006, - 0x82000d00, 0x0000ffff, 0x82000500, 0xffff0000, - 0x82000580, 0x01000000, 0x04020005, 0x4a034407, - 0x00000004, 0x0201f000, 0x00101cfd, 0x80040904, + 0x900001c0, 0x800c1d40, 0x59a00407, 0x48034000, + 0x480b4001, 0x480f4002, 0x0201f800, 0x001031af, + 0x04020005, 0x4a034407, 0x00000002, 0x0201f000, + 0x00101d02, 0x42000800, 0x00000010, 0x0201f800, + 0x001031d3, 0x4a01d808, 0x0010269c, 0x1c01f000, + 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, + 0x82000580, 0x00000200, 0x02000000, 0x00101cfa, + 0x48efc857, 0x49a3c857, 0x492fc857, 0x592c0a05, + 0x80040910, 0x04020005, 0x4a034407, 0x00000019, + 0x0201f000, 0x00101d02, 0x4805d80b, 0x0401f00a, + 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00101cfa, 0x48efc857, + 0x49a3c857, 0x48efc857, 0x49a3c857, 0x58ec000b, + 0x80000040, 0x04000012, 0x4801d80b, 0x0201f800, + 0x001031af, 0x04020005, 0x4a034407, 0x00000002, + 0x0201f000, 0x00101d02, 0x42000800, 0x00000010, + 0x58ec1006, 0x58ec1807, 0x0201f800, 0x001031d3, + 0x4a01d808, 0x001026b0, 0x1c01f000, 0x58ee580c, + 0x48efc857, 0x49a3c857, 0x492fc857, 0x492f3004, + 0x592c0405, 0x8400055e, 0x48025c05, 0x4a01d808, + 0x001026da, 0x1c01f000, 0x4d2c0000, 0x58ee580c, + 0x48efc857, 0x49a3c857, 0x492fc857, 0x592c0405, + 0x8400051e, 0x48025c05, 0x59a00000, 0x59a01001, + 0x59a01802, 0x80081400, 0x820c1c40, 0x00000000, + 0x832c0400, 0x00000005, 0x42000800, 0x00000010, + 0x5c025800, 0x0201f000, 0x001031dc, 0x8d0e1d0e, + 0x04000005, 0x4a034407, 0x00000001, 0x0201f000, + 0x00101d02, 0x836c0580, 0x00000003, 0x04000005, + 0x4a034407, 0x00000007, 0x0201f000, 0x00101d02, + 0x59a0320c, 0x82183500, 0x000000ff, 0x59a28c07, + 0x0201f800, 0x00020319, 0x02020000, 0x00101d06, + 0x83440580, 0x000007fd, 0x04000008, 0x0201f800, + 0x00104181, 0x04000005, 0x4a034407, 0x00000009, + 0x0201f000, 0x00101d02, 0x0201f800, 0x001031af, + 0x04020005, 0x4a034407, 0x00000002, 0x0201f000, + 0x00101d02, 0x801831c0, 0x0400000a, 0x412c0800, + 0x0201f800, 0x001031af, 0x04020005, 0x4a034407, + 0x00000002, 0x0201f000, 0x00101d02, 0x40065800, + 0x4a025c05, 0x00008000, 0x497a5a05, 0x0201f800, + 0x00108a2b, 0x04020005, 0x4a034407, 0x00000003, + 0x0201f000, 0x00101d02, 0x4a01d808, 0x0010272d, + 0x1c01f000, 0x592c0006, 0x82000580, 0x01000000, + 0x04020005, 0x4a034407, 0x00000004, 0x0201f000, + 0x00101d02, 0x592c0407, 0x82002d00, 0x0000ff00, + 0x82000500, 0x000000ff, 0x80000904, 0x80040800, + 0x82040480, 0x00000006, 0x04001003, 0x42000800, + 0x00000005, 0x4c500000, 0x4c540000, 0x4c580000, + 0x832ca400, 0x00000007, 0x4050a800, 0x4004b000, + 0x0201f800, 0x0010af0c, 0x59a00408, 0x59a01208, + 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, + 0x900c19c0, 0x800c1d40, 0x832c0400, 0x00000007, + 0x4c140000, 0x0201f800, 0x001031dc, 0x5c002800, + 0x801429c0, 0x04000003, 0x4a01d808, 0x00102760, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x1c01f000, + 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, + 0x82000580, 0x00000200, 0x02000000, 0x00101cfa, + 0x812e59c0, 0x02000800, 0x0010032d, 0x592c0007, + 0x82000500, 0xff000000, 0x80000904, 0x800409c0, + 0x02000000, 0x00101cbf, 0x4807c857, 0x82040480, + 0x0000000e, 0x04001003, 0x42000800, 0x0000000d, + 0x592e5801, 0x812e59c0, 0x02000800, 0x0010032d, 0x4c500000, 0x4c540000, 0x4c580000, 0x832ca400, 0x00000006, 0x4050a800, 0x4004b000, 0x0201f800, - 0x0010ae19, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x0010af0c, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x58ec1006, 0x58ec1807, 0x832c0400, 0x00000006, + 0x0201f000, 0x001031dc, 0x0201f800, 0x001031af, + 0x04020005, 0x4a034407, 0x00000002, 0x0201f000, + 0x00101d02, 0x59a00c07, 0x82040500, 0x0000ff00, + 0x840001c0, 0x82001480, 0x00000007, 0x02021000, + 0x00101d06, 0x0c01f001, 0x001027a5, 0x001027ac, + 0x001027b3, 0x001027b3, 0x001027b3, 0x001027b5, + 0x001027ba, 0x42000800, 0x0000000d, 0x42003800, + 0x001027ce, 0x4a034000, 0x0010b941, 0x0401f013, + 0x42000800, 0x0000000d, 0x42003800, 0x001027ce, + 0x4a034000, 0x0010b94e, 0x0401f00c, 0x0201f000, + 0x00101d06, 0x42000800, 0x00000008, 0x42003800, + 0x001027e1, 0x0401f005, 0x42000800, 0x00000004, + 0x42003800, 0x0010282b, 0x59a00208, 0x59a01408, + 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, + 0x900001c0, 0x800c1d40, 0x832c0400, 0x00000006, + 0x4c1c0000, 0x0201f800, 0x001031d3, 0x5c003800, + 0x481dd808, 0x1c01f000, 0x4031d800, 0x58ef400a, + 0x58ee580c, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00101cfa, 0x4a035019, 0x00000001, + 0x4200b000, 0x0000000d, 0x59a0a800, 0x832ca400, + 0x00000006, 0x0201f800, 0x0010af0c, 0x0201f000, + 0x00101cbf, 0x4031d800, 0x58ef400a, 0x58ee580c, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00101cfa, 0x832ca400, 0x00000006, 0x50500000, + 0x82001500, 0x000c0016, 0x02020000, 0x00101d06, + 0x82500c00, 0x00000003, 0x50040000, 0x82001500, + 0x00000001, 0x02020000, 0x00101d06, 0x50500000, + 0x82001500, 0x00000028, 0x0400001d, 0x82081580, + 0x00000028, 0x02020000, 0x00101d06, 0x80500800, + 0x50040000, 0x82001500, 0x00000013, 0x82081580, + 0x00000013, 0x02020000, 0x00101d06, 0x80040800, + 0x50040000, 0x82001500, 0x00050000, 0x82081580, + 0x00050000, 0x02020000, 0x00101d06, 0x836c0580, + 0x00000000, 0x04000012, 0x599c0019, 0x8c00050e, + 0x0402000f, 0x0201f000, 0x00101d06, 0x80500800, + 0x50040000, 0x82001500, 0x00000013, 0x02020000, + 0x00101d06, 0x80040800, 0x50040000, 0x82001500, + 0x00050000, 0x02020000, 0x00101d06, 0x4200b000, + 0x00000008, 0x4200a800, 0x0010b939, 0x0201f800, + 0x0010aee2, 0x0201f000, 0x00101cbf, 0x4031d800, + 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00101cfa, 0x4200b000, + 0x00000004, 0x4200a800, 0x0010bdc3, 0x832ca400, + 0x00000006, 0x0201f800, 0x0010aee2, 0x850e1d50, + 0x0201f000, 0x00101cbf, 0x0201f800, 0x001031af, + 0x04020005, 0x4a034407, 0x00000002, 0x0201f000, + 0x00101d02, 0x832cac00, 0x00000006, 0x59a00c07, + 0x82040500, 0x0000ff00, 0x840001c0, 0x82001480, + 0x00000008, 0x02021000, 0x00101d06, 0x0c01f001, + 0x00102858, 0x0010285b, 0x0010285e, 0x0010285e, + 0x0010285e, 0x00102860, 0x0010285e, 0x00102868, + 0x4200a000, 0x0010b941, 0x0401f055, 0x4200a000, + 0x0010b94e, 0x0401f052, 0x0201f000, 0x00101d06, + 0x4200b000, 0x00000008, 0x40580800, 0x4200a000, + 0x0010b939, 0x0201f800, 0x0010aee2, 0x0401f04d, + 0x59a00a0b, 0x4a03420b, 0x0000001c, 0x82040480, + 0x0000001c, 0x02001000, 0x00101d06, 0x4200b000, + 0x0000000f, 0x4178a000, 0x0201f800, 0x0010aeeb, + 0x832cac00, 0x00000006, 0x4200b000, 0x00000004, + 0x83a8a400, 0x0000001f, 0x0201f800, 0x0010aee2, + 0x836c0580, 0x00000000, 0x04000007, 0x4200b000, + 0x00000004, 0x83a8a400, 0x00000000, 0x0201f800, + 0x0010aee2, 0x492f4000, 0x0201f800, 0x001031af, + 0x04020005, 0x4a034407, 0x00000002, 0x0201f000, + 0x00101d02, 0x832cac00, 0x00000006, 0x4200b000, + 0x0000000f, 0x4178a000, 0x0201f800, 0x0010aeeb, + 0x832cac00, 0x00000007, 0x4200b000, 0x00000004, + 0x83a8a400, 0x00000023, 0x0201f800, 0x0010aee2, + 0x492f4001, 0x59a25800, 0x59a00208, 0x59a01408, + 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, + 0x900001c0, 0x800c1d40, 0x832c0400, 0x00000006, + 0x42000800, 0x0000000f, 0x0201f800, 0x001031dc, + 0x4a01d808, 0x001028c0, 0x1c01f000, 0x4200b000, + 0x0000000d, 0x40580800, 0x0201f800, 0x0010af0c, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, - 0x832c0400, 0x00000006, 0x0201f000, 0x001031d2, - 0x496fc857, 0x836c0580, 0x00000000, 0x04000005, - 0x4a034407, 0x0000001a, 0x0201f000, 0x00101cfd, - 0x0201f800, 0x00104716, 0x02020800, 0x00103916, - 0x42000800, 0x00000020, 0x59a00408, 0x59a01208, - 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, - 0x900c19c0, 0x800c1d40, 0x419c0000, 0x49a3c857, - 0x0201f800, 0x001031c9, 0x4a01d808, 0x001029a5, - 0x1c01f000, 0x4833c857, 0x59a80073, 0x8c00053e, - 0x02020800, 0x0010a5c1, 0x4031d800, 0x58ef400a, - 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x00101cf5, 0x599c0200, 0x800001c0, 0x02000000, - 0x00101d01, 0x59a8006d, 0x8c000504, 0x04020003, - 0x8c000506, 0x04000004, 0x599c0019, 0x8400050c, - 0x48033819, 0x0201f800, 0x001090a8, 0x59a8006d, - 0x8c000502, 0x04000004, 0x599c0017, 0x84000508, - 0x48033817, 0x850e1d20, 0x599c0017, 0x8c000508, - 0x04000003, 0x850e1d60, 0x0401f004, 0x8c00050a, - 0x02020000, 0x00101d01, 0x4803c857, 0x8c000504, - 0x04020004, 0x59c408a3, 0x84040d7a, 0x480788a3, - 0x8c000502, 0x04020004, 0x59c408a3, 0x84040d08, - 0x480788a3, 0x599c0c02, 0x8c000500, 0x04020004, - 0x8c000516, 0x04000012, 0x0401f001, 0x82041480, - 0x0000007f, 0x02021000, 0x00101d01, 0x82041400, - 0x00101b0a, 0x50081000, 0x82081500, 0x000000ff, - 0x8c000500, 0x04020006, 0x480b500f, 0x42000800, - 0x00000003, 0x0201f800, 0x00106134, 0x599c0019, - 0x42000800, 0x00001000, 0x50040800, 0x82040c80, - 0x24320001, 0x04001003, 0x84000546, 0x48033819, - 0x8c000506, 0x0400000f, 0x4a03b805, 0x90000000, - 0x59a81007, 0x8c081516, 0x0402000a, 0x42000800, - 0x00007600, 0x4a000805, 0xd0000000, 0x42000800, - 0x0010b895, 0x58041401, 0x84081542, 0x48080c01, - 0x8c00050e, 0x0402000b, 0x59a80805, 0x8c040d14, - 0x04000008, 0x42000800, 0x0010b839, 0x50040800, - 0x82040d00, 0x00000028, 0x02020000, 0x00101d01, - 0x82000500, 0x00000030, 0x04000003, 0x80000108, - 0x0401f003, 0x42000000, 0x00000002, 0x48039040, - 0x42000800, 0x00000002, 0x82000400, 0x00102b07, - 0x50001000, 0x0201f800, 0x00106134, 0x599c0201, - 0x82000c80, 0x00000100, 0x02001000, 0x00101d01, - 0x82000c80, 0x00000841, 0x02021000, 0x00101d01, - 0x82000500, 0x00000007, 0x02020000, 0x00101d01, - 0x599c0401, 0x80000540, 0x02000000, 0x00101d01, - 0x599c0409, 0x599c0c07, 0x80040c80, 0x02021000, - 0x00101d01, 0x80000040, 0x02000000, 0x00101d01, - 0x599c0209, 0x599c0a07, 0x80040c80, 0x02021000, - 0x00101d01, 0x80000040, 0x02000000, 0x00101d01, - 0x0201f800, 0x00104b9e, 0x0201f800, 0x001044c0, - 0x599c0201, 0x48035004, 0x0201f800, 0x00101081, - 0x599c020a, 0x800001c0, 0x04000003, 0x48035031, - 0x0401f003, 0x4a035031, 0x000000c8, 0x8d0e1d20, - 0x04000004, 0x0201f800, 0x00105973, 0x417a5000, - 0x599c0003, 0x599c0804, 0x9c0001c0, 0x9c0409c0, - 0x48035002, 0x48075003, 0x599c1017, 0x8c08151c, - 0x04000006, 0x599c0005, 0x599c0806, 0x9c0001c0, - 0x9c0409c0, 0x0401f003, 0x82000500, 0xf0ffffff, - 0x48035000, 0x48075001, 0x42001000, 0x0010b841, - 0x48001000, 0x48041001, 0x42001000, 0x0010b84e, - 0x48001000, 0x48041001, 0x59a8006d, 0x8c000508, - 0x04020017, 0x8c00050a, 0x04020023, 0x599c1019, - 0x82081500, 0x0000e000, 0x82080580, 0x00000000, - 0x0402000c, 0x4a035037, 0x00000000, 0x42000000, - 0x00000001, 0x0201f800, 0x0010169d, 0x42000000, - 0x00000001, 0x0201f800, 0x00101623, 0x0401f030, - 0x82080580, 0x00002000, 0x0402000c, 0x4a035037, - 0x00000001, 0x42000000, 0x00000000, 0x0201f800, - 0x0010169d, 0x42000000, 0x00000000, 0x0201f800, - 0x00101623, 0x0401f022, 0x82080580, 0x00004000, - 0x04020006, 0x4a035037, 0x00000002, 0x4a035043, - 0x00000001, 0x0401f01a, 0x82080580, 0x00006000, - 0x02020000, 0x00101d01, 0x59a80873, 0x8c040d3e, - 0x04020009, 0x59a80847, 0x82040d80, 0x01391077, - 0x04020005, 0x59e00813, 0x8c040d00, 0x02020000, - 0x00101d01, 0x4a035037, 0x00000003, 0x42000000, - 0x00000002, 0x0201f800, 0x0010169d, 0x42000000, - 0x00000002, 0x0201f800, 0x00101623, 0x599c1019, - 0x82081500, 0x0000e000, 0x599c0019, 0x8c000520, - 0x0400000d, 0x42000000, 0x00000004, 0x42000800, - 0x00000040, 0x0201f800, 0x0010173f, 0x42000000, - 0x00000010, 0x42000800, 0x000000c0, 0x0201f800, - 0x0010173f, 0x4a035013, 0x0000aaaa, 0x599c1018, - 0x82081500, 0x00000030, 0x59a8006a, 0x80000540, - 0x0400000c, 0x82080580, 0x00000000, 0x02000000, - 0x00101d01, 0x599c1018, 0x82081500, 0xffffffcf, - 0x82081540, 0x00000010, 0x480b3818, 0x0401f010, - 0x82080d80, 0x00000000, 0x04000007, 0x82080d80, - 0x00000010, 0x0400000a, 0x82080d80, 0x00000020, - 0x04020002, 0x48075013, 0x0201f800, 0x0010326c, - 0x04000008, 0x4803c856, 0x850e1d46, 0x0201f800, - 0x00101401, 0x59a8001f, 0x80040540, 0x4803501f, - 0x49f3c857, 0x42001000, 0x00104632, 0x0201f800, - 0x001057cd, 0x42001000, 0x00104621, 0x0201f800, - 0x0010591a, 0x4a038805, 0xffffffff, 0x4a03c014, - 0x00400040, 0x4a03c013, 0x00400000, 0x0201f800, - 0x00104092, 0x59a0001e, 0x84000540, 0x4803401e, - 0x49f3c857, 0x0201f000, 0x00101cba, 0x00000018, - 0x0000000c, 0x00000018, 0x00000020, 0x836c0580, - 0x00000000, 0x04020005, 0x42000800, 0x00000007, - 0x0201f000, 0x00101cfd, 0x42000800, 0x00000020, + 0x832c0400, 0x00000006, 0x0201f000, 0x001031dc, + 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00101cfa, 0x59a25801, + 0x58ec1006, 0x58ec1807, 0x832c0400, 0x00000006, + 0x42000800, 0x0000000d, 0x0201f000, 0x001031dc, + 0x836c0580, 0x00000000, 0x04020005, 0x4a034407, + 0x00000007, 0x0201f000, 0x00101d02, 0x59a01407, + 0x800811c0, 0x04020017, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04020004, + 0x4a034407, 0x00000000, 0x0401f056, 0x82040580, + 0x00008000, 0x04020004, 0x4a034407, 0x00000001, + 0x0401f050, 0x82040580, 0x00010000, 0x02020800, + 0x0010032d, 0x4a034407, 0x00000003, 0x0401f049, + 0x59a80073, 0x8c00053e, 0x0400000d, 0x59a00a08, + 0x82040580, 0x00000003, 0x04000005, 0x82040580, + 0x00000002, 0x02020000, 0x00101d06, 0x42000000, + 0x00000003, 0x40000800, 0x0401f00b, 0x59a8006d, + 0x8c000508, 0x04000005, 0x42000000, 0x00000001, + 0x40000800, 0x0401f004, 0x59a00208, 0x48034002, + 0x59a80837, 0x48035037, 0x599c7819, 0x823c7d00, + 0xffff1fff, 0x800000da, 0x803c7d40, 0x483f3819, + 0x0201f800, 0x00101421, 0x0400000d, 0x0201f800, + 0x0010142f, 0x0400000a, 0x0201f800, 0x0010143d, + 0x04000007, 0x0201f800, 0x0010144b, 0x04000004, + 0x48075037, 0x0201f000, 0x00101d06, 0x82080580, + 0x00000002, 0x04020017, 0x59c40006, 0x84000500, + 0x48038806, 0x0201f800, 0x00106480, 0x497b8880, + 0x42000000, 0x0010bd85, 0x0201f800, 0x0010ae10, + 0x4803c856, 0x850e1d48, 0x4a038808, 0x00000000, + 0x4202d800, 0x00000004, 0x4a038805, 0x00000001, + 0x4a035043, 0x00000001, 0x0201f800, 0x00100454, + 0x0201f000, 0x00101cbf, 0x8d0e1d0e, 0x04000005, + 0x4a034407, 0x00000001, 0x0201f000, 0x00101d02, + 0x836c0580, 0x00000003, 0x04000005, 0x4a034407, + 0x00000007, 0x0201f000, 0x00101d02, 0x59a28c07, + 0x59a0320c, 0x82183500, 0x000000ff, 0x0201f800, + 0x00020319, 0x02020000, 0x00101d06, 0x83440580, + 0x000007fd, 0x04000008, 0x0201f800, 0x00104181, + 0x04000005, 0x42000800, 0x00000009, 0x0201f000, + 0x00101d02, 0x0201f800, 0x001031af, 0x04020005, + 0x4a034407, 0x00000002, 0x0201f000, 0x00101d02, + 0x497a5a05, 0x4a025c05, 0x00008000, 0x0201f800, + 0x00108a40, 0x04020005, 0x4a034407, 0x00000003, + 0x0201f000, 0x00101d02, 0x4a01d808, 0x0010296d, + 0x1c01f000, 0x592c0006, 0x82000d00, 0x0000ffff, + 0x82000500, 0xffff0000, 0x82000580, 0x01000000, + 0x04020005, 0x4a034407, 0x00000004, 0x0201f000, + 0x00101d02, 0x80040904, 0x4c500000, 0x4c540000, + 0x4c580000, 0x832ca400, 0x00000006, 0x4050a800, + 0x4004b000, 0x0201f800, 0x0010af0c, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x59a00208, 0x59a01408, + 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, + 0x900001c0, 0x800c1d40, 0x832c0400, 0x00000006, + 0x0201f000, 0x001031dc, 0x496fc857, 0x836c0580, + 0x00000000, 0x04000005, 0x4a034407, 0x0000001a, + 0x0201f000, 0x00101d02, 0x0201f800, 0x00104755, + 0x02020800, 0x00103929, 0x42000800, 0x00000020, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, - 0x419c0000, 0x0201f000, 0x001031d2, 0x8d0e1d0e, - 0x04000005, 0x4a034407, 0x00000001, 0x0201f000, - 0x00101cfd, 0x0201f800, 0x00104716, 0x04020005, - 0x4a034407, 0x00000016, 0x0201f000, 0x00101cfd, - 0x59a80056, 0x8c000500, 0x04000011, 0x4a034407, - 0x00000000, 0x42000800, 0x00000020, 0x59a00408, - 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, - 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x42000000, - 0x0010c1c7, 0x0201f000, 0x001031d2, 0x4a034407, - 0x00000001, 0x4200b000, 0x00000020, 0x4200a800, - 0x0010c1c7, 0x4200a000, 0xffffffff, 0x4450a800, - 0x8054a800, 0x8058b040, 0x040207fd, 0x4d440000, - 0x4d340000, 0x42028800, 0xffffffff, 0x42002000, - 0xffffffff, 0x42003000, 0x00000001, 0x42003800, - 0x00000001, 0x42001800, 0x0010c1c7, 0x59a8100f, - 0x82081500, 0x000000ff, 0x40180000, 0x0c01f001, - 0x00102b60, 0x00102b63, 0x00102b67, 0x00102b6b, - 0x82102500, 0xffffff00, 0x0401f014, 0x82102500, - 0xffff00ff, 0x840811c0, 0x0401f010, 0x82102500, - 0xff00ffff, 0x900811c0, 0x0401f00c, 0x82102500, - 0x00ffffff, 0x9c0801c0, 0x80102540, 0x44101800, - 0x42003000, 0xffffffff, 0x42002000, 0xffffffff, - 0x800c1800, 0x0401f003, 0x40080000, 0x80102540, - 0x81468800, 0x83442c80, 0x0000007f, 0x04021014, - 0x4c080000, 0x4c0c0000, 0x4c180000, 0x4c1c0000, - 0x0201f800, 0x00020319, 0x5c003800, 0x5c003000, - 0x5c001800, 0x5c001000, 0x040207f2, 0x0201f800, - 0x00104178, 0x040207ef, 0x80183000, 0x801c3800, - 0x59341202, 0x40180000, 0x0c01f7ce, 0x82100580, - 0xffffffff, 0x04000002, 0x44101800, 0x42001800, - 0x0010c1c7, 0x500c0000, 0x82000500, 0xffffff00, - 0x801c0540, 0x44001800, 0x5c026800, 0x5c028800, + 0x419c0000, 0x49a3c857, 0x0201f800, 0x001031d3, + 0x4a01d808, 0x001029af, 0x1c01f000, 0x4833c857, + 0x59a80073, 0x8c00053e, 0x02020800, 0x0010a6b4, + 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00101cfa, 0x599c0200, + 0x800001c0, 0x02000000, 0x00101d06, 0x59a8006d, + 0x8c000504, 0x04020003, 0x8c000506, 0x04000004, + 0x599c0019, 0x8400050c, 0x48033819, 0x0201f800, + 0x00109161, 0x59a8006d, 0x8c000502, 0x04000004, + 0x599c0017, 0x84000508, 0x48033817, 0x850e1d20, + 0x599c0017, 0x8c000508, 0x04000003, 0x850e1d60, + 0x0401f008, 0x8c00050a, 0x02020000, 0x00101d06, + 0x59a80806, 0x8c040d16, 0x02020000, 0x00101d06, + 0x4803c857, 0x8c000504, 0x04020004, 0x59c408a3, + 0x84040d7a, 0x480788a3, 0x8c000502, 0x04020004, + 0x59c408a3, 0x84040d08, 0x480788a3, 0x599c0c02, + 0x8c000500, 0x04020004, 0x8c000516, 0x04000012, + 0x0401f001, 0x82041480, 0x0000007f, 0x02021000, + 0x00101d06, 0x82041400, 0x00101b0f, 0x50081000, + 0x82081500, 0x000000ff, 0x8c000500, 0x04020006, + 0x480b500f, 0x42000800, 0x00000003, 0x0201f800, + 0x001061d9, 0x599c0019, 0x42000800, 0x00001000, + 0x50040800, 0x82040c80, 0x24320001, 0x04001003, + 0x84000546, 0x48033819, 0x8c000506, 0x0400000f, + 0x4a03b805, 0x90000000, 0x59a81007, 0x8c081516, + 0x0402000a, 0x42000800, 0x00007600, 0x4a000805, + 0xd0000000, 0x42000800, 0x0010b995, 0x58041401, + 0x84081542, 0x48080c01, 0x8c00050e, 0x04020007, + 0x4c000000, 0x0201f800, 0x00103314, 0x5c000000, + 0x02020000, 0x00101d06, 0x82000500, 0x00000030, + 0x04000003, 0x80000108, 0x0401f003, 0x42000000, + 0x00000002, 0x48039040, 0x42000800, 0x00000002, + 0x82000400, 0x00102b11, 0x50001000, 0x0201f800, + 0x001061d9, 0x599c0201, 0x82000c80, 0x00000100, + 0x02001000, 0x00101d06, 0x82000c80, 0x00000841, + 0x02021000, 0x00101d06, 0x82000500, 0x00000007, + 0x02020000, 0x00101d06, 0x599c0401, 0x80000540, + 0x02000000, 0x00101d06, 0x599c0409, 0x599c0c07, + 0x80040c80, 0x02021000, 0x00101d06, 0x80000040, + 0x02000000, 0x00101d06, 0x599c0209, 0x599c0a07, + 0x80040c80, 0x02021000, 0x00101d06, 0x80000040, + 0x02000000, 0x00101d06, 0x0201f800, 0x00104bdd, + 0x0201f800, 0x001044ff, 0x599c0201, 0x48035004, + 0x0201f800, 0x00101082, 0x599c020a, 0x800001c0, + 0x04000003, 0x48035031, 0x0401f003, 0x4a035031, + 0x000000c8, 0x8d0e1d20, 0x04000004, 0x0201f800, + 0x00105a18, 0x417a5000, 0x599c0003, 0x599c0804, + 0x9c0001c0, 0x9c0409c0, 0x48035002, 0x48075003, + 0x599c1017, 0x8c08151c, 0x04000006, 0x599c0005, + 0x599c0806, 0x9c0001c0, 0x9c0409c0, 0x0401f003, + 0x82000500, 0xf0ffffff, 0x48035000, 0x48075001, + 0x42001000, 0x0010b941, 0x48001000, 0x48041001, + 0x42001000, 0x0010b94e, 0x48001000, 0x48041001, + 0x59a8006d, 0x8c000508, 0x04020017, 0x8c00050a, + 0x04020023, 0x599c1019, 0x82081500, 0x0000e000, + 0x82080580, 0x00000000, 0x0402000c, 0x4a035037, + 0x00000000, 0x42000000, 0x00000001, 0x0201f800, + 0x0010169e, 0x42000000, 0x00000001, 0x0201f800, + 0x00101624, 0x0401f030, 0x82080580, 0x00002000, + 0x0402000c, 0x4a035037, 0x00000001, 0x42000000, + 0x00000000, 0x0201f800, 0x0010169e, 0x42000000, + 0x00000000, 0x0201f800, 0x00101624, 0x0401f022, + 0x82080580, 0x00004000, 0x04020006, 0x4a035037, + 0x00000002, 0x4a035043, 0x00000001, 0x0401f01a, + 0x82080580, 0x00006000, 0x02020000, 0x00101d06, + 0x59a80873, 0x8c040d3e, 0x04020009, 0x59a80847, + 0x82040d80, 0x01391077, 0x04020005, 0x59e00813, + 0x8c040d00, 0x02020000, 0x00101d06, 0x4a035037, + 0x00000003, 0x42000000, 0x00000002, 0x0201f800, + 0x0010169e, 0x42000000, 0x00000002, 0x0201f800, + 0x00101624, 0x599c1019, 0x82081500, 0x0000e000, + 0x599c0019, 0x8c000520, 0x0400000d, 0x42000000, + 0x00000004, 0x42000800, 0x00000040, 0x0201f800, + 0x00101740, 0x42000000, 0x00000010, 0x42000800, + 0x000000c0, 0x0201f800, 0x00101740, 0x4a035013, + 0x0000aaaa, 0x599c1018, 0x82081500, 0x00000030, + 0x59a8006a, 0x80000540, 0x0400000c, 0x82080580, + 0x00000000, 0x02000000, 0x00101d06, 0x599c1018, + 0x82081500, 0xffffffcf, 0x82081540, 0x00000010, + 0x480b3818, 0x0401f010, 0x82080d80, 0x00000000, + 0x04000007, 0x82080d80, 0x00000010, 0x0400000a, + 0x82080d80, 0x00000020, 0x04020002, 0x48075013, + 0x0201f800, 0x00103276, 0x04000008, 0x4803c856, + 0x850e1d46, 0x0201f800, 0x00101402, 0x59a8001f, + 0x80040540, 0x4803501f, 0x49f3c857, 0x42001000, + 0x00104671, 0x0201f800, 0x00105872, 0x42001000, + 0x00104660, 0x0201f800, 0x001059bf, 0x4a038805, + 0xffffffff, 0x4a03c014, 0x00400040, 0x4a03c013, + 0x00400000, 0x0201f800, 0x001040ac, 0x59a0001e, + 0x84000540, 0x4803401e, 0x49f3c857, 0x0201f000, + 0x00101cbf, 0x00000018, 0x0000000c, 0x00000018, + 0x00000020, 0x836c0580, 0x00000000, 0x04020005, + 0x42000800, 0x00000007, 0x0201f000, 0x00101d02, 0x42000800, 0x00000020, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, - 0x900c19c0, 0x800c1d40, 0x42000000, 0x0010c1c7, - 0x0201f000, 0x001031d2, 0x59a28c07, 0x59a0020c, - 0x8c000500, 0x0400000e, 0x59a01209, 0x59a00409, - 0x82000500, 0x000000ff, 0x900001c0, 0x80081540, - 0x41784000, 0x0201f800, 0x001040f8, 0x04000008, - 0x48034407, 0x0201f000, 0x00101d01, 0x0201f800, - 0x00020319, 0x02020000, 0x00101d01, 0x0201f800, - 0x001031a5, 0x04020005, 0x4a034407, 0x00000002, - 0x0201f000, 0x00101cfd, 0x59a0020c, 0x8c000500, - 0x04000005, 0x0201f800, 0x00104178, 0x02020000, - 0x00103276, 0x59a0020c, 0x8c000502, 0x04000019, - 0x83440480, 0x000007f0, 0x04021016, 0x0201f800, - 0x00104181, 0x04020013, 0x497a5a05, 0x4a025c05, - 0x00008000, 0x0201f800, 0x00108958, 0x04020005, - 0x4a034407, 0x00000003, 0x0201f000, 0x00101cfd, - 0x4a01d808, 0x00102be3, 0x1c01f000, 0x59a28c07, - 0x0201f800, 0x00020319, 0x02020000, 0x00101d01, - 0x4c580000, 0x4c500000, 0x4c540000, 0x4200b000, - 0x0000000a, 0x4134a000, 0x832e5c00, 0x00000002, - 0x412ca800, 0x0201f800, 0x0010adef, 0x832cac00, - 0x00000006, 0x4054a000, 0x4200b000, 0x00000004, - 0x0201f800, 0x0010ae19, 0x5c00a800, 0x5c00a000, - 0x5c00b000, 0x592c0802, 0x82040500, 0x00ff00ff, - 0x900001c0, 0x82041500, 0xff00ff00, 0x80080540, - 0x48025802, 0x592c0801, 0x82040500, 0x00ff00ff, - 0x900001c0, 0x82041500, 0xff00ff00, 0x80080540, - 0x48025801, 0x42000800, 0x0000000a, 0x59a00408, - 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, - 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x412c0000, - 0x0201f000, 0x001031d2, 0x496fc857, 0x496f4407, - 0x59a80873, 0x8c040d3e, 0x02000000, 0x00101cba, - 0x59a81073, 0x82081500, 0x00000097, 0x59a81874, - 0x59340400, 0x82000580, 0x00000404, 0x04020002, - 0x84081546, 0x480b4408, 0x0201f000, 0x00101cba, - 0x59a28c07, 0x0201f800, 0x00020319, 0x02020000, - 0x00101d01, 0x836c0580, 0x00000003, 0x04000005, - 0x4a034407, 0x00000007, 0x0201f000, 0x00101cfd, - 0x83340c00, 0x00000006, 0x59a0020c, 0x8c000500, - 0x04000003, 0x83340c00, 0x00000008, 0x58040001, - 0x4803440a, 0x900001c0, 0x4803420a, 0x50040000, - 0x48034408, 0x900001c0, 0x48034208, 0x59340200, - 0x48034407, 0x0201f000, 0x00101cba, 0x8d0e1d0e, - 0x04000005, 0x4a034407, 0x00000001, 0x0201f000, - 0x00101cfd, 0x59a0220c, 0x8c102500, 0x0402002e, - 0x8c102506, 0x04020006, 0x59a03209, 0x82180480, - 0x00000003, 0x02021000, 0x00101d01, 0x59a28c07, - 0x0201f800, 0x00020319, 0x02020000, 0x00101d01, - 0x0201f800, 0x00104165, 0x04000005, 0x4a034407, - 0x00000009, 0x0201f000, 0x00101cfd, 0x0201f800, - 0x001031a5, 0x04020005, 0x4a034407, 0x00000002, - 0x0201f000, 0x00101cfd, 0x59a0220c, 0x8c102506, - 0x04000004, 0x59343002, 0x82183500, 0x00ffffff, + 0x900c19c0, 0x800c1d40, 0x419c0000, 0x0201f000, + 0x001031dc, 0x8d0e1d0e, 0x04000005, 0x4a034407, + 0x00000001, 0x0201f000, 0x00101d02, 0x0201f800, + 0x00104755, 0x04020005, 0x4a034407, 0x00000016, + 0x0201f000, 0x00101d02, 0x59a80056, 0x8c000500, + 0x04000011, 0x4a034407, 0x00000000, 0x42000800, + 0x00000020, 0x59a00408, 0x59a01208, 0x900811c0, + 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, + 0x800c1d40, 0x42000000, 0x0010c2c7, 0x0201f000, + 0x001031dc, 0x4a034407, 0x00000001, 0x4200b000, + 0x00000020, 0x4200a800, 0x0010c2c7, 0x4200a000, + 0xffffffff, 0x4450a800, 0x8054a800, 0x8058b040, + 0x040207fd, 0x4d440000, 0x4d340000, 0x42028800, + 0xffffffff, 0x42002000, 0xffffffff, 0x42003000, + 0x00000001, 0x42003800, 0x00000001, 0x42001800, + 0x0010c2c7, 0x59a8100f, 0x82081500, 0x000000ff, + 0x40180000, 0x0c01f001, 0x00102b6a, 0x00102b6d, + 0x00102b71, 0x00102b75, 0x82102500, 0xffffff00, + 0x0401f014, 0x82102500, 0xffff00ff, 0x840811c0, + 0x0401f010, 0x82102500, 0xff00ffff, 0x900811c0, + 0x0401f00c, 0x82102500, 0x00ffffff, 0x9c0801c0, + 0x80102540, 0x44101800, 0x42003000, 0xffffffff, + 0x42002000, 0xffffffff, 0x800c1800, 0x0401f003, + 0x40080000, 0x80102540, 0x81468800, 0x83442c80, + 0x0000007f, 0x04021014, 0x4c080000, 0x4c0c0000, + 0x4c180000, 0x4c1c0000, 0x0201f800, 0x00020319, + 0x5c003800, 0x5c003000, 0x5c001800, 0x5c001000, + 0x040207f2, 0x0201f800, 0x00104194, 0x040207ef, + 0x80183000, 0x801c3800, 0x59341202, 0x40180000, + 0x0c01f7ce, 0x82100580, 0xffffffff, 0x04000002, + 0x44101800, 0x42001800, 0x0010c2c7, 0x500c0000, + 0x82000500, 0xffffff00, 0x801c0540, 0x44001800, + 0x5c026800, 0x5c028800, 0x42000800, 0x00000020, + 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, + 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, + 0x42000000, 0x0010c2c7, 0x0201f000, 0x001031dc, + 0x59a28c07, 0x59a0020c, 0x8c000500, 0x0400000e, + 0x59a01209, 0x59a00409, 0x82000500, 0x000000ff, + 0x900001c0, 0x80081540, 0x41784000, 0x0201f800, + 0x00104112, 0x04000008, 0x48034407, 0x0201f000, + 0x00101d06, 0x0201f800, 0x00020319, 0x02020000, + 0x00101d06, 0x0201f800, 0x001031af, 0x04020005, + 0x4a034407, 0x00000002, 0x0201f000, 0x00101d02, + 0x59a0020c, 0x8c000500, 0x04000005, 0x0201f800, + 0x00104194, 0x02020000, 0x00103280, 0x59a0020c, + 0x8c000502, 0x04000019, 0x83440480, 0x000007f0, + 0x04021016, 0x0201f800, 0x0010419d, 0x04020013, 0x497a5a05, 0x4a025c05, 0x00008000, 0x0201f800, - 0x0010891a, 0x04020005, 0x4a034407, 0x00000003, - 0x0201f000, 0x00101cfd, 0x4a01d808, 0x00102cd7, + 0x00108a11, 0x04020005, 0x4a034407, 0x00000003, + 0x0201f000, 0x00101d02, 0x4a01d808, 0x00102bed, 0x1c01f000, 0x59a28c07, 0x0201f800, 0x00020319, - 0x02020000, 0x00101d01, 0x0201f800, 0x00104165, - 0x04000005, 0x4a034407, 0x00000009, 0x0201f000, - 0x00101cfd, 0x0201f800, 0x001031a5, 0x04020005, - 0x4a034407, 0x00000002, 0x0201f000, 0x00101cfd, - 0x497a5a05, 0x4a025c05, 0x00008000, 0x0201f800, - 0x001031a5, 0x04020005, 0x4a034407, 0x00000002, - 0x0201f000, 0x00101cfd, 0x592e5800, 0x0201f800, - 0x0010892f, 0x04020005, 0x4a034407, 0x00000003, - 0x0201f000, 0x00101cfd, 0x4a01d808, 0x00102ca9, - 0x1c01f000, 0x592c2806, 0x82140d80, 0x01000000, - 0x04020005, 0x4a034407, 0x00000004, 0x0201f000, - 0x00101cfd, 0x42000800, 0x00000008, 0x59a00208, - 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, - 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x832c0400, - 0x00000006, 0x0201f800, 0x001031d2, 0x8c142d00, - 0x04000003, 0x4a01d808, 0x00102cc4, 0x1c01f000, - 0x4031d800, 0x58ef400a, 0x58ee580d, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x00101cf5, - 0x812e59c0, 0x02000800, 0x0010032d, 0x42000800, - 0x00000008, 0x832c0400, 0x00000006, 0x58ec1006, - 0x58ec1807, 0x0201f000, 0x001031d2, 0x592c0006, - 0x82000580, 0x01000000, 0x04020005, 0x4a034407, - 0x00000004, 0x0201f000, 0x00101cfd, 0x59a00208, - 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, - 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x42000800, - 0x00000006, 0x832c0400, 0x00000007, 0x0201f000, - 0x001031d2, 0x59a00a0b, 0x800409c0, 0x02000000, - 0x00101d01, 0x82040480, 0x00000081, 0x04001003, - 0x42000800, 0x00000080, 0x59c40085, 0x59881004, - 0x80081400, 0x480b1004, 0x497b8885, 0x59c400b1, - 0x48031022, 0x59c400b2, 0x48031021, 0x59c400a2, - 0x48031023, 0x598810b7, 0x598800b8, 0x80081400, - 0x598800b9, 0x80081400, 0x598800ba, 0x80081400, - 0x5988011d, 0x80081400, 0x598800bb, 0x80081400, - 0x480b1024, 0x59a00208, 0x59a01408, 0x900001c0, - 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, - 0x800c1d40, 0x83880400, 0x00000000, 0x0201f800, - 0x001031d2, 0x4a01d808, 0x00102d1c, 0x1c01f000, - 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x00101cf5, 0x59a0020c, - 0x8c000500, 0x04000008, 0x83880400, 0x00000000, - 0x4803c840, 0x4a03c842, 0x00000006, 0x04011000, - 0x497b8885, 0x4a034208, 0x00000080, 0x0201f000, - 0x00101cba, 0x8d0e1d0e, 0x04000005, 0x4a034407, - 0x00000001, 0x0201f000, 0x00101cfd, 0x0201f800, - 0x001031a5, 0x04020005, 0x4a034407, 0x00000002, - 0x0201f000, 0x00101cfd, 0x497a5a05, 0x4a025c05, - 0x00008000, 0x59a00407, 0x800001c0, 0x02000000, - 0x00101d01, 0x82001580, 0x000000ff, 0x04000005, - 0x82001480, 0x00000004, 0x02021000, 0x00101d01, - 0x40001000, 0x0201f800, 0x00101a3d, 0x04020005, - 0x4a034407, 0x00000003, 0x0201f000, 0x00101cfd, - 0x4a01d808, 0x00102d57, 0x1c01f000, 0x592c0006, - 0x82000580, 0x01000000, 0x02020000, 0x00101cba, - 0x4a034407, 0x00000004, 0x0201f000, 0x00101cfd, - 0x59a01407, 0x8c081508, 0x04020007, 0x8d0e1d0e, - 0x04000005, 0x4a034407, 0x00000001, 0x0201f000, - 0x00101cfd, 0x59a01c08, 0x820c0480, 0x00001000, - 0x02021000, 0x00101d01, 0x497b2804, 0x497b2805, - 0x497b2826, 0x497b2827, 0x497b2829, 0x497b282a, - 0x497b282c, 0x497b282d, 0x4803c856, 0x850e1d06, - 0x8c081500, 0x04000005, 0x4803c856, 0x830e1d40, - 0x00000011, 0x0401f004, 0x8c081506, 0x04000002, - 0x850e1d42, 0x850e1d0a, 0x4202d800, 0x00000001, - 0x82081500, 0x000000e0, 0x8008010a, 0x0c020038, - 0x0201f800, 0x00104716, 0x0402000b, 0x4a035014, - 0x00000001, 0x4a035013, 0x0000aaaa, 0x0201f800, - 0x00104670, 0x0401f01f, 0x4a035014, 0x00000000, - 0x0401f7f9, 0x497b5013, 0x0201f800, 0x00103916, - 0x0201f800, 0x0010610d, 0x0201f800, 0x001063db, - 0x0201f800, 0x001060fa, 0x59a00a08, 0x480788a7, - 0x59c400a3, 0x82000500, 0xfeffffff, 0x82000540, - 0x80018000, 0x40000800, 0x84040d20, 0x480388a3, - 0x480788a3, 0x497b5032, 0x42000800, 0x0000002d, - 0x42001000, 0x0010399e, 0x0201f800, 0x001057a4, - 0x59a00408, 0x800000c2, 0x800008c4, 0x8005d400, - 0x42000000, 0x0000ffff, 0x0201f800, 0x00104716, - 0x04000003, 0x59a00208, 0x80000110, 0x0201f800, - 0x001032ad, 0x0201f000, 0x00101cba, 0x00102d88, - 0x00102d8b, 0x00102d95, 0x00101d01, 0x00102d92, - 0x00101d01, 0x00101d01, 0x00101d01, 0x836c0580, + 0x02020000, 0x00101d06, 0x4c580000, 0x4c500000, + 0x4c540000, 0x4200b000, 0x0000000a, 0x4134a000, + 0x832e5c00, 0x00000002, 0x412ca800, 0x0201f800, + 0x0010aee2, 0x832cac00, 0x00000006, 0x4054a000, + 0x4200b000, 0x00000004, 0x0201f800, 0x0010af0c, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x592c0802, + 0x82040500, 0x00ff00ff, 0x900001c0, 0x82041500, + 0xff00ff00, 0x80080540, 0x48025802, 0x592c0801, + 0x82040500, 0x00ff00ff, 0x900001c0, 0x82041500, + 0xff00ff00, 0x80080540, 0x48025801, 0x42000800, + 0x0000000a, 0x59a00408, 0x59a01208, 0x900811c0, + 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, + 0x800c1d40, 0x412c0000, 0x0201f000, 0x001031dc, + 0x496fc857, 0x496f4407, 0x59a80873, 0x8c040d3e, + 0x02000000, 0x00101cbf, 0x59a81073, 0x82081500, + 0x00000097, 0x59a81874, 0x59340400, 0x82000580, + 0x00000404, 0x04020002, 0x84081546, 0x480b4408, + 0x0201f000, 0x00101cbf, 0x59a28c07, 0x0201f800, + 0x00020319, 0x02020000, 0x00101d06, 0x836c0580, 0x00000003, 0x04000005, 0x4a034407, 0x00000007, - 0x0201f000, 0x00101cfd, 0x59a00408, 0x59a00a08, - 0x900409c0, 0x80040d40, 0x4805d806, 0x59a0040a, - 0x59a00a0a, 0x900409c0, 0x80040d40, 0x4805d807, - 0x4a01d801, 0x00000000, 0x0401fbcb, 0x04020005, - 0x4a034407, 0x00000002, 0x0201f000, 0x00101cfd, - 0x417a8800, 0x497b4001, 0x832c0400, 0x00000006, - 0x48034002, 0x59a00407, 0x8c000504, 0x0402009a, - 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4178b800, - 0x59a0c407, 0x59a0c802, 0x0201f800, 0x00020319, - 0x0402002c, 0x0201f800, 0x00104165, 0x04000004, - 0x0201f800, 0x001040bb, 0x04020026, 0x8c60c53e, - 0x04020022, 0x8c60c500, 0x04000008, 0x59340009, - 0x4400c800, 0x8064c800, 0x59340008, 0x4400c800, - 0x8064c800, 0x0401f007, 0x59340007, 0x4400c800, - 0x8064c800, 0x59340006, 0x4400c800, 0x8064c800, - 0x83440580, 0x000007fe, 0x0400000d, 0x83440580, - 0x000007fc, 0x0400000a, 0x0201f800, 0x00104178, - 0x04000003, 0x85468d5e, 0x0401f005, 0x0201f800, - 0x00104087, 0x04020002, 0x85468d5e, 0x4544c800, - 0x85468d1e, 0x8064c800, 0x825cbc00, 0x0000000c, - 0x81468800, 0x83440480, 0x000007f0, 0x0400100e, - 0x8c60c506, 0x04000029, 0x83440580, 0x000007f0, - 0x04020004, 0x42028800, 0x000007fe, 0x0401f006, - 0x83440580, 0x000007ff, 0x04020020, 0x42028800, - 0x000007fc, 0x825c0580, 0x0000003c, 0x040207bf, - 0x59a00001, 0x805c0400, 0x48034001, 0x8c60c53e, - 0x04020007, 0x59a00a0b, 0x800409c0, 0x04000006, - 0x80040480, 0x04021004, 0x8460c57e, 0x4178b800, - 0x0401f7b2, 0x49474000, 0x485dd805, 0x59a00002, - 0x4801d803, 0x40ec1000, 0x0201f800, 0x00020016, - 0x4a01d808, 0x00102e78, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x8c60c53e, 0x0402001a, - 0x805cb9c0, 0x04000024, 0x59a00001, 0x805c0400, - 0x48034001, 0x59a00a0b, 0x800409c0, 0x04000005, - 0x80040480, 0x04021003, 0x4178b800, 0x0401f00e, - 0x59a00801, 0x48074407, 0x485dd805, 0x59a00002, - 0x4801d803, 0x4a01d808, 0x00101cb3, 0x40ec1000, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0201f000, - 0x00020016, 0x59a00001, 0x805c0c00, 0x59a0020b, - 0x80040480, 0x48034208, 0x4a034407, 0x0000000a, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0201f000, - 0x00101cfd, 0x59a00801, 0x48074407, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x0201f000, 0x00101cba, - 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x00101cf5, 0x59a28800, - 0x0401f768, 0x4c5c0000, 0x4c600000, 0x4c640000, - 0x4178b800, 0x59a0c407, 0x59a0c802, 0x0201f800, - 0x00020319, 0x04020031, 0x0201f800, 0x00104165, - 0x04000004, 0x0201f800, 0x001040bb, 0x0402002b, - 0x8c60c53e, 0x04020027, 0x83440580, 0x000007fe, - 0x04000011, 0x83440580, 0x000007fc, 0x0400000e, - 0x0201f800, 0x00104178, 0x04000005, 0x59340403, - 0x8400055e, 0x48026c03, 0x0401f007, 0x0201f800, - 0x00104087, 0x04020004, 0x59340403, 0x8400055e, - 0x48026c03, 0x4134a000, 0x4064a800, 0x4200b000, - 0x00000006, 0x0201f800, 0x0010adef, 0x59340007, - 0x4400a800, 0x59340006, 0x4800a801, 0x59340009, - 0x4800a802, 0x59340008, 0x4800a803, 0x59340403, - 0x8400051e, 0x48026c03, 0x8264cc00, 0x0000000a, - 0x825cbc00, 0x00000028, 0x81468800, 0x83440480, - 0x000007f0, 0x0400100e, 0x8c60c506, 0x0400002a, + 0x0201f000, 0x00101d02, 0x83340c00, 0x00000006, + 0x59a0020c, 0x8c000500, 0x04000003, 0x83340c00, + 0x00000008, 0x58040001, 0x4803440a, 0x900001c0, + 0x4803420a, 0x50040000, 0x48034408, 0x900001c0, + 0x48034208, 0x59340200, 0x48034407, 0x0201f000, + 0x00101cbf, 0x8d0e1d0e, 0x04000005, 0x4a034407, + 0x00000001, 0x0201f000, 0x00101d02, 0x59a0220c, + 0x8c102500, 0x0402002e, 0x8c102506, 0x04020006, + 0x59a03209, 0x82180480, 0x00000003, 0x02021000, + 0x00101d06, 0x59a28c07, 0x0201f800, 0x00020319, + 0x02020000, 0x00101d06, 0x0201f800, 0x00104181, + 0x04000005, 0x4a034407, 0x00000009, 0x0201f000, + 0x00101d02, 0x0201f800, 0x001031af, 0x04020005, + 0x4a034407, 0x00000002, 0x0201f000, 0x00101d02, + 0x59a0220c, 0x8c102506, 0x04000004, 0x59343002, + 0x82183500, 0x00ffffff, 0x497a5a05, 0x4a025c05, + 0x00008000, 0x0201f800, 0x001089d3, 0x04020005, + 0x4a034407, 0x00000003, 0x0201f000, 0x00101d02, + 0x4a01d808, 0x00102ce1, 0x1c01f000, 0x59a28c07, + 0x0201f800, 0x00020319, 0x02020000, 0x00101d06, + 0x0201f800, 0x00104181, 0x04000005, 0x4a034407, + 0x00000009, 0x0201f000, 0x00101d02, 0x0201f800, + 0x001031af, 0x04020005, 0x4a034407, 0x00000002, + 0x0201f000, 0x00101d02, 0x497a5a05, 0x4a025c05, + 0x00008000, 0x0201f800, 0x001031af, 0x04020005, + 0x4a034407, 0x00000002, 0x0201f000, 0x00101d02, + 0x592e5800, 0x0201f800, 0x001089e8, 0x04020005, + 0x4a034407, 0x00000003, 0x0201f000, 0x00101d02, + 0x4a01d808, 0x00102cb3, 0x1c01f000, 0x592c2806, + 0x82140d80, 0x01000000, 0x04020005, 0x4a034407, + 0x00000004, 0x0201f000, 0x00101d02, 0x42000800, + 0x00000008, 0x59a00208, 0x59a01408, 0x900001c0, + 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, + 0x800c1d40, 0x832c0400, 0x00000006, 0x0201f800, + 0x001031dc, 0x8c142d00, 0x04000003, 0x4a01d808, + 0x00102cce, 0x1c01f000, 0x4031d800, 0x58ef400a, + 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00101cfa, 0x812e59c0, 0x02000800, + 0x0010032d, 0x42000800, 0x00000008, 0x832c0400, + 0x00000006, 0x58ec1006, 0x58ec1807, 0x0201f000, + 0x001031dc, 0x592c0006, 0x82000580, 0x01000000, + 0x04020005, 0x4a034407, 0x00000004, 0x0201f000, + 0x00101d02, 0x59a00208, 0x59a01408, 0x900001c0, + 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, + 0x800c1d40, 0x42000800, 0x00000006, 0x832c0400, + 0x00000007, 0x0201f000, 0x001031dc, 0x59a00a0b, + 0x800409c0, 0x02000000, 0x00101d06, 0x82040480, + 0x00000081, 0x04001003, 0x42000800, 0x00000080, + 0x59c40085, 0x59881004, 0x80081400, 0x480b1004, + 0x497b8885, 0x59c400b1, 0x48031022, 0x59c400b2, + 0x48031021, 0x59c400a2, 0x48031023, 0x598810b7, + 0x598800b8, 0x80081400, 0x598800b9, 0x80081400, + 0x598800ba, 0x80081400, 0x5988011d, 0x80081400, + 0x598800bb, 0x80081400, 0x480b1024, 0x59a00208, + 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, + 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x83880400, + 0x00000000, 0x0201f800, 0x001031dc, 0x4a01d808, + 0x00102d26, 0x1c01f000, 0x4031d800, 0x58ef400a, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00101cfa, 0x59a0020c, 0x8c000500, 0x04000008, + 0x83880400, 0x00000000, 0x4803c840, 0x4a03c842, + 0x00000006, 0x04011000, 0x497b8885, 0x4a034208, + 0x00000080, 0x0201f000, 0x00101cbf, 0x8d0e1d0e, + 0x04000005, 0x4a034407, 0x00000001, 0x0201f000, + 0x00101d02, 0x0201f800, 0x001031af, 0x04020005, + 0x4a034407, 0x00000002, 0x0201f000, 0x00101d02, + 0x497a5a05, 0x4a025c05, 0x00008000, 0x59a00407, + 0x800001c0, 0x02000000, 0x00101d06, 0x82001580, + 0x000000ff, 0x04000005, 0x82001480, 0x00000004, + 0x02021000, 0x00101d06, 0x40001000, 0x0201f800, + 0x00101a3e, 0x04020005, 0x4a034407, 0x00000003, + 0x0201f000, 0x00101d02, 0x4a01d808, 0x00102d61, + 0x1c01f000, 0x592c0006, 0x82000580, 0x01000000, + 0x02020000, 0x00101cbf, 0x4a034407, 0x00000004, + 0x0201f000, 0x00101d02, 0x59a01407, 0x8c081508, + 0x04020007, 0x8d0e1d0e, 0x04000005, 0x4a034407, + 0x00000001, 0x0201f000, 0x00101d02, 0x59a01c08, + 0x820c0480, 0x00001000, 0x02021000, 0x00101d06, + 0x497b2804, 0x497b2805, 0x497b2826, 0x497b2827, + 0x497b2829, 0x497b282a, 0x497b282c, 0x497b282d, + 0x4803c856, 0x850e1d06, 0x8c081500, 0x04000005, + 0x4803c856, 0x830e1d40, 0x00000011, 0x0401f004, + 0x8c081506, 0x04000002, 0x850e1d42, 0x850e1d0a, + 0x4202d800, 0x00000001, 0x82081500, 0x000000e0, + 0x8008010a, 0x0c020038, 0x0201f800, 0x00104755, + 0x0402000b, 0x4a035014, 0x00000001, 0x4a035013, + 0x0000aaaa, 0x0201f800, 0x001046af, 0x0401f01f, + 0x4a035014, 0x00000000, 0x0401f7f9, 0x497b5013, + 0x0201f800, 0x00103929, 0x0201f800, 0x001061b2, + 0x0201f800, 0x00106480, 0x0201f800, 0x0010619f, + 0x59a00a08, 0x480788a7, 0x59c400a3, 0x82000500, + 0xfeffffff, 0x82000540, 0x80018000, 0x40000800, + 0x84040d20, 0x480388a3, 0x480788a3, 0x497b5032, + 0x42000800, 0x0000002d, 0x42001000, 0x001039b1, + 0x0201f800, 0x00105849, 0x59a00408, 0x800000c2, + 0x800008c4, 0x8005d400, 0x42000000, 0x0000ffff, + 0x0201f800, 0x00104755, 0x04000003, 0x59a00208, + 0x80000110, 0x0201f800, 0x001032b7, 0x0201f000, + 0x00101cbf, 0x00102d92, 0x00102d95, 0x00102d9f, + 0x00101d06, 0x00102d9c, 0x00101d06, 0x00101d06, + 0x00101d06, 0x836c0580, 0x00000003, 0x04000005, + 0x4a034407, 0x00000007, 0x0201f000, 0x00101d02, + 0x59a00408, 0x59a00a08, 0x900409c0, 0x80040d40, + 0x4805d806, 0x59a0040a, 0x59a00a0a, 0x900409c0, + 0x80040d40, 0x4805d807, 0x4a01d801, 0x00000000, + 0x0401fbcb, 0x04020005, 0x4a034407, 0x00000002, + 0x0201f000, 0x00101d02, 0x417a8800, 0x497b4001, + 0x832c0400, 0x00000006, 0x48034002, 0x59a00407, + 0x8c000504, 0x0402009a, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4178b800, 0x59a0c407, 0x59a0c802, + 0x0201f800, 0x00020319, 0x0402002c, 0x0201f800, + 0x00104181, 0x04000004, 0x0201f800, 0x001040d5, + 0x04020026, 0x8c60c53e, 0x04020022, 0x8c60c500, + 0x04000008, 0x59340009, 0x4400c800, 0x8064c800, + 0x59340008, 0x4400c800, 0x8064c800, 0x0401f007, + 0x59340007, 0x4400c800, 0x8064c800, 0x59340006, + 0x4400c800, 0x8064c800, 0x83440580, 0x000007fe, + 0x0400000d, 0x83440580, 0x000007fc, 0x0400000a, + 0x0201f800, 0x00104194, 0x04000003, 0x85468d5e, + 0x0401f005, 0x0201f800, 0x001040a1, 0x04020002, + 0x85468d5e, 0x4544c800, 0x85468d1e, 0x8064c800, + 0x825cbc00, 0x0000000c, 0x81468800, 0x83440480, + 0x000007f0, 0x0400100e, 0x8c60c506, 0x04000029, 0x83440580, 0x000007f0, 0x04020004, 0x42028800, 0x000007fe, 0x0401f006, 0x83440580, 0x000007ff, - 0x04020021, 0x42028800, 0x000007fc, 0x825c0580, - 0x00000028, 0x04000002, 0x0401f7b9, 0x59a00001, - 0x805c0400, 0x48034001, 0x8c60c53e, 0x04020007, - 0x59a00a0b, 0x800409c0, 0x04000006, 0x80040480, - 0x04021004, 0x8460c57e, 0x4178b800, 0x0401f7ac, - 0x49474000, 0x485dd805, 0x59a00002, 0x4801d803, - 0x40ec1000, 0x0201f800, 0x00020016, 0x4a01d808, - 0x00102f17, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x1c01f000, 0x8c60c53e, 0x0402001a, 0x805cb9c0, - 0x04000024, 0x59a00001, 0x805c0400, 0x48034001, - 0x59a00a0b, 0x800409c0, 0x04000005, 0x80040480, - 0x04021003, 0x4178b800, 0x0401f00e, 0x59a00801, - 0x48074407, 0x485dd805, 0x59a00002, 0x4801d803, - 0x4a01d808, 0x00101cb3, 0x40ec1000, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x0201f000, 0x00020016, - 0x59a00001, 0x805c0c00, 0x59a0020b, 0x80040480, - 0x48034208, 0x4a034407, 0x0000000a, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x0201f000, 0x00101cfd, - 0x59a00801, 0x48074407, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x0201f000, 0x00101cba, 0x4031d800, - 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x00101cf5, 0x59a28800, 0x0401f762, - 0x42002800, 0x0000007e, 0x59a00c07, 0x59a01208, - 0x59a01c08, 0x59a0220a, 0x82040500, 0x0000ff00, - 0x840001c0, 0x82003480, 0x00000020, 0x02001000, - 0x00101d01, 0x80140480, 0x02001000, 0x00101d01, - 0x82040500, 0x000000ff, 0x82003480, 0x00000020, - 0x02001000, 0x00101d01, 0x80140480, 0x02001000, - 0x00101d01, 0x82080500, 0x0000ff00, 0x840001c0, - 0x82003480, 0x00000020, 0x02001000, 0x00101d01, - 0x80140480, 0x02001000, 0x00101d01, 0x82080500, - 0x000000ff, 0x82003480, 0x00000020, 0x02001000, - 0x00101d01, 0x80140480, 0x02001000, 0x00101d01, - 0x820c0500, 0x0000ff00, 0x840001c0, 0x82003480, - 0x00000020, 0x02001000, 0x00101d01, 0x80140480, - 0x02001000, 0x00101d01, 0x820c0500, 0x000000ff, - 0x82003480, 0x00000020, 0x02001000, 0x00101d01, - 0x80140480, 0x02001000, 0x00101d01, 0x82100500, - 0x0000ff00, 0x840001c0, 0x82003480, 0x00000020, - 0x02001000, 0x00101d01, 0x80140480, 0x02001000, - 0x00101d01, 0x82100500, 0x000000ff, 0x82003480, - 0x00000020, 0x02001000, 0x00101d01, 0x80140480, - 0x02001000, 0x00101d01, 0x900401c0, 0x80080d40, - 0x900c01c0, 0x80101d40, 0x83a83400, 0x0000002d, - 0x44043000, 0x80183000, 0x440c3000, 0x0201f000, - 0x00101cba, 0x0401fa28, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x00101cfd, 0x42000800, - 0x0000000c, 0x0401f84f, 0x4a01d808, 0x00102f89, - 0x1c01f000, 0x4031d800, 0x58ee580c, 0x58ef400a, + 0x04020020, 0x42028800, 0x000007fc, 0x825c0580, + 0x0000003c, 0x040207bf, 0x59a00001, 0x805c0400, + 0x48034001, 0x8c60c53e, 0x04020007, 0x59a00a0b, + 0x800409c0, 0x04000006, 0x80040480, 0x04021004, + 0x8460c57e, 0x4178b800, 0x0401f7b2, 0x49474000, + 0x485dd805, 0x59a00002, 0x4801d803, 0x40ec1000, + 0x0201f800, 0x00020016, 0x4a01d808, 0x00102e82, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x8c60c53e, 0x0402001a, 0x805cb9c0, 0x04000024, + 0x59a00001, 0x805c0400, 0x48034001, 0x59a00a0b, + 0x800409c0, 0x04000005, 0x80040480, 0x04021003, + 0x4178b800, 0x0401f00e, 0x59a00801, 0x48074407, + 0x485dd805, 0x59a00002, 0x4801d803, 0x4a01d808, + 0x00101cb8, 0x40ec1000, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x0201f000, 0x00020016, 0x59a00001, + 0x805c0c00, 0x59a0020b, 0x80040480, 0x48034208, + 0x4a034407, 0x0000000a, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x0201f000, 0x00101d02, 0x59a00801, + 0x48074407, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x0201f000, 0x00101cbf, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x00101cf5, 0x832ca400, 0x00000005, 0x4200b000, - 0x0000000c, 0x40c8a800, 0x0201f800, 0x0010adef, - 0x58c80200, 0x80000540, 0x04000030, 0x58c80400, - 0x82000500, 0xfffffffb, 0x0402002c, 0x58c80401, - 0x80000540, 0x04000029, 0x82000480, 0x0000ff01, - 0x04021026, 0x58c80202, 0x82000480, 0x0000005c, - 0x04001022, 0x0201f800, 0x00105c3d, 0x58c80c08, - 0x58c80204, 0x80040480, 0x0400101c, 0x58c80204, - 0x82000480, 0x00000005, 0x04021018, 0x58c80205, - 0x58c80c08, 0x80040902, 0x80040480, 0x04001013, - 0x58c80c08, 0x0201f800, 0x00105b8c, 0x04000017, - 0x0201f800, 0x00105a4d, 0x0402000e, 0x4979940b, - 0x59c408a3, 0x82040d40, 0x00000002, 0x480788a3, - 0x58c80202, 0x48030804, 0x0201f800, 0x00105a2f, - 0x0201f000, 0x00101cba, 0x0201f000, 0x00101d01, - 0x0201f800, 0x00105c8f, 0x0201f800, 0x00105c9c, - 0x0201f800, 0x00105b7f, 0x0201f000, 0x00101cfd, - 0x4c000000, 0x59a01208, 0x59a00408, 0x900811c0, - 0x80081540, 0x59a01a0a, 0x59a0040a, 0x900c19c0, - 0x800c1d40, 0x5c000000, 0x0401f1eb, 0x59840000, - 0x82000580, 0x00000000, 0x04000050, 0x59840002, - 0x8c000504, 0x0400004d, 0x84000546, 0x48030802, - 0x0201f800, 0x00105b7f, 0x59c408a3, 0x82040d00, - 0xfffffffd, 0x480788a3, 0x4c5c0000, 0x4200b800, - 0x0010af80, 0x505e6800, 0x813669c0, 0x04000008, - 0x5936600e, 0x813261c0, 0x04000005, 0x0201f800, - 0x00105b70, 0x02000800, 0x00105d48, 0x805cb800, - 0x825c0580, 0x0010b770, 0x040207f3, 0x59866003, - 0x813261c0, 0x0400000b, 0x59300407, 0x82000580, - 0x00000009, 0x02020800, 0x0010032d, 0x5930b800, - 0x0201f800, 0x00105b55, 0x405e6000, 0x0401f7f5, - 0x497b0803, 0x4200b800, 0x0010b86d, 0x505e6000, - 0x813261c0, 0x04000011, 0x59300407, 0x82000580, - 0x00000009, 0x0402000d, 0x59300203, 0x82000580, - 0x00000004, 0x04020009, 0x5932680a, 0x813669c0, - 0x02020800, 0x0010032d, 0x0201f800, 0x00100bd4, - 0x0201f800, 0x00105b55, 0x4578b800, 0x805cb800, - 0x825c0580, 0x0010b875, 0x040207e9, 0x42000800, - 0x0010b86b, 0x49780801, 0x49780800, 0x0201f800, - 0x00105c8f, 0x0201f800, 0x00105c9c, 0x5c00b800, - 0x0201f800, 0x00105a48, 0x0201f000, 0x00101cba, - 0x836c0580, 0x00000003, 0x04000005, 0x4a034407, - 0x00000007, 0x0201f000, 0x00101cfd, 0x59a00408, - 0x59a00a08, 0x900409c0, 0x80040d40, 0x4805d806, - 0x59a0040a, 0x59a00a0a, 0x900409c0, 0x80040d40, - 0x4805d807, 0x4a01d801, 0x00000000, 0x0401f95e, + 0x00101cfa, 0x59a28800, 0x0401f768, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x4178b800, 0x59a0c407, + 0x59a0c802, 0x0201f800, 0x00020319, 0x04020031, + 0x0201f800, 0x00104181, 0x04000004, 0x0201f800, + 0x001040d5, 0x0402002b, 0x8c60c53e, 0x04020027, + 0x83440580, 0x000007fe, 0x04000011, 0x83440580, + 0x000007fc, 0x0400000e, 0x0201f800, 0x00104194, + 0x04000005, 0x59340403, 0x8400055e, 0x48026c03, + 0x0401f007, 0x0201f800, 0x001040a1, 0x04020004, + 0x59340403, 0x8400055e, 0x48026c03, 0x4134a000, + 0x4064a800, 0x4200b000, 0x00000006, 0x0201f800, + 0x0010aee2, 0x59340007, 0x4400a800, 0x59340006, + 0x4800a801, 0x59340009, 0x4800a802, 0x59340008, + 0x4800a803, 0x59340403, 0x8400051e, 0x48026c03, + 0x8264cc00, 0x0000000a, 0x825cbc00, 0x00000028, + 0x81468800, 0x83440480, 0x000007f0, 0x0400100e, + 0x8c60c506, 0x0400002a, 0x83440580, 0x000007f0, + 0x04020004, 0x42028800, 0x000007fe, 0x0401f006, + 0x83440580, 0x000007ff, 0x04020021, 0x42028800, + 0x000007fc, 0x825c0580, 0x00000028, 0x04000002, + 0x0401f7b9, 0x59a00001, 0x805c0400, 0x48034001, + 0x8c60c53e, 0x04020007, 0x59a00a0b, 0x800409c0, + 0x04000006, 0x80040480, 0x04021004, 0x8460c57e, + 0x4178b800, 0x0401f7ac, 0x49474000, 0x485dd805, + 0x59a00002, 0x4801d803, 0x40ec1000, 0x0201f800, + 0x00020016, 0x4a01d808, 0x00102f21, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x8c60c53e, + 0x0402001a, 0x805cb9c0, 0x04000024, 0x59a00001, + 0x805c0400, 0x48034001, 0x59a00a0b, 0x800409c0, + 0x04000005, 0x80040480, 0x04021003, 0x4178b800, + 0x0401f00e, 0x59a00801, 0x48074407, 0x485dd805, + 0x59a00002, 0x4801d803, 0x4a01d808, 0x00101cb8, + 0x40ec1000, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x0201f000, 0x00020016, 0x59a00001, 0x805c0c00, + 0x59a0020b, 0x80040480, 0x48034208, 0x4a034407, + 0x0000000a, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x0201f000, 0x00101d02, 0x59a00801, 0x48074407, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0201f000, + 0x00101cbf, 0x4031d800, 0x58ef400a, 0x58ec0002, + 0x82000580, 0x00000200, 0x02000000, 0x00101cfa, + 0x59a28800, 0x0401f762, 0x42002800, 0x0000007e, + 0x59a00c07, 0x59a01208, 0x59a01c08, 0x59a0220a, + 0x82040500, 0x0000ff00, 0x840001c0, 0x82003480, + 0x00000020, 0x02001000, 0x00101d06, 0x80140480, + 0x02001000, 0x00101d06, 0x82040500, 0x000000ff, + 0x82003480, 0x00000020, 0x02001000, 0x00101d06, + 0x80140480, 0x02001000, 0x00101d06, 0x82080500, + 0x0000ff00, 0x840001c0, 0x82003480, 0x00000020, + 0x02001000, 0x00101d06, 0x80140480, 0x02001000, + 0x00101d06, 0x82080500, 0x000000ff, 0x82003480, + 0x00000020, 0x02001000, 0x00101d06, 0x80140480, + 0x02001000, 0x00101d06, 0x820c0500, 0x0000ff00, + 0x840001c0, 0x82003480, 0x00000020, 0x02001000, + 0x00101d06, 0x80140480, 0x02001000, 0x00101d06, + 0x820c0500, 0x000000ff, 0x82003480, 0x00000020, + 0x02001000, 0x00101d06, 0x80140480, 0x02001000, + 0x00101d06, 0x82100500, 0x0000ff00, 0x840001c0, + 0x82003480, 0x00000020, 0x02001000, 0x00101d06, + 0x80140480, 0x02001000, 0x00101d06, 0x82100500, + 0x000000ff, 0x82003480, 0x00000020, 0x02001000, + 0x00101d06, 0x80140480, 0x02001000, 0x00101d06, + 0x900401c0, 0x80080d40, 0x900c01c0, 0x80101d40, + 0x83a83400, 0x0000002d, 0x44043000, 0x80183000, + 0x440c3000, 0x0201f000, 0x00101cbf, 0x0401fa28, 0x04020005, 0x4a034407, 0x00000002, 0x0201f000, - 0x00101cfd, 0x417a8800, 0x497b4001, 0x832c0400, - 0x00000005, 0x48034002, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x4178b800, 0x4178c800, 0x59a0c002, - 0x41440000, 0x81ac0400, 0x50026800, 0x813669c0, - 0x0400000d, 0x0201f800, 0x00104165, 0x0402000a, - 0x8c64cd3e, 0x04020006, 0x59340002, 0x4800c000, - 0x4944c001, 0x8260c400, 0x00000002, 0x825cbc00, - 0x00000008, 0x81468800, 0x83440480, 0x00000800, - 0x04021021, 0x825c0480, 0x00000040, 0x04021002, - 0x0401f7e8, 0x59a00001, 0x805c0400, 0x48034001, - 0x8c64cd3e, 0x04000003, 0x4178b800, 0x0401f7e1, - 0x59a00a0b, 0x800409c0, 0x04000006, 0x80040480, - 0x04021004, 0x4178b800, 0x8464cd7e, 0x0401f7d9, - 0x49474000, 0x485dd805, 0x59a00002, 0x4801d803, - 0x40ec1000, 0x0201f800, 0x00020016, 0x4a01d808, - 0x001030bd, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x1c01f000, 0x8c64cd3e, 0x0402001b, 0x805cb9c0, - 0x04000025, 0x59a00001, 0x805c0400, 0x48034001, - 0x59a00a0b, 0x800409c0, 0x04000005, 0x80040480, - 0x04021003, 0x4178b800, 0x0401f00f, 0x59a00801, - 0x80040906, 0x48074407, 0x485dd805, 0x59a00002, - 0x4801d803, 0x4a01d808, 0x00101cb3, 0x40ec1000, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0201f000, - 0x00020016, 0x59a00001, 0x805c0c00, 0x59a0020b, - 0x80040480, 0x48034208, 0x4a034407, 0x0000000a, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0201f000, - 0x00101cfd, 0x59a00801, 0x80040906, 0x48074407, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0201f000, - 0x00101cba, 0x4031d800, 0x58ef400a, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x00101cf5, - 0x59a28800, 0x0401f78d, 0x8d0e1d0e, 0x04000005, - 0x4a034407, 0x00000001, 0x0201f000, 0x00101cfd, - 0x59a8021b, 0x8c00050a, 0x04020007, 0x8c000506, - 0x04020005, 0x4a034407, 0x00000016, 0x0201f000, - 0x00101cfd, 0x0401f8d0, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x00101cfd, 0x59a00c07, - 0x80040902, 0x59a00408, 0x59a01208, 0x900811c0, - 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, - 0x800c1d40, 0x832c0400, 0x00000006, 0x0401f8e2, - 0x4a01d808, 0x001030eb, 0x1c01f000, 0x4031d800, - 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x00101cf5, 0x592c000a, - 0x0201f800, 0x0010548f, 0x02000800, 0x00103dcb, - 0x02020000, 0x00101d01, 0x49474001, 0x481a6802, - 0x592c000b, 0x82001d80, 0x70000000, 0x04020007, - 0x0401f8a5, 0x04020011, 0x4a034407, 0x00000002, - 0x0201f000, 0x00101cfd, 0x82001d80, 0x72000000, - 0x02020000, 0x00101d01, 0x0401f89b, 0x0402089a, - 0x04020899, 0x04020005, 0x4a034407, 0x00000002, - 0x0201f000, 0x00101cfd, 0x58ee580c, 0x4a025c05, - 0x00008000, 0x497a5a05, 0x592c3209, 0x80183102, - 0x592c1801, 0x4a001806, 0x01000000, 0x0201f800, - 0x00108943, 0x04020005, 0x4a034407, 0x00000003, - 0x0201f000, 0x00101cfd, 0x4a01d808, 0x00103125, - 0x1c01f000, 0x592c4000, 0x592c0006, 0x82000580, - 0x01000000, 0x04020005, 0x4a034407, 0x00000004, - 0x0201f000, 0x00101cfd, 0x4c580000, 0x4c500000, - 0x4c540000, 0x832c3c00, 0x00000006, 0x401ca000, - 0x401ca800, 0x5820280b, 0x4200b000, 0x00000002, - 0x82143580, 0x70000000, 0x04000003, 0x4200b000, - 0x0000000f, 0x0201f800, 0x0010ae19, 0x5c00a800, - 0x5c00a000, 0x5c00b000, 0x401c0000, 0x58201007, - 0x58201808, 0x58202206, 0x80102102, 0x82143580, - 0x70000000, 0x04020008, 0x82103480, 0x00000002, - 0x02001000, 0x00101d01, 0x42000800, 0x00000002, - 0x0401f082, 0x82143580, 0x72000000, 0x02020000, - 0x00101d01, 0x82103480, 0x0000002a, 0x02001000, - 0x00101d01, 0x42000800, 0x0000000f, 0x0401f877, - 0x4a01d808, 0x0010315f, 0x1c01f000, 0x4031d800, - 0x58ef400a, 0x58ee580d, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x00101cf5, 0x592e5800, - 0x832c0c00, 0x00000006, 0x4c580000, 0x4c500000, - 0x4c540000, 0x4004a000, 0x4004a800, 0x4200b000, - 0x0000000f, 0x0201f800, 0x0010ae19, 0x5c00a800, - 0x5c00a000, 0x5c00b000, 0x40ec1000, 0x4a001001, - 0x00000000, 0x4a001005, 0x0000003c, 0x48041003, - 0x0201f800, 0x00020016, 0x4a01d808, 0x00103181, + 0x00101d02, 0x42000800, 0x0000000c, 0x0401f84f, + 0x4a01d808, 0x00102f93, 0x1c01f000, 0x4031d800, + 0x58ee580c, 0x58ef400a, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00101cfa, 0x832ca400, + 0x00000005, 0x4200b000, 0x0000000c, 0x40c8a800, + 0x0201f800, 0x0010aee2, 0x58c80200, 0x80000540, + 0x04000030, 0x58c80400, 0x82000500, 0xfffffffb, + 0x0402002c, 0x58c80401, 0x80000540, 0x04000029, + 0x82000480, 0x0000ff01, 0x04021026, 0x58c80202, + 0x82000480, 0x0000005c, 0x04001022, 0x0201f800, + 0x00105ce2, 0x58c80c08, 0x58c80204, 0x80040480, + 0x0400101c, 0x58c80204, 0x82000480, 0x00000005, + 0x04021018, 0x58c80205, 0x58c80c08, 0x80040902, + 0x80040480, 0x04001013, 0x58c80c08, 0x0201f800, + 0x00105c31, 0x04000017, 0x0201f800, 0x00105af2, + 0x0402000e, 0x4979940b, 0x59c408a3, 0x82040d40, + 0x00000002, 0x480788a3, 0x58c80202, 0x48030804, + 0x0201f800, 0x00105ad4, 0x0201f000, 0x00101cbf, + 0x0201f000, 0x00101d06, 0x0201f800, 0x00105d34, + 0x0201f800, 0x00105d41, 0x0201f800, 0x00105c24, + 0x0201f000, 0x00101d02, 0x4c000000, 0x59a01208, + 0x59a00408, 0x900811c0, 0x80081540, 0x59a01a0a, + 0x59a0040a, 0x900c19c0, 0x800c1d40, 0x5c000000, + 0x0401f1eb, 0x59840000, 0x82000580, 0x00000000, + 0x04000050, 0x59840002, 0x8c000504, 0x0400004d, + 0x84000546, 0x48030802, 0x0201f800, 0x00105c24, + 0x59c408a3, 0x82040d00, 0xfffffffd, 0x480788a3, + 0x4c5c0000, 0x4200b800, 0x0010b080, 0x505e6800, + 0x813669c0, 0x04000008, 0x5936600e, 0x813261c0, + 0x04000005, 0x0201f800, 0x00105c15, 0x02000800, + 0x00105ded, 0x805cb800, 0x825c0580, 0x0010b870, + 0x040207f3, 0x59866003, 0x813261c0, 0x0400000b, + 0x59300407, 0x82000580, 0x00000009, 0x02020800, + 0x0010032d, 0x5930b800, 0x0201f800, 0x00105bfa, + 0x405e6000, 0x0401f7f5, 0x497b0803, 0x4200b800, + 0x0010b96d, 0x505e6000, 0x813261c0, 0x04000011, + 0x59300407, 0x82000580, 0x00000009, 0x0402000d, + 0x59300203, 0x82000580, 0x00000004, 0x04020009, + 0x5932680a, 0x813669c0, 0x02020800, 0x0010032d, + 0x0201f800, 0x00100bd5, 0x0201f800, 0x00105bfa, + 0x4578b800, 0x805cb800, 0x825c0580, 0x0010b975, + 0x040207e9, 0x42000800, 0x0010b96b, 0x49780801, + 0x49780800, 0x0201f800, 0x00105d34, 0x0201f800, + 0x00105d41, 0x5c00b800, 0x0201f800, 0x00105aed, + 0x0201f000, 0x00101cbf, 0x836c0580, 0x00000003, + 0x04000005, 0x4a034407, 0x00000007, 0x0201f000, + 0x00101d02, 0x59a00408, 0x59a00a08, 0x900409c0, + 0x80040d40, 0x4805d806, 0x59a0040a, 0x59a00a0a, + 0x900409c0, 0x80040d40, 0x4805d807, 0x4a01d801, + 0x00000000, 0x0401f95e, 0x04020005, 0x4a034407, + 0x00000002, 0x0201f000, 0x00101d02, 0x417a8800, + 0x497b4001, 0x832c0400, 0x00000005, 0x48034002, + 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4178b800, + 0x4178c800, 0x59a0c002, 0x41440000, 0x81ac0400, + 0x50026800, 0x813669c0, 0x0400000d, 0x0201f800, + 0x00104181, 0x0402000a, 0x8c64cd3e, 0x04020006, + 0x59340002, 0x4800c000, 0x4944c001, 0x8260c400, + 0x00000002, 0x825cbc00, 0x00000008, 0x81468800, + 0x83440480, 0x00000800, 0x04021021, 0x825c0480, + 0x00000040, 0x04021002, 0x0401f7e8, 0x59a00001, + 0x805c0400, 0x48034001, 0x8c64cd3e, 0x04000003, + 0x4178b800, 0x0401f7e1, 0x59a00a0b, 0x800409c0, + 0x04000006, 0x80040480, 0x04021004, 0x4178b800, + 0x8464cd7e, 0x0401f7d9, 0x49474000, 0x485dd805, + 0x59a00002, 0x4801d803, 0x40ec1000, 0x0201f800, + 0x00020016, 0x4a01d808, 0x001030c7, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x8c64cd3e, + 0x0402001b, 0x805cb9c0, 0x04000025, 0x59a00001, + 0x805c0400, 0x48034001, 0x59a00a0b, 0x800409c0, + 0x04000005, 0x80040480, 0x04021003, 0x4178b800, + 0x0401f00f, 0x59a00801, 0x80040906, 0x48074407, + 0x485dd805, 0x59a00002, 0x4801d803, 0x4a01d808, + 0x00101cb8, 0x40ec1000, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x0201f000, 0x00020016, 0x59a00001, + 0x805c0c00, 0x59a0020b, 0x80040480, 0x48034208, + 0x4a034407, 0x0000000a, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x0201f000, 0x00101d02, 0x59a00801, + 0x80040906, 0x48074407, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x0201f000, 0x00101cbf, 0x4031d800, + 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00101cfa, 0x59a28800, 0x0401f78d, + 0x8d0e1d0e, 0x04000005, 0x4a034407, 0x00000001, + 0x0201f000, 0x00101d02, 0x59a8021b, 0x8c00050a, + 0x04020007, 0x8c000506, 0x04020005, 0x4a034407, + 0x00000016, 0x0201f000, 0x00101d02, 0x0401f8d0, + 0x04020005, 0x4a034407, 0x00000002, 0x0201f000, + 0x00101d02, 0x59a00c07, 0x80040902, 0x59a00408, + 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, + 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x832c0400, + 0x00000006, 0x0401f8e2, 0x4a01d808, 0x001030f5, + 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580c, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00101cfa, 0x592c000a, 0x0201f800, 0x001054fb, + 0x02000800, 0x00103de1, 0x02020000, 0x00101d06, + 0x49474001, 0x481a6802, 0x592c000b, 0x82001d80, + 0x70000000, 0x04020007, 0x0401f8a5, 0x04020011, + 0x4a034407, 0x00000002, 0x0201f000, 0x00101d02, + 0x82001d80, 0x72000000, 0x02020000, 0x00101d06, + 0x0401f89b, 0x0402089a, 0x04020899, 0x04020005, + 0x4a034407, 0x00000002, 0x0201f000, 0x00101d02, + 0x58ee580c, 0x4a025c05, 0x00008000, 0x497a5a05, + 0x592c3209, 0x80183102, 0x592c1801, 0x4a001806, + 0x01000000, 0x0201f800, 0x001089fc, 0x04020005, + 0x4a034407, 0x00000003, 0x0201f000, 0x00101d02, + 0x4a01d808, 0x0010312f, 0x1c01f000, 0x592c4000, + 0x592c0006, 0x82000580, 0x01000000, 0x04020005, + 0x4a034407, 0x00000004, 0x0201f000, 0x00101d02, + 0x4c580000, 0x4c500000, 0x4c540000, 0x832c3c00, + 0x00000006, 0x401ca000, 0x401ca800, 0x5820280b, + 0x4200b000, 0x00000002, 0x82143580, 0x70000000, + 0x04000003, 0x4200b000, 0x0000000f, 0x0201f800, + 0x0010af0c, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x401c0000, 0x58201007, 0x58201808, 0x58202206, + 0x80102102, 0x82143580, 0x70000000, 0x04020008, + 0x82103480, 0x00000002, 0x02001000, 0x00101d06, + 0x42000800, 0x00000002, 0x0401f082, 0x82143580, + 0x72000000, 0x02020000, 0x00101d06, 0x82103480, + 0x0000002a, 0x02001000, 0x00101d06, 0x42000800, + 0x0000000f, 0x0401f877, 0x4a01d808, 0x00103169, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x00101cf5, 0x832c0c00, 0x00000006, 0x4c580000, - 0x4c500000, 0x4c540000, 0x4004a000, 0x4004a800, - 0x4200b000, 0x0000000c, 0x0201f800, 0x0010ae19, - 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x40ec1000, - 0x4a001001, 0x00000000, 0x4a001005, 0x00000030, - 0x48041003, 0x0201f800, 0x00020016, 0x4a01d808, - 0x00101cb3, 0x1c01f000, 0x0401f803, 0x412d8800, - 0x1c01f000, 0x0201f800, 0x0010056f, 0x04000010, - 0x497a5800, 0x58ec000c, 0x80000540, 0x04020004, - 0x492dd80c, 0x492dd80d, 0x0401f007, 0x58ec000d, - 0x48025800, 0x82000400, 0x00000001, 0x452c0000, - 0x492dd80d, 0x832c0400, 0x00000005, 0x492fc857, - 0x4803c857, 0x1c01f000, 0x4d2c0000, 0x58ec400c, - 0x802041c0, 0x04000008, 0x4823c857, 0x40225800, - 0x592c4001, 0x497a5801, 0x0201f800, 0x00100580, - 0x0401f7f8, 0x4979d80c, 0x4979d80d, 0x5c025800, - 0x1c01f000, 0x42003000, 0x00000001, 0x0401f009, - 0x42003000, 0x00000001, 0x0401f007, 0x42003000, - 0x00000000, 0x0401f004, 0x42003000, 0x00000000, - 0x800408c4, 0x800409c0, 0x02000800, 0x0010032d, - 0x4803c857, 0x4807c857, 0x480bc857, 0x480fc857, - 0x481bc857, 0x48efc857, 0x4819d801, 0x4801d803, - 0x4809d806, 0x480dd807, 0x4805d805, 0x40ec1000, - 0x0201f800, 0x00020016, 0x4a01d808, 0x00101cb3, - 0x1c01f000, 0x40681000, 0x406c1800, 0x80002d80, - 0x480bc857, 0x480fc857, 0x4813c857, 0x4817c857, - 0x8d0e1d20, 0x04000005, 0x59a80005, 0x8c000516, - 0x02020000, 0x00109fa3, 0x4d2c0000, 0x4da00000, - 0x42034000, 0x0010b7fa, 0x59a00018, 0x800001c0, - 0x0402000f, 0x0400600e, 0x480bc020, 0x480fc021, - 0x4813c022, 0x4817c023, 0x900811c0, 0x82081540, - 0x00000012, 0x480bc011, 0x4a03c017, 0x00000000, - 0x4203e000, 0x30000001, 0x0401f050, 0x4c040000, - 0x4c1c0000, 0x80000800, 0x48074018, 0x59a0381b, - 0x481fc857, 0x801c39c0, 0x04020027, 0x82000480, - 0x0000000a, 0x04021010, 0x59a00019, 0x80000000, - 0x48034019, 0x59a0021a, 0x82000400, 0x00000002, - 0x82000c80, 0x00000014, 0x4803421a, 0x04001003, - 0x497b421a, 0x41780000, 0x59a03817, 0x801c3c00, - 0x0401f030, 0x4803c856, 0x0201f800, 0x0010056f, - 0x04000007, 0x492f401b, 0x492f401c, 0x412c3800, - 0x497b421d, 0x497a5814, 0x0401f026, 0x5988001e, + 0x00101cfa, 0x592e5800, 0x832c0c00, 0x00000006, + 0x4c580000, 0x4c500000, 0x4c540000, 0x4004a000, + 0x4004a800, 0x4200b000, 0x0000000f, 0x0201f800, + 0x0010af0c, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x40ec1000, 0x4a001001, 0x00000000, 0x4a001005, + 0x0000003c, 0x48041003, 0x0201f800, 0x00020016, + 0x4a01d808, 0x0010318b, 0x1c01f000, 0x4031d800, + 0x58ef400a, 0x58ee580d, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00101cfa, 0x832c0c00, + 0x00000006, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4004a000, 0x4004a800, 0x4200b000, 0x0000000c, + 0x0201f800, 0x0010af0c, 0x5c00a800, 0x5c00a000, + 0x5c00b000, 0x40ec1000, 0x4a001001, 0x00000000, + 0x4a001005, 0x00000030, 0x48041003, 0x0201f800, + 0x00020016, 0x4a01d808, 0x00101cb8, 0x1c01f000, + 0x0401f803, 0x412d8800, 0x1c01f000, 0x0201f800, + 0x0010056f, 0x04000010, 0x497a5800, 0x58ec000c, + 0x80000540, 0x04020004, 0x492dd80c, 0x492dd80d, + 0x0401f007, 0x58ec000d, 0x48025800, 0x82000400, + 0x00000001, 0x452c0000, 0x492dd80d, 0x832c0400, + 0x00000005, 0x492fc857, 0x4803c857, 0x1c01f000, + 0x4d2c0000, 0x58ec400c, 0x802041c0, 0x04000008, + 0x4823c857, 0x40225800, 0x592c4001, 0x497a5801, + 0x0201f800, 0x00100580, 0x0401f7f8, 0x4979d80c, + 0x4979d80d, 0x5c025800, 0x1c01f000, 0x42003000, + 0x00000001, 0x0401f009, 0x42003000, 0x00000001, + 0x0401f007, 0x42003000, 0x00000000, 0x0401f004, + 0x42003000, 0x00000000, 0x800408c4, 0x800409c0, + 0x02000800, 0x0010032d, 0x4803c857, 0x4807c857, + 0x480bc857, 0x480fc857, 0x481bc857, 0x48efc857, + 0x4819d801, 0x4801d803, 0x4809d806, 0x480dd807, + 0x4805d805, 0x40ec1000, 0x0201f800, 0x00020016, + 0x4a01d808, 0x00101cb8, 0x1c01f000, 0x40681000, + 0x406c1800, 0x80002d80, 0x480bc857, 0x480fc857, + 0x4813c857, 0x4817c857, 0x8d0e1d20, 0x04000005, + 0x59a80005, 0x8c000516, 0x02020000, 0x0010a082, + 0x4d2c0000, 0x4da00000, 0x42034000, 0x0010b8fa, + 0x59a00018, 0x800001c0, 0x0402000f, 0x0400600e, + 0x480bc020, 0x480fc021, 0x4813c022, 0x4817c023, + 0x900811c0, 0x82081540, 0x00000012, 0x480bc011, + 0x4a03c017, 0x00000000, 0x4203e000, 0x30000001, + 0x0401f050, 0x4c040000, 0x4c1c0000, 0x80000800, + 0x48074018, 0x59a0381b, 0x481fc857, 0x801c39c0, + 0x04020027, 0x82000480, 0x0000000a, 0x04021010, + 0x59a00019, 0x80000000, 0x48034019, 0x59a0021a, + 0x82000400, 0x00000002, 0x82000c80, 0x00000014, + 0x4803421a, 0x04001003, 0x497b421a, 0x41780000, + 0x59a03817, 0x801c3c00, 0x0401f030, 0x4803c856, + 0x0201f800, 0x0010056f, 0x04000007, 0x492f401b, + 0x492f401c, 0x412c3800, 0x497b421d, 0x497a5814, + 0x0401f026, 0x5988001e, 0x80000000, 0x4803101e, + 0x59a00018, 0x80000040, 0x48034018, 0x59a0021a, + 0x59a03817, 0x801c3c00, 0x0401f01c, 0x59a0021d, + 0x82000400, 0x00000002, 0x82000c80, 0x00000013, + 0x04021004, 0x4803421d, 0x801c3c00, 0x0401f013, + 0x0201f800, 0x0010056f, 0x0402000b, 0x5988001e, 0x80000000, 0x4803101e, 0x59a00018, 0x80000040, - 0x48034018, 0x59a0021a, 0x59a03817, 0x801c3c00, - 0x0401f01c, 0x59a0021d, 0x82000400, 0x00000002, - 0x82000c80, 0x00000013, 0x04021004, 0x4803421d, - 0x801c3c00, 0x0401f013, 0x0201f800, 0x0010056f, - 0x0402000b, 0x5988001e, 0x80000000, 0x4803101e, - 0x59a00018, 0x80000040, 0x48034018, 0x4803c856, - 0x59a0021d, 0x801c3c00, 0x0401f006, 0x492f401b, - 0x492c3814, 0x412c3800, 0x497b421d, 0x497a5814, - 0x48083c00, 0x480c3a00, 0x48103c01, 0x48143a01, - 0x5c003800, 0x5c000800, 0x5c034000, 0x5c025800, - 0x1c01f000, 0x40681800, 0x406c2000, 0x40703000, - 0x480fc857, 0x4813c857, 0x481bc857, 0x42000000, - 0x0010bbda, 0x0201f800, 0x0010ad1d, 0x801800d0, - 0x40002800, 0x42001000, 0x00008014, 0x0401f781, - 0x4c000000, 0x599c0017, 0x8c000512, 0x5c000000, - 0x1c01f000, 0x4c000000, 0x599c0018, 0x8c00050e, - 0x5c000000, 0x1c01f000, 0x8d0e1d0e, 0x04000005, - 0x4a034407, 0x00000001, 0x0201f000, 0x00101cfd, - 0x836c0580, 0x00000003, 0x04000005, 0x4a034407, - 0x00000007, 0x0201f000, 0x00101cfd, 0x599c0017, - 0x8c00050a, 0x04000005, 0x4a034407, 0x00000008, - 0x0201f000, 0x00101cfd, 0x59340405, 0x8c000508, - 0x04020004, 0x8c00050a, 0x02020000, 0x00102bcd, - 0x497a5a05, 0x497a5806, 0x4a025c05, 0x00008000, - 0x0201f800, 0x001089f2, 0x04020005, 0x4a034407, - 0x00000003, 0x0201f000, 0x00101cfd, 0x4a01d808, - 0x0010329e, 0x1c01f000, 0x592c0006, 0x82000580, - 0x01000000, 0x04020005, 0x4a034407, 0x00000004, - 0x0201f000, 0x00101cfd, 0x59a28c07, 0x0201f800, - 0x00020319, 0x02020000, 0x00101d01, 0x0201f000, - 0x00102bcd, 0x82001580, 0x0000ffff, 0x04000009, - 0x0201f800, 0x0010548f, 0x02000800, 0x00020319, - 0x0402000c, 0x0201f800, 0x001057e8, 0x0401f009, - 0x42028800, 0x000007ef, 0x0201f800, 0x00020319, - 0x02000800, 0x001057e8, 0x81468840, 0x040217fb, - 0x1c01f000, 0x4803c856, 0x4c0c0000, 0x4d340000, - 0x4d440000, 0x42028800, 0x000007fe, 0x0201f800, - 0x00020319, 0x04020009, 0x5934180a, 0x820c1d00, - 0x00000001, 0x820c1d80, 0x00000001, 0x42001000, - 0x0000801b, 0x0401ff1a, 0x5c028800, 0x5c026800, - 0x5c001800, 0x1c01f000, 0x48efc857, 0x04011000, - 0x48efc840, 0x4a03c842, 0x0000000f, 0x40000000, - 0x040117ff, 0x4a01d80e, 0xbeefbeef, 0x1c01f000, - 0x497b4000, 0x497b4001, 0x497b4002, 0x497b4003, - 0x497b4004, 0x1c01f000, 0x42002000, 0x0010f584, - 0x41580000, 0x41781000, 0x58100c07, 0x800409c0, - 0x04000011, 0x82041d80, 0x00000003, 0x0400000e, - 0x82041c80, 0x00000006, 0x0400100a, 0x82041d80, - 0x0000000a, 0x04000007, 0x82041c80, 0x0000000f, - 0x04001005, 0x82041c80, 0x00000012, 0x04021002, - 0x80081000, 0x82102400, 0x00000024, 0x80100c80, - 0x040017ea, 0x40080000, 0x59a81251, 0x80080480, - 0x04021002, 0x41780000, 0x81640480, 0x04021002, - 0x41780000, 0x1c01f000, 0x59c400a4, 0x4c580000, - 0x4c500000, 0x4c540000, 0x82000500, 0x0000000f, - 0x82000480, 0x00000007, 0x0400100a, 0x82006c80, - 0x00000007, 0x02021800, 0x0010032d, 0x0c01f807, - 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x1c01f000, - 0x0401f915, 0x0401f7fb, 0x00103325, 0x0010332b, - 0x00103350, 0x00103372, 0x0010343a, 0x00103324, - 0x1c01f000, 0x59c40806, 0x8c040d00, 0x04020003, - 0x84040d40, 0x48078806, 0x1c01f000, 0x59c40005, - 0x8c000534, 0x02020000, 0x00103a8b, 0x4a038805, - 0xffffffff, 0x42006000, 0x00020000, 0x0201f800, - 0x00103a70, 0x59a80015, 0x82000500, 0xfffffffa, - 0x84000542, 0x48035015, 0x497b521b, 0x42000800, - 0x0010c1c7, 0x45780800, 0x497b5056, 0x42006000, - 0xffefffff, 0x42006800, 0x40000000, 0x0201f800, - 0x00103a6a, 0x59c40006, 0x82000500, 0xffffff0f, - 0x48038806, 0x42000800, 0x00000010, 0x42001000, - 0x001039d5, 0x0201f800, 0x001057c0, 0x0401f001, - 0x42006000, 0xffffffff, 0x42006800, 0x00800000, - 0x0201f800, 0x00103a6a, 0x4200b000, 0x000000c8, - 0x59c400a4, 0x82000500, 0x0000000f, 0x82000580, - 0x0000000a, 0x0400000f, 0x8058b040, 0x040207f9, - 0x497b5010, 0x42006000, 0xbf7fffff, 0x42006800, - 0x00018000, 0x0201f800, 0x00103a6a, 0x42006000, - 0xfffeffff, 0x41786800, 0x0201f000, 0x00103a6a, - 0x497b5010, 0x4a035055, 0x00000000, 0x80000580, - 0x0201f000, 0x00103a77, 0x4a038805, 0xffffffff, - 0x59a80055, 0x82000c80, 0x00000004, 0x02021800, - 0x0010032d, 0x0c01f001, 0x0010337d, 0x001033ad, - 0x00103430, 0x4803c856, 0x59c400a3, 0x8400051e, - 0x480388a3, 0x4a035055, 0x00000001, 0x59c40008, - 0x82000540, 0x00000080, 0x48038808, 0x0201f800, - 0x00103a4e, 0x42007800, 0x0010b8a0, 0x4a007806, - 0x11010000, 0x4200a000, 0x0010b782, 0x4200a800, - 0x0010b8a7, 0x4200b000, 0x00000002, 0x0201f800, - 0x0010adef, 0x59c40802, 0x84040d0c, 0x48078802, - 0x42000800, 0x00000003, 0x497b505e, 0x0201f800, - 0x00103948, 0x4a03505e, 0x00000001, 0x497b505a, - 0x0201f800, 0x00103a7e, 0x42006000, 0xffffffff, - 0x42006800, 0x00080000, 0x0201f800, 0x00103a6a, - 0x42006000, 0xfff7ffff, 0x41786800, 0x0201f000, - 0x00103a6a, 0x59a8005a, 0x497b505a, 0x80002540, - 0x04000070, 0x59c40004, 0x82000500, 0x00000003, - 0x0402007b, 0x59a80815, 0x8c040d02, 0x04000055, - 0x82100580, 0x0000000c, 0x04020059, 0x82100400, - 0x00000018, 0x8000b104, 0x41cc1000, 0x42001800, - 0x0010b8a0, 0x50080800, 0x500c0000, 0x80040580, - 0x04020021, 0x80081000, 0x800c1800, 0x8058b040, - 0x040207f9, 0x0201f800, 0x00103a7e, 0x59c80015, - 0x84000508, 0x48039015, 0x42006000, 0xffffffff, - 0x42006800, 0x00500000, 0x0201f800, 0x00103a6a, - 0x4a035055, 0x00000002, 0x4a035010, 0x00000002, - 0x0201f800, 0x001013bd, 0x42000800, 0x000007d0, - 0x42001000, 0x0010391c, 0x0201f800, 0x00105904, - 0x59a80015, 0x84000506, 0x48035015, 0x0201f000, - 0x00103a4e, 0x59cc0806, 0x82040d80, 0x11010000, - 0x0402002b, 0x59cc0800, 0x82040500, 0x00ffffff, - 0x0400001a, 0x82000580, 0x000000ef, 0x04020017, - 0x59cc0801, 0x82040500, 0x00ffffff, 0x82000580, - 0x000000ef, 0x04020011, 0x83cca400, 0x00000007, - 0x4200a800, 0x0010b782, 0x4200b000, 0x00000002, - 0x50500800, 0x50540000, 0x80040480, 0x04001007, - 0x04020013, 0x8050a000, 0x8054a800, 0x8058b040, - 0x040207f8, 0x0401f00e, 0x59a80015, 0x84000502, - 0x48035015, 0x59c80015, 0x84000508, 0x48039015, - 0x41cca000, 0x4200a800, 0x0010b8a0, 0x4200b000, - 0x00000009, 0x0201f800, 0x0010adef, 0x0201f800, - 0x00103a7e, 0x42006000, 0xffffffff, 0x42006800, - 0x00080000, 0x0201f800, 0x00103a6a, 0x42006000, - 0xfff7ffff, 0x41786800, 0x0201f800, 0x00103a6a, - 0x42006000, 0xffffffff, 0x42006800, 0x00004000, - 0x0201f800, 0x00103a6a, 0x59c40004, 0x82000500, - 0x00000003, 0x04020006, 0x497b505a, 0x42000800, - 0x00000003, 0x0201f000, 0x00103948, 0x1c01f000, - 0x1c01f000, 0x59a80010, 0x82006d80, 0x0000000f, - 0x04000005, 0x82000580, 0x0000001b, 0x02020800, - 0x00103911, 0x1c01f000, 0x59a80015, 0x84000506, - 0x48035015, 0x497b505e, 0x59a80010, 0x82000c80, - 0x0000001e, 0x02021800, 0x0010032d, 0x0c01f001, - 0x00103478, 0x0010348f, 0x001034b8, 0x001034d3, - 0x001034f6, 0x00103526, 0x00103548, 0x0010357b, - 0x0010359d, 0x001035bf, 0x001035fb, 0x00103622, - 0x00103638, 0x0010364a, 0x00103662, 0x00103679, - 0x0010367e, 0x001036a6, 0x001036c9, 0x001036ef, - 0x00103712, 0x00103746, 0x00103788, 0x001037b0, - 0x001037c8, 0x00103808, 0x00103821, 0x00103834, - 0x00103835, 0x4803c856, 0x4202d800, 0x00000007, - 0x0201f800, 0x00104716, 0x04000007, 0x42006000, - 0xffffffd7, 0x41786800, 0x0201f800, 0x00103a6a, - 0x0401f00b, 0x59c40006, 0x82000500, 0xffffff0f, - 0x48038806, 0x4a038805, 0x000000f0, 0x0201f800, - 0x00104b50, 0x0201f800, 0x00104665, 0x1c01f000, - 0x4803c856, 0x42006000, 0xbf7fffff, 0x42006800, - 0x00400000, 0x0201f800, 0x00103a6a, 0x0201f800, - 0x001013bd, 0x4a035010, 0x00000001, 0x42001000, - 0x001039d5, 0x0201f800, 0x001057e0, 0x0201f800, - 0x001039de, 0x42000800, 0x000007d0, 0x42001000, - 0x0010391c, 0x0201f000, 0x00105904, 0x59a8005a, - 0x82000580, 0x00000014, 0x04020023, 0x4803c857, - 0x42006000, 0xffbfffff, 0x41786800, 0x0201f800, - 0x00103a6a, 0x59c40004, 0x82000500, 0x00000003, - 0x04020019, 0x42001000, 0x0010391c, 0x0201f800, - 0x001057cd, 0x59cc1006, 0x82081580, 0x11020000, + 0x48034018, 0x4803c856, 0x59a0021d, 0x801c3c00, + 0x0401f006, 0x492f401b, 0x492c3814, 0x412c3800, + 0x497b421d, 0x497a5814, 0x48083c00, 0x480c3a00, + 0x48103c01, 0x48143a01, 0x5c003800, 0x5c000800, + 0x5c034000, 0x5c025800, 0x1c01f000, 0x40681800, + 0x406c2000, 0x40703000, 0x480fc857, 0x4813c857, + 0x481bc857, 0x42000000, 0x0010bcda, 0x0201f800, + 0x0010ae10, 0x801800d0, 0x40002800, 0x42001000, + 0x00008014, 0x0401f781, 0x4c000000, 0x599c0017, + 0x8c000512, 0x5c000000, 0x1c01f000, 0x4c000000, + 0x599c0018, 0x8c00050e, 0x5c000000, 0x1c01f000, + 0x8d0e1d0e, 0x04000005, 0x4a034407, 0x00000001, + 0x0201f000, 0x00101d02, 0x836c0580, 0x00000003, + 0x04000005, 0x4a034407, 0x00000007, 0x0201f000, + 0x00101d02, 0x599c0017, 0x8c00050a, 0x04000005, + 0x4a034407, 0x00000008, 0x0201f000, 0x00101d02, + 0x59340405, 0x8c000508, 0x04020004, 0x8c00050a, + 0x02020000, 0x00102bd7, 0x497a5a05, 0x497a5806, + 0x4a025c05, 0x00008000, 0x0201f800, 0x00108aab, + 0x04020005, 0x4a034407, 0x00000003, 0x0201f000, + 0x00101d02, 0x4a01d808, 0x001032a8, 0x1c01f000, + 0x592c0006, 0x82000580, 0x01000000, 0x04020005, + 0x4a034407, 0x00000004, 0x0201f000, 0x00101d02, + 0x59a28c07, 0x0201f800, 0x00020319, 0x02020000, + 0x00101d06, 0x0201f000, 0x00102bd7, 0x82001580, + 0x0000ffff, 0x04000009, 0x0201f800, 0x001054fb, + 0x02000800, 0x00020319, 0x0402000c, 0x0201f800, + 0x0010588d, 0x0401f009, 0x42028800, 0x000007ef, + 0x0201f800, 0x00020319, 0x02000800, 0x0010588d, + 0x81468840, 0x040217fb, 0x1c01f000, 0x4803c856, + 0x4c0c0000, 0x4d340000, 0x4d440000, 0x42028800, + 0x000007fe, 0x0201f800, 0x00020319, 0x04020009, + 0x5934180a, 0x820c1d00, 0x00000001, 0x820c1d80, + 0x00000001, 0x42001000, 0x0000801b, 0x0401ff1a, + 0x5c028800, 0x5c026800, 0x5c001800, 0x1c01f000, + 0x48efc857, 0x04011000, 0x48efc840, 0x4a03c842, + 0x0000000f, 0x40000000, 0x040117ff, 0x4a01d80e, + 0xbeefbeef, 0x1c01f000, 0x497b4000, 0x497b4001, + 0x497b4002, 0x497b4003, 0x497b4004, 0x1c01f000, + 0x42002000, 0x0010f694, 0x41580000, 0x41781000, + 0x58100c07, 0x800409c0, 0x04000011, 0x82041d80, + 0x00000003, 0x0400000e, 0x82041c80, 0x00000006, + 0x0400100a, 0x82041d80, 0x0000000a, 0x04000007, + 0x82041c80, 0x0000000f, 0x04001005, 0x82041c80, + 0x00000012, 0x04021002, 0x80081000, 0x82102400, + 0x00000024, 0x80100c80, 0x040017ea, 0x40080000, + 0x59a81251, 0x80080480, 0x04021002, 0x41780000, + 0x81640480, 0x04021002, 0x41780000, 0x1c01f000, + 0x59a80005, 0x8c000514, 0x04000006, 0x42000000, + 0x0010b939, 0x50000000, 0x82000500, 0x00000028, + 0x1c01f000, 0x59c400a4, 0x4c580000, 0x4c500000, + 0x4c540000, 0x82000500, 0x0000000f, 0x82000480, + 0x00000007, 0x0400100a, 0x82006c80, 0x00000007, + 0x02021800, 0x0010032d, 0x0c01f807, 0x5c00a800, + 0x5c00a000, 0x5c00b000, 0x1c01f000, 0x0401f915, + 0x0401f7fb, 0x00103338, 0x0010333e, 0x00103363, + 0x00103385, 0x0010344d, 0x00103337, 0x1c01f000, + 0x59c40806, 0x8c040d00, 0x04020003, 0x84040d40, + 0x48078806, 0x1c01f000, 0x59c40005, 0x8c000534, + 0x02020000, 0x00103a9e, 0x4a038805, 0xffffffff, + 0x42006000, 0x00020000, 0x0201f800, 0x00103a83, + 0x59a80015, 0x82000500, 0xfffffffa, 0x84000542, + 0x48035015, 0x497b521b, 0x42000800, 0x0010c2c7, + 0x45780800, 0x497b5056, 0x42006000, 0xffefffff, + 0x42006800, 0x40000000, 0x0201f800, 0x00103a7d, + 0x59c40006, 0x82000500, 0xffffff0f, 0x48038806, + 0x42000800, 0x00000010, 0x42001000, 0x001039e8, + 0x0201f800, 0x00105865, 0x0401f001, 0x42006000, + 0xffffffff, 0x42006800, 0x00800000, 0x0201f800, + 0x00103a7d, 0x4200b000, 0x000000c8, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x0000000a, + 0x0400000f, 0x8058b040, 0x040207f9, 0x497b5010, + 0x42006000, 0xbf7fffff, 0x42006800, 0x00018000, + 0x0201f800, 0x00103a7d, 0x42006000, 0xfffeffff, + 0x41786800, 0x0201f000, 0x00103a7d, 0x497b5010, + 0x4a035055, 0x00000000, 0x80000580, 0x0201f000, + 0x00103a8a, 0x4a038805, 0xffffffff, 0x59a80055, + 0x82000c80, 0x00000004, 0x02021800, 0x0010032d, + 0x0c01f001, 0x00103390, 0x001033c0, 0x00103443, + 0x4803c856, 0x59c400a3, 0x8400051e, 0x480388a3, + 0x4a035055, 0x00000001, 0x59c40008, 0x82000540, + 0x00000080, 0x48038808, 0x0201f800, 0x00103a61, + 0x42007800, 0x0010b9a0, 0x4a007806, 0x11010000, + 0x4200a000, 0x0010b882, 0x4200a800, 0x0010b9a7, + 0x4200b000, 0x00000002, 0x0201f800, 0x0010aee2, + 0x59c40802, 0x84040d0c, 0x48078802, 0x42000800, + 0x00000003, 0x497b505e, 0x0201f800, 0x0010395b, + 0x4a03505e, 0x00000001, 0x497b505a, 0x0201f800, + 0x00103a91, 0x42006000, 0xffffffff, 0x42006800, + 0x00080000, 0x0201f800, 0x00103a7d, 0x42006000, + 0xfff7ffff, 0x41786800, 0x0201f000, 0x00103a7d, + 0x59a8005a, 0x497b505a, 0x80002540, 0x04000070, + 0x59c40004, 0x82000500, 0x00000003, 0x0402007b, + 0x59a80815, 0x8c040d02, 0x04000055, 0x82100580, + 0x0000000c, 0x04020059, 0x82100400, 0x00000018, + 0x8000b104, 0x41cc1000, 0x42001800, 0x0010b9a0, + 0x50080800, 0x500c0000, 0x80040580, 0x04020021, + 0x80081000, 0x800c1800, 0x8058b040, 0x040207f9, + 0x0201f800, 0x00103a91, 0x59c80015, 0x84000508, + 0x48039015, 0x42006000, 0xffffffff, 0x42006800, + 0x00500000, 0x0201f800, 0x00103a7d, 0x4a035055, + 0x00000002, 0x4a035010, 0x00000002, 0x0201f800, + 0x001013be, 0x42000800, 0x000007d0, 0x42001000, + 0x0010392f, 0x0201f800, 0x001059a9, 0x59a80015, + 0x84000506, 0x48035015, 0x0201f000, 0x00103a61, + 0x59cc0806, 0x82040d80, 0x11010000, 0x0402002b, + 0x59cc0800, 0x82040500, 0x00ffffff, 0x0400001a, + 0x82000580, 0x000000ef, 0x04020017, 0x59cc0801, + 0x82040500, 0x00ffffff, 0x82000580, 0x000000ef, + 0x04020011, 0x83cca400, 0x00000007, 0x4200a800, + 0x0010b882, 0x4200b000, 0x00000002, 0x50500800, + 0x50540000, 0x80040480, 0x04001007, 0x04020013, + 0x8050a000, 0x8054a800, 0x8058b040, 0x040207f8, + 0x0401f00e, 0x59a80015, 0x84000502, 0x48035015, + 0x59c80015, 0x84000508, 0x48039015, 0x41cca000, + 0x4200a800, 0x0010b9a0, 0x4200b000, 0x00000009, + 0x0201f800, 0x0010aee2, 0x0201f800, 0x00103a91, + 0x42006000, 0xffffffff, 0x42006800, 0x00080000, + 0x0201f800, 0x00103a7d, 0x42006000, 0xfff7ffff, + 0x41786800, 0x0201f800, 0x00103a7d, 0x42006000, + 0xffffffff, 0x42006800, 0x00004000, 0x0201f800, + 0x00103a7d, 0x59c40004, 0x82000500, 0x00000003, + 0x04020006, 0x497b505a, 0x42000800, 0x00000003, + 0x0201f000, 0x0010395b, 0x1c01f000, 0x1c01f000, + 0x59a80010, 0x82006d80, 0x0000000f, 0x04000005, + 0x82000580, 0x0000001b, 0x02020800, 0x00103924, + 0x1c01f000, 0x59a80015, 0x84000506, 0x48035015, + 0x497b505e, 0x59a80010, 0x82000c80, 0x0000001e, + 0x02021800, 0x0010032d, 0x0c01f001, 0x0010348b, + 0x001034a2, 0x001034cb, 0x001034e6, 0x00103509, + 0x00103539, 0x0010355b, 0x0010358e, 0x001035b0, + 0x001035d2, 0x0010360e, 0x00103635, 0x0010364b, + 0x0010365d, 0x00103675, 0x0010368c, 0x00103691, + 0x001036b9, 0x001036dc, 0x00103702, 0x00103725, + 0x00103759, 0x0010379b, 0x001037c3, 0x001037db, + 0x0010381b, 0x00103834, 0x00103847, 0x00103848, + 0x4803c856, 0x4202d800, 0x00000007, 0x0201f800, + 0x00104755, 0x04000007, 0x42006000, 0xffffffd7, + 0x41786800, 0x0201f800, 0x00103a7d, 0x0401f00b, + 0x59c40006, 0x82000500, 0xffffff0f, 0x48038806, + 0x4a038805, 0x000000f0, 0x0201f800, 0x00104b8f, + 0x0201f800, 0x001046a4, 0x1c01f000, 0x4803c856, + 0x42006000, 0xbf7fffff, 0x42006800, 0x00400000, + 0x0201f800, 0x00103a7d, 0x0201f800, 0x001013be, + 0x4a035010, 0x00000001, 0x42001000, 0x001039e8, + 0x0201f800, 0x00105885, 0x0201f800, 0x001039f1, + 0x42000800, 0x000007d0, 0x42001000, 0x0010392f, + 0x0201f000, 0x001059a9, 0x59a8005a, 0x82000580, + 0x00000014, 0x04020023, 0x4803c857, 0x42006000, + 0xffbfffff, 0x41786800, 0x0201f800, 0x00103a7d, + 0x59c40004, 0x82000500, 0x00000003, 0x04020019, + 0x42001000, 0x0010392f, 0x0201f800, 0x00105872, + 0x59cc1006, 0x82081580, 0x11020000, 0x04020012, + 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, + 0x8c000504, 0x04020008, 0x42000000, 0x0010bc6b, + 0x0201f800, 0x0010ae10, 0x59a80015, 0x84000544, + 0x48035015, 0x4a035010, 0x00000010, 0x0401f1ca, + 0x1c01f000, 0x0201f000, 0x00103924, 0x4803c856, + 0x4a035010, 0x00000003, 0x42006000, 0xbf3fffff, + 0x42006800, 0x00100000, 0x0201f800, 0x00103a7d, + 0x42001000, 0x001039e8, 0x0201f800, 0x00105885, + 0x0201f800, 0x001039f1, 0x42001000, 0x0010392f, + 0x0201f800, 0x00105872, 0x42007800, 0x0010b9a6, + 0x46007800, 0x11020000, 0x42000800, 0x00000005, + 0x0201f000, 0x0010395b, 0x59a8005a, 0x80000540, + 0x0400001e, 0x4803c857, 0x42001000, 0x0010392f, + 0x0201f800, 0x00105872, 0x59a8005a, 0x82000580, + 0x00000014, 0x04020016, 0x59cc1006, 0x82081580, + 0x11020000, 0x04020012, 0x59cc1007, 0x8c08153e, + 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, + 0x42000000, 0x0010bc6b, 0x0201f800, 0x0010ae10, + 0x59a80015, 0x84000544, 0x48035015, 0x4a035010, + 0x00000004, 0x0401f004, 0x1c01f000, 0x0201f000, + 0x00103924, 0x4803c856, 0x4a035010, 0x00000005, + 0x83cca400, 0x00000006, 0x4200a800, 0x0010b9a6, + 0x4200b000, 0x00000005, 0x0201f800, 0x0010aee2, + 0x42007800, 0x0010b9a6, 0x46007800, 0x11030000, + 0x8d0e1d06, 0x04020014, 0x59a80015, 0x8c000500, + 0x04020011, 0x59a8080f, 0x82040580, 0x00ffffff, + 0x0400000d, 0x82040d00, 0x000000ff, 0x82040400, + 0x00101b0f, 0x50000800, 0x80040910, 0x42001000, + 0x00000004, 0x0401fb92, 0x0400000b, 0x0201f800, + 0x00103a0b, 0x4200b000, 0x00000004, 0x83cca400, + 0x00000007, 0x4200a800, 0x0010b9a7, 0x0201f800, + 0x0010aee2, 0x42000800, 0x00000005, 0x0201f000, + 0x0010395b, 0x59a8005a, 0x80000540, 0x0400001e, + 0x4803c857, 0x42001000, 0x0010392f, 0x0201f800, + 0x00105872, 0x59a8005a, 0x82000580, 0x00000014, + 0x04020016, 0x59cc1006, 0x82081580, 0x11030000, 0x04020012, 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, - 0x0010bb6b, 0x0201f800, 0x0010ad1d, 0x59a80015, - 0x84000544, 0x48035015, 0x4a035010, 0x00000010, - 0x0401f1ca, 0x1c01f000, 0x0201f000, 0x00103911, - 0x4803c856, 0x4a035010, 0x00000003, 0x42006000, - 0xbf3fffff, 0x42006800, 0x00100000, 0x0201f800, - 0x00103a6a, 0x42001000, 0x001039d5, 0x0201f800, - 0x001057e0, 0x0201f800, 0x001039de, 0x42001000, - 0x0010391c, 0x0201f800, 0x001057cd, 0x42007800, - 0x0010b8a6, 0x46007800, 0x11020000, 0x42000800, - 0x00000005, 0x0201f000, 0x00103948, 0x59a8005a, - 0x80000540, 0x0400001e, 0x4803c857, 0x42001000, - 0x0010391c, 0x0201f800, 0x001057cd, 0x59a8005a, - 0x82000580, 0x00000014, 0x04020016, 0x59cc1006, - 0x82081580, 0x11020000, 0x04020012, 0x59cc1007, - 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, - 0x04020008, 0x42000000, 0x0010bb6b, 0x0201f800, - 0x0010ad1d, 0x59a80015, 0x84000544, 0x48035015, - 0x4a035010, 0x00000004, 0x0401f004, 0x1c01f000, - 0x0201f000, 0x00103911, 0x4803c856, 0x4a035010, - 0x00000005, 0x83cca400, 0x00000006, 0x4200a800, - 0x0010b8a6, 0x4200b000, 0x00000005, 0x0201f800, - 0x0010adef, 0x42007800, 0x0010b8a6, 0x46007800, - 0x11030000, 0x8d0e1d06, 0x04020014, 0x59a80015, - 0x8c000500, 0x04020011, 0x59a8080f, 0x82040580, - 0x00ffffff, 0x0400000d, 0x82040d00, 0x000000ff, - 0x82040400, 0x00101b0a, 0x50000800, 0x80040910, - 0x42001000, 0x00000004, 0x0401fb92, 0x0400000b, - 0x0201f800, 0x001039f8, 0x4200b000, 0x00000004, - 0x83cca400, 0x00000007, 0x4200a800, 0x0010b8a7, - 0x0201f800, 0x0010adef, 0x42000800, 0x00000005, - 0x0201f000, 0x00103948, 0x59a8005a, 0x80000540, - 0x0400001e, 0x4803c857, 0x42001000, 0x0010391c, - 0x0201f800, 0x001057cd, 0x59a8005a, 0x82000580, - 0x00000014, 0x04020016, 0x59cc1006, 0x82081580, - 0x11030000, 0x04020012, 0x59cc1007, 0x8c08153e, - 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, - 0x42000000, 0x0010bb6b, 0x0201f800, 0x0010ad1d, - 0x59a80015, 0x84000544, 0x48035015, 0x4a035010, - 0x00000006, 0x0401f003, 0x1c01f000, 0x0401f3ca, - 0x4803c856, 0x4a035010, 0x00000007, 0x83cca400, - 0x00000006, 0x4200a800, 0x0010b8a6, 0x4200b000, - 0x00000005, 0x0201f800, 0x0010adef, 0x42007800, - 0x0010b8a6, 0x46007800, 0x11040000, 0x8d0e1d06, - 0x04020020, 0x59a80015, 0x8c000500, 0x0402001d, - 0x599c0017, 0x8c000500, 0x0400001a, 0x599c1402, - 0x82080480, 0x0000007f, 0x02021800, 0x0010032d, - 0x4c080000, 0x82081400, 0x00101b0a, 0x50081000, - 0x82081500, 0x000000ff, 0x480b500f, 0x42000800, - 0x00000003, 0x0201f800, 0x00106134, 0x5c000800, - 0x42001000, 0x00000004, 0x0401fb36, 0x04000005, - 0x0401fcfd, 0x04000003, 0x4803c856, 0x850e1d46, - 0x42000800, 0x00000005, 0x0401f3ce, 0x59a8005a, - 0x80000540, 0x0400001e, 0x4803c857, 0x42001000, - 0x0010391c, 0x0201f800, 0x001057cd, 0x59a8005a, - 0x82000580, 0x00000014, 0x04020016, 0x59cc1006, - 0x82081580, 0x11040000, 0x04020012, 0x59cc1007, - 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, - 0x04020008, 0x42000000, 0x0010bb6b, 0x0201f800, - 0x0010ad1d, 0x59a80015, 0x84000544, 0x48035015, - 0x4a035010, 0x00000008, 0x0401f003, 0x1c01f000, - 0x0401f375, 0x4803c856, 0x4a035010, 0x00000009, - 0x83cca400, 0x00000006, 0x4200a800, 0x0010b8a6, - 0x4200b000, 0x00000005, 0x0201f800, 0x0010adef, - 0x42007800, 0x0010b8a6, 0x46007800, 0x11050100, - 0x8d0e1d06, 0x04020008, 0x59a80015, 0x8c000500, - 0x04020005, 0x0401fa85, 0x04020003, 0x4803c856, - 0x850e1d46, 0x42000800, 0x00000005, 0x0401fb91, - 0x4d3c0000, 0x42027800, 0x00000001, 0x0201f800, - 0x00109146, 0x5c027800, 0x1c01f000, 0x59a8005a, - 0x80000540, 0x04000038, 0x4803c857, 0x42001000, - 0x0010391c, 0x0201f800, 0x001057cd, 0x59a8005a, - 0x82000580, 0x00000014, 0x04020030, 0x59cc1006, - 0x82080500, 0x11050000, 0x82000580, 0x11050000, - 0x0402002a, 0x8c081510, 0x04000014, 0x59cc1007, - 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, - 0x04020008, 0x42000000, 0x0010bb6b, 0x0201f800, - 0x0010ad1d, 0x59a80015, 0x84000544, 0x48035015, - 0x4a035056, 0x00000001, 0x4a035010, 0x0000000a, - 0x0401f817, 0x0401f014, 0x80000540, 0x04020013, - 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, - 0x8c000504, 0x04020008, 0x42000000, 0x0010bb6b, - 0x0201f800, 0x0010ad1d, 0x59a80015, 0x84000544, - 0x48035015, 0x497b5056, 0x4a035010, 0x0000000e, - 0x0401f06a, 0x1c01f000, 0x0401f317, 0x4803c856, - 0x4a035010, 0x0000000b, 0x42001000, 0x0010b8a7, - 0x4008a800, 0x4200b000, 0x00000020, 0x4600a800, - 0xffffffff, 0x8054a800, 0x8058b040, 0x040207fc, - 0x42007800, 0x0010b8a6, 0x46007800, 0x11060000, - 0x42001000, 0x0010b8a7, 0x8d0e1d06, 0x04000005, - 0x50080000, 0x46001000, 0x00ffffff, 0x0401f00c, - 0x50080800, 0x82040d00, 0x0000ffff, 0x59a8000f, - 0x82000500, 0x000000ff, 0x82000540, 0x00000100, - 0x800000e0, 0x80040d40, 0x44041000, 0x42000800, - 0x00000021, 0x0401f327, 0x59a8005a, 0x80000540, - 0x04000012, 0x4803c857, 0x59a8005a, 0x42001000, - 0x0010391c, 0x0201f800, 0x001057cd, 0x59a8005a, - 0x82000580, 0x00000084, 0x04020009, 0x59cc1006, - 0x82081580, 0x11060000, 0x04020005, 0x4a035010, - 0x0000000c, 0x0401f003, 0x1c01f000, 0x0401f2da, - 0x4803c856, 0x4a035010, 0x0000000d, 0x83cca400, - 0x00000006, 0x4200a800, 0x0010b8a6, 0x4200b000, - 0x00000021, 0x0201f800, 0x0010adef, 0x42007800, - 0x0010b8a6, 0x46007800, 0x11070000, 0x42000800, - 0x00000021, 0x0401f2ff, 0x59a8005a, 0x80000540, - 0x04000014, 0x4803c857, 0x59a8005a, 0x42001000, - 0x0010391c, 0x0201f800, 0x001057cd, 0x82000580, - 0x00000084, 0x0402000c, 0x59cc1006, 0x82081580, - 0x11070000, 0x04020008, 0x4a035056, 0x00000001, - 0x0401fa90, 0x4a035010, 0x0000000e, 0x0401f003, - 0x1c01f000, 0x0401f2b0, 0x4803c856, 0x82040d40, - 0x00000001, 0x0201f800, 0x00103a77, 0x4a035010, - 0x0000000f, 0x497b505a, 0x42006000, 0xffffffff, - 0x42006800, 0x00300000, 0x0401fbfc, 0x42006000, - 0xffdfffff, 0x41786800, 0x0401fbf8, 0x42000800, - 0x000007d0, 0x42001000, 0x0010391c, 0x0201f000, - 0x001057a4, 0x4803c856, 0x59a8005a, 0x80000540, - 0x04020295, 0x1c01f000, 0x4803c856, 0x4a035010, - 0x00000011, 0x83cca400, 0x00000006, 0x4200a800, - 0x0010b8a6, 0x4200b000, 0x00000005, 0x0201f800, - 0x0010adef, 0x4200a800, 0x0010b8a6, 0x4600a800, - 0x11020000, 0x8d0e1d06, 0x04020015, 0x59a8000f, - 0x82000d00, 0xffff0000, 0x04000011, 0x82000500, - 0x000000ff, 0x0400000e, 0x82000c00, 0x00101b0a, - 0x50040800, 0x80040910, 0x82040580, 0x0000007e, - 0x04000007, 0x82040580, 0x00000080, 0x04000004, - 0x42001000, 0x00000004, 0x0401fa06, 0x42000800, - 0x00000005, 0x0401f2a3, 0x59a8005a, 0x80000540, - 0x04000020, 0x4803c857, 0x42001000, 0x0010391c, - 0x0201f800, 0x001057cd, 0x59a8005a, 0x82000580, - 0x00000014, 0x04020016, 0x59cc1006, 0x82081580, - 0x11030000, 0x04020012, 0x59cc1007, 0x8c08153e, - 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, - 0x42000000, 0x0010bb6b, 0x0201f800, 0x0010ad1d, - 0x59a80015, 0x84000544, 0x48035015, 0x4a035010, - 0x00000012, 0x0401f804, 0x0401f002, 0x0401fa4a, - 0x1c01f000, 0x4803c856, 0x4a035010, 0x00000013, - 0x83cca400, 0x00000006, 0x4200a800, 0x0010b8a6, - 0x4200b000, 0x00000005, 0x0201f800, 0x0010adef, - 0x4200a800, 0x0010b8a6, 0x4600a800, 0x11030000, - 0x8d0e1d06, 0x04020013, 0x59a80015, 0x8c000500, - 0x04020010, 0x59a8080f, 0x82040580, 0x00ffffff, - 0x0400000c, 0x82040d00, 0x000000ff, 0x82040400, - 0x00101b0a, 0x50000800, 0x80040910, 0x42001000, - 0x00000004, 0x0401f9bf, 0x04000002, 0x0401fb0d, - 0x42000800, 0x00000005, 0x0401f25a, 0x59a8005a, - 0x80000540, 0x04000020, 0x4803c857, 0x42001000, - 0x0010391c, 0x0201f800, 0x001057cd, 0x59a8005a, - 0x82000580, 0x00000014, 0x04020016, 0x59cc1006, - 0x82081580, 0x11040000, 0x04020012, 0x59cc1007, - 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, - 0x04020008, 0x42000000, 0x0010bb6b, 0x0201f800, - 0x0010ad1d, 0x59a80015, 0x84000544, 0x48035015, - 0x4a035010, 0x00000014, 0x0401f804, 0x0401f002, - 0x0401fa01, 0x1c01f000, 0x4803c856, 0x4a035010, - 0x00000015, 0x83cca400, 0x00000006, 0x4200a800, - 0x0010b8a6, 0x4200b000, 0x00000005, 0x0201f800, - 0x0010adef, 0x4200a800, 0x0010b8a6, 0x4600a800, - 0x11040000, 0x8d0e1d06, 0x04020021, 0x59a80015, - 0x8c000500, 0x0402001e, 0x599c0017, 0x8c000500, - 0x0400001b, 0x599c1402, 0x82080480, 0x0000007f, - 0x02021800, 0x0010032d, 0x4c080000, 0x82081400, - 0x00101b0a, 0x50081000, 0x82081500, 0x000000ff, - 0x480b500f, 0x42000800, 0x00000003, 0x0201f800, - 0x00106134, 0x5c000800, 0x42001000, 0x00000004, - 0x0401f96c, 0x04000006, 0x0201f800, 0x00103271, + 0x0010bc6b, 0x0201f800, 0x0010ae10, 0x59a80015, + 0x84000544, 0x48035015, 0x4a035010, 0x00000006, + 0x0401f003, 0x1c01f000, 0x0401f3ca, 0x4803c856, + 0x4a035010, 0x00000007, 0x83cca400, 0x00000006, + 0x4200a800, 0x0010b9a6, 0x4200b000, 0x00000005, + 0x0201f800, 0x0010aee2, 0x42007800, 0x0010b9a6, + 0x46007800, 0x11040000, 0x8d0e1d06, 0x04020020, + 0x59a80015, 0x8c000500, 0x0402001d, 0x599c0017, + 0x8c000500, 0x0400001a, 0x599c1402, 0x82080480, + 0x0000007f, 0x02021800, 0x0010032d, 0x4c080000, + 0x82081400, 0x00101b0f, 0x50081000, 0x82081500, + 0x000000ff, 0x480b500f, 0x42000800, 0x00000003, + 0x0201f800, 0x001061d9, 0x5c000800, 0x42001000, + 0x00000004, 0x0401fb36, 0x04000005, 0x0401fcf4, 0x04000003, 0x4803c856, 0x850e1d46, 0x42000800, - 0x00000005, 0x0401f203, 0x59a8005a, 0x80000540, - 0x0400003f, 0x4803c857, 0x42001000, 0x0010391c, - 0x0201f800, 0x001057cd, 0x59a8005a, 0x82000580, - 0x00000014, 0x04020035, 0x59cc1006, 0x82080500, - 0x11050000, 0x82000580, 0x11050000, 0x0402002f, - 0x8c081510, 0x04000010, 0x0401fb1d, 0x59cc1007, + 0x00000005, 0x0401f3ce, 0x59a8005a, 0x80000540, + 0x0400001e, 0x4803c857, 0x42001000, 0x0010392f, + 0x0201f800, 0x00105872, 0x59a8005a, 0x82000580, + 0x00000014, 0x04020016, 0x59cc1006, 0x82081580, + 0x11040000, 0x04020012, 0x59cc1007, 0x8c08153e, + 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, + 0x42000000, 0x0010bc6b, 0x0201f800, 0x0010ae10, + 0x59a80015, 0x84000544, 0x48035015, 0x4a035010, + 0x00000008, 0x0401f003, 0x1c01f000, 0x0401f375, + 0x4803c856, 0x4a035010, 0x00000009, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010b9a6, 0x4200b000, + 0x00000005, 0x0201f800, 0x0010aee2, 0x42007800, + 0x0010b9a6, 0x46007800, 0x11050100, 0x8d0e1d06, + 0x04020008, 0x59a80015, 0x8c000500, 0x04020005, + 0x0401fa85, 0x04020003, 0x4803c856, 0x850e1d46, + 0x42000800, 0x00000005, 0x0401fb91, 0x4d3c0000, + 0x42027800, 0x00000001, 0x0201f800, 0x001091ff, + 0x5c027800, 0x1c01f000, 0x59a8005a, 0x80000540, + 0x04000038, 0x4803c857, 0x42001000, 0x0010392f, + 0x0201f800, 0x00105872, 0x59a8005a, 0x82000580, + 0x00000014, 0x04020030, 0x59cc1006, 0x82080500, + 0x11050000, 0x82000580, 0x11050000, 0x0402002a, + 0x8c081510, 0x04000014, 0x59cc1007, 0x8c08153e, + 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, + 0x42000000, 0x0010bc6b, 0x0201f800, 0x0010ae10, + 0x59a80015, 0x84000544, 0x48035015, 0x4a035056, + 0x00000001, 0x4a035010, 0x0000000a, 0x0401f817, + 0x0401f014, 0x80000540, 0x04020013, 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, - 0x04020008, 0x42000000, 0x0010bb6b, 0x0201f800, - 0x0010ad1d, 0x59a80015, 0x84000544, 0x48035015, - 0x0401f013, 0x59cc1007, 0x8c08153e, 0x0400000b, + 0x04020008, 0x42000000, 0x0010bc6b, 0x0201f800, + 0x0010ae10, 0x59a80015, 0x84000544, 0x48035015, + 0x497b5056, 0x4a035010, 0x0000000e, 0x0401f06a, + 0x1c01f000, 0x0401f317, 0x4803c856, 0x4a035010, + 0x0000000b, 0x42001000, 0x0010b9a7, 0x4008a800, + 0x4200b000, 0x00000020, 0x4600a800, 0xffffffff, + 0x8054a800, 0x8058b040, 0x040207fc, 0x42007800, + 0x0010b9a6, 0x46007800, 0x11060000, 0x42001000, + 0x0010b9a7, 0x8d0e1d06, 0x04000005, 0x50080000, + 0x46001000, 0x00ffffff, 0x0401f00c, 0x50080800, + 0x82040d00, 0x0000ffff, 0x59a8000f, 0x82000500, + 0x000000ff, 0x82000540, 0x00000100, 0x800000e0, + 0x80040d40, 0x44041000, 0x42000800, 0x00000021, + 0x0401f327, 0x59a8005a, 0x80000540, 0x04000012, + 0x4803c857, 0x59a8005a, 0x42001000, 0x0010392f, + 0x0201f800, 0x00105872, 0x59a8005a, 0x82000580, + 0x00000084, 0x04020009, 0x59cc1006, 0x82081580, + 0x11060000, 0x04020005, 0x4a035010, 0x0000000c, + 0x0401f003, 0x1c01f000, 0x0401f2da, 0x4803c856, + 0x4a035010, 0x0000000d, 0x83cca400, 0x00000006, + 0x4200a800, 0x0010b9a6, 0x4200b000, 0x00000021, + 0x0201f800, 0x0010aee2, 0x42007800, 0x0010b9a6, + 0x46007800, 0x11070000, 0x42000800, 0x00000021, + 0x0401f2ff, 0x59a8005a, 0x80000540, 0x04000014, + 0x4803c857, 0x59a8005a, 0x42001000, 0x0010392f, + 0x0201f800, 0x00105872, 0x82000580, 0x00000084, + 0x0402000c, 0x59cc1006, 0x82081580, 0x11070000, + 0x04020008, 0x4a035056, 0x00000001, 0x0401fa90, + 0x4a035010, 0x0000000e, 0x0401f003, 0x1c01f000, + 0x0401f2b0, 0x4803c856, 0x82040d40, 0x00000001, + 0x0201f800, 0x00103a8a, 0x4a035010, 0x0000000f, + 0x497b505a, 0x42006000, 0xffffffff, 0x42006800, + 0x00300000, 0x0401fbfc, 0x42006000, 0xffdfffff, + 0x41786800, 0x0401fbf8, 0x42000800, 0x000007d0, + 0x42001000, 0x0010392f, 0x0201f000, 0x00105849, + 0x4803c856, 0x59a8005a, 0x80000540, 0x04020295, + 0x1c01f000, 0x4803c856, 0x4a035010, 0x00000011, + 0x83cca400, 0x00000006, 0x4200a800, 0x0010b9a6, + 0x4200b000, 0x00000005, 0x0201f800, 0x0010aee2, + 0x4200a800, 0x0010b9a6, 0x4600a800, 0x11020000, + 0x8d0e1d06, 0x04020015, 0x59a8000f, 0x82000d00, + 0xffff0000, 0x04000011, 0x82000500, 0x000000ff, + 0x0400000e, 0x82000c00, 0x00101b0f, 0x50040800, + 0x80040910, 0x82040580, 0x0000007e, 0x04000007, + 0x82040580, 0x00000080, 0x04000004, 0x42001000, + 0x00000004, 0x0401fa06, 0x42000800, 0x00000005, + 0x0401f2a3, 0x59a8005a, 0x80000540, 0x04000020, + 0x4803c857, 0x42001000, 0x0010392f, 0x0201f800, + 0x00105872, 0x59a8005a, 0x82000580, 0x00000014, + 0x04020016, 0x59cc1006, 0x82081580, 0x11030000, + 0x04020012, 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, - 0x0010bb6b, 0x0201f800, 0x0010ad1d, 0x59a80015, - 0x84000544, 0x48035015, 0x82000540, 0x00000001, - 0x0401faff, 0x497b5056, 0x0401f003, 0x4a035056, - 0x00000001, 0x59cc1007, 0x8c08153c, 0x04000003, - 0x4a03521b, 0x00000008, 0x4a035010, 0x00000016, - 0x0401f804, 0x0401f002, 0x0401f98b, 0x1c01f000, - 0x4803c856, 0x83cca400, 0x00000006, 0x4200a800, - 0x0010b8a6, 0x4200b000, 0x00000005, 0x0201f800, - 0x0010adef, 0x4a035010, 0x00000017, 0x59a80056, - 0x8c000500, 0x04000006, 0x42001000, 0x0010b8a6, - 0x46001000, 0x11050100, 0x0401f003, 0x4a035010, - 0x0000001b, 0x8d0e1d06, 0x04020008, 0x59a80015, - 0x8c000500, 0x04020005, 0x0401f894, 0x04020003, + 0x0010bc6b, 0x0201f800, 0x0010ae10, 0x59a80015, + 0x84000544, 0x48035015, 0x4a035010, 0x00000012, + 0x0401f804, 0x0401f002, 0x0401fa4a, 0x1c01f000, + 0x4803c856, 0x4a035010, 0x00000013, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010b9a6, 0x4200b000, + 0x00000005, 0x0201f800, 0x0010aee2, 0x4200a800, + 0x0010b9a6, 0x4600a800, 0x11030000, 0x8d0e1d06, + 0x04020013, 0x59a80015, 0x8c000500, 0x04020010, + 0x59a8080f, 0x82040580, 0x00ffffff, 0x0400000c, + 0x82040d00, 0x000000ff, 0x82040400, 0x00101b0f, + 0x50000800, 0x80040910, 0x42001000, 0x00000004, + 0x0401f9bf, 0x04000002, 0x0401fb0d, 0x42000800, + 0x00000005, 0x0401f25a, 0x59a8005a, 0x80000540, + 0x04000020, 0x4803c857, 0x42001000, 0x0010392f, + 0x0201f800, 0x00105872, 0x59a8005a, 0x82000580, + 0x00000014, 0x04020016, 0x59cc1006, 0x82081580, + 0x11040000, 0x04020012, 0x59cc1007, 0x8c08153e, + 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, + 0x42000000, 0x0010bc6b, 0x0201f800, 0x0010ae10, + 0x59a80015, 0x84000544, 0x48035015, 0x4a035010, + 0x00000014, 0x0401f804, 0x0401f002, 0x0401fa01, + 0x1c01f000, 0x4803c856, 0x4a035010, 0x00000015, + 0x83cca400, 0x00000006, 0x4200a800, 0x0010b9a6, + 0x4200b000, 0x00000005, 0x0201f800, 0x0010aee2, + 0x4200a800, 0x0010b9a6, 0x4600a800, 0x11040000, + 0x8d0e1d06, 0x04020021, 0x59a80015, 0x8c000500, + 0x0402001e, 0x599c0017, 0x8c000500, 0x0400001b, + 0x599c1402, 0x82080480, 0x0000007f, 0x02021800, + 0x0010032d, 0x4c080000, 0x82081400, 0x00101b0f, + 0x50081000, 0x82081500, 0x000000ff, 0x480b500f, + 0x42000800, 0x00000003, 0x0201f800, 0x001061d9, + 0x5c000800, 0x42001000, 0x00000004, 0x0401f96c, + 0x04000006, 0x0201f800, 0x0010327b, 0x04000003, 0x4803c856, 0x850e1d46, 0x42000800, 0x00000005, - 0x0401f9a0, 0x4d3c0000, 0x42027800, 0x00000001, - 0x0201f800, 0x00109146, 0x5c027800, 0x1c01f000, - 0x59a8005a, 0x80000540, 0x04000015, 0x4803c857, - 0x42001000, 0x0010391c, 0x0201f800, 0x001057cd, - 0x59a8005a, 0x82000580, 0x00000084, 0x0402000b, - 0x59cc1006, 0x82081580, 0x11060000, 0x04020007, - 0x80000580, 0x0401fab6, 0x4a035010, 0x00000018, - 0x0401f804, 0x0401f002, 0x0401f94b, 0x1c01f000, - 0x4803c856, 0x4a035010, 0x00000019, 0x83cca400, - 0x00000006, 0x4200a800, 0x0010b8a6, 0x4200b000, - 0x00000021, 0x0201f800, 0x0010adef, 0x42003800, - 0x0010b8a7, 0x8d0e1d06, 0x04020018, 0x401c2800, - 0x50141000, 0x80080130, 0x80000000, 0x40001800, - 0x82081500, 0x00ffffff, 0x800000f0, 0x80080540, - 0x44002800, 0x59a8080f, 0x82040d00, 0x000000ff, - 0x400c1000, 0x80081104, 0x82082400, 0x0010b8a7, - 0x50101000, 0x820c0500, 0x00000003, 0x0c01f806, - 0x80081540, 0x44082000, 0x42000800, 0x00000021, - 0x0401f158, 0x001037f5, 0x001037fa, 0x001037ff, - 0x00103804, 0x800408f0, 0x40040000, 0x82081500, - 0x00ffffff, 0x1c01f000, 0x800408e0, 0x40040000, - 0x82081500, 0xff00ffff, 0x1c01f000, 0x800408d0, - 0x40040000, 0x82081500, 0xffff00ff, 0x1c01f000, - 0x40040000, 0x82081500, 0xffffff00, 0x1c01f000, - 0x59a8005a, 0x80000540, 0x04000016, 0x4803c857, - 0x42001000, 0x0010391c, 0x0201f800, 0x001057cd, - 0x59a8005a, 0x82000580, 0x00000084, 0x0402000c, - 0x59cc1006, 0x82081580, 0x11070000, 0x04020008, - 0x4a035056, 0x00000001, 0x0401f8d2, 0x4a035010, - 0x0000001a, 0x0401f804, 0x0401f002, 0x0401f8f2, - 0x1c01f000, 0x82000540, 0x00000001, 0x0401fa54, - 0x4a035010, 0x0000001b, 0x83cca400, 0x00000006, - 0x4200a800, 0x0010b8a6, 0x59a8205a, 0x40100000, - 0x8000b104, 0x40580800, 0x5450a800, 0x8050a000, - 0x8054a800, 0x8058b040, 0x040207fc, 0x0401f115, - 0x1c01f000, 0x1c01f000, 0x4803c856, 0x42003000, - 0x00000004, 0x42004000, 0x0010b8a7, 0x599c2817, - 0x8c142d14, 0x0402001f, 0x42001000, 0x00000003, + 0x0401f203, 0x59a8005a, 0x80000540, 0x0400003f, + 0x4803c857, 0x42001000, 0x0010392f, 0x0201f800, + 0x00105872, 0x59a8005a, 0x82000580, 0x00000014, + 0x04020035, 0x59cc1006, 0x82080500, 0x11050000, + 0x82000580, 0x11050000, 0x0402002f, 0x8c081510, + 0x04000010, 0x0401fb1d, 0x59cc1007, 0x8c08153e, + 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, + 0x42000000, 0x0010bc6b, 0x0201f800, 0x0010ae10, + 0x59a80015, 0x84000544, 0x48035015, 0x0401f013, + 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, + 0x8c000504, 0x04020008, 0x42000000, 0x0010bc6b, + 0x0201f800, 0x0010ae10, 0x59a80015, 0x84000544, + 0x48035015, 0x82000540, 0x00000001, 0x0401faff, + 0x497b5056, 0x0401f003, 0x4a035056, 0x00000001, + 0x59cc1007, 0x8c08153c, 0x04000003, 0x4a03521b, + 0x00000008, 0x4a035010, 0x00000016, 0x0401f804, + 0x0401f002, 0x0401f98b, 0x1c01f000, 0x4803c856, + 0x83cca400, 0x00000006, 0x4200a800, 0x0010b9a6, + 0x4200b000, 0x00000005, 0x0201f800, 0x0010aee2, + 0x4a035010, 0x00000017, 0x59a80056, 0x8c000500, + 0x04000006, 0x42001000, 0x0010b9a6, 0x46001000, + 0x11050100, 0x0401f003, 0x4a035010, 0x0000001b, + 0x8d0e1d06, 0x04020008, 0x59a80015, 0x8c000500, + 0x04020005, 0x0401f894, 0x04020003, 0x4803c856, + 0x850e1d46, 0x42000800, 0x00000005, 0x0401f9a0, + 0x4d3c0000, 0x42027800, 0x00000001, 0x0201f800, + 0x001091ff, 0x5c027800, 0x1c01f000, 0x59a8005a, + 0x80000540, 0x04000015, 0x4803c857, 0x42001000, + 0x0010392f, 0x0201f800, 0x00105872, 0x59a8005a, + 0x82000580, 0x00000084, 0x0402000b, 0x59cc1006, + 0x82081580, 0x11060000, 0x04020007, 0x80000580, + 0x0401fab6, 0x4a035010, 0x00000018, 0x0401f804, + 0x0401f002, 0x0401f94b, 0x1c01f000, 0x4803c856, + 0x4a035010, 0x00000019, 0x83cca400, 0x00000006, + 0x4200a800, 0x0010b9a6, 0x4200b000, 0x00000021, + 0x0201f800, 0x0010aee2, 0x42003800, 0x0010b9a7, + 0x8d0e1d06, 0x04020018, 0x401c2800, 0x50141000, + 0x80080130, 0x80000000, 0x40001800, 0x82081500, + 0x00ffffff, 0x800000f0, 0x80080540, 0x44002800, + 0x59a8080f, 0x82040d00, 0x000000ff, 0x400c1000, + 0x80081104, 0x82082400, 0x0010b9a7, 0x50101000, + 0x820c0500, 0x00000003, 0x0c01f806, 0x80081540, + 0x44082000, 0x42000800, 0x00000021, 0x0401f158, + 0x00103808, 0x0010380d, 0x00103812, 0x00103817, + 0x800408f0, 0x40040000, 0x82081500, 0x00ffffff, + 0x1c01f000, 0x800408e0, 0x40040000, 0x82081500, + 0xff00ffff, 0x1c01f000, 0x800408d0, 0x40040000, + 0x82081500, 0xffff00ff, 0x1c01f000, 0x40040000, + 0x82081500, 0xffffff00, 0x1c01f000, 0x59a8005a, + 0x80000540, 0x04000016, 0x4803c857, 0x42001000, + 0x0010392f, 0x0201f800, 0x00105872, 0x59a8005a, + 0x82000580, 0x00000084, 0x0402000c, 0x59cc1006, + 0x82081580, 0x11070000, 0x04020008, 0x4a035056, + 0x00000001, 0x0401f8d2, 0x4a035010, 0x0000001a, + 0x0401f804, 0x0401f002, 0x0401f8f2, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401fa54, 0x4a035010, + 0x0000001b, 0x83cca400, 0x00000006, 0x4200a800, + 0x0010b9a6, 0x59a8205a, 0x40100000, 0x8000b104, + 0x40580800, 0x5450a800, 0x8050a000, 0x8054a800, + 0x8058b040, 0x040207fc, 0x0401f115, 0x1c01f000, + 0x1c01f000, 0x4803c856, 0x42003000, 0x00000004, + 0x42004000, 0x0010b9a7, 0x599c2817, 0x8c142d14, + 0x0402001f, 0x42001000, 0x00000003, 0x40200000, + 0x80080400, 0x50000800, 0x82042580, 0xffffffff, + 0x04020005, 0x80081040, 0x80183040, 0x040207f8, + 0x0401f05e, 0x800811c0, 0x04020006, 0x82042580, + 0x3fffffff, 0x04000058, 0x82040d40, 0xc0000000, + 0x4200b000, 0x00000020, 0x42001800, 0x00000001, + 0x40042000, 0x80102102, 0x04021021, 0x800c18c2, + 0x8058b040, 0x040207fc, 0x0401f04b, 0x41781000, 0x40200000, 0x80080400, 0x50000800, 0x82042580, - 0xffffffff, 0x04020005, 0x80081040, 0x80183040, - 0x040207f8, 0x0401f05e, 0x800811c0, 0x04020006, - 0x82042580, 0x3fffffff, 0x04000058, 0x82040d40, - 0xc0000000, 0x4200b000, 0x00000020, 0x42001800, - 0x00000001, 0x40042000, 0x80102102, 0x04021021, - 0x800c18c2, 0x8058b040, 0x040207fc, 0x0401f04b, - 0x41781000, 0x40200000, 0x80080400, 0x50000800, - 0x82042580, 0xffffffff, 0x04020005, 0x80081000, - 0x80183040, 0x040207f8, 0x0401f040, 0x800811c0, - 0x04020003, 0x82040d40, 0xc0000000, 0x4200b000, - 0x00000001, 0x42001800, 0x80000000, 0x40042000, - 0x801020c2, 0x04021007, 0x800c1902, 0x8058b000, - 0x82580480, 0x00000021, 0x040017fa, 0x0401f02f, - 0x40200000, 0x80082400, 0x50100000, 0x800c0540, - 0x44002000, 0x59a80015, 0x84000540, 0x48035015, - 0x40580000, 0x42002800, 0x00000020, 0x80142c80, - 0x40080000, 0x42003800, 0x00000003, 0x801c0480, - 0x800000ca, 0x80142d40, 0x82144c00, 0x00101b0a, - 0x50242800, 0x82142d00, 0x000000ff, 0x4817500f, - 0x4c040000, 0x40140800, 0x0201f800, 0x001013c8, - 0x5c000800, 0x40001800, 0x500c0000, 0x80100540, - 0x44001800, 0x59a80015, 0x84000540, 0x48035015, - 0x4200a800, 0x0010b8a7, 0x4020a000, 0x4200b000, - 0x00000004, 0x0201f800, 0x0010adef, 0x82000540, - 0x00000001, 0x0401f002, 0x80000580, 0x1c01f000, - 0x4807c857, 0x480bc857, 0x4008b000, 0x83cca400, - 0x00000007, 0x4200a800, 0x0010b8a7, 0x40541000, - 0x0201f800, 0x0010adef, 0x40041800, 0x41782000, - 0x42000000, 0x00000003, 0x820c1c80, 0x00000020, - 0x04001004, 0x80102000, 0x80000040, 0x0401f7fb, - 0x40041800, 0x801021c0, 0x04000005, 0x820c1c80, - 0x00000020, 0x80102040, 0x040207fd, 0x42002000, - 0x00000001, 0x800c19c0, 0x04000004, 0x801020c2, - 0x800c1840, 0x040207fe, 0x80083c00, 0x83cc2c00, - 0x00000007, 0x80142c00, 0x50140000, 0x80102d00, - 0x04020012, 0x80100540, 0x44003800, 0x82042400, - 0x00101b0a, 0x50102800, 0x82142d00, 0x000000ff, - 0x4817500f, 0x4c040000, 0x40140800, 0x0201f800, - 0x001013c8, 0x5c000800, 0x59a80015, 0x84000540, - 0x48035015, 0x80000580, 0x1c01f000, 0x4807c856, - 0x42001000, 0x00008017, 0x59a81832, 0x0201f800, - 0x0010ad27, 0x0201f800, 0x001031eb, 0x1c01f000, - 0x4807c856, 0x4200b000, 0x00000020, 0x83cca400, - 0x00000007, 0x4200a800, 0x0010c1c7, 0x0201f000, - 0x0010ae19, 0x4807c856, 0x0201f800, 0x001063db, - 0x42000800, 0x000000f7, 0x0401f8f1, 0x497b2804, - 0x497b2805, 0x497b2826, 0x497b2827, 0x4202d800, - 0x00000001, 0x42006000, 0xbe7fffff, 0x42006800, - 0x00018000, 0x0401f965, 0x42006000, 0xfffeffff, - 0x41786800, 0x0401f961, 0x497b5032, 0x42000800, - 0x0000002d, 0x42001000, 0x0010399e, 0x0201f000, - 0x001057a4, 0x4807c856, 0x0401ffe3, 0x497b5010, - 0x497b505a, 0x1c01f000, 0x4807c856, 0x42006000, - 0xffffffff, 0x42006800, 0x00000028, 0x0401f14f, - 0x4807c856, 0x0401ffc6, 0x0201f800, 0x0010610d, - 0x4df00000, 0x0201f800, 0x00106305, 0x5c03e000, - 0x02000800, 0x001060fa, 0x59c400a4, 0x82000500, - 0x0000000f, 0x82000580, 0x00000002, 0x0402000a, - 0x42006000, 0xffffffff, 0x42006800, 0x00200000, - 0x0401f93a, 0x42006000, 0xffdfffff, 0x41786800, - 0x0401f936, 0x497b5010, 0x42000800, 0x000000f7, - 0x0401f8b3, 0x59c400a3, 0x82000500, 0xbf20bfff, - 0x82000540, 0x0001c000, 0x480388a3, 0x84000520, - 0x480388a3, 0x497b5032, 0x42000800, 0x0000002d, - 0x42001000, 0x0010399e, 0x0201f000, 0x001057a4, - 0x497b505a, 0x59b400f5, 0x8c000500, 0x04020004, - 0x82000540, 0x00000001, 0x480368f5, 0x800400c4, - 0x82000400, 0x00002000, 0x4803910a, 0x59b400f6, - 0x82000500, 0x00000018, 0x040207fd, 0x4a0368f0, - 0x0010b89f, 0x42000000, 0x0010b8a6, 0x4c040000, - 0x50000800, 0x82040d80, 0x11010000, 0x04000003, - 0x50000800, 0x4807c857, 0x5c000800, 0x480368f1, - 0x82040400, 0x0000dc00, 0x480368f3, 0x59c400a4, - 0x82000500, 0x0000000f, 0x82000580, 0x00000008, - 0x04020017, 0x4c5c0000, 0x4c600000, 0x59c4b805, - 0x8c5cbd3a, 0x04020005, 0x42000000, 0x0010bb68, - 0x0201f800, 0x0010ad1d, 0x4a038805, 0x20000000, - 0x0201f800, 0x001017f1, 0x4000c000, 0x0201f800, - 0x0010175e, 0x4202d800, 0x00000001, 0x497b5010, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x59c8010b, - 0x8c000502, 0x040007e2, 0x59c408a4, 0x82040d00, - 0x0000000f, 0x82040d80, 0x0000000b, 0x04020005, - 0x59a80810, 0x82040d40, 0x00002000, 0x0401f004, - 0x59a80855, 0x82040d40, 0x00001000, 0x48075032, - 0x59a8085e, 0x800409c0, 0x04020007, 0x42000800, - 0x000007d0, 0x42001000, 0x0010391c, 0x0201f800, - 0x00105904, 0x1c01f000, 0x4807c856, 0x0401ff44, - 0x0201f800, 0x0010610d, 0x4df00000, 0x0201f800, - 0x00106305, 0x5c03e000, 0x02000800, 0x001060fa, - 0x59c400a4, 0x82000500, 0x0000000f, 0x82000580, - 0x00000002, 0x0402000a, 0x42006000, 0xffffffff, - 0x42006800, 0x00200000, 0x0401f8b8, 0x42006000, - 0xffdfffff, 0x41786800, 0x0401f8b4, 0x0201f800, - 0x00104723, 0x04000014, 0x0201f800, 0x00104741, - 0x04020011, 0x4a035013, 0x0000aaaa, 0x4c040000, - 0x0201f800, 0x00101401, 0x59a8001f, 0x82000500, - 0xffff0000, 0x80040540, 0x4803501f, 0x5c000800, - 0x4a035014, 0x00000000, 0x0201f800, 0x00104670, - 0x0401f008, 0x4a035058, 0x00000005, 0x42000000, - 0x00000080, 0x0201f800, 0x00101364, 0x0401ff22, - 0x1c01f000, 0x0401f809, 0x42006000, 0xbf7f7fff, - 0x41786800, 0x0401f091, 0x42006000, 0xbf7f7fff, - 0x41786800, 0x0401f08d, 0x0201f800, 0x00104741, - 0x04020009, 0x59c40006, 0x82000540, 0x000000f0, - 0x48038806, 0x42006000, 0xbfffffff, 0x41786800, - 0x0401f882, 0x1c01f000, 0x40680800, 0x800408d0, - 0x59a80015, 0x8c000506, 0x04000006, 0x59a8000f, - 0x82000500, 0x000000ff, 0x80040540, 0x0401f003, - 0x82040540, 0x000000f7, 0x480388a7, 0x1c01f000, - 0x4807c856, 0x42000000, 0x0010bc00, 0x0201f800, - 0x0010ad1d, 0x42003000, 0x00000005, 0x4d3c0000, - 0x4c180000, 0x42003000, 0x0000000d, 0x42027800, - 0x00000002, 0x0401f038, 0x4807c856, 0x42000000, - 0x0010bc25, 0x0201f800, 0x0010ad1d, 0x42003000, - 0x00000000, 0x4d3c0000, 0x4c180000, 0x42003000, - 0x0000000f, 0x42027800, 0x00000002, 0x0401f02a, - 0x4807c856, 0x42000000, 0x0010bc23, 0x0201f800, - 0x0010ad1d, 0x42003000, 0x00000003, 0x4d3c0000, - 0x4c180000, 0x42003000, 0x0000000e, 0x42027800, - 0x00000202, 0x0401f01c, 0x4807c856, 0x42000000, - 0x0010bc22, 0x0201f800, 0x0010ad1d, 0x42003000, - 0x00000004, 0x4d3c0000, 0x4c180000, 0x42003000, - 0x00000010, 0x42027800, 0x00000202, 0x0401f00e, - 0x4807c856, 0x42000000, 0x0010bb6a, 0x0201f800, - 0x0010ad1d, 0x42003000, 0x00000001, 0x4d3c0000, - 0x4c180000, 0x42003000, 0x0000000c, 0x42027800, - 0x00000002, 0x42001800, 0x0000ffff, 0x42002000, - 0x00000007, 0x0201f800, 0x00103260, 0x5c003000, - 0x4d400000, 0x0201f800, 0x0010a4c1, 0x42028000, - 0x0000002a, 0x0201f800, 0x0010ded4, 0x5c028000, - 0x5c027800, 0x1c01f000, 0x4807c856, 0x04011000, - 0x4a03c840, 0x0010b89f, 0x4a03c842, 0x00000040, - 0x40000000, 0x040117ff, 0x42007800, 0x0010b89f, - 0x46007800, 0x00000011, 0x803c7800, 0x4a007800, - 0x220000ef, 0x4a007801, 0x000000ef, 0x4a007802, - 0x01380000, 0x4a007803, 0x00000000, 0x4a007804, - 0xffffffff, 0x4a007805, 0x00000000, 0x1c01f000, - 0x40686000, 0x406c6800, 0x59c400a3, 0x80300500, - 0x80340540, 0x480388a3, 0x1c01f000, 0x40686000, - 0x4833c857, 0x59c400a3, 0x80300540, 0x480388a3, - 0x80300580, 0x480388a3, 0x1c01f000, 0x4803c856, - 0x04000004, 0x4a03505f, 0x00000001, 0x0401f002, - 0x497b505f, 0x1c01f000, 0x59c80002, 0x80000540, - 0x0400000a, 0x80000040, 0x04000008, 0x4a039005, - 0x00000140, 0x42000000, 0x00000006, 0x80000040, - 0x040207ff, 0x0401f7f5, 0x1c01f000, 0x4c5c0000, - 0x4c600000, 0x59c4b805, 0x485fc856, 0x8c5cbd3a, - 0x04020005, 0x42000000, 0x0010bb68, 0x0201f800, - 0x0010ad1d, 0x4a038805, 0x20000000, 0x0201f800, - 0x001017f1, 0x4000c000, 0x0201f800, 0x0010175e, - 0x4a038805, 0x04000000, 0x5c00c000, 0x5c00b800, - 0x1c01f000, 0x497a6a00, 0x4a026c00, 0x00000707, - 0x497a6801, 0x497a6808, 0x497a6809, 0x497a6806, - 0x497a6807, 0x497a6c0b, 0x497a680c, 0x8d0e1d20, - 0x04020006, 0x5934080f, 0x59340010, 0x80040540, - 0x02020800, 0x0010032d, 0x4a026a04, 0x00000100, - 0x497a6a03, 0x59340402, 0x82000500, 0x000000ff, - 0x48026c02, 0x497a6c04, 0x497a6a05, 0x497a6c05, - 0x497a6811, 0x4d2c0000, 0x5934000d, 0x49466c03, - 0x80025d40, 0x04000004, 0x0201f800, 0x00100589, - 0x497a680d, 0x5c025800, 0x59a8006d, 0x8c000502, - 0x42000000, 0x00000010, 0x04020002, 0x599c0401, - 0x48026a0b, 0x599c0208, 0x48026c12, 0x4a02680a, - 0x00006000, 0x0201f000, 0x00104416, 0x42000000, - 0x00000005, 0x80000d80, 0x0401f02c, 0x0201f800, - 0x00104195, 0x04020017, 0x59a8021b, 0x8c00050a, - 0x04020010, 0x59340212, 0x82000500, 0x0000ff00, - 0x4803c857, 0x0400000b, 0x59340a00, 0x8c040d1e, - 0x02000000, 0x000202a3, 0x42000000, 0x00000029, - 0x42000800, 0x00001000, 0x492fc857, 0x0401f017, - 0x492fc857, 0x42000000, 0x00000028, 0x0401f011, - 0x8d0e1d02, 0x04020003, 0x8d0e1d00, 0x04000004, - 0x42000000, 0x00000004, 0x0401f00a, 0x42000000, - 0x00000029, 0x59340a00, 0x8c040d1e, 0x04000005, - 0x492fc857, 0x42000800, 0x00001000, 0x0401f003, - 0x492fc857, 0x80000d80, 0x4803c857, 0x80028540, - 0x1c01f000, 0x490fc857, 0x8d0e1d00, 0x040207ed, - 0x0201f800, 0x00104165, 0x040207e6, 0x59340200, - 0x8c00050e, 0x040007e3, 0x0201f000, 0x000202a3, - 0x4d480000, 0x4d4c0000, 0x592e9009, 0x592e980a, - 0x0201f800, 0x00104039, 0x5c029800, 0x5c029000, - 0x040007bb, 0x0201f000, 0x000202a7, 0x592c0207, - 0x492fc857, 0x82000d80, 0x000007ff, 0x04020006, - 0x4a025c0b, 0x00000030, 0x42026800, 0x0010b876, - 0x0401f021, 0x82000c80, 0x000007f0, 0x04021045, - 0x81ac0400, 0x50000000, 0x80026d40, 0x04000038, - 0x0201f800, 0x001040bb, 0x04020038, 0x592c040b, - 0x8c00050a, 0x04020014, 0x592e600a, 0x83300480, - 0x0010f584, 0x0400103a, 0x41580000, 0x81300480, - 0x04021037, 0x59300c07, 0x82040580, 0x00000009, - 0x04020036, 0x4a025a07, 0x00000000, 0x497a5800, - 0x59300009, 0x80000540, 0x04020018, 0x492e6009, - 0x0401f010, 0x0201f800, 0x000209ee, 0x04000019, - 0x592c0207, 0x4936600a, 0x492e6009, 0x4a026407, - 0x00000009, 0x497a6016, 0x4932580a, 0x82000d80, - 0x000007ff, 0x04020003, 0x4a026016, 0x00008000, - 0x42027000, 0x00000043, 0x0201f800, 0x00020a34, - 0x80000580, 0x0401f01f, 0x40000800, 0x58040000, - 0x80000540, 0x040207fd, 0x492c0800, 0x0401f019, - 0x42000000, 0x0000002c, 0x0401f015, 0x42000000, - 0x00000028, 0x0401f012, 0x830c0500, 0x00000003, - 0x04000004, 0x42000000, 0x00000004, 0x0401f00c, - 0x42000000, 0x00000029, 0x0401f009, 0x42000000, - 0x00000008, 0x0401f006, 0x82040580, 0x00000007, - 0x040207fb, 0x42000000, 0x00000005, 0x80000540, - 0x1c01f000, 0x492fc857, 0x592e8c07, 0x83440d80, - 0x000007fc, 0x04000004, 0x83440480, 0x000007f0, - 0x04021014, 0x0201f800, 0x00020319, 0x04020011, - 0x0201f800, 0x00104178, 0x04020011, 0x0201f800, - 0x001070f5, 0x0400001b, 0x4936600a, 0x492e6009, - 0x4a026407, 0x0000000a, 0x42027000, 0x00000040, - 0x0201f800, 0x00020a34, 0x80000580, 0x0401f010, - 0x42000000, 0x00000028, 0x0401f00c, 0x0201f800, - 0x00104195, 0x040007fb, 0x830c0d00, 0x00000003, - 0x04000004, 0x42000000, 0x00000004, 0x0401f003, - 0x42000000, 0x00000029, 0x80000540, 0x1c01f000, - 0x42000000, 0x0000002c, 0x0401f7fc, 0x492fc857, - 0x592e8c07, 0x4947c857, 0x83440c80, 0x00000800, - 0x42000000, 0x0000000a, 0x0402119b, 0x592c4208, - 0x4823c857, 0x82200500, 0x0000000f, 0x0c01f001, - 0x00103bc8, 0x00103c50, 0x00103ca0, 0x00103cab, - 0x00103cb6, 0x00103bc4, 0x00103bc4, 0x00103bc4, - 0x00103cc3, 0x00103d23, 0x00103d48, 0x00103bc4, - 0x00103bc4, 0x00103bc4, 0x00103bc4, 0x00103bc4, - 0x4803c857, 0x42000000, 0x0000000c, 0x0401f182, - 0x592c1009, 0x82081500, 0x00ffffff, 0x59a8000f, - 0x80084d80, 0x42000000, 0x00000010, 0x0400017a, - 0x0201f800, 0x001040f8, 0x04000036, 0x4803c857, - 0x82004d80, 0x0000001d, 0x0402001a, 0x0201f800, - 0x00104f41, 0x59340405, 0x4c000000, 0x0201f800, - 0x00104165, 0x5c000000, 0x04000004, 0x8c20450a, - 0x04000028, 0x80000580, 0x44002800, 0x59340008, - 0x48002802, 0x59340009, 0x48002801, 0x59340006, - 0x48002804, 0x59340007, 0x48002803, 0x4200b000, - 0x00000005, 0x0201f800, 0x00108e25, 0x0401f18b, - 0x4803c857, 0x82004d80, 0x0000001a, 0x04020003, - 0x40101000, 0x0401f15b, 0x4803c857, 0x82004d80, - 0x0000001b, 0x04020003, 0x40181000, 0x0401f155, - 0x4803c857, 0x82004d80, 0x0000001c, 0x04000156, - 0x82004d80, 0x00000019, 0x42000000, 0x0000000a, - 0x04000145, 0x42000000, 0x0000000a, 0x0402015c, + 0xffffffff, 0x04020005, 0x80081000, 0x80183040, + 0x040207f8, 0x0401f040, 0x800811c0, 0x04020003, + 0x82040d40, 0xc0000000, 0x4200b000, 0x00000001, + 0x42001800, 0x80000000, 0x40042000, 0x801020c2, + 0x04021007, 0x800c1902, 0x8058b000, 0x82580480, + 0x00000021, 0x040017fa, 0x0401f02f, 0x40200000, + 0x80082400, 0x50100000, 0x800c0540, 0x44002000, + 0x59a80015, 0x84000540, 0x48035015, 0x40580000, + 0x42002800, 0x00000020, 0x80142c80, 0x40080000, + 0x42003800, 0x00000003, 0x801c0480, 0x800000ca, + 0x80142d40, 0x82144c00, 0x00101b0f, 0x50242800, + 0x82142d00, 0x000000ff, 0x4817500f, 0x4c040000, + 0x40140800, 0x0201f800, 0x001013c9, 0x5c000800, + 0x40001800, 0x500c0000, 0x80100540, 0x44001800, + 0x59a80015, 0x84000540, 0x48035015, 0x4200a800, + 0x0010b9a7, 0x4020a000, 0x4200b000, 0x00000004, + 0x0201f800, 0x0010aee2, 0x82000540, 0x00000001, + 0x0401f002, 0x80000580, 0x1c01f000, 0x4807c857, + 0x480bc857, 0x4008b000, 0x83cca400, 0x00000007, + 0x4200a800, 0x0010b9a7, 0x40541000, 0x0201f800, + 0x0010aee2, 0x40041800, 0x41782000, 0x42000000, + 0x00000003, 0x820c1c80, 0x00000020, 0x04001004, + 0x80102000, 0x80000040, 0x0401f7fb, 0x40041800, + 0x801021c0, 0x04000005, 0x820c1c80, 0x00000020, + 0x80102040, 0x040207fd, 0x42002000, 0x00000001, + 0x800c19c0, 0x04000004, 0x801020c2, 0x800c1840, + 0x040207fe, 0x80083c00, 0x83cc2c00, 0x00000007, + 0x80142c00, 0x50140000, 0x80102d00, 0x04020012, + 0x80100540, 0x44003800, 0x82042400, 0x00101b0f, + 0x50102800, 0x82142d00, 0x000000ff, 0x4817500f, + 0x4c040000, 0x40140800, 0x0201f800, 0x001013c9, + 0x5c000800, 0x59a80015, 0x84000540, 0x48035015, + 0x80000580, 0x1c01f000, 0x4807c856, 0x42001000, + 0x00008017, 0x59a81832, 0x0201f800, 0x0010ae1a, + 0x0201f800, 0x001031f5, 0x1c01f000, 0x4807c856, + 0x4200b000, 0x00000020, 0x83cca400, 0x00000007, + 0x4200a800, 0x0010c2c7, 0x0201f000, 0x0010af0c, + 0x4807c856, 0x0201f800, 0x00106480, 0x42000800, + 0x000000f7, 0x0401f8f1, 0x497b2804, 0x497b2805, + 0x497b2826, 0x497b2827, 0x4202d800, 0x00000001, + 0x42006000, 0xbe7fffff, 0x42006800, 0x00018000, + 0x0401f965, 0x42006000, 0xfffeffff, 0x41786800, + 0x0401f961, 0x497b5032, 0x42000800, 0x0000002d, + 0x42001000, 0x001039b1, 0x0201f000, 0x00105849, + 0x4807c856, 0x0401ffe3, 0x497b5010, 0x497b505a, + 0x1c01f000, 0x4807c856, 0x42006000, 0xffffffff, + 0x42006800, 0x00000028, 0x0401f14f, 0x4807c856, + 0x0401ffc6, 0x0201f800, 0x001061b2, 0x4df00000, + 0x0201f800, 0x001063aa, 0x5c03e000, 0x02000800, + 0x0010619f, 0x59c400a4, 0x82000500, 0x0000000f, + 0x82000580, 0x00000002, 0x0402000a, 0x42006000, + 0xffffffff, 0x42006800, 0x00200000, 0x0401f93a, + 0x42006000, 0xffdfffff, 0x41786800, 0x0401f936, + 0x497b5010, 0x42000800, 0x000000f7, 0x0401f8b3, + 0x59c400a3, 0x82000500, 0xbf20bfff, 0x82000540, + 0x0001c000, 0x480388a3, 0x84000520, 0x480388a3, + 0x497b5032, 0x42000800, 0x0000002d, 0x42001000, + 0x001039b1, 0x0201f000, 0x00105849, 0x497b505a, + 0x59b400f5, 0x8c000500, 0x04020004, 0x82000540, + 0x00000001, 0x480368f5, 0x800400c4, 0x82000400, + 0x00002000, 0x4803910a, 0x59b400f6, 0x82000500, + 0x00000018, 0x040207fd, 0x4a0368f0, 0x0010b99f, + 0x42000000, 0x0010b9a6, 0x4c040000, 0x50000800, + 0x82040d80, 0x11010000, 0x04000003, 0x50000800, + 0x4807c857, 0x5c000800, 0x480368f1, 0x82040400, + 0x0000dc00, 0x480368f3, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x00000008, 0x04020017, + 0x4c5c0000, 0x4c600000, 0x59c4b805, 0x8c5cbd3a, + 0x04020005, 0x42000000, 0x0010bc68, 0x0201f800, + 0x0010ae10, 0x4a038805, 0x20000000, 0x0201f800, + 0x001017f2, 0x4000c000, 0x0201f800, 0x0010175f, + 0x4202d800, 0x00000001, 0x497b5010, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x59c8010b, 0x8c000502, + 0x040007e2, 0x59c408a4, 0x82040d00, 0x0000000f, + 0x82040d80, 0x0000000b, 0x04020005, 0x59a80810, + 0x82040d40, 0x00002000, 0x0401f004, 0x59a80855, + 0x82040d40, 0x00001000, 0x48075032, 0x59a8085e, + 0x800409c0, 0x04020007, 0x42000800, 0x000007d0, + 0x42001000, 0x0010392f, 0x0201f800, 0x001059a9, + 0x1c01f000, 0x4807c856, 0x0401ff44, 0x0201f800, + 0x001061b2, 0x4df00000, 0x0201f800, 0x001063aa, + 0x5c03e000, 0x02000800, 0x0010619f, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x00000002, + 0x0402000a, 0x42006000, 0xffffffff, 0x42006800, + 0x00200000, 0x0401f8b8, 0x42006000, 0xffdfffff, + 0x41786800, 0x0401f8b4, 0x0201f800, 0x00104762, + 0x04000014, 0x0201f800, 0x00104780, 0x04020011, + 0x4a035013, 0x0000aaaa, 0x4c040000, 0x0201f800, + 0x00101402, 0x59a8001f, 0x82000500, 0xffff0000, + 0x80040540, 0x4803501f, 0x5c000800, 0x4a035014, + 0x00000000, 0x0201f800, 0x001046af, 0x0401f008, + 0x4a035058, 0x00000005, 0x42000000, 0x00000080, + 0x0201f800, 0x00101365, 0x0401ff22, 0x1c01f000, + 0x0401f809, 0x42006000, 0xbf7f7fff, 0x41786800, + 0x0401f091, 0x42006000, 0xbf7f7fff, 0x41786800, + 0x0401f08d, 0x0201f800, 0x00104780, 0x04020009, + 0x59c40006, 0x82000540, 0x000000f0, 0x48038806, + 0x42006000, 0xbfffffff, 0x41786800, 0x0401f882, + 0x1c01f000, 0x40680800, 0x800408d0, 0x59a80015, + 0x8c000506, 0x04000006, 0x59a8000f, 0x82000500, + 0x000000ff, 0x80040540, 0x0401f003, 0x82040540, + 0x000000f7, 0x480388a7, 0x1c01f000, 0x4807c856, + 0x42000000, 0x0010bd00, 0x0201f800, 0x0010ae10, + 0x42003000, 0x00000005, 0x4d3c0000, 0x4c180000, + 0x42003000, 0x0000000d, 0x42027800, 0x00000002, + 0x0401f038, 0x4807c856, 0x42000000, 0x0010bd25, + 0x0201f800, 0x0010ae10, 0x42003000, 0x00000000, + 0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000f, + 0x42027800, 0x00000002, 0x0401f02a, 0x4807c856, + 0x42000000, 0x0010bd23, 0x0201f800, 0x0010ae10, + 0x42003000, 0x00000003, 0x4d3c0000, 0x4c180000, + 0x42003000, 0x0000000e, 0x42027800, 0x00000202, + 0x0401f01c, 0x4807c856, 0x42000000, 0x0010bd22, + 0x0201f800, 0x0010ae10, 0x42003000, 0x00000004, + 0x4d3c0000, 0x4c180000, 0x42003000, 0x00000010, + 0x42027800, 0x00000202, 0x0401f00e, 0x4807c856, + 0x42000000, 0x0010bc6a, 0x0201f800, 0x0010ae10, + 0x42003000, 0x00000001, 0x4d3c0000, 0x4c180000, + 0x42003000, 0x0000000c, 0x42027800, 0x00000002, + 0x42001800, 0x0000ffff, 0x42002000, 0x00000007, + 0x0201f800, 0x0010326a, 0x5c003000, 0x4d400000, + 0x0201f800, 0x0010a5b4, 0x42028000, 0x0000002a, + 0x0201f800, 0x0010dfe1, 0x5c028000, 0x5c027800, + 0x1c01f000, 0x4807c856, 0x04011000, 0x4a03c840, + 0x0010b99f, 0x4a03c842, 0x00000040, 0x40000000, + 0x040117ff, 0x42007800, 0x0010b99f, 0x46007800, + 0x00000011, 0x803c7800, 0x4a007800, 0x220000ef, + 0x4a007801, 0x000000ef, 0x4a007802, 0x01380000, + 0x4a007803, 0x00000000, 0x4a007804, 0xffffffff, + 0x4a007805, 0x00000000, 0x1c01f000, 0x40686000, + 0x406c6800, 0x59c400a3, 0x80300500, 0x80340540, + 0x480388a3, 0x1c01f000, 0x40686000, 0x4833c857, + 0x59c400a3, 0x80300540, 0x480388a3, 0x80300580, + 0x480388a3, 0x1c01f000, 0x4803c856, 0x04000004, + 0x4a03505f, 0x00000001, 0x0401f002, 0x497b505f, + 0x1c01f000, 0x59c80002, 0x80000540, 0x0400000a, + 0x80000040, 0x04000008, 0x4a039005, 0x00000140, + 0x42000000, 0x00000006, 0x80000040, 0x040207ff, + 0x0401f7f5, 0x1c01f000, 0x4c5c0000, 0x4c600000, + 0x59c4b805, 0x485fc856, 0x8c5cbd3a, 0x04020005, + 0x42000000, 0x0010bc68, 0x0201f800, 0x0010ae10, + 0x4a038805, 0x20000000, 0x0201f800, 0x001017f2, + 0x4000c000, 0x0201f800, 0x0010175f, 0x4a038805, + 0x04000000, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x497a6a00, 0x4a026c00, 0x00000707, 0x497a6801, + 0x497a6808, 0x497a6809, 0x497a6806, 0x497a6807, + 0x497a6c0b, 0x497a680c, 0x8d0e1d20, 0x04020006, + 0x5934080f, 0x59340010, 0x80040540, 0x02020800, + 0x0010032d, 0x4a026a04, 0x00000100, 0x497a6a03, + 0x59340402, 0x82000500, 0x000000ff, 0x48026c02, + 0x497a6c04, 0x497a6a05, 0x497a6c05, 0x497a6811, + 0x4d2c0000, 0x5934000d, 0x49466c03, 0x80025d40, + 0x04000004, 0x0201f800, 0x00100589, 0x497a680d, + 0x5c025800, 0x59a8006d, 0x8c000502, 0x42000000, + 0x00000010, 0x04020002, 0x599c0401, 0x48026a0b, + 0x599c0208, 0x48026c12, 0x4a02680a, 0x00006000, + 0x0201f000, 0x00104435, 0x42000000, 0x00000005, + 0x80000d80, 0x0401f02c, 0x0201f800, 0x001041b1, + 0x04020017, 0x59a8021b, 0x8c00050a, 0x04020010, + 0x59340212, 0x82000500, 0x0000ff00, 0x4803c857, + 0x0400000b, 0x59340a00, 0x8c040d1e, 0x02000000, + 0x000202a3, 0x42000000, 0x00000029, 0x42000800, + 0x00001000, 0x492fc857, 0x0401f017, 0x492fc857, + 0x42000000, 0x00000028, 0x0401f011, 0x8d0e1d02, + 0x04020003, 0x8d0e1d00, 0x04000004, 0x42000000, + 0x00000004, 0x0401f00a, 0x42000000, 0x00000029, + 0x59340a00, 0x8c040d1e, 0x04000005, 0x492fc857, + 0x42000800, 0x00001000, 0x0401f003, 0x492fc857, + 0x80000d80, 0x4803c857, 0x80028540, 0x1c01f000, + 0x490fc857, 0x8d0e1d00, 0x040207ed, 0x0201f800, + 0x00104181, 0x040207e6, 0x59340200, 0x8c00050e, + 0x040007e3, 0x0201f000, 0x000202a3, 0x4d480000, + 0x4d4c0000, 0x592e9009, 0x592e980a, 0x0201f800, + 0x00104053, 0x5c029800, 0x5c029000, 0x040007bb, + 0x0201f000, 0x000202a7, 0x592c0207, 0x492fc857, + 0x82000d80, 0x000007ff, 0x04020006, 0x4a025c0b, + 0x00000030, 0x42026800, 0x0010b976, 0x0401f021, + 0x82000c80, 0x000007f0, 0x04021045, 0x81ac0400, + 0x50000000, 0x80026d40, 0x04000038, 0x0201f800, + 0x001040d5, 0x04020038, 0x592c040b, 0x8c00050a, + 0x04020014, 0x592e600a, 0x83300480, 0x0010f694, + 0x0400103a, 0x41580000, 0x81300480, 0x04021037, + 0x59300c07, 0x82040580, 0x00000009, 0x04020036, + 0x4a025a07, 0x00000000, 0x497a5800, 0x59300009, + 0x80000540, 0x04020018, 0x492e6009, 0x0401f010, + 0x0201f800, 0x000209ee, 0x04000019, 0x592c0207, + 0x4936600a, 0x492e6009, 0x4a026407, 0x00000009, + 0x497a6016, 0x4932580a, 0x82000d80, 0x000007ff, + 0x04020003, 0x4a026016, 0x00008000, 0x42027000, + 0x00000043, 0x0201f800, 0x00020a34, 0x80000580, + 0x0401f01f, 0x40000800, 0x58040000, 0x80000540, + 0x040207fd, 0x492c0800, 0x0401f019, 0x42000000, + 0x0000002c, 0x0401f015, 0x42000000, 0x00000028, + 0x0401f012, 0x830c0500, 0x00000003, 0x04000004, + 0x42000000, 0x00000004, 0x0401f00c, 0x42000000, + 0x00000029, 0x0401f009, 0x42000000, 0x00000008, + 0x0401f006, 0x82040580, 0x00000007, 0x040207fb, + 0x42000000, 0x00000005, 0x80000540, 0x1c01f000, + 0x492fc857, 0x592e8c07, 0x83440d80, 0x000007fc, + 0x04000004, 0x83440480, 0x000007f0, 0x04021014, + 0x0201f800, 0x00020319, 0x04020011, 0x0201f800, + 0x00104194, 0x04020011, 0x0201f800, 0x00107188, + 0x0400001b, 0x4936600a, 0x492e6009, 0x4a026407, + 0x0000000a, 0x42027000, 0x00000040, 0x0201f800, + 0x00020a34, 0x80000580, 0x0401f010, 0x42000000, + 0x00000028, 0x0401f00c, 0x0201f800, 0x001041b1, + 0x040007fb, 0x830c0d00, 0x00000003, 0x04000004, + 0x42000000, 0x00000004, 0x0401f003, 0x42000000, + 0x00000029, 0x80000540, 0x1c01f000, 0x42000000, + 0x0000002c, 0x0401f7fc, 0x492fc857, 0x592e8c07, + 0x4947c857, 0x83440c80, 0x00000800, 0x42000000, + 0x0000000a, 0x0402119b, 0x592c4208, 0x4823c857, + 0x82200500, 0x0000000f, 0x0c01f001, 0x00103bdb, + 0x00103c63, 0x00103cb3, 0x00103cbe, 0x00103cc9, + 0x00103bd7, 0x00103bd7, 0x00103bd7, 0x00103cd6, + 0x00103d36, 0x00103d5b, 0x00103bd7, 0x00103bd7, + 0x00103bd7, 0x00103bd7, 0x00103bd7, 0x4803c857, + 0x42000000, 0x0000000c, 0x0401f182, 0x592c1009, + 0x82081500, 0x00ffffff, 0x59a8000f, 0x80084d80, + 0x42000000, 0x00000010, 0x0400017a, 0x0201f800, + 0x00104112, 0x04000036, 0x4803c857, 0x82004d80, + 0x0000001d, 0x0402001a, 0x0201f800, 0x00104f93, + 0x59340405, 0x4c000000, 0x0201f800, 0x00104181, + 0x5c000000, 0x04000004, 0x8c20450a, 0x04000028, + 0x80000580, 0x44002800, 0x59340008, 0x48002802, + 0x59340009, 0x48002801, 0x59340006, 0x48002804, + 0x59340007, 0x48002803, 0x4200b000, 0x00000005, + 0x0201f800, 0x00108ede, 0x0401f18b, 0x4803c857, + 0x82004d80, 0x0000001a, 0x04020003, 0x40101000, + 0x0401f15b, 0x4803c857, 0x82004d80, 0x0000001b, + 0x04020003, 0x40181000, 0x0401f155, 0x4803c857, + 0x82004d80, 0x0000001c, 0x04000156, 0x82004d80, + 0x00000019, 0x42000000, 0x0000000a, 0x04000145, + 0x42000000, 0x0000000a, 0x0402015c, 0x59a8006d, + 0x8c000502, 0x0400001b, 0x0201f800, 0x00104181, + 0x04000018, 0x59340212, 0x82000500, 0x0000ff00, + 0x42001000, 0x00000010, 0x0402000c, 0x42001000, + 0x00000008, 0x59a8021b, 0x8c000506, 0x04020009, + 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, + 0x00ff0000, 0x04000007, 0x0201f800, 0x00104448, + 0x42000000, 0x0000001c, 0x40181000, 0x0402012c, + 0x0201f800, 0x00107188, 0x04000136, 0x4936600a, + 0x492e6009, 0x4a026407, 0x00000001, 0x8c20450a, + 0x04000004, 0x592c0405, 0x8400055c, 0x48025c05, + 0x4c200000, 0x4d3c0000, 0x42027800, 0x00001800, + 0x0201f800, 0x0010e06f, 0x5c027800, 0x5c004000, + 0x8c204512, 0x0400000b, 0x599c0018, 0x8c000518, + 0x04000008, 0x592c000a, 0x82000500, 0x00000380, + 0x5934080a, 0x80040d40, 0x84040d54, 0x4806680a, + 0x417a7800, 0x0401f939, 0x42000800, 0x00000003, + 0x0401f941, 0x42027000, 0x00000002, 0x0201f800, + 0x00020a34, 0x80000580, 0x0401f12f, 0x0201f800, + 0x00020319, 0x04020111, 0x0201f800, 0x00104187, + 0x0400000c, 0x0201f800, 0x00104181, 0x04020111, + 0x4c600000, 0x4178c000, 0x42027800, 0x00001800, + 0x417a6000, 0x0201f800, 0x00101a94, 0x5c00c000, 0x59a8006d, 0x8c000502, 0x0400001b, 0x0201f800, - 0x00104165, 0x04000018, 0x59340212, 0x82000500, + 0x00104181, 0x04000018, 0x59340212, 0x82000500, 0x0000ff00, 0x42001000, 0x00000010, 0x0402000c, 0x42001000, 0x00000008, 0x59a8021b, 0x8c000506, 0x04020009, 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000007, 0x0201f800, - 0x00104429, 0x42000000, 0x0000001c, 0x40181000, - 0x0402012c, 0x0201f800, 0x001070f5, 0x04000136, + 0x00104448, 0x42000000, 0x0000001c, 0x40181000, + 0x040200d3, 0x0201f800, 0x00107188, 0x040000dd, + 0x5934080a, 0x8c204512, 0x0400000c, 0x599c0018, + 0x8c000518, 0x04000009, 0x592c000a, 0x82000500, + 0x00000380, 0x82041500, 0xfffffc7f, 0x80080d40, + 0x84040d54, 0x0401f002, 0x84040d14, 0x4806680a, 0x4936600a, 0x492e6009, 0x4a026407, 0x00000001, - 0x8c20450a, 0x04000004, 0x592c0405, 0x8400055c, - 0x48025c05, 0x4c200000, 0x4d3c0000, 0x42027800, - 0x00001800, 0x0201f800, 0x0010df61, 0x5c027800, - 0x5c004000, 0x8c204512, 0x0400000b, 0x599c0018, - 0x8c000518, 0x04000008, 0x592c000a, 0x82000500, - 0x00000380, 0x5934080a, 0x80040d40, 0x84040d54, - 0x4806680a, 0x417a7800, 0x0401f939, 0x42000800, - 0x00000003, 0x0401f941, 0x42027000, 0x00000002, - 0x0201f800, 0x00020a34, 0x80000580, 0x0401f12f, - 0x0201f800, 0x00020319, 0x04020111, 0x0201f800, - 0x0010416b, 0x0400000c, 0x0201f800, 0x00104165, - 0x04020111, 0x4c600000, 0x4178c000, 0x42027800, - 0x00001800, 0x417a6000, 0x0201f800, 0x00101a8f, - 0x5c00c000, 0x59a8006d, 0x8c000502, 0x0400001b, - 0x0201f800, 0x00104165, 0x04000018, 0x59340212, - 0x82000500, 0x0000ff00, 0x42001000, 0x00000010, - 0x0402000c, 0x42001000, 0x00000008, 0x59a8021b, - 0x8c000506, 0x04020009, 0x59340002, 0x82000500, - 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000007, - 0x0201f800, 0x00104429, 0x42000000, 0x0000001c, - 0x40181000, 0x040200d3, 0x0201f800, 0x001070f5, - 0x040000dd, 0x5934080a, 0x8c204512, 0x0400000c, - 0x599c0018, 0x8c000518, 0x04000009, 0x592c000a, - 0x82000500, 0x00000380, 0x82041500, 0xfffffc7f, - 0x80080d40, 0x84040d54, 0x0401f002, 0x84040d14, - 0x4806680a, 0x4936600a, 0x492e6009, 0x4a026407, - 0x00000001, 0x417a7800, 0x0401f8e9, 0x42000800, - 0x00000005, 0x0401f8f1, 0x42027000, 0x00000003, - 0x0201f800, 0x00020a34, 0x80000580, 0x0401f0df, - 0x0201f800, 0x00020319, 0x040200c1, 0x0201f800, - 0x00104181, 0x040200c4, 0x0201f800, 0x00108dde, - 0x040000b5, 0x80000580, 0x0401f0d4, 0x0201f800, - 0x00020319, 0x040200b6, 0x0201f800, 0x00104181, - 0x040200b9, 0x0201f800, 0x00108958, 0x040000aa, - 0x80000580, 0x0401f0c9, 0x0201f800, 0x00020319, - 0x040200ab, 0x83444d80, 0x000007fe, 0x42000000, - 0x0000000a, 0x0402008c, 0x0201f800, 0x00108df6, - 0x0400009d, 0x80000580, 0x0401f0bc, 0x82200500, - 0x00000070, 0x04020005, 0x8c20450e, 0x42000000, - 0x0000000c, 0x04020080, 0x8c20450a, 0x0400000e, + 0x417a7800, 0x0401f8e9, 0x42000800, 0x00000005, + 0x0401f8f1, 0x42027000, 0x00000003, 0x0201f800, + 0x00020a34, 0x80000580, 0x0401f0df, 0x0201f800, + 0x00020319, 0x040200c1, 0x0201f800, 0x0010419d, + 0x040200c4, 0x0201f800, 0x00108e97, 0x040000b5, + 0x80000580, 0x0401f0d4, 0x0201f800, 0x00020319, + 0x040200b6, 0x0201f800, 0x0010419d, 0x040200b9, + 0x0201f800, 0x00108a11, 0x040000aa, 0x80000580, + 0x0401f0c9, 0x0201f800, 0x00020319, 0x040200ab, + 0x83444d80, 0x000007fe, 0x42000000, 0x0000000a, + 0x0402008c, 0x0201f800, 0x00108eaf, 0x0400009d, + 0x80000580, 0x0401f0bc, 0x82200500, 0x00000070, + 0x04020005, 0x8c20450e, 0x42000000, 0x0000000c, + 0x04020080, 0x8c20450a, 0x0400000e, 0x4d3c0000, + 0x42027800, 0x00005000, 0x8c20450e, 0x04020003, + 0x853e7d56, 0x853e7d1c, 0x82200500, 0x000004a0, + 0x0201f800, 0x00104147, 0x5c027800, 0x0401f0a2, + 0x8c204508, 0x04020024, 0x592c1009, 0x82081500, + 0x00ffffff, 0x59a8000f, 0x80084d80, 0x42000000, + 0x00000010, 0x04000067, 0x0201f800, 0x00104112, + 0x0400002c, 0x4803c857, 0x82004d80, 0x0000001a, + 0x04020003, 0x40101000, 0x0401f065, 0x4803c857, + 0x82004d80, 0x0000001b, 0x04020003, 0x40181000, + 0x0401f05f, 0x4803c857, 0x82004d80, 0x0000001c, + 0x04000060, 0x82004d80, 0x00000019, 0x42000000, + 0x0000000a, 0x0400004f, 0x42000000, 0x0000000a, + 0x0401f066, 0x0201f800, 0x00020319, 0x04020063, 0x4d3c0000, 0x42027800, 0x00005000, 0x8c20450e, 0x04020003, 0x853e7d56, 0x853e7d1c, 0x82200500, - 0x000004a0, 0x0201f800, 0x0010412d, 0x5c027800, - 0x0401f0a2, 0x8c204508, 0x04020024, 0x592c1009, - 0x82081500, 0x00ffffff, 0x59a8000f, 0x80084d80, - 0x42000000, 0x00000010, 0x04000067, 0x0201f800, - 0x001040f8, 0x0400002c, 0x4803c857, 0x82004d80, - 0x0000001a, 0x04020003, 0x40101000, 0x0401f065, - 0x4803c857, 0x82004d80, 0x0000001b, 0x04020003, - 0x40181000, 0x0401f05f, 0x4803c857, 0x82004d80, - 0x0000001c, 0x04000060, 0x82004d80, 0x00000019, - 0x42000000, 0x0000000a, 0x0400004f, 0x42000000, - 0x0000000a, 0x0401f066, 0x0201f800, 0x00020319, - 0x04020063, 0x4d3c0000, 0x42027800, 0x00005000, - 0x8c20450e, 0x04020003, 0x853e7d56, 0x853e7d1c, - 0x82200500, 0x00000090, 0x0201f800, 0x00104115, - 0x5c027800, 0x42000000, 0x0000000a, 0x0402003a, - 0x0401f06a, 0x836c0580, 0x00000003, 0x42000800, - 0x00000007, 0x04020006, 0x0201f800, 0x00108d89, - 0x04000007, 0x80000580, 0x0401f064, 0x0201f800, - 0x001041ae, 0x04000059, 0x0401f05c, 0x0201f800, - 0x001041ae, 0x0400003c, 0x0401f058, 0x0201f800, - 0x00020319, 0x0402003e, 0x836c0580, 0x00000003, - 0x04020048, 0x8c204508, 0x0400000a, 0x4c600000, - 0x4178c000, 0x42027800, 0x00001800, 0x417a6000, - 0x0201f800, 0x00101a8f, 0x5c00c000, 0x0401f047, - 0x0201f800, 0x0010416b, 0x0400000c, 0x0201f800, - 0x00104165, 0x04020030, 0x4c600000, 0x4178c000, + 0x00000090, 0x0201f800, 0x0010412f, 0x5c027800, + 0x42000000, 0x0000000a, 0x0402003a, 0x0401f06a, + 0x836c0580, 0x00000003, 0x42000800, 0x00000007, + 0x04020006, 0x0201f800, 0x00108e42, 0x04000007, + 0x80000580, 0x0401f064, 0x0201f800, 0x001041ca, + 0x04000059, 0x0401f05c, 0x0201f800, 0x001041ca, + 0x0400003c, 0x0401f058, 0x0201f800, 0x00020319, + 0x0402003e, 0x836c0580, 0x00000003, 0x04020048, + 0x8c204508, 0x0400000a, 0x4c600000, 0x4178c000, 0x42027800, 0x00001800, 0x417a6000, 0x0201f800, - 0x00101a8f, 0x5c00c000, 0x480bc856, 0x0201f800, - 0x00108be7, 0x04000018, 0x80000580, 0x0401f037, - 0x0401f7db, 0x480bc857, 0x42000800, 0x00000019, - 0x40001000, 0x4200b000, 0x00000002, 0x0401f00a, - 0x480bc857, 0x40000800, 0x4200b000, 0x00000002, - 0x0401f005, 0x480bc857, 0x40000800, 0x4200b000, - 0x00000001, 0x480bc857, 0x42028000, 0x00000031, - 0x0401f020, 0x480bc857, 0x42000800, 0x00000003, - 0x4200b000, 0x00000001, 0x0401f7f7, 0x480bc857, - 0x42000800, 0x0000000a, 0x4200b000, 0x00000001, - 0x0401f7f1, 0x480bc857, 0x42000800, 0x00000009, - 0x40001000, 0x4200b000, 0x00000002, 0x0401f7ea, - 0x480bc857, 0x42000800, 0x00000007, 0x4200b000, - 0x00000001, 0x0401f7e4, 0x480bc857, 0x4200b000, - 0x00000001, 0x0401f7e0, 0x80028580, 0x4178b000, - 0x82000540, 0x00000001, 0x1c01f000, 0x4937c857, - 0x5932680a, 0x59341200, 0x813e79c0, 0x04000003, - 0x84081540, 0x0401f002, 0x84081500, 0x480a6a00, - 0x1c01f000, 0x40680800, 0x5932680a, 0x5c000000, - 0x4c000000, 0x4803c857, 0x4937c857, 0x82040580, - 0x00000006, 0x04020004, 0x42000000, 0x00000606, - 0x0401f021, 0x82040580, 0x00000004, 0x04020004, - 0x42000000, 0x00000404, 0x0401f01b, 0x82040580, - 0x00000007, 0x42000000, 0x00000707, 0x04000016, - 0x82040580, 0x00000003, 0x42000000, 0x00000703, - 0x04000011, 0x82040580, 0x00000005, 0x42000000, - 0x00000405, 0x0400000c, 0x82040580, 0x00000009, - 0x42000000, 0x00000409, 0x04000007, 0x82040580, - 0x0000000b, 0x42000000, 0x0000070b, 0x02020800, - 0x0010032d, 0x4803c857, 0x48026c00, 0x82040d80, - 0x00000006, 0x04020005, 0x59341404, 0x800811c0, - 0x02000800, 0x0010032d, 0x1c01f000, 0x40683000, - 0x0401f80b, 0x41358800, 0x04000002, 0x41798800, - 0x1c01f000, 0x40683000, 0x0401f80a, 0x41358800, - 0x04000002, 0x41798800, 0x1c01f000, 0x5c000000, - 0x4c000000, 0x4803c857, 0x4947c857, 0x481bc857, - 0x83440480, 0x00000800, 0x0402103a, 0x83441400, - 0x0010af80, 0x50080000, 0x80026d40, 0x04020011, - 0x4c180000, 0x4d2c0000, 0x0201f800, 0x0010055a, - 0x412e6800, 0x5c025800, 0x5c003000, 0x0400002d, - 0x45341000, 0x497a680d, 0x497a6810, 0x497a680f, - 0x497a680e, 0x4c180000, 0x0401fcbb, 0x5c003000, - 0x59340a12, 0x4c040000, 0x0201f800, 0x00104716, - 0x5c000800, 0x04000009, 0x82180500, 0x00ffff00, - 0x04000008, 0x59a8100f, 0x82081500, 0x00ffff00, - 0x80080580, 0x04000003, 0x80000580, 0x0401f004, - 0x82180500, 0x000000ff, 0x800000d0, 0x80040d80, - 0x04000003, 0x4803c857, 0x48026a12, 0x83440580, - 0x000007fe, 0x04020004, 0x4a026802, 0x00fffffe, - 0x0401f006, 0x59340002, 0x80180580, 0x04000003, - 0x481bc857, 0x481a6802, 0x80000580, 0x1c01f000, - 0x4803c856, 0x82000540, 0x00000001, 0x0401f7fc, - 0x0401f807, 0x42018800, 0x00000001, 0x04020003, - 0x42018800, 0x00000000, 0x1c01f000, 0x4947c857, - 0x83440480, 0x00000800, 0x04021010, 0x83441400, - 0x0010af80, 0x50080000, 0x80026d40, 0x0400000a, - 0x0401fb45, 0x04020009, 0x8d0e1d02, 0x04000004, - 0x59340200, 0x8c00050e, 0x04000004, 0x82000540, - 0x00000001, 0x1c01f000, 0x80000580, 0x0401f7fe, - 0x5c000000, 0x4c000000, 0x4803c857, 0x4947c857, - 0x0401f807, 0x42018800, 0x00000001, 0x04000003, - 0x42018800, 0x00000000, 0x1c01f000, 0x4d2c0000, - 0x4d300000, 0x83440480, 0x00000800, 0x04021024, - 0x83441400, 0x0010af80, 0x50080000, 0x80026d40, - 0x0400001b, 0x45781000, 0x5934000d, 0x80025d40, - 0x02020800, 0x00100589, 0x59366011, 0x813261c0, - 0x0400000e, 0x4c640000, 0x5930c800, 0x59325809, - 0x0201f800, 0x0010889a, 0x02020800, 0x00100589, - 0x0201f800, 0x00020a10, 0x82666540, 0x00000000, - 0x040207f6, 0x5c00c800, 0x0201f800, 0x00104416, - 0x41365800, 0x0201f800, 0x00100581, 0x80000580, - 0x5c026000, 0x5c025800, 0x1c01f000, 0x82000540, - 0x00000001, 0x0401f7fb, 0x0201f800, 0x00020319, - 0x41358800, 0x04000002, 0x41798800, 0x1c01f000, - 0x4c580000, 0x59cc0001, 0x4937c857, 0x82000500, - 0x00ffffff, 0x48026802, 0x497a6c01, 0x497a6a01, - 0x59340200, 0x84000502, 0x48026a00, 0x0201f800, - 0x00104716, 0x0402001a, 0x59340403, 0x82000580, - 0x000007fe, 0x04000005, 0x59a8021b, 0x8c00050a, - 0x04020013, 0x0401f008, 0x59cc0408, 0x8c000518, - 0x0400000f, 0x59cc0009, 0x48035028, 0x59cc000a, - 0x48035029, 0x59a80873, 0x8c040d3e, 0x04020008, - 0x59cc0207, 0x80000540, 0x04020003, 0x42000000, - 0x00000001, 0x48038893, 0x48035012, 0x59cc0a09, - 0x82040d00, 0x00000010, 0x59cc0408, 0x82000500, - 0x00000020, 0x04000005, 0x84040d40, 0x59a8121b, - 0x8408155a, 0x480b521b, 0x5934000a, 0x82000500, - 0xffffffee, 0x80040540, 0x4802680a, 0x83cca400, - 0x0000000b, 0x8334ac00, 0x00000006, 0x4200b000, - 0x00000002, 0x0201f800, 0x0010adef, 0x83cca400, - 0x0000000d, 0x8334ac00, 0x00000008, 0x4200b000, - 0x00000002, 0x0201f800, 0x0010adef, 0x59cc0a18, - 0x82040480, 0x00000800, 0x0402100c, 0x82040480, - 0x00000400, 0x04001004, 0x42000800, 0x00000400, - 0x0401f006, 0x82040480, 0x00000200, 0x04001003, - 0x42000800, 0x00000200, 0x42001000, 0x0010b895, - 0x58080201, 0x80041480, 0x04001002, 0x40000800, - 0x48066a04, 0x59340403, 0x82000580, 0x000007fe, - 0x04020003, 0x59cc0a08, 0x48066a04, 0x0201f800, - 0x0010444c, 0x5c00b000, 0x1c01f000, 0x59a8021b, - 0x4937c857, 0x8c000508, 0x04000008, 0x84000556, - 0x4803c857, 0x4803521b, 0x42001000, 0x0010eacd, - 0x0201f800, 0x001057cd, 0x59cc0207, 0x4803c857, - 0x48026a05, 0x59cc020a, 0x4803c857, 0x48026c05, - 0x59341200, 0x599c0818, 0x5934180a, 0x4807c857, - 0x480bc857, 0x480fc857, 0x59cc2006, 0x82102500, - 0xff000000, 0x82102580, 0x02000000, 0x04000007, - 0x8c00050e, 0x04000009, 0x8c0c1d14, 0x04000003, - 0x8c0c1d0e, 0x04000005, 0x8c040d18, 0x04000003, - 0x8408154a, 0x0401f002, 0x8408150a, 0x8c000510, - 0x04000009, 0x8c0c1d14, 0x04000003, 0x8c0c1d10, - 0x04000005, 0x8c040d18, 0x04000003, 0x8408154e, - 0x0401f002, 0x8408150e, 0x8c000512, 0x04000009, - 0x8c0c1d14, 0x04000003, 0x8c0c1d12, 0x04000005, - 0x8c040d18, 0x04000003, 0x8408155c, 0x0401f002, - 0x8408151c, 0x480a6a00, 0x1c01f000, 0x4803c856, - 0x4c5c0000, 0x4d2c0000, 0x4c580000, 0x5934000d, - 0x80025d40, 0x04000029, 0x592c0003, 0x82000480, - 0x00000008, 0x0400100b, 0x412cb800, 0x592c0001, - 0x80025d40, 0x040207f9, 0x0201f800, 0x0010056f, - 0x04000037, 0x492fc857, 0x492cb801, 0x0401f020, - 0x832c0c00, 0x00000004, 0x4200b000, 0x00000008, - 0x50040000, 0x82000580, 0xffffffff, 0x04020006, - 0x80041000, 0x50080000, 0x82000580, 0xffffffff, - 0x04000007, 0x82040c00, 0x00000002, 0x8058b040, - 0x040207f4, 0x0201f800, 0x0010032d, 0x45480800, - 0x454c1000, 0x592c1803, 0x800c1800, 0x480e5803, - 0x480fc857, 0x0401f014, 0x0201f800, 0x0010056f, - 0x04000017, 0x492fc857, 0x492e680d, 0x497a5802, - 0x4a025803, 0x00000001, 0x494a5804, 0x494e5805, - 0x832c0c00, 0x00000006, 0x4200b000, 0x0000000e, - 0x46000800, 0xffffffff, 0x80040800, 0x8058b040, - 0x040207fc, 0x82000540, 0x00000001, 0x5c00b000, - 0x5c025800, 0x5c00b800, 0x1c01f000, 0x80000580, - 0x0401f7fb, 0x4803c856, 0x4d3c0000, 0x4d2c0000, - 0x5934000d, 0x80025d40, 0x0400001f, 0x592c0002, - 0x80000540, 0x0402001f, 0x412e7800, 0x0401f8d6, - 0x0402001c, 0x46000800, 0xffffffff, 0x46001000, - 0xffffffff, 0x4813c857, 0x480fc857, 0x580c0003, - 0x82000c80, 0x00000002, 0x04021014, 0x480fc857, - 0x400c0000, 0x812c0580, 0x04020004, 0x580c0001, - 0x4802680d, 0x0401f003, 0x580c0001, 0x48002001, - 0x400e5800, 0x0201f800, 0x00100580, 0x82000540, - 0x00000001, 0x5c025800, 0x5c027800, 0x1c01f000, - 0x80000580, 0x0401f7fc, 0x80000040, 0x48001803, - 0x4803c857, 0x0401f7f6, 0x0201f800, 0x00020111, - 0x59300008, 0x8400054e, 0x48026008, 0x592c1a05, - 0x820c1d00, 0x000000ff, 0x820c0580, 0x00000048, - 0x04000013, 0x0201f000, 0x00020360, 0x8c000500, - 0x02020800, 0x00020179, 0x4a026203, 0x00000002, - 0x592c1a05, 0x820c1d00, 0x000000ff, 0x820c0580, - 0x00000018, 0x02000000, 0x00020360, 0x820c0580, - 0x00000048, 0x02020000, 0x00020360, 0x42000800, - 0x80000804, 0x0201f800, 0x000209a3, 0x0201f000, - 0x00020369, 0x4a025a07, 0x00000008, 0x0201f000, - 0x000203ab, 0x4a025a07, 0x00000029, 0x0201f000, - 0x000203ab, 0x4a025a07, 0x0000002a, 0x0201f000, - 0x000203ab, 0x4a025a07, 0x00000028, 0x0201f000, - 0x000203ab, 0x4a025a07, 0x0000000e, 0x0201f000, - 0x000203ab, 0x4943c857, 0x4d440000, 0x4d340000, - 0x4d2c0000, 0x4c580000, 0x4200b000, 0x000007f0, - 0x417a8800, 0x0201f800, 0x00020319, 0x04020007, - 0x8d3e7d06, 0x04000004, 0x59340200, 0x8c00050e, - 0x04020002, 0x0401f813, 0x81468800, 0x8058b040, - 0x040207f5, 0x83440480, 0x00000800, 0x04021008, - 0x8d3e7d02, 0x04000006, 0x42028800, 0x000007f0, - 0x4200b000, 0x00000010, 0x0401f7eb, 0x5c00b000, - 0x5c025800, 0x5c026800, 0x5c028800, 0x1c01f000, - 0x4d2c0000, 0x4c600000, 0x4c5c0000, 0x4178b800, - 0x5936580f, 0x812e59c0, 0x04000029, 0x592c0205, - 0x82000500, 0x000000ff, 0x82000580, 0x00000012, - 0x04000020, 0x8d3e7d00, 0x04000003, 0x0401f844, - 0x0402001c, 0x592cc000, 0x497a5800, 0x805cb9c0, - 0x04020009, 0x59340010, 0x812c0580, 0x04020004, - 0x497a680f, 0x497a6810, 0x0401f008, 0x4862680f, - 0x0401f006, 0x4860b800, 0x59340010, 0x812c0580, - 0x04020002, 0x485e6810, 0x4a025a05, 0x00000103, - 0x49425a07, 0x497a580a, 0x0201f800, 0x00108a42, - 0x0201f800, 0x000203ab, 0x40625800, 0x0401f7da, - 0x412cb800, 0x592e5800, 0x0401f7d7, 0x5c00b800, - 0x5c00c000, 0x5c025800, 0x1c01f000, 0x4803c856, - 0x41781800, 0x5934000f, 0x80025d40, 0x04000016, - 0x592c0006, 0x80200580, 0x592c0000, 0x04000003, - 0x412c1800, 0x0401f7f9, 0x592c0a05, 0x82040d00, - 0x000000ff, 0x82040d80, 0x00000012, 0x040007f9, - 0x497a5800, 0x800c19c0, 0x04000008, 0x48001800, - 0x80000540, 0x04020004, 0x480e6810, 0x82000540, - 0x00000001, 0x1c01f000, 0x4802680f, 0x80000540, - 0x040207fd, 0x497a6810, 0x0401f7f9, 0x592c0009, - 0x81480580, 0x04020003, 0x592c000a, 0x814c0580, - 0x1c01f000, 0x4803c856, 0x4c580000, 0x413c1800, - 0x400c2000, 0x593c0002, 0x80000540, 0x04020018, - 0x4200b000, 0x00000008, 0x820c0c00, 0x00000004, - 0x50040000, 0x81480580, 0x04020005, 0x80041000, - 0x50080000, 0x814c0580, 0x0400000d, 0x82040c00, - 0x00000002, 0x8058b040, 0x040207f6, 0x400c2000, - 0x580c0001, 0x80001d40, 0x040207ee, 0x82000540, - 0x00000001, 0x5c00b000, 0x1c01f000, 0x80000580, - 0x0401f7fd, 0x4937c857, 0x4c580000, 0x4d2c0000, - 0x5934000d, 0x80025d40, 0x04020016, 0x0201f800, - 0x0010056f, 0x04000010, 0x492e680d, 0x4a025802, - 0x00000001, 0x497a5803, 0x832c0c00, 0x00000004, - 0x4200b000, 0x00000010, 0x46000800, 0xffffffff, + 0x00101a94, 0x5c00c000, 0x0401f047, 0x0201f800, + 0x00104187, 0x0400000c, 0x0201f800, 0x00104181, + 0x04020030, 0x4c600000, 0x4178c000, 0x42027800, + 0x00001800, 0x417a6000, 0x0201f800, 0x00101a94, + 0x5c00c000, 0x480bc856, 0x0201f800, 0x00108ca0, + 0x04000018, 0x80000580, 0x0401f037, 0x0401f7db, + 0x480bc857, 0x42000800, 0x00000019, 0x40001000, + 0x4200b000, 0x00000002, 0x0401f00a, 0x480bc857, + 0x40000800, 0x4200b000, 0x00000002, 0x0401f005, + 0x480bc857, 0x40000800, 0x4200b000, 0x00000001, + 0x480bc857, 0x42028000, 0x00000031, 0x0401f020, + 0x480bc857, 0x42000800, 0x00000003, 0x4200b000, + 0x00000001, 0x0401f7f7, 0x480bc857, 0x42000800, + 0x0000000a, 0x4200b000, 0x00000001, 0x0401f7f1, + 0x480bc857, 0x42000800, 0x00000009, 0x40001000, + 0x4200b000, 0x00000002, 0x0401f7ea, 0x480bc857, + 0x42000800, 0x00000007, 0x4200b000, 0x00000001, + 0x0401f7e4, 0x480bc857, 0x4200b000, 0x00000001, + 0x0401f7e0, 0x80028580, 0x4178b000, 0x82000540, + 0x00000001, 0x1c01f000, 0x4937c857, 0x5932680a, + 0x59341200, 0x813e79c0, 0x04000003, 0x84081540, + 0x0401f002, 0x84081500, 0x480a6a00, 0x1c01f000, + 0x40680800, 0x5932680a, 0x5c000000, 0x4c000000, + 0x4803c857, 0x4937c857, 0x83340580, 0x0010c2b2, + 0x04000030, 0x82040580, 0x00000006, 0x04020004, + 0x42000000, 0x00000606, 0x0401f021, 0x82040580, + 0x00000004, 0x04020004, 0x42000000, 0x00000404, + 0x0401f01b, 0x82040580, 0x00000007, 0x42000000, + 0x00000707, 0x04000016, 0x82040580, 0x00000003, + 0x42000000, 0x00000703, 0x04000011, 0x82040580, + 0x00000005, 0x42000000, 0x00000405, 0x0400000c, + 0x82040580, 0x00000009, 0x42000000, 0x00000409, + 0x04000007, 0x82040580, 0x0000000b, 0x42000000, + 0x0000070b, 0x02020800, 0x0010032d, 0x4803c857, + 0x48026c00, 0x82040d80, 0x00000006, 0x04020005, + 0x59341404, 0x800811c0, 0x02000800, 0x0010032d, + 0x1c01f000, 0x40683000, 0x0401f80b, 0x41358800, + 0x04000002, 0x41798800, 0x1c01f000, 0x40683000, + 0x0401f80a, 0x41358800, 0x04000002, 0x41798800, + 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, + 0x4947c857, 0x481bc857, 0x83440480, 0x00000800, + 0x0402103a, 0x83441400, 0x0010b080, 0x50080000, + 0x80026d40, 0x04020011, 0x4c180000, 0x4d2c0000, + 0x0201f800, 0x0010055a, 0x412e6800, 0x5c025800, + 0x5c003000, 0x0400002d, 0x45341000, 0x497a680d, + 0x497a6810, 0x497a680f, 0x497a680e, 0x4c180000, + 0x0401fcb8, 0x5c003000, 0x59340a12, 0x4c040000, + 0x0201f800, 0x00104755, 0x5c000800, 0x04000009, + 0x82180500, 0x00ffff00, 0x04000008, 0x59a8100f, + 0x82081500, 0x00ffff00, 0x80080580, 0x04000003, + 0x80000580, 0x0401f004, 0x82180500, 0x000000ff, + 0x800000d0, 0x80040d80, 0x04000003, 0x4803c857, + 0x48026a12, 0x83440580, 0x000007fe, 0x04020004, + 0x4a026802, 0x00fffffe, 0x0401f006, 0x59340002, + 0x80180580, 0x04000003, 0x481bc857, 0x481a6802, + 0x80000580, 0x1c01f000, 0x4803c856, 0x82000540, + 0x00000001, 0x0401f7fc, 0x0401f807, 0x42018800, + 0x00000001, 0x04020003, 0x42018800, 0x00000000, + 0x1c01f000, 0x4947c857, 0x83440480, 0x00000800, + 0x04021010, 0x83441400, 0x0010b080, 0x50080000, + 0x80026d40, 0x0400000a, 0x0401fb4b, 0x04020009, + 0x8d0e1d02, 0x04000004, 0x59340200, 0x8c00050e, + 0x04000004, 0x82000540, 0x00000001, 0x1c01f000, + 0x80000580, 0x0401f7fe, 0x5c000000, 0x4c000000, + 0x4803c857, 0x4947c857, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, + 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x83440480, + 0x00000800, 0x04021024, 0x83441400, 0x0010b080, + 0x50080000, 0x80026d40, 0x0400001b, 0x45781000, + 0x5934000d, 0x80025d40, 0x02020800, 0x00100589, + 0x59366011, 0x813261c0, 0x0400000e, 0x4c640000, + 0x5930c800, 0x59325809, 0x0201f800, 0x00108953, + 0x02020800, 0x00100589, 0x0201f800, 0x00020a10, + 0x82666540, 0x00000000, 0x040207f6, 0x5c00c800, + 0x0201f800, 0x00104435, 0x41365800, 0x0201f800, + 0x00100581, 0x80000580, 0x5c026000, 0x5c025800, + 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fb, + 0x0201f800, 0x00020319, 0x41358800, 0x04000002, + 0x41798800, 0x1c01f000, 0x4c580000, 0x59cc0001, + 0x4937c857, 0x82000500, 0x00ffffff, 0x48026802, + 0x497a6c01, 0x497a6a01, 0x59340200, 0x82000500, + 0xffffdffd, 0x48026a00, 0x0201f800, 0x00104755, + 0x0402001a, 0x59340403, 0x82000580, 0x000007fe, + 0x04000005, 0x59a8021b, 0x8c00050a, 0x04020013, + 0x0401f008, 0x59cc0408, 0x8c000518, 0x0400000f, + 0x59cc0009, 0x48035028, 0x59cc000a, 0x48035029, + 0x59a80873, 0x8c040d3e, 0x04020008, 0x59cc0207, + 0x80000540, 0x04020003, 0x42000000, 0x00000001, + 0x48038893, 0x48035012, 0x59cc0a09, 0x82040d00, + 0x00000010, 0x59cc0408, 0x82000500, 0x00000020, + 0x04000005, 0x84040d40, 0x59a8121b, 0x8408155a, + 0x480b521b, 0x5934000a, 0x82000500, 0xffffffee, + 0x80040540, 0x4802680a, 0x83cca400, 0x0000000b, + 0x8334ac00, 0x00000006, 0x4200b000, 0x00000002, + 0x0201f800, 0x0010aee2, 0x83cca400, 0x0000000d, + 0x8334ac00, 0x00000008, 0x4200b000, 0x00000002, + 0x0201f800, 0x0010aee2, 0x59cc0a18, 0x59a80006, + 0x8c00050c, 0x04020015, 0x82040480, 0x00000800, + 0x0402100c, 0x82040480, 0x00000400, 0x04001004, + 0x42000800, 0x00000400, 0x0401f006, 0x82040480, + 0x00000200, 0x04001003, 0x42000800, 0x00000200, + 0x42001000, 0x0010b995, 0x58080201, 0x80041480, + 0x04001002, 0x40000800, 0x48066a04, 0x59340403, + 0x82000580, 0x000007fe, 0x04020003, 0x59cc0a08, + 0x48066a04, 0x0201f800, 0x0010446b, 0x5c00b000, + 0x1c01f000, 0x59a8021b, 0x4937c857, 0x8c000508, + 0x04000008, 0x84000556, 0x4803c857, 0x4803521b, + 0x42001000, 0x0010ebc8, 0x0201f800, 0x00105872, + 0x59cc0207, 0x4803c857, 0x48026a05, 0x59cc020a, + 0x4803c857, 0x48026c05, 0x59341200, 0x599c0818, + 0x5934180a, 0x4807c857, 0x480bc857, 0x480fc857, + 0x59cc2006, 0x82102500, 0xff000000, 0x82102580, + 0x02000000, 0x04000007, 0x8c00050e, 0x04000009, + 0x8c0c1d14, 0x04000003, 0x8c0c1d0e, 0x04000005, + 0x8c040d18, 0x04000003, 0x8408154a, 0x0401f002, + 0x8408150a, 0x8c000510, 0x04000009, 0x8c0c1d14, + 0x04000003, 0x8c0c1d10, 0x04000005, 0x8c040d18, + 0x04000003, 0x8408154e, 0x0401f002, 0x8408150e, + 0x8c000512, 0x04000009, 0x8c0c1d14, 0x04000003, + 0x8c0c1d12, 0x04000005, 0x8c040d18, 0x04000003, + 0x8408155c, 0x0401f002, 0x8408151c, 0x480a6a00, + 0x1c01f000, 0x4803c856, 0x4c5c0000, 0x4d2c0000, + 0x4c580000, 0x5934000d, 0x80025d40, 0x04000029, + 0x592c0003, 0x82000480, 0x00000008, 0x0400100b, + 0x412cb800, 0x592c0001, 0x80025d40, 0x040207f9, + 0x0201f800, 0x0010056f, 0x04000037, 0x492fc857, + 0x492cb801, 0x0401f020, 0x832c0c00, 0x00000004, + 0x4200b000, 0x00000008, 0x50040000, 0x82000580, + 0xffffffff, 0x04020006, 0x80041000, 0x50080000, + 0x82000580, 0xffffffff, 0x04000007, 0x82040c00, + 0x00000002, 0x8058b040, 0x040207f4, 0x0201f800, + 0x0010032d, 0x45480800, 0x454c1000, 0x592c1803, + 0x800c1800, 0x480e5803, 0x480fc857, 0x0401f014, + 0x0201f800, 0x0010056f, 0x04000017, 0x492fc857, + 0x492e680d, 0x497a5802, 0x4a025803, 0x00000001, + 0x494a5804, 0x494e5805, 0x832c0c00, 0x00000006, + 0x4200b000, 0x0000000e, 0x46000800, 0xffffffff, 0x80040800, 0x8058b040, 0x040207fc, 0x82000540, - 0x00000001, 0x5c025800, 0x5c00b000, 0x1c01f000, - 0x4d2c0000, 0x592e5801, 0x0201f800, 0x00100589, - 0x5c025800, 0x497a5801, 0x0401f7e9, 0x4d2c0000, - 0x5936580d, 0x812e59c0, 0x04000007, 0x4937c857, - 0x497a680d, 0x0201f800, 0x00100589, 0x82000540, - 0x00000001, 0x5c025800, 0x1c01f000, 0x59340405, - 0x4937c857, 0x4803c857, 0x8c000508, 0x1c01f000, - 0x4933c857, 0x5930380a, 0x581c0200, 0x8400051a, - 0x48003a00, 0x1c01f000, 0x42026800, 0x0010b876, - 0x497a680e, 0x42028800, 0x000007ff, 0x0201f800, - 0x00103aa1, 0x4937c857, 0x4a026c00, 0x00000606, - 0x4a026802, 0x00ffffff, 0x4a026a04, 0x00000200, - 0x4a026c04, 0x00000002, 0x1c01f000, 0x0401f807, - 0x42018800, 0x00000001, 0x04020003, 0x42018800, - 0x00000000, 0x1c01f000, 0x5930000a, 0x50000000, - 0x4933c857, 0x4803c857, 0x8c00050e, 0x1c01f000, - 0x5930000a, 0x50000000, 0x8c00050a, 0x1c01f000, - 0x0401f807, 0x42018800, 0x00000001, 0x04000003, - 0x42018800, 0x00000000, 0x1c01f000, 0x4933c856, - 0x0401f8bc, 0x04000006, 0x59340400, 0x82000d00, - 0x000000ff, 0x82041580, 0x00000005, 0x1c01f000, - 0x0401f807, 0x42018800, 0x00000001, 0x04020003, - 0x42018800, 0x00000000, 0x1c01f000, 0x4d340000, - 0x83ac0400, 0x000007fe, 0x50000000, 0x80026d40, - 0x04000003, 0x59340200, 0x8c00051a, 0x5c026800, - 0x1c01f000, 0x4937c857, 0x493fc857, 0x59340403, - 0x81ac0400, 0x50000000, 0x81340580, 0x02020800, - 0x0010032d, 0x59341200, 0x813e79c0, 0x04000003, - 0x8408155e, 0x0401f002, 0x8408151e, 0x480a6a00, - 0x1c01f000, 0x4937c857, 0x0201f800, 0x00101b05, - 0x04000006, 0x59a80828, 0x42001000, 0x001040ef, - 0x0201f800, 0x00105904, 0x1c01f000, 0x4937c857, - 0x42001000, 0x001040ef, 0x0201f800, 0x001057cd, - 0x59a8121b, 0x84081512, 0x480b521b, 0x1c01f000, - 0x4008d000, 0x4020d800, 0x829d3c80, 0x00000004, - 0x409ce000, 0x0201f800, 0x0010ebbd, 0x589c0000, - 0x589c2001, 0x589c2802, 0x589c3003, 0x829d3c00, - 0x00000004, 0x800001c0, 0x1c01f000, 0x4d340000, - 0x406a6800, 0x0401f803, 0x5c026800, 0x1c01f000, - 0x5934000f, 0x5934140b, 0x80081040, 0x04001002, - 0x480a6c0b, 0x80000540, 0x02020800, 0x00020327, - 0x1c01f000, 0x4803c857, 0x4947c857, 0x4c300000, - 0x82006500, 0x00000030, 0x04000006, 0x4c000000, - 0x0201f800, 0x00108cef, 0x5c000000, 0x0402000b, - 0x8c00050e, 0x04000006, 0x0201f800, 0x00020319, - 0x04020006, 0x4937c857, 0x0401fd06, 0x80000580, - 0x5c006000, 0x1c01f000, 0x82000540, 0x00000001, - 0x0401f7fc, 0x4803c857, 0x4c580000, 0x4d440000, - 0x40001000, 0x80000d80, 0x4200b000, 0x000007f0, - 0x4c040000, 0x40068800, 0x4c080000, 0x40080000, - 0x0401ffdf, 0x5c001000, 0x5c000800, 0x80040800, - 0x8058b040, 0x040207f7, 0x8c081514, 0x04000007, - 0x84081514, 0x4200b000, 0x00000001, 0x42000800, - 0x000007fc, 0x0401f7ef, 0x4d300000, 0x4d400000, - 0x42028800, 0x0000ffff, 0x42026000, 0x0010f53c, - 0x497a600a, 0x42028000, 0x00000029, 0x0201f800, - 0x0010610d, 0x4df00000, 0x0201f800, 0x0010e4c8, - 0x0201f800, 0x0010ea62, 0x5c03e000, 0x02000800, - 0x001060fa, 0x5c028000, 0x5c026000, 0x5c028800, + 0x00000001, 0x5c00b000, 0x5c025800, 0x5c00b800, + 0x1c01f000, 0x80000580, 0x0401f7fb, 0x4803c856, + 0x4d3c0000, 0x4d2c0000, 0x5934000d, 0x80025d40, + 0x0400001f, 0x592c0002, 0x80000540, 0x0402001f, + 0x412e7800, 0x0401f8d6, 0x0402001c, 0x46000800, + 0xffffffff, 0x46001000, 0xffffffff, 0x4813c857, + 0x480fc857, 0x580c0003, 0x82000c80, 0x00000002, + 0x04021014, 0x480fc857, 0x400c0000, 0x812c0580, + 0x04020004, 0x580c0001, 0x4802680d, 0x0401f003, + 0x580c0001, 0x48002001, 0x400e5800, 0x0201f800, + 0x00100580, 0x82000540, 0x00000001, 0x5c025800, + 0x5c027800, 0x1c01f000, 0x80000580, 0x0401f7fc, + 0x80000040, 0x48001803, 0x4803c857, 0x0401f7f6, + 0x0201f800, 0x00020111, 0x59300008, 0x8400054e, + 0x48026008, 0x592c1a05, 0x820c1d00, 0x000000ff, + 0x820c0580, 0x00000048, 0x04000013, 0x0201f000, + 0x00020360, 0x8c000500, 0x02020800, 0x00020179, + 0x4a026203, 0x00000002, 0x592c1a05, 0x820c1d00, + 0x000000ff, 0x820c0580, 0x00000018, 0x02000000, + 0x00020360, 0x820c0580, 0x00000048, 0x02020000, + 0x00020360, 0x42000800, 0x80000804, 0x0201f800, + 0x000209a3, 0x0201f000, 0x00020369, 0x4a025a07, + 0x00000008, 0x0201f000, 0x000203ab, 0x4a025a07, + 0x00000029, 0x0201f000, 0x000203ab, 0x4a025a07, + 0x0000002a, 0x0201f000, 0x000203ab, 0x4a025a07, + 0x00000028, 0x0201f000, 0x000203ab, 0x4a025a07, + 0x0000000e, 0x0201f000, 0x000203ab, 0x4943c857, + 0x4d440000, 0x4d340000, 0x4d2c0000, 0x4c580000, + 0x4200b000, 0x000007f0, 0x417a8800, 0x0201f800, + 0x00020319, 0x04020007, 0x8d3e7d06, 0x04000004, + 0x59340200, 0x8c00050e, 0x04020002, 0x0401f813, + 0x81468800, 0x8058b040, 0x040207f5, 0x83440480, + 0x00000800, 0x04021008, 0x8d3e7d02, 0x04000006, + 0x42028800, 0x000007f0, 0x4200b000, 0x00000010, + 0x0401f7eb, 0x5c00b000, 0x5c025800, 0x5c026800, + 0x5c028800, 0x1c01f000, 0x4d2c0000, 0x4c600000, + 0x4c5c0000, 0x4178b800, 0x5936580f, 0x812e59c0, + 0x04000029, 0x592c0205, 0x82000500, 0x000000ff, + 0x82000580, 0x00000012, 0x04000020, 0x8d3e7d00, + 0x04000003, 0x0401f844, 0x0402001c, 0x592cc000, + 0x497a5800, 0x805cb9c0, 0x04020009, 0x59340010, + 0x812c0580, 0x04020004, 0x497a680f, 0x497a6810, + 0x0401f008, 0x4862680f, 0x0401f006, 0x4860b800, + 0x59340010, 0x812c0580, 0x04020002, 0x485e6810, + 0x4a025a05, 0x00000103, 0x49425a07, 0x497a580a, + 0x0201f800, 0x00108afb, 0x0201f800, 0x000203ab, + 0x40625800, 0x0401f7da, 0x412cb800, 0x592e5800, + 0x0401f7d7, 0x5c00b800, 0x5c00c000, 0x5c025800, + 0x1c01f000, 0x4803c856, 0x41781800, 0x5934000f, + 0x80025d40, 0x04000016, 0x592c0006, 0x80200580, + 0x592c0000, 0x04000003, 0x412c1800, 0x0401f7f9, + 0x592c0a05, 0x82040d00, 0x000000ff, 0x82040d80, + 0x00000012, 0x040007f9, 0x497a5800, 0x800c19c0, + 0x04000008, 0x48001800, 0x80000540, 0x04020004, + 0x480e6810, 0x82000540, 0x00000001, 0x1c01f000, + 0x4802680f, 0x80000540, 0x040207fd, 0x497a6810, + 0x0401f7f9, 0x592c0009, 0x81480580, 0x04020003, + 0x592c000a, 0x814c0580, 0x1c01f000, 0x4803c856, + 0x4c580000, 0x413c1800, 0x400c2000, 0x593c0002, + 0x80000540, 0x04020018, 0x4200b000, 0x00000008, + 0x820c0c00, 0x00000004, 0x50040000, 0x81480580, + 0x04020005, 0x80041000, 0x50080000, 0x814c0580, + 0x0400000d, 0x82040c00, 0x00000002, 0x8058b040, + 0x040207f6, 0x400c2000, 0x580c0001, 0x80001d40, + 0x040207ee, 0x82000540, 0x00000001, 0x5c00b000, + 0x1c01f000, 0x80000580, 0x0401f7fd, 0x4937c857, + 0x4c580000, 0x4d2c0000, 0x5934000d, 0x80025d40, + 0x04020016, 0x0201f800, 0x0010056f, 0x04000010, + 0x492e680d, 0x4a025802, 0x00000001, 0x497a5803, + 0x832c0c00, 0x00000004, 0x4200b000, 0x00000010, + 0x46000800, 0xffffffff, 0x80040800, 0x8058b040, + 0x040207fc, 0x82000540, 0x00000001, 0x5c025800, + 0x5c00b000, 0x1c01f000, 0x4d2c0000, 0x592e5801, + 0x0201f800, 0x00100589, 0x5c025800, 0x497a5801, + 0x0401f7e9, 0x4d2c0000, 0x5936580d, 0x812e59c0, + 0x04000007, 0x4937c857, 0x497a680d, 0x0201f800, + 0x00100589, 0x82000540, 0x00000001, 0x5c025800, + 0x1c01f000, 0x59340405, 0x4937c857, 0x4803c857, + 0x8c000508, 0x1c01f000, 0x4933c857, 0x5930380a, + 0x581c0200, 0x8400051a, 0x48003a00, 0x1c01f000, + 0x42026800, 0x0010b976, 0x497a680e, 0x42028800, + 0x000007ff, 0x0201f800, 0x00103ab4, 0x4937c857, + 0x4a026c00, 0x00000606, 0x4a026802, 0x00ffffff, + 0x4a026a04, 0x00000200, 0x4a026c04, 0x00000002, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, + 0x04020003, 0x42018800, 0x00000000, 0x1c01f000, + 0x5930000a, 0x50000000, 0x4933c857, 0x4803c857, + 0x8c00050e, 0x1c01f000, 0x5930000a, 0x50000000, + 0x8c00050a, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, + 0x1c01f000, 0x4933c856, 0x0401f8be, 0x04000006, + 0x59340400, 0x82000d00, 0x000000ff, 0x82041580, + 0x00000005, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000001, 0x04020003, 0x42018800, 0x00000000, + 0x1c01f000, 0x4d340000, 0x83ac0400, 0x000007fe, + 0x50000000, 0x80026d40, 0x04000003, 0x59340200, + 0x8c00051a, 0x5c026800, 0x1c01f000, 0x4937c857, + 0x493fc857, 0x59340403, 0x81ac0400, 0x50000000, + 0x81340580, 0x02020800, 0x0010032d, 0x59341200, + 0x813e79c0, 0x04000003, 0x8408155e, 0x0401f002, + 0x8408151e, 0x480a6a00, 0x1c01f000, 0x4937c857, + 0x0201f800, 0x00101b0a, 0x04000006, 0x59a80828, + 0x42001000, 0x00104109, 0x0201f800, 0x001059a9, + 0x1c01f000, 0x4937c857, 0x42001000, 0x00104109, + 0x0201f800, 0x00105872, 0x59a8121b, 0x84081512, + 0x480b521b, 0x1c01f000, 0x4008d000, 0x4020d800, + 0x829d3c80, 0x00000004, 0x409ce000, 0x0201f800, + 0x0010ecc2, 0x589c0000, 0x589c2001, 0x589c2802, + 0x589c3003, 0x829d3c00, 0x00000004, 0x800001c0, + 0x1c01f000, 0x4d340000, 0x406a6800, 0x0401f803, + 0x5c026800, 0x1c01f000, 0x5934000f, 0x5934140b, + 0x80081040, 0x04001002, 0x480a6c0b, 0x80000540, + 0x02020800, 0x00020327, 0x1c01f000, 0x4803c857, + 0x4947c857, 0x4c300000, 0x82006500, 0x00000030, + 0x04000006, 0x4c000000, 0x0201f800, 0x00108da8, + 0x5c000000, 0x0402000b, 0x8c00050e, 0x04000006, + 0x0201f800, 0x00020319, 0x04020006, 0x4937c857, + 0x0401fd02, 0x80000580, 0x5c006000, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fc, 0x4803c857, + 0x4c580000, 0x4d440000, 0x40001000, 0x80000d80, + 0x4200b000, 0x000007f0, 0x4c040000, 0x40068800, + 0x4c080000, 0x40080000, 0x0401ffdf, 0x5c001000, + 0x5c000800, 0x80040800, 0x8058b040, 0x040207f7, + 0x8c081514, 0x04000007, 0x84081514, 0x4200b000, + 0x00000001, 0x42000800, 0x000007fc, 0x0401f7ef, + 0x4d300000, 0x4d400000, 0x0401fb63, 0x42028800, + 0x0000ffff, 0x42026000, 0x0010f64c, 0x4a02600a, + 0x0010c2b2, 0x42028000, 0x00000029, 0x0201f800, + 0x001061b2, 0x4df00000, 0x0201f800, 0x0010e5d8, + 0x0201f800, 0x0010eb5d, 0x5c03e000, 0x02000800, + 0x0010619f, 0x5c028000, 0x5c026000, 0x5c028800, 0x5c00b000, 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, 0x4c5c0000, 0x59340400, 0x8200bd80, @@ -4240,1221 +4242,1241 @@ static const uint32_t isp_2400_risc_code[] = { 0x5c00b800, 0x1c01f000, 0x4c040000, 0x4c080000, 0x592c0208, 0x8c00050c, 0x0400000f, 0x592e8c07, 0x82000500, 0x00000080, 0x84000548, 0x4d3c0000, - 0x42027800, 0x00001000, 0x0401ff5b, 0x5c027800, + 0x42027800, 0x00001000, 0x0401ff59, 0x5c027800, 0x82000540, 0x00000001, 0x5c001000, 0x5c000800, 0x1c01f000, 0x80000580, 0x0401f7fc, 0x592c040c, 0x82000500, 0x0000e000, 0x82000580, 0x00006000, 0x04000020, 0x836c0580, 0x00000003, 0x04000016, - 0x836c0580, 0x00000002, 0x04020113, 0x59a8021b, + 0x836c0580, 0x00000002, 0x04020116, 0x59a8021b, 0x82000d00, 0x00000038, 0x04020005, 0x59a80813, - 0x800409c0, 0x0400000c, 0x0401f10b, 0x82000d00, - 0x00000003, 0x82040d80, 0x00000003, 0x04020106, + 0x800409c0, 0x0400000c, 0x0401f10e, 0x82000d00, + 0x00000003, 0x82040d80, 0x00000003, 0x04020109, 0x82000d00, 0x00000028, 0x04020003, 0x8c00050c, - 0x04000101, 0x592c100b, 0x82080500, 0xff000000, - 0x040200df, 0x59a8000f, 0x80080580, 0x040000d9, + 0x04000104, 0x592c100b, 0x82080500, 0xff000000, + 0x040200e2, 0x59a8000f, 0x80080580, 0x040000dc, 0x592c0c0c, 0x82040d00, 0x0000e000, 0x82040480, - 0x00008000, 0x040210d9, 0x592e8c07, 0x83440480, - 0x00000800, 0x04001014, 0x83440580, 0x0000ffff, - 0x040200c0, 0x800409c0, 0x0402010b, 0x592c240a, - 0x82100500, 0xffffff00, 0x040200c3, 0x480bc857, + 0x00008000, 0x040210dc, 0x592e8c07, 0x83440480, + 0x00000800, 0x04001016, 0x83440580, 0x0000ffff, + 0x040200c3, 0x800409c0, 0x0402010e, 0x592c240a, + 0x82100500, 0xffffff00, 0x040200c6, 0x480bc857, 0x4813c857, 0x592c000e, 0x82000480, 0x00000841, - 0x040210c9, 0x42027000, 0x00000053, 0x417a6800, - 0x0401f099, 0x800409c0, 0x040200fb, 0x41784000, - 0x0401fef0, 0x040200e2, 0x59342204, 0x592c000e, - 0x80100480, 0x040010bc, 0x42027000, 0x00000053, - 0x592c240a, 0x82100500, 0xffffff00, 0x040200aa, - 0x4813c857, 0x592c000d, 0x800001c0, 0x04000083, - 0x82100580, 0x00000004, 0x040000a0, 0x82100580, - 0x00000051, 0x0400009d, 0x82100580, 0x00000003, - 0x04000016, 0x82100580, 0x00000020, 0x0400004b, - 0x82100580, 0x00000024, 0x04000042, 0x82100580, - 0x00000021, 0x04000042, 0x82100580, 0x00000050, - 0x04000037, 0x82100580, 0x00000052, 0x04000031, - 0x82100580, 0x00000005, 0x0402006b, 0x42027000, - 0x00000001, 0x0401f01b, 0x42027000, 0x00000002, - 0x59a8006d, 0x8c000502, 0x04000016, 0x0401ff2a, - 0x04000014, 0x59340212, 0x82000500, 0x0000ff00, - 0x42001000, 0x00000010, 0x0402000c, 0x59a8021b, - 0x8c000506, 0x0402006f, 0x42001000, 0x00000008, - 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, - 0x00ff0000, 0x04000003, 0x0401f9db, 0x04020065, - 0x0201f800, 0x001070f5, 0x04000081, 0x4a026407, - 0x00000010, 0x4936600a, 0x42000800, 0x00000003, - 0x83380580, 0x00000002, 0x04000003, 0x42000800, - 0x0000000b, 0x0201f800, 0x00103d8a, 0x0401f044, - 0x42027000, 0x00000000, 0x0401f003, 0x42027000, - 0x00000004, 0x0401ff1c, 0x04020074, 0x0401f036, - 0x42027000, 0x00000033, 0x0401f006, 0x42027000, - 0x00000005, 0x0401f003, 0x42027000, 0x00000003, - 0x0401ff08, 0x04020069, 0x59a8006d, 0x8c000502, - 0x04000016, 0x0401fef0, 0x04000014, 0x59340212, + 0x040210cc, 0x42027000, 0x00000053, 0x0401faa6, + 0x42026800, 0x0010c2b2, 0x0401f099, 0x800409c0, + 0x040200fc, 0x41784000, 0x0401feec, 0x040200e3, + 0x59342204, 0x592c000e, 0x80100480, 0x040010bd, + 0x42027000, 0x00000053, 0x592c240a, 0x82100500, + 0xffffff00, 0x040200ab, 0x4813c857, 0x592c000d, + 0x800001c0, 0x04000083, 0x82100580, 0x00000004, + 0x040000a1, 0x82100580, 0x00000051, 0x0400009e, + 0x82100580, 0x00000003, 0x04000016, 0x82100580, + 0x00000020, 0x0400004b, 0x82100580, 0x00000024, + 0x04000042, 0x82100580, 0x00000021, 0x04000042, + 0x82100580, 0x00000050, 0x04000037, 0x82100580, + 0x00000052, 0x04000031, 0x82100580, 0x00000005, + 0x0402006b, 0x42027000, 0x00000001, 0x0401f01b, + 0x42027000, 0x00000002, 0x59a8006d, 0x8c000502, + 0x04000016, 0x0401ff28, 0x04000014, 0x59340212, 0x82000500, 0x0000ff00, 0x42001000, 0x00000010, - 0x0402000c, 0x59a8021b, 0x8c000506, 0x04020035, + 0x0402000c, 0x59a8021b, 0x8c000506, 0x04020070, 0x42001000, 0x00000008, 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000003, - 0x0401f9a1, 0x0402002b, 0x0201f800, 0x001070f5, - 0x04000047, 0x4a026407, 0x00000010, 0x4936600a, - 0x42000800, 0x00000005, 0x83380580, 0x00000003, - 0x04000003, 0x42000800, 0x00000009, 0x0201f800, - 0x00103d8a, 0x0401f00a, 0x82102580, 0x00000011, - 0x04020030, 0x0201f800, 0x001070f5, 0x04000034, - 0x4a026407, 0x00000010, 0x4936600a, 0x492e6009, - 0x49325809, 0x813669c0, 0x04000007, 0x592c0c0c, - 0x8c040d18, 0x04000004, 0x59340200, 0x84000514, - 0x48026a00, 0x0201f800, 0x00020a34, 0x80000580, - 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fd, - 0x42001000, 0x0000000a, 0x0401f018, 0x42001000, - 0x00000010, 0x0401f015, 0x42001000, 0x00000016, - 0x0401f012, 0x42001000, 0x00000017, 0x0401f00f, - 0x42001000, 0x00000018, 0x0401f00c, 0x42001000, - 0x0000001b, 0x0401f009, 0x42001000, 0x0000001e, - 0x0401f006, 0x42001000, 0x00000024, 0x0401f003, - 0x42001000, 0x00000020, 0x42000800, 0x00000019, - 0x42028000, 0x00000031, 0x0401f7df, 0x42000800, - 0x00000003, 0x0401f003, 0x42000800, 0x0000000a, - 0x41781000, 0x0401f7f7, 0x42000800, 0x00000009, - 0x59341400, 0x0401f7f3, 0x42028000, 0x00000008, - 0x0401f005, 0x42000800, 0x00000007, 0x416c1000, - 0x0401f7ec, 0x41780800, 0x41781000, 0x0401f7ca, - 0x42028000, 0x00000000, 0x0401f7fb, 0x82004d80, - 0x0000001d, 0x02000800, 0x0010032d, 0x82004d80, - 0x0000001a, 0x04020004, 0x40101000, 0x40000800, - 0x0401f7dc, 0x82004d80, 0x0000001b, 0x04020003, - 0x40181000, 0x0401f7fa, 0x82004d80, 0x0000001c, - 0x040007f7, 0x82004d80, 0x00000019, 0x040007b5, - 0x0401f7d6, 0x592e6009, 0x0201f800, 0x00108ce2, - 0x040007b3, 0x59300c07, 0x82040580, 0x00000011, - 0x040207d6, 0x592c0c0c, 0x82041500, 0x0000e000, - 0x82080580, 0x00006000, 0x04000024, 0x83440580, - 0x0000ffff, 0x04020005, 0x5932680a, 0x813669c0, - 0x0400000e, 0x0401f7c9, 0x592c100b, 0x82081500, - 0x00ffffff, 0x41784000, 0x0401fdde, 0x040207d0, - 0x5930000a, 0x800001c0, 0x04000003, 0x81340580, - 0x040207be, 0x4936600a, 0x42000800, 0x00000840, - 0x813669c0, 0x04000002, 0x59340a04, 0x592c000e, - 0x80040480, 0x040017a0, 0x59300a03, 0x82040580, - 0x00000007, 0x040207b1, 0x492e6009, 0x42027000, - 0x00000054, 0x0401f774, 0x0201f800, 0x0010a43f, - 0x040007b4, 0x0401f7a9, 0x492fc857, 0x592e6009, - 0x83300580, 0xffffffff, 0x04020045, 0x592c0208, - 0x8c000500, 0x04020081, 0x8d0e1d0e, 0x04020067, - 0x592e8c07, 0x83440480, 0x00000800, 0x04021039, - 0x41784000, 0x592c100a, 0x82081500, 0x00ffffff, - 0x0401fdb0, 0x04020060, 0x592e6014, 0x4933c857, - 0x83300580, 0xffffffff, 0x0400001b, 0x0201f800, - 0x00108ce2, 0x0400003a, 0x591c1407, 0x800811c0, - 0x04000015, 0x592c040e, 0x591c0a02, 0x80040580, - 0x04020011, 0x591c000a, 0x800001c0, 0x04020007, - 0x591c081f, 0x59340002, 0x80040580, 0x82000500, - 0x00ffffff, 0x0401f002, 0x81340580, 0x04020006, - 0x82080580, 0x00000007, 0x0402003d, 0x4a023c03, - 0x00000024, 0x59a8000f, 0x592c100b, 0x82081500, - 0x00ffffff, 0x80081580, 0x0402001a, 0x592c080a, - 0x82041500, 0x00ffffff, 0x80081580, 0x0400000f, - 0x80040932, 0x82040580, 0x00000042, 0x0402000e, - 0x49365803, 0x0401f910, 0x80000580, 0x1c01f000, - 0x42001000, 0x0000000a, 0x0401f00f, 0x42001000, - 0x00000010, 0x0401f00c, 0x42001000, 0x00000014, - 0x0401f009, 0x42001000, 0x00000017, 0x0401f006, - 0x42001000, 0x00000018, 0x0401f003, 0x42001000, - 0x0000003c, 0x492fc857, 0x480bc857, 0x42000800, - 0x00000019, 0x42028000, 0x00000031, 0x82000540, - 0x00000001, 0x0401f7e6, 0x492fc857, 0x4803c857, - 0x480bc857, 0x40000800, 0x0401f7f7, 0x492fc857, - 0x42000800, 0x0000000a, 0x41781000, 0x0401f7f2, - 0x41780800, 0x41781000, 0x0401f7f1, 0x42000800, - 0x0000001e, 0x0401f7f9, 0x42000800, 0x00000001, - 0x0401f7f6, 0x82004d80, 0x0000001d, 0x02000800, - 0x0010032d, 0x82004d80, 0x0000001a, 0x04020003, - 0x40101000, 0x0401f7e5, 0x82004d80, 0x0000001b, - 0x04020003, 0x40181000, 0x0401f7e0, 0x82004d80, - 0x0000001c, 0x040007dd, 0x82004d80, 0x00000019, - 0x040007da, 0x0401f7de, 0x0201f800, 0x0010a52b, - 0x42028000, 0x00000000, 0x0401f7de, 0x5c000000, - 0x4c000000, 0x4803c857, 0x5930200a, 0x801021c0, - 0x04000035, 0x58101400, 0x4813c857, 0x480bc857, - 0x82081d00, 0x000000ff, 0x59300c03, 0x82040580, - 0x00000008, 0x04000022, 0x82040580, 0x0000000a, - 0x04000017, 0x82040580, 0x0000000c, 0x04000010, - 0x82040580, 0x00000002, 0x04000019, 0x82040580, - 0x00000001, 0x04000012, 0x82040580, 0x00000003, - 0x0400000b, 0x82040580, 0x00000005, 0x04000004, - 0x82040580, 0x00000033, 0x04020017, 0x820c0580, - 0x00000009, 0x0400000d, 0x0401f013, 0x820c0580, - 0x00000005, 0x04000009, 0x0401f00f, 0x820c0580, - 0x0000000b, 0x04000005, 0x0401f00b, 0x820c0580, - 0x00000003, 0x04020008, 0x82081d00, 0xffffff00, - 0x840c01c0, 0x800c0540, 0x4807c857, 0x4803c857, - 0x48002400, 0x1c01f000, 0x0401f807, 0x42018800, - 0x00000001, 0x04020003, 0x42018800, 0x00000000, - 0x1c01f000, 0x599c0017, 0x8c00050a, 0x04000003, - 0x80000580, 0x1c01f000, 0x59a8021b, 0x82000500, - 0x00000028, 0x04000008, 0x42028800, 0x000007fd, - 0x0201f800, 0x00020319, 0x04020003, 0x5934000a, - 0x8c000504, 0x1c01f000, 0x4d300000, 0x5934000e, - 0x80026540, 0x04000006, 0x0201f800, 0x00105b70, - 0x02000800, 0x00105d48, 0x497a680e, 0x5c026000, - 0x1c01f000, 0x40681000, 0x0401f807, 0x42018800, - 0x00000001, 0x04020003, 0x42018800, 0x00000000, - 0x1c01f000, 0x4d440000, 0x4d340000, 0x80000580, - 0x40001800, 0x40028800, 0x82080580, 0x00000008, - 0x04020003, 0x42001800, 0x00000001, 0x0201f800, - 0x00020319, 0x0402000a, 0x0401fd2f, 0x04020008, - 0x800c19c0, 0x04000004, 0x59340405, 0x8c000508, - 0x04000003, 0x80081040, 0x04000009, 0x81468800, - 0x83440480, 0x00000800, 0x040017f1, 0x80000580, - 0x5c026800, 0x5c028800, 0x1c01f000, 0x82000540, - 0x00000001, 0x5c026800, 0x5c028800, 0x1c01f000, - 0x42000800, 0x00000008, 0x59bc00e4, 0x8c000524, - 0x0402002e, 0x59a8021b, 0x8c000508, 0x0402002b, - 0x5934100a, 0x82081500, 0x0000e000, 0x41781800, - 0x82080580, 0x00000000, 0x04000006, 0x800c1800, - 0x82080580, 0x00002000, 0x04000002, 0x800c1800, - 0x42007000, 0x0010b895, 0x58380401, 0x8c000504, - 0x04000007, 0x820c2c80, 0x00000003, 0x04021017, - 0x820c0400, 0x00104480, 0x0401f013, 0x41782000, - 0x59342a04, 0x82140480, 0x00000800, 0x04021006, - 0x80102000, 0x82140480, 0x00000400, 0x04021002, - 0x80102000, 0x800c00c2, 0x800c0400, 0x80100400, - 0x82002c80, 0x00000006, 0x04021004, 0x82000400, - 0x00104483, 0x50000800, 0x48066c04, 0x1c01f000, - 0x00000002, 0x00000004, 0x00000008, 0x00002802, - 0x00001402, 0x00000a02, 0x00001402, 0x00000a02, - 0x00000502, 0x59a80853, 0x800409c0, 0x04020005, - 0x492f5052, 0x492f5053, 0x0201f000, 0x0010702d, - 0x492c0800, 0x492f5053, 0x1c01f000, 0x5934000f, - 0x41784000, 0x80001540, 0x0400000d, 0x58080205, - 0x82000500, 0x000000ff, 0x82000580, 0x00000012, - 0x04020004, 0x5808020d, 0x80040580, 0x04000006, - 0x58080000, 0x40084000, 0x0401f7f3, 0x82000540, - 0x00000001, 0x1c01f000, 0x4a033011, 0x00000000, - 0x4a03b104, 0x80000000, 0x4a03b104, 0x60000001, - 0x497b3016, 0x497b3017, 0x1c01f000, 0x599c0018, - 0x4803c856, 0x497b3014, 0x497b3015, 0x82000500, - 0x0000000f, 0x48033012, 0x04000009, 0x599c0216, - 0x82000500, 0x0000ffff, 0x04020003, 0x42000000, - 0x00000002, 0x48033013, 0x850e1d62, 0x1c01f000, - 0x0401ffef, 0x4a03c826, 0x00000004, 0x599c0209, - 0x80000540, 0x0400001e, 0x599c0207, 0x80000540, - 0x04000007, 0x800000cc, 0x599c080d, 0x80040400, - 0x4803b100, 0x497bb102, 0x59d80101, 0x599c000d, - 0x4803b100, 0x599c000e, 0x4803b101, 0x599c0207, - 0x80000540, 0x04020002, 0x497bb102, 0x599c0a09, - 0x82040540, 0x00400000, 0x4803b103, 0x4a03b109, - 0x00000005, 0x4a03b104, 0x10000001, 0x8d0e1d22, - 0x04020004, 0x4a033011, 0x00000001, 0x1c01f000, - 0x8d0e1d20, 0x04020004, 0x4a033011, 0x00000002, - 0x0401f7fb, 0x4a033011, 0x00000003, 0x0401f7f8, - 0x592c0205, 0x492fc857, 0x80000540, 0x04000008, - 0x42034000, 0x0010b7fa, 0x59a1d806, 0x80edd9c0, - 0x02000800, 0x0010032d, 0x0401f007, 0x0201f800, - 0x001091d9, 0x02020800, 0x0010032d, 0x5931d822, - 0x58ef400a, 0x58ec0008, 0x800001c0, 0x02000800, - 0x0010032d, 0x0801f800, 0x1c01f000, 0x40680800, - 0x5c000000, 0x4c000000, 0x4803c857, 0x492fc857, - 0x4943c857, 0x4807c857, 0x4a025a05, 0x00000103, - 0x49425a07, 0x48065a09, 0x4a025c07, 0x0000ffff, - 0x813261c0, 0x04000003, 0x59300402, 0x48025c07, - 0x832c0400, 0x0000000a, 0x04011000, 0x4803c840, - 0x4a03c842, 0x0000000b, 0x04011000, 0x1c01f000, - 0x59a80011, 0x82000c80, 0x0000000a, 0x02021800, - 0x0010032d, 0x0c01f809, 0x4a038805, 0x000000f0, - 0x59c400a3, 0x82000500, 0x02870000, 0x02020800, - 0x0010032d, 0x1c01f000, 0x001045c3, 0x00104535, - 0x00104554, 0x00104588, 0x001045b3, 0x0010032d, - 0x0010032d, 0x00104554, 0x0010032d, 0x00104534, - 0x1c01f000, 0x42002000, 0x00000003, 0x0201f800, - 0x00104a0a, 0x4a038808, 0x00000004, 0x0201f800, - 0x001049f1, 0x59c40805, 0x8c040d0e, 0x04020014, - 0x8c040d0a, 0x0402000b, 0x8c040d0c, 0x04020006, - 0x8c040d08, 0x0400000e, 0x4a035011, 0x00000003, - 0x0401f00a, 0x4a035011, 0x00000000, 0x0401f007, - 0x42000000, 0x0010bb72, 0x0201f800, 0x0010ad1d, - 0x4a035011, 0x00000002, 0x0401f8c4, 0x1c01f000, - 0x59a80073, 0x8c00053e, 0x04020018, 0x42002000, - 0x00000000, 0x0201f800, 0x00104a0a, 0x4a038808, - 0x00000002, 0x59c40805, 0x8c040d08, 0x04020025, - 0x8c040d0c, 0x04020020, 0x8c040d0e, 0x0402001b, - 0x82040500, 0x000000f0, 0x04020021, 0x0201f800, - 0x001049f1, 0x4a038808, 0x00000080, 0x59c40002, - 0x8400050c, 0x48038802, 0x0401f9db, 0x4d3c0000, - 0x42027800, 0x00000001, 0x0201f800, 0x00109146, - 0x5c027800, 0x4a038808, 0x00000080, 0x42002000, - 0x00000002, 0x0201f800, 0x00104a0a, 0x4a035011, - 0x00000009, 0x0401f00a, 0x4a035011, 0x00000001, - 0x0401f006, 0x4a035011, 0x00000000, 0x0401f003, - 0x4a035011, 0x00000003, 0x0401f890, 0x1c01f000, - 0x42002000, 0x00000001, 0x0201f800, 0x00104a0a, - 0x4a038808, 0x00000080, 0x59c40805, 0x8c040d0a, - 0x0402001f, 0x8c040d0c, 0x0402001a, 0x8c040d0e, - 0x04020015, 0x82040500, 0x000000f0, 0x0402001b, - 0x59c40002, 0x8400050c, 0x48038802, 0x0401f9ae, - 0x4d3c0000, 0x42027800, 0x00000001, 0x0201f800, - 0x00109146, 0x5c027800, 0x42002000, 0x00000002, - 0x0201f800, 0x00104a0a, 0x4a035011, 0x00000009, + 0x0401f9dc, 0x04020066, 0x0201f800, 0x00107188, + 0x04000082, 0x4a026407, 0x00000010, 0x4936600a, + 0x42000800, 0x00000003, 0x83380580, 0x00000002, + 0x04000003, 0x42000800, 0x0000000b, 0x0201f800, + 0x00103d9d, 0x0401f044, 0x42027000, 0x00000000, + 0x0401f003, 0x42027000, 0x00000004, 0x0401ff1a, + 0x04020075, 0x0401f036, 0x42027000, 0x00000033, + 0x0401f006, 0x42027000, 0x00000005, 0x0401f003, + 0x42027000, 0x00000003, 0x0401ff06, 0x0402006a, + 0x59a8006d, 0x8c000502, 0x04000016, 0x0401feee, + 0x04000014, 0x59340212, 0x82000500, 0x0000ff00, + 0x42001000, 0x00000010, 0x0402000c, 0x59a8021b, + 0x8c000506, 0x04020036, 0x42001000, 0x00000008, + 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, + 0x00ff0000, 0x04000003, 0x0401f9a2, 0x0402002c, + 0x0201f800, 0x00107188, 0x04000048, 0x4a026407, + 0x00000010, 0x4936600a, 0x42000800, 0x00000005, + 0x83380580, 0x00000003, 0x04000003, 0x42000800, + 0x00000009, 0x0201f800, 0x00103d9d, 0x0401f00a, + 0x82102580, 0x00000011, 0x04020031, 0x0201f800, + 0x00107188, 0x04000035, 0x4a026407, 0x00000010, + 0x4936600a, 0x492e6009, 0x49325809, 0x83340580, + 0x0010c2b2, 0x04000007, 0x592c0c0c, 0x8c040d18, + 0x04000004, 0x59340200, 0x84000514, 0x48026a00, + 0x0201f800, 0x00020a34, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fd, 0x42001000, + 0x0000000a, 0x0401f018, 0x42001000, 0x00000010, + 0x0401f015, 0x42001000, 0x00000016, 0x0401f012, + 0x42001000, 0x00000017, 0x0401f00f, 0x42001000, + 0x00000018, 0x0401f00c, 0x42001000, 0x0000001b, + 0x0401f009, 0x42001000, 0x0000001e, 0x0401f006, + 0x42001000, 0x00000024, 0x0401f003, 0x42001000, + 0x00000020, 0x42000800, 0x00000019, 0x42028000, + 0x00000031, 0x0401f7df, 0x42000800, 0x00000003, + 0x0401f003, 0x42000800, 0x0000000a, 0x41781000, + 0x0401f7f7, 0x42000800, 0x00000009, 0x59341400, + 0x0401f7f3, 0x42028000, 0x00000008, 0x0401f005, + 0x42000800, 0x00000007, 0x416c1000, 0x0401f7ec, + 0x41780800, 0x41781000, 0x0401f7ca, 0x42028000, + 0x00000000, 0x0401f7fb, 0x82004d80, 0x0000001d, + 0x02000800, 0x0010032d, 0x82004d80, 0x0000001a, + 0x04020004, 0x40101000, 0x40000800, 0x0401f7dc, + 0x82004d80, 0x0000001b, 0x04020003, 0x40181000, + 0x0401f7fa, 0x82004d80, 0x0000001c, 0x040007f7, + 0x82004d80, 0x00000019, 0x040007b5, 0x0401f7d6, + 0x592e6009, 0x0201f800, 0x00108d9b, 0x040007b3, + 0x59300c07, 0x82040580, 0x00000011, 0x040207d6, + 0x592c0c0c, 0x82041500, 0x0000e000, 0x82080580, + 0x00006000, 0x04000024, 0x83440580, 0x0000ffff, + 0x04020008, 0x5932680a, 0x83340580, 0x0010c2b2, + 0x040207c9, 0x42000800, 0x00000840, 0x0401f00f, + 0x592c100b, 0x82081500, 0x00ffffff, 0x41784000, + 0x0401fdd6, 0x040207cd, 0x5930000a, 0x82000d80, + 0x0010c2b2, 0x04000003, 0x81340580, 0x040207ba, + 0x4936600a, 0x59340a04, 0x592c000e, 0x80040480, + 0x040017a0, 0x59300a03, 0x82040580, 0x00000007, + 0x040207b1, 0x492e6009, 0x42027000, 0x00000054, + 0x0401f773, 0x0201f800, 0x0010a532, 0x040007b4, + 0x0401f7a9, 0x492fc857, 0x592e6009, 0x83300580, + 0xffffffff, 0x04020045, 0x592c0208, 0x8c000500, + 0x04020081, 0x8d0e1d0e, 0x04020067, 0x592e8c07, + 0x83440480, 0x00000800, 0x04021039, 0x41784000, + 0x592c100a, 0x82081500, 0x00ffffff, 0x0401fdab, + 0x04020060, 0x592e6014, 0x4933c857, 0x83300580, + 0xffffffff, 0x0400001b, 0x0201f800, 0x00108d9b, + 0x0400003a, 0x591c1407, 0x800811c0, 0x04000015, + 0x592c040e, 0x591c0a02, 0x80040580, 0x04020011, + 0x591c000a, 0x800001c0, 0x04020007, 0x591c081f, + 0x59340002, 0x80040580, 0x82000500, 0x00ffffff, + 0x0401f002, 0x81340580, 0x04020006, 0x82080580, + 0x00000007, 0x0402003d, 0x4a023c03, 0x00000024, + 0x59a8000f, 0x592c100b, 0x82081500, 0x00ffffff, + 0x80081580, 0x0402001a, 0x592c080a, 0x82041500, + 0x00ffffff, 0x80081580, 0x0400000f, 0x80040932, + 0x82040580, 0x00000042, 0x0402000e, 0x49365803, + 0x0401f910, 0x80000580, 0x1c01f000, 0x42001000, + 0x0000000a, 0x0401f00f, 0x42001000, 0x00000010, + 0x0401f00c, 0x42001000, 0x00000014, 0x0401f009, + 0x42001000, 0x00000017, 0x0401f006, 0x42001000, + 0x00000018, 0x0401f003, 0x42001000, 0x0000003c, + 0x492fc857, 0x480bc857, 0x42000800, 0x00000019, + 0x42028000, 0x00000031, 0x82000540, 0x00000001, + 0x0401f7e6, 0x492fc857, 0x4803c857, 0x480bc857, + 0x40000800, 0x0401f7f7, 0x492fc857, 0x42000800, + 0x0000000a, 0x41781000, 0x0401f7f2, 0x41780800, + 0x41781000, 0x0401f7f1, 0x42000800, 0x0000001e, + 0x0401f7f9, 0x42000800, 0x00000001, 0x0401f7f6, + 0x82004d80, 0x0000001d, 0x02000800, 0x0010032d, + 0x82004d80, 0x0000001a, 0x04020003, 0x40101000, + 0x0401f7e5, 0x82004d80, 0x0000001b, 0x04020003, + 0x40181000, 0x0401f7e0, 0x82004d80, 0x0000001c, + 0x040007dd, 0x82004d80, 0x00000019, 0x040007da, + 0x0401f7de, 0x0201f800, 0x0010a61e, 0x42028000, + 0x00000000, 0x0401f7de, 0x5c000000, 0x4c000000, + 0x4803c857, 0x5930200a, 0x801021c0, 0x04000035, + 0x58101400, 0x4813c857, 0x480bc857, 0x82081d00, + 0x000000ff, 0x59300c03, 0x82040580, 0x00000008, + 0x04000022, 0x82040580, 0x0000000a, 0x04000017, + 0x82040580, 0x0000000c, 0x04000010, 0x82040580, + 0x00000002, 0x04000019, 0x82040580, 0x00000001, + 0x04000012, 0x82040580, 0x00000003, 0x0400000b, + 0x82040580, 0x00000005, 0x04000004, 0x82040580, + 0x00000033, 0x04020017, 0x820c0580, 0x00000009, + 0x0400000d, 0x0401f013, 0x820c0580, 0x00000005, + 0x04000009, 0x0401f00f, 0x820c0580, 0x0000000b, + 0x04000005, 0x0401f00b, 0x820c0580, 0x00000003, + 0x04020008, 0x82081d00, 0xffffff00, 0x840c01c0, + 0x800c0540, 0x4807c857, 0x4803c857, 0x48002400, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, + 0x04020003, 0x42018800, 0x00000000, 0x1c01f000, + 0x599c0017, 0x8c00050a, 0x04000003, 0x80000580, + 0x1c01f000, 0x59a8021b, 0x82000500, 0x00000028, + 0x04000008, 0x42028800, 0x000007fd, 0x0201f800, + 0x00020319, 0x04020003, 0x5934000a, 0x8c000504, + 0x1c01f000, 0x4d300000, 0x5934000e, 0x80026540, + 0x04000006, 0x0201f800, 0x00105c15, 0x02000800, + 0x00105ded, 0x497a680e, 0x5c026000, 0x1c01f000, + 0x40681000, 0x0401f807, 0x42018800, 0x00000001, + 0x04020003, 0x42018800, 0x00000000, 0x1c01f000, + 0x4d440000, 0x4d340000, 0x80000580, 0x40001800, + 0x40028800, 0x82080580, 0x00000008, 0x04020003, + 0x42001800, 0x00000001, 0x0201f800, 0x00020319, + 0x0402000a, 0x0401fd2c, 0x04020008, 0x800c19c0, + 0x04000004, 0x59340405, 0x8c000508, 0x04000003, + 0x80081040, 0x04000009, 0x81468800, 0x83440480, + 0x00000800, 0x040017f1, 0x80000580, 0x5c026800, + 0x5c028800, 0x1c01f000, 0x82000540, 0x00000001, + 0x5c026800, 0x5c028800, 0x1c01f000, 0x42000800, + 0x00000008, 0x59bc00e4, 0x8c000524, 0x0402002e, + 0x59a8021b, 0x8c000508, 0x0402002b, 0x5934100a, + 0x82081500, 0x0000e000, 0x41781800, 0x82080580, + 0x00000000, 0x04000006, 0x800c1800, 0x82080580, + 0x00002000, 0x04000002, 0x800c1800, 0x42007000, + 0x0010b995, 0x58380401, 0x8c000504, 0x04000007, + 0x820c2c80, 0x00000003, 0x04021017, 0x820c0400, + 0x0010449f, 0x0401f013, 0x41782000, 0x59342a04, + 0x82140480, 0x00000800, 0x04021006, 0x80102000, + 0x82140480, 0x00000400, 0x04021002, 0x80102000, + 0x800c00c2, 0x800c0400, 0x80100400, 0x82002c80, + 0x00000006, 0x04021004, 0x82000400, 0x001044a2, + 0x50000800, 0x48066c04, 0x1c01f000, 0x00000002, + 0x00000004, 0x00000008, 0x00002802, 0x00001402, + 0x00000a02, 0x00001402, 0x00000a02, 0x00000502, + 0x59a80853, 0x800409c0, 0x04020005, 0x492f5052, + 0x492f5053, 0x0201f000, 0x001070bc, 0x492c0800, + 0x492f5053, 0x1c01f000, 0x5934000f, 0x41784000, + 0x80001540, 0x0400000d, 0x58080205, 0x82000500, + 0x000000ff, 0x82000580, 0x00000012, 0x04020004, + 0x5808020d, 0x80040580, 0x04000006, 0x58080000, + 0x40084000, 0x0401f7f3, 0x82000540, 0x00000001, + 0x1c01f000, 0x42000000, 0x0010c2b2, 0x4a000400, + 0x00000707, 0x4a000204, 0x00000840, 0x4a000403, + 0x0000ffff, 0x49780200, 0x1c01f000, 0x4d340000, + 0x4d440000, 0x4c580000, 0x4200b000, 0x000007f0, + 0x4803c856, 0x417a8800, 0x0201f800, 0x00020319, + 0x04020006, 0x59340200, 0x8c00051a, 0x04000003, + 0x8400051a, 0x48026a00, 0x81468800, 0x8058b040, + 0x040207f6, 0x5c00b000, 0x5c028800, 0x5c026800, + 0x1c01f000, 0x4a033011, 0x00000000, 0x4a03b104, + 0x80000000, 0x4a03b104, 0x60000001, 0x497b3016, + 0x497b3017, 0x1c01f000, 0x599c0018, 0x4803c856, + 0x497b3014, 0x497b3015, 0x82000500, 0x0000000f, + 0x48033012, 0x04000009, 0x599c0216, 0x82000500, + 0x0000ffff, 0x04020003, 0x42000000, 0x00000002, + 0x48033013, 0x850e1d62, 0x1c01f000, 0x0401ffef, + 0x4a03c826, 0x00000004, 0x599c0209, 0x80000540, + 0x0400001e, 0x599c0207, 0x80000540, 0x04000007, + 0x800000cc, 0x599c080d, 0x80040400, 0x4803b100, + 0x497bb102, 0x59d80101, 0x599c000d, 0x4803b100, + 0x599c000e, 0x4803b101, 0x599c0207, 0x80000540, + 0x04020002, 0x497bb102, 0x599c0a09, 0x82040540, + 0x00400000, 0x4803b103, 0x4a03b109, 0x00000005, + 0x4a03b104, 0x10000001, 0x8d0e1d22, 0x04020004, + 0x4a033011, 0x00000001, 0x1c01f000, 0x8d0e1d20, + 0x04020004, 0x4a033011, 0x00000002, 0x0401f7fb, + 0x4a033011, 0x00000003, 0x0401f7f8, 0x592c0205, + 0x492fc857, 0x80000540, 0x04000008, 0x42034000, + 0x0010b8fa, 0x59a1d806, 0x80edd9c0, 0x02000800, + 0x0010032d, 0x0401f007, 0x0201f800, 0x00109291, + 0x02020800, 0x0010032d, 0x5931d822, 0x58ef400a, + 0x58ec0008, 0x800001c0, 0x02000800, 0x0010032d, + 0x0801f800, 0x1c01f000, 0x40680800, 0x5c000000, + 0x4c000000, 0x4803c857, 0x492fc857, 0x4943c857, + 0x4807c857, 0x4a025a05, 0x00000103, 0x49425a07, + 0x48065a09, 0x4a025c07, 0x0000ffff, 0x813261c0, + 0x04000003, 0x59300402, 0x48025c07, 0x832c0400, + 0x0000000a, 0x04011000, 0x4803c840, 0x4a03c842, + 0x0000000b, 0x04011000, 0x1c01f000, 0x59a80011, + 0x82000c80, 0x0000000a, 0x02021800, 0x0010032d, + 0x0c01f809, 0x4a038805, 0x000000f0, 0x59c400a3, + 0x82000500, 0x02870000, 0x02020800, 0x0010032d, + 0x1c01f000, 0x00104602, 0x00104574, 0x00104593, + 0x001045c7, 0x001045f2, 0x0010032d, 0x0010032d, + 0x00104593, 0x0010032d, 0x00104573, 0x1c01f000, + 0x42002000, 0x00000003, 0x0201f800, 0x00104a49, + 0x4a038808, 0x00000004, 0x0201f800, 0x00104a30, + 0x59c40805, 0x8c040d0e, 0x04020014, 0x8c040d0a, + 0x0402000b, 0x8c040d0c, 0x04020006, 0x8c040d08, + 0x0400000e, 0x4a035011, 0x00000003, 0x0401f00a, + 0x4a035011, 0x00000000, 0x0401f007, 0x42000000, + 0x0010bc72, 0x0201f800, 0x0010ae10, 0x4a035011, + 0x00000002, 0x0401f8c4, 0x1c01f000, 0x59a80073, + 0x8c00053e, 0x04020018, 0x42002000, 0x00000000, + 0x0201f800, 0x00104a49, 0x4a038808, 0x00000002, + 0x59c40805, 0x8c040d08, 0x04020025, 0x8c040d0c, + 0x04020020, 0x8c040d0e, 0x0402001b, 0x82040500, + 0x000000f0, 0x04020021, 0x0201f800, 0x00104a30, + 0x4a038808, 0x00000080, 0x59c40002, 0x8400050c, + 0x48038802, 0x0401f9db, 0x4d3c0000, 0x42027800, + 0x00000001, 0x0201f800, 0x001091ff, 0x5c027800, + 0x4a038808, 0x00000080, 0x42002000, 0x00000002, + 0x0201f800, 0x00104a49, 0x4a035011, 0x00000009, 0x0401f00a, 0x4a035011, 0x00000001, 0x0401f006, 0x4a035011, 0x00000000, 0x0401f003, 0x4a035011, - 0x00000002, 0x0401f865, 0x1c01f000, 0x0201f800, - 0x00104b3e, 0x4a038808, 0x00000008, 0x59c40805, - 0x8c040d0c, 0x04020006, 0x8c040d0e, 0x04000007, - 0x4a035011, 0x00000001, 0x0401f003, 0x4a035011, - 0x00000000, 0x0401f855, 0x1c01f000, 0x42002000, - 0x00000004, 0x0201f800, 0x00104a0a, 0x0401f89e, - 0x59c40805, 0x8c040d0c, 0x0402000b, 0x8c040d0a, + 0x00000003, 0x0401f890, 0x1c01f000, 0x42002000, + 0x00000001, 0x0201f800, 0x00104a49, 0x4a038808, + 0x00000080, 0x59c40805, 0x8c040d0a, 0x0402001f, + 0x8c040d0c, 0x0402001a, 0x8c040d0e, 0x04020015, + 0x82040500, 0x000000f0, 0x0402001b, 0x59c40002, + 0x8400050c, 0x48038802, 0x0401f9ae, 0x4d3c0000, + 0x42027800, 0x00000001, 0x0201f800, 0x001091ff, + 0x5c027800, 0x42002000, 0x00000002, 0x0201f800, + 0x00104a49, 0x4a035011, 0x00000009, 0x0401f00a, + 0x4a035011, 0x00000001, 0x0401f006, 0x4a035011, + 0x00000000, 0x0401f003, 0x4a035011, 0x00000002, + 0x0401f865, 0x1c01f000, 0x0201f800, 0x00104b7d, + 0x4a038808, 0x00000008, 0x59c40805, 0x8c040d0c, 0x04020006, 0x8c040d0e, 0x04000007, 0x4a035011, - 0x00000001, 0x0401f003, 0x4a035011, 0x00000002, - 0x0401f842, 0x1c01f000, 0x0401f940, 0x02020800, - 0x0010032d, 0x59a80873, 0x8c040d3e, 0x04000004, - 0x4a035014, 0x00000001, 0x0401f037, 0x42002000, - 0x00000007, 0x0201f800, 0x00104a0a, 0x8d0e1d0c, - 0x04000014, 0x850e1d0c, 0x4a038805, 0x00000010, - 0x0201f800, 0x00101730, 0x59c40005, 0x8c000508, - 0x04000008, 0x4a038808, 0x00000008, 0x4a035014, - 0x00000001, 0x4202d800, 0x00000001, 0x0401f022, - 0x59c40006, 0x84000548, 0x48038806, 0x0401f01e, - 0x59a80011, 0x82000580, 0x00000001, 0x04020018, - 0x42000000, 0x0010bb72, 0x0201f800, 0x0010ad1d, - 0x4ce80000, 0x4201d000, 0x000003e8, 0x0201f800, - 0x0010592d, 0x59c40005, 0x82000500, 0x00000030, - 0x0400000a, 0x8c00050a, 0x04000005, 0x42002000, - 0x00000000, 0x0401fbfd, 0x0401f004, 0x42002000, - 0x00000001, 0x0401fbf9, 0x5c01d000, 0x4a035011, - 0x00000004, 0x1c01f000, 0x4c040000, 0x4c080000, - 0x42000800, 0x00000064, 0x42001000, 0x00104621, - 0x0201f800, 0x0010590f, 0x5c001000, 0x5c000800, - 0x1c01f000, 0x4803c856, 0x4c040000, 0x0201f800, - 0x0010610d, 0x4df00000, 0x0201f800, 0x00106305, - 0x5c03e000, 0x02000800, 0x001060fa, 0x42000000, - 0x0010bb71, 0x0201f800, 0x0010ad1d, 0x0401ffa7, - 0x5c000800, 0x1c01f000, 0x4803c856, 0x4c040000, - 0x4c080000, 0x0201f800, 0x0010610d, 0x4df00000, - 0x0201f800, 0x00106305, 0x5c03e000, 0x02000800, - 0x001060fa, 0x59c40006, 0x84000500, 0x48038806, - 0x0201f800, 0x001063db, 0x497b8880, 0x42000000, - 0x0010bb70, 0x0201f800, 0x0010ad1d, 0x0201f800, - 0x00101616, 0x4a035058, 0x00000004, 0x4202d800, - 0x00000004, 0x4a038805, 0x00000001, 0x42001000, - 0x00104621, 0x0201f800, 0x0010591a, 0x0201f800, - 0x00100454, 0x0401f8dd, 0x04000006, 0x42006000, - 0xfeffffff, 0x41786800, 0x0201f800, 0x00103a6a, - 0x0201f800, 0x0010ee13, 0x42000000, 0x00000080, - 0x0201f800, 0x00101364, 0x5c001000, 0x5c000800, - 0x1c01f000, 0x59c40008, 0x82000580, 0x00000010, - 0x04000007, 0x4a038808, 0x00000010, 0x4201d000, - 0x00001388, 0x0201f800, 0x0010592d, 0x1c01f000, - 0x4c040000, 0x59a80814, 0x82040580, 0x00000000, - 0x0400000b, 0x82040580, 0x00000001, 0x0400000b, - 0x82040580, 0x00000002, 0x04000013, 0x82040580, - 0x00000003, 0x04000013, 0x0401f05d, 0x4a035011, - 0x00000000, 0x0401f011, 0x59a80873, 0x8c040d3e, - 0x04000006, 0x4a035011, 0x00000003, 0x4a035014, - 0x00000004, 0x0401f052, 0x4a035011, 0x00000004, - 0x0401f006, 0x4a035011, 0x00000001, 0x0401f003, - 0x4a035011, 0x00000007, 0x497b8880, 0x4a038893, - 0x00000001, 0x41780000, 0x0201f800, 0x001013db, - 0x0201f800, 0x001063db, 0x836c0d80, 0x00000004, - 0x04000008, 0x59c40006, 0x82000500, 0xffffff0f, - 0x82000540, 0x04000001, 0x48038806, 0x0401f007, + 0x00000001, 0x0401f003, 0x4a035011, 0x00000000, + 0x0401f855, 0x1c01f000, 0x42002000, 0x00000004, + 0x0201f800, 0x00104a49, 0x0401f89e, 0x59c40805, + 0x8c040d0c, 0x0402000b, 0x8c040d0a, 0x04020006, + 0x8c040d0e, 0x04000007, 0x4a035011, 0x00000001, + 0x0401f003, 0x4a035011, 0x00000002, 0x0401f842, + 0x1c01f000, 0x0401f940, 0x02020800, 0x0010032d, + 0x59a80873, 0x8c040d3e, 0x04000004, 0x4a035014, + 0x00000001, 0x0401f037, 0x42002000, 0x00000007, + 0x0201f800, 0x00104a49, 0x8d0e1d0c, 0x04000014, + 0x850e1d0c, 0x4a038805, 0x00000010, 0x0201f800, + 0x00101731, 0x59c40005, 0x8c000508, 0x04000008, + 0x4a038808, 0x00000008, 0x4a035014, 0x00000001, + 0x4202d800, 0x00000001, 0x0401f022, 0x59c40006, + 0x84000548, 0x48038806, 0x0401f01e, 0x59a80011, + 0x82000580, 0x00000001, 0x04020018, 0x42000000, + 0x0010bc72, 0x0201f800, 0x0010ae10, 0x4ce80000, + 0x4201d000, 0x000003e8, 0x0201f800, 0x001059d2, + 0x59c40005, 0x82000500, 0x00000030, 0x0400000a, + 0x8c00050a, 0x04000005, 0x42002000, 0x00000000, + 0x0401fbfd, 0x0401f004, 0x42002000, 0x00000001, + 0x0401fbf9, 0x5c01d000, 0x4a035011, 0x00000004, + 0x1c01f000, 0x4c040000, 0x4c080000, 0x42000800, + 0x00000064, 0x42001000, 0x00104660, 0x0201f800, + 0x001059b4, 0x5c001000, 0x5c000800, 0x1c01f000, + 0x4803c856, 0x4c040000, 0x0201f800, 0x001061b2, + 0x4df00000, 0x0201f800, 0x001063aa, 0x5c03e000, + 0x02000800, 0x0010619f, 0x42000000, 0x0010bc71, + 0x0201f800, 0x0010ae10, 0x0401ffa7, 0x5c000800, + 0x1c01f000, 0x4803c856, 0x4c040000, 0x4c080000, + 0x0201f800, 0x001061b2, 0x4df00000, 0x0201f800, + 0x001063aa, 0x5c03e000, 0x02000800, 0x0010619f, + 0x59c40006, 0x84000500, 0x48038806, 0x0201f800, + 0x00106480, 0x497b8880, 0x42000000, 0x0010bc70, + 0x0201f800, 0x0010ae10, 0x0201f800, 0x00101617, + 0x4a035058, 0x00000004, 0x4202d800, 0x00000004, + 0x4a038805, 0x00000001, 0x42001000, 0x00104660, + 0x0201f800, 0x001059bf, 0x0201f800, 0x00100454, + 0x0401f8dd, 0x04000006, 0x42006000, 0xfeffffff, + 0x41786800, 0x0201f800, 0x00103a7d, 0x0201f800, + 0x0010ef18, 0x42000000, 0x00000080, 0x0201f800, + 0x00101365, 0x5c001000, 0x5c000800, 0x1c01f000, + 0x59c40008, 0x82000580, 0x00000010, 0x04000007, + 0x4a038808, 0x00000010, 0x4201d000, 0x00001388, + 0x0201f800, 0x001059d2, 0x1c01f000, 0x4c040000, + 0x59a80814, 0x82040580, 0x00000000, 0x0400000b, + 0x82040580, 0x00000001, 0x0400000b, 0x82040580, + 0x00000002, 0x04000013, 0x82040580, 0x00000003, + 0x04000013, 0x0401f05d, 0x4a035011, 0x00000000, + 0x0401f011, 0x59a80873, 0x8c040d3e, 0x04000006, + 0x4a035011, 0x00000003, 0x4a035014, 0x00000004, + 0x0401f052, 0x4a035011, 0x00000004, 0x0401f006, + 0x4a035011, 0x00000001, 0x0401f003, 0x4a035011, + 0x00000007, 0x497b8880, 0x4a038893, 0x00000001, + 0x41780000, 0x0201f800, 0x001013dc, 0x0201f800, + 0x00106480, 0x836c0d80, 0x00000004, 0x04000008, 0x59c40006, 0x82000500, 0xffffff0f, 0x82000540, - 0x04000000, 0x48038806, 0x0401f888, 0x04020005, - 0x59c40806, 0x82040d00, 0xfbffff0f, 0x48078806, - 0x59c40005, 0x8c000534, 0x04020033, 0x42006000, - 0xfc18ffff, 0x42006800, 0x01000000, 0x0201f800, - 0x00103a6a, 0x0201f800, 0x00101730, 0x59c408a4, - 0x82040d00, 0x0000000f, 0x82040d80, 0x0000000c, - 0x040208b7, 0x0401f871, 0x04000006, 0x42006000, - 0xfeffffff, 0x41786800, 0x0201f800, 0x00103a6a, - 0x836c0d80, 0x00000004, 0x0400000f, 0x0401ff4b, - 0x5994102e, 0x41780800, 0x42000000, 0x0000000a, - 0x0201f800, 0x00105f69, 0x40080000, 0x59a80831, - 0x80040c00, 0x42001000, 0x00104632, 0x0201f800, - 0x00105904, 0x4a035014, 0x00000004, 0x0401fe41, - 0x0401f856, 0x04020008, 0x59c408a4, 0x82040d00, - 0x0000000f, 0x82040580, 0x0000000c, 0x02020800, - 0x0010032d, 0x5c000800, 0x1c01f000, 0x4803c856, - 0x4c000000, 0x0201f800, 0x0010593d, 0x4a03500f, - 0x00ffffff, 0x497b5013, 0x59a8001f, 0x82000500, - 0xffff0000, 0x4803501f, 0x497b8880, 0x497b8893, - 0x41780000, 0x0201f800, 0x001013db, 0x59c40001, - 0x82000500, 0xfffffcff, 0x48038801, 0x42006000, - 0xfc18ffff, 0x41786800, 0x0201f800, 0x00103a6a, - 0x4a038808, 0x00000000, 0x5c000000, 0x800001c0, - 0x02020800, 0x001038f5, 0x4a038805, 0x040000f0, - 0x59c40006, 0x82000500, 0xffffffcf, 0x82000540, - 0x440000c1, 0x48038806, 0x1c01f000, 0x0401f807, - 0x42018800, 0x00000001, 0x04000003, 0x42018800, - 0x00000000, 0x1c01f000, 0x4c5c0000, 0x59a8b813, - 0x825cbd80, 0x0000aaaa, 0x5c00b800, 0x1c01f000, - 0x0401f807, 0x42018800, 0x00000001, 0x04000003, - 0x42018800, 0x00000000, 0x1c01f000, 0x4c5c0000, - 0x599cb818, 0x825cbd00, 0x00000030, 0x825cbd80, - 0x00000000, 0x5c00b800, 0x1c01f000, 0x0401f807, + 0x04000001, 0x48038806, 0x0401f007, 0x59c40006, + 0x82000500, 0xffffff0f, 0x82000540, 0x04000000, + 0x48038806, 0x0401f888, 0x04020005, 0x59c40806, + 0x82040d00, 0xfbffff0f, 0x48078806, 0x59c40005, + 0x8c000534, 0x04020033, 0x42006000, 0xfc18ffff, + 0x42006800, 0x01000000, 0x0201f800, 0x00103a7d, + 0x0201f800, 0x00101731, 0x59c408a4, 0x82040d00, + 0x0000000f, 0x82040d80, 0x0000000c, 0x040208b7, + 0x0401f871, 0x04000006, 0x42006000, 0xfeffffff, + 0x41786800, 0x0201f800, 0x00103a7d, 0x836c0d80, + 0x00000004, 0x0400000f, 0x0401ff4b, 0x5994102e, + 0x41780800, 0x42000000, 0x0000000a, 0x0201f800, + 0x0010600e, 0x40080000, 0x59a80831, 0x80040c00, + 0x42001000, 0x00104671, 0x0201f800, 0x001059a9, + 0x4a035014, 0x00000004, 0x0401fe41, 0x0401f856, + 0x04020008, 0x59c408a4, 0x82040d00, 0x0000000f, + 0x82040580, 0x0000000c, 0x02020800, 0x0010032d, + 0x5c000800, 0x1c01f000, 0x4803c856, 0x4c000000, + 0x0201f800, 0x001059e2, 0x4a03500f, 0x00ffffff, + 0x497b5013, 0x59a8001f, 0x82000500, 0xffff0000, + 0x4803501f, 0x497b8880, 0x497b8893, 0x41780000, + 0x0201f800, 0x001013dc, 0x59c40001, 0x82000500, + 0xfffffcff, 0x48038801, 0x42006000, 0xfc18ffff, + 0x41786800, 0x0201f800, 0x00103a7d, 0x4a038808, + 0x00000000, 0x5c000000, 0x800001c0, 0x02020800, + 0x00103908, 0x4a038805, 0x040000f0, 0x59c40006, + 0x82000500, 0xffffffcf, 0x82000540, 0x440000c1, + 0x48038806, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, + 0x1c01f000, 0x4c5c0000, 0x59a8b813, 0x825cbd80, + 0x0000aaaa, 0x5c00b800, 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, 0x4c5c0000, 0x599cb818, - 0x825cbd00, 0x00000030, 0x825cbd80, 0x00000010, + 0x825cbd00, 0x00000030, 0x825cbd80, 0x00000000, 0x5c00b800, 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, 0x4c5c0000, 0x599cb818, 0x825cbd00, - 0x00000030, 0x825cbd80, 0x00000020, 0x5c00b800, - 0x1c01f000, 0x490fc857, 0x830c0d00, 0x00000013, - 0x04000022, 0x599c1017, 0x4d3c0000, 0x830c0500, - 0x00000011, 0x04000005, 0x417a7800, 0x8d0e1d20, - 0x04020009, 0x0401f011, 0x42027800, 0x00000008, - 0x8d0e1d20, 0x0400000d, 0x42003000, 0x00000003, - 0x0401f003, 0x42003000, 0x00000004, 0x42028000, - 0x0000000e, 0x0201f800, 0x00109f44, 0x599c1017, - 0x8c08150a, 0x04020007, 0x42028000, 0x00000004, - 0x0201f800, 0x0010ded4, 0x4803c856, 0x850e1d08, - 0x5c027800, 0x0401f009, 0x8d0e1d20, 0x04000007, - 0x42028000, 0x0000000f, 0x42003000, 0x00000001, - 0x0201f800, 0x00109f44, 0x1c01f000, 0x4803c856, - 0x4c580000, 0x42000000, 0x0010bc86, 0x0201f800, - 0x0010ad1d, 0x42000800, 0x0010c474, 0x59c40003, - 0x44000800, 0x59c40004, 0x48000801, 0x59c4000b, - 0x48000802, 0x59c4008e, 0x48000803, 0x59c4008f, - 0x48000804, 0x59c40090, 0x48000805, 0x59c40091, - 0x48000806, 0x59c40092, 0x48000807, 0x59c40093, - 0x48000808, 0x59c40099, 0x48000809, 0x59c4009e, - 0x4800080a, 0x59c400aa, 0x4800080b, 0x59c400af, - 0x4800080c, 0x59c400b2, 0x4800080d, 0x59c400b1, - 0x4800080e, 0x82040c00, 0x0000000f, 0x41c41800, - 0x4200b000, 0x00000030, 0x580c0050, 0x44000800, + 0x00000030, 0x825cbd80, 0x00000010, 0x5c00b800, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, + 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, + 0x4c5c0000, 0x599cb818, 0x825cbd00, 0x00000030, + 0x825cbd80, 0x00000020, 0x5c00b800, 0x1c01f000, + 0x490fc857, 0x830c0d00, 0x00000013, 0x04000022, + 0x599c1017, 0x4d3c0000, 0x830c0500, 0x00000011, + 0x04000005, 0x417a7800, 0x8d0e1d20, 0x04020009, + 0x0401f011, 0x42027800, 0x00000008, 0x8d0e1d20, + 0x0400000d, 0x42003000, 0x00000003, 0x0401f003, + 0x42003000, 0x00000004, 0x42028000, 0x0000000e, + 0x0201f800, 0x0010a01b, 0x599c1017, 0x8c08150a, + 0x04020007, 0x42028000, 0x00000004, 0x0201f800, + 0x0010dfe1, 0x4803c856, 0x850e1d08, 0x5c027800, + 0x0401f009, 0x8d0e1d20, 0x04000007, 0x42028000, + 0x0000000f, 0x42003000, 0x00000001, 0x0201f800, + 0x0010a01b, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x42000000, 0x0010bd86, 0x0201f800, 0x0010ae10, + 0x42000800, 0x0010c574, 0x59c40003, 0x44000800, + 0x59c40004, 0x48000801, 0x59c4000b, 0x48000802, + 0x59c4008e, 0x48000803, 0x59c4008f, 0x48000804, + 0x59c40090, 0x48000805, 0x59c40091, 0x48000806, + 0x59c40092, 0x48000807, 0x59c40093, 0x48000808, + 0x59c40099, 0x48000809, 0x59c4009e, 0x4800080a, + 0x59c400aa, 0x4800080b, 0x59c400af, 0x4800080c, + 0x59c400b2, 0x4800080d, 0x59c400b1, 0x4800080e, + 0x82040c00, 0x0000000f, 0x41c41800, 0x4200b000, + 0x00000030, 0x580c0050, 0x44000800, 0x80040800, + 0x800c1800, 0x8058b040, 0x040207fb, 0x41c41800, + 0x4200b000, 0x00000020, 0x580c0010, 0x44000800, 0x80040800, 0x800c1800, 0x8058b040, 0x040207fb, - 0x41c41800, 0x4200b000, 0x00000020, 0x580c0010, - 0x44000800, 0x80040800, 0x800c1800, 0x8058b040, - 0x040207fb, 0x497b8830, 0x4200b000, 0x00000040, - 0x59c40031, 0x44000800, 0x80040800, 0x8058b040, - 0x040207fc, 0x497b88ac, 0x4200b000, 0x00000010, - 0x59c400ad, 0x44000800, 0x80040800, 0x8058b040, - 0x040207fc, 0x59c41001, 0x4c080000, 0x8408150c, - 0x480b8801, 0x4a0370e4, 0x00000300, 0x4a0370e5, - 0xb0000000, 0x42000800, 0x00000800, 0x80040840, - 0x02000800, 0x0010032d, 0x59b800e5, 0x8c000538, - 0x040207fb, 0x4a0370e4, 0x00000200, 0x42006000, - 0xffffffff, 0x42006800, 0x80000000, 0x0201f800, - 0x00103a6a, 0x4a038807, 0x00000001, 0x497b8807, - 0x0401fb74, 0x4a038808, 0x00000010, 0x42006000, - 0xfcf8ffff, 0x42006800, 0x01000000, 0x0201f800, - 0x00103a6a, 0x5c001000, 0x480b8801, 0x42000800, - 0x0010c474, 0x50040000, 0x48038803, 0x58040001, - 0x48038804, 0x58040002, 0x4803880b, 0x58040003, - 0x4803888e, 0x58040004, 0x4803888f, 0x58040005, - 0x48038890, 0x58040006, 0x48038891, 0x58040007, - 0x48038892, 0x58040008, 0x48038893, 0x58040009, - 0x48038899, 0x5804000a, 0x4803889e, 0x5804000b, - 0x480388aa, 0x5804000c, 0x480388af, 0x5804000d, - 0x480388b2, 0x5804000e, 0x480388b1, 0x82040c00, - 0x0000000f, 0x41c41800, 0x4200b000, 0x00000030, - 0x50040000, 0x48001850, 0x80040800, 0x800c1800, - 0x8058b040, 0x040207fb, 0x41c41800, 0x4200b000, - 0x00000020, 0x50040000, 0x48001810, 0x80040800, - 0x800c1800, 0x8058b040, 0x040207fb, 0x497b8830, - 0x4200b000, 0x00000040, 0x50040000, 0x48038831, - 0x80040800, 0x8058b040, 0x040207fc, 0x497b88ac, - 0x4200b000, 0x00000010, 0x50040000, 0x480388ad, - 0x80040800, 0x8058b040, 0x040207fc, 0x497b8880, - 0x41780000, 0x0201f800, 0x001013db, 0x59c408a4, - 0x82040d00, 0x0000000f, 0x82040580, 0x0000000c, - 0x02020800, 0x0010032d, 0x4a038805, 0x04000000, - 0x5c00b000, 0x1c01f000, 0x4803c856, 0x42000800, - 0x00000001, 0x0201f800, 0x00101993, 0x4c580000, - 0x4ce80000, 0x42000000, 0x0010bb73, 0x0201f800, - 0x0010ad1d, 0x59c41008, 0x4c080000, 0x82081500, - 0xffffff7f, 0x480b8808, 0x59c40004, 0x82000500, - 0x00003e02, 0x04000005, 0x4201d000, 0x00000014, - 0x0201f800, 0x0010592d, 0x59c40006, 0x82000500, - 0xffffff0f, 0x48038806, 0x0401faf1, 0x59a8006a, - 0x80000540, 0x04000014, 0x4a038805, 0x00000001, - 0x4c580000, 0x4200b000, 0x000006a4, 0x4201d000, - 0x00000064, 0x4c580000, 0x0201f800, 0x0010592d, - 0x0201f800, 0x001016ee, 0x5c00b000, 0x04000005, - 0x8058b040, 0x040207f6, 0x5c00b000, 0x0401f011, - 0x5c00b000, 0x4a038805, 0x00000010, 0x4a038808, - 0x00000004, 0x4200b000, 0x00000065, 0x59c40005, - 0x8c000508, 0x0402001d, 0x4201d000, 0x000003e8, - 0x0201f800, 0x0010592d, 0x8058b040, 0x040207f8, - 0x42002000, 0x00000007, 0x0401f98c, 0x0401fabf, - 0x0201f800, 0x001063db, 0x4803c856, 0x59a80073, - 0x8c00053e, 0x04000004, 0x0201f800, 0x0010a616, - 0x0401f003, 0x4a038808, 0x00000008, 0x4a035014, - 0x00000001, 0x4202d800, 0x00000001, 0x82000540, - 0x00000001, 0x0401f048, 0x42002000, 0x00000001, - 0x0401f976, 0x0201f800, 0x001007ca, 0x42000000, - 0x0010bc62, 0x0201f800, 0x0010ad1d, 0x0201f800, - 0x00100c45, 0x497b8880, 0x59a8001f, 0x82000500, - 0x0000ffff, 0x4c000000, 0x0201f800, 0x001013db, - 0x5c000000, 0x48038880, 0x41780800, 0x0201f800, - 0x00101993, 0x4a038808, 0x00000000, 0x4a038805, - 0x00000008, 0x4200b000, 0x00000065, 0x4a038805, - 0x000000f0, 0x59a8006a, 0x80000540, 0x04000005, - 0x4201d000, 0x00000002, 0x0201f800, 0x0010592d, - 0x0201f800, 0x00101730, 0x42000800, 0x000000f0, - 0x59c40005, 0x80040d00, 0x04000008, 0x4201d000, - 0x000003e8, 0x0201f800, 0x0010592d, 0x8058b040, - 0x040207eb, 0x0401f7b7, 0x59a8006a, 0x80000540, - 0x04000004, 0x59c40005, 0x8c000506, 0x040007f4, - 0x42002000, 0x00000002, 0x0401f93c, 0x59c40006, - 0x82000540, 0x000000f0, 0x48038806, 0x59a80012, - 0x80000540, 0x04020002, 0x80000000, 0x48038893, - 0x80000580, 0x4df00000, 0x0201f800, 0x00101758, - 0x5c03e000, 0x5c001000, 0x480b8808, 0x5c01d000, - 0x5c00b000, 0x1c01f000, 0x4803c856, 0x42000800, - 0x00000001, 0x0201f800, 0x00101993, 0x4c580000, - 0x4ce80000, 0x59c41008, 0x4c080000, 0x82081500, - 0xffffff7f, 0x480b8808, 0x59c40004, 0x82000500, - 0x00003e02, 0x04000005, 0x4201d000, 0x00000014, - 0x0201f800, 0x0010592d, 0x0201f800, 0x001007ca, - 0x42000000, 0x0010bc63, 0x0201f800, 0x0010ad1d, - 0x0201f800, 0x00100c45, 0x42002000, 0x00000000, - 0x0401f90a, 0x4a038808, 0x00000002, 0x80000580, - 0x48038880, 0x48038893, 0x0201f800, 0x001013db, - 0x4200b000, 0x00000384, 0x4a038805, 0x000000f0, - 0x0201f800, 0x00101730, 0x42000800, 0x000000f0, - 0x59c40005, 0x80040d00, 0x04000024, 0x82000500, - 0x000000d0, 0x04020024, 0x4201d000, 0x00000067, - 0x0201f800, 0x0010592d, 0x8058b040, 0x040207ef, - 0x42002000, 0x00000007, 0x0401f8ec, 0x0201f800, - 0x001063db, 0x0401fa1d, 0x59a80073, 0x8c00053e, - 0x04000004, 0x0201f800, 0x0010a616, 0x0401f003, + 0x497b8830, 0x4200b000, 0x00000040, 0x59c40031, + 0x44000800, 0x80040800, 0x8058b040, 0x040207fc, + 0x497b88ac, 0x4200b000, 0x00000010, 0x59c400ad, + 0x44000800, 0x80040800, 0x8058b040, 0x040207fc, + 0x59c41001, 0x4c080000, 0x8408150c, 0x480b8801, + 0x4a0370e4, 0x00000300, 0x4a0370e5, 0xb0000000, + 0x42000800, 0x00000800, 0x80040840, 0x02000800, + 0x0010032d, 0x59b800e5, 0x8c000538, 0x040207fb, + 0x4a0370e4, 0x00000200, 0x42006000, 0xffffffff, + 0x42006800, 0x80000000, 0x0201f800, 0x00103a7d, + 0x4a038807, 0x00000001, 0x497b8807, 0x0401fb74, + 0x4a038808, 0x00000010, 0x42006000, 0xfcf8ffff, + 0x42006800, 0x01000000, 0x0201f800, 0x00103a7d, + 0x5c001000, 0x480b8801, 0x42000800, 0x0010c574, + 0x50040000, 0x48038803, 0x58040001, 0x48038804, + 0x58040002, 0x4803880b, 0x58040003, 0x4803888e, + 0x58040004, 0x4803888f, 0x58040005, 0x48038890, + 0x58040006, 0x48038891, 0x58040007, 0x48038892, + 0x58040008, 0x48038893, 0x58040009, 0x48038899, + 0x5804000a, 0x4803889e, 0x5804000b, 0x480388aa, + 0x5804000c, 0x480388af, 0x5804000d, 0x480388b2, + 0x5804000e, 0x480388b1, 0x82040c00, 0x0000000f, + 0x41c41800, 0x4200b000, 0x00000030, 0x50040000, + 0x48001850, 0x80040800, 0x800c1800, 0x8058b040, + 0x040207fb, 0x41c41800, 0x4200b000, 0x00000020, + 0x50040000, 0x48001810, 0x80040800, 0x800c1800, + 0x8058b040, 0x040207fb, 0x497b8830, 0x4200b000, + 0x00000040, 0x50040000, 0x48038831, 0x80040800, + 0x8058b040, 0x040207fc, 0x497b88ac, 0x4200b000, + 0x00000010, 0x50040000, 0x480388ad, 0x80040800, + 0x8058b040, 0x040207fc, 0x497b8880, 0x41780000, + 0x0201f800, 0x001013dc, 0x59c408a4, 0x82040d00, + 0x0000000f, 0x82040580, 0x0000000c, 0x02020800, + 0x0010032d, 0x4a038805, 0x04000000, 0x5c00b000, + 0x1c01f000, 0x4803c856, 0x42000800, 0x00000001, + 0x0201f800, 0x00101994, 0x4c580000, 0x4ce80000, + 0x42000000, 0x0010bc73, 0x0201f800, 0x0010ae10, + 0x59c41008, 0x4c080000, 0x82081500, 0xffffff7f, + 0x480b8808, 0x59c40004, 0x82000500, 0x00003e02, + 0x04000005, 0x4201d000, 0x00000014, 0x0201f800, + 0x001059d2, 0x59c40006, 0x82000500, 0xffffff0f, + 0x48038806, 0x0401faf1, 0x59a8006a, 0x80000540, + 0x04000014, 0x4a038805, 0x00000001, 0x4c580000, + 0x4200b000, 0x000006a4, 0x4201d000, 0x00000064, + 0x4c580000, 0x0201f800, 0x001059d2, 0x0201f800, + 0x001016ef, 0x5c00b000, 0x04000005, 0x8058b040, + 0x040207f6, 0x5c00b000, 0x0401f011, 0x5c00b000, + 0x4a038805, 0x00000010, 0x4a038808, 0x00000004, + 0x4200b000, 0x00000065, 0x59c40005, 0x8c000508, + 0x0402001d, 0x4201d000, 0x000003e8, 0x0201f800, + 0x001059d2, 0x8058b040, 0x040207f8, 0x42002000, + 0x00000007, 0x0401f98c, 0x0401fabf, 0x0201f800, + 0x00106480, 0x4803c856, 0x59a80073, 0x8c00053e, + 0x04000004, 0x0201f800, 0x0010a709, 0x0401f003, 0x4a038808, 0x00000008, 0x4a035014, 0x00000001, - 0x4202d800, 0x00000001, 0x59c40006, 0x8400050a, - 0x48038806, 0x4a038805, 0x00000020, 0x82000540, - 0x00000001, 0x0401f016, 0x42002000, 0x00000002, - 0x0401f8d2, 0x497b8880, 0x59a80012, 0x80000540, - 0x04020002, 0x80000000, 0x48038893, 0x59a8001f, - 0x82000500, 0x0000ffff, 0x4c000000, 0x0201f800, - 0x001013db, 0x5c000000, 0x48038880, 0x41780800, - 0x0201f800, 0x00101993, 0x80000580, 0x4df00000, - 0x0201f800, 0x00101758, 0x5c03e000, 0x5c001000, - 0x480b8808, 0x5c01d000, 0x5c00b000, 0x1c01f000, - 0x4803c856, 0x42000800, 0x00000001, 0x0201f800, - 0x00101993, 0x42002000, 0x00000001, 0x0401f8af, - 0x59c40004, 0x82000500, 0x00003e02, 0x0400000b, - 0x0201f800, 0x001063db, 0x0401f9dc, 0x4a038808, + 0x4202d800, 0x00000001, 0x82000540, 0x00000001, + 0x0401f048, 0x42002000, 0x00000001, 0x0401f976, + 0x0201f800, 0x001007c8, 0x42000000, 0x0010bd62, + 0x0201f800, 0x0010ae10, 0x0201f800, 0x00100c46, + 0x497b8880, 0x59a8001f, 0x82000500, 0x0000ffff, + 0x4c000000, 0x0201f800, 0x001013dc, 0x5c000000, + 0x48038880, 0x41780800, 0x0201f800, 0x00101994, + 0x4a038808, 0x00000000, 0x4a038805, 0x00000008, + 0x4200b000, 0x00000065, 0x4a038805, 0x000000f0, + 0x59a8006a, 0x80000540, 0x04000005, 0x4201d000, + 0x00000002, 0x0201f800, 0x001059d2, 0x0201f800, + 0x00101731, 0x42000800, 0x000000f0, 0x59c40005, + 0x80040d00, 0x04000008, 0x4201d000, 0x000003e8, + 0x0201f800, 0x001059d2, 0x8058b040, 0x040207eb, + 0x0401f7b7, 0x59a8006a, 0x80000540, 0x04000004, + 0x59c40005, 0x8c000506, 0x040007f4, 0x42002000, + 0x00000002, 0x0401f93c, 0x59c40006, 0x82000540, + 0x000000f0, 0x48038806, 0x59a80012, 0x80000540, + 0x04020002, 0x80000000, 0x48038893, 0x80000580, + 0x4df00000, 0x0201f800, 0x00101759, 0x5c03e000, + 0x5c001000, 0x480b8808, 0x5c01d000, 0x5c00b000, + 0x1c01f000, 0x4803c856, 0x42000800, 0x00000001, + 0x0201f800, 0x00101994, 0x4c580000, 0x4ce80000, + 0x59c41008, 0x4c080000, 0x82081500, 0xffffff7f, + 0x480b8808, 0x59c40004, 0x82000500, 0x00003e02, + 0x04000005, 0x4201d000, 0x00000014, 0x0201f800, + 0x001059d2, 0x0201f800, 0x001007c8, 0x42000000, + 0x0010bd63, 0x0201f800, 0x0010ae10, 0x0201f800, + 0x00100c46, 0x42002000, 0x00000000, 0x0401f90a, + 0x4a038808, 0x00000002, 0x80000580, 0x48038880, + 0x48038893, 0x0201f800, 0x001013dc, 0x4200b000, + 0x00000384, 0x4a038805, 0x000000f0, 0x0201f800, + 0x00101731, 0x42000800, 0x000000f0, 0x59c40005, + 0x80040d00, 0x04000024, 0x82000500, 0x000000d0, + 0x04020024, 0x4201d000, 0x00000067, 0x0201f800, + 0x001059d2, 0x8058b040, 0x040207ef, 0x42002000, + 0x00000007, 0x0401f8ec, 0x0201f800, 0x00106480, + 0x0401fa1d, 0x59a80073, 0x8c00053e, 0x04000004, + 0x0201f800, 0x0010a709, 0x0401f003, 0x4a038808, 0x00000008, 0x4a035014, 0x00000001, 0x4202d800, - 0x00000001, 0x0401f055, 0x0201f800, 0x001007ca, - 0x42000000, 0x0010bc64, 0x0201f800, 0x0010ad1d, - 0x0201f800, 0x00100c45, 0x59c40006, 0x84000508, - 0x48038806, 0x4a038805, 0x00000010, 0x850e1d4c, - 0x42000800, 0x00000064, 0x42001000, 0x00104621, - 0x0201f800, 0x0010590f, 0x41780800, 0x0201f800, - 0x00101993, 0x4a038808, 0x00000000, 0x497b8880, - 0x4a038805, 0x000000f0, 0x0201f800, 0x00101730, - 0x42000800, 0x000000f0, 0x59c40005, 0x80040d00, - 0x0400000e, 0x82000500, 0x000000e0, 0x0402000e, - 0x4201d000, 0x000003e8, 0x0201f800, 0x0010592d, - 0x0201f800, 0x00105749, 0x59940004, 0x80000540, - 0x040207ec, 0x0401f025, 0x42002000, 0x00000002, - 0x0401f86e, 0x4c080000, 0x42001000, 0x00104621, - 0x0201f800, 0x0010591a, 0x5c001000, 0x497b8880, - 0x59a80012, 0x80000540, 0x04020002, 0x80000000, - 0x48038893, 0x59a8001f, 0x82000500, 0x0000ffff, - 0x4c000000, 0x0201f800, 0x001013db, 0x5c000000, - 0x48038880, 0x850e1d0c, 0x59c40006, 0x84000548, - 0x48038806, 0x0201f800, 0x00101758, 0x41780800, - 0x0201f800, 0x00101993, 0x59c40008, 0x82000540, - 0x00000080, 0x48038808, 0x1c01f000, 0x4803c856, - 0x4d400000, 0x4d3c0000, 0x0201f800, 0x001063db, - 0x0201f800, 0x0010ae24, 0x04020024, 0x599c1017, - 0x8d0e1d00, 0x0402000b, 0x8c08151a, 0x0400001f, - 0x850e1d42, 0x42028000, 0x00000004, 0x42027800, - 0x00000008, 0x8d0e1d20, 0x04020007, 0x0401f013, - 0x42028000, 0x00000004, 0x417a7800, 0x8d0e1d20, - 0x0400000e, 0x4d400000, 0x42028000, 0x0000000e, - 0x42003000, 0x00000003, 0x42028800, 0x0000ffff, - 0x0201f800, 0x00109f41, 0x5c028000, 0x599c0817, - 0x8c040d0a, 0x04020005, 0x4943c857, 0x493fc857, - 0x0201f800, 0x0010ded4, 0x497b8880, 0x4202d800, - 0x00000001, 0x0401fc83, 0x5c027800, 0x5c028000, - 0x1c01f000, 0x42000800, 0x00000001, 0x0201f800, - 0x00101993, 0x0201f800, 0x001007ca, 0x42000000, - 0x0010bc65, 0x0201f800, 0x0010ad1d, 0x0201f800, - 0x00100c45, 0x42000000, 0x00000001, 0x0201f800, - 0x001013db, 0x4a038880, 0x00000001, 0x59c80835, - 0x59a80072, 0x80040d80, 0x04000002, 0x48039035, - 0x0201f000, 0x00101758, 0x42000800, 0x0010b7f6, - 0x48100802, 0x82101480, 0x00000008, 0x04001009, - 0x58040001, 0x4803c857, 0x4813c857, 0x58040003, - 0x80000000, 0x48000803, 0x42002000, 0x00000002, - 0x58040001, 0x82001480, 0x0000000b, 0x04001008, + 0x00000001, 0x59c40006, 0x8400050a, 0x48038806, + 0x4a038805, 0x00000020, 0x82000540, 0x00000001, + 0x0401f016, 0x42002000, 0x00000002, 0x0401f8d2, + 0x497b8880, 0x59a80012, 0x80000540, 0x04020002, + 0x80000000, 0x48038893, 0x59a8001f, 0x82000500, + 0x0000ffff, 0x4c000000, 0x0201f800, 0x001013dc, + 0x5c000000, 0x48038880, 0x41780800, 0x0201f800, + 0x00101994, 0x80000580, 0x4df00000, 0x0201f800, + 0x00101759, 0x5c03e000, 0x5c001000, 0x480b8808, + 0x5c01d000, 0x5c00b000, 0x1c01f000, 0x4803c856, + 0x42000800, 0x00000001, 0x0201f800, 0x00101994, + 0x42002000, 0x00000001, 0x0401f8af, 0x59c40004, + 0x82000500, 0x00003e02, 0x0400000b, 0x0201f800, + 0x00106480, 0x0401f9dc, 0x4a038808, 0x00000008, + 0x4a035014, 0x00000001, 0x4202d800, 0x00000001, + 0x0401f055, 0x0201f800, 0x001007c8, 0x42000000, + 0x0010bd64, 0x0201f800, 0x0010ae10, 0x0201f800, + 0x00100c46, 0x59c40006, 0x84000508, 0x48038806, + 0x4a038805, 0x00000010, 0x850e1d4c, 0x42000800, + 0x00000064, 0x42001000, 0x00104660, 0x0201f800, + 0x001059b4, 0x41780800, 0x0201f800, 0x00101994, + 0x4a038808, 0x00000000, 0x497b8880, 0x4a038805, + 0x000000f0, 0x0201f800, 0x00101731, 0x42000800, + 0x000000f0, 0x59c40005, 0x80040d00, 0x0400000e, + 0x82000500, 0x000000e0, 0x0402000e, 0x4201d000, + 0x000003e8, 0x0201f800, 0x001059d2, 0x0201f800, + 0x001057ee, 0x59940004, 0x80000540, 0x040207ec, + 0x0401f025, 0x42002000, 0x00000002, 0x0401f86e, + 0x4c080000, 0x42001000, 0x00104660, 0x0201f800, + 0x001059bf, 0x5c001000, 0x497b8880, 0x59a80012, + 0x80000540, 0x04020002, 0x80000000, 0x48038893, + 0x59a8001f, 0x82000500, 0x0000ffff, 0x4c000000, + 0x0201f800, 0x001013dc, 0x5c000000, 0x48038880, + 0x850e1d0c, 0x59c40006, 0x84000548, 0x48038806, + 0x0201f800, 0x00101759, 0x41780800, 0x0201f800, + 0x00101994, 0x59c40008, 0x82000540, 0x00000080, + 0x48038808, 0x1c01f000, 0x4803c856, 0x4d400000, + 0x4d3c0000, 0x0201f800, 0x00106480, 0x0201f800, + 0x0010af17, 0x04020024, 0x599c1017, 0x8d0e1d00, + 0x0402000b, 0x8c08151a, 0x0400001f, 0x850e1d42, + 0x42028000, 0x00000004, 0x42027800, 0x00000008, + 0x8d0e1d20, 0x04020007, 0x0401f013, 0x42028000, + 0x00000004, 0x417a7800, 0x8d0e1d20, 0x0400000e, + 0x4d400000, 0x42028000, 0x0000000e, 0x42003000, + 0x00000003, 0x42028800, 0x0000ffff, 0x0201f800, + 0x0010a018, 0x5c028000, 0x599c0817, 0x8c040d0a, + 0x04020005, 0x4943c857, 0x493fc857, 0x0201f800, + 0x0010dfe1, 0x497b8880, 0x4202d800, 0x00000001, + 0x0401fc83, 0x5c027800, 0x5c028000, 0x1c01f000, + 0x42000800, 0x00000001, 0x0201f800, 0x00101994, + 0x0201f800, 0x001007c8, 0x42000000, 0x0010bd65, + 0x0201f800, 0x0010ae10, 0x0201f800, 0x00100c46, + 0x42000000, 0x00000001, 0x0201f800, 0x001013dc, + 0x4a038880, 0x00000001, 0x59c80835, 0x59a80072, + 0x80040d80, 0x04000002, 0x48039035, 0x0201f000, + 0x00101759, 0x42000800, 0x0010b8f6, 0x48100802, + 0x82101480, 0x00000008, 0x04001009, 0x58040001, 0x4803c857, 0x4813c857, 0x58040003, 0x80000000, - 0x48000803, 0x42000000, 0x00000000, 0x48000800, - 0x59c428a4, 0x82142d00, 0x0000000f, 0x82142d80, - 0x0000000c, 0x0c000002, 0x0401f136, 0x00104a36, - 0x00104a56, 0x00104a77, 0x00104a98, 0x00104ab9, - 0x00104ad4, 0x00104ae5, 0x00104afc, 0x00104b13, - 0x00104b2a, 0x00104b2d, 0x40100000, 0x0c01f001, - 0x00104a40, 0x00104a43, 0x00104a46, 0x00104a47, - 0x00104a4a, 0x00104a4d, 0x00104a51, 0x00104a54, - 0x4a000801, 0x00000002, 0x1c01f000, 0x4a000801, - 0x00000003, 0x0401f0e9, 0x1c01f000, 0x4a000801, + 0x48000803, 0x42002000, 0x00000002, 0x58040001, + 0x82001480, 0x0000000b, 0x04001008, 0x4803c857, + 0x4813c857, 0x58040003, 0x80000000, 0x48000803, + 0x42000000, 0x00000000, 0x48000800, 0x59c428a4, + 0x82142d00, 0x0000000f, 0x82142d80, 0x0000000c, + 0x0c000002, 0x0401f136, 0x00104a75, 0x00104a95, + 0x00104ab6, 0x00104ad7, 0x00104af8, 0x00104b13, + 0x00104b24, 0x00104b3b, 0x00104b52, 0x00104b69, + 0x00104b6c, 0x40100000, 0x0c01f001, 0x00104a7f, + 0x00104a82, 0x00104a85, 0x00104a86, 0x00104a89, + 0x00104a8c, 0x00104a90, 0x00104a93, 0x4a000801, + 0x00000002, 0x1c01f000, 0x4a000801, 0x00000003, + 0x0401f0e9, 0x1c01f000, 0x4a000801, 0x00000007, + 0x1c01f000, 0x4a000801, 0x00000004, 0x0401f0e6, + 0x4a000801, 0x00000005, 0x0401f8eb, 0x0401f0e6, + 0x4a000801, 0x00000005, 0x0401f0e7, 0x4813c857, + 0x1c01f000, 0x40100000, 0x0c01f001, 0x00104a9f, + 0x00104aa2, 0x00104aa5, 0x00104aa6, 0x00104aa9, + 0x00104aac, 0x00104ab0, 0x00104ab3, 0x4a000801, + 0x00000002, 0x1c01f000, 0x4a000801, 0x00000003, + 0x1c01f000, 0x1c01f000, 0x4a000801, 0x00000007, + 0x1c01f000, 0x4a000801, 0x00000004, 0x0401f0c6, + 0x4a000801, 0x00000005, 0x0401f8cb, 0x0401f0c6, + 0x4a000801, 0x00000005, 0x1c01f000, 0x4a000801, + 0x00000005, 0x0401f0bc, 0x40100000, 0x0c01f001, + 0x00104ac0, 0x00104ac1, 0x00104ac4, 0x00104ac7, + 0x00104aca, 0x00104acd, 0x00104ad1, 0x00104ad4, + 0x1c01f000, 0x4a000801, 0x00000003, 0x1c01f000, + 0x4a000801, 0x00000000, 0x1c01f000, 0x4a000801, 0x00000007, 0x1c01f000, 0x4a000801, 0x00000004, - 0x0401f0e6, 0x4a000801, 0x00000005, 0x0401f8eb, - 0x0401f0e6, 0x4a000801, 0x00000005, 0x0401f0e7, - 0x4813c857, 0x1c01f000, 0x40100000, 0x0c01f001, - 0x00104a60, 0x00104a63, 0x00104a66, 0x00104a67, - 0x00104a6a, 0x00104a6d, 0x00104a71, 0x00104a74, - 0x4a000801, 0x00000002, 0x1c01f000, 0x4a000801, - 0x00000003, 0x1c01f000, 0x1c01f000, 0x4a000801, - 0x00000007, 0x1c01f000, 0x4a000801, 0x00000004, - 0x0401f0c6, 0x4a000801, 0x00000005, 0x0401f8cb, - 0x0401f0c6, 0x4a000801, 0x00000005, 0x1c01f000, - 0x4a000801, 0x00000005, 0x0401f0bc, 0x40100000, - 0x0c01f001, 0x00104a81, 0x00104a82, 0x00104a85, - 0x00104a88, 0x00104a8b, 0x00104a8e, 0x00104a92, - 0x00104a95, 0x1c01f000, 0x4a000801, 0x00000003, + 0x0401f0a5, 0x4a000801, 0x00000005, 0x0401f8aa, + 0x0401f0a5, 0x4a000801, 0x00000005, 0x1c01f000, + 0x4a000801, 0x00000005, 0x0401f09b, 0x40100000, + 0x0c01f001, 0x00104ae1, 0x00104ae4, 0x00104ae5, + 0x00104ae8, 0x00104aeb, 0x00104aee, 0x00104af2, + 0x00104af5, 0x4a000801, 0x00000002, 0x1c01f000, 0x1c01f000, 0x4a000801, 0x00000000, 0x1c01f000, 0x4a000801, 0x00000007, 0x1c01f000, 0x4a000801, - 0x00000004, 0x0401f0a5, 0x4a000801, 0x00000005, - 0x0401f8aa, 0x0401f0a5, 0x4a000801, 0x00000005, - 0x1c01f000, 0x4a000801, 0x00000005, 0x0401f09b, - 0x40100000, 0x0c01f001, 0x00104aa2, 0x00104aa5, - 0x00104aa6, 0x00104aa9, 0x00104aac, 0x00104aaf, - 0x00104ab3, 0x00104ab6, 0x4a000801, 0x00000002, - 0x1c01f000, 0x1c01f000, 0x4a000801, 0x00000000, - 0x1c01f000, 0x4a000801, 0x00000007, 0x1c01f000, - 0x4a000801, 0x00000004, 0x0401f084, 0x4a000801, - 0x00000005, 0x0401f889, 0x0401f084, 0x4a000801, - 0x00000005, 0x1c01f000, 0x4a000801, 0x00000005, - 0x0401f07a, 0x40100000, 0x0c01f001, 0x00104ac3, - 0x00104ac6, 0x00104ac6, 0x00104ac7, 0x00104ac6, - 0x00104aca, 0x00104ace, 0x00104ad1, 0x4a000801, - 0x00000002, 0x1c01f000, 0x1c01f000, 0x4a000801, - 0x00000007, 0x1c01f000, 0x4a000801, 0x00000005, - 0x0401f86e, 0x0401f069, 0x4a000801, 0x00000005, - 0x1c01f000, 0x4a000801, 0x00000005, 0x0401f05f, - 0x40100000, 0x0c01f001, 0x00104ae4, 0x00104ae4, - 0x00104ae4, 0x00104ade, 0x00104ae1, 0x00104ae4, - 0x00104ae4, 0x00104ae4, 0x4a000801, 0x00000007, - 0x1c01f000, 0x4a000801, 0x00000004, 0x1c01f000, - 0x1c01f000, 0x40100000, 0x0c01f001, 0x00104aef, - 0x00104af2, 0x00104af2, 0x00104af3, 0x00104af6, - 0x00104af9, 0x00104af9, 0x00104af9, 0x4a000801, - 0x00000002, 0x1c01f000, 0x1c01f000, 0x4a000801, - 0x00000007, 0x1c01f000, 0x4a000801, 0x00000004, - 0x0401f03a, 0x4a000801, 0x00000008, 0x1c01f000, - 0x40100000, 0x0c01f001, 0x00104b06, 0x00104b09, - 0x00104b0c, 0x00104b0c, 0x00104b0d, 0x00104b10, - 0x00104b10, 0x00104b10, 0x4a000801, 0x00000002, - 0x1c01f000, 0x4a000801, 0x00000003, 0x1c01f000, - 0x1c01f000, 0x4a000801, 0x00000004, 0x0401f023, + 0x00000004, 0x0401f084, 0x4a000801, 0x00000005, + 0x0401f889, 0x0401f084, 0x4a000801, 0x00000005, + 0x1c01f000, 0x4a000801, 0x00000005, 0x0401f07a, + 0x40100000, 0x0c01f001, 0x00104b02, 0x00104b05, + 0x00104b05, 0x00104b06, 0x00104b05, 0x00104b09, + 0x00104b0d, 0x00104b10, 0x4a000801, 0x00000002, + 0x1c01f000, 0x1c01f000, 0x4a000801, 0x00000007, + 0x1c01f000, 0x4a000801, 0x00000005, 0x0401f86e, + 0x0401f069, 0x4a000801, 0x00000005, 0x1c01f000, + 0x4a000801, 0x00000005, 0x0401f05f, 0x40100000, + 0x0c01f001, 0x00104b23, 0x00104b23, 0x00104b23, + 0x00104b1d, 0x00104b20, 0x00104b23, 0x00104b23, + 0x00104b23, 0x4a000801, 0x00000007, 0x1c01f000, + 0x4a000801, 0x00000004, 0x1c01f000, 0x1c01f000, + 0x40100000, 0x0c01f001, 0x00104b2e, 0x00104b31, + 0x00104b31, 0x00104b32, 0x00104b35, 0x00104b38, + 0x00104b38, 0x00104b38, 0x4a000801, 0x00000002, + 0x1c01f000, 0x1c01f000, 0x4a000801, 0x00000007, + 0x1c01f000, 0x4a000801, 0x00000004, 0x0401f03a, 0x4a000801, 0x00000008, 0x1c01f000, 0x40100000, - 0x0c01f001, 0x00104b1d, 0x00104b1d, 0x00104b20, - 0x00104b21, 0x00104b24, 0x00104b20, 0x00104b27, - 0x00104b20, 0x4a000801, 0x00000005, 0x0401f00f, - 0x1c01f000, 0x4a000801, 0x00000007, 0x1c01f000, - 0x4a000801, 0x00000004, 0x1c01f000, 0x4a000801, - 0x00000008, 0x1c01f000, 0x4a000801, 0x00000009, - 0x1c01f000, 0x1c01f000, 0x42000000, 0x0010bb5d, - 0x0201f000, 0x0010ad1d, 0x42000000, 0x0010bb5a, - 0x0201f000, 0x0010ad1d, 0x42000000, 0x0010bb5c, - 0x0201f000, 0x0010ad1d, 0x42000000, 0x0010bb5b, - 0x0201f000, 0x0010ad1d, 0x42000800, 0x0010b7f6, - 0x58040001, 0x48000800, 0x4a000801, 0x00000005, - 0x4a000802, 0x00000008, 0x1c01f000, 0x42000800, - 0x0010b7f6, 0x58040001, 0x48000800, 0x4a000801, - 0x00000001, 0x4a000802, 0x0000000a, 0x1c01f000, - 0x42000800, 0x0010b7f6, 0x58040001, 0x48000800, - 0x4a000801, 0x00000006, 0x4a000802, 0x00000009, - 0x1c01f000, 0x42000800, 0x0010b7f6, 0x4a000801, - 0x0000000a, 0x4a000800, 0x0000000a, 0x1c01f000, - 0x496fc857, 0x4813c857, 0x40100000, 0x0c01f001, - 0x00104b7a, 0x00104b7a, 0x00104b7a, 0x00104b7a, - 0x00104b6c, 0x00104b74, 0x00104b78, 0x00104b7a, - 0x59a8021b, 0x8c000506, 0x04000003, 0x8c000502, - 0x0400000a, 0x0401f80a, 0x040207c0, 0x0401f007, - 0x0401f807, 0x04000005, 0x0401ffc0, 0x0401f7c3, - 0x0401f803, 0x040207c1, 0x1c01f000, 0x496fc857, - 0x416c0000, 0x82000c80, 0x00000008, 0x02021800, - 0x0010032d, 0x0c01f001, 0x00104b8a, 0x00104b8c, - 0x00104b8c, 0x00104b8c, 0x00104b8a, 0x00104b8a, - 0x00104b8a, 0x00104b8c, 0x80000580, 0x1c01f000, - 0x82000540, 0x00000001, 0x1c01f000, 0x4202e000, - 0x00000000, 0x497b3004, 0x4a03b004, 0x60000001, - 0x59d80005, 0x4a03b004, 0x90000001, 0x4a03a804, - 0x60000001, 0x59d40005, 0x4a03a804, 0x90000001, - 0x0201f000, 0x001050c1, 0x4a03c825, 0x00000004, - 0x4a03c827, 0x00000004, 0x599c0409, 0x80000d40, - 0x04000020, 0x599c0407, 0x80000540, 0x04000007, - 0x800000cc, 0x599c100b, 0x80080400, 0x4803b000, - 0x497bb002, 0x59d80001, 0x599c000b, 0x4803b000, - 0x599c000c, 0x4803b001, 0x599c0407, 0x80000540, - 0x04020002, 0x497bb002, 0x599c0c09, 0x82040540, - 0x00400000, 0x4803b003, 0x4a03b009, 0x00000005, - 0x4a03b004, 0x10000001, 0x59e00803, 0x82040d00, - 0xfffffeff, 0x82040d40, 0x00008000, 0x4807c003, - 0x599c040a, 0x80000540, 0x04000020, 0x599c0408, - 0x80000540, 0x04000007, 0x800000cc, 0x599c100f, - 0x80080400, 0x4803a800, 0x497ba802, 0x59d40001, - 0x599c000f, 0x4803a800, 0x599c0010, 0x4803a801, - 0x599c0408, 0x80000540, 0x04020002, 0x497ba802, - 0x599c0c0a, 0x82040540, 0x00400000, 0x4803a803, - 0x4a03a809, 0x00000005, 0x4a03a804, 0x10000001, - 0x59e00803, 0x82040d00, 0xfffffbff, 0x82040d40, - 0x00008000, 0x4807c003, 0x800409c0, 0x04000007, - 0x4202e000, 0x00000001, 0x0200b800, 0x00020713, - 0x0200f000, 0x00020728, 0x1c01f000, 0x0201f800, - 0x0010032d, 0x1c01f000, 0x0401f852, 0x5c03e000, - 0x0201f000, 0x0002067a, 0x0201f800, 0x000206b1, - 0x0401f7fb, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c54, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x000206a8, - 0x00104c44, 0x00104c44, 0x00104c54, 0x00104c54, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x492fc857, 0x42000000, 0x0010bc18, 0x0201f800, - 0x0010ad1d, 0x42000000, 0x00000400, 0x0401f019, - 0x492fc857, 0x42000000, 0x0010bc17, 0x0201f800, - 0x0010ad1d, 0x42000000, 0x00001000, 0x0401f011, - 0x492fc857, 0x42000000, 0x0010bc16, 0x0201f800, - 0x0010ad1d, 0x42000000, 0x00002000, 0x0401f009, - 0x492fc857, 0x42000000, 0x0010bc19, 0x0201f800, - 0x0010ad1d, 0x42000000, 0x00000800, 0x0401f001, - 0x4803c857, 0x592c0c05, 0x82040d00, 0xffff80ff, - 0x80040540, 0x59980803, 0x800409c0, 0x04000002, - 0x8400051e, 0x48025c05, 0x0201f800, 0x000203ab, - 0x83700580, 0x00000003, 0x4202e000, 0x00000001, - 0x04000002, 0x1c01f000, 0x599a5801, 0x812e59c0, - 0x040207dc, 0x0201f800, 0x0010032d, 0x492fc857, - 0x80140110, 0x80000040, 0x04000033, 0x040017cd, - 0x4a033006, 0x00104cb1, 0x0201f000, 0x00020684, - 0x492fc857, 0x80140110, 0x040007c6, 0x80000040, - 0x04000044, 0x4a033006, 0x00104ccc, 0x0201f000, - 0x00020684, 0x492fc857, 0x0201f800, 0x0010ae24, - 0x02020000, 0x00020692, 0x492fc856, 0x83440400, - 0x0010af80, 0x50000000, 0x80026d40, 0x04000006, - 0x4937c857, 0x59340200, 0x8c00050e, 0x02020000, - 0x00020692, 0x42028000, 0x00000028, 0x41780800, - 0x417a6000, 0x0201f800, 0x00104504, 0x0201f800, - 0x00108a42, 0x0201f000, 0x000203ab, 0x82000500, - 0x0f000000, 0x8000012a, 0x592c0c0b, 0x82040d00, - 0x0000ff87, 0x80040540, 0x48025c0b, 0x0201f000, - 0x000206a3, 0x592c0a0b, 0x8c040d02, 0x04020015, - 0x492fc857, 0x8d0e1d0e, 0x0402000f, 0x592c0208, - 0x80000540, 0x04000005, 0x0201f800, 0x00103b1b, - 0x04020004, 0x1c01f000, 0x42000000, 0x00000000, - 0x592c0a07, 0x48065c07, 0x48025a07, 0x0201f000, - 0x000203ab, 0x42000000, 0x00000028, 0x0401f7f9, - 0x42000800, 0x00000009, 0x0201f000, 0x00105f24, - 0x492fc857, 0x592c0409, 0x80000540, 0x0402078d, - 0x8d0e1d0e, 0x04020009, 0x592c0208, 0x80000540, - 0x04000788, 0x497a5a07, 0x0201f800, 0x00103b79, - 0x04020004, 0x1c01f000, 0x42000000, 0x00000028, - 0x48025a07, 0x0201f000, 0x000203ab, 0x592e8a07, - 0x592c0407, 0x4947c857, 0x4803c857, 0x82000500, - 0x000000ff, 0x4200b800, 0x00000001, 0x82000d80, - 0x00000001, 0x04000015, 0x417a8800, 0x4200b800, - 0x000007f0, 0x82000d80, 0x00000002, 0x0400000f, - 0x80000540, 0x02020000, 0x000203ab, 0x592e8a07, - 0x0201f800, 0x00020319, 0x02020000, 0x000203ab, - 0x592e9009, 0x592e980a, 0x0201f800, 0x00103f59, - 0x0201f000, 0x000203ab, 0x850e1d00, 0x0201f800, - 0x00020319, 0x02000800, 0x0010407b, 0x81468800, - 0x805cb840, 0x040207fa, 0x0201f000, 0x000203ab, - 0x592c0a09, 0x4807c857, 0x82040580, 0x0000000e, - 0x04000065, 0x82040580, 0x0000002a, 0x04000020, - 0x82040580, 0x0000000f, 0x040003c5, 0x82040580, - 0x0000002e, 0x040003c2, 0x82040580, 0x00000046, - 0x0400005d, 0x82040580, 0x00000045, 0x04000016, - 0x82040580, 0x00000049, 0x040003b9, 0x82040580, - 0x00000029, 0x040203bc, 0x592e8a07, 0x0201f800, - 0x00020319, 0x040203b2, 0x59340200, 0x84000518, + 0x0c01f001, 0x00104b45, 0x00104b48, 0x00104b4b, + 0x00104b4b, 0x00104b4c, 0x00104b4f, 0x00104b4f, + 0x00104b4f, 0x4a000801, 0x00000002, 0x1c01f000, + 0x4a000801, 0x00000003, 0x1c01f000, 0x1c01f000, + 0x4a000801, 0x00000004, 0x0401f023, 0x4a000801, + 0x00000008, 0x1c01f000, 0x40100000, 0x0c01f001, + 0x00104b5c, 0x00104b5c, 0x00104b5f, 0x00104b60, + 0x00104b63, 0x00104b5f, 0x00104b66, 0x00104b5f, + 0x4a000801, 0x00000005, 0x0401f00f, 0x1c01f000, + 0x4a000801, 0x00000007, 0x1c01f000, 0x4a000801, + 0x00000004, 0x1c01f000, 0x4a000801, 0x00000008, + 0x1c01f000, 0x4a000801, 0x00000009, 0x1c01f000, + 0x1c01f000, 0x42000000, 0x0010bc5d, 0x0201f000, + 0x0010ae10, 0x42000000, 0x0010bc5a, 0x0201f000, + 0x0010ae10, 0x42000000, 0x0010bc5c, 0x0201f000, + 0x0010ae10, 0x42000000, 0x0010bc5b, 0x0201f000, + 0x0010ae10, 0x42000800, 0x0010b8f6, 0x58040001, + 0x48000800, 0x4a000801, 0x00000005, 0x4a000802, + 0x00000008, 0x1c01f000, 0x42000800, 0x0010b8f6, + 0x58040001, 0x48000800, 0x4a000801, 0x00000001, + 0x4a000802, 0x0000000a, 0x1c01f000, 0x42000800, + 0x0010b8f6, 0x58040001, 0x48000800, 0x4a000801, + 0x00000006, 0x4a000802, 0x00000009, 0x1c01f000, + 0x42000800, 0x0010b8f6, 0x4a000801, 0x0000000a, + 0x4a000800, 0x0000000a, 0x1c01f000, 0x496fc857, + 0x4813c857, 0x40100000, 0x0c01f001, 0x00104bb9, + 0x00104bb9, 0x00104bb9, 0x00104bb9, 0x00104bab, + 0x00104bb3, 0x00104bb7, 0x00104bb9, 0x59a8021b, + 0x8c000506, 0x04000003, 0x8c000502, 0x0400000a, + 0x0401f80a, 0x040207c0, 0x0401f007, 0x0401f807, + 0x04000005, 0x0401ffc0, 0x0401f7c3, 0x0401f803, + 0x040207c1, 0x1c01f000, 0x496fc857, 0x416c0000, + 0x82000c80, 0x00000008, 0x02021800, 0x0010032d, + 0x0c01f001, 0x00104bc9, 0x00104bcb, 0x00104bcb, + 0x00104bcb, 0x00104bc9, 0x00104bc9, 0x00104bc9, + 0x00104bcb, 0x80000580, 0x1c01f000, 0x82000540, + 0x00000001, 0x1c01f000, 0x4202e000, 0x00000000, + 0x497b3004, 0x4a03b004, 0x60000001, 0x59d80005, + 0x4a03b004, 0x90000001, 0x4a03a804, 0x60000001, + 0x59d40005, 0x4a03a804, 0x90000001, 0x0201f000, + 0x00105117, 0x4a03c825, 0x00000004, 0x4a03c827, + 0x00000004, 0x599c0409, 0x80000d40, 0x04000020, + 0x599c0407, 0x80000540, 0x04000007, 0x800000cc, + 0x599c100b, 0x80080400, 0x4803b000, 0x497bb002, + 0x59d80001, 0x599c000b, 0x4803b000, 0x599c000c, + 0x4803b001, 0x599c0407, 0x80000540, 0x04020002, + 0x497bb002, 0x599c0c09, 0x82040540, 0x00400000, + 0x4803b003, 0x4a03b009, 0x00000005, 0x4a03b004, + 0x10000001, 0x59e00803, 0x82040d00, 0xfffffeff, + 0x82040d40, 0x00008000, 0x4807c003, 0x599c040a, + 0x80000540, 0x04000020, 0x599c0408, 0x80000540, + 0x04000007, 0x800000cc, 0x599c100f, 0x80080400, + 0x4803a800, 0x497ba802, 0x59d40001, 0x599c000f, + 0x4803a800, 0x599c0010, 0x4803a801, 0x599c0408, + 0x80000540, 0x04020002, 0x497ba802, 0x599c0c0a, + 0x82040540, 0x00400000, 0x4803a803, 0x4a03a809, + 0x00000005, 0x4a03a804, 0x10000001, 0x59e00803, + 0x82040d00, 0xfffffbff, 0x82040d40, 0x00008000, + 0x4807c003, 0x800409c0, 0x04000007, 0x4202e000, + 0x00000001, 0x0200b800, 0x00020713, 0x0200f000, + 0x00020728, 0x1c01f000, 0x0201f800, 0x0010032d, + 0x1c01f000, 0x0401f852, 0x5c03e000, 0x0201f000, + 0x0002067a, 0x0201f800, 0x000206b1, 0x0401f7fb, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c93, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x000206a8, 0x00104c83, + 0x00104c83, 0x00104c93, 0x00104c93, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x492fc857, + 0x42000000, 0x0010bd18, 0x0201f800, 0x0010ae10, + 0x42000000, 0x00000400, 0x0401f019, 0x492fc857, + 0x42000000, 0x0010bd17, 0x0201f800, 0x0010ae10, + 0x42000000, 0x00001000, 0x0401f011, 0x492fc857, + 0x42000000, 0x0010bd16, 0x0201f800, 0x0010ae10, + 0x42000000, 0x00002000, 0x0401f009, 0x492fc857, + 0x42000000, 0x0010bd19, 0x0201f800, 0x0010ae10, + 0x42000000, 0x00000800, 0x0401f001, 0x4803c857, + 0x592c0c05, 0x82040d00, 0xffff80ff, 0x80040540, + 0x59980803, 0x800409c0, 0x04000002, 0x8400051e, + 0x48025c05, 0x0201f800, 0x000203ab, 0x83700580, + 0x00000003, 0x4202e000, 0x00000001, 0x04000002, + 0x1c01f000, 0x599a5801, 0x812e59c0, 0x040207dc, + 0x0201f800, 0x0010032d, 0x492fc857, 0x80140110, + 0x80000040, 0x04000033, 0x040017cd, 0x4a033006, + 0x00104cf0, 0x0201f000, 0x00020684, 0x492fc857, + 0x80140110, 0x040007c6, 0x80000040, 0x04000044, + 0x4a033006, 0x00104d0b, 0x0201f000, 0x00020684, + 0x492fc857, 0x0201f800, 0x0010af17, 0x02020000, + 0x00020692, 0x492fc856, 0x83440400, 0x0010b080, + 0x50000000, 0x80026d40, 0x04000006, 0x4937c857, + 0x59340200, 0x8c00050e, 0x02020000, 0x00020692, + 0x42028000, 0x00000028, 0x41780800, 0x417a6000, + 0x0201f800, 0x00104543, 0x0201f800, 0x00108afb, + 0x0201f000, 0x000203ab, 0x82000500, 0x0f000000, + 0x8000012a, 0x592c0c0b, 0x82040d00, 0x0000ff87, + 0x80040540, 0x48025c0b, 0x0201f000, 0x000206a3, + 0x592c0a0b, 0x8c040d02, 0x04020015, 0x492fc857, + 0x8d0e1d0e, 0x0402000f, 0x592c0208, 0x80000540, + 0x04000005, 0x0201f800, 0x00103b2e, 0x04020004, + 0x1c01f000, 0x42000000, 0x00000000, 0x592c0a07, + 0x48065c07, 0x48025a07, 0x0201f000, 0x000203ab, + 0x42000000, 0x00000028, 0x0401f7f9, 0x42000800, + 0x00000009, 0x0201f000, 0x00105fc9, 0x492fc857, + 0x592c0409, 0x80000540, 0x0402078d, 0x8d0e1d0e, + 0x04020009, 0x592c0208, 0x80000540, 0x04000788, + 0x497a5a07, 0x0201f800, 0x00103b8c, 0x04020004, + 0x1c01f000, 0x42000000, 0x00000028, 0x48025a07, + 0x0201f000, 0x000203ab, 0x592e8a07, 0x592c0407, + 0x4947c857, 0x4803c857, 0x82000500, 0x000000ff, + 0x4200b800, 0x00000001, 0x82000d80, 0x00000001, + 0x04000015, 0x417a8800, 0x4200b800, 0x000007f0, + 0x82000d80, 0x00000002, 0x0400000f, 0x80000540, + 0x02020000, 0x000203ab, 0x592e8a07, 0x0201f800, + 0x00020319, 0x02020000, 0x000203ab, 0x592e9009, + 0x592e980a, 0x0201f800, 0x00103f73, 0x0201f000, + 0x000203ab, 0x850e1d00, 0x0201f800, 0x00020319, + 0x02000800, 0x00104095, 0x81468800, 0x805cb840, + 0x040207fa, 0x0201f000, 0x000203ab, 0x592c0a09, + 0x4807c857, 0x82040580, 0x0000000e, 0x0400006a, + 0x82040580, 0x0000002a, 0x04000025, 0x82040580, + 0x0000000f, 0x040003dc, 0x82040580, 0x0000002e, + 0x040003d9, 0x82040580, 0x00000046, 0x04000062, + 0x82040580, 0x00000045, 0x0400001b, 0x82040580, + 0x00000049, 0x040003d0, 0x82040580, 0x00000029, + 0x040203d3, 0x592e8a07, 0x42026800, 0x0010c2b2, + 0x83440580, 0x0000ffff, 0x04000007, 0x0201f800, + 0x00020319, 0x040203c4, 0x59340200, 0x84000518, 0x48026a00, 0x592e600a, 0x4933c857, 0x83300580, - 0xffffffff, 0x0402004d, 0x0401f3a9, 0x850e1d04, - 0x0401f3a7, 0x592c1408, 0x480bc857, 0x0201f800, - 0x00108cd8, 0x411e6000, 0x04020003, 0x4803c856, - 0x0401f3a5, 0x59300c07, 0x82040580, 0x00000004, - 0x04000003, 0x4803c856, 0x0401f39f, 0x592c0208, - 0x8c000506, 0x0400000f, 0x0201f800, 0x0010610d, - 0x4df00000, 0x0201f800, 0x00105ff7, 0x0201f800, - 0x0010e2ad, 0x80c40040, 0x5c03e000, 0x02000800, - 0x001060fa, 0x0201f800, 0x001070b5, 0x0401f388, - 0x592e380a, 0x591c1415, 0x8c081516, 0x0400038a, + 0xffffffff, 0x0402004d, 0x0401f3bb, 0x850e1d04, + 0x0401f3b9, 0x592c1408, 0x480bc857, 0x0201f800, + 0x00108d91, 0x411e6000, 0x04020003, 0x4803c856, + 0x0401f3b7, 0x59300c07, 0x82040580, 0x00000004, + 0x04000003, 0x4803c856, 0x0401f3b1, 0x592c0208, + 0x8c000506, 0x0400000f, 0x0201f800, 0x001061b2, + 0x4df00000, 0x0201f800, 0x0010609c, 0x0201f800, + 0x0010e3bd, 0x80c40040, 0x5c03e000, 0x02000800, + 0x0010619f, 0x0201f800, 0x00107144, 0x0401f39a, + 0x592e380a, 0x591c1415, 0x8c081516, 0x0400039c, 0x59300009, 0x800001c0, 0x02020800, 0x0010032d, 0x84081554, 0x480a3c15, 0x4a026403, 0x0000003a, 0x592c040c, 0x80000540, 0x04000007, 0x4a026403, 0x0000003b, 0x592c020d, 0x4802641b, 0x592c040d, 0x4802621b, 0x4a026203, 0x00000001, 0x42000800, - 0x80000040, 0x0401fb7d, 0x04000004, 0x492e6009, + 0x80000040, 0x0401fb8f, 0x04000004, 0x492e6009, 0x0201f000, 0x000209b1, 0x0201f800, 0x000209b1, - 0x0401f367, 0x59a80069, 0x84000510, 0x48035069, - 0x0401f363, 0x592c1208, 0x8c081500, 0x04020360, - 0x592e8a07, 0x592e600a, 0x0201f800, 0x00108ce2, - 0x04020003, 0x4803c856, 0x0401f35f, 0x59300c07, + 0x0401f379, 0x59a80069, 0x84000510, 0x48035069, + 0x0401f375, 0x592c1208, 0x8c081500, 0x04020372, + 0x592e8a07, 0x592e600a, 0x0201f800, 0x00108d9b, + 0x04020003, 0x4803c856, 0x0401f371, 0x59300c07, 0x82040580, 0x00000004, 0x04000003, 0x4803c856, - 0x0401f359, 0x59300a03, 0x82040580, 0x00000007, - 0x04000003, 0x4803c856, 0x0401f353, 0x59300c03, + 0x0401f36b, 0x59300a03, 0x82040580, 0x00000007, + 0x04000003, 0x4803c856, 0x0401f365, 0x59300c03, 0x82040580, 0x00000001, 0x0400001f, 0x82040580, 0x00000002, 0x04000014, 0x82040580, 0x00000008, 0x04000016, 0x82040580, 0x0000000a, 0x04000007, - 0x82040580, 0x0000000c, 0x0402001c, 0x42000800, - 0x00000009, 0x0401f017, 0x5932680a, 0x0201f800, - 0x00104181, 0x04020015, 0x42000800, 0x00000005, - 0x0401f010, 0x417a7800, 0x0201f800, 0x0010df61, + 0x82040580, 0x0000000c, 0x04020026, 0x42000800, + 0x00000009, 0x0401f021, 0x5932680a, 0x0201f800, + 0x0010419d, 0x0402001f, 0x42000800, 0x00000005, + 0x0401f01a, 0x417a7800, 0x0201f800, 0x0010e06f, 0x4a026407, 0x00000001, 0x42000800, 0x00000003, - 0x0401f008, 0x417a7800, 0x0201f800, 0x0010df61, - 0x4a026407, 0x00000001, 0x42000800, 0x0000000b, - 0x0201f800, 0x00103d8a, 0x4a026203, 0x00000001, - 0x0401fb2e, 0x04000004, 0x492e6009, 0x0201f000, - 0x00105fe8, 0x0201f800, 0x00105fe8, 0x0401f318, - 0x59300415, 0x8c000518, 0x02020000, 0x0010a168, - 0x0401f0a9, 0x40000800, 0x58040000, 0x80000540, - 0x040207fd, 0x492c0800, 0x1c01f000, 0x492fc857, - 0x59300c07, 0x82040580, 0x00000006, 0x04020099, - 0x59340400, 0x82000580, 0x00000606, 0x04020005, - 0x59340200, 0x8c00051a, 0x02000000, 0x000206f7, - 0x59340200, 0x8c00050e, 0x0400008e, 0x59300203, - 0x42027800, 0x00000001, 0x82000580, 0x00000007, - 0x02020000, 0x000206f7, 0x4a026203, 0x00000002, - 0x0201f000, 0x000206f7, 0x42028000, 0x00000002, - 0x4a026006, 0x00000014, 0x4d2c0000, 0x0201f800, - 0x00109d73, 0x5c025800, 0x59300c07, 0x4807c857, - 0x82040580, 0x00000007, 0x0402005d, 0x492fc857, - 0x4a025a07, 0x00000001, 0x0201f000, 0x000203ab, - 0x83300580, 0xffffffff, 0x04020055, 0x592c240b, - 0x492fc857, 0x4813c857, 0x8c10251c, 0x04020018, - 0x8c10251a, 0x04000003, 0x8c10250a, 0x0400006a, - 0x59340a00, 0x8c040d0e, 0x04000003, 0x8c10251e, - 0x04000065, 0x0201f800, 0x000209ee, 0x04000073, - 0x592c240b, 0x592c020d, 0x48026202, 0x4936600a, - 0x4932580a, 0x4a026407, 0x00000006, 0x4a026203, - 0x00000007, 0x0201f000, 0x000206f0, 0x592c0a0d, - 0x4c040000, 0x0201f800, 0x00104493, 0x5c000800, - 0x04020077, 0x58080000, 0x49781000, 0x802041c0, - 0x04000006, 0x48004000, 0x80000540, 0x04020007, - 0x48226810, 0x0401f005, 0x4802680f, 0x80000540, - 0x04020002, 0x497a6810, 0x4d2c0000, 0x400a5800, - 0x4a025a07, 0x00000002, 0x0201f800, 0x000203ab, - 0x5c025800, 0x0401f7c2, 0x8c10251c, 0x04000017, - 0x592c0207, 0x82000580, 0x0000ffff, 0x04020013, - 0x592e600a, 0x83300580, 0xffffffff, 0x040007b8, - 0x0201f800, 0x001091d9, 0x04020011, 0x592c220d, - 0x59300202, 0x80100580, 0x0402000d, 0x59300009, - 0x800001c0, 0x04020005, 0x59300203, 0x82000580, - 0x00000007, 0x0400079d, 0x492fc857, 0x4a025a07, - 0x00000029, 0x0201f000, 0x000203ab, 0x492fc857, - 0x4a025a07, 0x00000008, 0x0201f000, 0x000203ab, - 0x4803c857, 0x8c000514, 0x04000008, 0x42000000, - 0x0010bc07, 0x0201f800, 0x0010ad1d, 0x492fc857, - 0x492e6009, 0x1c01f000, 0x492fc857, 0x4a025a07, - 0x00000045, 0x0201f000, 0x000203ab, 0x492fc857, - 0x4a025a07, 0x0000002a, 0x0201f000, 0x000203ab, - 0x492fc857, 0x4a025a07, 0x00000028, 0x0201f000, - 0x000203ab, 0x492fc857, 0x4a025a07, 0x00000006, + 0x0401f012, 0x83340580, 0x0010c2b2, 0x04020008, + 0x5930000a, 0x82000580, 0x0010c2b2, 0x0402033c, + 0x4a026407, 0x00000001, 0x0401f00a, 0x417a7800, + 0x0201f800, 0x0010e06f, 0x4a026407, 0x00000001, + 0x42000800, 0x0000000b, 0x0201f800, 0x00103d9d, + 0x4a026203, 0x00000001, 0x0401fb36, 0x04000004, + 0x492e6009, 0x0201f000, 0x0010608d, 0x0201f800, + 0x0010608d, 0x0401f320, 0x59300415, 0x8c000518, + 0x02020000, 0x0010a247, 0x0401f0a9, 0x40000800, + 0x58040000, 0x80000540, 0x040207fd, 0x492c0800, + 0x1c01f000, 0x492fc857, 0x59300c07, 0x82040580, + 0x00000006, 0x04020099, 0x59340400, 0x82000580, + 0x00000606, 0x04020005, 0x59340200, 0x8c00051a, + 0x02000000, 0x000206f7, 0x59340200, 0x8c00050e, + 0x0400008e, 0x59300203, 0x42027800, 0x00000001, + 0x82000580, 0x00000007, 0x02020000, 0x000206f7, + 0x4a026203, 0x00000002, 0x0201f000, 0x000206f7, + 0x42028000, 0x00000002, 0x4a026006, 0x00000014, + 0x4d2c0000, 0x0201f800, 0x00109e4a, 0x5c025800, + 0x59300c07, 0x4807c857, 0x82040580, 0x00000007, + 0x0402005d, 0x492fc857, 0x4a025a07, 0x00000001, + 0x0201f000, 0x000203ab, 0x83300580, 0xffffffff, + 0x04020055, 0x592c240b, 0x492fc857, 0x4813c857, + 0x8c10251c, 0x04020018, 0x8c10251a, 0x04000003, + 0x8c10250a, 0x0400006a, 0x59340a00, 0x8c040d0e, + 0x04000003, 0x8c10251e, 0x04000065, 0x0201f800, + 0x000209ee, 0x04000073, 0x592c240b, 0x592c020d, + 0x48026202, 0x4936600a, 0x4932580a, 0x4a026407, + 0x00000006, 0x4a026203, 0x00000007, 0x0201f000, + 0x000206f0, 0x592c0a0d, 0x4c040000, 0x0201f800, + 0x001044b2, 0x5c000800, 0x04020077, 0x58080000, + 0x49781000, 0x802041c0, 0x04000006, 0x48004000, + 0x80000540, 0x04020007, 0x48226810, 0x0401f005, + 0x4802680f, 0x80000540, 0x04020002, 0x497a6810, + 0x4d2c0000, 0x400a5800, 0x4a025a07, 0x00000002, + 0x0201f800, 0x000203ab, 0x5c025800, 0x0401f7c2, + 0x8c10251c, 0x04000017, 0x592c0207, 0x82000580, + 0x0000ffff, 0x04020013, 0x592e600a, 0x83300580, + 0xffffffff, 0x040007b8, 0x0201f800, 0x00109291, + 0x04020011, 0x592c220d, 0x59300202, 0x80100580, + 0x0402000d, 0x59300009, 0x800001c0, 0x04020005, + 0x59300203, 0x82000580, 0x00000007, 0x0400079d, + 0x492fc857, 0x4a025a07, 0x00000029, 0x0201f000, + 0x000203ab, 0x492fc857, 0x4a025a07, 0x00000008, + 0x0201f000, 0x000203ab, 0x4803c857, 0x8c000514, + 0x04000008, 0x42000000, 0x0010bd07, 0x0201f800, + 0x0010ae10, 0x492fc857, 0x492e6009, 0x1c01f000, + 0x492fc857, 0x4a025a07, 0x00000045, 0x0201f000, + 0x000203ab, 0x492fc857, 0x4a025a07, 0x0000002a, 0x0201f000, 0x000203ab, 0x492fc857, 0x4a025a07, - 0x0000000e, 0x0201f000, 0x000203ab, 0x82040580, - 0x00000007, 0x040207d6, 0x4a025a07, 0x00000002, - 0x0201f000, 0x000203ab, 0x592c0407, 0x800000c2, - 0x800008c4, 0x80040400, 0x48025804, 0x59340010, - 0x492e6810, 0x492fc857, 0x80000d40, 0x04000003, - 0x492c0800, 0x1c01f000, 0x59340203, 0x492e680f, - 0x492fc857, 0x4803c857, 0x80000540, 0x04020003, - 0x4a026a03, 0x00000001, 0x1c01f000, 0x59a8000d, - 0x81640480, 0x0402175e, 0x42026000, 0x0010f584, - 0x5930000a, 0x81340580, 0x04020004, 0x59300202, - 0x80040580, 0x04000749, 0x83326400, 0x00000024, - 0x41580000, 0x81300480, 0x040017f6, 0x0401f750, - 0x492fc857, 0x592c0205, 0x80000112, 0x040205a5, - 0x592e8a07, 0x0201f800, 0x00020319, 0x0402005b, - 0x0201f800, 0x00104165, 0x0402005b, 0x592e780b, - 0x493fc857, 0x8d3e7d3e, 0x04020006, 0x8d0e1d0e, - 0x04020052, 0x0201f800, 0x00104087, 0x040005a5, - 0x833c1d00, 0x0000001f, 0x040005a2, 0x592c0208, - 0x82000c80, 0x00001000, 0x0402159e, 0x800000c2, - 0x800008c4, 0x8005d400, 0x592e9009, 0x592e980a, - 0x5934080d, 0x800409c0, 0x04000004, 0x58041802, - 0x800c19c0, 0x04020037, 0x833c1d00, 0x0000001f, - 0x81780040, 0x80000000, 0x800c1902, 0x040217fe, - 0x0402058c, 0x0c01f001, 0x00104ed7, 0x00104eda, - 0x00104ee7, 0x00104eea, 0x00104eed, 0x0201f800, - 0x001088aa, 0x0401f023, 0x0201f800, 0x00104059, - 0x04000027, 0x80e9d1c0, 0x02020800, 0x001057e8, - 0x42028000, 0x00000005, 0x417a9000, 0x417a9800, - 0x0201f800, 0x001088ba, 0x0401f016, 0x42027000, - 0x0000004d, 0x0401f006, 0x42027000, 0x0000004e, - 0x0401f003, 0x42027000, 0x00000052, 0x5934080d, - 0x800409c0, 0x04000007, 0x4d3c0000, 0x40067800, - 0x0201f800, 0x00104039, 0x5c027800, 0x04000009, - 0x0201f800, 0x00103f0f, 0x02020800, 0x001088ed, - 0x04000007, 0x8d3e7d3e, 0x0402000e, 0x1c01f000, - 0x4a025a07, 0x00000030, 0x0401f00d, 0x4a025a07, - 0x0000002c, 0x0401f00a, 0x4a025a07, 0x00000028, - 0x0401f007, 0x4a025a07, 0x00000029, 0x0401f004, - 0x497a580a, 0x4a025a07, 0x00000000, 0x4a025a05, - 0x00000103, 0x0201f000, 0x000203ab, 0x492fc857, - 0x80140110, 0x80000040, 0x04000002, 0x0401f535, - 0x592c0208, 0x82000500, 0x000003ff, 0x48025a08, - 0x8c000506, 0x04000004, 0x82000500, 0x00000070, - 0x04020003, 0x8d0e1d0e, 0x04020018, 0x4a025a07, - 0x0000dead, 0x592c0409, 0x82000500, 0x0000f0ff, - 0x48025c09, 0x0201f800, 0x00103ba7, 0x04020002, - 0x1c01f000, 0x49425a07, 0x8058b1c0, 0x04000009, - 0x0201f800, 0x00108e25, 0x0401f80f, 0x44042800, - 0x82580580, 0x00000002, 0x04020002, 0x48082801, - 0x0201f000, 0x000203ab, 0x42028000, 0x00000031, - 0x42000800, 0x00000001, 0x4200b000, 0x00000001, - 0x0401f7ed, 0x592c0409, 0x80000118, 0x832c2c00, - 0x0000000a, 0x80142c00, 0x1c01f000, 0x492fc857, - 0x4a025a09, 0x00000006, 0x0201f000, 0x000203ab, - 0x492fc857, 0x4a025a09, 0x00000001, 0x0201f000, - 0x000203ab, 0x492fc857, 0x592c040b, 0x82000500, - 0x00000003, 0x04000020, 0x0201f800, 0x001070f5, - 0x04000021, 0x592c0205, 0x492e6009, 0x82000500, - 0x000000ff, 0x82000580, 0x00000045, 0x0400000e, - 0x592c000c, 0x0201f800, 0x0010548f, 0x02000800, - 0x00020319, 0x04020018, 0x42027000, 0x00000041, - 0x4936600a, 0x4a026407, 0x00000001, 0x0201f000, - 0x00020a34, 0x59300016, 0x8400055e, 0x48026016, - 0x42026800, 0x0010b876, 0x42027000, 0x00000040, - 0x0401f7f4, 0x4a025a07, 0x00000101, 0x0201f000, - 0x000203ab, 0x4a025a07, 0x0000002c, 0x0201f000, - 0x000203ab, 0x4a025a07, 0x00000028, 0x0201f800, - 0x000203ab, 0x0201f000, 0x00020a10, 0x492fc857, - 0x0201f800, 0x00105b7c, 0x0400000b, 0x592c0205, - 0x80000110, 0x80000040, 0x040204c2, 0x592c0c07, - 0x800409c0, 0x04000009, 0x42000000, 0x00000102, - 0x0401f003, 0x42000000, 0x00000104, 0x48025a07, - 0x0201f000, 0x000203ab, 0x592c0c08, 0x800409c0, - 0x04000020, 0x82040480, 0x00000005, 0x0402101d, - 0x4c040000, 0x80040800, 0x0201f800, 0x00105ba1, - 0x5c001000, 0x04020014, 0x832c0400, 0x00000009, - 0x4000a000, 0x0201f800, 0x00105bca, 0x0402000e, - 0x592c1208, 0x58c80c0b, 0x84040d00, 0x84040d02, - 0x8c081500, 0x04000002, 0x84040d5e, 0x4805940b, - 0x42000000, 0x00000000, 0x48025a07, 0x0201f000, - 0x000203ab, 0x42000000, 0x00000103, 0x0401f7fb, - 0x42000000, 0x00000102, 0x0401f7f8, 0x492fc857, - 0x592e7c07, 0x833c0500, 0xfffffffe, 0x04020047, - 0x592c4008, 0x42026000, 0x0010f584, 0x41581800, - 0x400c0000, 0x81300480, 0x04021026, 0x59300203, - 0x82000580, 0x00000000, 0x04000007, 0x59300009, - 0x80000d40, 0x04000004, 0x58040006, 0x80200580, - 0x04000004, 0x83326400, 0x00000024, 0x0401f7f1, - 0x58040205, 0x82000500, 0x000000ff, 0x82000d80, - 0x00000053, 0x0400000a, 0x82000d80, 0x00000048, - 0x04000007, 0x82000d80, 0x00000018, 0x04000004, - 0x82000d80, 0x00000029, 0x040207ef, 0x4d2c0000, - 0x0201f800, 0x00108487, 0x5c025800, 0x0400001f, - 0x4a025a07, 0x00000000, 0x0201f000, 0x000203ab, - 0x592e8a07, 0x83440480, 0x000007f0, 0x04021017, - 0x83440400, 0x0010af80, 0x50000000, 0x80026d40, - 0x04000012, 0x4d2c0000, 0x0201f800, 0x00104013, - 0x0400000d, 0x42028000, 0x00000005, 0x592c0a09, - 0x417a6000, 0x0201f800, 0x00104504, 0x0201f800, - 0x00108a48, 0x0201f800, 0x000203ab, 0x5c025800, - 0x0401f7e4, 0x5c025800, 0x4a025a07, 0x00000031, - 0x0201f000, 0x000203ab, 0x492fc857, 0x4d2c0000, - 0x0201f800, 0x0010056f, 0x04000017, 0x492fc857, - 0x412f4000, 0x0201f800, 0x0010056f, 0x0400000f, - 0x492fc857, 0x412dd800, 0x0201f800, 0x001032d6, - 0x0201f800, 0x001032e0, 0x49a1d80a, 0x5c025800, - 0x492dd809, 0x48ef4006, 0x0201f800, 0x00101c10, - 0x0201f000, 0x00101c2f, 0x41a25800, 0x0201f800, - 0x00100580, 0x5c025800, 0x4a025a07, 0x00004005, - 0x4a025c07, 0x00000002, 0x0201f000, 0x000203ab, - 0x4807c857, 0x485fc857, 0x4200b800, 0x00000001, - 0x5c000800, 0x4c5c0000, 0x0401f005, 0x4807c857, - 0x485fc857, 0x5c000800, 0x4d780000, 0x4803c857, - 0x492fc857, 0x8c00050e, 0x02020800, 0x00100322, - 0x4203e000, 0x50000000, 0x4200b800, 0x00008003, - 0x0201f000, 0x00100332, 0x80140110, 0x80000040, - 0x04020408, 0x599c0019, 0x8c000510, 0x0402000d, - 0x0201f800, 0x001041c3, 0x04020002, 0x1c01f000, - 0x49425a07, 0x4806580e, 0x480a580f, 0x4943c857, - 0x4807c857, 0x480bc857, 0x0201f000, 0x000203ab, - 0x592c040c, 0x82000500, 0x0000e000, 0x82000580, - 0x00006000, 0x040007ef, 0x59a8021b, 0x8c000508, - 0x040007ec, 0x592c120c, 0x592c080b, 0x82040500, - 0xff000000, 0x80040d80, 0x80000110, 0x80081540, - 0x04000004, 0x4806580b, 0x0401f883, 0x0401f7e1, - 0x42001000, 0x0000001c, 0x42000800, 0x00000019, - 0x42028000, 0x00000031, 0x0401f7de, 0x80140110, - 0x80000040, 0x02020000, 0x00104c4c, 0x0201f800, - 0x00104336, 0x04020002, 0x1c01f000, 0x49425a07, - 0x48065812, 0x480a5813, 0x0201f000, 0x000203ab, - 0x80140110, 0x02000000, 0x00104c4c, 0x80000040, - 0x0402000d, 0x4202e000, 0x00000001, 0x592c020b, - 0x8c000504, 0x02000000, 0x0002068a, 0x592c0208, - 0x82000c80, 0x00001001, 0x02021000, 0x00104c5c, - 0x0401f005, 0x4a033006, 0x0002068a, 0x0201f000, - 0x00020684, 0x592c1014, 0x82080500, 0xffff0003, - 0x02020000, 0x00104c5c, 0x4202e000, 0x00000002, - 0x42000000, 0x0010c25d, 0x50007000, 0x592c0012, - 0x592c0813, 0x48007006, 0x48047007, 0x492c700a, - 0x4978700d, 0x4978700b, 0x0401f001, 0x4978700c, - 0x82080480, 0x00000180, 0x4803c857, 0x04001007, - 0x4800700e, 0x4a007005, 0x00000180, 0x4a007004, - 0x00000060, 0x0401f005, 0x4978700e, 0x48087005, - 0x80081104, 0x48087004, 0x58380009, 0x48007003, - 0x40381000, 0x0201f000, 0x00020016, 0x4df00000, - 0x4203e000, 0x50000000, 0x0201f800, 0x0010055a, - 0x04000003, 0x59980005, 0x0801f800, 0x5c03e000, - 0x1c01f000, 0x0201f800, 0x0010055a, 0x02000800, - 0x0010032d, 0x4a025809, 0x0010c1fc, 0x42000800, - 0x0010c25d, 0x452c0800, 0x497a580a, 0x497a580b, - 0x497a580c, 0x497a580d, 0x497a580e, 0x4a025808, - 0x0002073d, 0x497a580f, 0x4a025802, 0x00000100, - 0x4a025801, 0x00000001, 0x1c01f000, 0x0401f80c, - 0x04000674, 0x4a025a09, 0x00000001, 0x0201f000, - 0x0010a3e5, 0x0401f806, 0x04000669, 0x4a025a09, - 0x00000006, 0x0201f000, 0x0010a3e5, 0x59a80005, - 0x8c00051a, 0x1c01f000, 0x59a80005, 0x8c00051c, - 0x1c01f000, 0x59a8000f, 0x80080580, 0x04020002, - 0x1c01f000, 0x480bc857, 0x480b500f, 0x497b8830, - 0x82080d40, 0x01000000, 0x48078832, 0x59c40002, - 0x8400054c, 0x48038802, 0x42000800, 0x00000003, - 0x0201f000, 0x00106134, 0x59c80007, 0x8c000502, - 0x0400007b, 0x835c2c80, 0x00000005, 0x02001000, - 0x00105724, 0x59c82817, 0x4817506c, 0x497b9005, - 0x82140500, 0x00e00000, 0x04020059, 0x82140500, - 0x000003ff, 0x82001c00, 0x00000006, 0x41cc2000, - 0x42003000, 0x00006080, 0x820c0480, 0x00000040, - 0x04001006, 0x42001000, 0x00000040, 0x820c1c80, - 0x00000040, 0x0401f003, 0x400c1000, 0x41781800, - 0x54182000, 0x80102000, 0x80183000, 0x80081040, - 0x040207fc, 0x800c19c0, 0x04000005, 0x59c80005, - 0x80000000, 0x48039005, 0x0401f7ea, 0x82140500, - 0x000003ff, 0x800018c4, 0x8c142d14, 0x04000005, - 0x59cc0002, 0x82000500, 0x00000003, 0x800c1c80, - 0x480f505a, 0x82140500, 0x01f60000, 0x04020029, - 0x82140500, 0x0000f000, 0x0400000b, 0x82000c80, - 0x00002000, 0x0402100f, 0x4a039005, 0x00000140, - 0x82140500, 0x0e000000, 0x80000132, 0x0c01f83e, - 0x1c01f000, 0x59cc0400, 0x82000500, 0x0000ff00, - 0x82000580, 0x00008100, 0x040007f4, 0x0401f01c, - 0x4817c857, 0x82140500, 0x000003ff, 0x04020007, - 0x59cc0400, 0x82000500, 0x0000ff00, 0x82000580, - 0x00008100, 0x04020012, 0x42000000, 0x0010bc77, - 0x0201f800, 0x0010ad1d, 0x0201f800, 0x001055d9, - 0x4803c856, 0x4a039005, 0x00000140, 0x0401f020, - 0x4817c857, 0x82140500, 0x00f60000, 0x04020004, - 0x0201f800, 0x00105617, 0x040207d2, 0x0201f800, - 0x00104716, 0x04000010, 0x59c400a4, 0x4803c857, - 0x82000500, 0x0000000f, 0x82000580, 0x0000000a, - 0x04020009, 0x497b505a, 0x59c400a3, 0x82000540, - 0x00080000, 0x480388a3, 0x82000500, 0xfff7ffff, - 0x480388a3, 0x4817c856, 0x0201f800, 0x0010ac62, - 0x4a039005, 0x00000140, 0x0401f03f, 0x4803c856, - 0x1c01f000, 0x00105187, 0x00105499, 0x00105181, - 0x00105181, 0x00105181, 0x00105181, 0x00105181, - 0x00105181, 0x4803c857, 0x42000000, 0x0010bc14, - 0x0201f800, 0x0010ad1d, 0x1c01f000, 0x59cc0002, - 0x82000500, 0xff000000, 0x82000580, 0xfe000000, - 0x04020004, 0x0201f800, 0x0010a731, 0x0401f025, - 0x59cc0400, 0x82000d00, 0x0000ff00, 0x82041500, - 0x0000f000, 0x840409c0, 0x82080580, 0x00002000, - 0x04020013, 0x836c0580, 0x00000001, 0x0402000e, - 0x59cc0006, 0x82000500, 0xff000000, 0x82000580, - 0x11000000, 0x02020800, 0x001003f4, 0x04020011, - 0x0201f800, 0x0010330a, 0x0201f800, 0x00105749, - 0x0401f00c, 0x0401f81f, 0x0401f00a, 0x82080580, - 0x00003000, 0x04020003, 0x0401fa83, 0x0401f005, - 0x82080580, 0x00008000, 0x04020002, 0x0401fb4c, - 0x1c01f000, 0x4817c857, 0x42000000, 0x0010bc13, - 0x0201f800, 0x0010ad1d, 0x836c0580, 0x00000003, - 0x0402000b, 0x4c080000, 0x4c0c0000, 0x42001000, - 0x00008048, 0x40141800, 0x80142120, 0x0201f800, - 0x001031eb, 0x5c001800, 0x5c001000, 0x1c01f000, - 0x59cc0002, 0x82000500, 0xff000000, 0x82001580, - 0x01000000, 0x04000006, 0x82001580, 0x23000000, - 0x02020800, 0x001003f4, 0x04020209, 0x59a8005a, - 0x82000480, 0x00000004, 0x04001205, 0x82040580, - 0x00000023, 0x04020051, 0x59cc0004, 0x4803c857, - 0x59cc0006, 0x82000500, 0xff000000, 0x59cc0801, - 0x82040d00, 0x00ffffff, 0x80040540, 0x4803c857, - 0x0401fbc6, 0x02000800, 0x001003f4, 0x040001f4, - 0x59300c07, 0x82040580, 0x00000010, 0x0400000f, - 0x82040580, 0x00000011, 0x0400000c, 0x82040580, - 0x00000001, 0x04000009, 0x82040580, 0x00000004, - 0x04000006, 0x82040580, 0x00000008, 0x02020800, - 0x001003f4, 0x040201e2, 0x59300004, 0x82000500, - 0x80010000, 0x04000006, 0x0201f800, 0x0010644d, - 0x02020800, 0x001003f4, 0x040201d9, 0x59cc0a04, - 0x48066202, 0x59cc0006, 0x82000500, 0xffff0000, - 0x82000d80, 0x02000000, 0x04020005, 0x42027000, - 0x00000015, 0x0201f000, 0x00020a34, 0x82000d80, - 0x02140000, 0x040007fa, 0x82000d80, 0x02100000, - 0x040007f7, 0x82000d80, 0x02100000, 0x040007f4, - 0x82000d80, 0x01000000, 0x02020800, 0x001003f4, - 0x040201bf, 0x59cc0006, 0x82000500, 0x0000ffff, - 0x02020800, 0x001003f4, 0x040201b9, 0x59a8005a, - 0x82000480, 0x00000008, 0x040011b5, 0x42027000, - 0x00000016, 0x0401f7e4, 0x82040580, 0x00000022, - 0x02020800, 0x001003f4, 0x040201ad, 0x59cc0004, - 0x4803c857, 0x59cc0006, 0x4803c857, 0x59cc0001, - 0x4803c857, 0x59a8005a, 0x800001c0, 0x02000800, - 0x001003f4, 0x040001a2, 0x59a80805, 0x8c040d14, - 0x0400002b, 0x0401f9bd, 0x04020029, 0x0401f9d6, - 0x04000027, 0x42027000, 0x0000004c, 0x59cc0001, - 0x82000500, 0x00ffffff, 0x0201f800, 0x001056f0, - 0x04000004, 0x42028800, 0x0000ffff, 0x417a6800, - 0x599c0019, 0x8c000510, 0x04000178, 0x59a8021b, - 0x8c000508, 0x04000175, 0x59cc1006, 0x82081500, - 0xffff0000, 0x82081580, 0x03000000, 0x0402016f, - 0x83641480, 0x00000010, 0x04001186, 0x8400054c, - 0x4803521b, 0x59cc1000, 0x82081500, 0x00ffffff, - 0x0401fe89, 0x59cc0007, 0x82000500, 0x0000ffff, - 0x48038893, 0x48035012, 0x0401f160, 0x59cc0006, - 0x82000500, 0xffff0000, 0x82000d80, 0x03000000, - 0x04020029, 0x59a8021b, 0x8c000508, 0x04000020, - 0x8400054c, 0x4803521b, 0x59cc0800, 0x82040d00, - 0x00ffffff, 0x4807500f, 0x497b8830, 0x84040d70, - 0x48078832, 0x59c40802, 0x84040d4c, 0x48078802, + 0x00000028, 0x0201f000, 0x000203ab, 0x492fc857, + 0x4a025a07, 0x00000006, 0x0201f000, 0x000203ab, + 0x492fc857, 0x4a025a07, 0x0000000e, 0x0201f000, + 0x000203ab, 0x82040580, 0x00000007, 0x040207d6, + 0x4a025a07, 0x00000002, 0x0201f000, 0x000203ab, + 0x592c0407, 0x800000c2, 0x800008c4, 0x80040400, + 0x48025804, 0x59340010, 0x492e6810, 0x492fc857, + 0x80000d40, 0x04000003, 0x492c0800, 0x1c01f000, + 0x59340203, 0x492e680f, 0x492fc857, 0x4803c857, + 0x80000540, 0x04020003, 0x4a026a03, 0x00000001, + 0x1c01f000, 0x59a8000d, 0x81640480, 0x0402175e, + 0x42026000, 0x0010f694, 0x59300407, 0x82000580, + 0x00000006, 0x04020007, 0x5930000a, 0x81340580, + 0x04020004, 0x59300202, 0x80040580, 0x04000745, + 0x83326400, 0x00000024, 0x41580000, 0x81300480, + 0x040017f2, 0x0401f74c, 0x492fc857, 0x592c0205, + 0x80000112, 0x04020592, 0x592e8a07, 0x0201f800, + 0x00020319, 0x0402005b, 0x0201f800, 0x00104181, + 0x0402005b, 0x592e780b, 0x493fc857, 0x8d3e7d3e, + 0x04020006, 0x8d0e1d0e, 0x04020052, 0x0201f800, + 0x001040a1, 0x04000592, 0x833c1d00, 0x0000001f, + 0x0400058f, 0x592c0208, 0x82000c80, 0x00001000, + 0x0402158b, 0x800000c2, 0x800008c4, 0x8005d400, + 0x592e9009, 0x592e980a, 0x5934080d, 0x800409c0, + 0x04000004, 0x58041802, 0x800c19c0, 0x04020037, + 0x833c1d00, 0x0000001f, 0x81780040, 0x80000000, + 0x800c1902, 0x040217fe, 0x04020579, 0x0c01f001, + 0x00104f29, 0x00104f2c, 0x00104f39, 0x00104f3c, + 0x00104f3f, 0x0201f800, 0x00108963, 0x0401f023, + 0x0201f800, 0x00104073, 0x04000027, 0x80e9d1c0, + 0x02020800, 0x0010588d, 0x42028000, 0x00000005, + 0x417a9000, 0x417a9800, 0x0201f800, 0x00108973, + 0x0401f016, 0x42027000, 0x0000004d, 0x0401f006, + 0x42027000, 0x0000004e, 0x0401f003, 0x42027000, + 0x00000052, 0x5934080d, 0x800409c0, 0x04000007, + 0x4d3c0000, 0x40067800, 0x0201f800, 0x00104053, + 0x5c027800, 0x04000009, 0x0201f800, 0x00103f29, + 0x02020800, 0x001089a6, 0x04000007, 0x8d3e7d3e, + 0x0402000e, 0x1c01f000, 0x4a025a07, 0x00000030, + 0x0401f00d, 0x4a025a07, 0x0000002c, 0x0401f00a, + 0x4a025a07, 0x00000028, 0x0401f007, 0x4a025a07, + 0x00000029, 0x0401f004, 0x497a580a, 0x4a025a07, + 0x00000000, 0x4a025a05, 0x00000103, 0x0201f000, + 0x000203ab, 0x492fc857, 0x80140110, 0x80000040, + 0x04000002, 0x0401f522, 0x592c0208, 0x82000500, + 0x000003ff, 0x48025a08, 0x8c000506, 0x04000004, + 0x82000500, 0x00000070, 0x04020003, 0x8d0e1d0e, + 0x04020018, 0x4a025a07, 0x0000dead, 0x592c0409, + 0x82000500, 0x0000f0ff, 0x48025c09, 0x0201f800, + 0x00103bba, 0x04020002, 0x1c01f000, 0x49425a07, + 0x8058b1c0, 0x04000009, 0x0201f800, 0x00108ede, + 0x0401f80f, 0x44042800, 0x82580580, 0x00000002, + 0x04020002, 0x48082801, 0x0201f000, 0x000203ab, + 0x42028000, 0x00000031, 0x42000800, 0x00000001, + 0x4200b000, 0x00000001, 0x0401f7ed, 0x592c0409, + 0x80000118, 0x832c2c00, 0x0000000a, 0x80142c00, + 0x1c01f000, 0x492fc857, 0x4a025a09, 0x00000006, + 0x0201f000, 0x000203ab, 0x492fc857, 0x4a025a09, + 0x00000001, 0x0201f000, 0x000203ab, 0x492fc857, + 0x592c040b, 0x82000500, 0x00000003, 0x04000020, + 0x0201f800, 0x00107188, 0x04000021, 0x592c0205, + 0x492e6009, 0x82000500, 0x000000ff, 0x82000580, + 0x00000045, 0x0400000e, 0x592c000c, 0x0201f800, + 0x001054fb, 0x02000800, 0x00020319, 0x04020018, + 0x42027000, 0x00000041, 0x4936600a, 0x4a026407, + 0x00000001, 0x0201f000, 0x00020a34, 0x59300016, + 0x8400055e, 0x48026016, 0x42026800, 0x0010b976, + 0x42027000, 0x00000040, 0x0401f7f4, 0x4a025a07, + 0x00000101, 0x0201f000, 0x000203ab, 0x4a025a07, + 0x0000002c, 0x0201f000, 0x000203ab, 0x4a025a07, + 0x00000028, 0x0201f800, 0x000203ab, 0x0201f000, + 0x00020a10, 0x492fc857, 0x0201f800, 0x00105c21, + 0x0400000b, 0x592c0205, 0x80000110, 0x80000040, + 0x040204af, 0x592c0c07, 0x800409c0, 0x04000009, + 0x42000000, 0x00000102, 0x0401f003, 0x42000000, + 0x00000104, 0x48025a07, 0x0201f000, 0x000203ab, + 0x592c0c08, 0x800409c0, 0x04000020, 0x82040480, + 0x00000005, 0x0402101d, 0x4c040000, 0x80040800, + 0x0201f800, 0x00105c46, 0x5c001000, 0x04020014, + 0x832c0400, 0x00000009, 0x4000a000, 0x0201f800, + 0x00105c6f, 0x0402000e, 0x592c1208, 0x58c80c0b, + 0x84040d00, 0x84040d02, 0x8c081500, 0x04000002, + 0x84040d5e, 0x4805940b, 0x42000000, 0x00000000, + 0x48025a07, 0x0201f000, 0x000203ab, 0x42000000, + 0x00000103, 0x0401f7fb, 0x42000000, 0x00000102, + 0x0401f7f8, 0x492fc857, 0x592e7c07, 0x833c0500, + 0xfffffffe, 0x0402004a, 0x592c4008, 0x42026000, + 0x0010f694, 0x41581800, 0x400c0000, 0x81300480, + 0x04021029, 0x59300203, 0x82000580, 0x00000000, + 0x04000007, 0x59300009, 0x80000d40, 0x04000004, + 0x58040006, 0x80200580, 0x04000004, 0x83326400, + 0x00000024, 0x0401f7f1, 0x58040205, 0x82000500, + 0x000000ff, 0x82000d80, 0x00000053, 0x0400000d, + 0x82000d80, 0x00000048, 0x0400000a, 0x82000d80, + 0x00000018, 0x04000007, 0x82000d80, 0x00000029, + 0x04000004, 0x82000d80, 0x00000014, 0x040207ec, + 0x4d2c0000, 0x0201f800, 0x0010853c, 0x5c025800, + 0x0400001f, 0x4a025a07, 0x00000000, 0x0201f000, + 0x000203ab, 0x592e8a07, 0x83440480, 0x000007f0, + 0x04021017, 0x83440400, 0x0010b080, 0x50000000, + 0x80026d40, 0x04000012, 0x4d2c0000, 0x0201f800, + 0x0010402d, 0x0400000d, 0x42028000, 0x00000005, + 0x592c0a09, 0x417a6000, 0x0201f800, 0x00104543, + 0x0201f800, 0x00108b01, 0x0201f800, 0x000203ab, + 0x5c025800, 0x0401f7e4, 0x5c025800, 0x4a025a07, + 0x00000031, 0x0201f000, 0x000203ab, 0x492fc857, + 0x4d2c0000, 0x0201f800, 0x0010056f, 0x04000017, + 0x492fc857, 0x412f4000, 0x0201f800, 0x0010056f, + 0x0400000f, 0x492fc857, 0x412dd800, 0x0201f800, + 0x001032e0, 0x0201f800, 0x001032ea, 0x49a1d80a, + 0x5c025800, 0x492dd809, 0x48ef4006, 0x0201f800, + 0x00101c15, 0x0201f000, 0x00101c34, 0x41a25800, + 0x0201f800, 0x00100580, 0x5c025800, 0x4a025a07, + 0x00004005, 0x4a025c07, 0x00000002, 0x0201f000, + 0x000203ab, 0x4807c857, 0x485fc857, 0x4200b800, + 0x00000001, 0x5c000800, 0x4c5c0000, 0x0401f005, + 0x4807c857, 0x485fc857, 0x5c000800, 0x4d780000, + 0x4803c857, 0x492fc857, 0x8c00050e, 0x02020800, + 0x00100322, 0x4203e000, 0x50000000, 0x4200b800, + 0x00008003, 0x0201f000, 0x00100332, 0x80140110, + 0x80000040, 0x02020000, 0x00104c8b, 0x599c0019, + 0x8c000510, 0x0402000d, 0x0201f800, 0x001041df, + 0x04020002, 0x1c01f000, 0x49425a07, 0x4806580e, + 0x480a580f, 0x4943c857, 0x4807c857, 0x480bc857, + 0x0201f000, 0x000203ab, 0x592c040c, 0x82000500, + 0x0000e000, 0x82000580, 0x00006000, 0x040007ef, + 0x59a8021b, 0x8c000508, 0x040007ec, 0x592c120c, + 0x592c080b, 0x82040500, 0xff000000, 0x80040d80, + 0x80000110, 0x80081540, 0x04000004, 0x4806580b, + 0x0401f883, 0x0401f7e1, 0x42001000, 0x0000001c, + 0x42000800, 0x00000019, 0x42028000, 0x00000031, + 0x0401f7de, 0x80140110, 0x80000040, 0x02020000, + 0x00104c8b, 0x0201f800, 0x00104355, 0x04020002, + 0x1c01f000, 0x49425a07, 0x48065812, 0x480a5813, + 0x0201f000, 0x000203ab, 0x80140110, 0x02000000, + 0x00104c8b, 0x80000040, 0x0402000d, 0x4202e000, + 0x00000001, 0x592c020b, 0x8c000504, 0x02000000, + 0x0002068a, 0x592c0208, 0x82000c80, 0x00001001, + 0x02021000, 0x00104c9b, 0x0401f005, 0x4a033006, + 0x0002068a, 0x0201f000, 0x00020684, 0x592c1014, + 0x82080500, 0xffff0003, 0x02020000, 0x00104c9b, + 0x4202e000, 0x00000002, 0x42000000, 0x0010c35d, + 0x50007000, 0x592c0012, 0x592c0813, 0x48007006, + 0x48047007, 0x492c700a, 0x4978700d, 0x4978700b, + 0x0401f001, 0x4978700c, 0x82080480, 0x00000180, + 0x4803c857, 0x04001007, 0x4800700e, 0x4a007005, + 0x00000180, 0x4a007004, 0x00000060, 0x0401f005, + 0x4978700e, 0x48087005, 0x80081104, 0x48087004, + 0x58380009, 0x48007003, 0x40381000, 0x0201f000, + 0x00020016, 0x4df00000, 0x4203e000, 0x50000000, + 0x0201f800, 0x0010055a, 0x04000003, 0x59980005, + 0x0801f800, 0x5c03e000, 0x1c01f000, 0x0201f800, + 0x0010055a, 0x02000800, 0x0010032d, 0x4a025809, + 0x0010c2fc, 0x42000800, 0x0010c35d, 0x452c0800, + 0x497a580a, 0x497a580b, 0x497a580c, 0x497a580d, + 0x497a580e, 0x4a025808, 0x0002073d, 0x497a580f, + 0x4a025802, 0x00000100, 0x4a025801, 0x00000001, + 0x1c01f000, 0x0401f80c, 0x04000670, 0x4a025a09, + 0x00000001, 0x0201f000, 0x0010a4d8, 0x0401f806, + 0x04000665, 0x4a025a09, 0x00000006, 0x0201f000, + 0x0010a4d8, 0x59a80005, 0x8c00051a, 0x1c01f000, + 0x59a80005, 0x8c00051c, 0x1c01f000, 0x59a8000f, + 0x80080580, 0x04020002, 0x1c01f000, 0x480bc857, + 0x480b500f, 0x497b8830, 0x82080d40, 0x01000000, + 0x48078832, 0x59c40002, 0x8400054c, 0x48038802, + 0x42000800, 0x00000003, 0x0201f000, 0x001061d9, + 0x59c80007, 0x8c000502, 0x0400004f, 0x835c2c80, + 0x00000005, 0x02001000, 0x00105790, 0x59c82817, + 0x4817506c, 0x497b9005, 0x82140500, 0x00e00000, + 0x04020040, 0x82140500, 0x000003ff, 0x82001c00, + 0x00000006, 0x41cc2000, 0x42003000, 0x00006080, + 0x820c0480, 0x00000040, 0x04001006, 0x42001000, + 0x00000040, 0x820c1c80, 0x00000040, 0x0401f003, + 0x400c1000, 0x41781800, 0x54182000, 0x80102000, + 0x80183000, 0x80081040, 0x040207fc, 0x800c19c0, + 0x04000005, 0x59c80005, 0x80000000, 0x48039005, + 0x0401f7ea, 0x82140500, 0x000003ff, 0x800018c4, + 0x8c142d14, 0x04000005, 0x59cc0002, 0x82000500, + 0x00000003, 0x800c1c80, 0x480f505a, 0x82140500, + 0x01f60000, 0x04020010, 0x0201f800, 0x00105795, + 0x04020008, 0x4a039005, 0x00000140, 0x82140500, + 0x0e000000, 0x80000132, 0x0c01f815, 0x1c01f000, + 0x800001c0, 0x0402000b, 0x4a039005, 0x00000140, + 0x0401f00d, 0x4817c857, 0x82140500, 0x00f60000, + 0x04020004, 0x0201f800, 0x00105683, 0x040207eb, + 0x0201f800, 0x001057b9, 0x4a039005, 0x00000140, + 0x0401f03f, 0x4803c856, 0x1c01f000, 0x001051b1, + 0x00105505, 0x001051ab, 0x001051ab, 0x001051ab, + 0x001051ab, 0x001051ab, 0x001051ab, 0x4803c857, + 0x42000000, 0x0010bd14, 0x0201f800, 0x0010ae10, + 0x1c01f000, 0x59cc0002, 0x82000500, 0xff000000, + 0x82000580, 0xfe000000, 0x04020004, 0x0201f800, + 0x0010a824, 0x0401f025, 0x59cc0400, 0x82000d00, + 0x0000ff00, 0x82041500, 0x0000f000, 0x840409c0, + 0x82080580, 0x00002000, 0x04020013, 0x836c0580, + 0x00000001, 0x0402000e, 0x59cc0006, 0x82000500, + 0xff000000, 0x82000580, 0x11000000, 0x02020800, + 0x001003f4, 0x04020011, 0x0201f800, 0x0010331d, + 0x0201f800, 0x001057ee, 0x0401f00c, 0x0401f81f, + 0x0401f00a, 0x82080580, 0x00003000, 0x04020003, + 0x0401faa7, 0x0401f005, 0x82080580, 0x00008000, + 0x04020002, 0x0401fb8e, 0x1c01f000, 0x4817c857, + 0x42000000, 0x0010bd13, 0x0201f800, 0x0010ae10, + 0x836c0580, 0x00000003, 0x0402000b, 0x4c080000, + 0x4c0c0000, 0x42001000, 0x00008048, 0x40141800, + 0x80142120, 0x0201f800, 0x001031f5, 0x5c001800, + 0x5c001000, 0x1c01f000, 0x59cc0002, 0x82000500, + 0xff000000, 0x82001580, 0x01000000, 0x04000006, + 0x82001580, 0x23000000, 0x02020800, 0x001003f4, + 0x04020226, 0x59a8005a, 0x82000480, 0x00000004, + 0x04001222, 0x82040580, 0x00000023, 0x04020052, + 0x59cc0004, 0x4803c857, 0x59cc0006, 0x82000500, + 0xff000000, 0x59cc0801, 0x82040d00, 0x00ffffff, + 0x80040540, 0x4803c857, 0x0201f800, 0x00105616, + 0x02000800, 0x001003f4, 0x04000210, 0x59300c07, + 0x82040580, 0x00000010, 0x0400000f, 0x82040580, + 0x00000011, 0x0400000c, 0x82040580, 0x00000001, + 0x04000009, 0x82040580, 0x00000004, 0x04000006, + 0x82040580, 0x00000008, 0x02020800, 0x001003f4, + 0x040201fe, 0x59300004, 0x82000500, 0x80010000, + 0x04000006, 0x0201f800, 0x001064f2, 0x02020800, + 0x001003f4, 0x040201f5, 0x59cc0a04, 0x48066202, + 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, + 0x02000000, 0x04020005, 0x42027000, 0x00000015, + 0x0201f000, 0x00020a34, 0x82000d80, 0x02140000, + 0x040007fa, 0x82000d80, 0x02100000, 0x040007f7, + 0x82000d80, 0x02100000, 0x040007f4, 0x82000d80, + 0x01000000, 0x02020800, 0x001003f4, 0x040201db, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x02020800, + 0x001003f4, 0x040201d5, 0x59a8005a, 0x82000480, + 0x00000008, 0x040011d1, 0x42027000, 0x00000016, + 0x0401f7e4, 0x82040580, 0x00000022, 0x02020800, + 0x001003f4, 0x040201c9, 0x59cc0004, 0x4803c857, + 0x59cc0006, 0x4803c857, 0x59cc0001, 0x4803c857, + 0x59a8005a, 0x800001c0, 0x02000800, 0x001003f4, + 0x040001be, 0x59a80805, 0x8c040d14, 0x0400002f, + 0x0401f9e0, 0x0402002d, 0x0401f9f9, 0x0400002b, + 0x42027000, 0x0000004c, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x0201f800, 0x0010575c, 0x04000008, + 0x42028800, 0x0000ffff, 0x42026800, 0x0010c2b2, + 0x0201f800, 0x001044c5, 0x481a6802, 0x599c0019, + 0x8c000510, 0x0400018f, 0x59a8021b, 0x8c000508, + 0x0400018c, 0x59cc1006, 0x82081500, 0xffff0000, + 0x82081580, 0x03000000, 0x04020186, 0x83641480, + 0x00000010, 0x0400119e, 0x8400054c, 0x4803521b, + 0x59cc1000, 0x82081500, 0x00ffffff, 0x0401feb0, 0x59cc0007, 0x82000500, 0x0000ffff, 0x48038893, - 0x48035012, 0x42000800, 0x00000003, 0x59a8100f, - 0x0201f800, 0x00106134, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x02020800, 0x001003f4, 0x04020150, - 0x42027000, 0x00000017, 0x0401f10b, 0x0201f800, - 0x00104716, 0x040207f5, 0x8c000502, 0x040207f3, - 0x0401f147, 0x82000d80, 0x04000000, 0x04020018, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x02020800, - 0x001003f4, 0x0402013e, 0x0201f800, 0x00104716, - 0x04000004, 0x42027000, 0x0000001d, 0x0401f0f6, - 0x497b5064, 0x42001000, 0x0010eacd, 0x0201f800, - 0x001057cd, 0x59a8021b, 0x84000548, 0x4803521b, - 0x42027000, 0x00000030, 0x0401f0eb, 0x82000d80, - 0x05000000, 0x0402000a, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x02020800, 0x001003f4, 0x04020124, - 0x42027000, 0x00000018, 0x0401f0df, 0x82000d80, - 0x20100000, 0x04020004, 0x42027000, 0x00000019, - 0x0401f0d9, 0x82000d80, 0x21100000, 0x04020004, - 0x42027000, 0x0000001a, 0x0401f0d3, 0x82000d80, - 0x52000000, 0x0402000a, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x02020800, 0x001003f4, 0x0402010c, - 0x42027000, 0x0000001b, 0x0401f0c7, 0x82000d80, - 0x50000000, 0x0402000a, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x02020800, 0x001003f4, 0x04020100, - 0x42027000, 0x0000001c, 0x0401f0bb, 0x82000d80, - 0x13000000, 0x04020004, 0x42027000, 0x00000034, - 0x0401f0b5, 0x82000d80, 0x12000000, 0x0402000a, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x02020800, - 0x001003f4, 0x040200ee, 0x42027000, 0x00000024, - 0x0401f0a9, 0x82000d00, 0xff000000, 0x82040d80, - 0x24000000, 0x04020004, 0x42027000, 0x0000002d, - 0x0401f0a1, 0x82000d00, 0xff000000, 0x82040d80, - 0x53000000, 0x04020004, 0x42027000, 0x0000002a, - 0x0401f099, 0x82000d80, 0x0f000000, 0x04020004, - 0x42027000, 0x00000020, 0x0401f093, 0x82000d80, - 0x61040000, 0x0402004b, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x4c580000, 0x83ccc400, 0x00000006, - 0x8060b800, 0x50600000, 0x82000500, 0x0000ffff, - 0x82001480, 0x00000401, 0x04021036, 0x82001500, - 0x00000003, 0x04020033, 0x59a8105a, 0x80081480, - 0x04001030, 0x82000480, 0x00000004, 0x8000b104, - 0x8058b1c0, 0x0400002b, 0x505cc800, 0x8264c500, - 0x03000000, 0x8060c130, 0x42000000, 0x0010bbde, - 0x82602580, 0x00000000, 0x04020004, 0x42000000, - 0x0010bbdb, 0x0401f00c, 0x82602580, 0x00000001, - 0x04020004, 0x42000000, 0x0010bbdc, 0x0401f006, - 0x82602580, 0x00000002, 0x04020003, 0x42000000, - 0x0010bbdd, 0x0201f800, 0x0010ad1d, 0x42001000, - 0x00008015, 0x82642500, 0x0000ffff, 0x80641920, - 0x0201f800, 0x001031eb, 0x805cb800, 0x8058b040, - 0x040207de, 0x5c00b000, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x42027000, 0x00000023, 0x0401f04e, + 0x48035012, 0x0401f177, 0x59cc0006, 0x82000500, + 0xffff0000, 0x82000d80, 0x03000000, 0x04020029, + 0x59a8021b, 0x8c000508, 0x04000020, 0x8400054c, + 0x4803521b, 0x59cc0800, 0x82040d00, 0x00ffffff, + 0x4807500f, 0x497b8830, 0x84040d70, 0x48078832, + 0x59c40802, 0x84040d4c, 0x48078802, 0x59cc0007, + 0x82000500, 0x0000ffff, 0x48038893, 0x48035012, + 0x42000800, 0x00000003, 0x59a8100f, 0x0201f800, + 0x001061d9, 0x59cc0006, 0x82000500, 0x0000ffff, + 0x02020800, 0x001003f4, 0x04020168, 0x42027000, + 0x00000017, 0x0401f10b, 0x0201f800, 0x00104755, + 0x040207f5, 0x8c000502, 0x040207f3, 0x0401f15f, + 0x82000d80, 0x04000000, 0x04020018, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x02020800, 0x001003f4, + 0x04020156, 0x0201f800, 0x00104755, 0x04000002, + 0x0401f0f6, 0x497b5064, 0x42001000, 0x0010ebc8, + 0x0201f800, 0x00105872, 0x0201f800, 0x001044cf, + 0x59a8021b, 0x84000548, 0x4803521b, 0x42027000, + 0x00000030, 0x0401f0eb, 0x82000d80, 0x05000000, + 0x0402000a, 0x59cc0006, 0x82000500, 0x0000ffff, + 0x02020800, 0x001003f4, 0x0402013c, 0x42027000, + 0x00000018, 0x0401f0df, 0x82000d80, 0x20100000, + 0x04020004, 0x42027000, 0x00000019, 0x0401f0d9, + 0x82000d80, 0x21100000, 0x04020004, 0x42027000, + 0x0000001a, 0x0401f0d3, 0x82000d80, 0x52000000, + 0x0402000a, 0x59cc0006, 0x82000500, 0x0000ffff, + 0x02020800, 0x001003f4, 0x04020124, 0x42027000, + 0x0000001b, 0x0401f0c7, 0x82000d80, 0x50000000, + 0x0402000a, 0x59cc0006, 0x82000500, 0x0000ffff, + 0x02020800, 0x001003f4, 0x04020118, 0x42027000, + 0x0000001c, 0x0401f0bb, 0x82000d80, 0x13000000, + 0x04020004, 0x42027000, 0x00000034, 0x0401f0b5, + 0x82000d80, 0x12000000, 0x0402000a, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x02020800, 0x001003f4, + 0x04020106, 0x42027000, 0x00000024, 0x0401f0a9, + 0x82000d00, 0xff000000, 0x82040d80, 0x24000000, + 0x04020004, 0x42027000, 0x0000002d, 0x0401f0a1, + 0x82000d00, 0xff000000, 0x82040d80, 0x53000000, + 0x04020004, 0x42027000, 0x0000002a, 0x0401f099, + 0x82000d80, 0x0f000000, 0x04020004, 0x42027000, + 0x00000020, 0x0401f093, 0x82000d80, 0x61040000, + 0x0402004b, 0x4c5c0000, 0x4c600000, 0x4c640000, + 0x4c580000, 0x83ccc400, 0x00000006, 0x8060b800, + 0x50600000, 0x82000500, 0x0000ffff, 0x82001480, + 0x00000401, 0x04021036, 0x82001500, 0x00000003, + 0x04020033, 0x59a8105a, 0x80081480, 0x04001030, + 0x82000480, 0x00000004, 0x8000b104, 0x8058b1c0, + 0x0400002b, 0x505cc800, 0x8264c500, 0x03000000, + 0x8060c130, 0x42000000, 0x0010bcde, 0x82602580, + 0x00000000, 0x04020004, 0x42000000, 0x0010bcdb, + 0x0401f00c, 0x82602580, 0x00000001, 0x04020004, + 0x42000000, 0x0010bcdc, 0x0401f006, 0x82602580, + 0x00000002, 0x04020003, 0x42000000, 0x0010bcdd, + 0x0201f800, 0x0010ae10, 0x42001000, 0x00008015, + 0x82642500, 0x0000ffff, 0x80641920, 0x0201f800, + 0x001031f5, 0x805cb800, 0x8058b040, 0x040207de, 0x5c00b000, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x42000000, 0x0010bc11, 0x0201f000, 0x0010ad1d, - 0x82000d80, 0x60000000, 0x04020004, 0x42027000, - 0x0000003f, 0x0401f040, 0x82000d80, 0x54000000, - 0x04020008, 0x0401fb43, 0x02020800, 0x001003f4, - 0x0402007b, 0x42027000, 0x00000046, 0x0401f036, - 0x82000d80, 0x55000000, 0x04020009, 0x0401fb61, - 0x04020004, 0x42027000, 0x00000041, 0x0401f02e, - 0x42027000, 0x00000042, 0x0401f02b, 0x82000d80, - 0x78000000, 0x04020004, 0x42027000, 0x00000045, - 0x0401f025, 0x82000d80, 0x10000000, 0x04020004, - 0x42027000, 0x0000004e, 0x0401f01f, 0x82000d80, - 0x63000000, 0x04020004, 0x42027000, 0x0000004a, - 0x0401f019, 0x82000d00, 0xff000000, 0x82040d80, - 0x56000000, 0x04020004, 0x42027000, 0x0000004f, - 0x0401f011, 0x82000d00, 0xff000000, 0x82040d80, - 0x57000000, 0x04020004, 0x42027000, 0x00000050, - 0x0401f009, 0x82000d80, 0x7d000000, 0x04020004, - 0x42027000, 0x00000056, 0x0401f003, 0x42027000, - 0x0000001d, 0x59cc3800, 0x821c3d00, 0x00ffffff, - 0x821c0580, 0x00fffffe, 0x59cc0001, 0x04020005, - 0x40003000, 0x42028800, 0x000007fe, 0x0401f005, - 0x0401f8ec, 0x02020800, 0x001003f4, 0x04020034, - 0x0201f800, 0x00103dd0, 0x02020800, 0x001003f4, - 0x0402002f, 0x83380580, 0x00000046, 0x04020006, - 0x59a8000f, 0x80180580, 0x02000800, 0x001003f4, - 0x04000027, 0x59340200, 0x8c000514, 0x0400000f, - 0x83380580, 0x00000030, 0x0400000c, 0x83380580, - 0x0000003f, 0x04000009, 0x83380580, 0x00000034, - 0x04000006, 0x83380580, 0x00000024, 0x04000003, - 0x42027000, 0x0000004c, 0x0201f800, 0x001070f5, - 0x04000018, 0x4936600a, 0x4a026407, 0x00000004, - 0x59cc0c04, 0x48066202, 0x83380580, 0x0000004c, - 0x04020009, 0x4a026407, 0x00000011, 0x813669c0, + 0x42027000, 0x00000023, 0x0401f04e, 0x5c00b000, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x42000000, + 0x0010bd11, 0x0201f000, 0x0010ae10, 0x82000d80, + 0x60000000, 0x04020004, 0x42027000, 0x0000003f, + 0x0401f040, 0x82000d80, 0x54000000, 0x04020008, + 0x0401fb80, 0x02020800, 0x001003f4, 0x04020093, + 0x42027000, 0x00000046, 0x0401f036, 0x82000d80, + 0x55000000, 0x04020009, 0x0401fb9e, 0x04020004, + 0x42027000, 0x00000041, 0x0401f02e, 0x42027000, + 0x00000042, 0x0401f02b, 0x82000d80, 0x78000000, + 0x04020004, 0x42027000, 0x00000045, 0x0401f025, + 0x82000d80, 0x10000000, 0x04020004, 0x42027000, + 0x0000004e, 0x0401f01f, 0x82000d80, 0x63000000, + 0x04020004, 0x42027000, 0x0000004a, 0x0401f019, + 0x82000d00, 0xff000000, 0x82040d80, 0x56000000, + 0x04020004, 0x42027000, 0x0000004f, 0x0401f011, + 0x82000d00, 0xff000000, 0x82040d80, 0x57000000, + 0x04020004, 0x42027000, 0x00000050, 0x0401f009, + 0x82000d80, 0x7d000000, 0x04020004, 0x42027000, + 0x00000056, 0x0401f003, 0x42027000, 0x0000001d, + 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x821c0580, + 0x00fffffe, 0x59cc0001, 0x04020005, 0x40003000, + 0x42028800, 0x000007fe, 0x0401f01c, 0x0401f929, + 0x02020800, 0x001003f4, 0x0402004c, 0x83440480, + 0x000007f0, 0x04001001, 0x0201f800, 0x00103314, + 0x04000012, 0x4c180000, 0x0201f800, 0x00020319, + 0x5c003000, 0x04000012, 0x4c180000, 0x0401f865, + 0x5c003000, 0x04020009, 0x0201f800, 0x001044c5, + 0x42026800, 0x0010c2b2, 0x481a6802, 0x42028800, + 0x0000ffff, 0x0401f006, 0x0201f800, 0x00103de6, + 0x02020800, 0x001003f4, 0x04020030, 0x83380580, + 0x00000046, 0x04020006, 0x59a8000f, 0x80180580, + 0x02000800, 0x001003f4, 0x04000028, 0x59340200, + 0x8c000514, 0x0400000f, 0x83380580, 0x00000030, + 0x0400000c, 0x83380580, 0x0000003f, 0x04000009, + 0x83380580, 0x00000034, 0x04000006, 0x83380580, + 0x00000024, 0x04000003, 0x42027000, 0x0000004c, + 0x0201f800, 0x00107188, 0x04000019, 0x4936600a, + 0x4a026407, 0x00000004, 0x83340580, 0x0010c2b2, 0x04020005, 0x59cc0001, 0x82000500, 0x00ffffff, - 0x4802601f, 0x0201f000, 0x00020a34, 0x598800b7, - 0x4803c857, 0x80000000, 0x480310b7, 0x1c01f000, - 0x42001000, 0x00008049, 0x59cc1806, 0x800c1930, - 0x0201f800, 0x001031eb, 0x0201f800, 0x001070ff, - 0x02000800, 0x001003f4, 0x040007f1, 0x4936600a, - 0x4a026407, 0x00000004, 0x59cc0c04, 0x48066202, - 0x4a026403, 0x00000009, 0x4a02641b, 0x00000009, - 0x4a02621b, 0x00002900, 0x4a026203, 0x00000001, - 0x0201f000, 0x00105fe8, 0x59a8021b, 0x4803c857, - 0x8c000508, 0x04000013, 0x599c0019, 0x8c000510, - 0x04020010, 0x59cc0006, 0x82000500, 0xff000000, - 0x82000d80, 0x03000000, 0x0400000c, 0x82000d80, - 0x20000000, 0x04000009, 0x82000d80, 0x05000000, - 0x04000006, 0x82000d80, 0x21000000, 0x04000003, - 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, - 0x0401f7fd, 0x59cc2006, 0x82102500, 0xff000000, - 0x9c1021c0, 0x0401f807, 0x820c1c00, 0x0010b839, - 0x500c1800, 0x800c0500, 0x4803c857, 0x1c01f000, - 0x40100800, 0x41781800, 0x82040480, 0x00000020, - 0x04001004, 0x800c1800, 0x40000800, 0x0401f7fb, - 0x82040500, 0x0000000f, 0x82000400, 0x0010ae3e, - 0x50000000, 0x8c040d08, 0x04000002, 0x900001c0, - 0x1c01f000, 0x4803c856, 0x0401fae1, 0x0402000a, - 0x0201f800, 0x00101b05, 0x04020007, 0x59cc0002, - 0x82000500, 0xff000000, 0x82000d80, 0x08000000, - 0x04000802, 0x1c01f000, 0x4803c856, 0x59cc0400, - 0x82000d00, 0x0000ff00, 0x840409c0, 0x82040580, - 0x00000033, 0x04020027, 0x0401f964, 0x04000044, - 0x59cc0a04, 0x48066202, 0x59a8005a, 0x82000480, - 0x00000004, 0x0400103e, 0x59cc0006, 0x4803c857, - 0x82000500, 0xffff0000, 0x82000d80, 0x02000000, - 0x04020009, 0x59cc0006, 0x82000500, 0x0000ffff, - 0x04020033, 0x42027000, 0x00000015, 0x0201f000, - 0x00020a34, 0x82000d80, 0x01000000, 0x0402002c, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x04020028, - 0x59a8005a, 0x82000480, 0x00000008, 0x04001024, - 0x42027000, 0x00000016, 0x0201f000, 0x00020a34, - 0x82040580, 0x00000032, 0x0402001d, 0x59cc0006, - 0x82000500, 0xffff0000, 0x82000d80, 0x14000000, - 0x04020017, 0x59a8005a, 0x82000480, 0x00000010, - 0x04001013, 0x42027000, 0x00000038, 0x59cc0001, - 0x0401f813, 0x0402000e, 0x0201f800, 0x00103dcb, - 0x0402000b, 0x0201f800, 0x001070f5, 0x04000008, - 0x4936600a, 0x4a026407, 0x00000004, 0x59cc0c04, + 0x4802601f, 0x59cc0c04, 0x48066202, 0x83380580, + 0x0000004c, 0x04020003, 0x4a026407, 0x00000011, + 0x0201f000, 0x00020a34, 0x598800b7, 0x4803c857, + 0x80000000, 0x480310b7, 0x1c01f000, 0x42001000, + 0x00008049, 0x59cc1806, 0x800c1930, 0x0201f800, + 0x001031f5, 0x0201f800, 0x00107192, 0x02000800, + 0x001003f4, 0x040007f1, 0x4936600a, 0x83340580, + 0x0010c2b2, 0x04020005, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x4802601f, 0x4a026407, 0x00000004, + 0x59cc0c04, 0x48066202, 0x4a026403, 0x00000009, + 0x4a02641b, 0x00000009, 0x4a02621b, 0x00002900, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010608d, + 0x59a8021b, 0x4803c857, 0x8c000508, 0x04000013, + 0x599c0019, 0x8c000510, 0x04020010, 0x59cc0006, + 0x82000500, 0xff000000, 0x82000d80, 0x03000000, + 0x0400000c, 0x82000d80, 0x20000000, 0x04000009, + 0x82000d80, 0x05000000, 0x04000006, 0x82000d80, + 0x21000000, 0x04000003, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fd, 0x59cc2006, + 0x82102500, 0xff000000, 0x9c1021c0, 0x0401f807, + 0x820c1c00, 0x0010b939, 0x500c1800, 0x800c0500, + 0x4803c857, 0x1c01f000, 0x40100800, 0x41781800, + 0x82040480, 0x00000020, 0x04001004, 0x800c1800, + 0x40000800, 0x0401f7fb, 0x82040500, 0x0000000f, + 0x82000400, 0x0010af34, 0x50000000, 0x8c040d08, + 0x04000002, 0x900001c0, 0x1c01f000, 0x4803c856, + 0x0401faff, 0x0402000a, 0x0201f800, 0x00101b0a, + 0x04020007, 0x59cc0002, 0x82000500, 0xff000000, + 0x82000d80, 0x08000000, 0x04000802, 0x1c01f000, + 0x4803c856, 0x59cc0400, 0x82000d00, 0x0000ff00, + 0x840409c0, 0x82040580, 0x00000033, 0x04020027, + 0x0401f982, 0x04000062, 0x59cc0a04, 0x48066202, + 0x59a8005a, 0x82000480, 0x00000004, 0x0400105c, + 0x59cc0006, 0x4803c857, 0x82000500, 0xffff0000, + 0x82000d80, 0x02000000, 0x04020009, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x04020051, 0x42027000, + 0x00000015, 0x0201f000, 0x00020a34, 0x82000d80, + 0x01000000, 0x0402004a, 0x59cc0006, 0x82000500, + 0x0000ffff, 0x04020046, 0x59a8005a, 0x82000480, + 0x00000008, 0x04001042, 0x42027000, 0x00000016, + 0x0201f000, 0x00020a34, 0x82040580, 0x00000032, + 0x0402003b, 0x59cc0006, 0x82000500, 0xffff0000, + 0x82000d80, 0x14000000, 0x04020035, 0x59a8005a, + 0x82000480, 0x00000010, 0x04001031, 0x42027000, + 0x00000038, 0x59cc0001, 0x0401f831, 0x0402002c, + 0x83440480, 0x000007f0, 0x04001001, 0x0201f800, + 0x00103314, 0x04000012, 0x4c180000, 0x0201f800, + 0x00020319, 0x5c003000, 0x04000010, 0x4c180000, + 0x0401ff70, 0x5c003000, 0x04020009, 0x0201f800, + 0x001044c5, 0x42026800, 0x0010c2b2, 0x481a6802, + 0x42028800, 0x0000ffff, 0x0401f004, 0x0201f800, + 0x00103de1, 0x04020012, 0x0201f800, 0x00107188, + 0x0400000f, 0x4936600a, 0x83340580, 0x0010c2b2, + 0x04020005, 0x59cc0001, 0x82000500, 0x00ffffff, + 0x4802601f, 0x4a026407, 0x00000004, 0x59cc0c04, 0x48066202, 0x0201f000, 0x00020a34, 0x42000000, - 0x0010bc11, 0x0201f000, 0x0010ad1d, 0x4803c857, + 0x0010bd11, 0x0201f000, 0x0010ae10, 0x4803c857, 0x4000d000, 0x82003500, 0x00ffffff, 0x0201f800, - 0x0010f02b, 0x40c40000, 0x82000580, 0x00000001, + 0x0010f133, 0x40c40000, 0x82000580, 0x00000001, 0x1c01f000, 0x59a8021b, 0x8c00050e, 0x04000003, 0x8c000502, 0x04000006, 0x59cc0c00, 0x80040910, 0x82040500, 0x0000000f, 0x0c01f002, 0x1c01f000, - 0x001054b4, 0x001054b4, 0x001054b4, 0x001055b8, - 0x001054b4, 0x001054b6, 0x001054db, 0x001054de, - 0x001054b4, 0x001054b4, 0x001054b4, 0x001054b4, - 0x001054b4, 0x001054b4, 0x001054b4, 0x001054b4, + 0x00105520, 0x00105520, 0x00105520, 0x00105624, + 0x00105520, 0x00105522, 0x00105547, 0x0010554a, + 0x00105520, 0x00105520, 0x00105520, 0x00105520, + 0x00105520, 0x00105520, 0x00105520, 0x00105520, 0x4803c856, 0x1c01f000, 0x0401f8f4, 0x0400001e, 0x59a8005a, 0x82000480, 0x0000000c, 0x0400101a, 0x59300407, 0x82000580, 0x00000003, 0x04020016, @@ -5464,7 +5486,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x0000ffff, 0x04000003, 0x80040580, 0x04020006, 0x48066202, 0x42027000, 0x00000046, 0x0201f000, 0x00020a34, 0x59cc0004, 0x4803c857, 0x42000000, - 0x0010bc12, 0x0201f000, 0x0010ad1d, 0x59cc0004, + 0x0010bd12, 0x0201f000, 0x0010ae10, 0x59cc0004, 0x4803c857, 0x1c01f000, 0x0401f8cc, 0x0400001a, 0x59a8005a, 0x82000480, 0x0000000c, 0x04001016, 0x59300407, 0x82000580, 0x00000003, 0x04020012, @@ -5473,21 +5495,21 @@ static const uint32_t isp_2400_risc_code[] = { 0x00ffffff, 0x80040580, 0x04020007, 0x59cc0a04, 0x48066202, 0x42027000, 0x00000045, 0x0201f000, 0x00020a34, 0x59cc0004, 0x4803c857, 0x42000000, - 0x0010bc12, 0x0201f000, 0x0010ad1d, 0x59cc0004, + 0x0010bd12, 0x0201f000, 0x0010ae10, 0x59cc0004, 0x4803c857, 0x59cc0000, 0x82000500, 0xff000000, 0x59cc1001, 0x82081500, 0x00ffffff, 0x80080540, 0x4803c857, 0x4817c857, 0x0401fa09, 0x02020800, - 0x001003f4, 0x04020016, 0x0201f800, 0x00101b05, + 0x001003f4, 0x04020016, 0x0201f800, 0x00101b0a, 0x02020800, 0x001003f4, 0x04020011, 0x59cc0002, 0x82000500, 0xff000000, 0x82000580, 0x00000000, 0x02020800, 0x001003f4, 0x04020009, 0x82040500, 0x0000000f, 0x82000c80, 0x00000006, 0x02021800, 0x001003f4, 0x04021002, 0x0c01f003, 0x4803c856, - 0x1c01f000, 0x0010552b, 0x0010552d, 0x0010552b, - 0x0010552b, 0x00105581, 0x00105590, 0x4803c856, + 0x1c01f000, 0x00105597, 0x00105599, 0x00105597, + 0x00105597, 0x001055ed, 0x001055fc, 0x4803c856, 0x1c01f000, 0x59a8005a, 0x800001c0, 0x02020800, 0x001003f4, 0x040207fa, 0x59cc0802, 0x4807c856, - 0x8c040d2e, 0x0402001b, 0x42026000, 0x0010f53c, + 0x8c040d2e, 0x0402001b, 0x42026000, 0x0010f64c, 0x59cc0001, 0x0401ff56, 0x0402000d, 0x0201f800, 0x00020319, 0x0402000a, 0x4a026407, 0x00000005, 0x4a026203, 0x00000008, 0x4936600a, 0x42027000, @@ -5495,15 +5517,15 @@ static const uint32_t isp_2400_risc_code[] = { 0x42028800, 0x0000ffff, 0x417a6800, 0x59cc0001, 0x82000500, 0x00ffffff, 0x4802601f, 0x0401f7ef, 0x59cc0001, 0x4803c857, 0x0401ff3d, 0x02020800, - 0x001003f4, 0x040207d6, 0x0201f800, 0x00103dcb, + 0x001003f4, 0x040207d6, 0x0201f800, 0x00103de1, 0x02020800, 0x001003f4, 0x040207d1, 0x59cc0005, 0x8c000500, 0x04020006, 0x59340200, 0x8c00050e, 0x02020800, 0x001003f4, 0x040207c9, 0x0201f800, - 0x00104178, 0x04020010, 0x0401f844, 0x02000800, - 0x001003f4, 0x040007c2, 0x42026000, 0x0010f53c, + 0x00104194, 0x04020010, 0x0401f844, 0x02000800, + 0x001003f4, 0x040007c2, 0x42026000, 0x0010f64c, 0x4936600a, 0x4a026407, 0x00000002, 0x4a026203, 0x00000008, 0x42027000, 0x00000088, 0x0201f000, - 0x00020a34, 0x0201f800, 0x001070f5, 0x040007b4, + 0x00020a34, 0x0201f800, 0x00107188, 0x040007b4, 0x4936600a, 0x4a026407, 0x00000004, 0x59cc0c04, 0x48066202, 0x42027000, 0x00000001, 0x0201f000, 0x00020a34, 0x59cc0802, 0x8c040d2e, 0x0400000b, @@ -5515,11 +5537,11 @@ static const uint32_t isp_2400_risc_code[] = { 0x0400000b, 0x0401f811, 0x04000009, 0x0401f982, 0x04020007, 0x59cc0a04, 0x48066202, 0x42027000, 0x0000008a, 0x0201f000, 0x00020a34, 0x4933c857, - 0x42000000, 0x0010bc11, 0x0201f000, 0x0010ad1d, + 0x42000000, 0x0010bd11, 0x0201f000, 0x0010ae10, 0x59cc0a04, 0x0401f002, 0x59cc0c04, 0x59a8000d, 0x59a8104f, 0x80080400, 0x80040480, 0x04021007, 0x800400c4, 0x800408ca, 0x80040c00, 0x82066400, - 0x0010f584, 0x1c01f000, 0x80000580, 0x0401f7fe, + 0x0010f694, 0x1c01f000, 0x80000580, 0x0401f7fe, 0x59cc0802, 0x8c040d2e, 0x04020019, 0x0401ffed, 0x04000017, 0x59300407, 0x82000580, 0x00000006, 0x04020013, 0x59cc0001, 0x82000500, 0x00ffffff, @@ -5527,22 +5549,22 @@ static const uint32_t isp_2400_risc_code[] = { 0x82040d00, 0x00ffffff, 0x80040580, 0x04020008, 0x59a8005a, 0x800001c0, 0x04020005, 0x42027000, 0x00000051, 0x0201f000, 0x00020a34, 0x59cc0004, - 0x4803c857, 0x42000000, 0x0010bc12, 0x0201f000, - 0x0010ad1d, 0x4803c856, 0x42003000, 0x00000105, + 0x4803c857, 0x42000000, 0x0010bd12, 0x0201f000, + 0x0010ae10, 0x4803c856, 0x42003000, 0x00000105, 0x0401f001, 0x481bc857, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x41ccc800, 0x4014b800, 0x4018c000, 0x0401f805, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4c580000, 0x58640400, 0x82000500, 0x0000f000, 0x82000580, 0x0000c000, - 0x04000022, 0x0201f800, 0x001070f5, 0x0400001f, + 0x04000022, 0x0201f800, 0x00107188, 0x0400001f, 0x58640001, 0x0401fe9a, 0x0402001e, 0x0201f800, - 0x00103dcb, 0x0402001b, 0x4936600a, 0x0201f800, + 0x00103de1, 0x0402001b, 0x4936600a, 0x0201f800, 0x0010056f, 0x04000017, 0x492e6018, 0x497a5800, 0x497a5a05, 0x485e5c05, 0x832cac00, 0x00000006, 0x4200b000, 0x00000007, 0x4064a000, 0x0201f800, - 0x0010adef, 0x4862641b, 0x4a026403, 0x0000003e, + 0x0010aee2, 0x4862641b, 0x4a026403, 0x0000003e, 0x4a026407, 0x00000001, 0x4a026203, 0x00000001, - 0x0201f800, 0x00105fe8, 0x5c00b000, 0x1c01f000, + 0x0201f800, 0x0010608d, 0x5c00b000, 0x1c01f000, 0x0201f800, 0x00020a10, 0x0401f7fc, 0x4803c856, 0x59cc0400, 0x82000d00, 0x0000ff00, 0x82040500, 0x0000f000, 0x840409c0, 0x82000580, 0x00002000, @@ -5555,8 +5577,8 @@ static const uint32_t isp_2400_risc_code[] = { 0x04000055, 0x82000d80, 0x03000000, 0x0402001b, 0x59a80a1b, 0x8c040d02, 0x0402004f, 0x8c040d08, 0x0402004d, 0x82000d80, 0x03000000, 0x04020004, - 0x0201f800, 0x00104716, 0x04000047, 0x0201f800, - 0x001040cb, 0x04000047, 0x59a80018, 0x800000d0, + 0x0201f800, 0x00104755, 0x04000047, 0x0201f800, + 0x001040e5, 0x04000047, 0x59a80018, 0x800000d0, 0x59a8080f, 0x82040d00, 0x000000ff, 0x80040540, 0x59cc0800, 0x82040d00, 0x00ffffff, 0x80040580, 0x04020018, 0x0401f038, 0x59c40802, 0x8c040d0c, @@ -5567,8 +5589,8 @@ static const uint32_t isp_2400_risc_code[] = { 0x59300c03, 0x82040580, 0x00000002, 0x04000022, 0x59a80073, 0x8c00053e, 0x0400001d, 0x59cc0800, 0x82040d00, 0x00ffffff, 0x82040580, 0x0000fc0e, - 0x04000019, 0x4c040000, 0x42000000, 0x0010bcaa, - 0x0201f800, 0x0010ad1d, 0x0201f800, 0x000209ee, + 0x04000019, 0x4c040000, 0x42000000, 0x0010bdaa, + 0x0201f800, 0x0010ae10, 0x0201f800, 0x000209ee, 0x5c000800, 0x0400000e, 0x59aa6874, 0x4936600a, 0x4a026407, 0x00000012, 0x42027000, 0x000000d2, 0x48066019, 0x4a02601a, 0x00000000, 0x4a02601b, @@ -5583,9 +5605,9 @@ static const uint32_t isp_2400_risc_code[] = { 0x9c5cb9c0, 0x825cbd00, 0x00000007, 0x8c5cbd00, 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, 0x00000002, 0x83cc1400, 0x0000000d, 0x0201f800, - 0x00107d52, 0x04020010, 0x8c5cbd02, 0x0400000a, + 0x00107df9, 0x04020010, 0x8c5cbd02, 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, 0x00000000, - 0x83cc1400, 0x0000000f, 0x0201f800, 0x00107d52, + 0x83cc1400, 0x0000000f, 0x0201f800, 0x00107df9, 0x04020005, 0x8c5cbd04, 0x04000003, 0x82000540, 0x00000001, 0x5c00b000, 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4c5c0000, 0x4c580000, 0x59a8005a, @@ -5593,9 +5615,9 @@ static const uint32_t isp_2400_risc_code[] = { 0x9c5cb9c0, 0x825cbd00, 0x00000007, 0x8c5cbd00, 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, 0x00000002, 0x83cc1400, 0x00000009, 0x0201f800, - 0x00107d52, 0x04020010, 0x8c5cbd02, 0x0400000a, + 0x00107df9, 0x04020010, 0x8c5cbd02, 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, 0x00000000, - 0x83cc1400, 0x0000000b, 0x0201f800, 0x00107d52, + 0x83cc1400, 0x0000000b, 0x0201f800, 0x00107df9, 0x04020005, 0x8c5cbd04, 0x04000003, 0x82000540, 0x00000001, 0x5c00b000, 0x5c00b800, 0x1c01f000, 0x4803c857, 0x4c580000, 0x40003000, 0x42002000, @@ -5612,2199 +5634,2213 @@ static const uint32_t isp_2400_risc_code[] = { 0x0401f7fd, 0x59300c07, 0x82040580, 0x00000002, 0x04000003, 0x82040580, 0x00000005, 0x1c01f000, 0x59c80000, 0x84000558, 0x84000512, 0x48039000, - 0x1c01f000, 0x4a032824, 0x000003e8, 0x4a032802, - 0x0010f584, 0x4a032800, 0x00000000, 0x4a032808, - 0x0010663d, 0x42000000, 0x00000005, 0x83947c00, - 0x00000009, 0x49787801, 0x4a007804, 0x00106500, - 0x823c7c00, 0x00000005, 0x80000040, 0x040207fa, - 0x4a032823, 0xffff0000, 0x4201d000, 0x00000064, - 0x0401fa0f, 0x4201d000, 0x000186a0, 0x0401f21e, - 0x00000000, 0x00000005, 0x0000000a, 0x0000000f, - 0x00000014, 0x4d300000, 0x4d2c0000, 0x4d340000, - 0x4d400000, 0x4cfc0000, 0x4d380000, 0x4d3c0000, - 0x4d440000, 0x4d4c0000, 0x4d480000, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x4cc80000, 0x4ccc0000, - 0x0201f800, 0x00020814, 0x5c019800, 0x5c019000, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c029000, - 0x5c029800, 0x5c028800, 0x5c027800, 0x5c027000, - 0x5c01f800, 0x5c028000, 0x5c026800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x59940031, 0x59940832, - 0x80040480, 0x48032832, 0x04001002, 0x04020034, - 0x59bc00e4, 0x8c000530, 0x04000009, 0x4a030000, - 0x00000000, 0x4803c856, 0x4a0378e4, 0x02000000, - 0x4a032832, 0x000004b0, 0x0401f029, 0x42000800, - 0x00000100, 0x80040840, 0x040007f5, 0x0201f800, - 0x0010ae33, 0x040007fc, 0x0201f800, 0x0010610d, - 0x4df00000, 0x4d180000, 0x42023000, 0x00000005, - 0x0201f800, 0x00100d87, 0x5c023000, 0x0201f800, - 0x00100636, 0x42000800, 0x00007a00, 0x58040015, - 0x82000500, 0xffff8fff, 0x59a81075, 0x80080540, - 0x48000815, 0x4a030000, 0x00000000, 0x497b2832, - 0x4a0378e4, 0x02800000, 0x0201f800, 0x00100de5, - 0x5c03e000, 0x02000800, 0x001060fa, 0x42000000, - 0x0010bcb0, 0x0201f800, 0x0010ad1d, 0x1c01f000, - 0x59940004, 0x80000540, 0x0402000a, 0x5994002f, - 0x80040400, 0x02001800, 0x0010032d, 0x48032804, - 0x480b2805, 0x4a032803, 0x0000000a, 0x80000580, - 0x1c01f000, 0x59940029, 0x80000540, 0x0402000a, + 0x1c01f000, 0x82140500, 0x0000f000, 0x04000006, + 0x82000c80, 0x00002000, 0x0402100a, 0x80000580, + 0x1c01f000, 0x59cc0400, 0x82000500, 0x0000ff00, + 0x82000580, 0x00008100, 0x040007fa, 0x0401f014, + 0x4817c857, 0x82140500, 0x000003ff, 0x04020007, + 0x59cc0400, 0x82000500, 0x0000ff00, 0x82000580, + 0x00008100, 0x0402000a, 0x42000000, 0x0010bd77, + 0x0201f800, 0x0010ae10, 0x0401fe93, 0x4803c856, + 0x82000540, 0x00000001, 0x0401f7e6, 0x41780000, + 0x0401f7e4, 0x0201f800, 0x00104755, 0x04000010, + 0x59c400a4, 0x4803c857, 0x82000500, 0x0000000f, + 0x82000580, 0x0000000a, 0x04020009, 0x497b505a, + 0x59c400a3, 0x82000540, 0x00080000, 0x480388a3, + 0x82000500, 0xfff7ffff, 0x480388a3, 0x4817c856, + 0x0201f000, 0x0010ad55, 0x4a032824, 0x000003e8, + 0x4a032802, 0x0010f694, 0x4a032800, 0x00000000, + 0x4a032808, 0x001066e2, 0x42000000, 0x00000005, + 0x83947c00, 0x00000009, 0x49787801, 0x4a007804, + 0x001065a5, 0x823c7c00, 0x00000005, 0x80000040, + 0x040207fa, 0x4a032823, 0xffff0000, 0x4201d000, + 0x00000064, 0x0401fa0f, 0x4201d000, 0x000186a0, + 0x0401f21e, 0x00000000, 0x00000005, 0x0000000a, + 0x0000000f, 0x00000014, 0x4d300000, 0x4d2c0000, + 0x4d340000, 0x4d400000, 0x4cfc0000, 0x4d380000, + 0x4d3c0000, 0x4d440000, 0x4d4c0000, 0x4d480000, + 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4cc80000, + 0x4ccc0000, 0x0201f800, 0x00020814, 0x5c019800, + 0x5c019000, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x5c029000, 0x5c029800, 0x5c028800, 0x5c027800, + 0x5c027000, 0x5c01f800, 0x5c028000, 0x5c026800, + 0x5c025800, 0x5c026000, 0x1c01f000, 0x59940031, + 0x59940832, 0x80040480, 0x48032832, 0x04001002, + 0x04020034, 0x59bc00e4, 0x8c000530, 0x04000009, + 0x4a030000, 0x00000000, 0x4803c856, 0x4a0378e4, + 0x02000000, 0x4a032832, 0x000004b0, 0x0401f029, + 0x42000800, 0x00000100, 0x80040840, 0x040007f5, + 0x0201f800, 0x0010af26, 0x040007fc, 0x0201f800, + 0x001061b2, 0x4df00000, 0x4d180000, 0x42023000, + 0x00000005, 0x0201f800, 0x00100d88, 0x5c023000, + 0x0201f800, 0x00100636, 0x42000800, 0x00007a00, + 0x58040015, 0x82000500, 0xffff8fff, 0x59a81075, + 0x80080540, 0x48000815, 0x4a030000, 0x00000000, + 0x497b2832, 0x4a0378e4, 0x02800000, 0x0201f800, + 0x00100de6, 0x5c03e000, 0x02000800, 0x0010619f, + 0x42000000, 0x0010bdb0, 0x0201f800, 0x0010ae10, + 0x1c01f000, 0x59940004, 0x80000540, 0x0402000a, 0x5994002f, 0x80040400, 0x02001800, 0x0010032d, - 0x48032829, 0x480b282a, 0x4a032828, 0x00000001, - 0x80000580, 0x1c01f000, 0x40680800, 0x406c1000, - 0x5994002c, 0x80000540, 0x0402000a, 0x5994002f, - 0x80040400, 0x02001800, 0x0010032d, 0x4803282c, - 0x480b282d, 0x4a03282b, 0x0000000a, 0x80000580, - 0x1c01f000, 0x4c000000, 0x59940005, 0x80080580, - 0x04020003, 0x497b2804, 0x497b2805, 0x5c000000, - 0x1c01f000, 0x40681000, 0x0401fff7, 0x1c01f000, - 0x4c000000, 0x5994002a, 0x80080580, 0x04020003, - 0x497b2829, 0x497b282a, 0x5c000000, 0x1c01f000, - 0x4c000000, 0x5994002d, 0x80080580, 0x04020003, - 0x497b282c, 0x497b282d, 0x5c000000, 0x1c01f000, - 0x4937c857, 0x48ebc857, 0x59340203, 0x80e80480, - 0x04001002, 0x48ea6a03, 0x1c01f000, 0x4d440000, - 0x42007800, 0x00000010, 0x59968801, 0x0201f800, - 0x00020319, 0x04020056, 0x59341a03, 0x800c1840, - 0x04001017, 0x59940031, 0x800c0480, 0x04000003, - 0x48026a03, 0x04021012, 0x5934000f, 0x497a6a03, - 0x80000540, 0x0400004a, 0x5934000b, 0x80001120, - 0x82000500, 0x0000ffff, 0x80080480, 0x04001004, - 0x4a026a03, 0x00000001, 0x0401f005, 0x4c3c0000, - 0x0201f800, 0x00020327, 0x5c007800, 0x4d2c0000, - 0x41781800, 0x5934000f, 0x80025d40, 0x04000037, - 0x592c0004, 0x80000d40, 0x04000006, 0x59940031, - 0x80040480, 0x48025804, 0x04001007, 0x04000006, - 0x412c1800, 0x592c0000, 0x80025d40, 0x0400002b, - 0x0401f7f4, 0x592c2000, 0x497a5800, 0x800c19c0, - 0x04020009, 0x59340010, 0x812c0580, 0x04020004, - 0x497a680f, 0x497a6810, 0x0401f008, 0x4812680f, - 0x0401f006, 0x48101800, 0x59340010, 0x812c0580, - 0x04020002, 0x480e6810, 0x592c0205, 0x82000500, - 0x000000ff, 0x82000580, 0x00000012, 0x04020004, - 0x4a025a07, 0x0000000b, 0x0401f008, 0x4a025a05, - 0x00000103, 0x4a025a07, 0x00000006, 0x497a580a, - 0x4a025c07, 0x0000ffff, 0x4c0c0000, 0x4c100000, - 0x0201f800, 0x000203ab, 0x5c002000, 0x5c001800, - 0x40100000, 0x0401f7d5, 0x5c025800, 0x81468800, - 0x83440480, 0x00000800, 0x04021007, 0x803c7840, - 0x040207a3, 0x49472801, 0x5c028800, 0x5c03e000, - 0x1c01f000, 0x4a032800, 0x00000002, 0x497b2801, - 0x0401f7fa, 0x42007800, 0x00000010, 0x59966002, - 0x59300205, 0x80000d40, 0x04000006, 0x59940031, - 0x80040480, 0x48026205, 0x0400102d, 0x0400002c, - 0x59300006, 0x80000d40, 0x04000014, 0x59b800e4, - 0x8c000524, 0x04020011, 0x4a0370e4, 0x00030000, - 0x40000000, 0x59b800e4, 0x8c000524, 0x04000004, - 0x4a0370e4, 0x00020000, 0x0401f008, 0x59940031, - 0x80040480, 0x48026006, 0x4a0370e4, 0x00020000, - 0x0400101c, 0x0400001b, 0x83326400, 0x00000024, - 0x49332802, 0x41540000, 0x81300480, 0x04021005, - 0x803c7840, 0x040207db, 0x5c03e000, 0x1c01f000, - 0x59940030, 0x48032831, 0x4a032802, 0x0010f584, - 0x497b2830, 0x80000540, 0x0400000f, 0x4a032800, - 0x00000001, 0x5c03e000, 0x1c01f000, 0x4c3c0000, - 0x0201f800, 0x00108a77, 0x5c007800, 0x0401f7d1, - 0x4c3c0000, 0x0201f800, 0x00108630, 0x5c007800, - 0x0401f7e2, 0x4a032800, 0x00000000, 0x5c03e000, - 0x1c01f000, 0x59a80859, 0x8c040d30, 0x04020029, - 0x8c040d32, 0x0400000f, 0x59a80050, 0x81640480, - 0x04001019, 0x59a8000b, 0x81500580, 0x04000005, - 0x59a8004e, 0x59a8104d, 0x80080580, 0x04020012, - 0x900411c0, 0x82081500, 0x00007000, 0x0401f012, - 0x82040500, 0x0000001f, 0x04000016, 0x80040840, - 0x82040500, 0x0000001f, 0x04000003, 0x48075059, - 0x0401f010, 0x900401c0, 0x82000500, 0x0000001f, - 0x80040d40, 0x900401c0, 0x80040580, 0x82001500, - 0x00007000, 0x82040500, 0xffff8fff, 0x80080540, - 0x48035059, 0x80081114, 0x0201f800, 0x00100462, - 0x1c01f000, 0x4a032807, 0x000007d0, 0x4a032806, - 0x0000000a, 0x1c01f000, 0x42000800, 0x00000004, - 0x83180480, 0x00000005, 0x02021800, 0x0010032d, - 0x83947c00, 0x00000009, 0x83180400, 0x00105744, - 0x50000000, 0x803c7c00, 0x4a007801, 0x000001f4, - 0x48047802, 0x4a007800, 0x0000000a, 0x49787803, - 0x1c01f000, 0x83180480, 0x00000005, 0x02021800, - 0x0010032d, 0x83947c00, 0x00000009, 0x83180400, - 0x00105744, 0x50000000, 0x803c7c00, 0x583c0002, - 0x80000040, 0x48007802, 0x04000005, 0x4a007801, - 0x000001f4, 0x4a007800, 0x0000000a, 0x1c01f000, - 0x83180480, 0x00000005, 0x02021800, 0x0010032d, - 0x83947c00, 0x00000009, 0x83180400, 0x00105744, - 0x50000000, 0x803c7c00, 0x49787801, 0x1c01f000, - 0x40680800, 0x406c1000, 0x0401f802, 0x1c01f000, - 0x4807c857, 0x480bc857, 0x5994002f, 0x80040400, - 0x02001800, 0x0010032d, 0x48032804, 0x480b2805, - 0x4a032803, 0x0000000a, 0x1c01f000, 0x4807c857, - 0x480bc857, 0x5994002f, 0x80040400, 0x02001800, - 0x0010032d, 0x48032826, 0x480b2827, 0x4a032825, - 0x0000000a, 0x1c01f000, 0x4c000000, 0x59940027, - 0x80080580, 0x04020003, 0x48032826, 0x48032827, - 0x5c000000, 0x1c01f000, 0x4807c857, 0x480bc857, + 0x48032804, 0x480b2805, 0x4a032803, 0x0000000a, + 0x80000580, 0x1c01f000, 0x59940029, 0x80000540, + 0x0402000a, 0x5994002f, 0x80040400, 0x02001800, + 0x0010032d, 0x48032829, 0x480b282a, 0x4a032828, + 0x00000001, 0x80000580, 0x1c01f000, 0x40680800, + 0x406c1000, 0x5994002c, 0x80000540, 0x0402000a, 0x5994002f, 0x80040400, 0x02001800, 0x0010032d, 0x4803282c, 0x480b282d, 0x4a03282b, 0x0000000a, - 0x1c01f000, 0x80e9d1c0, 0x0400000e, 0x0401f832, - 0x04025000, 0x4203e000, 0x80000000, 0x40e81000, - 0x41780800, 0x42000000, 0x00000064, 0x0201f800, - 0x00105f69, 0x5994002e, 0x80080400, 0x4803282e, - 0x1c01f000, 0x42001000, 0x00104632, 0x0401fe8e, - 0x42001000, 0x00104621, 0x0401ffd8, 0x42001000, - 0x0010391c, 0x0401fe88, 0x42001000, 0x0010399e, - 0x0401fe85, 0x42001000, 0x001038f5, 0x0401fe82, - 0x42001000, 0x001039d5, 0x0401f692, 0x4203e000, - 0x70000000, 0x4203e000, 0xb0300000, 0x40ebf800, - 0x42000000, 0x0000003c, 0x04004004, 0x80000040, - 0x040207fe, 0x0401f007, 0x4203e000, 0x70000000, - 0x42000000, 0x0010bc38, 0x0201f800, 0x0010ad1d, - 0x1c01f000, 0x4203e000, 0x80000000, 0x4203e000, - 0xb0400000, 0x40ebf800, 0x42000000, 0x0000003c, - 0x04005004, 0x80000040, 0x040207fe, 0x0401f007, - 0x4203e000, 0x80000000, 0x42000000, 0x0010bc39, - 0x0201f800, 0x0010ad1d, 0x1c01f000, 0x59a8080d, - 0x59a80251, 0x80040480, 0x599c0a02, 0x800409c0, - 0x04020002, 0x80040800, 0x80041480, 0x04001002, - 0x40000800, 0x4807504f, 0x59a8100d, 0x40040000, - 0x800acc80, 0x4967500d, 0x49675050, 0x59aaa80b, - 0x41640800, 0x42001000, 0x00000024, 0x0201f800, - 0x00105f4a, 0x8206a400, 0x0010f584, 0x4953504c, - 0x4152b000, 0x42006000, 0x0010c1e7, 0x4a006005, - 0x0000012c, 0x4a006006, 0xda10da10, 0x4a006009, - 0x00000012, 0x4a00600a, 0x0010c1e7, 0x4a00600b, - 0x00100e34, 0x599c0014, 0x48006012, 0x599c0015, - 0x48006013, 0x42006000, 0x0010f4f4, 0x4a006203, - 0x00000008, 0x4a006407, 0x00000006, 0x4a006002, - 0xffff0000, 0x4a006009, 0x0010c1e7, 0x4a006015, - 0x0010c1e7, 0x599c0014, 0x48006016, 0x599c0015, - 0x48006017, 0x599c0413, 0x48006018, 0x49506019, - 0x4954601a, 0x59a8004f, 0x4800601b, 0x4a00601c, - 0x0010b7cc, 0x4a00601d, 0x0010b7cd, 0x4a00601e, - 0x0010b7ce, 0x42000000, 0xb0000000, 0x42000800, - 0x0010f4f4, 0x0201f800, 0x00020105, 0x1c01f000, - 0x82000d00, 0x000000c0, 0x04000004, 0x82040d80, - 0x000000c0, 0x04020055, 0x82000d00, 0x00002020, - 0x59300415, 0x84000512, 0x82040d80, 0x00002020, - 0x0400000b, 0x8c000514, 0x0402000f, 0x48026415, + 0x80000580, 0x1c01f000, 0x4c000000, 0x59940005, + 0x80080580, 0x04020003, 0x497b2804, 0x497b2805, + 0x5c000000, 0x1c01f000, 0x40681000, 0x0401fff7, + 0x1c01f000, 0x4c000000, 0x5994002a, 0x80080580, + 0x04020003, 0x497b2829, 0x497b282a, 0x5c000000, + 0x1c01f000, 0x4c000000, 0x5994002d, 0x80080580, + 0x04020003, 0x497b282c, 0x497b282d, 0x5c000000, + 0x1c01f000, 0x4937c857, 0x48ebc857, 0x59340203, + 0x80e80480, 0x04001002, 0x48ea6a03, 0x1c01f000, + 0x4d440000, 0x42007800, 0x00000010, 0x59968801, + 0x0201f800, 0x00020319, 0x04020056, 0x59341a03, + 0x800c1840, 0x04001017, 0x59940031, 0x800c0480, + 0x04000003, 0x48026a03, 0x04021012, 0x5934000f, + 0x497a6a03, 0x80000540, 0x0400004a, 0x5934000b, + 0x80001120, 0x82000500, 0x0000ffff, 0x80080480, + 0x04001004, 0x4a026a03, 0x00000001, 0x0401f005, + 0x4c3c0000, 0x0201f800, 0x00020327, 0x5c007800, + 0x4d2c0000, 0x41781800, 0x5934000f, 0x80025d40, + 0x04000037, 0x592c0004, 0x80000d40, 0x04000006, + 0x59940031, 0x80040480, 0x48025804, 0x04001007, + 0x04000006, 0x412c1800, 0x592c0000, 0x80025d40, + 0x0400002b, 0x0401f7f4, 0x592c2000, 0x497a5800, + 0x800c19c0, 0x04020009, 0x59340010, 0x812c0580, + 0x04020004, 0x497a680f, 0x497a6810, 0x0401f008, + 0x4812680f, 0x0401f006, 0x48101800, 0x59340010, + 0x812c0580, 0x04020002, 0x480e6810, 0x592c0205, + 0x82000500, 0x000000ff, 0x82000580, 0x00000012, + 0x04020004, 0x4a025a07, 0x0000000b, 0x0401f008, + 0x4a025a05, 0x00000103, 0x4a025a07, 0x00000006, + 0x497a580a, 0x4a025c07, 0x0000ffff, 0x4c0c0000, + 0x4c100000, 0x0201f800, 0x000203ab, 0x5c002000, + 0x5c001800, 0x40100000, 0x0401f7d5, 0x5c025800, + 0x81468800, 0x83440480, 0x00000800, 0x04021007, + 0x803c7840, 0x040207a3, 0x49472801, 0x5c028800, + 0x5c03e000, 0x1c01f000, 0x4a032800, 0x00000002, + 0x497b2801, 0x0401f7fa, 0x42007800, 0x00000010, + 0x59966002, 0x59300205, 0x80000d40, 0x04000006, + 0x59940031, 0x80040480, 0x48026205, 0x0400102d, + 0x0400002c, 0x59300006, 0x80000d40, 0x04000014, + 0x59b800e4, 0x8c000524, 0x04020011, 0x4a0370e4, + 0x00030000, 0x40000000, 0x59b800e4, 0x8c000524, + 0x04000004, 0x4a0370e4, 0x00020000, 0x0401f008, + 0x59940031, 0x80040480, 0x48026006, 0x4a0370e4, + 0x00020000, 0x0400101c, 0x0400001b, 0x83326400, + 0x00000024, 0x49332802, 0x41540000, 0x81300480, + 0x04021005, 0x803c7840, 0x040207db, 0x5c03e000, + 0x1c01f000, 0x59940030, 0x48032831, 0x4a032802, + 0x0010f694, 0x497b2830, 0x80000540, 0x0400000f, + 0x4a032800, 0x00000001, 0x5c03e000, 0x1c01f000, + 0x4c3c0000, 0x0201f800, 0x00108b30, 0x5c007800, + 0x0401f7d1, 0x4c3c0000, 0x0201f800, 0x001086e5, + 0x5c007800, 0x0401f7e2, 0x4a032800, 0x00000000, + 0x5c03e000, 0x1c01f000, 0x59a80859, 0x8c040d30, + 0x04020029, 0x8c040d32, 0x0400000f, 0x59a80050, + 0x81640480, 0x04001019, 0x59a8000b, 0x81500580, + 0x04000005, 0x59a8004e, 0x59a8104d, 0x80080580, + 0x04020012, 0x900411c0, 0x82081500, 0x00007000, + 0x0401f012, 0x82040500, 0x0000001f, 0x04000016, + 0x80040840, 0x82040500, 0x0000001f, 0x04000003, + 0x48075059, 0x0401f010, 0x900401c0, 0x82000500, + 0x0000001f, 0x80040d40, 0x900401c0, 0x80040580, + 0x82001500, 0x00007000, 0x82040500, 0xffff8fff, + 0x80080540, 0x48035059, 0x80081114, 0x0201f800, + 0x00100462, 0x1c01f000, 0x4a032807, 0x000007d0, + 0x4a032806, 0x0000000a, 0x1c01f000, 0x42000800, + 0x00000004, 0x83180480, 0x00000005, 0x02021800, + 0x0010032d, 0x83947c00, 0x00000009, 0x83180400, + 0x001057e9, 0x50000000, 0x803c7c00, 0x4a007801, + 0x000001f4, 0x48047802, 0x4a007800, 0x0000000a, + 0x49787803, 0x1c01f000, 0x83180480, 0x00000005, + 0x02021800, 0x0010032d, 0x83947c00, 0x00000009, + 0x83180400, 0x001057e9, 0x50000000, 0x803c7c00, + 0x583c0002, 0x80000040, 0x48007802, 0x04000005, + 0x4a007801, 0x000001f4, 0x4a007800, 0x0000000a, + 0x1c01f000, 0x83180480, 0x00000005, 0x02021800, + 0x0010032d, 0x83947c00, 0x00000009, 0x83180400, + 0x001057e9, 0x50000000, 0x803c7c00, 0x49787801, + 0x1c01f000, 0x40680800, 0x406c1000, 0x0401f802, + 0x1c01f000, 0x4807c857, 0x480bc857, 0x5994002f, + 0x80040400, 0x02001800, 0x0010032d, 0x48032804, + 0x480b2805, 0x4a032803, 0x0000000a, 0x1c01f000, + 0x4807c857, 0x480bc857, 0x5994002f, 0x80040400, + 0x02001800, 0x0010032d, 0x48032826, 0x480b2827, + 0x4a032825, 0x0000000a, 0x1c01f000, 0x4c000000, + 0x59940027, 0x80080580, 0x04020003, 0x48032826, + 0x48032827, 0x5c000000, 0x1c01f000, 0x4807c857, + 0x480bc857, 0x5994002f, 0x80040400, 0x02001800, + 0x0010032d, 0x4803282c, 0x480b282d, 0x4a03282b, + 0x0000000a, 0x1c01f000, 0x80e9d1c0, 0x0400000e, + 0x0401f832, 0x04025000, 0x4203e000, 0x80000000, + 0x40e81000, 0x41780800, 0x42000000, 0x00000064, + 0x0201f800, 0x0010600e, 0x5994002e, 0x80080400, + 0x4803282e, 0x1c01f000, 0x42001000, 0x00104671, + 0x0401fe8e, 0x42001000, 0x00104660, 0x0401ffd8, + 0x42001000, 0x0010392f, 0x0401fe88, 0x42001000, + 0x001039b1, 0x0401fe85, 0x42001000, 0x00103908, + 0x0401fe82, 0x42001000, 0x001039e8, 0x0401f692, + 0x4203e000, 0x70000000, 0x4203e000, 0xb0300000, + 0x40ebf800, 0x42000000, 0x0000003c, 0x04004004, + 0x80000040, 0x040207fe, 0x0401f007, 0x4203e000, + 0x70000000, 0x42000000, 0x0010bd38, 0x0201f800, + 0x0010ae10, 0x1c01f000, 0x4203e000, 0x80000000, + 0x4203e000, 0xb0400000, 0x40ebf800, 0x42000000, + 0x0000003c, 0x04005004, 0x80000040, 0x040207fe, + 0x0401f007, 0x4203e000, 0x80000000, 0x42000000, + 0x0010bd39, 0x0201f800, 0x0010ae10, 0x1c01f000, + 0x59a8080d, 0x59a80251, 0x80040480, 0x599c0a02, + 0x800409c0, 0x04020002, 0x80040800, 0x80041480, + 0x04001002, 0x40000800, 0x4807504f, 0x59a8100d, + 0x40040000, 0x800acc80, 0x4967500d, 0x49675050, + 0x59aaa80b, 0x41640800, 0x42001000, 0x00000024, + 0x0201f800, 0x00105fef, 0x8206a400, 0x0010f694, + 0x4953504c, 0x4152b000, 0x42006000, 0x0010c2e7, + 0x4a006005, 0x0000012c, 0x4a006006, 0xda10da10, + 0x4a006009, 0x00000012, 0x4a00600a, 0x0010c2e7, + 0x4a00600b, 0x00100e35, 0x599c0014, 0x48006012, + 0x599c0015, 0x48006013, 0x42006000, 0x0010f604, + 0x4a006203, 0x00000008, 0x4a006407, 0x00000006, + 0x4a006002, 0xffff0000, 0x4a006009, 0x0010c2e7, + 0x4a006015, 0x0010c2e7, 0x599c0014, 0x48006016, + 0x599c0015, 0x48006017, 0x599c0413, 0x48006018, + 0x49506019, 0x4954601a, 0x59a8004f, 0x4800601b, + 0x4a00601c, 0x0010b8cc, 0x4a00601d, 0x0010b8cd, + 0x4a00601e, 0x0010b8ce, 0x42000000, 0xb0000000, + 0x42000800, 0x0010f604, 0x0201f800, 0x00020105, + 0x1c01f000, 0x82000d00, 0x000000c0, 0x04000004, + 0x82040d80, 0x000000c0, 0x04020055, 0x82000d00, + 0x00002020, 0x59300415, 0x84000512, 0x82040d80, + 0x00002020, 0x0400000b, 0x8c000514, 0x0402000f, + 0x48026415, 0x813e79c0, 0x02020000, 0x0002094c, + 0x42027000, 0x00000043, 0x0201f000, 0x00020a34, + 0x5932680a, 0x59340a00, 0x8c040d0a, 0x040007f3, + 0x84000552, 0x0401f7f1, 0x84000514, 0x592c080e, + 0x48066016, 0x0401f7ef, 0x5932680a, 0x59340a00, + 0x8c040d0a, 0x02000000, 0x0002095f, 0x59300c15, + 0x84040d52, 0x48066415, 0x0201f000, 0x0002095f, + 0x0201f800, 0x00020111, 0x813e79c0, 0x02020000, + 0x0002094c, 0x0201f000, 0x0002096d, 0x8c00051e, + 0x02000000, 0x00020979, 0x82000d00, 0x00002020, + 0x82040d80, 0x00002020, 0x04000014, 0x82000500, + 0x000000c0, 0x82000d80, 0x00000080, 0x04000008, 0x813e79c0, 0x02020000, 0x0002094c, 0x42027000, - 0x00000043, 0x0201f000, 0x00020a34, 0x5932680a, - 0x59340a00, 0x8c040d0a, 0x040007f3, 0x84000552, - 0x0401f7f1, 0x84000514, 0x592c080e, 0x48066016, - 0x0401f7ef, 0x5932680a, 0x59340a00, 0x8c040d0a, - 0x02000000, 0x0002095f, 0x59300c15, 0x84040d52, - 0x48066415, 0x0201f000, 0x0002095f, 0x0201f800, - 0x00020111, 0x813e79c0, 0x02020000, 0x0002094c, - 0x0201f000, 0x0002096d, 0x8c00051e, 0x02000000, - 0x00020979, 0x82000d00, 0x00002020, 0x82040d80, - 0x00002020, 0x04000014, 0x82000500, 0x000000c0, - 0x82000d80, 0x00000080, 0x04000008, 0x813e79c0, - 0x02020000, 0x0002094c, 0x42027000, 0x00000041, - 0x0201f000, 0x00020a34, 0x813e79c0, 0x02020000, - 0x0002094c, 0x42027000, 0x00000043, 0x0201f000, - 0x00020a34, 0x5932680a, 0x59340a00, 0x8c040d0a, - 0x040007ea, 0x59300c15, 0x84040d52, 0x48066415, - 0x0401f7e6, 0x492fc857, 0x42000800, 0x00000006, - 0x0201f000, 0x00020974, 0x492fc857, 0x42000800, - 0x00000004, 0x0201f000, 0x00020974, 0x4807c856, - 0x59a80069, 0x800409c0, 0x04000003, 0x80080540, - 0x0401f002, 0x80080500, 0x48035069, 0x1c01f000, - 0x4a030800, 0x00000000, 0x4a030802, 0x00000001, - 0x497b0803, 0x497b0804, 0x1c01f000, 0x59840002, - 0x8c000500, 0x04000004, 0x84000500, 0x4a030800, - 0x00000001, 0x84000544, 0x84000506, 0x48030802, - 0x82000d00, 0x0fffffff, 0x42000000, 0x90000000, - 0x0201f800, 0x00100899, 0x59a80050, 0x82000480, - 0x00000007, 0x48035050, 0x80000580, 0x42000800, - 0x0010b86b, 0x48000800, 0x48000801, 0x1c01f000, - 0x59a80050, 0x82000400, 0x00000007, 0x48035050, - 0x1c01f000, 0x83640480, 0x00000008, 0x0400101b, - 0x58c80a03, 0x80000580, 0x82000400, 0x00000008, - 0x80040840, 0x040207fd, 0x815c0480, 0x04001013, - 0x4200b000, 0x00000007, 0x0201f800, 0x000209ee, - 0x4a026203, 0x00000004, 0x4a026407, 0x00000009, - 0x4a026203, 0x00000004, 0x4a026008, 0x00000101, - 0x0401f809, 0x0401f880, 0x8058b040, 0x040207f3, - 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, - 0x0401f7fd, 0x0201f800, 0x0010056f, 0x492e6009, - 0x58c80a03, 0x4a025a05, 0x0000002c, 0x497a5800, - 0x497a5801, 0x497a5c05, 0x497a5c07, 0x497a5806, - 0x4a025a09, 0x00000005, 0x4a025a08, 0x00000002, - 0x58c80201, 0x48025c05, 0x58c80202, 0x48025c08, - 0x58c80204, 0x48025c09, 0x4a02580e, 0x0000ffff, - 0x80040840, 0x0400000c, 0x412c2000, 0x0201f800, - 0x0010056f, 0x4a025a05, 0x0000000a, 0x497a5c05, - 0x48125800, 0x492c2001, 0x412c2000, 0x80040840, - 0x040207f7, 0x1c01f000, 0x4d7c0000, 0x4202f800, - 0x00000010, 0x4df00000, 0x4203e000, 0x50000000, - 0x59847803, 0x803c79c0, 0x0400001e, 0x4c5c0000, - 0x583cb809, 0x585c3409, 0x801831c0, 0x0400000b, - 0x0401f84a, 0x04000016, 0x42001000, 0x0010b86b, - 0x0401f87f, 0x04000012, 0x0201f800, 0x0010055a, - 0x0400000f, 0x492cb806, 0x585c0006, 0x80000540, - 0x02000800, 0x0010032d, 0x0401f830, 0x585c5409, - 0x0401f80b, 0x5c00b800, 0x5c03e000, 0x817ef840, - 0x040207e1, 0x5c02f800, 0x1c01f000, 0x5c00b800, - 0x5c03e000, 0x5c02f800, 0x1c01f000, 0x4803c856, - 0x405c6000, 0x802851c0, 0x04000018, 0x585c0205, - 0x82000d00, 0x0000000f, 0x82040c00, 0x00100e39, - 0x50044000, 0x4c600000, 0x4c640000, 0x4d040000, - 0x4020c000, 0x40320800, 0x5984c804, 0x4c280000, - 0x0401f93b, 0x5c005000, 0x40604000, 0x41046000, - 0x0201f800, 0x00100e17, 0x040207f6, 0x5c020800, - 0x5c00c800, 0x5c00c000, 0x58c80204, 0x4800bc09, - 0x0201f800, 0x00020111, 0x4a026008, 0x00000101, - 0x497a600a, 0x0401f055, 0x4803c856, 0x59840003, - 0x80026540, 0x04000003, 0x59300000, 0x48030803, - 0x1c01f000, 0x4803c856, 0x59840003, 0x48026000, - 0x49330803, 0x1c01f000, 0x58cc0805, 0x40180000, - 0x80040480, 0x0400100d, 0x82cc0580, 0x0010b860, - 0x02020800, 0x0010032d, 0x58c80205, 0x80040480, - 0x0400101d, 0x82000540, 0x00000001, 0x1c01f000, - 0x80003580, 0x0401f7fe, 0x82cc0580, 0x0010b860, - 0x02020800, 0x0010032d, 0x58c80400, 0x8c000504, - 0x040007f8, 0x58c8040b, 0x8c00051e, 0x040007f5, - 0x8c000500, 0x040207f3, 0x84000540, 0x4801940b, - 0x42000000, 0x0010bbff, 0x0201f800, 0x0010ad1d, - 0x42001000, 0x00008026, 0x0201f800, 0x001031eb, - 0x0401f7e8, 0x58c8040b, 0x8c00051e, 0x040007e2, - 0x8c000502, 0x040207e0, 0x84000542, 0x4801940b, - 0x42000000, 0x0010bbfe, 0x0201f800, 0x0010ad1d, - 0x42001000, 0x00008025, 0x42001800, 0x00000000, - 0x0201f800, 0x001031eb, 0x0401f7d3, 0x4803c856, - 0x58080000, 0x42001800, 0x00000007, 0x58080801, - 0x80040480, 0x04020004, 0x400c0000, 0x80000540, - 0x0401f005, 0x04001003, 0x800c0480, 0x0401f002, - 0x80000080, 0x1c01f000, 0x4803c856, 0x59300009, - 0x80000d40, 0x02000800, 0x0010032d, 0x58040006, - 0x80000540, 0x02000800, 0x0010032d, 0x59300008, - 0x82000500, 0x00000101, 0x82000580, 0x00000101, - 0x02020800, 0x0010032d, 0x42001000, 0x0010b86b, - 0x58080801, 0x82040400, 0x0010b86d, 0x497a6415, - 0x4a026016, 0x0000ffff, 0x45300000, 0x80040800, - 0x82040480, 0x00000008, 0x04001002, 0x80000d80, - 0x48041001, 0x82040400, 0x0010b86d, 0x45780000, - 0x1c01f000, 0x4933c857, 0x59300809, 0x800409c0, - 0x02000800, 0x0010032d, 0x4d2c0000, 0x58065806, - 0x812e59c0, 0x02020800, 0x00100580, 0x49780806, - 0x40065800, 0x0201f800, 0x00100589, 0x5c025800, - 0x4d300000, 0x0201f800, 0x00020a10, 0x5c026000, - 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, - 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, - 0x59300407, 0x82000580, 0x00000009, 0x04020006, - 0x59300008, 0x8c000510, 0x04000003, 0x80000580, - 0x1c01f000, 0x82000540, 0x00000001, 0x1c01f000, - 0x59840802, 0x8c040d04, 0x1c01f000, 0x4803c856, - 0x59840802, 0x84040d04, 0x84040d40, 0x4a030800, - 0x00000000, 0x48070802, 0x82040d00, 0x0fffffff, - 0x42000000, 0x90000000, 0x0201f000, 0x00100899, - 0x4807c857, 0x4805980a, 0x49799801, 0x49799803, - 0x49799806, 0x49799807, 0x49799808, 0x49799805, - 0x49799809, 0x0401f8c8, 0x0400000a, 0x0401f8ea, - 0x04000008, 0x48359800, 0x48359802, 0x48359806, - 0x4a019804, 0x00000001, 0x4a019807, 0x00000006, - 0x1c01f000, 0x4807c857, 0x58cc1007, 0x40040000, - 0x80080480, 0x04021020, 0x4c040000, 0x4c080000, - 0x0401f8d9, 0x5c001000, 0x5c000800, 0x0400001c, - 0x58cc0006, 0x80006540, 0x0402000b, 0x48359800, - 0x48359802, 0x48359806, 0x49799801, 0x49799803, - 0x49786801, 0x49786800, 0x49799804, 0x49799807, - 0x0401f005, 0x48306801, 0x48346000, 0x48359806, - 0x49786800, 0x58cc0004, 0x58cc1007, 0x80000000, - 0x82081400, 0x00000006, 0x48019804, 0x48099807, - 0x0401f7df, 0x80000580, 0x1c01f000, 0x82000540, - 0x00000001, 0x1c01f000, 0x480bc857, 0x4c500000, - 0x4c540000, 0x4c580000, 0x40083000, 0x58cc0801, - 0x82040480, 0x00000006, 0x02021800, 0x0010032d, - 0x82040400, 0x00105cb2, 0x50000000, 0x58cca800, - 0x8054ac00, 0x42001800, 0x00000006, 0x40040000, - 0x800c0480, 0x80082480, 0x04021002, 0x40080000, - 0x8000b0c2, 0x8058b400, 0x5450a800, 0x8050a000, - 0x8054a800, 0x8058b040, 0x040207fc, 0x40001000, - 0x58cc2805, 0x58cc0807, 0x58cc2001, 0x80142c00, - 0x80040c80, 0x80102400, 0x48159805, 0x48059807, - 0x48119801, 0x82100580, 0x00000006, 0x0400000c, - 0x48119801, 0x40080000, 0x80181480, 0x40083000, - 0x04000003, 0x040217d6, 0x80000580, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x1c01f000, 0x58cc0800, - 0x800409c0, 0x02000800, 0x0010032d, 0x58040800, - 0x48059800, 0x41782000, 0x0401f7ee, 0x0401f812, - 0x50600000, 0x81041c00, 0x585c0205, 0x4803c857, - 0x82000580, 0x0000002c, 0x02020800, 0x0010032d, - 0x58040202, 0x800000e0, 0x80640540, 0x48001802, - 0x58040000, 0x48001800, 0x58040001, 0x48001801, - 0x1c01f000, 0x4807c856, 0x58cc0005, 0x80000040, - 0x02001800, 0x0010032d, 0x48019805, 0x58cc1003, - 0x82080480, 0x00000006, 0x02021800, 0x0010032d, - 0x82080400, 0x00105cb2, 0x50000000, 0x58cc0802, - 0x80040c00, 0x80081000, 0x82080480, 0x00000006, - 0x0402000f, 0x58cc2002, 0x58100000, 0x80006d40, - 0x04000009, 0x4c340000, 0x0401f858, 0x5c006800, - 0x49786801, 0x48359802, 0x58cc0004, 0x80000040, - 0x48019804, 0x49799803, 0x0401f002, 0x48099803, - 0x1c01f000, 0x4807c856, 0x41781800, 0x58c80201, - 0x80000540, 0x04000002, 0x800c1800, 0x58c80c01, - 0x80040c80, 0x0400100a, 0x04000009, 0x800c1800, - 0x58c80202, 0x80041480, 0x04001005, 0x04000004, - 0x800c1800, 0x40080800, 0x0401f7fb, 0x480d9204, - 0x400c0000, 0x42002000, 0x00000001, 0x80000040, - 0x04000007, 0x04001006, 0x80102000, 0x82000480, - 0x00000005, 0x04000002, 0x040217fc, 0x48119203, - 0x1c01f000, 0x4807c856, 0x4d2c0000, 0x58cc000a, - 0x80000540, 0x02000800, 0x0010032d, 0x82002400, - 0x00000006, 0x0201f800, 0x0010055a, 0x04000012, - 0x492d9809, 0x497a5800, 0x497a5801, 0x0201f800, - 0x0010055a, 0x0400000c, 0x58cc0009, 0x48025800, - 0x497a5801, 0x492d9809, 0x82102480, 0x00000006, - 0x040217f7, 0x82000540, 0x00000001, 0x5c025800, - 0x1c01f000, 0x58cc0009, 0x80025d40, 0x040007fc, - 0x592c2000, 0x0201f800, 0x00100580, 0x40100000, - 0x0401f7fa, 0x58cc0009, 0x48cfc857, 0x80006d40, - 0x04000005, 0x50340000, 0x48019809, 0x49786800, - 0x49786801, 0x1c01f000, 0x4813c857, 0x58cc0009, - 0x48002000, 0x48119809, 0x1c01f000, 0x4807c856, - 0x4d2c0000, 0x58cc0009, 0x80025d40, 0x04000007, - 0x592c0000, 0x4c000000, 0x0201f800, 0x00100580, - 0x5c000000, 0x0401f7f9, 0x5c025800, 0x1c01f000, - 0x4807c856, 0x4d2c0000, 0x58cc0002, 0x80025d40, - 0x04000007, 0x592c0000, 0x4c000000, 0x0201f800, - 0x00100580, 0x5c000000, 0x0401f7f9, 0x49799800, - 0x49799802, 0x49799801, 0x49799803, 0x49799806, - 0x49799807, 0x49799808, 0x49799809, 0x4979980a, - 0x5c025800, 0x1c01f000, 0x00000003, 0x00000006, - 0x00000009, 0x0000000c, 0x0000000f, 0x00000012, - 0x4803c856, 0x0401f858, 0x4a00c205, 0x0000003c, - 0x5930100a, 0x82080580, 0x0010b876, 0x04000013, - 0x58080802, 0x82040d00, 0x00ffffff, 0x58080403, - 0x4804c006, 0x4800c407, 0x4a00c208, 0x00000003, - 0x59300812, 0x585c0405, 0x4978c207, 0x4804c408, - 0x80000540, 0x0400000d, 0x58600207, 0x84000540, - 0x4800c207, 0x0401f009, 0x585c080b, 0x82040d00, - 0x00ffffff, 0x4804c006, 0x4a00c407, 0x000007ff, - 0x4978c208, 0x0401f7ef, 0x82603c00, 0x00000009, - 0x58605405, 0x40282000, 0x405c6000, 0x585c0a05, - 0x82040d00, 0x0000000f, 0x82040c00, 0x00100e39, - 0x50044000, 0x80004d80, 0x50200000, 0x80307400, - 0x58380402, 0x8c244d00, 0x04020003, 0x48003a00, - 0x0401f003, 0x48003c00, 0x801c3800, 0x80244800, - 0x80102040, 0x04000006, 0x0201f800, 0x00100e17, - 0x02000800, 0x0010032d, 0x0401f7f0, 0x1c01f000, - 0x4803c856, 0x4d340000, 0x5930000a, 0x80026d40, - 0x02000800, 0x0010032d, 0x59340212, 0x82000500, - 0x0000ff00, 0x0402000e, 0x59840000, 0x80000540, - 0x0400000b, 0x836c0580, 0x00000003, 0x04020008, - 0x59341c03, 0x42002000, 0x00000004, 0x42003000, - 0x00000004, 0x0201f800, 0x00103260, 0x5c026800, - 0x1c01f000, 0x4803c856, 0x80001580, 0x58c80c01, - 0x59300012, 0x80040c80, 0x48066012, 0x58c80201, - 0x80000540, 0x04000005, 0x80081000, 0x80040c80, - 0x04001007, 0x04000006, 0x58c80202, 0x80081000, - 0x80040c80, 0x04001002, 0x040207fd, 0x4808bc09, - 0x4808c405, 0x1c01f000, 0x4803c856, 0x4a0370e5, - 0x00020000, 0x59b800e5, 0x8c000524, 0x040207fc, - 0x4a0370e5, 0x00030000, 0x40000000, 0x40000000, - 0x59b800e5, 0x8c000524, 0x040207f5, 0x5934000e, - 0x80006d40, 0x04000010, 0x81300580, 0x04020004, - 0x58340000, 0x4802680e, 0x0401f00a, 0x40347800, - 0x58340000, 0x80006d40, 0x02000800, 0x0010032d, - 0x81300580, 0x040207fa, 0x58340000, 0x48007800, - 0x497a6000, 0x4a0370e5, 0x00020000, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x4d2c0000, 0x42000800, - 0x000003ff, 0x4a0370e5, 0x00020000, 0x59b800e5, - 0x8c000524, 0x04000005, 0x80040840, 0x040207fa, - 0x0201f800, 0x0010032d, 0x4a0370e5, 0x00030000, - 0x40000000, 0x40000000, 0x59b800e5, 0x8c000524, - 0x040207f1, 0x5934000e, 0x80026540, 0x0400000e, - 0x4933c857, 0x59300000, 0x4802680e, 0x4a026203, - 0x00000004, 0x497a6006, 0x497a600a, 0x4a026008, - 0x00000101, 0x59325809, 0x497a5c09, 0x0401fd7a, - 0x0401f7f1, 0x4a0370e5, 0x00020000, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x4803c856, 0x4c000000, - 0x0201f800, 0x0010548f, 0x04020011, 0x0201f800, - 0x00103dcb, 0x02020800, 0x0010032d, 0x5c000000, - 0x48026802, 0x0201f800, 0x001070f5, 0x04000009, - 0x4936600a, 0x4a026407, 0x00000001, 0x42027000, - 0x00000001, 0x0201f000, 0x00020a34, 0x5c000000, - 0x1c01f000, 0x59300203, 0x82000c80, 0x0000000e, - 0x02021800, 0x0010032d, 0x4803c857, 0x0c01f001, - 0x00105d9e, 0x00105d9e, 0x00105d9e, 0x00105da0, - 0x00105e0d, 0x00105d9e, 0x00105d9e, 0x00105e5f, - 0x00105e60, 0x00105d9e, 0x00105d9e, 0x00105d9e, - 0x00105d9e, 0x00105d9e, 0x0201f800, 0x0010032d, - 0x493bc857, 0x83380480, 0x00000050, 0x02021800, - 0x0010032d, 0x83380480, 0x00000049, 0x02001800, - 0x0010032d, 0x0c01f001, 0x00105db3, 0x00105de4, - 0x00105db1, 0x00105db1, 0x00105db1, 0x00105db1, - 0x00105df2, 0x0201f800, 0x0010032d, 0x4d2c0000, - 0x59325809, 0x592c0207, 0x48025c07, 0x4a025a07, - 0x00000000, 0x4c5c0000, 0x592cbc0b, 0x592c0000, - 0x48026009, 0x0201f800, 0x000203ab, 0x59300c15, - 0x59300009, 0x80000540, 0x0400000b, 0x8c040d18, - 0x04020014, 0x4a026203, 0x00000007, 0x42027000, - 0x00000043, 0x497a6415, 0x5c00b800, 0x5c025800, - 0x0401f093, 0x8c040d18, 0x04020010, 0x8c5cbd08, - 0x04020011, 0x4a026203, 0x00000007, 0x497a6415, - 0x497a6006, 0x5c00b800, 0x5c025800, 0x1c01f000, - 0x4d400000, 0x59325809, 0x42028000, 0x00000005, - 0x0401f922, 0x5c028000, 0x0201f800, 0x001070b5, - 0x0401f7f5, 0x0201f800, 0x00020a10, 0x0401f7f2, - 0x0401fa59, 0x4d2c0000, 0x59325809, 0x0201f800, - 0x0010889a, 0x04000006, 0x4d400000, 0x42028000, - 0x00000001, 0x0401f911, 0x5c028000, 0x5c025800, - 0x0201f000, 0x00020a10, 0x0401fa4b, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010df61, 0x5c027800, - 0x42003000, 0x00000014, 0x0201f800, 0x0010a4ae, - 0x42000000, 0x0010bc1d, 0x0201f800, 0x0010ad1d, - 0x4d2c0000, 0x59325809, 0x0201f800, 0x0010889a, - 0x04000006, 0x4d400000, 0x42028000, 0x00000029, - 0x0401f8f6, 0x5c028000, 0x5c025800, 0x0201f000, - 0x00020a10, 0x493bc857, 0x497a6006, 0x83380480, - 0x00000054, 0x02021800, 0x0010032d, 0x83380480, - 0x00000047, 0x02001800, 0x0010032d, 0x0c01f001, - 0x00105e5e, 0x00105e27, 0x00105e25, 0x00105e25, - 0x00105e25, 0x00105e25, 0x00105e25, 0x00105e25, - 0x00105e25, 0x00105e25, 0x00105e25, 0x00105e25, - 0x00105e2b, 0x0201f800, 0x0010032d, 0x59300012, - 0x82000500, 0xffff0000, 0x04020034, 0x59840802, - 0x8c040d04, 0x04000025, 0x5930000a, 0x80026d40, - 0x0400001f, 0x4c5c0000, 0x4c600000, 0x497a6006, - 0x5930b809, 0x585c0006, 0x8000c540, 0x02000800, - 0x0010032d, 0x0401fe7f, 0x40625800, 0x0201f800, - 0x000203af, 0x4978b806, 0x0401fee8, 0x497a600a, - 0x585c3409, 0x0401fca9, 0x0400000e, 0x42001000, - 0x0010b86b, 0x0401fcde, 0x0400000a, 0x0201f800, - 0x0010056f, 0x04000007, 0x492cb806, 0x585c5409, - 0x0401fc6f, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x0401fc95, 0x0401f7fc, 0x8c040d06, 0x040207fc, - 0x5930000a, 0x80026d40, 0x04000006, 0x5934000e, - 0x80000540, 0x02020800, 0x0010032d, 0x497a600a, - 0x0401fcf9, 0x0401f7f2, 0x0401f088, 0x4803c856, - 0x4803c856, 0x83380580, 0x00000043, 0x02020800, - 0x0010032d, 0x4a026203, 0x00000003, 0x493a6403, - 0x59325809, 0x592c0010, 0x48026012, 0x497a6014, - 0x592c0407, 0x800000c2, 0x800010c4, 0x80081400, - 0x480a6006, 0x0201f800, 0x00020154, 0x42000800, - 0x80000060, 0x0201f000, 0x000209a3, 0x42000000, - 0x0010bc2f, 0x0201f800, 0x0010ad1d, 0x59300203, - 0x82000c80, 0x0000000e, 0x02021800, 0x0010032d, - 0x4803c857, 0x82000d80, 0x00000003, 0x04000006, - 0x82000d80, 0x00000004, 0x0400005d, 0x0201f800, - 0x0010032d, 0x4d400000, 0x42028000, 0x00000006, - 0x0401f82d, 0x5c028000, 0x1c01f000, 0x4803c856, - 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, - 0x0010032d, 0x82000d80, 0x00000002, 0x0400000f, - 0x82000d80, 0x00000003, 0x04000006, 0x82000d80, - 0x00000004, 0x04000046, 0x0201f800, 0x0010032d, - 0x4d400000, 0x42028000, 0x00000005, 0x0401f816, - 0x5c028000, 0x1c01f000, 0x4933c857, 0x4d2c0000, - 0x59325809, 0x812e59c0, 0x02000800, 0x0010032d, - 0x592c1a09, 0x8c0c1d0e, 0x02000800, 0x0010032d, - 0x4d400000, 0x42028000, 0x00000001, 0x0401f84b, - 0x0201f800, 0x001070b5, 0x5c028000, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x4943c857, 0x0401fa52, - 0x4df00000, 0x59300004, 0x8c00053e, 0x04020006, - 0x0201f800, 0x0010644d, 0x02020800, 0x0010032d, - 0x0401f01b, 0x0201f800, 0x001085a4, 0x04020007, - 0x59300415, 0x84000558, 0x48026415, 0x0201f800, - 0x00106351, 0x04020012, 0x0201f800, 0x0010e1ca, - 0x80c40040, 0x04000005, 0x0401f946, 0x02020800, - 0x0010032d, 0x0401f00a, 0x59325809, 0x0401f827, - 0x0201f800, 0x001070b5, 0x5c03e000, 0x04000a1f, - 0x82000540, 0x00000001, 0x1c01f000, 0x5c03e000, - 0x04000a1a, 0x80000580, 0x1c01f000, 0x4933c857, - 0x0201f800, 0x00100bd4, 0x4933c857, 0x4c5c0000, - 0x4d340000, 0x497a6006, 0x5930b809, 0x5930000a, - 0x80026d40, 0x04020e39, 0x42001000, 0x0010b86b, - 0x0401fc33, 0x04000009, 0x58c80204, 0x4800bc09, - 0x41785000, 0x0201f800, 0x00105abb, 0x5c026800, - 0x5c00b800, 0x1c01f000, 0x4978bc09, 0x0201f800, - 0x00105ae5, 0x0401f7fa, 0x4803c856, 0x0201f800, - 0x0010889a, 0x0400000f, 0x592c0000, 0x80000d40, - 0x04000009, 0x497a5800, 0x49425a07, 0x4c040000, - 0x0201f800, 0x000203ab, 0x5c000800, 0x40065800, - 0x0401f7f6, 0x49425a07, 0x0201f800, 0x000203ab, - 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, - 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, - 0x4933c857, 0x59300c07, 0x82040580, 0x0000000e, - 0x04000004, 0x82040580, 0x00000009, 0x04020004, - 0x0401ffde, 0x497a6009, 0x80000580, 0x1c01f000, - 0x592e600a, 0x83300480, 0x0010f584, 0x04001016, - 0x41580000, 0x81300480, 0x04021013, 0x40040000, - 0x59300c07, 0x80040580, 0x04020012, 0x59300a03, - 0x82040580, 0x00000007, 0x02020800, 0x0010032d, - 0x59300009, 0x80000540, 0x02020800, 0x0010032d, - 0x0201f800, 0x00020a10, 0x42000000, 0x00000000, - 0x0401f009, 0x42000000, 0x00000008, 0x0401f006, - 0x82040580, 0x00000007, 0x040207fb, 0x42000000, - 0x00000005, 0x592c0a07, 0x48065c07, 0x48025a07, - 0x0201f000, 0x000203ab, 0x4c0c0000, 0x4c100000, - 0x4c140000, 0x4c180000, 0x80001d80, 0x80002580, - 0x42003000, 0x00000020, 0x82040500, 0x00000001, - 0x04000003, 0x40080000, 0x800c1c00, 0x400c2800, - 0x800c1902, 0x80102102, 0x82140500, 0x00000001, - 0x04000003, 0x82102540, 0x80000000, 0x80040902, - 0x80183040, 0x040207f1, 0x40100800, 0x400c0000, - 0x5c003000, 0x5c002800, 0x5c002000, 0x5c001800, - 0x1c01f000, 0x4c580000, 0x4200b000, 0x00000020, - 0x80000540, 0x04000018, 0x80041c80, 0x04021016, - 0x800810c2, 0x80040982, 0x04001006, 0x80041c80, - 0x04021005, 0x8058b040, 0x040207fa, 0x0401f006, - 0x80041c80, 0x400c0800, 0x80081000, 0x8058b040, - 0x040207f4, 0x4c000000, 0x41f00000, 0x82000500, - 0xf7ffffff, 0x4003e000, 0x5c000000, 0x5c00b000, - 0x1c01f000, 0x4c000000, 0x41f00000, 0x82000540, - 0x08000000, 0x0401f7f8, 0x42007000, 0x0010b895, - 0x4a007000, 0x00000005, 0x4a007401, 0x00000000, - 0x4a007201, 0x00000840, 0x4a007202, 0x00000005, - 0x4a0378e8, 0x00000000, 0x4a03c821, 0x00000010, - 0x4a03c823, 0x00000004, 0x0401f81e, 0x4a0378e9, - 0x00003a0d, 0x4a0378e8, 0x00000001, 0x41780800, - 0x4203a000, 0x00007600, 0x4a03a005, 0xd0000001, - 0x59d00006, 0x4a03a005, 0x90000001, 0x83d3a400, - 0x00000020, 0x80040800, 0x82040480, 0x00000005, - 0x040017f8, 0x59e00003, 0x82000500, 0xffffffe0, - 0x82000540, 0x00008000, 0x4803c003, 0x59c40006, - 0x82000500, 0xfffcffff, 0x48038806, 0x1c01f000, - 0x4d900000, 0x4d180000, 0x4a0378e7, 0xaaaaaaaa, - 0x4a0378e6, 0xaaaaaaaa, 0x4a0378e5, 0xaaaaaaaa, - 0x4a0378e4, 0xaaaaaaaa, 0x4a03781a, 0x0010bb28, - 0x4a03781b, 0x00100e39, 0x4a03781c, 0x00100e49, - 0x4a031800, 0x00000000, 0x4a031801, 0x0010b898, - 0x4a031802, 0x0010b89f, 0x42000800, 0x0010bb2b, - 0x417a3000, 0x811b20c8, 0x83932400, 0x0000bf32, - 0x48072000, 0x4a032001, 0x00000000, 0x83180400, - 0x00106717, 0x50000000, 0x48032002, 0x82040c00, - 0x00000005, 0x811a3000, 0x83180480, 0x00000005, - 0x040017f1, 0x5c023000, 0x5c032000, 0x1c01f000, - 0x40680800, 0x0201f800, 0x000209b1, 0x1c01f000, - 0x4933c857, 0x59300804, 0x82040d00, 0x00000100, - 0x82040d40, 0x80000040, 0x48066004, 0x497a6000, - 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, - 0x60000000, 0x480378e1, 0x1c01f000, 0x598c000f, - 0x81300580, 0x04000003, 0x497a6008, 0x1c01f000, - 0x59c40004, 0x82000500, 0x0000000c, 0x04000005, - 0x4a038804, 0x0000000c, 0x497b2807, 0x0401f00a, - 0x0401fb01, 0x59300403, 0x82000d80, 0x00000040, - 0x04000004, 0x82000580, 0x00000042, 0x04020002, - 0x497a6008, 0x0201f800, 0x001066dd, 0x80000580, - 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, - 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, - 0x59300804, 0x8c040d20, 0x04020004, 0x82000540, - 0x00000001, 0x1c01f000, 0x4933c857, 0x4d380000, - 0x59300804, 0x84040d20, 0x48066004, 0x42027000, - 0x00000049, 0x59300203, 0x82000580, 0x00000003, - 0x04000003, 0x42027000, 0x00000013, 0x0201f800, - 0x00020a34, 0x80000580, 0x5c027000, 0x1c01f000, - 0x0401f807, 0x42018800, 0x00000001, 0x04000003, - 0x42018800, 0x00000000, 0x1c01f000, 0x59300018, - 0x81480580, 0x04020003, 0x59300019, 0x814c0580, - 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x0401f8ce, - 0x4df00000, 0x0201f800, 0x001058f4, 0x59900001, - 0x82000500, 0x00000003, 0x0c01f001, 0x00106058, - 0x0010604d, 0x0010604b, 0x0010604b, 0x0201f800, - 0x0010032d, 0x59926004, 0x0401f88a, 0x813261c0, - 0x04000008, 0x59300004, 0x8c000516, 0x04000004, - 0x59325809, 0x497a5809, 0x497a580a, 0x0401f88a, - 0x5c03e000, 0x040008a1, 0x5c026000, 0x5c025800, - 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, - 0x4d300000, 0x497b2807, 0x0401f8ab, 0x4df00000, - 0x598c0000, 0x82000500, 0x0000000f, 0x4803c857, - 0x0c01f001, 0x0010609e, 0x0010607b, 0x00106084, - 0x0010608b, 0x00106099, 0x0010609e, 0x00106079, - 0x00106088, 0x0010609e, 0x00106079, 0x00106079, - 0x00106079, 0x00106079, 0x00106079, 0x00106079, - 0x00106079, 0x0201f800, 0x0010032d, 0x598c000f, - 0x80026540, 0x04000004, 0x0401f824, 0x02020800, - 0x0010032d, 0x0201f800, 0x001066dd, 0x0401f01b, - 0x0401f82d, 0x0201f800, 0x001066dd, 0x0401f017, - 0x0201f800, 0x0010a7c6, 0x0401f7f7, 0x598c000f, - 0x80026540, 0x04000011, 0x0401f83b, 0x04000007, - 0x0401f812, 0x04000005, 0x0401f81f, 0x04000003, - 0x0201f800, 0x0010a7c6, 0x0201f800, 0x001066dd, - 0x0401f006, 0x0401f830, 0x02020800, 0x0010032d, - 0x0201f800, 0x001066dd, 0x5c03e000, 0x0400085b, - 0x5c026000, 0x1c01f000, 0x598c0009, 0x81300580, - 0x0402000c, 0x0401f84e, 0x0401f83b, 0x59300000, - 0x800001c0, 0x04000004, 0x48031809, 0x497a6000, - 0x0401f003, 0x497b1809, 0x497b1808, 0x80000580, - 0x1c01f000, 0x4d2c0000, 0x59300407, 0x82000580, - 0x00000003, 0x04020012, 0x598c000b, 0x81300580, - 0x0402000f, 0x0401f83a, 0x59325809, 0x497a5809, - 0x497a580a, 0x0401f824, 0x59300000, 0x800001c0, - 0x04000004, 0x4803180b, 0x497a6000, 0x0401f003, - 0x497b180a, 0x497b180b, 0x80000580, 0x5c025800, - 0x1c01f000, 0x598c0005, 0x81300580, 0x0402000c, - 0x0401f827, 0x0401f814, 0x59300000, 0x800001c0, - 0x04000004, 0x48031805, 0x497a6000, 0x0401f003, - 0x497b1805, 0x497b1804, 0x80000580, 0x1c01f000, - 0x4a032001, 0x00000000, 0x497b2004, 0x497b2005, - 0x59900006, 0x82000500, 0x0000ffff, 0x48032006, - 0x1c01f000, 0x4c040000, 0x59300004, 0x82000500, - 0x7ffeffff, 0x48026004, 0x59bc00e4, 0x8c000514, - 0x04000009, 0x42000800, 0x0000bf00, 0x58040012, - 0x81300580, 0x04020004, 0x49780812, 0x4a0378e4, - 0x00000800, 0x5c000800, 0x1c01f000, 0x4803c856, - 0x598c000e, 0x80000540, 0x04000003, 0x80000040, - 0x4803180e, 0x1c01f000, 0x59bc00ea, 0x82000500, - 0x00000007, 0x82000580, 0x00000003, 0x04020006, - 0x4803c856, 0x4a0378e8, 0x00000001, 0x4a0370e4, - 0x00000800, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000041, 0x0201f000, 0x00020a34, 0x813e79c0, + 0x02020000, 0x0002094c, 0x42027000, 0x00000043, + 0x0201f000, 0x00020a34, 0x5932680a, 0x59340a00, + 0x8c040d0a, 0x040007ea, 0x59300c15, 0x84040d52, + 0x48066415, 0x0401f7e6, 0x492fc857, 0x42000800, + 0x00000006, 0x0201f000, 0x00020974, 0x492fc857, + 0x42000800, 0x00000004, 0x0201f000, 0x00020974, + 0x4807c856, 0x59a80069, 0x800409c0, 0x04000003, + 0x80080540, 0x0401f002, 0x80080500, 0x48035069, + 0x1c01f000, 0x4a030800, 0x00000000, 0x4a030802, + 0x00000001, 0x497b0803, 0x497b0804, 0x1c01f000, + 0x59840002, 0x8c000500, 0x04000004, 0x84000500, + 0x4a030800, 0x00000001, 0x84000544, 0x84000506, + 0x48030802, 0x82000d00, 0x0fffffff, 0x42000000, + 0x90000000, 0x0201f800, 0x00100897, 0x59a80050, + 0x82000480, 0x00000007, 0x48035050, 0x80000580, + 0x42000800, 0x0010b96b, 0x48000800, 0x48000801, + 0x1c01f000, 0x59a80050, 0x82000400, 0x00000007, + 0x48035050, 0x1c01f000, 0x83640480, 0x00000008, + 0x0400101b, 0x58c80a03, 0x80000580, 0x82000400, + 0x00000008, 0x80040840, 0x040207fd, 0x815c0480, + 0x04001013, 0x4200b000, 0x00000007, 0x0201f800, + 0x000209ee, 0x4a026203, 0x00000004, 0x4a026407, + 0x00000009, 0x4a026203, 0x00000004, 0x4a026008, + 0x00000101, 0x0401f809, 0x0401f880, 0x8058b040, + 0x040207f3, 0x80000580, 0x1c01f000, 0x82000540, + 0x00000001, 0x0401f7fd, 0x0201f800, 0x0010056f, + 0x492e6009, 0x58c80a03, 0x4a025a05, 0x0000002c, + 0x497a5800, 0x497a5801, 0x497a5c05, 0x497a5c07, + 0x497a5806, 0x4a025a09, 0x00000005, 0x4a025a08, + 0x00000002, 0x58c80201, 0x48025c05, 0x58c80202, + 0x48025c08, 0x58c80204, 0x48025c09, 0x4a02580e, + 0x0000ffff, 0x80040840, 0x0400000c, 0x412c2000, + 0x0201f800, 0x0010056f, 0x4a025a05, 0x0000000a, + 0x497a5c05, 0x48125800, 0x492c2001, 0x412c2000, + 0x80040840, 0x040207f7, 0x1c01f000, 0x4d7c0000, + 0x4202f800, 0x00000010, 0x4df00000, 0x4203e000, + 0x50000000, 0x59847803, 0x803c79c0, 0x0400001e, + 0x4c5c0000, 0x583cb809, 0x585c3409, 0x801831c0, + 0x0400000b, 0x0401f84a, 0x04000016, 0x42001000, + 0x0010b96b, 0x0401f87f, 0x04000012, 0x0201f800, + 0x0010055a, 0x0400000f, 0x492cb806, 0x585c0006, + 0x80000540, 0x02000800, 0x0010032d, 0x0401f830, + 0x585c5409, 0x0401f80b, 0x5c00b800, 0x5c03e000, + 0x817ef840, 0x040207e1, 0x5c02f800, 0x1c01f000, + 0x5c00b800, 0x5c03e000, 0x5c02f800, 0x1c01f000, + 0x4803c856, 0x405c6000, 0x802851c0, 0x04000018, + 0x585c0205, 0x82000d00, 0x0000000f, 0x82040c00, + 0x00100e3a, 0x50044000, 0x4c600000, 0x4c640000, + 0x4d040000, 0x4020c000, 0x40320800, 0x5984c804, + 0x4c280000, 0x0401f93b, 0x5c005000, 0x40604000, + 0x41046000, 0x0201f800, 0x00100e18, 0x040207f6, + 0x5c020800, 0x5c00c800, 0x5c00c000, 0x58c80204, + 0x4800bc09, 0x0201f800, 0x00020111, 0x4a026008, + 0x00000101, 0x497a600a, 0x0401f055, 0x4803c856, + 0x59840003, 0x80026540, 0x04000003, 0x59300000, + 0x48030803, 0x1c01f000, 0x4803c856, 0x59840003, + 0x48026000, 0x49330803, 0x1c01f000, 0x58cc0805, + 0x40180000, 0x80040480, 0x0400100d, 0x82cc0580, + 0x0010b960, 0x02020800, 0x0010032d, 0x58c80205, + 0x80040480, 0x0400101d, 0x82000540, 0x00000001, + 0x1c01f000, 0x80003580, 0x0401f7fe, 0x82cc0580, + 0x0010b960, 0x02020800, 0x0010032d, 0x58c80400, + 0x8c000504, 0x040007f8, 0x58c8040b, 0x8c00051e, + 0x040007f5, 0x8c000500, 0x040207f3, 0x84000540, + 0x4801940b, 0x42000000, 0x0010bcff, 0x0201f800, + 0x0010ae10, 0x42001000, 0x00008026, 0x0201f800, + 0x001031f5, 0x0401f7e8, 0x58c8040b, 0x8c00051e, + 0x040007e2, 0x8c000502, 0x040207e0, 0x84000542, + 0x4801940b, 0x42000000, 0x0010bcfe, 0x0201f800, + 0x0010ae10, 0x42001000, 0x00008025, 0x42001800, + 0x00000000, 0x0201f800, 0x001031f5, 0x0401f7d3, + 0x4803c856, 0x58080000, 0x42001800, 0x00000007, + 0x58080801, 0x80040480, 0x04020004, 0x400c0000, + 0x80000540, 0x0401f005, 0x04001003, 0x800c0480, + 0x0401f002, 0x80000080, 0x1c01f000, 0x4803c856, + 0x59300009, 0x80000d40, 0x02000800, 0x0010032d, + 0x58040006, 0x80000540, 0x02000800, 0x0010032d, + 0x59300008, 0x82000500, 0x00000101, 0x82000580, + 0x00000101, 0x02020800, 0x0010032d, 0x42001000, + 0x0010b96b, 0x58080801, 0x82040400, 0x0010b96d, + 0x497a6415, 0x4a026016, 0x0000ffff, 0x45300000, + 0x80040800, 0x82040480, 0x00000008, 0x04001002, + 0x80000d80, 0x48041001, 0x82040400, 0x0010b96d, + 0x45780000, 0x1c01f000, 0x4933c857, 0x59300809, + 0x800409c0, 0x02000800, 0x0010032d, 0x4d2c0000, + 0x58065806, 0x812e59c0, 0x02020800, 0x00100580, + 0x49780806, 0x40065800, 0x0201f800, 0x00100589, + 0x5c025800, 0x4d300000, 0x0201f800, 0x00020a10, + 0x5c026000, 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, 0x04000003, 0x42018800, 0x00000000, - 0x1c01f000, 0x59bc00ea, 0x82000500, 0x00000007, - 0x82000580, 0x00000001, 0x04020013, 0x4803c856, - 0x42000800, 0x00000000, 0x0401f810, 0x4a0370e4, - 0x00000c00, 0x42000800, 0x00001000, 0x59bc00ea, + 0x1c01f000, 0x59300407, 0x82000580, 0x00000009, + 0x04020006, 0x59300008, 0x8c000510, 0x04000003, + 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, + 0x1c01f000, 0x59840802, 0x8c040d04, 0x1c01f000, + 0x4803c856, 0x59840802, 0x84040d04, 0x84040d40, + 0x4a030800, 0x00000000, 0x48070802, 0x82040d00, + 0x0fffffff, 0x42000000, 0x90000000, 0x0201f000, + 0x00100897, 0x4807c857, 0x4805980a, 0x49799801, + 0x49799803, 0x49799806, 0x49799807, 0x49799808, + 0x49799805, 0x49799809, 0x0401f8c8, 0x0400000a, + 0x0401f8ea, 0x04000008, 0x48359800, 0x48359802, + 0x48359806, 0x4a019804, 0x00000001, 0x4a019807, + 0x00000006, 0x1c01f000, 0x4807c857, 0x58cc1007, + 0x40040000, 0x80080480, 0x04021020, 0x4c040000, + 0x4c080000, 0x0401f8d9, 0x5c001000, 0x5c000800, + 0x0400001c, 0x58cc0006, 0x80006540, 0x0402000b, + 0x48359800, 0x48359802, 0x48359806, 0x49799801, + 0x49799803, 0x49786801, 0x49786800, 0x49799804, + 0x49799807, 0x0401f005, 0x48306801, 0x48346000, + 0x48359806, 0x49786800, 0x58cc0004, 0x58cc1007, + 0x80000000, 0x82081400, 0x00000006, 0x48019804, + 0x48099807, 0x0401f7df, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x1c01f000, 0x480bc857, + 0x4c500000, 0x4c540000, 0x4c580000, 0x40083000, + 0x58cc0801, 0x82040480, 0x00000006, 0x02021800, + 0x0010032d, 0x82040400, 0x00105d57, 0x50000000, + 0x58cca800, 0x8054ac00, 0x42001800, 0x00000006, + 0x40040000, 0x800c0480, 0x80082480, 0x04021002, + 0x40080000, 0x8000b0c2, 0x8058b400, 0x5450a800, + 0x8050a000, 0x8054a800, 0x8058b040, 0x040207fc, + 0x40001000, 0x58cc2805, 0x58cc0807, 0x58cc2001, + 0x80142c00, 0x80040c80, 0x80102400, 0x48159805, + 0x48059807, 0x48119801, 0x82100580, 0x00000006, + 0x0400000c, 0x48119801, 0x40080000, 0x80181480, + 0x40083000, 0x04000003, 0x040217d6, 0x80000580, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x1c01f000, + 0x58cc0800, 0x800409c0, 0x02000800, 0x0010032d, + 0x58040800, 0x48059800, 0x41782000, 0x0401f7ee, + 0x0401f812, 0x50600000, 0x81041c00, 0x585c0205, + 0x4803c857, 0x82000580, 0x0000002c, 0x02020800, + 0x0010032d, 0x58040202, 0x800000e0, 0x80640540, + 0x48001802, 0x58040000, 0x48001800, 0x58040001, + 0x48001801, 0x1c01f000, 0x4807c856, 0x58cc0005, + 0x80000040, 0x02001800, 0x0010032d, 0x48019805, + 0x58cc1003, 0x82080480, 0x00000006, 0x02021800, + 0x0010032d, 0x82080400, 0x00105d57, 0x50000000, + 0x58cc0802, 0x80040c00, 0x80081000, 0x82080480, + 0x00000006, 0x0402000f, 0x58cc2002, 0x58100000, + 0x80006d40, 0x04000009, 0x4c340000, 0x0401f858, + 0x5c006800, 0x49786801, 0x48359802, 0x58cc0004, + 0x80000040, 0x48019804, 0x49799803, 0x0401f002, + 0x48099803, 0x1c01f000, 0x4807c856, 0x41781800, + 0x58c80201, 0x80000540, 0x04000002, 0x800c1800, + 0x58c80c01, 0x80040c80, 0x0400100a, 0x04000009, + 0x800c1800, 0x58c80202, 0x80041480, 0x04001005, + 0x04000004, 0x800c1800, 0x40080800, 0x0401f7fb, + 0x480d9204, 0x400c0000, 0x42002000, 0x00000001, + 0x80000040, 0x04000007, 0x04001006, 0x80102000, + 0x82000480, 0x00000005, 0x04000002, 0x040217fc, + 0x48119203, 0x1c01f000, 0x4807c856, 0x4d2c0000, + 0x58cc000a, 0x80000540, 0x02000800, 0x0010032d, + 0x82002400, 0x00000006, 0x0201f800, 0x0010055a, + 0x04000012, 0x492d9809, 0x497a5800, 0x497a5801, + 0x0201f800, 0x0010055a, 0x0400000c, 0x58cc0009, + 0x48025800, 0x497a5801, 0x492d9809, 0x82102480, + 0x00000006, 0x040217f7, 0x82000540, 0x00000001, + 0x5c025800, 0x1c01f000, 0x58cc0009, 0x80025d40, + 0x040007fc, 0x592c2000, 0x0201f800, 0x00100580, + 0x40100000, 0x0401f7fa, 0x58cc0009, 0x48cfc857, + 0x80006d40, 0x04000005, 0x50340000, 0x48019809, + 0x49786800, 0x49786801, 0x1c01f000, 0x4813c857, + 0x58cc0009, 0x48002000, 0x48119809, 0x1c01f000, + 0x4807c856, 0x4d2c0000, 0x58cc0009, 0x80025d40, + 0x04000007, 0x592c0000, 0x4c000000, 0x0201f800, + 0x00100580, 0x5c000000, 0x0401f7f9, 0x5c025800, + 0x1c01f000, 0x4807c856, 0x4d2c0000, 0x58cc0002, + 0x80025d40, 0x04000007, 0x592c0000, 0x4c000000, + 0x0201f800, 0x00100580, 0x5c000000, 0x0401f7f9, + 0x49799800, 0x49799802, 0x49799801, 0x49799803, + 0x49799806, 0x49799807, 0x49799808, 0x49799809, + 0x4979980a, 0x5c025800, 0x1c01f000, 0x00000003, + 0x00000006, 0x00000009, 0x0000000c, 0x0000000f, + 0x00000012, 0x4803c856, 0x0401f858, 0x4a00c205, + 0x0000003c, 0x5930100a, 0x82080580, 0x0010b976, + 0x04000013, 0x58080802, 0x82040d00, 0x00ffffff, + 0x58080403, 0x4804c006, 0x4800c407, 0x4a00c208, + 0x00000003, 0x59300812, 0x585c0405, 0x4978c207, + 0x4804c408, 0x80000540, 0x0400000d, 0x58600207, + 0x84000540, 0x4800c207, 0x0401f009, 0x585c080b, + 0x82040d00, 0x00ffffff, 0x4804c006, 0x4a00c407, + 0x000007ff, 0x4978c208, 0x0401f7ef, 0x82603c00, + 0x00000009, 0x58605405, 0x40282000, 0x405c6000, + 0x585c0a05, 0x82040d00, 0x0000000f, 0x82040c00, + 0x00100e3a, 0x50044000, 0x80004d80, 0x50200000, + 0x80307400, 0x58380402, 0x8c244d00, 0x04020003, + 0x48003a00, 0x0401f003, 0x48003c00, 0x801c3800, + 0x80244800, 0x80102040, 0x04000006, 0x0201f800, + 0x00100e18, 0x02000800, 0x0010032d, 0x0401f7f0, + 0x1c01f000, 0x4803c856, 0x4d340000, 0x5930000a, + 0x80026d40, 0x02000800, 0x0010032d, 0x59340212, + 0x82000500, 0x0000ff00, 0x0402000e, 0x59840000, + 0x80000540, 0x0400000b, 0x836c0580, 0x00000003, + 0x04020008, 0x59341c03, 0x42002000, 0x00000004, + 0x42003000, 0x00000004, 0x0201f800, 0x0010326a, + 0x5c026800, 0x1c01f000, 0x4803c856, 0x80001580, + 0x58c80c01, 0x59300012, 0x80040c80, 0x48066012, + 0x58c80201, 0x80000540, 0x04000005, 0x80081000, + 0x80040c80, 0x04001007, 0x04000006, 0x58c80202, + 0x80081000, 0x80040c80, 0x04001002, 0x040207fd, + 0x4808bc09, 0x4808c405, 0x1c01f000, 0x4803c856, + 0x4a0370e5, 0x00020000, 0x59b800e5, 0x8c000524, + 0x040207fc, 0x4a0370e5, 0x00030000, 0x40000000, + 0x40000000, 0x59b800e5, 0x8c000524, 0x040207f5, + 0x5934000e, 0x80006d40, 0x04000010, 0x81300580, + 0x04020004, 0x58340000, 0x4802680e, 0x0401f00a, + 0x40347800, 0x58340000, 0x80006d40, 0x02000800, + 0x0010032d, 0x81300580, 0x040207fa, 0x58340000, + 0x48007800, 0x497a6000, 0x4a0370e5, 0x00020000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x4d2c0000, + 0x42000800, 0x000003ff, 0x4a0370e5, 0x00020000, + 0x59b800e5, 0x8c000524, 0x04000005, 0x80040840, + 0x040207fa, 0x0201f800, 0x0010032d, 0x4a0370e5, + 0x00030000, 0x40000000, 0x40000000, 0x59b800e5, + 0x8c000524, 0x040207f1, 0x5934000e, 0x80026540, + 0x0400000e, 0x4933c857, 0x59300000, 0x4802680e, + 0x4a026203, 0x00000004, 0x497a6006, 0x497a600a, + 0x4a026008, 0x00000101, 0x59325809, 0x497a5c09, + 0x0401fd7a, 0x0401f7f1, 0x4a0370e5, 0x00020000, + 0x5c025800, 0x5c026000, 0x1c01f000, 0x4803c856, + 0x4c000000, 0x0201f800, 0x001054fb, 0x04020011, + 0x0201f800, 0x00103de1, 0x02020800, 0x0010032d, + 0x5c000000, 0x48026802, 0x0201f800, 0x00107188, + 0x04000009, 0x4936600a, 0x4a026407, 0x00000001, + 0x42027000, 0x00000001, 0x0201f000, 0x00020a34, + 0x5c000000, 0x1c01f000, 0x59300203, 0x82000c80, + 0x0000000e, 0x02021800, 0x0010032d, 0x4803c857, + 0x0c01f001, 0x00105e43, 0x00105e43, 0x00105e43, + 0x00105e45, 0x00105eb2, 0x00105e43, 0x00105e43, + 0x00105f04, 0x00105f05, 0x00105e43, 0x00105e43, + 0x00105e43, 0x00105e43, 0x00105e43, 0x0201f800, + 0x0010032d, 0x493bc857, 0x83380480, 0x00000050, + 0x02021800, 0x0010032d, 0x83380480, 0x00000049, + 0x02001800, 0x0010032d, 0x0c01f001, 0x00105e58, + 0x00105e89, 0x00105e56, 0x00105e56, 0x00105e56, + 0x00105e56, 0x00105e97, 0x0201f800, 0x0010032d, + 0x4d2c0000, 0x59325809, 0x592c0207, 0x48025c07, + 0x4a025a07, 0x00000000, 0x4c5c0000, 0x592cbc0b, + 0x592c0000, 0x48026009, 0x0201f800, 0x000203ab, + 0x59300c15, 0x59300009, 0x80000540, 0x0400000b, + 0x8c040d18, 0x04020014, 0x4a026203, 0x00000007, + 0x42027000, 0x00000043, 0x497a6415, 0x5c00b800, + 0x5c025800, 0x0401f093, 0x8c040d18, 0x04020010, + 0x8c5cbd08, 0x04020011, 0x4a026203, 0x00000007, + 0x497a6415, 0x497a6006, 0x5c00b800, 0x5c025800, + 0x1c01f000, 0x4d400000, 0x59325809, 0x42028000, + 0x00000005, 0x0401f922, 0x5c028000, 0x0201f800, + 0x00107144, 0x0401f7f5, 0x0201f800, 0x00020a10, + 0x0401f7f2, 0x0401fa59, 0x4d2c0000, 0x59325809, + 0x0201f800, 0x00108953, 0x04000006, 0x4d400000, + 0x42028000, 0x00000001, 0x0401f911, 0x5c028000, + 0x5c025800, 0x0201f000, 0x00020a10, 0x0401fa4b, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010e06f, + 0x5c027800, 0x42003000, 0x00000014, 0x0201f800, + 0x0010a5a1, 0x42000000, 0x0010bd1d, 0x0201f800, + 0x0010ae10, 0x4d2c0000, 0x59325809, 0x0201f800, + 0x00108953, 0x04000006, 0x4d400000, 0x42028000, + 0x00000029, 0x0401f8f6, 0x5c028000, 0x5c025800, + 0x0201f000, 0x00020a10, 0x493bc857, 0x497a6006, + 0x83380480, 0x00000054, 0x02021800, 0x0010032d, + 0x83380480, 0x00000047, 0x02001800, 0x0010032d, + 0x0c01f001, 0x00105f03, 0x00105ecc, 0x00105eca, + 0x00105eca, 0x00105eca, 0x00105eca, 0x00105eca, + 0x00105eca, 0x00105eca, 0x00105eca, 0x00105eca, + 0x00105eca, 0x00105ed0, 0x0201f800, 0x0010032d, + 0x59300012, 0x82000500, 0xffff0000, 0x04020034, + 0x59840802, 0x8c040d04, 0x04000025, 0x5930000a, + 0x80026d40, 0x0400001f, 0x4c5c0000, 0x4c600000, + 0x497a6006, 0x5930b809, 0x585c0006, 0x8000c540, + 0x02000800, 0x0010032d, 0x0401fe7f, 0x40625800, + 0x0201f800, 0x000203af, 0x4978b806, 0x0401fee8, + 0x497a600a, 0x585c3409, 0x0401fca9, 0x0400000e, + 0x42001000, 0x0010b96b, 0x0401fcde, 0x0400000a, + 0x0201f800, 0x0010056f, 0x04000007, 0x492cb806, + 0x585c5409, 0x0401fc6f, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x0401fc95, 0x0401f7fc, 0x8c040d06, + 0x040207fc, 0x5930000a, 0x80026d40, 0x04000006, + 0x5934000e, 0x80000540, 0x02020800, 0x0010032d, + 0x497a600a, 0x0401fcf9, 0x0401f7f2, 0x0401f088, + 0x4803c856, 0x4803c856, 0x83380580, 0x00000043, + 0x02020800, 0x0010032d, 0x4a026203, 0x00000003, + 0x493a6403, 0x59325809, 0x592c0010, 0x48026012, + 0x497a6014, 0x592c0407, 0x800000c2, 0x800010c4, + 0x80081400, 0x480a6006, 0x0201f800, 0x00020154, + 0x42000800, 0x80000060, 0x0201f000, 0x000209a3, + 0x42000000, 0x0010bd2f, 0x0201f800, 0x0010ae10, + 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, + 0x0010032d, 0x4803c857, 0x82000d80, 0x00000003, + 0x04000006, 0x82000d80, 0x00000004, 0x0400005d, + 0x0201f800, 0x0010032d, 0x4d400000, 0x42028000, + 0x00000006, 0x0401f82d, 0x5c028000, 0x1c01f000, + 0x4803c856, 0x59300203, 0x82000c80, 0x0000000e, + 0x02021800, 0x0010032d, 0x82000d80, 0x00000002, + 0x0400000f, 0x82000d80, 0x00000003, 0x04000006, + 0x82000d80, 0x00000004, 0x04000046, 0x0201f800, + 0x0010032d, 0x4d400000, 0x42028000, 0x00000005, + 0x0401f816, 0x5c028000, 0x1c01f000, 0x4933c857, + 0x4d2c0000, 0x59325809, 0x812e59c0, 0x02000800, + 0x0010032d, 0x592c1a09, 0x8c0c1d0e, 0x02000800, + 0x0010032d, 0x4d400000, 0x42028000, 0x00000001, + 0x0401f84b, 0x0201f800, 0x00107144, 0x5c028000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4943c857, + 0x0401fa52, 0x4df00000, 0x59300004, 0x8c00053e, + 0x04020006, 0x0201f800, 0x001064f2, 0x02020800, + 0x0010032d, 0x0401f01b, 0x0201f800, 0x00108659, + 0x04020007, 0x59300415, 0x84000558, 0x48026415, + 0x0201f800, 0x001063f6, 0x04020012, 0x0201f800, + 0x0010e2da, 0x80c40040, 0x04000005, 0x0401f946, + 0x02020800, 0x0010032d, 0x0401f00a, 0x59325809, + 0x0401f827, 0x0201f800, 0x00107144, 0x5c03e000, + 0x04000a1f, 0x82000540, 0x00000001, 0x1c01f000, + 0x5c03e000, 0x04000a1a, 0x80000580, 0x1c01f000, + 0x4933c857, 0x0201f800, 0x00100bd5, 0x4933c857, + 0x4c5c0000, 0x4d340000, 0x497a6006, 0x5930b809, + 0x5930000a, 0x80026d40, 0x04020e39, 0x42001000, + 0x0010b96b, 0x0401fc33, 0x04000009, 0x58c80204, + 0x4800bc09, 0x41785000, 0x0201f800, 0x00105b60, + 0x5c026800, 0x5c00b800, 0x1c01f000, 0x4978bc09, + 0x0201f800, 0x00105b8a, 0x0401f7fa, 0x4803c856, + 0x0201f800, 0x00108953, 0x0400000f, 0x592c0000, + 0x80000d40, 0x04000009, 0x497a5800, 0x49425a07, + 0x4c040000, 0x0201f800, 0x000203ab, 0x5c000800, + 0x40065800, 0x0401f7f6, 0x49425a07, 0x0201f800, + 0x000203ab, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, + 0x1c01f000, 0x4933c857, 0x59300c07, 0x82040580, + 0x0000000e, 0x04000004, 0x82040580, 0x00000009, + 0x04020004, 0x0401ffde, 0x497a6009, 0x80000580, + 0x1c01f000, 0x592e600a, 0x83300480, 0x0010f694, + 0x04001016, 0x41580000, 0x81300480, 0x04021013, + 0x40040000, 0x59300c07, 0x80040580, 0x04020012, + 0x59300a03, 0x82040580, 0x00000007, 0x02020800, + 0x0010032d, 0x59300009, 0x80000540, 0x02020800, + 0x0010032d, 0x0201f800, 0x00020a10, 0x42000000, + 0x00000000, 0x0401f009, 0x42000000, 0x00000008, + 0x0401f006, 0x82040580, 0x00000007, 0x040207fb, + 0x42000000, 0x00000005, 0x592c0a07, 0x48065c07, + 0x48025a07, 0x0201f000, 0x000203ab, 0x4c0c0000, + 0x4c100000, 0x4c140000, 0x4c180000, 0x80001d80, + 0x80002580, 0x42003000, 0x00000020, 0x82040500, + 0x00000001, 0x04000003, 0x40080000, 0x800c1c00, + 0x400c2800, 0x800c1902, 0x80102102, 0x82140500, + 0x00000001, 0x04000003, 0x82102540, 0x80000000, + 0x80040902, 0x80183040, 0x040207f1, 0x40100800, + 0x400c0000, 0x5c003000, 0x5c002800, 0x5c002000, + 0x5c001800, 0x1c01f000, 0x4c580000, 0x4200b000, + 0x00000020, 0x80000540, 0x04000018, 0x80041c80, + 0x04021016, 0x800810c2, 0x80040982, 0x04001006, + 0x80041c80, 0x04021005, 0x8058b040, 0x040207fa, + 0x0401f006, 0x80041c80, 0x400c0800, 0x80081000, + 0x8058b040, 0x040207f4, 0x4c000000, 0x41f00000, + 0x82000500, 0xf7ffffff, 0x4003e000, 0x5c000000, + 0x5c00b000, 0x1c01f000, 0x4c000000, 0x41f00000, + 0x82000540, 0x08000000, 0x0401f7f8, 0x42007000, + 0x0010b995, 0x4a007000, 0x00000005, 0x4a007401, + 0x00000000, 0x4a007201, 0x00000840, 0x4a007202, + 0x00000005, 0x4a0378e8, 0x00000000, 0x4a03c821, + 0x00000010, 0x4a03c823, 0x00000004, 0x0401f81e, + 0x4a0378e9, 0x00003a0d, 0x4a0378e8, 0x00000001, + 0x41780800, 0x4203a000, 0x00007600, 0x4a03a005, + 0xd0000001, 0x59d00006, 0x4a03a005, 0x90000001, + 0x83d3a400, 0x00000020, 0x80040800, 0x82040480, + 0x00000005, 0x040017f8, 0x59e00003, 0x82000500, + 0xffffffe0, 0x82000540, 0x00008000, 0x4803c003, + 0x59c40006, 0x82000500, 0xfffcffff, 0x48038806, + 0x1c01f000, 0x4d900000, 0x4d180000, 0x4a0378e7, + 0xaaaaaaaa, 0x4a0378e6, 0xaaaaaaaa, 0x4a0378e5, + 0xaaaaaaaa, 0x4a0378e4, 0xaaaaaaaa, 0x4a03781a, + 0x0010bc28, 0x4a03781b, 0x00100e3a, 0x4a03781c, + 0x00100e4a, 0x4a031800, 0x00000000, 0x4a031801, + 0x0010b998, 0x4a031802, 0x0010b99f, 0x42000800, + 0x0010bc2b, 0x417a3000, 0x811b20c8, 0x83932400, + 0x0000bf32, 0x48072000, 0x4a032001, 0x00000000, + 0x83180400, 0x001067bc, 0x50000000, 0x48032002, + 0x82040c00, 0x00000005, 0x811a3000, 0x83180480, + 0x00000005, 0x040017f1, 0x5c023000, 0x5c032000, + 0x1c01f000, 0x40680800, 0x0201f800, 0x000209b1, + 0x1c01f000, 0x4933c857, 0x59300804, 0x82040d00, + 0x00000100, 0x82040d40, 0x80000040, 0x48066004, + 0x497a6000, 0x59bc00ea, 0x8c000516, 0x040207fe, + 0x83300400, 0x60000000, 0x480378e1, 0x1c01f000, + 0x598c000f, 0x81300580, 0x04000003, 0x497a6008, + 0x1c01f000, 0x59c40004, 0x82000500, 0x0000000c, + 0x04000005, 0x4a038804, 0x0000000c, 0x497b2807, + 0x0401f00a, 0x0401fb01, 0x59300403, 0x82000d80, + 0x00000040, 0x04000004, 0x82000580, 0x00000042, + 0x04020002, 0x497a6008, 0x0201f800, 0x00106782, + 0x80000580, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, + 0x1c01f000, 0x59300804, 0x8c040d20, 0x04020004, + 0x82000540, 0x00000001, 0x1c01f000, 0x4933c857, + 0x4d380000, 0x59300804, 0x84040d20, 0x48066004, + 0x42027000, 0x00000049, 0x59300203, 0x82000580, + 0x00000003, 0x04000003, 0x42027000, 0x00000013, + 0x0201f800, 0x00020a34, 0x80000580, 0x5c027000, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, + 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, + 0x59300018, 0x81480580, 0x04020003, 0x59300019, + 0x814c0580, 0x1c01f000, 0x4d2c0000, 0x4d300000, + 0x0401f8ce, 0x4df00000, 0x0201f800, 0x00105999, + 0x59900001, 0x82000500, 0x00000003, 0x0c01f001, + 0x001060fd, 0x001060f2, 0x001060f0, 0x001060f0, + 0x0201f800, 0x0010032d, 0x59926004, 0x0401f88a, + 0x813261c0, 0x04000008, 0x59300004, 0x8c000516, + 0x04000004, 0x59325809, 0x497a5809, 0x497a580a, + 0x0401f88a, 0x5c03e000, 0x040008a1, 0x5c026000, + 0x5c025800, 0x1c01f000, 0x5c000000, 0x4c000000, + 0x4803c857, 0x4d300000, 0x497b2807, 0x0401f8ab, + 0x4df00000, 0x598c0000, 0x82000500, 0x0000000f, + 0x4803c857, 0x0c01f001, 0x00106143, 0x00106120, + 0x00106129, 0x00106130, 0x0010613e, 0x00106143, + 0x0010611e, 0x0010612d, 0x00106143, 0x0010611e, + 0x0010611e, 0x0010611e, 0x0010611e, 0x0010611e, + 0x0010611e, 0x0010611e, 0x0201f800, 0x0010032d, + 0x598c000f, 0x80026540, 0x04000004, 0x0401f824, + 0x02020800, 0x0010032d, 0x0201f800, 0x00106782, + 0x0401f01b, 0x0401f82d, 0x0201f800, 0x00106782, + 0x0401f017, 0x0201f800, 0x0010a8b9, 0x0401f7f7, + 0x598c000f, 0x80026540, 0x04000011, 0x0401f83b, + 0x04000007, 0x0401f812, 0x04000005, 0x0401f81f, + 0x04000003, 0x0201f800, 0x0010a8b9, 0x0201f800, + 0x00106782, 0x0401f006, 0x0401f830, 0x02020800, + 0x0010032d, 0x0201f800, 0x00106782, 0x5c03e000, + 0x0400085b, 0x5c026000, 0x1c01f000, 0x598c0009, + 0x81300580, 0x0402000c, 0x0401f84e, 0x0401f83b, + 0x59300000, 0x800001c0, 0x04000004, 0x48031809, + 0x497a6000, 0x0401f003, 0x497b1809, 0x497b1808, + 0x80000580, 0x1c01f000, 0x4d2c0000, 0x59300407, + 0x82000580, 0x00000003, 0x04020012, 0x598c000b, + 0x81300580, 0x0402000f, 0x0401f83a, 0x59325809, + 0x497a5809, 0x497a580a, 0x0401f824, 0x59300000, + 0x800001c0, 0x04000004, 0x4803180b, 0x497a6000, + 0x0401f003, 0x497b180a, 0x497b180b, 0x80000580, + 0x5c025800, 0x1c01f000, 0x598c0005, 0x81300580, + 0x0402000c, 0x0401f827, 0x0401f814, 0x59300000, + 0x800001c0, 0x04000004, 0x48031805, 0x497a6000, + 0x0401f003, 0x497b1805, 0x497b1804, 0x80000580, + 0x1c01f000, 0x4a032001, 0x00000000, 0x497b2004, + 0x497b2005, 0x59900006, 0x82000500, 0x0000ffff, + 0x48032006, 0x1c01f000, 0x4c040000, 0x59300004, + 0x82000500, 0x7ffeffff, 0x48026004, 0x59bc00e4, + 0x8c000514, 0x04000009, 0x42000800, 0x0000bf00, + 0x58040012, 0x81300580, 0x04020004, 0x49780812, + 0x4a0378e4, 0x00000800, 0x5c000800, 0x1c01f000, + 0x4803c856, 0x598c000e, 0x80000540, 0x04000003, + 0x80000040, 0x4803180e, 0x1c01f000, 0x59bc00ea, 0x82000500, 0x00000007, 0x82000580, 0x00000003, - 0x04000005, 0x80040840, 0x040207f9, 0x0201f800, - 0x0010032d, 0x1c01f000, 0x59bc00ea, 0x82000500, - 0x00000007, 0x82000580, 0x00000001, 0x02020800, - 0x0010032d, 0x59bc00ea, 0x8c000516, 0x040207fe, - 0x480778e1, 0x1c01f000, 0x40681000, 0x406c0800, - 0x59bc00ea, 0x8c000516, 0x040207fe, 0x480778e1, - 0x59bc00ea, 0x8c000516, 0x040207fe, 0x480b78e1, - 0x1c01f000, 0x4a0378e4, 0x00002000, 0x59a8006d, - 0x82000500, 0x0000000c, 0x04020008, 0x42007000, - 0x0010b895, 0x58380401, 0x8c000506, 0x04020003, - 0x4a0378e4, 0x00080000, 0x1c01f000, 0x82000d00, - 0x80000018, 0x02020800, 0x00100322, 0x0201f800, - 0x0010032d, 0x00106161, 0x00106206, 0x00106221, - 0x00106161, 0x00106163, 0x00106184, 0x001061a3, - 0x001061d7, 0x00106161, 0x00106204, 0x00106161, - 0x00106161, 0x00106161, 0x00106161, 0x00106161, - 0x00106161, 0x0201f800, 0x0010032d, 0x4d300000, - 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, - 0x0201f800, 0x00106705, 0x59bc00ea, 0x8c000510, - 0x040007fe, 0x59be60e0, 0x59300004, 0x8c000520, - 0x04000011, 0x82000500, 0xfffefeff, 0x48026004, - 0x4a026203, 0x00000003, 0x0401ff97, 0x0201f800, - 0x00100d39, 0x5c022800, 0x5c034800, 0x5c03a000, - 0x5c032000, 0x5c026000, 0x4a0378e4, 0x00000008, - 0x0401f77a, 0x84000510, 0x48026004, 0x0401f7f6, + 0x04020006, 0x4803c856, 0x4a0378e8, 0x00000001, + 0x4a0370e4, 0x00000800, 0x1c01f000, 0x0401f807, + 0x42018800, 0x00000001, 0x04000003, 0x42018800, + 0x00000000, 0x1c01f000, 0x59bc00ea, 0x82000500, + 0x00000007, 0x82000580, 0x00000001, 0x04020013, + 0x4803c856, 0x42000800, 0x00000000, 0x0401f810, + 0x4a0370e4, 0x00000c00, 0x42000800, 0x00001000, + 0x59bc00ea, 0x82000500, 0x00000007, 0x82000580, + 0x00000003, 0x04000005, 0x80040840, 0x040207f9, + 0x0201f800, 0x0010032d, 0x1c01f000, 0x59bc00ea, + 0x82000500, 0x00000007, 0x82000580, 0x00000001, + 0x02020800, 0x0010032d, 0x59bc00ea, 0x8c000516, + 0x040207fe, 0x480778e1, 0x1c01f000, 0x40681000, + 0x406c0800, 0x59bc00ea, 0x8c000516, 0x040207fe, + 0x480778e1, 0x59bc00ea, 0x8c000516, 0x040207fe, + 0x480b78e1, 0x1c01f000, 0x4a0378e4, 0x00002000, + 0x59a8006d, 0x82000500, 0x0000000c, 0x04020008, + 0x42007000, 0x0010b995, 0x58380401, 0x8c000506, + 0x04020003, 0x4a0378e4, 0x00080000, 0x1c01f000, + 0x82000d00, 0x80000018, 0x02020800, 0x00100322, + 0x0201f800, 0x0010032d, 0x00106206, 0x001062ab, + 0x001062c6, 0x00106206, 0x00106208, 0x00106229, + 0x00106248, 0x0010627c, 0x00106206, 0x001062a9, + 0x00106206, 0x00106206, 0x00106206, 0x00106206, + 0x00106206, 0x00106206, 0x0201f800, 0x0010032d, 0x4d300000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x0201f800, 0x00106705, 0x59bc00ea, + 0x4d140000, 0x0201f800, 0x001067aa, 0x59bc00ea, 0x8c000510, 0x040007fe, 0x59be60e0, 0x59300004, - 0x8c000520, 0x0400000f, 0x82000500, 0xfffefeff, - 0x48026004, 0x0401ff78, 0x0201f800, 0x00100d78, - 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x5c026000, 0x4a0378e4, 0x00000008, 0x0401f75b, - 0x84000510, 0x48026004, 0x0401f7f6, 0x4d300000, - 0x4d2c0000, 0x4d340000, 0x4da40000, 0x4cd00000, + 0x8c000520, 0x04000011, 0x82000500, 0xfffefeff, + 0x48026004, 0x4a026203, 0x00000003, 0x0401ff97, + 0x0201f800, 0x00100d3a, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x5c026000, 0x4a0378e4, + 0x00000008, 0x0401f77a, 0x84000510, 0x48026004, + 0x0401f7f6, 0x4d300000, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x0201f800, 0x001067aa, 0x59bc00ea, 0x8c000510, 0x040007fe, 0x59be60e0, - 0x813261c0, 0x02000800, 0x0010032d, 0x59300004, - 0x8c000520, 0x0400001e, 0x82000500, 0xfffefeff, - 0x48026004, 0x5932680a, 0x42034800, 0x0010b898, - 0x04011000, 0x4a03c840, 0x0010b89f, 0x4a03c842, - 0x00000012, 0x04011000, 0x4a03c840, 0x0010b8b1, - 0x4a03c842, 0x000000ff, 0x04011000, 0x4a03c840, - 0x0010b9b0, 0x4a03c842, 0x000000ff, 0x0201f800, - 0x0010671c, 0x5c01a000, 0x5c034800, 0x5c026800, - 0x5c025800, 0x5c026000, 0x1c01f000, 0x84000510, - 0x48026004, 0x5c01a000, 0x5c034800, 0x5c026800, - 0x5c025800, 0x5c026000, 0x1c01f000, 0x4d300000, - 0x4d2c0000, 0x4d340000, 0x4cd00000, 0x4d900000, - 0x4dd00000, 0x4da40000, 0x4d140000, 0x0201f800, - 0x00106705, 0x59bc00ea, 0x8c000510, 0x040007fe, - 0x59be60e0, 0x813261c0, 0x02000800, 0x0010032d, 0x59300004, 0x8c000520, 0x0400000f, 0x82000500, - 0xfffefeff, 0x48026004, 0x0201f800, 0x00106ef3, + 0xfffefeff, 0x48026004, 0x0401ff78, 0x0201f800, + 0x00100d79, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x5c026000, 0x4a0378e4, 0x00000008, + 0x0401f75b, 0x84000510, 0x48026004, 0x0401f7f6, + 0x4d300000, 0x4d2c0000, 0x4d340000, 0x4da40000, + 0x4cd00000, 0x59bc00ea, 0x8c000510, 0x040007fe, + 0x59be60e0, 0x813261c0, 0x02000800, 0x0010032d, + 0x59300004, 0x8c000520, 0x0400001e, 0x82000500, + 0xfffefeff, 0x48026004, 0x5932680a, 0x42034800, + 0x0010b998, 0x04011000, 0x4a03c840, 0x0010b99f, + 0x4a03c842, 0x00000012, 0x04011000, 0x4a03c840, + 0x0010b9b1, 0x4a03c842, 0x000000ff, 0x04011000, + 0x4a03c840, 0x0010bab0, 0x4a03c842, 0x000000ff, + 0x0201f800, 0x001067c1, 0x5c01a000, 0x5c034800, + 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x84000510, 0x48026004, 0x5c01a000, 0x5c034800, + 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x4d300000, 0x4d2c0000, 0x4d340000, 0x4cd00000, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x0201f800, 0x001067aa, 0x59bc00ea, 0x8c000510, + 0x040007fe, 0x59be60e0, 0x813261c0, 0x02000800, + 0x0010032d, 0x59300004, 0x8c000520, 0x0400000f, + 0x82000500, 0xfffefeff, 0x48026004, 0x0201f800, + 0x00106f82, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x5c01a000, 0x5c026800, 0x5c025800, + 0x5c026000, 0x1c01f000, 0x84000510, 0x48026004, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c01a000, 0x5c026800, 0x5c025800, 0x5c026000, - 0x1c01f000, 0x84000510, 0x48026004, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c01a000, - 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, - 0x0201f800, 0x0010032d, 0x4d300000, 0x4d380000, - 0x42000000, 0x0010bc7e, 0x0201f800, 0x0010ad1d, - 0x0401ff01, 0x598e600f, 0x59c40004, 0x8c000506, - 0x04000004, 0x0401f8f4, 0x4a038804, 0x00000008, - 0x813261c0, 0x04000007, 0x0201f800, 0x001066ff, - 0x42027000, 0x00000014, 0x0201f800, 0x00020a34, - 0x4a0378e4, 0x00000002, 0x5c027000, 0x5c026000, - 0x0401f6da, 0x4d180000, 0x4d300000, 0x4d380000, - 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, - 0x0401fee5, 0x417a3000, 0x59c40804, 0x83180400, - 0x001066af, 0x50000000, 0x80040500, 0x0400001c, - 0x42000000, 0x0010bc7f, 0x0201f800, 0x0010ad1d, - 0x0201f800, 0x00106705, 0x59926004, 0x0401f86a, - 0x83180400, 0x001066af, 0x50000000, 0x48038804, - 0x813261c0, 0x0400000a, 0x59300004, 0x8c00050c, - 0x04020003, 0x4a026203, 0x00000003, 0x42027000, - 0x0000004a, 0x0201f800, 0x00020a34, 0x59c40004, - 0x82000500, 0x00f80000, 0x04000005, 0x811a3000, - 0x83180480, 0x00000005, 0x040017dc, 0x4a0378e4, - 0x00000008, 0x5c022800, 0x5c034800, 0x5c03a000, - 0x5c032000, 0x5c027000, 0x5c026000, 0x5c023000, - 0x0401f6a2, 0x4d2c0000, 0x4d340000, 0x5932680a, - 0x598c0800, 0x82040580, 0x00000004, 0x04020006, - 0x838c1400, 0x00000005, 0x838c1c00, 0x00000004, - 0x0401f010, 0x82040580, 0x00000001, 0x04020006, - 0x838c1400, 0x00000009, 0x838c1c00, 0x00000008, - 0x0401f008, 0x82040580, 0x00000002, 0x04020028, - 0x838c1400, 0x0000000b, 0x838c1c00, 0x0000000a, - 0x41306800, 0x58340000, 0x80007d40, 0x04000020, - 0x583c000a, 0x81340580, 0x04020006, 0x403c6800, - 0x583c0000, 0x80007d40, 0x040207fa, 0x0401f018, - 0x4933c857, 0x483fc857, 0x583c0000, 0x48006800, - 0x49307800, 0x443c1000, 0x500c0000, 0x803c0580, - 0x04020002, 0x44341800, 0x80000580, 0x4803180f, - 0x48031811, 0x598c0000, 0x82000580, 0x00000003, - 0x04000003, 0x4a031800, 0x00000000, 0x80000580, - 0x5c026800, 0x5c025800, 0x1c01f000, 0x82000540, - 0x00000001, 0x0401f7fb, 0x0401f807, 0x42018800, - 0x00000000, 0x04000003, 0x42018800, 0x00000001, - 0x1c01f000, 0x491bc857, 0x59b400f6, 0x82000500, - 0x00000038, 0x040207fd, 0x59c80840, 0x82040540, - 0x00000010, 0x48039040, 0x59c41008, 0x4c040000, - 0x4c080000, 0x82081500, 0xffffff7f, 0x480b8808, - 0x0401fbe1, 0x04020007, 0x0401fbe5, 0x04000024, - 0x48038804, 0x0201f800, 0x00100df6, 0x0401f044, + 0x1c01f000, 0x0201f800, 0x0010032d, 0x4d300000, + 0x4d380000, 0x42000000, 0x0010bd7e, 0x0201f800, + 0x0010ae10, 0x0401ff01, 0x598e600f, 0x59c40004, + 0x8c000506, 0x04000004, 0x0401f8f4, 0x4a038804, + 0x00000008, 0x813261c0, 0x04000007, 0x0201f800, + 0x001067a4, 0x42027000, 0x00000014, 0x0201f800, + 0x00020a34, 0x4a0378e4, 0x00000002, 0x5c027000, + 0x5c026000, 0x0401f6da, 0x4d180000, 0x4d300000, + 0x4d380000, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x0401fee5, 0x417a3000, 0x59c40804, + 0x83180400, 0x00106754, 0x50000000, 0x80040500, + 0x0400001c, 0x42000000, 0x0010bd7f, 0x0201f800, + 0x0010ae10, 0x0201f800, 0x001067aa, 0x59926004, + 0x0401f86a, 0x83180400, 0x00106754, 0x50000000, + 0x48038804, 0x813261c0, 0x0400000a, 0x59300004, + 0x8c00050c, 0x04020003, 0x4a026203, 0x00000003, + 0x42027000, 0x0000004a, 0x0201f800, 0x00020a34, + 0x59c40004, 0x82000500, 0x00f80000, 0x04000005, + 0x811a3000, 0x83180480, 0x00000005, 0x040017dc, + 0x4a0378e4, 0x00000008, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x5c027000, 0x5c026000, + 0x5c023000, 0x0401f6a2, 0x4d2c0000, 0x4d340000, + 0x5932680a, 0x598c0800, 0x82040580, 0x00000004, + 0x04020006, 0x838c1400, 0x00000005, 0x838c1c00, + 0x00000004, 0x0401f010, 0x82040580, 0x00000001, + 0x04020006, 0x838c1400, 0x00000009, 0x838c1c00, + 0x00000008, 0x0401f008, 0x82040580, 0x00000002, + 0x04020028, 0x838c1400, 0x0000000b, 0x838c1c00, + 0x0000000a, 0x41306800, 0x58340000, 0x80007d40, + 0x04000020, 0x583c000a, 0x81340580, 0x04020006, + 0x403c6800, 0x583c0000, 0x80007d40, 0x040207fa, + 0x0401f018, 0x4933c857, 0x483fc857, 0x583c0000, + 0x48006800, 0x49307800, 0x443c1000, 0x500c0000, + 0x803c0580, 0x04020002, 0x44341800, 0x80000580, + 0x4803180f, 0x48031811, 0x598c0000, 0x82000580, + 0x00000003, 0x04000003, 0x4a031800, 0x00000000, + 0x80000580, 0x5c026800, 0x5c025800, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fb, 0x0401f807, + 0x42018800, 0x00000000, 0x04000003, 0x42018800, + 0x00000001, 0x1c01f000, 0x491bc857, 0x59b400f6, + 0x82000500, 0x00000038, 0x040207fd, 0x59c80840, + 0x82040540, 0x00000010, 0x48039040, 0x59c41008, + 0x4c040000, 0x4c080000, 0x82081500, 0xffffff7f, + 0x480b8808, 0x0401fbe1, 0x04020007, 0x0401fbe5, + 0x04000024, 0x48038804, 0x0201f800, 0x00100df7, + 0x0401f044, 0x4a038803, 0x00000008, 0x59c40003, + 0x82000500, 0x00000003, 0x040007fd, 0x8c000502, + 0x04020007, 0x0401fbd7, 0x04000016, 0x48038804, + 0x0201f800, 0x00100df7, 0x0401f036, 0x0401fbd7, + 0x04020007, 0x59c80040, 0x8400056a, 0x48039040, + 0x59c80040, 0x8c00052a, 0x040207fe, 0x59c40005, + 0x82000500, 0xc0000000, 0x04000006, 0x59c400a3, + 0x84000540, 0x480388a3, 0x4a038805, 0xc0000000, + 0x0201f800, 0x00100d88, 0x4a03a005, 0x30000000, + 0x59d00006, 0x4a03a005, 0x30000000, 0x59900006, + 0x82000500, 0xffff0000, 0x48032006, 0x59d00005, + 0x8c000504, 0x040207fe, 0x42000800, 0x00007600, + 0x83180540, 0x60000000, 0x480008a1, 0x811800dc, + 0x59c80840, 0x80040540, 0x48039040, 0x82000540, + 0x00003000, 0x48039040, 0x59c80040, 0x82000500, + 0x00003000, 0x040207fd, 0x0201f800, 0x00100de6, + 0x83180400, 0x00106754, 0x50000000, 0x48038804, + 0x80000580, 0x4df00000, 0x0201f800, 0x00105999, + 0x5c03e000, 0x5c001000, 0x5c000800, 0x480b8808, + 0x48079040, 0x1c01f000, 0x4803c856, 0x59b400f6, + 0x82000500, 0x00000038, 0x040207fd, 0x59c80840, + 0x82040540, 0x00000010, 0x48039040, 0x59c41008, + 0x4c040000, 0x4c080000, 0x82081500, 0xffffff7f, + 0x480b8808, 0x59c40004, 0x82000500, 0x00000003, + 0x04020010, 0x59c40004, 0x82000500, 0x0000000c, + 0x04000005, 0x4a038804, 0x0000000c, 0x8c000504, + 0x0401f025, 0x59c80040, 0x8400056e, 0x48039040, + 0x59c80040, 0x8c00052e, 0x040207fe, 0x0401f01e, 0x4a038803, 0x00000008, 0x59c40003, 0x82000500, - 0x00000003, 0x040007fd, 0x8c000502, 0x04020007, - 0x0401fbd7, 0x04000016, 0x48038804, 0x0201f800, - 0x00100df6, 0x0401f036, 0x0401fbd7, 0x04020007, - 0x59c80040, 0x8400056a, 0x48039040, 0x59c80040, - 0x8c00052a, 0x040207fe, 0x59c40005, 0x82000500, - 0xc0000000, 0x04000006, 0x59c400a3, 0x84000540, - 0x480388a3, 0x4a038805, 0xc0000000, 0x0201f800, - 0x00100d87, 0x4a03a005, 0x30000000, 0x59d00006, - 0x4a03a005, 0x30000000, 0x59900006, 0x82000500, - 0xffff0000, 0x48032006, 0x59d00005, 0x8c000504, - 0x040207fe, 0x42000800, 0x00007600, 0x83180540, - 0x60000000, 0x480008a1, 0x811800dc, 0x59c80840, - 0x80040540, 0x48039040, 0x82000540, 0x00003000, - 0x48039040, 0x59c80040, 0x82000500, 0x00003000, - 0x040207fd, 0x0201f800, 0x00100de5, 0x83180400, - 0x001066af, 0x50000000, 0x48038804, 0x80000580, - 0x4df00000, 0x0201f800, 0x001058f4, 0x5c03e000, - 0x5c001000, 0x5c000800, 0x480b8808, 0x48079040, - 0x1c01f000, 0x4803c856, 0x59b400f6, 0x82000500, - 0x00000038, 0x040207fd, 0x59c80840, 0x82040540, - 0x00000010, 0x48039040, 0x59c41008, 0x4c040000, - 0x4c080000, 0x82081500, 0xffffff7f, 0x480b8808, - 0x59c40004, 0x82000500, 0x00000003, 0x04020010, - 0x59c40004, 0x82000500, 0x0000000c, 0x04000005, - 0x4a038804, 0x0000000c, 0x8c000504, 0x0401f025, - 0x59c80040, 0x8400056e, 0x48039040, 0x59c80040, - 0x8c00052e, 0x040207fe, 0x0401f01e, 0x4a038803, - 0x00000008, 0x59c40003, 0x82000500, 0x00000003, - 0x040007fd, 0x8c000502, 0x04020006, 0x59c40004, - 0x4a038804, 0x0000000c, 0x8c000504, 0x0401f011, - 0x59c80040, 0x8400056a, 0x48039040, 0x59c80040, - 0x8c00052a, 0x040207fe, 0x59c40005, 0x82000500, - 0xc0000000, 0x04000007, 0x59c400a3, 0x84000540, - 0x480388a3, 0x4a038805, 0xc0000000, 0x80000580, - 0x497b2807, 0x5c001000, 0x5c000800, 0x480b8808, - 0x48079040, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000003, 0x040007fd, 0x8c000502, 0x04020006, + 0x59c40004, 0x4a038804, 0x0000000c, 0x8c000504, + 0x0401f011, 0x59c80040, 0x8400056a, 0x48039040, + 0x59c80040, 0x8c00052a, 0x040207fe, 0x59c40005, + 0x82000500, 0xc0000000, 0x04000007, 0x59c400a3, + 0x84000540, 0x480388a3, 0x4a038805, 0xc0000000, + 0x80000580, 0x497b2807, 0x5c001000, 0x5c000800, + 0x480b8808, 0x48079040, 0x1c01f000, 0x0401f807, + 0x42018800, 0x00000001, 0x04000003, 0x42018800, + 0x00000000, 0x1c01f000, 0x5c000000, 0x4c000000, + 0x4803c857, 0x491bc857, 0x4933c857, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x0401fdb3, + 0x4df00000, 0x0401fba9, 0x59900004, 0x800001c0, + 0x04000011, 0x81300580, 0x0402000f, 0x59300004, + 0x84000520, 0x48026004, 0x0401ff3c, 0x04020009, + 0x5c03e000, 0x04000d92, 0x80000580, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, + 0x0401fcce, 0x42027000, 0x00000049, 0x59300004, + 0x84000520, 0x48026004, 0x8c00050c, 0x02020800, + 0x00020a34, 0x5c03e000, 0x04000d81, 0x82000540, + 0x00000001, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, 0x04000003, 0x42018800, 0x00000000, - 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, - 0x491bc857, 0x4933c857, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x0401fdb3, 0x4df00000, - 0x0401fba9, 0x59900004, 0x800001c0, 0x04000011, - 0x81300580, 0x0402000f, 0x59300004, 0x84000520, - 0x48026004, 0x0401ff3c, 0x04020009, 0x5c03e000, - 0x04000d92, 0x80000580, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x1c01f000, 0x0401fcce, - 0x42027000, 0x00000049, 0x59300004, 0x84000520, - 0x48026004, 0x8c00050c, 0x02020800, 0x00020a34, - 0x5c03e000, 0x04000d81, 0x82000540, 0x00000001, + 0x1c01f000, 0x4933c857, 0x0401fd84, 0x4df00000, + 0x598c000f, 0x80026540, 0x04000012, 0x59300004, + 0x84000520, 0x48026004, 0x0401ff74, 0x04000017, + 0x0401fcca, 0x42027000, 0x00000013, 0x59300004, + 0x8c00050c, 0x02020800, 0x00020a34, 0x5c03e000, + 0x04000d5f, 0x82000540, 0x00000001, 0x1c01f000, + 0x836c1580, 0x00000001, 0x040007f9, 0x836c1580, + 0x00000004, 0x040007f6, 0x42001000, 0x0010392f, + 0x0201f800, 0x00105872, 0x5c03e000, 0x04000d50, + 0x80000580, 0x1c01f000, 0x4d300000, 0x4d180000, + 0x4d3c0000, 0x0401fd5d, 0x4df00000, 0x4a0378e4, + 0x0000000f, 0x0401fb29, 0x417a3000, 0x811808c8, + 0x82040c00, 0x0000bf32, 0x58066004, 0x813261c0, + 0x04000010, 0x417a7800, 0x0201f800, 0x001040c4, + 0x0400000a, 0x59300c07, 0x82040580, 0x00000003, + 0x04000004, 0x82040580, 0x00000006, 0x04020003, + 0x42027800, 0x00000002, 0x0201f800, 0x0010853c, + 0x811a3000, 0x83180480, 0x00000005, 0x040017e8, + 0x42000800, 0x00000040, 0x0201f800, 0x001010db, + 0x4a0378e4, 0x0000000a, 0x5c03e000, 0x04000d24, + 0x5c027800, 0x5c023000, 0x5c026000, 0x1c01f000, + 0x4803c856, 0x4d300000, 0x0401fd30, 0x4df00000, + 0x59c80840, 0x84040d74, 0x82040540, 0x00000010, + 0x48039040, 0x59c41008, 0x4c040000, 0x4c080000, + 0x82081500, 0xffffff7f, 0x480b8808, 0x42001000, + 0x00000003, 0x0401fae4, 0x598e600f, 0x813261c0, + 0x04020f99, 0x04000aed, 0x497b2807, 0x0401f809, + 0x5c001000, 0x5c000800, 0x480b8808, 0x48079040, + 0x5c03e000, 0x04000d02, 0x5c026000, 0x1c01f000, + 0x4d380000, 0x4d180000, 0x4d300000, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x417a3000, + 0x0201f800, 0x00105999, 0x811a3000, 0x83180580, + 0x00000005, 0x040207fb, 0x0401fabc, 0x04020009, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, - 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, - 0x4933c857, 0x0401fd84, 0x4df00000, 0x598c000f, - 0x80026540, 0x04000012, 0x59300004, 0x84000520, - 0x48026004, 0x0401ff74, 0x04000017, 0x0401fcca, - 0x42027000, 0x00000013, 0x59300004, 0x8c00050c, - 0x02020800, 0x00020a34, 0x5c03e000, 0x04000d5f, - 0x82000540, 0x00000001, 0x1c01f000, 0x836c1580, - 0x00000001, 0x040007f9, 0x836c1580, 0x00000004, - 0x040007f6, 0x42001000, 0x0010391c, 0x0201f800, - 0x001057cd, 0x5c03e000, 0x04000d50, 0x80000580, - 0x1c01f000, 0x4d300000, 0x4d180000, 0x4d3c0000, - 0x0401fd5d, 0x4df00000, 0x4a0378e4, 0x0000000f, - 0x0401fb29, 0x417a3000, 0x811808c8, 0x82040c00, - 0x0000bf32, 0x58066004, 0x813261c0, 0x04000010, - 0x417a7800, 0x0201f800, 0x001040aa, 0x0400000a, - 0x59300c07, 0x82040580, 0x00000003, 0x04000004, - 0x82040580, 0x00000006, 0x04020003, 0x42027800, - 0x00000002, 0x0201f800, 0x00108487, 0x811a3000, - 0x83180480, 0x00000005, 0x040017e8, 0x42000800, - 0x00000040, 0x0201f800, 0x001010da, 0x4a0378e4, - 0x0000000a, 0x5c03e000, 0x04000d24, 0x5c027800, - 0x5c023000, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x0401fd30, 0x4df00000, 0x59c80840, - 0x84040d74, 0x82040540, 0x00000010, 0x48039040, - 0x59c41008, 0x4c040000, 0x4c080000, 0x82081500, - 0xffffff7f, 0x480b8808, 0x42001000, 0x00000003, - 0x0401fae4, 0x598e600f, 0x813261c0, 0x04020f99, - 0x04000aed, 0x497b2807, 0x0401f809, 0x5c001000, - 0x5c000800, 0x480b8808, 0x48079040, 0x5c03e000, - 0x04000d02, 0x5c026000, 0x1c01f000, 0x4d380000, - 0x4d180000, 0x4d300000, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x417a3000, 0x0201f800, - 0x001058f4, 0x811a3000, 0x83180580, 0x00000005, - 0x040207fb, 0x0401fabc, 0x04020009, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c026000, - 0x5c023000, 0x5c027000, 0x1c01f000, 0x0401faf2, - 0x59926004, 0x4933c857, 0x0401fe8b, 0x813261c0, - 0x040007f3, 0x42027000, 0x0000004a, 0x4a026203, - 0x00000003, 0x0201f800, 0x00020a34, 0x0401f7ec, - 0x4d300000, 0x4d180000, 0x4d900000, 0x0401fcea, - 0x42001000, 0x00000000, 0x598c0800, 0x82040580, - 0x00000005, 0x04000003, 0x82040580, 0x00000008, - 0x04000aa4, 0x417a3000, 0x811b20c8, 0x83932400, - 0x0000bf32, 0x59900001, 0x82000580, 0x00000001, - 0x0402000d, 0x42000800, 0x00000004, 0x59926004, - 0x59300012, 0x82000500, 0xfff00000, 0x80000540, - 0x04000003, 0x42000800, 0x0000000e, 0x0201f800, - 0x001058d0, 0x811a3000, 0x83180480, 0x00000005, - 0x040017ea, 0x59c81040, 0x84081534, 0x480b9040, - 0x0401fcb2, 0x5c032000, 0x5c023000, 0x5c026000, - 0x1c01f000, 0x4933c857, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x4d380000, 0x0401fcba, - 0x4df00000, 0x59300004, 0x8c00053e, 0x04020007, - 0x8c000520, 0x04000027, 0x0201f800, 0x00106018, - 0x04000024, 0x0401f02c, 0x598c000f, 0x81300580, - 0x04000012, 0x0201f800, 0x001085a4, 0x04020026, - 0x0401fa33, 0x04000024, 0x48038804, 0x0401fa9e, - 0x0201f800, 0x00100df6, 0x0201f800, 0x0010603d, - 0x42027000, 0x00000049, 0x59300004, 0x8c00050c, - 0x0402000e, 0x0401f00f, 0x59c40004, 0x8c000504, - 0x04000015, 0x4a038804, 0x00000004, 0x0201f800, - 0x0010605d, 0x42027000, 0x00000013, 0x59300004, - 0x8c00050c, 0x04000003, 0x0201f800, 0x00020a34, - 0x5c03e000, 0x04000c79, 0x5c027000, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x80000580, - 0x1c01f000, 0x5c03e000, 0x04000c70, 0x5c027000, + 0x5c026000, 0x5c023000, 0x5c027000, 0x1c01f000, + 0x0401faf2, 0x59926004, 0x4933c857, 0x0401fe8b, + 0x813261c0, 0x040007f3, 0x42027000, 0x0000004a, + 0x4a026203, 0x00000003, 0x0201f800, 0x00020a34, + 0x0401f7ec, 0x4d300000, 0x4d180000, 0x4d900000, + 0x0401fcea, 0x42001000, 0x00000000, 0x598c0800, + 0x82040580, 0x00000005, 0x04000003, 0x82040580, + 0x00000008, 0x04000aa4, 0x417a3000, 0x811b20c8, + 0x83932400, 0x0000bf32, 0x59900001, 0x82000580, + 0x00000001, 0x0402000d, 0x42000800, 0x00000004, + 0x59926004, 0x59300012, 0x82000500, 0xfff00000, + 0x80000540, 0x04000003, 0x42000800, 0x0000000e, + 0x0201f800, 0x00105975, 0x811a3000, 0x83180480, + 0x00000005, 0x040017ea, 0x59c81040, 0x84081534, + 0x480b9040, 0x0401fcb2, 0x5c032000, 0x5c023000, + 0x5c026000, 0x1c01f000, 0x4933c857, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x4d380000, + 0x0401fcba, 0x4df00000, 0x59300004, 0x8c00053e, + 0x04020007, 0x8c000520, 0x04000027, 0x0201f800, + 0x001060bd, 0x04000024, 0x0401f02c, 0x598c000f, + 0x81300580, 0x04000012, 0x0201f800, 0x00108659, + 0x04020026, 0x0401fa33, 0x04000024, 0x48038804, + 0x0401fa9e, 0x0201f800, 0x00100df7, 0x0201f800, + 0x001060e2, 0x42027000, 0x00000049, 0x59300004, + 0x8c00050c, 0x0402000e, 0x0401f00f, 0x59c40004, + 0x8c000504, 0x04000015, 0x4a038804, 0x00000004, + 0x0201f800, 0x00106102, 0x42027000, 0x00000013, + 0x59300004, 0x8c00050c, 0x04000003, 0x0201f800, + 0x00020a34, 0x5c03e000, 0x04000c79, 0x5c027000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x82000540, 0x00000001, 0x1c01f000, 0x59300407, - 0x82000580, 0x00000003, 0x04020008, 0x0201f800, - 0x0010889a, 0x04000005, 0x59301009, 0x58080409, - 0x84000550, 0x48001409, 0x1c01f000, 0x497b2807, - 0x0401fc6d, 0x59c400af, 0x800001c0, 0x04020004, - 0x0401fc56, 0x0201f000, 0x001012cf, 0x598c0011, - 0x82001480, 0x00000002, 0x04021007, 0x80000000, - 0x48031811, 0x80000580, 0x0201f800, 0x001058c9, - 0x04000011, 0x0401fed7, 0x0402000f, 0x0401ffe0, - 0x42000000, 0x0010bc36, 0x0201f800, 0x0010ad1d, - 0x0401fda1, 0x04000008, 0x0401fa45, 0x4d380000, - 0x42027000, 0x00000014, 0x0201f800, 0x00020a34, - 0x5c027000, 0x0401fc39, 0x0201f000, 0x001012cf, - 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, - 0x4d300000, 0x0201f800, 0x001058f4, 0x0401fc42, - 0x59c400af, 0x800001c0, 0x0400002a, 0x0401fa36, - 0x59926004, 0x4933c857, 0x59300004, 0x8c000516, - 0x0400000b, 0x0401fe7c, 0x04020022, 0x0201f800, - 0x0010603d, 0x0401fc21, 0x42000800, 0x80000804, - 0x0201f800, 0x000209a3, 0x0401f01a, 0x42001800, - 0x00007530, 0x0401f9d8, 0x04020004, 0x0201f800, - 0x001058ce, 0x0401f013, 0x0401fe6b, 0x04020011, - 0x0401ffab, 0x42000000, 0x0010bc37, 0x0201f800, - 0x0010ad1d, 0x59300004, 0x8c00050c, 0x04020003, - 0x4a026203, 0x00000003, 0x4d380000, 0x42027000, - 0x0000004a, 0x0201f800, 0x00020a34, 0x5c027000, - 0x0401fc02, 0x5c026000, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x0201f000, 0x001012cf, - 0x4c600000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x4d300000, 0x4d2c0000, 0x0401fc06, - 0x0401f9fd, 0x59926004, 0x813261c0, 0x04000091, - 0x0201f800, 0x00104716, 0x04020007, 0x4178c000, - 0x0201f800, 0x0010704e, 0x04000003, 0x4200c000, - 0x00000001, 0x42000000, 0x00001000, 0x50000000, - 0x82000480, 0x24320001, 0x04001038, 0x0201f800, - 0x00100d87, 0x59303004, 0x8c183536, 0x0400002f, - 0x42003000, 0x00001000, 0x80183040, 0x04000014, - 0x0201f800, 0x0010ae33, 0x040007fc, 0x0201f800, - 0x00100636, 0x42003000, 0x00007a15, 0x50183800, - 0x821c0500, 0x00007000, 0x04000009, 0x48035075, - 0x821c0500, 0xffff8fff, 0x44003000, 0x4a032832, - 0x000004b0, 0x4a0378e4, 0x02c00000, 0x4a030000, - 0x00000000, 0x0201f800, 0x00100de5, 0x850e1d2e, - 0x42000000, 0x0010bcaf, 0x0201f800, 0x0010ad1d, - 0x59325809, 0x812e59c0, 0x02000800, 0x0010032d, - 0x0401f861, 0x04000057, 0x59303004, 0x84183536, - 0x481a6004, 0x0401f032, 0x0201f800, 0x001058e1, - 0x0400002c, 0x0401f04f, 0x0201f800, 0x00100de5, - 0x8d0e1d2e, 0x040207f9, 0x0201f800, 0x00104716, - 0x04020006, 0x8060c1c0, 0x04000004, 0x0201f800, - 0x00107078, 0x0401f043, 0x0201f800, 0x001058e1, - 0x04020040, 0x4933c857, 0x0401f93f, 0x04020019, - 0x0201f800, 0x001058f4, 0x813261c0, 0x04000039, - 0x59325809, 0x812e59c0, 0x02000800, 0x0010032d, - 0x0201f800, 0x00104716, 0x04020022, 0x59c40093, - 0x4803c857, 0x800001c0, 0x0402000a, 0x592c0209, - 0x84000550, 0x48025a09, 0x0201f800, 0x0010483a, - 0x04020028, 0x592c0209, 0x84000510, 0x48025a09, - 0x0201f800, 0x001058ce, 0x0401f022, 0x42000000, - 0x0010bc37, 0x0201f800, 0x0010ad1d, 0x0401fd22, - 0x592c0209, 0x84000550, 0x48025a09, 0x4d380000, - 0x42027000, 0x0000004a, 0x4a026203, 0x00000003, - 0x0201f800, 0x00020a34, 0x5c027000, 0x0401f011, - 0x59900006, 0x82000500, 0xffff0000, 0x040207ec, - 0x59c408af, 0x82040480, 0x000003e8, 0x040217e8, - 0x59900006, 0x82000400, 0x00010000, 0x48032006, - 0x0201f800, 0x001058ce, 0x0201f800, 0x001038f5, - 0x5c025800, 0x5c026000, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x5c00c000, 0x0201f000, - 0x001060fa, 0x4c5c0000, 0x4c640000, 0x5930bc07, - 0x5930c804, 0x825c0580, 0x00000003, 0x04000004, - 0x825c0580, 0x00000006, 0x0402002f, 0x0201f800, - 0x001040aa, 0x0402002c, 0x0401fcef, 0x0201f800, - 0x0010603d, 0x825c0580, 0x00000003, 0x04020005, - 0x8c64cd16, 0x0400000c, 0x8464cd36, 0x0401f01b, - 0x82640500, 0x0000001f, 0x82000580, 0x00000005, - 0x04000005, 0x0201f800, 0x0002015e, 0x8464cd4a, - 0x0401f7f6, 0x0401f820, 0x04020017, 0x48166012, - 0x0201f800, 0x00100e59, 0x04020013, 0x8264cd00, - 0xfff7ffdf, 0x592c0209, 0x8c00051e, 0x04020011, - 0x8464cd4a, 0x50201800, 0x480e600b, 0x4832600c, - 0x4822600d, 0x482a600e, 0x8464cd7e, 0x48666004, - 0x0401f835, 0x80000580, 0x5c00c800, 0x5c00b800, - 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fb, - 0x8400051e, 0x48025a09, 0x0201f800, 0x00100e17, - 0x0401f7ed, 0x59302013, 0x811808c2, 0x82040c00, - 0x00006000, 0x58040101, 0x82000500, 0xffff0000, - 0x800001c0, 0x0400000b, 0x811808ca, 0x82040c00, - 0x00006000, 0x58040138, 0x58042139, 0x81a41000, - 0x58081403, 0x800810e0, 0x80081540, 0x480a601b, - 0x59300013, 0x80100480, 0x04001010, 0x59902808, - 0x59303016, 0x80140480, 0x0400100c, 0x40002800, - 0x80180480, 0x04001009, 0x48026016, 0x8464cd36, - 0x59300014, 0x80100580, 0x04000003, 0x8464cd76, - 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, - 0x1c01f000, 0x59bc00ea, 0x82000500, 0x00000007, - 0x82000580, 0x00000001, 0x02000800, 0x0010032d, - 0x5930080a, 0x5804100c, 0x480bc857, 0x800811c0, - 0x04020003, 0x4930080c, 0x0401f01b, 0x59bc1031, - 0x40081800, 0x800811c0, 0x02000800, 0x0010032d, - 0x5808000a, 0x80040580, 0x04000004, 0x40081800, - 0x58081000, 0x0401f7f8, 0x58082000, 0x49781000, - 0x480a6001, 0x400c0000, 0x80080580, 0x04020006, - 0x49337831, 0x48126000, 0x801021c0, 0x0402000d, - 0x0401f00b, 0x48101800, 0x801021c0, 0x04020002, - 0x480f7830, 0x59bc0831, 0x4807c857, 0x48066000, - 0x49337831, 0x800409c0, 0x04020002, 0x49337830, - 0x1c01f000, 0x4d300000, 0x4d2c0000, 0x0201f800, - 0x0010610d, 0x598e600f, 0x4933c857, 0x813261c0, - 0x04000049, 0x59c41004, 0x480bc857, 0x8c081500, - 0x0400000a, 0x0201f800, 0x00104716, 0x04020015, - 0x0201f800, 0x0010483a, 0x0402003f, 0x0201f800, - 0x001058c9, 0x0401f03c, 0x82080500, 0x000001fe, - 0x040207fb, 0x59c8010b, 0x4803c857, 0x8c000500, - 0x040007f7, 0x42000000, 0x0010bc80, 0x0201f800, - 0x0010ad1d, 0x0401fd2b, 0x0400087f, 0x0401f02e, - 0x598c0011, 0x80000540, 0x04020011, 0x59c408af, - 0x82040480, 0x000003e8, 0x0402100d, 0x598c0811, - 0x80040800, 0x48071811, 0x0201f800, 0x001058c9, - 0x42000000, 0x0010bb75, 0x0201f800, 0x0010ad1d, - 0x0201f800, 0x001038f5, 0x0401f01b, 0x42000000, - 0x0010bc36, 0x0201f800, 0x0010ad1d, 0x0401fc8e, - 0x813261c0, 0x04020003, 0x0401f863, 0x0401f012, - 0x59300407, 0x82000580, 0x00000003, 0x04020007, - 0x59325809, 0x812e59c0, 0x04000004, 0x592c0209, - 0x84000550, 0x48025a09, 0x0401f879, 0x4d380000, - 0x42027000, 0x00000014, 0x0201f800, 0x00020a34, - 0x5c027000, 0x5c025800, 0x5c026000, 0x0201f000, - 0x001060fa, 0x59c40804, 0x83180400, 0x001066a5, - 0x50000000, 0x80040500, 0x1c01f000, 0x59c40804, - 0x83180400, 0x001066aa, 0x50000000, 0x80040500, - 0x1c01f000, 0x59c80840, 0x82040d00, 0x000e0000, - 0x83180400, 0x001066b4, 0x50000000, 0x80040580, - 0x1c01f000, 0x00000210, 0x00000420, 0x00000840, - 0x00001080, 0x00002100, 0x00004000, 0x00008000, - 0x00010000, 0x00020000, 0x00040000, 0x00080000, - 0x00100000, 0x00200000, 0x00400000, 0x00800000, - 0x00000000, 0x00020000, 0x00040000, 0x00060000, - 0x00080000, 0x59900806, 0x80040120, 0x800c0480, - 0x04021004, 0x82000540, 0x00000001, 0x0401f005, - 0x82040c00, 0x00010000, 0x48072006, 0x80000580, - 0x1c01f000, 0x417a3000, 0x0401ffd7, 0x04000006, - 0x811a3000, 0x83180580, 0x00000005, 0x040207fb, - 0x1c01f000, 0x81780080, 0x1c01f000, 0x40681000, - 0x480bc857, 0x0201f800, 0x0010610d, 0x4df00000, - 0x598c0800, 0x82040d80, 0x00000007, 0x04000002, - 0x480b1800, 0x5c03e000, 0x02000800, 0x001060fa, - 0x1c01f000, 0x4803c856, 0x0201f800, 0x0010610d, - 0x4df00000, 0x497b180f, 0x497b1803, 0x497b1810, - 0x497b1811, 0x497b1812, 0x598c0000, 0x82000580, - 0x00000003, 0x04000012, 0x59a80073, 0x8c00053e, - 0x04000007, 0x59bc00e4, 0x8c000534, 0x04000004, - 0x4a031800, 0x00000008, 0x0401f009, 0x836c0580, - 0x00000002, 0x04020004, 0x4a031800, 0x00000005, - 0x0401f003, 0x4a031800, 0x00000000, 0x5c03e000, - 0x02000800, 0x001060fa, 0x1c01f000, 0x59300004, - 0x8c00050c, 0x04020003, 0x4a026203, 0x00000001, - 0x1c01f000, 0x83180480, 0x00000005, 0x02021800, - 0x0010032d, 0x491bc857, 0x811b20c8, 0x83932400, - 0x0000bf32, 0x811ba0ca, 0x83d3a400, 0x00007600, - 0x83180400, 0x00106717, 0x50034800, 0x811a28c2, - 0x83162c00, 0x00006100, 0x1c01f000, 0x0010baaf, - 0x0010bac6, 0x0010badd, 0x0010baf4, 0x0010bb0b, - 0x4933c857, 0x59300407, 0x82000c80, 0x00000014, - 0x04021017, 0x04011000, 0x0c01f001, 0x00106737, - 0x001067de, 0x00106b6d, 0x00106bc7, 0x001067de, - 0x00106b6d, 0x00106bc7, 0x00106737, 0x001067de, - 0x00106737, 0x00106737, 0x00106737, 0x00106737, - 0x00106737, 0x00106737, 0x00106737, 0x0010673e, - 0x0010673e, 0x0010a821, 0x0010a8f0, 0x4803c857, - 0x0201f800, 0x0010610d, 0x0201f800, 0x0010605d, - 0x0201f000, 0x001060fa, 0x42001000, 0x0010bb55, - 0x50081000, 0x4930100b, 0x58080002, 0x82000580, - 0x00000100, 0x0402003e, 0x59325809, 0x812e59c0, - 0x02000800, 0x0010032d, 0x492fc856, 0x5932680a, - 0x813669c0, 0x04000024, 0x592c040c, 0x82000500, - 0x0000e000, 0x04000004, 0x0201f800, 0x00106b66, - 0x0401f003, 0x0201f800, 0x00106b58, 0x592c000e, + 0x80000580, 0x1c01f000, 0x5c03e000, 0x04000c70, + 0x5c027000, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x82000540, 0x00000001, 0x1c01f000, + 0x59300407, 0x82000580, 0x00000003, 0x04020008, + 0x0201f800, 0x00108953, 0x04000005, 0x59301009, + 0x58080409, 0x84000550, 0x48001409, 0x1c01f000, + 0x497b2807, 0x0401fc6d, 0x59c400af, 0x800001c0, + 0x04020004, 0x0401fc56, 0x0201f000, 0x001012d0, + 0x598c0011, 0x82001480, 0x00000002, 0x04021007, + 0x80000000, 0x48031811, 0x80000580, 0x0201f800, + 0x0010596e, 0x04000011, 0x0401fed7, 0x0402000f, + 0x0401ffe0, 0x42000000, 0x0010bd36, 0x0201f800, + 0x0010ae10, 0x0401fda1, 0x04000008, 0x0401fa45, + 0x4d380000, 0x42027000, 0x00000014, 0x0201f800, + 0x00020a34, 0x5c027000, 0x0401fc39, 0x0201f000, + 0x001012d0, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x4d300000, 0x0201f800, 0x00105999, + 0x0401fc42, 0x59c400af, 0x800001c0, 0x0400002a, + 0x0401fa36, 0x59926004, 0x4933c857, 0x59300004, + 0x8c000516, 0x0400000b, 0x0401fe7c, 0x04020022, + 0x0201f800, 0x001060e2, 0x0401fc21, 0x42000800, + 0x80000804, 0x0201f800, 0x000209a3, 0x0401f01a, + 0x42001800, 0x00007530, 0x0401f9d8, 0x04020004, + 0x0201f800, 0x00105973, 0x0401f013, 0x0401fe6b, + 0x04020011, 0x0401ffab, 0x42000000, 0x0010bd37, + 0x0201f800, 0x0010ae10, 0x59300004, 0x8c00050c, + 0x04020003, 0x4a026203, 0x00000003, 0x4d380000, + 0x42027000, 0x0000004a, 0x0201f800, 0x00020a34, + 0x5c027000, 0x0401fc02, 0x5c026000, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x0201f000, + 0x001012d0, 0x4c600000, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x4d300000, 0x4d2c0000, + 0x0401fc06, 0x0401f9fd, 0x59926004, 0x813261c0, + 0x04000091, 0x0201f800, 0x00104755, 0x04020007, + 0x4178c000, 0x0201f800, 0x001070dd, 0x04000003, + 0x4200c000, 0x00000001, 0x42000000, 0x00001000, + 0x50000000, 0x82000480, 0x24320001, 0x04001038, + 0x0201f800, 0x00100d88, 0x59303004, 0x8c183536, + 0x0400002f, 0x42003000, 0x00001000, 0x80183040, + 0x04000014, 0x0201f800, 0x0010af26, 0x040007fc, + 0x0201f800, 0x00100636, 0x42003000, 0x00007a15, + 0x50183800, 0x821c0500, 0x00007000, 0x04000009, + 0x48035075, 0x821c0500, 0xffff8fff, 0x44003000, + 0x4a032832, 0x000004b0, 0x4a0378e4, 0x02c00000, + 0x4a030000, 0x00000000, 0x0201f800, 0x00100de6, + 0x850e1d2e, 0x42000000, 0x0010bdaf, 0x0201f800, + 0x0010ae10, 0x59325809, 0x812e59c0, 0x02000800, + 0x0010032d, 0x0401f861, 0x04000057, 0x59303004, + 0x84183536, 0x481a6004, 0x0401f032, 0x0201f800, + 0x00105986, 0x0400002c, 0x0401f04f, 0x0201f800, + 0x00100de6, 0x8d0e1d2e, 0x040207f9, 0x0201f800, + 0x00104755, 0x04020006, 0x8060c1c0, 0x04000004, + 0x0201f800, 0x00107107, 0x0401f043, 0x0201f800, + 0x00105986, 0x04020040, 0x4933c857, 0x0401f93f, + 0x04020019, 0x0201f800, 0x00105999, 0x813261c0, + 0x04000039, 0x59325809, 0x812e59c0, 0x02000800, + 0x0010032d, 0x0201f800, 0x00104755, 0x04020022, + 0x59c40093, 0x4803c857, 0x800001c0, 0x0402000a, + 0x592c0209, 0x84000550, 0x48025a09, 0x0201f800, + 0x00104879, 0x04020028, 0x592c0209, 0x84000510, + 0x48025a09, 0x0201f800, 0x00105973, 0x0401f022, + 0x42000000, 0x0010bd37, 0x0201f800, 0x0010ae10, + 0x0401fd22, 0x592c0209, 0x84000550, 0x48025a09, + 0x4d380000, 0x42027000, 0x0000004a, 0x4a026203, + 0x00000003, 0x0201f800, 0x00020a34, 0x5c027000, + 0x0401f011, 0x59900006, 0x82000500, 0xffff0000, + 0x040207ec, 0x59c408af, 0x82040480, 0x000003e8, + 0x040217e8, 0x59900006, 0x82000400, 0x00010000, + 0x48032006, 0x0201f800, 0x00105973, 0x0201f800, + 0x00103908, 0x5c025800, 0x5c026000, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c00c000, + 0x0201f000, 0x0010619f, 0x4c5c0000, 0x4c640000, + 0x5930bc07, 0x5930c804, 0x825c0580, 0x00000003, + 0x04000004, 0x825c0580, 0x00000006, 0x0402002f, + 0x0201f800, 0x001040c4, 0x0402002c, 0x0401fcef, + 0x0201f800, 0x001060e2, 0x825c0580, 0x00000003, + 0x04020005, 0x8c64cd16, 0x0400000c, 0x8464cd36, + 0x0401f01b, 0x82640500, 0x0000001f, 0x82000580, + 0x00000005, 0x04000005, 0x0201f800, 0x0002015e, + 0x8464cd4a, 0x0401f7f6, 0x0401f820, 0x04020017, + 0x48166012, 0x0201f800, 0x00100e5a, 0x04020013, + 0x8264cd00, 0xfff7ffdf, 0x592c0209, 0x8c00051e, + 0x04020011, 0x8464cd4a, 0x50201800, 0x480e600b, + 0x4832600c, 0x4822600d, 0x482a600e, 0x8464cd7e, + 0x48666004, 0x0401f835, 0x80000580, 0x5c00c800, + 0x5c00b800, 0x1c01f000, 0x82000540, 0x00000001, + 0x0401f7fb, 0x8400051e, 0x48025a09, 0x0201f800, + 0x00100e18, 0x0401f7ed, 0x59302013, 0x811808c2, + 0x82040c00, 0x00006000, 0x58040101, 0x82000500, + 0xffff0000, 0x800001c0, 0x0400000b, 0x811808ca, + 0x82040c00, 0x00006000, 0x58040138, 0x58042139, + 0x81a41000, 0x58081403, 0x800810e0, 0x80081540, + 0x480a601b, 0x59300013, 0x80100480, 0x04001010, + 0x59902808, 0x59303016, 0x80140480, 0x0400100c, + 0x40002800, 0x80180480, 0x04001009, 0x48026016, + 0x8464cd36, 0x59300014, 0x80100580, 0x04000003, + 0x8464cd76, 0x80000580, 0x1c01f000, 0x82000540, + 0x00000001, 0x1c01f000, 0x59bc00ea, 0x82000500, + 0x00000007, 0x82000580, 0x00000001, 0x02000800, + 0x0010032d, 0x5930080a, 0x5804100c, 0x480bc857, + 0x800811c0, 0x04020003, 0x4930080c, 0x0401f01b, + 0x59bc1031, 0x40081800, 0x800811c0, 0x02000800, + 0x0010032d, 0x5808000a, 0x80040580, 0x04000004, + 0x40081800, 0x58081000, 0x0401f7f8, 0x58082000, + 0x49781000, 0x480a6001, 0x400c0000, 0x80080580, + 0x04020006, 0x49337831, 0x48126000, 0x801021c0, + 0x0402000d, 0x0401f00b, 0x48101800, 0x801021c0, + 0x04020002, 0x480f7830, 0x59bc0831, 0x4807c857, + 0x48066000, 0x49337831, 0x800409c0, 0x04020002, + 0x49337830, 0x1c01f000, 0x4d300000, 0x4d2c0000, + 0x0201f800, 0x001061b2, 0x598e600f, 0x4933c857, + 0x813261c0, 0x04000049, 0x59c41004, 0x480bc857, + 0x8c081500, 0x0400000a, 0x0201f800, 0x00104755, + 0x04020015, 0x0201f800, 0x00104879, 0x0402003f, + 0x0201f800, 0x0010596e, 0x0401f03c, 0x82080500, + 0x000001fe, 0x040207fb, 0x59c8010b, 0x4803c857, + 0x8c000500, 0x040007f7, 0x42000000, 0x0010bd80, + 0x0201f800, 0x0010ae10, 0x0401fd2b, 0x0400087f, + 0x0401f02e, 0x598c0011, 0x80000540, 0x04020011, + 0x59c408af, 0x82040480, 0x000003e8, 0x0402100d, + 0x598c0811, 0x80040800, 0x48071811, 0x0201f800, + 0x0010596e, 0x42000000, 0x0010bc75, 0x0201f800, + 0x0010ae10, 0x0201f800, 0x00103908, 0x0401f01b, + 0x42000000, 0x0010bd36, 0x0201f800, 0x0010ae10, + 0x0401fc8e, 0x813261c0, 0x04020003, 0x0401f863, + 0x0401f012, 0x59300407, 0x82000580, 0x00000003, + 0x04020007, 0x59325809, 0x812e59c0, 0x04000004, + 0x592c0209, 0x84000550, 0x48025a09, 0x0401f879, + 0x4d380000, 0x42027000, 0x00000014, 0x0201f800, + 0x00020a34, 0x5c027000, 0x5c025800, 0x5c026000, + 0x0201f000, 0x0010619f, 0x59c40804, 0x83180400, + 0x0010674a, 0x50000000, 0x80040500, 0x1c01f000, + 0x59c40804, 0x83180400, 0x0010674f, 0x50000000, + 0x80040500, 0x1c01f000, 0x59c80840, 0x82040d00, + 0x000e0000, 0x83180400, 0x00106759, 0x50000000, + 0x80040580, 0x1c01f000, 0x00000210, 0x00000420, + 0x00000840, 0x00001080, 0x00002100, 0x00004000, + 0x00008000, 0x00010000, 0x00020000, 0x00040000, + 0x00080000, 0x00100000, 0x00200000, 0x00400000, + 0x00800000, 0x00000000, 0x00020000, 0x00040000, + 0x00060000, 0x00080000, 0x59900806, 0x80040120, + 0x800c0480, 0x04021004, 0x82000540, 0x00000001, + 0x0401f005, 0x82040c00, 0x00010000, 0x48072006, + 0x80000580, 0x1c01f000, 0x417a3000, 0x0401ffd7, + 0x04000006, 0x811a3000, 0x83180580, 0x00000005, + 0x040207fb, 0x1c01f000, 0x81780080, 0x1c01f000, + 0x40681000, 0x480bc857, 0x0201f800, 0x001061b2, + 0x4df00000, 0x598c0800, 0x82040d80, 0x00000007, + 0x04000002, 0x480b1800, 0x5c03e000, 0x02000800, + 0x0010619f, 0x1c01f000, 0x4803c856, 0x0201f800, + 0x001061b2, 0x4df00000, 0x497b180f, 0x497b1803, + 0x497b1810, 0x497b1811, 0x497b1812, 0x598c0000, + 0x82000580, 0x00000003, 0x04000012, 0x59a80073, + 0x8c00053e, 0x04000007, 0x59bc00e4, 0x8c000534, + 0x04000004, 0x4a031800, 0x00000008, 0x0401f009, + 0x836c0580, 0x00000002, 0x04020004, 0x4a031800, + 0x00000005, 0x0401f003, 0x4a031800, 0x00000000, + 0x5c03e000, 0x02000800, 0x0010619f, 0x1c01f000, + 0x59300004, 0x8c00050c, 0x04020003, 0x4a026203, + 0x00000001, 0x1c01f000, 0x83180480, 0x00000005, + 0x02021800, 0x0010032d, 0x491bc857, 0x811b20c8, + 0x83932400, 0x0000bf32, 0x811ba0ca, 0x83d3a400, + 0x00007600, 0x83180400, 0x001067bc, 0x50034800, + 0x811a28c2, 0x83162c00, 0x00006100, 0x1c01f000, + 0x0010bbaf, 0x0010bbc6, 0x0010bbdd, 0x0010bbf4, + 0x0010bc0b, 0x4933c857, 0x59300407, 0x82000c80, + 0x00000014, 0x04021017, 0x04011000, 0x0c01f001, + 0x001067dc, 0x00106880, 0x00106bfc, 0x00106c56, + 0x00106880, 0x00106bfc, 0x00106c56, 0x001067dc, + 0x00106880, 0x001067dc, 0x001067dc, 0x001067dc, + 0x001067dc, 0x001067dc, 0x001067dc, 0x001067dc, + 0x001067e3, 0x001067e3, 0x0010a914, 0x0010a9e3, + 0x4803c857, 0x0201f800, 0x001061b2, 0x0201f800, + 0x00106102, 0x0201f000, 0x0010619f, 0x42001000, + 0x0010bc55, 0x50081000, 0x4930100b, 0x58080002, + 0x82000580, 0x00000100, 0x0402003b, 0x59325809, + 0x812e59c0, 0x02000800, 0x0010032d, 0x492fc856, + 0x5932680a, 0x83340580, 0x0010c2b2, 0x04000022, + 0x592c040c, 0x82000500, 0x0000e000, 0x04000003, + 0x0401fbfd, 0x0401f002, 0x0401fbed, 0x592c000e, 0x82000500, 0x00000003, 0x04000007, 0x82000580, 0x00000003, 0x80000000, 0x58d00802, 0x80040540, - 0x4801a002, 0x42001000, 0x0010bb55, 0x50081000, + 0x4801a002, 0x42001000, 0x0010bc55, 0x50081000, 0x4930100a, 0x492c1009, 0x82d00400, 0x00000006, 0x48001003, 0x592c000e, 0x48001005, 0x592c000f, 0x48001006, 0x592c0010, 0x48001007, 0x0201f000, - 0x00020016, 0x42026800, 0x0010c1b2, 0x592c080b, - 0x48066802, 0x82040500, 0x00ffff00, 0x04000007, - 0x497a6a12, 0x59a8100f, 0x82081500, 0x00ffff00, - 0x80080580, 0x040207d1, 0x82040d00, 0x000000ff, - 0x800408d0, 0x48066a12, 0x0401f7cc, 0x1c01f000, - 0x4d2c0000, 0x4d300000, 0x4c580000, 0x4c540000, - 0x4c500000, 0x58325809, 0x812e59c0, 0x02000800, - 0x0010032d, 0x58300002, 0x82000580, 0x00000100, - 0x04020022, 0x5830000a, 0x5832600b, 0x81300d80, - 0x04020012, 0x0401f834, 0x04020016, 0x592c080e, - 0x82040c00, 0x00000003, 0x80040904, 0x4004b000, - 0x4200a000, 0x0010b89f, 0x4050a800, 0x0201f800, - 0x0010ae19, 0x42001000, 0x0000dc00, 0x0201f800, - 0x00106f71, 0x0401f007, 0x4803c857, 0x4933c857, - 0x813261c0, 0x04000003, 0x0401f81f, 0x04000f93, - 0x5c00a000, 0x5c00a800, 0x5c00b000, 0x5c026000, - 0x5c025800, 0x1c01f000, 0x5830000a, 0x5832600b, - 0x4a006002, 0x00000100, 0x4803c857, 0x4933c857, - 0x81300d80, 0x040207ed, 0x0401f80f, 0x040207f1, - 0x4803c857, 0x0201f800, 0x0010e343, 0x80c40040, - 0x02020800, 0x0010032d, 0x4a025a07, 0x00000002, - 0x0201f800, 0x000203ab, 0x0201f800, 0x001070b5, - 0x0401f7e4, 0x0201f800, 0x0010610d, 0x4df00000, - 0x598c000f, 0x81300580, 0x04020009, 0x598c0005, - 0x81300580, 0x04020006, 0x5c03e000, 0x02000800, - 0x001060fa, 0x80000580, 0x1c01f000, 0x4803c857, - 0x5c03e000, 0x02000800, 0x001060fa, 0x82000540, - 0x00000001, 0x1c01f000, 0x59300403, 0x82000c80, - 0x00000058, 0x02021800, 0x0010032d, 0x4803c857, - 0x0c01f001, 0x00106965, 0x00106981, 0x001069a6, - 0x00106acb, 0x00106a7a, 0x00106a7e, 0x00106a8d, - 0x00106aa1, 0x00106a96, 0x00106aa1, 0x00106af0, - 0x00106aa1, 0x00106b33, 0x00106aa1, 0x00106b41, - 0x00106aa1, 0x00106a96, 0x00106aa1, 0x00106b45, - 0x00106845, 0x00106845, 0x00106845, 0x00106845, - 0x00106845, 0x00106845, 0x00106845, 0x00106845, - 0x00106845, 0x00106845, 0x00106845, 0x00106be5, - 0x00106bfc, 0x00106c06, 0x00106845, 0x00106c1f, - 0x00106a8d, 0x00106845, 0x00106a8d, 0x00106aa1, - 0x00106845, 0x001069a6, 0x00106acb, 0x00106845, - 0x00106c6f, 0x00106aa1, 0x00106845, 0x00106c7f, - 0x00106aa1, 0x00106845, 0x00106a96, 0x00106956, - 0x00106847, 0x00106845, 0x00106c96, 0x00106cd5, - 0x00106d5a, 0x00106845, 0x00106d6a, 0x00106a8b, - 0x00106d5d, 0x00106845, 0x00106c2b, 0x00106db9, - 0x00106845, 0x00106dee, 0x00106e41, 0x00106845, - 0x0010685c, 0x001068d0, 0x001068dd, 0x00106845, - 0x00106a8d, 0x00106845, 0x0010691c, 0x00106927, - 0x00106845, 0x00106845, 0x00106870, 0x001068a3, - 0x00106e80, 0x00106ec1, 0x00106ee7, 0x00106845, - 0x00106845, 0x00106845, 0x00106eb5, 0x00106d83, - 0x00106c96, 0x00106845, 0x00106845, 0x00106845, - 0x00106845, 0x00106845, 0x00106845, 0x00106845, - 0x00106845, 0x0201f800, 0x0010032d, 0x0401fb11, - 0x59325809, 0x592c000a, 0x4801a006, 0x592c000b, - 0x4801a007, 0x592c000c, 0x4801a008, 0x592c000d, - 0x4801a009, 0x592c000e, 0x4801a00a, 0x4979a00b, - 0x592c080a, 0x82040d00, 0x00000fff, 0x80040904, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00106f71, - 0x4a026202, 0x0000ffff, 0x0401fafa, 0x4d2c0000, - 0x4a01a006, 0x05000000, 0x59325809, 0x592c000a, - 0x4801a007, 0x592c000b, 0x4801a008, 0x592c000c, - 0x4801a009, 0x5c025800, 0x42000800, 0x00000004, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00106f71, - 0x4c580000, 0x4c500000, 0x4c540000, 0x4d2c0000, - 0x0401fae4, 0x5930040b, 0x82000500, 0x00000003, - 0x04000007, 0x82000580, 0x00000003, 0x80000000, - 0x58d00802, 0x80040540, 0x4801a002, 0x59325809, - 0x4200a800, 0x0010b89f, 0x592cb206, 0x8258b400, - 0x00000003, 0x8058b104, 0x832ca400, 0x00000007, - 0x0201f800, 0x0010adef, 0x40580000, 0x8054ac00, - 0x592c0001, 0x80000540, 0x04000003, 0x40025800, - 0x0401f7f2, 0x4200a000, 0x0010b89f, 0x4050a800, - 0x5930b40b, 0x8258b400, 0x00000003, 0x8058b104, - 0x40580800, 0x0201f800, 0x0010ae19, 0x42001000, - 0x0000dc00, 0x5c025800, 0x5c00a800, 0x5c00a000, - 0x5c00b000, 0x0201f000, 0x00106f71, 0x4c580000, - 0x4c500000, 0x4c540000, 0x4d2c0000, 0x42034800, - 0x0010b898, 0x0401fabd, 0x59325809, 0x592c0802, - 0x4807c857, 0x40041000, 0x80040904, 0x82081500, - 0x00000003, 0x04000008, 0x80040800, 0x82081580, - 0x00000003, 0x80081000, 0x58d00002, 0x80080540, - 0x4801a002, 0x4a025806, 0x02000000, 0x82d0ac00, - 0x00000006, 0x592cb011, 0x832ca400, 0x00000006, - 0x0201f800, 0x0010adef, 0x40580000, 0x8054ac00, - 0x592e5801, 0x41780000, 0x812e5d40, 0x040207f6, - 0x42001000, 0x0000dc00, 0x5c025800, 0x5c00a800, - 0x5c00a000, 0x5c00b000, 0x0201f000, 0x00106f71, - 0x0401fa88, 0x4a01a006, 0x78000000, 0x5930001d, - 0x840001c0, 0x4801a407, 0x4979a207, 0x42000800, - 0x00000002, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00106f71, 0x4c580000, 0x4c540000, 0x4c500000, - 0x0401fa86, 0x4a01a006, 0x02000000, 0x59a80002, - 0x4801a008, 0x59a80003, 0x4801a009, 0x59a80000, - 0x4801a00a, 0x59a80001, 0x4801a00b, 0x5930001d, - 0x82000d80, 0x0000e000, 0x04000012, 0x82000d80, - 0x0000df00, 0x04000006, 0x4a01a407, 0x00000010, - 0x42000800, 0x00000006, 0x0401f01f, 0x42001800, - 0x0010b841, 0x0201f800, 0x00100532, 0x42000000, - 0x0000df00, 0x4200a000, 0x0010b841, 0x0401f009, - 0x42001800, 0x0010b84e, 0x0201f800, 0x00100532, - 0x42000000, 0x0000e000, 0x4200a000, 0x0010b84e, - 0x82000540, 0x00000010, 0x4801a407, 0x4a01a207, - 0x00000034, 0x4200b000, 0x0000000d, 0x82d0ac00, - 0x0000000c, 0x0201f800, 0x0010adef, 0x42000800, - 0x00000013, 0x42001000, 0x0000dc00, 0x5c00a000, - 0x5c00a800, 0x5c00b000, 0x0201f000, 0x00106f71, - 0x0401fa3c, 0x4a01a006, 0x63000028, 0x5930001d, - 0x4801a007, 0x42000800, 0x00000002, 0x42001000, - 0x0000dc00, 0x0201f000, 0x00106f71, 0x0401fa3f, - 0x41780000, 0x41780800, 0x42002000, 0x00080000, - 0x0c01f81b, 0x80000000, 0x80040800, 0x42001000, - 0x0000000c, 0x59841802, 0x8c0c1d00, 0x04020008, - 0x42002000, 0x00050000, 0x0c01f811, 0x80000000, - 0x80040800, 0x82081400, 0x00000004, 0x82080540, - 0x02000000, 0x4801a006, 0x800408e0, 0x5930001d, - 0x80040540, 0x4801a007, 0x80080904, 0x42001000, - 0x0000dc00, 0x0201f000, 0x00106f71, 0x0010694c, - 0x0010694e, 0x00106950, 0x00106952, 0x00106954, - 0x4811a008, 0x1c01f000, 0x4811a009, 0x1c01f000, - 0x4811a00a, 0x1c01f000, 0x4811a00b, 0x1c01f000, - 0x4811a00c, 0x1c01f000, 0x4a02600a, 0x0010c1b2, - 0x59a8000f, 0x82000500, 0x000000ff, 0x800000d0, - 0x42026800, 0x0010c1b2, 0x48026a12, 0x0401fa5b, - 0x41780800, 0x42001000, 0x00005c00, 0x0201f000, - 0x00106f71, 0x0401f9f3, 0x4a01a006, 0x52000000, - 0x4979a007, 0x599c0017, 0x82000500, 0x00000801, - 0x04000005, 0x599c0402, 0x0201f800, 0x001013b6, - 0x4805a007, 0x59a80002, 0x4801a008, 0x59a80003, - 0x4801a009, 0x59a80000, 0x4801a00a, 0x59a80001, - 0x4801a00b, 0x59a8000f, 0x4801a00c, 0x42000800, - 0x00000007, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00106f71, 0x4a026202, 0x0000ffff, 0x4d340000, - 0x813669c0, 0x04020011, 0x42026800, 0x0010c1b2, - 0x4936600a, 0x4a026c03, 0x0000ffff, 0x497a6a00, - 0x5930001f, 0x48026802, 0x497a601f, 0x497a6a12, - 0x82000d00, 0x00ffff00, 0x04020004, 0x800000d0, - 0x48026a12, 0x0401f001, 0x0401f9c2, 0x5c026800, - 0x4a01a006, 0x05000000, 0x59a8000f, 0x4801a007, - 0x59a80002, 0x59a80803, 0x4801a008, 0x4805a009, + 0x00020016, 0x592c080b, 0x48066802, 0x82040500, + 0x00ffff00, 0x04000007, 0x497a6a12, 0x59a8100f, + 0x82081500, 0x00ffff00, 0x80080580, 0x040207d5, + 0x82040d00, 0x000000ff, 0x800408d0, 0x48066a12, + 0x0401f7d0, 0x1c01f000, 0x4d2c0000, 0x4d300000, + 0x4c580000, 0x4c540000, 0x4c500000, 0x58325809, + 0x812e59c0, 0x02000800, 0x0010032d, 0x58300002, + 0x82000580, 0x00000100, 0x04020022, 0x5830000a, + 0x5832600b, 0x81300d80, 0x04020012, 0x0401f834, + 0x04020016, 0x592c080e, 0x82040c00, 0x00000003, + 0x80040904, 0x4004b000, 0x4200a000, 0x0010b99f, + 0x4050a800, 0x0201f800, 0x0010af0c, 0x42001000, + 0x0000dc00, 0x0201f800, 0x00107000, 0x0401f007, + 0x4803c857, 0x4933c857, 0x813261c0, 0x04000003, + 0x0401f81f, 0x04000f96, 0x5c00a000, 0x5c00a800, + 0x5c00b000, 0x5c026000, 0x5c025800, 0x1c01f000, + 0x5830000a, 0x5832600b, 0x4a006002, 0x00000100, + 0x4803c857, 0x4933c857, 0x81300d80, 0x040207ed, + 0x0401f80f, 0x040207f1, 0x4803c857, 0x0201f800, + 0x0010e453, 0x80c40040, 0x02020800, 0x0010032d, + 0x4a025a07, 0x00000002, 0x0201f800, 0x000203ab, + 0x0201f800, 0x00107144, 0x0401f7e4, 0x0201f800, + 0x001061b2, 0x4df00000, 0x598c000f, 0x81300580, + 0x04020009, 0x598c0005, 0x81300580, 0x04020006, + 0x5c03e000, 0x02000800, 0x0010619f, 0x80000580, + 0x1c01f000, 0x4803c857, 0x5c03e000, 0x02000800, + 0x0010619f, 0x82000540, 0x00000001, 0x1c01f000, + 0x59300403, 0x82000c80, 0x00000058, 0x02021800, + 0x0010032d, 0x83340d80, 0x0010c2b2, 0x0402000a, + 0x5930081f, 0x48066802, 0x82041500, 0x00ffff00, + 0x04020004, 0x800408d0, 0x48066a12, 0x0401f002, + 0x497a6a12, 0x4803c857, 0x0c01f001, 0x00106a13, + 0x00106a2f, 0x00106a40, 0x00106b52, 0x00106b14, + 0x00106b18, 0x00106b27, 0x00106b3b, 0x00106b30, + 0x00106b3b, 0x00106b7b, 0x00106b3b, 0x00106bc2, + 0x00106b3b, 0x00106bd0, 0x00106b3b, 0x00106b30, + 0x00106b3b, 0x00106bd4, 0x001068f3, 0x001068f3, + 0x001068f3, 0x001068f3, 0x001068f3, 0x001068f3, + 0x001068f3, 0x001068f3, 0x001068f3, 0x001068f3, + 0x001068f3, 0x00106c74, 0x00106c8b, 0x00106c95, + 0x001068f3, 0x00106cae, 0x00106b27, 0x001068f3, + 0x00106b27, 0x00106b3b, 0x001068f3, 0x00106a40, + 0x00106b52, 0x001068f3, 0x00106cfe, 0x00106b3b, + 0x001068f3, 0x00106d0e, 0x00106b3b, 0x001068f3, + 0x00106b30, 0x00106a04, 0x001068f5, 0x001068f3, + 0x00106d25, 0x00106d64, 0x00106de9, 0x001068f3, + 0x00106df9, 0x00106b25, 0x00106dec, 0x001068f3, + 0x00106cba, 0x00106e48, 0x001068f3, 0x00106e7d, + 0x00106ed0, 0x001068f3, 0x0010690a, 0x0010697e, + 0x0010698b, 0x001068f3, 0x00106b27, 0x001068f3, + 0x001069ca, 0x001069d5, 0x001068f3, 0x001068f3, + 0x0010691e, 0x00106951, 0x00106f0f, 0x00106f50, + 0x00106f76, 0x001068f3, 0x001068f3, 0x001068f3, + 0x00106f44, 0x00106e12, 0x00106d25, 0x001068f3, + 0x001068f3, 0x001068f3, 0x001068f3, 0x001068f3, + 0x001068f3, 0x001068f3, 0x001068f3, 0x0201f800, + 0x0010032d, 0x0401faf2, 0x59325809, 0x592c000a, + 0x4801a006, 0x592c000b, 0x4801a007, 0x592c000c, + 0x4801a008, 0x592c000d, 0x4801a009, 0x592c000e, + 0x4801a00a, 0x4979a00b, 0x592c080a, 0x82040d00, + 0x00000fff, 0x80040904, 0x42001000, 0x0000dc00, + 0x0201f000, 0x00107000, 0x4a026202, 0x0000ffff, + 0x0401fadb, 0x4d2c0000, 0x4a01a006, 0x05000000, + 0x59325809, 0x592c000a, 0x4801a007, 0x592c000b, + 0x4801a008, 0x592c000c, 0x4801a009, 0x5c025800, 0x42000800, 0x00000004, 0x42001000, 0x0000dc00, - 0x0201f000, 0x00106f71, 0x4a026202, 0x0000ffff, - 0x0401f9b0, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x001040d5, 0x5c027800, 0x4a01a006, 0x03000000, - 0x59340403, 0x82000580, 0x000007fe, 0x04020079, - 0x4a01a006, 0x04000000, 0x81a40800, 0x4a000800, - 0x22fffffe, 0x5934000a, 0x84000500, 0x4802680a, - 0x59a8021b, 0x8c000508, 0x04000010, 0x59a8001f, - 0x4801a007, 0x59a80020, 0x82000500, 0x07deffff, - 0x599c0818, 0x8c040d16, 0x04000002, 0x8400056a, - 0x4801a008, 0x4a01a009, 0x00002710, 0x59a80022, - 0x4801a00a, 0x0401f047, 0x59a8001f, 0x59a8121b, - 0x8c081506, 0x04000003, 0x82000500, 0xffff0000, - 0x4801a007, 0x0201f800, 0x00104716, 0x04020013, - 0x59a80873, 0x8c040d3e, 0x04020010, 0x59300c03, - 0x82041580, 0x00000051, 0x0400000c, 0x497b8880, - 0x82000500, 0x0000ffff, 0x4c000000, 0x0201f800, - 0x001013db, 0x5c000000, 0x48038880, 0x41780800, - 0x0201f800, 0x00101993, 0x59a80020, 0x0201f800, - 0x00104716, 0x04020004, 0x82000500, 0x37ffffff, - 0x0401f003, 0x82000500, 0x3fffffff, 0x599c0818, - 0x8c040d16, 0x04000002, 0x8400056a, 0x8d0e1d10, - 0x04000019, 0x59300c03, 0x82041580, 0x00000051, - 0x04000015, 0x82041580, 0x00000031, 0x04000012, - 0x4c580000, 0x4c500000, 0x4c540000, 0x4200b000, - 0x00000004, 0x4200a000, 0x0010bcc3, 0x82d0ac00, - 0x0000001f, 0x4c000000, 0x0201f800, 0x0010adef, - 0x5c000000, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x8400057a, 0x4801a008, 0x4979a009, 0x4979a00a, - 0x59a80002, 0x59a80803, 0x4801a00b, 0x4805a00c, - 0x59a80000, 0x59a80801, 0x4801a00d, 0x4805a00e, - 0x4979a00f, 0x4979a010, 0x4979a011, 0x4979a012, - 0x4979a013, 0x4979a014, 0x4979a015, 0x4979a016, - 0x59a80023, 0x84000576, 0x4801a017, 0x59a80024, - 0x4801a018, 0x4979a019, 0x4979a01a, 0x0401f049, - 0x59a8021b, 0x8c000508, 0x0400000d, 0x59a8001f, - 0x82000500, 0x0000ffff, 0x59c40880, 0x80040d80, - 0x04000007, 0x497b8880, 0x4c000000, 0x0201f800, - 0x001013db, 0x5c000000, 0x48038880, 0x59a8001f, - 0x4801a007, 0x4c640000, 0x4d2c0000, 0x59a8c820, - 0x0201f800, 0x0010889a, 0x0400000e, 0x0201f800, - 0x00108e64, 0x0402000b, 0x592c0208, 0x8c00050e, - 0x04000008, 0x8264cd00, 0x0000ffff, 0x592c000a, - 0x82000500, 0xffff0000, 0x8064cd40, 0x0401f006, - 0x59a80a1b, 0x82040d00, 0x00000030, 0x04000002, - 0x8464cd36, 0x4865a008, 0x5c025800, 0x5c00c800, - 0x59a80021, 0x4801a009, 0x59a80022, 0x4801a00a, - 0x59a80002, 0x59a80803, 0x4801a00b, 0x4805a00c, - 0x59a80000, 0x59a80801, 0x4801a00d, 0x4805a00e, - 0x4979a00f, 0x4979a010, 0x4979a011, 0x4979a012, - 0x4979a013, 0x4979a014, 0x4979a015, 0x4979a016, - 0x59a80023, 0x4801a017, 0x59a80024, 0x4801a018, - 0x59a80025, 0x4801a019, 0x59a80026, 0x4801a01a, - 0x42000800, 0x0000001d, 0x42001000, 0x0000dc00, - 0x0201f000, 0x00106f71, 0x0401f8de, 0x4a01a006, - 0x50000000, 0x0401f7af, 0x0401f8da, 0x4a01a006, - 0x21100014, 0x4979a007, 0x4979a008, 0x4979a009, - 0x4979a00a, 0x42000800, 0x00000005, 0x42001000, - 0x0000dc00, 0x0201f000, 0x00106f71, 0x0401f8d4, - 0x0401f002, 0x0401f8d9, 0x4a01a006, 0x02000000, - 0x42000800, 0x00000001, 0x42001000, 0x0000dc00, - 0x0201f000, 0x00106f71, 0x0401f8d0, 0x4a01a006, - 0x02000000, 0x59300403, 0x82000580, 0x00000031, - 0x04020790, 0x81a40800, 0x4a000801, 0x00fffffe, - 0x0401f71c, 0x4d340000, 0x813669c0, 0x04020010, - 0x42026800, 0x0010c1b2, 0x4936600a, 0x4a026c03, - 0x0000ffff, 0x497a6a00, 0x5930001f, 0x48026802, - 0x497a601f, 0x497a6a12, 0x82000d00, 0x00ffff00, - 0x04020003, 0x800000d0, 0x48026a12, 0x0401f8b3, - 0x5c026800, 0x4a01a006, 0x01000000, 0x5930041b, - 0x80000540, 0x04000003, 0x4801a407, 0x0401f003, - 0x4a01a407, 0x00000003, 0x5930021b, 0x80000540, - 0x04000003, 0x4801a207, 0x0401f003, 0x4a01a207, - 0x00002a00, 0x42000800, 0x00000002, 0x42001000, - 0x0000dc00, 0x0201f000, 0x00106f71, 0x4a026202, - 0x0000ffff, 0x0401f88b, 0x4a01a406, 0x00002010, - 0x4a01a206, 0x00000014, 0x4a01a407, 0x00000800, - 0x4a01a207, 0x00002000, 0x42000000, 0x00000400, - 0x599c0817, 0x8c040d0a, 0x04020003, 0x82000540, - 0x00000020, 0x8c040d08, 0x04000003, 0x82000540, - 0x00000010, 0x82000540, 0x00000002, 0x5934080a, - 0x8c040d14, 0x04000005, 0x82040d00, 0x00000380, - 0x80040540, 0x0401f006, 0x599c0818, 0x8c040d18, - 0x04000003, 0x82000540, 0x00000380, 0x0401f03d, - 0x0401f876, 0x4a01a406, 0x00000210, 0x4a01a206, - 0x00000014, 0x4a01a407, 0x00000800, 0x5934000a, - 0x8c000516, 0x04000014, 0x59340c05, 0x82040500, - 0x00000030, 0x04000013, 0x59340a05, 0x82040500, - 0x0000c000, 0x04020009, 0x8c040d1a, 0x04000004, - 0x4a01a207, 0x00002100, 0x0401f00c, 0x4a01a207, - 0x00000100, 0x0401f009, 0x4a01a207, 0x00000400, - 0x0401f006, 0x4a01a207, 0x00000700, 0x0401f003, - 0x4a01a207, 0x00000800, 0x42000000, 0x00000400, - 0x599c0817, 0x8c040d0a, 0x04020003, 0x82000540, - 0x00000020, 0x8c040d08, 0x04000003, 0x82000540, - 0x00000010, 0x82000540, 0x00000002, 0x59340a00, - 0x8c040d0e, 0x0400000b, 0x84000550, 0x599c1017, - 0x8c08150a, 0x04020004, 0x8c040d0a, 0x04000002, - 0x8400054e, 0x8c040d1c, 0x04000002, 0x84000552, - 0x4801a20a, 0x42000800, 0x00000005, 0x42001000, - 0x0000dc00, 0x0201f000, 0x00106f71, 0x0401f833, - 0x4a01a006, 0x02100014, 0x4a01a007, 0x00000100, + 0x0201f000, 0x00107000, 0x4c580000, 0x4c500000, + 0x4c540000, 0x4d2c0000, 0x0401fac5, 0x5930040b, + 0x82000500, 0x00000003, 0x04000007, 0x82000580, + 0x00000003, 0x80000000, 0x58d00802, 0x80040540, + 0x4801a002, 0x59325809, 0x4200a800, 0x0010b99f, + 0x592cb206, 0x8258b400, 0x00000003, 0x8058b104, + 0x832ca400, 0x00000007, 0x0201f800, 0x0010aee2, + 0x40580000, 0x8054ac00, 0x592c0001, 0x80000540, + 0x04000003, 0x40025800, 0x0401f7f2, 0x4200a000, + 0x0010b99f, 0x4050a800, 0x5930b40b, 0x8258b400, + 0x00000003, 0x8058b104, 0x40580800, 0x0201f800, + 0x0010af0c, 0x42001000, 0x0000dc00, 0x5c025800, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x0201f000, + 0x00107000, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4d2c0000, 0x42034800, 0x0010b998, 0x0401fa9e, + 0x59325809, 0x592c0802, 0x4807c857, 0x40041000, + 0x80040904, 0x82081500, 0x00000003, 0x04000008, + 0x80040800, 0x82081580, 0x00000003, 0x80081000, + 0x58d00002, 0x80080540, 0x4801a002, 0x4a025806, + 0x02000000, 0x82d0ac00, 0x00000006, 0x592cb011, + 0x832ca400, 0x00000006, 0x0201f800, 0x0010aee2, + 0x40580000, 0x8054ac00, 0x592e5801, 0x41780000, + 0x812e5d40, 0x040207f6, 0x42001000, 0x0000dc00, + 0x5c025800, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x0201f000, 0x00107000, 0x0401fa69, 0x4a01a006, + 0x78000000, 0x5930001d, 0x840001c0, 0x4801a407, + 0x4979a207, 0x42000800, 0x00000002, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107000, 0x4c580000, + 0x4c540000, 0x4c500000, 0x0401fa67, 0x4a01a006, + 0x02000000, 0x59a80002, 0x4801a008, 0x59a80003, + 0x4801a009, 0x59a80000, 0x4801a00a, 0x59a80001, + 0x4801a00b, 0x5930001d, 0x82000d80, 0x0000e000, + 0x04000012, 0x82000d80, 0x0000df00, 0x04000006, + 0x4a01a407, 0x00000010, 0x42000800, 0x00000006, + 0x0401f01f, 0x42001800, 0x0010b941, 0x0201f800, + 0x00100532, 0x42000000, 0x0000df00, 0x4200a000, + 0x0010b941, 0x0401f009, 0x42001800, 0x0010b94e, + 0x0201f800, 0x00100532, 0x42000000, 0x0000e000, + 0x4200a000, 0x0010b94e, 0x82000540, 0x00000010, + 0x4801a407, 0x4a01a207, 0x00000034, 0x4200b000, + 0x0000000d, 0x82d0ac00, 0x0000000c, 0x0201f800, + 0x0010aee2, 0x42000800, 0x00000013, 0x42001000, + 0x0000dc00, 0x5c00a000, 0x5c00a800, 0x5c00b000, + 0x0201f000, 0x00107000, 0x0401fa1d, 0x4a01a006, + 0x63000028, 0x5930001d, 0x4801a007, 0x42000800, + 0x00000002, 0x42001000, 0x0000dc00, 0x0201f000, + 0x00107000, 0x0401fa20, 0x41780000, 0x41780800, + 0x42002000, 0x00080000, 0x0c01f81b, 0x80000000, + 0x80040800, 0x42001000, 0x0000000c, 0x59841802, + 0x8c0c1d00, 0x04020008, 0x42002000, 0x00050000, + 0x0c01f811, 0x80000000, 0x80040800, 0x82081400, + 0x00000004, 0x82080540, 0x02000000, 0x4801a006, + 0x800408e0, 0x5930001d, 0x80040540, 0x4801a007, + 0x80080904, 0x42001000, 0x0000dc00, 0x0201f000, + 0x00107000, 0x001069fa, 0x001069fc, 0x001069fe, + 0x00106a00, 0x00106a02, 0x4811a008, 0x1c01f000, + 0x4811a009, 0x1c01f000, 0x4811a00a, 0x1c01f000, + 0x4811a00b, 0x1c01f000, 0x4811a00c, 0x1c01f000, + 0x4a02600a, 0x0010c2b2, 0x59a8000f, 0x82000500, + 0x000000ff, 0x800000d0, 0x42026800, 0x0010c2b2, + 0x48026a12, 0x0401fa3c, 0x41780800, 0x42001000, + 0x00005c00, 0x0201f000, 0x00107000, 0x0401f9d4, + 0x4a01a006, 0x52000000, 0x4979a007, 0x599c0017, + 0x82000500, 0x00000801, 0x04000005, 0x599c0402, + 0x0201f800, 0x001013b7, 0x4805a007, 0x59a80002, + 0x4801a008, 0x59a80003, 0x4801a009, 0x59a80000, + 0x4801a00a, 0x59a80001, 0x4801a00b, 0x59a8000f, + 0x4801a00c, 0x42000800, 0x00000007, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107000, 0x4a026202, + 0x0000ffff, 0x0401f9b6, 0x4a01a006, 0x05000000, + 0x59a8000f, 0x4801a007, 0x59a80002, 0x59a80803, + 0x4801a008, 0x4805a009, 0x42000800, 0x00000004, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107000, + 0x4a026202, 0x0000ffff, 0x0401f9a5, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x001040ef, 0x5c027800, + 0x4a01a006, 0x03000000, 0x59340403, 0x82000580, + 0x000007fe, 0x04020079, 0x4a01a006, 0x04000000, + 0x81a40800, 0x4a000800, 0x22fffffe, 0x5934000a, + 0x84000500, 0x4802680a, 0x59a8021b, 0x8c000508, + 0x04000010, 0x59a8001f, 0x4801a007, 0x59a80020, + 0x82000500, 0x07deffff, 0x599c0818, 0x8c040d16, + 0x04000002, 0x8400056a, 0x4801a008, 0x4a01a009, + 0x00002710, 0x59a80022, 0x4801a00a, 0x0401f047, + 0x59a8001f, 0x59a8121b, 0x8c081506, 0x04000003, + 0x82000500, 0xffff0000, 0x4801a007, 0x0201f800, + 0x00104755, 0x04020013, 0x59a80873, 0x8c040d3e, + 0x04020010, 0x59300c03, 0x82041580, 0x00000051, + 0x0400000c, 0x497b8880, 0x82000500, 0x0000ffff, + 0x4c000000, 0x0201f800, 0x001013dc, 0x5c000000, + 0x48038880, 0x41780800, 0x0201f800, 0x00101994, + 0x59a80020, 0x0201f800, 0x00104755, 0x04020004, + 0x82000500, 0x37ffffff, 0x0401f003, 0x82000500, + 0x3fffffff, 0x599c0818, 0x8c040d16, 0x04000002, + 0x8400056a, 0x8d0e1d10, 0x04000019, 0x59300c03, + 0x82041580, 0x00000051, 0x04000015, 0x82041580, + 0x00000031, 0x04000012, 0x4c580000, 0x4c500000, + 0x4c540000, 0x4200b000, 0x00000004, 0x4200a000, + 0x0010bdc3, 0x82d0ac00, 0x0000001f, 0x4c000000, + 0x0201f800, 0x0010aee2, 0x5c000000, 0x5c00a800, + 0x5c00a000, 0x5c00b000, 0x8400057a, 0x4801a008, + 0x4979a009, 0x4979a00a, 0x59a80002, 0x59a80803, + 0x4801a00b, 0x4805a00c, 0x59a80000, 0x59a80801, + 0x4801a00d, 0x4805a00e, 0x4979a00f, 0x4979a010, + 0x4979a011, 0x4979a012, 0x4979a013, 0x4979a014, + 0x4979a015, 0x4979a016, 0x59a80023, 0x84000576, + 0x4801a017, 0x59a80024, 0x4801a018, 0x4979a019, + 0x4979a01a, 0x0401f049, 0x59a8021b, 0x8c000508, + 0x0400000d, 0x59a8001f, 0x82000500, 0x0000ffff, + 0x59c40880, 0x80040d80, 0x04000007, 0x497b8880, + 0x4c000000, 0x0201f800, 0x001013dc, 0x5c000000, + 0x48038880, 0x59a8001f, 0x4801a007, 0x4c640000, + 0x4d2c0000, 0x59a8c820, 0x0201f800, 0x00108953, + 0x0400000e, 0x0201f800, 0x00108f1d, 0x0402000b, + 0x592c0208, 0x8c00050e, 0x04000008, 0x8264cd00, + 0x0000ffff, 0x592c000a, 0x82000500, 0xffff0000, + 0x8064cd40, 0x0401f006, 0x59a80a1b, 0x82040d00, + 0x00000030, 0x04000002, 0x8464cd36, 0x4865a008, + 0x5c025800, 0x5c00c800, 0x59a80021, 0x4801a009, + 0x59a80022, 0x4801a00a, 0x59a80002, 0x59a80803, + 0x4801a00b, 0x4805a00c, 0x59a80000, 0x59a80801, + 0x4801a00d, 0x4805a00e, 0x4979a00f, 0x4979a010, + 0x4979a011, 0x4979a012, 0x4979a013, 0x4979a014, + 0x4979a015, 0x4979a016, 0x59a80023, 0x4801a017, + 0x59a80024, 0x4801a018, 0x59a80025, 0x4801a019, + 0x59a80026, 0x4801a01a, 0x42000800, 0x0000001d, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107000, + 0x0401f8d3, 0x4a01a006, 0x50000000, 0x0401f7af, + 0x0401f8cf, 0x4a01a006, 0x21100014, 0x4979a007, 0x4979a008, 0x4979a009, 0x4979a00a, 0x42000800, 0x00000005, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00106f71, 0x0401f825, 0x4a01a006, 0x02000000, - 0x0401f624, 0x4933c857, 0x0401f820, 0x4a01a006, - 0x01000000, 0x4a01a407, 0x0000000b, 0x42000800, - 0x00000002, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00106f71, 0x42005000, 0x32000000, 0x42006000, - 0x08290000, 0x41786800, 0x41787800, 0x0401f3f3, - 0x42005000, 0x22000000, 0x42006000, 0x01290000, - 0x41786800, 0x41787800, 0x0401f3ec, 0x42005000, - 0x33000000, 0x42006000, 0x08980000, 0x41786800, - 0x41787800, 0x0401f3e5, 0x42005000, 0x23000000, - 0x42006000, 0x01980000, 0x41786800, 0x41787800, - 0x0401f3de, 0x59300403, 0x82000c80, 0x00000085, - 0x02001800, 0x0010032d, 0x82000c80, 0x00000093, - 0x02021800, 0x0010032d, 0x82000480, 0x00000085, - 0x0c01f001, 0x00106b87, 0x00106b87, 0x00106b87, - 0x00106b87, 0x00106b87, 0x00106b87, 0x00106b87, - 0x00106b87, 0x00106b87, 0x00106b87, 0x00106b87, - 0x00106b87, 0x00106b87, 0x00106b89, 0x0201f800, - 0x0010032d, 0x4d2c0000, 0x59325809, 0x4933c857, - 0x492fc857, 0x812e59c0, 0x02000800, 0x0010032d, - 0x59340a12, 0x82040d00, 0x0000ff00, 0x592c000b, - 0x82000500, 0x000000ff, 0x900001c0, 0x80040540, - 0x82000540, 0x00000011, 0x44034800, 0x81a5a000, - 0x42001000, 0x00000009, 0x42000800, 0x00000003, - 0x592c000a, 0x82000500, 0xff000000, 0x82001d80, - 0x84000000, 0x04000009, 0x82001d80, 0x85000000, - 0x02020800, 0x0010032d, 0x42001000, 0x00000007, - 0x42000800, 0x00000001, 0x832c1c00, 0x0000000a, - 0x500c0000, 0x4401a000, 0x800c1800, 0x80d1a000, - 0x80081040, 0x040207fb, 0x42001000, 0x0000dc00, - 0x5c025800, 0x0401f3b8, 0x42005000, 0x81000000, - 0x42006000, 0x00090000, 0x41786800, 0x41787800, - 0x59301407, 0x82081580, 0x00000005, 0x04020003, - 0x42006000, 0x00890000, 0x0401f384, 0x59300403, - 0x82000c80, 0x00000053, 0x02021800, 0x0010032d, - 0x82000480, 0x0000004b, 0x02001800, 0x0010032d, - 0x5932680a, 0x59368c03, 0x4803c857, 0x0c01f001, - 0x00106c46, 0x00106c4e, 0x00106c56, 0x00106c5e, - 0x00106bdc, 0x00106bdc, 0x00106bdc, 0x00106c3e, - 0x0201f800, 0x0010032d, 0x42005000, 0x06000000, - 0x42006000, 0x08290000, 0x41786800, 0x41787800, - 0x0401f366, 0x4933c857, 0x0401ff72, 0x4a01a006, - 0x12000000, 0x59300407, 0x82000580, 0x00000004, - 0x04020003, 0x59340002, 0x0401f002, 0x59a8000f, - 0x82000500, 0x00ffffff, 0x4801a007, 0x5930041a, - 0x4801a408, 0x5930021a, 0x4801a208, 0x42000800, - 0x00000003, 0x42001000, 0x0000dc00, 0x0401f376, - 0x0401ff5c, 0x4a01a006, 0x0f000000, 0x5930001d, - 0x4801a007, 0x42000800, 0x00000002, 0x42001000, - 0x0000dc00, 0x0401f36c, 0x0401ff60, 0x4a01a006, - 0x02000000, 0x59c40085, 0x59880804, 0x80040c00, - 0x48071004, 0x497b8885, 0x59880000, 0x4801a007, - 0x59880001, 0x4801a008, 0x59880002, 0x4801a009, - 0x59880003, 0x4801a00a, 0x59880004, 0x4801a00b, - 0x59880005, 0x4801a00c, 0x42000800, 0x00000007, - 0x42001000, 0x0000dc00, 0x0401f353, 0x4a026202, - 0x0000ffff, 0x0401ff37, 0x4a01a006, 0x62000000, - 0x5930001d, 0x4801a007, 0x42000800, 0x00000002, - 0x42001000, 0x0000dc00, 0x0401f347, 0x0401ff2d, - 0x59300809, 0x4c500000, 0x4c540000, 0x4c580000, - 0x8204a400, 0x0000000b, 0x5930b01d, 0x82d0ac00, - 0x00000006, 0x0201f800, 0x0010adef, 0x5930081d, - 0x42001000, 0x0000dc00, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x0401f334, 0x0401ffa0, 0x59300018, - 0x4801a006, 0x59300019, 0x4801a007, 0x4a01a008, - 0x00001000, 0x0401f020, 0x0401ff98, 0x59300018, - 0x4801a006, 0x59300019, 0x4801a007, 0x4a01a008, - 0x00004000, 0x0401f018, 0x0401ff90, 0x59300018, - 0x4801a006, 0x59300019, 0x4801a007, 0x4a01a008, - 0x00002000, 0x0401f010, 0x0401ff88, 0x59300018, - 0x4801a006, 0x59300019, 0x4801a007, 0x4a01a008, - 0x00000400, 0x0401f008, 0x0401ff80, 0x59300018, - 0x4801a006, 0x59300019, 0x4801a007, 0x4a01a008, - 0x00000200, 0x4979a009, 0x4979a00a, 0x4979a00b, - 0x4979a00c, 0x4979a00d, 0x42000800, 0x00000008, - 0x42001000, 0x0000dc00, 0x0401f303, 0x0401fef7, - 0x4a01a006, 0x02000014, 0x4979a407, 0x4979a207, - 0x59a8002d, 0x4801a008, 0x59a8002e, 0x4801a009, - 0x4a01a00a, 0x00047878, 0x42000800, 0x00000005, - 0x42001000, 0x0000dc00, 0x0401f2f3, 0x0401fee7, - 0x4a01a006, 0x02140018, 0x4a01a407, 0x00000800, - 0x5930001d, 0x82000d00, 0xff000000, 0x900409c0, - 0x4805a207, 0x82000500, 0x00ffffff, 0x4801a00a, - 0x4979a408, 0x4979a208, 0x4979a409, 0x4979a209, - 0x4979a00b, 0x42000800, 0x00000006, 0x42001000, - 0x0000dc00, 0x0401f2dc, 0x4933c857, 0x4937c857, - 0x4d1c0000, 0x42000800, 0x00000035, 0x0201f800, - 0x00108c7b, 0x04020025, 0x0401feba, 0x4a01a006, - 0x13000000, 0x5932381f, 0x59300403, 0x82000580, - 0x00000057, 0x04000005, 0x591c0415, 0x8c000502, - 0x02000800, 0x0010032d, 0x591c001a, 0x4801a005, - 0x591c0407, 0x82000580, 0x00000003, 0x04000007, - 0x5930080a, 0x58040002, 0x82000500, 0x00ffffff, - 0x4801a007, 0x0401f003, 0x59a8000f, 0x4801a007, - 0x5930041a, 0x4801a408, 0x5930021a, 0x4801a208, - 0x42000800, 0x00000003, 0x42001000, 0x0000dc00, - 0x5c023800, 0x0401f2b0, 0x4803c856, 0x0201f800, - 0x0010610d, 0x598c000f, 0x81300580, 0x02020800, - 0x0010032d, 0x0201f800, 0x0010605d, 0x59300403, - 0x82000580, 0x00000057, 0x02000800, 0x00107851, - 0x0201f800, 0x00020a10, 0x5c023800, 0x0201f000, - 0x001060fa, 0x4803c856, 0x4d2c0000, 0x4d1c0000, - 0x5932381f, 0x811e39c0, 0x02000800, 0x0010032d, - 0x831c0580, 0xffffffff, 0x0400003d, 0x591c0c07, - 0x82040580, 0x00000006, 0x0400000d, 0x82040580, - 0x00000003, 0x0400003b, 0x4a026403, 0x00000037, - 0x4a02641b, 0x00000003, 0x4a02621b, 0x00001700, - 0x5c023800, 0x5c025800, 0x0401f06c, 0x0401f850, - 0x42001000, 0x40000000, 0x591c0203, 0x591c0804, - 0x8c040d3e, 0x04020023, 0x82000c80, 0x0000000e, - 0x0c001003, 0x0201f800, 0x0010032d, 0x00106d0c, - 0x00106d18, 0x00106d0e, 0x00106d18, 0x00106d14, - 0x00106d0c, 0x00106d0c, 0x00106d18, 0x00106d18, - 0x00106d0c, 0x00106d0c, 0x00106d0c, 0x00106d0c, - 0x00106d0c, 0x00106d18, 0x00106d0c, 0x00106d18, - 0x0201f800, 0x0010032d, 0x591c0415, 0x4803c857, - 0x8c000518, 0x04000003, 0x8c000512, 0x04000003, - 0x80001580, 0x0401f003, 0x42001000, 0x20000000, - 0x591c0016, 0x4801a00a, 0x0401f01d, 0x0401f824, - 0x42001000, 0x40000000, 0x41780000, 0x0401f7fa, - 0x0401f81f, 0x591e5809, 0x812e59c0, 0x02000800, - 0x0010032d, 0x592c1010, 0x591c0012, 0x80080480, - 0x4801a00a, 0x591c0203, 0x591c0804, 0x8c040d3e, - 0x04020007, 0x82000d80, 0x00000002, 0x04000007, - 0x82000d80, 0x00000004, 0x04000004, 0x42001000, - 0x40000000, 0x0401f002, 0x80001580, 0x4809a00b, - 0x42000800, 0x00000006, 0x42001000, 0x0000dc00, - 0x5c023800, 0x5c025800, 0x0401f233, 0x4803c856, - 0x0401fe26, 0x4a01a006, 0x02000000, 0x59300c1a, - 0x4805a407, 0x59300a1a, 0x4805a207, 0x59a8100f, - 0x5930080a, 0x58041802, 0x820c1d00, 0x00ffffff, - 0x5930081f, 0x82040580, 0xffffffff, 0x04000008, - 0x58040407, 0x82000580, 0x00000003, 0x04020004, - 0x4809a008, 0x480da009, 0x0401f003, 0x480da008, - 0x4809a009, 0x1c01f000, 0x4803c856, 0x0401fe0b, - 0x0401f003, 0x4803c856, 0x0401fe01, 0x4a01a006, - 0x01000000, 0x5930041b, 0x4801a407, 0x5930021b, - 0x4801a207, 0x42000800, 0x00000002, 0x42001000, - 0x0000dc00, 0x0401f208, 0x4803c856, 0x4d1c0000, - 0x0401fde5, 0x4a01a006, 0x14000000, 0x5932381f, - 0x591c001a, 0x4801a005, 0x5930041a, 0x4801a407, - 0x5930021a, 0x4801a207, 0x59300016, 0x4801a008, - 0x59300217, 0x82000500, 0x000000ff, 0x840001c0, - 0x4801a409, 0x42000800, 0x00000004, 0x42001000, - 0x0000dc00, 0x5c023800, 0x0401f1ef, 0x4803c856, - 0x0401fde2, 0x4a01a006, 0x02000001, 0x42001000, - 0xe0000000, 0x59a80873, 0x8c040d3e, 0x04000004, - 0x42001000, 0x20000000, 0x0401f010, 0x59a8006d, - 0x8c000508, 0x04000004, 0x82081500, 0xdfffffff, - 0x0401f00a, 0x59a80847, 0x82040d80, 0x01391077, - 0x04020006, 0x59e00813, 0x8c040d00, 0x04000003, - 0x82081500, 0xdfffffff, 0x59c40801, 0x82040d00, - 0x00018000, 0x82040580, 0x00000000, 0x42000000, - 0x00008000, 0x0400000d, 0x82040580, 0x00008000, - 0x42000000, 0x00004000, 0x04000008, 0x82040580, - 0x00010000, 0x42000000, 0x00002000, 0x04000003, - 0x42000000, 0x00000002, 0x80080540, 0x4801a007, + 0x00107000, 0x0401f8c9, 0x0401f002, 0x0401f8ce, + 0x4a01a006, 0x02000000, 0x42000800, 0x00000001, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107000, + 0x0401f8c5, 0x4a01a006, 0x02000000, 0x59300403, + 0x82000580, 0x00000031, 0x04020790, 0x81a40800, + 0x4a000801, 0x00fffffe, 0x0401f71c, 0x0401f8ba, + 0x4a01a006, 0x01000000, 0x5930041b, 0x80000540, + 0x04000003, 0x4801a407, 0x0401f003, 0x4a01a407, + 0x00000003, 0x5930021b, 0x80000540, 0x04000003, + 0x4801a207, 0x0401f003, 0x4a01a207, 0x00002a00, 0x42000800, 0x00000002, 0x42001000, 0x0000dc00, - 0x0401f1b9, 0x4803c856, 0x0401f80b, 0x5930041b, - 0x900001c0, 0x4801a005, 0x0401f9f0, 0x41780800, - 0x42001000, 0x00005c00, 0x0401f9af, 0x0201f000, - 0x001058c9, 0x4803c856, 0x59300818, 0x82041c00, - 0x00000006, 0x46034800, 0x00000021, 0x58040405, - 0x82000500, 0x0000f000, 0x82000580, 0x00003000, - 0x04000003, 0x46034800, 0x00000041, 0x81a5a000, - 0x580c0001, 0x82000d00, 0x00ffffff, 0x82040d40, - 0xc2000000, 0x4805a000, 0x580c0800, 0x82041500, - 0x00ffffff, 0x82000500, 0xff000000, 0x80080540, - 0x4801a001, 0x580c0002, 0x82000580, 0x00c00000, - 0x82000500, 0x00fd0300, 0x4801a002, 0x580c0003, - 0x4801a003, 0x580c0404, 0x4801a404, 0x580c0204, - 0x4801a204, 0x1c01f000, 0x4803c856, 0x59a8021b, - 0x82000500, 0x00000028, 0x04020009, 0x59a8021b, - 0x82000500, 0x00000028, 0x04000003, 0x497a6a12, - 0x0401f003, 0x4a026a12, 0x0000ff00, 0x42005000, - 0x22000000, 0x42006000, 0x01380000, 0x41786800, - 0x41787800, 0x0401f949, 0x59301009, 0x4a01a006, - 0x54000000, 0x59a8000f, 0x82000500, 0x00ffffff, - 0x58080c0b, 0x800408f0, 0x80040540, 0x4801a007, - 0x5808000b, 0x82000500, 0xff000000, 0x4801a008, - 0x59a80002, 0x4801a009, 0x59a80003, 0x4801a00a, - 0x59a80000, 0x4801a00b, 0x59a80001, 0x4801a00c, - 0x5808000d, 0x9c0001c0, 0x4801a00d, 0x5808000e, - 0x9c0001c0, 0x4801a00e, 0x5808000f, 0x9c0001c0, - 0x4801a00f, 0x58080010, 0x9c0001c0, 0x4801a010, - 0x58080011, 0x9c0001c0, 0x4801a011, 0x58080012, - 0x9c0001c0, 0x4801a012, 0x58080013, 0x9c0001c0, - 0x4801a013, 0x58080014, 0x9c0001c0, 0x4801a014, - 0x58080011, 0x9c0001c0, 0x4801a015, 0x58080012, - 0x9c0001c0, 0x4801a016, 0x58080013, 0x9c0001c0, - 0x4801a017, 0x58080014, 0x9c0001c0, 0x4801a018, - 0x42000800, 0x00000013, 0x42001000, 0x0000dc00, - 0x0401f131, 0x4803c856, 0x42005000, 0x22000000, - 0x42006000, 0x01290000, 0x41786800, 0x41787800, - 0x0401f902, 0x59301009, 0x4a01a006, 0x55000000, - 0x5808000c, 0x82000500, 0x00ffffff, 0x58080c0b, - 0x800408f0, 0x80040540, 0x4801a007, 0x5808080b, - 0x82040d00, 0xff000000, 0x59a8000f, 0x82000500, - 0x00ffffff, 0x80040540, 0x4801a008, 0x5808000d, - 0x9c0001c0, 0x4801a009, 0x5808000e, 0x9c0001c0, - 0x4801a00a, 0x5808000f, 0x9c0001c0, 0x4801a00b, - 0x58080010, 0x9c0001c0, 0x4801a00c, 0x59a80002, - 0x4801a00d, 0x59a80003, 0x4801a00e, 0x59a80000, - 0x4801a00f, 0x59a80001, 0x4801a010, 0x58080011, - 0x4801a011, 0x58080012, 0x4801a012, 0x58080013, - 0x4801a013, 0x58080014, 0x4801a014, 0x4979a015, - 0x4979a016, 0x4979a017, 0x4979a018, 0x42000800, - 0x00000013, 0x42001000, 0x0000dc00, 0x0401f0f2, - 0x0401fce6, 0x5930001d, 0x800001c0, 0x04000008, - 0x4a01a006, 0x01000000, 0x4a01a407, 0x00000003, - 0x42000800, 0x00000002, 0x0401f028, 0x4a01a006, - 0x02000000, 0x41780800, 0x836c0580, 0x00000004, - 0x04020003, 0x84040d42, 0x0401f00d, 0x0201f800, - 0x00104716, 0x04020003, 0x84040d4a, 0x0401f002, - 0x84040d48, 0x59a8021b, 0x8c000506, 0x04020003, - 0x8c00050a, 0x04000002, 0x84040d46, 0x4805a207, - 0x59c40085, 0x48031004, 0x4c580000, 0x4c500000, - 0x4c540000, 0x4200b000, 0x00000006, 0x8388a400, - 0x00000000, 0x82d0ac00, 0x00000008, 0x0201f800, - 0x0010adef, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x42000800, 0x00000008, 0x42001000, 0x0000dc00, - 0x0401f0bd, 0x0401fca3, 0x4a01a006, 0x56000000, - 0x59340006, 0x4801a007, 0x59340007, 0x4801a008, - 0x42000800, 0x00000003, 0x42001000, 0x0000dc00, - 0x0401f0b1, 0x4803c856, 0x0401fca4, 0x5930081d, - 0x800409c0, 0x0400000e, 0x82040580, 0x0000ffff, - 0x04000004, 0x82040480, 0x00000007, 0x04021008, - 0x4a01a006, 0x01000000, 0x4a01a407, 0x00000003, - 0x42000800, 0x00000002, 0x0401f012, 0x4a01a006, - 0x0200001c, 0x4a01a007, 0x00000001, 0x42001000, - 0x0010b846, 0x50080000, 0x9c0001c0, 0x4801a009, - 0x59a8000f, 0x4801a00a, 0x59a80002, 0x59a80803, - 0x4801a00b, 0x4805a00c, 0x42000800, 0x00000007, - 0x42001000, 0x0000dc00, 0x0401f08b, 0x4d2c0000, - 0x0401fc70, 0x59325809, 0x592c0009, 0x82000500, - 0x00ffffff, 0x4801a001, 0x4a01a006, 0x51000000, - 0x5c025800, 0x0201f000, 0x001069bc, 0x4803c856, - 0x59325809, 0x5932680a, 0x59300407, 0x4803c857, - 0x82000d80, 0x00000009, 0x0400000a, 0x82000d80, - 0x0000000a, 0x04000032, 0x82000d80, 0x00000012, - 0x02000000, 0x0010a931, 0x0201f800, 0x0010032d, - 0x59300016, 0x8c00051e, 0x04020020, 0x42005000, - 0x04000000, 0x42006000, 0x05000000, 0x592c040b, - 0x82000500, 0x00000030, 0x800000e0, 0x80306540, - 0x5934000a, 0x8c000508, 0x04000002, 0x84306546, - 0x41786800, 0x41787800, 0x0401f831, 0x59300c17, - 0x80040000, 0x48026417, 0x40040000, 0x800000d0, - 0x82000540, 0x00000020, 0x4801a403, 0x83180d40, - 0x00000038, 0x42001000, 0x0000c920, 0x0401f86d, - 0x0201f000, 0x001058ce, 0x59a8021b, 0x82000500, - 0x00000028, 0x04000003, 0x497a6a12, 0x0401f7dc, - 0x4a026a12, 0x0000ff00, 0x0401f7d9, 0x42005000, - 0x02000000, 0x42006000, 0x20290000, 0x41786800, - 0x41787800, 0x0401f812, 0x83180d40, 0x00000038, - 0x42001000, 0x0000c9a0, 0x0401f856, 0x42000800, - 0x00000004, 0x59300012, 0x82000500, 0xfff00000, - 0x80000540, 0x02000000, 0x001058d0, 0x42000800, - 0x0000000e, 0x0201f000, 0x001058d0, 0x4201a000, - 0x00000000, 0x0401f003, 0x4201a000, 0x00000011, - 0x59340a12, 0x82040d00, 0x0000ff00, 0x59a8000f, - 0x82000500, 0x000000ff, 0x900001c0, 0x80040540, - 0x80d00540, 0x44034800, 0x81a5a000, 0x59340002, - 0x82000500, 0x00ffffff, 0x59300c03, 0x82040d80, - 0x00000031, 0x04020002, 0x41780000, 0x80280540, - 0x4801a000, 0x59a8000f, 0x4801a001, 0x4831a002, - 0x82340540, 0x00000000, 0x4801a003, 0x59300402, - 0x4801a404, 0x59300a02, 0x4805a204, 0x8c30652e, - 0x04000003, 0x4805a404, 0x4801a204, 0x483da005, - 0x1c01f000, 0x4807c857, 0x4c040000, 0x0401f82a, - 0x5c000800, 0x40040000, 0x80081540, 0x800000c4, - 0x82000540, 0x00002000, 0x4803910a, 0x59b400f6, - 0x82000500, 0x00000018, 0x040207fd, 0x42001800, - 0x0010b899, 0x580c0004, 0x4803c857, 0x580c0006, - 0x4803c857, 0x580c1800, 0x480fc857, 0x4a0368f0, - 0x0010b898, 0x4a0368f1, 0x0010b89f, 0x480b68f3, - 0x4a0378e4, 0x00008000, 0x0201f000, 0x001058c9, - 0x4807c857, 0x480a2800, 0x4c040000, 0x0401f80a, - 0x5c000800, 0x59b400f6, 0x8c00050a, 0x040207fe, - 0x49a768f2, 0x480768f4, 0x4a0378e4, 0x00008000, - 0x1c01f000, 0x4a0378e4, 0x0000c000, 0x59bc00e4, - 0x8c000520, 0x0400000c, 0x4a0378e4, 0x00008000, - 0x42007000, 0x000003e8, 0x59bc00e4, 0x8c000520, - 0x040007f5, 0x80387040, 0x02000800, 0x0010032d, - 0x0401f7fa, 0x1c01f000, 0x82000500, 0xffff0000, - 0x82000580, 0x01050000, 0x0402000d, 0x599c0818, - 0x8c040d10, 0x0400000a, 0x59a80806, 0x8c040d0a, - 0x04000007, 0x42001000, 0x0000804f, 0x41781800, - 0x41782000, 0x0201f800, 0x001031eb, 0x1c01f000, - 0x1c01f000, 0x59a80052, 0x800001c0, 0x0400004d, - 0x4d2c0000, 0x4d300000, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x40025800, 0x4000c000, 0x4000c800, - 0x42026000, 0x0010f518, 0x592c0407, 0x81440580, - 0x04020035, 0x592c0205, 0x82000580, 0x00000055, - 0x04000005, 0x8d3e7d18, 0x0400002f, 0x8d3e7d16, - 0x0402002d, 0x40640000, 0x812c0580, 0x0402001b, - 0x59300203, 0x82000580, 0x00000000, 0x04000013, - 0x59300009, 0x800001c0, 0x04000010, 0x0201f800, - 0x0010610d, 0x4df00000, 0x0201f800, 0x00105ff7, - 0x0201f800, 0x0010e2ad, 0x80c40040, 0x04020003, - 0x4a026203, 0x00000000, 0x5c03e000, 0x02000800, - 0x001060fa, 0x497a6009, 0x592cc800, 0x4064c000, - 0x4064b800, 0x0401f003, 0x592cb800, 0x485cc000, - 0x497a5800, 0x592c0205, 0x82000580, 0x00000155, - 0x04000004, 0x0201f800, 0x00100580, 0x0401f004, - 0x49425a07, 0x0201f800, 0x000203ab, 0x405e5800, - 0x0401f003, 0x412cc000, 0x592e5800, 0x812e59c0, - 0x040207c6, 0x48675052, 0x48635053, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x5c026000, 0x5c025800, - 0x1c01f000, 0x4943c857, 0x4d440000, 0x4d340000, - 0x4c580000, 0x4200b000, 0x000007f0, 0x417a8800, - 0x0201f800, 0x00020319, 0x04020002, 0x0401ffa6, - 0x81468800, 0x8058b040, 0x040207fa, 0x83440480, - 0x00000800, 0x04021008, 0x8d3e7d02, 0x04000006, - 0x42028800, 0x000007f0, 0x4200b000, 0x00000010, - 0x0401f7f0, 0x5c00b000, 0x5c026800, 0x5c028800, - 0x1c01f000, 0x4d300000, 0x59a81052, 0x800811c0, - 0x0400001c, 0x42026000, 0x0010f518, 0x59300203, - 0x82000580, 0x00000000, 0x04020016, 0x58080803, - 0x4806600a, 0x480a6009, 0x4a026407, 0x00000005, - 0x4a026203, 0x00000001, 0x4a026403, 0x00000092, - 0x41780800, 0x58080205, 0x82000580, 0x00000055, - 0x04000003, 0x42000800, 0x00000001, 0x48066421, - 0x42000800, 0x80000040, 0x0201f800, 0x000209b1, - 0x5c026000, 0x1c01f000, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x4d180000, 0x4803c856, - 0x417a3000, 0x0201f800, 0x00106705, 0x59900804, - 0x800409c0, 0x04000015, 0x83947c00, 0x00000009, - 0x83180400, 0x00105744, 0x50000000, 0x803c7c00, - 0x583c0003, 0x811808ca, 0x82040c00, 0x00006139, - 0x50040800, 0x80040580, 0x04000008, 0x42000000, - 0x0010bc81, 0x0201f800, 0x0010ad1d, 0x82000540, - 0x00000001, 0x0401f005, 0x811a3000, 0x83180580, - 0x00000005, 0x040207e4, 0x5c023000, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, - 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, - 0x4d180000, 0x4803c856, 0x598c080f, 0x800409c0, - 0x04000003, 0x0201f800, 0x001058c9, 0x417a3000, - 0x0201f800, 0x00106705, 0x59900804, 0x800409c0, - 0x04000012, 0x83947c00, 0x00000009, 0x83180400, - 0x00105744, 0x50000000, 0x803c7c00, 0x811808ca, - 0x82040c00, 0x00006139, 0x50040800, 0x48047803, - 0x4a007801, 0x000001f4, 0x4a007800, 0x0000000a, - 0x4a007802, 0x00000004, 0x811a3000, 0x83180580, - 0x00000005, 0x040207e7, 0x5c023000, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, - 0x41781000, 0x42026000, 0x0010f584, 0x59a8180d, - 0x480a6402, 0x4a026202, 0x0000ffff, 0x80081000, - 0x800c1840, 0x04000004, 0x83326400, 0x00000024, - 0x0401f7f8, 0x1c01f000, 0x0201f800, 0x00020a10, - 0x1c01f000, 0x5c036000, 0x4db00000, 0x49b3c857, - 0x4933c857, 0x813261c0, 0x04000037, 0x59300203, - 0x82000580, 0x00000000, 0x04000033, 0x59300004, - 0x8c00053e, 0x02020800, 0x0010032d, 0x59300407, - 0x4803c857, 0x82000d80, 0x00000004, 0x04000011, - 0x82000d80, 0x00000001, 0x0400000e, 0x82000d80, - 0x00000003, 0x04000006, 0x82000d80, 0x00000006, - 0x04020015, 0x0201f800, 0x0010a18b, 0x5930001d, - 0x800001c0, 0x02020800, 0x0010911f, 0x0401f00e, - 0x5930081f, 0x4807c857, 0x4d300000, 0x40066000, - 0x0201f800, 0x001091d9, 0x5c026000, 0x04020006, - 0x5804001d, 0x4803c857, 0x81300580, 0x04020002, - 0x4978081d, 0x4a026407, 0x00000007, 0x497a6009, - 0x4a026004, 0x00004000, 0x59a8002a, 0x82000c80, - 0x00000051, 0x04001002, 0x80000102, 0x48026006, - 0x497a6205, 0x1c01f000, 0x0401f803, 0x41318800, - 0x1c01f000, 0x83640480, 0x00000010, 0x04021008, - 0x42000000, 0x0010bc10, 0x0201f800, 0x0010ad1d, - 0x4967c857, 0x80026580, 0x1c01f000, 0x8166c9c0, - 0x0400001c, 0x41626000, 0x41580000, 0x59300a03, - 0x82040d80, 0x00000000, 0x04000008, 0x83326400, - 0x00000024, 0x81300c80, 0x040017f9, 0x42026000, - 0x0010f584, 0x0401f7f6, 0x4933c857, 0x8166c840, - 0x83300c00, 0x00000024, 0x80040480, 0x04021006, - 0x4006c000, 0x4a026203, 0x00000008, 0x813261c0, - 0x1c01f000, 0x4202c000, 0x0010f584, 0x0401f7fa, - 0x42000000, 0x0010bc10, 0x0201f800, 0x0010ad1d, - 0x4933c856, 0x417a6000, 0x0401f7f5, 0x0201f800, - 0x00020a34, 0x1c01f000, 0x4933c857, 0x83380580, - 0x00000013, 0x0402000b, 0x59300004, 0x8c00053e, - 0x04000007, 0x0201f800, 0x0010610d, 0x0201f800, - 0x0010605d, 0x0201f800, 0x001060fa, 0x1c01f000, - 0x4933c857, 0x598800b7, 0x80000000, 0x480310b7, - 0x1c01f000, 0x4933c857, 0x59300203, 0x82003480, - 0x0000000e, 0x02021800, 0x0010032d, 0x4d2c0000, - 0x0c01f803, 0x5c025800, 0x1c01f000, 0x00107151, - 0x0010771e, 0x00107883, 0x00107151, 0x001078ed, - 0x001072d6, 0x00107151, 0x00107151, 0x001076aa, - 0x00107151, 0x00107151, 0x00107151, 0x00107151, - 0x00107151, 0x0201f800, 0x0010032d, 0x4933c857, - 0x59300203, 0x82003480, 0x0000000e, 0x02021800, - 0x0010032d, 0x0c01f001, 0x00107168, 0x001082ab, - 0x00107168, 0x00107168, 0x00107168, 0x00107168, - 0x00107168, 0x00107168, 0x00108247, 0x001082c7, - 0x0010833d, 0x001082c7, 0x0010833d, 0x00107168, - 0x0201f800, 0x0010032d, 0x0201f800, 0x0010032d, - 0x4933c857, 0x4d2c0000, 0x59325809, 0x59300203, + 0x0201f000, 0x00107000, 0x4a026202, 0x0000ffff, + 0x0401f893, 0x4a01a406, 0x00002010, 0x4a01a206, + 0x00000014, 0x4a01a407, 0x00000800, 0x4a01a207, + 0x00002000, 0x42000000, 0x00000400, 0x59a80807, + 0x8c040d0c, 0x04000002, 0x80000580, 0x599c0817, + 0x8c040d0a, 0x04020003, 0x82000540, 0x00000020, + 0x8c040d08, 0x04000003, 0x82000540, 0x00000010, + 0x82000540, 0x00000002, 0x5934080a, 0x8c040d14, + 0x04000005, 0x82040d00, 0x00000380, 0x80040540, + 0x0401f006, 0x599c0818, 0x8c040d18, 0x04000003, + 0x82000540, 0x00000380, 0x0401f041, 0x0401f87a, + 0x4a01a406, 0x00000210, 0x4a01a206, 0x00000014, + 0x4a01a407, 0x00000800, 0x5934000a, 0x8c000516, + 0x04000014, 0x59340c05, 0x82040500, 0x00000030, + 0x04000013, 0x59340a05, 0x82040500, 0x0000c000, + 0x04020009, 0x8c040d1a, 0x04000004, 0x4a01a207, + 0x00002100, 0x0401f00c, 0x4a01a207, 0x00000100, + 0x0401f009, 0x4a01a207, 0x00000400, 0x0401f006, + 0x4a01a207, 0x00000700, 0x0401f003, 0x4a01a207, + 0x00000800, 0x42000000, 0x00000400, 0x59a80807, + 0x8c040d0c, 0x04000002, 0x80000580, 0x599c0817, + 0x8c040d0a, 0x04020003, 0x82000540, 0x00000020, + 0x8c040d08, 0x04000003, 0x82000540, 0x00000010, + 0x82000540, 0x00000002, 0x59340a00, 0x8c040d0e, + 0x0400000b, 0x84000550, 0x599c1017, 0x8c08150a, + 0x04020004, 0x8c040d0a, 0x04000002, 0x8400054e, + 0x8c040d1c, 0x04000002, 0x84000552, 0x4801a20a, + 0x42000800, 0x00000005, 0x42001000, 0x0000dc00, + 0x0201f000, 0x00107000, 0x0401f833, 0x4a01a006, + 0x02100014, 0x4a01a007, 0x00000100, 0x4979a008, + 0x4979a009, 0x4979a00a, 0x42000800, 0x00000005, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107000, + 0x0401f825, 0x4a01a006, 0x02000000, 0x0401f643, + 0x4933c857, 0x0401f820, 0x4a01a006, 0x01000000, + 0x4a01a407, 0x0000000b, 0x42000800, 0x00000002, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107000, + 0x42005000, 0x32000000, 0x42006000, 0x08290000, + 0x41786800, 0x41787800, 0x0401f3f3, 0x42005000, + 0x22000000, 0x42006000, 0x01290000, 0x41786800, + 0x41787800, 0x0401f3ec, 0x42005000, 0x33000000, + 0x42006000, 0x08980000, 0x41786800, 0x41787800, + 0x0401f3e5, 0x42005000, 0x23000000, 0x42006000, + 0x01980000, 0x41786800, 0x41787800, 0x0401f3de, + 0x59300403, 0x82000c80, 0x00000085, 0x02001800, + 0x0010032d, 0x82000c80, 0x00000093, 0x02021800, + 0x0010032d, 0x82000480, 0x00000085, 0x0c01f001, + 0x00106c16, 0x00106c16, 0x00106c16, 0x00106c16, + 0x00106c16, 0x00106c16, 0x00106c16, 0x00106c16, + 0x00106c16, 0x00106c16, 0x00106c16, 0x00106c16, + 0x00106c16, 0x00106c18, 0x0201f800, 0x0010032d, + 0x4d2c0000, 0x59325809, 0x4933c857, 0x492fc857, + 0x812e59c0, 0x02000800, 0x0010032d, 0x59340a12, + 0x82040d00, 0x0000ff00, 0x592c000b, 0x82000500, + 0x000000ff, 0x900001c0, 0x80040540, 0x82000540, + 0x00000011, 0x44034800, 0x81a5a000, 0x42001000, + 0x00000009, 0x42000800, 0x00000003, 0x592c000a, + 0x82000500, 0xff000000, 0x82001d80, 0x84000000, + 0x04000009, 0x82001d80, 0x85000000, 0x02020800, + 0x0010032d, 0x42001000, 0x00000007, 0x42000800, + 0x00000001, 0x832c1c00, 0x0000000a, 0x500c0000, + 0x4401a000, 0x800c1800, 0x80d1a000, 0x80081040, + 0x040207fb, 0x42001000, 0x0000dc00, 0x5c025800, + 0x0401f3b8, 0x42005000, 0x81000000, 0x42006000, + 0x00090000, 0x41786800, 0x41787800, 0x59301407, + 0x82081580, 0x00000005, 0x04020003, 0x42006000, + 0x00890000, 0x0401f384, 0x59300403, 0x82000c80, + 0x00000053, 0x02021800, 0x0010032d, 0x82000480, + 0x0000004b, 0x02001800, 0x0010032d, 0x5932680a, + 0x59368c03, 0x4803c857, 0x0c01f001, 0x00106cd5, + 0x00106cdd, 0x00106ce5, 0x00106ced, 0x00106c6b, + 0x00106c6b, 0x00106c6b, 0x00106ccd, 0x0201f800, + 0x0010032d, 0x42005000, 0x06000000, 0x42006000, + 0x08290000, 0x41786800, 0x41787800, 0x0401f366, + 0x4933c857, 0x0401ff72, 0x4a01a006, 0x12000000, + 0x59300407, 0x82000580, 0x00000004, 0x04020003, + 0x59340002, 0x0401f002, 0x59a8000f, 0x82000500, + 0x00ffffff, 0x4801a007, 0x5930041a, 0x4801a408, + 0x5930021a, 0x4801a208, 0x42000800, 0x00000003, + 0x42001000, 0x0000dc00, 0x0401f376, 0x0401ff5c, + 0x4a01a006, 0x0f000000, 0x5930001d, 0x4801a007, + 0x42000800, 0x00000002, 0x42001000, 0x0000dc00, + 0x0401f36c, 0x0401ff60, 0x4a01a006, 0x02000000, + 0x59c40085, 0x59880804, 0x80040c00, 0x48071004, + 0x497b8885, 0x59880000, 0x4801a007, 0x59880001, + 0x4801a008, 0x59880002, 0x4801a009, 0x59880003, + 0x4801a00a, 0x59880004, 0x4801a00b, 0x59880005, + 0x4801a00c, 0x42000800, 0x00000007, 0x42001000, + 0x0000dc00, 0x0401f353, 0x4a026202, 0x0000ffff, + 0x0401ff37, 0x4a01a006, 0x62000000, 0x5930001d, + 0x4801a007, 0x42000800, 0x00000002, 0x42001000, + 0x0000dc00, 0x0401f347, 0x0401ff2d, 0x59300809, + 0x4c500000, 0x4c540000, 0x4c580000, 0x8204a400, + 0x0000000b, 0x5930b01d, 0x82d0ac00, 0x00000006, + 0x0201f800, 0x0010aee2, 0x5930081d, 0x42001000, + 0x0000dc00, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x0401f334, 0x0401ffa0, 0x59300018, 0x4801a006, + 0x59300019, 0x4801a007, 0x4a01a008, 0x00001000, + 0x0401f020, 0x0401ff98, 0x59300018, 0x4801a006, + 0x59300019, 0x4801a007, 0x4a01a008, 0x00004000, + 0x0401f018, 0x0401ff90, 0x59300018, 0x4801a006, + 0x59300019, 0x4801a007, 0x4a01a008, 0x00002000, + 0x0401f010, 0x0401ff88, 0x59300018, 0x4801a006, + 0x59300019, 0x4801a007, 0x4a01a008, 0x00000400, + 0x0401f008, 0x0401ff80, 0x59300018, 0x4801a006, + 0x59300019, 0x4801a007, 0x4a01a008, 0x00000200, + 0x4979a009, 0x4979a00a, 0x4979a00b, 0x4979a00c, + 0x4979a00d, 0x42000800, 0x00000008, 0x42001000, + 0x0000dc00, 0x0401f303, 0x0401fef7, 0x4a01a006, + 0x02000014, 0x4979a407, 0x4979a207, 0x59a8002d, + 0x4801a008, 0x59a8002e, 0x4801a009, 0x4a01a00a, + 0x00047878, 0x42000800, 0x00000005, 0x42001000, + 0x0000dc00, 0x0401f2f3, 0x0401fee7, 0x4a01a006, + 0x02140018, 0x4a01a407, 0x00000800, 0x5930001d, + 0x82000d00, 0xff000000, 0x900409c0, 0x4805a207, + 0x82000500, 0x00ffffff, 0x4801a00a, 0x4979a408, + 0x4979a208, 0x4979a409, 0x4979a209, 0x4979a00b, + 0x42000800, 0x00000006, 0x42001000, 0x0000dc00, + 0x0401f2dc, 0x4933c857, 0x4937c857, 0x4d1c0000, + 0x42000800, 0x00000035, 0x0201f800, 0x00108d34, + 0x04020025, 0x0401feba, 0x4a01a006, 0x13000000, + 0x5932381f, 0x59300403, 0x82000580, 0x00000057, + 0x04000005, 0x591c0415, 0x8c000502, 0x02000800, + 0x0010032d, 0x591c001a, 0x4801a005, 0x591c0407, + 0x82000580, 0x00000003, 0x04000007, 0x5930080a, + 0x58040002, 0x82000500, 0x00ffffff, 0x4801a007, + 0x0401f003, 0x59a8000f, 0x4801a007, 0x5930041a, + 0x4801a408, 0x5930021a, 0x4801a208, 0x42000800, + 0x00000003, 0x42001000, 0x0000dc00, 0x5c023800, + 0x0401f2b0, 0x4803c856, 0x0201f800, 0x001061b2, + 0x598c000f, 0x81300580, 0x02020800, 0x0010032d, + 0x0201f800, 0x00106102, 0x59300403, 0x82000580, + 0x00000057, 0x02000800, 0x001078e7, 0x0201f800, + 0x00020a10, 0x5c023800, 0x0201f000, 0x0010619f, + 0x4803c856, 0x4d2c0000, 0x4d1c0000, 0x5932381f, + 0x811e39c0, 0x02000800, 0x0010032d, 0x831c0580, + 0xffffffff, 0x0400003d, 0x591c0c07, 0x82040580, + 0x00000006, 0x0400000d, 0x82040580, 0x00000003, + 0x0400003b, 0x4a026403, 0x00000037, 0x4a02641b, + 0x00000003, 0x4a02621b, 0x00001700, 0x5c023800, + 0x5c025800, 0x0401f06c, 0x0401f850, 0x42001000, + 0x40000000, 0x591c0203, 0x591c0804, 0x8c040d3e, + 0x04020023, 0x82000c80, 0x0000000e, 0x0c001003, + 0x0201f800, 0x0010032d, 0x00106d9b, 0x00106da7, + 0x00106d9d, 0x00106da7, 0x00106da3, 0x00106d9b, + 0x00106d9b, 0x00106da7, 0x00106da7, 0x00106d9b, + 0x00106d9b, 0x00106d9b, 0x00106d9b, 0x00106d9b, + 0x00106da7, 0x00106d9b, 0x00106da7, 0x0201f800, + 0x0010032d, 0x591c0415, 0x4803c857, 0x8c000518, + 0x04000003, 0x8c000512, 0x04000003, 0x80001580, + 0x0401f003, 0x42001000, 0x20000000, 0x591c0016, + 0x4801a00a, 0x0401f01d, 0x0401f824, 0x42001000, + 0x40000000, 0x41780000, 0x0401f7fa, 0x0401f81f, + 0x591e5809, 0x812e59c0, 0x02000800, 0x0010032d, + 0x592c1010, 0x591c0012, 0x80080480, 0x4801a00a, + 0x591c0203, 0x591c0804, 0x8c040d3e, 0x04020007, + 0x82000d80, 0x00000002, 0x04000007, 0x82000d80, + 0x00000004, 0x04000004, 0x42001000, 0x40000000, + 0x0401f002, 0x80001580, 0x4809a00b, 0x42000800, + 0x00000006, 0x42001000, 0x0000dc00, 0x5c023800, + 0x5c025800, 0x0401f233, 0x4803c856, 0x0401fe26, + 0x4a01a006, 0x02000000, 0x59300c1a, 0x4805a407, + 0x59300a1a, 0x4805a207, 0x59a8100f, 0x5930080a, + 0x58041802, 0x820c1d00, 0x00ffffff, 0x5930081f, + 0x82040580, 0xffffffff, 0x04000008, 0x58040407, + 0x82000580, 0x00000003, 0x04020004, 0x4809a008, + 0x480da009, 0x0401f003, 0x480da008, 0x4809a009, + 0x1c01f000, 0x4803c856, 0x0401fe0b, 0x0401f003, + 0x4803c856, 0x0401fe01, 0x4a01a006, 0x01000000, + 0x5930041b, 0x4801a407, 0x5930021b, 0x4801a207, + 0x42000800, 0x00000002, 0x42001000, 0x0000dc00, + 0x0401f208, 0x4803c856, 0x4d1c0000, 0x0401fde5, + 0x4a01a006, 0x14000000, 0x5932381f, 0x591c001a, + 0x4801a005, 0x5930041a, 0x4801a407, 0x5930021a, + 0x4801a207, 0x59300016, 0x4801a008, 0x59300217, + 0x82000500, 0x000000ff, 0x840001c0, 0x4801a409, + 0x42000800, 0x00000004, 0x42001000, 0x0000dc00, + 0x5c023800, 0x0401f1ef, 0x4803c856, 0x0401fde2, + 0x4a01a006, 0x02000001, 0x42001000, 0xe0000000, + 0x59a80873, 0x8c040d3e, 0x04000004, 0x42001000, + 0x20000000, 0x0401f010, 0x59a8006d, 0x8c000508, + 0x04000004, 0x82081500, 0xdfffffff, 0x0401f00a, + 0x59a80847, 0x82040d80, 0x01391077, 0x04020006, + 0x59e00813, 0x8c040d00, 0x04000003, 0x82081500, + 0xdfffffff, 0x59c40801, 0x82040d00, 0x00018000, + 0x82040580, 0x00000000, 0x42000000, 0x00008000, + 0x0400000d, 0x82040580, 0x00008000, 0x42000000, + 0x00004000, 0x04000008, 0x82040580, 0x00010000, + 0x42000000, 0x00002000, 0x04000003, 0x42000000, + 0x00000002, 0x80080540, 0x4801a007, 0x42000800, + 0x00000002, 0x42001000, 0x0000dc00, 0x0401f1b9, + 0x4803c856, 0x0401f80b, 0x5930041b, 0x900001c0, + 0x4801a005, 0x0401f9f0, 0x41780800, 0x42001000, + 0x00005c00, 0x0401f9af, 0x0201f000, 0x0010596e, + 0x4803c856, 0x59300818, 0x82041c00, 0x00000006, + 0x46034800, 0x00000021, 0x58040405, 0x82000500, + 0x0000f000, 0x82000580, 0x00003000, 0x04000003, + 0x46034800, 0x00000041, 0x81a5a000, 0x580c0001, + 0x82000d00, 0x00ffffff, 0x82040d40, 0xc2000000, + 0x4805a000, 0x580c0800, 0x82041500, 0x00ffffff, + 0x82000500, 0xff000000, 0x80080540, 0x4801a001, + 0x580c0002, 0x82000580, 0x00c00000, 0x82000500, + 0x00fd0300, 0x4801a002, 0x580c0003, 0x4801a003, + 0x580c0404, 0x4801a404, 0x580c0204, 0x4801a204, + 0x1c01f000, 0x4803c856, 0x59a8021b, 0x82000500, + 0x00000028, 0x04020009, 0x59a8021b, 0x82000500, + 0x00000028, 0x04000003, 0x497a6a12, 0x0401f003, + 0x4a026a12, 0x0000ff00, 0x42005000, 0x22000000, + 0x42006000, 0x01380000, 0x41786800, 0x41787800, + 0x0401f949, 0x59301009, 0x4a01a006, 0x54000000, + 0x59a8000f, 0x82000500, 0x00ffffff, 0x58080c0b, + 0x800408f0, 0x80040540, 0x4801a007, 0x5808000b, + 0x82000500, 0xff000000, 0x4801a008, 0x59a80002, + 0x4801a009, 0x59a80003, 0x4801a00a, 0x59a80000, + 0x4801a00b, 0x59a80001, 0x4801a00c, 0x5808000d, + 0x9c0001c0, 0x4801a00d, 0x5808000e, 0x9c0001c0, + 0x4801a00e, 0x5808000f, 0x9c0001c0, 0x4801a00f, + 0x58080010, 0x9c0001c0, 0x4801a010, 0x58080011, + 0x9c0001c0, 0x4801a011, 0x58080012, 0x9c0001c0, + 0x4801a012, 0x58080013, 0x9c0001c0, 0x4801a013, + 0x58080014, 0x9c0001c0, 0x4801a014, 0x58080011, + 0x9c0001c0, 0x4801a015, 0x58080012, 0x9c0001c0, + 0x4801a016, 0x58080013, 0x9c0001c0, 0x4801a017, + 0x58080014, 0x9c0001c0, 0x4801a018, 0x42000800, + 0x00000013, 0x42001000, 0x0000dc00, 0x0401f131, + 0x4803c856, 0x42005000, 0x22000000, 0x42006000, + 0x01290000, 0x41786800, 0x41787800, 0x0401f902, + 0x59301009, 0x4a01a006, 0x55000000, 0x5808000c, + 0x82000500, 0x00ffffff, 0x58080c0b, 0x800408f0, + 0x80040540, 0x4801a007, 0x5808080b, 0x82040d00, + 0xff000000, 0x59a8000f, 0x82000500, 0x00ffffff, + 0x80040540, 0x4801a008, 0x5808000d, 0x9c0001c0, + 0x4801a009, 0x5808000e, 0x9c0001c0, 0x4801a00a, + 0x5808000f, 0x9c0001c0, 0x4801a00b, 0x58080010, + 0x9c0001c0, 0x4801a00c, 0x59a80002, 0x4801a00d, + 0x59a80003, 0x4801a00e, 0x59a80000, 0x4801a00f, + 0x59a80001, 0x4801a010, 0x58080011, 0x4801a011, + 0x58080012, 0x4801a012, 0x58080013, 0x4801a013, + 0x58080014, 0x4801a014, 0x4979a015, 0x4979a016, + 0x4979a017, 0x4979a018, 0x42000800, 0x00000013, + 0x42001000, 0x0000dc00, 0x0401f0f2, 0x0401fce6, + 0x5930001d, 0x800001c0, 0x04000008, 0x4a01a006, + 0x01000000, 0x4a01a407, 0x00000003, 0x42000800, + 0x00000002, 0x0401f028, 0x4a01a006, 0x02000000, + 0x41780800, 0x836c0580, 0x00000004, 0x04020003, + 0x84040d42, 0x0401f00d, 0x0201f800, 0x00104755, + 0x04020003, 0x84040d4a, 0x0401f002, 0x84040d48, + 0x59a8021b, 0x8c000506, 0x04020003, 0x8c00050a, + 0x04000002, 0x84040d46, 0x4805a207, 0x59c40085, + 0x48031004, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4200b000, 0x00000006, 0x8388a400, 0x00000000, + 0x82d0ac00, 0x00000008, 0x0201f800, 0x0010aee2, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x42000800, + 0x00000008, 0x42001000, 0x0000dc00, 0x0401f0bd, + 0x0401fca3, 0x4a01a006, 0x56000000, 0x59340006, + 0x4801a007, 0x59340007, 0x4801a008, 0x42000800, + 0x00000003, 0x42001000, 0x0000dc00, 0x0401f0b1, + 0x4803c856, 0x0401fca4, 0x5930081d, 0x800409c0, + 0x0400000e, 0x82040580, 0x0000ffff, 0x04000004, + 0x82040480, 0x00000007, 0x04021008, 0x4a01a006, + 0x01000000, 0x4a01a407, 0x00000003, 0x42000800, + 0x00000002, 0x0401f012, 0x4a01a006, 0x0200001c, + 0x4a01a007, 0x00000001, 0x42001000, 0x0010b946, + 0x50080000, 0x9c0001c0, 0x4801a009, 0x59a8000f, + 0x4801a00a, 0x59a80002, 0x59a80803, 0x4801a00b, + 0x4805a00c, 0x42000800, 0x00000007, 0x42001000, + 0x0000dc00, 0x0401f08b, 0x4d2c0000, 0x0401fc70, + 0x59325809, 0x592c0009, 0x82000500, 0x00ffffff, + 0x4801a001, 0x4a01a006, 0x51000000, 0x5c025800, + 0x0201f000, 0x00106a56, 0x4803c856, 0x59325809, + 0x5932680a, 0x59300407, 0x4803c857, 0x82000d80, + 0x00000009, 0x0400000a, 0x82000d80, 0x0000000a, + 0x04000032, 0x82000d80, 0x00000012, 0x02000000, + 0x0010aa24, 0x0201f800, 0x0010032d, 0x59300016, + 0x8c00051e, 0x04020020, 0x42005000, 0x04000000, + 0x42006000, 0x05000000, 0x592c040b, 0x82000500, + 0x00000030, 0x800000e0, 0x80306540, 0x5934000a, + 0x8c000508, 0x04000002, 0x84306546, 0x41786800, + 0x41787800, 0x0401f831, 0x59300c17, 0x80040000, + 0x48026417, 0x40040000, 0x800000d0, 0x82000540, + 0x00000020, 0x4801a403, 0x83180d40, 0x00000038, + 0x42001000, 0x0000c920, 0x0401f86d, 0x0201f000, + 0x00105973, 0x59a8021b, 0x82000500, 0x00000028, + 0x04000003, 0x497a6a12, 0x0401f7dc, 0x4a026a12, + 0x0000ff00, 0x0401f7d9, 0x42005000, 0x02000000, + 0x42006000, 0x20290000, 0x41786800, 0x41787800, + 0x0401f812, 0x83180d40, 0x00000038, 0x42001000, + 0x0000c9a0, 0x0401f856, 0x42000800, 0x00000004, + 0x59300012, 0x82000500, 0xfff00000, 0x80000540, + 0x02000000, 0x00105975, 0x42000800, 0x0000000e, + 0x0201f000, 0x00105975, 0x4201a000, 0x00000000, + 0x0401f003, 0x4201a000, 0x00000011, 0x59340a12, + 0x82040d00, 0x0000ff00, 0x59a8000f, 0x82000500, + 0x000000ff, 0x900001c0, 0x80040540, 0x80d00540, + 0x44034800, 0x81a5a000, 0x59340002, 0x82000500, + 0x00ffffff, 0x59300c03, 0x82040d80, 0x00000031, + 0x04020002, 0x41780000, 0x80280540, 0x4801a000, + 0x59a8000f, 0x4801a001, 0x4831a002, 0x82340540, + 0x00000000, 0x4801a003, 0x59300402, 0x4801a404, + 0x59300a02, 0x4805a204, 0x8c30652e, 0x04000003, + 0x4805a404, 0x4801a204, 0x483da005, 0x1c01f000, + 0x4807c857, 0x4c040000, 0x0401f82a, 0x5c000800, + 0x40040000, 0x80081540, 0x800000c4, 0x82000540, + 0x00002000, 0x4803910a, 0x59b400f6, 0x82000500, + 0x00000018, 0x040207fd, 0x42001800, 0x0010b999, + 0x580c0004, 0x4803c857, 0x580c0006, 0x4803c857, + 0x580c1800, 0x480fc857, 0x4a0368f0, 0x0010b998, + 0x4a0368f1, 0x0010b99f, 0x480b68f3, 0x4a0378e4, + 0x00008000, 0x0201f000, 0x0010596e, 0x4807c857, + 0x480a2800, 0x4c040000, 0x0401f80a, 0x5c000800, + 0x59b400f6, 0x8c00050a, 0x040207fe, 0x49a768f2, + 0x480768f4, 0x4a0378e4, 0x00008000, 0x1c01f000, + 0x4a0378e4, 0x0000c000, 0x59bc00e4, 0x8c000520, + 0x0400000c, 0x4a0378e4, 0x00008000, 0x42007000, + 0x000003e8, 0x59bc00e4, 0x8c000520, 0x040007f5, + 0x80387040, 0x02000800, 0x0010032d, 0x0401f7fa, + 0x1c01f000, 0x82000500, 0xffff0000, 0x82000580, + 0x01050000, 0x0402000d, 0x599c0818, 0x8c040d10, + 0x0400000a, 0x59a80806, 0x8c040d0a, 0x04000007, + 0x42001000, 0x0000804f, 0x41781800, 0x41782000, + 0x0201f800, 0x001031f5, 0x1c01f000, 0x1c01f000, + 0x59a80052, 0x800001c0, 0x0400004d, 0x4d2c0000, + 0x4d300000, 0x4c5c0000, 0x4c600000, 0x4c640000, + 0x40025800, 0x4000c000, 0x4000c800, 0x42026000, + 0x0010f628, 0x592c0407, 0x81440580, 0x04020035, + 0x592c0205, 0x82000580, 0x00000055, 0x04000005, + 0x8d3e7d18, 0x0400002f, 0x8d3e7d16, 0x0402002d, + 0x40640000, 0x812c0580, 0x0402001b, 0x59300203, + 0x82000580, 0x00000000, 0x04000013, 0x59300009, + 0x800001c0, 0x04000010, 0x0201f800, 0x001061b2, + 0x4df00000, 0x0201f800, 0x0010609c, 0x0201f800, + 0x0010e3bd, 0x80c40040, 0x04020003, 0x4a026203, + 0x00000000, 0x5c03e000, 0x02000800, 0x0010619f, + 0x497a6009, 0x592cc800, 0x4064c000, 0x4064b800, + 0x0401f003, 0x592cb800, 0x485cc000, 0x497a5800, + 0x592c0205, 0x82000580, 0x00000155, 0x04000004, + 0x0201f800, 0x00100580, 0x0401f004, 0x49425a07, + 0x0201f800, 0x000203ab, 0x405e5800, 0x0401f003, + 0x412cc000, 0x592e5800, 0x812e59c0, 0x040207c6, + 0x48675052, 0x48635053, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x5c026000, 0x5c025800, 0x1c01f000, + 0x4943c857, 0x4d440000, 0x4d340000, 0x4c580000, + 0x4200b000, 0x000007f0, 0x417a8800, 0x0201f800, + 0x00020319, 0x04020002, 0x0401ffa6, 0x81468800, + 0x8058b040, 0x040207fa, 0x83440480, 0x00000800, + 0x04021008, 0x8d3e7d02, 0x04000006, 0x42028800, + 0x000007f0, 0x4200b000, 0x00000010, 0x0401f7f0, + 0x5c00b000, 0x5c026800, 0x5c028800, 0x1c01f000, + 0x4d300000, 0x59a81052, 0x800811c0, 0x0400001c, + 0x42026000, 0x0010f628, 0x59300203, 0x82000580, + 0x00000000, 0x04020016, 0x58080803, 0x4806600a, + 0x480a6009, 0x4a026407, 0x00000005, 0x4a026203, + 0x00000001, 0x4a026403, 0x00000092, 0x41780800, + 0x58080205, 0x82000580, 0x00000055, 0x04000003, + 0x42000800, 0x00000001, 0x48066421, 0x42000800, + 0x80000040, 0x0201f800, 0x000209b1, 0x5c026000, + 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x4d180000, 0x4803c856, 0x417a3000, + 0x0201f800, 0x001067aa, 0x59900804, 0x800409c0, + 0x04000015, 0x83947c00, 0x00000009, 0x83180400, + 0x001057e9, 0x50000000, 0x803c7c00, 0x583c0003, + 0x811808ca, 0x82040c00, 0x00006139, 0x50040800, + 0x80040580, 0x04000008, 0x42000000, 0x0010bd81, + 0x0201f800, 0x0010ae10, 0x82000540, 0x00000001, + 0x0401f005, 0x811a3000, 0x83180580, 0x00000005, + 0x040207e4, 0x5c023000, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x1c01f000, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x4d180000, + 0x4803c856, 0x598c080f, 0x800409c0, 0x04000003, + 0x0201f800, 0x0010596e, 0x417a3000, 0x0201f800, + 0x001067aa, 0x59900804, 0x800409c0, 0x04000012, + 0x83947c00, 0x00000009, 0x83180400, 0x001057e9, + 0x50000000, 0x803c7c00, 0x811808ca, 0x82040c00, + 0x00006139, 0x50040800, 0x48047803, 0x4a007801, + 0x000001f4, 0x4a007800, 0x0000000a, 0x4a007802, + 0x00000004, 0x811a3000, 0x83180580, 0x00000005, + 0x040207e7, 0x5c023000, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x1c01f000, 0x41781000, + 0x42026000, 0x0010f694, 0x59a8180d, 0x480a6402, + 0x4a026202, 0x0000ffff, 0x80081000, 0x800c1840, + 0x04000004, 0x83326400, 0x00000024, 0x0401f7f8, + 0x1c01f000, 0x0201f800, 0x00020a10, 0x1c01f000, + 0x5c036000, 0x4db00000, 0x49b3c857, 0x4933c857, + 0x813261c0, 0x0400003b, 0x59300203, 0x82000580, + 0x00000000, 0x04000037, 0x59300004, 0x8c00053e, + 0x02020800, 0x0010032d, 0x59300407, 0x4803c857, + 0x82000d80, 0x00000004, 0x04000011, 0x82000d80, + 0x00000001, 0x0400000e, 0x82000d80, 0x00000003, + 0x04000006, 0x82000d80, 0x00000006, 0x04020019, + 0x0201f800, 0x0010a26a, 0x5930001d, 0x800001c0, + 0x02020800, 0x001091d8, 0x0401f012, 0x5930000a, + 0x82000580, 0x0010c2b2, 0x0400000e, 0x5930081f, + 0x4807c857, 0x4d300000, 0x40066000, 0x0201f800, + 0x00109291, 0x5c026000, 0x04020006, 0x5804001d, + 0x4803c857, 0x81300580, 0x04020002, 0x4978081d, + 0x4a026407, 0x00000007, 0x497a6009, 0x4a026004, + 0x00004000, 0x59a8002a, 0x82000c80, 0x00000051, + 0x04001002, 0x80000102, 0x48026006, 0x497a6205, + 0x1c01f000, 0x0401f803, 0x41318800, 0x1c01f000, + 0x83640480, 0x00000010, 0x04021008, 0x42000000, + 0x0010bd10, 0x0201f800, 0x0010ae10, 0x4967c857, + 0x80026580, 0x1c01f000, 0x8166c9c0, 0x0400001c, + 0x41626000, 0x41580000, 0x59300a03, 0x82040d80, + 0x00000000, 0x04000008, 0x83326400, 0x00000024, + 0x81300c80, 0x040017f9, 0x42026000, 0x0010f694, + 0x0401f7f6, 0x4933c857, 0x8166c840, 0x83300c00, + 0x00000024, 0x80040480, 0x04021006, 0x4006c000, + 0x4a026203, 0x00000008, 0x813261c0, 0x1c01f000, + 0x4202c000, 0x0010f694, 0x0401f7fa, 0x42000000, + 0x0010bd10, 0x0201f800, 0x0010ae10, 0x4933c856, + 0x417a6000, 0x0401f7f5, 0x0201f800, 0x00020a34, + 0x1c01f000, 0x4933c857, 0x83380580, 0x00000013, + 0x0402000b, 0x59300004, 0x8c00053e, 0x04000007, + 0x0201f800, 0x001061b2, 0x0201f800, 0x00106102, + 0x0201f800, 0x0010619f, 0x1c01f000, 0x4933c857, + 0x598800b7, 0x80000000, 0x480310b7, 0x1c01f000, + 0x4933c857, 0x59300203, 0x82003480, 0x0000000e, + 0x02021800, 0x0010032d, 0x4d2c0000, 0x0c01f803, + 0x5c025800, 0x1c01f000, 0x001071e4, 0x001077b4, + 0x00107919, 0x001071e4, 0x00107991, 0x0010736c, + 0x001071e4, 0x001071e4, 0x00107740, 0x001071e4, + 0x001071e4, 0x001071e4, 0x001071e4, 0x001071e4, + 0x0201f800, 0x0010032d, 0x4933c857, 0x59300203, 0x82003480, 0x0000000e, 0x02021800, 0x0010032d, - 0x0c01f803, 0x5c025800, 0x1c01f000, 0x00107185, - 0x00107185, 0x00107185, 0x001071a1, 0x001071ed, - 0x00107185, 0x00107185, 0x00107185, 0x00107187, - 0x00107185, 0x00107185, 0x00107185, 0x00107185, - 0x00107185, 0x0201f800, 0x0010032d, 0x4933c857, - 0x83380580, 0x00000040, 0x02020800, 0x0010032d, - 0x4a026008, 0x00082000, 0x4a026203, 0x00000003, - 0x493a6403, 0x4a025c09, 0x00000001, 0x592c000e, - 0x48026012, 0x497a6014, 0x592c0209, 0x800000c2, - 0x800010c4, 0x80081400, 0x480a6006, 0x0201f800, - 0x00020154, 0x42000800, 0x80000060, 0x0201f000, - 0x000209a3, 0x4933c857, 0x83380480, 0x00000050, - 0x02021800, 0x0010032d, 0x83380480, 0x00000049, - 0x02001800, 0x0010032d, 0x0c01f001, 0x001071b4, - 0x001071bf, 0x001071b2, 0x001071b2, 0x001071b2, - 0x001071b2, 0x001071ca, 0x0201f800, 0x0010032d, - 0x4a026203, 0x00000004, 0x4a025c09, 0x00000002, - 0x592c0208, 0x48025c0a, 0x592c020a, 0x48025a08, - 0x592c000d, 0x4802580e, 0x1c01f000, 0x0201f800, - 0x0010603d, 0x0201f800, 0x0010889a, 0x04000005, - 0x4a025a07, 0x00000006, 0x0201f800, 0x000203ab, - 0x0201f000, 0x00020a10, 0x0201f800, 0x0010603d, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010df61, - 0x5c027800, 0x42003000, 0x00000014, 0x41782800, - 0x42002000, 0x00000002, 0x4d400000, 0x4d440000, - 0x59368c03, 0x42028000, 0x00000029, 0x0201f800, - 0x00109131, 0x5c028800, 0x5c028000, 0x42000000, - 0x0010bc1d, 0x0201f800, 0x0010ad1d, 0x0201f800, - 0x0010889a, 0x02000000, 0x00020a10, 0x4a025a07, - 0x00000029, 0x0201f800, 0x000203ab, 0x0201f000, - 0x00020a10, 0x4933c857, 0x83380580, 0x00000048, - 0x04000005, 0x83380580, 0x00000053, 0x02020800, - 0x0010032d, 0x592c0207, 0x82000580, 0x00000007, - 0x04000009, 0x59300012, 0x80000540, 0x04000006, - 0x592c080d, 0x80040480, 0x4802580d, 0x4a025a07, - 0x00000015, 0x592c0207, 0x80000540, 0x04020003, - 0x4a025a07, 0x00000000, 0x0201f800, 0x000203ab, - 0x0201f000, 0x00020a10, 0x4933c857, 0x4d2c0000, - 0x4c500000, 0x4c540000, 0x4c580000, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x4c100000, 0x0201f800, - 0x0010056f, 0x02000800, 0x0010032d, 0x497a5a07, - 0x59a8006c, 0x82000500, 0x0000f000, 0x48025c08, - 0x59a8085a, 0x82040c00, 0x00000018, 0x48065a08, - 0x412cb800, 0x4d2c0000, 0x41cca000, 0x4200c000, - 0x00000001, 0x4200c800, 0x0000002c, 0x82040480, - 0x0000002d, 0x04021006, 0x832cac00, 0x0000000a, - 0x0201f800, 0x00108413, 0x0401f030, 0x40043000, - 0x42000800, 0x0000002c, 0x832cac00, 0x0000000a, - 0x0201f800, 0x00108413, 0x82183480, 0x0000002c, - 0x4c180000, 0x0201f800, 0x0010056f, 0x5c003000, - 0x0400001a, 0x8060c000, 0x4a025805, 0x00000110, - 0x492cb801, 0x82180c80, 0x0000003d, 0x04021007, - 0x40180800, 0x832cac00, 0x00000006, 0x0201f800, - 0x00108413, 0x0401f015, 0x8264cc00, 0x0000003c, - 0x82183480, 0x0000003c, 0x42000800, 0x0000003c, - 0x412cb800, 0x832cac00, 0x00000006, 0x0201f800, - 0x00108413, 0x0401f7e3, 0x5c025800, 0x592c0207, - 0x8400055e, 0x48025a07, 0x592c0408, 0x80640540, - 0x48025c08, 0x0401f002, 0x5c025800, 0x5c002000, - 0x813669c0, 0x04000003, 0x59343403, 0x0401f003, - 0x42003000, 0x0000ffff, 0x49325809, 0x481a5c07, - 0x82100580, 0x00000054, 0x04020013, 0x4a025809, - 0xffffffff, 0x491e5814, 0x41781000, 0x831c0580, - 0xffffffff, 0x0400000b, 0x591c0009, 0x80000d40, - 0x04000008, 0x58040205, 0x82000500, 0x000000ff, - 0x82000580, 0x00000012, 0x04020002, 0x58041006, - 0x480a5806, 0x846001c0, 0x80100540, 0x48025805, - 0x592c0001, 0x497a5801, 0x4c000000, 0x0201f800, - 0x000203ab, 0x5c025800, 0x812e59c0, 0x040207f9, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, - 0x0201f800, 0x0010a3e5, 0x0401f7f6, 0x4803c856, - 0x4c5c0000, 0x4d2c0000, 0x4c500000, 0x4c540000, - 0x4c580000, 0x412cb800, 0x592c040c, 0x8c000516, - 0x04000003, 0x41cca000, 0x0401f003, 0x83cca400, - 0x00000006, 0x4008b000, 0x41781000, 0x82580480, - 0x0000004c, 0x04001004, 0x4200b000, 0x0000004c, - 0x40001000, 0x4c080000, 0x4d2c0000, 0x0201f800, - 0x0010056f, 0x04000026, 0x5c001800, 0x492c1801, - 0x485a5800, 0x8258b400, 0x00000003, 0x8058b104, - 0x832cac00, 0x00000002, 0x0201f800, 0x0010ae19, - 0x585c040c, 0x8c000500, 0x0400000e, 0x832c1400, - 0x00000002, 0x8c000516, 0x04000003, 0x82081400, - 0x00000006, 0x46001000, 0x00000001, 0x80081000, - 0x46001000, 0x00000900, 0x84000500, 0x4800bc0c, - 0x5c001000, 0x800811c0, 0x040207d7, 0x82000540, - 0x00000001, 0x5c00b000, 0x5c00a800, 0x5c00a000, - 0x5c025800, 0x5c00b800, 0x1c01f000, 0x5c025800, - 0x5c001000, 0x0401f7f8, 0x4933c857, 0x83380d80, - 0x00000015, 0x04020003, 0x0201f000, 0x00020a10, - 0x83380d80, 0x00000016, 0x02020800, 0x0010032d, - 0x0201f000, 0x00020a10, 0x4933c857, 0x4d2c0000, - 0x4c500000, 0x4c540000, 0x4c580000, 0x59325809, - 0x83cca400, 0x00000006, 0x59cc1806, 0x820c0580, - 0x01000000, 0x04020004, 0x4200b000, 0x00000002, - 0x0401f00f, 0x4200b000, 0x00000008, 0x832cac00, - 0x00000006, 0x0201f800, 0x0010adef, 0x8c0c1d00, - 0x0400000b, 0x4200b000, 0x00000008, 0x592e5801, - 0x812e59c0, 0x02000800, 0x0010032d, 0x832cac00, - 0x00000006, 0x0201f800, 0x0010adef, 0x0401f816, - 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x4c500000, 0x4c540000, - 0x4c580000, 0x83cca400, 0x00000006, 0x5930a809, - 0x8254ac00, 0x00000006, 0x4200b000, 0x00000007, - 0x0201f800, 0x0010adef, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x4933c857, 0x0201f800, 0x0010889a, - 0x02000000, 0x00020a10, 0x4d2c0000, 0x0201f800, - 0x00108e64, 0x0402000b, 0x41780800, 0x4d400000, - 0x42028000, 0x00000000, 0x0201f800, 0x00108cff, - 0x5c028000, 0x5c025800, 0x0201f000, 0x00020a10, - 0x5931d822, 0x58ef400a, 0x58ee580c, 0x4a025a05, - 0x00000103, 0x58ec0008, 0x0801f800, 0x5c025800, - 0x0201f000, 0x00020a10, 0x4933c857, 0x59cc1806, - 0x820c0580, 0x02000000, 0x04020020, 0x4a026802, - 0x00fffffd, 0x5934000a, 0x84000504, 0x4802680a, - 0x59300c1e, 0x82040580, 0x00000021, 0x04020009, - 0x42001800, 0x0000ffff, 0x42002000, 0x00000004, - 0x42003000, 0x00000012, 0x0201f800, 0x00103260, - 0x59300809, 0x800409c0, 0x02000000, 0x00020a10, - 0x4a000a05, 0x00000103, 0x480c0806, 0x5931d822, - 0x58ef400a, 0x58ee580c, 0x58ec0008, 0x0801f800, - 0x0201f000, 0x00020a10, 0x42000000, 0x0010bc26, - 0x0201f800, 0x0010ad1d, 0x4c0c0000, 0x0401f804, - 0x5c001800, 0x040207eb, 0x1c01f000, 0x4933c857, - 0x4d2c0000, 0x59325809, 0x812e59c0, 0x04020009, - 0x497a6006, 0x497a6205, 0x4d380000, 0x42027000, - 0x00000022, 0x0401fbab, 0x5c027000, 0x80000580, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, - 0x4c500000, 0x4c540000, 0x4c580000, 0x59325809, - 0x592e5801, 0x832cac00, 0x00000006, 0x83cca400, - 0x00000006, 0x59a8086c, 0x82040d00, 0x000003ff, - 0x82041480, 0x0000000f, 0x0400101b, 0x4200b000, - 0x0000000f, 0x0201f800, 0x0010adef, 0x592e5801, - 0x832cac00, 0x00000006, 0x82080c80, 0x0000000f, - 0x0400100d, 0x4200b000, 0x0000000f, 0x0201f800, - 0x0010adef, 0x592e5801, 0x832cac00, 0x00000006, - 0x82041480, 0x0000000f, 0x04001007, 0x42001000, - 0x0000000f, 0x4008b000, 0x0201f800, 0x0010adef, - 0x0401f004, 0x4004b000, 0x0201f800, 0x0010adef, - 0x5931d822, 0x58ef400a, 0x58ee580c, 0x4a025a05, - 0x00000103, 0x592e5801, 0x58ec0008, 0x0801f800, - 0x0201f800, 0x00020a10, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, - 0x59cc0006, 0x82000d80, 0x01000000, 0x0400002d, - 0x59cc0007, 0x9000b1c0, 0x8258b500, 0x000000ff, - 0x8058b104, 0x8258b400, 0x00000002, 0x82580c80, - 0x00000007, 0x04001003, 0x4200b000, 0x00000006, - 0x83cca400, 0x00000006, 0x59301009, 0x800811c0, - 0x02000800, 0x0010032d, 0x8208ac00, 0x00000006, - 0x0201f800, 0x0010adef, 0x82000d00, 0xff000000, - 0x800409c0, 0x0400001a, 0x8200b500, 0x000000ff, - 0x04000017, 0x8058b104, 0x82580c80, 0x0000000e, - 0x04001003, 0x4200b000, 0x0000000d, 0x58081001, - 0x800811c0, 0x02000800, 0x0010032d, 0x8208ac00, - 0x00000006, 0x0201f800, 0x0010adef, 0x0401f008, - 0x59301009, 0x800811c0, 0x02000800, 0x0010032d, - 0x48001006, 0x59cc0007, 0x48001007, 0x0401ff2e, - 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x42000800, 0x00000000, - 0x59cc0006, 0x82000580, 0x02000000, 0x04000003, - 0x42000800, 0x00000001, 0x4d2c0000, 0x59325809, - 0x812e59c0, 0x02000800, 0x0010032d, 0x48065a07, - 0x0201f800, 0x000203ab, 0x5c025800, 0x0201f000, + 0x0c01f001, 0x001071fb, 0x00108352, 0x001071fb, + 0x001071fb, 0x001071fb, 0x001071fb, 0x001071fb, + 0x001071fb, 0x001082ee, 0x0010837c, 0x001083f2, + 0x0010837c, 0x001083f2, 0x001071fb, 0x0201f800, + 0x0010032d, 0x0201f800, 0x0010032d, 0x4933c857, + 0x4d2c0000, 0x59325809, 0x59300203, 0x82003480, + 0x0000000e, 0x02021800, 0x0010032d, 0x0c01f803, + 0x5c025800, 0x1c01f000, 0x00107218, 0x00107218, + 0x00107218, 0x00107234, 0x00107280, 0x00107218, + 0x00107218, 0x00107218, 0x0010721a, 0x00107218, + 0x00107218, 0x00107218, 0x00107218, 0x00107218, + 0x0201f800, 0x0010032d, 0x4933c857, 0x83380580, + 0x00000040, 0x02020800, 0x0010032d, 0x4a026008, + 0x00082000, 0x4a026203, 0x00000003, 0x493a6403, + 0x4a025c09, 0x00000001, 0x592c000e, 0x48026012, + 0x497a6014, 0x592c0209, 0x800000c2, 0x800010c4, + 0x80081400, 0x480a6006, 0x0201f800, 0x00020154, + 0x42000800, 0x80000060, 0x0201f000, 0x000209a3, + 0x4933c857, 0x83380480, 0x00000050, 0x02021800, + 0x0010032d, 0x83380480, 0x00000049, 0x02001800, + 0x0010032d, 0x0c01f001, 0x00107247, 0x00107252, + 0x00107245, 0x00107245, 0x00107245, 0x00107245, + 0x0010725d, 0x0201f800, 0x0010032d, 0x4a026203, + 0x00000004, 0x4a025c09, 0x00000002, 0x592c0208, + 0x48025c0a, 0x592c020a, 0x48025a08, 0x592c000d, + 0x4802580e, 0x1c01f000, 0x0201f800, 0x001060e2, + 0x0201f800, 0x00108953, 0x04000005, 0x4a025a07, + 0x00000006, 0x0201f800, 0x000203ab, 0x0201f000, + 0x00020a10, 0x0201f800, 0x001060e2, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010e06f, 0x5c027800, + 0x42003000, 0x00000014, 0x41782800, 0x42002000, + 0x00000002, 0x4d400000, 0x4d440000, 0x59368c03, + 0x42028000, 0x00000029, 0x0201f800, 0x001091ea, + 0x5c028800, 0x5c028000, 0x42000000, 0x0010bd1d, + 0x0201f800, 0x0010ae10, 0x0201f800, 0x00108953, + 0x02000000, 0x00020a10, 0x4a025a07, 0x00000029, + 0x0201f800, 0x000203ab, 0x0201f000, 0x00020a10, + 0x4933c857, 0x83380580, 0x00000048, 0x04000005, + 0x83380580, 0x00000053, 0x02020800, 0x0010032d, + 0x592c0207, 0x82000580, 0x00000007, 0x04000009, + 0x59300012, 0x80000540, 0x04000006, 0x592c080d, + 0x80040480, 0x4802580d, 0x4a025a07, 0x00000015, + 0x592c0207, 0x80000540, 0x04020003, 0x4a025a07, + 0x00000000, 0x0201f800, 0x000203ab, 0x0201f000, 0x00020a10, 0x4933c857, 0x4d2c0000, 0x4c500000, - 0x4c540000, 0x4c580000, 0x4200b000, 0x00000002, - 0x59cc0806, 0x82040580, 0x01000000, 0x04000004, - 0x8204b500, 0x0000ffff, 0x8058b104, 0x83cca400, - 0x00000006, 0x59300009, 0x8200ac00, 0x00000006, - 0x0201f800, 0x0010adef, 0x0401feff, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x4803c857, 0x4807c857, 0x480bc857, - 0x480fc857, 0x4813c857, 0x481bc857, 0x492fc857, - 0x4d2c0000, 0x4c000000, 0x0201f800, 0x0010055a, - 0x5c000000, 0x0400000f, 0x48025803, 0x481a5801, - 0x48125808, 0x48065805, 0x480a5806, 0x480e5807, - 0x5c001000, 0x4c080000, 0x480a5809, 0x412c1000, - 0x0201f800, 0x00020016, 0x82000540, 0x00000001, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x4937c857, - 0x4d1c0000, 0x0201f800, 0x00105713, 0x04020025, - 0x59cc0001, 0x82000500, 0x00ffffff, 0x59341002, - 0x82081500, 0x00ffffff, 0x80080580, 0x0402001d, - 0x497a6205, 0x42000800, 0x00000035, 0x0201f800, - 0x00108c7b, 0x04020012, 0x591c001d, 0x800001c0, - 0x0400000f, 0x497a381d, 0x591c0415, 0x8c000502, - 0x02000800, 0x0010032d, 0x84000502, 0x48023c15, - 0x591c1407, 0x82080580, 0x00000003, 0x04000006, - 0x82080580, 0x00000006, 0x04000005, 0x0401fc52, - 0x0401f004, 0x0401f805, 0x0401f002, 0x0401f8d2, - 0x5c023800, 0x1c01f000, 0x4d2c0000, 0x591e5809, - 0x4933c857, 0x491fc857, 0x493bc857, 0x492fc857, - 0x83380580, 0x00000015, 0x040000c5, 0x83380580, - 0x00000016, 0x040200c0, 0x4d300000, 0x411e6000, - 0x59cc0207, 0x4803c857, 0x82000d00, 0x0000ff00, - 0x82040580, 0x00001700, 0x04000004, 0x82040580, - 0x00000300, 0x04020063, 0x591c0203, 0x4803c857, - 0x82000580, 0x0000000d, 0x04000044, 0x812e59c0, - 0x040000ac, 0x591c0202, 0x4803c857, 0x82000580, - 0x0000ffff, 0x0402008f, 0x592c020b, 0x4803c857, - 0x82000500, 0x00000003, 0x82000580, 0x00000002, - 0x04020007, 0x592c0810, 0x591c0012, 0x4803c857, - 0x4807c857, 0x80040580, 0x04020082, 0x591c0415, - 0x4803c857, 0x8c000500, 0x0402007e, 0x42000000, - 0x0010bc03, 0x0201f800, 0x0010ad1d, 0x41780800, - 0x591c1006, 0x42000000, 0x0000000a, 0x0201f800, - 0x00105f69, 0x592c0407, 0x4803c857, 0x800001c0, - 0x0400000c, 0x80080c80, 0x04001004, 0x02020800, - 0x0010032d, 0x80001040, 0x480a5c07, 0x800811c0, - 0x04020004, 0x0201f800, 0x0010e95c, 0x0401f079, - 0x0201f800, 0x0010899c, 0x591c0818, 0x591c0019, - 0x48065809, 0x4802580a, 0x59300008, 0x8c000500, - 0x02020800, 0x00100bd4, 0x497a3809, 0x0201f800, - 0x0002029a, 0x04020057, 0x411e6000, 0x0201f800, - 0x001070b5, 0x0401f067, 0x0401fc2b, 0x04000016, - 0x591c0006, 0x48026006, 0x4936600a, 0x4a026407, - 0x00000003, 0x492e6009, 0x591c0818, 0x591c1019, - 0x48066018, 0x480a6019, 0x4d380000, 0x591e7403, - 0x4d300000, 0x411e6000, 0x0201f800, 0x001070b5, - 0x5c026000, 0x0201f800, 0x00020a34, 0x5c027000, - 0x0401f050, 0x59a8002c, 0x48023a05, 0x0401f04d, - 0x59cc0407, 0x82000580, 0x0000000b, 0x0402002e, - 0x59340a00, 0x84040d0e, 0x48066a00, 0x592c0a05, - 0x82040d00, 0x000000ff, 0x82040d80, 0x00000014, - 0x04000003, 0x4a02621e, 0x00000003, 0x59300008, - 0x8c000500, 0x02020800, 0x00100bd4, 0x4d400000, - 0x497a5c0a, 0x42028000, 0x00000003, 0x592c0a09, - 0x0201f800, 0x00104504, 0x0201f800, 0x0010ae30, - 0x04020009, 0x0201f800, 0x000203ab, 0x59300a1e, - 0x82040d80, 0x00000003, 0x02000800, 0x0010899c, - 0x497a6009, 0x5c028000, 0x4a026403, 0x00000085, - 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, - 0x42000800, 0x8000404b, 0x0201f800, 0x000209b1, - 0x0401f01c, 0x59cc0207, 0x82000580, 0x00002a00, - 0x04020004, 0x59a8002c, 0x48023a05, 0x0401f015, - 0x812e59c0, 0x02000800, 0x0010032d, 0x4a025a05, - 0x00000103, 0x591c0008, 0x8c000500, 0x02020800, - 0x00100bd4, 0x591c0402, 0x48025c07, 0x4a025a07, - 0x00000003, 0x497a5c0a, 0x0201f800, 0x000203ab, - 0x0201f800, 0x001070b5, 0x0201f800, 0x0010410c, - 0x5c026000, 0x0201f800, 0x00020a10, 0x0401f002, - 0x5c026000, 0x5c025800, 0x1c01f000, 0x0401f819, - 0x0401f7fd, 0x4933c857, 0x83380580, 0x00000015, - 0x04020004, 0x59a8002c, 0x48023a05, 0x0401f00d, - 0x83380580, 0x00000016, 0x0402000d, 0x4d300000, - 0x411e6000, 0x0201f800, 0x0010a18b, 0x0201f800, - 0x00020979, 0x0201f800, 0x00020a10, 0x5c026000, - 0x497a381d, 0x0201f800, 0x00020a10, 0x1c01f000, - 0x4c5c0000, 0x591c0415, 0x84000540, 0x48023c15, - 0x59ccb80b, 0x4933c857, 0x491fc857, 0x492fc857, - 0x4803c857, 0x485fc857, 0x8c5cbd3c, 0x04000005, - 0x59a8002c, 0x48023a05, 0x497a381d, 0x0401f057, - 0x4d300000, 0x411e6000, 0x0201f800, 0x0010847b, - 0x5c026000, 0x591c0407, 0x82000580, 0x00000000, - 0x0400004e, 0x591c0403, 0x82000580, 0x00000050, - 0x0402000c, 0x4d300000, 0x411e6000, 0x4a026203, - 0x00000001, 0x42000800, 0x80000043, 0x0201f800, - 0x000209b1, 0x5c026000, 0x497a381d, 0x0401f03f, - 0x591c0203, 0x82000580, 0x0000000d, 0x0400001f, - 0x812e59c0, 0x02000800, 0x0010032d, 0x592c020b, - 0x4803c857, 0x8c000500, 0x0402001f, 0x8c000502, - 0x04000016, 0x591c0415, 0x8c00051c, 0x04020007, - 0x591c0012, 0x4803c857, 0x800001c0, 0x0400000f, - 0x591c0013, 0x48023817, 0x4a023813, 0x0fffffff, - 0x592c0209, 0x8400051e, 0x48025a09, 0x42000000, - 0x0010bc05, 0x0201f800, 0x0010ad1d, 0x4a023a15, - 0x00000001, 0x0401f01a, 0x42000000, 0x0010bc06, - 0x0201f800, 0x0010ad1d, 0x4a023a15, 0x00000007, - 0x0401f013, 0x8c5cbd3a, 0x040207f8, 0x59cc000a, - 0x592c1810, 0x4803c857, 0x480fc857, 0x800c0580, - 0x040007f2, 0x59cc000a, 0x4803c857, 0x48023817, - 0x48023816, 0x42000000, 0x0010bc04, 0x0201f800, - 0x0010ad1d, 0x4a023a15, 0x00000005, 0x5c00b800, - 0x0201f000, 0x00108b01, 0x5c00b800, 0x0201f000, - 0x00020a10, 0x4933c857, 0x4d1c0000, 0x0201f800, - 0x00105713, 0x04020053, 0x59cc0001, 0x59341002, - 0x80080580, 0x82000500, 0x00ffffff, 0x0402004a, - 0x5930141a, 0x0201f800, 0x00108cd8, 0x02000800, - 0x0010032d, 0x591c1407, 0x82080580, 0x00000007, - 0x04000041, 0x82080580, 0x00000002, 0x0400003e, - 0x82080580, 0x00000000, 0x0400003b, 0x591c0202, - 0x82000d80, 0x0000ffff, 0x04000004, 0x59301a1a, - 0x800c0580, 0x04020034, 0x83380580, 0x00000015, - 0x0400002f, 0x4d300000, 0x4d2c0000, 0x411e6000, - 0x59325809, 0x0201f800, 0x0010889a, 0x02000800, - 0x0010032d, 0x592c0205, 0x82000500, 0x000000ff, - 0x82000580, 0x00000014, 0x04000003, 0x4a02621e, - 0x00000003, 0x497a5c0a, 0x42028000, 0x00000003, - 0x592c0a09, 0x0201f800, 0x00104504, 0x0201f800, - 0x0010ae30, 0x04020009, 0x0201f800, 0x000203ab, - 0x59300a1e, 0x82040d80, 0x00000003, 0x02000800, - 0x0010899c, 0x497a6009, 0x5c025800, 0x4a026403, - 0x00000085, 0x4a026203, 0x00000009, 0x4a026407, - 0x00000002, 0x42000800, 0x8000404b, 0x0201f800, - 0x000209b1, 0x5c026000, 0x0401f003, 0x59a8002c, - 0x48023a05, 0x497a381d, 0x0201f800, 0x00020a10, - 0x5c023800, 0x1c01f000, 0x4933c857, 0x4c580000, - 0x4d2c0000, 0x59325809, 0x59342200, 0x82102500, - 0xffffdffd, 0x48126a00, 0x83383580, 0x00000015, - 0x0400000d, 0x0201f800, 0x0010889a, 0x04000064, - 0x0201f800, 0x00108e64, 0x04020005, 0x4200b000, - 0x00000002, 0x0201f800, 0x00108e43, 0x0401fa2a, - 0x0401f07b, 0x83cc1400, 0x00000008, 0x4200b000, - 0x00000002, 0x83341c00, 0x00000006, 0x0201f800, - 0x00107d52, 0x04020014, 0x83cc1400, 0x0000000a, - 0x4200b000, 0x00000002, 0x83341c00, 0x00000008, - 0x0201f800, 0x00107d52, 0x0402000b, 0x0201f800, - 0x00101a67, 0x59342200, 0x59cc1007, 0x800811c0, - 0x04000003, 0x480a6801, 0x84102542, 0x48126a00, - 0x0401f062, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010df61, 0x5c027800, 0x42000000, 0x0010bc1d, - 0x0201f800, 0x0010ad1d, 0x59340200, 0x84000558, - 0x48026a00, 0x4d300000, 0x0201f800, 0x001070f5, - 0x02000800, 0x0010032d, 0x4936600a, 0x497a6009, - 0x4a026407, 0x00000001, 0x4a026403, 0x00000001, - 0x42003000, 0x00000003, 0x0201f800, 0x0010a4ae, - 0x8d0e1d20, 0x04000011, 0x41782800, 0x42003000, - 0x00000001, 0x4d400000, 0x42028000, 0x00000029, - 0x0201f800, 0x00109f37, 0x5c028000, 0x4a026407, - 0x00000004, 0x4a026203, 0x00000007, 0x4a026421, - 0x00000001, 0x0401f009, 0x4a026203, 0x00000001, - 0x42000800, 0x0000000b, 0x0201f800, 0x00103d8a, - 0x0201f800, 0x00105fe8, 0x5c026000, 0x0201f800, - 0x0010889a, 0x04000026, 0x0201f800, 0x00108e64, - 0x04020026, 0x0401f9d0, 0x0401f021, 0x42000000, - 0x0010bc20, 0x0201f800, 0x0010ad1d, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010df61, 0x42000000, - 0x0010bc1d, 0x0201f800, 0x0010ad1d, 0x59340200, - 0x84000558, 0x48026a00, 0x42003000, 0x00000003, - 0x41782800, 0x42002000, 0x00000005, 0x4d400000, - 0x4d440000, 0x59368c03, 0x42028000, 0x00000029, - 0x0201f800, 0x00109131, 0x5c028800, 0x5c028000, - 0x5c027800, 0x0201f800, 0x00101a67, 0x0201f800, - 0x00020a10, 0x0401f002, 0x0401fc73, 0x5c025800, - 0x5c00b000, 0x1c01f000, 0x4933c857, 0x41380000, - 0x83383480, 0x00000058, 0x02021800, 0x0010032d, - 0x0c01f001, 0x00107718, 0x00107713, 0x00107718, - 0x00107718, 0x00107718, 0x00107718, 0x00107711, - 0x00107711, 0x00107711, 0x00107711, 0x00107711, - 0x00107711, 0x00107711, 0x00107711, 0x00107711, - 0x00107711, 0x00107711, 0x00107711, 0x00107711, - 0x00107711, 0x00107711, 0x00107711, 0x00107711, - 0x00107711, 0x00107711, 0x00107711, 0x00107711, - 0x00107711, 0x00107711, 0x00107711, 0x00107711, - 0x00107718, 0x00107711, 0x00107718, 0x00107718, - 0x00107711, 0x00107711, 0x00107711, 0x00107711, - 0x00107711, 0x00107718, 0x00107711, 0x00107711, - 0x00107711, 0x00107711, 0x00107711, 0x00107711, - 0x00107711, 0x00107711, 0x00107711, 0x00107718, - 0x00107718, 0x00107711, 0x00107711, 0x00107711, - 0x00107711, 0x00107711, 0x00107711, 0x00107711, - 0x00107711, 0x00107711, 0x00107718, 0x00107711, - 0x00107711, 0x00107718, 0x00107718, 0x00107711, - 0x00107718, 0x00107718, 0x00107711, 0x00107711, - 0x00107711, 0x00107711, 0x00107718, 0x00107711, - 0x00107711, 0x00107711, 0x00107718, 0x00107711, - 0x00107711, 0x00107711, 0x00107718, 0x00107711, - 0x00107711, 0x00107711, 0x00107718, 0x00107711, - 0x00107718, 0x00107711, 0x00107711, 0x00107711, - 0x00107711, 0x00107711, 0x00107711, 0x00107711, - 0x00107711, 0x0201f800, 0x0010032d, 0x4a026203, - 0x00000001, 0x493a6403, 0x0201f000, 0x00105fe8, - 0x4933c857, 0x4a026203, 0x00000001, 0x493a6403, - 0x0201f000, 0x00105fe8, 0x59300403, 0x82003480, - 0x00000058, 0x02021800, 0x0010032d, 0x83383580, - 0x00000013, 0x04000099, 0x83383580, 0x00000027, - 0x0402004e, 0x4933c857, 0x0201f800, 0x0010605d, - 0x0201f800, 0x0010a591, 0x0201f800, 0x001089af, - 0x0400000b, 0x0201f800, 0x001089ca, 0x04000041, - 0x59300403, 0x82000d80, 0x00000022, 0x04020038, - 0x0401fc2b, 0x0400003a, 0x0401f03a, 0x0201f800, - 0x00101a67, 0x42000800, 0x00000007, 0x0201f800, - 0x00103d8a, 0x0401f910, 0x4d440000, 0x59368c03, - 0x83440580, 0x000007fe, 0x04020008, 0x59a8121b, - 0x84081540, 0x0201f800, 0x00104716, 0x04020002, - 0x8408154a, 0x480b521b, 0x42028000, 0x00000029, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010df61, - 0x5c027800, 0x836c0580, 0x00000003, 0x0400000c, - 0x5932680a, 0x59340008, 0x800001c0, 0x04020008, - 0x59368c03, 0x4933c857, 0x4937c857, 0x4947c857, - 0x0201f800, 0x00103e2c, 0x0401f00c, 0x42000000, - 0x0010bc1d, 0x0201f800, 0x0010ad1d, 0x42003000, - 0x00000015, 0x41782800, 0x42002000, 0x00000003, - 0x0201f800, 0x00109131, 0x5c028800, 0x0201f800, - 0x00108bdb, 0x0201f000, 0x00020a10, 0x1c01f000, - 0x0401f8dd, 0x0401f7fa, 0x83380580, 0x00000014, - 0x0400000c, 0x4933c857, 0x0201f800, 0x0010644d, - 0x02020000, 0x00107134, 0x59300203, 0x82000580, - 0x00000002, 0x04000102, 0x0201f800, 0x0010032d, - 0x4933c857, 0x0201f800, 0x0010605d, 0x0201f800, - 0x0010a591, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010df61, 0x5c027800, 0x42003000, 0x00000016, - 0x41782800, 0x4d400000, 0x4d440000, 0x59368c03, - 0x42002000, 0x00000009, 0x42028000, 0x00000029, - 0x0201f800, 0x00109131, 0x5c028800, 0x5c028000, - 0x42000000, 0x0010bc1d, 0x0201f800, 0x0010ad1d, - 0x0201f800, 0x001089af, 0x0402000c, 0x0201f800, - 0x00101a67, 0x0401f8ac, 0x59340c03, 0x82040580, - 0x000007fe, 0x040207c6, 0x59a80a1b, 0x84040d40, - 0x4807521b, 0x0401f7c2, 0x0201f800, 0x001089ca, - 0x04020003, 0x0401f8a0, 0x0401f7bd, 0x59300403, - 0x82000d80, 0x00000032, 0x04020004, 0x0201f800, - 0x00101cfd, 0x0401f7b6, 0x82000d80, 0x00000022, - 0x04000895, 0x0401f7b2, 0x4933c857, 0x4803c857, - 0x0c01f001, 0x0010782a, 0x0010782a, 0x0010782a, - 0x0010782a, 0x0010782a, 0x0010782a, 0x00107821, - 0x00107821, 0x00107821, 0x00107821, 0x00107821, - 0x00107821, 0x00107821, 0x00107821, 0x00107821, - 0x00107821, 0x00107821, 0x00107821, 0x00107821, - 0x00107821, 0x00107821, 0x00107821, 0x00107821, - 0x00107821, 0x00107821, 0x00107821, 0x00107821, - 0x00107821, 0x00107821, 0x00107821, 0x0010782e, - 0x0010784b, 0x00107821, 0x0010784b, 0x0010784b, - 0x00107821, 0x00107821, 0x00107821, 0x00107821, - 0x00107821, 0x0010784b, 0x0010784b, 0x00107821, - 0x00107821, 0x00107821, 0x00107821, 0x00107821, - 0x00107821, 0x00107821, 0x00107821, 0x0010783c, - 0x0010784b, 0x00107821, 0x00107835, 0x00107821, - 0x00107821, 0x00107821, 0x00107835, 0x00107821, - 0x00107821, 0x00107821, 0x0010784b, 0x00107838, - 0x00107821, 0x00107823, 0x0010784b, 0x00107821, - 0x0010784b, 0x0010784b, 0x00107821, 0x00107821, - 0x00107821, 0x00107821, 0x0010784b, 0x00107821, - 0x00107821, 0x00107821, 0x0010784b, 0x00107821, - 0x00107821, 0x00107821, 0x0010784b, 0x00107821, - 0x00107821, 0x00107821, 0x0010784b, 0x00107821, - 0x0010784b, 0x00107821, 0x00107821, 0x00107821, - 0x00107821, 0x00107821, 0x00107821, 0x00107821, - 0x00107821, 0x0201f800, 0x0010032d, 0x4d2c0000, - 0x59325809, 0x0201f800, 0x000203ab, 0x5c025800, - 0x0201f000, 0x00020a10, 0x4a026203, 0x00000002, - 0x0201f000, 0x00108a4d, 0x4a026203, 0x00000005, - 0x59a8002c, 0x48026205, 0x59a8002a, 0x48026006, - 0x1c01f000, 0x5930081f, 0x49780a05, 0x0401f014, - 0x0201f800, 0x00108bdb, 0x0201f000, 0x00020a10, - 0x0201f800, 0x00101cfd, 0x0201f800, 0x0010610d, - 0x04000005, 0x0201f800, 0x0010605d, 0x0201f000, - 0x00020a10, 0x0201f800, 0x0010605d, 0x0201f800, - 0x00020a10, 0x0201f000, 0x001060fa, 0x4933c857, - 0x4a026203, 0x00000002, 0x59a8002a, 0x48026006, - 0x1c01f000, 0x4933c857, 0x0201f800, 0x0010889a, - 0x0400002e, 0x4d2c0000, 0x0201f800, 0x00108e64, - 0x0402000a, 0x4d400000, 0x42028000, 0x00000031, - 0x42000800, 0x00000004, 0x0201f800, 0x00108cff, - 0x5c028000, 0x0401f020, 0x59300c07, 0x82040580, - 0x00000010, 0x04000004, 0x82040580, 0x00000011, - 0x0402000a, 0x4a025a07, 0x00000031, 0x4a02580e, - 0x00000004, 0x4a02580f, 0x000000ff, 0x0201f800, - 0x000203ab, 0x0401f010, 0x592c0405, 0x8c00051e, - 0x0400000d, 0x4a025a05, 0x00000103, 0x4a025806, - 0x01000000, 0x4da00000, 0x4cec0000, 0x5931d822, - 0x58ef400a, 0x58ec0008, 0x0801f800, 0x5c01d800, - 0x5c034000, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x4c540000, 0x4c580000, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4c100000, 0x0201f800, 0x0010056f, + 0x02000800, 0x0010032d, 0x497a5a07, 0x59a8006c, + 0x82000500, 0x0000f000, 0x48025c08, 0x59a8085a, + 0x82040c00, 0x00000018, 0x48065a08, 0x412cb800, + 0x4d2c0000, 0x41cca000, 0x4200c000, 0x00000001, + 0x4200c800, 0x0000002c, 0x82040480, 0x0000002d, + 0x04021006, 0x832cac00, 0x0000000a, 0x0201f800, + 0x001084c8, 0x0401f030, 0x40043000, 0x42000800, + 0x0000002c, 0x832cac00, 0x0000000a, 0x0201f800, + 0x001084c8, 0x82183480, 0x0000002c, 0x4c180000, + 0x0201f800, 0x0010056f, 0x5c003000, 0x0400001a, + 0x8060c000, 0x4a025805, 0x00000110, 0x492cb801, + 0x82180c80, 0x0000003d, 0x04021007, 0x40180800, + 0x832cac00, 0x00000006, 0x0201f800, 0x001084c8, + 0x0401f015, 0x8264cc00, 0x0000003c, 0x82183480, + 0x0000003c, 0x42000800, 0x0000003c, 0x412cb800, + 0x832cac00, 0x00000006, 0x0201f800, 0x001084c8, + 0x0401f7e3, 0x5c025800, 0x592c0207, 0x8400055e, + 0x48025a07, 0x592c0408, 0x80640540, 0x48025c08, + 0x0401f002, 0x5c025800, 0x5c002000, 0x813669c0, + 0x04000003, 0x59343403, 0x0401f003, 0x42003000, + 0x0000ffff, 0x49325809, 0x481a5c07, 0x82100580, + 0x00000054, 0x04020013, 0x4a025809, 0xffffffff, + 0x491e5814, 0x41781000, 0x831c0580, 0xffffffff, + 0x0400000b, 0x591c0009, 0x80000d40, 0x04000008, + 0x58040205, 0x82000500, 0x000000ff, 0x82000580, + 0x00000012, 0x04020002, 0x58041006, 0x480a5806, + 0x846001c0, 0x80100540, 0x48025805, 0x0201f800, + 0x0010af31, 0x04020011, 0x592c0001, 0x497a5801, + 0x4c000000, 0x0201f800, 0x000203ab, 0x5c025800, + 0x812e59c0, 0x040207f6, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x0201f800, 0x0010a4d8, + 0x0401f7f6, 0x4803c856, 0x4c5c0000, 0x4d2c0000, + 0x4c500000, 0x4c540000, 0x4c580000, 0x412cb800, + 0x592c040c, 0x8c000516, 0x04000003, 0x41cca000, + 0x0401f003, 0x83cca400, 0x00000006, 0x4008b000, + 0x41781000, 0x82580480, 0x0000004c, 0x04001004, + 0x4200b000, 0x0000004c, 0x40001000, 0x4c080000, + 0x4d2c0000, 0x0201f800, 0x0010056f, 0x04000026, + 0x5c001800, 0x492c1801, 0x485a5800, 0x8258b400, + 0x00000003, 0x8058b104, 0x832cac00, 0x00000002, + 0x0201f800, 0x0010af0c, 0x585c040c, 0x8c000500, + 0x0400000e, 0x832c1400, 0x00000002, 0x8c000516, + 0x04000003, 0x82081400, 0x00000006, 0x46001000, + 0x00000001, 0x80081000, 0x46001000, 0x00000900, + 0x84000500, 0x4800bc0c, 0x5c001000, 0x800811c0, + 0x040207d7, 0x82000540, 0x00000001, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x5c025800, 0x5c00b800, + 0x1c01f000, 0x5c025800, 0x5c001000, 0x0401f7f8, + 0x4933c857, 0x83380d80, 0x00000015, 0x04020003, + 0x0201f000, 0x00020a10, 0x83380d80, 0x00000016, + 0x02020800, 0x0010032d, 0x0201f000, 0x00020a10, + 0x4933c857, 0x4d2c0000, 0x4c500000, 0x4c540000, + 0x4c580000, 0x59325809, 0x83cca400, 0x00000006, + 0x59cc1806, 0x820c0580, 0x01000000, 0x04020004, + 0x4200b000, 0x00000002, 0x0401f00f, 0x4200b000, + 0x00000008, 0x832cac00, 0x00000006, 0x0201f800, + 0x0010aee2, 0x8c0c1d00, 0x0400000b, 0x4200b000, + 0x00000008, 0x592e5801, 0x812e59c0, 0x02000800, + 0x0010032d, 0x832cac00, 0x00000006, 0x0201f800, + 0x0010aee2, 0x0401f816, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x4c500000, 0x4c540000, 0x4c580000, 0x83cca400, + 0x00000006, 0x5930a809, 0x8254ac00, 0x00000006, + 0x4200b000, 0x00000007, 0x0201f800, 0x0010aee2, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x4933c857, + 0x0201f800, 0x00108953, 0x02000000, 0x00020a10, + 0x4d2c0000, 0x0201f800, 0x00108f1d, 0x0402000b, + 0x41780800, 0x4d400000, 0x42028000, 0x00000000, + 0x0201f800, 0x00108db8, 0x5c028000, 0x5c025800, + 0x0201f000, 0x00020a10, 0x5931d822, 0x58ef400a, + 0x58ee580c, 0x4a025a05, 0x00000103, 0x58ec0008, + 0x0801f800, 0x5c025800, 0x0201f000, 0x00020a10, + 0x4933c857, 0x59cc1806, 0x820c0580, 0x02000000, + 0x04020020, 0x4a026802, 0x00fffffd, 0x5934000a, + 0x84000504, 0x4802680a, 0x59300c1e, 0x82040580, + 0x00000021, 0x04020009, 0x42001800, 0x0000ffff, + 0x42002000, 0x00000004, 0x42003000, 0x00000012, + 0x0201f800, 0x0010326a, 0x59300809, 0x800409c0, + 0x02000000, 0x00020a10, 0x4a000a05, 0x00000103, + 0x480c0806, 0x5931d822, 0x58ef400a, 0x58ee580c, + 0x58ec0008, 0x0801f800, 0x0201f000, 0x00020a10, + 0x42000000, 0x0010bd26, 0x0201f800, 0x0010ae10, + 0x4c0c0000, 0x0401f804, 0x5c001800, 0x040207eb, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x59325809, + 0x812e59c0, 0x04020009, 0x497a6006, 0x497a6205, + 0x4d380000, 0x42027000, 0x00000022, 0x0401fbab, + 0x5c027000, 0x80000580, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x4d2c0000, 0x4c500000, 0x4c540000, + 0x4c580000, 0x59325809, 0x592e5801, 0x832cac00, + 0x00000006, 0x83cca400, 0x00000006, 0x59a8086c, + 0x82040d00, 0x000003ff, 0x82041480, 0x0000000f, + 0x0400101b, 0x4200b000, 0x0000000f, 0x0201f800, + 0x0010aee2, 0x592e5801, 0x832cac00, 0x00000006, + 0x82080c80, 0x0000000f, 0x0400100d, 0x4200b000, + 0x0000000f, 0x0201f800, 0x0010aee2, 0x592e5801, + 0x832cac00, 0x00000006, 0x82041480, 0x0000000f, + 0x04001007, 0x42001000, 0x0000000f, 0x4008b000, + 0x0201f800, 0x0010aee2, 0x0401f004, 0x4004b000, + 0x0201f800, 0x0010aee2, 0x5931d822, 0x58ef400a, + 0x58ee580c, 0x4a025a05, 0x00000103, 0x592e5801, + 0x58ec0008, 0x0801f800, 0x0201f800, 0x00020a10, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c500000, + 0x4c540000, 0x4c580000, 0x59cc0006, 0x82000d80, + 0x01000000, 0x0400002d, 0x59cc0007, 0x9000b1c0, + 0x8258b500, 0x000000ff, 0x8058b104, 0x8258b400, + 0x00000002, 0x82580c80, 0x00000007, 0x04001003, + 0x4200b000, 0x00000006, 0x83cca400, 0x00000006, + 0x59301009, 0x800811c0, 0x02000800, 0x0010032d, + 0x8208ac00, 0x00000006, 0x0201f800, 0x0010aee2, + 0x82000d00, 0xff000000, 0x800409c0, 0x0400001a, + 0x8200b500, 0x000000ff, 0x04000017, 0x8058b104, + 0x82580c80, 0x0000000e, 0x04001003, 0x4200b000, + 0x0000000d, 0x58081001, 0x800811c0, 0x02000800, + 0x0010032d, 0x8208ac00, 0x00000006, 0x0201f800, + 0x0010aee2, 0x0401f008, 0x59301009, 0x800811c0, + 0x02000800, 0x0010032d, 0x48001006, 0x59cc0007, + 0x48001007, 0x0401ff2e, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x42000800, 0x00000000, 0x59cc0006, 0x82000580, + 0x02000000, 0x04000003, 0x42000800, 0x00000001, + 0x4d2c0000, 0x59325809, 0x812e59c0, 0x02000800, + 0x0010032d, 0x48065a07, 0x0201f800, 0x000203ab, + 0x5c025800, 0x0201f000, 0x00020a10, 0x4933c857, + 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, + 0x4200b000, 0x00000002, 0x59cc0806, 0x82040580, + 0x01000000, 0x04000004, 0x8204b500, 0x0000ffff, + 0x8058b104, 0x83cca400, 0x00000006, 0x59300009, + 0x8200ac00, 0x00000006, 0x0201f800, 0x0010aee2, + 0x0401feff, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4803c857, + 0x4807c857, 0x480bc857, 0x480fc857, 0x4813c857, + 0x481bc857, 0x492fc857, 0x4d2c0000, 0x4c000000, + 0x0201f800, 0x0010055a, 0x5c000000, 0x0400000f, + 0x48025803, 0x481a5801, 0x48125808, 0x48065805, + 0x480a5806, 0x480e5807, 0x5c001000, 0x4c080000, + 0x480a5809, 0x412c1000, 0x0201f800, 0x00020016, + 0x82000540, 0x00000001, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x4937c857, 0x4d1c0000, 0x0201f800, + 0x0010577f, 0x04020025, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x59341002, 0x82081500, 0x00ffffff, + 0x80080580, 0x0402001d, 0x497a6205, 0x42000800, + 0x00000035, 0x0201f800, 0x00108d34, 0x04020012, + 0x591c001d, 0x800001c0, 0x0400000f, 0x497a381d, + 0x591c0415, 0x8c000502, 0x02000800, 0x0010032d, + 0x84000502, 0x48023c15, 0x591c1407, 0x82080580, + 0x00000003, 0x04000006, 0x82080580, 0x00000006, + 0x04000005, 0x0401fc4b, 0x0401f004, 0x0401f805, + 0x0401f002, 0x0401f8d2, 0x5c023800, 0x1c01f000, + 0x4d2c0000, 0x591e5809, 0x4933c857, 0x491fc857, + 0x493bc857, 0x492fc857, 0x83380580, 0x00000015, + 0x040000c5, 0x83380580, 0x00000016, 0x040200c0, + 0x4d300000, 0x411e6000, 0x59cc0207, 0x4803c857, + 0x82000d00, 0x0000ff00, 0x82040580, 0x00001700, + 0x04000004, 0x82040580, 0x00000300, 0x04020063, + 0x591c0203, 0x4803c857, 0x82000580, 0x0000000d, + 0x04000044, 0x812e59c0, 0x040000ac, 0x591c0202, + 0x4803c857, 0x82000580, 0x0000ffff, 0x0402008f, + 0x592c020b, 0x4803c857, 0x82000500, 0x00000003, + 0x82000580, 0x00000002, 0x04020007, 0x592c0810, + 0x591c0012, 0x4803c857, 0x4807c857, 0x80040580, + 0x04020082, 0x591c0415, 0x4803c857, 0x8c000500, + 0x0402007e, 0x42000000, 0x0010bd03, 0x0201f800, + 0x0010ae10, 0x41780800, 0x591c1006, 0x42000000, + 0x0000000a, 0x0201f800, 0x0010600e, 0x592c0407, + 0x4803c857, 0x800001c0, 0x0400000c, 0x80080c80, + 0x04001004, 0x02020800, 0x0010032d, 0x80001040, + 0x480a5c07, 0x800811c0, 0x04020004, 0x0201f800, + 0x0010ea61, 0x0401f079, 0x0201f800, 0x00108a55, + 0x591c0818, 0x591c0019, 0x48065809, 0x4802580a, + 0x59300008, 0x8c000500, 0x02020800, 0x00100bd5, + 0x497a3809, 0x0201f800, 0x0002029a, 0x04020057, + 0x411e6000, 0x0201f800, 0x00107144, 0x0401f067, + 0x0401fc28, 0x04000016, 0x591c0006, 0x48026006, + 0x4936600a, 0x4a026407, 0x00000003, 0x492e6009, + 0x591c0818, 0x591c1019, 0x48066018, 0x480a6019, + 0x4d380000, 0x591e7403, 0x4d300000, 0x411e6000, + 0x0201f800, 0x00107144, 0x5c026000, 0x0201f800, + 0x00020a34, 0x5c027000, 0x0401f050, 0x59a8002c, + 0x48023a05, 0x0401f04d, 0x59cc0407, 0x82000580, + 0x0000000b, 0x0402002e, 0x59340a00, 0x84040d0e, + 0x48066a00, 0x592c0a05, 0x82040d00, 0x000000ff, + 0x82040d80, 0x00000014, 0x04000003, 0x4a02621e, + 0x00000003, 0x59300008, 0x8c000500, 0x02020800, + 0x00100bd5, 0x4d400000, 0x497a5c0a, 0x42028000, + 0x00000003, 0x592c0a09, 0x0201f800, 0x00104543, + 0x0201f800, 0x0010af23, 0x04020009, 0x0201f800, + 0x000203ab, 0x59300a1e, 0x82040d80, 0x00000003, + 0x02000800, 0x00108a55, 0x497a6009, 0x5c028000, + 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, + 0x4a026407, 0x00000002, 0x42000800, 0x8000404b, + 0x0201f800, 0x000209b1, 0x0401f01c, 0x59cc0207, + 0x82000580, 0x00002a00, 0x04020004, 0x59a8002c, + 0x48023a05, 0x0401f015, 0x812e59c0, 0x02000800, + 0x0010032d, 0x4a025a05, 0x00000103, 0x591c0008, + 0x8c000500, 0x02020800, 0x00100bd5, 0x591c0402, + 0x48025c07, 0x4a025a07, 0x00000003, 0x497a5c0a, + 0x0201f800, 0x000203ab, 0x0201f800, 0x00107144, + 0x0201f800, 0x00104126, 0x5c026000, 0x0201f800, + 0x00020a10, 0x0401f002, 0x5c026000, 0x5c025800, + 0x1c01f000, 0x0401f819, 0x0401f7fd, 0x4933c857, + 0x83380580, 0x00000015, 0x04020004, 0x59a8002c, + 0x48023a05, 0x0401f00d, 0x83380580, 0x00000016, + 0x0402000d, 0x4d300000, 0x411e6000, 0x0201f800, + 0x0010a26a, 0x0201f800, 0x00020979, 0x0201f800, + 0x00020a10, 0x5c026000, 0x497a381d, 0x0201f800, + 0x00020a10, 0x1c01f000, 0x4c5c0000, 0x591c0415, + 0x84000540, 0x48023c15, 0x59ccb80b, 0x4933c857, + 0x491fc857, 0x492fc857, 0x4803c857, 0x485fc857, + 0x8c5cbd3c, 0x04000005, 0x59a8002c, 0x48023a05, + 0x497a381d, 0x0401f057, 0x4d300000, 0x411e6000, + 0x0201f800, 0x00108530, 0x5c026000, 0x591c0407, + 0x82000580, 0x00000000, 0x0400004e, 0x591c0403, + 0x82000580, 0x00000050, 0x0402000c, 0x4d300000, + 0x411e6000, 0x4a026203, 0x00000001, 0x42000800, + 0x80000043, 0x0201f800, 0x000209b1, 0x5c026000, + 0x497a381d, 0x0401f03f, 0x591c0203, 0x82000580, + 0x0000000d, 0x0400001f, 0x812e59c0, 0x02000800, + 0x0010032d, 0x592c020b, 0x4803c857, 0x8c000500, + 0x0402001f, 0x8c000502, 0x04000016, 0x591c0415, + 0x8c00051c, 0x04020007, 0x591c0012, 0x4803c857, + 0x800001c0, 0x0400000f, 0x591c0013, 0x48023817, + 0x4a023813, 0x0fffffff, 0x592c0209, 0x8400051e, + 0x48025a09, 0x42000000, 0x0010bd05, 0x0201f800, + 0x0010ae10, 0x4a023a15, 0x00000001, 0x0401f01a, + 0x42000000, 0x0010bd06, 0x0201f800, 0x0010ae10, + 0x4a023a15, 0x00000007, 0x0401f013, 0x8c5cbd3a, + 0x040207f8, 0x59cc000a, 0x592c1810, 0x4803c857, + 0x480fc857, 0x800c0580, 0x040007f2, 0x59cc000a, + 0x4803c857, 0x48023817, 0x48023816, 0x42000000, + 0x0010bd04, 0x0201f800, 0x0010ae10, 0x4a023a15, + 0x00000005, 0x5c00b800, 0x0201f000, 0x00108bba, + 0x5c00b800, 0x0201f000, 0x00020a10, 0x4933c857, + 0x4d1c0000, 0x0201f800, 0x0010577f, 0x04020053, + 0x59cc0001, 0x59341002, 0x80080580, 0x82000500, + 0x00ffffff, 0x0402004a, 0x5930141a, 0x0201f800, + 0x00108d91, 0x02000800, 0x0010032d, 0x591c1407, + 0x82080580, 0x00000007, 0x04000041, 0x82080580, + 0x00000002, 0x0400003e, 0x82080580, 0x00000000, + 0x0400003b, 0x591c0202, 0x82000d80, 0x0000ffff, + 0x04000004, 0x59301a1a, 0x800c0580, 0x04020034, + 0x83380580, 0x00000015, 0x0400002f, 0x4d300000, + 0x4d2c0000, 0x411e6000, 0x59325809, 0x0201f800, + 0x00108953, 0x02000800, 0x0010032d, 0x592c0205, + 0x82000500, 0x000000ff, 0x82000580, 0x00000014, + 0x04000003, 0x4a02621e, 0x00000003, 0x497a5c0a, + 0x42028000, 0x00000003, 0x592c0a09, 0x0201f800, + 0x00104543, 0x0201f800, 0x0010af23, 0x04020009, + 0x0201f800, 0x000203ab, 0x59300a1e, 0x82040d80, + 0x00000003, 0x02000800, 0x00108a55, 0x497a6009, + 0x5c025800, 0x4a026403, 0x00000085, 0x4a026203, + 0x00000009, 0x4a026407, 0x00000002, 0x42000800, + 0x8000404b, 0x0201f800, 0x000209b1, 0x5c026000, + 0x0401f003, 0x59a8002c, 0x48023a05, 0x497a381d, + 0x0201f800, 0x00020a10, 0x5c023800, 0x1c01f000, + 0x4933c857, 0x4c580000, 0x4d2c0000, 0x59325809, + 0x59342200, 0x82102500, 0xffffdffd, 0x48126a00, + 0x83383580, 0x00000015, 0x0400000d, 0x0201f800, + 0x00108953, 0x04000064, 0x0201f800, 0x00108f1d, + 0x04020005, 0x4200b000, 0x00000002, 0x0201f800, + 0x00108efc, 0x0401fa2a, 0x0401f07b, 0x83cc1400, + 0x00000008, 0x4200b000, 0x00000002, 0x83341c00, + 0x00000006, 0x0201f800, 0x00107df9, 0x04020014, + 0x83cc1400, 0x0000000a, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000008, 0x0201f800, 0x00107df9, + 0x0402000b, 0x0201f800, 0x00101a68, 0x59342200, + 0x59cc1007, 0x800811c0, 0x04000003, 0x480a6801, + 0x84102542, 0x48126a00, 0x0401f062, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010e06f, 0x5c027800, + 0x42000000, 0x0010bd1d, 0x0201f800, 0x0010ae10, + 0x59340200, 0x84000558, 0x48026a00, 0x4d300000, + 0x0201f800, 0x00107188, 0x02000800, 0x0010032d, + 0x4936600a, 0x497a6009, 0x4a026407, 0x00000001, + 0x4a026403, 0x00000001, 0x42003000, 0x00000003, + 0x0201f800, 0x0010a5a1, 0x8d0e1d20, 0x04000011, + 0x41782800, 0x42003000, 0x00000001, 0x4d400000, + 0x42028000, 0x00000029, 0x0201f800, 0x0010a00e, + 0x5c028000, 0x4a026407, 0x00000004, 0x4a026203, + 0x00000007, 0x4a026421, 0x00000001, 0x0401f009, + 0x4a026203, 0x00000001, 0x42000800, 0x0000000b, + 0x0201f800, 0x00103d9d, 0x0201f800, 0x0010608d, + 0x5c026000, 0x0201f800, 0x00108953, 0x04000026, + 0x0201f800, 0x00108f1d, 0x04020026, 0x0401f9d0, + 0x0401f021, 0x42000000, 0x0010bd20, 0x0201f800, + 0x0010ae10, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010e06f, 0x42000000, 0x0010bd1d, 0x0201f800, + 0x0010ae10, 0x59340200, 0x84000558, 0x48026a00, + 0x42003000, 0x00000003, 0x41782800, 0x42002000, + 0x00000005, 0x4d400000, 0x4d440000, 0x59368c03, + 0x42028000, 0x00000029, 0x0201f800, 0x001091ea, + 0x5c028800, 0x5c028000, 0x5c027800, 0x0201f800, + 0x00101a68, 0x0201f800, 0x00020a10, 0x0401f002, + 0x0401fc73, 0x5c025800, 0x5c00b000, 0x1c01f000, + 0x4933c857, 0x41380000, 0x83383480, 0x00000058, + 0x02021800, 0x0010032d, 0x0c01f001, 0x001077ae, + 0x001077a9, 0x001077ae, 0x001077ae, 0x001077ae, + 0x001077ae, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077a7, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077a7, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077a7, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077a7, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077a7, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077a7, 0x001077a7, 0x001077ae, 0x001077a7, + 0x001077ae, 0x001077ae, 0x001077a7, 0x001077a7, + 0x001077a7, 0x001077a7, 0x001077a7, 0x001077ae, + 0x001077a7, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077a7, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077a7, 0x001077ae, 0x001077ae, 0x001077a7, + 0x001077a7, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077a7, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077ae, 0x001077a7, 0x001077a7, 0x001077ae, + 0x001077ae, 0x001077a7, 0x001077ae, 0x001077ae, + 0x001077a7, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077ae, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077ae, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077ae, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077ae, 0x001077a7, 0x001077ae, 0x001077a7, + 0x001077a7, 0x001077a7, 0x001077a7, 0x001077a7, + 0x001077a7, 0x001077a7, 0x001077a7, 0x0201f800, + 0x0010032d, 0x4a026203, 0x00000001, 0x493a6403, + 0x0201f000, 0x0010608d, 0x4933c857, 0x4a026203, + 0x00000001, 0x493a6403, 0x0201f000, 0x0010608d, + 0x59300403, 0x82003480, 0x00000058, 0x02021800, + 0x0010032d, 0x83383580, 0x00000013, 0x04000099, + 0x83383580, 0x00000027, 0x0402004e, 0x4933c857, + 0x0201f800, 0x00106102, 0x0201f800, 0x0010a684, + 0x0201f800, 0x00108a68, 0x0400000b, 0x0201f800, + 0x00108a83, 0x04000041, 0x59300403, 0x82000d80, + 0x00000022, 0x04020038, 0x0401fc2b, 0x0400003a, + 0x0401f03a, 0x0201f800, 0x00101a68, 0x42000800, + 0x00000007, 0x0201f800, 0x00103d9d, 0x0401f910, + 0x4d440000, 0x59368c03, 0x83440580, 0x000007fe, + 0x04020008, 0x59a8121b, 0x84081540, 0x0201f800, + 0x00104755, 0x04020002, 0x8408154a, 0x480b521b, + 0x42028000, 0x00000029, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010e06f, 0x5c027800, 0x836c0580, + 0x00000003, 0x0400000c, 0x5932680a, 0x59340008, + 0x800001c0, 0x04020008, 0x59368c03, 0x4933c857, + 0x4937c857, 0x4947c857, 0x0201f800, 0x00103e42, + 0x0401f00c, 0x42000000, 0x0010bd1d, 0x0201f800, + 0x0010ae10, 0x42003000, 0x00000015, 0x41782800, + 0x42002000, 0x00000003, 0x0201f800, 0x001091ea, + 0x5c028800, 0x0201f800, 0x00108c94, 0x0201f000, + 0x00020a10, 0x1c01f000, 0x0401f8dd, 0x0401f7fa, + 0x83380580, 0x00000014, 0x0400000c, 0x4933c857, + 0x0201f800, 0x001064f2, 0x02020000, 0x001071c7, + 0x59300203, 0x82000580, 0x00000002, 0x04000102, + 0x0201f800, 0x0010032d, 0x4933c857, 0x0201f800, + 0x00106102, 0x0201f800, 0x0010a684, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010e06f, 0x5c027800, + 0x42003000, 0x00000016, 0x41782800, 0x4d400000, + 0x4d440000, 0x59368c03, 0x42002000, 0x00000009, + 0x42028000, 0x00000029, 0x0201f800, 0x001091ea, + 0x5c028800, 0x5c028000, 0x42000000, 0x0010bd1d, + 0x0201f800, 0x0010ae10, 0x0201f800, 0x00108a68, + 0x0402000c, 0x0201f800, 0x00101a68, 0x0401f8ac, + 0x59340c03, 0x82040580, 0x000007fe, 0x040207c6, + 0x59a80a1b, 0x84040d40, 0x4807521b, 0x0401f7c2, + 0x0201f800, 0x00108a83, 0x04020003, 0x0401f8a0, + 0x0401f7bd, 0x59300403, 0x82000d80, 0x00000032, + 0x04020004, 0x0201f800, 0x00101d02, 0x0401f7b6, + 0x82000d80, 0x00000022, 0x04000895, 0x0401f7b2, + 0x4933c857, 0x4803c857, 0x0c01f001, 0x001078c0, + 0x001078c0, 0x001078c0, 0x001078c0, 0x001078c0, + 0x001078c0, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078b7, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078b7, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078b7, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078b7, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078b7, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078b7, 0x001078c4, 0x001078e1, 0x001078b7, + 0x001078e1, 0x001078e1, 0x001078b7, 0x001078b7, + 0x001078b7, 0x001078b7, 0x001078b7, 0x001078e1, + 0x001078e1, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078b7, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078b7, 0x001078d2, 0x001078e1, 0x001078b7, + 0x001078cb, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078cb, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078e1, 0x001078ce, 0x001078b7, 0x001078b9, + 0x001078e1, 0x001078b7, 0x001078e1, 0x001078e1, + 0x001078b7, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078e1, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078e1, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078e1, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078e1, 0x001078b7, 0x001078e1, 0x001078b7, + 0x001078b7, 0x001078b7, 0x001078b7, 0x001078b7, + 0x001078b7, 0x001078b7, 0x001078b7, 0x0201f800, + 0x0010032d, 0x4d2c0000, 0x59325809, 0x0201f800, + 0x000203ab, 0x5c025800, 0x0201f000, 0x00020a10, + 0x4a026203, 0x00000002, 0x0201f000, 0x00108b06, + 0x4a026203, 0x00000005, 0x59a8002c, 0x48026205, + 0x59a8002a, 0x48026006, 0x1c01f000, 0x5930081f, + 0x49780a05, 0x0401f014, 0x0201f800, 0x00108c94, + 0x0201f000, 0x00020a10, 0x0201f800, 0x00101d02, + 0x0201f800, 0x001061b2, 0x04000005, 0x0201f800, + 0x00106102, 0x0201f000, 0x00020a10, 0x0201f800, + 0x00106102, 0x0201f800, 0x00020a10, 0x0201f000, + 0x0010619f, 0x4933c857, 0x4a026203, 0x00000002, + 0x59a8002a, 0x48026006, 0x1c01f000, 0x4933c857, + 0x0201f800, 0x00108953, 0x0400002e, 0x4d2c0000, + 0x0201f800, 0x00108f1d, 0x0402000a, 0x4d400000, + 0x42028000, 0x00000031, 0x42000800, 0x00000004, + 0x0201f800, 0x00108db8, 0x5c028000, 0x0401f020, + 0x59300c07, 0x82040580, 0x00000010, 0x04000004, + 0x82040580, 0x00000011, 0x0402000a, 0x4a025a07, + 0x00000031, 0x4a02580e, 0x00000004, 0x4a02580f, + 0x000000ff, 0x0201f800, 0x000203ab, 0x0401f010, + 0x592c0405, 0x8c00051e, 0x0400000d, 0x4a025a05, + 0x00000103, 0x4a025806, 0x01000000, 0x4da00000, + 0x4cec0000, 0x5931d822, 0x58ef400a, 0x58ec0008, + 0x0801f800, 0x5c01d800, 0x5c034000, 0x5c025800, + 0x1c01f000, 0x4933c857, 0x83340580, 0x0010c2b2, + 0x0402000c, 0x83380d80, 0x00000015, 0x04000005, + 0x83380d80, 0x00000016, 0x02020000, 0x001071c7, + 0x0201f800, 0x0010a687, 0x0201f000, 0x00020a10, 0x59340400, 0x82000500, 0x000000ff, 0x82003480, 0x0000000c, 0x02021800, 0x0010032d, 0x59303403, - 0x82180d80, 0x0000004d, 0x02000000, 0x00108c47, - 0x82180d80, 0x00000033, 0x02000000, 0x00108bfe, - 0x82180d80, 0x00000028, 0x02000000, 0x00108a0b, - 0x82180d80, 0x00000029, 0x02000000, 0x00108a1f, - 0x82180d80, 0x00000057, 0x02000000, 0x00109235, - 0x82180d80, 0x0000001f, 0x02000000, 0x00107309, - 0x82180d80, 0x00000055, 0x02000000, 0x001072e2, - 0x82180d80, 0x00000000, 0x04000568, 0x82180d80, - 0x00000022, 0x02000000, 0x00107336, 0x82180d80, - 0x00000035, 0x02000000, 0x0010743e, 0x82180d80, - 0x00000039, 0x04000504, 0x82180d80, 0x0000003d, - 0x02000000, 0x00107372, 0x82180d80, 0x00000044, - 0x02000000, 0x001073af, 0x82180d80, 0x00000049, - 0x02000000, 0x00107405, 0x82180d80, 0x00000041, - 0x02000000, 0x001073f1, 0x82180d80, 0x00000043, - 0x02000000, 0x00108da0, 0x82180d80, 0x00000004, + 0x82180d80, 0x0000004d, 0x02000000, 0x00108d00, + 0x82180d80, 0x00000033, 0x02000000, 0x00108cb7, + 0x82180d80, 0x00000028, 0x02000000, 0x00108ac4, + 0x82180d80, 0x00000029, 0x02000000, 0x00108ad8, + 0x82180d80, 0x00000057, 0x02000000, 0x001092ed, + 0x82180d80, 0x0000001f, 0x02000000, 0x0010739f, + 0x82180d80, 0x00000055, 0x02000000, 0x00107378, + 0x82180d80, 0x00000000, 0x0400055a, 0x82180d80, + 0x00000022, 0x02000000, 0x001073cc, 0x82180d80, + 0x00000035, 0x02000000, 0x001074d4, 0x82180d80, + 0x00000039, 0x040004f6, 0x82180d80, 0x0000003d, + 0x02000000, 0x00107408, 0x82180d80, 0x00000044, + 0x02000000, 0x00107445, 0x82180d80, 0x00000049, + 0x02000000, 0x0010749b, 0x82180d80, 0x00000041, + 0x02000000, 0x00107487, 0x82180d80, 0x00000043, + 0x02000000, 0x00108e59, 0x82180d80, 0x00000004, 0x04020003, 0x42000000, 0x00000001, 0x83380d80, 0x00000015, 0x04000006, 0x83380d80, 0x00000016, - 0x02020000, 0x00107134, 0x0401f25e, 0x4c000000, - 0x0201f800, 0x0010a594, 0x5c000000, 0x4d2c0000, + 0x02020000, 0x001071c7, 0x0401f25e, 0x4c000000, + 0x0201f800, 0x0010a687, 0x5c000000, 0x4d2c0000, 0x4d3c0000, 0x0c01f804, 0x5c027800, 0x5c025800, - 0x1c01f000, 0x001078f5, 0x001078f9, 0x001078f5, - 0x0010796c, 0x001078f5, 0x00107aad, 0x00107b47, - 0x001078f5, 0x001078f5, 0x00107b10, 0x001078f5, - 0x00107b22, 0x4933c857, 0x497a6008, 0x59300809, + 0x1c01f000, 0x00107999, 0x0010799d, 0x00107999, + 0x00107a10, 0x00107999, 0x00107b51, 0x00107beb, + 0x00107999, 0x00107999, 0x00107bb4, 0x00107999, + 0x00107bc6, 0x4933c857, 0x497a6008, 0x59300809, 0x58040000, 0x4a000a05, 0x00000103, 0x0201f000, 0x00020a10, 0x4933c857, 0x40000000, 0x40000000, - 0x1c01f000, 0x4933c857, 0x0201f800, 0x0010408c, + 0x1c01f000, 0x4933c857, 0x0201f800, 0x001040a6, 0x59a8005a, 0x82000580, 0x00000074, 0x04020059, - 0x0201f800, 0x00109eb3, 0x04020014, 0x0401f859, - 0x0201f800, 0x0010889a, 0x0400000c, 0x0201f800, - 0x00108e64, 0x04020009, 0x41780800, 0x4d400000, - 0x42028000, 0x00000000, 0x0201f800, 0x00108cff, - 0x5c028000, 0x0401f003, 0x0201f800, 0x00101a67, - 0x0201f000, 0x00020a10, 0x0201f800, 0x0010889a, - 0x04000007, 0x0201f800, 0x00108e64, 0x04020004, - 0x0401ff35, 0x0201f000, 0x00020a10, 0x417a7800, - 0x0201f800, 0x0010df61, 0x42000000, 0x0010bc1d, - 0x0201f800, 0x0010ad1d, 0x59340200, 0x84000558, + 0x0201f800, 0x00109f8a, 0x04020014, 0x0401f859, + 0x0201f800, 0x00108953, 0x0400000c, 0x0201f800, + 0x00108f1d, 0x04020009, 0x41780800, 0x4d400000, + 0x42028000, 0x00000000, 0x0201f800, 0x00108db8, + 0x5c028000, 0x0401f003, 0x0201f800, 0x00101a68, + 0x0201f000, 0x00020a10, 0x0201f800, 0x00108953, + 0x04000007, 0x0201f800, 0x00108f1d, 0x04020004, + 0x0401ff27, 0x0201f000, 0x00020a10, 0x417a7800, + 0x0201f800, 0x0010e06f, 0x42000000, 0x0010bd1d, + 0x0201f800, 0x0010ae10, 0x59340200, 0x84000558, 0x48026a00, 0x42003000, 0x00000003, 0x0201f800, - 0x0010a4ae, 0x4d300000, 0x0201f800, 0x001070f5, + 0x0010a5a1, 0x4d300000, 0x0201f800, 0x00107188, 0x02000800, 0x0010032d, 0x4936600a, 0x497a6009, 0x4a026407, 0x00000001, 0x4a026403, 0x00000001, 0x8d0e1d20, 0x04000011, 0x4a026407, 0x00000004, 0x4a026203, 0x00000007, 0x4a026421, 0x00000001, 0x42003000, 0x00000001, 0x4d400000, 0x42028000, - 0x00000029, 0x41782800, 0x0201f800, 0x00109f37, + 0x00000029, 0x41782800, 0x0201f800, 0x0010a00e, 0x5c028000, 0x0401f009, 0x42000800, 0x0000000b, - 0x0201f800, 0x00103d8a, 0x4a026203, 0x00000001, - 0x0201f800, 0x00105fe8, 0x5c026000, 0x0401fefe, - 0x0201f800, 0x00101a67, 0x0201f000, 0x00020a10, - 0x0401fef9, 0x42000000, 0x00000001, 0x0401f112, + 0x0201f800, 0x00103d9d, 0x4a026203, 0x00000001, + 0x0201f800, 0x0010608d, 0x5c026000, 0x0401fef0, + 0x0201f800, 0x00101a68, 0x0201f000, 0x00020a10, + 0x0401feeb, 0x42000000, 0x00000001, 0x0401f112, 0x4933c857, 0x59340200, 0x8c000500, 0x0400000c, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00103d7f, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00103d92, 0x5c027800, 0x8d0e1d20, 0x04000005, 0x42000800, - 0x00000006, 0x0201f800, 0x00103d8a, 0x1c01f000, + 0x00000006, 0x0201f800, 0x00103d9d, 0x1c01f000, 0x4933c857, 0x59a8085a, 0x82040580, 0x00000074, 0x0400000e, 0x4807c857, 0x82040580, 0x00000100, 0x040200df, 0x59cc0408, 0x4803c857, 0x8c000500, @@ -7813,36 +7849,36 @@ static const uint32_t isp_2400_risc_code[] = { 0x000007fe, 0x0402001a, 0x59a8021b, 0x8c000506, 0x04000015, 0x59cc0000, 0x82000500, 0x000000ff, 0x59a8080f, 0x82040d00, 0x000000ff, 0x80040580, - 0x0400000d, 0x0201f800, 0x00101a67, 0x0201f800, - 0x00020a10, 0x42000000, 0x0010bc0e, 0x0201f800, - 0x0010ad1d, 0x4202d800, 0x00000001, 0x0201f000, - 0x001038f5, 0x0401fad8, 0x0401f062, 0x0201f800, - 0x00103e68, 0x59341403, 0x82080580, 0x000007fc, + 0x0400000d, 0x0201f800, 0x00101a68, 0x0201f800, + 0x00020a10, 0x42000000, 0x0010bd0e, 0x0201f800, + 0x0010ae10, 0x4202d800, 0x00000001, 0x0201f000, + 0x00103908, 0x0401fad8, 0x0401f062, 0x0201f800, + 0x00103e7e, 0x59341403, 0x82080580, 0x000007fc, 0x04020035, 0x4a026802, 0x00fffffc, 0x0201f800, - 0x0010889a, 0x04000012, 0x0201f800, 0x00108e64, + 0x00108953, 0x04000012, 0x0201f800, 0x00108f1d, 0x0402000f, 0x0401f8de, 0x41780800, 0x4d400000, - 0x42028000, 0x00000000, 0x0201f800, 0x00108cff, + 0x42028000, 0x00000000, 0x0201f800, 0x00108db8, 0x5c028000, 0x42000800, 0x00000004, 0x0201f800, - 0x00103d8a, 0x0201f000, 0x00020a10, 0x42000800, - 0x00000004, 0x0201f800, 0x00103d8a, 0x0201f800, - 0x00101a67, 0x59300c1e, 0x82040580, 0x00000021, + 0x00103d9d, 0x0201f000, 0x00020a10, 0x42000800, + 0x00000004, 0x0201f800, 0x00103d9d, 0x0201f800, + 0x00101a68, 0x59300c1e, 0x82040580, 0x00000021, 0x04000003, 0x0201f000, 0x00020a10, 0x42028800, 0x000007fd, 0x42003000, 0x00fffffd, 0x0201f800, - 0x00103dcb, 0x02020800, 0x0010032d, 0x4936600a, + 0x00103de1, 0x02020800, 0x0010032d, 0x4936600a, 0x497a6c12, 0x4a02601d, 0x00000003, 0x4a026203, 0x00000001, 0x4a026403, 0x00000022, 0x0201f000, - 0x00105fe8, 0x59a8006d, 0x8c000502, 0x04000011, - 0x0201f800, 0x00104716, 0x42001000, 0x00000010, + 0x0010608d, 0x59a8006d, 0x8c000502, 0x04000011, + 0x0201f800, 0x00104755, 0x42001000, 0x00000010, 0x04020009, 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000006, 0x42001000, - 0x00000008, 0x0201f800, 0x00104429, 0x0402006c, - 0x0201f800, 0x0010889a, 0x0400006d, 0x0201f800, - 0x00108e64, 0x04020005, 0x592c0405, 0x8c00051c, + 0x00000008, 0x0201f800, 0x00104448, 0x0402006c, + 0x0201f800, 0x00108953, 0x0400006d, 0x0201f800, + 0x00108f1d, 0x04020005, 0x592c0405, 0x8c00051c, 0x040207b3, 0x0401f896, 0x42000800, 0x00000005, - 0x0201f800, 0x00103d8a, 0x4a026203, 0x00000001, - 0x4a026403, 0x00000003, 0x0201f000, 0x00105fe8, + 0x0201f800, 0x00103d9d, 0x4a026203, 0x00000001, + 0x4a026403, 0x00000003, 0x0201f000, 0x0010608d, 0x59cc0408, 0x8c000518, 0x0400001a, 0x0201f800, - 0x00108b9a, 0x0201f800, 0x00104716, 0x04000009, + 0x00108c53, 0x0201f800, 0x00104755, 0x04000009, 0x59cc0408, 0x8c000516, 0x04000006, 0x5930041e, 0x82000580, 0x00000021, 0x04020799, 0x1c01f000, 0x59a8021b, 0x8400054a, 0x4803521b, 0x4803541b, @@ -7851,32 +7887,32 @@ static const uint32_t isp_2400_risc_code[] = { 0x42001000, 0x000000ef, 0x59a80073, 0x8c00053e, 0x04000005, 0x59a8021b, 0x8c000516, 0x04000002, 0x59a8100f, 0x480b500f, 0x497b8830, 0x84081570, - 0x480b8832, 0x0201f800, 0x00108bc4, 0x59a8021b, + 0x480b8832, 0x0201f800, 0x00108c7d, 0x59a8021b, 0x84000548, 0x4803521b, 0x4803541b, 0x0201f800, - 0x00109f0c, 0x04020776, 0x599c0019, 0x8c000510, + 0x00109fe3, 0x04020776, 0x599c0019, 0x8c000510, 0x0402003b, 0x59a8021b, 0x8400054c, 0x4803521b, - 0x42000800, 0x00000007, 0x0201f800, 0x00103d8a, - 0x417a7800, 0x0201f800, 0x00103d7f, 0x42000000, - 0x000000e8, 0x0201f800, 0x0010548f, 0x02000800, - 0x00103dcb, 0x02020800, 0x0010032d, 0x4936600a, + 0x42000800, 0x00000007, 0x0201f800, 0x00103d9d, + 0x417a7800, 0x0201f800, 0x00103d92, 0x42000000, + 0x000000e8, 0x0201f800, 0x001054fb, 0x02000800, + 0x00103de1, 0x02020800, 0x0010032d, 0x4936600a, 0x59340200, 0x8400051a, 0x48026a00, 0x42000800, - 0x00000003, 0x0201f800, 0x00103d8a, 0x4a026407, + 0x00000003, 0x0201f800, 0x00103d9d, 0x4a026407, 0x00000001, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000002, 0x0201f000, 0x00105fe8, 0x0401fdfe, + 0x00000002, 0x0201f000, 0x0010608d, 0x0401fdf0, 0x42000000, 0x00000001, 0x0401f017, 0x599c0017, 0x8c00050a, 0x04000799, 0x42000800, 0x00000004, - 0x0201f800, 0x00103d8a, 0x49375064, 0x59a8021b, + 0x0201f800, 0x00103d9d, 0x49375064, 0x59a8021b, 0x8c000508, 0x0400000a, 0x599c0018, 0x8c00051c, 0x04000007, 0x42000800, 0x000003e8, 0x42001000, - 0x0010eacd, 0x0201f800, 0x00105904, 0x0201f000, + 0x0010ebc8, 0x0201f800, 0x001059a9, 0x0201f000, 0x00020a10, 0x4933c857, 0x80003540, 0x04000005, - 0x42000800, 0x00000007, 0x0201f800, 0x00103d8a, + 0x42000800, 0x00000007, 0x0201f800, 0x00103d9d, 0x801831c0, 0x0402000e, 0x59302009, 0x801021c0, 0x04000004, 0x58100405, 0x8c00051e, 0x04020008, 0x59341c03, 0x42002000, 0x00000004, 0x42003000, - 0x00000012, 0x0201f800, 0x00103260, 0x0201f800, - 0x00101a67, 0x0201f000, 0x00020a10, 0x4c5c0000, - 0x4d2c0000, 0x59325809, 0x0201f800, 0x00104f41, + 0x00000012, 0x0201f800, 0x0010326a, 0x0201f800, + 0x00101a68, 0x0201f000, 0x00020a10, 0x4c5c0000, + 0x4d2c0000, 0x59325809, 0x0201f800, 0x00104f93, 0x5c025800, 0x59cc0008, 0x48002805, 0x59cc0009, 0x48002806, 0x49782807, 0x49782808, 0x49782809, 0x4978280a, 0x59cc0013, 0x8c00053e, 0x04000009, @@ -7887,112 +7923,112 @@ static const uint32_t isp_2400_risc_code[] = { 0x59cc041a, 0x900001c0, 0x4800280a, 0x5c00b800, 0x1c01f000, 0x4933c857, 0x59a8005a, 0x82000580, 0x00000014, 0x04020048, 0x59a8006d, 0x8c000502, - 0x04000015, 0x0201f800, 0x00104716, 0x42001000, + 0x04000015, 0x0201f800, 0x00104755, 0x42001000, 0x00000010, 0x04020009, 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, 0x0400000a, - 0x42001000, 0x00000008, 0x0201f800, 0x00104429, + 0x42001000, 0x00000008, 0x0201f800, 0x00104448, 0x04000005, 0x59a8006d, 0x8400054c, 0x4803506d, 0x0401f031, 0x836c0580, 0x00000003, 0x0402000b, 0x59300009, 0x80000540, 0x04020008, 0x59341c03, 0x42002000, 0x00000006, 0x42003000, 0x00000013, - 0x0201f800, 0x00103260, 0x0201f800, 0x00103ecf, - 0x0401fe84, 0x0401fa5e, 0x0402001f, 0x59340404, + 0x0201f800, 0x0010326a, 0x0201f800, 0x00103ee9, + 0x0401fe84, 0x0401fa61, 0x0402001f, 0x59340404, 0x80000540, 0x0400001c, 0x42000800, 0x00000006, - 0x0201f800, 0x00103d8a, 0x0201f800, 0x0010889a, - 0x04000011, 0x0201f800, 0x00108e64, 0x0402000a, + 0x0201f800, 0x00103d9d, 0x0201f800, 0x00108953, + 0x04000011, 0x0201f800, 0x00108f1d, 0x0402000a, 0x41780800, 0x4d400000, 0x42028000, 0x00000000, - 0x0201f800, 0x00108cff, 0x5c028000, 0x0201f000, + 0x0201f800, 0x00108db8, 0x5c028000, 0x0201f000, 0x00020a10, 0x4a025a05, 0x00000103, 0x4a025806, - 0x02000000, 0x0201f800, 0x00101a67, 0x0201f000, - 0x00020a10, 0x0201f800, 0x001043c3, 0x0201f800, - 0x0010889a, 0x04000007, 0x0201f800, 0x00108e64, - 0x04020004, 0x0401fd50, 0x0201f000, 0x00020a10, - 0x0401fd4d, 0x0201f800, 0x0010a594, 0x80000580, + 0x02000000, 0x0201f800, 0x00101a68, 0x0201f000, + 0x00020a10, 0x0201f800, 0x001043e2, 0x0201f800, + 0x00108953, 0x04000007, 0x0201f800, 0x00108f1d, + 0x04020004, 0x0401fd42, 0x0201f000, 0x00020a10, + 0x0401fd3f, 0x0201f800, 0x0010a687, 0x80000580, 0x59a8006d, 0x8c00050c, 0x04000005, 0x8400050c, 0x4803506d, 0x82000540, 0x00000001, 0x0401f75e, 0x4933c857, 0x59a8005a, 0x82000580, 0x00000014, 0x0402000b, 0x42000800, 0x0000000b, 0x0201f800, - 0x00103d8a, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000001, 0x0201f000, 0x00105fe8, 0x42000000, + 0x00103d9d, 0x4a026203, 0x00000001, 0x4a026403, + 0x00000001, 0x0201f000, 0x0010608d, 0x42000000, 0x00000001, 0x0401f74c, 0x4933c857, 0x40003000, 0x59a8005a, 0x82000580, 0x00000004, 0x0402000a, 0x82183580, 0x0000000b, 0x04020005, 0x42000800, - 0x00000007, 0x0201f800, 0x00103d8a, 0x0201f000, + 0x00000007, 0x0201f800, 0x00103d9d, 0x0201f000, 0x00020a10, 0x42000000, 0x00000001, 0x0401f73a, 0x4803c857, 0x4d2c0000, 0x4d3c0000, 0x0c01f804, - 0x5c027800, 0x5c025800, 0x1c01f000, 0x001078f5, - 0x00107b56, 0x001078f5, 0x00107bb2, 0x001078f5, - 0x00107c19, 0x00107b47, 0x001078f5, 0x001078f5, - 0x00107c3b, 0x001078f5, 0x00107c4d, 0x4933c857, + 0x5c027800, 0x5c025800, 0x1c01f000, 0x00107999, + 0x00107bfa, 0x00107999, 0x00107c56, 0x00107999, + 0x00107cbd, 0x00107beb, 0x00107999, 0x00107999, + 0x00107cdf, 0x00107999, 0x00107cf1, 0x4933c857, 0x4d1c0000, 0x59301403, 0x82080580, 0x00000003, 0x04000008, 0x82081580, 0x0000001e, 0x04020003, 0x0201f800, 0x00020a10, 0x5c023800, 0x1c01f000, 0x0401ff59, 0x0401f7fd, 0x4933c857, 0x42000000, - 0x0010bc21, 0x0201f800, 0x0010ad1d, 0x0201f800, - 0x0010a594, 0x0201f800, 0x0010408c, 0x0201f800, - 0x0010889a, 0x0400000b, 0x0201f800, 0x00108e64, + 0x0010bd21, 0x0201f800, 0x0010ae10, 0x0201f800, + 0x0010a687, 0x0201f800, 0x001040a6, 0x0201f800, + 0x00108953, 0x0400000b, 0x0201f800, 0x00108f1d, 0x04020008, 0x4200b000, 0x00000002, 0x0201f800, - 0x00108e43, 0x0401fce8, 0x0201f000, 0x00020a10, + 0x00108efc, 0x0401fcda, 0x0201f000, 0x00020a10, 0x0401f8f3, 0x0402002f, 0x417a7800, 0x0201f800, - 0x00103d7f, 0x417a7800, 0x0201f800, 0x0010df61, - 0x42000000, 0x0010bc1d, 0x0201f800, 0x0010ad1d, + 0x00103d92, 0x417a7800, 0x0201f800, 0x0010e06f, + 0x42000000, 0x0010bd1d, 0x0201f800, 0x0010ae10, 0x59340200, 0x84000558, 0x48026a00, 0x4a026403, 0x00000002, 0x42003000, 0x00000003, 0x0201f800, - 0x0010a4ae, 0x8d0e1d20, 0x04000011, 0x4d400000, + 0x0010a5a1, 0x8d0e1d20, 0x04000011, 0x4d400000, 0x41782800, 0x42003000, 0x00000005, 0x42028000, - 0x00000029, 0x0201f800, 0x00109f37, 0x5c028000, + 0x00000029, 0x0201f800, 0x0010a00e, 0x5c028000, 0x4a026203, 0x00000007, 0x4a026407, 0x00000004, 0x4a026421, 0x00000001, 0x1c01f000, 0x42000800, - 0x00000003, 0x0201f800, 0x00103d8a, 0x4a026203, - 0x00000001, 0x0201f800, 0x00105fe8, 0x0401f7f7, + 0x00000003, 0x0201f800, 0x00103d9d, 0x4a026203, + 0x00000001, 0x0201f800, 0x0010608d, 0x0401f7f7, 0x59cc0407, 0x82000580, 0x00000009, 0x0402000a, 0x59340412, 0x82000500, 0x000000ff, 0x0400000c, 0x80000040, 0x48026c12, 0x4a026006, 0x0000000a, 0x0401f7ea, 0x59cc0207, 0x82000500, 0x0000ff00, - 0x82000580, 0x00001900, 0x040007c3, 0x0401fca2, + 0x82000580, 0x00001900, 0x040007c3, 0x0401fc94, 0x80000580, 0x0401f6bc, 0x4933c857, 0x0201f800, - 0x0010889a, 0x04000011, 0x0201f800, 0x00108e64, + 0x00108953, 0x04000011, 0x0201f800, 0x00108f1d, 0x0402000e, 0x4c580000, 0x4200b000, 0x00000002, - 0x0201f800, 0x00108e43, 0x5c00b000, 0x0401fc92, - 0x42000800, 0x00000007, 0x0201f800, 0x00103d8a, - 0x0201f000, 0x00020a10, 0x0401fc8b, 0x59cc3407, + 0x0201f800, 0x00108efc, 0x5c00b000, 0x0401fc84, + 0x42000800, 0x00000007, 0x0201f800, 0x00103d9d, + 0x0201f000, 0x00020a10, 0x0401fc7d, 0x59cc3407, 0x82183500, 0x000000ff, 0x82180580, 0x00000005, 0x04000020, 0x82180580, 0x0000000b, 0x04000018, 0x59cc0207, 0x82000500, 0x0000ff00, 0x04020004, 0x82180580, 0x00000009, 0x04000016, 0x82000580, 0x00001900, 0x0402000e, 0x82180580, 0x00000009, 0x04000010, 0x42000800, 0x00000004, 0x0201f800, - 0x00103d8a, 0x0201f800, 0x00101a67, 0x0201f800, - 0x0010a594, 0x0201f000, 0x00020a10, 0x0201f800, - 0x0010a594, 0x42000000, 0x00000001, 0x0401f682, - 0x0201f800, 0x0010889a, 0x59325809, 0x04000008, + 0x00103d9d, 0x0201f800, 0x00101a68, 0x0201f800, + 0x0010a687, 0x0201f000, 0x00020a10, 0x0201f800, + 0x0010a687, 0x42000000, 0x00000001, 0x0401f682, + 0x0201f800, 0x00108953, 0x59325809, 0x04000008, 0x592c0205, 0x82000580, 0x00000139, 0x040007f4, 0x592c0405, 0x8c00051e, 0x040207f1, 0x59340412, 0x800001c0, 0x04000008, 0x80000040, 0x48026c12, 0x4a026006, 0x0000000a, 0x4a026403, 0x00000016, 0x1c01f000, 0x59340403, 0x82000580, 0x000007fe, 0x04020007, 0x59a8021b, 0x84000540, 0x4803521b, - 0x0201f800, 0x00103a14, 0x0401f7dd, 0x0201f800, - 0x0010a594, 0x417a7800, 0x0201f800, 0x0010df61, - 0x42003000, 0x00000005, 0x0201f800, 0x0010a4ae, - 0x42000000, 0x0010bc1d, 0x0201f800, 0x0010ad1d, + 0x0201f800, 0x00103a27, 0x0401f7dd, 0x0201f800, + 0x0010a687, 0x417a7800, 0x0201f800, 0x0010e06f, + 0x42003000, 0x00000005, 0x0201f800, 0x0010a5a1, + 0x42000000, 0x0010bd1d, 0x0201f800, 0x0010ae10, 0x0401f7d1, 0x4933c857, 0x0401f853, 0x0402000b, - 0x42000800, 0x00000005, 0x0201f800, 0x00103d8a, + 0x42000800, 0x00000005, 0x0201f800, 0x00103d9d, 0x4a026203, 0x00000001, 0x4a026403, 0x00000003, - 0x0201f000, 0x00105fe8, 0x42000800, 0x00000004, - 0x0201f800, 0x00103d8a, 0x0201f800, 0x00108e64, + 0x0201f000, 0x0010608d, 0x42000800, 0x00000004, + 0x0201f800, 0x00103d9d, 0x0201f800, 0x00108f1d, 0x0402000a, 0x4c580000, 0x4200b000, 0x00000002, - 0x0201f800, 0x00108e43, 0x5c00b000, 0x0401fc1e, - 0x0201f000, 0x00020a10, 0x0401fc1b, 0x0201f800, - 0x0010a594, 0x80000580, 0x0401f633, 0x4933c857, + 0x0201f800, 0x00108efc, 0x5c00b000, 0x0401fc10, + 0x0201f000, 0x00020a10, 0x0401fc0d, 0x0201f800, + 0x0010a687, 0x80000580, 0x0401f633, 0x4933c857, 0x0401f831, 0x0402000b, 0x42000800, 0x00000009, - 0x0201f800, 0x00103d8a, 0x4a026203, 0x00000001, - 0x4a026403, 0x00000005, 0x0201f000, 0x00105fe8, - 0x0201f800, 0x0010a594, 0x42000000, 0x00000001, + 0x0201f800, 0x00103d9d, 0x4a026203, 0x00000001, + 0x4a026403, 0x00000005, 0x0201f000, 0x0010608d, + 0x0201f800, 0x0010a687, 0x42000000, 0x00000001, 0x0401f621, 0x4933c857, 0x0401f81f, 0x0402000b, - 0x42000800, 0x0000000b, 0x0201f800, 0x00103d8a, + 0x42000800, 0x0000000b, 0x0201f800, 0x00103d9d, 0x4a026203, 0x00000001, 0x4a026403, 0x00000001, - 0x0201f000, 0x00105fe8, 0x0201f800, 0x0010a594, + 0x0201f000, 0x0010608d, 0x0201f800, 0x0010a687, 0x42000000, 0x00000001, 0x0401f60f, 0x4933c857, 0x59cc0407, 0x82000580, 0x00000003, 0x04020009, 0x59cc0207, 0x82000500, 0x0000ff00, 0x82000d80, @@ -8000,1375 +8036,1380 @@ static const uint32_t isp_2400_risc_code[] = { 0x1c01f000, 0x4933c857, 0x82000540, 0x00000001, 0x1c01f000, 0x4933c857, 0x4d400000, 0x4c580000, 0x59a8021b, 0x82000540, 0x00000003, 0x4803521b, - 0x0401f85e, 0x04000005, 0x4d300000, 0x4d340000, - 0x4d440000, 0x0401f022, 0x0401f890, 0x04000031, + 0x0401f861, 0x04000005, 0x4d300000, 0x4d340000, + 0x4d440000, 0x0401f022, 0x0401f893, 0x04000031, 0x4d300000, 0x4d340000, 0x4d440000, 0x59cc0408, 0x8c00051e, 0x04020004, 0x59a8021b, 0x84000552, 0x4803521b, 0x8d0e1d20, 0x04000009, 0x42028000, 0x0000002a, 0x42028800, 0x0000ffff, 0x42003000, - 0x00000002, 0x0201f800, 0x0010a4c1, 0x42028000, + 0x00000002, 0x0201f800, 0x0010a5b4, 0x42028000, 0x0000002a, 0x4d3c0000, 0x42027800, 0x00000200, - 0x0201f800, 0x0010ded4, 0x5c027800, 0x42000000, - 0x0010bc1d, 0x0201f800, 0x0010ad1d, 0x0201f800, - 0x0010e14a, 0x4200b000, 0x00000010, 0x42028800, + 0x0201f800, 0x0010dfe1, 0x5c027800, 0x42000000, + 0x0010bd1d, 0x0201f800, 0x0010ae10, 0x0201f800, + 0x0010e25a, 0x4200b000, 0x00000010, 0x42028800, 0x000007f0, 0x83440580, 0x000007fe, 0x04000003, - 0x0201f800, 0x00103e2c, 0x81468800, 0x8058b040, + 0x0201f800, 0x00103e42, 0x81468800, 0x8058b040, 0x040207f9, 0x5c028800, 0x5c026800, 0x5c026000, - 0x0201f800, 0x00103e68, 0x59cc0800, 0x82040d00, + 0x0201f800, 0x00103e7e, 0x59cc0800, 0x82040d00, 0x00ffffff, 0x4807500f, 0x80040110, 0x48035018, 0x48038881, 0x59a80a1b, 0x84040d50, 0x59cc0013, 0x8c00053e, 0x04000003, 0x8c000536, 0x04000004, 0x59cc0017, 0x8c000536, 0x04020002, 0x84040d10, - 0x4807521b, 0x4807541b, 0x4c040000, 0x0201f800, - 0x001092c0, 0x5c000800, 0x0201f800, 0x00104716, - 0x04000007, 0x59cc0009, 0x48035028, 0x59cc000a, - 0x48035029, 0x0201f800, 0x00108b9a, 0x5c00b000, - 0x5c028000, 0x1c01f000, 0x4933c857, 0x59a8141b, - 0x82080580, 0x0000ffff, 0x0400000c, 0x4c080000, - 0x0201f800, 0x00104716, 0x5c001000, 0x0402000b, - 0x59cc0408, 0x8c000518, 0x04000005, 0x8c08150a, - 0x0400000b, 0x80000580, 0x1c01f000, 0x8c081508, - 0x040207fd, 0x0401f006, 0x82080500, 0x00000030, - 0x04020003, 0x8c081506, 0x040207f7, 0x4a03541b, - 0x0000ffff, 0x42000000, 0x0010bb6a, 0x0201f800, - 0x0010ad1d, 0x42003000, 0x0000000c, 0x42001800, - 0x0000ffff, 0x42002000, 0x00000007, 0x0201f800, - 0x00103260, 0x4d400000, 0x4d3c0000, 0x42003000, - 0x00000001, 0x0201f800, 0x0010a4c1, 0x42028000, - 0x0000002a, 0x42027800, 0x00000200, 0x0201f800, - 0x0010ded4, 0x5c028000, 0x5c027800, 0x82000540, - 0x00000001, 0x1c01f000, 0x4933c857, 0x4c580000, - 0x59a80018, 0x800001c0, 0x04000023, 0x59cc1000, - 0x82081500, 0x00ffff00, 0x80081110, 0x80080580, - 0x04000004, 0x42000000, 0x0010bc00, 0x0401f016, - 0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002, - 0x83341c00, 0x00000006, 0x0401f830, 0x04000004, - 0x42000000, 0x0010bc01, 0x0401f00b, 0x83cc1400, - 0x0000000d, 0x4200b000, 0x00000002, 0x83341c00, - 0x00000008, 0x0401f825, 0x04000007, 0x42000000, - 0x0010bc02, 0x0201f800, 0x0010ad1d, 0x82000540, - 0x00000001, 0x5c00b000, 0x1c01f000, 0x4933c857, - 0x59cc0206, 0x82000580, 0x00000014, 0x04020016, - 0x59cc0407, 0x82000580, 0x00000800, 0x04020012, - 0x59cc0207, 0x8c00051a, 0x0400000d, 0x82000500, - 0x00000f00, 0x82000580, 0x00000100, 0x04020008, - 0x59cc020a, 0x8c000508, 0x04020003, 0x8c00050a, - 0x04000003, 0x80000580, 0x1c01f000, 0x82000540, - 0x00000001, 0x1c01f000, 0x5c000000, 0x4c000000, - 0x4803c857, 0x480bc857, 0x480fc857, 0x485bc857, - 0x50080800, 0x500c0000, 0x80042580, 0x04020007, - 0x80081000, 0x800c1800, 0x8058b040, 0x040207f9, - 0x80000580, 0x1c01f000, 0x4803c857, 0x4807c857, - 0x480bc857, 0x480fc857, 0x80040480, 0x04001006, - 0x42000000, 0x00000001, 0x82040d40, 0x00000001, - 0x1c01f000, 0x41780000, 0x0401f7fc, 0x83380480, - 0x00000053, 0x02021800, 0x0010032d, 0x83380480, - 0x0000004b, 0x02001800, 0x0010032d, 0x0c01f001, - 0x00107d82, 0x00107d82, 0x00107d82, 0x00107d82, - 0x00107d80, 0x00107d80, 0x00107d80, 0x00107d82, - 0x0201f800, 0x0010032d, 0x493bc857, 0x4a026203, - 0x0000000d, 0x493a6403, 0x42000800, 0x80000000, - 0x0201f000, 0x000209b1, 0x83380580, 0x00000013, - 0x04020008, 0x59300403, 0x82000580, 0x00000050, - 0x02020800, 0x0010032d, 0x0201f000, 0x00020a10, - 0x4933c857, 0x83380580, 0x00000027, 0x04020030, - 0x4933c857, 0x0201f800, 0x0010605d, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010df61, 0x5c027800, - 0x42000000, 0x0010bc1d, 0x0201f800, 0x0010ad1d, - 0x4d2c0000, 0x59325809, 0x0201f800, 0x0010889a, - 0x492fc857, 0x0400000d, 0x4a025a05, 0x00000103, - 0x59300c02, 0x48065c07, 0x4a025a07, 0x00000029, - 0x497a580a, 0x592c0c09, 0x84040d50, 0x48065c09, - 0x0201f800, 0x000203ab, 0x5c025800, 0x42003000, - 0x00000015, 0x41782800, 0x42002000, 0x00000003, - 0x4d400000, 0x4d440000, 0x59368c03, 0x42028000, - 0x00000029, 0x0201f800, 0x00109131, 0x5c028800, - 0x5c028000, 0x0201f000, 0x00020a10, 0x83380580, - 0x00000014, 0x0402000d, 0x59300403, 0x82000c80, - 0x00000053, 0x02021800, 0x0010032d, 0x82000480, - 0x00000040, 0x02001800, 0x0010032d, 0x4933c857, - 0x4803c857, 0x0c01f00e, 0x83380580, 0x00000053, - 0x0400000a, 0x83380580, 0x00000048, 0x02020800, - 0x0010032d, 0x59300403, 0x82000580, 0x00000050, - 0x02020800, 0x0010032d, 0x1c01f000, 0x00107df8, - 0x00107df6, 0x00107df6, 0x00107df6, 0x00107df6, - 0x00107df6, 0x00107df6, 0x00107df6, 0x00107df6, - 0x00107df6, 0x00107df6, 0x00107e0f, 0x00107e0f, - 0x00107e0f, 0x00107e0f, 0x00107df6, 0x00107e0f, - 0x00107df6, 0x00107e0f, 0x0201f800, 0x0010032d, - 0x4933c857, 0x0201f800, 0x0010605d, 0x0201f800, - 0x0010889a, 0x02000000, 0x00020a10, 0x4d2c0000, - 0x59325809, 0x4a025a05, 0x00000103, 0x59300402, - 0x48025c07, 0x4a025a07, 0x00000006, 0x497a580a, - 0x0201f800, 0x000203ab, 0x5c025800, 0x0201f800, - 0x0010899c, 0x0201f000, 0x00020a10, 0x4933c857, - 0x0201f800, 0x0010605d, 0x0201f000, 0x00020a10, - 0x0201f800, 0x0010032d, 0x5930001d, 0x800001c0, - 0x02020800, 0x0010911f, 0x59300004, 0x8c00053e, - 0x0402002f, 0x0201f800, 0x001091e3, 0x040200c3, - 0x59325809, 0x592c0c09, 0x59cc2808, 0x82141d00, - 0x00000c00, 0x04000002, 0x59cc1809, 0x84040d58, - 0x48065c09, 0x82143500, 0x00000fff, 0x0402002a, - 0x59340200, 0x8c00050e, 0x040200a9, 0x0201f800, - 0x00020abe, 0x04020006, 0x4a025a07, 0x00000000, - 0x59300812, 0x800409c0, 0x04020990, 0x4a025a05, - 0x00000103, 0x48065808, 0x480e580b, 0x901409c0, - 0x4806580a, 0x59300c02, 0x48065c07, 0x0201f800, - 0x00108e69, 0x0201f800, 0x000203ab, 0x0201f800, - 0x0010410c, 0x59cc0008, 0x8c000518, 0x02020000, - 0x00108a6d, 0x0201f000, 0x00020a10, 0x0201f800, - 0x0010644d, 0x040007d0, 0x4d3c0000, 0x42027800, - 0x00000002, 0x0201f800, 0x00108487, 0x5c027800, - 0x0401f7c9, 0x4817c857, 0x480fc857, 0x82180500, - 0x000000ff, 0x0400000e, 0x592c0205, 0x82000500, - 0x000000ff, 0x82000580, 0x00000048, 0x04020008, - 0x592c0408, 0x800001c0, 0x04000005, 0x0201f800, - 0x0010900d, 0x0201f000, 0x00109051, 0x82180d00, - 0x00000c00, 0x04000004, 0x59340200, 0x8c00050e, - 0x04020058, 0x4a025a07, 0x00000000, 0x41782000, - 0x8c183510, 0x04000009, 0x59cc200b, 0x801021c0, - 0x04000006, 0x59cc000c, 0x82000500, 0x000000ff, - 0x04000002, 0x4803c857, 0x4812580d, 0x41780000, - 0x8c183512, 0x04000002, 0x59cc000a, 0x4802580c, - 0x80100c00, 0x040007ae, 0x82041480, 0x0000001d, - 0x04001006, 0x592c0405, 0x8c00051e, 0x04000022, - 0x42000800, 0x0000001c, 0x4c040000, 0x4c0c0000, - 0x4c140000, 0x0201f800, 0x00020abe, 0x04020006, - 0x4a025a07, 0x00000000, 0x59300812, 0x800409c0, - 0x04020932, 0x5c002800, 0x5c001800, 0x4a025a05, - 0x00000103, 0x48065808, 0x480e580b, 0x901409c0, - 0x4806580a, 0x5c000800, 0x4c500000, 0x4c540000, - 0x83cca400, 0x0000000c, 0x832cac00, 0x0000000e, - 0x0201f800, 0x0010841c, 0x5c00a800, 0x5c00a000, - 0x0401f795, 0x4c040000, 0x4c0c0000, 0x4c140000, - 0x0201f800, 0x00020abe, 0x04020006, 0x4a025a07, - 0x00000000, 0x59300812, 0x800409c0, 0x04020913, - 0x48065808, 0x5c002800, 0x5c001800, 0x59301402, - 0x480a5c07, 0x480e580b, 0x901401c0, 0x4802580a, - 0x0201f800, 0x00108e69, 0x5c000800, 0x0201f800, - 0x001083c6, 0x0201f800, 0x00108401, 0x0401f780, - 0x592c020b, 0x8c000502, 0x040007a7, 0x592c0209, - 0x8c00050e, 0x040207a4, 0x59300012, 0x800c0d80, - 0x040007a1, 0x4803c857, 0x480fc857, 0x8c183514, - 0x02000000, 0x00108aad, 0x80000540, 0x0400079a, - 0x4807c856, 0x0201f000, 0x00108aad, 0x592c020b, - 0x8c000502, 0x04000756, 0x59300012, 0x800001c0, - 0x04000756, 0x592c0209, 0x8c00050e, 0x04020753, - 0x0201f000, 0x00108aad, 0x1c01f000, 0x59cc2006, - 0x59cc2807, 0x0401f040, 0x0401f03f, 0x1c01f000, - 0x4933c857, 0x59300004, 0x8c00053e, 0x04020035, - 0x5930001d, 0x800001c0, 0x02020800, 0x0010911f, - 0x59325809, 0x592c0c09, 0x41782800, 0x41781800, - 0x84040d58, 0x48065c09, 0x41783000, 0x59340200, - 0x8c00050e, 0x0402001b, 0x0201f800, 0x00020abe, - 0x04020007, 0x4a025a07, 0x00000000, 0x59300812, - 0x4807c857, 0x800409c0, 0x040208c4, 0x4a025a05, - 0x00000103, 0x48065808, 0x480e580b, 0x901409c0, - 0x4806580a, 0x4933c857, 0x59300c02, 0x48065c07, - 0x0201f800, 0x00108e69, 0x0201f800, 0x000203ab, - 0x0201f800, 0x0010410c, 0x0201f000, 0x00020a10, - 0x592c020b, 0x8c000502, 0x040007e4, 0x59300012, - 0x4803c857, 0x800001c0, 0x040007e3, 0x592c0209, - 0x8c00050e, 0x040207e0, 0x0201f000, 0x00108aad, - 0x0201f800, 0x0010644d, 0x040007ca, 0x4933c857, - 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x4010b800, - 0x4014c000, 0x5930001d, 0x800001c0, 0x4c140000, - 0x02020800, 0x0010911f, 0x5c002800, 0x59325809, - 0x592c020b, 0x8c000502, 0x04020026, 0x8c000500, - 0x0400002b, 0x4a026203, 0x00000002, 0x4a026403, - 0x00000043, 0x405c0000, 0x592c0810, 0x80040c80, - 0x40600000, 0x80040480, 0x0400101e, 0x8060c1c0, - 0x04000014, 0x59300004, 0x8c00053e, 0x0402000c, - 0x485e6014, 0x48626012, 0x497a6205, 0x5c00c000, - 0x5c00b800, 0x0201f800, 0x00100cee, 0x0402000f, - 0x59300804, 0x0201f000, 0x000209a3, 0x4c140000, - 0x0201f800, 0x0010644d, 0x5c002800, 0x040007f1, - 0x5c00c000, 0x5c00b800, 0x0201f000, 0x00107134, - 0x5c00c000, 0x5c00b800, 0x4933c857, 0x1c01f000, - 0x4807c857, 0x4004c000, 0x0401f7e1, 0x4803c857, - 0x0401f7f4, 0x83380480, 0x00000058, 0x04021005, - 0x83380480, 0x00000040, 0x04001002, 0x0c01f002, - 0x1c01f000, 0x00107f81, 0x00107f81, 0x00107f81, - 0x00107f81, 0x00107f81, 0x00107f81, 0x00107f81, - 0x00107f81, 0x00107f81, 0x00107f81, 0x00107f83, - 0x00107f81, 0x00107f81, 0x00107f81, 0x00107f81, - 0x00107f90, 0x00107f81, 0x00107f81, 0x00107f81, - 0x00107f81, 0x00107fbe, 0x00107f81, 0x00107f81, - 0x00107f81, 0x0201f800, 0x0010032d, 0x4933c857, - 0x0201f800, 0x001062a1, 0x4a026203, 0x00000002, - 0x59a8002c, 0x48026205, 0x59300012, 0x59300816, - 0x80040c80, 0x48066016, 0x0201f000, 0x0010603d, - 0x4933c857, 0x0201f800, 0x0010603d, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010df61, 0x5c027800, - 0x42000000, 0x0010bc1d, 0x0201f800, 0x0010ad1d, - 0x0201f800, 0x0010889a, 0x04000010, 0x4d2c0000, - 0x59325809, 0x4a025a05, 0x00000103, 0x59300402, - 0x48025c07, 0x4a025a07, 0x00000029, 0x497a580a, + 0x4807521b, 0x4807541b, 0x59cc0408, 0x8c000518, + 0x04000005, 0x4c040000, 0x0201f800, 0x00109378, + 0x5c000800, 0x0201f800, 0x00104755, 0x04000007, + 0x59cc0009, 0x48035028, 0x59cc000a, 0x48035029, + 0x0201f800, 0x00108c53, 0x5c00b000, 0x5c028000, + 0x1c01f000, 0x4933c857, 0x59a8141b, 0x82080580, + 0x0000ffff, 0x0400000c, 0x4c080000, 0x0201f800, + 0x00104755, 0x5c001000, 0x0402000b, 0x59cc0408, + 0x8c000518, 0x04000005, 0x8c08150a, 0x0400000b, + 0x80000580, 0x1c01f000, 0x8c081508, 0x040207fd, + 0x0401f006, 0x82080500, 0x00000030, 0x04020003, + 0x8c081506, 0x040207f7, 0x4a03541b, 0x0000ffff, + 0x42000000, 0x0010bc6a, 0x0201f800, 0x0010ae10, + 0x42003000, 0x0000000c, 0x42001800, 0x0000ffff, + 0x42002000, 0x00000007, 0x0201f800, 0x0010326a, + 0x4d400000, 0x4d3c0000, 0x42003000, 0x00000001, + 0x0201f800, 0x0010a5b4, 0x42028000, 0x0000002a, + 0x42027800, 0x00000200, 0x0201f800, 0x0010dfe1, + 0x5c028000, 0x5c027800, 0x82000540, 0x00000001, + 0x1c01f000, 0x4933c857, 0x4c580000, 0x59a80018, + 0x800001c0, 0x04000023, 0x59cc1000, 0x82081500, + 0x00ffff00, 0x80081110, 0x80080580, 0x04000004, + 0x42000000, 0x0010bd00, 0x0401f016, 0x83cc1400, + 0x0000000b, 0x4200b000, 0x00000002, 0x83341c00, + 0x00000006, 0x0401f830, 0x04000004, 0x42000000, + 0x0010bd01, 0x0401f00b, 0x83cc1400, 0x0000000d, + 0x4200b000, 0x00000002, 0x83341c00, 0x00000008, + 0x0401f825, 0x04000007, 0x42000000, 0x0010bd02, + 0x0201f800, 0x0010ae10, 0x82000540, 0x00000001, + 0x5c00b000, 0x1c01f000, 0x4933c857, 0x59cc0206, + 0x82000580, 0x00000014, 0x04020016, 0x59cc0407, + 0x82000580, 0x00000800, 0x04020012, 0x59cc0207, + 0x8c00051a, 0x0400000d, 0x82000500, 0x00000f00, + 0x82000580, 0x00000100, 0x04020008, 0x59cc020a, + 0x8c000508, 0x04020003, 0x8c00050a, 0x04000003, + 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, + 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, + 0x480bc857, 0x480fc857, 0x485bc857, 0x50080800, + 0x500c0000, 0x80042580, 0x04020007, 0x80081000, + 0x800c1800, 0x8058b040, 0x040207f9, 0x80000580, + 0x1c01f000, 0x4803c857, 0x4807c857, 0x480bc857, + 0x480fc857, 0x80040480, 0x04001006, 0x42000000, + 0x00000001, 0x82040d40, 0x00000001, 0x1c01f000, + 0x41780000, 0x0401f7fc, 0x83380480, 0x00000053, + 0x02021800, 0x0010032d, 0x83380480, 0x0000004b, + 0x02001800, 0x0010032d, 0x0c01f001, 0x00107e29, + 0x00107e29, 0x00107e29, 0x00107e29, 0x00107e27, + 0x00107e27, 0x00107e27, 0x00107e29, 0x0201f800, + 0x0010032d, 0x493bc857, 0x4a026203, 0x0000000d, + 0x493a6403, 0x42000800, 0x80000000, 0x0201f000, + 0x000209b1, 0x83380580, 0x00000013, 0x04020008, + 0x59300403, 0x82000580, 0x00000050, 0x02020800, + 0x0010032d, 0x0201f000, 0x00020a10, 0x4933c857, + 0x83380580, 0x00000027, 0x04020030, 0x4933c857, + 0x0201f800, 0x00106102, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010e06f, 0x5c027800, 0x42000000, + 0x0010bd1d, 0x0201f800, 0x0010ae10, 0x4d2c0000, + 0x59325809, 0x0201f800, 0x00108953, 0x492fc857, + 0x0400000d, 0x4a025a05, 0x00000103, 0x59300c02, + 0x48065c07, 0x4a025a07, 0x00000029, 0x497a580a, 0x592c0c09, 0x84040d50, 0x48065c09, 0x0201f800, - 0x000203ab, 0x5c025800, 0x42003000, 0x00000014, - 0x41782800, 0x4d400000, 0x4d440000, 0x59368c03, - 0x42002000, 0x00000002, 0x42028000, 0x00000029, - 0x0201f800, 0x00109131, 0x5c028800, 0x5c028000, - 0x0201f000, 0x00020a10, 0x4933c857, 0x59300809, - 0x4978080a, 0x4978080b, 0x58041409, 0x84081558, - 0x48080c09, 0x1c01f000, 0x4807c857, 0x8c040d3e, - 0x04020024, 0x497a5a07, 0x59300020, 0x80000540, - 0x04000018, 0x497a5a07, 0x4c040000, 0x4c080000, - 0x4c0c0000, 0x4c100000, 0x4c140000, 0x40002800, - 0x58141003, 0x40040000, 0x80081480, 0x48082803, - 0x40140000, 0x0201f800, 0x00100a76, 0x5c002800, - 0x5c002000, 0x5c001800, 0x5c001000, 0x5c000800, - 0x592c0207, 0x80000540, 0x04020009, 0x0401f005, - 0x592c0409, 0x8c00051c, 0x04000002, 0x592c0803, - 0x4807c857, 0x4a025a07, 0x00000015, 0x1c01f000, - 0x59300020, 0x80000540, 0x04000009, 0x4a025a07, - 0x00000011, 0x59300020, 0x4c040000, 0x0201f800, - 0x00100a76, 0x5c000800, 0x0401f7f5, 0x4807c856, - 0x4a025a07, 0x00000007, 0x1c01f000, 0x83380480, - 0x00000058, 0x04021007, 0x83380480, 0x00000040, - 0x04001004, 0x4d2c0000, 0x0c01f803, 0x5c025800, - 0x1c01f000, 0x0010801d, 0x0010801d, 0x0010801d, - 0x0010801d, 0x0010801d, 0x00108020, 0x0010801f, - 0x0010801d, 0x001080a5, 0x0010801d, 0x0010801d, - 0x0010801d, 0x0010801d, 0x0010801d, 0x0010801d, - 0x0010801d, 0x0010801d, 0x0010801d, 0x0010801d, - 0x00108171, 0x0010819c, 0x00108179, 0x0010801f, - 0x001081a8, 0x0201f800, 0x0010032d, 0x1c01f000, - 0x5930001d, 0x800001c0, 0x02020800, 0x0010911f, - 0x59300008, 0x8c00050e, 0x0400007e, 0x8c000500, - 0x04000070, 0x8c00051c, 0x04000009, 0x84000500, - 0x48026008, 0x59325809, 0x592c3c09, 0x841c3d58, - 0x481e5c09, 0x0201f000, 0x00020a70, 0x59325809, - 0x592c3c09, 0x841c3d58, 0x59300008, 0x8c00051c, - 0x040207f3, 0x481e5c09, 0x42000000, 0x00000005, - 0x40000000, 0x80000040, 0x040207fe, 0x59300008, - 0x8c00051c, 0x040207ea, 0x59cc0808, 0x592c0205, - 0x82000500, 0x000000ff, 0x82000580, 0x00000048, - 0x0402000c, 0x497a580c, 0x82040500, 0x000000ff, - 0x04000008, 0x592c0408, 0x800001c0, 0x04000005, - 0x0201f800, 0x0010900d, 0x0201f000, 0x00100b8e, - 0x900421c0, 0x4812580a, 0x41782000, 0x82040500, - 0x00000c00, 0x04000002, 0x59cc2009, 0x82043500, - 0x00000fff, 0x04020027, 0x481e5c09, 0x4a025a07, - 0x00000000, 0x801831c0, 0x02000000, 0x00100b8e, - 0x41782000, 0x8c183510, 0x04000002, 0x59cc200b, - 0x4812580d, 0x41780000, 0x8c183512, 0x04000002, - 0x59cc000a, 0x4802580c, 0x80100c00, 0x02001800, - 0x0010032d, 0x02000000, 0x00100b8e, 0x82041480, - 0x0000001d, 0x0402100c, 0x4c500000, 0x4c540000, - 0x83cca400, 0x0000000c, 0x832cac00, 0x0000000e, - 0x0401fba0, 0x5c00a800, 0x5c00a000, 0x0201f000, - 0x00100b8e, 0x0401fb45, 0x0201f000, 0x00100b8e, - 0x412c7800, 0x0201f800, 0x0010056f, 0x02000800, - 0x0010032d, 0x492c780a, 0x841c3d52, 0x481c7c09, - 0x4a025a05, 0x00000103, 0x4812580b, 0x900401c0, - 0x4802580a, 0x583c0405, 0x583c1006, 0x583c2209, - 0x48025c05, 0x480a5806, 0x48125a09, 0x0401f7c7, - 0x8c000524, 0x04000792, 0x59325809, 0x4c000000, - 0x592c0409, 0x8c00051c, 0x5c000000, 0x04020003, - 0x4a026012, 0xffffffff, 0x84000524, 0x0401f788, - 0x1c01f000, 0x59a8002c, 0x48026205, 0x59325809, - 0x4a026203, 0x00000002, 0x592c2409, 0x59300808, - 0x4933c857, 0x4807c857, 0x592c0205, 0x82000500, - 0x000000ff, 0x82000580, 0x00000048, 0x04020004, - 0x8c102500, 0x02020000, 0x00109051, 0x4a025a07, - 0x00000000, 0x8c040d1e, 0x04000027, 0x41780800, - 0x497a580a, 0x592c1c0a, 0x59300012, 0x59341200, - 0x497a6205, 0x8c08150e, 0x04020070, 0x4807c857, - 0x4806580b, 0x80000d40, 0x04020f00, 0x59300402, - 0x48025c07, 0x48065808, 0x4a025a05, 0x00000103, - 0x4c040000, 0x4c0c0000, 0x4c100000, 0x0201f800, - 0x00108e69, 0x5c002000, 0x5c001800, 0x5c000800, - 0x8c102512, 0x0402001a, 0x4c0c0000, 0x0201f800, - 0x000203ab, 0x0201f800, 0x0010410c, 0x5c001800, - 0x8c0c1d18, 0x02000000, 0x00020a10, 0x0201f000, - 0x00108a6d, 0x4813c857, 0x8c102518, 0x0400004d, - 0x41780800, 0x592c1c0a, 0x820c0580, 0x00001000, - 0x040007d6, 0x8c102512, 0x040007d4, 0x592c780a, - 0x583c080b, 0x583c1c0a, 0x0401f7d0, 0x4807c857, - 0x592c780a, 0x59300402, 0x592c1405, 0x8c08151e, - 0x0402000d, 0x592c1207, 0x48007c07, 0x48047808, - 0x48087a07, 0x84102512, 0x48107c09, 0x4c0c0000, - 0x0201f800, 0x00100589, 0x403e5800, 0x0401fb02, - 0x0401f7d9, 0x48025c07, 0x48065808, 0x583c080d, - 0x583c000c, 0x80040c00, 0x82041480, 0x0000001d, - 0x04001006, 0x583c1001, 0x480a5801, 0x49787801, - 0x42000800, 0x0000001c, 0x82040c00, 0x00000014, - 0x4c0c0000, 0x4c500000, 0x4c540000, 0x823ca400, - 0x00000009, 0x832cac00, 0x00000009, 0x4c100000, - 0x4c3c0000, 0x0401fb03, 0x5c007800, 0x5c002000, - 0x5c00a800, 0x5c00a000, 0x84102512, 0x48125c09, - 0x403e5800, 0x0201f800, 0x00100589, 0x0201f800, - 0x00108e69, 0x42034000, 0x0010b7fa, 0x59a1d806, - 0x80edd9c0, 0x02000800, 0x0010032d, 0x48efc857, - 0x58ec0008, 0x4803c857, 0x0801f800, 0x0401f7aa, - 0x4933c857, 0x1c01f000, 0x59301415, 0x480bc857, - 0x8c08151c, 0x0402000e, 0x80000540, 0x4803c857, - 0x0400078b, 0x80042c80, 0x04021789, 0x8c081514, - 0x04020005, 0x592c0810, 0x4807c857, 0x80040480, - 0x48026017, 0x8408155c, 0x480a6415, 0x59301008, - 0x8408151e, 0x480a6008, 0x4c100000, 0x4c3c0000, - 0x4d400000, 0x592e8207, 0x4a025a07, 0x00000001, - 0x0201f800, 0x00108e69, 0x49425a07, 0x5c028000, - 0x5c007800, 0x5c002000, 0x497a580a, 0x8c102512, - 0x04000006, 0x4d2c0000, 0x403e5800, 0x0201f800, - 0x00100589, 0x5c025800, 0x82102500, 0xffffedff, - 0x48125c09, 0x59301006, 0x800811c0, 0x02000000, - 0x00108aad, 0x59a8002c, 0x80080480, 0x02021000, - 0x00108aad, 0x4a025a05, 0x00000103, 0x4a025a07, - 0x00000006, 0x497a5c0a, 0x492fc857, 0x0201f800, - 0x000203ab, 0x0201f800, 0x0010410c, 0x0201f000, - 0x00020a10, 0x59325809, 0x592c0409, 0x8c000518, - 0x04000004, 0x412df800, 0x0201f000, 0x00100bad, - 0x1c01f000, 0x4933c857, 0x59325809, 0x497a580a, - 0x4a025a07, 0x00000000, 0x4a025a05, 0x00000103, - 0x59300812, 0x4807c857, 0x800409c0, 0x0402000c, - 0x48065808, 0x59300c02, 0x48065c07, 0x0201f800, - 0x00108e69, 0x0201f800, 0x000203ab, 0x0201f800, - 0x0010410c, 0x0201f000, 0x00020a10, 0x59340200, - 0x8c00050e, 0x04020005, 0x59300812, 0x0401fe33, - 0x48065808, 0x0401f7f0, 0x592c0209, 0x8c00050e, - 0x040207fa, 0x4933c857, 0x0201f000, 0x00108aad, - 0x4933c857, 0x59325809, 0x812e59c0, 0x02000800, - 0x0010032d, 0x592c020b, 0x8c000502, 0x02000800, - 0x0010032d, 0x4a026006, 0x00000002, 0x1c01f000, - 0x5930001d, 0x800001c0, 0x02020800, 0x0010911f, - 0x59300008, 0x4933c857, 0x4803c857, 0x8c00050e, - 0x04000037, 0x8c000500, 0x04000029, 0x8c00051c, - 0x0400000a, 0x84000500, 0x48026008, 0x59325809, - 0x592c3c09, 0x481fc857, 0x841c3d58, 0x481e5c09, + 0x000203ab, 0x5c025800, 0x42003000, 0x00000015, + 0x41782800, 0x42002000, 0x00000003, 0x4d400000, + 0x4d440000, 0x59368c03, 0x42028000, 0x00000029, + 0x0201f800, 0x001091ea, 0x5c028800, 0x5c028000, + 0x0201f000, 0x00020a10, 0x83380580, 0x00000014, + 0x0402000d, 0x59300403, 0x82000c80, 0x00000053, + 0x02021800, 0x0010032d, 0x82000480, 0x00000040, + 0x02001800, 0x0010032d, 0x4933c857, 0x4803c857, + 0x0c01f00e, 0x83380580, 0x00000053, 0x0400000a, + 0x83380580, 0x00000048, 0x02020800, 0x0010032d, + 0x59300403, 0x82000580, 0x00000050, 0x02020800, + 0x0010032d, 0x1c01f000, 0x00107e9f, 0x00107e9d, + 0x00107e9d, 0x00107e9d, 0x00107e9d, 0x00107e9d, + 0x00107e9d, 0x00107e9d, 0x00107e9d, 0x00107e9d, + 0x00107e9d, 0x00107eb6, 0x00107eb6, 0x00107eb6, + 0x00107eb6, 0x00107e9d, 0x00107eb6, 0x00107e9d, + 0x00107eb6, 0x0201f800, 0x0010032d, 0x4933c857, + 0x0201f800, 0x00106102, 0x0201f800, 0x00108953, + 0x02000000, 0x00020a10, 0x4d2c0000, 0x59325809, + 0x4a025a05, 0x00000103, 0x59300402, 0x48025c07, + 0x4a025a07, 0x00000006, 0x497a580a, 0x0201f800, + 0x000203ab, 0x5c025800, 0x0201f800, 0x00108a55, + 0x0201f000, 0x00020a10, 0x4933c857, 0x0201f800, + 0x00106102, 0x0201f000, 0x00020a10, 0x0201f800, + 0x0010032d, 0x5930001d, 0x800001c0, 0x02020800, + 0x001091d8, 0x59300004, 0x8c00053e, 0x0402002f, + 0x0201f800, 0x0010929b, 0x040200c3, 0x59325809, + 0x592c0c09, 0x59cc2808, 0x82141d00, 0x00000c00, + 0x04000002, 0x59cc1809, 0x84040d58, 0x48065c09, + 0x82143500, 0x00000fff, 0x0402002a, 0x59340200, + 0x8c00050e, 0x040200a9, 0x0201f800, 0x00020abe, + 0x04020006, 0x4a025a07, 0x00000000, 0x59300812, + 0x800409c0, 0x04020990, 0x4a025a05, 0x00000103, + 0x48065808, 0x480e580b, 0x901409c0, 0x4806580a, + 0x59300c02, 0x48065c07, 0x0201f800, 0x00108f22, + 0x0201f800, 0x000203ab, 0x0201f800, 0x00104126, + 0x59cc0008, 0x8c000518, 0x02020000, 0x00108b26, + 0x0201f000, 0x00020a10, 0x0201f800, 0x001064f2, + 0x040007d0, 0x4d3c0000, 0x42027800, 0x00000002, + 0x0201f800, 0x0010853c, 0x5c027800, 0x0401f7c9, + 0x4817c857, 0x480fc857, 0x82180500, 0x000000ff, + 0x0400000e, 0x592c0205, 0x82000500, 0x000000ff, + 0x82000580, 0x00000048, 0x04020008, 0x592c0408, + 0x800001c0, 0x04000005, 0x0201f800, 0x001090c6, + 0x0201f000, 0x0010910a, 0x82180d00, 0x00000c00, + 0x04000004, 0x59340200, 0x8c00050e, 0x04020058, + 0x4a025a07, 0x00000000, 0x41782000, 0x8c183510, + 0x04000009, 0x59cc200b, 0x801021c0, 0x04000006, + 0x59cc000c, 0x82000500, 0x000000ff, 0x04000002, + 0x4803c857, 0x4812580d, 0x41780000, 0x8c183512, + 0x04000002, 0x59cc000a, 0x4802580c, 0x80100c00, + 0x040007ae, 0x82041480, 0x0000001d, 0x04001006, + 0x592c0405, 0x8c00051e, 0x04000022, 0x42000800, + 0x0000001c, 0x4c040000, 0x4c0c0000, 0x4c140000, + 0x0201f800, 0x00020abe, 0x04020006, 0x4a025a07, + 0x00000000, 0x59300812, 0x800409c0, 0x04020932, + 0x5c002800, 0x5c001800, 0x4a025a05, 0x00000103, + 0x48065808, 0x480e580b, 0x901409c0, 0x4806580a, + 0x5c000800, 0x4c500000, 0x4c540000, 0x83cca400, + 0x0000000c, 0x832cac00, 0x0000000e, 0x0201f800, + 0x001084d1, 0x5c00a800, 0x5c00a000, 0x0401f795, + 0x4c040000, 0x4c0c0000, 0x4c140000, 0x0201f800, + 0x00020abe, 0x04020006, 0x4a025a07, 0x00000000, + 0x59300812, 0x800409c0, 0x04020913, 0x48065808, + 0x5c002800, 0x5c001800, 0x59301402, 0x480a5c07, + 0x480e580b, 0x901401c0, 0x4802580a, 0x0201f800, + 0x00108f22, 0x5c000800, 0x0201f800, 0x0010847b, + 0x0201f800, 0x001084b6, 0x0401f780, 0x592c020b, + 0x8c000502, 0x040007a7, 0x592c0209, 0x8c00050e, + 0x040207a4, 0x59300012, 0x800c0d80, 0x040007a1, + 0x4803c857, 0x480fc857, 0x8c183514, 0x02000000, + 0x00108b66, 0x80000540, 0x0400079a, 0x4807c856, + 0x0201f000, 0x00108b66, 0x592c020b, 0x8c000502, + 0x04000756, 0x59300012, 0x800001c0, 0x04000756, + 0x592c0209, 0x8c00050e, 0x04020753, 0x0201f000, + 0x00108b66, 0x1c01f000, 0x59cc2006, 0x59cc2807, + 0x0401f040, 0x0401f03f, 0x1c01f000, 0x4933c857, + 0x59300004, 0x8c00053e, 0x04020035, 0x5930001d, + 0x800001c0, 0x02020800, 0x001091d8, 0x59325809, + 0x592c0c09, 0x41782800, 0x41781800, 0x84040d58, + 0x48065c09, 0x41783000, 0x59340200, 0x8c00050e, + 0x0402001b, 0x0201f800, 0x00020abe, 0x04020007, + 0x4a025a07, 0x00000000, 0x59300812, 0x4807c857, + 0x800409c0, 0x040208c4, 0x4a025a05, 0x00000103, + 0x48065808, 0x480e580b, 0x901409c0, 0x4806580a, + 0x4933c857, 0x59300c02, 0x48065c07, 0x0201f800, + 0x00108f22, 0x0201f800, 0x000203ab, 0x0201f800, + 0x00104126, 0x0201f000, 0x00020a10, 0x592c020b, + 0x8c000502, 0x040007e4, 0x59300012, 0x4803c857, + 0x800001c0, 0x040007e3, 0x592c0209, 0x8c00050e, + 0x040207e0, 0x0201f000, 0x00108b66, 0x0201f800, + 0x001064f2, 0x040007ca, 0x4933c857, 0x1c01f000, + 0x4c5c0000, 0x4c600000, 0x4010b800, 0x4014c000, + 0x5930001d, 0x800001c0, 0x4c140000, 0x02020800, + 0x001091d8, 0x5c002800, 0x59325809, 0x592c020b, + 0x8c000502, 0x04020026, 0x8c000500, 0x0400002b, + 0x4a026203, 0x00000002, 0x4a026403, 0x00000043, + 0x405c0000, 0x592c0810, 0x80040c80, 0x40600000, + 0x80040480, 0x0400101e, 0x8060c1c0, 0x04000014, + 0x59300004, 0x8c00053e, 0x0402000c, 0x485e6014, + 0x48626012, 0x497a6205, 0x5c00c000, 0x5c00b800, + 0x0201f800, 0x00100cef, 0x0402000f, 0x59300804, + 0x0201f000, 0x000209a3, 0x4c140000, 0x0201f800, + 0x001064f2, 0x5c002800, 0x040007f1, 0x5c00c000, + 0x5c00b800, 0x0201f000, 0x001071c7, 0x5c00c000, + 0x5c00b800, 0x4933c857, 0x1c01f000, 0x4807c857, + 0x4004c000, 0x0401f7e1, 0x4803c857, 0x0401f7f4, + 0x83380480, 0x00000058, 0x04021005, 0x83380480, + 0x00000040, 0x04001002, 0x0c01f002, 0x1c01f000, + 0x00108028, 0x00108028, 0x00108028, 0x00108028, + 0x00108028, 0x00108028, 0x00108028, 0x00108028, + 0x00108028, 0x00108028, 0x0010802a, 0x00108028, + 0x00108028, 0x00108028, 0x00108028, 0x00108037, + 0x00108028, 0x00108028, 0x00108028, 0x00108028, + 0x00108065, 0x00108028, 0x00108028, 0x00108028, + 0x0201f800, 0x0010032d, 0x4933c857, 0x0201f800, + 0x00106346, 0x4a026203, 0x00000002, 0x59a8002c, + 0x48026205, 0x59300012, 0x59300816, 0x80040c80, + 0x48066016, 0x0201f000, 0x001060e2, 0x4933c857, + 0x0201f800, 0x001060e2, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010e06f, 0x5c027800, 0x42000000, + 0x0010bd1d, 0x0201f800, 0x0010ae10, 0x0201f800, + 0x00108953, 0x04000010, 0x4d2c0000, 0x59325809, + 0x4a025a05, 0x00000103, 0x59300402, 0x48025c07, + 0x4a025a07, 0x00000029, 0x497a580a, 0x592c0c09, + 0x84040d50, 0x48065c09, 0x0201f800, 0x000203ab, + 0x5c025800, 0x42003000, 0x00000014, 0x41782800, + 0x4d400000, 0x4d440000, 0x59368c03, 0x42002000, + 0x00000002, 0x42028000, 0x00000029, 0x0201f800, + 0x001091ea, 0x5c028800, 0x5c028000, 0x0201f000, + 0x00020a10, 0x4933c857, 0x59300809, 0x4978080a, + 0x4978080b, 0x58041409, 0x84081558, 0x48080c09, + 0x1c01f000, 0x4807c857, 0x8c040d3e, 0x04020024, + 0x497a5a07, 0x59300020, 0x80000540, 0x04000018, + 0x497a5a07, 0x4c040000, 0x4c080000, 0x4c0c0000, + 0x4c100000, 0x4c140000, 0x40002800, 0x58141003, + 0x40040000, 0x80081480, 0x48082803, 0x40140000, + 0x0201f800, 0x00100a77, 0x5c002800, 0x5c002000, + 0x5c001800, 0x5c001000, 0x5c000800, 0x592c0207, + 0x80000540, 0x04020009, 0x0401f005, 0x592c0409, + 0x8c00051c, 0x04000002, 0x592c0803, 0x4807c857, + 0x4a025a07, 0x00000015, 0x1c01f000, 0x59300020, + 0x80000540, 0x04000009, 0x4a025a07, 0x00000011, + 0x59300020, 0x4c040000, 0x0201f800, 0x00100a77, + 0x5c000800, 0x0401f7f5, 0x4807c856, 0x4a025a07, + 0x00000007, 0x1c01f000, 0x83380480, 0x00000058, + 0x04021007, 0x83380480, 0x00000040, 0x04001004, + 0x4d2c0000, 0x0c01f803, 0x5c025800, 0x1c01f000, + 0x001080c4, 0x001080c4, 0x001080c4, 0x001080c4, + 0x001080c4, 0x001080c7, 0x001080c6, 0x001080c4, + 0x0010814c, 0x001080c4, 0x001080c4, 0x001080c4, + 0x001080c4, 0x001080c4, 0x001080c4, 0x001080c4, + 0x001080c4, 0x001080c4, 0x001080c4, 0x00108218, + 0x00108243, 0x00108220, 0x001080c6, 0x0010824f, + 0x0201f800, 0x0010032d, 0x1c01f000, 0x5930001d, + 0x800001c0, 0x02020800, 0x001091d8, 0x59300008, + 0x8c00050e, 0x0400007e, 0x8c000500, 0x04000070, + 0x8c00051c, 0x04000009, 0x84000500, 0x48026008, + 0x59325809, 0x592c3c09, 0x841c3d58, 0x481e5c09, 0x0201f000, 0x00020a70, 0x59325809, 0x592c3c09, - 0x841c3d58, 0x59300008, 0x8c00051c, 0x040207f2, + 0x841c3d58, 0x59300008, 0x8c00051c, 0x040207f3, 0x481e5c09, 0x42000000, 0x00000005, 0x40000000, 0x80000040, 0x040207fe, 0x59300008, 0x8c00051c, - 0x040207e9, 0x592c0205, 0x82000500, 0x000000ff, - 0x82000580, 0x00000048, 0x04020003, 0x497a580c, - 0x0401f002, 0x497a580a, 0x481e5c09, 0x4a025a07, - 0x00000000, 0x0201f000, 0x00100b8e, 0x8c000524, - 0x040007d9, 0x59325809, 0x4c000000, 0x592c0409, - 0x8c00051c, 0x5c000000, 0x04020003, 0x4a026012, - 0xffffffff, 0x84000524, 0x0401f7cf, 0x1c01f000, - 0x4933c857, 0x41780800, 0x83380480, 0x00000058, - 0x0402100b, 0x83380480, 0x00000040, 0x04001008, - 0x4d2c0000, 0x59325809, 0x812e59c0, 0x0c020806, - 0x5c025800, 0x0201f000, 0x00020a10, 0x493bc857, - 0x1c01f000, 0x00108211, 0x00108211, 0x00108211, - 0x00108211, 0x00108211, 0x00108213, 0x00108211, - 0x00108211, 0x00108211, 0x00108211, 0x00108211, - 0x00108211, 0x00108211, 0x00108211, 0x00108211, - 0x00108211, 0x00108211, 0x00108211, 0x00108211, - 0x00108211, 0x00108216, 0x00108211, 0x00108211, - 0x00108211, 0x0201f800, 0x0010032d, 0x59cc0808, - 0x497a5808, 0x4807c857, 0x59300402, 0x48025c07, - 0x4a025a05, 0x00000103, 0x900401c0, 0x4802580a, - 0x4a025a07, 0x00000000, 0x800409c0, 0x02000000, - 0x000203ab, 0x59cc0009, 0x4802580b, 0x82042500, - 0x00000100, 0x04000002, 0x59cc200b, 0x4812580d, - 0x82040500, 0x00000200, 0x04000002, 0x59cc000a, + 0x040207ea, 0x59cc0808, 0x592c0205, 0x82000500, + 0x000000ff, 0x82000580, 0x00000048, 0x0402000c, + 0x497a580c, 0x82040500, 0x000000ff, 0x04000008, + 0x592c0408, 0x800001c0, 0x04000005, 0x0201f800, + 0x001090c6, 0x0201f000, 0x00100b8f, 0x900421c0, + 0x4812580a, 0x41782000, 0x82040500, 0x00000c00, + 0x04000002, 0x59cc2009, 0x82043500, 0x00000fff, + 0x04020027, 0x481e5c09, 0x4a025a07, 0x00000000, + 0x801831c0, 0x02000000, 0x00100b8f, 0x41782000, + 0x8c183510, 0x04000002, 0x59cc200b, 0x4812580d, + 0x41780000, 0x8c183512, 0x04000002, 0x59cc000a, 0x4802580c, 0x80100c00, 0x02001800, 0x0010032d, - 0x02000000, 0x000203ab, 0x82041480, 0x0000001d, - 0x04001006, 0x592c0405, 0x8c00051e, 0x0400000e, - 0x42000800, 0x0000001c, 0x4c500000, 0x4c540000, - 0x83cca400, 0x0000000c, 0x832cac00, 0x0000000e, - 0x0401f9dc, 0x5c00a800, 0x5c00a000, 0x0201f000, - 0x000203ab, 0x0401f981, 0x0401f1bb, 0x83380480, - 0x00000093, 0x02021800, 0x0010032d, 0x83380480, - 0x00000085, 0x02001800, 0x0010032d, 0x0c01f001, - 0x0010825f, 0x0010825d, 0x0010825d, 0x00108266, - 0x0010825d, 0x0010825d, 0x0010825d, 0x0010825d, - 0x0010825d, 0x0010825d, 0x0010825d, 0x0010825d, - 0x0010825d, 0x0201f800, 0x0010032d, 0x4a026203, - 0x00000001, 0x493a6403, 0x42000800, 0x80000040, - 0x0201f000, 0x000209b1, 0x83300580, 0x0010f53c, - 0x02020800, 0x0010032d, 0x4933c857, 0x59cc1404, - 0x0201f800, 0x00108cd8, 0x04000025, 0x591c0203, - 0x82000580, 0x00000000, 0x04000021, 0x591c000a, - 0x81340580, 0x0402001e, 0x59cc1204, 0x82080580, - 0x0000ffff, 0x04000007, 0x591c0202, 0x82000d80, - 0x0000ffff, 0x04000003, 0x80080580, 0x04020014, - 0x4d300000, 0x4d1c0000, 0x411e6000, 0x0401f9f8, - 0x5c023800, 0x5c026000, 0x0400000b, 0x59cc0005, - 0x8c000500, 0x04020003, 0x0401f99b, 0x0401f003, - 0x4a023a03, 0x00000002, 0x4a026403, 0x00000086, - 0x0401f005, 0x0401f9dc, 0x040007f5, 0x4a026403, - 0x00000087, 0x4d2c0000, 0x0201f800, 0x0010a4f8, - 0x0201f800, 0x00104489, 0x5c025800, 0x59340200, - 0x8c00050e, 0x0400000d, 0x59cc1404, 0x0201f800, - 0x00108cd8, 0x04000009, 0x591c0415, 0x8c00051a, - 0x04000006, 0x4d300000, 0x411e6000, 0x0201f800, - 0x00108ac2, 0x5c026000, 0x1c01f000, 0x83380580, - 0x00000013, 0x0402000b, 0x59300403, 0x4803c857, - 0x82000d80, 0x00000086, 0x04000012, 0x82000d80, - 0x00000087, 0x02020800, 0x0010032d, 0x0401f00d, - 0x83380580, 0x00000027, 0x04000005, 0x83380580, - 0x00000014, 0x02020800, 0x0010032d, 0x493bc857, - 0x0201f800, 0x0010605d, 0x0201f000, 0x001070b5, - 0x4933c857, 0x0201f000, 0x00020a10, 0x83380580, - 0x00000013, 0x04020006, 0x59300403, 0x4803c857, - 0x82000480, 0x00000085, 0x0c01f053, 0x83380580, - 0x00000027, 0x04020047, 0x4933c857, 0x0201f800, - 0x0010605d, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010df61, 0x5c027800, 0x42003000, 0x00000015, - 0x41782800, 0x42002000, 0x00000003, 0x42028000, - 0x00000029, 0x4d400000, 0x4d440000, 0x59368c03, - 0x0201f800, 0x00109131, 0x5c028800, 0x5c028000, - 0x42000000, 0x0010bc1d, 0x0201f800, 0x0010ad1d, - 0x0201f800, 0x0010889a, 0x02000000, 0x00020a10, - 0x4d2c0000, 0x59325809, 0x592c0205, 0x82000500, - 0x000000ff, 0x82000580, 0x00000014, 0x02020800, - 0x0010899c, 0x4a025a05, 0x00000103, 0x59300402, - 0x48025c07, 0x497a580a, 0x49425a07, 0x0201f800, - 0x000203ab, 0x5c025800, 0x0201f000, 0x00020a10, - 0x83380580, 0x00000089, 0x04000005, 0x83380580, - 0x0000008a, 0x02020000, 0x00107134, 0x0201f800, - 0x0010644d, 0x02020000, 0x00107134, 0x59300a03, - 0x82040580, 0x0000000a, 0x0400002a, 0x82040580, - 0x0000000c, 0x04000027, 0x0201f800, 0x0010032d, - 0x83380580, 0x00000014, 0x040207ea, 0x4933c857, - 0x0201f800, 0x0010605d, 0x42028000, 0x00000006, - 0x0401f7cc, 0x00108330, 0x0010832e, 0x0010832e, - 0x0010832e, 0x0010832e, 0x0010832e, 0x00108336, - 0x0010832e, 0x0010832e, 0x0010832e, 0x0010832e, - 0x0010832e, 0x0010832e, 0x0201f800, 0x0010032d, - 0x4933c857, 0x59a8002a, 0x48026006, 0x4a026203, - 0x0000000a, 0x1c01f000, 0x4933c857, 0x59a8002a, - 0x48026006, 0x4a026203, 0x0000000c, 0x1c01f000, - 0x5932680a, 0x83380580, 0x00000089, 0x04000008, - 0x83380580, 0x0000008a, 0x04000029, 0x4933c857, - 0x493bc857, 0x0201f000, 0x00107134, 0x4933c857, - 0x59325809, 0x59300a1e, 0x82040580, 0x00000003, - 0x0402000a, 0x0201f800, 0x0010889a, 0x04000012, - 0x0201f800, 0x000203ab, 0x0201f800, 0x0010410c, - 0x497a6009, 0x0401f00c, 0x5930021e, 0x82000580, - 0x00000001, 0x04020008, 0x59300c17, 0x82040580, - 0x00000039, 0x0400001d, 0x82040580, 0x00000035, - 0x0400001a, 0x59cc0c07, 0x4806641a, 0x59cc0a07, - 0x4806621a, 0x59300203, 0x4802641e, 0x4a026203, - 0x00000011, 0x0201f000, 0x001070b5, 0x4933c857, - 0x5930021e, 0x82000580, 0x00000001, 0x04020048, - 0x59300c17, 0x82040580, 0x00000035, 0x04000007, - 0x82040580, 0x0000001e, 0x04000004, 0x82040580, - 0x00000039, 0x0402003e, 0x4933c857, 0x4c5c0000, - 0x4c600000, 0x4d1c0000, 0x4130b800, 0x4004c000, - 0x0201f800, 0x00108c7b, 0x0402002f, 0x82600580, - 0x00000035, 0x04020004, 0x591c0c15, 0x8c040d02, - 0x04000029, 0x0201f800, 0x001070f5, 0x04000026, - 0x491fc857, 0x4933c857, 0x82600580, 0x00000035, - 0x04000004, 0x82600580, 0x00000039, 0x04020002, - 0x4932381d, 0x48626403, 0x4a026203, 0x00000001, - 0x4a026407, 0x00000001, 0x585c080a, 0x4807c857, - 0x4806600a, 0x585c0c16, 0x4807c857, 0x48066416, - 0x585c0a16, 0x4807c857, 0x48066216, 0x585c0a17, - 0x4807c857, 0x48066217, 0x585c0c1a, 0x4807c857, - 0x4806641a, 0x585c0a1a, 0x4807c857, 0x4806621a, - 0x491e601f, 0x42000800, 0x80000040, 0x0201f800, - 0x000209b1, 0x405e6000, 0x5c023800, 0x5c00c000, - 0x5c00b800, 0x0201f000, 0x00020a10, 0x0201f800, - 0x0010889a, 0x0400000b, 0x4d2c0000, 0x59325809, - 0x0201f800, 0x000203ab, 0x5930021e, 0x82000580, - 0x00000003, 0x02000800, 0x0010410c, 0x5c025800, - 0x0201f000, 0x00020a10, 0x4803c856, 0x4c500000, - 0x4c540000, 0x412c7800, 0x4c3c0000, 0x42002800, - 0x00000001, 0x82040480, 0x00000101, 0x04001003, - 0x42000800, 0x00000100, 0x40043000, 0x42000800, - 0x0000001c, 0x83cca400, 0x0000000c, 0x832cac00, - 0x0000000e, 0x0401f843, 0x82183480, 0x0000001c, - 0x592e5801, 0x812e59c0, 0x02020800, 0x00100589, - 0x0201f800, 0x0010056f, 0x04000016, 0x80142800, - 0x4a025805, 0x00000110, 0x492c7801, 0x82180c80, - 0x0000003d, 0x04021006, 0x40180800, 0x832cac00, - 0x00000006, 0x0401f82f, 0x0401f00a, 0x82183480, - 0x0000003c, 0x42000800, 0x0000003c, 0x412c7800, - 0x832cac00, 0x00000006, 0x0401f826, 0x0401f7e9, - 0x5c007800, 0x841429c0, 0x82142d40, 0x00000003, - 0x48147a05, 0x403e5800, 0x5c00a800, 0x5c00a000, - 0x1c01f000, 0x492fc857, 0x812e59c0, 0x0400000f, - 0x4d2c0000, 0x4c3c0000, 0x592c7801, 0x803c79c0, - 0x04000006, 0x497a5801, 0x0201f800, 0x000203ab, - 0x403e5800, 0x0401f7f9, 0x5c007800, 0x0201f800, - 0x000203ab, 0x5c025800, 0x1c01f000, 0x4803c856, - 0x4c580000, 0x82040400, 0x00000003, 0x8000b104, - 0x0201f800, 0x0010adef, 0x5c00b000, 0x1c01f000, - 0x4803c856, 0x4c580000, 0x82040c00, 0x00000003, - 0x8004b104, 0x0201f800, 0x0010adef, 0x5c00b000, - 0x1c01f000, 0x591c0c07, 0x82040580, 0x00000003, - 0x04000007, 0x82040580, 0x00000002, 0x04000004, - 0x82040580, 0x0000000a, 0x0402002d, 0x4d300000, - 0x4d2c0000, 0x411e6000, 0x59325809, 0x0201f800, - 0x0010889a, 0x04000022, 0x59300c07, 0x82040580, - 0x0000000a, 0x04000023, 0x82040580, 0x00000003, - 0x04020009, 0x592c0a05, 0x82040d00, 0x000000ff, - 0x82040d80, 0x00000014, 0x04000003, 0x4a02621e, - 0x00000003, 0x0401f81c, 0x4d400000, 0x42028000, - 0x00000013, 0x592c0a09, 0x84040d54, 0x0201f800, - 0x00104504, 0x5c028000, 0x0201f800, 0x00108e69, - 0x0201f800, 0x000203ab, 0x5930021e, 0x82000580, - 0x00000003, 0x02000800, 0x0010899c, 0x0201f800, - 0x001070b5, 0x5c025800, 0x5c026000, 0x1c01f000, - 0x4a025a07, 0x00000013, 0x4a02621e, 0x0000000a, - 0x0401f7ee, 0x592c0409, 0x8c000512, 0x04000009, - 0x84000512, 0x48025c09, 0x4d2c0000, 0x592e580a, - 0x0201f800, 0x00100589, 0x5c025800, 0x497a580a, - 0x1c01f000, 0x59cc0005, 0x8c000500, 0x0402000b, - 0x591c0407, 0x82000580, 0x00000002, 0x04020007, - 0x591c0c03, 0x82040580, 0x00000085, 0x04000003, - 0x82040580, 0x0000008b, 0x1c01f000, 0x4933c857, - 0x4d3c0000, 0x42027800, 0x00000002, 0x59300407, - 0x82000c80, 0x00000014, 0x02021800, 0x0010032d, - 0x0c01f80a, 0x5c027800, 0x1c01f000, 0x4933c857, + 0x02000000, 0x00100b8f, 0x82041480, 0x0000001d, + 0x0402100c, 0x4c500000, 0x4c540000, 0x83cca400, + 0x0000000c, 0x832cac00, 0x0000000e, 0x0401fbae, + 0x5c00a800, 0x5c00a000, 0x0201f000, 0x00100b8f, + 0x0401fb53, 0x0201f000, 0x00100b8f, 0x412c7800, + 0x0201f800, 0x0010056f, 0x02000800, 0x0010032d, + 0x492c780a, 0x841c3d52, 0x481c7c09, 0x4a025a05, + 0x00000103, 0x4812580b, 0x900401c0, 0x4802580a, + 0x583c0405, 0x583c1006, 0x583c2209, 0x48025c05, + 0x480a5806, 0x48125a09, 0x0401f7c7, 0x8c000524, + 0x04000792, 0x59325809, 0x4c000000, 0x592c0409, + 0x8c00051c, 0x5c000000, 0x04020003, 0x4a026012, + 0xffffffff, 0x84000524, 0x0401f788, 0x1c01f000, + 0x59a8002c, 0x48026205, 0x59325809, 0x4a026203, + 0x00000002, 0x592c2409, 0x59300808, 0x4933c857, + 0x4807c857, 0x592c0205, 0x82000500, 0x000000ff, + 0x82000580, 0x00000048, 0x04020004, 0x8c102500, + 0x02020000, 0x0010910a, 0x4a025a07, 0x00000000, + 0x8c040d1e, 0x04000027, 0x41780800, 0x497a580a, + 0x592c1c0a, 0x59300012, 0x59341200, 0x497a6205, + 0x8c08150e, 0x04020070, 0x4807c857, 0x4806580b, + 0x80000d40, 0x04020f00, 0x59300402, 0x48025c07, + 0x48065808, 0x4a025a05, 0x00000103, 0x4c040000, + 0x4c0c0000, 0x4c100000, 0x0201f800, 0x00108f22, + 0x5c002000, 0x5c001800, 0x5c000800, 0x8c102512, + 0x0402001a, 0x4c0c0000, 0x0201f800, 0x000203ab, + 0x0201f800, 0x00104126, 0x5c001800, 0x8c0c1d18, + 0x02000000, 0x00020a10, 0x0201f000, 0x00108b26, + 0x4813c857, 0x8c102518, 0x0400004d, 0x41780800, + 0x592c1c0a, 0x820c0580, 0x00001000, 0x040007d6, + 0x8c102512, 0x040007d4, 0x592c780a, 0x583c080b, + 0x583c1c0a, 0x0401f7d0, 0x4807c857, 0x592c780a, + 0x59300402, 0x592c1405, 0x8c08151e, 0x0402000d, + 0x592c1207, 0x48007c07, 0x48047808, 0x48087a07, + 0x84102512, 0x48107c09, 0x4c0c0000, 0x0201f800, + 0x00100589, 0x403e5800, 0x0401fb10, 0x0401f7d9, + 0x48025c07, 0x48065808, 0x583c080d, 0x583c000c, + 0x80040c00, 0x82041480, 0x0000001d, 0x04001006, + 0x583c1001, 0x480a5801, 0x49787801, 0x42000800, + 0x0000001c, 0x82040c00, 0x00000014, 0x4c0c0000, + 0x4c500000, 0x4c540000, 0x823ca400, 0x00000009, + 0x832cac00, 0x00000009, 0x4c100000, 0x4c3c0000, + 0x0401fb11, 0x5c007800, 0x5c002000, 0x5c00a800, + 0x5c00a000, 0x84102512, 0x48125c09, 0x403e5800, + 0x0201f800, 0x00100589, 0x0201f800, 0x00108f22, + 0x42034000, 0x0010b8fa, 0x59a1d806, 0x80edd9c0, + 0x02000800, 0x0010032d, 0x48efc857, 0x58ec0008, + 0x4803c857, 0x0801f800, 0x0401f7aa, 0x4933c857, + 0x1c01f000, 0x59301415, 0x480bc857, 0x8c08151c, + 0x0402000e, 0x80000540, 0x4803c857, 0x0400078b, + 0x80042c80, 0x04021789, 0x8c081514, 0x04020005, + 0x592c0810, 0x4807c857, 0x80040480, 0x48026017, + 0x8408155c, 0x480a6415, 0x59301008, 0x8408151e, + 0x480a6008, 0x4c100000, 0x4c3c0000, 0x4d400000, + 0x592e8207, 0x4a025a07, 0x00000001, 0x0201f800, + 0x00108f22, 0x49425a07, 0x5c028000, 0x5c007800, + 0x5c002000, 0x497a580a, 0x8c102512, 0x04000006, + 0x4d2c0000, 0x403e5800, 0x0201f800, 0x00100589, + 0x5c025800, 0x82102500, 0xffffedff, 0x48125c09, + 0x59301006, 0x800811c0, 0x02000000, 0x00108b66, + 0x59a8002c, 0x80080480, 0x02021000, 0x00108b66, + 0x4a025a05, 0x00000103, 0x4a025a07, 0x00000006, + 0x497a5c0a, 0x492fc857, 0x0201f800, 0x000203ab, + 0x0201f800, 0x00104126, 0x0201f000, 0x00020a10, + 0x59325809, 0x592c0409, 0x8c000518, 0x04000004, + 0x412df800, 0x0201f000, 0x00100bae, 0x1c01f000, + 0x4933c857, 0x59325809, 0x497a580a, 0x4a025a07, + 0x00000000, 0x4a025a05, 0x00000103, 0x59300812, + 0x4807c857, 0x800409c0, 0x0402000c, 0x48065808, + 0x59300c02, 0x48065c07, 0x0201f800, 0x00108f22, + 0x0201f800, 0x000203ab, 0x0201f800, 0x00104126, + 0x0201f000, 0x00020a10, 0x59340200, 0x8c00050e, + 0x04020005, 0x59300812, 0x0401fe33, 0x48065808, + 0x0401f7f0, 0x592c0209, 0x8c00050e, 0x040207fa, + 0x4933c857, 0x0201f000, 0x00108b66, 0x4933c857, + 0x59325809, 0x812e59c0, 0x02000800, 0x0010032d, + 0x592c020b, 0x8c000502, 0x02000800, 0x0010032d, + 0x4a026006, 0x00000002, 0x1c01f000, 0x5930001d, + 0x800001c0, 0x02020800, 0x001091d8, 0x59300008, + 0x4933c857, 0x4803c857, 0x8c00050e, 0x04000037, + 0x8c000500, 0x04000029, 0x8c00051c, 0x0400000a, + 0x84000500, 0x48026008, 0x59325809, 0x592c3c09, + 0x481fc857, 0x841c3d58, 0x481e5c09, 0x0201f000, + 0x00020a70, 0x59325809, 0x592c3c09, 0x841c3d58, + 0x59300008, 0x8c00051c, 0x040207f2, 0x481e5c09, + 0x42000000, 0x00000005, 0x40000000, 0x80000040, + 0x040207fe, 0x59300008, 0x8c00051c, 0x040207e9, + 0x592c0205, 0x82000500, 0x000000ff, 0x82000580, + 0x00000048, 0x04020003, 0x497a580c, 0x0401f002, + 0x497a580a, 0x481e5c09, 0x4a025a07, 0x00000000, + 0x0201f000, 0x00100b8f, 0x8c000524, 0x040007d9, + 0x59325809, 0x4c000000, 0x592c0409, 0x8c00051c, + 0x5c000000, 0x04020003, 0x4a026012, 0xffffffff, + 0x84000524, 0x0401f7cf, 0x1c01f000, 0x4933c857, + 0x41780800, 0x83380480, 0x00000058, 0x0402100b, + 0x83380480, 0x00000040, 0x04001008, 0x4d2c0000, + 0x59325809, 0x812e59c0, 0x0c020806, 0x5c025800, + 0x0201f000, 0x00020a10, 0x493bc857, 0x1c01f000, + 0x001082b8, 0x001082b8, 0x001082b8, 0x001082b8, + 0x001082b8, 0x001082ba, 0x001082b8, 0x001082b8, + 0x001082b8, 0x001082b8, 0x001082b8, 0x001082b8, + 0x001082b8, 0x001082b8, 0x001082b8, 0x001082b8, + 0x001082b8, 0x001082b8, 0x001082b8, 0x001082b8, + 0x001082bd, 0x001082b8, 0x001082b8, 0x001082b8, + 0x0201f800, 0x0010032d, 0x59cc0808, 0x497a5808, + 0x4807c857, 0x59300402, 0x48025c07, 0x4a025a05, + 0x00000103, 0x900401c0, 0x4802580a, 0x4a025a07, + 0x00000000, 0x800409c0, 0x02000000, 0x000203ab, + 0x59cc0009, 0x4802580b, 0x82042500, 0x00000100, + 0x04000002, 0x59cc200b, 0x4812580d, 0x82040500, + 0x00000200, 0x04000002, 0x59cc000a, 0x4802580c, + 0x80100c00, 0x02001800, 0x0010032d, 0x02000000, + 0x000203ab, 0x82041480, 0x0000001d, 0x04001006, + 0x592c0405, 0x8c00051e, 0x0400000e, 0x42000800, + 0x0000001c, 0x4c500000, 0x4c540000, 0x83cca400, + 0x0000000c, 0x832cac00, 0x0000000e, 0x0401f9ea, + 0x5c00a800, 0x5c00a000, 0x0201f000, 0x000203ab, + 0x0401f98f, 0x0401f1c9, 0x83380480, 0x00000093, + 0x02021800, 0x0010032d, 0x83380480, 0x00000085, + 0x02001800, 0x0010032d, 0x0c01f001, 0x00108306, + 0x00108304, 0x00108304, 0x0010830d, 0x00108304, + 0x00108304, 0x00108304, 0x00108304, 0x00108304, + 0x00108304, 0x00108304, 0x00108304, 0x00108304, + 0x0201f800, 0x0010032d, 0x4a026203, 0x00000001, + 0x493a6403, 0x42000800, 0x80000040, 0x0201f000, + 0x000209b1, 0x83300580, 0x0010f64c, 0x02020800, + 0x0010032d, 0x4933c857, 0x59cc1404, 0x0201f800, + 0x00108d91, 0x04000025, 0x591c0203, 0x82000580, + 0x00000000, 0x04000021, 0x591c000a, 0x81340580, + 0x0402001e, 0x59cc1204, 0x82080580, 0x0000ffff, + 0x04000007, 0x591c0202, 0x82000d80, 0x0000ffff, + 0x04000003, 0x80080580, 0x04020014, 0x4d300000, + 0x4d1c0000, 0x411e6000, 0x0401fa06, 0x5c023800, + 0x5c026000, 0x0400000b, 0x59cc0005, 0x8c000500, + 0x04020003, 0x0401f9a9, 0x0401f003, 0x4a023a03, + 0x00000002, 0x4a026403, 0x00000086, 0x0401f005, + 0x0401f9ea, 0x040007f5, 0x4a026403, 0x00000087, + 0x4d2c0000, 0x0201f800, 0x0010a5eb, 0x0201f800, + 0x001044a8, 0x5c025800, 0x59340200, 0x8c00050e, + 0x0400000d, 0x59cc1404, 0x0201f800, 0x00108d91, + 0x04000009, 0x591c0415, 0x8c00051a, 0x04000006, + 0x4d300000, 0x411e6000, 0x0201f800, 0x00108b7b, + 0x5c026000, 0x1c01f000, 0x83380580, 0x00000013, + 0x0402000b, 0x59300403, 0x4803c857, 0x82000d80, + 0x00000086, 0x04000020, 0x82000d80, 0x00000087, + 0x02020800, 0x0010032d, 0x0401f01b, 0x83380580, + 0x00000027, 0x04000005, 0x83380580, 0x00000014, + 0x02020800, 0x0010032d, 0x493bc857, 0x0201f800, + 0x00106102, 0x0201f800, 0x00108953, 0x02000000, + 0x00107144, 0x4d2c0000, 0x59325809, 0x0201f800, + 0x000203ab, 0x59300a1e, 0x82040d80, 0x00000003, + 0x02000800, 0x00108a55, 0x5c025800, 0x0201f000, + 0x00107144, 0x4933c857, 0x0201f000, 0x00020a10, + 0x83380580, 0x00000013, 0x04020006, 0x59300403, + 0x4803c857, 0x82000480, 0x00000085, 0x0c01f053, + 0x83380580, 0x00000027, 0x04020047, 0x4933c857, + 0x0201f800, 0x00106102, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010e06f, 0x5c027800, 0x42003000, + 0x00000015, 0x41782800, 0x42002000, 0x00000003, + 0x42028000, 0x00000029, 0x4d400000, 0x4d440000, + 0x59368c03, 0x0201f800, 0x001091ea, 0x5c028800, + 0x5c028000, 0x42000000, 0x0010bd1d, 0x0201f800, + 0x0010ae10, 0x0201f800, 0x00108953, 0x02000000, + 0x00020a10, 0x4d2c0000, 0x59325809, 0x592c0205, + 0x82000500, 0x000000ff, 0x82000580, 0x00000014, + 0x02020800, 0x00108a55, 0x4a025a05, 0x00000103, + 0x59300402, 0x48025c07, 0x497a580a, 0x49425a07, + 0x0201f800, 0x000203ab, 0x5c025800, 0x0201f000, + 0x00020a10, 0x83380580, 0x00000089, 0x04000005, + 0x83380580, 0x0000008a, 0x02020000, 0x001071c7, + 0x0201f800, 0x001064f2, 0x02020000, 0x001071c7, + 0x59300a03, 0x82040580, 0x0000000a, 0x0400002a, + 0x82040580, 0x0000000c, 0x04000027, 0x0201f800, + 0x0010032d, 0x83380580, 0x00000014, 0x040207ea, + 0x4933c857, 0x0201f800, 0x00106102, 0x42028000, + 0x00000006, 0x0401f7cc, 0x001083e5, 0x001083e3, + 0x001083e3, 0x001083e3, 0x001083e3, 0x001083e3, + 0x001083eb, 0x001083e3, 0x001083e3, 0x001083e3, + 0x001083e3, 0x001083e3, 0x001083e3, 0x0201f800, + 0x0010032d, 0x4933c857, 0x59a8002a, 0x48026006, + 0x4a026203, 0x0000000a, 0x1c01f000, 0x4933c857, + 0x59a8002a, 0x48026006, 0x4a026203, 0x0000000c, + 0x1c01f000, 0x5932680a, 0x83380580, 0x00000089, + 0x04000008, 0x83380580, 0x0000008a, 0x04000029, + 0x4933c857, 0x493bc857, 0x0201f000, 0x001071c7, + 0x4933c857, 0x59325809, 0x59300a1e, 0x82040580, + 0x00000003, 0x0402000a, 0x0201f800, 0x00108953, + 0x04000012, 0x0201f800, 0x000203ab, 0x0201f800, + 0x00104126, 0x497a6009, 0x0401f00c, 0x5930021e, + 0x82000580, 0x00000001, 0x04020008, 0x59300c17, + 0x82040580, 0x00000039, 0x0400001d, 0x82040580, + 0x00000035, 0x0400001a, 0x59cc0c07, 0x4806641a, + 0x59cc0a07, 0x4806621a, 0x59300203, 0x4802641e, + 0x4a026203, 0x00000011, 0x0201f000, 0x00107144, + 0x4933c857, 0x5930021e, 0x82000580, 0x00000001, + 0x04020048, 0x59300c17, 0x82040580, 0x00000035, + 0x04000007, 0x82040580, 0x0000001e, 0x04000004, + 0x82040580, 0x00000039, 0x0402003e, 0x4933c857, + 0x4c5c0000, 0x4c600000, 0x4d1c0000, 0x4130b800, + 0x4004c000, 0x0201f800, 0x00108d34, 0x0402002f, + 0x82600580, 0x00000035, 0x04020004, 0x591c0c15, + 0x8c040d02, 0x04000029, 0x0201f800, 0x00107188, + 0x04000026, 0x491fc857, 0x4933c857, 0x82600580, + 0x00000035, 0x04000004, 0x82600580, 0x00000039, + 0x04020002, 0x4932381d, 0x48626403, 0x4a026203, + 0x00000001, 0x4a026407, 0x00000001, 0x585c080a, + 0x4807c857, 0x4806600a, 0x585c0c16, 0x4807c857, + 0x48066416, 0x585c0a16, 0x4807c857, 0x48066216, + 0x585c0a17, 0x4807c857, 0x48066217, 0x585c0c1a, + 0x4807c857, 0x4806641a, 0x585c0a1a, 0x4807c857, + 0x4806621a, 0x491e601f, 0x42000800, 0x80000040, + 0x0201f800, 0x000209b1, 0x405e6000, 0x5c023800, + 0x5c00c000, 0x5c00b800, 0x0201f000, 0x00020a10, + 0x0201f800, 0x00108953, 0x0400000b, 0x4d2c0000, + 0x59325809, 0x0201f800, 0x000203ab, 0x5930021e, + 0x82000580, 0x00000003, 0x02000800, 0x00104126, + 0x5c025800, 0x0201f000, 0x00020a10, 0x4803c856, + 0x4c500000, 0x4c540000, 0x412c7800, 0x4c3c0000, + 0x42002800, 0x00000001, 0x82040480, 0x00000101, + 0x04001003, 0x42000800, 0x00000100, 0x40043000, + 0x42000800, 0x0000001c, 0x83cca400, 0x0000000c, + 0x832cac00, 0x0000000e, 0x0401f843, 0x82183480, + 0x0000001c, 0x592e5801, 0x812e59c0, 0x02020800, + 0x00100589, 0x0201f800, 0x0010056f, 0x04000016, + 0x80142800, 0x4a025805, 0x00000110, 0x492c7801, + 0x82180c80, 0x0000003d, 0x04021006, 0x40180800, + 0x832cac00, 0x00000006, 0x0401f82f, 0x0401f00a, + 0x82183480, 0x0000003c, 0x42000800, 0x0000003c, + 0x412c7800, 0x832cac00, 0x00000006, 0x0401f826, + 0x0401f7e9, 0x5c007800, 0x841429c0, 0x82142d40, + 0x00000003, 0x48147a05, 0x403e5800, 0x5c00a800, + 0x5c00a000, 0x1c01f000, 0x492fc857, 0x812e59c0, + 0x0400000f, 0x4d2c0000, 0x4c3c0000, 0x592c7801, + 0x803c79c0, 0x04000006, 0x497a5801, 0x0201f800, + 0x000203ab, 0x403e5800, 0x0401f7f9, 0x5c007800, + 0x0201f800, 0x000203ab, 0x5c025800, 0x1c01f000, + 0x4803c856, 0x4c580000, 0x82040400, 0x00000003, + 0x8000b104, 0x0201f800, 0x0010aee2, 0x5c00b000, + 0x1c01f000, 0x4803c856, 0x4c580000, 0x82040c00, + 0x00000003, 0x8004b104, 0x0201f800, 0x0010aee2, + 0x5c00b000, 0x1c01f000, 0x591c0c07, 0x82040580, + 0x00000003, 0x04000007, 0x82040580, 0x00000002, + 0x04000004, 0x82040580, 0x0000000a, 0x0402002d, + 0x4d300000, 0x4d2c0000, 0x411e6000, 0x59325809, + 0x0201f800, 0x00108953, 0x04000022, 0x59300c07, + 0x82040580, 0x0000000a, 0x04000023, 0x82040580, + 0x00000003, 0x04020009, 0x592c0a05, 0x82040d00, + 0x000000ff, 0x82040d80, 0x00000014, 0x04000003, + 0x4a02621e, 0x00000003, 0x0401f81c, 0x4d400000, + 0x42028000, 0x00000013, 0x592c0a09, 0x84040d54, + 0x0201f800, 0x00104543, 0x5c028000, 0x0201f800, + 0x00108f22, 0x0201f800, 0x000203ab, 0x5930021e, + 0x82000580, 0x00000003, 0x02000800, 0x00108a55, + 0x0201f800, 0x00107144, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x4a025a07, 0x00000013, 0x4a02621e, + 0x0000000a, 0x0401f7ee, 0x592c0409, 0x8c000512, + 0x04000009, 0x84000512, 0x48025c09, 0x4d2c0000, + 0x592e580a, 0x0201f800, 0x00100589, 0x5c025800, + 0x497a580a, 0x1c01f000, 0x59cc0005, 0x8c000500, + 0x0402000b, 0x591c0407, 0x82000580, 0x00000002, + 0x04020007, 0x591c0c03, 0x82040580, 0x00000085, + 0x04000003, 0x82040580, 0x0000008b, 0x1c01f000, + 0x4933c857, 0x4d3c0000, 0x42027800, 0x00000002, 0x59300407, 0x82000c80, 0x00000014, 0x02021800, - 0x0010032d, 0x0c01f001, 0x001084a7, 0x001084a4, - 0x001084a4, 0x001084d8, 0x001084a2, 0x001084a4, - 0x001084bf, 0x001084a4, 0x001084a2, 0x00105e8f, - 0x00109267, 0x001084a4, 0x001084a4, 0x001084a2, - 0x001084a2, 0x001084a2, 0x001085ca, 0x001084a4, - 0x0010ab98, 0x0010ab98, 0x0201f800, 0x0010032d, - 0x4803c856, 0x80000580, 0x1c01f000, 0x4803c856, - 0x8d3e7d02, 0x04020015, 0x0401fbf0, 0x0400000f, - 0x59325809, 0x41780800, 0x4d400000, 0x42028000, - 0x00000005, 0x0201f800, 0x00104504, 0x5c028000, - 0x0201f800, 0x00108e69, 0x0201f800, 0x00108a48, - 0x0201f800, 0x000203ab, 0x0201f800, 0x001070b5, - 0x82000540, 0x00000001, 0x1c01f000, 0x4933c857, - 0x0201f800, 0x001040aa, 0x0400000b, 0x59300415, - 0x84000556, 0x48026415, 0x0401f812, 0x4df00000, - 0x59300415, 0x84000516, 0x48026415, 0x5c03e000, - 0x1c01f000, 0x4d400000, 0x42028000, 0x00000010, - 0x0201f800, 0x00109d73, 0x4a026407, 0x00000006, - 0x4a026203, 0x00000007, 0x5c028000, 0x1c01f000, - 0x4933c857, 0x0201f800, 0x0010610d, 0x4df00000, - 0x0401f8da, 0x82000c80, 0x0000000e, 0x02021800, - 0x0010032d, 0x0c01f001, 0x001084f2, 0x00108575, - 0x00108509, 0x00108589, 0x00108570, 0x001084f0, - 0x001084f2, 0x001084f2, 0x001084f6, 0x001084f2, - 0x001084f2, 0x001084f2, 0x001084f2, 0x00108509, - 0x0201f800, 0x0010032d, 0x5c03e000, 0x02000800, - 0x001060fa, 0x0401f7af, 0x5c03e000, 0x02000800, - 0x001060fa, 0x59300407, 0x82000580, 0x00000003, - 0x040207ab, 0x59300203, 0x82000580, 0x0000000d, - 0x040007a7, 0x8d3e7d02, 0x040207a5, 0x4d340000, - 0x5932680a, 0x0201f800, 0x0010410c, 0x5c026800, - 0x0401f79f, 0x0201f800, 0x001092d9, 0x59300004, - 0x8400055c, 0x48026004, 0x0201f800, 0x001060fa, - 0x59300407, 0x82000580, 0x00000006, 0x04000057, - 0x8d3e7d02, 0x04020055, 0x497a621e, 0x59300203, - 0x82000580, 0x0000000d, 0x04000003, 0x4a02621e, - 0x00000003, 0x0401fb7d, 0x04020004, 0x8d3e7d00, - 0x04000040, 0x0401f034, 0x4d2c0000, 0x4d400000, - 0x59325809, 0x0201f800, 0x00108a48, 0x592c0409, - 0x8c000512, 0x04000009, 0x4d2c0000, 0x84000512, - 0x48025c09, 0x592c080a, 0x40065800, 0x0201f800, - 0x00100589, 0x5c025800, 0x4d400000, 0x42028000, - 0x00000005, 0x592c0a09, 0x8c040d0e, 0x04000004, - 0x42028000, 0x00000002, 0x0401f001, 0x0201f800, - 0x00104504, 0x5c028000, 0x0201f800, 0x00108e69, - 0x8d3e7d00, 0x04020004, 0x0201f800, 0x0010ae30, - 0x04020004, 0x0201f800, 0x000203ab, 0x497a6009, - 0x5c028000, 0x5c025800, 0x8d3e7d00, 0x0400000d, - 0x59300a1e, 0x82040d80, 0x00000003, 0x04020006, - 0x4d340000, 0x5932680a, 0x0201f800, 0x0010410c, - 0x5c026800, 0x0201f800, 0x001070b5, 0x0401f013, - 0x0201f800, 0x0010ae30, 0x04020006, 0x59300a1e, - 0x82040d80, 0x00000003, 0x02000800, 0x0010899c, - 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, - 0x4a026407, 0x00000002, 0x42000800, 0x8000404b, - 0x0201f800, 0x000209b1, 0x5c03e000, 0x02020800, - 0x0010610d, 0x82000540, 0x00000001, 0x1c01f000, - 0x0201f800, 0x001060fa, 0x0201f800, 0x00100bd4, - 0x0401f795, 0x598c000f, 0x81300580, 0x04020004, - 0x0201f800, 0x00106388, 0x0402001d, 0x0201f800, - 0x0010e343, 0x80c40040, 0x04020006, 0x59300c03, - 0x82040580, 0x00000040, 0x04000774, 0x0401f786, - 0x0201f800, 0x00106018, 0x04000011, 0x0201f800, - 0x0010032d, 0x0401f81b, 0x04020004, 0x0201f800, - 0x00106351, 0x0402000a, 0x0201f800, 0x0010e1ca, - 0x80c40040, 0x040207f3, 0x59300c03, 0x82040580, - 0x00000040, 0x04000761, 0x0401f773, 0x59300203, - 0x82000c80, 0x0000000e, 0x02021800, 0x0010032d, - 0x0c01f746, 0x0401f807, 0x42018800, 0x00000001, - 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, - 0x417a3000, 0x42032000, 0x0000bf32, 0x59900004, - 0x81300580, 0x04000009, 0x83932400, 0x00000010, - 0x811a3000, 0x83180480, 0x00000005, 0x040017f8, - 0x82000540, 0x00000001, 0x1c01f000, 0x0401f803, - 0x40018800, 0x1c01f000, 0x59300004, 0x8c00053e, - 0x04000010, 0x8c00050c, 0x0402000e, 0x8c000516, - 0x04020006, 0x82000d00, 0x0000001f, 0x82040580, - 0x00000005, 0x04020004, 0x42000000, 0x00000003, - 0x0401f005, 0x42000000, 0x00000001, 0x0401f002, - 0x59300203, 0x1c01f000, 0x4933c857, 0x0201f800, - 0x0010610d, 0x4df00000, 0x59300203, 0x82000c80, - 0x0000000e, 0x02021800, 0x0010032d, 0x0c01f001, - 0x001085e4, 0x00108601, 0x001085e8, 0x001085e2, - 0x001085e2, 0x001085e2, 0x001085e2, 0x001085e2, - 0x001085e2, 0x001085e2, 0x001085e2, 0x001085e2, - 0x001085e2, 0x001085e2, 0x0201f800, 0x0010032d, - 0x5c03e000, 0x02000800, 0x001060fa, 0x0401f6bd, - 0x5c03e000, 0x02000800, 0x001060fa, 0x4d2c0000, - 0x59325809, 0x59300403, 0x82000580, 0x00000052, - 0x02000800, 0x00100fb9, 0x0401faa8, 0x02000800, - 0x0010032d, 0x4a025a07, 0x00000005, 0x0201f800, - 0x000203ab, 0x0201f800, 0x001043c3, 0x0201f800, - 0x001070b5, 0x5c025800, 0x82000540, 0x00000001, - 0x1c01f000, 0x598c000f, 0x81300580, 0x0402001b, - 0x59300004, 0x8c000520, 0x04000004, 0x84000520, - 0x48026004, 0x0401f01b, 0x42001000, 0x0010bb55, - 0x50081000, 0x58080002, 0x82000580, 0x00000100, - 0x0400000b, 0x5808000b, 0x81300580, 0x02020800, - 0x0010032d, 0x0201f800, 0x0010e343, 0x80c40040, - 0x02020800, 0x0010032d, 0x0401f7ce, 0x0201f800, - 0x00106388, 0x0402000d, 0x59300004, 0x8c000520, - 0x04000004, 0x84000520, 0x48026004, 0x0401f7c5, - 0x0201f800, 0x0010e343, 0x80c40040, 0x040007c1, - 0x0201f800, 0x0010032d, 0x59300203, 0x82000c80, - 0x0000000e, 0x02021800, 0x0010032d, 0x0c01f7a5, - 0x4d340000, 0x5932680a, 0x59300407, 0x4933c857, - 0x4803c857, 0x82000c80, 0x00000014, 0x02021800, - 0x0010032d, 0x0c01f803, 0x5c026800, 0x1c01f000, - 0x00108655, 0x00108681, 0x001087c7, 0x0010e95c, - 0x001087ba, 0x001087c2, 0x00109d62, 0x00108661, - 0x001087b5, 0x00105e77, 0x00108835, 0x00108650, - 0x00108650, 0x00108650, 0x00108650, 0x00020a10, - 0x00108fb8, 0x00108fb8, 0x0010aba8, 0x0010aba8, - 0x0201f800, 0x0010032d, 0x0401fb78, 0x02000000, - 0x00107851, 0x1c01f000, 0x0201f800, 0x0010610d, - 0x0201f800, 0x0010605d, 0x0201f800, 0x001060fa, - 0x0201f000, 0x00020a10, 0x4a026006, 0x00000001, - 0x1c01f000, 0x4d340000, 0x4c5c0000, 0x59300203, - 0x82000580, 0x00000011, 0x04020016, 0x5932680a, - 0x4130b800, 0x0201f800, 0x000209ee, 0x04000010, - 0x4a026203, 0x00000001, 0x4a026403, 0x0000001e, - 0x585c041a, 0x4802641a, 0x585c021a, 0x4802621a, - 0x4936600a, 0x4a026407, 0x00000001, 0x42000800, - 0x80000040, 0x0201f800, 0x000209b1, 0x405e6000, - 0x0201f800, 0x00020a10, 0x5c00b800, 0x5c026800, - 0x1c01f000, 0x42000000, 0x0010bc28, 0x0201f800, - 0x0010ad1d, 0x0201f800, 0x0010a58e, 0x59300203, - 0x82000c80, 0x0000000e, 0x02021800, 0x0010032d, - 0x4803c857, 0x0c01f001, 0x0010869c, 0x0010865e, - 0x0010869e, 0x0010869c, 0x0010869e, 0x0010869e, - 0x00108656, 0x0010869c, 0x00108652, 0x0010869c, - 0x0010869c, 0x0010869c, 0x0010869c, 0x0010869c, - 0x0201f800, 0x0010032d, 0x4d2c0000, 0x59340400, - 0x82000500, 0x000000ff, 0x82000c80, 0x0000000c, - 0x02021800, 0x0010032d, 0x59303403, 0x82180d80, - 0x00000004, 0x04020004, 0x42000000, 0x00000001, - 0x0401f006, 0x82180d80, 0x00000000, 0x04020003, - 0x42000000, 0x00000001, 0x4803c857, 0x0c01f803, - 0x5c025800, 0x1c01f000, 0x001086c2, 0x00108762, - 0x001086c4, 0x001086f9, 0x001086c4, 0x0010877f, - 0x001086c4, 0x001086ce, 0x001086c2, 0x0010877f, - 0x001086c2, 0x001086dd, 0x0201f800, 0x0010032d, - 0x59300403, 0x82000d80, 0x00000016, 0x0400002e, - 0x82000d80, 0x00000004, 0x0400002b, 0x82000d80, - 0x00000002, 0x04000028, 0x0401fafc, 0x04000026, - 0x59300403, 0x82000d80, 0x00000022, 0x040000af, - 0x82000d80, 0x00000039, 0x040000b4, 0x82000d80, - 0x00000035, 0x040000b1, 0x82000d80, 0x0000001e, - 0x0400001b, 0x0401f9bd, 0x04000007, 0x0201f800, - 0x00108e64, 0x04020004, 0x0201f800, 0x001041a0, - 0x0401f011, 0x59300403, 0x82000d80, 0x00000001, - 0x04020004, 0x0201f800, 0x00104165, 0x0400000a, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010df61, - 0x5c027800, 0x42000000, 0x0010bc1d, 0x0201f800, - 0x0010ad1d, 0x0201f800, 0x00107851, 0x0201f000, - 0x001070b5, 0x0401f9a1, 0x04000004, 0x0201f800, - 0x00108e64, 0x040000a6, 0x59300c03, 0x82040580, - 0x00000016, 0x04000057, 0x82040580, 0x00000002, - 0x0402002f, 0x59a8021b, 0x8c000502, 0x04020016, - 0x59a81073, 0x8c08153e, 0x04020013, 0x0201f800, - 0x00104716, 0x04020010, 0x0201f800, 0x00104741, - 0x04020006, 0x42000000, 0x00000001, 0x0201f800, - 0x001046e7, 0x0401f08e, 0x4a035014, 0x00000001, - 0x4202d800, 0x00000001, 0x0201f800, 0x00104670, - 0x0401f087, 0x59340412, 0x82000500, 0x000000ff, - 0x04000013, 0x80000040, 0x48026c12, 0x497a6205, - 0x4d300000, 0x0201f800, 0x001070f5, 0x5c000000, - 0x0400000a, 0x49780009, 0x4a000407, 0x00000007, - 0x4a000006, 0x00000398, 0x4936600a, 0x4a026407, - 0x00000001, 0x0401f027, 0x40026000, 0x59300403, - 0x82000d80, 0x00000002, 0x04020010, 0x59340403, - 0x82000580, 0x000007fe, 0x0402000c, 0x59a81073, - 0x8c08153e, 0x04020004, 0x59a8021b, 0x84000540, - 0x4803521b, 0x0201f800, 0x00103a22, 0x0201f800, - 0x00107851, 0x0401f00c, 0x0201f800, 0x00107851, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010df61, - 0x5c027800, 0x42000000, 0x0010bc1d, 0x0201f800, - 0x0010ad1d, 0x59a81073, 0x8c08153e, 0x04020003, - 0x0201f800, 0x00101a67, 0x0201f000, 0x001070b5, - 0x42000800, 0x00000003, 0x0201f800, 0x00103d8a, - 0x4a026203, 0x00000001, 0x4a026403, 0x00000002, - 0x0201f000, 0x00105fe8, 0x0401f938, 0x04020792, - 0x0201f800, 0x00101a67, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010df61, 0x5c027800, 0x42000000, - 0x0010bc1d, 0x0201f800, 0x0010ad1d, 0x42003000, - 0x00000018, 0x41782800, 0x42002000, 0x00000000, - 0x4d400000, 0x4d440000, 0x59368c03, 0x42028000, - 0x00000029, 0x0201f800, 0x00109131, 0x5c028800, - 0x5c028000, 0x0201f000, 0x001070b5, 0x0201f800, - 0x001041a0, 0x0401f7c5, 0x42000000, 0x0010bc27, - 0x0201f800, 0x0010ad1d, 0x0201f800, 0x00107363, - 0x040207be, 0x1c01f000, 0x59300c03, 0x0201f800, - 0x00108c7b, 0x02020000, 0x00020a10, 0x836c0580, - 0x00000003, 0x04000004, 0x4a026006, 0x00000002, - 0x1c01f000, 0x59300403, 0x48026417, 0x4a02621e, - 0x00000001, 0x4a026403, 0x00000085, 0x4a026203, - 0x00000009, 0x4a026407, 0x00000002, 0x42000800, - 0x8000004b, 0x0201f000, 0x000209b1, 0x0201f800, - 0x00107851, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010df61, 0x5c027800, 0x42000000, 0x0010bc1d, - 0x0201f800, 0x0010ad1d, 0x497a6009, 0x4a026407, - 0x00000007, 0x4a026006, 0x00000398, 0x497a6205, - 0x1c01f000, 0x42000000, 0x0010bc2e, 0x0201f800, - 0x0010ad1d, 0x0401f6c8, 0x42000000, 0x0010bc29, - 0x0201f800, 0x0010ad1d, 0x0201f800, 0x0010a58e, - 0x0201f000, 0x001070b5, 0x42000000, 0x0010bc2b, - 0x0201f800, 0x0010ad1d, 0x1c01f000, 0x42000000, - 0x0010bc2a, 0x0201f800, 0x0010ad1d, 0x59300203, - 0x82000c80, 0x0000000e, 0x02021800, 0x0010032d, - 0x4803c857, 0x0c01f001, 0x001087e0, 0x0010865e, - 0x001087e0, 0x001087e0, 0x001087e0, 0x001087e0, - 0x001087e0, 0x001087e0, 0x001087e0, 0x0010865e, - 0x001087e2, 0x0010865e, 0x001087ea, 0x001087e0, - 0x0201f800, 0x0010032d, 0x4a026403, 0x0000008b, - 0x4a026203, 0x0000000b, 0x42000800, 0x8000404b, - 0x0201f000, 0x000209b1, 0x59300a1e, 0x0401f8af, - 0x0400000f, 0x4d2c0000, 0x59325809, 0x4a025a07, - 0x00000006, 0x497a5c0a, 0x0201f800, 0x000203ab, + 0x0010032d, 0x0c01f80a, 0x5c027800, 0x1c01f000, + 0x4933c857, 0x59300407, 0x82000c80, 0x00000014, + 0x02021800, 0x0010032d, 0x0c01f001, 0x0010855c, + 0x00108559, 0x00108559, 0x0010858d, 0x00108557, + 0x00108559, 0x00108574, 0x00108559, 0x00108557, + 0x00105f34, 0x0010931f, 0x00108559, 0x00108559, + 0x00108557, 0x00108557, 0x00108557, 0x0010867f, + 0x00108559, 0x0010ac8b, 0x0010ac8b, 0x0201f800, + 0x0010032d, 0x4803c856, 0x80000580, 0x1c01f000, + 0x4803c856, 0x8d3e7d02, 0x04020015, 0x0401fbf4, + 0x0400000f, 0x59325809, 0x41780800, 0x4d400000, + 0x42028000, 0x00000005, 0x0201f800, 0x00104543, + 0x5c028000, 0x0201f800, 0x00108f22, 0x0201f800, + 0x00108b01, 0x0201f800, 0x000203ab, 0x0201f800, + 0x00107144, 0x82000540, 0x00000001, 0x1c01f000, + 0x4933c857, 0x0201f800, 0x001040c4, 0x0400000b, + 0x59300415, 0x84000556, 0x48026415, 0x0401f812, + 0x4df00000, 0x59300415, 0x84000516, 0x48026415, + 0x5c03e000, 0x1c01f000, 0x4d400000, 0x42028000, + 0x00000010, 0x0201f800, 0x00109e4a, 0x4a026407, + 0x00000006, 0x4a026203, 0x00000007, 0x5c028000, + 0x1c01f000, 0x4933c857, 0x0201f800, 0x001061b2, + 0x4df00000, 0x0401f8da, 0x82000c80, 0x0000000e, + 0x02021800, 0x0010032d, 0x0c01f001, 0x001085a7, + 0x0010862a, 0x001085be, 0x0010863e, 0x00108625, + 0x001085a5, 0x001085a7, 0x001085a7, 0x001085ab, + 0x001085a7, 0x001085a7, 0x001085a7, 0x001085a7, + 0x001085be, 0x0201f800, 0x0010032d, 0x5c03e000, + 0x02000800, 0x0010619f, 0x0401f7af, 0x5c03e000, + 0x02000800, 0x0010619f, 0x59300407, 0x82000580, + 0x00000003, 0x040207ab, 0x59300203, 0x82000580, + 0x0000000d, 0x040007a7, 0x8d3e7d02, 0x040207a5, + 0x4d340000, 0x5932680a, 0x0201f800, 0x00104126, + 0x5c026800, 0x0401f79f, 0x0201f800, 0x00109391, + 0x59300004, 0x8400055c, 0x48026004, 0x0201f800, + 0x0010619f, 0x59300407, 0x82000580, 0x00000006, + 0x04000057, 0x8d3e7d02, 0x04020055, 0x497a621e, + 0x59300203, 0x82000580, 0x0000000d, 0x04000003, + 0x4a02621e, 0x00000003, 0x0401fb81, 0x04020004, + 0x8d3e7d00, 0x04000040, 0x0401f034, 0x4d2c0000, + 0x4d400000, 0x59325809, 0x0201f800, 0x00108b01, + 0x592c0409, 0x8c000512, 0x04000009, 0x4d2c0000, + 0x84000512, 0x48025c09, 0x592c080a, 0x40065800, + 0x0201f800, 0x00100589, 0x5c025800, 0x4d400000, + 0x42028000, 0x00000005, 0x592c0a09, 0x8c040d0e, + 0x04000004, 0x42028000, 0x00000002, 0x0401f001, + 0x0201f800, 0x00104543, 0x5c028000, 0x0201f800, + 0x00108f22, 0x8d3e7d00, 0x04020004, 0x0201f800, + 0x0010af23, 0x04020004, 0x0201f800, 0x000203ab, + 0x497a6009, 0x5c028000, 0x5c025800, 0x8d3e7d00, + 0x0400000d, 0x59300a1e, 0x82040d80, 0x00000003, + 0x04020006, 0x4d340000, 0x5932680a, 0x0201f800, + 0x00104126, 0x5c026800, 0x0201f800, 0x00107144, + 0x0401f013, 0x0201f800, 0x0010af23, 0x04020006, 0x59300a1e, 0x82040d80, 0x00000003, 0x02000800, - 0x0010410c, 0x5c025800, 0x497a6009, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010df61, 0x5c027800, - 0x42003000, 0x00000011, 0x0201f800, 0x0010a4ae, - 0x42000000, 0x0010bc1d, 0x0201f800, 0x0010ad1d, - 0x4c5c0000, 0x4130b800, 0x0201f800, 0x001070f5, - 0x04000008, 0x4936600a, 0x4d300000, 0x405e6000, - 0x0201f800, 0x001070b5, 0x5c026000, 0x0401f002, - 0x405e6000, 0x5c00b800, 0x497a6009, 0x4a026407, - 0x00000001, 0x4a026403, 0x00000001, 0x8d0e1d20, - 0x04000011, 0x4a026407, 0x00000004, 0x4a026203, - 0x00000007, 0x4a026421, 0x00000001, 0x42003000, - 0x00000004, 0x4d400000, 0x42028000, 0x00000029, - 0x41782800, 0x0201f800, 0x00109f37, 0x5c028000, - 0x1c01f000, 0x42000800, 0x0000000b, 0x0201f800, - 0x00103d8a, 0x4a026203, 0x00000001, 0x0201f000, - 0x00105fe8, 0x42000000, 0x0010bc30, 0x0201f800, - 0x0010ad1d, 0x59300203, 0x82000c80, 0x0000000e, - 0x02021800, 0x0010032d, 0x4803c857, 0x0c01f001, - 0x00108866, 0x0010884e, 0x00108852, 0x00108867, - 0x00108850, 0x0010884e, 0x0010884e, 0x0010884e, - 0x0010884e, 0x0010884e, 0x0010884e, 0x0010884e, - 0x0010884e, 0x0010884e, 0x0201f800, 0x0010032d, - 0x0201f800, 0x00100bd4, 0x4d2c0000, 0x59325809, - 0x4a025a07, 0x00000006, 0x0201f800, 0x000203ab, - 0x5c025800, 0x497a6009, 0x4a02621e, 0x0000000a, - 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, - 0x4a026407, 0x00000002, 0x42000800, 0x8000404b, - 0x0201f000, 0x000209b1, 0x1c01f000, 0x0201f800, - 0x0010610d, 0x4df00000, 0x0401fd3a, 0x04020004, - 0x0201f800, 0x00106351, 0x0402000d, 0x0201f800, - 0x0010e1ca, 0x80c40040, 0x04020005, 0x5c03e000, - 0x0201f800, 0x001060fa, 0x0401f7dc, 0x0201f800, - 0x00106018, 0x02020800, 0x0010032d, 0x5c03e000, - 0x0201f800, 0x001060fa, 0x59300203, 0x82000d80, - 0x00000003, 0x02000800, 0x0010032d, 0x82000c80, - 0x0000000e, 0x02021800, 0x0010032d, 0x0c01f7b9, - 0x59a8000d, 0x59a8084f, 0x80040400, 0x80080480, - 0x04021004, 0x82000540, 0x00000001, 0x1c01f000, - 0x480bc857, 0x80000580, 0x1c01f000, 0x0401f807, - 0x42018800, 0x00000000, 0x04000003, 0x42018800, - 0x00000001, 0x1c01f000, 0x4c040000, 0x59300809, - 0x59a8000c, 0x80040480, 0x04001007, 0x59a8000a, - 0x80040480, 0x04021004, 0x800409c0, 0x5c000800, - 0x1c01f000, 0x800409c0, 0x02020800, 0x0010032d, - 0x4803c856, 0x0401f7fa, 0x4803c856, 0x4d300000, - 0x0201f800, 0x000209ee, 0x0400000a, 0x0401f832, - 0x4d380000, 0x42027000, 0x0000004b, 0x0201f800, - 0x00020a34, 0x5c027000, 0x82000540, 0x00000001, - 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x0201f800, 0x001070f5, 0x0400001e, 0x0401f822, - 0x4d300000, 0x0201f800, 0x0010610d, 0x4df00000, - 0x4d3c0000, 0x42027800, 0x00002000, 0x0201f800, - 0x0010e5a4, 0x0201f800, 0x0010e63d, 0x0201f800, - 0x0010ea62, 0x5c027800, 0x5c03e000, 0x02000800, - 0x001060fa, 0x5c026000, 0x8d3e7d3e, 0x0402000b, - 0x4d380000, 0x42027000, 0x0000004c, 0x0201f800, - 0x00020a34, 0x5c027000, 0x82000540, 0x00000001, - 0x5c026000, 0x1c01f000, 0x0201f800, 0x00020a10, - 0x0401f7fa, 0x592c0408, 0x494a6018, 0x494e6019, - 0x4936600a, 0x492e6009, 0x4a026407, 0x00000003, - 0x800000c2, 0x800008c4, 0x80040400, 0x48026006, - 0x1c01f000, 0x493bc857, 0x4d300000, 0x0201f800, - 0x000209ee, 0x0400000d, 0x0401ffef, 0x4d400000, - 0x42028000, 0x00000005, 0x0401f80d, 0x5c028000, - 0x8d3e7d3e, 0x04020007, 0x0201f800, 0x00020a34, - 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, - 0x0201f800, 0x00020a10, 0x0401f7fa, 0x4803c856, - 0x0201f800, 0x0010610d, 0x4df00000, 0x4d3c0000, - 0x4d440000, 0x59368c03, 0x42027800, 0x00002001, - 0x0201f800, 0x0010e51f, 0x0201f800, 0x0010e569, - 0x0201f800, 0x0010e63d, 0x0201f800, 0x0010ea62, - 0x5c028800, 0x5c027800, 0x5c03e000, 0x02000000, - 0x001060fa, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x0201f800, 0x001070f5, 0x0400000f, 0x481a601d, - 0x48ee6022, 0x4936600a, 0x4a026407, 0x00000001, - 0x492e6009, 0x4d380000, 0x42027000, 0x0000001f, - 0x0201f800, 0x00020a34, 0x5c027000, 0x82000540, - 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x0201f800, 0x001070f5, 0x0400000e, - 0x48ee6022, 0x4936600a, 0x4a026407, 0x00000001, - 0x492e6009, 0x4d380000, 0x42027000, 0x00000055, - 0x0201f800, 0x00020a34, 0x5c027000, 0x82000540, - 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x0201f800, 0x001070f5, 0x0400000f, - 0x481a601d, 0x48ee6022, 0x4936600a, 0x4a026407, - 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, - 0x0000003d, 0x0201f800, 0x00020a34, 0x5c027000, - 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x0201f800, 0x001070f5, - 0x04000014, 0x4936600a, 0x492fc857, 0x4933c857, - 0x592c0405, 0x8c00051e, 0x04000003, 0x48efc857, - 0x48ee6022, 0x4a026407, 0x00000001, 0x492e6009, - 0x4d380000, 0x42027000, 0x00000000, 0x0201f800, - 0x00020a34, 0x5c027000, 0x82000540, 0x00000001, - 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x0201f800, 0x001070f5, 0x0400000f, 0x48ee6022, - 0x481a601d, 0x4936600a, 0x4a026407, 0x00000001, - 0x492e6009, 0x4d380000, 0x42027000, 0x00000044, - 0x0201f800, 0x00020a34, 0x5c027000, 0x82000540, - 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x0201f800, 0x001070f5, 0x0400000f, - 0x481a601d, 0x48ee6022, 0x4936600a, 0x4a026407, - 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, - 0x00000049, 0x0201f800, 0x00020a34, 0x5c027000, - 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, - 0x5930000a, 0x80001540, 0x02000800, 0x0010032d, - 0x5808040b, 0x4803c856, 0x80000040, 0x04001003, - 0x4800140b, 0x04020009, 0x58080010, 0x80000540, - 0x04000006, 0x58080203, 0x80000540, 0x04020003, - 0x4a001203, 0x00000001, 0x1c01f000, 0x4803c856, - 0x59300403, 0x82000d80, 0x00000002, 0x0400000f, - 0x82000d80, 0x00000003, 0x0400000c, 0x82000d80, - 0x00000004, 0x04000009, 0x599c0819, 0x8c040d0e, - 0x04000004, 0x82000d80, 0x00000000, 0x04000003, - 0x82000540, 0x00000001, 0x1c01f000, 0x0401f807, - 0x42018800, 0x00000001, 0x04000003, 0x42018800, - 0x00000000, 0x1c01f000, 0x4803c856, 0x4c000000, - 0x4d2c0000, 0x59300407, 0x82000580, 0x00000004, - 0x0400001d, 0x59300009, 0x80025d40, 0x800001c0, - 0x04000019, 0x0201f800, 0x00108e64, 0x04000014, - 0x59300407, 0x82004580, 0x00000010, 0x04000010, - 0x82004580, 0x00000011, 0x0400000d, 0x82004580, - 0x00000003, 0x0400000c, 0x82004580, 0x00000002, - 0x04000009, 0x82004580, 0x0000000a, 0x04000006, - 0x592c0405, 0x8c00051e, 0x04000003, 0x80000580, - 0x0401f003, 0x82000540, 0x00000001, 0x5c025800, - 0x5c000000, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x0201f800, 0x001070f5, 0x04000013, 0x4936600a, - 0x48ee6022, 0x4a026407, 0x00000001, 0x492e6009, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010df61, - 0x5c027800, 0x4d380000, 0x42027000, 0x00000028, - 0x0201f800, 0x00020a34, 0x5c027000, 0x82000540, - 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x83380580, 0x00000015, 0x0402000d, 0x59a8005a, - 0x82000580, 0x00000074, 0x04020009, 0x0201f800, - 0x00103e68, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000029, 0x0201f000, 0x00105fe8, 0x0201f800, - 0x00107851, 0x0201f000, 0x00020a10, 0x4803c856, - 0x83380580, 0x00000016, 0x04020007, 0x42000800, - 0x00000004, 0x0201f800, 0x00103d8a, 0x0201f000, - 0x00107319, 0x83380580, 0x00000015, 0x04020013, - 0x59a8005a, 0x82000580, 0x00000014, 0x0402000f, - 0x0201f800, 0x00103ecf, 0x0201f800, 0x00107d37, - 0x0402000a, 0x59340404, 0x80000540, 0x04000007, - 0x42000800, 0x00000006, 0x0201f800, 0x00103d8a, - 0x0201f000, 0x00107319, 0x0201f800, 0x00107851, - 0x0201f000, 0x00020a10, 0x4803c856, 0x592c0207, - 0x82000580, 0x00000005, 0x04000002, 0x1c01f000, - 0x4803c856, 0x592c0209, 0x8400054a, 0x48025a09, - 0x1c01f000, 0x59300809, 0x800409c0, 0x04000008, - 0x58040205, 0x82000580, 0x00000152, 0x04020004, - 0x59a8082a, 0x48066006, 0x1c01f000, 0x599c0416, - 0x800001c0, 0x04000008, 0x82000c80, 0x00000004, - 0x04001005, 0x800000c2, 0x800008c4, 0x80040c00, - 0x0401f7f5, 0x59300403, 0x82000580, 0x00000002, - 0x040207f0, 0x5930080a, 0x58040403, 0x82000580, - 0x000007fe, 0x040207eb, 0x42000800, 0x00000028, - 0x0401f7e9, 0x497a6205, 0x497a6009, 0x4a026203, - 0x00000001, 0x4a026403, 0x00000050, 0x42000800, - 0x80000043, 0x0201f000, 0x000209b1, 0x4933c857, - 0x4d340000, 0x5932680a, 0x59340200, 0x8c00050e, - 0x04000006, 0x59300407, 0x82000c80, 0x00000014, - 0x04021004, 0x0c01f806, 0x5c026800, 0x1c01f000, - 0x0201f800, 0x00108655, 0x0401f7fc, 0x00108655, - 0x00108a9b, 0x00108a9f, 0x00108aa2, 0x0010a040, - 0x0010a05d, 0x0010a061, 0x00108655, 0x00108655, - 0x00108655, 0x00108655, 0x00108655, 0x00108655, - 0x00108655, 0x00108655, 0x00108655, 0x00108655, - 0x00108655, 0x00108655, 0x00108655, 0x4803c856, - 0x40000000, 0x40000000, 0x1c01f000, 0x40000000, - 0x40000000, 0x1c01f000, 0x5930001d, 0x4803c857, - 0x59300415, 0x4933c857, 0x4803c857, 0x8c000502, - 0x04000005, 0x4803c857, 0x84000540, 0x48026415, - 0x1c01f000, 0x42000000, 0xd0000000, 0x41300800, - 0x0201f800, 0x00100899, 0x0401f810, 0x0402000e, - 0x59300c15, 0x59300403, 0x82000580, 0x00000040, - 0x04000003, 0x84040d40, 0x0401f005, 0x59a8002a, - 0x82000400, 0x0000000a, 0x48026205, 0x84040d42, - 0x48066415, 0x1c01f000, 0x4933c857, 0x4d340000, - 0x5932680a, 0x59340a00, 0x8c040d0e, 0x02000800, - 0x0010032d, 0x5930001d, 0x80000540, 0x04020033, - 0x59300403, 0x4803c857, 0x82000580, 0x00000040, - 0x04000003, 0x8d0e1d0e, 0x0402002a, 0x4d1c0000, - 0x41323800, 0x0201f800, 0x001070f5, 0x04000023, - 0x4932381d, 0x591c0415, 0x84000542, 0x48023c15, - 0x4936600a, 0x591c0407, 0x82000580, 0x00000003, - 0x04000006, 0x591c0202, 0x4802641a, 0x591c0402, - 0x4802621a, 0x0401f005, 0x591c0202, 0x4802621a, - 0x591c0402, 0x4802641a, 0x491e601f, 0x4a026407, - 0x00000001, 0x4a026403, 0x00000035, 0x4a026203, - 0x00000001, 0x42000800, 0x80000040, 0x0201f800, - 0x000209b1, 0x411e6000, 0x5c023800, 0x80000580, - 0x5c026800, 0x1c01f000, 0x411e6000, 0x5c023800, - 0x59a8002c, 0x48026205, 0x82000540, 0x00000001, - 0x0401f7f8, 0x4933c857, 0x4d2c0000, 0x4932381d, - 0x4a026202, 0x0000ffff, 0x591e5809, 0x591c0008, - 0x8c00051e, 0x04000005, 0x8400051e, 0x48023808, - 0x497a580a, 0x0401f018, 0x592c0409, 0x8c000518, - 0x04000015, 0x84000518, 0x48025c09, 0x4d400000, - 0x592e8207, 0x4a025a07, 0x00000001, 0x0401fb52, - 0x49425a07, 0x5c028000, 0x497a580a, 0x592c0409, - 0x8c000512, 0x04000008, 0x4d2c0000, 0x84000512, - 0x48025c09, 0x592e580a, 0x0201f800, 0x00100589, - 0x5c025800, 0x59a8002c, 0x48026205, 0x591c0215, - 0x48026217, 0x82000d80, 0x00000001, 0x04000008, - 0x4a023a03, 0x00000002, 0x82000580, 0x00000005, - 0x04000008, 0x497a6016, 0x0401f01e, 0x591c0008, - 0x84000540, 0x48023808, 0x4a023a03, 0x00000004, - 0x591c0415, 0x4803c857, 0x8400051c, 0x84000554, - 0x48023c15, 0x592c0010, 0x40001000, 0x591c0817, - 0x80040480, 0x040217f0, 0x591c0017, 0x82000500, - 0xfffffffc, 0x48026016, 0x48023817, 0x591c0a15, - 0x4807c857, 0x82040d80, 0x00000005, 0x04020005, - 0x480bc857, 0x4803c857, 0x4a023813, 0xffffffff, - 0x591c0402, 0x4802641a, 0x591c0202, 0x4802621a, - 0x591e680a, 0x4936600a, 0x4a026407, 0x00000001, - 0x4a026403, 0x00000039, 0x4a026203, 0x00000001, - 0x42000800, 0x80000040, 0x0201f800, 0x000209b1, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x59300415, - 0x8c000514, 0x04000015, 0x8c00051c, 0x04020012, - 0x59300017, 0x80100480, 0x04001006, 0x04000005, - 0x59300415, 0x84000514, 0x8400055c, 0x0401f009, - 0x48126017, 0x48126013, 0x40100000, 0x592c1810, - 0x800c0480, 0x48026012, 0x59300415, 0x84000514, - 0x48026415, 0x1c01f000, 0x4933c857, 0x8c00051c, - 0x04020008, 0x59300013, 0x4803c857, 0x48026017, - 0x59300415, 0x8400055c, 0x4803c857, 0x48026415, - 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, - 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, - 0x59300c03, 0x4933c857, 0x4807c857, 0x82040480, - 0x00000034, 0x04001006, 0x82040480, 0x0000003c, - 0x04021003, 0x80000580, 0x1c01f000, 0x82000540, - 0x00000001, 0x0401f7fd, 0x41780800, 0x59a81028, - 0x42000000, 0x00000032, 0x0201f800, 0x00105f69, - 0x800811c0, 0x04020003, 0x42001000, 0x00000014, - 0x480b502a, 0x59a81029, 0x480b5022, 0x41780800, - 0x42000000, 0x00000064, 0x0201f800, 0x00105f69, - 0x800811c0, 0x04020003, 0x42001000, 0x00000014, - 0x480b502b, 0x82081400, 0x0000000a, 0x480b502c, - 0x42000800, 0x00000001, 0x0201f800, 0x00106134, - 0x42000000, 0x30000000, 0x40080800, 0x0201f800, - 0x00020105, 0x42000800, 0x00000003, 0x59a8100f, - 0x0201f800, 0x00106134, 0x0201f000, 0x001040e5, - 0x4a03502a, 0x00000028, 0x4a03502b, 0x00000014, - 0x4a035022, 0x000007d0, 0x42001000, 0x0000001e, - 0x480b502c, 0x42000800, 0x00000001, 0x0201f800, - 0x00106134, 0x42000000, 0x30000000, 0x40080800, - 0x0201f800, 0x00020105, 0x42000800, 0x00000003, - 0x59a8100f, 0x0201f000, 0x00106134, 0x4933c857, - 0x4d2c0000, 0x59300403, 0x82000580, 0x0000003e, - 0x04020005, 0x59325818, 0x812e59c0, 0x02020800, - 0x00100580, 0x5c025800, 0x1c01f000, 0x4937c857, - 0x4d300000, 0x0201f800, 0x001070f5, 0x04000011, - 0x4936600a, 0x4a026407, 0x00000001, 0x492e6009, - 0x42000800, 0x00000009, 0x0201f800, 0x00103d8a, - 0x4d380000, 0x42027000, 0x00000033, 0x0201f800, - 0x00020a34, 0x5c027000, 0x82000540, 0x00000001, - 0x5c026000, 0x1c01f000, 0x4933c857, 0x4d2c0000, - 0x4c580000, 0x4d3c0000, 0x59325809, 0x83380580, - 0x00000015, 0x04020025, 0x59a8b05a, 0x82580c80, - 0x00000019, 0x04001003, 0x4200b000, 0x00000018, - 0x8058b104, 0x0401fa18, 0x80000580, 0x0401fa28, - 0x832cac00, 0x0000000a, 0x83cca400, 0x00000006, - 0x0201f800, 0x0010adef, 0x4c600000, 0x4200c000, - 0x00000001, 0x592c100b, 0x8c081518, 0x04020006, - 0x59a8000f, 0x592c100e, 0x80080580, 0x04020007, - 0x4178c000, 0x5930100a, 0x58081403, 0x417a7800, - 0x0201f800, 0x00101a8f, 0x5c00c000, 0x0201f800, - 0x00107319, 0x0401f008, 0x4200b000, 0x00000002, - 0x0401fa17, 0x0201f800, 0x00107851, 0x0201f800, - 0x00020a10, 0x5c027800, 0x5c00b000, 0x5c025800, - 0x1c01f000, 0x4933c856, 0x42018800, 0x00000000, - 0x4936600a, 0x4a026407, 0x00000001, 0x492e6009, - 0x4d380000, 0x42027000, 0x0000004d, 0x0201f800, - 0x00020a34, 0x5c027000, 0x82000540, 0x00000001, - 0x42018800, 0x00000001, 0x1c01f000, 0x4803c856, - 0x4d2c0000, 0x83380580, 0x00000015, 0x0402002c, - 0x59a8085a, 0x59325809, 0x5930040b, 0x80040580, - 0x04020027, 0x4c500000, 0x4c540000, 0x4c580000, - 0x83cca400, 0x00000006, 0x4050a800, 0x5930b40b, - 0x8258b400, 0x00000003, 0x8058b104, 0x0201f800, - 0x0010ae19, 0x83cca400, 0x00000006, 0x592cb206, - 0x8258b400, 0x00000003, 0x8058b104, 0x832cac00, - 0x00000007, 0x0201f800, 0x0010adef, 0x592e5801, - 0x812e59c0, 0x040207f6, 0x5931d822, 0x58ef400a, - 0x58ee580c, 0x4a025a05, 0x00000103, 0x58ec0008, - 0x0801f800, 0x59300402, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x5c025800, 0x1c01f000, 0x0201f800, - 0x00107851, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x82040d80, 0x00000035, 0x04000005, 0x5930141a, - 0x0401f858, 0x04000027, 0x0401f006, 0x4d300000, - 0x5932601f, 0x0401f85d, 0x5c026000, 0x04000020, - 0x591c0c07, 0x82040580, 0x00000003, 0x04000004, - 0x82040580, 0x00000006, 0x0402001c, 0x591c0c02, - 0x5930041a, 0x80040580, 0x04000009, 0x5930021a, - 0x80040580, 0x04020015, 0x591c0a02, 0x5930041a, - 0x80040580, 0x04020011, 0x0401f009, 0x59300a1a, - 0x82040580, 0x0000ffff, 0x04000005, 0x591c0202, - 0x59300a1a, 0x80040580, 0x04020008, 0x591c000a, - 0x5930080a, 0x80040580, 0x1c01f000, 0x417a3800, - 0x82000540, 0x00000001, 0x1c01f000, 0x4803c856, - 0x59b800e4, 0x8c000538, 0x02020800, 0x0010032d, - 0x42000800, 0x0000ff00, 0x4a0370e4, 0x20000000, - 0x59b800e4, 0x80040840, 0x02000800, 0x0010032d, - 0x8c00053c, 0x040207f9, 0x4a0370e4, 0x30000000, - 0x40000000, 0x40000000, 0x40000000, 0x59b800e4, - 0x8c00053c, 0x040207f1, 0x1c01f000, 0x4803c856, - 0x4a0370e4, 0x20000000, 0x40000000, 0x59b800e4, - 0x8c000538, 0x040207fb, 0x1c01f000, 0x0401f807, - 0x42018800, 0x00000001, 0x04020003, 0x42018800, - 0x00000000, 0x1c01f000, 0x59300808, 0x8c040d1e, - 0x592c0c09, 0x04020002, 0x8c040d18, 0x1c01f000, - 0x0201f800, 0x00108888, 0x04000007, 0x800800c4, - 0x800808ca, 0x80040c00, 0x82063c00, 0x0010f584, - 0x491fc857, 0x1c01f000, 0x0201f800, 0x001091d9, - 0x04020007, 0x59301402, 0x0401fff2, 0x04000007, - 0x411c0000, 0x81300580, 0x04000003, 0x81780500, - 0x0401f002, 0x81300540, 0x1c01f000, 0x4d300000, - 0x0201f800, 0x00020319, 0x0402000a, 0x42026000, - 0x0010f53c, 0x4936600a, 0x492e6009, 0x0201f800, - 0x0010df61, 0x80000580, 0x5c026000, 0x1c01f000, - 0x82000540, 0x00000001, 0x0401f7fc, 0x4933c857, - 0x0201f800, 0x0010889a, 0x02000800, 0x0010032d, - 0x4d2c0000, 0x4d340000, 0x4d440000, 0x4c580000, - 0x59325809, 0x5932680a, 0x49425a07, 0x0201f800, - 0x00104f41, 0x592e8c07, 0x592c4208, 0x82200500, - 0x0000000f, 0x0c01f806, 0x5c00b000, 0x5c028800, - 0x5c026800, 0x5c025800, 0x1c01f000, 0x00108d2a, - 0x00108d4c, 0x00108d53, 0x00108d57, 0x00108d60, - 0x00108d27, 0x00108d27, 0x00108d27, 0x00108d64, - 0x00108d70, 0x00108d70, 0x00108d27, 0x00108d27, - 0x00108d27, 0x00108d27, 0x00108d27, 0x4803c857, - 0x0201f800, 0x0010032d, 0x814281c0, 0x04020012, - 0x41785800, 0x592c0405, 0x8c00051c, 0x04020002, - 0x59345c05, 0x442c2800, 0x59340008, 0x48002802, - 0x59340009, 0x48002801, 0x59340006, 0x48002804, - 0x59340007, 0x48002803, 0x4200b000, 0x0000000b, - 0x0401f037, 0x592c0208, 0x8c00051e, 0x4200b000, - 0x00000002, 0x04020032, 0x8204b540, 0x00000000, - 0x0400002f, 0x44042800, 0x5932680a, 0x59340400, - 0x48002801, 0x4200b000, 0x00000002, 0x0401f028, - 0x814281c0, 0x040207f0, 0x59345c05, 0x442c2800, - 0x4200b000, 0x00000001, 0x0401f021, 0x8340b540, - 0x00000000, 0x0400001e, 0x0401f027, 0x814281c0, - 0x04020025, 0x59340200, 0x44002800, 0x59340001, - 0x48002801, 0x4200b000, 0x00000002, 0x0401f014, - 0x8340b540, 0x00000000, 0x0402001b, 0x0401f010, - 0x8340b540, 0x00000000, 0x0400000d, 0x0201f800, - 0x001041ae, 0x04000014, 0x8c20450e, 0x04000002, - 0x497a600a, 0x4178b000, 0x497a5a07, 0x0401f004, - 0x8340b540, 0x00000000, 0x0402000b, 0x592c0405, - 0x8400051c, 0x48025c05, 0x592c0208, 0x8400051e, - 0x48025a08, 0x0401f8ac, 0x497a6009, 0x0201f000, - 0x000203ab, 0x592c0208, 0x8c00051e, 0x4200b000, - 0x00000002, 0x040207f2, 0x8204b540, 0x00000000, - 0x040007ef, 0x44042800, 0x4200b000, 0x00000001, - 0x0401f7eb, 0x4937c857, 0x4d300000, 0x0201f800, - 0x001070f5, 0x04000011, 0x4936600a, 0x4a026407, - 0x00000001, 0x492e6009, 0x42000800, 0x0000000b, - 0x0201f800, 0x00103d8a, 0x4d380000, 0x42027000, - 0x00000043, 0x0201f800, 0x00020a34, 0x5c027000, - 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, - 0x4937c857, 0x4d2c0000, 0x59325809, 0x83380580, - 0x00000015, 0x04020028, 0x59a8005a, 0x82000580, - 0x00000004, 0x04020024, 0x59a8000f, 0x592c100a, - 0x80080580, 0x04020013, 0x4d440000, 0x592e8c07, - 0x592c0208, 0x4803c856, 0x82000500, 0x00000080, - 0x84000548, 0x4d3c0000, 0x42027800, 0x00001000, - 0x8c00050e, 0x04000002, 0x853e7d5c, 0x0201f800, - 0x00104115, 0x5c027800, 0x5c028800, 0x0401f004, - 0x4803c856, 0x0201f800, 0x001041ae, 0x0201f800, - 0x0010889a, 0x04000017, 0x4d400000, 0x42028000, - 0x00000000, 0x41780800, 0x0401ff35, 0x5c028000, - 0x0401f00e, 0x0201f800, 0x001041ae, 0x040207f4, - 0x0201f800, 0x0010889a, 0x0400000a, 0x4c580000, - 0x4200b000, 0x00000002, 0x0401f86d, 0x5c00b000, - 0x0201f800, 0x00107851, 0x0201f800, 0x00020a10, - 0x5c025800, 0x1c01f000, 0x4937c857, 0x4d300000, - 0x0201f800, 0x001070f5, 0x04000012, 0x4936600a, - 0x4a026407, 0x00000001, 0x4d3c0000, 0x4d380000, - 0x417a7800, 0x0201f800, 0x00103d7f, 0x492e6009, - 0x42027000, 0x00000004, 0x0201f800, 0x00020a34, - 0x5c027000, 0x5c027800, 0x82000540, 0x00000001, - 0x5c026000, 0x1c01f000, 0x4937c857, 0x4d300000, - 0x0201f800, 0x001070f5, 0x04000011, 0x4936600a, - 0x42000800, 0x00000003, 0x0201f800, 0x00103d8a, - 0x4a026407, 0x00000001, 0x492e6009, 0x4d380000, - 0x42027000, 0x00000051, 0x0201f800, 0x00020a34, - 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, - 0x1c01f000, 0x4933c857, 0x42028800, 0x000007fc, - 0x42003000, 0x00fffffc, 0x0201f800, 0x00103dcb, - 0x02020800, 0x0010032d, 0x4936600a, 0x417a7800, - 0x0201f800, 0x00103d7f, 0x42000800, 0x00000003, - 0x0201f800, 0x00103d8a, 0x497a6c12, 0x4a026203, - 0x00000001, 0x4a026403, 0x00000002, 0x0201f000, - 0x00105fe8, 0x492fc857, 0x4c580000, 0x4c000000, - 0x8058b1c0, 0x0400000b, 0x82580500, 0xfffffff0, - 0x02020800, 0x0010032d, 0x8058b0d0, 0x592c0409, - 0x82000500, 0xfffff0ff, 0x80580540, 0x48025c09, - 0x5c000000, 0x5c00b000, 0x1c01f000, 0x492fc857, - 0x4c000000, 0x4c040000, 0x800000d8, 0x592c0c09, - 0x82040d00, 0xffff0fff, 0x80040540, 0x48025c09, - 0x5c000800, 0x5c000000, 0x1c01f000, 0x4933c857, - 0x4d2c0000, 0x59325809, 0x592c0208, 0x8400055e, - 0x48025a08, 0x4c500000, 0x4c540000, 0x4c580000, - 0x0401ffd9, 0x0201f800, 0x00104f41, 0x46002800, - 0x00000018, 0x80142800, 0x8058b040, 0x83cca400, - 0x00000007, 0x4014a800, 0x0201f800, 0x0010adef, - 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, - 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, - 0x59325809, 0x592c0205, 0x82000580, 0x00000152, - 0x1c01f000, 0x59300020, 0x80000540, 0x02020800, - 0x00100a76, 0x1c01f000, 0x4d2c0000, 0x59325809, - 0x59300203, 0x4933c857, 0x492fc857, 0x493bc857, - 0x4803c857, 0x82003480, 0x0000000e, 0x02021800, - 0x0010032d, 0x0c01f803, 0x5c025800, 0x1c01f000, - 0x00108e8a, 0x00108e95, 0x00108ed3, 0x00108e8a, - 0x00108e8a, 0x00108e8a, 0x00108e8a, 0x00108e8a, - 0x00108e8c, 0x00108e8a, 0x00108e8a, 0x00108e8a, - 0x00108e8a, 0x00108e8a, 0x0201f800, 0x0010032d, - 0x83383480, 0x00000058, 0x02021800, 0x0010032d, - 0x493a6403, 0x4a026203, 0x00000001, 0x0201f000, - 0x00105fe8, 0x83380580, 0x00000013, 0x04020010, - 0x492fc857, 0x592c000d, 0x800001c0, 0x04000006, - 0x4a026203, 0x00000002, 0x59a8002a, 0x48026006, - 0x1c01f000, 0x4a025a07, 0x00000000, 0x0201f800, - 0x000203ab, 0x0201f000, 0x00020a10, 0x83380580, - 0x00000027, 0x0400001b, 0x83380580, 0x00000014, - 0x04000012, 0x83380580, 0x00000015, 0x04000005, - 0x83380580, 0x00000016, 0x02020800, 0x0010032d, - 0x0201f800, 0x0010644d, 0x02020000, 0x00107134, - 0x59300203, 0x82000580, 0x00000002, 0x02020800, - 0x0010032d, 0x0401f016, 0x4937c857, 0x0201f800, - 0x0010605d, 0x4a02580f, 0x00000011, 0x0401f006, - 0x4937c857, 0x0201f800, 0x0010605d, 0x4a02580f, - 0x00000010, 0x4a025a07, 0x00000031, 0x4a02580e, - 0x00000004, 0x0201f800, 0x000203ab, 0x0201f800, - 0x001043c3, 0x0201f000, 0x001070b5, 0x59341400, - 0x82081d00, 0x000000ff, 0x59300c03, 0x480bc857, - 0x4807c857, 0x82040580, 0x00000053, 0x0400002e, - 0x82040580, 0x00000002, 0x04000016, 0x82040580, - 0x00000001, 0x04000017, 0x82040580, 0x00000003, - 0x0400001c, 0x82040580, 0x00000005, 0x0400001d, - 0x82040580, 0x00000033, 0x0400001a, 0x82040580, - 0x00000000, 0x0400001b, 0x82040580, 0x00000004, - 0x02020800, 0x0010032d, 0x0401f89e, 0x0401f016, - 0x820c0580, 0x00000003, 0x04000849, 0x0401f012, - 0x820c0580, 0x0000000b, 0x0402000f, 0x42000800, - 0x00000007, 0x0201f800, 0x00103d8a, 0x0401f00a, - 0x820c0580, 0x00000005, 0x04000861, 0x0401f006, - 0x820c0580, 0x00000009, 0x04000886, 0x0401f002, - 0x0401f890, 0x4a026403, 0x00000052, 0x59a8105a, - 0x592c040c, 0x8c000500, 0x04000003, 0x42001000, - 0x00000008, 0x592c040c, 0x8c000516, 0x04000003, - 0x82081400, 0x00000018, 0x592c000d, 0x497a580e, - 0x497a580f, 0x80080c80, 0x04000009, 0x04001005, - 0x4a025a07, 0x00000007, 0x40001000, 0x0401f006, - 0x4a025a07, 0x00000015, 0x0401f003, 0x4a025a07, - 0x00000000, 0x480a580d, 0x0201f800, 0x00107293, - 0x04000010, 0x592c1001, 0x480a600c, 0x58080800, - 0x82080400, 0x00000002, 0x592c1012, 0x592c1813, - 0x42003000, 0x00000000, 0x42002000, 0x00100f89, - 0x0201f800, 0x00107420, 0x04000002, 0x1c01f000, - 0x4a025a07, 0x0000002c, 0x497a580d, 0x0201f800, - 0x000203ab, 0x0201f000, 0x00020a10, 0x83380580, - 0x00000015, 0x0402000a, 0x59a8006d, 0x8c000502, - 0x0402000b, 0x0201f800, 0x00103e68, 0x42000800, - 0x00000004, 0x0201f000, 0x00103d8a, 0x42000800, - 0x00000007, 0x0201f000, 0x00103d8a, 0x0201f800, - 0x00104716, 0x42001000, 0x00000010, 0x04020009, - 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, - 0x00ff0000, 0x040007ec, 0x42001000, 0x00000008, - 0x0201f800, 0x00104429, 0x040007e7, 0x592c040c, - 0x84000540, 0x48025c0c, 0x0401f7e9, 0x83380580, - 0x00000015, 0x0402000f, 0x59a8006d, 0x8c000502, - 0x04020010, 0x0201f800, 0x00103ecf, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x00103d7f, 0x5c027800, - 0x42000800, 0x00000006, 0x0201f000, 0x00103d8a, - 0x42000800, 0x00000004, 0x0201f000, 0x00103d8a, - 0x0201f800, 0x00104716, 0x42001000, 0x00000010, - 0x04020009, 0x59340002, 0x82000500, 0x00ff0000, - 0x82000580, 0x00ff0000, 0x040007e7, 0x42001000, - 0x00000008, 0x0201f800, 0x00104429, 0x040007e2, - 0x592c040c, 0x84000540, 0x48025c0c, 0x0401f7e9, - 0x42000800, 0x00000004, 0x0201f000, 0x00103d8a, - 0x83380580, 0x00000015, 0x04020005, 0x0201f800, - 0x00109eb3, 0x02000800, 0x0010408c, 0x1c01f000, - 0x83380580, 0x00000015, 0x0402001d, 0x4c580000, - 0x83cc1400, 0x00000008, 0x4200b000, 0x00000002, - 0x83341c00, 0x00000006, 0x0201f800, 0x00107d52, - 0x04020012, 0x83cc1400, 0x0000000a, 0x4200b000, - 0x00000002, 0x83341c00, 0x00000008, 0x0201f800, - 0x00107d52, 0x04020009, 0x59342200, 0x59cc1007, - 0x800811c0, 0x04000003, 0x480a6801, 0x84102542, - 0x8410251a, 0x48126a00, 0x5c00b000, 0x1c01f000, - 0x42000000, 0x0010bc35, 0x0201f800, 0x0010ad1d, - 0x0201f800, 0x0010610d, 0x59300203, 0x4933c857, - 0x4803c857, 0x82000c80, 0x0000000e, 0x02021800, - 0x0010032d, 0x0c01f803, 0x0201f000, 0x001060fa, - 0x00108fd8, 0x00108fe7, 0x00108fd9, 0x00108fd6, - 0x00108fd6, 0x00108fd6, 0x00108fd6, 0x00108fd6, - 0x00108fd6, 0x00108fd6, 0x00108fd6, 0x00108fd6, - 0x00108fd6, 0x00108fd6, 0x0201f800, 0x0010032d, - 0x1c01f000, 0x59300403, 0x82000580, 0x00000052, - 0x02000000, 0x0010865e, 0x0201f800, 0x001043c3, - 0x59325809, 0x4a025a07, 0x00000006, 0x0201f800, - 0x000203ab, 0x0201f000, 0x001070b5, 0x59301804, - 0x840c0520, 0x48026004, 0x598c000f, 0x81300580, - 0x04020010, 0x8c0c1d20, 0x04020010, 0x42001000, - 0x0010bb55, 0x50081000, 0x58080002, 0x82000580, - 0x00000100, 0x0400000f, 0x5808000b, 0x81300580, - 0x02020800, 0x0010032d, 0x4978100b, 0x0401f003, - 0x8c0c1d20, 0x040207dc, 0x0201f800, 0x0010e343, - 0x80c40040, 0x040007d8, 0x0201f800, 0x0010032d, - 0x0201f800, 0x00106388, 0x040007f8, 0x59300203, + 0x00108a55, 0x4a026403, 0x00000085, 0x4a026203, + 0x00000009, 0x4a026407, 0x00000002, 0x42000800, + 0x8000404b, 0x0201f800, 0x000209b1, 0x5c03e000, + 0x02020800, 0x001061b2, 0x82000540, 0x00000001, + 0x1c01f000, 0x0201f800, 0x0010619f, 0x0201f800, + 0x00100bd5, 0x0401f795, 0x598c000f, 0x81300580, + 0x04020004, 0x0201f800, 0x0010642d, 0x0402001d, + 0x0201f800, 0x0010e453, 0x80c40040, 0x04020006, + 0x59300c03, 0x82040580, 0x00000040, 0x04000774, + 0x0401f786, 0x0201f800, 0x001060bd, 0x04000011, + 0x0201f800, 0x0010032d, 0x0401f81b, 0x04020004, + 0x0201f800, 0x001063f6, 0x0402000a, 0x0201f800, + 0x0010e2da, 0x80c40040, 0x040207f3, 0x59300c03, + 0x82040580, 0x00000040, 0x04000761, 0x0401f773, + 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, + 0x0010032d, 0x0c01f746, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, + 0x1c01f000, 0x417a3000, 0x42032000, 0x0000bf32, + 0x59900004, 0x81300580, 0x04000009, 0x83932400, + 0x00000010, 0x811a3000, 0x83180480, 0x00000005, + 0x040017f8, 0x82000540, 0x00000001, 0x1c01f000, + 0x0401f803, 0x40018800, 0x1c01f000, 0x59300004, + 0x8c00053e, 0x04000010, 0x8c00050c, 0x0402000e, + 0x8c000516, 0x04020006, 0x82000d00, 0x0000001f, + 0x82040580, 0x00000005, 0x04020004, 0x42000000, + 0x00000003, 0x0401f005, 0x42000000, 0x00000001, + 0x0401f002, 0x59300203, 0x1c01f000, 0x4933c857, + 0x0201f800, 0x001061b2, 0x4df00000, 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, 0x0010032d, - 0x0c01f7bc, 0x4933c857, 0x4c500000, 0x4c540000, - 0x4c580000, 0x592c0c08, 0x48065814, 0x59cc0809, - 0x48065808, 0x59cc0808, 0x4806580c, 0x59a8086c, - 0x82040500, 0x000003ff, 0x800010c4, 0x8c040d14, - 0x04000005, 0x59cc0002, 0x82000500, 0x00000003, - 0x80081480, 0x480a621b, 0x412c0800, 0x0201f800, - 0x0010055a, 0x02000800, 0x0010032d, 0x492c080a, - 0x58040409, 0x84000552, 0x84000540, 0x48000c09, - 0x82081400, 0x00000003, 0x80081104, 0x83cca400, - 0x00000006, 0x832cac00, 0x00000005, 0x42000800, - 0x00000010, 0x82080480, 0x00000010, 0x04021003, - 0x40080800, 0x80000580, 0x4004b000, 0x4c000000, - 0x0201f800, 0x0010ae19, 0x5c000000, 0x800001c0, - 0x0400000d, 0x412c1000, 0x4c000000, 0x0201f800, - 0x0010055a, 0x02000800, 0x0010032d, 0x492c1001, - 0x832cac00, 0x00000005, 0x5c000000, 0x40001000, - 0x0401f7e9, 0x5c00b000, 0x5c00a800, 0x5c00a000, - 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c380000, - 0x59325809, 0x5930021b, 0x48025a09, 0x59301012, - 0x4a026203, 0x00000002, 0x592c020b, 0x8c000500, - 0x04000004, 0x59300016, 0x592c1010, 0x80081480, - 0x800811c0, 0x04020008, 0x4a025a07, 0x00000000, - 0x592c000c, 0x82000500, 0x00000c00, 0x0400000b, - 0x0401f00b, 0x8c08153e, 0x04000006, 0x4a025a07, - 0x00000007, 0x80081080, 0x80081000, 0x0401f003, - 0x4a025a07, 0x00000015, 0x480a5808, 0x42000000, - 0x0010c25c, 0x50007000, 0x5838000a, 0x80000540, - 0x04020008, 0x4930700b, 0x4930700a, 0x58380002, - 0x82000580, 0x00000000, 0x04020809, 0x0401f005, - 0x82001400, 0x00000000, 0x45301000, 0x4930700a, - 0x5c007000, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x592c000a, 0x40001000, 0x48007009, 0x82080400, - 0x00000005, 0x48007003, 0x592c000e, 0x592c100f, - 0x48007006, 0x48087007, 0x592c0014, 0x592c1209, - 0x80080c80, 0x04001002, 0x40001000, 0x82081400, - 0x00000003, 0x80081104, 0x82080480, 0x00000010, + 0x0c01f001, 0x00108699, 0x001086b6, 0x0010869d, + 0x00108697, 0x00108697, 0x00108697, 0x00108697, + 0x00108697, 0x00108697, 0x00108697, 0x00108697, + 0x00108697, 0x00108697, 0x00108697, 0x0201f800, + 0x0010032d, 0x5c03e000, 0x02000800, 0x0010619f, + 0x0401f6bd, 0x5c03e000, 0x02000800, 0x0010619f, + 0x4d2c0000, 0x59325809, 0x59300403, 0x82000580, + 0x00000052, 0x02000800, 0x00100fba, 0x0401faac, + 0x02000800, 0x0010032d, 0x4a025a07, 0x00000005, + 0x0201f800, 0x000203ab, 0x0201f800, 0x001043e2, + 0x0201f800, 0x00107144, 0x5c025800, 0x82000540, + 0x00000001, 0x1c01f000, 0x598c000f, 0x81300580, + 0x0402001b, 0x59300004, 0x8c000520, 0x04000004, + 0x84000520, 0x48026004, 0x0401f01b, 0x42001000, + 0x0010bc55, 0x50081000, 0x58080002, 0x82000580, + 0x00000100, 0x0400000b, 0x5808000b, 0x81300580, + 0x02020800, 0x0010032d, 0x0201f800, 0x0010e453, + 0x80c40040, 0x02020800, 0x0010032d, 0x0401f7ce, + 0x0201f800, 0x0010642d, 0x0402000d, 0x59300004, + 0x8c000520, 0x04000004, 0x84000520, 0x48026004, + 0x0401f7c5, 0x0201f800, 0x0010e453, 0x80c40040, + 0x040007c1, 0x0201f800, 0x0010032d, 0x59300203, + 0x82000c80, 0x0000000e, 0x02021800, 0x0010032d, + 0x0c01f7a5, 0x4d340000, 0x5932680a, 0x59300407, + 0x4933c857, 0x4803c857, 0x82000c80, 0x00000014, + 0x02021800, 0x0010032d, 0x0c01f803, 0x5c026800, + 0x1c01f000, 0x0010870a, 0x00108736, 0x00108880, + 0x0010ea61, 0x00108873, 0x0010887b, 0x00109e39, + 0x00108716, 0x0010886e, 0x00105f1c, 0x001088ee, + 0x00108705, 0x00108705, 0x00108705, 0x00108705, + 0x00020a10, 0x00109071, 0x00109071, 0x0010ac9b, + 0x0010ac9b, 0x0201f800, 0x0010032d, 0x0401fb7c, + 0x02000000, 0x001078e7, 0x1c01f000, 0x0201f800, + 0x001061b2, 0x0201f800, 0x00106102, 0x0201f800, + 0x0010619f, 0x0201f000, 0x00020a10, 0x4a026006, + 0x00000001, 0x1c01f000, 0x4d340000, 0x4c5c0000, + 0x59300203, 0x82000580, 0x00000011, 0x04020016, + 0x5932680a, 0x4130b800, 0x0201f800, 0x000209ee, + 0x04000010, 0x4a026203, 0x00000001, 0x4a026403, + 0x0000001e, 0x585c041a, 0x4802641a, 0x585c021a, + 0x4802621a, 0x4936600a, 0x4a026407, 0x00000001, + 0x42000800, 0x80000040, 0x0201f800, 0x000209b1, + 0x405e6000, 0x0201f800, 0x00020a10, 0x5c00b800, + 0x5c026800, 0x1c01f000, 0x42000000, 0x0010bd28, + 0x0201f800, 0x0010ae10, 0x0201f800, 0x0010a681, + 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, + 0x0010032d, 0x4803c857, 0x0c01f001, 0x00108751, + 0x00108713, 0x00108753, 0x00108751, 0x00108753, + 0x00108753, 0x0010870b, 0x00108751, 0x00108707, + 0x00108751, 0x00108751, 0x00108751, 0x00108751, + 0x00108751, 0x0201f800, 0x0010032d, 0x83340580, + 0x0010c2b2, 0x02000000, 0x00107144, 0x4d2c0000, + 0x59340400, 0x82000500, 0x000000ff, 0x82000c80, + 0x0000000c, 0x02021800, 0x0010032d, 0x59303403, + 0x82180d80, 0x00000004, 0x04020004, 0x42000000, + 0x00000001, 0x0401f006, 0x82180d80, 0x00000000, + 0x04020003, 0x42000000, 0x00000001, 0x4803c857, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x0010877b, + 0x0010881b, 0x0010877d, 0x001087b2, 0x0010877d, + 0x00108838, 0x0010877d, 0x00108787, 0x0010877b, + 0x00108838, 0x0010877b, 0x00108796, 0x0201f800, + 0x0010032d, 0x59300403, 0x82000d80, 0x00000016, + 0x0400002e, 0x82000d80, 0x00000004, 0x0400002b, + 0x82000d80, 0x00000002, 0x04000028, 0x0401fafc, + 0x04000026, 0x59300403, 0x82000d80, 0x00000022, + 0x040000af, 0x82000d80, 0x00000039, 0x040000b4, + 0x82000d80, 0x00000035, 0x040000b1, 0x82000d80, + 0x0000001e, 0x0400001b, 0x0401f9bd, 0x04000007, + 0x0201f800, 0x00108f1d, 0x04020004, 0x0201f800, + 0x001041bc, 0x0401f011, 0x59300403, 0x82000d80, + 0x00000001, 0x04020004, 0x0201f800, 0x00104181, + 0x0400000a, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010e06f, 0x5c027800, 0x42000000, 0x0010bd1d, + 0x0201f800, 0x0010ae10, 0x0201f800, 0x001078e7, + 0x0201f000, 0x00107144, 0x0401f9a1, 0x04000004, + 0x0201f800, 0x00108f1d, 0x040000a6, 0x59300c03, + 0x82040580, 0x00000016, 0x04000057, 0x82040580, + 0x00000002, 0x0402002f, 0x59a8021b, 0x8c000502, + 0x04020016, 0x59a81073, 0x8c08153e, 0x04020013, + 0x0201f800, 0x00104755, 0x04020010, 0x0201f800, + 0x00104780, 0x04020006, 0x42000000, 0x00000001, + 0x0201f800, 0x00104726, 0x0401f08e, 0x4a035014, + 0x00000001, 0x4202d800, 0x00000001, 0x0201f800, + 0x001046af, 0x0401f087, 0x59340412, 0x82000500, + 0x000000ff, 0x04000013, 0x80000040, 0x48026c12, + 0x497a6205, 0x4d300000, 0x0201f800, 0x00107188, + 0x5c000000, 0x0400000a, 0x49780009, 0x4a000407, + 0x00000007, 0x4a000006, 0x00000398, 0x4936600a, + 0x4a026407, 0x00000001, 0x0401f027, 0x40026000, + 0x59300403, 0x82000d80, 0x00000002, 0x04020010, + 0x59340403, 0x82000580, 0x000007fe, 0x0402000c, + 0x59a81073, 0x8c08153e, 0x04020004, 0x59a8021b, + 0x84000540, 0x4803521b, 0x0201f800, 0x00103a35, + 0x0201f800, 0x001078e7, 0x0401f00c, 0x0201f800, + 0x001078e7, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010e06f, 0x5c027800, 0x42000000, 0x0010bd1d, + 0x0201f800, 0x0010ae10, 0x59a81073, 0x8c08153e, + 0x04020003, 0x0201f800, 0x00101a68, 0x0201f000, + 0x00107144, 0x42000800, 0x00000003, 0x0201f800, + 0x00103d9d, 0x4a026203, 0x00000001, 0x4a026403, + 0x00000002, 0x0201f000, 0x0010608d, 0x0401f938, + 0x04020792, 0x0201f800, 0x00101a68, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010e06f, 0x5c027800, + 0x42000000, 0x0010bd1d, 0x0201f800, 0x0010ae10, + 0x42003000, 0x00000018, 0x41782800, 0x42002000, + 0x00000000, 0x4d400000, 0x4d440000, 0x59368c03, + 0x42028000, 0x00000029, 0x0201f800, 0x001091ea, + 0x5c028800, 0x5c028000, 0x0201f000, 0x00107144, + 0x0201f800, 0x001041bc, 0x0401f7c5, 0x42000000, + 0x0010bd27, 0x0201f800, 0x0010ae10, 0x0201f800, + 0x001073f9, 0x040207be, 0x1c01f000, 0x59300c03, + 0x0201f800, 0x00108d34, 0x02020000, 0x00020a10, + 0x836c0580, 0x00000003, 0x04000004, 0x4a026006, + 0x00000002, 0x1c01f000, 0x59300403, 0x48026417, + 0x4a02621e, 0x00000001, 0x4a026403, 0x00000085, + 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, + 0x42000800, 0x8000004b, 0x0201f000, 0x000209b1, + 0x0201f800, 0x001078e7, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010e06f, 0x5c027800, 0x42000000, + 0x0010bd1d, 0x0201f800, 0x0010ae10, 0x497a6009, + 0x4a026407, 0x00000007, 0x4a026006, 0x00000398, + 0x497a6205, 0x1c01f000, 0x42000000, 0x0010bd2e, + 0x0201f800, 0x0010ae10, 0x0401f6c4, 0x42000000, + 0x0010bd29, 0x0201f800, 0x0010ae10, 0x0201f800, + 0x0010a681, 0x0201f000, 0x00107144, 0x42000000, + 0x0010bd2b, 0x0201f800, 0x0010ae10, 0x1c01f000, + 0x42000000, 0x0010bd2a, 0x0201f800, 0x0010ae10, + 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, + 0x0010032d, 0x4803c857, 0x0c01f001, 0x00108899, + 0x00108713, 0x00108899, 0x00108899, 0x00108899, + 0x00108899, 0x00108899, 0x00108899, 0x00108899, + 0x00108713, 0x0010889b, 0x00108713, 0x001088a3, + 0x00108899, 0x0201f800, 0x0010032d, 0x4a026403, + 0x0000008b, 0x4a026203, 0x0000000b, 0x42000800, + 0x8000404b, 0x0201f000, 0x000209b1, 0x59300a1e, + 0x0401f8af, 0x0400000f, 0x4d2c0000, 0x59325809, + 0x4a025a07, 0x00000006, 0x497a5c0a, 0x0201f800, + 0x000203ab, 0x59300a1e, 0x82040d80, 0x00000003, + 0x02000800, 0x00104126, 0x5c025800, 0x497a6009, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010e06f, + 0x5c027800, 0x42003000, 0x00000011, 0x0201f800, + 0x0010a5a1, 0x42000000, 0x0010bd1d, 0x0201f800, + 0x0010ae10, 0x4c5c0000, 0x4130b800, 0x0201f800, + 0x00107188, 0x04000008, 0x4936600a, 0x4d300000, + 0x405e6000, 0x0201f800, 0x00107144, 0x5c026000, + 0x0401f002, 0x405e6000, 0x5c00b800, 0x497a6009, + 0x4a026407, 0x00000001, 0x4a026403, 0x00000001, + 0x8d0e1d20, 0x04000011, 0x4a026407, 0x00000004, + 0x4a026203, 0x00000007, 0x4a026421, 0x00000001, + 0x42003000, 0x00000004, 0x4d400000, 0x42028000, + 0x00000029, 0x41782800, 0x0201f800, 0x0010a00e, + 0x5c028000, 0x1c01f000, 0x42000800, 0x0000000b, + 0x0201f800, 0x00103d9d, 0x4a026203, 0x00000001, + 0x0201f000, 0x0010608d, 0x42000000, 0x0010bd30, + 0x0201f800, 0x0010ae10, 0x59300203, 0x82000c80, + 0x0000000e, 0x02021800, 0x0010032d, 0x4803c857, + 0x0c01f001, 0x0010891f, 0x00108907, 0x0010890b, + 0x00108920, 0x00108909, 0x00108907, 0x00108907, + 0x00108907, 0x00108907, 0x00108907, 0x00108907, + 0x00108907, 0x00108907, 0x00108907, 0x0201f800, + 0x0010032d, 0x0201f800, 0x00100bd5, 0x4d2c0000, + 0x59325809, 0x4a025a07, 0x00000006, 0x0201f800, + 0x000203ab, 0x5c025800, 0x497a6009, 0x4a02621e, + 0x0000000a, 0x4a026403, 0x00000085, 0x4a026203, + 0x00000009, 0x4a026407, 0x00000002, 0x42000800, + 0x8000404b, 0x0201f000, 0x000209b1, 0x1c01f000, + 0x0201f800, 0x001061b2, 0x4df00000, 0x0401fd36, + 0x04020004, 0x0201f800, 0x001063f6, 0x0402000d, + 0x0201f800, 0x0010e2da, 0x80c40040, 0x04020005, + 0x5c03e000, 0x0201f800, 0x0010619f, 0x0401f7dc, + 0x0201f800, 0x001060bd, 0x02020800, 0x0010032d, + 0x5c03e000, 0x0201f800, 0x0010619f, 0x59300203, + 0x82000d80, 0x00000003, 0x02000800, 0x0010032d, + 0x82000c80, 0x0000000e, 0x02021800, 0x0010032d, + 0x0c01f7b9, 0x59a8000d, 0x59a8084f, 0x80040400, + 0x80080480, 0x04021004, 0x82000540, 0x00000001, + 0x1c01f000, 0x480bc857, 0x80000580, 0x1c01f000, + 0x0401f807, 0x42018800, 0x00000000, 0x04000003, + 0x42018800, 0x00000001, 0x1c01f000, 0x4c040000, + 0x59300809, 0x59a8000c, 0x80040480, 0x04001007, + 0x59a8000a, 0x80040480, 0x04021004, 0x800409c0, + 0x5c000800, 0x1c01f000, 0x800409c0, 0x02020800, + 0x0010032d, 0x4803c856, 0x0401f7fa, 0x4803c856, + 0x4d300000, 0x0201f800, 0x000209ee, 0x0400000a, + 0x0401f832, 0x4d380000, 0x42027000, 0x0000004b, + 0x0201f800, 0x00020a34, 0x5c027000, 0x82000540, + 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, + 0x4d300000, 0x0201f800, 0x00107188, 0x0400001e, + 0x0401f822, 0x4d300000, 0x0201f800, 0x001061b2, + 0x4df00000, 0x4d3c0000, 0x42027800, 0x00002000, + 0x0201f800, 0x0010e6a9, 0x0201f800, 0x0010e742, + 0x0201f800, 0x0010eb5d, 0x5c027800, 0x5c03e000, + 0x02000800, 0x0010619f, 0x5c026000, 0x8d3e7d3e, + 0x0402000b, 0x4d380000, 0x42027000, 0x0000004c, + 0x0201f800, 0x00020a34, 0x5c027000, 0x82000540, + 0x00000001, 0x5c026000, 0x1c01f000, 0x0201f800, + 0x00020a10, 0x0401f7fa, 0x592c0408, 0x494a6018, + 0x494e6019, 0x4936600a, 0x492e6009, 0x4a026407, + 0x00000003, 0x800000c2, 0x800008c4, 0x80040400, + 0x48026006, 0x1c01f000, 0x493bc857, 0x4d300000, + 0x0201f800, 0x000209ee, 0x0400000d, 0x0401ffef, + 0x4d400000, 0x42028000, 0x00000005, 0x0401f80d, + 0x5c028000, 0x8d3e7d3e, 0x04020007, 0x0201f800, + 0x00020a34, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x0201f800, 0x00020a10, 0x0401f7fa, + 0x4803c856, 0x0201f800, 0x001061b2, 0x4df00000, + 0x4d3c0000, 0x4d440000, 0x59368c03, 0x42027800, + 0x00002001, 0x0201f800, 0x0010e624, 0x0201f800, + 0x0010e66e, 0x0201f800, 0x0010e742, 0x0201f800, + 0x0010eb5d, 0x5c028800, 0x5c027800, 0x5c03e000, + 0x02000000, 0x0010619f, 0x1c01f000, 0x4803c856, + 0x4d300000, 0x0201f800, 0x00107188, 0x0400000f, + 0x481a601d, 0x48ee6022, 0x4936600a, 0x4a026407, + 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, + 0x0000001f, 0x0201f800, 0x00020a34, 0x5c027000, + 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, + 0x4803c856, 0x4d300000, 0x0201f800, 0x00107188, + 0x0400000e, 0x48ee6022, 0x4936600a, 0x4a026407, + 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, + 0x00000055, 0x0201f800, 0x00020a34, 0x5c027000, + 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, + 0x4803c856, 0x4d300000, 0x0201f800, 0x00107188, + 0x0400000f, 0x481a601d, 0x48ee6022, 0x4936600a, + 0x4a026407, 0x00000001, 0x492e6009, 0x4d380000, + 0x42027000, 0x0000003d, 0x0201f800, 0x00020a34, + 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800, + 0x00107188, 0x04000014, 0x4936600a, 0x492fc857, + 0x4933c857, 0x592c0405, 0x8c00051e, 0x04000003, + 0x48efc857, 0x48ee6022, 0x4a026407, 0x00000001, + 0x492e6009, 0x4d380000, 0x42027000, 0x00000000, + 0x0201f800, 0x00020a34, 0x5c027000, 0x82000540, + 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, + 0x4d300000, 0x0201f800, 0x00107188, 0x0400000f, + 0x48ee6022, 0x481a601d, 0x4936600a, 0x4a026407, + 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, + 0x00000044, 0x0201f800, 0x00020a34, 0x5c027000, + 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, + 0x4803c856, 0x4d300000, 0x0201f800, 0x00107188, + 0x0400000f, 0x481a601d, 0x48ee6022, 0x4936600a, + 0x4a026407, 0x00000001, 0x492e6009, 0x4d380000, + 0x42027000, 0x00000049, 0x0201f800, 0x00020a34, + 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x5930000a, 0x80001540, 0x02000800, + 0x0010032d, 0x5808040b, 0x4803c856, 0x80000040, + 0x04001003, 0x4800140b, 0x04020009, 0x58080010, + 0x80000540, 0x04000006, 0x58080203, 0x80000540, + 0x04020003, 0x4a001203, 0x00000001, 0x1c01f000, + 0x4803c856, 0x59300403, 0x82000d80, 0x00000002, + 0x0400000f, 0x82000d80, 0x00000003, 0x0400000c, + 0x82000d80, 0x00000004, 0x04000009, 0x599c0819, + 0x8c040d0e, 0x04000004, 0x82000d80, 0x00000000, + 0x04000003, 0x82000540, 0x00000001, 0x1c01f000, + 0x0401f807, 0x42018800, 0x00000001, 0x04000003, + 0x42018800, 0x00000000, 0x1c01f000, 0x4803c856, + 0x4c000000, 0x4d2c0000, 0x59300407, 0x82000580, + 0x00000004, 0x0400001d, 0x59300009, 0x80025d40, + 0x800001c0, 0x04000019, 0x0201f800, 0x00108f1d, + 0x04000014, 0x59300407, 0x82004580, 0x00000010, + 0x04000010, 0x82004580, 0x00000011, 0x0400000d, + 0x82004580, 0x00000003, 0x0400000c, 0x82004580, + 0x00000002, 0x04000009, 0x82004580, 0x0000000a, + 0x04000006, 0x592c0405, 0x8c00051e, 0x04000003, + 0x80000580, 0x0401f003, 0x82000540, 0x00000001, + 0x5c025800, 0x5c000000, 0x1c01f000, 0x4803c856, + 0x4d300000, 0x0201f800, 0x00107188, 0x04000013, + 0x4936600a, 0x48ee6022, 0x4a026407, 0x00000001, + 0x492e6009, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010e06f, 0x5c027800, 0x4d380000, 0x42027000, + 0x00000028, 0x0201f800, 0x00020a34, 0x5c027000, + 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, + 0x4803c856, 0x83380580, 0x00000015, 0x0402000d, + 0x59a8005a, 0x82000580, 0x00000074, 0x04020009, + 0x0201f800, 0x00103e7e, 0x4a026203, 0x00000001, + 0x4a026403, 0x00000029, 0x0201f000, 0x0010608d, + 0x0201f800, 0x001078e7, 0x0201f000, 0x00020a10, + 0x4803c856, 0x83380580, 0x00000016, 0x04020007, + 0x42000800, 0x00000004, 0x0201f800, 0x00103d9d, + 0x0201f000, 0x001073af, 0x83380580, 0x00000015, + 0x04020013, 0x59a8005a, 0x82000580, 0x00000014, + 0x0402000f, 0x0201f800, 0x00103ee9, 0x0201f800, + 0x00107dde, 0x0402000a, 0x59340404, 0x80000540, + 0x04000007, 0x42000800, 0x00000006, 0x0201f800, + 0x00103d9d, 0x0201f000, 0x001073af, 0x0201f800, + 0x001078e7, 0x0201f000, 0x00020a10, 0x4803c856, + 0x592c0207, 0x82000580, 0x00000005, 0x04000002, + 0x1c01f000, 0x4803c856, 0x592c0209, 0x8400054a, + 0x48025a09, 0x1c01f000, 0x59300809, 0x800409c0, + 0x04000008, 0x58040205, 0x82000580, 0x00000152, + 0x04020004, 0x59a8082a, 0x48066006, 0x1c01f000, + 0x599c0416, 0x800001c0, 0x04000008, 0x82000c80, + 0x00000004, 0x04001005, 0x800000c2, 0x800008c4, + 0x80040c00, 0x0401f7f5, 0x59300403, 0x82000580, + 0x00000002, 0x040207f0, 0x5930080a, 0x58040403, + 0x82000580, 0x000007fe, 0x040207eb, 0x42000800, + 0x00000028, 0x0401f7e9, 0x497a6205, 0x497a6009, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000050, + 0x42000800, 0x80000043, 0x0201f000, 0x000209b1, + 0x4933c857, 0x4d340000, 0x5932680a, 0x59340200, + 0x8c00050e, 0x04000006, 0x59300407, 0x82000c80, + 0x00000014, 0x04021004, 0x0c01f806, 0x5c026800, + 0x1c01f000, 0x0201f800, 0x0010870a, 0x0401f7fc, + 0x0010870a, 0x00108b54, 0x00108b58, 0x00108b5b, + 0x0010a11f, 0x0010a13c, 0x0010a140, 0x0010870a, + 0x0010870a, 0x0010870a, 0x0010870a, 0x0010870a, + 0x0010870a, 0x0010870a, 0x0010870a, 0x0010870a, + 0x0010870a, 0x0010870a, 0x0010870a, 0x0010870a, + 0x4803c856, 0x40000000, 0x40000000, 0x1c01f000, + 0x40000000, 0x40000000, 0x1c01f000, 0x5930001d, + 0x4803c857, 0x59300415, 0x4933c857, 0x4803c857, + 0x8c000502, 0x04000005, 0x4803c857, 0x84000540, + 0x48026415, 0x1c01f000, 0x42000000, 0xd0000000, + 0x41300800, 0x0201f800, 0x00100897, 0x0401f810, + 0x0402000e, 0x59300c15, 0x59300403, 0x82000580, + 0x00000040, 0x04000003, 0x84040d40, 0x0401f005, + 0x59a8002a, 0x82000400, 0x0000000a, 0x48026205, + 0x84040d42, 0x48066415, 0x1c01f000, 0x4933c857, + 0x4d340000, 0x5932680a, 0x59340a00, 0x8c040d0e, + 0x02000800, 0x0010032d, 0x5930001d, 0x80000540, + 0x04020033, 0x59300403, 0x4803c857, 0x82000580, + 0x00000040, 0x04000003, 0x8d0e1d0e, 0x0402002a, + 0x4d1c0000, 0x41323800, 0x0201f800, 0x00107188, + 0x04000023, 0x4932381d, 0x591c0415, 0x84000542, + 0x48023c15, 0x4936600a, 0x591c0407, 0x82000580, + 0x00000003, 0x04000006, 0x591c0202, 0x4802641a, + 0x591c0402, 0x4802621a, 0x0401f005, 0x591c0202, + 0x4802621a, 0x591c0402, 0x4802641a, 0x491e601f, + 0x4a026407, 0x00000001, 0x4a026403, 0x00000035, + 0x4a026203, 0x00000001, 0x42000800, 0x80000040, + 0x0201f800, 0x000209b1, 0x411e6000, 0x5c023800, + 0x80000580, 0x5c026800, 0x1c01f000, 0x411e6000, + 0x5c023800, 0x59a8002c, 0x48026205, 0x82000540, + 0x00000001, 0x0401f7f8, 0x4933c857, 0x4d2c0000, + 0x4932381d, 0x4a026202, 0x0000ffff, 0x591e5809, + 0x591c0008, 0x8c00051e, 0x04000005, 0x8400051e, + 0x48023808, 0x497a580a, 0x0401f018, 0x592c0409, + 0x8c000518, 0x04000015, 0x84000518, 0x48025c09, + 0x4d400000, 0x592e8207, 0x4a025a07, 0x00000001, + 0x0401fb52, 0x49425a07, 0x5c028000, 0x497a580a, + 0x592c0409, 0x8c000512, 0x04000008, 0x4d2c0000, + 0x84000512, 0x48025c09, 0x592e580a, 0x0201f800, + 0x00100589, 0x5c025800, 0x59a8002c, 0x48026205, + 0x591c0215, 0x48026217, 0x82000d80, 0x00000001, + 0x04000008, 0x4a023a03, 0x00000002, 0x82000580, + 0x00000005, 0x04000008, 0x497a6016, 0x0401f01e, + 0x591c0008, 0x84000540, 0x48023808, 0x4a023a03, + 0x00000004, 0x591c0415, 0x4803c857, 0x8400051c, + 0x84000554, 0x48023c15, 0x592c0010, 0x40001000, + 0x591c0817, 0x80040480, 0x040217f0, 0x591c0017, + 0x82000500, 0xfffffffc, 0x48026016, 0x48023817, + 0x591c0a15, 0x4807c857, 0x82040d80, 0x00000005, + 0x04020005, 0x480bc857, 0x4803c857, 0x4a023813, + 0xffffffff, 0x591c0402, 0x4802641a, 0x591c0202, + 0x4802621a, 0x591e680a, 0x4936600a, 0x4a026407, + 0x00000001, 0x4a026403, 0x00000039, 0x4a026203, + 0x00000001, 0x42000800, 0x80000040, 0x0201f800, + 0x000209b1, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x59300415, 0x8c000514, 0x04000015, 0x8c00051c, + 0x04020012, 0x59300017, 0x80100480, 0x04001006, + 0x04000005, 0x59300415, 0x84000514, 0x8400055c, + 0x0401f009, 0x48126017, 0x48126013, 0x40100000, + 0x592c1810, 0x800c0480, 0x48026012, 0x59300415, + 0x84000514, 0x48026415, 0x1c01f000, 0x4933c857, + 0x8c00051c, 0x04020008, 0x59300013, 0x4803c857, + 0x48026017, 0x59300415, 0x8400055c, 0x4803c857, + 0x48026415, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, + 0x1c01f000, 0x59300c03, 0x4933c857, 0x4807c857, + 0x82040480, 0x00000034, 0x04001006, 0x82040480, + 0x0000003c, 0x04021003, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fd, 0x41780800, + 0x59a81028, 0x42000000, 0x00000032, 0x0201f800, + 0x0010600e, 0x800811c0, 0x04020003, 0x42001000, + 0x00000014, 0x480b502a, 0x59a81029, 0x480b5022, + 0x41780800, 0x42000000, 0x00000064, 0x0201f800, + 0x0010600e, 0x800811c0, 0x04020003, 0x42001000, + 0x00000014, 0x480b502b, 0x82081400, 0x0000000a, + 0x480b502c, 0x42000800, 0x00000001, 0x0201f800, + 0x001061d9, 0x42000000, 0x30000000, 0x40080800, + 0x0201f800, 0x00020105, 0x42000800, 0x00000003, + 0x59a8100f, 0x0201f800, 0x001061d9, 0x0201f000, + 0x001040ff, 0x4a03502a, 0x00000028, 0x4a03502b, + 0x00000014, 0x4a035022, 0x000007d0, 0x42001000, + 0x0000001e, 0x480b502c, 0x42000800, 0x00000001, + 0x0201f800, 0x001061d9, 0x42000000, 0x30000000, + 0x40080800, 0x0201f800, 0x00020105, 0x42000800, + 0x00000003, 0x59a8100f, 0x0201f000, 0x001061d9, + 0x4933c857, 0x4d2c0000, 0x59300403, 0x82000580, + 0x0000003e, 0x04020005, 0x59325818, 0x812e59c0, + 0x02020800, 0x00100580, 0x5c025800, 0x1c01f000, + 0x4937c857, 0x4d300000, 0x0201f800, 0x00107188, + 0x04000011, 0x4936600a, 0x4a026407, 0x00000001, + 0x492e6009, 0x42000800, 0x00000009, 0x0201f800, + 0x00103d9d, 0x4d380000, 0x42027000, 0x00000033, + 0x0201f800, 0x00020a34, 0x5c027000, 0x82000540, + 0x00000001, 0x5c026000, 0x1c01f000, 0x4933c857, + 0x4d2c0000, 0x4c580000, 0x4d3c0000, 0x59325809, + 0x83380580, 0x00000015, 0x04020025, 0x59a8b05a, + 0x82580c80, 0x00000019, 0x04001003, 0x4200b000, + 0x00000018, 0x8058b104, 0x0401fa18, 0x80000580, + 0x0401fa28, 0x832cac00, 0x0000000a, 0x83cca400, + 0x00000006, 0x0201f800, 0x0010aee2, 0x4c600000, + 0x4200c000, 0x00000001, 0x592c100b, 0x8c081518, + 0x04020006, 0x59a8000f, 0x592c100e, 0x80080580, + 0x04020007, 0x4178c000, 0x5930100a, 0x58081403, + 0x417a7800, 0x0201f800, 0x00101a94, 0x5c00c000, + 0x0201f800, 0x001073af, 0x0401f008, 0x4200b000, + 0x00000002, 0x0401fa17, 0x0201f800, 0x001078e7, + 0x0201f800, 0x00020a10, 0x5c027800, 0x5c00b000, + 0x5c025800, 0x1c01f000, 0x4933c856, 0x42018800, + 0x00000000, 0x4936600a, 0x4a026407, 0x00000001, + 0x492e6009, 0x4d380000, 0x42027000, 0x0000004d, + 0x0201f800, 0x00020a34, 0x5c027000, 0x82000540, + 0x00000001, 0x42018800, 0x00000001, 0x1c01f000, + 0x4803c856, 0x4d2c0000, 0x83380580, 0x00000015, + 0x0402002c, 0x59a8085a, 0x59325809, 0x5930040b, + 0x80040580, 0x04020027, 0x4c500000, 0x4c540000, + 0x4c580000, 0x83cca400, 0x00000006, 0x4050a800, + 0x5930b40b, 0x8258b400, 0x00000003, 0x8058b104, + 0x0201f800, 0x0010af0c, 0x83cca400, 0x00000006, + 0x592cb206, 0x8258b400, 0x00000003, 0x8058b104, + 0x832cac00, 0x00000007, 0x0201f800, 0x0010aee2, + 0x592e5801, 0x812e59c0, 0x040207f6, 0x5931d822, + 0x58ef400a, 0x58ee580c, 0x4a025a05, 0x00000103, + 0x58ec0008, 0x0801f800, 0x59300402, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, + 0x0201f800, 0x001078e7, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x82040d80, 0x00000035, 0x04000005, + 0x5930141a, 0x0401f858, 0x04000027, 0x0401f006, + 0x4d300000, 0x5932601f, 0x0401f85d, 0x5c026000, + 0x04000020, 0x591c0c07, 0x82040580, 0x00000003, + 0x04000004, 0x82040580, 0x00000006, 0x0402001c, + 0x591c0c02, 0x5930041a, 0x80040580, 0x04000009, + 0x5930021a, 0x80040580, 0x04020015, 0x591c0a02, + 0x5930041a, 0x80040580, 0x04020011, 0x0401f009, + 0x59300a1a, 0x82040580, 0x0000ffff, 0x04000005, + 0x591c0202, 0x59300a1a, 0x80040580, 0x04020008, + 0x591c000a, 0x5930080a, 0x80040580, 0x1c01f000, + 0x417a3800, 0x82000540, 0x00000001, 0x1c01f000, + 0x4803c856, 0x59b800e4, 0x8c000538, 0x02020800, + 0x0010032d, 0x42000800, 0x0000ff00, 0x4a0370e4, + 0x20000000, 0x59b800e4, 0x80040840, 0x02000800, + 0x0010032d, 0x8c00053c, 0x040207f9, 0x4a0370e4, + 0x30000000, 0x40000000, 0x40000000, 0x40000000, + 0x59b800e4, 0x8c00053c, 0x040207f1, 0x1c01f000, + 0x4803c856, 0x4a0370e4, 0x20000000, 0x40000000, + 0x59b800e4, 0x8c000538, 0x040207fb, 0x1c01f000, + 0x0401f807, 0x42018800, 0x00000001, 0x04020003, + 0x42018800, 0x00000000, 0x1c01f000, 0x59300808, + 0x8c040d1e, 0x592c0c09, 0x04020002, 0x8c040d18, + 0x1c01f000, 0x0201f800, 0x00108941, 0x04000007, + 0x800800c4, 0x800808ca, 0x80040c00, 0x82063c00, + 0x0010f694, 0x491fc857, 0x1c01f000, 0x0201f800, + 0x00109291, 0x04020007, 0x59301402, 0x0401fff2, + 0x04000007, 0x411c0000, 0x81300580, 0x04000003, + 0x81780500, 0x0401f002, 0x81300540, 0x1c01f000, + 0x4d300000, 0x0201f800, 0x00020319, 0x0402000a, + 0x42026000, 0x0010f64c, 0x4936600a, 0x492e6009, + 0x0201f800, 0x0010e06f, 0x80000580, 0x5c026000, + 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fc, + 0x4933c857, 0x0201f800, 0x00108953, 0x02000800, + 0x0010032d, 0x4d2c0000, 0x4d340000, 0x4d440000, + 0x4c580000, 0x59325809, 0x5932680a, 0x49425a07, + 0x0201f800, 0x00104f93, 0x592e8c07, 0x592c4208, + 0x82200500, 0x0000000f, 0x0c01f806, 0x5c00b000, + 0x5c028800, 0x5c026800, 0x5c025800, 0x1c01f000, + 0x00108de3, 0x00108e05, 0x00108e0c, 0x00108e10, + 0x00108e19, 0x00108de0, 0x00108de0, 0x00108de0, + 0x00108e1d, 0x00108e29, 0x00108e29, 0x00108de0, + 0x00108de0, 0x00108de0, 0x00108de0, 0x00108de0, + 0x4803c857, 0x0201f800, 0x0010032d, 0x814281c0, + 0x04020012, 0x41785800, 0x592c0405, 0x8c00051c, + 0x04020002, 0x59345c05, 0x442c2800, 0x59340008, + 0x48002802, 0x59340009, 0x48002801, 0x59340006, + 0x48002804, 0x59340007, 0x48002803, 0x4200b000, + 0x0000000b, 0x0401f037, 0x592c0208, 0x8c00051e, + 0x4200b000, 0x00000002, 0x04020032, 0x8204b540, + 0x00000000, 0x0400002f, 0x44042800, 0x5932680a, + 0x59340400, 0x48002801, 0x4200b000, 0x00000002, + 0x0401f028, 0x814281c0, 0x040207f0, 0x59345c05, + 0x442c2800, 0x4200b000, 0x00000001, 0x0401f021, + 0x8340b540, 0x00000000, 0x0400001e, 0x0401f027, + 0x814281c0, 0x04020025, 0x59340200, 0x44002800, + 0x59340001, 0x48002801, 0x4200b000, 0x00000002, + 0x0401f014, 0x8340b540, 0x00000000, 0x0402001b, + 0x0401f010, 0x8340b540, 0x00000000, 0x0400000d, + 0x0201f800, 0x001041ca, 0x04000014, 0x8c20450e, + 0x04000002, 0x497a600a, 0x4178b000, 0x497a5a07, + 0x0401f004, 0x8340b540, 0x00000000, 0x0402000b, + 0x592c0405, 0x8400051c, 0x48025c05, 0x592c0208, + 0x8400051e, 0x48025a08, 0x0401f8ac, 0x497a6009, + 0x0201f000, 0x000203ab, 0x592c0208, 0x8c00051e, + 0x4200b000, 0x00000002, 0x040207f2, 0x8204b540, + 0x00000000, 0x040007ef, 0x44042800, 0x4200b000, + 0x00000001, 0x0401f7eb, 0x4937c857, 0x4d300000, + 0x0201f800, 0x00107188, 0x04000011, 0x4936600a, + 0x4a026407, 0x00000001, 0x492e6009, 0x42000800, + 0x0000000b, 0x0201f800, 0x00103d9d, 0x4d380000, + 0x42027000, 0x00000043, 0x0201f800, 0x00020a34, + 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x4937c857, 0x4d2c0000, 0x59325809, + 0x83380580, 0x00000015, 0x04020028, 0x59a8005a, + 0x82000580, 0x00000004, 0x04020024, 0x59a8000f, + 0x592c100a, 0x80080580, 0x04020013, 0x4d440000, + 0x592e8c07, 0x592c0208, 0x4803c856, 0x82000500, + 0x00000080, 0x84000548, 0x4d3c0000, 0x42027800, + 0x00001000, 0x8c00050e, 0x04000002, 0x853e7d5c, + 0x0201f800, 0x0010412f, 0x5c027800, 0x5c028800, + 0x0401f004, 0x4803c856, 0x0201f800, 0x001041ca, + 0x0201f800, 0x00108953, 0x04000017, 0x4d400000, + 0x42028000, 0x00000000, 0x41780800, 0x0401ff35, + 0x5c028000, 0x0401f00e, 0x0201f800, 0x001041ca, + 0x040207f4, 0x0201f800, 0x00108953, 0x0400000a, + 0x4c580000, 0x4200b000, 0x00000002, 0x0401f86d, + 0x5c00b000, 0x0201f800, 0x001078e7, 0x0201f800, + 0x00020a10, 0x5c025800, 0x1c01f000, 0x4937c857, + 0x4d300000, 0x0201f800, 0x00107188, 0x04000012, + 0x4936600a, 0x4a026407, 0x00000001, 0x4d3c0000, + 0x4d380000, 0x417a7800, 0x0201f800, 0x00103d92, + 0x492e6009, 0x42027000, 0x00000004, 0x0201f800, + 0x00020a34, 0x5c027000, 0x5c027800, 0x82000540, + 0x00000001, 0x5c026000, 0x1c01f000, 0x4937c857, + 0x4d300000, 0x0201f800, 0x00107188, 0x04000011, + 0x4936600a, 0x42000800, 0x00000003, 0x0201f800, + 0x00103d9d, 0x4a026407, 0x00000001, 0x492e6009, + 0x4d380000, 0x42027000, 0x00000051, 0x0201f800, + 0x00020a34, 0x5c027000, 0x82000540, 0x00000001, + 0x5c026000, 0x1c01f000, 0x4933c857, 0x42028800, + 0x000007fc, 0x42003000, 0x00fffffc, 0x0201f800, + 0x00103de1, 0x02020800, 0x0010032d, 0x4936600a, + 0x417a7800, 0x0201f800, 0x00103d92, 0x42000800, + 0x00000003, 0x0201f800, 0x00103d9d, 0x497a6c12, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000002, + 0x0201f000, 0x0010608d, 0x492fc857, 0x4c580000, + 0x4c000000, 0x8058b1c0, 0x0400000b, 0x82580500, + 0xfffffff0, 0x02020800, 0x0010032d, 0x8058b0d0, + 0x592c0409, 0x82000500, 0xfffff0ff, 0x80580540, + 0x48025c09, 0x5c000000, 0x5c00b000, 0x1c01f000, + 0x492fc857, 0x4c000000, 0x4c040000, 0x800000d8, + 0x592c0c09, 0x82040d00, 0xffff0fff, 0x80040540, + 0x48025c09, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x4933c857, 0x4d2c0000, 0x59325809, 0x592c0208, + 0x8400055e, 0x48025a08, 0x4c500000, 0x4c540000, + 0x4c580000, 0x0401ffd9, 0x0201f800, 0x00104f93, + 0x46002800, 0x00000018, 0x80142800, 0x8058b040, + 0x83cca400, 0x00000007, 0x4014a800, 0x0201f800, + 0x0010aee2, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, + 0x1c01f000, 0x59325809, 0x592c0205, 0x82000580, + 0x00000152, 0x1c01f000, 0x59300020, 0x80000540, + 0x02020800, 0x00100a77, 0x1c01f000, 0x4d2c0000, + 0x59325809, 0x59300203, 0x4933c857, 0x492fc857, + 0x493bc857, 0x4803c857, 0x82003480, 0x0000000e, + 0x02021800, 0x0010032d, 0x0c01f803, 0x5c025800, + 0x1c01f000, 0x00108f43, 0x00108f4e, 0x00108f8c, + 0x00108f43, 0x00108f43, 0x00108f43, 0x00108f43, + 0x00108f43, 0x00108f45, 0x00108f43, 0x00108f43, + 0x00108f43, 0x00108f43, 0x00108f43, 0x0201f800, + 0x0010032d, 0x83383480, 0x00000058, 0x02021800, + 0x0010032d, 0x493a6403, 0x4a026203, 0x00000001, + 0x0201f000, 0x0010608d, 0x83380580, 0x00000013, + 0x04020010, 0x492fc857, 0x592c000d, 0x800001c0, + 0x04000006, 0x4a026203, 0x00000002, 0x59a8002a, + 0x48026006, 0x1c01f000, 0x4a025a07, 0x00000000, + 0x0201f800, 0x000203ab, 0x0201f000, 0x00020a10, + 0x83380580, 0x00000027, 0x0400001b, 0x83380580, + 0x00000014, 0x04000012, 0x83380580, 0x00000015, + 0x04000005, 0x83380580, 0x00000016, 0x02020800, + 0x0010032d, 0x0201f800, 0x001064f2, 0x02020000, + 0x001071c7, 0x59300203, 0x82000580, 0x00000002, + 0x02020800, 0x0010032d, 0x0401f016, 0x4937c857, + 0x0201f800, 0x00106102, 0x4a02580f, 0x00000011, + 0x0401f006, 0x4937c857, 0x0201f800, 0x00106102, + 0x4a02580f, 0x00000010, 0x4a025a07, 0x00000031, + 0x4a02580e, 0x00000004, 0x0201f800, 0x000203ab, + 0x0201f800, 0x001043e2, 0x0201f000, 0x00107144, + 0x59341400, 0x82081d00, 0x000000ff, 0x59300c03, + 0x480bc857, 0x4807c857, 0x82040580, 0x00000053, + 0x0400002e, 0x82040580, 0x00000002, 0x04000016, + 0x82040580, 0x00000001, 0x04000017, 0x82040580, + 0x00000003, 0x0400001c, 0x82040580, 0x00000005, + 0x0400001d, 0x82040580, 0x00000033, 0x0400001a, + 0x82040580, 0x00000000, 0x0400001b, 0x82040580, + 0x00000004, 0x02020800, 0x0010032d, 0x0401f89e, + 0x0401f016, 0x820c0580, 0x00000003, 0x04000849, + 0x0401f012, 0x820c0580, 0x0000000b, 0x0402000f, + 0x42000800, 0x00000007, 0x0201f800, 0x00103d9d, + 0x0401f00a, 0x820c0580, 0x00000005, 0x04000861, + 0x0401f006, 0x820c0580, 0x00000009, 0x04000886, + 0x0401f002, 0x0401f890, 0x4a026403, 0x00000052, + 0x59a8105a, 0x592c040c, 0x8c000500, 0x04000003, + 0x42001000, 0x00000008, 0x592c040c, 0x8c000516, + 0x04000003, 0x82081400, 0x00000018, 0x592c000d, + 0x497a580e, 0x497a580f, 0x80080c80, 0x04000009, + 0x04001005, 0x4a025a07, 0x00000007, 0x40001000, + 0x0401f006, 0x4a025a07, 0x00000015, 0x0401f003, + 0x4a025a07, 0x00000000, 0x480a580d, 0x0201f800, + 0x00107329, 0x04000010, 0x592c1001, 0x480a600c, + 0x58080800, 0x82080400, 0x00000002, 0x592c1012, + 0x592c1813, 0x42003000, 0x00000000, 0x42002000, + 0x00100f8a, 0x0201f800, 0x001074b6, 0x04000002, + 0x1c01f000, 0x4a025a07, 0x0000002c, 0x497a580d, + 0x0201f800, 0x000203ab, 0x0201f000, 0x00020a10, + 0x83380580, 0x00000015, 0x0402000a, 0x59a8006d, + 0x8c000502, 0x0402000b, 0x0201f800, 0x00103e7e, + 0x42000800, 0x00000004, 0x0201f000, 0x00103d9d, + 0x42000800, 0x00000007, 0x0201f000, 0x00103d9d, + 0x0201f800, 0x00104755, 0x42001000, 0x00000010, + 0x04020009, 0x59340002, 0x82000500, 0x00ff0000, + 0x82000580, 0x00ff0000, 0x040007ec, 0x42001000, + 0x00000008, 0x0201f800, 0x00104448, 0x040007e7, + 0x592c040c, 0x84000540, 0x48025c0c, 0x0401f7e9, + 0x83380580, 0x00000015, 0x0402000f, 0x59a8006d, + 0x8c000502, 0x04020010, 0x0201f800, 0x00103ee9, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00103d92, + 0x5c027800, 0x42000800, 0x00000006, 0x0201f000, + 0x00103d9d, 0x42000800, 0x00000004, 0x0201f000, + 0x00103d9d, 0x0201f800, 0x00104755, 0x42001000, + 0x00000010, 0x04020009, 0x59340002, 0x82000500, + 0x00ff0000, 0x82000580, 0x00ff0000, 0x040007e7, + 0x42001000, 0x00000008, 0x0201f800, 0x00104448, + 0x040007e2, 0x592c040c, 0x84000540, 0x48025c0c, + 0x0401f7e9, 0x42000800, 0x00000004, 0x0201f000, + 0x00103d9d, 0x83380580, 0x00000015, 0x04020005, + 0x0201f800, 0x00109f8a, 0x02000800, 0x001040a6, + 0x1c01f000, 0x83380580, 0x00000015, 0x0402001d, + 0x4c580000, 0x83cc1400, 0x00000008, 0x4200b000, + 0x00000002, 0x83341c00, 0x00000006, 0x0201f800, + 0x00107df9, 0x04020012, 0x83cc1400, 0x0000000a, + 0x4200b000, 0x00000002, 0x83341c00, 0x00000008, + 0x0201f800, 0x00107df9, 0x04020009, 0x59342200, + 0x59cc1007, 0x800811c0, 0x04000003, 0x480a6801, + 0x84102542, 0x8410251a, 0x48126a00, 0x5c00b000, + 0x1c01f000, 0x42000000, 0x0010bd35, 0x0201f800, + 0x0010ae10, 0x0201f800, 0x001061b2, 0x59300203, + 0x4933c857, 0x4803c857, 0x82000c80, 0x0000000e, + 0x02021800, 0x0010032d, 0x0c01f803, 0x0201f000, + 0x0010619f, 0x00109091, 0x001090a0, 0x00109092, + 0x0010908f, 0x0010908f, 0x0010908f, 0x0010908f, + 0x0010908f, 0x0010908f, 0x0010908f, 0x0010908f, + 0x0010908f, 0x0010908f, 0x0010908f, 0x0201f800, + 0x0010032d, 0x1c01f000, 0x59300403, 0x82000580, + 0x00000052, 0x02000000, 0x00108713, 0x0201f800, + 0x001043e2, 0x59325809, 0x4a025a07, 0x00000006, + 0x0201f800, 0x000203ab, 0x0201f000, 0x00107144, + 0x59301804, 0x840c0520, 0x48026004, 0x598c000f, + 0x81300580, 0x04020010, 0x8c0c1d20, 0x04020010, + 0x42001000, 0x0010bc55, 0x50081000, 0x58080002, + 0x82000580, 0x00000100, 0x0400000f, 0x5808000b, + 0x81300580, 0x02020800, 0x0010032d, 0x4978100b, + 0x0401f003, 0x8c0c1d20, 0x040207dc, 0x0201f800, + 0x0010e453, 0x80c40040, 0x040007d8, 0x0201f800, + 0x0010032d, 0x0201f800, 0x0010642d, 0x040007f8, + 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, + 0x0010032d, 0x0c01f7bc, 0x4933c857, 0x4c500000, + 0x4c540000, 0x4c580000, 0x592c0c08, 0x48065814, + 0x59cc0809, 0x48065808, 0x59cc0808, 0x4806580c, + 0x59a8086c, 0x82040500, 0x000003ff, 0x800010c4, + 0x8c040d14, 0x04000005, 0x59cc0002, 0x82000500, + 0x00000003, 0x80081480, 0x480a621b, 0x412c0800, + 0x0201f800, 0x0010055a, 0x02000800, 0x0010032d, + 0x492c080a, 0x58040409, 0x84000552, 0x84000540, + 0x48000c09, 0x82081400, 0x00000003, 0x80081104, + 0x83cca400, 0x00000006, 0x832cac00, 0x00000005, + 0x42000800, 0x00000010, 0x82080480, 0x00000010, + 0x04021003, 0x40080800, 0x80000580, 0x4004b000, + 0x4c000000, 0x0201f800, 0x0010af0c, 0x5c000000, + 0x800001c0, 0x0400000d, 0x412c1000, 0x4c000000, + 0x0201f800, 0x0010055a, 0x02000800, 0x0010032d, + 0x492c1001, 0x832cac00, 0x00000005, 0x5c000000, + 0x40001000, 0x0401f7e9, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x4c380000, 0x59325809, 0x5930021b, 0x48025a09, + 0x59301012, 0x4a026203, 0x00000002, 0x592c020b, + 0x8c000500, 0x04000004, 0x59300016, 0x592c1010, + 0x80081480, 0x800811c0, 0x04020008, 0x4a025a07, + 0x00000000, 0x592c000c, 0x82000500, 0x00000c00, + 0x0400000b, 0x0401f00b, 0x8c08153e, 0x04000006, + 0x4a025a07, 0x00000007, 0x80081080, 0x80081000, + 0x0401f003, 0x4a025a07, 0x00000015, 0x480a5808, + 0x42000000, 0x0010c35c, 0x50007000, 0x5838000a, + 0x80000540, 0x04020008, 0x4930700b, 0x4930700a, + 0x58380002, 0x82000580, 0x00000000, 0x04020809, + 0x0401f005, 0x82001400, 0x00000000, 0x45301000, + 0x4930700a, 0x5c007000, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x592c000a, 0x40001000, 0x48007009, + 0x82080400, 0x00000005, 0x48007003, 0x592c000e, + 0x592c100f, 0x48007006, 0x48087007, 0x592c0014, + 0x592c1209, 0x80080c80, 0x04001002, 0x40001000, + 0x82081400, 0x00000003, 0x80081104, 0x82080480, + 0x00000010, 0x04021003, 0x80000580, 0x0401f003, + 0x42001000, 0x00000010, 0x4800700c, 0x48087004, + 0x800810c4, 0x48087005, 0x40381000, 0x0201f000, + 0x00020016, 0x4d2c0000, 0x0201f800, 0x0010055a, + 0x02000800, 0x0010032d, 0x42000800, 0x0010c35c, + 0x452c0800, 0x497a580a, 0x497a580b, 0x497a580c, + 0x4a025808, 0x00109174, 0x4a025802, 0x00000100, + 0x4a025801, 0x00000000, 0x5c025800, 0x1c01f000, + 0x4833c857, 0x4d300000, 0x4d2c0000, 0x4c5c0000, + 0x4030b800, 0x585c0009, 0x80025d40, 0x04020004, + 0x585c000b, 0x4c000000, 0x0401f044, 0x585c0002, + 0x82000580, 0x00000100, 0x04020022, 0x592c0801, + 0x4c040000, 0x0201f800, 0x00100580, 0x5c000800, + 0x800409c0, 0x0400001c, 0x4804b809, 0x585c100c, + 0x800811c0, 0x04020005, 0x40065800, 0x0201f800, + 0x00100589, 0x0401f014, 0x82080480, 0x00000010, 0x04021003, 0x80000580, 0x0401f003, 0x42001000, - 0x00000010, 0x4800700c, 0x48087004, 0x800810c4, - 0x48087005, 0x40381000, 0x0201f000, 0x00020016, - 0x4d2c0000, 0x0201f800, 0x0010055a, 0x02000800, - 0x0010032d, 0x42000800, 0x0010c25c, 0x452c0800, - 0x497a580a, 0x497a580b, 0x497a580c, 0x4a025808, - 0x001090bb, 0x4a025802, 0x00000100, 0x4a025801, - 0x00000000, 0x5c025800, 0x1c01f000, 0x4833c857, - 0x4d300000, 0x4d2c0000, 0x4c5c0000, 0x4030b800, - 0x585c0009, 0x80025d40, 0x04020004, 0x585c000b, - 0x4c000000, 0x0401f044, 0x585c0002, 0x82000580, - 0x00000100, 0x04020022, 0x592c0801, 0x4c040000, - 0x0201f800, 0x00100580, 0x5c000800, 0x800409c0, - 0x0400001c, 0x4804b809, 0x585c100c, 0x800811c0, - 0x04020005, 0x40065800, 0x0201f800, 0x00100589, - 0x0401f014, 0x82080480, 0x00000010, 0x04021003, - 0x80000580, 0x0401f003, 0x42001000, 0x00000010, - 0x4800b80c, 0x4808b804, 0x800810c4, 0x4808b805, - 0x82040400, 0x00000005, 0x4800b803, 0x405c1000, - 0x0201f800, 0x00020016, 0x0401f025, 0x0401f828, - 0x585c000b, 0x80026540, 0x59300000, 0x80000d40, - 0x04020002, 0x4800b80a, 0x4800b80b, 0x497a6000, - 0x4c000000, 0x4978b809, 0x59325809, 0x4a025a05, - 0x00000103, 0x59300402, 0x48025c07, 0x592c100c, - 0x4c080000, 0x0201f800, 0x000203ab, 0x0201f800, - 0x0010899c, 0x5c001000, 0x8c081518, 0x04000004, - 0x0201f800, 0x00108a6d, 0x0401f003, 0x0201f800, - 0x00020a10, 0x405c7000, 0x5c000000, 0x80026540, - 0x04000003, 0x59325809, 0x0401ff79, 0x5c00b800, - 0x5c025800, 0x5c026000, 0x1c01f000, 0x483bc857, - 0x58380009, 0x40025800, 0x0201f800, 0x00100589, - 0x5838000b, 0x80026540, 0x59300009, 0x80025d40, - 0x4a025a07, 0x00000002, 0x1c01f000, 0x4803c857, - 0x4933c857, 0x4d1c0000, 0x497a601d, 0x41323800, - 0x40026000, 0x4d3c0000, 0x42027800, 0x00000005, - 0x0401f840, 0x5c027800, 0x411e6000, 0x4933c857, - 0x59300415, 0x84000502, 0x48026415, 0x5c023800, - 0x1c01f000, 0x481bc857, 0x4933c857, 0x4c5c0000, - 0x4c600000, 0x4010b800, 0x4014c000, 0x0201f800, - 0x0010a4ae, 0x8d0e1d20, 0x04000008, 0x40602800, - 0x405c3000, 0x0201f800, 0x00109f41, 0x82000540, - 0x00000001, 0x0401f002, 0x80000580, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x42026000, 0x0010f584, 0x59a8000d, 0x81640580, - 0x0400001a, 0x59300c07, 0x82040580, 0x00000001, - 0x0400000d, 0x82040580, 0x00000004, 0x04000006, - 0x82040580, 0x00000010, 0x02000800, 0x001085ca, - 0x0401f009, 0x59300203, 0x82000d80, 0x00000007, - 0x04000005, 0x4807c857, 0x0201f800, 0x00108b8c, - 0x04020808, 0x83326400, 0x00000024, 0x41580000, - 0x81300480, 0x040017e5, 0x5c026000, 0x1c01f000, - 0x4933c857, 0x59300403, 0x4803c857, 0x0201f800, - 0x0010610d, 0x4df00000, 0x59300407, 0x4803c857, - 0x82000d80, 0x00000002, 0x04000018, 0x82000d80, - 0x00000001, 0x04000009, 0x82000d80, 0x00000004, - 0x04000006, 0x4933c856, 0x5c03e000, 0x02000800, - 0x001060fa, 0x0401f04c, 0x59300203, 0x82000d80, - 0x00000001, 0x04000018, 0x82000d80, 0x00000002, - 0x04000036, 0x82000d80, 0x00000005, 0x04000033, - 0x0201f800, 0x0010032d, 0x59300203, 0x82000d80, - 0x00000009, 0x0400000c, 0x82000d80, 0x0000000b, - 0x04000009, 0x82000d80, 0x0000000a, 0x04000027, - 0x82000d80, 0x0000000c, 0x04000024, 0x0201f800, - 0x0010032d, 0x598c000f, 0x81300580, 0x04020004, - 0x0201f800, 0x00106388, 0x0402001c, 0x59300004, - 0x4803c857, 0x8c000520, 0x04000004, 0x84000520, - 0x48026004, 0x0401f015, 0x0201f800, 0x0010e343, - 0x80c40040, 0x02020800, 0x0010032d, 0x5c03e000, - 0x02000800, 0x001060fa, 0x59300407, 0x82000d80, - 0x00000002, 0x04000007, 0x0201f800, 0x001043c3, - 0x0201f800, 0x001089ca, 0x02000800, 0x00107851, - 0x0201f000, 0x001070b5, 0x5c03e000, 0x02000800, - 0x001060fa, 0x59300407, 0x82000d80, 0x00000002, - 0x04000009, 0x0201f800, 0x001043c3, 0x0201f800, - 0x001089ca, 0x02000800, 0x00107851, 0x8d3e7d00, - 0x04000005, 0x0201f800, 0x0010a591, 0x0201f000, - 0x001070b5, 0x4a02621e, 0x00000001, 0x4a026403, + 0x00000010, 0x4800b80c, 0x4808b804, 0x800810c4, + 0x4808b805, 0x82040400, 0x00000005, 0x4800b803, + 0x405c1000, 0x0201f800, 0x00020016, 0x0401f025, + 0x0401f828, 0x585c000b, 0x80026540, 0x59300000, + 0x80000d40, 0x04020002, 0x4800b80a, 0x4800b80b, + 0x497a6000, 0x4c000000, 0x4978b809, 0x59325809, + 0x4a025a05, 0x00000103, 0x59300402, 0x48025c07, + 0x592c100c, 0x4c080000, 0x0201f800, 0x000203ab, + 0x0201f800, 0x00108a55, 0x5c001000, 0x8c081518, + 0x04000004, 0x0201f800, 0x00108b26, 0x0401f003, + 0x0201f800, 0x00020a10, 0x405c7000, 0x5c000000, + 0x80026540, 0x04000003, 0x59325809, 0x0401ff79, + 0x5c00b800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x483bc857, 0x58380009, 0x40025800, 0x0201f800, + 0x00100589, 0x5838000b, 0x80026540, 0x59300009, + 0x80025d40, 0x4a025a07, 0x00000002, 0x1c01f000, + 0x4803c857, 0x4933c857, 0x4d1c0000, 0x497a601d, + 0x41323800, 0x40026000, 0x4d3c0000, 0x42027800, + 0x00000005, 0x0401f840, 0x5c027800, 0x411e6000, + 0x4933c857, 0x59300415, 0x84000502, 0x48026415, + 0x5c023800, 0x1c01f000, 0x481bc857, 0x4933c857, + 0x4c5c0000, 0x4c600000, 0x4010b800, 0x4014c000, + 0x0201f800, 0x0010a5a1, 0x8d0e1d20, 0x04000008, + 0x40602800, 0x405c3000, 0x0201f800, 0x0010a018, + 0x82000540, 0x00000001, 0x0401f002, 0x80000580, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4803c856, + 0x4d300000, 0x42026000, 0x0010f694, 0x59a8000d, + 0x81640580, 0x0400001a, 0x59300c07, 0x82040580, + 0x00000001, 0x0400000d, 0x82040580, 0x00000004, + 0x04000006, 0x82040580, 0x00000010, 0x02000800, + 0x0010867f, 0x0401f009, 0x59300203, 0x82000d80, + 0x00000007, 0x04000005, 0x4807c857, 0x0201f800, + 0x00108c45, 0x04020808, 0x83326400, 0x00000024, + 0x41580000, 0x81300480, 0x040017e5, 0x5c026000, + 0x1c01f000, 0x4933c857, 0x59300403, 0x4803c857, + 0x0201f800, 0x001061b2, 0x4df00000, 0x59300407, + 0x4803c857, 0x82000d80, 0x00000002, 0x04000018, + 0x82000d80, 0x00000001, 0x04000009, 0x82000d80, + 0x00000004, 0x04000006, 0x4933c856, 0x5c03e000, + 0x02000800, 0x0010619f, 0x0401f04b, 0x59300203, + 0x82000d80, 0x00000001, 0x04000018, 0x82000d80, + 0x00000002, 0x04000035, 0x82000d80, 0x00000005, + 0x04000032, 0x0201f800, 0x0010032d, 0x59300203, + 0x82000d80, 0x00000009, 0x0400000c, 0x82000d80, + 0x0000000b, 0x04000009, 0x82000d80, 0x0000000a, + 0x04000026, 0x82000d80, 0x0000000c, 0x04000023, + 0x0201f800, 0x0010032d, 0x598c000f, 0x81300580, + 0x04020004, 0x0201f800, 0x0010642d, 0x0402001b, + 0x59300004, 0x4803c857, 0x8c000520, 0x04000004, + 0x84000520, 0x48026004, 0x0401f014, 0x0201f800, + 0x0010e453, 0x80c40040, 0x02020800, 0x0010032d, + 0x5c03e000, 0x02000800, 0x0010619f, 0x59300407, + 0x82000d80, 0x00000002, 0x04000017, 0x0201f800, + 0x001043e2, 0x0201f800, 0x00108a83, 0x02000800, + 0x001078e7, 0x0401f010, 0x5c03e000, 0x02000800, + 0x0010619f, 0x59300407, 0x82000d80, 0x00000002, + 0x04000009, 0x0201f800, 0x001043e2, 0x0201f800, + 0x00108a83, 0x02000800, 0x001078e7, 0x8d3e7d00, + 0x04000005, 0x0201f800, 0x0010a684, 0x0201f000, + 0x00107144, 0x4a02621e, 0x00000001, 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, 0x42000800, 0x8000004b, 0x0201f000, - 0x000209b1, 0x83300480, 0x0010f518, 0x04001006, + 0x000209b1, 0x83300480, 0x0010f628, 0x04001006, 0x41540000, 0x81300480, 0x04021003, 0x80000580, 0x1c01f000, 0x81780080, 0x1c01f000, 0x59a8085a, 0x59cc2808, 0x82140500, 0x00000c00, 0x04000004, @@ -9378,11 +9419,11 @@ static const uint32_t isp_2400_risc_code[] = { 0x04000005, 0x82040480, 0x00000018, 0x0400100b, 0x59cc000b, 0x80080400, 0x04001008, 0x04000006, 0x82000400, 0x00000018, 0x80040480, 0x04001003, - 0x80000580, 0x1c01f000, 0x42000000, 0x0010bc12, - 0x0201f800, 0x0010ad1d, 0x82000540, 0x00000001, + 0x80000580, 0x1c01f000, 0x42000000, 0x0010bd12, + 0x0201f800, 0x0010ae10, 0x82000540, 0x00000001, 0x0401f7f9, 0x4933c857, 0x4937c857, 0x492fc857, 0x48efc857, 0x4d1c0000, 0x4d300000, 0x41323800, - 0x0201f800, 0x001070f5, 0x04000020, 0x48ee6022, + 0x0201f800, 0x00107188, 0x04000020, 0x48ee6022, 0x4936600a, 0x591c0407, 0x82000580, 0x00000003, 0x04000008, 0x591c0202, 0x4803c857, 0x4802641a, 0x591c0402, 0x4802621a, 0x4803c857, 0x0401f007, @@ -9393,49 +9434,49 @@ static const uint32_t isp_2400_risc_code[] = { 0x82000540, 0x00000001, 0x5c026000, 0x5c023800, 0x1c01f000, 0x4933c857, 0x493bc857, 0x4937c857, 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, - 0x59325809, 0x0201f800, 0x0010889a, 0x04000023, + 0x59325809, 0x0201f800, 0x00108953, 0x04000023, 0x83cca400, 0x00000006, 0x832cac00, 0x00000007, 0x83380580, 0x00000016, 0x04020009, 0x59a8005a, 0x82000580, 0x00000008, 0x04020014, 0x492fc857, 0x4200b000, 0x00000002, 0x0401f00b, 0x83380580, 0x00000015, 0x0402000d, 0x492fc857, 0x59a8005a, 0x82000580, 0x00000018, 0x04020008, 0x4200b000, - 0x00000006, 0x0201f800, 0x0010adef, 0x0201f800, - 0x00107319, 0x0401f005, 0x0201f800, 0x00107851, + 0x00000006, 0x0201f800, 0x0010aee2, 0x0201f800, + 0x001073af, 0x0401f005, 0x0201f800, 0x001078e7, 0x0201f800, 0x00020a10, 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x0201f800, 0x0010610d, 0x4df00000, 0x59300203, + 0x0201f800, 0x001061b2, 0x4df00000, 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, 0x0010032d, - 0x0c01f001, 0x00109281, 0x0010927f, 0x00109288, - 0x001092a8, 0x00109286, 0x0010927f, 0x0010927f, - 0x0010927f, 0x0010927f, 0x0010927f, 0x0010927f, - 0x0010927f, 0x0010927f, 0x0010927f, 0x0201f800, - 0x0010032d, 0x5c03e000, 0x02000800, 0x001060fa, - 0x80000580, 0x1c01f000, 0x0201f800, 0x00100bd4, - 0x5c03e000, 0x02000800, 0x001060fa, 0x8d3e7d02, + 0x0c01f001, 0x00109339, 0x00109337, 0x00109340, + 0x00109360, 0x0010933e, 0x00109337, 0x00109337, + 0x00109337, 0x00109337, 0x00109337, 0x00109337, + 0x00109337, 0x00109337, 0x00109337, 0x0201f800, + 0x0010032d, 0x5c03e000, 0x02000800, 0x0010619f, + 0x80000580, 0x1c01f000, 0x0201f800, 0x00100bd5, + 0x5c03e000, 0x02000800, 0x0010619f, 0x8d3e7d02, 0x04020017, 0x4d2c0000, 0x59325809, 0x4a025a07, 0x00000005, 0x0201f800, 0x000203ab, 0x5c025800, 0x497a6009, 0x8d3e7d00, 0x0402000f, 0x4a02621e, 0x0000000a, 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, 0x42000800, 0x8000404b, 0x0201f800, 0x000209b1, 0x81780080, - 0x1c01f000, 0x0201f800, 0x001070b5, 0x0401f7fc, - 0x0201f800, 0x001085a4, 0x04020004, 0x0201f800, - 0x00106351, 0x04020009, 0x0201f800, 0x0010e1ca, - 0x80c40040, 0x040007d7, 0x0201f800, 0x00106018, + 0x1c01f000, 0x0201f800, 0x00107144, 0x0401f7fc, + 0x0201f800, 0x00108659, 0x04020004, 0x0201f800, + 0x001063f6, 0x04020009, 0x0201f800, 0x0010e2da, + 0x80c40040, 0x040007d7, 0x0201f800, 0x001060bd, 0x02020800, 0x0010032d, 0x59300203, 0x82000d80, 0x00000003, 0x02000800, 0x0010032d, 0x82000c80, 0x0000000e, 0x02021800, 0x0010032d, 0x0c01f7b2, 0x4933c857, 0x4d340000, 0x836c0580, 0x00000003, 0x04020013, 0x599c0018, 0x8c000516, 0x04000004, - 0x0201f800, 0x001032c1, 0x0401f00d, 0x42000800, - 0x00000004, 0x0201f800, 0x00103d8a, 0x4a02641e, - 0x00000021, 0x0201f800, 0x00108e0d, 0x82000540, + 0x0201f800, 0x001032cb, 0x0401f00d, 0x42000800, + 0x00000004, 0x0201f800, 0x00103d9d, 0x4a02641e, + 0x00000021, 0x0201f800, 0x00108ec6, 0x82000540, 0x00000001, 0x5c026800, 0x1c01f000, 0x80000580, 0x0401f7fd, 0x59303009, 0x58181a05, 0x820c1d00, 0x000000ff, 0x820c0580, 0x00000048, 0x04000004, 0x820c0580, 0x0000006a, 0x04020046, 0x58180409, - 0x8c000500, 0x04000043, 0x42000000, 0x0010c25c, + 0x8c000500, 0x04000043, 0x42000000, 0x0010c35c, 0x50006000, 0x41781800, 0x5830200b, 0x41300000, 0x80100580, 0x04000006, 0x40101800, 0x580c2000, 0x801021c0, 0x040207fa, 0x0401f036, 0x4933c857, @@ -9446,7 +9487,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x4810600b, 0x801021c0, 0x0402001e, 0x4978600a, 0x0401f01c, 0x4933c856, 0x4810600b, 0x801021c0, 0x04020002, 0x4978600a, 0x4c180000, 0x4c300000, - 0x0201f800, 0x00100643, 0x5c006000, 0x0401fda8, + 0x0201f800, 0x00100643, 0x5c006000, 0x0401fda9, 0x5c003000, 0x0401f00f, 0x4933c856, 0x800c19c0, 0x04020008, 0x801021c0, 0x04000003, 0x4810600b, 0x0401f008, 0x4978600b, 0x4978600a, 0x0401f005, @@ -9455,432 +9496,437 @@ static const uint32_t isp_2400_risc_code[] = { 0x1c01f000, 0x4933c857, 0x59368c03, 0x4c180000, 0x59300203, 0x82003480, 0x0000000e, 0x02021800, 0x0010032d, 0x0c01f803, 0x5c003000, 0x1c01f000, - 0x00109342, 0x001098cd, 0x00109a07, 0x00109342, - 0x00109342, 0x00109342, 0x00109342, 0x00109342, - 0x00109365, 0x00109342, 0x00109342, 0x00109342, - 0x00109342, 0x00109342, 0x0201f800, 0x0010032d, + 0x001093fa, 0x00109996, 0x00109ad3, 0x001093fa, + 0x001093fa, 0x001093fa, 0x001093fa, 0x001093fa, + 0x0010941d, 0x001093fa, 0x001093fa, 0x001093fa, + 0x001093fa, 0x001093fa, 0x0201f800, 0x0010032d, 0x4933c857, 0x42028800, 0x0000ffff, 0x813669c0, 0x04000002, 0x59368c03, 0x4c180000, 0x59300203, 0x82003480, 0x0000000e, 0x02021800, 0x0010032d, - 0x0c01f803, 0x5c003000, 0x1c01f000, 0x00109361, - 0x00109ce1, 0x00109361, 0x00109361, 0x00109361, - 0x00109361, 0x00109361, 0x00109361, 0x00109c2b, - 0x0010a0db, 0x0010a111, 0x0010a0db, 0x0010a111, - 0x00109361, 0x0201f800, 0x0010032d, 0x0201f800, + 0x0c01f803, 0x5c003000, 0x1c01f000, 0x00109419, + 0x00109db8, 0x00109419, 0x00109419, 0x00109419, + 0x00109419, 0x00109419, 0x00109419, 0x00109cfa, + 0x0010a1ba, 0x0010a1f0, 0x0010a1ba, 0x0010a1f0, + 0x00109419, 0x0201f800, 0x0010032d, 0x0201f800, 0x0010032d, 0x83383480, 0x00000057, 0x02021800, 0x0010032d, 0x41380000, 0x493bc857, 0x4d1c0000, 0x4d400000, 0x0c01f804, 0x5c028000, 0x5c023800, - 0x1c01f000, 0x001093d1, 0x001095f4, 0x001093d1, - 0x001093d1, 0x001093d1, 0x001095ff, 0x001093d1, - 0x001093d1, 0x001093d1, 0x001093d1, 0x001093d1, - 0x001093d1, 0x001093d1, 0x001093d1, 0x001093d1, - 0x001093d1, 0x001093d1, 0x001093d1, 0x001093d1, - 0x001093d1, 0x001093d1, 0x001093d1, 0x001093d1, - 0x00109406, 0x00109457, 0x00109471, 0x001094f0, - 0x0010954e, 0x00109592, 0x001095c3, 0x001093d1, - 0x001093d1, 0x00109607, 0x001093d1, 0x001093d1, - 0x00109615, 0x0010961e, 0x001093d1, 0x001093d1, - 0x001093d1, 0x001093d1, 0x001093d1, 0x001096be, - 0x001093d1, 0x001093d1, 0x0010952e, 0x001093d1, - 0x001093d1, 0x0010967d, 0x001093d1, 0x001093d1, - 0x001093d1, 0x001096cc, 0x001093d1, 0x001093d1, - 0x001093d1, 0x00109715, 0x001093d1, 0x001093d1, - 0x001093d1, 0x001093d1, 0x001093d1, 0x001093d1, - 0x00109782, 0x001093d1, 0x001097ae, 0x001097b9, - 0x001093d1, 0x001093d1, 0x001093d3, 0x001097c4, - 0x001093d1, 0x001093d1, 0x001093d1, 0x001093e4, - 0x001093d1, 0x001093d1, 0x001093d1, 0x001097cb, - 0x001097d3, 0x001097f1, 0x001093d1, 0x001093d1, - 0x001093d1, 0x001093d1, 0x001093d1, 0x001093f8, - 0x001093d1, 0x001093d1, 0x001093d1, 0x001093d1, - 0x001093d1, 0x001093d1, 0x001093d1, 0x001093d1, - 0x001093d1, 0x0201f800, 0x0010032d, 0x4933c857, - 0x0201f800, 0x0010a141, 0x02020000, 0x001097fc, - 0x0201f800, 0x00101b05, 0x02020000, 0x001097fc, + 0x1c01f000, 0x00109489, 0x001096b3, 0x00109489, + 0x00109489, 0x00109489, 0x001096be, 0x00109489, + 0x00109489, 0x00109489, 0x00109489, 0x00109489, + 0x00109489, 0x00109489, 0x00109489, 0x00109489, + 0x00109489, 0x00109489, 0x00109489, 0x00109489, + 0x00109489, 0x00109489, 0x00109489, 0x00109489, + 0x001094c2, 0x00109513, 0x0010952d, 0x001095ac, + 0x0010960a, 0x0010964e, 0x0010967f, 0x00109489, + 0x00109489, 0x001096c6, 0x00109489, 0x00109489, + 0x001096d4, 0x001096dd, 0x00109489, 0x00109489, + 0x00109489, 0x00109489, 0x00109489, 0x0010977d, + 0x00109489, 0x00109489, 0x001095ea, 0x00109489, + 0x00109489, 0x0010973c, 0x00109489, 0x00109489, + 0x00109489, 0x0010978b, 0x00109489, 0x00109489, + 0x00109489, 0x001097d4, 0x00109489, 0x00109489, + 0x00109489, 0x00109489, 0x00109489, 0x00109489, + 0x00109841, 0x00109489, 0x00109871, 0x0010987c, + 0x00109489, 0x00109489, 0x0010948b, 0x00109887, + 0x00109489, 0x00109489, 0x00109489, 0x0010949c, + 0x00109489, 0x00109489, 0x00109489, 0x0010988e, + 0x00109896, 0x001098b7, 0x00109489, 0x00109489, + 0x00109489, 0x00109489, 0x00109489, 0x001094b0, + 0x00109489, 0x00109489, 0x00109489, 0x00109489, + 0x00109489, 0x00109489, 0x00109489, 0x00109489, + 0x00109489, 0x0201f800, 0x0010032d, 0x4933c857, + 0x0201f800, 0x0010a220, 0x02020000, 0x001098c5, + 0x0201f800, 0x00101b0a, 0x02020000, 0x001098c5, 0x59cc0407, 0x4802601d, 0x4a026403, 0x00000045, - 0x4a026203, 0x00000001, 0x0201f000, 0x00105fe8, - 0x4933c857, 0x0201f800, 0x0010a141, 0x02020000, - 0x001097fc, 0x0201f800, 0x00101b05, 0x02020000, - 0x001097fc, 0x0201f800, 0x0010983d, 0x040201e3, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010608d, + 0x4933c857, 0x0201f800, 0x0010a220, 0x02020000, + 0x001098c5, 0x0201f800, 0x00101b0a, 0x02020000, + 0x001098c5, 0x0201f800, 0x00109906, 0x040201e7, 0x59cc0007, 0x4802601d, 0x4a026403, 0x0000004a, - 0x4a026203, 0x00000001, 0x0201f000, 0x00105fe8, - 0x4933c857, 0x0201f800, 0x0010a141, 0x02020000, - 0x001097fc, 0x0201f800, 0x00101b05, 0x040203fd, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010608d, + 0x4933c857, 0x0201f800, 0x0010a220, 0x02020000, + 0x001098c5, 0x0201f800, 0x00101b0a, 0x02020000, + 0x001098c5, 0x0201f800, 0x00109906, 0x040201d3, 0x4a026403, 0x00000056, 0x4a026203, 0x00000001, - 0x0201f000, 0x00105fe8, 0x4933c857, 0x0201f800, - 0x00101b05, 0x0402000d, 0x0201f800, 0x001040cb, + 0x0201f000, 0x0010608d, 0x4933c857, 0x0201f800, + 0x00101b0a, 0x0402000d, 0x0201f800, 0x001040e5, 0x0402000a, 0x59a8021b, 0x8c000500, 0x0402000e, - 0x8c000506, 0x04020005, 0x0201f800, 0x00104716, - 0x04020009, 0x0401f3e7, 0x4a026403, 0x00000009, + 0x8c000506, 0x04020005, 0x0201f800, 0x00104755, + 0x04020009, 0x0401f3f4, 0x4a026403, 0x00000009, 0x4a02641b, 0x00000009, 0x4a02621b, 0x00000000, - 0x0401f1df, 0x0201f800, 0x00104195, 0x04000029, + 0x0401f1e2, 0x0201f800, 0x001041b1, 0x04000029, 0x59340200, 0x8c00051a, 0x04000004, 0x5934000a, - 0x84000560, 0x4802680a, 0x0201f800, 0x00109e43, + 0x84000560, 0x4802680a, 0x0201f800, 0x00109f1a, 0x0402002a, 0x42028000, 0x00000029, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010df61, 0x5c027800, - 0x42000000, 0x0010bc1f, 0x0201f800, 0x0010ad1d, - 0x0201f800, 0x00103e68, 0x4a026403, 0x00000008, - 0x42003000, 0x00000003, 0x8d0e1d20, 0x040001c0, + 0x417a7800, 0x0201f800, 0x0010e06f, 0x5c027800, + 0x42000000, 0x0010bd1f, 0x0201f800, 0x0010ae10, + 0x0201f800, 0x00103e7e, 0x4a026403, 0x00000008, + 0x42003000, 0x00000003, 0x8d0e1d20, 0x040001c3, 0x59cc400b, 0x59cc380c, 0x59cc180d, 0x59cc080e, 0x9c2041c0, 0x9c1c39c0, 0x9c0c19c0, 0x9c0409c0, - 0x4a026203, 0x00000007, 0x41782800, 0x0401f1a7, - 0x0201f800, 0x00109f0c, 0x040207dc, 0x4a026403, + 0x4a026203, 0x00000007, 0x41782800, 0x0401f1aa, + 0x0201f800, 0x00109fe3, 0x040207dc, 0x4a026403, 0x00000009, 0x4a02641b, 0x0000000e, 0x4a02621b, - 0x00001900, 0x0401f1aa, 0x4a026403, 0x00000009, - 0x4a02641b, 0x00000003, 0x0401f1a5, 0x4933c857, - 0x0201f800, 0x00101b05, 0x040203a2, 0x0201f800, - 0x001040cb, 0x0402039f, 0x493a6403, 0x0201f800, - 0x00109ddd, 0x04020009, 0x4a026403, 0x00000006, - 0x8d0e1d20, 0x04000196, 0x4a026203, 0x00000007, - 0x0201f000, 0x0010a4d5, 0x4a026403, 0x00000007, + 0x00001900, 0x0401f1ad, 0x4a026403, 0x00000009, + 0x4a02641b, 0x00000003, 0x0401f1a8, 0x4933c857, + 0x0201f800, 0x00101b0a, 0x040203af, 0x0201f800, + 0x001040e5, 0x040203ac, 0x493a6403, 0x0201f800, + 0x00109eb4, 0x04020009, 0x4a026403, 0x00000006, + 0x8d0e1d20, 0x04000199, 0x4a026203, 0x00000007, + 0x0201f000, 0x0010a5c8, 0x4a026403, 0x00000007, 0x4a02641b, 0x00000009, 0x4a02621b, 0x00000000, - 0x0401f18b, 0x4933c857, 0x0201f800, 0x001040cb, - 0x04020388, 0x5934000a, 0x82000500, 0x00010000, - 0x82000580, 0x00010000, 0x02020800, 0x0010a141, - 0x02000800, 0x00101b05, 0x0402037e, 0x59cc0001, + 0x0401f18e, 0x4933c857, 0x0201f800, 0x001040e5, + 0x04020395, 0x5934000a, 0x82000500, 0x00010000, + 0x82000580, 0x00010000, 0x02020800, 0x0010a220, + 0x02000800, 0x00101b0a, 0x0402038b, 0x59cc0001, 0x82000500, 0x00ffff00, 0x82000580, 0x00fffc00, 0x04020006, 0x59a80006, 0x8c00050e, 0x04000003, - 0x8d0e1d20, 0x04000047, 0x0201f800, 0x00104195, + 0x8d0e1d20, 0x04000047, 0x0201f800, 0x001041b1, 0x04020005, 0x42027800, 0x00000001, 0x0201f800, - 0x00103d7f, 0x0201f800, 0x00104181, 0x04000004, + 0x00103d92, 0x0201f800, 0x0010419d, 0x04000004, 0x82000580, 0x00000703, 0x04020041, 0x59cc0206, 0x82003500, 0x00000003, 0x04020044, 0x82003480, 0x00000014, 0x04001041, 0x59a8305a, 0x80183480, 0x0400103e, 0x5934300a, 0x84183516, 0x82000580, 0x00000014, 0x04020002, 0x84183556, 0x481a680a, 0x59cc0406, 0x82000500, 0x00000003, 0x04020033, - 0x0201f800, 0x00109e90, 0x0402003b, 0x0201f800, - 0x00104165, 0x04020007, 0x4c600000, 0x4178c000, - 0x417a7800, 0x0201f800, 0x00101a8f, 0x5c00c000, + 0x0201f800, 0x00109f67, 0x0402003b, 0x0201f800, + 0x00104181, 0x04020007, 0x4c600000, 0x4178c000, + 0x417a7800, 0x0201f800, 0x00101a94, 0x5c00c000, 0x836c0580, 0x00000003, 0x04020009, 0x42003000, - 0x00000006, 0x0201f800, 0x0010a4a6, 0x42000000, - 0x0010bc1e, 0x0201f800, 0x0010ad1d, 0x0201f800, - 0x00103ecf, 0x4a026403, 0x0000000a, 0x42003000, + 0x00000006, 0x0201f800, 0x0010a599, 0x42000000, + 0x0010bd1e, 0x0201f800, 0x0010ae10, 0x0201f800, + 0x00103ee9, 0x4a026403, 0x0000000a, 0x42003000, 0x00000020, 0x59cc1a0a, 0x41780800, 0x41784000, - 0x41783800, 0x8d0e1d20, 0x0400012d, 0x0401f775, + 0x41783800, 0x8d0e1d20, 0x04000130, 0x0401f775, 0x4a026403, 0x0000000b, 0x4a02641b, 0x0000000b, - 0x4a02621b, 0x00002c00, 0x0401f125, 0x4a026403, + 0x4a02621b, 0x00002c00, 0x0401f128, 0x4a026403, 0x0000000b, 0x4a02641b, 0x00000009, 0x4a02621b, - 0x00001e00, 0x0401f11e, 0x42000000, 0x0010bb79, - 0x0201f800, 0x0010ad1d, 0x4a026403, 0x0000000b, + 0x00001e00, 0x0401f121, 0x42000000, 0x0010bc79, + 0x0201f800, 0x0010ae10, 0x4a026403, 0x0000000b, 0x4a02641b, 0x00000007, 0x4a02621b, 0x00000000, - 0x0401f113, 0x4a026403, 0x0000000b, 0x4a02641b, - 0x00000003, 0x4a02621b, 0x00000000, 0x0401f10c, - 0x4933c857, 0x0201f800, 0x001040cb, 0x04020309, - 0x0201f800, 0x0010a141, 0x04020306, 0x0201f800, - 0x00101b05, 0x04020303, 0x59cc0206, 0x82003500, + 0x0401f116, 0x4a026403, 0x0000000b, 0x4a02641b, + 0x00000003, 0x4a02621b, 0x00000000, 0x0401f10f, + 0x4933c857, 0x0201f800, 0x001040e5, 0x04020316, + 0x0201f800, 0x0010a220, 0x04020313, 0x0201f800, + 0x00101b0a, 0x04020310, 0x59cc0206, 0x82003500, 0x00000003, 0x04020023, 0x82003480, 0x00000014, 0x04001020, 0x59a8305a, 0x80180480, 0x0400101d, 0x59cc0406, 0x82000500, 0x00000003, 0x04020019, 0x59340400, 0x82000580, 0x00000707, 0x0400001c, 0x417a7800, 0x4c600000, 0x4178c000, 0x0201f800, - 0x00101a8f, 0x5c00c000, 0x42003000, 0x0000000a, - 0x0201f800, 0x0010a4a6, 0x42000000, 0x0010bc1b, - 0x0201f800, 0x0010ad1d, 0x4a026403, 0x0000000c, + 0x00101a94, 0x5c00c000, 0x42003000, 0x0000000a, + 0x0201f800, 0x0010a599, 0x42000000, 0x0010bd1b, + 0x0201f800, 0x0010ae10, 0x4a026403, 0x0000000c, 0x41782800, 0x42003000, 0x00000021, 0x0401f7ae, 0x4a026403, 0x0000000d, 0x4a02641b, 0x00000007, - 0x4a02621b, 0x00000000, 0x0401f0d5, 0x4a026403, + 0x4a02621b, 0x00000000, 0x0401f0d8, 0x4a026403, 0x0000000d, 0x4a02641b, 0x00000009, 0x4a02621b, - 0x00001e00, 0x0401f0ce, 0x4933c857, 0x0201f800, - 0x001040cb, 0x040202cb, 0x0201f800, 0x0010a141, - 0x040202c8, 0x0201f800, 0x00101b05, 0x040202c5, - 0x0401fb05, 0x0402000e, 0x493a6403, 0x0401fb0c, + 0x00001e00, 0x0401f0d1, 0x4933c857, 0x0201f800, + 0x001040e5, 0x040202d8, 0x0201f800, 0x0010a220, + 0x040202d5, 0x0201f800, 0x00101b0a, 0x040202d2, + 0x0401fb12, 0x0402000e, 0x493a6403, 0x0401fb19, 0x04020004, 0x4a026403, 0x0000002e, 0x0401f725, 0x4a026403, 0x0000000d, 0x4a02641b, 0x00000007, - 0x4a02621b, 0x00000000, 0x0401f0b5, 0x4a026403, + 0x4a02621b, 0x00000000, 0x0401f0b8, 0x4a026403, 0x0000000d, 0x4a02641b, 0x00000009, 0x4a02621b, - 0x00001e00, 0x0401f0ae, 0x4933c857, 0x0201f800, - 0x001040cb, 0x040206c5, 0x59a8021b, 0x8c000500, + 0x00001e00, 0x0401f0b1, 0x4933c857, 0x0201f800, + 0x001040e5, 0x040206c5, 0x59a8021b, 0x8c000500, 0x04020006, 0x8c000506, 0x040206c0, 0x0201f800, - 0x00104716, 0x040002a3, 0x0201f800, 0x00104181, - 0x04020031, 0x0201f800, 0x00109e98, 0x0402000c, - 0x4a026403, 0x0000000e, 0x8d0e1d20, 0x04000098, + 0x00104755, 0x040002b0, 0x0201f800, 0x0010419d, + 0x04020031, 0x0201f800, 0x00109f6f, 0x0402000c, + 0x4a026403, 0x0000000e, 0x8d0e1d20, 0x0400009b, 0x42003000, 0x00000052, 0x59cc4008, 0x59cc3809, 0x59cc180a, 0x59cc080b, 0x0401f6d6, 0x4933c857, - 0x42003000, 0x00000003, 0x0201f800, 0x0010a4ae, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010df61, - 0x5c027800, 0x42000000, 0x0010bc1d, 0x0201f800, - 0x0010ad1d, 0x59340200, 0x84000558, 0x48026a00, - 0x42000800, 0x0000000b, 0x0201f800, 0x00103d8a, - 0x8d0e1d20, 0x04000073, 0x42003000, 0x00000007, - 0x0401f061, 0x4933c857, 0x4a026403, 0x0000000f, + 0x42003000, 0x00000003, 0x0201f800, 0x0010a5a1, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010e06f, + 0x5c027800, 0x42000000, 0x0010bd1d, 0x0201f800, + 0x0010ae10, 0x59340200, 0x84000558, 0x48026a00, + 0x42000800, 0x0000000b, 0x0201f800, 0x00103d9d, + 0x8d0e1d20, 0x04000076, 0x42003000, 0x00000007, + 0x0401f064, 0x4933c857, 0x4a026403, 0x0000000f, 0x4a02641b, 0x00000003, 0x4a02621b, 0x00001e00, - 0x0401f06f, 0x59340400, 0x82000580, 0x00000703, + 0x0401f072, 0x59340400, 0x82000580, 0x00000703, 0x040007f5, 0x0401f041, 0x4933c857, 0x0201f800, - 0x001040cb, 0x04020267, 0x59a8021b, 0x8c000500, - 0x04020006, 0x8c000506, 0x04020262, 0x0201f800, - 0x00104716, 0x0400025f, 0x0201f800, 0x00104178, - 0x0402002e, 0x0201f800, 0x00109eb3, 0x02000800, - 0x00109e43, 0x04020006, 0x4a026403, 0x00000010, + 0x001040e5, 0x04020274, 0x59a8021b, 0x8c000500, + 0x04020006, 0x8c000506, 0x0402026f, 0x0201f800, + 0x00104755, 0x0400026c, 0x0201f800, 0x00104194, + 0x0402002e, 0x0201f800, 0x00109f8a, 0x02000800, + 0x00109f1a, 0x04020006, 0x4a026403, 0x00000010, 0x42003000, 0x00000050, 0x0401f690, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010df61, 0x5c027800, - 0x42003000, 0x00000003, 0x0201f800, 0x0010a4ae, - 0x42000000, 0x0010bc1d, 0x0201f800, 0x0010ad1d, + 0x417a7800, 0x0201f800, 0x0010e06f, 0x5c027800, + 0x42003000, 0x00000003, 0x0201f800, 0x0010a5a1, + 0x42000000, 0x0010bd1d, 0x0201f800, 0x0010ae10, 0x59340200, 0x84000558, 0x48026a00, 0x0401f7c5, 0x4a026403, 0x00000011, 0x4a02641b, 0x00000003, - 0x4a02621b, 0x00001e00, 0x0401f039, 0x4933c857, - 0x0201f800, 0x00101b05, 0x02000800, 0x0010a141, - 0x04020234, 0x0401fa74, 0x04020008, 0x4a026403, - 0x00000012, 0x0401f02e, 0x59340400, 0x82000580, - 0x00000703, 0x040007eb, 0x4d3c0000, 0x417a7800, - 0x42028000, 0x00000029, 0x0201f800, 0x0010df61, - 0x5c027800, 0x42003000, 0x00000017, 0x0201f800, - 0x0010a4ae, 0x42000000, 0x0010bc1d, 0x0201f800, - 0x0010ad1d, 0x8d0e1d20, 0x04000012, 0x42003000, - 0x00000006, 0x42028000, 0x00000029, 0x4933c857, - 0x4a026403, 0x00000001, 0x4a026203, 0x00000007, - 0x41782800, 0x0401f003, 0x42028000, 0x00000046, - 0x0201f800, 0x00109f37, 0x0201f000, 0x0010a4d5, - 0x4933c857, 0x4a026403, 0x00000001, 0x42000800, - 0x0000000b, 0x0201f800, 0x00103d8a, 0x4a026203, - 0x00000001, 0x0201f000, 0x00105fe8, 0x4933c857, - 0x42000800, 0x00000009, 0x0201f800, 0x00103d8a, - 0x4a026403, 0x00000005, 0x0401f7f5, 0x0201f800, - 0x0010a141, 0x040201f3, 0x0201f800, 0x00101b05, - 0x040201f0, 0x0401fa30, 0x040207c4, 0x4a026403, - 0x00000020, 0x4a026203, 0x00000001, 0x0201f000, - 0x00105fe8, 0x0201f800, 0x00101b05, 0x040201e5, - 0x4a026403, 0x00000023, 0x4a026203, 0x00000001, - 0x0201f000, 0x00105fe8, 0x0201f800, 0x0010a141, - 0x02000800, 0x00101b05, 0x040201da, 0x0401fa1a, - 0x040207ae, 0x59cc0807, 0x82040500, 0x00ffff00, - 0x04020009, 0x59340212, 0x82000500, 0x0000ff00, - 0x04000005, 0x59a8000f, 0x82000500, 0x000000ff, - 0x0401f002, 0x59a8000f, 0x82040d00, 0x00ffffff, - 0x80040580, 0x04020014, 0x59cc1408, 0x0201f800, - 0x00108cd8, 0x04000025, 0x591c0202, 0x82001580, - 0x0000ffff, 0x04000004, 0x59cc1208, 0x80080580, - 0x0402001e, 0x591c000a, 0x81340580, 0x0402001b, - 0x591c0407, 0x82000580, 0x00000007, 0x04020017, - 0x0401f027, 0x59cc1208, 0x82080580, 0x0000ffff, - 0x0400000c, 0x0201f800, 0x00108cd8, 0x0400000f, - 0x59cc1408, 0x591c0202, 0x80080580, 0x04020024, - 0x591c000a, 0x81340580, 0x04020021, 0x0401f010, - 0x59cc1408, 0x41780000, 0x0201f800, 0x00109c91, - 0x040207f8, 0x0401f017, 0x4a026403, 0x00000026, - 0x4a02621b, 0x00001700, 0x59cc1208, 0x82081580, - 0x0000ffff, 0x04020796, 0x0401f00e, 0x591c0407, - 0x82000580, 0x00000007, 0x040207f4, 0x591c0403, - 0x82000580, 0x00000024, 0x04020006, 0x4d300000, - 0x411e6000, 0x0201f800, 0x00020a10, 0x5c026000, - 0x4a026403, 0x00000025, 0x0401f785, 0x59cc1408, - 0x41780000, 0x0201f800, 0x00109c91, 0x040207e3, - 0x0401f7f8, 0x4933c857, 0x4d3c0000, 0x42027800, - 0x00000001, 0x0201f800, 0x00103d7f, 0x5c027800, - 0x4c580000, 0x4200b000, 0x00000002, 0x83a81c00, - 0x00000002, 0x83cc1400, 0x0000000b, 0x0201f800, - 0x00107d52, 0x5c00b000, 0x04000004, 0x4a026403, - 0x00000031, 0x0401f76a, 0x0201f800, 0x00020a10, - 0x4200b000, 0x00000002, 0x83a81c00, 0x00000000, - 0x83cc1400, 0x0000000d, 0x0201f800, 0x00107d52, - 0x04020010, 0x0201f800, 0x001055aa, 0x0400000d, - 0x59300407, 0x82000580, 0x00000001, 0x04020009, - 0x59300403, 0x82000580, 0x00000002, 0x04020005, - 0x5930000a, 0x81340580, 0x02000800, 0x00020a10, - 0x0201f800, 0x00104716, 0x0402000f, 0x0201f800, - 0x00104732, 0x04020008, 0x4a035014, 0x00000001, - 0x4202d800, 0x00000001, 0x0201f800, 0x00104670, - 0x0401f005, 0x42000000, 0x00000001, 0x0201f800, - 0x001046e7, 0x1c01f000, 0x0201f800, 0x00101b05, - 0x0402013c, 0x0401f97c, 0x04020710, 0x493a6403, - 0x0401f9e0, 0x04020004, 0x4a026403, 0x0000002b, - 0x0401f733, 0x4a026403, 0x0000002c, 0x0401f730, - 0x4933c857, 0x0201f800, 0x00105713, 0x0402012d, - 0x0201f800, 0x00101b05, 0x0402012a, 0x0201f800, - 0x00104165, 0x0402071f, 0x59cc0408, 0x4802641a, - 0x59cc0208, 0x4802621a, 0x59cc0807, 0x59340002, - 0x82000500, 0x00ffffff, 0x80040580, 0x04000015, - 0x59a8000f, 0x80040580, 0x04020025, 0x59cc1408, - 0x0201f800, 0x00108cd8, 0x04000027, 0x831c0580, - 0xffffffff, 0x04000007, 0x0201f800, 0x0010a06f, - 0x04000021, 0x0201f800, 0x0010a48d, 0x0400001e, - 0x491e601f, 0x4a026403, 0x00000036, 0x0401f103, - 0x59cc1208, 0x82080580, 0x0000ffff, 0x04000009, - 0x0201f800, 0x00108cd8, 0x04000013, 0x591c0202, - 0x59cc0c08, 0x80040580, 0x0402000f, 0x0401f7e8, - 0x59cc1408, 0x42000000, 0x00000001, 0x0201f800, - 0x00109c91, 0x04000008, 0x0401f7e1, 0x4803c856, - 0x4a02641b, 0x00000009, 0x4a02621b, 0x00001500, + 0x4a02621b, 0x00001e00, 0x0401f03c, 0x4933c857, + 0x0201f800, 0x00101b0a, 0x02000800, 0x0010a220, + 0x04020241, 0x0401fa81, 0x04020008, 0x4a026403, + 0x00000012, 0x0401f031, 0x59340400, 0x82000580, + 0x00000703, 0x040007eb, 0x83340580, 0x0010c2b2, + 0x0400000c, 0x4d3c0000, 0x417a7800, 0x42028000, + 0x00000029, 0x0201f800, 0x0010e06f, 0x5c027800, + 0x42003000, 0x00000017, 0x0201f800, 0x0010a5a1, + 0x42000000, 0x0010bd1d, 0x0201f800, 0x0010ae10, + 0x8d0e1d20, 0x04000012, 0x42003000, 0x00000006, + 0x42028000, 0x00000029, 0x4933c857, 0x4a026403, + 0x00000001, 0x4a026203, 0x00000007, 0x41782800, + 0x0401f003, 0x42028000, 0x00000046, 0x0201f800, + 0x0010a00e, 0x0201f000, 0x0010a5c8, 0x4933c857, + 0x4a026403, 0x00000001, 0x42000800, 0x0000000b, + 0x0201f800, 0x00103d9d, 0x4a026203, 0x00000001, + 0x0201f000, 0x0010608d, 0x4933c857, 0x42000800, + 0x00000009, 0x0201f800, 0x00103d9d, 0x4a026403, + 0x00000005, 0x0401f7f5, 0x0201f800, 0x0010a220, + 0x040201fd, 0x0201f800, 0x00101b0a, 0x040201fa, + 0x0401fa3a, 0x040207c1, 0x4a026403, 0x00000020, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010608d, + 0x0201f800, 0x00101b0a, 0x040201ef, 0x4a026403, + 0x00000023, 0x4a026203, 0x00000001, 0x0201f000, + 0x0010608d, 0x0201f800, 0x0010a220, 0x02000800, + 0x00101b0a, 0x040201e4, 0x0401fa24, 0x040207ab, + 0x59cc0807, 0x82040500, 0x00ffff00, 0x04020009, + 0x59340212, 0x82000500, 0x0000ff00, 0x04000005, + 0x59a8000f, 0x82000500, 0x000000ff, 0x0401f002, + 0x59a8000f, 0x82040d00, 0x00ffffff, 0x80040580, + 0x04020014, 0x59cc1408, 0x0201f800, 0x00108d91, + 0x04000025, 0x591c0202, 0x82001580, 0x0000ffff, + 0x04000004, 0x59cc1208, 0x80080580, 0x0402001e, + 0x591c000a, 0x81340580, 0x0402001b, 0x591c0407, + 0x82000580, 0x00000007, 0x04020017, 0x0401f027, + 0x59cc1208, 0x82080580, 0x0000ffff, 0x0400000c, + 0x0201f800, 0x00108d91, 0x0400000f, 0x59cc1408, + 0x591c0202, 0x80080580, 0x04020024, 0x591c000a, + 0x81340580, 0x04020021, 0x0401f010, 0x59cc1408, + 0x41780000, 0x0201f800, 0x00109d60, 0x040207f8, + 0x0401f017, 0x4a026403, 0x00000026, 0x4a02621b, + 0x00001700, 0x59cc1208, 0x82081580, 0x0000ffff, + 0x04020796, 0x0401f00e, 0x591c0407, 0x82000580, + 0x00000007, 0x040207f4, 0x591c0403, 0x82000580, + 0x00000024, 0x04020006, 0x4d300000, 0x411e6000, + 0x0201f800, 0x00020a10, 0x5c026000, 0x4a026403, + 0x00000025, 0x0401f785, 0x59cc1408, 0x41780000, + 0x0201f800, 0x00109d60, 0x040207e3, 0x0401f7f8, + 0x4933c857, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x00103d92, 0x5c027800, 0x4c580000, + 0x4200b000, 0x00000002, 0x83a81c00, 0x00000002, + 0x83cc1400, 0x0000000b, 0x0201f800, 0x00107df9, + 0x5c00b000, 0x04000004, 0x4a026403, 0x00000031, + 0x0401f76a, 0x0201f800, 0x00020a10, 0x4200b000, + 0x00000002, 0x83a81c00, 0x00000000, 0x83cc1400, + 0x0000000d, 0x0201f800, 0x00107df9, 0x04020010, + 0x0201f800, 0x00105616, 0x0400000d, 0x59300407, + 0x82000580, 0x00000001, 0x04020009, 0x59300403, + 0x82000580, 0x00000002, 0x04020005, 0x5930000a, + 0x81340580, 0x02000800, 0x00020a10, 0x0201f800, + 0x00104755, 0x0402000f, 0x0201f800, 0x00104771, + 0x04020008, 0x4a035014, 0x00000001, 0x4202d800, + 0x00000001, 0x0201f800, 0x001046af, 0x0401f005, + 0x42000000, 0x00000001, 0x0201f800, 0x00104726, + 0x1c01f000, 0x0201f800, 0x00101b0a, 0x04020146, + 0x0401f986, 0x0402070d, 0x493a6403, 0x0401f9ea, + 0x04020004, 0x4a026403, 0x0000002b, 0x0401f733, + 0x4a026403, 0x0000002c, 0x0401f730, 0x4933c857, + 0x0201f800, 0x0010577f, 0x04020137, 0x0201f800, + 0x00101b0a, 0x04020134, 0x0201f800, 0x00104181, + 0x040206fa, 0x59cc0408, 0x4802641a, 0x59cc0208, + 0x4802621a, 0x59cc0807, 0x59340002, 0x82000500, + 0x00ffffff, 0x80040580, 0x04000015, 0x59a8000f, + 0x80040580, 0x04020025, 0x59cc1408, 0x0201f800, + 0x00108d91, 0x04000027, 0x831c0580, 0xffffffff, + 0x04000007, 0x0201f800, 0x0010a14e, 0x04000021, + 0x0201f800, 0x0010a580, 0x0400001e, 0x491e601f, + 0x4a026403, 0x00000036, 0x0401f10d, 0x59cc1208, + 0x82080580, 0x0000ffff, 0x04000009, 0x0201f800, + 0x00108d91, 0x04000013, 0x591c0202, 0x59cc0c08, + 0x80040580, 0x0402000f, 0x0401f7e8, 0x59cc1408, + 0x42000000, 0x00000001, 0x0201f800, 0x00109d60, + 0x04000008, 0x0401f7e1, 0x4803c856, 0x4a02641b, + 0x00000009, 0x4a02621b, 0x00001500, 0x0401f006, + 0x4803c856, 0x4a02641b, 0x00000003, 0x4a02621b, + 0x00001700, 0x4a026403, 0x00000037, 0x0401f0ec, + 0x4933c857, 0x0201f800, 0x0010577f, 0x040200ee, + 0x0201f800, 0x00101b0a, 0x040200eb, 0x0201f800, + 0x00104181, 0x040206b1, 0x0201f800, 0x001040c4, + 0x04000055, 0x59cc0407, 0x4802641a, 0x59cc1207, + 0x480a621a, 0x82080580, 0x0000ffff, 0x04000005, + 0x0201f800, 0x00108d91, 0x04000043, 0x0401f00a, + 0x59cc1407, 0x42000000, 0x00000001, 0x0201f800, + 0x00109d60, 0x0400003c, 0x831c0580, 0xffffffff, + 0x04000039, 0x59cc0c07, 0x591c0202, 0x80040580, + 0x04020035, 0x0201f800, 0x0010a580, 0x04000032, + 0x591c0415, 0x8c000516, 0x0402003d, 0x4d300000, + 0x411e6000, 0x0201f800, 0x00108530, 0x5c026000, + 0x4a023a03, 0x00000007, 0x59cc0c09, 0x82040d00, + 0x0000ff00, 0x840409c0, 0x82040580, 0x00000001, + 0x0400000c, 0x82040580, 0x00000005, 0x0400000e, + 0x82040580, 0x00000007, 0x04020015, 0x42000000, + 0x0010bd0a, 0x0201f800, 0x0010ae10, 0x0401f00a, + 0x42000000, 0x0010bd09, 0x0201f800, 0x0010ae10, + 0x0401f008, 0x42000000, 0x0010bd08, 0x0201f800, + 0x0010ae10, 0x591c0009, 0x80000540, 0x04000004, + 0x59cc2808, 0x0201f000, 0x0010a162, 0x4803c856, + 0x4a02641b, 0x00000009, 0x4a02621b, 0x00002a00, 0x0401f006, 0x4803c856, 0x4a02641b, 0x00000003, - 0x4a02621b, 0x00001700, 0x4a026403, 0x00000037, - 0x0401f0e2, 0x4933c857, 0x0201f800, 0x00105713, - 0x040200e4, 0x0201f800, 0x00101b05, 0x040200e1, - 0x0201f800, 0x00104165, 0x040206d6, 0x0201f800, - 0x001040aa, 0x04000055, 0x59cc0407, 0x4802641a, - 0x59cc1207, 0x480a621a, 0x82080580, 0x0000ffff, - 0x04000005, 0x0201f800, 0x00108cd8, 0x04000043, - 0x0401f00a, 0x59cc1407, 0x42000000, 0x00000001, - 0x0201f800, 0x00109c91, 0x0400003c, 0x831c0580, - 0xffffffff, 0x04000039, 0x59cc0c07, 0x591c0202, - 0x80040580, 0x04020035, 0x0201f800, 0x0010a48d, - 0x04000032, 0x591c0415, 0x8c000516, 0x0402003d, - 0x4d300000, 0x411e6000, 0x0201f800, 0x0010847b, - 0x5c026000, 0x4a023a03, 0x00000007, 0x59cc0c09, - 0x82040d00, 0x0000ff00, 0x840409c0, 0x82040580, - 0x00000001, 0x0400000c, 0x82040580, 0x00000005, - 0x0400000e, 0x82040580, 0x00000007, 0x04020015, - 0x42000000, 0x0010bc0a, 0x0201f800, 0x0010ad1d, - 0x0401f00a, 0x42000000, 0x0010bc09, 0x0201f800, - 0x0010ad1d, 0x0401f008, 0x42000000, 0x0010bc08, - 0x0201f800, 0x0010ad1d, 0x591c0009, 0x80000540, - 0x04000004, 0x59cc2808, 0x0201f000, 0x0010a083, - 0x4803c856, 0x4a02641b, 0x00000009, 0x4a02621b, - 0x00002a00, 0x0401f006, 0x4803c856, 0x4a02641b, - 0x00000003, 0x4a02621b, 0x00000300, 0x4a026403, - 0x0000003b, 0x0401f081, 0x4803c856, 0x4a02641b, - 0x0000000b, 0x4a02621b, 0x00000000, 0x0401f7f8, - 0x4803c856, 0x4a02641b, 0x00000007, 0x4a02621b, - 0x00000000, 0x0401f7f2, 0x4c080000, 0x0201f800, - 0x001040cb, 0x04000026, 0x0201f800, 0x0010408c, - 0x0201f800, 0x0010a1ae, 0x0402001e, 0x59a8021b, - 0x82000540, 0x00000003, 0x4803521b, 0x59a80018, - 0x800000d0, 0x59a8080f, 0x82040d00, 0x000000ff, - 0x80041540, 0x480b500f, 0x42000800, 0x00000003, - 0x0201f800, 0x00106134, 0x497b501d, 0x8d0e1d20, - 0x04000006, 0x4a032804, 0x000007d0, 0x599c0017, - 0x8c00050a, 0x0402000a, 0x0201f800, 0x00020a10, - 0x0201f800, 0x0010e14a, 0x5c001000, 0x1c01f000, - 0x0201f800, 0x0010a1d0, 0x0401f7fc, 0x5c001000, - 0x0201f000, 0x00020a10, 0x0201f800, 0x00101b05, - 0x0402004c, 0x0201f800, 0x0010a1d6, 0x4a026403, - 0x00000047, 0x4a026203, 0x00000001, 0x0201f000, - 0x00105fe8, 0x0201f800, 0x00101b05, 0x04020041, - 0x0201f800, 0x0010a1d6, 0x4a026403, 0x00000047, - 0x4a026203, 0x00000001, 0x0201f000, 0x00105fe8, - 0x0201f800, 0x00101b05, 0x04020036, 0x0201f800, - 0x0010a1d6, 0x0201f000, 0x00020a10, 0x0401f834, - 0x04000030, 0x4a026403, 0x0000004e, 0x4a026203, - 0x00000001, 0x0201f000, 0x00105fe8, 0x4a026403, - 0x0000004f, 0x497a601d, 0x59cc0a06, 0x82040d00, - 0x000000ff, 0x800409c0, 0x04000621, 0x82040580, - 0x00000001, 0x04020005, 0x59cc0808, 0x59a80005, - 0x80040580, 0x0400061a, 0x82040580, 0x00000002, - 0x0402000a, 0x83cc1400, 0x0000000b, 0x4200b000, - 0x00000002, 0x83341c00, 0x00000006, 0x0201f800, - 0x00107d52, 0x0400060e, 0x4a02601d, 0x00000001, - 0x0401f60b, 0x4a026403, 0x00000050, 0x59cc0207, - 0x4802601d, 0x0401f606, 0x4a026203, 0x00000001, - 0x42000800, 0x80000040, 0x0201f000, 0x000209b1, - 0x4803c857, 0x0201f000, 0x00020a10, 0x4d2c0000, - 0x4c500000, 0x4c580000, 0x4c540000, 0x59a8005a, - 0x82000c80, 0x00000841, 0x0402102d, 0x0201f800, - 0x0010055a, 0x0400002a, 0x492e6009, 0x59a8005a, - 0x48025802, 0x82000400, 0x00000003, 0x80000104, - 0x83cca400, 0x00000006, 0x82000c80, 0x0000000a, - 0x04001015, 0x4a025811, 0x0000000a, 0x4200b000, - 0x0000000a, 0x832c0400, 0x00000006, 0x4000a800, - 0x0201f800, 0x0010adef, 0x412c7000, 0x800409c0, - 0x04020003, 0x49787001, 0x0401f00e, 0x0201f800, - 0x0010055a, 0x0400000e, 0x492c7001, 0x40040000, - 0x0401f7ea, 0x48025811, 0x4000b000, 0x832c0400, - 0x00000006, 0x4000a800, 0x0201f800, 0x0010adef, - 0x82000540, 0x00000001, 0x0401f006, 0x497b505a, - 0x59325809, 0x0201f800, 0x00100589, 0x80000580, - 0x5c00a800, 0x5c00b000, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x4d340000, 0x5932680a, 0x59343400, - 0x4933c857, 0x4937c857, 0x481bc857, 0x0201f800, - 0x00104178, 0x5c026800, 0x1c01f000, 0x4933c857, - 0x4c600000, 0x4d3c0000, 0x4d440000, 0x4d340000, - 0x0401f864, 0x0402004e, 0x59cc0207, 0x82000d00, - 0x0000ff00, 0x900411c0, 0x59cc000a, 0x82000500, - 0x00ffffff, 0x80081540, 0x480a601d, 0x8c040d18, - 0x04000019, 0x42003000, 0x00000008, 0x0201f800, - 0x0010a49e, 0x42000000, 0x0010bc1c, 0x0201f800, - 0x0010ad1d, 0x8d0e1d20, 0x04000009, 0x42002800, - 0x00000002, 0x42003000, 0x00000024, 0x42028000, - 0x00000046, 0x0201f800, 0x00109f37, 0x4200c000, - 0x00000001, 0x417a7800, 0x0201f800, 0x00101a8f, - 0x0401f02e, 0x8c040d1a, 0x04000029, 0x59cc000a, - 0x0201f800, 0x0010548f, 0x02000800, 0x00020319, - 0x04020023, 0x5930000a, 0x4c000000, 0x8d0e1d20, - 0x0400000f, 0x59340c03, 0x59341802, 0x820c1d00, - 0x00ffffff, 0x58002403, 0x42002800, 0x00000004, - 0x42003000, 0x00000024, 0x42028000, 0x00000046, - 0x41301000, 0x0201f800, 0x00109f47, 0x4936600a, - 0x42003000, 0x00000009, 0x0201f800, 0x0010a4a6, - 0x42000000, 0x0010bc1c, 0x0201f800, 0x0010ad1d, - 0x417a7800, 0x4178c000, 0x0201f800, 0x00101a8f, - 0x5c000000, 0x4802600a, 0x0401f004, 0x82000540, - 0x00000001, 0x0401f002, 0x80000580, 0x5c026800, - 0x5c028800, 0x5c027800, 0x5c00c000, 0x1c01f000, - 0x4933c857, 0x59cc0206, 0x82000480, 0x00000010, - 0x04021006, 0x4a02621b, 0x00000000, 0x82000540, - 0x00000001, 0x0401f002, 0x80000580, 0x1c01f000, - 0x4933c857, 0x4a02621b, 0x00000000, 0x59cc0407, - 0x82000500, 0x0000ff00, 0x82000580, 0x00000800, - 0x0402000d, 0x59cc0206, 0x59a8085a, 0x80040480, - 0x0400100a, 0x59cc0006, 0x82000500, 0x00ff0000, - 0x82000d80, 0x00140000, 0x04000003, 0x82000d80, - 0x00100000, 0x1c01f000, 0x42000000, 0x0010bc11, - 0x0201f800, 0x0010ad1d, 0x82000540, 0x00000001, - 0x0401f7f9, 0x59300403, 0x82003480, 0x00000057, - 0x02021800, 0x0010032d, 0x83383580, 0x00000013, - 0x04020007, 0x4803c857, 0x4c000000, 0x0201f800, - 0x0010a594, 0x5c000000, 0x0c01f018, 0x4933c857, - 0x493bc857, 0x83383580, 0x00000027, 0x04000005, - 0x83383580, 0x00000014, 0x02020800, 0x0010032d, - 0x493bc857, 0x4937c857, 0x0201f800, 0x0010a591, - 0x0201f800, 0x0010408c, 0x42000800, 0x00000007, - 0x0201f800, 0x00103d8a, 0x0201f800, 0x0010605d, - 0x0201f000, 0x001070b5, 0x00109952, 0x0010995b, - 0x00109952, 0x00109952, 0x00109952, 0x0010995b, - 0x00109966, 0x001099f7, 0x001099b2, 0x001099f7, - 0x001099cd, 0x001099f7, 0x001099d4, 0x001099f7, - 0x001099d9, 0x001099f7, 0x001099d9, 0x001099f7, - 0x001099f7, 0x00109952, 0x00109952, 0x00109952, - 0x00109952, 0x00109952, 0x00109952, 0x00109952, - 0x00109952, 0x00109952, 0x00109952, 0x00109952, - 0x0010995b, 0x00109952, 0x001099f7, 0x00109952, - 0x00109952, 0x001099f7, 0x00109952, 0x001099f7, - 0x001099f7, 0x00109952, 0x00109952, 0x00109952, - 0x00109952, 0x001099f7, 0x001099f7, 0x00109952, - 0x001099f7, 0x001099f7, 0x00109952, 0x00109960, - 0x00109952, 0x00109952, 0x00109952, 0x00109952, - 0x001099dc, 0x001099f7, 0x00109952, 0x00109952, - 0x001099dd, 0x001099f7, 0x00109952, 0x00109952, - 0x00109952, 0x00109952, 0x00109952, 0x00109952, - 0x00109952, 0x00109952, 0x00109952, 0x00109954, - 0x00109952, 0x00109954, 0x00109952, 0x00109952, - 0x00109954, 0x00109952, 0x00109952, 0x00109952, - 0x00109954, 0x00109954, 0x00109954, 0x00109952, - 0x00109952, 0x00109952, 0x00109952, 0x00109952, - 0x00109954, 0x00109952, 0x00109952, 0x00109952, - 0x00109952, 0x00109952, 0x00109952, 0x00109952, - 0x00109952, 0x00109952, 0x0201f800, 0x0010032d, - 0x4d2c0000, 0x59325809, 0x0201f800, 0x00100589, - 0x5c025800, 0x0201f000, 0x00020a10, 0x59a8002a, - 0x48026006, 0x4a026203, 0x00000002, 0x1c01f000, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00103d7f, - 0x5c027800, 0x0401f092, 0x0201f800, 0x00104181, - 0x0400008f, 0x59a8021b, 0x8c000508, 0x04000012, - 0x5932680a, 0x4c580000, 0x4200b000, 0x00000002, - 0x83a81c00, 0x00000002, 0x83341400, 0x00000006, - 0x0201f800, 0x00107d52, 0x80000540, 0x5c00b000, - 0x0402007f, 0x59340200, 0x8400051a, 0x48026a00, - 0x0401f023, 0x599c0017, 0x8c00050a, 0x04020078, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00103d7f, - 0x5c027800, 0x42000800, 0x00000007, 0x0201f800, - 0x00103d8a, 0x59340212, 0x82000500, 0x0000ff00, - 0x04020009, 0x83440d80, 0x000007fe, 0x04020068, - 0x4d300000, 0x02000800, 0x0010dfe9, 0x5c026000, - 0x0401f063, 0x599c0019, 0x8c00050e, 0x04020060, + 0x4a02621b, 0x00000300, 0x4a026403, 0x0000003b, + 0x0401f08b, 0x4803c856, 0x4a02641b, 0x0000000b, + 0x4a02621b, 0x00000000, 0x0401f7f8, 0x4803c856, + 0x4a02641b, 0x00000007, 0x4a02621b, 0x00000000, + 0x0401f7f2, 0x59cc0001, 0x82000580, 0x00fffffe, + 0x04020081, 0x4c080000, 0x0201f800, 0x001040e5, + 0x04000026, 0x0201f800, 0x001040a6, 0x0201f800, + 0x0010a28d, 0x0402001e, 0x59a8021b, 0x82000540, + 0x00000003, 0x4803521b, 0x59a80018, 0x800000d0, + 0x59a8080f, 0x82040d00, 0x000000ff, 0x80041540, + 0x480b500f, 0x42000800, 0x00000003, 0x0201f800, + 0x001061d9, 0x497b501d, 0x8d0e1d20, 0x04000006, + 0x4a032804, 0x000007d0, 0x599c0017, 0x8c00050a, + 0x0402000a, 0x0201f800, 0x00020a10, 0x0201f800, + 0x0010e25a, 0x5c001000, 0x1c01f000, 0x0201f800, + 0x0010a2af, 0x0401f7fc, 0x5c001000, 0x0201f000, + 0x00020a10, 0x0201f800, 0x00101b0a, 0x04020052, + 0x0201f800, 0x0010a2b5, 0x4a026403, 0x00000047, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010608d, + 0x0201f800, 0x00101b0a, 0x04020047, 0x0201f800, + 0x0010a2b5, 0x4a026403, 0x00000047, 0x4a026203, + 0x00000001, 0x0201f000, 0x0010608d, 0x0201f800, + 0x00101b0a, 0x0402003c, 0x0201f800, 0x0010a2b5, + 0x0201f000, 0x00020a10, 0x0401f83a, 0x04000036, + 0x4a026403, 0x0000004e, 0x4a026203, 0x00000001, + 0x0201f000, 0x0010608d, 0x0201f800, 0x00104194, + 0x040205f6, 0x4a026403, 0x0000004f, 0x497a601d, + 0x59cc0a06, 0x82040d00, 0x000000ff, 0x800409c0, + 0x0400061a, 0x82040580, 0x00000001, 0x04020005, + 0x59cc0808, 0x59a80005, 0x80040580, 0x04000613, + 0x82040580, 0x00000002, 0x0402000a, 0x83cc1400, + 0x0000000b, 0x4200b000, 0x00000002, 0x83341c00, + 0x00000006, 0x0201f800, 0x00107df9, 0x04000607, + 0x4a02601d, 0x00000001, 0x0401f604, 0x0201f800, + 0x00104194, 0x040205d5, 0x4a026403, 0x00000050, + 0x59cc0207, 0x4802601d, 0x0401f5fc, 0x4a026203, + 0x00000001, 0x42000800, 0x80000040, 0x0201f000, + 0x000209b1, 0x4803c857, 0x0201f000, 0x00020a10, + 0x4d2c0000, 0x4c500000, 0x4c580000, 0x4c540000, + 0x59a8005a, 0x82000c80, 0x00000841, 0x0402102d, + 0x0201f800, 0x0010055a, 0x0400002a, 0x492e6009, + 0x59a8005a, 0x48025802, 0x82000400, 0x00000003, + 0x80000104, 0x83cca400, 0x00000006, 0x82000c80, + 0x0000000a, 0x04001015, 0x4a025811, 0x0000000a, + 0x4200b000, 0x0000000a, 0x832c0400, 0x00000006, + 0x4000a800, 0x0201f800, 0x0010aee2, 0x412c7000, + 0x800409c0, 0x04020003, 0x49787001, 0x0401f00e, + 0x0201f800, 0x0010055a, 0x0400000e, 0x492c7001, + 0x40040000, 0x0401f7ea, 0x48025811, 0x4000b000, + 0x832c0400, 0x00000006, 0x4000a800, 0x0201f800, + 0x0010aee2, 0x82000540, 0x00000001, 0x0401f006, + 0x497b505a, 0x59325809, 0x0201f800, 0x00100589, + 0x80000580, 0x5c00a800, 0x5c00b000, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x4d340000, 0x5932680a, + 0x59343400, 0x4933c857, 0x4937c857, 0x481bc857, + 0x0201f800, 0x00104194, 0x5c026800, 0x1c01f000, + 0x4933c857, 0x4c600000, 0x4d3c0000, 0x4d440000, + 0x4d340000, 0x0401f864, 0x0402004e, 0x59cc0207, + 0x82000d00, 0x0000ff00, 0x900411c0, 0x59cc000a, + 0x82000500, 0x00ffffff, 0x80081540, 0x480a601d, + 0x8c040d18, 0x04000019, 0x42003000, 0x00000008, + 0x0201f800, 0x0010a591, 0x42000000, 0x0010bd1c, + 0x0201f800, 0x0010ae10, 0x8d0e1d20, 0x04000009, + 0x42002800, 0x00000002, 0x42003000, 0x00000024, + 0x42028000, 0x00000046, 0x0201f800, 0x0010a00e, + 0x4200c000, 0x00000001, 0x417a7800, 0x0201f800, + 0x00101a94, 0x0401f02e, 0x8c040d1a, 0x04000029, + 0x59cc000a, 0x0201f800, 0x001054fb, 0x02000800, + 0x00020319, 0x04020023, 0x5930000a, 0x4c000000, + 0x8d0e1d20, 0x0400000f, 0x59340c03, 0x59341802, + 0x820c1d00, 0x00ffffff, 0x58002403, 0x42002800, + 0x00000004, 0x42003000, 0x00000024, 0x42028000, + 0x00000046, 0x41301000, 0x0201f800, 0x0010a01e, + 0x4936600a, 0x42003000, 0x00000009, 0x0201f800, + 0x0010a599, 0x42000000, 0x0010bd1c, 0x0201f800, + 0x0010ae10, 0x417a7800, 0x4178c000, 0x0201f800, + 0x00101a94, 0x5c000000, 0x4802600a, 0x0401f004, + 0x82000540, 0x00000001, 0x0401f002, 0x80000580, + 0x5c026800, 0x5c028800, 0x5c027800, 0x5c00c000, + 0x1c01f000, 0x4933c857, 0x59cc0206, 0x82000480, + 0x00000010, 0x04021006, 0x4a02621b, 0x00000000, + 0x82000540, 0x00000001, 0x0401f002, 0x80000580, + 0x1c01f000, 0x4933c857, 0x4a02621b, 0x00000000, + 0x59cc0407, 0x82000500, 0x0000ff00, 0x82000580, + 0x00000800, 0x0402000d, 0x59cc0206, 0x59a8085a, + 0x80040480, 0x0400100a, 0x59cc0006, 0x82000500, + 0x00ff0000, 0x82000d80, 0x00140000, 0x04000003, + 0x82000d80, 0x00100000, 0x1c01f000, 0x42000000, + 0x0010bd11, 0x0201f800, 0x0010ae10, 0x82000540, + 0x00000001, 0x0401f7f9, 0x59300403, 0x82003480, + 0x00000057, 0x02021800, 0x0010032d, 0x83383580, + 0x00000013, 0x04020007, 0x4803c857, 0x4c000000, + 0x0201f800, 0x0010a687, 0x5c000000, 0x0c01f018, + 0x4933c857, 0x493bc857, 0x83383580, 0x00000027, + 0x04000005, 0x83383580, 0x00000014, 0x02020800, + 0x0010032d, 0x493bc857, 0x4937c857, 0x0201f800, + 0x0010a684, 0x0201f800, 0x001040a6, 0x42000800, + 0x00000007, 0x0201f800, 0x00103d9d, 0x0201f800, + 0x00106102, 0x0201f000, 0x00107144, 0x00109a1b, + 0x00109a24, 0x00109a1b, 0x00109a1b, 0x00109a1b, + 0x00109a24, 0x00109a2f, 0x00109ac3, 0x00109a7e, + 0x00109ac3, 0x00109a99, 0x00109ac3, 0x00109aa0, + 0x00109ac3, 0x00109aa5, 0x00109ac3, 0x00109aa5, + 0x00109ac3, 0x00109ac3, 0x00109a1b, 0x00109a1b, + 0x00109a1b, 0x00109a1b, 0x00109a1b, 0x00109a1b, + 0x00109a1b, 0x00109a1b, 0x00109a1b, 0x00109a1b, + 0x00109a1b, 0x00109a24, 0x00109a1b, 0x00109ac3, + 0x00109a1b, 0x00109a1b, 0x00109ac3, 0x00109a1b, + 0x00109ac3, 0x00109ac3, 0x00109a1b, 0x00109a1b, + 0x00109a1b, 0x00109a1b, 0x00109ac3, 0x00109ac3, + 0x00109a1b, 0x00109ac3, 0x00109ac3, 0x00109a1b, + 0x00109a29, 0x00109a1b, 0x00109a1b, 0x00109a1b, + 0x00109a1b, 0x00109aa8, 0x00109ac3, 0x00109a1b, + 0x00109a1b, 0x00109aa9, 0x00109ac3, 0x00109a1b, + 0x00109a1b, 0x00109a1b, 0x00109a1b, 0x00109a1b, + 0x00109a1b, 0x00109a1b, 0x00109a1b, 0x00109a1b, + 0x00109a1d, 0x00109a1b, 0x00109a1d, 0x00109a1b, + 0x00109a1b, 0x00109a1d, 0x00109a1b, 0x00109a1b, + 0x00109a1b, 0x00109a1d, 0x00109a1d, 0x00109a1d, + 0x00109a1b, 0x00109a1b, 0x00109a1b, 0x00109a1b, + 0x00109a1b, 0x00109a1d, 0x00109a1b, 0x00109a1b, + 0x00109a1b, 0x00109a1b, 0x00109a1b, 0x00109a1b, + 0x00109a1b, 0x00109a1b, 0x00109a1b, 0x0201f800, + 0x0010032d, 0x4d2c0000, 0x59325809, 0x0201f800, + 0x00100589, 0x5c025800, 0x0201f000, 0x00020a10, + 0x59a8002a, 0x48026006, 0x4a026203, 0x00000002, + 0x1c01f000, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x00103d92, 0x5c027800, 0x0401f095, 0x0201f800, + 0x0010419d, 0x04000092, 0x59a8021b, 0x8c000508, + 0x04000012, 0x5932680a, 0x4c580000, 0x4200b000, + 0x00000002, 0x83a81c00, 0x00000002, 0x83341400, + 0x00000006, 0x0201f800, 0x00107df9, 0x80000540, + 0x5c00b000, 0x04020082, 0x59340200, 0x8400051a, + 0x48026a00, 0x0401f026, 0x599c0017, 0x8c00050a, + 0x0402000a, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x00103d92, 0x5c027800, 0x42000800, 0x00000007, + 0x0201f800, 0x00103d9d, 0x59340212, 0x82000500, + 0x0000ff00, 0x04020009, 0x83440d80, 0x000007fe, + 0x0402006b, 0x4d300000, 0x02000800, 0x0010e0f9, + 0x5c026000, 0x0401f066, 0x599c0017, 0x8c00050a, + 0x04020063, 0x599c0019, 0x8c00050e, 0x04020060, 0x416c0000, 0x82000580, 0x00000002, 0x04020004, 0x59a80016, 0x80000000, 0x48035016, 0x42000800, - 0x00000003, 0x0201f800, 0x00103d8a, 0x4a026407, + 0x00000003, 0x0201f800, 0x00103d9d, 0x4a026407, 0x00000001, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000002, 0x0201f800, 0x00105fe8, 0x4ce80000, - 0x4201d000, 0x00000001, 0x0201f800, 0x001057e8, + 0x00000002, 0x0201f800, 0x0010608d, 0x4ce80000, + 0x4201d000, 0x00000001, 0x0201f800, 0x0010588d, 0x5c01d000, 0x1c01f000, 0x59340200, 0x8400051a, - 0x48026a00, 0x0201f800, 0x00104178, 0x04000040, - 0x0201f800, 0x00105cf8, 0x42000800, 0x00000004, - 0x0201f800, 0x00103d8a, 0x0201f800, 0x0010a4cb, + 0x48026a00, 0x0201f800, 0x00104194, 0x04000040, + 0x0201f800, 0x00105d9d, 0x42000800, 0x00000004, + 0x0201f800, 0x00103d9d, 0x0201f800, 0x0010a5be, 0x04020037, 0x42000800, 0x00000005, 0x0201f800, - 0x00103d8a, 0x4a026407, 0x00000001, 0x4a026203, + 0x00103d9d, 0x4a026407, 0x00000001, 0x4a026203, 0x00000001, 0x4a026403, 0x00000003, 0x0201f000, - 0x00105fe8, 0x0201f800, 0x00104181, 0x04020028, + 0x0010608d, 0x0201f800, 0x0010419d, 0x04020028, 0x42000800, 0x00000006, 0x0401f827, 0x0401f024, - 0x42000800, 0x00000004, 0x0201f800, 0x00103d8a, - 0x0401f791, 0x0201f800, 0x0010408c, 0x0401f01c, + 0x42000800, 0x00000004, 0x0201f800, 0x00103d9d, + 0x0401f78e, 0x0201f800, 0x001040a6, 0x0401f01c, 0x0401f01b, 0x5930081f, 0x4807c857, 0x800409c0, 0x04000017, 0x5804001d, 0x81300580, 0x04020014, 0x4978081d, 0x58041415, 0x8c081516, 0x04000010, @@ -9889,1338 +9935,1349 @@ static const uint32_t isp_2400_risc_code[] = { 0x4d300000, 0x40066000, 0x417a7800, 0x0201f800, 0x00020912, 0x5c026000, 0x0401f001, 0x0201f000, 0x00020a10, 0x4933c857, 0x4807c857, 0x0201f800, - 0x00103d8a, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x00103d7f, 0x5c027800, 0x5934000a, 0x84000520, - 0x4802680a, 0x0201f000, 0x0010408c, 0x59340400, + 0x00103d9d, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x00103d92, 0x5c027800, 0x5934000a, 0x84000520, + 0x4802680a, 0x0201f000, 0x001040a6, 0x59340400, 0x4803c857, 0x80000110, 0x82003480, 0x0000000c, 0x02021800, 0x0010032d, 0x83383580, 0x00000015, 0x04020002, 0x0c01f006, 0x83383580, 0x00000016, - 0x02020800, 0x0010032d, 0x0c01f00d, 0x001078f5, - 0x001078f5, 0x001078f5, 0x001078f5, 0x001078f5, - 0x001078f5, 0x00109a5a, 0x00109a2f, 0x001078f5, - 0x001078f5, 0x001078f5, 0x001078f5, 0x001078f5, - 0x001078f5, 0x001078f5, 0x001078f5, 0x001078f5, - 0x001078f5, 0x00109a5a, 0x00109a61, 0x001078f5, - 0x001078f5, 0x001078f5, 0x001078f5, 0x4933c857, + 0x02020800, 0x0010032d, 0x0c01f00d, 0x00107999, + 0x00107999, 0x00107999, 0x00107999, 0x00107999, + 0x00107999, 0x00109b26, 0x00109afb, 0x00107999, + 0x00107999, 0x00107999, 0x00107999, 0x00107999, + 0x00107999, 0x00107999, 0x00107999, 0x00107999, + 0x00107999, 0x00109b26, 0x00109b2d, 0x00107999, + 0x00107999, 0x00107999, 0x00107999, 0x4933c857, 0x599c0017, 0x8c00050a, 0x0402001b, 0x813669c0, 0x04000019, 0x59340212, 0x82000500, 0x0000ff00, 0x04000015, 0x599c0019, 0x8c00050e, 0x04020012, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00103d7f, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00103d92, 0x5c027800, 0x42000800, 0x00000003, 0x0201f800, - 0x00103d8a, 0x4a026407, 0x00000001, 0x4a026203, + 0x00103d9d, 0x4a026407, 0x00000001, 0x4a026203, 0x00000001, 0x4a026403, 0x00000002, 0x0201f000, - 0x00105fe8, 0x59cc0001, 0x59340802, 0x80040580, + 0x0010608d, 0x59cc0001, 0x59340802, 0x80040580, 0x82000500, 0x00ffffff, 0x02020000, 0x00020a10, - 0x59345002, 0x0201f800, 0x00103aa1, 0x482a6802, + 0x59345002, 0x0201f800, 0x00103ab4, 0x482a6802, 0x0201f000, 0x00020a10, 0x4933c857, 0x59303403, 0x82183580, 0x0000001e, 0x02000000, 0x00020a10, - 0x1c01f000, 0x4933c857, 0x0201f800, 0x00107c6d, + 0x1c01f000, 0x4933c857, 0x0201f800, 0x00107d11, 0x02020000, 0x00020a10, 0x4a026203, 0x00000001, - 0x4a026403, 0x00000001, 0x0201f000, 0x00105fe8, + 0x4a026403, 0x00000001, 0x0201f000, 0x0010608d, 0x493bc857, 0x83380580, 0x00000051, 0x0402000b, - 0x0201f800, 0x0010644d, 0x02020000, 0x00107134, + 0x0201f800, 0x001064f2, 0x02020000, 0x001071c7, 0x59300203, 0x82000580, 0x00000002, 0x0400006e, 0x0201f800, 0x0010032d, 0x83380580, 0x00000027, 0x04000014, 0x83380580, 0x00000048, 0x04000006, 0x83380580, 0x00000014, 0x0400000e, 0x02020800, - 0x0010032d, 0x0201f800, 0x0010644d, 0x02020000, - 0x00107134, 0x59300203, 0x82000580, 0x00000004, + 0x0010032d, 0x0201f800, 0x001064f2, 0x02020000, + 0x001071c7, 0x59300203, 0x82000580, 0x00000004, 0x02000000, 0x00020b01, 0x0201f800, 0x0010032d, 0x4933c857, 0x59300403, 0x82000c80, 0x00000044, 0x02021800, 0x0010032d, 0x82000480, 0x00000040, 0x02001800, 0x0010032d, 0x40027000, 0x4803c857, - 0x0c01f001, 0x00109aa1, 0x00109aa3, 0x00109aa3, - 0x00109abe, 0x0201f800, 0x0010032d, 0x0201f800, - 0x0010605d, 0x59325809, 0x812e59c0, 0x04000016, + 0x0c01f001, 0x00109b6d, 0x00109b6f, 0x00109b6f, + 0x00109b8a, 0x0201f800, 0x0010032d, 0x0201f800, + 0x00106102, 0x59325809, 0x812e59c0, 0x04000016, 0x832c0500, 0x00ff0000, 0x04000013, 0x4a026203, 0x00000002, 0x5932680a, 0x59340200, 0x8c00050e, 0x0402000d, 0x42028000, 0x00000004, 0x0201f800, - 0x00109f21, 0x497a6009, 0x59300006, 0x80000540, + 0x00109ff8, 0x497a6009, 0x59300006, 0x80000540, 0x04020003, 0x59a8002b, 0x48026006, 0x4a026203, - 0x00000007, 0x1c01f000, 0x0201f800, 0x0010605d, - 0x0201f800, 0x0010889a, 0x02000000, 0x001070b5, + 0x00000007, 0x1c01f000, 0x0201f800, 0x00106102, + 0x0201f800, 0x00108953, 0x02000000, 0x00107144, 0x59325809, 0x0201f800, 0x00100580, 0x0201f000, - 0x001070b5, 0x0201f800, 0x0010032d, 0x59325809, + 0x00107144, 0x0201f800, 0x0010032d, 0x59325809, 0x592c040b, 0x8c000502, 0x04000007, 0x4a026203, 0x00000007, 0x42027000, 0x00000043, 0x0201f000, 0x00020a34, 0x4a026203, 0x00000004, 0x1c01f000, - 0x0201f800, 0x0010a147, 0x02000000, 0x00020aff, + 0x0201f800, 0x0010a226, 0x02000000, 0x00020aff, 0x1c01f000, 0x4a026203, 0x00000001, 0x4a026403, 0x00000041, 0x42027800, 0x80002042, 0x0201f000, 0x000209b1, 0x83380580, 0x00000051, 0x04000006, 0x83380580, 0x00000041, 0x02020800, 0x0010032d, 0x1c01f000, 0x0201f800, 0x00020979, 0x0201f800, - 0x0010a18b, 0x0201f000, 0x00020a10, 0x83380480, + 0x0010a26a, 0x0201f000, 0x00020a10, 0x83380480, 0x00000052, 0x02021800, 0x0010032d, 0x83380480, 0x00000049, 0x02001800, 0x0010032d, 0x0c01f001, - 0x00109b07, 0x00109b2e, 0x00109b05, 0x00109b05, - 0x00109b05, 0x00109b05, 0x00109b2e, 0x00109b05, - 0x00109b4f, 0x0201f800, 0x0010032d, 0x59325809, + 0x00109bd3, 0x00109bfd, 0x00109bd1, 0x00109bd1, + 0x00109bd1, 0x00109bd1, 0x00109bfd, 0x00109bd1, + 0x00109c1e, 0x0201f800, 0x0010032d, 0x59325809, 0x592c040b, 0x8c00051e, 0x04000013, 0x82000d00, - 0x000000c0, 0x82040d80, 0x00000080, 0x04000013, - 0x59300804, 0x8c040d18, 0x04020010, 0x59300415, + 0x000000c0, 0x82040d80, 0x00000080, 0x04000016, + 0x59300804, 0x8c040d18, 0x04020013, 0x59300415, 0x8c000516, 0x04000004, 0x4a026203, 0x00000007, - 0x0401f015, 0x42027000, 0x00000041, 0x0201f000, + 0x0401f018, 0x42027000, 0x00000041, 0x0201f000, 0x00020b20, 0x4a026203, 0x00000007, 0x497a6006, - 0x0201f000, 0x00020979, 0x59325809, 0x592c0c0b, - 0x8c040d1a, 0x04020005, 0x0201f800, 0x00020979, - 0x0201f000, 0x00020a10, 0x0201f800, 0x0010a147, - 0x040007fa, 0x1c01f000, 0x0201f800, 0x0010603d, - 0x59325809, 0x5932680a, 0x59340200, 0x8c00050e, - 0x0400000e, 0x592c040b, 0x82000500, 0x000000c0, - 0x82000580, 0x00000080, 0x04000005, 0x592c0010, - 0x59301816, 0x800c1c80, 0x480e6016, 0x4a026203, - 0x00000002, 0x0401f00d, 0x42028000, 0x00000004, - 0x0401fbdd, 0x59300006, 0x80000540, 0x04020004, - 0x59a8002b, 0x800000c2, 0x48026006, 0x497a6009, - 0x4a026203, 0x00000007, 0x1c01f000, 0x4933c857, - 0x0201f800, 0x0010644d, 0x02020800, 0x0010032d, - 0x59300203, 0x82000580, 0x00000002, 0x0400078e, - 0x0201f800, 0x0010032d, 0x4a026203, 0x00000007, - 0x497a6006, 0x0201f000, 0x00020979, 0x4a026203, - 0x00000007, 0x497a6006, 0x0201f000, 0x00020974, - 0x59300415, 0x8c00051c, 0x02020000, 0x00020b11, - 0x59325809, 0x592c2010, 0x40080000, 0x80102480, - 0x59300016, 0x80102400, 0x48126016, 0x0201f000, - 0x00020b11, 0x8c040d0e, 0x0402000a, 0x4a026203, - 0x00000006, 0x0401f823, 0x59300020, 0x80000540, - 0x02020800, 0x00100aa0, 0x0201f000, 0x00020974, - 0x4a026203, 0x00000002, 0x1c01f000, 0x42000800, - 0x00000001, 0x0201f800, 0x00100aa0, 0x82040580, - 0x00000001, 0x02000000, 0x00020b18, 0x0401f7d8, - 0x59300415, 0x8c00051c, 0x04000006, 0x0201f800, - 0x0010086c, 0x02000000, 0x00020b0a, 0x1c01f000, - 0x59300012, 0x80000540, 0x04020005, 0x0201f800, - 0x0010086c, 0x02000000, 0x00020b0a, 0x1c01f000, - 0x492fc857, 0x480bc857, 0x8c08153e, 0x04000006, - 0x80081080, 0x80081000, 0x42000800, 0x00000009, - 0x0401f003, 0x42000800, 0x00000015, 0x480a580c, - 0x1c01f000, 0x83380580, 0x00000013, 0x04000005, - 0x83380580, 0x00000014, 0x02020800, 0x0010032d, - 0x59300415, 0x8c000516, 0x02000800, 0x0010032d, - 0x1c01f000, 0x0201f800, 0x0010032d, 0x59300009, - 0x80000540, 0x02020800, 0x0010032d, 0x1c01f000, - 0x59300415, 0x8c000516, 0x02000800, 0x0010032d, - 0x1c01f000, 0x4a026203, 0x00000004, 0x493a6403, - 0x42000800, 0x80002001, 0x0201f000, 0x000209b1, - 0x4a026203, 0x00000003, 0x493a6403, 0x0201f800, - 0x0002015e, 0x59325809, 0x592c040b, 0x8c00051e, - 0x04000012, 0x82000500, 0x000000c0, 0x82000580, - 0x00000080, 0x04000011, 0x59300415, 0x8c000512, - 0x0402000a, 0x8c000510, 0x04020008, 0x592c040d, - 0x80000540, 0x04020005, 0x82080d40, 0x80003065, - 0x0201f000, 0x000209a3, 0x82080d40, 0x80002065, - 0x0201f000, 0x000209a3, 0x82080d40, 0x80002042, + 0x59300415, 0x8c000516, 0x0402000e, 0x0201f000, + 0x00020979, 0x59325809, 0x592c0c0b, 0x8c040d1a, + 0x04020005, 0x0201f800, 0x00020979, 0x0201f000, + 0x00020a10, 0x0201f800, 0x0010a226, 0x040007fa, + 0x1c01f000, 0x0201f800, 0x001060e2, 0x59325809, + 0x5932680a, 0x59340200, 0x8c00050e, 0x0400000e, + 0x592c040b, 0x82000500, 0x000000c0, 0x82000580, + 0x00000080, 0x04000005, 0x592c0010, 0x59301816, + 0x800c1c80, 0x480e6016, 0x4a026203, 0x00000002, + 0x0401f00d, 0x42028000, 0x00000004, 0x0401fbe5, + 0x59300006, 0x80000540, 0x04020004, 0x59a8002b, + 0x800000c2, 0x48026006, 0x497a6009, 0x4a026203, + 0x00000007, 0x1c01f000, 0x4933c857, 0x0201f800, + 0x001064f2, 0x02020800, 0x0010032d, 0x59300203, + 0x82000580, 0x00000002, 0x0400078b, 0x0201f800, + 0x0010032d, 0x4a026203, 0x00000007, 0x497a6006, + 0x0201f000, 0x00020979, 0x4a026203, 0x00000007, + 0x497a6006, 0x0201f000, 0x00020974, 0x59300415, + 0x8c00051c, 0x02020000, 0x00020b11, 0x59325809, + 0x592c2010, 0x40080000, 0x80102480, 0x59300016, + 0x80102400, 0x48126016, 0x0201f000, 0x00020b11, + 0x8c040d0e, 0x0402000a, 0x4a026203, 0x00000006, + 0x0401f823, 0x59300020, 0x80000540, 0x02020800, + 0x00100aa1, 0x0201f000, 0x00020974, 0x4a026203, + 0x00000002, 0x1c01f000, 0x42000800, 0x00000001, + 0x0201f800, 0x00100aa1, 0x82040580, 0x00000001, + 0x02000000, 0x00020b18, 0x0401f7d8, 0x59300415, + 0x8c00051c, 0x04000006, 0x0201f800, 0x0010086a, + 0x02000000, 0x00020b0a, 0x1c01f000, 0x59300012, + 0x80000540, 0x04020005, 0x0201f800, 0x0010086a, + 0x02000000, 0x00020b0a, 0x1c01f000, 0x492fc857, + 0x480bc857, 0x8c08153e, 0x04000006, 0x80081080, + 0x80081000, 0x42000800, 0x00000009, 0x0401f003, + 0x42000800, 0x00000015, 0x480a580c, 0x1c01f000, + 0x83380580, 0x00000013, 0x04000005, 0x83380580, + 0x00000014, 0x02020800, 0x0010032d, 0x59300415, + 0x8c000516, 0x02000800, 0x0010032d, 0x1c01f000, + 0x0201f800, 0x0010032d, 0x59300009, 0x80000540, + 0x02020800, 0x0010032d, 0x1c01f000, 0x59300415, + 0x8c000516, 0x02000800, 0x0010032d, 0x1c01f000, + 0x4a026203, 0x00000004, 0x493a6403, 0x42000800, + 0x80002001, 0x0201f000, 0x000209b1, 0x4a026203, + 0x00000003, 0x493a6403, 0x0201f800, 0x0002015e, + 0x59325809, 0x592c040b, 0x8c00051e, 0x04000012, + 0x82000500, 0x000000c0, 0x82000580, 0x00000080, + 0x04000011, 0x59300415, 0x8c000512, 0x0402000a, + 0x8c000510, 0x04020008, 0x592c040d, 0x80000540, + 0x04020005, 0x82080d40, 0x80003065, 0x0201f000, + 0x000209a3, 0x82080d40, 0x80002065, 0x0201f000, + 0x000209a3, 0x82080d40, 0x80002042, 0x0201f000, + 0x000209a3, 0x4933c857, 0x493bc857, 0x83380480, + 0x00000044, 0x02021800, 0x0010032d, 0x83380480, + 0x00000041, 0x02001800, 0x0010032d, 0x0c01f001, + 0x00109cc3, 0x00109cd3, 0x00109ce8, 0x59325809, + 0x592c040b, 0x8c00051e, 0x0400001d, 0x82001d00, + 0x000000c0, 0x820c1d80, 0x000000c0, 0x04000018, + 0x4a026203, 0x00000001, 0x493a6403, 0x42000800, + 0x80002042, 0x0201f000, 0x000209b1, 0x59325809, + 0x592c040b, 0x8c00051e, 0x0400000d, 0x82001d00, + 0x000000c0, 0x820c1d80, 0x000000c0, 0x04000008, + 0x4a026203, 0x00000001, 0x493a6403, 0x42000800, + 0x80002001, 0x0201f000, 0x000209b1, 0x497a6009, + 0x497a6006, 0x42028000, 0x00000004, 0x0401f311, + 0x59325809, 0x592c040b, 0x8c00051e, 0x040007f8, + 0x82001d00, 0x000000c0, 0x820c1d80, 0x000000c0, + 0x040007f3, 0x4a026203, 0x00000003, 0x493a6403, + 0x0201f800, 0x0002015e, 0x82080d40, 0x80002065, 0x0201f000, 0x000209a3, 0x4933c857, 0x493bc857, - 0x83380480, 0x00000044, 0x02021800, 0x0010032d, - 0x83380480, 0x00000041, 0x02001800, 0x0010032d, - 0x0c01f001, 0x00109bf4, 0x00109c04, 0x00109c19, - 0x59325809, 0x592c040b, 0x8c00051e, 0x0400001d, - 0x82001d00, 0x000000c0, 0x820c1d80, 0x000000c0, - 0x04000018, 0x4a026203, 0x00000001, 0x493a6403, - 0x42000800, 0x80002042, 0x0201f000, 0x000209b1, - 0x59325809, 0x592c040b, 0x8c00051e, 0x0400000d, - 0x82001d00, 0x000000c0, 0x820c1d80, 0x000000c0, - 0x04000008, 0x4a026203, 0x00000001, 0x493a6403, - 0x42000800, 0x80002001, 0x0201f000, 0x000209b1, - 0x497a6009, 0x497a6006, 0x42028000, 0x00000004, - 0x0401f309, 0x59325809, 0x592c040b, 0x8c00051e, - 0x040007f8, 0x82001d00, 0x000000c0, 0x820c1d80, - 0x000000c0, 0x040007f3, 0x4a026203, 0x00000003, - 0x493a6403, 0x0201f800, 0x0002015e, 0x82080d40, - 0x80002065, 0x0201f000, 0x000209a3, 0x4933c857, - 0x493bc857, 0x83380580, 0x00000085, 0x04000006, - 0x83380580, 0x00000088, 0x0400000a, 0x0201f800, - 0x0010032d, 0x4a026203, 0x00000009, 0x493a6403, - 0x42000800, 0x8000004b, 0x0201f000, 0x000209b1, - 0x83300580, 0x0010f53c, 0x02020800, 0x0010032d, - 0x4d1c0000, 0x813669c0, 0x04000004, 0x0201f800, - 0x0010a141, 0x0402004a, 0x59cc1404, 0x41780000, - 0x0401f849, 0x0400001a, 0x59cc0204, 0x82001580, - 0x0000ffff, 0x04000004, 0x591c1402, 0x80080580, - 0x04020013, 0x591c0407, 0x82000500, 0x0000001f, - 0x82002580, 0x00000006, 0x04000007, 0x82002580, - 0x00000004, 0x04000028, 0x82002580, 0x00000011, - 0x04020007, 0x497a3a05, 0x42002000, 0x00000054, - 0x0201f800, 0x0010720a, 0x0401f02d, 0x8d0e1d20, - 0x04000004, 0x42023800, 0xffffffff, 0x0401f7f7, - 0x813669c0, 0x04020009, 0x59cc0001, 0x0201f800, - 0x0010548f, 0x04020022, 0x0201f800, 0x00103dcb, - 0x0402001f, 0x4936600a, 0x4a026403, 0x00000087, - 0x59cc1204, 0x82081580, 0x0000ffff, 0x04020003, - 0x4a026403, 0x00000086, 0x4d2c0000, 0x0201f800, - 0x0010a4f8, 0x0201f800, 0x00104489, 0x5c025800, - 0x0401f00f, 0x591c0403, 0x82000580, 0x00000038, - 0x040007da, 0x591c0203, 0x82000580, 0x00000007, - 0x040207db, 0x4d300000, 0x411e6000, 0x0201f800, - 0x001070b5, 0x5c026000, 0x0401f7d5, 0x5c023800, - 0x1c01f000, 0x4933c857, 0x480bc857, 0x4c5c0000, - 0x4000b800, 0x42002800, 0x0010f584, 0x41300000, - 0x80140580, 0x0400001c, 0x58140203, 0x82000580, - 0x00000000, 0x04000018, 0x58140202, 0x80080580, - 0x04020015, 0x58141c07, 0x820c0580, 0x00000005, - 0x04000011, 0x8c5cbd00, 0x04000004, 0x820c0580, - 0x00000007, 0x0400000c, 0x820c0580, 0x00000009, - 0x04000031, 0x5930200a, 0x5814000a, 0x800001c0, - 0x0400000b, 0x801021c0, 0x04000003, 0x80100580, - 0x04000012, 0x82142c00, 0x00000024, 0x41540000, - 0x80140480, 0x04021019, 0x0401f7dd, 0x5814001f, - 0x801021c0, 0x04000005, 0x58102002, 0x82102500, - 0x00ffffff, 0x0401f7f2, 0x8c5cbd00, 0x040207f2, - 0x5930201f, 0x0401f7ee, 0x40163800, 0x8c5cbd00, - 0x04000008, 0x4c080000, 0x4c140000, 0x0201f800, - 0x0010a48d, 0x5c002800, 0x5c001000, 0x040007e6, - 0x81300540, 0x0401f00a, 0x8c5cbd00, 0x04000008, - 0x40080800, 0x42023800, 0xffffffff, 0x0201f800, - 0x00104493, 0x040007f7, 0x80000580, 0x5c00b800, - 0x1c01f000, 0x58141808, 0x8c0c1d10, 0x040207d6, - 0x0401f7cd, 0x4933c857, 0x83300580, 0x0010f518, - 0x0402003e, 0x4a026203, 0x00000000, 0x83380580, - 0x00000013, 0x0402002d, 0x59300403, 0x82000580, - 0x00000092, 0x02020800, 0x0010032d, 0x59a80052, - 0x59325809, 0x812e59c0, 0x04000006, 0x812c0580, - 0x02020800, 0x0010032d, 0x592c0000, 0x497a5800, - 0x800001c0, 0x04000005, 0x48035052, 0x0201f800, - 0x0010702d, 0x0401f003, 0x497b5052, 0x497b5053, - 0x812e59c0, 0x04000020, 0x592c0205, 0x82000580, - 0x00000055, 0x02000000, 0x00100580, 0x83380580, - 0x00000013, 0x04020005, 0x4a025a07, 0x00000000, - 0x0201f000, 0x000203ab, 0x4a025a07, 0x00000031, - 0x4a025812, 0x00000004, 0x4a025813, 0x000000ff, - 0x0201f000, 0x000203ab, 0x83380580, 0x00000027, - 0x04000005, 0x83380580, 0x00000014, 0x02020800, - 0x0010032d, 0x493bc857, 0x0201f800, 0x0010605d, - 0x0401f7ca, 0x1c01f000, 0x4933c857, 0x83380580, - 0x00000013, 0x0402000e, 0x59300403, 0x4803c857, - 0x82000c80, 0x00000085, 0x02001800, 0x0010032d, - 0x82000c80, 0x00000093, 0x02021800, 0x0010032d, - 0x82000480, 0x00000085, 0x0c01f019, 0x83380580, - 0x00000027, 0x04000005, 0x83380580, 0x00000014, - 0x02020000, 0x00107134, 0x493bc857, 0x0201f800, - 0x0010605d, 0x59325809, 0x812e59c0, 0x02000000, - 0x001070b5, 0x4a025a07, 0x00000031, 0x4a025812, - 0x00000004, 0x4a025813, 0x000000ff, 0x0201f800, - 0x000203ab, 0x0201f000, 0x001070b5, 0x00109d59, - 0x00109d60, 0x00109d60, 0x00109d59, 0x00109d59, - 0x00109d59, 0x00109d59, 0x00109d59, 0x00109d59, - 0x00109d59, 0x00109d59, 0x00109d59, 0x00109d59, - 0x00109d5b, 0x0201f800, 0x0010032d, 0x59325809, - 0x4a025a07, 0x00000000, 0x0201f800, 0x000203ab, - 0x0201f000, 0x00020a10, 0x4933c857, 0x42000000, - 0x0010bc2d, 0x0201f800, 0x0010ad1d, 0x0201f800, - 0x0010a18b, 0x497a6205, 0x42028000, 0x0000000b, - 0x0401f807, 0x4a026407, 0x00000006, 0x4a026203, - 0x00000007, 0x497a6006, 0x1c01f000, 0x4933c857, - 0x4943c857, 0x59300407, 0x82000580, 0x00000007, - 0x04020002, 0x1c01f000, 0x0201f800, 0x0010610d, - 0x4df00000, 0x0201f800, 0x0010889a, 0x0400000a, - 0x59300809, 0x58040000, 0x80001540, 0x04000006, - 0x49780800, 0x4d2c0000, 0x400a5800, 0x0401f99a, - 0x5c025800, 0x0201f800, 0x001085b6, 0x82000c80, - 0x0000000e, 0x02021800, 0x0010032d, 0x0c01f001, - 0x00109db3, 0x00109db7, 0x00109d9e, 0x00109dc6, - 0x00109dda, 0x00109d9e, 0x00109d9e, 0x00109d9e, - 0x00109d9e, 0x00109d9e, 0x00109d9e, 0x00109d9e, - 0x00109d9e, 0x00109d9e, 0x4d400000, 0x59300020, - 0x80000540, 0x04000005, 0x41400800, 0x0201f800, - 0x00100aa0, 0x40068000, 0x4d2c0000, 0x59325809, - 0x0201f800, 0x0010889a, 0x04020977, 0x4c5c0000, - 0x5930b80a, 0x0201f800, 0x001070b5, 0x485e600a, - 0x5c00b800, 0x5c025800, 0x5c028000, 0x5c03e000, - 0x02000000, 0x001060fa, 0x1c01f000, 0x598c000f, - 0x81300580, 0x04020004, 0x0201f800, 0x00106388, - 0x04020018, 0x0201f800, 0x0010e343, 0x80c40040, - 0x040007de, 0x0201f800, 0x00106018, 0x04000011, - 0x0201f800, 0x0010032d, 0x0201f800, 0x001085a4, - 0x04020004, 0x0201f800, 0x00106351, 0x04020009, - 0x0201f800, 0x0010e1ca, 0x80c40040, 0x040007cf, - 0x0201f800, 0x00106018, 0x02020800, 0x0010032d, - 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, - 0x0010032d, 0x0c01f7b7, 0x0201f800, 0x00100bd4, - 0x0401f7c2, 0x4933c857, 0x4d440000, 0x4d340000, - 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x59cc0007, - 0x4c000000, 0x59cc0001, 0x82000500, 0x00ffffff, - 0x82000d80, 0x00fffffe, 0x5c000000, 0x04020005, - 0x801c0d80, 0x04020053, 0x42000000, 0x00fffffe, - 0x0201f800, 0x0010548f, 0x02000800, 0x00020319, - 0x0402004c, 0x5930000a, 0x4c000000, 0x8d0e1d20, - 0x04000014, 0x81342d80, 0x04000003, 0x42002800, - 0x00000004, 0x58002403, 0x59340c03, 0x59341802, - 0x820c1d00, 0x00ffffff, 0x42003000, 0x00000005, - 0x59cc4008, 0x59cc3809, 0x9c2041c0, 0x9c1c39c0, - 0x42028000, 0x00000046, 0x41301000, 0x0401f93c, - 0x4936600a, 0x83440d80, 0x000007fe, 0x04020014, - 0x42003000, 0x0000001a, 0x0201f800, 0x0010a4ae, - 0x42000000, 0x0010bc1a, 0x0201f800, 0x0010ad1d, - 0x4d3c0000, 0x4d400000, 0x42028000, 0x00000029, - 0x42027800, 0x0000020a, 0x0201f800, 0x0010ded4, - 0x5c028000, 0x5c027800, 0x0401f012, 0x42003000, - 0x0000000b, 0x0201f800, 0x0010a4ae, 0x42000000, - 0x0010bc1a, 0x0201f800, 0x0010ad1d, 0x4d3c0000, - 0x4d400000, 0x42028000, 0x00000029, 0x417a7800, - 0x0201f800, 0x0010df61, 0x5c028000, 0x5c027800, - 0x5c000000, 0x4802600a, 0x59cc0007, 0x83440d80, - 0x000007fe, 0x04020005, 0x42000000, 0x00fffffe, - 0x4a026c00, 0x00000707, 0x48026802, 0x80000580, - 0x5c026800, 0x5c028800, 0x1c01f000, 0x4933c857, - 0x4c040000, 0x59a8005a, 0x82000580, 0x00000074, - 0x04020040, 0x59cc0a08, 0x82040480, 0x00000100, - 0x04001033, 0x59cc0c08, 0x82040500, 0x00008000, - 0x04000035, 0x59a80013, 0x80000540, 0x04020009, - 0x5930100a, 0x58080212, 0x82000500, 0x0000ff00, - 0x04000004, 0x82040500, 0x00000800, 0x0400002a, - 0x59cc0c09, 0x80040840, 0x04001024, 0x59a80a1b, - 0x8c040d06, 0x04000004, 0x59cc0c0f, 0x8c040d1e, - 0x04020012, 0x59cc0a17, 0x800409c0, 0x04020012, - 0x59cc0a18, 0x82040480, 0x00000100, 0x04001014, - 0x59cc0c18, 0x800409c0, 0x0402000e, 0x59cc0c19, - 0x80040840, 0x04001011, 0x59cc0c1a, 0x80040840, - 0x04001011, 0x0401f018, 0x4a02621b, 0x00000100, - 0x0401f012, 0x4a02621b, 0x00000300, 0x0401f00f, - 0x4a02621b, 0x00000500, 0x0401f00c, 0x4a02621b, - 0x00000700, 0x0401f009, 0x4a02621b, 0x00000900, - 0x0401f006, 0x4a02621b, 0x00000f00, 0x0401f003, - 0x4a02621b, 0x00002d00, 0x82000540, 0x00000001, - 0x0401f002, 0x80000580, 0x5c000800, 0x1c01f000, - 0x59cc0407, 0x4803c857, 0x82000580, 0x00000800, - 0x04000003, 0x4a02621b, 0x00000000, 0x1c01f000, - 0x4933c857, 0x4c580000, 0x59cc000c, 0x59340802, - 0x82040d00, 0x00ffffff, 0x80040580, 0x04020012, - 0x83cc1400, 0x00000008, 0x4200b000, 0x00000002, - 0x83341c00, 0x00000006, 0x0201f800, 0x00107d52, - 0x04020009, 0x83cc1400, 0x0000000a, 0x4200b000, + 0x83380580, 0x00000085, 0x04000006, 0x83380580, + 0x00000088, 0x0400000a, 0x0201f800, 0x0010032d, + 0x4a026203, 0x00000009, 0x493a6403, 0x42000800, + 0x8000004b, 0x0201f000, 0x000209b1, 0x83300580, + 0x0010f64c, 0x02020800, 0x0010032d, 0x4d1c0000, + 0x813669c0, 0x04000004, 0x0201f800, 0x0010a220, + 0x0402004a, 0x59cc1404, 0x41780000, 0x0401f849, + 0x0400001a, 0x59cc0204, 0x82001580, 0x0000ffff, + 0x04000004, 0x591c1402, 0x80080580, 0x04020013, + 0x591c0407, 0x82000500, 0x0000001f, 0x82002580, + 0x00000006, 0x04000007, 0x82002580, 0x00000004, + 0x04000028, 0x82002580, 0x00000011, 0x04020007, + 0x497a3a05, 0x42002000, 0x00000054, 0x0201f800, + 0x0010729d, 0x0401f02d, 0x8d0e1d20, 0x04000004, + 0x42023800, 0xffffffff, 0x0401f7f7, 0x813669c0, + 0x04020009, 0x59cc0001, 0x0201f800, 0x001054fb, + 0x04020022, 0x0201f800, 0x00103de1, 0x0402001f, + 0x4936600a, 0x4a026403, 0x00000087, 0x59cc1204, + 0x82081580, 0x0000ffff, 0x04020003, 0x4a026403, + 0x00000086, 0x4d2c0000, 0x0201f800, 0x0010a5eb, + 0x0201f800, 0x001044a8, 0x5c025800, 0x0401f00f, + 0x591c0403, 0x82000580, 0x00000038, 0x040007da, + 0x591c0203, 0x82000580, 0x00000007, 0x040207db, + 0x4d300000, 0x411e6000, 0x0201f800, 0x00107144, + 0x5c026000, 0x0401f7d5, 0x5c023800, 0x1c01f000, + 0x4933c857, 0x480bc857, 0x4c5c0000, 0x4000b800, + 0x42002800, 0x0010f694, 0x41300000, 0x80140580, + 0x0400001f, 0x58140203, 0x82000580, 0x00000000, + 0x0400001b, 0x58140202, 0x80080580, 0x04020018, + 0x58141c07, 0x820c0580, 0x00000005, 0x04000014, + 0x8c5cbd00, 0x04000004, 0x820c0580, 0x00000007, + 0x0400000f, 0x820c0580, 0x00000009, 0x04000039, + 0x5930200a, 0x5814000a, 0x800001c0, 0x0400000e, + 0x82001d80, 0x0010c2b2, 0x0400000b, 0x801021c0, + 0x04000003, 0x80100580, 0x04000012, 0x82142c00, + 0x00000024, 0x41540000, 0x80140480, 0x0402101e, + 0x0401f7da, 0x5814001f, 0x801021c0, 0x04000005, + 0x58102002, 0x82102500, 0x00ffffff, 0x0401f7f2, + 0x8c5cbd00, 0x040207f2, 0x5930201f, 0x0401f7ee, + 0x40163800, 0x8c5cbd00, 0x04000008, 0x4c080000, + 0x4c140000, 0x0201f800, 0x0010a580, 0x5c002800, + 0x5c001000, 0x040007e6, 0x591c000a, 0x800001c0, + 0x04020003, 0x5930000a, 0x4802380a, 0x81300540, + 0x0401f00a, 0x8c5cbd00, 0x04000008, 0x40080800, + 0x42023800, 0xffffffff, 0x0201f800, 0x001044b2, + 0x040007f2, 0x80000580, 0x5c00b800, 0x1c01f000, + 0x58141808, 0x8c0c1d10, 0x040207d1, 0x0401f7c5, + 0x4933c857, 0x83300580, 0x0010f628, 0x0402003e, + 0x4a026203, 0x00000000, 0x83380580, 0x00000013, + 0x0402002d, 0x59300403, 0x82000580, 0x00000092, + 0x02020800, 0x0010032d, 0x59a80052, 0x59325809, + 0x812e59c0, 0x04000006, 0x812c0580, 0x02020800, + 0x0010032d, 0x592c0000, 0x497a5800, 0x800001c0, + 0x04000005, 0x48035052, 0x0201f800, 0x001070bc, + 0x0401f003, 0x497b5052, 0x497b5053, 0x812e59c0, + 0x04000020, 0x592c0205, 0x82000580, 0x00000055, + 0x02000000, 0x00100580, 0x83380580, 0x00000013, + 0x04020005, 0x4a025a07, 0x00000000, 0x0201f000, + 0x000203ab, 0x4a025a07, 0x00000031, 0x4a025812, + 0x00000004, 0x4a025813, 0x000000ff, 0x0201f000, + 0x000203ab, 0x83380580, 0x00000027, 0x04000005, + 0x83380580, 0x00000014, 0x02020800, 0x0010032d, + 0x493bc857, 0x0201f800, 0x00106102, 0x0401f7ca, + 0x1c01f000, 0x4933c857, 0x83380580, 0x00000013, + 0x0402000e, 0x59300403, 0x4803c857, 0x82000c80, + 0x00000085, 0x02001800, 0x0010032d, 0x82000c80, + 0x00000093, 0x02021800, 0x0010032d, 0x82000480, + 0x00000085, 0x0c01f019, 0x83380580, 0x00000027, + 0x04000005, 0x83380580, 0x00000014, 0x02020000, + 0x001071c7, 0x493bc857, 0x0201f800, 0x00106102, + 0x59325809, 0x812e59c0, 0x02000000, 0x00107144, + 0x4a025a07, 0x00000031, 0x4a025812, 0x00000004, + 0x4a025813, 0x000000ff, 0x0201f800, 0x000203ab, + 0x0201f000, 0x00107144, 0x00109e30, 0x00109e37, + 0x00109e37, 0x00109e30, 0x00109e30, 0x00109e30, + 0x00109e30, 0x00109e30, 0x00109e30, 0x00109e30, + 0x00109e30, 0x00109e30, 0x00109e30, 0x00109e32, + 0x0201f800, 0x0010032d, 0x59325809, 0x4a025a07, + 0x00000000, 0x0201f800, 0x000203ab, 0x0201f000, + 0x00020a10, 0x4933c857, 0x42000000, 0x0010bd2d, + 0x0201f800, 0x0010ae10, 0x0201f800, 0x0010a26a, + 0x497a6205, 0x42028000, 0x0000000b, 0x0401f807, + 0x4a026407, 0x00000006, 0x4a026203, 0x00000007, + 0x497a6006, 0x1c01f000, 0x4933c857, 0x4943c857, + 0x59300407, 0x82000580, 0x00000007, 0x04020002, + 0x1c01f000, 0x0201f800, 0x001061b2, 0x4df00000, + 0x0201f800, 0x00108953, 0x0400000a, 0x59300809, + 0x58040000, 0x80001540, 0x04000006, 0x49780800, + 0x4d2c0000, 0x400a5800, 0x0401f99a, 0x5c025800, + 0x0201f800, 0x0010866b, 0x82000c80, 0x0000000e, + 0x02021800, 0x0010032d, 0x0c01f001, 0x00109e8a, + 0x00109e8e, 0x00109e75, 0x00109e9d, 0x00109eb1, + 0x00109e75, 0x00109e75, 0x00109e75, 0x00109e75, + 0x00109e75, 0x00109e75, 0x00109e75, 0x00109e75, + 0x00109e75, 0x4d400000, 0x59300020, 0x80000540, + 0x04000005, 0x41400800, 0x0201f800, 0x00100aa1, + 0x40068000, 0x4d2c0000, 0x59325809, 0x0201f800, + 0x00108953, 0x04020977, 0x4c5c0000, 0x5930b80a, + 0x0201f800, 0x00107144, 0x485e600a, 0x5c00b800, + 0x5c025800, 0x5c028000, 0x5c03e000, 0x02000000, + 0x0010619f, 0x1c01f000, 0x598c000f, 0x81300580, + 0x04020004, 0x0201f800, 0x0010642d, 0x04020018, + 0x0201f800, 0x0010e453, 0x80c40040, 0x040007de, + 0x0201f800, 0x001060bd, 0x04000011, 0x0201f800, + 0x0010032d, 0x0201f800, 0x00108659, 0x04020004, + 0x0201f800, 0x001063f6, 0x04020009, 0x0201f800, + 0x0010e2da, 0x80c40040, 0x040007cf, 0x0201f800, + 0x001060bd, 0x02020800, 0x0010032d, 0x59300203, + 0x82000c80, 0x0000000e, 0x02021800, 0x0010032d, + 0x0c01f7b7, 0x0201f800, 0x00100bd5, 0x0401f7c2, + 0x4933c857, 0x4d440000, 0x4d340000, 0x59cc3800, + 0x821c3d00, 0x00ffffff, 0x59cc0007, 0x4c000000, + 0x59cc0001, 0x82000500, 0x00ffffff, 0x82000d80, + 0x00fffffe, 0x5c000000, 0x04020005, 0x801c0d80, + 0x04020053, 0x42000000, 0x00fffffe, 0x0201f800, + 0x001054fb, 0x02000800, 0x00020319, 0x0402004c, + 0x5930000a, 0x4c000000, 0x8d0e1d20, 0x04000014, + 0x81342d80, 0x04000003, 0x42002800, 0x00000004, + 0x58002403, 0x59340c03, 0x59341802, 0x820c1d00, + 0x00ffffff, 0x42003000, 0x00000005, 0x59cc4008, + 0x59cc3809, 0x9c2041c0, 0x9c1c39c0, 0x42028000, + 0x00000046, 0x41301000, 0x0401f93c, 0x4936600a, + 0x83440d80, 0x000007fe, 0x04020014, 0x42003000, + 0x0000001a, 0x0201f800, 0x0010a5a1, 0x42000000, + 0x0010bd1a, 0x0201f800, 0x0010ae10, 0x4d3c0000, + 0x4d400000, 0x42028000, 0x00000029, 0x42027800, + 0x0000020a, 0x0201f800, 0x0010dfe1, 0x5c028000, + 0x5c027800, 0x0401f012, 0x42003000, 0x0000000b, + 0x0201f800, 0x0010a5a1, 0x42000000, 0x0010bd1a, + 0x0201f800, 0x0010ae10, 0x4d3c0000, 0x4d400000, + 0x42028000, 0x00000029, 0x417a7800, 0x0201f800, + 0x0010e06f, 0x5c028000, 0x5c027800, 0x5c000000, + 0x4802600a, 0x59cc0007, 0x83440d80, 0x000007fe, + 0x04020005, 0x42000000, 0x00fffffe, 0x4a026c00, + 0x00000707, 0x48026802, 0x80000580, 0x5c026800, + 0x5c028800, 0x1c01f000, 0x4933c857, 0x4c040000, + 0x59a8005a, 0x82000580, 0x00000074, 0x04020040, + 0x59cc0a08, 0x82040480, 0x00000100, 0x04001033, + 0x59cc0c08, 0x82040500, 0x00008000, 0x04000035, + 0x59a80013, 0x80000540, 0x04020009, 0x5930100a, + 0x58080212, 0x82000500, 0x0000ff00, 0x04000004, + 0x82040500, 0x00000800, 0x0400002a, 0x59cc0c09, + 0x80040840, 0x04001024, 0x59a80a1b, 0x8c040d06, + 0x04000004, 0x59cc0c0f, 0x8c040d1e, 0x04020012, + 0x59cc0a17, 0x800409c0, 0x04020012, 0x59cc0a18, + 0x82040480, 0x00000100, 0x04001014, 0x59cc0c18, + 0x800409c0, 0x0402000e, 0x59cc0c19, 0x80040840, + 0x04001011, 0x59cc0c1a, 0x80040840, 0x04001011, + 0x0401f018, 0x4a02621b, 0x00000100, 0x0401f012, + 0x4a02621b, 0x00000300, 0x0401f00f, 0x4a02621b, + 0x00000500, 0x0401f00c, 0x4a02621b, 0x00000700, + 0x0401f009, 0x4a02621b, 0x00000900, 0x0401f006, + 0x4a02621b, 0x00000f00, 0x0401f003, 0x4a02621b, + 0x00002d00, 0x82000540, 0x00000001, 0x0401f002, + 0x80000580, 0x5c000800, 0x1c01f000, 0x59cc0407, + 0x4803c857, 0x82000580, 0x00000800, 0x04000003, + 0x4a02621b, 0x00000000, 0x1c01f000, 0x4933c857, + 0x4c580000, 0x59cc000c, 0x59340802, 0x82040d00, + 0x00ffffff, 0x80040580, 0x04020012, 0x83cc1400, + 0x00000008, 0x4200b000, 0x00000002, 0x83341c00, + 0x00000006, 0x0201f800, 0x00107df9, 0x04020009, + 0x83cc1400, 0x0000000a, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000008, 0x0201f800, 0x00107df9, + 0x5c00b000, 0x1c01f000, 0x4933c857, 0x4c580000, + 0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000006, 0x0201f800, 0x00107df9, + 0x0402000c, 0x83cc1400, 0x0000000d, 0x4200b000, 0x00000002, 0x83341c00, 0x00000008, 0x0201f800, - 0x00107d52, 0x5c00b000, 0x1c01f000, 0x4933c857, - 0x4c580000, 0x83cc1400, 0x0000000b, 0x4200b000, - 0x00000002, 0x83341c00, 0x00000006, 0x0201f800, - 0x00107d52, 0x0402000c, 0x83cc1400, 0x0000000d, - 0x4200b000, 0x00000002, 0x83341c00, 0x00000008, - 0x0201f800, 0x00107d52, 0x04000014, 0x4933c856, - 0x4933c856, 0x4933c857, 0x59340009, 0x4803c857, - 0x5934000e, 0x4803c857, 0x59340008, 0x4803c857, - 0x5934000d, 0x4803c857, 0x59340007, 0x4803c857, - 0x5934000c, 0x4803c857, 0x59340006, 0x4803c857, - 0x5934000b, 0x4803c857, 0x5c00b000, 0x1c01f000, - 0x4933c857, 0x813261c0, 0x0400002d, 0x83300d80, - 0x0010f53c, 0x0400002a, 0x8d3e7d06, 0x04020028, - 0x59300c07, 0x82040580, 0x00000001, 0x0400000a, - 0x82040580, 0x00000002, 0x04020021, 0x5930021e, - 0x82000580, 0x00000001, 0x0402001d, 0x59300c17, - 0x0401f002, 0x59300c03, 0x82040580, 0x00000039, - 0x04000004, 0x82040580, 0x00000035, 0x04020014, - 0x4d300000, 0x4d1c0000, 0x5932601f, 0x4933c857, - 0x0201f800, 0x00108ce2, 0x02000800, 0x0010032d, - 0x591c001d, 0x497a381d, 0x591c0c15, 0x84040d02, - 0x48063c15, 0x5c023800, 0x5c026000, 0x81300580, - 0x02020800, 0x0010032d, 0x497a601f, 0x1c01f000, - 0x5c000000, 0x4c000000, 0x4803c857, 0x4d3c0000, - 0x42027800, 0x00000001, 0x0201f800, 0x00103d7f, - 0x5c027800, 0x4c580000, 0x4200b000, 0x00000002, - 0x83a81c00, 0x00000002, 0x83cc1400, 0x0000000b, - 0x0201f800, 0x00107d52, 0x5c00b000, 0x80000540, - 0x1c01f000, 0x492fc857, 0x4943c857, 0x59a8000c, - 0x812c0480, 0x04001011, 0x59a8000a, 0x812c0480, - 0x0402100e, 0x592c0000, 0x80005d40, 0x04000008, - 0x497a5800, 0x49425a07, 0x4c2c0000, 0x0201f800, - 0x000203ab, 0x5c025800, 0x0401f7f7, 0x49425a07, - 0x0201f000, 0x000203ab, 0x1c01f000, 0x42002000, - 0x0000ffff, 0x5930100a, 0x800811c0, 0x04000002, - 0x58082403, 0x41301000, 0x0401f009, 0x40682800, - 0x406c3000, 0x41781000, 0x41442000, 0x0401f004, - 0x41781000, 0x42002000, 0x0000ffff, 0x5c000000, - 0x4c000000, 0x4803c857, 0x480bc857, 0x4813c857, - 0x492fc857, 0x4943c857, 0x4d2c0000, 0x4c040000, - 0x4c080000, 0x4c0c0000, 0x4c100000, 0x4c140000, - 0x4c180000, 0x4c1c0000, 0x4c200000, 0x0201f800, - 0x0010056f, 0x02000800, 0x0010032d, 0x5c004000, - 0x5c003800, 0x5c003000, 0x5c002800, 0x5c002000, - 0x5c001800, 0x5c001000, 0x5c000800, 0x4a025805, - 0x0000010d, 0x800811c0, 0x04000017, 0x83400580, - 0x00000029, 0x04020010, 0x82180580, 0x00000002, - 0x0400000a, 0x82180580, 0x00000003, 0x04000007, - 0x82180580, 0x00000008, 0x04000004, 0x82180580, - 0x00000009, 0x04020004, 0x4a02580a, 0xffffffff, - 0x0401f002, 0x480a580a, 0x58080202, 0x48025c14, - 0x0401f005, 0x4a02580a, 0xffffffff, 0x4a025c14, - 0x0000ffff, 0x83400580, 0x00000046, 0x04000002, - 0x41782800, 0x480e580d, 0x4806580e, 0x4822580f, - 0x481e5810, 0x48165a08, 0x481a5c09, 0x49425a09, - 0x48125a07, 0x82100580, 0x0000ffff, 0x0400000e, - 0x4d440000, 0x4d340000, 0x40128800, 0x0201f800, - 0x00020319, 0x02020800, 0x0010032d, 0x59340002, - 0x82000500, 0x00ffffff, 0x48025813, 0x5c026800, - 0x5c028800, 0x497a5800, 0x497a5c05, 0x0201f800, - 0x0010a3e5, 0x5c025800, 0x1c01f000, 0x5c000000, - 0x4c000000, 0x4803c857, 0x480bc857, 0x480fc857, - 0x4813c857, 0x4817c857, 0x4d2c0000, 0x4c080000, - 0x4c0c0000, 0x4c100000, 0x4c140000, 0x0201f800, + 0x00107df9, 0x04000014, 0x4933c856, 0x4933c856, + 0x4933c857, 0x59340009, 0x4803c857, 0x5934000e, + 0x4803c857, 0x59340008, 0x4803c857, 0x5934000d, + 0x4803c857, 0x59340007, 0x4803c857, 0x5934000c, + 0x4803c857, 0x59340006, 0x4803c857, 0x5934000b, + 0x4803c857, 0x5c00b000, 0x1c01f000, 0x4933c857, + 0x813261c0, 0x0400002d, 0x83300d80, 0x0010f64c, + 0x0400002a, 0x8d3e7d06, 0x04020028, 0x59300c07, + 0x82040580, 0x00000001, 0x0400000a, 0x82040580, + 0x00000002, 0x04020021, 0x5930021e, 0x82000580, + 0x00000001, 0x0402001d, 0x59300c17, 0x0401f002, + 0x59300c03, 0x82040580, 0x00000039, 0x04000004, + 0x82040580, 0x00000035, 0x04020014, 0x4d300000, + 0x4d1c0000, 0x5932601f, 0x4933c857, 0x0201f800, + 0x00108d9b, 0x02000800, 0x0010032d, 0x591c001d, + 0x497a381d, 0x591c0c15, 0x84040d02, 0x48063c15, + 0x5c023800, 0x5c026000, 0x81300580, 0x02020800, + 0x0010032d, 0x497a601f, 0x1c01f000, 0x5c000000, + 0x4c000000, 0x4803c857, 0x4d3c0000, 0x42027800, + 0x00000001, 0x0201f800, 0x00103d92, 0x5c027800, + 0x4c580000, 0x4200b000, 0x00000002, 0x83a81c00, + 0x00000002, 0x83cc1400, 0x0000000b, 0x0201f800, + 0x00107df9, 0x5c00b000, 0x80000540, 0x1c01f000, + 0x492fc857, 0x4943c857, 0x59a8000c, 0x812c0480, + 0x04001011, 0x59a8000a, 0x812c0480, 0x0402100e, + 0x592c0000, 0x80005d40, 0x04000008, 0x497a5800, + 0x49425a07, 0x4c2c0000, 0x0201f800, 0x000203ab, + 0x5c025800, 0x0401f7f7, 0x49425a07, 0x0201f000, + 0x000203ab, 0x1c01f000, 0x42002000, 0x0000ffff, + 0x5930100a, 0x800811c0, 0x04000002, 0x58082403, + 0x41301000, 0x0401f009, 0x40682800, 0x406c3000, + 0x41781000, 0x41442000, 0x0401f004, 0x41781000, + 0x42002000, 0x0000ffff, 0x5c000000, 0x4c000000, + 0x4803c857, 0x480bc857, 0x4813c857, 0x492fc857, + 0x4943c857, 0x4d2c0000, 0x4c040000, 0x4c080000, + 0x4c0c0000, 0x4c100000, 0x4c140000, 0x4c180000, + 0x4c1c0000, 0x4c200000, 0x0201f800, 0x0010056f, + 0x02000800, 0x0010032d, 0x5c004000, 0x5c003800, + 0x5c003000, 0x5c002800, 0x5c002000, 0x5c001800, + 0x5c001000, 0x5c000800, 0x4a025805, 0x0000010d, + 0x800811c0, 0x0400001f, 0x83400580, 0x00000029, + 0x04020018, 0x82180580, 0x00000002, 0x0400000d, + 0x82180580, 0x00000003, 0x0400000a, 0x82180580, + 0x00000008, 0x04000007, 0x82180580, 0x00000006, + 0x04000007, 0x82180580, 0x00000009, 0x04020009, + 0x4a02580a, 0xffffffff, 0x0401f007, 0x5808280a, + 0x58140002, 0x82000500, 0x00ffffff, 0x48025813, + 0x480a580a, 0x58080202, 0x48025c14, 0x0401f005, + 0x4a02580a, 0xffffffff, 0x4a025c14, 0x0000ffff, + 0x83400580, 0x00000046, 0x04000002, 0x41782800, + 0x480e580d, 0x4806580e, 0x4822580f, 0x481e5810, + 0x48165a08, 0x481a5c09, 0x49425a09, 0x48125a07, + 0x82100580, 0x0000ffff, 0x0400000e, 0x4d440000, + 0x4d340000, 0x40128800, 0x0201f800, 0x00020319, + 0x02020800, 0x0010032d, 0x59340002, 0x82000500, + 0x00ffffff, 0x48025813, 0x5c026800, 0x5c028800, + 0x497a5800, 0x497a5c05, 0x0201f800, 0x0010a4d8, + 0x5c025800, 0x1c01f000, 0x5c000000, 0x4c000000, + 0x4803c857, 0x480bc857, 0x480fc857, 0x4813c857, + 0x4817c857, 0x4d2c0000, 0x4c080000, 0x4c0c0000, + 0x4c100000, 0x4c140000, 0x0201f800, 0x0010056f, + 0x02000800, 0x0010032d, 0x5c002800, 0x5c002000, + 0x5c001800, 0x5c001000, 0x04011000, 0x832c0400, + 0x00000005, 0x4803c840, 0x4a03c842, 0x00000010, + 0x40000000, 0x040117ff, 0x4a025805, 0x0000010d, + 0x4a025a09, 0x00000049, 0x480a5a0b, 0x480e5c0b, + 0x48125a0c, 0x48165c0c, 0x82080580, 0x00008014, + 0x04020064, 0x820c0580, 0x0000ffff, 0x04020061, + 0x82100580, 0x00000006, 0x0402005e, 0x59a8000f, + 0x0201f800, 0x00104755, 0x04000009, 0x82000d00, + 0x00ffff00, 0x04020006, 0x82000c00, 0x00101b0f, + 0x50040800, 0x80040910, 0x48065a0d, 0x82000d00, + 0x0000ffff, 0x48065c0d, 0x80000120, 0x48025a0e, + 0x59a8021b, 0x82001500, 0x00002100, 0x480a5a0f, + 0x8c000502, 0x0400001f, 0x8c000506, 0x04000009, + 0x82000d00, 0x0000000a, 0x82040d80, 0x0000000a, + 0x04020004, 0x4a025c0e, 0x00000001, 0x0401f022, + 0x8c00050a, 0x04000009, 0x82000d00, 0x00000022, + 0x82040d80, 0x00000022, 0x04020004, 0x4a025c0e, + 0x00000003, 0x0401f018, 0x8c000508, 0x04000009, + 0x82000d00, 0x00000012, 0x82040d80, 0x00000012, + 0x04020004, 0x4a025c0e, 0x00000002, 0x0401f00e, + 0x0201f800, 0x00104755, 0x04020004, 0x4a025c0e, + 0x00000004, 0x0401f008, 0x8c000506, 0x04000004, + 0x4a025c0e, 0x00000005, 0x0401f003, 0x4a025c0e, + 0x00000000, 0x59a8002a, 0x48025c0f, 0x59a8002b, + 0x48025a10, 0x59c40801, 0x82040d00, 0x00018000, + 0x82040580, 0x00000000, 0x04020004, 0x4a025c10, + 0x00000000, 0x0401f00f, 0x82040580, 0x00008000, + 0x04020004, 0x4a025c10, 0x00000001, 0x0401f009, + 0x82040580, 0x00010000, 0x04020004, 0x4a025c10, + 0x00000003, 0x0401f003, 0x4a025c10, 0x00000004, + 0x0401fbcc, 0x5c025800, 0x1c01f000, 0x0401f807, + 0x42018800, 0x00000001, 0x04000003, 0x42018800, + 0x00000000, 0x1c01f000, 0x5930080a, 0x800409c0, + 0x04000004, 0x58040403, 0x81440580, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fd, 0x4933c857, + 0x4c040000, 0x59300403, 0x82000d80, 0x0000001e, + 0x04020016, 0x800000d0, 0x59300a17, 0x82040d00, + 0x000000ff, 0x80040540, 0x4803c857, 0x48026417, + 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, + 0x4a026407, 0x00000005, 0x4a02621e, 0x00000004, + 0x59a8002b, 0x48026006, 0x42000800, 0x8000004b, + 0x0201f800, 0x000209b1, 0x5c000800, 0x1c01f000, + 0x4933c857, 0x40000000, 0x40000000, 0x1c01f000, + 0x59300415, 0x4933c857, 0x4803c857, 0x8c000518, + 0x04000009, 0x8c000512, 0x02020000, 0x00108b7b, + 0x0401f922, 0x0201f800, 0x00020979, 0x0201f800, + 0x00020a10, 0x1c01f000, 0x591c0407, 0x4803c857, + 0x82000c80, 0x00000009, 0x0402100b, 0x0c01f001, + 0x0010a15d, 0x0010a15d, 0x0010a15d, 0x0010a15f, + 0x0010a15d, 0x0010a15f, 0x0010a15f, 0x0010a15d, + 0x0010a15f, 0x80000580, 0x1c01f000, 0x82000540, + 0x00000001, 0x1c01f000, 0x591c0407, 0x82000500, + 0x0000001f, 0x82000580, 0x00000006, 0x0400000e, + 0x4803c857, 0x4a026403, 0x0000003b, 0x4a02641b, + 0x00000009, 0x4a02621b, 0x00002a00, 0x4a026203, + 0x00000001, 0x42000800, 0x80000040, 0x0201f000, + 0x000209b1, 0x4803c856, 0x4c040000, 0x4c140000, + 0x4d300000, 0x411e6000, 0x0401f8f0, 0x497a6205, + 0x59300415, 0x4803c857, 0x82000500, 0xffffadff, + 0x48026415, 0x497a6405, 0x5c026000, 0x0201f800, 0x0010056f, 0x02000800, 0x0010032d, 0x5c002800, - 0x5c002000, 0x5c001800, 0x5c001000, 0x04011000, - 0x832c0400, 0x00000005, 0x4803c840, 0x4a03c842, - 0x00000010, 0x40000000, 0x040117ff, 0x4a025805, - 0x0000010d, 0x4a025a09, 0x00000049, 0x480a5a0b, - 0x480e5c0b, 0x48125a0c, 0x48165c0c, 0x82080580, - 0x00008014, 0x04020064, 0x820c0580, 0x0000ffff, - 0x04020061, 0x82100580, 0x00000006, 0x0402005e, - 0x59a8000f, 0x0201f800, 0x00104716, 0x04000009, - 0x82000d00, 0x00ffff00, 0x04020006, 0x82000c00, - 0x00101b0a, 0x50040800, 0x80040910, 0x48065a0d, - 0x82000d00, 0x0000ffff, 0x48065c0d, 0x80000120, - 0x48025a0e, 0x59a8021b, 0x82001500, 0x00002100, - 0x480a5a0f, 0x8c000502, 0x0400001f, 0x8c000506, - 0x04000009, 0x82000d00, 0x0000000a, 0x82040d80, - 0x0000000a, 0x04020004, 0x4a025c0e, 0x00000001, - 0x0401f022, 0x8c00050a, 0x04000009, 0x82000d00, - 0x00000022, 0x82040d80, 0x00000022, 0x04020004, - 0x4a025c0e, 0x00000003, 0x0401f018, 0x8c000508, - 0x04000009, 0x82000d00, 0x00000012, 0x82040d80, - 0x00000012, 0x04020004, 0x4a025c0e, 0x00000002, - 0x0401f00e, 0x0201f800, 0x00104716, 0x04020004, - 0x4a025c0e, 0x00000004, 0x0401f008, 0x8c000506, - 0x04000004, 0x4a025c0e, 0x00000005, 0x0401f003, - 0x4a025c0e, 0x00000000, 0x59a8002a, 0x48025c0f, - 0x59a8002b, 0x48025a10, 0x59c40801, 0x82040d00, - 0x00018000, 0x82040580, 0x00000000, 0x04020004, - 0x4a025c10, 0x00000000, 0x0401f00f, 0x82040580, - 0x00008000, 0x04020004, 0x4a025c10, 0x00000001, - 0x0401f009, 0x82040580, 0x00010000, 0x04020004, - 0x4a025c10, 0x00000003, 0x0401f003, 0x4a025c10, - 0x00000004, 0x0401fbb8, 0x5c025800, 0x1c01f000, - 0x0401f807, 0x42018800, 0x00000001, 0x04000003, - 0x42018800, 0x00000000, 0x1c01f000, 0x5930080a, - 0x800409c0, 0x04000004, 0x58040403, 0x81440580, - 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fd, - 0x4933c857, 0x4c040000, 0x59300403, 0x82000d80, - 0x0000001e, 0x04020016, 0x800000d0, 0x59300a17, - 0x82040d00, 0x000000ff, 0x80040540, 0x4803c857, - 0x48026417, 0x4a026403, 0x00000085, 0x4a026203, - 0x00000009, 0x4a026407, 0x00000005, 0x4a02621e, - 0x00000004, 0x59a8002b, 0x48026006, 0x42000800, - 0x8000004b, 0x0201f800, 0x000209b1, 0x5c000800, - 0x1c01f000, 0x4933c857, 0x40000000, 0x40000000, - 0x1c01f000, 0x59300415, 0x4933c857, 0x4803c857, - 0x8c000518, 0x04000009, 0x8c000512, 0x02020000, - 0x00108ac2, 0x0401f922, 0x0201f800, 0x00020979, - 0x0201f800, 0x00020a10, 0x1c01f000, 0x591c0407, - 0x4803c857, 0x82000c80, 0x00000009, 0x0402100b, - 0x0c01f001, 0x0010a07e, 0x0010a07e, 0x0010a07e, - 0x0010a080, 0x0010a07e, 0x0010a080, 0x0010a080, - 0x0010a07e, 0x0010a080, 0x80000580, 0x1c01f000, - 0x82000540, 0x00000001, 0x1c01f000, 0x591c0407, - 0x82000500, 0x0000001f, 0x82000580, 0x00000006, - 0x0400000e, 0x4803c857, 0x4a026403, 0x0000003b, - 0x4a02641b, 0x00000009, 0x4a02621b, 0x00002a00, - 0x4a026203, 0x00000001, 0x42000800, 0x80000040, - 0x0201f000, 0x000209b1, 0x4803c856, 0x4c040000, - 0x4c140000, 0x4d300000, 0x411e6000, 0x0401f8f0, - 0x497a6205, 0x59300415, 0x4803c857, 0x82000500, - 0xffffadff, 0x48026415, 0x497a6405, 0x5c026000, - 0x0201f800, 0x0010056f, 0x02000800, 0x0010032d, - 0x5c002800, 0x5c000800, 0x4a025805, 0x0000010d, - 0x497a5800, 0x497a5c05, 0x4a025a09, 0x00000045, - 0x491e580a, 0x59300402, 0x48025c08, 0x5930041a, - 0x48025c0c, 0x591c0415, 0x84000556, 0x48023c15, - 0x591c180a, 0x580c0403, 0x48025a07, 0x580c0002, - 0x82000500, 0x00ffffff, 0x48025813, 0x59cc0404, - 0x48025c14, 0x497a5a08, 0x4816580b, 0x48065a0c, - 0x0401fb21, 0x493a6403, 0x4d400000, 0x42028000, - 0x00000045, 0x591c0202, 0x4c000000, 0x4d300000, - 0x411e6000, 0x0401fca6, 0x5c026000, 0x5c000000, - 0x48023a02, 0x5c028000, 0x491e601f, 0x4932381d, - 0x4a023c07, 0x00000006, 0x4a023a03, 0x00000007, - 0x497a3806, 0x497a3a05, 0x1c01f000, 0x4933c857, - 0x83380580, 0x00000013, 0x0402000b, 0x59300403, - 0x4803c857, 0x82000d80, 0x00000085, 0x0400002b, - 0x82000d80, 0x0000008b, 0x04000028, 0x0201f800, - 0x0010032d, 0x83380580, 0x00000027, 0x0402000c, - 0x0201f800, 0x0010605d, 0x4d2c0000, 0x4d400000, - 0x59325809, 0x42028000, 0x00000004, 0x0401fe2e, - 0x5c028000, 0x5c025800, 0x1c01f000, 0x83380580, - 0x00000014, 0x040007f3, 0x83380580, 0x00000089, - 0x04000005, 0x83380580, 0x0000008a, 0x02020000, - 0x00107134, 0x0201f800, 0x0010644d, 0x02020000, - 0x00107134, 0x59300a03, 0x82040580, 0x0000000a, - 0x04000009, 0x82040580, 0x0000000c, 0x04000006, - 0x0201f800, 0x0010032d, 0x4a026203, 0x0000000a, - 0x1c01f000, 0x83380480, 0x00000093, 0x0402100c, - 0x83380480, 0x00000085, 0x04001009, 0x83380580, - 0x00000089, 0x0400000a, 0x83380580, 0x0000008a, - 0x04000022, 0x0201f800, 0x0010032d, 0x493bc857, - 0x4933c857, 0x0201f000, 0x00107134, 0x4933c857, - 0x4c340000, 0x41306800, 0x0201f800, 0x001070f5, - 0x04000011, 0x4a026203, 0x00000001, 0x4a026403, - 0x0000001e, 0x59cc0c07, 0x4806641a, 0x59cc0a07, - 0x4806621a, 0x5834080a, 0x4806600a, 0x4a026407, - 0x00000004, 0x42000800, 0x80000040, 0x0201f800, - 0x000209b1, 0x40366000, 0x0201f800, 0x00020a10, - 0x5c006800, 0x1c01f000, 0x4933c857, 0x0201f000, - 0x00020a10, 0x5930080a, 0x58040200, 0x8c00051a, - 0x02020800, 0x001003f4, 0x1c01f000, 0x0201f800, - 0x001040b0, 0x0400001e, 0x4a026203, 0x00000002, - 0x59300415, 0x84000558, 0x48026415, 0x8c000512, - 0x04000004, 0x59a8002c, 0x48026205, 0x0401f007, - 0x59a8082c, 0x59a8002a, 0x80040400, 0x82000400, - 0x0000001e, 0x48026205, 0x5930000a, 0x82000c00, - 0x00000011, 0x50040000, 0x80000540, 0x04000004, - 0x82000c00, 0x00000000, 0x0401f7fb, 0x45300800, - 0x497a6000, 0x82000540, 0x00000001, 0x1c01f000, - 0x82100500, 0xfffffeef, 0x0402001c, 0x4d2c0000, - 0x4937c857, 0x59340811, 0x83341400, 0x00000011, - 0x800409c0, 0x0400000e, 0x40040000, 0x81300580, - 0x04000005, 0x82041400, 0x00000000, 0x58040800, - 0x0401f7f8, 0x59300800, 0x497a6000, 0x44041000, - 0x0201f800, 0x00020979, 0x0401f002, 0x4933c857, - 0x5c025800, 0x492e6009, 0x0201f800, 0x00020979, - 0x0201f000, 0x00020a10, 0x492fc857, 0x4a025a07, - 0x00000006, 0x0201f000, 0x000203ab, 0x4c340000, - 0x5930000a, 0x800001c0, 0x04000011, 0x82006c00, - 0x00000011, 0x50340000, 0x80000540, 0x0400000a, - 0x81300580, 0x04000005, 0x50340000, 0x82006c00, - 0x00000000, 0x0401f7f8, 0x59300000, 0x44006800, - 0x497a6000, 0x5c006800, 0x1c01f000, 0x59300c07, - 0x82040580, 0x00000005, 0x040007fb, 0x82040580, - 0x00000011, 0x040007f8, 0x82040580, 0x00000006, - 0x040007f5, 0x82040580, 0x00000001, 0x040007f2, - 0x0201f800, 0x0010032d, 0x4933c857, 0x4c080000, - 0x4c0c0000, 0x4c580000, 0x59a81018, 0x59cc1807, - 0x820c1d00, 0x00ffffff, 0x800c0110, 0x80083580, - 0x04020014, 0x83cc1400, 0x00000008, 0x4200b000, - 0x00000002, 0x5930000a, 0x82001c00, 0x00000006, - 0x0201f800, 0x00107d52, 0x0402000a, 0x83cc1400, - 0x0000000a, 0x4200b000, 0x00000002, 0x5930000a, - 0x82001c00, 0x00000008, 0x0201f800, 0x00107d52, - 0x5c00b000, 0x5c001800, 0x5c001000, 0x1c01f000, - 0x4933c856, 0x493a6403, 0x0201f800, 0x00103a06, - 0x0201f000, 0x0010e14a, 0x493bc857, 0x4d2c0000, - 0x0201f800, 0x0010056f, 0x02000800, 0x0010032d, - 0x832cac00, 0x00000006, 0x4c580000, 0x4c540000, - 0x4200b000, 0x00000006, 0x4578a800, 0x8054a800, - 0x8058b040, 0x040207fd, 0x83380580, 0x00000046, - 0x04020004, 0x4a025805, 0x00000144, 0x0401f008, - 0x4a025805, 0x00000146, 0x83380580, 0x00000041, - 0x04000003, 0x4a025a07, 0x00000001, 0x59cc0007, - 0x82000500, 0xff000000, 0x80000110, 0x59cc1008, - 0x82081500, 0xff000000, 0x80081540, 0x480a580b, - 0x83380580, 0x00000046, 0x04020006, 0x59cc0007, - 0x82000500, 0x00ffffff, 0x4802580c, 0x0401f005, - 0x59cc0008, 0x82000500, 0x00ffffff, 0x4802580c, - 0x83380580, 0x00000046, 0x04020004, 0x83cc1400, - 0x00000009, 0x0401f003, 0x83cc1400, 0x0000000d, - 0x50080000, 0x9c0001c0, 0x4802580d, 0x80081000, - 0x50080000, 0x9c0001c0, 0x4802580e, 0x83380580, - 0x00000046, 0x04020008, 0x59cc000b, 0x9c0001c0, - 0x4802580f, 0x59cc000c, 0x9c0001c0, 0x48025810, - 0x0401f007, 0x59cc000f, 0x9c0001c0, 0x4802580f, - 0x59cc0010, 0x9c0001c0, 0x48025810, 0x83380580, - 0x00000046, 0x04020004, 0x83cc1400, 0x00000011, - 0x0401f003, 0x83cc1400, 0x00000015, 0x412c3000, - 0x82183400, 0x00000011, 0x4200b000, 0x00000004, - 0x50080000, 0x9c0001c0, 0x44003000, 0x80081000, - 0x80183000, 0x8058b040, 0x040207fa, 0x5c00a800, - 0x5c00b000, 0x0201f800, 0x000203ab, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x492fc857, 0x5930080a, - 0x58040200, 0x8c00051e, 0x04000004, 0x592c0209, - 0x84000558, 0x48025a09, 0x1c01f000, 0x59e0180f, - 0x599c0413, 0x800c1000, 0x80080580, 0x04020002, - 0x41781000, 0x59e00010, 0x59e00810, 0x80040d80, - 0x040207fd, 0x80080580, 0x0400000b, 0x4c080000, - 0x599c0814, 0x599c1015, 0x800c00cc, 0x80040c00, - 0x82081440, 0x00000000, 0x5c001800, 0x82000540, - 0x00000001, 0x4803c857, 0x1c01f000, 0x59300203, - 0x4933c857, 0x4937c857, 0x493bc857, 0x4803c857, - 0x82003480, 0x0000000e, 0x02021800, 0x0010032d, - 0x0c01f001, 0x0010a27b, 0x0010a392, 0x0010a27b, - 0x0010a27b, 0x0010a27b, 0x0010a27b, 0x0010a27b, - 0x0010a2f5, 0x0010a27d, 0x0010a27b, 0x0010a27b, - 0x0010a27b, 0x0010a27b, 0x0010a27b, 0x0201f800, - 0x0010032d, 0x83380580, 0x0000004c, 0x02020800, - 0x0010032d, 0x0201f800, 0x001040cb, 0x04020021, - 0x59a80a1b, 0x82040500, 0x00000009, 0x82000580, - 0x00000008, 0x0400001b, 0x8c040d12, 0x04000032, - 0x59cc0806, 0x82040d00, 0xff000000, 0x82040580, - 0x03000000, 0x04000020, 0x82040580, 0x50000000, - 0x04000005, 0x82040580, 0x52000000, 0x02020000, - 0x00020a10, 0x813669c0, 0x04000007, 0x497a601f, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010df61, - 0x5c027800, 0x4a026403, 0x00000001, 0x0401f014, - 0x59cc0806, 0x82040d00, 0xff000000, 0x82040580, - 0x03000000, 0x04000008, 0x82040580, 0x50000000, - 0x04000005, 0x82040580, 0x52000000, 0x02020000, - 0x00020a10, 0x4a026403, 0x00000009, 0x4a02641b, - 0x00000009, 0x4a02621b, 0x00000000, 0x4a026407, - 0x00000004, 0x4a026203, 0x00000001, 0x0201f000, - 0x00105fe8, 0x8d0e1d20, 0x04000020, 0x59cc0806, - 0x4807c857, 0x82040d00, 0xff000000, 0x82040580, - 0x03000000, 0x04000013, 0x82040580, 0x20000000, - 0x04000010, 0x82040580, 0x21000000, 0x0400000d, - 0x82040580, 0x24000000, 0x0400000a, 0x82040580, - 0x50000000, 0x04000007, 0x82040580, 0x52000000, - 0x04000004, 0x82040580, 0x05000000, 0x0402000a, - 0x9c0431c0, 0x42028000, 0x00000046, 0x42002800, - 0x00000001, 0x0401fc5a, 0x0401f913, 0x02000800, - 0x0010032d, 0x42002000, 0x00000051, 0x0201f800, - 0x0010720a, 0x59cc0000, 0x82000500, 0x00ffffff, - 0x82000580, 0x00ffffff, 0x04000005, 0x4a026203, - 0x00000007, 0x493a6403, 0x1c01f000, 0x59325818, - 0x812e59c0, 0x02020800, 0x00100589, 0x0201f000, - 0x00020a10, 0x4d2c0000, 0x4c580000, 0x4c500000, - 0x4c540000, 0x41385000, 0x83380580, 0x00000054, - 0x02020800, 0x0010032d, 0x59325809, 0x592c0c0c, - 0x82040d00, 0x0000e000, 0x82040580, 0x00002000, - 0x04020078, 0x59300818, 0x800409c0, 0x04000016, - 0x58041405, 0x41cca800, 0x8204a400, 0x00000006, - 0x82080480, 0x00000010, 0x04021005, 0x4008b000, - 0x0201f800, 0x0010adef, 0x0401f00b, 0x40001000, - 0x4200b000, 0x0000000f, 0x0201f800, 0x0010adef, - 0x58040801, 0x800409c0, 0x040207f0, 0x0201f800, - 0x0010032d, 0x813669c0, 0x0400005e, 0x59344c00, - 0x592c0c0a, 0x4807c857, 0x4827c857, 0x82040d00, - 0x000000ff, 0x82040580, 0x00000003, 0x0400002a, - 0x82040580, 0x00000005, 0x04000032, 0x82040580, - 0x00000020, 0x04000036, 0x82040580, 0x00000052, - 0x04000042, 0x82040580, 0x00000050, 0x04000042, - 0x82040580, 0x00000021, 0x04000004, 0x82040580, - 0x00000024, 0x04020043, 0x82240500, 0x0000ff00, - 0x82000580, 0x00000700, 0x04000008, 0x42000800, - 0x00000009, 0x0201f800, 0x00103d8a, 0x42005000, - 0x0000000c, 0x0401f037, 0x4a025a07, 0x00000031, - 0x4a02580e, 0x00000009, 0x59340400, 0x4802580f, - 0x0201f800, 0x000203ab, 0x0201f800, 0x001070b5, - 0x0401f03d, 0x0201f800, 0x00103aa1, 0x0201f800, - 0x00103e68, 0x42000800, 0x00000003, 0x0201f800, - 0x00103d8a, 0x42005000, 0x00000008, 0x0401f021, - 0x59cc0007, 0x0201f800, 0x001056f0, 0x0402001d, - 0x0201f800, 0x00103aa1, 0x0401f01a, 0x82240500, - 0x0000ff00, 0x82000580, 0x00000700, 0x040007df, - 0x82240500, 0x000000ff, 0x82000580, 0x00000009, - 0x040007da, 0x0201f800, 0x00103ecf, 0x42005000, - 0x0000000a, 0x0401f00b, 0x42005000, 0x0000000e, - 0x0401f003, 0x42005000, 0x00000010, 0x82240500, - 0x0000ff00, 0x82000580, 0x00000700, 0x040007cb, - 0x482a6403, 0x4a026203, 0x00000001, 0x592c000e, - 0x48026012, 0x497a6014, 0x59a8002b, 0x48026006, - 0x417a7800, 0x0201f800, 0x00105fe8, 0x59325818, - 0x812e59c0, 0x04000004, 0x0201f800, 0x00100589, - 0x497a6018, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x5c025800, 0x1c01f000, 0x4d2c0000, 0x59325809, - 0x83380580, 0x00000013, 0x0402002a, 0x492fc857, - 0x59300c03, 0x82040580, 0x00000054, 0x0400001e, - 0x82040580, 0x00000010, 0x04000018, 0x82040580, - 0x0000000e, 0x04000015, 0x82040580, 0x00000008, - 0x0400000d, 0x82040580, 0x0000000c, 0x0400000a, - 0x82040580, 0x0000000a, 0x02020800, 0x0010032d, - 0x42000800, 0x00000006, 0x0201f800, 0x00103d8a, - 0x0401f009, 0x42000800, 0x00000004, 0x0201f800, - 0x00103d8a, 0x0401f004, 0x59340200, 0x8400051a, - 0x48026a00, 0x4a025a07, 0x00000000, 0x0201f800, - 0x000203ab, 0x0201f800, 0x00020a10, 0x0401f024, - 0x83380580, 0x00000027, 0x0400000f, 0x83380580, - 0x00000014, 0x02020800, 0x0010032d, 0x492fc857, - 0x0201f800, 0x0010605d, 0x42028000, 0x00000031, - 0x42000800, 0x00000004, 0x42001000, 0x000000ff, - 0x0401f00a, 0x492fc857, 0x0201f800, 0x0010605d, - 0x42028000, 0x00000031, 0x42000800, 0x00000004, - 0x42001000, 0x00000010, 0x49425a07, 0x4806580e, - 0x480a580f, 0x0201f800, 0x000203ab, 0x0201f800, - 0x001043c3, 0x0201f800, 0x001070b5, 0x5c025800, - 0x1c01f000, 0x492fc857, 0x42007000, 0x00020b54, - 0x58380806, 0x492c7006, 0x800409c0, 0x04020004, - 0x492c7007, 0x0201f000, 0x00020026, 0x492c0800, - 0x1c01f000, 0x4d2c0000, 0x4c580000, 0x4c500000, - 0x4c540000, 0x4933c857, 0x4937c857, 0x59cc0806, - 0x4807c857, 0x82040d00, 0xff000000, 0x82040580, - 0x03000000, 0x0400000d, 0x82040580, 0x05000000, - 0x0400000a, 0x82040580, 0x21000000, 0x04000032, - 0x82040580, 0x24000000, 0x0400002f, 0x82040580, - 0x20000000, 0x04020031, 0x0201f800, 0x0010056f, - 0x0400002e, 0x492fc857, 0x492e6018, 0x59a8b05a, - 0x8258b400, 0x0000001b, 0x8258b500, 0xfffffffc, - 0x8058b104, 0x485a5c05, 0x412c7800, 0x41cca000, - 0x82580480, 0x00000010, 0x04021006, 0x832cac00, - 0x00000006, 0x0201f800, 0x0010adef, 0x0401f016, - 0x40580800, 0x4200b000, 0x0000000f, 0x832cac00, - 0x00000006, 0x0201f800, 0x0010adef, 0x8204b480, - 0x0000000f, 0x0201f800, 0x0010056f, 0x04000004, - 0x492c7801, 0x412c7800, 0x0401f7ea, 0x59325818, - 0x0201f800, 0x00100589, 0x497a6018, 0x80000580, - 0x0401f006, 0x59340200, 0x84000554, 0x48026a00, - 0x82000540, 0x00000001, 0x5c00a800, 0x5c00a000, - 0x5c00b000, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x492fc857, 0x4d2c0000, 0x59300a03, 0x82040580, - 0x00000007, 0x04000037, 0x82040580, 0x00000001, - 0x02020800, 0x0010032d, 0x0201f800, 0x0010610d, - 0x4df00000, 0x598c000f, 0x81300580, 0x04020016, + 0x5c000800, 0x4a025805, 0x0000010d, 0x497a5800, + 0x497a5c05, 0x4a025a09, 0x00000045, 0x491e580a, + 0x59300402, 0x48025c08, 0x5930041a, 0x48025c0c, + 0x591c0415, 0x84000556, 0x48023c15, 0x591c180a, + 0x580c0403, 0x48025a07, 0x580c0002, 0x82000500, + 0x00ffffff, 0x48025813, 0x59cc0404, 0x48025c14, + 0x497a5a08, 0x4816580b, 0x48065a0c, 0x0401fb35, + 0x493a6403, 0x4d400000, 0x42028000, 0x00000045, + 0x591c0202, 0x4c000000, 0x4d300000, 0x411e6000, + 0x0401fc9e, 0x5c026000, 0x5c000000, 0x48023a02, + 0x5c028000, 0x491e601f, 0x4932381d, 0x4a023c07, + 0x00000006, 0x4a023a03, 0x00000007, 0x497a3806, + 0x497a3a05, 0x1c01f000, 0x4933c857, 0x83380580, + 0x00000013, 0x0402000b, 0x59300403, 0x4803c857, + 0x82000d80, 0x00000085, 0x0400002b, 0x82000d80, + 0x0000008b, 0x04000028, 0x0201f800, 0x0010032d, + 0x83380580, 0x00000027, 0x0402000c, 0x0201f800, + 0x00106102, 0x4d2c0000, 0x4d400000, 0x59325809, + 0x42028000, 0x00000004, 0x0401fe26, 0x5c028000, + 0x5c025800, 0x1c01f000, 0x83380580, 0x00000014, + 0x040007f3, 0x83380580, 0x00000089, 0x04000005, + 0x83380580, 0x0000008a, 0x02020000, 0x001071c7, + 0x0201f800, 0x001064f2, 0x02020000, 0x001071c7, + 0x59300a03, 0x82040580, 0x0000000a, 0x04000009, + 0x82040580, 0x0000000c, 0x04000006, 0x0201f800, + 0x0010032d, 0x4a026203, 0x0000000a, 0x1c01f000, + 0x83380480, 0x00000093, 0x0402100c, 0x83380480, + 0x00000085, 0x04001009, 0x83380580, 0x00000089, + 0x0400000a, 0x83380580, 0x0000008a, 0x04000022, + 0x0201f800, 0x0010032d, 0x493bc857, 0x4933c857, + 0x0201f000, 0x001071c7, 0x4933c857, 0x4c340000, + 0x41306800, 0x0201f800, 0x00107188, 0x04000011, + 0x4a026203, 0x00000001, 0x4a026403, 0x0000001e, + 0x59cc0c07, 0x4806641a, 0x59cc0a07, 0x4806621a, + 0x5834080a, 0x4806600a, 0x4a026407, 0x00000004, + 0x42000800, 0x80000040, 0x0201f800, 0x000209b1, + 0x40366000, 0x0201f800, 0x00020a10, 0x5c006800, + 0x1c01f000, 0x4933c857, 0x0201f000, 0x00020a10, + 0x5930080a, 0x58040200, 0x8c00051a, 0x02020800, + 0x001003f4, 0x1c01f000, 0x0201f800, 0x001040ca, + 0x0400001e, 0x4a026203, 0x00000002, 0x59300415, + 0x84000558, 0x48026415, 0x8c000512, 0x04000004, + 0x59a8002c, 0x48026205, 0x0401f007, 0x59a8082c, + 0x59a8002a, 0x80040400, 0x82000400, 0x0000001e, + 0x48026205, 0x5930000a, 0x82000c00, 0x00000011, + 0x50040000, 0x80000540, 0x04000004, 0x82000c00, + 0x00000000, 0x0401f7fb, 0x45300800, 0x497a6000, + 0x82000540, 0x00000001, 0x1c01f000, 0x82100500, + 0xfffffeef, 0x0402001c, 0x4d2c0000, 0x4937c857, + 0x59340811, 0x83341400, 0x00000011, 0x800409c0, + 0x0400000e, 0x40040000, 0x81300580, 0x04000005, + 0x82041400, 0x00000000, 0x58040800, 0x0401f7f8, + 0x59300800, 0x497a6000, 0x44041000, 0x0201f800, + 0x00020979, 0x0401f002, 0x4933c857, 0x5c025800, + 0x492e6009, 0x0201f800, 0x00020979, 0x0201f000, + 0x00020a10, 0x492fc857, 0x4a025a07, 0x00000006, + 0x0201f000, 0x000203ab, 0x4c340000, 0x5930000a, + 0x800001c0, 0x04000011, 0x82006c00, 0x00000011, + 0x50340000, 0x80000540, 0x0400000a, 0x81300580, + 0x04000005, 0x50340000, 0x82006c00, 0x00000000, + 0x0401f7f8, 0x59300000, 0x44006800, 0x497a6000, + 0x5c006800, 0x1c01f000, 0x59300c07, 0x82040580, + 0x00000005, 0x040007fb, 0x82040580, 0x00000011, + 0x040007f8, 0x82040580, 0x00000006, 0x040007f5, + 0x82040580, 0x00000001, 0x040007f2, 0x0201f800, + 0x0010032d, 0x4933c857, 0x4c080000, 0x4c0c0000, + 0x4c580000, 0x59a81018, 0x59cc1807, 0x820c1d00, + 0x00ffffff, 0x800c0110, 0x80083580, 0x04020014, + 0x83cc1400, 0x00000008, 0x4200b000, 0x00000002, + 0x5930000a, 0x82001c00, 0x00000006, 0x0201f800, + 0x00107df9, 0x0402000a, 0x83cc1400, 0x0000000a, + 0x4200b000, 0x00000002, 0x5930000a, 0x82001c00, + 0x00000008, 0x0201f800, 0x00107df9, 0x5c00b000, + 0x5c001800, 0x5c001000, 0x1c01f000, 0x4933c856, + 0x493a6403, 0x0201f800, 0x00103a19, 0x0201f000, + 0x0010e25a, 0x493bc857, 0x4d2c0000, 0x0201f800, + 0x0010056f, 0x02000800, 0x0010032d, 0x832cac00, + 0x00000006, 0x4c580000, 0x4c540000, 0x4200b000, + 0x00000006, 0x4578a800, 0x8054a800, 0x8058b040, + 0x040207fd, 0x83380580, 0x00000046, 0x04020004, + 0x4a025805, 0x00000144, 0x0401f008, 0x4a025805, + 0x00000146, 0x83380580, 0x00000041, 0x04000003, + 0x4a025a07, 0x00000001, 0x59cc0007, 0x82000500, + 0xff000000, 0x80000110, 0x59cc1008, 0x82081500, + 0xff000000, 0x80081540, 0x480a580b, 0x83380580, + 0x00000046, 0x04020006, 0x59cc0007, 0x82000500, + 0x00ffffff, 0x4802580c, 0x0401f005, 0x59cc0008, + 0x82000500, 0x00ffffff, 0x4802580c, 0x83380580, + 0x00000046, 0x04020004, 0x83cc1400, 0x00000009, + 0x0401f003, 0x83cc1400, 0x0000000d, 0x50080000, + 0x9c0001c0, 0x4802580d, 0x80081000, 0x50080000, + 0x9c0001c0, 0x4802580e, 0x83380580, 0x00000046, + 0x04020008, 0x59cc000b, 0x9c0001c0, 0x4802580f, + 0x59cc000c, 0x9c0001c0, 0x48025810, 0x0401f007, + 0x59cc000f, 0x9c0001c0, 0x4802580f, 0x59cc0010, + 0x9c0001c0, 0x48025810, 0x83380580, 0x00000046, + 0x04020004, 0x83cc1400, 0x00000011, 0x0401f003, + 0x83cc1400, 0x00000015, 0x412c3000, 0x82183400, + 0x00000011, 0x4200b000, 0x00000004, 0x50080000, + 0x9c0001c0, 0x44003000, 0x80081000, 0x80183000, + 0x8058b040, 0x040207fa, 0x5c00a800, 0x5c00b000, + 0x0201f800, 0x000203ab, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x492fc857, 0x5930080a, 0x58040200, + 0x8c00051e, 0x04000004, 0x592c0209, 0x84000558, + 0x48025a09, 0x1c01f000, 0x59e0180f, 0x599c0413, + 0x800c1000, 0x80080580, 0x04020002, 0x41781000, + 0x59e00010, 0x59e00810, 0x80040d80, 0x040207fd, + 0x80080580, 0x0400000b, 0x4c080000, 0x599c0814, + 0x599c1015, 0x800c00cc, 0x80040c00, 0x82081440, + 0x00000000, 0x5c001800, 0x82000540, 0x00000001, + 0x4803c857, 0x1c01f000, 0x59300203, 0x4933c857, + 0x4937c857, 0x493bc857, 0x4803c857, 0x82003480, + 0x0000000e, 0x02021800, 0x0010032d, 0x0c01f001, + 0x0010a35a, 0x0010a473, 0x0010a35a, 0x0010a35a, + 0x0010a35a, 0x0010a35a, 0x0010a35a, 0x0010a3d7, + 0x0010a35c, 0x0010a35a, 0x0010a35a, 0x0010a35a, + 0x0010a35a, 0x0010a35a, 0x0201f800, 0x0010032d, + 0x83380580, 0x0000004c, 0x02020800, 0x0010032d, + 0x0201f800, 0x001040e5, 0x04020021, 0x59a80a1b, + 0x82040500, 0x00000009, 0x82000580, 0x00000008, + 0x0400001b, 0x8c040d12, 0x04000032, 0x59cc0806, + 0x82040d00, 0xff000000, 0x82040580, 0x03000000, + 0x04000020, 0x82040580, 0x50000000, 0x04000005, + 0x82040580, 0x52000000, 0x02020000, 0x00020a10, + 0x83340580, 0x0010c2b2, 0x04000006, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010e06f, 0x5c027800, + 0x4a026403, 0x00000001, 0x0401f014, 0x59cc0806, + 0x82040d00, 0xff000000, 0x82040580, 0x03000000, + 0x04000008, 0x82040580, 0x50000000, 0x04000005, + 0x82040580, 0x52000000, 0x02020000, 0x00020a10, + 0x4a026403, 0x00000009, 0x4a02641b, 0x00000009, + 0x4a02621b, 0x00000000, 0x4a026407, 0x00000004, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010608d, + 0x8d0e1d20, 0x04000023, 0x0201f800, 0x0010af31, + 0x04020020, 0x59cc0806, 0x4807c857, 0x82040d00, + 0xff000000, 0x82040580, 0x03000000, 0x04000013, + 0x82040580, 0x20000000, 0x04000010, 0x82040580, + 0x21000000, 0x0400000d, 0x82040580, 0x24000000, + 0x0400000a, 0x82040580, 0x50000000, 0x04000007, + 0x82040580, 0x52000000, 0x04000004, 0x82040580, + 0x05000000, 0x0402000a, 0x9c0431c0, 0x42028000, + 0x00000046, 0x42002800, 0x00000001, 0x0401fc4f, + 0x0401f924, 0x02000800, 0x0010032d, 0x42002000, + 0x00000051, 0x0201f800, 0x0010729d, 0x59cc0000, + 0x82000500, 0x00ffffff, 0x82000580, 0x00ffffff, + 0x04000005, 0x4a026203, 0x00000007, 0x493a6403, + 0x1c01f000, 0x59325818, 0x812e59c0, 0x02020800, + 0x00100589, 0x0201f000, 0x00020a10, 0x4d2c0000, + 0x4c580000, 0x4c500000, 0x4c540000, 0x41385000, + 0x83380580, 0x00000054, 0x02020800, 0x0010032d, + 0x59325809, 0x592c0c0c, 0x82040d00, 0x0000e000, + 0x82040580, 0x00002000, 0x04020077, 0x59300818, + 0x800409c0, 0x04000016, 0x58041405, 0x41cca800, + 0x8204a400, 0x00000006, 0x82080480, 0x00000010, + 0x04021005, 0x4008b000, 0x0201f800, 0x0010aee2, + 0x0401f00b, 0x40001000, 0x4200b000, 0x0000000f, + 0x0201f800, 0x0010aee2, 0x58040801, 0x800409c0, + 0x040207f0, 0x0201f800, 0x0010032d, 0x83340580, + 0x0010c2b2, 0x0400005c, 0x59344c00, 0x592c0c0a, + 0x4807c857, 0x4827c857, 0x82040d00, 0x000000ff, + 0x82040580, 0x00000003, 0x0400002a, 0x82040580, + 0x00000005, 0x04000030, 0x82040580, 0x00000020, + 0x04000034, 0x82040580, 0x00000052, 0x04000040, + 0x82040580, 0x00000050, 0x04000040, 0x82040580, + 0x00000021, 0x04000004, 0x82040580, 0x00000024, + 0x04020041, 0x82240500, 0x0000ff00, 0x82000580, + 0x00000700, 0x04000008, 0x42000800, 0x00000009, + 0x0201f800, 0x00103d9d, 0x42005000, 0x0000000c, + 0x0401f035, 0x4a025a07, 0x00000031, 0x4a02580e, + 0x00000009, 0x59340400, 0x4802580f, 0x0201f800, + 0x000203ab, 0x0201f800, 0x00107144, 0x0401f03b, + 0x0201f800, 0x00103e7e, 0x42000800, 0x00000003, + 0x0201f800, 0x00103d9d, 0x42005000, 0x00000008, + 0x0401f021, 0x59cc0007, 0x0201f800, 0x0010575c, + 0x0402001d, 0x4a026c00, 0x00000707, 0x0401f01a, + 0x82240500, 0x0000ff00, 0x82000580, 0x00000700, + 0x040007e1, 0x82240500, 0x000000ff, 0x82000580, + 0x00000009, 0x040007dc, 0x0201f800, 0x00103ee9, + 0x42005000, 0x0000000a, 0x0401f00b, 0x42005000, + 0x0000000e, 0x0401f003, 0x42005000, 0x00000010, + 0x82240500, 0x0000ff00, 0x82000580, 0x00000700, + 0x040007cd, 0x482a6403, 0x4a026203, 0x00000001, + 0x592c000e, 0x48026012, 0x497a6014, 0x59a8002b, + 0x48026006, 0x417a7800, 0x0201f800, 0x0010608d, + 0x59325818, 0x812e59c0, 0x04000004, 0x0201f800, + 0x00100589, 0x497a6018, 0x5c00a800, 0x5c00a000, + 0x5c00b000, 0x5c025800, 0x1c01f000, 0x4d2c0000, + 0x59325809, 0x83380580, 0x00000013, 0x0402003c, + 0x492fc857, 0x59300c03, 0x82040580, 0x00000054, + 0x04000030, 0x82040580, 0x00000010, 0x0400002a, + 0x82040580, 0x0000000e, 0x04000027, 0x59341400, + 0x82081d00, 0x0000ff00, 0x82081500, 0x000000ff, + 0x82040580, 0x00000008, 0x04000013, 0x82040580, + 0x0000000c, 0x04000013, 0x82040580, 0x0000000a, + 0x02020800, 0x0010032d, 0x820c0580, 0x00000700, + 0x04000018, 0x82080580, 0x00000009, 0x04000015, + 0x42000800, 0x00000006, 0x0201f800, 0x00103d9d, + 0x0401f010, 0x42000000, 0x00000003, 0x0401f003, + 0x42000000, 0x00000009, 0x80080580, 0x04020009, + 0x42000800, 0x00000004, 0x0201f800, 0x00103d9d, + 0x0401f004, 0x59340200, 0x8400051a, 0x48026a00, + 0x4a025a07, 0x00000000, 0x0201f800, 0x000203ab, + 0x0201f800, 0x00020a10, 0x0401f024, 0x83380580, + 0x00000027, 0x0400000f, 0x83380580, 0x00000014, + 0x02020800, 0x0010032d, 0x492fc857, 0x0201f800, + 0x00106102, 0x42028000, 0x00000031, 0x42000800, + 0x00000004, 0x42001000, 0x000000ff, 0x0401f00a, + 0x492fc857, 0x0201f800, 0x00106102, 0x42028000, + 0x00000031, 0x42000800, 0x00000004, 0x42001000, + 0x00000010, 0x49425a07, 0x4806580e, 0x480a580f, + 0x0201f800, 0x000203ab, 0x0201f800, 0x001043e2, + 0x0201f800, 0x00107144, 0x5c025800, 0x1c01f000, + 0x492fc857, 0x42007000, 0x00020b54, 0x58380806, + 0x492c7006, 0x800409c0, 0x04020004, 0x492c7007, + 0x0201f000, 0x00020026, 0x492c0800, 0x1c01f000, + 0x4d2c0000, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4933c857, 0x4937c857, 0x59cc0806, 0x4807c857, + 0x82040d00, 0xff000000, 0x82040580, 0x03000000, + 0x0400000d, 0x82040580, 0x05000000, 0x0400000a, + 0x82040580, 0x21000000, 0x04000032, 0x82040580, + 0x24000000, 0x0400002f, 0x82040580, 0x20000000, + 0x04020031, 0x0201f800, 0x0010056f, 0x0400002e, + 0x492fc857, 0x492e6018, 0x59a8b05a, 0x8258b400, + 0x0000001b, 0x8258b500, 0xfffffffc, 0x8058b104, + 0x485a5c05, 0x412c7800, 0x41cca000, 0x82580480, + 0x00000010, 0x04021006, 0x832cac00, 0x00000006, + 0x0201f800, 0x0010aee2, 0x0401f016, 0x40580800, + 0x4200b000, 0x0000000f, 0x832cac00, 0x00000006, + 0x0201f800, 0x0010aee2, 0x8204b480, 0x0000000f, + 0x0201f800, 0x0010056f, 0x04000004, 0x492c7801, + 0x412c7800, 0x0401f7ea, 0x59325818, 0x0201f800, + 0x00100589, 0x497a6018, 0x80000580, 0x0401f006, + 0x59340200, 0x84000554, 0x48026a00, 0x82000540, + 0x00000001, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x492fc857, + 0x4d2c0000, 0x59300a03, 0x82040580, 0x00000007, + 0x04000037, 0x82040580, 0x00000001, 0x02020800, + 0x0010032d, 0x0201f800, 0x001061b2, 0x4df00000, + 0x598c000f, 0x81300580, 0x04020016, 0x59300004, + 0x8c000520, 0x04000004, 0x84000520, 0x48026004, + 0x0401f016, 0x42001000, 0x0010bc55, 0x50081000, + 0x58080002, 0x82000580, 0x00000100, 0x04000006, + 0x5808000b, 0x81300580, 0x02020800, 0x0010032d, + 0x0401f00a, 0x0201f800, 0x0010642d, 0x04020021, 0x59300004, 0x8c000520, 0x04000004, 0x84000520, - 0x48026004, 0x0401f016, 0x42001000, 0x0010bb55, - 0x50081000, 0x58080002, 0x82000580, 0x00000100, - 0x04000006, 0x5808000b, 0x81300580, 0x02020800, - 0x0010032d, 0x0401f00a, 0x0201f800, 0x00106388, - 0x04020021, 0x59300004, 0x8c000520, 0x04000004, - 0x84000520, 0x48026004, 0x0401f004, 0x0201f800, - 0x0010e343, 0x80c40040, 0x5c03e000, 0x02000800, - 0x001060fa, 0x0201f800, 0x0010889a, 0x02000800, - 0x0010032d, 0x59325809, 0x4a025a07, 0x00000005, - 0x0201f800, 0x000203ab, 0x0201f800, 0x001043c3, - 0x59325818, 0x812e59c0, 0x02020800, 0x00100589, - 0x0201f800, 0x001070b5, 0x80000580, 0x5c025800, - 0x1c01f000, 0x5c03e000, 0x02000800, 0x001060fa, - 0x59300c07, 0x82040580, 0x00000011, 0x040007b7, - 0x0401f7f7, 0x4c040000, 0x59340200, 0x4803c857, - 0x8c00051c, 0x04000009, 0x59cc0805, 0x591c001a, - 0x4803c857, 0x80040580, 0x04000004, 0x80000580, - 0x4803c856, 0x0401f003, 0x82000540, 0x00000001, - 0x5c000800, 0x1c01f000, 0x4c000000, 0x4c0c0000, - 0x4c100000, 0x42001800, 0x0000ffff, 0x42002000, - 0x00000004, 0x0401f013, 0x4c000000, 0x4c0c0000, - 0x4c100000, 0x5930200a, 0x58101c03, 0x42002000, - 0x00000004, 0x0401f00b, 0x4c000000, 0x4c0c0000, - 0x4c100000, 0x5930200a, 0x801021c0, 0x02000800, - 0x0010032d, 0x58101c03, 0x42002000, 0x00000007, - 0x480fc857, 0x4813c857, 0x481bc857, 0x0201f800, - 0x00103260, 0x5c002000, 0x5c001800, 0x5c000000, - 0x1c01f000, 0x8d0e1d20, 0x04000008, 0x4d400000, - 0x850e1d44, 0x42028000, 0x0000002a, 0x0201f800, - 0x00109f44, 0x5c028000, 0x1c01f000, 0x59a8021b, - 0x8c000508, 0x04000005, 0x599c0017, 0x8c00050a, - 0x04020002, 0x1c01f000, 0x82000540, 0x00000001, - 0x1c01f000, 0x59300421, 0x84000540, 0x48026421, - 0x1c01f000, 0x4c640000, 0x0201f800, 0x00108cab, - 0x59300203, 0x82000580, 0x00000008, 0x04020015, - 0x4200c800, 0x00000032, 0x42000000, 0x20000000, - 0x41300800, 0x0201f800, 0x00100899, 0x0400000d, - 0x59300203, 0x82000580, 0x00000008, 0x04020009, - 0x42000000, 0x0000001e, 0x80000040, 0x040207ff, - 0x8064c840, 0x040207f1, 0x0201f800, 0x0010032d, - 0x0201f800, 0x00108cc3, 0x5c00c800, 0x1c01f000, - 0x0201f800, 0x0010056f, 0x02000800, 0x0010032d, - 0x59340403, 0x49365803, 0x4a025a05, 0x00000055, - 0x48025c07, 0x4a025c08, 0x00001000, 0x59340802, - 0x82040d00, 0x00ffffff, 0x59300403, 0x82000580, - 0x00000086, 0x42000000, 0x85000000, 0x04020003, - 0x42000000, 0x84000000, 0x80040540, 0x4802580a, - 0x59a8000f, 0x4802580b, 0x42000000, 0x00990000, - 0x59300c07, 0x82040d80, 0x00000005, 0x04000002, - 0x8400052e, 0x4802580c, 0x497a580d, 0x59cc0004, - 0x4802580e, 0x497a580f, 0x42000800, 0x00030300, - 0x59300403, 0x82000580, 0x00000086, 0x04020006, - 0x59cc0004, 0x48025811, 0x4a025812, 0x0000ffff, - 0x41780800, 0x48065810, 0x1c01f000, 0x492fc857, - 0x59a82852, 0x801429c0, 0x0400005f, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x4d2c0000, 0x4d300000, - 0x42026000, 0x0010f518, 0x592c0c07, 0x592c100a, - 0x82081500, 0x00ffffff, 0x592c180b, 0x592c200e, - 0x40165800, 0x4014c000, 0x4014c800, 0x592c0205, - 0x82000580, 0x00000155, 0x0402003e, 0x592c0407, - 0x80040580, 0x0402003b, 0x592c000a, 0x82000500, - 0x00ffffff, 0x80080580, 0x04020036, 0x592c000b, - 0x82000500, 0x00ffffff, 0x800c0580, 0x04020031, - 0x592c000e, 0x80100580, 0x0402002e, 0x4c040000, - 0x4c080000, 0x4c0c0000, 0x4c100000, 0x40640000, - 0x812c0580, 0x0402001b, 0x59300203, 0x82000580, - 0x00000000, 0x04000013, 0x59300009, 0x800001c0, - 0x04000010, 0x0201f800, 0x0010610d, 0x4df00000, - 0x0201f800, 0x00105ff7, 0x0201f800, 0x0010e2ad, - 0x80c40040, 0x04020003, 0x4a026203, 0x00000000, - 0x5c03e000, 0x02000800, 0x001060fa, 0x497a6009, - 0x592cc800, 0x4064c000, 0x4064b800, 0x0401f003, - 0x592cb800, 0x485cc000, 0x4a025a07, 0x00000005, - 0x0201f800, 0x000203ab, 0x405e5800, 0x5c002000, - 0x5c001800, 0x5c001000, 0x5c000800, 0x0401f003, - 0x412cc000, 0x592e5800, 0x812e59c0, 0x040207bc, - 0x48675052, 0x48635053, 0x0201f800, 0x0010702d, - 0x5c026000, 0x5c025800, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x42000800, 0x0000000b, - 0x0401f006, 0x42000800, 0x00000004, 0x0401f003, - 0x42000800, 0x00000001, 0x4d2c0000, 0x59325809, - 0x812e59c0, 0x04000012, 0x592c0205, 0x82000500, - 0x000000ff, 0x82000580, 0x0000000e, 0x0402000c, - 0x592c0000, 0x48026009, 0x497a5800, 0x48065a09, - 0x0201f800, 0x001050e3, 0x04000003, 0x0401fe3e, - 0x0401f003, 0x0201f800, 0x000203ab, 0x5c025800, - 0x1c01f000, 0x42001000, 0x00001000, 0x80081040, - 0x04000010, 0x0201f800, 0x0010ae33, 0x040007fc, - 0x42001000, 0x00007b00, 0x5808081c, 0x4a030000, - 0x00000000, 0x82040d00, 0xffff0000, 0x82040580, - 0x84320000, 0x04020003, 0x4a035073, 0x8000001b, - 0x1c01f000, 0x4d340000, 0x4d440000, 0x599c0018, - 0x82000500, 0xffffffcf, 0x82000540, 0x00000010, - 0x48033818, 0x599c0019, 0x82000500, 0xffff1fff, - 0x82000540, 0x00006000, 0x48033819, 0x42003000, - 0x0000fc0e, 0x417a8800, 0x0201f800, 0x00103dd0, - 0x42003000, 0x0010af80, 0x45783000, 0x49375074, - 0x4a026c03, 0x0000ffff, 0x497a6806, 0x497a6807, - 0x4a026c08, 0x000004b0, 0x4a026a08, 0x00000014, - 0x497a6809, 0x4a026c04, 0x00000008, 0x5c028800, - 0x5c026800, 0x1c01f000, 0x4a038893, 0x00000001, - 0x59340400, 0x82000500, 0x000000ff, 0x82000580, - 0x00000003, 0x04000017, 0x0201f800, 0x001070ff, - 0x04000014, 0x4933c857, 0x59aa6874, 0x4936600a, - 0x4a026407, 0x00000012, 0x42000800, 0x00000003, - 0x0201f800, 0x00103d8a, 0x42001000, 0x00000008, - 0x0201f800, 0x001066d0, 0x4a0378e4, 0x0c000000, - 0x42027000, 0x000000d0, 0x0201f800, 0x00020a34, - 0x1c01f000, 0x4d400000, 0x4d340000, 0x0201f800, - 0x0010610d, 0x4df00000, 0x59aa6874, 0x42028000, - 0x00000029, 0x0401f9cc, 0x4a026c00, 0x00000707, - 0x5c03e000, 0x02000800, 0x001060fa, 0x5c026800, - 0x5c028000, 0x1c01f000, 0x4a03c013, 0x00010001, - 0x4a03c014, 0x00010001, 0x4a03c013, 0x00010000, - 0x42000000, 0x0000000f, 0x80000040, 0x040207ff, - 0x4a03c013, 0x00010001, 0x1c01f000, 0x4803c856, - 0x592c0a07, 0x8c040d1e, 0x04020008, 0x80140110, - 0x80000040, 0x04000022, 0x4a033006, 0x0010a64b, - 0x0201f000, 0x00020684, 0x80140110, 0x80000040, - 0x02020000, 0x00104c4c, 0x592c0208, 0x82000c80, - 0x00001001, 0x04001003, 0x0201f000, 0x00104c5c, - 0x592c1014, 0x82080500, 0xffff0003, 0x02020000, - 0x00104c5c, 0x4202e000, 0x00000002, 0x42000000, - 0x0010c25d, 0x50007000, 0x592c0012, 0x592c0813, - 0x48007006, 0x48047007, 0x492c700a, 0x4978700d, - 0x4978700b, 0x0201f000, 0x001050a3, 0x59a80873, - 0x8c040d3e, 0x02000000, 0x00104c44, 0x59aa6874, - 0x59340400, 0x82000580, 0x00000404, 0x04020053, - 0x59a80073, 0x8c000506, 0x0402004c, 0x592c080a, - 0x48066809, 0x592c1207, 0x59341806, 0x8c081506, - 0x04000002, 0x59341807, 0x480e580a, 0x8c081502, - 0x04020005, 0x40040000, 0x800c0480, 0x0400102d, - 0x0401f02f, 0x592c0810, 0x82040500, 0x00000003, - 0x0402004a, 0x592c0011, 0x80000540, 0x04020011, - 0x592c000f, 0x82000500, 0x00000003, 0x04020043, - 0x0201f800, 0x000209ee, 0x04000038, 0x4932580b, + 0x48026004, 0x0401f004, 0x0201f800, 0x0010e453, + 0x80c40040, 0x5c03e000, 0x02000800, 0x0010619f, + 0x0201f800, 0x00108953, 0x02000800, 0x0010032d, + 0x59325809, 0x4a025a07, 0x00000005, 0x0201f800, + 0x000203ab, 0x0201f800, 0x001043e2, 0x59325818, + 0x812e59c0, 0x02020800, 0x00100589, 0x0201f800, + 0x00107144, 0x80000580, 0x5c025800, 0x1c01f000, + 0x5c03e000, 0x02000800, 0x0010619f, 0x59300c07, + 0x82040580, 0x00000011, 0x040007b7, 0x0401f7f7, + 0x4c040000, 0x59340200, 0x4803c857, 0x8c00051c, + 0x04000009, 0x59cc0805, 0x591c001a, 0x4803c857, + 0x80040580, 0x04000004, 0x80000580, 0x4803c856, + 0x0401f003, 0x82000540, 0x00000001, 0x5c000800, + 0x1c01f000, 0x4c000000, 0x4c0c0000, 0x4c100000, + 0x42001800, 0x0000ffff, 0x42002000, 0x00000004, + 0x0401f013, 0x4c000000, 0x4c0c0000, 0x4c100000, + 0x5930200a, 0x58101c03, 0x42002000, 0x00000004, + 0x0401f00b, 0x4c000000, 0x4c0c0000, 0x4c100000, + 0x5930200a, 0x801021c0, 0x02000800, 0x0010032d, + 0x58101c03, 0x42002000, 0x00000007, 0x480fc857, + 0x4813c857, 0x481bc857, 0x0201f800, 0x0010326a, + 0x5c002000, 0x5c001800, 0x5c000000, 0x1c01f000, + 0x8d0e1d20, 0x04000008, 0x4d400000, 0x850e1d44, + 0x42028000, 0x0000002a, 0x0201f800, 0x0010a01b, + 0x5c028000, 0x1c01f000, 0x59a8021b, 0x8c000508, + 0x04000005, 0x599c0017, 0x8c00050a, 0x04020002, + 0x1c01f000, 0x82000540, 0x00000001, 0x1c01f000, + 0x59300421, 0x84000540, 0x48026421, 0x1c01f000, + 0x4c640000, 0x0201f800, 0x00108d64, 0x59300203, + 0x82000580, 0x00000008, 0x04020015, 0x4200c800, + 0x00000032, 0x42000000, 0x20000000, 0x41300800, + 0x0201f800, 0x00100897, 0x0400000d, 0x59300203, + 0x82000580, 0x00000008, 0x04020009, 0x42000000, + 0x0000001e, 0x80000040, 0x040207ff, 0x8064c840, + 0x040207f1, 0x0201f800, 0x0010032d, 0x0201f800, + 0x00108d7c, 0x5c00c800, 0x1c01f000, 0x0201f800, + 0x0010056f, 0x02000800, 0x0010032d, 0x59340403, + 0x49365803, 0x4a025a05, 0x00000055, 0x48025c07, + 0x4a025c08, 0x00001000, 0x59340802, 0x82040d00, + 0x00ffffff, 0x59300403, 0x82000580, 0x00000086, + 0x42000000, 0x85000000, 0x04020003, 0x42000000, + 0x84000000, 0x80040540, 0x4802580a, 0x59a8000f, + 0x4802580b, 0x42000000, 0x00990000, 0x59300c07, + 0x82040d80, 0x00000005, 0x04000002, 0x8400052e, + 0x4802580c, 0x497a580d, 0x59cc0004, 0x4802580e, + 0x497a580f, 0x42000800, 0x00030300, 0x59300403, + 0x82000580, 0x00000086, 0x04020006, 0x59cc0004, + 0x48025811, 0x4a025812, 0x0000ffff, 0x41780800, + 0x48065810, 0x1c01f000, 0x492fc857, 0x59a82852, + 0x801429c0, 0x0400005f, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4d2c0000, 0x4d300000, 0x42026000, + 0x0010f628, 0x592c0c07, 0x592c100a, 0x82081500, + 0x00ffffff, 0x592c180b, 0x592c200e, 0x40165800, + 0x4014c000, 0x4014c800, 0x592c0205, 0x82000580, + 0x00000155, 0x0402003e, 0x592c0407, 0x80040580, + 0x0402003b, 0x592c000a, 0x82000500, 0x00ffffff, + 0x80080580, 0x04020036, 0x592c000b, 0x82000500, + 0x00ffffff, 0x800c0580, 0x04020031, 0x592c000e, + 0x80100580, 0x0402002e, 0x4c040000, 0x4c080000, + 0x4c0c0000, 0x4c100000, 0x40640000, 0x812c0580, + 0x0402001b, 0x59300203, 0x82000580, 0x00000000, + 0x04000013, 0x59300009, 0x800001c0, 0x04000010, + 0x0201f800, 0x001061b2, 0x4df00000, 0x0201f800, + 0x0010609c, 0x0201f800, 0x0010e3bd, 0x80c40040, + 0x04020003, 0x4a026203, 0x00000000, 0x5c03e000, + 0x02000800, 0x0010619f, 0x497a6009, 0x592cc800, + 0x4064c000, 0x4064b800, 0x0401f003, 0x592cb800, + 0x485cc000, 0x4a025a07, 0x00000005, 0x0201f800, + 0x000203ab, 0x405e5800, 0x5c002000, 0x5c001800, + 0x5c001000, 0x5c000800, 0x0401f003, 0x412cc000, + 0x592e5800, 0x812e59c0, 0x040207bc, 0x48675052, + 0x48635053, 0x0201f800, 0x001070bc, 0x5c026000, + 0x5c025800, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x42000800, 0x0000000b, 0x0401f006, + 0x42000800, 0x00000004, 0x0401f003, 0x42000800, + 0x00000001, 0x4d2c0000, 0x59325809, 0x812e59c0, + 0x04000012, 0x592c0205, 0x82000500, 0x000000ff, + 0x82000580, 0x0000000e, 0x0402000c, 0x592c0000, + 0x48026009, 0x497a5800, 0x48065a09, 0x0201f800, + 0x00105139, 0x04000003, 0x0401fe3e, 0x0401f003, + 0x0201f800, 0x000203ab, 0x5c025800, 0x1c01f000, + 0x42001000, 0x00001000, 0x80081040, 0x04000010, + 0x0201f800, 0x0010af26, 0x040007fc, 0x42001000, + 0x00007b00, 0x5808081c, 0x4a030000, 0x00000000, + 0x82040d00, 0xffff0000, 0x82040580, 0x84320000, + 0x04020003, 0x4a035073, 0x8000001b, 0x1c01f000, + 0x4d340000, 0x4d440000, 0x599c0018, 0x82000500, + 0xffffffcf, 0x82000540, 0x00000010, 0x48033818, + 0x599c0019, 0x82000500, 0xffff1fff, 0x82000540, + 0x00006000, 0x48033819, 0x42003000, 0x0000fc0e, + 0x417a8800, 0x0201f800, 0x00103de6, 0x42003000, + 0x0010b080, 0x45783000, 0x49375074, 0x4a026c03, + 0x0000ffff, 0x497a6806, 0x497a6807, 0x4a026c08, + 0x000004b0, 0x4a026a08, 0x00000014, 0x497a6809, + 0x4a026c04, 0x00000008, 0x5c028800, 0x5c026800, + 0x1c01f000, 0x4a038893, 0x00000001, 0x59340400, + 0x82000500, 0x000000ff, 0x82000580, 0x00000003, + 0x04000017, 0x0201f800, 0x00107192, 0x04000014, + 0x4933c857, 0x59aa6874, 0x4936600a, 0x4a026407, + 0x00000012, 0x42000800, 0x00000003, 0x0201f800, + 0x00103d9d, 0x42001000, 0x00000008, 0x0201f800, + 0x00106775, 0x4a0378e4, 0x0c000000, 0x42027000, + 0x000000d0, 0x0201f800, 0x00020a34, 0x1c01f000, + 0x4d400000, 0x4d340000, 0x0201f800, 0x001061b2, + 0x4df00000, 0x59aa6874, 0x42028000, 0x00000029, + 0x0401f9cc, 0x4a026c00, 0x00000707, 0x5c03e000, + 0x02000800, 0x0010619f, 0x5c026800, 0x5c028000, + 0x1c01f000, 0x4a03c013, 0x00010001, 0x4a03c014, + 0x00010001, 0x4a03c013, 0x00010000, 0x42000000, + 0x0000000f, 0x80000040, 0x040207ff, 0x4a03c013, + 0x00010001, 0x1c01f000, 0x4803c856, 0x592c0a07, + 0x8c040d1e, 0x04020008, 0x80140110, 0x80000040, + 0x04000022, 0x4a033006, 0x0010a73e, 0x0201f000, + 0x00020684, 0x80140110, 0x80000040, 0x02020000, + 0x00104c8b, 0x592c0208, 0x82000c80, 0x00001001, + 0x04001003, 0x0201f000, 0x00104c9b, 0x592c1014, + 0x82080500, 0xffff0003, 0x02020000, 0x00104c9b, + 0x4202e000, 0x00000002, 0x42000000, 0x0010c35d, + 0x50007000, 0x592c0012, 0x592c0813, 0x48007006, + 0x48047007, 0x492c700a, 0x4978700d, 0x4978700b, + 0x0201f000, 0x001050f9, 0x59a80873, 0x8c040d3e, + 0x02000000, 0x00104c83, 0x59aa6874, 0x59340400, + 0x82000580, 0x00000404, 0x04020053, 0x59a80073, + 0x8c000506, 0x0402004c, 0x592c080a, 0x48066809, + 0x592c1207, 0x59341806, 0x8c081506, 0x04000002, + 0x59341807, 0x480e580a, 0x8c081502, 0x04020005, + 0x40040000, 0x800c0480, 0x0400102d, 0x0401f02f, + 0x592c0810, 0x82040500, 0x00000003, 0x0402004a, + 0x592c0011, 0x80000540, 0x04020011, 0x592c000f, + 0x82000500, 0x00000003, 0x04020043, 0x0201f800, + 0x000209ee, 0x04000038, 0x4932580b, 0x4a026407, + 0x00000012, 0x492e6009, 0x4936600a, 0x42027000, + 0x000000d1, 0x0201f000, 0x00020a34, 0x592e600b, + 0x0201f800, 0x00108d9b, 0x0400002f, 0x59300407, + 0x82000580, 0x00000012, 0x0402002b, 0x59300809, + 0x800409c0, 0x04020015, 0x59300203, 0x82000580, + 0x00000007, 0x04020024, 0x492e6009, 0x42027000, + 0x000000d9, 0x0201f000, 0x00020a34, 0x8c081500, + 0x040007d4, 0x480e580a, 0x59a80073, 0x8400054c, + 0x84000508, 0x48035073, 0x4a025a07, 0x00000000, + 0x0201f000, 0x000203ab, 0x58041000, 0x800811c0, + 0x04000003, 0x40080800, 0x0401f7fc, 0x492c0800, + 0x1c01f000, 0x4a025a07, 0x00000028, 0x0201f000, + 0x000203ab, 0x4a025a07, 0x00000029, 0x0201f000, + 0x000203ab, 0x4a025a07, 0x0000002c, 0x0201f000, + 0x000203ab, 0x4a025a07, 0x00000008, 0x0201f000, + 0x000203ab, 0x4a025a07, 0x00000003, 0x4a025c07, + 0x00000002, 0x0201f000, 0x000203ab, 0x4803c856, + 0x80140110, 0x80000040, 0x04000005, 0x4a033006, + 0x0010a7b3, 0x0201f000, 0x00020684, 0x59a80873, + 0x8c040d3e, 0x02000000, 0x00104c83, 0x592c0a07, + 0x82040480, 0x00000004, 0x02021000, 0x00104c9b, + 0x59a80073, 0x8c000506, 0x0402001d, 0x59aa6874, + 0x59340400, 0x82000580, 0x00000404, 0x0402001c, + 0x0201f800, 0x000209ee, 0x0400001d, 0x4a026407, + 0x00000012, 0x492e6009, 0x4936600a, 0x592c0a07, + 0x82040580, 0x00000002, 0x04000004, 0x592c0010, + 0x800001c0, 0x04000016, 0x82040400, 0x0010a7d7, + 0x50027000, 0x0201f000, 0x00020a34, 0x000000d4, + 0x000000d5, 0x000000d3, 0x000000d6, 0x4a025a07, + 0x00000028, 0x0201f000, 0x000203ab, 0x4a025a07, + 0x00000029, 0x0201f000, 0x000203ab, 0x4a025a07, + 0x0000002c, 0x0201f000, 0x000203ab, 0x0201f800, + 0x00020a10, 0x0201f000, 0x00104c9b, 0x492fc857, + 0x59a80873, 0x8c040d3e, 0x42000800, 0x00004001, + 0x040000b6, 0x59a80073, 0x8c000506, 0x42000800, + 0x00000028, 0x040200b1, 0x59aa6874, 0x59340400, + 0x82000580, 0x00000404, 0x42000800, 0x00000029, + 0x040200aa, 0x4a025a05, 0x0000012b, 0x4a025806, + 0xaa00feed, 0x4a025a07, 0x00000004, 0x4a025a08, + 0x00000001, 0x59a0020b, 0x48025810, 0x48025814, + 0x48025a0a, 0x59a00408, 0x59a01208, 0x900811c0, + 0x80081540, 0x480a5812, 0x59a0040a, 0x59a0120a, + 0x900811c0, 0x80081540, 0x480a5813, 0x59a00407, + 0x48025a0b, 0x59a0040b, 0x48025c0b, 0x0201f800, + 0x000209ee, 0x42000800, 0x0000002c, 0x0400008b, 0x4a026407, 0x00000012, 0x492e6009, 0x4936600a, - 0x42027000, 0x000000d1, 0x0201f000, 0x00020a34, - 0x592e600b, 0x0201f800, 0x00108ce2, 0x0400002f, - 0x59300407, 0x82000580, 0x00000012, 0x0402002b, - 0x59300809, 0x800409c0, 0x04020015, 0x59300203, - 0x82000580, 0x00000007, 0x04020024, 0x492e6009, - 0x42027000, 0x000000d9, 0x0201f000, 0x00020a34, - 0x8c081500, 0x040007d4, 0x480e580a, 0x59a80073, - 0x8400054c, 0x84000508, 0x48035073, 0x4a025a07, - 0x00000000, 0x0201f000, 0x000203ab, 0x58041000, - 0x800811c0, 0x04000003, 0x40080800, 0x0401f7fc, - 0x492c0800, 0x1c01f000, 0x4a025a07, 0x00000028, - 0x0201f000, 0x000203ab, 0x4a025a07, 0x00000029, - 0x0201f000, 0x000203ab, 0x4a025a07, 0x0000002c, - 0x0201f000, 0x000203ab, 0x4a025a07, 0x00000008, - 0x0201f000, 0x000203ab, 0x4a025a07, 0x00000003, - 0x4a025c07, 0x00000002, 0x0201f000, 0x000203ab, - 0x4803c856, 0x80140110, 0x80000040, 0x04000005, - 0x4a033006, 0x0010a6c0, 0x0201f000, 0x00020684, - 0x59a80873, 0x8c040d3e, 0x02000000, 0x00104c44, - 0x592c0a07, 0x82040480, 0x00000004, 0x02021000, - 0x00104c5c, 0x59a80073, 0x8c000506, 0x0402001d, - 0x59aa6874, 0x59340400, 0x82000580, 0x00000404, - 0x0402001c, 0x0201f800, 0x000209ee, 0x0400001d, - 0x4a026407, 0x00000012, 0x492e6009, 0x4936600a, - 0x592c0a07, 0x82040580, 0x00000002, 0x04000004, - 0x592c0010, 0x800001c0, 0x04000016, 0x82040400, - 0x0010a6e4, 0x50027000, 0x0201f000, 0x00020a34, - 0x000000d4, 0x000000d5, 0x000000d3, 0x000000d6, - 0x4a025a07, 0x00000028, 0x0201f000, 0x000203ab, - 0x4a025a07, 0x00000029, 0x0201f000, 0x000203ab, - 0x4a025a07, 0x0000002c, 0x0201f000, 0x000203ab, - 0x0201f800, 0x00020a10, 0x0201f000, 0x00104c5c, - 0x492fc857, 0x59a80873, 0x8c040d3e, 0x42000800, - 0x00004001, 0x040000b6, 0x59a80073, 0x8c000506, - 0x42000800, 0x00000028, 0x040200b1, 0x59aa6874, - 0x59340400, 0x82000580, 0x00000404, 0x42000800, - 0x00000029, 0x040200aa, 0x4a025a05, 0x0000012b, - 0x4a025806, 0xaa00feed, 0x4a025a07, 0x00000004, - 0x4a025a08, 0x00000001, 0x59a0020b, 0x48025810, - 0x48025814, 0x48025a0a, 0x59a00408, 0x59a01208, - 0x900811c0, 0x80081540, 0x480a5812, 0x59a0040a, - 0x59a0120a, 0x900811c0, 0x80081540, 0x480a5813, - 0x59a00407, 0x48025a0b, 0x59a0040b, 0x48025c0b, - 0x0201f800, 0x000209ee, 0x42000800, 0x0000002c, - 0x0400008b, 0x4a026407, 0x00000012, 0x492e6009, - 0x4936600a, 0x42027000, 0x000000de, 0x0201f000, - 0x00020a34, 0x59cc0801, 0x82040d00, 0x00ffffff, - 0x82040580, 0x0000fc0e, 0x04020014, 0x59cc0800, - 0x82040d00, 0x00ffffff, 0x82040580, 0x0000fc0e, - 0x04020010, 0x59cc0c00, 0x80040910, 0x82040580, - 0x00000022, 0x04000011, 0x82040580, 0x00000023, - 0x04000027, 0x82040580, 0x00000005, 0x0400004e, - 0x4807c857, 0x0401f008, 0x4807c857, 0x0401f006, - 0x4807c857, 0x42000000, 0x0010bcac, 0x0201f800, - 0x0010ad1d, 0x1c01f000, 0x59cc0806, 0x59a80073, - 0x8c00050a, 0x04020010, 0x82040580, 0x05000000, - 0x0402000d, 0x42027000, 0x000000da, 0x0201f800, - 0x001070ff, 0x59aa6874, 0x4936600a, 0x4a026407, - 0x00000013, 0x59cc0404, 0x48026202, 0x0201f000, - 0x00020a34, 0x4807c857, 0x42000000, 0x0010bcac, - 0x0201f800, 0x0010ad1d, 0x1c01f000, 0x0201f800, - 0x001055aa, 0x0400001f, 0x59300c07, 0x82040580, - 0x00000012, 0x02020800, 0x001003f4, 0x0402001c, - 0x5932680a, 0x59cc0a04, 0x48066202, 0x59300004, - 0x8c00053e, 0x02020800, 0x0010644d, 0x04020014, - 0x42027000, 0x000000dc, 0x59cc0806, 0x82040580, - 0x02000000, 0x02000000, 0x00020a34, 0x82040580, - 0x01000000, 0x02020800, 0x001003f4, 0x04020008, - 0x42027000, 0x000000dd, 0x0201f000, 0x00020a34, - 0x59cc0c04, 0x4807c857, 0x0401f002, 0x4933c857, - 0x42000000, 0x0010bcac, 0x0201f800, 0x0010ad1d, - 0x1c01f000, 0x0201f800, 0x001055aa, 0x04000013, - 0x59300c07, 0x82040580, 0x00000012, 0x02020800, - 0x001003f4, 0x04020010, 0x5932680a, 0x59cc0a04, - 0x48066202, 0x59300004, 0x8c00053e, 0x02020800, - 0x0010644d, 0x04020008, 0x42027000, 0x000000db, - 0x0201f000, 0x00020a34, 0x59cc0c04, 0x4807c857, - 0x0401f002, 0x4933c857, 0x42000000, 0x0010bcac, - 0x0201f800, 0x0010ad1d, 0x1c01f000, 0x492fc857, - 0x4807c857, 0x82040580, 0x00000000, 0x02000000, - 0x00101cba, 0x4a034207, 0x00004005, 0x48074407, - 0x0201f000, 0x00101cbd, 0x48066004, 0x59bc00ea, - 0x8c000516, 0x040207fe, 0x83300400, 0xc0000000, - 0x480378e1, 0x1c01f000, 0x4d300000, 0x598c000d, - 0x80026540, 0x0400000e, 0x0201f800, 0x001060f3, - 0x0201f800, 0x001060e1, 0x59300000, 0x800001c0, - 0x04000004, 0x4803180d, 0x497a6000, 0x0401f003, - 0x497b180d, 0x497b180c, 0x80000580, 0x5c026000, - 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x4d340000, - 0x4c5c0000, 0x4178b800, 0x598e600d, 0x813261c0, - 0x0400000b, 0x0201f800, 0x00105ff7, 0x59300000, - 0x4c000000, 0x405c3000, 0x0401f826, 0x0201f800, - 0x0010e35f, 0x5c026000, 0x0401f7f5, 0x5c00b800, - 0x5c026800, 0x5c026000, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x4c5c0000, 0x813261c0, 0x02000800, - 0x0010032d, 0x41300000, 0x598cb80d, 0x41783000, - 0x805cb9c0, 0x0400000f, 0x805c0d80, 0x04000004, - 0x405c3000, 0x5818b800, 0x0401f7fa, 0x0401f80d, - 0x598c000f, 0x81300580, 0x02000800, 0x001066dd, - 0x497a6008, 0x80000580, 0x5c00b800, 0x1c01f000, - 0x82000540, 0x00000001, 0x5c00b800, 0x1c01f000, - 0x59300800, 0x497a6000, 0x0201f800, 0x001060e1, - 0x801831c0, 0x04020009, 0x598c000c, 0x81300580, - 0x04020004, 0x4803180c, 0x4803180d, 0x0401f008, - 0x4807180d, 0x0401f006, 0x48043000, 0x598c000c, - 0x81300580, 0x04020002, 0x481b180c, 0x0201f000, - 0x001060f3, 0x59325809, 0x59300c03, 0x82040480, - 0x000000df, 0x04021004, 0x82040480, 0x000000d0, - 0x0401f002, 0x81780040, 0x04001002, 0x0c01f008, - 0x4933c857, 0x493bc857, 0x42000000, 0x0010bcae, - 0x0201f800, 0x0010ad1d, 0x1c01f000, 0x0010a855, - 0x0010a86c, 0x0010a889, 0x0010a89a, 0x0010a8ab, - 0x0010a8be, 0x0010a8d1, 0x0010a8e5, 0x0010a82c, - 0x0010a82c, 0x0010a82c, 0x0010a82c, 0x0010a82c, - 0x0010a82c, 0x0010a842, 0x42000800, 0x00000022, - 0x0401f8d1, 0x592c0a0a, 0x4805a207, 0x592c0a0b, - 0x4805a208, 0x592c0c0b, 0x4805a408, 0x4a01a006, - 0x0c000000, 0x59340408, 0x48026006, 0x42000800, - 0x00000003, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00106f71, 0x42000800, 0x00000022, 0x0401f8be, - 0x497b8880, 0x59a8001f, 0x82000500, 0x0000ffff, - 0x4c000000, 0x0201f800, 0x001013db, 0x5c000000, - 0x48038880, 0x4a01a006, 0x03000000, 0x4801a207, - 0x59a80004, 0x4801a407, 0x42000800, 0x00000002, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00106f71, - 0x42000800, 0x00000022, 0x0401f8a7, 0x592c0a07, - 0x592c100f, 0x592c0010, 0x80080580, 0x82000500, - 0x00000003, 0x0402008c, 0x82080500, 0x00000003, - 0x04020089, 0x42001800, 0x00000002, 0x8c040d06, - 0x04020003, 0x42001800, 0x00000001, 0x4a01a006, - 0x04000000, 0x4809a007, 0x480da008, 0x42000800, - 0x00000003, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00106f71, 0x42000800, 0x00000022, 0x0401f88a, - 0x59300819, 0x5930101a, 0x5930181b, 0x4a01a006, - 0x06000000, 0x4805a007, 0x4809a008, 0x480da009, + 0x42027000, 0x000000de, 0x0201f000, 0x00020a34, + 0x59cc0801, 0x82040d00, 0x00ffffff, 0x82040580, + 0x0000fc0e, 0x04020014, 0x59cc0800, 0x82040d00, + 0x00ffffff, 0x82040580, 0x0000fc0e, 0x04020010, + 0x59cc0c00, 0x80040910, 0x82040580, 0x00000022, + 0x04000011, 0x82040580, 0x00000023, 0x04000027, + 0x82040580, 0x00000005, 0x0400004e, 0x4807c857, + 0x0401f008, 0x4807c857, 0x0401f006, 0x4807c857, + 0x42000000, 0x0010bdac, 0x0201f800, 0x0010ae10, + 0x1c01f000, 0x59cc0806, 0x59a80073, 0x8c00050a, + 0x04020010, 0x82040580, 0x05000000, 0x0402000d, + 0x42027000, 0x000000da, 0x0201f800, 0x00107192, + 0x59aa6874, 0x4936600a, 0x4a026407, 0x00000013, + 0x59cc0404, 0x48026202, 0x0201f000, 0x00020a34, + 0x4807c857, 0x42000000, 0x0010bdac, 0x0201f800, + 0x0010ae10, 0x1c01f000, 0x0201f800, 0x00105616, + 0x0400001f, 0x59300c07, 0x82040580, 0x00000012, + 0x02020800, 0x001003f4, 0x0402001c, 0x5932680a, + 0x59cc0a04, 0x48066202, 0x59300004, 0x8c00053e, + 0x02020800, 0x001064f2, 0x04020014, 0x42027000, + 0x000000dc, 0x59cc0806, 0x82040580, 0x02000000, + 0x02000000, 0x00020a34, 0x82040580, 0x01000000, + 0x02020800, 0x001003f4, 0x04020008, 0x42027000, + 0x000000dd, 0x0201f000, 0x00020a34, 0x59cc0c04, + 0x4807c857, 0x0401f002, 0x4933c857, 0x42000000, + 0x0010bdac, 0x0201f800, 0x0010ae10, 0x1c01f000, + 0x0201f800, 0x00105616, 0x04000013, 0x59300c07, + 0x82040580, 0x00000012, 0x02020800, 0x001003f4, + 0x04020010, 0x5932680a, 0x59cc0a04, 0x48066202, + 0x59300004, 0x8c00053e, 0x02020800, 0x001064f2, + 0x04020008, 0x42027000, 0x000000db, 0x0201f000, + 0x00020a34, 0x59cc0c04, 0x4807c857, 0x0401f002, + 0x4933c857, 0x42000000, 0x0010bdac, 0x0201f800, + 0x0010ae10, 0x1c01f000, 0x492fc857, 0x4807c857, + 0x82040580, 0x00000000, 0x02000000, 0x00101cbf, + 0x4a034207, 0x00004005, 0x48074407, 0x0201f000, + 0x00101cc2, 0x48066004, 0x59bc00ea, 0x8c000516, + 0x040207fe, 0x83300400, 0xc0000000, 0x480378e1, + 0x1c01f000, 0x4d300000, 0x598c000d, 0x80026540, + 0x0400000e, 0x0201f800, 0x00106198, 0x0201f800, + 0x00106186, 0x59300000, 0x800001c0, 0x04000004, + 0x4803180d, 0x497a6000, 0x0401f003, 0x497b180d, + 0x497b180c, 0x80000580, 0x5c026000, 0x1c01f000, + 0x4d2c0000, 0x4d300000, 0x4d340000, 0x4c5c0000, + 0x4178b800, 0x598e600d, 0x813261c0, 0x0400000b, + 0x0201f800, 0x0010609c, 0x59300000, 0x4c000000, + 0x405c3000, 0x0401f826, 0x0201f800, 0x0010e46f, + 0x5c026000, 0x0401f7f5, 0x5c00b800, 0x5c026800, + 0x5c026000, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x4c5c0000, 0x813261c0, 0x02000800, 0x0010032d, + 0x41300000, 0x598cb80d, 0x41783000, 0x805cb9c0, + 0x0400000f, 0x805c0d80, 0x04000004, 0x405c3000, + 0x5818b800, 0x0401f7fa, 0x0401f80d, 0x598c000f, + 0x81300580, 0x02000800, 0x00106782, 0x497a6008, + 0x80000580, 0x5c00b800, 0x1c01f000, 0x82000540, + 0x00000001, 0x5c00b800, 0x1c01f000, 0x59300800, + 0x497a6000, 0x0201f800, 0x00106186, 0x801831c0, + 0x04020009, 0x598c000c, 0x81300580, 0x04020004, + 0x4803180c, 0x4803180d, 0x0401f008, 0x4807180d, + 0x0401f006, 0x48043000, 0x598c000c, 0x81300580, + 0x04020002, 0x481b180c, 0x0201f000, 0x00106198, + 0x59325809, 0x59300c03, 0x82040480, 0x000000df, + 0x04021004, 0x82040480, 0x000000d0, 0x0401f002, + 0x81780040, 0x04001002, 0x0c01f008, 0x4933c857, + 0x493bc857, 0x42000000, 0x0010bdae, 0x0201f800, + 0x0010ae10, 0x1c01f000, 0x0010a948, 0x0010a95f, + 0x0010a97c, 0x0010a98d, 0x0010a99e, 0x0010a9b1, + 0x0010a9c4, 0x0010a9d8, 0x0010a91f, 0x0010a91f, + 0x0010a91f, 0x0010a91f, 0x0010a91f, 0x0010a91f, + 0x0010a935, 0x42000800, 0x00000022, 0x0401f8d1, + 0x592c0a0a, 0x4805a207, 0x592c0a0b, 0x4805a208, + 0x592c0c0b, 0x4805a408, 0x4a01a006, 0x0c000000, + 0x59340408, 0x48026006, 0x42000800, 0x00000003, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107000, + 0x42000800, 0x00000022, 0x0401f8be, 0x497b8880, + 0x59a8001f, 0x82000500, 0x0000ffff, 0x4c000000, + 0x0201f800, 0x001013dc, 0x5c000000, 0x48038880, + 0x4a01a006, 0x03000000, 0x4801a207, 0x59a80004, + 0x4801a407, 0x42000800, 0x00000002, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107000, 0x42000800, + 0x00000022, 0x0401f8a7, 0x592c0a07, 0x592c100f, + 0x592c0010, 0x80080580, 0x82000500, 0x00000003, + 0x0402008c, 0x82080500, 0x00000003, 0x04020089, + 0x42001800, 0x00000002, 0x8c040d06, 0x04020003, + 0x42001800, 0x00000001, 0x4a01a006, 0x04000000, + 0x4809a007, 0x480da008, 0x42000800, 0x00000003, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107000, + 0x42000800, 0x00000022, 0x0401f88a, 0x59300819, + 0x5930101a, 0x5930181b, 0x4a01a006, 0x06000000, + 0x4805a007, 0x4809a008, 0x480da009, 0x42000800, + 0x00000004, 0x42001000, 0x0000dc00, 0x0201f000, + 0x00107000, 0x42000800, 0x00000022, 0x0401f879, + 0x592c0a0a, 0x592c100b, 0x592c180c, 0x4a01a006, + 0x07000000, 0x4805a207, 0x480da008, 0x4809a009, 0x42000800, 0x00000004, 0x42001000, 0x0000dc00, - 0x0201f000, 0x00106f71, 0x42000800, 0x00000022, - 0x0401f879, 0x592c0a0a, 0x592c100b, 0x592c180c, - 0x4a01a006, 0x07000000, 0x4805a207, 0x480da008, - 0x4809a009, 0x42000800, 0x00000004, 0x42001000, - 0x0000dc00, 0x0201f000, 0x00106f71, 0x42000800, - 0x00000022, 0x0401f868, 0x592c080a, 0x592c1010, - 0x82080500, 0xfffc0003, 0x0402004f, 0x80081104, - 0x4a01a006, 0x08000000, 0x4805a007, 0x4809a008, - 0x42000800, 0x00000003, 0x42001000, 0x0000dc00, - 0x0201f000, 0x00106f71, 0x42000800, 0x00000022, - 0x0401f855, 0x592c080a, 0x592c1010, 0x82080500, - 0xfffc0003, 0x0402003c, 0x80081104, 0x4a01a006, - 0x09000000, 0x4805a007, 0x4809a008, 0x42000800, + 0x0201f000, 0x00107000, 0x42000800, 0x00000022, + 0x0401f868, 0x592c080a, 0x592c1010, 0x82080500, + 0xfffc0003, 0x0402004f, 0x80081104, 0x4a01a006, + 0x08000000, 0x4805a007, 0x4809a008, 0x42000800, 0x00000003, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00106f71, 0x42000800, 0x00000022, 0x0401f842, - 0x592c080a, 0x592c1010, 0x592c180b, 0x82080500, - 0xffff0000, 0x04020028, 0x4a01a006, 0x0a000000, - 0x4805a207, 0x480da407, 0x4809a008, 0x42000800, - 0x00000003, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00106f71, 0x42000800, 0x00000022, 0x0401f82e, - 0x4a01a006, 0x0b000000, 0x42000800, 0x00000001, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00106f71, - 0x59300c03, 0x82040580, 0x000000d8, 0x04000003, - 0x0201f800, 0x0010032d, 0x42000800, 0x00000023, - 0x0401f81d, 0x4a01a006, 0x02000000, 0x42000800, - 0x00000001, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00106f71, 0x592c0006, 0x4803c857, 0x480bc857, - 0x0201f800, 0x0010605d, 0x4a025a07, 0x00000003, - 0x4a025c07, 0x00000002, 0x592c0205, 0x82000500, - 0x000000ff, 0x82000580, 0x0000002b, 0x04020002, - 0x480a5808, 0x0201f800, 0x000203ab, 0x0201f000, - 0x00020a10, 0x81a5a000, 0x4a01a001, 0x0000fc0e, - 0x4979a005, 0x4979a003, 0x4a034800, 0x00000011, - 0x59307002, 0x82040580, 0x00000022, 0x04020007, - 0x4a01a000, 0x2200fc0e, 0x4a01a002, 0xfe290000, - 0x4839a004, 0x1c01f000, 0x82040580, 0x00000023, - 0x02020800, 0x0010032d, 0x4a01a000, 0x2300fc0e, - 0x4a01a002, 0xfe980000, 0x903871c0, 0x4839a004, - 0x1c01f000, 0x4a034800, 0x00000011, 0x81a5a000, - 0x4a01a000, 0x0100fc0e, 0x4a01a001, 0x0000fc0e, - 0x4a01a002, 0xfe000008, 0x41781000, 0x42000800, - 0x01000000, 0x592c0205, 0x82000500, 0x000000ff, - 0x82000580, 0x0000001b, 0x04020006, 0x592c1011, - 0x592c0207, 0x8c00051c, 0x04020002, 0x41780800, - 0x4805a003, 0x59300002, 0x4801a004, 0x4809a005, - 0x59340c08, 0x42001000, 0x00000100, 0x0201f800, - 0x00105f4a, 0x0201f800, 0x001058d0, 0x83180d40, - 0x00000038, 0x42001000, 0x0000c920, 0x0201f000, - 0x00106f90, 0x59300a03, 0x82040480, 0x00000009, - 0x04021004, 0x82040480, 0x00000001, 0x0401f002, - 0x81780040, 0x0c021002, 0x0401f22c, 0x0010a96b, - 0x0010a988, 0x0010a9e8, 0x0010aa2a, 0x0010ab8e, - 0x0010ab8e, 0x0010aa8a, 0x0010aab3, 0x83380580, - 0x00000013, 0x04000015, 0x83380580, 0x00000014, - 0x0402021e, 0x59300c03, 0x4807c857, 0x0201f800, - 0x0010605d, 0x0201f800, 0x0010889a, 0x04000009, - 0x4d2c0000, 0x59325809, 0x4a025a07, 0x00000001, - 0x497a5c07, 0x0201f800, 0x000203ab, 0x5c025800, - 0x0201f000, 0x001070b5, 0x59300c03, 0x82040580, - 0x000000d8, 0x04020209, 0x0201f000, 0x00020a10, - 0x83380480, 0x000000de, 0x04021004, 0x83380480, - 0x000000db, 0x0401f002, 0x81780040, 0x040011ff, - 0x0c01f001, 0x0010a994, 0x0010a9aa, 0x0010a9b4, - 0x59300c03, 0x82040580, 0x000000d1, 0x0400000c, - 0x82040580, 0x000000d5, 0x040201f4, 0x42000800, - 0x80000000, 0x4a026203, 0x00000002, 0x4a026403, - 0x000000d9, 0x0201f000, 0x000209a3, 0x59340408, - 0x48026006, 0x42000800, 0x80000040, 0x4a026203, - 0x00000003, 0x0401f7f6, 0x59300c03, 0x82040480, - 0x000000da, 0x04021004, 0x82040480, 0x000000d0, - 0x0401f002, 0x81780040, 0x0c02101b, 0x0401f1db, - 0x0201f800, 0x0010889a, 0x0402000a, 0x59300c03, - 0x82040580, 0x000000d2, 0x040201d4, 0x42000000, - 0x0010bcab, 0x0401fb60, 0x0201f000, 0x00020a10, - 0x4933c857, 0x59cc1207, 0x80081110, 0x4d2c0000, - 0x59325809, 0x4a025a07, 0x00000003, 0x480a5c07, + 0x00107000, 0x42000800, 0x00000022, 0x0401f855, + 0x592c080a, 0x592c1010, 0x82080500, 0xfffc0003, + 0x0402003c, 0x80081104, 0x4a01a006, 0x09000000, + 0x4805a007, 0x4809a008, 0x42000800, 0x00000003, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107000, + 0x42000800, 0x00000022, 0x0401f842, 0x592c080a, + 0x592c1010, 0x592c180b, 0x82080500, 0xffff0000, + 0x04020028, 0x4a01a006, 0x0a000000, 0x4805a207, + 0x480da407, 0x4809a008, 0x42000800, 0x00000003, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107000, + 0x42000800, 0x00000022, 0x0401f82e, 0x4a01a006, + 0x0b000000, 0x42000800, 0x00000001, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107000, 0x59300c03, + 0x82040580, 0x000000d8, 0x04000003, 0x0201f800, + 0x0010032d, 0x42000800, 0x00000023, 0x0401f81d, + 0x4a01a006, 0x02000000, 0x42000800, 0x00000001, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107000, + 0x592c0006, 0x4803c857, 0x480bc857, 0x0201f800, + 0x00106102, 0x4a025a07, 0x00000003, 0x4a025c07, + 0x00000002, 0x592c0205, 0x82000500, 0x000000ff, + 0x82000580, 0x0000002b, 0x04020002, 0x480a5808, + 0x0201f800, 0x000203ab, 0x0201f000, 0x00020a10, + 0x81a5a000, 0x4a01a001, 0x0000fc0e, 0x4979a005, + 0x4979a003, 0x4a034800, 0x00000011, 0x59307002, + 0x82040580, 0x00000022, 0x04020007, 0x4a01a000, + 0x2200fc0e, 0x4a01a002, 0xfe290000, 0x4839a004, + 0x1c01f000, 0x82040580, 0x00000023, 0x02020800, + 0x0010032d, 0x4a01a000, 0x2300fc0e, 0x4a01a002, + 0xfe980000, 0x903871c0, 0x4839a004, 0x1c01f000, + 0x4a034800, 0x00000011, 0x81a5a000, 0x4a01a000, + 0x0100fc0e, 0x4a01a001, 0x0000fc0e, 0x4a01a002, + 0xfe000008, 0x41781000, 0x42000800, 0x01000000, + 0x592c0205, 0x82000500, 0x000000ff, 0x82000580, + 0x0000001b, 0x04020006, 0x592c1011, 0x592c0207, + 0x8c00051c, 0x04020002, 0x41780800, 0x4805a003, + 0x59300002, 0x4801a004, 0x4809a005, 0x59340c08, + 0x42001000, 0x00000100, 0x0201f800, 0x00105fef, + 0x0201f800, 0x00105975, 0x83180d40, 0x00000038, + 0x42001000, 0x0000c920, 0x0201f000, 0x0010701f, + 0x59300a03, 0x82040480, 0x00000009, 0x04021004, + 0x82040480, 0x00000001, 0x0401f002, 0x81780040, + 0x0c021002, 0x0401f22c, 0x0010aa5e, 0x0010aa7b, + 0x0010aadb, 0x0010ab1d, 0x0010ac81, 0x0010ac81, + 0x0010ab7d, 0x0010aba6, 0x83380580, 0x00000013, + 0x04000015, 0x83380580, 0x00000014, 0x0402021e, + 0x59300c03, 0x4807c857, 0x0201f800, 0x00106102, + 0x0201f800, 0x00108953, 0x04000009, 0x4d2c0000, + 0x59325809, 0x4a025a07, 0x00000001, 0x497a5c07, 0x0201f800, 0x000203ab, 0x5c025800, 0x0201f000, - 0x00020a10, 0x0010aae2, 0x0010ab8e, 0x0010a9db, - 0x0010a9db, 0x0010ab8e, 0x0010a9db, 0x0010ab8e, - 0x0010a9d7, 0x0010ab8e, 0x0010ab22, 0x41780800, - 0x0401fa83, 0x0201f000, 0x00020a10, 0x0201f800, - 0x0010889a, 0x04000009, 0x4d2c0000, 0x59325809, - 0x4a025a07, 0x00000000, 0x497a5c07, 0x0201f800, - 0x000203ab, 0x5c025800, 0x0201f000, 0x00020a10, - 0x0201f800, 0x0010889a, 0x0400003e, 0x83380580, - 0x0000004a, 0x0400002c, 0x83380580, 0x00000049, - 0x0402019e, 0x4d2c0000, 0x59325809, 0x592c0a05, - 0x82040500, 0x000000ff, 0x82000580, 0x0000001b, - 0x04020019, 0x592c0207, 0x8c00051c, 0x0402000f, - 0x4a025a07, 0x00000040, 0x497a5c07, 0x592c0000, - 0x48026009, 0x0201f800, 0x000203ab, 0x5c025800, - 0x4a026203, 0x00000007, 0x59300009, 0x800001c0, - 0x04020082, 0x1c01f000, 0x59a80073, 0x8400050a, - 0x48035073, 0x4a026203, 0x00000002, 0x5c025800, - 0x1c01f000, 0x4a025a07, 0x00000000, 0x497a5c07, - 0x0201f800, 0x000203ab, 0x5c025800, 0x0201f000, - 0x00020a10, 0x4933c857, 0x0201f800, 0x001062a1, - 0x0201f800, 0x0010603d, 0x4d2c0000, 0x59325809, - 0x4a025a07, 0x00000001, 0x497a5c07, 0x0201f800, - 0x000203ab, 0x5c025800, 0x0201f000, 0x00020a10, - 0x4803c856, 0x0401f165, 0x0201f800, 0x0010889a, - 0x0400002c, 0x83380480, 0x00000054, 0x04021004, - 0x83380480, 0x00000047, 0x0401f002, 0x81780040, - 0x04001006, 0x4d2c0000, 0x59325809, 0x0c01f823, - 0x5c025800, 0x1c01f000, 0x83380580, 0x000000dd, - 0x04020152, 0x4933c857, 0x0201f800, 0x00100bd4, - 0x0201f800, 0x0010889a, 0x04000016, 0x592c0a07, - 0x82040580, 0x00000004, 0x04020006, 0x42000800, - 0x00000001, 0x0401fd6a, 0x0201f000, 0x00020a10, - 0x4d2c0000, 0x59325809, 0x59cc1207, 0x80081110, + 0x00107144, 0x59300c03, 0x82040580, 0x000000d8, + 0x04020209, 0x0201f000, 0x00020a10, 0x83380480, + 0x000000de, 0x04021004, 0x83380480, 0x000000db, + 0x0401f002, 0x81780040, 0x040011ff, 0x0c01f001, + 0x0010aa87, 0x0010aa9d, 0x0010aaa7, 0x59300c03, + 0x82040580, 0x000000d1, 0x0400000c, 0x82040580, + 0x000000d5, 0x040201f4, 0x42000800, 0x80000000, + 0x4a026203, 0x00000002, 0x4a026403, 0x000000d9, + 0x0201f000, 0x000209a3, 0x59340408, 0x48026006, + 0x42000800, 0x80000040, 0x4a026203, 0x00000003, + 0x0401f7f6, 0x59300c03, 0x82040480, 0x000000da, + 0x04021004, 0x82040480, 0x000000d0, 0x0401f002, + 0x81780040, 0x0c02101b, 0x0401f1db, 0x0201f800, + 0x00108953, 0x0402000a, 0x59300c03, 0x82040580, + 0x000000d2, 0x040201d4, 0x42000000, 0x0010bdab, + 0x0401fb60, 0x0201f000, 0x00020a10, 0x4933c857, + 0x59cc1207, 0x80081110, 0x4d2c0000, 0x59325809, 0x4a025a07, 0x00000003, 0x480a5c07, 0x0201f800, 0x000203ab, 0x5c025800, 0x0201f000, 0x00020a10, - 0x4803c856, 0x0401f135, 0x0010aa86, 0x0010aa67, - 0x0010ab8e, 0x0010ab8e, 0x0010ab8e, 0x0010ab8e, - 0x0010ab8e, 0x0010ab8e, 0x0010ab8e, 0x0010ab8e, - 0x0010ab8e, 0x0010ab8e, 0x0010aa67, 0x59300812, - 0x82040500, 0xffff0000, 0x0402001c, 0x42001000, - 0x00000000, 0x592c0a07, 0x82040580, 0x00000004, - 0x0402000e, 0x82080580, 0x00000007, 0x04000007, - 0x59300812, 0x800409c0, 0x04000004, 0x4807c857, - 0x42001000, 0x00000015, 0x40080800, 0x0401fd38, - 0x0201f000, 0x00020a10, 0x59300812, 0x48065808, - 0x480a5a07, 0x497a5c07, 0x0201f800, 0x000203ab, - 0x0201f000, 0x00020a10, 0x4803c856, 0x42001000, - 0x00000007, 0x0401f7e4, 0x0201f800, 0x0010889a, - 0x0400001b, 0x83380580, 0x000000d9, 0x040200ff, - 0x59340408, 0x48026006, 0x4a026403, 0x000000d9, - 0x0201f800, 0x00020154, 0x59306809, 0x58340207, - 0x8c00051c, 0x04020006, 0x42000800, 0x80000040, - 0x4a026203, 0x00000003, 0x0401f005, 0x42000800, - 0x80000000, 0x4a026203, 0x00000002, 0x4a026403, - 0x000000d9, 0x0201f000, 0x000209a3, 0x4803c856, - 0x83380580, 0x000000dd, 0x040200e4, 0x42001000, - 0x0000800f, 0x42001800, 0x00000005, 0x59cc2207, - 0x80102110, 0x0201f000, 0x001031eb, 0x83380480, - 0x000000df, 0x04021004, 0x83380480, 0x000000d0, - 0x0401f002, 0x81780040, 0x040010d4, 0x4933c857, - 0x493bc857, 0x59340a08, 0x48066006, 0x0c01f001, - 0x0010aad4, 0x0010aad0, 0x0010aad4, 0x0010aad4, - 0x0010aada, 0x0010aad2, 0x0010aada, 0x0010aad4, - 0x0010aacf, 0x0010aacf, 0x0010aacf, 0x0010aacf, - 0x0010aacf, 0x0010aacf, 0x0010aada, 0x0401f0bf, - 0x59340408, 0x48026006, 0x0201f800, 0x00020154, - 0x4a026203, 0x00000002, 0x493a6403, 0x42000800, - 0x80000000, 0x0401f4e5, 0x0201f800, 0x00020111, - 0x4a026203, 0x00000004, 0x493a6403, 0x42000800, - 0x80000000, 0x0401f4dd, 0x59cc0207, 0x59cc0c07, - 0x59cc1008, 0x59cc1809, 0x59cc220a, 0x59cc2c0a, - 0x59cc300b, 0x4a026c00, 0x00000404, 0x48026c04, - 0x48038893, 0x48035012, 0x48066a04, 0x480a6806, - 0x480e6807, 0x48126a08, 0x48166c08, 0x8c183500, - 0x0400000d, 0x59cc200d, 0x59cc280d, 0x4813c857, - 0x4817c857, 0x59cc200c, 0x42001000, 0x0000800f, - 0x42001800, 0x00000001, 0x901029c0, 0x0201f800, - 0x001031ec, 0x59a80873, 0x42001800, 0x00000003, - 0x84040d4e, 0x59342007, 0x8c183502, 0x0402000c, - 0x82040d00, 0xffffff7b, 0x8c183504, 0x04020004, - 0x42001800, 0x00000002, 0x0401f004, 0x42001800, - 0x00000004, 0x84040d44, 0x59342006, 0x48075073, - 0x42001000, 0x0000800f, 0x82102d00, 0xffff0000, - 0x80142920, 0x82102500, 0x0000ffff, 0x0201f800, - 0x001031ec, 0x59c80040, 0x84000534, 0x48039040, - 0x0201f000, 0x00020a10, 0x0201f800, 0x0010889a, - 0x04000023, 0x4d2c0000, 0x59325809, 0x592c0a05, - 0x82040d00, 0x000000ff, 0x82040580, 0x0000001b, - 0x04020019, 0x592c0a07, 0x8c040d04, 0x04020003, - 0x0201f800, 0x0010a616, 0x59340009, 0x4802580a, - 0x8c040d06, 0x04020007, 0x48026806, 0x59a80073, - 0x8400054c, 0x84000508, 0x48035073, 0x0401f002, - 0x48026807, 0x4a025a07, 0x00000000, 0x497a5c07, - 0x0201f800, 0x000203ab, 0x5c025800, 0x0201f000, - 0x00020a10, 0x497a5808, 0x0401f7f7, 0x4803c856, - 0x0401f046, 0x59300a03, 0x82040480, 0x00000009, - 0x04021004, 0x82040480, 0x00000001, 0x0401f002, - 0x81780040, 0x0c021002, 0x0401f03c, 0x0010ab5b, - 0x0010ab8e, 0x0010ab8e, 0x0010ab8e, 0x0010ab8e, - 0x0010ab8e, 0x0010ab8e, 0x0010ab67, 0x83380580, - 0x00000013, 0x04000008, 0x83380580, 0x00000014, - 0x0402002e, 0x59300c03, 0x4807c857, 0x0201f800, - 0x0010605d, 0x0201f000, 0x00020a10, 0x83380580, - 0x000000da, 0x04020025, 0x4933c857, 0x493bc857, - 0x59cc0808, 0x59cc1007, 0x59a81873, 0x820c1d00, - 0xfffffffc, 0x82040580, 0x00000000, 0x04020002, - 0x840c1d42, 0x82080580, 0x00000000, 0x04020002, - 0x840c1d40, 0x480f5073, 0x480fc857, 0x836c0580, - 0x00000001, 0x0400000a, 0x4202d800, 0x00000004, - 0x4a035038, 0x00000000, 0x497b5058, 0x42000000, - 0x00000080, 0x0201f800, 0x00101364, 0x4a026403, - 0x000000d8, 0x4a026203, 0x00000001, 0x42000800, - 0x80000040, 0x0401f431, 0x4933c857, 0x493bc857, - 0x59300203, 0x4803c857, 0x59300403, 0x4803c857, - 0x42000000, 0x0010bcad, 0x0401f987, 0x1c01f000, - 0x4933c857, 0x4d2c0000, 0x4d3c0000, 0x417a5800, - 0x417a7800, 0x0201f800, 0x0010889a, 0x04000003, - 0x59325809, 0x592e7a09, 0x0401f81a, 0x82000540, - 0x00000001, 0x5c027800, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x4d2c0000, 0x4d3c0000, 0x42027800, - 0x00000040, 0x42000000, 0x0010bca8, 0x0401f96e, - 0x417a5800, 0x0201f800, 0x0010889a, 0x04000005, - 0x59325809, 0x592e7a09, 0x853e7d4c, 0x493e5a09, - 0x0401f804, 0x5c027800, 0x5c025800, 0x1c01f000, - 0x0201f800, 0x0010610d, 0x4df00000, 0x0401f88b, - 0x4803c857, 0x82000c80, 0x00000009, 0x04021006, - 0x0c01f808, 0x5c03e000, 0x02000800, 0x001060fa, - 0x1c01f000, 0x42000000, 0x00000006, 0x0401f7f9, - 0x0010ac21, 0x0010ac22, 0x0010abdb, 0x0010ac38, - 0x0010ac43, 0x0010abd5, 0x0010abd5, 0x0010abd5, - 0x0010ac21, 0x4d380000, 0x417a7000, 0x0401ffb7, - 0x5c027000, 0x0201f000, 0x001070b5, 0x812e59c0, - 0x04000021, 0x42001000, 0x00000002, 0x833c0500, - 0x00000081, 0x04020007, 0x42001000, 0x00000006, - 0x8d3e7d0c, 0x04020003, 0x42001000, 0x00000004, - 0x592c0a07, 0x82040580, 0x00000004, 0x04020006, - 0x40080800, 0x0201f800, 0x0010a7b3, 0x0201f000, - 0x001070b5, 0x480a5a07, 0x0201f800, 0x000203ab, - 0x59300403, 0x82000580, 0x000000d0, 0x04020004, - 0x5930100a, 0x4a001400, 0x00000707, 0x0201f000, - 0x001070b5, 0x59300c03, 0x82040580, 0x000000d7, - 0x04020005, 0x42000800, 0x00000004, 0x0401f858, - 0x0401f7f0, 0x8d3e7d0c, 0x040007ee, 0x5932680a, - 0x59300816, 0x59340412, 0x80040580, 0x04020007, - 0x42000000, 0x0010bca9, 0x0401f90f, 0x0201f800, - 0x0010a616, 0x0401f7e3, 0x4933c857, 0x80040800, - 0x48066016, 0x4d380000, 0x59327403, 0x83380580, - 0x000000d0, 0x04020003, 0x4a038893, 0x00000001, - 0x4a026203, 0x00000008, 0x0201f800, 0x00020a34, - 0x5c027000, 0x1c01f000, 0x8d3e7d0c, 0x04000006, - 0x59300407, 0x82000580, 0x00000013, 0x02000000, - 0x00108655, 0x598c000f, 0x4803c857, 0x81300580, - 0x04020004, 0x0201f800, 0x00106388, 0x040207ac, - 0x0201f800, 0x0010a7f0, 0x040007a9, 0x4803c856, - 0x0201f800, 0x00106018, 0x040007a5, 0x0401f79e, - 0x0201f800, 0x001085a4, 0x04020004, 0x0201f800, - 0x00106351, 0x0402079e, 0x0201f800, 0x0010e1ca, - 0x80c40040, 0x040207f2, 0x0401f799, 0x812e59c0, - 0x04000006, 0x0201f800, 0x001060fa, 0x0201f800, - 0x00100bd4, 0x0401f792, 0x59300004, 0x8c00053e, - 0x0400000d, 0x8c00050c, 0x0402000b, 0x59306c03, - 0x82340580, 0x000000d9, 0x04020004, 0x42000000, - 0x00000003, 0x0401f005, 0x42000000, 0x00000001, - 0x0401f002, 0x59300203, 0x1c01f000, 0x5931d822, - 0x58ef400a, 0x58ee580c, 0x58ec0008, 0x48074407, - 0x0801f800, 0x1c01f000, 0x4817c857, 0x4c000000, - 0x4c040000, 0x8c142d2a, 0x04000004, 0x5988011e, - 0x80000000, 0x4803111e, 0x8c142d2e, 0x04000004, - 0x5988011f, 0x80000000, 0x4803111f, 0x8c142d2c, - 0x04000013, 0x40140000, 0x82000500, 0x00070000, - 0x82000d80, 0x00030000, 0x0400000d, 0x82000d80, - 0x00040000, 0x0400000a, 0x82000d80, 0x00050000, - 0x04000007, 0x59880005, 0x80000000, 0x48031005, - 0x59880120, 0x80000000, 0x48031120, 0x5c000800, - 0x5c000000, 0x1c01f000, 0x4817c857, 0x4c000000, - 0x4c040000, 0x8c142d2a, 0x04000004, 0x59880121, - 0x80000000, 0x48031121, 0x8c142d2e, 0x04000004, - 0x59880122, 0x80000000, 0x48031122, 0x8c142d2c, - 0x04000013, 0x40140000, 0x82000500, 0x00070000, - 0x82000d80, 0x00030000, 0x0400000d, 0x82000d80, - 0x00040000, 0x0400000a, 0x82000d80, 0x00050000, - 0x04000007, 0x59880005, 0x80000000, 0x48031005, - 0x59880123, 0x80000000, 0x48031123, 0x5c000800, + 0x0010abd5, 0x0010ac81, 0x0010aace, 0x0010aace, + 0x0010ac81, 0x0010aace, 0x0010ac81, 0x0010aaca, + 0x0010ac81, 0x0010ac15, 0x41780800, 0x0401fa83, + 0x0201f000, 0x00020a10, 0x0201f800, 0x00108953, + 0x04000009, 0x4d2c0000, 0x59325809, 0x4a025a07, + 0x00000000, 0x497a5c07, 0x0201f800, 0x000203ab, + 0x5c025800, 0x0201f000, 0x00020a10, 0x0201f800, + 0x00108953, 0x0400003e, 0x83380580, 0x0000004a, + 0x0400002c, 0x83380580, 0x00000049, 0x0402019e, + 0x4d2c0000, 0x59325809, 0x592c0a05, 0x82040500, + 0x000000ff, 0x82000580, 0x0000001b, 0x04020019, + 0x592c0207, 0x8c00051c, 0x0402000f, 0x4a025a07, + 0x00000040, 0x497a5c07, 0x592c0000, 0x48026009, + 0x0201f800, 0x000203ab, 0x5c025800, 0x4a026203, + 0x00000007, 0x59300009, 0x800001c0, 0x04020082, + 0x1c01f000, 0x59a80073, 0x8400050a, 0x48035073, + 0x4a026203, 0x00000002, 0x5c025800, 0x1c01f000, + 0x4a025a07, 0x00000000, 0x497a5c07, 0x0201f800, + 0x000203ab, 0x5c025800, 0x0201f000, 0x00020a10, + 0x4933c857, 0x0201f800, 0x00106346, 0x0201f800, + 0x001060e2, 0x4d2c0000, 0x59325809, 0x4a025a07, + 0x00000001, 0x497a5c07, 0x0201f800, 0x000203ab, + 0x5c025800, 0x0201f000, 0x00020a10, 0x4803c856, + 0x0401f165, 0x0201f800, 0x00108953, 0x0400002c, + 0x83380480, 0x00000054, 0x04021004, 0x83380480, + 0x00000047, 0x0401f002, 0x81780040, 0x04001006, + 0x4d2c0000, 0x59325809, 0x0c01f823, 0x5c025800, + 0x1c01f000, 0x83380580, 0x000000dd, 0x04020152, + 0x4933c857, 0x0201f800, 0x00100bd5, 0x0201f800, + 0x00108953, 0x04000016, 0x592c0a07, 0x82040580, + 0x00000004, 0x04020006, 0x42000800, 0x00000001, + 0x0401fd6a, 0x0201f000, 0x00020a10, 0x4d2c0000, + 0x59325809, 0x59cc1207, 0x80081110, 0x4a025a07, + 0x00000003, 0x480a5c07, 0x0201f800, 0x000203ab, + 0x5c025800, 0x0201f000, 0x00020a10, 0x4803c856, + 0x0401f135, 0x0010ab79, 0x0010ab5a, 0x0010ac81, + 0x0010ac81, 0x0010ac81, 0x0010ac81, 0x0010ac81, + 0x0010ac81, 0x0010ac81, 0x0010ac81, 0x0010ac81, + 0x0010ac81, 0x0010ab5a, 0x59300812, 0x82040500, + 0xffff0000, 0x0402001c, 0x42001000, 0x00000000, + 0x592c0a07, 0x82040580, 0x00000004, 0x0402000e, + 0x82080580, 0x00000007, 0x04000007, 0x59300812, + 0x800409c0, 0x04000004, 0x4807c857, 0x42001000, + 0x00000015, 0x40080800, 0x0401fd38, 0x0201f000, + 0x00020a10, 0x59300812, 0x48065808, 0x480a5a07, + 0x497a5c07, 0x0201f800, 0x000203ab, 0x0201f000, + 0x00020a10, 0x4803c856, 0x42001000, 0x00000007, + 0x0401f7e4, 0x0201f800, 0x00108953, 0x0400001b, + 0x83380580, 0x000000d9, 0x040200ff, 0x59340408, + 0x48026006, 0x4a026403, 0x000000d9, 0x0201f800, + 0x00020154, 0x59306809, 0x58340207, 0x8c00051c, + 0x04020006, 0x42000800, 0x80000040, 0x4a026203, + 0x00000003, 0x0401f005, 0x42000800, 0x80000000, + 0x4a026203, 0x00000002, 0x4a026403, 0x000000d9, + 0x0201f000, 0x000209a3, 0x4803c856, 0x83380580, + 0x000000dd, 0x040200e4, 0x42001000, 0x0000800f, + 0x42001800, 0x00000005, 0x59cc2207, 0x80102110, + 0x0201f000, 0x001031f5, 0x83380480, 0x000000df, + 0x04021004, 0x83380480, 0x000000d0, 0x0401f002, + 0x81780040, 0x040010d4, 0x4933c857, 0x493bc857, + 0x59340a08, 0x48066006, 0x0c01f001, 0x0010abc7, + 0x0010abc3, 0x0010abc7, 0x0010abc7, 0x0010abcd, + 0x0010abc5, 0x0010abcd, 0x0010abc7, 0x0010abc2, + 0x0010abc2, 0x0010abc2, 0x0010abc2, 0x0010abc2, + 0x0010abc2, 0x0010abcd, 0x0401f0bf, 0x59340408, + 0x48026006, 0x0201f800, 0x00020154, 0x4a026203, + 0x00000002, 0x493a6403, 0x42000800, 0x80000000, + 0x0401f4e5, 0x0201f800, 0x00020111, 0x4a026203, + 0x00000004, 0x493a6403, 0x42000800, 0x80000000, + 0x0401f4dd, 0x59cc0207, 0x59cc0c07, 0x59cc1008, + 0x59cc1809, 0x59cc220a, 0x59cc2c0a, 0x59cc300b, + 0x4a026c00, 0x00000404, 0x48026c04, 0x48038893, + 0x48035012, 0x48066a04, 0x480a6806, 0x480e6807, + 0x48126a08, 0x48166c08, 0x8c183500, 0x0400000d, + 0x59cc200d, 0x59cc280d, 0x4813c857, 0x4817c857, + 0x59cc200c, 0x42001000, 0x0000800f, 0x42001800, + 0x00000001, 0x901029c0, 0x0201f800, 0x001031f6, + 0x59a80873, 0x42001800, 0x00000003, 0x84040d4e, + 0x59342007, 0x8c183502, 0x0402000c, 0x82040d00, + 0xffffff7b, 0x8c183504, 0x04020004, 0x42001800, + 0x00000002, 0x0401f004, 0x42001800, 0x00000004, + 0x84040d44, 0x59342006, 0x48075073, 0x42001000, + 0x0000800f, 0x82102d00, 0xffff0000, 0x80142920, + 0x82102500, 0x0000ffff, 0x0201f800, 0x001031f6, + 0x59c80040, 0x84000534, 0x48039040, 0x0201f000, + 0x00020a10, 0x0201f800, 0x00108953, 0x04000023, + 0x4d2c0000, 0x59325809, 0x592c0a05, 0x82040d00, + 0x000000ff, 0x82040580, 0x0000001b, 0x04020019, + 0x592c0a07, 0x8c040d04, 0x04020003, 0x0201f800, + 0x0010a709, 0x59340009, 0x4802580a, 0x8c040d06, + 0x04020007, 0x48026806, 0x59a80073, 0x8400054c, + 0x84000508, 0x48035073, 0x0401f002, 0x48026807, + 0x4a025a07, 0x00000000, 0x497a5c07, 0x0201f800, + 0x000203ab, 0x5c025800, 0x0201f000, 0x00020a10, + 0x497a5808, 0x0401f7f7, 0x4803c856, 0x0401f046, + 0x59300a03, 0x82040480, 0x00000009, 0x04021004, + 0x82040480, 0x00000001, 0x0401f002, 0x81780040, + 0x0c021002, 0x0401f03c, 0x0010ac4e, 0x0010ac81, + 0x0010ac81, 0x0010ac81, 0x0010ac81, 0x0010ac81, + 0x0010ac81, 0x0010ac5a, 0x83380580, 0x00000013, + 0x04000008, 0x83380580, 0x00000014, 0x0402002e, + 0x59300c03, 0x4807c857, 0x0201f800, 0x00106102, + 0x0201f000, 0x00020a10, 0x83380580, 0x000000da, + 0x04020025, 0x4933c857, 0x493bc857, 0x59cc0808, + 0x59cc1007, 0x59a81873, 0x820c1d00, 0xfffffffc, + 0x82040580, 0x00000000, 0x04020002, 0x840c1d42, + 0x82080580, 0x00000000, 0x04020002, 0x840c1d40, + 0x480f5073, 0x480fc857, 0x836c0580, 0x00000001, + 0x0400000a, 0x4202d800, 0x00000004, 0x4a035038, + 0x00000000, 0x497b5058, 0x42000000, 0x00000080, + 0x0201f800, 0x00101365, 0x4a026403, 0x000000d8, + 0x4a026203, 0x00000001, 0x42000800, 0x80000040, + 0x0401f431, 0x4933c857, 0x493bc857, 0x59300203, + 0x4803c857, 0x59300403, 0x4803c857, 0x42000000, + 0x0010bdad, 0x0401f987, 0x1c01f000, 0x4933c857, + 0x4d2c0000, 0x4d3c0000, 0x417a5800, 0x417a7800, + 0x0201f800, 0x00108953, 0x04000003, 0x59325809, + 0x592e7a09, 0x0401f81a, 0x82000540, 0x00000001, + 0x5c027800, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x4d2c0000, 0x4d3c0000, 0x42027800, 0x00000040, + 0x42000000, 0x0010bda8, 0x0401f96e, 0x417a5800, + 0x0201f800, 0x00108953, 0x04000005, 0x59325809, + 0x592e7a09, 0x853e7d4c, 0x493e5a09, 0x0401f804, + 0x5c027800, 0x5c025800, 0x1c01f000, 0x0201f800, + 0x001061b2, 0x4df00000, 0x0401f88b, 0x4803c857, + 0x82000c80, 0x00000009, 0x04021006, 0x0c01f808, + 0x5c03e000, 0x02000800, 0x0010619f, 0x1c01f000, + 0x42000000, 0x00000006, 0x0401f7f9, 0x0010ad14, + 0x0010ad15, 0x0010acce, 0x0010ad2b, 0x0010ad36, + 0x0010acc8, 0x0010acc8, 0x0010acc8, 0x0010ad14, + 0x4d380000, 0x417a7000, 0x0401ffb7, 0x5c027000, + 0x0201f000, 0x00107144, 0x812e59c0, 0x04000021, + 0x42001000, 0x00000002, 0x833c0500, 0x00000081, + 0x04020007, 0x42001000, 0x00000006, 0x8d3e7d0c, + 0x04020003, 0x42001000, 0x00000004, 0x592c0a07, + 0x82040580, 0x00000004, 0x04020006, 0x40080800, + 0x0201f800, 0x0010a8a6, 0x0201f000, 0x00107144, + 0x480a5a07, 0x0201f800, 0x000203ab, 0x59300403, + 0x82000580, 0x000000d0, 0x04020004, 0x5930100a, + 0x4a001400, 0x00000707, 0x0201f000, 0x00107144, + 0x59300c03, 0x82040580, 0x000000d7, 0x04020005, + 0x42000800, 0x00000004, 0x0401f858, 0x0401f7f0, + 0x8d3e7d0c, 0x040007ee, 0x5932680a, 0x59300816, + 0x59340412, 0x80040580, 0x04020007, 0x42000000, + 0x0010bda9, 0x0401f90f, 0x0201f800, 0x0010a709, + 0x0401f7e3, 0x4933c857, 0x80040800, 0x48066016, + 0x4d380000, 0x59327403, 0x83380580, 0x000000d0, + 0x04020003, 0x4a038893, 0x00000001, 0x4a026203, + 0x00000008, 0x0201f800, 0x00020a34, 0x5c027000, + 0x1c01f000, 0x8d3e7d0c, 0x04000006, 0x59300407, + 0x82000580, 0x00000013, 0x02000000, 0x0010870a, + 0x598c000f, 0x4803c857, 0x81300580, 0x04020004, + 0x0201f800, 0x0010642d, 0x040207ac, 0x0201f800, + 0x0010a8e3, 0x040007a9, 0x4803c856, 0x0201f800, + 0x001060bd, 0x040007a5, 0x0401f79e, 0x0201f800, + 0x00108659, 0x04020004, 0x0201f800, 0x001063f6, + 0x0402079e, 0x0201f800, 0x0010e2da, 0x80c40040, + 0x040207f2, 0x0401f799, 0x812e59c0, 0x04000006, + 0x0201f800, 0x0010619f, 0x0201f800, 0x00100bd5, + 0x0401f792, 0x59300004, 0x8c00053e, 0x0400000d, + 0x8c00050c, 0x0402000b, 0x59306c03, 0x82340580, + 0x000000d9, 0x04020004, 0x42000000, 0x00000003, + 0x0401f005, 0x42000000, 0x00000001, 0x0401f002, + 0x59300203, 0x1c01f000, 0x5931d822, 0x58ef400a, + 0x58ee580c, 0x58ec0008, 0x48074407, 0x0801f800, + 0x1c01f000, 0x4817c857, 0x4c000000, 0x4c040000, + 0x8c142d2a, 0x04000004, 0x5988011e, 0x80000000, + 0x4803111e, 0x8c142d2e, 0x04000004, 0x5988011f, + 0x80000000, 0x4803111f, 0x8c142d2c, 0x04000013, + 0x40140000, 0x82000500, 0x00070000, 0x82000d80, + 0x00030000, 0x0400000d, 0x82000d80, 0x00040000, + 0x0400000a, 0x82000d80, 0x00050000, 0x04000007, + 0x59880005, 0x80000000, 0x48031005, 0x59880120, + 0x80000000, 0x48031120, 0x5c000800, 0x5c000000, + 0x1c01f000, 0x4817c857, 0x4c000000, 0x4c040000, + 0x8c142d2a, 0x04000004, 0x59880121, 0x80000000, + 0x48031121, 0x8c142d2e, 0x04000004, 0x59880122, + 0x80000000, 0x48031122, 0x8c142d2c, 0x04000013, + 0x40140000, 0x82000500, 0x00070000, 0x82000d80, + 0x00030000, 0x0400000d, 0x82000d80, 0x00040000, + 0x0400000a, 0x82000d80, 0x00050000, 0x04000007, + 0x59880005, 0x80000000, 0x48031005, 0x59880123, + 0x80000000, 0x48031123, 0x5c000800, 0x5c000000, + 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d2c, + 0x04000004, 0x5988010c, 0x80000000, 0x4803110c, + 0x8c040d2a, 0x04000004, 0x5988010d, 0x80000000, + 0x4803110d, 0x8c040d28, 0x04000004, 0x5988010e, + 0x80000000, 0x4803110e, 0x8c040d26, 0x04000004, + 0x5988010f, 0x80000000, 0x4803110f, 0x8c040d24, + 0x04000004, 0x59880110, 0x80000000, 0x48031110, + 0x8c040d22, 0x04000004, 0x59880111, 0x80000000, + 0x48031111, 0x8c040d20, 0x04000004, 0x59880112, + 0x80000000, 0x48031112, 0x5c000000, 0x1c01f000, + 0x4807c857, 0x4c000000, 0x59880113, 0x80000000, + 0x48031113, 0x5c000000, 0x1c01f000, 0x4807c857, + 0x4c000000, 0x8c040d1c, 0x04000004, 0x59880114, + 0x80000000, 0x48031114, 0x8c040d1a, 0x04000004, + 0x59880115, 0x80000000, 0x48031115, 0x5c000000, + 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d18, + 0x04000004, 0x59880116, 0x80000000, 0x48031116, + 0x8c040d16, 0x04000004, 0x59880117, 0x80000000, + 0x48031117, 0x8c040d14, 0x04000004, 0x59880118, + 0x80000000, 0x48031118, 0x5c000000, 0x1c01f000, + 0x4807c857, 0x4c000000, 0x8c040d10, 0x04000004, + 0x59880119, 0x80000000, 0x48031119, 0x8c040d0c, + 0x04000004, 0x5988011a, 0x80000000, 0x4803111a, 0x5c000000, 0x1c01f000, 0x4807c857, 0x4c000000, - 0x8c040d2c, 0x04000004, 0x5988010c, 0x80000000, - 0x4803110c, 0x8c040d2a, 0x04000004, 0x5988010d, - 0x80000000, 0x4803110d, 0x8c040d28, 0x04000004, - 0x5988010e, 0x80000000, 0x4803110e, 0x8c040d26, - 0x04000004, 0x5988010f, 0x80000000, 0x4803110f, - 0x8c040d24, 0x04000004, 0x59880110, 0x80000000, - 0x48031110, 0x8c040d22, 0x04000004, 0x59880111, - 0x80000000, 0x48031111, 0x8c040d20, 0x04000004, - 0x59880112, 0x80000000, 0x48031112, 0x5c000000, - 0x1c01f000, 0x4807c857, 0x4c000000, 0x59880113, - 0x80000000, 0x48031113, 0x5c000000, 0x1c01f000, - 0x4807c857, 0x4c000000, 0x8c040d1c, 0x04000004, - 0x59880114, 0x80000000, 0x48031114, 0x8c040d1a, - 0x04000004, 0x59880115, 0x80000000, 0x48031115, - 0x5c000000, 0x1c01f000, 0x4807c857, 0x4c000000, - 0x8c040d18, 0x04000004, 0x59880116, 0x80000000, - 0x48031116, 0x8c040d16, 0x04000004, 0x59880117, - 0x80000000, 0x48031117, 0x8c040d14, 0x04000004, - 0x59880118, 0x80000000, 0x48031118, 0x5c000000, - 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d10, - 0x04000004, 0x59880119, 0x80000000, 0x48031119, - 0x8c040d0c, 0x04000004, 0x5988011a, 0x80000000, - 0x4803111a, 0x5c000000, 0x1c01f000, 0x4807c857, - 0x4c000000, 0x8c040d08, 0x04000004, 0x5988011b, - 0x80000000, 0x4803111b, 0x8c040d04, 0x04000004, - 0x5988011c, 0x80000000, 0x4803111c, 0x5c000000, - 0x1c01f000, 0x4807c856, 0x4c000000, 0x598800e5, - 0x80000000, 0x480310e5, 0x5c000000, 0x1c01f000, - 0x40680000, 0x5c036000, 0x4db00000, 0x49b3c857, - 0x4c040000, 0x50000800, 0x80040800, 0x04001002, - 0x44040000, 0x5c000800, 0x1c01f000, 0x480fc857, - 0x4c000000, 0x820c0580, 0x00000000, 0x04020004, - 0x42000000, 0x0010bbdf, 0x0401f014, 0x820c0580, - 0x00001001, 0x04020004, 0x42000000, 0x0010bbe0, - 0x0401f00e, 0x820c0580, 0x00001002, 0x04020004, - 0x42000000, 0x0010bbe1, 0x0401f008, 0x820c0c80, - 0x0000201c, 0x02021800, 0x0010032d, 0x820c0500, - 0x0000001f, 0x0c01f804, 0x0401ffdb, 0x5c000000, - 0x1c01f000, 0x0010ad61, 0x0010ad64, 0x0010ad67, - 0x0010ad6a, 0x0010ad6d, 0x0010ad70, 0x0010ad73, - 0x0010ad76, 0x0010ad79, 0x0010ad7c, 0x0010ad7f, - 0x0010ad82, 0x0010ad85, 0x0010ad88, 0x0010ad8b, - 0x0010ad8e, 0x0010ad91, 0x0010ad94, 0x0010ad97, - 0x0010ad9a, 0x0010ad9d, 0x0010ada0, 0x0010ada3, - 0x0010ada6, 0x0010ada9, 0x0010adac, 0x0010adaf, - 0x0010adb2, 0x42000000, 0x0010bbe2, 0x1c01f000, - 0x42000000, 0x0010bbe3, 0x1c01f000, 0x42000000, - 0x0010bbe4, 0x1c01f000, 0x42000000, 0x0010bbe5, - 0x1c01f000, 0x42000000, 0x0010bbe6, 0x1c01f000, - 0x42000000, 0x0010bbe7, 0x1c01f000, 0x42000000, - 0x0010bbe8, 0x1c01f000, 0x42000000, 0x0010bbe9, - 0x1c01f000, 0x42000000, 0x0010bbea, 0x1c01f000, - 0x42000000, 0x0010bbeb, 0x1c01f000, 0x42000000, - 0x0010bbec, 0x1c01f000, 0x42000000, 0x0010bbed, - 0x1c01f000, 0x42000000, 0x0010bbee, 0x1c01f000, - 0x42000000, 0x0010bbef, 0x1c01f000, 0x42000000, - 0x0010bbf0, 0x1c01f000, 0x42000000, 0x0010bbf1, - 0x1c01f000, 0x42000000, 0x0010bbf2, 0x1c01f000, - 0x42000000, 0x0010bbf3, 0x1c01f000, 0x42000000, - 0x0010bbf4, 0x1c01f000, 0x42000000, 0x0010bbf5, - 0x1c01f000, 0x42000000, 0x0010bbf6, 0x1c01f000, - 0x42000000, 0x0010bbf7, 0x1c01f000, 0x42000000, - 0x0010bbf8, 0x1c01f000, 0x42000000, 0x0010bbf9, - 0x1c01f000, 0x42000000, 0x0010bbfa, 0x1c01f000, - 0x42000000, 0x0010bbfb, 0x1c01f000, 0x42000000, - 0x0010bbfc, 0x1c01f000, 0x42000000, 0x0010bbfd, - 0x1c01f000, 0x480fc857, 0x4c000000, 0x820c0580, - 0x00000001, 0x04020004, 0x42000000, 0x0010bb62, - 0x0401f012, 0x820c0580, 0x00000002, 0x04020004, - 0x42000000, 0x0010bb63, 0x0401f00c, 0x820c0580, - 0x00000003, 0x04020004, 0x42000000, 0x0010bb64, - 0x0401f006, 0x820c0580, 0x00000004, 0x04020004, - 0x42000000, 0x0010bb65, 0x0401ff4f, 0x5c000000, - 0x1c01f000, 0x4c000000, 0x59a8021b, 0x4803c857, - 0x8c000502, 0x04000010, 0x8c000506, 0x04000004, - 0x42000000, 0x0010bb6d, 0x0401f012, 0x8c00050a, - 0x04000004, 0x42000000, 0x0010bb6c, 0x0401f00d, - 0x8c000508, 0x04000004, 0x42000000, 0x0010bb6f, - 0x0401f008, 0x0201f800, 0x00104716, 0x04000006, - 0x8c000506, 0x04020004, 0x42000000, 0x0010bb6e, - 0x0401ff31, 0x5c000000, 0x1c01f000, 0x8058b1c0, - 0x02000800, 0x0010032d, 0x5450a800, 0x8050a000, - 0x8054a800, 0x8058b040, 0x040207fc, 0x1c01f000, - 0x8058b1c0, 0x02000800, 0x0010032d, 0x4450a800, - 0x8054a800, 0x8058b040, 0x040207fd, 0x1c01f000, - 0x4813c857, 0x4817c857, 0x40140000, 0x80100480, - 0x02021800, 0x0010032d, 0x497bc841, 0x42007800, - 0x000000ff, 0x40100000, 0x80140480, 0x82006d00, - 0xffffff00, 0x04020002, 0x40007800, 0x4813c840, - 0x483fc842, 0x04011000, 0x40100000, 0x803c2400, - 0x40100000, 0x80140580, 0x040207f3, 0x45782800, - 0x1c01f000, 0x8058b1c0, 0x02000800, 0x0010032d, - 0x50500000, 0x9c0001c0, 0x4400a800, 0x8050a000, - 0x8054a800, 0x8058b040, 0x040207fa, 0x1c01f000, - 0x4c000000, 0x59a80007, 0x8c00051c, 0x5c000000, - 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, - 0x04020003, 0x42018800, 0x00000000, 0x1c01f000, - 0x59a80007, 0x8c000518, 0x1c01f000, 0x42006800, - 0x00000064, 0x80346840, 0x04000007, 0x4a030000, - 0x00000001, 0x40000000, 0x59807000, 0x8c387500, - 0x040007f9, 0x1c01f000, 0x00000001, 0x00000002, - 0x00000004, 0x00000008, 0x00000010, 0x00000020, - 0x00000040, 0x00000080, 0x00000100, 0x00000200, - 0x00000400, 0x00000800, 0x00001000, 0x00002000, - 0x00004000, 0x00008000, 0x00010000, 0x4a03506e, - 0x00000026, 0x4a03506f, 0x0000001d, 0x4a035070, - 0x00000001, 0x4a035071, 0x00000000, 0x59e00002, - 0x8c00051e, 0x42000000, 0x7ffe00fe, 0x04000003, - 0x42000000, 0x7ffe01fe, 0x50000800, 0x48075047, - 0x80040920, 0x82040580, 0x0000013e, 0x0402000b, - 0x59a8006d, 0x84000548, 0x4803506d, 0x4a03506e, - 0x0000005a, 0x4a03506f, 0x00000058, 0x4a035071, - 0x0000000f, 0x0401f045, 0x82040580, 0x0000013f, - 0x0400000a, 0x82040580, 0x0000014e, 0x04000007, - 0x82040580, 0x00000155, 0x04000004, 0x82040580, - 0x00000156, 0x0402000b, 0x59a8006d, 0x8400054a, - 0x4803506d, 0x4a03506e, 0x00000055, 0x4a03506f, - 0x00000052, 0x4a035071, 0x00000009, 0x0401f02f, - 0x59e00003, 0x82000500, 0x00030000, 0x82000580, - 0x00000000, 0x04020029, 0x82040580, 0x00000147, - 0x04000019, 0x82040580, 0x0000012c, 0x04000016, - 0x82040580, 0x0000012a, 0x04000007, 0x82040580, - 0x0000012b, 0x04000004, 0x82040580, 0x00000145, - 0x0402001a, 0x59a8006d, 0x84000546, 0x4803506d, - 0x4a03506e, 0x00000043, 0x4a03506f, 0x0000003e, - 0x4a035070, 0x00000025, 0x4a035071, 0x00000001, - 0x0401f00c, 0x59a8006d, 0x84000544, 0x4803506d, - 0x4a03506e, 0x00000043, 0x4a03506f, 0x0000003e, - 0x4a035070, 0x00000025, 0x4a035071, 0x00000001, - 0x4a0378e4, 0x000c0000, 0x59a8006d, 0x8c000502, - 0x04000005, 0x82000500, 0x00000030, 0x02000800, - 0x0010032d, 0x1c01f000, 0xaa818c01, - 0x00000000, 0x00000000, 0x00110000, 0x000033d6, + 0x8c040d08, 0x04000004, 0x5988011b, 0x80000000, + 0x4803111b, 0x8c040d04, 0x04000004, 0x5988011c, + 0x80000000, 0x4803111c, 0x5c000000, 0x1c01f000, + 0x4807c856, 0x4c000000, 0x598800e5, 0x80000000, + 0x480310e5, 0x5c000000, 0x1c01f000, 0x40680000, + 0x5c036000, 0x4db00000, 0x49b3c857, 0x4c040000, + 0x50000800, 0x80040800, 0x04001002, 0x44040000, + 0x5c000800, 0x1c01f000, 0x480fc857, 0x4c000000, + 0x820c0580, 0x00000000, 0x04020004, 0x42000000, + 0x0010bcdf, 0x0401f014, 0x820c0580, 0x00001001, + 0x04020004, 0x42000000, 0x0010bce0, 0x0401f00e, + 0x820c0580, 0x00001002, 0x04020004, 0x42000000, + 0x0010bce1, 0x0401f008, 0x820c0c80, 0x0000201c, + 0x02021800, 0x0010032d, 0x820c0500, 0x0000001f, + 0x0c01f804, 0x0401ffdb, 0x5c000000, 0x1c01f000, + 0x0010ae54, 0x0010ae57, 0x0010ae5a, 0x0010ae5d, + 0x0010ae60, 0x0010ae63, 0x0010ae66, 0x0010ae69, + 0x0010ae6c, 0x0010ae6f, 0x0010ae72, 0x0010ae75, + 0x0010ae78, 0x0010ae7b, 0x0010ae7e, 0x0010ae81, + 0x0010ae84, 0x0010ae87, 0x0010ae8a, 0x0010ae8d, + 0x0010ae90, 0x0010ae93, 0x0010ae96, 0x0010ae99, + 0x0010ae9c, 0x0010ae9f, 0x0010aea2, 0x0010aea5, + 0x42000000, 0x0010bce2, 0x1c01f000, 0x42000000, + 0x0010bce3, 0x1c01f000, 0x42000000, 0x0010bce4, + 0x1c01f000, 0x42000000, 0x0010bce5, 0x1c01f000, + 0x42000000, 0x0010bce6, 0x1c01f000, 0x42000000, + 0x0010bce7, 0x1c01f000, 0x42000000, 0x0010bce8, + 0x1c01f000, 0x42000000, 0x0010bce9, 0x1c01f000, + 0x42000000, 0x0010bcea, 0x1c01f000, 0x42000000, + 0x0010bceb, 0x1c01f000, 0x42000000, 0x0010bcec, + 0x1c01f000, 0x42000000, 0x0010bced, 0x1c01f000, + 0x42000000, 0x0010bcee, 0x1c01f000, 0x42000000, + 0x0010bcef, 0x1c01f000, 0x42000000, 0x0010bcf0, + 0x1c01f000, 0x42000000, 0x0010bcf1, 0x1c01f000, + 0x42000000, 0x0010bcf2, 0x1c01f000, 0x42000000, + 0x0010bcf3, 0x1c01f000, 0x42000000, 0x0010bcf4, + 0x1c01f000, 0x42000000, 0x0010bcf5, 0x1c01f000, + 0x42000000, 0x0010bcf6, 0x1c01f000, 0x42000000, + 0x0010bcf7, 0x1c01f000, 0x42000000, 0x0010bcf8, + 0x1c01f000, 0x42000000, 0x0010bcf9, 0x1c01f000, + 0x42000000, 0x0010bcfa, 0x1c01f000, 0x42000000, + 0x0010bcfb, 0x1c01f000, 0x42000000, 0x0010bcfc, + 0x1c01f000, 0x42000000, 0x0010bcfd, 0x1c01f000, + 0x480fc857, 0x4c000000, 0x820c0580, 0x00000001, + 0x04020004, 0x42000000, 0x0010bc62, 0x0401f012, + 0x820c0580, 0x00000002, 0x04020004, 0x42000000, + 0x0010bc63, 0x0401f00c, 0x820c0580, 0x00000003, + 0x04020004, 0x42000000, 0x0010bc64, 0x0401f006, + 0x820c0580, 0x00000004, 0x04020004, 0x42000000, + 0x0010bc65, 0x0401ff4f, 0x5c000000, 0x1c01f000, + 0x4c000000, 0x59a8021b, 0x4803c857, 0x8c000502, + 0x04000010, 0x8c000506, 0x04000004, 0x42000000, + 0x0010bc6d, 0x0401f012, 0x8c00050a, 0x04000004, + 0x42000000, 0x0010bc6c, 0x0401f00d, 0x8c000508, + 0x04000004, 0x42000000, 0x0010bc6f, 0x0401f008, + 0x0201f800, 0x00104755, 0x04000006, 0x8c000506, + 0x04020004, 0x42000000, 0x0010bc6e, 0x0401ff31, + 0x5c000000, 0x1c01f000, 0x8058b1c0, 0x02000800, + 0x0010032d, 0x5450a800, 0x8050a000, 0x8054a800, + 0x8058b040, 0x040207fc, 0x1c01f000, 0x8058b1c0, + 0x02000800, 0x0010032d, 0x4450a800, 0x8054a800, + 0x8058b040, 0x040207fd, 0x1c01f000, 0x4813c857, + 0x4817c857, 0x40140000, 0x80100480, 0x02021800, + 0x0010032d, 0x497bc841, 0x42007800, 0x000000ff, + 0x40100000, 0x80140480, 0x82006d00, 0xffffff00, + 0x04020002, 0x40007800, 0x4813c840, 0x483fc842, + 0x04011000, 0x40100000, 0x803c2400, 0x40100000, + 0x80140580, 0x040207f3, 0x45782800, 0x1c01f000, + 0x8058b1c0, 0x02000800, 0x0010032d, 0x50500000, + 0x9c0001c0, 0x4400a800, 0x8050a000, 0x8054a800, + 0x8058b040, 0x040207fa, 0x1c01f000, 0x4c000000, + 0x59a80007, 0x8c00051c, 0x5c000000, 0x1c01f000, + 0x0401f807, 0x42018800, 0x00000001, 0x04020003, + 0x42018800, 0x00000000, 0x1c01f000, 0x59a80007, + 0x8c000518, 0x1c01f000, 0x42006800, 0x00000064, + 0x80346840, 0x04000007, 0x4a030000, 0x00000001, + 0x40000000, 0x59807000, 0x8c387500, 0x040007f9, + 0x1c01f000, 0x59a80006, 0x8c000516, 0x1c01f000, + 0x00000001, 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, + 0x00000100, 0x00000200, 0x00000400, 0x00000800, + 0x00001000, 0x00002000, 0x00004000, 0x00008000, + 0x00010000, 0x4a03506e, 0x00000026, 0x4a03506f, + 0x0000001d, 0x4a035070, 0x00000001, 0x4a035071, + 0x00000000, 0x59e00002, 0x8c00051e, 0x42000000, + 0x7ffe00fe, 0x04000003, 0x42000000, 0x7ffe01fe, + 0x50000800, 0x48075047, 0x80040920, 0x82040580, + 0x0000013e, 0x0402000b, 0x59a8006d, 0x84000548, + 0x4803506d, 0x4a03506e, 0x0000005a, 0x4a03506f, + 0x00000058, 0x4a035071, 0x0000000f, 0x0401f045, + 0x82040580, 0x0000013f, 0x0400000a, 0x82040580, + 0x0000014e, 0x04000007, 0x82040580, 0x00000155, + 0x04000004, 0x82040580, 0x00000156, 0x0402000b, + 0x59a8006d, 0x8400054a, 0x4803506d, 0x4a03506e, + 0x00000055, 0x4a03506f, 0x00000052, 0x4a035071, + 0x00000009, 0x0401f02f, 0x59e00003, 0x82000500, + 0x00030000, 0x82000580, 0x00000000, 0x04020029, + 0x82040580, 0x00000147, 0x04000019, 0x82040580, + 0x0000012c, 0x04000016, 0x82040580, 0x0000012a, + 0x04000007, 0x82040580, 0x0000012b, 0x04000004, + 0x82040580, 0x00000145, 0x0402001a, 0x59a8006d, + 0x84000546, 0x4803506d, 0x4a03506e, 0x00000043, + 0x4a03506f, 0x0000003e, 0x4a035070, 0x00000025, + 0x4a035071, 0x00000001, 0x0401f00c, 0x59a8006d, + 0x84000544, 0x4803506d, 0x4a03506e, 0x00000043, + 0x4a03506f, 0x0000003e, 0x4a035070, 0x00000025, + 0x4a035071, 0x00000001, 0x4a0378e4, 0x000c0000, + 0x59a8006d, 0x8c000502, 0x04000005, 0x82000500, + 0x00000030, 0x02000800, 0x0010032d, 0x1c01f000, + 0x2d884b25, + 0x00000000, 0x00000000, 0x00110000, 0x000033e5, 0x00000000, 0x00000000, 0x00020000, 0x00000b53, 0x836c0580, 0x00000003, 0x02020000, 0x001002bc, - 0x42000000, 0x0010b812, 0x50000000, 0x800001c0, + 0x42000000, 0x0010b912, 0x50000000, 0x800001c0, 0x04020a37, 0x0401f9e1, 0x0201f800, 0x0002058a, 0x0401fbb7, 0x0201f800, 0x0002099a, 0x0201f800, 0x00020814, 0x0401f7ef, 0x42007000, 0x00020b54, @@ -11246,7 +11303,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x0010032d, 0x42007000, 0x00020b54, 0x58380000, 0x82001480, 0x00000004, 0x0c001004, 0x0201f800, 0x0010032d, 0x1c01f000, 0x0002002c, 0x00020072, - 0x0002007b, 0x00100f6f, 0x82040d00, 0x43000f80, + 0x0002007b, 0x00100f70, 0x82040d00, 0x43000f80, 0x02020000, 0x00100626, 0x58380002, 0x80000540, 0x0400000a, 0x0201f000, 0x00100618, 0x82040d00, 0x43000f80, 0x02020000, 0x00100626, 0x58380002, @@ -11256,8 +11313,8 @@ static const uint32_t isp_2400_risc_code[] = { 0x80040400, 0x58300807, 0x48006006, 0x82040c40, 0x00000000, 0x48046007, 0x4030d000, 0x0809f800, 0x0401f792, 0x59b800ea, 0x82000d00, 0xf0000038, - 0x02020000, 0x00100765, 0x8c000510, 0x02000000, - 0x00100764, 0x59ba60e0, 0x81300182, 0x04021042, + 0x02020000, 0x00100763, 0x8c000510, 0x02000000, + 0x00100762, 0x59ba60e0, 0x81300182, 0x04021042, 0x04002028, 0x8532653e, 0x59300407, 0x82000580, 0x00000003, 0x04020020, 0x59300203, 0x82000580, 0x00000004, 0x0402001c, 0x59325809, 0x59300004, @@ -11266,8 +11323,8 @@ static const uint32_t isp_2400_risc_code[] = { 0x00020a10, 0x5934000f, 0x5934140b, 0x80081040, 0x04001002, 0x480a6c0b, 0x80000540, 0x04020a6c, 0x59b800ea, 0x8c000510, 0x040207df, 0x1c01f000, - 0x0201f800, 0x0010644d, 0x040007ef, 0x0201f000, - 0x0010075a, 0x42027000, 0x00000055, 0x0401f022, + 0x0201f800, 0x001064f2, 0x040007ef, 0x0201f000, + 0x00100758, 0x42027000, 0x00000055, 0x0401f022, 0x83326500, 0x3fffffff, 0x59300407, 0x82000580, 0x00000003, 0x04020011, 0x59325809, 0x5932680a, 0x4a025a05, 0x00000103, 0x497a580a, 0x0401fad8, @@ -11275,46 +11332,46 @@ static const uint32_t isp_2400_risc_code[] = { 0x80081040, 0x04001002, 0x480a6c0b, 0x80000540, 0x04020a4b, 0x0401f7df, 0x42027000, 0x00000054, 0x0401f009, 0x83300500, 0x60000000, 0x04000016, - 0x81326580, 0x8000013a, 0x82000400, 0x0010076b, + 0x81326580, 0x8000013a, 0x82000400, 0x00100769, 0x50027000, 0x59300c07, 0x82040580, 0x00000002, - 0x02000000, 0x0010075a, 0x59300004, 0x8c00053e, + 0x02000000, 0x00100758, 0x59300004, 0x8c00053e, 0x04020004, 0x0201f800, 0x00020a34, 0x0401f7c9, - 0x0201f800, 0x0010644d, 0x040007fb, 0x0201f000, - 0x0010075a, 0x83300500, 0x1f000000, 0x02000000, - 0x0010075d, 0x81326580, 0x80000130, 0x82000c80, + 0x0201f800, 0x001064f2, 0x040007fb, 0x0201f000, + 0x00100758, 0x83300500, 0x1f000000, 0x02000000, + 0x0010075b, 0x81326580, 0x80000130, 0x82000c80, 0x00000014, 0x02021800, 0x0010032d, 0x1201f000, - 0x0010076f, 0x82000500, 0xf0000000, 0x82040d00, + 0x0010076d, 0x82000500, 0xf0000000, 0x82040d00, 0x0fffffff, 0x80040d40, 0x4807c857, 0x59b800ea, - 0x8c000516, 0x02020000, 0x00100871, 0x480770e1, + 0x8c000516, 0x02020000, 0x0010086f, 0x480770e1, 0x1c01f000, 0x59325809, 0x412c7000, 0x58380a05, - 0x82040500, 0x0000000f, 0x82000c00, 0x00100e39, - 0x50044000, 0x0c01f001, 0x00100afc, 0x00100afc, - 0x0002012a, 0x00100afc, 0x00100afc, 0x00100afc, - 0x00100afc, 0x00100afc, 0x0002013a, 0x00100b25, - 0x00100afc, 0x00100afe, 0x00100b13, 0x00100afc, - 0x00100afc, 0x00100afc, 0x5838040b, 0x8c000500, + 0x82040500, 0x0000000f, 0x82000c00, 0x00100e3a, + 0x50044000, 0x0c01f001, 0x00100afd, 0x00100afd, + 0x0002012a, 0x00100afd, 0x00100afd, 0x00100afd, + 0x00100afd, 0x00100afd, 0x0002013a, 0x00100b26, + 0x00100afd, 0x00100aff, 0x00100b14, 0x00100afd, + 0x00100afd, 0x00100afd, 0x5838040b, 0x8c000500, 0x02000800, 0x0010032d, 0x50200000, 0x80387c00, 0x583c1002, 0x583c2800, 0x583c2001, 0x58380a08, 0x58383010, 0x59303808, 0x58384c09, 0x5838000e, 0x48026013, 0x0401f010, 0x5838020b, 0x8c000502, - 0x02000000, 0x00100afc, 0x50200000, 0x80387c00, + 0x02000000, 0x00100afd, 0x50200000, 0x80387c00, 0x583c2800, 0x583c2001, 0x583c1002, 0x592c0a08, 0x592c4c09, 0x592c3010, 0x59303808, 0x497a6013, 0x497a6014, 0x4816600f, 0x48126010, 0x480a6011, 0x481a6012, 0x80040840, 0x4806600e, 0x02020000, - 0x00100b52, 0x841c3d40, 0x481e6008, 0x1c01f000, + 0x00100b53, 0x841c3d40, 0x481e6008, 0x1c01f000, 0x4d2c0000, 0x59325809, 0x592c0a05, 0x4807c857, 0x82040d00, 0x000000ff, 0x82040500, 0x0000000f, - 0x1201f000, 0x00100ca6, 0x41787800, 0x59325809, - 0x592c0c0b, 0x8c040d02, 0x02000000, 0x00100ce7, + 0x1201f000, 0x00100ca7, 0x41787800, 0x59325809, + 0x592c0c0b, 0x8c040d02, 0x02000000, 0x00100ce8, 0x592c000e, 0x592c1010, 0x592c0a05, 0x480a6012, 0x48026013, 0x48026014, 0x412c3000, 0x82040500, - 0x0000000f, 0x82000400, 0x00100e39, 0x50003800, + 0x0000000f, 0x82000400, 0x00100e3a, 0x50003800, 0x501c0000, 0x592c1a08, 0x4802600b, 0x481a600c, 0x481e600d, 0x480e600e, 0x843c7d4a, 0x403c1000, 0x1c01f000, 0x592c0a05, 0x497a6013, 0x41787800, 0x592c1a08, 0x82040500, 0x0000000f, 0x82000400, - 0x00100e39, 0x50004000, 0x50200000, 0x4802600b, + 0x00100e3a, 0x50004000, 0x50200000, 0x4802600b, 0x492e600c, 0x4822600d, 0x480e600e, 0x483e6004, 0x80000580, 0x1c01f000, 0x59e00004, 0x8c00050e, 0x040206d1, 0x1c01f000, 0x000201e1, 0x000201ce, @@ -11335,17 +11392,17 @@ static const uint32_t isp_2400_risc_code[] = { 0x000201ce, 0x000201ce, 0x000201ce, 0x000201ce, 0x000201ce, 0x000201ce, 0x4c000000, 0x4df00000, 0x4203e000, 0xb0100000, 0x41f00000, 0x81fe1500, - 0x8d0a1512, 0x02020800, 0x001011b7, 0x8d0a1518, + 0x8d0a1512, 0x02020800, 0x001011b8, 0x8d0a1518, 0x02020800, 0x000209bd, 0x8d0a151a, 0x04020eba, 0x83080500, 0x00000d00, 0x04020804, 0x5c03e000, 0x5c000000, 0x1801f000, 0x8d0a1516, 0x02020800, - 0x0010100b, 0x8d0a1514, 0x04020fa4, 0x8d0a1508, - 0x02020800, 0x00100ed1, 0x8d0a1500, 0x02020000, - 0x0002090c, 0x1c01f000, 0x42000000, 0x0010b818, + 0x0010100c, 0x8d0a1514, 0x04020fa4, 0x8d0a1508, + 0x02020800, 0x00100ed2, 0x8d0a1500, 0x02020000, + 0x0002090c, 0x1c01f000, 0x42000000, 0x0010b918, 0x50000000, 0x8c000504, 0x04000014, 0x42000000, - 0x0010b818, 0x50000000, 0x8c000502, 0x04020002, + 0x0010b918, 0x50000000, 0x8c000502, 0x04020002, 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, - 0x42034000, 0x0010b7fa, 0x59a0001e, 0x59a1d806, + 0x42034000, 0x0010b8fa, 0x59a0001e, 0x59a1d806, 0x84000502, 0x4803401e, 0x58ec0008, 0x0801f800, 0x5c03e000, 0x1c01f000, 0x04027002, 0x04026002, 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, @@ -11354,17 +11411,17 @@ static const uint32_t isp_2400_risc_code[] = { 0x42000800, 0x00020b54, 0x58040800, 0x82040d80, 0x00000000, 0x0402001d, 0x0201f800, 0x0010056f, 0x0400001a, 0x412dd800, 0x48efc857, 0x0201f800, - 0x001032d6, 0x42034000, 0x0010b7fa, 0x49a1d80a, + 0x001032e0, 0x42034000, 0x0010b8fa, 0x49a1d80a, 0x48ef4006, 0x59a0001e, 0x84000544, 0x4803401e, 0x59e00020, 0x4803c857, 0x59e00021, 0x4803c857, 0x59e00022, 0x4803c857, 0x59e00023, 0x4803c857, - 0x59e00024, 0x4803c857, 0x0201f800, 0x00101c10, - 0x0201f800, 0x00101c2f, 0x5c03e000, 0x1c01f000, - 0x0201f800, 0x0010ae33, 0x040007fe, 0x4203e000, + 0x59e00024, 0x4803c857, 0x0201f800, 0x00101c15, + 0x0201f800, 0x00101c34, 0x5c03e000, 0x1c01f000, + 0x0201f800, 0x0010af26, 0x040007fe, 0x4203e000, 0x30000001, 0x4203e000, 0x40000000, 0x42000800, 0x00007a12, 0x45780800, 0x0401f7ff, 0x4da00000, 0x4df00000, 0x4203e000, 0x50000000, 0x04006050, - 0x42034000, 0x0010b7fa, 0x59a01018, 0x59a01819, + 0x42034000, 0x0010b8fa, 0x59a01018, 0x59a01819, 0x800c19c0, 0x0402000a, 0x59a0381c, 0x801c39c0, 0x02000800, 0x0010032d, 0x49a3c857, 0x481fc857, 0x59a0041d, 0x801c3c00, 0x0401f00c, 0x59a0041a, @@ -11385,9 +11442,9 @@ static const uint32_t isp_2400_risc_code[] = { 0x59a2581c, 0x592c3814, 0x481f401c, 0x497b441d, 0x0201f800, 0x00100580, 0x5c025800, 0x5c03e000, 0x5c034000, 0x1c01f000, 0x830c0500, 0x00000003, - 0x02020000, 0x00103b05, 0x59340400, 0x82000580, - 0x00000606, 0x02020000, 0x00103ad7, 0x5934000d, - 0x80027d40, 0x02020000, 0x00103b10, 0x0401f803, + 0x02020000, 0x00103b18, 0x59340400, 0x82000580, + 0x00000606, 0x02020000, 0x00103aea, 0x5934000d, + 0x80027d40, 0x02020000, 0x00103b23, 0x0401f803, 0x80000580, 0x1c01f000, 0x5934000f, 0x59341203, 0x80080540, 0x0402005f, 0x5934000b, 0x80001120, 0x82000500, 0x0000ffff, 0x80080480, 0x04021059, @@ -11417,7 +11474,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x492e680f, 0x592c0407, 0x800000c2, 0x800018c4, 0x800c0400, 0x48025804, 0x1c01f000, 0x492c0800, 0x0401f7f9, 0x83440c80, 0x00000800, 0x04021009, - 0x83440400, 0x0010af80, 0x50000000, 0x80000540, + 0x83440400, 0x0010b080, 0x50000000, 0x80000540, 0x04000004, 0x40026800, 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, 0x1c01f000, 0x59340203, 0x80000540, 0x0402004b, 0x4d300000, 0x4d2c0000, @@ -11429,10 +11486,10 @@ static const uint32_t isp_2400_risc_code[] = { 0x480a6c0b, 0x4a026407, 0x00000003, 0x4a026403, 0x00000040, 0x592c0004, 0x497a5804, 0x48026006, 0x592c0809, 0x592c180a, 0x592c020b, 0x48066018, - 0x480e6019, 0x8c000502, 0x02000000, 0x00103f93, + 0x480e6019, 0x8c000502, 0x02000000, 0x00103fad, 0x4a026203, 0x00000004, 0x592c0208, 0x80000040, - 0x02020000, 0x00103f86, 0x82140580, 0x00000018, - 0x02020000, 0x00103f86, 0x592c1810, 0x59300008, + 0x02020000, 0x00103fa0, 0x82140580, 0x00000018, + 0x02020000, 0x00103fa0, 0x592c1810, 0x59300008, 0x82000540, 0x00000091, 0x480e6012, 0x48026008, 0x42000000, 0x80080004, 0x48026004, 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, 0x20000000, @@ -11442,22 +11499,22 @@ static const uint32_t isp_2400_risc_code[] = { 0x1c01f000, 0x497a5800, 0x4932580a, 0x4a026407, 0x00000006, 0x4a026203, 0x00000007, 0x0401f802, 0x0401f7ed, 0x592c020d, 0x48026202, 0x59a80069, - 0x8c000510, 0x02020000, 0x00103fb9, 0x8d0e1d0e, - 0x02020000, 0x00103fb5, 0x8d0e1d04, 0x02020000, - 0x00103fb1, 0x59340200, 0x8c000518, 0x02020000, - 0x00103fad, 0x4a025a07, 0x00000000, 0x8c000508, - 0x02020000, 0x00103fa9, 0x492e6009, 0x4d3c0000, + 0x8c000510, 0x02020000, 0x00103fd3, 0x8d0e1d0e, + 0x02020000, 0x00103fcf, 0x8d0e1d04, 0x02020000, + 0x00103fcb, 0x59340200, 0x8c000518, 0x02020000, + 0x00103fc7, 0x4a025a07, 0x00000000, 0x8c000508, + 0x02020000, 0x00103fc3, 0x492e6009, 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00020912, 0x5c027800, 0x1c01f000, 0x58040001, 0x49680800, 0x49780801, 0x815eb800, 0x4006d000, 0x80000d40, 0x040207fa, 0x497a5801, 0x59c80000, 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, 0x59980013, 0x48032823, 0x59d8010b, 0x48033014, 0x1c01f000, 0x592c0405, - 0x8c00051e, 0x02020000, 0x001044ec, 0x497a5800, + 0x8c00051e, 0x02020000, 0x0010452b, 0x497a5800, 0x8d0e1d26, 0x0402000e, 0x0402d007, 0x592c0001, 0x492fb107, 0x80000d40, 0x04020fe3, 0x0400e0cd, 0x1c01f000, 0x0400e8cb, 0x0400d7f9, 0x42000000, - 0x0010bb76, 0x0201f800, 0x0010ad20, 0x0401f916, + 0x0010bc76, 0x0201f800, 0x0010ae13, 0x0401f916, 0x0400d921, 0x0400e0c3, 0x59d80105, 0x82000d00, 0x00018780, 0x04020130, 0x1c01f000, 0x59980011, 0x0c01f001, 0x000203cd, 0x000203ce, 0x000203d9, @@ -11534,8 +11591,8 @@ static const uint32_t isp_2400_risc_code[] = { 0x4807b107, 0x80000d40, 0x04020005, 0x48033016, 0x850e1d26, 0x48033017, 0x1c01f000, 0x0400d7f8, 0x0401f7fd, 0x59d80105, 0x82000500, 0x00018780, - 0x04020005, 0x42000000, 0x0010bb76, 0x0201f000, - 0x0010ad20, 0x4803c857, 0x485fc857, 0x8c00050e, + 0x04020005, 0x42000000, 0x0010bc76, 0x0201f000, + 0x0010ae13, 0x4803c857, 0x485fc857, 0x8c00050e, 0x02020800, 0x00100322, 0x4203e000, 0x50000000, 0x4200b800, 0x00008004, 0x0201f000, 0x00100332, 0x0400e784, 0x59d80105, 0x82000500, 0x00018780, @@ -11573,9 +11630,9 @@ static const uint32_t isp_2400_risc_code[] = { 0x400a5000, 0x900811c0, 0x82081540, 0x0000001c, 0x480bc011, 0x4a03c017, 0x00000000, 0x4203e000, 0x30000001, 0x1c01f000, 0x41700000, 0x0c01f001, - 0x00104bf1, 0x00020595, 0x00104bf1, 0x0002065b, - 0x00104bef, 0x00104bef, 0x00104bef, 0x00104bef, - 0x001050b7, 0x04010036, 0x59980004, 0x80000540, + 0x00104c30, 0x00020595, 0x00104c30, 0x0002065b, + 0x00104c2e, 0x00104c2e, 0x00104c2e, 0x00104c2e, + 0x0010510d, 0x04010036, 0x59980004, 0x80000540, 0x0402003b, 0x0402c01c, 0x4202f800, 0x00000010, 0x4df00000, 0x4203e000, 0x50000000, 0x49db3003, 0x59da5808, 0x592c2a05, 0x497a5800, 0x497a5801, @@ -11584,103 +11641,103 @@ static const uint32_t isp_2400_risc_code[] = { 0x04000009, 0x836c0580, 0x00000003, 0x04020006, 0x83700580, 0x00000001, 0x04020010, 0x0401001a, 0x0400c7e8, 0x0400f973, 0x0400b15d, 0x59d40005, - 0x82000500, 0x43018780, 0x02020000, 0x0010502c, + 0x82000500, 0x43018780, 0x02020000, 0x00105081, 0x59d80005, 0x82000500, 0x43018780, 0x02020000, - 0x00105033, 0x1c01f000, 0x83700580, 0x00000003, + 0x00105088, 0x1c01f000, 0x83700580, 0x00000003, 0x04000897, 0x83700580, 0x00000001, 0x040207ee, 0x04010005, 0x0400c7d3, 0x0401f7eb, 0x4202f800, 0x00000010, 0x4df00000, 0x4203e000, 0x50000000, 0x49d73003, 0x59d65808, 0x0401f7cf, 0x4df00000, 0x4203e000, 0x50000000, 0x40025800, 0x592c2a05, 0x497b3003, 0x497b3004, 0x4202f800, 0x00000010, - 0x0401f7c8, 0x0201f800, 0x00104c44, 0x5c03e000, - 0x0401f7d5, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104cdf, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c54, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104d08, - 0x00104c44, 0x00104c44, 0x00104c44, 0x000206b7, - 0x00104c44, 0x00104ea4, 0x00104c44, 0x00104c44, - 0x00104c44, 0x0002067d, 0x00104c44, 0x00104c44, - 0x0010a623, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c84, 0x00104c44, - 0x0010a6b8, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104fbb, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x0010500a, 0x00104c44, - 0x00104c7b, 0x00104c44, 0x00104f83, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104f51, 0x00104c44, - 0x00104f51, 0x0010507c, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104f13, - 0x00105042, 0x00104c44, 0x0010506f, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x00104c44, - 0x00104c44, 0x00104c44, 0x00104c44, 0x4df00000, + 0x0401f7c8, 0x0201f800, 0x00104c83, 0x5c03e000, + 0x0401f7d5, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104d1e, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c93, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104d47, + 0x00104c83, 0x00104c83, 0x00104c83, 0x000206b7, + 0x00104c83, 0x00104ef6, 0x00104c83, 0x00104c83, + 0x00104c83, 0x0002067d, 0x00104c83, 0x00104c83, + 0x0010a716, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104cc3, 0x00104c83, + 0x0010a7ab, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x0010500d, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x0010505f, 0x00104c83, + 0x00104cba, 0x00104c83, 0x00104fd5, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104fa3, 0x00104c83, + 0x00104fa3, 0x001050d2, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104f65, + 0x00105097, 0x00104c83, 0x001050c5, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x00104c83, + 0x00104c83, 0x00104c83, 0x00104c83, 0x4df00000, 0x4203e000, 0x50000000, 0x59981003, 0x800811c0, - 0x02000000, 0x00104bf6, 0x58080005, 0x82000d00, - 0x43018780, 0x02020000, 0x00105033, 0x8c000508, - 0x02000000, 0x00104bf3, 0x580a5808, 0x592c0205, + 0x02000000, 0x00104c35, 0x58080005, 0x82000d00, + 0x43018780, 0x02020000, 0x00105088, 0x8c000508, + 0x02000000, 0x00104c32, 0x580a5808, 0x592c0205, 0x497a5800, 0x497a5801, 0x82000500, 0x000000ff, - 0x82000c80, 0x0000004b, 0x02021000, 0x00104bf2, - 0x1201f800, 0x00104bf9, 0x5c03e000, 0x83700580, + 0x82000c80, 0x0000004b, 0x02021000, 0x00104c31, + 0x1201f800, 0x00104c38, 0x5c03e000, 0x83700580, 0x00000003, 0x040007e2, 0x0400f8ae, 0x0400b098, 0x1c01f000, 0x80140110, 0x80000040, 0x0400000b, - 0x02001000, 0x00104c4c, 0x4a033006, 0x0002068a, + 0x02001000, 0x00104c8b, 0x4a033006, 0x0002068a, 0x48033000, 0x492f3001, 0x492f3002, 0x4202e000, 0x00000003, 0x1c01f000, 0x592e8a07, 0x83440c80, - 0x000007f0, 0x02021000, 0x00104c5c, 0x8d0e1d0e, - 0x02020000, 0x00104c8d, 0x83440400, 0x0010af80, - 0x50000000, 0x80026d40, 0x02000000, 0x00104c9d, + 0x000007f0, 0x02021000, 0x00104c9b, 0x8d0e1d0e, + 0x02020000, 0x00104ccc, 0x83440400, 0x0010b080, + 0x50000000, 0x80026d40, 0x02000000, 0x00104cdc, 0x59340002, 0x592c0811, 0x80040580, 0x82000500, - 0x00ffffff, 0x02020000, 0x00104c5c, 0x5934000a, - 0x8c00052e, 0x02020000, 0x00104ca7, 0x0201f800, - 0x0002029a, 0x02020000, 0x00104ca0, 0x1c01f000, + 0x00ffffff, 0x02020000, 0x00104c9b, 0x5934000a, + 0x8c00052e, 0x02020000, 0x00104ce6, 0x0201f800, + 0x0002029a, 0x02020000, 0x00104cdf, 0x1c01f000, 0x59980802, 0x59980000, 0x48065800, 0x492c0801, 0x492f3002, 0x80000040, 0x48033000, 0x04000002, 0x1c01f000, 0x599a5801, 0x59980006, 0x4202e000, 0x00000001, 0x0801f800, 0x1c01f000, 0x80140110, - 0x02000000, 0x00104c4c, 0x80000040, 0x0402000b, + 0x02000000, 0x00104c8b, 0x80000040, 0x0402000b, 0x592c240b, 0x8c102504, 0x0400000c, 0x592c0208, - 0x82000c80, 0x00001001, 0x02021000, 0x00104c5c, - 0x0201f000, 0x00105091, 0x4a033006, 0x000206c9, + 0x82000c80, 0x00001001, 0x02021000, 0x00104c9b, + 0x0201f000, 0x001050e7, 0x4a033006, 0x000206c9, 0x0401f7bc, 0x592c240b, 0x592e8a07, 0x417a7800, - 0x83440480, 0x00000800, 0x02021000, 0x00104e32, - 0x83440400, 0x0010af80, 0x50000000, 0x80026d40, - 0x02000000, 0x00104e32, 0x59340002, 0x592c0809, + 0x83440480, 0x00000800, 0x02021000, 0x00104e80, + 0x83440400, 0x0010b080, 0x50000000, 0x80026d40, + 0x02000000, 0x00104e80, 0x59340002, 0x592c0809, 0x80040580, 0x82000500, 0x00ffffff, 0x02020000, - 0x00104c5c, 0x592e600a, 0x497a5809, 0x83300480, - 0x0010f584, 0x02001000, 0x00104e4f, 0x41540000, - 0x81300480, 0x02021000, 0x00104df8, 0x592c0a0d, - 0x59300202, 0x80040580, 0x02020000, 0x00104e4f, - 0x4936600a, 0x8c10251c, 0x02020000, 0x00104de6, - 0x59a80069, 0x8c000510, 0x02020000, 0x00104e72, - 0x8d0e1d0e, 0x02020000, 0x00104dcb, 0x8d0e1d04, - 0x02020000, 0x00104e63, 0x59340200, 0x8c000518, - 0x02020000, 0x00104e4a, 0x59300c07, 0x82040580, - 0x00000006, 0x02020000, 0x00104e77, 0x8c102508, - 0x02020000, 0x00104dc0, 0x59300809, 0x497a5804, + 0x00104c9b, 0x592e600a, 0x497a5809, 0x83300480, + 0x0010f694, 0x02001000, 0x00104e9d, 0x41540000, + 0x81300480, 0x02021000, 0x00104e46, 0x592c0a0d, + 0x59300202, 0x80040580, 0x02020000, 0x00104e9d, + 0x4936600a, 0x8c10251c, 0x02020000, 0x00104e34, + 0x59a80069, 0x8c000510, 0x02020000, 0x00104ec0, + 0x8d0e1d0e, 0x02020000, 0x00104e19, 0x8d0e1d04, + 0x02020000, 0x00104eb1, 0x59340200, 0x8c000518, + 0x02020000, 0x00104e98, 0x59300c07, 0x82040580, + 0x00000006, 0x02020000, 0x00104ec5, 0x8c102508, + 0x02020000, 0x00104e0e, 0x59300809, 0x497a5804, 0x4a025a07, 0x00000000, 0x800409c0, 0x02020000, - 0x00104dc6, 0x59300415, 0x8c000516, 0x02020000, - 0x00104e54, 0x492e6009, 0x0401f200, 0x4df00000, + 0x00104e14, 0x59300415, 0x8c000516, 0x02020000, + 0x00104ea2, 0x492e6009, 0x0401f200, 0x4df00000, 0x4203e000, 0x50000000, 0x0402b00b, 0x835c0480, 0x00000020, 0x0400100d, 0x815eb840, 0x416a5800, 0x592ed000, 0x492fb007, 0x497a5800, 0x497a5801, 0x0400b7f7, 0x59d80005, 0x82000500, 0x43018780, - 0x02020000, 0x00105033, 0x5c03e000, 0x1c01f000, + 0x02020000, 0x00105088, 0x5c03e000, 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, 0x0402f00b, 0x835c0480, 0x00000020, 0x0400100d, 0x815eb840, 0x416a5800, 0x592ed000, 0x492fa807, 0x497a5800, 0x497a5801, 0x0400f7f7, 0x59d40005, 0x82000500, - 0x43018780, 0x02020000, 0x0010502c, 0x5c03e000, + 0x43018780, 0x02020000, 0x00105081, 0x5c03e000, 0x1c01f000, 0x40307000, 0x5838000a, 0x80025d40, 0x04000021, 0x58380002, 0x82000580, 0x00000100, 0x04000023, 0x4c380000, 0x592c0a05, 0x82040d00, @@ -11695,7 +11752,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x82000480, 0x00000003, 0x04000088, 0x5838000f, 0x8c000500, 0x04020019, 0x4200b000, 0x00000003, 0x832cac00, 0x00000012, 0x58380009, 0x5838100c, - 0x8008a400, 0x4c380000, 0x0201f800, 0x0010adef, + 0x8008a400, 0x4c380000, 0x0201f800, 0x0010aee2, 0x5c007000, 0x5838000c, 0x82000400, 0x00000003, 0x4800700c, 0x4a00700f, 0x00000001, 0x58380004, 0x82000480, 0x00000003, 0x48007004, 0x82000580, @@ -11707,7 +11764,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x492c0801, 0x492c700b, 0x42000800, 0x0000000f, 0x0401f011, 0x4202e000, 0x00000008, 0x4a033005, 0x000207a2, 0x1c01f000, 0x4202e000, 0x00000002, - 0x42000000, 0x0010c25d, 0x50007000, 0x0401f7e7, + 0x42000000, 0x0010c35d, 0x50007000, 0x0401f7e7, 0x583a580b, 0x400c0000, 0x42000800, 0x00000015, 0x80040c80, 0x58381004, 0x5838000e, 0x41783000, 0x80000540, 0x04020005, 0x84183540, 0x82081480, @@ -11715,7 +11772,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x04001002, 0x40080800, 0x4004b000, 0x412c0000, 0x800c0400, 0x4000a800, 0x58380009, 0x5838100c, 0x8008a400, 0x4c080000, 0x4c040000, 0x4c0c0000, - 0x4c380000, 0x0201f800, 0x0010adef, 0x5c007000, + 0x4c380000, 0x0201f800, 0x0010aee2, 0x5c007000, 0x5c001800, 0x5c000800, 0x40040000, 0x58381004, 0x80080480, 0x48007004, 0x82000580, 0x00000003, 0x04000002, 0x84183500, 0x5c000000, 0x80041400, @@ -11726,21 +11783,21 @@ static const uint32_t isp_2400_risc_code[] = { 0x0c01f001, 0x000207ed, 0x000207f2, 0x000207ef, 0x000207ed, 0x00020789, 0x000207f2, 0x000207ef, 0x000207ed, 0x0201f800, 0x0010032d, 0x5838100e, - 0x0201f000, 0x001050a3, 0x5838080c, 0x82040400, + 0x0201f000, 0x001050f9, 0x5838080c, 0x82040400, 0x00000002, 0x58381009, 0x80080400, 0x50001000, 0x800811c0, 0x04020011, 0x4202e000, 0x00000001, 0x583a580a, 0x4978700a, 0x4978700f, 0x592c0a05, 0x82040d00, 0x000000ff, 0x82040580, 0x00000012, 0x040006c5, 0x82040580, 0x0000001b, 0x02000000, - 0x0010a64b, 0x0401f681, 0x58380009, 0x80040c00, + 0x0010a73e, 0x0401f681, 0x58380009, 0x80040c00, 0x82381c00, 0x00000006, 0x54041800, 0x80040800, - 0x800c1800, 0x54041800, 0x0201f000, 0x001050a3, + 0x800c1800, 0x54041800, 0x0201f000, 0x001050f9, 0x4df00000, 0x4203e000, 0x50000000, 0x5994002e, 0x80000540, 0x040000ec, 0x4c000000, 0x8d0e1d32, - 0x02020800, 0x00100f5c, 0x59e00002, 0x8c00051e, + 0x02020800, 0x00100f5d, 0x59e00002, 0x8c00051e, 0x04020013, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24320002, 0x0402000d, 0x0201f800, - 0x0010ae33, 0x04000008, 0x42000800, 0x00007a17, + 0x0010af26, 0x04000008, 0x42000800, 0x00007a17, 0x50040000, 0x8c00050e, 0x04020003, 0x8400054e, 0x44000800, 0x4a030000, 0x00000000, 0x5c000000, 0x59947824, 0x4803282f, 0x803c0480, 0x04001004, @@ -11750,10 +11807,10 @@ static const uint32_t isp_2400_risc_code[] = { 0x803c0040, 0x04000002, 0x483fc857, 0x59e40852, 0x59a8005d, 0x80040580, 0x04000004, 0x480bc857, 0x59e40052, 0x4803505d, 0x59940030, 0x803c0400, - 0x48032830, 0x0201f800, 0x0010589d, 0x59940000, + 0x48032830, 0x0201f800, 0x00105942, 0x59940000, 0x82000580, 0x00000000, 0x04020006, 0x59940030, 0x48032831, 0x497b2830, 0x4a032800, 0x00000001, - 0x59bc00e4, 0x8c00052c, 0x02020800, 0x0010576a, + 0x59bc00e4, 0x8c00052c, 0x02020800, 0x0010580f, 0x4c0c0000, 0x59940007, 0x80000d40, 0x04000013, 0x59941006, 0x5994002f, 0x80081c80, 0x04001004, 0x04000003, 0x480f2806, 0x0401f00c, 0x80040840, @@ -11796,30 +11853,30 @@ static const uint32_t isp_2400_risc_code[] = { 0x0000000a, 0x4803282b, 0x040027f7, 0x5994082e, 0x5994002f, 0x80040480, 0x02001800, 0x0010032d, 0x4803282e, 0x59940000, 0x0c01f001, 0x0002090a, - 0x001057ef, 0x00105859, 0x5c03e000, 0x1c01f000, + 0x00105894, 0x001058fe, 0x5c03e000, 0x1c01f000, 0x5994002e, 0x80000000, 0x4803282e, 0x4203e000, 0x70000000, 0x1c01f000, 0x592c0004, 0x497a5804, 0x80000d40, 0x04020005, 0x592c0407, 0x800000c2, 0x800008c4, 0x80040c00, 0x592c040b, 0x48066006, - 0x82000d00, 0x00000003, 0x02000000, 0x001059f2, + 0x82000d00, 0x00000003, 0x02000000, 0x00105a97, 0x8c000500, 0x0402002c, 0x59a80870, 0x80040840, - 0x040207ff, 0x8c00051e, 0x02000000, 0x001059cd, - 0x82000d00, 0x000000c0, 0x02020000, 0x001059c3, - 0x82000d00, 0x00002020, 0x02020000, 0x001059c0, - 0x813e79c0, 0x02020000, 0x001059c0, 0x592c0c0d, - 0x800409c0, 0x02020000, 0x001059c0, 0x59300a03, - 0x82040d80, 0x00000007, 0x02020000, 0x001059c0, + 0x040207ff, 0x8c00051e, 0x02000000, 0x00105a72, + 0x82000d00, 0x000000c0, 0x02020000, 0x00105a68, + 0x82000d00, 0x00002020, 0x02020000, 0x00105a65, + 0x813e79c0, 0x02020000, 0x00105a65, 0x592c0c0d, + 0x800409c0, 0x02020000, 0x00105a65, 0x59300a03, + 0x82040d80, 0x00000007, 0x02020000, 0x00105a65, 0x4a026203, 0x00000003, 0x4a026403, 0x00000043, 0x0201f800, 0x0002015e, 0x82080d40, 0x80003465, 0x48066004, 0x497a6000, 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, 0xa0000000, 0x480378e1, - 0x1c01f000, 0x8c000502, 0x02020000, 0x00105a15, + 0x1c01f000, 0x8c000502, 0x02020000, 0x00105aba, 0x8c00051e, 0x0400000e, 0x82000d00, 0x000000c0, 0x04000005, 0x82040d80, 0x000000c0, 0x02020000, - 0x00105a1a, 0x82000d00, 0x00002020, 0x82040d80, - 0x00002020, 0x02000000, 0x001059e1, 0x592c0208, - 0x80000040, 0x02020000, 0x001059eb, 0x592c180e, - 0x800c19c0, 0x02020000, 0x001059eb, 0x592c1810, + 0x00105abf, 0x82000d00, 0x00002020, 0x82040d80, + 0x00002020, 0x02000000, 0x00105a86, 0x592c0208, + 0x80000040, 0x02020000, 0x00105a90, 0x592c180e, + 0x800c19c0, 0x02020000, 0x00105a90, 0x592c1810, 0x59300008, 0x82000540, 0x00000011, 0x480e6012, 0x48026008, 0x4a026203, 0x00000004, 0x4a026403, 0x00000042, 0x42000800, 0x80002001, 0x0401f03e, @@ -11834,35 +11891,35 @@ static const uint32_t isp_2400_risc_code[] = { 0x00001200, 0x48039000, 0x0401f7f1, 0x0201f800, 0x00020399, 0x0401f7ee, 0x59840000, 0x80000540, 0x04020002, 0x1c01f000, 0x59840003, 0x80000540, - 0x02020000, 0x00105a92, 0x1c01f000, 0x48066004, + 0x02020000, 0x00105b37, 0x1c01f000, 0x48066004, 0x497a6000, 0x497a6001, 0x8d0e1d32, 0x02000800, - 0x00100f5c, 0x850e1d72, 0x59bc00ea, 0x8c000516, + 0x00100f5d, 0x850e1d72, 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, 0xa0000000, 0x480378e1, 0x1c01f000, 0x59300004, 0x82000500, 0x00000100, 0x80040d40, 0x48066004, 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, 0x40000000, 0x480378e1, 0x1c01f000, 0x59bc00ea, 0x82001500, 0xb0000018, - 0x02020000, 0x0010614b, 0x8c000510, 0x0400002a, + 0x02020000, 0x001061f0, 0x8c000510, 0x0400002a, 0x59bc10e0, 0x82080500, 0xfffff000, 0x0402000a, 0x80080108, 0x820a3500, 0x0000000f, 0x4803c857, - 0x1201f000, 0x00106151, 0x84000510, 0x48026004, + 0x1201f000, 0x001061f6, 0x84000510, 0x48026004, 0x0401f016, 0x840a653e, 0x59300004, 0x8c000520, 0x040007fa, 0x82000500, 0xfffefeff, 0x48026004, 0x8c08153e, 0x04020005, 0x42027000, 0x00000013, 0x0401f858, 0x0401f009, 0x59300004, 0x8c000514, 0x04000003, 0x0401ff98, 0x0401f02e, 0x42027000, 0x00000049, 0x0401f84f, 0x59bc00ea, 0x82001500, - 0xb0000018, 0x02020000, 0x0010614b, 0x8c000510, + 0xb0000018, 0x02020000, 0x001061f0, 0x8c000510, 0x040207d8, 0x1c01f000, 0x59a80251, 0x81640480, 0x04001019, 0x41626000, 0x41580000, 0x59300a03, 0x82040d80, 0x00000000, 0x04020009, 0x4a026203, 0x00000008, 0x8166c840, 0x8332c400, 0x00000024, 0x81600480, 0x04021009, 0x1c01f000, 0x83326400, 0x00000024, 0x81300c80, 0x040017f1, 0x42026000, - 0x0010f584, 0x0401f7ee, 0x837ac540, 0x0010f584, - 0x1c01f000, 0x42000000, 0x0010bc10, 0x0201f800, - 0x0010ad1d, 0x4967c857, 0x80026580, 0x1c01f000, - 0x83300480, 0x0010f584, 0x02001800, 0x0010032d, + 0x0010f694, 0x0401f7ee, 0x837ac540, 0x0010f694, + 0x1c01f000, 0x42000000, 0x0010bd10, 0x0201f800, + 0x0010ae10, 0x4967c857, 0x80026580, 0x1c01f000, + 0x83300480, 0x0010f694, 0x02001800, 0x0010032d, 0x41580000, 0x81300480, 0x0402100c, 0x457a6000, 0x4a026202, 0x0000ffff, 0x04011000, 0x83300400, 0x00000003, 0x4803c840, 0x4a03c842, 0x00000021, @@ -11873,79 +11930,79 @@ static const uint32_t isp_2400_risc_code[] = { 0x4803c840, 0x4a03c842, 0x00000021, 0x1c01f000, 0x4d340000, 0x5932680a, 0x59300407, 0x82000500, 0x0000001f, 0x0c01f803, 0x5c026800, 0x1c01f000, - 0x00107126, 0x00107139, 0x00107153, 0x00020a5c, - 0x00109329, 0x00109344, 0x00020ad1, 0x00107126, - 0x00107139, 0x00105d89, 0x0010716c, 0x00107126, - 0x00107126, 0x00107126, 0x00107126, 0x00107126, - 0x00108e6e, 0x0010a263, 0x0010a959, 0x0010ab49, - 0x00107126, 0x00107126, 0x00107126, 0x00107126, - 0x00107126, 0x00107126, 0x00107126, 0x00107126, - 0x00107126, 0x00107126, 0x00107126, 0x00107126, + 0x001071b9, 0x001071cc, 0x001071e6, 0x00020a5c, + 0x001093e1, 0x001093fc, 0x00020ad1, 0x001071b9, + 0x001071cc, 0x00105e2e, 0x001071ff, 0x001071b9, + 0x001071b9, 0x001071b9, 0x001071b9, 0x001071b9, + 0x00108f27, 0x0010a342, 0x0010aa4c, 0x0010ac3c, + 0x001071b9, 0x001071b9, 0x001071b9, 0x001071b9, + 0x001071b9, 0x001071b9, 0x001071b9, 0x001071b9, + 0x001071b9, 0x001071b9, 0x001071b9, 0x001071b9, 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, - 0x0010032d, 0x0c01f001, 0x0010716a, 0x00107d8a, - 0x00020a70, 0x00107f61, 0x00107ffb, 0x0010716a, - 0x0010716a, 0x0010716a, 0x00107d6f, 0x0010716a, - 0x0010716a, 0x0010716a, 0x0010716a, 0x001081e8, + 0x0010032d, 0x0c01f001, 0x001071fd, 0x00107e31, + 0x00020a70, 0x00108008, 0x001080a2, 0x001071fd, + 0x001071fd, 0x001071fd, 0x00107e16, 0x001071fd, + 0x001071fd, 0x001071fd, 0x001071fd, 0x0010828f, 0x83380480, 0x00000058, 0x04021007, 0x83380480, 0x00000040, 0x04001004, 0x4d2c0000, 0x0c01f803, - 0x5c025800, 0x1c01f000, 0x00107e14, 0x00107e14, - 0x00107e14, 0x00107e14, 0x00107e14, 0x00107e16, - 0x00107ee3, 0x00107e14, 0x00107e14, 0x00107e14, - 0x00107e14, 0x00107e14, 0x00107e14, 0x00107e14, - 0x00107e14, 0x00107e14, 0x00107e14, 0x00107e14, - 0x00107e14, 0x00107ee7, 0x00020a92, 0x00107e14, - 0x00107ee6, 0x00107ee8, 0x59325809, 0x59300812, + 0x5c025800, 0x1c01f000, 0x00107ebb, 0x00107ebb, + 0x00107ebb, 0x00107ebb, 0x00107ebb, 0x00107ebd, + 0x00107f8a, 0x00107ebb, 0x00107ebb, 0x00107ebb, + 0x00107ebb, 0x00107ebb, 0x00107ebb, 0x00107ebb, + 0x00107ebb, 0x00107ebb, 0x00107ebb, 0x00107ebb, + 0x00107ebb, 0x00107f8e, 0x00020a92, 0x00107ebb, + 0x00107f8d, 0x00107f8f, 0x59325809, 0x59300812, 0x59301402, 0x59340200, 0x8c00050e, 0x0402001c, 0x0401f826, 0x04000005, 0x4a025a05, 0x00000103, 0x497a580a, 0x0401f009, 0x4a025a05, 0x00000103, 0x4a025a07, 0x00000000, 0x497a580a, 0x800409c0, - 0x02020800, 0x00107fc6, 0x48065808, 0x480a5c07, + 0x02020800, 0x0010806d, 0x48065808, 0x480a5c07, 0x0201f800, 0x000203ab, 0x5934000f, 0x5934140b, 0x80081040, 0x04001002, 0x480a6c0b, 0x80000540, 0x02020800, 0x00020327, 0x0401f75e, 0x592c020b, 0x8c000502, 0x040007e3, 0x800409c0, 0x040007e7, 0x592c0209, 0x8c00050e, 0x040207e4, 0x4933c857, - 0x0201f000, 0x00108aad, 0x592c020b, 0x8c000500, + 0x0201f000, 0x00108b66, 0x592c020b, 0x8c000500, 0x04000010, 0x59300016, 0x592c3810, 0x801c3c80, 0x0400000c, 0x4a025a07, 0x00000015, 0x8c1c3d3e, 0x04000005, 0x4a025a07, 0x00000007, 0x801c3880, 0x801c3800, 0x481fc857, 0x821c0d40, 0x00000000, 0x1c01f000, 0x59300203, 0x82003480, 0x0000000e, - 0x02021800, 0x0010032d, 0x0c01f001, 0x00109363, - 0x00020ae5, 0x00109ae5, 0x00109af3, 0x00020b01, - 0x00109363, 0x00109be6, 0x00020b20, 0x00109363, - 0x00109363, 0x00109363, 0x00109363, 0x00109363, - 0x00109363, 0x83380580, 0x00000013, 0x02020000, - 0x00109a6c, 0x59300403, 0x82027480, 0x00000044, + 0x02021800, 0x0010032d, 0x0c01f001, 0x0010941b, + 0x00020ae5, 0x00109bb1, 0x00109bbf, 0x00020b01, + 0x0010941b, 0x00109cb5, 0x00020b20, 0x0010941b, + 0x0010941b, 0x0010941b, 0x0010941b, 0x0010941b, + 0x0010941b, 0x83380580, 0x00000013, 0x02020000, + 0x00109b38, 0x59300403, 0x82027480, 0x00000044, 0x02021800, 0x0010032d, 0x82000480, 0x00000040, - 0x02001800, 0x0010032d, 0x0c01f001, 0x00109ac9, - 0x00020af7, 0x00109acb, 0x00109add, 0x59325809, + 0x02001800, 0x0010032d, 0x0c01f001, 0x00109b95, + 0x00020af7, 0x00109b97, 0x00109ba9, 0x59325809, 0x832c0500, 0x00ff0000, 0x04000005, 0x592c0c0b, - 0x8c040d1a, 0x02020000, 0x00109ad8, 0x0401fe7a, + 0x8c040d1a, 0x02020000, 0x00109ba4, 0x0401fe7a, 0x0401f710, 0x83380580, 0x00000048, 0x04000007, - 0x83380580, 0x00000053, 0x02000000, 0x00109b88, + 0x83380580, 0x00000053, 0x02000000, 0x00109c57, 0x0201f800, 0x0010032d, 0x59300020, 0x59301012, 0x5930080a, 0x58040a00, 0x8c040d0e, 0x02020000, - 0x00109b64, 0x800811c0, 0x02020000, 0x00109b71, - 0x59300020, 0x80000540, 0x02020000, 0x00109b7f, + 0x00109c33, 0x800811c0, 0x02020000, 0x00109c40, + 0x59300020, 0x80000540, 0x02020000, 0x00109c4e, 0x59325809, 0x592c040b, 0x8c00051e, 0x02000000, - 0x00109b5a, 0x42027000, 0x00000041, 0x0401f001, + 0x00109c29, 0x42027000, 0x00000041, 0x0401f001, 0x83380480, 0x00000054, 0x02021800, 0x0010032d, - 0x83380480, 0x00000040, 0x02001000, 0x00109ba5, - 0x0c01f001, 0x00109bb1, 0x00020b3d, 0x00109bbd, - 0x00109bc4, 0x00109bb1, 0x00109bb1, 0x00109bb1, - 0x00109bb1, 0x00109bb3, 0x00109bb8, 0x00109bb8, - 0x00109bb1, 0x00109bb1, 0x00109bb1, 0x00109bb1, - 0x00109bb8, 0x00109bb1, 0x00109bb8, 0x00109bb1, - 0x00109bb3, 0x4a026203, 0x00000001, 0x493a6403, + 0x83380480, 0x00000040, 0x02001000, 0x00109c74, + 0x0c01f001, 0x00109c80, 0x00020b3d, 0x00109c8c, + 0x00109c93, 0x00109c80, 0x00109c80, 0x00109c80, + 0x00109c80, 0x00109c82, 0x00109c87, 0x00109c87, + 0x00109c80, 0x00109c80, 0x00109c80, 0x00109c80, + 0x00109c87, 0x00109c80, 0x00109c87, 0x00109c80, + 0x00109c82, 0x4a026203, 0x00000001, 0x493a6403, 0x42000800, 0x80002042, 0x0401f66f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x6bc7416d, 0x00000000, - 0x00000000, 0x0010d600, 0x00001ab8, 0x42000000, - 0x0010f0f0, 0x42001000, 0x0010f0e1, 0x48001000, - 0x42013800, 0x0010f4f0, 0x42000000, 0x0010f0e0, + 0x00000000, 0x00000000, 0x6bc6a178, 0x00000000, + 0x00000000, 0x0010d700, 0x00001ac0, 0x42000000, + 0x0010f200, 0x42001000, 0x0010f1f1, 0x48001000, + 0x42013800, 0x0010f600, 0x42000000, 0x0010f1f0, 0x489c0000, 0x409d4000, 0x409d6800, 0x1c01f000, 0x4200d000, 0x0000000d, 0x42000000, 0x00000002, 0x4800d000, 0x0401f7fb, 0x4200d000, 0x0000000d, @@ -11953,7 +12010,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x1c01f000, 0x809d3840, 0x48813800, 0x4933c857, 0x5931040b, 0x82817480, 0x00000038, 0x0400000d, 0x0400100c, 0x82810480, 0x00000038, 0x4a025a06, - 0x00000038, 0x0201f800, 0x001031a2, 0x40c65800, + 0x00000038, 0x0201f800, 0x001031ac, 0x40c65800, 0x80c589c0, 0x040207f4, 0x4178d000, 0x0401f004, 0x48825a06, 0x4200d000, 0x00000001, 0x40698800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x42038000, @@ -11984,21 +12041,21 @@ static const uint32_t isp_2400_risc_code[] = { 0xe1290008, 0x486f9122, 0x0401f7e2, 0x4a039100, 0x0000e980, 0x1c01f000, 0x59c8d007, 0x8c68d500, 0x04000003, 0x4a03900d, 0x00000030, 0x1c01f000, - 0x0201f800, 0x001060fa, 0x59b8d0ea, 0x8268d500, + 0x0201f800, 0x0010619f, 0x59b8d0ea, 0x8268d500, 0x00000007, 0x82697480, 0x00000003, 0x04000002, 0x0401f003, 0x4a0370e8, 0x00000001, 0x1c01f000, 0x4a038805, 0x00020000, 0x4200d000, 0x0000003c, - 0x0201f800, 0x001010d9, 0x4a038891, 0x0000ffff, + 0x0201f800, 0x001010da, 0x4a038891, 0x0000ffff, 0x59c97035, 0x48bb9035, 0x4a03900d, 0x00000040, - 0x42038000, 0x00007700, 0x0201f800, 0x00100c06, + 0x42038000, 0x00007700, 0x0201f800, 0x00100c07, 0x4a038006, 0x20000000, 0x42038000, 0x00007720, - 0x0201f800, 0x00100c06, 0x4a038006, 0x20000000, + 0x0201f800, 0x00100c07, 0x4a038006, 0x20000000, 0x4a03a005, 0x20000000, 0x4a03a005, 0x30000000, 0x4a03b805, 0x30000001, 0x4a03b805, 0x20000000, 0x59d0d006, 0x8c68d50a, 0x040207fe, 0x59dcd006, 0x8c68d50a, 0x040207fb, 0x1c01f000, 0x4203a000, 0x00007600, 0x4200d000, 0x00000040, 0x0201f800, - 0x001010d9, 0x4a03a00a, 0x00000001, 0x4a03a005, + 0x001010da, 0x4a03a00a, 0x00000001, 0x4a03a005, 0x20000000, 0x59d0d006, 0x4a03a005, 0x30000000, 0x59d0d006, 0x8c68d50a, 0x040207fe, 0x59d0d005, 0x59a0d211, 0x59a0dc11, 0x806c00e0, 0x8068d540, @@ -12023,24 +12080,24 @@ static const uint32_t isp_2400_risc_code[] = { 0x59a8d00d, 0x41640000, 0x80697480, 0x04000015, 0x4967c857, 0x59a9704f, 0x48bbc857, 0x59a9704e, 0x48bbc857, 0x59a9704d, 0x48bbc857, 0x4a034407, - 0x00000018, 0x0201f800, 0x00101cfd, 0x0401f12b, - 0x4a034407, 0x00000005, 0x0201f800, 0x00101cfd, - 0x0401f126, 0x0201f800, 0x00101d05, 0x0401f123, + 0x00000018, 0x0201f800, 0x00101d02, 0x0401f12b, + 0x4a034407, 0x00000005, 0x0201f800, 0x00101d02, + 0x0401f126, 0x0201f800, 0x00101d0a, 0x0401f123, 0x59a8d04e, 0x59a8004d, 0x80697480, 0x040207e9, - 0x0201f800, 0x00106106, 0x598e600f, 0x0201f800, - 0x00106381, 0x0201f800, 0x00106106, 0x408e3000, - 0x0201f800, 0x00106705, 0x59926004, 0x813261c0, - 0x0400000d, 0x0201f800, 0x0010629a, 0x0201f800, - 0x001060d8, 0x0201f800, 0x001060e1, 0x42027800, + 0x0201f800, 0x001061ab, 0x598e600f, 0x0201f800, + 0x00106426, 0x0201f800, 0x001061ab, 0x408e3000, + 0x0201f800, 0x001067aa, 0x59926004, 0x813261c0, + 0x0400000d, 0x0201f800, 0x0010633f, 0x0201f800, + 0x0010617d, 0x0201f800, 0x00106186, 0x42027800, 0x00001000, 0x42028000, 0x0000002e, 0x0201f800, - 0x0010e35f, 0x811a3000, 0x83197480, 0x00000004, - 0x040007ec, 0x040017eb, 0x0201f800, 0x001007ca, - 0x0201f800, 0x0010247e, 0x497b5060, 0x497b4408, - 0x4201d000, 0x003d0900, 0x0201f800, 0x00105961, + 0x0010e46f, 0x811a3000, 0x83197480, 0x00000004, + 0x040007ec, 0x040017eb, 0x0201f800, 0x001007c8, + 0x0201f800, 0x00102488, 0x497b5060, 0x497b4408, + 0x4201d000, 0x003d0900, 0x0201f800, 0x00105a06, 0x59c50880, 0x59c510a3, 0x497b4002, 0x0401febc, 0x0401ff5b, 0x4a03a005, 0x10000000, 0x59c4d005, 0x8268d540, 0x000000f0, 0x486b8805, 0x0401fed4, - 0x0201f800, 0x00102487, 0x40c50000, 0x80c589c0, + 0x0201f800, 0x00102491, 0x40c50000, 0x80c589c0, 0x04020020, 0x59c8d001, 0x8068d1c0, 0x0402001d, 0x59dcd006, 0x8268d500, 0x43000f80, 0x0400000a, 0x59dcd006, 0x82697480, 0x00000000, 0x83f17500, @@ -12052,7 +12109,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x808101c0, 0x04020090, 0x59a0d408, 0x82697480, 0x0000dddd, 0x0400008c, 0x59c0d008, 0x8268d500, 0x0fffffff, 0x59c8d818, 0x826c0500, 0xf0000000, - 0x8068d540, 0x486b8008, 0x0201f800, 0x00100c06, + 0x8068d540, 0x486b8008, 0x0201f800, 0x00100c07, 0x59c0d806, 0x4a038006, 0x10000000, 0x59c0d809, 0x4883900d, 0x59c8d020, 0x8068e130, 0x59c8d020, 0x82690500, 0x00ffffff, 0x59c8d021, 0x8268fd00, @@ -12061,16 +12118,16 @@ static const uint32_t isp_2400_risc_code[] = { 0x04020004, 0x82717480, 0x00000032, 0x04000073, 0x486fc857, 0x4873c857, 0x4877c857, 0x4883c857, 0x487fc857, 0x487bc857, 0x59a9700f, 0x48bbc857, - 0x0201f800, 0x0010249e, 0x4a035060, 0x00000001, + 0x0201f800, 0x001024a8, 0x4a035060, 0x00000001, 0x4200d000, 0x00000064, 0x0401f004, 0x8068d1c0, 0x04000070, 0x8068d040, 0x59c0d807, 0x8c6cdd04, - 0x040007fb, 0x0401fecb, 0x0201f800, 0x00106420, + 0x040007fb, 0x0401fecb, 0x0201f800, 0x001064c5, 0x0401febc, 0x4201d000, 0x000186a0, 0x0201f800, - 0x00105961, 0x488b88a3, 0x48878880, 0x59a8d060, - 0x8068d1c0, 0x0402004e, 0x0201f800, 0x00101cba, - 0x0401f07a, 0x4887c857, 0x0201f800, 0x00101d01, - 0x0401f076, 0x0201f800, 0x001070f2, 0x40c66000, - 0x80c589c0, 0x0400003f, 0x0201f800, 0x001031a2, + 0x00105a06, 0x488b88a3, 0x48878880, 0x59a8d060, + 0x8068d1c0, 0x0402004e, 0x0201f800, 0x00101cbf, + 0x0401f07a, 0x4887c857, 0x0201f800, 0x00101d06, + 0x0401f076, 0x0201f800, 0x00107185, 0x40c66000, + 0x80c589c0, 0x0400003f, 0x0201f800, 0x001031ac, 0x40c65800, 0x80c589c0, 0x04000020, 0x48898a05, 0x48898c05, 0x4882620b, 0x4886640b, 0x59a0d40f, 0x8068d0e0, 0x59a0da0f, 0x406c0000, 0x8068d540, @@ -12079,23 +12136,23 @@ static const uint32_t isp_2400_risc_code[] = { 0x8068d0e0, 0x59a0da0e, 0x406c0000, 0x8068d540, 0x486a600e, 0x59a0d411, 0x8068d0e0, 0x59a0da11, 0x406c0000, 0x8068d540, 0x486a600f, 0x0401fdfe, - 0x80c589c0, 0x04020006, 0x0201f800, 0x001070b2, + 0x80c589c0, 0x04020006, 0x0201f800, 0x00107141, 0x4a034407, 0x00000002, 0x0401f720, 0x48ee6022, 0x58ee580c, 0x4a01d801, 0x00000001, 0x592cd206, 0x4869d805, 0x832cd400, 0x00000007, 0x4869d803, - 0x4895d806, 0x4891d807, 0x4a01d808, 0x0010d89e, + 0x4895d806, 0x4891d807, 0x4a01d808, 0x0010d99e, 0x4a034000, 0x00000001, 0x49334001, 0x0401fec2, 0x0401f036, 0x4a035060, 0x00000001, 0x0401f7aa, 0x4a034407, 0x00000003, 0x0401f708, 0x0201f800, - 0x00101d09, 0x0401f02d, 0x82757480, 0x000000e1, + 0x00101d0e, 0x0401f02d, 0x82757480, 0x000000e1, 0x0402078c, 0x407c0000, 0x80817480, 0x04020789, 0x59a8d00f, 0x80697480, 0x04020786, 0x8278d500, 0x000000f0, 0x04020783, 0x0401fe50, 0x0401f78d, - 0x4a035060, 0x00000001, 0x0201f800, 0x001016e7, + 0x4a035060, 0x00000001, 0x0201f800, 0x001016e8, 0x80c589c0, 0x04000008, 0x59c4d005, 0x8268d500, 0x000000f0, 0x04000007, 0x4a034408, 0x0000bbbb, 0x0401f789, 0x4a034408, 0x0000aaaa, 0x0401f786, - 0x0201f800, 0x00102487, 0x80c57040, 0x04000008, + 0x0201f800, 0x00102491, 0x80c57040, 0x04000008, 0x59c0d007, 0x8268d500, 0x000501c0, 0x0400077e, 0x4a034408, 0x0000dddd, 0x0401f77b, 0x4a034408, 0x0000cccc, 0x0401f778, 0x589d2805, 0x589d2004, @@ -12106,10 +12163,10 @@ static const uint32_t isp_2400_risc_code[] = { 0x58ee580c, 0x4979d801, 0x592cd206, 0x4869d805, 0x832cd400, 0x00000007, 0x4869d803, 0x5931700c, 0x48b9d806, 0x5931700d, 0x48b9d807, 0x4a01d808, - 0x0010d89e, 0x4a034000, 0x00000001, 0x40826000, + 0x0010d99e, 0x4a034000, 0x00000001, 0x40826000, 0x0401fe69, 0x0401f009, 0x41310000, 0x59a26001, - 0x4933c857, 0x0201f800, 0x001070b5, 0x40826000, - 0x0201f800, 0x00101d09, 0x589d0000, 0x809d3800, + 0x4933c857, 0x0201f800, 0x00107144, 0x40826000, + 0x0201f800, 0x00101d0e, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x412d1000, 0x41310800, 0x59a26001, 0x4069d800, @@ -12125,18 +12182,18 @@ static const uint32_t isp_2400_risc_code[] = { 0x58ee580c, 0x592cd205, 0x82697480, 0x00000103, 0x04000030, 0x41351800, 0x41452000, 0x592cd405, 0x8468d55e, 0x486a5c05, 0x42028800, 0x000007fd, - 0x4200d000, 0x00fffffd, 0x0201f800, 0x00103dbf, + 0x4200d000, 0x00fffffd, 0x0201f800, 0x00103dd5, 0x40c66800, 0x80c589c0, 0x04000010, 0x0201f800, - 0x00108c35, 0x80c589c0, 0x04000018, 0x40866000, - 0x4881d801, 0x4a01d808, 0x0010d878, 0x0401f00f, - 0x0201f800, 0x00101cf5, 0x0201f800, 0x001070b2, + 0x00108cee, 0x80c589c0, 0x04000018, 0x40866000, + 0x4881d801, 0x4a01d808, 0x0010d978, 0x0401f00f, + 0x0201f800, 0x00101cfa, 0x0201f800, 0x00107141, 0x40866000, 0x0401f019, 0x59a26001, 0x0201f800, - 0x001070b2, 0x40866000, 0x4a034407, 0x00000002, - 0x0201f800, 0x00101cfd, 0x408a5800, 0x408e6800, - 0x40928800, 0x0401f00d, 0x0201f800, 0x001070b2, + 0x00107141, 0x40866000, 0x4a034407, 0x00000002, + 0x0201f800, 0x00101d02, 0x408a5800, 0x408e6800, + 0x40928800, 0x0401f00d, 0x0201f800, 0x00107141, 0x40866000, 0x4a034407, 0x00000004, 0x0401f7f5, - 0x0201f800, 0x001070b2, 0x40866000, 0x0201f800, - 0x00101cba, 0x408a5800, 0x589d2004, 0x589d1803, + 0x0201f800, 0x00107141, 0x40866000, 0x0201f800, + 0x00101cbf, 0x408a5800, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000005, 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, @@ -12153,12 +12210,12 @@ static const uint32_t isp_2400_risc_code[] = { 0x4883a003, 0x59a0d40e, 0x8068d0e0, 0x59a0da0e, 0x406c0000, 0x80691d40, 0x59a0d411, 0x8068d0e0, 0x59a0da11, 0x406c0000, 0x80691540, 0x4201d000, - 0x00003a98, 0x0201f800, 0x00105961, 0x4883a002, + 0x00003a98, 0x0201f800, 0x00105a06, 0x4883a002, 0x59a97061, 0x48bba008, 0x488fa000, 0x488ba001, 0x59d0d005, 0x4a03a005, 0x10000000, 0x4178d000, 0x04025002, 0x8068d000, 0x8068d1c0, 0x04020007, 0x5884d001, 0x8068d000, 0x48690801, 0x4200d800, - 0x00000001, 0x0401f011, 0x4200d000, 0x0010d90f, + 0x00000001, 0x0401f011, 0x4200d000, 0x0010da0f, 0x4084d800, 0x4178e000, 0x0201f800, 0x0010032a, 0x0401f7f4, 0x497a600d, 0x592e5801, 0x812e59c0, 0x040007df, 0x492e600c, 0x832cdc00, 0x00000006, @@ -12173,7 +12230,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x8c68d504, 0x0400000a, 0x59d0d006, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, 0x82b97580, 0x0c000000, 0x04020010, 0x0401f033, - 0x4200d000, 0x0010d977, 0x4080e000, 0x0201f800, + 0x4200d000, 0x0010da77, 0x4080e000, 0x0201f800, 0x0010032a, 0x59d0d006, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x040007f5, 0x82b97480, 0x0c000000, 0x040007f2, 0x4a03a005, 0x20000000, @@ -12186,9 +12243,9 @@ static const uint32_t isp_2400_risc_code[] = { 0x0401ff4e, 0x0401f009, 0x4a034408, 0x0000dddd, 0x0401f006, 0x48690001, 0x4080d000, 0x0401ff47, 0x80c589c0, 0x040207f6, 0x589d0000, 0x809d3800, - 0x1c01f000, 0x0201f800, 0x001016e7, 0x80c589c0, + 0x1c01f000, 0x0201f800, 0x001016e8, 0x80c589c0, 0x04020002, 0x0401f009, 0x4a034407, 0x00000017, - 0x0201f800, 0x00101cfd, 0x4203e000, 0x50000000, + 0x0201f800, 0x00101d02, 0x4203e000, 0x50000000, 0x497bc856, 0x0401f000, 0x1c01f000, 0x4068d800, 0x59c17009, 0x48bbc857, 0x59c0e009, 0x8270d500, 0x00e00000, 0x04000019, 0x586cd000, 0x486b4210, @@ -12229,7 +12286,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x48bbc857, 0x59c0d007, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, 0x82b97580, 0x0c000000, 0x04020010, 0x0401f035, 0x4200d000, - 0x0010da59, 0x4080e000, 0x0201f800, 0x0010032a, + 0x0010db59, 0x4080e000, 0x0201f800, 0x0010032a, 0x59c0d007, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x040007f5, 0x82b97480, 0x0c000000, 0x040007f2, 0x4a038006, 0x20000000, 0x59c0d007, @@ -12244,12 +12301,12 @@ static const uint32_t isp_2400_risc_code[] = { 0x0401ff54, 0x80c589c0, 0x040207f6, 0x589d0000, 0x809d3800, 0x1c01f000, 0x59a26000, 0x813261c0, 0x04000009, 0x59325809, 0x812e59c0, 0x04000005, - 0x0201f800, 0x001070b2, 0x0201f800, 0x00100589, + 0x0201f800, 0x00107141, 0x0201f800, 0x00100589, 0x497b4000, 0x59a26001, 0x813261c0, 0x04000009, 0x59325809, 0x812e59c0, 0x04000005, 0x0201f800, - 0x001070b2, 0x0201f800, 0x00100589, 0x497b4001, + 0x00107141, 0x0201f800, 0x00100589, 0x497b4001, 0x1c01f000, 0x809d3840, 0x48813800, 0x40690000, - 0x0201f800, 0x0010249e, 0x0201f800, 0x0010d6b1, + 0x0201f800, 0x001024a8, 0x0201f800, 0x0010d7b1, 0x5880d00b, 0x8068d1c0, 0x04020004, 0x5880d00c, 0x8068d1c0, 0x04000007, 0x59a0d00d, 0x8068d1c0, 0x0402000a, 0x4200d000, 0x00000001, 0x0401f009, @@ -12278,7 +12335,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x589d0000, 0x829d3c00, 0x00000003, 0x1c01f000, 0x809d3840, 0x48813800, 0x40690000, 0x497bc856, 0x4203a000, 0x00007600, 0x4200d000, 0x00000040, - 0x0201f800, 0x001010d9, 0x4a03a00a, 0x00000001, + 0x0201f800, 0x001010da, 0x4a03a00a, 0x00000001, 0x4a03a005, 0x20000000, 0x59d0d006, 0x4a03a005, 0x30000000, 0x59d0d006, 0x8c68d50a, 0x040207fe, 0x59a0d20d, 0x48690005, 0x8068d1c0, 0x04020002, @@ -12287,7 +12344,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x8068d0e0, 0x59a0da0e, 0x406c0000, 0x8068d540, 0x48690006, 0x59a0d40c, 0x8068d0e0, 0x59a0da0c, 0x826c0500, 0x0000fffc, 0x8068d540, 0x48690009, - 0x486ba003, 0x0201f800, 0x001070f2, 0x40c66000, + 0x486ba003, 0x0201f800, 0x00107185, 0x40c66000, 0x80c589c0, 0x0400004c, 0x49334001, 0x0201f800, 0x0010056c, 0x40c65800, 0x80c589c0, 0x0400003e, 0x4a025a05, 0x00000018, 0x4a025806, 0x00abcdef, @@ -12305,13 +12362,13 @@ static const uint32_t isp_2400_risc_code[] = { 0x03000000, 0x040007ef, 0x4979000a, 0x4178e000, 0x8270e400, 0x0000000c, 0x8068d840, 0x406cd000, 0x806cd9c0, 0x040207fb, 0x4871000a, 0x486d0005, - 0x0401f7e9, 0x4200d000, 0x0010db35, 0x4200d800, + 0x0401f7e9, 0x4200d000, 0x0010dc35, 0x4200d800, 0x0010056c, 0x4080e000, 0x0201f800, 0x0010032a, - 0x0401f7bc, 0x4200d000, 0x0010db35, 0x4200d800, - 0x001070f2, 0x4080e000, 0x0201f800, 0x0010032a, + 0x0401f7bc, 0x4200d000, 0x0010dc35, 0x4200d800, + 0x00107185, 0x4080e000, 0x0201f800, 0x0010032a, 0x0401f7ae, 0x589d0000, 0x809d3800, 0x1c01f000, 0x809d3840, 0x48813800, 0x40690000, 0x497bc856, - 0x42038000, 0x00007700, 0x0201f800, 0x00100c06, + 0x42038000, 0x00007700, 0x0201f800, 0x00100c07, 0x59c0d006, 0x59a0d40d, 0x48690005, 0x8068d1c0, 0x04020009, 0x497b9009, 0x59e0d003, 0x8268d540, 0x00008060, 0x486bc003, 0x4a038009, 0x00e00000, @@ -12321,7 +12378,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x48690006, 0x59a0d40c, 0x8068d0e0, 0x59a0da0c, 0x826c0500, 0x0000fffc, 0x8068d540, 0x48690009, 0x486bc857, 0x58817009, 0x48bb8003, 0x0201f800, - 0x001070f2, 0x40c66000, 0x80c589c0, 0x04000057, + 0x00107185, 0x40c66000, 0x80c589c0, 0x04000057, 0x49334000, 0x0201f800, 0x0010056c, 0x40c65800, 0x80c589c0, 0x04000049, 0x4a025a05, 0x00000018, 0x4a025806, 0x00abcdef, 0x492e6009, 0x492e600c, @@ -12341,49 +12398,49 @@ static const uint32_t isp_2400_risc_code[] = { 0x4871000a, 0x486d0005, 0x832cd400, 0x00000006, 0x48690008, 0x4080d000, 0x0401feb2, 0x80c589c0, 0x040207ea, 0x59a0d408, 0x82697480, 0x0000dddd, - 0x04020791, 0x0401f011, 0x4200d000, 0x0010dbbd, + 0x04020791, 0x0401f011, 0x4200d000, 0x0010dcbd, 0x4200d800, 0x0010056c, 0x4080e000, 0x0201f800, - 0x0010032a, 0x0401f7b1, 0x4200d000, 0x0010dbbd, - 0x4200d800, 0x001070f2, 0x4080e000, 0x0201f800, + 0x0010032a, 0x0401f7b1, 0x4200d000, 0x0010dcbd, + 0x4200d800, 0x00107185, 0x4080e000, 0x0201f800, 0x0010032a, 0x0401f7a3, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690800, 0x406d0000, 0x0201f800, - 0x00101736, 0x40800000, 0x4084d000, 0x80c4dd00, - 0x0201f800, 0x0010173d, 0x589d0801, 0x589d0000, + 0x00101737, 0x40800000, 0x4084d000, 0x80c4dd00, + 0x0201f800, 0x0010173e, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690800, - 0x406d0000, 0x0201f800, 0x00101736, 0x40800000, - 0x4084d000, 0x80c4dd40, 0x0201f800, 0x0010173d, + 0x406d0000, 0x0201f800, 0x00101737, 0x40800000, + 0x4084d000, 0x80c4dd40, 0x0201f800, 0x0010173e, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x809d3840, 0x48813800, 0x4200d000, - 0x000000ef, 0x0201f800, 0x001013c7, 0x59c4d0a3, + 0x000000ef, 0x0201f800, 0x001013c8, 0x59c4d0a3, 0x8468d55a, 0x8468d53a, 0x486b88a3, 0x0201f800, - 0x00101419, 0x80c589c0, 0x04000043, 0x4200d000, - 0x00000001, 0x0201f800, 0x0010169c, 0x4200d000, - 0x00000001, 0x0201f800, 0x00101622, 0x4178d000, + 0x0010141a, 0x80c589c0, 0x04000043, 0x4200d000, + 0x00000001, 0x0201f800, 0x0010169d, 0x4200d000, + 0x00000001, 0x0201f800, 0x00101623, 0x4178d000, 0x4200d800, 0x00000004, 0x0401ffd5, 0x4201d000, - 0x00000014, 0x0201f800, 0x0010592d, 0x59c4d008, + 0x00000014, 0x0201f800, 0x001059d2, 0x59c4d008, 0x8468d54e, 0x8268d500, 0xffffffe1, 0x486b8808, 0x4a0388a7, 0x0000f7f7, 0x4a038805, 0x04000001, 0x4200d000, 0xbe20bfff, 0x4200d800, 0x80018000, - 0x0201f800, 0x00103a68, 0x4200d000, 0xfffeffff, - 0x4178d800, 0x0201f800, 0x00103a68, 0x42010000, + 0x0201f800, 0x00103a7b, 0x4200d000, 0xfffeffff, + 0x4178d800, 0x0201f800, 0x00103a7b, 0x42010000, 0x00001387, 0x0401f008, 0x80817040, 0x04000048, 0x80810040, 0x42000000, 0xffffffff, 0x80817480, 0x04000009, 0x4201d000, 0x00000014, 0x0201f800, - 0x0010592d, 0x0201f800, 0x001016e7, 0x80c589c0, + 0x001059d2, 0x0201f800, 0x001016e8, 0x80c589c0, 0x040007f2, 0x59c4d005, 0x8268dd00, 0x04000000, 0x8c68d534, 0x04020018, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x82697480, 0x00000008, 0x04020031, - 0x0401f011, 0x0201f800, 0x00101427, 0x80c589c0, - 0x04000006, 0x4178d000, 0x0201f800, 0x0010169c, + 0x0401f011, 0x0201f800, 0x00101428, 0x80c589c0, + 0x04000006, 0x4178d000, 0x0201f800, 0x0010169d, 0x4178d000, 0x0401f7bc, 0x4200d000, 0x00000002, - 0x0201f800, 0x0010169c, 0x4200d000, 0x00000002, + 0x0201f800, 0x0010169d, 0x4200d000, 0x00000002, 0x0401f7b5, 0x4200d000, 0x00020000, 0x0201f800, - 0x00103a6f, 0x4201d000, 0x00000064, 0x0201f800, - 0x0010592d, 0x4200d000, 0xfeffffff, 0x4200d800, - 0x02000000, 0x0201f800, 0x00103a68, 0x4200d000, - 0xfdffffff, 0x4178d800, 0x0201f800, 0x00103a68, + 0x00103a82, 0x4201d000, 0x00000064, 0x0201f800, + 0x001059d2, 0x4200d000, 0xfeffffff, 0x4200d800, + 0x02000000, 0x0201f800, 0x00103a7b, 0x4200d000, + 0xfdffffff, 0x4178d800, 0x0201f800, 0x00103a7b, 0x4a038805, 0x04000001, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x4178d800, 0x8068d1c0, 0x04020005, 0x4200d800, 0x00000001, 0x0401f002, 0x40c4d800, @@ -12396,45 +12453,45 @@ static const uint32_t isp_2400_risc_code[] = { 0x0402000e, 0x59a0d407, 0x82690500, 0x00000007, 0x82817480, 0x00000002, 0x04000015, 0x808101c0, 0x04000023, 0x80817040, 0x040000e0, 0x0201f800, - 0x00101d01, 0x0401f18d, 0x0201f800, 0x00101443, + 0x00101d06, 0x0401f18d, 0x0201f800, 0x00101444, 0x80c589c0, 0x040007f0, 0x4200d000, 0x00000002, - 0x0201f800, 0x0010169c, 0x4200d000, 0x00000002, - 0x0201f800, 0x00101622, 0x0401f7e7, 0x8d0e1d0e, - 0x0402000c, 0x0201f800, 0x0010470f, 0x80c589c0, + 0x0201f800, 0x0010169d, 0x4200d000, 0x00000002, + 0x0201f800, 0x00101623, 0x0401f7e7, 0x8d0e1d0e, + 0x0402000c, 0x0201f800, 0x0010474e, 0x80c589c0, 0x04020170, 0x836d7480, 0x00000003, 0x04020005, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x04000010, - 0x0201f800, 0x00101d05, 0x0401f170, 0x4200d000, + 0x0201f800, 0x00101d0a, 0x0401f170, 0x4200d000, 0x000000c0, 0x4200d800, 0x00000002, 0x0401ff28, 0x4080d000, 0x4200d800, 0x00000008, 0x0401ff24, 0x0401ff35, 0x80c589c0, 0x040000bb, 0x59a0d410, 0x8068d0e0, 0x59a0da10, 0x406c0000, 0x8068d540, 0x48694000, 0x497b4408, 0x4979400b, 0x4979400c, 0x4979400d, 0x49794002, 0x49794001, 0x0201f800, - 0x0010247e, 0x0201f800, 0x00106106, 0x598e600f, - 0x0201f800, 0x00106381, 0x0201f800, 0x00106106, - 0x417a3000, 0x0201f800, 0x00106705, 0x59926004, - 0x813261c0, 0x0400000d, 0x0201f800, 0x0010629a, - 0x0201f800, 0x001060d8, 0x0201f800, 0x001060e1, + 0x00102488, 0x0201f800, 0x001061ab, 0x598e600f, + 0x0201f800, 0x00106426, 0x0201f800, 0x001061ab, + 0x417a3000, 0x0201f800, 0x001067aa, 0x59926004, + 0x813261c0, 0x0400000d, 0x0201f800, 0x0010633f, + 0x0201f800, 0x0010617d, 0x0201f800, 0x00106186, 0x42027800, 0x00001000, 0x42028000, 0x0000002e, - 0x0201f800, 0x0010e35f, 0x811a3000, 0x83197480, + 0x0201f800, 0x0010e46f, 0x811a3000, 0x83197480, 0x00000004, 0x040007ec, 0x040017eb, 0x0201f800, - 0x001007ca, 0x59a8d06a, 0x8068d1c0, 0x0402007f, + 0x001007c8, 0x59a8d06a, 0x8068d1c0, 0x0402007f, 0x49794004, 0x497b4002, 0x40a0d000, 0x0401fe49, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000126, 0x40a0d000, 0x0401fdbb, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000120, 0x59a0d00d, 0x8068d1c0, 0x040200ef, 0x4979400e, 0x40a0d000, 0x0201f800, - 0x0010d90f, 0x0201f800, 0x0010d658, 0x58a0d004, + 0x0010da0f, 0x0201f800, 0x0010d758, 0x58a0d004, 0x8068d1c0, 0x04000053, 0x58a0e00e, 0x80717040, 0x0400007c, 0x59c8d001, 0x8068d1c0, 0x04020070, 0x59a0d002, 0x42000000, 0xfeedbeef, 0x80697480, 0x040000d8, 0x4a014003, 0x10000000, 0x40a0d000, 0x0401fc64, 0x4a034002, 0xfeedbeef, 0x40a0d000, - 0x0201f800, 0x0010d977, 0x59a0d408, 0x82697480, + 0x0201f800, 0x0010da77, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000028, 0x40a0d000, 0x0401fcb5, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000022, - 0x0201f800, 0x0010d69f, 0x59c4d005, 0x8c68d534, - 0x040200cf, 0x0201f800, 0x00102487, 0x80c589c0, + 0x0201f800, 0x0010d79f, 0x59c4d005, 0x8c68d534, + 0x040200cf, 0x0201f800, 0x00102491, 0x80c589c0, 0x040200ce, 0x59a0d00d, 0x8068d1c0, 0x04000016, 0x59a26000, 0x59a0d40d, 0x8068d1c0, 0x04000004, 0x5930d00e, 0x8068d1c0, 0x040207c7, 0x59a26001, @@ -12446,16 +12503,16 @@ static const uint32_t isp_2400_risc_code[] = { 0x04020042, 0x40a0d000, 0x0401fcf3, 0x80c589c0, 0x04020051, 0x58a0d000, 0x8068d1c0, 0x04020047, 0x0401f04d, 0x59c8d001, 0x8068d1c0, 0x040207af, - 0x40a0d000, 0x0201f800, 0x0010d977, 0x59a0d408, + 0x40a0d000, 0x0201f800, 0x0010da77, 0x59a0d408, 0x82697480, 0x0000dddd, 0x040007a8, 0x0201f800, - 0x00102487, 0x80c589c0, 0x040007f3, 0x0201f800, - 0x0010d9ce, 0x4a01400d, 0x0000aaaa, 0x4a01400e, + 0x00102491, 0x80c589c0, 0x040007f3, 0x0201f800, + 0x0010dace, 0x4a01400d, 0x0000aaaa, 0x4a01400e, 0x00000001, 0x0401f79d, 0x59c4d001, 0x8468d518, 0x486b8801, 0x0401f77f, 0x4200d000, 0x000000c0, 0x4080d800, 0x0401fe6a, 0x0401fe7b, 0x80c589c0, 0x04020747, 0x4088d000, 0x408cd800, 0x4090e000, 0x0201f800, 0x0010032a, 0x0401f741, 0x40a0d000, - 0x0201f800, 0x0010d9dc, 0x80c589c0, 0x0400078d, + 0x0201f800, 0x0010dadc, 0x80c589c0, 0x0400078d, 0x4a01400e, 0x00000001, 0x4200e000, 0x00000001, 0x58a0d000, 0x8068d040, 0x48694000, 0x4200d800, 0x00030d40, 0x80717040, 0x04020004, 0x0401f7c2, @@ -12464,8 +12521,8 @@ static const uint32_t isp_2400_risc_code[] = { 0x59c0d007, 0x8268d500, 0x000501c0, 0x04000058, 0x4a01400d, 0x0000dddd, 0x40a0d000, 0x0401fca6, 0x80c589c0, 0x04020004, 0x58a0d000, 0x8068d1c0, - 0x0402074c, 0x0201f800, 0x00106420, 0x0201f800, - 0x0010d6a5, 0x4201d000, 0x000186a0, 0x48978880, + 0x0402074c, 0x0201f800, 0x001064c5, 0x0201f800, + 0x0010d7a5, 0x4201d000, 0x000186a0, 0x48978880, 0x48938808, 0x488f88a3, 0x4887500f, 0x488b9040, 0x42038000, 0x00007700, 0x4a038009, 0xf4f60000, 0x4a038891, 0x0000ffff, 0x4a03900d, 0x00000040, @@ -12475,117 +12532,121 @@ static const uint32_t isp_2400_risc_code[] = { 0x04000013, 0x4200d000, 0x000000c0, 0x4200d800, 0xfffffffc, 0x0401fe04, 0x4178d000, 0x4200d800, 0xfffffff7, 0x0401fe00, 0x4178d000, 0x4200d800, - 0xfffffffb, 0x0401fdfc, 0x0201f800, 0x0010472b, + 0xfffffffb, 0x0401fdfc, 0x0201f800, 0x0010476a, 0x40c50000, 0x80c589c0, 0x04000034, 0x59a0d408, 0x82697480, 0x0000dddd, 0x0400000f, 0x58a0d80b, 0x806cd9c0, 0x04020007, 0x58a0d00c, 0x8068d1c0, 0x04020004, 0x58a0d00d, 0x8068d1c0, 0x0400003d, 0x486f4407, 0x58a0d00c, 0x486b4208, 0x58a0d00d, - 0x486b4408, 0x0201f800, 0x00101d0d, 0x0401f037, + 0x486b4408, 0x0201f800, 0x00101d12, 0x0401f037, 0x4a014003, 0x10000004, 0x0401f729, 0x40a0d000, - 0x0201f800, 0x0010d90f, 0x0401f70f, 0x0201f800, - 0x0010d9ce, 0x0401f7a7, 0x40a0d000, 0x0401fc4e, + 0x0201f800, 0x0010da0f, 0x0401f70f, 0x0201f800, + 0x0010dace, 0x0401f7a7, 0x40a0d000, 0x0401fc4e, 0x80c589c0, 0x040007a5, 0x0401f7ab, 0x4a01400d, 0x0000bbbb, 0x0401f787, 0x4a01400d, 0x0000cccc, 0x58a0d000, 0x486b4210, 0x58a0d000, 0x8068d120, 0x486b4410, 0x0401f77f, 0x59a8d06b, 0x0201f800, - 0x001018fd, 0x0401f7b6, 0x4a0388a7, 0x0000f7f7, + 0x001018fe, 0x0401f7b6, 0x4a0388a7, 0x0000f7f7, 0x4200d000, 0xbeffffff, 0x4200d800, 0x80018000, - 0x0201f800, 0x00103a68, 0x4200d000, 0xfffeffff, - 0x4080d800, 0x0201f800, 0x00103a68, 0x0401f7c0, - 0x4a034407, 0x00000016, 0x0201f800, 0x00101cfd, + 0x0201f800, 0x00103a7b, 0x4200d000, 0xfffeffff, + 0x4080d800, 0x0201f800, 0x00103a7b, 0x0401f7c0, + 0x4a034407, 0x00000016, 0x0201f800, 0x00101d02, 0x0401f006, 0x40a0d000, 0x0401fc27, 0x0401f786, - 0x0201f800, 0x00101cba, 0x589d2805, 0x589d2004, + 0x0201f800, 0x00101cbf, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000015, 0x589d4000, 0x809d3800, 0x1c01f000, 0x4937c857, 0x5934d200, 0x8468d502, - 0x486a6a00, 0x1c01f000, 0x809d3840, 0x48813800, + 0x486a6a00, 0x1c01f000, 0x829d3c80, 0x00000002, + 0x48813800, 0x48853801, 0x59a8d006, 0x82690d00, + 0x00004000, 0x4178d800, 0x8c68d51c, 0x0402001f, 0x4937c857, 0x42010000, 0x00000001, 0x0201f800, - 0x001070f2, 0x40c66000, 0x80c589c0, 0x04000014, - 0x4935880a, 0x48818c07, 0x417a7800, 0x0201f800, - 0x00103d7f, 0x59a8d016, 0x8068d000, 0x486b5016, - 0x599cd019, 0x417a7000, 0x8c68d50e, 0x04020003, - 0x42027000, 0x00000004, 0x0201f800, 0x00107123, - 0x599cd208, 0x486a6c12, 0x41790000, 0x40818800, - 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, - 0x00000004, 0x48813800, 0x48853801, 0x48893802, - 0x488d3803, 0x41350800, 0x41451000, 0x412d1800, - 0x4943c857, 0x493fc857, 0x0201f800, 0x00106106, - 0x40c50000, 0x59a8d073, 0x82697480, 0x00000000, - 0x83f17500, 0x0c000000, 0x04000004, 0x82b97580, - 0x0c000000, 0x04020068, 0x0201f800, 0x0010e613, - 0x0201f800, 0x0010e603, 0x0201f800, 0x0010e6ab, - 0x0201f800, 0x0010e80e, 0x808101c0, 0x04000003, - 0x0201f800, 0x001060fa, 0x417a8800, 0x0401f00a, - 0x58c4d200, 0x8c68d50e, 0x0400000e, 0x81468800, - 0x83457480, 0x000007ef, 0x83f17500, 0x03000000, - 0x04000026, 0x0201f800, 0x00103e62, 0x40c66800, - 0x80c589c0, 0x040007f6, 0x8d3e7d06, 0x040207f1, - 0x8d3e7d18, 0x0400003f, 0x5935000f, 0x0401f007, - 0x49410207, 0x40825800, 0x58810000, 0x492fc857, - 0x0201f800, 0x000203ab, 0x808101c0, 0x040207f9, - 0x497a680f, 0x497a6810, 0x4937c857, 0x4a026c00, - 0x00000707, 0x497a6a03, 0x497a6811, 0x599cd401, - 0x486a6a0b, 0x5934d402, 0x8268d500, 0x000000ff, - 0x486a6c02, 0x81468800, 0x83457480, 0x000007ef, - 0x040007dd, 0x040017dc, 0x8d3e7d02, 0x0400002f, - 0x497b5018, 0x42028800, 0x000007f0, 0x0401f007, - 0x81468800, 0x83457480, 0x000007ff, 0x83f17500, - 0x03000000, 0x04000025, 0x0201f800, 0x00103e62, - 0x40c66800, 0x80c589c0, 0x040007f6, 0x48c7c857, - 0x4a018c00, 0x00000707, 0x58c4d00c, 0x8068d1c0, - 0x040207f0, 0x58c4d00f, 0x8068d1c0, 0x040207ed, - 0x0201f800, 0x00103aa1, 0x81468800, 0x83457480, - 0x000007ff, 0x040007ed, 0x040017ec, 0x0401f00f, - 0x4937c857, 0x8d0e1d20, 0x04000004, 0x4a026c00, - 0x00000707, 0x0401f7ae, 0x0201f800, 0x00103aa1, - 0x0401f7ab, 0x8c68d506, 0x04000798, 0x0201f800, - 0x0010a605, 0x0401f795, 0x40866800, 0x408a8800, - 0x408e5800, 0x589d1803, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000004, 0x1c01f000, - 0x829d3c80, 0x00000006, 0x48813800, 0x48853801, - 0x48893802, 0x488d3803, 0x48913804, 0x48953805, - 0x41352800, 0x41412000, 0x41451800, 0x412d1000, - 0x4933c857, 0x493fc857, 0x0201f800, 0x00106106, - 0x40c50800, 0x5932680a, 0x813669c0, 0x0400002a, - 0x5934d403, 0x406a8800, 0x42028000, 0x00000029, - 0x0201f800, 0x0010e4c8, 0x0201f800, 0x0010e5a4, - 0x0201f800, 0x0010e63d, 0x0201f800, 0x0010ea62, - 0x4937c857, 0x8d3e7d06, 0x0402001e, 0x8d3e7d18, - 0x04000021, 0x5935000f, 0x808101c0, 0x0400000b, - 0x49410207, 0x40825800, 0x58810000, 0x492fc857, - 0x0201f800, 0x000203ab, 0x808101c0, 0x040207f9, - 0x4882680f, 0x48826810, 0x4937c857, 0x4a026c00, - 0x00000707, 0x497a6a03, 0x497a6811, 0x599cd401, - 0x486a6a0b, 0x5934d402, 0x8268d500, 0x000000ff, - 0x486a6c02, 0x808509c0, 0x04000013, 0x0401f00c, - 0x5934d200, 0x8c68d50e, 0x040207fb, 0x8d3e7d18, - 0x040207e1, 0x8d0e1d20, 0x04000008, 0x4a026c00, + 0x00107185, 0x40c66000, 0x80c589c0, 0x04020003, + 0x4080d800, 0x0401f015, 0x4935880a, 0x48818c07, + 0x40867800, 0x0201f800, 0x00103d92, 0x59a8d016, + 0x8068d000, 0x486b5016, 0x599cd019, 0x40867000, + 0x8c68d50e, 0x04020003, 0x42027000, 0x00000004, + 0x0201f800, 0x001071b6, 0x599cd208, 0x486a6c12, + 0x41790000, 0x4080d800, 0x406d8800, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, + 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, + 0x48893802, 0x488d3803, 0x41350800, 0x41451000, + 0x412d1800, 0x4943c857, 0x493fc857, 0x0201f800, + 0x001061ab, 0x40c50000, 0x59a8d073, 0x82697480, + 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, + 0x82b97580, 0x0c000000, 0x04020069, 0x0201f800, + 0x0010e718, 0x0201f800, 0x0010e708, 0x0201f800, + 0x0010e7b0, 0x0201f800, 0x0010e913, 0x808101c0, + 0x04000003, 0x0201f800, 0x0010619f, 0x417a8800, + 0x0401f00a, 0x58c4d200, 0x8c68d50e, 0x0400000e, + 0x81468800, 0x83457480, 0x000007ef, 0x83f17500, + 0x03000000, 0x04000027, 0x0201f800, 0x00103e78, + 0x40c66800, 0x80c589c0, 0x040007f6, 0x8d3e7d06, + 0x040207f1, 0x497a6c0b, 0x8d3e7d18, 0x0400003f, + 0x5935000f, 0x0401f007, 0x49410207, 0x40825800, + 0x58810000, 0x492fc857, 0x0201f800, 0x000203ab, + 0x808101c0, 0x040207f9, 0x497a680f, 0x497a6810, + 0x4937c857, 0x4a026c00, 0x00000707, 0x497a6a03, + 0x497a6811, 0x599cd401, 0x486a6a0b, 0x5934d402, + 0x8268d500, 0x000000ff, 0x486a6c02, 0x81468800, + 0x83457480, 0x000007ef, 0x040007dc, 0x040017db, + 0x8d3e7d02, 0x0400002f, 0x497b5018, 0x42028800, + 0x000007f0, 0x0401f007, 0x81468800, 0x83457480, + 0x000007ff, 0x83f17500, 0x03000000, 0x04000025, + 0x0201f800, 0x00103e78, 0x40c66800, 0x80c589c0, + 0x040007f6, 0x48c7c857, 0x4a018c00, 0x00000707, + 0x58c4d00c, 0x8068d1c0, 0x040207f0, 0x58c4d00f, + 0x8068d1c0, 0x040207ed, 0x0201f800, 0x00103ab4, + 0x81468800, 0x83457480, 0x000007ff, 0x040007ed, + 0x040017ec, 0x0401f00f, 0x4937c857, 0x8d0e1d20, + 0x04000004, 0x4a026c00, 0x00000707, 0x0401f7ad, + 0x0201f800, 0x00103ab4, 0x0401f7aa, 0x8c68d506, + 0x04000797, 0x0201f800, 0x0010a6f8, 0x0401f794, + 0x40866800, 0x408a8800, 0x408e5800, 0x589d1803, + 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00000004, 0x1c01f000, 0x829d3c80, 0x00000006, + 0x48813800, 0x48853801, 0x48893802, 0x488d3803, + 0x48913804, 0x48953805, 0x41352800, 0x41412000, + 0x41451800, 0x412d1000, 0x4933c857, 0x493fc857, + 0x0201f800, 0x001061ab, 0x40c50800, 0x5932680a, + 0x813669c0, 0x0400002b, 0x5934d403, 0x406a8800, + 0x42028000, 0x00000029, 0x0201f800, 0x0010e5d8, + 0x0201f800, 0x0010e6a9, 0x0201f800, 0x0010e742, + 0x0201f800, 0x0010eb5d, 0x4937c857, 0x8d3e7d06, + 0x0402001f, 0x497a6c0b, 0x8d3e7d18, 0x04000022, + 0x5935000f, 0x808101c0, 0x0400000b, 0x49410207, + 0x40825800, 0x58810000, 0x492fc857, 0x0201f800, + 0x000203ab, 0x808101c0, 0x040207f9, 0x4882680f, + 0x48826810, 0x4937c857, 0x4a026c00, 0x00000707, + 0x497a6a03, 0x497a6811, 0x599cd401, 0x486a6a0b, + 0x5934d402, 0x8268d500, 0x000000ff, 0x486a6c02, + 0x808509c0, 0x04000014, 0x0401f00d, 0x5934d200, + 0x8c68d50e, 0x040207fb, 0x497a6c0b, 0x8d3e7d18, + 0x040207e0, 0x8d0e1d20, 0x04000008, 0x4a026c00, 0x00000707, 0x808509c0, 0x04000007, 0x0201f800, - 0x001060fa, 0x0401f004, 0x0201f800, 0x00103aa1, - 0x0401f7ed, 0x408a5800, 0x408e8800, 0x40928000, + 0x0010619f, 0x0401f004, 0x0201f800, 0x00103ab4, + 0x0401f7ec, 0x408a5800, 0x408e8800, 0x40928000, 0x40966800, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000006, 0x1c01f000, 0x809d3840, 0x48813800, 0x4937c857, 0x42010000, 0x00000001, 0x0201f800, - 0x001070f2, 0x40c66000, 0x80c589c0, 0x0400001d, + 0x00107185, 0x40c66000, 0x80c589c0, 0x0400001d, 0x4935880a, 0x5934d403, 0x82697480, 0x000007fe, - 0x04000003, 0x417a7800, 0x0401ff92, 0x48826407, - 0x417a7800, 0x0201f800, 0x00103d7f, 0x4200d000, - 0x00000003, 0x0201f800, 0x00103d89, 0x836d7480, + 0x04000003, 0x417a7800, 0x0401ff90, 0x48826407, + 0x417a7800, 0x0201f800, 0x00103d92, 0x4200d000, + 0x00000003, 0x0201f800, 0x00103d9c, 0x836d7480, 0x00000003, 0x04000004, 0x59a8d016, 0x8068d000, 0x486b5016, 0x42027000, 0x00000002, 0x0201f800, - 0x00107123, 0x599cd208, 0x486a6c12, 0x41790000, + 0x001071b6, 0x599cd208, 0x486a6c12, 0x41790000, 0x40818800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x497bc856, 0x42010000, 0x00000001, 0x48835017, 0x42028800, 0x000007fe, 0x4200d000, 0x00fffffe, - 0x0201f800, 0x00103dbf, 0x40c66800, 0x80c589c0, - 0x04000012, 0x0401feb4, 0x0401ffc4, 0x40c50800, + 0x0201f800, 0x00103dd5, 0x40c66800, 0x80c589c0, + 0x04000012, 0x0401fea4, 0x0401ffc4, 0x40c50800, 0x80c589c0, 0x0402000d, 0x599cd208, 0x486a6c12, 0x59a8d21b, 0x8268d500, 0xffffdefc, 0x486b521b, 0x59a8d21b, 0x8468d54e, 0x486b521b, 0x0201f800, - 0x00108bc4, 0x40850000, 0x40818800, 0x589d0801, + 0x00108c7d, 0x40850000, 0x40818800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x41791000, @@ -12594,58 +12655,58 @@ static const uint32_t isp_2400_risc_code[] = { 0x826d7480, 0x0000007e, 0x83f17500, 0x03000000, 0x04000044, 0x406d1000, 0x497bc856, 0x406c0000, 0x4200d000, 0x0000007e, 0x8068b480, 0x8058b1c0, - 0x0400003c, 0x42012000, 0x00101b0a, 0x0401f014, - 0x42010800, 0x00000001, 0x0201f800, 0x00104416, - 0x0201f800, 0x0010415e, 0x80c57040, 0x04000034, + 0x0400003c, 0x42012000, 0x00101b0f, 0x0401f014, + 0x42010800, 0x00000001, 0x0201f800, 0x00104435, + 0x0201f800, 0x0010417a, 0x80c57040, 0x04000034, 0x59a8d056, 0x8c68d502, 0x04020041, 0x4937c857, 0x599cd019, 0x8c68d50e, 0x04000066, 0x8058b040, 0x80891000, 0x8058b1c0, 0x04000026, 0x40880000, 0x8090d400, 0x5868d000, 0x82690500, 0x000000ff, 0x408c0000, 0x80817480, 0x040007f5, 0x4080d000, - 0x0201f800, 0x0010f02b, 0x80c589c0, 0x0400005e, + 0x0201f800, 0x0010f133, 0x80c589c0, 0x0400005e, 0x59a8d06d, 0x8c68d502, 0x04000007, 0x4200d000, - 0x00000010, 0x0201f800, 0x00104421, 0x80c57040, - 0x04000010, 0x41790800, 0x0201f800, 0x00103e62, + 0x00000010, 0x0201f800, 0x00104440, 0x80c57040, + 0x04000010, 0x41790800, 0x0201f800, 0x00103e78, 0x80c589c0, 0x040207d3, 0x599cd019, 0x8c68d50e, - 0x040207df, 0x4080d000, 0x0201f800, 0x00103dc5, + 0x040207df, 0x4080d000, 0x0201f800, 0x00103ddb, 0x80c589c0, 0x040207cd, 0x488b5017, 0x0401f048, 0x4a035017, 0x0000ffff, 0x0401f045, 0x8d0e1d02, 0x04020034, 0x59a8d056, 0x8c68d500, 0x04000005, - 0x0201f800, 0x00101aca, 0x80c57040, 0x040007cc, - 0x0401fe3e, 0x80c57040, 0x040207c9, 0x0401f7ef, + 0x0201f800, 0x00101acf, 0x80c57040, 0x040007cc, + 0x0401fe2e, 0x80c57040, 0x040207c9, 0x0401f7ef, 0x4200b000, 0x0000007e, 0x0401f7b1, 0x0201f800, - 0x0010418e, 0x40c50000, 0x80c589c0, 0x040207c0, - 0x808509c0, 0x04000029, 0x0201f800, 0x00101aca, - 0x80c57040, 0x040007ba, 0x42026000, 0x0010f53c, - 0x4936600a, 0x48826009, 0x40827800, 0x0401fed5, - 0x4200d000, 0x0010bc1d, 0x0201f800, 0x0010ad1c, + 0x001041aa, 0x40c50000, 0x80c589c0, 0x040207c0, + 0x808509c0, 0x04000029, 0x0201f800, 0x00101acf, + 0x80c57040, 0x040007ba, 0x42026000, 0x0010f64c, + 0x4936600a, 0x48826009, 0x40827800, 0x0401fed3, + 0x4200d000, 0x0010bd1d, 0x0201f800, 0x0010ae0f, 0x8d0e1d20, 0x040007ae, 0x41450000, 0x41410800, 0x5934d403, 0x406a8800, 0x42028000, 0x00000029, 0x4178d000, 0x4200d800, 0x00000008, 0x0201f800, - 0x00109f3f, 0x40828800, 0x40868000, 0x0401f7a0, + 0x0010a016, 0x40828800, 0x40868000, 0x0401f7a0, 0x5934d200, 0x8c68d50e, 0x04000796, 0x0401f7ca, - 0x0401fe09, 0x0401ff19, 0x80c57040, 0x04020798, - 0x488b5017, 0x0401f796, 0x0201f800, 0x00103e30, + 0x0401fdf9, 0x0401ff19, 0x80c57040, 0x04020798, + 0x488b5017, 0x0401f796, 0x0201f800, 0x00103e46, 0x0401f793, 0x4937c857, 0x0401f7b8, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000005, 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x59a8d00f, 0x82691d00, 0x000000ff, 0x59a90817, 0x82857480, 0x0000ffff, - 0x0400006a, 0x41791000, 0x42012000, 0x0010c1c7, + 0x0400006a, 0x41791000, 0x42012000, 0x0010c2c7, 0x80840104, 0x8090d400, 0x5868d000, 0x8284dd00, 0x00000003, 0x826d7480, 0x00000002, 0x04000057, 0x826d7480, 0x00000002, 0x83f17500, 0x03000000, 0x04000030, 0x806d7040, 0x04000052, 0x82690500, 0x000000ff, 0x82817480, 0x000000ff, 0x04000032, - 0x40800000, 0x4200d000, 0x00101b0a, 0x8068d400, + 0x40800000, 0x4200d000, 0x00101b0f, 0x8068d400, 0x5868d000, 0x8068d110, 0x82697480, 0x00000080, 0x0400001c, 0x408c0000, 0x80817480, 0x04000019, 0x808101c0, 0x04000017, 0x59a8d06d, 0x8c68d502, 0x04000007, 0x4200d000, 0x00000010, 0x0201f800, - 0x00104421, 0x80c57040, 0x0400003f, 0x417a8800, - 0x4080d000, 0x0201f800, 0x0010f0a4, 0x80c589c0, - 0x0400002c, 0x0201f800, 0x00103e10, 0x80c589c0, + 0x00104440, 0x80c57040, 0x0400003f, 0x417a8800, + 0x4080d000, 0x0201f800, 0x0010f1ac, 0x80c589c0, + 0x0400002c, 0x0201f800, 0x00103e26, 0x80c589c0, 0x0402002e, 0x599cd019, 0x8c68d50e, 0x0400001a, 0x80850800, 0x80897040, 0x040207c6, 0x0401f030, 0x826d7480, 0x00000003, 0x040207d1, 0x8068d130, @@ -12653,12 +12714,12 @@ static const uint32_t isp_2400_risc_code[] = { 0x040207d0, 0x830cd500, 0x00000003, 0x04020022, 0x59a8d056, 0x8468d542, 0x486b5056, 0x4a035017, 0x0000ffff, 0x0401fefb, 0x42011000, 0x00000001, - 0x0401f7e9, 0x4080d000, 0x0201f800, 0x00103dbf, - 0x80c589c0, 0x04000007, 0x0201f800, 0x00104416, - 0x0401fd8d, 0x0401fe9d, 0x80c589c0, 0x040007dd, + 0x0401f7e9, 0x4080d000, 0x0201f800, 0x00103dd5, + 0x80c589c0, 0x04000007, 0x0201f800, 0x00104435, + 0x0401fd7d, 0x0401fe9d, 0x80c589c0, 0x040007dd, 0x48875017, 0x0401f00e, 0x8068d120, 0x0401f7b0, - 0x8068d110, 0x0401f7ae, 0x0201f800, 0x00104416, - 0x0401fd86, 0x0401f7f5, 0x42010800, 0x00000001, + 0x8068d110, 0x0401f7ae, 0x0201f800, 0x00104435, + 0x0401fd76, 0x0401f7f5, 0x42010800, 0x00000001, 0x0401f795, 0x4a035017, 0x0000ffff, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000005, 0x1c01f000, 0x8c68d504, @@ -12666,18 +12727,18 @@ static const uint32_t isp_2400_risc_code[] = { 0x59a8d056, 0x8c68d500, 0x04000003, 0x8c68d502, 0x04000003, 0x0401fecb, 0x0401f002, 0x0401ff70, 0x1c01f000, 0x809d3840, 0x48813800, 0x59a9021b, - 0x0201f800, 0x001040c4, 0x80c589c0, 0x04000002, - 0x0401f01d, 0x0201f800, 0x0010470f, 0x80c589c0, + 0x0201f800, 0x001040de, 0x80c589c0, 0x04000002, + 0x0401f01d, 0x0201f800, 0x0010474e, 0x80c589c0, 0x04000007, 0x8c810500, 0x0402000a, 0x8c81050e, 0x040207f8, 0x0401fe8f, 0x0401f013, 0x8c810506, 0x040207f9, 0x4080d000, 0x0401ffdd, 0x0401f00e, - 0x0201f800, 0x00101afe, 0x80c589c0, 0x040207ed, - 0x0201f800, 0x0010470f, 0x80c589c0, 0x04000004, + 0x0201f800, 0x00101b03, 0x80c589c0, 0x040207ed, + 0x0201f800, 0x0010474e, 0x80c589c0, 0x04000004, 0x4a035017, 0x0000ffff, 0x0401f003, 0x4080d000, 0x0401ffcf, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000003, 0x48813800, 0x48853801, 0x48893802, 0x40690800, 0x406d1000, 0x41bd0000, - 0x0201f800, 0x001060e1, 0x5880d031, 0x41300000, + 0x0201f800, 0x00106186, 0x5880d031, 0x41300000, 0x80697480, 0x04000018, 0x5880d030, 0x41300000, 0x80697480, 0x0400001f, 0x5930d800, 0x806cd9c0, 0x04020008, 0x59317001, 0x48b91001, 0x5930d001, @@ -12701,7 +12762,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x00000004, 0x409d4000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x41790800, 0x40850000, 0x4933c857, - 0x0201f800, 0x00106106, 0x40c52000, 0x41351800, + 0x0201f800, 0x001061ab, 0x40c52000, 0x41351800, 0x41191000, 0x49914003, 0x49d14000, 0x49a54001, 0x49154002, 0x5932680a, 0x59bce031, 0x4070d800, 0x8070e1c0, 0x04020008, 0x0401f01e, 0x406ce000, @@ -12713,46 +12774,46 @@ static const uint32_t isp_2400_risc_code[] = { 0x806cd9c0, 0x040007ec, 0x806d7480, 0x040207fb, 0x42010800, 0x00000001, 0x806cd9c0, 0x040207e8, 0x80857040, 0x04000029, 0x417a3000, 0x0201f800, - 0x00106705, 0x5990d004, 0x41300000, 0x80697480, + 0x001067aa, 0x5990d004, 0x41300000, 0x80697480, 0x0400000f, 0x811a3000, 0x83197480, 0x00000004, 0x040007f7, 0x040017f6, 0x408a3000, 0x408e6800, 0x58a32003, 0x58a3a000, 0x58a34801, 0x58a22802, 0x80917040, 0x04020019, 0x0401f011, 0x42010800, - 0x00000001, 0x0201f800, 0x0010629a, 0x0201f800, - 0x001060d8, 0x0201f800, 0x001060e1, 0x408a3000, + 0x00000001, 0x0201f800, 0x0010633f, 0x0201f800, + 0x0010617d, 0x0201f800, 0x00106186, 0x408a3000, 0x408e6800, 0x58a32003, 0x58a3a000, 0x58a34801, 0x58a22802, 0x80917040, 0x04020008, 0x0201f800, - 0x001060fa, 0x0401f005, 0x4070d000, 0x4080d800, + 0x0010619f, 0x0401f005, 0x4070d000, 0x4080d800, 0x0401ff40, 0x0401f7e1, 0x40858800, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000009, 0x589d4000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, 0x59310800, 0x497a6000, - 0x0201f800, 0x001060e1, 0x808101c0, 0x04000008, + 0x0201f800, 0x00106186, 0x808101c0, 0x04000008, 0x48850000, 0x598cd00a, 0x41300000, 0x80697480, 0x0402000b, 0x4883180a, 0x0401f009, 0x598cd00a, 0x41300000, 0x80697480, 0x04000003, 0x4887180b, 0x0401f003, 0x4883180a, 0x4883180b, 0x0201f800, - 0x001060f3, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00106198, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x598d000b, 0x41790800, 0x4933c857, 0x813261c0, 0x04020007, 0x0401f00a, 0x41300000, 0x80817480, 0x0400000e, 0x40810800, 0x58810000, 0x808101c0, 0x040207fa, 0x4178d000, - 0x0401f015, 0x4200d000, 0x000005a7, 0x4080d800, + 0x0401f015, 0x4200d000, 0x000005aa, 0x4080d800, 0x4084e000, 0x0201f800, 0x0010032a, 0x0401f7f6, 0x4084d000, 0x0401ffc4, 0x598cd00f, 0x41300000, 0x80697480, 0x04000005, 0x497a6008, 0x4200d000, - 0x00000001, 0x0401f004, 0x0201f800, 0x001066dd, + 0x00000001, 0x0401f004, 0x0201f800, 0x00106782, 0x0401f7fa, 0x40698800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, - 0x59310800, 0x497a6000, 0x0201f800, 0x001060e1, + 0x59310800, 0x497a6000, 0x0201f800, 0x00106186, 0x808101c0, 0x04000008, 0x48850000, 0x598cd008, 0x41300000, 0x80697480, 0x0402000b, 0x48831808, 0x0401f009, 0x598cd008, 0x41300000, 0x80697480, 0x04000003, 0x48871809, 0x0401f003, 0x48831808, - 0x48831809, 0x0201f800, 0x001060f3, 0x589d0801, + 0x48831809, 0x0201f800, 0x00106198, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x598d0009, 0x41790800, 0x4933c857, 0x813261c0, @@ -12762,41 +12823,41 @@ static const uint32_t isp_2400_risc_code[] = { 0x0401ffcb, 0x598cd00f, 0x41300000, 0x80697480, 0x04000011, 0x5930d403, 0x82697480, 0x00000042, 0x0400000b, 0x4200d000, 0x00000001, 0x0401f00d, - 0x4200d000, 0x0000055e, 0x4080d800, 0x4084e000, + 0x4200d000, 0x00000561, 0x4080d800, 0x4084e000, 0x0201f800, 0x0010032a, 0x0401f7e9, 0x497a6008, - 0x0401f7f5, 0x0201f800, 0x001066dd, 0x0401f7ee, + 0x0401f7f5, 0x0201f800, 0x00106782, 0x0401f7ee, 0x40698800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, 0x59310800, - 0x497a6000, 0x0201f800, 0x001060e1, 0x808101c0, + 0x497a6000, 0x0201f800, 0x00106186, 0x808101c0, 0x04000008, 0x48850000, 0x598cd004, 0x41300000, 0x80697480, 0x0402000b, 0x48831804, 0x0401f009, 0x598cd004, 0x41300000, 0x80697480, 0x04000003, 0x48871805, 0x0401f003, 0x48831804, 0x48831805, - 0x0201f800, 0x001060f3, 0x589d0801, 0x589d0000, + 0x0201f800, 0x00106198, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x598d0005, 0x40810800, 0x4933c857, 0x813261c0, 0x04020007, 0x0401f022, 0x41300000, 0x80817480, 0x04000007, 0x40810800, 0x58810000, 0x808101c0, 0x040207fa, 0x4178d000, 0x0401f02b, 0x598cd00f, 0x80697480, - 0x04000025, 0x0201f800, 0x001060e1, 0x598cd005, + 0x04000025, 0x0201f800, 0x00106186, 0x598cd005, 0x40800000, 0x80697480, 0x04000017, 0x598cd004, 0x80697480, 0x04000009, 0x58817000, 0x48b90800, - 0x49790000, 0x0201f800, 0x001060f3, 0x4200d000, + 0x49790000, 0x0201f800, 0x00106198, 0x4200d000, 0x00000001, 0x0401f017, 0x48871804, 0x49790000, - 0x49790800, 0x0401f7f8, 0x4200d000, 0x000005ea, + 0x49790800, 0x0401f7f8, 0x4200d000, 0x000005ed, 0x4080d800, 0x4080e000, 0x0201f800, 0x0010032a, 0x0401f7de, 0x58817000, 0x48bb1805, 0x49790000, 0x598cd004, 0x80697480, 0x040207eb, 0x497b1804, - 0x0401f7e9, 0x0201f800, 0x001066dd, 0x0401f7da, + 0x0401f7e9, 0x0201f800, 0x00106782, 0x0401f7da, 0x40698800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x41790000, 0x0201f800, - 0x00106106, 0x40c50800, 0x0401ff62, 0x80c57040, + 0x001061ab, 0x40c50800, 0x0401ff62, 0x80c57040, 0x04000007, 0x0401ff11, 0x80c57040, 0x04000004, 0x0401ffaf, 0x80c57040, 0x04020002, 0x40c50000, - 0x80857040, 0x04020003, 0x0201f800, 0x001060fa, + 0x80857040, 0x04020003, 0x0201f800, 0x0010619f, 0x40818800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x5c00d000, 0x4c680000, @@ -12804,48 +12865,48 @@ static const uint32_t isp_2400_risc_code[] = { 0x59325809, 0x4933c857, 0x4943c857, 0x493fc857, 0x5930d407, 0x486bc857, 0x5930dc07, 0x806c0040, 0x4000d000, 0x82697480, 0x00000012, 0x83f17500, - 0x03000000, 0x04000015, 0x0c01f001, 0x0010e3bc, - 0x0010e398, 0x0010e3a2, 0x0010e3bc, 0x0010e3c5, - 0x0010e3d2, 0x0010e38b, 0x0010e38b, 0x0010e3dc, - 0x0010e3e3, 0x0010e38b, 0x0010e38b, 0x0010e38b, - 0x0010e38b, 0x0010e38b, 0x0010e3ec, 0x0010e3ec, - 0x0010e391, 0x0010e391, 0x4200d000, 0x00000a6e, + 0x03000000, 0x04000015, 0x0c01f001, 0x0010e4cc, + 0x0010e4a8, 0x0010e4b2, 0x0010e4cc, 0x0010e4d5, + 0x0010e4e2, 0x0010e49b, 0x0010e49b, 0x0010e4ec, + 0x0010e4f3, 0x0010e49b, 0x0010e49b, 0x0010e49b, + 0x0010e49b, 0x0010e49b, 0x0010e4fc, 0x0010e4fc, + 0x0010e4a1, 0x0010e4a1, 0x4200d000, 0x00000a7f, 0x4130e000, 0x0201f800, 0x0010032a, 0x0401f0a1, - 0x0201f800, 0x00108893, 0x80c589c0, 0x04020077, - 0x0201f800, 0x001070b5, 0x0401f09a, 0x0201f800, - 0x00108893, 0x80c589c0, 0x04020066, 0x0201f800, - 0x001070b5, 0x8d3e7d1c, 0x04000092, 0x497a600a, + 0x0201f800, 0x0010894c, 0x80c589c0, 0x04020077, + 0x0201f800, 0x00107144, 0x0401f09a, 0x0201f800, + 0x0010894c, 0x80c589c0, 0x04020066, 0x0201f800, + 0x00107144, 0x8d3e7d1c, 0x04000092, 0x497a600a, 0x0401f090, 0x5930d008, 0x8c68d500, 0x04020053, - 0x0201f800, 0x00108893, 0x80c589c0, 0x040007f4, + 0x0201f800, 0x0010894c, 0x80c589c0, 0x040007f4, 0x592cd205, 0x8268d500, 0x000000ff, 0x82697480, - 0x00000014, 0x04000003, 0x0201f800, 0x0010899c, + 0x00000014, 0x04000003, 0x0201f800, 0x00108a55, 0x4a025a05, 0x00000103, 0x49425a07, 0x497a580a, - 0x0201f800, 0x00108a42, 0x0201f800, 0x0010a241, + 0x0201f800, 0x00108afb, 0x0201f800, 0x0010a320, 0x0201f800, 0x000203ab, 0x0401f7e1, 0x0201f800, - 0x0010e719, 0x80c589c0, 0x04020035, 0x0201f800, - 0x00108bdb, 0x0201f800, 0x00107851, 0x0401f7d8, - 0x42000000, 0x0010f518, 0x81317480, 0x0400004a, - 0x0201f800, 0x00108893, 0x80c589c0, 0x040007d0, - 0x4200d000, 0x000009b7, 0x412cd800, 0x4130e000, + 0x0010e81e, 0x80c589c0, 0x04020035, 0x0201f800, + 0x00108c94, 0x0201f800, 0x001078e7, 0x0401f7d8, + 0x42000000, 0x0010f628, 0x81317480, 0x0400004a, + 0x0201f800, 0x0010894c, 0x80c589c0, 0x040007d0, + 0x4200d000, 0x000009c8, 0x412cd800, 0x4130e000, 0x0401f7bd, 0x5930d008, 0x8c68d500, 0x0402002a, - 0x0201f800, 0x00108893, 0x80c589c0, 0x040007c4, - 0x0201f800, 0x00109f21, 0x0401f7c1, 0x0201f800, - 0x00108893, 0x80c589c0, 0x040007bd, 0x0201f800, - 0x00105f11, 0x0401f7ba, 0x0201f800, 0x00108893, + 0x0201f800, 0x0010894c, 0x80c589c0, 0x040007c4, + 0x0201f800, 0x00109ff8, 0x0401f7c1, 0x0201f800, + 0x0010894c, 0x80c589c0, 0x040007bd, 0x0201f800, + 0x00105fb6, 0x0401f7ba, 0x0201f800, 0x0010894c, 0x80c589c0, 0x040007b6, 0x49425a07, 0x497a5c0a, 0x0201f800, 0x000203ab, 0x0401f7b1, 0x0201f800, - 0x00108893, 0x80c589c0, 0x0402000b, 0x59325818, + 0x0010894c, 0x80c589c0, 0x0402000b, 0x59325818, 0x0201f800, 0x00100589, 0x0401f7a9, 0x0201f800, - 0x00101a67, 0x0401f7ca, 0x0201f800, 0x00100bd4, + 0x00101a68, 0x0401f7ca, 0x0201f800, 0x00100bd5, 0x0401f7ac, 0x49425a07, 0x0201f800, 0x000203ab, - 0x0401f7f3, 0x0201f800, 0x00100bd4, 0x0401f7d5, + 0x0401f7f3, 0x0201f800, 0x00100bd5, 0x0401f7d5, 0x49425a07, 0x0201f800, 0x000203ab, 0x5930d21e, 0x82697480, 0x00000003, 0x04020795, 0x0201f800, - 0x0010899c, 0x0401f792, 0x49425a07, 0x497a5c07, - 0x0201f800, 0x000203ab, 0x0201f800, 0x001070b5, - 0x0401f020, 0x0201f800, 0x00108893, 0x80c589c0, + 0x00108a55, 0x0401f792, 0x49425a07, 0x497a5c07, + 0x0201f800, 0x000203ab, 0x0201f800, 0x00107144, + 0x0401f020, 0x0201f800, 0x0010894c, 0x80c589c0, 0x04000016, 0x59a8e052, 0x412c0000, 0x80717480, - 0x04000005, 0x4200d000, 0x000009d0, 0x412cd800, + 0x04000005, 0x4200d000, 0x000009e1, 0x412cd800, 0x0401f771, 0x592d7000, 0x48bb5052, 0x592cd000, 0x8068d1c0, 0x04020002, 0x486b5053, 0x592cd205, 0x82697480, 0x00000055, 0x04000007, 0x49425a07, @@ -12855,12 +12916,12 @@ static const uint32_t isp_2400_risc_code[] = { 0x829d3c00, 0x00000002, 0x1c01f000, 0x809d3840, 0x48813800, 0x5930dc07, 0x406c0000, 0x826d7480, 0x00000013, 0x83f17500, 0x03000000, 0x04000016, - 0x0c01f001, 0x0010e498, 0x0010e46f, 0x0010e47f, - 0x0010e48b, 0x0010e45e, 0x0010e461, 0x0010e4a9, - 0x0010e498, 0x0010e498, 0x0010e498, 0x0010e498, - 0x0010e456, 0x0010e456, 0x0010e498, 0x0010e456, - 0x0010e498, 0x0010e498, 0x0010e49c, 0x0010e4b4, - 0x0010e4b4, 0x4200d000, 0x00000b61, 0x4130e000, + 0x0c01f001, 0x0010e5a8, 0x0010e57f, 0x0010e58f, + 0x0010e59b, 0x0010e56e, 0x0010e571, 0x0010e5b9, + 0x0010e5a8, 0x0010e5a8, 0x0010e5a8, 0x0010e5a8, + 0x0010e566, 0x0010e566, 0x0010e5a8, 0x0010e566, + 0x0010e5a8, 0x0010e5a8, 0x0010e5ac, 0x0010e5c4, + 0x0010e5c4, 0x4200d000, 0x00000b72, 0x4130e000, 0x0201f800, 0x0010032a, 0x4200d800, 0x00000001, 0x0401f067, 0x4178d800, 0x8d3e7d1a, 0x04020064, 0x833ce500, 0x00000001, 0x4178d800, 0x8d3e7d00, @@ -12869,10 +12930,10 @@ static const uint32_t isp_2400_risc_code[] = { 0x04020057, 0x0401f7ed, 0x8d3e7d1a, 0x04020019, 0x8d3e7d00, 0x04020017, 0x833d0500, 0x00001000, 0x8d3e7d18, 0x040207e5, 0x8d3e7d06, 0x040007e3, - 0x0201f800, 0x00108b85, 0x4080d800, 0x80c589c0, + 0x0201f800, 0x00108c3e, 0x4080d800, 0x80c589c0, 0x04020047, 0x0401f7dd, 0x8d3e7d00, 0x040007db, 0x5930d21e, 0x82697480, 0x00000003, 0x04020005, - 0x0201f800, 0x00106030, 0x80c589c0, 0x040207d3, + 0x0201f800, 0x001060d5, 0x80c589c0, 0x040207d3, 0x4178d800, 0x0401f03a, 0x8d3e7d00, 0x04020033, 0x5930d00a, 0x833cdd00, 0x00001000, 0x8d3e7d18, 0x040207ca, 0x8d3e7d06, 0x040007c8, 0x5868d200, @@ -12886,738 +12947,736 @@ static const uint32_t isp_2400_risc_code[] = { 0x04020013, 0x4068d800, 0x0401f011, 0x59a8d074, 0x5868d400, 0x8268d580, 0x00000707, 0x8068d080, 0x8068d000, 0x8068013e, 0x4200d000, 0x00000001, - 0x8068dc80, 0x0401f006, 0x0201f800, 0x00106030, + 0x8068dc80, 0x0401f006, 0x0201f800, 0x001060d5, 0x40c4d800, 0x80c589c0, 0x040207ca, 0x406d8800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000006, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x48953805, 0x4933c857, - 0x0201f800, 0x00106106, 0x40c52800, 0x41352000, + 0x0201f800, 0x001061ab, 0x40c52800, 0x41352000, 0x41311000, 0x412d1800, 0x41790800, 0x598e6005, - 0x0401f005, 0x813669c0, 0x04000026, 0x41310800, - 0x59326000, 0x813261c0, 0x0400001c, 0x5932680a, - 0x813669c0, 0x040007f8, 0x5934d403, 0x41440000, - 0x80697480, 0x040207f4, 0x0401ff51, 0x80c589c0, - 0x040007f3, 0x42010000, 0x00000001, 0x0201f800, - 0x00108893, 0x80c589c0, 0x0402001d, 0x808101c0, - 0x040007eb, 0x0201f800, 0x00105ff7, 0x59310000, - 0x4084d000, 0x0401fde9, 0x0401fe68, 0x40826000, - 0x813261c0, 0x040207e6, 0x408a6000, 0x408e5800, - 0x40926800, 0x80957040, 0x0400000a, 0x0401f016, - 0x5930d407, 0x82697480, 0x00000010, 0x040207d8, - 0x83457480, 0x0000ffff, 0x040207d5, 0x0401f7df, - 0x0201f800, 0x001060fa, 0x0401f00b, 0x0201f800, - 0x00108e5d, 0x80c589c0, 0x040007e1, 0x5930d403, - 0x82697480, 0x00000043, 0x040207dd, 0x41790000, - 0x0401f7db, 0x589d2805, 0x589d2004, 0x589d1803, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000006, 0x1c01f000, 0x829d3c80, 0x00000006, - 0x48813800, 0x48853801, 0x48893802, 0x488d3803, - 0x48913804, 0x48953805, 0x412d1800, 0x41312000, - 0x41352800, 0x41790800, 0x0201f800, 0x00106106, - 0x40c51000, 0x0201f800, 0x00103e62, 0x40c66800, - 0x80c589c0, 0x04000027, 0x598e600b, 0x0401f003, - 0x41310800, 0x59326000, 0x813261c0, 0x04000011, - 0x5930d00a, 0x41340000, 0x80697480, 0x040207f9, - 0x0401fefb, 0x80c589c0, 0x040007f6, 0x0201f800, - 0x00105ff7, 0x59310000, 0x4084d000, 0x0401fcfa, - 0x0401fe1a, 0x40826000, 0x813261c0, 0x040207f1, - 0x8d3e7d06, 0x04000004, 0x5934d200, 0x8c68d50e, - 0x04020003, 0x0201f800, 0x00103fe0, 0x408e5800, - 0x40926000, 0x40966800, 0x80897040, 0x04000002, - 0x0401f00b, 0x0201f800, 0x001060fa, 0x0401f008, - 0x4200d000, 0x00000711, 0x40c4d800, 0x4144e000, - 0x0201f800, 0x0010032a, 0x0401f7d4, 0x589d2805, - 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000006, 0x1c01f000, - 0x829d3c80, 0x00000006, 0x48813800, 0x48853801, - 0x48893802, 0x488d3803, 0x48913804, 0x48953805, - 0x41311800, 0x41352000, 0x412d2800, 0x41790800, - 0x0201f800, 0x00106106, 0x40c51000, 0x598e6009, - 0x0401f003, 0x41310800, 0x59326000, 0x813261c0, - 0x04000012, 0x5932680a, 0x5934d403, 0x41440000, - 0x80697480, 0x040207f8, 0x0401feb5, 0x80c589c0, - 0x040007f5, 0x59310000, 0x0201f800, 0x00105ff7, - 0x4084d000, 0x0401fd02, 0x0401fdd4, 0x40826000, - 0x813261c0, 0x040207f0, 0x0201f800, 0x00106fc1, - 0x0201f800, 0x0010702d, 0x408e6000, 0x40926800, - 0x40965800, 0x80897040, 0x04000002, 0x0401f003, - 0x0201f800, 0x001060fa, 0x589d2805, 0x589d2004, + 0x0401f00a, 0x5932680a, 0x813669c0, 0x04000005, + 0x5934d403, 0x41440000, 0x80697480, 0x0400000b, + 0x41310800, 0x59326000, 0x813261c0, 0x040207f6, + 0x408a6000, 0x408e5800, 0x40926800, 0x80957040, + 0x04000015, 0x0401f021, 0x0401ff4d, 0x80c589c0, + 0x040007f4, 0x42010000, 0x00000001, 0x0201f800, + 0x0010894c, 0x80c589c0, 0x0402000e, 0x808101c0, + 0x040007ec, 0x0201f800, 0x0010609c, 0x59310000, + 0x4084d000, 0x0401fde5, 0x0401fe64, 0x40826000, + 0x0401f7e6, 0x0201f800, 0x0010619f, 0x0401f00b, + 0x0201f800, 0x00108f16, 0x80c589c0, 0x040007f0, + 0x5930d403, 0x82697480, 0x00000043, 0x040207ec, + 0x41790000, 0x0401f7ea, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000006, 0x1c01f000, 0x829d3c80, - 0x00000002, 0x48813800, 0x48853801, 0x4947c857, - 0x0201f800, 0x00106106, 0x40c50800, 0x413d0000, - 0x853e7d00, 0x0401ffbb, 0x0401ff70, 0x40827800, - 0x80857040, 0x04000002, 0x0401f003, 0x0201f800, - 0x001060fa, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000003, - 0x48813800, 0x48853801, 0x48893802, 0x41311000, - 0x41790800, 0x598e600b, 0x813261c0, 0x04000011, - 0x0401fe73, 0x80c589c0, 0x04020006, 0x41310800, - 0x59326000, 0x813261c0, 0x040207fa, 0x0401f009, - 0x0201f800, 0x00105ff7, 0x59310000, 0x4084d000, - 0x0401fc6d, 0x0401fd8d, 0x40826000, 0x0401f7ef, - 0x0201f800, 0x00103fbd, 0x408a6000, 0x589d1002, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000003, - 0x1c01f000, 0x829d3c80, 0x00000003, 0x48813800, - 0x48853801, 0x48893802, 0x41311000, 0x41790800, - 0x598e6009, 0x813261c0, 0x04000011, 0x0401fe50, - 0x80c589c0, 0x04020006, 0x41310800, 0x59326000, - 0x813261c0, 0x040207fa, 0x0401f009, 0x59310000, - 0x0201f800, 0x00105ff7, 0x4084d000, 0x0401fc98, - 0x0401fd6a, 0x40826000, 0x0401f7ef, 0x0201f800, - 0x00107011, 0x0201f800, 0x0010702d, 0x408a6000, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000003, 0x1c01f000, 0x809d3840, 0x48813800, - 0x4943c857, 0x0201f800, 0x00106106, 0x40c50000, - 0x0401ffd5, 0x0401ffb1, 0x80817040, 0x04000002, - 0x0401f003, 0x0201f800, 0x001060fa, 0x589d0000, - 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000004, - 0x48813800, 0x48853801, 0x48893802, 0x488d3803, - 0x0201f800, 0x00106106, 0x40c51800, 0x41311000, - 0x41790800, 0x598e6005, 0x813261c0, 0x04000008, - 0x0401fe17, 0x80c589c0, 0x04020009, 0x41310800, - 0x59326000, 0x813261c0, 0x040207fa, 0x408a6000, - 0x808d7040, 0x0400000a, 0x0401f00b, 0x0201f800, - 0x00105ff7, 0x59310000, 0x4084d000, 0x0401fcaf, - 0x0401fd2e, 0x40826000, 0x0401f7ec, 0x0201f800, - 0x001060fa, 0x589d1803, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000004, 0x1c01f000, - 0x809d3840, 0x48a13800, 0x829d3c80, 0x00000005, - 0x409d4000, 0x829d3c80, 0x00000007, 0x48813800, + 0x00000006, 0x48813800, 0x48853801, 0x48893802, + 0x488d3803, 0x48913804, 0x48953805, 0x412d1800, + 0x41312000, 0x41352800, 0x41790800, 0x0201f800, + 0x001061ab, 0x40c51000, 0x0201f800, 0x00103e78, + 0x40c66800, 0x80c589c0, 0x04000027, 0x598e600b, + 0x0401f003, 0x41310800, 0x59326000, 0x813261c0, + 0x04000011, 0x5930d00a, 0x41340000, 0x80697480, + 0x040207f9, 0x0401ff06, 0x80c589c0, 0x040007f6, + 0x0201f800, 0x0010609c, 0x59310000, 0x4084d000, + 0x0401fd05, 0x0401fe25, 0x40826000, 0x813261c0, + 0x040207f1, 0x8d3e7d06, 0x04000004, 0x5934d200, + 0x8c68d50e, 0x04020003, 0x0201f800, 0x00103ffa, + 0x408e5800, 0x40926000, 0x40966800, 0x80897040, + 0x04000002, 0x0401f00b, 0x0201f800, 0x0010619f, + 0x0401f008, 0x4200d000, 0x00000714, 0x40c4d800, + 0x4144e000, 0x0201f800, 0x0010032a, 0x0401f7d4, + 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, + 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000006, + 0x1c01f000, 0x829d3c80, 0x00000006, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, - 0x48953805, 0x48993806, 0x41791000, 0x0201f800, - 0x00106106, 0x48c54004, 0x41311800, 0x41352800, - 0x41193000, 0x412d2000, 0x49914003, 0x49d14000, - 0x49a54001, 0x49154002, 0x59be6031, 0x813261c0, - 0x0400000e, 0x41310800, 0x59310000, 0x5932680a, - 0x5934d403, 0x41440000, 0x80697480, 0x04000027, - 0x808101c0, 0x04000003, 0x41310800, 0x40826000, - 0x808101c0, 0x040207f5, 0x417a3000, 0x0201f800, - 0x00106705, 0x59926004, 0x813261c0, 0x04000006, - 0x5932680a, 0x5934d403, 0x41440000, 0x80697480, - 0x04000023, 0x811a3000, 0x83197480, 0x00000004, - 0x040007f3, 0x040017f2, 0x408e6000, 0x40966800, - 0x409a3000, 0x40925800, 0x58a32003, 0x58a3a000, - 0x58a34801, 0x58a22802, 0x58a0d004, 0x80697040, - 0x04000010, 0x0401f01d, 0x41311000, 0x40826000, - 0x808101c0, 0x040007e1, 0x59310001, 0x0401fdb0, - 0x80c589c0, 0x040007f9, 0x4084d000, 0x4088d800, - 0x0201f800, 0x0010e171, 0x0401fcd0, 0x0401f7f4, - 0x0201f800, 0x001060fa, 0x0401f00c, 0x0401fda4, - 0x80c589c0, 0x040007dc, 0x0201f800, 0x0010629a, - 0x0201f800, 0x001060d8, 0x0201f800, 0x001060e1, - 0x0401fcc2, 0x0401f7d4, 0x589d3006, 0x589d2805, + 0x48953805, 0x41311800, 0x41352000, 0x412d2800, + 0x41790800, 0x0201f800, 0x001061ab, 0x40c51000, + 0x598e6009, 0x0401f003, 0x41310800, 0x59326000, + 0x813261c0, 0x04000012, 0x5932680a, 0x5934d403, + 0x41440000, 0x80697480, 0x040207f8, 0x0401fec0, + 0x80c589c0, 0x040007f5, 0x59310000, 0x0201f800, + 0x0010609c, 0x4084d000, 0x0401fd0d, 0x0401fddf, + 0x40826000, 0x813261c0, 0x040207f0, 0x0201f800, + 0x00107050, 0x0201f800, 0x001070bc, 0x408e6000, + 0x40926800, 0x40965800, 0x80897040, 0x04000002, + 0x0401f003, 0x0201f800, 0x0010619f, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x0000000c, 0x589d4000, - 0x809d3800, 0x1c01f000, 0x809d3840, 0x48a13800, - 0x829d3c80, 0x00000007, 0x409d4000, 0x829d3c80, - 0x00000007, 0x48813800, 0x48853801, 0x48893802, - 0x488d3803, 0x48913804, 0x48953805, 0x48993806, - 0x41791800, 0x0201f800, 0x00106106, 0x40c52800, - 0x41313000, 0x49354005, 0x492d4004, 0x49194006, - 0x49914003, 0x49d14000, 0x49a54001, 0x49154002, - 0x59be6031, 0x813261c0, 0x04000023, 0x41312000, - 0x408d0800, 0x59311000, 0x5932680a, 0x0401f009, - 0x41311800, 0x808509c0, 0x04000010, 0x808101c0, - 0x04000002, 0x40826000, 0x808101c0, 0x0400000d, - 0x59310001, 0x0401fd62, 0x80c589c0, 0x040007f5, - 0x4090d000, 0x408cd800, 0x0201f800, 0x0010e171, - 0x0401fc82, 0x0401f7f2, 0x41310800, 0x0401f7f0, - 0x808911c0, 0x04000006, 0x408a6000, 0x808509c0, - 0x04000003, 0x40852000, 0x40810800, 0x808911c0, - 0x040207e1, 0x417a3000, 0x0201f800, 0x00106705, - 0x59926004, 0x813261c0, 0x04000004, 0x0401fd48, - 0x80c589c0, 0x04020011, 0x811a3000, 0x83197480, - 0x00000004, 0x040007f5, 0x040017f4, 0x409a6000, - 0x58a26805, 0x58a25804, 0x58a23006, 0x58a32003, - 0x58a3a000, 0x58a34801, 0x58a22802, 0x80957040, - 0x0400000a, 0x0401f00b, 0x0201f800, 0x0010629a, - 0x0201f800, 0x001060d8, 0x0201f800, 0x001060e1, - 0x0401fc56, 0x0401f7e9, 0x0201f800, 0x001060fa, - 0x589d3006, 0x589d2805, 0x589d2004, 0x589d1803, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x0000000e, 0x589d4000, 0x809d3800, 0x1c01f000, - 0x4178e000, 0x497bc856, 0x5930dc03, 0x826cd480, - 0x00000002, 0x82697480, 0x00000002, 0x04000007, - 0x04001006, 0x599cd019, 0x8c68d50e, 0x04000005, - 0x806cd9c0, 0x04020003, 0x4200e000, 0x00000001, - 0x40718800, 0x1c01f000, 0x829d3c80, 0x00000004, - 0x48813800, 0x48853801, 0x48893802, 0x488d3803, - 0x412d0800, 0x41351000, 0x41391800, 0x0201f800, - 0x0010e438, 0x80c589c0, 0x040000cd, 0x5932680a, - 0x5930d407, 0x40680000, 0x82697480, 0x00000013, - 0x83f17500, 0x03000000, 0x04000028, 0x0c01f001, - 0x0010e804, 0x0010e7b1, 0x0010e7c1, 0x0010e776, - 0x0010e7b1, 0x0010e7c1, 0x0010e799, 0x0010e7aa, - 0x0010e76e, 0x0010e7d1, 0x0010e758, 0x0010e76e, - 0x0010e76e, 0x0010e76e, 0x0010e76e, 0x0010e804, - 0x0010e758, 0x0010e755, 0x0010e76e, 0x0010e76e, - 0x59325818, 0x0201f800, 0x00100589, 0x5930d203, - 0x82697480, 0x00000004, 0x04000090, 0x59325809, - 0x0201f800, 0x00108893, 0x80c589c0, 0x04020083, - 0x0201f800, 0x001070b5, 0x8d3e7d1c, 0x040000a0, - 0x497a600a, 0x0401f09e, 0x4200d000, 0x0000030f, - 0x4000d800, 0x4130e000, 0x0201f800, 0x0010032a, - 0x0401f097, 0x59325809, 0x0201f800, 0x00108893, - 0x80c589c0, 0x0402006a, 0x0201f800, 0x001070b5, - 0x0401f08f, 0x813669c0, 0x04000077, 0x0201f800, - 0x001092d9, 0x5930d203, 0x82697480, 0x00000004, - 0x04000081, 0x59325809, 0x0201f800, 0x00108893, - 0x80c589c0, 0x040007df, 0x592cd205, 0x8268d500, - 0x000000ff, 0x82697480, 0x00000014, 0x04000003, - 0x0201f800, 0x0010899c, 0x4a025a05, 0x00000103, - 0x5930d402, 0x486a5c07, 0x592cd409, 0x8c68d512, - 0x04020067, 0x49425a07, 0x497a580a, 0x0201f800, - 0x00108e69, 0x0201f800, 0x000203ab, 0x0401f7c9, - 0x5930d203, 0x82697480, 0x00000004, 0x04000065, - 0x59325809, 0x0201f800, 0x00108893, 0x80c589c0, - 0x040007c0, 0x49425a07, 0x813669c0, 0x040007f0, - 0x0201f800, 0x0010a241, 0x0201f800, 0x00108e69, - 0x0401f7ed, 0x5930d203, 0x82697480, 0x00000011, - 0x04020057, 0x5930d41e, 0x486a6203, 0x0401f054, - 0x5930d403, 0x82697480, 0x00000043, 0x04000050, - 0x0201f800, 0x0010a591, 0x0401ff62, 0x80c589c0, - 0x0402003c, 0x0201f800, 0x001089c3, 0x80c589c0, - 0x040007a4, 0x0201f800, 0x00107851, 0x0401f7a1, - 0x59325809, 0x0201f800, 0x00108893, 0x80c589c0, - 0x0400079c, 0x49425a07, 0x497a5c0a, 0x0201f800, - 0x000203ab, 0x5930d21e, 0x82697480, 0x00000003, - 0x04020794, 0x0201f800, 0x0010899c, 0x0401f791, - 0x5930d203, 0x82697480, 0x00000004, 0x04020013, - 0x5930d006, 0x8068d1c0, 0x0400002d, 0x5930d415, - 0x8468d558, 0x486a6415, 0x0401f029, 0x49425a07, - 0x497a5c07, 0x0201f800, 0x000203ab, 0x0201f800, - 0x001070b5, 0x0401f022, 0x49425a07, 0x0201f800, - 0x000203ab, 0x0401f77b, 0x59325809, 0x0201f800, - 0x00105efe, 0x0401f777, 0x0201f800, 0x00100bd4, - 0x0401f76f, 0x4200d000, 0x00000182, 0x4134d800, - 0x4130e000, 0x0201f800, 0x0010032a, 0x0401f784, - 0x0201f800, 0x00101a67, 0x0401f7c3, 0x412d0000, - 0x592e580a, 0x0201f800, 0x00100589, 0x40825800, - 0x0401f795, 0x0201f800, 0x00100bd4, 0x0401f77e, - 0x0201f800, 0x00100bd4, 0x0401f79a, 0x40865800, - 0x408a6800, 0x408e7000, 0x589d1803, 0x589d1002, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000004, - 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, - 0x48853801, 0x41310800, 0x4933c857, 0x4943c857, - 0x493fc857, 0x42010000, 0x0010f584, 0x59a8d00d, - 0x41640000, 0x80697480, 0x04000010, 0x41580000, - 0x80817480, 0x0402100d, 0x40826000, 0x8d3e7d12, - 0x04000004, 0x40800000, 0x80857480, 0x04000002, - 0x0401ff06, 0x82810400, 0x00000024, 0x41580000, - 0x80817480, 0x040017f5, 0x41510000, 0x41540000, - 0x80817480, 0x04021019, 0x8d3e7d18, 0x04000017, - 0x59a8d04d, 0x59a8004e, 0x80697480, 0x04000013, - 0x40826000, 0x5880d00a, 0x8068d1c0, 0x04020005, - 0x5880d203, 0x82697480, 0x00000008, 0x04000008, - 0x0401feee, 0x82810400, 0x00000024, 0x41540000, - 0x80817480, 0x040017ed, 0x0401f004, 0x0201f800, - 0x0010a4d9, 0x0401f7f7, 0x40866000, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, - 0x497a621e, 0x812e59c0, 0x0400003d, 0x592cd205, - 0x486bc857, 0x592cd205, 0x8268d500, 0x000000ff, - 0x82697480, 0x00000014, 0x04000003, 0x4a02621e, - 0x00000003, 0x592cd409, 0x8c68d510, 0x0402001d, - 0x592cd209, 0x0201f800, 0x00104503, 0x0201f800, - 0x00108e69, 0x0201f800, 0x0010ae29, 0x80c589c0, - 0x0400001f, 0x4a026403, 0x00000085, 0x4a026203, - 0x00000009, 0x4a026407, 0x00000002, 0x5930d004, - 0x8268d500, 0x00000100, 0x8268d540, 0x8000404b, - 0x486a6004, 0x0201f800, 0x001060fa, 0x4200d000, - 0x8000404b, 0x0201f800, 0x00105fe4, 0x0401f01f, - 0x592cd209, 0x0201f800, 0x00104503, 0x4a025c09, - 0x00000100, 0x0201f800, 0x00108e69, 0x0201f800, - 0x0010ae29, 0x80c589c0, 0x040207e3, 0x0201f800, - 0x000203ab, 0x5930d21e, 0x82697480, 0x00000003, - 0x0400000a, 0x497a6009, 0x0401f7db, 0x4200d000, - 0x00000527, 0x4130d800, 0x412ce000, 0x0201f800, - 0x0010032a, 0x0401f005, 0x0201f800, 0x0010899c, - 0x497a6009, 0x0401f7d0, 0x1c01f000, 0x0201f800, - 0x001060fa, 0x812e59c0, 0x0400001b, 0x592cd409, - 0x8c68d510, 0x04020012, 0x592cd209, 0x0201f800, - 0x00104503, 0x0201f800, 0x00108e69, 0x0201f800, - 0x000203ab, 0x5930d203, 0x82697480, 0x0000000d, - 0x0400000d, 0x0201f800, 0x001060fa, 0x5930d00a, - 0x0201f800, 0x00104107, 0x0401f007, 0x592cd209, - 0x0201f800, 0x00104503, 0x4a025c09, 0x00000100, - 0x0401f7ed, 0x0201f800, 0x001070b5, 0x1c01f000, + 0x589d0000, 0x829d3c00, 0x00000006, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, - 0x41790000, 0x0201f800, 0x001085b3, 0x40c50800, - 0x48c7c857, 0x40840000, 0x82857480, 0x0000000d, - 0x83f17500, 0x03000000, 0x0400002b, 0x0c01f001, - 0x0010e8ea, 0x0010e922, 0x0010e900, 0x0010e8d7, - 0x0010e902, 0x0010e8f2, 0x0010e8ea, 0x0010e8ea, - 0x0010e8ea, 0x0010e8f2, 0x0010e8f2, 0x0010e8f2, - 0x0010e8f2, 0x0010e900, 0x0201f800, 0x0010859d, - 0x80c589c0, 0x04000005, 0x0201f800, 0x0010634a, - 0x80c589c0, 0x04000055, 0x0201f800, 0x0010e1ca, - 0x80c589c0, 0x04000017, 0x5930d403, 0x486bc857, - 0x5930d403, 0x82697480, 0x00000040, 0x04020018, - 0x0401ffaf, 0x42010000, 0x00000001, 0x0401f069, - 0x40840000, 0x82857480, 0x0000000d, 0x040007d8, - 0x040017d7, 0x4200d000, 0x000004b7, 0x4130d800, - 0x4084e000, 0x0201f800, 0x0010032a, 0x0401f05d, - 0x497bc856, 0x0201f800, 0x00106011, 0x80c589c0, - 0x04020036, 0x59317004, 0x48bbc857, 0x0401ff4d, - 0x0401f7e9, 0x812e59c0, 0x0400004c, 0x0201f800, - 0x00108ccb, 0x80c589c0, 0x04000030, 0x0201f800, - 0x001060fa, 0x592cd209, 0x8468d50c, 0x486a5a09, - 0x592cdc07, 0x806cd0c6, 0x406c0000, 0x8068d400, - 0x8068d400, 0x486a6006, 0x4200d000, 0x10000000, - 0x4130d800, 0x0201f800, 0x00100890, 0x80c589c0, - 0x0400002b, 0x592cd209, 0x8c68d51c, 0x04020024, - 0x8468d55c, 0x486a5a09, 0x4a026006, 0x00000002, - 0x0401f7c9, 0x598d700f, 0x48bbc857, 0x40b8d000, - 0x41300000, 0x80697480, 0x04000014, 0x0201f800, - 0x0010e343, 0x80c589c0, 0x040207be, 0x497bc856, - 0x0201f800, 0x00106011, 0x4200d000, 0x000003f5, - 0x80c589c0, 0x040007c2, 0x5930d203, 0x486bc857, - 0x59310a03, 0x0401f01f, 0x0201f800, 0x00100bd4, - 0x0401ff14, 0x0401f7b0, 0x0201f800, 0x00106381, - 0x80c589c0, 0x040007f5, 0x0401f7e9, 0x41310000, - 0x0201f800, 0x00101078, 0x40826000, 0x5930d203, - 0x82697480, 0x00000004, 0x040207a3, 0x41390000, - 0x42027000, 0x00000048, 0x0201f800, 0x00107123, - 0x40827000, 0x0401f79c, 0x4200d000, 0x000004a7, - 0x4130d800, 0x412ce000, 0x0201f800, 0x0010032a, - 0x808101c0, 0x04000797, 0x589d0801, 0x589d0000, + 0x4947c857, 0x0201f800, 0x001061ab, 0x40c50800, + 0x413d0000, 0x853e7d00, 0x0401ffbb, 0x0401ff70, + 0x40827800, 0x80857040, 0x04000002, 0x0401f003, + 0x0201f800, 0x0010619f, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, - 0x00000002, 0x48813800, 0x48853801, 0x412d0800, - 0x41410000, 0x4200d000, 0x0010bc2c, 0x0201f800, - 0x0010ad1c, 0x417a5800, 0x0201f800, 0x00108893, - 0x80c589c0, 0x04000009, 0x0201f800, 0x001092d9, - 0x59325809, 0x592cd209, 0x8468d54c, 0x486a5a09, - 0x42028000, 0x00000006, 0x0201f800, 0x00106106, - 0x0401ff44, 0x0201f800, 0x001060fa, 0x40828000, - 0x40865800, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, - 0x48813800, 0x48853801, 0x412d0800, 0x0201f800, - 0x0010e438, 0x80c589c0, 0x040000c3, 0x5930d407, - 0x40680000, 0x82697480, 0x00000013, 0x83f17500, - 0x03000000, 0x04000025, 0x0c01f001, 0x0010ea4a, - 0x0010e9ee, 0x0010ea04, 0x0010e9cb, 0x0010e9ee, - 0x0010ea04, 0x0010ea14, 0x0010e9fd, 0x0010ea29, - 0x0010e9a4, 0x0010e9ba, 0x0010ea29, 0x0010ea29, - 0x0010ea29, 0x0010ea29, 0x0010ea4a, 0x0010e9c0, - 0x0010ea25, 0x0010ea29, 0x0010ea29, 0x0201f800, - 0x00105b69, 0x80c589c0, 0x04000090, 0x5930d203, - 0x82697480, 0x00000004, 0x0402009f, 0x5930d006, - 0x8068d1c0, 0x0400009c, 0x5930d415, 0x8468d558, - 0x486a6415, 0x0401f098, 0x4200d000, 0x0000031c, - 0x4000d800, 0x4130e000, 0x0201f800, 0x0010032a, - 0x0401f091, 0x5930d203, 0x82697480, 0x00000004, - 0x04020003, 0x0201f800, 0x00100bd4, 0x59325809, - 0x0201f800, 0x00108893, 0x80c589c0, 0x0402006f, - 0x0201f800, 0x001070b5, 0x8d3e7d1c, 0x04000082, - 0x497a600a, 0x0401f080, 0x0201f800, 0x001092d9, - 0x5930d203, 0x82697480, 0x00000004, 0x04000074, - 0x59325809, 0x0201f800, 0x00108893, 0x80c589c0, - 0x040007f0, 0x592cd205, 0x8268d500, 0x000000ff, - 0x82697480, 0x00000014, 0x04000003, 0x0201f800, - 0x0010899c, 0x4a025a05, 0x00000103, 0x592cd409, - 0x8c68d512, 0x0402005c, 0x49425a07, 0x497a580a, - 0x0201f800, 0x0010a241, 0x0201f800, 0x00108e69, - 0x0201f800, 0x00108a42, 0x0201f800, 0x000203ab, - 0x0401f7d8, 0x5930d403, 0x82697480, 0x00000043, - 0x04000059, 0x0201f800, 0x0010e719, 0x80c589c0, - 0x04020046, 0x0201f800, 0x001089c3, 0x80c589c0, - 0x040007cc, 0x0201f800, 0x00107851, 0x0401f7c9, - 0x5930d203, 0x82697480, 0x00000011, 0x0402004a, - 0x5930d41e, 0x486a6203, 0x0401f047, 0x59325809, - 0x0201f800, 0x00108893, 0x80c589c0, 0x040007bd, - 0x49425a07, 0x497a5c0a, 0x0201f800, 0x000203ab, - 0x5930d21e, 0x82697480, 0x00000003, 0x040207b5, - 0x0201f800, 0x0010899c, 0x0401f7b2, 0x5930d203, - 0x82697480, 0x00000004, 0x04000030, 0x59325809, - 0x0201f800, 0x00108893, 0x80c589c0, 0x040007a9, - 0x49425a07, 0x0201f800, 0x0010a241, 0x0201f800, - 0x00108e69, 0x0201f800, 0x000203ab, 0x0401f7a1, - 0x59325818, 0x0201f800, 0x00100589, 0x0401f798, - 0x59325809, 0x0201f800, 0x00108893, 0x80c589c0, - 0x04000798, 0x49425a07, 0x497a5c07, 0x0201f800, - 0x000203ab, 0x0401f793, 0x49425a07, 0x0201f800, - 0x000203ab, 0x0401f78f, 0x59325809, 0x0201f800, - 0x00105efe, 0x0401f78b, 0x0201f800, 0x00101a67, - 0x0401f7b9, 0x412d0000, 0x592e580a, 0x0201f800, - 0x00100589, 0x40825800, 0x0401f7a0, 0x0201f800, - 0x00100bd4, 0x0401f78b, 0x0201f800, 0x00100bd4, - 0x0401f7cf, 0x40865800, 0x589d0801, 0x589d0000, - 0x829d3c00, 0x00000002, 0x1c01f000, 0x0201f800, - 0x0010a030, 0x80c589c0, 0x0402000c, 0x5930d407, - 0x82697480, 0x00000010, 0x04000002, 0x0401f009, - 0x83457480, 0x0000ffff, 0x040207fd, 0x5930d00a, - 0x8068d1c0, 0x040207fa, 0x5932680a, 0x0401ff1f, - 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, - 0x48853801, 0x48893802, 0x488d3803, 0x48913804, - 0x41311000, 0x41352000, 0x4933c857, 0x4947c857, - 0x4943c857, 0x0201f800, 0x00106106, 0x40c51800, - 0x0201f800, 0x00109edc, 0x41310800, 0x813261c0, - 0x04000048, 0x42000000, 0x0010f53c, 0x81317480, - 0x04000044, 0x59a8d00d, 0x8068d040, 0x42010000, - 0x0010f584, 0x40680000, 0x81657480, 0x0400000f, - 0x41580000, 0x80817480, 0x0402100c, 0x40826000, - 0x40800000, 0x80857480, 0x04000003, 0x4084d000, - 0x0401ffc7, 0x82810400, 0x00000024, 0x41580000, - 0x80817480, 0x040017f6, 0x41510000, 0x41540000, - 0x80817480, 0x04021012, 0x8d3e7d18, 0x04000010, - 0x59a8d04d, 0x59a8004e, 0x80697480, 0x0400000c, - 0x40826000, 0x5880d00a, 0x8068d1c0, 0x0400000d, - 0x4084d000, 0x0401ffb2, 0x82810400, 0x00000024, - 0x41540000, 0x80817480, 0x040017f0, 0x408a6000, - 0x40926800, 0x808d7040, 0x04000018, 0x0401f01d, - 0x0201f800, 0x00103e62, 0x40c66800, 0x80c589c0, - 0x040007f2, 0x58c4d002, 0x5930d81f, 0x82680500, - 0x00ffffff, 0x806d7480, 0x040207ec, 0x5930d203, - 0x82697480, 0x00000008, 0x0400000b, 0x4936600a, - 0x0401fec6, 0x82810400, 0x00000024, 0x0401f7e5, - 0x59a8d00d, 0x0401f7be, 0x0201f800, 0x001060fa, - 0x0401f004, 0x0201f800, 0x0010a4d9, 0x0401f7f4, - 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000005, 0x1c01f000, + 0x00000003, 0x48813800, 0x48853801, 0x48893802, + 0x41311000, 0x41790800, 0x598e600b, 0x813261c0, + 0x04000011, 0x0401fe7e, 0x80c589c0, 0x04020006, + 0x41310800, 0x59326000, 0x813261c0, 0x040207fa, + 0x0401f009, 0x0201f800, 0x0010609c, 0x59310000, + 0x4084d000, 0x0401fc78, 0x0401fd98, 0x40826000, + 0x0401f7ef, 0x0201f800, 0x00103fd7, 0x408a6000, + 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00000003, 0x1c01f000, 0x829d3c80, 0x00000003, + 0x48813800, 0x48853801, 0x48893802, 0x41311000, + 0x41790800, 0x598e6009, 0x813261c0, 0x04000011, + 0x0401fe5b, 0x80c589c0, 0x04020006, 0x41310800, + 0x59326000, 0x813261c0, 0x040207fa, 0x0401f009, + 0x59310000, 0x0201f800, 0x0010609c, 0x4084d000, + 0x0401fca3, 0x0401fd75, 0x40826000, 0x0401f7ef, + 0x0201f800, 0x001070a0, 0x0201f800, 0x001070bc, + 0x408a6000, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000003, 0x1c01f000, 0x809d3840, + 0x48813800, 0x4943c857, 0x0201f800, 0x001061ab, + 0x40c50000, 0x0401ffd5, 0x0401ffb1, 0x80817040, + 0x04000002, 0x0401f003, 0x0201f800, 0x0010619f, + 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, + 0x00000004, 0x48813800, 0x48853801, 0x48893802, + 0x488d3803, 0x0201f800, 0x001061ab, 0x40c51800, + 0x41311000, 0x41790800, 0x598e6005, 0x813261c0, + 0x04000008, 0x0401fe22, 0x80c589c0, 0x04020009, + 0x41310800, 0x59326000, 0x813261c0, 0x040207fa, + 0x408a6000, 0x808d7040, 0x0400000a, 0x0401f00b, + 0x0201f800, 0x0010609c, 0x59310000, 0x4084d000, + 0x0401fcba, 0x0401fd39, 0x40826000, 0x0401f7ec, + 0x0201f800, 0x0010619f, 0x589d1803, 0x589d1002, + 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000004, + 0x1c01f000, 0x809d3840, 0x48a13800, 0x829d3c80, + 0x00000005, 0x409d4000, 0x829d3c80, 0x00000007, + 0x48813800, 0x48853801, 0x48893802, 0x488d3803, + 0x48913804, 0x48953805, 0x48993806, 0x41791000, + 0x0201f800, 0x001061ab, 0x48c54004, 0x41311800, + 0x41352800, 0x41193000, 0x412d2000, 0x49914003, + 0x49d14000, 0x49a54001, 0x49154002, 0x59be6031, + 0x813261c0, 0x0400000e, 0x41310800, 0x59310000, + 0x5932680a, 0x5934d403, 0x41440000, 0x80697480, + 0x04000027, 0x808101c0, 0x04000003, 0x41310800, + 0x40826000, 0x808101c0, 0x040207f5, 0x417a3000, + 0x0201f800, 0x001067aa, 0x59926004, 0x813261c0, + 0x04000006, 0x5932680a, 0x5934d403, 0x41440000, + 0x80697480, 0x04000023, 0x811a3000, 0x83197480, + 0x00000004, 0x040007f3, 0x040017f2, 0x408e6000, + 0x40966800, 0x409a3000, 0x40925800, 0x58a32003, + 0x58a3a000, 0x58a34801, 0x58a22802, 0x58a0d004, + 0x80697040, 0x04000010, 0x0401f01d, 0x41311000, + 0x40826000, 0x808101c0, 0x040007e1, 0x59310001, + 0x0401fdbb, 0x80c589c0, 0x040007f9, 0x4084d000, + 0x4088d800, 0x0201f800, 0x0010e281, 0x0401fcdb, + 0x0401f7f4, 0x0201f800, 0x0010619f, 0x0401f00c, + 0x0401fdaf, 0x80c589c0, 0x040007dc, 0x0201f800, + 0x0010633f, 0x0201f800, 0x0010617d, 0x0201f800, + 0x00106186, 0x0401fccd, 0x0401f7d4, 0x589d3006, + 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, + 0x589d0801, 0x589d0000, 0x829d3c00, 0x0000000c, + 0x589d4000, 0x809d3800, 0x1c01f000, 0x809d3840, + 0x48a13800, 0x829d3c80, 0x00000007, 0x409d4000, 0x829d3c80, 0x00000007, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x48953805, - 0x48993806, 0x42010000, 0x00000001, 0x41790800, - 0x497bc856, 0x41311000, 0x41351800, 0x41452000, - 0x413d2800, 0x40593000, 0x4200d000, 0x0010eacd, - 0x0201f800, 0x001057d5, 0x59a8d21b, 0x8c68d508, - 0x0400001d, 0x8c68d516, 0x0402001b, 0x59aa6864, - 0x813669c0, 0x04000076, 0x5934d400, 0x82697480, - 0x00000404, 0x04020072, 0x0201f800, 0x001070f2, - 0x40c66000, 0x80c589c0, 0x04000067, 0x48818c07, - 0x4935880a, 0x40867800, 0x0201f800, 0x00103d7f, - 0x4200d000, 0x00000005, 0x0201f800, 0x00103d89, - 0x42027000, 0x00000003, 0x0201f800, 0x00107123, - 0x0401f05f, 0x8c68d506, 0x04020003, 0x8c68d50a, - 0x04000014, 0x0201f800, 0x001040c4, 0x80c589c0, - 0x0400000a, 0x83acd400, 0x000007fe, 0x586a6800, - 0x5934d200, 0x8468d51a, 0x486a6a00, 0x59a8d21b, - 0x8c68d506, 0x0402003b, 0x808509c0, 0x04000005, - 0x8d0e1d20, 0x0402003b, 0x0201f800, 0x0010e14a, - 0x80817040, 0x04020046, 0x4200b000, 0x000007f0, - 0x417a8800, 0x0401f004, 0x81468800, 0x8058b040, - 0x0400003f, 0x0201f800, 0x00103e62, 0x80c589c0, - 0x040007fa, 0x5934d200, 0x8c68d51a, 0x040007f7, - 0x5934d403, 0x406a8800, 0x417a7800, 0x42028000, - 0x00000029, 0x413cd000, 0x413cd800, 0x0201f800, - 0x00109f3f, 0x5934d200, 0x8468d558, 0x486a6a00, + 0x48993806, 0x41791800, 0x0201f800, 0x001061ab, + 0x40c52800, 0x41313000, 0x49354005, 0x492d4004, + 0x49194006, 0x49914003, 0x49d14000, 0x49a54001, + 0x49154002, 0x59be6031, 0x813261c0, 0x04000023, + 0x41312000, 0x408d0800, 0x59311000, 0x5932680a, + 0x0401f009, 0x41311800, 0x808509c0, 0x04000010, + 0x808101c0, 0x04000002, 0x40826000, 0x808101c0, + 0x0400000d, 0x59310001, 0x0401fd6d, 0x80c589c0, + 0x040007f5, 0x4090d000, 0x408cd800, 0x0201f800, + 0x0010e281, 0x0401fc8d, 0x0401f7f2, 0x41310800, + 0x0401f7f0, 0x808911c0, 0x04000006, 0x408a6000, + 0x808509c0, 0x04000003, 0x40852000, 0x40810800, + 0x808911c0, 0x040207e1, 0x417a3000, 0x0201f800, + 0x001067aa, 0x59926004, 0x813261c0, 0x04000004, + 0x0401fd53, 0x80c589c0, 0x04020011, 0x811a3000, + 0x83197480, 0x00000004, 0x040007f5, 0x040017f4, + 0x409a6000, 0x58a26805, 0x58a25804, 0x58a23006, + 0x58a32003, 0x58a3a000, 0x58a34801, 0x58a22802, + 0x80957040, 0x0400000a, 0x0401f00b, 0x0201f800, + 0x0010633f, 0x0201f800, 0x0010617d, 0x0201f800, + 0x00106186, 0x0401fc61, 0x0401f7e9, 0x0201f800, + 0x0010619f, 0x589d3006, 0x589d2805, 0x589d2004, + 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x0000000e, 0x589d4000, 0x809d3800, + 0x1c01f000, 0x4178e000, 0x497bc856, 0x5930dc03, + 0x826cd480, 0x00000002, 0x82697480, 0x00000002, + 0x04000007, 0x04001006, 0x599cd019, 0x8c68d50e, + 0x04000005, 0x806cd9c0, 0x04020003, 0x4200e000, + 0x00000001, 0x40718800, 0x1c01f000, 0x829d3c80, + 0x00000004, 0x48813800, 0x48853801, 0x48893802, + 0x488d3803, 0x412d0800, 0x41351000, 0x41391800, + 0x0201f800, 0x0010e548, 0x80c589c0, 0x040000cd, + 0x5932680a, 0x5930d407, 0x40680000, 0x82697480, + 0x00000013, 0x83f17500, 0x03000000, 0x04000028, + 0x0c01f001, 0x0010e909, 0x0010e8b6, 0x0010e8c6, + 0x0010e87b, 0x0010e8b6, 0x0010e8c6, 0x0010e89e, + 0x0010e8af, 0x0010e873, 0x0010e8d6, 0x0010e85d, + 0x0010e873, 0x0010e873, 0x0010e873, 0x0010e873, + 0x0010e909, 0x0010e85d, 0x0010e85a, 0x0010e873, + 0x0010e873, 0x59325818, 0x0201f800, 0x00100589, + 0x5930d203, 0x82697480, 0x00000004, 0x04000090, + 0x59325809, 0x0201f800, 0x0010894c, 0x80c589c0, + 0x04020083, 0x0201f800, 0x00107144, 0x8d3e7d1c, + 0x040000a0, 0x497a600a, 0x0401f09e, 0x4200d000, + 0x0000030f, 0x4000d800, 0x4130e000, 0x0201f800, + 0x0010032a, 0x0401f097, 0x59325809, 0x0201f800, + 0x0010894c, 0x80c589c0, 0x0402006a, 0x0201f800, + 0x00107144, 0x0401f08f, 0x813669c0, 0x04000077, + 0x0201f800, 0x00109391, 0x5930d203, 0x82697480, + 0x00000004, 0x04000081, 0x59325809, 0x0201f800, + 0x0010894c, 0x80c589c0, 0x040007df, 0x592cd205, + 0x8268d500, 0x000000ff, 0x82697480, 0x00000014, + 0x04000003, 0x0201f800, 0x00108a55, 0x4a025a05, + 0x00000103, 0x5930d402, 0x486a5c07, 0x592cd409, + 0x8c68d512, 0x04020067, 0x49425a07, 0x497a580a, + 0x0201f800, 0x00108f22, 0x0201f800, 0x000203ab, + 0x0401f7c9, 0x5930d203, 0x82697480, 0x00000004, + 0x04000065, 0x59325809, 0x0201f800, 0x0010894c, + 0x80c589c0, 0x040007c0, 0x49425a07, 0x813669c0, + 0x040007f0, 0x0201f800, 0x0010a320, 0x0201f800, + 0x00108f22, 0x0401f7ed, 0x5930d203, 0x82697480, + 0x00000011, 0x04020057, 0x5930d41e, 0x486a6203, + 0x0401f054, 0x5930d403, 0x82697480, 0x00000043, + 0x04000050, 0x0201f800, 0x0010a684, 0x0401ff62, + 0x80c589c0, 0x0402003c, 0x0201f800, 0x00108a7c, + 0x80c589c0, 0x040007a4, 0x0201f800, 0x001078e7, + 0x0401f7a1, 0x59325809, 0x0201f800, 0x0010894c, + 0x80c589c0, 0x0400079c, 0x49425a07, 0x497a5c0a, + 0x0201f800, 0x000203ab, 0x5930d21e, 0x82697480, + 0x00000003, 0x04020794, 0x0201f800, 0x00108a55, + 0x0401f791, 0x5930d203, 0x82697480, 0x00000004, + 0x04020013, 0x5930d006, 0x8068d1c0, 0x0400002d, + 0x5930d415, 0x8468d558, 0x486a6415, 0x0401f029, + 0x49425a07, 0x497a5c07, 0x0201f800, 0x000203ab, + 0x0201f800, 0x00107144, 0x0401f022, 0x49425a07, + 0x0201f800, 0x000203ab, 0x0401f77b, 0x59325809, + 0x0201f800, 0x00105fa3, 0x0401f777, 0x0201f800, + 0x00100bd5, 0x0401f76f, 0x4200d000, 0x00000182, + 0x4134d800, 0x4130e000, 0x0201f800, 0x0010032a, + 0x0401f784, 0x0201f800, 0x00101a68, 0x0401f7c3, + 0x412d0000, 0x592e580a, 0x0201f800, 0x00100589, + 0x40825800, 0x0401f795, 0x0201f800, 0x00100bd5, + 0x0401f77e, 0x0201f800, 0x00100bd5, 0x0401f79a, + 0x40865800, 0x408a6800, 0x408e7000, 0x589d1803, + 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00000004, 0x1c01f000, 0x829d3c80, 0x00000002, + 0x48813800, 0x48853801, 0x41310800, 0x4933c857, + 0x4943c857, 0x493fc857, 0x42010000, 0x0010f694, + 0x59a8d00d, 0x41640000, 0x80697480, 0x04000010, + 0x41580000, 0x80817480, 0x0402100d, 0x40826000, + 0x8d3e7d12, 0x04000004, 0x40800000, 0x80857480, + 0x04000002, 0x0401ff06, 0x82810400, 0x00000024, + 0x41580000, 0x80817480, 0x040017f5, 0x41510000, + 0x41540000, 0x80817480, 0x04021019, 0x8d3e7d18, + 0x04000017, 0x59a8d04d, 0x59a8004e, 0x80697480, + 0x04000013, 0x40826000, 0x5880d00a, 0x8068d1c0, + 0x04020005, 0x5880d203, 0x82697480, 0x00000008, + 0x04000008, 0x0401feee, 0x82810400, 0x00000024, + 0x41540000, 0x80817480, 0x040017ed, 0x0401f004, + 0x0201f800, 0x0010a5cc, 0x0401f7f7, 0x40866000, + 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, + 0x1c01f000, 0x497a621e, 0x812e59c0, 0x0400003d, + 0x592cd205, 0x486bc857, 0x592cd205, 0x8268d500, + 0x000000ff, 0x82697480, 0x00000014, 0x04000003, + 0x4a02621e, 0x00000003, 0x592cd409, 0x8c68d510, + 0x0402001d, 0x592cd209, 0x0201f800, 0x00104542, + 0x0201f800, 0x00108f22, 0x0201f800, 0x0010af1c, + 0x80c589c0, 0x0400001f, 0x4a026403, 0x00000085, + 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, + 0x5930d004, 0x8268d500, 0x00000100, 0x8268d540, + 0x8000404b, 0x486a6004, 0x0201f800, 0x0010619f, + 0x4200d000, 0x8000404b, 0x0201f800, 0x00106089, + 0x0401f01f, 0x592cd209, 0x0201f800, 0x00104542, + 0x4a025c09, 0x00000100, 0x0201f800, 0x00108f22, + 0x0201f800, 0x0010af1c, 0x80c589c0, 0x040207e3, + 0x0201f800, 0x000203ab, 0x5930d21e, 0x82697480, + 0x00000003, 0x0400000a, 0x497a6009, 0x0401f7db, + 0x4200d000, 0x00000527, 0x4130d800, 0x412ce000, + 0x0201f800, 0x0010032a, 0x0401f005, 0x0201f800, + 0x00108a55, 0x497a6009, 0x0401f7d0, 0x1c01f000, + 0x0201f800, 0x0010619f, 0x812e59c0, 0x0400001b, + 0x592cd409, 0x8c68d510, 0x04020012, 0x592cd209, + 0x0201f800, 0x00104542, 0x0201f800, 0x00108f22, + 0x0201f800, 0x000203ab, 0x5930d203, 0x82697480, + 0x0000000d, 0x0400000d, 0x0201f800, 0x0010619f, + 0x5930d00a, 0x0201f800, 0x00104121, 0x0401f007, + 0x592cd209, 0x0201f800, 0x00104542, 0x4a025c09, + 0x00000100, 0x0401f7ed, 0x0201f800, 0x00107144, + 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, + 0x48853801, 0x41790000, 0x0201f800, 0x00108668, + 0x40c50800, 0x48c7c857, 0x40840000, 0x82857480, + 0x0000000d, 0x83f17500, 0x03000000, 0x0400002b, + 0x0c01f001, 0x0010e9ef, 0x0010ea27, 0x0010ea05, + 0x0010e9dc, 0x0010ea07, 0x0010e9f7, 0x0010e9ef, + 0x0010e9ef, 0x0010e9ef, 0x0010e9f7, 0x0010e9f7, + 0x0010e9f7, 0x0010e9f7, 0x0010ea05, 0x0201f800, + 0x00108652, 0x80c589c0, 0x04000005, 0x0201f800, + 0x001063ef, 0x80c589c0, 0x04000055, 0x0201f800, + 0x0010e2da, 0x80c589c0, 0x04000017, 0x5930d403, + 0x486bc857, 0x5930d403, 0x82697480, 0x00000040, + 0x04020018, 0x0401ffaf, 0x42010000, 0x00000001, + 0x0401f069, 0x40840000, 0x82857480, 0x0000000d, + 0x040007d8, 0x040017d7, 0x4200d000, 0x000004b7, + 0x4130d800, 0x4084e000, 0x0201f800, 0x0010032a, + 0x0401f05d, 0x497bc856, 0x0201f800, 0x001060b6, + 0x80c589c0, 0x04020036, 0x59317004, 0x48bbc857, + 0x0401ff4d, 0x0401f7e9, 0x812e59c0, 0x0400004c, + 0x0201f800, 0x00108d84, 0x80c589c0, 0x04000030, + 0x0201f800, 0x0010619f, 0x592cd209, 0x8468d50c, + 0x486a5a09, 0x592cdc07, 0x806cd0c6, 0x406c0000, + 0x8068d400, 0x8068d400, 0x486a6006, 0x4200d000, + 0x10000000, 0x4130d800, 0x0201f800, 0x0010088e, + 0x80c589c0, 0x0400002b, 0x592cd209, 0x8c68d51c, + 0x04020024, 0x8468d55c, 0x486a5a09, 0x4a026006, + 0x00000002, 0x0401f7c9, 0x598d700f, 0x48bbc857, + 0x40b8d000, 0x41300000, 0x80697480, 0x04000014, + 0x0201f800, 0x0010e453, 0x80c589c0, 0x040207be, + 0x497bc856, 0x0201f800, 0x001060b6, 0x4200d000, + 0x000003f5, 0x80c589c0, 0x040007c2, 0x5930d203, + 0x486bc857, 0x59310a03, 0x0401f01f, 0x0201f800, + 0x00100bd5, 0x0401ff14, 0x0401f7b0, 0x0201f800, + 0x00106426, 0x80c589c0, 0x040007f5, 0x0401f7e9, + 0x41310000, 0x0201f800, 0x00101079, 0x40826000, + 0x5930d203, 0x82697480, 0x00000004, 0x040207a3, + 0x41390000, 0x42027000, 0x00000048, 0x0201f800, + 0x001071b6, 0x40827000, 0x0401f79c, 0x4200d000, + 0x000004a7, 0x4130d800, 0x412ce000, 0x0201f800, + 0x0010032a, 0x808101c0, 0x04000797, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, + 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, + 0x412d0800, 0x41410000, 0x4200d000, 0x0010bd2c, + 0x0201f800, 0x0010ae0f, 0x417a5800, 0x0201f800, + 0x0010894c, 0x80c589c0, 0x04000009, 0x0201f800, + 0x00109391, 0x59325809, 0x592cd209, 0x8468d54c, + 0x486a5a09, 0x42028000, 0x00000006, 0x0201f800, + 0x001061ab, 0x0401ff44, 0x0201f800, 0x0010619f, + 0x40828000, 0x40865800, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, + 0x00000002, 0x48813800, 0x48853801, 0x412d0800, + 0x0201f800, 0x0010e548, 0x80c589c0, 0x040000c3, + 0x5930d407, 0x40680000, 0x82697480, 0x00000013, + 0x83f17500, 0x03000000, 0x04000025, 0x0c01f001, + 0x0010eb4f, 0x0010eaf3, 0x0010eb09, 0x0010ead0, + 0x0010eaf3, 0x0010eb09, 0x0010eb19, 0x0010eb02, + 0x0010eb2e, 0x0010eaa9, 0x0010eabf, 0x0010eb2e, + 0x0010eb2e, 0x0010eb2e, 0x0010eb2e, 0x0010eb4f, + 0x0010eac5, 0x0010eb2a, 0x0010eb2e, 0x0010eb2e, + 0x0201f800, 0x00105c0e, 0x80c589c0, 0x04000090, + 0x5930d203, 0x82697480, 0x00000004, 0x0402009f, + 0x5930d006, 0x8068d1c0, 0x0400009c, 0x5930d415, + 0x8468d558, 0x486a6415, 0x0401f098, 0x4200d000, + 0x00000328, 0x4000d800, 0x4130e000, 0x0201f800, + 0x0010032a, 0x0401f091, 0x5930d203, 0x82697480, + 0x00000004, 0x04020003, 0x0201f800, 0x00100bd5, + 0x59325809, 0x0201f800, 0x0010894c, 0x80c589c0, + 0x0402006f, 0x0201f800, 0x00107144, 0x8d3e7d1c, + 0x04000082, 0x497a600a, 0x0401f080, 0x0201f800, + 0x00109391, 0x5930d203, 0x82697480, 0x00000004, + 0x04000074, 0x59325809, 0x0201f800, 0x0010894c, + 0x80c589c0, 0x040007f0, 0x592cd205, 0x8268d500, + 0x000000ff, 0x82697480, 0x00000014, 0x04000003, + 0x0201f800, 0x00108a55, 0x4a025a05, 0x00000103, + 0x592cd409, 0x8c68d512, 0x0402005c, 0x49425a07, + 0x497a580a, 0x0201f800, 0x0010a320, 0x0201f800, + 0x00108f22, 0x0201f800, 0x00108afb, 0x0201f800, + 0x000203ab, 0x0401f7d8, 0x5930d403, 0x82697480, + 0x00000043, 0x04000059, 0x0201f800, 0x0010e81e, + 0x80c589c0, 0x04020046, 0x0201f800, 0x00108a7c, + 0x80c589c0, 0x040007cc, 0x0201f800, 0x001078e7, + 0x0401f7c9, 0x5930d203, 0x82697480, 0x00000011, + 0x0402004a, 0x5930d41e, 0x486a6203, 0x0401f047, + 0x59325809, 0x0201f800, 0x0010894c, 0x80c589c0, + 0x040007bd, 0x49425a07, 0x497a5c0a, 0x0201f800, + 0x000203ab, 0x5930d21e, 0x82697480, 0x00000003, + 0x040207b5, 0x0201f800, 0x00108a55, 0x0401f7b2, + 0x5930d203, 0x82697480, 0x00000004, 0x04000030, + 0x59325809, 0x0201f800, 0x0010894c, 0x80c589c0, + 0x040007a9, 0x49425a07, 0x0201f800, 0x0010a320, + 0x0201f800, 0x00108f22, 0x0201f800, 0x000203ab, + 0x0401f7a1, 0x59325818, 0x0201f800, 0x00100589, + 0x0401f798, 0x59325809, 0x0201f800, 0x0010894c, + 0x80c589c0, 0x04000798, 0x49425a07, 0x497a5c07, + 0x0201f800, 0x000203ab, 0x0401f793, 0x49425a07, + 0x0201f800, 0x000203ab, 0x0401f78f, 0x59325809, + 0x0201f800, 0x00105fa3, 0x0401f78b, 0x0201f800, + 0x00101a68, 0x0401f7b9, 0x412d0000, 0x592e580a, + 0x0201f800, 0x00100589, 0x40825800, 0x0401f7a0, + 0x0201f800, 0x00100bd5, 0x0401f78b, 0x0201f800, + 0x00100bd5, 0x0401f7cf, 0x40865800, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, + 0x0201f800, 0x0010a10f, 0x80c589c0, 0x04020002, + 0x0401f003, 0x5932680a, 0x0401ff29, 0x1c01f000, + 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, + 0x48893802, 0x488d3803, 0x48913804, 0x41311000, + 0x41352000, 0x4933c857, 0x4947c857, 0x4943c857, + 0x0201f800, 0x001061ab, 0x40c51800, 0x0201f800, + 0x00109fb3, 0x41310800, 0x813261c0, 0x04000048, + 0x42000000, 0x0010f64c, 0x81317480, 0x04000044, + 0x59a8d00d, 0x8068d040, 0x42010000, 0x0010f694, + 0x40680000, 0x81657480, 0x0400000f, 0x41580000, + 0x80817480, 0x0402100c, 0x40826000, 0x40800000, + 0x80857480, 0x04000003, 0x4084d000, 0x0401ffd1, + 0x82810400, 0x00000024, 0x41580000, 0x80817480, + 0x040017f6, 0x41510000, 0x41540000, 0x80817480, + 0x04021012, 0x8d3e7d18, 0x04000010, 0x59a8d04d, + 0x59a8004e, 0x80697480, 0x0400000c, 0x40826000, + 0x5880d00a, 0x8068d1c0, 0x0400000d, 0x4084d000, + 0x0401ffbc, 0x82810400, 0x00000024, 0x41540000, + 0x80817480, 0x040017f0, 0x408a6000, 0x40926800, + 0x808d7040, 0x04000018, 0x0401f01d, 0x0201f800, + 0x00103e78, 0x40c66800, 0x80c589c0, 0x040007f2, + 0x58c4d002, 0x5930d81f, 0x82680500, 0x00ffffff, + 0x806d7480, 0x040207ec, 0x5930d203, 0x82697480, + 0x00000008, 0x0400000b, 0x4936600a, 0x0401fed0, + 0x82810400, 0x00000024, 0x0401f7e5, 0x59a8d00d, + 0x0401f7be, 0x0201f800, 0x0010619f, 0x0401f004, + 0x0201f800, 0x0010a5cc, 0x0401f7f4, 0x589d2004, + 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000005, 0x1c01f000, 0x829d3c80, + 0x00000007, 0x48813800, 0x48853801, 0x48893802, + 0x488d3803, 0x48913804, 0x48953805, 0x48993806, + 0x42010000, 0x00000001, 0x41790800, 0x497bc856, + 0x41311000, 0x41351800, 0x41452000, 0x413d2800, + 0x40593000, 0x4200d000, 0x0010ebc8, 0x0201f800, + 0x0010587a, 0x59a8d21b, 0x8c68d508, 0x0400001d, + 0x8c68d516, 0x0402001b, 0x59aa6864, 0x813669c0, + 0x0400007a, 0x5934d400, 0x82697480, 0x00000404, + 0x04020076, 0x0201f800, 0x00107185, 0x40c66000, + 0x80c589c0, 0x0400006b, 0x48818c07, 0x4935880a, + 0x40867800, 0x0201f800, 0x00103d92, 0x4200d000, + 0x00000005, 0x0201f800, 0x00103d9c, 0x42027000, + 0x00000003, 0x0201f800, 0x001071b6, 0x0401f063, + 0x8c68d506, 0x04020003, 0x8c68d50a, 0x04000014, + 0x0201f800, 0x001040de, 0x80c589c0, 0x0400000a, + 0x83acd400, 0x000007fe, 0x586a6800, 0x5934d200, + 0x8468d51a, 0x486a6a00, 0x59a8d21b, 0x8c68d506, + 0x0402003c, 0x808509c0, 0x04000005, 0x8d0e1d20, + 0x0402003c, 0x0201f800, 0x0010e25a, 0x80817040, + 0x0402004a, 0x4200b000, 0x000007f0, 0x417a8800, + 0x0401f01c, 0x826cd540, 0x00001000, 0x486a6a00, 0x5934d200, 0x8468d51a, 0x486a6a00, 0x4937c857, - 0x4a026c00, 0x00000707, 0x0201f800, 0x00106106, - 0x40c50000, 0x417a6000, 0x0201f800, 0x0010e4c8, - 0x0201f800, 0x0010e5a4, 0x417a7800, 0x0201f800, - 0x0010e63d, 0x0201f800, 0x0010ea62, 0x80817040, - 0x040207d6, 0x0201f800, 0x001060fa, 0x0401f7d3, - 0x41790000, 0x42010800, 0x00000001, 0x0401f7c3, - 0x4200d000, 0x000007d0, 0x4200d800, 0x0010eacd, - 0x0201f800, 0x00105900, 0x0201f800, 0x0010e14a, - 0x0401f7c0, 0x4200d000, 0x00000098, 0x40c4d800, - 0x4134e000, 0x0201f800, 0x0010032a, 0x408a6000, - 0x408e6800, 0x40928800, 0x40967800, 0x4098b000, - 0x589d3006, 0x589d2805, 0x589d2004, 0x589d1803, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000007, 0x1c01f000, 0x497bc856, 0x0201f800, - 0x0010470f, 0x80c589c0, 0x0402002b, 0x59a8d015, - 0x8c68d504, 0x04000031, 0x8d0e1d20, 0x0400001c, - 0x4200b000, 0x000007f0, 0x417a8800, 0x0401f004, - 0x81468800, 0x8058b040, 0x04000015, 0x0201f800, - 0x00103e62, 0x80c589c0, 0x040007fa, 0x0201f800, - 0x00104171, 0x80c589c0, 0x040007f6, 0x59a8d00f, - 0x59340002, 0x8068d580, 0x8268d500, 0x00ffff00, - 0x040207f0, 0x5934d200, 0x8468d55a, 0x486a6a00, - 0x81468800, 0x8058b040, 0x040207ed, 0x0201f800, - 0x001040c4, 0x80c589c0, 0x04000020, 0x59a8d029, - 0x4200d800, 0x0010eacd, 0x0201f800, 0x00105900, - 0x0401f01f, 0x83acd400, 0x000007fe, 0x586a6800, - 0x813669c0, 0x040007d5, 0x5934d200, 0x8468d51a, - 0x486a6a00, 0x0401f7d1, 0x59a8d21b, 0x8c68d506, - 0x040007ce, 0x83acd400, 0x000007fe, 0x586a6800, - 0x813669c0, 0x040007c9, 0x0201f800, 0x00104171, - 0x80c589c0, 0x040007c5, 0x5934d200, 0x8468d55a, - 0x486a6a00, 0x0401f7c1, 0x8d0e1d20, 0x040007e5, - 0x4200d000, 0x000007d0, 0x0401f7de, 0x1c01f000, - 0x829d3c80, 0x00000003, 0x48813800, 0x48853801, - 0x48893802, 0x40691000, 0x40710800, 0x4978e000, - 0x83457480, 0x000007ff, 0x83f17500, 0x03000000, - 0x04000047, 0x4978e002, 0x4944e001, 0x4144e800, - 0x42010000, 0x0010af80, 0x4200b000, 0x000007f0, - 0x83457480, 0x000007ef, 0x04000039, 0x04001038, - 0x4200b000, 0x00000010, 0x8058b1c0, 0x04000017, - 0x40740000, 0x8080d400, 0x5868f000, 0x8078f1c0, - 0x04020043, 0x5884e001, 0x41440000, 0x80717480, - 0x0400005b, 0x8070d000, 0x8074e800, 0x83457480, - 0x000007ef, 0x0400004d, 0x0400104c, 0x82697480, - 0x00000800, 0x0400002e, 0x48690801, 0x8058b040, - 0x8058b1c0, 0x040207eb, 0x5884d802, 0x806cd9c0, - 0x04000065, 0x412d0000, 0x4088d000, 0x0201f800, - 0x00103dbf, 0x4947c857, 0x4937c857, 0x40825800, - 0x813669c0, 0x04000062, 0x497a6a12, 0x59a8d21b, - 0x8c68d50a, 0x0402000a, 0x8288dd00, 0x00ffff00, - 0x04000050, 0x59a8d00f, 0x8268d500, 0x00ffff00, - 0x406c0000, 0x80697480, 0x0400004a, 0x488a6802, - 0x4200d000, 0x00000001, 0x0401f079, 0x82697480, - 0x00fffffb, 0x040007c9, 0x040017c8, 0x4947c857, + 0x4a026c00, 0x00000707, 0x0201f800, 0x001061ab, + 0x40c50000, 0x417a6000, 0x0201f800, 0x0010e5d8, + 0x0201f800, 0x0010e6a9, 0x417a7800, 0x0201f800, + 0x0010e742, 0x0201f800, 0x0010eb5d, 0x80817040, + 0x04000025, 0x81468800, 0x8058b040, 0x0400002b, + 0x0201f800, 0x00103e78, 0x80c589c0, 0x040007fa, + 0x5934da00, 0x8c6cdd1a, 0x040007f7, 0x5934d403, + 0x406a8800, 0x417a7800, 0x42028000, 0x00000029, + 0x8d0e1d20, 0x040007d8, 0x413cd000, 0x413cd800, + 0x0201f800, 0x0010a016, 0x5934da00, 0x0401f7d2, + 0x41790000, 0x42010800, 0x00000001, 0x0401f7c2, + 0x4200d000, 0x000007d0, 0x4200d800, 0x0010ebc8, + 0x0201f800, 0x001059a5, 0x0201f800, 0x0010e25a, + 0x0401f7bf, 0x0201f800, 0x0010619f, 0x0401f7da, + 0x4200d000, 0x000000a0, 0x40c4d800, 0x4134e000, + 0x0201f800, 0x0010032a, 0x408a6000, 0x408e6800, + 0x40928800, 0x40967800, 0x4098b000, 0x589d3006, + 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, + 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000007, + 0x1c01f000, 0x497bc856, 0x0201f800, 0x0010474e, + 0x80c589c0, 0x0402002e, 0x59a8d015, 0x8c68d504, + 0x04000034, 0x8d0e1d20, 0x04020004, 0x59a8d006, + 0x8c68d51c, 0x0400001c, 0x4200b000, 0x000007f0, + 0x417a8800, 0x0401f004, 0x81468800, 0x8058b040, + 0x04000015, 0x0201f800, 0x00103e78, 0x80c589c0, + 0x040007fa, 0x0201f800, 0x0010418d, 0x80c589c0, + 0x040007f6, 0x59a8d00f, 0x59340002, 0x8068d580, + 0x8268d500, 0x00ffff00, 0x040207f0, 0x5934d200, + 0x8468d55a, 0x486a6a00, 0x81468800, 0x8058b040, + 0x040207ed, 0x0201f800, 0x001040de, 0x80c589c0, + 0x04000020, 0x59a8d029, 0x4200d800, 0x0010ebc8, + 0x0201f800, 0x001059a5, 0x0401f022, 0x83acd400, + 0x000007fe, 0x586a6800, 0x813669c0, 0x040007d2, + 0x5934d200, 0x8468d51a, 0x486a6a00, 0x0401f7ce, + 0x59a8d21b, 0x8c68d506, 0x040007cb, 0x83acd400, + 0x000007fe, 0x586a6800, 0x813669c0, 0x040007c6, + 0x0201f800, 0x0010418d, 0x80c589c0, 0x040007c2, + 0x5934d200, 0x8468d55a, 0x486a6a00, 0x0401f7be, + 0x8d0e1d20, 0x04020004, 0x59a8d006, 0x8c68d51c, + 0x040007e2, 0x4200d000, 0x000007d0, 0x0401f7db, + 0x1c01f000, 0x829d3c80, 0x00000003, 0x48813800, + 0x48853801, 0x48893802, 0x40691000, 0x40710800, + 0x4978e000, 0x83457480, 0x000007ff, 0x83f17500, + 0x03000000, 0x04000047, 0x4978e002, 0x4944e001, + 0x4144e800, 0x42010000, 0x0010b080, 0x4200b000, + 0x000007f0, 0x83457480, 0x000007ef, 0x04000039, + 0x04001038, 0x4200b000, 0x00000010, 0x8058b1c0, + 0x04000017, 0x40740000, 0x8080d400, 0x5868f000, + 0x8078f1c0, 0x04020043, 0x5884e001, 0x41440000, + 0x80717480, 0x0400005b, 0x8070d000, 0x8074e800, + 0x83457480, 0x000007ef, 0x0400004d, 0x0400104c, + 0x82697480, 0x00000800, 0x0400002e, 0x48690801, + 0x8058b040, 0x8058b1c0, 0x040207eb, 0x5884d802, + 0x806cd9c0, 0x04000065, 0x412d0000, 0x4088d000, + 0x0201f800, 0x00103dd5, 0x4947c857, 0x4937c857, + 0x40825800, 0x813669c0, 0x04000062, 0x497a6a12, + 0x59a8d21b, 0x8c68d50a, 0x0402000a, 0x8288dd00, + 0x00ffff00, 0x04000050, 0x59a8d00f, 0x8268d500, + 0x00ffff00, 0x406c0000, 0x80697480, 0x0400004a, + 0x488a6802, 0x4200d000, 0x00000001, 0x0401f079, + 0x82697480, 0x00fffffb, 0x040007c9, 0x040017c8, + 0x4947c857, 0x488bc857, 0x58857001, 0x48bbc857, + 0x4a010800, 0x00000019, 0x4178d000, 0x0401f06d, + 0x4a010801, 0x000007f0, 0x4200e800, 0x000007f0, + 0x42010000, 0x0010b080, 0x8058b040, 0x0401f7ce, + 0x5878d002, 0x8268e500, 0x00ffffff, 0x48710803, + 0x40880000, 0x80717480, 0x04000049, 0x5884e001, + 0x41440000, 0x80717480, 0x040207b8, 0x58797002, + 0x48b90803, 0x4947c857, 0x58857003, 0x48bbc857, + 0x4a010800, 0x0000001b, 0x0401f7e4, 0x82697480, + 0x000007f0, 0x040207b6, 0x49790801, 0x42010000, + 0x0010b080, 0x4178e800, 0x8058b040, 0x0401f7b2, + 0x49450802, 0x83457480, 0x000007ef, 0x0400000e, + 0x0400100d, 0x83457480, 0x000007fc, 0x04000028, + 0x83457480, 0x000007fd, 0x0400001a, 0x83457480, + 0x000007ff, 0x0402001a, 0x82897480, 0x00ffffff, + 0x04020017, 0x5884d002, 0x8468d55e, 0x48690802, + 0x0401f792, 0x8288d500, 0x000000ff, 0x8068d0d0, + 0x486a6a12, 0x0401f7b3, 0x4200d000, 0x0000044d, + 0x4084e000, 0x0201f800, 0x0010032a, 0x0401f797, + 0x4947c857, 0x4a010800, 0x0000000a, 0x0401f7b7, + 0x82897480, 0x00fffffd, 0x040007eb, 0x4947c857, 0x488bc857, 0x58857001, 0x48bbc857, 0x4a010800, - 0x00000019, 0x4178d000, 0x0401f06d, 0x4a010801, - 0x000007f0, 0x4200e800, 0x000007f0, 0x42010000, - 0x0010af80, 0x8058b040, 0x0401f7ce, 0x5878d002, - 0x8268e500, 0x00ffffff, 0x48710803, 0x40880000, - 0x80717480, 0x04000049, 0x5884e001, 0x41440000, - 0x80717480, 0x040207b8, 0x58797002, 0x48b90803, - 0x4947c857, 0x58857003, 0x48bbc857, 0x4a010800, - 0x0000001b, 0x0401f7e4, 0x82697480, 0x000007f0, - 0x040207b6, 0x49790801, 0x42010000, 0x0010af80, - 0x4178e800, 0x8058b040, 0x0401f7b2, 0x49450802, - 0x83457480, 0x000007ef, 0x0400000e, 0x0400100d, - 0x83457480, 0x000007fc, 0x04000028, 0x83457480, - 0x000007fd, 0x0400001a, 0x83457480, 0x000007ff, - 0x0402001a, 0x82897480, 0x00ffffff, 0x04020017, - 0x5884d002, 0x8468d55e, 0x48690802, 0x0401f792, - 0x8288d500, 0x000000ff, 0x8068d0d0, 0x486a6a12, - 0x0401f7b3, 0x4200d000, 0x000003f1, 0x4084e000, - 0x0201f800, 0x0010032a, 0x0401f797, 0x4947c857, - 0x4a010800, 0x0000000a, 0x0401f7b7, 0x82897480, - 0x00fffffd, 0x040007eb, 0x4947c857, 0x488bc857, - 0x58857001, 0x48bbc857, 0x4a010800, 0x00000019, - 0x4078d000, 0x0401f01a, 0x82897480, 0x00fffffc, - 0x040007e0, 0x0401f7f5, 0x5884d001, 0x41440000, - 0x80697480, 0x04000007, 0x4947c857, 0x4873c857, - 0x486fc857, 0x4a010800, 0x0000001a, 0x0401f79e, - 0x407a6800, 0x8c6cdd08, 0x0400078e, 0x0201f800, - 0x001040b4, 0x80c589c0, 0x0400078a, 0x4947c857, - 0x4a010800, 0x0000001d, 0x0401f793, 0x40698800, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000003, 0x1c01f000, 0x4200d000, 0x00000080, - 0x0201f800, 0x00101363, 0x0201f800, 0x0010593d, - 0x59c4d0a3, 0x8468d506, 0x486b88a3, 0x0201f800, - 0x0010471c, 0x80c589c0, 0x04020005, 0x0201f800, - 0x0010473a, 0x80c589c0, 0x0400006c, 0x59c4d0a3, - 0x8268d500, 0xbe7fffff, 0x486b88a3, 0x4200d000, - 0x000000f8, 0x0201f800, 0x001039ea, 0x59c4d0a3, - 0x8268d540, 0x00018000, 0x8468d51c, 0x486b88a3, - 0x59c4d0a3, 0x8468d520, 0x486b88a3, 0x497b8808, - 0x59c4d006, 0x8268d500, 0xfbffff0e, 0x486b8806, - 0x497b282c, 0x497b282d, 0x4200d000, 0x000001f4, - 0x4200d800, 0x0010ee45, 0x0201f800, 0x001057be, - 0x4a038805, 0x00000001, 0x0201f800, 0x00101419, - 0x80c589c0, 0x04020023, 0x0201f800, 0x00101427, - 0x80c589c0, 0x04000035, 0x4178d000, 0x0201f800, - 0x0010169c, 0x4178d000, 0x0201f800, 0x00101622, - 0x0201f800, 0x00101720, 0x4a035038, 0x00000001, - 0x0201f800, 0x0010471c, 0x80c589c0, 0x04000018, - 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x82697480, - 0x00000008, 0x04000003, 0x4a038805, 0x04000000, - 0x59c4d0a3, 0x8268d540, 0x0001c000, 0x486b88a3, - 0x59c4d0a3, 0x8468d520, 0x486b88a3, 0x0401f050, - 0x4200d000, 0x00000001, 0x0201f800, 0x0010169c, - 0x4200d000, 0x00000001, 0x0401f7e0, 0x0201f800, - 0x0010473a, 0x80c589c0, 0x040207e6, 0x0201f800, - 0x0010472b, 0x4200d000, 0x000001a1, 0x80c589c0, - 0x04020033, 0x599cd818, 0x40c4e000, 0x0201f800, - 0x0010032a, 0x0401f03a, 0x0201f800, 0x00101435, - 0x80c589c0, 0x04020023, 0x0201f800, 0x00101443, - 0x80c589c0, 0x0400002e, 0x59a8d043, 0x8068d1c0, - 0x040007c8, 0x0201f800, 0x00101450, 0x4a035038, - 0x00000001, 0x0401f02a, 0x0201f800, 0x0010472b, - 0x80c589c0, 0x0400001f, 0x59c4d0a3, 0x8468d570, - 0x8468d532, 0x486b88a3, 0x59a8d073, 0x82697480, - 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, - 0x82b97580, 0x0c000000, 0x04020796, 0x0201f800, - 0x00104b3e, 0x4a038808, 0x00000008, 0x0401f791, - 0x4200d000, 0x00000002, 0x0201f800, 0x0010169c, - 0x4200d000, 0x00000002, 0x0401f7a4, 0x4a035014, - 0x00000001, 0x0201f800, 0x00104670, 0x0401f008, - 0x4200d000, 0x0000014e, 0x0401f7c7, 0x4200d000, - 0x00000182, 0x59a8d837, 0x0401f7c4, 0x1c01f000, - 0x5994d02c, 0x8068d1c0, 0x04020006, 0x5994d02d, - 0x4200d800, 0x00000001, 0x8068d1c0, 0x04000002, - 0x4178d800, 0x406d8800, 0x1c01f000, 0x0201f800, - 0x00101616, 0x4a035038, 0x00000002, 0x497b5043, - 0x59c4d0a3, 0x8468d520, 0x486b88a3, 0x0201f800, - 0x0010472b, 0x80c589c0, 0x04000002, 0x0401f009, - 0x48c7282c, 0x48c7282d, 0x4200d000, 0x0000002d, - 0x4200d800, 0x0010ee45, 0x0201f800, 0x001057be, - 0x1c01f000, 0x0401ffdf, 0x80c589c0, 0x04000004, - 0x4a035038, 0x00000003, 0x0401f01f, 0x0201f800, - 0x00101443, 0x80c589c0, 0x04000004, 0x59a8d043, - 0x8068d1c0, 0x04020008, 0x0201f800, 0x001016e7, - 0x80c589c0, 0x04020002, 0x0401f013, 0x0401ffd8, - 0x0401f011, 0x0201f800, 0x00101450, 0x59a8d042, - 0x8c68d51e, 0x040007f9, 0x0201f800, 0x0010472b, - 0x80c589c0, 0x04020003, 0x0401ffcd, 0x0401f006, - 0x4a035014, 0x00000001, 0x0201f800, 0x00104670, - 0x0401f7fa, 0x1c01f000, 0x4202d800, 0x00000001, - 0x497b5038, 0x4a038805, 0x00000001, 0x497b282c, - 0x497b282d, 0x497b8885, 0x1c01f000, 0x59a8d073, + 0x00000019, 0x4078d000, 0x0401f01a, 0x82897480, + 0x00fffffc, 0x040007e0, 0x0401f7f5, 0x5884d001, + 0x41440000, 0x80697480, 0x04000007, 0x4947c857, + 0x4873c857, 0x486fc857, 0x4a010800, 0x0000001a, + 0x0401f79e, 0x407a6800, 0x8c6cdd08, 0x0400078e, + 0x0201f800, 0x001040ce, 0x80c589c0, 0x0400078a, + 0x4947c857, 0x4a010800, 0x0000001d, 0x0401f793, + 0x40698800, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000003, 0x1c01f000, 0x4200d000, + 0x00000080, 0x0201f800, 0x00101364, 0x0201f800, + 0x001059e2, 0x59c4d0a3, 0x8468d506, 0x486b88a3, + 0x0201f800, 0x0010475b, 0x80c589c0, 0x04020005, + 0x0201f800, 0x00104779, 0x80c589c0, 0x0400006c, + 0x59c4d0a3, 0x8268d500, 0xbe7fffff, 0x486b88a3, + 0x4200d000, 0x000000f8, 0x0201f800, 0x001039fd, + 0x59c4d0a3, 0x8268d540, 0x00018000, 0x8468d51c, + 0x486b88a3, 0x59c4d0a3, 0x8468d520, 0x486b88a3, + 0x497b8808, 0x59c4d006, 0x8268d500, 0xfbffff0e, + 0x486b8806, 0x497b282c, 0x497b282d, 0x4200d000, + 0x000001f4, 0x4200d800, 0x0010ef4a, 0x0201f800, + 0x00105863, 0x4a038805, 0x00000001, 0x0201f800, + 0x0010141a, 0x80c589c0, 0x04020023, 0x0201f800, + 0x00101428, 0x80c589c0, 0x04000035, 0x4178d000, + 0x0201f800, 0x0010169d, 0x4178d000, 0x0201f800, + 0x00101623, 0x0201f800, 0x00101721, 0x4a035038, + 0x00000001, 0x0201f800, 0x0010475b, 0x80c589c0, + 0x04000018, 0x59c4d0a4, 0x8268d500, 0x0000000f, + 0x82697480, 0x00000008, 0x04000003, 0x4a038805, + 0x04000000, 0x59c4d0a3, 0x8268d540, 0x0001c000, + 0x486b88a3, 0x59c4d0a3, 0x8468d520, 0x486b88a3, + 0x0401f050, 0x4200d000, 0x00000001, 0x0201f800, + 0x0010169d, 0x4200d000, 0x00000001, 0x0401f7e0, + 0x0201f800, 0x00104779, 0x80c589c0, 0x040207e6, + 0x0201f800, 0x0010476a, 0x4200d000, 0x000001a9, + 0x80c589c0, 0x04020033, 0x599cd818, 0x40c4e000, + 0x0201f800, 0x0010032a, 0x0401f03a, 0x0201f800, + 0x00101436, 0x80c589c0, 0x04020023, 0x0201f800, + 0x00101444, 0x80c589c0, 0x0400002e, 0x59a8d043, + 0x8068d1c0, 0x040007c8, 0x0201f800, 0x00101451, + 0x4a035038, 0x00000001, 0x0401f02a, 0x0201f800, + 0x0010476a, 0x80c589c0, 0x0400001f, 0x59c4d0a3, + 0x8468d570, 0x8468d532, 0x486b88a3, 0x59a8d073, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, - 0x04000004, 0x82b97580, 0x0c000000, 0x04020007, - 0x59c4d005, 0x8268d500, 0x000000c0, 0x04020005, - 0x486b8885, 0x0401f008, 0x8468d506, 0x486b5073, - 0x59c4d006, 0x8268d540, 0x000000f1, 0x486b8806, - 0x0401ffe2, 0x1c01f000, 0x0201f800, 0x0010473a, - 0x80c589c0, 0x04000005, 0x59a8d013, 0x82697480, - 0x0000aaaa, 0x0400000c, 0x497b5013, 0x59c4d006, - 0x8268d540, 0x04000001, 0x486b8806, 0x8d0e1d06, - 0x04020008, 0x59c4d0a3, 0x8468d546, 0x486b88a3, - 0x0401f004, 0x4a03500f, 0x00ffffff, 0x0401f7f3, - 0x0401ffca, 0x1c01f000, 0x809d3840, 0x48813800, - 0x0401ff80, 0x80c589c0, 0x04000005, 0x4a035038, - 0x00000003, 0x497b8885, 0x0401f03e, 0x4a038805, - 0x000000f0, 0x0201f800, 0x001016e7, 0x80c589c0, - 0x0400002d, 0x0201f800, 0x0010472b, 0x80c589c0, - 0x04020033, 0x59c4d0a4, 0x8268d500, 0x0000000f, - 0x82697480, 0x00000008, 0x0400002b, 0x59c4d005, - 0x82690500, 0x04000000, 0x8c68d534, 0x04020026, - 0x5994d02c, 0x82697480, 0x00000002, 0x83f17500, - 0x03000000, 0x040007e4, 0x0201f800, 0x0010473a, - 0x80c589c0, 0x040007e0, 0x4a038805, 0x000000f0, - 0x0201f800, 0x00104777, 0x4a035013, 0x0000aaaa, - 0x48835014, 0x59c4d0a3, 0x8468d546, 0x486b88a3, - 0x4202d800, 0x00000001, 0x48835038, 0x4a038805, - 0x00000001, 0x4883282c, 0x4883282d, 0x0401ff98, - 0x0401f7cd, 0x0201f800, 0x00101443, 0x80c589c0, - 0x040007c9, 0x59a8d043, 0x8068d1c0, 0x040007c6, - 0x0401f7c3, 0x0401ffa5, 0x0401f7c3, 0x0401ff8c, - 0x589d0000, 0x809d3800, 0x1c01f000, 0x497bc856, - 0x4200d000, 0x00000080, 0x0201f800, 0x00101363, - 0x497b5038, 0x0201f800, 0x00101443, 0x80c589c0, - 0x0400000e, 0x59a8d036, 0x8068d1c0, 0x04020008, - 0x8068d1c0, 0x04020009, 0x4a035036, 0x0000000a, - 0x4a035043, 0x00000001, 0x0401f004, 0x8068d040, - 0x486b5036, 0x0401f7f7, 0x497b8885, 0x0201f800, - 0x001003f9, 0x1c01f000, 0x59a8d873, 0x826d7480, - 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, - 0x82b97580, 0x0c000000, 0x04020011, 0x4200e000, - 0x00000003, 0x59a80038, 0x80717480, 0x04001006, - 0x0c01f001, 0x0010ee3f, 0x0010ee41, 0x0010ee43, - 0x0010ee3d, 0x4200d000, 0x000000c3, 0x4000d800, - 0x0201f800, 0x0010032a, 0x0401f019, 0x826cd500, - 0x00000008, 0x8c6cdd06, 0x040207ed, 0x4202d800, - 0x00000001, 0x486b5038, 0x486b282c, 0x486b282d, - 0x59a8d073, 0x8468d506, 0x486b5073, 0x4a035014, - 0x00000001, 0x0201f800, 0x00104670, 0x0401f008, - 0x0401ffbb, 0x0401f006, 0x0401fe4c, 0x0401f004, - 0x0401ff11, 0x0401f002, 0x0401ff6c, 0x1c01f000, - 0x497b282d, 0x1c01f000, 0x59a8d017, 0x82697480, - 0x0000ffff, 0x04000004, 0x0201f800, 0x0010e14a, - 0x0401f0b1, 0x59a8da1b, 0x826cd500, 0x00000028, - 0x04000025, 0x8c6cdd00, 0x04000023, 0x4a038802, - 0x0000ffbf, 0x59a8da1b, 0x8c6cdd02, 0x0400001e, - 0x599ce018, 0x8c70e516, 0x04020012, 0x59a8d01c, - 0x82697480, 0x0000ffff, 0x0400000e, 0x0201f800, - 0x00101a07, 0x59a8d21b, 0x8268dd00, 0x00000004, - 0x8c68d504, 0x04020050, 0x406e5800, 0x4200d000, - 0x00000003, 0x0201f800, 0x00101a35, 0x0401f092, - 0x8c70e516, 0x04020005, 0x59a8d01c, 0x82697480, - 0x0000ffff, 0x04000084, 0x59a8d01d, 0x8068d1c0, - 0x04020041, 0x8c6cdd08, 0x04000040, 0x599cd019, - 0x8c68d510, 0x04000041, 0x0201f800, 0x001040c4, - 0x80c589c0, 0x04020038, 0x599cd019, 0x8c68d510, - 0x0400003d, 0x59a8d21b, 0x8c68d508, 0x0400003a, - 0x4a038802, 0x0000ffff, 0x4200d000, 0x0010b841, - 0x0201f800, 0x00100531, 0x4200d000, 0x0010b84e, - 0x0201f800, 0x00100531, 0x850e1d02, 0x4a0378e4, - 0x00000080, 0x4202d800, 0x00000003, 0x4a035017, - 0x0000ffff, 0x0201f800, 0x0010042f, 0x4178d000, - 0x0201f800, 0x00101363, 0x59a8d21b, 0x8c68d506, - 0x04000048, 0x599cd018, 0x8268e500, 0x00000800, - 0x8c68d516, 0x04020040, 0x599cd019, 0x8c68d510, - 0x04000004, 0x59a8d21b, 0x8c68d508, 0x04020049, - 0x4200d000, 0x0000ffff, 0x4200d800, 0x00000006, - 0x4178e000, 0x0201f800, 0x0010325d, 0x0201f800, - 0x0010473a, 0x80c589c0, 0x04000020, 0x0201f800, - 0x00106420, 0x0401f048, 0x59a8d016, 0x8068d1c0, - 0x040007c2, 0x0401f044, 0x8c6cdd16, 0x040207bf, - 0x0401f041, 0x599cd018, 0x8c68d516, 0x0400001d, - 0x599cd017, 0x8c68d50a, 0x040007c2, 0x4200b000, + 0x04000004, 0x82b97580, 0x0c000000, 0x04020796, + 0x0201f800, 0x00104b7d, 0x4a038808, 0x00000008, + 0x0401f791, 0x4200d000, 0x00000002, 0x0201f800, + 0x0010169d, 0x4200d000, 0x00000002, 0x0401f7a4, + 0x4a035014, 0x00000001, 0x0201f800, 0x001046af, + 0x0401f008, 0x4200d000, 0x00000156, 0x0401f7c7, + 0x4200d000, 0x0000018a, 0x59a8d837, 0x0401f7c4, + 0x1c01f000, 0x5994d02c, 0x8068d1c0, 0x04020006, + 0x5994d02d, 0x4200d800, 0x00000001, 0x8068d1c0, + 0x04000002, 0x4178d800, 0x406d8800, 0x1c01f000, + 0x0201f800, 0x00101617, 0x4a035038, 0x00000002, + 0x497b5043, 0x59c4d0a3, 0x8468d520, 0x486b88a3, + 0x0201f800, 0x0010476a, 0x80c589c0, 0x04000002, + 0x0401f009, 0x48c7282c, 0x48c7282d, 0x4200d000, + 0x0000002d, 0x4200d800, 0x0010ef4a, 0x0201f800, + 0x00105863, 0x1c01f000, 0x0401ffdf, 0x80c589c0, + 0x04000004, 0x4a035038, 0x00000003, 0x0401f01f, + 0x0201f800, 0x00101444, 0x80c589c0, 0x04000004, + 0x59a8d043, 0x8068d1c0, 0x04020008, 0x0201f800, + 0x001016e8, 0x80c589c0, 0x04020002, 0x0401f013, + 0x0401ffd8, 0x0401f011, 0x0201f800, 0x00101451, + 0x59a8d042, 0x8c68d51e, 0x040007f9, 0x0201f800, + 0x0010476a, 0x80c589c0, 0x04020003, 0x0401ffcd, + 0x0401f006, 0x4a035014, 0x00000001, 0x0201f800, + 0x001046af, 0x0401f7fa, 0x1c01f000, 0x4202d800, + 0x00000001, 0x497b5038, 0x4a038805, 0x00000001, + 0x497b282c, 0x497b282d, 0x497b8885, 0x1c01f000, + 0x59a8d073, 0x82697480, 0x00000000, 0x83f17500, + 0x0c000000, 0x04000004, 0x82b97580, 0x0c000000, + 0x04020007, 0x59c4d005, 0x8268d500, 0x000000c0, + 0x04020005, 0x486b8885, 0x0401f008, 0x8468d506, + 0x486b5073, 0x59c4d006, 0x8268d540, 0x000000f1, + 0x486b8806, 0x0401ffe2, 0x1c01f000, 0x0201f800, + 0x00104779, 0x80c589c0, 0x04000005, 0x59a8d013, + 0x82697480, 0x0000aaaa, 0x0400000c, 0x497b5013, + 0x59c4d006, 0x8268d540, 0x04000001, 0x486b8806, + 0x8d0e1d06, 0x04020008, 0x59c4d0a3, 0x8468d546, + 0x486b88a3, 0x0401f004, 0x4a03500f, 0x00ffffff, + 0x0401f7f3, 0x0401ffca, 0x1c01f000, 0x809d3840, + 0x48813800, 0x0401ff80, 0x80c589c0, 0x04000005, + 0x4a035038, 0x00000003, 0x497b8885, 0x0401f03e, + 0x4a038805, 0x000000f0, 0x0201f800, 0x001016e8, + 0x80c589c0, 0x0400002d, 0x0201f800, 0x0010476a, + 0x80c589c0, 0x04020033, 0x59c4d0a4, 0x8268d500, + 0x0000000f, 0x82697480, 0x00000008, 0x0400002b, + 0x59c4d005, 0x82690500, 0x04000000, 0x8c68d534, + 0x04020026, 0x5994d02c, 0x82697480, 0x00000002, + 0x83f17500, 0x03000000, 0x040007e4, 0x0201f800, + 0x00104779, 0x80c589c0, 0x040007e0, 0x4a038805, + 0x000000f0, 0x0201f800, 0x001047b6, 0x4a035013, + 0x0000aaaa, 0x48835014, 0x59c4d0a3, 0x8468d546, + 0x486b88a3, 0x4202d800, 0x00000001, 0x48835038, + 0x4a038805, 0x00000001, 0x4883282c, 0x4883282d, + 0x0401ff98, 0x0401f7cd, 0x0201f800, 0x00101444, + 0x80c589c0, 0x040007c9, 0x59a8d043, 0x8068d1c0, + 0x040007c6, 0x0401f7c3, 0x0401ffa5, 0x0401f7c3, + 0x0401ff8c, 0x589d0000, 0x809d3800, 0x1c01f000, + 0x497bc856, 0x4200d000, 0x00000080, 0x0201f800, + 0x00101364, 0x497b5038, 0x0201f800, 0x00101444, + 0x80c589c0, 0x0400000e, 0x59a8d036, 0x8068d1c0, + 0x04020008, 0x8068d1c0, 0x04020009, 0x4a035036, + 0x0000000a, 0x4a035043, 0x00000001, 0x0401f004, + 0x8068d040, 0x486b5036, 0x0401f7f7, 0x497b8885, + 0x0201f800, 0x001003f9, 0x1c01f000, 0x59a8d873, + 0x826d7480, 0x00000000, 0x83f17500, 0x0c000000, + 0x04000004, 0x82b97580, 0x0c000000, 0x04020011, + 0x4200e000, 0x00000003, 0x59a80038, 0x80717480, + 0x04001006, 0x0c01f001, 0x0010ef44, 0x0010ef46, + 0x0010ef48, 0x0010ef42, 0x4200d000, 0x000000cb, + 0x4000d800, 0x0201f800, 0x0010032a, 0x0401f019, + 0x826cd500, 0x00000008, 0x8c6cdd06, 0x040207ed, + 0x4202d800, 0x00000001, 0x486b5038, 0x486b282c, + 0x486b282d, 0x59a8d073, 0x8468d506, 0x486b5073, + 0x4a035014, 0x00000001, 0x0201f800, 0x001046af, + 0x0401f008, 0x0401ffbb, 0x0401f006, 0x0401fe4c, + 0x0401f004, 0x0401ff11, 0x0401f002, 0x0401ff6c, + 0x1c01f000, 0x497b282d, 0x1c01f000, 0x59a8d017, + 0x82697480, 0x0000ffff, 0x04000004, 0x0201f800, + 0x0010e25a, 0x0401f0b4, 0x59a8da1b, 0x826cd500, + 0x00000028, 0x04000025, 0x8c6cdd00, 0x04000023, + 0x4a038802, 0x0000ffbf, 0x59a8da1b, 0x8c6cdd02, + 0x0400001e, 0x599ce018, 0x8c70e516, 0x04020012, + 0x59a8d01c, 0x82697480, 0x0000ffff, 0x0400000e, + 0x0201f800, 0x00101a08, 0x59a8d21b, 0x8268dd00, + 0x00000004, 0x8c68d504, 0x04020059, 0x406e5800, + 0x4200d000, 0x00000003, 0x0201f800, 0x00101a36, + 0x0401f095, 0x8c70e516, 0x04020005, 0x59a8d01c, + 0x82697480, 0x0000ffff, 0x04000087, 0x59a8d01d, + 0x8068d1c0, 0x0402004a, 0x8c6cdd08, 0x04000049, + 0x599cd019, 0x8c68d510, 0x0400004a, 0x0201f800, + 0x001040de, 0x80c589c0, 0x04020041, 0x599cd019, + 0x8c68d510, 0x04000004, 0x59a8d21b, 0x8c68d508, + 0x0402000a, 0x599cd018, 0x8c68d516, 0x04000059, + 0x599cd017, 0x8c68d50a, 0x0402003d, 0x59a8d006, + 0x8c68d51c, 0x0402003a, 0x4a038802, 0x0000ffff, + 0x4200d000, 0x0010b941, 0x0201f800, 0x00100531, + 0x4200d000, 0x0010b94e, 0x0201f800, 0x00100531, + 0x850e1d02, 0x4a0378e4, 0x00000080, 0x4202d800, + 0x00000003, 0x4a035017, 0x0000ffff, 0x0201f800, + 0x0010042f, 0x4178d000, 0x0201f800, 0x00101364, + 0x59a8d21b, 0x8c68d506, 0x04000042, 0x599cd018, + 0x8268e500, 0x00000800, 0x8c68d516, 0x0402003a, + 0x599cd019, 0x8c68d510, 0x04000004, 0x59a8d21b, + 0x8c68d508, 0x0402003e, 0x4200d000, 0x0000ffff, + 0x4200d800, 0x00000006, 0x4178e000, 0x0201f800, + 0x00103267, 0x0201f800, 0x00104779, 0x80c589c0, + 0x0400001a, 0x0201f800, 0x001064c5, 0x0401f042, + 0x59a8d016, 0x8068d1c0, 0x040007b9, 0x0401f03e, + 0x8c6cdd16, 0x040207b6, 0x0401f03b, 0x4200b000, 0x000007f0, 0x417a8800, 0x0401f004, 0x81468800, - 0x8058b040, 0x040007bb, 0x0201f800, 0x00103e62, + 0x8058b040, 0x040007c1, 0x0201f800, 0x00103e78, 0x80c589c0, 0x040007fa, 0x5934d200, 0x8c68d51a, - 0x040007f7, 0x0401f02c, 0x0201f800, 0x0010470f, - 0x80c589c0, 0x04000016, 0x59c4d006, 0x8468d534, - 0x486b8806, 0x0201f800, 0x00106420, 0x0401f7da, - 0x0201f800, 0x001043fe, 0x80c589c0, 0x040007e1, - 0x0401f01d, 0x0201f800, 0x001032c1, 0x0401f7cc, - 0x0201f800, 0x0010470f, 0x80c589c0, 0x040207b6, - 0x59a8d21b, 0x486b541b, 0x0401f7b3, 0x59c4d006, - 0x8268d500, 0xffffff0f, 0x486b8806, 0x0401f7ea, - 0x4200d000, 0x000007fe, 0x4200d800, 0x00000004, - 0x0401f7b9, 0x8c6cdd04, 0x0402077c, 0x826cd500, - 0x00004000, 0x8c6cdd1c, 0x04020778, 0x406a5800, - 0x0401f76b, 0x1c01f000, 0x59c4d00d, 0x8c68d51e, + 0x040007f7, 0x0401f02c, 0x0201f800, 0x0010474e, + 0x80c589c0, 0x0400001b, 0x59c4d006, 0x8468d534, + 0x486b8806, 0x0201f800, 0x001064c5, 0x0401f7e0, + 0x0201f800, 0x0010441d, 0x80c589c0, 0x040007a5, + 0x0401f01d, 0x0201f800, 0x001032cb, 0x0401f7d2, + 0x0201f800, 0x0010474e, 0x80c589c0, 0x040207bc, + 0x59a8d21b, 0x486b541b, 0x0401f7b9, 0x4200d000, + 0x000007fe, 0x4200d800, 0x00000004, 0x0401f7c4, + 0x59c4d006, 0x8268d500, 0xffffff0f, 0x486b8806, + 0x0401f7e5, 0x8c6cdd04, 0x04020779, 0x826cd500, + 0x00004000, 0x8c6cdd1c, 0x04020775, 0x406a5800, + 0x0401f768, 0x1c01f000, 0x59c4d00d, 0x8c68d51e, 0x04020004, 0x59c4d005, 0x8c68d500, 0x0400000c, - 0x0201f800, 0x00100447, 0x0201f800, 0x0010470f, - 0x80c589c0, 0x0400000f, 0x0201f800, 0x00104670, + 0x0201f800, 0x00100447, 0x0201f800, 0x0010474e, + 0x80c589c0, 0x0400000f, 0x0201f800, 0x001046af, 0x816d7040, 0x040000a3, 0x0401f11b, 0x4a035043, 0x00000001, 0x4202d800, 0x00000004, 0x4200d000, - 0x0010bc87, 0x0201f800, 0x0010ad1c, 0x0401f112, - 0x0201f800, 0x0010473a, 0x80c589c0, 0x0402008b, - 0x0201f800, 0x0010330a, 0x59c4d0a4, 0x8268d500, + 0x0010bd87, 0x0201f800, 0x0010ae0f, 0x0401f112, + 0x0201f800, 0x00104779, 0x80c589c0, 0x0402008b, + 0x0201f800, 0x0010331d, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x82697480, 0x00000006, 0x83f17500, - 0x03000000, 0x040007e9, 0x0201f800, 0x0010593d, + 0x03000000, 0x040007e9, 0x0201f800, 0x001059e2, 0x59c4d0a3, 0x8468d528, 0x486b88a3, 0x59a8d05f, 0x8068d1c0, 0x040000c5, 0x59a8e072, 0x8270d500, 0x00001f00, 0x8068d910, 0x826d7480, 0x00000002, 0x83f17500, 0x03000000, 0x040000a9, 0x59a8d015, - 0x8468d546, 0x486b5015, 0x0201f800, 0x0010471c, + 0x8468d546, 0x486b5015, 0x0201f800, 0x0010475b, 0x80c589c0, 0x040000a9, 0x59c4d006, 0x8268d540, 0x44000001, 0x486b8806, 0x59c4d006, 0x8268d500, 0xffffff0f, 0x486b8806, 0x497b9005, 0x4a038802, 0x0000ffff, 0x4a0378e4, 0x00003000, 0x4200d000, - 0x0010b896, 0x5868d400, 0x8c68d508, 0x04020003, - 0x4a0378e4, 0x000c0000, 0x4200d000, 0x0010bb60, - 0x0201f800, 0x0010ad1c, 0x59a8d00f, 0x4200d800, - 0x00000003, 0x0201f800, 0x00106132, 0x4200d000, - 0x00008010, 0x59a8d809, 0x0201f800, 0x001031e9, + 0x0010b996, 0x5868d400, 0x8c68d508, 0x04020003, + 0x4a0378e4, 0x000c0000, 0x4200d000, 0x0010bc60, + 0x0201f800, 0x0010ae0f, 0x59a8d00f, 0x4200d800, + 0x00000003, 0x0201f800, 0x001061d7, 0x4200d000, + 0x00008010, 0x59a8d809, 0x0201f800, 0x001031f3, 0x59c8d015, 0x8468d548, 0x486b9015, 0x0201f800, - 0x00101616, 0x59a8d008, 0x8468d500, 0x486b5008, - 0x850e1d0a, 0x0201f800, 0x0010eb6f, 0x0201f800, - 0x0010470f, 0x80c589c0, 0x04020003, 0x8d0e1d06, - 0x0402008f, 0x0201f800, 0x001040c4, 0x80c589c0, + 0x00101617, 0x59a8d008, 0x8468d500, 0x486b5008, + 0x850e1d0a, 0x0201f800, 0x0010ec6e, 0x0201f800, + 0x0010474e, 0x80c589c0, 0x04020003, 0x8d0e1d06, + 0x0402008f, 0x0201f800, 0x001040de, 0x80c589c0, 0x04000081, 0x59c4d002, 0x8468d50c, 0x486b8802, 0x497b501d, 0x497b501c, 0x497b5057, 0x0201f800, - 0x0010470f, 0x80c589c0, 0x0400006c, 0x497b521b, - 0x0201f800, 0x001013fe, 0x59a8d01f, 0x82680500, + 0x0010474e, 0x80c589c0, 0x0400006c, 0x497b521b, + 0x0201f800, 0x001013ff, 0x59a8d01f, 0x82680500, 0xffff0000, 0x80c4d540, 0x486b501f, 0x599cd017, 0x8c68d50a, 0x04000004, 0x59a8d21b, 0x8468d544, 0x486b521b, 0x4200d000, 0x00000005, 0x0201f800, - 0x001066cf, 0x497b501d, 0x497b5016, 0x4a035017, + 0x00106774, 0x497b501d, 0x497b5016, 0x4a035017, 0x0000ffff, 0x4a0378e4, 0x080000c0, 0x4202d800, - 0x00000002, 0x0201f800, 0x0010470f, 0x80c589c0, + 0x00000002, 0x0201f800, 0x0010474e, 0x80c589c0, 0x04020007, 0x59a8d21b, 0x8268d500, 0x0000000c, 0x82697480, 0x00000004, 0x0400076c, 0x0201f800, - 0x0010e14a, 0x0401f084, 0x5994d02d, 0x42000000, - 0x001039d5, 0x80697480, 0x04000031, 0x59c4d006, + 0x0010e25a, 0x0401f084, 0x5994d02d, 0x42000000, + 0x001039e8, 0x80697480, 0x04000031, 0x59c4d006, 0x8268d540, 0x000000c0, 0x486b8806, 0x0401f76d, 0x59a8d011, 0x82697480, 0x00000009, 0x0402075b, 0x497b500f, 0x4a038805, 0x000000f0, 0x0201f800, - 0x0010472b, 0x80c589c0, 0x0400004b, 0x59c4d006, + 0x0010476a, 0x80c589c0, 0x0400004b, 0x59c4d006, 0x8268d540, 0x000000f1, 0x486b8806, 0x59c4d006, 0x8268d500, 0xbbffffff, 0x486b8806, 0x0201f800, - 0x0010593d, 0x0201f800, 0x0010613d, 0x59a8d873, + 0x001059e2, 0x0201f800, 0x001061e2, 0x59a8d873, 0x826d7480, 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, 0x82b97580, 0x0c000000, 0x0402004d, - 0x4a038893, 0x00000001, 0x4200d000, 0x0010bb69, - 0x0201f800, 0x0010ad1c, 0x497b5056, 0x4200d000, + 0x4a038893, 0x00000001, 0x4200d000, 0x0010bc69, + 0x0201f800, 0x0010ae0f, 0x497b5056, 0x4200d000, 0x00008030, 0x4178d800, 0x0401f784, 0x5994d02c, 0x8068d1c0, 0x0402073f, 0x0401f7cd, 0x806cd840, 0x8270d500, 0x00ff0000, 0x806c00d0, 0x8068d540, 0x486b9035, 0x0401f752, 0x59c4d006, 0x8268d540, 0x440000f1, 0x0401f75c, 0x59a8d01f, 0x8268d500, - 0xffff0000, 0x486b501f, 0x0201f800, 0x001013fe, - 0x48c78880, 0x0401f796, 0x0201f800, 0x00103911, - 0x0401f035, 0x0201f800, 0x0010470f, 0x80c589c0, + 0xffff0000, 0x486b501f, 0x0201f800, 0x001013ff, + 0x48c78880, 0x0401f796, 0x0201f800, 0x00103924, + 0x0401f035, 0x0201f800, 0x0010474e, 0x80c589c0, 0x04000011, 0x59a8d018, 0x8068d1c0, 0x0402077d, - 0x0201f800, 0x00108bc4, 0x0401f77a, 0x4a035056, - 0x00000001, 0x850e1d0e, 0x0201f800, 0x00103461, + 0x0201f800, 0x00108c7d, 0x0401f77a, 0x4a035056, + 0x00000001, 0x850e1d0e, 0x0201f800, 0x00103474, 0x0401f025, 0x59c4d006, 0x8268d540, 0x440000f1, - 0x0401f7ba, 0x0201f800, 0x00108bc4, 0x59a8d21b, + 0x0401f7ba, 0x0201f800, 0x00108c7d, 0x59a8d21b, 0x8c68d506, 0x0402076b, 0x59a8d018, 0x8068d1c0, 0x04020007, 0x59a8d41b, 0x8c68d508, 0x04000765, 0x82697480, 0x0000ffff, 0x04000762, 0x4a03541b, - 0x0000ffff, 0x0201f800, 0x00103a30, 0x0401f75d, + 0x0000ffff, 0x0201f800, 0x00103a43, 0x0401f75d, 0x59aa6874, 0x5934d400, 0x82697480, 0x00000404, 0x04020007, 0x8c6cdd0c, 0x040006ec, 0x826cd500, 0x00000003, 0x040007ad, 0x0401f003, 0x0201f800, - 0x0010a5e6, 0x1c01f000, 0x829d3c80, 0x00000005, + 0x0010a6d9, 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x42011800, 0x00000001, 0x41791000, 0x40890800, 0x40592000, 0x8268f500, 0x00ffffff, @@ -13652,7 +13711,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c, 0x0000000d, - 0x0000000e, 0x0000000f, 0x431a212a, 0x02800004, + 0x0000000e, 0x0000000f, 0xf500c489, 0x02800004, 0x00000000, 0x0000c000, 0x000007e8, 0x073fca5a, 0x0705a5a5, 0x01928009, 0x070ff0e1, 0x03800006, 0x04958010, 0x05308000, 0x05008000, 0x0600902f, @@ -14159,7 +14218,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x07600c41, 0x050f80ff, 0x01202003, 0x073fa00a, 0x06000001, 0x07f00000, 0x05601041, 0x050f80ff, 0x032fa069, 0x0380005c, 0x565d6811, 0x02800004, - 0x00000000, 0x00008000, 0x000005de, 0x040f801f, + 0x00000000, 0x00008000, 0x000005e5, 0x040f801f, 0x012fa8c9, 0x040f801f, 0x063fa091, 0x06000010, 0x03200005, 0x07420000, 0x050fb000, 0x040f801f, 0x073fa011, 0x06000038, 0x040f801f, 0x053fa859, @@ -14210,11 +14269,11 @@ static const uint32_t isp_2400_risc_code[] = { 0x03e00000, 0x03800014, 0x059080c3, 0x030160e1, 0x028000ce, 0x059080c6, 0x030150e1, 0x028000ce, 0x059080c9, 0x010140e1, 0x028000ce, 0x060fc013, - 0x06a005d6, 0x03800014, 0x014940e4, 0x01a180d2, + 0x07a005dd, 0x03800014, 0x014940e4, 0x01a180d2, 0x0280004a, 0x02681e0d, 0x050fb0ff, 0x04600876, 0x050f80ff, 0x053fa809, 0x06000001, 0x05488003, 0x058180e1, 0x0400800d, 0x0120d000, 0x013e4000, - 0x05000200, 0x06009076, 0x04002075, 0x06a005c2, + 0x05000200, 0x06009076, 0x04002075, 0x07a005c9, 0x07c00000, 0x072e4800, 0x07000012, 0x018680e7, 0x060fc013, 0x07c00000, 0x00012013, 0x0747f000, 0x05600800, 0x050f80ff, 0x012fa839, 0x0249f001, @@ -14252,7 +14311,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x050f80ff, 0x053fa80a, 0x07000009, 0x0180016f, 0x0202a013, 0x02029013, 0x0647f020, 0x06486020, 0x07818174, 0x04a002e0, 0x00800179, 0x007a0120, - 0x04000101, 0x04a002e0, 0x0400802c, 0x07a005bb, + 0x04000101, 0x04a002e0, 0x0400802c, 0x06a005c2, 0x0349a0e4, 0x0581017d, 0x0421d008, 0x0080012a, 0x02948129, 0x0521d005, 0x0080012a, 0x040fe02c, 0x00860129, 0x0742002b, 0x0660002c, 0x050f80ff, @@ -14260,12 +14319,12 @@ static const uint32_t isp_2400_risc_code[] = { 0x01022003, 0x0660002c, 0x050f80ff, 0x053fa80a, 0x07000009, 0x00800191, 0x00022013, 0x00021013, 0x0647f020, 0x007a0120, 0x04000101, 0x04a002e0, - 0x0400802c, 0x07a005bb, 0x02948129, 0x0521d005, + 0x0400802c, 0x06a005c2, 0x02948129, 0x0521d005, 0x0080012a, 0x00800132, 0x0647f020, 0x06486020, 0x078181a0, 0x04a002e0, 0x00800129, 0x007a0120, - 0x04000101, 0x04a002e0, 0x0400802c, 0x07a005bb, + 0x04000101, 0x04a002e0, 0x0400802c, 0x06a005c2, 0x00800129, 0x040fd02c, 0x052e4003, 0x00208010, - 0x07a005bb, 0x00800132, 0x00018098, 0x07480018, + 0x06a005c2, 0x00800132, 0x00018098, 0x07480018, 0x068181bc, 0x05481018, 0x068181ba, 0x05482018, 0x078181b8, 0x07483018, 0x068181b6, 0x002fb004, 0x018001bd, 0x012fb003, 0x018001bd, 0x002fb002, @@ -14285,7 +14344,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x018001e1, 0x0760127b, 0x050f80ff, 0x032fa009, 0x0744f000, 0x0760127b, 0x050f80ff, 0x032fa00a, 0x018001d4, 0x052e400c, 0x040080fb, 0x046aa108, - 0x06009076, 0x04002075, 0x06a005c2, 0x018001e1, + 0x06009076, 0x04002075, 0x07a005c9, 0x018001e1, 0x06219001, 0x05482017, 0x0581020a, 0x058b0200, 0x060ff086, 0x0349f0ff, 0x078181c0, 0x07483017, 0x04810207, 0x050fd0ff, 0x040fe07f, 0x06a68216, @@ -14306,7 +14365,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x032fa009, 0x03681e00, 0x0550041b, 0x050f80ff, 0x032fa009, 0x0107e000, 0x070ff07e, 0x01800235, 0x0307c000, 0x07c00000, 0x052e400c, 0x040080fb, - 0x046aa108, 0x06009076, 0x04002075, 0x028005c2, + 0x046aa108, 0x06009076, 0x04002075, 0x038005c9, 0x040fd076, 0x050fd017, 0x060ff086, 0x077800ff, 0x07000060, 0x037c00ff, 0x07000060, 0x07818253, 0x07780078, 0x07ffff00, 0x045a0419, 0x010780ff, @@ -14315,14 +14374,14 @@ static const uint32_t isp_2400_risc_code[] = { 0x06000001, 0x05488003, 0x0481026d, 0x0400d0fb, 0x066a810d, 0x013e4000, 0x07000300, 0x02800029, 0x040080fb, 0x066a8108, 0x06009076, 0x04002075, - 0x06a005c2, 0x02800029, 0x0240007f, 0x0742007e, + 0x07a005c9, 0x02800029, 0x0240007f, 0x0742007e, 0x050f807e, 0x032fa009, 0x050fe000, 0x0386828d, 0x070ff07d, 0x055c047b, 0x05810282, 0x0760007d, 0x050f80ff, 0x032fa009, 0x050fe000, 0x03868282, 0x070ff07b, 0x0107d0ff, 0x07600a7d, 0x050f80ff, 0x032fa009, 0x03681e00, 0x0450041c, 0x0107e0ff, 0x050f80ff, 0x032fa009, 0x050fe000, 0x0086028f, - 0x0307c000, 0x07c00000, 0x040fd076, 0x028005d6, + 0x0307c000, 0x07c00000, 0x040fd076, 0x038005dd, 0x010180c0, 0x0548e018, 0x078182aa, 0x0748f018, 0x078182a6, 0x03490018, 0x068182a2, 0x01491018, 0x0681829e, 0x073c0000, 0x06000040, 0x02200004, @@ -14334,15 +14393,15 @@ static const uint32_t isp_2400_risc_code[] = { 0x068182bc, 0x0448b075, 0x058102c3, 0x06000013, 0x04001013, 0x0760127b, 0x050f80ff, 0x032fa012, 0x0046b075, 0x03b600e2, 0x008002c4, 0x066c0073, - 0x048102c1, 0x040fd076, 0x06a005d6, 0x03800014, + 0x048102c1, 0x040fd076, 0x07a005dd, 0x03800014, 0x040fd076, 0x008002c4, 0x00452075, 0x00077013, 0x0647f075, 0x06486075, 0x078182ca, 0x04a002e6, 0x008002d0, 0x007a0175, 0x04000101, 0x04a002e6, - 0x04008076, 0x0245f008, 0x07a005bb, 0x07273000, + 0x04008076, 0x0245f008, 0x06a005c2, 0x07273000, 0x05600272, 0x050f80ff, 0x053fa80a, 0x07000009, 0x0379ff78, 0x070000ff, 0x02076013, 0x02075013, 0x0484801f, 0x0280004a, 0x070fc0ff, 0x052e400c, - 0x00208020, 0x07a005bb, 0x008002d9, 0x06000020, + 0x00208020, 0x06a005c2, 0x008002d9, 0x06000020, 0x04001016, 0x0460082c, 0x050f80ff, 0x032fa012, 0x07c00000, 0x06000075, 0x040010a2, 0x044b0801, 0x060ff016, 0x065a0001, 0x04600876, 0x050f80ff, @@ -14355,16 +14414,16 @@ static const uint32_t isp_2400_risc_code[] = { 0x00683e20, 0x070060ff, 0x056c0206, 0x0681036b, 0x056c0406, 0x07810382, 0x076c0606, 0x068103f8, 0x04488020, 0x04818313, 0x056c1606, 0x05810406, - 0x07a005b2, 0x0380032b, 0x040fd02c, 0x0521d000, + 0x06a005b9, 0x0380032b, 0x040fd02c, 0x0521d000, 0x0202c013, 0x02020013, 0x050fe028, 0x0386032b, 0x0302c028, 0x0421d002, 0x07a00339, 0x02800340, 0x040fe02a, 0x02860323, 0x0421d007, 0x0202c02a, 0x07a00339, 0x0280032a, 0x050fe022, 0x0386032b, 0x0421d004, 0x0302c022, 0x07a00339, 0x04488020, - 0x0581832d, 0x07a005b2, 0x0484803e, 0x0280004a, + 0x0581832d, 0x06a005b9, 0x0484803e, 0x0280004a, 0x040fd02c, 0x0521d000, 0x0202c013, 0x02020013, 0x0380032b, 0x040fe02a, 0x0386032b, 0x0421d007, - 0x0202c02a, 0x07a00339, 0x07a005b2, 0x0380032b, + 0x0202c02a, 0x07a00339, 0x06a005b9, 0x0380032b, 0x0460082c, 0x050f80ff, 0x032fa039, 0x03020000, 0x0102d005, 0x01018006, 0x07c00000, 0x0400702c, 0x05a00439, 0x007a0101, 0x07060000, 0x07303000, @@ -14399,7 +14458,7 @@ static const uint32_t isp_2400_risc_code[] = { 0x048183c2, 0x01208018, 0x06780002, 0x07000003, 0x058183c5, 0x06003001, 0x06000013, 0x04001013, 0x04004013, 0x06005013, 0x040f801f, 0x022fa032, - 0x038003f0, 0x040fd02c, 0x06a005d6, 0x03800014, + 0x038003f0, 0x040fd02c, 0x07a005dd, 0x03800014, 0x0379ff03, 0x070000ff, 0x04488002, 0x078103cc, 0x070ff003, 0x04500408, 0x050080ff, 0x0379ff00, 0x070000ff, 0x06489002, 0x068103d3, 0x070ff000, @@ -14473,94 +14532,87 @@ static const uint32_t isp_2400_risc_code[] = { 0x073fa009, 0x06000007, 0x0008400e, 0x048b04e0, 0x03385000, 0x03010000, 0x06219001, 0x040fe07f, 0x018604e7, 0x00800216, 0x07c00000, 0x00683e75, - 0x058104ed, 0x0448d075, 0x06810513, 0x0380054b, - 0x06a005b6, 0x01800484, 0x039784fa, 0x07602418, + 0x058104ed, 0x0448d075, 0x0681051a, 0x02800552, + 0x07a005bd, 0x01800484, 0x039784fa, 0x07602418, 0x050f80ff, 0x012fa809, 0x06780001, 0x070000ff, 0x075a0000, 0x070ff014, 0x0569feff, 0x054b08ff, 0x075a0000, 0x05600418, 0x050f80ff, 0x012fa809, - 0x040fe007, 0x00868501, 0x01204000, 0x0380050f, - 0x00700101, 0x03010000, 0x06780001, 0x07ff0000, - 0x076c00ff, 0x05818509, 0x00700101, 0x03010000, - 0x05600418, 0x050f80ff, 0x012fa80a, 0x06780001, - 0x07ff0000, 0x050040ff, 0x0279ff01, 0x0700ffff, - 0x05002014, 0x07c00000, 0x04007076, 0x0448b075, - 0x0781052d, 0x03200011, 0x06006076, 0x04a0043b, - 0x007a0101, 0x07060000, 0x07303000, 0x07008290, - 0x07600018, 0x050f80ff, 0x053fa809, 0x07000003, - 0x0448e007, 0x04818525, 0x06006013, 0x02800546, - 0x02400010, 0x06810525, 0x06006010, 0x04603476, - 0x050f80ff, 0x073fa00a, 0x07000003, 0x02800546, - 0x0600007a, 0x02493075, 0x05818536, 0x04602c76, - 0x050f80ff, 0x032fa009, 0x060ff07a, 0x05500400, - 0x070000ff, 0x06473075, 0x04602c76, 0x050f80ff, - 0x032fa00a, 0x05a00436, 0x007a0101, 0x03010000, - 0x06303008, 0x05008000, 0x0049b075, 0x06810545, - 0x06603676, 0x050f80ff, 0x073fa009, 0x06000002, - 0x0600600e, 0x050f8074, 0x032fa03a, 0x053079a0, - 0x0700000c, 0x02800592, 0x00683e75, 0x076c0aff, - 0x06810568, 0x04007013, 0x03200011, 0x06006076, - 0x04a0043b, 0x007a0101, 0x03070000, 0x04602a76, - 0x050f80ff, 0x053fa809, 0x06000001, 0x03499003, - 0x0781055f, 0x07303000, 0x07008890, 0x053079a0, - 0x0700000c, 0x03800563, 0x07303000, 0x04008980, - 0x04307920, 0x0700000c, 0x074d0005, 0x06006013, - 0x050f8074, 0x032fa03a, 0x02800592, 0x04602c76, - 0x050f80ff, 0x032fa009, 0x060ff07a, 0x05500400, - 0x070000ff, 0x06473075, 0x04602c76, 0x050f80ff, - 0x032fa00a, 0x04007076, 0x05a00436, 0x007a0101, - 0x03010000, 0x06303008, 0x07008800, 0x074d0005, - 0x0049b075, 0x06810580, 0x06603676, 0x050f80ff, - 0x073fa009, 0x06000002, 0x03800588, 0x06600a76, - 0x050f80ff, 0x073fa009, 0x07000003, 0x07f00000, - 0x054b0406, 0x045a0404, 0x050040ff, 0x0600600e, - 0x050f8074, 0x032fa03a, 0x0648c075, 0x07810590, - 0x06307d20, 0x0700000c, 0x02800592, 0x04307920, - 0x0700000c, 0x0049b075, 0x0781059a, 0x0447b075, - 0x04600876, 0x050f80ff, 0x053fa80a, 0x0700003a, - 0x0246f007, 0x013e4000, 0x07000030, 0x0398059c, - 0x070ff0f6, 0x074850ff, 0x0481859d, 0x050f2074, - 0x060a0007, 0x040070fb, 0x046a7007, 0x050f40ff, - 0x013e4000, 0x06000020, 0x0320000a, 0x022011f4, - 0x00202004, 0x06003013, 0x0678007a, 0x07fff000, - 0x078105af, 0x0020200e, 0x050f8072, 0x032fa022, - 0x01800484, 0x01208060, 0x0600902c, 0x04002020, - 0x028005c2, 0x040080fb, 0x066ae108, 0x06009076, - 0x04002075, 0x028005c2, 0x03201100, 0x058485c0, - 0x06420001, 0x048185bc, 0x028005d9, 0x020e0008, - 0x07c00000, 0x050fd009, 0x040fd008, 0x03201100, - 0x058485c9, 0x06420001, 0x058185c5, 0x028005d9, - 0x007a0102, 0x04000101, 0x05600809, 0x050f80ff, - 0x073fa00a, 0x06000001, 0x020e0008, 0x068405d3, - 0x030e0009, 0x07c00000, 0x01011009, 0x052e4300, - 0x07c00000, 0x052e400f, 0x01208090, 0x038005bb, - 0x070fc0ff, 0x040f8013, 0x032fa009, 0x028005dc, - 0xa8105084, 0xffeecc2a + 0x040fe007, 0x00868501, 0x01204000, 0x02800516, + 0x05600e06, 0x050f80ff, 0x073fa009, 0x06000002, + 0x07f00000, 0x064d0004, 0x00700104, 0x03010000, + 0x06780004, 0x07ff0000, 0x076c00ff, 0x0581850f, + 0x00700104, 0x03010000, 0x064d0004, 0x05600e06, + 0x050f80ff, 0x073fa00a, 0x06000002, 0x07f00000, + 0x044b0804, 0x0279ff01, 0x0700ffff, 0x05002014, + 0x07c00000, 0x04007076, 0x0448b075, 0x06810534, + 0x03200011, 0x06006076, 0x04a0043b, 0x007a0101, + 0x07060000, 0x07303000, 0x07008290, 0x07600018, + 0x050f80ff, 0x053fa809, 0x07000003, 0x0448e007, + 0x0481852c, 0x06006013, 0x0380054d, 0x02400010, + 0x0681052c, 0x06006010, 0x04603476, 0x050f80ff, + 0x073fa00a, 0x07000003, 0x0380054d, 0x0600007a, + 0x02493075, 0x0481853d, 0x04602c76, 0x050f80ff, + 0x032fa009, 0x060ff07a, 0x05500400, 0x070000ff, + 0x06473075, 0x04602c76, 0x050f80ff, 0x032fa00a, + 0x05a00436, 0x007a0101, 0x03010000, 0x06303008, + 0x05008000, 0x0049b075, 0x0681054c, 0x06603676, + 0x050f80ff, 0x073fa009, 0x06000002, 0x0600600e, + 0x050f8074, 0x032fa03a, 0x053079a0, 0x0700000c, + 0x03800599, 0x00683e75, 0x076c0aff, 0x0781056f, + 0x04007013, 0x03200011, 0x06006076, 0x04a0043b, + 0x007a0101, 0x03070000, 0x04602a76, 0x050f80ff, + 0x053fa809, 0x06000001, 0x03499003, 0x07810566, + 0x07303000, 0x07008890, 0x053079a0, 0x0700000c, + 0x0380056a, 0x07303000, 0x04008980, 0x04307920, + 0x0700000c, 0x074d0005, 0x06006013, 0x050f8074, + 0x032fa03a, 0x03800599, 0x04602c76, 0x050f80ff, + 0x032fa009, 0x060ff07a, 0x05500400, 0x070000ff, + 0x06473075, 0x04602c76, 0x050f80ff, 0x032fa00a, + 0x04007076, 0x05a00436, 0x007a0101, 0x03010000, + 0x06303008, 0x07008800, 0x074d0005, 0x0049b075, + 0x07810587, 0x06603676, 0x050f80ff, 0x073fa009, + 0x06000002, 0x0280058f, 0x06600a76, 0x050f80ff, + 0x073fa009, 0x07000003, 0x07f00000, 0x054b0406, + 0x045a0404, 0x050040ff, 0x0600600e, 0x050f8074, + 0x032fa03a, 0x0648c075, 0x06810597, 0x06307d20, + 0x0700000c, 0x03800599, 0x04307920, 0x0700000c, + 0x0049b075, 0x068105a1, 0x0447b075, 0x04600876, + 0x050f80ff, 0x053fa80a, 0x0700003a, 0x0246f007, + 0x013e4000, 0x07000030, 0x039805a3, 0x070ff0f6, + 0x074850ff, 0x048185a4, 0x050f2074, 0x060a0007, + 0x040070fb, 0x046a7007, 0x050f40ff, 0x013e4000, + 0x06000020, 0x0320000a, 0x022011f4, 0x00202004, + 0x06003013, 0x0678007a, 0x07fff000, 0x068105b6, + 0x0020200e, 0x050f8072, 0x032fa022, 0x01800484, + 0x01208060, 0x0600902c, 0x04002020, 0x038005c9, + 0x040080fb, 0x066ae108, 0x06009076, 0x04002075, + 0x038005c9, 0x03201100, 0x048485c7, 0x06420001, + 0x058185c3, 0x028005e0, 0x020e0008, 0x07c00000, + 0x050fd009, 0x040fd008, 0x03201100, 0x048485d0, + 0x06420001, 0x058185cc, 0x028005e0, 0x007a0102, + 0x04000101, 0x05600809, 0x050f80ff, 0x073fa00a, + 0x06000001, 0x020e0008, 0x068405da, 0x030e0009, + 0x07c00000, 0x01011009, 0x052e4300, 0x07c00000, + 0x052e400f, 0x01208090, 0x028005c2, 0x070fc0ff, + 0x040f8013, 0x032fa009, 0x028005e3, 0x780356f6, + 0xffeecc1b }; #endif #ifdef ISP_2400_MULTI -/************************************************************************ - * * - * --- ISP2400 (MID) Initiator/Target Firmware with support * - * Multi ID and FcTape. * - * * - ************************************************************************/ -/* - * Firmware Version 5.04.00 (12:20 Jul 02, 2010) - */ static const uint32_t isp_2400_multi_risc_code[] = { - 0x0401f195, 0x00112000, 0x00100000, 0x0000beb3, - 0x00000005, 0x00000004, 0x00000000, 0x00000496, + 0x0401f195, 0x00112000, 0x00100000, 0x0000c1f9, + 0x00000005, 0x00000005, 0x00000000, 0x00009496, 0x00000003, 0x00000000, 0x20434f50, 0x59524947, 0x48542032, 0x30303720, 0x514c4f47, 0x49432043, 0x4f52504f, 0x52415449, 0x4f4e2020, 0x20495350, 0x32347878, 0x20466972, 0x6d776172, 0x65202020, - 0x56657273, 0x696f6e20, 0x2020352e, 0x30342e30, + 0x56657273, 0x696f6e20, 0x2020352e, 0x30352e30, 0x30202024, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x42001800, 0x0010014c, 0x42002000, 0x0010da51, + 0x42001800, 0x0010014c, 0x42002000, 0x0010dd51, 0x500c0800, 0x800c1800, 0x500c1000, 0x800c1800, 0x54042000, 0x80102000, 0x80040800, 0x80081040, 0x040207fc, 0x500c0800, 0x800409c0, 0x040207f6, @@ -14643,11 +14695,11 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00006150, 0x00000010, 0x00006170, 0x00000010, 0x00006190, 0x00000010, 0x000061b0, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00100000, 0x00100000, 0x0000beb3, + 0x00000000, 0x00100000, 0x00100000, 0x0000c1f9, 0xffffffff, 0x00112004, 0x00020000, 0x00000cef, - 0xffffffff, 0x00112cf3, 0x0010f300, 0x00001a73, - 0xffffffff, 0x00114766, 0x0000c000, 0x000008a0, - 0x00ffffff, 0x00115006, 0x00008000, 0x00000685, + 0xffffffff, 0x00112cf3, 0x0010f600, 0x00001a9a, + 0xffffffff, 0x0011478d, 0x0000c000, 0x000008a0, + 0x00ffffff, 0x0011502d, 0x00008000, 0x0000068c, 0x00ffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4203f000, 0x00021fff, 0x40000000, 0x4203e000, 0x90000100, 0x40000000, 0x42000800, @@ -14655,11 +14707,11 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00007023, 0x50000000, 0x8c000500, 0x04020003, 0x42000800, 0x00020000, 0x45780800, 0x80040800, 0x82040580, 0x00022000, 0x040207fc, 0x4178a000, - 0x4200a800, 0x0010beb3, 0x42000800, 0x0010f300, - 0x40540000, 0x8004b480, 0x0201f800, 0x0010bd64, + 0x4200a800, 0x0010c1f9, 0x42000800, 0x0010f600, + 0x40540000, 0x8004b480, 0x0201f800, 0x0010c08f, 0x0401faca, 0x0401fa01, 0x4803c856, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24320002, - 0x0402000d, 0x0201f800, 0x0010bdab, 0x04000008, + 0x0402000d, 0x0201f800, 0x0010c0d6, 0x04000008, 0x42000800, 0x00007a17, 0x50040000, 0x8c00050e, 0x04020003, 0x8400054e, 0x44000800, 0x4a030000, 0x00000000, 0x4a03c020, 0x00000004, 0x4203e000, @@ -14673,7 +14725,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4817c857, 0x4853c857, 0x8050a1c0, 0x0400000f, 0x4c140000, 0x5814a801, 0x4857c857, 0x40500000, 0x80540480, 0x04000005, 0x5814b002, 0x485bc857, - 0x0201f800, 0x0010bd5b, 0x5c002800, 0x82142c00, + 0x0201f800, 0x0010c086, 0x5c002800, 0x82142c00, 0x00000004, 0x0401f7ee, 0x42002800, 0x0010017d, 0x58140801, 0x4817c857, 0x4807c857, 0x800409c0, 0x04000018, 0x58142002, 0x4813c857, 0x58141003, @@ -14682,9 +14734,9 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4a03c020, 0x00004010, 0x4a03c011, 0x40100011, 0x04006000, 0x4203e000, 0x40000000, 0x4a03c017, 0x00000000, 0x4203e000, 0x30000001, 0x0401f000, - 0x4803c856, 0x0201f800, 0x0010f304, 0x0401faf7, - 0x4a03c014, 0x001c001c, 0x42002000, 0x00110d73, - 0x0201f800, 0x0010bd6c, 0x42000000, 0x00001000, + 0x4803c856, 0x0201f800, 0x0010f604, 0x0401faf7, + 0x4a03c014, 0x001c001c, 0x42002000, 0x0011109a, + 0x0201f800, 0x0010c097, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24220001, 0x04000907, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24320001, 0x04000901, 0x59c40000, 0x82000500, @@ -14693,29 +14745,29 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0401f00a, 0x59e00003, 0x82000500, 0x00030000, 0x82000580, 0x00010000, 0x04020004, 0x59a80070, 0x84000542, 0x48035070, 0x4c140000, 0x0201f800, - 0x0010b518, 0x5c002800, 0x42000800, 0x00001100, + 0x0010b843, 0x5c002800, 0x42000800, 0x00001100, 0x42001800, 0x00000100, 0x82141480, 0x0017ffff, 0x0402100d, 0x42000800, 0x00000900, 0x82141480, 0x0013ffff, 0x04021008, 0x42000800, 0x00000480, 0x42001800, 0x00000080, 0x82141480, 0x0011ffff, 0x040018d6, 0x4807500d, 0x480f5251, 0x42001000, - 0x0000002c, 0x0201f800, 0x00106a79, 0x82040c00, - 0x00111264, 0x4807500b, 0x4a03c810, 0x00100000, - 0x4a03c811, 0x0010beb3, 0x4a03c812, 0x0010f300, - 0x4a03c813, 0x00110d72, 0x4a03c829, 0x00000004, + 0x0000002c, 0x0201f800, 0x00106c7e, 0x82040c00, + 0x00111584, 0x4807500b, 0x4a03c810, 0x00100000, + 0x4a03c811, 0x0010c1f9, 0x4a03c812, 0x0010f600, + 0x4a03c813, 0x00111099, 0x4a03c829, 0x00000004, 0x59e40001, 0x82000540, 0x0003403f, 0x4803c801, 0x42001000, 0x0000001c, 0x0401f9f1, 0x4202c000, - 0x00111264, 0x59aab00b, 0x59aaa00b, 0x59aaa80b, + 0x00111584, 0x59aab00b, 0x59aaa00b, 0x59aaa80b, 0x59aac80d, 0x49675050, 0x59a8000b, 0x4803500c, - 0x0401fac7, 0x0201f800, 0x00107cad, 0x0401fad7, - 0x0401fb27, 0x0201f800, 0x00101a3f, 0x0201f800, - 0x001012e0, 0x0401fbee, 0x0201f800, 0x00100d45, - 0x0201f800, 0x00106ab9, 0x0401f85c, 0x0201f800, - 0x00102157, 0x0201f800, 0x0010545c, 0x0201f800, - 0x00104c97, 0x0201f800, 0x00106557, 0x0201f800, - 0x00106255, 0x0201f800, 0x00101385, 0x0201f800, - 0x001011e8, 0x4203e000, 0xf0000001, 0x0201f800, - 0x0010be47, 0x4a03c018, 0x00000000, 0x4203e000, + 0x0401fac7, 0x0201f800, 0x00107ea3, 0x0401fad7, + 0x0401fb27, 0x0201f800, 0x00101a44, 0x0201f800, + 0x001012e1, 0x0401fbee, 0x0201f800, 0x00100d46, + 0x0201f800, 0x00106cbe, 0x0401f85c, 0x0201f800, + 0x00102216, 0x0201f800, 0x0010558d, 0x0201f800, + 0x00104dbc, 0x0201f800, 0x0010675c, 0x0201f800, + 0x0010645a, 0x0201f800, 0x00101386, 0x0201f800, + 0x001011e9, 0x4203e000, 0xf0000001, 0x0201f800, + 0x0010c18d, 0x4a03c018, 0x00000000, 0x4203e000, 0x20000511, 0x4203e000, 0x50010000, 0x4a03c020, 0x00000000, 0x04027010, 0x59e00020, 0x82000580, 0x00000002, 0x0402000c, 0x4a03c020, 0x00004000, @@ -14726,25 +14778,25 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00020004, 0x4df00000, 0x4203e000, 0x50000000, 0x416c0000, 0x82000c80, 0x00000008, 0x0402186b, 0x0c01f804, 0x5c03e000, 0x0201f000, 0x00020008, - 0x001002d1, 0x00110b6f, 0x00110aa1, 0x001002d0, - 0x00110a6d, 0x001002d0, 0x001002d0, 0x001002e3, - 0x0401f85e, 0x42000800, 0x0010c7ff, 0x5804001e, + 0x001002d1, 0x00110e96, 0x00110da1, 0x001002d0, + 0x00110d6d, 0x001002d0, 0x001002d0, 0x001002e3, + 0x0401f85e, 0x42000800, 0x0010caff, 0x5804001e, 0x8c000500, 0x0400000d, 0x84000500, 0x4800081e, 0x4202d800, 0x00000004, 0x0401f97b, 0x49f3c857, 0x5c000800, 0x5c000000, 0x82000540, 0x00003e00, 0x4c000000, 0x4c040000, 0x1c01f000, 0x4a038805, 0x000000f0, 0x1c01f000, 0x4a035048, 0x00000005, - 0x4a035049, 0x00000004, 0x4a03504a, 0x00000000, - 0x4a03504b, 0x00000496, 0x0201f800, 0x00105426, + 0x4a035049, 0x00000005, 0x4a03504a, 0x00000000, + 0x4a03504b, 0x00009496, 0x0201f800, 0x00105557, 0x4a03541b, 0x0000ffff, 0x4a03500f, 0x00ffffff, - 0x0201f800, 0x001099aa, 0x4a03501f, 0x20200000, + 0x0201f800, 0x00109be2, 0x4a03501f, 0x20200000, 0x4a035020, 0x88000200, 0x4a035021, 0x00ff001f, 0x4a035022, 0x000007d0, 0x4a035023, 0x80000000, 0x4a035024, 0x00000200, 0x4a035025, 0x00ff0000, 0x4a035026, 0x00010000, 0x4a03502d, 0x514c4f47, 0x4a03502e, 0x49432020, 0x1c01f000, 0x4d440000, 0x417a8800, 0x4c5c0000, 0x4178b800, 0x0201f800, - 0x0002034c, 0x04020005, 0x0201f800, 0x0010491a, + 0x0002034c, 0x04020005, 0x0201f800, 0x00104a1c, 0x04020002, 0x805cb800, 0x81468800, 0x83440580, 0x000007f0, 0x040207f6, 0x405c0800, 0x5c00b800, 0x5c028800, 0x1c01f000, 0x4803c857, 0x5c000000, @@ -14756,15 +14808,15 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4c000000, 0x4c040000, 0x59bc00ea, 0x4803c857, 0x82000500, 0x00000007, 0x82000580, 0x00000001, 0x04020005, 0x42000800, 0x00000000, 0x0201f800, - 0x00106c55, 0x59b800ea, 0x4803c857, 0x4a0370e8, + 0x00106e5a, 0x59b800ea, 0x4803c857, 0x4a0370e8, 0x00000004, 0x5c000800, 0x4807c025, 0x80040920, 0x4807c026, 0x5c000000, 0x4803c023, 0x80000120, 0x4803c024, 0x5c000000, 0x4803c857, 0x4803c021, 0x80000120, 0x4803c022, 0x41f80000, 0x4803c029, 0x80000120, 0x4803c02a, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24320001, 0x4803c857, - 0x0400104b, 0x0201f800, 0x0010bdab, 0x04000046, - 0x42000800, 0x0010e2b0, 0x46000800, 0xfaceface, + 0x0400104b, 0x0201f800, 0x0010c0d6, 0x04000046, + 0x42000800, 0x0010e5b0, 0x46000800, 0xfaceface, 0x80040800, 0x4c080000, 0x4c0c0000, 0x42001000, 0x00007a00, 0x58080013, 0x44000800, 0x80040800, 0x58080019, 0x44000800, 0x80040800, 0x5808001a, @@ -14788,29 +14840,29 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0401f847, 0x0401f7ff, 0x42000000, 0x00000004, 0x0401f80c, 0x4a03c855, 0x0001eb5a, 0x59e40001, 0x82000540, 0x00000700, 0x4803c801, 0x42000000, - 0x0010ccb9, 0x49780003, 0x49780004, 0x1c01f000, - 0x42000800, 0x0010ccbb, 0x44000800, 0x59e40801, + 0x0010cfb9, 0x49780003, 0x49780004, 0x1c01f000, + 0x42000800, 0x0010cfbb, 0x44000800, 0x59e40801, 0x82041500, 0xfff3c0ff, 0x480bc801, 0x8c040d24, 0x0400000c, 0x4c000000, 0x59e41052, 0x59e40054, - 0x800000d4, 0x82000400, 0x0010e2cc, 0x80081480, + 0x800000d4, 0x82000400, 0x0010e5cc, 0x80081480, 0x480bc853, 0x4a03c800, 0x00000040, 0x5c000000, - 0x4a03c850, 0x0010e2cc, 0x800000d4, 0x82002400, - 0x0010e2cb, 0x4813c851, 0x4a03c853, 0x00000400, - 0x42000000, 0x0010e2cc, 0x82001400, 0x00001000, + 0x4a03c850, 0x0010e5cc, 0x800000d4, 0x82002400, + 0x0010e5cb, 0x4813c851, 0x4a03c853, 0x00000400, + 0x42000000, 0x0010e5cc, 0x82001400, 0x00001000, 0x45780000, 0x80000000, 0x80081d80, 0x040207fd, - 0x4807c801, 0x1c01f000, 0x42002000, 0x0010ccb9, + 0x4807c801, 0x1c01f000, 0x42002000, 0x0010cfb9, 0x59e41801, 0x58100c01, 0x82040500, 0x00003800, 0x820c1d00, 0xffffc7ff, 0x800c1d40, 0x480fc801, 0x1c01f000, 0x5c036000, 0x4db00000, 0x49b3c857, 0x4803c857, 0x1c01f000, 0x1c01f000, 0x59a80059, 0x8c000530, 0x040207fe, 0x4c080000, 0x42001000, 0x00000004, 0x0401f862, 0x5c001000, 0x4201d000, - 0x00028b0a, 0x0201f800, 0x0010645c, 0x4c080000, + 0x00028b0a, 0x0201f800, 0x00106661, 0x4c080000, 0x42001000, 0x00000008, 0x0401f859, 0x5c001000, - 0x4201d000, 0x00028b0a, 0x0201f800, 0x0010645c, + 0x4201d000, 0x00028b0a, 0x0201f800, 0x00106661, 0x4c080000, 0x42001000, 0x00000010, 0x0401f850, 0x5c001000, 0x4201d000, 0x00028b0a, 0x0201f800, - 0x0010645c, 0x0401f7e2, 0x8c00050c, 0x59a80859, + 0x00106661, 0x0401f7e2, 0x8c00050c, 0x59a80859, 0x04020003, 0x84040d30, 0x0401f006, 0x84040d70, 0x48075059, 0x42001000, 0x00000000, 0x0401f040, 0x48075059, 0x836c0500, 0x00000007, 0x0c01f001, @@ -14848,8 +14900,8 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x41792000, 0x41792800, 0x41793000, 0x41793800, 0x41794000, 0x41794800, 0x41795000, 0x41795800, 0x41796000, 0x41796800, 0x41797000, 0x41797800, - 0x41798000, 0x41798800, 0x42019000, 0x0010c88f, - 0x42019800, 0x0010c865, 0x4179a000, 0x4179a800, + 0x41798000, 0x41798800, 0x42019000, 0x0010cb8f, + 0x42019800, 0x0010cb65, 0x4179a000, 0x4179a800, 0x4179b000, 0x4179b800, 0x4179c800, 0x4179c000, 0x4179d000, 0x4179d800, 0x4179e000, 0x4179e800, 0x4179f000, 0x4179f800, 0x417a0000, 0x417a0800, @@ -14859,16 +14911,16 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x417a6800, 0x417a7000, 0x417a7800, 0x417a8000, 0x417a8800, 0x417a9000, 0x417a9800, 0x417ae800, 0x417af800, 0x42030000, 0x00007c00, 0x42031000, - 0x0010cb60, 0x42031800, 0x0000bf1d, 0x42032000, - 0x0000bf32, 0x42032800, 0x0010cb28, 0x42033000, - 0x00020cf9, 0x42034000, 0x0010c7ff, 0x42033800, - 0x0010c81e, 0x42034800, 0x0010c89e, 0x42035000, - 0x0010c780, 0x42035800, 0x0010bf80, 0x42030800, - 0x0010c860, 0x417b6000, 0x42036800, 0x00006f00, + 0x0010ce60, 0x42031800, 0x0000bf1d, 0x42032000, + 0x0000bf32, 0x42032800, 0x0010ce28, 0x42033000, + 0x00020cf9, 0x42034000, 0x0010caff, 0x42033800, + 0x0010cb1e, 0x42034800, 0x0010cb9e, 0x42035000, + 0x0010ca80, 0x42035800, 0x0010c280, 0x42030800, + 0x0010cb60, 0x417b6000, 0x42036800, 0x00006f00, 0x4203c800, 0x00003000, 0x42037000, 0x0000ff00, 0x42037800, 0x0000bf00, 0x42038000, 0x00007700, 0x42038800, 0x00004000, 0x42039000, 0x00006000, - 0x42039800, 0x0010dfe8, 0x4203a000, 0x00007600, + 0x42039800, 0x0010e2e8, 0x4203a000, 0x00007600, 0x4203a800, 0x00007400, 0x4203b000, 0x00007200, 0x4203b800, 0x00007100, 0x4203c000, 0x00007000, 0x4203d000, 0x00000000, 0x4203e800, 0x000201b5, @@ -14886,8 +14938,8 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x48001805, 0x0401fdce, 0x800409c0, 0x04020002, 0x80040800, 0x48041806, 0x1c01f000, 0x4200b000, 0x00000080, 0x59a80078, 0x8c00053e, 0x04000003, - 0x4200b000, 0x00000040, 0x42024800, 0x0010ccd1, - 0x42000000, 0x0010d251, 0x48024809, 0x82000400, + 0x4200b000, 0x00000040, 0x42024800, 0x0010cfd1, + 0x42000000, 0x0010d551, 0x48024809, 0x82000400, 0x00000010, 0x83264c00, 0x0000000b, 0x8058b040, 0x040207fa, 0x1c01f000, 0x59a8080c, 0x4006d000, 0x4202b800, 0x00000001, 0x59a8180a, 0x480fc857, @@ -14898,13 +14950,13 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x412d8800, 0x1c01f000, 0x835c0480, 0x00000020, 0x0400100a, 0x496bc857, 0x815eb840, 0x416a5800, 0x592ed000, 0x497a5800, 0x497a5801, 0x497a5805, - 0x812e59c0, 0x1c01f000, 0x42000000, 0x0010cc15, - 0x0201f800, 0x0010bc88, 0x417a5800, 0x0401f7f9, + 0x812e59c0, 0x1c01f000, 0x42000000, 0x0010cf15, + 0x0201f800, 0x0010bfb3, 0x417a5800, 0x0401f7f9, 0x0401f803, 0x412d8800, 0x1c01f000, 0x815eb840, 0x04001009, 0x416a5800, 0x492fc857, 0x592ed000, 0x497a5800, 0x497a5801, 0x497a5805, 0x812e59c0, - 0x1c01f000, 0x42000000, 0x0010cc15, 0x0201f800, - 0x0010bc88, 0x417ab800, 0x417a5800, 0x0401f7f8, + 0x1c01f000, 0x42000000, 0x0010cf15, 0x0201f800, + 0x0010bfb3, 0x417ab800, 0x417a5800, 0x0401f7f8, 0x492fc857, 0x496a5800, 0x412ed000, 0x815eb800, 0x59c80000, 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, 0x492fc857, 0x812e59c0, 0x04000007, @@ -14922,26 +14974,26 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00000020, 0x497bb807, 0x8058b040, 0x040207fe, 0x4a03b805, 0x30000000, 0x59dc0006, 0x4a03b805, 0x60000001, 0x4803c856, 0x0401ff98, 0x04000d57, - 0x42001000, 0x0010cb5b, 0x452c1000, 0x4a025801, + 0x42001000, 0x0010ce5b, 0x452c1000, 0x4a025801, 0x00000001, 0x4a025802, 0x00000100, 0x4a025808, - 0x00107370, 0x497a5809, 0x497a580a, 0x497a580b, - 0x0401ff8a, 0x04000d49, 0x42001000, 0x0010cb5c, + 0x00107573, 0x497a5809, 0x497a580a, 0x497a580b, + 0x0401ff8a, 0x04000d49, 0x42001000, 0x0010ce5c, 0x452c1000, 0x4a025801, 0x00000000, 0x4a025802, - 0x00000100, 0x4a025808, 0x0010102a, 0x497a5803, + 0x00000100, 0x4a025808, 0x0010102b, 0x497a5803, 0x497a5806, 0x497a5807, 0x497a5809, 0x59a80070, 0x8c000500, 0x04000006, 0x4a03b805, 0xe0000001, 0x59dc0006, 0x8c000522, 0x040007fc, 0x1c01f000, 0x40681000, 0x0201f800, 0x00020016, 0x1c01f000, - 0x42001000, 0x00020026, 0x0201f800, 0x00106304, - 0x0201f800, 0x00109a94, 0x0201f800, 0x0010b1a3, + 0x42001000, 0x00020026, 0x0201f800, 0x00106509, + 0x0201f800, 0x00109ccc, 0x0201f800, 0x0010b4ba, 0x04000014, 0x4a03b805, 0x30000002, 0x59dc0006, 0x4807b800, 0x480bb801, 0x42007000, 0x00020cf0, 0x4a007002, 0x00000040, 0x480c7008, 0x58380007, 0x82000400, 0x00000005, 0x48007003, 0x4a007000, 0x00000003, 0x4803b803, 0x0201f000, 0x00020050, - 0x42000000, 0x0010cb7d, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x00109aac, 0x42000800, 0x00000001, - 0x42001000, 0x00020026, 0x0201f800, 0x001062dd, + 0x42000000, 0x0010ce7d, 0x0201f800, 0x0010bfb3, + 0x0201f800, 0x00109ce4, 0x42000800, 0x00000001, + 0x42001000, 0x00020026, 0x0201f800, 0x001064e2, 0x42007000, 0x00020cf0, 0x0201f000, 0x00020030, 0x58380802, 0x42001000, 0x0000ff00, 0x82040480, 0x0000ff00, 0x04021003, 0x40041000, 0x80000580, @@ -14961,7 +15013,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04000003, 0x48107005, 0x0401f008, 0x49787005, 0x49787004, 0x0401f005, 0x48101800, 0x801021c0, 0x04020002, 0x480c7004, 0x1c01f000, 0x4803c856, - 0x4dc00000, 0x42007000, 0x0010cb5e, 0x4a007400, + 0x4dc00000, 0x42007000, 0x0010ce5e, 0x4a007400, 0x00000000, 0x49787001, 0x42038000, 0x00007720, 0x4a038006, 0x60000001, 0x4a038009, 0xf4f60000, 0x42038000, 0x00007700, 0x4a038006, 0x60000001, @@ -14977,7 +15029,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4a038807, 0x00000004, 0x4a0370e5, 0x00080000, 0x59b800ea, 0x8c000510, 0x04000004, 0x59b800e0, 0x0401f87b, 0x0401f7fb, 0x42038000, 0x00007720, - 0x0201f800, 0x00100ca7, 0x59c00007, 0x4a038006, + 0x0201f800, 0x00100ca8, 0x59c00007, 0x4a038006, 0x20000000, 0x59c00007, 0x4a038006, 0x8000000a, 0x59c00007, 0x4a038006, 0x8000000b, 0x59c00007, 0x4a038006, 0x40000001, 0x83c00580, 0x00007700, @@ -14988,16 +15040,16 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x83c00580, 0x00007700, 0x04000004, 0x42038000, 0x00007700, 0x0401f7f1, 0x4178a000, 0x805cb9c0, 0x0402001d, 0x4200b000, 0x00000020, 0x83b8ac00, - 0x00000020, 0x0201f800, 0x0010bd64, 0x4a0370fb, - 0x00000001, 0x4a037020, 0x00100f0a, 0x59a8002c, + 0x00000020, 0x0201f800, 0x0010c08f, 0x4a0370fb, + 0x00000001, 0x4a037020, 0x00100f0b, 0x59a8002c, 0x82000500, 0x0000ffff, 0x48037021, 0x4a037035, - 0x0010df2e, 0x4a037030, 0x0010c78f, 0x4a037031, - 0x0010bf80, 0x4a037032, 0x0010c870, 0x4a037036, - 0x0010c87b, 0x59840002, 0x48037034, 0x4a037038, - 0x00100f01, 0x4a0370fb, 0x00000001, 0x4200b000, + 0x0010e22e, 0x4a037030, 0x0010ca8f, 0x4a037031, + 0x0010c280, 0x4a037032, 0x0010cb70, 0x4a037036, + 0x0010cb7b, 0x59840002, 0x48037034, 0x4a037038, + 0x00100f02, 0x4a0370fb, 0x00000001, 0x4200b000, 0x00000020, 0x83b8ac00, 0x00000000, 0x0201f800, - 0x0010bd64, 0x4200b000, 0x00000040, 0x83b8ac00, - 0x00000040, 0x0201f800, 0x0010bd64, 0x805cb9c0, + 0x0010c08f, 0x4200b000, 0x00000040, 0x83b8ac00, + 0x00000040, 0x0201f800, 0x0010c08f, 0x805cb9c0, 0x04020006, 0x4a0370e4, 0xaaaaaaaa, 0x4a0370e5, 0xaaaaaaaa, 0x0401f005, 0x4a0370e4, 0xa2aa2a82, 0x4a0370e5, 0xaaaaa2aa, 0x4a0370e6, 0xaaaaaaaa, @@ -15009,7 +15061,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x5c00a000, 0x5c038000, 0x1c01f000, 0x4d300000, 0x4d380000, 0x40026000, 0x82000500, 0x7f000000, 0x82000580, 0x60000000, 0x04020012, 0x83326500, - 0x00ffffff, 0x0201f800, 0x0010a09b, 0x0402000d, + 0x00ffffff, 0x0201f800, 0x0010a2d8, 0x0402000d, 0x59300203, 0x82000580, 0x00000004, 0x04020009, 0x59300c07, 0x82040580, 0x00000009, 0x04020005, 0x42027000, 0x00000047, 0x0201f800, 0x00020bc1, @@ -15018,1465 +15070,1480 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4d380000, 0x4d3c0000, 0x4d440000, 0x4d4c0000, 0x4d480000, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4d040000, 0x4cc80000, 0x4ccc0000, 0x4cf40000, - 0x4cf80000, 0x4cfc0000, 0x0201f800, 0x00020095, - 0x5c01f800, 0x5c01f000, 0x5c01e800, 0x5c019800, - 0x5c019000, 0x5c020800, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x5c029000, 0x5c029800, 0x5c028800, - 0x5c027800, 0x5c027000, 0x5c01f800, 0x5c028000, - 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, - 0x493bc857, 0x0201f000, 0x000200c2, 0x83300500, - 0x000000ff, 0x82000c80, 0x00000007, 0x02021800, - 0x0010032e, 0x0c01f025, 0x1c01f000, 0x82000d00, - 0xc0000038, 0x02020800, 0x00100323, 0x0201f800, - 0x0010032e, 0x00000000, 0x00000048, 0x00000054, - 0x00000053, 0x0010079c, 0x001007c0, 0x001007bb, - 0x001007df, 0x001007a7, 0x001007b3, 0x0010079c, - 0x001007da, 0x0010083e, 0x0010079c, 0x00100841, - 0x0010079c, 0x0010079c, 0x00100845, 0x0010084b, - 0x00100869, 0x0010087e, 0x001007e0, 0x00100887, - 0x00100893, 0x0010079c, 0x0010079c, 0x0010079c, - 0x0201f800, 0x0010032e, 0x001007a5, 0x0010092a, - 0x00100804, 0x0010082d, 0x001007a5, 0x001007a5, - 0x001007a5, 0x0201f800, 0x0010032e, 0x4803c856, - 0x59300004, 0x8c00053e, 0x04020005, 0x42027000, - 0x00000055, 0x0201f000, 0x00020bc1, 0x0201f800, - 0x00107021, 0x040007fa, 0x1c01f000, 0x4803c856, - 0x0401f8e1, 0x40002800, 0x41782000, 0x42027000, - 0x00000056, 0x0201f000, 0x00020bc1, 0x4803c856, - 0x42027000, 0x00000057, 0x0201f000, 0x00020bc1, - 0x4803c856, 0x59325809, 0x812e59c0, 0x04000016, - 0x59300008, 0x8c00051a, 0x0402000d, 0x592c0409, - 0x8c00051c, 0x04020003, 0x4a026012, 0xffffffff, - 0x59300004, 0x8c00053e, 0x04020008, 0x42027000, - 0x00000048, 0x0201f000, 0x00020bc1, 0x4a025a07, - 0x00000007, 0x0401f7f5, 0x0201f800, 0x00107021, - 0x040007f7, 0x1c01f000, 0x4803c856, 0x83300500, - 0x00ffffff, 0x0201f000, 0x001068a1, 0x1c01f000, - 0x4803c856, 0x813261c0, 0x02000800, 0x0010032e, - 0x0201f800, 0x00109667, 0x0400000d, 0x59325809, - 0x592c0209, 0x84000552, 0x48025a09, 0x0201f800, - 0x001010ed, 0x59300004, 0x8c00053e, 0x04020005, - 0x417a7800, 0x0201f800, 0x001091f1, 0x1c01f000, - 0x0201f800, 0x00107021, 0x040007fa, 0x1c01f000, - 0x4c040000, 0x59b808ea, 0x82040d00, 0x00000007, - 0x82040580, 0x00000003, 0x04000004, 0x42000000, - 0x60000000, 0x0401f8c8, 0x5c000800, 0x1c01f000, - 0x0401f916, 0x0400001b, 0x59325809, 0x812e59c0, - 0x04000018, 0x592c0205, 0x82000500, 0x000000ff, - 0x82000d80, 0x00000029, 0x04020012, 0x59300203, - 0x82000580, 0x00000003, 0x0400000b, 0x59300808, - 0x84040d26, 0x48066008, 0x0201f800, 0x0002011a, - 0x4a03900d, 0x00000040, 0x4a0370e5, 0x00000008, - 0x1c01f000, 0x0201f800, 0x00107021, 0x040007f4, - 0x42000000, 0x0010cc1b, 0x0201f800, 0x0010bc88, - 0x5988014a, 0x80000000, 0x4803114a, 0x4a03900d, - 0x00000040, 0x42000000, 0xc0000000, 0x0201f000, - 0x0002010e, 0x4c5c0000, 0x4c600000, 0x4c640000, - 0x4200c800, 0x0010df35, 0x4200b800, 0x00003000, - 0x4200c000, 0x00000105, 0x0201f800, 0x001060de, - 0x4a0370e4, 0x02000000, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x4933c857, 0x0201f000, - 0x00020b9d, 0x4933c857, 0x0201f800, 0x00100caf, - 0x1c01f000, 0x41300800, 0x800409c0, 0x02020800, - 0x0010032e, 0x0201f800, 0x00100323, 0x42000000, - 0x0010cc1b, 0x0201f800, 0x0010bc88, 0x4933c857, - 0x813261c0, 0x02000800, 0x0010032e, 0x0401f842, - 0x40002800, 0x0201f800, 0x0010bbf1, 0x4c140000, - 0x59a8006d, 0x80000540, 0x04000005, 0x8c142d2a, - 0x04000003, 0x0201f800, 0x00100caf, 0x5c002800, - 0x0401f8ae, 0x04000007, 0x5932680a, 0x59340200, - 0x8c00050e, 0x59300415, 0x02020800, 0x00109960, - 0x1c01f000, 0x42000000, 0x0010cc1b, 0x0201f800, - 0x0010bc88, 0x4933c857, 0x813261c0, 0x02000800, - 0x0010032e, 0x0401f89d, 0x0400000b, 0x0201f800, - 0x00109667, 0x04000008, 0x59325809, 0x592c0209, - 0x8400054e, 0x48025a09, 0x417a7800, 0x0201f800, - 0x001091f1, 0x1c01f000, 0x485fc857, 0x5c000000, - 0x4d780000, 0x4203e000, 0x50000000, 0x4200b800, - 0x00008005, 0x0201f000, 0x00100333, 0x4933c857, - 0x83300480, 0x00000020, 0x02021800, 0x0010032e, - 0x83300c00, 0x0010cc8e, 0x50040000, 0x80000000, - 0x04001002, 0x44000800, 0x1c01f000, 0x4933c857, - 0x0401f7f4, 0x4807c856, 0x59b800ea, 0x8c000510, - 0x040007fd, 0x59b800e0, 0x4803c857, 0x1c01f000, - 0x4803c856, 0x42000000, 0x10000000, 0x41300800, - 0x0401f029, 0x8c000510, 0x02000000, 0x00020114, - 0x4c040000, 0x0401f80b, 0x5c000800, 0x82100480, - 0x00000008, 0x02001000, 0x00020114, 0x4c040000, - 0x0401fe9b, 0x5c000800, 0x0201f000, 0x00020114, - 0x59b800e2, 0x59b820e2, 0x80100580, 0x040207fd, - 0x80102114, 0x0401f001, 0x40101800, 0x800c190a, - 0x82100500, 0x0000001f, 0x820c1d00, 0x0000001f, - 0x800c2480, 0x82102500, 0x0000001f, 0x1c01f000, - 0x40680000, 0x406c0800, 0x0401f807, 0x42018800, - 0x00000001, 0x04020003, 0x42018800, 0x00000000, - 0x1c01f000, 0x82000500, 0xf0000000, 0x82040d00, - 0x0fffffff, 0x80040d40, 0x4807c857, 0x42001000, - 0x0010cb5f, 0x50080000, 0x80000540, 0x04020005, - 0x4a0370e5, 0x00000003, 0x4a0370e4, 0x00000300, - 0x80000000, 0x44001000, 0x42001000, 0x00000400, - 0x59b800ea, 0x8c000510, 0x0400000c, 0x0401ffd1, - 0x82100480, 0x00000008, 0x04001007, 0x4c040000, - 0x4c080000, 0x0401fe62, 0x5c001000, 0x5c000800, - 0x0401f020, 0x59b800ea, 0x8c000516, 0x0402001d, - 0x4a0370e4, 0x00300000, 0x480770e1, 0x42001000, - 0x0000ff00, 0x80081040, 0x04000012, 0x59b808e4, - 0x8c040d28, 0x040207fc, 0x42001000, 0x0010cb5f, - 0x50080000, 0x80000040, 0x04020005, 0x4a0370e5, - 0x00000002, 0x4a0370e4, 0x00000200, 0x02001800, - 0x0010032e, 0x44001000, 0x8c040d2c, 0x1c01f000, + 0x4cf80000, 0x0201f800, 0x00020095, 0x5c01f000, + 0x5c01e800, 0x5c019800, 0x5c019000, 0x5c020800, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c029000, + 0x5c029800, 0x5c028800, 0x5c027800, 0x5c027000, + 0x5c01f800, 0x5c028000, 0x5c026800, 0x5c025800, + 0x5c026000, 0x1c01f000, 0x493bc857, 0x0201f000, + 0x000200c2, 0x83300500, 0x000000ff, 0x82000c80, + 0x00000007, 0x02021800, 0x0010032e, 0x0c01f025, + 0x1c01f000, 0x82000d00, 0xc0000038, 0x02020800, + 0x00100323, 0x0201f800, 0x0010032e, 0x00000000, + 0x00000048, 0x00000054, 0x00000053, 0x0010079a, + 0x001007be, 0x001007b9, 0x001007dd, 0x001007a5, + 0x001007b1, 0x0010079a, 0x001007d8, 0x0010083c, + 0x0010079a, 0x0010083f, 0x0010079a, 0x0010079a, + 0x00100843, 0x00100849, 0x00100867, 0x0010087c, + 0x001007de, 0x00100885, 0x00100891, 0x0010079a, + 0x0010079a, 0x0010079a, 0x0201f800, 0x0010032e, + 0x001007a3, 0x00100928, 0x00100802, 0x0010082b, + 0x001007a3, 0x001007a3, 0x001007a3, 0x0201f800, + 0x0010032e, 0x4803c856, 0x59300004, 0x8c00053e, + 0x04020005, 0x42027000, 0x00000055, 0x0201f000, + 0x00020bc1, 0x0201f800, 0x00107226, 0x040007fa, + 0x1c01f000, 0x4803c856, 0x0401f8e1, 0x40002800, + 0x41782000, 0x42027000, 0x00000056, 0x0201f000, + 0x00020bc1, 0x4803c856, 0x42027000, 0x00000057, + 0x0201f000, 0x00020bc1, 0x4803c856, 0x59325809, + 0x812e59c0, 0x04000016, 0x59300008, 0x8c00051a, + 0x0402000d, 0x592c0409, 0x8c00051c, 0x04020003, + 0x4a026012, 0xffffffff, 0x59300004, 0x8c00053e, + 0x04020008, 0x42027000, 0x00000048, 0x0201f000, + 0x00020bc1, 0x4a025a07, 0x00000007, 0x0401f7f5, + 0x0201f800, 0x00107226, 0x040007f7, 0x1c01f000, + 0x4803c856, 0x83300500, 0x00ffffff, 0x0201f000, + 0x00106aa6, 0x1c01f000, 0x4803c856, 0x813261c0, + 0x02000800, 0x0010032e, 0x0201f800, 0x0010989f, + 0x0400000d, 0x59325809, 0x592c0209, 0x84000552, + 0x48025a09, 0x0201f800, 0x001010ee, 0x59300004, + 0x8c00053e, 0x04020005, 0x417a7800, 0x0201f800, + 0x00109425, 0x1c01f000, 0x0201f800, 0x00107226, + 0x040007fa, 0x1c01f000, 0x4c040000, 0x59b808ea, + 0x82040d00, 0x00000007, 0x82040580, 0x00000003, + 0x04000004, 0x42000000, 0x60000000, 0x0401f8c8, + 0x5c000800, 0x1c01f000, 0x0401f916, 0x0400001b, + 0x59325809, 0x812e59c0, 0x04000018, 0x592c0205, + 0x82000500, 0x000000ff, 0x82000d80, 0x00000029, + 0x04020012, 0x59300203, 0x82000580, 0x00000003, + 0x0400000b, 0x59300808, 0x84040d26, 0x48066008, + 0x0201f800, 0x0002011a, 0x4a03900d, 0x00000040, + 0x4a0370e5, 0x00000008, 0x1c01f000, 0x0201f800, + 0x00107226, 0x040007f4, 0x42000000, 0x0010cf1b, + 0x0201f800, 0x0010bfb3, 0x5988014a, 0x80000000, + 0x4803114a, 0x4a03900d, 0x00000040, 0x42000000, + 0xc0000000, 0x0201f000, 0x0002010e, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x4200c800, 0x0010e235, + 0x4200b800, 0x00003000, 0x4200c000, 0x00000105, + 0x0201f800, 0x001062aa, 0x4a0370e4, 0x02000000, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x4933c857, 0x0201f000, 0x00020b9d, 0x4933c857, + 0x0201f800, 0x00100cb0, 0x1c01f000, 0x41300800, + 0x800409c0, 0x02020800, 0x0010032e, 0x0201f800, + 0x00100323, 0x42000000, 0x0010cf1b, 0x0201f800, + 0x0010bfb3, 0x4933c857, 0x813261c0, 0x02000800, + 0x0010032e, 0x0401f842, 0x40002800, 0x0201f800, + 0x0010bf1c, 0x4c140000, 0x59a8006d, 0x80000540, + 0x04000005, 0x8c142d2a, 0x04000003, 0x0201f800, + 0x00100cb0, 0x5c002800, 0x0401f8ae, 0x04000007, + 0x5932680a, 0x59340200, 0x8c00050e, 0x59300415, + 0x02020800, 0x00109b98, 0x1c01f000, 0x42000000, + 0x0010cf1b, 0x0201f800, 0x0010bfb3, 0x4933c857, + 0x813261c0, 0x02000800, 0x0010032e, 0x0401f89d, + 0x0400000b, 0x0201f800, 0x0010989f, 0x04000008, + 0x59325809, 0x592c0209, 0x8400054e, 0x48025a09, + 0x417a7800, 0x0201f800, 0x00109425, 0x1c01f000, + 0x485fc857, 0x5c000000, 0x4d780000, 0x4203e000, + 0x50000000, 0x4200b800, 0x00008005, 0x0201f000, + 0x00100333, 0x4933c857, 0x83300480, 0x00000020, + 0x02021800, 0x0010032e, 0x83300c00, 0x0010cf8e, + 0x50040000, 0x80000000, 0x04001002, 0x44000800, + 0x1c01f000, 0x4933c857, 0x0401f7f4, 0x4807c856, + 0x59b800ea, 0x8c000510, 0x040007fd, 0x59b800e0, + 0x4803c857, 0x1c01f000, 0x4803c856, 0x42000000, + 0x10000000, 0x41300800, 0x0401f029, 0x8c000510, + 0x02000000, 0x00020114, 0x4c040000, 0x0401f80b, + 0x5c000800, 0x82100480, 0x00000008, 0x02001000, + 0x00020114, 0x4c040000, 0x0401fe9d, 0x5c000800, + 0x0201f000, 0x00020114, 0x59b800e2, 0x59b820e2, + 0x80100580, 0x040207fd, 0x80102114, 0x0401f001, + 0x40101800, 0x800c190a, 0x82100500, 0x0000001f, + 0x820c1d00, 0x0000001f, 0x800c2480, 0x82102500, + 0x0000001f, 0x1c01f000, 0x40680000, 0x406c0800, + 0x0401f807, 0x42018800, 0x00000001, 0x04020003, + 0x42018800, 0x00000000, 0x1c01f000, 0x82000500, + 0xf0000000, 0x82040d00, 0x0fffffff, 0x80040d40, + 0x4807c857, 0x42001000, 0x0010ce5f, 0x50080000, + 0x80000540, 0x04020005, 0x4a0370e5, 0x00000003, + 0x4a0370e4, 0x00000300, 0x80000000, 0x44001000, + 0x42001000, 0x00000400, 0x59b800ea, 0x8c000510, + 0x0400000c, 0x0401ffd1, 0x82100480, 0x00000008, + 0x04001007, 0x4c040000, 0x4c080000, 0x0401fe64, + 0x5c001000, 0x5c000800, 0x0401f020, 0x59b800ea, + 0x8c000516, 0x0402001d, 0x4a0370e4, 0x00300000, + 0x480770e1, 0x42001000, 0x0000ff00, 0x80081040, + 0x04000012, 0x59b808e4, 0x8c040d28, 0x040207fc, + 0x42001000, 0x0010ce5f, 0x50080000, 0x80000040, + 0x04020005, 0x4a0370e5, 0x00000002, 0x4a0370e4, + 0x00000200, 0x02001800, 0x0010032e, 0x44001000, + 0x8c040d2c, 0x1c01f000, 0x41f80000, 0x50000000, + 0x0201f800, 0x0010032e, 0x80081040, 0x040207d3, 0x41f80000, 0x50000000, 0x0201f800, 0x0010032e, - 0x80081040, 0x040207d3, 0x41f80000, 0x50000000, - 0x0201f800, 0x0010032e, 0x4d380000, 0x59300c07, - 0x82040580, 0x00000009, 0x04020006, 0x42027000, - 0x00000047, 0x0201f800, 0x00020bc1, 0x80000580, - 0x5c027000, 0x1c01f000, 0x4c500000, 0x4a03900d, - 0x00000001, 0x59c8a020, 0x4a03900d, 0x00000002, - 0x59c80820, 0x8c50a52e, 0x04000002, 0x900409c0, - 0x82040d00, 0x0000ffff, 0x0201f800, 0x0010609d, - 0x5c00a000, 0x1c01f000, 0x42000000, 0x0010cc12, - 0x0201f800, 0x0010bc88, 0x0401ffec, 0x04000054, - 0x4933c857, 0x59300407, 0x82000580, 0x00000000, - 0x0400004f, 0x59c82021, 0x4a03900d, 0x00000001, - 0x59c82821, 0x82142d00, 0x0000ffff, 0x59325809, - 0x812e59c0, 0x04000046, 0x5932680a, 0x0201f800, - 0x0010483c, 0x02020800, 0x00109948, 0x599c0019, - 0x8c00050c, 0x0402001e, 0x0201f800, 0x0010483c, - 0x0402001b, 0x59300812, 0x4807c857, 0x592c0409, - 0x8c00051c, 0x04020014, 0x8400055c, 0x48025c09, - 0x592c0a05, 0x82040d00, 0x000000ff, 0x82040580, - 0x00000048, 0x04000007, 0x82040580, 0x00000018, - 0x04000004, 0x82040580, 0x00000068, 0x04020006, - 0x59300012, 0x0201f800, 0x0010a0a5, 0x80000d40, - 0x48065803, 0x4a026012, 0x7fffffff, 0x59300008, - 0x8c000516, 0x0402001e, 0x48166014, 0x599c0019, - 0x8c00050c, 0x04020004, 0x59a80007, 0x8c00051e, - 0x04020017, 0x0201f800, 0x00100f2a, 0x04020014, - 0x0401fa8f, 0x40280000, 0x4802600e, 0x04000005, - 0x4832600c, 0x50200000, 0x4802600b, 0x4822600d, - 0x59300415, 0x8c00051c, 0x04020004, 0x599c0019, - 0x8c00050c, 0x04020885, 0x4a03900d, 0x00000040, - 0x4a0370e5, 0x00000008, 0x1c01f000, 0x42000000, - 0x0010cc1b, 0x0201f800, 0x0010bc88, 0x5988014c, - 0x80000000, 0x4803114c, 0x4a03900d, 0x00000040, - 0x42000000, 0xc0000000, 0x0201f000, 0x0002010e, - 0x4cf80000, 0x58f40000, 0x8001f540, 0x0401f820, - 0x41781800, 0x0401f935, 0x04020014, 0x44140800, - 0x0401f82a, 0x04000011, 0x40043800, 0x42001800, - 0x00000001, 0x40142000, 0x0401f92c, 0x0402000b, - 0x801c3800, 0x501c0000, 0x44000800, 0x0401f810, - 0x801c0580, 0x04000004, 0x44103800, 0x801c3840, - 0x44143800, 0x0401f819, 0x5c01f000, 0x1c01f000, - 0x80f9f1c0, 0x04020003, 0x58f41202, 0x0401f003, - 0x42001000, 0x00000007, 0x1c01f000, 0x80f9f1c0, - 0x04020006, 0x58f40401, 0x82000480, 0x00000002, - 0x80f40400, 0x0401f005, 0x58f80401, 0x82000480, - 0x00000002, 0x80f80400, 0x50002800, 0x80000000, - 0x50002000, 0x1c01f000, 0x80f9f1c0, 0x04020008, - 0x58f40401, 0x82000480, 0x00000002, 0x02001800, - 0x0010032e, 0x4801ec01, 0x0401f00b, 0x58f80401, - 0x82000480, 0x00000002, 0x02001800, 0x0010032e, - 0x4801f401, 0x82000580, 0x00000002, 0x04020002, - 0x0401f81b, 0x58f40202, 0x80000040, 0x4801ea02, - 0x02000800, 0x0010032e, 0x82000580, 0x00000001, - 0x1c01f000, 0x82f40580, 0xffffffff, 0x0400000f, + 0x4d380000, 0x59300c07, 0x82040580, 0x00000009, + 0x04020006, 0x42027000, 0x00000047, 0x0201f800, + 0x00020bc1, 0x80000580, 0x5c027000, 0x1c01f000, + 0x4c500000, 0x4a03900d, 0x00000001, 0x59c8a020, + 0x4a03900d, 0x00000002, 0x59c80820, 0x8c50a52e, + 0x04000002, 0x900409c0, 0x82040d00, 0x0000ffff, + 0x0201f800, 0x00106269, 0x5c00a000, 0x1c01f000, + 0x42000000, 0x0010cf12, 0x0201f800, 0x0010bfb3, + 0x0401ffec, 0x04000057, 0x4933c857, 0x59300407, + 0x82000580, 0x00000000, 0x04000052, 0x59c82021, + 0x4a03900d, 0x00000001, 0x59c82821, 0x82142d00, + 0x0000ffff, 0x59325809, 0x812e59c0, 0x04000049, + 0x5932680a, 0x0201f800, 0x0010493c, 0x02020800, + 0x00109b80, 0x599c0019, 0x8c00050c, 0x0402001e, + 0x0201f800, 0x0010493c, 0x0402001b, 0x59300812, + 0x4807c857, 0x592c0409, 0x8c00051c, 0x04020014, + 0x8400055c, 0x48025c09, 0x592c0a05, 0x82040d00, + 0x000000ff, 0x82040580, 0x00000048, 0x04000007, + 0x82040580, 0x00000018, 0x04000004, 0x82040580, + 0x00000068, 0x04020006, 0x59300012, 0x0201f800, + 0x0010a2e2, 0x80000d40, 0x48065803, 0x4a026012, + 0x7fffffff, 0x59300008, 0x8c000516, 0x04020021, + 0x48166014, 0x0201f800, 0x0010493c, 0x04000004, + 0x59300415, 0x8c00051c, 0x04000004, 0x599c0019, + 0x8c00050c, 0x04000017, 0x0201f800, 0x00100f2b, + 0x04020014, 0x0401fa8f, 0x40280000, 0x4802600e, + 0x04000005, 0x4832600c, 0x50200000, 0x4802600b, + 0x4822600d, 0x59300415, 0x8c00051c, 0x04020004, + 0x599c0019, 0x8c00050c, 0x04020885, 0x4a03900d, + 0x00000040, 0x4a0370e5, 0x00000008, 0x1c01f000, + 0x42000000, 0x0010cf1b, 0x0201f800, 0x0010bfb3, + 0x5988014c, 0x80000000, 0x4803114c, 0x4a03900d, + 0x00000040, 0x42000000, 0xc0000000, 0x0201f000, + 0x0002010e, 0x4cf80000, 0x58f40000, 0x8001f540, + 0x0401f820, 0x41781800, 0x0401f935, 0x04020014, + 0x44140800, 0x0401f82a, 0x04000011, 0x40043800, + 0x42001800, 0x00000001, 0x40142000, 0x0401f92c, + 0x0402000b, 0x801c3800, 0x501c0000, 0x44000800, + 0x0401f810, 0x801c0580, 0x04000004, 0x44103800, + 0x801c3840, 0x44143800, 0x0401f819, 0x5c01f000, + 0x1c01f000, 0x80f9f1c0, 0x04020003, 0x58f41202, + 0x0401f003, 0x42001000, 0x00000007, 0x1c01f000, + 0x80f9f1c0, 0x04020006, 0x58f40401, 0x82000480, + 0x00000002, 0x80f40400, 0x0401f005, 0x58f80401, + 0x82000480, 0x00000002, 0x80f80400, 0x50002800, + 0x80000000, 0x50002000, 0x1c01f000, 0x80f9f1c0, + 0x04020008, 0x58f40401, 0x82000480, 0x00000002, + 0x02001800, 0x0010032e, 0x4801ec01, 0x0401f00b, + 0x58f80401, 0x82000480, 0x00000002, 0x02001800, + 0x0010032e, 0x4801f401, 0x82000580, 0x00000002, + 0x04020002, 0x0401f81b, 0x58f40202, 0x80000040, + 0x4801ea02, 0x02000800, 0x0010032e, 0x82000580, + 0x00000001, 0x1c01f000, 0x82f40580, 0xffffffff, + 0x0400000f, 0x58f40201, 0x82000580, 0x0000dcb3, + 0x02020800, 0x0010032e, 0x58f40000, 0x8001f540, + 0x04000006, 0x58f80201, 0x82000580, 0x0000ddb9, + 0x02020800, 0x0010032e, 0x0401f80a, 0x1c01f000, + 0x4d2c0000, 0x40fa5800, 0x0201f800, 0x00100594, + 0x4979e800, 0x4179f000, 0x5c025800, 0x1c01f000, + 0x80f5e9c0, 0x04000009, 0x80f9f1c0, 0x04020ff5, + 0x4d2c0000, 0x40f65800, 0x0201f800, 0x00100594, + 0x4179e800, 0x5c025800, 0x1c01f000, 0x4cf40000, + 0x0201f800, 0x0010493c, 0x04020036, 0x59300808, + 0x82040500, 0x00013100, 0x04020032, 0x8c040d22, + 0x04000032, 0x59300028, 0x8001ed40, 0x02000800, + 0x0010032e, 0x82000580, 0xffffffff, 0x04000029, 0x58f40201, 0x82000580, 0x0000dcb3, 0x02020800, - 0x0010032e, 0x58f40000, 0x8001f540, 0x04000006, - 0x58f80201, 0x82000580, 0x0000ddb9, 0x02020800, - 0x0010032e, 0x0401f80a, 0x1c01f000, 0x4d2c0000, - 0x40fa5800, 0x0201f800, 0x00100594, 0x4979e800, - 0x4179f000, 0x5c025800, 0x1c01f000, 0x80f5e9c0, - 0x04000009, 0x80f9f1c0, 0x04020ff5, 0x4d2c0000, - 0x40f65800, 0x0201f800, 0x00100594, 0x4179e800, - 0x5c025800, 0x1c01f000, 0x4cf40000, 0x0201f800, - 0x0010483c, 0x04020036, 0x59300808, 0x82040500, - 0x00013100, 0x04020032, 0x8c040d22, 0x04000032, - 0x59300028, 0x8001ed40, 0x02000800, 0x0010032e, - 0x82000580, 0xffffffff, 0x04000029, 0x58f40201, + 0x0010032e, 0x58f40a02, 0x82040500, 0x0000fffe, + 0x04000003, 0x0401ff74, 0x58f40a02, 0x82040480, + 0x0000000f, 0x04021095, 0x80040800, 0x4805ea02, + 0x82040580, 0x00000008, 0x04000099, 0x82040480, + 0x00000008, 0x0400100a, 0x58f40000, 0x8001ed40, + 0x02000800, 0x0010032e, 0x58f40201, 0x82000580, + 0x0000ddb9, 0x02020800, 0x0010032e, 0x58f40401, + 0x82000c00, 0x00000002, 0x4805ec01, 0x80f40400, + 0x59300813, 0x44040000, 0x80000000, 0x45780000, + 0x5c01e800, 0x1c01f000, 0x42001000, 0x00000400, + 0x59b800e4, 0x8c000524, 0x0402005f, 0x4a0370e4, + 0x00030000, 0x40000000, 0x59b800e4, 0x8c000524, + 0x04020057, 0x59300808, 0x84040d62, 0x48066008, + 0x4a0370e4, 0x00020000, 0x4d2c0000, 0x0201f800, + 0x0010056e, 0x04000061, 0x492e6028, 0x4a025a01, + 0x0000dcb3, 0x59300009, 0x80001d40, 0x02000800, + 0x0010032e, 0x580c0810, 0x48065803, 0x580c0205, + 0x82000500, 0x000000ff, 0x82000580, 0x00000068, + 0x04020037, 0x580c1801, 0x800c19c0, 0x02000800, + 0x0010032e, 0x580c0c06, 0x82040d00, 0x00000003, + 0x82040580, 0x00000002, 0x04020003, 0x592c0803, + 0x0401f02b, 0x580c2a07, 0x580c0008, 0x59301812, + 0x800c0580, 0x0400002a, 0x82040580, 0x00000000, + 0x04000012, 0x40140000, 0x4c080000, 0x400c1000, + 0x41780800, 0x0201f800, 0x00106c9d, 0x800409c0, + 0x02020800, 0x0010032e, 0x82140c00, 0x00000008, + 0x0201f800, 0x00106c7e, 0x5c001000, 0x40041800, + 0x592c0803, 0x0401f022, 0x82140400, 0x00000008, + 0x4c080000, 0x400c1000, 0x41780800, 0x0201f800, + 0x00106c9d, 0x800409c0, 0x02020800, 0x0010032e, + 0x40140800, 0x0201f800, 0x00106c7e, 0x5c001000, + 0x40041800, 0x592c0803, 0x0401f011, 0x59301812, + 0x40040000, 0x800c0580, 0x0402000d, 0x497a5a02, + 0x4a025c01, 0x00000004, 0x0401f011, 0x4a0370e4, + 0x00020000, 0x40000000, 0x40000000, 0x80081040, + 0x02000800, 0x0010032e, 0x0401f79a, 0x4a025a02, + 0x00000001, 0x4a025c01, 0x00000006, 0x497a5804, + 0x400c0000, 0x80040480, 0x48025805, 0x412de800, + 0x5c025800, 0x0401f76d, 0x5c025800, 0x4a026028, + 0xffffffff, 0x0401f787, 0x4d2c0000, 0x58f65800, + 0x0201f800, 0x00100594, 0x40f65800, 0x0201f800, + 0x00100594, 0x5c025800, 0x0401f7f5, 0x4d2c0000, + 0x0201f800, 0x0010056e, 0x040007f8, 0x4a025a01, + 0x0000ddb9, 0x4a025c01, 0x00000002, 0x492de800, + 0x412de800, 0x5c025800, 0x0401f769, 0x0401fee2, + 0x82f40400, 0x00000004, 0x800c0400, 0x40000800, + 0x50040000, 0x80100580, 0x04000016, 0x82040c00, + 0x00000002, 0x80081040, 0x040207fa, 0x80f9f1c0, + 0x04000011, 0x58f41202, 0x82081480, 0x00000007, + 0x82f80400, 0x00000002, 0x800c0400, 0x40000800, + 0x50040000, 0x80100580, 0x04000006, 0x82040c00, + 0x00000002, 0x80081040, 0x040207fa, 0x0401f002, + 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fd, + 0x4cf40000, 0x4cf80000, 0x4001e800, 0x812e59c0, + 0x04000024, 0x592c0a07, 0x800409c0, 0x04020021, + 0x82f40580, 0xffffffff, 0x0400001b, 0x58f40201, 0x82000580, 0x0000dcb3, 0x02020800, 0x0010032e, - 0x58f40a02, 0x82040500, 0x0000fffe, 0x04000003, - 0x0401ff74, 0x58f40a02, 0x82040480, 0x0000000f, - 0x04021095, 0x80040800, 0x4805ea02, 0x82040580, - 0x00000008, 0x04000099, 0x82040480, 0x00000008, - 0x0400100a, 0x58f40000, 0x8001ed40, 0x02000800, - 0x0010032e, 0x58f40201, 0x82000580, 0x0000ddb9, - 0x02020800, 0x0010032e, 0x58f40401, 0x82000c00, - 0x00000002, 0x4805ec01, 0x80f40400, 0x59300813, - 0x44040000, 0x80000000, 0x45780000, 0x5c01e800, - 0x1c01f000, 0x42001000, 0x00000400, 0x59b800e4, - 0x8c000524, 0x0402005f, 0x4a0370e4, 0x00030000, - 0x40000000, 0x59b800e4, 0x8c000524, 0x04020057, - 0x59300808, 0x84040d62, 0x48066008, 0x4a0370e4, - 0x00020000, 0x4d2c0000, 0x0201f800, 0x0010056e, - 0x04000061, 0x492e6028, 0x4a025a01, 0x0000dcb3, - 0x59300009, 0x80001d40, 0x02000800, 0x0010032e, - 0x580c0810, 0x48065803, 0x580c0205, 0x82000500, - 0x000000ff, 0x82000580, 0x00000068, 0x04020037, - 0x580c1801, 0x800c19c0, 0x02000800, 0x0010032e, - 0x580c0c06, 0x82040d00, 0x00000003, 0x82040580, - 0x00000002, 0x04020003, 0x592c0803, 0x0401f02b, - 0x580c2a07, 0x580c0008, 0x59301812, 0x800c0580, - 0x0400002a, 0x82040580, 0x00000000, 0x04000012, - 0x40140000, 0x4c080000, 0x400c1000, 0x41780800, - 0x0201f800, 0x00106a98, 0x800409c0, 0x02020800, - 0x0010032e, 0x82140c00, 0x00000008, 0x0201f800, - 0x00106a79, 0x5c001000, 0x40041800, 0x592c0803, - 0x0401f022, 0x82140400, 0x00000008, 0x4c080000, - 0x400c1000, 0x41780800, 0x0201f800, 0x00106a98, - 0x800409c0, 0x02020800, 0x0010032e, 0x40140800, - 0x0201f800, 0x00106a79, 0x5c001000, 0x40041800, - 0x592c0803, 0x0401f011, 0x59301812, 0x40040000, - 0x800c0580, 0x0402000d, 0x497a5a02, 0x4a025c01, - 0x00000004, 0x0401f011, 0x4a0370e4, 0x00020000, - 0x40000000, 0x40000000, 0x80081040, 0x02000800, - 0x0010032e, 0x0401f79a, 0x4a025a02, 0x00000001, - 0x4a025c01, 0x00000006, 0x497a5804, 0x400c0000, - 0x80040480, 0x48025805, 0x412de800, 0x5c025800, - 0x0401f76d, 0x5c025800, 0x4a026028, 0xffffffff, - 0x0401f787, 0x4d2c0000, 0x58f65800, 0x0201f800, - 0x00100594, 0x40f65800, 0x0201f800, 0x00100594, - 0x5c025800, 0x0401f7f5, 0x4d2c0000, 0x0201f800, - 0x0010056e, 0x040007f8, 0x4a025a01, 0x0000ddb9, - 0x4a025c01, 0x00000002, 0x492de800, 0x412de800, - 0x5c025800, 0x0401f769, 0x0401fee2, 0x82f40400, - 0x00000004, 0x800c0400, 0x40000800, 0x50040000, - 0x80100580, 0x04000016, 0x82040c00, 0x00000002, - 0x80081040, 0x040207fa, 0x80f9f1c0, 0x04000011, - 0x58f41202, 0x82081480, 0x00000007, 0x82f80400, - 0x00000002, 0x800c0400, 0x40000800, 0x50040000, - 0x80100580, 0x04000006, 0x82040c00, 0x00000002, - 0x80081040, 0x040207fa, 0x0401f002, 0x1c01f000, - 0x82000540, 0x00000001, 0x0401f7fd, 0x4cf40000, - 0x4cf80000, 0x4001e800, 0x812e59c0, 0x04000024, - 0x592c0a07, 0x800409c0, 0x04020021, 0x82f40580, - 0xffffffff, 0x0400001b, 0x58f40201, 0x82000580, - 0x0000dcb3, 0x02020800, 0x0010032e, 0x58f40000, - 0x8001f540, 0x04000006, 0x58f80201, 0x82000580, - 0x0000ddb9, 0x02020800, 0x0010032e, 0x41783800, - 0x58f44003, 0x0401f839, 0x04020009, 0x0401fef0, - 0x497a6028, 0x59300808, 0x84040d22, 0x48066008, - 0x5c01f000, 0x5c01e800, 0x1c01f000, 0x0401fee8, - 0x4a025a07, 0x00000011, 0x0401f7f6, 0x0401feca, - 0x0401f7f4, 0x4cf40000, 0x4cf80000, 0x4001e800, - 0x82040580, 0x00000001, 0x04020020, 0x82f40580, - 0xffffffff, 0x0400001a, 0x58f40201, 0x82000580, - 0x0000dcb3, 0x02020800, 0x0010032e, 0x58f40000, - 0x8001f540, 0x04000006, 0x58f80201, 0x82000580, - 0x0000ddb9, 0x02020800, 0x0010032e, 0x41783800, - 0x58f44003, 0x0401f811, 0x04020008, 0x0401fec8, - 0x42000800, 0x00000001, 0x497a6028, 0x5c01f000, - 0x5c01e800, 0x1c01f000, 0x0401fec1, 0x42000800, - 0x00000011, 0x0401f7f9, 0x4c040000, 0x0401fea2, - 0x5c000800, 0x0401f7f5, 0x4803c856, 0x401c2000, - 0x41781800, 0x4c200000, 0x0401ff88, 0x5c004000, - 0x0402002a, 0x40202000, 0x42001800, 0x00000001, - 0x0401ff82, 0x04020025, 0x0401fe62, 0x40082800, - 0x82f43400, 0x00000004, 0x50182000, 0x40100000, + 0x58f40000, 0x8001f540, 0x04000006, 0x58f80201, + 0x82000580, 0x0000ddb9, 0x02020800, 0x0010032e, + 0x41783800, 0x58f44003, 0x0401f839, 0x04020009, + 0x0401fef0, 0x497a6028, 0x59300808, 0x84040d22, + 0x48066008, 0x5c01f000, 0x5c01e800, 0x1c01f000, + 0x0401fee8, 0x4a025a07, 0x00000011, 0x0401f7f6, + 0x0401feca, 0x0401f7f4, 0x4cf40000, 0x4cf80000, + 0x4001e800, 0x82040580, 0x00000001, 0x04020020, + 0x82f40580, 0xffffffff, 0x0400001a, 0x58f40201, + 0x82000580, 0x0000dcb3, 0x02020800, 0x0010032e, + 0x58f40000, 0x8001f540, 0x04000006, 0x58f80201, + 0x82000580, 0x0000ddb9, 0x02020800, 0x0010032e, + 0x41783800, 0x58f44003, 0x0401f811, 0x04020008, + 0x0401fec8, 0x42000800, 0x00000001, 0x497a6028, + 0x5c01f000, 0x5c01e800, 0x1c01f000, 0x0401fec1, + 0x42000800, 0x00000011, 0x0401f7f9, 0x4c040000, + 0x0401fea2, 0x5c000800, 0x0401f7f5, 0x4803c856, + 0x401c2000, 0x41781800, 0x4c200000, 0x0401ff88, + 0x5c004000, 0x0402002a, 0x40202000, 0x42001800, + 0x00000001, 0x0401ff82, 0x04020025, 0x0401fe62, + 0x40082800, 0x82f43400, 0x00000004, 0x50182000, + 0x40100000, 0x801c0580, 0x04000005, 0x42001800, + 0x00000001, 0x0401ff76, 0x04020019, 0x82183400, + 0x00000002, 0x80142840, 0x040207f5, 0x80f9f1c0, + 0x04000012, 0x58f42a02, 0x82142c80, 0x00000007, + 0x82f83400, 0x00000002, 0x50182000, 0x40100000, 0x801c0580, 0x04000005, 0x42001800, 0x00000001, - 0x0401ff76, 0x04020019, 0x82183400, 0x00000002, - 0x80142840, 0x040207f5, 0x80f9f1c0, 0x04000012, - 0x58f42a02, 0x82142c80, 0x00000007, 0x82f83400, - 0x00000002, 0x50182000, 0x40100000, 0x801c0580, - 0x04000005, 0x42001800, 0x00000001, 0x0401ff63, - 0x04020006, 0x82183400, 0x00000002, 0x80142840, - 0x040207f5, 0x1c01f000, 0x82000540, 0x00000001, - 0x0401f7fd, 0x0201f800, 0x0010032e, 0x58380a05, - 0x82040d00, 0x000000ff, 0x82040580, 0x0000001b, - 0x04000004, 0x82040580, 0x0000002b, 0x040207f6, + 0x0401ff63, 0x04020006, 0x82183400, 0x00000002, + 0x80142840, 0x040207f5, 0x1c01f000, 0x82000540, + 0x00000001, 0x0401f7fd, 0x0201f800, 0x0010032e, + 0x58380a05, 0x82040d00, 0x000000ff, 0x82040580, + 0x0000001b, 0x04000004, 0x82040580, 0x0000002b, + 0x040207f6, 0x50200000, 0x80387c00, 0x583c2800, + 0x583c2001, 0x583c1002, 0x592c0a08, 0x58383010, + 0x59303808, 0x497a6013, 0x497a6014, 0x0201f000, + 0x0002015d, 0x592c020b, 0x8c000502, 0x040007e7, + 0x497a6013, 0x0201f800, 0x00101105, 0x412c7000, + 0x59300008, 0x84000556, 0x48026008, 0x82040500, + 0x0000000f, 0x82000c00, 0x00100f0b, 0x50044000, + 0x80204000, 0x50200000, 0x80187c00, 0x583c2800, + 0x583c2001, 0x583c1002, 0x58380a08, 0x58384c09, + 0x40187000, 0x58183008, 0x59303808, 0x497a6014, + 0x0201f000, 0x0002015d, 0x592c040b, 0x8c000500, + 0x02000800, 0x0010032e, 0x592c000e, 0x48026013, + 0x0401f7e1, 0x58380208, 0x8c000502, 0x040007c3, 0x50200000, 0x80387c00, 0x583c2800, 0x583c2001, - 0x583c1002, 0x592c0a08, 0x58383010, 0x59303808, - 0x497a6013, 0x497a6014, 0x0201f000, 0x0002015d, - 0x592c020b, 0x8c000502, 0x040007e7, 0x497a6013, - 0x0201f800, 0x00101104, 0x412c7000, 0x59300008, - 0x84000556, 0x48026008, 0x82040500, 0x0000000f, - 0x82000c00, 0x00100f0a, 0x50044000, 0x80204000, - 0x50200000, 0x80187c00, 0x583c2800, 0x583c2001, - 0x583c1002, 0x58380a08, 0x58384c09, 0x40187000, - 0x58183008, 0x59303808, 0x497a6014, 0x0201f000, - 0x0002015d, 0x592c040b, 0x8c000500, 0x02000800, - 0x0010032e, 0x592c000e, 0x48026013, 0x0401f7e1, - 0x58380208, 0x8c000502, 0x040007c3, 0x50200000, - 0x80387c00, 0x583c2800, 0x583c2001, 0x58380405, - 0x80001540, 0x04020002, 0x58381408, 0x58c83401, - 0x58380c09, 0x59303808, 0x497a6013, 0x497a6014, - 0x0201f000, 0x0002015d, 0x592c0409, 0x8c000502, - 0x040007b1, 0x592c040a, 0x80000540, 0x040007ae, - 0x82000c80, 0x00000002, 0x04001011, 0x58380001, - 0x80007540, 0x02000800, 0x0010032e, 0x58380205, - 0x82000500, 0x0000000f, 0x82000400, 0x00100f0a, - 0x50004000, 0x40040000, 0x800409c0, 0x04000005, - 0x82040c80, 0x00000005, 0x040217f1, 0x80204400, - 0x50200000, 0x80387c00, 0x583c2800, 0x583c2001, - 0x583c1002, 0x592c0a08, 0x592c4c09, 0x592c300e, - 0x59303808, 0x497a6013, 0x497a6014, 0x4816600f, - 0x48126010, 0x480a6011, 0x481a6012, 0x80040840, - 0x4806600e, 0x02000000, 0x00020165, 0x80204000, - 0x50201800, 0x800c19c0, 0x0402000c, 0x58380001, - 0x80007540, 0x02000800, 0x0010032e, 0x58380205, - 0x82000500, 0x0000000f, 0x82000400, 0x00100f0a, - 0x50004000, 0x50201800, 0x483a600c, 0x480e600b, - 0x4822600d, 0x0201f000, 0x00020165, 0x4803c856, - 0x592c0209, 0x8c00051e, 0x04020017, 0x50200000, - 0x80306c00, 0x40240000, 0x0c01f001, 0x00100c17, - 0x00100c17, 0x00100c20, 0x00100c17, 0x00100c17, - 0x00100c17, 0x00100c17, 0x00100c17, 0x00100c20, - 0x00100c17, 0x00100c20, 0x00100c17, 0x00100c17, - 0x00100c20, 0x00100c17, 0x00100c17, 0x0201f800, - 0x0010032e, 0x8400051e, 0x48025a09, 0x50200000, - 0x80306c00, 0x58343801, 0x481e6010, 0x0401f007, - 0x58341802, 0x58342800, 0x58343801, 0x480e6011, - 0x4816600f, 0x481e6010, 0x0401f2c2, 0x4933c857, - 0x5931f809, 0x59301006, 0x800811c0, 0x0400000b, - 0x41780800, 0x42000000, 0x0000000a, 0x0201f800, - 0x00106a98, 0x80080102, 0x04020002, 0x84001542, - 0x80081040, 0x4809fc07, 0x4a026006, 0x00000002, - 0x592c040a, 0x82000500, 0x00000008, 0x0400000b, - 0x0401f839, 0x59300203, 0x82000580, 0x00000004, - 0x04020005, 0x42027000, 0x00000048, 0x0201f800, - 0x00020bc1, 0x1c01f000, 0x4cfc0000, 0x58fc0205, - 0x82000500, 0x000000ff, 0x82000580, 0x00000048, - 0x04020009, 0x58fc0409, 0x8c000500, 0x04000006, - 0x58fc080c, 0x8c040d16, 0x0400001f, 0x58fc0008, - 0x0401f00a, 0x58fc0409, 0x8c000512, 0x0402001c, - 0x58fc0c0a, 0x8c040d16, 0x04020003, 0x5c01f800, - 0x1c01f000, 0x58fc000b, 0x4c000000, 0x4d2c0000, - 0x40fe5800, 0x59300012, 0x0201f800, 0x0010a0a5, - 0x5c025800, 0x80000d40, 0x5c000000, 0x80040580, - 0x04020009, 0x59300008, 0x84000500, 0x48026008, - 0x42027000, 0x00000048, 0x5c01f800, 0x0201f000, - 0x00020bc1, 0x5c01f800, 0x1c01f000, 0x58fdf80a, - 0x0401f7e4, 0x5c000000, 0x4c000000, 0x4803c857, - 0x4933c857, 0x59b808ea, 0x82040d00, 0x00000007, - 0x82040580, 0x00000000, 0x04000025, 0x82040580, - 0x00000003, 0x04000022, 0x59300407, 0x4c000000, - 0x4a026407, 0x00000000, 0x42003000, 0x00000041, - 0x4a0370e5, 0x00003000, 0x42000000, 0x50000000, - 0x41300800, 0x4c180000, 0x0401fc3b, 0x5c003000, - 0x0400000e, 0x42000000, 0x0000001e, 0x80000040, - 0x040207ff, 0x80183040, 0x040207f4, 0x42000000, - 0x40000000, 0x41300800, 0x0401fc2f, 0x59880146, - 0x80000000, 0x48031146, 0x4a0370e5, 0x00002000, - 0x5c000000, 0x48026407, 0x1c01f000, 0x59300008, - 0x84000500, 0x48026008, 0x0401f7fc, 0x59c00007, - 0x4a038006, 0x30000000, 0x40000000, 0x59c00007, - 0x8c00050a, 0x040207fe, 0x1c01f000, 0x5c000000, - 0x4c000000, 0x4803c857, 0x42000800, 0x00000001, - 0x0201f800, 0x00101bda, 0x4dc00000, 0x4a0370e8, - 0x00000000, 0x42038000, 0x00007720, 0x0401ffec, - 0x42038000, 0x00007700, 0x0401ffe9, 0x0201f800, - 0x00104fc6, 0x04020017, 0x4a038891, 0x0000ffff, - 0x497b8880, 0x4ce80000, 0x4201d000, 0x00000016, - 0x0201f800, 0x0010645c, 0x497b8892, 0x4201d000, - 0x00000016, 0x0201f800, 0x0010645c, 0x5c01d000, - 0x42000000, 0x0010cc66, 0x0201f800, 0x0010bc88, - 0x0401f812, 0x5c038000, 0x0201f000, 0x001050f2, - 0x0401f830, 0x4c080000, 0x4c140000, 0x42000000, - 0x0010cc67, 0x0201f800, 0x0010bc88, 0x0401f807, - 0x5c002800, 0x5c001000, 0x48178892, 0x480b8880, - 0x5c038000, 0x1c01f000, 0x496fc857, 0x836c0580, - 0x00000003, 0x0402000b, 0x4c080000, 0x4c0c0000, - 0x42001000, 0x00008048, 0x42001800, 0x0000ffff, - 0x0201f800, 0x001038bc, 0x5c001800, 0x5c001000, - 0x42000800, 0x0000003c, 0x0201f800, 0x001012d1, - 0x59a8006d, 0x80000540, 0x04000005, 0x59a8106e, - 0x800811c0, 0x02020800, 0x00101b45, 0x4a038891, - 0x0000ffff, 0x4a03900d, 0x00000040, 0x0201f800, - 0x00100698, 0x4a0370e8, 0x00000001, 0x1c01f000, - 0x5c000000, 0x4c000000, 0x4803c857, 0x59c41080, - 0x497b8880, 0x4ce80000, 0x4201d000, 0x00000016, - 0x4c080000, 0x0201f800, 0x0010645c, 0x5c001000, - 0x5c01d000, 0x59c42892, 0x497b8892, 0x0201f800, - 0x00104fc6, 0x04020002, 0x1c01f000, 0x42002000, - 0x00000260, 0x59c418a4, 0x820c1d00, 0x0000000f, - 0x820c0580, 0x00000000, 0x04000010, 0x59c41805, - 0x820c1d00, 0x00000001, 0x0402000e, 0x59c418a4, - 0x820c1d00, 0x0000000f, 0x820c0480, 0x00000007, - 0x04001004, 0x820c0480, 0x0000000c, 0x04001003, - 0x80102040, 0x040207ec, 0x497b8891, 0x1c01f000, - 0x4c100000, 0x42002000, 0x00000019, 0x4a038805, - 0x00000001, 0x0201f800, 0x00101935, 0x59c41805, - 0x820c1d00, 0x00000001, 0x04000005, 0x80102040, - 0x040207f7, 0x5c002000, 0x0401f7f0, 0x5c002000, - 0x0401f7ec, 0x4803c856, 0x1c01f000, 0x00100d57, - 0x00100d57, 0x00100d57, 0x00100d7b, 0x00100d57, - 0x00100d57, 0x00100d57, 0x00100d57, 0x00100d57, - 0x00100d7b, 0x00100d57, 0x00100d59, 0x00100d57, - 0x00100d57, 0x00100d57, 0x00100d57, 0x0201f800, - 0x0010032e, 0x82040580, 0x0000001b, 0x0400001a, - 0x82040580, 0x0000002b, 0x04000017, 0x82040580, - 0x0000003b, 0x02020800, 0x0010032e, 0x592c020b, - 0x8c000500, 0x0400008d, 0x592c1a08, 0x82040500, - 0x0000000f, 0x82000400, 0x00100f0a, 0x50001000, - 0x50080000, 0x59302014, 0x4802600b, 0x492e600c, - 0x480a600d, 0x480e600e, 0x48126013, 0x5c025800, - 0x1c01f000, 0x592c0010, 0x48026012, 0x592c0011, - 0x48026014, 0x592c1a08, 0x0401f7ed, 0x82040500, - 0x0000000f, 0x82000400, 0x00100f0a, 0x50001000, - 0x50080000, 0x592c1a08, 0x4802600b, 0x492e600c, - 0x480a600d, 0x480e600e, 0x497a6013, 0x0401f7ec, - 0x8c040d00, 0x04020069, 0x82040d00, 0x00000080, - 0x04000066, 0x0201f000, 0x00020178, 0x0401fb75, - 0x843c7d4e, 0x0201f000, 0x00020185, 0x0401fb71, - 0x843c7d4e, 0x0201f000, 0x000201a0, 0x59300014, - 0x59301013, 0x80080580, 0x04020018, 0x59300004, - 0x8c00050e, 0x0400000a, 0x59300014, 0x80000540, - 0x04020004, 0x42007800, 0x800000a5, 0x0401f04c, - 0x42007800, 0x80000085, 0x0401f003, 0x42007800, - 0x80000005, 0x592c1209, 0x82080500, 0xffff7fff, - 0x48025a09, 0x8c08151e, 0x04020041, 0x823c7d40, - 0x00000020, 0x0401f03e, 0x480bc857, 0x42000000, - 0x0010cc13, 0x0201f800, 0x0010bc88, 0x59302014, - 0x59300415, 0x4803c857, 0x8c000514, 0x04020011, - 0x599c1819, 0x8c0c1d12, 0x0400000b, 0x592c0810, - 0x59300016, 0x80040c80, 0x04000005, 0x04001004, - 0x80040000, 0x80140480, 0x0400100a, 0x0201f800, - 0x00107d3d, 0x820c1d40, 0x00000001, 0x0401f026, - 0x84000514, 0x48026415, 0x48126016, 0x4813c857, - 0x0401f95a, 0x04020020, 0x59300004, 0x8c00050e, - 0x04000004, 0x42007800, 0x80000085, 0x0401f003, - 0x42007800, 0x80000005, 0x5930500e, 0x592c0209, - 0x4803c857, 0x8c00051e, 0x04020005, 0x823c7d40, - 0x00000020, 0x5930400d, 0x0401f004, 0x8400051e, - 0x48025a09, 0x0401f903, 0x50201800, 0x480e600b, - 0x4832600c, 0x4822600d, 0x482a600e, 0x480fc857, - 0x4833c857, 0x4823c857, 0x482bc857, 0x80000580, - 0x483e6004, 0x1c01f000, 0x0201f800, 0x0010032e, - 0x4933c857, 0x4d2c0000, 0x59900004, 0x81300580, - 0x02020800, 0x0010032e, 0x0201f800, 0x00109667, - 0x02000800, 0x0010032e, 0x59325809, 0x4d3c0000, - 0x4d400000, 0x59300004, 0x4803c857, 0x4c000000, - 0x0201f800, 0x00106e75, 0x0201f800, 0x00106b6c, - 0x5c000000, 0x8c000516, 0x04000011, 0x592c0010, - 0x4803c857, 0x48025808, 0x41780800, 0x42028000, - 0x00000002, 0x0201f800, 0x00104cf5, 0x4a025c07, - 0x0000ffff, 0x492fc857, 0x0201f800, 0x000203ef, - 0x0201f800, 0x00107cbe, 0x0401f018, 0x4a026203, - 0x00000002, 0x592c0209, 0x8c000512, 0x04020004, - 0x592c0209, 0x8400054e, 0x48025a09, 0x59300407, - 0x82000580, 0x00000006, 0x04020009, 0x811800ca, - 0x81c80c00, 0x58040939, 0x592c000e, 0x80040480, - 0x592c0810, 0x80040480, 0x4802580c, 0x417a7800, - 0x0201f800, 0x001091f1, 0x5c028000, 0x5c027800, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, - 0x59900004, 0x81300580, 0x02020800, 0x0010032e, - 0x0201f800, 0x00109667, 0x02000800, 0x0010032e, - 0x59325809, 0x592c0209, 0x84000540, 0x48025a09, - 0x0401f7bb, 0x491bc857, 0x4dd00000, 0x4c580000, - 0x41780800, 0x8007a0ca, 0x83d3a400, 0x00007600, - 0x4200b000, 0x000007d0, 0x599c0019, 0x8c000506, - 0x04020003, 0x4200b000, 0x000003e8, 0x4a03a005, - 0x80000002, 0x0402400d, 0x4c040000, 0x02004800, - 0x00020a80, 0x5c000800, 0x42000000, 0x00001000, - 0x50000000, 0x82000480, 0x24320001, 0x04001003, - 0x8058b040, 0x04000016, 0x59d01006, 0x82080500, - 0x00006000, 0x82000580, 0x00006000, 0x04000007, - 0x8c08151e, 0x040007ec, 0x59d01006, 0x82080500, - 0x00006000, 0x040207e8, 0x83d3a400, 0x00000020, - 0x80040800, 0x82040480, 0x00000005, 0x040017d9, - 0x5c00b000, 0x5c03a000, 0x1c01f000, 0x41180000, - 0x80040580, 0x04000008, 0x42003000, 0x0010c89b, - 0x58180401, 0x8c000504, 0x040007f0, 0x850e1d6e, - 0x0401f7ee, 0x4a03a005, 0x30000000, 0x59d00006, - 0x4a03a005, 0x30000000, 0x59d00006, 0x497ba003, - 0x497ba007, 0x4a03a005, 0xf0000001, 0x42001800, - 0x00008000, 0x59d00006, 0x8c00050a, 0x04000005, - 0x800c1840, 0x040207fc, 0x0201f800, 0x0010032e, - 0x4a03a005, 0xf0000000, 0x59d00006, 0x850e1d2e, - 0x800410c8, 0x82081400, 0x0000bf32, 0x58081804, - 0x800c19c0, 0x040007d1, 0x580c0004, 0x84000576, - 0x48001804, 0x4933c857, 0x0401f7cc, 0x4803c856, - 0x4dd00000, 0x41780800, 0x8007a0ca, 0x83d3a400, - 0x00007600, 0x4a03a005, 0x80000001, 0x59d00006, - 0x83d3a400, 0x00000020, 0x80040800, 0x82040480, - 0x00000005, 0x040017f8, 0x5c03a000, 0x1c01f000, - 0x59d00006, 0x8c00053e, 0x04000031, 0x59902804, - 0x4817c857, 0x801429c0, 0x04000026, 0x5990000a, - 0x5990080b, 0x5990100c, 0x5990180d, 0x4800280b, - 0x4804280c, 0x4808280d, 0x480c280e, 0x59d00000, - 0x59d00801, 0x59d01002, 0x59d01803, 0x59d02004, - 0x4800280f, 0x48042810, 0x48082811, 0x480c2812, - 0x48102813, 0x58140004, 0x8c00050e, 0x04000011, - 0x59d0000b, 0x59d0080c, 0x59d0100d, 0x59d0180e, - 0x4800281e, 0x4804281f, 0x48082820, 0x480c2821, - 0x59d0000f, 0x59d00810, 0x59d01011, 0x59d01812, - 0x48002c22, 0x48042823, 0x48082824, 0x480c2825, - 0x59900006, 0x82000500, 0xffff0000, 0x48032006, - 0x4a03a005, 0x30000000, 0x59d00006, 0x1c01f000, - 0x4803c856, 0x80204000, 0x50200000, 0x80000540, - 0x04000003, 0x80285040, 0x1c01f000, 0x58300001, - 0x80000540, 0x0400000e, 0x4802600c, 0x40006000, - 0x58300205, 0x82000500, 0x0000000f, 0x82000400, - 0x00100f0a, 0x50004000, 0x802041c0, 0x02000800, - 0x0010032e, 0x80285040, 0x1c01f000, 0x40005000, - 0x1c01f000, 0x00000006, 0x00000009, 0x0000000c, - 0x0000000f, 0x00000012, 0x00000000, 0x00000000, - 0x0000000c, 0x00000000, 0x00000000, 0x00000000, - 0x00100f05, 0x00100f04, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00100f05, 0x00100f04, - 0x00100f01, 0x00100f05, 0x00100f04, 0x00000000, + 0x58380405, 0x80001540, 0x04020002, 0x58381408, + 0x58c83401, 0x58380c09, 0x59303808, 0x497a6013, + 0x497a6014, 0x0201f000, 0x0002015d, 0x592c0409, + 0x8c000502, 0x040007b1, 0x592c040a, 0x80000540, + 0x040007ae, 0x82000c80, 0x00000002, 0x04001011, + 0x58380001, 0x80007540, 0x02000800, 0x0010032e, + 0x58380205, 0x82000500, 0x0000000f, 0x82000400, + 0x00100f0b, 0x50004000, 0x40040000, 0x800409c0, + 0x04000005, 0x82040c80, 0x00000005, 0x040217f1, + 0x80204400, 0x50200000, 0x80387c00, 0x583c2800, + 0x583c2001, 0x583c1002, 0x592c0a08, 0x592c4c09, + 0x592c300e, 0x59303808, 0x497a6013, 0x497a6014, + 0x4816600f, 0x48126010, 0x480a6011, 0x481a6012, + 0x80040840, 0x4806600e, 0x02000000, 0x00020165, + 0x80204000, 0x50201800, 0x800c19c0, 0x0402000c, + 0x58380001, 0x80007540, 0x02000800, 0x0010032e, + 0x58380205, 0x82000500, 0x0000000f, 0x82000400, + 0x00100f0b, 0x50004000, 0x50201800, 0x483a600c, + 0x480e600b, 0x4822600d, 0x0201f000, 0x00020165, + 0x4803c856, 0x592c0209, 0x8c00051e, 0x04020017, + 0x50200000, 0x80306c00, 0x40240000, 0x0c01f001, + 0x00100c18, 0x00100c18, 0x00100c21, 0x00100c18, + 0x00100c18, 0x00100c18, 0x00100c18, 0x00100c18, + 0x00100c21, 0x00100c18, 0x00100c21, 0x00100c18, + 0x00100c18, 0x00100c21, 0x00100c18, 0x00100c18, + 0x0201f800, 0x0010032e, 0x8400051e, 0x48025a09, + 0x50200000, 0x80306c00, 0x58343801, 0x481e6010, + 0x0401f007, 0x58341802, 0x58342800, 0x58343801, + 0x480e6011, 0x4816600f, 0x481e6010, 0x0401f2c2, + 0x4933c857, 0x5931f809, 0x59301006, 0x800811c0, + 0x0400000b, 0x41780800, 0x42000000, 0x0000000a, + 0x0201f800, 0x00106c9d, 0x80080102, 0x04020002, + 0x84001542, 0x80081040, 0x4809fc07, 0x4a026006, + 0x00000002, 0x592c040a, 0x82000500, 0x00000008, + 0x0400000b, 0x0401f839, 0x59300203, 0x82000580, + 0x00000004, 0x04020005, 0x42027000, 0x00000048, + 0x0201f800, 0x00020bc1, 0x1c01f000, 0x4cfc0000, + 0x58fc0205, 0x82000500, 0x000000ff, 0x82000580, + 0x00000048, 0x04020009, 0x58fc0409, 0x8c000500, + 0x04000006, 0x58fc080c, 0x8c040d16, 0x0400001f, + 0x58fc0008, 0x0401f00a, 0x58fc0409, 0x8c000512, + 0x0402001c, 0x58fc0c0a, 0x8c040d16, 0x04020003, + 0x5c01f800, 0x1c01f000, 0x58fc000b, 0x4c000000, + 0x4d2c0000, 0x40fe5800, 0x59300012, 0x0201f800, + 0x0010a2e2, 0x5c025800, 0x80000d40, 0x5c000000, + 0x80040580, 0x04020009, 0x59300008, 0x84000500, + 0x48026008, 0x42027000, 0x00000048, 0x5c01f800, + 0x0201f000, 0x00020bc1, 0x5c01f800, 0x1c01f000, + 0x58fdf80a, 0x0401f7e4, 0x5c000000, 0x4c000000, + 0x4803c857, 0x4933c857, 0x59b808ea, 0x82040d00, + 0x00000007, 0x82040580, 0x00000000, 0x04000025, + 0x82040580, 0x00000003, 0x04000022, 0x59300407, + 0x4c000000, 0x4a026407, 0x00000000, 0x42003000, + 0x00000041, 0x4a0370e5, 0x00003000, 0x42000000, + 0x50000000, 0x41300800, 0x4c180000, 0x0401fc38, + 0x5c003000, 0x0400000e, 0x42000000, 0x0000001e, + 0x80000040, 0x040207ff, 0x80183040, 0x040207f4, + 0x42000000, 0x40000000, 0x41300800, 0x0401fc2c, + 0x59880146, 0x80000000, 0x48031146, 0x4a0370e5, + 0x00002000, 0x5c000000, 0x48026407, 0x1c01f000, + 0x59300008, 0x84000500, 0x48026008, 0x0401f7fc, + 0x59c00007, 0x4a038006, 0x30000000, 0x40000000, + 0x59c00007, 0x8c00050a, 0x040207fe, 0x1c01f000, + 0x5c000000, 0x4c000000, 0x4803c857, 0x42000800, + 0x00000001, 0x0201f800, 0x00101bdf, 0x4dc00000, + 0x4a0370e8, 0x00000000, 0x42038000, 0x00007720, + 0x0401ffec, 0x42038000, 0x00007700, 0x0401ffe9, + 0x0201f800, 0x001050f7, 0x04020017, 0x4a038891, + 0x0000ffff, 0x497b8880, 0x4ce80000, 0x4201d000, + 0x00000016, 0x0201f800, 0x00106661, 0x497b8892, + 0x4201d000, 0x00000016, 0x0201f800, 0x00106661, + 0x5c01d000, 0x42000000, 0x0010cf66, 0x0201f800, + 0x0010bfb3, 0x0401f812, 0x5c038000, 0x0201f000, + 0x00105223, 0x0401f830, 0x4c080000, 0x4c140000, + 0x42000000, 0x0010cf67, 0x0201f800, 0x0010bfb3, + 0x0401f807, 0x5c002800, 0x5c001000, 0x48178892, + 0x480b8880, 0x5c038000, 0x1c01f000, 0x496fc857, + 0x836c0580, 0x00000003, 0x0402000b, 0x4c080000, + 0x4c0c0000, 0x42001000, 0x00008048, 0x42001800, + 0x0000ffff, 0x0201f800, 0x001039ac, 0x5c001800, + 0x5c001000, 0x42000800, 0x0000003c, 0x0201f800, + 0x001012d2, 0x59a8006d, 0x80000540, 0x04000005, + 0x59a8106e, 0x800811c0, 0x02020800, 0x00101b4a, + 0x4a038891, 0x0000ffff, 0x4a03900d, 0x00000040, + 0x0201f800, 0x00100698, 0x4a0370e8, 0x00000001, + 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, + 0x59c41080, 0x497b8880, 0x4ce80000, 0x4201d000, + 0x00000016, 0x4c080000, 0x0201f800, 0x00106661, + 0x5c001000, 0x5c01d000, 0x59c42892, 0x497b8892, + 0x0201f800, 0x001050f7, 0x04020002, 0x1c01f000, + 0x42002000, 0x00000260, 0x59c418a4, 0x820c1d00, + 0x0000000f, 0x820c0580, 0x00000000, 0x04000010, + 0x59c41805, 0x820c1d00, 0x00000001, 0x0402000e, + 0x59c418a4, 0x820c1d00, 0x0000000f, 0x820c0480, + 0x00000007, 0x04001004, 0x820c0480, 0x0000000c, + 0x04001003, 0x80102040, 0x040207ec, 0x497b8891, + 0x1c01f000, 0x4c100000, 0x42002000, 0x00000019, + 0x4a038805, 0x00000001, 0x0201f800, 0x0010193a, + 0x59c41805, 0x820c1d00, 0x00000001, 0x04000005, + 0x80102040, 0x040207f7, 0x5c002000, 0x0401f7f0, + 0x5c002000, 0x0401f7ec, 0x4803c856, 0x1c01f000, + 0x00100d58, 0x00100d58, 0x00100d58, 0x00100d7c, + 0x00100d58, 0x00100d58, 0x00100d58, 0x00100d58, + 0x00100d58, 0x00100d7c, 0x00100d58, 0x00100d5a, + 0x00100d58, 0x00100d58, 0x00100d58, 0x00100d58, + 0x0201f800, 0x0010032e, 0x82040580, 0x0000001b, + 0x0400001a, 0x82040580, 0x0000002b, 0x04000017, + 0x82040580, 0x0000003b, 0x02020800, 0x0010032e, + 0x592c020b, 0x8c000500, 0x0400008d, 0x592c1a08, + 0x82040500, 0x0000000f, 0x82000400, 0x00100f0b, + 0x50001000, 0x50080000, 0x59302014, 0x4802600b, + 0x492e600c, 0x480a600d, 0x480e600e, 0x48126013, + 0x5c025800, 0x1c01f000, 0x592c0010, 0x48026012, + 0x592c0011, 0x48026014, 0x592c1a08, 0x0401f7ed, + 0x82040500, 0x0000000f, 0x82000400, 0x00100f0b, + 0x50001000, 0x50080000, 0x592c1a08, 0x4802600b, + 0x492e600c, 0x480a600d, 0x480e600e, 0x497a6013, + 0x0401f7ec, 0x8c040d00, 0x04020069, 0x82040d00, + 0x00000080, 0x04000066, 0x0201f000, 0x00020178, + 0x0401fb75, 0x843c7d4e, 0x0201f000, 0x00020185, + 0x0401fb71, 0x843c7d4e, 0x0201f000, 0x000201a0, + 0x59300014, 0x59301013, 0x80080580, 0x04020018, + 0x59300004, 0x8c00050e, 0x0400000a, 0x59300014, + 0x80000540, 0x04020004, 0x42007800, 0x800000a5, + 0x0401f04c, 0x42007800, 0x80000085, 0x0401f003, + 0x42007800, 0x80000005, 0x592c1209, 0x82080500, + 0xffff7fff, 0x48025a09, 0x8c08151e, 0x04020041, + 0x823c7d40, 0x00000020, 0x0401f03e, 0x480bc857, + 0x42000000, 0x0010cf13, 0x0201f800, 0x0010bfb3, + 0x59302014, 0x59300415, 0x4803c857, 0x8c000514, + 0x04020011, 0x599c1819, 0x8c0c1d12, 0x0400000b, + 0x592c0810, 0x59300016, 0x80040c80, 0x04000005, + 0x04001004, 0x80040000, 0x80140480, 0x0400100a, + 0x0201f800, 0x00107f37, 0x820c1d40, 0x00000001, + 0x0401f026, 0x84000514, 0x48026415, 0x48126016, + 0x4813c857, 0x0401f95a, 0x04020020, 0x59300004, + 0x8c00050e, 0x04000004, 0x42007800, 0x80000085, + 0x0401f003, 0x42007800, 0x80000005, 0x5930500e, + 0x592c0209, 0x4803c857, 0x8c00051e, 0x04020005, + 0x823c7d40, 0x00000020, 0x5930400d, 0x0401f004, + 0x8400051e, 0x48025a09, 0x0401f903, 0x50201800, + 0x480e600b, 0x4832600c, 0x4822600d, 0x482a600e, + 0x480fc857, 0x4833c857, 0x4823c857, 0x482bc857, + 0x80000580, 0x483e6004, 0x1c01f000, 0x0201f800, + 0x0010032e, 0x4933c857, 0x4d2c0000, 0x59900004, + 0x81300580, 0x02020800, 0x0010032e, 0x0201f800, + 0x0010989f, 0x02000800, 0x0010032e, 0x59325809, + 0x4d3c0000, 0x4d400000, 0x59300004, 0x4803c857, + 0x4c000000, 0x0201f800, 0x0010707a, 0x0201f800, + 0x00106d71, 0x5c000000, 0x8c000516, 0x04000011, + 0x592c0010, 0x4803c857, 0x48025808, 0x41780800, + 0x42028000, 0x00000002, 0x0201f800, 0x00104e1a, + 0x4a025c07, 0x0000ffff, 0x492fc857, 0x0201f800, + 0x000203ef, 0x0201f800, 0x00107eb4, 0x0401f018, + 0x4a026203, 0x00000002, 0x592c0209, 0x8c000512, + 0x04020004, 0x592c0209, 0x8400054e, 0x48025a09, + 0x59300407, 0x82000580, 0x00000006, 0x04020009, + 0x811800ca, 0x81c80c00, 0x58040939, 0x592c000e, + 0x80040480, 0x592c0810, 0x80040480, 0x4802580c, + 0x417a7800, 0x0201f800, 0x00109425, 0x5c028000, + 0x5c027800, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x4d2c0000, 0x59900004, 0x81300580, 0x02020800, + 0x0010032e, 0x0201f800, 0x0010989f, 0x02000800, + 0x0010032e, 0x59325809, 0x592c0209, 0x84000540, + 0x48025a09, 0x0401f7bb, 0x491bc857, 0x4dd00000, + 0x4c580000, 0x41780800, 0x8007a0ca, 0x83d3a400, + 0x00007600, 0x4200b000, 0x000007d0, 0x599c0019, + 0x8c000506, 0x04020003, 0x4200b000, 0x000003e8, + 0x4a03a005, 0x80000002, 0x0402400d, 0x4c040000, + 0x02004800, 0x00020a80, 0x5c000800, 0x42000000, + 0x00001000, 0x50000000, 0x82000480, 0x24320001, + 0x04001003, 0x8058b040, 0x04000016, 0x59d01006, + 0x82080500, 0x00006000, 0x82000580, 0x00006000, + 0x04000007, 0x8c08151e, 0x040007ec, 0x59d01006, + 0x82080500, 0x00006000, 0x040207e8, 0x83d3a400, + 0x00000020, 0x80040800, 0x82040480, 0x00000005, + 0x040017d9, 0x5c00b000, 0x5c03a000, 0x1c01f000, + 0x41180000, 0x80040580, 0x04000008, 0x42003000, + 0x0010cb9b, 0x58180401, 0x8c000504, 0x040007f0, + 0x850e1d6e, 0x0401f7ee, 0x4a03a005, 0x30000000, + 0x59d00006, 0x4a03a005, 0x30000000, 0x59d00006, + 0x497ba003, 0x497ba007, 0x4a03a005, 0xf0000001, + 0x42001800, 0x00008000, 0x59d00006, 0x8c00050a, + 0x04000005, 0x800c1840, 0x040207fc, 0x0201f800, + 0x0010032e, 0x4a03a005, 0xf0000000, 0x59d00006, + 0x850e1d2e, 0x800410c8, 0x82081400, 0x0000bf32, + 0x58081804, 0x800c19c0, 0x040007d1, 0x580c0004, + 0x84000576, 0x48001804, 0x4933c857, 0x0401f7cc, + 0x4803c856, 0x4dd00000, 0x41780800, 0x8007a0ca, + 0x83d3a400, 0x00007600, 0x4a03a005, 0x80000001, + 0x59d00006, 0x83d3a400, 0x00000020, 0x80040800, + 0x82040480, 0x00000005, 0x040017f8, 0x5c03a000, + 0x1c01f000, 0x59d00006, 0x8c00053e, 0x04000031, + 0x59902804, 0x4817c857, 0x801429c0, 0x04000026, + 0x5990000a, 0x5990080b, 0x5990100c, 0x5990180d, + 0x4800280b, 0x4804280c, 0x4808280d, 0x480c280e, + 0x59d00000, 0x59d00801, 0x59d01002, 0x59d01803, + 0x59d02004, 0x4800280f, 0x48042810, 0x48082811, + 0x480c2812, 0x48102813, 0x58140004, 0x8c00050e, + 0x04000011, 0x59d0000b, 0x59d0080c, 0x59d0100d, + 0x59d0180e, 0x4800281e, 0x4804281f, 0x48082820, + 0x480c2821, 0x59d0000f, 0x59d00810, 0x59d01011, + 0x59d01812, 0x48002c22, 0x48042823, 0x48082824, + 0x480c2825, 0x59900006, 0x82000500, 0xffff0000, + 0x48032006, 0x4a03a005, 0x30000000, 0x59d00006, + 0x1c01f000, 0x4803c856, 0x80204000, 0x50200000, + 0x80000540, 0x04000003, 0x80285040, 0x1c01f000, + 0x58300001, 0x80000540, 0x0400000e, 0x4802600c, + 0x40006000, 0x58300205, 0x82000500, 0x0000000f, + 0x82000400, 0x00100f0b, 0x50004000, 0x802041c0, + 0x02000800, 0x0010032e, 0x80285040, 0x1c01f000, + 0x40005000, 0x1c01f000, 0x00000006, 0x00000009, + 0x0000000c, 0x0000000f, 0x00000012, 0x00000000, + 0x00000000, 0x0000000c, 0x00000000, 0x00000000, + 0x00000000, 0x00100f06, 0x00100f05, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00100f06, + 0x00100f05, 0x00100f02, 0x00100f06, 0x00100f05, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00100f05, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00100f05, 0x00100f05, - 0x00100f05, 0x00000000, 0x00100f05, 0x00000000, - 0x00000000, 0x00000000, 0x4813c857, 0x492fc857, - 0x4933c857, 0x48126013, 0x592c5208, 0x802851c0, - 0x04000075, 0x59300008, 0x8c000516, 0x04000020, - 0x592c0205, 0x82000500, 0x0000000f, 0x82000580, - 0x00000002, 0x04020003, 0x592c000e, 0x80102480, - 0x801021c0, 0x41781000, 0x04000012, 0x592c6001, - 0x58300406, 0x58300a07, 0x82000500, 0x00000003, - 0x82000580, 0x00000000, 0x04000003, 0x82040c00, - 0x00000008, 0x40040000, 0x40101000, 0x41780800, - 0x0201f800, 0x00106a98, 0x800409c0, 0x04020056, - 0x0401f9e3, 0x0400004c, 0x0401f053, 0x59300004, - 0x8c00050e, 0x04000007, 0x0401fa73, 0x0402004e, - 0x592c6001, 0x42004000, 0x00100f02, 0x0401f00c, - 0x412c6000, 0x0401f84b, 0x04000009, 0x82240580, - 0x00000002, 0x04020003, 0x5830000e, 0x80102480, - 0x50200000, 0x80004540, 0x0400003f, 0x50200000, - 0x80000540, 0x0400000b, 0x80301400, 0x58080002, - 0x80102480, 0x0400101e, 0x801021c0, 0x04000009, - 0x80285040, 0x04000034, 0x80204000, 0x0401f7f4, - 0x58300001, 0x80006540, 0x0400002f, 0x0401f7e6, - 0x80285040, 0x0400002c, 0x80204000, 0x50200000, - 0x80000540, 0x0402000a, 0x58300001, 0x80006540, - 0x04000025, 0x58300205, 0x82004d00, 0x0000000f, - 0x82244400, 0x00100f0a, 0x50204000, 0x592c0209, - 0x8400051e, 0x48025a09, 0x0401f013, 0x80102080, - 0x80102000, 0x48126011, 0x4813c857, 0x58080802, - 0x40100000, 0x80042480, 0x02001800, 0x0010032e, - 0x58080000, 0x58081801, 0x80102400, 0x4812600f, - 0x480e6010, 0x4813c857, 0x592c0209, 0x8400055e, - 0x48025a09, 0x4833c857, 0x4823c857, 0x482bc857, - 0x4832600c, 0x4822600d, 0x482a600e, 0x80000580, - 0x0401f003, 0x82000540, 0x00000001, 0x1c01f000, - 0x58300205, 0x82004d00, 0x0000000f, 0x82244400, - 0x00100f0a, 0x82000500, 0x000000ff, 0x82000580, - 0x00000029, 0x0402001b, 0x50204000, 0x592c040a, - 0x80000540, 0x02000800, 0x0010032e, 0x82000c80, - 0x00000002, 0x04001011, 0x58300001, 0x80006540, - 0x02000800, 0x0010032e, 0x58300205, 0x82000500, - 0x0000000f, 0x82000400, 0x00100f0a, 0x50004000, - 0x40040000, 0x800409c0, 0x04000006, 0x82040c80, - 0x00000005, 0x040217f1, 0x80204400, 0x80000580, - 0x1c01f000, 0x4c5c0000, 0x59e4b800, 0x485fc857, - 0x825c0500, 0x0000001f, 0x04000004, 0x59e40862, - 0x0201f800, 0x0010032e, 0x825c0500, 0x000000e0, - 0x02000800, 0x0010032e, 0x8c5cbd0e, 0x04020807, - 0x8c5cbd0c, 0x04020809, 0x8c5cbd0a, 0x04020873, - 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4a03c800, - 0x00000080, 0x1c01f000, 0x4d2c0000, 0x42007800, - 0x0010ccb9, 0x583c0003, 0x583c0804, 0x80040540, - 0x0400003a, 0x42000800, 0x0010cb5c, 0x50065800, - 0x592c0002, 0x82000580, 0x00000000, 0x04000033, - 0x59e40050, 0x59e40852, 0x80040480, 0x82000500, - 0xfffffc00, 0x04020005, 0x59e40050, 0x59e40851, - 0x80040800, 0x80040480, 0x82000c80, 0x00000400, - 0x59e40050, 0x80041400, 0x480bc857, 0x50080000, - 0x58080801, 0x80040540, 0x04000020, 0x480bc857, - 0x480a5803, 0x583c1009, 0x583c000a, 0x80080580, - 0x04020005, 0x583c0000, 0x84000550, 0x48007800, - 0x41781000, 0x82080400, 0x00001000, 0x4803c857, - 0x48007809, 0x583c0003, 0x80081400, 0x480bc857, - 0x583c0804, 0x4a025801, 0x00000000, 0x4a025808, - 0x0010102a, 0x480a5806, 0x48065807, 0x59e40053, - 0x800000c4, 0x48025805, 0x412c1000, 0x492fc857, - 0x0201f800, 0x00020016, 0x5c025800, 0x4a03c800, - 0x00000040, 0x1c01f000, 0x42007800, 0x0010cb5c, - 0x503c7800, 0x4a007802, 0x00000100, 0x42007800, - 0x0010ccb9, 0x583c0000, 0x84000552, 0x48007800, - 0x583c100c, 0x480bc857, 0x80081000, 0x4808780c, - 0x583c180b, 0x800c19c0, 0x04000017, 0x82080500, - 0x00000003, 0x04020014, 0x583c0007, 0x4803c857, - 0x583c2008, 0x4813c857, 0x80102000, 0x80100580, - 0x04020002, 0x41782000, 0x48107808, 0x400c0000, - 0x80080580, 0x04020008, 0x4978780c, 0x42001800, - 0x00000001, 0x42001000, 0x00008028, 0x0201f800, - 0x001038bc, 0x1c01f000, 0x4a03c800, 0x00000020, - 0x0201f800, 0x0010bc80, 0x59e40000, 0x1c01f000, - 0x42000000, 0x00001000, 0x50000000, 0x82000480, - 0x24320001, 0x0400100d, 0x0201f800, 0x0010bdab, - 0x04000008, 0x42000000, 0x00007a42, 0x50007000, - 0x8c387520, 0x04020003, 0x84387560, 0x44380000, - 0x4a030000, 0x00000000, 0x1c01f000, 0x4d2c0000, - 0x4a007000, 0x00000000, 0x82040d00, 0x43000f80, - 0x02020800, 0x0010032e, 0x58380008, 0x4803c00f, - 0x4a0370e4, 0x00003000, 0x0201f800, 0x00109aac, - 0x583a5807, 0x592c0000, 0x48007007, 0x800001c0, - 0x04020002, 0x49787006, 0x0201f800, 0x00100594, - 0x5c025800, 0x42007000, 0x00020cf0, 0x0201f000, - 0x0002002c, 0x4803c856, 0x4c3c0000, 0x4d2c0000, - 0x4d300000, 0x58300009, 0x80025d40, 0x02000800, - 0x0010032e, 0x592e6009, 0x4c300000, 0x0201f800, - 0x00109acc, 0x5c006000, 0x02000800, 0x0010032e, - 0x58300002, 0x82000580, 0x00000100, 0x0402000f, - 0x5930780c, 0x583c0001, 0x80007d40, 0x0400000e, - 0x4802600c, 0x82000400, 0x00000002, 0x48006003, - 0x583c0000, 0x48006005, 0x40301000, 0x0201f800, - 0x00020016, 0x0401f00c, 0x4a025a07, 0x00000002, - 0x492fc857, 0x4c300000, 0x0201f800, 0x000203ef, - 0x5c025800, 0x0201f800, 0x00100594, 0x0201f800, - 0x00020b9d, 0x5c026000, 0x5c025800, 0x5c007800, - 0x1c01f000, 0x4803c856, 0x4d2c0000, 0x4d300000, - 0x42007000, 0x00020cf0, 0x58380800, 0x82040580, - 0x00000002, 0x04020011, 0x58386001, 0x58300009, - 0x812c0580, 0x0402000d, 0x59e00004, 0x8c00050e, - 0x040007fe, 0x59dc0006, 0x4803c857, 0x4a03b805, - 0x20000000, 0x8c00053e, 0x040007f8, 0x4a007000, - 0x00000000, 0x0401f019, 0x58386005, 0x40305000, - 0x803061c0, 0x02000800, 0x0010032e, 0x58300009, - 0x812c0580, 0x04000004, 0x40305000, 0x58306000, - 0x0401f7f8, 0x40280000, 0x80300580, 0x58300000, - 0x04000006, 0x48005000, 0x800001c0, 0x04020007, - 0x48287004, 0x0401f005, 0x800001c0, 0x04020002, - 0x48007004, 0x48007005, 0x40325800, 0x0201f800, - 0x00100594, 0x5c026000, 0x5c025800, 0x0201f000, - 0x00020026, 0x59300024, 0x48025811, 0x59300025, - 0x48025812, 0x59300a22, 0x8c040d0c, 0x04020007, - 0x5930001f, 0x59300a20, 0x800408e0, 0x80040540, - 0x5930081e, 0x0401f006, 0x5930081f, 0x59300220, - 0x800408e0, 0x80040d40, 0x5930001e, 0x9c0001c0, - 0x9c0409c0, 0x48025813, 0x48065814, 0x1c01f000, - 0x592c0001, 0x80003540, 0x02000800, 0x0010032e, - 0x58180a05, 0x82040d00, 0x000000ff, 0x82040580, - 0x0000004a, 0x02020800, 0x0010032e, 0x592c1012, - 0x592c1a13, 0x58182206, 0x592c2c13, 0x592c0014, - 0x800000e0, 0x80142d40, 0x592c0014, 0x80003920, - 0x58184406, 0x58180207, 0x800048e0, 0x80244d40, - 0x58180008, 0x48026029, 0x8c20450c, 0x04020009, - 0x901c51c0, 0x841401c0, 0x82003d00, 0x0000ffff, - 0x80140120, 0x80280540, 0x9c0029c0, 0x0401f003, - 0x9c1429c0, 0x841c39c0, 0x480a601e, 0x480e601f, - 0x48126420, 0x48126220, 0x48166021, 0x481e6422, - 0x48226222, 0x48266023, 0x1c01f000, 0x592c0001, - 0x80006540, 0x02000800, 0x0010032e, 0x58300a05, - 0x82040d00, 0x000000ff, 0x82040580, 0x0000004a, - 0x02020800, 0x0010032e, 0x58302c06, 0x8c142d06, - 0x58300206, 0x04000002, 0x80080400, 0x48026420, - 0x48026220, 0x58300207, 0x800008e0, 0x80040540, - 0x48026023, 0x8c142d0a, 0x04020004, 0x592c0012, - 0x80080400, 0x4802601e, 0x82142d00, 0x00000003, - 0x58303207, 0x82140580, 0x00000002, 0x04000011, - 0x82140580, 0x00000001, 0x04000009, 0x40080800, - 0x82180400, 0x00000008, 0x40001000, 0x0201f800, - 0x00106a79, 0x40042000, 0x0401f006, 0x40080800, - 0x40181000, 0x0201f800, 0x00106a79, 0x40042000, - 0x4c100000, 0x0401fe43, 0x02000800, 0x0010032e, - 0x5c002000, 0x50200000, 0x80004540, 0x0400005b, - 0x58300a05, 0x82040d00, 0x000000ff, 0x82040580, - 0x0000004a, 0x04020002, 0x80204000, 0x50200000, - 0x80000540, 0x0400000b, 0x80301400, 0x58080002, - 0x80102480, 0x0400101e, 0x801021c0, 0x04000009, - 0x80285040, 0x04000049, 0x80204000, 0x0401f7f4, - 0x58300001, 0x80006540, 0x04000044, 0x0401f7e1, - 0x80285040, 0x04000041, 0x80204000, 0x50200000, - 0x80000540, 0x0402000a, 0x58300001, 0x80006540, - 0x0400003a, 0x58300205, 0x82004d00, 0x0000000f, - 0x82244400, 0x00100f0a, 0x50204000, 0x592c0209, - 0x8400051e, 0x48025a09, 0x0401f011, 0x80102080, - 0x80102000, 0x48126011, 0x4813c857, 0x58080802, - 0x40100000, 0x80042480, 0x02001800, 0x0010032e, - 0x58080000, 0x80102400, 0x4812600f, 0x4813c857, - 0x592c0209, 0x8400055e, 0x48025a09, 0x59300008, - 0x8400052c, 0x48026008, 0x592c1001, 0x58080406, - 0x82000500, 0x00000003, 0x82000580, 0x00000001, - 0x04020014, 0x599c0019, 0x8c00050c, 0x04020011, - 0x82280580, 0x00000001, 0x04020003, 0x59300811, - 0x0401f008, 0x80280840, 0x58080207, 0x40001000, - 0x0201f800, 0x00106a79, 0x59300011, 0x80040c00, - 0x48066012, 0x59300008, 0x8400056c, 0x48026008, + 0x00000000, 0x00100f06, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00100f06, + 0x00100f06, 0x00100f06, 0x00000000, 0x00100f06, + 0x00000000, 0x00000000, 0x00000000, 0x4813c857, + 0x492fc857, 0x4933c857, 0x48126013, 0x592c5208, + 0x802851c0, 0x04000075, 0x59300008, 0x8c000516, + 0x04000020, 0x592c0205, 0x82000500, 0x0000000f, + 0x82000580, 0x00000002, 0x04020003, 0x592c000e, + 0x80102480, 0x801021c0, 0x41781000, 0x04000012, + 0x592c6001, 0x58300406, 0x58300a07, 0x82000500, + 0x00000003, 0x82000580, 0x00000000, 0x04000003, + 0x82040c00, 0x00000008, 0x40040000, 0x40101000, + 0x41780800, 0x0201f800, 0x00106c9d, 0x800409c0, + 0x04020056, 0x0401f9e3, 0x0400004c, 0x0401f053, + 0x59300004, 0x8c00050e, 0x04000007, 0x0401fa73, + 0x0402004e, 0x592c6001, 0x42004000, 0x00100f03, + 0x0401f00c, 0x412c6000, 0x0401f84b, 0x04000009, + 0x82240580, 0x00000002, 0x04020003, 0x5830000e, + 0x80102480, 0x50200000, 0x80004540, 0x0400003f, + 0x50200000, 0x80000540, 0x0400000b, 0x80301400, + 0x58080002, 0x80102480, 0x0400101e, 0x801021c0, + 0x04000009, 0x80285040, 0x04000034, 0x80204000, + 0x0401f7f4, 0x58300001, 0x80006540, 0x0400002f, + 0x0401f7e6, 0x80285040, 0x0400002c, 0x80204000, + 0x50200000, 0x80000540, 0x0402000a, 0x58300001, + 0x80006540, 0x04000025, 0x58300205, 0x82004d00, + 0x0000000f, 0x82244400, 0x00100f0b, 0x50204000, + 0x592c0209, 0x8400051e, 0x48025a09, 0x0401f013, + 0x80102080, 0x80102000, 0x48126011, 0x4813c857, + 0x58080802, 0x40100000, 0x80042480, 0x02001800, + 0x0010032e, 0x58080000, 0x58081801, 0x80102400, + 0x4812600f, 0x480e6010, 0x4813c857, 0x592c0209, + 0x8400055e, 0x48025a09, 0x4833c857, 0x4823c857, + 0x482bc857, 0x4832600c, 0x4822600d, 0x482a600e, 0x80000580, 0x0401f003, 0x82000540, 0x00000001, - 0x1c01f000, 0x592c6801, 0x803469c0, 0x0400001a, - 0x592c0205, 0x82000500, 0x000000ff, 0x82000580, - 0x00000072, 0x04020003, 0x592c000e, 0x80102480, - 0x58347802, 0x58347406, 0x82380500, 0x00000003, - 0x0c01f001, 0x001011e0, 0x001011dd, 0x001011e3, - 0x001011e5, 0x803c00c6, 0x80102400, 0x0401f004, - 0x803c00c6, 0x80102480, 0x04001003, 0x80000580, - 0x1c01f000, 0x82000540, 0x00000001, 0x1c01f000, - 0x4803c856, 0x42000800, 0x0000003c, 0x48079000, - 0x59c80000, 0x80040500, 0x040207fe, 0x497b9005, - 0x4a039035, 0x00880200, 0x59a8000d, 0x800000e0, - 0x4803900e, 0x4a039011, 0x0000002c, 0x4a03900f, - 0x00111264, 0x4a039010, 0x00111264, 0x4a039015, - 0x0000007f, 0x4a03900d, 0x00000040, 0x4a039000, - 0x00001600, 0x1c01f000, 0x59c80007, 0x8c000508, - 0x040208c9, 0x59c80800, 0x8c040d16, 0x04020004, - 0x82000500, 0x00000006, 0x0c01f005, 0x4807c857, - 0x82000500, 0x0000000e, 0x0c01f001, 0x00101221, - 0x0010121f, 0x00105b9e, 0x0010121f, 0x00101223, - 0x0010121f, 0x00101223, 0x00101223, 0x0010121f, - 0x0010121f, 0x0010121f, 0x0010121f, 0x00101223, - 0x0010121f, 0x00101223, 0x0010121f, 0x0201f800, - 0x0010032e, 0x4803c857, 0x1c01f000, 0x59c8080c, - 0x4807c857, 0x82040500, 0x00006000, 0x04000004, - 0x0201f800, 0x0010bc43, 0x0401f006, 0x82040500, - 0x007f0000, 0x04000006, 0x0201f800, 0x0010bc15, - 0x0201f800, 0x00106f81, 0x0401f03c, 0x82040500, - 0x00000014, 0x04000014, 0x0201f800, 0x0010bc72, - 0x836c0580, 0x00000003, 0x0400000d, 0x0201f800, - 0x00104fc6, 0x04000004, 0x0201f800, 0x00104011, - 0x0401f007, 0x4a035014, 0x00000001, 0x4202d800, - 0x00000001, 0x0201f800, 0x00104f20, 0x0401f828, - 0x0401f026, 0x82040500, 0x00001c00, 0x04000005, - 0x0201f800, 0x0010bc51, 0x0401f821, 0x0401f01f, - 0x82040500, 0x00000140, 0x04000005, 0x0201f800, - 0x0010bc64, 0x0401f81a, 0x0401f018, 0x82040500, - 0x00008000, 0x04000015, 0x0201f800, 0x00104fc6, - 0x0400000f, 0x59c400a4, 0x82000500, 0x0000000f, - 0x82000580, 0x0000000b, 0x04020009, 0x4c040000, - 0x0201f800, 0x0010402d, 0x42000000, 0x0000001e, - 0x80000040, 0x040207ff, 0x5c000800, 0x0201f800, - 0x0010bc3c, 0x0401f802, 0x1c01f000, 0x4c0c0000, - 0x4c100000, 0x4c140000, 0x0201f800, 0x00100caf, - 0x5c002800, 0x5c002000, 0x5c001800, 0x1c01f000, - 0x4803c856, 0x59a80804, 0x59a80020, 0x82000500, - 0xfffff000, 0x80040540, 0x48035020, 0x59a80024, - 0x82000500, 0xfffff000, 0x80040540, 0x48035024, - 0x48078882, 0x82041c00, 0x0000000f, 0x800c1908, - 0x820c1c00, 0x00000004, 0x400c2000, 0x901029c0, - 0x82040480, 0x000001e4, 0x04021005, 0x42001000, - 0x00000008, 0x801020c6, 0x0401f031, 0x82040480, - 0x00000230, 0x04021009, 0x42001000, 0x00000007, - 0x801000c2, 0x800000c2, 0x80100400, 0x80100400, - 0x80102400, 0x0401f026, 0x82040480, 0x00000298, - 0x04021008, 0x42001000, 0x00000006, 0x801000c2, - 0x800000c2, 0x80100400, 0x80102400, 0x0401f01c, - 0x82040480, 0x00000328, 0x04021007, 0x42001000, - 0x00000005, 0x801000c2, 0x800000c2, 0x80102400, - 0x0401f013, 0x82040480, 0x00000404, 0x04021005, - 0x42001000, 0x00000004, 0x801020c4, 0x0401f00c, - 0x82040480, 0x0000056c, 0x04021006, 0x42001000, - 0x00000003, 0x801000c2, 0x80102400, 0x0401f004, - 0x42001000, 0x00000002, 0x801020c2, 0x82100480, - 0x00000110, 0x80000080, 0x80002000, 0x800800d0, - 0x80140540, 0x80100540, 0x48039035, 0x48035075, - 0x1c01f000, 0x59c80815, 0x0201f800, 0x00100323, - 0x40680800, 0x82040d00, 0x0000007c, 0x48079000, - 0x59c80000, 0x80040500, 0x040207fe, 0x8c040d04, - 0x04000003, 0x59c80035, 0x48039035, 0x59c80000, - 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, - 0x4803c856, 0x497b88a9, 0x4a038807, 0x00000001, - 0x497b8807, 0x59c40005, 0x48038805, 0x0201f800, - 0x0010181b, 0x4201d000, 0x000001f4, 0x0201f800, - 0x0010645c, 0x497b880e, 0x4200b000, 0x000001f4, - 0x42000000, 0x00000001, 0x42000800, 0x00000014, - 0x0201f800, 0x00101944, 0x42000800, 0x00000014, - 0x0201f800, 0x0010193c, 0x8c040d00, 0x04000005, - 0x8058b040, 0x040207f3, 0x0201f800, 0x0010032e, - 0x4200b000, 0x00000032, 0x42000000, 0x00000001, - 0x42000800, 0x000000b4, 0x0201f800, 0x00101944, - 0x42000800, 0x000000b4, 0x0201f800, 0x0010193c, - 0x8c040d00, 0x04000005, 0x8058b040, 0x040207f3, - 0x0201f800, 0x0010032e, 0x59c40005, 0x48038805, - 0x42000000, 0x00000083, 0x59e00803, 0x82040d00, - 0x00030000, 0x82040d80, 0x00020000, 0x04020003, - 0x42000000, 0x00000089, 0x800008d0, 0x4a035044, - 0x00008900, 0x4a035045, 0x00008900, 0x48075046, - 0x42000800, 0x000000e0, 0x0201f800, 0x00101944, - 0x42000800, 0x000000f4, 0x0201f800, 0x0010193c, - 0x82040500, 0xffffffd1, 0x82000540, 0x00000002, - 0x42000800, 0x000000f4, 0x0201f800, 0x00101944, - 0x42000800, 0x000000a0, 0x0201f800, 0x0010193c, - 0x82040540, 0x00000001, 0x42000800, 0x000000a0, - 0x0201f800, 0x00101944, 0x42000800, 0x00000000, - 0x0201f800, 0x0010193c, 0x82040540, 0x00000001, - 0x42000800, 0x00000000, 0x0201f800, 0x00101944, - 0x4201d000, 0x0001d4c0, 0x0201f800, 0x0010645c, - 0x0401fa6d, 0x4a0388a7, 0x0000f7f7, 0x4a0388a3, - 0x8000403c, 0x4a0388ae, 0x000061a8, 0x4a038801, - 0x00032063, 0x4a038810, 0x00410108, 0x4a038811, - 0x00520608, 0x4a038812, 0x00450320, 0x4a038813, - 0x00440405, 0x4a03881c, 0x004132e1, 0x4a03881d, - 0x004001fe, 0x4a038850, 0x80000108, 0x4a038860, - 0x00000008, 0x4a038870, 0x00000008, 0x4a038851, - 0x80000508, 0x4a038861, 0x00800000, 0x4a038871, - 0x00800000, 0x4a038852, 0x80000708, 0x4a038862, - 0x00800000, 0x4a038872, 0x00800000, 0x4a038853, - 0x80000608, 0x497b8863, 0x4a038873, 0x00800000, - 0x4a038882, 0x00000840, 0x4a0388a5, 0x000000fe, - 0x4a0388a6, 0x0000001e, 0x4a0388b0, 0x00007530, - 0x4a038802, 0x0000ffff, 0x4a038806, 0xc0e00800, - 0x1c01f000, 0x850e1d4e, 0x42000800, 0x00000040, - 0x0201f800, 0x0010193c, 0x82040500, 0xffffffaf, - 0x82000540, 0x00000000, 0x42000800, 0x00000040, - 0x0201f800, 0x00101944, 0x42000800, 0x000000f4, - 0x0201f800, 0x0010193c, 0x4c040000, 0x40040000, - 0x84000548, 0x42000800, 0x000000f4, 0x0201f800, - 0x00101944, 0x42000800, 0x00000000, 0x0201f800, - 0x0010193c, 0x82040500, 0xffffffc1, 0x82000540, - 0x00000038, 0x42000800, 0x00000000, 0x0201f800, - 0x00101944, 0x5c000000, 0x42000800, 0x000000f4, - 0x0201f000, 0x00101944, 0x59c40805, 0x59c40006, - 0x80040d00, 0x02000800, 0x0010032e, 0x82040500, - 0x00e00800, 0x04020004, 0x8c040d3e, 0x040208f9, - 0x0401f007, 0x82040500, 0x00800800, 0x02020800, - 0x00100323, 0x0201f800, 0x0010032e, 0x4c5c0000, - 0x4c600000, 0x59c4b805, 0x59c40006, 0x8c000500, - 0x04000003, 0x8c5cbd00, 0x040200a2, 0x485fc857, - 0x0201f800, 0x00104fc6, 0x0400001e, 0x59c40005, - 0x82000500, 0x000000c0, 0x04000054, 0x0201f800, - 0x00104ff1, 0x04020051, 0x59c40006, 0x82000500, - 0x000000f0, 0x04020004, 0x4a038805, 0x000000c0, - 0x0401f04a, 0x59a80015, 0x84000506, 0x48035015, - 0x42006000, 0xff203fff, 0x42006800, 0x40000000, - 0x0201f800, 0x001041ad, 0x42000800, 0x00000010, - 0x42001000, 0x001040f6, 0x0201f800, 0x00106451, - 0x8c5cbd34, 0x04020039, 0x4a035013, 0x0000aaaa, - 0x59c40005, 0x8c00050c, 0x04020012, 0x8c00050e, - 0x0402001c, 0x8c00050a, 0x04020026, 0x8c000508, - 0x0400000b, 0x59a80011, 0x82000580, 0x00000009, - 0x04020007, 0x42000000, 0x0010cb78, 0x0201f800, - 0x0010bc88, 0x0201f800, 0x0010520c, 0x0401f067, - 0x42000000, 0x0010cb86, 0x0201f800, 0x0010bc88, - 0x41781800, 0x42002000, 0x00000001, 0x0201f800, - 0x00101c41, 0x4a035014, 0x00000000, 0x0401f014, - 0x42000000, 0x0010cb87, 0x0201f800, 0x0010bc88, - 0x41781800, 0x42002000, 0x00000002, 0x0201f800, - 0x00101c41, 0x4a035014, 0x00000002, 0x0401f008, - 0x42000000, 0x0010cb7a, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x0010519a, 0x0401f048, 0x0201f800, - 0x00105277, 0x0401f045, 0x8c5cbd34, 0x04000041, - 0x59c40005, 0x8c00053a, 0x04020005, 0x42000000, - 0x0010cb6e, 0x0201f800, 0x0010bc88, 0x4a038805, - 0x20000000, 0x0201f800, 0x00104fc6, 0x04020015, - 0x4a038805, 0x04000000, 0x59c418a8, 0x42002000, - 0x00000000, 0x0201f800, 0x00101c41, 0x0201f800, - 0x00104fe2, 0x04020008, 0x4a035014, 0x00000001, - 0x4202d800, 0x00000001, 0x0201f800, 0x00104f20, - 0x0401f06d, 0x41780000, 0x0201f800, 0x00104f97, - 0x0201f800, 0x00101a38, 0x4000c000, 0x0201f800, - 0x00101963, 0x836c1580, 0x00000004, 0x0402000c, - 0x8c5cbd00, 0x04020017, 0x8d0e1d06, 0x04020005, - 0x59c410a3, 0x82081540, 0x00000008, 0x480b88a3, - 0x59c41006, 0x84081540, 0x480b8806, 0x4a038805, - 0x04000000, 0x4202d800, 0x00000001, 0x497b5010, - 0x8d0e1d18, 0x04020005, 0x4803c856, 0x850e1d06, - 0x0201f800, 0x00104032, 0x0201f800, 0x001039eb, - 0x8c5cbd3c, 0x04020866, 0x8c5cbd00, 0x04000043, - 0x42000000, 0x0010cc8b, 0x0201f800, 0x0010bc88, - 0x4a038805, 0x00000001, 0x4200b000, 0x00000352, - 0x4201d000, 0x00000064, 0x4c580000, 0x0201f800, - 0x0010645c, 0x0201f800, 0x001018f3, 0x5c00b000, - 0x04000004, 0x8058b040, 0x040207f6, 0x0401f004, - 0x4a038805, 0x00000001, 0x0401f02c, 0x59c40006, - 0x84000500, 0x48038806, 0x59a80878, 0x8c040d3e, - 0x04000005, 0x82040d40, 0x0000000b, 0x48075078, - 0x850e1d48, 0x0201f800, 0x00106faf, 0x497b8880, - 0x59c4000d, 0x8c000506, 0x04000006, 0x42002000, - 0x00000005, 0x0201f800, 0x001052d7, 0x0401f005, - 0x42002000, 0x00000006, 0x0201f800, 0x001052d7, - 0x59c400a3, 0x82000500, 0xfcf8ffff, 0x480388a3, - 0x4a035058, 0x00000002, 0x4202d800, 0x00000004, - 0x4a038805, 0x00000001, 0x0201f800, 0x00100455, - 0x0401fb77, 0x497b5036, 0x4a035043, 0x00000001, - 0x0201f800, 0x00110a6d, 0x825cbd00, 0xbbfffffe, - 0x485f8805, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x4d180000, 0x59c41004, 0x480bc857, 0x8c081500, - 0x04000006, 0x4803c856, 0x497b2807, 0x0201f800, - 0x00107075, 0x0401f009, 0x82080500, 0x000001f0, - 0x04000006, 0x4803c856, 0x0201f800, 0x001072b1, - 0x02020800, 0x0010709d, 0x4a038805, 0x80000000, - 0x5c023000, 0x1c01f000, 0x59c408a3, 0x4807c857, - 0x84040d40, 0x480788a3, 0x1c01f000, 0x4d900000, - 0x4dd00000, 0x4da40000, 0x4d140000, 0x4a038805, - 0x40000000, 0x42000000, 0x0010cb80, 0x0201f800, - 0x0010bc88, 0x0201f800, 0x00106c3c, 0x59c41004, - 0x8c081500, 0x04000055, 0x598e600f, 0x497b2807, - 0x813261c0, 0x04000032, 0x59300403, 0x82000580, - 0x00000032, 0x0402002e, 0x5930001d, 0x48038833, - 0x4a038807, 0x00018000, 0x4201d000, 0x00000002, - 0x0201f800, 0x0010645c, 0x497b8807, 0x4201d000, - 0x00000002, 0x0201f800, 0x0010645c, 0x0201f800, - 0x00106ed9, 0x4201d000, 0x00007530, 0x0201f800, - 0x0010645c, 0x59c408a4, 0x82040d00, 0x0000000f, - 0x82040d80, 0x00000000, 0x04000005, 0x42000000, - 0x00200000, 0x0201f800, 0x00101949, 0x0201f800, - 0x00106b8c, 0x59300009, 0x80000540, 0x02000800, - 0x0010032e, 0x40025800, 0x4a025a05, 0x00000103, - 0x5931d82a, 0x58ef400a, 0x58ec0008, 0x0801f800, - 0x0201f800, 0x00020b9d, 0x0401f047, 0x598c0011, - 0x82001c80, 0x000000c8, 0x04021010, 0x80000000, - 0x48031811, 0x59c400a4, 0x82000500, 0x0000000f, - 0x82000580, 0x00000002, 0x04020005, 0x42000000, - 0x00200000, 0x0201f800, 0x00101949, 0x0201f800, - 0x001063f8, 0x0401f034, 0x4933c857, 0x0201f800, - 0x00106ed9, 0x813261c0, 0x0400002f, 0x4a026203, - 0x00000001, 0x42027000, 0x00000027, 0x0201f800, - 0x00020bc1, 0x0401f028, 0x0201f800, 0x001072b1, - 0x04000025, 0x0201f800, 0x001072f1, 0x0201f800, - 0x00106423, 0x59926004, 0x813261c0, 0x04000013, - 0x42001800, 0x000000c8, 0x0201f800, 0x001072a5, - 0x0402000e, 0x59c400a4, 0x82000500, 0x0000000f, - 0x82000580, 0x00000002, 0x04020005, 0x42000000, - 0x00200000, 0x0201f800, 0x00101949, 0x0201f800, - 0x001063fd, 0x0401f00c, 0x4933c857, 0x0201f800, - 0x00106e75, 0x813261c0, 0x04000007, 0x42027000, - 0x0000004f, 0x4a026203, 0x00000003, 0x0201f800, - 0x00020bc1, 0x5c022800, 0x5c034800, 0x5c03a000, - 0x5c032000, 0x0201f000, 0x00106c29, 0x40680000, - 0x810c0d80, 0x8c040d0e, 0x04000053, 0x4803c857, - 0x8d0e1d0e, 0x04000023, 0x850e1d0e, 0x497b5058, - 0x42000000, 0x0010cb67, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x0010bd3c, 0x42001000, 0x00008011, - 0x59c40001, 0x82000500, 0x00018000, 0x82001d80, - 0x00000000, 0x04000009, 0x82001d80, 0x00008000, - 0x04000009, 0x82001d80, 0x00010000, 0x04000009, - 0x0201f800, 0x0010032e, 0x42001800, 0x00000000, - 0x0401f006, 0x42001800, 0x00000001, 0x0401f003, - 0x42001800, 0x00000003, 0x0201f000, 0x001038bc, - 0x850e1d4e, 0x59a80858, 0x800409c0, 0x04020007, - 0x59c4000d, 0x8c000520, 0x04000004, 0x42001800, - 0x00000003, 0x0401f002, 0x40041800, 0x0201f800, - 0x0010bd20, 0x42001000, 0x00008012, 0x59a82878, - 0x8c142d3e, 0x04000006, 0x82142d00, 0x00000003, - 0x0201f800, 0x001038bd, 0x0401f003, 0x0201f800, - 0x001038bc, 0x0201f800, 0x00100455, 0x0201f800, - 0x0010bd90, 0x04020010, 0x4d200000, 0x42024000, - 0x000000ff, 0x0401f856, 0x5c024000, 0x4d400000, - 0x4d3c0000, 0x42028000, 0x00000028, 0x42027800, - 0x00000008, 0x0201f800, 0x0010fbe5, 0x5c027800, - 0x5c028000, 0x1c01f000, 0x4803c857, 0x82000400, - 0x00102057, 0x50000800, 0x82040d00, 0x000000ff, - 0x1c01f000, 0x4803c856, 0x4c580000, 0x4200b000, - 0x00000010, 0x497b88ac, 0x497b88ad, 0x8058b040, - 0x040207fe, 0x5c00b000, 0x1c01f000, 0x40680800, - 0x4807c857, 0x80041908, 0x480f88ac, 0x82042500, - 0x0000000f, 0x82102400, 0x0010bdb6, 0x50102000, - 0x59c400ad, 0x80100540, 0x480f88ac, 0x480388ad, - 0x1c01f000, 0x4807c857, 0x80041908, 0x480f88ac, - 0x82042500, 0x0000000f, 0x82102400, 0x0010bdb6, - 0x50102000, 0x59c400ad, 0x80101500, 0x04000004, - 0x80100580, 0x480f88ac, 0x480388ad, 0x1c01f000, - 0x4803c857, 0x4c080000, 0x4c040000, 0x4c000000, - 0x59c40892, 0x4807c857, 0x80041580, 0x04000010, - 0x80041480, 0x04021007, 0x80081080, 0x80081000, - 0x4008b000, 0x42000000, 0x00000201, 0x0401f004, - 0x4008b000, 0x42000000, 0x00000210, 0x48038886, - 0x8058b040, 0x040207fe, 0x497b8886, 0x5c000000, - 0x5c000800, 0x5c001000, 0x1c01f000, 0x4803c856, - 0x8d0e1d20, 0x04000005, 0x42028000, 0x0000002e, - 0x0201f000, 0x0010ae89, 0x1c01f000, 0x0401f803, - 0x40058800, 0x1c01f000, 0x59a80870, 0x82040500, - 0x00000010, 0x04000004, 0x42000800, 0x00000002, - 0x0401f010, 0x82040500, 0x00000020, 0x42000800, - 0x00000002, 0x0402000b, 0x59c80835, 0x82040d00, - 0x00001f00, 0x80040910, 0x80040800, 0x59a8006d, - 0x80000540, 0x04000003, 0x42000800, 0x0000025a, - 0x4807c857, 0x1c01f000, 0x0401f807, 0x42018800, - 0x00000001, 0x04000003, 0x42018800, 0x00000000, - 0x1c01f000, 0x4c000000, 0x59a80037, 0x4803c857, - 0x82000580, 0x00000000, 0x5c000000, 0x1c01f000, - 0x0401f807, 0x42018800, 0x00000001, 0x04000003, - 0x42018800, 0x00000000, 0x1c01f000, 0x4c000000, - 0x59a80037, 0x4803c857, 0x82000580, 0x00000001, - 0x5c000000, 0x1c01f000, 0x0401f807, 0x42018800, - 0x00000001, 0x04000003, 0x42018800, 0x00000000, - 0x1c01f000, 0x4c000000, 0x59a80037, 0x4803c857, - 0x82000580, 0x00000003, 0x5c000000, 0x1c01f000, - 0x0401f807, 0x42018800, 0x00000001, 0x04000003, - 0x42018800, 0x00000000, 0x1c01f000, 0x4c000000, - 0x59a80037, 0x82000580, 0x00000002, 0x5c000000, - 0x1c01f000, 0x4c000000, 0x4c040000, 0x4c080000, - 0x4c380000, 0x59a8003a, 0x82000c80, 0x00000007, - 0x02021800, 0x0010032e, 0x0c01f806, 0x5c007000, - 0x5c001000, 0x5c000800, 0x5c000000, 0x1c01f000, - 0x0010166b, 0x0010167e, 0x00101692, 0x00101694, - 0x001016bc, 0x001016be, 0x001016c0, 0x4803c856, - 0x4a03503c, 0x00000000, 0x42000000, 0x00000002, - 0x0401fa32, 0x42000000, 0x00000002, 0x0401f9b5, - 0x0401fab1, 0x4803c856, 0x4a03503a, 0x00000006, - 0x42000800, 0x0000001e, 0x42001000, 0x001016c1, - 0x0201f000, 0x00106433, 0x497b503f, 0x4a035034, - 0x00000036, 0x4a035033, 0x0000002a, 0x4803c856, - 0x4a03503c, 0x00000001, 0x42000000, 0x00000002, - 0x0401f9a0, 0x4803c856, 0x4a03503a, 0x00000006, - 0x42000800, 0x0000001e, 0x42001000, 0x001016c1, - 0x0201f000, 0x00106433, 0x0201f800, 0x0010032e, - 0x4a035034, 0x00000036, 0x4803c856, 0x4a03503c, - 0x00000003, 0x42000800, 0x00000000, 0x0401faa1, - 0x82040d00, 0x00000090, 0x82040580, 0x00000090, - 0x04000009, 0x82040580, 0x00000010, 0x04000009, - 0x82040580, 0x00000000, 0x04000009, 0x0201f800, - 0x0010032e, 0x42000000, 0x00000001, 0x0401f006, - 0x42000000, 0x00000000, 0x0401f003, 0x42000000, - 0x00000002, 0x0401f977, 0x497b5040, 0x4803c856, - 0x4a03503a, 0x00000006, 0x42000800, 0x0000001e, - 0x42001000, 0x001016c1, 0x0201f000, 0x00106433, - 0x0201f800, 0x0010032e, 0x0201f800, 0x0010032e, - 0x1c01f000, 0x4c000000, 0x4c040000, 0x4c080000, - 0x4c380000, 0x59a8003c, 0x82000c80, 0x00000007, - 0x02021800, 0x0010032e, 0x0c01f806, 0x5c007000, - 0x5c001000, 0x5c000800, 0x5c000000, 0x1c01f000, - 0x001016d7, 0x001016f6, 0x0010174b, 0x00101762, - 0x00101779, 0x00101782, 0x00101784, 0x0401fa1c, - 0x0402001b, 0x59a81042, 0x42000800, 0x00000000, - 0x0401fa60, 0x82040d00, 0x00000090, 0x82040580, + 0x1c01f000, 0x58300205, 0x82004d00, 0x0000000f, + 0x82244400, 0x00100f0b, 0x82000500, 0x000000ff, + 0x82000580, 0x00000029, 0x0402001b, 0x50204000, + 0x592c040a, 0x80000540, 0x02000800, 0x0010032e, + 0x82000c80, 0x00000002, 0x04001011, 0x58300001, + 0x80006540, 0x02000800, 0x0010032e, 0x58300205, + 0x82000500, 0x0000000f, 0x82000400, 0x00100f0b, + 0x50004000, 0x40040000, 0x800409c0, 0x04000006, + 0x82040c80, 0x00000005, 0x040217f1, 0x80204400, + 0x80000580, 0x1c01f000, 0x4c5c0000, 0x59e4b800, + 0x485fc857, 0x825c0500, 0x0000001f, 0x04000004, + 0x59e40862, 0x0201f800, 0x0010032e, 0x825c0500, + 0x000000e0, 0x02000800, 0x0010032e, 0x8c5cbd0e, + 0x04020807, 0x8c5cbd0c, 0x04020809, 0x8c5cbd0a, + 0x04020873, 0x5c00b800, 0x1c01f000, 0x4803c856, + 0x4a03c800, 0x00000080, 0x1c01f000, 0x4d2c0000, + 0x42007800, 0x0010cfb9, 0x583c0003, 0x583c0804, + 0x80040540, 0x0400003a, 0x42000800, 0x0010ce5c, + 0x50065800, 0x592c0002, 0x82000580, 0x00000000, + 0x04000033, 0x59e40050, 0x59e40852, 0x80040480, + 0x82000500, 0xfffffc00, 0x04020005, 0x59e40050, + 0x59e40851, 0x80040800, 0x80040480, 0x82000c80, + 0x00000400, 0x59e40050, 0x80041400, 0x480bc857, + 0x50080000, 0x58080801, 0x80040540, 0x04000020, + 0x480bc857, 0x480a5803, 0x583c1009, 0x583c000a, + 0x80080580, 0x04020005, 0x583c0000, 0x84000550, + 0x48007800, 0x41781000, 0x82080400, 0x00001000, + 0x4803c857, 0x48007809, 0x583c0003, 0x80081400, + 0x480bc857, 0x583c0804, 0x4a025801, 0x00000000, + 0x4a025808, 0x0010102b, 0x480a5806, 0x48065807, + 0x59e40053, 0x800000c4, 0x48025805, 0x412c1000, + 0x492fc857, 0x0201f800, 0x00020016, 0x5c025800, + 0x4a03c800, 0x00000040, 0x1c01f000, 0x42007800, + 0x0010ce5c, 0x503c7800, 0x4a007802, 0x00000100, + 0x42007800, 0x0010cfb9, 0x583c0000, 0x84000552, + 0x48007800, 0x583c100c, 0x480bc857, 0x80081000, + 0x4808780c, 0x583c180b, 0x800c19c0, 0x04000017, + 0x82080500, 0x00000003, 0x04020014, 0x583c0007, + 0x4803c857, 0x583c2008, 0x4813c857, 0x80102000, + 0x80100580, 0x04020002, 0x41782000, 0x48107808, + 0x400c0000, 0x80080580, 0x04020008, 0x4978780c, + 0x42001800, 0x00000001, 0x42001000, 0x00008028, + 0x0201f800, 0x001039ac, 0x1c01f000, 0x4a03c800, + 0x00000020, 0x0201f800, 0x0010bfab, 0x59e40000, + 0x1c01f000, 0x42000000, 0x00001000, 0x50000000, + 0x82000480, 0x24320001, 0x0400100d, 0x0201f800, + 0x0010c0d6, 0x04000008, 0x42000000, 0x00007a42, + 0x50007000, 0x8c387520, 0x04020003, 0x84387560, + 0x44380000, 0x4a030000, 0x00000000, 0x1c01f000, + 0x4d2c0000, 0x4a007000, 0x00000000, 0x82040d00, + 0x43000f80, 0x02020800, 0x0010032e, 0x58380008, + 0x4803c00f, 0x4a0370e4, 0x00003000, 0x0201f800, + 0x00109ce4, 0x583a5807, 0x592c0000, 0x48007007, + 0x800001c0, 0x04020002, 0x49787006, 0x0201f800, + 0x00100594, 0x5c025800, 0x42007000, 0x00020cf0, + 0x0201f000, 0x0002002c, 0x4803c856, 0x4c3c0000, + 0x4d2c0000, 0x4d300000, 0x58300009, 0x80025d40, + 0x02000800, 0x0010032e, 0x592e6009, 0x4c300000, + 0x0201f800, 0x00109d04, 0x5c006000, 0x02000800, + 0x0010032e, 0x58300002, 0x82000580, 0x00000100, + 0x0402000f, 0x5930780c, 0x583c0001, 0x80007d40, + 0x0400000e, 0x4802600c, 0x82000400, 0x00000002, + 0x48006003, 0x583c0000, 0x48006005, 0x40301000, + 0x0201f800, 0x00020016, 0x0401f00c, 0x4a025a07, + 0x00000002, 0x492fc857, 0x4c300000, 0x0201f800, + 0x000203ef, 0x5c025800, 0x0201f800, 0x00100594, + 0x0201f800, 0x00020b9d, 0x5c026000, 0x5c025800, + 0x5c007800, 0x1c01f000, 0x4803c856, 0x4d2c0000, + 0x4d300000, 0x42007000, 0x00020cf0, 0x58380800, + 0x82040580, 0x00000002, 0x04020011, 0x58386001, + 0x58300009, 0x812c0580, 0x0402000d, 0x59e00004, + 0x8c00050e, 0x040007fe, 0x59dc0006, 0x4803c857, + 0x4a03b805, 0x20000000, 0x8c00053e, 0x040007f8, + 0x4a007000, 0x00000000, 0x0401f019, 0x58386005, + 0x40305000, 0x803061c0, 0x02000800, 0x0010032e, + 0x58300009, 0x812c0580, 0x04000004, 0x40305000, + 0x58306000, 0x0401f7f8, 0x40280000, 0x80300580, + 0x58300000, 0x04000006, 0x48005000, 0x800001c0, + 0x04020007, 0x48287004, 0x0401f005, 0x800001c0, + 0x04020002, 0x48007004, 0x48007005, 0x40325800, + 0x0201f800, 0x00100594, 0x5c026000, 0x5c025800, + 0x0201f000, 0x00020026, 0x59300024, 0x48025811, + 0x59300025, 0x48025812, 0x59300a22, 0x8c040d0c, + 0x04020007, 0x5930001f, 0x59300a20, 0x800408e0, + 0x80040540, 0x5930081e, 0x0401f006, 0x5930081f, + 0x59300220, 0x800408e0, 0x80040d40, 0x5930001e, + 0x9c0001c0, 0x9c0409c0, 0x48025813, 0x48065814, + 0x1c01f000, 0x592c0001, 0x80003540, 0x02000800, + 0x0010032e, 0x58180a05, 0x82040d00, 0x000000ff, + 0x82040580, 0x0000004a, 0x02020800, 0x0010032e, + 0x592c1012, 0x592c1a13, 0x58182206, 0x592c2c13, + 0x592c0014, 0x800000e0, 0x80142d40, 0x592c0014, + 0x80003920, 0x58184406, 0x58180207, 0x800048e0, + 0x80244d40, 0x58180008, 0x48026029, 0x8c20450c, + 0x04020009, 0x901c51c0, 0x841401c0, 0x82003d00, + 0x0000ffff, 0x80140120, 0x80280540, 0x9c0029c0, + 0x0401f003, 0x9c1429c0, 0x841c39c0, 0x480a601e, + 0x480e601f, 0x48126420, 0x48126220, 0x48166021, + 0x481e6422, 0x48226222, 0x48266023, 0x1c01f000, + 0x592c0001, 0x80006540, 0x02000800, 0x0010032e, + 0x58300a05, 0x82040d00, 0x000000ff, 0x82040580, + 0x0000004a, 0x02020800, 0x0010032e, 0x58302c06, + 0x8c142d06, 0x58300206, 0x04000002, 0x80080400, + 0x48026420, 0x48026220, 0x58300207, 0x800008e0, + 0x80040540, 0x48026023, 0x8c142d0a, 0x04020004, + 0x592c0012, 0x80080400, 0x4802601e, 0x82142d00, + 0x00000003, 0x58303207, 0x82140580, 0x00000002, + 0x04000011, 0x82140580, 0x00000001, 0x04000009, + 0x40080800, 0x82180400, 0x00000008, 0x40001000, + 0x0201f800, 0x00106c7e, 0x40042000, 0x0401f006, + 0x40080800, 0x40181000, 0x0201f800, 0x00106c7e, + 0x40042000, 0x4c100000, 0x0401fe43, 0x02000800, + 0x0010032e, 0x5c002000, 0x50200000, 0x80004540, + 0x0400005b, 0x58300a05, 0x82040d00, 0x000000ff, + 0x82040580, 0x0000004a, 0x04020002, 0x80204000, + 0x50200000, 0x80000540, 0x0400000b, 0x80301400, + 0x58080002, 0x80102480, 0x0400101e, 0x801021c0, + 0x04000009, 0x80285040, 0x04000049, 0x80204000, + 0x0401f7f4, 0x58300001, 0x80006540, 0x04000044, + 0x0401f7e1, 0x80285040, 0x04000041, 0x80204000, + 0x50200000, 0x80000540, 0x0402000a, 0x58300001, + 0x80006540, 0x0400003a, 0x58300205, 0x82004d00, + 0x0000000f, 0x82244400, 0x00100f0b, 0x50204000, + 0x592c0209, 0x8400051e, 0x48025a09, 0x0401f011, + 0x80102080, 0x80102000, 0x48126011, 0x4813c857, + 0x58080802, 0x40100000, 0x80042480, 0x02001800, + 0x0010032e, 0x58080000, 0x80102400, 0x4812600f, + 0x4813c857, 0x592c0209, 0x8400055e, 0x48025a09, + 0x59300008, 0x8400052c, 0x48026008, 0x592c1001, + 0x58080406, 0x82000500, 0x00000003, 0x82000580, + 0x00000001, 0x04020014, 0x599c0019, 0x8c00050c, + 0x04020011, 0x82280580, 0x00000001, 0x04020003, + 0x59300811, 0x0401f008, 0x80280840, 0x58080207, + 0x40001000, 0x0201f800, 0x00106c7e, 0x59300011, + 0x80040c00, 0x48066012, 0x59300008, 0x8400056c, + 0x48026008, 0x80000580, 0x0401f003, 0x82000540, + 0x00000001, 0x1c01f000, 0x592c6801, 0x803469c0, + 0x0400001a, 0x592c0205, 0x82000500, 0x000000ff, + 0x82000580, 0x00000072, 0x04020003, 0x592c000e, + 0x80102480, 0x58347802, 0x58347406, 0x82380500, + 0x00000003, 0x0c01f001, 0x001011e1, 0x001011de, + 0x001011e4, 0x001011e6, 0x803c00c6, 0x80102400, + 0x0401f004, 0x803c00c6, 0x80102480, 0x04001003, + 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, + 0x1c01f000, 0x4803c856, 0x42000800, 0x0000003c, + 0x48079000, 0x59c80000, 0x80040500, 0x040207fe, + 0x497b9005, 0x4a039035, 0x00880200, 0x59a8000d, + 0x800000e0, 0x4803900e, 0x4a039011, 0x0000002c, + 0x4a03900f, 0x00111584, 0x4a039010, 0x00111584, + 0x4a039015, 0x0000007f, 0x4a03900d, 0x00000040, + 0x4a039000, 0x00001600, 0x1c01f000, 0x59c80007, + 0x8c000508, 0x040208c9, 0x59c80800, 0x8c040d16, + 0x04020004, 0x82000500, 0x00000006, 0x0c01f005, + 0x4807c857, 0x82000500, 0x0000000e, 0x0c01f001, + 0x00101222, 0x00101220, 0x00105d55, 0x00101220, + 0x00101224, 0x00101220, 0x00101224, 0x00101224, + 0x00101220, 0x00101220, 0x00101220, 0x00101220, + 0x00101224, 0x00101220, 0x00101224, 0x00101220, + 0x0201f800, 0x0010032e, 0x4803c857, 0x1c01f000, + 0x59c8080c, 0x4807c857, 0x82040500, 0x00006000, + 0x04000004, 0x0201f800, 0x0010bf6e, 0x0401f006, + 0x82040500, 0x007f0000, 0x04000006, 0x0201f800, + 0x0010bf40, 0x0201f800, 0x00107186, 0x0401f03c, + 0x82040500, 0x00000014, 0x04000014, 0x0201f800, + 0x0010bf9d, 0x836c0580, 0x00000003, 0x0400000d, + 0x0201f800, 0x001050f7, 0x04000004, 0x0201f800, + 0x0010410a, 0x0401f007, 0x4a035014, 0x00000001, + 0x4202d800, 0x00000001, 0x0201f800, 0x00105051, + 0x0401f828, 0x0401f026, 0x82040500, 0x00001c00, + 0x04000005, 0x0201f800, 0x0010bf7c, 0x0401f821, + 0x0401f01f, 0x82040500, 0x00000140, 0x04000005, + 0x0201f800, 0x0010bf8f, 0x0401f81a, 0x0401f018, + 0x82040500, 0x00008000, 0x04000015, 0x0201f800, + 0x001050f7, 0x0400000f, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x0000000b, 0x04020009, + 0x4c040000, 0x0201f800, 0x00104126, 0x42000000, + 0x0000001e, 0x80000040, 0x040207ff, 0x5c000800, + 0x0201f800, 0x0010bf67, 0x0401f802, 0x1c01f000, + 0x4c0c0000, 0x4c100000, 0x4c140000, 0x0201f800, + 0x00100cb0, 0x5c002800, 0x5c002000, 0x5c001800, + 0x1c01f000, 0x4803c856, 0x59a80804, 0x59a80020, + 0x82000500, 0xfffff000, 0x80040540, 0x48035020, + 0x59a80024, 0x82000500, 0xfffff000, 0x80040540, + 0x48035024, 0x48078882, 0x82041c00, 0x0000000f, + 0x800c1908, 0x820c1c00, 0x00000004, 0x400c2000, + 0x901029c0, 0x82040480, 0x000001e4, 0x04021005, + 0x42001000, 0x00000008, 0x801020c6, 0x0401f031, + 0x82040480, 0x00000230, 0x04021009, 0x42001000, + 0x00000007, 0x801000c2, 0x800000c2, 0x80100400, + 0x80100400, 0x80102400, 0x0401f026, 0x82040480, + 0x00000298, 0x04021008, 0x42001000, 0x00000006, + 0x801000c2, 0x800000c2, 0x80100400, 0x80102400, + 0x0401f01c, 0x82040480, 0x00000328, 0x04021007, + 0x42001000, 0x00000005, 0x801000c2, 0x800000c2, + 0x80102400, 0x0401f013, 0x82040480, 0x00000404, + 0x04021005, 0x42001000, 0x00000004, 0x801020c4, + 0x0401f00c, 0x82040480, 0x0000056c, 0x04021006, + 0x42001000, 0x00000003, 0x801000c2, 0x80102400, + 0x0401f004, 0x42001000, 0x00000002, 0x801020c2, + 0x82100480, 0x00000110, 0x80000080, 0x80002000, + 0x800800d0, 0x80140540, 0x80100540, 0x48039035, + 0x48035075, 0x1c01f000, 0x59c80815, 0x0201f800, + 0x00100323, 0x40680800, 0x82040d00, 0x0000007c, + 0x48079000, 0x59c80000, 0x80040500, 0x040207fe, + 0x8c040d04, 0x04000003, 0x59c80035, 0x48039035, + 0x59c80000, 0x82000540, 0x00001200, 0x48039000, + 0x1c01f000, 0x4803c856, 0x497b88a9, 0x4a038807, + 0x00000001, 0x497b8807, 0x59c40005, 0x48038805, + 0x0201f800, 0x00101820, 0x4201d000, 0x000001f4, + 0x0201f800, 0x00106661, 0x497b880e, 0x4200b000, + 0x000001f4, 0x42000000, 0x00000001, 0x42000800, + 0x00000014, 0x0201f800, 0x00101949, 0x42000800, + 0x00000014, 0x0201f800, 0x00101941, 0x8c040d00, + 0x04000005, 0x8058b040, 0x040207f3, 0x0201f800, + 0x0010032e, 0x4200b000, 0x00000032, 0x42000000, + 0x00000001, 0x42000800, 0x000000b4, 0x0201f800, + 0x00101949, 0x42000800, 0x000000b4, 0x0201f800, + 0x00101941, 0x8c040d00, 0x04000005, 0x8058b040, + 0x040207f3, 0x0201f800, 0x0010032e, 0x59c40005, + 0x48038805, 0x42000000, 0x00000083, 0x59e00803, + 0x82040d00, 0x00030000, 0x82040d80, 0x00020000, + 0x04020003, 0x42000000, 0x00000089, 0x800008d0, + 0x4a035044, 0x00008900, 0x4a035045, 0x00008900, + 0x48075046, 0x42000800, 0x000000e0, 0x0201f800, + 0x00101949, 0x42000800, 0x000000f4, 0x0201f800, + 0x00101941, 0x82040500, 0xffffffd1, 0x82000540, + 0x00000002, 0x42000800, 0x000000f4, 0x0201f800, + 0x00101949, 0x42000800, 0x000000a0, 0x0201f800, + 0x00101941, 0x82040540, 0x00000001, 0x42000800, + 0x000000a0, 0x0201f800, 0x00101949, 0x42000800, + 0x00000000, 0x0201f800, 0x00101941, 0x82040540, + 0x00000001, 0x42000800, 0x00000000, 0x0201f800, + 0x00101949, 0x4201d000, 0x0001d4c0, 0x0201f800, + 0x00106661, 0x0401fa6d, 0x4a0388a7, 0x0000f7f7, + 0x4a0388a3, 0x8000403c, 0x4a0388ae, 0x000061a8, + 0x4a038801, 0x00032063, 0x4a038810, 0x00410108, + 0x4a038811, 0x00520608, 0x4a038812, 0x00450320, + 0x4a038813, 0x00440405, 0x4a03881c, 0x004132e1, + 0x4a03881d, 0x004001fe, 0x4a038850, 0x80000108, + 0x4a038860, 0x00000008, 0x4a038870, 0x00000008, + 0x4a038851, 0x80000508, 0x4a038861, 0x00800000, + 0x4a038871, 0x00800000, 0x4a038852, 0x80000708, + 0x4a038862, 0x00800000, 0x4a038872, 0x00800000, + 0x4a038853, 0x80000608, 0x497b8863, 0x4a038873, + 0x00800000, 0x4a038882, 0x00000840, 0x4a0388a5, + 0x000000fe, 0x4a0388a6, 0x0000001e, 0x4a0388b0, + 0x00007530, 0x4a038802, 0x0000ffff, 0x4a038806, + 0xc0e00800, 0x1c01f000, 0x850e1d4e, 0x42000800, + 0x00000040, 0x0201f800, 0x00101941, 0x82040500, + 0xffffffaf, 0x82000540, 0x00000000, 0x42000800, + 0x00000040, 0x0201f800, 0x00101949, 0x42000800, + 0x000000f4, 0x0201f800, 0x00101941, 0x4c040000, + 0x40040000, 0x84000548, 0x42000800, 0x000000f4, + 0x0201f800, 0x00101949, 0x42000800, 0x00000000, + 0x0201f800, 0x00101941, 0x82040500, 0xffffffc1, + 0x82000540, 0x00000038, 0x42000800, 0x00000000, + 0x0201f800, 0x00101949, 0x5c000000, 0x42000800, + 0x000000f4, 0x0201f000, 0x00101949, 0x59c40805, + 0x59c40006, 0x80040d00, 0x02000800, 0x0010032e, + 0x82040500, 0x00e00800, 0x04020004, 0x8c040d3e, + 0x040208f9, 0x0401f007, 0x82040500, 0x00800800, + 0x02020800, 0x00100323, 0x0201f800, 0x0010032e, + 0x4c5c0000, 0x4c600000, 0x59c4b805, 0x59c40006, + 0x8c000500, 0x04000003, 0x8c5cbd00, 0x040200a2, + 0x485fc857, 0x0201f800, 0x001050f7, 0x0400001e, + 0x59c40005, 0x82000500, 0x000000c0, 0x04000054, + 0x0201f800, 0x00105122, 0x04020051, 0x59c40006, + 0x82000500, 0x000000f0, 0x04020004, 0x4a038805, + 0x000000c0, 0x0401f04a, 0x59a80015, 0x84000506, + 0x48035015, 0x42006000, 0xff203fff, 0x42006800, + 0x40000000, 0x0201f800, 0x001042a6, 0x42000800, + 0x00000010, 0x42001000, 0x001041ef, 0x0201f800, + 0x00106656, 0x8c5cbd34, 0x04020039, 0x4a035013, + 0x0000aaaa, 0x59c40005, 0x8c00050c, 0x04020012, + 0x8c00050e, 0x0402001c, 0x8c00050a, 0x04020026, + 0x8c000508, 0x0400000b, 0x59a80011, 0x82000580, + 0x00000009, 0x04020007, 0x42000000, 0x0010ce78, + 0x0201f800, 0x0010bfb3, 0x0201f800, 0x0010533d, + 0x0401f067, 0x42000000, 0x0010ce86, 0x0201f800, + 0x0010bfb3, 0x41781800, 0x42002000, 0x00000001, + 0x0201f800, 0x00101c46, 0x4a035014, 0x00000000, + 0x0401f014, 0x42000000, 0x0010ce87, 0x0201f800, + 0x0010bfb3, 0x41781800, 0x42002000, 0x00000002, + 0x0201f800, 0x00101c46, 0x4a035014, 0x00000002, + 0x0401f008, 0x42000000, 0x0010ce7a, 0x0201f800, + 0x0010bfb3, 0x0201f800, 0x001052cb, 0x0401f048, + 0x0201f800, 0x001053a8, 0x0401f045, 0x8c5cbd34, + 0x04000041, 0x59c40005, 0x8c00053a, 0x04020005, + 0x42000000, 0x0010ce6e, 0x0201f800, 0x0010bfb3, + 0x4a038805, 0x20000000, 0x0201f800, 0x001050f7, + 0x04020015, 0x4a038805, 0x04000000, 0x59c418a8, + 0x42002000, 0x00000000, 0x0201f800, 0x00101c46, + 0x0201f800, 0x00105113, 0x04020008, 0x4a035014, + 0x00000001, 0x4202d800, 0x00000001, 0x0201f800, + 0x00105051, 0x0401f06d, 0x41780000, 0x0201f800, + 0x001050c8, 0x0201f800, 0x00101a3d, 0x4000c000, + 0x0201f800, 0x00101968, 0x836c1580, 0x00000004, + 0x0402000c, 0x8c5cbd00, 0x04020017, 0x8d0e1d06, + 0x04020005, 0x59c410a3, 0x82081540, 0x00000008, + 0x480b88a3, 0x59c41006, 0x84081540, 0x480b8806, + 0x4a038805, 0x04000000, 0x4202d800, 0x00000001, + 0x497b5010, 0x8d0e1d18, 0x04020005, 0x4803c856, + 0x850e1d06, 0x0201f800, 0x0010412b, 0x0201f800, + 0x00103ae4, 0x8c5cbd3c, 0x04020866, 0x8c5cbd00, + 0x04000043, 0x42000000, 0x0010cf8b, 0x0201f800, + 0x0010bfb3, 0x4a038805, 0x00000001, 0x4200b000, + 0x00000352, 0x4201d000, 0x00000064, 0x4c580000, + 0x0201f800, 0x00106661, 0x0201f800, 0x001018f8, + 0x5c00b000, 0x04000004, 0x8058b040, 0x040207f6, + 0x0401f004, 0x4a038805, 0x00000001, 0x0401f02c, + 0x59c40006, 0x84000500, 0x48038806, 0x59a80878, + 0x8c040d3e, 0x04000005, 0x82040d40, 0x0000000b, + 0x48075078, 0x850e1d48, 0x0201f800, 0x001071b4, + 0x497b8880, 0x59c4000d, 0x8c000506, 0x04000006, + 0x42002000, 0x00000005, 0x0201f800, 0x00105408, + 0x0401f005, 0x42002000, 0x00000006, 0x0201f800, + 0x00105408, 0x59c400a3, 0x82000500, 0xfcf8ffff, + 0x480388a3, 0x4a035058, 0x00000002, 0x4202d800, + 0x00000004, 0x4a038805, 0x00000001, 0x0201f800, + 0x00100455, 0x0401fb7b, 0x497b5036, 0x4a035043, + 0x00000001, 0x0201f800, 0x00110d6d, 0x825cbd00, + 0xbbfffffe, 0x485f8805, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x4d180000, 0x59c41004, 0x480bc857, + 0x8c081500, 0x04000006, 0x4803c856, 0x497b2807, + 0x0201f800, 0x0010727a, 0x0401f009, 0x82080500, + 0x000001f0, 0x04000006, 0x4803c856, 0x0201f800, + 0x001074b6, 0x02020800, 0x001072a2, 0x4a038805, + 0x80000000, 0x5c023000, 0x1c01f000, 0x59c408a3, + 0x4807c857, 0x84040d40, 0x480788a3, 0x1c01f000, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x4a038805, 0x40000000, 0x42000000, 0x0010ce80, + 0x0201f800, 0x0010bfb3, 0x0201f800, 0x00106e41, + 0x59c41004, 0x8c081500, 0x04000055, 0x598e600f, + 0x497b2807, 0x813261c0, 0x04000032, 0x59300403, + 0x82000580, 0x00000032, 0x0402002e, 0x5930001d, + 0x48038833, 0x4a038807, 0x00018000, 0x4201d000, + 0x00000002, 0x0201f800, 0x00106661, 0x497b8807, + 0x4201d000, 0x00000002, 0x0201f800, 0x00106661, + 0x0201f800, 0x001070de, 0x4201d000, 0x00007530, + 0x0201f800, 0x00106661, 0x59c408a4, 0x82040d00, + 0x0000000f, 0x82040d80, 0x00000000, 0x04000005, + 0x42000000, 0x00200000, 0x0201f800, 0x0010194e, + 0x0201f800, 0x00106d91, 0x59300009, 0x80000540, + 0x02000800, 0x0010032e, 0x40025800, 0x4a025a05, + 0x00000103, 0x5931d82a, 0x58ef400a, 0x58ec0008, + 0x0801f800, 0x0201f800, 0x00020b9d, 0x0401f047, + 0x598c0011, 0x82001c80, 0x000000c8, 0x04021010, + 0x80000000, 0x48031811, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x00000002, 0x04020005, + 0x42000000, 0x00200000, 0x0201f800, 0x0010194e, + 0x0201f800, 0x001065fd, 0x0401f034, 0x4933c857, + 0x0201f800, 0x001070de, 0x813261c0, 0x0400002f, + 0x4a026203, 0x00000001, 0x42027000, 0x00000027, + 0x0201f800, 0x00020bc1, 0x0401f028, 0x0201f800, + 0x001074b6, 0x04000025, 0x0201f800, 0x001074f6, + 0x0201f800, 0x00106628, 0x59926004, 0x813261c0, + 0x04000013, 0x42001800, 0x000000c8, 0x0201f800, + 0x001074aa, 0x0402000e, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x00000002, 0x04020005, + 0x42000000, 0x00200000, 0x0201f800, 0x0010194e, + 0x0201f800, 0x00106602, 0x0401f00c, 0x4933c857, + 0x0201f800, 0x0010707a, 0x813261c0, 0x04000007, + 0x42027000, 0x0000004f, 0x4a026203, 0x00000003, + 0x0201f800, 0x00020bc1, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x0201f000, 0x00106e2e, + 0x40680000, 0x810c0d80, 0x8c040d0e, 0x04000053, + 0x4803c857, 0x8d0e1d0e, 0x04000023, 0x850e1d0e, + 0x497b5058, 0x42000000, 0x0010ce67, 0x0201f800, + 0x0010bfb3, 0x0201f800, 0x0010c067, 0x42001000, + 0x00008011, 0x59c40001, 0x82000500, 0x00018000, + 0x82001d80, 0x00000000, 0x04000009, 0x82001d80, + 0x00008000, 0x04000009, 0x82001d80, 0x00010000, + 0x04000009, 0x0201f800, 0x0010032e, 0x42001800, + 0x00000000, 0x0401f006, 0x42001800, 0x00000001, + 0x0401f003, 0x42001800, 0x00000003, 0x0201f000, + 0x001039ac, 0x850e1d4e, 0x59a80858, 0x800409c0, + 0x04020007, 0x59c4000d, 0x8c000520, 0x04000004, + 0x42001800, 0x00000003, 0x0401f002, 0x40041800, + 0x0201f800, 0x0010c04b, 0x42001000, 0x00008012, + 0x59a82878, 0x8c142d3e, 0x04000006, 0x82142d00, + 0x00000003, 0x0201f800, 0x001039ad, 0x0401f003, + 0x0201f800, 0x001039ac, 0x0201f800, 0x00100455, + 0x0201f800, 0x0010c0bb, 0x04020010, 0x4d200000, + 0x42024000, 0x000000ff, 0x0401f85a, 0x5c024000, + 0x4d400000, 0x4d3c0000, 0x42028000, 0x00000028, + 0x42027800, 0x00000008, 0x0201f800, 0x0010fef2, + 0x5c027800, 0x5c028000, 0x1c01f000, 0x4803c857, + 0x82000400, 0x00102116, 0x50000800, 0x82040d00, + 0x000000ff, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x4200b000, 0x00000010, 0x497b88ac, 0x497b88ad, + 0x8058b040, 0x040207fe, 0x5c00b000, 0x1c01f000, + 0x40680800, 0x4807c857, 0x80041908, 0x480f88ac, + 0x82042500, 0x0000000f, 0x82102400, 0x0010c0fc, + 0x50102000, 0x59c400ad, 0x80100540, 0x480f88ac, + 0x480388ad, 0x0201f800, 0x0010c0e8, 0x04000002, + 0x4807500f, 0x1c01f000, 0x4807c857, 0x80041908, + 0x480f88ac, 0x82042500, 0x0000000f, 0x82102400, + 0x0010c0fc, 0x50102000, 0x59c400ad, 0x80101500, + 0x04000004, 0x80100580, 0x480f88ac, 0x480388ad, + 0x1c01f000, 0x4803c857, 0x4c080000, 0x4c040000, + 0x4c000000, 0x59c40892, 0x4807c857, 0x80041580, + 0x04000010, 0x80041480, 0x04021007, 0x80081080, + 0x80081000, 0x4008b000, 0x42000000, 0x00000201, + 0x0401f004, 0x4008b000, 0x42000000, 0x00000210, + 0x48038886, 0x8058b040, 0x040207fe, 0x497b8886, + 0x5c000000, 0x5c000800, 0x5c001000, 0x1c01f000, + 0x4803c856, 0x8d0e1d20, 0x04000005, 0x42028000, + 0x0000002e, 0x0201f000, 0x0010b198, 0x1c01f000, + 0x0401f803, 0x40058800, 0x1c01f000, 0x59a80870, + 0x82040500, 0x00000010, 0x04000004, 0x42000800, + 0x00000002, 0x0401f010, 0x82040500, 0x00000020, + 0x42000800, 0x00000002, 0x0402000b, 0x59c80835, + 0x82040d00, 0x00001f00, 0x80040910, 0x80040800, + 0x59a8006d, 0x80000540, 0x04000003, 0x42000800, + 0x0000025a, 0x4807c857, 0x1c01f000, 0x0401f807, + 0x42018800, 0x00000001, 0x04000003, 0x42018800, + 0x00000000, 0x1c01f000, 0x4c000000, 0x59a80037, + 0x4803c857, 0x82000580, 0x00000000, 0x5c000000, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, + 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, + 0x4c000000, 0x59a80037, 0x4803c857, 0x82000580, + 0x00000001, 0x5c000000, 0x1c01f000, 0x0401f807, + 0x42018800, 0x00000001, 0x04000003, 0x42018800, + 0x00000000, 0x1c01f000, 0x4c000000, 0x59a80037, + 0x4803c857, 0x82000580, 0x00000003, 0x5c000000, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, + 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, + 0x4c000000, 0x59a80037, 0x82000580, 0x00000002, + 0x5c000000, 0x1c01f000, 0x4c000000, 0x4c040000, + 0x4c080000, 0x4c380000, 0x59a8003a, 0x82000c80, + 0x00000007, 0x02021800, 0x0010032e, 0x0c01f806, + 0x5c007000, 0x5c001000, 0x5c000800, 0x5c000000, + 0x1c01f000, 0x00101670, 0x00101683, 0x00101697, + 0x00101699, 0x001016c1, 0x001016c3, 0x001016c5, + 0x4803c856, 0x4a03503c, 0x00000000, 0x42000000, + 0x00000002, 0x0401fa32, 0x42000000, 0x00000002, + 0x0401f9b5, 0x0401fab1, 0x4803c856, 0x4a03503a, + 0x00000006, 0x42000800, 0x0000001e, 0x42001000, + 0x001016c6, 0x0201f000, 0x00106638, 0x497b503f, + 0x4a035034, 0x00000036, 0x4a035033, 0x0000002a, + 0x4803c856, 0x4a03503c, 0x00000001, 0x42000000, + 0x00000002, 0x0401f9a0, 0x4803c856, 0x4a03503a, + 0x00000006, 0x42000800, 0x0000001e, 0x42001000, + 0x001016c6, 0x0201f000, 0x00106638, 0x0201f800, + 0x0010032e, 0x4a035034, 0x00000036, 0x4803c856, + 0x4a03503c, 0x00000003, 0x42000800, 0x00000000, + 0x0401faa1, 0x82040d00, 0x00000090, 0x82040580, 0x00000090, 0x04000009, 0x82040580, 0x00000010, - 0x04000008, 0x82040580, 0x00000000, 0x04000007, - 0x0201f800, 0x0010032e, 0x84081540, 0x0401f004, - 0x84081542, 0x0401f002, 0x84081544, 0x480b5042, - 0x4a03503a, 0x00000001, 0x0401f003, 0x0401f8ce, - 0x0401ff81, 0x1c01f000, 0x0401f890, 0x04000053, - 0x0401f9fb, 0x0402002a, 0x42000800, 0x00000000, - 0x0401fa40, 0x82040d00, 0x00000090, 0x82040580, - 0x00000000, 0x04000045, 0x82040580, 0x00000010, - 0x04000006, 0x82040580, 0x00000090, 0x04000009, - 0x0201f800, 0x0010032e, 0x59c40801, 0x82040d00, - 0x00018000, 0x82040580, 0x00000000, 0x04000037, - 0x42000800, 0x00000000, 0x0401fa2a, 0x82040d00, - 0x00000090, 0x82040580, 0x00000010, 0x04000006, - 0x82040580, 0x00000090, 0x04000006, 0x02020800, - 0x0010032e, 0x59a80042, 0x84000542, 0x0401f003, - 0x59a80042, 0x84000540, 0x48035042, 0x59a8003f, - 0x80000000, 0x4803503f, 0x82000580, 0x00000005, - 0x04000003, 0x0401f862, 0x0401f01f, 0x497b503f, - 0x59c40801, 0x82040d00, 0x00018000, 0x82040580, - 0x00000000, 0x04000009, 0x82040580, 0x00008000, - 0x04000009, 0x82040580, 0x00010000, 0x04000009, + 0x04000009, 0x82040580, 0x00000000, 0x04000009, 0x0201f800, 0x0010032e, 0x42000000, 0x00000001, 0x0401f006, 0x42000000, 0x00000000, 0x0401f003, - 0x42000000, 0x00000002, 0x0401f960, 0x4a03503c, - 0x00000002, 0x0401f004, 0x4a03503a, 0x00000003, - 0x0401f002, 0x0401ff40, 0x1c01f000, 0x0401f83b, - 0x04000015, 0x59a80033, 0x80000040, 0x48035033, - 0x0401f9a3, 0x04020005, 0x4a03503a, 0x00000003, - 0x497b503b, 0x0401f00c, 0x59a80033, 0x80000540, - 0x04020003, 0x0401f8a2, 0x0401f002, 0x0401f84c, - 0x0401f82f, 0x497b503f, 0x4a03503c, 0x00000001, - 0x0401ff29, 0x1c01f000, 0x0401f824, 0x04000015, - 0x0401f98f, 0x0402000f, 0x59a80040, 0x80000000, - 0x48035040, 0x82000580, 0x00000007, 0x0402000c, - 0x4a035036, 0x0000000a, 0x497b5043, 0x59a80042, - 0x8400055e, 0x48035042, 0x4803c857, 0x0401f005, - 0x0401f817, 0x4a03503c, 0x00000004, 0x0401ff3c, - 0x1c01f000, 0x0401f80d, 0x04000007, 0x0401f978, - 0x04020003, 0x0401ff19, 0x0401f003, 0x0401f80c, - 0x0401ff33, 0x1c01f000, 0x0201f800, 0x0010032e, - 0x0201f800, 0x0010032e, 0x59a80034, 0x80000040, - 0x48035034, 0x04000892, 0x1c01f000, 0x4c040000, - 0x42000800, 0x00000000, 0x0401f9ae, 0x82040d00, - 0x00000090, 0x82040580, 0x00000090, 0x04000009, - 0x82040580, 0x00000010, 0x04000009, 0x82040580, - 0x00000000, 0x04000009, 0x0201f800, 0x0010032e, - 0x42000000, 0x00000002, 0x0401f006, 0x42000000, - 0x00000001, 0x0401f003, 0x42000000, 0x00000000, - 0x0401f8fe, 0x5c000800, 0x1c01f000, 0x4c040000, - 0x59c40801, 0x82040d00, 0x00018000, 0x82040580, - 0x00000000, 0x04000009, 0x82040580, 0x00008000, - 0x04000009, 0x82040580, 0x00010000, 0x04000009, - 0x0201f800, 0x0010032e, 0x42000000, 0x00000002, - 0x0401f006, 0x42000000, 0x00000001, 0x0401f003, - 0x42000000, 0x00000000, 0x0401f86a, 0x5c000800, - 0x1c01f000, 0x4c040000, 0x59a8003f, 0x80000000, - 0x4803503f, 0x82000580, 0x00000005, 0x04020019, + 0x42000000, 0x00000002, 0x0401f977, 0x497b5040, + 0x4803c856, 0x4a03503a, 0x00000006, 0x42000800, + 0x0000001e, 0x42001000, 0x001016c6, 0x0201f000, + 0x00106638, 0x0201f800, 0x0010032e, 0x0201f800, + 0x0010032e, 0x1c01f000, 0x4c000000, 0x4c040000, + 0x4c080000, 0x4c380000, 0x59a8003c, 0x82000c80, + 0x00000007, 0x02021800, 0x0010032e, 0x0c01f806, + 0x5c007000, 0x5c001000, 0x5c000800, 0x5c000000, + 0x1c01f000, 0x001016dc, 0x001016fb, 0x00101750, + 0x00101767, 0x0010177e, 0x00101787, 0x00101789, + 0x0401fa1c, 0x0402001b, 0x59a81042, 0x42000800, + 0x00000000, 0x0401fa60, 0x82040d00, 0x00000090, + 0x82040580, 0x00000090, 0x04000009, 0x82040580, + 0x00000010, 0x04000008, 0x82040580, 0x00000000, + 0x04000007, 0x0201f800, 0x0010032e, 0x84081540, + 0x0401f004, 0x84081542, 0x0401f002, 0x84081544, + 0x480b5042, 0x4a03503a, 0x00000001, 0x0401f003, + 0x0401f8ce, 0x0401ff81, 0x1c01f000, 0x0401f890, + 0x04000053, 0x0401f9fb, 0x0402002a, 0x42000800, + 0x00000000, 0x0401fa40, 0x82040d00, 0x00000090, + 0x82040580, 0x00000000, 0x04000045, 0x82040580, + 0x00000010, 0x04000006, 0x82040580, 0x00000090, + 0x04000009, 0x0201f800, 0x0010032e, 0x59c40801, + 0x82040d00, 0x00018000, 0x82040580, 0x00000000, + 0x04000037, 0x42000800, 0x00000000, 0x0401fa2a, + 0x82040d00, 0x00000090, 0x82040580, 0x00000010, + 0x04000006, 0x82040580, 0x00000090, 0x04000006, + 0x02020800, 0x0010032e, 0x59a80042, 0x84000542, + 0x0401f003, 0x59a80042, 0x84000540, 0x48035042, + 0x59a8003f, 0x80000000, 0x4803503f, 0x82000580, + 0x00000005, 0x04000003, 0x0401f862, 0x0401f01f, 0x497b503f, 0x59c40801, 0x82040d00, 0x00018000, 0x82040580, 0x00000000, 0x04000009, 0x82040580, 0x00008000, 0x04000009, 0x82040580, 0x00010000, 0x04000009, 0x0201f800, 0x0010032e, 0x42000000, + 0x00000001, 0x0401f006, 0x42000000, 0x00000000, + 0x0401f003, 0x42000000, 0x00000002, 0x0401f960, + 0x4a03503c, 0x00000002, 0x0401f004, 0x4a03503a, + 0x00000003, 0x0401f002, 0x0401ff40, 0x1c01f000, + 0x0401f83b, 0x04000015, 0x59a80033, 0x80000040, + 0x48035033, 0x0401f9a3, 0x04020005, 0x4a03503a, + 0x00000003, 0x497b503b, 0x0401f00c, 0x59a80033, + 0x80000540, 0x04020003, 0x0401f8a2, 0x0401f002, + 0x0401f84c, 0x0401f82f, 0x497b503f, 0x4a03503c, + 0x00000001, 0x0401ff29, 0x1c01f000, 0x0401f824, + 0x04000015, 0x0401f98f, 0x0402000f, 0x59a80040, + 0x80000000, 0x48035040, 0x82000580, 0x00000007, + 0x0402000c, 0x4a035036, 0x0000000a, 0x497b5043, + 0x59a80042, 0x8400055e, 0x48035042, 0x4803c857, + 0x0401f005, 0x0401f817, 0x4a03503c, 0x00000004, + 0x0401ff3c, 0x1c01f000, 0x0401f80d, 0x04000007, + 0x0401f978, 0x04020003, 0x0401ff19, 0x0401f003, + 0x0401f80c, 0x0401ff33, 0x1c01f000, 0x0201f800, + 0x0010032e, 0x0201f800, 0x0010032e, 0x59a80034, + 0x80000040, 0x48035034, 0x04000892, 0x1c01f000, + 0x4c040000, 0x42000800, 0x00000000, 0x0401f9ae, + 0x82040d00, 0x00000090, 0x82040580, 0x00000090, + 0x04000009, 0x82040580, 0x00000010, 0x04000009, + 0x82040580, 0x00000000, 0x04000009, 0x0201f800, + 0x0010032e, 0x42000000, 0x00000002, 0x0401f006, + 0x42000000, 0x00000001, 0x0401f003, 0x42000000, + 0x00000000, 0x0401f8fe, 0x5c000800, 0x1c01f000, + 0x4c040000, 0x59c40801, 0x82040d00, 0x00018000, + 0x82040580, 0x00000000, 0x04000009, 0x82040580, + 0x00008000, 0x04000009, 0x82040580, 0x00010000, + 0x04000009, 0x0201f800, 0x0010032e, 0x42000000, 0x00000002, 0x0401f006, 0x42000000, 0x00000001, - 0x0401f003, 0x42000000, 0x00000000, 0x0401f849, - 0x42000800, 0x00000000, 0x0401f95a, 0x82040d00, - 0x00000090, 0x82040580, 0x00000090, 0x04000009, - 0x82040580, 0x00000010, 0x04000009, 0x82040580, - 0x00000000, 0x04000009, 0x0201f800, 0x0010032e, + 0x0401f003, 0x42000000, 0x00000000, 0x0401f86a, + 0x5c000800, 0x1c01f000, 0x4c040000, 0x59a8003f, + 0x80000000, 0x4803503f, 0x82000580, 0x00000005, + 0x04020019, 0x497b503f, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04000009, + 0x82040580, 0x00008000, 0x04000009, 0x82040580, + 0x00010000, 0x04000009, 0x0201f800, 0x0010032e, 0x42000000, 0x00000002, 0x0401f006, 0x42000000, 0x00000001, 0x0401f003, 0x42000000, 0x00000000, - 0x0401f8aa, 0x5c000800, 0x1c01f000, 0x4c200000, - 0x59a80042, 0x82000500, 0x00007fff, 0x02000800, - 0x0010032e, 0x59a84041, 0x80204102, 0x02001800, - 0x0010032e, 0x48235041, 0x80204500, 0x040007fa, - 0x8c000504, 0x04020007, 0x8c000502, 0x04020008, - 0x8c000500, 0x04020009, 0x0201f800, 0x0010032e, - 0x42000000, 0x00000002, 0x0401f006, 0x42000000, - 0x00000000, 0x0401f003, 0x42000000, 0x00000001, - 0x0401f810, 0x5c004000, 0x1c01f000, 0x04011000, - 0x4a03c840, 0x0010c7ba, 0x4a03c842, 0x00000009, - 0x40000000, 0x040117ff, 0x4a035041, 0x00000004, - 0x4a035038, 0x00000000, 0x1c01f000, 0x40680000, + 0x0401f849, 0x42000800, 0x00000000, 0x0401f95a, + 0x82040d00, 0x00000090, 0x82040580, 0x00000090, + 0x04000009, 0x82040580, 0x00000010, 0x04000009, + 0x82040580, 0x00000000, 0x04000009, 0x0201f800, + 0x0010032e, 0x42000000, 0x00000002, 0x0401f006, + 0x42000000, 0x00000001, 0x0401f003, 0x42000000, + 0x00000000, 0x0401f8aa, 0x5c000800, 0x1c01f000, + 0x4c200000, 0x59a80042, 0x82000500, 0x00007fff, + 0x02000800, 0x0010032e, 0x59a84041, 0x80204102, + 0x02001800, 0x0010032e, 0x48235041, 0x80204500, + 0x040007fa, 0x8c000504, 0x04020007, 0x8c000502, + 0x04020008, 0x8c000500, 0x04020009, 0x0201f800, + 0x0010032e, 0x42000000, 0x00000002, 0x0401f006, + 0x42000000, 0x00000000, 0x0401f003, 0x42000000, + 0x00000001, 0x0401f810, 0x5c004000, 0x1c01f000, + 0x04011000, 0x4a03c840, 0x0010caba, 0x4a03c842, + 0x00000009, 0x40000000, 0x040117ff, 0x4a035041, + 0x00000004, 0x4a035038, 0x00000000, 0x1c01f000, + 0x40680000, 0x59a80878, 0x8c040d3e, 0x0402000c, + 0x59a80847, 0x82040d80, 0x01391077, 0x04020008, + 0x59e00813, 0x8c040d00, 0x04000005, 0x82000d80, + 0x00000002, 0x04020002, 0x41780000, 0x59a80847, + 0x82040d80, 0x015b1077, 0x0402000b, 0x4a03c014, + 0x00200020, 0x82000d80, 0x00000001, 0x42000800, + 0x00200000, 0x04000003, 0x42000800, 0x00200020, + 0x4807c013, 0x800001c0, 0x04000040, 0x82000d80, + 0x00000001, 0x0402001d, 0x42000800, 0x000000a0, + 0x0401f8f1, 0x82040540, 0x00000004, 0x42000800, + 0x000000a0, 0x0401f8f4, 0x42000800, 0x000000c0, + 0x0401f8e9, 0x82040540, 0x00000020, 0x42000800, + 0x000000c0, 0x0401f8ec, 0x59c40001, 0x82000500, + 0xfffe7fff, 0x82000540, 0x00000000, 0x48038801, + 0x59a80044, 0x80000110, 0x42000800, 0x000000e0, + 0x0401f8e1, 0x0401f03c, 0x82000d80, 0x00000002, + 0x02020800, 0x0010032e, 0x42000800, 0x000000a0, + 0x0401f8d1, 0x82040500, 0xfffffffb, 0x42000800, + 0x000000a0, 0x0401f8d4, 0x42000800, 0x000000c0, + 0x0401f8c9, 0x82040500, 0xffffffdf, 0x42000800, + 0x000000c0, 0x0401f8cc, 0x59c40001, 0x82000500, + 0xfffe7fff, 0x82000540, 0x00010000, 0x48038801, + 0x59a80046, 0x80000110, 0x42000800, 0x000000e0, + 0x0401f8c1, 0x0401f01c, 0x42000800, 0x000000a0, + 0x0401f8b5, 0x82040540, 0x00000004, 0x42000800, + 0x000000a0, 0x0401f8b8, 0x42000800, 0x000000c0, + 0x0401f8ad, 0x82040500, 0xffffffdf, 0x42000800, + 0x000000c0, 0x0401f8b0, 0x59c40001, 0x82000500, + 0xfffe7fff, 0x82000540, 0x00008000, 0x48038801, + 0x59a80045, 0x80000110, 0x42000800, 0x000000e0, + 0x0401f8a5, 0x1c01f000, 0x40680000, 0x4803c857, 0x59a80878, 0x8c040d3e, 0x0402000c, 0x59a80847, 0x82040d80, 0x01391077, 0x04020008, 0x59e00813, 0x8c040d00, 0x04000005, 0x82000d80, 0x00000002, - 0x04020002, 0x41780000, 0x59a80847, 0x82040d80, - 0x015b1077, 0x0402000b, 0x4a03c014, 0x00200020, - 0x82000d80, 0x00000001, 0x42000800, 0x00200000, - 0x04000003, 0x42000800, 0x00200020, 0x4807c013, - 0x800001c0, 0x04000040, 0x82000d80, 0x00000001, - 0x0402001d, 0x42000800, 0x000000a0, 0x0401f8f1, - 0x82040540, 0x00000004, 0x42000800, 0x000000a0, - 0x0401f8f4, 0x42000800, 0x000000c0, 0x0401f8e9, - 0x82040540, 0x00000020, 0x42000800, 0x000000c0, - 0x0401f8ec, 0x59c40001, 0x82000500, 0xfffe7fff, - 0x82000540, 0x00000000, 0x48038801, 0x59a80044, - 0x80000110, 0x42000800, 0x000000e0, 0x0401f8e1, - 0x0401f03c, 0x82000d80, 0x00000002, 0x02020800, - 0x0010032e, 0x42000800, 0x000000a0, 0x0401f8d1, - 0x82040500, 0xfffffffb, 0x42000800, 0x000000a0, - 0x0401f8d4, 0x42000800, 0x000000c0, 0x0401f8c9, - 0x82040500, 0xffffffdf, 0x42000800, 0x000000c0, - 0x0401f8cc, 0x59c40001, 0x82000500, 0xfffe7fff, - 0x82000540, 0x00010000, 0x48038801, 0x59a80046, - 0x80000110, 0x42000800, 0x000000e0, 0x0401f8c1, - 0x0401f01c, 0x42000800, 0x000000a0, 0x0401f8b5, - 0x82040540, 0x00000004, 0x42000800, 0x000000a0, - 0x0401f8b8, 0x42000800, 0x000000c0, 0x0401f8ad, - 0x82040500, 0xffffffdf, 0x42000800, 0x000000c0, - 0x0401f8b0, 0x59c40001, 0x82000500, 0xfffe7fff, - 0x82000540, 0x00008000, 0x48038801, 0x59a80045, - 0x80000110, 0x42000800, 0x000000e0, 0x0401f8a5, - 0x1c01f000, 0x40680000, 0x4803c857, 0x59a80878, - 0x8c040d3e, 0x0402000c, 0x59a80847, 0x82040d80, - 0x01391077, 0x04020008, 0x59e00813, 0x8c040d00, - 0x04000005, 0x82000d80, 0x00000002, 0x04020002, - 0x41780000, 0x4c000000, 0x0401f976, 0x5c000000, - 0x800001c0, 0x04000026, 0x82000d80, 0x00000001, - 0x04020010, 0x59a8006d, 0x80000540, 0x04000004, - 0x42001000, 0x00000000, 0x0401fa87, 0x42000800, - 0x00000000, 0x0401f87b, 0x82040540, 0x00000090, - 0x42000800, 0x00000000, 0x0401f87e, 0x0401f024, - 0x82000d80, 0x00000002, 0x02020800, 0x0010032e, + 0x04020002, 0x41780000, 0x4c000000, 0x0401f976, + 0x5c000000, 0x800001c0, 0x04000026, 0x82000d80, + 0x00000001, 0x04020010, 0x59a8006d, 0x80000540, + 0x04000004, 0x42001000, 0x00000000, 0x0401fa87, + 0x42000800, 0x00000000, 0x0401f87b, 0x82040540, + 0x00000090, 0x42000800, 0x00000000, 0x0401f87e, + 0x0401f024, 0x82000d80, 0x00000002, 0x02020800, + 0x0010032e, 0x59a8006d, 0x80000540, 0x04000004, + 0x42001000, 0x00010000, 0x0401fa74, 0x42000800, + 0x00000000, 0x0401f868, 0x82040500, 0xffffff6f, + 0x42000800, 0x00000000, 0x0401f86b, 0x0401f011, 0x59a8006d, 0x80000540, 0x04000004, 0x42001000, - 0x00010000, 0x0401fa74, 0x42000800, 0x00000000, - 0x0401f868, 0x82040500, 0xffffff6f, 0x42000800, - 0x00000000, 0x0401f86b, 0x0401f011, 0x59a8006d, - 0x80000540, 0x04000004, 0x42001000, 0x00008000, - 0x0401fa65, 0x42000800, 0x00000000, 0x0401f859, - 0x82040500, 0xffffff6f, 0x82000540, 0x00000010, - 0x42000800, 0x00000000, 0x0401f85a, 0x0401f145, - 0x0401f807, 0x42018800, 0x00000001, 0x04000003, - 0x42018800, 0x00000000, 0x1c01f000, 0x4c580000, - 0x4200b000, 0x00000014, 0x8058b040, 0x0400002a, - 0x59c4000d, 0x8c000520, 0x040207fc, 0x0401f83a, - 0x59c4000d, 0x8c000520, 0x040207f8, 0x59c40808, - 0x82040d40, 0x00000100, 0x48078808, 0x4200b000, - 0x000000c8, 0x8058b040, 0x040207ff, 0x4200b000, - 0x00000014, 0x8058b040, 0x04000017, 0x59c4000d, - 0x8c000520, 0x04020014, 0x0401f827, 0x59c4000d, - 0x8c000520, 0x04020010, 0x4200b000, 0x0000000a, - 0x8058b040, 0x04000003, 0x0401f81f, 0x0401f7fd, - 0x4200b000, 0x00000064, 0x59c4000d, 0x8c00051e, - 0x04000005, 0x8058b040, 0x040207fc, 0x80000580, - 0x0401f003, 0x82000540, 0x00000001, 0x5c00b000, - 0x1c01f000, 0x42000800, 0x000000a0, 0x0401f815, - 0x82040500, 0xfffffffe, 0x42000800, 0x000000a0, - 0x0401f818, 0x42000800, 0x00000000, 0x0401f80d, - 0x82040500, 0xfffffffe, 0x42000800, 0x00000000, - 0x0401f010, 0x40000000, 0x40000000, 0x40000000, - 0x40000000, 0x40000000, 0x1c01f000, 0x40680800, - 0x4807880e, 0x59c4080f, 0x82040d00, 0x000000ff, - 0x40058800, 0x1c01f000, 0x40680800, 0x406c0000, - 0x900001c0, 0x80040d40, 0x84040d40, 0x4807880e, - 0x1c01f000, 0x82000d80, 0x00200000, 0x04000009, - 0x82000d80, 0x02000000, 0x04000006, 0x82000d80, - 0x01000000, 0x04000006, 0x59c408a3, 0x0401f006, - 0x59c408a3, 0x84040d30, 0x0401f003, 0x59c408a3, - 0x84040d32, 0x80040540, 0x480388a3, 0x480788a3, - 0x1c01f000, 0x59c400a3, 0x84000556, 0x480388a3, - 0x84000516, 0x480388a3, 0x1c01f000, 0x485fc857, - 0x4863c857, 0x4c640000, 0x4d3c0000, 0x4d400000, - 0x0201f800, 0x00106faf, 0x48635009, 0x40601800, - 0x42002000, 0x00000000, 0x0401fad3, 0x42000000, - 0x0010cb85, 0x0201f800, 0x0010bc88, 0x82600500, - 0x0000ff00, 0x82000580, 0x0000f700, 0x04020005, - 0x42000000, 0x0010cb6d, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x0010bd90, 0x040200a5, 0x82600d00, - 0x0000ff00, 0x42024000, 0x0000ffff, 0x800409c0, - 0x0400001e, 0x82041580, 0x0000f700, 0x04000016, - 0x82041580, 0x0000f800, 0x04000013, 0x82041580, - 0x0000ff00, 0x4200c800, 0x00000000, 0x04000030, - 0x840439c0, 0x0201f800, 0x00101f66, 0x0402001b, - 0x83200400, 0x0010bdc7, 0x50024800, 0x59240200, - 0x8c000500, 0x04000015, 0x4200c800, 0x00000001, - 0x0401f023, 0x42024800, 0x0010ccd1, 0x59240200, - 0x8c000502, 0x0400000d, 0x59c410a3, 0x82081500, - 0x00008000, 0x04000009, 0x59c410a7, 0x82081500, - 0x0000ff00, 0x82081580, 0x0000ff00, 0x4200c800, - 0x00000000, 0x04000012, 0x8d0e1d02, 0x04020007, - 0x8d0e1d00, 0x0402000e, 0x599c1017, 0x8c08151a, - 0x04000065, 0x850e1d42, 0x42024000, 0x0000ffff, - 0x4200c800, 0x00000002, 0x42028000, 0x00000004, - 0x42027800, 0x00000008, 0x0401f005, 0x850e1d40, - 0x42028000, 0x00000004, 0x417a7800, 0x59a80005, - 0x8c000502, 0x04020004, 0x8d0e1d0a, 0x0402005c, - 0x850e1d4a, 0x42000000, 0x0010cb6c, 0x0201f800, - 0x0010bc88, 0x59a81809, 0x42001000, 0x00008013, - 0x0201f800, 0x001038bc, 0x83200580, 0x0000ffff, - 0x0400001f, 0x59240400, 0x8c000508, 0x0400000a, - 0x417a7800, 0x4d300000, 0x417a6000, 0x0201f800, - 0x00101fa9, 0x5c026000, 0x59240400, 0x8c00050a, - 0x04020043, 0x4d400000, 0x82600500, 0x000000ff, - 0x42028800, 0x0000ffff, 0x40643000, 0x42028000, - 0x0000000e, 0x0201f800, 0x0010ae86, 0x42000800, + 0x00008000, 0x0401fa65, 0x42000800, 0x00000000, + 0x0401f859, 0x82040500, 0xffffff6f, 0x82000540, + 0x00000010, 0x42000800, 0x00000000, 0x0401f85a, + 0x0401f145, 0x0401f807, 0x42018800, 0x00000001, + 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, + 0x4c580000, 0x4200b000, 0x00000014, 0x8058b040, + 0x0400002a, 0x59c4000d, 0x8c000520, 0x040207fc, + 0x0401f83a, 0x59c4000d, 0x8c000520, 0x040207f8, + 0x59c40808, 0x82040d40, 0x00000100, 0x48078808, + 0x4200b000, 0x000000c8, 0x8058b040, 0x040207ff, + 0x4200b000, 0x00000014, 0x8058b040, 0x04000017, + 0x59c4000d, 0x8c000520, 0x04020014, 0x0401f827, + 0x59c4000d, 0x8c000520, 0x04020010, 0x4200b000, + 0x0000000a, 0x8058b040, 0x04000003, 0x0401f81f, + 0x0401f7fd, 0x4200b000, 0x00000064, 0x59c4000d, + 0x8c00051e, 0x04000005, 0x8058b040, 0x040207fc, + 0x80000580, 0x0401f003, 0x82000540, 0x00000001, + 0x5c00b000, 0x1c01f000, 0x42000800, 0x000000a0, + 0x0401f815, 0x82040500, 0xfffffffe, 0x42000800, + 0x000000a0, 0x0401f818, 0x42000800, 0x00000000, + 0x0401f80d, 0x82040500, 0xfffffffe, 0x42000800, + 0x00000000, 0x0401f010, 0x40000000, 0x40000000, + 0x40000000, 0x40000000, 0x40000000, 0x1c01f000, + 0x40680800, 0x4807880e, 0x59c4080f, 0x82040d00, + 0x000000ff, 0x40058800, 0x1c01f000, 0x40680800, + 0x406c0000, 0x900001c0, 0x80040d40, 0x84040d40, + 0x4807880e, 0x1c01f000, 0x82000d80, 0x00200000, + 0x04000009, 0x82000d80, 0x02000000, 0x04000006, + 0x82000d80, 0x01000000, 0x04000006, 0x59c408a3, + 0x0401f006, 0x59c408a3, 0x84040d30, 0x0401f003, + 0x59c408a3, 0x84040d32, 0x80040540, 0x480388a3, + 0x480788a3, 0x1c01f000, 0x59c400a3, 0x84000556, + 0x480388a3, 0x84000516, 0x480388a3, 0x1c01f000, + 0x485fc857, 0x4863c857, 0x4c640000, 0x4d3c0000, + 0x4d400000, 0x0201f800, 0x001071b4, 0x48635009, + 0x40601800, 0x42002000, 0x00000000, 0x0401fad3, + 0x42000000, 0x0010ce85, 0x0201f800, 0x0010bfb3, + 0x82600500, 0x0000ff00, 0x82000580, 0x0000f700, + 0x04020005, 0x42000000, 0x0010ce6d, 0x0201f800, + 0x0010bfb3, 0x0201f800, 0x0010c0bb, 0x040200a5, + 0x82600d00, 0x0000ff00, 0x42024000, 0x0000ffff, + 0x800409c0, 0x0400001e, 0x82041580, 0x0000f700, + 0x04000016, 0x82041580, 0x0000f800, 0x04000013, + 0x82041580, 0x0000ff00, 0x4200c800, 0x00000000, + 0x04000030, 0x840439c0, 0x0201f800, 0x00101fc9, + 0x0402001b, 0x83200400, 0x0010c10d, 0x50024800, + 0x59240200, 0x8c000500, 0x04000015, 0x4200c800, + 0x00000001, 0x0401f023, 0x42024800, 0x0010cfd1, + 0x59240200, 0x8c000502, 0x0400000d, 0x59c410a3, + 0x82081500, 0x00008000, 0x04000009, 0x59c410a7, + 0x82081500, 0x0000ff00, 0x82081580, 0x0000ff00, + 0x4200c800, 0x00000000, 0x04000012, 0x8d0e1d02, + 0x04020007, 0x8d0e1d00, 0x0402000e, 0x599c1017, + 0x8c08151a, 0x04000065, 0x850e1d42, 0x42024000, + 0x0000ffff, 0x4200c800, 0x00000002, 0x42028000, + 0x00000004, 0x42027800, 0x00000008, 0x0401f005, + 0x850e1d40, 0x42028000, 0x00000004, 0x417a7800, + 0x59a80005, 0x8c000502, 0x04020004, 0x8d0e1d0a, + 0x0402005c, 0x850e1d4a, 0x42000000, 0x0010ce6c, + 0x0201f800, 0x0010bfb3, 0x59a81809, 0x42001000, + 0x00008013, 0x0201f800, 0x001039ac, 0x83200580, + 0x0000ffff, 0x0400001f, 0x59240400, 0x8c000508, + 0x0400000a, 0x417a7800, 0x4d300000, 0x417a6000, + 0x0201f800, 0x0010200c, 0x5c026000, 0x59240400, + 0x8c00050a, 0x04020043, 0x4d400000, 0x82600500, + 0x000000ff, 0x42028800, 0x0000ffff, 0x40643000, + 0x42028000, 0x0000000e, 0x0201f800, 0x0010b195, + 0x42000800, 0x00000001, 0x42001000, 0x00000100, + 0x0201f800, 0x00106753, 0x5c028000, 0x0401f031, + 0x8d0e1d20, 0x04000020, 0x4c580000, 0x42024800, + 0x0010cfd1, 0x0201f800, 0x0010c0ca, 0x4d400000, + 0x59240200, 0x8c000500, 0x04000007, 0x42000800, 0x00000001, 0x42001000, 0x00000100, 0x0201f800, - 0x0010654e, 0x5c028000, 0x0401f031, 0x8d0e1d20, - 0x04000020, 0x4c580000, 0x42024800, 0x0010ccd1, - 0x0201f800, 0x0010bd9f, 0x4d400000, 0x59240200, - 0x8c000500, 0x04000007, 0x42000800, 0x00000001, - 0x42001000, 0x00000100, 0x0201f800, 0x0010654e, - 0x83264c00, 0x0000000b, 0x8058b040, 0x040207f4, - 0x42028000, 0x0000000e, 0x42028800, 0x0000ffff, - 0x40643000, 0x0201f800, 0x0010ae86, 0x5c028000, - 0x5c00b000, 0x599c0817, 0x8c040d0a, 0x04020010, - 0x493fc857, 0x4943c857, 0x0201f800, 0x0010fbe5, - 0x0401f00b, 0x8d0e1d20, 0x04000009, 0x42028000, - 0x0000000f, 0x42028800, 0x0000ffff, 0x42003000, - 0x00000000, 0x0201f800, 0x0010ae89, 0x497b8880, - 0x5c028000, 0x5c027800, 0x5c00c800, 0x1c01f000, - 0x42000800, 0x00000000, 0x0401ff12, 0x82040540, - 0x00000002, 0x42000800, 0x00000000, 0x0401f715, - 0x42000800, 0x00000000, 0x0401ff0a, 0x82040500, - 0xfffffffd, 0x42000800, 0x00000000, 0x0401f70d, - 0x59c408a8, 0x0401fefc, 0x0401fefb, 0x59c400a8, - 0x80040d80, 0x040207fb, 0x1c01f000, 0x4803c856, - 0x4a038807, 0x00000001, 0x497b8807, 0x59c40005, - 0x48038805, 0x497b506d, 0x497b506e, 0x59e00024, - 0x8c000510, 0x04020038, 0x41785800, 0x42006000, - 0x00000001, 0x42006800, 0x00000003, 0x0401f87c, - 0x0401f887, 0x40400000, 0x4803c857, 0x82408580, - 0x00000000, 0x0402002c, 0x41785800, 0x42006000, - 0x00000004, 0x42006800, 0x00000006, 0x0401f870, - 0x0401f87b, 0x40400000, 0x4803c857, 0x82408580, - 0x0000001a, 0x04020020, 0x42005800, 0x00000001, - 0x42006000, 0x0000001e, 0x42006800, 0x00000014, - 0x0401f863, 0x0401f86e, 0x40400000, 0x4803c857, - 0x82408580, 0x0000ffff, 0x04020013, 0x4a03506d, - 0x00000001, 0x4803c856, 0x42001800, 0x001200f5, - 0x0401f9b3, 0x42001800, 0x003a0001, 0x0401f9b0, - 0x42001800, 0x000200f5, 0x0401f9ad, 0x42001800, - 0x00020001, 0x0401f9aa, 0x42001800, 0x00000001, - 0x0401f9a7, 0x1c01f000, 0x42005800, 0x00000000, - 0x42006000, 0x0000001e, 0x40006800, 0x0401f844, - 0x0401f84f, 0x40400000, 0x1c01f000, 0x59a8006d, - 0x80000540, 0x0400003d, 0x5c036000, 0x4db00000, - 0x49b3c857, 0x4c5c0000, 0x4c600000, 0x42000800, - 0x00000001, 0x0401f945, 0x42000000, 0x0000000a, - 0x0401ffea, 0x4000b800, 0x825c0480, 0x00000005, - 0x02021800, 0x0010032e, 0x4200c000, 0x00000008, - 0x825c0480, 0x00000004, 0x04001003, 0x4200c000, - 0x00000004, 0x59c8000b, 0x4803c857, 0x59c4009e, - 0x82000d80, 0x00000003, 0x0402001e, 0x825c0d80, - 0x00000003, 0x0400001b, 0x485fc857, 0x42000000, - 0x00000015, 0x0401ffd1, 0x80600540, 0x4c000000, - 0x41785800, 0x42006000, 0x0000001e, 0x42006800, - 0x00000015, 0x0401f812, 0x5c000000, 0x40006800, - 0x0401f815, 0x82600580, 0x00000004, 0x04000003, - 0x805cb800, 0x0401f7ea, 0x805cb840, 0x825c0580, - 0x00000003, 0x02020800, 0x0010032e, 0x0401f7e4, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x41785000, - 0x0401f812, 0x0401f838, 0x40347000, 0x40340800, - 0x0401f03d, 0x42005000, 0x00000001, 0x0401f80b, - 0x0401f831, 0x40340800, 0x0401f037, 0x42005000, - 0x00000002, 0x0401f805, 0x0401f81d, 0x0401f835, - 0x40048000, 0x1c01f000, 0x0401f808, 0x0401f814, - 0x40280800, 0x0401f826, 0x402c0800, 0x0401f827, - 0x40300800, 0x0401f025, 0x42000800, 0x0000ffff, - 0x42001000, 0x00000001, 0x0401f829, 0x42001000, - 0x00000010, 0x0401f826, 0x42000800, 0x0000ffff, - 0x42001000, 0x00000010, 0x0401f021, 0x41780800, - 0x42001000, 0x00000002, 0x0401f01d, 0x0401f946, - 0x4a03d000, 0x00050004, 0x0401f943, 0x4a03d000, - 0x00050005, 0x0401f940, 0x4a03d000, 0x00050004, - 0x42000800, 0x00000001, 0x42001000, 0x00000001, - 0x0401f00f, 0x42000800, 0x00000002, 0x42001000, - 0x00000002, 0x0401f00a, 0x42001000, 0x00000005, - 0x0401f007, 0x42001000, 0x00000010, 0x0401f004, - 0x42001000, 0x00000010, 0x0401f01b, 0x0401f92a, - 0x82082c00, 0x0010bdb6, 0x50142800, 0x82081500, - 0xffffffff, 0x04000013, 0x0401f923, 0x80081040, - 0x80142902, 0x40040000, 0x80140500, 0x04000007, - 0x4a03d000, 0x00070006, 0x0401f91b, 0x4a03d000, - 0x00070007, 0x0401f006, 0x4a03d000, 0x00070004, - 0x0401f915, 0x4a03d000, 0x00070005, 0x0401f7ec, - 0x1c01f000, 0x41780800, 0x82082c00, 0x0010bdb6, - 0x50142800, 0x82081500, 0xffffffff, 0x04000010, - 0x0401f909, 0x4a03d000, 0x00050001, 0x0401f906, - 0x59e81800, 0x80081040, 0x80142902, 0x8c0c1d06, - 0x04000004, 0x40140000, 0x80040d40, 0x0401f8fe, - 0x4a03d000, 0x00070000, 0x0401f7ef, 0x1c01f000, - 0x40681000, 0x4c5c0000, 0x4c080000, 0x42000000, - 0x00000014, 0x0401ff39, 0x4000b800, 0x42000800, - 0x00000001, 0x0401f88d, 0x5c001000, 0x480bc857, - 0x480b506e, 0x59c40001, 0x82000500, 0xffffefff, - 0x48038801, 0x41781800, 0x0401f8d1, 0x41785800, - 0x42006000, 0x0000001e, 0x42006800, 0x00000004, - 0x0401ff6f, 0x42006800, 0x0000003c, 0x0401ff72, - 0x41785800, 0x42006000, 0x0000001e, 0x42006800, - 0x00000004, 0x0401ff66, 0x41786800, 0x0401ff6a, - 0x41785800, 0x42006000, 0x0000001e, 0x41786800, - 0x0401ff5f, 0x42006800, 0x00000002, 0x0401ff62, - 0x42006800, 0x00000001, 0x0401ff59, 0x42006800, - 0x000000f5, 0x0401ff5c, 0x41785800, 0x42006000, - 0x0000001e, 0x42006800, 0x00000004, 0x0401ff50, - 0x42006800, 0x00000020, 0x0401ff53, 0x59a8106e, - 0x0401f872, 0x42001800, 0x000200f5, 0x0401f8a4, - 0x59a8106e, 0x0401f886, 0x41785800, 0x42006000, - 0x0000001e, 0x42006800, 0x00000004, 0x0401ff40, - 0x41786800, 0x0401ff44, 0x42000000, 0x00000015, - 0x0401fef2, 0x82000540, 0x00000002, 0x4c000000, - 0x41785800, 0x42006000, 0x0000001e, 0x42006800, - 0x00000015, 0x0401ff32, 0x5c000000, 0x40006800, - 0x0401ff35, 0x42000000, 0x00000015, 0x0401fee3, - 0x82000500, 0x0000fffd, 0x4c000000, 0x41785800, - 0x42006000, 0x0000001e, 0x42006800, 0x00000015, - 0x0401ff23, 0x5c000000, 0x40006800, 0x0401ff26, - 0x42000000, 0x00000014, 0x0401fed4, 0x82000540, - 0x00000040, 0x4c000000, 0x41785800, 0x42006000, - 0x0000001e, 0x42006800, 0x00000014, 0x0401ff14, - 0x5c000000, 0x40006800, 0x0401ff17, 0x42000000, - 0x00000014, 0x0401fec5, 0x82000500, 0x0000ffbf, + 0x00106753, 0x83264c00, 0x0000000b, 0x8058b040, + 0x040207f4, 0x42028000, 0x0000000e, 0x42028800, + 0x0000ffff, 0x40643000, 0x0201f800, 0x0010b195, + 0x5c028000, 0x5c00b000, 0x599c0817, 0x8c040d0a, + 0x04020010, 0x493fc857, 0x4943c857, 0x0201f800, + 0x0010fef2, 0x0401f00b, 0x8d0e1d20, 0x04000009, + 0x42028000, 0x0000000f, 0x42028800, 0x0000ffff, + 0x42003000, 0x00000000, 0x0201f800, 0x0010b198, + 0x497b8880, 0x5c028000, 0x5c027800, 0x5c00c800, + 0x1c01f000, 0x42000800, 0x00000000, 0x0401ff12, + 0x82040540, 0x00000002, 0x42000800, 0x00000000, + 0x0401f715, 0x42000800, 0x00000000, 0x0401ff0a, + 0x82040500, 0xfffffffd, 0x42000800, 0x00000000, + 0x0401f70d, 0x59c408a8, 0x0401fefc, 0x0401fefb, + 0x59c400a8, 0x80040d80, 0x040207fb, 0x1c01f000, + 0x4803c856, 0x4a038807, 0x00000001, 0x497b8807, + 0x59c40005, 0x48038805, 0x497b506d, 0x497b506e, + 0x59e00024, 0x8c000510, 0x04020038, 0x41785800, + 0x42006000, 0x00000001, 0x42006800, 0x00000003, + 0x0401f87c, 0x0401f887, 0x40400000, 0x4803c857, + 0x82408580, 0x00000000, 0x0402002c, 0x41785800, + 0x42006000, 0x00000004, 0x42006800, 0x00000006, + 0x0401f870, 0x0401f87b, 0x40400000, 0x4803c857, + 0x82408580, 0x0000001a, 0x04020020, 0x42005800, + 0x00000001, 0x42006000, 0x0000001e, 0x42006800, + 0x00000014, 0x0401f863, 0x0401f86e, 0x40400000, + 0x4803c857, 0x82408580, 0x0000ffff, 0x04020013, + 0x4a03506d, 0x00000001, 0x4803c856, 0x42001800, + 0x001200f5, 0x0401f9b3, 0x42001800, 0x003a0001, + 0x0401f9b0, 0x42001800, 0x000200f5, 0x0401f9ad, + 0x42001800, 0x00020001, 0x0401f9aa, 0x42001800, + 0x00000001, 0x0401f9a7, 0x1c01f000, 0x42005800, + 0x00000000, 0x42006000, 0x0000001e, 0x40006800, + 0x0401f844, 0x0401f84f, 0x40400000, 0x1c01f000, + 0x59a8006d, 0x80000540, 0x0400003d, 0x5c036000, + 0x4db00000, 0x49b3c857, 0x4c5c0000, 0x4c600000, + 0x42000800, 0x00000001, 0x0401f945, 0x42000000, + 0x0000000a, 0x0401ffea, 0x4000b800, 0x825c0480, + 0x00000005, 0x02021800, 0x0010032e, 0x4200c000, + 0x00000008, 0x825c0480, 0x00000004, 0x04001003, + 0x4200c000, 0x00000004, 0x59c8000b, 0x4803c857, + 0x59c4009e, 0x82000d80, 0x00000003, 0x0402001e, + 0x825c0d80, 0x00000003, 0x0400001b, 0x485fc857, + 0x42000000, 0x00000015, 0x0401ffd1, 0x80600540, 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, - 0x42006800, 0x00000014, 0x0401ff05, 0x5c000000, - 0x40006800, 0x0401ff08, 0x4a038886, 0x00002020, - 0x41780800, 0x8c5cbd06, 0x04000003, 0x42000800, - 0x00000001, 0x0401f809, 0x59c40001, 0x82000540, - 0x00001000, 0x48038801, 0x0401f867, 0x0401feb4, - 0x5c00b800, 0x1c01f000, 0x59a8006d, 0x80000540, - 0x04000015, 0x4807c857, 0x42000000, 0x00000014, - 0x4c040000, 0x0401fea1, 0x5c000800, 0x84000546, - 0x800409c0, 0x04020002, 0x84000506, 0x4c000000, + 0x42006800, 0x00000015, 0x0401f812, 0x5c000000, + 0x40006800, 0x0401f815, 0x82600580, 0x00000004, + 0x04000003, 0x805cb800, 0x0401f7ea, 0x805cb840, + 0x825c0580, 0x00000003, 0x02020800, 0x0010032e, + 0x0401f7e4, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x41785000, 0x0401f812, 0x0401f838, 0x40347000, + 0x40340800, 0x0401f03d, 0x42005000, 0x00000001, + 0x0401f80b, 0x0401f831, 0x40340800, 0x0401f037, + 0x42005000, 0x00000002, 0x0401f805, 0x0401f81d, + 0x0401f835, 0x40048000, 0x1c01f000, 0x0401f808, + 0x0401f814, 0x40280800, 0x0401f826, 0x402c0800, + 0x0401f827, 0x40300800, 0x0401f025, 0x42000800, + 0x0000ffff, 0x42001000, 0x00000001, 0x0401f829, + 0x42001000, 0x00000010, 0x0401f826, 0x42000800, + 0x0000ffff, 0x42001000, 0x00000010, 0x0401f021, + 0x41780800, 0x42001000, 0x00000002, 0x0401f01d, + 0x0401f946, 0x4a03d000, 0x00050004, 0x0401f943, + 0x4a03d000, 0x00050005, 0x0401f940, 0x4a03d000, + 0x00050004, 0x42000800, 0x00000001, 0x42001000, + 0x00000001, 0x0401f00f, 0x42000800, 0x00000002, + 0x42001000, 0x00000002, 0x0401f00a, 0x42001000, + 0x00000005, 0x0401f007, 0x42001000, 0x00000010, + 0x0401f004, 0x42001000, 0x00000010, 0x0401f01b, + 0x0401f92a, 0x82082c00, 0x0010c0fc, 0x50142800, + 0x82081500, 0xffffffff, 0x04000013, 0x0401f923, + 0x80081040, 0x80142902, 0x40040000, 0x80140500, + 0x04000007, 0x4a03d000, 0x00070006, 0x0401f91b, + 0x4a03d000, 0x00070007, 0x0401f006, 0x4a03d000, + 0x00070004, 0x0401f915, 0x4a03d000, 0x00070005, + 0x0401f7ec, 0x1c01f000, 0x41780800, 0x82082c00, + 0x0010c0fc, 0x50142800, 0x82081500, 0xffffffff, + 0x04000010, 0x0401f909, 0x4a03d000, 0x00050001, + 0x0401f906, 0x59e81800, 0x80081040, 0x80142902, + 0x8c0c1d06, 0x04000004, 0x40140000, 0x80040d40, + 0x0401f8fe, 0x4a03d000, 0x00070000, 0x0401f7ef, + 0x1c01f000, 0x40681000, 0x4c5c0000, 0x4c080000, + 0x42000000, 0x00000014, 0x0401ff39, 0x4000b800, + 0x42000800, 0x00000001, 0x0401f88d, 0x5c001000, + 0x480bc857, 0x480b506e, 0x59c40001, 0x82000500, + 0xffffefff, 0x48038801, 0x41781800, 0x0401f8d1, 0x41785800, 0x42006000, 0x0000001e, 0x42006800, - 0x00000014, 0x0401fede, 0x5c000000, 0x40006800, - 0x0401fee1, 0x1c01f000, 0x480bc857, 0x82080580, - 0x00010000, 0x04020007, 0x82040d40, 0x00010000, - 0x42001800, 0x00000001, 0x0401f82d, 0x0401f00f, - 0x82080580, 0x00008000, 0x04000007, 0x82040d40, - 0x00000000, 0x42001800, 0x00900001, 0x0401f824, - 0x0401f006, 0x82040d40, 0x00008000, 0x42001800, - 0x00100001, 0x0401f81e, 0x1c01f000, 0x480bc857, - 0x82080580, 0x00010000, 0x04020008, 0x42001800, - 0x000000a1, 0x0401f816, 0x42001800, 0x000000c1, - 0x0401f813, 0x0401f011, 0x82080580, 0x00008000, - 0x04000008, 0x42001800, 0x000400a1, 0x0401f80c, - 0x42001800, 0x002000c1, 0x0401f809, 0x0401f007, - 0x42001800, 0x000400a1, 0x0401f805, 0x42001800, - 0x000000c1, 0x0401f802, 0x1c01f000, 0x480fc857, - 0x41785800, 0x42006000, 0x0000001e, 0x41786800, - 0x0401fe9f, 0x400c6800, 0x80346960, 0x0401fea2, - 0x42006800, 0x00000001, 0x0401fe99, 0x400c6800, - 0x0401fe9d, 0x42006800, 0x00000003, 0x0401fe94, - 0x0401fe9f, 0x40400000, 0x8c000504, 0x040207fc, - 0x1c01f000, 0x40000000, 0x40000000, 0x40000000, - 0x1c01f000, 0x59a80005, 0x8c000500, 0x0400000a, - 0x59a80008, 0x8c000500, 0x04020007, 0x84000540, - 0x48035008, 0x42001000, 0x00008016, 0x0201f800, - 0x001038bc, 0x1c01f000, 0x4803c856, 0x59a80006, - 0x8c00051e, 0x0402000a, 0x42028800, 0x000007fc, - 0x42003000, 0x00fffffc, 0x0201f800, 0x0010452c, - 0x04020008, 0x0401f809, 0x04000006, 0x4a03501c, - 0x0000ffff, 0x82000540, 0x00000001, 0x1c01f000, - 0x80000580, 0x0401f7fe, 0x4937c857, 0x0201f800, - 0x00107cfe, 0x04000017, 0x4926601c, 0x4936600a, - 0x4a026407, 0x00000001, 0x417a7800, 0x0201f800, - 0x001044e6, 0x42000800, 0x00000003, 0x0201f800, - 0x001044f1, 0x59a8001d, 0x80000000, 0x4803501d, - 0x599c0208, 0x48026c12, 0x42027000, 0x00000002, - 0x0201f800, 0x00020bc1, 0x82000540, 0x00000001, - 0x1c01f000, 0x40681000, 0x0401f807, 0x42018800, - 0x00000000, 0x04000003, 0x42018800, 0x00000001, - 0x1c01f000, 0x480bc857, 0x492fc857, 0x4923c857, - 0x4927c857, 0x4c5c0000, 0x4008b800, 0x42028800, - 0x000007fd, 0x42003000, 0x00fffffd, 0x0201f800, - 0x0010452c, 0x0402001f, 0x5934000a, 0x84000544, - 0x4802680a, 0x0201f800, 0x00107cfe, 0x04000019, - 0x4926601c, 0x4936600a, 0x812e59c0, 0x04000006, - 0x592c0405, 0x8c00051e, 0x04000003, 0x48ee602a, - 0x0401f004, 0x59a8021b, 0x8400055c, 0x4803521b, - 0x492e6009, 0x4a026407, 0x00000001, 0x485e601d, - 0x42027000, 0x00000022, 0x0201f800, 0x00020bc1, - 0x82000540, 0x00000001, 0x5c00b800, 0x1c01f000, - 0x80000580, 0x0401f7fd, 0x4933c857, 0x59a8021b, - 0x8c000508, 0x04020012, 0x5930500a, 0x482bc857, - 0x836c0580, 0x00000002, 0x0402000d, 0x0401f813, - 0x0402000b, 0x58280403, 0x82000580, 0x000007fc, - 0x04000008, 0x59a80016, 0x80000040, 0x4803c857, - 0x02001800, 0x0010032e, 0x48035016, 0x1c01f000, - 0x59a8001d, 0x80000040, 0x4803c857, 0x040017fc, - 0x4803501d, 0x1c01f000, 0x59300009, 0x800001c0, - 0x04020009, 0x59300403, 0x82000580, 0x00000001, - 0x04020004, 0x82000540, 0x00000001, 0x0401f002, - 0x80000580, 0x1c01f000, 0x4933c857, 0x493fc857, - 0x4947c857, 0x4927c857, 0x4d400000, 0x4d340000, - 0x4d440000, 0x4c580000, 0x0201f800, 0x00106c3c, - 0x4df00000, 0x8060c1c0, 0x04020004, 0x4200b000, - 0x00000001, 0x0401f004, 0x4200b000, 0x000007f0, - 0x417a8800, 0x41440000, 0x81ac0400, 0x50000000, - 0x80026d40, 0x04000020, 0x59245005, 0x59340013, - 0x82000500, 0x00ffffff, 0x80280580, 0x0402001a, - 0x4d3c0000, 0x42027800, 0x00000001, 0x0201f800, - 0x0010488c, 0x5c027800, 0x42028000, 0x00000029, - 0x0201f800, 0x00110053, 0x0201f800, 0x0011014a, - 0x0201f800, 0x001101e3, 0x0201f800, 0x0010491a, - 0x04020005, 0x4937c857, 0x4a026c00, 0x00000404, - 0x0401f003, 0x0201f800, 0x0010494e, 0x0201f800, - 0x00110623, 0x81468800, 0x8058b040, 0x040207da, - 0x5c03e000, 0x02000800, 0x00106c29, 0x5c00b000, - 0x5c028800, 0x5c026800, 0x5c028000, 0x1c01f000, - 0x4937c857, 0x4947c857, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x59a80056, 0x8c000500, 0x0400001f, - 0x599c0017, 0x8c00050a, 0x0402001c, 0x5934ba02, - 0x825cbd00, 0x000000ff, 0x485fc857, 0x4178c000, - 0x4178c800, 0x82600400, 0x0010df51, 0x50002000, - 0x8060c1c0, 0x04000008, 0x82100500, 0x000000ff, - 0x82002d80, 0x000000ff, 0x0400000c, 0x805c0580, - 0x0400000d, 0x80102110, 0x8064c800, 0x82640580, - 0x00000004, 0x040207f5, 0x8060c000, 0x82600580, - 0x00000020, 0x040207eb, 0x4813c857, 0x82000540, - 0x00000001, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x1c01f000, 0x59a8021b, 0x8c000512, 0x02020800, - 0x001003f5, 0x1c01f000, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x4200b000, 0x00000001, 0x42024800, - 0x0010ccd1, 0x417a4000, 0x42028800, 0x000007fe, - 0x0201f800, 0x00104fc6, 0x04000003, 0x0201f800, - 0x0010bda3, 0x5924ba00, 0x8c5cbd00, 0x0400005c, - 0x83240d80, 0x0010ccd1, 0x04020010, 0x825cc500, - 0x000000e0, 0x0402000d, 0x0201f800, 0x00104fc6, - 0x04000004, 0x42000800, 0xffffff1d, 0x0401faa6, - 0x59a8021b, 0x82000500, 0xffffdafc, 0x8400054e, - 0x4803521b, 0x0401f006, 0x82600580, 0x000000e0, - 0x0402004e, 0x8c5cbd0e, 0x04020045, 0x5924c809, - 0x82640400, 0x0000000e, 0x50000000, 0x4803c857, - 0x80026d40, 0x04000012, 0x0201f800, 0x00104fc6, - 0x04000014, 0x59340200, 0x8c00051a, 0x04020038, - 0x59240805, 0x80040910, 0x0400000e, 0x59a80018, - 0x4803c857, 0x4807c857, 0x80040580, 0x04000009, - 0x4a026806, 0xdeaddead, 0x0401f006, 0x42003000, - 0x00fffffe, 0x0201f800, 0x0010452c, 0x0402002f, - 0x0201f800, 0x00107cfe, 0x0400002c, 0x4936600a, - 0x4926601c, 0x4a026407, 0x00000001, 0x417a7800, - 0x0201f800, 0x001044e6, 0x0201f800, 0x0010fbe0, - 0x42000800, 0x00000003, 0x0201f800, 0x001044f1, - 0x49235017, 0x4923c857, 0x59240005, 0x82000500, - 0x000000ff, 0x48024805, 0x836c0580, 0x00000003, - 0x04000004, 0x59a80016, 0x80000000, 0x48035016, - 0x599c0208, 0x48026c12, 0x42027000, 0x00000002, - 0x0201f800, 0x00020bc1, 0x59240200, 0x82000500, - 0xffffff9d, 0x8400054e, 0x48024a00, 0x81224000, - 0x83264c00, 0x0000000b, 0x8058b040, 0x0402079e, - 0x4a035017, 0x0000ffff, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x4d300000, 0x4d440000, - 0x4d340000, 0x42028800, 0x000007fe, 0x42003000, - 0x00fffffe, 0x0201f800, 0x0010452c, 0x04020021, - 0x0201f800, 0x00107cfe, 0x0400001e, 0x4927c857, - 0x4923c857, 0x497a6009, 0x4936600a, 0x4926601c, - 0x4a026426, 0x00000021, 0x4a026407, 0x00000001, - 0x42000800, 0x00000003, 0x0201f800, 0x001044f1, - 0x599c0208, 0x48026c12, 0x42027000, 0x00000002, - 0x0201f800, 0x00020bc1, 0x497a4805, 0x59240200, + 0x00000004, 0x0401ff6f, 0x42006800, 0x0000003c, + 0x0401ff72, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000004, 0x0401ff66, 0x41786800, + 0x0401ff6a, 0x41785800, 0x42006000, 0x0000001e, + 0x41786800, 0x0401ff5f, 0x42006800, 0x00000002, + 0x0401ff62, 0x42006800, 0x00000001, 0x0401ff59, + 0x42006800, 0x000000f5, 0x0401ff5c, 0x41785800, + 0x42006000, 0x0000001e, 0x42006800, 0x00000004, + 0x0401ff50, 0x42006800, 0x00000020, 0x0401ff53, + 0x59a8106e, 0x0401f872, 0x42001800, 0x000200f5, + 0x0401f8a4, 0x59a8106e, 0x0401f886, 0x41785800, + 0x42006000, 0x0000001e, 0x42006800, 0x00000004, + 0x0401ff40, 0x41786800, 0x0401ff44, 0x42000000, + 0x00000015, 0x0401fef2, 0x82000540, 0x00000002, + 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000015, 0x0401ff32, 0x5c000000, + 0x40006800, 0x0401ff35, 0x42000000, 0x00000015, + 0x0401fee3, 0x82000500, 0x0000fffd, 0x4c000000, + 0x41785800, 0x42006000, 0x0000001e, 0x42006800, + 0x00000015, 0x0401ff23, 0x5c000000, 0x40006800, + 0x0401ff26, 0x42000000, 0x00000014, 0x0401fed4, + 0x82000540, 0x00000040, 0x4c000000, 0x41785800, + 0x42006000, 0x0000001e, 0x42006800, 0x00000014, + 0x0401ff14, 0x5c000000, 0x40006800, 0x0401ff17, + 0x42000000, 0x00000014, 0x0401fec5, 0x82000500, + 0x0000ffbf, 0x4c000000, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000014, 0x0401ff05, + 0x5c000000, 0x40006800, 0x0401ff08, 0x4a038886, + 0x00002020, 0x41780800, 0x8c5cbd06, 0x04000003, + 0x42000800, 0x00000001, 0x0401f809, 0x59c40001, + 0x82000540, 0x00001000, 0x48038801, 0x0401f867, + 0x0401feb4, 0x5c00b800, 0x1c01f000, 0x59a8006d, + 0x80000540, 0x04000015, 0x4807c857, 0x42000000, + 0x00000014, 0x4c040000, 0x0401fea1, 0x5c000800, + 0x84000546, 0x800409c0, 0x04020002, 0x84000506, + 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000014, 0x0401fede, 0x5c000000, + 0x40006800, 0x0401fee1, 0x1c01f000, 0x480bc857, + 0x82080580, 0x00010000, 0x04020007, 0x82040d40, + 0x00010000, 0x42001800, 0x00000001, 0x0401f82d, + 0x0401f00f, 0x82080580, 0x00008000, 0x04000007, + 0x82040d40, 0x00000000, 0x42001800, 0x00900001, + 0x0401f824, 0x0401f006, 0x82040d40, 0x00008000, + 0x42001800, 0x00100001, 0x0401f81e, 0x1c01f000, + 0x480bc857, 0x82080580, 0x00010000, 0x04020008, + 0x42001800, 0x000000a1, 0x0401f816, 0x42001800, + 0x000000c1, 0x0401f813, 0x0401f011, 0x82080580, + 0x00008000, 0x04000008, 0x42001800, 0x000400a1, + 0x0401f80c, 0x42001800, 0x002000c1, 0x0401f809, + 0x0401f007, 0x42001800, 0x000400a1, 0x0401f805, + 0x42001800, 0x000000c1, 0x0401f802, 0x1c01f000, + 0x480fc857, 0x41785800, 0x42006000, 0x0000001e, + 0x41786800, 0x0401fe9f, 0x400c6800, 0x80346960, + 0x0401fea2, 0x42006800, 0x00000001, 0x0401fe99, + 0x400c6800, 0x0401fe9d, 0x42006800, 0x00000003, + 0x0401fe94, 0x0401fe9f, 0x40400000, 0x8c000504, + 0x040207fc, 0x1c01f000, 0x40000000, 0x40000000, + 0x40000000, 0x1c01f000, 0x59a80005, 0x8c000500, + 0x0400000a, 0x59a80008, 0x8c000500, 0x04020007, + 0x84000540, 0x48035008, 0x42001000, 0x00008016, + 0x0201f800, 0x001039ac, 0x1c01f000, 0x4803c856, + 0x59a80006, 0x8c00051e, 0x0402000a, 0x42028800, + 0x000007fc, 0x42003000, 0x00fffffc, 0x0201f800, + 0x00104628, 0x04020008, 0x0401f809, 0x04000006, + 0x4a03501c, 0x0000ffff, 0x82000540, 0x00000001, + 0x1c01f000, 0x80000580, 0x0401f7fe, 0x4937c857, + 0x0201f800, 0x00107ef8, 0x04000017, 0x4926601c, + 0x4936600a, 0x4a026407, 0x00000001, 0x417a7800, + 0x0201f800, 0x001045df, 0x42000800, 0x00000003, + 0x0201f800, 0x001045ea, 0x59a8001d, 0x80000000, + 0x4803501d, 0x599c0208, 0x48026c12, 0x42027000, + 0x00000002, 0x0201f800, 0x00020bc1, 0x82000540, + 0x00000001, 0x1c01f000, 0x40681000, 0x0401f807, + 0x42018800, 0x00000000, 0x04000003, 0x42018800, + 0x00000001, 0x1c01f000, 0x480bc857, 0x492fc857, + 0x4923c857, 0x4927c857, 0x4c5c0000, 0x4008b800, + 0x42028800, 0x000007fd, 0x42003000, 0x00fffffd, + 0x0201f800, 0x00104628, 0x0402001f, 0x5934000a, + 0x84000544, 0x4802680a, 0x0201f800, 0x00107ef8, + 0x04000019, 0x4926601c, 0x4936600a, 0x812e59c0, + 0x04000006, 0x592c0405, 0x8c00051e, 0x04000003, + 0x48ee602a, 0x0401f004, 0x59a8021b, 0x8400055c, + 0x4803521b, 0x492e6009, 0x4a026407, 0x00000001, + 0x485e601d, 0x42027000, 0x00000022, 0x0201f800, + 0x00020bc1, 0x82000540, 0x00000001, 0x5c00b800, + 0x1c01f000, 0x80000580, 0x0401f7fd, 0x4933c857, + 0x59a8021b, 0x8c000508, 0x04020012, 0x5930500a, + 0x482bc857, 0x836c0580, 0x00000002, 0x0402000d, + 0x0401f817, 0x0402000b, 0x58280403, 0x82000580, + 0x000007fc, 0x04000008, 0x59a80016, 0x80000040, + 0x4803c857, 0x02001800, 0x0010032e, 0x48035016, + 0x1c01f000, 0x59300426, 0x82000580, 0x00000021, + 0x040007fc, 0x59a8001d, 0x80000040, 0x4803c857, + 0x040017f8, 0x4803501d, 0x1c01f000, 0x59300009, + 0x800001c0, 0x04020009, 0x59300403, 0x82000580, + 0x00000001, 0x04020004, 0x82000540, 0x00000001, + 0x0401f002, 0x80000580, 0x1c01f000, 0x4933c857, + 0x493fc857, 0x4947c857, 0x4927c857, 0x4d400000, + 0x4d340000, 0x4d440000, 0x4c580000, 0x0201f800, + 0x00106e41, 0x4df00000, 0x8060c1c0, 0x04020004, + 0x4200b000, 0x00000001, 0x0401f004, 0x4200b000, + 0x000007f0, 0x417a8800, 0x41440000, 0x81ac0400, + 0x50000000, 0x80026d40, 0x04000020, 0x59245005, + 0x59340013, 0x82000500, 0x00ffffff, 0x80280580, + 0x0402001a, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x0010498c, 0x5c027800, 0x42028000, + 0x00000029, 0x0201f800, 0x00110363, 0x0201f800, + 0x00110447, 0x0201f800, 0x001104e0, 0x0201f800, + 0x00104a1c, 0x04020005, 0x4937c857, 0x4a026c00, + 0x00000404, 0x0401f003, 0x0201f800, 0x00104a50, + 0x0201f800, 0x00110916, 0x81468800, 0x8058b040, + 0x040207da, 0x5c03e000, 0x02000800, 0x00106e2e, + 0x5c00b000, 0x5c028800, 0x5c026800, 0x5c028000, + 0x1c01f000, 0x4937c857, 0x4947c857, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x59a80056, 0x8c000500, + 0x0400001f, 0x599c0017, 0x8c00050a, 0x0402001c, + 0x5934ba02, 0x825cbd00, 0x000000ff, 0x485fc857, + 0x4178c000, 0x4178c800, 0x82600400, 0x0010e251, + 0x50002000, 0x8060c1c0, 0x04000008, 0x82100500, + 0x000000ff, 0x82002d80, 0x000000ff, 0x0400000c, + 0x805c0580, 0x0400000d, 0x80102110, 0x8064c800, + 0x82640580, 0x00000004, 0x040207f5, 0x8060c000, + 0x82600580, 0x00000020, 0x040207eb, 0x4813c857, + 0x82000540, 0x00000001, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x59a8021b, 0x8c000512, + 0x02020800, 0x001003f5, 0x1c01f000, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x4c500000, 0x4200b000, + 0x00000001, 0x42024800, 0x0010cfd1, 0x417a4000, + 0x42028800, 0x000007fe, 0x0201f800, 0x0010c0e8, + 0x04000022, 0x0201f800, 0x0010c0ca, 0x5924ba00, + 0x8c5cbd00, 0x04000088, 0x59a8a21b, 0x8c50a506, + 0x0400000d, 0x825c0500, 0x000000e0, 0x82000580, + 0x000000e0, 0x04000080, 0x0401f88f, 0x59a80016, + 0x4923c857, 0x4803c857, 0x80000000, 0x48035016, + 0x0401f079, 0x8c5cbd1e, 0x04000077, 0x4927c856, + 0x4200b000, 0x00000001, 0x825c0500, 0x000000e1, + 0x48024a00, 0x485fc857, 0x825cc500, 0x000000e0, + 0x04020023, 0x0401f01c, 0x0201f800, 0x001050f7, + 0x04000003, 0x0201f800, 0x0010c0ce, 0x5924ba00, + 0x8c5cbd00, 0x04000064, 0x0201f800, 0x0010c0e8, + 0x04000005, 0x59a8021b, 0x8c00050e, 0x04020014, + 0x0401f004, 0x83240d80, 0x0010cfd1, 0x04020010, + 0x825cc500, 0x000000e0, 0x0402000d, 0x0201f800, + 0x001050f7, 0x04000004, 0x42000800, 0xffffff1d, + 0x0401fad8, 0x59a8021b, 0x82000500, 0xffffdafc, + 0x8400054e, 0x4803521b, 0x0401f006, 0x82600580, + 0x000000e0, 0x04020053, 0x8c5cbd0e, 0x04020046, + 0x5924c809, 0x82640400, 0x0000000e, 0x50000000, + 0x4803c857, 0x80026d40, 0x04000012, 0x0201f800, + 0x001050f7, 0x04000014, 0x59340200, 0x8c00051a, + 0x04020039, 0x59240805, 0x80040910, 0x0400000e, + 0x59a80018, 0x4803c857, 0x4807c857, 0x80040580, + 0x04000009, 0x4a026806, 0xdeaddead, 0x0401f006, + 0x42003000, 0x00fffffe, 0x0201f800, 0x00104628, + 0x04020034, 0x0201f800, 0x00107ef8, 0x04000031, + 0x4936600a, 0x4926601c, 0x4a026407, 0x00000001, + 0x417a7800, 0x0201f800, 0x001045df, 0x0201f800, + 0x0010feed, 0x42000800, 0x00000003, 0x0201f800, + 0x001045ea, 0x49235017, 0x4923c857, 0x59240005, + 0x82000500, 0x000000ff, 0x48024805, 0x836c0580, + 0x00000003, 0x04000004, 0x59a80016, 0x80000000, + 0x48035016, 0x599c0208, 0x48026c12, 0x42027000, + 0x00000002, 0x0201f800, 0x00020bc1, 0x59240200, + 0x82000500, 0xffffff9d, 0x8400054e, 0x8400055e, + 0x48024a00, 0x81224000, 0x83264c00, 0x0000000b, + 0x8058b040, 0x04000005, 0x0201f800, 0x0010c0e8, + 0x0402076f, 0x0401f792, 0x4a035017, 0x0000ffff, + 0x5c00a000, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x4d300000, 0x4d440000, 0x4d340000, + 0x42028800, 0x000007fe, 0x42003000, 0x00fffffe, + 0x0201f800, 0x00104628, 0x04020022, 0x0201f800, + 0x00107ef8, 0x0400001f, 0x4927c857, 0x4923c857, + 0x497a6009, 0x4936600a, 0x4926601c, 0x4a026407, + 0x00000001, 0x42000800, 0x00000003, 0x0201f800, + 0x001045ea, 0x599c0208, 0x48026c12, 0x42027000, + 0x00000002, 0x0201f800, 0x00020bc1, 0x59a80a1b, + 0x8c040d06, 0x04020002, 0x497a4805, 0x59240200, 0x82000500, 0xffffff9d, 0x8400054e, 0x48024a00, 0x5c026800, 0x5c028800, 0x5c026000, 0x1c01f000, 0x80000580, 0x0401f7fb, 0x4d200000, 0x4d240000, 0x4c580000, 0x4d340000, 0x4d300000, 0x4d3c0000, - 0x4d380000, 0x4d440000, 0x0201f800, 0x0010486c, - 0x0402000a, 0x0201f800, 0x00104fc6, 0x04000004, - 0x59a8121b, 0x8c081506, 0x04000003, 0x0401ff4b, + 0x4d380000, 0x4d440000, 0x0201f800, 0x0010496c, + 0x0402000a, 0x0201f800, 0x001050f7, 0x04000004, + 0x59a8121b, 0x8c081506, 0x04000003, 0x0401ff18, 0x0401f002, 0x0401f80a, 0x5c028800, 0x5c027000, 0x5c027800, 0x5c026000, 0x5c026800, 0x5c00b000, 0x5c024800, 0x5c024000, 0x1c01f000, 0x4803c856, - 0x4c600000, 0x0201f800, 0x0010bda3, 0x4200c000, - 0x0010cccf, 0x50600000, 0x82024580, 0x0000ffff, - 0x04020004, 0x42024800, 0x0010ccd1, 0x0401f008, + 0x4c600000, 0x0201f800, 0x0010c0ce, 0x4200c000, + 0x0010cfcf, 0x50600000, 0x82024580, 0x0000ffff, + 0x04020004, 0x42024800, 0x0010cfd1, 0x0401f008, 0x8058b480, 0x04000029, 0x04001028, 0x40024000, - 0x82000400, 0x0010bdc7, 0x50024800, 0x4520c000, + 0x82000400, 0x0010c10d, 0x50024800, 0x4520c000, 0x59240005, 0x82000500, 0x000000ff, 0x48024805, 0x59240200, 0x82000500, 0x00000003, 0x82000580, 0x00000003, 0x0402000e, 0x59240400, 0x8c000508, @@ -16490,19 +16557,19 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4c0c0000, 0x4c080000, 0x4c040000, 0x4d240000, 0x59243c08, 0x59a81817, 0x820c1580, 0x0000ffff, 0x04020003, 0x42001800, 0x00000001, 0x800c1104, - 0x82082400, 0x0010df51, 0x50102000, 0x820c0500, - 0x00000003, 0x0c01f001, 0x00101e62, 0x00101e64, - 0x00101e66, 0x00101e68, 0x40101000, 0x0401f006, + 0x82082400, 0x0010e251, 0x50102000, 0x820c0500, + 0x00000003, 0x0c01f001, 0x00101e9e, 0x00101ea0, + 0x00101ea2, 0x00101ea4, 0x40101000, 0x0401f006, 0x80101110, 0x0401f004, 0x80101120, 0x0401f002, 0x80101130, 0x4c0c0000, 0x82080500, 0x000000ff, 0x801c0d80, 0x0400001f, 0x800001c0, 0x0400001d, 0x40000800, 0x82000580, 0x000000ff, 0x0400001d, - 0x0401f922, 0x04000017, 0x40040000, 0x0201f800, - 0x00105f68, 0x04020021, 0x0201f800, 0x0010458e, - 0x04000005, 0x0201f800, 0x0010fbbe, 0x0400001b, + 0x0401f949, 0x04000017, 0x40040000, 0x0201f800, + 0x00106134, 0x04020021, 0x0201f800, 0x0010468a, + 0x04000005, 0x0201f800, 0x0010febe, 0x0400001b, 0x0401f00c, 0x599c0019, 0x8c00050e, 0x04020009, - 0x0201f800, 0x0010452c, 0x04020014, 0x0201f800, - 0x0010fbe0, 0x0201f800, 0x0010fcd1, 0x0400000f, + 0x0201f800, 0x00104628, 0x04020014, 0x0201f800, + 0x0010feed, 0x0201f800, 0x0010ffe1, 0x0400000f, 0x5c001800, 0x480f5017, 0x800c1800, 0x0401f7c8, 0x5c001800, 0x4a035017, 0x0000ffff, 0x5c024800, 0x5c000800, 0x5c001000, 0x5c001800, 0x5c002000, @@ -16511,308 +16578,342 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4c540000, 0x4200b000, 0x0000007e, 0x59243c08, 0x59a80017, 0x82001580, 0x0000ffff, 0x04020003, 0x4178a800, 0x0401f004, 0x8058b480, 0x04001024, - 0x4000a800, 0x48575017, 0x8254bc00, 0x00102057, + 0x4000a800, 0x48575017, 0x8254bc00, 0x00102116, 0x505cb800, 0x825cbd00, 0x000000ff, 0x405c0800, - 0x0401f8e2, 0x04000017, 0x405c0000, 0x0201f800, - 0x00105f68, 0x04020018, 0x0201f800, 0x0010458e, - 0x04000005, 0x0201f800, 0x0010fbbe, 0x04000012, + 0x0401f909, 0x04000017, 0x405c0000, 0x0201f800, + 0x00106134, 0x04020018, 0x0201f800, 0x0010468a, + 0x04000005, 0x0201f800, 0x0010febe, 0x04000012, 0x0401f00c, 0x599c0019, 0x8c00050e, 0x04020009, - 0x0201f800, 0x0010452c, 0x0402000b, 0x0201f800, - 0x0010fbe0, 0x0201f800, 0x0010fcd1, 0x04000006, + 0x0201f800, 0x00104628, 0x0402000b, 0x0201f800, + 0x0010feed, 0x0201f800, 0x0010ffe1, 0x04000006, 0x8054a800, 0x8058b040, 0x040207df, 0x4a035017, 0x0000ffff, 0x5c00a800, 0x5c00b000, 0x5c00b800, 0x1c01f000, 0x4c580000, 0x4d440000, 0x4200b000, 0x000007f0, 0x80028d80, 0x0201f800, 0x0002034c, - 0x0402001e, 0x0401fe3f, 0x0400001c, 0x4937c857, - 0x0201f800, 0x00104971, 0x42026000, 0x0011120c, + 0x0402001e, 0x0401fe0c, 0x0400001c, 0x4937c857, + 0x0201f800, 0x00104a73, 0x42026000, 0x0011152c, 0x4936600a, 0x497a6009, 0x4926601c, 0x417a7800, - 0x0201f800, 0x0010fc72, 0x42000000, 0x0010cc23, - 0x0201f800, 0x0010bc88, 0x59240400, 0x8c00050a, + 0x0201f800, 0x0010ff80, 0x42000000, 0x0010cf23, + 0x0201f800, 0x0010bfb3, 0x59240400, 0x8c00050a, 0x0402000a, 0x41782800, 0x42003000, 0x00000008, 0x4d400000, 0x42028000, 0x00000029, 0x0201f800, - 0x0010ae86, 0x5c028000, 0x81468800, 0x8058b040, + 0x0010b195, 0x5c028000, 0x81468800, 0x8058b040, 0x040207de, 0x5c028800, 0x5c00b000, 0x1c01f000, - 0x4d200000, 0x4d240000, 0x4c580000, 0x0201f800, - 0x0010bd9f, 0x8058b040, 0x04000016, 0x42024000, - 0x00000001, 0x42024800, 0x0010ccdc, 0x59a8021b, - 0x8c000514, 0x04000013, 0x59240200, 0x8c000510, - 0x04020007, 0x59241200, 0x8c081500, 0x04000004, - 0x4923c856, 0x0401f815, 0x04000006, 0x81224000, - 0x83264c00, 0x0000000b, 0x8058b040, 0x040207f3, - 0x5c00b000, 0x5c024800, 0x5c024000, 0x1c01f000, - 0x497a4805, 0x59240200, 0x82000500, 0x00000001, - 0x48024a00, 0x83264c00, 0x0000000b, 0x8058b040, - 0x040207f8, 0x0401f7f3, 0x4927c857, 0x4923c857, - 0x59a8021b, 0x8c000514, 0x04000021, 0x4c040000, - 0x42000800, 0x0010ccd1, 0x58040200, 0x8c00050c, - 0x5c000800, 0x0400001a, 0x42028800, 0x000007fe, - 0x42003000, 0x00fffffe, 0x0201f800, 0x0010452c, - 0x04020013, 0x599c0208, 0x48026c12, 0x4d2c0000, - 0x417a5800, 0x0201f800, 0x00109bef, 0x5c025800, - 0x0400000b, 0x59a8005e, 0x80000000, 0x4803505e, - 0x59240200, 0x84000550, 0x84000512, 0x48024a00, - 0x82000540, 0x00000001, 0x1c01f000, 0x80000580, - 0x0401f7fe, 0x4c580000, 0x0201f800, 0x0010bd9f, - 0x417a4000, 0x42000800, 0x0010ccd1, 0x5930001c, - 0x80040580, 0x04000008, 0x81224000, 0x82040c00, - 0x0000000b, 0x8058b040, 0x040207f9, 0x0201f800, - 0x0010032e, 0x4933c857, 0x4923c857, 0x5c00b000, - 0x1c01f000, 0x40683800, 0x4c580000, 0x0201f800, - 0x0010bd9f, 0x417a4000, 0x42024800, 0x0010ccd1, - 0x59a8121b, 0x8c081508, 0x0400000a, 0x821c0d80, - 0x00fffffe, 0x04000022, 0x8c08150c, 0x04000020, - 0x59240005, 0x801c0580, 0x0400001d, 0x0401f017, - 0x82080500, 0x00000028, 0x04020005, 0x59240005, - 0x82000500, 0x000000ff, 0x0401f005, 0x59240200, - 0x8c000500, 0x04000004, 0x59240005, 0x801c0580, - 0x0400000f, 0x81224000, 0x83264c00, 0x0000000b, - 0x8058b040, 0x04000005, 0x82080500, 0x00000028, - 0x040207f3, 0x0401f7ee, 0x42024000, 0x0000ffff, - 0x82000540, 0x00000001, 0x481fc856, 0x4923c857, - 0x5c00b000, 0x1c01f000, 0x4807c857, 0x4c580000, - 0x0201f800, 0x0010bd9f, 0x42006800, 0x0010ccd1, - 0x58340005, 0x82000500, 0x000000ff, 0x80040580, - 0x04000007, 0x82346c00, 0x0000000b, 0x8058b040, - 0x040207f8, 0x82000540, 0x00000001, 0x5c00b000, - 0x1c01f000, 0x4923c857, 0x493fc857, 0x4c580000, - 0x4d400000, 0x4d440000, 0x4d340000, 0x4c5c0000, - 0x0201f800, 0x00106c3c, 0x4df00000, 0x4200b000, - 0x000007f0, 0x417a8800, 0x83440400, 0x0010bf80, - 0x50000000, 0x80026d40, 0x04000021, 0x59340013, - 0x80000130, 0x81200580, 0x0402001d, 0x42028000, - 0x00000029, 0x0201f800, 0x00110053, 0x0201f800, - 0x0011014a, 0x0201f800, 0x001101e3, 0x0201f800, - 0x00110623, 0x8d3e7d1c, 0x04000005, 0x41240800, - 0x0201f800, 0x00104992, 0x0401f00d, 0x8d3e7d06, - 0x04000004, 0x59340200, 0x8c00050e, 0x04020008, - 0x4937c857, 0x4a026c00, 0x00000707, 0x59240400, - 0x8c00050a, 0x02020800, 0x001041e4, 0x81468800, - 0x8058b040, 0x040207d9, 0x8d3e7d02, 0x0400001b, + 0x4927c857, 0x4c5c0000, 0x400cb800, 0x4d200000, + 0x4d240000, 0x4c580000, 0x0201f800, 0x0010c0ca, + 0x417a4000, 0x42024800, 0x0010cfd1, 0x59240200, + 0x8c000500, 0x0400000f, 0x8c5cbd08, 0x04000004, + 0x8400055a, 0x48024a00, 0x0401f00a, 0x82000500, + 0x000000e0, 0x82000580, 0x000000e0, 0x04000005, + 0x4927c857, 0x4923c857, 0x0401f83e, 0x04000006, + 0x81224000, 0x83264c00, 0x0000000b, 0x8058b040, + 0x040207eb, 0x5c00b000, 0x5c024800, 0x5c024000, + 0x5c00b800, 0x1c01f000, 0x40681800, 0x4d200000, + 0x4d240000, 0x4c580000, 0x4c5c0000, 0x400cb800, + 0x485fc857, 0x0201f800, 0x0010c0ca, 0x8058b040, + 0x04000019, 0x42024000, 0x00000001, 0x42024800, + 0x0010cfdc, 0x59a8021b, 0x8c000514, 0x04000017, + 0x59241200, 0x8c081510, 0x0402000a, 0x8c081500, + 0x04000008, 0x8c5cbd08, 0x04000004, 0x8408155a, + 0x480a4a00, 0x0401f003, 0x0401f816, 0x04000006, + 0x81224000, 0x83264c00, 0x0000000b, 0x8058b040, + 0x040207f0, 0x5c00b800, 0x5c00b000, 0x5c024800, + 0x5c024000, 0x1c01f000, 0x497a4805, 0x59240200, + 0x82000500, 0x00000001, 0x48024a00, 0x83264c00, + 0x0000000b, 0x8058b040, 0x040207f8, 0x0401f7f2, + 0x4927c857, 0x4923c857, 0x59a8021b, 0x8c000514, + 0x0400001a, 0x42028800, 0x000007fe, 0x42003000, + 0x00fffffe, 0x0201f800, 0x00104628, 0x04020013, + 0x599c0208, 0x48026c12, 0x4d2c0000, 0x417a5800, + 0x0201f800, 0x00109e27, 0x5c025800, 0x0400000b, + 0x59a8005e, 0x80000000, 0x4803505e, 0x59240200, + 0x84000550, 0x84000512, 0x48024a00, 0x82000540, + 0x00000001, 0x1c01f000, 0x80000580, 0x0401f7fe, + 0x4c580000, 0x0201f800, 0x0010c0ca, 0x417a4000, + 0x42000800, 0x0010cfd1, 0x5930001c, 0x80040580, + 0x04000008, 0x81224000, 0x82040c00, 0x0000000b, + 0x8058b040, 0x040207f9, 0x0201f800, 0x0010032e, + 0x4933c857, 0x4923c857, 0x5c00b000, 0x1c01f000, + 0x40683800, 0x4c580000, 0x0201f800, 0x0010c0ca, + 0x417a4000, 0x42024800, 0x0010cfd1, 0x59a8121b, + 0x8c081508, 0x0400000a, 0x821c0d80, 0x00fffffe, + 0x04000022, 0x8c08150c, 0x04000020, 0x59240005, + 0x801c0580, 0x0400001d, 0x0401f017, 0x82080500, + 0x00000028, 0x04020005, 0x59240005, 0x82000500, + 0x000000ff, 0x0401f005, 0x59240200, 0x8c000500, + 0x04000004, 0x59240005, 0x801c0580, 0x0400000f, + 0x81224000, 0x83264c00, 0x0000000b, 0x8058b040, + 0x04000005, 0x82080500, 0x00000028, 0x040207f3, + 0x0401f7ee, 0x42024000, 0x0000ffff, 0x82000540, + 0x00000001, 0x481fc856, 0x4923c857, 0x5c00b000, + 0x1c01f000, 0x4807c857, 0x4c580000, 0x0201f800, + 0x0010c0ca, 0x42006800, 0x0010cfd1, 0x58340005, + 0x82000500, 0x000000ff, 0x80040580, 0x04000007, + 0x82346c00, 0x0000000b, 0x8058b040, 0x040207f8, + 0x82000540, 0x00000001, 0x5c00b000, 0x1c01f000, + 0x4923c857, 0x493fc857, 0x4c580000, 0x4d400000, + 0x4d440000, 0x4d340000, 0x4c5c0000, 0x0201f800, + 0x00106e41, 0x4df00000, 0x4200b000, 0x000007f0, + 0x417a8800, 0x83440400, 0x0010c280, 0x50000000, + 0x80026d40, 0x04000022, 0x59340013, 0x80000130, + 0x81200580, 0x0402001e, 0x42028000, 0x00000029, + 0x0201f800, 0x00110363, 0x0201f800, 0x00110447, + 0x0201f800, 0x001104e0, 0x0201f800, 0x00110916, + 0x8d3e7d1c, 0x04000005, 0x41240800, 0x0201f800, + 0x00104a94, 0x0401f00e, 0x8d3e7d06, 0x04000004, + 0x59340200, 0x8c00050e, 0x04020009, 0x4937c857, + 0x497a6c0b, 0x4a026c00, 0x00000707, 0x59240400, + 0x8c00050a, 0x02020800, 0x001042dd, 0x81468800, + 0x8058b040, 0x040207d8, 0x8d3e7d02, 0x0400001b, 0x4200b000, 0x00000010, 0x5924b809, 0x505c0000, 0x80026d40, 0x04000012, 0x59368c03, 0x0201f800, - 0x00110053, 0x0201f800, 0x0011014a, 0x0201f800, - 0x001101e3, 0x0201f800, 0x00110623, 0x8d3e7d1c, - 0x04020004, 0x0201f800, 0x001041e4, 0x0401f004, - 0x41240800, 0x0201f800, 0x00104992, 0x805cb800, + 0x00110363, 0x0201f800, 0x00110447, 0x0201f800, + 0x001104e0, 0x0201f800, 0x00110916, 0x8d3e7d1c, + 0x04020004, 0x0201f800, 0x001042dd, 0x0401f004, + 0x41240800, 0x0201f800, 0x00104a94, 0x805cb800, 0x8058b040, 0x040207ea, 0x4d300000, 0x42028800, - 0x0000ffff, 0x42026000, 0x0011120c, 0x497a600a, - 0x4926601c, 0x42028000, 0x00000029, 0x0201f800, - 0x00110053, 0x0201f800, 0x00110623, 0x5c026000, - 0x5c03e000, 0x02000800, 0x00106c29, 0x5c00b800, - 0x5c026800, 0x5c028800, 0x5c028000, 0x5c00b000, - 0x1c01f000, 0x4807c857, 0x4c580000, 0x0201f800, - 0x0010bd9f, 0x42001000, 0x0010ccd1, 0x58080200, - 0x80040500, 0x48001200, 0x82081400, 0x0000000b, - 0x8058b040, 0x040207fa, 0x5c00b000, 0x1c01f000, - 0x4803c856, 0x4d440000, 0x4d340000, 0x4c580000, - 0x4c5c0000, 0x4200b000, 0x00000010, 0x42028800, - 0x000007f0, 0x5924b809, 0x83440580, 0x000007fe, - 0x04000006, 0x505e6800, 0x813669c0, 0x04000003, - 0x0201f800, 0x001041e4, 0x81468800, 0x805cb800, - 0x8058b040, 0x040207f5, 0x5c00b800, 0x5c00b000, - 0x5c026800, 0x5c028800, 0x1c01f000, 0x4923c857, - 0x42028800, 0x000007fe, 0x42003000, 0x00fffffe, - 0x0201f800, 0x0010452c, 0x04020013, 0x599c0208, - 0x48026c12, 0x4d2c0000, 0x417a5800, 0x0201f800, - 0x00109bef, 0x5c025800, 0x0400000b, 0x59a8005e, - 0x80000000, 0x4803505e, 0x59240200, 0x84000550, - 0x84000512, 0x48024a00, 0x82000540, 0x00000001, - 0x1c01f000, 0x80000580, 0x0401f7fe, 0x00007eef, - 0x00007de8, 0x00007ce4, 0x000080e2, 0x00007be1, - 0x000080e0, 0x000080dc, 0x000080da, 0x00007ad9, - 0x000080d6, 0x000080d5, 0x000080d4, 0x000080d3, - 0x000080d2, 0x000080d1, 0x000079ce, 0x000078cd, - 0x000080cc, 0x000080cb, 0x000080ca, 0x000080c9, - 0x000080c7, 0x000080c6, 0x000077c5, 0x000076c3, - 0x000080bc, 0x000080ba, 0x000075b9, 0x000080b6, - 0x000074b5, 0x000073b4, 0x000072b3, 0x000080b2, - 0x000080b1, 0x000080ae, 0x000071ad, 0x000080ac, - 0x000070ab, 0x00006faa, 0x00006ea9, 0x000080a7, - 0x00006da6, 0x00006ca5, 0x00006ba3, 0x00006a9f, - 0x0000699e, 0x0000689d, 0x0000809b, 0x00008098, - 0x00006797, 0x00006690, 0x0000658f, 0x00006488, - 0x00006384, 0x00006282, 0x00008081, 0x00008080, - 0x0000617c, 0x0000607a, 0x00008079, 0x00005f76, - 0x00008075, 0x00008074, 0x00008073, 0x00008072, - 0x00008071, 0x0000806e, 0x00005e6d, 0x0000806c, - 0x00005d6b, 0x00005c6a, 0x00005b69, 0x00008067, - 0x00005a66, 0x00005965, 0x00005863, 0x0000575c, - 0x0000565a, 0x00005559, 0x00008056, 0x00008055, - 0x00005454, 0x00005353, 0x00005252, 0x00005151, - 0x0000504e, 0x00004f4d, 0x0000804c, 0x0000804b, - 0x00004e4a, 0x00004d49, 0x00008047, 0x00004c46, - 0x00008045, 0x00008043, 0x0000803c, 0x0000803a, - 0x00008039, 0x00008036, 0x00004b35, 0x00008034, - 0x00004a33, 0x00004932, 0x00004831, 0x0000802e, - 0x0000472d, 0x0000462c, 0x0000452b, 0x0000442a, - 0x00004329, 0x00004227, 0x00008026, 0x00008025, - 0x00004123, 0x0000401f, 0x00003f1e, 0x00003e1d, - 0x00003d1b, 0x00003c18, 0x00008017, 0x00008010, - 0x00003b0f, 0x00003a08, 0x00008004, 0x00003902, - 0x00008001, 0x00008000, 0x00008000, 0x00003800, - 0x00003700, 0x00003600, 0x00008000, 0x00003500, - 0x00008000, 0x00008000, 0x00008000, 0x00003400, + 0x0000ffff, 0x42026000, 0x0011152c, 0x4a02600a, + 0x0010e23c, 0x0201f800, 0x00104d9c, 0x4926601c, + 0x42028000, 0x00000029, 0x0201f800, 0x00110363, + 0x0201f800, 0x00110916, 0x5c026000, 0x5c03e000, + 0x02000800, 0x00106e2e, 0x5c00b800, 0x5c026800, + 0x5c028800, 0x5c028000, 0x5c00b000, 0x1c01f000, + 0x4807c857, 0x4c580000, 0x0201f800, 0x0010c0ca, + 0x42001000, 0x0010cfd1, 0x58080200, 0x80040500, + 0x48001200, 0x82081400, 0x0000000b, 0x8058b040, + 0x040207fa, 0x5c00b000, 0x1c01f000, 0x4803c856, + 0x4d440000, 0x4d340000, 0x4c580000, 0x4c5c0000, + 0x4200b000, 0x00000010, 0x42028800, 0x000007f0, + 0x5924b809, 0x83440580, 0x000007fe, 0x04000006, + 0x505e6800, 0x813669c0, 0x04000003, 0x0201f800, + 0x001042dd, 0x81468800, 0x805cb800, 0x8058b040, + 0x040207f5, 0x5c00b800, 0x5c00b000, 0x5c026800, + 0x5c028800, 0x1c01f000, 0x4923c857, 0x42028800, + 0x000007fe, 0x42003000, 0x00fffffe, 0x0201f800, + 0x00104628, 0x04020013, 0x599c0208, 0x48026c12, + 0x4d2c0000, 0x417a5800, 0x0201f800, 0x00109e27, + 0x5c025800, 0x0400000b, 0x59a8005e, 0x80000000, + 0x4803505e, 0x59240200, 0x84000550, 0x84000512, + 0x48024a00, 0x82000540, 0x00000001, 0x1c01f000, + 0x80000580, 0x0401f7fe, 0x4923c857, 0x4d300000, + 0x4d440000, 0x42028800, 0x000007fe, 0x42003000, + 0x00fffffe, 0x0201f800, 0x00104628, 0x04020021, + 0x0201f800, 0x00107ef8, 0x0400001e, 0x497a6009, + 0x4936600a, 0x4926601c, 0x4a026407, 0x00000001, + 0x42000800, 0x00000003, 0x0201f800, 0x001045ea, + 0x599c0208, 0x48026c12, 0x42027000, 0x00000002, + 0x0201f800, 0x00020bc1, 0x59240200, 0x4927c857, + 0x82000500, 0xffffff9d, 0x8400054e, 0x48024a00, + 0x59a8021b, 0x82000500, 0xffffdafc, 0x8400054e, + 0x4803521b, 0x5c028800, 0x5c026000, 0x1c01f000, + 0x80000580, 0x0401f7fc, 0x4c580000, 0x0201f800, + 0x0010c0ca, 0x485bc857, 0x41782800, 0x42002000, + 0x0010cfd1, 0x58100200, 0x82000500, 0x00000003, + 0x82000580, 0x00000003, 0x04020004, 0x82000540, + 0x00000001, 0x0401f006, 0x80142800, 0x82102400, + 0x0000000b, 0x8058b040, 0x040207f3, 0x5c00b000, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000000, + 0x04000003, 0x42018800, 0x00000001, 0x1c01f000, + 0x4c580000, 0x0201f800, 0x0010c0ca, 0x42001000, + 0x0010cfd1, 0x58080200, 0x8c00051a, 0x04020005, + 0x82081400, 0x0000000b, 0x8058b040, 0x040207fa, + 0x5c00b000, 0x1c01f000, 0x00007eef, 0x00007de8, + 0x00007ce4, 0x000080e2, 0x00007be1, 0x000080e0, + 0x000080dc, 0x000080da, 0x00007ad9, 0x000080d6, + 0x000080d5, 0x000080d4, 0x000080d3, 0x000080d2, + 0x000080d1, 0x000079ce, 0x000078cd, 0x000080cc, + 0x000080cb, 0x000080ca, 0x000080c9, 0x000080c7, + 0x000080c6, 0x000077c5, 0x000076c3, 0x000080bc, + 0x000080ba, 0x000075b9, 0x000080b6, 0x000074b5, + 0x000073b4, 0x000072b3, 0x000080b2, 0x000080b1, + 0x000080ae, 0x000071ad, 0x000080ac, 0x000070ab, + 0x00006faa, 0x00006ea9, 0x000080a7, 0x00006da6, + 0x00006ca5, 0x00006ba3, 0x00006a9f, 0x0000699e, + 0x0000689d, 0x0000809b, 0x00008098, 0x00006797, + 0x00006690, 0x0000658f, 0x00006488, 0x00006384, + 0x00006282, 0x00008081, 0x00008080, 0x0000617c, + 0x0000607a, 0x00008079, 0x00005f76, 0x00008075, + 0x00008074, 0x00008073, 0x00008072, 0x00008071, + 0x0000806e, 0x00005e6d, 0x0000806c, 0x00005d6b, + 0x00005c6a, 0x00005b69, 0x00008067, 0x00005a66, + 0x00005965, 0x00005863, 0x0000575c, 0x0000565a, + 0x00005559, 0x00008056, 0x00008055, 0x00005454, + 0x00005353, 0x00005252, 0x00005151, 0x0000504e, + 0x00004f4d, 0x0000804c, 0x0000804b, 0x00004e4a, + 0x00004d49, 0x00008047, 0x00004c46, 0x00008045, + 0x00008043, 0x0000803c, 0x0000803a, 0x00008039, + 0x00008036, 0x00004b35, 0x00008034, 0x00004a33, + 0x00004932, 0x00004831, 0x0000802e, 0x0000472d, + 0x0000462c, 0x0000452b, 0x0000442a, 0x00004329, + 0x00004227, 0x00008026, 0x00008025, 0x00004123, + 0x0000401f, 0x00003f1e, 0x00003e1d, 0x00003d1b, + 0x00003c18, 0x00008017, 0x00008010, 0x00003b0f, + 0x00003a08, 0x00008004, 0x00003902, 0x00008001, + 0x00008000, 0x00008000, 0x00003800, 0x00003700, + 0x00003600, 0x00008000, 0x00003500, 0x00008000, + 0x00008000, 0x00008000, 0x00003400, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00008000, 0x00003300, 0x00003200, + 0x00008000, 0x00003300, 0x00003200, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00008000, 0x00003100, 0x00003000, - 0x00008000, 0x00008000, 0x00002f00, 0x00008000, - 0x00002e00, 0x00002d00, 0x00002c00, 0x00008000, - 0x00008000, 0x00008000, 0x00002b00, 0x00008000, - 0x00002a00, 0x00002900, 0x00002800, 0x00008000, - 0x00002700, 0x00002600, 0x00002500, 0x00002400, - 0x00002300, 0x00002200, 0x00008000, 0x00008000, - 0x00002100, 0x00002000, 0x00001f00, 0x00001e00, - 0x00001d00, 0x00001c00, 0x00008000, 0x00008000, - 0x00001b00, 0x00001a00, 0x00008000, 0x00001900, + 0x00008000, 0x00003100, 0x00003000, 0x00008000, + 0x00008000, 0x00002f00, 0x00008000, 0x00002e00, + 0x00002d00, 0x00002c00, 0x00008000, 0x00008000, + 0x00008000, 0x00002b00, 0x00008000, 0x00002a00, + 0x00002900, 0x00002800, 0x00008000, 0x00002700, + 0x00002600, 0x00002500, 0x00002400, 0x00002300, + 0x00002200, 0x00008000, 0x00008000, 0x00002100, + 0x00002000, 0x00001f00, 0x00001e00, 0x00001d00, + 0x00001c00, 0x00008000, 0x00008000, 0x00001b00, + 0x00001a00, 0x00008000, 0x00001900, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00008000, 0x00001800, 0x00008000, - 0x00001700, 0x00001600, 0x00001500, 0x00008000, - 0x00001400, 0x00001300, 0x00001200, 0x00001100, - 0x00001000, 0x00000f00, 0x00008000, 0x00008000, - 0x00000e00, 0x00000d00, 0x00000c00, 0x00000b00, - 0x00000a00, 0x00000900, 0x00008000, 0x00008000, - 0x00000800, 0x00000700, 0x00008000, 0x00000600, - 0x00008000, 0x00008000, 0x00008000, 0x00000500, - 0x00000400, 0x00000300, 0x00008000, 0x00000200, - 0x00008000, 0x00008000, 0x00008000, 0x00000100, + 0x00008000, 0x00001800, 0x00008000, 0x00001700, + 0x00001600, 0x00001500, 0x00008000, 0x00001400, + 0x00001300, 0x00001200, 0x00001100, 0x00001000, + 0x00000f00, 0x00008000, 0x00008000, 0x00000e00, + 0x00000d00, 0x00000c00, 0x00000b00, 0x00000a00, + 0x00000900, 0x00008000, 0x00008000, 0x00000800, + 0x00000700, 0x00008000, 0x00000600, 0x00008000, + 0x00008000, 0x00008000, 0x00000500, 0x00000400, + 0x00000300, 0x00008000, 0x00000200, 0x00008000, + 0x00008000, 0x00008000, 0x00000100, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00008000, 0x00000000, 0x00008000, + 0x00008000, 0x00000000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00008000, 0x00008000, 0x0201f800, - 0x0010056e, 0x02000800, 0x0010032e, 0x492f4017, - 0x1c01f000, 0x83a0ac00, 0x00000007, 0x83a00580, - 0x0010c7ff, 0x0400000c, 0x492fc857, 0x812e59c0, - 0x02000800, 0x0010032e, 0x832ca400, 0x00000007, - 0x4200b000, 0x0000000d, 0x0201f800, 0x0010bd5b, - 0x0401f00f, 0x4200b000, 0x00000010, 0x83e0a400, - 0x00000020, 0x50500000, 0x8050a000, 0x50500800, - 0x900409c0, 0x80040540, 0x4400a800, 0x8050a000, - 0x8054a800, 0x8058b040, 0x040207f7, 0x1c01f000, - 0x59a00207, 0x82000c80, 0x0000007f, 0x040210bf, - 0x0c01f001, 0x00102207, 0x0010223e, 0x0010223e, - 0x0010228d, 0x001022a9, 0x0010223e, 0x00102207, - 0x001022c5, 0x001022d6, 0x0010223e, 0x0010223e, - 0x001022e3, 0x001022fb, 0x00102313, 0x0010223e, - 0x0010233a, 0x00102364, 0x0010223e, 0x0010238d, - 0x0010223e, 0x00102459, 0x0010223e, 0x0010223e, - 0x0010223e, 0x0010223e, 0x00102484, 0x001024e7, - 0x0010223e, 0x0010223e, 0x0010223e, 0x0010223e, - 0x0010223e, 0x00102542, 0x0010223e, 0x0010259d, - 0x0010223e, 0x0010223e, 0x0010223e, 0x0010223e, - 0x001025a2, 0x00102633, 0x0010223e, 0x0010263b, - 0x0010223e, 0x0010223e, 0x0010223e, 0x0010223e, - 0x0010223e, 0x0010263d, 0x001026c6, 0x001028a1, - 0x0010223e, 0x0010223e, 0x0010223e, 0x0010223e, - 0x0010223e, 0x001028b0, 0x0010223e, 0x001028cd, - 0x0010223e, 0x0010223e, 0x0010223e, 0x0010223e, - 0x0010223e, 0x001028f8, 0x0010294b, 0x001029a7, - 0x001029c5, 0x0010f414, 0x0010fa05, 0x00102a11, - 0x0010223e, 0x00102f61, 0x00102b68, 0x00102baf, - 0x0010223e, 0x0010223e, 0x0010223e, 0x0010223e, - 0x0010223e, 0x0010223e, 0x0010223e, 0x0010223e, - 0x00102bd4, 0x00102c48, 0x0010223e, 0x0010223e, - 0x00102cb6, 0x0010223e, 0x00102d59, 0x00102e09, - 0x0010223e, 0x0010223e, 0x00102e9b, 0x00102f05, - 0x0010223e, 0x00102f61, 0x001031ce, 0x0010223e, - 0x001031e2, 0x0010326d, 0x0010223e, 0x0010223e, - 0x0010223e, 0x0010223e, 0x001032d3, 0x001032e5, - 0x00103308, 0x0010223e, 0x001033aa, 0x0010223e, - 0x0010223e, 0x001033f2, 0x0010223e, 0x00103426, - 0x0010223e, 0x0010223e, 0x0010348d, 0x001035ec, - 0x00103649, 0x0010223e, 0x001036ab, 0x0010223e, - 0x0010223e, 0x00103700, 0x00103793, 0x0010223e, - 0x48efc857, 0x4031d800, 0x58ef400a, 0x58ec0002, - 0x82000580, 0x00000200, 0x0400003c, 0x48efc857, - 0x4a034207, 0x00004000, 0x0201f800, 0x0010388b, - 0x83a00580, 0x0010c7ff, 0x0400000e, 0x58ee5809, - 0x4d2c0000, 0x0401f84d, 0x41a25800, 0x0201f800, - 0x00100594, 0x40ee5800, 0x0201f800, 0x00100594, - 0x5c025800, 0x492fc857, 0x0201f000, 0x000203ef, - 0x04026007, 0x59a0001e, 0x84000542, 0x4803401e, - 0x4a01d808, 0x0010221c, 0x1c01f000, 0x59a00207, - 0x82000d80, 0x00004000, 0x04000006, 0x900001c0, - 0x82000540, 0x00000011, 0x4803c011, 0x0401f005, - 0x900001c0, 0x82000540, 0x00000010, 0x4803c011, - 0x0401f841, 0x4a03c017, 0x00000000, 0x4203e000, - 0x30000001, 0x4203e000, 0x40000000, 0x40ee5800, - 0x0201f800, 0x00100594, 0x59a0001e, 0x84000504, - 0x4803401e, 0x1c01f000, 0x4803c856, 0x4a034207, - 0x00004001, 0x0401f7c9, 0x4803c856, 0x4a034207, - 0x00004002, 0x0401f7c5, 0x4803c856, 0x4a034207, - 0x00004003, 0x0401f7c1, 0x4803c856, 0x4a034207, - 0x00004005, 0x0401f7bd, 0x4803c856, 0x4a034207, - 0x00004006, 0x0401f7b9, 0x4803c856, 0x4a034207, - 0x0000400b, 0x0401f7b5, 0x4803c856, 0x4a034207, - 0x0000400c, 0x0401f7b1, 0x4803c856, 0x4a034207, - 0x0000400c, 0x0401f7ad, 0x4c580000, 0x4c500000, - 0x4c540000, 0x58eca809, 0x8054a9c0, 0x02000800, - 0x0010032e, 0x83a0a400, 0x00000007, 0x8254ac00, - 0x00000007, 0x4200b000, 0x0000000d, 0x0201f800, - 0x0010bd5b, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x1c01f000, 0x4c580000, 0x4c500000, 0x4c540000, - 0x59a00007, 0x4803c857, 0x59a00008, 0x4803c857, - 0x59a00009, 0x4803c857, 0x83e0ac00, 0x00000020, - 0x83a0a400, 0x00000007, 0x4200b000, 0x00000010, - 0x50500000, 0x4400a800, 0x8054a800, 0x900001c0, - 0x4400a800, 0x8054a800, 0x8050a000, 0x8058b040, - 0x040207f8, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x1c01f000, 0x59a00407, 0x800000c2, 0x59a00a08, - 0x900409c0, 0x80040540, 0x84000540, 0x59a00c08, - 0x8c040d00, 0x04000012, 0x59a80870, 0x8c040d00, - 0x040207b6, 0x4c000000, 0x0201f800, 0x0010bdab, - 0x5c000000, 0x04000005, 0x48030004, 0x4a030000, - 0x00000000, 0x0401f766, 0x4a030000, 0x00000000, - 0x4a034407, 0x00000004, 0x040007a4, 0x4803880e, - 0x0401f75f, 0x59a00407, 0x800000c2, 0x59a00c08, - 0x8c040d00, 0x04000014, 0x59a80870, 0x8c040d00, - 0x0402079e, 0x4c000000, 0x0201f800, 0x0010bdab, - 0x5c000000, 0x04000007, 0x48030004, 0x59800805, - 0x48074407, 0x4a030000, 0x00000000, 0x0401f74c, - 0x4a030000, 0x00000000, 0x4a034407, 0x00000004, - 0x0400078a, 0x4803880e, 0x59c4080f, 0x48074407, - 0x0401f743, 0x59a01c07, 0x59a00208, 0x900c19c0, - 0x800c1d40, 0x580c0803, 0x80000580, 0x500c1000, - 0x80080400, 0x800c1800, 0x80040840, 0x040207fc, - 0x48034407, 0x900001c0, 0x48034208, 0x800001c0, - 0x04000733, 0x0401f771, 0x4a034407, 0x00000005, - 0x4a034208, 0x00000004, 0x4a034408, 0x00000000, - 0x59a8000a, 0x48034209, 0x900001c0, 0x48034409, - 0x4a03420a, 0x00000496, 0x0401f725, 0x59a00408, + 0x00008000, 0x00008000, 0x0201f800, 0x0010056e, + 0x02000800, 0x0010032e, 0x492f4017, 0x1c01f000, + 0x83a0ac00, 0x00000007, 0x83a00580, 0x0010caff, + 0x0400000c, 0x492fc857, 0x812e59c0, 0x02000800, + 0x0010032e, 0x832ca400, 0x00000007, 0x4200b000, + 0x0000000d, 0x0201f800, 0x0010c086, 0x0401f00f, + 0x4200b000, 0x00000010, 0x83e0a400, 0x00000020, + 0x50500000, 0x8050a000, 0x50500800, 0x900409c0, + 0x80040540, 0x4400a800, 0x8050a000, 0x8054a800, + 0x8058b040, 0x040207f7, 0x1c01f000, 0x59a00207, + 0x82000c80, 0x0000007f, 0x040210bf, 0x0c01f001, + 0x001022c6, 0x001022fd, 0x001022fd, 0x0010234c, + 0x00102368, 0x001022fd, 0x001022c6, 0x00102384, + 0x00102395, 0x001022fd, 0x001022fd, 0x001023a7, + 0x001023bf, 0x001023d7, 0x001022fd, 0x001023fe, + 0x00102428, 0x001022fd, 0x00102451, 0x001022fd, + 0x0010251d, 0x001022fd, 0x001022fd, 0x001022fd, + 0x001022fd, 0x00102548, 0x001025ab, 0x001022fd, + 0x001022fd, 0x001022fd, 0x001022fd, 0x001022fd, + 0x00102606, 0x001022fd, 0x00102661, 0x001022fd, + 0x001022fd, 0x001022fd, 0x001022fd, 0x00102666, + 0x001026f7, 0x001022fd, 0x001026ff, 0x001022fd, + 0x001022fd, 0x001022fd, 0x001022fd, 0x001022fd, + 0x00102701, 0x0010278a, 0x00102965, 0x001022fd, + 0x001022fd, 0x001022fd, 0x001022fd, 0x001022fd, + 0x00102974, 0x001022fd, 0x00102991, 0x001022fd, + 0x001022fd, 0x001022fd, 0x001022fd, 0x001022fd, + 0x001029bc, 0x00102a0f, 0x00102a6b, 0x00102a89, + 0x0010f714, 0x0010fd05, 0x00102ad5, 0x001022fd, + 0x00103025, 0x00102c2c, 0x00102c73, 0x001022fd, + 0x001022fd, 0x001022fd, 0x001022fd, 0x001022fd, + 0x001022fd, 0x001022fd, 0x001022fd, 0x00102c98, + 0x00102d0c, 0x001022fd, 0x001022fd, 0x00102d7a, + 0x001022fd, 0x00102e1d, 0x00102ecd, 0x001022fd, + 0x001022fd, 0x00102f5f, 0x00102fc9, 0x001022fd, + 0x00103025, 0x001032be, 0x001022fd, 0x001032d2, + 0x0010335d, 0x001022fd, 0x001022fd, 0x001022fd, + 0x001022fd, 0x001033c3, 0x001033d5, 0x001033f8, + 0x001022fd, 0x0010349a, 0x001022fd, 0x001022fd, + 0x001034e2, 0x001022fd, 0x00103516, 0x001022fd, + 0x001022fd, 0x0010357d, 0x001036dc, 0x00103739, + 0x001022fd, 0x0010379b, 0x001022fd, 0x001022fd, + 0x001037f0, 0x00103883, 0x001022fd, 0x48efc857, + 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, + 0x00000200, 0x0400003c, 0x48efc857, 0x4a034207, + 0x00004000, 0x0201f800, 0x0010397b, 0x83a00580, + 0x0010caff, 0x0400000e, 0x58ee5809, 0x4d2c0000, + 0x0401f84d, 0x41a25800, 0x0201f800, 0x00100594, + 0x40ee5800, 0x0201f800, 0x00100594, 0x5c025800, + 0x492fc857, 0x0201f000, 0x000203ef, 0x04026007, + 0x59a0001e, 0x84000542, 0x4803401e, 0x4a01d808, + 0x001022db, 0x1c01f000, 0x59a00207, 0x82000d80, + 0x00004000, 0x04000006, 0x900001c0, 0x82000540, + 0x00000011, 0x4803c011, 0x0401f005, 0x900001c0, + 0x82000540, 0x00000010, 0x4803c011, 0x0401f841, + 0x4a03c017, 0x00000000, 0x4203e000, 0x30000001, + 0x4203e000, 0x40000000, 0x40ee5800, 0x0201f800, + 0x00100594, 0x59a0001e, 0x84000504, 0x4803401e, + 0x1c01f000, 0x4803c856, 0x4a034207, 0x00004001, + 0x0401f7c9, 0x4803c856, 0x4a034207, 0x00004002, + 0x0401f7c5, 0x4803c856, 0x4a034207, 0x00004003, + 0x0401f7c1, 0x4803c856, 0x4a034207, 0x00004005, + 0x0401f7bd, 0x4803c856, 0x4a034207, 0x00004006, + 0x0401f7b9, 0x4803c856, 0x4a034207, 0x0000400b, + 0x0401f7b5, 0x4803c856, 0x4a034207, 0x0000400c, + 0x0401f7b1, 0x4803c856, 0x4a034207, 0x0000400c, + 0x0401f7ad, 0x4c580000, 0x4c500000, 0x4c540000, + 0x58eca809, 0x8054a9c0, 0x02000800, 0x0010032e, + 0x83a0a400, 0x00000007, 0x8254ac00, 0x00000007, + 0x4200b000, 0x0000000d, 0x0201f800, 0x0010c086, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x1c01f000, + 0x4c580000, 0x4c500000, 0x4c540000, 0x59a00007, + 0x4803c857, 0x59a00008, 0x4803c857, 0x59a00009, + 0x4803c857, 0x83e0ac00, 0x00000020, 0x83a0a400, + 0x00000007, 0x4200b000, 0x00000010, 0x50500000, + 0x4400a800, 0x8054a800, 0x900001c0, 0x4400a800, + 0x8054a800, 0x8050a000, 0x8058b040, 0x040207f8, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x1c01f000, + 0x59a00407, 0x800000c2, 0x59a00a08, 0x900409c0, + 0x80040540, 0x84000540, 0x59a00c08, 0x8c040d00, + 0x04000012, 0x59a80870, 0x8c040d00, 0x040207b6, + 0x4c000000, 0x0201f800, 0x0010c0d6, 0x5c000000, + 0x04000005, 0x48030004, 0x4a030000, 0x00000000, + 0x0401f766, 0x4a030000, 0x00000000, 0x4a034407, + 0x00000004, 0x040007a4, 0x4803880e, 0x0401f75f, + 0x59a00407, 0x800000c2, 0x59a00c08, 0x8c040d00, + 0x04000014, 0x59a80870, 0x8c040d00, 0x0402079e, + 0x4c000000, 0x0201f800, 0x0010c0d6, 0x5c000000, + 0x04000007, 0x48030004, 0x59800805, 0x48074407, + 0x4a030000, 0x00000000, 0x0401f74c, 0x4a030000, + 0x00000000, 0x4a034407, 0x00000004, 0x0400078a, + 0x4803880e, 0x59c4080f, 0x48074407, 0x0401f743, + 0x59a01c07, 0x59a00208, 0x900c19c0, 0x800c1d40, + 0x580c0803, 0x80000580, 0x500c1000, 0x80080400, + 0x800c1800, 0x80040840, 0x040207fc, 0x48034407, + 0x900001c0, 0x48034208, 0x800001c0, 0x04000733, + 0x0401f771, 0x4a034407, 0x00000005, 0x4a034208, + 0x00000005, 0x4a034408, 0x00000000, 0x59a8000a, + 0x48034209, 0x900001c0, 0x48034409, 0x42000000, + 0x00009496, 0x4803420a, 0x900001c0, 0x4803440e, + 0x4a03400f, 0x00000000, 0x0401f720, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x59a00a09, 0x59a00409, 0x900409c0, 0x80040d40, 0x59a0020b, - 0x82002480, 0x00000010, 0x0400175c, 0x59a02407, + 0x82002480, 0x00000010, 0x04001757, 0x59a02407, 0x900001c0, 0x80100540, 0x59a8280a, 0x80142480, - 0x04001756, 0x0201f000, 0x0010389a, 0x59a00408, + 0x04001751, 0x0201f000, 0x0010398a, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x59a00a09, 0x59a00409, 0x900409c0, 0x80040d40, 0x59a0020b, - 0x82002480, 0x00000010, 0x04001744, 0x59a02407, + 0x82002480, 0x00000010, 0x0400173f, 0x59a02407, 0x900001c0, 0x80100540, 0x59a8280a, 0x80142480, - 0x0400173e, 0x0201f000, 0x001038a3, 0x59a02408, + 0x04001739, 0x0201f000, 0x00103993, 0x59a02408, 0x59a00208, 0x901021c0, 0x80102540, 0x59a01a0b, 0x59a00407, 0x900c19c0, 0x800c1d40, 0x41781000, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24320001, 0x0400100e, 0x820c0580, 0x00007c00, 0x0400000b, 0x820c0480, 0x00007a00, 0x04001008, 0x820c0480, 0x00007cff, 0x04021005, 0x0201f800, - 0x0010bdab, 0x04000008, 0x80081000, 0x44101800, - 0x800811c0, 0x040006d6, 0x4a030000, 0x00000000, - 0x0401f6d3, 0x4a030000, 0x00000000, 0x4a034407, - 0x00000004, 0x0401f711, 0x59a01a0b, 0x59a00407, + 0x0010c0d6, 0x04000008, 0x80081000, 0x44101800, + 0x800811c0, 0x040006d1, 0x4a030000, 0x00000000, + 0x0401f6ce, 0x4a030000, 0x00000000, 0x4a034407, + 0x00000004, 0x0401f70c, 0x59a01a0b, 0x59a00407, 0x900c19c0, 0x800c1d40, 0x41781000, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24320001, 0x0400100e, 0x820c0580, 0x00007c00, 0x0400000b, 0x820c0480, 0x00007a00, 0x04001008, 0x820c0480, - 0x00007cff, 0x04021005, 0x0201f800, 0x0010bdab, + 0x00007cff, 0x04021005, 0x0201f800, 0x0010c0d6, 0x0400000f, 0x80081000, 0x500c0000, 0x82000d00, 0x0000ffff, 0x48074208, 0x82000d00, 0xffff0000, - 0x900409c0, 0x48074408, 0x800811c0, 0x040006ac, - 0x4a030000, 0x00000000, 0x0401f6a9, 0x4a030000, - 0x00000000, 0x4a034407, 0x00000004, 0x0401f6e7, + 0x900409c0, 0x48074408, 0x800811c0, 0x040006a7, + 0x4a030000, 0x00000000, 0x0401f6a4, 0x4a030000, + 0x00000000, 0x4a034407, 0x00000004, 0x0401f6e2, 0x59a00407, 0x8c000500, 0x04000020, 0x59a01208, 0x59a01c08, 0x59a02209, 0x480b5044, 0x480f5045, 0x48135046, 0x59c40801, 0x82040d00, 0x00018000, @@ -16821,13 +16922,13 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04000007, 0x0201f800, 0x0010032e, 0x40080000, 0x0401f004, 0x400c0000, 0x0401f002, 0x40100000, 0x80000110, 0x42000800, 0x000000e0, 0x0201f800, - 0x00101944, 0x0401f007, 0x59a81044, 0x59a81845, + 0x00101949, 0x0401f007, 0x59a81044, 0x59a81845, 0x59a82046, 0x480b4208, 0x480f4408, 0x48134209, - 0x0401f67b, 0x4d2c0000, 0x4d340000, 0x4d300000, - 0x4d440000, 0x0201f800, 0x00103980, 0x04020007, + 0x0401f676, 0x4d2c0000, 0x4d340000, 0x4d300000, + 0x4d440000, 0x0201f800, 0x00103a70, 0x04020007, 0x4923c857, 0x4927c857, 0x59a28c07, 0x0201f800, - 0x0010497a, 0x04000006, 0x5c028800, 0x5c026000, - 0x5c026800, 0x5c025800, 0x0401f6b0, 0x4937c857, + 0x00104a7c, 0x04000006, 0x5c028800, 0x5c026000, + 0x5c026800, 0x5c025800, 0x0401f6ab, 0x4937c857, 0x59a04408, 0x59a00208, 0x900001c0, 0x80204540, 0x4823c857, 0x0401f88a, 0x04000009, 0x4a034209, 0x00000001, 0x4a034407, 0x0000ffff, 0x4a034208, @@ -16835,7 +16936,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0401f88b, 0x0400004d, 0x59300402, 0x48034407, 0x59300202, 0x48034208, 0x59300006, 0x48034408, 0x59a0020c, 0x8c000500, 0x0400003d, 0x4933c857, - 0x0201f800, 0x0010492d, 0x04000004, 0x4a034407, + 0x0201f800, 0x00104a2f, 0x04000004, 0x4a034407, 0x00000009, 0x0401f03d, 0x8d0e1d0e, 0x04000004, 0x4a034407, 0x00000001, 0x0401f038, 0x836c0580, 0x00000003, 0x04000004, 0x4a034407, 0x00000007, @@ -16844,77 +16945,77 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x82000d80, 0x00000003, 0x04020009, 0x59300804, 0x82040500, 0x0000001f, 0x82000580, 0x00000004, 0x04020003, 0x8c040d3e, 0x04020019, 0x0201f800, - 0x00103876, 0x04020004, 0x4a034407, 0x00000002, + 0x00103966, 0x04020004, 0x4a034407, 0x00000002, 0x0401f01a, 0x492fc857, 0x4a025c05, 0x00008000, - 0x497a5a05, 0x497a5806, 0x0201f800, 0x0010a0d6, + 0x497a5a05, 0x497a5806, 0x0201f800, 0x0010a313, 0x04020004, 0x4a034407, 0x00000003, 0x0401f00f, - 0x4a01d808, 0x00102403, 0x5c028800, 0x5c026000, + 0x4a01d808, 0x001024c7, 0x5c028800, 0x5c026000, 0x5c026800, 0x5c025800, 0x1c01f000, 0x4a034209, 0x00000002, 0x5c028800, 0x5c026000, 0x5c026800, - 0x5c025800, 0x0401f60a, 0x5c028800, 0x5c026000, - 0x5c026800, 0x5c025800, 0x0401f648, 0x492fc857, + 0x5c025800, 0x0401f605, 0x5c028800, 0x5c026000, + 0x5c026800, 0x5c025800, 0x0401f643, 0x492fc857, 0x4933c857, 0x497a6027, 0x592c0006, 0x82000580, 0x01000000, 0x04020004, 0x4a034407, 0x00000004, - 0x0401f63e, 0x4d2c0000, 0x832e5c00, 0x00000007, + 0x0401f639, 0x4d2c0000, 0x832e5c00, 0x00000007, 0x592c0000, 0x82000580, 0x02000000, 0x04020012, 0x4803c856, 0x4a034209, 0x00000004, 0x592c0804, 0x82040500, 0x0000ffff, 0x48034409, 0x80040920, 0x4807420a, 0x592c0805, 0x82040500, 0x0000ffff, 0x4803440a, 0x80040920, 0x4807420b, 0x5c025800, - 0x0401f5e3, 0x4803c856, 0x4a034209, 0x00000005, + 0x0401f5de, 0x4803c856, 0x4a034209, 0x00000005, 0x592c0801, 0x82040500, 0x0000ffff, 0x48034409, 0x80040920, 0x4807420a, 0x0401f7f5, 0x4937c857, 0x4823c857, 0x5934000f, 0x80001d40, 0x04000005, 0x580c0006, 0x80200580, 0x04020003, 0x81780000, 0x1c01f000, 0x580c0000, 0x0401f7f8, 0x4823c857, - 0x4d2c0000, 0x42026000, 0x00111264, 0x59300407, + 0x4d2c0000, 0x42026000, 0x00111584, 0x59300407, 0x82000d80, 0x00000003, 0x04000004, 0x82000d80, 0x00000006, 0x04020007, 0x59325809, 0x812e59c0, 0x04000004, 0x592c0006, 0x80200580, 0x0400000a, 0x83326400, 0x0000002c, 0x59a8000b, 0x81300480, 0x040017ef, 0x417a6000, 0x80000580, 0x5c025800, 0x1c01f000, 0x82000540, 0x00000001, 0x5c025800, - 0x1c01f000, 0x83a00580, 0x0010c7ff, 0x040205e3, + 0x1c01f000, 0x83a00580, 0x0010caff, 0x040205de, 0x59a80070, 0x8c000500, 0x04020003, 0x4a030000, 0x00000000, 0x4a034207, 0x00004000, 0x4a03c011, - 0x40000010, 0x0401fe0c, 0x4a03c017, 0x00000000, + 0x40000010, 0x0401fe07, 0x4a03c017, 0x00000000, 0x59e00002, 0x8c00051e, 0x04020008, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24320002, 0x02000000, 0x0002025f, 0x59a80078, 0x8c00053e, 0x0400000b, 0x42000800, 0x000000a0, 0x0201f800, - 0x0010193c, 0x82040540, 0x00000001, 0x42000800, - 0x000000a0, 0x0201f800, 0x00101944, 0x4203e000, + 0x00101941, 0x82040540, 0x00000001, 0x42000800, + 0x000000a0, 0x0201f800, 0x00101949, 0x4203e000, 0x30000001, 0x4203e000, 0x40000000, 0x0401f000, 0x59a00c07, 0x800409c0, 0x04000007, 0x836c0580, 0x00000000, 0x04000004, 0x4a034407, 0x0000001a, - 0x0401f5be, 0x42007000, 0x0010c89b, 0x58381c01, + 0x0401f5b9, 0x42007000, 0x0010cb9b, 0x58381c01, 0x58382201, 0x58383202, 0x8c040d00, 0x0400000b, - 0x59a01208, 0x82080500, 0x0000f003, 0x040205b7, - 0x82080480, 0x00000841, 0x040215b4, 0x82080480, - 0x00000100, 0x040015b1, 0x40040000, 0x800c0540, + 0x59a01208, 0x82080500, 0x0000f003, 0x040205b2, + 0x82080480, 0x00000841, 0x040215af, 0x82080480, + 0x00000100, 0x040015ac, 0x40040000, 0x800c0540, 0x82000500, 0x00000028, 0x82000580, 0x00000028, - 0x040005aa, 0x8c040d0a, 0x04000008, 0x59a03c08, - 0x821c0480, 0x00000006, 0x040215a4, 0x821c0480, - 0x00000001, 0x040015a1, 0x8c040d06, 0x04000003, + 0x040005a5, 0x8c040d0a, 0x04000008, 0x59a03c08, + 0x821c0480, 0x00000006, 0x0402159f, 0x821c0480, + 0x00000001, 0x0400159c, 0x8c040d06, 0x04000003, 0x4a0378e4, 0x000c0000, 0x8c040d04, 0x04000004, 0x59e00002, 0x84000548, 0x4803c002, 0x8c040d02, 0x04000005, 0x42002800, 0x00007600, 0x4a002805, 0xd0000000, 0x40040000, 0x800c0540, 0x48007401, 0x8c040d00, 0x04000002, 0x48087201, 0x8c040d0a, 0x0400001f, 0x481c7202, 0x4c0c0000, 0x4c100000, - 0x4c180000, 0x0201f800, 0x00106c3c, 0x4df00000, + 0x4c180000, 0x0201f800, 0x00106e41, 0x4df00000, 0x58383a02, 0x481fc857, 0x41780000, 0x801c3840, 0x800010c8, 0x82081400, 0x0000bf32, 0x4a001001, 0x00000000, 0x801c1c80, 0x04021003, 0x4a001001, 0x00000002, 0x80000000, 0x82001c80, 0x00000005, - 0x040017f4, 0x5c03e000, 0x02000800, 0x00106c29, + 0x040017f4, 0x5c03e000, 0x02000800, 0x00106e2e, 0x5c003000, 0x5c002000, 0x5c001800, 0x480f4407, - 0x48134208, 0x481b4408, 0x0401f521, 0x4d440000, - 0x4d340000, 0x59a28c07, 0x0201f800, 0x00103980, - 0x0402000c, 0x0201f800, 0x0010497a, 0x04020009, - 0x0201f800, 0x0010492d, 0x04000009, 0x4a034407, - 0x00000009, 0x5c026800, 0x5c028800, 0x0401f553, - 0x5c026800, 0x5c028800, 0x0401f554, 0x59a01208, + 0x48134208, 0x481b4408, 0x0401f51c, 0x4d440000, + 0x4d340000, 0x59a28c07, 0x0201f800, 0x00103a70, + 0x0402000c, 0x0201f800, 0x00104a7c, 0x04020009, + 0x0201f800, 0x00104a2f, 0x04000009, 0x4a034407, + 0x00000009, 0x5c026800, 0x5c028800, 0x0401f54e, + 0x5c026800, 0x5c028800, 0x0401f54f, 0x59a01208, 0x59a01c08, 0x5934400a, 0x82203d00, 0x0000e000, 0x801c391a, 0x8c081500, 0x04000024, 0x820c0d00, 0x00000007, 0x82040580, 0x00000000, 0x04000010, @@ -16923,24 +17024,24 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04000007, 0x82040580, 0x00000013, 0x04000004, 0x4937c857, 0x42000800, 0x00000003, 0x82204500, 0xffff1fff, 0x800400da, 0x80200540, 0x4802680a, - 0x4c080000, 0x4c1c0000, 0x0201f800, 0x00106c3c, - 0x0201f800, 0x00104c3a, 0x0201f800, 0x00106c29, + 0x4c080000, 0x4c1c0000, 0x0201f800, 0x00106e41, + 0x0201f800, 0x00104d3f, 0x0201f800, 0x00106e2e, 0x5c003800, 0x5c001000, 0x481f4408, 0x5934400a, 0x82203d00, 0x0f000000, 0x801c3930, 0x8c081504, 0x04020012, 0x8c081502, 0x0400000c, 0x4823c857, 0x82204500, 0xf0ffffff, 0x59a01a09, 0x820c0d00, 0x0000000f, 0x800400f0, 0x8400056e, 0x80200540, 0x4802680a, 0x4803c857, 0x481f4209, 0x5c026800, - 0x5c028800, 0x0401f4ca, 0x82204500, 0xf07fffff, + 0x5c028800, 0x0401f4c5, 0x82204500, 0xf07fffff, 0x4822680a, 0x0401f7f9, 0x8d0e1d0e, 0x04000004, - 0x4a034407, 0x00000001, 0x0401f504, 0x836c0580, - 0x00000003, 0x04020016, 0x0201f800, 0x00103980, - 0x04020502, 0x59240200, 0x8c000502, 0x0400004b, - 0x59240005, 0x497b4407, 0x0201f800, 0x00104fc6, + 0x4a034407, 0x00000001, 0x0401f4ff, 0x836c0580, + 0x00000003, 0x04020016, 0x0201f800, 0x00103a70, + 0x040204fd, 0x59240200, 0x8c000502, 0x0400004b, + 0x59240005, 0x497b4407, 0x0201f800, 0x001050f7, 0x0400000f, 0x82000d00, 0x00ffff00, 0x0402000c, - 0x82000c00, 0x00102057, 0x50040800, 0x80040910, + 0x82000c00, 0x00102116, 0x50040800, 0x80040910, 0x82041580, 0x00000080, 0x04020004, 0x4a034407, - 0x00000007, 0x0401f4e9, 0x48074407, 0x82000d00, + 0x00000007, 0x0401f4e4, 0x48074407, 0x82000d00, 0x0000ffff, 0x48074208, 0x80000120, 0x48034408, 0x59a8021b, 0x82001500, 0x00003500, 0x480b440a, 0x8c000502, 0x0400001f, 0x8c000506, 0x04000009, @@ -16951,65 +17052,65 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00000003, 0x0401f018, 0x8c000508, 0x04000009, 0x82000d00, 0x00000012, 0x82040d80, 0x00000012, 0x04020004, 0x4a03420a, 0x00000002, 0x0401f00e, - 0x0201f800, 0x00104fc6, 0x04020004, 0x4a03420a, - 0x00000004, 0x0401f476, 0x8c000506, 0x04000004, - 0x4a034407, 0x00000005, 0x0401f4b4, 0x4a03420a, - 0x00000000, 0x0401f46e, 0x4a034407, 0x0000001b, - 0x0401f4ae, 0x59a8002a, 0x48034408, 0x59a8002b, - 0x4803420a, 0x0401f466, 0x42007800, 0x0010ccb9, + 0x0201f800, 0x001050f7, 0x04020004, 0x4a03420a, + 0x00000004, 0x0401f471, 0x8c000506, 0x04000004, + 0x4a034407, 0x00000005, 0x0401f4af, 0x4a03420a, + 0x00000000, 0x0401f469, 0x4a034407, 0x0000001b, + 0x0401f4a9, 0x59a8002a, 0x48034408, 0x59a8002b, + 0x4803420a, 0x0401f461, 0x42007800, 0x0010cfb9, 0x59a00407, 0x4803c857, 0x82000c80, 0x0000000a, - 0x040214a6, 0x0c01f001, 0x00102625, 0x001025bd, - 0x001025cb, 0x001025de, 0x001025ff, 0x00102627, - 0x001025b5, 0x001025b5, 0x001025b5, 0x001025b5, - 0x001025b6, 0x0401f499, 0x59a00208, 0x48007c01, + 0x040214a1, 0x0c01f001, 0x001026e9, 0x00102681, + 0x0010268f, 0x001026a2, 0x001026c3, 0x001026eb, + 0x00102679, 0x00102679, 0x00102679, 0x00102679, + 0x0010267a, 0x0401f494, 0x59a00208, 0x48007c01, 0x59a00408, 0x48007a01, 0x0201f800, 0x001003ea, - 0x0401f069, 0x836c0580, 0x00000000, 0x0400048b, + 0x0401f069, 0x836c0580, 0x00000000, 0x04000486, 0x59a00a08, 0x59a00408, 0x900001c0, 0x80040d40, 0x4807c857, 0x59a00a09, 0x59a00409, 0x900001c0, 0x80040d40, 0x4807c857, 0x0401f05b, 0x836c0580, - 0x00000000, 0x0400047d, 0x59a00408, 0x59a01208, + 0x00000000, 0x04000478, 0x59a00408, 0x59a01208, 0x900001c0, 0x80081540, 0x59a00409, 0x59a01a09, - 0x900001c0, 0x800c1d40, 0x42000000, 0x0010e2cc, + 0x900001c0, 0x800c1d40, 0x42000000, 0x0010e5cc, 0x480fc857, 0x480bc857, 0x42000800, 0x00001000, - 0x0201f000, 0x001038a3, 0x59a00a08, 0x59a00408, - 0x900001c0, 0x80041d40, 0x820c0c80, 0x0010beb3, - 0x0402146a, 0x820c0c80, 0x00100000, 0x04001467, + 0x0201f000, 0x00103993, 0x59a00a08, 0x59a00408, + 0x900001c0, 0x80041d40, 0x820c0c80, 0x0010c1f9, + 0x04021465, 0x820c0c80, 0x00100000, 0x04001462, 0x480fc857, 0x823c7c00, 0x0000000d, 0x503c0800, 0x800409c0, 0x04000006, 0x823c0580, 0x00000011, - 0x0400045e, 0x803c7800, 0x0401f7f9, 0x59e41001, + 0x04000459, 0x803c7800, 0x0401f7f9, 0x59e41001, 0x82080d00, 0xfffeffcf, 0x4807c801, 0x440c7800, 0x46001800, 0x0201f800, 0x800c1800, 0x46001800, 0x0010031e, 0x480bc801, 0x0401f027, 0x59a01a08, 0x59a00408, 0x900001c0, 0x800c1d40, 0x480c7803, 0x59a02209, 0x59a00409, 0x900001c0, 0x80102540, 0x48107804, 0x59a0020a, 0x40001000, 0x48007807, - 0x80000040, 0x04001441, 0x48007808, 0x42000800, - 0x00004000, 0x0201f800, 0x00106a79, 0x80000540, - 0x04000002, 0x0401f439, 0x40040000, 0x800c1c00, - 0x04001436, 0x4800780a, 0x480c7805, 0x48107806, + 0x80000040, 0x0400143c, 0x48007808, 0x42000800, + 0x00004000, 0x0201f800, 0x00106c7e, 0x80000540, + 0x04000002, 0x0401f434, 0x40040000, 0x800c1c00, + 0x04001431, 0x4800780a, 0x480c7805, 0x48107806, 0x4978780c, 0x59a0040a, 0x800000c4, 0x4800780b, 0x59e40001, 0x4803c857, 0x82000540, 0x00040000, - 0x4803c801, 0x0201f000, 0x00102207, 0x49787803, + 0x4803c801, 0x0201f000, 0x001022c6, 0x49787803, 0x49787804, 0x49787808, 0x49787807, 0x49787803, 0x49787805, 0x49787806, 0x4978780c, 0x4978780b, 0x59e40001, 0x84000524, 0x0401f7f2, 0x59a80005, 0x48034407, 0x59a80006, 0x48034208, 0x59a80007, - 0x48034408, 0x0201f000, 0x00102207, 0x0201f800, + 0x48034408, 0x0201f000, 0x001022c6, 0x0201f800, 0x0010032e, 0x4803c856, 0x4a03c013, 0x03800300, 0x4a03c014, 0x03800380, 0x59a00c07, 0x82040580, 0x000000a0, 0x04000004, 0x82040580, 0x000000a2, 0x04020021, 0x59a0140b, 0x82080480, 0x00000100, 0x0402101d, 0x59a0020c, 0x8c000500, 0x04020026, 0x59a00a0b, 0x800409c0, 0x04000017, 0x82040480, - 0x00000041, 0x04021014, 0x0201f800, 0x00103876, + 0x00000041, 0x04021014, 0x0201f800, 0x00103966, 0x0400000b, 0x59a01008, 0x900811c0, 0x59a0180a, - 0x900c19c0, 0x59a00a0b, 0x0201f800, 0x0010389d, - 0x4a01d808, 0x0010266d, 0x1c01f000, 0x4a034407, + 0x900c19c0, 0x59a00a0b, 0x0201f800, 0x0010398d, + 0x4a01d808, 0x00102731, 0x1c01f000, 0x4a034407, 0x00000002, 0x4a03c014, 0x03800000, 0x0201f000, - 0x0010224a, 0x4a03c014, 0x03800000, 0x0201f000, - 0x0010224e, 0x4031d800, 0x58ef400a, 0x58ee580c, + 0x00102309, 0x4a03c014, 0x03800000, 0x0201f000, + 0x0010230d, 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x00102242, 0x59a00c07, 0x59a0140b, 0x59a0020c, + 0x00102301, 0x59a00c07, 0x59a0140b, 0x59a0020c, 0x8c000500, 0x04020039, 0x832e5c00, 0x00000005, 0x4178c000, 0x59a0ba0b, 0x40600000, 0x812c0400, 0x5000c800, 0x82641d00, 0x000000ff, 0x4c040000, @@ -17027,20 +17128,20 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x8060c000, 0x0401f7cd, 0x59a0020b, 0x82000500, 0x000000ff, 0x40001800, 0x4c040000, 0x4c080000, 0x0401f896, 0x5c001000, 0x5c000800, 0x04000005, - 0x4a03c014, 0x03800000, 0x0201f000, 0x00102207, + 0x4a03c014, 0x03800000, 0x0201f000, 0x001022c6, 0x4a03c014, 0x03800000, 0x4a034407, 0x00000004, - 0x0201f000, 0x0010224a, 0x4803c856, 0x59a80878, + 0x0201f000, 0x00102309, 0x4803c856, 0x59a80878, 0x8c040d3e, 0x04020005, 0x4a03c013, 0x03800300, 0x4a03c014, 0x03800380, 0x59a00c07, 0x82040580, 0x000000a0, 0x04000004, 0x82040580, 0x000000a2, 0x04020076, 0x59a0140b, 0x82080480, 0x00000100, 0x04021072, 0x59a0020c, 0x8c000500, 0x0402005d, 0x59a01a0b, 0x800c19c0, 0x0400006c, 0x820c0480, - 0x00000041, 0x04021069, 0x0201f800, 0x00103876, + 0x00000041, 0x04021069, 0x0201f800, 0x00103966, 0x0402000b, 0x4a034407, 0x00000002, 0x59a80878, 0x8c040d3e, 0x04020003, 0x4a03c014, 0x03800000, - 0x4803c857, 0x0201f000, 0x0010224a, 0x59a80078, - 0x8c00053e, 0x02020000, 0x0010b663, 0x832e5c00, + 0x4803c857, 0x0201f000, 0x00102309, 0x59a80078, + 0x8c00053e, 0x02020000, 0x0010b98e, 0x832e5c00, 0x00000005, 0x4178c000, 0x59a0ba0b, 0x4803c857, 0x40600000, 0x812c0400, 0x4000c800, 0x4c040000, 0x4c080000, 0x0401f887, 0x5c001000, 0x5c000800, @@ -17057,18 +17158,18 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4400c800, 0x805cb840, 0x04000004, 0x80081000, 0x8060c000, 0x0401f7ca, 0x59a00a0b, 0x59a01008, 0x900811c0, 0x59a0180a, 0x900c19c0, 0x4a03c014, - 0x03800000, 0x412c0000, 0x0201f000, 0x001038a0, + 0x03800000, 0x412c0000, 0x0201f000, 0x00103990, 0x4803c857, 0x59a80078, 0x8c00053e, 0x02020000, - 0x0010224e, 0x0401f847, 0x04000006, 0x48174407, - 0x4a03c014, 0x03800000, 0x0201f000, 0x00102207, + 0x0010230d, 0x0401f847, 0x04000006, 0x48174407, + 0x4a03c014, 0x03800000, 0x0201f000, 0x001022c6, 0x4a03c014, 0x03800000, 0x4a034407, 0x00000004, - 0x0201f000, 0x0010224a, 0x4a03c014, 0x03800000, - 0x0201f000, 0x0010224e, 0x4c5c0000, 0x4c600000, + 0x0201f000, 0x00102309, 0x4a03c014, 0x03800000, + 0x0201f000, 0x0010230d, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4004b800, 0x4008c000, 0x400cc800, 0x0401f87a, 0x04000012, 0x0401f8b2, 0x04020014, 0x4060b800, 0x0401f8af, 0x04020011, 0x4064b800, 0x0401f8ac, 0x0402000e, 0x0401f896, 0x4ce80000, - 0x4201d000, 0x00001388, 0x0201f800, 0x0010645c, + 0x4201d000, 0x00001388, 0x0201f800, 0x00106661, 0x5c01d000, 0x82000540, 0x00000001, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x0401f889, 0x80000580, 0x0401f7fa, 0x4c5c0000, 0x485fc857, @@ -17086,9 +17187,9 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x5c00b800, 0x1c01f000, 0x0401f856, 0x80000580, 0x4803c857, 0x4867c857, 0x0401f7f7, 0x4ce80000, 0x4c580000, 0x4803c856, 0x4200b000, 0x0000000c, - 0x4201d000, 0x0000000a, 0x0201f800, 0x0010645c, + 0x4201d000, 0x0000000a, 0x0201f800, 0x00106661, 0x4a03c013, 0x02000200, 0x4201d000, 0x0000000a, - 0x0201f800, 0x0010645c, 0x4a03c013, 0x02000000, + 0x0201f800, 0x00106661, 0x4a03c013, 0x02000000, 0x8058b040, 0x040207f3, 0x42000800, 0x000003e8, 0x4a03c013, 0x03800300, 0x80040840, 0x04000010, 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, @@ -17100,179 +17201,179 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x80040840, 0x0400001b, 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, 0x03800380, 0x82000500, 0x00000300, 0x82000580, 0x00000300, 0x040207f3, - 0x4201d000, 0x0000000a, 0x0201f800, 0x0010645c, + 0x4201d000, 0x0000000a, 0x0201f800, 0x00106661, 0x4a03c013, 0x01000000, 0x4201d000, 0x0000000a, - 0x0201f800, 0x0010645c, 0x4a03c013, 0x02000000, + 0x0201f800, 0x00106661, 0x4a03c013, 0x02000000, 0x82000540, 0x00000001, 0x5c01d000, 0x1c01f000, 0x4803c857, 0x0401ffb2, 0x040207ee, 0x0401f7fb, 0x4803c856, 0x4a03c013, 0x01000000, 0x4ce80000, - 0x4201d000, 0x0000000a, 0x0201f800, 0x0010645c, + 0x4201d000, 0x0000000a, 0x0201f800, 0x00106661, 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, - 0x4201d000, 0x0000000a, 0x0201f800, 0x0010645c, + 0x4201d000, 0x0000000a, 0x0201f800, 0x00106661, 0x5c01d000, 0x4a03c013, 0x01000100, 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x485fc857, 0x4200c000, 0x00000008, 0x825c0500, 0x00000080, 0x800000c2, 0x82000540, 0x01000000, 0x4803c013, 0x4ce80000, - 0x4201d000, 0x0000000a, 0x0201f800, 0x0010645c, + 0x4201d000, 0x0000000a, 0x0201f800, 0x00106661, 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, - 0x4201d000, 0x0000000a, 0x0201f800, 0x0010645c, + 0x4201d000, 0x0000000a, 0x0201f800, 0x00106661, 0x5c01d000, 0x4a03c013, 0x02000000, 0x805cb8c2, 0x8060c040, 0x040207e8, 0x4a03c013, 0x01000100, 0x4ce80000, 0x4201d000, 0x0000000a, 0x0201f800, - 0x0010645c, 0x5c01d000, 0x4a03c013, 0x02000200, + 0x00106661, 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, 0x4201d000, 0x0000000a, 0x0201f800, - 0x0010645c, 0x5c01d000, 0x4a03c014, 0x03800000, + 0x00106661, 0x5c01d000, 0x4a03c014, 0x03800000, 0x42000800, 0x000003e8, 0x59e0b813, 0x825cbd00, 0x00000100, 0x80040840, 0x04000004, 0x405c0000, 0x80000540, 0x040207f9, 0x4a03c014, 0x03800380, 0x4a03c013, 0x02000000, 0x4ce80000, 0x4201d000, - 0x0000000a, 0x0201f800, 0x0010645c, 0x5c01d000, + 0x0000000a, 0x0201f800, 0x00106661, 0x5c01d000, 0x485fc857, 0x405c0000, 0x80000540, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4c600000, 0x4803c856, 0x4a03c013, 0x01000100, 0x4200c000, 0x00000008, 0x4200c800, 0x000003e8, 0x4ce80000, 0x4201d000, - 0x0000000a, 0x0201f800, 0x0010645c, 0x5c01d000, + 0x0000000a, 0x0201f800, 0x00106661, 0x5c01d000, 0x4a03c013, 0x02000200, 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, 0x03800380, 0x82000500, 0x00000200, 0x04020003, 0x8064c840, 0x040207f7, 0x4178c800, 0x0401f009, 0x4ce80000, 0x4201d000, - 0x0000000a, 0x0201f800, 0x0010645c, 0x5c01d000, + 0x0000000a, 0x0201f800, 0x00106661, 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, 0x4201d000, - 0x0000000a, 0x0201f800, 0x0010645c, 0x5c01d000, + 0x0000000a, 0x0201f800, 0x00106661, 0x5c01d000, 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, 0x03800380, 0x82000500, 0x00000100, 0x80000110, 0x8064c8c2, 0x8064cd40, 0x4a03c013, 0x02000000, 0x8060c040, 0x040207e5, 0x4867c857, 0x5c00c000, 0x1c01f000, 0x4803c856, 0x4a03c013, 0x01000100, 0x4ce80000, 0x4201d000, 0x0000000a, 0x0201f800, - 0x0010645c, 0x5c01d000, 0x4a03c013, 0x02000200, + 0x00106661, 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, 0x4201d000, 0x0000000a, 0x0201f800, - 0x0010645c, 0x5c01d000, 0x4a03c013, 0x02000000, + 0x00106661, 0x5c01d000, 0x4a03c013, 0x02000000, 0x1c01f000, 0x59a00408, 0x59a8082a, 0x4803502a, 0x48074408, 0x59a00a0a, 0x82040480, 0x00000014, 0x04021003, 0x42000800, 0x000007d0, 0x59a8002b, - 0x4807502b, 0x4803420a, 0x0201f000, 0x00102207, + 0x4807502b, 0x4803420a, 0x0201f000, 0x001022c6, 0x836c0580, 0x00000000, 0x0400000e, 0x59a80005, 0x59a00c07, 0x80041580, 0x82081500, 0x00000040, - 0x02000000, 0x00102207, 0x80080580, 0x48035005, - 0x0201f800, 0x0010041a, 0x0201f000, 0x00102207, + 0x02000000, 0x001022c6, 0x80080580, 0x48035005, + 0x0201f800, 0x0010041a, 0x0201f000, 0x001022c6, 0x59a00407, 0x59a80805, 0x48035005, 0x80040d80, 0x8c040d0c, 0x02020800, 0x0010041a, 0x59a00208, 0x48035006, 0x59a00408, 0x48035007, 0x0201f000, - 0x00102207, 0x59a80078, 0x8c00053e, 0x02000000, - 0x0010223e, 0x59a00c07, 0x8c040d00, 0x04000021, + 0x001022c6, 0x59a80078, 0x8c00053e, 0x02000000, + 0x001022fd, 0x59a00c07, 0x8c040d00, 0x04000021, 0x4a034407, 0x00000001, 0x8c000506, 0x02020000, - 0x0010224a, 0x4a034407, 0x00000009, 0x59aa6879, - 0x0201f800, 0x00104920, 0x02020000, 0x0010224a, + 0x00102309, 0x4a034407, 0x00000009, 0x59aa6879, + 0x0201f800, 0x00104a22, 0x02020000, 0x00102309, 0x4a034407, 0x00000003, 0x0201f800, 0x00020b7b, - 0x02000000, 0x0010224a, 0x48ee602a, 0x4a01d808, - 0x001028f0, 0x4a026407, 0x00000012, 0x4936600a, + 0x02000000, 0x00102309, 0x48ee602a, 0x4a01d808, + 0x001029b4, 0x4a026407, 0x00000012, 0x4936600a, 0x42027000, 0x000000d7, 0x0201f000, 0x00020bc1, - 0x59a00407, 0x800001c0, 0x02020000, 0x0010224a, - 0x0201f800, 0x0010b581, 0x0201f000, 0x00102207, + 0x59a00407, 0x800001c0, 0x02020000, 0x00102309, + 0x0201f800, 0x0010b8ac, 0x0201f000, 0x001022c6, 0x8d0e1d0e, 0x04000005, 0x4a034407, 0x00000001, - 0x0201f000, 0x0010224a, 0x0201f800, 0x00104fc6, + 0x0201f000, 0x00102309, 0x0201f800, 0x001050f7, 0x04020005, 0x4a034407, 0x00000016, 0x0201f000, - 0x0010224a, 0x836c0580, 0x00000003, 0x04000005, - 0x4a034407, 0x00000007, 0x0201f000, 0x0010224a, + 0x00102309, 0x836c0580, 0x00000003, 0x04000005, + 0x4a034407, 0x00000007, 0x0201f000, 0x00102309, 0x59a00c07, 0x82040500, 0xffffff00, 0x02020000, - 0x0010224e, 0x82041580, 0x000000ff, 0x04020007, + 0x0010230d, 0x82041580, 0x000000ff, 0x04020007, 0x59a8000f, 0x82000500, 0x000000ff, 0x82001540, - 0x0000ff00, 0x0401f011, 0x82040400, 0x00102057, + 0x0000ff00, 0x0401f011, 0x82040400, 0x00102116, 0x50000000, 0x80000110, 0x82000580, 0x00000080, - 0x02000000, 0x0010224e, 0x59a8000f, 0x82000500, - 0x000000ff, 0x80041580, 0x02000000, 0x0010224e, - 0x840409c0, 0x80041540, 0x0201f800, 0x00107cfe, + 0x02000000, 0x0010230d, 0x59a8000f, 0x82000500, + 0x000000ff, 0x80041580, 0x02000000, 0x0010230d, + 0x840409c0, 0x80041540, 0x0201f800, 0x00107ef8, 0x04020005, 0x4a034407, 0x00000003, 0x0201f000, - 0x0010224a, 0x48ee602a, 0x480a621d, 0x4a02641d, + 0x00102309, 0x48ee602a, 0x480a621d, 0x4a02641d, 0x0000bc09, 0x4a026407, 0x00000001, 0x0201f800, - 0x00103876, 0x04020007, 0x0201f800, 0x00020b9d, - 0x4a034407, 0x00000002, 0x0201f000, 0x0010224a, + 0x00103966, 0x04020007, 0x0201f800, 0x00020b9d, + 0x4a034407, 0x00000002, 0x0201f000, 0x00102309, 0x497a5a05, 0x497a5806, 0x4a025c05, 0x00008000, - 0x4a01d808, 0x0010299e, 0x492e6009, 0x42027000, + 0x4a01d808, 0x00102a62, 0x492e6009, 0x42027000, 0x00000032, 0x0201f000, 0x00020bc1, 0x8d0e1d0e, 0x04000005, 0x4a034407, 0x00000001, 0x0201f000, - 0x0010224a, 0x0201f800, 0x00104fc6, 0x04020005, - 0x4a034407, 0x00000016, 0x0201f000, 0x0010224a, + 0x00102309, 0x0201f800, 0x001050f7, 0x04020005, + 0x4a034407, 0x00000016, 0x0201f000, 0x00102309, 0x836c0580, 0x00000003, 0x04000005, 0x4a034407, - 0x00000007, 0x0201f000, 0x0010224a, 0x59a00c07, - 0x82040500, 0xffffff00, 0x02020000, 0x0010224e, + 0x00000007, 0x0201f000, 0x00102309, 0x59a00c07, + 0x82040500, 0xffffff00, 0x02020000, 0x0010230d, 0x82041580, 0x000000ff, 0x04020007, 0x59a8000f, 0x82000500, 0x000000ff, 0x82001540, 0x0000ff00, - 0x0401f011, 0x82040400, 0x00102057, 0x50000000, + 0x0401f011, 0x82040400, 0x00102116, 0x50000000, 0x80000110, 0x82000580, 0x00000080, 0x02000000, - 0x0010224e, 0x59a8000f, 0x82000500, 0x000000ff, - 0x80041580, 0x02000000, 0x0010224e, 0x840409c0, - 0x80041540, 0x0201f800, 0x00107cfe, 0x04020005, - 0x4a034407, 0x00000003, 0x0201f000, 0x0010224a, + 0x0010230d, 0x59a8000f, 0x82000500, 0x000000ff, + 0x80041580, 0x02000000, 0x0010230d, 0x840409c0, + 0x80041540, 0x0201f800, 0x00107ef8, 0x04020005, + 0x4a034407, 0x00000003, 0x0201f000, 0x00102309, 0x48ee602a, 0x480a621d, 0x4a02641d, 0x0000bc05, - 0x4a026407, 0x00000001, 0x0201f800, 0x00103876, + 0x4a026407, 0x00000001, 0x0201f800, 0x00103966, 0x04020007, 0x0201f800, 0x00020b9d, 0x4a034407, - 0x00000002, 0x0201f000, 0x0010224a, 0x497a5a05, + 0x00000002, 0x0201f000, 0x00102309, 0x497a5a05, 0x497a5806, 0x4a025c05, 0x00008000, 0x4a01d808, - 0x0010299e, 0x492e6009, 0x42027000, 0x00000032, + 0x00102a62, 0x492e6009, 0x42027000, 0x00000032, 0x0201f000, 0x00020bc1, 0x592c0006, 0x82000580, - 0x01000000, 0x02020000, 0x00102207, 0x4a034407, - 0x00000004, 0x0201f000, 0x0010224a, 0x497b4407, + 0x01000000, 0x02020000, 0x001022c6, 0x4a034407, + 0x00000004, 0x0201f000, 0x00102309, 0x497b4407, 0x497b4208, 0x8d0e1d20, 0x04000008, 0x59a8004d, 0x59a8084e, 0x80040480, 0x59a8084f, 0x48074407, - 0x80041480, 0x480b4208, 0x0201f800, 0x001039c7, + 0x80041480, 0x480b4208, 0x0201f800, 0x00103ab7, 0x48034408, 0x59a8100d, 0x59a80251, 0x80080480, 0x4803420a, 0x495f440a, 0x59a8001a, 0x4803420c, 0x4a03440c, 0x0000007f, 0x59a80078, 0x8c00053e, 0x04000003, 0x4a03440c, 0x0000003f, 0x0201f000, - 0x00102207, 0x8d0e1d0e, 0x04000005, 0x4a034407, - 0x00000001, 0x0201f000, 0x0010224a, 0x59a00407, + 0x001022c6, 0x8d0e1d0e, 0x04000005, 0x4a034407, + 0x00000001, 0x0201f000, 0x00102309, 0x59a00407, 0x8c000500, 0x0402000f, 0x59a80050, 0x81640480, 0x04001008, 0x59a8000b, 0x81500580, 0x04000009, 0x59a8004e, 0x59a8104d, 0x80080580, 0x04000005, - 0x4a034407, 0x00000018, 0x0201f000, 0x0010224a, + 0x4a034407, 0x00000018, 0x0201f000, 0x00102309, 0x850e1d58, 0x4803c856, 0x850e1d46, 0x0201f800, - 0x00103b46, 0x0201f000, 0x00102207, 0x599c0201, + 0x00103c3f, 0x0201f000, 0x001022c6, 0x599c0201, 0x48035062, 0x41780800, 0x42001000, 0x00003b10, - 0x0201f800, 0x00106a98, 0x480b5063, 0x1c01f000, + 0x0201f800, 0x00106c9d, 0x480b5063, 0x1c01f000, 0x0401f807, 0x42018800, 0x00000000, 0x04020003, 0x42018800, 0x00000001, 0x1c01f000, 0x82000540, 0x00000001, 0x0402500d, 0x4203e000, 0x80000000, 0x40e81000, 0x41780800, 0x42000000, 0x00000064, - 0x0201f800, 0x00106a98, 0x5994002e, 0x80080400, + 0x0201f800, 0x00106c9d, 0x5994002e, 0x80080400, 0x4803282e, 0x80000580, 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, 0x417a3000, - 0x0201f800, 0x001072f1, 0x0201f800, 0x00106e75, + 0x0201f800, 0x001074f6, 0x0201f800, 0x0010707a, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, 0x42000800, 0x0000007c, 0x0201f800, - 0x001012d1, 0x4a03902c, 0x00200000, 0x4200b000, + 0x001012d2, 0x4a03902c, 0x00200000, 0x4200b000, 0x000001f4, 0x59c8002c, 0x8c00052c, 0x04000007, 0x8058b040, 0x040207fc, 0x42000000, 0x00004003, 0x41781000, 0x0401f131, 0x4a03506b, 0x00000002, - 0x42006000, 0x00102b66, 0x50301000, 0x41784800, + 0x42006000, 0x00102c2a, 0x50301000, 0x41784800, 0x4a03902d, 0x00008000, 0x4200b000, 0x000001f4, 0x59c8002c, 0x8c000534, 0x04000007, 0x8058b040, 0x040207fc, 0x42000000, 0x00004003, 0x41781000, 0x0401f11e, 0x0401f8a2, 0x80244800, 0x82240580, 0x000003b1, 0x040207fc, 0x0401f927, 0x41784800, 0x0401f8c8, 0x80244800, 0x82240580, 0x000003b1, - 0x040207fc, 0x80306000, 0x82300580, 0x00102b68, + 0x040207fc, 0x80306000, 0x82300580, 0x00102c2c, 0x040207e2, 0x59a8086a, 0x800409c0, 0x04000007, 0x42000000, 0x00004004, 0x42001000, 0x00000002, - 0x59a81869, 0x0401f105, 0x42006000, 0x00102b66, + 0x59a81869, 0x0401f105, 0x42006000, 0x00102c2a, 0x4a03506b, 0x00000010, 0x50301000, 0x41784800, 0x4a03902d, 0x00000800, 0x0401f881, 0x80244800, 0x82240580, 0x00000018, 0x040207fc, 0x0401f906, 0x41784800, 0x0401f8a7, 0x80244800, 0x82240580, 0x00000018, 0x040207fc, 0x80306000, 0x82300580, - 0x00102b68, 0x040207ed, 0x59a8086a, 0x800409c0, + 0x00102c2c, 0x040207ed, 0x59a8086a, 0x800409c0, 0x04000007, 0x42000000, 0x00004004, 0x42001000, 0x00000010, 0x59a81869, 0x0401f0e4, 0x42006000, - 0x00102b66, 0x4a03506b, 0x00000008, 0x50301000, + 0x00102c2a, 0x4a03506b, 0x00000008, 0x50301000, 0x41784800, 0x4a03902d, 0x00000400, 0x0401f860, 0x80244800, 0x82240580, 0x00000088, 0x040207fc, 0x0401f8e5, 0x41784800, 0x0401f886, 0x80244800, 0x82240580, 0x00000088, 0x040207fc, 0x80306000, - 0x82300580, 0x00102b68, 0x040207ed, 0x59a8086a, + 0x82300580, 0x00102c2c, 0x040207ed, 0x59a8086a, 0x800409c0, 0x04000007, 0x42000000, 0x00004004, 0x42001000, 0x00000008, 0x59a81869, 0x0401f0c3, - 0x42006000, 0x00102b66, 0x4a03506b, 0x00000020, + 0x42006000, 0x00102c2a, 0x4a03506b, 0x00000020, 0x50301000, 0x41784800, 0x4a03902d, 0x00002000, 0x4200b000, 0x000001f4, 0x59c8002c, 0x8c000530, 0x04000007, 0x8058b040, 0x040207fc, 0x42000000, @@ -17285,11 +17386,11 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04000006, 0x59a8006a, 0x80000000, 0x4803506a, 0x40240000, 0x48035069, 0x80244800, 0x82240580, 0x00000110, 0x040207f0, 0x80306000, 0x82300580, - 0x00102b68, 0x040207cf, 0x59a8086a, 0x800409c0, + 0x00102c2c, 0x040207cf, 0x59a8086a, 0x800409c0, 0x04000006, 0x42000000, 0x00004004, 0x42001000, 0x00000020, 0x59a81869, 0x59c8002c, 0x8400052a, 0x4803902c, 0x42000800, 0x0000007c, 0x0201f800, - 0x001012d1, 0x0201f000, 0x00102207, 0x59c8002c, + 0x001012d2, 0x0201f000, 0x001022c6, 0x59c8002c, 0x82000500, 0xffff0000, 0x82080d00, 0x0000ffff, 0x80040540, 0x4803902c, 0x480b9028, 0x480b9029, 0x59a8006b, 0x82004580, 0x00000004, 0x04000003, @@ -17323,216 +17424,216 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x48275069, 0x1c01f000, 0x48034207, 0x48074407, 0x480b4208, 0x480f4408, 0x48134209, 0x48174409, 0x59c8002c, 0x8400052a, 0x4803902c, 0x42000800, - 0x0000007c, 0x0201f800, 0x001012d1, 0x0201f000, - 0x0010220a, 0x42000000, 0x00600000, 0x80000040, + 0x0000007c, 0x0201f800, 0x001012d2, 0x0201f000, + 0x001022c9, 0x42000000, 0x00600000, 0x80000040, 0x040207ff, 0x1c01f000, 0x5a5a5a5a, 0xa5a5a5a5, - 0x0201f800, 0x00103876, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x0010224a, 0x42005000, - 0x0010ccd0, 0x50285000, 0x482b4000, 0x4200a000, - 0x0010ccd1, 0x59a00408, 0x59a01208, 0x900811c0, + 0x0201f800, 0x00103966, 0x04020005, 0x4a034407, + 0x00000002, 0x0201f000, 0x00102309, 0x42005000, + 0x0010cfd0, 0x50285000, 0x482b4000, 0x4200a000, + 0x0010cfd1, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, - 0x800c1d40, 0x42024800, 0x0010ccd1, 0x832cac00, + 0x800c1d40, 0x42024800, 0x0010cfd1, 0x832cac00, 0x00000005, 0x4200b000, 0x00000006, 0x82500400, - 0x0000000b, 0x48034001, 0x0201f800, 0x0010bd5b, + 0x0000000b, 0x48034001, 0x0201f800, 0x0010c086, 0x42000800, 0x00000006, 0x800400c4, 0x80080c00, 0x48074002, 0x820c0c40, 0x00000000, 0x48074003, 0x42000800, 0x00000006, 0x832c0400, 0x00000005, - 0x0201f800, 0x001038a3, 0x4a01d808, 0x00102b99, + 0x0201f800, 0x00103993, 0x4a01d808, 0x00102c5d, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x00102242, + 0x82000580, 0x00000200, 0x02000000, 0x00102301, 0x59a0a001, 0x59a01000, 0x80081040, 0x480b4000, 0x04000005, 0x59a01002, 0x59a01803, 0x58ee580c, - 0x0401f7d7, 0x42000800, 0x0010ccd0, 0x50040800, - 0x48074407, 0x0201f000, 0x00102207, 0x0201f800, - 0x00103876, 0x04020005, 0x4a034407, 0x00000002, - 0x0201f000, 0x0010224a, 0x59a00c0b, 0x42000000, - 0x0010ccd0, 0x50000000, 0x80040480, 0x02021000, - 0x0010224e, 0x8204a400, 0x0010bdc7, 0x5050a000, + 0x0401f7d7, 0x42000800, 0x0010cfd0, 0x50040800, + 0x48074407, 0x0201f000, 0x001022c6, 0x0201f800, + 0x00103966, 0x04020005, 0x4a034407, 0x00000002, + 0x0201f000, 0x00102309, 0x59a00c0b, 0x42000000, + 0x0010cfd0, 0x50000000, 0x80040480, 0x02021000, + 0x0010230d, 0x8204a400, 0x0010c10d, 0x5050a000, 0x832cac00, 0x00000005, 0x4200b000, 0x00000006, - 0x0201f800, 0x0010bd5b, 0x59a00408, 0x59a01208, + 0x0201f800, 0x0010c086, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x42000800, 0x00000006, - 0x832c0400, 0x00000005, 0x0201f000, 0x001038a3, - 0x59a00c0b, 0x800409c0, 0x02000000, 0x0010224e, - 0x82040480, 0x00000021, 0x02021000, 0x0010224e, + 0x832c0400, 0x00000005, 0x0201f000, 0x00103993, + 0x59a00c0b, 0x800409c0, 0x02000000, 0x0010230d, + 0x82040480, 0x00000021, 0x02021000, 0x0010230d, 0x82040480, 0x00000011, 0x04001003, 0x42000800, 0x00000010, 0x59a00209, 0x59a01408, 0x900811c0, 0x80081540, 0x59a00208, 0x59a01c07, 0x900c19c0, - 0x800c1d40, 0x0201f800, 0x00103876, 0x04000006, - 0x0201f800, 0x0010389a, 0x4a01d808, 0x00102bf5, + 0x800c1d40, 0x0201f800, 0x00103966, 0x04000006, + 0x0201f800, 0x0010398a, 0x4a01d808, 0x00102cb9, 0x1c01f000, 0x4a034407, 0x00000002, 0x0201f000, - 0x0010224a, 0x4031d800, 0x58ef400a, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x00102242, + 0x00102309, 0x4031d800, 0x58ef400a, 0x58ec0002, + 0x82000580, 0x00000200, 0x02000000, 0x00102301, 0x59a00c0b, 0x82040480, 0x00000011, 0x04001003, 0x42000800, 0x00000010, 0x59a0040c, 0x59a0120c, 0x900811c0, 0x80081540, 0x59a0020a, 0x59a01c09, 0x900c19c0, 0x800c1d40, 0x58ec0003, 0x0201f800, - 0x001038a3, 0x4a01d808, 0x00102c10, 0x1c01f000, + 0x00103993, 0x4a01d808, 0x00102cd4, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x00102242, 0x59a00c0b, - 0x82040480, 0x00000011, 0x02001000, 0x00102207, + 0x00000200, 0x02000000, 0x00102301, 0x59a00c0b, + 0x82040480, 0x00000011, 0x02001000, 0x001022c6, 0x82040c80, 0x00000010, 0x59a00209, 0x59a01408, 0x900811c0, 0x80081540, 0x59a00208, 0x59a01c07, 0x900c19c0, 0x800c1d40, 0x82081400, 0x00000040, - 0x58ec0003, 0x0201f800, 0x0010389a, 0x4a01d808, - 0x00102c2e, 0x1c01f000, 0x4031d800, 0x58ef400a, + 0x58ec0003, 0x0201f800, 0x0010398a, 0x4a01d808, + 0x00102cf2, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x00102242, 0x59a0040b, 0x82000c80, 0x00000010, + 0x00102301, 0x59a0040b, 0x82000c80, 0x00000010, 0x59a0040c, 0x59a0120c, 0x900811c0, 0x80081540, 0x59a0020a, 0x59a01c09, 0x900c19c0, 0x800c1d40, 0x82081400, 0x00000040, 0x58ec0003, 0x0201f800, - 0x001038a3, 0x4a01d808, 0x00102200, 0x1c01f000, + 0x00103993, 0x4a01d808, 0x001022bf, 0x1c01f000, 0x48efc857, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x59a00407, 0x48034000, 0x480b4001, - 0x480f4002, 0x0201f800, 0x00103876, 0x04020005, - 0x4a034407, 0x00000002, 0x0201f000, 0x0010224a, - 0x42000800, 0x00000010, 0x0201f800, 0x0010389a, - 0x4a01d808, 0x00102c63, 0x1c01f000, 0x4031d800, + 0x480f4002, 0x0201f800, 0x00103966, 0x04020005, + 0x4a034407, 0x00000002, 0x0201f000, 0x00102309, + 0x42000800, 0x00000010, 0x0201f800, 0x0010398a, + 0x4a01d808, 0x00102d27, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x00102242, 0x48efc857, + 0x00000200, 0x02000000, 0x00102301, 0x48efc857, 0x49a3c857, 0x492fc857, 0x592c0a05, 0x80040910, 0x04020005, 0x4a034407, 0x00000019, 0x0201f000, - 0x0010224a, 0x4805d80b, 0x0401f00a, 0x4031d800, + 0x00102309, 0x4805d80b, 0x0401f00a, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x00102242, 0x48efc857, 0x49a3c857, + 0x02000000, 0x00102301, 0x48efc857, 0x49a3c857, 0x48efc857, 0x49a3c857, 0x58ec000b, 0x80000040, - 0x04000012, 0x4801d80b, 0x0201f800, 0x00103876, + 0x04000012, 0x4801d80b, 0x0201f800, 0x00103966, 0x04020005, 0x4a034407, 0x00000002, 0x0201f000, - 0x0010224a, 0x42000800, 0x00000010, 0x58ec1006, - 0x58ec1807, 0x0201f800, 0x0010389a, 0x4a01d808, - 0x00102c77, 0x1c01f000, 0x58ee580c, 0x48efc857, + 0x00102309, 0x42000800, 0x00000010, 0x58ec1006, + 0x58ec1807, 0x0201f800, 0x0010398a, 0x4a01d808, + 0x00102d3b, 0x1c01f000, 0x58ee580c, 0x48efc857, 0x49a3c857, 0x492fc857, 0x492f3004, 0x592c0405, - 0x8400055e, 0x48025c05, 0x4a01d808, 0x00102ca1, + 0x8400055e, 0x48025c05, 0x4a01d808, 0x00102d65, 0x1c01f000, 0x4d2c0000, 0x58ee580c, 0x48efc857, 0x49a3c857, 0x492fc857, 0x592c0405, 0x8400051e, 0x48025c05, 0x59a00000, 0x59a01001, 0x59a01802, 0x80081400, 0x820c1c40, 0x00000000, 0x832c0400, 0x00000005, 0x42000800, 0x00000010, 0x5c025800, - 0x0201f000, 0x001038a3, 0x8d0e1d0e, 0x04000005, - 0x4a034407, 0x00000001, 0x0201f000, 0x0010224a, + 0x0201f000, 0x00103993, 0x8d0e1d0e, 0x04000005, + 0x4a034407, 0x00000001, 0x0201f000, 0x00102309, 0x836c0580, 0x00000003, 0x04000005, 0x4a034407, - 0x00000007, 0x0201f000, 0x0010224a, 0x59a0320c, + 0x00000007, 0x0201f000, 0x00102309, 0x59a0320c, 0x82183500, 0x000000ff, 0x59a28c07, 0x0201f800, - 0x00103980, 0x02020000, 0x0010224e, 0x0201f800, - 0x0010497a, 0x02020000, 0x0010224e, 0x83440580, - 0x000007fd, 0x04000008, 0x0201f800, 0x0010491a, + 0x00103a70, 0x02020000, 0x0010230d, 0x0201f800, + 0x00104a7c, 0x02020000, 0x0010230d, 0x83440580, + 0x000007fd, 0x04000008, 0x0201f800, 0x00104a1c, 0x04000005, 0x4a034407, 0x00000009, 0x0201f000, - 0x0010224a, 0x0201f800, 0x00103876, 0x04020005, - 0x4a034407, 0x00000002, 0x0201f000, 0x0010224a, + 0x00102309, 0x0201f800, 0x00103966, 0x04020005, + 0x4a034407, 0x00000002, 0x0201f000, 0x00102309, 0x801831c0, 0x0400000a, 0x412c0800, 0x0201f800, - 0x00103876, 0x04020005, 0x4a034407, 0x00000002, - 0x0201f000, 0x0010224a, 0x40065800, 0x4a025c05, - 0x00008000, 0x497a5a05, 0x0201f800, 0x0010974c, + 0x00103966, 0x04020005, 0x4a034407, 0x00000002, + 0x0201f000, 0x00102309, 0x40065800, 0x4a025c05, + 0x00008000, 0x497a5a05, 0x0201f800, 0x00109984, 0x04020005, 0x4a034407, 0x00000003, 0x0201f000, - 0x0010224a, 0x4a01d808, 0x00102cf8, 0x1c01f000, + 0x00102309, 0x4a01d808, 0x00102dbc, 0x1c01f000, 0x592c0006, 0x82000580, 0x01000000, 0x04020005, - 0x4a034407, 0x00000004, 0x0201f000, 0x0010224a, + 0x4a034407, 0x00000004, 0x0201f000, 0x00102309, 0x592c0407, 0x82002d00, 0x0000ff00, 0x82000500, 0x000000ff, 0x80000904, 0x80040800, 0x82040480, 0x00000006, 0x04001003, 0x42000800, 0x00000005, 0x4c500000, 0x4c540000, 0x4c580000, 0x832ca400, 0x00000007, 0x4050a800, 0x4004b000, 0x0201f800, - 0x0010bd85, 0x59a00408, 0x59a01208, 0x900811c0, + 0x0010c0b0, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x832c0400, 0x00000007, 0x4c140000, - 0x0201f800, 0x001038a3, 0x5c002800, 0x801429c0, - 0x04000003, 0x4a01d808, 0x00102d2b, 0x5c00b000, + 0x0201f800, 0x00103993, 0x5c002800, 0x801429c0, + 0x04000003, 0x4a01d808, 0x00102def, 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x00102242, 0x812e59c0, + 0x00000200, 0x02000000, 0x00102301, 0x812e59c0, 0x02000800, 0x0010032e, 0x592c0007, 0x82000500, 0xff000000, 0x80000904, 0x800409c0, 0x02000000, - 0x00102207, 0x4807c857, 0x82040480, 0x0000000e, + 0x001022c6, 0x4807c857, 0x82040480, 0x0000000e, 0x04001003, 0x42000800, 0x0000000d, 0x592e5801, 0x812e59c0, 0x02000800, 0x0010032e, 0x4c500000, 0x4c540000, 0x4c580000, 0x832ca400, 0x00000006, - 0x4050a800, 0x4004b000, 0x0201f800, 0x0010bd85, + 0x4050a800, 0x4004b000, 0x0201f800, 0x0010c0b0, 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x58ec1006, 0x58ec1807, 0x832c0400, 0x00000006, 0x0201f000, - 0x001038a3, 0x0201f800, 0x00103876, 0x04020005, - 0x4a034407, 0x00000002, 0x0201f000, 0x0010224a, + 0x00103993, 0x0201f800, 0x00103966, 0x04020005, + 0x4a034407, 0x00000002, 0x0201f000, 0x00102309, 0x59a00c07, 0x82040500, 0x0000ff00, 0x840001c0, - 0x82001480, 0x00000007, 0x02021000, 0x0010224e, - 0x0c01f001, 0x00102d70, 0x00102d77, 0x00102d7e, - 0x00102d7e, 0x00102d7e, 0x00102d80, 0x00102d85, - 0x42000800, 0x0000000d, 0x42003800, 0x00102d99, - 0x4a034000, 0x0010c846, 0x0401f013, 0x42000800, - 0x0000000d, 0x42003800, 0x00102d99, 0x4a034000, - 0x0010c853, 0x0401f00c, 0x0201f000, 0x0010224e, - 0x42000800, 0x00000008, 0x42003800, 0x00102dac, + 0x82001480, 0x00000007, 0x02021000, 0x0010230d, + 0x0c01f001, 0x00102e34, 0x00102e3b, 0x00102e42, + 0x00102e42, 0x00102e42, 0x00102e44, 0x00102e49, + 0x42000800, 0x0000000d, 0x42003800, 0x00102e5d, + 0x4a034000, 0x0010cb46, 0x0401f013, 0x42000800, + 0x0000000d, 0x42003800, 0x00102e5d, 0x4a034000, + 0x0010cb53, 0x0401f00c, 0x0201f000, 0x0010230d, + 0x42000800, 0x00000008, 0x42003800, 0x00102e70, 0x0401f005, 0x42000800, 0x00000004, 0x42003800, - 0x00102df6, 0x59a00208, 0x59a01408, 0x900001c0, + 0x00102eba, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x832c0400, 0x00000006, 0x4c1c0000, - 0x0201f800, 0x0010389a, 0x5c003800, 0x481dd808, + 0x0201f800, 0x0010398a, 0x5c003800, 0x481dd808, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x00102242, 0x4a035019, 0x00000001, 0x4200b000, + 0x00102301, 0x4a035019, 0x00000001, 0x4200b000, 0x0000000d, 0x59a0a800, 0x832ca400, 0x00000006, - 0x0201f800, 0x0010bd85, 0x0201f000, 0x00102207, + 0x0201f800, 0x0010c0b0, 0x0201f000, 0x001022c6, 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x00102242, + 0x82000580, 0x00000200, 0x02000000, 0x00102301, 0x832ca400, 0x00000006, 0x50500000, 0x82001500, - 0x000c0016, 0x02020000, 0x0010224e, 0x82500c00, + 0x000c0016, 0x02020000, 0x0010230d, 0x82500c00, 0x00000003, 0x50040000, 0x82001500, 0x00000001, - 0x02020000, 0x0010224e, 0x50500000, 0x82001500, + 0x02020000, 0x0010230d, 0x50500000, 0x82001500, 0x00000028, 0x0400001d, 0x82081580, 0x00000028, - 0x02020000, 0x0010224e, 0x80500800, 0x50040000, + 0x02020000, 0x0010230d, 0x80500800, 0x50040000, 0x82001500, 0x00000013, 0x82081580, 0x00000013, - 0x02020000, 0x0010224e, 0x80040800, 0x50040000, + 0x02020000, 0x0010230d, 0x80040800, 0x50040000, 0x82001500, 0x00050000, 0x82081580, 0x00050000, - 0x02020000, 0x0010224e, 0x836c0580, 0x00000000, + 0x02020000, 0x0010230d, 0x836c0580, 0x00000000, 0x04000012, 0x599c0019, 0x8c00050e, 0x0402000f, - 0x0201f000, 0x0010224e, 0x80500800, 0x50040000, - 0x82001500, 0x00000013, 0x02020000, 0x0010224e, + 0x0201f000, 0x0010230d, 0x80500800, 0x50040000, + 0x82001500, 0x00000013, 0x02020000, 0x0010230d, 0x80040800, 0x50040000, 0x82001500, 0x00050000, - 0x02020000, 0x0010224e, 0x4200b000, 0x00000008, - 0x4200a800, 0x0010c83e, 0x0201f800, 0x0010bd5b, - 0x0201f000, 0x00102207, 0x4031d800, 0x58ef400a, + 0x02020000, 0x0010230d, 0x4200b000, 0x00000008, + 0x4200a800, 0x0010cb3e, 0x0201f800, 0x0010c086, + 0x0201f000, 0x001022c6, 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x00102242, 0x4200b000, 0x00000004, - 0x4200a800, 0x0010cccb, 0x832ca400, 0x00000006, - 0x0201f800, 0x0010bd5b, 0x850e1d50, 0x0201f000, - 0x00102207, 0x0201f800, 0x00103876, 0x04020005, - 0x4a034407, 0x00000002, 0x0201f000, 0x0010224a, + 0x02000000, 0x00102301, 0x4200b000, 0x00000004, + 0x4200a800, 0x0010cfcb, 0x832ca400, 0x00000006, + 0x0201f800, 0x0010c086, 0x850e1d50, 0x0201f000, + 0x001022c6, 0x0201f800, 0x00103966, 0x04020005, + 0x4a034407, 0x00000002, 0x0201f000, 0x00102309, 0x832cac00, 0x00000006, 0x59a00c07, 0x82040500, 0x0000ff00, 0x840001c0, 0x82001480, 0x00000008, - 0x02021000, 0x0010224e, 0x0c01f001, 0x00102e23, - 0x00102e26, 0x00102e29, 0x00102e29, 0x00102e29, - 0x00102e2b, 0x00102e29, 0x00102e33, 0x4200a000, - 0x0010c846, 0x0401f055, 0x4200a000, 0x0010c853, - 0x0401f052, 0x0201f000, 0x0010224e, 0x4200b000, - 0x00000008, 0x40580800, 0x4200a000, 0x0010c83e, - 0x0201f800, 0x0010bd5b, 0x0401f04d, 0x59a00a0b, + 0x02021000, 0x0010230d, 0x0c01f001, 0x00102ee7, + 0x00102eea, 0x00102eed, 0x00102eed, 0x00102eed, + 0x00102eef, 0x00102eed, 0x00102ef7, 0x4200a000, + 0x0010cb46, 0x0401f055, 0x4200a000, 0x0010cb53, + 0x0401f052, 0x0201f000, 0x0010230d, 0x4200b000, + 0x00000008, 0x40580800, 0x4200a000, 0x0010cb3e, + 0x0201f800, 0x0010c086, 0x0401f04d, 0x59a00a0b, 0x4a03420b, 0x0000001c, 0x82040480, 0x0000001c, - 0x02001000, 0x0010224e, 0x4200b000, 0x0000000f, - 0x4178a000, 0x0201f800, 0x0010bd64, 0x832cac00, + 0x02001000, 0x0010230d, 0x4200b000, 0x0000000f, + 0x4178a000, 0x0201f800, 0x0010c08f, 0x832cac00, 0x00000006, 0x4200b000, 0x00000004, 0x83a8a400, - 0x0000001f, 0x0201f800, 0x0010bd5b, 0x836c0580, + 0x0000001f, 0x0201f800, 0x0010c086, 0x836c0580, 0x00000000, 0x04000007, 0x4200b000, 0x00000004, - 0x83a8a400, 0x00000000, 0x0201f800, 0x0010bd5b, - 0x492f4000, 0x0201f800, 0x00103876, 0x04020005, - 0x4a034407, 0x00000002, 0x0201f000, 0x0010224a, + 0x83a8a400, 0x00000000, 0x0201f800, 0x0010c086, + 0x492f4000, 0x0201f800, 0x00103966, 0x04020005, + 0x4a034407, 0x00000002, 0x0201f000, 0x00102309, 0x832cac00, 0x00000006, 0x4200b000, 0x0000000f, - 0x4178a000, 0x0201f800, 0x0010bd64, 0x832cac00, + 0x4178a000, 0x0201f800, 0x0010c08f, 0x832cac00, 0x00000007, 0x4200b000, 0x00000004, 0x83a8a400, - 0x00000023, 0x0201f800, 0x0010bd5b, 0x492f4001, + 0x00000023, 0x0201f800, 0x0010c086, 0x492f4001, 0x59a25800, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x832c0400, 0x00000006, 0x42000800, - 0x0000000f, 0x0201f800, 0x001038a3, 0x4a01d808, - 0x00102e8b, 0x1c01f000, 0x4200b000, 0x0000000d, - 0x40580800, 0x0201f800, 0x0010bd85, 0x59a00208, + 0x0000000f, 0x0201f800, 0x00103993, 0x4a01d808, + 0x00102f4f, 0x1c01f000, 0x4200b000, 0x0000000d, + 0x40580800, 0x0201f800, 0x0010c0b0, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x832c0400, - 0x00000006, 0x0201f000, 0x001038a3, 0x4031d800, + 0x00000006, 0x0201f000, 0x00103993, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x00102242, 0x59a25801, 0x58ec1006, + 0x02000000, 0x00102301, 0x59a25801, 0x58ec1006, 0x58ec1807, 0x832c0400, 0x00000006, 0x42000800, - 0x0000000d, 0x0201f000, 0x001038a3, 0x836c0580, + 0x0000000d, 0x0201f000, 0x00103993, 0x836c0580, 0x00000000, 0x04020005, 0x4a034407, 0x00000007, - 0x0201f000, 0x0010224a, 0x59a01407, 0x800811c0, + 0x0201f000, 0x00102309, 0x59a01407, 0x800811c0, 0x04020017, 0x59c40801, 0x82040d00, 0x00018000, 0x82040580, 0x00000000, 0x04020004, 0x4a034407, 0x00000000, 0x0401f056, 0x82040580, 0x00008000, @@ -17541,66 +17642,67 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4a034407, 0x00000003, 0x0401f049, 0x59a80078, 0x8c00053e, 0x0400000d, 0x59a00a08, 0x82040580, 0x00000003, 0x04000005, 0x82040580, 0x00000002, - 0x02020000, 0x0010224e, 0x42000000, 0x00000003, + 0x02020000, 0x0010230d, 0x42000000, 0x00000003, 0x40000800, 0x0401f00b, 0x59a80070, 0x8c000508, 0x04000005, 0x42000000, 0x00000001, 0x40000800, 0x0401f004, 0x59a00208, 0x48034002, 0x59a80837, 0x48035037, 0x599c7819, 0x823c7d00, 0xffff1fff, 0x800000da, 0x803c7d40, 0x483f3819, 0x0201f800, - 0x00101625, 0x0400000d, 0x0201f800, 0x00101633, - 0x0400000a, 0x0201f800, 0x00101641, 0x04000007, - 0x0201f800, 0x0010164f, 0x04000004, 0x48075037, - 0x0201f000, 0x0010224e, 0x82080580, 0x00000002, + 0x0010162a, 0x0400000d, 0x0201f800, 0x00101638, + 0x0400000a, 0x0201f800, 0x00101646, 0x04000007, + 0x0201f800, 0x00101654, 0x04000004, 0x48075037, + 0x0201f000, 0x0010230d, 0x82080580, 0x00000002, 0x04020017, 0x59c40006, 0x84000500, 0x48038806, - 0x0201f800, 0x00106faf, 0x497b8880, 0x42000000, - 0x0010cc8b, 0x0201f800, 0x0010bc88, 0x4803c856, + 0x0201f800, 0x001071b4, 0x497b8880, 0x42000000, + 0x0010cf8b, 0x0201f800, 0x0010bfb3, 0x4803c856, 0x850e1d48, 0x4a038808, 0x00000000, 0x4202d800, 0x00000004, 0x4a038805, 0x00000001, 0x4a035043, 0x00000001, 0x0201f800, 0x00100455, 0x0201f000, - 0x00102207, 0x8d0e1d0e, 0x04000005, 0x4a034407, - 0x00000001, 0x0201f000, 0x0010224a, 0x836c0580, + 0x001022c6, 0x8d0e1d0e, 0x04000005, 0x4a034407, + 0x00000001, 0x0201f000, 0x00102309, 0x836c0580, 0x00000003, 0x04000005, 0x4a034407, 0x00000007, - 0x0201f000, 0x0010224a, 0x59a28c07, 0x59a0320c, - 0x82183500, 0x000000ff, 0x0201f800, 0x00103980, - 0x02020000, 0x0010224e, 0x0201f800, 0x0010497a, - 0x02020000, 0x0010224e, 0x83440580, 0x000007fd, - 0x04000008, 0x0201f800, 0x0010491a, 0x04000005, - 0x42000800, 0x00000009, 0x0201f000, 0x0010224a, - 0x0201f800, 0x00103876, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x0010224a, 0x497a5a05, - 0x4a025c05, 0x00008000, 0x0201f800, 0x00109764, + 0x0201f000, 0x00102309, 0x59a28c07, 0x59a0320c, + 0x82183500, 0x000000ff, 0x0201f800, 0x00103a70, + 0x02020000, 0x0010230d, 0x0201f800, 0x00104a7c, + 0x02020000, 0x0010230d, 0x83440580, 0x000007fd, + 0x04000008, 0x0201f800, 0x00104a1c, 0x04000005, + 0x42000800, 0x00000009, 0x0201f000, 0x00102309, + 0x0201f800, 0x00103966, 0x04020005, 0x4a034407, + 0x00000002, 0x0201f000, 0x00102309, 0x497a5a05, + 0x4a025c05, 0x00008000, 0x0201f800, 0x0010999c, 0x04020005, 0x4a034407, 0x00000003, 0x0201f000, - 0x0010224a, 0x4a01d808, 0x00102f3c, 0x1c01f000, + 0x00102309, 0x4a01d808, 0x00103000, 0x1c01f000, 0x592c0006, 0x82000d00, 0x0000ffff, 0x82000500, 0xffff0000, 0x82000580, 0x01000000, 0x04020005, - 0x4a034407, 0x00000004, 0x0201f000, 0x0010224a, + 0x4a034407, 0x00000004, 0x0201f000, 0x00102309, 0x80040904, 0x4c500000, 0x4c540000, 0x4c580000, 0x832ca400, 0x00000006, 0x4050a800, 0x4004b000, - 0x0201f800, 0x0010bd85, 0x5c00b000, 0x5c00a800, + 0x0201f800, 0x0010c0b0, 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x832c0400, 0x00000006, 0x0201f000, - 0x001038a3, 0x496fc857, 0x836c0580, 0x00000000, + 0x00103993, 0x496fc857, 0x836c0580, 0x00000000, 0x04000005, 0x4a034407, 0x0000001a, 0x0201f000, - 0x0010224a, 0x0201f800, 0x00104fc6, 0x02020800, - 0x00104032, 0x42000800, 0x00000020, 0x59a00408, + 0x00102309, 0x0201f800, 0x001050f7, 0x02020800, + 0x0010412b, 0x42000800, 0x00000020, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x419c0000, - 0x49a3c857, 0x0201f800, 0x0010389a, 0x4a01d808, - 0x00102f7e, 0x1c01f000, 0x4833c857, 0x59a80078, - 0x8c00053e, 0x02020800, 0x0010b52c, 0x4031d800, + 0x49a3c857, 0x0201f800, 0x0010398a, 0x4a01d808, + 0x00103042, 0x1c01f000, 0x4833c857, 0x59a80078, + 0x8c00053e, 0x02020800, 0x0010b857, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x00102242, 0x599c0200, 0x800001c0, - 0x02000000, 0x0010224e, 0x59a80070, 0x8c000504, + 0x02000000, 0x00102301, 0x599c0200, 0x800001c0, + 0x02000000, 0x0010230d, 0x59a80070, 0x8c000504, 0x04020003, 0x8c000506, 0x04000004, 0x599c0019, - 0x8400050c, 0x48033819, 0x0201f800, 0x00109f63, + 0x8400050c, 0x48033819, 0x0201f800, 0x0010a1a1, 0x59a80070, 0x8c000502, 0x04000004, 0x599c0017, 0x84000508, 0x48033817, 0x850e1d20, 0x599c0017, - 0x8c000508, 0x04000003, 0x850e1d60, 0x0401f004, - 0x8c00050a, 0x02020000, 0x0010224e, 0x42024800, - 0x0010ccd1, 0x4a024a00, 0x00000004, 0x42000800, - 0x0010ccd0, 0x46000800, 0x00000001, 0x42000800, - 0x0010cccf, 0x46000800, 0x0000ffff, 0x59240c00, + 0x8c000508, 0x04000003, 0x850e1d60, 0x0401f008, + 0x8c00050a, 0x02020000, 0x0010230d, 0x59a80806, + 0x8c040d16, 0x02020000, 0x0010230d, 0x42024800, + 0x0010cfd1, 0x4a024a00, 0x00000004, 0x42000800, + 0x0010cfd0, 0x46000800, 0x00000001, 0x42000800, + 0x0010cfcf, 0x46000800, 0x0000ffff, 0x59240c00, 0x84040d46, 0x599c1017, 0x8c08150a, 0x04020002, 0x84040d48, 0x8c081508, 0x04020002, 0x84040d4a, 0x84040d4c, 0x48064c00, 0x59240a00, 0x84040d40, @@ -17612,151 +17714,161 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x840411c0, 0x80081540, 0x480a4c00, 0x5c000000, 0x0401f008, 0x4c000000, 0x59240400, 0x84000540, 0x840411c0, 0x80081540, 0x480a4c00, 0x5c000000, - 0x82041480, 0x0000007f, 0x02021000, 0x0010224e, - 0x82041400, 0x00102057, 0x50081000, 0x82081500, + 0x82041480, 0x0000007f, 0x02021000, 0x0010230d, + 0x82041400, 0x00102116, 0x50081000, 0x82081500, 0x000000ff, 0x48064a08, 0x480a4805, 0x480a4c08, 0x8c000500, 0x04020006, 0x480b500f, 0x42000800, - 0x00000003, 0x0201f800, 0x00106c63, 0x0201f800, - 0x00103942, 0x04000004, 0x59240400, 0x84000544, + 0x00000003, 0x0201f800, 0x00106e68, 0x0201f800, + 0x00103a32, 0x04000004, 0x59240400, 0x84000544, 0x48024c00, 0x599c0019, 0x42000800, 0x00001000, 0x50040800, 0x82040c80, 0x24320001, 0x04001003, 0x84000546, 0x48033819, 0x8c000506, 0x0400000f, 0x4a03b805, 0x90000000, 0x59a81007, 0x8c081516, 0x0402000a, 0x42000800, 0x00007600, 0x4a000805, - 0xd0000000, 0x42000800, 0x0010c89b, 0x58041401, - 0x84081542, 0x48080c01, 0x8c00050e, 0x0402000b, - 0x59a80805, 0x8c040d14, 0x04000008, 0x42000800, - 0x0010c83e, 0x50040800, 0x82040d00, 0x00000028, - 0x02020000, 0x0010224e, 0x82000500, 0x00000030, + 0xd0000000, 0x42000800, 0x0010cb9b, 0x58041401, + 0x84081542, 0x48080c01, 0x8c00050e, 0x04020007, + 0x4c000000, 0x0201f800, 0x00103adb, 0x5c000000, + 0x02020000, 0x0010230d, 0x82000500, 0x00000030, 0x04000003, 0x80000108, 0x0401f003, 0x42000000, 0x00000002, 0x48039040, 0x42000800, 0x00000002, - 0x82000400, 0x001031ca, 0x50001000, 0x0201f800, - 0x00106c63, 0x599c0201, 0x82000c80, 0x00000100, - 0x02001000, 0x0010224e, 0x82000c80, 0x00000841, - 0x02021000, 0x0010224e, 0x82000500, 0x00000007, - 0x02020000, 0x0010224e, 0x599c0401, 0x80000540, - 0x02000000, 0x0010224e, 0x599c0409, 0x599c0c07, - 0x80040c80, 0x02021000, 0x0010224e, 0x80000040, - 0x02000000, 0x0010224e, 0x599c0209, 0x599c0a07, - 0x80040c80, 0x02021000, 0x0010224e, 0x80000040, - 0x02000000, 0x0010224e, 0x0201f800, 0x0010546b, - 0x0201f800, 0x00104cb1, 0x599c0201, 0x48035004, - 0x0201f800, 0x00101278, 0x599c020a, 0x800001c0, + 0x82000400, 0x001032ba, 0x50001000, 0x0201f800, + 0x00106e68, 0x599c0201, 0x82000c80, 0x00000100, + 0x02001000, 0x0010230d, 0x82000c80, 0x00000841, + 0x02021000, 0x0010230d, 0x82000500, 0x00000007, + 0x02020000, 0x0010230d, 0x599c0401, 0x80000540, + 0x02000000, 0x0010230d, 0x599c0409, 0x599c0c07, + 0x80040c80, 0x02021000, 0x0010230d, 0x80000040, + 0x02000000, 0x0010230d, 0x599c0209, 0x599c0a07, + 0x80040c80, 0x02021000, 0x0010230d, 0x80000040, + 0x02000000, 0x0010230d, 0x0201f800, 0x0010559c, + 0x0201f800, 0x00104dd6, 0x599c0201, 0x48035004, + 0x0201f800, 0x00101279, 0x599c020a, 0x800001c0, 0x04000003, 0x48035031, 0x0401f003, 0x4a035031, 0x000000c8, 0x8d0e1d20, 0x04000004, 0x0201f800, - 0x001064a2, 0x417a5000, 0x599c0003, 0x599c0804, + 0x001066a7, 0x417a5000, 0x599c0003, 0x599c0804, 0x9c0001c0, 0x9c0409c0, 0x48024801, 0x48064802, 0x48035002, 0x48075003, 0x599c1017, 0x8c08151c, 0x04000006, 0x599c0005, 0x599c0806, 0x9c0001c0, 0x9c0409c0, 0x0401f003, 0x82000500, 0xf0ffffff, 0x48024803, 0x48064804, 0x48035000, 0x48075001, - 0x42001000, 0x0010c846, 0x48001000, 0x48041001, - 0x42001000, 0x0010c853, 0x48001000, 0x48041001, - 0x59a00207, 0x82000580, 0x00000048, 0x040200b2, - 0x0201f800, 0x00103876, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x0010224a, 0x42000800, + 0x42001000, 0x0010cb46, 0x48001000, 0x48041001, + 0x42001000, 0x0010cb53, 0x48001000, 0x48041001, + 0x59a00207, 0x82000580, 0x00000048, 0x040200de, + 0x0201f800, 0x00103966, 0x04020005, 0x4a034407, + 0x00000002, 0x0201f000, 0x00102309, 0x42000800, 0x00000010, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x82081400, 0x00000080, 0x82083400, 0x00000040, 0x481b4002, 0x820c3440, 0x00000000, 0x481b4003, 0x832c0400, 0x00000005, 0x0201f800, - 0x0010389a, 0x4a01d808, 0x001030a4, 0x1c01f000, + 0x0010398a, 0x4a01d808, 0x00103168, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x00102242, + 0x82000580, 0x00000200, 0x02000000, 0x00102301, 0x592c1005, 0x480bc857, 0x80080120, 0x42024800, - 0x0010ccd1, 0x48024c06, 0x82081500, 0x0000ffff, + 0x0010cfd1, 0x48024c06, 0x82081500, 0x0000ffff, 0x599c0818, 0x82040d00, 0x00000030, 0x82040580, 0x00000000, 0x04020006, 0x82080480, 0x0000007e, - 0x02021000, 0x0010224e, 0x0401f00b, 0x59a80078, + 0x02021000, 0x0010230d, 0x0401f007, 0x59a80078, 0x8c00053e, 0x04000004, 0x82080480, 0x00000040, - 0x0401f003, 0x82080480, 0x00000080, 0x02021000, - 0x0010224e, 0x80080800, 0x42000000, 0x0010ccd0, - 0x44040000, 0x800811c0, 0x04000067, 0x42024800, - 0x0010ccdc, 0x80040840, 0x832e5c00, 0x00000006, - 0x42004000, 0x00000003, 0x592c0400, 0x8c000506, - 0x04000012, 0x8c00050a, 0x04020004, 0x8d0e1d20, - 0x02000000, 0x0010224e, 0x4a024a00, 0x00000005, - 0x82001500, 0x00000003, 0x04000006, 0x840011c0, - 0x82081500, 0x000000ff, 0x480a4a08, 0x0401f003, - 0x82000500, 0x000000ff, 0x48024c00, 0x592c0001, - 0x592c1002, 0x9c0001c0, 0x9c0811c0, 0x48024801, - 0x480a4802, 0x599c1817, 0x8c0c1d1c, 0x04000006, - 0x592c0003, 0x592c1004, 0x9c0001c0, 0x9c0811c0, - 0x0401f003, 0x82000500, 0xf0ffffff, 0x48024803, - 0x480a4804, 0x832e5c00, 0x00000005, 0x83264c00, - 0x0000000b, 0x80040840, 0x04000024, 0x80204040, - 0x040207d2, 0x48074000, 0x49274001, 0x42000800, - 0x0000000f, 0x59a01002, 0x59a01803, 0x82083400, - 0x0000003c, 0x481b4002, 0x820c3440, 0x00000000, - 0x481b4003, 0x58ee580c, 0x832c0400, 0x00000005, - 0x0201f800, 0x0010389a, 0x4a01d808, 0x00103119, - 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x00102242, - 0x58ee580c, 0x832e5c00, 0x00000005, 0x59a00800, - 0x59a24801, 0x0401f7af, 0x42006800, 0x0010ccd1, - 0x4200b000, 0x0010ccd0, 0x5058b000, 0x8058b040, - 0x04000009, 0x42024800, 0x0010ccdc, 0x58340206, + 0x0401f01c, 0x0201f800, 0x0010c0e8, 0x04000017, + 0x82080480, 0x00000081, 0x02021000, 0x0010230d, + 0x42000000, 0x0010cfd0, 0x44080000, 0x800811c0, + 0x02000000, 0x0010230d, 0x40080800, 0x42024800, + 0x0010cfd1, 0x832e5c00, 0x00000006, 0x592c0400, + 0x8c000506, 0x04020014, 0x59240200, 0x84000500, + 0x48024a00, 0x0401f010, 0x82080480, 0x00000080, + 0x02021000, 0x0010230d, 0x80080800, 0x42000000, + 0x0010cfd0, 0x44040000, 0x800811c0, 0x0400007a, + 0x42024800, 0x0010cfdc, 0x80040840, 0x832e5c00, + 0x00000006, 0x42004000, 0x00000003, 0x592c0400, + 0x8c000506, 0x04000012, 0x8c00050a, 0x04020004, + 0x8d0e1d20, 0x02000000, 0x0010230d, 0x4a024a00, + 0x00000005, 0x82001500, 0x00000003, 0x04000006, + 0x840011c0, 0x82081500, 0x000000ff, 0x480a4a08, + 0x0401f003, 0x82000500, 0x000000ff, 0x48024c00, + 0x592c0001, 0x592c1002, 0x9c0001c0, 0x9c0811c0, + 0x48024801, 0x480a4802, 0x599c1817, 0x8c0c1d1c, + 0x04000006, 0x592c0003, 0x592c1004, 0x9c0001c0, + 0x9c0811c0, 0x0401f003, 0x82000500, 0xf0ffffff, + 0x48024803, 0x480a4804, 0x832e5c00, 0x00000005, + 0x83264c00, 0x0000000b, 0x80040840, 0x04000024, + 0x80204040, 0x040207d2, 0x48074000, 0x49274001, + 0x42000800, 0x0000000f, 0x59a01002, 0x59a01803, + 0x82083400, 0x0000003c, 0x481b4002, 0x820c3440, + 0x00000000, 0x481b4003, 0x58ee580c, 0x832c0400, + 0x00000005, 0x0201f800, 0x0010398a, 0x4a01d808, + 0x001031f6, 0x1c01f000, 0x4031d800, 0x58ef400a, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00102301, 0x58ee580c, 0x832e5c00, 0x00000005, + 0x59a00800, 0x59a24801, 0x0401f7af, 0x0201f800, + 0x0010c0e8, 0x04000011, 0x42006800, 0x0010cfd1, + 0x4200b000, 0x0010cfd0, 0x5058b000, 0x58340400, + 0x8c000506, 0x04000005, 0x58340200, 0x8400055e, + 0x48006a00, 0x0401f005, 0x82346c00, 0x0000000b, + 0x8058b040, 0x040207f6, 0x42006800, 0x0010cfd1, + 0x4200b000, 0x0010cfd0, 0x5058b000, 0x8058b040, + 0x04000009, 0x42024800, 0x0010cfdc, 0x58340206, 0x48024a06, 0x83264c00, 0x0000000b, 0x8058b040, 0x040207fb, 0x59a80070, 0x8c000508, 0x04020017, 0x8c00050a, 0x04020023, 0x599c1019, 0x82081500, 0x0000e000, 0x82080580, 0x00000000, 0x0402000c, 0x4a035037, 0x00000000, 0x42000000, 0x00000001, - 0x0201f800, 0x001018a2, 0x42000000, 0x00000001, - 0x0201f800, 0x00101828, 0x0401f030, 0x82080580, + 0x0201f800, 0x001018a7, 0x42000000, 0x00000001, + 0x0201f800, 0x0010182d, 0x0401f030, 0x82080580, 0x00002000, 0x0402000c, 0x4a035037, 0x00000001, - 0x42000000, 0x00000000, 0x0201f800, 0x001018a2, - 0x42000000, 0x00000000, 0x0201f800, 0x00101828, + 0x42000000, 0x00000000, 0x0201f800, 0x001018a7, + 0x42000000, 0x00000000, 0x0201f800, 0x0010182d, 0x0401f022, 0x82080580, 0x00004000, 0x04020006, 0x4a035037, 0x00000002, 0x4a035043, 0x00000001, 0x0401f01a, 0x82080580, 0x00006000, 0x02020000, - 0x0010224e, 0x59a80878, 0x8c040d3e, 0x04020009, + 0x0010230d, 0x59a80878, 0x8c040d3e, 0x04020009, 0x59a80847, 0x82040d80, 0x01391077, 0x04020005, - 0x59e00813, 0x8c040d00, 0x02020000, 0x0010224e, + 0x59e00813, 0x8c040d00, 0x02020000, 0x0010230d, 0x4a035037, 0x00000003, 0x42000000, 0x00000002, - 0x0201f800, 0x001018a2, 0x42000000, 0x00000002, - 0x0201f800, 0x00101828, 0x599c1019, 0x82081500, + 0x0201f800, 0x001018a7, 0x42000000, 0x00000002, + 0x0201f800, 0x0010182d, 0x599c1019, 0x82081500, 0x0000e000, 0x599c0019, 0x8c000520, 0x0400000d, 0x42000000, 0x00000004, 0x42000800, 0x00000040, - 0x0201f800, 0x00101944, 0x42000000, 0x00000010, - 0x42000800, 0x000000c0, 0x0201f800, 0x00101944, + 0x0201f800, 0x00101949, 0x42000000, 0x00000010, + 0x42000800, 0x000000c0, 0x0201f800, 0x00101949, 0x4a035013, 0x0000aaaa, 0x599c1018, 0x82081500, 0x00000030, 0x59a8006d, 0x80000540, 0x0400000c, - 0x82080580, 0x00000000, 0x02000000, 0x0010224e, + 0x82080580, 0x00000000, 0x02000000, 0x0010230d, 0x599c1018, 0x82081500, 0xffffffcf, 0x82081540, 0x00000010, 0x480b3818, 0x0401f010, 0x82080d80, 0x00000000, 0x04000007, 0x82080d80, 0x00000010, 0x0400000a, 0x82080d80, 0x00000020, 0x04020002, - 0x48075013, 0x0201f800, 0x0010393d, 0x04000008, - 0x4803c856, 0x850e1d46, 0x0201f800, 0x00101606, + 0x48075013, 0x0201f800, 0x00103a2d, 0x04000008, + 0x4803c856, 0x850e1d46, 0x0201f800, 0x0010160b, 0x59a8001f, 0x80040540, 0x4803501f, 0x49f3c857, - 0x42001000, 0x00104ee2, 0x0201f800, 0x001062f9, - 0x42001000, 0x00104ed1, 0x0201f800, 0x00106449, + 0x42001000, 0x00105013, 0x0201f800, 0x001064fe, + 0x42001000, 0x00105002, 0x0201f800, 0x0010664e, 0x4a038805, 0xffffffff, 0x4a03c014, 0x00400040, - 0x4a03c013, 0x00400000, 0x0201f800, 0x00104822, + 0x4a03c013, 0x00400000, 0x0201f800, 0x00104922, 0x59a0001e, 0x84000540, 0x4803401e, 0x49f3c857, - 0x0201f000, 0x00102207, 0x00000018, 0x0000000c, + 0x0201f000, 0x001022c6, 0x00000018, 0x0000000c, 0x00000018, 0x00000020, 0x836c0580, 0x00000000, 0x04020005, 0x42000800, 0x00000007, 0x0201f000, - 0x0010224a, 0x42000800, 0x00000020, 0x59a00408, + 0x00102309, 0x42000800, 0x00000020, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x419c0000, - 0x0201f000, 0x001038a3, 0x8d0e1d0e, 0x04000005, - 0x4a034407, 0x00000001, 0x0201f000, 0x0010224a, - 0x0201f800, 0x00104fc6, 0x04020005, 0x4a034407, - 0x00000016, 0x0201f000, 0x0010224a, 0x59a80056, + 0x0201f000, 0x00103993, 0x8d0e1d0e, 0x04000005, + 0x4a034407, 0x00000001, 0x0201f000, 0x00102309, + 0x0201f800, 0x001050f7, 0x04020005, 0x4a034407, + 0x00000016, 0x0201f000, 0x00102309, 0x59a80056, 0x8c000500, 0x04000011, 0x4a034407, 0x00000000, 0x42000800, 0x00000020, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, - 0x900c19c0, 0x800c1d40, 0x42000000, 0x0010df51, - 0x0201f000, 0x001038a3, 0x4a034407, 0x00000001, - 0x4200b000, 0x00000020, 0x4200a800, 0x0010df51, + 0x900c19c0, 0x800c1d40, 0x42000000, 0x0010e251, + 0x0201f000, 0x00103993, 0x4a034407, 0x00000001, + 0x4200b000, 0x00000020, 0x4200a800, 0x0010e251, 0x4200a000, 0xffffffff, 0x4450a800, 0x8054a800, 0x8058b040, 0x040207fd, 0x4d440000, 0x4d340000, 0x42028800, 0xffffffff, 0x42002000, 0xffffffff, 0x42003000, 0x00000001, 0x42003800, 0x00000001, - 0x42001800, 0x0010df51, 0x59a8100f, 0x82081500, - 0x000000ff, 0x40180000, 0x0c01f001, 0x00103223, - 0x00103226, 0x0010322a, 0x0010322e, 0x82102500, + 0x42001800, 0x0010e251, 0x59a8100f, 0x82081500, + 0x000000ff, 0x40180000, 0x0c01f001, 0x00103313, + 0x00103316, 0x0010331a, 0x0010331e, 0x82102500, 0xffffff00, 0x0401f014, 0x82102500, 0xffff00ff, 0x840811c0, 0x0401f010, 0x82102500, 0xff00ffff, 0x900811c0, 0x0401f00c, 0x82102500, 0x00ffffff, @@ -17766,33 +17878,33 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x83442c80, 0x0000007f, 0x04021014, 0x4c080000, 0x4c0c0000, 0x4c180000, 0x4c1c0000, 0x0201f800, 0x0002034c, 0x5c003800, 0x5c003000, 0x5c001800, - 0x5c001000, 0x040207f2, 0x0201f800, 0x0010492d, + 0x5c001000, 0x040207f2, 0x0201f800, 0x00104a2f, 0x040207ef, 0x80183000, 0x801c3800, 0x59341202, 0x40180000, 0x0c01f7ce, 0x82100580, 0xffffffff, - 0x04000002, 0x44101800, 0x42001800, 0x0010df51, + 0x04000002, 0x44101800, 0x42001800, 0x0010e251, 0x500c0000, 0x82000500, 0xffffff00, 0x801c0540, 0x44001800, 0x5c026800, 0x5c028800, 0x42000800, 0x00000020, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, - 0x800c1d40, 0x42000000, 0x0010df51, 0x0201f000, - 0x001038a3, 0x59a28c07, 0x0201f800, 0x00103980, - 0x02020000, 0x0010224e, 0x0201f800, 0x0010497a, - 0x02020000, 0x0010224e, 0x0201f800, 0x00103876, + 0x800c1d40, 0x42000000, 0x0010e251, 0x0201f000, + 0x00103993, 0x59a28c07, 0x0201f800, 0x00103a70, + 0x02020000, 0x0010230d, 0x0201f800, 0x00104a7c, + 0x02020000, 0x0010230d, 0x0201f800, 0x00103966, 0x04020005, 0x4a034407, 0x00000002, 0x0201f000, - 0x0010224a, 0x59a0020c, 0x8c000500, 0x04000005, - 0x0201f800, 0x0010492d, 0x02020000, 0x00103947, + 0x00102309, 0x59a0020c, 0x8c000500, 0x04000005, + 0x0201f800, 0x00104a2f, 0x02020000, 0x00103a37, 0x59a0020c, 0x8c000502, 0x0400001b, 0x83440480, - 0x000007f0, 0x04021018, 0x0201f800, 0x00104936, + 0x000007f0, 0x04021018, 0x0201f800, 0x00104a38, 0x04020015, 0x497a5a05, 0x4a025c05, 0x00008000, - 0x59a24805, 0x0201f800, 0x00109731, 0x04020005, - 0x4a034407, 0x00000003, 0x0201f000, 0x0010224a, - 0x4a01d808, 0x0010329b, 0x1c01f000, 0x59a28c07, - 0x59a2440b, 0x0201f800, 0x0010497a, 0x02020000, - 0x0010224e, 0x4c580000, 0x4c500000, 0x4c540000, + 0x59a24805, 0x0201f800, 0x00109969, 0x04020005, + 0x4a034407, 0x00000003, 0x0201f000, 0x00102309, + 0x4a01d808, 0x0010338b, 0x1c01f000, 0x59a28c07, + 0x59a2440b, 0x0201f800, 0x00104a7c, 0x02020000, + 0x0010230d, 0x4c580000, 0x4c500000, 0x4c540000, 0x4200b000, 0x0000000a, 0x4134a000, 0x832e5c00, - 0x00000002, 0x412ca800, 0x0201f800, 0x0010bd5b, + 0x00000002, 0x412ca800, 0x0201f800, 0x0010c086, 0x832cac00, 0x00000006, 0x4054a000, 0x4200b000, - 0x00000004, 0x0201f800, 0x0010bd85, 0x5c00a800, + 0x00000004, 0x0201f800, 0x0010c0b0, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x592c0802, 0x82040500, 0x00ff00ff, 0x900001c0, 0x82041500, 0xff00ff00, 0x80080540, 0x48025802, 0x592c0801, 0x82040500, @@ -17800,63 +17912,63 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x80080540, 0x48025801, 0x42000800, 0x0000000a, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, - 0x412c0000, 0x0201f000, 0x001038a3, 0x496fc857, + 0x412c0000, 0x0201f000, 0x00103993, 0x496fc857, 0x496f4407, 0x59a80878, 0x8c040d3e, 0x02000000, - 0x00102207, 0x59a81078, 0x82081500, 0x00000097, + 0x001022c6, 0x59a81078, 0x82081500, 0x00000097, 0x59a81879, 0x59340400, 0x82000580, 0x00000404, 0x04020002, 0x84081546, 0x480b4408, 0x0201f000, - 0x00102207, 0x59a28c07, 0x0201f800, 0x00103980, - 0x02020000, 0x0010224e, 0x0201f800, 0x0010497a, - 0x02020000, 0x0010224e, 0x836c0580, 0x00000003, + 0x001022c6, 0x59a28c07, 0x0201f800, 0x00103a70, + 0x02020000, 0x0010230d, 0x0201f800, 0x00104a7c, + 0x02020000, 0x0010230d, 0x836c0580, 0x00000003, 0x04000005, 0x4a034407, 0x00000007, 0x0201f000, - 0x0010224a, 0x83340c00, 0x00000006, 0x59a0020c, + 0x00102309, 0x83340c00, 0x00000006, 0x59a0020c, 0x8c000500, 0x04000003, 0x83340c00, 0x00000008, 0x58040001, 0x4803440a, 0x900001c0, 0x4803420a, 0x50040000, 0x48034408, 0x900001c0, 0x48034208, - 0x59340200, 0x48034407, 0x0201f000, 0x00102207, + 0x59340200, 0x48034407, 0x0201f000, 0x001022c6, 0x8d0e1d0e, 0x04000005, 0x4a034407, 0x00000001, - 0x0201f000, 0x0010224a, 0x59a0220c, 0x8c102500, + 0x0201f000, 0x00102309, 0x59a0220c, 0x8c102500, 0x0402002e, 0x8c102506, 0x04020006, 0x59a03209, - 0x82180480, 0x00000003, 0x02021000, 0x0010224e, + 0x82180480, 0x00000003, 0x02021000, 0x0010230d, 0x59a28c07, 0x0201f800, 0x0002034c, 0x02020000, - 0x0010224e, 0x0201f800, 0x0010491a, 0x04000005, - 0x4a034407, 0x00000009, 0x0201f000, 0x0010224a, - 0x0201f800, 0x00103876, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x0010224a, 0x59a0220c, + 0x0010230d, 0x0201f800, 0x00104a1c, 0x04000005, + 0x4a034407, 0x00000009, 0x0201f000, 0x00102309, + 0x0201f800, 0x00103966, 0x04020005, 0x4a034407, + 0x00000002, 0x0201f000, 0x00102309, 0x59a0220c, 0x8c102506, 0x04000004, 0x59343002, 0x82183500, 0x00ffffff, 0x497a5a05, 0x4a025c05, 0x00008000, - 0x0201f800, 0x001096ea, 0x04020005, 0x4a034407, - 0x00000003, 0x0201f000, 0x0010224a, 0x4a01d808, - 0x00103394, 0x1c01f000, 0x59a28c07, 0x0201f800, - 0x0002034c, 0x02020000, 0x0010224e, 0x0201f800, - 0x0010491a, 0x04000005, 0x4a034407, 0x00000009, - 0x0201f000, 0x0010224a, 0x0201f800, 0x00103876, + 0x0201f800, 0x00109922, 0x04020005, 0x4a034407, + 0x00000003, 0x0201f000, 0x00102309, 0x4a01d808, + 0x00103484, 0x1c01f000, 0x59a28c07, 0x0201f800, + 0x0002034c, 0x02020000, 0x0010230d, 0x0201f800, + 0x00104a1c, 0x04000005, 0x4a034407, 0x00000009, + 0x0201f000, 0x00102309, 0x0201f800, 0x00103966, 0x04020005, 0x4a034407, 0x00000002, 0x0201f000, - 0x0010224a, 0x497a5a05, 0x4a025c05, 0x00008000, - 0x0201f800, 0x00103876, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x0010224a, 0x592e5800, - 0x0201f800, 0x00109702, 0x04020005, 0x4a034407, - 0x00000003, 0x0201f000, 0x0010224a, 0x4a01d808, - 0x00103366, 0x1c01f000, 0x592c2806, 0x82140d80, + 0x00102309, 0x497a5a05, 0x4a025c05, 0x00008000, + 0x0201f800, 0x00103966, 0x04020005, 0x4a034407, + 0x00000002, 0x0201f000, 0x00102309, 0x592e5800, + 0x0201f800, 0x0010993a, 0x04020005, 0x4a034407, + 0x00000003, 0x0201f000, 0x00102309, 0x4a01d808, + 0x00103456, 0x1c01f000, 0x592c2806, 0x82140d80, 0x01000000, 0x04020005, 0x4a034407, 0x00000004, - 0x0201f000, 0x0010224a, 0x42000800, 0x00000008, + 0x0201f000, 0x00102309, 0x42000800, 0x00000008, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, - 0x832c0400, 0x00000006, 0x0201f800, 0x001038a3, - 0x8c142d00, 0x04000003, 0x4a01d808, 0x00103381, + 0x832c0400, 0x00000006, 0x0201f800, 0x00103993, + 0x8c142d00, 0x04000003, 0x4a01d808, 0x00103471, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x00102242, 0x812e59c0, 0x02000800, 0x0010032e, + 0x00102301, 0x812e59c0, 0x02000800, 0x0010032e, 0x42000800, 0x00000008, 0x832c0400, 0x00000006, - 0x58ec1006, 0x58ec1807, 0x0201f000, 0x001038a3, + 0x58ec1006, 0x58ec1807, 0x0201f000, 0x00103993, 0x592c0006, 0x82000580, 0x01000000, 0x04020005, - 0x4a034407, 0x00000004, 0x0201f000, 0x0010224a, + 0x4a034407, 0x00000004, 0x0201f000, 0x00102309, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x42000800, 0x00000006, 0x832c0400, 0x00000007, - 0x0201f000, 0x001038a3, 0x59a00a0b, 0x800409c0, - 0x02000000, 0x0010224e, 0x0201f800, 0x00103980, - 0x02020000, 0x0010224e, 0x82040480, 0x00000081, + 0x0201f000, 0x00103993, 0x59a00a0b, 0x800409c0, + 0x02000000, 0x0010230d, 0x0201f800, 0x00103a70, + 0x02020000, 0x0010230d, 0x82040480, 0x00000081, 0x04001003, 0x42000800, 0x00000080, 0x59c40085, 0x59881004, 0x80081400, 0x480b1004, 0x497b8885, 0x59c400b1, 0x48031022, 0x59c400b2, 0x48031021, @@ -17866,72 +17978,72 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x80081400, 0x480b1024, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x83880400, 0x00000000, - 0x0201f800, 0x001038a3, 0x4a01d808, 0x001033dd, + 0x0201f800, 0x00103993, 0x4a01d808, 0x001034cd, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x00102242, + 0x82000580, 0x00000200, 0x02000000, 0x00102301, 0x59a0020c, 0x8c000500, 0x04000008, 0x83880400, 0x00000000, 0x4803c840, 0x4a03c842, 0x00000006, 0x04011000, 0x497b8885, 0x4a034208, 0x00000080, - 0x0201f000, 0x00102207, 0x8d0e1d0e, 0x04000005, - 0x4a034407, 0x00000001, 0x0201f000, 0x0010224a, - 0x0201f800, 0x00103980, 0x02020000, 0x0010224e, - 0x0201f800, 0x00103876, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x0010224a, 0x497a5a05, + 0x0201f000, 0x001022c6, 0x8d0e1d0e, 0x04000005, + 0x4a034407, 0x00000001, 0x0201f000, 0x00102309, + 0x0201f800, 0x00103a70, 0x02020000, 0x0010230d, + 0x0201f800, 0x00103966, 0x04020005, 0x4a034407, + 0x00000002, 0x0201f000, 0x00102309, 0x497a5a05, 0x4a025c05, 0x00008000, 0x59a00407, 0x800001c0, - 0x02000000, 0x0010224e, 0x82001580, 0x000000ff, + 0x02000000, 0x0010230d, 0x82001580, 0x000000ff, 0x04000005, 0x82001480, 0x00000004, 0x02021000, - 0x0010224e, 0x40001000, 0x59a24805, 0x0201f800, - 0x00101c85, 0x04020005, 0x4a034407, 0x00000003, - 0x0201f000, 0x0010224a, 0x4a01d808, 0x0010341d, + 0x0010230d, 0x40001000, 0x59a24805, 0x0201f800, + 0x00101c8a, 0x04020005, 0x4a034407, 0x00000003, + 0x0201f000, 0x00102309, 0x4a01d808, 0x0010350d, 0x1c01f000, 0x592c0006, 0x82000580, 0x01000000, - 0x02020000, 0x00102207, 0x4a034407, 0x00000004, - 0x0201f000, 0x0010224a, 0x59a01407, 0x8c081508, + 0x02020000, 0x001022c6, 0x4a034407, 0x00000004, + 0x0201f000, 0x00102309, 0x59a01407, 0x8c081508, 0x04020007, 0x8d0e1d0e, 0x04000005, 0x4a034407, - 0x00000001, 0x0201f000, 0x0010224a, 0x59a01c08, - 0x820c0480, 0x00001000, 0x02021000, 0x0010224e, + 0x00000001, 0x0201f000, 0x00102309, 0x59a01c08, + 0x820c0480, 0x00001000, 0x02021000, 0x0010230d, 0x497b2804, 0x497b2805, 0x497b2826, 0x497b2827, 0x497b2829, 0x497b282a, 0x497b282c, 0x497b282d, 0x4803c856, 0x850e1d06, 0x8c081500, 0x04000005, 0x4803c856, 0x830e1d40, 0x00000011, 0x0401f004, 0x8c081506, 0x04000002, 0x850e1d42, 0x850e1d0a, 0x4202d800, 0x00000001, 0x82081500, 0x000000e0, - 0x8008010a, 0x0c020038, 0x0201f800, 0x00104fc6, + 0x8008010a, 0x0c020038, 0x0201f800, 0x001050f7, 0x0402000b, 0x4a035014, 0x00000001, 0x4a035013, - 0x0000aaaa, 0x0201f800, 0x00104f20, 0x0401f01f, + 0x0000aaaa, 0x0201f800, 0x00105051, 0x0401f01f, 0x4a035014, 0x00000000, 0x0401f7f9, 0x497b5013, - 0x0201f800, 0x00104032, 0x0201f800, 0x00106c3c, - 0x0201f800, 0x00106faf, 0x0201f800, 0x00106c29, + 0x0201f800, 0x0010412b, 0x0201f800, 0x00106e41, + 0x0201f800, 0x001071b4, 0x0201f800, 0x00106e2e, 0x59a00a08, 0x480788a7, 0x59c400a3, 0x82000500, 0xfeffffff, 0x82000540, 0x80018000, 0x40000800, 0x84040d20, 0x480388a3, 0x480788a3, 0x497b5032, - 0x42000800, 0x0000002d, 0x42001000, 0x001040ba, - 0x0201f800, 0x001062d0, 0x59a00408, 0x800000c2, + 0x42000800, 0x0000002d, 0x42001000, 0x001041b3, + 0x0201f800, 0x001064d5, 0x59a00408, 0x800000c2, 0x800008c4, 0x8005d400, 0x42000000, 0x0000ffff, - 0x0201f800, 0x00104fc6, 0x04000003, 0x59a00208, - 0x80000110, 0x0201f800, 0x00103996, 0x0201f000, - 0x00102207, 0x0010344e, 0x00103451, 0x0010345b, - 0x0010224e, 0x00103458, 0x0010224e, 0x0010224e, - 0x0010224e, 0x836c0580, 0x00000003, 0x04000005, - 0x4a034407, 0x00000007, 0x0201f000, 0x0010224a, - 0x0201f800, 0x00103980, 0x02020000, 0x0010224e, + 0x0201f800, 0x001050f7, 0x04000003, 0x59a00208, + 0x80000110, 0x0201f800, 0x00103a86, 0x0201f000, + 0x001022c6, 0x0010353e, 0x00103541, 0x0010354b, + 0x0010230d, 0x00103548, 0x0010230d, 0x0010230d, + 0x0010230d, 0x836c0580, 0x00000003, 0x04000005, + 0x4a034407, 0x00000007, 0x0201f000, 0x00102309, + 0x0201f800, 0x00103a70, 0x02020000, 0x0010230d, 0x59a00408, 0x59a00a08, 0x900409c0, 0x80040d40, 0x4805d806, 0x59a0040a, 0x59a00a0a, 0x900409c0, 0x80040d40, 0x4805d807, 0x4a01d801, 0x00000000, 0x0401fbd2, 0x04020005, 0x4a034407, 0x00000002, - 0x0201f000, 0x0010224a, 0x417a8800, 0x497b4001, + 0x0201f000, 0x00102309, 0x417a8800, 0x497b4001, 0x832c0400, 0x00000006, 0x48034002, 0x59a00407, 0x8c000504, 0x0402009b, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4178b800, 0x59a0c407, 0x59a0c802, - 0x59a2440b, 0x0201f800, 0x0010497a, 0x0402002c, - 0x0201f800, 0x0010491a, 0x04000004, 0x0201f800, - 0x0010484d, 0x04020026, 0x8c60c53e, 0x04020022, + 0x59a2440b, 0x0201f800, 0x00104a7c, 0x0402002c, + 0x0201f800, 0x00104a1c, 0x04000004, 0x0201f800, + 0x0010494d, 0x04020026, 0x8c60c53e, 0x04020022, 0x8c60c500, 0x04000008, 0x59340009, 0x4400c800, 0x8064c800, 0x59340008, 0x4400c800, 0x8064c800, 0x0401f007, 0x59340007, 0x4400c800, 0x8064c800, 0x59340006, 0x4400c800, 0x8064c800, 0x83440580, 0x000007fe, 0x0400000d, 0x83440580, 0x000007fc, - 0x0400000a, 0x0201f800, 0x0010492d, 0x04000003, - 0x85468d5e, 0x0401f005, 0x0201f800, 0x00104817, + 0x0400000a, 0x0201f800, 0x00104a2f, 0x04000003, + 0x85468d5e, 0x0401f005, 0x0201f800, 0x00104917, 0x04020002, 0x85468d5e, 0x4544c800, 0x85468d1e, 0x8064c800, 0x825cbc00, 0x0000000c, 0x81468800, 0x83440480, 0x000007f0, 0x0400100e, 0x8c60c506, @@ -17944,32 +18056,32 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04021004, 0x8460c57e, 0x4178b800, 0x0401f7b2, 0x49474000, 0x485dd805, 0x59a00002, 0x4801d803, 0x40ec1000, 0x0201f800, 0x00020016, 0x4a01d808, - 0x00103543, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x00103633, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x8c60c53e, 0x0402001a, 0x805cb9c0, 0x04000024, 0x59a00001, 0x805c0400, 0x48034001, 0x59a00a0b, 0x800409c0, 0x04000005, 0x80040480, 0x04021003, 0x4178b800, 0x0401f00e, 0x59a00801, 0x48074407, 0x485dd805, 0x59a00002, 0x4801d803, - 0x4a01d808, 0x00102200, 0x40ec1000, 0x5c00c800, + 0x4a01d808, 0x001022bf, 0x40ec1000, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0201f000, 0x00020016, 0x59a00001, 0x805c0c00, 0x59a0020b, 0x80040480, 0x48034208, 0x4a034407, 0x0000000a, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x0201f000, 0x0010224a, + 0x5c00c000, 0x5c00b800, 0x0201f000, 0x00102309, 0x59a00801, 0x48074407, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x0201f000, 0x00102207, 0x4031d800, + 0x5c00b800, 0x0201f000, 0x001022c6, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x00102242, 0x59a28800, 0x0401f767, + 0x02000000, 0x00102301, 0x59a28800, 0x0401f767, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4178b800, 0x59a0c407, 0x59a0c802, 0x59a2440b, 0x0201f800, - 0x0010497a, 0x04020031, 0x0201f800, 0x0010491a, - 0x04000004, 0x0201f800, 0x0010484d, 0x0402002b, + 0x00104a7c, 0x04020031, 0x0201f800, 0x00104a1c, + 0x04000004, 0x0201f800, 0x0010494d, 0x0402002b, 0x8c60c53e, 0x04020027, 0x83440580, 0x000007fe, 0x04000011, 0x83440580, 0x000007fc, 0x0400000e, - 0x0201f800, 0x0010492d, 0x04000005, 0x59340403, + 0x0201f800, 0x00104a2f, 0x04000005, 0x59340403, 0x8400055e, 0x48026c03, 0x0401f007, 0x0201f800, - 0x00104817, 0x04020004, 0x59340403, 0x8400055e, + 0x00104917, 0x04020004, 0x59340403, 0x8400055e, 0x48026c03, 0x4134a000, 0x4064a800, 0x4200b000, - 0x00000006, 0x0201f800, 0x0010bd5b, 0x59340007, + 0x00000006, 0x0201f800, 0x0010c086, 0x59340007, 0x4400a800, 0x59340006, 0x4800a801, 0x59340009, 0x4800a802, 0x59340008, 0x4800a803, 0x59340403, 0x8400051e, 0x48026c03, 0x8264cc00, 0x0000000a, @@ -17984,101 +18096,101 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04021004, 0x8460c57e, 0x4178b800, 0x0401f7ab, 0x49474000, 0x485dd805, 0x59a00002, 0x4801d803, 0x40ec1000, 0x0201f800, 0x00020016, 0x4a01d808, - 0x001035e3, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x001036d3, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x8c60c53e, 0x0402001a, 0x805cb9c0, 0x04000024, 0x59a00001, 0x805c0400, 0x48034001, 0x59a00a0b, 0x800409c0, 0x04000005, 0x80040480, 0x04021003, 0x4178b800, 0x0401f00e, 0x59a00801, 0x48074407, 0x485dd805, 0x59a00002, 0x4801d803, - 0x4a01d808, 0x00102200, 0x40ec1000, 0x5c00c800, + 0x4a01d808, 0x001022bf, 0x40ec1000, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0201f000, 0x00020016, 0x59a00001, 0x805c0c00, 0x59a0020b, 0x80040480, 0x48034208, 0x4a034407, 0x0000000a, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x0201f000, 0x0010224a, + 0x5c00c000, 0x5c00b800, 0x0201f000, 0x00102309, 0x59a00801, 0x48074407, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x0201f000, 0x00102207, 0x4031d800, + 0x5c00b800, 0x0201f000, 0x001022c6, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x00102242, 0x59a28800, 0x0401f761, + 0x02000000, 0x00102301, 0x59a28800, 0x0401f761, 0x42002800, 0x0000007e, 0x59a00c07, 0x59a01208, 0x59a01c08, 0x59a0220a, 0x82040500, 0x0000ff00, 0x840001c0, 0x82003480, 0x00000020, 0x02001000, - 0x0010224e, 0x80140480, 0x02001000, 0x0010224e, + 0x0010230d, 0x80140480, 0x02001000, 0x0010230d, 0x82040500, 0x000000ff, 0x82003480, 0x00000020, - 0x02001000, 0x0010224e, 0x80140480, 0x02001000, - 0x0010224e, 0x82080500, 0x0000ff00, 0x840001c0, - 0x82003480, 0x00000020, 0x02001000, 0x0010224e, - 0x80140480, 0x02001000, 0x0010224e, 0x82080500, + 0x02001000, 0x0010230d, 0x80140480, 0x02001000, + 0x0010230d, 0x82080500, 0x0000ff00, 0x840001c0, + 0x82003480, 0x00000020, 0x02001000, 0x0010230d, + 0x80140480, 0x02001000, 0x0010230d, 0x82080500, 0x000000ff, 0x82003480, 0x00000020, 0x02001000, - 0x0010224e, 0x80140480, 0x02001000, 0x0010224e, + 0x0010230d, 0x80140480, 0x02001000, 0x0010230d, 0x820c0500, 0x0000ff00, 0x840001c0, 0x82003480, - 0x00000020, 0x02001000, 0x0010224e, 0x80140480, - 0x02001000, 0x0010224e, 0x820c0500, 0x000000ff, - 0x82003480, 0x00000020, 0x02001000, 0x0010224e, - 0x80140480, 0x02001000, 0x0010224e, 0x82100500, + 0x00000020, 0x02001000, 0x0010230d, 0x80140480, + 0x02001000, 0x0010230d, 0x820c0500, 0x000000ff, + 0x82003480, 0x00000020, 0x02001000, 0x0010230d, + 0x80140480, 0x02001000, 0x0010230d, 0x82100500, 0x0000ff00, 0x840001c0, 0x82003480, 0x00000020, - 0x02001000, 0x0010224e, 0x80140480, 0x02001000, - 0x0010224e, 0x82100500, 0x000000ff, 0x82003480, - 0x00000020, 0x02001000, 0x0010224e, 0x80140480, - 0x02001000, 0x0010224e, 0x900401c0, 0x80080d40, + 0x02001000, 0x0010230d, 0x80140480, 0x02001000, + 0x0010230d, 0x82100500, 0x000000ff, 0x82003480, + 0x00000020, 0x02001000, 0x0010230d, 0x80140480, + 0x02001000, 0x0010230d, 0x900401c0, 0x80080d40, 0x900c01c0, 0x80101d40, 0x83a83400, 0x0000002d, 0x44043000, 0x80183000, 0x440c3000, 0x0201f000, - 0x00102207, 0x0401fa2d, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x0010224a, 0x42000800, - 0x0000000c, 0x0401f84f, 0x4a01d808, 0x00103655, + 0x001022c6, 0x0401fa2d, 0x04020005, 0x4a034407, + 0x00000002, 0x0201f000, 0x00102309, 0x42000800, + 0x0000000c, 0x0401f84f, 0x4a01d808, 0x00103745, 0x1c01f000, 0x4031d800, 0x58ee580c, 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x00102242, 0x832ca400, 0x00000005, 0x4200b000, - 0x0000000c, 0x40c8a800, 0x0201f800, 0x0010bd5b, + 0x00102301, 0x832ca400, 0x00000005, 0x4200b000, + 0x0000000c, 0x40c8a800, 0x0201f800, 0x0010c086, 0x58c80200, 0x80000540, 0x04000030, 0x58c80400, 0x82000500, 0xfffffffb, 0x0402002c, 0x58c80401, 0x80000540, 0x04000029, 0x82000480, 0x0000ff01, 0x04021026, 0x58c80202, 0x82000480, 0x0000005c, - 0x04001022, 0x0201f800, 0x0010676c, 0x58c80c08, + 0x04001022, 0x0201f800, 0x00106971, 0x58c80c08, 0x58c80204, 0x80040480, 0x0400101c, 0x58c80204, 0x82000480, 0x00000005, 0x04021018, 0x58c80205, 0x58c80c08, 0x80040902, 0x80040480, 0x04001013, - 0x58c80c08, 0x0201f800, 0x001066bb, 0x04000017, - 0x0201f800, 0x0010657c, 0x0402000e, 0x4979940b, + 0x58c80c08, 0x0201f800, 0x001068c0, 0x04000017, + 0x0201f800, 0x00106781, 0x0402000e, 0x4979940b, 0x59c408a3, 0x82040d40, 0x00000002, 0x480788a3, - 0x58c80202, 0x48030804, 0x0201f800, 0x0010655e, - 0x0201f000, 0x00102207, 0x0201f000, 0x0010224e, - 0x0201f800, 0x001067be, 0x0201f800, 0x001067cb, - 0x0201f800, 0x001066ae, 0x0201f000, 0x0010224a, + 0x58c80202, 0x48030804, 0x0201f800, 0x00106763, + 0x0201f000, 0x001022c6, 0x0201f000, 0x0010230d, + 0x0201f800, 0x001069c3, 0x0201f800, 0x001069d0, + 0x0201f800, 0x001068b3, 0x0201f000, 0x00102309, 0x4c000000, 0x59a01208, 0x59a00408, 0x900811c0, 0x80081540, 0x59a01a0a, 0x59a0040a, 0x900c19c0, 0x800c1d40, 0x5c000000, 0x0401f1f0, 0x59840000, 0x82000580, 0x00000000, 0x04000050, 0x59840002, 0x8c000504, 0x0400004d, 0x84000546, 0x48030802, - 0x0201f800, 0x001066ae, 0x59c408a3, 0x82040d00, + 0x0201f800, 0x001068b3, 0x59c408a3, 0x82040d00, 0xfffffffd, 0x480788a3, 0x4c5c0000, 0x4200b800, - 0x0010bf80, 0x505e6800, 0x813669c0, 0x04000008, + 0x0010c280, 0x505e6800, 0x813669c0, 0x04000008, 0x5936600e, 0x813261c0, 0x04000005, 0x0201f800, - 0x0010669f, 0x02000800, 0x00106877, 0x805cb800, - 0x825c0580, 0x0010c770, 0x040207f3, 0x59866003, + 0x001068a4, 0x02000800, 0x00106a7c, 0x805cb800, + 0x825c0580, 0x0010ca70, 0x040207f3, 0x59866003, 0x813261c0, 0x0400000b, 0x59300407, 0x82000580, 0x00000009, 0x02020800, 0x0010032e, 0x5930b800, - 0x0201f800, 0x00106684, 0x405e6000, 0x0401f7f5, - 0x497b0803, 0x4200b800, 0x0010c872, 0x505e6000, + 0x0201f800, 0x00106889, 0x405e6000, 0x0401f7f5, + 0x497b0803, 0x4200b800, 0x0010cb72, 0x505e6000, 0x813261c0, 0x04000011, 0x59300407, 0x82000580, 0x00000009, 0x0402000d, 0x59300203, 0x82000580, 0x00000004, 0x04020009, 0x5932680a, 0x813669c0, - 0x02020800, 0x0010032e, 0x0201f800, 0x00100c75, - 0x0201f800, 0x00106684, 0x4578b800, 0x805cb800, - 0x825c0580, 0x0010c87a, 0x040207e9, 0x42000800, - 0x0010c870, 0x49780801, 0x49780800, 0x0201f800, - 0x001067be, 0x0201f800, 0x001067cb, 0x5c00b800, - 0x0201f800, 0x00106577, 0x0201f000, 0x00102207, + 0x02020800, 0x0010032e, 0x0201f800, 0x00100c76, + 0x0201f800, 0x00106889, 0x4578b800, 0x805cb800, + 0x825c0580, 0x0010cb7a, 0x040207e9, 0x42000800, + 0x0010cb70, 0x49780801, 0x49780800, 0x0201f800, + 0x001069c3, 0x0201f800, 0x001069d0, 0x5c00b800, + 0x0201f800, 0x0010677c, 0x0201f000, 0x001022c6, 0x836c0580, 0x00000003, 0x04000005, 0x4a034407, - 0x00000007, 0x0201f000, 0x0010224a, 0x0401fa79, - 0x02020000, 0x0010224e, 0x59a00408, 0x59a00a08, + 0x00000007, 0x0201f000, 0x00102309, 0x0401fa79, + 0x02020000, 0x0010230d, 0x59a00408, 0x59a00a08, 0x900409c0, 0x80040d40, 0x4805d806, 0x59a0040a, 0x59a00a0a, 0x900409c0, 0x80040d40, 0x4805d807, 0x4a01d801, 0x00000000, 0x0401f960, 0x04020005, - 0x4a034407, 0x00000002, 0x0201f000, 0x0010224a, + 0x4a034407, 0x00000002, 0x0201f000, 0x00102309, 0x417a8800, 0x497b4001, 0x832c0400, 0x00000005, 0x48034002, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4178b800, 0x4178c800, 0x59a0c002, 0x0201f800, - 0x0010497a, 0x0402000d, 0x0201f800, 0x0010491a, + 0x00104a7c, 0x0402000d, 0x0201f800, 0x00104a1c, 0x0402000a, 0x8c64cd3e, 0x04020006, 0x59340002, 0x4800c000, 0x4944c001, 0x8260c400, 0x00000002, 0x825cbc00, 0x00000008, 0x81468800, 0x83440480, @@ -18089,78 +18201,78 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x80040480, 0x04021004, 0x4178b800, 0x8464cd7e, 0x0401f7db, 0x49474000, 0x485dd805, 0x59a00002, 0x4801d803, 0x40ec1000, 0x0201f800, 0x00020016, - 0x4a01d808, 0x0010378a, 0x5c00c800, 0x5c00c000, + 0x4a01d808, 0x0010387a, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x8c64cd3e, 0x0402001b, 0x805cb9c0, 0x04000025, 0x59a00001, 0x805c0400, 0x48034001, 0x59a00a0b, 0x800409c0, 0x04000005, 0x80040480, 0x04021003, 0x4178b800, 0x0401f00f, 0x59a00801, 0x80040906, 0x48074407, 0x485dd805, - 0x59a00002, 0x4801d803, 0x4a01d808, 0x00102200, + 0x59a00002, 0x4801d803, 0x4a01d808, 0x001022bf, 0x40ec1000, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0201f000, 0x00020016, 0x59a00001, 0x805c0c00, 0x59a0020b, 0x80040480, 0x48034208, 0x4a034407, 0x0000000a, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x0201f000, 0x0010224a, 0x59a00801, 0x80040906, + 0x0201f000, 0x00102309, 0x59a00801, 0x80040906, 0x48074407, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x0201f000, 0x00102207, 0x4031d800, 0x58ef400a, + 0x0201f000, 0x001022c6, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x00102242, 0x59a28800, 0x0401f78f, 0x8d0e1d0e, + 0x00102301, 0x59a28800, 0x0401f78f, 0x8d0e1d0e, 0x04000005, 0x4a034407, 0x00000001, 0x0201f000, - 0x0010224a, 0x59a8021b, 0x8c00050a, 0x04020007, + 0x00102309, 0x59a8021b, 0x8c00050a, 0x04020007, 0x8c000506, 0x04020005, 0x4a034407, 0x00000016, - 0x0201f000, 0x0010224a, 0x0401f9de, 0x02020000, - 0x0010224e, 0x0401f8d1, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x0010224a, 0x59a00c07, + 0x0201f000, 0x00102309, 0x0401f9de, 0x02020000, + 0x0010230d, 0x0401f8d1, 0x04020005, 0x4a034407, + 0x00000002, 0x0201f000, 0x00102309, 0x59a00c07, 0x80040902, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x832c0400, 0x00000006, 0x0401f8e3, - 0x4a01d808, 0x001037bb, 0x1c01f000, 0x4031d800, + 0x4a01d808, 0x001038ab, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x00102242, 0x592c000a, - 0x59a8380f, 0x0201f800, 0x00105f68, 0x02000800, - 0x0010452c, 0x02020000, 0x0010224e, 0x49474001, + 0x00000200, 0x02000000, 0x00102301, 0x592c000a, + 0x59a8380f, 0x0201f800, 0x00106134, 0x02000800, + 0x00104628, 0x02020000, 0x0010230d, 0x49474001, 0x481a6802, 0x592c000b, 0x82001d80, 0x70000000, 0x04020007, 0x0401f8a5, 0x04020011, 0x4a034407, - 0x00000002, 0x0201f000, 0x0010224a, 0x82001d80, - 0x72000000, 0x02020000, 0x0010224e, 0x0401f89b, + 0x00000002, 0x0201f000, 0x00102309, 0x82001d80, + 0x72000000, 0x02020000, 0x0010230d, 0x0401f89b, 0x0402089a, 0x04020899, 0x04020005, 0x4a034407, - 0x00000002, 0x0201f000, 0x0010224a, 0x58ee580c, + 0x00000002, 0x0201f000, 0x00102309, 0x58ee580c, 0x4a025c05, 0x00008000, 0x497a5a05, 0x592c3209, 0x80183102, 0x592c1801, 0x4a001806, 0x01000000, - 0x0201f800, 0x00109719, 0x04020005, 0x4a034407, - 0x00000003, 0x0201f000, 0x0010224a, 0x4a01d808, - 0x001037f6, 0x1c01f000, 0x592c4000, 0x592c0006, + 0x0201f800, 0x00109951, 0x04020005, 0x4a034407, + 0x00000003, 0x0201f000, 0x00102309, 0x4a01d808, + 0x001038e6, 0x1c01f000, 0x592c4000, 0x592c0006, 0x82000580, 0x01000000, 0x04020005, 0x4a034407, - 0x00000004, 0x0201f000, 0x0010224a, 0x4c580000, + 0x00000004, 0x0201f000, 0x00102309, 0x4c580000, 0x4c500000, 0x4c540000, 0x832c3c00, 0x00000006, 0x401ca000, 0x401ca800, 0x5820280b, 0x4200b000, 0x00000002, 0x82143580, 0x70000000, 0x04000003, - 0x4200b000, 0x0000000f, 0x0201f800, 0x0010bd85, + 0x4200b000, 0x0000000f, 0x0201f800, 0x0010c0b0, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x401c0000, 0x58201007, 0x58201808, 0x58202206, 0x80102102, 0x82143580, 0x70000000, 0x04020008, 0x82103480, - 0x00000002, 0x02001000, 0x0010224e, 0x42000800, + 0x00000002, 0x02001000, 0x0010230d, 0x42000800, 0x00000002, 0x0401f082, 0x82143580, 0x72000000, - 0x02020000, 0x0010224e, 0x82103480, 0x0000002a, - 0x02001000, 0x0010224e, 0x42000800, 0x0000000f, - 0x0401f877, 0x4a01d808, 0x00103830, 0x1c01f000, + 0x02020000, 0x0010230d, 0x82103480, 0x0000002a, + 0x02001000, 0x0010230d, 0x42000800, 0x0000000f, + 0x0401f877, 0x4a01d808, 0x00103920, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580d, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x00102242, + 0x82000580, 0x00000200, 0x02000000, 0x00102301, 0x592e5800, 0x832c0c00, 0x00000006, 0x4c580000, 0x4c500000, 0x4c540000, 0x4004a000, 0x4004a800, - 0x4200b000, 0x0000000f, 0x0201f800, 0x0010bd85, + 0x4200b000, 0x0000000f, 0x0201f800, 0x0010c0b0, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x40ec1000, 0x4a001001, 0x00000000, 0x4a001005, 0x0000003c, 0x48041003, 0x0201f800, 0x00020016, 0x4a01d808, - 0x00103852, 0x1c01f000, 0x4031d800, 0x58ef400a, + 0x00103942, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x00102242, 0x832c0c00, 0x00000006, + 0x02000000, 0x00102301, 0x832c0c00, 0x00000006, 0x4c580000, 0x4c500000, 0x4c540000, 0x4004a000, 0x4004a800, 0x4200b000, 0x0000000c, 0x0201f800, - 0x0010bd85, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x0010c0b0, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x40ec1000, 0x4a001001, 0x00000000, 0x4a001005, 0x00000030, 0x48041003, 0x0201f800, 0x00020016, - 0x4a01d808, 0x00102200, 0x1c01f000, 0x0401f803, + 0x4a01d808, 0x001022bf, 0x1c01f000, 0x0401f803, 0x412d8800, 0x1c01f000, 0x0201f800, 0x00100583, 0x04000010, 0x497a5800, 0x58ec000c, 0x80000540, 0x04020004, 0x492dd80c, 0x492dd80d, 0x0401f007, @@ -18178,11 +18290,11 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x480fc857, 0x481bc857, 0x48efc857, 0x4819d801, 0x4801d803, 0x4809d806, 0x480dd807, 0x4805d805, 0x40ec1000, 0x0201f800, 0x00020016, 0x4a01d808, - 0x00102200, 0x1c01f000, 0x40681000, 0x406c1800, + 0x001022bf, 0x1c01f000, 0x40681000, 0x406c1800, 0x80002d80, 0x480bc857, 0x480fc857, 0x4813c857, 0x4817c857, 0x8d0e1d20, 0x04000005, 0x59a80005, - 0x8c000516, 0x02020000, 0x0010aef0, 0x4d2c0000, - 0x4da00000, 0x42034000, 0x0010c7ff, 0x59a00018, + 0x8c000516, 0x02020000, 0x0010b207, 0x4d2c0000, + 0x4da00000, 0x42034000, 0x0010caff, 0x59a00018, 0x800001c0, 0x0402000f, 0x0400600e, 0x480bc020, 0x480fc021, 0x4813c022, 0x4817c023, 0x900811c0, 0x82081540, 0x00000012, 0x480bc011, 0x4a03c017, @@ -18209,36 +18321,36 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x48143a01, 0x5c003800, 0x5c000800, 0x5c034000, 0x5c025800, 0x1c01f000, 0x40681800, 0x406c2000, 0x40703000, 0x480fc857, 0x4813c857, 0x481bc857, - 0x42000000, 0x0010cbe0, 0x0201f800, 0x0010bc88, + 0x42000000, 0x0010cee0, 0x0201f800, 0x0010bfb3, 0x801800d0, 0x81202d40, 0x42001000, 0x00008014, 0x0401f781, 0x4c000000, 0x599c0017, 0x8c000512, 0x5c000000, 0x1c01f000, 0x4c000000, 0x599c0018, 0x8c00050e, 0x5c000000, 0x1c01f000, 0x8d0e1d0e, 0x04000005, 0x4a034407, 0x00000001, 0x0201f000, - 0x0010224a, 0x836c0580, 0x00000003, 0x04000005, - 0x4a034407, 0x00000007, 0x0201f000, 0x0010224a, + 0x00102309, 0x836c0580, 0x00000003, 0x04000005, + 0x4a034407, 0x00000007, 0x0201f000, 0x00102309, 0x59a24805, 0x59240400, 0x8c000508, 0x04020005, - 0x4a034407, 0x00000008, 0x0201f000, 0x0010224a, + 0x4a034407, 0x00000008, 0x0201f000, 0x00102309, 0x59340405, 0x8c000508, 0x04020004, 0x8c00050a, - 0x02020000, 0x00103284, 0x497a5a05, 0x497a5806, - 0x4a025c05, 0x00008000, 0x0201f800, 0x001097d2, + 0x02020000, 0x00103374, 0x497a5a05, 0x497a5806, + 0x4a025c05, 0x00008000, 0x0201f800, 0x00109a0a, 0x04020005, 0x4a034407, 0x00000003, 0x0201f000, - 0x0010224a, 0x4a01d808, 0x00103970, 0x1c01f000, + 0x00102309, 0x4a01d808, 0x00103a60, 0x1c01f000, 0x592c0006, 0x82000580, 0x01000000, 0x04020005, - 0x4a034407, 0x00000004, 0x0201f000, 0x0010224a, - 0x59a28c07, 0x59a2440b, 0x0201f800, 0x0010497a, - 0x02020000, 0x0010224e, 0x0201f000, 0x00103284, - 0x4c040000, 0x59a2440b, 0x42000000, 0x0010ccd0, + 0x4a034407, 0x00000004, 0x0201f000, 0x00102309, + 0x59a28c07, 0x59a2440b, 0x0201f800, 0x00104a7c, + 0x02020000, 0x0010230d, 0x0201f000, 0x00103374, + 0x4c040000, 0x59a2440b, 0x42000000, 0x0010cfd0, 0x50000000, 0x81200480, 0x0402100d, 0x83200c00, - 0x0010bdc7, 0x50064800, 0x812649c0, 0x04000008, + 0x0010c10d, 0x50064800, 0x812649c0, 0x04000008, 0x59240200, 0x8c000500, 0x04000005, 0x49274005, 0x80000580, 0x5c000800, 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fc, 0x42028800, 0x000007ef, - 0x0201f800, 0x0002034c, 0x02000800, 0x00106314, + 0x0201f800, 0x0002034c, 0x02000800, 0x00106519, 0x81468840, 0x040217fb, 0x1c01f000, 0x4803c856, 0x4c0c0000, 0x4d340000, 0x4d440000, 0x42028800, 0x000007fe, 0x42024000, 0x00000000, 0x0201f800, - 0x0010497a, 0x04020009, 0x5934180a, 0x820c1d00, + 0x00104a7c, 0x04020009, 0x5934180a, 0x820c1d00, 0x00000001, 0x820c1d80, 0x00000001, 0x42001000, 0x0000801b, 0x0401ff0b, 0x5c028800, 0x5c026800, 0x5c001800, 0x1c01f000, 0x48efc857, 0x04011000, @@ -18246,7 +18358,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x040117ff, 0x4a01d80e, 0xbeefbeef, 0x1c01f000, 0x497b4000, 0x497b4001, 0x497b4002, 0x497b4003, 0x497b4004, 0x497b4005, 0x1c01f000, 0x42002000, - 0x00111264, 0x41580000, 0x41781000, 0x58100c07, + 0x00111584, 0x41580000, 0x41781000, 0x58100c07, 0x800409c0, 0x04000011, 0x82041d80, 0x00000003, 0x0400000e, 0x82041c80, 0x00000006, 0x0400100a, 0x82041d80, 0x0000000a, 0x04000007, 0x82041c80, @@ -18254,714 +18366,717 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04021002, 0x80081000, 0x82102400, 0x0000002c, 0x80100c80, 0x040017ea, 0x40080000, 0x59a81251, 0x80080480, 0x04021002, 0x41780000, 0x81640480, - 0x04021002, 0x41780000, 0x1c01f000, 0x59c400a4, - 0x4c580000, 0x4c500000, 0x4c540000, 0x82000500, - 0x0000000f, 0x82000480, 0x00000007, 0x0400100a, - 0x82006c80, 0x00000007, 0x02021800, 0x0010032e, - 0x0c01f807, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x1c01f000, 0x0401f919, 0x0401f7fb, 0x00103a06, - 0x00103a0c, 0x00103a35, 0x00103a57, 0x00103b1f, - 0x00103a05, 0x1c01f000, 0x59c40806, 0x8c040d00, - 0x04020003, 0x84040d40, 0x48078806, 0x1c01f000, - 0x59c40005, 0x8c000534, 0x02020000, 0x001041ce, - 0x4a038805, 0xffffffff, 0x42006000, 0x00020000, - 0x0201f800, 0x001041b3, 0x59a80015, 0x82000500, - 0xfffffffa, 0x84000542, 0x48035015, 0x497b521b, - 0x42000800, 0x0010df51, 0x45780800, 0x497b5056, - 0x42000000, 0x0010cccf, 0x46000000, 0x0000ffff, - 0x42006000, 0xffefffff, 0x42006800, 0x40000000, - 0x0201f800, 0x001041ad, 0x59c40006, 0x82000500, - 0xffffff0f, 0x48038806, 0x42000800, 0x00000010, - 0x42001000, 0x001040f1, 0x0201f800, 0x001062ec, - 0x0401f001, 0x42006000, 0xffffffff, 0x42006800, - 0x00800000, 0x0201f800, 0x001041ad, 0x4200b000, - 0x000000c8, 0x59c400a4, 0x82000500, 0x0000000f, - 0x82000580, 0x0000000a, 0x0400000f, 0x8058b040, - 0x040207f9, 0x497b5010, 0x42006000, 0xbf7fffff, - 0x42006800, 0x00018000, 0x0201f800, 0x001041ad, - 0x42006000, 0xfffeffff, 0x41786800, 0x0201f000, - 0x001041ad, 0x497b5010, 0x4a035055, 0x00000000, - 0x80000580, 0x0201f000, 0x001041ba, 0x4a038805, - 0xffffffff, 0x59a80055, 0x82000c80, 0x00000004, - 0x02021800, 0x0010032e, 0x0c01f001, 0x00103a62, - 0x00103a92, 0x00103b15, 0x4803c856, 0x59c400a3, - 0x8400051e, 0x480388a3, 0x4a035055, 0x00000001, - 0x59c40008, 0x82000540, 0x00000080, 0x48038808, - 0x0201f800, 0x00104191, 0x42007800, 0x0010c8a6, - 0x4a007806, 0x11010000, 0x4200a000, 0x0010ccd2, - 0x4200a800, 0x0010c8ad, 0x4200b000, 0x00000002, - 0x0201f800, 0x0010bd5b, 0x59c40802, 0x84040d0c, - 0x48078802, 0x42000800, 0x00000003, 0x497b505f, - 0x0201f800, 0x00104064, 0x4a03505f, 0x00000001, - 0x497b505a, 0x0201f800, 0x001041c1, 0x42006000, + 0x04021002, 0x41780000, 0x1c01f000, 0x59a80005, + 0x8c000514, 0x04000006, 0x42000000, 0x0010cb3e, + 0x50000000, 0x82000500, 0x00000028, 0x1c01f000, + 0x59c400a4, 0x4c580000, 0x4c500000, 0x4c540000, + 0x82000500, 0x0000000f, 0x82000480, 0x00000007, + 0x0400100a, 0x82006c80, 0x00000007, 0x02021800, + 0x0010032e, 0x0c01f807, 0x5c00a800, 0x5c00a000, + 0x5c00b000, 0x1c01f000, 0x0401f919, 0x0401f7fb, + 0x00103aff, 0x00103b05, 0x00103b2e, 0x00103b50, + 0x00103c18, 0x00103afe, 0x1c01f000, 0x59c40806, + 0x8c040d00, 0x04020003, 0x84040d40, 0x48078806, + 0x1c01f000, 0x59c40005, 0x8c000534, 0x02020000, + 0x001042c7, 0x4a038805, 0xffffffff, 0x42006000, + 0x00020000, 0x0201f800, 0x001042ac, 0x59a80015, + 0x82000500, 0xfffffffa, 0x84000542, 0x48035015, + 0x497b521b, 0x42000800, 0x0010e251, 0x45780800, + 0x497b5056, 0x42000000, 0x0010cfcf, 0x46000000, + 0x0000ffff, 0x42006000, 0xffefffff, 0x42006800, + 0x40000000, 0x0201f800, 0x001042a6, 0x59c40006, + 0x82000500, 0xffffff0f, 0x48038806, 0x42000800, + 0x00000010, 0x42001000, 0x001041ea, 0x0201f800, + 0x001064f1, 0x0401f001, 0x42006000, 0xffffffff, + 0x42006800, 0x00800000, 0x0201f800, 0x001042a6, + 0x4200b000, 0x000000c8, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x0000000a, 0x0400000f, + 0x8058b040, 0x040207f9, 0x497b5010, 0x42006000, + 0xbf7fffff, 0x42006800, 0x00018000, 0x0201f800, + 0x001042a6, 0x42006000, 0xfffeffff, 0x41786800, + 0x0201f000, 0x001042a6, 0x497b5010, 0x4a035055, + 0x00000000, 0x80000580, 0x0201f000, 0x001042b3, + 0x4a038805, 0xffffffff, 0x59a80055, 0x82000c80, + 0x00000004, 0x02021800, 0x0010032e, 0x0c01f001, + 0x00103b5b, 0x00103b8b, 0x00103c0e, 0x4803c856, + 0x59c400a3, 0x8400051e, 0x480388a3, 0x4a035055, + 0x00000001, 0x59c40008, 0x82000540, 0x00000080, + 0x48038808, 0x0201f800, 0x0010428a, 0x42007800, + 0x0010cba6, 0x4a007806, 0x11010000, 0x4200a000, + 0x0010cfd2, 0x4200a800, 0x0010cbad, 0x4200b000, + 0x00000002, 0x0201f800, 0x0010c086, 0x59c40802, + 0x84040d0c, 0x48078802, 0x42000800, 0x00000003, + 0x497b505f, 0x0201f800, 0x0010415d, 0x4a03505f, + 0x00000001, 0x497b505a, 0x0201f800, 0x001042ba, + 0x42006000, 0xffffffff, 0x42006800, 0x00080000, + 0x0201f800, 0x001042a6, 0x42006000, 0xfff7ffff, + 0x41786800, 0x0201f000, 0x001042a6, 0x59a8005a, + 0x497b505a, 0x80002540, 0x04000070, 0x59c40004, + 0x82000500, 0x00000003, 0x0402007b, 0x59a80815, + 0x8c040d02, 0x04000055, 0x82100580, 0x0000000c, + 0x04020059, 0x82100400, 0x00000018, 0x8000b104, + 0x41cc1000, 0x42001800, 0x0010cba6, 0x50080800, + 0x500c0000, 0x80040580, 0x04020021, 0x80081000, + 0x800c1800, 0x8058b040, 0x040207f9, 0x0201f800, + 0x001042ba, 0x59c80015, 0x84000508, 0x48039015, + 0x42006000, 0xffffffff, 0x42006800, 0x00500000, + 0x0201f800, 0x001042a6, 0x4a035055, 0x00000002, + 0x4a035010, 0x00000002, 0x0201f800, 0x001015ba, + 0x42000800, 0x000007d0, 0x42001000, 0x00104131, + 0x0201f800, 0x00106638, 0x59a80015, 0x84000506, + 0x48035015, 0x0201f000, 0x0010428a, 0x59cc0806, + 0x82040d80, 0x11010000, 0x0402002b, 0x59cc0800, + 0x82040500, 0x00ffffff, 0x0400001a, 0x82000580, + 0x000000ef, 0x04020017, 0x59cc0801, 0x82040500, + 0x00ffffff, 0x82000580, 0x000000ef, 0x04020011, + 0x83cca400, 0x00000007, 0x4200a800, 0x0010cfd2, + 0x4200b000, 0x00000002, 0x50500800, 0x50540000, + 0x80040480, 0x04001007, 0x04020013, 0x8050a000, + 0x8054a800, 0x8058b040, 0x040207f8, 0x0401f00e, + 0x59a80015, 0x84000502, 0x48035015, 0x59c80015, + 0x84000508, 0x48039015, 0x41cca000, 0x4200a800, + 0x0010cba6, 0x4200b000, 0x00000009, 0x0201f800, + 0x0010c086, 0x0201f800, 0x001042ba, 0x42006000, 0xffffffff, 0x42006800, 0x00080000, 0x0201f800, - 0x001041ad, 0x42006000, 0xfff7ffff, 0x41786800, - 0x0201f000, 0x001041ad, 0x59a8005a, 0x497b505a, - 0x80002540, 0x04000070, 0x59c40004, 0x82000500, - 0x00000003, 0x0402007b, 0x59a80815, 0x8c040d02, - 0x04000055, 0x82100580, 0x0000000c, 0x04020059, - 0x82100400, 0x00000018, 0x8000b104, 0x41cc1000, - 0x42001800, 0x0010c8a6, 0x50080800, 0x500c0000, - 0x80040580, 0x04020021, 0x80081000, 0x800c1800, - 0x8058b040, 0x040207f9, 0x0201f800, 0x001041c1, - 0x59c80015, 0x84000508, 0x48039015, 0x42006000, - 0xffffffff, 0x42006800, 0x00500000, 0x0201f800, - 0x001041ad, 0x4a035055, 0x00000002, 0x4a035010, - 0x00000002, 0x0201f800, 0x001015b9, 0x42000800, - 0x000007d0, 0x42001000, 0x00104038, 0x0201f800, - 0x00106433, 0x59a80015, 0x84000506, 0x48035015, - 0x0201f000, 0x00104191, 0x59cc0806, 0x82040d80, - 0x11010000, 0x0402002b, 0x59cc0800, 0x82040500, - 0x00ffffff, 0x0400001a, 0x82000580, 0x000000ef, - 0x04020017, 0x59cc0801, 0x82040500, 0x00ffffff, - 0x82000580, 0x000000ef, 0x04020011, 0x83cca400, - 0x00000007, 0x4200a800, 0x0010ccd2, 0x4200b000, - 0x00000002, 0x50500800, 0x50540000, 0x80040480, - 0x04001007, 0x04020013, 0x8050a000, 0x8054a800, - 0x8058b040, 0x040207f8, 0x0401f00e, 0x59a80015, - 0x84000502, 0x48035015, 0x59c80015, 0x84000508, - 0x48039015, 0x41cca000, 0x4200a800, 0x0010c8a6, - 0x4200b000, 0x00000009, 0x0201f800, 0x0010bd5b, - 0x0201f800, 0x001041c1, 0x42006000, 0xffffffff, - 0x42006800, 0x00080000, 0x0201f800, 0x001041ad, - 0x42006000, 0xfff7ffff, 0x41786800, 0x0201f800, - 0x001041ad, 0x42006000, 0xffffffff, 0x42006800, - 0x00004000, 0x0201f800, 0x001041ad, 0x59c40004, - 0x82000500, 0x00000003, 0x04020006, 0x497b505a, - 0x42000800, 0x00000003, 0x0201f000, 0x00104064, - 0x1c01f000, 0x1c01f000, 0x59a80010, 0x82006d80, - 0x0000000f, 0x04000005, 0x82000580, 0x0000001b, - 0x02020800, 0x0010402d, 0x1c01f000, 0x59a80015, - 0x84000506, 0x48035015, 0x497b505f, 0x59a80010, - 0x82000c80, 0x0000001e, 0x02021800, 0x0010032e, - 0x0c01f001, 0x00103b5d, 0x00103b74, 0x00103b9d, - 0x00103bc0, 0x00103be3, 0x00103be7, 0x00103beb, - 0x00103bef, 0x00103bf3, 0x00103c0f, 0x00103c13, - 0x00103c6c, 0x00103c70, 0x00103c82, 0x00103c86, - 0x00103c9f, 0x00103ca4, 0x00103d00, 0x00103d2c, - 0x00103db0, 0x00103ddc, 0x00103e34, 0x00103e84, - 0x00103ede, 0x00103eff, 0x00103f48, 0x00103f6a, - 0x00103f7d, 0x00103f7e, 0x4803c856, 0x4202d800, - 0x00000007, 0x0201f800, 0x00104fc6, 0x04000007, - 0x42006000, 0xffffffd7, 0x41786800, 0x0201f800, - 0x001041ad, 0x0401f00b, 0x59c40006, 0x82000500, - 0xffffff0f, 0x48038806, 0x4a038805, 0x000000f0, - 0x0201f800, 0x0010541d, 0x0201f800, 0x00104f15, - 0x1c01f000, 0x4803c856, 0x42006000, 0xbf7fffff, - 0x42006800, 0x00400000, 0x0201f800, 0x001041ad, - 0x0201f800, 0x001015b9, 0x4a035010, 0x00000001, - 0x42001000, 0x001040f1, 0x0201f800, 0x0010630c, - 0x0201f800, 0x001040fa, 0x42000800, 0x000007d0, - 0x42001000, 0x00104038, 0x0201f000, 0x00106433, - 0x59a8005a, 0x82000580, 0x00000014, 0x04020023, - 0x4803c857, 0x42006000, 0xffbfffff, 0x41786800, - 0x0201f800, 0x001041ad, 0x59c40004, 0x82000500, - 0x00000003, 0x04020019, 0x42001000, 0x00104038, - 0x0201f800, 0x001062f9, 0x59cc1006, 0x82081580, - 0x11020000, 0x04020012, 0x59cc1007, 0x8c08153e, - 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, - 0x42000000, 0x0010cb71, 0x0201f800, 0x0010bc88, - 0x59a80015, 0x84000544, 0x48035015, 0x4a035010, - 0x00000010, 0x0401f10b, 0x1c01f000, 0x0201f000, - 0x0010402d, 0x4803c856, 0x4a035010, 0x00000003, - 0x42006000, 0xbf3fffff, 0x42006800, 0x00100000, - 0x0201f800, 0x001041ad, 0x42001000, 0x001040f1, - 0x0201f800, 0x0010630c, 0x0201f800, 0x001040fa, - 0x42001000, 0x00104038, 0x0201f800, 0x001062f9, - 0x59a8041b, 0x82000500, 0x00000028, 0x04000005, - 0x42000800, 0xfffff815, 0x0201f800, 0x00102011, - 0x42007800, 0x0010c8ac, 0x46007800, 0x11020000, - 0x42000800, 0x00000005, 0x0201f000, 0x00104064, - 0x59a8005a, 0x80000540, 0x0400001e, 0x4803c857, - 0x42001000, 0x00104038, 0x0201f800, 0x001062f9, - 0x59a8005a, 0x82000580, 0x00000014, 0x04020016, - 0x59cc1006, 0x82081580, 0x11020000, 0x04020012, - 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, - 0x8c000504, 0x04020008, 0x42000000, 0x0010cb71, - 0x0201f800, 0x0010bc88, 0x59a80015, 0x84000544, - 0x48035015, 0x4a035010, 0x00000004, 0x0401f004, - 0x1c01f000, 0x0201f000, 0x0010402d, 0x4803c856, - 0x4a035010, 0x00000005, 0x0401f149, 0x4c5c0000, - 0x4200b800, 0x00000001, 0x0401f118, 0x4803c856, - 0x4a035010, 0x00000007, 0x0401f1f1, 0x4c5c0000, - 0x4200b800, 0x00000001, 0x0401f1c0, 0x4803c856, - 0x4a035010, 0x00000009, 0x83cca400, 0x00000006, - 0x4200a800, 0x0010c8ac, 0x4200b000, 0x00000005, - 0x0201f800, 0x0010bd5b, 0x42007800, 0x0010c8ac, - 0x46007800, 0x11050100, 0x8d0e1d06, 0x04000296, - 0x42000800, 0x00000005, 0x0201f800, 0x00104064, - 0x4d3c0000, 0x42027800, 0x00000001, 0x0201f800, - 0x0010a004, 0x5c027800, 0x1c01f000, 0x4c5c0000, - 0x4200b800, 0x00000001, 0x0401f224, 0x4803c856, - 0x4a035010, 0x0000000b, 0x42001000, 0x0010c8ad, - 0x4008a800, 0x4200b000, 0x00000020, 0x4600a800, - 0xffffffff, 0x8054a800, 0x8058b040, 0x040207fc, - 0x42007800, 0x0010c8ac, 0x46007800, 0x11060000, - 0x8d0e1d06, 0x04000005, 0x50080000, 0x46001000, - 0x00ffffff, 0x0401f040, 0x42024800, 0x0010ccd1, - 0x0201f800, 0x0010bda3, 0x40083000, 0x41782800, - 0x41781800, 0x41782000, 0x59240200, 0x8c000500, - 0x04000012, 0x8c000502, 0x04000010, 0x801429c0, - 0x04020002, 0x800c1800, 0x80142800, 0x59244408, - 0x82204500, 0x000000ff, 0x400c0000, 0x50182000, - 0x0c01f811, 0x80102540, 0x44103000, 0x800c19c0, - 0x04020002, 0x80183000, 0x83264c00, 0x0000000b, - 0x8058b040, 0x040207e9, 0x50080000, 0x82000500, - 0x00ffffff, 0x801428f0, 0x80140540, 0x44001000, - 0x0401f019, 0x00103c55, 0x00103c5a, 0x00103c5f, - 0x00103c64, 0x802000f0, 0x82102500, 0x00ffffff, - 0x800c1800, 0x1c01f000, 0x802000e0, 0x82102500, - 0xff00ffff, 0x800c1800, 0x1c01f000, 0x802000d0, - 0x82102500, 0xffff00ff, 0x800c1800, 0x1c01f000, - 0x40200000, 0x82102500, 0xffffff00, 0x41781800, - 0x1c01f000, 0x42000800, 0x00000021, 0x0401f3f9, - 0x4c5c0000, 0x4200b800, 0x00000001, 0x0401f271, - 0x4803c856, 0x4a035010, 0x0000000d, 0x83cca400, - 0x00000006, 0x4200a800, 0x0010c8ac, 0x4200b000, - 0x00000021, 0x0201f800, 0x0010bd5b, 0x42007800, - 0x0010c8ac, 0x46007800, 0x11070000, 0x42000800, - 0x00000021, 0x0401f3e3, 0x4c5c0000, 0x4200b800, - 0x00000001, 0x0401f2c5, 0x4803c856, 0x82040d40, - 0x00000001, 0x0201f800, 0x001041ba, 0x4a035010, - 0x0000000f, 0x497b505a, 0x42006000, 0xffffffff, - 0x42006800, 0x00300000, 0x0201f800, 0x001041ad, - 0x42006000, 0xffdfffff, 0x41786800, 0x0201f800, - 0x001041ad, 0x42000800, 0x000007d0, 0x42001000, - 0x00104038, 0x0201f000, 0x001062d0, 0x4803c856, - 0x59a8005a, 0x80000540, 0x0402038b, 0x1c01f000, - 0x4803c856, 0x4a035010, 0x00000011, 0x83cca400, - 0x00000006, 0x4200a800, 0x0010c8ac, 0x4200b000, - 0x00000005, 0x0201f800, 0x0010bd5b, 0x4200a800, - 0x0010c8ac, 0x4600a800, 0x11020000, 0x8d0e1d06, - 0x04020049, 0x59a80c1b, 0x82040580, 0x0000ffff, - 0x04000045, 0x82040d00, 0x00000030, 0x04000006, - 0x42000800, 0xfffff815, 0x0201f800, 0x00102011, - 0x0401f03d, 0x59cc0007, 0x8c00053c, 0x0400003a, - 0x42024800, 0x0010ccd1, 0x0201f800, 0x0010bda3, - 0x59240200, 0x82000d00, 0x00000063, 0x82040d80, - 0x00000063, 0x04020023, 0x59240a08, 0x42001000, - 0x0010c8ad, 0x0401fb08, 0x0400000a, 0x59240c08, - 0x0201f800, 0x001015d1, 0x59240200, 0x84000502, - 0x84000518, 0x84000544, 0x48024a00, 0x0401f015, - 0x59240200, 0x82000540, 0x00001006, 0x84000506, - 0x48024a00, 0x48064a08, 0x82042c00, 0x00102057, - 0x50142800, 0x82142d00, 0x000000ff, 0x48164c08, - 0x59240005, 0x82000500, 0x00ffff00, 0x80140d40, - 0x48064805, 0x40140800, 0x0201f800, 0x001015c4, - 0x83264c00, 0x0000000b, 0x8058b040, 0x040207d5, - 0x42024800, 0x0010ccd1, 0x59242a00, 0x8c142d02, - 0x04000005, 0x8c142d00, 0x04000003, 0x59242c08, - 0x4817500f, 0x42000800, 0x00000005, 0x0401f365, - 0x4c5c0000, 0x4178b800, 0x59a8005a, 0x80000540, - 0x04000026, 0x4803c857, 0x42001000, 0x00104038, - 0x0201f800, 0x001062f9, 0x59a8005a, 0x82000580, - 0x00000014, 0x0402001c, 0x59cc1006, 0x82081580, - 0x11030000, 0x04020018, 0x59cc1007, 0x8c08153e, - 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, - 0x42000000, 0x0010cb71, 0x0201f800, 0x0010bc88, - 0x59a80015, 0x84000544, 0x48035015, 0x805cb9c0, - 0x04000005, 0x4a035010, 0x00000006, 0x0401fec8, - 0x0401f006, 0x4a035010, 0x00000012, 0x0401f805, - 0x0401f002, 0x0401fb04, 0x5c00b800, 0x1c01f000, - 0x4803c856, 0x4a035010, 0x00000013, 0x83cca400, - 0x00000007, 0x4200a800, 0x0010c8ad, 0x4200b000, - 0x00000004, 0x0201f800, 0x0010bd5b, 0x4200a800, - 0x0010c8ac, 0x4600a800, 0x11030000, 0x8d0e1d06, - 0x04020071, 0x42024800, 0x0010ccd1, 0x0201f800, - 0x0010bda3, 0x4c600000, 0x4178c000, 0x59a8021b, - 0x82000500, 0xfffffffc, 0x4803521b, 0x59240200, - 0x40000800, 0x82040d00, 0xfffffb17, 0x48064a00, - 0x8c000500, 0x0400004d, 0x8c000518, 0x0402004b, - 0x8c000502, 0x04020004, 0x59240400, 0x8c000502, - 0x04000046, 0x59240a08, 0x42001000, 0x0010c8ad, - 0x0401fa81, 0x0400002e, 0x59240005, 0x82000500, - 0x00ffff00, 0x48024805, 0x59240200, 0x8c000502, - 0x0400001c, 0x59240207, 0x82000500, 0x0000ffff, - 0x04000018, 0x8060c000, 0x59240c08, 0x0201f800, - 0x001015d1, 0x4c640000, 0x4c580000, 0x4d2c0000, - 0x5924c809, 0x4200b000, 0x00000010, 0x50640000, - 0x800001c0, 0x04000005, 0x4578c800, 0x40025800, - 0x0201f800, 0x00100594, 0x8064c800, 0x8058b040, - 0x040207f7, 0x5c025800, 0x5c00b000, 0x5c00c800, - 0x59240200, 0x84000502, 0x84000544, 0x48024a00, - 0x59240400, 0x8c000504, 0x04000018, 0x59240200, - 0x84000546, 0x48024a00, 0x0401f014, 0x59240200, - 0x82000540, 0x00000006, 0x84000506, 0x48024a00, - 0x82042c00, 0x00102057, 0x50142800, 0x82142d00, - 0x000000ff, 0x48164c08, 0x59240005, 0x82000500, - 0x00ffff00, 0x80140d40, 0x48064805, 0x40140800, - 0x0201f800, 0x001015c4, 0x59240200, 0x84000518, - 0x48024a00, 0x83264c00, 0x0000000b, 0x8058b040, - 0x040207a7, 0x8060c1c0, 0x04020b72, 0x5c00c000, - 0x42024800, 0x0010ccd1, 0x59242a00, 0x8c142d02, - 0x04000005, 0x8c142d00, 0x04000003, 0x59242c08, - 0x4817500f, 0x42000800, 0x00000005, 0x0401f2b5, - 0x4c5c0000, 0x4178b800, 0x59a8005a, 0x80000540, - 0x04000026, 0x4803c857, 0x42001000, 0x00104038, - 0x0201f800, 0x001062f9, 0x59a8005a, 0x82000580, - 0x00000014, 0x0402001c, 0x59cc1006, 0x82081580, - 0x11040000, 0x04020018, 0x59cc1007, 0x8c08153e, - 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, - 0x42000000, 0x0010cb71, 0x0201f800, 0x0010bc88, - 0x59a80015, 0x84000544, 0x48035015, 0x805cb9c0, - 0x04000005, 0x4a035010, 0x00000008, 0x0401fe20, - 0x0401f006, 0x4a035010, 0x00000014, 0x0401f805, - 0x0401f002, 0x0401fa54, 0x5c00b800, 0x1c01f000, - 0x4803c856, 0x4a035010, 0x00000015, 0x83cca400, - 0x00000007, 0x4200a800, 0x0010c8ad, 0x4200b000, - 0x00000004, 0x0201f800, 0x0010bd5b, 0x4200a800, - 0x0010c8ac, 0x4600a800, 0x11040000, 0x8d0e1d06, - 0x04020045, 0x42024800, 0x0010ccd1, 0x0201f800, - 0x0010bda3, 0x59240400, 0x8c000500, 0x04000031, - 0x59240200, 0x8c000500, 0x0400002e, 0x8c000502, - 0x0402002c, 0x59240c00, 0x80040910, 0x82040d00, - 0x000000ff, 0x42001000, 0x0010c8ad, 0x0401f9da, - 0x04000010, 0x59240005, 0x82000500, 0x00ffff00, - 0x48024805, 0x59240200, 0x84000502, 0x48024a00, - 0x59242400, 0x8c102504, 0x0400001a, 0x84000546, - 0x84000544, 0x48024a00, 0x8060c000, 0x0401f015, - 0x59240200, 0x82000540, 0x00000006, 0x84000506, - 0x48024a00, 0x48064a08, 0x82042c00, 0x00102057, - 0x50142800, 0x82142d00, 0x000000ff, 0x48164c08, - 0x59240005, 0x82000500, 0x00ffff00, 0x80140d40, - 0x48064805, 0x40140800, 0x0201f800, 0x001015c4, - 0x83264c00, 0x0000000b, 0x8058b040, 0x040207ca, - 0x42024800, 0x0010ccd1, 0x59242a00, 0x8c142d02, - 0x04000005, 0x8c142d00, 0x04000003, 0x59242c08, - 0x4817500f, 0x42000800, 0x00000005, 0x0401f231, - 0x4c5c0000, 0x4178b800, 0x59a8005a, 0x80000540, - 0x0400004a, 0x4803c857, 0x42001000, 0x00104038, - 0x0201f800, 0x001062f9, 0x59a8005a, 0x82000580, - 0x00000014, 0x04020040, 0x59cc1006, 0x82080500, - 0x11050000, 0x82000580, 0x11050000, 0x0402003a, - 0x8c081510, 0x04000015, 0x0401fb70, 0x59cc1007, + 0x001042a6, 0x42006000, 0xfff7ffff, 0x41786800, + 0x0201f800, 0x001042a6, 0x42006000, 0xffffffff, + 0x42006800, 0x00004000, 0x0201f800, 0x001042a6, + 0x59c40004, 0x82000500, 0x00000003, 0x04020006, + 0x497b505a, 0x42000800, 0x00000003, 0x0201f000, + 0x0010415d, 0x1c01f000, 0x1c01f000, 0x59a80010, + 0x82006d80, 0x0000000f, 0x04000005, 0x82000580, + 0x0000001b, 0x02020800, 0x00104126, 0x1c01f000, + 0x59a80015, 0x84000506, 0x48035015, 0x497b505f, + 0x59a80010, 0x82000c80, 0x0000001e, 0x02021800, + 0x0010032e, 0x0c01f001, 0x00103c56, 0x00103c6d, + 0x00103c96, 0x00103cb9, 0x00103cdc, 0x00103ce0, + 0x00103ce4, 0x00103ce8, 0x00103cec, 0x00103d08, + 0x00103d0c, 0x00103d65, 0x00103d69, 0x00103d7b, + 0x00103d7f, 0x00103d98, 0x00103d9d, 0x00103df9, + 0x00103e25, 0x00103ea9, 0x00103ed5, 0x00103f2d, + 0x00103f7d, 0x00103fd7, 0x00103ff8, 0x00104041, + 0x00104063, 0x00104076, 0x00104077, 0x4803c856, + 0x4202d800, 0x00000007, 0x0201f800, 0x001050f7, + 0x04000007, 0x42006000, 0xffffffd7, 0x41786800, + 0x0201f800, 0x001042a6, 0x0401f00b, 0x59c40006, + 0x82000500, 0xffffff0f, 0x48038806, 0x4a038805, + 0x000000f0, 0x0201f800, 0x0010554e, 0x0201f800, + 0x00105046, 0x1c01f000, 0x4803c856, 0x42006000, + 0xbf7fffff, 0x42006800, 0x00400000, 0x0201f800, + 0x001042a6, 0x0201f800, 0x001015ba, 0x4a035010, + 0x00000001, 0x42001000, 0x001041ea, 0x0201f800, + 0x00106511, 0x0201f800, 0x001041f3, 0x42000800, + 0x000007d0, 0x42001000, 0x00104131, 0x0201f000, + 0x00106638, 0x59a8005a, 0x82000580, 0x00000014, + 0x04020023, 0x4803c857, 0x42006000, 0xffbfffff, + 0x41786800, 0x0201f800, 0x001042a6, 0x59c40004, + 0x82000500, 0x00000003, 0x04020019, 0x42001000, + 0x00104131, 0x0201f800, 0x001064fe, 0x59cc1006, + 0x82081580, 0x11020000, 0x04020012, 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, - 0x04020008, 0x42000000, 0x0010cb71, 0x0201f800, - 0x0010bc88, 0x59a80015, 0x84000544, 0x48035015, - 0x805cb9c0, 0x04000017, 0x4a035010, 0x0000000a, - 0x0401fdb7, 0x0401f025, 0x59cc1007, 0x8c08153e, - 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, - 0x42000000, 0x0010cb71, 0x0201f800, 0x0010bc88, - 0x59a80015, 0x84000544, 0x48035015, 0x82000540, - 0x00000001, 0x0401fb4d, 0x497b5056, 0x0401f003, - 0x4a035056, 0x00000001, 0x59cc1007, 0x8c08153c, - 0x04000003, 0x4a03521b, 0x00000008, 0x805cb9c0, - 0x04020005, 0x4a035010, 0x00000016, 0x0401f809, - 0x0401f006, 0x4a035010, 0x0000000e, 0x0401fe07, - 0x0401f002, 0x0401f9ac, 0x5c00b800, 0x1c01f000, - 0x4803c856, 0x83cca400, 0x00000006, 0x4200a800, - 0x0010c8ac, 0x4200b000, 0x00000005, 0x0201f800, - 0x0010bd5b, 0x4a035010, 0x00000017, 0x59a80056, - 0x8c000500, 0x04000006, 0x42001000, 0x0010c8ac, - 0x46001000, 0x11050100, 0x0401f003, 0x4a035010, - 0x0000001b, 0x42024800, 0x0010ccd1, 0x0201f800, - 0x0010bda3, 0x599c2817, 0x59240200, 0x8c000500, - 0x04000027, 0x8c000502, 0x04020025, 0x8c000506, - 0x04020023, 0x4c580000, 0x0401f8d9, 0x5c00b000, - 0x0402000b, 0x59240005, 0x82000500, 0x00ffff00, - 0x48024805, 0x59240200, 0x84000502, 0x84000546, - 0x84000544, 0x48024a00, 0x0401f015, 0x59240200, - 0x82000540, 0x00000006, 0x84000506, 0x48024a00, - 0x48064a08, 0x82042c00, 0x00102057, 0x50142800, + 0x04020008, 0x42000000, 0x0010ce71, 0x0201f800, + 0x0010bfb3, 0x59a80015, 0x84000544, 0x48035015, + 0x4a035010, 0x00000010, 0x0401f10b, 0x1c01f000, + 0x0201f000, 0x00104126, 0x4803c856, 0x4a035010, + 0x00000003, 0x42006000, 0xbf3fffff, 0x42006800, + 0x00100000, 0x0201f800, 0x001042a6, 0x42001000, + 0x001041ea, 0x0201f800, 0x00106511, 0x0201f800, + 0x001041f3, 0x42001000, 0x00104131, 0x0201f800, + 0x001064fe, 0x59a8041b, 0x82000500, 0x00000028, + 0x04000005, 0x42000800, 0xffffd815, 0x0201f800, + 0x00102078, 0x42007800, 0x0010cbac, 0x46007800, + 0x11020000, 0x42000800, 0x00000005, 0x0201f000, + 0x0010415d, 0x59a8005a, 0x80000540, 0x0400001e, + 0x4803c857, 0x42001000, 0x00104131, 0x0201f800, + 0x001064fe, 0x59a8005a, 0x82000580, 0x00000014, + 0x04020016, 0x59cc1006, 0x82081580, 0x11020000, + 0x04020012, 0x59cc1007, 0x8c08153e, 0x0400000b, + 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, + 0x0010ce71, 0x0201f800, 0x0010bfb3, 0x59a80015, + 0x84000544, 0x48035015, 0x4a035010, 0x00000004, + 0x0401f004, 0x1c01f000, 0x0201f000, 0x00104126, + 0x4803c856, 0x4a035010, 0x00000005, 0x0401f149, + 0x4c5c0000, 0x4200b800, 0x00000001, 0x0401f118, + 0x4803c856, 0x4a035010, 0x00000007, 0x0401f1f1, + 0x4c5c0000, 0x4200b800, 0x00000001, 0x0401f1c0, + 0x4803c856, 0x4a035010, 0x00000009, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010cbac, 0x4200b000, + 0x00000005, 0x0201f800, 0x0010c086, 0x42007800, + 0x0010cbac, 0x46007800, 0x11050100, 0x8d0e1d06, + 0x04000296, 0x42000800, 0x00000005, 0x0201f800, + 0x0010415d, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x0010a242, 0x5c027800, 0x1c01f000, + 0x4c5c0000, 0x4200b800, 0x00000001, 0x0401f224, + 0x4803c856, 0x4a035010, 0x0000000b, 0x42001000, + 0x0010cbad, 0x4008a800, 0x4200b000, 0x00000020, + 0x4600a800, 0xffffffff, 0x8054a800, 0x8058b040, + 0x040207fc, 0x42007800, 0x0010cbac, 0x46007800, + 0x11060000, 0x8d0e1d06, 0x04000005, 0x50080000, + 0x46001000, 0x00ffffff, 0x0401f040, 0x42024800, + 0x0010cfd1, 0x0201f800, 0x0010c0ce, 0x40083000, + 0x41782800, 0x41781800, 0x41782000, 0x59240200, + 0x8c000500, 0x04000012, 0x8c000502, 0x04000010, + 0x801429c0, 0x04020002, 0x800c1800, 0x80142800, + 0x59244408, 0x82204500, 0x000000ff, 0x400c0000, + 0x50182000, 0x0c01f811, 0x80102540, 0x44103000, + 0x800c19c0, 0x04020002, 0x80183000, 0x83264c00, + 0x0000000b, 0x8058b040, 0x040207e9, 0x50080000, + 0x82000500, 0x00ffffff, 0x801428f0, 0x80140540, + 0x44001000, 0x0401f019, 0x00103d4e, 0x00103d53, + 0x00103d58, 0x00103d5d, 0x802000f0, 0x82102500, + 0x00ffffff, 0x800c1800, 0x1c01f000, 0x802000e0, + 0x82102500, 0xff00ffff, 0x800c1800, 0x1c01f000, + 0x802000d0, 0x82102500, 0xffff00ff, 0x800c1800, + 0x1c01f000, 0x40200000, 0x82102500, 0xffffff00, + 0x41781800, 0x1c01f000, 0x42000800, 0x00000021, + 0x0401f3f9, 0x4c5c0000, 0x4200b800, 0x00000001, + 0x0401f271, 0x4803c856, 0x4a035010, 0x0000000d, + 0x83cca400, 0x00000006, 0x4200a800, 0x0010cbac, + 0x4200b000, 0x00000021, 0x0201f800, 0x0010c086, + 0x42007800, 0x0010cbac, 0x46007800, 0x11070000, + 0x42000800, 0x00000021, 0x0401f3e3, 0x4c5c0000, + 0x4200b800, 0x00000001, 0x0401f2c5, 0x4803c856, + 0x82040d40, 0x00000001, 0x0201f800, 0x001042b3, + 0x4a035010, 0x0000000f, 0x497b505a, 0x42006000, + 0xffffffff, 0x42006800, 0x00300000, 0x0201f800, + 0x001042a6, 0x42006000, 0xffdfffff, 0x41786800, + 0x0201f800, 0x001042a6, 0x42000800, 0x000007d0, + 0x42001000, 0x00104131, 0x0201f000, 0x001064d5, + 0x4803c856, 0x59a8005a, 0x80000540, 0x0402038b, + 0x1c01f000, 0x4803c856, 0x4a035010, 0x00000011, + 0x83cca400, 0x00000006, 0x4200a800, 0x0010cbac, + 0x4200b000, 0x00000005, 0x0201f800, 0x0010c086, + 0x4200a800, 0x0010cbac, 0x4600a800, 0x11020000, + 0x8d0e1d06, 0x04020049, 0x59a80c1b, 0x82040580, + 0x0000ffff, 0x04000045, 0x82040d00, 0x00000030, + 0x04000006, 0x42000800, 0xffffd815, 0x0201f800, + 0x00102078, 0x0401f03d, 0x59cc0007, 0x8c00053c, + 0x0400003a, 0x42024800, 0x0010cfd1, 0x0201f800, + 0x0010c0ce, 0x59240200, 0x82000d00, 0x00000063, + 0x82040d80, 0x00000063, 0x04020023, 0x59240a08, + 0x42001000, 0x0010cbad, 0x0401fb08, 0x0400000a, + 0x59240c08, 0x0201f800, 0x001015d6, 0x59240200, + 0x84000502, 0x84000518, 0x84000544, 0x48024a00, + 0x0401f015, 0x59240200, 0x82000540, 0x00001006, + 0x84000506, 0x48024a00, 0x48064a08, 0x82042c00, + 0x00102116, 0x50142800, 0x82142d00, 0x000000ff, + 0x48164c08, 0x59240005, 0x82000500, 0x00ffff00, + 0x80140d40, 0x48064805, 0x40140800, 0x0201f800, + 0x001015c5, 0x83264c00, 0x0000000b, 0x8058b040, + 0x040207d5, 0x42024800, 0x0010cfd1, 0x59242a00, + 0x8c142d02, 0x04000005, 0x8c142d00, 0x04000003, + 0x59242c08, 0x4817500f, 0x42000800, 0x00000005, + 0x0401f365, 0x4c5c0000, 0x4178b800, 0x59a8005a, + 0x80000540, 0x04000026, 0x4803c857, 0x42001000, + 0x00104131, 0x0201f800, 0x001064fe, 0x59a8005a, + 0x82000580, 0x00000014, 0x0402001c, 0x59cc1006, + 0x82081580, 0x11030000, 0x04020018, 0x59cc1007, + 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, + 0x04020008, 0x42000000, 0x0010ce71, 0x0201f800, + 0x0010bfb3, 0x59a80015, 0x84000544, 0x48035015, + 0x805cb9c0, 0x04000005, 0x4a035010, 0x00000006, + 0x0401fec8, 0x0401f006, 0x4a035010, 0x00000012, + 0x0401f805, 0x0401f002, 0x0401fb04, 0x5c00b800, + 0x1c01f000, 0x4803c856, 0x4a035010, 0x00000013, + 0x83cca400, 0x00000007, 0x4200a800, 0x0010cbad, + 0x4200b000, 0x00000004, 0x0201f800, 0x0010c086, + 0x4200a800, 0x0010cbac, 0x4600a800, 0x11030000, + 0x8d0e1d06, 0x04020071, 0x42024800, 0x0010cfd1, + 0x0201f800, 0x0010c0ce, 0x4c600000, 0x4178c000, + 0x59a8021b, 0x82000500, 0xfffffffc, 0x4803521b, + 0x59240200, 0x40000800, 0x82040d00, 0xfffffb17, + 0x48064a00, 0x8c000500, 0x0400004d, 0x8c000518, + 0x0402004b, 0x8c000502, 0x04020004, 0x59240400, + 0x8c000502, 0x04000046, 0x59240a08, 0x42001000, + 0x0010cbad, 0x0401fa81, 0x0400002e, 0x59240005, + 0x82000500, 0x00ffff00, 0x48024805, 0x59240200, + 0x8c000502, 0x0400001c, 0x59240207, 0x82000500, + 0x0000ffff, 0x04000018, 0x8060c000, 0x59240c08, + 0x0201f800, 0x001015d6, 0x4c640000, 0x4c580000, + 0x4d2c0000, 0x5924c809, 0x4200b000, 0x00000010, + 0x50640000, 0x800001c0, 0x04000005, 0x4578c800, + 0x40025800, 0x0201f800, 0x00100594, 0x8064c800, + 0x8058b040, 0x040207f7, 0x5c025800, 0x5c00b000, + 0x5c00c800, 0x59240200, 0x84000502, 0x84000544, + 0x48024a00, 0x59240400, 0x8c000504, 0x04000018, + 0x59240200, 0x84000546, 0x48024a00, 0x0401f014, + 0x59240200, 0x82000540, 0x00000006, 0x84000506, + 0x48024a00, 0x82042c00, 0x00102116, 0x50142800, 0x82142d00, 0x000000ff, 0x48164c08, 0x59240005, 0x82000500, 0x00ffff00, 0x80140d40, 0x48064805, - 0x40140800, 0x0201f800, 0x001015c4, 0x83264c00, - 0x0000000b, 0x8058b040, 0x040207d4, 0x42024800, - 0x0010ccd1, 0x59242a00, 0x8c142d02, 0x04000005, - 0x8c142d00, 0x04000003, 0x59242c08, 0x4817500f, - 0x42000800, 0x00000005, 0x0401f98e, 0x4d3c0000, - 0x42027800, 0x00000001, 0x0201f800, 0x0010a004, - 0x5c027800, 0x1c01f000, 0x4c5c0000, 0x4178b800, - 0x59a8005a, 0x80000540, 0x0400001b, 0x4803c857, - 0x42001000, 0x00104038, 0x0201f800, 0x001062f9, - 0x59a8005a, 0x82000580, 0x00000084, 0x04020011, - 0x59cc1006, 0x82081580, 0x11060000, 0x0402000d, - 0x80000580, 0x0401fac9, 0x805cb9c0, 0x04000005, - 0x4a035010, 0x0000000c, 0x0401fd7a, 0x0401f006, - 0x4a035010, 0x00000018, 0x0401f805, 0x0401f002, - 0x0401f931, 0x5c00b800, 0x1c01f000, 0x4803c856, - 0x4a035010, 0x00000019, 0x83cca400, 0x00000006, - 0x4200a800, 0x0010c8ac, 0x4200b000, 0x00000021, - 0x0201f800, 0x0010bd5b, 0x42003800, 0x0010c8ad, - 0x42024800, 0x0010ccd1, 0x4200b000, 0x0010ccd0, - 0x5058b000, 0x59240200, 0x8c000500, 0x0400001a, - 0x8c000502, 0x04000018, 0x401c2800, 0x50141000, - 0x80080130, 0x80000000, 0x40001800, 0x82081500, - 0x00ffffff, 0x800000f0, 0x80080540, 0x44002800, - 0x59244408, 0x82204500, 0x000000ff, 0x400c1000, - 0x80081104, 0x82083400, 0x0010c8ad, 0x50181000, - 0x820c0500, 0x00000003, 0x0c01f80a, 0x80081540, - 0x44083000, 0x83264c00, 0x0000000b, 0x8058b040, - 0x040207e1, 0x42000800, 0x00000021, 0x0401f131, - 0x00103f38, 0x00103f3c, 0x00103f40, 0x00103f44, - 0x802000f0, 0x82081500, 0x00ffffff, 0x1c01f000, - 0x802000e0, 0x82081500, 0xff00ffff, 0x1c01f000, - 0x802000d0, 0x82081500, 0xffff00ff, 0x1c01f000, - 0x40200000, 0x82081500, 0xffffff00, 0x1c01f000, - 0x4c5c0000, 0x4178b800, 0x59a8005a, 0x80000540, - 0x0400001c, 0x4803c857, 0x42001000, 0x00104038, - 0x0201f800, 0x001062f9, 0x59a8005a, 0x82000580, - 0x00000084, 0x04020012, 0x59cc1006, 0x82081580, - 0x11070000, 0x0402000e, 0x4a035056, 0x00000001, - 0x0401f8ac, 0x805cb9c0, 0x04000005, 0x4a035010, - 0x0000000e, 0x0401fd25, 0x0401f006, 0x4a035010, - 0x0000001a, 0x0401f805, 0x0401f002, 0x0401f8c6, - 0x5c00b800, 0x1c01f000, 0x82000540, 0x00000001, - 0x0401fa4e, 0x4a035010, 0x0000001b, 0x83cca400, - 0x00000006, 0x4200a800, 0x0010c8ac, 0x59a8205a, - 0x40100000, 0x8000b104, 0x40580800, 0x5450a800, - 0x8050a000, 0x8054a800, 0x8058b040, 0x040207fc, - 0x0401f0e8, 0x1c01f000, 0x1c01f000, 0x4803c856, - 0x42003000, 0x00000004, 0x42004000, 0x0010c8ad, - 0x599c2817, 0x8c142d14, 0x0402001f, 0x42001000, - 0x00000003, 0x40200000, 0x80080400, 0x50000800, - 0x82042580, 0xffffffff, 0x04020005, 0x80081040, - 0x80183040, 0x040207f8, 0x0401f046, 0x800811c0, - 0x04020006, 0x82042580, 0x3fffffff, 0x04000040, - 0x82040d40, 0xc0000000, 0x4200b000, 0x00000020, - 0x42001800, 0x00000001, 0x40042000, 0x80102102, - 0x04021021, 0x800c18c2, 0x8058b040, 0x040207fc, - 0x0401f033, 0x41781000, 0x40200000, 0x80080400, + 0x40140800, 0x0201f800, 0x001015c5, 0x59240200, + 0x84000518, 0x48024a00, 0x83264c00, 0x0000000b, + 0x8058b040, 0x040207a7, 0x8060c1c0, 0x04020b72, + 0x5c00c000, 0x42024800, 0x0010cfd1, 0x59242a00, + 0x8c142d02, 0x04000005, 0x8c142d00, 0x04000003, + 0x59242c08, 0x4817500f, 0x42000800, 0x00000005, + 0x0401f2b5, 0x4c5c0000, 0x4178b800, 0x59a8005a, + 0x80000540, 0x04000026, 0x4803c857, 0x42001000, + 0x00104131, 0x0201f800, 0x001064fe, 0x59a8005a, + 0x82000580, 0x00000014, 0x0402001c, 0x59cc1006, + 0x82081580, 0x11040000, 0x04020018, 0x59cc1007, + 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, + 0x04020008, 0x42000000, 0x0010ce71, 0x0201f800, + 0x0010bfb3, 0x59a80015, 0x84000544, 0x48035015, + 0x805cb9c0, 0x04000005, 0x4a035010, 0x00000008, + 0x0401fe20, 0x0401f006, 0x4a035010, 0x00000014, + 0x0401f805, 0x0401f002, 0x0401fa54, 0x5c00b800, + 0x1c01f000, 0x4803c856, 0x4a035010, 0x00000015, + 0x83cca400, 0x00000007, 0x4200a800, 0x0010cbad, + 0x4200b000, 0x00000004, 0x0201f800, 0x0010c086, + 0x4200a800, 0x0010cbac, 0x4600a800, 0x11040000, + 0x8d0e1d06, 0x04020045, 0x42024800, 0x0010cfd1, + 0x0201f800, 0x0010c0ce, 0x59240400, 0x8c000500, + 0x04000031, 0x59240200, 0x8c000500, 0x0400002e, + 0x8c000502, 0x0402002c, 0x59240c00, 0x80040910, + 0x82040d00, 0x000000ff, 0x42001000, 0x0010cbad, + 0x0401f9da, 0x04000010, 0x59240005, 0x82000500, + 0x00ffff00, 0x48024805, 0x59240200, 0x84000502, + 0x48024a00, 0x59242400, 0x8c102504, 0x0400001a, + 0x84000546, 0x84000544, 0x48024a00, 0x8060c000, + 0x0401f015, 0x59240200, 0x82000540, 0x00000006, + 0x84000506, 0x48024a00, 0x48064a08, 0x82042c00, + 0x00102116, 0x50142800, 0x82142d00, 0x000000ff, + 0x48164c08, 0x59240005, 0x82000500, 0x00ffff00, + 0x80140d40, 0x48064805, 0x40140800, 0x0201f800, + 0x001015c5, 0x83264c00, 0x0000000b, 0x8058b040, + 0x040207ca, 0x42024800, 0x0010cfd1, 0x59242a00, + 0x8c142d02, 0x04000005, 0x8c142d00, 0x04000003, + 0x59242c08, 0x4817500f, 0x42000800, 0x00000005, + 0x0401f231, 0x4c5c0000, 0x4178b800, 0x59a8005a, + 0x80000540, 0x0400004a, 0x4803c857, 0x42001000, + 0x00104131, 0x0201f800, 0x001064fe, 0x59a8005a, + 0x82000580, 0x00000014, 0x04020040, 0x59cc1006, + 0x82080500, 0x11050000, 0x82000580, 0x11050000, + 0x0402003a, 0x8c081510, 0x04000015, 0x0401fb70, + 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, + 0x8c000504, 0x04020008, 0x42000000, 0x0010ce71, + 0x0201f800, 0x0010bfb3, 0x59a80015, 0x84000544, + 0x48035015, 0x805cb9c0, 0x04000017, 0x4a035010, + 0x0000000a, 0x0401fdb7, 0x0401f025, 0x59cc1007, + 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, + 0x04020008, 0x42000000, 0x0010ce71, 0x0201f800, + 0x0010bfb3, 0x59a80015, 0x84000544, 0x48035015, + 0x82000540, 0x00000001, 0x0401fb4d, 0x497b5056, + 0x0401f003, 0x4a035056, 0x00000001, 0x59cc1007, + 0x8c08153c, 0x04000003, 0x4a03521b, 0x00000008, + 0x805cb9c0, 0x04020005, 0x4a035010, 0x00000016, + 0x0401f809, 0x0401f006, 0x4a035010, 0x0000000e, + 0x0401fe07, 0x0401f002, 0x0401f9ac, 0x5c00b800, + 0x1c01f000, 0x4803c856, 0x83cca400, 0x00000006, + 0x4200a800, 0x0010cbac, 0x4200b000, 0x00000005, + 0x0201f800, 0x0010c086, 0x4a035010, 0x00000017, + 0x59a80056, 0x8c000500, 0x04000006, 0x42001000, + 0x0010cbac, 0x46001000, 0x11050100, 0x0401f003, + 0x4a035010, 0x0000001b, 0x42024800, 0x0010cfd1, + 0x0201f800, 0x0010c0ce, 0x599c2817, 0x59240200, + 0x8c000500, 0x04000027, 0x8c000502, 0x04020025, + 0x8c000506, 0x04020023, 0x4c580000, 0x0401f8d9, + 0x5c00b000, 0x0402000b, 0x59240005, 0x82000500, + 0x00ffff00, 0x48024805, 0x59240200, 0x84000502, + 0x84000546, 0x84000544, 0x48024a00, 0x0401f015, + 0x59240200, 0x82000540, 0x00000006, 0x84000506, + 0x48024a00, 0x48064a08, 0x82042c00, 0x00102116, + 0x50142800, 0x82142d00, 0x000000ff, 0x48164c08, + 0x59240005, 0x82000500, 0x00ffff00, 0x80140d40, + 0x48064805, 0x40140800, 0x0201f800, 0x001015c5, + 0x83264c00, 0x0000000b, 0x8058b040, 0x040207d4, + 0x42024800, 0x0010cfd1, 0x59242a00, 0x8c142d02, + 0x04000005, 0x8c142d00, 0x04000003, 0x59242c08, + 0x4817500f, 0x42000800, 0x00000005, 0x0401f98e, + 0x4d3c0000, 0x42027800, 0x00000001, 0x0201f800, + 0x0010a242, 0x5c027800, 0x1c01f000, 0x4c5c0000, + 0x4178b800, 0x59a8005a, 0x80000540, 0x0400001b, + 0x4803c857, 0x42001000, 0x00104131, 0x0201f800, + 0x001064fe, 0x59a8005a, 0x82000580, 0x00000084, + 0x04020011, 0x59cc1006, 0x82081580, 0x11060000, + 0x0402000d, 0x80000580, 0x0401fac9, 0x805cb9c0, + 0x04000005, 0x4a035010, 0x0000000c, 0x0401fd7a, + 0x0401f006, 0x4a035010, 0x00000018, 0x0401f805, + 0x0401f002, 0x0401f931, 0x5c00b800, 0x1c01f000, + 0x4803c856, 0x4a035010, 0x00000019, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010cbac, 0x4200b000, + 0x00000021, 0x0201f800, 0x0010c086, 0x42003800, + 0x0010cbad, 0x42024800, 0x0010cfd1, 0x4200b000, + 0x0010cfd0, 0x5058b000, 0x59240200, 0x8c000500, + 0x0400001a, 0x8c000502, 0x04000018, 0x401c2800, + 0x50141000, 0x80080130, 0x80000000, 0x40001800, + 0x82081500, 0x00ffffff, 0x800000f0, 0x80080540, + 0x44002800, 0x59244408, 0x82204500, 0x000000ff, + 0x400c1000, 0x80081104, 0x82083400, 0x0010cbad, + 0x50181000, 0x820c0500, 0x00000003, 0x0c01f80a, + 0x80081540, 0x44083000, 0x83264c00, 0x0000000b, + 0x8058b040, 0x040207e1, 0x42000800, 0x00000021, + 0x0401f131, 0x00104031, 0x00104035, 0x00104039, + 0x0010403d, 0x802000f0, 0x82081500, 0x00ffffff, + 0x1c01f000, 0x802000e0, 0x82081500, 0xff00ffff, + 0x1c01f000, 0x802000d0, 0x82081500, 0xffff00ff, + 0x1c01f000, 0x40200000, 0x82081500, 0xffffff00, + 0x1c01f000, 0x4c5c0000, 0x4178b800, 0x59a8005a, + 0x80000540, 0x0400001c, 0x4803c857, 0x42001000, + 0x00104131, 0x0201f800, 0x001064fe, 0x59a8005a, + 0x82000580, 0x00000084, 0x04020012, 0x59cc1006, + 0x82081580, 0x11070000, 0x0402000e, 0x4a035056, + 0x00000001, 0x0401f8ac, 0x805cb9c0, 0x04000005, + 0x4a035010, 0x0000000e, 0x0401fd25, 0x0401f006, + 0x4a035010, 0x0000001a, 0x0401f805, 0x0401f002, + 0x0401f8c6, 0x5c00b800, 0x1c01f000, 0x82000540, + 0x00000001, 0x0401fa4e, 0x4a035010, 0x0000001b, + 0x83cca400, 0x00000006, 0x4200a800, 0x0010cbac, + 0x59a8205a, 0x40100000, 0x8000b104, 0x40580800, + 0x5450a800, 0x8050a000, 0x8054a800, 0x8058b040, + 0x040207fc, 0x0401f0e8, 0x1c01f000, 0x1c01f000, + 0x4803c856, 0x42003000, 0x00000004, 0x42004000, + 0x0010cbad, 0x599c2817, 0x8c142d14, 0x0402001f, + 0x42001000, 0x00000003, 0x40200000, 0x80080400, 0x50000800, 0x82042580, 0xffffffff, 0x04020005, - 0x80081000, 0x80183040, 0x040207f8, 0x0401f028, - 0x800811c0, 0x04020003, 0x82040d40, 0xc0000000, - 0x4200b000, 0x00000001, 0x42001800, 0x80000000, - 0x40042000, 0x801020c2, 0x04021007, 0x800c1902, - 0x8058b000, 0x82580480, 0x00000021, 0x040017fa, - 0x0401f017, 0x40200000, 0x80082400, 0x50100000, - 0x800c0540, 0x44002000, 0x59a80015, 0x84000540, - 0x48035015, 0x40580000, 0x42002800, 0x00000020, - 0x80142c80, 0x40080000, 0x42003800, 0x00000003, - 0x801c0480, 0x800000ca, 0x80142d40, 0x40140800, - 0x82000540, 0x00000001, 0x0401f002, 0x80000580, - 0x1c01f000, 0x4807c857, 0x480bc857, 0x40041800, - 0x41782000, 0x42000000, 0x00000003, 0x820c1c80, - 0x00000020, 0x04001004, 0x80102000, 0x80000040, - 0x0401f7fb, 0x40041800, 0x801021c0, 0x04000005, - 0x820c1c80, 0x00000020, 0x80102040, 0x040207fd, - 0x42002000, 0x00000001, 0x800c19c0, 0x04000004, - 0x801020c2, 0x800c1840, 0x040207fe, 0x80083c00, - 0x401c2800, 0x50140000, 0x80102d00, 0x04020007, - 0x80100540, 0x44003800, 0x59a80015, 0x84000540, - 0x48035015, 0x80000580, 0x1c01f000, 0x4807c856, - 0x42001000, 0x00008017, 0x59a81832, 0x0201f800, - 0x0010bc92, 0x0201f800, 0x001038bc, 0x1c01f000, - 0x4807c856, 0x4200b000, 0x00000020, 0x83cca400, - 0x00000007, 0x4200a800, 0x0010df51, 0x0201f000, - 0x0010bd85, 0x4807c856, 0x0201f800, 0x00106faf, - 0x42000800, 0x000000f7, 0x0401f8f1, 0x497b2804, - 0x497b2805, 0x497b2826, 0x497b2827, 0x4202d800, - 0x00000001, 0x42006000, 0xbe7fffff, 0x42006800, - 0x00018000, 0x0401f98c, 0x42006000, 0xfffeffff, - 0x41786800, 0x0401f988, 0x497b5032, 0x42000800, - 0x0000002d, 0x42001000, 0x001040ba, 0x0201f000, - 0x001062d0, 0x4807c856, 0x0401ffe3, 0x497b5010, - 0x497b505a, 0x1c01f000, 0x4807c856, 0x42006000, - 0xffffffff, 0x42006800, 0x00000028, 0x0401f176, - 0x4807c856, 0x0401ffc6, 0x0201f800, 0x00106c3c, - 0x4df00000, 0x0201f800, 0x00106ed9, 0x5c03e000, - 0x02000800, 0x00106c29, 0x59c400a4, 0x82000500, - 0x0000000f, 0x82000580, 0x00000002, 0x0402000a, - 0x42006000, 0xffffffff, 0x42006800, 0x00200000, - 0x0401f961, 0x42006000, 0xffdfffff, 0x41786800, - 0x0401f95d, 0x497b5010, 0x42000800, 0x000000f7, - 0x0401f8b3, 0x59c400a3, 0x82000500, 0xbf20bfff, - 0x82000540, 0x0001c000, 0x480388a3, 0x84000520, - 0x480388a3, 0x497b5032, 0x42000800, 0x0000002d, - 0x42001000, 0x001040ba, 0x0201f000, 0x001062d0, - 0x497b505a, 0x59b400f5, 0x8c000500, 0x04020004, - 0x82000540, 0x00000001, 0x480368f5, 0x800400c4, - 0x82000400, 0x00002000, 0x4803910a, 0x59b400f6, - 0x82000500, 0x00000018, 0x040207fd, 0x4a0368f0, - 0x0010c8a5, 0x42000000, 0x0010c8ac, 0x4c040000, - 0x50000800, 0x82040d80, 0x11010000, 0x04000003, - 0x50000800, 0x4807c857, 0x5c000800, 0x480368f1, - 0x82040400, 0x0000dc00, 0x480368f3, 0x59c400a4, - 0x82000500, 0x0000000f, 0x82000580, 0x00000008, - 0x04020017, 0x4c5c0000, 0x4c600000, 0x59c4b805, - 0x8c5cbd3a, 0x04020005, 0x42000000, 0x0010cb6e, - 0x0201f800, 0x0010bc88, 0x4a038805, 0x20000000, - 0x0201f800, 0x00101a38, 0x4000c000, 0x0201f800, - 0x00101963, 0x4202d800, 0x00000001, 0x497b5010, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x59c8010b, - 0x8c000502, 0x040007e2, 0x59c408a4, 0x82040d00, - 0x0000000f, 0x82040d80, 0x0000000b, 0x04020005, - 0x59a80810, 0x82040d40, 0x00002000, 0x0401f004, - 0x59a80855, 0x82040d40, 0x00001000, 0x48075032, - 0x59a8085f, 0x800409c0, 0x04020007, 0x42000800, - 0x000007d0, 0x42001000, 0x00104038, 0x0201f800, - 0x00106433, 0x1c01f000, 0x4807c856, 0x0401ff44, - 0x0201f800, 0x00106c3c, 0x4df00000, 0x0201f800, - 0x00106ed9, 0x5c03e000, 0x02000800, 0x00106c29, + 0x80081040, 0x80183040, 0x040207f8, 0x0401f046, + 0x800811c0, 0x04020006, 0x82042580, 0x3fffffff, + 0x04000040, 0x82040d40, 0xc0000000, 0x4200b000, + 0x00000020, 0x42001800, 0x00000001, 0x40042000, + 0x80102102, 0x04021021, 0x800c18c2, 0x8058b040, + 0x040207fc, 0x0401f033, 0x41781000, 0x40200000, + 0x80080400, 0x50000800, 0x82042580, 0xffffffff, + 0x04020005, 0x80081000, 0x80183040, 0x040207f8, + 0x0401f028, 0x800811c0, 0x04020003, 0x82040d40, + 0xc0000000, 0x4200b000, 0x00000001, 0x42001800, + 0x80000000, 0x40042000, 0x801020c2, 0x04021007, + 0x800c1902, 0x8058b000, 0x82580480, 0x00000021, + 0x040017fa, 0x0401f017, 0x40200000, 0x80082400, + 0x50100000, 0x800c0540, 0x44002000, 0x59a80015, + 0x84000540, 0x48035015, 0x40580000, 0x42002800, + 0x00000020, 0x80142c80, 0x40080000, 0x42003800, + 0x00000003, 0x801c0480, 0x800000ca, 0x80142d40, + 0x40140800, 0x82000540, 0x00000001, 0x0401f002, + 0x80000580, 0x1c01f000, 0x4807c857, 0x480bc857, + 0x40041800, 0x41782000, 0x42000000, 0x00000003, + 0x820c1c80, 0x00000020, 0x04001004, 0x80102000, + 0x80000040, 0x0401f7fb, 0x40041800, 0x801021c0, + 0x04000005, 0x820c1c80, 0x00000020, 0x80102040, + 0x040207fd, 0x42002000, 0x00000001, 0x800c19c0, + 0x04000004, 0x801020c2, 0x800c1840, 0x040207fe, + 0x80083c00, 0x401c2800, 0x50140000, 0x80102d00, + 0x04020007, 0x80100540, 0x44003800, 0x59a80015, + 0x84000540, 0x48035015, 0x80000580, 0x1c01f000, + 0x4807c856, 0x42001000, 0x00008017, 0x59a81832, + 0x0201f800, 0x0010bfbd, 0x0201f800, 0x001039ac, + 0x1c01f000, 0x4807c856, 0x4200b000, 0x00000020, + 0x83cca400, 0x00000007, 0x4200a800, 0x0010e251, + 0x0201f000, 0x0010c0b0, 0x4807c856, 0x0201f800, + 0x001071b4, 0x42000800, 0x000000f7, 0x0401f8f1, + 0x497b2804, 0x497b2805, 0x497b2826, 0x497b2827, + 0x4202d800, 0x00000001, 0x42006000, 0xbe7fffff, + 0x42006800, 0x00018000, 0x0401f98c, 0x42006000, + 0xfffeffff, 0x41786800, 0x0401f988, 0x497b5032, + 0x42000800, 0x0000002d, 0x42001000, 0x001041b3, + 0x0201f000, 0x001064d5, 0x4807c856, 0x0401ffe3, + 0x497b5010, 0x497b505a, 0x1c01f000, 0x4807c856, + 0x42006000, 0xffffffff, 0x42006800, 0x00000028, + 0x0401f176, 0x4807c856, 0x0401ffc6, 0x0201f800, + 0x00106e41, 0x4df00000, 0x0201f800, 0x001070de, + 0x5c03e000, 0x02000800, 0x00106e2e, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x00000002, + 0x0402000a, 0x42006000, 0xffffffff, 0x42006800, + 0x00200000, 0x0401f961, 0x42006000, 0xffdfffff, + 0x41786800, 0x0401f95d, 0x497b5010, 0x42000800, + 0x000000f7, 0x0401f8b3, 0x59c400a3, 0x82000500, + 0xbf20bfff, 0x82000540, 0x0001c000, 0x480388a3, + 0x84000520, 0x480388a3, 0x497b5032, 0x42000800, + 0x0000002d, 0x42001000, 0x001041b3, 0x0201f000, + 0x001064d5, 0x497b505a, 0x59b400f5, 0x8c000500, + 0x04020004, 0x82000540, 0x00000001, 0x480368f5, + 0x800400c4, 0x82000400, 0x00002000, 0x4803910a, + 0x59b400f6, 0x82000500, 0x00000018, 0x040207fd, + 0x4a0368f0, 0x0010cba5, 0x42000000, 0x0010cbac, + 0x4c040000, 0x50000800, 0x82040d80, 0x11010000, + 0x04000003, 0x50000800, 0x4807c857, 0x5c000800, + 0x480368f1, 0x82040400, 0x0000dc00, 0x480368f3, 0x59c400a4, 0x82000500, 0x0000000f, 0x82000580, - 0x00000002, 0x0402000a, 0x42006000, 0xffffffff, - 0x42006800, 0x00200000, 0x0401f8df, 0x42006000, - 0xffdfffff, 0x41786800, 0x0401f8db, 0x0201f800, - 0x00104fd3, 0x04000014, 0x0201f800, 0x00104ff1, - 0x04020011, 0x4a035013, 0x0000aaaa, 0x4c040000, - 0x0201f800, 0x00101606, 0x59a8001f, 0x82000500, - 0xffff0000, 0x80040540, 0x4803501f, 0x5c000800, - 0x4a035014, 0x00000000, 0x0201f800, 0x00104f20, - 0x0401f008, 0x4a035058, 0x00000005, 0x42000000, - 0x00000080, 0x0201f800, 0x0010155c, 0x0401ff22, - 0x1c01f000, 0x0401f809, 0x42006000, 0xbf7f7fff, - 0x41786800, 0x0401f0b8, 0x42006000, 0xbf7f7fff, - 0x41786800, 0x0401f0b4, 0x0201f800, 0x00104ff1, - 0x04020009, 0x59c40006, 0x82000540, 0x000000f0, - 0x48038806, 0x42006000, 0xbfffffff, 0x41786800, - 0x0401f8a9, 0x1c01f000, 0x40680800, 0x800408d0, - 0x59a80015, 0x8c000506, 0x04000006, 0x59a8000f, - 0x82000500, 0x000000ff, 0x80040540, 0x0401f003, - 0x82040540, 0x000000f7, 0x480388a7, 0x1c01f000, - 0x4807c856, 0x42000000, 0x0010cc06, 0x0201f800, - 0x0010bc88, 0x42003000, 0x00000005, 0x4d3c0000, - 0x4c180000, 0x42003000, 0x0000000d, 0x42027800, - 0x00000002, 0x0401f04e, 0x4807c856, 0x42000000, - 0x0010cc2b, 0x0201f800, 0x0010bc88, 0x42003000, - 0x00000000, 0x4d3c0000, 0x4c180000, 0x42003000, - 0x0000000f, 0x42001800, 0x0000ffff, 0x42002000, - 0x00000007, 0x0201f800, 0x00103931, 0x5c003000, - 0x59240200, 0x84000556, 0x48024a00, 0x4d400000, - 0x42028000, 0x0000002a, 0x59240400, 0x8c00050a, - 0x02000800, 0x0010ae89, 0x42027800, 0x00000002, - 0x0201f800, 0x00101fa9, 0x5c028000, 0x5c027800, - 0x0201f000, 0x00020b9d, 0x4807c856, 0x42000000, - 0x0010cc29, 0x0201f800, 0x0010bc88, 0x42003000, - 0x00000003, 0x4d3c0000, 0x4c180000, 0x42003000, - 0x0000000e, 0x42027800, 0x00000202, 0x0401f01c, - 0x4807c856, 0x42000000, 0x0010cc28, 0x0201f800, - 0x0010bc88, 0x42003000, 0x00000004, 0x4d3c0000, - 0x4c180000, 0x42003000, 0x00000010, 0x42027800, - 0x00000202, 0x0401f00e, 0x4807c856, 0x42000000, - 0x0010cb70, 0x0201f800, 0x0010bc88, 0x42003000, - 0x00000001, 0x4d3c0000, 0x4c180000, 0x42003000, - 0x0000000c, 0x42027800, 0x00000002, 0x42001800, - 0x0000ffff, 0x42002000, 0x00000007, 0x4d200000, - 0x417a4000, 0x0201f800, 0x00103931, 0x5c024000, - 0x5c003000, 0x4d400000, 0x0201f800, 0x0010b427, - 0x42028000, 0x0000002a, 0x0201f800, 0x0010fbe5, - 0x4c580000, 0x0201f800, 0x0010bda3, 0x42000800, - 0x0010ccd1, 0x58040005, 0x82000500, 0x000000ff, - 0x48000805, 0x82040c00, 0x0000000b, 0x8058b040, - 0x040207f9, 0x5c00b000, 0x5c028000, 0x5c027800, - 0x1c01f000, 0x4807c856, 0x04011000, 0x4a03c840, - 0x0010c8a5, 0x4a03c842, 0x00000040, 0x40000000, - 0x040117ff, 0x42007800, 0x0010c8a5, 0x46007800, - 0x00000011, 0x803c7800, 0x4a007800, 0x220000ef, - 0x4a007801, 0x000000ef, 0x4a007802, 0x01380000, - 0x4a007803, 0x00000000, 0x4a007804, 0xffffffff, - 0x4a007805, 0x00000000, 0x1c01f000, 0x40686000, - 0x406c6800, 0x59c400a3, 0x80300500, 0x80340540, - 0x480388a3, 0x1c01f000, 0x40686000, 0x4833c857, - 0x59c400a3, 0x80300540, 0x480388a3, 0x80300580, - 0x480388a3, 0x1c01f000, 0x4803c856, 0x04000004, - 0x4a035060, 0x00000001, 0x0401f002, 0x497b5060, - 0x1c01f000, 0x59c80002, 0x80000540, 0x0400000a, - 0x80000040, 0x04000008, 0x4a039005, 0x00000140, - 0x42000000, 0x00000006, 0x80000040, 0x040207ff, - 0x0401f7f5, 0x1c01f000, 0x4c5c0000, 0x4c600000, - 0x59c4b805, 0x485fc856, 0x8c5cbd3a, 0x04020005, - 0x42000000, 0x0010cb6e, 0x0201f800, 0x0010bc88, - 0x4a038805, 0x20000000, 0x0201f800, 0x00101a38, - 0x4000c000, 0x0201f800, 0x00101963, 0x4a038805, - 0x04000000, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x497a6a00, 0x4a026c00, 0x00000707, 0x497a6801, - 0x497a6808, 0x497a6809, 0x497a6806, 0x497a6807, - 0x497a6c0b, 0x497a680c, 0x59240400, 0x8c00050a, - 0x04000006, 0x5934080f, 0x59340010, 0x80040540, - 0x02020800, 0x0010032e, 0x4a026a04, 0x00000100, - 0x497a6a03, 0x59340402, 0x82000500, 0x000000ff, - 0x48026c02, 0x497a6c04, 0x497a6a05, 0x497a6c05, - 0x497a6811, 0x4d2c0000, 0x5934000d, 0x49466c03, - 0x80025d40, 0x04000004, 0x0201f800, 0x0010059d, - 0x497a680d, 0x5c025800, 0x59a80070, 0x8c000502, - 0x42000000, 0x00000010, 0x04020002, 0x599c0401, - 0x48026a0b, 0x599c0208, 0x48026c12, 0x4a02680a, - 0x00006000, 0x0201f000, 0x00104c0c, 0x42000000, - 0x00000005, 0x80000d80, 0x0401f02c, 0x0201f800, - 0x00104943, 0x04020017, 0x59a8021b, 0x8c00050a, - 0x04020010, 0x59340212, 0x82000500, 0x0000ff00, - 0x4803c857, 0x0400000b, 0x59340a00, 0x8c040d1e, - 0x02000000, 0x000202ca, 0x42000000, 0x00000029, - 0x42000800, 0x00001000, 0x492fc857, 0x0401f017, - 0x492fc857, 0x42000000, 0x00000028, 0x0401f011, - 0x8d0e1d02, 0x04020003, 0x8d0e1d00, 0x04000004, - 0x42000000, 0x00000004, 0x0401f00a, 0x42000000, - 0x00000029, 0x59340a00, 0x8c040d1e, 0x04000005, - 0x492fc857, 0x42000800, 0x00001000, 0x0401f003, - 0x492fc857, 0x80000d80, 0x4803c857, 0x80028540, - 0x1c01f000, 0x490fc857, 0x8d0e1d00, 0x040207ed, - 0x0201f800, 0x0010491a, 0x040207e6, 0x59340200, - 0x8c00050e, 0x040007e3, 0x0201f000, 0x000202ca, - 0x4d480000, 0x4d4c0000, 0x592e9009, 0x592e980a, - 0x0201f800, 0x001047c9, 0x5c029800, 0x5c029000, - 0x040007bb, 0x0201f000, 0x000202ce, 0x592c0207, - 0x492fc857, 0x82000d80, 0x000007ff, 0x04020006, - 0x4a025c0b, 0x00000030, 0x42026800, 0x0010c87b, - 0x0401f021, 0x82000c80, 0x000007f0, 0x04021047, - 0x81ac0400, 0x50000000, 0x80026d40, 0x0400003a, - 0x0201f800, 0x0010484d, 0x0402003a, 0x592c040b, - 0x8c00050a, 0x04020014, 0x592e600a, 0x83300480, - 0x00111264, 0x0400103c, 0x41580000, 0x81300480, - 0x04021039, 0x59300c07, 0x82040580, 0x00000009, - 0x04020038, 0x4a025a07, 0x00000000, 0x497a5800, - 0x59300009, 0x80000540, 0x0402001a, 0x492e6009, - 0x0401f012, 0x0201f800, 0x00020b7b, 0x0400001b, - 0x592c0207, 0x4936600a, 0x492e6009, 0x4a026407, - 0x00000009, 0x497a6016, 0x4a02601c, 0x0010ccd1, - 0x4932580a, 0x82000d80, 0x000007ff, 0x04020003, - 0x4a026016, 0x00008000, 0x42027000, 0x00000043, - 0x0201f800, 0x00020bc1, 0x80000580, 0x0401f01f, - 0x40000800, 0x58040000, 0x80000540, 0x040207fd, - 0x492c0800, 0x0401f019, 0x42000000, 0x0000002c, - 0x0401f015, 0x42000000, 0x00000028, 0x0401f012, - 0x830c0500, 0x00000003, 0x04000004, 0x42000000, - 0x00000004, 0x0401f00c, 0x42000000, 0x00000029, - 0x0401f009, 0x42000000, 0x00000008, 0x0401f006, - 0x82040580, 0x00000007, 0x040207fb, 0x42000000, - 0x00000005, 0x80000540, 0x1c01f000, 0x492fc857, - 0x592e8c07, 0x83440d80, 0x000007fc, 0x04000004, - 0x83440480, 0x000007f0, 0x0402101b, 0x592e4408, - 0x0201f800, 0x00105acb, 0x02000800, 0x0010497a, - 0x04020015, 0x0201f800, 0x0010492d, 0x04020015, - 0x0201f800, 0x00107cfe, 0x0400001f, 0x83200400, - 0x0010bdc7, 0x50024800, 0x4926601c, 0x4936600a, - 0x492e6009, 0x4a026407, 0x0000000a, 0x42027000, - 0x00000040, 0x0201f800, 0x00020bc1, 0x80000580, - 0x0401f010, 0x42000000, 0x00000028, 0x0401f00c, - 0x0201f800, 0x00104943, 0x040007fb, 0x830c0d00, - 0x00000003, 0x04000004, 0x42000000, 0x00000004, - 0x0401f003, 0x42000000, 0x00000029, 0x80000540, - 0x1c01f000, 0x42000000, 0x0000002c, 0x0401f7fc, - 0x492fc857, 0x592e4408, 0x4923c857, 0x0201f800, - 0x00105acb, 0x592c4208, 0x0400000e, 0x42000000, - 0x0000000e, 0x59240a00, 0x8c040d00, 0x040001b1, - 0x82200d00, 0x0000000f, 0x82040d80, 0x00000008, - 0x040201ac, 0x82200d00, 0x00000030, 0x040001a9, - 0x592e8c07, 0x4947c857, 0x83440c80, 0x00000800, - 0x42000000, 0x0000000a, 0x040211a2, 0x4823c857, - 0x82200500, 0x0000000f, 0x0c01f001, 0x00104327, - 0x001043b3, 0x00104404, 0x0010440f, 0x0010441a, - 0x00104323, 0x00104323, 0x00104323, 0x00104427, - 0x0010448a, 0x001044af, 0x00104323, 0x00104323, - 0x00104323, 0x00104323, 0x00104323, 0x4803c857, - 0x42000000, 0x0000000c, 0x0401f18a, 0x592c1009, - 0x82081500, 0x00ffffff, 0x59240005, 0x80084d80, - 0x42000000, 0x00000010, 0x04000182, 0x0201f800, - 0x001048a9, 0x04000039, 0x4803c857, 0x82004d80, - 0x0000001d, 0x0402001a, 0x0201f800, 0x00020864, - 0x59340405, 0x4c000000, 0x0201f800, 0x0010491a, - 0x5c000000, 0x04000004, 0x8c20450a, 0x0400002b, - 0x80000580, 0x44002800, 0x59340008, 0x48002802, - 0x59340009, 0x48002801, 0x59340006, 0x48002804, - 0x59340007, 0x48002803, 0x4200b000, 0x00000005, - 0x0201f800, 0x00109cd4, 0x0401f193, 0x4803c857, + 0x00000008, 0x04020017, 0x4c5c0000, 0x4c600000, + 0x59c4b805, 0x8c5cbd3a, 0x04020005, 0x42000000, + 0x0010ce6e, 0x0201f800, 0x0010bfb3, 0x4a038805, + 0x20000000, 0x0201f800, 0x00101a3d, 0x4000c000, + 0x0201f800, 0x00101968, 0x4202d800, 0x00000001, + 0x497b5010, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x59c8010b, 0x8c000502, 0x040007e2, 0x59c408a4, + 0x82040d00, 0x0000000f, 0x82040d80, 0x0000000b, + 0x04020005, 0x59a80810, 0x82040d40, 0x00002000, + 0x0401f004, 0x59a80855, 0x82040d40, 0x00001000, + 0x48075032, 0x59a8085f, 0x800409c0, 0x04020007, + 0x42000800, 0x000007d0, 0x42001000, 0x00104131, + 0x0201f800, 0x00106638, 0x1c01f000, 0x4807c856, + 0x0401ff44, 0x0201f800, 0x00106e41, 0x4df00000, + 0x0201f800, 0x001070de, 0x5c03e000, 0x02000800, + 0x00106e2e, 0x59c400a4, 0x82000500, 0x0000000f, + 0x82000580, 0x00000002, 0x0402000a, 0x42006000, + 0xffffffff, 0x42006800, 0x00200000, 0x0401f8df, + 0x42006000, 0xffdfffff, 0x41786800, 0x0401f8db, + 0x0201f800, 0x00105104, 0x04000014, 0x0201f800, + 0x00105122, 0x04020011, 0x4a035013, 0x0000aaaa, + 0x4c040000, 0x0201f800, 0x0010160b, 0x59a8001f, + 0x82000500, 0xffff0000, 0x80040540, 0x4803501f, + 0x5c000800, 0x4a035014, 0x00000000, 0x0201f800, + 0x00105051, 0x0401f008, 0x4a035058, 0x00000005, + 0x42000000, 0x00000080, 0x0201f800, 0x0010155d, + 0x0401ff22, 0x1c01f000, 0x0401f809, 0x42006000, + 0xbf7f7fff, 0x41786800, 0x0401f0b8, 0x42006000, + 0xbf7f7fff, 0x41786800, 0x0401f0b4, 0x0201f800, + 0x00105122, 0x04020009, 0x59c40006, 0x82000540, + 0x000000f0, 0x48038806, 0x42006000, 0xbfffffff, + 0x41786800, 0x0401f8a9, 0x1c01f000, 0x40680800, + 0x800408d0, 0x59a80015, 0x8c000506, 0x04000006, + 0x59a8000f, 0x82000500, 0x000000ff, 0x80040540, + 0x0401f003, 0x82040540, 0x000000f7, 0x480388a7, + 0x1c01f000, 0x4807c856, 0x42000000, 0x0010cf06, + 0x0201f800, 0x0010bfb3, 0x42003000, 0x00000005, + 0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000d, + 0x42027800, 0x00000002, 0x0401f04e, 0x4807c856, + 0x42000000, 0x0010cf2b, 0x0201f800, 0x0010bfb3, + 0x42003000, 0x00000000, 0x4d3c0000, 0x4c180000, + 0x42003000, 0x0000000f, 0x42001800, 0x0000ffff, + 0x42002000, 0x00000007, 0x0201f800, 0x00103a21, + 0x5c003000, 0x59240200, 0x84000556, 0x48024a00, + 0x4d400000, 0x42028000, 0x0000002a, 0x59240400, + 0x8c00050a, 0x02000800, 0x0010b198, 0x42027800, + 0x00000002, 0x0201f800, 0x0010200c, 0x5c028000, + 0x5c027800, 0x0201f000, 0x00020b9d, 0x4807c856, + 0x42000000, 0x0010cf29, 0x0201f800, 0x0010bfb3, + 0x42003000, 0x00000003, 0x4d3c0000, 0x4c180000, + 0x42003000, 0x0000000e, 0x42027800, 0x00000202, + 0x0401f01c, 0x4807c856, 0x42000000, 0x0010cf28, + 0x0201f800, 0x0010bfb3, 0x42003000, 0x00000004, + 0x4d3c0000, 0x4c180000, 0x42003000, 0x00000010, + 0x42027800, 0x00000202, 0x0401f00e, 0x4807c856, + 0x42000000, 0x0010ce70, 0x0201f800, 0x0010bfb3, + 0x42003000, 0x00000001, 0x4d3c0000, 0x4c180000, + 0x42003000, 0x0000000c, 0x42027800, 0x00000002, + 0x42001800, 0x0000ffff, 0x42002000, 0x00000007, + 0x4d200000, 0x417a4000, 0x0201f800, 0x00103a21, + 0x5c024000, 0x5c003000, 0x4d400000, 0x0201f800, + 0x0010b752, 0x42028000, 0x0000002a, 0x0201f800, + 0x0010fef2, 0x4c580000, 0x0201f800, 0x0010c0ce, + 0x42000800, 0x0010cfd1, 0x58040005, 0x82000500, + 0x000000ff, 0x48000805, 0x82040c00, 0x0000000b, + 0x8058b040, 0x040207f9, 0x5c00b000, 0x5c028000, + 0x5c027800, 0x1c01f000, 0x4807c856, 0x04011000, + 0x4a03c840, 0x0010cba5, 0x4a03c842, 0x00000040, + 0x40000000, 0x040117ff, 0x42007800, 0x0010cba5, + 0x46007800, 0x00000011, 0x803c7800, 0x4a007800, + 0x220000ef, 0x4a007801, 0x000000ef, 0x4a007802, + 0x01380000, 0x4a007803, 0x00000000, 0x4a007804, + 0xffffffff, 0x4a007805, 0x00000000, 0x1c01f000, + 0x40686000, 0x406c6800, 0x59c400a3, 0x80300500, + 0x80340540, 0x480388a3, 0x1c01f000, 0x40686000, + 0x4833c857, 0x59c400a3, 0x80300540, 0x480388a3, + 0x80300580, 0x480388a3, 0x1c01f000, 0x4803c856, + 0x04000004, 0x4a035060, 0x00000001, 0x0401f002, + 0x497b5060, 0x1c01f000, 0x59c80002, 0x80000540, + 0x0400000a, 0x80000040, 0x04000008, 0x4a039005, + 0x00000140, 0x42000000, 0x00000006, 0x80000040, + 0x040207ff, 0x0401f7f5, 0x1c01f000, 0x4c5c0000, + 0x4c600000, 0x59c4b805, 0x485fc856, 0x8c5cbd3a, + 0x04020005, 0x42000000, 0x0010ce6e, 0x0201f800, + 0x0010bfb3, 0x4a038805, 0x20000000, 0x0201f800, + 0x00101a3d, 0x4000c000, 0x0201f800, 0x00101968, + 0x4a038805, 0x04000000, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x497a6a00, 0x4a026c00, 0x00000707, + 0x497a6801, 0x497a6808, 0x497a6809, 0x497a6806, + 0x497a6807, 0x497a6c0b, 0x497a680c, 0x59240400, + 0x8c00050a, 0x04000006, 0x5934080f, 0x59340010, + 0x80040540, 0x02020800, 0x0010032e, 0x4a026a04, + 0x00000100, 0x497a6a03, 0x59340402, 0x82000500, + 0x000000ff, 0x48026c02, 0x497a6c04, 0x497a6a05, + 0x497a6c05, 0x497a6811, 0x4d2c0000, 0x5934000d, + 0x49466c03, 0x80025d40, 0x04000004, 0x0201f800, + 0x0010059d, 0x497a680d, 0x5c025800, 0x59a80070, + 0x8c000502, 0x42000000, 0x00000010, 0x04020002, + 0x599c0401, 0x48026a0b, 0x599c0208, 0x48026c12, + 0x4a02680a, 0x00006000, 0x0201f000, 0x00104d11, + 0x42000000, 0x00000005, 0x80000d80, 0x0401f02c, + 0x0201f800, 0x00104a45, 0x04020017, 0x59a8021b, + 0x8c00050a, 0x04020010, 0x59340212, 0x82000500, + 0x0000ff00, 0x4803c857, 0x0400000b, 0x59340a00, + 0x8c040d1e, 0x02000000, 0x000202ca, 0x42000000, + 0x00000029, 0x42000800, 0x00001000, 0x492fc857, + 0x0401f017, 0x492fc857, 0x42000000, 0x00000028, + 0x0401f011, 0x8d0e1d02, 0x04020003, 0x8d0e1d00, + 0x04000004, 0x42000000, 0x00000004, 0x0401f00a, + 0x42000000, 0x00000029, 0x59340a00, 0x8c040d1e, + 0x04000005, 0x492fc857, 0x42000800, 0x00001000, + 0x0401f003, 0x492fc857, 0x80000d80, 0x4803c857, + 0x80028540, 0x1c01f000, 0x490fc857, 0x8d0e1d00, + 0x040207ed, 0x0201f800, 0x00104a1c, 0x040207e6, + 0x59340200, 0x8c00050e, 0x040007e3, 0x0201f000, + 0x000202ca, 0x4d480000, 0x4d4c0000, 0x592e9009, + 0x592e980a, 0x0201f800, 0x001048c9, 0x5c029800, + 0x5c029000, 0x040007bb, 0x0201f000, 0x000202ce, + 0x592c0207, 0x492fc857, 0x82000d80, 0x000007ff, + 0x04020006, 0x4a025c0b, 0x00000030, 0x42026800, + 0x0010cb7b, 0x0401f021, 0x82000c80, 0x000007f0, + 0x04021047, 0x81ac0400, 0x50000000, 0x80026d40, + 0x0400003a, 0x0201f800, 0x0010494d, 0x0402003a, + 0x592c040b, 0x8c00050a, 0x04020014, 0x592e600a, + 0x83300480, 0x00111584, 0x0400103c, 0x41580000, + 0x81300480, 0x04021039, 0x59300c07, 0x82040580, + 0x00000009, 0x04020038, 0x4a025a07, 0x00000000, + 0x497a5800, 0x59300009, 0x80000540, 0x0402001a, + 0x492e6009, 0x0401f012, 0x0201f800, 0x00020b7b, + 0x0400001b, 0x592c0207, 0x4936600a, 0x492e6009, + 0x4a026407, 0x00000009, 0x497a6016, 0x4a02601c, + 0x0010cfd1, 0x4932580a, 0x82000d80, 0x000007ff, + 0x04020003, 0x4a026016, 0x00008000, 0x42027000, + 0x00000043, 0x0201f800, 0x00020bc1, 0x80000580, + 0x0401f01f, 0x40000800, 0x58040000, 0x80000540, + 0x040207fd, 0x492c0800, 0x0401f019, 0x42000000, + 0x0000002c, 0x0401f015, 0x42000000, 0x00000028, + 0x0401f012, 0x830c0500, 0x00000003, 0x04000004, + 0x42000000, 0x00000004, 0x0401f00c, 0x42000000, + 0x00000029, 0x0401f009, 0x42000000, 0x00000008, + 0x0401f006, 0x82040580, 0x00000007, 0x040207fb, + 0x42000000, 0x00000005, 0x80000540, 0x1c01f000, + 0x492fc857, 0x592e8c07, 0x83440d80, 0x000007fc, + 0x04000004, 0x83440480, 0x000007f0, 0x0402101b, + 0x592e4408, 0x0201f800, 0x00105c82, 0x02000800, + 0x00104a7c, 0x04020015, 0x0201f800, 0x00104a2f, + 0x04020015, 0x0201f800, 0x00107ef8, 0x0400001f, + 0x83200400, 0x0010c10d, 0x50024800, 0x4926601c, + 0x4936600a, 0x492e6009, 0x4a026407, 0x0000000a, + 0x42027000, 0x00000040, 0x0201f800, 0x00020bc1, + 0x80000580, 0x0401f010, 0x42000000, 0x00000028, + 0x0401f00c, 0x0201f800, 0x00104a45, 0x040007fb, + 0x830c0d00, 0x00000003, 0x04000004, 0x42000000, + 0x00000004, 0x0401f003, 0x42000000, 0x00000029, + 0x80000540, 0x1c01f000, 0x42000000, 0x0000002c, + 0x0401f7fc, 0x492fc857, 0x592e4408, 0x4923c857, + 0x0201f800, 0x00105c82, 0x592c4208, 0x0400000e, + 0x42000000, 0x0000000e, 0x59240a00, 0x8c040d00, + 0x040001b1, 0x82200d00, 0x0000000f, 0x82040d80, + 0x00000008, 0x040201ac, 0x82200d00, 0x00000030, + 0x040001a9, 0x592e8c07, 0x4947c857, 0x83440c80, + 0x00000800, 0x42000000, 0x0000000a, 0x040211a2, + 0x4823c857, 0x82200500, 0x0000000f, 0x0c01f001, + 0x00104420, 0x001044ac, 0x001044fd, 0x00104508, + 0x00104513, 0x0010441c, 0x0010441c, 0x0010441c, + 0x00104520, 0x00104583, 0x001045a8, 0x0010441c, + 0x0010441c, 0x0010441c, 0x0010441c, 0x0010441c, + 0x4803c857, 0x42000000, 0x0000000c, 0x0401f18a, + 0x592c1009, 0x82081500, 0x00ffffff, 0x59240005, + 0x80084d80, 0x42000000, 0x00000010, 0x04000182, + 0x0201f800, 0x001049a9, 0x04000039, 0x4803c857, + 0x82004d80, 0x0000001d, 0x0402001a, 0x0201f800, + 0x00020864, 0x59340405, 0x4c000000, 0x0201f800, + 0x00104a1c, 0x5c000000, 0x04000004, 0x8c20450a, + 0x0400002b, 0x80000580, 0x44002800, 0x59340008, + 0x48002802, 0x59340009, 0x48002801, 0x59340006, + 0x48002804, 0x59340007, 0x48002803, 0x4200b000, + 0x00000005, 0x0201f800, 0x00109f12, 0x0401f193, + 0x4803c857, 0x82004d80, 0x0000001a, 0x04020003, + 0x40101000, 0x0401f163, 0x4803c857, 0x82004d80, + 0x0000001b, 0x04020003, 0x40181000, 0x0401f15d, + 0x4803c857, 0x82004d80, 0x0000001f, 0x0400015e, + 0x82004d80, 0x0000001c, 0x0400015b, 0x82004d80, + 0x00000019, 0x42000000, 0x0000000a, 0x0400014a, + 0x42000000, 0x0000000a, 0x04020161, 0x59a80070, + 0x8c000502, 0x0400001b, 0x0201f800, 0x00104a1c, + 0x04000018, 0x59340212, 0x82000500, 0x0000ff00, + 0x42001000, 0x00000010, 0x0402000c, 0x42001000, + 0x00000008, 0x59a8021b, 0x8c000506, 0x04020009, + 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, + 0x00ff0000, 0x04000007, 0x0201f800, 0x00104d1c, + 0x42000000, 0x0000001c, 0x40181000, 0x04020131, + 0x0201f800, 0x00107ef8, 0x0400013b, 0x4926601c, + 0x4936600a, 0x492e6009, 0x4a026407, 0x00000001, + 0x8c20450a, 0x04000004, 0x592c0405, 0x8400055c, + 0x48025c05, 0x4c200000, 0x4d3c0000, 0x42027800, + 0x00001800, 0x0201f800, 0x0010ff80, 0x5c027800, + 0x5c004000, 0x8c204512, 0x0400000b, 0x599c0018, + 0x8c000518, 0x04000008, 0x592c000a, 0x82000500, + 0x00000380, 0x5934080a, 0x80040d40, 0x84040d54, + 0x4806680a, 0x417a7800, 0x0401f93d, 0x42000800, + 0x00000003, 0x0401f945, 0x42027000, 0x00000002, + 0x0201f800, 0x00020bc1, 0x80000580, 0x0401f133, + 0x0201f800, 0x00104a7c, 0x04020115, 0x0201f800, + 0x00104a22, 0x0400000c, 0x0201f800, 0x00104a1c, + 0x04020115, 0x4c600000, 0x4178c000, 0x42027800, + 0x00001800, 0x417a6000, 0x0201f800, 0x00101ce3, + 0x5c00c000, 0x59a80070, 0x8c000502, 0x0400001b, + 0x0201f800, 0x00104a1c, 0x04000018, 0x59340212, + 0x82000500, 0x0000ff00, 0x42001000, 0x00000010, + 0x0402000c, 0x42001000, 0x00000008, 0x59a8021b, + 0x8c000506, 0x04020009, 0x59340002, 0x82000500, + 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000007, + 0x0201f800, 0x00104d1c, 0x42000000, 0x0000001c, + 0x40181000, 0x040200d7, 0x0201f800, 0x00107ef8, + 0x040000e1, 0x5934080a, 0x8c204512, 0x0400000c, + 0x599c0018, 0x8c000518, 0x04000009, 0x592c000a, + 0x82000500, 0x00000380, 0x82041500, 0xfffffc7f, + 0x80080d40, 0x84040d54, 0x0401f002, 0x84040d14, + 0x4806680a, 0x4926601c, 0x4936600a, 0x492e6009, + 0x4a026407, 0x00000001, 0x417a7800, 0x0401f8ec, + 0x42000800, 0x00000005, 0x0401f8f4, 0x42027000, + 0x00000003, 0x0201f800, 0x00020bc1, 0x80000580, + 0x0401f0e2, 0x0201f800, 0x00104a7c, 0x040200c4, + 0x0201f800, 0x00104a38, 0x040200c7, 0x0201f800, + 0x00109e0e, 0x040000b8, 0x80000580, 0x0401f0d7, + 0x0201f800, 0x00104a7c, 0x040200b9, 0x0201f800, + 0x00104a38, 0x040200bc, 0x0201f800, 0x00109969, + 0x040000ad, 0x80000580, 0x0401f0cc, 0x0201f800, + 0x00104a7c, 0x040200ae, 0x83444d80, 0x000007fe, + 0x42000000, 0x0000000a, 0x0402008f, 0x0201f800, + 0x00109e27, 0x040000a0, 0x80000580, 0x0401f0bf, + 0x82200500, 0x00000070, 0x04020005, 0x8c20450e, + 0x42000000, 0x0000000c, 0x04020083, 0x8c20450a, + 0x0400000e, 0x4d3c0000, 0x42027800, 0x00005000, + 0x8c20450e, 0x04020003, 0x853e7d56, 0x853e7d1c, + 0x82200500, 0x000004a0, 0x0201f800, 0x001049de, + 0x5c027800, 0x0401f0a5, 0x8c204508, 0x04020027, + 0x592c1009, 0x82081500, 0x00ffffff, 0x59240005, + 0x80084d80, 0x42000000, 0x00000010, 0x0400006a, + 0x0201f800, 0x001049a9, 0x0400002f, 0x4803c857, 0x82004d80, 0x0000001a, 0x04020003, 0x40101000, - 0x0401f163, 0x4803c857, 0x82004d80, 0x0000001b, - 0x04020003, 0x40181000, 0x0401f15d, 0x4803c857, - 0x82004d80, 0x0000001f, 0x0400015e, 0x82004d80, - 0x0000001c, 0x0400015b, 0x82004d80, 0x00000019, - 0x42000000, 0x0000000a, 0x0400014a, 0x42000000, - 0x0000000a, 0x04020161, 0x59a80070, 0x8c000502, - 0x0400001b, 0x0201f800, 0x0010491a, 0x04000018, - 0x59340212, 0x82000500, 0x0000ff00, 0x42001000, - 0x00000010, 0x0402000c, 0x42001000, 0x00000008, - 0x59a8021b, 0x8c000506, 0x04020009, 0x59340002, - 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, - 0x04000007, 0x0201f800, 0x00104c17, 0x42000000, - 0x0000001c, 0x40181000, 0x04020131, 0x0201f800, - 0x00107cfe, 0x0400013b, 0x4926601c, 0x4936600a, - 0x492e6009, 0x4a026407, 0x00000001, 0x8c20450a, - 0x04000004, 0x592c0405, 0x8400055c, 0x48025c05, - 0x4c200000, 0x4d3c0000, 0x42027800, 0x00001800, - 0x0201f800, 0x0010fc72, 0x5c027800, 0x5c004000, - 0x8c204512, 0x0400000b, 0x599c0018, 0x8c000518, - 0x04000008, 0x592c000a, 0x82000500, 0x00000380, - 0x5934080a, 0x80040d40, 0x84040d54, 0x4806680a, - 0x417a7800, 0x0401f93d, 0x42000800, 0x00000003, - 0x0401f945, 0x42027000, 0x00000002, 0x0201f800, - 0x00020bc1, 0x80000580, 0x0401f133, 0x0201f800, - 0x0010497a, 0x04020115, 0x0201f800, 0x00104920, - 0x0400000c, 0x0201f800, 0x0010491a, 0x04020115, - 0x4c600000, 0x4178c000, 0x42027800, 0x00001800, - 0x417a6000, 0x0201f800, 0x00101cda, 0x5c00c000, - 0x59a80070, 0x8c000502, 0x0400001b, 0x0201f800, - 0x0010491a, 0x04000018, 0x59340212, 0x82000500, - 0x0000ff00, 0x42001000, 0x00000010, 0x0402000c, - 0x42001000, 0x00000008, 0x59a8021b, 0x8c000506, - 0x04020009, 0x59340002, 0x82000500, 0x00ff0000, - 0x82000580, 0x00ff0000, 0x04000007, 0x0201f800, - 0x00104c17, 0x42000000, 0x0000001c, 0x40181000, - 0x040200d7, 0x0201f800, 0x00107cfe, 0x040000e1, - 0x5934080a, 0x8c204512, 0x0400000c, 0x599c0018, - 0x8c000518, 0x04000009, 0x592c000a, 0x82000500, - 0x00000380, 0x82041500, 0xfffffc7f, 0x80080d40, - 0x84040d54, 0x0401f002, 0x84040d14, 0x4806680a, - 0x4926601c, 0x4936600a, 0x492e6009, 0x4a026407, - 0x00000001, 0x417a7800, 0x0401f8ec, 0x42000800, - 0x00000005, 0x0401f8f4, 0x42027000, 0x00000003, - 0x0201f800, 0x00020bc1, 0x80000580, 0x0401f0e2, - 0x0201f800, 0x0010497a, 0x040200c4, 0x0201f800, - 0x00104936, 0x040200c7, 0x0201f800, 0x00109bd6, - 0x040000b8, 0x80000580, 0x0401f0d7, 0x0201f800, - 0x0010497a, 0x040200b9, 0x0201f800, 0x00104936, - 0x040200bc, 0x0201f800, 0x00109731, 0x040000ad, - 0x80000580, 0x0401f0cc, 0x0201f800, 0x0010497a, - 0x040200ae, 0x83444d80, 0x000007fe, 0x42000000, - 0x0000000a, 0x0402008f, 0x0201f800, 0x00109bef, - 0x040000a0, 0x80000580, 0x0401f0bf, 0x82200500, - 0x00000070, 0x04020005, 0x8c20450e, 0x42000000, - 0x0000000c, 0x04020083, 0x8c20450a, 0x0400000e, - 0x4d3c0000, 0x42027800, 0x00005000, 0x8c20450e, - 0x04020003, 0x853e7d56, 0x853e7d1c, 0x82200500, - 0x000004a0, 0x0201f800, 0x001048de, 0x5c027800, - 0x0401f0a5, 0x8c204508, 0x04020027, 0x592c1009, - 0x82081500, 0x00ffffff, 0x59240005, 0x80084d80, - 0x42000000, 0x00000010, 0x0400006a, 0x0201f800, - 0x001048a9, 0x0400002f, 0x4803c857, 0x82004d80, - 0x0000001a, 0x04020003, 0x40101000, 0x0401f068, - 0x4803c857, 0x82004d80, 0x0000001b, 0x04020003, - 0x40181000, 0x0401f062, 0x4803c857, 0x82004d80, - 0x0000001f, 0x04000063, 0x82004d80, 0x0000001c, - 0x04000060, 0x82004d80, 0x00000019, 0x42000000, - 0x0000000a, 0x0400004f, 0x42000000, 0x0000000a, - 0x0401f066, 0x0201f800, 0x0010497a, 0x04020063, - 0x4d3c0000, 0x42027800, 0x00005000, 0x8c20450e, - 0x04020003, 0x853e7d56, 0x853e7d1c, 0x82200500, - 0x00000090, 0x0201f800, 0x001048c6, 0x5c027800, - 0x42000000, 0x0000000a, 0x0402003a, 0x0401f06a, - 0x836c0580, 0x00000003, 0x42000800, 0x00000007, - 0x04020006, 0x0201f800, 0x00109b7c, 0x04000007, - 0x80000580, 0x0401f064, 0x0201f800, 0x0010495c, - 0x04000059, 0x0401f05c, 0x0201f800, 0x0010495c, - 0x0400003c, 0x0401f058, 0x0201f800, 0x0010497a, - 0x0402003e, 0x836c0580, 0x00000003, 0x04020048, - 0x8c204508, 0x0400000a, 0x4c600000, 0x4178c000, + 0x0401f068, 0x4803c857, 0x82004d80, 0x0000001b, + 0x04020003, 0x40181000, 0x0401f062, 0x4803c857, + 0x82004d80, 0x0000001f, 0x04000063, 0x82004d80, + 0x0000001c, 0x04000060, 0x82004d80, 0x00000019, + 0x42000000, 0x0000000a, 0x0400004f, 0x42000000, + 0x0000000a, 0x0401f066, 0x0201f800, 0x00104a7c, + 0x04020063, 0x4d3c0000, 0x42027800, 0x00005000, + 0x8c20450e, 0x04020003, 0x853e7d56, 0x853e7d1c, + 0x82200500, 0x00000090, 0x0201f800, 0x001049c6, + 0x5c027800, 0x42000000, 0x0000000a, 0x0402003a, + 0x0401f06a, 0x836c0580, 0x00000003, 0x42000800, + 0x00000007, 0x04020006, 0x0201f800, 0x00109db4, + 0x04000007, 0x80000580, 0x0401f064, 0x0201f800, + 0x00104a5e, 0x04000059, 0x0401f05c, 0x0201f800, + 0x00104a5e, 0x0400003c, 0x0401f058, 0x0201f800, + 0x00104a7c, 0x0402003e, 0x836c0580, 0x00000003, + 0x04020048, 0x8c204508, 0x0400000a, 0x4c600000, + 0x4178c000, 0x42027800, 0x00001800, 0x417a6000, + 0x0201f800, 0x00101ce3, 0x5c00c000, 0x0401f047, + 0x0201f800, 0x00104a22, 0x0400000c, 0x0201f800, + 0x00104a1c, 0x04020030, 0x4c600000, 0x4178c000, 0x42027800, 0x00001800, 0x417a6000, 0x0201f800, - 0x00101cda, 0x5c00c000, 0x0401f047, 0x0201f800, - 0x00104920, 0x0400000c, 0x0201f800, 0x0010491a, - 0x04020030, 0x4c600000, 0x4178c000, 0x42027800, - 0x00001800, 0x417a6000, 0x0201f800, 0x00101cda, - 0x5c00c000, 0x480bc856, 0x0201f800, 0x001099cd, - 0x04000018, 0x80000580, 0x0401f037, 0x0401f7db, - 0x480bc857, 0x42000800, 0x00000019, 0x40001000, - 0x4200b000, 0x00000002, 0x0401f00a, 0x480bc857, - 0x40000800, 0x4200b000, 0x00000002, 0x0401f005, - 0x480bc857, 0x40000800, 0x4200b000, 0x00000001, - 0x480bc857, 0x42028000, 0x00000031, 0x0401f020, - 0x480bc857, 0x42000800, 0x00000003, 0x4200b000, - 0x00000001, 0x0401f7f7, 0x480bc857, 0x42000800, - 0x0000000a, 0x4200b000, 0x00000001, 0x0401f7f1, - 0x480bc857, 0x42000800, 0x00000009, 0x40001000, - 0x4200b000, 0x00000002, 0x0401f7ea, 0x480bc857, - 0x42000800, 0x00000007, 0x4200b000, 0x00000001, - 0x0401f7e4, 0x480bc857, 0x4200b000, 0x00000001, - 0x0401f7e0, 0x80028580, 0x4178b000, 0x82000540, - 0x00000001, 0x1c01f000, 0x4937c857, 0x5932680a, - 0x59341200, 0x813e79c0, 0x04000003, 0x84081540, - 0x0401f002, 0x84081500, 0x480a6a00, 0x1c01f000, - 0x40680800, 0x5932680a, 0x5c000000, 0x4c000000, - 0x4803c857, 0x4937c857, 0x82040580, 0x00000006, + 0x00101ce3, 0x5c00c000, 0x480bc856, 0x0201f800, + 0x00109c05, 0x04000018, 0x80000580, 0x0401f037, + 0x0401f7db, 0x480bc857, 0x42000800, 0x00000019, + 0x40001000, 0x4200b000, 0x00000002, 0x0401f00a, + 0x480bc857, 0x40000800, 0x4200b000, 0x00000002, + 0x0401f005, 0x480bc857, 0x40000800, 0x4200b000, + 0x00000001, 0x480bc857, 0x42028000, 0x00000031, + 0x0401f020, 0x480bc857, 0x42000800, 0x00000003, + 0x4200b000, 0x00000001, 0x0401f7f7, 0x480bc857, + 0x42000800, 0x0000000a, 0x4200b000, 0x00000001, + 0x0401f7f1, 0x480bc857, 0x42000800, 0x00000009, + 0x40001000, 0x4200b000, 0x00000002, 0x0401f7ea, + 0x480bc857, 0x42000800, 0x00000007, 0x4200b000, + 0x00000001, 0x0401f7e4, 0x480bc857, 0x4200b000, + 0x00000001, 0x0401f7e0, 0x80028580, 0x4178b000, + 0x82000540, 0x00000001, 0x1c01f000, 0x4937c857, + 0x5932680a, 0x59341200, 0x813e79c0, 0x04000003, + 0x84081540, 0x0401f002, 0x84081500, 0x480a6a00, + 0x1c01f000, 0x40680800, 0x5932680a, 0x5c000000, + 0x4c000000, 0x4803c857, 0x4937c857, 0x83340580, + 0x0010e23c, 0x04000030, 0x82040580, 0x00000006, 0x04020004, 0x42000000, 0x00000606, 0x0401f021, 0x82040580, 0x00000004, 0x04020004, 0x42000000, 0x00000404, 0x0401f01b, 0x82040580, 0x00000007, @@ -18977,18 +19092,18 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x41358800, 0x04000002, 0x41798800, 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, 0x4947c857, 0x481bc857, 0x83440480, 0x00000800, 0x04021057, - 0x83200400, 0x0010bdc7, 0x50024800, 0x59240009, + 0x83200400, 0x0010c10d, 0x50024800, 0x59240009, 0x83441480, 0x000007f0, 0x04001003, 0x80081400, - 0x0401f003, 0x83441400, 0x0010bf80, 0x50080000, + 0x0401f003, 0x83441400, 0x0010c280, 0x50080000, 0x80026d40, 0x04000005, 0x59340013, 0x80000130, 0x81200580, 0x04000018, 0x4c180000, 0x4d2c0000, 0x0201f800, 0x0010056e, 0x412e6800, 0x5c025800, 0x5c003000, 0x0400003d, 0x59242005, 0x812000f0, 0x80102540, 0x48126813, 0x59242207, 0x80102000, 0x48124a07, 0x45341000, 0x497a680d, 0x497a6810, - 0x497a680f, 0x497a680e, 0x4c180000, 0x0401fc89, + 0x497a680f, 0x497a680e, 0x4c180000, 0x0401fc86, 0x5c003000, 0x59340a12, 0x4c040000, 0x0201f800, - 0x00104fc6, 0x5c000800, 0x04000009, 0x82180500, + 0x001050f7, 0x5c000800, 0x04000009, 0x82180500, 0x00ffff00, 0x04000008, 0x59a8100f, 0x82081500, 0x00ffff00, 0x80080580, 0x04000003, 0x80000580, 0x0401f004, 0x82180500, 0x000000ff, 0x800000d0, @@ -19000,58 +19115,59 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x80180580, 0x04000003, 0x481bc857, 0x481a6802, 0x80000580, 0x1c01f000, 0x4803c856, 0x82000540, 0x00000001, 0x0401f7fc, 0x4947c857, 0x83440480, - 0x00000800, 0x04021019, 0x83200400, 0x0010bdc7, + 0x00000800, 0x04021019, 0x83200400, 0x0010c10d, 0x50024800, 0x59240009, 0x83441480, 0x000007f0, 0x04001003, 0x80081400, 0x0401f003, 0x83441400, - 0x0010bf80, 0x50080000, 0x80026d40, 0x0400000a, - 0x0401fb7a, 0x04020009, 0x8d0e1d02, 0x04000004, + 0x0010c280, 0x50080000, 0x80026d40, 0x0400000a, + 0x0401fb80, 0x04020009, 0x8d0e1d02, 0x04000004, 0x59340200, 0x8c00050e, 0x04000004, 0x82000540, 0x00000001, 0x1c01f000, 0x80000580, 0x0401f7fe, 0x5c000000, 0x4c000000, 0x4803c857, 0x4947c857, 0x0401f807, 0x42018800, 0x00000001, 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x83440480, 0x00000800, 0x04021024, - 0x83441400, 0x0010bf80, 0x50080000, 0x80026d40, + 0x83441400, 0x0010c280, 0x50080000, 0x80026d40, 0x0400001b, 0x45781000, 0x5934000d, 0x80025d40, 0x02020800, 0x0010059d, 0x59366011, 0x813261c0, 0x0400000e, 0x4c640000, 0x5930c800, 0x59325809, - 0x0201f800, 0x00109667, 0x02020800, 0x0010059d, + 0x0201f800, 0x0010989f, 0x02020800, 0x0010059d, 0x0201f800, 0x00020b9d, 0x82666540, 0x00000000, - 0x040207f6, 0x5c00c800, 0x0201f800, 0x00104c0c, + 0x040207f6, 0x5c00c800, 0x0201f800, 0x00104d11, 0x41365800, 0x0201f800, 0x00100595, 0x80000580, 0x5c026000, 0x5c025800, 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fb, 0x0201f800, 0x0002034c, 0x41358800, 0x04000002, 0x41798800, 0x1c01f000, 0x4c580000, 0x59cc0001, 0x4937c857, 0x82000500, 0x00ffffff, 0x48026802, 0x497a6c01, 0x497a6a01, - 0x59340200, 0x84000502, 0x48026a00, 0x4004b000, - 0x0201f800, 0x00104fc6, 0x0402001c, 0x59340403, - 0x82000580, 0x000007fe, 0x04000005, 0x59a8021b, - 0x8c00050a, 0x04020015, 0x0401f008, 0x59cc0408, - 0x8c000518, 0x04000011, 0x59cc0009, 0x48035028, - 0x59cc000a, 0x48035029, 0x59a80878, 0x8c040d3e, - 0x0402000a, 0x8058b1c0, 0x04020008, 0x59cc0207, - 0x80000540, 0x04020003, 0x42000000, 0x00000001, - 0x48038893, 0x48035012, 0x59cc0a09, 0x82040d00, - 0x00000010, 0x59cc0408, 0x82000500, 0x00000020, - 0x04000005, 0x84040d40, 0x59a8121b, 0x8408155a, - 0x480b521b, 0x5934000a, 0x82000500, 0xffffffee, - 0x80040540, 0x4802680a, 0x83cca400, 0x0000000b, - 0x8334ac00, 0x00000006, 0x4200b000, 0x00000002, - 0x0201f800, 0x0010bd5b, 0x83cca400, 0x0000000d, - 0x8334ac00, 0x00000008, 0x4200b000, 0x00000002, - 0x0201f800, 0x0010bd5b, 0x59cc0a18, 0x82040480, + 0x59340200, 0x82000500, 0xffffdffd, 0x48026a00, + 0x4004b000, 0x0201f800, 0x001050f7, 0x0402001c, + 0x59340403, 0x82000580, 0x000007fe, 0x04000005, + 0x59a8021b, 0x8c00050a, 0x04020015, 0x0401f008, + 0x59cc0408, 0x8c000518, 0x04000011, 0x59cc0009, + 0x48035028, 0x59cc000a, 0x48035029, 0x59a80878, + 0x8c040d3e, 0x0402000a, 0x8058b1c0, 0x04020008, + 0x59cc0207, 0x80000540, 0x04020003, 0x42000000, + 0x00000001, 0x48038893, 0x48035012, 0x59cc0a09, + 0x82040d00, 0x00000010, 0x59cc0408, 0x82000500, + 0x00000020, 0x04000005, 0x84040d40, 0x59a8121b, + 0x8408155a, 0x480b521b, 0x5934000a, 0x82000500, + 0xffffffee, 0x80040540, 0x4802680a, 0x83cca400, + 0x0000000b, 0x8334ac00, 0x00000006, 0x4200b000, + 0x00000002, 0x0201f800, 0x0010c086, 0x83cca400, + 0x0000000d, 0x8334ac00, 0x00000008, 0x4200b000, + 0x00000002, 0x0201f800, 0x0010c086, 0x59cc0a18, + 0x59a80006, 0x8c00050c, 0x04020015, 0x82040480, 0x00000800, 0x0402100c, 0x82040480, 0x00000400, 0x04001004, 0x42000800, 0x00000400, 0x0401f006, 0x82040480, 0x00000200, 0x04001003, 0x42000800, - 0x00000200, 0x42001000, 0x0010c89b, 0x58080201, + 0x00000200, 0x42001000, 0x0010cb9b, 0x58080201, 0x80041480, 0x04001002, 0x40000800, 0x48066a04, 0x59340403, 0x82000580, 0x000007fe, 0x04020003, - 0x59cc0a08, 0x48066a04, 0x0201f800, 0x00104c3a, + 0x59cc0a08, 0x48066a04, 0x0201f800, 0x00104d3f, 0x5c00b000, 0x1c01f000, 0x59a8021b, 0x4937c857, 0x8c000508, 0x04000008, 0x84000556, 0x4803c857, - 0x4803521b, 0x42001000, 0x00110694, 0x0201f800, - 0x001062f9, 0x59cc0207, 0x4803c857, 0x48026a05, + 0x4803521b, 0x42001000, 0x00110987, 0x0201f800, + 0x001064fe, 0x59cc0207, 0x4803c857, 0x48026a05, 0x59cc020a, 0x4803c857, 0x48026c05, 0x59341200, 0x599c0818, 0x5934180a, 0x4807c857, 0x480bc857, 0x480fc857, 0x59cc2006, 0x82102500, 0xff000000, @@ -19129,7 +19245,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4862680f, 0x0401f006, 0x4860b800, 0x59340010, 0x812c0580, 0x04020002, 0x485e6810, 0x4a025a05, 0x00000103, 0x49425a07, 0x497a580a, 0x0201f800, - 0x00109824, 0x0201f800, 0x000203ef, 0x40625800, + 0x00109a5c, 0x0201f800, 0x000203ef, 0x40625800, 0x0401f7d7, 0x412cb800, 0x592e5800, 0x0401f7d4, 0x5c00b800, 0x5c00c000, 0x5c025800, 0x1c01f000, 0x4803c856, 0x41781800, 0x5934000f, 0x80025d40, @@ -19164,9 +19280,9 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00000001, 0x5c025800, 0x1c01f000, 0x59340405, 0x4937c857, 0x4803c857, 0x8c000508, 0x1c01f000, 0x4933c857, 0x5930380a, 0x581c0200, 0x8400051a, - 0x48003a00, 0x1c01f000, 0x42026800, 0x0010c87b, + 0x48003a00, 0x1c01f000, 0x42026800, 0x0010cb7b, 0x497a680e, 0x42028800, 0x000007ff, 0x0201f800, - 0x001041e4, 0x4937c857, 0x4a026c00, 0x00000606, + 0x001042dd, 0x4937c857, 0x4a026c00, 0x00000606, 0x4a026802, 0x00ffffff, 0x4a026813, 0x00ffffff, 0x4a026a04, 0x00000200, 0x4a026c04, 0x00000002, 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, @@ -19175,7 +19291,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x8c00050e, 0x1c01f000, 0x5930000a, 0x50000000, 0x8c00050a, 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, 0x04000003, 0x42018800, 0x00000000, - 0x1c01f000, 0x4933c856, 0x0401f8df, 0x04000006, + 0x1c01f000, 0x4933c856, 0x0401f8e1, 0x04000006, 0x59340400, 0x82000d00, 0x000000ff, 0x82041580, 0x00000005, 0x1c01f000, 0x4803c856, 0x59a80a1b, 0x8c040d06, 0x0400000b, 0x5930081c, 0x58040200, @@ -19184,8 +19300,8 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, 0x04020003, 0x42018800, 0x00000000, 0x1c01f000, 0x4d340000, 0x4c580000, 0x59a80a1b, 0x8c040d06, - 0x04000019, 0x0201f800, 0x0010bd9f, 0x42000800, - 0x0010ccd1, 0x58041009, 0x82080400, 0x0000000e, + 0x04000019, 0x0201f800, 0x0010c0ca, 0x42000800, + 0x0010cfd1, 0x58041009, 0x82080400, 0x0000000e, 0x50026800, 0x813669c0, 0x0400000a, 0x58040200, 0x82000500, 0x00000003, 0x82000580, 0x00000003, 0x04020004, 0x59340200, 0x8c00051a, 0x04020006, @@ -19194,12 +19310,12 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4937c857, 0x493fc857, 0x59341200, 0x813e79c0, 0x04000003, 0x8408155e, 0x0401f002, 0x8408151e, 0x480a6a00, 0x1c01f000, 0x4937c857, 0x0201f800, - 0x00101d49, 0x04000006, 0x59a80828, 0x42001000, - 0x001048a0, 0x0201f800, 0x00106433, 0x1c01f000, - 0x4937c857, 0x42001000, 0x001048a0, 0x0201f800, - 0x001062f9, 0x59a8121b, 0x84081512, 0x480b521b, + 0x00101d52, 0x04000006, 0x59a80828, 0x42001000, + 0x001049a0, 0x0201f800, 0x00106638, 0x1c01f000, + 0x4937c857, 0x42001000, 0x001049a0, 0x0201f800, + 0x001064fe, 0x59a8121b, 0x84081512, 0x480b521b, 0x1c01f000, 0x4008d000, 0x4020d800, 0x829d3c80, - 0x00000004, 0x409ce000, 0x0201f800, 0x001107e2, + 0x00000004, 0x409ce000, 0x0201f800, 0x00110ae2, 0x589c0000, 0x589c2001, 0x589c2802, 0x589c3003, 0x829d3c00, 0x00000004, 0x800001c0, 0x1c01f000, 0x4d340000, 0x406a6800, 0x0401f803, 0x5c026800, @@ -19207,9 +19323,9 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04001002, 0x480a6c0b, 0x80000540, 0x02020800, 0x0002035a, 0x1c01f000, 0x4803c857, 0x4947c857, 0x4c300000, 0x82006500, 0x00000030, 0x04000006, - 0x4c000000, 0x0201f800, 0x00109ad9, 0x5c000000, - 0x0402000b, 0x8c00050e, 0x04000006, 0x0401f8a7, - 0x04020007, 0x4937c857, 0x41240800, 0x0401f8bb, + 0x4c000000, 0x0201f800, 0x00109d11, 0x5c000000, + 0x0402000b, 0x8c00050e, 0x04000006, 0x0401f8a9, + 0x04020007, 0x4937c857, 0x41240800, 0x0401f8bd, 0x80000580, 0x5c006000, 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fc, 0x4803c857, 0x4c580000, 0x4d440000, 0x40001000, 0x80000d80, 0x4200b000, @@ -19218,75 +19334,76 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x80040800, 0x8058b040, 0x040207f7, 0x8c081514, 0x04000007, 0x84081514, 0x4200b000, 0x00000001, 0x42000800, 0x000007fc, 0x0401f7ef, 0x4d300000, - 0x4d400000, 0x4d240000, 0x42028800, 0x0000ffff, - 0x42026000, 0x0011120c, 0x497a600a, 0x417a4800, - 0x4926601c, 0x42028000, 0x00000029, 0x0201f800, - 0x00106c3c, 0x4df00000, 0x0201f800, 0x00110053, - 0x0201f800, 0x00110623, 0x5c03e000, 0x02000800, - 0x00106c29, 0x5c024800, 0x5c028000, 0x5c026000, - 0x5c028800, 0x5c00b000, 0x1c01f000, 0x0401f807, - 0x42018800, 0x00000001, 0x04000003, 0x42018800, - 0x00000000, 0x1c01f000, 0x4c5c0000, 0x59340400, + 0x4d400000, 0x4d240000, 0x0401fba2, 0x42028800, + 0x0000ffff, 0x42026000, 0x0011152c, 0x4a02600a, + 0x0010e23c, 0x417a4800, 0x4926601c, 0x42028000, + 0x00000029, 0x0201f800, 0x00106e41, 0x4df00000, + 0x0201f800, 0x00110363, 0x0201f800, 0x00110916, + 0x5c03e000, 0x02000800, 0x00106e2e, 0x5c024800, + 0x5c028000, 0x5c026000, 0x5c028800, 0x5c00b000, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, + 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, + 0x4c5c0000, 0x59340400, 0x8200bd80, 0x00000606, + 0x5c00b800, 0x1c01f000, 0x4c5c0000, 0x59340400, + 0x8200bd80, 0x00000404, 0x5c00b800, 0x1c01f000, + 0x0401f807, 0x42018800, 0x00000001, 0x04000003, + 0x42018800, 0x00000000, 0x1c01f000, 0x4c5c0000, + 0x59340400, 0x8200bd80, 0x00000404, 0x04000003, 0x8200bd80, 0x00000606, 0x5c00b800, 0x1c01f000, - 0x4c5c0000, 0x59340400, 0x8200bd80, 0x00000404, - 0x5c00b800, 0x1c01f000, 0x0401f807, 0x42018800, - 0x00000001, 0x04000003, 0x42018800, 0x00000000, - 0x1c01f000, 0x4c5c0000, 0x59340400, 0x8200bd80, - 0x00000404, 0x04000003, 0x8200bd80, 0x00000606, - 0x5c00b800, 0x1c01f000, 0x4c5c0000, 0x4c600000, - 0x59340400, 0x8200bd00, 0x0000ff00, 0x825cc580, - 0x00000400, 0x04000003, 0x825cc580, 0x00000600, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4c5c0000, - 0x59340400, 0x82000500, 0x000000ff, 0x8200bd80, - 0x00000003, 0x04000003, 0x8200bd80, 0x00000005, - 0x5c00b800, 0x1c01f000, 0x5c000000, 0x4c000000, - 0x4803c857, 0x4c5c0000, 0x59340400, 0x82000500, - 0x0000ff00, 0x8400b9c0, 0x805c0580, 0x4937c857, - 0x4803c857, 0x48026c00, 0x5c00b800, 0x1c01f000, - 0x4c040000, 0x4c080000, 0x592c0208, 0x8c00050c, - 0x0400000f, 0x592e8c07, 0x82000500, 0x00000080, - 0x84000548, 0x4d3c0000, 0x42027800, 0x00001000, - 0x0401ff5e, 0x5c027800, 0x82000540, 0x00000001, - 0x5c001000, 0x5c000800, 0x1c01f000, 0x80000580, - 0x0401f7fc, 0x59340013, 0x80024130, 0x83224c00, - 0x0010bdc7, 0x51264800, 0x812649c0, 0x02000800, - 0x0010032e, 0x1c01f000, 0x83440c80, 0x00000800, - 0x04021013, 0x83200400, 0x0010bdc7, 0x50024800, - 0x59240009, 0x83440c80, 0x000007f0, 0x04001003, - 0x80040c00, 0x0401f003, 0x83440c00, 0x0010bf80, - 0x50040000, 0x80026d40, 0x04000005, 0x59340013, - 0x80000130, 0x81200580, 0x1c01f000, 0x82000540, - 0x00000001, 0x0401f7fd, 0x4937c857, 0x4c580000, - 0x4d440000, 0x59368c03, 0x83441480, 0x000007f0, - 0x04021003, 0x0401fc13, 0x0401f00d, 0x58040009, - 0x80080c00, 0x50040000, 0x81340580, 0x02020800, - 0x0010032e, 0x4d2c0000, 0x45780800, 0x41365800, - 0x0201f800, 0x00100594, 0x5c025800, 0x80000580, - 0x5c028800, 0x5c00b000, 0x1c01f000, 0x592c040c, - 0x82000500, 0x0000e000, 0x82000580, 0x00006000, - 0x04000026, 0x836c0580, 0x00000003, 0x04000016, - 0x836c0580, 0x00000002, 0x0402011f, 0x59a8021b, - 0x82000d00, 0x00000038, 0x04020005, 0x59a80813, - 0x800409c0, 0x0400000c, 0x0401f117, 0x82000d00, - 0x00000003, 0x82040d80, 0x00000003, 0x04020112, - 0x82000d00, 0x00000028, 0x04020003, 0x8c00050c, - 0x0400010d, 0x592e4408, 0x83224500, 0x000000ff, - 0x0201f800, 0x00105acb, 0x040200da, 0x592c100b, - 0x82080500, 0xff000000, 0x040200e5, 0x59240005, - 0x80080580, 0x040000df, 0x592c0c0c, 0x82040d00, - 0x0000e000, 0x82040480, 0x00008000, 0x040210df, - 0x592e8c07, 0x83440480, 0x00000800, 0x04001014, - 0x83440580, 0x0000ffff, 0x040200c3, 0x800409c0, - 0x04020111, 0x592c240a, 0x82100500, 0xffffff00, - 0x040200c9, 0x480bc857, 0x4813c857, 0x592c000e, - 0x82000480, 0x00000841, 0x040210cf, 0x42027000, - 0x00000053, 0x417a6800, 0x0401f09b, 0x800409c0, - 0x04020101, 0x41784000, 0x0401feb3, 0x040200e8, - 0x59342204, 0x592c000e, 0x80100480, 0x040010c2, + 0x4c5c0000, 0x4c600000, 0x59340400, 0x8200bd00, + 0x0000ff00, 0x825cc580, 0x00000400, 0x04000003, + 0x825cc580, 0x00000600, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x4c5c0000, 0x59340400, 0x82000500, + 0x000000ff, 0x8200bd80, 0x00000003, 0x04000003, + 0x8200bd80, 0x00000005, 0x5c00b800, 0x1c01f000, + 0x5c000000, 0x4c000000, 0x4803c857, 0x4c5c0000, + 0x59340400, 0x82000500, 0x0000ff00, 0x8400b9c0, + 0x805c0580, 0x4937c857, 0x4803c857, 0x48026c00, + 0x5c00b800, 0x1c01f000, 0x4c040000, 0x4c080000, + 0x592c0208, 0x8c00050c, 0x0400000f, 0x592e8c07, + 0x82000500, 0x00000080, 0x84000548, 0x4d3c0000, + 0x42027800, 0x00001000, 0x0401ff5c, 0x5c027800, + 0x82000540, 0x00000001, 0x5c001000, 0x5c000800, + 0x1c01f000, 0x80000580, 0x0401f7fc, 0x59340013, + 0x80024130, 0x83224c00, 0x0010c10d, 0x51264800, + 0x812649c0, 0x02000800, 0x0010032e, 0x1c01f000, + 0x83440c80, 0x00000800, 0x04021013, 0x83200400, + 0x0010c10d, 0x50024800, 0x59240009, 0x83440c80, + 0x000007f0, 0x04001003, 0x80040c00, 0x0401f003, + 0x83440c00, 0x0010c280, 0x50040000, 0x80026d40, + 0x04000005, 0x59340013, 0x80000130, 0x81200580, + 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fd, + 0x4937c857, 0x4c580000, 0x4d440000, 0x59368c03, + 0x83441480, 0x000007f0, 0x04021003, 0x0401fc0d, + 0x0401f00d, 0x58040009, 0x80080c00, 0x50040000, + 0x81340580, 0x02020800, 0x0010032e, 0x4d2c0000, + 0x45780800, 0x41365800, 0x0201f800, 0x00100594, + 0x5c025800, 0x80000580, 0x5c028800, 0x5c00b000, + 0x1c01f000, 0x592c040c, 0x82000500, 0x0000e000, + 0x82000580, 0x00006000, 0x04000026, 0x836c0580, + 0x00000003, 0x04000016, 0x836c0580, 0x00000002, + 0x04020122, 0x59a8021b, 0x82000d00, 0x00000038, + 0x04020005, 0x59a80813, 0x800409c0, 0x0400000c, + 0x0401f11a, 0x82000d00, 0x00000003, 0x82040d80, + 0x00000003, 0x04020115, 0x82000d00, 0x00000028, + 0x04020003, 0x8c00050c, 0x04000110, 0x592e4408, + 0x83224500, 0x000000ff, 0x0201f800, 0x00105c82, + 0x040200dd, 0x592c100b, 0x82080500, 0xff000000, + 0x040200e8, 0x59240005, 0x80080580, 0x040000e2, + 0x592c0c0c, 0x82040d00, 0x0000e000, 0x82040480, + 0x00008000, 0x040210e2, 0x592e8c07, 0x83440480, + 0x00000800, 0x04001016, 0x83440580, 0x0000ffff, + 0x040200c6, 0x800409c0, 0x04020114, 0x592c240a, + 0x82100500, 0xffffff00, 0x040200cc, 0x480bc857, + 0x4813c857, 0x592c000e, 0x82000480, 0x00000841, + 0x040210d2, 0x42027000, 0x00000053, 0x0401faa9, + 0x42026800, 0x0010e23c, 0x0401f09b, 0x800409c0, + 0x04020102, 0x41784000, 0x0401feaf, 0x040200e9, + 0x59342204, 0x592c000e, 0x80100480, 0x040010c3, 0x42027000, 0x00000053, 0x592c240a, 0x82100500, - 0xffffff00, 0x040200b0, 0x4813c857, 0x592c000d, + 0xffffff00, 0x040200b1, 0x4813c857, 0x592c000d, 0x800001c0, 0x04000085, 0x82100580, 0x00000004, - 0x040000a6, 0x82100580, 0x00000051, 0x040000a3, + 0x040000a7, 0x82100580, 0x00000051, 0x040000a4, 0x82100580, 0x00000003, 0x04000016, 0x82100580, 0x00000020, 0x0400004c, 0x82100580, 0x00000024, 0x04000043, 0x82100580, 0x00000021, 0x04000043, @@ -19294,937 +19411,954 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00000052, 0x04000032, 0x82100580, 0x00000005, 0x0402006d, 0x42027000, 0x00000001, 0x0401f01b, 0x42027000, 0x00000002, 0x59a80070, 0x8c000502, - 0x04000016, 0x0401fef1, 0x04000014, 0x59340212, + 0x04000016, 0x0401feef, 0x04000014, 0x59340212, 0x82000500, 0x0000ff00, 0x42001000, 0x00000010, - 0x0402000c, 0x59a8021b, 0x8c000506, 0x04020072, + 0x0402000c, 0x59a8021b, 0x8c000506, 0x04020073, 0x42001000, 0x00000008, 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000003, - 0x0401f9db, 0x04020068, 0x0201f800, 0x00107cfe, - 0x04000087, 0x4a026407, 0x00000010, 0x4926601c, + 0x0401f9dc, 0x04020069, 0x0201f800, 0x00107ef8, + 0x04000088, 0x4a026407, 0x00000010, 0x4926601c, 0x4936600a, 0x42000800, 0x00000003, 0x83380580, 0x00000002, 0x04000003, 0x42000800, 0x0000000b, - 0x0201f800, 0x001044f1, 0x0401f046, 0x42027000, + 0x0201f800, 0x001045ea, 0x0401f046, 0x42027000, 0x00000000, 0x0401f003, 0x42027000, 0x00000004, - 0x0401fee2, 0x04020079, 0x0401f037, 0x42027000, + 0x0401fee0, 0x0402007a, 0x0401f037, 0x42027000, 0x00000033, 0x0401f006, 0x42027000, 0x00000005, - 0x0401f003, 0x42027000, 0x00000003, 0x0401fece, - 0x0402006e, 0x59a80070, 0x8c000502, 0x04000016, - 0x0401feb6, 0x04000014, 0x59340212, 0x82000500, + 0x0401f003, 0x42027000, 0x00000003, 0x0401fecc, + 0x0402006f, 0x59a80070, 0x8c000502, 0x04000016, + 0x0401feb4, 0x04000014, 0x59340212, 0x82000500, 0x0000ff00, 0x42001000, 0x00000010, 0x0402000c, - 0x59a8021b, 0x8c000506, 0x04020037, 0x42001000, + 0x59a8021b, 0x8c000506, 0x04020038, 0x42001000, 0x00000008, 0x59340002, 0x82000500, 0x00ff0000, - 0x82000580, 0x00ff0000, 0x04000003, 0x0401f9a0, - 0x0402002d, 0x0201f800, 0x00107cfe, 0x0400004c, + 0x82000580, 0x00ff0000, 0x04000003, 0x0401f9a1, + 0x0402002e, 0x0201f800, 0x00107ef8, 0x0400004d, 0x4a026407, 0x00000010, 0x4926601c, 0x4936600a, 0x42000800, 0x00000005, 0x83380580, 0x00000003, 0x04000003, 0x42000800, 0x00000009, 0x0201f800, - 0x001044f1, 0x0401f00b, 0x82102580, 0x00000011, - 0x04020034, 0x0201f800, 0x00107cfe, 0x04000038, + 0x001045ea, 0x0401f00b, 0x82102580, 0x00000011, + 0x04020035, 0x0201f800, 0x00107ef8, 0x04000039, 0x4a026407, 0x00000010, 0x4926601c, 0x4936600a, - 0x492e6009, 0x49325809, 0x813669c0, 0x04000007, - 0x592c0c0c, 0x8c040d18, 0x04000004, 0x59340200, - 0x84000514, 0x48026a00, 0x0201f800, 0x00020bc1, - 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, - 0x0401f7fd, 0x42001000, 0x0000000a, 0x0401f01b, - 0x42001000, 0x0000000e, 0x0401f018, 0x42001000, - 0x00000010, 0x0401f015, 0x42001000, 0x00000016, - 0x0401f012, 0x42001000, 0x00000017, 0x0401f00f, - 0x42001000, 0x00000018, 0x0401f00c, 0x42001000, - 0x0000001b, 0x0401f009, 0x42001000, 0x0000001e, - 0x0401f006, 0x42001000, 0x00000024, 0x0401f003, - 0x42001000, 0x00000020, 0x42000800, 0x00000019, - 0x42028000, 0x00000031, 0x0401f7dc, 0x42000800, - 0x00000003, 0x0401f003, 0x42000800, 0x0000000a, - 0x41781000, 0x0401f7f7, 0x42000800, 0x00000009, - 0x59341400, 0x0401f7f3, 0x42028000, 0x00000008, - 0x0401f005, 0x42000800, 0x00000007, 0x416c1000, - 0x0401f7ec, 0x41780800, 0x41781000, 0x0401f7c7, - 0x42028000, 0x00000000, 0x0401f7fb, 0x82004d80, - 0x0000001d, 0x02000800, 0x0010032e, 0x82004d80, - 0x0000001a, 0x04020004, 0x40101000, 0x40000800, - 0x0401f7dc, 0x82004d80, 0x0000001b, 0x04020003, - 0x40181000, 0x0401f7fa, 0x82004d80, 0x0000001c, - 0x040007f7, 0x82004d80, 0x00000019, 0x040007b2, - 0x0401f7d6, 0x592e6009, 0x0201f800, 0x00109acc, - 0x040007b3, 0x59300c07, 0x82040580, 0x00000011, - 0x040207d6, 0x592c0c0c, 0x82041500, 0x0000e000, - 0x82080580, 0x00006000, 0x04000024, 0x83440580, - 0x0000ffff, 0x04020005, 0x5932680a, 0x813669c0, - 0x0400000e, 0x0401f7c9, 0x592c100b, 0x82081500, - 0x00ffffff, 0x41784000, 0x0401fd9b, 0x040207d0, - 0x5930000a, 0x800001c0, 0x04000003, 0x81340580, - 0x040207be, 0x4936600a, 0x42000800, 0x00000840, - 0x813669c0, 0x04000002, 0x59340a04, 0x592c000e, - 0x80040480, 0x040017a0, 0x59300a03, 0x82040580, - 0x00000007, 0x040207b1, 0x492e6009, 0x42027000, - 0x00000054, 0x0401f771, 0x0201f800, 0x0010b3a3, - 0x040007b4, 0x0401f7a9, 0x492fc857, 0x592e6009, - 0x83300580, 0xffffffff, 0x04020047, 0x592c0208, - 0x8c000500, 0x04020083, 0x8d0e1d0e, 0x04020069, - 0x592e8c07, 0x83440480, 0x00000800, 0x0402103b, - 0x592c380b, 0x821c3d00, 0x00ffffff, 0x0201f800, - 0x00101f66, 0x04020041, 0x49265802, 0x41784000, - 0x592c100a, 0x82081500, 0x00ffffff, 0x0401fd66, - 0x0402005b, 0x592e6014, 0x4933c857, 0x83300580, - 0xffffffff, 0x0400001b, 0x0201f800, 0x00109acc, - 0x04000035, 0x591c1407, 0x800811c0, 0x04000015, - 0x592c040e, 0x591c0a02, 0x80040580, 0x04020011, - 0x591c000a, 0x800001c0, 0x04020007, 0x591c0827, - 0x59340002, 0x80040580, 0x82000500, 0x00ffffff, - 0x0401f002, 0x81340580, 0x04020006, 0x82080580, - 0x00000007, 0x04020038, 0x4a023c03, 0x00000024, - 0x59240005, 0x592c080a, 0x82041500, 0x00ffffff, - 0x80081580, 0x0400000f, 0x80040932, 0x82040580, - 0x00000042, 0x0402000e, 0x49365803, 0x0401f908, - 0x80000580, 0x1c01f000, 0x42001000, 0x0000000a, - 0x0401f00f, 0x42001000, 0x00000010, 0x0401f00c, - 0x42001000, 0x00000014, 0x0401f009, 0x42001000, - 0x00000017, 0x0401f006, 0x42001000, 0x00000018, - 0x0401f003, 0x42001000, 0x0000003c, 0x492fc857, - 0x480bc857, 0x42000800, 0x00000019, 0x42028000, - 0x00000031, 0x82000540, 0x00000001, 0x0401f7e6, - 0x492fc857, 0x4803c857, 0x480bc857, 0x40000800, - 0x0401f7f7, 0x492fc857, 0x42000800, 0x0000000a, - 0x41781000, 0x0401f7f2, 0x41780800, 0x41781000, - 0x0401f7f1, 0x42000800, 0x0000001e, 0x0401f7f9, - 0x42000800, 0x00000001, 0x0401f7f6, 0x82004d80, - 0x0000001d, 0x02000800, 0x0010032e, 0x82004d80, - 0x0000001a, 0x04020003, 0x40101000, 0x0401f7e5, - 0x82004d80, 0x0000001b, 0x04020003, 0x40181000, - 0x0401f7e0, 0x82004d80, 0x0000001c, 0x040007dd, - 0x82004d80, 0x00000019, 0x040007da, 0x0401f7de, - 0x0201f800, 0x0010b496, 0x42028000, 0x00000000, - 0x0401f7de, 0x5c000000, 0x4c000000, 0x4803c857, - 0x5930200a, 0x801021c0, 0x04000035, 0x58101400, - 0x4813c857, 0x480bc857, 0x82081d00, 0x000000ff, - 0x59300c03, 0x82040580, 0x00000008, 0x04000022, - 0x82040580, 0x0000000a, 0x04000017, 0x82040580, - 0x0000000c, 0x04000010, 0x82040580, 0x00000002, - 0x04000019, 0x82040580, 0x00000001, 0x04000012, - 0x82040580, 0x00000003, 0x0400000b, 0x82040580, - 0x00000005, 0x04000004, 0x82040580, 0x00000033, - 0x04020017, 0x820c0580, 0x00000009, 0x0400000d, - 0x0401f013, 0x820c0580, 0x00000005, 0x04000009, - 0x0401f00f, 0x820c0580, 0x0000000b, 0x04000005, - 0x0401f00b, 0x820c0580, 0x00000003, 0x04020008, - 0x82081d00, 0xffffff00, 0x840c01c0, 0x800c0540, - 0x4807c857, 0x4803c857, 0x48002400, 0x1c01f000, - 0x0401f807, 0x42018800, 0x00000001, 0x04020003, - 0x42018800, 0x00000000, 0x1c01f000, 0x599c0017, - 0x8c00050a, 0x04000003, 0x80000580, 0x1c01f000, - 0x59a8021b, 0x82000500, 0x00000028, 0x04000008, - 0x42028800, 0x000007fd, 0x417a4000, 0x0401fd73, - 0x04020003, 0x5934000a, 0x8c000504, 0x1c01f000, - 0x4d300000, 0x5934000e, 0x80026540, 0x04000006, - 0x0201f800, 0x0010669f, 0x02000800, 0x00106877, - 0x497a680e, 0x5c026000, 0x1c01f000, 0x4d440000, - 0x4d340000, 0x80000580, 0x40001800, 0x40028800, - 0x82080580, 0x00000008, 0x04020003, 0x42001800, - 0x00000001, 0x0201f800, 0x0002034c, 0x0402000a, - 0x0401fcf6, 0x04020008, 0x800c19c0, 0x04000004, - 0x59340405, 0x8c000508, 0x04000003, 0x80081040, - 0x04000009, 0x81468800, 0x83440480, 0x00000800, - 0x040017f1, 0x80000580, 0x5c026800, 0x5c028800, - 0x1c01f000, 0x82000540, 0x00000001, 0x5c026800, - 0x5c028800, 0x1c01f000, 0x42000800, 0x00000008, - 0x59bc00e4, 0x8c000524, 0x0402002e, 0x59a8021b, - 0x8c000508, 0x0402002b, 0x5934100a, 0x82081500, - 0x0000e000, 0x41781800, 0x82080580, 0x00000000, - 0x04000006, 0x800c1800, 0x82080580, 0x00002000, - 0x04000002, 0x800c1800, 0x42007000, 0x0010c89b, - 0x58380401, 0x8c000504, 0x04000007, 0x820c2c80, - 0x00000003, 0x04021017, 0x820c0400, 0x00104c6e, - 0x0401f013, 0x41782000, 0x59342a04, 0x82140480, - 0x00000800, 0x04021006, 0x80102000, 0x82140480, - 0x00000400, 0x04021002, 0x80102000, 0x800c00c2, - 0x800c0400, 0x80100400, 0x82002c80, 0x00000006, - 0x04021004, 0x82000400, 0x00104c71, 0x50000800, - 0x48066c04, 0x1c01f000, 0x00000002, 0x00000004, - 0x00000008, 0x00002802, 0x00001402, 0x00000a02, - 0x00001402, 0x00000a02, 0x00000502, 0x59a80853, - 0x800409c0, 0x04020005, 0x492f5052, 0x492f5053, - 0x0201f000, 0x00107c34, 0x492c0800, 0x492f5053, - 0x1c01f000, 0x5934000f, 0x41784000, 0x80001540, - 0x04000010, 0x58080205, 0x82000500, 0x000000ff, - 0x82000580, 0x00000012, 0x04000004, 0x82000580, - 0x00000060, 0x04020004, 0x5808020d, 0x80040580, - 0x04000006, 0x58080000, 0x40084000, 0x0401f7f0, - 0x82000540, 0x00000001, 0x1c01f000, 0x4a033011, - 0x00000000, 0x4a03b104, 0x80000000, 0x4a03b104, - 0x60000001, 0x497b3016, 0x497b3017, 0x1c01f000, - 0x599c0018, 0x4803c856, 0x497b3014, 0x497b3015, - 0x82000500, 0x0000000f, 0x48033012, 0x04000009, - 0x599c0216, 0x82000500, 0x0000ffff, 0x04020003, - 0x42000000, 0x00000002, 0x48033013, 0x850e1d62, - 0x1c01f000, 0x0401ffef, 0x4a03c826, 0x00000004, - 0x599c0209, 0x80000540, 0x0400001e, 0x599c0207, - 0x80000540, 0x04000007, 0x800000cc, 0x599c080d, - 0x80040400, 0x4803b100, 0x497bb102, 0x59d80101, - 0x599c000d, 0x4803b100, 0x599c000e, 0x4803b101, - 0x599c0207, 0x80000540, 0x04020002, 0x497bb102, - 0x599c0a09, 0x82040540, 0x00400000, 0x4803b103, - 0x4a03b109, 0x00000005, 0x4a03b104, 0x10000001, - 0x8d0e1d22, 0x04020004, 0x4a033011, 0x00000001, - 0x1c01f000, 0x8d0e1d20, 0x04020004, 0x4a033011, - 0x00000002, 0x0401f7fb, 0x4a033011, 0x00000003, - 0x0401f7f8, 0x592c0205, 0x492fc857, 0x80000540, - 0x04000008, 0x42034000, 0x0010c7ff, 0x59a1d806, - 0x80edd9c0, 0x02000800, 0x0010032e, 0x0401f007, - 0x0201f800, 0x0010a09b, 0x02020800, 0x0010032e, - 0x5931d82a, 0x58ef400a, 0x58ec0008, 0x800001c0, - 0x02000800, 0x0010032e, 0x0801f800, 0x1c01f000, - 0x40680800, 0x5c000000, 0x4c000000, 0x4803c857, - 0x492fc857, 0x4943c857, 0x4807c857, 0x4a025a05, - 0x00000103, 0x49425a07, 0x48065a09, 0x4a025c07, - 0x0000ffff, 0x813261c0, 0x04000003, 0x59300402, - 0x48025c07, 0x592c0209, 0x8c000512, 0x04020008, - 0x832c0400, 0x0000000a, 0x04011000, 0x4803c840, - 0x4a03c842, 0x0000000b, 0x04011000, 0x1c01f000, - 0x40680000, 0x4c540000, 0x4c580000, 0x4c5c0000, - 0x4d2c0000, 0x4000b800, 0x0201f800, 0x0010bd9f, - 0x4178a800, 0x0201f800, 0x0010056e, 0x040000aa, - 0x04011000, 0x485fc857, 0x4943c857, 0x4923c857, - 0x832c0400, 0x00000005, 0x4803c840, 0x4a03c842, - 0x00000010, 0x40000000, 0x040117ff, 0x412c7000, - 0x4a025805, 0x00000132, 0x497a5806, 0x805cb9c0, - 0x04020071, 0x832e5c00, 0x00000008, 0x417a4000, - 0x42024800, 0x0010ccd1, 0x41786800, 0x59240a00, - 0x82040500, 0x0000000f, 0x0c01f001, 0x00104d50, - 0x00104d50, 0x00104d50, 0x00104d50, 0x00104d50, - 0x00104d50, 0x00104d50, 0x00104d47, 0x00104d50, - 0x00104d50, 0x00104d50, 0x00104d50, 0x00104d50, - 0x00104d50, 0x00104d50, 0x00104d50, 0x8054a800, - 0x812241c0, 0x04020007, 0x59240805, 0x805c00f0, - 0x80040d40, 0x48065800, 0x812e5800, 0x0401f03f, - 0x82340500, 0x00000003, 0x0c01f001, 0x00104d57, - 0x00104d62, 0x00104d6e, 0x00104d7a, 0x83200580, - 0x00000001, 0x04020004, 0x42002000, 0x00000001, - 0x0401f02a, 0x83200480, 0x00000020, 0x04001026, - 0x80346800, 0x0401f024, 0x83200580, 0x00000021, - 0x04020005, 0x812e5800, 0x42002000, 0x00000001, - 0x0401f01e, 0x83200480, 0x00000040, 0x0400101a, - 0x80346800, 0x0401f018, 0x83200580, 0x00000041, - 0x04020005, 0x812e5800, 0x42002000, 0x00000001, - 0x0401f012, 0x83200480, 0x00000060, 0x0400100e, - 0x80346800, 0x0401f00c, 0x83200580, 0x00000061, - 0x04020005, 0x812e5800, 0x42002000, 0x00000001, - 0x0401f006, 0x83200480, 0x0000007f, 0x04001002, - 0x80346800, 0x801020c2, 0x82040500, 0x00000007, - 0x82000580, 0x00000007, 0x04020004, 0x592c0000, - 0x80100540, 0x48025800, 0x83264c00, 0x0000000b, - 0x81224000, 0x8058b040, 0x040207a1, 0x8054a9c0, - 0x403a5800, 0x0400002e, 0x0201f800, 0x0010bd9f, + 0x492e6009, 0x49325809, 0x83340580, 0x0010e23c, + 0x04000007, 0x592c0c0c, 0x8c040d18, 0x04000004, + 0x59340200, 0x84000514, 0x48026a00, 0x0201f800, + 0x00020bc1, 0x80000580, 0x1c01f000, 0x82000540, + 0x00000001, 0x0401f7fd, 0x42001000, 0x0000000a, + 0x0401f01b, 0x42001000, 0x0000000e, 0x0401f018, + 0x42001000, 0x00000010, 0x0401f015, 0x42001000, + 0x00000016, 0x0401f012, 0x42001000, 0x00000017, + 0x0401f00f, 0x42001000, 0x00000018, 0x0401f00c, + 0x42001000, 0x0000001b, 0x0401f009, 0x42001000, + 0x0000001e, 0x0401f006, 0x42001000, 0x00000024, + 0x0401f003, 0x42001000, 0x00000020, 0x42000800, + 0x00000019, 0x42028000, 0x00000031, 0x0401f7dc, + 0x42000800, 0x00000003, 0x0401f003, 0x42000800, + 0x0000000a, 0x41781000, 0x0401f7f7, 0x42000800, + 0x00000009, 0x59341400, 0x0401f7f3, 0x42028000, + 0x00000008, 0x0401f005, 0x42000800, 0x00000007, + 0x416c1000, 0x0401f7ec, 0x41780800, 0x41781000, + 0x0401f7c7, 0x42028000, 0x00000000, 0x0401f7fb, + 0x82004d80, 0x0000001d, 0x02000800, 0x0010032e, + 0x82004d80, 0x0000001a, 0x04020004, 0x40101000, + 0x40000800, 0x0401f7dc, 0x82004d80, 0x0000001b, + 0x04020003, 0x40181000, 0x0401f7fa, 0x82004d80, + 0x0000001c, 0x040007f7, 0x82004d80, 0x00000019, + 0x040007b2, 0x0401f7d6, 0x592e6009, 0x0201f800, + 0x00109d04, 0x040007b3, 0x59300c07, 0x82040580, + 0x00000011, 0x040207d6, 0x592c0c0c, 0x82041500, + 0x0000e000, 0x82080580, 0x00006000, 0x04000024, + 0x83440580, 0x0000ffff, 0x04020008, 0x5932680a, + 0x83340580, 0x0010e23c, 0x040207c9, 0x42000800, + 0x00000840, 0x0401f00f, 0x592c100b, 0x82081500, + 0x00ffffff, 0x41784000, 0x0401fd93, 0x040207cd, + 0x5930000a, 0x82000d80, 0x0010e23c, 0x04000003, + 0x81340580, 0x040207ba, 0x4936600a, 0x59340a04, + 0x592c000e, 0x80040480, 0x040017a0, 0x59300a03, + 0x82040580, 0x00000007, 0x040207b1, 0x492e6009, + 0x42027000, 0x00000054, 0x0401f770, 0x0201f800, + 0x0010b6ce, 0x040007b4, 0x0401f7a9, 0x492fc857, + 0x592e6009, 0x83300580, 0xffffffff, 0x04020047, + 0x592c0208, 0x8c000500, 0x04020083, 0x8d0e1d0e, + 0x04020069, 0x592e8c07, 0x83440480, 0x00000800, + 0x0402103b, 0x592c380b, 0x821c3d00, 0x00ffffff, + 0x0201f800, 0x00101fc9, 0x04020041, 0x49265802, + 0x41784000, 0x592c100a, 0x82081500, 0x00ffffff, + 0x0401fd61, 0x0402005b, 0x592e6014, 0x4933c857, + 0x83300580, 0xffffffff, 0x0400001b, 0x0201f800, + 0x00109d04, 0x04000035, 0x591c1407, 0x800811c0, + 0x04000015, 0x592c040e, 0x591c0a02, 0x80040580, + 0x04020011, 0x591c000a, 0x800001c0, 0x04020007, + 0x591c0827, 0x59340002, 0x80040580, 0x82000500, + 0x00ffffff, 0x0401f002, 0x81340580, 0x04020006, + 0x82080580, 0x00000007, 0x04020038, 0x4a023c03, + 0x00000024, 0x59240005, 0x592c080a, 0x82041500, + 0x00ffffff, 0x80081580, 0x0400000f, 0x80040932, + 0x82040580, 0x00000042, 0x0402000e, 0x49365803, + 0x0401f908, 0x80000580, 0x1c01f000, 0x42001000, + 0x0000000a, 0x0401f00f, 0x42001000, 0x00000010, + 0x0401f00c, 0x42001000, 0x00000014, 0x0401f009, + 0x42001000, 0x00000017, 0x0401f006, 0x42001000, + 0x00000018, 0x0401f003, 0x42001000, 0x0000003c, + 0x492fc857, 0x480bc857, 0x42000800, 0x00000019, + 0x42028000, 0x00000031, 0x82000540, 0x00000001, + 0x0401f7e6, 0x492fc857, 0x4803c857, 0x480bc857, + 0x40000800, 0x0401f7f7, 0x492fc857, 0x42000800, + 0x0000000a, 0x41781000, 0x0401f7f2, 0x41780800, + 0x41781000, 0x0401f7f1, 0x42000800, 0x0000001e, + 0x0401f7f9, 0x42000800, 0x00000001, 0x0401f7f6, + 0x82004d80, 0x0000001d, 0x02000800, 0x0010032e, + 0x82004d80, 0x0000001a, 0x04020003, 0x40101000, + 0x0401f7e5, 0x82004d80, 0x0000001b, 0x04020003, + 0x40181000, 0x0401f7e0, 0x82004d80, 0x0000001c, + 0x040007dd, 0x82004d80, 0x00000019, 0x040007da, + 0x0401f7de, 0x0201f800, 0x0010b7c1, 0x42028000, + 0x00000000, 0x0401f7de, 0x5c000000, 0x4c000000, + 0x4803c857, 0x5930200a, 0x801021c0, 0x04000035, + 0x58101400, 0x4813c857, 0x480bc857, 0x82081d00, + 0x000000ff, 0x59300c03, 0x82040580, 0x00000008, + 0x04000022, 0x82040580, 0x0000000a, 0x04000017, + 0x82040580, 0x0000000c, 0x04000010, 0x82040580, + 0x00000002, 0x04000019, 0x82040580, 0x00000001, + 0x04000012, 0x82040580, 0x00000003, 0x0400000b, + 0x82040580, 0x00000005, 0x04000004, 0x82040580, + 0x00000033, 0x04020017, 0x820c0580, 0x00000009, + 0x0400000d, 0x0401f013, 0x820c0580, 0x00000005, + 0x04000009, 0x0401f00f, 0x820c0580, 0x0000000b, + 0x04000005, 0x0401f00b, 0x820c0580, 0x00000003, + 0x04020008, 0x82081d00, 0xffffff00, 0x840c01c0, + 0x800c0540, 0x4807c857, 0x4803c857, 0x48002400, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, + 0x04020003, 0x42018800, 0x00000000, 0x1c01f000, + 0x599c0017, 0x8c00050a, 0x04000003, 0x80000580, + 0x1c01f000, 0x59a8021b, 0x82000500, 0x00000028, + 0x04000008, 0x42028800, 0x000007fd, 0x417a4000, + 0x0401fd70, 0x04020003, 0x5934000a, 0x8c000504, + 0x1c01f000, 0x4d300000, 0x5934000e, 0x80026540, + 0x04000006, 0x0201f800, 0x001068a4, 0x02000800, + 0x00106a7c, 0x497a680e, 0x5c026000, 0x1c01f000, + 0x4d440000, 0x4d340000, 0x80000580, 0x40001800, + 0x40028800, 0x82080580, 0x00000008, 0x04020003, + 0x42001800, 0x00000001, 0x0201f800, 0x0002034c, + 0x0402000a, 0x0401fcf3, 0x04020008, 0x800c19c0, + 0x04000004, 0x59340405, 0x8c000508, 0x04000003, + 0x80081040, 0x04000009, 0x81468800, 0x83440480, + 0x00000800, 0x040017f1, 0x80000580, 0x5c026800, + 0x5c028800, 0x1c01f000, 0x82000540, 0x00000001, + 0x5c026800, 0x5c028800, 0x1c01f000, 0x42000800, + 0x00000008, 0x59bc00e4, 0x8c000524, 0x0402002e, + 0x59a8021b, 0x8c000508, 0x0402002b, 0x5934100a, + 0x82081500, 0x0000e000, 0x41781800, 0x82080580, + 0x00000000, 0x04000006, 0x800c1800, 0x82080580, + 0x00002000, 0x04000002, 0x800c1800, 0x42007000, + 0x0010cb9b, 0x58380401, 0x8c000504, 0x04000007, + 0x820c2c80, 0x00000003, 0x04021017, 0x820c0400, + 0x00104d73, 0x0401f013, 0x41782000, 0x59342a04, + 0x82140480, 0x00000800, 0x04021006, 0x80102000, + 0x82140480, 0x00000400, 0x04021002, 0x80102000, + 0x800c00c2, 0x800c0400, 0x80100400, 0x82002c80, + 0x00000006, 0x04021004, 0x82000400, 0x00104d76, + 0x50000800, 0x48066c04, 0x1c01f000, 0x00000002, + 0x00000004, 0x00000008, 0x00002802, 0x00001402, + 0x00000a02, 0x00001402, 0x00000a02, 0x00000502, + 0x59a80853, 0x800409c0, 0x04020005, 0x492f5052, + 0x492f5053, 0x0201f000, 0x00107e2a, 0x492c0800, + 0x492f5053, 0x1c01f000, 0x5934000f, 0x41784000, + 0x80001540, 0x04000010, 0x58080205, 0x82000500, + 0x000000ff, 0x82000580, 0x00000012, 0x04000004, + 0x82000580, 0x00000060, 0x04020004, 0x5808020d, + 0x80040580, 0x04000006, 0x58080000, 0x40084000, + 0x0401f7f0, 0x82000540, 0x00000001, 0x1c01f000, + 0x42000000, 0x0010e23c, 0x4a000400, 0x00000707, + 0x4a000204, 0x00000840, 0x4a000403, 0x0000ffff, + 0x49780200, 0x1c01f000, 0x4d340000, 0x4d440000, + 0x4c580000, 0x4200b000, 0x000007f0, 0x4803c856, + 0x417a8800, 0x0201f800, 0x0002034c, 0x04020006, + 0x59340200, 0x8c00051a, 0x04000003, 0x8400051a, + 0x48026a00, 0x81468800, 0x8058b040, 0x040207f6, + 0x5c00b000, 0x5c028800, 0x5c026800, 0x1c01f000, + 0x4a033011, 0x00000000, 0x4a03b104, 0x80000000, + 0x4a03b104, 0x60000001, 0x497b3016, 0x497b3017, + 0x1c01f000, 0x599c0018, 0x4803c856, 0x497b3014, + 0x497b3015, 0x82000500, 0x0000000f, 0x48033012, + 0x04000009, 0x599c0216, 0x82000500, 0x0000ffff, + 0x04020003, 0x42000000, 0x00000002, 0x48033013, + 0x850e1d62, 0x1c01f000, 0x0401ffef, 0x4a03c826, + 0x00000004, 0x599c0209, 0x80000540, 0x0400001e, + 0x599c0207, 0x80000540, 0x04000007, 0x800000cc, + 0x599c080d, 0x80040400, 0x4803b100, 0x497bb102, + 0x59d80101, 0x599c000d, 0x4803b100, 0x599c000e, + 0x4803b101, 0x599c0207, 0x80000540, 0x04020002, + 0x497bb102, 0x599c0a09, 0x82040540, 0x00400000, + 0x4803b103, 0x4a03b109, 0x00000005, 0x4a03b104, + 0x10000001, 0x8d0e1d22, 0x04020004, 0x4a033011, + 0x00000001, 0x1c01f000, 0x8d0e1d20, 0x04020004, + 0x4a033011, 0x00000002, 0x0401f7fb, 0x4a033011, + 0x00000003, 0x0401f7f8, 0x592c0205, 0x492fc857, + 0x80000540, 0x04000008, 0x42034000, 0x0010caff, + 0x59a1d806, 0x80edd9c0, 0x02000800, 0x0010032e, + 0x0401f007, 0x0201f800, 0x0010a2d8, 0x02020800, + 0x0010032e, 0x5931d82a, 0x58ef400a, 0x58ec0008, + 0x800001c0, 0x02000800, 0x0010032e, 0x0801f800, + 0x1c01f000, 0x40680800, 0x5c000000, 0x4c000000, + 0x4803c857, 0x492fc857, 0x4943c857, 0x4807c857, + 0x4a025a05, 0x00000103, 0x49425a07, 0x48065a09, + 0x4a025c07, 0x0000ffff, 0x813261c0, 0x04000003, + 0x59300402, 0x48025c07, 0x592c0209, 0x8c000512, + 0x04020008, 0x832c0400, 0x0000000a, 0x04011000, + 0x4803c840, 0x4a03c842, 0x0000000b, 0x04011000, + 0x1c01f000, 0x40680000, 0x4c540000, 0x4c580000, + 0x4c5c0000, 0x4d2c0000, 0x4000b800, 0x0201f800, + 0x0010c0ca, 0x4178a800, 0x0201f800, 0x0010056e, + 0x040000b3, 0x04011000, 0x485fc857, 0x4943c857, + 0x4923c857, 0x832c0400, 0x00000005, 0x4803c840, + 0x4a03c842, 0x00000010, 0x40000000, 0x040117ff, + 0x412c7000, 0x4a025805, 0x00000132, 0x497a5806, + 0x805cb9c0, 0x04020074, 0x832e5c00, 0x00000008, + 0x417a4000, 0x42024800, 0x0010cfd1, 0x41786800, + 0x59240a00, 0x82040500, 0x0000000f, 0x0c01f001, + 0x00104e75, 0x00104e75, 0x00104e75, 0x00104e75, + 0x00104e75, 0x00104e75, 0x00104e75, 0x00104e6c, + 0x00104e75, 0x00104e75, 0x00104e75, 0x00104e75, + 0x00104e75, 0x00104e75, 0x00104e75, 0x00104e75, + 0x8054a800, 0x812241c0, 0x04020007, 0x59240805, + 0x805c00f0, 0x80040d40, 0x48065800, 0x812e5800, + 0x0401f03f, 0x82340500, 0x00000003, 0x0c01f001, + 0x00104e7c, 0x00104e87, 0x00104e93, 0x00104e9f, + 0x83200580, 0x00000001, 0x04020004, 0x42002000, + 0x00000001, 0x0401f02a, 0x83200480, 0x00000020, + 0x04001026, 0x80346800, 0x0401f024, 0x83200580, + 0x00000021, 0x04020005, 0x812e5800, 0x42002000, + 0x00000001, 0x0401f01e, 0x83200480, 0x00000040, + 0x0400101a, 0x80346800, 0x0401f018, 0x83200580, + 0x00000041, 0x04020005, 0x812e5800, 0x42002000, + 0x00000001, 0x0401f012, 0x83200480, 0x00000060, + 0x0400100e, 0x80346800, 0x0401f00c, 0x83200580, + 0x00000061, 0x04020005, 0x812e5800, 0x42002000, + 0x00000001, 0x0401f006, 0x83200480, 0x0000007f, + 0x04001002, 0x80346800, 0x801020c2, 0x82040500, + 0x00000007, 0x82000580, 0x00000007, 0x04020004, + 0x592c0000, 0x80100540, 0x48025800, 0x83264c00, + 0x0000000b, 0x81224000, 0x8058b040, 0x040207a1, + 0x8054a9c0, 0x403a5800, 0x04000037, 0x0201f800, + 0x0010c0ca, 0x0201f800, 0x0010c0e8, 0x04020002, 0x8058b040, 0x805800d0, 0x80540540, 0x48025a07, - 0x0401f021, 0x83400580, 0x00000001, 0x04020005, - 0x48165a09, 0x82140580, 0x00000003, 0x0400001d, + 0x0401f024, 0x83400580, 0x00000001, 0x04020005, + 0x48165a09, 0x82140580, 0x00000003, 0x04000023, 0x83400d00, 0x000000ff, 0x82040580, 0x00000004, - 0x04000018, 0x82040580, 0x00000006, 0x04000015, + 0x0400001e, 0x82040580, 0x00000006, 0x0400001b, 0x83400d00, 0x0000ff00, 0x04000003, 0x81400110, 0x4802580d, 0x814000d0, 0x81200540, 0x48025c07, - 0x8058b040, 0x805800d0, 0x82000540, 0x00000001, - 0x48025a07, 0x59240805, 0x805c00f0, 0x80040d40, - 0x48065808, 0x0201f800, 0x000203ef, 0x0401f006, - 0x59cc0007, 0x4802580d, 0x0401f7ef, 0x0201f800, - 0x00100594, 0x5c025800, 0x5c00b800, 0x5c00b000, - 0x5c00a800, 0x1c01f000, 0x59a80011, 0x82000c80, - 0x0000000a, 0x02021800, 0x0010032e, 0x0c01f809, - 0x4a038805, 0x000000f0, 0x59c400a3, 0x82000500, - 0x02870000, 0x02020800, 0x0010032e, 0x1c01f000, - 0x00104e71, 0x00104de3, 0x00104e02, 0x00104e36, - 0x00104e61, 0x0010032e, 0x0010032e, 0x00104e02, - 0x0010032e, 0x00104de2, 0x1c01f000, 0x42002000, - 0x00000003, 0x0201f800, 0x001052d7, 0x4a038808, - 0x00000004, 0x0201f800, 0x001052be, 0x59c40805, - 0x8c040d0e, 0x04020014, 0x8c040d0a, 0x0402000b, - 0x8c040d0c, 0x04020006, 0x8c040d08, 0x0400000e, - 0x4a035011, 0x00000003, 0x0401f00a, 0x4a035011, - 0x00000000, 0x0401f007, 0x42000000, 0x0010cb78, - 0x0201f800, 0x0010bc88, 0x4a035011, 0x00000002, - 0x0401f8c6, 0x1c01f000, 0x59a80078, 0x8c00053e, - 0x04020018, 0x42002000, 0x00000000, 0x0201f800, - 0x001052d7, 0x4a038808, 0x00000002, 0x59c40805, - 0x8c040d08, 0x04020025, 0x8c040d0c, 0x04020020, - 0x8c040d0e, 0x0402001b, 0x82040500, 0x000000f0, - 0x04020021, 0x0201f800, 0x001052be, 0x4a038808, - 0x00000080, 0x59c40002, 0x8400050c, 0x48038802, - 0x0401f9dd, 0x4d3c0000, 0x42027800, 0x00000001, - 0x0201f800, 0x0010a004, 0x5c027800, 0x4a038808, - 0x00000080, 0x42002000, 0x00000002, 0x0201f800, - 0x001052d7, 0x4a035011, 0x00000009, 0x0401f00a, + 0x0201f800, 0x0010c0e8, 0x04020002, 0x8058b040, + 0x805800d0, 0x82000540, 0x00000001, 0x48025a07, + 0x59240805, 0x805c00f0, 0x80040d40, 0x48065808, + 0x0201f800, 0x0010c0f9, 0x0402000e, 0x0201f800, + 0x000203ef, 0x0401f006, 0x59cc0007, 0x4802580d, + 0x0401f7e9, 0x0201f800, 0x00100594, 0x5c025800, + 0x5c00b800, 0x5c00b000, 0x5c00a800, 0x1c01f000, + 0x0201f800, 0x0010b674, 0x0401f7f9, 0x59a80011, + 0x82000c80, 0x0000000a, 0x02021800, 0x0010032e, + 0x0c01f809, 0x4a038805, 0x000000f0, 0x59c400a3, + 0x82000500, 0x02870000, 0x02020800, 0x0010032e, + 0x1c01f000, 0x00104fa2, 0x00104f14, 0x00104f33, + 0x00104f67, 0x00104f92, 0x0010032e, 0x0010032e, + 0x00104f33, 0x0010032e, 0x00104f13, 0x1c01f000, + 0x42002000, 0x00000003, 0x0201f800, 0x00105408, + 0x4a038808, 0x00000004, 0x0201f800, 0x001053ef, + 0x59c40805, 0x8c040d0e, 0x04020014, 0x8c040d0a, + 0x0402000b, 0x8c040d0c, 0x04020006, 0x8c040d08, + 0x0400000e, 0x4a035011, 0x00000003, 0x0401f00a, + 0x4a035011, 0x00000000, 0x0401f007, 0x42000000, + 0x0010ce78, 0x0201f800, 0x0010bfb3, 0x4a035011, + 0x00000002, 0x0401f8c6, 0x1c01f000, 0x59a80078, + 0x8c00053e, 0x04020018, 0x42002000, 0x00000000, + 0x0201f800, 0x00105408, 0x4a038808, 0x00000002, + 0x59c40805, 0x8c040d08, 0x04020025, 0x8c040d0c, + 0x04020020, 0x8c040d0e, 0x0402001b, 0x82040500, + 0x000000f0, 0x04020021, 0x0201f800, 0x001053ef, + 0x4a038808, 0x00000080, 0x59c40002, 0x8400050c, + 0x48038802, 0x0401f9dd, 0x4d3c0000, 0x42027800, + 0x00000001, 0x0201f800, 0x0010a242, 0x5c027800, + 0x4a038808, 0x00000080, 0x42002000, 0x00000002, + 0x0201f800, 0x00105408, 0x4a035011, 0x00000009, + 0x0401f00a, 0x4a035011, 0x00000001, 0x0401f006, + 0x4a035011, 0x00000000, 0x0401f003, 0x4a035011, + 0x00000003, 0x0401f892, 0x1c01f000, 0x42002000, + 0x00000001, 0x0201f800, 0x00105408, 0x4a038808, + 0x00000080, 0x59c40805, 0x8c040d0a, 0x0402001f, + 0x8c040d0c, 0x0402001a, 0x8c040d0e, 0x04020015, + 0x82040500, 0x000000f0, 0x0402001b, 0x59c40002, + 0x8400050c, 0x48038802, 0x0401f9b0, 0x4d3c0000, + 0x42027800, 0x00000001, 0x0201f800, 0x0010a242, + 0x5c027800, 0x42002000, 0x00000002, 0x0201f800, + 0x00105408, 0x4a035011, 0x00000009, 0x0401f00a, 0x4a035011, 0x00000001, 0x0401f006, 0x4a035011, - 0x00000000, 0x0401f003, 0x4a035011, 0x00000003, - 0x0401f892, 0x1c01f000, 0x42002000, 0x00000001, - 0x0201f800, 0x001052d7, 0x4a038808, 0x00000080, - 0x59c40805, 0x8c040d0a, 0x0402001f, 0x8c040d0c, - 0x0402001a, 0x8c040d0e, 0x04020015, 0x82040500, - 0x000000f0, 0x0402001b, 0x59c40002, 0x8400050c, - 0x48038802, 0x0401f9b0, 0x4d3c0000, 0x42027800, - 0x00000001, 0x0201f800, 0x0010a004, 0x5c027800, - 0x42002000, 0x00000002, 0x0201f800, 0x001052d7, - 0x4a035011, 0x00000009, 0x0401f00a, 0x4a035011, - 0x00000001, 0x0401f006, 0x4a035011, 0x00000000, - 0x0401f003, 0x4a035011, 0x00000002, 0x0401f867, - 0x1c01f000, 0x0201f800, 0x0010540b, 0x4a038808, - 0x00000008, 0x59c40805, 0x8c040d0c, 0x04020006, + 0x00000000, 0x0401f003, 0x4a035011, 0x00000002, + 0x0401f867, 0x1c01f000, 0x0201f800, 0x0010553c, + 0x4a038808, 0x00000008, 0x59c40805, 0x8c040d0c, + 0x04020006, 0x8c040d0e, 0x04000007, 0x4a035011, + 0x00000001, 0x0401f003, 0x4a035011, 0x00000000, + 0x0401f857, 0x1c01f000, 0x42002000, 0x00000004, + 0x0201f800, 0x00105408, 0x0401f8a0, 0x59c40805, + 0x8c040d0c, 0x0402000b, 0x8c040d0a, 0x04020006, 0x8c040d0e, 0x04000007, 0x4a035011, 0x00000001, - 0x0401f003, 0x4a035011, 0x00000000, 0x0401f857, - 0x1c01f000, 0x42002000, 0x00000004, 0x0201f800, - 0x001052d7, 0x0401f8a0, 0x59c40805, 0x8c040d0c, - 0x0402000b, 0x8c040d0a, 0x04020006, 0x8c040d0e, - 0x04000007, 0x4a035011, 0x00000001, 0x0401f003, - 0x4a035011, 0x00000002, 0x0401f844, 0x1c01f000, - 0x0401f942, 0x02020800, 0x0010032e, 0x59a80878, - 0x8c040d3e, 0x04000004, 0x4a035014, 0x00000001, - 0x0401f039, 0x42002000, 0x00000007, 0x0201f800, - 0x001052d7, 0x8d0e1d0c, 0x04000014, 0x850e1d0c, - 0x4a038805, 0x00000010, 0x0201f800, 0x00101935, - 0x59c40005, 0x8c000508, 0x04000008, 0x4a038808, - 0x00000008, 0x4a035014, 0x00000001, 0x4202d800, - 0x00000001, 0x0401f024, 0x59c40006, 0x84000548, - 0x48038806, 0x0401f020, 0x59a80011, 0x82000580, - 0x00000001, 0x0402001a, 0x42000000, 0x0010cb78, - 0x0201f800, 0x0010bc88, 0x4ce80000, 0x4201d000, - 0x000003e8, 0x0201f800, 0x0010645c, 0x59c40005, - 0x82000500, 0x00000030, 0x0400000c, 0x8c00050a, - 0x04000006, 0x42002000, 0x00000000, 0x0201f800, - 0x001052d7, 0x0401f005, 0x42002000, 0x00000001, - 0x0201f800, 0x001052d7, 0x5c01d000, 0x4a035011, - 0x00000004, 0x1c01f000, 0x4c040000, 0x4c080000, - 0x42000800, 0x00000064, 0x42001000, 0x00104ed1, - 0x0201f800, 0x0010643e, 0x5c001000, 0x5c000800, - 0x1c01f000, 0x4803c856, 0x4c040000, 0x0201f800, - 0x00106c3c, 0x4df00000, 0x0201f800, 0x00106ed9, - 0x5c03e000, 0x02000800, 0x00106c29, 0x42000000, - 0x0010cb77, 0x0201f800, 0x0010bc88, 0x0401ffa5, + 0x0401f003, 0x4a035011, 0x00000002, 0x0401f844, + 0x1c01f000, 0x0401f942, 0x02020800, 0x0010032e, + 0x59a80878, 0x8c040d3e, 0x04000004, 0x4a035014, + 0x00000001, 0x0401f039, 0x42002000, 0x00000007, + 0x0201f800, 0x00105408, 0x8d0e1d0c, 0x04000014, + 0x850e1d0c, 0x4a038805, 0x00000010, 0x0201f800, + 0x0010193a, 0x59c40005, 0x8c000508, 0x04000008, + 0x4a038808, 0x00000008, 0x4a035014, 0x00000001, + 0x4202d800, 0x00000001, 0x0401f024, 0x59c40006, + 0x84000548, 0x48038806, 0x0401f020, 0x59a80011, + 0x82000580, 0x00000001, 0x0402001a, 0x42000000, + 0x0010ce78, 0x0201f800, 0x0010bfb3, 0x4ce80000, + 0x4201d000, 0x000003e8, 0x0201f800, 0x00106661, + 0x59c40005, 0x82000500, 0x00000030, 0x0400000c, + 0x8c00050a, 0x04000006, 0x42002000, 0x00000000, + 0x0201f800, 0x00105408, 0x0401f005, 0x42002000, + 0x00000001, 0x0201f800, 0x00105408, 0x5c01d000, + 0x4a035011, 0x00000004, 0x1c01f000, 0x4c040000, + 0x4c080000, 0x42000800, 0x00000064, 0x42001000, + 0x00105002, 0x0201f800, 0x00106643, 0x5c001000, 0x5c000800, 0x1c01f000, 0x4803c856, 0x4c040000, - 0x4c080000, 0x0201f800, 0x00106c3c, 0x4df00000, - 0x0201f800, 0x00106ed9, 0x5c03e000, 0x02000800, - 0x00106c29, 0x59c40006, 0x84000500, 0x48038806, - 0x0201f800, 0x00106faf, 0x497b8880, 0x42000000, - 0x0010cb76, 0x0201f800, 0x0010bc88, 0x0201f800, - 0x0010181b, 0x4a035058, 0x00000004, 0x4202d800, - 0x00000004, 0x4a038805, 0x00000001, 0x42001000, - 0x00104ed1, 0x0201f800, 0x00106449, 0x0201f800, - 0x00100455, 0x0401f8dd, 0x04000006, 0x42006000, - 0xfeffffff, 0x41786800, 0x0201f800, 0x001041ad, - 0x0201f800, 0x00110a6d, 0x42000000, 0x00000080, - 0x0201f800, 0x0010155c, 0x5c001000, 0x5c000800, - 0x1c01f000, 0x59c40008, 0x82000580, 0x00000010, - 0x04000007, 0x4a038808, 0x00000010, 0x4201d000, - 0x00001388, 0x0201f800, 0x0010645c, 0x1c01f000, - 0x4c040000, 0x59a80814, 0x82040580, 0x00000000, - 0x0400000b, 0x82040580, 0x00000001, 0x0400000b, - 0x82040580, 0x00000002, 0x04000013, 0x82040580, - 0x00000003, 0x04000013, 0x0401f05d, 0x4a035011, - 0x00000000, 0x0401f011, 0x59a80878, 0x8c040d3e, - 0x04000006, 0x4a035011, 0x00000003, 0x4a035014, - 0x00000004, 0x0401f052, 0x4a035011, 0x00000004, - 0x0401f006, 0x4a035011, 0x00000001, 0x0401f003, - 0x4a035011, 0x00000007, 0x497b8880, 0x4a038893, - 0x00000001, 0x41780000, 0x0201f800, 0x001015e0, - 0x0201f800, 0x00106faf, 0x836c0d80, 0x00000004, - 0x04000008, 0x59c40006, 0x82000500, 0xffffff0f, - 0x82000540, 0x04000001, 0x48038806, 0x0401f007, - 0x59c40006, 0x82000500, 0xffffff0f, 0x82000540, - 0x04000000, 0x48038806, 0x0401f888, 0x04020005, - 0x59c40806, 0x82040d00, 0xfbffff0f, 0x48078806, - 0x59c40005, 0x8c000534, 0x04020033, 0x42006000, - 0xfc18ffff, 0x42006800, 0x01000000, 0x0201f800, - 0x001041ad, 0x0201f800, 0x00101935, 0x59c408a4, - 0x82040d00, 0x0000000f, 0x82040d80, 0x0000000c, - 0x040208bf, 0x0401f871, 0x04000006, 0x42006000, - 0xfeffffff, 0x41786800, 0x0201f800, 0x001041ad, - 0x836c0d80, 0x00000004, 0x0400000f, 0x0401ff4b, - 0x5994102e, 0x41780800, 0x42000000, 0x0000000a, - 0x0201f800, 0x00106a98, 0x40080000, 0x59a80831, - 0x80040c00, 0x42001000, 0x00104ee2, 0x0201f800, - 0x00106433, 0x4a035014, 0x00000004, 0x0401fe3f, - 0x0401f856, 0x04020008, 0x59c408a4, 0x82040d00, - 0x0000000f, 0x82040580, 0x0000000c, 0x02020800, - 0x0010032e, 0x5c000800, 0x1c01f000, 0x4803c856, - 0x4c000000, 0x0201f800, 0x0010646c, 0x4a03500f, - 0x00ffffff, 0x497b5013, 0x59a8001f, 0x82000500, - 0xffff0000, 0x4803501f, 0x497b8880, 0x497b8893, - 0x41780000, 0x0201f800, 0x001015e0, 0x59c40001, - 0x82000500, 0xfffffcff, 0x48038801, 0x42006000, - 0xfc18ffff, 0x41786800, 0x0201f800, 0x001041ad, - 0x4a038808, 0x00000000, 0x5c000000, 0x800001c0, - 0x02020800, 0x00104011, 0x4a038805, 0x040000f0, - 0x59c40006, 0x82000500, 0xffffffcf, 0x82000540, - 0x440000c1, 0x48038806, 0x1c01f000, 0x0401f807, - 0x42018800, 0x00000001, 0x04000003, 0x42018800, - 0x00000000, 0x1c01f000, 0x4c5c0000, 0x59a8b813, - 0x825cbd80, 0x0000aaaa, 0x5c00b800, 0x1c01f000, + 0x0201f800, 0x00106e41, 0x4df00000, 0x0201f800, + 0x001070de, 0x5c03e000, 0x02000800, 0x00106e2e, + 0x42000000, 0x0010ce77, 0x0201f800, 0x0010bfb3, + 0x0401ffa5, 0x5c000800, 0x1c01f000, 0x4803c856, + 0x4c040000, 0x4c080000, 0x0201f800, 0x00106e41, + 0x4df00000, 0x0201f800, 0x001070de, 0x5c03e000, + 0x02000800, 0x00106e2e, 0x59c40006, 0x84000500, + 0x48038806, 0x0201f800, 0x001071b4, 0x497b8880, + 0x42000000, 0x0010ce76, 0x0201f800, 0x0010bfb3, + 0x0201f800, 0x00101820, 0x4a035058, 0x00000004, + 0x4202d800, 0x00000004, 0x4a038805, 0x00000001, + 0x42001000, 0x00105002, 0x0201f800, 0x0010664e, + 0x0201f800, 0x00100455, 0x0401f8dd, 0x04000006, + 0x42006000, 0xfeffffff, 0x41786800, 0x0201f800, + 0x001042a6, 0x0201f800, 0x00110d6d, 0x42000000, + 0x00000080, 0x0201f800, 0x0010155d, 0x5c001000, + 0x5c000800, 0x1c01f000, 0x59c40008, 0x82000580, + 0x00000010, 0x04000007, 0x4a038808, 0x00000010, + 0x4201d000, 0x00001388, 0x0201f800, 0x00106661, + 0x1c01f000, 0x4c040000, 0x59a80814, 0x82040580, + 0x00000000, 0x0400000b, 0x82040580, 0x00000001, + 0x0400000b, 0x82040580, 0x00000002, 0x04000013, + 0x82040580, 0x00000003, 0x04000013, 0x0401f05d, + 0x4a035011, 0x00000000, 0x0401f011, 0x59a80878, + 0x8c040d3e, 0x04000006, 0x4a035011, 0x00000003, + 0x4a035014, 0x00000004, 0x0401f052, 0x4a035011, + 0x00000004, 0x0401f006, 0x4a035011, 0x00000001, + 0x0401f003, 0x4a035011, 0x00000007, 0x497b8880, + 0x4a038893, 0x00000001, 0x41780000, 0x0201f800, + 0x001015e5, 0x0201f800, 0x001071b4, 0x836c0d80, + 0x00000004, 0x04000008, 0x59c40006, 0x82000500, + 0xffffff0f, 0x82000540, 0x04000001, 0x48038806, + 0x0401f007, 0x59c40006, 0x82000500, 0xffffff0f, + 0x82000540, 0x04000000, 0x48038806, 0x0401f888, + 0x04020005, 0x59c40806, 0x82040d00, 0xfbffff0f, + 0x48078806, 0x59c40005, 0x8c000534, 0x04020033, + 0x42006000, 0xfc18ffff, 0x42006800, 0x01000000, + 0x0201f800, 0x001042a6, 0x0201f800, 0x0010193a, + 0x59c408a4, 0x82040d00, 0x0000000f, 0x82040d80, + 0x0000000c, 0x040208bf, 0x0401f871, 0x04000006, + 0x42006000, 0xfeffffff, 0x41786800, 0x0201f800, + 0x001042a6, 0x836c0d80, 0x00000004, 0x0400000f, + 0x0401ff4b, 0x5994102e, 0x41780800, 0x42000000, + 0x0000000a, 0x0201f800, 0x00106c9d, 0x40080000, + 0x59a80831, 0x80040c00, 0x42001000, 0x00105013, + 0x0201f800, 0x00106638, 0x4a035014, 0x00000004, + 0x0401fe3f, 0x0401f856, 0x04020008, 0x59c408a4, + 0x82040d00, 0x0000000f, 0x82040580, 0x0000000c, + 0x02020800, 0x0010032e, 0x5c000800, 0x1c01f000, + 0x4803c856, 0x4c000000, 0x0201f800, 0x00106671, + 0x4a03500f, 0x00ffffff, 0x497b5013, 0x59a8001f, + 0x82000500, 0xffff0000, 0x4803501f, 0x497b8880, + 0x497b8893, 0x41780000, 0x0201f800, 0x001015e5, + 0x59c40001, 0x82000500, 0xfffffcff, 0x48038801, + 0x42006000, 0xfc18ffff, 0x41786800, 0x0201f800, + 0x001042a6, 0x4a038808, 0x00000000, 0x5c000000, + 0x800001c0, 0x02020800, 0x0010410a, 0x4a038805, + 0x040000f0, 0x59c40006, 0x82000500, 0xffffffcf, + 0x82000540, 0x440000c1, 0x48038806, 0x1c01f000, + 0x0401f807, 0x42018800, 0x00000001, 0x04000003, + 0x42018800, 0x00000000, 0x1c01f000, 0x4c5c0000, + 0x59a8b813, 0x825cbd80, 0x0000aaaa, 0x5c00b800, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, + 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, + 0x4c5c0000, 0x599cb818, 0x825cbd00, 0x00000030, + 0x825cbd80, 0x00000000, 0x5c00b800, 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, 0x4c5c0000, 0x599cb818, 0x825cbd00, 0x00000030, 0x825cbd80, - 0x00000000, 0x5c00b800, 0x1c01f000, 0x0401f807, + 0x00000010, 0x5c00b800, 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, 0x4c5c0000, 0x599cb818, - 0x825cbd00, 0x00000030, 0x825cbd80, 0x00000010, - 0x5c00b800, 0x1c01f000, 0x0401f807, 0x42018800, - 0x00000001, 0x04000003, 0x42018800, 0x00000000, - 0x1c01f000, 0x4c5c0000, 0x599cb818, 0x825cbd00, - 0x00000030, 0x825cbd80, 0x00000020, 0x5c00b800, - 0x1c01f000, 0x490fc857, 0x830c0d00, 0x00000013, - 0x04000026, 0x599c1017, 0x4d3c0000, 0x830c0500, - 0x00000011, 0x04000005, 0x417a7800, 0x8d0e1d20, - 0x04020009, 0x0401f015, 0x42027800, 0x00000008, - 0x8d0e1d20, 0x04000011, 0x42003000, 0x00000003, - 0x0401f003, 0x42003000, 0x00000004, 0x42028000, - 0x0000000e, 0x4d200000, 0x42024000, 0x000000ff, - 0x0201f800, 0x0010ae89, 0x5c024000, 0x599c1017, - 0x8c08150a, 0x04020007, 0x42028000, 0x00000004, - 0x0201f800, 0x0010fbe5, 0x4803c856, 0x850e1d08, - 0x5c027800, 0x0401f00d, 0x8d0e1d20, 0x0400000b, - 0x42028000, 0x0000000f, 0x42003000, 0x00000001, - 0x4d200000, 0x42024000, 0x000000ff, 0x0201f800, - 0x0010ae89, 0x5c024000, 0x1c01f000, 0x4803c856, - 0x4c580000, 0x42000000, 0x0010cc8c, 0x0201f800, - 0x0010bc88, 0x42000800, 0x0010e1fe, 0x59c40003, - 0x44000800, 0x59c40004, 0x48000801, 0x59c4000b, - 0x48000802, 0x59c4008e, 0x48000803, 0x59c4008f, - 0x48000804, 0x59c40090, 0x48000805, 0x59c40091, - 0x48000806, 0x59c40092, 0x48000807, 0x59c40093, - 0x48000808, 0x59c40099, 0x48000809, 0x59c4009e, - 0x4800080a, 0x59c400aa, 0x4800080b, 0x59c400af, - 0x4800080c, 0x59c400b2, 0x4800080d, 0x59c400b1, - 0x4800080e, 0x82040c00, 0x0000000f, 0x41c41800, - 0x4200b000, 0x00000030, 0x580c0050, 0x44000800, - 0x80040800, 0x800c1800, 0x8058b040, 0x040207fb, - 0x41c41800, 0x4200b000, 0x00000020, 0x580c0010, + 0x825cbd00, 0x00000030, 0x825cbd80, 0x00000020, + 0x5c00b800, 0x1c01f000, 0x490fc857, 0x830c0d00, + 0x00000013, 0x04000026, 0x599c1017, 0x4d3c0000, + 0x830c0500, 0x00000011, 0x04000005, 0x417a7800, + 0x8d0e1d20, 0x04020009, 0x0401f015, 0x42027800, + 0x00000008, 0x8d0e1d20, 0x04000011, 0x42003000, + 0x00000003, 0x0401f003, 0x42003000, 0x00000004, + 0x42028000, 0x0000000e, 0x4d200000, 0x42024000, + 0x000000ff, 0x0201f800, 0x0010b198, 0x5c024000, + 0x599c1017, 0x8c08150a, 0x04020007, 0x42028000, + 0x00000004, 0x0201f800, 0x0010fef2, 0x4803c856, + 0x850e1d08, 0x5c027800, 0x0401f00d, 0x8d0e1d20, + 0x0400000b, 0x42028000, 0x0000000f, 0x42003000, + 0x00000001, 0x4d200000, 0x42024000, 0x000000ff, + 0x0201f800, 0x0010b198, 0x5c024000, 0x1c01f000, + 0x4803c856, 0x4c580000, 0x42000000, 0x0010cf8c, + 0x0201f800, 0x0010bfb3, 0x42000800, 0x0010e4fe, + 0x59c40003, 0x44000800, 0x59c40004, 0x48000801, + 0x59c4000b, 0x48000802, 0x59c4008e, 0x48000803, + 0x59c4008f, 0x48000804, 0x59c40090, 0x48000805, + 0x59c40091, 0x48000806, 0x59c40092, 0x48000807, + 0x59c40093, 0x48000808, 0x59c40099, 0x48000809, + 0x59c4009e, 0x4800080a, 0x59c400aa, 0x4800080b, + 0x59c400af, 0x4800080c, 0x59c400b2, 0x4800080d, + 0x59c400b1, 0x4800080e, 0x82040c00, 0x0000000f, + 0x41c41800, 0x4200b000, 0x00000030, 0x580c0050, 0x44000800, 0x80040800, 0x800c1800, 0x8058b040, - 0x040207fb, 0x497b8830, 0x4200b000, 0x00000040, - 0x59c40031, 0x44000800, 0x80040800, 0x8058b040, - 0x040207fc, 0x497b88ac, 0x4200b000, 0x00000010, - 0x59c400ad, 0x44000800, 0x80040800, 0x8058b040, - 0x040207fc, 0x59c41001, 0x4c080000, 0x8408150c, - 0x480b8801, 0x4a0370e4, 0x00000300, 0x4a0370e5, - 0xb0000000, 0x42000800, 0x00000800, 0x80040840, - 0x02000800, 0x0010032e, 0x59b800e5, 0x8c000538, - 0x040207fb, 0x4a0370e4, 0x00000200, 0x42006000, - 0xffffffff, 0x42006800, 0x80000000, 0x0201f800, - 0x001041ad, 0x4a038807, 0x00000001, 0x497b8807, - 0x0401fb89, 0x4a038808, 0x00000010, 0x42006000, - 0xfcf8ffff, 0x42006800, 0x01000000, 0x0201f800, - 0x001041ad, 0x5c001000, 0x480b8801, 0x42000800, - 0x0010e1fe, 0x50040000, 0x48038803, 0x58040001, - 0x48038804, 0x58040002, 0x4803880b, 0x58040003, - 0x4803888e, 0x58040004, 0x4803888f, 0x58040005, - 0x48038890, 0x58040006, 0x48038891, 0x58040007, - 0x48038892, 0x58040008, 0x48038893, 0x58040009, - 0x48038899, 0x5804000a, 0x4803889e, 0x5804000b, - 0x480388aa, 0x5804000c, 0x480388af, 0x5804000d, - 0x480388b2, 0x5804000e, 0x480388b1, 0x82040c00, - 0x0000000f, 0x41c41800, 0x4200b000, 0x00000030, - 0x50040000, 0x48001850, 0x80040800, 0x800c1800, - 0x8058b040, 0x040207fb, 0x41c41800, 0x4200b000, - 0x00000020, 0x50040000, 0x48001810, 0x80040800, - 0x800c1800, 0x8058b040, 0x040207fb, 0x497b8830, - 0x4200b000, 0x00000040, 0x50040000, 0x48038831, - 0x80040800, 0x8058b040, 0x040207fc, 0x497b88ac, - 0x4200b000, 0x00000010, 0x50040000, 0x480388ad, - 0x80040800, 0x8058b040, 0x040207fc, 0x497b8880, - 0x41780000, 0x0201f800, 0x001015e0, 0x59c408a4, - 0x82040d00, 0x0000000f, 0x82040580, 0x0000000c, - 0x02020800, 0x0010032e, 0x4a038805, 0x04000000, - 0x5c00b000, 0x1c01f000, 0x4803c856, 0x42000800, - 0x00000001, 0x0201f800, 0x00101bda, 0x4c580000, - 0x4ce80000, 0x42000000, 0x0010cb79, 0x0201f800, - 0x0010bc88, 0x59c41008, 0x4c080000, 0x82081500, - 0xffffff7f, 0x480b8808, 0x59c40004, 0x82000500, - 0x00003e02, 0x04000005, 0x4201d000, 0x00000014, - 0x0201f800, 0x0010645c, 0x59c40006, 0x82000500, - 0xffffff0f, 0x48038806, 0x0401fb06, 0x59a8006d, - 0x80000540, 0x04000014, 0x4a038805, 0x00000001, - 0x4c580000, 0x4200b000, 0x000006a4, 0x4201d000, - 0x00000064, 0x4c580000, 0x0201f800, 0x0010645c, - 0x0201f800, 0x001018f3, 0x5c00b000, 0x04000005, - 0x8058b040, 0x040207f6, 0x5c00b000, 0x0401f011, - 0x5c00b000, 0x4a038805, 0x00000010, 0x4a038808, - 0x00000004, 0x4200b000, 0x00000065, 0x59c40005, - 0x8c000508, 0x0402001d, 0x4201d000, 0x000003e8, - 0x0201f800, 0x0010645c, 0x8058b040, 0x040207f8, - 0x42002000, 0x00000007, 0x0401f9a1, 0x0401fad4, - 0x0201f800, 0x00106faf, 0x4803c856, 0x59a80078, - 0x8c00053e, 0x04000004, 0x0201f800, 0x0010b581, - 0x0401f003, 0x4a038808, 0x00000008, 0x4a035014, - 0x00000001, 0x4202d800, 0x00000001, 0x82000540, - 0x00000001, 0x0401f048, 0x42002000, 0x00000001, - 0x0401f98b, 0x0201f800, 0x001007f8, 0x42000000, - 0x0010cc68, 0x0201f800, 0x0010bc88, 0x0201f800, - 0x00100ce6, 0x497b8880, 0x59a8001f, 0x82000500, - 0x0000ffff, 0x4c000000, 0x0201f800, 0x001015e0, - 0x5c000000, 0x48038880, 0x41780800, 0x0201f800, - 0x00101bda, 0x4a038808, 0x00000000, 0x4a038805, - 0x00000008, 0x4200b000, 0x00000065, 0x4a038805, - 0x000000f0, 0x59a8006d, 0x80000540, 0x04000005, - 0x4201d000, 0x00000002, 0x0201f800, 0x0010645c, - 0x0201f800, 0x00101935, 0x42000800, 0x000000f0, - 0x59c40005, 0x80040d00, 0x04000008, 0x4201d000, - 0x000003e8, 0x0201f800, 0x0010645c, 0x8058b040, - 0x040207eb, 0x0401f7b7, 0x59a8006d, 0x80000540, - 0x04000004, 0x59c40005, 0x8c000506, 0x040007f4, - 0x42002000, 0x00000002, 0x0401f951, 0x59c40006, - 0x82000540, 0x000000f0, 0x48038806, 0x59a80012, - 0x80000540, 0x04020002, 0x80000000, 0x48038893, - 0x80000580, 0x4df00000, 0x0201f800, 0x0010195d, - 0x5c03e000, 0x5c001000, 0x480b8808, 0x5c01d000, - 0x5c00b000, 0x1c01f000, 0x4803c856, 0x42000800, - 0x00000001, 0x0201f800, 0x00101bda, 0x4c580000, - 0x4ce80000, 0x59c41008, 0x4c080000, 0x82081500, - 0xffffff7f, 0x480b8808, 0x59c40004, 0x82000500, - 0x00003e02, 0x04000005, 0x4201d000, 0x00000014, - 0x0201f800, 0x0010645c, 0x0201f800, 0x001007f8, - 0x42000000, 0x0010cc69, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x00100ce6, 0x42002000, 0x00000000, - 0x0401f91f, 0x4a038808, 0x00000002, 0x80000580, - 0x48038880, 0x48038893, 0x0201f800, 0x001015e0, - 0x4200b000, 0x00000384, 0x4a038805, 0x000000f0, - 0x0201f800, 0x00101935, 0x42000800, 0x000000f0, - 0x59c40005, 0x80040d00, 0x04000024, 0x82000500, - 0x000000d0, 0x04020024, 0x4201d000, 0x00000067, - 0x0201f800, 0x0010645c, 0x8058b040, 0x040207ef, - 0x42002000, 0x00000007, 0x0401f901, 0x0201f800, - 0x00106faf, 0x0401fa32, 0x59a80078, 0x8c00053e, - 0x04000004, 0x0201f800, 0x0010b581, 0x0401f003, - 0x4a038808, 0x00000008, 0x4a035014, 0x00000001, - 0x4202d800, 0x00000001, 0x59c40006, 0x8400050a, - 0x48038806, 0x4a038805, 0x00000020, 0x82000540, - 0x00000001, 0x0401f016, 0x42002000, 0x00000002, - 0x0401f8e7, 0x497b8880, 0x59a80012, 0x80000540, - 0x04020002, 0x80000000, 0x48038893, 0x59a8001f, + 0x040207fb, 0x41c41800, 0x4200b000, 0x00000020, + 0x580c0010, 0x44000800, 0x80040800, 0x800c1800, + 0x8058b040, 0x040207fb, 0x497b8830, 0x4200b000, + 0x00000040, 0x59c40031, 0x44000800, 0x80040800, + 0x8058b040, 0x040207fc, 0x497b88ac, 0x4200b000, + 0x00000010, 0x59c400ad, 0x44000800, 0x80040800, + 0x8058b040, 0x040207fc, 0x59c41001, 0x4c080000, + 0x8408150c, 0x480b8801, 0x4a0370e4, 0x00000300, + 0x4a0370e5, 0xb0000000, 0x42000800, 0x00000800, + 0x80040840, 0x02000800, 0x0010032e, 0x59b800e5, + 0x8c000538, 0x040207fb, 0x4a0370e4, 0x00000200, + 0x42006000, 0xffffffff, 0x42006800, 0x80000000, + 0x0201f800, 0x001042a6, 0x4a038807, 0x00000001, + 0x497b8807, 0x0401fb89, 0x4a038808, 0x00000010, + 0x42006000, 0xfcf8ffff, 0x42006800, 0x01000000, + 0x0201f800, 0x001042a6, 0x5c001000, 0x480b8801, + 0x42000800, 0x0010e4fe, 0x50040000, 0x48038803, + 0x58040001, 0x48038804, 0x58040002, 0x4803880b, + 0x58040003, 0x4803888e, 0x58040004, 0x4803888f, + 0x58040005, 0x48038890, 0x58040006, 0x48038891, + 0x58040007, 0x48038892, 0x58040008, 0x48038893, + 0x58040009, 0x48038899, 0x5804000a, 0x4803889e, + 0x5804000b, 0x480388aa, 0x5804000c, 0x480388af, + 0x5804000d, 0x480388b2, 0x5804000e, 0x480388b1, + 0x82040c00, 0x0000000f, 0x41c41800, 0x4200b000, + 0x00000030, 0x50040000, 0x48001850, 0x80040800, + 0x800c1800, 0x8058b040, 0x040207fb, 0x41c41800, + 0x4200b000, 0x00000020, 0x50040000, 0x48001810, + 0x80040800, 0x800c1800, 0x8058b040, 0x040207fb, + 0x497b8830, 0x4200b000, 0x00000040, 0x50040000, + 0x48038831, 0x80040800, 0x8058b040, 0x040207fc, + 0x497b88ac, 0x4200b000, 0x00000010, 0x50040000, + 0x480388ad, 0x80040800, 0x8058b040, 0x040207fc, + 0x497b8880, 0x41780000, 0x0201f800, 0x001015e5, + 0x59c408a4, 0x82040d00, 0x0000000f, 0x82040580, + 0x0000000c, 0x02020800, 0x0010032e, 0x4a038805, + 0x04000000, 0x5c00b000, 0x1c01f000, 0x4803c856, + 0x42000800, 0x00000001, 0x0201f800, 0x00101bdf, + 0x4c580000, 0x4ce80000, 0x42000000, 0x0010ce79, + 0x0201f800, 0x0010bfb3, 0x59c41008, 0x4c080000, + 0x82081500, 0xffffff7f, 0x480b8808, 0x59c40004, + 0x82000500, 0x00003e02, 0x04000005, 0x4201d000, + 0x00000014, 0x0201f800, 0x00106661, 0x59c40006, + 0x82000500, 0xffffff0f, 0x48038806, 0x0401fb06, + 0x59a8006d, 0x80000540, 0x04000014, 0x4a038805, + 0x00000001, 0x4c580000, 0x4200b000, 0x000006a4, + 0x4201d000, 0x00000064, 0x4c580000, 0x0201f800, + 0x00106661, 0x0201f800, 0x001018f8, 0x5c00b000, + 0x04000005, 0x8058b040, 0x040207f6, 0x5c00b000, + 0x0401f011, 0x5c00b000, 0x4a038805, 0x00000010, + 0x4a038808, 0x00000004, 0x4200b000, 0x00000065, + 0x59c40005, 0x8c000508, 0x0402001d, 0x4201d000, + 0x000003e8, 0x0201f800, 0x00106661, 0x8058b040, + 0x040207f8, 0x42002000, 0x00000007, 0x0401f9a1, + 0x0401fad4, 0x0201f800, 0x001071b4, 0x4803c856, + 0x59a80078, 0x8c00053e, 0x04000004, 0x0201f800, + 0x0010b8ac, 0x0401f003, 0x4a038808, 0x00000008, + 0x4a035014, 0x00000001, 0x4202d800, 0x00000001, + 0x82000540, 0x00000001, 0x0401f048, 0x42002000, + 0x00000001, 0x0401f98b, 0x0201f800, 0x001007f6, + 0x42000000, 0x0010cf68, 0x0201f800, 0x0010bfb3, + 0x0201f800, 0x00100ce7, 0x497b8880, 0x59a8001f, 0x82000500, 0x0000ffff, 0x4c000000, 0x0201f800, - 0x001015e0, 0x5c000000, 0x48038880, 0x41780800, - 0x0201f800, 0x00101bda, 0x80000580, 0x4df00000, - 0x0201f800, 0x0010195d, 0x5c03e000, 0x5c001000, - 0x480b8808, 0x5c01d000, 0x5c00b000, 0x1c01f000, - 0x4803c856, 0x42000800, 0x00000001, 0x0201f800, - 0x00101bda, 0x42002000, 0x00000001, 0x0401f8c4, - 0x59c40004, 0x82000500, 0x00003e02, 0x0400000b, - 0x0201f800, 0x00106faf, 0x0401f9f1, 0x4a038808, - 0x00000008, 0x4a035014, 0x00000001, 0x4202d800, - 0x00000001, 0x0401f055, 0x0201f800, 0x001007f8, - 0x42000000, 0x0010cc6a, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x00100ce6, 0x59c40006, 0x84000508, - 0x48038806, 0x4a038805, 0x00000010, 0x850e1d4c, - 0x42000800, 0x00000064, 0x42001000, 0x00104ed1, - 0x0201f800, 0x0010643e, 0x41780800, 0x0201f800, - 0x00101bda, 0x4a038808, 0x00000000, 0x497b8880, - 0x4a038805, 0x000000f0, 0x0201f800, 0x00101935, - 0x42000800, 0x000000f0, 0x59c40005, 0x80040d00, - 0x0400000e, 0x82000500, 0x000000e0, 0x0402000e, - 0x4201d000, 0x000003e8, 0x0201f800, 0x0010645c, - 0x0201f800, 0x00106275, 0x59940004, 0x80000540, - 0x040207ec, 0x0401f025, 0x42002000, 0x00000002, - 0x0401f883, 0x4c080000, 0x42001000, 0x00104ed1, - 0x0201f800, 0x00106449, 0x5c001000, 0x497b8880, + 0x001015e5, 0x5c000000, 0x48038880, 0x41780800, + 0x0201f800, 0x00101bdf, 0x4a038808, 0x00000000, + 0x4a038805, 0x00000008, 0x4200b000, 0x00000065, + 0x4a038805, 0x000000f0, 0x59a8006d, 0x80000540, + 0x04000005, 0x4201d000, 0x00000002, 0x0201f800, + 0x00106661, 0x0201f800, 0x0010193a, 0x42000800, + 0x000000f0, 0x59c40005, 0x80040d00, 0x04000008, + 0x4201d000, 0x000003e8, 0x0201f800, 0x00106661, + 0x8058b040, 0x040207eb, 0x0401f7b7, 0x59a8006d, + 0x80000540, 0x04000004, 0x59c40005, 0x8c000506, + 0x040007f4, 0x42002000, 0x00000002, 0x0401f951, + 0x59c40006, 0x82000540, 0x000000f0, 0x48038806, 0x59a80012, 0x80000540, 0x04020002, 0x80000000, - 0x48038893, 0x59a8001f, 0x82000500, 0x0000ffff, - 0x4c000000, 0x0201f800, 0x001015e0, 0x5c000000, - 0x48038880, 0x850e1d0c, 0x59c40006, 0x84000548, - 0x48038806, 0x0201f800, 0x0010195d, 0x41780800, - 0x0201f800, 0x00101bda, 0x59c40008, 0x82000540, - 0x00000080, 0x48038808, 0x1c01f000, 0x4803c856, - 0x4d400000, 0x4d3c0000, 0x0201f800, 0x00106faf, - 0x0201f800, 0x0010bd90, 0x04020039, 0x599c1017, - 0x8d0e1d00, 0x0402000b, 0x8c08151a, 0x04000034, - 0x850e1d42, 0x42028000, 0x00000004, 0x42027800, - 0x00000008, 0x8d0e1d20, 0x04020007, 0x0401f028, - 0x42028000, 0x00000004, 0x417a7800, 0x8d0e1d20, - 0x04000023, 0x0201f800, 0x0010bd9f, 0x42024800, - 0x0010ccd1, 0x59240200, 0x8c000500, 0x04000009, - 0x4c580000, 0x42000800, 0x00000001, 0x42001000, - 0x00000100, 0x0201f800, 0x0010654e, 0x5c00b000, - 0x83264c00, 0x0000000b, 0x8058b040, 0x040207f2, - 0x42024000, 0x0000ffff, 0x4d400000, 0x42028000, - 0x0000000e, 0x42003000, 0x00000003, 0x42028800, - 0x0000ffff, 0x0201f800, 0x0010ae86, 0x5c028000, - 0x599c0817, 0x8c040d0a, 0x04020005, 0x4943c857, - 0x493fc857, 0x0201f800, 0x0010fbe5, 0x497b8880, - 0x4202d800, 0x00000001, 0x0401fc66, 0x5c027800, - 0x5c028000, 0x1c01f000, 0x42000800, 0x00000001, - 0x0201f800, 0x00101bda, 0x0201f800, 0x001007f8, - 0x42000000, 0x0010cc6b, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x00100ce6, 0x42000000, 0x00000001, - 0x0201f800, 0x001015e0, 0x4a038880, 0x00000001, - 0x59c80835, 0x59a80075, 0x80040d80, 0x04000002, - 0x48039035, 0x0201f000, 0x0010195d, 0x42000800, - 0x0010c7fb, 0x48100802, 0x82101480, 0x00000008, - 0x04001009, 0x58040001, 0x4803c857, 0x4813c857, - 0x58040003, 0x80000000, 0x48000803, 0x42002000, - 0x00000002, 0x58040001, 0x82001480, 0x0000000b, - 0x04001008, 0x4803c857, 0x4813c857, 0x58040003, - 0x80000000, 0x48000803, 0x42000000, 0x00000000, - 0x48000800, 0x59c428a4, 0x82142d00, 0x0000000f, - 0x82142d80, 0x0000000c, 0x0c000002, 0x0401f136, - 0x00105303, 0x00105323, 0x00105344, 0x00105365, - 0x00105386, 0x001053a1, 0x001053b2, 0x001053c9, - 0x001053e0, 0x001053f7, 0x001053fa, 0x40100000, - 0x0c01f001, 0x0010530d, 0x00105310, 0x00105313, - 0x00105314, 0x00105317, 0x0010531a, 0x0010531e, - 0x00105321, 0x4a000801, 0x00000002, 0x1c01f000, - 0x4a000801, 0x00000003, 0x0401f0e9, 0x1c01f000, - 0x4a000801, 0x00000007, 0x1c01f000, 0x4a000801, - 0x00000004, 0x0401f0e6, 0x4a000801, 0x00000005, - 0x0401f8eb, 0x0401f0e6, 0x4a000801, 0x00000005, - 0x0401f0e7, 0x4813c857, 0x1c01f000, 0x40100000, - 0x0c01f001, 0x0010532d, 0x00105330, 0x00105333, - 0x00105334, 0x00105337, 0x0010533a, 0x0010533e, - 0x00105341, 0x4a000801, 0x00000002, 0x1c01f000, - 0x4a000801, 0x00000003, 0x1c01f000, 0x1c01f000, - 0x4a000801, 0x00000007, 0x1c01f000, 0x4a000801, - 0x00000004, 0x0401f0c6, 0x4a000801, 0x00000005, - 0x0401f8cb, 0x0401f0c6, 0x4a000801, 0x00000005, - 0x1c01f000, 0x4a000801, 0x00000005, 0x0401f0bc, - 0x40100000, 0x0c01f001, 0x0010534e, 0x0010534f, - 0x00105352, 0x00105355, 0x00105358, 0x0010535b, - 0x0010535f, 0x00105362, 0x1c01f000, 0x4a000801, - 0x00000003, 0x1c01f000, 0x4a000801, 0x00000000, + 0x48038893, 0x80000580, 0x4df00000, 0x0201f800, + 0x00101962, 0x5c03e000, 0x5c001000, 0x480b8808, + 0x5c01d000, 0x5c00b000, 0x1c01f000, 0x4803c856, + 0x42000800, 0x00000001, 0x0201f800, 0x00101bdf, + 0x4c580000, 0x4ce80000, 0x59c41008, 0x4c080000, + 0x82081500, 0xffffff7f, 0x480b8808, 0x59c40004, + 0x82000500, 0x00003e02, 0x04000005, 0x4201d000, + 0x00000014, 0x0201f800, 0x00106661, 0x0201f800, + 0x001007f6, 0x42000000, 0x0010cf69, 0x0201f800, + 0x0010bfb3, 0x0201f800, 0x00100ce7, 0x42002000, + 0x00000000, 0x0401f91f, 0x4a038808, 0x00000002, + 0x80000580, 0x48038880, 0x48038893, 0x0201f800, + 0x001015e5, 0x4200b000, 0x00000384, 0x4a038805, + 0x000000f0, 0x0201f800, 0x0010193a, 0x42000800, + 0x000000f0, 0x59c40005, 0x80040d00, 0x04000024, + 0x82000500, 0x000000d0, 0x04020024, 0x4201d000, + 0x00000067, 0x0201f800, 0x00106661, 0x8058b040, + 0x040207ef, 0x42002000, 0x00000007, 0x0401f901, + 0x0201f800, 0x001071b4, 0x0401fa32, 0x59a80078, + 0x8c00053e, 0x04000004, 0x0201f800, 0x0010b8ac, + 0x0401f003, 0x4a038808, 0x00000008, 0x4a035014, + 0x00000001, 0x4202d800, 0x00000001, 0x59c40006, + 0x8400050a, 0x48038806, 0x4a038805, 0x00000020, + 0x82000540, 0x00000001, 0x0401f016, 0x42002000, + 0x00000002, 0x0401f8e7, 0x497b8880, 0x59a80012, + 0x80000540, 0x04020002, 0x80000000, 0x48038893, + 0x59a8001f, 0x82000500, 0x0000ffff, 0x4c000000, + 0x0201f800, 0x001015e5, 0x5c000000, 0x48038880, + 0x41780800, 0x0201f800, 0x00101bdf, 0x80000580, + 0x4df00000, 0x0201f800, 0x00101962, 0x5c03e000, + 0x5c001000, 0x480b8808, 0x5c01d000, 0x5c00b000, + 0x1c01f000, 0x4803c856, 0x42000800, 0x00000001, + 0x0201f800, 0x00101bdf, 0x42002000, 0x00000001, + 0x0401f8c4, 0x59c40004, 0x82000500, 0x00003e02, + 0x0400000b, 0x0201f800, 0x001071b4, 0x0401f9f1, + 0x4a038808, 0x00000008, 0x4a035014, 0x00000001, + 0x4202d800, 0x00000001, 0x0401f055, 0x0201f800, + 0x001007f6, 0x42000000, 0x0010cf6a, 0x0201f800, + 0x0010bfb3, 0x0201f800, 0x00100ce7, 0x59c40006, + 0x84000508, 0x48038806, 0x4a038805, 0x00000010, + 0x850e1d4c, 0x42000800, 0x00000064, 0x42001000, + 0x00105002, 0x0201f800, 0x00106643, 0x41780800, + 0x0201f800, 0x00101bdf, 0x4a038808, 0x00000000, + 0x497b8880, 0x4a038805, 0x000000f0, 0x0201f800, + 0x0010193a, 0x42000800, 0x000000f0, 0x59c40005, + 0x80040d00, 0x0400000e, 0x82000500, 0x000000e0, + 0x0402000e, 0x4201d000, 0x000003e8, 0x0201f800, + 0x00106661, 0x0201f800, 0x0010647a, 0x59940004, + 0x80000540, 0x040207ec, 0x0401f025, 0x42002000, + 0x00000002, 0x0401f883, 0x4c080000, 0x42001000, + 0x00105002, 0x0201f800, 0x0010664e, 0x5c001000, + 0x497b8880, 0x59a80012, 0x80000540, 0x04020002, + 0x80000000, 0x48038893, 0x59a8001f, 0x82000500, + 0x0000ffff, 0x4c000000, 0x0201f800, 0x001015e5, + 0x5c000000, 0x48038880, 0x850e1d0c, 0x59c40006, + 0x84000548, 0x48038806, 0x0201f800, 0x00101962, + 0x41780800, 0x0201f800, 0x00101bdf, 0x59c40008, + 0x82000540, 0x00000080, 0x48038808, 0x1c01f000, + 0x4803c856, 0x4d400000, 0x4d3c0000, 0x0201f800, + 0x001071b4, 0x0201f800, 0x0010c0bb, 0x04020039, + 0x599c1017, 0x8d0e1d00, 0x0402000b, 0x8c08151a, + 0x04000034, 0x850e1d42, 0x42028000, 0x00000004, + 0x42027800, 0x00000008, 0x8d0e1d20, 0x04020007, + 0x0401f028, 0x42028000, 0x00000004, 0x417a7800, + 0x8d0e1d20, 0x04000023, 0x0201f800, 0x0010c0ca, + 0x42024800, 0x0010cfd1, 0x59240200, 0x8c000500, + 0x04000009, 0x4c580000, 0x42000800, 0x00000001, + 0x42001000, 0x00000100, 0x0201f800, 0x00106753, + 0x5c00b000, 0x83264c00, 0x0000000b, 0x8058b040, + 0x040207f2, 0x42024000, 0x0000ffff, 0x4d400000, + 0x42028000, 0x0000000e, 0x42003000, 0x00000003, + 0x42028800, 0x0000ffff, 0x0201f800, 0x0010b195, + 0x5c028000, 0x599c0817, 0x8c040d0a, 0x04020005, + 0x4943c857, 0x493fc857, 0x0201f800, 0x0010fef2, + 0x497b8880, 0x4202d800, 0x00000001, 0x0401fc66, + 0x5c027800, 0x5c028000, 0x1c01f000, 0x42000800, + 0x00000001, 0x0201f800, 0x00101bdf, 0x0201f800, + 0x001007f6, 0x42000000, 0x0010cf6b, 0x0201f800, + 0x0010bfb3, 0x0201f800, 0x00100ce7, 0x42000000, + 0x00000001, 0x0201f800, 0x001015e5, 0x4a038880, + 0x00000001, 0x59c80835, 0x59a80075, 0x80040d80, + 0x04000002, 0x48039035, 0x0201f000, 0x00101962, + 0x42000800, 0x0010cafb, 0x48100802, 0x82101480, + 0x00000008, 0x04001009, 0x58040001, 0x4803c857, + 0x4813c857, 0x58040003, 0x80000000, 0x48000803, + 0x42002000, 0x00000002, 0x58040001, 0x82001480, + 0x0000000b, 0x04001008, 0x4803c857, 0x4813c857, + 0x58040003, 0x80000000, 0x48000803, 0x42000000, + 0x00000000, 0x48000800, 0x59c428a4, 0x82142d00, + 0x0000000f, 0x82142d80, 0x0000000c, 0x0c000002, + 0x0401f136, 0x00105434, 0x00105454, 0x00105475, + 0x00105496, 0x001054b7, 0x001054d2, 0x001054e3, + 0x001054fa, 0x00105511, 0x00105528, 0x0010552b, + 0x40100000, 0x0c01f001, 0x0010543e, 0x00105441, + 0x00105444, 0x00105445, 0x00105448, 0x0010544b, + 0x0010544f, 0x00105452, 0x4a000801, 0x00000002, + 0x1c01f000, 0x4a000801, 0x00000003, 0x0401f0e9, 0x1c01f000, 0x4a000801, 0x00000007, 0x1c01f000, - 0x4a000801, 0x00000004, 0x0401f0a5, 0x4a000801, - 0x00000005, 0x0401f8aa, 0x0401f0a5, 0x4a000801, + 0x4a000801, 0x00000004, 0x0401f0e6, 0x4a000801, + 0x00000005, 0x0401f8eb, 0x0401f0e6, 0x4a000801, + 0x00000005, 0x0401f0e7, 0x4813c857, 0x1c01f000, + 0x40100000, 0x0c01f001, 0x0010545e, 0x00105461, + 0x00105464, 0x00105465, 0x00105468, 0x0010546b, + 0x0010546f, 0x00105472, 0x4a000801, 0x00000002, + 0x1c01f000, 0x4a000801, 0x00000003, 0x1c01f000, + 0x1c01f000, 0x4a000801, 0x00000007, 0x1c01f000, + 0x4a000801, 0x00000004, 0x0401f0c6, 0x4a000801, + 0x00000005, 0x0401f8cb, 0x0401f0c6, 0x4a000801, 0x00000005, 0x1c01f000, 0x4a000801, 0x00000005, - 0x0401f09b, 0x40100000, 0x0c01f001, 0x0010536f, - 0x00105372, 0x00105373, 0x00105376, 0x00105379, - 0x0010537c, 0x00105380, 0x00105383, 0x4a000801, - 0x00000002, 0x1c01f000, 0x1c01f000, 0x4a000801, + 0x0401f0bc, 0x40100000, 0x0c01f001, 0x0010547f, + 0x00105480, 0x00105483, 0x00105486, 0x00105489, + 0x0010548c, 0x00105490, 0x00105493, 0x1c01f000, + 0x4a000801, 0x00000003, 0x1c01f000, 0x4a000801, 0x00000000, 0x1c01f000, 0x4a000801, 0x00000007, - 0x1c01f000, 0x4a000801, 0x00000004, 0x0401f084, - 0x4a000801, 0x00000005, 0x0401f889, 0x0401f084, + 0x1c01f000, 0x4a000801, 0x00000004, 0x0401f0a5, + 0x4a000801, 0x00000005, 0x0401f8aa, 0x0401f0a5, 0x4a000801, 0x00000005, 0x1c01f000, 0x4a000801, - 0x00000005, 0x0401f07a, 0x40100000, 0x0c01f001, - 0x00105390, 0x00105393, 0x00105393, 0x00105394, - 0x00105393, 0x00105397, 0x0010539b, 0x0010539e, + 0x00000005, 0x0401f09b, 0x40100000, 0x0c01f001, + 0x001054a0, 0x001054a3, 0x001054a4, 0x001054a7, + 0x001054aa, 0x001054ad, 0x001054b1, 0x001054b4, 0x4a000801, 0x00000002, 0x1c01f000, 0x1c01f000, - 0x4a000801, 0x00000007, 0x1c01f000, 0x4a000801, - 0x00000005, 0x0401f86e, 0x0401f069, 0x4a000801, - 0x00000005, 0x1c01f000, 0x4a000801, 0x00000005, - 0x0401f05f, 0x40100000, 0x0c01f001, 0x001053b1, - 0x001053b1, 0x001053b1, 0x001053ab, 0x001053ae, - 0x001053b1, 0x001053b1, 0x001053b1, 0x4a000801, + 0x4a000801, 0x00000000, 0x1c01f000, 0x4a000801, 0x00000007, 0x1c01f000, 0x4a000801, 0x00000004, - 0x1c01f000, 0x1c01f000, 0x40100000, 0x0c01f001, - 0x001053bc, 0x001053bf, 0x001053bf, 0x001053c0, - 0x001053c3, 0x001053c6, 0x001053c6, 0x001053c6, - 0x4a000801, 0x00000002, 0x1c01f000, 0x1c01f000, + 0x0401f084, 0x4a000801, 0x00000005, 0x0401f889, + 0x0401f084, 0x4a000801, 0x00000005, 0x1c01f000, + 0x4a000801, 0x00000005, 0x0401f07a, 0x40100000, + 0x0c01f001, 0x001054c1, 0x001054c4, 0x001054c4, + 0x001054c5, 0x001054c4, 0x001054c8, 0x001054cc, + 0x001054cf, 0x4a000801, 0x00000002, 0x1c01f000, + 0x1c01f000, 0x4a000801, 0x00000007, 0x1c01f000, + 0x4a000801, 0x00000005, 0x0401f86e, 0x0401f069, + 0x4a000801, 0x00000005, 0x1c01f000, 0x4a000801, + 0x00000005, 0x0401f05f, 0x40100000, 0x0c01f001, + 0x001054e2, 0x001054e2, 0x001054e2, 0x001054dc, + 0x001054df, 0x001054e2, 0x001054e2, 0x001054e2, 0x4a000801, 0x00000007, 0x1c01f000, 0x4a000801, - 0x00000004, 0x0401f03a, 0x4a000801, 0x00000008, - 0x1c01f000, 0x40100000, 0x0c01f001, 0x001053d3, - 0x001053d6, 0x001053d9, 0x001053d9, 0x001053da, - 0x001053dd, 0x001053dd, 0x001053dd, 0x4a000801, - 0x00000002, 0x1c01f000, 0x4a000801, 0x00000003, - 0x1c01f000, 0x1c01f000, 0x4a000801, 0x00000004, - 0x0401f023, 0x4a000801, 0x00000008, 0x1c01f000, - 0x40100000, 0x0c01f001, 0x001053ea, 0x001053ea, - 0x001053ed, 0x001053ee, 0x001053f1, 0x001053ed, - 0x001053f4, 0x001053ed, 0x4a000801, 0x00000005, - 0x0401f00f, 0x1c01f000, 0x4a000801, 0x00000007, - 0x1c01f000, 0x4a000801, 0x00000004, 0x1c01f000, - 0x4a000801, 0x00000008, 0x1c01f000, 0x4a000801, - 0x00000009, 0x1c01f000, 0x1c01f000, 0x42000000, - 0x0010cb63, 0x0201f000, 0x0010bc88, 0x42000000, - 0x0010cb60, 0x0201f000, 0x0010bc88, 0x42000000, - 0x0010cb62, 0x0201f000, 0x0010bc88, 0x42000000, - 0x0010cb61, 0x0201f000, 0x0010bc88, 0x42000800, - 0x0010c7fb, 0x58040001, 0x48000800, 0x4a000801, - 0x00000005, 0x4a000802, 0x00000008, 0x1c01f000, - 0x42000800, 0x0010c7fb, 0x58040001, 0x48000800, - 0x4a000801, 0x00000001, 0x4a000802, 0x0000000a, - 0x1c01f000, 0x42000800, 0x0010c7fb, 0x58040001, - 0x48000800, 0x4a000801, 0x00000006, 0x4a000802, - 0x00000009, 0x1c01f000, 0x42000800, 0x0010c7fb, - 0x4a000801, 0x0000000a, 0x4a000800, 0x0000000a, - 0x1c01f000, 0x496fc857, 0x4813c857, 0x40100000, - 0x0c01f001, 0x00105447, 0x00105447, 0x00105447, - 0x00105447, 0x00105439, 0x00105441, 0x00105445, - 0x00105447, 0x59a8021b, 0x8c000506, 0x04000003, - 0x8c000502, 0x0400000a, 0x0401f80a, 0x040207c0, - 0x0401f007, 0x0401f807, 0x04000005, 0x0401ffc0, - 0x0401f7c3, 0x0401f803, 0x040207c1, 0x1c01f000, - 0x496fc857, 0x416c0000, 0x82000c80, 0x00000008, - 0x02021800, 0x0010032e, 0x0c01f001, 0x00105457, - 0x00105459, 0x00105459, 0x00105459, 0x00105457, - 0x00105457, 0x00105457, 0x00105459, 0x80000580, - 0x1c01f000, 0x82000540, 0x00000001, 0x1c01f000, - 0x4202e000, 0x00000000, 0x497b3004, 0x4a03b004, - 0x60000001, 0x59d80005, 0x4a03b004, 0x90000001, - 0x4a03a804, 0x60000001, 0x59d40005, 0x4a03a804, - 0x90000001, 0x0201f000, 0x00105b60, 0x4a03c825, - 0x00000004, 0x4a03c827, 0x00000004, 0x599c0409, - 0x80000d40, 0x04000020, 0x599c0407, 0x80000540, - 0x04000007, 0x800000cc, 0x599c100b, 0x80080400, - 0x4803b000, 0x497bb002, 0x59d80001, 0x599c000b, - 0x4803b000, 0x599c000c, 0x4803b001, 0x599c0407, - 0x80000540, 0x04020002, 0x497bb002, 0x599c0c09, - 0x82040540, 0x00400000, 0x4803b003, 0x4a03b009, - 0x00000005, 0x4a03b004, 0x10000001, 0x59e00803, - 0x82040d00, 0xfffffeff, 0x82040d40, 0x00008000, - 0x4807c003, 0x599c040a, 0x80000540, 0x04000020, - 0x599c0408, 0x80000540, 0x04000007, 0x800000cc, - 0x599c100f, 0x80080400, 0x4803a800, 0x497ba802, - 0x59d40001, 0x599c000f, 0x4803a800, 0x599c0010, - 0x4803a801, 0x599c0408, 0x80000540, 0x04020002, - 0x497ba802, 0x599c0c0a, 0x82040540, 0x00400000, - 0x4803a803, 0x4a03a809, 0x00000005, 0x4a03a804, - 0x10000001, 0x59e00803, 0x82040d00, 0xfffffbff, - 0x82040d40, 0x00008000, 0x4807c003, 0x800409c0, - 0x04000007, 0x4202e000, 0x00000001, 0x0200b800, - 0x00020874, 0x0200f000, 0x00020889, 0x1c01f000, - 0x0201f800, 0x0010032e, 0x1c01f000, 0x0401f852, - 0x5c03e000, 0x0201f000, 0x000206be, 0x0201f800, - 0x00020705, 0x0401f7fb, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105521, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x000206fc, 0x00105511, 0x00105511, 0x00105521, - 0x00105521, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x000206fc, 0x492fc857, 0x42000000, 0x0010cc1e, - 0x0201f800, 0x0010bc88, 0x42000000, 0x00000400, - 0x0401f019, 0x492fc857, 0x42000000, 0x0010cc1d, - 0x0201f800, 0x0010bc88, 0x42000000, 0x00001000, - 0x0401f011, 0x492fc857, 0x42000000, 0x0010cc1c, - 0x0201f800, 0x0010bc88, 0x42000000, 0x00002000, - 0x0401f009, 0x492fc857, 0x42000000, 0x0010cc1f, - 0x0201f800, 0x0010bc88, 0x42000000, 0x00000800, - 0x0401f001, 0x4803c857, 0x592c0c05, 0x82040d00, - 0xffff80ff, 0x80040540, 0x59980803, 0x800409c0, - 0x04000002, 0x8400051e, 0x48025c05, 0x0201f800, - 0x000203ef, 0x83700580, 0x00000003, 0x4202e000, - 0x00000001, 0x04000002, 0x1c01f000, 0x599a5801, - 0x812e59c0, 0x040207dc, 0x0201f800, 0x0010032e, - 0x492fc857, 0x80140110, 0x80000040, 0x04000039, - 0x040017cd, 0x4a033006, 0x00105584, 0x0201f000, - 0x000206d1, 0x492fc857, 0x80140110, 0x040007c6, - 0x80000040, 0x0400004a, 0x4a033006, 0x0010559f, - 0x0201f000, 0x000206d1, 0x492fc857, 0x0201f800, - 0x0010bd90, 0x02020000, 0x000206e1, 0x492fc856, - 0x83440400, 0x0010bf80, 0x50000000, 0x80026d40, - 0x0400000c, 0x592e4411, 0x81224110, 0x59340013, - 0x80000130, 0x81200580, 0x04020006, 0x4937c857, - 0x59340200, 0x8c00050e, 0x02020000, 0x000206e1, - 0x42028000, 0x00000028, 0x41780800, 0x417a6000, - 0x0201f800, 0x00104cf5, 0x0201f800, 0x00109824, - 0x0201f000, 0x000203ef, 0x82000500, 0x0f000000, - 0x8000012a, 0x592c0c0b, 0x82040d00, 0x0000ff87, - 0x80040540, 0x48025c0b, 0x0201f000, 0x000206f7, - 0x592c0a0b, 0x8c040d02, 0x04020015, 0x492fc857, - 0x8d0e1d0e, 0x0402000f, 0x592c0208, 0x80000540, - 0x04000005, 0x0201f800, 0x0010425f, 0x04020004, - 0x1c01f000, 0x42000000, 0x00000000, 0x592c0a07, - 0x48065c07, 0x48025a07, 0x0201f000, 0x000203ef, - 0x42000000, 0x00000028, 0x0401f7f9, 0x42000800, - 0x00000009, 0x0201f000, 0x00106a53, 0x492fc857, - 0x592c0409, 0x80000540, 0x04020787, 0x8d0e1d0e, - 0x04020009, 0x592c0208, 0x80000540, 0x04000782, - 0x497a5a07, 0x0201f800, 0x001042bf, 0x04020004, - 0x1c01f000, 0x42000000, 0x00000028, 0x48025a07, - 0x0201f000, 0x000203ef, 0x592e8a07, 0x592c0407, - 0x4947c857, 0x4803c857, 0x82000500, 0x000000ff, - 0x4200b800, 0x00000001, 0x82000d80, 0x00000001, - 0x04000015, 0x417a8800, 0x4200b800, 0x000007f0, - 0x82000d80, 0x00000002, 0x0400000f, 0x80000540, - 0x02020000, 0x000203ef, 0x592e8a07, 0x0201f800, - 0x0002034c, 0x02020000, 0x000203ef, 0x592e9009, - 0x592e980a, 0x0201f800, 0x001046dc, 0x0201f000, - 0x000203ef, 0x850e1d00, 0x0201f800, 0x0002034c, - 0x02000800, 0x0010480b, 0x81468800, 0x805cb840, - 0x040207fa, 0x0201f000, 0x000203ef, 0x592c0a09, - 0x4807c857, 0x592e4411, 0x81224110, 0x82040580, - 0x0000000e, 0x04000091, 0x82040580, 0x0000002a, - 0x0400002c, 0x82040580, 0x0000000f, 0x02000000, - 0x00105b76, 0x82040580, 0x0000002e, 0x02000000, - 0x00105b76, 0x4c040000, 0x0201f800, 0x00105acb, - 0x5c000800, 0x02020000, 0x00105b7d, 0x82040580, - 0x00000046, 0x040000a2, 0x82040580, 0x00000045, - 0x04000034, 0x82040580, 0x00000049, 0x02000000, - 0x00105b76, 0x82040580, 0x00000029, 0x02020000, - 0x00105b7d, 0x592e8a07, 0x0201f800, 0x0010497a, - 0x02020000, 0x00105b76, 0x59340200, 0x84000518, - 0x48026a00, 0x592e600a, 0x4933c857, 0x83300580, - 0xffffffff, 0x04020090, 0x0201f000, 0x00105b76, - 0x83200580, 0x000000ff, 0x04000009, 0x83200400, - 0x0010bdc7, 0x50024800, 0x59240a00, 0x84040d16, - 0x48064a00, 0x0201f000, 0x00105b76, 0x42024800, - 0x0010ccd1, 0x0201f800, 0x0010bd9f, 0x59240200, - 0x8c000500, 0x04000004, 0x59240200, 0x84000516, - 0x48024a00, 0x83264c00, 0x0000000b, 0x8058b040, - 0x040207f7, 0x850e1d04, 0x0201f000, 0x00105b76, - 0x592c1408, 0x480bc857, 0x0201f800, 0x00109ac1, - 0x411e6000, 0x04020004, 0x4803c856, 0x0201f000, - 0x00105b7d, 0x59300c07, 0x82040580, 0x00000004, - 0x04000004, 0x4803c856, 0x0201f000, 0x00105b7d, - 0x592c0208, 0x8c000506, 0x04000010, 0x0201f800, - 0x00106c3c, 0x4df00000, 0x0201f800, 0x00106b26, - 0x0201f800, 0x0010fe38, 0x80c40040, 0x5c03e000, - 0x02000800, 0x00106c29, 0x0201f800, 0x00107cbe, - 0x0201f000, 0x00105b76, 0x592e380a, 0x591c1415, - 0x8c081516, 0x02000000, 0x00105b7d, 0x59300009, - 0x800001c0, 0x02020800, 0x0010032e, 0x84081554, - 0x480a3c15, 0x4a026403, 0x0000003a, 0x592c040c, - 0x80000540, 0x04000007, 0x4a026403, 0x0000003b, - 0x592c020d, 0x4802641b, 0x592c040d, 0x4802621b, - 0x4a026203, 0x00000001, 0x42000800, 0x80000040, - 0x0201f800, 0x00105b87, 0x04000004, 0x492e6009, - 0x0201f000, 0x00020b3e, 0x0201f800, 0x00020b3e, - 0x0201f000, 0x00105b76, 0x83200d80, 0x000000ff, - 0x04000013, 0x42000000, 0x0010ccd0, 0x50000000, - 0x81200480, 0x02021000, 0x0002086a, 0x83200400, - 0x0010bdc7, 0x50024800, 0x59240200, 0x8c000500, - 0x02000000, 0x0002086a, 0x59240206, 0x84000510, - 0x48024a06, 0x0201f000, 0x00105b76, 0x42024800, - 0x0010ccd1, 0x0201f800, 0x0010bd9f, 0x59240200, - 0x8c000500, 0x04000004, 0x59240206, 0x84000510, - 0x48024a06, 0x83264c00, 0x0000000b, 0x8058b040, - 0x040207f7, 0x0201f000, 0x00105b76, 0x592c1208, - 0x8c081500, 0x02020000, 0x00105b76, 0x592e8a07, - 0x592e600a, 0x0201f800, 0x00109acc, 0x04020004, - 0x4803c856, 0x0201f000, 0x00105b7d, 0x59300c07, + 0x00000004, 0x1c01f000, 0x1c01f000, 0x40100000, + 0x0c01f001, 0x001054ed, 0x001054f0, 0x001054f0, + 0x001054f1, 0x001054f4, 0x001054f7, 0x001054f7, + 0x001054f7, 0x4a000801, 0x00000002, 0x1c01f000, + 0x1c01f000, 0x4a000801, 0x00000007, 0x1c01f000, + 0x4a000801, 0x00000004, 0x0401f03a, 0x4a000801, + 0x00000008, 0x1c01f000, 0x40100000, 0x0c01f001, + 0x00105504, 0x00105507, 0x0010550a, 0x0010550a, + 0x0010550b, 0x0010550e, 0x0010550e, 0x0010550e, + 0x4a000801, 0x00000002, 0x1c01f000, 0x4a000801, + 0x00000003, 0x1c01f000, 0x1c01f000, 0x4a000801, + 0x00000004, 0x0401f023, 0x4a000801, 0x00000008, + 0x1c01f000, 0x40100000, 0x0c01f001, 0x0010551b, + 0x0010551b, 0x0010551e, 0x0010551f, 0x00105522, + 0x0010551e, 0x00105525, 0x0010551e, 0x4a000801, + 0x00000005, 0x0401f00f, 0x1c01f000, 0x4a000801, + 0x00000007, 0x1c01f000, 0x4a000801, 0x00000004, + 0x1c01f000, 0x4a000801, 0x00000008, 0x1c01f000, + 0x4a000801, 0x00000009, 0x1c01f000, 0x1c01f000, + 0x42000000, 0x0010ce63, 0x0201f000, 0x0010bfb3, + 0x42000000, 0x0010ce60, 0x0201f000, 0x0010bfb3, + 0x42000000, 0x0010ce62, 0x0201f000, 0x0010bfb3, + 0x42000000, 0x0010ce61, 0x0201f000, 0x0010bfb3, + 0x42000800, 0x0010cafb, 0x58040001, 0x48000800, + 0x4a000801, 0x00000005, 0x4a000802, 0x00000008, + 0x1c01f000, 0x42000800, 0x0010cafb, 0x58040001, + 0x48000800, 0x4a000801, 0x00000001, 0x4a000802, + 0x0000000a, 0x1c01f000, 0x42000800, 0x0010cafb, + 0x58040001, 0x48000800, 0x4a000801, 0x00000006, + 0x4a000802, 0x00000009, 0x1c01f000, 0x42000800, + 0x0010cafb, 0x4a000801, 0x0000000a, 0x4a000800, + 0x0000000a, 0x1c01f000, 0x496fc857, 0x4813c857, + 0x40100000, 0x0c01f001, 0x00105578, 0x00105578, + 0x00105578, 0x00105578, 0x0010556a, 0x00105572, + 0x00105576, 0x00105578, 0x59a8021b, 0x8c000506, + 0x04000003, 0x8c000502, 0x0400000a, 0x0401f80a, + 0x040207c0, 0x0401f007, 0x0401f807, 0x04000005, + 0x0401ffc0, 0x0401f7c3, 0x0401f803, 0x040207c1, + 0x1c01f000, 0x496fc857, 0x416c0000, 0x82000c80, + 0x00000008, 0x02021800, 0x0010032e, 0x0c01f001, + 0x00105588, 0x0010558a, 0x0010558a, 0x0010558a, + 0x00105588, 0x00105588, 0x00105588, 0x0010558a, + 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, + 0x1c01f000, 0x4202e000, 0x00000000, 0x497b3004, + 0x4a03b004, 0x60000001, 0x59d80005, 0x4a03b004, + 0x90000001, 0x4a03a804, 0x60000001, 0x59d40005, + 0x4a03a804, 0x90000001, 0x0201f000, 0x00105d17, + 0x4a03c825, 0x00000004, 0x4a03c827, 0x00000004, + 0x599c0409, 0x80000d40, 0x04000020, 0x599c0407, + 0x80000540, 0x04000007, 0x800000cc, 0x599c100b, + 0x80080400, 0x4803b000, 0x497bb002, 0x59d80001, + 0x599c000b, 0x4803b000, 0x599c000c, 0x4803b001, + 0x599c0407, 0x80000540, 0x04020002, 0x497bb002, + 0x599c0c09, 0x82040540, 0x00400000, 0x4803b003, + 0x4a03b009, 0x00000005, 0x4a03b004, 0x10000001, + 0x59e00803, 0x82040d00, 0xfffffeff, 0x82040d40, + 0x00008000, 0x4807c003, 0x599c040a, 0x80000540, + 0x04000020, 0x599c0408, 0x80000540, 0x04000007, + 0x800000cc, 0x599c100f, 0x80080400, 0x4803a800, + 0x497ba802, 0x59d40001, 0x599c000f, 0x4803a800, + 0x599c0010, 0x4803a801, 0x599c0408, 0x80000540, + 0x04020002, 0x497ba802, 0x599c0c0a, 0x82040540, + 0x00400000, 0x4803a803, 0x4a03a809, 0x00000005, + 0x4a03a804, 0x10000001, 0x59e00803, 0x82040d00, + 0xfffffbff, 0x82040d40, 0x00008000, 0x4807c003, + 0x800409c0, 0x04000007, 0x4202e000, 0x00000001, + 0x0200b800, 0x00020874, 0x0200f000, 0x00020889, + 0x1c01f000, 0x0201f800, 0x0010032e, 0x1c01f000, + 0x0401f852, 0x5c03e000, 0x0201f000, 0x000206be, + 0x0201f800, 0x00020705, 0x0401f7fb, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105652, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x000206fc, 0x00105642, 0x00105642, + 0x00105652, 0x00105652, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x000206fc, 0x492fc857, 0x42000000, + 0x0010cf1e, 0x0201f800, 0x0010bfb3, 0x42000000, + 0x00000400, 0x0401f019, 0x492fc857, 0x42000000, + 0x0010cf1d, 0x0201f800, 0x0010bfb3, 0x42000000, + 0x00001000, 0x0401f011, 0x492fc857, 0x42000000, + 0x0010cf1c, 0x0201f800, 0x0010bfb3, 0x42000000, + 0x00002000, 0x0401f009, 0x492fc857, 0x42000000, + 0x0010cf1f, 0x0201f800, 0x0010bfb3, 0x42000000, + 0x00000800, 0x0401f001, 0x4803c857, 0x592c0c05, + 0x82040d00, 0xffff80ff, 0x80040540, 0x59980803, + 0x800409c0, 0x04000002, 0x8400051e, 0x48025c05, + 0x0201f800, 0x000203ef, 0x83700580, 0x00000003, + 0x4202e000, 0x00000001, 0x04000002, 0x1c01f000, + 0x599a5801, 0x812e59c0, 0x040207dc, 0x0201f800, + 0x0010032e, 0x492fc857, 0x80140110, 0x80000040, + 0x04000039, 0x040017cd, 0x4a033006, 0x001056b5, + 0x0201f000, 0x000206d1, 0x492fc857, 0x80140110, + 0x040007c6, 0x80000040, 0x0400004a, 0x4a033006, + 0x001056d0, 0x0201f000, 0x000206d1, 0x492fc857, + 0x0201f800, 0x0010c0bb, 0x02020000, 0x000206e1, + 0x492fc856, 0x83440400, 0x0010c280, 0x50000000, + 0x80026d40, 0x0400000c, 0x592e4411, 0x81224110, + 0x59340013, 0x80000130, 0x81200580, 0x04020006, + 0x4937c857, 0x59340200, 0x8c00050e, 0x02020000, + 0x000206e1, 0x42028000, 0x00000028, 0x41780800, + 0x417a6000, 0x0201f800, 0x00104e1a, 0x0201f800, + 0x00109a5c, 0x0201f000, 0x000203ef, 0x82000500, + 0x0f000000, 0x8000012a, 0x592c0c0b, 0x82040d00, + 0x0000ff87, 0x80040540, 0x48025c0b, 0x0201f000, + 0x000206f7, 0x592c0a0b, 0x8c040d02, 0x04020015, + 0x492fc857, 0x8d0e1d0e, 0x0402000f, 0x592c0208, + 0x80000540, 0x04000005, 0x0201f800, 0x00104358, + 0x04020004, 0x1c01f000, 0x42000000, 0x00000000, + 0x592c0a07, 0x48065c07, 0x48025a07, 0x0201f000, + 0x000203ef, 0x42000000, 0x00000028, 0x0401f7f9, + 0x42000800, 0x00000009, 0x0201f000, 0x00106c58, + 0x492fc857, 0x592c0409, 0x80000540, 0x04020787, + 0x8d0e1d0e, 0x04020009, 0x592c0208, 0x80000540, + 0x04000782, 0x497a5a07, 0x0201f800, 0x001043b8, + 0x04020004, 0x1c01f000, 0x42000000, 0x00000028, + 0x48025a07, 0x0201f000, 0x000203ef, 0x592e8a07, + 0x592c0407, 0x4947c857, 0x4803c857, 0x82000500, + 0x000000ff, 0x4200b800, 0x00000001, 0x82000d80, + 0x00000001, 0x04000015, 0x417a8800, 0x4200b800, + 0x000007f0, 0x82000d80, 0x00000002, 0x0400000f, + 0x80000540, 0x02020000, 0x000203ef, 0x592e8a07, + 0x0201f800, 0x0002034c, 0x02020000, 0x000203ef, + 0x592e9009, 0x592e980a, 0x0201f800, 0x001047dc, + 0x0201f000, 0x000203ef, 0x850e1d00, 0x0201f800, + 0x0002034c, 0x02000800, 0x0010490b, 0x81468800, + 0x805cb840, 0x040207fa, 0x0201f000, 0x000203ef, + 0x592c0a09, 0x4807c857, 0x592e4411, 0x81224110, + 0x82040580, 0x0000000e, 0x04000096, 0x82040580, + 0x0000002a, 0x04000031, 0x82040580, 0x0000000f, + 0x02000000, 0x00105d2d, 0x82040580, 0x0000002e, + 0x02000000, 0x00105d2d, 0x4c040000, 0x0201f800, + 0x00105c82, 0x5c000800, 0x02020000, 0x00105d34, + 0x82040580, 0x00000046, 0x040000a7, 0x82040580, + 0x00000045, 0x04000039, 0x82040580, 0x00000049, + 0x02000000, 0x00105d2d, 0x82040580, 0x00000029, + 0x02020000, 0x00105d34, 0x592e8a07, 0x42026800, + 0x0010e23c, 0x83440580, 0x0000ffff, 0x04000008, + 0x0201f800, 0x00104a7c, 0x02020000, 0x00105d2d, + 0x59340200, 0x84000518, 0x48026a00, 0x592e600a, + 0x4933c857, 0x83300580, 0xffffffff, 0x04020090, + 0x0201f000, 0x00105d2d, 0x83200580, 0x000000ff, + 0x04000009, 0x83200400, 0x0010c10d, 0x50024800, + 0x59240a00, 0x84040d16, 0x48064a00, 0x0201f000, + 0x00105d2d, 0x42024800, 0x0010cfd1, 0x0201f800, + 0x0010c0ca, 0x59240200, 0x8c000500, 0x04000004, + 0x59240200, 0x84000516, 0x48024a00, 0x83264c00, + 0x0000000b, 0x8058b040, 0x040207f7, 0x850e1d04, + 0x0201f000, 0x00105d2d, 0x592c1408, 0x480bc857, + 0x0201f800, 0x00109cf9, 0x411e6000, 0x04020004, + 0x4803c856, 0x0201f000, 0x00105d34, 0x59300c07, 0x82040580, 0x00000004, 0x04000004, 0x4803c856, - 0x0201f000, 0x00105b7d, 0x59300a03, 0x82040580, - 0x00000007, 0x04000004, 0x4803c856, 0x0201f000, - 0x00105b7d, 0x59300c03, 0x82040580, 0x00000001, - 0x0400001f, 0x82040580, 0x00000002, 0x04000014, - 0x82040580, 0x00000008, 0x04000016, 0x82040580, - 0x0000000a, 0x04000007, 0x82040580, 0x0000000c, - 0x0402001c, 0x42000800, 0x00000009, 0x0401f017, - 0x5932680a, 0x0201f800, 0x00104936, 0x04020015, - 0x42000800, 0x00000005, 0x0401f010, 0x417a7800, - 0x0201f800, 0x0010fc72, 0x4a026407, 0x00000001, - 0x42000800, 0x00000003, 0x0401f008, 0x417a7800, - 0x0201f800, 0x0010fc72, 0x4a026407, 0x00000001, - 0x42000800, 0x0000000b, 0x0201f800, 0x001044f1, - 0x4a026203, 0x00000001, 0x0201f800, 0x00105b87, - 0x04000004, 0x492e6009, 0x0201f000, 0x00106b17, - 0x0201f800, 0x00106b17, 0x0201f000, 0x00105b76, - 0x59300415, 0x8c000518, 0x02020000, 0x0010b0c0, - 0x0401f0b8, 0x40000800, 0x58040000, 0x80000540, - 0x040207fd, 0x492c0800, 0x1c01f000, 0x492fc857, - 0x59300c07, 0x82040580, 0x00000006, 0x040200a8, - 0x59340400, 0x82000580, 0x00000606, 0x04020005, - 0x59340200, 0x8c00051a, 0x02000000, 0x00020762, - 0x59340200, 0x8c00050e, 0x0400009d, 0x59300203, - 0x42027800, 0x00000001, 0x82000580, 0x00000007, - 0x02020000, 0x00020762, 0x4a026203, 0x00000002, - 0x0201f000, 0x00020762, 0x42028000, 0x00000002, - 0x4a026006, 0x00000014, 0x4d2c0000, 0x0201f800, - 0x0010acac, 0x5c025800, 0x59300c07, 0x4807c857, - 0x82040580, 0x00000007, 0x0402006c, 0x492fc857, - 0x4a025a07, 0x00000001, 0x0201f000, 0x000203ef, - 0x83300580, 0xffffffff, 0x04020064, 0x592c240b, - 0x492fc857, 0x4813c857, 0x8c10251c, 0x0402001a, - 0x8c10251a, 0x04000003, 0x8c10250a, 0x04000079, - 0x59340a00, 0x8c040d0e, 0x04000003, 0x8c10251e, - 0x04000074, 0x0201f800, 0x00020b7b, 0x04000082, - 0x592c240b, 0x59243a00, 0x592c020d, 0x48026202, - 0x4936600a, 0x4926601c, 0x4932580a, 0x4a026407, - 0x00000006, 0x4a026203, 0x00000007, 0x0201f000, - 0x0002075b, 0x592c0a0d, 0x4c040000, 0x0201f800, - 0x00104c81, 0x5c000800, 0x04020084, 0x58080000, - 0x49781000, 0x802041c0, 0x04000006, 0x48004000, - 0x80000540, 0x04020007, 0x48226810, 0x0401f005, - 0x4802680f, 0x80000540, 0x04020002, 0x497a6810, - 0x4d2c0000, 0x400a5800, 0x4a025a07, 0x00000002, - 0x0201f800, 0x000203ef, 0x5c025800, 0x0401f7c0, - 0x8c10251c, 0x02020000, 0x00020747, 0x0401f022, - 0x0201f800, 0x0010497a, 0x02000000, 0x00020739, - 0x42000000, 0x0010ccd0, 0x50000000, 0x81200480, - 0x04021037, 0x8c10251c, 0x04000017, 0x592c0207, - 0x82000580, 0x0000ffff, 0x04020013, 0x592e600a, - 0x83300580, 0xffffffff, 0x040007a9, 0x0201f800, - 0x0010a09b, 0x04020011, 0x592c220d, 0x59300202, - 0x80100580, 0x0402000d, 0x59300009, 0x800001c0, - 0x04020005, 0x59300203, 0x82000580, 0x00000007, - 0x0400078e, 0x492fc857, 0x4a025a07, 0x00000029, + 0x0201f000, 0x00105d34, 0x592c0208, 0x8c000506, + 0x04000010, 0x0201f800, 0x00106e41, 0x4df00000, + 0x0201f800, 0x00106d2b, 0x0201f800, 0x00110148, + 0x80c40040, 0x5c03e000, 0x02000800, 0x00106e2e, + 0x0201f800, 0x00107eb4, 0x0201f000, 0x00105d2d, + 0x592e380a, 0x591c1415, 0x8c081516, 0x02000000, + 0x00105d34, 0x59300009, 0x800001c0, 0x02020800, + 0x0010032e, 0x84081554, 0x480a3c15, 0x4a026403, + 0x0000003a, 0x592c040c, 0x80000540, 0x04000007, + 0x4a026403, 0x0000003b, 0x592c020d, 0x4802641b, + 0x592c040d, 0x4802621b, 0x4a026203, 0x00000001, + 0x42000800, 0x80000040, 0x0201f800, 0x00105d3e, + 0x04000004, 0x492e6009, 0x0201f000, 0x00020b3e, + 0x0201f800, 0x00020b3e, 0x0201f000, 0x00105d2d, + 0x83200d80, 0x000000ff, 0x04000013, 0x42000000, + 0x0010cfd0, 0x50000000, 0x81200480, 0x02021000, + 0x0002086a, 0x83200400, 0x0010c10d, 0x50024800, + 0x59240200, 0x8c000500, 0x02000000, 0x0002086a, + 0x59240206, 0x84000510, 0x48024a06, 0x0201f000, + 0x00105d2d, 0x42024800, 0x0010cfd1, 0x0201f800, + 0x0010c0ca, 0x59240200, 0x8c000500, 0x04000004, + 0x59240206, 0x84000510, 0x48024a06, 0x83264c00, + 0x0000000b, 0x8058b040, 0x040207f7, 0x0201f000, + 0x00105d2d, 0x592c1208, 0x8c081500, 0x02020000, + 0x00105d2d, 0x592e8a07, 0x592e600a, 0x0201f800, + 0x00109d04, 0x04020004, 0x4803c856, 0x0201f000, + 0x00105d34, 0x59300c07, 0x82040580, 0x00000004, + 0x04000004, 0x4803c856, 0x0201f000, 0x00105d34, + 0x59300a03, 0x82040580, 0x00000007, 0x04000004, + 0x4803c856, 0x0201f000, 0x00105d34, 0x59300c03, + 0x82040580, 0x00000001, 0x0400001f, 0x82040580, + 0x00000002, 0x04000014, 0x82040580, 0x00000008, + 0x04000016, 0x82040580, 0x0000000a, 0x04000007, + 0x82040580, 0x0000000c, 0x04020027, 0x42000800, + 0x00000009, 0x0401f022, 0x5932680a, 0x0201f800, + 0x00104a38, 0x04020020, 0x42000800, 0x00000005, + 0x0401f01b, 0x417a7800, 0x0201f800, 0x0010ff80, + 0x4a026407, 0x00000001, 0x42000800, 0x00000003, + 0x0401f013, 0x83340580, 0x0010e23c, 0x04020009, + 0x5930000a, 0x82000580, 0x0010e23c, 0x02020000, + 0x00105d34, 0x4a026407, 0x00000001, 0x0401f00a, + 0x417a7800, 0x0201f800, 0x0010ff80, 0x4a026407, + 0x00000001, 0x42000800, 0x0000000b, 0x0201f800, + 0x001045ea, 0x4a026203, 0x00000001, 0x0201f800, + 0x00105d3e, 0x04000004, 0x492e6009, 0x0201f000, + 0x00106d1c, 0x0201f800, 0x00106d1c, 0x0201f000, + 0x00105d2d, 0x59300415, 0x8c000518, 0x02020000, + 0x0010b3d7, 0x0401f0b8, 0x40000800, 0x58040000, + 0x80000540, 0x040207fd, 0x492c0800, 0x1c01f000, + 0x492fc857, 0x59300c07, 0x82040580, 0x00000006, + 0x040200a8, 0x59340400, 0x82000580, 0x00000606, + 0x04020005, 0x59340200, 0x8c00051a, 0x02000000, + 0x00020762, 0x59340200, 0x8c00050e, 0x0400009d, + 0x59300203, 0x42027800, 0x00000001, 0x82000580, + 0x00000007, 0x02020000, 0x00020762, 0x4a026203, + 0x00000002, 0x0201f000, 0x00020762, 0x42028000, + 0x00000002, 0x4a026006, 0x00000014, 0x4d2c0000, + 0x0201f800, 0x0010afbb, 0x5c025800, 0x59300c07, + 0x4807c857, 0x82040580, 0x00000007, 0x0402006c, + 0x492fc857, 0x4a025a07, 0x00000001, 0x0201f000, + 0x000203ef, 0x83300580, 0xffffffff, 0x04020064, + 0x592c240b, 0x492fc857, 0x4813c857, 0x8c10251c, + 0x0402001a, 0x8c10251a, 0x04000003, 0x8c10250a, + 0x04000079, 0x59340a00, 0x8c040d0e, 0x04000003, + 0x8c10251e, 0x04000074, 0x0201f800, 0x00020b7b, + 0x04000082, 0x592c240b, 0x59243a00, 0x592c020d, + 0x48026202, 0x4936600a, 0x4926601c, 0x4932580a, + 0x4a026407, 0x00000006, 0x4a026203, 0x00000007, + 0x0201f000, 0x0002075b, 0x592c0a0d, 0x4c040000, + 0x0201f800, 0x00104d86, 0x5c000800, 0x04020084, + 0x58080000, 0x49781000, 0x802041c0, 0x04000006, + 0x48004000, 0x80000540, 0x04020007, 0x48226810, + 0x0401f005, 0x4802680f, 0x80000540, 0x04020002, + 0x497a6810, 0x4d2c0000, 0x400a5800, 0x4a025a07, + 0x00000002, 0x0201f800, 0x000203ef, 0x5c025800, + 0x0401f7c0, 0x8c10251c, 0x02020000, 0x00020747, + 0x0401f022, 0x0201f800, 0x00104a7c, 0x02000000, + 0x00020739, 0x42000000, 0x0010cfd0, 0x50000000, + 0x81200480, 0x04021037, 0x8c10251c, 0x04000017, + 0x592c0207, 0x82000580, 0x0000ffff, 0x04020013, + 0x592e600a, 0x83300580, 0xffffffff, 0x040007a9, + 0x0201f800, 0x0010a2d8, 0x04020011, 0x592c220d, + 0x59300202, 0x80100580, 0x0402000d, 0x59300009, + 0x800001c0, 0x04020005, 0x59300203, 0x82000580, + 0x00000007, 0x0400078e, 0x492fc857, 0x4a025a07, + 0x00000029, 0x0201f000, 0x000203ef, 0x492fc857, + 0x4a025a07, 0x00000008, 0x0201f000, 0x000203ef, + 0x4803c857, 0x8c000514, 0x04000008, 0x42000000, + 0x0010cf0d, 0x0201f800, 0x0010bfb3, 0x492fc857, + 0x492e6009, 0x1c01f000, 0x492fc857, 0x4a025a07, + 0x00000045, 0x0201f000, 0x000203ef, 0x492fc857, + 0x4a025a07, 0x0000002a, 0x0201f000, 0x000203ef, + 0x492fc857, 0x4a025a07, 0x00000028, 0x0201f000, + 0x000203ef, 0x492fc857, 0x4a025a07, 0x00000006, 0x0201f000, 0x000203ef, 0x492fc857, 0x4a025a07, - 0x00000008, 0x0201f000, 0x000203ef, 0x4803c857, - 0x8c000514, 0x04000008, 0x42000000, 0x0010cc0d, - 0x0201f800, 0x0010bc88, 0x492fc857, 0x492e6009, - 0x1c01f000, 0x492fc857, 0x4a025a07, 0x00000045, - 0x0201f000, 0x000203ef, 0x492fc857, 0x4a025a07, - 0x0000002a, 0x0201f000, 0x000203ef, 0x492fc857, - 0x4a025a07, 0x00000028, 0x0201f000, 0x000203ef, - 0x492fc857, 0x4a025a07, 0x00000006, 0x0201f000, - 0x000203ef, 0x492fc857, 0x4a025a07, 0x0000000e, - 0x0201f000, 0x000203ef, 0x82040580, 0x00000007, - 0x040207d6, 0x4a025a07, 0x00000002, 0x0201f000, - 0x000203ef, 0x592c0407, 0x800000c2, 0x800008c4, - 0x80040400, 0x48025804, 0x59340010, 0x492e6810, - 0x492fc857, 0x80000d40, 0x04000003, 0x492c0800, - 0x1c01f000, 0x59340203, 0x492e680f, 0x492fc857, - 0x4803c857, 0x80000540, 0x04020003, 0x4a026a03, - 0x00000001, 0x1c01f000, 0x59a8000d, 0x81640480, - 0x0402174f, 0x42026000, 0x00111264, 0x5930000a, - 0x81340580, 0x04020004, 0x59300202, 0x80040580, - 0x0400073a, 0x83326400, 0x0000002c, 0x41580000, - 0x81300480, 0x040017f6, 0x0401f741, 0x492fc857, - 0x592c040b, 0x82000500, 0x00000003, 0x04000024, - 0x0201f800, 0x00107cfe, 0x04000025, 0x592c0205, - 0x492e6009, 0x42024800, 0x0010ccd1, 0x4926601c, - 0x82000500, 0x000000ff, 0x82000580, 0x00000045, - 0x0400000f, 0x592c000c, 0x59243805, 0x0201f800, - 0x00105f68, 0x02000800, 0x0002034c, 0x04020018, - 0x42027000, 0x00000041, 0x4936600a, 0x4a026407, - 0x00000001, 0x0201f000, 0x00020bc1, 0x59300016, - 0x8400055e, 0x48026016, 0x42026800, 0x0010c87b, - 0x42027000, 0x00000040, 0x0401f7f4, 0x4a025a07, - 0x00000101, 0x0201f000, 0x000203ef, 0x4a025a07, - 0x0000002c, 0x0201f000, 0x000203ef, 0x4a025a07, - 0x00000028, 0x0201f800, 0x000203ef, 0x0201f000, - 0x00020b9d, 0x492fc857, 0x0201f800, 0x001066ab, - 0x0400000b, 0x592c0205, 0x80000110, 0x80000040, - 0x04020501, 0x592c0c07, 0x800409c0, 0x04000009, - 0x42000000, 0x00000102, 0x0401f003, 0x42000000, - 0x00000104, 0x48025a07, 0x0201f000, 0x000203ef, - 0x592c0c08, 0x800409c0, 0x04000020, 0x82040480, - 0x00000005, 0x0402101d, 0x4c040000, 0x80040800, - 0x0201f800, 0x001066d0, 0x5c001000, 0x04020014, - 0x832c0400, 0x00000009, 0x4000a000, 0x0201f800, - 0x001066f9, 0x0402000e, 0x592c1208, 0x58c80c0b, - 0x84040d00, 0x84040d02, 0x8c081500, 0x04000002, - 0x84040d5e, 0x4805940b, 0x42000000, 0x00000000, - 0x48025a07, 0x0201f000, 0x000203ef, 0x42000000, - 0x00000103, 0x0401f7fb, 0x42000000, 0x00000102, - 0x0401f7f8, 0x492fc857, 0x592e7c07, 0x833c0500, - 0xfffffffe, 0x0402004a, 0x592c4008, 0x42026000, - 0x00111264, 0x41581800, 0x400c0000, 0x81300480, - 0x04021029, 0x59300203, 0x82000580, 0x00000000, - 0x04000007, 0x59300009, 0x80000d40, 0x04000004, - 0x58040006, 0x80200580, 0x04000004, 0x83326400, - 0x0000002c, 0x0401f7f1, 0x58040205, 0x82000500, - 0x000000ff, 0x82000d80, 0x00000053, 0x0400000d, - 0x82000d80, 0x00000048, 0x0400000a, 0x82000d80, - 0x00000018, 0x04000007, 0x82000d80, 0x00000029, - 0x04000004, 0x82000580, 0x00000068, 0x040207ec, - 0x4d2c0000, 0x0201f800, 0x001091f1, 0x5c025800, + 0x0000000e, 0x0201f000, 0x000203ef, 0x82040580, + 0x00000007, 0x040207d6, 0x4a025a07, 0x00000002, + 0x0201f000, 0x000203ef, 0x592c0407, 0x800000c2, + 0x800008c4, 0x80040400, 0x48025804, 0x59340010, + 0x492e6810, 0x492fc857, 0x80000d40, 0x04000003, + 0x492c0800, 0x1c01f000, 0x59340203, 0x492e680f, + 0x492fc857, 0x4803c857, 0x80000540, 0x04020003, + 0x4a026a03, 0x00000001, 0x1c01f000, 0x59a8000d, + 0x81640480, 0x0402174f, 0x42026000, 0x00111584, + 0x59300407, 0x82000580, 0x00000006, 0x04020007, + 0x5930000a, 0x81340580, 0x04020004, 0x59300202, + 0x80040580, 0x04000736, 0x83326400, 0x0000002c, + 0x41580000, 0x81300480, 0x040017f2, 0x0401f73d, + 0x492fc857, 0x592c040b, 0x82000500, 0x00000003, + 0x04000024, 0x0201f800, 0x00107ef8, 0x04000025, + 0x592c0205, 0x492e6009, 0x42024800, 0x0010cfd1, + 0x4926601c, 0x82000500, 0x000000ff, 0x82000580, + 0x00000045, 0x0400000f, 0x592c000c, 0x59243805, + 0x0201f800, 0x00106134, 0x02000800, 0x0002034c, + 0x04020018, 0x42027000, 0x00000041, 0x4936600a, + 0x4a026407, 0x00000001, 0x0201f000, 0x00020bc1, + 0x59300016, 0x8400055e, 0x48026016, 0x42026800, + 0x0010cb7b, 0x42027000, 0x00000040, 0x0401f7f4, + 0x4a025a07, 0x00000101, 0x0201f000, 0x000203ef, + 0x4a025a07, 0x0000002c, 0x0201f000, 0x000203ef, + 0x4a025a07, 0x00000028, 0x0201f800, 0x000203ef, + 0x0201f000, 0x00020b9d, 0x492fc857, 0x0201f800, + 0x001068b0, 0x0400000b, 0x592c0205, 0x80000110, + 0x80000040, 0x040204ed, 0x592c0c07, 0x800409c0, + 0x04000009, 0x42000000, 0x00000102, 0x0401f003, + 0x42000000, 0x00000104, 0x48025a07, 0x0201f000, + 0x000203ef, 0x592c0c08, 0x800409c0, 0x04000020, + 0x82040480, 0x00000005, 0x0402101d, 0x4c040000, + 0x80040800, 0x0201f800, 0x001068d5, 0x5c001000, + 0x04020014, 0x832c0400, 0x00000009, 0x4000a000, + 0x0201f800, 0x001068fe, 0x0402000e, 0x592c1208, + 0x58c80c0b, 0x84040d00, 0x84040d02, 0x8c081500, + 0x04000002, 0x84040d5e, 0x4805940b, 0x42000000, + 0x00000000, 0x48025a07, 0x0201f000, 0x000203ef, + 0x42000000, 0x00000103, 0x0401f7fb, 0x42000000, + 0x00000102, 0x0401f7f8, 0x492fc857, 0x592e7c07, + 0x833c0500, 0xfffffffe, 0x0402004d, 0x592c4008, + 0x42026000, 0x00111584, 0x41581800, 0x400c0000, + 0x81300480, 0x0402102c, 0x59300203, 0x82000580, + 0x00000000, 0x04000007, 0x59300009, 0x80000d40, + 0x04000004, 0x58040006, 0x80200580, 0x04000004, + 0x83326400, 0x0000002c, 0x0401f7f1, 0x58040205, + 0x82000500, 0x000000ff, 0x82000d80, 0x00000053, + 0x04000010, 0x82000d80, 0x00000048, 0x0400000d, + 0x82000d80, 0x00000018, 0x0400000a, 0x82000d80, + 0x00000029, 0x04000007, 0x82000d80, 0x00000014, + 0x04000004, 0x82000580, 0x00000068, 0x040207e9, + 0x4d2c0000, 0x0201f800, 0x00109425, 0x5c025800, 0x0400001f, 0x4a025a07, 0x00000000, 0x0201f000, 0x000203ef, 0x592e8a07, 0x83440480, 0x000007f0, - 0x04021017, 0x83440400, 0x0010bf80, 0x50000000, + 0x04021017, 0x83440400, 0x0010c280, 0x50000000, 0x80026d40, 0x04000012, 0x4d2c0000, 0x0201f800, - 0x001047a0, 0x0400000d, 0x42028000, 0x00000005, - 0x592c0a09, 0x417a6000, 0x0201f800, 0x00104cf5, - 0x0201f800, 0x0010982a, 0x0201f800, 0x000203ef, + 0x001048a0, 0x0400000d, 0x42028000, 0x00000005, + 0x592c0a09, 0x417a6000, 0x0201f800, 0x00104e1a, + 0x0201f800, 0x00109a62, 0x0201f800, 0x000203ef, 0x5c025800, 0x0401f7e4, 0x5c025800, 0x4a025a07, 0x00000031, 0x0201f000, 0x000203ef, 0x492fc857, 0x4d2c0000, 0x0201f800, 0x00100583, 0x04000017, 0x492fc857, 0x412f4000, 0x0201f800, 0x00100583, 0x0400000f, 0x492fc857, 0x412dd800, 0x0201f800, - 0x001039b6, 0x0201f800, 0x001039c0, 0x49a1d80a, + 0x00103aa6, 0x0201f800, 0x00103ab0, 0x49a1d80a, 0x5c025800, 0x492dd809, 0x48ef4006, 0x0201f800, - 0x0010215d, 0x0201f000, 0x0010217c, 0x41a25800, + 0x0010221c, 0x0201f000, 0x0010223b, 0x41a25800, 0x0201f800, 0x00100594, 0x5c025800, 0x4a025a07, 0x00004005, 0x4a025c07, 0x00000002, 0x0201f000, 0x000203ef, 0x4807c857, 0x485fc857, 0x4200b800, @@ -20234,436 +20368,469 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00100323, 0x4203e000, 0x50000000, 0x4200b800, 0x00008003, 0x0201f000, 0x00100333, 0x4803c856, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4d040000, - 0x836c0580, 0x00000000, 0x040000b8, 0x592c0208, + 0x836c0580, 0x00000000, 0x040000ff, 0x592c0208, 0x8200cd00, 0x000000ff, 0x592c0408, 0x8200c500, - 0x000000ff, 0x040000b7, 0x42000000, 0x0010ccd0, - 0x50000000, 0x80600480, 0x040210b2, 0x832c7c00, - 0x00000009, 0x42024000, 0x00000001, 0x42020800, - 0x00000001, 0x4200b800, 0xffffffff, 0x59a80078, - 0x8c00053e, 0x04000004, 0x83200580, 0x00000021, - 0x0401f003, 0x83200580, 0x00000061, 0x04020003, - 0x4200b800, 0x7fffffff, 0x503c0000, 0x805cbd00, - 0x04020004, 0x83224400, 0x00000020, 0x0401f011, - 0x805cb902, 0x0402100a, 0x83200400, 0x0010bdc7, - 0x50024800, 0x82640580, 0x00000000, 0x0400001e, - 0x8c64cd06, 0x04020047, 0x0401f08e, 0x81060800, - 0x81224000, 0x83040480, 0x00000021, 0x040017f1, - 0x803c7800, 0x59a80078, 0x8c00053e, 0x04000004, - 0x83200480, 0x00000041, 0x0401f003, 0x83200480, - 0x00000081, 0x040017d2, 0x59a80078, 0x8c00053e, - 0x04000004, 0x42024000, 0x0000003f, 0x0401f003, - 0x42024000, 0x0000007f, 0x8060c1c0, 0x04020075, - 0x0401f051, 0x59240a00, 0x82040d00, 0x00000003, - 0x82040d80, 0x00000003, 0x0400006e, 0x59240c00, - 0x8c040d0a, 0x04020004, 0x8d0e1d20, 0x04000069, - 0x0401f003, 0x8c040d08, 0x04000066, 0x4d3c0000, - 0x4d300000, 0x42027800, 0x00005002, 0x417a6000, - 0x0201f800, 0x00101fa9, 0x5c026000, 0x5c027800, - 0x59240206, 0x82000500, 0xfffffcff, 0x48024a06, - 0x4a024a00, 0x00000005, 0x0201f800, 0x00104fc6, - 0x04020004, 0x0201f800, 0x00101f2a, 0x0400004e, - 0x81060800, 0x81224000, 0x8060c040, 0x040207b5, - 0x0201f800, 0x00104fc6, 0x04020027, 0x0401f039, - 0x59240a00, 0x8c040d00, 0x04000046, 0x82040d00, - 0xfffffffc, 0x84040d44, 0x48064a00, 0x8c64cd02, - 0x04020017, 0x59240c08, 0x0201f800, 0x001015d1, - 0x4c5c0000, 0x4d3c0000, 0x42027800, 0x00005002, - 0x4d300000, 0x417a6000, 0x0201f800, 0x00101fa9, - 0x5c026000, 0x5c027800, 0x5c00b800, 0x81060800, - 0x81224000, 0x8060c040, 0x04020796, 0x82640580, - 0x00000009, 0x04000008, 0x0401f01a, 0x0401f82e, - 0x81060800, 0x81224000, 0x8060c040, 0x0402078d, - 0x0401f014, 0x836c0580, 0x00000004, 0x04000011, - 0x0201f800, 0x00104fc6, 0x0402000a, 0x4a035013, - 0x0000aaaa, 0x4a035014, 0x00000001, 0x4202d800, - 0x00000001, 0x0201f800, 0x00104f20, 0x0401f005, - 0x4202d800, 0x00000001, 0x0201f800, 0x00104011, - 0x497a5a07, 0x4a025c07, 0x00000000, 0x0201f800, - 0x000203ef, 0x5c020800, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x42003000, 0x00000005, - 0x0401f006, 0x42003000, 0x00000002, 0x0401f003, - 0x42003000, 0x00000001, 0x49225a07, 0x481a5c07, - 0x0401f7ef, 0x4923c857, 0x4d440000, 0x4d300000, - 0x4d340000, 0x4c580000, 0x4d400000, 0x4d3c0000, - 0x4c5c0000, 0x42028000, 0x00000029, 0x42027800, - 0x00001002, 0x4200b000, 0x000007f0, 0x417a8800, - 0x83440400, 0x0010bf80, 0x50000000, 0x80026d40, - 0x04000028, 0x59340013, 0x80000130, 0x81200580, - 0x04020024, 0x4937c857, 0x4947c857, 0x0201f800, - 0x0010492d, 0x04020071, 0x0201f800, 0x00106c3c, - 0x4df00000, 0x0201f800, 0x00107d08, 0x02000800, - 0x0010032e, 0x4a026407, 0x00000001, 0x4936600a, - 0x4926601c, 0x0201f800, 0x00110053, 0x0201f800, - 0x0011014a, 0x0201f800, 0x001101e3, 0x0201f800, - 0x00110623, 0x5c03e000, 0x02000800, 0x00106c29, - 0x42000800, 0x0000000b, 0x0201f800, 0x001044f1, - 0x42027000, 0x00000001, 0x0201f800, 0x00020bc1, - 0x81468800, 0x83440580, 0x0000ffff, 0x04000008, - 0x8058b040, 0x040207cf, 0x42028800, 0x0000ffff, - 0x42026800, 0x0010df3c, 0x0401f048, 0x82640580, - 0x0000000b, 0x04020027, 0x42028800, 0x000007f0, - 0x4200b000, 0x00000010, 0x5924b809, 0x505c0000, - 0x80026d40, 0x0400001b, 0x0201f800, 0x0010492d, - 0x0402003a, 0x59340002, 0x82000500, 0x00ffffff, - 0x4803c857, 0x82000580, 0x00fffffd, 0x04000011, - 0x0201f800, 0x00107d08, 0x02000800, 0x0010032e, + 0x000000ff, 0x040000fe, 0x42000000, 0x0010cfd0, + 0x50000000, 0x4c000000, 0x0201f800, 0x0010c0e8, + 0x5c000000, 0x04000002, 0x80000000, 0x80600480, + 0x040210f3, 0x832c7c00, 0x00000009, 0x592c0407, + 0x4803c857, 0x8c000500, 0x04000006, 0x0201f800, + 0x0010c0e8, 0x040000ea, 0x417a4000, 0x0401f003, + 0x42024000, 0x00000001, 0x42020800, 0x00000001, + 0x4200b800, 0xffffffff, 0x59a80078, 0x8c00053e, + 0x04000004, 0x83200580, 0x00000021, 0x0401f003, + 0x83200580, 0x00000061, 0x04020003, 0x4200b800, + 0x7fffffff, 0x503c0000, 0x805cbd00, 0x04020004, + 0x83224400, 0x00000020, 0x0401f011, 0x805cb902, + 0x0402100a, 0x83200400, 0x0010c10d, 0x50024800, + 0x82640580, 0x00000000, 0x0400001e, 0x8c64cd06, + 0x0402005c, 0x0401f0c6, 0x81060800, 0x81224000, + 0x83040480, 0x00000021, 0x040017f1, 0x803c7800, + 0x59a80078, 0x8c00053e, 0x04000004, 0x83200480, + 0x00000041, 0x0401f003, 0x83200480, 0x00000081, + 0x040017d2, 0x59a80078, 0x8c00053e, 0x04000004, + 0x42024000, 0x0000003f, 0x0401f003, 0x42024000, + 0x0000007f, 0x8060c1c0, 0x040200ad, 0x0401f084, + 0x59240a00, 0x0201f800, 0x0010c0f4, 0x04000004, + 0x8c040d00, 0x040200a6, 0x0401f006, 0x82040d00, + 0x00000003, 0x82040d80, 0x00000003, 0x040000a0, + 0x59240c00, 0x8c040d0a, 0x04020004, 0x8d0e1d20, + 0x0400009b, 0x0401f003, 0x8c040d08, 0x04000098, + 0x4d3c0000, 0x4d300000, 0x42027800, 0x00005002, + 0x417a6000, 0x0201f800, 0x0010200c, 0x5c026000, + 0x5c027800, 0x59240206, 0x82000500, 0xfffffcff, + 0x48024a06, 0x4a024a00, 0x00000005, 0x0201f800, + 0x001050f7, 0x04020013, 0x59a8021b, 0x82000500, + 0x00000082, 0x82000d80, 0x00000082, 0x0400000a, + 0x8c00050e, 0x0402000b, 0x59240200, 0x8400055e, + 0x48024a00, 0x0201f800, 0x001020be, 0x0400006d, + 0x0401f004, 0x0201f800, 0x00101f94, 0x04000071, + 0x81060800, 0x81224000, 0x8060c040, 0x040207a0, + 0x0201f800, 0x001050f7, 0x04020045, 0x0401f057, + 0x59240a00, 0x8c040d00, 0x04000069, 0x4c040000, + 0x82040d00, 0xffffdffc, 0x84040d44, 0x48064a00, + 0x0201f800, 0x0010c0e8, 0x04000012, 0x59240200, + 0x8c00051e, 0x0400000f, 0x8400051e, 0x48024a00, + 0x0201f800, 0x001020ea, 0x04000007, 0x4813c857, + 0x4817c857, 0x58100200, 0x8400055e, 0x48002200, + 0x0401f004, 0x59a8021b, 0x8400050e, 0x4803521b, + 0x5c000800, 0x8c64cd02, 0x04020017, 0x59240c08, + 0x0201f800, 0x001015d6, 0x4c5c0000, 0x4d3c0000, + 0x42027800, 0x00005002, 0x4d300000, 0x417a6000, + 0x0201f800, 0x0010200c, 0x5c026000, 0x5c027800, + 0x5c00b800, 0x81060800, 0x81224000, 0x8060c040, + 0x0402076b, 0x82640580, 0x00000009, 0x04000010, + 0x0401f022, 0x836c0580, 0x00000004, 0x040007e8, + 0x82040d00, 0x00000003, 0x82040d80, 0x00000003, + 0x040207e3, 0x0401f833, 0x81060800, 0x81224000, + 0x8060c040, 0x0402075a, 0x0401f014, 0x836c0580, + 0x00000004, 0x04000011, 0x0201f800, 0x001050f7, + 0x0402000a, 0x4a035013, 0x0000aaaa, 0x4a035014, + 0x00000001, 0x4202d800, 0x00000001, 0x0201f800, + 0x00105051, 0x0401f005, 0x4202d800, 0x00000001, + 0x0201f800, 0x0010410a, 0x497a5a07, 0x4a025c07, + 0x00000000, 0x0201f800, 0x000203ef, 0x5c020800, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x59240200, 0x82000500, 0xfffffffc, 0x48024a00, + 0x0401f009, 0x42003000, 0x00000005, 0x0401f006, + 0x42003000, 0x00000002, 0x0401f003, 0x42003000, + 0x00000001, 0x49225a07, 0x481a5c07, 0x0401f7ea, + 0x4923c857, 0x4d440000, 0x4d300000, 0x4d340000, + 0x4c580000, 0x4d400000, 0x4d3c0000, 0x4c5c0000, + 0x42028000, 0x00000029, 0x42027800, 0x00001002, + 0x4200b000, 0x000007f0, 0x417a8800, 0x83440400, + 0x0010c280, 0x50000000, 0x80026d40, 0x04000028, + 0x59340013, 0x80000130, 0x81200580, 0x04020024, + 0x4937c857, 0x4947c857, 0x0201f800, 0x00104a2f, + 0x04020071, 0x0201f800, 0x00106e41, 0x4df00000, + 0x0201f800, 0x00107f02, 0x02000800, 0x0010032e, 0x4a026407, 0x00000001, 0x4936600a, 0x4926601c, - 0x42000800, 0x0000000b, 0x0201f800, 0x001044f1, - 0x42027000, 0x00000001, 0x0201f800, 0x00020bc1, - 0x805cb800, 0x81468800, 0x8058b040, 0x040207e0, - 0x59a80078, 0x8c00053e, 0x04000014, 0x0201f800, - 0x00107d08, 0x02000800, 0x0010032e, 0x59aa6879, - 0x4936600a, 0x4a026407, 0x00000012, 0x42027000, - 0x000000d2, 0x59240005, 0x48026019, 0x4803c857, - 0x59240001, 0x4802601a, 0x59240002, 0x4802601b, - 0x0201f800, 0x00020bc1, 0x5c00b800, 0x5c027800, - 0x5c028000, 0x5c00b000, 0x5c026800, 0x5c026000, - 0x5c028800, 0x1c01f000, 0x4947c857, 0x0201f800, - 0x00106c3c, 0x4df00000, 0x417a6000, 0x0201f800, - 0x00110053, 0x0201f800, 0x0011014a, 0x0201f800, - 0x001101e3, 0x0201f800, 0x00110623, 0x4a026c00, - 0x00000707, 0x5c03e000, 0x02000800, 0x00106c29, - 0x83440580, 0x0000ffff, 0x040007a5, 0x83441480, - 0x000007f0, 0x04001797, 0x0401f7c6, 0x4c640000, - 0x836c0580, 0x00000000, 0x04000075, 0x497a5c07, - 0x592c2208, 0x80100110, 0x8200cd00, 0x000000ff, - 0x04000066, 0x82640480, 0x00000003, 0x04021063, - 0x4d2c0000, 0x4d040000, 0x417a0800, 0x592c1408, - 0x820a4500, 0x000000ff, 0x04000062, 0x0201f800, - 0x0010bd9f, 0x40580000, 0x81200480, 0x0402105d, - 0x83200400, 0x0010bdc7, 0x50024800, 0x59240200, - 0x8c000500, 0x0402004e, 0x592c0209, 0x8c00050a, - 0x04020004, 0x8d0e1d20, 0x0400004f, 0x0401f003, - 0x8c000508, 0x0400004c, 0x48024c00, 0x8c000502, + 0x0201f800, 0x00110363, 0x0201f800, 0x00110447, + 0x0201f800, 0x001104e0, 0x0201f800, 0x00110916, + 0x5c03e000, 0x02000800, 0x00106e2e, 0x42000800, + 0x0000000b, 0x0201f800, 0x001045ea, 0x42027000, + 0x00000001, 0x0201f800, 0x00020bc1, 0x81468800, + 0x83440580, 0x0000ffff, 0x04000008, 0x8058b040, + 0x040207cf, 0x42028800, 0x0000ffff, 0x42026800, + 0x0010e23c, 0x0401f048, 0x82640580, 0x0000000b, + 0x04020027, 0x42028800, 0x000007f0, 0x4200b000, + 0x00000010, 0x5924b809, 0x505c0000, 0x80026d40, + 0x0400001b, 0x0201f800, 0x00104a2f, 0x0402003a, + 0x59340002, 0x82000500, 0x00ffffff, 0x4803c857, + 0x82000580, 0x00fffffd, 0x04000011, 0x0201f800, + 0x00107f02, 0x02000800, 0x0010032e, 0x4a026407, + 0x00000001, 0x4936600a, 0x4926601c, 0x42000800, + 0x0000000b, 0x0201f800, 0x001045ea, 0x42027000, + 0x00000001, 0x0201f800, 0x00020bc1, 0x805cb800, + 0x81468800, 0x8058b040, 0x040207e0, 0x59a80078, + 0x8c00053e, 0x04000014, 0x0201f800, 0x00107f02, + 0x02000800, 0x0010032e, 0x59aa6879, 0x4936600a, + 0x4a026407, 0x00000012, 0x42027000, 0x000000d2, + 0x59240005, 0x48026019, 0x4803c857, 0x59240001, + 0x4802601a, 0x59240002, 0x4802601b, 0x0201f800, + 0x00020bc1, 0x5c00b800, 0x5c027800, 0x5c028000, + 0x5c00b000, 0x5c026800, 0x5c026000, 0x5c028800, + 0x1c01f000, 0x4947c857, 0x0201f800, 0x00106e41, + 0x4df00000, 0x417a6000, 0x0201f800, 0x00110363, + 0x0201f800, 0x00110447, 0x0201f800, 0x001104e0, + 0x0201f800, 0x00110916, 0x4a026c00, 0x00000707, + 0x5c03e000, 0x02000800, 0x00106e2e, 0x83440580, + 0x0000ffff, 0x040007a5, 0x83441480, 0x000007f0, + 0x04001797, 0x0401f7c6, 0x4c640000, 0x4c600000, + 0x836c0580, 0x00000000, 0x0400009b, 0x497a5c07, + 0x592c2208, 0x8210c500, 0x000000ff, 0x80100110, + 0x8200cd00, 0x000000ff, 0x0400008a, 0x82640480, + 0x00000003, 0x04021087, 0x4d2c0000, 0x4d040000, + 0x417a0800, 0x592c1408, 0x820a4500, 0x000000ff, + 0x4923c857, 0x0201f800, 0x0010c0ca, 0x40580000, + 0x81200480, 0x04021081, 0x83200400, 0x0010c10d, + 0x50024800, 0x82600580, 0x00000003, 0x04020014, + 0x59a8021b, 0x8c000514, 0x0400000d, 0x59240200, + 0x82001d00, 0x00002001, 0x820c1d80, 0x00002001, + 0x04020007, 0x8c000510, 0x04020005, 0x41781800, + 0x0201f800, 0x00101f94, 0x0401f04b, 0x4803c857, + 0x42003000, 0x00000006, 0x0401f074, 0x59240200, + 0x8c000500, 0x0402005c, 0x592c0209, 0x8c00050a, + 0x04020004, 0x8d0e1d20, 0x0400005d, 0x0401f003, + 0x8c000508, 0x0400005a, 0x48024c00, 0x8c000502, 0x04000003, 0x80001110, 0x480a4a08, 0x592c000a, 0x9c0001c0, 0x48024801, 0x592c000b, 0x9c0001c0, 0x48024802, 0x592c000c, 0x9c0001c0, 0x48024803, 0x592c000d, 0x9c0001c0, 0x48024804, 0x810609c0, 0x04000003, 0x832e5c80, 0x00000005, 0x592c0a08, - 0x8c040d00, 0x04000016, 0x4d3c0000, 0x4d300000, + 0x8c040d00, 0x04000024, 0x4d3c0000, 0x4d300000, 0x42027800, 0x00005002, 0x417a6000, 0x0201f800, - 0x00101fa9, 0x5c026000, 0x5c027800, 0x59240206, + 0x0010200c, 0x5c026000, 0x5c027800, 0x59240206, 0x82000500, 0xfffffcff, 0x48024a06, 0x4a024a00, - 0x00000005, 0x0201f800, 0x00104fc6, 0x04020004, - 0x0201f800, 0x00101f2a, 0x04000028, 0x8064c840, - 0x04000007, 0x592c1408, 0x80081110, 0x81060800, - 0x832e5c00, 0x00000005, 0x0401f7b6, 0x5c020800, - 0x5c025800, 0x0201f800, 0x00104fc6, 0x04000024, - 0x592c0a08, 0x8c040d00, 0x04000021, 0x836c0580, - 0x00000004, 0x0400001e, 0x4202d800, 0x00000001, - 0x0201f800, 0x00104011, 0x0401f019, 0x42003000, - 0x00000001, 0x0401f013, 0x42003000, 0x00000002, - 0x0401f012, 0x42003000, 0x00000003, 0x0401f00d, - 0x42003000, 0x00000004, 0x0401f00a, 0x42003000, - 0x00000005, 0x0401f009, 0x42003000, 0x00000006, - 0x59240200, 0x82000500, 0xfffffffc, 0x48024a00, - 0x5c020800, 0x5c025800, 0x481a5c07, 0x0201f800, - 0x000203ef, 0x5c00c800, 0x1c01f000, 0x4c580000, - 0x0201f800, 0x0010bd9f, 0x40580000, 0x81200480, - 0x0402100b, 0x83200400, 0x0010bdc7, 0x50024800, - 0x59240200, 0x82000500, 0x00000003, 0x82000580, - 0x00000003, 0x5c00b000, 0x1c01f000, 0x4923c857, - 0x4927c857, 0x82000540, 0x00000001, 0x0401f7fa, - 0x80140110, 0x80000040, 0x02020000, 0x00105519, - 0x599c0019, 0x8c000510, 0x0402000d, 0x0201f800, - 0x001049ab, 0x04020002, 0x1c01f000, 0x49425a07, - 0x4806580e, 0x480a580f, 0x4943c857, 0x4807c857, - 0x480bc857, 0x0201f000, 0x000203ef, 0x592c040c, - 0x82000500, 0x0000e000, 0x82000580, 0x00006000, - 0x040007ef, 0x59a8021b, 0x8c000508, 0x040007ec, - 0x592c120c, 0x592c080b, 0x82040500, 0xff000000, - 0x80040d80, 0x80000110, 0x80081540, 0x04000004, - 0x4806580b, 0x0401f885, 0x0401f7e1, 0x42001000, - 0x0000001c, 0x42000800, 0x00000019, 0x42028000, - 0x00000031, 0x0401f7de, 0x80140110, 0x80000040, - 0x02020000, 0x00105519, 0x0201f800, 0x00104b2a, - 0x04020002, 0x1c01f000, 0x49425a07, 0x48065812, - 0x480a5813, 0x0201f000, 0x000203ef, 0x80140110, - 0x02000000, 0x00105519, 0x80000040, 0x0402000d, - 0x4202e000, 0x00000001, 0x592c020b, 0x8c000504, - 0x02000000, 0x000206d7, 0x592c0208, 0x82000c80, - 0x00001001, 0x02021000, 0x00105529, 0x0401f005, - 0x4a033006, 0x000206d7, 0x0201f000, 0x000206d1, - 0x592c1014, 0x82080500, 0xffff0003, 0x02020000, - 0x00105529, 0x4202e000, 0x00000002, 0x42000000, - 0x0010dfe7, 0x50007000, 0x592c0012, 0x592c0813, - 0x48007006, 0x48047007, 0x492c700a, 0x4978700d, - 0x4978700b, 0x0401f001, 0x4978700c, 0x82080480, - 0x00000180, 0x4803c857, 0x04001007, 0x4800700e, - 0x4a007005, 0x00000180, 0x4a007004, 0x00000060, - 0x0401f005, 0x4978700e, 0x48087005, 0x80081104, - 0x48087004, 0x58380009, 0x48007003, 0x40381000, - 0x0201f000, 0x00020016, 0x4df00000, 0x4203e000, - 0x50000000, 0x0201f800, 0x0010056e, 0x04000003, - 0x59980005, 0x0801f800, 0x5c03e000, 0x1c01f000, - 0x0201f800, 0x0010056e, 0x02000800, 0x0010032e, - 0x4a025809, 0x0010df86, 0x42000800, 0x0010dfe7, - 0x452c0800, 0x497a580a, 0x497a580b, 0x497a580c, - 0x497a580d, 0x497a580e, 0x4a025808, 0x0002089e, - 0x497a580f, 0x4a025802, 0x00000100, 0x4a025801, - 0x00000001, 0x1c01f000, 0x0401f80e, 0x02000000, - 0x0002086f, 0x4a025a09, 0x00000001, 0x0201f000, - 0x0010b349, 0x0401f807, 0x02000000, 0x0002086a, - 0x4a025a09, 0x00000006, 0x0201f000, 0x0010b349, - 0x59a80005, 0x8c00051a, 0x1c01f000, 0x59a80005, - 0x8c00051c, 0x1c01f000, 0x59a8000f, 0x80080580, - 0x04020002, 0x1c01f000, 0x480bc857, 0x42024800, - 0x0010ccd1, 0x480a4805, 0x480b500f, 0x497b8830, - 0x82080d40, 0x01000000, 0x48078832, 0x59c40002, - 0x8400054c, 0x48038802, 0x42000800, 0x00000003, - 0x0201f000, 0x00106c63, 0x59c80007, 0x8c000502, - 0x0400007b, 0x835c2c80, 0x00000005, 0x02001000, - 0x0010624a, 0x59c82817, 0x4817506f, 0x497b9005, - 0x82140500, 0x00e00000, 0x04020059, 0x82140500, - 0x000003ff, 0x82001c00, 0x00000006, 0x41cc2000, - 0x42003000, 0x00006080, 0x820c0480, 0x00000040, - 0x04001006, 0x42001000, 0x00000040, 0x820c1c80, - 0x00000040, 0x0401f003, 0x400c1000, 0x41781800, - 0x54182000, 0x80102000, 0x80183000, 0x80081040, - 0x040207fc, 0x800c19c0, 0x04000005, 0x59c80005, - 0x80000000, 0x48039005, 0x0401f7ea, 0x82140500, - 0x000003ff, 0x800018c4, 0x8c142d14, 0x04000005, - 0x59cc0002, 0x82000500, 0x00000003, 0x800c1c80, - 0x480f505a, 0x82140500, 0x01f60000, 0x04020029, - 0x82140500, 0x0000f000, 0x0400000b, 0x82000c80, - 0x00002000, 0x0402100f, 0x4a039005, 0x00000140, - 0x82140500, 0x0e000000, 0x80000132, 0x0c01f83e, - 0x1c01f000, 0x59cc0400, 0x82000500, 0x0000ff00, - 0x82000580, 0x00008100, 0x040007f4, 0x0401f01c, - 0x4817c857, 0x82140500, 0x000003ff, 0x04020007, - 0x59cc0400, 0x82000500, 0x0000ff00, 0x82000580, - 0x00008100, 0x04020012, 0x42000000, 0x0010cc7d, - 0x0201f800, 0x0010bc88, 0x0201f800, 0x001060ce, - 0x4803c856, 0x4a039005, 0x00000140, 0x0401f020, - 0x4817c857, 0x82140500, 0x00f60000, 0x04020004, - 0x0201f800, 0x00106115, 0x040207d2, 0x0201f800, - 0x00104fc6, 0x04000010, 0x59c400a4, 0x4803c857, - 0x82000500, 0x0000000f, 0x82000580, 0x0000000a, - 0x04020009, 0x497b505a, 0x59c400a3, 0x82000540, - 0x00080000, 0x480388a3, 0x82000500, 0xfff7ffff, - 0x480388a3, 0x4817c856, 0x0201f800, 0x0010bbcd, - 0x4a039005, 0x00000140, 0x0401f03f, 0x4803c856, - 0x1c01f000, 0x00105c2b, 0x00105f73, 0x00105c25, - 0x00105c25, 0x00105c25, 0x00105c25, 0x00105c25, - 0x00105c25, 0x4803c857, 0x42000000, 0x0010cc1a, - 0x0201f800, 0x0010bc88, 0x1c01f000, 0x59cc0002, - 0x82000500, 0xff000000, 0x82000580, 0xfe000000, - 0x04020004, 0x0201f800, 0x0010b69c, 0x0401f025, - 0x59cc0400, 0x82000d00, 0x0000ff00, 0x82041500, - 0x0000f000, 0x840409c0, 0x82080580, 0x00002000, - 0x04020013, 0x836c0580, 0x00000001, 0x0402000e, - 0x59cc0006, 0x82000500, 0xff000000, 0x82000580, - 0x11000000, 0x02020800, 0x001003f5, 0x04020011, - 0x0201f800, 0x001039eb, 0x0201f800, 0x00106275, - 0x0401f00c, 0x0401f81f, 0x0401f00a, 0x82080580, - 0x00003000, 0x04020003, 0x0401faaf, 0x0401f005, - 0x82080580, 0x00008000, 0x04020002, 0x0401fb86, - 0x1c01f000, 0x4817c857, 0x42000000, 0x0010cc19, - 0x0201f800, 0x0010bc88, 0x836c0580, 0x00000003, - 0x0402000b, 0x4c080000, 0x4c0c0000, 0x42001000, - 0x00008048, 0x40141800, 0x80142120, 0x0201f800, - 0x001038bc, 0x5c001800, 0x5c001000, 0x1c01f000, - 0x59cc0002, 0x82000500, 0xff000000, 0x82001580, - 0x01000000, 0x04000006, 0x82001580, 0x23000000, - 0x02020800, 0x001003f5, 0x04020234, 0x59a8005a, - 0x82000480, 0x00000004, 0x04001230, 0x82040580, - 0x00000023, 0x04020052, 0x59cc0004, 0x4803c857, - 0x59cc0006, 0x82000500, 0xff000000, 0x59cc0801, - 0x82040d00, 0x00ffffff, 0x80040540, 0x4803c857, - 0x0201f800, 0x0010609c, 0x02000800, 0x001003f5, - 0x0400021e, 0x59300c07, 0x82040580, 0x00000010, - 0x0400000f, 0x82040580, 0x00000011, 0x0400000c, - 0x82040580, 0x00000001, 0x04000009, 0x82040580, - 0x00000004, 0x04000006, 0x82040580, 0x00000008, - 0x02020800, 0x001003f5, 0x0402020c, 0x59300004, - 0x82000500, 0x80010000, 0x04000006, 0x0201f800, - 0x00107021, 0x02020800, 0x001003f5, 0x04020203, - 0x59cc0a04, 0x48066202, 0x59cc0006, 0x82000500, - 0xffff0000, 0x82000d80, 0x02000000, 0x04020005, - 0x42027000, 0x00000015, 0x0201f000, 0x00020bc1, - 0x82000d80, 0x02140000, 0x040007fa, 0x82000d80, - 0x02100000, 0x040007f7, 0x82000d80, 0x02100000, - 0x040007f4, 0x82000d80, 0x01000000, 0x02020800, - 0x001003f5, 0x040201e9, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x02020800, 0x001003f5, 0x040201e3, - 0x59a8005a, 0x82000480, 0x00000008, 0x040011df, - 0x42027000, 0x00000016, 0x0401f7e4, 0x82040580, - 0x00000022, 0x02020800, 0x001003f5, 0x040201d7, - 0x59cc0004, 0x4803c857, 0x59cc0006, 0x4803c857, - 0x59cc0001, 0x4803c857, 0x59a8005a, 0x800001c0, - 0x02000800, 0x001003f5, 0x040001cc, 0x59a80805, - 0x8c040d14, 0x04000036, 0x0401f9e8, 0x04020034, - 0x0401fa01, 0x04000032, 0x42027000, 0x0000004c, - 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x4c1c0000, - 0x0201f800, 0x00101f66, 0x5c003800, 0x04000004, - 0x0201f800, 0x001003f5, 0x0401f1b8, 0x59cc0001, - 0x82000500, 0x00ffffff, 0x0201f800, 0x0010620a, - 0x04000004, 0x42028800, 0x0000ffff, 0x417a6800, - 0x599c0019, 0x8c000510, 0x04000196, 0x59a8021b, - 0x8c000508, 0x04000193, 0x59cc1006, 0x82081500, - 0xffff0000, 0x82081580, 0x03000000, 0x0402018d, - 0x83641480, 0x00000010, 0x040011a5, 0x8400054c, - 0x4803521b, 0x59cc1000, 0x82081500, 0x00ffffff, - 0x0401fe7a, 0x59cc0007, 0x82000500, 0x0000ffff, - 0x48038893, 0x48035012, 0x0401f17e, 0x59cc0006, - 0x82000500, 0xffff0000, 0x82000d80, 0x03000000, - 0x0402002d, 0x59a8021b, 0x8c000508, 0x04000024, - 0x8400054c, 0x4803521b, 0x59cc0800, 0x82040d00, - 0x00ffffff, 0x42024800, 0x0010ccd1, 0x4807c857, - 0x48064805, 0x4807500f, 0x497b8830, 0x84040d70, - 0x48078832, 0x59c40802, 0x84040d4c, 0x48078802, + 0x00000005, 0x0201f800, 0x001050f7, 0x04020012, + 0x0201f800, 0x001020ea, 0x0402000c, 0x59a8021b, + 0x4803c857, 0x8c00050e, 0x0402000b, 0x59240200, + 0x8400055e, 0x48024a00, 0x0201f800, 0x001020be, + 0x0400002c, 0x0401f004, 0x0201f800, 0x00101f94, + 0x04000028, 0x8064c840, 0x04000007, 0x592c1408, + 0x80081110, 0x81060800, 0x832e5c00, 0x00000005, + 0x0401f792, 0x5c020800, 0x5c025800, 0x0201f800, + 0x001050f7, 0x04000024, 0x592c0a08, 0x8c040d00, + 0x04000021, 0x836c0580, 0x00000004, 0x0400001e, + 0x4202d800, 0x00000001, 0x0201f800, 0x0010410a, + 0x0401f019, 0x42003000, 0x00000001, 0x0401f013, + 0x42003000, 0x00000002, 0x0401f012, 0x42003000, + 0x00000003, 0x0401f00d, 0x42003000, 0x00000004, + 0x0401f00a, 0x42003000, 0x00000005, 0x0401f009, + 0x42003000, 0x00000006, 0x59240200, 0x82000500, + 0xfffffffc, 0x48024a00, 0x5c020800, 0x5c025800, + 0x481a5c07, 0x0201f800, 0x000203ef, 0x5c00c000, + 0x5c00c800, 0x1c01f000, 0x4c580000, 0x0201f800, + 0x0010c0ca, 0x40580000, 0x81200480, 0x0402100b, + 0x83200400, 0x0010c10d, 0x50024800, 0x59240200, + 0x82000500, 0x00000003, 0x82000580, 0x00000003, + 0x5c00b000, 0x1c01f000, 0x4923c857, 0x4927c857, + 0x82000540, 0x00000001, 0x0401f7fa, 0x80140110, + 0x80000040, 0x02020000, 0x0010564a, 0x599c0019, + 0x8c000510, 0x0402000d, 0x0201f800, 0x00104aad, + 0x04020002, 0x1c01f000, 0x49425a07, 0x4806580e, + 0x480a580f, 0x4943c857, 0x4807c857, 0x480bc857, + 0x0201f000, 0x000203ef, 0x592c040c, 0x82000500, + 0x0000e000, 0x82000580, 0x00006000, 0x040007ef, + 0x59a8021b, 0x8c000508, 0x040007ec, 0x592c120c, + 0x592c080b, 0x82040500, 0xff000000, 0x80040d80, + 0x80000110, 0x80081540, 0x04000004, 0x4806580b, + 0x0401f885, 0x0401f7e1, 0x42001000, 0x0000001c, + 0x42000800, 0x00000019, 0x42028000, 0x00000031, + 0x0401f7de, 0x80140110, 0x80000040, 0x02020000, + 0x0010564a, 0x0201f800, 0x00104c2f, 0x04020002, + 0x1c01f000, 0x49425a07, 0x48065812, 0x480a5813, + 0x0201f000, 0x000203ef, 0x80140110, 0x02000000, + 0x0010564a, 0x80000040, 0x0402000d, 0x4202e000, + 0x00000001, 0x592c020b, 0x8c000504, 0x02000000, + 0x000206d7, 0x592c0208, 0x82000c80, 0x00001001, + 0x02021000, 0x0010565a, 0x0401f005, 0x4a033006, + 0x000206d7, 0x0201f000, 0x000206d1, 0x592c1014, + 0x82080500, 0xffff0003, 0x02020000, 0x0010565a, + 0x4202e000, 0x00000002, 0x42000000, 0x0010e2e7, + 0x50007000, 0x592c0012, 0x592c0813, 0x48007006, + 0x48047007, 0x492c700a, 0x4978700d, 0x4978700b, + 0x0401f001, 0x4978700c, 0x82080480, 0x00000180, + 0x4803c857, 0x04001007, 0x4800700e, 0x4a007005, + 0x00000180, 0x4a007004, 0x00000060, 0x0401f005, + 0x4978700e, 0x48087005, 0x80081104, 0x48087004, + 0x58380009, 0x48007003, 0x40381000, 0x0201f000, + 0x00020016, 0x4df00000, 0x4203e000, 0x50000000, + 0x0201f800, 0x0010056e, 0x04000003, 0x59980005, + 0x0801f800, 0x5c03e000, 0x1c01f000, 0x0201f800, + 0x0010056e, 0x02000800, 0x0010032e, 0x4a025809, + 0x0010e286, 0x42000800, 0x0010e2e7, 0x452c0800, + 0x497a580a, 0x497a580b, 0x497a580c, 0x497a580d, + 0x497a580e, 0x4a025808, 0x0002089e, 0x497a580f, + 0x4a025802, 0x00000100, 0x4a025801, 0x00000001, + 0x1c01f000, 0x0401f80e, 0x02000000, 0x0002086f, + 0x4a025a09, 0x00000001, 0x0201f000, 0x0010b674, + 0x0401f807, 0x02000000, 0x0002086a, 0x4a025a09, + 0x00000006, 0x0201f000, 0x0010b674, 0x59a80005, + 0x8c00051a, 0x1c01f000, 0x59a80005, 0x8c00051c, + 0x1c01f000, 0x59a8000f, 0x80080580, 0x04020002, + 0x1c01f000, 0x480bc857, 0x42024800, 0x0010cfd1, + 0x480a4805, 0x480b500f, 0x497b8830, 0x82080d40, + 0x01000000, 0x48078832, 0x59c40002, 0x8400054c, + 0x48038802, 0x42000800, 0x00000003, 0x0201f000, + 0x00106e68, 0x59c80007, 0x8c000502, 0x0400004f, + 0x835c2c80, 0x00000005, 0x02001000, 0x00106416, + 0x59c82817, 0x4817506f, 0x497b9005, 0x82140500, + 0x00e00000, 0x04020040, 0x82140500, 0x000003ff, + 0x82001c00, 0x00000006, 0x41cc2000, 0x42003000, + 0x00006080, 0x820c0480, 0x00000040, 0x04001006, + 0x42001000, 0x00000040, 0x820c1c80, 0x00000040, + 0x0401f003, 0x400c1000, 0x41781800, 0x54182000, + 0x80102000, 0x80183000, 0x80081040, 0x040207fc, + 0x800c19c0, 0x04000005, 0x59c80005, 0x80000000, + 0x48039005, 0x0401f7ea, 0x82140500, 0x000003ff, + 0x800018c4, 0x8c142d14, 0x04000005, 0x59cc0002, + 0x82000500, 0x00000003, 0x800c1c80, 0x480f505a, + 0x82140500, 0x01f60000, 0x04020010, 0x0201f800, + 0x00106421, 0x04020008, 0x4a039005, 0x00000140, + 0x82140500, 0x0e000000, 0x80000132, 0x0c01f815, + 0x1c01f000, 0x800001c0, 0x0402000b, 0x4a039005, + 0x00000140, 0x0401f00d, 0x4817c857, 0x82140500, + 0x00f60000, 0x04020004, 0x0201f800, 0x001062e1, + 0x040207eb, 0x0201f800, 0x00106445, 0x4a039005, + 0x00000140, 0x0401f03f, 0x4803c856, 0x1c01f000, + 0x00105db6, 0x0010613f, 0x00105db0, 0x00105db0, + 0x00105db0, 0x00105db0, 0x00105db0, 0x00105db0, + 0x4803c857, 0x42000000, 0x0010cf1a, 0x0201f800, + 0x0010bfb3, 0x1c01f000, 0x59cc0002, 0x82000500, + 0xff000000, 0x82000580, 0xfe000000, 0x04020004, + 0x0201f800, 0x0010b9c7, 0x0401f025, 0x59cc0400, + 0x82000d00, 0x0000ff00, 0x82041500, 0x0000f000, + 0x840409c0, 0x82080580, 0x00002000, 0x04020013, + 0x836c0580, 0x00000001, 0x0402000e, 0x59cc0006, + 0x82000500, 0xff000000, 0x82000580, 0x11000000, + 0x02020800, 0x001003f5, 0x04020011, 0x0201f800, + 0x00103ae4, 0x0201f800, 0x0010647a, 0x0401f00c, + 0x0401f81f, 0x0401f00a, 0x82080580, 0x00003000, + 0x04020003, 0x0401fad2, 0x0401f005, 0x82080580, + 0x00008000, 0x04020002, 0x0401fbc7, 0x1c01f000, + 0x4817c857, 0x42000000, 0x0010cf19, 0x0201f800, + 0x0010bfb3, 0x836c0580, 0x00000003, 0x0402000b, + 0x4c080000, 0x4c0c0000, 0x42001000, 0x00008048, + 0x40141800, 0x80142120, 0x0201f800, 0x001039ac, + 0x5c001800, 0x5c001000, 0x1c01f000, 0x59cc0002, + 0x82000500, 0xff000000, 0x82001580, 0x01000000, + 0x04000006, 0x82001580, 0x23000000, 0x02020800, + 0x001003f5, 0x04020250, 0x59a8005a, 0x82000480, + 0x00000004, 0x0400124c, 0x82040580, 0x00000023, + 0x04020052, 0x59cc0004, 0x4803c857, 0x59cc0006, + 0x82000500, 0xff000000, 0x59cc0801, 0x82040d00, + 0x00ffffff, 0x80040540, 0x4803c857, 0x0201f800, + 0x00106268, 0x02000800, 0x001003f5, 0x0400023a, + 0x59300c07, 0x82040580, 0x00000010, 0x0400000f, + 0x82040580, 0x00000011, 0x0400000c, 0x82040580, + 0x00000001, 0x04000009, 0x82040580, 0x00000004, + 0x04000006, 0x82040580, 0x00000008, 0x02020800, + 0x001003f5, 0x04020228, 0x59300004, 0x82000500, + 0x80010000, 0x04000006, 0x0201f800, 0x00107226, + 0x02020800, 0x001003f5, 0x0402021f, 0x59cc0a04, + 0x48066202, 0x59cc0006, 0x82000500, 0xffff0000, + 0x82000d80, 0x02000000, 0x04020005, 0x42027000, + 0x00000015, 0x0201f000, 0x00020bc1, 0x82000d80, + 0x02140000, 0x040007fa, 0x82000d80, 0x02100000, + 0x040007f7, 0x82000d80, 0x02100000, 0x040007f4, + 0x82000d80, 0x01000000, 0x02020800, 0x001003f5, + 0x04020205, 0x59cc0006, 0x82000500, 0x0000ffff, + 0x02020800, 0x001003f5, 0x040201ff, 0x59a8005a, + 0x82000480, 0x00000008, 0x040011fb, 0x42027000, + 0x00000016, 0x0401f7e4, 0x82040580, 0x00000022, + 0x02020800, 0x001003f5, 0x040201f3, 0x59cc0004, + 0x4803c857, 0x59cc0006, 0x4803c857, 0x59cc0001, + 0x4803c857, 0x59a8005a, 0x800001c0, 0x02000800, + 0x001003f5, 0x040001e8, 0x59a80805, 0x8c040d14, + 0x0400003a, 0x0401fa0b, 0x04020038, 0x0401fa24, + 0x04000036, 0x42027000, 0x0000004c, 0x59cc3800, + 0x821c3d00, 0x00ffffff, 0x4c1c0000, 0x0201f800, + 0x00101fc9, 0x5c003800, 0x04000004, 0x0201f800, + 0x001003f5, 0x0401f1d4, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x0201f800, 0x001063d6, 0x04000008, + 0x42028800, 0x0000ffff, 0x42026800, 0x0010e23c, + 0x0201f800, 0x00104d9c, 0x481a6802, 0x599c0019, + 0x8c000510, 0x040001ad, 0x59a8021b, 0x8c000508, + 0x040001aa, 0x59cc1006, 0x82081500, 0xffff0000, + 0x82081580, 0x03000000, 0x040201a4, 0x83641480, + 0x00000010, 0x040011bd, 0x8400054c, 0x4803521b, + 0x59cc1000, 0x82081500, 0x00ffffff, 0x0401fea2, 0x59cc0007, 0x82000500, 0x0000ffff, 0x48038893, - 0x48035012, 0x42000800, 0x00000003, 0x59a8100f, - 0x0201f800, 0x00106c63, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x02020800, 0x001003f5, 0x0402016b, - 0x42027000, 0x00000017, 0x0401f11e, 0x0201f800, - 0x00104fc6, 0x040207f5, 0x8c000502, 0x040207f3, - 0x0401f162, 0x82000d80, 0x04000000, 0x04020018, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x02020800, - 0x001003f5, 0x04020159, 0x0201f800, 0x00104fc6, - 0x04000004, 0x42027000, 0x0000001d, 0x0401f109, - 0x497b5065, 0x42001000, 0x00110694, 0x0201f800, - 0x001062f9, 0x59a8021b, 0x84000548, 0x4803521b, - 0x42027000, 0x00000030, 0x0401f0fe, 0x82000d80, - 0x05000000, 0x0402000a, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x02020800, 0x001003f5, 0x0402013f, - 0x42027000, 0x00000018, 0x0401f0f2, 0x82000d80, - 0x20100000, 0x04020004, 0x42027000, 0x00000019, - 0x0401f0ec, 0x82000d80, 0x21100000, 0x04020004, - 0x42027000, 0x0000001a, 0x0401f0e6, 0x82000d80, - 0x52000000, 0x0402000a, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x02020800, 0x001003f5, 0x04020127, - 0x42027000, 0x0000001b, 0x0401f0da, 0x82000d80, - 0x50000000, 0x0402000a, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x02020800, 0x001003f5, 0x0402011b, - 0x42027000, 0x0000001c, 0x0401f0ce, 0x82000d80, - 0x13000000, 0x04020004, 0x42027000, 0x00000034, - 0x0401f0c8, 0x82000d80, 0x12000000, 0x0402000a, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x02020800, - 0x001003f5, 0x04020109, 0x42027000, 0x00000024, - 0x0401f0bc, 0x82000d00, 0xff000000, 0x82040d80, - 0x24000000, 0x04020004, 0x42027000, 0x0000002d, - 0x0401f0b4, 0x82000d00, 0xff000000, 0x82040d80, - 0x53000000, 0x04020004, 0x42027000, 0x0000002a, - 0x0401f0ac, 0x82000d80, 0x0f000000, 0x04020004, - 0x42027000, 0x00000020, 0x0401f0a6, 0x82000d80, - 0x61040000, 0x04020056, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x4c580000, 0x83ccc400, 0x00000006, - 0x8060b800, 0x50600000, 0x82000500, 0x0000ffff, - 0x82001480, 0x00000401, 0x04021041, 0x82001500, - 0x00000003, 0x0402003e, 0x59a8105a, 0x80081480, - 0x0400103b, 0x82000480, 0x00000004, 0x8000b104, - 0x8058b1c0, 0x04000036, 0x59cc3800, 0x821c3d00, - 0x00ffffff, 0x4d200000, 0x0201f800, 0x00101f66, - 0x04000003, 0x5c024000, 0x0401f02d, 0x505cc800, - 0x8264c500, 0x03000000, 0x8060c130, 0x42000000, - 0x0010cbe4, 0x82602580, 0x00000000, 0x04020004, - 0x42000000, 0x0010cbe1, 0x0401f00c, 0x82602580, - 0x00000001, 0x04020004, 0x42000000, 0x0010cbe2, - 0x0401f006, 0x82602580, 0x00000002, 0x04020003, - 0x42000000, 0x0010cbe3, 0x0201f800, 0x0010bc88, - 0x42001000, 0x00008015, 0x82642500, 0x0000ffff, - 0x80641920, 0x41202800, 0x0201f800, 0x001038bd, - 0x805cb800, 0x8058b040, 0x040207dd, 0x5c024000, - 0x5c00b000, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x42027000, 0x00000023, 0x0401f056, 0x5c00b000, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x42000000, - 0x0010cc17, 0x0201f000, 0x0010bc88, 0x82000d80, - 0x60000000, 0x04020004, 0x42027000, 0x0000003f, - 0x0401f048, 0x82000d80, 0x54000000, 0x04020010, - 0x0401fb9e, 0x02020800, 0x001003f5, 0x0402008b, - 0x42027000, 0x00000046, 0x42000000, 0x0010ccd6, - 0x50000000, 0x59cc3800, 0x821c3d00, 0xff000000, - 0x801c0540, 0x48039800, 0x0401f036, 0x82000d80, - 0x55000000, 0x04020009, 0x0401fbb4, 0x04020004, - 0x42027000, 0x00000041, 0x0401f02e, 0x42027000, - 0x00000042, 0x0401f02b, 0x82000d80, 0x78000000, - 0x04020004, 0x42027000, 0x00000045, 0x0401f025, - 0x82000d80, 0x10000000, 0x04020004, 0x42027000, - 0x0000004e, 0x0401f01f, 0x82000d80, 0x63000000, - 0x04020004, 0x42027000, 0x0000004a, 0x0401f019, - 0x82000d00, 0xff000000, 0x82040d80, 0x56000000, - 0x04020004, 0x42027000, 0x0000004f, 0x0401f011, - 0x82000d00, 0xff000000, 0x82040d80, 0x57000000, - 0x04020004, 0x42027000, 0x00000050, 0x0401f009, - 0x82000d80, 0x7d000000, 0x04020004, 0x42027000, - 0x00000056, 0x0401f003, 0x42027000, 0x0000001d, - 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x821c0580, - 0x00fffffe, 0x59cc0001, 0x04020005, 0x40003000, - 0x42028800, 0x000007fe, 0x0401f00a, 0x59cc3800, - 0x821c3d00, 0x00ffffff, 0x4c1c0000, 0x0401f8fa, - 0x5c003800, 0x02020800, 0x001003f5, 0x04020037, - 0x0201f800, 0x00101f66, 0x02000800, 0x00104531, - 0x02020800, 0x001003f5, 0x04020030, 0x83380580, - 0x00000046, 0x04020006, 0x59a8000f, 0x80180580, - 0x02000800, 0x001003f5, 0x04000028, 0x59340200, - 0x8c000514, 0x0400000f, 0x83380580, 0x00000030, - 0x0400000c, 0x83380580, 0x0000003f, 0x04000009, - 0x83380580, 0x00000034, 0x04000006, 0x83380580, - 0x00000024, 0x04000003, 0x42027000, 0x0000004c, - 0x0201f800, 0x00107cfe, 0x04000019, 0x4926601c, - 0x4936600a, 0x4a026407, 0x00000004, 0x59cc0c04, - 0x48066202, 0x83380580, 0x0000004c, 0x04020009, - 0x4a026407, 0x00000011, 0x813669c0, 0x04020005, + 0x48035012, 0x0401f195, 0x59cc0006, 0x82000500, + 0xffff0000, 0x82000d80, 0x03000000, 0x0402002d, + 0x59a8021b, 0x8c000508, 0x04000024, 0x8400054c, + 0x4803521b, 0x59cc0800, 0x82040d00, 0x00ffffff, + 0x42024800, 0x0010cfd1, 0x4807c857, 0x48064805, + 0x4807500f, 0x497b8830, 0x84040d70, 0x48078832, + 0x59c40802, 0x84040d4c, 0x48078802, 0x59cc0007, + 0x82000500, 0x0000ffff, 0x48038893, 0x48035012, + 0x42000800, 0x00000003, 0x59a8100f, 0x0201f800, + 0x00106e68, 0x59cc0006, 0x82000500, 0x0000ffff, + 0x02020800, 0x001003f5, 0x04020183, 0x42027000, + 0x00000017, 0x0401f11e, 0x0201f800, 0x001050f7, + 0x040207f5, 0x8c000502, 0x040207f3, 0x0401f17a, + 0x82000d80, 0x04000000, 0x04020018, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x02020800, 0x001003f5, + 0x04020171, 0x0201f800, 0x001050f7, 0x04000002, + 0x0401f109, 0x497b5065, 0x42001000, 0x00110987, + 0x0201f800, 0x001064fe, 0x0201f800, 0x00104da6, + 0x59a8021b, 0x84000548, 0x4803521b, 0x42027000, + 0x00000030, 0x0401f0fe, 0x82000d80, 0x05000000, + 0x0402000a, 0x59cc0006, 0x82000500, 0x0000ffff, + 0x02020800, 0x001003f5, 0x04020157, 0x42027000, + 0x00000018, 0x0401f0f2, 0x82000d80, 0x20100000, + 0x04020004, 0x42027000, 0x00000019, 0x0401f0ec, + 0x82000d80, 0x21100000, 0x04020004, 0x42027000, + 0x0000001a, 0x0401f0e6, 0x82000d80, 0x52000000, + 0x0402000a, 0x59cc0006, 0x82000500, 0x0000ffff, + 0x02020800, 0x001003f5, 0x0402013f, 0x42027000, + 0x0000001b, 0x0401f0da, 0x82000d80, 0x50000000, + 0x0402000a, 0x59cc0006, 0x82000500, 0x0000ffff, + 0x02020800, 0x001003f5, 0x04020133, 0x42027000, + 0x0000001c, 0x0401f0ce, 0x82000d80, 0x13000000, + 0x04020004, 0x42027000, 0x00000034, 0x0401f0c8, + 0x82000d80, 0x12000000, 0x0402000a, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x02020800, 0x001003f5, + 0x04020121, 0x42027000, 0x00000024, 0x0401f0bc, + 0x82000d00, 0xff000000, 0x82040d80, 0x24000000, + 0x04020004, 0x42027000, 0x0000002d, 0x0401f0b4, + 0x82000d00, 0xff000000, 0x82040d80, 0x53000000, + 0x04020004, 0x42027000, 0x0000002a, 0x0401f0ac, + 0x82000d80, 0x0f000000, 0x04020004, 0x42027000, + 0x00000020, 0x0401f0a6, 0x82000d80, 0x61040000, + 0x04020056, 0x4c5c0000, 0x4c600000, 0x4c640000, + 0x4c580000, 0x83ccc400, 0x00000006, 0x8060b800, + 0x50600000, 0x82000500, 0x0000ffff, 0x82001480, + 0x00000401, 0x04021041, 0x82001500, 0x00000003, + 0x0402003e, 0x59a8105a, 0x80081480, 0x0400103b, + 0x82000480, 0x00000004, 0x8000b104, 0x8058b1c0, + 0x04000036, 0x59cc3800, 0x821c3d00, 0x00ffffff, + 0x4d200000, 0x0201f800, 0x00101fc9, 0x04000003, + 0x5c024000, 0x0401f02d, 0x505cc800, 0x8264c500, + 0x03000000, 0x8060c130, 0x42000000, 0x0010cee4, + 0x82602580, 0x00000000, 0x04020004, 0x42000000, + 0x0010cee1, 0x0401f00c, 0x82602580, 0x00000001, + 0x04020004, 0x42000000, 0x0010cee2, 0x0401f006, + 0x82602580, 0x00000002, 0x04020003, 0x42000000, + 0x0010cee3, 0x0201f800, 0x0010bfb3, 0x42001000, + 0x00008015, 0x82642500, 0x0000ffff, 0x80641920, + 0x41202800, 0x0201f800, 0x001039ad, 0x805cb800, + 0x8058b040, 0x040207dd, 0x5c024000, 0x5c00b000, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x42027000, + 0x00000023, 0x0401f056, 0x5c00b000, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x42000000, 0x0010cf17, + 0x0201f000, 0x0010bfb3, 0x82000d80, 0x60000000, + 0x04020004, 0x42027000, 0x0000003f, 0x0401f048, + 0x82000d80, 0x54000000, 0x04020010, 0x0401fbdb, + 0x02020800, 0x001003f5, 0x040200a3, 0x42027000, + 0x00000046, 0x42000000, 0x0010cfd6, 0x50000000, + 0x59cc3800, 0x821c3d00, 0xff000000, 0x801c0540, + 0x48039800, 0x0401f036, 0x82000d80, 0x55000000, + 0x04020009, 0x0401fbf1, 0x04020004, 0x42027000, + 0x00000041, 0x0401f02e, 0x42027000, 0x00000042, + 0x0401f02b, 0x82000d80, 0x78000000, 0x04020004, + 0x42027000, 0x00000045, 0x0401f025, 0x82000d80, + 0x10000000, 0x04020004, 0x42027000, 0x0000004e, + 0x0401f01f, 0x82000d80, 0x63000000, 0x04020004, + 0x42027000, 0x0000004a, 0x0401f019, 0x82000d00, + 0xff000000, 0x82040d80, 0x56000000, 0x04020004, + 0x42027000, 0x0000004f, 0x0401f011, 0x82000d00, + 0xff000000, 0x82040d80, 0x57000000, 0x04020004, + 0x42027000, 0x00000050, 0x0401f009, 0x82000d80, + 0x7d000000, 0x04020004, 0x42027000, 0x00000056, + 0x0401f003, 0x42027000, 0x0000001d, 0x59cc3800, + 0x821c3d00, 0x00ffffff, 0x821c0580, 0x00fffffe, + 0x59cc0001, 0x04020005, 0x40003000, 0x42028800, + 0x000007fe, 0x0401f00a, 0x59cc3800, 0x821c3d00, + 0x00ffffff, 0x4c1c0000, 0x0401f937, 0x5c003800, + 0x02020800, 0x001003f5, 0x0402004f, 0x0201f800, + 0x00101fc9, 0x83440480, 0x000007f0, 0x04001001, + 0x0201f800, 0x00103adb, 0x04000012, 0x4c180000, + 0x0201f800, 0x00104a7c, 0x5c003000, 0x04000012, + 0x4c180000, 0x0401f867, 0x5c003000, 0x04020009, + 0x0201f800, 0x00104d9c, 0x42026800, 0x0010e23c, + 0x481a6802, 0x42028800, 0x0000ffff, 0x0401f006, + 0x0201f800, 0x0010462d, 0x02020800, 0x001003f5, + 0x04020031, 0x83380580, 0x00000046, 0x04020006, + 0x59a8000f, 0x80180580, 0x02000800, 0x001003f5, + 0x04000029, 0x59340200, 0x8c000514, 0x0400000f, + 0x83380580, 0x00000030, 0x0400000c, 0x83380580, + 0x0000003f, 0x04000009, 0x83380580, 0x00000034, + 0x04000006, 0x83380580, 0x00000024, 0x04000003, + 0x42027000, 0x0000004c, 0x0201f800, 0x00107ef8, + 0x0400001a, 0x4926601c, 0x4936600a, 0x4a026407, + 0x00000004, 0x83340580, 0x0010e23c, 0x04020005, 0x59cc0001, 0x82000500, 0x00ffffff, 0x48026027, - 0x0201f000, 0x00020bc1, 0x598800b7, 0x4803c857, - 0x80000000, 0x480310b7, 0x1c01f000, 0x42001000, - 0x00008049, 0x59cc1806, 0x800c1930, 0x0201f800, - 0x001038bc, 0x0201f800, 0x00107d08, 0x02000800, - 0x001003f5, 0x040007f1, 0x4926601c, 0x4936600a, - 0x4a026407, 0x00000004, 0x59cc0c04, 0x48066202, - 0x4a026403, 0x00000009, 0x4a02641b, 0x00000009, - 0x4a02621b, 0x00002900, 0x4a026203, 0x00000001, - 0x0201f000, 0x00106b17, 0x59a8021b, 0x4803c857, - 0x8c000508, 0x04000013, 0x599c0019, 0x8c000510, - 0x04020010, 0x59cc0006, 0x82000500, 0xff000000, - 0x82000d80, 0x03000000, 0x0400000c, 0x82000d80, - 0x20000000, 0x04000009, 0x82000d80, 0x05000000, - 0x04000006, 0x82000d80, 0x21000000, 0x04000003, - 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, - 0x0401f7fd, 0x59cc2006, 0x82102500, 0xff000000, - 0x9c1021c0, 0x0401f807, 0x820c1c00, 0x0010c83e, - 0x500c1800, 0x800c0500, 0x4803c857, 0x1c01f000, - 0x40100800, 0x41781800, 0x82040480, 0x00000020, - 0x04001004, 0x800c1800, 0x40000800, 0x0401f7fb, - 0x82040500, 0x0000000f, 0x82000400, 0x0010bdb6, - 0x50000000, 0x8c040d08, 0x04000002, 0x900001c0, - 0x1c01f000, 0x4803c856, 0x0401fb37, 0x0402000a, - 0x0201f800, 0x00101d49, 0x04020007, 0x59cc0002, - 0x82000500, 0xff000000, 0x82000d80, 0x08000000, - 0x04000802, 0x1c01f000, 0x4803c856, 0x59cc0400, - 0x82000d00, 0x0000ff00, 0x840409c0, 0x82040580, - 0x00000033, 0x04020027, 0x0401f986, 0x0400004d, - 0x59cc0a04, 0x48066202, 0x59a8005a, 0x82000480, - 0x00000004, 0x04001047, 0x59cc0006, 0x4803c857, - 0x82000500, 0xffff0000, 0x82000d80, 0x02000000, - 0x04020009, 0x59cc0006, 0x82000500, 0x0000ffff, - 0x0402003c, 0x42027000, 0x00000015, 0x0201f000, - 0x00020bc1, 0x82000d80, 0x01000000, 0x04020035, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x04020031, - 0x59a8005a, 0x82000480, 0x00000008, 0x0400102d, - 0x42027000, 0x00000016, 0x0201f000, 0x00020bc1, - 0x82040580, 0x00000032, 0x04020026, 0x59cc0006, - 0x82000500, 0xffff0000, 0x82000d80, 0x14000000, - 0x04020020, 0x59a8005a, 0x82000480, 0x00000010, - 0x0400101c, 0x42027000, 0x00000038, 0x59cc0001, - 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x4c1c0000, - 0x0401f818, 0x5c003800, 0x04020012, 0x0201f800, - 0x00101f66, 0x0402000f, 0x0201f800, 0x0010452c, - 0x0402000c, 0x0201f800, 0x00107cfe, 0x04000009, - 0x4926601c, 0x4936600a, 0x4a026407, 0x00000004, + 0x59cc0c04, 0x48066202, 0x83380580, 0x0000004c, + 0x04020003, 0x4a026407, 0x00000011, 0x0201f000, + 0x00020bc1, 0x598800b7, 0x4803c857, 0x80000000, + 0x480310b7, 0x1c01f000, 0x42001000, 0x00008049, + 0x59cc1806, 0x800c1930, 0x0201f800, 0x001039ac, + 0x0201f800, 0x00107f02, 0x02000800, 0x001003f5, + 0x040007f1, 0x4926601c, 0x4936600a, 0x83340580, + 0x0010e23c, 0x04020005, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x48026027, 0x4a026407, 0x00000004, + 0x59cc0c04, 0x48066202, 0x4a026403, 0x00000009, + 0x4a02641b, 0x00000009, 0x4a02621b, 0x00002900, + 0x4a026203, 0x00000001, 0x0201f000, 0x00106d1c, + 0x59a8021b, 0x4803c857, 0x8c000508, 0x04000013, + 0x599c0019, 0x8c000510, 0x04020010, 0x59cc0006, + 0x82000500, 0xff000000, 0x82000d80, 0x03000000, + 0x0400000c, 0x82000d80, 0x20000000, 0x04000009, + 0x82000d80, 0x05000000, 0x04000006, 0x82000d80, + 0x21000000, 0x04000003, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fd, 0x59cc2006, + 0x82102500, 0xff000000, 0x9c1021c0, 0x0401f807, + 0x820c1c00, 0x0010cb3e, 0x500c1800, 0x800c0500, + 0x4803c857, 0x1c01f000, 0x40100800, 0x41781800, + 0x82040480, 0x00000020, 0x04001004, 0x800c1800, + 0x40000800, 0x0401f7fb, 0x82040500, 0x0000000f, + 0x82000400, 0x0010c0fc, 0x50000000, 0x8c040d08, + 0x04000002, 0x900001c0, 0x1c01f000, 0x4803c856, + 0x0401fb55, 0x0402000a, 0x0201f800, 0x00101d52, + 0x04020007, 0x59cc0002, 0x82000500, 0xff000000, + 0x82000d80, 0x08000000, 0x04000802, 0x1c01f000, + 0x4803c856, 0x59cc0400, 0x82000d00, 0x0000ff00, + 0x840409c0, 0x82040580, 0x00000033, 0x04020027, + 0x0401f9a4, 0x0400006b, 0x59cc0a04, 0x48066202, + 0x59a8005a, 0x82000480, 0x00000004, 0x04001065, + 0x59cc0006, 0x4803c857, 0x82000500, 0xffff0000, + 0x82000d80, 0x02000000, 0x04020009, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x0402005a, 0x42027000, + 0x00000015, 0x0201f000, 0x00020bc1, 0x82000d80, + 0x01000000, 0x04020053, 0x59cc0006, 0x82000500, + 0x0000ffff, 0x0402004f, 0x59a8005a, 0x82000480, + 0x00000008, 0x0400104b, 0x42027000, 0x00000016, + 0x0201f000, 0x00020bc1, 0x82040580, 0x00000032, + 0x04020044, 0x59cc0006, 0x82000500, 0xffff0000, + 0x82000d80, 0x14000000, 0x0402003e, 0x59a8005a, + 0x82000480, 0x00000010, 0x0400103a, 0x42027000, + 0x00000038, 0x59cc0001, 0x59cc3800, 0x821c3d00, + 0x00ffffff, 0x4c1c0000, 0x0401f836, 0x5c003800, + 0x04020030, 0x0201f800, 0x00101fc9, 0x0402002d, + 0x83440480, 0x000007f0, 0x04001001, 0x0201f800, + 0x00103adb, 0x04000012, 0x4c180000, 0x0201f800, + 0x00104a7c, 0x5c003000, 0x04000010, 0x4c180000, + 0x0401ff68, 0x5c003000, 0x04020009, 0x0201f800, + 0x00104d9c, 0x42026800, 0x0010e23c, 0x481a6802, + 0x42028800, 0x0000ffff, 0x0401f004, 0x0201f800, + 0x00104628, 0x04020013, 0x0201f800, 0x00107ef8, + 0x04000010, 0x4926601c, 0x4936600a, 0x83340580, + 0x0010e23c, 0x04020005, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x48026027, 0x4a026407, 0x00000004, 0x59cc0c04, 0x48066202, 0x0201f000, 0x00020bc1, - 0x42000000, 0x0010cc17, 0x0201f000, 0x0010bc88, + 0x42000000, 0x0010cf17, 0x0201f000, 0x0010bfb3, 0x4803c857, 0x4000d000, 0x401cd800, 0x82003500, - 0x00ffffff, 0x0201f800, 0x00110caf, 0x40c40000, + 0x00ffffff, 0x0201f800, 0x00110fd6, 0x40c40000, 0x82000580, 0x00000001, 0x1c01f000, 0x59a8021b, 0x8c00050e, 0x04000003, 0x8c000502, 0x04000006, 0x59cc0c00, 0x80040910, 0x82040500, 0x0000000f, - 0x0c01f002, 0x1c01f000, 0x00105f8e, 0x00105f8e, - 0x00105f8e, 0x001060ab, 0x00105f8e, 0x00105f90, - 0x00105fb7, 0x00105fba, 0x00105f8e, 0x00105f8e, - 0x00105f8e, 0x00105f8e, 0x00105f8e, 0x00105f8e, - 0x00105f8e, 0x00105f8e, 0x4803c856, 0x1c01f000, + 0x0c01f002, 0x1c01f000, 0x0010615a, 0x0010615a, + 0x0010615a, 0x00106277, 0x0010615a, 0x0010615c, + 0x00106183, 0x00106186, 0x0010615a, 0x0010615a, + 0x0010615a, 0x0010615a, 0x0010615a, 0x0010615a, + 0x0010615a, 0x0010615a, 0x4803c856, 0x1c01f000, 0x0401f90c, 0x04000020, 0x59a8005a, 0x82000480, 0x0000000c, 0x0400101c, 0x59300407, 0x82000580, 0x00000003, 0x04020018, 0x59cc0001, 0x5932680a, @@ -20673,7 +20840,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0000ffff, 0x04000003, 0x80040580, 0x04020006, 0x48066202, 0x42027000, 0x00000046, 0x0201f000, 0x00020bc1, 0x59cc0004, 0x4803c857, 0x42000000, - 0x0010cc18, 0x0201f000, 0x0010bc88, 0x59cc0004, + 0x0010cf18, 0x0201f000, 0x0010bfb3, 0x59cc0004, 0x4803c857, 0x1c01f000, 0x0401f8e2, 0x0400001c, 0x59a8005a, 0x82000480, 0x0000000c, 0x04001018, 0x59300407, 0x82000580, 0x00000003, 0x04020014, @@ -20682,25 +20849,25 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00ffffff, 0x80040580, 0x04020009, 0x0401fa80, 0x04020007, 0x59cc0a04, 0x48066202, 0x42027000, 0x00000045, 0x0201f000, 0x00020bc1, 0x59cc0004, - 0x4803c857, 0x42000000, 0x0010cc18, 0x0201f000, - 0x0010bc88, 0x59cc0004, 0x4803c857, 0x59cc0000, + 0x4803c857, 0x42000000, 0x0010cf18, 0x0201f000, + 0x0010bfb3, 0x59cc0004, 0x4803c857, 0x59cc0000, 0x82000500, 0xff000000, 0x59cc1001, 0x82081500, 0x00ffffff, 0x80080540, 0x4803c857, 0x4817c857, 0x0401fa51, 0x02020800, 0x001003f5, 0x04020016, - 0x0201f800, 0x00101d49, 0x02020800, 0x001003f5, + 0x0201f800, 0x00101d52, 0x02020800, 0x001003f5, 0x04020011, 0x59cc0002, 0x82000500, 0xff000000, 0x82000580, 0x00000000, 0x02020800, 0x001003f5, 0x04020009, 0x82040500, 0x0000000f, 0x82000c80, 0x00000006, 0x02021800, 0x001003f5, 0x04021002, - 0x0c01f003, 0x4803c856, 0x1c01f000, 0x00106009, - 0x0010600b, 0x00106009, 0x00106009, 0x00106073, - 0x00106082, 0x4803c856, 0x1c01f000, 0x59a8005a, + 0x0c01f003, 0x4803c856, 0x1c01f000, 0x001061d5, + 0x001061d7, 0x001061d5, 0x001061d5, 0x0010623f, + 0x0010624e, 0x4803c856, 0x1c01f000, 0x59a8005a, 0x800001c0, 0x02020800, 0x001003f5, 0x040207fa, 0x59cc0802, 0x4807c856, 0x8c040d2e, 0x04020023, - 0x42026000, 0x0011120c, 0x59cc0001, 0x59cc3800, + 0x42026000, 0x0011152c, 0x59cc0001, 0x59cc3800, 0x0401ff50, 0x04020014, 0x0201f800, 0x0002034c, 0x04020011, 0x59cc3800, 0x821c3d00, 0x00ffffff, - 0x0201f800, 0x00101f66, 0x040207e7, 0x4926601c, + 0x0201f800, 0x00101fc9, 0x040207e7, 0x4926601c, 0x4a026407, 0x00000005, 0x4a026203, 0x00000008, 0x4936600a, 0x42027000, 0x00000088, 0x0201f000, 0x00020bc1, 0x4803c857, 0x42028800, 0x0000ffff, @@ -20708,16 +20875,16 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x48026027, 0x0401f7e8, 0x59cc0001, 0x4803c857, 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x4c1c0000, 0x0401ff2c, 0x5c003800, 0x02020800, 0x001003f5, - 0x040207c9, 0x0201f800, 0x00101f66, 0x02020800, - 0x001003f5, 0x040207c4, 0x0201f800, 0x0010452c, + 0x040207c9, 0x0201f800, 0x00101fc9, 0x02020800, + 0x001003f5, 0x040207c4, 0x0201f800, 0x00104628, 0x02020800, 0x001003f5, 0x040207bf, 0x59cc0005, 0x8c000500, 0x04020006, 0x59340200, 0x8c00050e, 0x02020800, 0x001003f5, 0x040207b7, 0x0201f800, - 0x0010492d, 0x04020011, 0x0401f846, 0x02000800, - 0x001003f5, 0x040007b0, 0x42026000, 0x0011120c, + 0x00104a2f, 0x04020011, 0x0401f846, 0x02000800, + 0x001003f5, 0x040007b0, 0x42026000, 0x0011152c, 0x4926601c, 0x4936600a, 0x4a026407, 0x00000002, 0x4a026203, 0x00000008, 0x42027000, 0x00000088, - 0x0201f000, 0x00020bc1, 0x0201f800, 0x00107cfe, + 0x0201f000, 0x00020bc1, 0x0201f800, 0x00107ef8, 0x040007a1, 0x4926601c, 0x4936600a, 0x4a026407, 0x00000004, 0x59cc0c04, 0x48066202, 0x42027000, 0x00000001, 0x0201f000, 0x00020bc1, 0x59cc0802, @@ -20729,11 +20896,11 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x59cc0802, 0x8c040d2e, 0x0400000b, 0x0401f811, 0x04000009, 0x0401f9b6, 0x04020007, 0x59cc0a04, 0x48066202, 0x42027000, 0x0000008a, 0x0201f000, - 0x00020bc1, 0x4933c857, 0x42000000, 0x0010cc17, - 0x0201f000, 0x0010bc88, 0x59cc0a04, 0x0401f002, + 0x00020bc1, 0x4933c857, 0x42000000, 0x0010cf17, + 0x0201f000, 0x0010bfb3, 0x59cc0a04, 0x0401f002, 0x59cc0c04, 0x59a8000d, 0x59a8104f, 0x80080400, 0x80040480, 0x04021008, 0x42001000, 0x0000002c, - 0x0201f800, 0x00106a79, 0x82066400, 0x00111264, + 0x0201f800, 0x00106c7e, 0x82066400, 0x00111584, 0x1c01f000, 0x80000580, 0x0401f7fe, 0x59cc0802, 0x8c040d2e, 0x0402001b, 0x0401ffec, 0x04000019, 0x59300407, 0x82000580, 0x00000006, 0x04020015, @@ -20742,24 +20909,24 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00ffffff, 0x80040580, 0x0402000a, 0x0401f990, 0x04020008, 0x59a8005a, 0x800001c0, 0x04020005, 0x42027000, 0x00000051, 0x0201f000, 0x00020bc1, - 0x59cc0004, 0x4803c857, 0x42000000, 0x0010cc18, - 0x0201f000, 0x0010bc88, 0x4803c856, 0x42003000, + 0x59cc0004, 0x4803c857, 0x42000000, 0x0010cf18, + 0x0201f000, 0x0010bfb3, 0x4803c856, 0x42003000, 0x00000105, 0x0401f001, 0x481bc857, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x41ccc800, 0x4014b800, 0x4018c000, 0x0401f805, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4c580000, 0x58640400, 0x82000500, 0x0000f000, 0x82000580, - 0x0000c000, 0x0400002b, 0x0201f800, 0x00107cfe, + 0x0000c000, 0x0400002b, 0x0201f800, 0x00107ef8, 0x04000028, 0x58640001, 0x58643800, 0x821c3d00, 0x00ffffff, 0x4c1c0000, 0x0401fe7a, 0x5c003800, - 0x04020022, 0x0201f800, 0x00101f66, 0x0402001f, - 0x0201f800, 0x0010452c, 0x0402001c, 0x4936600a, + 0x04020022, 0x0201f800, 0x00101fc9, 0x0402001f, + 0x0201f800, 0x00104628, 0x0402001c, 0x4936600a, 0x0201f800, 0x00100583, 0x04000018, 0x4926601c, 0x492e6018, 0x497a5800, 0x497a5a05, 0x485e5c05, 0x832cac00, 0x00000006, 0x4200b000, 0x00000007, - 0x4064a000, 0x0201f800, 0x0010bd5b, 0x4862641b, + 0x4064a000, 0x0201f800, 0x0010c086, 0x4862641b, 0x4a026403, 0x0000003e, 0x4a026407, 0x00000001, - 0x4a026203, 0x00000001, 0x0201f800, 0x00106b17, + 0x4a026203, 0x00000001, 0x0201f800, 0x00106d1c, 0x5c00b000, 0x1c01f000, 0x0201f800, 0x00020b9d, 0x0401f7fc, 0x4803c856, 0x59cc0400, 0x82000d00, 0x0000ff00, 0x82040500, 0x0000f000, 0x840409c0, @@ -20772,8 +20939,8 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x82000d80, 0x54000000, 0x04000071, 0x82000d80, 0x03000000, 0x0402001b, 0x59a80a1b, 0x8c040d02, 0x0402006b, 0x8c040d08, 0x04020069, 0x82000d80, - 0x03000000, 0x04020004, 0x0201f800, 0x00104fc6, - 0x04000063, 0x0201f800, 0x0010486c, 0x04000063, + 0x03000000, 0x04020004, 0x0201f800, 0x001050f7, + 0x04000063, 0x0201f800, 0x0010496c, 0x04000063, 0x59a80018, 0x800000d0, 0x59a8080f, 0x82040d00, 0x000000ff, 0x80040540, 0x59cc0800, 0x82040d00, 0x00ffffff, 0x80040580, 0x04020034, 0x0401f054, @@ -20784,15 +20951,15 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0401ff38, 0x04000021, 0x59300c03, 0x82040580, 0x00000002, 0x0400003e, 0x82040580, 0x00000051, 0x0400003b, 0x0401f001, 0x59a8021b, 0x8c000514, - 0x04000016, 0x4c580000, 0x0201f800, 0x0010bd9f, + 0x04000016, 0x4c580000, 0x0201f800, 0x0010c0ca, 0x82582480, 0x00000041, 0x5c00b000, 0x0400100f, 0x59cc0800, 0x82040d00, 0x00ffffff, 0x42001000, - 0x0010cf91, 0x58080005, 0x80040580, 0x04000028, + 0x0010d291, 0x58080005, 0x80040580, 0x04000028, 0x801021c0, 0x04000005, 0x80102040, 0x82081400, 0x0000000b, 0x0401f7f8, 0x59a80078, 0x8c00053e, 0x0400001d, 0x59cc0800, 0x82040d00, 0x00ffffff, 0x82040580, 0x0000fc0e, 0x04000019, 0x4c040000, - 0x42000000, 0x0010ccb0, 0x0201f800, 0x0010bc88, + 0x42000000, 0x0010cfb0, 0x0201f800, 0x0010bfb3, 0x0201f800, 0x00020b7b, 0x5c000800, 0x0400000e, 0x59aa6879, 0x4936600a, 0x4a026407, 0x00000012, 0x42027000, 0x000000d2, 0x48066019, 0x4a02601a, @@ -20807,20 +20974,20 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0402001f, 0x59ccb807, 0x9c5cb9c0, 0x825cbd00, 0x00000007, 0x8c5cbd00, 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, 0x00000002, 0x83cc1400, - 0x0000000d, 0x0201f800, 0x00108a31, 0x04020010, + 0x0000000d, 0x0201f800, 0x00108c57, 0x04020010, 0x8c5cbd02, 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, 0x00000000, 0x83cc1400, 0x0000000f, - 0x0201f800, 0x00108a31, 0x04020005, 0x8c5cbd04, + 0x0201f800, 0x00108c57, 0x04020005, 0x8c5cbd04, 0x04000003, 0x82000540, 0x00000001, 0x5c00b000, 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4c5c0000, 0x4c580000, 0x59a8005a, 0x82000580, 0x0000004c, 0x0402001f, 0x59ccb807, 0x9c5cb9c0, 0x825cbd00, 0x00000007, 0x8c5cbd00, 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, 0x00000002, 0x83cc1400, - 0x00000009, 0x0201f800, 0x00108a31, 0x04020010, + 0x00000009, 0x0201f800, 0x00108c57, 0x04020010, 0x8c5cbd02, 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, 0x00000000, 0x83cc1400, 0x0000000b, - 0x0201f800, 0x00108a31, 0x04020005, 0x8c5cbd04, + 0x0201f800, 0x00108c57, 0x04020005, 0x8c5cbd04, 0x04000003, 0x82000540, 0x00000001, 0x5c00b000, 0x5c00b800, 0x1c01f000, 0x4803c857, 0x4c580000, 0x40003000, 0x42002000, 0x000007f0, 0x4200b000, @@ -20841,2313 +21008,2332 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00000005, 0x1c01f000, 0x59c80000, 0x84000558, 0x84000512, 0x48039000, 0x1c01f000, 0x59cc0800, 0x59340013, 0x80040580, 0x82000500, 0x00ffffff, - 0x1c01f000, 0x4a032824, 0x000003e8, 0x4a032802, - 0x00111264, 0x4a032800, 0x00000000, 0x4a032808, - 0x00107229, 0x42000000, 0x00000005, 0x83947c00, - 0x00000009, 0x49787801, 0x4a007804, 0x001070dc, - 0x823c7c00, 0x00000005, 0x80000040, 0x040207fa, - 0x4a032823, 0xffff0000, 0x4201d000, 0x00000064, - 0x0401fa12, 0x4201d000, 0x000186a0, 0x0401f221, - 0x00000000, 0x00000005, 0x0000000a, 0x0000000f, - 0x00000014, 0x4d300000, 0x4d2c0000, 0x4d340000, - 0x4d400000, 0x4cfc0000, 0x4d380000, 0x4d3c0000, - 0x4d440000, 0x4d4c0000, 0x4d480000, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x4cc80000, 0x4ccc0000, - 0x0201f800, 0x00020988, 0x5c019800, 0x5c019000, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c029000, - 0x5c029800, 0x5c028800, 0x5c027800, 0x5c027000, - 0x5c01f800, 0x5c028000, 0x5c026800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x59940031, 0x59940832, - 0x80040480, 0x48032832, 0x04001002, 0x04020034, - 0x59bc00e4, 0x8c000530, 0x04000009, 0x4a030000, - 0x00000000, 0x4803c856, 0x4a0378e4, 0x02000000, - 0x4a032832, 0x000004b0, 0x0401f029, 0x42000800, - 0x00000100, 0x80040840, 0x040007f5, 0x0201f800, - 0x0010bdab, 0x040007fc, 0x0201f800, 0x00106c3c, - 0x4df00000, 0x4d180000, 0x42023000, 0x00000005, - 0x0201f800, 0x00100e45, 0x5c023000, 0x0201f800, - 0x0010064a, 0x42000800, 0x00007a00, 0x58040015, - 0x82000500, 0xffff8fff, 0x59a8107a, 0x80080540, - 0x48000815, 0x4a030000, 0x00000000, 0x497b2832, - 0x4a0378e4, 0x02800000, 0x0201f800, 0x00100ea3, - 0x5c03e000, 0x02000800, 0x00106c29, 0x42000000, - 0x0010ccb6, 0x0201f800, 0x0010bc88, 0x1c01f000, - 0x59940004, 0x80000540, 0x0402000a, 0x5994002f, - 0x80040400, 0x02001800, 0x0010032e, 0x48032804, - 0x480b2805, 0x4a032803, 0x0000000a, 0x80000580, - 0x1c01f000, 0x59940029, 0x80000540, 0x0402000a, + 0x1c01f000, 0x82140500, 0x0000f000, 0x04000006, + 0x82000c80, 0x00002000, 0x0402100a, 0x80000580, + 0x1c01f000, 0x59cc0400, 0x82000500, 0x0000ff00, + 0x82000580, 0x00008100, 0x040007fa, 0x0401f014, + 0x4817c857, 0x82140500, 0x000003ff, 0x04020007, + 0x59cc0400, 0x82000500, 0x0000ff00, 0x82000580, + 0x00008100, 0x0402000a, 0x42000000, 0x0010cf7d, + 0x0201f800, 0x0010bfb3, 0x0401fe5c, 0x4803c856, + 0x82000540, 0x00000001, 0x0401f7e6, 0x41780000, + 0x0401f7e4, 0x0201f800, 0x001050f7, 0x04000010, + 0x59c400a4, 0x4803c857, 0x82000500, 0x0000000f, + 0x82000580, 0x0000000a, 0x04020009, 0x497b505a, + 0x59c400a3, 0x82000540, 0x00080000, 0x480388a3, + 0x82000500, 0xfff7ffff, 0x480388a3, 0x4817c856, + 0x0201f000, 0x0010bef8, 0x4a032824, 0x000003e8, + 0x4a032802, 0x00111584, 0x4a032800, 0x00000000, + 0x4a032808, 0x0010742e, 0x42000000, 0x00000005, + 0x83947c00, 0x00000009, 0x49787801, 0x4a007804, + 0x001072e1, 0x823c7c00, 0x00000005, 0x80000040, + 0x040207fa, 0x4a032823, 0xffff0000, 0x4201d000, + 0x00000064, 0x0401fa12, 0x4201d000, 0x000186a0, + 0x0401f221, 0x00000000, 0x00000005, 0x0000000a, + 0x0000000f, 0x00000014, 0x4d300000, 0x4d2c0000, + 0x4d340000, 0x4d400000, 0x4cfc0000, 0x4d380000, + 0x4d3c0000, 0x4d440000, 0x4d4c0000, 0x4d480000, + 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4cc80000, + 0x4ccc0000, 0x0201f800, 0x00020988, 0x5c019800, + 0x5c019000, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x5c029000, 0x5c029800, 0x5c028800, 0x5c027800, + 0x5c027000, 0x5c01f800, 0x5c028000, 0x5c026800, + 0x5c025800, 0x5c026000, 0x1c01f000, 0x59940031, + 0x59940832, 0x80040480, 0x48032832, 0x04001002, + 0x04020034, 0x59bc00e4, 0x8c000530, 0x04000009, + 0x4a030000, 0x00000000, 0x4803c856, 0x4a0378e4, + 0x02000000, 0x4a032832, 0x000004b0, 0x0401f029, + 0x42000800, 0x00000100, 0x80040840, 0x040007f5, + 0x0201f800, 0x0010c0d6, 0x040007fc, 0x0201f800, + 0x00106e41, 0x4df00000, 0x4d180000, 0x42023000, + 0x00000005, 0x0201f800, 0x00100e46, 0x5c023000, + 0x0201f800, 0x0010064a, 0x42000800, 0x00007a00, + 0x58040015, 0x82000500, 0xffff8fff, 0x59a8107a, + 0x80080540, 0x48000815, 0x4a030000, 0x00000000, + 0x497b2832, 0x4a0378e4, 0x02800000, 0x0201f800, + 0x00100ea4, 0x5c03e000, 0x02000800, 0x00106e2e, + 0x42000000, 0x0010cfb6, 0x0201f800, 0x0010bfb3, + 0x1c01f000, 0x59940004, 0x80000540, 0x0402000a, 0x5994002f, 0x80040400, 0x02001800, 0x0010032e, - 0x48032829, 0x480b282a, 0x4a032828, 0x00000001, - 0x80000580, 0x1c01f000, 0x40680800, 0x406c1000, - 0x5994002c, 0x80000540, 0x0402000a, 0x5994002f, - 0x80040400, 0x02001800, 0x0010032e, 0x4803282c, - 0x480b282d, 0x4a03282b, 0x0000000a, 0x80000580, - 0x1c01f000, 0x4c000000, 0x59940005, 0x80080580, - 0x04020003, 0x497b2804, 0x497b2805, 0x5c000000, - 0x1c01f000, 0x40681000, 0x0401fff7, 0x1c01f000, - 0x4c000000, 0x5994002a, 0x80080580, 0x04020003, - 0x497b2829, 0x497b282a, 0x5c000000, 0x1c01f000, - 0x4c000000, 0x5994002d, 0x80080580, 0x04020003, - 0x497b282c, 0x497b282d, 0x5c000000, 0x1c01f000, - 0x4937c857, 0x48ebc857, 0x59340203, 0x80e80480, - 0x04001002, 0x48ea6a03, 0x1c01f000, 0x4d440000, - 0x42007800, 0x00000010, 0x59968801, 0x0201f800, - 0x0002034c, 0x04020059, 0x59341a03, 0x800c1840, - 0x04001017, 0x59940031, 0x800c0480, 0x04000003, - 0x48026a03, 0x04021012, 0x5934000f, 0x497a6a03, - 0x80000540, 0x0400004d, 0x5934000b, 0x80001120, - 0x82000500, 0x0000ffff, 0x80080480, 0x04001004, - 0x4a026a03, 0x00000001, 0x0401f005, 0x4c3c0000, - 0x0201f800, 0x0002035a, 0x5c007800, 0x4d2c0000, - 0x41781800, 0x5934000f, 0x80025d40, 0x0400003a, - 0x592c0004, 0x80000d40, 0x04000006, 0x59940031, - 0x80040480, 0x48025804, 0x04001007, 0x04000006, - 0x412c1800, 0x592c0000, 0x80025d40, 0x0400002e, - 0x0401f7f4, 0x592c2000, 0x497a5800, 0x800c19c0, - 0x04020009, 0x59340010, 0x812c0580, 0x04020004, - 0x497a680f, 0x497a6810, 0x0401f008, 0x4812680f, - 0x0401f006, 0x48101800, 0x59340010, 0x812c0580, - 0x04020002, 0x480e6810, 0x592c0205, 0x82000500, - 0x000000ff, 0x82000580, 0x00000012, 0x04000004, - 0x82000580, 0x00000060, 0x04020004, 0x4a025a07, - 0x0000000b, 0x0401f008, 0x4a025a05, 0x00000103, - 0x4a025a07, 0x00000006, 0x497a580a, 0x4a025c07, - 0x0000ffff, 0x4c0c0000, 0x4c100000, 0x0201f800, - 0x000203ef, 0x5c002000, 0x5c001800, 0x40100000, - 0x0401f7d2, 0x5c025800, 0x81468800, 0x83440480, - 0x00000800, 0x04021007, 0x803c7840, 0x040207a0, - 0x49472801, 0x5c028800, 0x5c03e000, 0x1c01f000, - 0x4a032800, 0x00000002, 0x497b2801, 0x0401f7fa, - 0x42007800, 0x00000010, 0x59966002, 0x59300205, - 0x80000d40, 0x04000006, 0x59940031, 0x80040480, - 0x48026205, 0x0400102d, 0x0400002c, 0x59300006, - 0x80000d40, 0x04000014, 0x59b800e4, 0x8c000524, - 0x04020011, 0x4a0370e4, 0x00030000, 0x40000000, - 0x59b800e4, 0x8c000524, 0x04000004, 0x4a0370e4, - 0x00020000, 0x0401f008, 0x59940031, 0x80040480, - 0x48026006, 0x4a0370e4, 0x00020000, 0x0400101c, - 0x0400001b, 0x83326400, 0x0000002c, 0x49332802, - 0x41540000, 0x81300480, 0x04021005, 0x803c7840, - 0x040207db, 0x5c03e000, 0x1c01f000, 0x59940030, - 0x48032831, 0x4a032802, 0x00111264, 0x497b2830, - 0x80000540, 0x0400000f, 0x4a032800, 0x00000001, - 0x5c03e000, 0x1c01f000, 0x4c3c0000, 0x0201f800, - 0x00109859, 0x5c007800, 0x0401f7d1, 0x4c3c0000, - 0x0201f800, 0x001093aa, 0x5c007800, 0x0401f7e2, - 0x4a032800, 0x00000000, 0x5c03e000, 0x1c01f000, - 0x59a80859, 0x8c040d30, 0x04020029, 0x8c040d32, - 0x0400000f, 0x59a80050, 0x81640480, 0x04001019, - 0x59a8000b, 0x81500580, 0x04000005, 0x59a8004e, - 0x59a8104d, 0x80080580, 0x04020012, 0x900411c0, - 0x82081500, 0x00007000, 0x0401f012, 0x82040500, - 0x0000001f, 0x04000016, 0x80040840, 0x82040500, - 0x0000001f, 0x04000003, 0x48075059, 0x0401f010, - 0x900401c0, 0x82000500, 0x0000001f, 0x80040d40, - 0x900401c0, 0x80040580, 0x82001500, 0x00007000, - 0x82040500, 0xffff8fff, 0x80080540, 0x48035059, - 0x80081114, 0x0201f800, 0x00100463, 0x1c01f000, - 0x4a032807, 0x000007d0, 0x4a032806, 0x0000000a, - 0x1c01f000, 0x42000800, 0x00000004, 0x83180480, - 0x00000005, 0x02021800, 0x0010032e, 0x83947c00, - 0x00000009, 0x83180400, 0x00106270, 0x50000000, - 0x803c7c00, 0x4a007801, 0x000001f4, 0x48047802, - 0x4a007800, 0x0000000a, 0x49787803, 0x1c01f000, + 0x48032804, 0x480b2805, 0x4a032803, 0x0000000a, + 0x80000580, 0x1c01f000, 0x59940029, 0x80000540, + 0x0402000a, 0x5994002f, 0x80040400, 0x02001800, + 0x0010032e, 0x48032829, 0x480b282a, 0x4a032828, + 0x00000001, 0x80000580, 0x1c01f000, 0x40680800, + 0x406c1000, 0x5994002c, 0x80000540, 0x0402000a, + 0x5994002f, 0x80040400, 0x02001800, 0x0010032e, + 0x4803282c, 0x480b282d, 0x4a03282b, 0x0000000a, + 0x80000580, 0x1c01f000, 0x4c000000, 0x59940005, + 0x80080580, 0x04020003, 0x497b2804, 0x497b2805, + 0x5c000000, 0x1c01f000, 0x40681000, 0x0401fff7, + 0x1c01f000, 0x4c000000, 0x5994002a, 0x80080580, + 0x04020003, 0x497b2829, 0x497b282a, 0x5c000000, + 0x1c01f000, 0x4c000000, 0x5994002d, 0x80080580, + 0x04020003, 0x497b282c, 0x497b282d, 0x5c000000, + 0x1c01f000, 0x4937c857, 0x48ebc857, 0x59340203, + 0x80e80480, 0x04001002, 0x48ea6a03, 0x1c01f000, + 0x4d440000, 0x42007800, 0x00000010, 0x59968801, + 0x0201f800, 0x0002034c, 0x04020059, 0x59341a03, + 0x800c1840, 0x04001017, 0x59940031, 0x800c0480, + 0x04000003, 0x48026a03, 0x04021012, 0x5934000f, + 0x497a6a03, 0x80000540, 0x0400004d, 0x5934000b, + 0x80001120, 0x82000500, 0x0000ffff, 0x80080480, + 0x04001004, 0x4a026a03, 0x00000001, 0x0401f005, + 0x4c3c0000, 0x0201f800, 0x0002035a, 0x5c007800, + 0x4d2c0000, 0x41781800, 0x5934000f, 0x80025d40, + 0x0400003a, 0x592c0004, 0x80000d40, 0x04000006, + 0x59940031, 0x80040480, 0x48025804, 0x04001007, + 0x04000006, 0x412c1800, 0x592c0000, 0x80025d40, + 0x0400002e, 0x0401f7f4, 0x592c2000, 0x497a5800, + 0x800c19c0, 0x04020009, 0x59340010, 0x812c0580, + 0x04020004, 0x497a680f, 0x497a6810, 0x0401f008, + 0x4812680f, 0x0401f006, 0x48101800, 0x59340010, + 0x812c0580, 0x04020002, 0x480e6810, 0x592c0205, + 0x82000500, 0x000000ff, 0x82000580, 0x00000012, + 0x04000004, 0x82000580, 0x00000060, 0x04020004, + 0x4a025a07, 0x0000000b, 0x0401f008, 0x4a025a05, + 0x00000103, 0x4a025a07, 0x00000006, 0x497a580a, + 0x4a025c07, 0x0000ffff, 0x4c0c0000, 0x4c100000, + 0x0201f800, 0x000203ef, 0x5c002000, 0x5c001800, + 0x40100000, 0x0401f7d2, 0x5c025800, 0x81468800, + 0x83440480, 0x00000800, 0x04021007, 0x803c7840, + 0x040207a0, 0x49472801, 0x5c028800, 0x5c03e000, + 0x1c01f000, 0x4a032800, 0x00000002, 0x497b2801, + 0x0401f7fa, 0x42007800, 0x00000010, 0x59966002, + 0x59300205, 0x80000d40, 0x04000006, 0x59940031, + 0x80040480, 0x48026205, 0x0400102d, 0x0400002c, + 0x59300006, 0x80000d40, 0x04000014, 0x59b800e4, + 0x8c000524, 0x04020011, 0x4a0370e4, 0x00030000, + 0x40000000, 0x59b800e4, 0x8c000524, 0x04000004, + 0x4a0370e4, 0x00020000, 0x0401f008, 0x59940031, + 0x80040480, 0x48026006, 0x4a0370e4, 0x00020000, + 0x0400101c, 0x0400001b, 0x83326400, 0x0000002c, + 0x49332802, 0x41540000, 0x81300480, 0x04021005, + 0x803c7840, 0x040207db, 0x5c03e000, 0x1c01f000, + 0x59940030, 0x48032831, 0x4a032802, 0x00111584, + 0x497b2830, 0x80000540, 0x0400000f, 0x4a032800, + 0x00000001, 0x5c03e000, 0x1c01f000, 0x4c3c0000, + 0x0201f800, 0x00109a91, 0x5c007800, 0x0401f7d1, + 0x4c3c0000, 0x0201f800, 0x001095de, 0x5c007800, + 0x0401f7e2, 0x4a032800, 0x00000000, 0x5c03e000, + 0x1c01f000, 0x59a80859, 0x8c040d30, 0x04020029, + 0x8c040d32, 0x0400000f, 0x59a80050, 0x81640480, + 0x04001019, 0x59a8000b, 0x81500580, 0x04000005, + 0x59a8004e, 0x59a8104d, 0x80080580, 0x04020012, + 0x900411c0, 0x82081500, 0x00007000, 0x0401f012, + 0x82040500, 0x0000001f, 0x04000016, 0x80040840, + 0x82040500, 0x0000001f, 0x04000003, 0x48075059, + 0x0401f010, 0x900401c0, 0x82000500, 0x0000001f, + 0x80040d40, 0x900401c0, 0x80040580, 0x82001500, + 0x00007000, 0x82040500, 0xffff8fff, 0x80080540, + 0x48035059, 0x80081114, 0x0201f800, 0x00100463, + 0x1c01f000, 0x4a032807, 0x000007d0, 0x4a032806, + 0x0000000a, 0x1c01f000, 0x42000800, 0x00000004, 0x83180480, 0x00000005, 0x02021800, 0x0010032e, - 0x83947c00, 0x00000009, 0x83180400, 0x00106270, - 0x50000000, 0x803c7c00, 0x583c0002, 0x80000040, - 0x48007802, 0x04000005, 0x4a007801, 0x000001f4, - 0x4a007800, 0x0000000a, 0x1c01f000, 0x83180480, - 0x00000005, 0x02021800, 0x0010032e, 0x83947c00, - 0x00000009, 0x83180400, 0x00106270, 0x50000000, - 0x803c7c00, 0x49787801, 0x1c01f000, 0x40680800, - 0x406c1000, 0x0401f802, 0x1c01f000, 0x4807c857, + 0x83947c00, 0x00000009, 0x83180400, 0x00106475, + 0x50000000, 0x803c7c00, 0x4a007801, 0x000001f4, + 0x48047802, 0x4a007800, 0x0000000a, 0x49787803, + 0x1c01f000, 0x83180480, 0x00000005, 0x02021800, + 0x0010032e, 0x83947c00, 0x00000009, 0x83180400, + 0x00106475, 0x50000000, 0x803c7c00, 0x583c0002, + 0x80000040, 0x48007802, 0x04000005, 0x4a007801, + 0x000001f4, 0x4a007800, 0x0000000a, 0x1c01f000, + 0x83180480, 0x00000005, 0x02021800, 0x0010032e, + 0x83947c00, 0x00000009, 0x83180400, 0x00106475, + 0x50000000, 0x803c7c00, 0x49787801, 0x1c01f000, + 0x40680800, 0x406c1000, 0x0401f802, 0x1c01f000, + 0x4807c857, 0x480bc857, 0x5994002f, 0x80040400, + 0x02001800, 0x0010032e, 0x48032804, 0x480b2805, + 0x4a032803, 0x0000000a, 0x1c01f000, 0x4807c857, 0x480bc857, 0x5994002f, 0x80040400, 0x02001800, - 0x0010032e, 0x48032804, 0x480b2805, 0x4a032803, - 0x0000000a, 0x1c01f000, 0x4807c857, 0x480bc857, + 0x0010032e, 0x48032826, 0x480b2827, 0x4a032825, + 0x0000000a, 0x1c01f000, 0x4c000000, 0x59940027, + 0x80080580, 0x04020003, 0x48032826, 0x48032827, + 0x5c000000, 0x1c01f000, 0x4807c857, 0x480bc857, 0x5994002f, 0x80040400, 0x02001800, 0x0010032e, - 0x48032826, 0x480b2827, 0x4a032825, 0x0000000a, - 0x1c01f000, 0x4c000000, 0x59940027, 0x80080580, - 0x04020003, 0x48032826, 0x48032827, 0x5c000000, - 0x1c01f000, 0x4807c857, 0x480bc857, 0x5994002f, - 0x80040400, 0x02001800, 0x0010032e, 0x4803282c, - 0x480b282d, 0x4a03282b, 0x0000000a, 0x1c01f000, - 0x80e9d1c0, 0x0400000e, 0x0401f832, 0x04025000, - 0x4203e000, 0x80000000, 0x40e81000, 0x41780800, - 0x42000000, 0x00000064, 0x0201f800, 0x00106a98, - 0x5994002e, 0x80080400, 0x4803282e, 0x1c01f000, - 0x42001000, 0x00104ee2, 0x0401fe8b, 0x42001000, - 0x00104ed1, 0x0401ffd8, 0x42001000, 0x00104038, - 0x0401fe85, 0x42001000, 0x001040ba, 0x0401fe82, - 0x42001000, 0x00104011, 0x0401fe7f, 0x42001000, - 0x001040f1, 0x0401f68f, 0x4203e000, 0x70000000, - 0x4203e000, 0xb0300000, 0x40ebf800, 0x42000000, - 0x0000003c, 0x04004004, 0x80000040, 0x040207fe, - 0x0401f007, 0x4203e000, 0x70000000, 0x42000000, - 0x0010cc3e, 0x0201f800, 0x0010bc88, 0x1c01f000, - 0x4203e000, 0x80000000, 0x4203e000, 0xb0400000, - 0x40ebf800, 0x42000000, 0x0000003c, 0x04005004, - 0x80000040, 0x040207fe, 0x0401f007, 0x4203e000, - 0x80000000, 0x42000000, 0x0010cc3f, 0x0201f800, - 0x0010bc88, 0x1c01f000, 0x59a8080d, 0x59a80251, - 0x80040480, 0x599c0a02, 0x800409c0, 0x04020002, - 0x80040800, 0x80041480, 0x04001002, 0x40000800, - 0x4807504f, 0x59a8100d, 0x40040000, 0x800acc80, - 0x4967500d, 0x49675050, 0x59aaa80b, 0x41640800, - 0x42001000, 0x0000002c, 0x0201f800, 0x00106a79, - 0x8206a400, 0x00111264, 0x4953504c, 0x4152b000, - 0x42006000, 0x0010df71, 0x4a006005, 0x0000012c, - 0x4a006006, 0xda10da10, 0x4a006009, 0x00000012, - 0x4a00600a, 0x0010df71, 0x4a00600b, 0x00100f05, - 0x599c0014, 0x48006012, 0x599c0015, 0x48006013, - 0x42006000, 0x001111b4, 0x4a006203, 0x00000008, - 0x4a006407, 0x00000006, 0x4a006002, 0xffff0000, - 0x4a006009, 0x0010df71, 0x4a006015, 0x0010df71, - 0x599c0014, 0x48006016, 0x599c0015, 0x48006017, - 0x599c0413, 0x48006018, 0x49506019, 0x4954601a, - 0x59a8004f, 0x4800601b, 0x4a00601c, 0x0010c7cc, - 0x4a00601d, 0x0010c7cd, 0x4a00601e, 0x0010c7ce, - 0x42000000, 0xb0000000, 0x42000800, 0x001111b4, - 0x0201f800, 0x0002010e, 0x1c01f000, 0x82000d00, - 0x000000c0, 0x04000004, 0x82040d80, 0x000000c0, - 0x04020055, 0x82000d00, 0x00002020, 0x59300415, - 0x84000512, 0x82040d80, 0x00002020, 0x0400000b, - 0x8c000514, 0x0402000f, 0x48026415, 0x813e79c0, - 0x02020000, 0x00020ac9, 0x42027000, 0x00000043, - 0x0201f000, 0x00020bc1, 0x5932680a, 0x59340a00, - 0x8c040d0a, 0x040007f3, 0x84000552, 0x0401f7f1, - 0x84000514, 0x592c080e, 0x48066016, 0x0401f7ef, - 0x5932680a, 0x59340a00, 0x8c040d0a, 0x02000000, - 0x00020adc, 0x59300c15, 0x84040d52, 0x48066415, - 0x0201f000, 0x00020adc, 0x0201f800, 0x0002011a, - 0x813e79c0, 0x02020000, 0x00020ac9, 0x0201f000, - 0x00020af1, 0x8c00051e, 0x02000000, 0x00020afd, - 0x82000d00, 0x00002020, 0x82040d80, 0x00002020, - 0x04000014, 0x82000500, 0x000000c0, 0x82000d80, - 0x00000080, 0x04000008, 0x813e79c0, 0x02020000, - 0x00020ac9, 0x42027000, 0x00000041, 0x0201f000, - 0x00020bc1, 0x813e79c0, 0x02020000, 0x00020ac9, - 0x42027000, 0x00000043, 0x0201f000, 0x00020bc1, - 0x5932680a, 0x59340a00, 0x8c040d0a, 0x040007ea, - 0x59300c15, 0x84040d52, 0x48066415, 0x0401f7e6, - 0x492fc857, 0x42000800, 0x00000006, 0x0201f000, - 0x00020af8, 0x492fc857, 0x42000800, 0x00000004, - 0x0201f000, 0x00020af8, 0x4807c856, 0x59240206, - 0x800409c0, 0x04000003, 0x80080540, 0x0401f002, - 0x80080500, 0x48024a06, 0x1c01f000, 0x4a030800, - 0x00000000, 0x4a030802, 0x00000001, 0x497b0803, - 0x497b0804, 0x1c01f000, 0x59840002, 0x8c000500, - 0x04000004, 0x84000500, 0x4a030800, 0x00000001, - 0x84000544, 0x84000506, 0x48030802, 0x82000d00, - 0x0fffffff, 0x42000000, 0x90000000, 0x0201f800, - 0x001008c9, 0x59a80050, 0x82000480, 0x00000007, - 0x48035050, 0x80000580, 0x42000800, 0x0010c870, - 0x48000800, 0x48000801, 0x1c01f000, 0x59a80050, - 0x82000400, 0x00000007, 0x48035050, 0x1c01f000, - 0x83640480, 0x00000008, 0x0400101b, 0x58c80a03, - 0x80000580, 0x82000400, 0x00000008, 0x80040840, - 0x040207fd, 0x815c0480, 0x04001013, 0x4200b000, - 0x00000007, 0x0201f800, 0x00020b7b, 0x4a026203, - 0x00000004, 0x4a026407, 0x00000009, 0x4a026203, - 0x00000004, 0x4a026008, 0x00000101, 0x0401f809, - 0x0401f880, 0x8058b040, 0x040207f3, 0x80000580, - 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fd, - 0x0201f800, 0x00100583, 0x492e6009, 0x58c80a03, - 0x4a025a05, 0x0000002c, 0x497a5800, 0x497a5801, - 0x497a5c05, 0x497a5c07, 0x497a5806, 0x4a025a09, - 0x00000005, 0x4a025a08, 0x00000002, 0x58c80201, - 0x48025c05, 0x58c80202, 0x48025c08, 0x58c80204, - 0x48025c09, 0x4a02580e, 0x0000ffff, 0x80040840, - 0x0400000c, 0x412c2000, 0x0201f800, 0x00100583, - 0x4a025a05, 0x0000000a, 0x497a5c05, 0x48125800, - 0x492c2001, 0x412c2000, 0x80040840, 0x040207f7, - 0x1c01f000, 0x4d7c0000, 0x4202f800, 0x00000010, - 0x4df00000, 0x4203e000, 0x50000000, 0x59847803, - 0x803c79c0, 0x0400001e, 0x4c5c0000, 0x583cb809, - 0x585c3409, 0x801831c0, 0x0400000b, 0x0401f84a, - 0x04000016, 0x42001000, 0x0010c870, 0x0401f87f, - 0x04000012, 0x0201f800, 0x0010056e, 0x0400000f, - 0x492cb806, 0x585c0006, 0x80000540, 0x02000800, - 0x0010032e, 0x0401f830, 0x585c5409, 0x0401f80b, - 0x5c00b800, 0x5c03e000, 0x817ef840, 0x040207e1, - 0x5c02f800, 0x1c01f000, 0x5c00b800, 0x5c03e000, - 0x5c02f800, 0x1c01f000, 0x4803c856, 0x405c6000, - 0x802851c0, 0x04000018, 0x585c0205, 0x82000d00, - 0x0000000f, 0x82040c00, 0x00100f0a, 0x50044000, - 0x4c600000, 0x4c640000, 0x4d040000, 0x4020c000, - 0x40320800, 0x5984c804, 0x4c280000, 0x0401f93b, - 0x5c005000, 0x40604000, 0x41046000, 0x0201f800, - 0x00100ee8, 0x040207f6, 0x5c020800, 0x5c00c800, - 0x5c00c000, 0x58c80204, 0x4800bc09, 0x0201f800, - 0x0002011a, 0x4a026008, 0x00000101, 0x497a600a, - 0x0401f055, 0x4803c856, 0x59840003, 0x80026540, - 0x04000003, 0x59300000, 0x48030803, 0x1c01f000, - 0x4803c856, 0x59840003, 0x48026000, 0x49330803, - 0x1c01f000, 0x58cc0805, 0x40180000, 0x80040480, - 0x0400100d, 0x82cc0580, 0x0010c865, 0x02020800, - 0x0010032e, 0x58c80205, 0x80040480, 0x0400101d, - 0x82000540, 0x00000001, 0x1c01f000, 0x80003580, - 0x0401f7fe, 0x82cc0580, 0x0010c865, 0x02020800, - 0x0010032e, 0x58c80400, 0x8c000504, 0x040007f8, - 0x58c8040b, 0x8c00051e, 0x040007f5, 0x8c000500, - 0x040207f3, 0x84000540, 0x4801940b, 0x42000000, - 0x0010cc05, 0x0201f800, 0x0010bc88, 0x42001000, - 0x00008026, 0x0201f800, 0x001038bc, 0x0401f7e8, - 0x58c8040b, 0x8c00051e, 0x040007e2, 0x8c000502, - 0x040207e0, 0x84000542, 0x4801940b, 0x42000000, - 0x0010cc04, 0x0201f800, 0x0010bc88, 0x42001000, - 0x00008025, 0x42001800, 0x00000000, 0x0201f800, - 0x001038bc, 0x0401f7d3, 0x4803c856, 0x58080000, - 0x42001800, 0x00000007, 0x58080801, 0x80040480, - 0x04020004, 0x400c0000, 0x80000540, 0x0401f005, - 0x04001003, 0x800c0480, 0x0401f002, 0x80000080, - 0x1c01f000, 0x4803c856, 0x59300009, 0x80000d40, - 0x02000800, 0x0010032e, 0x58040006, 0x80000540, - 0x02000800, 0x0010032e, 0x59300008, 0x82000500, - 0x00000101, 0x82000580, 0x00000101, 0x02020800, - 0x0010032e, 0x42001000, 0x0010c870, 0x58080801, - 0x82040400, 0x0010c872, 0x497a6415, 0x4a026016, - 0x0000ffff, 0x45300000, 0x80040800, 0x82040480, - 0x00000008, 0x04001002, 0x80000d80, 0x48041001, - 0x82040400, 0x0010c872, 0x45780000, 0x1c01f000, - 0x4933c857, 0x59300809, 0x800409c0, 0x02000800, - 0x0010032e, 0x4d2c0000, 0x58065806, 0x812e59c0, - 0x02020800, 0x00100594, 0x49780806, 0x40065800, - 0x0201f800, 0x0010059d, 0x5c025800, 0x4d300000, - 0x0201f800, 0x00020b9d, 0x5c026000, 0x1c01f000, - 0x0401f807, 0x42018800, 0x00000001, 0x04000003, - 0x42018800, 0x00000000, 0x1c01f000, 0x59300407, - 0x82000580, 0x00000009, 0x04020006, 0x59300008, - 0x8c000510, 0x04000003, 0x80000580, 0x1c01f000, - 0x82000540, 0x00000001, 0x1c01f000, 0x59840802, - 0x8c040d04, 0x1c01f000, 0x4803c856, 0x59840802, - 0x84040d04, 0x84040d40, 0x4a030800, 0x00000000, - 0x48070802, 0x82040d00, 0x0fffffff, 0x42000000, - 0x90000000, 0x0201f000, 0x001008c9, 0x4807c857, - 0x4805980a, 0x49799801, 0x49799803, 0x49799806, - 0x49799807, 0x49799808, 0x49799805, 0x49799809, - 0x0401f8c8, 0x0400000a, 0x0401f8ea, 0x04000008, - 0x48359800, 0x48359802, 0x48359806, 0x4a019804, - 0x00000001, 0x4a019807, 0x00000006, 0x1c01f000, - 0x4807c857, 0x58cc1007, 0x40040000, 0x80080480, - 0x04021020, 0x4c040000, 0x4c080000, 0x0401f8d9, - 0x5c001000, 0x5c000800, 0x0400001c, 0x58cc0006, - 0x80006540, 0x0402000b, 0x48359800, 0x48359802, - 0x48359806, 0x49799801, 0x49799803, 0x49786801, - 0x49786800, 0x49799804, 0x49799807, 0x0401f005, - 0x48306801, 0x48346000, 0x48359806, 0x49786800, - 0x58cc0004, 0x58cc1007, 0x80000000, 0x82081400, - 0x00000006, 0x48019804, 0x48099807, 0x0401f7df, + 0x4803282c, 0x480b282d, 0x4a03282b, 0x0000000a, + 0x1c01f000, 0x80e9d1c0, 0x0400000e, 0x0401f832, + 0x04025000, 0x4203e000, 0x80000000, 0x40e81000, + 0x41780800, 0x42000000, 0x00000064, 0x0201f800, + 0x00106c9d, 0x5994002e, 0x80080400, 0x4803282e, + 0x1c01f000, 0x42001000, 0x00105013, 0x0401fe8b, + 0x42001000, 0x00105002, 0x0401ffd8, 0x42001000, + 0x00104131, 0x0401fe85, 0x42001000, 0x001041b3, + 0x0401fe82, 0x42001000, 0x0010410a, 0x0401fe7f, + 0x42001000, 0x001041ea, 0x0401f68f, 0x4203e000, + 0x70000000, 0x4203e000, 0xb0300000, 0x40ebf800, + 0x42000000, 0x0000003c, 0x04004004, 0x80000040, + 0x040207fe, 0x0401f007, 0x4203e000, 0x70000000, + 0x42000000, 0x0010cf3e, 0x0201f800, 0x0010bfb3, + 0x1c01f000, 0x4203e000, 0x80000000, 0x4203e000, + 0xb0400000, 0x40ebf800, 0x42000000, 0x0000003c, + 0x04005004, 0x80000040, 0x040207fe, 0x0401f007, + 0x4203e000, 0x80000000, 0x42000000, 0x0010cf3f, + 0x0201f800, 0x0010bfb3, 0x1c01f000, 0x59a8080d, + 0x59a80251, 0x80040480, 0x599c0a02, 0x800409c0, + 0x04020002, 0x80040800, 0x80041480, 0x04001002, + 0x40000800, 0x4807504f, 0x59a8100d, 0x40040000, + 0x800acc80, 0x4967500d, 0x49675050, 0x59aaa80b, + 0x41640800, 0x42001000, 0x0000002c, 0x0201f800, + 0x00106c7e, 0x8206a400, 0x00111584, 0x4953504c, + 0x4152b000, 0x42006000, 0x0010e271, 0x4a006005, + 0x0000012c, 0x4a006006, 0xda10da10, 0x4a006009, + 0x00000012, 0x4a00600a, 0x0010e271, 0x4a00600b, + 0x00100f06, 0x599c0014, 0x48006012, 0x599c0015, + 0x48006013, 0x42006000, 0x001114d4, 0x4a006203, + 0x00000008, 0x4a006407, 0x00000006, 0x4a006002, + 0xffff0000, 0x4a006009, 0x0010e271, 0x4a006015, + 0x0010e271, 0x599c0014, 0x48006016, 0x599c0015, + 0x48006017, 0x599c0413, 0x48006018, 0x49506019, + 0x4954601a, 0x59a8004f, 0x4800601b, 0x4a00601c, + 0x0010cacc, 0x4a00601d, 0x0010cacd, 0x4a00601e, + 0x0010cace, 0x42000000, 0xb0000000, 0x42000800, + 0x001114d4, 0x0201f800, 0x0002010e, 0x1c01f000, + 0x82000d00, 0x000000c0, 0x04000004, 0x82040d80, + 0x000000c0, 0x04020055, 0x82000d00, 0x00002020, + 0x59300415, 0x84000512, 0x82040d80, 0x00002020, + 0x0400000b, 0x8c000514, 0x0402000f, 0x48026415, + 0x813e79c0, 0x02020000, 0x00020ac9, 0x42027000, + 0x00000043, 0x0201f000, 0x00020bc1, 0x5932680a, + 0x59340a00, 0x8c040d0a, 0x040007f3, 0x84000552, + 0x0401f7f1, 0x84000514, 0x592c080e, 0x48066016, + 0x0401f7ef, 0x5932680a, 0x59340a00, 0x8c040d0a, + 0x02000000, 0x00020adc, 0x59300c15, 0x84040d52, + 0x48066415, 0x0201f000, 0x00020adc, 0x0201f800, + 0x0002011a, 0x813e79c0, 0x02020000, 0x00020ac9, + 0x0201f000, 0x00020af1, 0x8c00051e, 0x02000000, + 0x00020afd, 0x82000d00, 0x00002020, 0x82040d80, + 0x00002020, 0x04000014, 0x82000500, 0x000000c0, + 0x82000d80, 0x00000080, 0x04000008, 0x813e79c0, + 0x02020000, 0x00020ac9, 0x42027000, 0x00000041, + 0x0201f000, 0x00020bc1, 0x813e79c0, 0x02020000, + 0x00020ac9, 0x42027000, 0x00000043, 0x0201f000, + 0x00020bc1, 0x5932680a, 0x59340a00, 0x8c040d0a, + 0x040007ea, 0x59300c15, 0x84040d52, 0x48066415, + 0x0401f7e6, 0x492fc857, 0x42000800, 0x00000006, + 0x0201f000, 0x00020af8, 0x492fc857, 0x42000800, + 0x00000004, 0x0201f000, 0x00020af8, 0x4807c856, + 0x59240206, 0x800409c0, 0x04000003, 0x80080540, + 0x0401f002, 0x80080500, 0x48024a06, 0x1c01f000, + 0x4a030800, 0x00000000, 0x4a030802, 0x00000001, + 0x497b0803, 0x497b0804, 0x1c01f000, 0x59840002, + 0x8c000500, 0x04000004, 0x84000500, 0x4a030800, + 0x00000001, 0x84000544, 0x84000506, 0x48030802, + 0x82000d00, 0x0fffffff, 0x42000000, 0x90000000, + 0x0201f800, 0x001008c7, 0x59a80050, 0x82000480, + 0x00000007, 0x48035050, 0x80000580, 0x42000800, + 0x0010cb70, 0x48000800, 0x48000801, 0x1c01f000, + 0x59a80050, 0x82000400, 0x00000007, 0x48035050, + 0x1c01f000, 0x83640480, 0x00000008, 0x0400101b, + 0x58c80a03, 0x80000580, 0x82000400, 0x00000008, + 0x80040840, 0x040207fd, 0x815c0480, 0x04001013, + 0x4200b000, 0x00000007, 0x0201f800, 0x00020b7b, + 0x4a026203, 0x00000004, 0x4a026407, 0x00000009, + 0x4a026203, 0x00000004, 0x4a026008, 0x00000101, + 0x0401f809, 0x0401f880, 0x8058b040, 0x040207f3, 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, - 0x1c01f000, 0x480bc857, 0x4c500000, 0x4c540000, - 0x4c580000, 0x40083000, 0x58cc0801, 0x82040480, - 0x00000006, 0x02021800, 0x0010032e, 0x82040400, - 0x001067e1, 0x50000000, 0x58cca800, 0x8054ac00, - 0x42001800, 0x00000006, 0x40040000, 0x800c0480, - 0x80082480, 0x04021002, 0x40080000, 0x8000b0c2, - 0x8058b400, 0x5450a800, 0x8050a000, 0x8054a800, - 0x8058b040, 0x040207fc, 0x40001000, 0x58cc2805, - 0x58cc0807, 0x58cc2001, 0x80142c00, 0x80040c80, - 0x80102400, 0x48159805, 0x48059807, 0x48119801, - 0x82100580, 0x00000006, 0x0400000c, 0x48119801, - 0x40080000, 0x80181480, 0x40083000, 0x04000003, - 0x040217d6, 0x80000580, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x1c01f000, 0x58cc0800, 0x800409c0, - 0x02000800, 0x0010032e, 0x58040800, 0x48059800, - 0x41782000, 0x0401f7ee, 0x0401f812, 0x50600000, - 0x81041c00, 0x585c0205, 0x4803c857, 0x82000580, - 0x0000002c, 0x02020800, 0x0010032e, 0x58040202, - 0x800000e0, 0x80640540, 0x48001802, 0x58040000, - 0x48001800, 0x58040001, 0x48001801, 0x1c01f000, - 0x4807c856, 0x58cc0005, 0x80000040, 0x02001800, - 0x0010032e, 0x48019805, 0x58cc1003, 0x82080480, - 0x00000006, 0x02021800, 0x0010032e, 0x82080400, - 0x001067e1, 0x50000000, 0x58cc0802, 0x80040c00, - 0x80081000, 0x82080480, 0x00000006, 0x0402000f, - 0x58cc2002, 0x58100000, 0x80006d40, 0x04000009, - 0x4c340000, 0x0401f858, 0x5c006800, 0x49786801, - 0x48359802, 0x58cc0004, 0x80000040, 0x48019804, - 0x49799803, 0x0401f002, 0x48099803, 0x1c01f000, - 0x4807c856, 0x41781800, 0x58c80201, 0x80000540, - 0x04000002, 0x800c1800, 0x58c80c01, 0x80040c80, - 0x0400100a, 0x04000009, 0x800c1800, 0x58c80202, - 0x80041480, 0x04001005, 0x04000004, 0x800c1800, - 0x40080800, 0x0401f7fb, 0x480d9204, 0x400c0000, - 0x42002000, 0x00000001, 0x80000040, 0x04000007, - 0x04001006, 0x80102000, 0x82000480, 0x00000005, - 0x04000002, 0x040217fc, 0x48119203, 0x1c01f000, - 0x4807c856, 0x4d2c0000, 0x58cc000a, 0x80000540, - 0x02000800, 0x0010032e, 0x82002400, 0x00000006, - 0x0201f800, 0x0010056e, 0x04000012, 0x492d9809, - 0x497a5800, 0x497a5801, 0x0201f800, 0x0010056e, - 0x0400000c, 0x58cc0009, 0x48025800, 0x497a5801, - 0x492d9809, 0x82102480, 0x00000006, 0x040217f7, - 0x82000540, 0x00000001, 0x5c025800, 0x1c01f000, - 0x58cc0009, 0x80025d40, 0x040007fc, 0x592c2000, - 0x0201f800, 0x00100594, 0x40100000, 0x0401f7fa, - 0x58cc0009, 0x48cfc857, 0x80006d40, 0x04000005, - 0x50340000, 0x48019809, 0x49786800, 0x49786801, - 0x1c01f000, 0x4813c857, 0x58cc0009, 0x48002000, - 0x48119809, 0x1c01f000, 0x4807c856, 0x4d2c0000, - 0x58cc0009, 0x80025d40, 0x04000007, 0x592c0000, - 0x4c000000, 0x0201f800, 0x00100594, 0x5c000000, - 0x0401f7f9, 0x5c025800, 0x1c01f000, 0x4807c856, - 0x4d2c0000, 0x58cc0002, 0x80025d40, 0x04000007, - 0x592c0000, 0x4c000000, 0x0201f800, 0x00100594, - 0x5c000000, 0x0401f7f9, 0x49799800, 0x49799802, - 0x49799801, 0x49799803, 0x49799806, 0x49799807, - 0x49799808, 0x49799809, 0x4979980a, 0x5c025800, - 0x1c01f000, 0x00000003, 0x00000006, 0x00000009, - 0x0000000c, 0x0000000f, 0x00000012, 0x4803c856, - 0x0401f858, 0x4a00c205, 0x0000003c, 0x5930100a, - 0x82080580, 0x0010c87b, 0x04000013, 0x58080802, - 0x82040d00, 0x00ffffff, 0x58080403, 0x4804c006, - 0x4800c407, 0x4a00c208, 0x00000003, 0x59300812, - 0x585c0405, 0x4978c207, 0x4804c408, 0x80000540, - 0x0400000d, 0x58600207, 0x84000540, 0x4800c207, - 0x0401f009, 0x585c080b, 0x82040d00, 0x00ffffff, - 0x4804c006, 0x4a00c407, 0x000007ff, 0x4978c208, - 0x0401f7ef, 0x82603c00, 0x00000009, 0x58605405, - 0x40282000, 0x405c6000, 0x585c0a05, 0x82040d00, - 0x0000000f, 0x82040c00, 0x00100f0a, 0x50044000, - 0x80004d80, 0x50200000, 0x80307400, 0x58380402, - 0x8c244d00, 0x04020003, 0x48003a00, 0x0401f003, - 0x48003c00, 0x801c3800, 0x80244800, 0x80102040, - 0x04000006, 0x0201f800, 0x00100ee8, 0x02000800, - 0x0010032e, 0x0401f7f0, 0x1c01f000, 0x4803c856, - 0x4d340000, 0x5930000a, 0x80026d40, 0x02000800, - 0x0010032e, 0x59340212, 0x82000500, 0x0000ff00, - 0x0402000e, 0x59840000, 0x80000540, 0x0400000b, - 0x836c0580, 0x00000003, 0x04020008, 0x59341c03, - 0x42002000, 0x00000004, 0x42003000, 0x00000004, - 0x0201f800, 0x00103931, 0x5c026800, 0x1c01f000, - 0x4803c856, 0x80001580, 0x58c80c01, 0x59300012, - 0x80040c80, 0x48066012, 0x58c80201, 0x80000540, - 0x04000005, 0x80081000, 0x80040c80, 0x04001007, - 0x04000006, 0x58c80202, 0x80081000, 0x80040c80, - 0x04001002, 0x040207fd, 0x4808bc09, 0x4808c405, - 0x1c01f000, 0x4803c856, 0x4a0370e5, 0x00020000, - 0x59b800e5, 0x8c000524, 0x040207fc, 0x4a0370e5, - 0x00030000, 0x40000000, 0x40000000, 0x59b800e5, - 0x8c000524, 0x040207f5, 0x5934000e, 0x80006d40, - 0x04000010, 0x81300580, 0x04020004, 0x58340000, - 0x4802680e, 0x0401f00a, 0x40347800, 0x58340000, - 0x80006d40, 0x02000800, 0x0010032e, 0x81300580, - 0x040207fa, 0x58340000, 0x48007800, 0x497a6000, - 0x4a0370e5, 0x00020000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x4d2c0000, 0x42000800, 0x000003ff, - 0x4a0370e5, 0x00020000, 0x59b800e5, 0x8c000524, - 0x04000005, 0x80040840, 0x040207fa, 0x0201f800, - 0x0010032e, 0x4a0370e5, 0x00030000, 0x40000000, - 0x40000000, 0x59b800e5, 0x8c000524, 0x040207f1, - 0x5934000e, 0x80026540, 0x0400000e, 0x4933c857, - 0x59300000, 0x4802680e, 0x4a026203, 0x00000004, - 0x497a6006, 0x497a600a, 0x4a026008, 0x00000101, - 0x59325809, 0x497a5c09, 0x0401fd7a, 0x0401f7f1, - 0x4a0370e5, 0x00020000, 0x5c025800, 0x5c026000, - 0x1c01f000, 0x4803c856, 0x4c000000, 0x0201f800, - 0x00105f68, 0x04020011, 0x0201f800, 0x0010452c, - 0x02020800, 0x0010032e, 0x5c000000, 0x48026802, - 0x0201f800, 0x00107cfe, 0x04000009, 0x4936600a, - 0x4a026407, 0x00000001, 0x42027000, 0x00000001, - 0x0201f000, 0x00020bc1, 0x5c000000, 0x1c01f000, - 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, - 0x0010032e, 0x4803c857, 0x0c01f001, 0x001068cd, - 0x001068cd, 0x001068cd, 0x001068cf, 0x0010693c, - 0x001068cd, 0x001068cd, 0x0010698e, 0x0010698f, - 0x001068cd, 0x001068cd, 0x001068cd, 0x001068cd, - 0x001068cd, 0x0201f800, 0x0010032e, 0x493bc857, - 0x83380480, 0x00000050, 0x02021800, 0x0010032e, - 0x83380480, 0x00000049, 0x02001800, 0x0010032e, - 0x0c01f001, 0x001068e2, 0x00106913, 0x001068e0, - 0x001068e0, 0x001068e0, 0x001068e0, 0x00106921, - 0x0201f800, 0x0010032e, 0x4d2c0000, 0x59325809, - 0x592c0207, 0x48025c07, 0x4a025a07, 0x00000000, - 0x4c5c0000, 0x592cbc0b, 0x592c0000, 0x48026009, - 0x0201f800, 0x000203ef, 0x59300c15, 0x59300009, - 0x80000540, 0x0400000b, 0x8c040d18, 0x04020014, - 0x4a026203, 0x00000007, 0x42027000, 0x00000043, - 0x497a6415, 0x5c00b800, 0x5c025800, 0x0401f093, - 0x8c040d18, 0x04020010, 0x8c5cbd08, 0x04020011, - 0x4a026203, 0x00000007, 0x497a6415, 0x497a6006, - 0x5c00b800, 0x5c025800, 0x1c01f000, 0x4d400000, - 0x59325809, 0x42028000, 0x00000005, 0x0401f922, - 0x5c028000, 0x0201f800, 0x00107cbe, 0x0401f7f5, - 0x0201f800, 0x00020b9d, 0x0401f7f2, 0x0401fa59, - 0x4d2c0000, 0x59325809, 0x0201f800, 0x00109667, - 0x04000006, 0x4d400000, 0x42028000, 0x00000001, - 0x0401f911, 0x5c028000, 0x5c025800, 0x0201f000, - 0x00020b9d, 0x0401fa4b, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010fc72, 0x5c027800, 0x42003000, - 0x00000014, 0x0201f800, 0x0010b412, 0x42000000, - 0x0010cc23, 0x0201f800, 0x0010bc88, 0x4d2c0000, - 0x59325809, 0x0201f800, 0x00109667, 0x04000006, - 0x4d400000, 0x42028000, 0x00000029, 0x0401f8f6, - 0x5c028000, 0x5c025800, 0x0201f000, 0x00020b9d, - 0x493bc857, 0x497a6006, 0x83380480, 0x00000054, - 0x02021800, 0x0010032e, 0x83380480, 0x00000047, - 0x02001800, 0x0010032e, 0x0c01f001, 0x0010698d, - 0x00106956, 0x00106954, 0x00106954, 0x00106954, - 0x00106954, 0x00106954, 0x00106954, 0x00106954, - 0x00106954, 0x00106954, 0x00106954, 0x0010695a, - 0x0201f800, 0x0010032e, 0x59300012, 0x82000500, - 0xffff0000, 0x04020034, 0x59840802, 0x8c040d04, - 0x04000025, 0x5930000a, 0x80026d40, 0x0400001f, - 0x4c5c0000, 0x4c600000, 0x497a6006, 0x5930b809, - 0x585c0006, 0x8000c540, 0x02000800, 0x0010032e, - 0x0401fe7f, 0x40625800, 0x0201f800, 0x000203f3, - 0x4978b806, 0x0401fee8, 0x497a600a, 0x585c3409, - 0x0401fca9, 0x0400000e, 0x42001000, 0x0010c870, - 0x0401fcde, 0x0400000a, 0x0201f800, 0x00100583, - 0x04000007, 0x492cb806, 0x585c5409, 0x0401fc6f, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x0401fc95, - 0x0401f7fc, 0x8c040d06, 0x040207fc, 0x5930000a, - 0x80026d40, 0x04000006, 0x5934000e, 0x80000540, - 0x02020800, 0x0010032e, 0x497a600a, 0x0401fcf9, - 0x0401f7f2, 0x0401f088, 0x4803c856, 0x4803c856, - 0x83380580, 0x00000043, 0x02020800, 0x0010032e, - 0x4a026203, 0x00000003, 0x493a6403, 0x59325809, - 0x592c0010, 0x48026012, 0x497a6014, 0x592c0407, - 0x800000c2, 0x800010c4, 0x80081400, 0x480a6006, - 0x0201f800, 0x00020168, 0x42000800, 0x80000060, - 0x0201f000, 0x00020b30, 0x42000000, 0x0010cc35, - 0x0201f800, 0x0010bc88, 0x59300203, 0x82000c80, - 0x0000000e, 0x02021800, 0x0010032e, 0x4803c857, - 0x82000d80, 0x00000003, 0x04000006, 0x82000d80, - 0x00000004, 0x0400005d, 0x0201f800, 0x0010032e, - 0x4d400000, 0x42028000, 0x00000006, 0x0401f82d, - 0x5c028000, 0x1c01f000, 0x4803c856, 0x59300203, - 0x82000c80, 0x0000000e, 0x02021800, 0x0010032e, - 0x82000d80, 0x00000002, 0x0400000f, 0x82000d80, - 0x00000003, 0x04000006, 0x82000d80, 0x00000004, - 0x04000046, 0x0201f800, 0x0010032e, 0x4d400000, - 0x42028000, 0x00000005, 0x0401f816, 0x5c028000, - 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x59325809, - 0x812e59c0, 0x02000800, 0x0010032e, 0x592c1a09, - 0x8c0c1d0e, 0x02000800, 0x0010032e, 0x4d400000, - 0x42028000, 0x00000001, 0x0401f84b, 0x0201f800, - 0x00107cbe, 0x5c028000, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x4943c857, 0x0401fa52, 0x4df00000, - 0x59300004, 0x8c00053e, 0x04020006, 0x0201f800, - 0x00107021, 0x02020800, 0x0010032e, 0x0401f01b, - 0x0201f800, 0x0010931e, 0x04020007, 0x59300415, - 0x84000558, 0x48026415, 0x0201f800, 0x00106f25, - 0x04020012, 0x0201f800, 0x0010fd55, 0x80c40040, - 0x04000005, 0x0401f946, 0x02020800, 0x0010032e, - 0x0401f00a, 0x59325809, 0x0401f827, 0x0201f800, - 0x00107cbe, 0x5c03e000, 0x04000a1f, 0x82000540, - 0x00000001, 0x1c01f000, 0x5c03e000, 0x04000a1a, - 0x80000580, 0x1c01f000, 0x4933c857, 0x0201f800, - 0x00100c75, 0x4933c857, 0x4c5c0000, 0x4d340000, - 0x497a6006, 0x5930b809, 0x5930000a, 0x80026d40, - 0x04020e39, 0x42001000, 0x0010c870, 0x0401fc33, - 0x04000009, 0x58c80204, 0x4800bc09, 0x41785000, - 0x0201f800, 0x001065ea, 0x5c026800, 0x5c00b800, - 0x1c01f000, 0x4978bc09, 0x0201f800, 0x00106614, - 0x0401f7fa, 0x4803c856, 0x0201f800, 0x00109667, - 0x0400000f, 0x592c0000, 0x80000d40, 0x04000009, - 0x497a5800, 0x49425a07, 0x4c040000, 0x0201f800, - 0x000203ef, 0x5c000800, 0x40065800, 0x0401f7f6, - 0x49425a07, 0x0201f800, 0x000203ef, 0x1c01f000, - 0x0401f807, 0x42018800, 0x00000001, 0x04000003, - 0x42018800, 0x00000000, 0x1c01f000, 0x4933c857, - 0x59300c07, 0x82040580, 0x0000000e, 0x04000004, - 0x82040580, 0x00000009, 0x04020004, 0x0401ffde, - 0x497a6009, 0x80000580, 0x1c01f000, 0x592e600a, - 0x83300480, 0x00111264, 0x04001016, 0x41580000, - 0x81300480, 0x04021013, 0x40040000, 0x59300c07, - 0x80040580, 0x04020012, 0x59300a03, 0x82040580, - 0x00000007, 0x02020800, 0x0010032e, 0x59300009, - 0x80000540, 0x02020800, 0x0010032e, 0x0201f800, - 0x00020b9d, 0x42000000, 0x00000000, 0x0401f009, - 0x42000000, 0x00000008, 0x0401f006, 0x82040580, - 0x00000007, 0x040207fb, 0x42000000, 0x00000005, - 0x592c0a07, 0x48065c07, 0x48025a07, 0x0201f000, - 0x000203ef, 0x4c0c0000, 0x4c100000, 0x4c140000, - 0x4c180000, 0x80001d80, 0x80002580, 0x42003000, - 0x00000020, 0x82040500, 0x00000001, 0x04000003, - 0x40080000, 0x800c1c00, 0x400c2800, 0x800c1902, - 0x80102102, 0x82140500, 0x00000001, 0x04000003, - 0x82102540, 0x80000000, 0x80040902, 0x80183040, - 0x040207f1, 0x40100800, 0x400c0000, 0x5c003000, - 0x5c002800, 0x5c002000, 0x5c001800, 0x1c01f000, - 0x4c580000, 0x4200b000, 0x00000020, 0x80000540, - 0x04000018, 0x80041c80, 0x04021016, 0x800810c2, - 0x80040982, 0x04001006, 0x80041c80, 0x04021005, - 0x8058b040, 0x040207fa, 0x0401f006, 0x80041c80, - 0x400c0800, 0x80081000, 0x8058b040, 0x040207f4, - 0x4c000000, 0x41f00000, 0x82000500, 0xf7ffffff, - 0x4003e000, 0x5c000000, 0x5c00b000, 0x1c01f000, - 0x4c000000, 0x41f00000, 0x82000540, 0x08000000, - 0x0401f7f8, 0x42007000, 0x0010c89b, 0x4a007000, - 0x00000005, 0x4a007401, 0x00000000, 0x4a007201, - 0x00000840, 0x4a007202, 0x00000005, 0x4a0378e8, - 0x00000000, 0x4a03c821, 0x00000010, 0x4a03c823, - 0x00000004, 0x0401f81e, 0x4a0378e9, 0x00003a0d, - 0x4a0378e8, 0x00000001, 0x41780800, 0x4203a000, - 0x00007600, 0x4a03a005, 0xd0000001, 0x59d00006, - 0x4a03a005, 0x90000001, 0x83d3a400, 0x00000020, - 0x80040800, 0x82040480, 0x00000005, 0x040017f8, - 0x59e00003, 0x82000500, 0xffffffe0, 0x82000540, - 0x00008000, 0x4803c003, 0x59c40006, 0x82000500, - 0xfffcffff, 0x48038806, 0x1c01f000, 0x4d900000, - 0x4d180000, 0x4a0378e7, 0xaaaaaaaa, 0x4a0378e6, - 0xaaaaaaaa, 0x4a0378e5, 0xaaaaaaaa, 0x4a0378e4, - 0xaaaaaaaa, 0x4a03781a, 0x0010cb2e, 0x4a03781b, - 0x00100f0a, 0x4a03781c, 0x00100f1a, 0x4a031800, - 0x00000000, 0x4a031801, 0x0010c89e, 0x4a031802, - 0x0010c8a5, 0x42000800, 0x0010cb31, 0x417a3000, - 0x811b20c8, 0x83932400, 0x0000bf32, 0x48072000, - 0x4a032001, 0x00000000, 0x83180400, 0x00107303, - 0x50000000, 0x48032002, 0x82040c00, 0x00000005, - 0x811a3000, 0x83180480, 0x00000005, 0x040017f1, - 0x5c023000, 0x5c032000, 0x1c01f000, 0x40680800, - 0x0201f800, 0x00020b3e, 0x1c01f000, 0x4933c857, - 0x59300804, 0x82040d00, 0x00000100, 0x82040d40, - 0x80000040, 0x48066004, 0x497a6000, 0x59bc00ea, - 0x8c000516, 0x040207fe, 0x83300400, 0x60000000, - 0x480378e1, 0x1c01f000, 0x598c000f, 0x81300580, - 0x04000003, 0x497a6008, 0x1c01f000, 0x59c40004, - 0x82000500, 0x0000000c, 0x04000005, 0x4a038804, - 0x0000000c, 0x497b2807, 0x0401f00a, 0x0401fba6, - 0x59300403, 0x82000d80, 0x00000040, 0x04000004, - 0x82000580, 0x00000042, 0x04020002, 0x497a6008, - 0x0201f800, 0x001072c9, 0x80000580, 0x1c01f000, - 0x0401f807, 0x42018800, 0x00000001, 0x04000003, - 0x42018800, 0x00000000, 0x1c01f000, 0x59300804, - 0x8c040d20, 0x04020004, 0x82000540, 0x00000001, - 0x1c01f000, 0x4933c857, 0x4d380000, 0x59300804, - 0x84040d20, 0x48066004, 0x42027000, 0x00000049, - 0x59300203, 0x82000580, 0x00000003, 0x04000003, - 0x42027000, 0x00000013, 0x0201f800, 0x00020bc1, - 0x80000580, 0x5c027000, 0x1c01f000, 0x0401f807, - 0x42018800, 0x00000001, 0x04000003, 0x42018800, - 0x00000000, 0x1c01f000, 0x59300018, 0x81480580, - 0x04020003, 0x59300019, 0x814c0580, 0x1c01f000, - 0x4d2c0000, 0x4d300000, 0x0401f8ce, 0x4df00000, - 0x0201f800, 0x00106423, 0x59900001, 0x82000500, - 0x00000003, 0x0c01f001, 0x00106b87, 0x00106b7c, - 0x00106b7a, 0x00106b7a, 0x0201f800, 0x0010032e, - 0x59926004, 0x0401f88a, 0x813261c0, 0x04000008, - 0x59300004, 0x8c000516, 0x04000004, 0x59325809, - 0x497a5809, 0x497a580a, 0x0401f88a, 0x5c03e000, - 0x040008a1, 0x5c026000, 0x5c025800, 0x1c01f000, - 0x5c000000, 0x4c000000, 0x4803c857, 0x4d300000, - 0x497b2807, 0x0401f8ab, 0x4df00000, 0x598c0000, - 0x82000500, 0x0000000f, 0x4803c857, 0x0c01f001, - 0x00106bcd, 0x00106baa, 0x00106bb3, 0x00106bba, - 0x00106bc8, 0x00106bcd, 0x00106ba8, 0x00106bb7, - 0x00106bcd, 0x00106ba8, 0x00106ba8, 0x00106ba8, - 0x00106ba8, 0x00106ba8, 0x00106ba8, 0x00106ba8, - 0x0201f800, 0x0010032e, 0x598c000f, 0x80026540, - 0x04000004, 0x0401f824, 0x02020800, 0x0010032e, - 0x0201f800, 0x001072c9, 0x0401f01b, 0x0401f82d, - 0x0201f800, 0x001072c9, 0x0401f017, 0x0201f800, - 0x0010b731, 0x0401f7f7, 0x598c000f, 0x80026540, - 0x04000011, 0x0401f83b, 0x04000007, 0x0401f812, - 0x04000005, 0x0401f81f, 0x04000003, 0x0201f800, - 0x0010b731, 0x0201f800, 0x001072c9, 0x0401f006, - 0x0401f830, 0x02020800, 0x0010032e, 0x0201f800, - 0x001072c9, 0x5c03e000, 0x0400085b, 0x5c026000, - 0x1c01f000, 0x598c0009, 0x81300580, 0x0402000c, - 0x0401f84e, 0x0401f83b, 0x59300000, 0x800001c0, - 0x04000004, 0x48031809, 0x497a6000, 0x0401f003, - 0x497b1809, 0x497b1808, 0x80000580, 0x1c01f000, - 0x4d2c0000, 0x59300407, 0x82000580, 0x00000003, - 0x04020012, 0x598c000b, 0x81300580, 0x0402000f, - 0x0401f83a, 0x59325809, 0x497a5809, 0x497a580a, - 0x0401f824, 0x59300000, 0x800001c0, 0x04000004, - 0x4803180b, 0x497a6000, 0x0401f003, 0x497b180a, - 0x497b180b, 0x80000580, 0x5c025800, 0x1c01f000, - 0x598c0005, 0x81300580, 0x0402000c, 0x0401f827, - 0x0401f814, 0x59300000, 0x800001c0, 0x04000004, - 0x48031805, 0x497a6000, 0x0401f003, 0x497b1805, - 0x497b1804, 0x80000580, 0x1c01f000, 0x4a032001, - 0x00000000, 0x497b2004, 0x497b2005, 0x59900006, - 0x82000500, 0x0000ffff, 0x48032006, 0x1c01f000, - 0x4c040000, 0x59300004, 0x82000500, 0x7ffeffff, - 0x48026004, 0x59bc00e4, 0x8c000514, 0x04000009, - 0x42000800, 0x0000bf00, 0x58040012, 0x81300580, - 0x04020004, 0x49780812, 0x4a0378e4, 0x00000800, - 0x5c000800, 0x1c01f000, 0x4803c856, 0x598c000e, - 0x80000540, 0x04000003, 0x80000040, 0x4803180e, - 0x1c01f000, 0x59bc00ea, 0x82000500, 0x00000007, - 0x82000580, 0x00000003, 0x04020006, 0x4803c856, - 0x4a0378e8, 0x00000001, 0x4a0370e4, 0x00000800, + 0x0401f7fd, 0x0201f800, 0x00100583, 0x492e6009, + 0x58c80a03, 0x4a025a05, 0x0000002c, 0x497a5800, + 0x497a5801, 0x497a5c05, 0x497a5c07, 0x497a5806, + 0x4a025a09, 0x00000005, 0x4a025a08, 0x00000002, + 0x58c80201, 0x48025c05, 0x58c80202, 0x48025c08, + 0x58c80204, 0x48025c09, 0x4a02580e, 0x0000ffff, + 0x80040840, 0x0400000c, 0x412c2000, 0x0201f800, + 0x00100583, 0x4a025a05, 0x0000000a, 0x497a5c05, + 0x48125800, 0x492c2001, 0x412c2000, 0x80040840, + 0x040207f7, 0x1c01f000, 0x4d7c0000, 0x4202f800, + 0x00000010, 0x4df00000, 0x4203e000, 0x50000000, + 0x59847803, 0x803c79c0, 0x0400001e, 0x4c5c0000, + 0x583cb809, 0x585c3409, 0x801831c0, 0x0400000b, + 0x0401f84a, 0x04000016, 0x42001000, 0x0010cb70, + 0x0401f87f, 0x04000012, 0x0201f800, 0x0010056e, + 0x0400000f, 0x492cb806, 0x585c0006, 0x80000540, + 0x02000800, 0x0010032e, 0x0401f830, 0x585c5409, + 0x0401f80b, 0x5c00b800, 0x5c03e000, 0x817ef840, + 0x040207e1, 0x5c02f800, 0x1c01f000, 0x5c00b800, + 0x5c03e000, 0x5c02f800, 0x1c01f000, 0x4803c856, + 0x405c6000, 0x802851c0, 0x04000018, 0x585c0205, + 0x82000d00, 0x0000000f, 0x82040c00, 0x00100f0b, + 0x50044000, 0x4c600000, 0x4c640000, 0x4d040000, + 0x4020c000, 0x40320800, 0x5984c804, 0x4c280000, + 0x0401f93b, 0x5c005000, 0x40604000, 0x41046000, + 0x0201f800, 0x00100ee9, 0x040207f6, 0x5c020800, + 0x5c00c800, 0x5c00c000, 0x58c80204, 0x4800bc09, + 0x0201f800, 0x0002011a, 0x4a026008, 0x00000101, + 0x497a600a, 0x0401f055, 0x4803c856, 0x59840003, + 0x80026540, 0x04000003, 0x59300000, 0x48030803, + 0x1c01f000, 0x4803c856, 0x59840003, 0x48026000, + 0x49330803, 0x1c01f000, 0x58cc0805, 0x40180000, + 0x80040480, 0x0400100d, 0x82cc0580, 0x0010cb65, + 0x02020800, 0x0010032e, 0x58c80205, 0x80040480, + 0x0400101d, 0x82000540, 0x00000001, 0x1c01f000, + 0x80003580, 0x0401f7fe, 0x82cc0580, 0x0010cb65, + 0x02020800, 0x0010032e, 0x58c80400, 0x8c000504, + 0x040007f8, 0x58c8040b, 0x8c00051e, 0x040007f5, + 0x8c000500, 0x040207f3, 0x84000540, 0x4801940b, + 0x42000000, 0x0010cf05, 0x0201f800, 0x0010bfb3, + 0x42001000, 0x00008026, 0x0201f800, 0x001039ac, + 0x0401f7e8, 0x58c8040b, 0x8c00051e, 0x040007e2, + 0x8c000502, 0x040207e0, 0x84000542, 0x4801940b, + 0x42000000, 0x0010cf04, 0x0201f800, 0x0010bfb3, + 0x42001000, 0x00008025, 0x42001800, 0x00000000, + 0x0201f800, 0x001039ac, 0x0401f7d3, 0x4803c856, + 0x58080000, 0x42001800, 0x00000007, 0x58080801, + 0x80040480, 0x04020004, 0x400c0000, 0x80000540, + 0x0401f005, 0x04001003, 0x800c0480, 0x0401f002, + 0x80000080, 0x1c01f000, 0x4803c856, 0x59300009, + 0x80000d40, 0x02000800, 0x0010032e, 0x58040006, + 0x80000540, 0x02000800, 0x0010032e, 0x59300008, + 0x82000500, 0x00000101, 0x82000580, 0x00000101, + 0x02020800, 0x0010032e, 0x42001000, 0x0010cb70, + 0x58080801, 0x82040400, 0x0010cb72, 0x497a6415, + 0x4a026016, 0x0000ffff, 0x45300000, 0x80040800, + 0x82040480, 0x00000008, 0x04001002, 0x80000d80, + 0x48041001, 0x82040400, 0x0010cb72, 0x45780000, + 0x1c01f000, 0x4933c857, 0x59300809, 0x800409c0, + 0x02000800, 0x0010032e, 0x4d2c0000, 0x58065806, + 0x812e59c0, 0x02020800, 0x00100594, 0x49780806, + 0x40065800, 0x0201f800, 0x0010059d, 0x5c025800, + 0x4d300000, 0x0201f800, 0x00020b9d, 0x5c026000, 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, - 0x59bc00ea, 0x82000500, 0x00000007, 0x82000580, - 0x00000001, 0x04020013, 0x4803c856, 0x42000800, - 0x00000000, 0x0401f810, 0x4a0370e4, 0x00000c00, - 0x42000800, 0x00001000, 0x59bc00ea, 0x82000500, - 0x00000007, 0x82000580, 0x00000003, 0x04000005, - 0x80040840, 0x040207f9, 0x0201f800, 0x0010032e, + 0x59300407, 0x82000580, 0x00000009, 0x04020006, + 0x59300008, 0x8c000510, 0x04000003, 0x80000580, + 0x1c01f000, 0x82000540, 0x00000001, 0x1c01f000, + 0x59840802, 0x8c040d04, 0x1c01f000, 0x4803c856, + 0x59840802, 0x84040d04, 0x84040d40, 0x4a030800, + 0x00000000, 0x48070802, 0x82040d00, 0x0fffffff, + 0x42000000, 0x90000000, 0x0201f000, 0x001008c7, + 0x4807c857, 0x4805980a, 0x49799801, 0x49799803, + 0x49799806, 0x49799807, 0x49799808, 0x49799805, + 0x49799809, 0x0401f8c8, 0x0400000a, 0x0401f8ea, + 0x04000008, 0x48359800, 0x48359802, 0x48359806, + 0x4a019804, 0x00000001, 0x4a019807, 0x00000006, + 0x1c01f000, 0x4807c857, 0x58cc1007, 0x40040000, + 0x80080480, 0x04021020, 0x4c040000, 0x4c080000, + 0x0401f8d9, 0x5c001000, 0x5c000800, 0x0400001c, + 0x58cc0006, 0x80006540, 0x0402000b, 0x48359800, + 0x48359802, 0x48359806, 0x49799801, 0x49799803, + 0x49786801, 0x49786800, 0x49799804, 0x49799807, + 0x0401f005, 0x48306801, 0x48346000, 0x48359806, + 0x49786800, 0x58cc0004, 0x58cc1007, 0x80000000, + 0x82081400, 0x00000006, 0x48019804, 0x48099807, + 0x0401f7df, 0x80000580, 0x1c01f000, 0x82000540, + 0x00000001, 0x1c01f000, 0x480bc857, 0x4c500000, + 0x4c540000, 0x4c580000, 0x40083000, 0x58cc0801, + 0x82040480, 0x00000006, 0x02021800, 0x0010032e, + 0x82040400, 0x001069e6, 0x50000000, 0x58cca800, + 0x8054ac00, 0x42001800, 0x00000006, 0x40040000, + 0x800c0480, 0x80082480, 0x04021002, 0x40080000, + 0x8000b0c2, 0x8058b400, 0x5450a800, 0x8050a000, + 0x8054a800, 0x8058b040, 0x040207fc, 0x40001000, + 0x58cc2805, 0x58cc0807, 0x58cc2001, 0x80142c00, + 0x80040c80, 0x80102400, 0x48159805, 0x48059807, + 0x48119801, 0x82100580, 0x00000006, 0x0400000c, + 0x48119801, 0x40080000, 0x80181480, 0x40083000, + 0x04000003, 0x040217d6, 0x80000580, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x1c01f000, 0x58cc0800, + 0x800409c0, 0x02000800, 0x0010032e, 0x58040800, + 0x48059800, 0x41782000, 0x0401f7ee, 0x0401f812, + 0x50600000, 0x81041c00, 0x585c0205, 0x4803c857, + 0x82000580, 0x0000002c, 0x02020800, 0x0010032e, + 0x58040202, 0x800000e0, 0x80640540, 0x48001802, + 0x58040000, 0x48001800, 0x58040001, 0x48001801, + 0x1c01f000, 0x4807c856, 0x58cc0005, 0x80000040, + 0x02001800, 0x0010032e, 0x48019805, 0x58cc1003, + 0x82080480, 0x00000006, 0x02021800, 0x0010032e, + 0x82080400, 0x001069e6, 0x50000000, 0x58cc0802, + 0x80040c00, 0x80081000, 0x82080480, 0x00000006, + 0x0402000f, 0x58cc2002, 0x58100000, 0x80006d40, + 0x04000009, 0x4c340000, 0x0401f858, 0x5c006800, + 0x49786801, 0x48359802, 0x58cc0004, 0x80000040, + 0x48019804, 0x49799803, 0x0401f002, 0x48099803, + 0x1c01f000, 0x4807c856, 0x41781800, 0x58c80201, + 0x80000540, 0x04000002, 0x800c1800, 0x58c80c01, + 0x80040c80, 0x0400100a, 0x04000009, 0x800c1800, + 0x58c80202, 0x80041480, 0x04001005, 0x04000004, + 0x800c1800, 0x40080800, 0x0401f7fb, 0x480d9204, + 0x400c0000, 0x42002000, 0x00000001, 0x80000040, + 0x04000007, 0x04001006, 0x80102000, 0x82000480, + 0x00000005, 0x04000002, 0x040217fc, 0x48119203, + 0x1c01f000, 0x4807c856, 0x4d2c0000, 0x58cc000a, + 0x80000540, 0x02000800, 0x0010032e, 0x82002400, + 0x00000006, 0x0201f800, 0x0010056e, 0x04000012, + 0x492d9809, 0x497a5800, 0x497a5801, 0x0201f800, + 0x0010056e, 0x0400000c, 0x58cc0009, 0x48025800, + 0x497a5801, 0x492d9809, 0x82102480, 0x00000006, + 0x040217f7, 0x82000540, 0x00000001, 0x5c025800, + 0x1c01f000, 0x58cc0009, 0x80025d40, 0x040007fc, + 0x592c2000, 0x0201f800, 0x00100594, 0x40100000, + 0x0401f7fa, 0x58cc0009, 0x48cfc857, 0x80006d40, + 0x04000005, 0x50340000, 0x48019809, 0x49786800, + 0x49786801, 0x1c01f000, 0x4813c857, 0x58cc0009, + 0x48002000, 0x48119809, 0x1c01f000, 0x4807c856, + 0x4d2c0000, 0x58cc0009, 0x80025d40, 0x04000007, + 0x592c0000, 0x4c000000, 0x0201f800, 0x00100594, + 0x5c000000, 0x0401f7f9, 0x5c025800, 0x1c01f000, + 0x4807c856, 0x4d2c0000, 0x58cc0002, 0x80025d40, + 0x04000007, 0x592c0000, 0x4c000000, 0x0201f800, + 0x00100594, 0x5c000000, 0x0401f7f9, 0x49799800, + 0x49799802, 0x49799801, 0x49799803, 0x49799806, + 0x49799807, 0x49799808, 0x49799809, 0x4979980a, + 0x5c025800, 0x1c01f000, 0x00000003, 0x00000006, + 0x00000009, 0x0000000c, 0x0000000f, 0x00000012, + 0x4803c856, 0x0401f858, 0x4a00c205, 0x0000003c, + 0x5930100a, 0x82080580, 0x0010cb7b, 0x04000013, + 0x58080802, 0x82040d00, 0x00ffffff, 0x58080403, + 0x4804c006, 0x4800c407, 0x4a00c208, 0x00000003, + 0x59300812, 0x585c0405, 0x4978c207, 0x4804c408, + 0x80000540, 0x0400000d, 0x58600207, 0x84000540, + 0x4800c207, 0x0401f009, 0x585c080b, 0x82040d00, + 0x00ffffff, 0x4804c006, 0x4a00c407, 0x000007ff, + 0x4978c208, 0x0401f7ef, 0x82603c00, 0x00000009, + 0x58605405, 0x40282000, 0x405c6000, 0x585c0a05, + 0x82040d00, 0x0000000f, 0x82040c00, 0x00100f0b, + 0x50044000, 0x80004d80, 0x50200000, 0x80307400, + 0x58380402, 0x8c244d00, 0x04020003, 0x48003a00, + 0x0401f003, 0x48003c00, 0x801c3800, 0x80244800, + 0x80102040, 0x04000006, 0x0201f800, 0x00100ee9, + 0x02000800, 0x0010032e, 0x0401f7f0, 0x1c01f000, + 0x4803c856, 0x4d340000, 0x5930000a, 0x80026d40, + 0x02000800, 0x0010032e, 0x59340212, 0x82000500, + 0x0000ff00, 0x0402000e, 0x59840000, 0x80000540, + 0x0400000b, 0x836c0580, 0x00000003, 0x04020008, + 0x59341c03, 0x42002000, 0x00000004, 0x42003000, + 0x00000004, 0x0201f800, 0x00103a21, 0x5c026800, + 0x1c01f000, 0x4803c856, 0x80001580, 0x58c80c01, + 0x59300012, 0x80040c80, 0x48066012, 0x58c80201, + 0x80000540, 0x04000005, 0x80081000, 0x80040c80, + 0x04001007, 0x04000006, 0x58c80202, 0x80081000, + 0x80040c80, 0x04001002, 0x040207fd, 0x4808bc09, + 0x4808c405, 0x1c01f000, 0x4803c856, 0x4a0370e5, + 0x00020000, 0x59b800e5, 0x8c000524, 0x040207fc, + 0x4a0370e5, 0x00030000, 0x40000000, 0x40000000, + 0x59b800e5, 0x8c000524, 0x040207f5, 0x5934000e, + 0x80006d40, 0x04000010, 0x81300580, 0x04020004, + 0x58340000, 0x4802680e, 0x0401f00a, 0x40347800, + 0x58340000, 0x80006d40, 0x02000800, 0x0010032e, + 0x81300580, 0x040207fa, 0x58340000, 0x48007800, + 0x497a6000, 0x4a0370e5, 0x00020000, 0x1c01f000, + 0x4803c856, 0x4d300000, 0x4d2c0000, 0x42000800, + 0x000003ff, 0x4a0370e5, 0x00020000, 0x59b800e5, + 0x8c000524, 0x04000005, 0x80040840, 0x040207fa, + 0x0201f800, 0x0010032e, 0x4a0370e5, 0x00030000, + 0x40000000, 0x40000000, 0x59b800e5, 0x8c000524, + 0x040207f1, 0x5934000e, 0x80026540, 0x0400000e, + 0x4933c857, 0x59300000, 0x4802680e, 0x4a026203, + 0x00000004, 0x497a6006, 0x497a600a, 0x4a026008, + 0x00000101, 0x59325809, 0x497a5c09, 0x0401fd7a, + 0x0401f7f1, 0x4a0370e5, 0x00020000, 0x5c025800, + 0x5c026000, 0x1c01f000, 0x4803c856, 0x4c000000, + 0x0201f800, 0x00106134, 0x04020011, 0x0201f800, + 0x00104628, 0x02020800, 0x0010032e, 0x5c000000, + 0x48026802, 0x0201f800, 0x00107ef8, 0x04000009, + 0x4936600a, 0x4a026407, 0x00000001, 0x42027000, + 0x00000001, 0x0201f000, 0x00020bc1, 0x5c000000, + 0x1c01f000, 0x59300203, 0x82000c80, 0x0000000e, + 0x02021800, 0x0010032e, 0x4803c857, 0x0c01f001, + 0x00106ad2, 0x00106ad2, 0x00106ad2, 0x00106ad4, + 0x00106b41, 0x00106ad2, 0x00106ad2, 0x00106b93, + 0x00106b94, 0x00106ad2, 0x00106ad2, 0x00106ad2, + 0x00106ad2, 0x00106ad2, 0x0201f800, 0x0010032e, + 0x493bc857, 0x83380480, 0x00000050, 0x02021800, + 0x0010032e, 0x83380480, 0x00000049, 0x02001800, + 0x0010032e, 0x0c01f001, 0x00106ae7, 0x00106b18, + 0x00106ae5, 0x00106ae5, 0x00106ae5, 0x00106ae5, + 0x00106b26, 0x0201f800, 0x0010032e, 0x4d2c0000, + 0x59325809, 0x592c0207, 0x48025c07, 0x4a025a07, + 0x00000000, 0x4c5c0000, 0x592cbc0b, 0x592c0000, + 0x48026009, 0x0201f800, 0x000203ef, 0x59300c15, + 0x59300009, 0x80000540, 0x0400000b, 0x8c040d18, + 0x04020014, 0x4a026203, 0x00000007, 0x42027000, + 0x00000043, 0x497a6415, 0x5c00b800, 0x5c025800, + 0x0401f093, 0x8c040d18, 0x04020010, 0x8c5cbd08, + 0x04020011, 0x4a026203, 0x00000007, 0x497a6415, + 0x497a6006, 0x5c00b800, 0x5c025800, 0x1c01f000, + 0x4d400000, 0x59325809, 0x42028000, 0x00000005, + 0x0401f922, 0x5c028000, 0x0201f800, 0x00107eb4, + 0x0401f7f5, 0x0201f800, 0x00020b9d, 0x0401f7f2, + 0x0401fa59, 0x4d2c0000, 0x59325809, 0x0201f800, + 0x0010989f, 0x04000006, 0x4d400000, 0x42028000, + 0x00000001, 0x0401f911, 0x5c028000, 0x5c025800, + 0x0201f000, 0x00020b9d, 0x0401fa4b, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010ff80, 0x5c027800, + 0x42003000, 0x00000014, 0x0201f800, 0x0010b73d, + 0x42000000, 0x0010cf23, 0x0201f800, 0x0010bfb3, + 0x4d2c0000, 0x59325809, 0x0201f800, 0x0010989f, + 0x04000006, 0x4d400000, 0x42028000, 0x00000029, + 0x0401f8f6, 0x5c028000, 0x5c025800, 0x0201f000, + 0x00020b9d, 0x493bc857, 0x497a6006, 0x83380480, + 0x00000054, 0x02021800, 0x0010032e, 0x83380480, + 0x00000047, 0x02001800, 0x0010032e, 0x0c01f001, + 0x00106b92, 0x00106b5b, 0x00106b59, 0x00106b59, + 0x00106b59, 0x00106b59, 0x00106b59, 0x00106b59, + 0x00106b59, 0x00106b59, 0x00106b59, 0x00106b59, + 0x00106b5f, 0x0201f800, 0x0010032e, 0x59300012, + 0x82000500, 0xffff0000, 0x04020034, 0x59840802, + 0x8c040d04, 0x04000025, 0x5930000a, 0x80026d40, + 0x0400001f, 0x4c5c0000, 0x4c600000, 0x497a6006, + 0x5930b809, 0x585c0006, 0x8000c540, 0x02000800, + 0x0010032e, 0x0401fe7f, 0x40625800, 0x0201f800, + 0x000203f3, 0x4978b806, 0x0401fee8, 0x497a600a, + 0x585c3409, 0x0401fca9, 0x0400000e, 0x42001000, + 0x0010cb70, 0x0401fcde, 0x0400000a, 0x0201f800, + 0x00100583, 0x04000007, 0x492cb806, 0x585c5409, + 0x0401fc6f, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x0401fc95, 0x0401f7fc, 0x8c040d06, 0x040207fc, + 0x5930000a, 0x80026d40, 0x04000006, 0x5934000e, + 0x80000540, 0x02020800, 0x0010032e, 0x497a600a, + 0x0401fcf9, 0x0401f7f2, 0x0401f088, 0x4803c856, + 0x4803c856, 0x83380580, 0x00000043, 0x02020800, + 0x0010032e, 0x4a026203, 0x00000003, 0x493a6403, + 0x59325809, 0x592c0010, 0x48026012, 0x497a6014, + 0x592c0407, 0x800000c2, 0x800010c4, 0x80081400, + 0x480a6006, 0x0201f800, 0x00020168, 0x42000800, + 0x80000060, 0x0201f000, 0x00020b30, 0x42000000, + 0x0010cf35, 0x0201f800, 0x0010bfb3, 0x59300203, + 0x82000c80, 0x0000000e, 0x02021800, 0x0010032e, + 0x4803c857, 0x82000d80, 0x00000003, 0x04000006, + 0x82000d80, 0x00000004, 0x0400005d, 0x0201f800, + 0x0010032e, 0x4d400000, 0x42028000, 0x00000006, + 0x0401f82d, 0x5c028000, 0x1c01f000, 0x4803c856, + 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, + 0x0010032e, 0x82000d80, 0x00000002, 0x0400000f, + 0x82000d80, 0x00000003, 0x04000006, 0x82000d80, + 0x00000004, 0x04000046, 0x0201f800, 0x0010032e, + 0x4d400000, 0x42028000, 0x00000005, 0x0401f816, + 0x5c028000, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x59325809, 0x812e59c0, 0x02000800, 0x0010032e, + 0x592c1a09, 0x8c0c1d0e, 0x02000800, 0x0010032e, + 0x4d400000, 0x42028000, 0x00000001, 0x0401f84b, + 0x0201f800, 0x00107eb4, 0x5c028000, 0x5c025800, + 0x1c01f000, 0x4933c857, 0x4943c857, 0x0401fa52, + 0x4df00000, 0x59300004, 0x8c00053e, 0x04020006, + 0x0201f800, 0x00107226, 0x02020800, 0x0010032e, + 0x0401f01b, 0x0201f800, 0x00109552, 0x04020007, + 0x59300415, 0x84000558, 0x48026415, 0x0201f800, + 0x0010712a, 0x04020012, 0x0201f800, 0x00110065, + 0x80c40040, 0x04000005, 0x0401f946, 0x02020800, + 0x0010032e, 0x0401f00a, 0x59325809, 0x0401f827, + 0x0201f800, 0x00107eb4, 0x5c03e000, 0x04000a1f, + 0x82000540, 0x00000001, 0x1c01f000, 0x5c03e000, + 0x04000a1a, 0x80000580, 0x1c01f000, 0x4933c857, + 0x0201f800, 0x00100c76, 0x4933c857, 0x4c5c0000, + 0x4d340000, 0x497a6006, 0x5930b809, 0x5930000a, + 0x80026d40, 0x04020e39, 0x42001000, 0x0010cb70, + 0x0401fc33, 0x04000009, 0x58c80204, 0x4800bc09, + 0x41785000, 0x0201f800, 0x001067ef, 0x5c026800, + 0x5c00b800, 0x1c01f000, 0x4978bc09, 0x0201f800, + 0x00106819, 0x0401f7fa, 0x4803c856, 0x0201f800, + 0x0010989f, 0x0400000f, 0x592c0000, 0x80000d40, + 0x04000009, 0x497a5800, 0x49425a07, 0x4c040000, + 0x0201f800, 0x000203ef, 0x5c000800, 0x40065800, + 0x0401f7f6, 0x49425a07, 0x0201f800, 0x000203ef, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, + 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, + 0x4933c857, 0x59300c07, 0x82040580, 0x0000000e, + 0x04000004, 0x82040580, 0x00000009, 0x04020004, + 0x0401ffde, 0x497a6009, 0x80000580, 0x1c01f000, + 0x592e600a, 0x83300480, 0x00111584, 0x04001016, + 0x41580000, 0x81300480, 0x04021013, 0x40040000, + 0x59300c07, 0x80040580, 0x04020012, 0x59300a03, + 0x82040580, 0x00000007, 0x02020800, 0x0010032e, + 0x59300009, 0x80000540, 0x02020800, 0x0010032e, + 0x0201f800, 0x00020b9d, 0x42000000, 0x00000000, + 0x0401f009, 0x42000000, 0x00000008, 0x0401f006, + 0x82040580, 0x00000007, 0x040207fb, 0x42000000, + 0x00000005, 0x592c0a07, 0x48065c07, 0x48025a07, + 0x0201f000, 0x000203ef, 0x4c0c0000, 0x4c100000, + 0x4c140000, 0x4c180000, 0x80001d80, 0x80002580, + 0x42003000, 0x00000020, 0x82040500, 0x00000001, + 0x04000003, 0x40080000, 0x800c1c00, 0x400c2800, + 0x800c1902, 0x80102102, 0x82140500, 0x00000001, + 0x04000003, 0x82102540, 0x80000000, 0x80040902, + 0x80183040, 0x040207f1, 0x40100800, 0x400c0000, + 0x5c003000, 0x5c002800, 0x5c002000, 0x5c001800, + 0x1c01f000, 0x4c580000, 0x4200b000, 0x00000020, + 0x80000540, 0x04000018, 0x80041c80, 0x04021016, + 0x800810c2, 0x80040982, 0x04001006, 0x80041c80, + 0x04021005, 0x8058b040, 0x040207fa, 0x0401f006, + 0x80041c80, 0x400c0800, 0x80081000, 0x8058b040, + 0x040207f4, 0x4c000000, 0x41f00000, 0x82000500, + 0xf7ffffff, 0x4003e000, 0x5c000000, 0x5c00b000, + 0x1c01f000, 0x4c000000, 0x41f00000, 0x82000540, + 0x08000000, 0x0401f7f8, 0x42007000, 0x0010cb9b, + 0x4a007000, 0x00000005, 0x4a007401, 0x00000000, + 0x4a007201, 0x00000840, 0x4a007202, 0x00000005, + 0x4a0378e8, 0x00000000, 0x4a03c821, 0x00000010, + 0x4a03c823, 0x00000004, 0x0401f81e, 0x4a0378e9, + 0x00003a0d, 0x4a0378e8, 0x00000001, 0x41780800, + 0x4203a000, 0x00007600, 0x4a03a005, 0xd0000001, + 0x59d00006, 0x4a03a005, 0x90000001, 0x83d3a400, + 0x00000020, 0x80040800, 0x82040480, 0x00000005, + 0x040017f8, 0x59e00003, 0x82000500, 0xffffffe0, + 0x82000540, 0x00008000, 0x4803c003, 0x59c40006, + 0x82000500, 0xfffcffff, 0x48038806, 0x1c01f000, + 0x4d900000, 0x4d180000, 0x4a0378e7, 0xaaaaaaaa, + 0x4a0378e6, 0xaaaaaaaa, 0x4a0378e5, 0xaaaaaaaa, + 0x4a0378e4, 0xaaaaaaaa, 0x4a03781a, 0x0010ce2e, + 0x4a03781b, 0x00100f0b, 0x4a03781c, 0x00100f1b, + 0x4a031800, 0x00000000, 0x4a031801, 0x0010cb9e, + 0x4a031802, 0x0010cba5, 0x42000800, 0x0010ce31, + 0x417a3000, 0x811b20c8, 0x83932400, 0x0000bf32, + 0x48072000, 0x4a032001, 0x00000000, 0x83180400, + 0x00107508, 0x50000000, 0x48032002, 0x82040c00, + 0x00000005, 0x811a3000, 0x83180480, 0x00000005, + 0x040017f1, 0x5c023000, 0x5c032000, 0x1c01f000, + 0x40680800, 0x0201f800, 0x00020b3e, 0x1c01f000, + 0x4933c857, 0x59300804, 0x82040d00, 0x00000100, + 0x82040d40, 0x80000040, 0x48066004, 0x497a6000, + 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, + 0x60000000, 0x480378e1, 0x1c01f000, 0x598c000f, + 0x81300580, 0x04000003, 0x497a6008, 0x1c01f000, + 0x59c40004, 0x82000500, 0x0000000c, 0x04000005, + 0x4a038804, 0x0000000c, 0x497b2807, 0x0401f00a, + 0x0401fba6, 0x59300403, 0x82000d80, 0x00000040, + 0x04000004, 0x82000580, 0x00000042, 0x04020002, + 0x497a6008, 0x0201f800, 0x001074ce, 0x80000580, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, + 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, + 0x59300804, 0x8c040d20, 0x04020004, 0x82000540, + 0x00000001, 0x1c01f000, 0x4933c857, 0x4d380000, + 0x59300804, 0x84040d20, 0x48066004, 0x42027000, + 0x00000049, 0x59300203, 0x82000580, 0x00000003, + 0x04000003, 0x42027000, 0x00000013, 0x0201f800, + 0x00020bc1, 0x80000580, 0x5c027000, 0x1c01f000, + 0x0401f807, 0x42018800, 0x00000001, 0x04000003, + 0x42018800, 0x00000000, 0x1c01f000, 0x59300018, + 0x81480580, 0x04020003, 0x59300019, 0x814c0580, + 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x0401f8ce, + 0x4df00000, 0x0201f800, 0x00106628, 0x59900001, + 0x82000500, 0x00000003, 0x0c01f001, 0x00106d8c, + 0x00106d81, 0x00106d7f, 0x00106d7f, 0x0201f800, + 0x0010032e, 0x59926004, 0x0401f88a, 0x813261c0, + 0x04000008, 0x59300004, 0x8c000516, 0x04000004, + 0x59325809, 0x497a5809, 0x497a580a, 0x0401f88a, + 0x5c03e000, 0x040008a1, 0x5c026000, 0x5c025800, + 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, + 0x4d300000, 0x497b2807, 0x0401f8ab, 0x4df00000, + 0x598c0000, 0x82000500, 0x0000000f, 0x4803c857, + 0x0c01f001, 0x00106dd2, 0x00106daf, 0x00106db8, + 0x00106dbf, 0x00106dcd, 0x00106dd2, 0x00106dad, + 0x00106dbc, 0x00106dd2, 0x00106dad, 0x00106dad, + 0x00106dad, 0x00106dad, 0x00106dad, 0x00106dad, + 0x00106dad, 0x0201f800, 0x0010032e, 0x598c000f, + 0x80026540, 0x04000004, 0x0401f824, 0x02020800, + 0x0010032e, 0x0201f800, 0x001074ce, 0x0401f01b, + 0x0401f82d, 0x0201f800, 0x001074ce, 0x0401f017, + 0x0201f800, 0x0010ba5c, 0x0401f7f7, 0x598c000f, + 0x80026540, 0x04000011, 0x0401f83b, 0x04000007, + 0x0401f812, 0x04000005, 0x0401f81f, 0x04000003, + 0x0201f800, 0x0010ba5c, 0x0201f800, 0x001074ce, + 0x0401f006, 0x0401f830, 0x02020800, 0x0010032e, + 0x0201f800, 0x001074ce, 0x5c03e000, 0x0400085b, + 0x5c026000, 0x1c01f000, 0x598c0009, 0x81300580, + 0x0402000c, 0x0401f84e, 0x0401f83b, 0x59300000, + 0x800001c0, 0x04000004, 0x48031809, 0x497a6000, + 0x0401f003, 0x497b1809, 0x497b1808, 0x80000580, + 0x1c01f000, 0x4d2c0000, 0x59300407, 0x82000580, + 0x00000003, 0x04020012, 0x598c000b, 0x81300580, + 0x0402000f, 0x0401f83a, 0x59325809, 0x497a5809, + 0x497a580a, 0x0401f824, 0x59300000, 0x800001c0, + 0x04000004, 0x4803180b, 0x497a6000, 0x0401f003, + 0x497b180a, 0x497b180b, 0x80000580, 0x5c025800, + 0x1c01f000, 0x598c0005, 0x81300580, 0x0402000c, + 0x0401f827, 0x0401f814, 0x59300000, 0x800001c0, + 0x04000004, 0x48031805, 0x497a6000, 0x0401f003, + 0x497b1805, 0x497b1804, 0x80000580, 0x1c01f000, + 0x4a032001, 0x00000000, 0x497b2004, 0x497b2005, + 0x59900006, 0x82000500, 0x0000ffff, 0x48032006, + 0x1c01f000, 0x4c040000, 0x59300004, 0x82000500, + 0x7ffeffff, 0x48026004, 0x59bc00e4, 0x8c000514, + 0x04000009, 0x42000800, 0x0000bf00, 0x58040012, + 0x81300580, 0x04020004, 0x49780812, 0x4a0378e4, + 0x00000800, 0x5c000800, 0x1c01f000, 0x4803c856, + 0x598c000e, 0x80000540, 0x04000003, 0x80000040, + 0x4803180e, 0x1c01f000, 0x59bc00ea, 0x82000500, + 0x00000007, 0x82000580, 0x00000003, 0x04020006, + 0x4803c856, 0x4a0378e8, 0x00000001, 0x4a0370e4, + 0x00000800, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, 0x59bc00ea, 0x82000500, 0x00000007, - 0x82000580, 0x00000001, 0x02020800, 0x0010032e, + 0x82000580, 0x00000001, 0x04020013, 0x4803c856, + 0x42000800, 0x00000000, 0x0401f810, 0x4a0370e4, + 0x00000c00, 0x42000800, 0x00001000, 0x59bc00ea, + 0x82000500, 0x00000007, 0x82000580, 0x00000003, + 0x04000005, 0x80040840, 0x040207f9, 0x0201f800, + 0x0010032e, 0x1c01f000, 0x59bc00ea, 0x82000500, + 0x00000007, 0x82000580, 0x00000001, 0x02020800, + 0x0010032e, 0x59bc00ea, 0x8c000516, 0x040207fe, + 0x480778e1, 0x1c01f000, 0x40681000, 0x406c0800, 0x59bc00ea, 0x8c000516, 0x040207fe, 0x480778e1, - 0x1c01f000, 0x40681000, 0x406c0800, 0x59bc00ea, - 0x8c000516, 0x040207fe, 0x480778e1, 0x59bc00ea, - 0x8c000516, 0x040207fe, 0x480b78e1, 0x1c01f000, - 0x4a0378e4, 0x00002000, 0x59a80070, 0x82000500, - 0x0000000c, 0x04020008, 0x42007000, 0x0010c89b, - 0x58380401, 0x8c000506, 0x04020003, 0x4a0378e4, - 0x00080000, 0x1c01f000, 0x82000d00, 0x80000018, - 0x02020800, 0x00100323, 0x0201f800, 0x0010032e, - 0x00106c90, 0x00106d6f, 0x00106d8a, 0x00106c90, - 0x00106c92, 0x00106ce5, 0x00106d04, 0x00106d3c, - 0x00106c90, 0x00106d6d, 0x00106cb3, 0x00106c90, - 0x00106c90, 0x00106c90, 0x00106c90, 0x00106c90, - 0x0201f800, 0x0010032e, 0x4d300000, 0x4d900000, - 0x4dd00000, 0x4da40000, 0x4d140000, 0x0201f800, - 0x001072f1, 0x59bc00ea, 0x8c000510, 0x040007fe, - 0x59be60e0, 0x59300004, 0x8c000520, 0x04000011, - 0x82000500, 0xfffefeff, 0x48026004, 0x4a026203, - 0x00000003, 0x0401ff97, 0x0201f800, 0x00100df4, - 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x5c026000, 0x4a0378e4, 0x00000008, 0x0401f77a, - 0x84000510, 0x48026004, 0x0401f7f6, 0x4d300000, - 0x4d2c0000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x0201f800, 0x001072f1, 0x59bc00ea, - 0x8c000510, 0x040007fe, 0x59be60e0, 0x59300004, - 0x8c000520, 0x04000021, 0x82000500, 0xfffefeff, - 0x48026004, 0x4a026203, 0x00000003, 0x59325809, - 0x812e59c0, 0x02000800, 0x0010032e, 0x42000000, - 0x0010cc46, 0x0201f800, 0x0010bc88, 0x0401f8f3, - 0x04000009, 0x592c0209, 0x84000552, 0x48025a09, - 0x0201f800, 0x001010ed, 0x0401ff66, 0x0201f800, - 0x00100df4, 0x5c022800, 0x5c034800, 0x5c03a000, - 0x5c032000, 0x5c025800, 0x5c026000, 0x4a0378e4, - 0x00000008, 0x0401f748, 0x84000510, 0x48026004, - 0x0401f7f5, 0x4d300000, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x0201f800, 0x001072f1, - 0x59bc00ea, 0x8c000510, 0x040007fe, 0x59be60e0, - 0x59300004, 0x8c000520, 0x0400000f, 0x82000500, - 0xfffefeff, 0x48026004, 0x0401ff46, 0x0201f800, - 0x00100e36, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x59bc00ea, 0x8c000516, 0x040207fe, 0x480b78e1, + 0x1c01f000, 0x4a0378e4, 0x00002000, 0x59a80070, + 0x82000500, 0x0000000c, 0x04020008, 0x42007000, + 0x0010cb9b, 0x58380401, 0x8c000506, 0x04020003, + 0x4a0378e4, 0x00080000, 0x1c01f000, 0x82000d00, + 0x80000018, 0x02020800, 0x00100323, 0x0201f800, + 0x0010032e, 0x00106e95, 0x00106f74, 0x00106f8f, + 0x00106e95, 0x00106e97, 0x00106eea, 0x00106f09, + 0x00106f41, 0x00106e95, 0x00106f72, 0x00106eb8, + 0x00106e95, 0x00106e95, 0x00106e95, 0x00106e95, + 0x00106e95, 0x0201f800, 0x0010032e, 0x4d300000, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x0201f800, 0x001074f6, 0x59bc00ea, 0x8c000510, + 0x040007fe, 0x59be60e0, 0x59300004, 0x8c000520, + 0x04000011, 0x82000500, 0xfffefeff, 0x48026004, + 0x4a026203, 0x00000003, 0x0401ff97, 0x0201f800, + 0x00100df5, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c026000, 0x4a0378e4, 0x00000008, - 0x0401f729, 0x84000510, 0x48026004, 0x0401f7f6, - 0x4d300000, 0x4d2c0000, 0x4d340000, 0x4da40000, - 0x4cd00000, 0x4d240000, 0x59bc00ea, 0x8c000510, - 0x040007fe, 0x59be60e0, 0x813261c0, 0x02000800, - 0x0010032e, 0x59300004, 0x8c000520, 0x04000020, - 0x82000500, 0xfffefeff, 0x48026004, 0x5932680a, - 0x42034800, 0x0010c89e, 0x5932481c, 0x04011000, - 0x4a03c840, 0x0010c8a5, 0x4a03c842, 0x00000012, - 0x04011000, 0x4a03c840, 0x0010c8b7, 0x4a03c842, - 0x000000ff, 0x04011000, 0x4a03c840, 0x0010c9b6, - 0x4a03c842, 0x000000ff, 0x0201f800, 0x00107308, - 0x5c024800, 0x5c01a000, 0x5c034800, 0x5c026800, - 0x5c025800, 0x5c026000, 0x1c01f000, 0x84000510, - 0x48026004, 0x5c024800, 0x5c01a000, 0x5c034800, - 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, - 0x4d300000, 0x4d2c0000, 0x4d340000, 0x4cd00000, - 0x4d240000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x0201f800, 0x001072f1, 0x59bc00ea, + 0x0401f77a, 0x84000510, 0x48026004, 0x0401f7f6, + 0x4d300000, 0x4d2c0000, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x0201f800, 0x001074f6, + 0x59bc00ea, 0x8c000510, 0x040007fe, 0x59be60e0, + 0x59300004, 0x8c000520, 0x04000021, 0x82000500, + 0xfffefeff, 0x48026004, 0x4a026203, 0x00000003, + 0x59325809, 0x812e59c0, 0x02000800, 0x0010032e, + 0x42000000, 0x0010cf46, 0x0201f800, 0x0010bfb3, + 0x0401f8f3, 0x04000009, 0x592c0209, 0x84000552, + 0x48025a09, 0x0201f800, 0x001010ee, 0x0401ff66, + 0x0201f800, 0x00100df5, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x5c025800, 0x5c026000, + 0x4a0378e4, 0x00000008, 0x0401f748, 0x84000510, + 0x48026004, 0x0401f7f5, 0x4d300000, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x0201f800, + 0x001074f6, 0x59bc00ea, 0x8c000510, 0x040007fe, + 0x59be60e0, 0x59300004, 0x8c000520, 0x0400000f, + 0x82000500, 0xfffefeff, 0x48026004, 0x0401ff46, + 0x0201f800, 0x00100e37, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x5c026000, 0x4a0378e4, + 0x00000008, 0x0401f729, 0x84000510, 0x48026004, + 0x0401f7f6, 0x4d300000, 0x4d2c0000, 0x4d340000, + 0x4da40000, 0x4cd00000, 0x4d240000, 0x59bc00ea, 0x8c000510, 0x040007fe, 0x59be60e0, 0x813261c0, 0x02000800, 0x0010032e, 0x59300004, 0x8c000520, - 0x04000011, 0x82000500, 0xfffefeff, 0x48026004, - 0x5932481c, 0x0201f800, 0x00107af1, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c024800, - 0x5c01a000, 0x5c026800, 0x5c025800, 0x5c026000, - 0x1c01f000, 0x84000510, 0x48026004, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c024800, - 0x5c01a000, 0x5c026800, 0x5c025800, 0x5c026000, - 0x1c01f000, 0x0201f800, 0x0010032e, 0x4d300000, - 0x4d380000, 0x42000000, 0x0010cc84, 0x0201f800, - 0x0010bc88, 0x0401fec7, 0x598e600f, 0x59c40004, - 0x8c000506, 0x04000004, 0x0401f95f, 0x4a038804, - 0x00000008, 0x813261c0, 0x04000007, 0x0201f800, - 0x001072eb, 0x42027000, 0x00000014, 0x0201f800, - 0x00020bc1, 0x4a0378e4, 0x00000002, 0x5c027000, - 0x5c026000, 0x0401f6a0, 0x4d180000, 0x4d300000, - 0x4d380000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x0401feab, 0x417a3000, 0x59c40804, - 0x83180400, 0x0010729b, 0x50000000, 0x80040500, - 0x0400001c, 0x42000000, 0x0010cc85, 0x0201f800, - 0x0010bc88, 0x0201f800, 0x001072f1, 0x59926004, - 0x0401f8d5, 0x83180400, 0x0010729b, 0x50000000, - 0x48038804, 0x813261c0, 0x0400000a, 0x59300004, - 0x8c00050c, 0x04020003, 0x4a026203, 0x00000003, - 0x42027000, 0x0000004a, 0x0201f800, 0x00020bc1, - 0x59c40004, 0x82000500, 0x00f80000, 0x04000005, - 0x811a3000, 0x83180480, 0x00000005, 0x040017dc, - 0x4a0378e4, 0x00000008, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x5c027000, 0x5c026000, - 0x5c023000, 0x0401f668, 0x59300004, 0x8c000538, - 0x04020066, 0x59300222, 0x82000500, 0x00000003, - 0x82000580, 0x00000001, 0x04020060, 0x42000000, - 0x0010ccb7, 0x0201f800, 0x0010bc88, 0x0401fe6d, - 0x4df00000, 0x4c640000, 0x0401f8a3, 0x0401fd99, - 0x5930c804, 0x8464cd78, 0x59d00011, 0x59d02012, - 0x4803c857, 0x4813c857, 0x0401fbea, 0x04020041, - 0x48166012, 0x4c100000, 0x4c5c0000, 0x4c600000, - 0x4a026203, 0x00000002, 0x592c0a05, 0x82040d00, - 0x000000ff, 0x82040580, 0x00000072, 0x04020005, - 0x4a026203, 0x00000003, 0x592c000e, 0x80102480, - 0x4010b800, 0x4014c000, 0x42000000, 0x00000001, - 0x1201f800, 0x00108c59, 0x40602800, 0x5c00c000, - 0x5c00b800, 0x5c002000, 0x04000026, 0x42000000, - 0xd0000000, 0x41300800, 0x0201f800, 0x001008c9, - 0x59300008, 0x4c000000, 0x4a026008, 0x00200000, - 0x0201f800, 0x00100f2a, 0x5c000000, 0x48026008, - 0x04020018, 0x8464cd26, 0x592c0209, 0x8c00051e, - 0x0402000c, 0x8464cd4a, 0x50201800, 0x480e600b, - 0x8464cd7e, 0x48666004, 0x0401fbeb, 0x5c00c800, - 0x5c03e000, 0x04000e18, 0x80000580, 0x1c01f000, - 0x8400051e, 0x48025a09, 0x0201f800, 0x00100ee8, - 0x4832600c, 0x4822600d, 0x482a600e, 0x0401f7ef, - 0x42000000, 0x0010ccb8, 0x0201f800, 0x0010bc88, - 0x4a026203, 0x00000003, 0x49332004, 0x8464cd7e, - 0x48666004, 0x4a032001, 0x00000001, 0x5c00c800, - 0x5c03e000, 0x04000e00, 0x82000540, 0x00000001, - 0x0401f7e7, 0x4d2c0000, 0x4d340000, 0x5932680a, - 0x598c0800, 0x82040580, 0x00000004, 0x04020006, - 0x838c1400, 0x00000005, 0x838c1c00, 0x00000004, - 0x0401f010, 0x82040580, 0x00000001, 0x04020006, - 0x838c1400, 0x00000009, 0x838c1c00, 0x00000008, - 0x0401f008, 0x82040580, 0x00000002, 0x04020028, - 0x838c1400, 0x0000000b, 0x838c1c00, 0x0000000a, - 0x41306800, 0x58340000, 0x80007d40, 0x04000020, - 0x583c000a, 0x81340580, 0x04020006, 0x403c6800, - 0x583c0000, 0x80007d40, 0x040207fa, 0x0401f018, - 0x4933c857, 0x483fc857, 0x583c0000, 0x48006800, - 0x49307800, 0x443c1000, 0x500c0000, 0x803c0580, - 0x04020002, 0x44341800, 0x80000580, 0x4803180f, - 0x48031811, 0x598c0000, 0x82000580, 0x00000003, - 0x04000003, 0x4a031800, 0x00000000, 0x80000580, - 0x5c026800, 0x5c025800, 0x1c01f000, 0x82000540, - 0x00000001, 0x0401f7fb, 0x0401f807, 0x42018800, - 0x00000000, 0x04000003, 0x42018800, 0x00000001, - 0x1c01f000, 0x491bc857, 0x59b400f6, 0x82000500, - 0x00000038, 0x040207fd, 0x59c80840, 0x82040540, - 0x00000010, 0x48039040, 0x59c41008, 0x4c040000, - 0x4c080000, 0x82081500, 0xffffff7f, 0x480b8808, - 0x0401fbf9, 0x04020007, 0x0401fbfd, 0x04000024, - 0x48038804, 0x0201f800, 0x00100eb4, 0x0401f044, - 0x4a038803, 0x00000008, 0x59c40003, 0x82000500, - 0x00000003, 0x040007fd, 0x8c000502, 0x04020007, - 0x0401fbef, 0x04000016, 0x48038804, 0x0201f800, - 0x00100eb4, 0x0401f036, 0x0401fbef, 0x04020007, - 0x59c80040, 0x8400056a, 0x48039040, 0x59c80040, - 0x8c00052a, 0x040207fe, 0x59c40005, 0x82000500, - 0xc0000000, 0x04000006, 0x59c400a3, 0x84000540, - 0x480388a3, 0x4a038805, 0xc0000000, 0x0201f800, - 0x00100e45, 0x4a03a005, 0x30000000, 0x59d00006, - 0x4a03a005, 0x30000000, 0x59900006, 0x82000500, - 0xffff0000, 0x48032006, 0x59d00005, 0x8c000504, - 0x040207fe, 0x42000800, 0x00007600, 0x83180540, - 0x60000000, 0x480008a1, 0x811800dc, 0x59c80840, - 0x80040540, 0x48039040, 0x82000540, 0x00003000, - 0x48039040, 0x59c80040, 0x82000500, 0x00003000, - 0x040207fd, 0x0201f800, 0x00100ea3, 0x83180400, - 0x0010729b, 0x50000000, 0x48038804, 0x80000580, - 0x4df00000, 0x0201f800, 0x00106423, 0x5c03e000, - 0x5c001000, 0x5c000800, 0x480b8808, 0x48079040, - 0x1c01f000, 0x4803c856, 0x59b400f6, 0x82000500, - 0x00000038, 0x040207fd, 0x59c80840, 0x82040540, - 0x00000010, 0x48039040, 0x59c41008, 0x4c040000, - 0x4c080000, 0x82081500, 0xffffff7f, 0x480b8808, - 0x59c40004, 0x82000500, 0x00000003, 0x04020010, - 0x59c40004, 0x82000500, 0x0000000c, 0x04000005, - 0x4a038804, 0x0000000c, 0x8c000504, 0x0401f025, - 0x59c80040, 0x8400056e, 0x48039040, 0x59c80040, - 0x8c00052e, 0x040207fe, 0x0401f01e, 0x4a038803, - 0x00000008, 0x59c40003, 0x82000500, 0x00000003, - 0x040007fd, 0x8c000502, 0x04020006, 0x59c40004, - 0x4a038804, 0x0000000c, 0x8c000504, 0x0401f011, - 0x59c80040, 0x8400056a, 0x48039040, 0x59c80040, - 0x8c00052a, 0x040207fe, 0x59c40005, 0x82000500, - 0xc0000000, 0x04000007, 0x59c400a3, 0x84000540, - 0x480388a3, 0x4a038805, 0xc0000000, 0x80000580, - 0x497b2807, 0x5c001000, 0x5c000800, 0x480b8808, - 0x48079040, 0x1c01f000, 0x0401f807, 0x42018800, - 0x00000001, 0x04000003, 0x42018800, 0x00000000, - 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, - 0x491bc857, 0x4933c857, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x0401fd0e, 0x4df00000, - 0x0401fbc1, 0x59900004, 0x800001c0, 0x04000011, - 0x81300580, 0x0402000f, 0x59300004, 0x84000520, - 0x48026004, 0x0401ff3c, 0x04020009, 0x5c03e000, - 0x04000ced, 0x80000580, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x1c01f000, 0x0401fc29, - 0x42027000, 0x00000049, 0x59300004, 0x84000520, - 0x48026004, 0x8c00050c, 0x02020800, 0x00020bc1, - 0x5c03e000, 0x04000cdc, 0x82000540, 0x00000001, + 0x04000020, 0x82000500, 0xfffefeff, 0x48026004, + 0x5932680a, 0x42034800, 0x0010cb9e, 0x5932481c, + 0x04011000, 0x4a03c840, 0x0010cba5, 0x4a03c842, + 0x00000012, 0x04011000, 0x4a03c840, 0x0010cbb7, + 0x4a03c842, 0x000000ff, 0x04011000, 0x4a03c840, + 0x0010ccb6, 0x4a03c842, 0x000000ff, 0x0201f800, + 0x0010750d, 0x5c024800, 0x5c01a000, 0x5c034800, + 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x84000510, 0x48026004, 0x5c024800, 0x5c01a000, + 0x5c034800, 0x5c026800, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x4d300000, 0x4d2c0000, 0x4d340000, + 0x4cd00000, 0x4d240000, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x0201f800, 0x001074f6, + 0x59bc00ea, 0x8c000510, 0x040007fe, 0x59be60e0, + 0x813261c0, 0x02000800, 0x0010032e, 0x59300004, + 0x8c000520, 0x04000011, 0x82000500, 0xfffefeff, + 0x48026004, 0x5932481c, 0x0201f800, 0x00107ce7, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, - 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, - 0x4933c857, 0x0401fcdf, 0x4df00000, 0x598c000f, - 0x80026540, 0x04000012, 0x59300004, 0x84000520, - 0x48026004, 0x0401ff74, 0x04000017, 0x0401fc25, - 0x42027000, 0x00000013, 0x59300004, 0x8c00050c, - 0x02020800, 0x00020bc1, 0x5c03e000, 0x04000cba, - 0x82000540, 0x00000001, 0x1c01f000, 0x836c1580, - 0x00000001, 0x040007f9, 0x836c1580, 0x00000004, - 0x040007f6, 0x42001000, 0x00104038, 0x0201f800, - 0x001062f9, 0x5c03e000, 0x04000cab, 0x80000580, - 0x1c01f000, 0x4d300000, 0x4d180000, 0x4d3c0000, - 0x0401fcb8, 0x4df00000, 0x4a0378e4, 0x0000000f, - 0x0401fb41, 0x417a3000, 0x811808c8, 0x82040c00, - 0x0000bf32, 0x58066004, 0x813261c0, 0x04000010, - 0x417a7800, 0x0201f800, 0x0010483c, 0x0400000a, - 0x59300c07, 0x82040580, 0x00000003, 0x04000004, - 0x82040580, 0x00000006, 0x04020003, 0x42027800, - 0x00000002, 0x0201f800, 0x001091f1, 0x811a3000, - 0x83180480, 0x00000005, 0x040017e8, 0x42000800, - 0x00000040, 0x0201f800, 0x001012d1, 0x4a0378e4, - 0x0000000a, 0x5c03e000, 0x04000c7f, 0x5c027800, - 0x5c023000, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x0401fc8b, 0x4df00000, 0x59c80840, - 0x84040d74, 0x82040540, 0x00000010, 0x48039040, - 0x59c41008, 0x4c040000, 0x4c080000, 0x82081500, - 0xffffff7f, 0x480b8808, 0x42001000, 0x00000003, - 0x0401fafc, 0x598e600f, 0x813261c0, 0x04020f99, - 0x04000b05, 0x497b2807, 0x0401f809, 0x5c001000, - 0x5c000800, 0x480b8808, 0x48079040, 0x5c03e000, - 0x04000c5d, 0x5c026000, 0x1c01f000, 0x4d380000, - 0x4d180000, 0x4d300000, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x417a3000, 0x0201f800, - 0x00106423, 0x811a3000, 0x83180580, 0x00000005, - 0x040207fb, 0x0401fad4, 0x04020009, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c026000, - 0x5c023000, 0x5c027000, 0x1c01f000, 0x0401fb0a, - 0x59926004, 0x4933c857, 0x0401fe8b, 0x813261c0, - 0x040007f3, 0x42027000, 0x0000004a, 0x4a026203, - 0x00000003, 0x0201f800, 0x00020bc1, 0x0401f7ec, - 0x4d300000, 0x4d180000, 0x4d900000, 0x0401fc45, - 0x42001000, 0x00000000, 0x598c0800, 0x82040580, - 0x00000005, 0x04000003, 0x82040580, 0x00000008, - 0x04000abc, 0x417a3000, 0x811b20c8, 0x83932400, - 0x0000bf32, 0x59900001, 0x82000580, 0x00000001, - 0x0402000d, 0x42000800, 0x00000004, 0x59926004, - 0x59300012, 0x82000500, 0xfff00000, 0x80000540, - 0x04000003, 0x42000800, 0x0000000e, 0x0201f800, - 0x001063ff, 0x811a3000, 0x83180480, 0x00000005, - 0x040017ea, 0x59c81040, 0x84081534, 0x480b9040, - 0x0401fc0d, 0x5c032000, 0x5c023000, 0x5c026000, - 0x1c01f000, 0x4933c857, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x4d380000, 0x0401fc15, - 0x4df00000, 0x59300004, 0x8c00053e, 0x04020007, - 0x8c000520, 0x04000027, 0x0201f800, 0x00106b47, - 0x04000024, 0x0401f02d, 0x598c000f, 0x81300580, - 0x04000012, 0x0201f800, 0x0010931e, 0x04020027, - 0x0401fa4b, 0x04000025, 0x48038804, 0x0401fab6, - 0x0201f800, 0x00100eb4, 0x0201f800, 0x00106b6c, - 0x42027000, 0x00000049, 0x59300004, 0x8c00050c, - 0x0402000e, 0x0401f00f, 0x59c40004, 0x8c000504, - 0x04000016, 0x4a038804, 0x00000004, 0x0201f800, - 0x00106b8c, 0x42027000, 0x00000013, 0x59300004, - 0x8c00050c, 0x04000003, 0x0201f800, 0x00020bc1, - 0x5c03e000, 0x02000800, 0x00106c29, 0x5c027000, + 0x5c024800, 0x5c01a000, 0x5c026800, 0x5c025800, + 0x5c026000, 0x1c01f000, 0x84000510, 0x48026004, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x80000580, 0x1c01f000, 0x5c03e000, 0x02000800, - 0x00106c29, 0x5c027000, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x82000540, 0x00000001, - 0x1c01f000, 0x59300407, 0x82000580, 0x00000003, - 0x04020008, 0x0201f800, 0x00109667, 0x04000005, - 0x59301009, 0x58080409, 0x84000550, 0x48001409, - 0x1c01f000, 0x497b2807, 0x0201f800, 0x00106c3c, - 0x59c400af, 0x800001c0, 0x04020005, 0x0201f800, - 0x00106c29, 0x0201f000, 0x001014c6, 0x598c0011, - 0x82001480, 0x00000002, 0x04021007, 0x80000000, - 0x48031811, 0x80000580, 0x0201f800, 0x001063f8, - 0x04000011, 0x0401fed3, 0x0402000f, 0x0401ffde, - 0x42000000, 0x0010cc3c, 0x0201f800, 0x0010bc88, - 0x0401fd9d, 0x04000008, 0x0401fa59, 0x4d380000, - 0x42027000, 0x00000014, 0x0201f800, 0x00020bc1, - 0x5c027000, 0x0201f800, 0x00106c29, 0x0201f000, - 0x001014c6, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x4d300000, 0x0201f800, 0x00106423, - 0x0201f800, 0x00106c3c, 0x59c400af, 0x800001c0, - 0x0400002b, 0x0401fa48, 0x59926004, 0x4933c857, - 0x59300004, 0x8c000516, 0x0400000c, 0x0401fe76, - 0x04020023, 0x0201f800, 0x00106b6c, 0x0201f800, - 0x00106c29, 0x42000800, 0x80000804, 0x0201f800, - 0x00020b30, 0x0401f01a, 0x42001800, 0x00007530, - 0x0401f9e9, 0x04020004, 0x0201f800, 0x001063fd, - 0x0401f013, 0x0401fe64, 0x04020011, 0x0401ffa6, - 0x42000000, 0x0010cc3d, 0x0201f800, 0x0010bc88, + 0x5c024800, 0x5c01a000, 0x5c026800, 0x5c025800, + 0x5c026000, 0x1c01f000, 0x0201f800, 0x0010032e, + 0x4d300000, 0x4d380000, 0x42000000, 0x0010cf84, + 0x0201f800, 0x0010bfb3, 0x0401fec7, 0x598e600f, + 0x59c40004, 0x8c000506, 0x04000004, 0x0401f95f, + 0x4a038804, 0x00000008, 0x813261c0, 0x04000007, + 0x0201f800, 0x001074f0, 0x42027000, 0x00000014, + 0x0201f800, 0x00020bc1, 0x4a0378e4, 0x00000002, + 0x5c027000, 0x5c026000, 0x0401f6a0, 0x4d180000, + 0x4d300000, 0x4d380000, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x0401feab, 0x417a3000, + 0x59c40804, 0x83180400, 0x001074a0, 0x50000000, + 0x80040500, 0x0400001c, 0x42000000, 0x0010cf85, + 0x0201f800, 0x0010bfb3, 0x0201f800, 0x001074f6, + 0x59926004, 0x0401f8d5, 0x83180400, 0x001074a0, + 0x50000000, 0x48038804, 0x813261c0, 0x0400000a, 0x59300004, 0x8c00050c, 0x04020003, 0x4a026203, - 0x00000003, 0x4d380000, 0x42027000, 0x0000004a, - 0x0201f800, 0x00020bc1, 0x5c027000, 0x0201f800, - 0x00106c29, 0x5c026000, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x0201f000, 0x001014c6, - 0x4c600000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x4d300000, 0x4d2c0000, 0x0201f800, - 0x00106c3c, 0x0401fa0c, 0x59926004, 0x813261c0, - 0x04000091, 0x0201f800, 0x00104fc6, 0x04020007, - 0x4178c000, 0x0201f800, 0x00107c57, 0x04000003, - 0x4200c000, 0x00000001, 0x42000000, 0x00001000, - 0x50000000, 0x82000480, 0x24320001, 0x04001038, - 0x0201f800, 0x00100e45, 0x59303004, 0x8c183536, - 0x0400002f, 0x42003000, 0x00001000, 0x80183040, - 0x04000014, 0x0201f800, 0x0010bdab, 0x040007fc, - 0x0201f800, 0x0010064a, 0x42003000, 0x00007a15, - 0x50183800, 0x821c0500, 0x00007000, 0x04000009, - 0x4803507a, 0x821c0500, 0xffff8fff, 0x44003000, - 0x4a032832, 0x000004b0, 0x4a0378e4, 0x02c00000, - 0x4a030000, 0x00000000, 0x0201f800, 0x00100ea3, - 0x850e1d2e, 0x42000000, 0x0010ccb5, 0x0201f800, - 0x0010bc88, 0x59325809, 0x812e59c0, 0x02000800, - 0x0010032e, 0x0401f861, 0x04000057, 0x59303004, - 0x84183536, 0x481a6004, 0x0401f032, 0x0201f800, - 0x00106410, 0x0400002c, 0x0401f04f, 0x0201f800, - 0x00100ea3, 0x8d0e1d2e, 0x040207f9, 0x0201f800, - 0x00104fc6, 0x04020006, 0x8060c1c0, 0x04000004, - 0x0201f800, 0x00107c81, 0x0401f043, 0x0201f800, - 0x00106410, 0x04020040, 0x4933c857, 0x0401f94e, - 0x04020019, 0x0201f800, 0x00106423, 0x813261c0, - 0x04000039, 0x59325809, 0x812e59c0, 0x02000800, - 0x0010032e, 0x0201f800, 0x00104fc6, 0x04020022, - 0x59c40093, 0x4803c857, 0x800001c0, 0x0402000a, - 0x592c0209, 0x84000550, 0x48025a09, 0x0201f800, - 0x001050f2, 0x04020028, 0x592c0209, 0x84000510, - 0x48025a09, 0x0201f800, 0x001063fd, 0x0401f022, - 0x42000000, 0x0010cc3d, 0x0201f800, 0x0010bc88, - 0x0401fd19, 0x592c0209, 0x84000550, 0x48025a09, - 0x4d380000, 0x42027000, 0x0000004a, 0x4a026203, - 0x00000003, 0x0201f800, 0x00020bc1, 0x5c027000, - 0x0401f011, 0x59900006, 0x82000500, 0xffff0000, - 0x040207ec, 0x59c408af, 0x82040480, 0x000003e8, - 0x040217e8, 0x59900006, 0x82000400, 0x00010000, - 0x48032006, 0x0201f800, 0x001063fd, 0x0201f800, - 0x00104011, 0x5c025800, 0x5c026000, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c00c000, - 0x0201f000, 0x00106c29, 0x4c5c0000, 0x4c640000, - 0x5930bc07, 0x5930c804, 0x825c0580, 0x00000003, - 0x04000004, 0x825c0580, 0x00000006, 0x04020031, - 0x0201f800, 0x0010483c, 0x0402002e, 0x8c64cd0e, - 0x0402002c, 0x0401fce4, 0x0201f800, 0x00106b6c, - 0x825c0580, 0x00000003, 0x04020005, 0x8c64cd16, - 0x0400000c, 0x8464cd36, 0x0401f01b, 0x82640500, - 0x0000001f, 0x82000580, 0x00000005, 0x04000005, - 0x0201f800, 0x00020172, 0x8464cd4a, 0x0401f7f6, - 0x0401f820, 0x04020017, 0x48166012, 0x0201f800, - 0x00100f2a, 0x04020013, 0x8264cd00, 0xfff7ffdf, - 0x592c0209, 0x8c00051e, 0x04020011, 0x8464cd4a, - 0x50201800, 0x480e600b, 0x4832600c, 0x4822600d, - 0x482a600e, 0x8464cd7e, 0x48666004, 0x0401f842, - 0x80000580, 0x5c00c800, 0x5c00b800, 0x1c01f000, - 0x82000540, 0x00000001, 0x0401f7fb, 0x8400051e, - 0x48025a09, 0x0201f800, 0x00100ee8, 0x0401f7ed, - 0x59302013, 0x811808c2, 0x82040c00, 0x00006000, - 0x58040101, 0x82000500, 0xffff0000, 0x800001c0, - 0x0400000b, 0x811808ca, 0x82040c00, 0x00006000, - 0x58040138, 0x58042139, 0x81a41000, 0x58081403, - 0x800810e0, 0x80081540, 0x480a601b, 0x59300013, - 0x80100480, 0x0400101d, 0x8c64cd0e, 0x0400000c, - 0x40101000, 0x41780800, 0x4c000000, 0x59300223, - 0x4c100000, 0x0201f800, 0x00106a98, 0x5c002000, - 0x5c000000, 0x800409c0, 0x04020010, 0x59902808, - 0x59303016, 0x80140480, 0x0400100c, 0x40002800, - 0x80180480, 0x04001009, 0x48026016, 0x8464cd36, - 0x59300014, 0x80100580, 0x04000003, 0x8464cd76, - 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, - 0x1c01f000, 0x59bc00ea, 0x82000500, 0x00000007, - 0x82000580, 0x00000001, 0x02000800, 0x0010032e, - 0x5930080a, 0x5804100c, 0x480bc857, 0x800811c0, - 0x04020003, 0x4930080c, 0x0401f01b, 0x59bc1031, - 0x40081800, 0x800811c0, 0x02000800, 0x0010032e, - 0x5808000a, 0x80040580, 0x04000004, 0x40081800, - 0x58081000, 0x0401f7f8, 0x58082000, 0x49781000, - 0x480a6001, 0x400c0000, 0x80080580, 0x04020006, - 0x49337831, 0x48126000, 0x801021c0, 0x0402000d, - 0x0401f00b, 0x48101800, 0x801021c0, 0x04020002, - 0x480f7830, 0x59bc0831, 0x4807c857, 0x48066000, - 0x49337831, 0x800409c0, 0x04020002, 0x49337830, - 0x1c01f000, 0x4d300000, 0x4d2c0000, 0x0201f800, - 0x00106c3c, 0x598e600f, 0x4933c857, 0x813261c0, - 0x04000049, 0x59c41004, 0x480bc857, 0x8c081500, - 0x0400000a, 0x0201f800, 0x00104fc6, 0x04020015, - 0x0201f800, 0x001050f2, 0x0402003f, 0x0201f800, - 0x001063f8, 0x0401f03c, 0x82080500, 0x000001fe, - 0x040207fb, 0x59c8010b, 0x4803c857, 0x8c000500, - 0x040007f7, 0x42000000, 0x0010cc86, 0x0201f800, - 0x0010bc88, 0x0401fd13, 0x0400087f, 0x0401f02e, - 0x598c0011, 0x80000540, 0x04020011, 0x59c408af, - 0x82040480, 0x000003e8, 0x0402100d, 0x598c0811, - 0x80040800, 0x48071811, 0x0201f800, 0x001063f8, - 0x42000000, 0x0010cb7b, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x00104011, 0x0401f01b, 0x42000000, - 0x0010cc3c, 0x0201f800, 0x0010bc88, 0x0401fc76, - 0x813261c0, 0x04020003, 0x0401f863, 0x0401f012, - 0x59300407, 0x82000580, 0x00000003, 0x04020007, - 0x59325809, 0x812e59c0, 0x04000004, 0x592c0209, - 0x84000550, 0x48025a09, 0x0401f879, 0x4d380000, - 0x42027000, 0x00000014, 0x0201f800, 0x00020bc1, - 0x5c027000, 0x5c025800, 0x5c026000, 0x0201f000, - 0x00106c29, 0x59c40804, 0x83180400, 0x00107291, - 0x50000000, 0x80040500, 0x1c01f000, 0x59c40804, - 0x83180400, 0x00107296, 0x50000000, 0x80040500, - 0x1c01f000, 0x59c80840, 0x82040d00, 0x000e0000, - 0x83180400, 0x001072a0, 0x50000000, 0x80040580, - 0x1c01f000, 0x00000210, 0x00000420, 0x00000840, - 0x00001080, 0x00002100, 0x00004000, 0x00008000, - 0x00010000, 0x00020000, 0x00040000, 0x00080000, - 0x00100000, 0x00200000, 0x00400000, 0x00800000, - 0x00000000, 0x00020000, 0x00040000, 0x00060000, - 0x00080000, 0x59900806, 0x80040120, 0x800c0480, - 0x04021004, 0x82000540, 0x00000001, 0x0401f005, - 0x82040c00, 0x00010000, 0x48072006, 0x80000580, - 0x1c01f000, 0x417a3000, 0x0401ffd7, 0x04000006, - 0x811a3000, 0x83180580, 0x00000005, 0x040207fb, - 0x1c01f000, 0x81780080, 0x1c01f000, 0x40681000, - 0x480bc857, 0x0201f800, 0x00106c3c, 0x4df00000, - 0x598c0800, 0x82040d80, 0x00000007, 0x04000002, - 0x480b1800, 0x5c03e000, 0x02000800, 0x00106c29, - 0x1c01f000, 0x4803c856, 0x0201f800, 0x00106c3c, - 0x4df00000, 0x497b180f, 0x497b1803, 0x497b1810, - 0x497b1811, 0x497b1812, 0x598c0000, 0x82000580, - 0x00000003, 0x04000012, 0x59a80078, 0x8c00053e, - 0x04000007, 0x59bc00e4, 0x8c000534, 0x04000004, - 0x4a031800, 0x00000008, 0x0401f009, 0x836c0580, - 0x00000002, 0x04020004, 0x4a031800, 0x00000005, - 0x0401f003, 0x4a031800, 0x00000000, 0x5c03e000, - 0x02000800, 0x00106c29, 0x1c01f000, 0x59300004, - 0x8c00050c, 0x04020003, 0x4a026203, 0x00000001, - 0x1c01f000, 0x83180480, 0x00000005, 0x02021800, - 0x0010032e, 0x491bc857, 0x811b20c8, 0x83932400, - 0x0000bf32, 0x811ba0ca, 0x83d3a400, 0x00007600, - 0x83180400, 0x00107303, 0x50034800, 0x811a28c2, - 0x83162c00, 0x00006100, 0x1c01f000, 0x0010cab5, - 0x0010cacc, 0x0010cae3, 0x0010cafa, 0x0010cb11, - 0x4933c857, 0x59300407, 0x82000c80, 0x00000014, - 0x04021017, 0x04011000, 0x0c01f001, 0x00107323, - 0x001073ca, 0x00107761, 0x001077bb, 0x001073ca, - 0x00107761, 0x001077bb, 0x00107323, 0x001073ca, - 0x00107323, 0x00107323, 0x00107323, 0x00107323, - 0x00107323, 0x00107323, 0x00107323, 0x0010732a, - 0x0010732a, 0x0010b78c, 0x0010b85b, 0x4803c857, - 0x0201f800, 0x00106c3c, 0x0201f800, 0x00106b8c, - 0x0201f000, 0x00106c29, 0x42001000, 0x0010cb5b, - 0x50081000, 0x4930100b, 0x58080002, 0x82000580, - 0x00000100, 0x0402003e, 0x59325809, 0x812e59c0, - 0x02000800, 0x0010032e, 0x492fc856, 0x5932680a, - 0x813669c0, 0x04000024, 0x592c040c, 0x82000500, - 0x0000e000, 0x04000004, 0x0201f800, 0x0010775a, - 0x0401f003, 0x0201f800, 0x0010774c, 0x592c000e, - 0x82000500, 0x00000003, 0x04000007, 0x82000580, - 0x00000003, 0x80000000, 0x58d00802, 0x80040540, - 0x4801a002, 0x42001000, 0x0010cb5b, 0x50081000, - 0x4930100a, 0x492c1009, 0x82d00400, 0x00000006, - 0x48001003, 0x592c000e, 0x48001005, 0x592c000f, - 0x48001006, 0x592c0010, 0x48001007, 0x0201f000, - 0x00020016, 0x42026800, 0x0010df3c, 0x592c080b, - 0x48066802, 0x82040500, 0x00ffff00, 0x04000007, - 0x497a6a12, 0x59a8100f, 0x82081500, 0x00ffff00, - 0x80080580, 0x040207d1, 0x82040d00, 0x000000ff, - 0x800408d0, 0x48066a12, 0x0401f7cc, 0x1c01f000, - 0x4d2c0000, 0x4d300000, 0x4c580000, 0x4c540000, - 0x4c500000, 0x58325809, 0x812e59c0, 0x02000800, - 0x0010032e, 0x58300002, 0x82000580, 0x00000100, - 0x04020022, 0x5830000a, 0x5832600b, 0x81300d80, - 0x04020012, 0x0401f834, 0x04020016, 0x592c080e, - 0x82040c00, 0x00000003, 0x80040904, 0x4004b000, - 0x4200a000, 0x0010c8a5, 0x4050a800, 0x0201f800, - 0x0010bd85, 0x42001000, 0x0000dc00, 0x0201f800, - 0x00107b6e, 0x0401f007, 0x4803c857, 0x4933c857, - 0x813261c0, 0x04000003, 0x0401f81f, 0x04000f93, - 0x5c00a000, 0x5c00a800, 0x5c00b000, 0x5c026000, - 0x5c025800, 0x1c01f000, 0x5830000a, 0x5832600b, - 0x4a006002, 0x00000100, 0x4803c857, 0x4933c857, - 0x81300d80, 0x040207ed, 0x0401f80f, 0x040207f1, - 0x4803c857, 0x0201f800, 0x0010fece, 0x80c40040, - 0x02020800, 0x0010032e, 0x4a025a07, 0x00000002, - 0x0201f800, 0x000203ef, 0x0201f800, 0x00107cbe, - 0x0401f7e4, 0x0201f800, 0x00106c3c, 0x4df00000, - 0x598c000f, 0x81300580, 0x04020009, 0x598c0005, - 0x81300580, 0x04020006, 0x5c03e000, 0x02000800, - 0x00106c29, 0x80000580, 0x1c01f000, 0x4803c857, - 0x5c03e000, 0x02000800, 0x00106c29, 0x82000540, - 0x00000001, 0x1c01f000, 0x59300403, 0x82000c80, - 0x00000058, 0x02021800, 0x0010032e, 0x4803c857, - 0x0c01f001, 0x00107552, 0x00107570, 0x00107596, - 0x001076bd, 0x0010766c, 0x00107670, 0x0010767f, - 0x00107693, 0x00107688, 0x00107693, 0x001076e3, - 0x00107693, 0x00107727, 0x00107693, 0x00107735, - 0x00107693, 0x00107688, 0x00107693, 0x00107739, - 0x00107431, 0x00107431, 0x00107431, 0x00107431, - 0x00107431, 0x00107431, 0x00107431, 0x00107431, - 0x00107431, 0x00107431, 0x00107431, 0x001077d9, - 0x001077f1, 0x001077fb, 0x00107431, 0x00107814, - 0x0010767f, 0x00107431, 0x0010767f, 0x00107693, - 0x00107431, 0x00107596, 0x001076bd, 0x00107431, - 0x00107864, 0x00107693, 0x00107431, 0x00107874, - 0x00107693, 0x00107431, 0x00107688, 0x00107543, - 0x00107433, 0x00107431, 0x0010788b, 0x001078cb, - 0x00107951, 0x00107431, 0x00107961, 0x0010767d, - 0x00107954, 0x00107431, 0x00107820, 0x001079b0, - 0x00107431, 0x001079e5, 0x00107a39, 0x00107431, - 0x00107448, 0x001074bc, 0x001074c9, 0x00107431, - 0x0010767f, 0x00107431, 0x00107509, 0x00107514, - 0x00107431, 0x00107431, 0x0010745c, 0x0010748f, - 0x00107a79, 0x00107aba, 0x00107ae1, 0x00107431, - 0x00107431, 0x00107431, 0x00107aae, 0x0010797a, - 0x0010788b, 0x00107431, 0x00107431, 0x00107431, - 0x00107431, 0x00107431, 0x00107431, 0x00107431, - 0x00107431, 0x0201f800, 0x0010032e, 0x0401fb19, - 0x59325809, 0x592c000a, 0x4801a006, 0x592c000b, - 0x4801a007, 0x592c000c, 0x4801a008, 0x592c000d, - 0x4801a009, 0x592c000e, 0x4801a00a, 0x4979a00b, - 0x592c080a, 0x82040d00, 0x00000fff, 0x80040904, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00107b6e, - 0x4a026202, 0x0000ffff, 0x0401fb02, 0x4d2c0000, - 0x4a01a006, 0x05000000, 0x59325809, 0x592c000a, - 0x4801a007, 0x592c000b, 0x4801a008, 0x592c000c, - 0x4801a009, 0x5c025800, 0x42000800, 0x00000004, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00107b6e, - 0x4c580000, 0x4c500000, 0x4c540000, 0x4d2c0000, - 0x0401faec, 0x5930040b, 0x82000500, 0x00000003, - 0x04000007, 0x82000580, 0x00000003, 0x80000000, - 0x58d00802, 0x80040540, 0x4801a002, 0x59325809, - 0x4200a800, 0x0010c8a5, 0x592cb206, 0x8258b400, - 0x00000003, 0x8058b104, 0x832ca400, 0x00000007, - 0x0201f800, 0x0010bd5b, 0x40580000, 0x8054ac00, - 0x592c0001, 0x80000540, 0x04000003, 0x40025800, - 0x0401f7f2, 0x4200a000, 0x0010c8a5, 0x4050a800, - 0x5930b40b, 0x8258b400, 0x00000003, 0x8058b104, - 0x40580800, 0x0201f800, 0x0010bd85, 0x42001000, + 0x00000003, 0x42027000, 0x0000004a, 0x0201f800, + 0x00020bc1, 0x59c40004, 0x82000500, 0x00f80000, + 0x04000005, 0x811a3000, 0x83180480, 0x00000005, + 0x040017dc, 0x4a0378e4, 0x00000008, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c027000, + 0x5c026000, 0x5c023000, 0x0401f668, 0x59300004, + 0x8c000538, 0x04020066, 0x59300222, 0x82000500, + 0x00000003, 0x82000580, 0x00000001, 0x04020060, + 0x42000000, 0x0010cfb7, 0x0201f800, 0x0010bfb3, + 0x0401fe6d, 0x4df00000, 0x4c640000, 0x0401f8a3, + 0x0401fd99, 0x5930c804, 0x8464cd78, 0x59d00011, + 0x59d02012, 0x4803c857, 0x4813c857, 0x0401fbea, + 0x04020041, 0x48166012, 0x4c100000, 0x4c5c0000, + 0x4c600000, 0x4a026203, 0x00000002, 0x592c0a05, + 0x82040d00, 0x000000ff, 0x82040580, 0x00000072, + 0x04020005, 0x4a026203, 0x00000003, 0x592c000e, + 0x80102480, 0x4010b800, 0x4014c000, 0x42000000, + 0x00000001, 0x1201f800, 0x00108e7f, 0x40602800, + 0x5c00c000, 0x5c00b800, 0x5c002000, 0x04000026, + 0x42000000, 0xd0000000, 0x41300800, 0x0201f800, + 0x001008c7, 0x59300008, 0x4c000000, 0x4a026008, + 0x00200000, 0x0201f800, 0x00100f2b, 0x5c000000, + 0x48026008, 0x04020018, 0x8464cd26, 0x592c0209, + 0x8c00051e, 0x0402000c, 0x8464cd4a, 0x50201800, + 0x480e600b, 0x8464cd7e, 0x48666004, 0x0401fbeb, + 0x5c00c800, 0x5c03e000, 0x04000e18, 0x80000580, + 0x1c01f000, 0x8400051e, 0x48025a09, 0x0201f800, + 0x00100ee9, 0x4832600c, 0x4822600d, 0x482a600e, + 0x0401f7ef, 0x42000000, 0x0010cfb8, 0x0201f800, + 0x0010bfb3, 0x4a026203, 0x00000003, 0x49332004, + 0x8464cd7e, 0x48666004, 0x4a032001, 0x00000001, + 0x5c00c800, 0x5c03e000, 0x04000e00, 0x82000540, + 0x00000001, 0x0401f7e7, 0x4d2c0000, 0x4d340000, + 0x5932680a, 0x598c0800, 0x82040580, 0x00000004, + 0x04020006, 0x838c1400, 0x00000005, 0x838c1c00, + 0x00000004, 0x0401f010, 0x82040580, 0x00000001, + 0x04020006, 0x838c1400, 0x00000009, 0x838c1c00, + 0x00000008, 0x0401f008, 0x82040580, 0x00000002, + 0x04020028, 0x838c1400, 0x0000000b, 0x838c1c00, + 0x0000000a, 0x41306800, 0x58340000, 0x80007d40, + 0x04000020, 0x583c000a, 0x81340580, 0x04020006, + 0x403c6800, 0x583c0000, 0x80007d40, 0x040207fa, + 0x0401f018, 0x4933c857, 0x483fc857, 0x583c0000, + 0x48006800, 0x49307800, 0x443c1000, 0x500c0000, + 0x803c0580, 0x04020002, 0x44341800, 0x80000580, + 0x4803180f, 0x48031811, 0x598c0000, 0x82000580, + 0x00000003, 0x04000003, 0x4a031800, 0x00000000, + 0x80000580, 0x5c026800, 0x5c025800, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fb, 0x0401f807, + 0x42018800, 0x00000000, 0x04000003, 0x42018800, + 0x00000001, 0x1c01f000, 0x491bc857, 0x59b400f6, + 0x82000500, 0x00000038, 0x040207fd, 0x59c80840, + 0x82040540, 0x00000010, 0x48039040, 0x59c41008, + 0x4c040000, 0x4c080000, 0x82081500, 0xffffff7f, + 0x480b8808, 0x0401fbf9, 0x04020007, 0x0401fbfd, + 0x04000024, 0x48038804, 0x0201f800, 0x00100eb5, + 0x0401f044, 0x4a038803, 0x00000008, 0x59c40003, + 0x82000500, 0x00000003, 0x040007fd, 0x8c000502, + 0x04020007, 0x0401fbef, 0x04000016, 0x48038804, + 0x0201f800, 0x00100eb5, 0x0401f036, 0x0401fbef, + 0x04020007, 0x59c80040, 0x8400056a, 0x48039040, + 0x59c80040, 0x8c00052a, 0x040207fe, 0x59c40005, + 0x82000500, 0xc0000000, 0x04000006, 0x59c400a3, + 0x84000540, 0x480388a3, 0x4a038805, 0xc0000000, + 0x0201f800, 0x00100e46, 0x4a03a005, 0x30000000, + 0x59d00006, 0x4a03a005, 0x30000000, 0x59900006, + 0x82000500, 0xffff0000, 0x48032006, 0x59d00005, + 0x8c000504, 0x040207fe, 0x42000800, 0x00007600, + 0x83180540, 0x60000000, 0x480008a1, 0x811800dc, + 0x59c80840, 0x80040540, 0x48039040, 0x82000540, + 0x00003000, 0x48039040, 0x59c80040, 0x82000500, + 0x00003000, 0x040207fd, 0x0201f800, 0x00100ea4, + 0x83180400, 0x001074a0, 0x50000000, 0x48038804, + 0x80000580, 0x4df00000, 0x0201f800, 0x00106628, + 0x5c03e000, 0x5c001000, 0x5c000800, 0x480b8808, + 0x48079040, 0x1c01f000, 0x4803c856, 0x59b400f6, + 0x82000500, 0x00000038, 0x040207fd, 0x59c80840, + 0x82040540, 0x00000010, 0x48039040, 0x59c41008, + 0x4c040000, 0x4c080000, 0x82081500, 0xffffff7f, + 0x480b8808, 0x59c40004, 0x82000500, 0x00000003, + 0x04020010, 0x59c40004, 0x82000500, 0x0000000c, + 0x04000005, 0x4a038804, 0x0000000c, 0x8c000504, + 0x0401f025, 0x59c80040, 0x8400056e, 0x48039040, + 0x59c80040, 0x8c00052e, 0x040207fe, 0x0401f01e, + 0x4a038803, 0x00000008, 0x59c40003, 0x82000500, + 0x00000003, 0x040007fd, 0x8c000502, 0x04020006, + 0x59c40004, 0x4a038804, 0x0000000c, 0x8c000504, + 0x0401f011, 0x59c80040, 0x8400056a, 0x48039040, + 0x59c80040, 0x8c00052a, 0x040207fe, 0x59c40005, + 0x82000500, 0xc0000000, 0x04000007, 0x59c400a3, + 0x84000540, 0x480388a3, 0x4a038805, 0xc0000000, + 0x80000580, 0x497b2807, 0x5c001000, 0x5c000800, + 0x480b8808, 0x48079040, 0x1c01f000, 0x0401f807, + 0x42018800, 0x00000001, 0x04000003, 0x42018800, + 0x00000000, 0x1c01f000, 0x5c000000, 0x4c000000, + 0x4803c857, 0x491bc857, 0x4933c857, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x0401fd0e, + 0x4df00000, 0x0401fbc1, 0x59900004, 0x800001c0, + 0x04000011, 0x81300580, 0x0402000f, 0x59300004, + 0x84000520, 0x48026004, 0x0401ff3c, 0x04020009, + 0x5c03e000, 0x04000ced, 0x80000580, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, + 0x0401fc29, 0x42027000, 0x00000049, 0x59300004, + 0x84000520, 0x48026004, 0x8c00050c, 0x02020800, + 0x00020bc1, 0x5c03e000, 0x04000cdc, 0x82000540, + 0x00000001, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, + 0x1c01f000, 0x4933c857, 0x0401fcdf, 0x4df00000, + 0x598c000f, 0x80026540, 0x04000012, 0x59300004, + 0x84000520, 0x48026004, 0x0401ff74, 0x04000017, + 0x0401fc25, 0x42027000, 0x00000013, 0x59300004, + 0x8c00050c, 0x02020800, 0x00020bc1, 0x5c03e000, + 0x04000cba, 0x82000540, 0x00000001, 0x1c01f000, + 0x836c1580, 0x00000001, 0x040007f9, 0x836c1580, + 0x00000004, 0x040007f6, 0x42001000, 0x00104131, + 0x0201f800, 0x001064fe, 0x5c03e000, 0x04000cab, + 0x80000580, 0x1c01f000, 0x4d300000, 0x4d180000, + 0x4d3c0000, 0x0401fcb8, 0x4df00000, 0x4a0378e4, + 0x0000000f, 0x0401fb41, 0x417a3000, 0x811808c8, + 0x82040c00, 0x0000bf32, 0x58066004, 0x813261c0, + 0x04000010, 0x417a7800, 0x0201f800, 0x0010493c, + 0x0400000a, 0x59300c07, 0x82040580, 0x00000003, + 0x04000004, 0x82040580, 0x00000006, 0x04020003, + 0x42027800, 0x00000002, 0x0201f800, 0x00109425, + 0x811a3000, 0x83180480, 0x00000005, 0x040017e8, + 0x42000800, 0x00000040, 0x0201f800, 0x001012d2, + 0x4a0378e4, 0x0000000a, 0x5c03e000, 0x04000c7f, + 0x5c027800, 0x5c023000, 0x5c026000, 0x1c01f000, + 0x4803c856, 0x4d300000, 0x0401fc8b, 0x4df00000, + 0x59c80840, 0x84040d74, 0x82040540, 0x00000010, + 0x48039040, 0x59c41008, 0x4c040000, 0x4c080000, + 0x82081500, 0xffffff7f, 0x480b8808, 0x42001000, + 0x00000003, 0x0401fafc, 0x598e600f, 0x813261c0, + 0x04020f99, 0x04000b05, 0x497b2807, 0x0401f809, + 0x5c001000, 0x5c000800, 0x480b8808, 0x48079040, + 0x5c03e000, 0x04000c5d, 0x5c026000, 0x1c01f000, + 0x4d380000, 0x4d180000, 0x4d300000, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x417a3000, + 0x0201f800, 0x00106628, 0x811a3000, 0x83180580, + 0x00000005, 0x040207fb, 0x0401fad4, 0x04020009, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x5c026000, 0x5c023000, 0x5c027000, 0x1c01f000, + 0x0401fb0a, 0x59926004, 0x4933c857, 0x0401fe8b, + 0x813261c0, 0x040007f3, 0x42027000, 0x0000004a, + 0x4a026203, 0x00000003, 0x0201f800, 0x00020bc1, + 0x0401f7ec, 0x4d300000, 0x4d180000, 0x4d900000, + 0x0401fc45, 0x42001000, 0x00000000, 0x598c0800, + 0x82040580, 0x00000005, 0x04000003, 0x82040580, + 0x00000008, 0x04000abc, 0x417a3000, 0x811b20c8, + 0x83932400, 0x0000bf32, 0x59900001, 0x82000580, + 0x00000001, 0x0402000d, 0x42000800, 0x00000004, + 0x59926004, 0x59300012, 0x82000500, 0xfff00000, + 0x80000540, 0x04000003, 0x42000800, 0x0000000e, + 0x0201f800, 0x00106604, 0x811a3000, 0x83180480, + 0x00000005, 0x040017ea, 0x59c81040, 0x84081534, + 0x480b9040, 0x0401fc0d, 0x5c032000, 0x5c023000, + 0x5c026000, 0x1c01f000, 0x4933c857, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x4d380000, + 0x0401fc15, 0x4df00000, 0x59300004, 0x8c00053e, + 0x04020007, 0x8c000520, 0x04000027, 0x0201f800, + 0x00106d4c, 0x04000024, 0x0401f02d, 0x598c000f, + 0x81300580, 0x04000012, 0x0201f800, 0x00109552, + 0x04020027, 0x0401fa4b, 0x04000025, 0x48038804, + 0x0401fab6, 0x0201f800, 0x00100eb5, 0x0201f800, + 0x00106d71, 0x42027000, 0x00000049, 0x59300004, + 0x8c00050c, 0x0402000e, 0x0401f00f, 0x59c40004, + 0x8c000504, 0x04000016, 0x4a038804, 0x00000004, + 0x0201f800, 0x00106d91, 0x42027000, 0x00000013, + 0x59300004, 0x8c00050c, 0x04000003, 0x0201f800, + 0x00020bc1, 0x5c03e000, 0x02000800, 0x00106e2e, + 0x5c027000, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x80000580, 0x1c01f000, 0x5c03e000, + 0x02000800, 0x00106e2e, 0x5c027000, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x82000540, + 0x00000001, 0x1c01f000, 0x59300407, 0x82000580, + 0x00000003, 0x04020008, 0x0201f800, 0x0010989f, + 0x04000005, 0x59301009, 0x58080409, 0x84000550, + 0x48001409, 0x1c01f000, 0x497b2807, 0x0201f800, + 0x00106e41, 0x59c400af, 0x800001c0, 0x04020005, + 0x0201f800, 0x00106e2e, 0x0201f000, 0x001014c7, + 0x598c0011, 0x82001480, 0x00000002, 0x04021007, + 0x80000000, 0x48031811, 0x80000580, 0x0201f800, + 0x001065fd, 0x04000011, 0x0401fed3, 0x0402000f, + 0x0401ffde, 0x42000000, 0x0010cf3c, 0x0201f800, + 0x0010bfb3, 0x0401fd9d, 0x04000008, 0x0401fa59, + 0x4d380000, 0x42027000, 0x00000014, 0x0201f800, + 0x00020bc1, 0x5c027000, 0x0201f800, 0x00106e2e, + 0x0201f000, 0x001014c7, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x4d300000, 0x0201f800, + 0x00106628, 0x0201f800, 0x00106e41, 0x59c400af, + 0x800001c0, 0x0400002b, 0x0401fa48, 0x59926004, + 0x4933c857, 0x59300004, 0x8c000516, 0x0400000c, + 0x0401fe76, 0x04020023, 0x0201f800, 0x00106d71, + 0x0201f800, 0x00106e2e, 0x42000800, 0x80000804, + 0x0201f800, 0x00020b30, 0x0401f01a, 0x42001800, + 0x00007530, 0x0401f9e9, 0x04020004, 0x0201f800, + 0x00106602, 0x0401f013, 0x0401fe64, 0x04020011, + 0x0401ffa6, 0x42000000, 0x0010cf3d, 0x0201f800, + 0x0010bfb3, 0x59300004, 0x8c00050c, 0x04020003, + 0x4a026203, 0x00000003, 0x4d380000, 0x42027000, + 0x0000004a, 0x0201f800, 0x00020bc1, 0x5c027000, + 0x0201f800, 0x00106e2e, 0x5c026000, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x0201f000, + 0x001014c7, 0x4c600000, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x4d300000, 0x4d2c0000, + 0x0201f800, 0x00106e41, 0x0401fa0c, 0x59926004, + 0x813261c0, 0x04000091, 0x0201f800, 0x001050f7, + 0x04020007, 0x4178c000, 0x0201f800, 0x00107e4d, + 0x04000003, 0x4200c000, 0x00000001, 0x42000000, + 0x00001000, 0x50000000, 0x82000480, 0x24320001, + 0x04001038, 0x0201f800, 0x00100e46, 0x59303004, + 0x8c183536, 0x0400002f, 0x42003000, 0x00001000, + 0x80183040, 0x04000014, 0x0201f800, 0x0010c0d6, + 0x040007fc, 0x0201f800, 0x0010064a, 0x42003000, + 0x00007a15, 0x50183800, 0x821c0500, 0x00007000, + 0x04000009, 0x4803507a, 0x821c0500, 0xffff8fff, + 0x44003000, 0x4a032832, 0x000004b0, 0x4a0378e4, + 0x02c00000, 0x4a030000, 0x00000000, 0x0201f800, + 0x00100ea4, 0x850e1d2e, 0x42000000, 0x0010cfb5, + 0x0201f800, 0x0010bfb3, 0x59325809, 0x812e59c0, + 0x02000800, 0x0010032e, 0x0401f861, 0x04000057, + 0x59303004, 0x84183536, 0x481a6004, 0x0401f032, + 0x0201f800, 0x00106615, 0x0400002c, 0x0401f04f, + 0x0201f800, 0x00100ea4, 0x8d0e1d2e, 0x040207f9, + 0x0201f800, 0x001050f7, 0x04020006, 0x8060c1c0, + 0x04000004, 0x0201f800, 0x00107e77, 0x0401f043, + 0x0201f800, 0x00106615, 0x04020040, 0x4933c857, + 0x0401f94e, 0x04020019, 0x0201f800, 0x00106628, + 0x813261c0, 0x04000039, 0x59325809, 0x812e59c0, + 0x02000800, 0x0010032e, 0x0201f800, 0x001050f7, + 0x04020022, 0x59c40093, 0x4803c857, 0x800001c0, + 0x0402000a, 0x592c0209, 0x84000550, 0x48025a09, + 0x0201f800, 0x00105223, 0x04020028, 0x592c0209, + 0x84000510, 0x48025a09, 0x0201f800, 0x00106602, + 0x0401f022, 0x42000000, 0x0010cf3d, 0x0201f800, + 0x0010bfb3, 0x0401fd19, 0x592c0209, 0x84000550, + 0x48025a09, 0x4d380000, 0x42027000, 0x0000004a, + 0x4a026203, 0x00000003, 0x0201f800, 0x00020bc1, + 0x5c027000, 0x0401f011, 0x59900006, 0x82000500, + 0xffff0000, 0x040207ec, 0x59c408af, 0x82040480, + 0x000003e8, 0x040217e8, 0x59900006, 0x82000400, + 0x00010000, 0x48032006, 0x0201f800, 0x00106602, + 0x0201f800, 0x0010410a, 0x5c025800, 0x5c026000, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x5c00c000, 0x0201f000, 0x00106e2e, 0x4c5c0000, + 0x4c640000, 0x5930bc07, 0x5930c804, 0x825c0580, + 0x00000003, 0x04000004, 0x825c0580, 0x00000006, + 0x04020031, 0x0201f800, 0x0010493c, 0x0402002e, + 0x8c64cd0e, 0x0402002c, 0x0401fce4, 0x0201f800, + 0x00106d71, 0x825c0580, 0x00000003, 0x04020005, + 0x8c64cd16, 0x0400000c, 0x8464cd36, 0x0401f01b, + 0x82640500, 0x0000001f, 0x82000580, 0x00000005, + 0x04000005, 0x0201f800, 0x00020172, 0x8464cd4a, + 0x0401f7f6, 0x0401f820, 0x04020017, 0x48166012, + 0x0201f800, 0x00100f2b, 0x04020013, 0x8264cd00, + 0xfff7ffdf, 0x592c0209, 0x8c00051e, 0x04020011, + 0x8464cd4a, 0x50201800, 0x480e600b, 0x4832600c, + 0x4822600d, 0x482a600e, 0x8464cd7e, 0x48666004, + 0x0401f842, 0x80000580, 0x5c00c800, 0x5c00b800, + 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fb, + 0x8400051e, 0x48025a09, 0x0201f800, 0x00100ee9, + 0x0401f7ed, 0x59302013, 0x811808c2, 0x82040c00, + 0x00006000, 0x58040101, 0x82000500, 0xffff0000, + 0x800001c0, 0x0400000b, 0x811808ca, 0x82040c00, + 0x00006000, 0x58040138, 0x58042139, 0x81a41000, + 0x58081403, 0x800810e0, 0x80081540, 0x480a601b, + 0x59300013, 0x80100480, 0x0400101d, 0x8c64cd0e, + 0x0400000c, 0x40101000, 0x41780800, 0x4c000000, + 0x59300223, 0x4c100000, 0x0201f800, 0x00106c9d, + 0x5c002000, 0x5c000000, 0x800409c0, 0x04020010, + 0x59902808, 0x59303016, 0x80140480, 0x0400100c, + 0x40002800, 0x80180480, 0x04001009, 0x48026016, + 0x8464cd36, 0x59300014, 0x80100580, 0x04000003, + 0x8464cd76, 0x80000580, 0x1c01f000, 0x82000540, + 0x00000001, 0x1c01f000, 0x59bc00ea, 0x82000500, + 0x00000007, 0x82000580, 0x00000001, 0x02000800, + 0x0010032e, 0x5930080a, 0x5804100c, 0x480bc857, + 0x800811c0, 0x04020003, 0x4930080c, 0x0401f01b, + 0x59bc1031, 0x40081800, 0x800811c0, 0x02000800, + 0x0010032e, 0x5808000a, 0x80040580, 0x04000004, + 0x40081800, 0x58081000, 0x0401f7f8, 0x58082000, + 0x49781000, 0x480a6001, 0x400c0000, 0x80080580, + 0x04020006, 0x49337831, 0x48126000, 0x801021c0, + 0x0402000d, 0x0401f00b, 0x48101800, 0x801021c0, + 0x04020002, 0x480f7830, 0x59bc0831, 0x4807c857, + 0x48066000, 0x49337831, 0x800409c0, 0x04020002, + 0x49337830, 0x1c01f000, 0x4d300000, 0x4d2c0000, + 0x0201f800, 0x00106e41, 0x598e600f, 0x4933c857, + 0x813261c0, 0x04000049, 0x59c41004, 0x480bc857, + 0x8c081500, 0x0400000a, 0x0201f800, 0x001050f7, + 0x04020015, 0x0201f800, 0x00105223, 0x0402003f, + 0x0201f800, 0x001065fd, 0x0401f03c, 0x82080500, + 0x000001fe, 0x040207fb, 0x59c8010b, 0x4803c857, + 0x8c000500, 0x040007f7, 0x42000000, 0x0010cf86, + 0x0201f800, 0x0010bfb3, 0x0401fd13, 0x0400087f, + 0x0401f02e, 0x598c0011, 0x80000540, 0x04020011, + 0x59c408af, 0x82040480, 0x000003e8, 0x0402100d, + 0x598c0811, 0x80040800, 0x48071811, 0x0201f800, + 0x001065fd, 0x42000000, 0x0010ce7b, 0x0201f800, + 0x0010bfb3, 0x0201f800, 0x0010410a, 0x0401f01b, + 0x42000000, 0x0010cf3c, 0x0201f800, 0x0010bfb3, + 0x0401fc76, 0x813261c0, 0x04020003, 0x0401f863, + 0x0401f012, 0x59300407, 0x82000580, 0x00000003, + 0x04020007, 0x59325809, 0x812e59c0, 0x04000004, + 0x592c0209, 0x84000550, 0x48025a09, 0x0401f879, + 0x4d380000, 0x42027000, 0x00000014, 0x0201f800, + 0x00020bc1, 0x5c027000, 0x5c025800, 0x5c026000, + 0x0201f000, 0x00106e2e, 0x59c40804, 0x83180400, + 0x00107496, 0x50000000, 0x80040500, 0x1c01f000, + 0x59c40804, 0x83180400, 0x0010749b, 0x50000000, + 0x80040500, 0x1c01f000, 0x59c80840, 0x82040d00, + 0x000e0000, 0x83180400, 0x001074a5, 0x50000000, + 0x80040580, 0x1c01f000, 0x00000210, 0x00000420, + 0x00000840, 0x00001080, 0x00002100, 0x00004000, + 0x00008000, 0x00010000, 0x00020000, 0x00040000, + 0x00080000, 0x00100000, 0x00200000, 0x00400000, + 0x00800000, 0x00000000, 0x00020000, 0x00040000, + 0x00060000, 0x00080000, 0x59900806, 0x80040120, + 0x800c0480, 0x04021004, 0x82000540, 0x00000001, + 0x0401f005, 0x82040c00, 0x00010000, 0x48072006, + 0x80000580, 0x1c01f000, 0x417a3000, 0x0401ffd7, + 0x04000006, 0x811a3000, 0x83180580, 0x00000005, + 0x040207fb, 0x1c01f000, 0x81780080, 0x1c01f000, + 0x40681000, 0x480bc857, 0x0201f800, 0x00106e41, + 0x4df00000, 0x598c0800, 0x82040d80, 0x00000007, + 0x04000002, 0x480b1800, 0x5c03e000, 0x02000800, + 0x00106e2e, 0x1c01f000, 0x4803c856, 0x0201f800, + 0x00106e41, 0x4df00000, 0x497b180f, 0x497b1803, + 0x497b1810, 0x497b1811, 0x497b1812, 0x598c0000, + 0x82000580, 0x00000003, 0x04000012, 0x59a80078, + 0x8c00053e, 0x04000007, 0x59bc00e4, 0x8c000534, + 0x04000004, 0x4a031800, 0x00000008, 0x0401f009, + 0x836c0580, 0x00000002, 0x04020004, 0x4a031800, + 0x00000005, 0x0401f003, 0x4a031800, 0x00000000, + 0x5c03e000, 0x02000800, 0x00106e2e, 0x1c01f000, + 0x59300004, 0x8c00050c, 0x04020003, 0x4a026203, + 0x00000001, 0x1c01f000, 0x83180480, 0x00000005, + 0x02021800, 0x0010032e, 0x491bc857, 0x811b20c8, + 0x83932400, 0x0000bf32, 0x811ba0ca, 0x83d3a400, + 0x00007600, 0x83180400, 0x00107508, 0x50034800, + 0x811a28c2, 0x83162c00, 0x00006100, 0x1c01f000, + 0x0010cdb5, 0x0010cdcc, 0x0010cde3, 0x0010cdfa, + 0x0010ce11, 0x4933c857, 0x59300407, 0x82000c80, + 0x00000014, 0x04021017, 0x04011000, 0x0c01f001, + 0x00107528, 0x001075cd, 0x00107957, 0x001079b1, + 0x001075cd, 0x00107957, 0x001079b1, 0x00107528, + 0x001075cd, 0x00107528, 0x00107528, 0x00107528, + 0x00107528, 0x00107528, 0x00107528, 0x00107528, + 0x0010752f, 0x0010752f, 0x0010bab7, 0x0010bb86, + 0x4803c857, 0x0201f800, 0x00106e41, 0x0201f800, + 0x00106d91, 0x0201f000, 0x00106e2e, 0x42001000, + 0x0010ce5b, 0x50081000, 0x4930100b, 0x58080002, + 0x82000580, 0x00000100, 0x0402003c, 0x59325809, + 0x812e59c0, 0x02000800, 0x0010032e, 0x492fc856, + 0x5932680a, 0x83340580, 0x0010e23c, 0x04000023, + 0x592c040c, 0x82000500, 0x0000e000, 0x04000004, + 0x0201f800, 0x00107950, 0x0401f002, 0x0401fbfb, + 0x592c000e, 0x82000500, 0x00000003, 0x04000007, + 0x82000580, 0x00000003, 0x80000000, 0x58d00802, + 0x80040540, 0x4801a002, 0x42001000, 0x0010ce5b, + 0x50081000, 0x4930100a, 0x492c1009, 0x82d00400, + 0x00000006, 0x48001003, 0x592c000e, 0x48001005, + 0x592c000f, 0x48001006, 0x592c0010, 0x48001007, + 0x0201f000, 0x00020016, 0x592c080b, 0x48066802, + 0x82040500, 0x00ffff00, 0x04000007, 0x497a6a12, + 0x59a8100f, 0x82081500, 0x00ffff00, 0x80080580, + 0x040207d4, 0x82040d00, 0x000000ff, 0x800408d0, + 0x48066a12, 0x0401f7cf, 0x1c01f000, 0x4d2c0000, + 0x4d300000, 0x4c580000, 0x4c540000, 0x4c500000, + 0x58325809, 0x812e59c0, 0x02000800, 0x0010032e, + 0x58300002, 0x82000580, 0x00000100, 0x04020022, + 0x5830000a, 0x5832600b, 0x81300d80, 0x04020012, + 0x0401f834, 0x04020016, 0x592c080e, 0x82040c00, + 0x00000003, 0x80040904, 0x4004b000, 0x4200a000, + 0x0010cba5, 0x4050a800, 0x0201f800, 0x0010c0b0, + 0x42001000, 0x0000dc00, 0x0201f800, 0x00107d64, + 0x0401f007, 0x4803c857, 0x4933c857, 0x813261c0, + 0x04000003, 0x0401f81f, 0x04000f95, 0x5c00a000, + 0x5c00a800, 0x5c00b000, 0x5c026000, 0x5c025800, + 0x1c01f000, 0x5830000a, 0x5832600b, 0x4a006002, + 0x00000100, 0x4803c857, 0x4933c857, 0x81300d80, + 0x040207ed, 0x0401f80f, 0x040207f1, 0x4803c857, + 0x0201f800, 0x001101de, 0x80c40040, 0x02020800, + 0x0010032e, 0x4a025a07, 0x00000002, 0x0201f800, + 0x000203ef, 0x0201f800, 0x00107eb4, 0x0401f7e4, + 0x0201f800, 0x00106e41, 0x4df00000, 0x598c000f, + 0x81300580, 0x04020009, 0x598c0005, 0x81300580, + 0x04020006, 0x5c03e000, 0x02000800, 0x00106e2e, + 0x80000580, 0x1c01f000, 0x4803c857, 0x5c03e000, + 0x02000800, 0x00106e2e, 0x82000540, 0x00000001, + 0x1c01f000, 0x59300403, 0x82000c80, 0x00000058, + 0x02021800, 0x0010032e, 0x83340d80, 0x0010e23c, + 0x0402000a, 0x59300827, 0x48066802, 0x82041500, + 0x00ffff00, 0x04020004, 0x800408d0, 0x48066a12, + 0x0401f002, 0x497a6a12, 0x4803c857, 0x0c01f001, + 0x00107761, 0x0010777f, 0x00107791, 0x001078ab, + 0x0010786d, 0x00107871, 0x00107880, 0x00107894, + 0x00107889, 0x00107894, 0x001078d5, 0x00107894, + 0x0010791d, 0x00107894, 0x0010792b, 0x00107894, + 0x00107889, 0x00107894, 0x0010792f, 0x00107640, + 0x00107640, 0x00107640, 0x00107640, 0x00107640, + 0x00107640, 0x00107640, 0x00107640, 0x00107640, + 0x00107640, 0x00107640, 0x001079cf, 0x001079e7, + 0x001079f1, 0x00107640, 0x00107a0a, 0x00107880, + 0x00107640, 0x00107880, 0x00107894, 0x00107640, + 0x00107791, 0x001078ab, 0x00107640, 0x00107a5a, + 0x00107894, 0x00107640, 0x00107a6a, 0x00107894, + 0x00107640, 0x00107889, 0x00107752, 0x00107642, + 0x00107640, 0x00107a81, 0x00107ac1, 0x00107b47, + 0x00107640, 0x00107b57, 0x0010787e, 0x00107b4a, + 0x00107640, 0x00107a16, 0x00107ba6, 0x00107640, + 0x00107bdb, 0x00107c2f, 0x00107640, 0x00107657, + 0x001076cb, 0x001076d8, 0x00107640, 0x00107880, + 0x00107640, 0x00107718, 0x00107723, 0x00107640, + 0x00107640, 0x0010766b, 0x0010769e, 0x00107c6f, + 0x00107cb0, 0x00107cd7, 0x00107640, 0x00107640, + 0x00107640, 0x00107ca4, 0x00107b70, 0x00107a81, + 0x00107640, 0x00107640, 0x00107640, 0x00107640, + 0x00107640, 0x00107640, 0x00107640, 0x00107640, + 0x0201f800, 0x0010032e, 0x0401fb00, 0x59325809, + 0x592c000a, 0x4801a006, 0x592c000b, 0x4801a007, + 0x592c000c, 0x4801a008, 0x592c000d, 0x4801a009, + 0x592c000e, 0x4801a00a, 0x4979a00b, 0x592c080a, + 0x82040d00, 0x00000fff, 0x80040904, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x4a026202, + 0x0000ffff, 0x0401fae9, 0x4d2c0000, 0x4a01a006, + 0x05000000, 0x59325809, 0x592c000a, 0x4801a007, + 0x592c000b, 0x4801a008, 0x592c000c, 0x4801a009, + 0x5c025800, 0x42000800, 0x00000004, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x4c580000, + 0x4c500000, 0x4c540000, 0x4d2c0000, 0x0401fad3, + 0x5930040b, 0x82000500, 0x00000003, 0x04000007, + 0x82000580, 0x00000003, 0x80000000, 0x58d00802, + 0x80040540, 0x4801a002, 0x59325809, 0x4200a800, + 0x0010cba5, 0x592cb206, 0x8258b400, 0x00000003, + 0x8058b104, 0x832ca400, 0x00000007, 0x0201f800, + 0x0010c086, 0x40580000, 0x8054ac00, 0x592c0001, + 0x80000540, 0x04000003, 0x40025800, 0x0401f7f2, + 0x4200a000, 0x0010cba5, 0x4050a800, 0x5930b40b, + 0x8258b400, 0x00000003, 0x8058b104, 0x40580800, + 0x0201f800, 0x0010c0b0, 0x42001000, 0x0000dc00, + 0x5c025800, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x0201f000, 0x00107d64, 0x4c580000, 0x4c500000, + 0x4c540000, 0x4d2c0000, 0x42034800, 0x0010cb9e, + 0x0401faac, 0x59325809, 0x592c0802, 0x4807c857, + 0x40041000, 0x80040904, 0x82081500, 0x00000003, + 0x04000008, 0x80040800, 0x82081580, 0x00000003, + 0x80081000, 0x58d00002, 0x80080540, 0x4801a002, + 0x4a025806, 0x02000000, 0x82d0ac00, 0x00000006, + 0x592cb011, 0x832ca400, 0x00000006, 0x0201f800, + 0x0010c086, 0x40580000, 0x8054ac00, 0x592e5801, + 0x41780000, 0x812e5d40, 0x040207f6, 0x42001000, 0x0000dc00, 0x5c025800, 0x5c00a800, 0x5c00a000, - 0x5c00b000, 0x0201f000, 0x00107b6e, 0x4c580000, - 0x4c500000, 0x4c540000, 0x4d2c0000, 0x42034800, - 0x0010c89e, 0x0401fac5, 0x59325809, 0x592c0802, - 0x4807c857, 0x40041000, 0x80040904, 0x82081500, - 0x00000003, 0x04000008, 0x80040800, 0x82081580, - 0x00000003, 0x80081000, 0x58d00002, 0x80080540, - 0x4801a002, 0x4a025806, 0x02000000, 0x82d0ac00, - 0x00000006, 0x592cb011, 0x832ca400, 0x00000006, - 0x0201f800, 0x0010bd5b, 0x40580000, 0x8054ac00, - 0x592e5801, 0x41780000, 0x812e5d40, 0x040207f6, - 0x42001000, 0x0000dc00, 0x5c025800, 0x5c00a800, - 0x5c00a000, 0x5c00b000, 0x0201f000, 0x00107b6e, - 0x0401fa90, 0x4a01a006, 0x78000000, 0x5930001d, - 0x840001c0, 0x4801a407, 0x4979a207, 0x42000800, - 0x00000002, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00107b6e, 0x4c580000, 0x4c540000, 0x4c500000, - 0x0401fa8e, 0x4a01a006, 0x02000000, 0x5932481c, - 0x59240001, 0x4801a008, 0x59240002, 0x4801a009, - 0x59240003, 0x4801a00a, 0x59240004, 0x4801a00b, - 0x5930001d, 0x82000d80, 0x0000e000, 0x04000012, - 0x82000d80, 0x0000df00, 0x04000006, 0x4a01a407, - 0x00000010, 0x42000800, 0x00000006, 0x0401f01f, - 0x42001800, 0x0010c846, 0x0201f800, 0x00100533, - 0x42000000, 0x0000df00, 0x4200a000, 0x0010c846, - 0x0401f009, 0x42001800, 0x0010c853, 0x0201f800, - 0x00100533, 0x42000000, 0x0000e000, 0x4200a000, - 0x0010c853, 0x82000540, 0x00000010, 0x4801a407, - 0x4a01a207, 0x00000034, 0x4200b000, 0x0000000d, - 0x82d0ac00, 0x0000000c, 0x0201f800, 0x0010bd5b, - 0x42000800, 0x00000013, 0x42001000, 0x0000dc00, - 0x5c00a000, 0x5c00a800, 0x5c00b000, 0x0201f000, - 0x00107b6e, 0x0401fa43, 0x4a01a006, 0x63000028, - 0x5930001d, 0x4801a007, 0x42000800, 0x00000002, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00107b6e, - 0x0401fa46, 0x41780000, 0x41780800, 0x42002000, - 0x00080000, 0x0c01f81b, 0x80000000, 0x80040800, - 0x42001000, 0x0000000c, 0x59841802, 0x8c0c1d00, - 0x04020008, 0x42002000, 0x00050000, 0x0c01f811, - 0x80000000, 0x80040800, 0x82081400, 0x00000004, - 0x82080540, 0x02000000, 0x4801a006, 0x800408e0, - 0x5930001d, 0x80040540, 0x4801a007, 0x80080904, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00107b6e, - 0x00107539, 0x0010753b, 0x0010753d, 0x0010753f, - 0x00107541, 0x4811a008, 0x1c01f000, 0x4811a009, - 0x1c01f000, 0x4811a00a, 0x1c01f000, 0x4811a00b, - 0x1c01f000, 0x4811a00c, 0x1c01f000, 0x4a02600a, - 0x0010df3c, 0x59a8000f, 0x82000500, 0x000000ff, - 0x800000d0, 0x42026800, 0x0010df3c, 0x48026a12, - 0x0401fa62, 0x41780800, 0x42001000, 0x00005c00, - 0x0201f000, 0x00107b6e, 0x0401f9fa, 0x4a01a006, - 0x52000000, 0x4979a007, 0x5932481c, 0x59240400, - 0x82000500, 0x00000003, 0x04000006, 0x59240400, - 0x80000110, 0x0201f800, 0x001015b2, 0x4805a007, - 0x59240001, 0x4801a008, 0x59240002, 0x4801a009, - 0x59240003, 0x4801a00a, 0x59240004, 0x4801a00b, - 0x59240005, 0x4801a00c, 0x42000800, 0x00000007, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00107b6e, - 0x4a026202, 0x0000ffff, 0x4d340000, 0x813669c0, - 0x04020011, 0x42026800, 0x0010df3c, 0x4936600a, - 0x4a026c03, 0x0000ffff, 0x497a6a00, 0x59300027, - 0x48026802, 0x497a6027, 0x497a6a12, 0x82000d00, - 0x00ffff00, 0x04020004, 0x800000d0, 0x48026a12, - 0x0401f001, 0x0401f9c7, 0x5c026800, 0x4a01a006, - 0x05000000, 0x5932481c, 0x59240005, 0x4801a007, - 0x59240001, 0x59240802, 0x4801a008, 0x4805a009, - 0x42000800, 0x00000004, 0x42001000, 0x0000dc00, - 0x0201f000, 0x00107b6e, 0x4a026202, 0x0000ffff, - 0x0401f9b4, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010488c, 0x5c027800, 0x4a01a006, 0x03000000, - 0x59340403, 0x82000580, 0x000007fe, 0x0402007b, - 0x4a01a006, 0x04000000, 0x81a40800, 0x4a000800, - 0x22fffffe, 0x5934000a, 0x84000500, 0x4802680a, - 0x59a8021b, 0x8c000508, 0x04000010, 0x59a8001f, - 0x4801a007, 0x59a80020, 0x82000500, 0x07deffff, - 0x599c0818, 0x8c040d16, 0x04000002, 0x8400056a, - 0x4801a008, 0x4a01a009, 0x00002710, 0x59a80022, - 0x4801a00a, 0x0401f049, 0x59a8001f, 0x59a8121b, - 0x8c081506, 0x04000003, 0x82000500, 0xffff0000, - 0x4801a007, 0x0201f800, 0x00104fc6, 0x04020013, - 0x59a80878, 0x8c040d3e, 0x04020010, 0x59300c03, - 0x82041580, 0x00000051, 0x0400000c, 0x497b8880, - 0x82000500, 0x0000ffff, 0x4c000000, 0x0201f800, - 0x001015e0, 0x5c000000, 0x48038880, 0x41780800, - 0x0201f800, 0x00101bda, 0x59a80020, 0x0201f800, - 0x00104fc6, 0x04020006, 0x82000500, 0xb7ffffff, - 0x82000540, 0x80000000, 0x0401f003, 0x82000500, - 0x3fffffff, 0x599c0818, 0x8c040d16, 0x04000002, - 0x8400056a, 0x8d0e1d10, 0x04000019, 0x59300c03, - 0x82041580, 0x00000051, 0x04000015, 0x82041580, - 0x00000031, 0x04000012, 0x4c580000, 0x4c500000, - 0x4c540000, 0x4200b000, 0x00000004, 0x4200a000, - 0x0010cccb, 0x82d0ac00, 0x0000001f, 0x4c000000, - 0x0201f800, 0x0010bd5b, 0x5c000000, 0x5c00a800, - 0x5c00a000, 0x5c00b000, 0x8400057a, 0x4801a008, - 0x4979a009, 0x4979a00a, 0x59240001, 0x59240802, - 0x4801a00b, 0x4805a00c, 0x59240003, 0x59240804, - 0x4801a00d, 0x4805a00e, 0x4979a00f, 0x4979a010, - 0x4979a011, 0x4979a012, 0x4979a013, 0x4979a014, - 0x4979a015, 0x4979a016, 0x59a80023, 0x84000576, - 0x4801a017, 0x59a80024, 0x4801a018, 0x4979a019, - 0x4979a01a, 0x0401f049, 0x59a8021b, 0x8c000508, - 0x0400000d, 0x59a8001f, 0x82000500, 0x0000ffff, - 0x59c40880, 0x80040d80, 0x04000007, 0x497b8880, - 0x4c000000, 0x0201f800, 0x001015e0, 0x5c000000, - 0x48038880, 0x59a8001f, 0x4801a007, 0x4c640000, - 0x4d2c0000, 0x59a8c820, 0x0201f800, 0x00109667, - 0x0400000e, 0x0201f800, 0x00109d13, 0x0402000b, - 0x592c0208, 0x8c00050e, 0x04000008, 0x8264cd00, - 0x0000ffff, 0x592c000a, 0x82000500, 0xffff0000, - 0x8064cd40, 0x0401f006, 0x59a80a1b, 0x82040d00, - 0x00000030, 0x04000002, 0x8464cd36, 0x4865a008, - 0x5c025800, 0x5c00c800, 0x59a80021, 0x4801a009, - 0x59a80022, 0x4801a00a, 0x59240001, 0x59240802, - 0x4801a00b, 0x4805a00c, 0x59240003, 0x59240804, - 0x4801a00d, 0x4805a00e, 0x4979a00f, 0x4979a010, - 0x4979a011, 0x4979a012, 0x4979a013, 0x4979a014, - 0x4979a015, 0x4979a016, 0x59a80023, 0x4801a017, - 0x59a80024, 0x4801a018, 0x59a80025, 0x4801a019, - 0x59a80026, 0x4801a01a, 0x42000800, 0x0000001d, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00107b6e, - 0x0401f8e0, 0x4a01a006, 0x50000000, 0x0401f7af, - 0x0401f8dc, 0x4a01a006, 0x21100014, 0x4979a007, - 0x4979a008, 0x4979a009, 0x4979a00a, 0x42000800, + 0x5c00b000, 0x0201f000, 0x00107d64, 0x0401fa77, + 0x4a01a006, 0x78000000, 0x5930001d, 0x840001c0, + 0x4801a407, 0x4979a207, 0x42000800, 0x00000002, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107d64, + 0x4c580000, 0x4c540000, 0x4c500000, 0x0401fa75, + 0x4a01a006, 0x02000000, 0x5932481c, 0x59240001, + 0x4801a008, 0x59240002, 0x4801a009, 0x59240003, + 0x4801a00a, 0x59240004, 0x4801a00b, 0x5930001d, + 0x82000d80, 0x0000e000, 0x04000012, 0x82000d80, + 0x0000df00, 0x04000006, 0x4a01a407, 0x00000010, + 0x42000800, 0x00000006, 0x0401f01f, 0x42001800, + 0x0010cb46, 0x0201f800, 0x00100533, 0x42000000, + 0x0000df00, 0x4200a000, 0x0010cb46, 0x0401f009, + 0x42001800, 0x0010cb53, 0x0201f800, 0x00100533, + 0x42000000, 0x0000e000, 0x4200a000, 0x0010cb53, + 0x82000540, 0x00000010, 0x4801a407, 0x4a01a207, + 0x00000034, 0x4200b000, 0x0000000d, 0x82d0ac00, + 0x0000000c, 0x0201f800, 0x0010c086, 0x42000800, + 0x00000013, 0x42001000, 0x0000dc00, 0x5c00a000, + 0x5c00a800, 0x5c00b000, 0x0201f000, 0x00107d64, + 0x0401fa2a, 0x4a01a006, 0x63000028, 0x5930001d, + 0x4801a007, 0x42000800, 0x00000002, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x0401fa2d, + 0x41780000, 0x41780800, 0x42002000, 0x00080000, + 0x0c01f81b, 0x80000000, 0x80040800, 0x42001000, + 0x0000000c, 0x59841802, 0x8c0c1d00, 0x04020008, + 0x42002000, 0x00050000, 0x0c01f811, 0x80000000, + 0x80040800, 0x82081400, 0x00000004, 0x82080540, + 0x02000000, 0x4801a006, 0x800408e0, 0x5930001d, + 0x80040540, 0x4801a007, 0x80080904, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x00107748, + 0x0010774a, 0x0010774c, 0x0010774e, 0x00107750, + 0x4811a008, 0x1c01f000, 0x4811a009, 0x1c01f000, + 0x4811a00a, 0x1c01f000, 0x4811a00b, 0x1c01f000, + 0x4811a00c, 0x1c01f000, 0x4a02600a, 0x0010e23c, + 0x59a8000f, 0x82000500, 0x000000ff, 0x800000d0, + 0x42026800, 0x0010e23c, 0x48026a12, 0x0401fa49, + 0x41780800, 0x42001000, 0x00005c00, 0x0201f000, + 0x00107d64, 0x0401f9e1, 0x4a01a006, 0x52000000, + 0x4979a007, 0x5932481c, 0x59240400, 0x82000500, + 0x00000003, 0x04000006, 0x59240400, 0x80000110, + 0x0201f800, 0x001015b3, 0x4805a007, 0x59240001, + 0x4801a008, 0x59240002, 0x4801a009, 0x59240003, + 0x4801a00a, 0x59240004, 0x4801a00b, 0x59240005, + 0x4801a00c, 0x42000800, 0x00000007, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x4a026202, + 0x0000ffff, 0x0401f9c1, 0x4a01a006, 0x05000000, + 0x5932481c, 0x59240005, 0x4801a007, 0x59240001, + 0x59240802, 0x4801a008, 0x4805a009, 0x42000800, + 0x00000004, 0x42001000, 0x0000dc00, 0x0201f000, + 0x00107d64, 0x4a026202, 0x0000ffff, 0x0401f9af, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010498c, + 0x5c027800, 0x4a01a006, 0x03000000, 0x59340403, + 0x82000580, 0x000007fe, 0x04020081, 0x4a01a006, + 0x04000000, 0x59a8021b, 0x8c000506, 0x04000004, + 0x5930081c, 0x58040408, 0x4801a001, 0x81a40800, + 0x4a000800, 0x22fffffe, 0x5934000a, 0x84000500, + 0x4802680a, 0x59a8021b, 0x8c000508, 0x04000010, + 0x59a8001f, 0x4801a007, 0x59a80020, 0x82000500, + 0x07deffff, 0x599c0818, 0x8c040d16, 0x04000002, + 0x8400056a, 0x4801a008, 0x4a01a009, 0x00002710, + 0x59a80022, 0x4801a00a, 0x0401f049, 0x59a8001f, + 0x59a8121b, 0x8c081506, 0x04000003, 0x82000500, + 0xffff0000, 0x4801a007, 0x0201f800, 0x001050f7, + 0x04020013, 0x59a80878, 0x8c040d3e, 0x04020010, + 0x59300c03, 0x82041580, 0x00000051, 0x0400000c, + 0x497b8880, 0x82000500, 0x0000ffff, 0x4c000000, + 0x0201f800, 0x001015e5, 0x5c000000, 0x48038880, + 0x41780800, 0x0201f800, 0x00101bdf, 0x59a80020, + 0x0201f800, 0x001050f7, 0x04020006, 0x82000500, + 0xb7ffffff, 0x82000540, 0x80000000, 0x0401f003, + 0x82000500, 0x3fffffff, 0x599c0818, 0x8c040d16, + 0x04000002, 0x8400056a, 0x8d0e1d10, 0x04000019, + 0x59300c03, 0x82041580, 0x00000051, 0x04000015, + 0x82041580, 0x00000031, 0x04000012, 0x4c580000, + 0x4c500000, 0x4c540000, 0x4200b000, 0x00000004, + 0x4200a000, 0x0010cfcb, 0x82d0ac00, 0x0000001f, + 0x4c000000, 0x0201f800, 0x0010c086, 0x5c000000, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x8400057a, + 0x4801a008, 0x4979a009, 0x4979a00a, 0x59240001, + 0x59240802, 0x4801a00b, 0x4805a00c, 0x59240003, + 0x59240804, 0x4801a00d, 0x4805a00e, 0x4979a00f, + 0x4979a010, 0x4979a011, 0x4979a012, 0x4979a013, + 0x4979a014, 0x4979a015, 0x4979a016, 0x59a80023, + 0x84000576, 0x4801a017, 0x59a80024, 0x4801a018, + 0x4979a019, 0x4979a01a, 0x0401f049, 0x59a8021b, + 0x8c000508, 0x0400000d, 0x59a8001f, 0x82000500, + 0x0000ffff, 0x59c40880, 0x80040d80, 0x04000007, + 0x497b8880, 0x4c000000, 0x0201f800, 0x001015e5, + 0x5c000000, 0x48038880, 0x59a8001f, 0x4801a007, + 0x4c640000, 0x4d2c0000, 0x59a8c820, 0x0201f800, + 0x0010989f, 0x0400000e, 0x0201f800, 0x00109f51, + 0x0402000b, 0x592c0208, 0x8c00050e, 0x04000008, + 0x8264cd00, 0x0000ffff, 0x592c000a, 0x82000500, + 0xffff0000, 0x8064cd40, 0x0401f006, 0x59a80a1b, + 0x82040d00, 0x00000030, 0x04000002, 0x8464cd36, + 0x4865a008, 0x5c025800, 0x5c00c800, 0x59a80021, + 0x4801a009, 0x59a80022, 0x4801a00a, 0x59240001, + 0x59240802, 0x4801a00b, 0x4805a00c, 0x59240003, + 0x59240804, 0x4801a00d, 0x4805a00e, 0x4979a00f, + 0x4979a010, 0x4979a011, 0x4979a012, 0x4979a013, + 0x4979a014, 0x4979a015, 0x4979a016, 0x59a80023, + 0x4801a017, 0x59a80024, 0x4801a018, 0x59a80025, + 0x4801a019, 0x59a80026, 0x4801a01a, 0x42000800, + 0x0000001d, 0x42001000, 0x0000dc00, 0x0201f000, + 0x00107d64, 0x0401f8d5, 0x4a01a006, 0x50000000, + 0x0401f7af, 0x0401f8d1, 0x4a01a006, 0x21100014, + 0x4979a007, 0x4979a008, 0x4979a009, 0x4979a00a, + 0x42000800, 0x00000005, 0x42001000, 0x0000dc00, + 0x0201f000, 0x00107d64, 0x0401f8cb, 0x0401f002, + 0x0401f8d0, 0x4a01a006, 0x02000000, 0x42000800, + 0x00000001, 0x42001000, 0x0000dc00, 0x0201f000, + 0x00107d64, 0x0401f8c7, 0x4a01a006, 0x02000000, + 0x59300403, 0x82000580, 0x00000031, 0x04020790, + 0x81a40800, 0x4a000801, 0x00fffffe, 0x0401f71a, + 0x0401f8bc, 0x4a01a006, 0x01000000, 0x5930041b, + 0x80000540, 0x04000003, 0x4801a407, 0x0401f003, + 0x4a01a407, 0x00000003, 0x5930021b, 0x80000540, + 0x04000003, 0x4801a207, 0x0401f003, 0x4a01a207, + 0x00002a00, 0x42000800, 0x00000002, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x4a026202, + 0x0000ffff, 0x0401f895, 0x4a01a406, 0x00002010, + 0x4a01a206, 0x00000014, 0x4a01a407, 0x00000800, + 0x4a01a207, 0x00002000, 0x42000000, 0x00000400, + 0x59a80807, 0x8c040d0c, 0x04000002, 0x80000580, + 0x5932481c, 0x59240c00, 0x8c040d08, 0x04000005, + 0x82000540, 0x00000020, 0x8c040d0a, 0x04020003, + 0x82000540, 0x00000010, 0x82000540, 0x00000002, + 0x5934080a, 0x8c040d14, 0x04000005, 0x82040d00, + 0x00000380, 0x80040540, 0x0401f006, 0x599c0818, + 0x8c040d18, 0x04000003, 0x82000540, 0x00000380, + 0x0401f042, 0x0401f87b, 0x4a01a406, 0x00000210, + 0x4a01a206, 0x00000014, 0x4a01a407, 0x00000800, + 0x5934000a, 0x8c000516, 0x04000014, 0x59340c05, + 0x82040500, 0x00000030, 0x04000013, 0x59340a05, + 0x82040500, 0x0000c000, 0x04020009, 0x8c040d1a, + 0x04000004, 0x4a01a207, 0x00002100, 0x0401f00c, + 0x4a01a207, 0x00000100, 0x0401f009, 0x4a01a207, + 0x00000400, 0x0401f006, 0x4a01a207, 0x00000700, + 0x0401f003, 0x4a01a207, 0x00000800, 0x42000000, + 0x00000400, 0x59a80807, 0x8c040d0c, 0x04000002, + 0x80000580, 0x5932481c, 0x59240c00, 0x8c040d08, + 0x04000005, 0x82000540, 0x00000020, 0x8c040d0a, + 0x04020003, 0x82000540, 0x00000010, 0x82000540, + 0x00000002, 0x59340a00, 0x8c040d0e, 0x0400000b, + 0x84000550, 0x599c1017, 0x8c08150a, 0x04020004, + 0x8c040d0a, 0x04000002, 0x8400054e, 0x8c040d1c, + 0x04000002, 0x84000552, 0x4801a20a, 0x42000800, 0x00000005, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00107b6e, 0x0401f8d6, 0x0401f002, 0x0401f8db, - 0x4a01a006, 0x02000000, 0x42000800, 0x00000001, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00107b6e, - 0x0401f8d2, 0x4a01a006, 0x02000000, 0x59300403, - 0x82000580, 0x00000031, 0x04020790, 0x81a40800, - 0x4a000801, 0x00fffffe, 0x0401f71a, 0x4d340000, - 0x813669c0, 0x04020010, 0x42026800, 0x0010df3c, - 0x4936600a, 0x4a026c03, 0x0000ffff, 0x497a6a00, - 0x59300027, 0x48026802, 0x497a6027, 0x497a6a12, - 0x82000d00, 0x00ffff00, 0x04020003, 0x800000d0, - 0x48026a12, 0x0401f8b5, 0x5c026800, 0x4a01a006, - 0x01000000, 0x5930041b, 0x80000540, 0x04000003, - 0x4801a407, 0x0401f003, 0x4a01a407, 0x00000003, - 0x5930021b, 0x80000540, 0x04000003, 0x4801a207, - 0x0401f003, 0x4a01a207, 0x00002a00, 0x42000800, - 0x00000002, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00107b6e, 0x4a026202, 0x0000ffff, 0x0401f88d, - 0x4a01a406, 0x00002010, 0x4a01a206, 0x00000014, - 0x4a01a407, 0x00000800, 0x4a01a207, 0x00002000, - 0x42000000, 0x00000400, 0x5932481c, 0x59240c00, - 0x8c040d08, 0x04000005, 0x82000540, 0x00000020, - 0x8c040d0a, 0x04020003, 0x82000540, 0x00000010, - 0x82000540, 0x00000002, 0x5934080a, 0x8c040d14, - 0x04000005, 0x82040d00, 0x00000380, 0x80040540, - 0x0401f006, 0x599c0818, 0x8c040d18, 0x04000003, - 0x82000540, 0x00000380, 0x0401f03e, 0x0401f877, - 0x4a01a406, 0x00000210, 0x4a01a206, 0x00000014, - 0x4a01a407, 0x00000800, 0x5934000a, 0x8c000516, - 0x04000014, 0x59340c05, 0x82040500, 0x00000030, - 0x04000013, 0x59340a05, 0x82040500, 0x0000c000, - 0x04020009, 0x8c040d1a, 0x04000004, 0x4a01a207, - 0x00002100, 0x0401f00c, 0x4a01a207, 0x00000100, - 0x0401f009, 0x4a01a207, 0x00000400, 0x0401f006, - 0x4a01a207, 0x00000700, 0x0401f003, 0x4a01a207, - 0x00000800, 0x42000000, 0x00000400, 0x5932481c, - 0x59240c00, 0x8c040d08, 0x04000005, 0x82000540, - 0x00000020, 0x8c040d0a, 0x04020003, 0x82000540, - 0x00000010, 0x82000540, 0x00000002, 0x59340a00, - 0x8c040d0e, 0x0400000b, 0x84000550, 0x599c1017, - 0x8c08150a, 0x04020004, 0x8c040d0a, 0x04000002, - 0x8400054e, 0x8c040d1c, 0x04000002, 0x84000552, - 0x4801a20a, 0x42000800, 0x00000005, 0x42001000, - 0x0000dc00, 0x0201f000, 0x00107b6e, 0x0401f833, - 0x4a01a006, 0x02100014, 0x4a01a007, 0x00000100, - 0x4979a008, 0x4979a009, 0x4979a00a, 0x42000800, - 0x00000005, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00107b6e, 0x0401f825, 0x4a01a006, 0x02000000, - 0x0401f61d, 0x4933c857, 0x0401f820, 0x4a01a006, - 0x01000000, 0x4a01a407, 0x0000000b, 0x42000800, - 0x00000002, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00107b6e, 0x42005000, 0x32000000, 0x42006000, - 0x08290000, 0x41786800, 0x41787800, 0x0401f3fd, - 0x42005000, 0x22000000, 0x42006000, 0x01290000, - 0x41786800, 0x41787800, 0x0401f3f6, 0x42005000, - 0x33000000, 0x42006000, 0x08980000, 0x41786800, - 0x41787800, 0x0401f3ef, 0x42005000, 0x23000000, - 0x42006000, 0x01980000, 0x41786800, 0x41787800, - 0x0401f3e8, 0x59300403, 0x82000c80, 0x00000085, - 0x02001800, 0x0010032e, 0x82000c80, 0x00000093, - 0x02021800, 0x0010032e, 0x82000480, 0x00000085, - 0x0c01f001, 0x0010777b, 0x0010777b, 0x0010777b, - 0x0010777b, 0x0010777b, 0x0010777b, 0x0010777b, - 0x0010777b, 0x0010777b, 0x0010777b, 0x0010777b, - 0x0010777b, 0x0010777b, 0x0010777d, 0x0201f800, - 0x0010032e, 0x4d2c0000, 0x59325809, 0x4933c857, - 0x492fc857, 0x812e59c0, 0x02000800, 0x0010032e, - 0x59340a12, 0x82040d00, 0x0000ff00, 0x592c000b, - 0x82000500, 0x000000ff, 0x900001c0, 0x80040540, - 0x82000540, 0x00000011, 0x44034800, 0x81a5a000, - 0x42001000, 0x00000009, 0x42000800, 0x00000003, - 0x592c000a, 0x82000500, 0xff000000, 0x82001d80, - 0x84000000, 0x04000009, 0x82001d80, 0x85000000, - 0x02020800, 0x0010032e, 0x42001000, 0x00000007, - 0x42000800, 0x00000001, 0x832c1c00, 0x0000000a, - 0x500c0000, 0x4401a000, 0x800c1800, 0x80d1a000, - 0x80081040, 0x040207fb, 0x42001000, 0x0000dc00, - 0x5c025800, 0x0401f3c1, 0x42005000, 0x81000000, - 0x42006000, 0x00090000, 0x41786800, 0x41787800, - 0x59301407, 0x82081580, 0x00000005, 0x04020003, - 0x42006000, 0x00890000, 0x0401f38e, 0x59300403, - 0x82000c80, 0x00000053, 0x02021800, 0x0010032e, - 0x82000480, 0x0000004b, 0x02001800, 0x0010032e, - 0x5932680a, 0x59368c03, 0x4803c857, 0x0c01f001, - 0x0010783b, 0x00107843, 0x0010784b, 0x00107853, - 0x001077d0, 0x001077d0, 0x001077d0, 0x00107833, - 0x0201f800, 0x0010032e, 0x42005000, 0x06000000, - 0x42006000, 0x08290000, 0x41786800, 0x41787800, - 0x0401f370, 0x4933c857, 0x0401ff72, 0x4a01a006, - 0x12000000, 0x59300407, 0x82000580, 0x00000004, - 0x04020003, 0x59340002, 0x0401f003, 0x5932481c, - 0x59240005, 0x82000500, 0x00ffffff, 0x4801a007, + 0x00107d64, 0x0401f833, 0x4a01a006, 0x02100014, + 0x4a01a007, 0x00000100, 0x4979a008, 0x4979a009, + 0x4979a00a, 0x42000800, 0x00000005, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x0401f825, + 0x4a01a006, 0x02000000, 0x0401f636, 0x4933c857, + 0x0401f820, 0x4a01a006, 0x01000000, 0x4a01a407, + 0x0000000b, 0x42000800, 0x00000002, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x42005000, + 0x32000000, 0x42006000, 0x08290000, 0x41786800, + 0x41787800, 0x0401f3fd, 0x42005000, 0x22000000, + 0x42006000, 0x01290000, 0x41786800, 0x41787800, + 0x0401f3f6, 0x42005000, 0x33000000, 0x42006000, + 0x08980000, 0x41786800, 0x41787800, 0x0401f3ef, + 0x42005000, 0x23000000, 0x42006000, 0x01980000, + 0x41786800, 0x41787800, 0x0401f3e8, 0x59300403, + 0x82000c80, 0x00000085, 0x02001800, 0x0010032e, + 0x82000c80, 0x00000093, 0x02021800, 0x0010032e, + 0x82000480, 0x00000085, 0x0c01f001, 0x00107971, + 0x00107971, 0x00107971, 0x00107971, 0x00107971, + 0x00107971, 0x00107971, 0x00107971, 0x00107971, + 0x00107971, 0x00107971, 0x00107971, 0x00107971, + 0x00107973, 0x0201f800, 0x0010032e, 0x4d2c0000, + 0x59325809, 0x4933c857, 0x492fc857, 0x812e59c0, + 0x02000800, 0x0010032e, 0x59340a12, 0x82040d00, + 0x0000ff00, 0x592c000b, 0x82000500, 0x000000ff, + 0x900001c0, 0x80040540, 0x82000540, 0x00000011, + 0x44034800, 0x81a5a000, 0x42001000, 0x00000009, + 0x42000800, 0x00000003, 0x592c000a, 0x82000500, + 0xff000000, 0x82001d80, 0x84000000, 0x04000009, + 0x82001d80, 0x85000000, 0x02020800, 0x0010032e, + 0x42001000, 0x00000007, 0x42000800, 0x00000001, + 0x832c1c00, 0x0000000a, 0x500c0000, 0x4401a000, + 0x800c1800, 0x80d1a000, 0x80081040, 0x040207fb, + 0x42001000, 0x0000dc00, 0x5c025800, 0x0401f3c1, + 0x42005000, 0x81000000, 0x42006000, 0x00090000, + 0x41786800, 0x41787800, 0x59301407, 0x82081580, + 0x00000005, 0x04020003, 0x42006000, 0x00890000, + 0x0401f38e, 0x59300403, 0x82000c80, 0x00000053, + 0x02021800, 0x0010032e, 0x82000480, 0x0000004b, + 0x02001800, 0x0010032e, 0x5932680a, 0x59368c03, + 0x4803c857, 0x0c01f001, 0x00107a31, 0x00107a39, + 0x00107a41, 0x00107a49, 0x001079c6, 0x001079c6, + 0x001079c6, 0x00107a29, 0x0201f800, 0x0010032e, + 0x42005000, 0x06000000, 0x42006000, 0x08290000, + 0x41786800, 0x41787800, 0x0401f370, 0x4933c857, + 0x0401ff72, 0x4a01a006, 0x12000000, 0x59300407, + 0x82000580, 0x00000004, 0x04020003, 0x59340002, + 0x0401f003, 0x5932481c, 0x59240005, 0x82000500, + 0x00ffffff, 0x4801a007, 0x5930041a, 0x4801a408, + 0x5930021a, 0x4801a208, 0x42000800, 0x00000003, + 0x42001000, 0x0000dc00, 0x0401f37e, 0x0401ff5b, + 0x4a01a006, 0x0f000000, 0x5930001d, 0x4801a007, + 0x42000800, 0x00000002, 0x42001000, 0x0000dc00, + 0x0401f374, 0x0401ff5f, 0x4a01a006, 0x02000000, + 0x59c40085, 0x59880804, 0x80040c00, 0x48071004, + 0x497b8885, 0x59880000, 0x4801a007, 0x59880001, + 0x4801a008, 0x59880002, 0x4801a009, 0x59880003, + 0x4801a00a, 0x59880004, 0x4801a00b, 0x59880005, + 0x4801a00c, 0x42000800, 0x00000007, 0x42001000, + 0x0000dc00, 0x0401f35b, 0x4a026202, 0x0000ffff, + 0x0401ff36, 0x4a01a006, 0x62000000, 0x5930001d, + 0x4801a007, 0x42000800, 0x00000002, 0x42001000, + 0x0000dc00, 0x0401f34f, 0x0401ff2c, 0x59300809, + 0x4c500000, 0x4c540000, 0x4c580000, 0x8204a400, + 0x0000000b, 0x5930b01d, 0x82d0ac00, 0x00000006, + 0x0201f800, 0x0010c086, 0x5930081d, 0x42001000, + 0x0000dc00, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x0401f33c, 0x0401ff9f, 0x59300018, 0x4801a006, + 0x59300019, 0x4801a007, 0x4a01a008, 0x00001000, + 0x0401f020, 0x0401ff97, 0x59300018, 0x4801a006, + 0x59300019, 0x4801a007, 0x4a01a008, 0x00004000, + 0x0401f018, 0x0401ff8f, 0x59300018, 0x4801a006, + 0x59300019, 0x4801a007, 0x4a01a008, 0x00002000, + 0x0401f010, 0x0401ff87, 0x59300018, 0x4801a006, + 0x59300019, 0x4801a007, 0x4a01a008, 0x00000400, + 0x0401f008, 0x0401ff7f, 0x59300018, 0x4801a006, + 0x59300019, 0x4801a007, 0x4a01a008, 0x00000200, + 0x4979a009, 0x4979a00a, 0x4979a00b, 0x4979a00c, + 0x4979a00d, 0x42000800, 0x00000008, 0x42001000, + 0x0000dc00, 0x0401f30b, 0x0401fef6, 0x4a01a006, + 0x02000014, 0x4979a407, 0x4979a207, 0x59a8002d, + 0x4801a008, 0x59a8002e, 0x4801a009, 0x4a01a00a, + 0x00047878, 0x42000800, 0x00000005, 0x42001000, + 0x0000dc00, 0x0401f2fb, 0x0401fee6, 0x4a01a006, + 0x02140018, 0x4a01a407, 0x00000800, 0x5930001d, + 0x82000d00, 0xff000000, 0x900409c0, 0x4805a207, + 0x82000500, 0x00ffffff, 0x4801a00a, 0x4979a408, + 0x4979a208, 0x4979a409, 0x4979a209, 0x4979a00b, + 0x42000800, 0x00000006, 0x42001000, 0x0000dc00, + 0x0401f2e4, 0x4933c857, 0x4937c857, 0x4d1c0000, + 0x42000800, 0x00000035, 0x0201f800, 0x00109c9c, + 0x04020026, 0x0401feb9, 0x4a01a006, 0x13000000, + 0x59323827, 0x59300403, 0x82000580, 0x00000057, + 0x04000005, 0x591c0415, 0x8c000502, 0x02000800, + 0x0010032e, 0x591c001a, 0x4801a005, 0x591c0407, + 0x82000580, 0x00000003, 0x04000007, 0x5930080a, + 0x58040002, 0x82000500, 0x00ffffff, 0x4801a007, + 0x0401f004, 0x5932481c, 0x59240005, 0x4801a007, 0x5930041a, 0x4801a408, 0x5930021a, 0x4801a208, 0x42000800, 0x00000003, 0x42001000, 0x0000dc00, - 0x0401f37e, 0x0401ff5b, 0x4a01a006, 0x0f000000, - 0x5930001d, 0x4801a007, 0x42000800, 0x00000002, - 0x42001000, 0x0000dc00, 0x0401f374, 0x0401ff5f, - 0x4a01a006, 0x02000000, 0x59c40085, 0x59880804, - 0x80040c00, 0x48071004, 0x497b8885, 0x59880000, - 0x4801a007, 0x59880001, 0x4801a008, 0x59880002, - 0x4801a009, 0x59880003, 0x4801a00a, 0x59880004, - 0x4801a00b, 0x59880005, 0x4801a00c, 0x42000800, - 0x00000007, 0x42001000, 0x0000dc00, 0x0401f35b, - 0x4a026202, 0x0000ffff, 0x0401ff36, 0x4a01a006, - 0x62000000, 0x5930001d, 0x4801a007, 0x42000800, - 0x00000002, 0x42001000, 0x0000dc00, 0x0401f34f, - 0x0401ff2c, 0x59300809, 0x4c500000, 0x4c540000, - 0x4c580000, 0x8204a400, 0x0000000b, 0x5930b01d, - 0x82d0ac00, 0x00000006, 0x0201f800, 0x0010bd5b, - 0x5930081d, 0x42001000, 0x0000dc00, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x0401f33c, 0x0401ff9f, - 0x59300018, 0x4801a006, 0x59300019, 0x4801a007, - 0x4a01a008, 0x00001000, 0x0401f020, 0x0401ff97, - 0x59300018, 0x4801a006, 0x59300019, 0x4801a007, - 0x4a01a008, 0x00004000, 0x0401f018, 0x0401ff8f, - 0x59300018, 0x4801a006, 0x59300019, 0x4801a007, - 0x4a01a008, 0x00002000, 0x0401f010, 0x0401ff87, - 0x59300018, 0x4801a006, 0x59300019, 0x4801a007, - 0x4a01a008, 0x00000400, 0x0401f008, 0x0401ff7f, - 0x59300018, 0x4801a006, 0x59300019, 0x4801a007, - 0x4a01a008, 0x00000200, 0x4979a009, 0x4979a00a, - 0x4979a00b, 0x4979a00c, 0x4979a00d, 0x42000800, - 0x00000008, 0x42001000, 0x0000dc00, 0x0401f30b, - 0x0401fef6, 0x4a01a006, 0x02000014, 0x4979a407, - 0x4979a207, 0x59a8002d, 0x4801a008, 0x59a8002e, - 0x4801a009, 0x4a01a00a, 0x00047878, 0x42000800, - 0x00000005, 0x42001000, 0x0000dc00, 0x0401f2fb, - 0x0401fee6, 0x4a01a006, 0x02140018, 0x4a01a407, - 0x00000800, 0x5930001d, 0x82000d00, 0xff000000, - 0x900409c0, 0x4805a207, 0x82000500, 0x00ffffff, - 0x4801a00a, 0x4979a408, 0x4979a208, 0x4979a409, - 0x4979a209, 0x4979a00b, 0x42000800, 0x00000006, - 0x42001000, 0x0000dc00, 0x0401f2e4, 0x4933c857, - 0x4937c857, 0x4d1c0000, 0x42000800, 0x00000035, - 0x0201f800, 0x00109a64, 0x04020026, 0x0401feb9, - 0x4a01a006, 0x13000000, 0x59323827, 0x59300403, - 0x82000580, 0x00000057, 0x04000005, 0x591c0415, - 0x8c000502, 0x02000800, 0x0010032e, 0x591c001a, - 0x4801a005, 0x591c0407, 0x82000580, 0x00000003, - 0x04000007, 0x5930080a, 0x58040002, 0x82000500, - 0x00ffffff, 0x4801a007, 0x0401f004, 0x5932481c, - 0x59240005, 0x4801a007, 0x5930041a, 0x4801a408, - 0x5930021a, 0x4801a208, 0x42000800, 0x00000003, - 0x42001000, 0x0000dc00, 0x5c023800, 0x0401f2b7, - 0x4803c856, 0x0201f800, 0x00106c3c, 0x598c000f, - 0x81300580, 0x02020800, 0x0010032e, 0x0201f800, - 0x00106b8c, 0x59300403, 0x82000580, 0x00000057, - 0x02000800, 0x001084a2, 0x0201f800, 0x00020b9d, - 0x5c023800, 0x0201f000, 0x00106c29, 0x4803c856, - 0x4d2c0000, 0x4d1c0000, 0x59323827, 0x811e39c0, - 0x02000800, 0x0010032e, 0x831c0580, 0xffffffff, - 0x0400003d, 0x591c0c07, 0x82040580, 0x00000006, - 0x0400000d, 0x82040580, 0x00000003, 0x0400003b, - 0x4a026403, 0x00000037, 0x4a02641b, 0x00000003, - 0x4a02621b, 0x00001700, 0x5c023800, 0x5c025800, - 0x0401f06d, 0x0401f850, 0x42001000, 0x40000000, - 0x591c0203, 0x591c0804, 0x8c040d3e, 0x04020023, - 0x82000c80, 0x0000000e, 0x0c001003, 0x0201f800, - 0x0010032e, 0x00107902, 0x0010790e, 0x00107904, - 0x0010790e, 0x0010790a, 0x00107902, 0x00107902, - 0x0010790e, 0x0010790e, 0x00107902, 0x00107902, - 0x00107902, 0x00107902, 0x00107902, 0x0010790e, - 0x00107902, 0x0010790e, 0x0201f800, 0x0010032e, - 0x591c0415, 0x4803c857, 0x8c000518, 0x04000003, - 0x8c000512, 0x04000003, 0x80001580, 0x0401f003, - 0x42001000, 0x20000000, 0x591c0016, 0x4801a00a, - 0x0401f01d, 0x0401f824, 0x42001000, 0x40000000, - 0x41780000, 0x0401f7fa, 0x0401f81f, 0x591e5809, - 0x812e59c0, 0x02000800, 0x0010032e, 0x592c1010, - 0x591c0012, 0x80080480, 0x4801a00a, 0x591c0203, - 0x591c0804, 0x8c040d3e, 0x04020007, 0x82000d80, - 0x00000002, 0x04000007, 0x82000d80, 0x00000004, - 0x04000004, 0x42001000, 0x40000000, 0x0401f002, - 0x80001580, 0x4809a00b, 0x42000800, 0x00000006, - 0x42001000, 0x0000dc00, 0x5c023800, 0x5c025800, - 0x0401f23a, 0x4803c856, 0x0401fe24, 0x4a01a006, - 0x02000000, 0x59300c1a, 0x4805a407, 0x59300a1a, - 0x4805a207, 0x5932481c, 0x59241005, 0x5930080a, - 0x58041802, 0x820c1d00, 0x00ffffff, 0x59300827, - 0x82040580, 0xffffffff, 0x04000008, 0x58040407, - 0x82000580, 0x00000003, 0x04020004, 0x4809a008, - 0x480da009, 0x0401f003, 0x480da008, 0x4809a009, - 0x1c01f000, 0x4803c856, 0x0401fe08, 0x0401f003, - 0x4803c856, 0x0401fdfe, 0x4a01a006, 0x01000000, - 0x5930041b, 0x4801a407, 0x5930021b, 0x4801a207, - 0x42000800, 0x00000002, 0x42001000, 0x0000dc00, - 0x0401f20e, 0x4803c856, 0x4d1c0000, 0x0401fde2, - 0x4a01a006, 0x14000000, 0x59323827, 0x591c001a, - 0x4801a005, 0x5930041a, 0x4801a407, 0x5930021a, - 0x4801a207, 0x59300016, 0x4801a008, 0x59300217, - 0x82000500, 0x000000ff, 0x840001c0, 0x4801a409, - 0x42000800, 0x00000004, 0x42001000, 0x0000dc00, - 0x5c023800, 0x0401f1f5, 0x4803c856, 0x0401fddf, - 0x4a01a006, 0x02000001, 0x42001000, 0xe0000000, - 0x59a80878, 0x8c040d3e, 0x04000004, 0x42001000, - 0x20000000, 0x0401f010, 0x59a80070, 0x8c000508, - 0x04000004, 0x82081500, 0xdfffffff, 0x0401f00a, - 0x59a80847, 0x82040d80, 0x01391077, 0x04020006, - 0x59e00813, 0x8c040d00, 0x04000003, 0x82081500, - 0xdfffffff, 0x59c40801, 0x82040d00, 0x00018000, - 0x82040580, 0x00000000, 0x42000000, 0x00008000, - 0x0400000d, 0x82040580, 0x00008000, 0x42000000, - 0x00004000, 0x04000008, 0x82040580, 0x00010000, - 0x42000000, 0x00002000, 0x04000003, 0x42000000, - 0x00000002, 0x80080540, 0x4801a007, 0x42000800, - 0x00000002, 0x42001000, 0x0000dc00, 0x0401f1bf, - 0x4803c856, 0x0401f80b, 0x5930041b, 0x900001c0, - 0x4801a005, 0x0401f9f6, 0x41780800, 0x42001000, - 0x00005c00, 0x0401f9b5, 0x0201f000, 0x001063f8, - 0x4803c856, 0x59300818, 0x82041c00, 0x00000006, - 0x46034800, 0x00000021, 0x58040405, 0x82000500, - 0x0000f000, 0x82000580, 0x00003000, 0x04000003, - 0x46034800, 0x00000041, 0x81a5a000, 0x580c0001, - 0x82000d00, 0x00ffffff, 0x82040d40, 0xc2000000, - 0x4805a000, 0x580c0800, 0x82041500, 0x00ffffff, - 0x82000500, 0xff000000, 0x80080540, 0x4801a001, - 0x580c0002, 0x82000580, 0x00c00000, 0x82000500, - 0x00fd0300, 0x4801a002, 0x580c0003, 0x4801a003, - 0x580c0404, 0x4801a404, 0x580c0204, 0x4801a204, - 0x1c01f000, 0x4803c856, 0x59a8021b, 0x82000500, - 0x00000028, 0x04020009, 0x59a8021b, 0x82000500, - 0x00000028, 0x04000003, 0x497a6a12, 0x0401f003, - 0x4a026a12, 0x0000ff00, 0x42005000, 0x22000000, - 0x42006000, 0x01380000, 0x41786800, 0x41787800, - 0x0401f950, 0x59301009, 0x4a01a006, 0x54000000, - 0x5932481c, 0x59240005, 0x82000500, 0x00ffffff, - 0x58080c0b, 0x800408f0, 0x80040540, 0x4801a007, - 0x5808000b, 0x82000500, 0xff000000, 0x4801a008, - 0x59a80002, 0x4801a009, 0x59a80003, 0x4801a00a, - 0x59a80000, 0x4801a00b, 0x59a80001, 0x4801a00c, - 0x5808000d, 0x9c0001c0, 0x4801a00d, 0x5808000e, - 0x9c0001c0, 0x4801a00e, 0x5808000f, 0x9c0001c0, - 0x4801a00f, 0x58080010, 0x9c0001c0, 0x4801a010, - 0x58080011, 0x9c0001c0, 0x4801a011, 0x58080012, - 0x9c0001c0, 0x4801a012, 0x58080013, 0x9c0001c0, - 0x4801a013, 0x58080014, 0x9c0001c0, 0x4801a014, - 0x58080011, 0x9c0001c0, 0x4801a015, 0x58080012, - 0x9c0001c0, 0x4801a016, 0x58080013, 0x9c0001c0, - 0x4801a017, 0x58080014, 0x9c0001c0, 0x4801a018, - 0x42000800, 0x00000013, 0x42001000, 0x0000dc00, - 0x0401f136, 0x4803c856, 0x42005000, 0x22000000, - 0x42006000, 0x01290000, 0x41786800, 0x41787800, - 0x0401f908, 0x59301009, 0x4a01a006, 0x55000000, - 0x5808000c, 0x82000500, 0x00ffffff, 0x58080c0b, - 0x800408f0, 0x80040540, 0x4801a007, 0x5808080b, - 0x82040d00, 0xff000000, 0x5932481c, 0x59240005, - 0x82000500, 0x00ffffff, 0x80040540, 0x4801a008, - 0x5808000d, 0x9c0001c0, 0x4801a009, 0x5808000e, - 0x9c0001c0, 0x4801a00a, 0x5808000f, 0x9c0001c0, - 0x4801a00b, 0x58080010, 0x9c0001c0, 0x4801a00c, - 0x59a80002, 0x4801a00d, 0x59a80003, 0x4801a00e, - 0x59a80000, 0x4801a00f, 0x59a80001, 0x4801a010, - 0x58080011, 0x4801a011, 0x58080012, 0x4801a012, - 0x58080013, 0x4801a013, 0x58080014, 0x4801a014, - 0x4979a015, 0x4979a016, 0x4979a017, 0x4979a018, - 0x42000800, 0x00000013, 0x42001000, 0x0000dc00, - 0x0401f0f6, 0x0401fce1, 0x5930001d, 0x800001c0, - 0x04000008, 0x4a01a006, 0x01000000, 0x4a01a407, - 0x00000003, 0x42000800, 0x00000002, 0x0401f028, - 0x4a01a006, 0x02000000, 0x41780800, 0x836c0580, - 0x00000004, 0x04020003, 0x84040d42, 0x0401f00d, - 0x0201f800, 0x00104fc6, 0x04020003, 0x84040d4a, - 0x0401f002, 0x84040d48, 0x59a8021b, 0x8c000506, - 0x04020003, 0x8c00050a, 0x04000002, 0x84040d46, - 0x4805a207, 0x59c40085, 0x48031004, 0x4c580000, - 0x4c500000, 0x4c540000, 0x4200b000, 0x00000006, - 0x8388a400, 0x00000000, 0x82d0ac00, 0x00000008, - 0x0201f800, 0x0010bd5b, 0x5c00a800, 0x5c00a000, - 0x5c00b000, 0x42000800, 0x00000008, 0x42001000, - 0x0000dc00, 0x0401f0c1, 0x0401fc9e, 0x4a01a006, - 0x56000000, 0x59340006, 0x4801a007, 0x59340007, - 0x4801a008, 0x42000800, 0x00000003, 0x42001000, - 0x0000dc00, 0x0401f0b5, 0x4803c856, 0x0401fc9f, - 0x5930081d, 0x800409c0, 0x0400000e, 0x82040580, - 0x0000ffff, 0x04000004, 0x82040480, 0x00000007, - 0x04021008, 0x4a01a006, 0x01000000, 0x4a01a407, - 0x00000003, 0x42000800, 0x00000002, 0x0401f013, - 0x4a01a006, 0x0200001c, 0x4a01a007, 0x00000001, - 0x42001000, 0x0010c84b, 0x50080000, 0x9c0001c0, - 0x4801a009, 0x5932481c, 0x59240005, 0x4801a00a, - 0x59240001, 0x59240802, 0x4801a00b, 0x4805a00c, - 0x42000800, 0x00000007, 0x42001000, 0x0000dc00, - 0x0401f08e, 0x4d2c0000, 0x0401fc6a, 0x59325809, - 0x812e59c0, 0x04020003, 0x4979a001, 0x0401f005, - 0x592c0009, 0x82000500, 0x00ffffff, 0x4801a001, - 0x4a01a006, 0x51000000, 0x5c025800, 0x0201f000, - 0x001075ac, 0x4803c856, 0x59325809, 0x5932680a, - 0x59300407, 0x4803c857, 0x82000d80, 0x00000009, - 0x0400000a, 0x82000d80, 0x0000000a, 0x04000032, - 0x82000d80, 0x00000012, 0x02000000, 0x0010b89c, - 0x0201f800, 0x0010032e, 0x59300016, 0x8c00051e, - 0x04020020, 0x42005000, 0x04000000, 0x42006000, - 0x05000000, 0x592c040b, 0x82000500, 0x00000030, - 0x800000e0, 0x80306540, 0x5934000a, 0x8c000508, - 0x04000002, 0x84306546, 0x41786800, 0x41787800, - 0x0401f831, 0x59300c17, 0x80040000, 0x48026417, - 0x40040000, 0x800000d0, 0x82000540, 0x00000020, - 0x4801a403, 0x83180d40, 0x00000038, 0x42001000, - 0x0000c920, 0x0401f86c, 0x0201f000, 0x001063fd, + 0x5c023800, 0x0401f2b7, 0x4803c856, 0x0201f800, + 0x00106e41, 0x598c000f, 0x81300580, 0x02020800, + 0x0010032e, 0x0201f800, 0x00106d91, 0x59300403, + 0x82000580, 0x00000057, 0x02000800, 0x001086a8, + 0x0201f800, 0x00020b9d, 0x5c023800, 0x0201f000, + 0x00106e2e, 0x4803c856, 0x4d2c0000, 0x4d1c0000, + 0x59323827, 0x811e39c0, 0x02000800, 0x0010032e, + 0x831c0580, 0xffffffff, 0x0400003d, 0x591c0c07, + 0x82040580, 0x00000006, 0x0400000d, 0x82040580, + 0x00000003, 0x0400003b, 0x4a026403, 0x00000037, + 0x4a02641b, 0x00000003, 0x4a02621b, 0x00001700, + 0x5c023800, 0x5c025800, 0x0401f06d, 0x0401f850, + 0x42001000, 0x40000000, 0x591c0203, 0x591c0804, + 0x8c040d3e, 0x04020023, 0x82000c80, 0x0000000e, + 0x0c001003, 0x0201f800, 0x0010032e, 0x00107af8, + 0x00107b04, 0x00107afa, 0x00107b04, 0x00107b00, + 0x00107af8, 0x00107af8, 0x00107b04, 0x00107b04, + 0x00107af8, 0x00107af8, 0x00107af8, 0x00107af8, + 0x00107af8, 0x00107b04, 0x00107af8, 0x00107b04, + 0x0201f800, 0x0010032e, 0x591c0415, 0x4803c857, + 0x8c000518, 0x04000003, 0x8c000512, 0x04000003, + 0x80001580, 0x0401f003, 0x42001000, 0x20000000, + 0x591c0016, 0x4801a00a, 0x0401f01d, 0x0401f824, + 0x42001000, 0x40000000, 0x41780000, 0x0401f7fa, + 0x0401f81f, 0x591e5809, 0x812e59c0, 0x02000800, + 0x0010032e, 0x592c1010, 0x591c0012, 0x80080480, + 0x4801a00a, 0x591c0203, 0x591c0804, 0x8c040d3e, + 0x04020007, 0x82000d80, 0x00000002, 0x04000007, + 0x82000d80, 0x00000004, 0x04000004, 0x42001000, + 0x40000000, 0x0401f002, 0x80001580, 0x4809a00b, + 0x42000800, 0x00000006, 0x42001000, 0x0000dc00, + 0x5c023800, 0x5c025800, 0x0401f23a, 0x4803c856, + 0x0401fe24, 0x4a01a006, 0x02000000, 0x59300c1a, + 0x4805a407, 0x59300a1a, 0x4805a207, 0x5932481c, + 0x59241005, 0x5930080a, 0x58041802, 0x820c1d00, + 0x00ffffff, 0x59300827, 0x82040580, 0xffffffff, + 0x04000008, 0x58040407, 0x82000580, 0x00000003, + 0x04020004, 0x4809a008, 0x480da009, 0x0401f003, + 0x480da008, 0x4809a009, 0x1c01f000, 0x4803c856, + 0x0401fe08, 0x0401f003, 0x4803c856, 0x0401fdfe, + 0x4a01a006, 0x01000000, 0x5930041b, 0x4801a407, + 0x5930021b, 0x4801a207, 0x42000800, 0x00000002, + 0x42001000, 0x0000dc00, 0x0401f20e, 0x4803c856, + 0x4d1c0000, 0x0401fde2, 0x4a01a006, 0x14000000, + 0x59323827, 0x591c001a, 0x4801a005, 0x5930041a, + 0x4801a407, 0x5930021a, 0x4801a207, 0x59300016, + 0x4801a008, 0x59300217, 0x82000500, 0x000000ff, + 0x840001c0, 0x4801a409, 0x42000800, 0x00000004, + 0x42001000, 0x0000dc00, 0x5c023800, 0x0401f1f5, + 0x4803c856, 0x0401fddf, 0x4a01a006, 0x02000001, + 0x42001000, 0xe0000000, 0x59a80878, 0x8c040d3e, + 0x04000004, 0x42001000, 0x20000000, 0x0401f010, + 0x59a80070, 0x8c000508, 0x04000004, 0x82081500, + 0xdfffffff, 0x0401f00a, 0x59a80847, 0x82040d80, + 0x01391077, 0x04020006, 0x59e00813, 0x8c040d00, + 0x04000003, 0x82081500, 0xdfffffff, 0x59c40801, + 0x82040d00, 0x00018000, 0x82040580, 0x00000000, + 0x42000000, 0x00008000, 0x0400000d, 0x82040580, + 0x00008000, 0x42000000, 0x00004000, 0x04000008, + 0x82040580, 0x00010000, 0x42000000, 0x00002000, + 0x04000003, 0x42000000, 0x00000002, 0x80080540, + 0x4801a007, 0x42000800, 0x00000002, 0x42001000, + 0x0000dc00, 0x0401f1bf, 0x4803c856, 0x0401f80b, + 0x5930041b, 0x900001c0, 0x4801a005, 0x0401f9f6, + 0x41780800, 0x42001000, 0x00005c00, 0x0401f9b5, + 0x0201f000, 0x001065fd, 0x4803c856, 0x59300818, + 0x82041c00, 0x00000006, 0x46034800, 0x00000021, + 0x58040405, 0x82000500, 0x0000f000, 0x82000580, + 0x00003000, 0x04000003, 0x46034800, 0x00000041, + 0x81a5a000, 0x580c0001, 0x82000d00, 0x00ffffff, + 0x82040d40, 0xc2000000, 0x4805a000, 0x580c0800, + 0x82041500, 0x00ffffff, 0x82000500, 0xff000000, + 0x80080540, 0x4801a001, 0x580c0002, 0x82000580, + 0x00c00000, 0x82000500, 0x00fd0300, 0x4801a002, + 0x580c0003, 0x4801a003, 0x580c0404, 0x4801a404, + 0x580c0204, 0x4801a204, 0x1c01f000, 0x4803c856, + 0x59a8021b, 0x82000500, 0x00000028, 0x04020009, 0x59a8021b, 0x82000500, 0x00000028, 0x04000003, - 0x497a6a12, 0x0401f7dc, 0x4a026a12, 0x0000ff00, - 0x0401f7d9, 0x42005000, 0x02000000, 0x42006000, - 0x20290000, 0x41786800, 0x41787800, 0x0401f812, - 0x83180d40, 0x00000038, 0x42001000, 0x0000c9a0, - 0x0401f855, 0x42000800, 0x00000004, 0x59300012, - 0x82000500, 0xfff00000, 0x80000540, 0x02000000, - 0x001063ff, 0x42000800, 0x0000000e, 0x0201f000, - 0x001063ff, 0x4201a000, 0x00000000, 0x0401f003, - 0x4201a000, 0x00000011, 0x59340a12, 0x82040d00, - 0x0000ff00, 0x5932481c, 0x59240408, 0x900001c0, - 0x80040540, 0x80d00540, 0x44034800, 0x81a5a000, - 0x59340002, 0x82000500, 0x00ffffff, 0x59300c03, - 0x82040d80, 0x00000031, 0x04020002, 0x41780000, - 0x80280540, 0x4801a000, 0x59240005, 0x4801a001, - 0x4831a002, 0x82340540, 0x00000000, 0x4801a003, - 0x59300402, 0x4801a404, 0x59300a02, 0x4805a204, - 0x8c30652e, 0x04000003, 0x4805a404, 0x4801a204, - 0x483da005, 0x1c01f000, 0x4807c857, 0x4c040000, - 0x0401f82a, 0x5c000800, 0x40040000, 0x80081540, - 0x800000c4, 0x82000540, 0x00002000, 0x4803910a, - 0x59b400f6, 0x82000500, 0x00000018, 0x040207fd, - 0x42001800, 0x0010c89f, 0x580c0004, 0x4803c857, - 0x580c0006, 0x4803c857, 0x580c1800, 0x480fc857, - 0x4a0368f0, 0x0010c89e, 0x4a0368f1, 0x0010c8a5, - 0x480b68f3, 0x4a0378e4, 0x00008000, 0x0201f000, - 0x001063f8, 0x4807c857, 0x480a2800, 0x4c040000, - 0x0401f80a, 0x5c000800, 0x59b400f6, 0x8c00050a, - 0x040207fe, 0x49a768f2, 0x480768f4, 0x4a0378e4, - 0x00008000, 0x1c01f000, 0x4a0378e4, 0x0000c000, - 0x59bc00e4, 0x8c000520, 0x0400000c, 0x4a0378e4, - 0x00008000, 0x42007000, 0x000003e8, 0x59bc00e4, - 0x8c000520, 0x040007f5, 0x80387040, 0x02000800, - 0x0010032e, 0x0401f7fa, 0x1c01f000, 0x82000500, - 0xffff0000, 0x82000580, 0x01050000, 0x0402000d, - 0x599c0818, 0x8c040d10, 0x0400000a, 0x59a80806, - 0x8c040d0a, 0x04000007, 0x42001000, 0x0000804f, - 0x41781800, 0x41782000, 0x0201f800, 0x001038bc, - 0x1c01f000, 0x1c01f000, 0x59a80052, 0x800001c0, - 0x04000053, 0x4d2c0000, 0x4d300000, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x40025800, 0x4000c000, - 0x4000c800, 0x42026000, 0x001111e0, 0x592c0407, - 0x81440580, 0x0402003b, 0x83240580, 0xffffffff, - 0x04000004, 0x592c0002, 0x81240580, 0x04020035, - 0x592c0205, 0x82000580, 0x00000055, 0x04000005, - 0x8d3e7d18, 0x0400002f, 0x8d3e7d16, 0x0402002d, - 0x40640000, 0x812c0580, 0x0402001b, 0x59300203, - 0x82000580, 0x00000000, 0x04000013, 0x59300009, - 0x800001c0, 0x04000010, 0x0201f800, 0x00106c3c, - 0x4df00000, 0x0201f800, 0x00106b26, 0x0201f800, - 0x0010fe38, 0x80c40040, 0x04020003, 0x4a026203, - 0x00000000, 0x5c03e000, 0x02000800, 0x00106c29, - 0x497a6009, 0x592cc800, 0x4064c000, 0x4064b800, - 0x0401f003, 0x592cb800, 0x485cc000, 0x497a5800, - 0x592c0205, 0x82000580, 0x00000155, 0x04000004, - 0x0201f800, 0x00100594, 0x0401f004, 0x49425a07, - 0x0201f800, 0x000203ef, 0x405e5800, 0x0401f003, - 0x412cc000, 0x592e5800, 0x812e59c0, 0x040207c0, - 0x48675052, 0x48635053, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x5c026000, 0x5c025800, 0x1c01f000, - 0x4943c857, 0x4d440000, 0x4d340000, 0x4c580000, - 0x4d240000, 0x42024800, 0xffffffff, 0x4200b000, - 0x000007f0, 0x417a8800, 0x0201f800, 0x0002034c, - 0x04020002, 0x0401ff9d, 0x81468800, 0x8058b040, - 0x040207fa, 0x83440480, 0x00000800, 0x04021008, - 0x8d3e7d02, 0x04000006, 0x42028800, 0x000007f0, - 0x4200b000, 0x00000010, 0x0401f7f0, 0x5c024800, - 0x5c00b000, 0x5c026800, 0x5c028800, 0x1c01f000, - 0x4d300000, 0x59a81052, 0x800811c0, 0x0400001e, - 0x42026000, 0x001111e0, 0x59300203, 0x82000580, - 0x00000000, 0x04020018, 0x58080803, 0x58080002, - 0x4802601c, 0x4806600a, 0x480a6009, 0x4a026407, - 0x00000005, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000092, 0x41780800, 0x58080205, 0x82000580, - 0x00000055, 0x04000003, 0x42000800, 0x00000001, - 0x48066429, 0x42000800, 0x80000040, 0x0201f800, - 0x00020b3e, 0x5c026000, 0x1c01f000, 0x4d900000, - 0x4dd00000, 0x4da40000, 0x4d140000, 0x4d180000, - 0x4803c856, 0x417a3000, 0x0201f800, 0x001072f1, - 0x59900804, 0x800409c0, 0x04000015, 0x83947c00, - 0x00000009, 0x83180400, 0x00106270, 0x50000000, - 0x803c7c00, 0x583c0003, 0x811808ca, 0x82040c00, - 0x00006139, 0x50040800, 0x80040580, 0x04000008, - 0x42000000, 0x0010cc87, 0x0201f800, 0x0010bc88, - 0x82000540, 0x00000001, 0x0401f005, 0x811a3000, - 0x83180580, 0x00000005, 0x040207e4, 0x5c023000, - 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x497a6a12, 0x0401f003, 0x4a026a12, 0x0000ff00, + 0x42005000, 0x22000000, 0x42006000, 0x01380000, + 0x41786800, 0x41787800, 0x0401f950, 0x59301009, + 0x4a01a006, 0x54000000, 0x5932481c, 0x59240005, + 0x82000500, 0x00ffffff, 0x58080c0b, 0x800408f0, + 0x80040540, 0x4801a007, 0x5808000b, 0x82000500, + 0xff000000, 0x4801a008, 0x59a80002, 0x4801a009, + 0x59a80003, 0x4801a00a, 0x59a80000, 0x4801a00b, + 0x59a80001, 0x4801a00c, 0x5808000d, 0x9c0001c0, + 0x4801a00d, 0x5808000e, 0x9c0001c0, 0x4801a00e, + 0x5808000f, 0x9c0001c0, 0x4801a00f, 0x58080010, + 0x9c0001c0, 0x4801a010, 0x58080011, 0x9c0001c0, + 0x4801a011, 0x58080012, 0x9c0001c0, 0x4801a012, + 0x58080013, 0x9c0001c0, 0x4801a013, 0x58080014, + 0x9c0001c0, 0x4801a014, 0x58080011, 0x9c0001c0, + 0x4801a015, 0x58080012, 0x9c0001c0, 0x4801a016, + 0x58080013, 0x9c0001c0, 0x4801a017, 0x58080014, + 0x9c0001c0, 0x4801a018, 0x42000800, 0x00000013, + 0x42001000, 0x0000dc00, 0x0401f136, 0x4803c856, + 0x42005000, 0x22000000, 0x42006000, 0x01290000, + 0x41786800, 0x41787800, 0x0401f908, 0x59301009, + 0x4a01a006, 0x55000000, 0x5808000c, 0x82000500, + 0x00ffffff, 0x58080c0b, 0x800408f0, 0x80040540, + 0x4801a007, 0x5808080b, 0x82040d00, 0xff000000, + 0x5932481c, 0x59240005, 0x82000500, 0x00ffffff, + 0x80040540, 0x4801a008, 0x5808000d, 0x9c0001c0, + 0x4801a009, 0x5808000e, 0x9c0001c0, 0x4801a00a, + 0x5808000f, 0x9c0001c0, 0x4801a00b, 0x58080010, + 0x9c0001c0, 0x4801a00c, 0x59a80002, 0x4801a00d, + 0x59a80003, 0x4801a00e, 0x59a80000, 0x4801a00f, + 0x59a80001, 0x4801a010, 0x58080011, 0x4801a011, + 0x58080012, 0x4801a012, 0x58080013, 0x4801a013, + 0x58080014, 0x4801a014, 0x4979a015, 0x4979a016, + 0x4979a017, 0x4979a018, 0x42000800, 0x00000013, + 0x42001000, 0x0000dc00, 0x0401f0f6, 0x0401fce1, + 0x5930001d, 0x800001c0, 0x04000008, 0x4a01a006, + 0x01000000, 0x4a01a407, 0x00000003, 0x42000800, + 0x00000002, 0x0401f028, 0x4a01a006, 0x02000000, + 0x41780800, 0x836c0580, 0x00000004, 0x04020003, + 0x84040d42, 0x0401f00d, 0x0201f800, 0x001050f7, + 0x04020003, 0x84040d4a, 0x0401f002, 0x84040d48, + 0x59a8021b, 0x8c000506, 0x04020003, 0x8c00050a, + 0x04000002, 0x84040d46, 0x4805a207, 0x59c40085, + 0x48031004, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4200b000, 0x00000006, 0x8388a400, 0x00000000, + 0x82d0ac00, 0x00000008, 0x0201f800, 0x0010c086, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x42000800, + 0x00000008, 0x42001000, 0x0000dc00, 0x0401f0c1, + 0x0401fc9e, 0x4a01a006, 0x56000000, 0x59340006, + 0x4801a007, 0x59340007, 0x4801a008, 0x42000800, + 0x00000003, 0x42001000, 0x0000dc00, 0x0401f0b5, + 0x4803c856, 0x0401fc9f, 0x5930081d, 0x800409c0, + 0x0400000e, 0x82040580, 0x0000ffff, 0x04000004, + 0x82040480, 0x00000007, 0x04021008, 0x4a01a006, + 0x01000000, 0x4a01a407, 0x00000003, 0x42000800, + 0x00000002, 0x0401f013, 0x4a01a006, 0x0200001c, + 0x4a01a007, 0x00000001, 0x42001000, 0x0010cb4b, + 0x50080000, 0x9c0001c0, 0x4801a009, 0x5932481c, + 0x59240005, 0x4801a00a, 0x59240001, 0x59240802, + 0x4801a00b, 0x4805a00c, 0x42000800, 0x00000007, + 0x42001000, 0x0000dc00, 0x0401f08e, 0x4d2c0000, + 0x0401fc6a, 0x59325809, 0x812e59c0, 0x04020003, + 0x4979a001, 0x0401f005, 0x592c0009, 0x82000500, + 0x00ffffff, 0x4801a001, 0x4a01a006, 0x51000000, + 0x5c025800, 0x0201f000, 0x001077ad, 0x4803c856, + 0x59325809, 0x5932680a, 0x59300407, 0x4803c857, + 0x82000d80, 0x00000009, 0x0400000a, 0x82000d80, + 0x0000000a, 0x04000032, 0x82000d80, 0x00000012, + 0x02000000, 0x0010bbc7, 0x0201f800, 0x0010032e, + 0x59300016, 0x8c00051e, 0x04020020, 0x42005000, + 0x04000000, 0x42006000, 0x05000000, 0x592c040b, + 0x82000500, 0x00000030, 0x800000e0, 0x80306540, + 0x5934000a, 0x8c000508, 0x04000002, 0x84306546, + 0x41786800, 0x41787800, 0x0401f831, 0x59300c17, + 0x80040000, 0x48026417, 0x40040000, 0x800000d0, + 0x82000540, 0x00000020, 0x4801a403, 0x83180d40, + 0x00000038, 0x42001000, 0x0000c920, 0x0401f86c, + 0x0201f000, 0x00106602, 0x59a8021b, 0x82000500, + 0x00000028, 0x04000003, 0x497a6a12, 0x0401f7dc, + 0x4a026a12, 0x0000ff00, 0x0401f7d9, 0x42005000, + 0x02000000, 0x42006000, 0x20290000, 0x41786800, + 0x41787800, 0x0401f812, 0x83180d40, 0x00000038, + 0x42001000, 0x0000c9a0, 0x0401f855, 0x42000800, + 0x00000004, 0x59300012, 0x82000500, 0xfff00000, + 0x80000540, 0x02000000, 0x00106604, 0x42000800, + 0x0000000e, 0x0201f000, 0x00106604, 0x4201a000, + 0x00000000, 0x0401f003, 0x4201a000, 0x00000011, + 0x59340a12, 0x82040d00, 0x0000ff00, 0x5932481c, + 0x59240408, 0x900001c0, 0x80040540, 0x80d00540, + 0x44034800, 0x81a5a000, 0x59340002, 0x82000500, + 0x00ffffff, 0x59300c03, 0x82040d80, 0x00000031, + 0x04020002, 0x41780000, 0x80280540, 0x4801a000, + 0x59240005, 0x4801a001, 0x4831a002, 0x82340540, + 0x00000000, 0x4801a003, 0x59300402, 0x4801a404, + 0x59300a02, 0x4805a204, 0x8c30652e, 0x04000003, + 0x4805a404, 0x4801a204, 0x483da005, 0x1c01f000, + 0x4807c857, 0x4c040000, 0x0401f82a, 0x5c000800, + 0x40040000, 0x80081540, 0x800000c4, 0x82000540, + 0x00002000, 0x4803910a, 0x59b400f6, 0x82000500, + 0x00000018, 0x040207fd, 0x42001800, 0x0010cb9f, + 0x580c0004, 0x4803c857, 0x580c0006, 0x4803c857, + 0x580c1800, 0x480fc857, 0x4a0368f0, 0x0010cb9e, + 0x4a0368f1, 0x0010cba5, 0x480b68f3, 0x4a0378e4, + 0x00008000, 0x0201f000, 0x001065fd, 0x4807c857, + 0x480a2800, 0x4c040000, 0x0401f80a, 0x5c000800, + 0x59b400f6, 0x8c00050a, 0x040207fe, 0x49a768f2, + 0x480768f4, 0x4a0378e4, 0x00008000, 0x1c01f000, + 0x4a0378e4, 0x0000c000, 0x59bc00e4, 0x8c000520, + 0x0400000c, 0x4a0378e4, 0x00008000, 0x42007000, + 0x000003e8, 0x59bc00e4, 0x8c000520, 0x040007f5, + 0x80387040, 0x02000800, 0x0010032e, 0x0401f7fa, + 0x1c01f000, 0x82000500, 0xffff0000, 0x82000580, + 0x01050000, 0x0402000d, 0x599c0818, 0x8c040d10, + 0x0400000a, 0x59a80806, 0x8c040d0a, 0x04000007, + 0x42001000, 0x0000804f, 0x41781800, 0x41782000, + 0x0201f800, 0x001039ac, 0x1c01f000, 0x1c01f000, + 0x59a80052, 0x800001c0, 0x04000053, 0x4d2c0000, + 0x4d300000, 0x4c5c0000, 0x4c600000, 0x4c640000, + 0x40025800, 0x4000c000, 0x4000c800, 0x42026000, + 0x00111500, 0x592c0407, 0x81440580, 0x0402003b, + 0x83240580, 0xffffffff, 0x04000004, 0x592c0002, + 0x81240580, 0x04020035, 0x592c0205, 0x82000580, + 0x00000055, 0x04000005, 0x8d3e7d18, 0x0400002f, + 0x8d3e7d16, 0x0402002d, 0x40640000, 0x812c0580, + 0x0402001b, 0x59300203, 0x82000580, 0x00000000, + 0x04000013, 0x59300009, 0x800001c0, 0x04000010, + 0x0201f800, 0x00106e41, 0x4df00000, 0x0201f800, + 0x00106d2b, 0x0201f800, 0x00110148, 0x80c40040, + 0x04020003, 0x4a026203, 0x00000000, 0x5c03e000, + 0x02000800, 0x00106e2e, 0x497a6009, 0x592cc800, + 0x4064c000, 0x4064b800, 0x0401f003, 0x592cb800, + 0x485cc000, 0x497a5800, 0x592c0205, 0x82000580, + 0x00000155, 0x04000004, 0x0201f800, 0x00100594, + 0x0401f004, 0x49425a07, 0x0201f800, 0x000203ef, + 0x405e5800, 0x0401f003, 0x412cc000, 0x592e5800, + 0x812e59c0, 0x040207c0, 0x48675052, 0x48635053, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c026000, + 0x5c025800, 0x1c01f000, 0x4943c857, 0x4d440000, + 0x4d340000, 0x4c580000, 0x4d240000, 0x42024800, + 0xffffffff, 0x4200b000, 0x000007f0, 0x417a8800, + 0x0201f800, 0x0002034c, 0x04020002, 0x0401ff9d, + 0x81468800, 0x8058b040, 0x040207fa, 0x83440480, + 0x00000800, 0x04021008, 0x8d3e7d02, 0x04000006, + 0x42028800, 0x000007f0, 0x4200b000, 0x00000010, + 0x0401f7f0, 0x5c024800, 0x5c00b000, 0x5c026800, + 0x5c028800, 0x1c01f000, 0x4d300000, 0x59a81052, + 0x800811c0, 0x0400001e, 0x42026000, 0x00111500, + 0x59300203, 0x82000580, 0x00000000, 0x04020018, + 0x58080803, 0x58080002, 0x4802601c, 0x4806600a, + 0x480a6009, 0x4a026407, 0x00000005, 0x4a026203, + 0x00000001, 0x4a026403, 0x00000092, 0x41780800, + 0x58080205, 0x82000580, 0x00000055, 0x04000003, + 0x42000800, 0x00000001, 0x48066429, 0x42000800, + 0x80000040, 0x0201f800, 0x00020b3e, 0x5c026000, 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x4d180000, 0x4803c856, 0x598c080f, - 0x800409c0, 0x04000003, 0x0201f800, 0x001063f8, - 0x417a3000, 0x0201f800, 0x001072f1, 0x59900804, - 0x800409c0, 0x04000012, 0x83947c00, 0x00000009, - 0x83180400, 0x00106270, 0x50000000, 0x803c7c00, + 0x4d140000, 0x4d180000, 0x4803c856, 0x417a3000, + 0x0201f800, 0x001074f6, 0x59900804, 0x800409c0, + 0x04000015, 0x83947c00, 0x00000009, 0x83180400, + 0x00106475, 0x50000000, 0x803c7c00, 0x583c0003, 0x811808ca, 0x82040c00, 0x00006139, 0x50040800, - 0x48047803, 0x4a007801, 0x000001f4, 0x4a007800, - 0x0000000a, 0x4a007802, 0x00000004, 0x811a3000, - 0x83180580, 0x00000005, 0x040207e7, 0x5c023000, - 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x1c01f000, 0x41781000, 0x42026000, 0x00111264, - 0x59a8180d, 0x480a6402, 0x4a026202, 0x0000ffff, - 0x80081000, 0x800c1840, 0x04000004, 0x83326400, - 0x0000002c, 0x0401f7f8, 0x1c01f000, 0x0201f800, - 0x00020b9d, 0x1c01f000, 0x5c036000, 0x4db00000, - 0x49b3c857, 0x4933c857, 0x813261c0, 0x04000037, - 0x59300203, 0x82000580, 0x00000000, 0x04000033, - 0x59300004, 0x8c00053e, 0x02020800, 0x0010032e, - 0x59300407, 0x4803c857, 0x82000d80, 0x00000004, - 0x04000011, 0x82000d80, 0x00000001, 0x0400000e, - 0x82000d80, 0x00000003, 0x04000006, 0x82000d80, - 0x00000006, 0x04020015, 0x0201f800, 0x0010b0e3, - 0x5930001d, 0x800001c0, 0x02020800, 0x00109fda, - 0x0401f00e, 0x59300827, 0x4807c857, 0x4d300000, - 0x40066000, 0x0201f800, 0x0010a09b, 0x5c026000, - 0x04020006, 0x5804001d, 0x4803c857, 0x81300580, - 0x04020002, 0x4978081d, 0x4a026407, 0x00000007, - 0x497a6009, 0x4a026004, 0x00004000, 0x59a8002a, - 0x82000c80, 0x00000051, 0x04001002, 0x80000102, - 0x48026006, 0x497a6205, 0x1c01f000, 0x0401f803, - 0x41318800, 0x1c01f000, 0x83640480, 0x00000010, - 0x04021008, 0x42000000, 0x0010cc16, 0x0201f800, - 0x0010bc88, 0x4967c857, 0x80026580, 0x1c01f000, - 0x8166c9c0, 0x0400001c, 0x41626000, 0x41580000, - 0x59300a03, 0x82040d80, 0x00000000, 0x04000008, - 0x83326400, 0x0000002c, 0x81300c80, 0x040017f9, - 0x42026000, 0x00111264, 0x0401f7f6, 0x4933c857, - 0x8166c840, 0x83300c00, 0x0000002c, 0x80040480, - 0x04021006, 0x4006c000, 0x4a026203, 0x00000008, - 0x813261c0, 0x1c01f000, 0x4202c000, 0x00111264, - 0x0401f7fa, 0x42000000, 0x0010cc16, 0x0201f800, - 0x0010bc88, 0x4933c856, 0x417a6000, 0x0401f7f5, - 0x0201f800, 0x00020bc1, 0x1c01f000, 0x4933c857, - 0x83380580, 0x00000013, 0x0402000b, 0x59300004, - 0x8c00053e, 0x04000007, 0x0201f800, 0x00106c3c, - 0x0201f800, 0x00106b8c, 0x0201f800, 0x00106c29, - 0x1c01f000, 0x4933c857, 0x598800b7, 0x80000000, - 0x480310b7, 0x1c01f000, 0x4933c857, 0x59300203, - 0x82003480, 0x0000000e, 0x02021800, 0x0010032e, - 0x4d2c0000, 0x0c01f803, 0x5c025800, 0x1c01f000, - 0x00107d5a, 0x0010835f, 0x001084d4, 0x00107d5a, - 0x00108542, 0x00107ee7, 0x00107d5a, 0x00107d5a, - 0x001082eb, 0x00107d5a, 0x00107d5a, 0x00107d5a, - 0x00107d5a, 0x00107d5a, 0x0201f800, 0x0010032e, + 0x80040580, 0x04000008, 0x42000000, 0x0010cf87, + 0x0201f800, 0x0010bfb3, 0x82000540, 0x00000001, + 0x0401f005, 0x811a3000, 0x83180580, 0x00000005, + 0x040207e4, 0x5c023000, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x1c01f000, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x4d180000, + 0x4803c856, 0x598c080f, 0x800409c0, 0x04000003, + 0x0201f800, 0x001065fd, 0x417a3000, 0x0201f800, + 0x001074f6, 0x59900804, 0x800409c0, 0x04000012, + 0x83947c00, 0x00000009, 0x83180400, 0x00106475, + 0x50000000, 0x803c7c00, 0x811808ca, 0x82040c00, + 0x00006139, 0x50040800, 0x48047803, 0x4a007801, + 0x000001f4, 0x4a007800, 0x0000000a, 0x4a007802, + 0x00000004, 0x811a3000, 0x83180580, 0x00000005, + 0x040207e7, 0x5c023000, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x1c01f000, 0x41781000, + 0x42026000, 0x00111584, 0x59a8180d, 0x480a6402, + 0x4a026202, 0x0000ffff, 0x80081000, 0x800c1840, + 0x04000004, 0x83326400, 0x0000002c, 0x0401f7f8, + 0x1c01f000, 0x0201f800, 0x00020b9d, 0x1c01f000, + 0x5c036000, 0x4db00000, 0x49b3c857, 0x4933c857, + 0x813261c0, 0x0400003b, 0x59300203, 0x82000580, + 0x00000000, 0x04000037, 0x59300004, 0x8c00053e, + 0x02020800, 0x0010032e, 0x59300407, 0x4803c857, + 0x82000d80, 0x00000004, 0x04000011, 0x82000d80, + 0x00000001, 0x0400000e, 0x82000d80, 0x00000003, + 0x04000006, 0x82000d80, 0x00000006, 0x04020019, + 0x0201f800, 0x0010b3fa, 0x5930001d, 0x800001c0, + 0x02020800, 0x0010a218, 0x0401f012, 0x5930000a, + 0x82000580, 0x0010e23c, 0x0400000e, 0x59300827, + 0x4807c857, 0x4d300000, 0x40066000, 0x0201f800, + 0x0010a2d8, 0x5c026000, 0x04020006, 0x5804001d, + 0x4803c857, 0x81300580, 0x04020002, 0x4978081d, + 0x4a026407, 0x00000007, 0x497a6009, 0x4a026004, + 0x00004000, 0x59a8002a, 0x82000c80, 0x00000051, + 0x04001002, 0x80000102, 0x48026006, 0x497a6205, + 0x1c01f000, 0x0401f803, 0x41318800, 0x1c01f000, + 0x83640480, 0x00000010, 0x04021008, 0x42000000, + 0x0010cf16, 0x0201f800, 0x0010bfb3, 0x4967c857, + 0x80026580, 0x1c01f000, 0x8166c9c0, 0x0400001c, + 0x41626000, 0x41580000, 0x59300a03, 0x82040d80, + 0x00000000, 0x04000008, 0x83326400, 0x0000002c, + 0x81300c80, 0x040017f9, 0x42026000, 0x00111584, + 0x0401f7f6, 0x4933c857, 0x8166c840, 0x83300c00, + 0x0000002c, 0x80040480, 0x04021006, 0x4006c000, + 0x4a026203, 0x00000008, 0x813261c0, 0x1c01f000, + 0x4202c000, 0x00111584, 0x0401f7fa, 0x42000000, + 0x0010cf16, 0x0201f800, 0x0010bfb3, 0x4933c856, + 0x417a6000, 0x0401f7f5, 0x0201f800, 0x00020bc1, + 0x1c01f000, 0x4933c857, 0x83380580, 0x00000013, + 0x0402000b, 0x59300004, 0x8c00053e, 0x04000007, + 0x0201f800, 0x00106e41, 0x0201f800, 0x00106d91, + 0x0201f800, 0x00106e2e, 0x1c01f000, 0x4933c857, + 0x598800b7, 0x80000000, 0x480310b7, 0x1c01f000, 0x4933c857, 0x59300203, 0x82003480, 0x0000000e, - 0x02021800, 0x0010032e, 0x0c01f001, 0x00107d71, - 0x00109013, 0x00107d71, 0x00107d71, 0x00107d71, - 0x00107d71, 0x00107d71, 0x00107d71, 0x00108faf, - 0x0010902f, 0x001090a5, 0x0010902f, 0x001090a5, - 0x00107d71, 0x0201f800, 0x0010032e, 0x0201f800, - 0x0010032e, 0x4933c857, 0x4d2c0000, 0x59325809, - 0x59300203, 0x82003480, 0x0000000e, 0x02021800, - 0x0010032e, 0x0c01f803, 0x5c025800, 0x1c01f000, - 0x00107d8e, 0x00107d8e, 0x00107d8e, 0x00107daa, - 0x00107df6, 0x00107d8e, 0x00107d8e, 0x00107d8e, - 0x00107d90, 0x00107d8e, 0x00107d8e, 0x00107d8e, - 0x00107d8e, 0x00107d8e, 0x0201f800, 0x0010032e, - 0x4933c857, 0x83380580, 0x00000040, 0x02020800, - 0x0010032e, 0x4a026008, 0x00082000, 0x4a026203, - 0x00000003, 0x493a6403, 0x4a025c09, 0x00000001, - 0x592c000e, 0x48026012, 0x497a6014, 0x592c0209, - 0x800000c2, 0x800010c4, 0x80081400, 0x480a6006, - 0x0201f800, 0x00020168, 0x42000800, 0x80000060, - 0x0201f000, 0x00020b30, 0x4933c857, 0x83380480, - 0x00000050, 0x02021800, 0x0010032e, 0x83380480, - 0x00000049, 0x02001800, 0x0010032e, 0x0c01f001, - 0x00107dbd, 0x00107dc8, 0x00107dbb, 0x00107dbb, - 0x00107dbb, 0x00107dbb, 0x00107dd3, 0x0201f800, - 0x0010032e, 0x4a026203, 0x00000004, 0x4a025c09, - 0x00000002, 0x592c0208, 0x48025c0a, 0x592c020a, - 0x48025a08, 0x592c000d, 0x4802580e, 0x1c01f000, - 0x0201f800, 0x00106b6c, 0x0201f800, 0x00109667, - 0x04000005, 0x4a025a07, 0x00000006, 0x0201f800, - 0x000203ef, 0x0201f000, 0x00020b9d, 0x0201f800, - 0x00106b6c, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010fc72, 0x5c027800, 0x42003000, 0x00000014, - 0x41782800, 0x42002000, 0x00000002, 0x4d400000, - 0x4d440000, 0x59368c03, 0x42028000, 0x00000029, - 0x0201f800, 0x00109fec, 0x5c028800, 0x5c028000, - 0x42000000, 0x0010cc23, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x00109667, 0x02000000, 0x00020b9d, - 0x4a025a07, 0x00000029, 0x0201f800, 0x000203ef, - 0x0201f000, 0x00020b9d, 0x4933c857, 0x83380580, - 0x00000048, 0x04000005, 0x83380580, 0x00000053, - 0x02020800, 0x0010032e, 0x592c0207, 0x82000580, - 0x00000007, 0x04000009, 0x59300012, 0x80000540, - 0x04000006, 0x592c080d, 0x80040480, 0x4802580d, - 0x4a025a07, 0x00000015, 0x592c0207, 0x80000540, - 0x04020003, 0x4a025a07, 0x00000000, 0x0201f800, - 0x000203ef, 0x0201f000, 0x00020b9d, 0x4933c857, - 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, - 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4c100000, - 0x0201f800, 0x00100583, 0x02000800, 0x0010032e, - 0x497a5a07, 0x59a8006f, 0x82000500, 0x0000f000, - 0x48025c08, 0x59a8085a, 0x82040c00, 0x00000018, - 0x48065a08, 0x412cb800, 0x4d2c0000, 0x41cca000, - 0x4200c000, 0x00000001, 0x4200c800, 0x0000002c, - 0x82040480, 0x0000002d, 0x04021006, 0x832cac00, - 0x0000000a, 0x0201f800, 0x0010917d, 0x0401f030, - 0x40043000, 0x42000800, 0x0000002c, 0x832cac00, - 0x0000000a, 0x0201f800, 0x0010917d, 0x82183480, - 0x0000002c, 0x4c180000, 0x0201f800, 0x00100583, - 0x5c003000, 0x0400001a, 0x8060c000, 0x4a025805, - 0x00000110, 0x492cb801, 0x82180c80, 0x0000003d, - 0x04021007, 0x40180800, 0x832cac00, 0x00000006, - 0x0201f800, 0x0010917d, 0x0401f015, 0x8264cc00, - 0x0000003c, 0x82183480, 0x0000003c, 0x42000800, - 0x0000003c, 0x412cb800, 0x832cac00, 0x00000006, - 0x0201f800, 0x0010917d, 0x0401f7e3, 0x5c025800, - 0x592c0207, 0x8400055e, 0x48025a07, 0x592c0408, - 0x80640540, 0x48025c08, 0x0401f002, 0x5c025800, - 0x5c002000, 0x813669c0, 0x04000003, 0x59343403, - 0x0401f003, 0x42003000, 0x0000ffff, 0x49325809, - 0x481a5c07, 0x82100580, 0x00000054, 0x0402001a, - 0x4a025809, 0xffffffff, 0x491e5814, 0x41781000, - 0x831c0580, 0xffffffff, 0x0400000e, 0x591c0009, - 0x80000d40, 0x0400000b, 0x58040205, 0x82000500, - 0x000000ff, 0x82000580, 0x00000012, 0x04000004, - 0x82000580, 0x00000060, 0x04020002, 0x58041006, - 0x480a5806, 0x592c0408, 0x81200540, 0x48025c08, - 0x0401f002, 0x49225c06, 0x846001c0, 0x80100540, - 0x48025805, 0x592c0001, 0x497a5801, 0x4c000000, - 0x0201f800, 0x000203ef, 0x5c025800, 0x812e59c0, - 0x040207f9, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x0201f800, 0x0010b349, 0x0401f7f6, - 0x4803c856, 0x4c5c0000, 0x4d2c0000, 0x4c500000, - 0x4c540000, 0x4c580000, 0x412cb800, 0x592c040c, - 0x8c000516, 0x04000003, 0x41cca000, 0x0401f003, - 0x83cca400, 0x00000006, 0x4008b000, 0x41781000, - 0x82580480, 0x0000004c, 0x04001004, 0x4200b000, - 0x0000004c, 0x40001000, 0x4c080000, 0x4d2c0000, - 0x0201f800, 0x00100583, 0x04000026, 0x5c001800, - 0x492c1801, 0x485a5800, 0x8258b400, 0x00000003, - 0x8058b104, 0x832cac00, 0x00000002, 0x0201f800, - 0x0010bd85, 0x585c040c, 0x8c000500, 0x0400000e, - 0x832c1400, 0x00000002, 0x8c000516, 0x04000003, - 0x82081400, 0x00000006, 0x46001000, 0x00000001, - 0x80081000, 0x46001000, 0x00000900, 0x84000500, - 0x4800bc0c, 0x5c001000, 0x800811c0, 0x040207d7, - 0x82000540, 0x00000001, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x5c025800, 0x5c00b800, 0x1c01f000, - 0x5c025800, 0x5c001000, 0x0401f7f8, 0x4933c857, - 0x83380d80, 0x00000015, 0x04020003, 0x0201f000, - 0x00020b9d, 0x83380d80, 0x00000016, 0x02020800, - 0x0010032e, 0x0201f000, 0x00020b9d, 0x4933c857, - 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, - 0x59325809, 0x83cca400, 0x00000006, 0x59cc1806, - 0x820c0580, 0x01000000, 0x04020004, 0x4200b000, - 0x00000002, 0x0401f00f, 0x4200b000, 0x00000008, - 0x832cac00, 0x00000006, 0x0201f800, 0x0010bd5b, - 0x8c0c1d00, 0x0400000b, 0x4200b000, 0x00000008, - 0x592e5801, 0x812e59c0, 0x02000800, 0x0010032e, - 0x832cac00, 0x00000006, 0x0201f800, 0x0010bd5b, - 0x0401f816, 0x5c00b000, 0x5c00a800, 0x5c00a000, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x4c500000, - 0x4c540000, 0x4c580000, 0x83cca400, 0x00000006, - 0x5930a809, 0x8254ac00, 0x00000006, 0x4200b000, - 0x00000007, 0x0201f800, 0x0010bd5b, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x4933c857, 0x0201f800, - 0x00109667, 0x02000000, 0x00020b9d, 0x4d2c0000, - 0x0201f800, 0x00109d13, 0x0402000b, 0x41780800, - 0x4d400000, 0x42028000, 0x00000000, 0x0201f800, - 0x00109af2, 0x5c028000, 0x5c025800, 0x0201f000, - 0x00020b9d, 0x5931d82a, 0x58ef400a, 0x58ee580c, - 0x4a025a05, 0x00000103, 0x58ec0008, 0x0801f800, - 0x5c025800, 0x0201f000, 0x00020b9d, 0x4933c857, - 0x59cc1806, 0x820c0580, 0x02000000, 0x04020027, - 0x4a026802, 0x00fffffd, 0x5934000a, 0x84000504, - 0x4802680a, 0x42000000, 0x00000000, 0x4c0c0000, - 0x0401f82d, 0x5c001800, 0x59300c26, 0x82040580, - 0x00000021, 0x0402000b, 0x0201f800, 0x00101f51, - 0x42001800, 0x0000ffff, 0x42002000, 0x00000004, - 0x42003000, 0x00000012, 0x0201f800, 0x00103931, - 0x59300809, 0x800409c0, 0x02000000, 0x00020b9d, - 0x4a000a05, 0x00000103, 0x480c0806, 0x5931d82a, - 0x58ef400a, 0x58ee580c, 0x58ec0008, 0x0801f800, - 0x0201f000, 0x00020b9d, 0x42000000, 0x0010cc2c, - 0x0201f800, 0x0010bc88, 0x42000000, 0x00000006, - 0x4c0c0000, 0x0401f808, 0x5c001800, 0x040007e9, - 0x4c0c0000, 0x0401f81f, 0x5c001800, 0x040207e5, - 0x1c01f000, 0x4933c857, 0x4d400000, 0x4d240000, - 0x4d200000, 0x5932481c, 0x40028000, 0x59300426, - 0x82000d80, 0x00000051, 0x04000004, 0x82000d80, - 0x00000021, 0x04020009, 0x0201f800, 0x00101f51, - 0x42000000, 0x00000001, 0x0201f800, 0x00104d11, - 0x80000580, 0x0401f003, 0x82000540, 0x00000001, - 0x5c024000, 0x5c024800, 0x5c028000, 0x1c01f000, - 0x4933c857, 0x4d2c0000, 0x59325809, 0x812e59c0, - 0x04020009, 0x497a6006, 0x497a6205, 0x4d380000, - 0x42027000, 0x00000022, 0x0401fbb3, 0x5c027000, - 0x80000580, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, - 0x59325809, 0x592e5801, 0x832cac00, 0x00000006, - 0x83cca400, 0x00000006, 0x59a8086f, 0x82040d00, - 0x000003ff, 0x82041480, 0x0000000f, 0x0400101b, - 0x4200b000, 0x0000000f, 0x0201f800, 0x0010bd5b, - 0x592e5801, 0x832cac00, 0x00000006, 0x82080c80, - 0x0000000f, 0x0400100d, 0x4200b000, 0x0000000f, - 0x0201f800, 0x0010bd5b, 0x592e5801, 0x832cac00, - 0x00000006, 0x82041480, 0x0000000f, 0x04001007, - 0x42001000, 0x0000000f, 0x4008b000, 0x0201f800, - 0x0010bd5b, 0x0401f004, 0x4004b000, 0x0201f800, - 0x0010bd5b, 0x5931d82a, 0x58ef400a, 0x58ee580c, - 0x4a025a05, 0x00000103, 0x592e5801, 0x58ec0008, - 0x0801f800, 0x0201f800, 0x00020b9d, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, + 0x02021800, 0x0010032e, 0x4d2c0000, 0x0c01f803, + 0x5c025800, 0x1c01f000, 0x00107f54, 0x00108564, + 0x001086da, 0x00107f54, 0x00108756, 0x001080e4, + 0x00107f54, 0x00107f54, 0x001084f0, 0x00107f54, + 0x00107f54, 0x00107f54, 0x00107f54, 0x00107f54, + 0x0201f800, 0x0010032e, 0x4933c857, 0x59300203, + 0x82003480, 0x0000000e, 0x02021800, 0x0010032e, + 0x0c01f001, 0x00107f6b, 0x00109239, 0x00107f6b, + 0x00107f6b, 0x00107f6b, 0x00107f6b, 0x00107f6b, + 0x00107f6b, 0x001091d5, 0x00109263, 0x001092d9, + 0x00109263, 0x001092d9, 0x00107f6b, 0x0201f800, + 0x0010032e, 0x0201f800, 0x0010032e, 0x4933c857, + 0x4d2c0000, 0x59325809, 0x59300203, 0x82003480, + 0x0000000e, 0x02021800, 0x0010032e, 0x0c01f803, + 0x5c025800, 0x1c01f000, 0x00107f88, 0x00107f88, + 0x00107f88, 0x00107fa4, 0x00107ff0, 0x00107f88, + 0x00107f88, 0x00107f88, 0x00107f8a, 0x00107f88, + 0x00107f88, 0x00107f88, 0x00107f88, 0x00107f88, + 0x0201f800, 0x0010032e, 0x4933c857, 0x83380580, + 0x00000040, 0x02020800, 0x0010032e, 0x4a026008, + 0x00082000, 0x4a026203, 0x00000003, 0x493a6403, + 0x4a025c09, 0x00000001, 0x592c000e, 0x48026012, + 0x497a6014, 0x592c0209, 0x800000c2, 0x800010c4, + 0x80081400, 0x480a6006, 0x0201f800, 0x00020168, + 0x42000800, 0x80000060, 0x0201f000, 0x00020b30, + 0x4933c857, 0x83380480, 0x00000050, 0x02021800, + 0x0010032e, 0x83380480, 0x00000049, 0x02001800, + 0x0010032e, 0x0c01f001, 0x00107fb7, 0x00107fc2, + 0x00107fb5, 0x00107fb5, 0x00107fb5, 0x00107fb5, + 0x00107fcd, 0x0201f800, 0x0010032e, 0x4a026203, + 0x00000004, 0x4a025c09, 0x00000002, 0x592c0208, + 0x48025c0a, 0x592c020a, 0x48025a08, 0x592c000d, + 0x4802580e, 0x1c01f000, 0x0201f800, 0x00106d71, + 0x0201f800, 0x0010989f, 0x04000005, 0x4a025a07, + 0x00000006, 0x0201f800, 0x000203ef, 0x0201f000, + 0x00020b9d, 0x0201f800, 0x00106d71, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010ff80, 0x5c027800, + 0x42003000, 0x00000014, 0x41782800, 0x42002000, + 0x00000002, 0x4d400000, 0x4d440000, 0x59368c03, + 0x42028000, 0x00000029, 0x0201f800, 0x0010a22a, + 0x5c028800, 0x5c028000, 0x42000000, 0x0010cf23, + 0x0201f800, 0x0010bfb3, 0x0201f800, 0x0010989f, + 0x02000000, 0x00020b9d, 0x4a025a07, 0x00000029, + 0x0201f800, 0x000203ef, 0x0201f000, 0x00020b9d, + 0x4933c857, 0x83380580, 0x00000048, 0x04000005, + 0x83380580, 0x00000053, 0x02020800, 0x0010032e, + 0x592c0207, 0x82000580, 0x00000007, 0x04000009, + 0x59300012, 0x80000540, 0x04000006, 0x592c080d, + 0x80040480, 0x4802580d, 0x4a025a07, 0x00000015, + 0x592c0207, 0x80000540, 0x04020003, 0x4a025a07, + 0x00000000, 0x0201f800, 0x000203ef, 0x0201f000, + 0x00020b9d, 0x4933c857, 0x4d2c0000, 0x4c500000, + 0x4c540000, 0x4c580000, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4c100000, 0x0201f800, 0x00100583, + 0x02000800, 0x0010032e, 0x497a5a07, 0x59a8006f, + 0x82000500, 0x0000f000, 0x48025c08, 0x59a8085a, + 0x82040c00, 0x00000018, 0x48065a08, 0x412cb800, + 0x4d2c0000, 0x41cca000, 0x4200c000, 0x00000001, + 0x4200c800, 0x0000002c, 0x82040480, 0x0000002d, + 0x04021006, 0x832cac00, 0x0000000a, 0x0201f800, + 0x001093b1, 0x0401f030, 0x40043000, 0x42000800, + 0x0000002c, 0x832cac00, 0x0000000a, 0x0201f800, + 0x001093b1, 0x82183480, 0x0000002c, 0x4c180000, + 0x0201f800, 0x00100583, 0x5c003000, 0x0400001a, + 0x8060c000, 0x4a025805, 0x00000110, 0x492cb801, + 0x82180c80, 0x0000003d, 0x04021007, 0x40180800, + 0x832cac00, 0x00000006, 0x0201f800, 0x001093b1, + 0x0401f015, 0x8264cc00, 0x0000003c, 0x82183480, + 0x0000003c, 0x42000800, 0x0000003c, 0x412cb800, + 0x832cac00, 0x00000006, 0x0201f800, 0x001093b1, + 0x0401f7e3, 0x5c025800, 0x592c0207, 0x8400055e, + 0x48025a07, 0x592c0408, 0x80640540, 0x48025c08, + 0x0401f002, 0x5c025800, 0x5c002000, 0x813669c0, + 0x04000003, 0x59343403, 0x0401f003, 0x42003000, + 0x0000ffff, 0x49325809, 0x481a5c07, 0x82100580, + 0x00000054, 0x0402001a, 0x4a025809, 0xffffffff, + 0x491e5814, 0x41781000, 0x831c0580, 0xffffffff, + 0x0400000e, 0x591c0009, 0x80000d40, 0x0400000b, + 0x58040205, 0x82000500, 0x000000ff, 0x82000580, + 0x00000012, 0x04000004, 0x82000580, 0x00000060, + 0x04020002, 0x58041006, 0x480a5806, 0x592c0408, + 0x81200540, 0x48025c08, 0x0401f002, 0x49225c06, + 0x846001c0, 0x80100540, 0x48025805, 0x0201f800, + 0x0010c0f9, 0x04020011, 0x592c0001, 0x497a5801, + 0x4c000000, 0x0201f800, 0x000203ef, 0x5c025800, + 0x812e59c0, 0x040207f6, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x0201f800, 0x0010b674, + 0x0401f7f6, 0x4803c856, 0x4c5c0000, 0x4d2c0000, + 0x4c500000, 0x4c540000, 0x4c580000, 0x412cb800, + 0x592c040c, 0x8c000516, 0x04000003, 0x41cca000, + 0x0401f003, 0x83cca400, 0x00000006, 0x4008b000, + 0x41781000, 0x82580480, 0x0000004c, 0x04001004, + 0x4200b000, 0x0000004c, 0x40001000, 0x4c080000, + 0x4d2c0000, 0x0201f800, 0x00100583, 0x04000026, + 0x5c001800, 0x492c1801, 0x485a5800, 0x8258b400, + 0x00000003, 0x8058b104, 0x832cac00, 0x00000002, + 0x0201f800, 0x0010c0b0, 0x585c040c, 0x8c000500, + 0x0400000e, 0x832c1400, 0x00000002, 0x8c000516, + 0x04000003, 0x82081400, 0x00000006, 0x46001000, + 0x00000001, 0x80081000, 0x46001000, 0x00000900, + 0x84000500, 0x4800bc0c, 0x5c001000, 0x800811c0, + 0x040207d7, 0x82000540, 0x00000001, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x5c025800, 0x5c00b800, + 0x1c01f000, 0x5c025800, 0x5c001000, 0x0401f7f8, + 0x4933c857, 0x83380d80, 0x00000015, 0x04020003, + 0x0201f000, 0x00020b9d, 0x83380d80, 0x00000016, + 0x02020800, 0x0010032e, 0x0201f000, 0x00020b9d, 0x4933c857, 0x4d2c0000, 0x4c500000, 0x4c540000, - 0x4c580000, 0x59cc0006, 0x82000d80, 0x01000000, - 0x0400002d, 0x59cc0007, 0x9000b1c0, 0x8258b500, - 0x000000ff, 0x8058b104, 0x8258b400, 0x00000002, - 0x82580c80, 0x00000007, 0x04001003, 0x4200b000, - 0x00000006, 0x83cca400, 0x00000006, 0x59301009, - 0x800811c0, 0x02000800, 0x0010032e, 0x8208ac00, - 0x00000006, 0x0201f800, 0x0010bd5b, 0x82000d00, - 0xff000000, 0x800409c0, 0x0400001a, 0x8200b500, - 0x000000ff, 0x04000017, 0x8058b104, 0x82580c80, - 0x0000000e, 0x04001003, 0x4200b000, 0x0000000d, - 0x58081001, 0x800811c0, 0x02000800, 0x0010032e, - 0x8208ac00, 0x00000006, 0x0201f800, 0x0010bd5b, - 0x0401f008, 0x59301009, 0x800811c0, 0x02000800, - 0x0010032e, 0x48001006, 0x59cc0007, 0x48001007, - 0x0401ff06, 0x5c00b000, 0x5c00a800, 0x5c00a000, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x42000800, - 0x00000000, 0x59cc0006, 0x82000580, 0x02000000, - 0x04000003, 0x42000800, 0x00000001, 0x4d2c0000, - 0x59325809, 0x812e59c0, 0x02000800, 0x0010032e, - 0x48065a07, 0x0201f800, 0x000203ef, 0x5c025800, - 0x0201f000, 0x00020b9d, 0x4933c857, 0x4d2c0000, - 0x4c500000, 0x4c540000, 0x4c580000, 0x4200b000, - 0x00000002, 0x59cc0806, 0x82040580, 0x01000000, - 0x04000004, 0x8204b500, 0x0000ffff, 0x8058b104, - 0x83cca400, 0x00000006, 0x59300009, 0x8200ac00, - 0x00000006, 0x0201f800, 0x0010bd5b, 0x0401fed7, + 0x4c580000, 0x59325809, 0x83cca400, 0x00000006, + 0x59cc1806, 0x820c0580, 0x01000000, 0x04020004, + 0x4200b000, 0x00000002, 0x0401f00f, 0x4200b000, + 0x00000008, 0x832cac00, 0x00000006, 0x0201f800, + 0x0010c086, 0x8c0c1d00, 0x0400000b, 0x4200b000, + 0x00000008, 0x592e5801, 0x812e59c0, 0x02000800, + 0x0010032e, 0x832cac00, 0x00000006, 0x0201f800, + 0x0010c086, 0x0401f816, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x4c500000, 0x4c540000, 0x4c580000, 0x83cca400, + 0x00000006, 0x5930a809, 0x8254ac00, 0x00000006, + 0x4200b000, 0x00000007, 0x0201f800, 0x0010c086, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x4933c857, + 0x0201f800, 0x0010989f, 0x02000000, 0x00020b9d, + 0x4d2c0000, 0x0201f800, 0x00109f51, 0x0402000b, + 0x41780800, 0x4d400000, 0x42028000, 0x00000000, + 0x0201f800, 0x00109d2a, 0x5c028000, 0x5c025800, + 0x0201f000, 0x00020b9d, 0x5931d82a, 0x58ef400a, + 0x58ee580c, 0x4a025a05, 0x00000103, 0x58ec0008, + 0x0801f800, 0x5c025800, 0x0201f000, 0x00020b9d, + 0x4933c857, 0x59cc1806, 0x820c0580, 0x02000000, + 0x04020027, 0x4a026802, 0x00fffffd, 0x5934000a, + 0x84000504, 0x4802680a, 0x42000000, 0x00000000, + 0x4c0c0000, 0x0401f82d, 0x5c001800, 0x59300c26, + 0x82040580, 0x00000021, 0x0402000b, 0x0201f800, + 0x00101fb4, 0x42001800, 0x0000ffff, 0x42002000, + 0x00000004, 0x42003000, 0x00000012, 0x0201f800, + 0x00103a21, 0x59300809, 0x800409c0, 0x02000000, + 0x00020b9d, 0x4a000a05, 0x00000103, 0x480c0806, + 0x5931d82a, 0x58ef400a, 0x58ee580c, 0x58ec0008, + 0x0801f800, 0x0201f000, 0x00020b9d, 0x42000000, + 0x0010cf2c, 0x0201f800, 0x0010bfb3, 0x42000000, + 0x00000006, 0x4c0c0000, 0x0401f808, 0x5c001800, + 0x040007e9, 0x4c0c0000, 0x0401f827, 0x5c001800, + 0x040207e5, 0x1c01f000, 0x4933c857, 0x4d400000, + 0x4d240000, 0x4d200000, 0x5932481c, 0x40028000, + 0x59300426, 0x82000d80, 0x00000051, 0x04000004, + 0x82000d80, 0x00000021, 0x04020011, 0x0201f800, + 0x00101fb4, 0x0201f800, 0x0010c0e8, 0x04020006, + 0x59300426, 0x82000580, 0x00000021, 0x02000800, + 0x00101cb7, 0x42000000, 0x00000001, 0x0201f800, + 0x00104e36, 0x80000580, 0x0401f003, 0x82000540, + 0x00000001, 0x5c024000, 0x5c024800, 0x5c028000, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x59325809, + 0x812e59c0, 0x04020009, 0x497a6006, 0x497a6205, + 0x4d380000, 0x42027000, 0x00000022, 0x0401fbb3, + 0x5c027000, 0x80000580, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x4d2c0000, 0x4c500000, 0x4c540000, + 0x4c580000, 0x59325809, 0x592e5801, 0x832cac00, + 0x00000006, 0x83cca400, 0x00000006, 0x59a8086f, + 0x82040d00, 0x000003ff, 0x82041480, 0x0000000f, + 0x0400101b, 0x4200b000, 0x0000000f, 0x0201f800, + 0x0010c086, 0x592e5801, 0x832cac00, 0x00000006, + 0x82080c80, 0x0000000f, 0x0400100d, 0x4200b000, + 0x0000000f, 0x0201f800, 0x0010c086, 0x592e5801, + 0x832cac00, 0x00000006, 0x82041480, 0x0000000f, + 0x04001007, 0x42001000, 0x0000000f, 0x4008b000, + 0x0201f800, 0x0010c086, 0x0401f004, 0x4004b000, + 0x0201f800, 0x0010c086, 0x5931d82a, 0x58ef400a, + 0x58ee580c, 0x4a025a05, 0x00000103, 0x592e5801, + 0x58ec0008, 0x0801f800, 0x0201f800, 0x00020b9d, 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x4803c857, 0x4807c857, - 0x480bc857, 0x480fc857, 0x4813c857, 0x481bc857, - 0x492fc857, 0x4d2c0000, 0x4c000000, 0x0201f800, - 0x0010056e, 0x5c000000, 0x0400000f, 0x48025803, - 0x481a5801, 0x48125808, 0x48065805, 0x480a5806, - 0x480e5807, 0x5c001000, 0x4c080000, 0x480a5809, - 0x412c1000, 0x0201f800, 0x00020016, 0x82000540, - 0x00000001, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x4937c857, 0x4d1c0000, 0x0201f800, 0x00106239, - 0x04020025, 0x59cc0001, 0x82000500, 0x00ffffff, - 0x59341002, 0x82081500, 0x00ffffff, 0x80080580, - 0x0402001d, 0x497a6205, 0x42000800, 0x00000035, - 0x0201f800, 0x00109a64, 0x04020012, 0x591c001d, - 0x800001c0, 0x0400000f, 0x497a381d, 0x591c0415, - 0x8c000502, 0x02000800, 0x0010032e, 0x84000502, - 0x48023c15, 0x591c1407, 0x82080580, 0x00000003, - 0x04000006, 0x82080580, 0x00000006, 0x04000005, - 0x0401fc22, 0x0401f004, 0x0401f805, 0x0401f002, - 0x0401f8d6, 0x5c023800, 0x1c01f000, 0x4d2c0000, - 0x591e5809, 0x4933c857, 0x491fc857, 0x493bc857, - 0x492fc857, 0x83380580, 0x00000015, 0x040000c9, - 0x83380580, 0x00000016, 0x040200c4, 0x4d300000, - 0x411e6000, 0x59cc0207, 0x4803c857, 0x82000d00, - 0x0000ff00, 0x82040580, 0x00001700, 0x04000004, - 0x82040580, 0x00000300, 0x04020067, 0x591c0203, - 0x4803c857, 0x82000580, 0x0000000d, 0x04000046, - 0x812e59c0, 0x040000b0, 0x591c0202, 0x4803c857, - 0x82000580, 0x0000ffff, 0x04020093, 0x592c020b, - 0x4803c857, 0x82000500, 0x00000003, 0x82000580, - 0x00000002, 0x04020007, 0x592c0810, 0x591c0012, - 0x4803c857, 0x4807c857, 0x80040580, 0x04020086, - 0x591c0415, 0x4803c857, 0x8c000500, 0x04020082, - 0x42000000, 0x0010cc09, 0x0201f800, 0x0010bc88, - 0x41780800, 0x591c1006, 0x42000000, 0x0000000a, - 0x0201f800, 0x00106a98, 0x592c0407, 0x4803c857, - 0x800001c0, 0x0400000c, 0x80080c80, 0x04001004, - 0x02020800, 0x0010032e, 0x80001040, 0x480a5c07, - 0x800811c0, 0x04020004, 0x0201f800, 0x00110517, - 0x0401f07d, 0x0201f800, 0x0010977c, 0x591c0818, - 0x591c0019, 0x48065809, 0x4802580a, 0x592e4411, - 0x81224110, 0x59300008, 0x8c000500, 0x02020800, - 0x00100c75, 0x497a3809, 0x0201f800, 0x000202c1, - 0x04020059, 0x411e6000, 0x0201f800, 0x00107cbe, - 0x0401f069, 0x0201f800, 0x00107cfe, 0x04000017, - 0x591c0006, 0x48026006, 0x4926601c, 0x4936600a, - 0x4a026407, 0x00000003, 0x492e6009, 0x591c0818, - 0x591c1019, 0x48066018, 0x480a6019, 0x4d380000, - 0x591e7403, 0x4d300000, 0x411e6000, 0x0201f800, - 0x00107cbe, 0x5c026000, 0x0201f800, 0x00020bc1, - 0x5c027000, 0x0401f050, 0x59a8002c, 0x48023a05, - 0x0401f04d, 0x59cc0407, 0x82000580, 0x0000000b, - 0x0402002e, 0x59340a00, 0x84040d0e, 0x48066a00, - 0x592c0a05, 0x82040d00, 0x000000ff, 0x82040d80, - 0x00000014, 0x04000003, 0x4a026226, 0x00000003, - 0x59300008, 0x8c000500, 0x02020800, 0x00100c75, - 0x4d400000, 0x497a5c0a, 0x42028000, 0x00000003, - 0x592c0a09, 0x0201f800, 0x00104cf5, 0x0201f800, - 0x0010bd9c, 0x04020009, 0x0201f800, 0x000203ef, - 0x59300a26, 0x82040d80, 0x00000003, 0x02000800, - 0x0010977c, 0x497a6009, 0x5c028000, 0x4a026403, - 0x00000085, 0x4a026203, 0x00000009, 0x4a026407, - 0x00000002, 0x42000800, 0x8000404b, 0x0201f800, - 0x00020b3e, 0x0401f01c, 0x59cc0207, 0x82000580, - 0x00002a00, 0x04020004, 0x59a8002c, 0x48023a05, - 0x0401f015, 0x812e59c0, 0x02000800, 0x0010032e, - 0x4a025a05, 0x00000103, 0x591c0008, 0x8c000500, - 0x02020800, 0x00100c75, 0x591c0402, 0x48025c07, - 0x4a025a07, 0x00000003, 0x497a5c0a, 0x0201f800, - 0x000203ef, 0x0201f800, 0x00107cbe, 0x0201f800, - 0x001048bd, 0x5c026000, 0x0201f800, 0x00020b9d, - 0x0401f002, 0x5c026000, 0x5c025800, 0x1c01f000, - 0x0401f819, 0x0401f7fd, 0x4933c857, 0x83380580, - 0x00000015, 0x04020004, 0x59a8002c, 0x48023a05, - 0x0401f00d, 0x83380580, 0x00000016, 0x0402000d, - 0x4d300000, 0x411e6000, 0x0201f800, 0x0010b0e3, - 0x0201f800, 0x00020afd, 0x0201f800, 0x00020b9d, - 0x5c026000, 0x497a381d, 0x0201f800, 0x00020b9d, - 0x1c01f000, 0x4c5c0000, 0x591c0415, 0x84000540, - 0x48023c15, 0x59ccb80b, 0x4933c857, 0x491fc857, - 0x492fc857, 0x4803c857, 0x485fc857, 0x8c5cbd3c, - 0x04000005, 0x59a8002c, 0x48023a05, 0x497a381d, - 0x0401f057, 0x4d300000, 0x411e6000, 0x0201f800, - 0x001091e5, 0x5c026000, 0x591c0407, 0x82000580, - 0x00000000, 0x0400004e, 0x591c0403, 0x82000580, - 0x00000050, 0x0402000c, 0x4d300000, 0x411e6000, - 0x4a026203, 0x00000001, 0x42000800, 0x80000043, - 0x0201f800, 0x00020b3e, 0x5c026000, 0x497a381d, - 0x0401f03f, 0x591c0203, 0x82000580, 0x0000000d, - 0x0400001f, 0x812e59c0, 0x02000800, 0x0010032e, - 0x592c020b, 0x4803c857, 0x8c000500, 0x0402001f, - 0x8c000502, 0x04000016, 0x591c0415, 0x8c00051c, - 0x04020007, 0x591c0012, 0x4803c857, 0x800001c0, - 0x0400000f, 0x591c0013, 0x48023817, 0x4a023813, - 0x0fffffff, 0x592c0209, 0x8400051e, 0x48025a09, - 0x42000000, 0x0010cc0b, 0x0201f800, 0x0010bc88, - 0x4a023a15, 0x00000001, 0x0401f01a, 0x42000000, - 0x0010cc0c, 0x0201f800, 0x0010bc88, 0x4a023a15, - 0x00000007, 0x0401f013, 0x8c5cbd3a, 0x040207f8, - 0x59cc000a, 0x592c1810, 0x4803c857, 0x480fc857, - 0x800c0580, 0x040007f2, 0x59cc000a, 0x4803c857, - 0x48023817, 0x48023816, 0x42000000, 0x0010cc0a, - 0x0201f800, 0x0010bc88, 0x4a023a15, 0x00000005, - 0x5c00b800, 0x0201f000, 0x001098e6, 0x5c00b800, - 0x0201f000, 0x00020b9d, 0x4933c857, 0x4d1c0000, - 0x0201f800, 0x00106239, 0x04020053, 0x59cc0001, - 0x59341002, 0x80080580, 0x82000500, 0x00ffffff, - 0x0402004a, 0x5930141a, 0x0201f800, 0x00109ac1, - 0x02000800, 0x0010032e, 0x591c1407, 0x82080580, - 0x00000007, 0x04000041, 0x82080580, 0x00000002, - 0x0400003e, 0x82080580, 0x00000000, 0x0400003b, - 0x591c0202, 0x82000d80, 0x0000ffff, 0x04000004, - 0x59301a1a, 0x800c0580, 0x04020034, 0x83380580, - 0x00000015, 0x0400002f, 0x4d300000, 0x4d2c0000, - 0x411e6000, 0x59325809, 0x0201f800, 0x00109667, - 0x02000800, 0x0010032e, 0x592c0205, 0x82000500, - 0x000000ff, 0x82000580, 0x00000014, 0x04000003, - 0x4a026226, 0x00000003, 0x497a5c0a, 0x42028000, - 0x00000003, 0x592c0a09, 0x0201f800, 0x00104cf5, - 0x0201f800, 0x0010bd9c, 0x04020009, 0x0201f800, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c500000, + 0x4c540000, 0x4c580000, 0x59cc0006, 0x82000d80, + 0x01000000, 0x0400002d, 0x59cc0007, 0x9000b1c0, + 0x8258b500, 0x000000ff, 0x8058b104, 0x8258b400, + 0x00000002, 0x82580c80, 0x00000007, 0x04001003, + 0x4200b000, 0x00000006, 0x83cca400, 0x00000006, + 0x59301009, 0x800811c0, 0x02000800, 0x0010032e, + 0x8208ac00, 0x00000006, 0x0201f800, 0x0010c086, + 0x82000d00, 0xff000000, 0x800409c0, 0x0400001a, + 0x8200b500, 0x000000ff, 0x04000017, 0x8058b104, + 0x82580c80, 0x0000000e, 0x04001003, 0x4200b000, + 0x0000000d, 0x58081001, 0x800811c0, 0x02000800, + 0x0010032e, 0x8208ac00, 0x00000006, 0x0201f800, + 0x0010c086, 0x0401f008, 0x59301009, 0x800811c0, + 0x02000800, 0x0010032e, 0x48001006, 0x59cc0007, + 0x48001007, 0x0401fefe, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x42000800, 0x00000000, 0x59cc0006, 0x82000580, + 0x02000000, 0x04000003, 0x42000800, 0x00000001, + 0x4d2c0000, 0x59325809, 0x812e59c0, 0x02000800, + 0x0010032e, 0x48065a07, 0x0201f800, 0x000203ef, + 0x5c025800, 0x0201f000, 0x00020b9d, 0x4933c857, + 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, + 0x4200b000, 0x00000002, 0x59cc0806, 0x82040580, + 0x01000000, 0x04000004, 0x8204b500, 0x0000ffff, + 0x8058b104, 0x83cca400, 0x00000006, 0x59300009, + 0x8200ac00, 0x00000006, 0x0201f800, 0x0010c086, + 0x0401fecf, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4803c857, + 0x4807c857, 0x480bc857, 0x480fc857, 0x4813c857, + 0x481bc857, 0x492fc857, 0x4d2c0000, 0x4c000000, + 0x0201f800, 0x0010056e, 0x5c000000, 0x0400000f, + 0x48025803, 0x481a5801, 0x48125808, 0x48065805, + 0x480a5806, 0x480e5807, 0x5c001000, 0x4c080000, + 0x480a5809, 0x412c1000, 0x0201f800, 0x00020016, + 0x82000540, 0x00000001, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x4937c857, 0x4d1c0000, 0x0201f800, + 0x00106405, 0x04020025, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x59341002, 0x82081500, 0x00ffffff, + 0x80080580, 0x0402001d, 0x497a6205, 0x42000800, + 0x00000035, 0x0201f800, 0x00109c9c, 0x04020012, + 0x591c001d, 0x800001c0, 0x0400000f, 0x497a381d, + 0x591c0415, 0x8c000502, 0x02000800, 0x0010032e, + 0x84000502, 0x48023c15, 0x591c1407, 0x82080580, + 0x00000003, 0x04000006, 0x82080580, 0x00000006, + 0x04000005, 0x0401fc13, 0x0401f004, 0x0401f805, + 0x0401f002, 0x0401f8d6, 0x5c023800, 0x1c01f000, + 0x4d2c0000, 0x591e5809, 0x4933c857, 0x491fc857, + 0x493bc857, 0x492fc857, 0x83380580, 0x00000015, + 0x040000c9, 0x83380580, 0x00000016, 0x040200c4, + 0x4d300000, 0x411e6000, 0x59cc0207, 0x4803c857, + 0x82000d00, 0x0000ff00, 0x82040580, 0x00001700, + 0x04000004, 0x82040580, 0x00000300, 0x04020067, + 0x591c0203, 0x4803c857, 0x82000580, 0x0000000d, + 0x04000046, 0x812e59c0, 0x040000b0, 0x591c0202, + 0x4803c857, 0x82000580, 0x0000ffff, 0x04020093, + 0x592c020b, 0x4803c857, 0x82000500, 0x00000003, + 0x82000580, 0x00000002, 0x04020007, 0x592c0810, + 0x591c0012, 0x4803c857, 0x4807c857, 0x80040580, + 0x04020086, 0x591c0415, 0x4803c857, 0x8c000500, + 0x04020082, 0x42000000, 0x0010cf09, 0x0201f800, + 0x0010bfb3, 0x41780800, 0x591c1006, 0x42000000, + 0x0000000a, 0x0201f800, 0x00106c9d, 0x592c0407, + 0x4803c857, 0x800001c0, 0x0400000c, 0x80080c80, + 0x04001004, 0x02020800, 0x0010032e, 0x80001040, + 0x480a5c07, 0x800811c0, 0x04020004, 0x0201f800, + 0x00110814, 0x0401f07d, 0x0201f800, 0x001099b4, + 0x591c0818, 0x591c0019, 0x48065809, 0x4802580a, + 0x592e4411, 0x81224110, 0x59300008, 0x8c000500, + 0x02020800, 0x00100c76, 0x497a3809, 0x0201f800, + 0x000202c1, 0x04020059, 0x411e6000, 0x0201f800, + 0x00107eb4, 0x0401f069, 0x0201f800, 0x00107ef8, + 0x04000017, 0x591c0006, 0x48026006, 0x4926601c, + 0x4936600a, 0x4a026407, 0x00000003, 0x492e6009, + 0x591c0818, 0x591c1019, 0x48066018, 0x480a6019, + 0x4d380000, 0x591e7403, 0x4d300000, 0x411e6000, + 0x0201f800, 0x00107eb4, 0x5c026000, 0x0201f800, + 0x00020bc1, 0x5c027000, 0x0401f050, 0x59a8002c, + 0x48023a05, 0x0401f04d, 0x59cc0407, 0x82000580, + 0x0000000b, 0x0402002e, 0x59340a00, 0x84040d0e, + 0x48066a00, 0x592c0a05, 0x82040d00, 0x000000ff, + 0x82040d80, 0x00000014, 0x04000003, 0x4a026226, + 0x00000003, 0x59300008, 0x8c000500, 0x02020800, + 0x00100c76, 0x4d400000, 0x497a5c0a, 0x42028000, + 0x00000003, 0x592c0a09, 0x0201f800, 0x00104e1a, + 0x0201f800, 0x0010c0c7, 0x04020009, 0x0201f800, 0x000203ef, 0x59300a26, 0x82040d80, 0x00000003, - 0x02000800, 0x0010977c, 0x497a6009, 0x5c025800, + 0x02000800, 0x001099b4, 0x497a6009, 0x5c028000, 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, 0x42000800, 0x8000404b, - 0x0201f800, 0x00020b3e, 0x5c026000, 0x0401f003, - 0x59a8002c, 0x48023a05, 0x497a381d, 0x0201f800, - 0x00020b9d, 0x5c023800, 0x1c01f000, 0x4933c857, - 0x4c580000, 0x4d2c0000, 0x59325809, 0x59342200, - 0x82102500, 0xffffdffd, 0x48126a00, 0x83383580, - 0x00000015, 0x0400000d, 0x0201f800, 0x00109667, - 0x04000068, 0x0201f800, 0x00109d13, 0x04020005, - 0x4200b000, 0x00000002, 0x0201f800, 0x00109cf2, - 0x0401fa3e, 0x0401f07f, 0x83cc1400, 0x00000008, - 0x4200b000, 0x00000002, 0x83341c00, 0x00000006, - 0x0201f800, 0x00108a31, 0x04020014, 0x83cc1400, - 0x0000000a, 0x4200b000, 0x00000002, 0x83341c00, - 0x00000008, 0x0201f800, 0x00108a31, 0x0402000b, - 0x0201f800, 0x00101cb2, 0x59342200, 0x59cc1007, - 0x800811c0, 0x04000003, 0x480a6801, 0x84102542, - 0x48126a00, 0x0401f066, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010fc72, 0x5c027800, 0x42000000, - 0x0010cc23, 0x0201f800, 0x0010bc88, 0x59340200, - 0x84000558, 0x48026a00, 0x4d300000, 0x0201f800, - 0x00107cfe, 0x02000800, 0x0010032e, 0x4926601c, - 0x4936600a, 0x497a6009, 0x4a026407, 0x00000001, - 0x4a026403, 0x00000001, 0x42003000, 0x00000003, - 0x0201f800, 0x0010b412, 0x0201f800, 0x00101f51, - 0x59240400, 0x8c00050a, 0x04020011, 0x41782800, - 0x42003000, 0x00000001, 0x4d400000, 0x42028000, - 0x00000029, 0x0201f800, 0x0010ae7c, 0x5c028000, - 0x4a026407, 0x00000004, 0x4a026203, 0x00000007, - 0x4a026429, 0x00000001, 0x0401f009, 0x4a026203, - 0x00000001, 0x42000800, 0x0000000b, 0x0201f800, - 0x001044f1, 0x0201f800, 0x00106b17, 0x5c026000, - 0x0201f800, 0x00109667, 0x04000026, 0x0201f800, - 0x00109d13, 0x04020026, 0x0401f9e0, 0x0401f021, - 0x42000000, 0x0010cc26, 0x0201f800, 0x0010bc88, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010fc72, - 0x42000000, 0x0010cc23, 0x0201f800, 0x0010bc88, - 0x59340200, 0x84000558, 0x48026a00, 0x42003000, - 0x00000003, 0x41782800, 0x42002000, 0x00000005, - 0x4d400000, 0x4d440000, 0x59368c03, 0x42028000, - 0x00000029, 0x0201f800, 0x00109fec, 0x5c028800, - 0x5c028000, 0x5c027800, 0x0201f800, 0x00101cb2, - 0x0201f800, 0x00020b9d, 0x0401f002, 0x0401fc43, - 0x5c025800, 0x5c00b000, 0x1c01f000, 0x4933c857, - 0x41380000, 0x83383480, 0x00000058, 0x02021800, - 0x0010032e, 0x0c01f001, 0x00108359, 0x00108354, - 0x00108359, 0x00108359, 0x00108359, 0x00108359, - 0x00108352, 0x00108352, 0x00108352, 0x00108352, - 0x00108352, 0x00108352, 0x00108352, 0x00108352, - 0x00108352, 0x00108352, 0x00108352, 0x00108352, - 0x00108352, 0x00108352, 0x00108352, 0x00108352, - 0x00108352, 0x00108352, 0x00108352, 0x00108352, - 0x00108352, 0x00108352, 0x00108352, 0x00108352, - 0x00108352, 0x00108359, 0x00108352, 0x00108359, - 0x00108359, 0x00108352, 0x00108352, 0x00108352, - 0x00108352, 0x00108352, 0x00108359, 0x00108352, - 0x00108352, 0x00108352, 0x00108352, 0x00108352, - 0x00108352, 0x00108352, 0x00108352, 0x00108352, - 0x00108359, 0x00108359, 0x00108352, 0x00108352, - 0x00108352, 0x00108352, 0x00108352, 0x00108352, - 0x00108352, 0x00108352, 0x00108352, 0x00108359, - 0x00108352, 0x00108352, 0x00108359, 0x00108359, - 0x00108352, 0x00108359, 0x00108359, 0x00108352, - 0x00108352, 0x00108352, 0x00108352, 0x00108359, - 0x00108352, 0x00108352, 0x00108352, 0x00108359, - 0x00108352, 0x00108352, 0x00108352, 0x00108359, - 0x00108352, 0x00108352, 0x00108352, 0x00108359, - 0x00108352, 0x00108359, 0x00108352, 0x00108352, - 0x00108352, 0x00108352, 0x00108352, 0x00108352, - 0x00108352, 0x00108352, 0x0201f800, 0x0010032e, - 0x4a026203, 0x00000001, 0x493a6403, 0x0201f000, - 0x00106b17, 0x4933c857, 0x4a026203, 0x00000001, - 0x493a6403, 0x0201f000, 0x00106b17, 0x59300403, - 0x82003480, 0x00000058, 0x02021800, 0x0010032e, - 0x83383580, 0x00000013, 0x040000a9, 0x83383580, - 0x00000027, 0x04020057, 0x4933c857, 0x0201f800, - 0x00106b8c, 0x0201f800, 0x0010b4fc, 0x0201f800, - 0x0010978f, 0x0400000f, 0x0201f800, 0x001097aa, - 0x0400004a, 0x59300403, 0x82000d80, 0x00000022, - 0x04020041, 0x42000000, 0x00000205, 0x0401fc06, - 0x0400003d, 0x0401fc1f, 0x0400003f, 0x0401f03f, - 0x42000000, 0x00000203, 0x0201f800, 0x00107f81, - 0x04000035, 0x0201f800, 0x00101cb2, 0x42000800, - 0x00000007, 0x0201f800, 0x001044f1, 0x0401f917, - 0x4d440000, 0x59368c03, 0x83440580, 0x000007fe, - 0x04020008, 0x59a8121b, 0x84081540, 0x0201f800, - 0x00104fc6, 0x04020002, 0x8408154a, 0x480b521b, - 0x42028000, 0x00000029, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010fc72, 0x5c027800, 0x836c0580, - 0x00000003, 0x0400000c, 0x5932680a, 0x59340008, - 0x800001c0, 0x04020008, 0x59368c03, 0x4933c857, - 0x4937c857, 0x4947c857, 0x0201f800, 0x001045ac, - 0x0401f00c, 0x42000000, 0x0010cc23, 0x0201f800, - 0x0010bc88, 0x42003000, 0x00000015, 0x41782800, - 0x42002000, 0x00000003, 0x0201f800, 0x00109fec, - 0x5c028800, 0x0201f800, 0x001099c1, 0x0201f000, - 0x00020b9d, 0x1c01f000, 0x0401f8e4, 0x0401f7fa, - 0x83380580, 0x00000014, 0x0400000c, 0x4933c857, - 0x0201f800, 0x00107021, 0x02020000, 0x00107d3d, - 0x59300203, 0x82000580, 0x00000002, 0x04000109, - 0x0201f800, 0x0010032e, 0x4933c857, 0x0201f800, - 0x00106b8c, 0x0201f800, 0x0010b4fc, 0x42002800, - 0x00000002, 0x59300403, 0x82000580, 0x00000051, - 0x02000000, 0x0010a1bb, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010fc72, 0x5c027800, 0x42003000, - 0x00000016, 0x41782800, 0x4d400000, 0x4d440000, - 0x59368c03, 0x42002000, 0x00000009, 0x42028000, - 0x00000029, 0x0201f800, 0x00109fec, 0x5c028800, - 0x5c028000, 0x42000000, 0x0010cc23, 0x0201f800, - 0x0010bc88, 0x0201f800, 0x0010978f, 0x0402000c, - 0x0201f800, 0x00101cb2, 0x0401f8ac, 0x59340c03, - 0x82040580, 0x000007fe, 0x040207bf, 0x59a80a1b, - 0x84040d40, 0x4807521b, 0x0401f7bb, 0x0201f800, - 0x001097aa, 0x04020003, 0x0401f8a0, 0x0401f7b6, - 0x59300403, 0x82000d80, 0x00000032, 0x04020004, - 0x0201f800, 0x0010224a, 0x0401f7af, 0x82000d80, - 0x00000022, 0x04000895, 0x0401f7ab, 0x4933c857, - 0x4803c857, 0x0c01f001, 0x0010847b, 0x0010847b, - 0x0010847b, 0x0010847b, 0x0010847b, 0x0010847b, - 0x00108472, 0x00108472, 0x00108472, 0x00108472, - 0x00108472, 0x00108472, 0x00108472, 0x00108472, - 0x00108472, 0x00108472, 0x00108472, 0x00108472, - 0x00108472, 0x00108472, 0x00108472, 0x00108472, - 0x00108472, 0x00108472, 0x00108472, 0x00108472, - 0x00108472, 0x00108472, 0x00108472, 0x00108472, - 0x0010847f, 0x0010849c, 0x00108472, 0x0010849c, - 0x0010849c, 0x00108472, 0x00108472, 0x00108472, - 0x00108472, 0x00108472, 0x0010849c, 0x0010849c, - 0x00108472, 0x00108472, 0x00108472, 0x00108472, - 0x00108472, 0x00108472, 0x00108472, 0x00108472, - 0x0010848d, 0x0010849c, 0x00108472, 0x00108486, - 0x00108472, 0x00108472, 0x00108472, 0x00108486, - 0x00108472, 0x00108472, 0x00108472, 0x0010849c, - 0x00108489, 0x00108472, 0x00108474, 0x0010849c, - 0x00108472, 0x0010849c, 0x0010849c, 0x00108472, - 0x00108472, 0x00108472, 0x00108472, 0x0010849c, - 0x00108472, 0x00108472, 0x00108472, 0x0010849c, - 0x00108472, 0x00108472, 0x00108472, 0x0010849c, - 0x00108472, 0x00108472, 0x00108472, 0x0010849c, - 0x00108472, 0x0010849c, 0x00108472, 0x00108472, - 0x00108472, 0x00108472, 0x00108472, 0x00108472, - 0x00108472, 0x00108472, 0x0201f800, 0x0010032e, - 0x4d2c0000, 0x59325809, 0x0201f800, 0x000203ef, - 0x5c025800, 0x0201f000, 0x00020b9d, 0x4a026203, - 0x00000002, 0x0201f000, 0x0010982f, 0x4a026203, - 0x00000005, 0x59a8002c, 0x48026205, 0x59a8002a, - 0x48026006, 0x1c01f000, 0x59300827, 0x49780a05, - 0x0401f014, 0x0201f800, 0x001099c1, 0x0201f000, - 0x00020b9d, 0x0201f800, 0x0010224a, 0x0201f800, - 0x00106c3c, 0x04000005, 0x0201f800, 0x00106b8c, - 0x0201f000, 0x00020b9d, 0x0201f800, 0x00106b8c, - 0x0201f800, 0x00020b9d, 0x0201f000, 0x00106c29, - 0x4933c857, 0x4a026203, 0x00000002, 0x59a8002a, - 0x48026006, 0x1c01f000, 0x4933c857, 0x0201f800, - 0x00109667, 0x0400002e, 0x4d2c0000, 0x0201f800, - 0x00109d13, 0x0402000a, 0x4d400000, 0x42028000, - 0x00000031, 0x42000800, 0x00000004, 0x0201f800, - 0x00109af2, 0x5c028000, 0x0401f020, 0x59300c07, - 0x82040580, 0x00000010, 0x04000004, 0x82040580, - 0x00000011, 0x0402000a, 0x4a025a07, 0x00000031, - 0x4a02580e, 0x00000004, 0x4a02580f, 0x000000ff, - 0x0201f800, 0x000203ef, 0x0401f010, 0x592c0405, - 0x8c00051e, 0x0400000d, 0x4a025a05, 0x00000103, - 0x4a025806, 0x01000000, 0x4da00000, 0x4cec0000, - 0x5931d82a, 0x58ef400a, 0x58ec0008, 0x0801f800, - 0x5c01d800, 0x5c034000, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x59340400, 0x82000500, 0x000000ff, + 0x0201f800, 0x00020b3e, 0x0401f01c, 0x59cc0207, + 0x82000580, 0x00002a00, 0x04020004, 0x59a8002c, + 0x48023a05, 0x0401f015, 0x812e59c0, 0x02000800, + 0x0010032e, 0x4a025a05, 0x00000103, 0x591c0008, + 0x8c000500, 0x02020800, 0x00100c76, 0x591c0402, + 0x48025c07, 0x4a025a07, 0x00000003, 0x497a5c0a, + 0x0201f800, 0x000203ef, 0x0201f800, 0x00107eb4, + 0x0201f800, 0x001049bd, 0x5c026000, 0x0201f800, + 0x00020b9d, 0x0401f002, 0x5c026000, 0x5c025800, + 0x1c01f000, 0x0401f819, 0x0401f7fd, 0x4933c857, + 0x83380580, 0x00000015, 0x04020004, 0x59a8002c, + 0x48023a05, 0x0401f00d, 0x83380580, 0x00000016, + 0x0402000d, 0x4d300000, 0x411e6000, 0x0201f800, + 0x0010b3fa, 0x0201f800, 0x00020afd, 0x0201f800, + 0x00020b9d, 0x5c026000, 0x497a381d, 0x0201f800, + 0x00020b9d, 0x1c01f000, 0x4c5c0000, 0x591c0415, + 0x84000540, 0x48023c15, 0x59ccb80b, 0x4933c857, + 0x491fc857, 0x492fc857, 0x4803c857, 0x485fc857, + 0x8c5cbd3c, 0x04000005, 0x59a8002c, 0x48023a05, + 0x497a381d, 0x0401f057, 0x4d300000, 0x411e6000, + 0x0201f800, 0x00109419, 0x5c026000, 0x591c0407, + 0x82000580, 0x00000000, 0x0400004e, 0x591c0403, + 0x82000580, 0x00000050, 0x0402000c, 0x4d300000, + 0x411e6000, 0x4a026203, 0x00000001, 0x42000800, + 0x80000043, 0x0201f800, 0x00020b3e, 0x5c026000, + 0x497a381d, 0x0401f03f, 0x591c0203, 0x82000580, + 0x0000000d, 0x0400001f, 0x812e59c0, 0x02000800, + 0x0010032e, 0x592c020b, 0x4803c857, 0x8c000500, + 0x0402001f, 0x8c000502, 0x04000016, 0x591c0415, + 0x8c00051c, 0x04020007, 0x591c0012, 0x4803c857, + 0x800001c0, 0x0400000f, 0x591c0013, 0x48023817, + 0x4a023813, 0x0fffffff, 0x592c0209, 0x8400051e, + 0x48025a09, 0x42000000, 0x0010cf0b, 0x0201f800, + 0x0010bfb3, 0x4a023a15, 0x00000001, 0x0401f01a, + 0x42000000, 0x0010cf0c, 0x0201f800, 0x0010bfb3, + 0x4a023a15, 0x00000007, 0x0401f013, 0x8c5cbd3a, + 0x040207f8, 0x59cc000a, 0x592c1810, 0x4803c857, + 0x480fc857, 0x800c0580, 0x040007f2, 0x59cc000a, + 0x4803c857, 0x48023817, 0x48023816, 0x42000000, + 0x0010cf0a, 0x0201f800, 0x0010bfb3, 0x4a023a15, + 0x00000005, 0x5c00b800, 0x0201f000, 0x00109b1e, + 0x5c00b800, 0x0201f000, 0x00020b9d, 0x4933c857, + 0x4d1c0000, 0x0201f800, 0x00106405, 0x04020053, + 0x59cc0001, 0x59341002, 0x80080580, 0x82000500, + 0x00ffffff, 0x0402004a, 0x5930141a, 0x0201f800, + 0x00109cf9, 0x02000800, 0x0010032e, 0x591c1407, + 0x82080580, 0x00000007, 0x04000041, 0x82080580, + 0x00000002, 0x0400003e, 0x82080580, 0x00000000, + 0x0400003b, 0x591c0202, 0x82000d80, 0x0000ffff, + 0x04000004, 0x59301a1a, 0x800c0580, 0x04020034, + 0x83380580, 0x00000015, 0x0400002f, 0x4d300000, + 0x4d2c0000, 0x411e6000, 0x59325809, 0x0201f800, + 0x0010989f, 0x02000800, 0x0010032e, 0x592c0205, + 0x82000500, 0x000000ff, 0x82000580, 0x00000014, + 0x04000003, 0x4a026226, 0x00000003, 0x497a5c0a, + 0x42028000, 0x00000003, 0x592c0a09, 0x0201f800, + 0x00104e1a, 0x0201f800, 0x0010c0c7, 0x04020009, + 0x0201f800, 0x000203ef, 0x59300a26, 0x82040d80, + 0x00000003, 0x02000800, 0x001099b4, 0x497a6009, + 0x5c025800, 0x4a026403, 0x00000085, 0x4a026203, + 0x00000009, 0x4a026407, 0x00000002, 0x42000800, + 0x8000404b, 0x0201f800, 0x00020b3e, 0x5c026000, + 0x0401f003, 0x59a8002c, 0x48023a05, 0x497a381d, + 0x0201f800, 0x00020b9d, 0x5c023800, 0x1c01f000, + 0x4933c857, 0x4c580000, 0x4d2c0000, 0x59325809, + 0x59342200, 0x82102500, 0xffffdffd, 0x48126a00, + 0x83383580, 0x00000015, 0x0400000d, 0x0201f800, + 0x0010989f, 0x04000068, 0x0201f800, 0x00109f51, + 0x04020005, 0x4200b000, 0x00000002, 0x0201f800, + 0x00109f30, 0x0401fa3f, 0x0401f07f, 0x83cc1400, + 0x00000008, 0x4200b000, 0x00000002, 0x83341c00, + 0x00000006, 0x0201f800, 0x00108c57, 0x04020014, + 0x83cc1400, 0x0000000a, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000008, 0x0201f800, 0x00108c57, + 0x0402000b, 0x0201f800, 0x00101cb7, 0x59342200, + 0x59cc1007, 0x800811c0, 0x04000003, 0x480a6801, + 0x84102542, 0x48126a00, 0x0401f066, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010ff80, 0x5c027800, + 0x42000000, 0x0010cf23, 0x0201f800, 0x0010bfb3, + 0x59340200, 0x84000558, 0x48026a00, 0x4d300000, + 0x0201f800, 0x00107ef8, 0x02000800, 0x0010032e, + 0x4926601c, 0x4936600a, 0x497a6009, 0x4a026407, + 0x00000001, 0x4a026403, 0x00000001, 0x42003000, + 0x00000003, 0x0201f800, 0x0010b73d, 0x0201f800, + 0x00101fb4, 0x59240400, 0x8c00050a, 0x04020011, + 0x41782800, 0x42003000, 0x00000001, 0x4d400000, + 0x42028000, 0x00000029, 0x0201f800, 0x0010b18b, + 0x5c028000, 0x4a026407, 0x00000004, 0x4a026203, + 0x00000007, 0x4a026429, 0x00000001, 0x0401f009, + 0x4a026203, 0x00000001, 0x42000800, 0x0000000b, + 0x0201f800, 0x001045ea, 0x0201f800, 0x00106d1c, + 0x5c026000, 0x0201f800, 0x0010989f, 0x04000026, + 0x0201f800, 0x00109f51, 0x04020026, 0x0401f9e1, + 0x0401f021, 0x42000000, 0x0010cf26, 0x0201f800, + 0x0010bfb3, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010ff80, 0x42000000, 0x0010cf23, 0x0201f800, + 0x0010bfb3, 0x59340200, 0x84000558, 0x48026a00, + 0x42003000, 0x00000003, 0x41782800, 0x42002000, + 0x00000005, 0x4d400000, 0x4d440000, 0x59368c03, + 0x42028000, 0x00000029, 0x0201f800, 0x0010a22a, + 0x5c028800, 0x5c028000, 0x5c027800, 0x0201f800, + 0x00101cb7, 0x0201f800, 0x00020b9d, 0x0401f002, + 0x0401fc3b, 0x5c025800, 0x5c00b000, 0x1c01f000, + 0x4933c857, 0x41380000, 0x83383480, 0x00000058, + 0x02021800, 0x0010032e, 0x0c01f001, 0x0010855e, + 0x00108559, 0x0010855e, 0x0010855e, 0x0010855e, + 0x0010855e, 0x00108557, 0x00108557, 0x00108557, + 0x00108557, 0x00108557, 0x00108557, 0x00108557, + 0x00108557, 0x00108557, 0x00108557, 0x00108557, + 0x00108557, 0x00108557, 0x00108557, 0x00108557, + 0x00108557, 0x00108557, 0x00108557, 0x00108557, + 0x00108557, 0x00108557, 0x00108557, 0x00108557, + 0x00108557, 0x00108557, 0x0010855e, 0x00108557, + 0x0010855e, 0x0010855e, 0x00108557, 0x00108557, + 0x00108557, 0x00108557, 0x00108557, 0x0010855e, + 0x00108557, 0x00108557, 0x00108557, 0x00108557, + 0x00108557, 0x00108557, 0x00108557, 0x00108557, + 0x00108557, 0x0010855e, 0x0010855e, 0x00108557, + 0x00108557, 0x00108557, 0x00108557, 0x00108557, + 0x00108557, 0x00108557, 0x00108557, 0x00108557, + 0x0010855e, 0x00108557, 0x00108557, 0x0010855e, + 0x0010855e, 0x00108557, 0x0010855e, 0x0010855e, + 0x00108557, 0x00108557, 0x00108557, 0x00108557, + 0x0010855e, 0x00108557, 0x00108557, 0x00108557, + 0x0010855e, 0x00108557, 0x00108557, 0x00108557, + 0x0010855e, 0x00108557, 0x00108557, 0x00108557, + 0x0010855e, 0x00108557, 0x0010855e, 0x00108557, + 0x00108557, 0x00108557, 0x00108557, 0x00108557, + 0x00108557, 0x00108557, 0x00108557, 0x0201f800, + 0x0010032e, 0x4a026203, 0x00000001, 0x493a6403, + 0x0201f000, 0x00106d1c, 0x4933c857, 0x4a026203, + 0x00000001, 0x493a6403, 0x0201f000, 0x00106d1c, + 0x59300403, 0x82003480, 0x00000058, 0x02021800, + 0x0010032e, 0x83383580, 0x00000013, 0x040000aa, + 0x83383580, 0x00000027, 0x04020058, 0x4933c857, + 0x0201f800, 0x00106d91, 0x0201f800, 0x0010b827, + 0x0201f800, 0x001099c7, 0x04000010, 0x0201f800, + 0x001099e2, 0x0400004b, 0x59300403, 0x82000d80, + 0x00000022, 0x04020042, 0x42000000, 0x00000205, + 0x0201f800, 0x0010817e, 0x0400003d, 0x0401fc1e, + 0x0400003f, 0x0401f03f, 0x42000000, 0x00000203, + 0x0201f800, 0x0010817e, 0x04000035, 0x0201f800, + 0x00101cb7, 0x42000800, 0x00000007, 0x0201f800, + 0x001045ea, 0x0401f917, 0x4d440000, 0x59368c03, + 0x83440580, 0x000007fe, 0x04020008, 0x59a8121b, + 0x84081540, 0x0201f800, 0x001050f7, 0x04020002, + 0x8408154a, 0x480b521b, 0x42028000, 0x00000029, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ff80, + 0x5c027800, 0x836c0580, 0x00000003, 0x0400000c, + 0x5932680a, 0x59340008, 0x800001c0, 0x04020008, + 0x59368c03, 0x4933c857, 0x4937c857, 0x4947c857, + 0x0201f800, 0x001046a8, 0x0401f00c, 0x42000000, + 0x0010cf23, 0x0201f800, 0x0010bfb3, 0x42003000, + 0x00000015, 0x41782800, 0x42002000, 0x00000003, + 0x0201f800, 0x0010a22a, 0x5c028800, 0x0201f800, + 0x00109bf9, 0x0201f000, 0x00020b9d, 0x1c01f000, + 0x0401f8e4, 0x0401f7fa, 0x83380580, 0x00000014, + 0x0400000c, 0x4933c857, 0x0201f800, 0x00107226, + 0x02020000, 0x00107f37, 0x59300203, 0x82000580, + 0x00000002, 0x04000109, 0x0201f800, 0x0010032e, + 0x4933c857, 0x0201f800, 0x00106d91, 0x0201f800, + 0x0010b827, 0x42002800, 0x00000002, 0x59300403, + 0x82000580, 0x00000051, 0x02000000, 0x0010a3f8, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ff80, + 0x5c027800, 0x42003000, 0x00000016, 0x41782800, + 0x4d400000, 0x4d440000, 0x59368c03, 0x42002000, + 0x00000009, 0x42028000, 0x00000029, 0x0201f800, + 0x0010a22a, 0x5c028800, 0x5c028000, 0x42000000, + 0x0010cf23, 0x0201f800, 0x0010bfb3, 0x0201f800, + 0x001099c7, 0x0402000c, 0x0201f800, 0x00101cb7, + 0x0401f8ac, 0x59340c03, 0x82040580, 0x000007fe, + 0x040207bf, 0x59a80a1b, 0x84040d40, 0x4807521b, + 0x0401f7bb, 0x0201f800, 0x001099e2, 0x04020003, + 0x0401f8a0, 0x0401f7b6, 0x59300403, 0x82000d80, + 0x00000032, 0x04020004, 0x0201f800, 0x00102309, + 0x0401f7af, 0x82000d80, 0x00000022, 0x04000895, + 0x0401f7ab, 0x4933c857, 0x4803c857, 0x0c01f001, + 0x00108681, 0x00108681, 0x00108681, 0x00108681, + 0x00108681, 0x00108681, 0x00108678, 0x00108678, + 0x00108678, 0x00108678, 0x00108678, 0x00108678, + 0x00108678, 0x00108678, 0x00108678, 0x00108678, + 0x00108678, 0x00108678, 0x00108678, 0x00108678, + 0x00108678, 0x00108678, 0x00108678, 0x00108678, + 0x00108678, 0x00108678, 0x00108678, 0x00108678, + 0x00108678, 0x00108678, 0x00108685, 0x001086a2, + 0x00108678, 0x001086a2, 0x001086a2, 0x00108678, + 0x00108678, 0x00108678, 0x00108678, 0x00108678, + 0x001086a2, 0x001086a2, 0x00108678, 0x00108678, + 0x00108678, 0x00108678, 0x00108678, 0x00108678, + 0x00108678, 0x00108678, 0x00108693, 0x001086a2, + 0x00108678, 0x0010868c, 0x00108678, 0x00108678, + 0x00108678, 0x0010868c, 0x00108678, 0x00108678, + 0x00108678, 0x001086a2, 0x0010868f, 0x00108678, + 0x0010867a, 0x001086a2, 0x00108678, 0x001086a2, + 0x001086a2, 0x00108678, 0x00108678, 0x00108678, + 0x00108678, 0x001086a2, 0x00108678, 0x00108678, + 0x00108678, 0x001086a2, 0x00108678, 0x00108678, + 0x00108678, 0x001086a2, 0x00108678, 0x00108678, + 0x00108678, 0x001086a2, 0x00108678, 0x001086a2, + 0x00108678, 0x00108678, 0x00108678, 0x00108678, + 0x00108678, 0x00108678, 0x00108678, 0x00108678, + 0x0201f800, 0x0010032e, 0x4d2c0000, 0x59325809, + 0x0201f800, 0x000203ef, 0x5c025800, 0x0201f000, + 0x00020b9d, 0x4a026203, 0x00000002, 0x0201f000, + 0x00109a67, 0x4a026203, 0x00000005, 0x59a8002c, + 0x48026205, 0x59a8002a, 0x48026006, 0x1c01f000, + 0x59300827, 0x49780a05, 0x0401f014, 0x0201f800, + 0x00109bf9, 0x0201f000, 0x00020b9d, 0x0201f800, + 0x00102309, 0x0201f800, 0x00106e41, 0x04000005, + 0x0201f800, 0x00106d91, 0x0201f000, 0x00020b9d, + 0x0201f800, 0x00106d91, 0x0201f800, 0x00020b9d, + 0x0201f000, 0x00106e2e, 0x4933c857, 0x4a026203, + 0x00000002, 0x59a8002a, 0x48026006, 0x1c01f000, + 0x4933c857, 0x0201f800, 0x0010989f, 0x0400002e, + 0x4d2c0000, 0x0201f800, 0x00109f51, 0x0402000a, + 0x4d400000, 0x42028000, 0x00000031, 0x42000800, + 0x00000004, 0x0201f800, 0x00109d2a, 0x5c028000, + 0x0401f020, 0x59300c07, 0x82040580, 0x00000010, + 0x04000004, 0x82040580, 0x00000011, 0x0402000a, + 0x4a025a07, 0x00000031, 0x4a02580e, 0x00000004, + 0x4a02580f, 0x000000ff, 0x0201f800, 0x000203ef, + 0x0401f010, 0x592c0405, 0x8c00051e, 0x0400000d, + 0x4a025a05, 0x00000103, 0x4a025806, 0x01000000, + 0x4da00000, 0x4cec0000, 0x5931d82a, 0x58ef400a, + 0x58ec0008, 0x0801f800, 0x5c01d800, 0x5c034000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x83340580, + 0x0010e23c, 0x0402000c, 0x83380d80, 0x00000015, + 0x04000005, 0x83380d80, 0x00000016, 0x02020000, + 0x00107f37, 0x0201f800, 0x0010b82a, 0x0201f000, + 0x00020b9d, 0x59340400, 0x82000500, 0x000000ff, 0x82003480, 0x0000000c, 0x02021800, 0x0010032e, 0x59303403, 0x82180d80, 0x0000004d, 0x02000000, - 0x00109a30, 0x82180d80, 0x00000033, 0x02000000, - 0x001099e5, 0x82180d80, 0x00000028, 0x02000000, - 0x001097ec, 0x82180d80, 0x00000029, 0x02000000, - 0x00109801, 0x82180d80, 0x00000057, 0x02000000, - 0x0010a105, 0x82180d80, 0x0000001f, 0x02000000, - 0x00107f1a, 0x82180d80, 0x00000055, 0x02000000, - 0x00107ef3, 0x82180d80, 0x00000000, 0x04000554, - 0x82180d80, 0x00000022, 0x02000000, 0x00107f47, - 0x82180d80, 0x00000035, 0x02000000, 0x00108077, - 0x82180d80, 0x00000039, 0x040004f0, 0x82180d80, - 0x0000003d, 0x02000000, 0x00107fab, 0x82180d80, - 0x00000044, 0x02000000, 0x00107fe8, 0x82180d80, - 0x00000049, 0x02000000, 0x0010803e, 0x82180d80, - 0x00000041, 0x02000000, 0x0010802a, 0x82180d80, - 0x00000043, 0x02000000, 0x00109b94, 0x82180d80, - 0x00000051, 0x02000000, 0x00109c07, 0x82180d80, + 0x00109c68, 0x82180d80, 0x00000033, 0x02000000, + 0x00109c1d, 0x82180d80, 0x00000028, 0x02000000, + 0x00109a24, 0x82180d80, 0x00000029, 0x02000000, + 0x00109a39, 0x82180d80, 0x00000057, 0x02000000, + 0x0010a342, 0x82180d80, 0x0000001f, 0x02000000, + 0x00108117, 0x82180d80, 0x00000055, 0x02000000, + 0x001080f0, 0x82180d80, 0x00000000, 0x04000545, + 0x82180d80, 0x00000022, 0x02000000, 0x00108144, + 0x82180d80, 0x00000035, 0x02000000, 0x0010827c, + 0x82180d80, 0x00000039, 0x040004e1, 0x82180d80, + 0x0000003d, 0x02000000, 0x001081b0, 0x82180d80, + 0x00000044, 0x02000000, 0x001081ed, 0x82180d80, + 0x00000049, 0x02000000, 0x00108243, 0x82180d80, + 0x00000041, 0x02000000, 0x0010822f, 0x82180d80, + 0x00000043, 0x02000000, 0x00109dcc, 0x82180d80, + 0x00000051, 0x02000000, 0x00109e3f, 0x82180d80, 0x00000004, 0x04020003, 0x42000000, 0x00000001, 0x83380d80, 0x00000015, 0x04000006, 0x83380d80, - 0x00000016, 0x02020000, 0x00107d3d, 0x0401f289, - 0x4c000000, 0x0201f800, 0x0010b4ff, 0x5c000000, + 0x00000016, 0x02020000, 0x00107f37, 0x0401f28d, + 0x4c000000, 0x0201f800, 0x0010b82a, 0x5c000000, 0x4d2c0000, 0x4d3c0000, 0x0c01f804, 0x5c027800, - 0x5c025800, 0x1c01f000, 0x0010854a, 0x0010854e, - 0x0010854a, 0x001085c3, 0x0010854a, 0x00108711, - 0x001087c7, 0x0010854a, 0x0010854a, 0x00108778, - 0x0010854a, 0x0010878a, 0x4933c857, 0x497a6008, + 0x5c025800, 0x1c01f000, 0x0010875e, 0x00108762, + 0x0010875e, 0x001087d7, 0x0010875e, 0x00108929, + 0x001089df, 0x0010875e, 0x0010875e, 0x00108990, + 0x0010875e, 0x001089a2, 0x4933c857, 0x497a6008, 0x59300809, 0x58040000, 0x4a000a05, 0x00000103, 0x0201f000, 0x00020b9d, 0x4933c857, 0x40000000, 0x40000000, 0x1c01f000, 0x4933c857, 0x0201f800, - 0x0010481c, 0x59a8005a, 0x82000580, 0x00000074, - 0x0402005b, 0x0201f800, 0x0010adf8, 0x04020014, - 0x0401f85b, 0x0201f800, 0x00109667, 0x0400000c, - 0x0201f800, 0x00109d13, 0x04020009, 0x41780800, + 0x0010491c, 0x59a8005a, 0x82000580, 0x00000074, + 0x0402005b, 0x0201f800, 0x0010b107, 0x04020014, + 0x0401f85b, 0x0201f800, 0x0010989f, 0x0400000c, + 0x0201f800, 0x00109f51, 0x04020009, 0x41780800, 0x4d400000, 0x42028000, 0x00000000, 0x0201f800, - 0x00109af2, 0x5c028000, 0x0401f003, 0x0201f800, - 0x00101cb2, 0x0201f000, 0x00020b9d, 0x0201f800, - 0x00109667, 0x04000007, 0x0201f800, 0x00109d13, - 0x04020004, 0x0401ff31, 0x0201f000, 0x00020b9d, - 0x417a7800, 0x0201f800, 0x0010fc72, 0x42000000, - 0x0010cc23, 0x0201f800, 0x0010bc88, 0x59340200, + 0x00109d2a, 0x5c028000, 0x0401f003, 0x0201f800, + 0x00101cb7, 0x0201f000, 0x00020b9d, 0x0201f800, + 0x0010989f, 0x04000007, 0x0201f800, 0x00109f51, + 0x04020004, 0x0401ff23, 0x0201f000, 0x00020b9d, + 0x417a7800, 0x0201f800, 0x0010ff80, 0x42000000, + 0x0010cf23, 0x0201f800, 0x0010bfb3, 0x59340200, 0x84000558, 0x48026a00, 0x42003000, 0x00000003, - 0x0201f800, 0x0010b412, 0x4d300000, 0x0201f800, - 0x00107cfe, 0x02000800, 0x0010032e, 0x4926601c, + 0x0201f800, 0x0010b73d, 0x4d300000, 0x0201f800, + 0x00107ef8, 0x02000800, 0x0010032e, 0x4926601c, 0x4936600a, 0x497a6009, 0x4a026407, 0x00000001, 0x4a026403, 0x00000001, 0x59240400, 0x8c00050a, 0x04020011, 0x4a026407, 0x00000004, 0x4a026203, 0x00000007, 0x4a026429, 0x00000001, 0x42003000, 0x00000001, 0x4d400000, 0x42028000, 0x00000029, - 0x41782800, 0x0201f800, 0x0010ae7c, 0x5c028000, + 0x41782800, 0x0201f800, 0x0010b18b, 0x5c028000, 0x0401f009, 0x42000800, 0x0000000b, 0x0201f800, - 0x001044f1, 0x4a026203, 0x00000001, 0x0201f800, - 0x00106b17, 0x5c026000, 0x0401fef8, 0x0201f800, - 0x00101cb2, 0x0201f000, 0x00020b9d, 0x0401fef3, - 0x42000000, 0x00000001, 0x0401f11b, 0x4933c857, + 0x001045ea, 0x4a026203, 0x00000001, 0x0201f800, + 0x00106d1c, 0x5c026000, 0x0401feea, 0x0201f800, + 0x00101cb7, 0x0201f000, 0x00020b9d, 0x0401fee5, + 0x42000000, 0x00000001, 0x0401f11f, 0x4933c857, 0x59340200, 0x8c000500, 0x0400000c, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x001044e6, 0x5c027800, + 0x417a7800, 0x0201f800, 0x001045df, 0x5c027800, 0x8d0e1d20, 0x04000005, 0x42000800, 0x00000006, - 0x0201f800, 0x001044f1, 0x1c01f000, 0x4933c857, + 0x0201f800, 0x001045ea, 0x1c01f000, 0x4933c857, 0x59a8085a, 0x82040580, 0x00000074, 0x0400000e, - 0x4807c857, 0x82040580, 0x00000100, 0x040200e8, - 0x59cc0408, 0x4803c857, 0x8c000500, 0x040000e4, + 0x4807c857, 0x82040580, 0x00000100, 0x040200ec, + 0x59cc0408, 0x4803c857, 0x8c000500, 0x040000e8, 0x59341403, 0x82080580, 0x000007fe, 0x04000006, - 0x0401f0df, 0x59341403, 0x82080580, 0x000007fe, - 0x04020018, 0x59a8021b, 0x8c000506, 0x04000013, + 0x0401f0e3, 0x59341403, 0x82080580, 0x000007fe, + 0x0402001c, 0x59a8021b, 0x8c000506, 0x04000013, 0x59cc0000, 0x82000500, 0x000000ff, 0x59240c08, - 0x80040580, 0x0400000d, 0x0201f800, 0x00101cb2, - 0x0201f800, 0x00020b9d, 0x42000000, 0x0010cc14, - 0x0201f800, 0x0010bc88, 0x4202d800, 0x00000001, - 0x0201f000, 0x00104011, 0x0401fb20, 0x0401f067, - 0x41780800, 0x0201f800, 0x001045e8, 0x59341403, + 0x80040580, 0x0400000d, 0x0201f800, 0x00101cb7, + 0x0201f800, 0x00020b9d, 0x42000000, 0x0010cf14, + 0x0201f800, 0x0010bfb3, 0x4202d800, 0x00000001, + 0x0201f000, 0x0010410a, 0x0201f800, 0x0010c0e8, + 0x02020000, 0x0010a474, 0x0401fb20, 0x0401f067, + 0x41780800, 0x0201f800, 0x001046e4, 0x59341403, 0x82080580, 0x000007fc, 0x04020039, 0x4a026802, - 0x00fffffc, 0x0201f800, 0x00109667, 0x04000012, - 0x0201f800, 0x00109d13, 0x0402000f, 0x0401f8ec, + 0x00fffffc, 0x0201f800, 0x0010989f, 0x04000012, + 0x0201f800, 0x00109f51, 0x0402000f, 0x0401f8ec, 0x41780800, 0x4d400000, 0x42028000, 0x00000000, - 0x0201f800, 0x00109af2, 0x5c028000, 0x42000800, - 0x00000004, 0x0201f800, 0x001044f1, 0x0201f000, + 0x0201f800, 0x00109d2a, 0x5c028000, 0x42000800, + 0x00000004, 0x0201f800, 0x001045ea, 0x0201f000, 0x00020b9d, 0x42000800, 0x00000004, 0x0201f800, - 0x001044f1, 0x0201f800, 0x00101cb2, 0x59300c26, + 0x001045ea, 0x0201f800, 0x00101cb7, 0x59300c26, 0x82040580, 0x00000021, 0x04000005, 0x82040580, 0x00000051, 0x02020000, 0x00020b9d, 0x0201f800, - 0x00101f51, 0x42028800, 0x000007fd, 0x42003000, - 0x00fffffd, 0x0201f800, 0x0010452c, 0x02020800, + 0x00101fb4, 0x42028800, 0x000007fd, 0x42003000, + 0x00fffffd, 0x0201f800, 0x00104628, 0x02020800, 0x0010032e, 0x4936600a, 0x497a6c12, 0x4a02601d, 0x00000003, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000022, 0x0201f000, 0x00106b17, 0x59a80070, - 0x8c000502, 0x04000011, 0x0201f800, 0x00104fc6, + 0x00000022, 0x0201f000, 0x00106d1c, 0x59a80070, + 0x8c000502, 0x04000011, 0x0201f800, 0x001050f7, 0x42001000, 0x00000010, 0x04020009, 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000006, 0x42001000, 0x00000008, 0x0201f800, - 0x00104c17, 0x04020072, 0x0201f800, 0x00109667, - 0x04000073, 0x0201f800, 0x00109d13, 0x04020005, + 0x00104d1c, 0x04020072, 0x0201f800, 0x0010989f, + 0x04000073, 0x0201f800, 0x00109f51, 0x04020005, 0x592c0405, 0x8c00051c, 0x040207af, 0x0401f8a0, - 0x42000800, 0x00000005, 0x0201f800, 0x001044f1, + 0x42000800, 0x00000005, 0x0201f800, 0x001045ea, 0x4a026203, 0x00000001, 0x4a026403, 0x00000003, - 0x0201f000, 0x00106b17, 0x59cc0408, 0x8c000518, - 0x0400001b, 0x0201f800, 0x00109980, 0x0201f800, - 0x00104fc6, 0x04000009, 0x59cc0408, 0x8c000516, + 0x0201f000, 0x00106d1c, 0x59cc0408, 0x8c000518, + 0x0400001b, 0x0201f800, 0x00109bb8, 0x0201f800, + 0x001050f7, 0x04000009, 0x59cc0408, 0x8c000516, 0x04000006, 0x59300426, 0x82000580, 0x00000021, 0x04020795, 0x1c01f000, 0x59a8021b, 0x8400054a, 0x4803521b, 0x4803541b, 0x59a8000f, 0x497b8830, @@ -23155,34 +23341,34 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00000021, 0x04020788, 0x1c01f000, 0x42001000, 0x000000ef, 0x59a80078, 0x8c00053e, 0x04000005, 0x59a8021b, 0x8c000516, 0x04000002, 0x59a8100f, - 0x42024800, 0x0010ccd1, 0x480a4805, 0x480b500f, + 0x42024800, 0x0010cfd1, 0x480a4805, 0x480b500f, 0x497b8830, 0x84081570, 0x480b8832, 0x0201f800, - 0x001099aa, 0x59a8021b, 0x84000548, 0x4803521b, - 0x4803541b, 0x0201f800, 0x0010ae51, 0x0402076e, + 0x00109be2, 0x59a8021b, 0x84000548, 0x4803521b, + 0x4803541b, 0x0201f800, 0x0010b160, 0x0402076e, 0x599c0019, 0x8c000510, 0x0402003d, 0x59a8021b, 0x8400054c, 0x4803521b, 0x42000800, 0x00000007, - 0x0201f800, 0x001044f1, 0x417a7800, 0x0201f800, - 0x001044e6, 0x42003800, 0x000000ef, 0x42000000, - 0x000000e8, 0x0201f800, 0x00105f68, 0x02000800, - 0x0010452c, 0x02020800, 0x0010032e, 0x4936600a, + 0x0201f800, 0x001045ea, 0x417a7800, 0x0201f800, + 0x001045df, 0x42003800, 0x000000ef, 0x42000000, + 0x000000e8, 0x0201f800, 0x00106134, 0x02000800, + 0x00104628, 0x02020800, 0x0010032e, 0x4936600a, 0x59340200, 0x8400051a, 0x48026a00, 0x42000800, - 0x00000003, 0x0201f800, 0x001044f1, 0x4a026407, + 0x00000003, 0x0201f800, 0x001045ea, 0x4a026407, 0x00000001, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000002, 0x0201f000, 0x00106b17, 0x0401fdef, + 0x00000002, 0x0201f000, 0x00106d1c, 0x0401fddd, 0x42000000, 0x00000001, 0x0401f017, 0x599c0017, 0x8c00050a, 0x04000793, 0x42000800, 0x00000004, - 0x0201f800, 0x001044f1, 0x49375065, 0x59a8021b, + 0x0201f800, 0x001045ea, 0x49375065, 0x59a8021b, 0x8c000508, 0x0400000a, 0x599c0018, 0x8c00051c, 0x04000007, 0x42000800, 0x000003e8, 0x42001000, - 0x00110694, 0x0201f800, 0x00106433, 0x0201f000, + 0x00110987, 0x0201f800, 0x00106638, 0x0201f000, 0x00020b9d, 0x4933c857, 0x80003540, 0x04000005, - 0x42000800, 0x00000007, 0x0201f800, 0x001044f1, + 0x42000800, 0x00000007, 0x0201f800, 0x001045ea, 0x801831c0, 0x04020012, 0x59302009, 0x801021c0, 0x04000004, 0x58100405, 0x8c00051e, 0x0402000c, 0x59341c03, 0x42002000, 0x00000004, 0x42003000, 0x00000012, 0x4d200000, 0x59364013, 0x81224130, - 0x0201f800, 0x00103931, 0x5c024000, 0x0201f800, - 0x00101cb2, 0x0201f000, 0x00020b9d, 0x4c5c0000, + 0x0201f800, 0x00103a21, 0x5c024000, 0x0201f800, + 0x00101cb7, 0x0201f000, 0x00020b9d, 0x4c5c0000, 0x4d2c0000, 0x59325809, 0x0201f800, 0x00020864, 0x5c025800, 0x59cc0008, 0x48002805, 0x59cc0009, 0x48002806, 0x49782807, 0x49782808, 0x49782809, @@ -23194,155 +23380,155 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x59cc041a, 0x900001c0, 0x4800280a, 0x5c00b800, 0x1c01f000, 0x4933c857, 0x59a8005a, 0x82000580, 0x00000014, 0x0402004c, 0x59a80070, 0x8c000502, - 0x04000015, 0x0201f800, 0x00104fc6, 0x42001000, + 0x04000015, 0x0201f800, 0x001050f7, 0x42001000, 0x00000010, 0x04020009, 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, 0x0400000a, - 0x42001000, 0x00000008, 0x0201f800, 0x00104c17, + 0x42001000, 0x00000008, 0x0201f800, 0x00104d1c, 0x04000005, 0x59a80070, 0x8400054c, 0x48035070, 0x0401f035, 0x836c0580, 0x00000003, 0x0402000f, 0x59300009, 0x80000540, 0x0402000c, 0x59341c03, 0x42002000, 0x00000006, 0x42003000, 0x00000013, 0x4d200000, 0x59364013, 0x81224130, 0x0201f800, - 0x00103931, 0x5c024000, 0x0201f800, 0x00104652, - 0x0401fe73, 0x0401fad5, 0x0402001f, 0x59340404, + 0x00103a21, 0x5c024000, 0x0201f800, 0x00104752, + 0x0401fe6f, 0x0401fae3, 0x0402001f, 0x59340404, 0x80000540, 0x0400001c, 0x42000800, 0x00000006, - 0x0201f800, 0x001044f1, 0x0201f800, 0x00109667, - 0x04000011, 0x0201f800, 0x00109d13, 0x0402000a, + 0x0201f800, 0x001045ea, 0x0201f800, 0x0010989f, + 0x04000011, 0x0201f800, 0x00109f51, 0x0402000a, 0x41780800, 0x4d400000, 0x42028000, 0x00000000, - 0x0201f800, 0x00109af2, 0x5c028000, 0x0201f000, + 0x0201f800, 0x00109d2a, 0x5c028000, 0x0201f000, 0x00020b9d, 0x4a025a05, 0x00000103, 0x4a025806, - 0x02000000, 0x0201f800, 0x00101cb2, 0x0201f000, - 0x00020b9d, 0x0201f800, 0x00104bb9, 0x0201f800, - 0x00109667, 0x04000007, 0x0201f800, 0x00109d13, - 0x04020004, 0x0401fd39, 0x0201f000, 0x00020b9d, - 0x0401fd36, 0x0201f800, 0x0010b4ff, 0x80000580, + 0x02000000, 0x0201f800, 0x00101cb7, 0x0201f000, + 0x00020b9d, 0x0201f800, 0x00104cbe, 0x0201f800, + 0x0010989f, 0x04000007, 0x0201f800, 0x00109f51, + 0x04020004, 0x0401fd27, 0x0201f000, 0x00020b9d, + 0x0401fd24, 0x0201f800, 0x0010b82a, 0x80000580, 0x59a80070, 0x8c00050c, 0x04000005, 0x8400050c, 0x48035070, 0x82000540, 0x00000001, 0x0401f756, 0x4933c857, 0x59a8005a, 0x82000580, 0x00000014, 0x0402000b, 0x42000800, 0x0000000b, 0x0201f800, - 0x001044f1, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000001, 0x0201f000, 0x00106b17, 0x42000000, + 0x001045ea, 0x4a026203, 0x00000001, 0x4a026403, + 0x00000001, 0x0201f000, 0x00106d1c, 0x42000000, 0x00000001, 0x0401f744, 0x4933c857, 0x40003000, 0x59a8005a, 0x82000580, 0x00000004, 0x04020022, 0x82183580, 0x0000000b, 0x0402001d, 0x5930081c, - 0x58040200, 0x8c000500, 0x02000000, 0x0010a1b4, + 0x58040200, 0x8c000500, 0x02000000, 0x0010a3f1, 0x58040200, 0x8c000508, 0x04000011, 0x84000508, 0x48000a00, 0x42000800, 0x00000003, 0x0201f800, - 0x001044f1, 0x5930080a, 0x49780806, 0x4a026202, + 0x001045ea, 0x5930080a, 0x49780806, 0x4a026202, 0x0000ffff, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000051, 0x0201f000, 0x00106b17, 0x42000800, - 0x00000007, 0x0201f800, 0x001044f1, 0x0201f000, + 0x00000051, 0x0201f000, 0x00106d1c, 0x42000800, + 0x00000007, 0x0201f800, 0x001045ea, 0x0201f000, 0x00020b9d, 0x42000000, 0x00000001, 0x0401f71a, 0x4803c857, 0x4d2c0000, 0x4d3c0000, 0x0c01f804, - 0x5c027800, 0x5c025800, 0x1c01f000, 0x0010854a, - 0x001087d6, 0x0010854a, 0x00108833, 0x0010854a, - 0x001088a4, 0x001087c7, 0x0010854a, 0x0010854a, - 0x001088c8, 0x0010854a, 0x001088da, 0x4933c857, + 0x5c027800, 0x5c025800, 0x1c01f000, 0x0010875e, + 0x001089ee, 0x0010875e, 0x00108a4b, 0x0010875e, + 0x00108abc, 0x001089df, 0x0010875e, 0x0010875e, + 0x00108ae0, 0x0010875e, 0x00108af2, 0x4933c857, 0x4d1c0000, 0x59301403, 0x82080580, 0x00000003, 0x04000008, 0x82081580, 0x0000001e, 0x04020003, 0x0201f800, 0x00020b9d, 0x5c023800, 0x1c01f000, 0x0401ff3d, 0x0401f7fd, 0x4933c857, 0x42000000, - 0x0010cc27, 0x0201f800, 0x0010bc88, 0x0201f800, - 0x0010b4ff, 0x0201f800, 0x0010481c, 0x0201f800, - 0x00109667, 0x0400000b, 0x0201f800, 0x00109d13, + 0x0010cf27, 0x0201f800, 0x0010bfb3, 0x0201f800, + 0x0010b82a, 0x0201f800, 0x0010491c, 0x0201f800, + 0x0010989f, 0x0400000b, 0x0201f800, 0x00109f51, 0x04020008, 0x4200b000, 0x00000002, 0x0201f800, - 0x00109cf2, 0x0401fcb9, 0x0201f000, 0x00020b9d, + 0x00109f30, 0x0401fca7, 0x0201f000, 0x00020b9d, 0x0401f910, 0x04020030, 0x417a7800, 0x0201f800, - 0x001044e6, 0x417a7800, 0x0201f800, 0x0010fc72, - 0x42000000, 0x0010cc23, 0x0201f800, 0x0010bc88, + 0x001045df, 0x417a7800, 0x0201f800, 0x0010ff80, + 0x42000000, 0x0010cf23, 0x0201f800, 0x0010bfb3, 0x59340200, 0x84000558, 0x48026a00, 0x4a026403, 0x00000002, 0x42003000, 0x00000003, 0x0201f800, - 0x0010b412, 0x59240400, 0x8c00050a, 0x04020011, + 0x0010b73d, 0x59240400, 0x8c00050a, 0x04020011, 0x4d400000, 0x41782800, 0x42003000, 0x00000005, - 0x42028000, 0x00000029, 0x0201f800, 0x0010ae7c, + 0x42028000, 0x00000029, 0x0201f800, 0x0010b18b, 0x5c028000, 0x4a026203, 0x00000007, 0x4a026407, 0x00000004, 0x4a026429, 0x00000001, 0x1c01f000, - 0x42000800, 0x00000003, 0x0201f800, 0x001044f1, - 0x4a026203, 0x00000001, 0x0201f800, 0x00106b17, + 0x42000800, 0x00000003, 0x0201f800, 0x001045ea, + 0x4a026203, 0x00000001, 0x0201f800, 0x00106d1c, 0x0401f7f7, 0x59cc0407, 0x82000580, 0x00000009, 0x0402000a, 0x59340412, 0x82000500, 0x000000ff, 0x0400000c, 0x80000040, 0x48026c12, 0x4a026006, 0x0000000a, 0x0401f7ea, 0x59cc0207, 0x82000500, 0x0000ff00, 0x82000580, 0x00001900, 0x040007c2, - 0x0401fc72, 0x80000580, 0x0401f69b, 0x4933c857, - 0x0201f800, 0x00109667, 0x04000011, 0x0201f800, - 0x00109d13, 0x0402000e, 0x4c580000, 0x4200b000, - 0x00000002, 0x0201f800, 0x00109cf2, 0x5c00b000, - 0x0401fc62, 0x42000800, 0x00000007, 0x0201f800, - 0x001044f1, 0x0201f000, 0x00020b9d, 0x59340403, + 0x0401fc60, 0x80000580, 0x0401f69b, 0x4933c857, + 0x0201f800, 0x0010989f, 0x04000011, 0x0201f800, + 0x00109f51, 0x0402000e, 0x4c580000, 0x4200b000, + 0x00000002, 0x0201f800, 0x00109f30, 0x5c00b000, + 0x0401fc50, 0x42000800, 0x00000007, 0x0201f800, + 0x001045ea, 0x0201f000, 0x00020b9d, 0x59340403, 0x82000580, 0x000007fc, 0x04020007, 0x42000000, - 0x00000004, 0x0201f800, 0x00107f81, 0x04000023, - 0x0401f032, 0x0401fc51, 0x59cc3407, 0x82183500, + 0x00000004, 0x0201f800, 0x0010817e, 0x04000023, + 0x0401f032, 0x0401fc3f, 0x59cc3407, 0x82183500, 0x000000ff, 0x82180580, 0x00000005, 0x04000020, 0x82180580, 0x0000000b, 0x04000018, 0x59cc0207, 0x82000500, 0x0000ff00, 0x04020004, 0x82180580, 0x00000009, 0x04000016, 0x82000580, 0x00001900, 0x0402000e, 0x82180580, 0x00000009, 0x04000010, - 0x42000800, 0x00000004, 0x0201f800, 0x001044f1, - 0x0201f800, 0x00101cb2, 0x0201f800, 0x0010b4ff, - 0x0201f000, 0x00020b9d, 0x0201f800, 0x0010b4ff, + 0x42000800, 0x00000004, 0x0201f800, 0x001045ea, + 0x0201f800, 0x00101cb7, 0x0201f800, 0x0010b82a, + 0x0201f000, 0x00020b9d, 0x0201f800, 0x0010b82a, 0x42000000, 0x00000001, 0x0401f657, 0x0201f800, - 0x00109667, 0x59325809, 0x04000008, 0x592c0205, + 0x0010989f, 0x59325809, 0x04000008, 0x592c0205, 0x82000580, 0x00000139, 0x040007f4, 0x592c0405, 0x8c00051e, 0x040207f1, 0x59340412, 0x800001c0, 0x04000008, 0x80000040, 0x48026c12, 0x4a026006, 0x0000000a, 0x4a026403, 0x00000016, 0x1c01f000, 0x59340403, 0x82000580, 0x000007fe, 0x04020007, 0x59a8021b, 0x84000540, 0x4803521b, 0x0201f800, - 0x00104146, 0x0401f7dd, 0x0201f800, 0x0010b4ff, - 0x417a7800, 0x0201f800, 0x0010fc72, 0x42003000, - 0x00000005, 0x0201f800, 0x0010b412, 0x42000000, - 0x0010cc23, 0x0201f800, 0x0010bc88, 0x0401f7d1, + 0x0010423f, 0x0401f7dd, 0x0201f800, 0x0010b82a, + 0x417a7800, 0x0201f800, 0x0010ff80, 0x42003000, + 0x00000005, 0x0201f800, 0x0010b73d, 0x42000000, + 0x0010cf23, 0x0201f800, 0x0010bfb3, 0x0401f7d1, 0x4933c857, 0x0401f865, 0x0402000b, 0x42000800, - 0x00000005, 0x0201f800, 0x001044f1, 0x4a026203, + 0x00000005, 0x0201f800, 0x001045ea, 0x4a026203, 0x00000001, 0x4a026403, 0x00000003, 0x0201f000, - 0x00106b17, 0x42000800, 0x00000004, 0x0201f800, - 0x001044f1, 0x0201f800, 0x00109d13, 0x0402000b, + 0x00106d1c, 0x42000800, 0x00000004, 0x0201f800, + 0x001045ea, 0x0201f800, 0x00109f51, 0x0402000b, 0x4c580000, 0x4200b000, 0x00000002, 0x0201f800, - 0x00109cf2, 0x5c00b000, 0x0201f800, 0x001084a2, - 0x0201f000, 0x00020b9d, 0x0201f800, 0x001084a2, - 0x0201f800, 0x0010b4ff, 0x80000580, 0x0401f606, + 0x00109f30, 0x5c00b000, 0x0201f800, 0x001086a8, + 0x0201f000, 0x00020b9d, 0x0201f800, 0x001086a8, + 0x0201f800, 0x0010b82a, 0x80000580, 0x0401f606, 0x4933c857, 0x0401f841, 0x0402000b, 0x42000800, - 0x00000009, 0x0201f800, 0x001044f1, 0x4a026203, + 0x00000009, 0x0201f800, 0x001045ea, 0x4a026203, 0x00000001, 0x4a026403, 0x00000005, 0x0201f000, - 0x00106b17, 0x0201f800, 0x0010b4ff, 0x42000000, + 0x00106d1c, 0x0201f800, 0x0010b82a, 0x42000000, 0x00000001, 0x0401f5f4, 0x4933c857, 0x5930081c, - 0x58040200, 0x8c000500, 0x02000000, 0x0010a1b4, + 0x58040200, 0x8c000500, 0x02000000, 0x0010a3f1, 0x0401f82a, 0x0402000b, 0x42000800, 0x0000000b, - 0x0201f800, 0x001044f1, 0x4a026203, 0x00000001, - 0x4a026403, 0x00000001, 0x0201f000, 0x00106b17, + 0x0201f800, 0x001045ea, 0x4a026203, 0x00000001, + 0x4a026403, 0x00000001, 0x0201f000, 0x00106d1c, 0x5930080a, 0x58040403, 0x82000580, 0x000007fe, 0x04020007, 0x42002800, 0x00000003, 0x0201f800, - 0x0010a1bb, 0x0201f000, 0x00020b9d, 0x0201f800, - 0x0010b4ff, 0x42000000, 0x00000001, 0x0401f5d2, + 0x0010a3f8, 0x0201f000, 0x00020b9d, 0x0201f800, + 0x0010b82a, 0x42000000, 0x00000001, 0x0401f5d2, 0x4933c857, 0x59cc0407, 0x82000580, 0x00000003, 0x04020009, 0x59cc0207, 0x82000500, 0x0000ff00, 0x82000d80, 0x00002a00, 0x04000003, 0x82000d80, 0x00001e00, 0x1c01f000, 0x4933c857, 0x82000540, 0x00000001, 0x1c01f000, 0x4933c857, 0x4d400000, 0x4c580000, 0x42028000, 0x00000000, 0x0201f800, - 0x00101f51, 0x59a8021b, 0x82000540, 0x00000003, - 0x4803521b, 0x0401f893, 0x04000005, 0x4d300000, - 0x4d340000, 0x4d440000, 0x0401f02b, 0x0401f8c8, + 0x00101fb4, 0x59a8021b, 0x82000540, 0x00000003, + 0x4803521b, 0x0401f8a1, 0x04000005, 0x4d300000, + 0x4d340000, 0x4d440000, 0x0401f02b, 0x0401f8d6, 0x04000032, 0x4d300000, 0x4d340000, 0x4d440000, - 0x83240580, 0x0010ccd1, 0x04020025, 0x59cc0408, - 0x8c00051e, 0x04020009, 0x42000800, 0x0010ccd1, + 0x83240580, 0x0010cfd1, 0x04020025, 0x59cc0408, + 0x8c00051e, 0x04020009, 0x42000800, 0x0010cfd1, 0x58040406, 0x8c000500, 0x04020004, 0x59a8021b, 0x84000552, 0x4803521b, 0x59240400, 0x8c00050a, 0x04020009, 0x42028000, 0x0000002a, 0x42028800, 0x0000ffff, 0x42003000, 0x00000002, 0x0201f800, - 0x0010b427, 0x42028000, 0x0000002a, 0x4d3c0000, - 0x42027800, 0x00000200, 0x0201f800, 0x0010fbe5, - 0x5c027800, 0x42000000, 0x0010cc23, 0x0201f800, - 0x0010bc88, 0x0201f800, 0x00101df2, 0x0201f800, - 0x00102020, 0x42028000, 0x00000002, 0x5c028800, + 0x0010b752, 0x42028000, 0x0000002a, 0x4d3c0000, + 0x42027800, 0x00000200, 0x0201f800, 0x0010fef2, + 0x5c027800, 0x42000000, 0x0010cf23, 0x0201f800, + 0x0010bfb3, 0x0201f800, 0x00101e2e, 0x0201f800, + 0x00102087, 0x42028000, 0x00000002, 0x5c028800, 0x5c026800, 0x5c026000, 0x41780800, 0x0201f800, - 0x001045e8, 0x59cc0800, 0x82040d00, 0x00ffffff, + 0x001046e4, 0x59cc0800, 0x82040d00, 0x00ffffff, 0x59240200, 0x82000540, 0x00000066, 0x48024a00, 0x48064805, 0x812000f0, 0x80040540, 0x48026813, 0x812241c0, 0x04020007, 0x4c040000, 0x42000000, - 0x00000001, 0x0201f800, 0x00104d11, 0x5c000800, - 0x4927c857, 0x83240580, 0x0010ccd1, 0x0402003e, + 0x00000001, 0x0201f800, 0x00104e36, 0x5c000800, + 0x4927c857, 0x83240580, 0x0010cfd1, 0x0402001e, 0x59a8121b, 0x59cc0408, 0x8c00051a, 0x04020005, 0x84081514, 0x4a0370e5, 0x00000800, 0x0401f004, 0x84081554, 0x4a0370e5, 0x00000c00, 0x480b521b, @@ -23350,481 +23536,488 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x59a80a1b, 0x84040d50, 0x59cc0013, 0x8c00053e, 0x04000003, 0x8c000536, 0x04000004, 0x59cc0017, 0x8c000536, 0x04020002, 0x84040d10, 0x4807521b, - 0x4807541b, 0x59a8021b, 0x8c000506, 0x0400000f, - 0x836c0580, 0x00000003, 0x04000004, 0x83240580, - 0x0010ccd1, 0x0400000f, 0x59240400, 0x8c00050c, - 0x0400000c, 0x4a026426, 0x00000021, 0x0201f800, - 0x00109cbc, 0x0401f007, 0x4c040000, 0x0201f800, - 0x0010a190, 0x0201f800, 0x00101f00, 0x5c000800, - 0x0201f800, 0x00104fc6, 0x04000007, 0x59cc0009, - 0x48035028, 0x59cc000a, 0x48035029, 0x0201f800, - 0x00109980, 0x5c00b000, 0x5c028000, 0x1c01f000, - 0x4933c857, 0x59a8141b, 0x82080580, 0x0000ffff, - 0x0400000c, 0x4c080000, 0x0201f800, 0x00104fc6, - 0x5c001000, 0x0402000b, 0x59cc0408, 0x8c000518, - 0x04000005, 0x8c08150a, 0x0400000b, 0x80000580, - 0x1c01f000, 0x8c081508, 0x040207fd, 0x0401f006, - 0x82080500, 0x00000030, 0x04020003, 0x8c081506, - 0x040207f7, 0x4a03541b, 0x0000ffff, 0x42000000, - 0x0010cb70, 0x0201f800, 0x0010bc88, 0x42003000, - 0x0000000c, 0x42001800, 0x0000ffff, 0x42002000, - 0x00000007, 0x4d200000, 0x417a4000, 0x0201f800, - 0x00103931, 0x5c024000, 0x4d400000, 0x4d3c0000, - 0x42003000, 0x00000001, 0x0201f800, 0x0010b427, - 0x42028000, 0x0000002a, 0x42027800, 0x00000200, - 0x0201f800, 0x0010fbe5, 0x5c028000, 0x5c027800, - 0x82000540, 0x00000001, 0x1c01f000, 0x4933c857, - 0x4c580000, 0x59a80018, 0x800001c0, 0x04000029, - 0x59341806, 0x800c19c0, 0x04000026, 0x820c1d80, - 0xdeaddead, 0x04000021, 0x59cc1000, 0x82081500, - 0x00ffff00, 0x80081110, 0x80080580, 0x04000004, - 0x42000000, 0x0010cc06, 0x0401f016, 0x83cc1400, - 0x0000000b, 0x4200b000, 0x00000002, 0x83341c00, - 0x00000006, 0x0401f830, 0x04000004, 0x42000000, - 0x0010cc07, 0x0401f00b, 0x83cc1400, 0x0000000d, - 0x4200b000, 0x00000002, 0x83341c00, 0x00000008, - 0x0401f825, 0x04000007, 0x42000000, 0x0010cc08, - 0x0201f800, 0x0010bc88, 0x82000540, 0x00000001, - 0x5c00b000, 0x1c01f000, 0x4933c857, 0x59cc0206, - 0x82000580, 0x00000014, 0x04020016, 0x59cc0407, - 0x82000580, 0x00000800, 0x04020012, 0x59cc0207, - 0x8c00051a, 0x0400000d, 0x82000500, 0x00000f00, - 0x82000580, 0x00000100, 0x04020008, 0x59cc020a, - 0x8c000508, 0x04020003, 0x8c00050a, 0x04000003, - 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, - 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, - 0x480bc857, 0x480fc857, 0x485bc857, 0x50080800, - 0x500c0000, 0x80042580, 0x04020007, 0x80081000, - 0x800c1800, 0x8058b040, 0x040207f9, 0x80000580, - 0x1c01f000, 0x4803c857, 0x4807c857, 0x480bc857, - 0x480fc857, 0x80040480, 0x04001006, 0x42000000, - 0x00000001, 0x82040d40, 0x00000001, 0x1c01f000, - 0x41780000, 0x0401f7fc, 0x83380480, 0x00000053, - 0x02021800, 0x0010032e, 0x83380480, 0x0000004b, - 0x02001800, 0x0010032e, 0x0c01f001, 0x00108a61, - 0x00108a61, 0x00108a61, 0x00108a61, 0x00108a5f, - 0x00108a5f, 0x00108a5f, 0x00108a61, 0x0201f800, - 0x0010032e, 0x493bc857, 0x4a026203, 0x0000000d, - 0x493a6403, 0x42000800, 0x80000000, 0x0201f000, - 0x00020b3e, 0x83380580, 0x00000013, 0x04020008, - 0x59300403, 0x82000580, 0x00000050, 0x02020800, - 0x0010032e, 0x0201f000, 0x00020b9d, 0x4933c857, - 0x83380580, 0x00000027, 0x04020030, 0x4933c857, - 0x0201f800, 0x00106b8c, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010fc72, 0x5c027800, 0x42000000, - 0x0010cc23, 0x0201f800, 0x0010bc88, 0x4d2c0000, - 0x59325809, 0x0201f800, 0x00109667, 0x492fc857, - 0x0400000d, 0x4a025a05, 0x00000103, 0x59300c02, - 0x48065c07, 0x4a025a07, 0x00000029, 0x497a580a, - 0x592c0c09, 0x84040d50, 0x48065c09, 0x0201f800, - 0x000203ef, 0x5c025800, 0x42003000, 0x00000015, - 0x41782800, 0x42002000, 0x00000003, 0x4d400000, - 0x4d440000, 0x59368c03, 0x42028000, 0x00000029, - 0x0201f800, 0x00109fec, 0x5c028800, 0x5c028000, - 0x0201f000, 0x00020b9d, 0x83380580, 0x00000014, - 0x0402000d, 0x59300403, 0x82000c80, 0x00000053, - 0x02021800, 0x0010032e, 0x82000480, 0x00000040, - 0x02001800, 0x0010032e, 0x4933c857, 0x4803c857, - 0x0c01f00e, 0x83380580, 0x00000053, 0x0400000a, - 0x83380580, 0x00000048, 0x02020800, 0x0010032e, - 0x59300403, 0x82000580, 0x00000050, 0x02020800, - 0x0010032e, 0x1c01f000, 0x00108ad7, 0x00108ad5, - 0x00108ad5, 0x00108ad5, 0x00108ad5, 0x00108ad5, - 0x00108ad5, 0x00108ad5, 0x00108ad5, 0x00108ad5, - 0x00108ad5, 0x00108aee, 0x00108aee, 0x00108aee, - 0x00108aee, 0x00108ad5, 0x00108aee, 0x00108ad5, - 0x00108aee, 0x0201f800, 0x0010032e, 0x4933c857, - 0x0201f800, 0x00106b8c, 0x0201f800, 0x00109667, - 0x02000000, 0x00020b9d, 0x4d2c0000, 0x59325809, - 0x4a025a05, 0x00000103, 0x59300402, 0x48025c07, - 0x4a025a07, 0x00000006, 0x497a580a, 0x0201f800, - 0x000203ef, 0x5c025800, 0x0201f800, 0x0010977c, - 0x0201f000, 0x00020b9d, 0x4933c857, 0x0201f800, - 0x00106b8c, 0x0201f000, 0x00020b9d, 0x0201f800, - 0x0010032e, 0x5930001d, 0x800001c0, 0x02020800, - 0x00109fda, 0x59300004, 0x8c00053e, 0x04020033, - 0x0201f800, 0x0010a0b0, 0x040200ce, 0x59325809, - 0x592c0c09, 0x59cc2808, 0x82141d00, 0x00000c00, - 0x04000002, 0x59cc1809, 0x84040d58, 0x48065c09, - 0x82143500, 0x00000fff, 0x0402002e, 0x59340200, - 0x8c00050e, 0x040200b4, 0x0201f800, 0x00020c5a, - 0x04020008, 0x4a025a07, 0x00000000, 0x59300012, - 0x0201f800, 0x0010a0a5, 0x80000d40, 0x04020a02, - 0x4a025a05, 0x00000103, 0x48065808, 0x480e580b, - 0x901409c0, 0x4806580a, 0x59300c02, 0x48065c07, - 0x0201f800, 0x00109d18, 0x0201f800, 0x00109d1d, - 0x0201f800, 0x000203ef, 0x0201f800, 0x001048bd, - 0x59cc0008, 0x8c000518, 0x02020000, 0x0010984f, - 0x0201f000, 0x00020b9d, 0x0201f800, 0x00107021, - 0x040007cc, 0x4d3c0000, 0x42027800, 0x00000002, - 0x0201f800, 0x001091f1, 0x5c027800, 0x0401f7c5, - 0x4817c857, 0x480fc857, 0x82180500, 0x000000ff, - 0x0400000e, 0x592c0205, 0x82000500, 0x000000ff, - 0x82000580, 0x00000048, 0x04020008, 0x592c0408, - 0x800001c0, 0x04000005, 0x0201f800, 0x00109ec6, - 0x0201f000, 0x00109f0a, 0x82180d00, 0x00000c00, - 0x04000004, 0x59340200, 0x8c00050e, 0x0402005f, - 0x4a025a07, 0x00000000, 0x41782000, 0x8c183510, - 0x04000009, 0x59cc200b, 0x801021c0, 0x04000006, - 0x59cc000c, 0x82000500, 0x000000ff, 0x04000002, - 0x4803c857, 0x4812580d, 0x41780000, 0x8c183512, - 0x04000002, 0x59cc000a, 0x4802580c, 0x80100c00, - 0x040007aa, 0x82041480, 0x0000001d, 0x04001006, - 0x592c0405, 0x8c00051e, 0x04000027, 0x42000800, - 0x0000001c, 0x4c040000, 0x4c0c0000, 0x4c140000, + 0x4807541b, 0x59cc0408, 0x8c000518, 0x04000023, + 0x59a8021b, 0x8c000506, 0x04000016, 0x836c0580, + 0x00000003, 0x04000004, 0x83240580, 0x0010cfd1, + 0x0400001a, 0x59240400, 0x8c00050c, 0x04020008, + 0x4c040000, 0x42000000, 0x00000001, 0x0201f800, + 0x00104e36, 0x5c000800, 0x0401f010, 0x4a026426, + 0x00000021, 0x0201f800, 0x00109efa, 0x0401f00b, + 0x0201f800, 0x0010c0f4, 0x04020008, 0x4c040000, + 0x0201f800, 0x0010a3cd, 0x41781800, 0x0201f800, + 0x00101f63, 0x5c000800, 0x0201f800, 0x001050f7, + 0x04000007, 0x59cc0009, 0x48035028, 0x59cc000a, + 0x48035029, 0x0201f800, 0x00109bb8, 0x5c00b000, + 0x5c028000, 0x1c01f000, 0x4933c857, 0x59a8141b, + 0x82080580, 0x0000ffff, 0x0400000c, 0x4c080000, + 0x0201f800, 0x001050f7, 0x5c001000, 0x0402000b, + 0x59cc0408, 0x8c000518, 0x04000005, 0x8c08150a, + 0x0400000b, 0x80000580, 0x1c01f000, 0x8c081508, + 0x040207fd, 0x0401f006, 0x82080500, 0x00000030, + 0x04020003, 0x8c081506, 0x040207f7, 0x4a03541b, + 0x0000ffff, 0x42000000, 0x0010ce70, 0x0201f800, + 0x0010bfb3, 0x42003000, 0x0000000c, 0x42001800, + 0x0000ffff, 0x42002000, 0x00000007, 0x4d200000, + 0x417a4000, 0x0201f800, 0x00103a21, 0x5c024000, + 0x4d400000, 0x4d3c0000, 0x42003000, 0x00000001, + 0x0201f800, 0x0010b752, 0x42028000, 0x0000002a, + 0x42027800, 0x00000200, 0x0201f800, 0x0010fef2, + 0x5c028000, 0x5c027800, 0x82000540, 0x00000001, + 0x1c01f000, 0x4933c857, 0x4c580000, 0x59a80018, + 0x800001c0, 0x04000029, 0x59341806, 0x800c19c0, + 0x04000026, 0x820c1d80, 0xdeaddead, 0x04000021, + 0x59cc1000, 0x82081500, 0x00ffff00, 0x80081110, + 0x80080580, 0x04000004, 0x42000000, 0x0010cf06, + 0x0401f016, 0x83cc1400, 0x0000000b, 0x4200b000, + 0x00000002, 0x83341c00, 0x00000006, 0x0401f830, + 0x04000004, 0x42000000, 0x0010cf07, 0x0401f00b, + 0x83cc1400, 0x0000000d, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000008, 0x0401f825, 0x04000007, + 0x42000000, 0x0010cf08, 0x0201f800, 0x0010bfb3, + 0x82000540, 0x00000001, 0x5c00b000, 0x1c01f000, + 0x4933c857, 0x59cc0206, 0x82000580, 0x00000014, + 0x04020016, 0x59cc0407, 0x82000580, 0x00000800, + 0x04020012, 0x59cc0207, 0x8c00051a, 0x0400000d, + 0x82000500, 0x00000f00, 0x82000580, 0x00000100, + 0x04020008, 0x59cc020a, 0x8c000508, 0x04020003, + 0x8c00050a, 0x04000003, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x1c01f000, 0x5c000000, + 0x4c000000, 0x4803c857, 0x480bc857, 0x480fc857, + 0x485bc857, 0x50080800, 0x500c0000, 0x80042580, + 0x04020007, 0x80081000, 0x800c1800, 0x8058b040, + 0x040207f9, 0x80000580, 0x1c01f000, 0x4803c857, + 0x4807c857, 0x480bc857, 0x480fc857, 0x80040480, + 0x04001006, 0x42000000, 0x00000001, 0x82040d40, + 0x00000001, 0x1c01f000, 0x41780000, 0x0401f7fc, + 0x83380480, 0x00000053, 0x02021800, 0x0010032e, + 0x83380480, 0x0000004b, 0x02001800, 0x0010032e, + 0x0c01f001, 0x00108c87, 0x00108c87, 0x00108c87, + 0x00108c87, 0x00108c85, 0x00108c85, 0x00108c85, + 0x00108c87, 0x0201f800, 0x0010032e, 0x493bc857, + 0x4a026203, 0x0000000d, 0x493a6403, 0x42000800, + 0x80000000, 0x0201f000, 0x00020b3e, 0x83380580, + 0x00000013, 0x04020008, 0x59300403, 0x82000580, + 0x00000050, 0x02020800, 0x0010032e, 0x0201f000, + 0x00020b9d, 0x4933c857, 0x83380580, 0x00000027, + 0x04020030, 0x4933c857, 0x0201f800, 0x00106d91, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ff80, + 0x5c027800, 0x42000000, 0x0010cf23, 0x0201f800, + 0x0010bfb3, 0x4d2c0000, 0x59325809, 0x0201f800, + 0x0010989f, 0x492fc857, 0x0400000d, 0x4a025a05, + 0x00000103, 0x59300c02, 0x48065c07, 0x4a025a07, + 0x00000029, 0x497a580a, 0x592c0c09, 0x84040d50, + 0x48065c09, 0x0201f800, 0x000203ef, 0x5c025800, + 0x42003000, 0x00000015, 0x41782800, 0x42002000, + 0x00000003, 0x4d400000, 0x4d440000, 0x59368c03, + 0x42028000, 0x00000029, 0x0201f800, 0x0010a22a, + 0x5c028800, 0x5c028000, 0x0201f000, 0x00020b9d, + 0x83380580, 0x00000014, 0x0402000d, 0x59300403, + 0x82000c80, 0x00000053, 0x02021800, 0x0010032e, + 0x82000480, 0x00000040, 0x02001800, 0x0010032e, + 0x4933c857, 0x4803c857, 0x0c01f00e, 0x83380580, + 0x00000053, 0x0400000a, 0x83380580, 0x00000048, + 0x02020800, 0x0010032e, 0x59300403, 0x82000580, + 0x00000050, 0x02020800, 0x0010032e, 0x1c01f000, + 0x00108cfd, 0x00108cfb, 0x00108cfb, 0x00108cfb, + 0x00108cfb, 0x00108cfb, 0x00108cfb, 0x00108cfb, + 0x00108cfb, 0x00108cfb, 0x00108cfb, 0x00108d14, + 0x00108d14, 0x00108d14, 0x00108d14, 0x00108cfb, + 0x00108d14, 0x00108cfb, 0x00108d14, 0x0201f800, + 0x0010032e, 0x4933c857, 0x0201f800, 0x00106d91, + 0x0201f800, 0x0010989f, 0x02000000, 0x00020b9d, + 0x4d2c0000, 0x59325809, 0x4a025a05, 0x00000103, + 0x59300402, 0x48025c07, 0x4a025a07, 0x00000006, + 0x497a580a, 0x0201f800, 0x000203ef, 0x5c025800, + 0x0201f800, 0x001099b4, 0x0201f000, 0x00020b9d, + 0x4933c857, 0x0201f800, 0x00106d91, 0x0201f000, + 0x00020b9d, 0x0201f800, 0x0010032e, 0x5930001d, + 0x800001c0, 0x02020800, 0x0010a218, 0x59300004, + 0x8c00053e, 0x04020033, 0x0201f800, 0x0010a2ed, + 0x040200ce, 0x59325809, 0x592c0c09, 0x59cc2808, + 0x82141d00, 0x00000c00, 0x04000002, 0x59cc1809, + 0x84040d58, 0x48065c09, 0x82143500, 0x00000fff, + 0x0402002e, 0x59340200, 0x8c00050e, 0x040200b4, 0x0201f800, 0x00020c5a, 0x04020008, 0x4a025a07, - 0x00000000, 0x59300012, 0x0201f800, 0x0010a0a5, - 0x80000d40, 0x040209a0, 0x5c002800, 0x5c001800, - 0x4a025a05, 0x00000103, 0x48065808, 0x480e580b, - 0x901409c0, 0x4806580a, 0x5c000800, 0x4c500000, - 0x4c540000, 0x83cca400, 0x0000000c, 0x832cac00, - 0x0000000e, 0x0201f800, 0x00109186, 0x5c00a800, - 0x5c00a000, 0x59300008, 0x84000534, 0x48026008, - 0x0401f78e, 0x4c040000, 0x4c0c0000, 0x4c140000, - 0x0201f800, 0x00020c5a, 0x04020008, 0x4a025a07, - 0x00000000, 0x59300012, 0x0201f800, 0x0010a0a5, - 0x80000d40, 0x0402097c, 0x48065808, 0x5c002800, - 0x5c001800, 0x59301402, 0x480a5c07, 0x480e580b, - 0x901401c0, 0x4802580a, 0x0201f800, 0x00109d18, - 0x5c000800, 0x0201f800, 0x00109130, 0x0201f800, - 0x0010916b, 0x0401f779, 0x592c020b, 0x8c000502, - 0x040007a0, 0x592c0209, 0x8c00050e, 0x0402079d, - 0x59300012, 0x800c0d80, 0x0400079a, 0x4803c857, - 0x480fc857, 0x8c183514, 0x02000000, 0x0010988f, - 0x80000540, 0x04000793, 0x4807c856, 0x0201f000, - 0x0010988f, 0x592c020b, 0x8c000502, 0x0400074b, - 0x59300012, 0x800001c0, 0x0400074b, 0x592c0209, - 0x8c00050e, 0x04020748, 0x0201f000, 0x0010988f, - 0x1c01f000, 0x59cc2006, 0x59cc2807, 0x0401f044, - 0x0401f043, 0x1c01f000, 0x4933c857, 0x59300004, - 0x8c00053e, 0x04020039, 0x5930001d, 0x800001c0, - 0x02020800, 0x00109fda, 0x59325809, 0x592c0c09, - 0x41782800, 0x41781800, 0x84040d58, 0x48065c09, - 0x41783000, 0x59340200, 0x8c00050e, 0x0402001f, - 0x0201f800, 0x00020c5a, 0x04020009, 0x4a025a07, - 0x00000000, 0x59300012, 0x0201f800, 0x0010a0a5, - 0x80000d40, 0x4807c857, 0x0402092b, 0x4a025a05, - 0x00000103, 0x48065808, 0x480e580b, 0x901409c0, - 0x4806580a, 0x4933c857, 0x59300c02, 0x48065c07, - 0x0201f800, 0x00109d18, 0x0201f800, 0x00109d1d, - 0x0201f800, 0x000203ef, 0x0201f800, 0x001048bd, - 0x0201f000, 0x00020b9d, 0x592c020b, 0x8c000502, - 0x040007e0, 0x59300012, 0x4803c857, 0x800001c0, - 0x040007df, 0x592c0209, 0x8c00050e, 0x040207dc, - 0x0201f000, 0x0010988f, 0x0201f800, 0x00107021, - 0x040007c6, 0x4933c857, 0x1c01f000, 0x4c5c0000, - 0x4c600000, 0x4010b800, 0x4014c000, 0x5930001d, - 0x800001c0, 0x4c140000, 0x02020800, 0x00109fda, - 0x5c002800, 0x59325809, 0x592c020b, 0x8c000502, - 0x04020030, 0x8c000500, 0x04000035, 0x4a026203, - 0x00000002, 0x4a026403, 0x00000043, 0x405c0000, - 0x592c0810, 0x80040c80, 0x40600000, 0x80040480, - 0x04001028, 0x8060c1c0, 0x0400001e, 0x59300004, - 0x8c00050e, 0x04000008, 0x59300a22, 0x82040500, - 0x00000003, 0x4c140000, 0x0c01f823, 0x5c002800, - 0x04000014, 0x59300004, 0x8c00053e, 0x0402000c, - 0x485e6014, 0x48626012, 0x497a6205, 0x5c00c000, - 0x5c00b800, 0x0201f800, 0x00100d97, 0x0402000f, - 0x59300804, 0x0201f000, 0x00020b30, 0x4c140000, - 0x0201f800, 0x00107021, 0x5c002800, 0x040007f1, - 0x5c00c000, 0x5c00b800, 0x0201f000, 0x00107d3d, - 0x5c00c000, 0x5c00b800, 0x4933c857, 0x1c01f000, - 0x4807c857, 0x4004c000, 0x0401f7d7, 0x4803c857, - 0x0401f7f4, 0x00108c5f, 0x00108c65, 0x00108c6b, - 0x00108c5d, 0x0201f800, 0x0010032e, 0x59300223, - 0x48035077, 0x82000400, 0x00000008, 0x48035076, - 0x0401f00c, 0x59300223, 0x48035076, 0x82000400, - 0x00000008, 0x48035077, 0x0401f006, 0x59300223, - 0x82000400, 0x00000008, 0x48035076, 0x48035077, - 0x405c1000, 0x41780800, 0x59a80076, 0x0201f800, - 0x00106a98, 0x800409c0, 0x0402003c, 0x40085000, - 0x592c1001, 0x800811c0, 0x04000038, 0x58080205, - 0x82000500, 0x000000ff, 0x82000580, 0x0000004a, - 0x04020032, 0x48281002, 0x59a80076, 0x40601000, - 0x41780800, 0x4c280000, 0x0201f800, 0x00106a98, - 0x5c005000, 0x800409c0, 0x0402001f, 0x40041800, - 0x59a80077, 0x800c1c00, 0x80081040, 0x040207fe, - 0x480e6029, 0x592c4801, 0x802449c0, 0x02000800, - 0x0010032e, 0x58240a06, 0x592c1812, 0x59303022, - 0x8c183506, 0x04000003, 0x40280000, 0x80040c00, - 0x800400e0, 0x80040540, 0x48026020, 0x8c18350a, - 0x04020003, 0x40280000, 0x800c1c00, 0x480e601e, - 0x59300223, 0x48026423, 0x82000540, 0x00000001, - 0x1c01f000, 0x592c1810, 0x405c0000, 0x80600400, - 0x800c0580, 0x040007de, 0x4933c857, 0x485fc857, - 0x4863c857, 0x480fc857, 0x80000580, 0x1c01f000, - 0x83380480, 0x00000058, 0x04021005, 0x83380480, - 0x00000040, 0x04001002, 0x0c01f002, 0x1c01f000, - 0x00108cd4, 0x00108cd4, 0x00108cd4, 0x00108cd4, - 0x00108cd4, 0x00108cd4, 0x00108cd4, 0x00108cd4, - 0x00108cd4, 0x00108cd4, 0x00108cd6, 0x00108cd4, - 0x00108cd4, 0x00108cd4, 0x00108cd4, 0x00108ce3, - 0x00108cd4, 0x00108cd4, 0x00108cd4, 0x00108cd4, - 0x00108d11, 0x00108cd4, 0x00108cd4, 0x00108cd4, - 0x0201f800, 0x0010032e, 0x4933c857, 0x0201f800, - 0x00106e75, 0x4a026203, 0x00000002, 0x59a8002c, - 0x48026205, 0x59300012, 0x59300816, 0x80040c80, - 0x48066016, 0x0201f000, 0x00106b6c, 0x4933c857, - 0x0201f800, 0x00106b6c, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010fc72, 0x5c027800, 0x42000000, - 0x0010cc23, 0x0201f800, 0x0010bc88, 0x0201f800, - 0x00109667, 0x04000010, 0x4d2c0000, 0x59325809, - 0x4a025a05, 0x00000103, 0x59300402, 0x48025c07, - 0x4a025a07, 0x00000029, 0x497a580a, 0x592c0c09, - 0x84040d50, 0x48065c09, 0x0201f800, 0x000203ef, - 0x5c025800, 0x42003000, 0x00000014, 0x41782800, - 0x4d400000, 0x4d440000, 0x59368c03, 0x42002000, - 0x00000002, 0x42028000, 0x00000029, 0x0201f800, - 0x00109fec, 0x5c028800, 0x5c028000, 0x0201f000, - 0x00020b9d, 0x4933c857, 0x59300809, 0x4978080a, - 0x4978080b, 0x58041409, 0x84081558, 0x48080c09, - 0x1c01f000, 0x4807c857, 0x8c040d3e, 0x04020024, - 0x497a5a07, 0x59300028, 0x80000540, 0x04000018, - 0x497a5a07, 0x4c040000, 0x4c080000, 0x4c0c0000, - 0x4c100000, 0x4c140000, 0x40002800, 0x58141003, - 0x40040000, 0x80081480, 0x48082803, 0x40140000, - 0x0201f800, 0x00100aeb, 0x5c002800, 0x5c002000, - 0x5c001800, 0x5c001000, 0x5c000800, 0x592c0207, - 0x80000540, 0x04020009, 0x0401f005, 0x592c0409, - 0x8c00051c, 0x04000002, 0x592c0803, 0x4807c857, - 0x4a025a07, 0x00000015, 0x1c01f000, 0x59300028, - 0x80000540, 0x04000009, 0x4a025a07, 0x00000011, - 0x59300028, 0x4c040000, 0x0201f800, 0x00100aeb, - 0x5c000800, 0x0401f7f5, 0x4807c856, 0x4a025a07, - 0x00000007, 0x1c01f000, 0x83380480, 0x00000058, - 0x04021007, 0x83380480, 0x00000040, 0x04001004, - 0x4d2c0000, 0x0c01f803, 0x5c025800, 0x1c01f000, - 0x00108d70, 0x00108d70, 0x00108d70, 0x00108d70, - 0x00108d70, 0x00108d73, 0x00108d72, 0x00108d70, - 0x00108df8, 0x00108d70, 0x00108d70, 0x00108d70, - 0x00108d70, 0x00108d70, 0x00108d70, 0x00108d70, - 0x00108d70, 0x00108d70, 0x00108d70, 0x00108ed4, - 0x00108f04, 0x00108edc, 0x00108d72, 0x00108f10, - 0x0201f800, 0x0010032e, 0x1c01f000, 0x5930001d, - 0x800001c0, 0x02020800, 0x00109fda, 0x59300008, - 0x8c00050e, 0x0400007e, 0x8c000500, 0x04000070, - 0x8c00051c, 0x04000009, 0x84000500, 0x48026008, - 0x59325809, 0x592c3c09, 0x841c3d58, 0x481e5c09, - 0x0201f000, 0x00020c00, 0x59325809, 0x592c3c09, - 0x841c3d58, 0x59300008, 0x8c00051c, 0x040207f3, - 0x481e5c09, 0x42000000, 0x00000005, 0x40000000, - 0x80000040, 0x040207fe, 0x59300008, 0x8c00051c, - 0x040207ea, 0x59cc0808, 0x592c0205, 0x82000500, - 0x000000ff, 0x82000580, 0x00000048, 0x0402000c, - 0x497a580c, 0x82040500, 0x000000ff, 0x04000008, - 0x592c0408, 0x800001c0, 0x04000005, 0x0201f800, - 0x00109ec6, 0x0201f000, 0x00100c27, 0x900421c0, - 0x4812580a, 0x41782000, 0x82040500, 0x00000c00, - 0x04000002, 0x59cc2009, 0x82043500, 0x00000fff, - 0x04020027, 0x481e5c09, 0x4a025a07, 0x00000000, - 0x801831c0, 0x02000000, 0x00100c27, 0x41782000, - 0x8c183510, 0x04000002, 0x59cc200b, 0x4812580d, + 0x00000000, 0x59300012, 0x0201f800, 0x0010a2e2, + 0x80000d40, 0x04020a02, 0x4a025a05, 0x00000103, + 0x48065808, 0x480e580b, 0x901409c0, 0x4806580a, + 0x59300c02, 0x48065c07, 0x0201f800, 0x00109f56, + 0x0201f800, 0x00109f5b, 0x0201f800, 0x000203ef, + 0x0201f800, 0x001049bd, 0x59cc0008, 0x8c000518, + 0x02020000, 0x00109a87, 0x0201f000, 0x00020b9d, + 0x0201f800, 0x00107226, 0x040007cc, 0x4d3c0000, + 0x42027800, 0x00000002, 0x0201f800, 0x00109425, + 0x5c027800, 0x0401f7c5, 0x4817c857, 0x480fc857, + 0x82180500, 0x000000ff, 0x0400000e, 0x592c0205, + 0x82000500, 0x000000ff, 0x82000580, 0x00000048, + 0x04020008, 0x592c0408, 0x800001c0, 0x04000005, + 0x0201f800, 0x0010a104, 0x0201f000, 0x0010a148, + 0x82180d00, 0x00000c00, 0x04000004, 0x59340200, + 0x8c00050e, 0x0402005f, 0x4a025a07, 0x00000000, + 0x41782000, 0x8c183510, 0x04000009, 0x59cc200b, + 0x801021c0, 0x04000006, 0x59cc000c, 0x82000500, + 0x000000ff, 0x04000002, 0x4803c857, 0x4812580d, 0x41780000, 0x8c183512, 0x04000002, 0x59cc000a, - 0x4802580c, 0x80100c00, 0x02001800, 0x0010032e, - 0x02000000, 0x00100c27, 0x82041480, 0x0000001d, - 0x0402100c, 0x4c500000, 0x4c540000, 0x83cca400, - 0x0000000c, 0x832cac00, 0x0000000e, 0x0401fbb7, - 0x5c00a800, 0x5c00a000, 0x0201f000, 0x00100c27, - 0x0401fb5c, 0x0201f000, 0x00100c27, 0x412c7800, - 0x0201f800, 0x00100583, 0x02000800, 0x0010032e, - 0x492c780a, 0x841c3d52, 0x481c7c09, 0x4a025a05, - 0x00000103, 0x4812580b, 0x900401c0, 0x4802580a, - 0x583c0405, 0x583c1006, 0x583c2209, 0x48025c05, - 0x480a5806, 0x48125a09, 0x0401f7c7, 0x8c000524, - 0x04000792, 0x59325809, 0x4c000000, 0x592c0409, - 0x8c00051c, 0x5c000000, 0x04020003, 0x4a026012, - 0xffffffff, 0x84000524, 0x0401f788, 0x1c01f000, - 0x59a8002c, 0x48026205, 0x59325809, 0x4a026203, - 0x00000002, 0x592c2409, 0x59300808, 0x4933c857, - 0x4807c857, 0x592c0205, 0x82000500, 0x000000ff, - 0x82000580, 0x00000048, 0x04020004, 0x8c102500, - 0x02020000, 0x00109f0a, 0x4a025a07, 0x00000000, - 0x8c040d1e, 0x04000037, 0x41780800, 0x497a580a, - 0x592c1c0a, 0x59300008, 0x8c00052c, 0x04000003, - 0x4a026012, 0x7fffffff, 0x59300012, 0x59341200, - 0x497a6205, 0x8c08150e, 0x0402007b, 0x4807c857, - 0x4806580b, 0x0201f800, 0x0010a0a5, 0x80000d40, - 0x04020ef9, 0x59300402, 0x48025c07, 0x48065808, - 0x4a025a05, 0x00000103, 0x4c040000, 0x592c0a09, - 0x8c040d12, 0x04000003, 0x4a025a07, 0x0000000c, - 0x5c000800, 0x4c040000, 0x4c0c0000, 0x4c100000, - 0x0201f800, 0x00109d18, 0x5c002000, 0x5c001800, - 0x5c000800, 0x8c102512, 0x0402001c, 0x4c0c0000, - 0x0201f800, 0x00109d1d, 0x0201f800, 0x000203ef, - 0x0201f800, 0x001048bd, 0x5c001800, 0x8c0c1d18, - 0x02000000, 0x00020b9d, 0x0201f000, 0x0010984f, - 0x4813c857, 0x8c102518, 0x0400004d, 0x41780800, - 0x592c1c0a, 0x820c0580, 0x00001000, 0x040007c6, - 0x8c102512, 0x040007c4, 0x592c780a, 0x583c080b, - 0x583c1c0a, 0x0401f7c0, 0x4807c857, 0x592c780a, - 0x59300402, 0x592c1405, 0x8c08151e, 0x0402000d, - 0x592c1207, 0x48007c07, 0x48047808, 0x48087a07, - 0x84102512, 0x48107c09, 0x4c0c0000, 0x0201f800, - 0x0010059d, 0x403e5800, 0x0401fb09, 0x0401f7d9, - 0x48025c07, 0x48065808, 0x583c080d, 0x583c000c, - 0x80040c00, 0x82041480, 0x0000001d, 0x04001006, - 0x583c1001, 0x480a5801, 0x49787801, 0x42000800, - 0x0000001c, 0x82040c00, 0x00000014, 0x4c0c0000, - 0x4c500000, 0x4c540000, 0x823ca400, 0x00000009, - 0x832cac00, 0x00000009, 0x4c100000, 0x4c3c0000, - 0x0401fb0a, 0x5c007800, 0x5c002000, 0x5c00a800, - 0x5c00a000, 0x84102512, 0x48125c09, 0x403e5800, - 0x0201f800, 0x0010059d, 0x0201f800, 0x00109d18, - 0x42034000, 0x0010c7ff, 0x59a1d806, 0x80edd9c0, - 0x02000800, 0x0010032e, 0x48efc857, 0x58ec0008, - 0x4803c857, 0x0801f800, 0x0401f7aa, 0x4933c857, - 0x1c01f000, 0x59301415, 0x480bc857, 0x8c08151c, - 0x0402000e, 0x80000540, 0x4803c857, 0x04000780, - 0x80042c80, 0x0402177e, 0x8c081514, 0x04020005, - 0x592c0810, 0x4807c857, 0x80040480, 0x48026017, - 0x8408155c, 0x480a6415, 0x59301008, 0x8408151e, - 0x480a6008, 0x4c100000, 0x4c3c0000, 0x4d400000, - 0x592e8207, 0x4a025a07, 0x00000001, 0x0201f800, - 0x00109d18, 0x49425a07, 0x5c028000, 0x5c007800, - 0x5c002000, 0x497a580a, 0x8c102512, 0x04000006, - 0x4d2c0000, 0x403e5800, 0x0201f800, 0x0010059d, - 0x5c025800, 0x82102500, 0xffffedff, 0x48125c09, - 0x59301006, 0x800811c0, 0x02000000, 0x0010988f, - 0x59a8002c, 0x80080480, 0x02021000, 0x0010988f, - 0x4a025a05, 0x00000103, 0x4a025a07, 0x00000006, - 0x497a5c0a, 0x492fc857, 0x0201f800, 0x000203ef, - 0x0201f800, 0x001048bd, 0x0201f000, 0x00020b9d, - 0x59325809, 0x592c0409, 0x8c000518, 0x04000004, - 0x412df800, 0x0201f000, 0x00100c46, 0x1c01f000, - 0x4933c857, 0x59325809, 0x497a580a, 0x4a025a07, - 0x00000000, 0x4a025a05, 0x00000103, 0x59300812, - 0x4807c857, 0x800409c0, 0x0402000e, 0x48065808, - 0x59300c02, 0x48065c07, 0x0201f800, 0x00109d18, - 0x0201f800, 0x00109d1d, 0x0201f800, 0x000203ef, - 0x0201f800, 0x001048bd, 0x0201f000, 0x00020b9d, - 0x59340200, 0x8c00050e, 0x04020008, 0x59300012, - 0x0201f800, 0x0010a0a5, 0x80000d40, 0x0401fe1e, - 0x48065808, 0x0401f7eb, 0x592c0209, 0x8c00050e, - 0x040207f7, 0x4933c857, 0x0201f000, 0x0010988f, - 0x4933c857, 0x59325809, 0x812e59c0, 0x02000800, - 0x0010032e, 0x592c020b, 0x8c000502, 0x02000800, - 0x0010032e, 0x4a026006, 0x00000002, 0x1c01f000, - 0x5930001d, 0x800001c0, 0x02020800, 0x00109fda, - 0x59300008, 0x4933c857, 0x4803c857, 0x8c00050e, - 0x04000037, 0x8c000500, 0x04000029, 0x8c00051c, - 0x0400000a, 0x84000500, 0x48026008, 0x59325809, - 0x592c3c09, 0x481fc857, 0x841c3d58, 0x481e5c09, - 0x0201f000, 0x00020c00, 0x59325809, 0x592c3c09, - 0x841c3d58, 0x59300008, 0x8c00051c, 0x040207f2, - 0x481e5c09, 0x42000000, 0x00000005, 0x40000000, - 0x80000040, 0x040207fe, 0x59300008, 0x8c00051c, - 0x040207e9, 0x592c0205, 0x82000500, 0x000000ff, - 0x82000580, 0x00000048, 0x04020003, 0x497a580c, - 0x0401f002, 0x497a580a, 0x481e5c09, 0x4a025a07, - 0x00000000, 0x0201f000, 0x00100c27, 0x8c000524, - 0x040007d9, 0x59325809, 0x4c000000, 0x592c0409, - 0x8c00051c, 0x5c000000, 0x04020003, 0x4a026012, - 0xffffffff, 0x84000524, 0x0401f7cf, 0x1c01f000, - 0x4933c857, 0x41780800, 0x83380480, 0x00000058, - 0x0402100b, 0x83380480, 0x00000040, 0x04001008, - 0x4d2c0000, 0x59325809, 0x812e59c0, 0x0c020806, - 0x5c025800, 0x0201f000, 0x00020b9d, 0x493bc857, - 0x1c01f000, 0x00108f79, 0x00108f79, 0x00108f79, - 0x00108f79, 0x00108f79, 0x00108f7b, 0x00108f79, - 0x00108f79, 0x00108f79, 0x00108f79, 0x00108f79, - 0x00108f79, 0x00108f79, 0x00108f79, 0x00108f79, - 0x00108f79, 0x00108f79, 0x00108f79, 0x00108f79, - 0x00108f79, 0x00108f7e, 0x00108f79, 0x00108f79, - 0x00108f79, 0x0201f800, 0x0010032e, 0x59cc0808, - 0x497a5808, 0x4807c857, 0x59300402, 0x48025c07, - 0x4a025a05, 0x00000103, 0x900401c0, 0x4802580a, - 0x4a025a07, 0x00000000, 0x800409c0, 0x02000000, - 0x000203ef, 0x59cc0009, 0x4802580b, 0x82042500, - 0x00000100, 0x04000002, 0x59cc200b, 0x4812580d, - 0x82040500, 0x00000200, 0x04000002, 0x59cc000a, - 0x4802580c, 0x80100c00, 0x02001800, 0x0010032e, - 0x02000000, 0x000203ef, 0x82041480, 0x0000001d, - 0x04001006, 0x592c0405, 0x8c00051e, 0x0400000e, - 0x42000800, 0x0000001c, 0x4c500000, 0x4c540000, - 0x83cca400, 0x0000000c, 0x832cac00, 0x0000000e, - 0x0401f9de, 0x5c00a800, 0x5c00a000, 0x0201f000, - 0x000203ef, 0x0401f983, 0x0401f1bd, 0x83380480, - 0x00000093, 0x02021800, 0x0010032e, 0x83380480, - 0x00000085, 0x02001800, 0x0010032e, 0x0c01f001, - 0x00108fc7, 0x00108fc5, 0x00108fc5, 0x00108fce, - 0x00108fc5, 0x00108fc5, 0x00108fc5, 0x00108fc5, - 0x00108fc5, 0x00108fc5, 0x00108fc5, 0x00108fc5, - 0x00108fc5, 0x0201f800, 0x0010032e, 0x4a026203, - 0x00000001, 0x493a6403, 0x42000800, 0x80000040, - 0x0201f000, 0x00020b3e, 0x83300580, 0x0011120c, - 0x02020800, 0x0010032e, 0x4933c857, 0x59cc1404, - 0x0201f800, 0x00109ac1, 0x04000025, 0x591c0203, - 0x82000580, 0x00000000, 0x04000021, 0x591c000a, - 0x81340580, 0x0402001e, 0x59cc1204, 0x82080580, - 0x0000ffff, 0x04000007, 0x591c0202, 0x82000d80, - 0x0000ffff, 0x04000003, 0x80080580, 0x04020014, - 0x4d300000, 0x4d1c0000, 0x411e6000, 0x0401f9fa, - 0x5c023800, 0x5c026000, 0x0400000b, 0x59cc0005, - 0x8c000500, 0x04020003, 0x0401f99d, 0x0401f003, - 0x4a023a03, 0x00000002, 0x4a026403, 0x00000086, - 0x0401f005, 0x0401f9de, 0x040007f5, 0x4a026403, - 0x00000087, 0x4d2c0000, 0x0201f800, 0x0010b462, - 0x0201f800, 0x00104c77, 0x5c025800, 0x59340200, - 0x8c00050e, 0x0400000d, 0x59cc1404, 0x0201f800, - 0x00109ac1, 0x04000009, 0x591c0415, 0x8c00051a, - 0x04000006, 0x4d300000, 0x411e6000, 0x0201f800, - 0x001098a4, 0x5c026000, 0x1c01f000, 0x83380580, - 0x00000013, 0x0402000b, 0x59300403, 0x4803c857, - 0x82000d80, 0x00000086, 0x04000012, 0x82000d80, - 0x00000087, 0x02020800, 0x0010032e, 0x0401f00d, - 0x83380580, 0x00000027, 0x04000005, 0x83380580, - 0x00000014, 0x02020800, 0x0010032e, 0x493bc857, - 0x0201f800, 0x00106b8c, 0x0201f000, 0x00107cbe, + 0x4802580c, 0x80100c00, 0x040007aa, 0x82041480, + 0x0000001d, 0x04001006, 0x592c0405, 0x8c00051e, + 0x04000027, 0x42000800, 0x0000001c, 0x4c040000, + 0x4c0c0000, 0x4c140000, 0x0201f800, 0x00020c5a, + 0x04020008, 0x4a025a07, 0x00000000, 0x59300012, + 0x0201f800, 0x0010a2e2, 0x80000d40, 0x040209a0, + 0x5c002800, 0x5c001800, 0x4a025a05, 0x00000103, + 0x48065808, 0x480e580b, 0x901409c0, 0x4806580a, + 0x5c000800, 0x4c500000, 0x4c540000, 0x83cca400, + 0x0000000c, 0x832cac00, 0x0000000e, 0x0201f800, + 0x001093ba, 0x5c00a800, 0x5c00a000, 0x59300008, + 0x84000534, 0x48026008, 0x0401f78e, 0x4c040000, + 0x4c0c0000, 0x4c140000, 0x0201f800, 0x00020c5a, + 0x04020008, 0x4a025a07, 0x00000000, 0x59300012, + 0x0201f800, 0x0010a2e2, 0x80000d40, 0x0402097c, + 0x48065808, 0x5c002800, 0x5c001800, 0x59301402, + 0x480a5c07, 0x480e580b, 0x901401c0, 0x4802580a, + 0x0201f800, 0x00109f56, 0x5c000800, 0x0201f800, + 0x00109364, 0x0201f800, 0x0010939f, 0x0401f779, + 0x592c020b, 0x8c000502, 0x040007a0, 0x592c0209, + 0x8c00050e, 0x0402079d, 0x59300012, 0x800c0d80, + 0x0400079a, 0x4803c857, 0x480fc857, 0x8c183514, + 0x02000000, 0x00109ac7, 0x80000540, 0x04000793, + 0x4807c856, 0x0201f000, 0x00109ac7, 0x592c020b, + 0x8c000502, 0x0400074b, 0x59300012, 0x800001c0, + 0x0400074b, 0x592c0209, 0x8c00050e, 0x04020748, + 0x0201f000, 0x00109ac7, 0x1c01f000, 0x59cc2006, + 0x59cc2807, 0x0401f044, 0x0401f043, 0x1c01f000, + 0x4933c857, 0x59300004, 0x8c00053e, 0x04020039, + 0x5930001d, 0x800001c0, 0x02020800, 0x0010a218, + 0x59325809, 0x592c0c09, 0x41782800, 0x41781800, + 0x84040d58, 0x48065c09, 0x41783000, 0x59340200, + 0x8c00050e, 0x0402001f, 0x0201f800, 0x00020c5a, + 0x04020009, 0x4a025a07, 0x00000000, 0x59300012, + 0x0201f800, 0x0010a2e2, 0x80000d40, 0x4807c857, + 0x0402092b, 0x4a025a05, 0x00000103, 0x48065808, + 0x480e580b, 0x901409c0, 0x4806580a, 0x4933c857, + 0x59300c02, 0x48065c07, 0x0201f800, 0x00109f56, + 0x0201f800, 0x00109f5b, 0x0201f800, 0x000203ef, + 0x0201f800, 0x001049bd, 0x0201f000, 0x00020b9d, + 0x592c020b, 0x8c000502, 0x040007e0, 0x59300012, + 0x4803c857, 0x800001c0, 0x040007df, 0x592c0209, + 0x8c00050e, 0x040207dc, 0x0201f000, 0x00109ac7, + 0x0201f800, 0x00107226, 0x040007c6, 0x4933c857, + 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x4010b800, + 0x4014c000, 0x5930001d, 0x800001c0, 0x4c140000, + 0x02020800, 0x0010a218, 0x5c002800, 0x59325809, + 0x592c020b, 0x8c000502, 0x04020030, 0x8c000500, + 0x04000035, 0x4a026203, 0x00000002, 0x4a026403, + 0x00000043, 0x405c0000, 0x592c0810, 0x80040c80, + 0x40600000, 0x80040480, 0x04001028, 0x8060c1c0, + 0x0400001e, 0x59300004, 0x8c00050e, 0x04000008, + 0x59300a22, 0x82040500, 0x00000003, 0x4c140000, + 0x0c01f823, 0x5c002800, 0x04000014, 0x59300004, + 0x8c00053e, 0x0402000c, 0x485e6014, 0x48626012, + 0x497a6205, 0x5c00c000, 0x5c00b800, 0x0201f800, + 0x00100d98, 0x0402000f, 0x59300804, 0x0201f000, + 0x00020b30, 0x4c140000, 0x0201f800, 0x00107226, + 0x5c002800, 0x040007f1, 0x5c00c000, 0x5c00b800, + 0x0201f000, 0x00107f37, 0x5c00c000, 0x5c00b800, + 0x4933c857, 0x1c01f000, 0x4807c857, 0x4004c000, + 0x0401f7d7, 0x4803c857, 0x0401f7f4, 0x00108e85, + 0x00108e8b, 0x00108e91, 0x00108e83, 0x0201f800, + 0x0010032e, 0x59300223, 0x48035077, 0x82000400, + 0x00000008, 0x48035076, 0x0401f00c, 0x59300223, + 0x48035076, 0x82000400, 0x00000008, 0x48035077, + 0x0401f006, 0x59300223, 0x82000400, 0x00000008, + 0x48035076, 0x48035077, 0x405c1000, 0x41780800, + 0x59a80076, 0x0201f800, 0x00106c9d, 0x800409c0, + 0x0402003c, 0x40085000, 0x592c1001, 0x800811c0, + 0x04000038, 0x58080205, 0x82000500, 0x000000ff, + 0x82000580, 0x0000004a, 0x04020032, 0x48281002, + 0x59a80076, 0x40601000, 0x41780800, 0x4c280000, + 0x0201f800, 0x00106c9d, 0x5c005000, 0x800409c0, + 0x0402001f, 0x40041800, 0x59a80077, 0x800c1c00, + 0x80081040, 0x040207fe, 0x480e6029, 0x592c4801, + 0x802449c0, 0x02000800, 0x0010032e, 0x58240a06, + 0x592c1812, 0x59303022, 0x8c183506, 0x04000003, + 0x40280000, 0x80040c00, 0x800400e0, 0x80040540, + 0x48026020, 0x8c18350a, 0x04020003, 0x40280000, + 0x800c1c00, 0x480e601e, 0x59300223, 0x48026423, + 0x82000540, 0x00000001, 0x1c01f000, 0x592c1810, + 0x405c0000, 0x80600400, 0x800c0580, 0x040007de, + 0x4933c857, 0x485fc857, 0x4863c857, 0x480fc857, + 0x80000580, 0x1c01f000, 0x83380480, 0x00000058, + 0x04021005, 0x83380480, 0x00000040, 0x04001002, + 0x0c01f002, 0x1c01f000, 0x00108efa, 0x00108efa, + 0x00108efa, 0x00108efa, 0x00108efa, 0x00108efa, + 0x00108efa, 0x00108efa, 0x00108efa, 0x00108efa, + 0x00108efc, 0x00108efa, 0x00108efa, 0x00108efa, + 0x00108efa, 0x00108f09, 0x00108efa, 0x00108efa, + 0x00108efa, 0x00108efa, 0x00108f37, 0x00108efa, + 0x00108efa, 0x00108efa, 0x0201f800, 0x0010032e, + 0x4933c857, 0x0201f800, 0x0010707a, 0x4a026203, + 0x00000002, 0x59a8002c, 0x48026205, 0x59300012, + 0x59300816, 0x80040c80, 0x48066016, 0x0201f000, + 0x00106d71, 0x4933c857, 0x0201f800, 0x00106d71, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ff80, + 0x5c027800, 0x42000000, 0x0010cf23, 0x0201f800, + 0x0010bfb3, 0x0201f800, 0x0010989f, 0x04000010, + 0x4d2c0000, 0x59325809, 0x4a025a05, 0x00000103, + 0x59300402, 0x48025c07, 0x4a025a07, 0x00000029, + 0x497a580a, 0x592c0c09, 0x84040d50, 0x48065c09, + 0x0201f800, 0x000203ef, 0x5c025800, 0x42003000, + 0x00000014, 0x41782800, 0x4d400000, 0x4d440000, + 0x59368c03, 0x42002000, 0x00000002, 0x42028000, + 0x00000029, 0x0201f800, 0x0010a22a, 0x5c028800, + 0x5c028000, 0x0201f000, 0x00020b9d, 0x4933c857, + 0x59300809, 0x4978080a, 0x4978080b, 0x58041409, + 0x84081558, 0x48080c09, 0x1c01f000, 0x4807c857, + 0x8c040d3e, 0x04020024, 0x497a5a07, 0x59300028, + 0x80000540, 0x04000018, 0x497a5a07, 0x4c040000, + 0x4c080000, 0x4c0c0000, 0x4c100000, 0x4c140000, + 0x40002800, 0x58141003, 0x40040000, 0x80081480, + 0x48082803, 0x40140000, 0x0201f800, 0x00100aec, + 0x5c002800, 0x5c002000, 0x5c001800, 0x5c001000, + 0x5c000800, 0x592c0207, 0x80000540, 0x04020009, + 0x0401f005, 0x592c0409, 0x8c00051c, 0x04000002, + 0x592c0803, 0x4807c857, 0x4a025a07, 0x00000015, + 0x1c01f000, 0x59300028, 0x80000540, 0x04000009, + 0x4a025a07, 0x00000011, 0x59300028, 0x4c040000, + 0x0201f800, 0x00100aec, 0x5c000800, 0x0401f7f5, + 0x4807c856, 0x4a025a07, 0x00000007, 0x1c01f000, + 0x83380480, 0x00000058, 0x04021007, 0x83380480, + 0x00000040, 0x04001004, 0x4d2c0000, 0x0c01f803, + 0x5c025800, 0x1c01f000, 0x00108f96, 0x00108f96, + 0x00108f96, 0x00108f96, 0x00108f96, 0x00108f99, + 0x00108f98, 0x00108f96, 0x0010901e, 0x00108f96, + 0x00108f96, 0x00108f96, 0x00108f96, 0x00108f96, + 0x00108f96, 0x00108f96, 0x00108f96, 0x00108f96, + 0x00108f96, 0x001090fa, 0x0010912a, 0x00109102, + 0x00108f98, 0x00109136, 0x0201f800, 0x0010032e, + 0x1c01f000, 0x5930001d, 0x800001c0, 0x02020800, + 0x0010a218, 0x59300008, 0x8c00050e, 0x0400007e, + 0x8c000500, 0x04000070, 0x8c00051c, 0x04000009, + 0x84000500, 0x48026008, 0x59325809, 0x592c3c09, + 0x841c3d58, 0x481e5c09, 0x0201f000, 0x00020c00, + 0x59325809, 0x592c3c09, 0x841c3d58, 0x59300008, + 0x8c00051c, 0x040207f3, 0x481e5c09, 0x42000000, + 0x00000005, 0x40000000, 0x80000040, 0x040207fe, + 0x59300008, 0x8c00051c, 0x040207ea, 0x59cc0808, + 0x592c0205, 0x82000500, 0x000000ff, 0x82000580, + 0x00000048, 0x0402000c, 0x497a580c, 0x82040500, + 0x000000ff, 0x04000008, 0x592c0408, 0x800001c0, + 0x04000005, 0x0201f800, 0x0010a104, 0x0201f000, + 0x00100c28, 0x900421c0, 0x4812580a, 0x41782000, + 0x82040500, 0x00000c00, 0x04000002, 0x59cc2009, + 0x82043500, 0x00000fff, 0x04020027, 0x481e5c09, + 0x4a025a07, 0x00000000, 0x801831c0, 0x02000000, + 0x00100c28, 0x41782000, 0x8c183510, 0x04000002, + 0x59cc200b, 0x4812580d, 0x41780000, 0x8c183512, + 0x04000002, 0x59cc000a, 0x4802580c, 0x80100c00, + 0x02001800, 0x0010032e, 0x02000000, 0x00100c28, + 0x82041480, 0x0000001d, 0x0402100c, 0x4c500000, + 0x4c540000, 0x83cca400, 0x0000000c, 0x832cac00, + 0x0000000e, 0x0401fbc5, 0x5c00a800, 0x5c00a000, + 0x0201f000, 0x00100c28, 0x0401fb6a, 0x0201f000, + 0x00100c28, 0x412c7800, 0x0201f800, 0x00100583, + 0x02000800, 0x0010032e, 0x492c780a, 0x841c3d52, + 0x481c7c09, 0x4a025a05, 0x00000103, 0x4812580b, + 0x900401c0, 0x4802580a, 0x583c0405, 0x583c1006, + 0x583c2209, 0x48025c05, 0x480a5806, 0x48125a09, + 0x0401f7c7, 0x8c000524, 0x04000792, 0x59325809, + 0x4c000000, 0x592c0409, 0x8c00051c, 0x5c000000, + 0x04020003, 0x4a026012, 0xffffffff, 0x84000524, + 0x0401f788, 0x1c01f000, 0x59a8002c, 0x48026205, + 0x59325809, 0x4a026203, 0x00000002, 0x592c2409, + 0x59300808, 0x4933c857, 0x4807c857, 0x592c0205, + 0x82000500, 0x000000ff, 0x82000580, 0x00000048, + 0x04020004, 0x8c102500, 0x02020000, 0x0010a148, + 0x4a025a07, 0x00000000, 0x8c040d1e, 0x04000037, + 0x41780800, 0x497a580a, 0x592c1c0a, 0x59300008, + 0x8c00052c, 0x04000003, 0x4a026012, 0x7fffffff, + 0x59300012, 0x59341200, 0x497a6205, 0x8c08150e, + 0x0402007b, 0x4807c857, 0x4806580b, 0x0201f800, + 0x0010a2e2, 0x80000d40, 0x04020ef9, 0x59300402, + 0x48025c07, 0x48065808, 0x4a025a05, 0x00000103, + 0x4c040000, 0x592c0a09, 0x8c040d12, 0x04000003, + 0x4a025a07, 0x0000000c, 0x5c000800, 0x4c040000, + 0x4c0c0000, 0x4c100000, 0x0201f800, 0x00109f56, + 0x5c002000, 0x5c001800, 0x5c000800, 0x8c102512, + 0x0402001c, 0x4c0c0000, 0x0201f800, 0x00109f5b, + 0x0201f800, 0x000203ef, 0x0201f800, 0x001049bd, + 0x5c001800, 0x8c0c1d18, 0x02000000, 0x00020b9d, + 0x0201f000, 0x00109a87, 0x4813c857, 0x8c102518, + 0x0400004d, 0x41780800, 0x592c1c0a, 0x820c0580, + 0x00001000, 0x040007c6, 0x8c102512, 0x040007c4, + 0x592c780a, 0x583c080b, 0x583c1c0a, 0x0401f7c0, + 0x4807c857, 0x592c780a, 0x59300402, 0x592c1405, + 0x8c08151e, 0x0402000d, 0x592c1207, 0x48007c07, + 0x48047808, 0x48087a07, 0x84102512, 0x48107c09, + 0x4c0c0000, 0x0201f800, 0x0010059d, 0x403e5800, + 0x0401fb17, 0x0401f7d9, 0x48025c07, 0x48065808, + 0x583c080d, 0x583c000c, 0x80040c00, 0x82041480, + 0x0000001d, 0x04001006, 0x583c1001, 0x480a5801, + 0x49787801, 0x42000800, 0x0000001c, 0x82040c00, + 0x00000014, 0x4c0c0000, 0x4c500000, 0x4c540000, + 0x823ca400, 0x00000009, 0x832cac00, 0x00000009, + 0x4c100000, 0x4c3c0000, 0x0401fb18, 0x5c007800, + 0x5c002000, 0x5c00a800, 0x5c00a000, 0x84102512, + 0x48125c09, 0x403e5800, 0x0201f800, 0x0010059d, + 0x0201f800, 0x00109f56, 0x42034000, 0x0010caff, + 0x59a1d806, 0x80edd9c0, 0x02000800, 0x0010032e, + 0x48efc857, 0x58ec0008, 0x4803c857, 0x0801f800, + 0x0401f7aa, 0x4933c857, 0x1c01f000, 0x59301415, + 0x480bc857, 0x8c08151c, 0x0402000e, 0x80000540, + 0x4803c857, 0x04000780, 0x80042c80, 0x0402177e, + 0x8c081514, 0x04020005, 0x592c0810, 0x4807c857, + 0x80040480, 0x48026017, 0x8408155c, 0x480a6415, + 0x59301008, 0x8408151e, 0x480a6008, 0x4c100000, + 0x4c3c0000, 0x4d400000, 0x592e8207, 0x4a025a07, + 0x00000001, 0x0201f800, 0x00109f56, 0x49425a07, + 0x5c028000, 0x5c007800, 0x5c002000, 0x497a580a, + 0x8c102512, 0x04000006, 0x4d2c0000, 0x403e5800, + 0x0201f800, 0x0010059d, 0x5c025800, 0x82102500, + 0xffffedff, 0x48125c09, 0x59301006, 0x800811c0, + 0x02000000, 0x00109ac7, 0x59a8002c, 0x80080480, + 0x02021000, 0x00109ac7, 0x4a025a05, 0x00000103, + 0x4a025a07, 0x00000006, 0x497a5c0a, 0x492fc857, + 0x0201f800, 0x000203ef, 0x0201f800, 0x001049bd, + 0x0201f000, 0x00020b9d, 0x59325809, 0x592c0409, + 0x8c000518, 0x04000004, 0x412df800, 0x0201f000, + 0x00100c47, 0x1c01f000, 0x4933c857, 0x59325809, + 0x497a580a, 0x4a025a07, 0x00000000, 0x4a025a05, + 0x00000103, 0x59300812, 0x4807c857, 0x800409c0, + 0x0402000e, 0x48065808, 0x59300c02, 0x48065c07, + 0x0201f800, 0x00109f56, 0x0201f800, 0x00109f5b, + 0x0201f800, 0x000203ef, 0x0201f800, 0x001049bd, + 0x0201f000, 0x00020b9d, 0x59340200, 0x8c00050e, + 0x04020008, 0x59300012, 0x0201f800, 0x0010a2e2, + 0x80000d40, 0x0401fe1e, 0x48065808, 0x0401f7eb, + 0x592c0209, 0x8c00050e, 0x040207f7, 0x4933c857, + 0x0201f000, 0x00109ac7, 0x4933c857, 0x59325809, + 0x812e59c0, 0x02000800, 0x0010032e, 0x592c020b, + 0x8c000502, 0x02000800, 0x0010032e, 0x4a026006, + 0x00000002, 0x1c01f000, 0x5930001d, 0x800001c0, + 0x02020800, 0x0010a218, 0x59300008, 0x4933c857, + 0x4803c857, 0x8c00050e, 0x04000037, 0x8c000500, + 0x04000029, 0x8c00051c, 0x0400000a, 0x84000500, + 0x48026008, 0x59325809, 0x592c3c09, 0x481fc857, + 0x841c3d58, 0x481e5c09, 0x0201f000, 0x00020c00, + 0x59325809, 0x592c3c09, 0x841c3d58, 0x59300008, + 0x8c00051c, 0x040207f2, 0x481e5c09, 0x42000000, + 0x00000005, 0x40000000, 0x80000040, 0x040207fe, + 0x59300008, 0x8c00051c, 0x040207e9, 0x592c0205, + 0x82000500, 0x000000ff, 0x82000580, 0x00000048, + 0x04020003, 0x497a580c, 0x0401f002, 0x497a580a, + 0x481e5c09, 0x4a025a07, 0x00000000, 0x0201f000, + 0x00100c28, 0x8c000524, 0x040007d9, 0x59325809, + 0x4c000000, 0x592c0409, 0x8c00051c, 0x5c000000, + 0x04020003, 0x4a026012, 0xffffffff, 0x84000524, + 0x0401f7cf, 0x1c01f000, 0x4933c857, 0x41780800, + 0x83380480, 0x00000058, 0x0402100b, 0x83380480, + 0x00000040, 0x04001008, 0x4d2c0000, 0x59325809, + 0x812e59c0, 0x0c020806, 0x5c025800, 0x0201f000, + 0x00020b9d, 0x493bc857, 0x1c01f000, 0x0010919f, + 0x0010919f, 0x0010919f, 0x0010919f, 0x0010919f, + 0x001091a1, 0x0010919f, 0x0010919f, 0x0010919f, + 0x0010919f, 0x0010919f, 0x0010919f, 0x0010919f, + 0x0010919f, 0x0010919f, 0x0010919f, 0x0010919f, + 0x0010919f, 0x0010919f, 0x0010919f, 0x001091a4, + 0x0010919f, 0x0010919f, 0x0010919f, 0x0201f800, + 0x0010032e, 0x59cc0808, 0x497a5808, 0x4807c857, + 0x59300402, 0x48025c07, 0x4a025a05, 0x00000103, + 0x900401c0, 0x4802580a, 0x4a025a07, 0x00000000, + 0x800409c0, 0x02000000, 0x000203ef, 0x59cc0009, + 0x4802580b, 0x82042500, 0x00000100, 0x04000002, + 0x59cc200b, 0x4812580d, 0x82040500, 0x00000200, + 0x04000002, 0x59cc000a, 0x4802580c, 0x80100c00, + 0x02001800, 0x0010032e, 0x02000000, 0x000203ef, + 0x82041480, 0x0000001d, 0x04001006, 0x592c0405, + 0x8c00051e, 0x0400000e, 0x42000800, 0x0000001c, + 0x4c500000, 0x4c540000, 0x83cca400, 0x0000000c, + 0x832cac00, 0x0000000e, 0x0401f9ec, 0x5c00a800, + 0x5c00a000, 0x0201f000, 0x000203ef, 0x0401f991, + 0x0401f1cb, 0x83380480, 0x00000093, 0x02021800, + 0x0010032e, 0x83380480, 0x00000085, 0x02001800, + 0x0010032e, 0x0c01f001, 0x001091ed, 0x001091eb, + 0x001091eb, 0x001091f4, 0x001091eb, 0x001091eb, + 0x001091eb, 0x001091eb, 0x001091eb, 0x001091eb, + 0x001091eb, 0x001091eb, 0x001091eb, 0x0201f800, + 0x0010032e, 0x4a026203, 0x00000001, 0x493a6403, + 0x42000800, 0x80000040, 0x0201f000, 0x00020b3e, + 0x83300580, 0x0011152c, 0x02020800, 0x0010032e, + 0x4933c857, 0x59cc1404, 0x0201f800, 0x00109cf9, + 0x04000025, 0x591c0203, 0x82000580, 0x00000000, + 0x04000021, 0x591c000a, 0x81340580, 0x0402001e, + 0x59cc1204, 0x82080580, 0x0000ffff, 0x04000007, + 0x591c0202, 0x82000d80, 0x0000ffff, 0x04000003, + 0x80080580, 0x04020014, 0x4d300000, 0x4d1c0000, + 0x411e6000, 0x0401fa08, 0x5c023800, 0x5c026000, + 0x0400000b, 0x59cc0005, 0x8c000500, 0x04020003, + 0x0401f9ab, 0x0401f003, 0x4a023a03, 0x00000002, + 0x4a026403, 0x00000086, 0x0401f005, 0x0401f9ec, + 0x040007f5, 0x4a026403, 0x00000087, 0x4d2c0000, + 0x0201f800, 0x0010b78d, 0x0201f800, 0x00104d7c, + 0x5c025800, 0x59340200, 0x8c00050e, 0x0400000d, + 0x59cc1404, 0x0201f800, 0x00109cf9, 0x04000009, + 0x591c0415, 0x8c00051a, 0x04000006, 0x4d300000, + 0x411e6000, 0x0201f800, 0x00109adc, 0x5c026000, + 0x1c01f000, 0x83380580, 0x00000013, 0x0402000b, + 0x59300403, 0x4803c857, 0x82000d80, 0x00000086, + 0x04000020, 0x82000d80, 0x00000087, 0x02020800, + 0x0010032e, 0x0401f01b, 0x83380580, 0x00000027, + 0x04000005, 0x83380580, 0x00000014, 0x02020800, + 0x0010032e, 0x493bc857, 0x0201f800, 0x00106d91, + 0x0201f800, 0x0010989f, 0x02000000, 0x00107eb4, + 0x4d2c0000, 0x59325809, 0x0201f800, 0x000203ef, + 0x59300a26, 0x82040d80, 0x00000003, 0x02000800, + 0x001099b4, 0x5c025800, 0x0201f000, 0x00107eb4, 0x4933c857, 0x0201f000, 0x00020b9d, 0x83380580, 0x00000013, 0x04020006, 0x59300403, 0x4803c857, 0x82000480, 0x00000085, 0x0c01f053, 0x83380580, 0x00000027, 0x04020047, 0x4933c857, 0x0201f800, - 0x00106b8c, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010fc72, 0x5c027800, 0x42003000, 0x00000015, + 0x00106d91, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010ff80, 0x5c027800, 0x42003000, 0x00000015, 0x41782800, 0x42002000, 0x00000003, 0x42028000, 0x00000029, 0x4d400000, 0x4d440000, 0x59368c03, - 0x0201f800, 0x00109fec, 0x5c028800, 0x5c028000, - 0x42000000, 0x0010cc23, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x00109667, 0x02000000, 0x00020b9d, + 0x0201f800, 0x0010a22a, 0x5c028800, 0x5c028000, + 0x42000000, 0x0010cf23, 0x0201f800, 0x0010bfb3, + 0x0201f800, 0x0010989f, 0x02000000, 0x00020b9d, 0x4d2c0000, 0x59325809, 0x592c0205, 0x82000500, 0x000000ff, 0x82000580, 0x00000014, 0x02020800, - 0x0010977c, 0x4a025a05, 0x00000103, 0x59300402, + 0x001099b4, 0x4a025a05, 0x00000103, 0x59300402, 0x48025c07, 0x497a580a, 0x49425a07, 0x0201f800, 0x000203ef, 0x5c025800, 0x0201f000, 0x00020b9d, 0x83380580, 0x00000089, 0x04000005, 0x83380580, - 0x0000008a, 0x02020000, 0x00107d3d, 0x0201f800, - 0x00107021, 0x02020000, 0x00107d3d, 0x59300a03, + 0x0000008a, 0x02020000, 0x00107f37, 0x0201f800, + 0x00107226, 0x02020000, 0x00107f37, 0x59300a03, 0x82040580, 0x0000000a, 0x0400002a, 0x82040580, 0x0000000c, 0x04000027, 0x0201f800, 0x0010032e, 0x83380580, 0x00000014, 0x040207ea, 0x4933c857, - 0x0201f800, 0x00106b8c, 0x42028000, 0x00000006, - 0x0401f7cc, 0x00109098, 0x00109096, 0x00109096, - 0x00109096, 0x00109096, 0x00109096, 0x0010909e, - 0x00109096, 0x00109096, 0x00109096, 0x00109096, - 0x00109096, 0x00109096, 0x0201f800, 0x0010032e, + 0x0201f800, 0x00106d91, 0x42028000, 0x00000006, + 0x0401f7cc, 0x001092cc, 0x001092ca, 0x001092ca, + 0x001092ca, 0x001092ca, 0x001092ca, 0x001092d2, + 0x001092ca, 0x001092ca, 0x001092ca, 0x001092ca, + 0x001092ca, 0x001092ca, 0x0201f800, 0x0010032e, 0x4933c857, 0x59a8002a, 0x48026006, 0x4a026203, 0x0000000a, 0x1c01f000, 0x4933c857, 0x59a8002a, 0x48026006, 0x4a026203, 0x0000000c, 0x1c01f000, 0x5932680a, 0x83380580, 0x00000089, 0x04000008, 0x83380580, 0x0000008a, 0x04000029, 0x4933c857, - 0x493bc857, 0x0201f000, 0x00107d3d, 0x4933c857, + 0x493bc857, 0x0201f000, 0x00107f37, 0x4933c857, 0x59325809, 0x59300a26, 0x82040580, 0x00000003, - 0x0402000a, 0x0201f800, 0x00109667, 0x04000012, - 0x0201f800, 0x000203ef, 0x0201f800, 0x001048bd, + 0x0402000a, 0x0201f800, 0x0010989f, 0x04000012, + 0x0201f800, 0x000203ef, 0x0201f800, 0x001049bd, 0x497a6009, 0x0401f00c, 0x59300226, 0x82000580, 0x00000001, 0x04020008, 0x59300c17, 0x82040580, 0x00000039, 0x0400001d, 0x82040580, 0x00000035, 0x0400001a, 0x59cc0c07, 0x4806641a, 0x59cc0a07, 0x4806621a, 0x59300203, 0x48026426, 0x4a026203, - 0x00000011, 0x0201f000, 0x00107cbe, 0x4933c857, + 0x00000011, 0x0201f000, 0x00107eb4, 0x4933c857, 0x59300226, 0x82000580, 0x00000001, 0x0402004a, 0x59300c17, 0x82040580, 0x00000035, 0x04000007, 0x82040580, 0x0000001e, 0x04000004, 0x82040580, 0x00000039, 0x04020040, 0x4933c857, 0x4c5c0000, 0x4c600000, 0x4d1c0000, 0x4130b800, 0x4004c000, - 0x0201f800, 0x00109a64, 0x04020031, 0x82600580, + 0x0201f800, 0x00109c9c, 0x04020031, 0x82600580, 0x00000035, 0x04020004, 0x591c0c15, 0x8c040d02, - 0x0400002b, 0x0201f800, 0x00107cfe, 0x04000028, + 0x0400002b, 0x0201f800, 0x00107ef8, 0x04000028, 0x491fc857, 0x4933c857, 0x82600580, 0x00000035, 0x04000004, 0x82600580, 0x00000039, 0x04020002, 0x4932381d, 0x585c081c, 0x4806601c, 0x48626403, @@ -23836,10 +24029,10 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4807c857, 0x4806621a, 0x491e6027, 0x42000800, 0x80000040, 0x0201f800, 0x00020b3e, 0x405e6000, 0x5c023800, 0x5c00c000, 0x5c00b800, 0x0201f000, - 0x00020b9d, 0x0201f800, 0x00109667, 0x0400000b, + 0x00020b9d, 0x0201f800, 0x0010989f, 0x0400000b, 0x4d2c0000, 0x59325809, 0x0201f800, 0x000203ef, 0x59300226, 0x82000580, 0x00000003, 0x02000800, - 0x001048bd, 0x5c025800, 0x0201f000, 0x00020b9d, + 0x001049bd, 0x5c025800, 0x0201f000, 0x00020b9d, 0x4803c856, 0x4c500000, 0x4c540000, 0x412c7800, 0x4c3c0000, 0x42002800, 0x00000001, 0x82040480, 0x00000101, 0x04001003, 0x42000800, 0x00000100, @@ -23860,23 +24053,23 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0201f800, 0x000203ef, 0x403e5800, 0x0401f7f9, 0x5c007800, 0x0201f800, 0x000203ef, 0x5c025800, 0x1c01f000, 0x4803c856, 0x4c580000, 0x82040400, - 0x00000003, 0x8000b104, 0x0201f800, 0x0010bd5b, + 0x00000003, 0x8000b104, 0x0201f800, 0x0010c086, 0x5c00b000, 0x1c01f000, 0x4803c856, 0x4c580000, 0x82040c00, 0x00000003, 0x8004b104, 0x0201f800, - 0x0010bd5b, 0x5c00b000, 0x1c01f000, 0x591c0c07, + 0x0010c086, 0x5c00b000, 0x1c01f000, 0x591c0c07, 0x82040580, 0x00000003, 0x04000007, 0x82040580, 0x00000002, 0x04000004, 0x82040580, 0x0000000a, 0x0402002d, 0x4d300000, 0x4d2c0000, 0x411e6000, - 0x59325809, 0x0201f800, 0x00109667, 0x04000022, + 0x59325809, 0x0201f800, 0x0010989f, 0x04000022, 0x59300c07, 0x82040580, 0x0000000a, 0x04000023, 0x82040580, 0x00000003, 0x04020009, 0x592c0a05, 0x82040d00, 0x000000ff, 0x82040d80, 0x00000014, 0x04000003, 0x4a026226, 0x00000003, 0x0401f81c, 0x4d400000, 0x42028000, 0x00000013, 0x592c0a09, - 0x84040d54, 0x0201f800, 0x00104cf5, 0x5c028000, - 0x0201f800, 0x00109d18, 0x0201f800, 0x000203ef, + 0x84040d54, 0x0201f800, 0x00104e1a, 0x5c028000, + 0x0201f800, 0x00109f56, 0x0201f800, 0x000203ef, 0x59300226, 0x82000580, 0x00000003, 0x02000800, - 0x0010977c, 0x0201f800, 0x00107cbe, 0x5c025800, + 0x001099b4, 0x0201f800, 0x00107eb4, 0x5c025800, 0x5c026000, 0x1c01f000, 0x4a025a07, 0x00000013, 0x4a026226, 0x0000000a, 0x0401f7ee, 0x592c0409, 0x8c000512, 0x04000009, 0x84000512, 0x48025c09, @@ -23890,75 +24083,75 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x02021800, 0x0010032e, 0x0c01f80a, 0x5c027800, 0x1c01f000, 0x4933c857, 0x59300407, 0x82000c80, 0x00000014, 0x02021800, 0x0010032e, 0x0c01f001, - 0x00109211, 0x0010920e, 0x0010920e, 0x0010924e, - 0x0010920c, 0x0010920e, 0x0010922a, 0x0010920e, - 0x0010920c, 0x001069be, 0x0010a137, 0x0010920e, - 0x0010920e, 0x0010920c, 0x0010920c, 0x0010920c, - 0x00109344, 0x0010920e, 0x0010bb03, 0x0010bb03, + 0x00109445, 0x00109442, 0x00109442, 0x00109482, + 0x00109440, 0x00109442, 0x0010945e, 0x00109442, + 0x00109440, 0x00106bc3, 0x0010a374, 0x00109442, + 0x00109442, 0x00109440, 0x00109440, 0x00109440, + 0x00109578, 0x00109442, 0x0010be2e, 0x0010be2e, 0x0201f800, 0x0010032e, 0x4803c856, 0x80000580, 0x1c01f000, 0x4803c856, 0x8d3e7d02, 0x04020016, - 0x0201f800, 0x00109667, 0x0400000f, 0x59325809, + 0x0201f800, 0x0010989f, 0x0400000f, 0x59325809, 0x41780800, 0x4d400000, 0x42028000, 0x00000005, - 0x0201f800, 0x00104cf5, 0x5c028000, 0x0201f800, - 0x00109d18, 0x0201f800, 0x0010982a, 0x0201f800, - 0x000203ef, 0x0201f800, 0x00107cbe, 0x82000540, + 0x0201f800, 0x00104e1a, 0x5c028000, 0x0201f800, + 0x00109f56, 0x0201f800, 0x00109a62, 0x0201f800, + 0x000203ef, 0x0201f800, 0x00107eb4, 0x82000540, 0x00000001, 0x1c01f000, 0x4933c857, 0x0201f800, - 0x00109667, 0x04000009, 0x59300809, 0x58040209, + 0x0010989f, 0x04000009, 0x59300809, 0x58040209, 0x8c000512, 0x04000005, 0x4d400000, 0x42028000, - 0x0000000c, 0x0401f011, 0x0201f800, 0x0010483c, + 0x0000000c, 0x0401f011, 0x0201f800, 0x0010493c, 0x0400000b, 0x59300415, 0x84000556, 0x48026415, 0x0401f812, 0x4df00000, 0x59300415, 0x84000516, 0x48026415, 0x5c03e000, 0x1c01f000, 0x4d400000, - 0x42028000, 0x00000010, 0x0201f800, 0x0010acac, + 0x42028000, 0x00000010, 0x0201f800, 0x0010afbb, 0x4a026407, 0x00000006, 0x4a026203, 0x00000007, 0x5c028000, 0x1c01f000, 0x4933c857, 0x0201f800, - 0x00106c3c, 0x4df00000, 0x0401f8de, 0x82000c80, + 0x00106e41, 0x4df00000, 0x0401f8de, 0x82000c80, 0x0000000e, 0x02021800, 0x0010032e, 0x0c01f001, - 0x00109268, 0x001092ef, 0x0010927f, 0x00109303, - 0x001092ea, 0x00109266, 0x00109268, 0x00109268, - 0x0010926c, 0x00109268, 0x00109268, 0x00109268, - 0x00109268, 0x0010927f, 0x0201f800, 0x0010032e, - 0x5c03e000, 0x02000800, 0x00106c29, 0x0401f7a3, - 0x5c03e000, 0x02000800, 0x00106c29, 0x59300407, + 0x0010949c, 0x00109523, 0x001094b3, 0x00109537, + 0x0010951e, 0x0010949a, 0x0010949c, 0x0010949c, + 0x001094a0, 0x0010949c, 0x0010949c, 0x0010949c, + 0x0010949c, 0x001094b3, 0x0201f800, 0x0010032e, + 0x5c03e000, 0x02000800, 0x00106e2e, 0x0401f7a3, + 0x5c03e000, 0x02000800, 0x00106e2e, 0x59300407, 0x82000580, 0x00000003, 0x0402079f, 0x59300203, 0x82000580, 0x0000000d, 0x0400079b, 0x8d3e7d02, 0x04020799, 0x4d340000, 0x5932680a, 0x0201f800, - 0x001048bd, 0x5c026800, 0x0401f793, 0x0201f800, - 0x0010a1e1, 0x59300004, 0x8400055c, 0x48026004, - 0x0201f800, 0x00106c29, 0x59300407, 0x82000580, + 0x001049bd, 0x5c026800, 0x0401f793, 0x0201f800, + 0x0010a424, 0x59300004, 0x8400055c, 0x48026004, + 0x0201f800, 0x00106e2e, 0x59300407, 0x82000580, 0x00000006, 0x0400005b, 0x8d3e7d02, 0x04020059, 0x497a6226, 0x59300203, 0x82000580, 0x0000000d, - 0x04000003, 0x4a026226, 0x00000003, 0x0401fbd4, + 0x04000003, 0x4a026226, 0x00000003, 0x0401fbd8, 0x04020004, 0x8d3e7d00, 0x04000044, 0x0401f038, 0x4d2c0000, 0x4d400000, 0x59325809, 0x0201f800, - 0x0010982a, 0x592c0409, 0x8c000512, 0x04000009, + 0x00109a62, 0x592c0409, 0x8c000512, 0x04000009, 0x4d2c0000, 0x84000512, 0x48025c09, 0x592c080a, 0x40065800, 0x0201f800, 0x0010059d, 0x5c025800, 0x4d400000, 0x42028000, 0x00000005, 0x592c0a09, 0x8c040d0e, 0x04000004, 0x42028000, 0x00000002, 0x0401f005, 0x8c040d12, 0x04000003, 0x42028000, - 0x0000000c, 0x0201f800, 0x00104cf5, 0x5c028000, - 0x0201f800, 0x00109d18, 0x8d3e7d00, 0x04020004, - 0x0201f800, 0x0010bd9c, 0x04020004, 0x0201f800, + 0x0000000c, 0x0201f800, 0x00104e1a, 0x5c028000, + 0x0201f800, 0x00109f56, 0x8d3e7d00, 0x04020004, + 0x0201f800, 0x0010c0c7, 0x04020004, 0x0201f800, 0x000203ef, 0x497a6009, 0x5c028000, 0x5c025800, 0x8d3e7d00, 0x0400000d, 0x59300a26, 0x82040d80, 0x00000003, 0x04020006, 0x4d340000, 0x5932680a, - 0x0201f800, 0x001048bd, 0x5c026800, 0x0201f800, - 0x00107cbe, 0x0401f013, 0x0201f800, 0x0010bd9c, + 0x0201f800, 0x001049bd, 0x5c026800, 0x0201f800, + 0x00107eb4, 0x0401f013, 0x0201f800, 0x0010c0c7, 0x04020006, 0x59300a26, 0x82040d80, 0x00000003, - 0x02000800, 0x0010977c, 0x4a026403, 0x00000085, + 0x02000800, 0x001099b4, 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, 0x42000800, 0x8000404b, 0x0201f800, 0x00020b3e, - 0x5c03e000, 0x02020800, 0x00106c3c, 0x82000540, - 0x00000001, 0x1c01f000, 0x0201f800, 0x00106c29, - 0x0201f800, 0x00100c75, 0x0401f791, 0x598c000f, - 0x81300580, 0x04020004, 0x0201f800, 0x00106f5c, - 0x0402001d, 0x0201f800, 0x0010fece, 0x80c40040, + 0x5c03e000, 0x02020800, 0x00106e41, 0x82000540, + 0x00000001, 0x1c01f000, 0x0201f800, 0x00106e2e, + 0x0201f800, 0x00100c76, 0x0401f791, 0x598c000f, + 0x81300580, 0x04020004, 0x0201f800, 0x00107161, + 0x0402001d, 0x0201f800, 0x001101de, 0x80c40040, 0x04020006, 0x59300c03, 0x82040580, 0x00000040, - 0x04000770, 0x0401f782, 0x0201f800, 0x00106b47, + 0x04000770, 0x0401f782, 0x0201f800, 0x00106d4c, 0x04000011, 0x0201f800, 0x0010032e, 0x0401f81b, - 0x04020004, 0x0201f800, 0x00106f25, 0x0402000a, - 0x0201f800, 0x0010fd55, 0x80c40040, 0x040207f3, + 0x04020004, 0x0201f800, 0x0010712a, 0x0402000a, + 0x0201f800, 0x00110065, 0x80c40040, 0x040207f3, 0x59300c03, 0x82040580, 0x00000040, 0x0400075d, 0x0401f76f, 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, 0x0010032e, 0x0c01f742, 0x0401f807, @@ -23973,44 +24166,44 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0000001f, 0x82040580, 0x00000005, 0x04020004, 0x42000000, 0x00000003, 0x0401f005, 0x42000000, 0x00000001, 0x0401f002, 0x59300203, 0x1c01f000, - 0x4933c857, 0x0201f800, 0x00106c3c, 0x4df00000, + 0x4933c857, 0x0201f800, 0x00106e41, 0x4df00000, 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, - 0x0010032e, 0x0c01f001, 0x0010935e, 0x0010937b, - 0x00109362, 0x0010935c, 0x0010935c, 0x0010935c, - 0x0010935c, 0x0010935c, 0x0010935c, 0x0010935c, - 0x0010935c, 0x0010935c, 0x0010935c, 0x0010935c, + 0x0010032e, 0x0c01f001, 0x00109592, 0x001095af, + 0x00109596, 0x00109590, 0x00109590, 0x00109590, + 0x00109590, 0x00109590, 0x00109590, 0x00109590, + 0x00109590, 0x00109590, 0x00109590, 0x00109590, 0x0201f800, 0x0010032e, 0x5c03e000, 0x02000800, - 0x00106c29, 0x0401f6ad, 0x5c03e000, 0x02000800, - 0x00106c29, 0x4d2c0000, 0x59325809, 0x59300403, - 0x82000580, 0x00000052, 0x02000800, 0x001010b5, - 0x0401fafb, 0x02000800, 0x0010032e, 0x4a025a07, + 0x00106e2e, 0x0401f6ad, 0x5c03e000, 0x02000800, + 0x00106e2e, 0x4d2c0000, 0x59325809, 0x59300403, + 0x82000580, 0x00000052, 0x02000800, 0x001010b6, + 0x0401faff, 0x02000800, 0x0010032e, 0x4a025a07, 0x00000005, 0x0201f800, 0x000203ef, 0x0201f800, - 0x00104bb9, 0x0201f800, 0x00107cbe, 0x5c025800, + 0x00104cbe, 0x0201f800, 0x00107eb4, 0x5c025800, 0x82000540, 0x00000001, 0x1c01f000, 0x598c000f, 0x81300580, 0x0402001b, 0x59300004, 0x8c000520, 0x04000004, 0x84000520, 0x48026004, 0x0401f01b, - 0x42001000, 0x0010cb5b, 0x50081000, 0x58080002, + 0x42001000, 0x0010ce5b, 0x50081000, 0x58080002, 0x82000580, 0x00000100, 0x0400000b, 0x5808000b, 0x81300580, 0x02020800, 0x0010032e, 0x0201f800, - 0x0010fece, 0x80c40040, 0x02020800, 0x0010032e, - 0x0401f7ce, 0x0201f800, 0x00106f5c, 0x0402000d, + 0x001101de, 0x80c40040, 0x02020800, 0x0010032e, + 0x0401f7ce, 0x0201f800, 0x00107161, 0x0402000d, 0x59300004, 0x8c000520, 0x04000004, 0x84000520, - 0x48026004, 0x0401f7c5, 0x0201f800, 0x0010fece, + 0x48026004, 0x0401f7c5, 0x0201f800, 0x001101de, 0x80c40040, 0x040007c1, 0x0201f800, 0x0010032e, 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, 0x0010032e, 0x0c01f7a5, 0x4d340000, 0x4d240000, 0x5932481c, 0x5932680a, 0x59300407, 0x4933c857, 0x4803c857, 0x82000c80, 0x00000014, 0x02021800, 0x0010032e, 0x0c01f804, 0x5c024800, 0x5c026800, - 0x1c01f000, 0x001093d2, 0x00109400, 0x00109592, - 0x00110517, 0x00109585, 0x0010958d, 0x0010ac9b, - 0x001093de, 0x00109580, 0x001069a6, 0x00109602, - 0x001093cd, 0x001093cd, 0x001093cd, 0x001093cd, - 0x00020b9d, 0x00109e71, 0x00109e71, 0x0010bb13, - 0x0010bb13, 0x0201f800, 0x0010032e, 0x0401fbdb, - 0x02000000, 0x001084a2, 0x1c01f000, 0x0201f800, - 0x00106c3c, 0x0201f800, 0x00106b8c, 0x0201f800, - 0x00106c29, 0x0201f000, 0x00020b9d, 0x4a026006, + 0x1c01f000, 0x00109606, 0x00109634, 0x001097ca, + 0x00110814, 0x001097bd, 0x001097c5, 0x0010afaa, + 0x00109612, 0x001097b8, 0x00106bab, 0x0010983a, + 0x00109601, 0x00109601, 0x00109601, 0x00109601, + 0x00020b9d, 0x0010a0af, 0x0010a0af, 0x0010be3e, + 0x0010be3e, 0x0201f800, 0x0010032e, 0x0401fbdf, + 0x02000000, 0x001086a8, 0x1c01f000, 0x0201f800, + 0x00106e41, 0x0201f800, 0x00106d91, 0x0201f800, + 0x00106e2e, 0x0201f000, 0x00020b9d, 0x4a026006, 0x00000001, 0x1c01f000, 0x4d340000, 0x4c5c0000, 0x59300203, 0x82000580, 0x00000011, 0x04020018, 0x5932680a, 0x4130b800, 0x0201f800, 0x00020b7b, @@ -24020,34 +24213,35 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4a026407, 0x00000001, 0x42000800, 0x80000040, 0x0201f800, 0x00020b3e, 0x405e6000, 0x0201f800, 0x00020b9d, 0x5c00b800, 0x5c026800, 0x1c01f000, - 0x42000000, 0x0010cc2e, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x0010b4f9, 0x59300203, 0x82000c80, + 0x42000000, 0x0010cf2e, 0x0201f800, 0x0010bfb3, + 0x0201f800, 0x0010b824, 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, 0x0010032e, 0x4803c857, - 0x0c01f001, 0x0010941b, 0x001093db, 0x0010941d, - 0x0010941b, 0x0010941d, 0x0010941d, 0x001093d3, - 0x0010941b, 0x001093cf, 0x0010941b, 0x0010941b, - 0x0010941b, 0x0010941b, 0x0010941b, 0x0201f800, - 0x0010032e, 0x4d2c0000, 0x59340400, 0x82000500, + 0x0c01f001, 0x0010964f, 0x0010960f, 0x00109651, + 0x0010964f, 0x00109651, 0x00109651, 0x00109607, + 0x0010964f, 0x00109603, 0x0010964f, 0x0010964f, + 0x0010964f, 0x0010964f, 0x0010964f, 0x0201f800, + 0x0010032e, 0x83340580, 0x0010e23c, 0x02000000, + 0x00107eb4, 0x4d2c0000, 0x59340400, 0x82000500, 0x000000ff, 0x82000c80, 0x0000000c, 0x02021800, 0x0010032e, 0x59303403, 0x82180d80, 0x00000051, 0x04000010, 0x82180d80, 0x00000004, 0x04020004, 0x42000000, 0x00000001, 0x0401f006, 0x82180d80, 0x00000000, 0x04020003, 0x42000000, 0x00000001, 0x4803c857, 0x0c01f82d, 0x5c025800, 0x1c01f000, - 0x42000000, 0x0010cc2a, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x00101f51, 0x59340412, 0x82000500, + 0x42000000, 0x0010cf2a, 0x0201f800, 0x0010bfb3, + 0x0201f800, 0x00101fb4, 0x59340412, 0x82000500, 0x000000ff, 0x0400001c, 0x80000040, 0x48026c12, - 0x4d300000, 0x0201f800, 0x00107cfe, 0x5c000000, + 0x4d300000, 0x0201f800, 0x00107ef8, 0x5c000000, 0x04000014, 0x4a000407, 0x00000007, 0x4a000006, 0x00000398, 0x49238830, 0x4a038832, 0xffffffff, 0x4926601c, 0x497a6009, 0x4936600a, 0x4a026407, 0x00000001, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000051, 0x5c025800, 0x0201f000, 0x00106b17, + 0x00000051, 0x5c025800, 0x0201f000, 0x00106d1c, 0x40026000, 0x5c025800, 0x42002800, 0x00000001, - 0x0201f000, 0x0010a1bb, 0x0010946e, 0x00109528, - 0x00109470, 0x001094b9, 0x00109470, 0x00109545, - 0x00109470, 0x0010947a, 0x0010946e, 0x00109545, - 0x0010946e, 0x00109489, 0x0201f800, 0x0010032e, + 0x0201f000, 0x0010a3f8, 0x001096a6, 0x00109760, + 0x001096a8, 0x001096f1, 0x001096a8, 0x0010977d, + 0x001096a8, 0x001096b2, 0x001096a6, 0x0010977d, + 0x001096a6, 0x001096c1, 0x0201f800, 0x0010032e, 0x59300403, 0x82000d80, 0x00000016, 0x04000042, 0x82000d80, 0x00000004, 0x0400003f, 0x82000d80, 0x00000002, 0x0400003c, 0x0401fb30, 0x0400003a, @@ -24055,29 +24249,29 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x82000d80, 0x00000039, 0x040000d3, 0x82000d80, 0x00000035, 0x040000d0, 0x82000d80, 0x0000001e, 0x0400002f, 0x0401f9de, 0x04000007, 0x0201f800, - 0x00109d13, 0x04020004, 0x0201f800, 0x0010494e, + 0x00109f51, 0x04020004, 0x0201f800, 0x00104a50, 0x0401f025, 0x59300403, 0x82000d80, 0x00000001, 0x04020014, 0x5930081c, 0x58040200, 0x8c000500, - 0x02000000, 0x0010a1b4, 0x5930080a, 0x58040403, + 0x02000000, 0x0010a3f1, 0x5930080a, 0x58040403, 0x82000580, 0x000007fe, 0x04020007, 0x42002800, - 0x00000001, 0x0201f800, 0x0010a1bb, 0x0201f000, - 0x00020b9d, 0x0201f800, 0x0010491a, 0x0400000e, + 0x00000001, 0x0201f800, 0x0010a3f8, 0x0201f000, + 0x00020b9d, 0x0201f800, 0x00104a1c, 0x0400000e, 0x59340403, 0x82000480, 0x000007f0, 0x0402100c, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010fc72, - 0x5c027800, 0x42000000, 0x0010cc23, 0x0201f800, - 0x0010bc88, 0x0201f800, 0x001084a2, 0x0201f000, - 0x00107cbe, 0x0401f9ae, 0x04000004, 0x0201f800, - 0x00109d13, 0x040000b1, 0x59300c03, 0x82040580, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ff80, + 0x5c027800, 0x42000000, 0x0010cf23, 0x0201f800, + 0x0010bfb3, 0x0201f800, 0x001086a8, 0x0201f000, + 0x00107eb4, 0x0401f9ae, 0x04000004, 0x0201f800, + 0x00109f51, 0x040000b1, 0x59300c03, 0x82040580, 0x00000016, 0x0400005d, 0x82040580, 0x00000002, 0x04020031, 0x59a8021b, 0x8c000502, 0x04020016, 0x59a81078, 0x8c08153e, 0x04020013, 0x0201f800, - 0x00104fc6, 0x04020010, 0x0201f800, 0x00104ff1, + 0x001050f7, 0x04020010, 0x0201f800, 0x00105122, 0x04020006, 0x42000000, 0x00000001, 0x0201f800, - 0x00104f97, 0x0401f099, 0x4a035014, 0x00000001, - 0x4202d800, 0x00000001, 0x0201f800, 0x00104f20, + 0x001050c8, 0x0401f099, 0x4a035014, 0x00000001, + 0x4202d800, 0x00000001, 0x0201f800, 0x00105051, 0x0401f092, 0x59340412, 0x82000500, 0x000000ff, 0x04000015, 0x80000040, 0x48026c12, 0x5932481c, - 0x497a6205, 0x4d300000, 0x0201f800, 0x00107cfe, + 0x497a6205, 0x4d300000, 0x0201f800, 0x00107ef8, 0x5c000000, 0x0400000b, 0x49780009, 0x4a000407, 0x00000007, 0x4a000006, 0x00000398, 0x4926601c, 0x4936600a, 0x4a026407, 0x00000001, 0x0401f02b, @@ -24085,88 +24279,88 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04020014, 0x59340403, 0x82000580, 0x000007fe, 0x0402000c, 0x59a81078, 0x8c08153e, 0x04020004, 0x59a8021b, 0x84000540, 0x4803521b, 0x0201f800, - 0x00104154, 0x0201f800, 0x001084a2, 0x0401f010, - 0x42000000, 0x00000103, 0x0201f800, 0x00107f81, - 0x0201f800, 0x001084a2, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010fc72, 0x5c027800, 0x42000000, - 0x0010cc23, 0x0201f800, 0x0010bc88, 0x59a81078, - 0x8c08153e, 0x04020003, 0x0201f800, 0x00101cb2, - 0x0201f000, 0x00107cbe, 0x42000800, 0x00000003, - 0x0201f800, 0x001044f1, 0x4a026203, 0x00000001, - 0x4a026403, 0x00000002, 0x0201f000, 0x00106b17, - 0x0401f93f, 0x0402078c, 0x0201f800, 0x00101cb2, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010fc72, - 0x5c027800, 0x42000000, 0x0010cc23, 0x0201f800, - 0x0010bc88, 0x42003000, 0x00000018, 0x41782800, + 0x0010424d, 0x0201f800, 0x001086a8, 0x0401f010, + 0x42000000, 0x00000103, 0x0201f800, 0x0010817e, + 0x0201f800, 0x001086a8, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010ff80, 0x5c027800, 0x42000000, + 0x0010cf23, 0x0201f800, 0x0010bfb3, 0x59a81078, + 0x8c08153e, 0x04020003, 0x0201f800, 0x00101cb7, + 0x0201f000, 0x00107eb4, 0x42000800, 0x00000003, + 0x0201f800, 0x001045ea, 0x4a026203, 0x00000001, + 0x4a026403, 0x00000002, 0x0201f000, 0x00106d1c, + 0x0401f93f, 0x0402078c, 0x0201f800, 0x00101cb7, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ff80, + 0x5c027800, 0x42000000, 0x0010cf23, 0x0201f800, + 0x0010bfb3, 0x42003000, 0x00000018, 0x41782800, 0x42002000, 0x00000000, 0x4d400000, 0x4d440000, 0x59368c03, 0x42028000, 0x00000029, 0x0201f800, - 0x00109fec, 0x5c028800, 0x5c028000, 0x0201f000, - 0x00107cbe, 0x0201f800, 0x0010494e, 0x0401f7c5, - 0x42000000, 0x0010cc2d, 0x0201f800, 0x0010bc88, - 0x42000000, 0x00000105, 0x0201f800, 0x00107f81, - 0x040007bc, 0x0201f800, 0x00107f9c, 0x040207b9, - 0x1c01f000, 0x59300c03, 0x0201f800, 0x00109a64, + 0x0010a22a, 0x5c028800, 0x5c028000, 0x0201f000, + 0x00107eb4, 0x0201f800, 0x00104a50, 0x0401f7c5, + 0x42000000, 0x0010cf2d, 0x0201f800, 0x0010bfb3, + 0x42000000, 0x00000105, 0x0201f800, 0x0010817e, + 0x040007bc, 0x0201f800, 0x001081a1, 0x040207b9, + 0x1c01f000, 0x59300c03, 0x0201f800, 0x00109c9c, 0x02020000, 0x00020b9d, 0x836c0580, 0x00000003, 0x04000004, 0x4a026006, 0x00000002, 0x1c01f000, 0x59300403, 0x48026417, 0x4a026226, 0x00000001, 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, 0x42000800, 0x8000004b, - 0x0201f000, 0x00020b3e, 0x0201f800, 0x001084a2, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010fc72, - 0x5c027800, 0x42000000, 0x0010cc23, 0x0201f800, - 0x0010bc88, 0x497a6009, 0x4a026407, 0x00000007, + 0x0201f000, 0x00020b3e, 0x0201f800, 0x001086a8, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ff80, + 0x5c027800, 0x42000000, 0x0010cf23, 0x0201f800, + 0x0010bfb3, 0x497a6009, 0x4a026407, 0x00000007, 0x4a026006, 0x00000398, 0x497a6205, 0x1c01f000, - 0x42000000, 0x0010cc34, 0x0201f800, 0x0010bc88, - 0x0401f67c, 0x42000000, 0x0010cc2f, 0x0201f800, - 0x0010bc88, 0x0201f800, 0x0010b4f9, 0x0201f000, - 0x00107cbe, 0x42000000, 0x0010cc31, 0x0201f800, - 0x0010bc88, 0x1c01f000, 0x42000000, 0x0010cc30, - 0x0201f800, 0x0010bc88, 0x59300203, 0x82000c80, + 0x42000000, 0x0010cf34, 0x0201f800, 0x0010bfb3, + 0x0401f678, 0x42000000, 0x0010cf2f, 0x0201f800, + 0x0010bfb3, 0x0201f800, 0x0010b824, 0x0201f000, + 0x00107eb4, 0x42000000, 0x0010cf31, 0x0201f800, + 0x0010bfb3, 0x1c01f000, 0x42000000, 0x0010cf30, + 0x0201f800, 0x0010bfb3, 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, 0x0010032e, 0x4803c857, - 0x0c01f001, 0x001095ab, 0x001093db, 0x001095ab, - 0x001095ab, 0x001095ab, 0x001095ab, 0x001095ab, - 0x001095ab, 0x001095ab, 0x001093db, 0x001095ad, - 0x001093db, 0x001095b5, 0x001095ab, 0x0201f800, + 0x0c01f001, 0x001097e3, 0x0010960f, 0x001097e3, + 0x001097e3, 0x001097e3, 0x001097e3, 0x001097e3, + 0x001097e3, 0x001097e3, 0x0010960f, 0x001097e5, + 0x0010960f, 0x001097ed, 0x001097e3, 0x0201f800, 0x0010032e, 0x4a026403, 0x0000008b, 0x4a026203, 0x0000000b, 0x42000800, 0x8000404b, 0x0201f000, 0x00020b3e, 0x59300a26, 0x0401f8b1, 0x0400000f, 0x4d2c0000, 0x59325809, 0x4a025a07, 0x00000006, 0x497a5c0a, 0x0201f800, 0x000203ef, 0x59300a26, - 0x82040d80, 0x00000003, 0x02000800, 0x001048bd, + 0x82040d80, 0x00000003, 0x02000800, 0x001049bd, 0x5c025800, 0x497a6009, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010fc72, 0x5c027800, 0x42003000, - 0x00000011, 0x0201f800, 0x0010b412, 0x42000000, - 0x0010cc23, 0x0201f800, 0x0010bc88, 0x4c5c0000, - 0x4130b800, 0x0201f800, 0x00107cfe, 0x04000009, + 0x0201f800, 0x0010ff80, 0x5c027800, 0x42003000, + 0x00000011, 0x0201f800, 0x0010b73d, 0x42000000, + 0x0010cf23, 0x0201f800, 0x0010bfb3, 0x4c5c0000, + 0x4130b800, 0x0201f800, 0x00107ef8, 0x04000009, 0x4936600a, 0x4926601c, 0x4d300000, 0x405e6000, - 0x0201f800, 0x00107cbe, 0x5c026000, 0x0401f002, + 0x0201f800, 0x00107eb4, 0x5c026000, 0x0401f002, 0x405e6000, 0x5c00b800, 0x497a6009, 0x4a026407, 0x00000001, 0x4a026403, 0x00000001, 0x59240400, 0x8c00050a, 0x04020011, 0x4a026407, 0x00000004, 0x4a026203, 0x00000007, 0x4a026429, 0x00000001, 0x42003000, 0x00000004, 0x4d400000, 0x42028000, - 0x00000029, 0x41782800, 0x0201f800, 0x0010ae7c, + 0x00000029, 0x41782800, 0x0201f800, 0x0010b18b, 0x5c028000, 0x1c01f000, 0x42000800, 0x0000000b, - 0x0201f800, 0x001044f1, 0x4a026203, 0x00000001, - 0x0201f000, 0x00106b17, 0x42000000, 0x0010cc36, - 0x0201f800, 0x0010bc88, 0x59300203, 0x82000c80, + 0x0201f800, 0x001045ea, 0x4a026203, 0x00000001, + 0x0201f000, 0x00106d1c, 0x42000000, 0x0010cf36, + 0x0201f800, 0x0010bfb3, 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, 0x0010032e, 0x4803c857, - 0x0c01f001, 0x00109633, 0x0010961b, 0x0010961f, - 0x00109634, 0x0010961d, 0x0010961b, 0x0010961b, - 0x0010961b, 0x0010961b, 0x0010961b, 0x0010961b, - 0x0010961b, 0x0010961b, 0x0010961b, 0x0201f800, - 0x0010032e, 0x0201f800, 0x00100c75, 0x4d2c0000, + 0x0c01f001, 0x0010986b, 0x00109853, 0x00109857, + 0x0010986c, 0x00109855, 0x00109853, 0x00109853, + 0x00109853, 0x00109853, 0x00109853, 0x00109853, + 0x00109853, 0x00109853, 0x00109853, 0x0201f800, + 0x0010032e, 0x0201f800, 0x00100c76, 0x4d2c0000, 0x59325809, 0x4a025a07, 0x00000006, 0x0201f800, 0x000203ef, 0x5c025800, 0x497a6009, 0x4a026226, 0x0000000a, 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, 0x42000800, 0x8000404b, 0x0201f000, 0x00020b3e, 0x1c01f000, - 0x0201f800, 0x00106c3c, 0x4df00000, 0x0401fce7, - 0x04020004, 0x0201f800, 0x00106f25, 0x0402000d, - 0x0201f800, 0x0010fd55, 0x80c40040, 0x04020005, - 0x5c03e000, 0x0201f800, 0x00106c29, 0x0401f7dc, - 0x0201f800, 0x00106b47, 0x02020800, 0x0010032e, - 0x5c03e000, 0x0201f800, 0x00106c29, 0x59300203, + 0x0201f800, 0x00106e41, 0x4df00000, 0x0401fce3, + 0x04020004, 0x0201f800, 0x0010712a, 0x0402000d, + 0x0201f800, 0x00110065, 0x80c40040, 0x04020005, + 0x5c03e000, 0x0201f800, 0x00106e2e, 0x0401f7dc, + 0x0201f800, 0x00106d4c, 0x02020800, 0x0010032e, + 0x5c03e000, 0x0201f800, 0x00106e2e, 0x59300203, 0x82000d80, 0x00000003, 0x02000800, 0x0010032e, 0x82000c80, 0x0000000e, 0x02021800, 0x0010032e, 0x0c01f7b9, 0x59a8000d, 0x59a8084f, 0x80040400, @@ -24182,64 +24376,64 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0401f832, 0x4d380000, 0x42027000, 0x0000004b, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x0201f800, 0x00107cfe, 0x0400001e, - 0x0401f822, 0x4d300000, 0x0201f800, 0x00106c3c, + 0x4d300000, 0x0201f800, 0x00107ef8, 0x0400001e, + 0x0401f822, 0x4d300000, 0x0201f800, 0x00106e41, 0x4df00000, 0x4d3c0000, 0x42027800, 0x00002000, - 0x0201f800, 0x0011014a, 0x0201f800, 0x001101e3, - 0x0201f800, 0x00110623, 0x5c027800, 0x5c03e000, - 0x02000800, 0x00106c29, 0x5c026000, 0x8d3e7d3e, + 0x0201f800, 0x00110447, 0x0201f800, 0x001104e0, + 0x0201f800, 0x00110916, 0x5c027800, 0x5c03e000, + 0x02000800, 0x00106e2e, 0x5c026000, 0x8d3e7d3e, 0x0402000b, 0x4d380000, 0x42027000, 0x0000004c, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, 0x0201f800, 0x00020b9d, 0x0401f7fa, 0x592c0408, 0x494a6018, 0x494e6019, 0x4936600a, 0x492e6009, 0x4a026407, 0x00000003, 0x800000c2, 0x800008c4, 0x80040400, - 0x48026006, 0x0201f800, 0x00104971, 0x4926601c, + 0x48026006, 0x0201f800, 0x00104a73, 0x4926601c, 0x1c01f000, 0x493bc857, 0x4d300000, 0x0201f800, 0x00020b7b, 0x0400000d, 0x0401ffec, 0x4d400000, 0x42028000, 0x00000005, 0x0401f80d, 0x5c028000, 0x8d3e7d3e, 0x04020007, 0x0201f800, 0x00020bc1, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, 0x0201f800, 0x00020b9d, 0x0401f7fa, 0x4803c856, - 0x0201f800, 0x00106c3c, 0x4df00000, 0x4d3c0000, + 0x0201f800, 0x00106e41, 0x4df00000, 0x4d3c0000, 0x4d440000, 0x59368c03, 0x42027800, 0x00002001, - 0x0201f800, 0x001100b9, 0x0201f800, 0x0011010b, - 0x0201f800, 0x001101e3, 0x0201f800, 0x00110623, + 0x0201f800, 0x001103b6, 0x0201f800, 0x00110408, + 0x0201f800, 0x001104e0, 0x0201f800, 0x00110916, 0x5c028800, 0x5c027800, 0x5c03e000, 0x02000000, - 0x00106c29, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x0201f800, 0x00107cfe, 0x04000012, 0x481a601d, - 0x48ee602a, 0x4936600a, 0x0201f800, 0x00104971, + 0x00106e2e, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x0201f800, 0x00107ef8, 0x04000012, 0x481a601d, + 0x48ee602a, 0x4936600a, 0x0201f800, 0x00104a73, 0x4926601c, 0x4a026407, 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, 0x0000001f, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x0201f800, 0x00107cfe, 0x04000011, 0x48ee602a, - 0x4936600a, 0x0201f800, 0x00104971, 0x4926601c, + 0x0201f800, 0x00107ef8, 0x04000011, 0x48ee602a, + 0x4936600a, 0x0201f800, 0x00104a73, 0x4926601c, 0x4a026407, 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, 0x00000055, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800, - 0x00107cfe, 0x04000012, 0x481a601d, 0x48ee602a, - 0x4936600a, 0x0201f800, 0x00104971, 0x4926601c, + 0x00107ef8, 0x04000012, 0x481a601d, 0x48ee602a, + 0x4936600a, 0x0201f800, 0x00104a73, 0x4926601c, 0x4a026407, 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, 0x0000003d, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800, - 0x00107cfe, 0x04000015, 0x4926601c, 0x4936600a, + 0x00107ef8, 0x04000015, 0x4926601c, 0x4936600a, 0x492fc857, 0x4933c857, 0x592c0405, 0x8c00051e, 0x04000003, 0x48efc857, 0x48ee602a, 0x4a026407, 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, 0x00000000, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x0201f800, 0x00107cfe, + 0x4803c856, 0x4d300000, 0x0201f800, 0x00107ef8, 0x04000012, 0x48ee602a, 0x481a601d, 0x4936600a, - 0x0201f800, 0x00104971, 0x4926601c, 0x4a026407, + 0x0201f800, 0x00104a73, 0x4926601c, 0x4a026407, 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, 0x00000044, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x0201f800, 0x00107cfe, + 0x4803c856, 0x4d300000, 0x0201f800, 0x00107ef8, 0x04000012, 0x481a601d, 0x48ee602a, 0x4936600a, - 0x0201f800, 0x00104971, 0x4926601c, 0x4a026407, + 0x0201f800, 0x00104a73, 0x4926601c, 0x4a026407, 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, 0x00000049, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, @@ -24257,7 +24451,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00000000, 0x1c01f000, 0x4803c856, 0x4c000000, 0x4d2c0000, 0x59300407, 0x82000580, 0x00000004, 0x0400001d, 0x59300009, 0x80025d40, 0x800001c0, - 0x04000019, 0x0201f800, 0x00109d13, 0x04000014, + 0x04000019, 0x0201f800, 0x00109f51, 0x04000014, 0x59300407, 0x82004580, 0x00000010, 0x04000010, 0x82004580, 0x00000011, 0x0400000d, 0x82004580, 0x00000003, 0x0400000c, 0x82004580, 0x00000002, @@ -24265,26 +24459,26 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x592c0405, 0x8c00051e, 0x04000003, 0x80000580, 0x0401f003, 0x82000540, 0x00000001, 0x5c025800, 0x5c000000, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x0201f800, 0x00107cfe, 0x04000014, 0x4926601c, + 0x0201f800, 0x00107ef8, 0x04000014, 0x4926601c, 0x4936600a, 0x48ee602a, 0x4a026407, 0x00000001, 0x492e6009, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010fc72, 0x5c027800, 0x4d380000, 0x42027000, + 0x0010ff80, 0x5c027800, 0x4d380000, 0x42027000, 0x00000028, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, 0x83380580, 0x00000015, 0x0402000e, 0x59a8005a, 0x82000580, 0x00000074, 0x0402000a, - 0x41780800, 0x0201f800, 0x001045e8, 0x4a026203, + 0x41780800, 0x0201f800, 0x001046e4, 0x4a026203, 0x00000001, 0x4a026403, 0x00000029, 0x0201f000, - 0x00106b17, 0x0201f800, 0x001084a2, 0x0201f000, + 0x00106d1c, 0x0201f800, 0x001086a8, 0x0201f000, 0x00020b9d, 0x4803c856, 0x83380580, 0x00000016, 0x04020007, 0x42000800, 0x00000004, 0x0201f800, - 0x001044f1, 0x0201f000, 0x00107f2a, 0x83380580, + 0x001045ea, 0x0201f000, 0x00108127, 0x83380580, 0x00000015, 0x04020013, 0x59a8005a, 0x82000580, - 0x00000014, 0x0402000f, 0x0201f800, 0x00104652, - 0x0201f800, 0x00108a16, 0x0402000a, 0x59340404, + 0x00000014, 0x0402000f, 0x0201f800, 0x00104752, + 0x0201f800, 0x00108c3c, 0x0402000a, 0x59340404, 0x80000540, 0x04000007, 0x42000800, 0x00000006, - 0x0201f800, 0x001044f1, 0x0201f000, 0x00107f2a, - 0x0201f800, 0x001084a2, 0x0201f000, 0x00020b9d, + 0x0201f800, 0x001045ea, 0x0201f000, 0x00108127, + 0x0201f800, 0x001086a8, 0x0201f000, 0x00020b9d, 0x4803c856, 0x592c0207, 0x82000580, 0x00000005, 0x04000002, 0x1c01f000, 0x4803c856, 0x592c0209, 0x8400054a, 0x48025a09, 0x1c01f000, 0x59300809, @@ -24301,18 +24495,18 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00020b3e, 0x4933c857, 0x4d340000, 0x5932680a, 0x59340200, 0x8c00050e, 0x04000006, 0x59300407, 0x82000c80, 0x00000014, 0x04021004, 0x0c01f806, - 0x5c026800, 0x1c01f000, 0x0201f800, 0x001093d2, - 0x0401f7fc, 0x001093d2, 0x0010987d, 0x00109881, - 0x00109884, 0x0010af91, 0x0010afae, 0x0010afb2, - 0x001093d2, 0x001093d2, 0x001093d2, 0x001093d2, - 0x001093d2, 0x001093d2, 0x001093d2, 0x001093d2, - 0x001093d2, 0x001093d2, 0x001093d2, 0x001093d2, - 0x001093d2, 0x4803c856, 0x40000000, 0x40000000, + 0x5c026800, 0x1c01f000, 0x0201f800, 0x00109606, + 0x0401f7fc, 0x00109606, 0x00109ab5, 0x00109ab9, + 0x00109abc, 0x0010b2a8, 0x0010b2c5, 0x0010b2c9, + 0x00109606, 0x00109606, 0x00109606, 0x00109606, + 0x00109606, 0x00109606, 0x00109606, 0x00109606, + 0x00109606, 0x00109606, 0x00109606, 0x00109606, + 0x00109606, 0x4803c856, 0x40000000, 0x40000000, 0x1c01f000, 0x40000000, 0x40000000, 0x1c01f000, 0x5930001d, 0x4803c857, 0x59300415, 0x4933c857, 0x4803c857, 0x8c000502, 0x04000005, 0x4803c857, 0x84000540, 0x48026415, 0x1c01f000, 0x42000000, - 0xd0000000, 0x41300800, 0x0201f800, 0x001008c9, + 0xd0000000, 0x41300800, 0x0201f800, 0x001008c7, 0x0401f810, 0x0402000e, 0x59300c15, 0x59300403, 0x82000580, 0x00000040, 0x04000003, 0x84040d40, 0x0401f005, 0x59a8002a, 0x82000400, 0x0000000a, @@ -24322,9 +24516,9 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x80000540, 0x04020036, 0x59300403, 0x4803c857, 0x82000580, 0x00000040, 0x04000003, 0x8d0e1d0e, 0x0402002d, 0x4d1c0000, 0x41323800, 0x0201f800, - 0x00107cfe, 0x04000026, 0x4932381d, 0x591c0415, + 0x00107ef8, 0x04000026, 0x4932381d, 0x591c0415, 0x84000542, 0x48023c15, 0x4936600a, 0x0201f800, - 0x00104971, 0x4926601c, 0x591c0407, 0x82000580, + 0x00104a73, 0x4926601c, 0x591c0407, 0x82000580, 0x00000003, 0x04000006, 0x591c0202, 0x4802641a, 0x591c0402, 0x4802621a, 0x0401f005, 0x591c0202, 0x4802621a, 0x591c0402, 0x4802641a, 0x491e6027, @@ -24339,7 +24533,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x48023808, 0x497a580a, 0x0401f019, 0x592c0409, 0x8c000518, 0x04000016, 0x84000518, 0x48025c09, 0x4d400000, 0x592e8207, 0x4a025a07, 0x00000001, - 0x0201f800, 0x00109d18, 0x49425a07, 0x5c028000, + 0x0201f800, 0x00109f56, 0x49425a07, 0x5c028000, 0x497a580a, 0x592c0409, 0x8c000512, 0x04000008, 0x4d2c0000, 0x84000512, 0x48025c09, 0x592e580a, 0x0201f800, 0x0010059d, 0x5c025800, 0x59a8002c, @@ -24373,46 +24567,46 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x82040480, 0x0000003c, 0x04021003, 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fd, 0x41780800, 0x59a81028, 0x42000000, 0x00000032, - 0x0201f800, 0x00106a98, 0x800811c0, 0x04020003, + 0x0201f800, 0x00106c9d, 0x800811c0, 0x04020003, 0x42001000, 0x00000014, 0x480b502a, 0x59a81029, 0x480b5022, 0x41780800, 0x42000000, 0x00000064, - 0x0201f800, 0x00106a98, 0x800811c0, 0x04020003, + 0x0201f800, 0x00106c9d, 0x800811c0, 0x04020003, 0x42001000, 0x00000014, 0x480b502b, 0x82081400, 0x0000000a, 0x480b502c, 0x42000800, 0x00000001, - 0x0201f800, 0x00106c63, 0x42000000, 0x30000000, + 0x0201f800, 0x00106e68, 0x42000000, 0x30000000, 0x40080800, 0x0201f800, 0x0002010e, 0x42000800, - 0x00000003, 0x59a8100f, 0x0201f800, 0x00106c63, - 0x0201f000, 0x00104896, 0x4a03502a, 0x00000028, + 0x00000003, 0x59a8100f, 0x0201f800, 0x00106e68, + 0x0201f000, 0x00104996, 0x4a03502a, 0x00000028, 0x4a03502b, 0x00000014, 0x4a035022, 0x000007d0, 0x42001000, 0x0000001e, 0x480b502c, 0x42000800, - 0x00000001, 0x0201f800, 0x00106c63, 0x42000000, + 0x00000001, 0x0201f800, 0x00106e68, 0x42000000, 0x30000000, 0x40080800, 0x0201f800, 0x0002010e, 0x42000800, 0x00000003, 0x59a8100f, 0x0201f000, - 0x00106c63, 0x4933c857, 0x4d2c0000, 0x59300403, + 0x00106e68, 0x4933c857, 0x4d2c0000, 0x59300403, 0x82000580, 0x0000003e, 0x04020005, 0x59325818, 0x812e59c0, 0x02020800, 0x00100594, 0x5c025800, 0x1c01f000, 0x4937c857, 0x4d300000, 0x0201f800, - 0x00107cfe, 0x04000012, 0x4926601c, 0x4936600a, + 0x00107ef8, 0x04000012, 0x4926601c, 0x4936600a, 0x4a026407, 0x00000001, 0x492e6009, 0x42000800, - 0x00000009, 0x0201f800, 0x001044f1, 0x4d380000, + 0x00000009, 0x0201f800, 0x001045ea, 0x4d380000, 0x42027000, 0x00000033, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c580000, 0x4d3c0000, 0x59325809, 0x83380580, 0x00000015, 0x04020025, 0x59a8b05a, 0x82580c80, 0x00000019, 0x04001003, 0x4200b000, 0x00000018, 0x8058b104, - 0x0401fae0, 0x80000580, 0x0401faf0, 0x832cac00, + 0x0401fae6, 0x80000580, 0x0401faf6, 0x832cac00, 0x0000000a, 0x83cca400, 0x00000006, 0x0201f800, - 0x0010bd5b, 0x4c600000, 0x4200c000, 0x00000001, + 0x0010c086, 0x4c600000, 0x4200c000, 0x00000001, 0x592c100b, 0x8c081518, 0x04020006, 0x59240005, 0x592c100e, 0x80080580, 0x04020007, 0x4178c000, 0x5930100a, 0x58081403, 0x417a7800, 0x0201f800, - 0x00101cda, 0x5c00c000, 0x0201f800, 0x00107f2a, - 0x0401f008, 0x4200b000, 0x00000002, 0x0401fadf, - 0x0201f800, 0x001084a2, 0x0201f800, 0x00020b9d, + 0x00101ce3, 0x5c00c000, 0x0201f800, 0x00108127, + 0x0401f008, 0x4200b000, 0x00000002, 0x0401fae5, + 0x0201f800, 0x001086a8, 0x0201f800, 0x00020b9d, 0x5c027800, 0x5c00b000, 0x5c025800, 0x1c01f000, 0x4933c856, 0x42018800, 0x00000000, 0x4a02601c, - 0x0010ccd1, 0x4936600a, 0x4a026407, 0x00000001, + 0x0010cfd1, 0x4936600a, 0x4a026407, 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, 0x0000004d, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x42018800, 0x00000001, 0x1c01f000, @@ -24421,14 +24615,14 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x80040580, 0x04020027, 0x4c500000, 0x4c540000, 0x4c580000, 0x83cca400, 0x00000006, 0x4050a800, 0x5930b40b, 0x8258b400, 0x00000003, 0x8058b104, - 0x0201f800, 0x0010bd85, 0x83cca400, 0x00000006, + 0x0201f800, 0x0010c0b0, 0x83cca400, 0x00000006, 0x592cb206, 0x8258b400, 0x00000003, 0x8058b104, - 0x832cac00, 0x00000007, 0x0201f800, 0x0010bd5b, + 0x832cac00, 0x00000007, 0x0201f800, 0x0010c086, 0x592e5801, 0x812e59c0, 0x040207f6, 0x5931d82a, 0x58ef400a, 0x58ee580c, 0x4a025a05, 0x00000103, 0x58ec0008, 0x0801f800, 0x59300402, 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, - 0x0201f800, 0x001084a2, 0x5c025800, 0x1c01f000, + 0x0201f800, 0x001086a8, 0x5c025800, 0x1c01f000, 0x4933c857, 0x82040d80, 0x00000035, 0x04000005, 0x5930141a, 0x0401f858, 0x04000027, 0x0401f006, 0x4d300000, 0x59326027, 0x0401f85e, 0x5c026000, @@ -24452,29 +24646,29 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0401f807, 0x42018800, 0x00000001, 0x04020003, 0x42018800, 0x00000000, 0x1c01f000, 0x59300808, 0x8c040d1e, 0x592c0c09, 0x04020002, 0x8c040d18, - 0x1c01f000, 0x0201f800, 0x00109655, 0x04000008, - 0x42000800, 0x0000002c, 0x0201f800, 0x00106a79, - 0x82063c00, 0x00111264, 0x491fc857, 0x1c01f000, - 0x0201f800, 0x0010a09b, 0x04020007, 0x59301402, + 0x1c01f000, 0x0201f800, 0x0010988d, 0x04000008, + 0x42000800, 0x0000002c, 0x0201f800, 0x00106c7e, + 0x82063c00, 0x00111584, 0x491fc857, 0x1c01f000, + 0x0201f800, 0x0010a2d8, 0x04020007, 0x59301402, 0x0401fff1, 0x04000007, 0x411c0000, 0x81300580, 0x04000003, 0x81780500, 0x0401f002, 0x81300540, 0x1c01f000, 0x4d300000, 0x83440480, 0x000007f0, - 0x04001004, 0x0201f800, 0x0010497a, 0x0401f003, + 0x04001004, 0x0201f800, 0x00104a7c, 0x0401f003, 0x0201f800, 0x0002034c, 0x0402000d, 0x42026000, - 0x0011120c, 0x4936600a, 0x492e6009, 0x0201f800, - 0x00104971, 0x4926601c, 0x0201f800, 0x0010fc72, + 0x0011152c, 0x4936600a, 0x492e6009, 0x0201f800, + 0x00104a73, 0x4926601c, 0x0201f800, 0x0010ff80, 0x80000580, 0x5c026000, 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fc, 0x4933c857, 0x0201f800, - 0x00109667, 0x02000800, 0x0010032e, 0x4d2c0000, + 0x0010989f, 0x02000800, 0x0010032e, 0x4d2c0000, 0x4d340000, 0x4d440000, 0x4c580000, 0x59325809, 0x5932680a, 0x49425a07, 0x0201f800, 0x00020864, 0x592e8c07, 0x592c4208, 0x82200500, 0x0000000f, 0x0c01f806, 0x5c00b000, 0x5c028800, 0x5c026800, - 0x5c025800, 0x1c01f000, 0x00109b1d, 0x00109b3f, - 0x00109b46, 0x00109b4a, 0x00109b53, 0x00109b1a, - 0x00109b1a, 0x00109b1a, 0x00109b57, 0x00109b63, - 0x00109b63, 0x00109b1a, 0x00109b1a, 0x00109b1a, - 0x00109b1a, 0x00109b1a, 0x4803c857, 0x0201f800, + 0x5c025800, 0x1c01f000, 0x00109d55, 0x00109d77, + 0x00109d7e, 0x00109d82, 0x00109d8b, 0x00109d52, + 0x00109d52, 0x00109d52, 0x00109d8f, 0x00109d9b, + 0x00109d9b, 0x00109d52, 0x00109d52, 0x00109d52, + 0x00109d52, 0x00109d52, 0x4803c857, 0x0201f800, 0x0010032e, 0x814281c0, 0x04020012, 0x41785800, 0x592c0405, 0x8c00051c, 0x04020002, 0x59345c05, 0x442c2800, 0x59340008, 0x48002802, 0x59340009, @@ -24490,19 +24684,19 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x59340200, 0x44002800, 0x59340001, 0x48002801, 0x4200b000, 0x00000002, 0x0401f014, 0x8340b540, 0x00000000, 0x0402001b, 0x0401f010, 0x8340b540, - 0x00000000, 0x0400000d, 0x0201f800, 0x0010495c, + 0x00000000, 0x0400000d, 0x0201f800, 0x00104a5e, 0x04000014, 0x8c20450e, 0x04000002, 0x497a600a, 0x4178b000, 0x497a5a07, 0x0401f004, 0x8340b540, 0x00000000, 0x0402000b, 0x592c0405, 0x8400051c, 0x48025c05, 0x592c0208, 0x8400051e, 0x48025a08, - 0x0401f968, 0x497a6009, 0x0201f000, 0x000203ef, + 0x0401f96e, 0x497a6009, 0x0201f000, 0x000203ef, 0x592c0208, 0x8c00051e, 0x4200b000, 0x00000002, 0x040207f2, 0x8204b540, 0x00000000, 0x040007ef, 0x44042800, 0x4200b000, 0x00000001, 0x0401f7eb, - 0x4937c857, 0x4d300000, 0x0201f800, 0x00107cfe, + 0x4937c857, 0x4d300000, 0x0201f800, 0x00107ef8, 0x04000012, 0x4926601c, 0x4936600a, 0x4a026407, 0x00000001, 0x492e6009, 0x42000800, 0x0000000b, - 0x0201f800, 0x001044f1, 0x4d380000, 0x42027000, + 0x0201f800, 0x001045ea, 0x4d380000, 0x42027000, 0x00000043, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, 0x4937c857, 0x4d2c0000, 0x4d200000, 0x59340013, @@ -24512,861 +24706,912 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04020013, 0x4d440000, 0x592e8c07, 0x592c0208, 0x4803c856, 0x82000500, 0x00000080, 0x84000548, 0x4d3c0000, 0x42027800, 0x00001000, 0x8c00050e, - 0x04000002, 0x853e7d5c, 0x0201f800, 0x001048c6, + 0x04000002, 0x853e7d5c, 0x0201f800, 0x001049c6, 0x5c027800, 0x5c028800, 0x0401f004, 0x4803c856, - 0x0201f800, 0x0010495c, 0x0201f800, 0x00109667, + 0x0201f800, 0x00104a5e, 0x0201f800, 0x0010989f, 0x04000017, 0x4d400000, 0x42028000, 0x00000000, 0x41780800, 0x0401ff31, 0x5c028000, 0x0401f00e, - 0x0201f800, 0x0010495c, 0x040207f4, 0x0201f800, - 0x00109667, 0x0400000a, 0x4c580000, 0x4200b000, - 0x00000002, 0x0401f925, 0x5c00b000, 0x0201f800, - 0x001084a2, 0x0201f800, 0x00020b9d, 0x5c024000, + 0x0201f800, 0x00104a5e, 0x040207f4, 0x0201f800, + 0x0010989f, 0x0400000a, 0x4c580000, 0x4200b000, + 0x00000002, 0x0401f92b, 0x5c00b000, 0x0201f800, + 0x001086a8, 0x0201f800, 0x00020b9d, 0x5c024000, 0x5c025800, 0x1c01f000, 0x4937c857, 0x4d300000, - 0x0201f800, 0x00107cfe, 0x04000013, 0x4926601c, + 0x0201f800, 0x00107ef8, 0x04000013, 0x4926601c, 0x4936600a, 0x4a026407, 0x00000001, 0x4d3c0000, - 0x4d380000, 0x417a7800, 0x0201f800, 0x001044e6, + 0x4d380000, 0x417a7800, 0x0201f800, 0x001045df, 0x492e6009, 0x42027000, 0x00000004, 0x0201f800, 0x00020bc1, 0x5c027000, 0x5c027800, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, 0x4937c857, - 0x4d300000, 0x0201f800, 0x00107cfe, 0x04000012, + 0x4d300000, 0x0201f800, 0x00107ef8, 0x04000012, 0x4926601c, 0x4936600a, 0x42000800, 0x00000003, - 0x0201f800, 0x001044f1, 0x4a026407, 0x00000001, + 0x0201f800, 0x001045ea, 0x4a026407, 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, 0x00000051, 0x0201f800, 0x00020bc1, 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, 0x4933c857, 0x4c580000, 0x4d240000, 0x4d200000, 0x4d400000, 0x4d440000, 0x4d3c0000, 0x5932481c, 0x59240a00, - 0x8c040d00, 0x040000a4, 0x0201f800, 0x00101f51, - 0x59325809, 0x83383580, 0x00000015, 0x04020061, - 0x42000800, 0x00000004, 0x0201f800, 0x001044f1, - 0x42000800, 0x00000001, 0x0201f800, 0x001045e8, - 0x812e59c0, 0x04020047, 0x59a8005e, 0x80000040, - 0x4803505e, 0x417a8000, 0x59cc0000, 0x82000500, - 0x00ffffff, 0x59240805, 0x4803c857, 0x4807c857, - 0x800409c0, 0x0400001d, 0x80041580, 0x0400001b, - 0x4c000000, 0x42028000, 0x0000002a, 0x59240400, - 0x8c00050a, 0x04020007, 0x42003000, 0x00000002, - 0x42028800, 0x0000ffff, 0x0201f800, 0x0010ae86, - 0x417a7800, 0x0201f800, 0x00101fa9, 0x0201f800, - 0x00102020, 0x42028000, 0x00000002, 0x59cc0c08, - 0x8c040d1e, 0x04020004, 0x59240a00, 0x84040d56, - 0x48064a00, 0x5c000000, 0x48024805, 0x40000800, - 0x812000f0, 0x80040540, 0x48026813, 0x40040000, - 0x83200c80, 0x00000040, 0x04021004, 0x49238830, - 0x84000570, 0x48038832, 0x59240200, 0x82000540, - 0x00000206, 0x48024a00, 0x59240400, 0x8c00050c, - 0x04000005, 0x4a026426, 0x00000051, 0x0401f85d, - 0x0401f055, 0x42000000, 0x00000001, 0x0201f800, - 0x00104d11, 0x0201f800, 0x00020b9d, 0x0401f04e, - 0x592c0009, 0x82000500, 0x00ffffff, 0x0402000a, - 0x0201f800, 0x00020864, 0x59cc0000, 0x82000500, - 0x00ffffff, 0x44002800, 0x4200b000, 0x00000001, - 0x0401f860, 0x0201f800, 0x00107f2a, 0x0401f03e, - 0x812e59c0, 0x04020037, 0x59340412, 0x800001c0, - 0x0400002f, 0x80000040, 0x48026c12, 0x59cc0c07, - 0x82043500, 0x000000ff, 0x481bc857, 0x82180580, - 0x00000003, 0x04020019, 0x59cc0207, 0x4803c857, - 0x82000d00, 0x0000ff00, 0x4807c857, 0x82040580, - 0x00000d00, 0x04020011, 0x59240a00, 0x84040d48, - 0x48064a00, 0x42000800, 0x0000000b, 0x0201f800, - 0x001044f1, 0x4a026407, 0x00000001, 0x4a026203, - 0x00000001, 0x4a026403, 0x00000001, 0x0201f800, - 0x00106b17, 0x0401f018, 0x42000800, 0x00000003, - 0x0201f800, 0x001044f1, 0x4a026202, 0x0000ffff, - 0x4a026203, 0x00000001, 0x4a026403, 0x00000051, - 0x0201f800, 0x00106b17, 0x0401f00b, 0x42002800, - 0x00000003, 0x0201f800, 0x0010a1bb, 0x0401f006, - 0x4200b000, 0x00000002, 0x0401f840, 0x0201f800, - 0x001084a2, 0x5c027800, 0x5c028800, 0x5c028000, - 0x5c024000, 0x5c024800, 0x5c00b000, 0x1c01f000, - 0x4933c857, 0x42028800, 0x000007fc, 0x42003000, - 0x00fffffc, 0x0201f800, 0x0010452c, 0x02020800, - 0x0010032e, 0x4936600a, 0x417a7800, 0x0201f800, - 0x001044e6, 0x42000800, 0x00000003, 0x0201f800, - 0x001044f1, 0x497a6c12, 0x4a026203, 0x00000001, - 0x4a026403, 0x00000002, 0x0201f000, 0x00106b17, - 0x492fc857, 0x4c580000, 0x4c000000, 0x8058b1c0, - 0x0400000b, 0x82580500, 0xfffffff0, 0x02020800, - 0x0010032e, 0x8058b0d0, 0x592c0409, 0x82000500, - 0xfffff0ff, 0x80580540, 0x48025c09, 0x5c000000, - 0x5c00b000, 0x1c01f000, 0x492fc857, 0x4c000000, - 0x4c040000, 0x800000d8, 0x592c0c09, 0x82040d00, - 0xffff0fff, 0x80040540, 0x48025c09, 0x5c000800, - 0x5c000000, 0x1c01f000, 0x4933c857, 0x4d2c0000, - 0x59325809, 0x592c0208, 0x8400055e, 0x48025a08, - 0x4c500000, 0x4c540000, 0x4c580000, 0x0401ffd9, - 0x0201f800, 0x00020864, 0x46002800, 0x00000018, - 0x80142800, 0x8058b040, 0x83cca400, 0x00000007, - 0x4014a800, 0x0201f800, 0x0010bd5b, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, - 0x0401f807, 0x42018800, 0x00000001, 0x04000003, - 0x42018800, 0x00000000, 0x1c01f000, 0x59325809, - 0x592c0205, 0x82000580, 0x00000152, 0x1c01f000, - 0x59300028, 0x80000540, 0x02020800, 0x00100aeb, - 0x1c01f000, 0x59300008, 0x82000500, 0x04000800, - 0x82000580, 0x04000800, 0x04020003, 0x59300220, - 0x48025c10, 0x1c01f000, 0x4d2c0000, 0x59325809, - 0x59300203, 0x4933c857, 0x492fc857, 0x493bc857, - 0x4803c857, 0x82003480, 0x0000000e, 0x02021800, - 0x0010032e, 0x0c01f803, 0x5c025800, 0x1c01f000, - 0x00109d42, 0x00109d4d, 0x00109d8b, 0x00109d42, - 0x00109d42, 0x00109d42, 0x00109d42, 0x00109d42, - 0x00109d44, 0x00109d42, 0x00109d42, 0x00109d42, - 0x00109d42, 0x00109d42, 0x0201f800, 0x0010032e, - 0x83383480, 0x00000058, 0x02021800, 0x0010032e, - 0x493a6403, 0x4a026203, 0x00000001, 0x0201f000, - 0x00106b17, 0x83380580, 0x00000013, 0x04020010, - 0x492fc857, 0x592c000d, 0x800001c0, 0x04000006, - 0x4a026203, 0x00000002, 0x59a8002a, 0x48026006, - 0x1c01f000, 0x4a025a07, 0x00000000, 0x0201f800, - 0x000203ef, 0x0201f000, 0x00020b9d, 0x83380580, - 0x00000027, 0x0400001b, 0x83380580, 0x00000014, - 0x04000012, 0x83380580, 0x00000015, 0x04000005, - 0x83380580, 0x00000016, 0x02020800, 0x0010032e, - 0x0201f800, 0x00107021, 0x02020000, 0x00107d3d, - 0x59300203, 0x82000580, 0x00000002, 0x02020800, - 0x0010032e, 0x0401f016, 0x4937c857, 0x0201f800, - 0x00106b8c, 0x4a02580f, 0x00000011, 0x0401f006, - 0x4937c857, 0x0201f800, 0x00106b8c, 0x4a02580f, - 0x00000010, 0x4a025a07, 0x00000031, 0x4a02580e, - 0x00000004, 0x0201f800, 0x000203ef, 0x0201f800, - 0x00104bb9, 0x0201f000, 0x00107cbe, 0x59341400, - 0x82081d00, 0x000000ff, 0x59300c03, 0x480bc857, - 0x4807c857, 0x82040580, 0x00000053, 0x0400002e, - 0x82040580, 0x00000002, 0x04000016, 0x82040580, - 0x00000001, 0x04000017, 0x82040580, 0x00000003, - 0x0400001c, 0x82040580, 0x00000005, 0x0400001d, - 0x82040580, 0x00000033, 0x0400001a, 0x82040580, - 0x00000000, 0x0400001b, 0x82040580, 0x00000004, - 0x02020800, 0x0010032e, 0x0401f89f, 0x0401f016, - 0x820c0580, 0x00000003, 0x04000849, 0x0401f012, - 0x820c0580, 0x0000000b, 0x0402000f, 0x42000800, - 0x00000007, 0x0201f800, 0x001044f1, 0x0401f00a, - 0x820c0580, 0x00000005, 0x04000862, 0x0401f006, - 0x820c0580, 0x00000009, 0x04000887, 0x0401f002, - 0x0401f891, 0x4a026403, 0x00000052, 0x59a8105a, - 0x592c040c, 0x8c000500, 0x04000003, 0x42001000, - 0x00000008, 0x592c040c, 0x8c000516, 0x04000003, - 0x82081400, 0x00000018, 0x592c000d, 0x497a580e, - 0x497a580f, 0x80080c80, 0x04000009, 0x04001005, - 0x4a025a07, 0x00000007, 0x40001000, 0x0401f006, - 0x4a025a07, 0x00000015, 0x0401f003, 0x4a025a07, - 0x00000000, 0x480a580d, 0x0201f800, 0x00107ea4, - 0x04000010, 0x592c1001, 0x480a600c, 0x58080800, - 0x82080400, 0x00000002, 0x592c1012, 0x592c1813, - 0x42003000, 0x00000000, 0x42002000, 0x00101085, - 0x0201f800, 0x00108059, 0x04000002, 0x1c01f000, - 0x4a025a07, 0x0000002c, 0x497a580d, 0x0201f800, - 0x000203ef, 0x0201f000, 0x00020b9d, 0x83380580, - 0x00000015, 0x0402000b, 0x59a80070, 0x8c000502, - 0x0402000c, 0x41780800, 0x0201f800, 0x001045e8, - 0x42000800, 0x00000004, 0x0201f000, 0x001044f1, - 0x42000800, 0x00000007, 0x0201f000, 0x001044f1, - 0x0201f800, 0x00104fc6, 0x42001000, 0x00000010, - 0x04020009, 0x59340002, 0x82000500, 0x00ff0000, - 0x82000580, 0x00ff0000, 0x040007eb, 0x42001000, - 0x00000008, 0x0201f800, 0x00104c17, 0x040007e6, - 0x592c040c, 0x84000540, 0x48025c0c, 0x0401f7e9, - 0x83380580, 0x00000015, 0x0402000f, 0x59a80070, - 0x8c000502, 0x04020010, 0x0201f800, 0x00104652, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x001044e6, - 0x5c027800, 0x42000800, 0x00000006, 0x0201f000, - 0x001044f1, 0x42000800, 0x00000004, 0x0201f000, - 0x001044f1, 0x0201f800, 0x00104fc6, 0x42001000, - 0x00000010, 0x04020009, 0x59340002, 0x82000500, - 0x00ff0000, 0x82000580, 0x00ff0000, 0x040007e7, - 0x42001000, 0x00000008, 0x0201f800, 0x00104c17, - 0x040007e2, 0x592c040c, 0x84000540, 0x48025c0c, - 0x0401f7e9, 0x42000800, 0x00000004, 0x0201f000, - 0x001044f1, 0x83380580, 0x00000015, 0x04020005, - 0x0201f800, 0x0010adf8, 0x02000800, 0x0010481c, - 0x1c01f000, 0x83380580, 0x00000015, 0x0402001d, - 0x4c580000, 0x83cc1400, 0x00000008, 0x4200b000, - 0x00000002, 0x83341c00, 0x00000006, 0x0201f800, - 0x00108a31, 0x04020012, 0x83cc1400, 0x0000000a, - 0x4200b000, 0x00000002, 0x83341c00, 0x00000008, - 0x0201f800, 0x00108a31, 0x04020009, 0x59342200, - 0x59cc1007, 0x800811c0, 0x04000003, 0x480a6801, - 0x84102542, 0x8410251a, 0x48126a00, 0x5c00b000, - 0x1c01f000, 0x42000000, 0x0010cc3b, 0x0201f800, - 0x0010bc88, 0x0201f800, 0x00106c3c, 0x59300203, - 0x4933c857, 0x4803c857, 0x82000c80, 0x0000000e, - 0x02021800, 0x0010032e, 0x0c01f803, 0x0201f000, - 0x00106c29, 0x00109e91, 0x00109ea0, 0x00109e92, - 0x00109e8f, 0x00109e8f, 0x00109e8f, 0x00109e8f, - 0x00109e8f, 0x00109e8f, 0x00109e8f, 0x00109e8f, - 0x00109e8f, 0x00109e8f, 0x00109e8f, 0x0201f800, - 0x0010032e, 0x1c01f000, 0x59300403, 0x82000580, - 0x00000052, 0x02000000, 0x001093db, 0x0201f800, - 0x00104bb9, 0x59325809, 0x4a025a07, 0x00000006, - 0x0201f800, 0x000203ef, 0x0201f000, 0x00107cbe, - 0x59301804, 0x840c0520, 0x48026004, 0x598c000f, - 0x81300580, 0x04020010, 0x8c0c1d20, 0x04020010, - 0x42001000, 0x0010cb5b, 0x50081000, 0x58080002, - 0x82000580, 0x00000100, 0x0400000f, 0x5808000b, - 0x81300580, 0x02020800, 0x0010032e, 0x4978100b, - 0x0401f003, 0x8c0c1d20, 0x040207dc, 0x0201f800, - 0x0010fece, 0x80c40040, 0x040007d8, 0x0201f800, - 0x0010032e, 0x0201f800, 0x00106f5c, 0x040007f8, - 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, - 0x0010032e, 0x0c01f7bc, 0x4933c857, 0x4c500000, - 0x4c540000, 0x4c580000, 0x592c0c08, 0x48065814, - 0x59cc0809, 0x48065808, 0x59cc0808, 0x4806580c, - 0x59a8086f, 0x82040500, 0x000003ff, 0x800010c4, - 0x8c040d14, 0x04000005, 0x59cc0002, 0x82000500, - 0x00000003, 0x80081480, 0x480a621b, 0x412c0800, - 0x0201f800, 0x0010056e, 0x02000800, 0x0010032e, - 0x492c080a, 0x58040409, 0x84000552, 0x84000540, - 0x48000c09, 0x82081400, 0x00000003, 0x80081104, - 0x83cca400, 0x00000006, 0x832cac00, 0x00000005, - 0x42000800, 0x00000010, 0x82080480, 0x00000010, - 0x04021003, 0x40080800, 0x80000580, 0x4004b000, - 0x4c000000, 0x0201f800, 0x0010bd85, 0x5c000000, - 0x800001c0, 0x0400000d, 0x412c1000, 0x4c000000, - 0x0201f800, 0x0010056e, 0x02000800, 0x0010032e, - 0x492c1001, 0x832cac00, 0x00000005, 0x5c000000, - 0x40001000, 0x0401f7e9, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x1c01f000, 0x4933c857, 0x4d2c0000, - 0x4c380000, 0x59325809, 0x5930021b, 0x48025a09, - 0x59301012, 0x4a026203, 0x00000002, 0x592c020b, - 0x8c000500, 0x04000004, 0x59300016, 0x592c1010, - 0x80081480, 0x40080000, 0x0401f98b, 0x80001540, - 0x04020008, 0x4a025a07, 0x00000000, 0x592c000c, - 0x82000500, 0x00000c00, 0x0400000b, 0x0401f00b, - 0x8c08153e, 0x04000006, 0x4a025a07, 0x00000007, - 0x80081080, 0x80081000, 0x0401f003, 0x4a025a07, - 0x00000015, 0x480a5808, 0x42000000, 0x0010dfe6, - 0x50007000, 0x5838000a, 0x80000540, 0x04020008, - 0x4930700b, 0x4930700a, 0x58380002, 0x82000580, - 0x00000000, 0x04020809, 0x0401f005, 0x82001400, - 0x00000000, 0x45301000, 0x4930700a, 0x5c007000, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x592c000a, - 0x40001000, 0x48007009, 0x82080400, 0x00000005, - 0x48007003, 0x592c000e, 0x592c100f, 0x48007006, - 0x48087007, 0x592c0014, 0x592c1209, 0x80080c80, - 0x04001002, 0x40001000, 0x82081400, 0x00000003, - 0x80081104, 0x82080480, 0x00000010, 0x04021003, - 0x80000580, 0x0401f003, 0x42001000, 0x00000010, - 0x4800700c, 0x48087004, 0x800810c4, 0x48087005, - 0x40381000, 0x0201f000, 0x00020016, 0x4d2c0000, - 0x0201f800, 0x0010056e, 0x02000800, 0x0010032e, - 0x42000800, 0x0010dfe6, 0x452c0800, 0x497a580a, - 0x497a580b, 0x497a580c, 0x4a025808, 0x00109f76, - 0x4a025802, 0x00000100, 0x4a025801, 0x00000000, - 0x5c025800, 0x1c01f000, 0x4833c857, 0x4d300000, - 0x4d2c0000, 0x4c5c0000, 0x4030b800, 0x585c0009, - 0x80025d40, 0x04020004, 0x585c000b, 0x4c000000, - 0x0401f044, 0x585c0002, 0x82000580, 0x00000100, - 0x04020022, 0x592c0801, 0x4c040000, 0x0201f800, - 0x00100594, 0x5c000800, 0x800409c0, 0x0400001c, - 0x4804b809, 0x585c100c, 0x800811c0, 0x04020005, - 0x40065800, 0x0201f800, 0x0010059d, 0x0401f014, - 0x82080480, 0x00000010, 0x04021003, 0x80000580, - 0x0401f003, 0x42001000, 0x00000010, 0x4800b80c, - 0x4808b804, 0x800810c4, 0x4808b805, 0x82040400, - 0x00000005, 0x4800b803, 0x405c1000, 0x0201f800, - 0x00020016, 0x0401f025, 0x0401f828, 0x585c000b, - 0x80026540, 0x59300000, 0x80000d40, 0x04020002, - 0x4800b80a, 0x4800b80b, 0x497a6000, 0x4c000000, - 0x4978b809, 0x59325809, 0x4a025a05, 0x00000103, - 0x59300402, 0x48025c07, 0x592c100c, 0x4c080000, - 0x0201f800, 0x000203ef, 0x0201f800, 0x0010977c, - 0x5c001000, 0x8c081518, 0x04000004, 0x0201f800, - 0x0010984f, 0x0401f003, 0x0201f800, 0x00020b9d, - 0x405c7000, 0x5c000000, 0x80026540, 0x04000003, - 0x59325809, 0x0401ff79, 0x5c00b800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x483bc857, 0x58380009, - 0x40025800, 0x0201f800, 0x0010059d, 0x5838000b, - 0x80026540, 0x59300009, 0x80025d40, 0x4a025a07, - 0x00000002, 0x1c01f000, 0x4803c857, 0x4933c857, - 0x4d1c0000, 0x497a601d, 0x41323800, 0x40026000, - 0x4d3c0000, 0x42027800, 0x00000005, 0x0401f843, - 0x5c027800, 0x411e6000, 0x4933c857, 0x59300415, - 0x84000502, 0x48026415, 0x5c023800, 0x1c01f000, - 0x481bc857, 0x4933c857, 0x4c5c0000, 0x4c600000, - 0x4010b800, 0x4014c000, 0x0201f800, 0x0010b412, - 0x0201f800, 0x00101f51, 0x59240400, 0x8c00050a, - 0x04020008, 0x40602800, 0x405c3000, 0x0201f800, - 0x0010ae86, 0x82000540, 0x00000001, 0x0401f002, - 0x80000580, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x42026000, 0x00111264, - 0x59a8000d, 0x81640580, 0x0400001a, 0x59300c07, - 0x82040580, 0x00000001, 0x0400000d, 0x82040580, - 0x00000004, 0x04000006, 0x82040580, 0x00000010, - 0x02000800, 0x00109344, 0x0401f009, 0x59300203, - 0x82000d80, 0x00000007, 0x04000005, 0x4807c857, - 0x0201f800, 0x00109972, 0x04020808, 0x83326400, - 0x0000002c, 0x41580000, 0x81300480, 0x040017e5, - 0x5c026000, 0x1c01f000, 0x4933c857, 0x59300403, - 0x4803c857, 0x0201f800, 0x00106c3c, 0x4df00000, - 0x59300407, 0x4803c857, 0x82000d80, 0x00000002, - 0x04000018, 0x82000d80, 0x00000001, 0x04000009, - 0x82000d80, 0x00000004, 0x04000006, 0x4933c856, - 0x5c03e000, 0x02000800, 0x00106c29, 0x0401f050, - 0x59300203, 0x82000d80, 0x00000001, 0x04000018, - 0x82000d80, 0x00000002, 0x04000036, 0x82000d80, - 0x00000005, 0x04000033, 0x0201f800, 0x0010032e, - 0x59300203, 0x82000d80, 0x00000009, 0x0400000c, - 0x82000d80, 0x0000000b, 0x04000009, 0x82000d80, - 0x0000000a, 0x04000027, 0x82000d80, 0x0000000c, - 0x04000024, 0x0201f800, 0x0010032e, 0x598c000f, - 0x81300580, 0x04020004, 0x0201f800, 0x00106f5c, - 0x0402001c, 0x59300004, 0x4803c857, 0x8c000520, - 0x04000004, 0x84000520, 0x48026004, 0x0401f015, - 0x0201f800, 0x0010fece, 0x80c40040, 0x02020800, - 0x0010032e, 0x5c03e000, 0x02000800, 0x00106c29, - 0x59300407, 0x82000d80, 0x00000002, 0x04000007, - 0x0201f800, 0x00104bb9, 0x0201f800, 0x001097aa, - 0x02000800, 0x001084a2, 0x0201f000, 0x00107cbe, - 0x5c03e000, 0x02000800, 0x00106c29, 0x59300407, - 0x82000d80, 0x00000002, 0x0400000d, 0x5930081c, - 0x58040200, 0x8c000500, 0x04000132, 0x0201f800, - 0x00104bb9, 0x0201f800, 0x001097aa, 0x02000800, - 0x001084a2, 0x8d3e7d00, 0x04000005, 0x0201f800, - 0x0010b4fc, 0x0201f000, 0x00107cbe, 0x4a026226, - 0x00000001, 0x4a026403, 0x00000085, 0x4a026203, - 0x00000009, 0x4a026407, 0x00000002, 0x42000800, - 0x8000004b, 0x0201f000, 0x00020b3e, 0x83300480, - 0x001111e0, 0x04001006, 0x41540000, 0x81300480, - 0x04021003, 0x80000580, 0x1c01f000, 0x81780080, - 0x1c01f000, 0x592c720b, 0x8c387500, 0x04020008, - 0x59307008, 0x8c387516, 0x04000005, 0x59307009, - 0x58387010, 0x59300013, 0x80380480, 0x1c01f000, - 0x59a8085a, 0x59cc2808, 0x82140500, 0x00000c00, - 0x04000004, 0x82040480, 0x00000010, 0x04001018, - 0x80001580, 0x8c142d12, 0x04000005, 0x82040480, - 0x00000014, 0x04001012, 0x59cc100a, 0x80000580, - 0x8c142d10, 0x04000005, 0x82040480, 0x00000018, - 0x0400100b, 0x59cc000b, 0x80080400, 0x04001008, - 0x04000006, 0x82000400, 0x00000018, 0x80040480, - 0x04001003, 0x80000580, 0x1c01f000, 0x42000000, - 0x0010cc18, 0x0201f800, 0x0010bc88, 0x82000540, - 0x00000001, 0x0401f7f9, 0x4933c857, 0x4937c857, - 0x4923c857, 0x4927c857, 0x492fc857, 0x48efc857, - 0x4d1c0000, 0x4d300000, 0x41323800, 0x0201f800, - 0x00107cfe, 0x04000021, 0x48ee602a, 0x4926601c, - 0x4936600a, 0x591c0407, 0x82000580, 0x00000003, - 0x04000008, 0x591c0202, 0x4803c857, 0x4802641a, - 0x591c0402, 0x4802621a, 0x4803c857, 0x0401f007, - 0x591c0202, 0x4803c857, 0x4802621a, 0x591c0402, - 0x4802641a, 0x4803c857, 0x491e6027, 0x4a026407, - 0x00000001, 0x492e6009, 0x4d380000, 0x42027000, - 0x00000057, 0x0201f800, 0x00020bc1, 0x5c027000, - 0x82000540, 0x00000001, 0x5c026000, 0x5c023800, - 0x1c01f000, 0x4933c857, 0x493bc857, 0x4937c857, - 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, - 0x59325809, 0x0201f800, 0x00109667, 0x04000023, - 0x83cca400, 0x00000006, 0x832cac00, 0x00000007, - 0x83380580, 0x00000016, 0x04020009, 0x59a8005a, - 0x82000580, 0x00000008, 0x04020014, 0x492fc857, - 0x4200b000, 0x00000002, 0x0401f00b, 0x83380580, - 0x00000015, 0x0402000d, 0x492fc857, 0x59a8005a, - 0x82000580, 0x00000018, 0x04020008, 0x4200b000, - 0x00000006, 0x0201f800, 0x0010bd5b, 0x0201f800, - 0x00107f2a, 0x0401f005, 0x0201f800, 0x001084a2, - 0x0201f800, 0x00020b9d, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x0201f800, 0x00106c3c, 0x4df00000, 0x59300203, + 0x8c040d00, 0x040000aa, 0x0201f800, 0x00101fb4, + 0x59325809, 0x83383580, 0x00000015, 0x04020067, + 0x42000800, 0x00000004, 0x0201f800, 0x001045ea, + 0x42000800, 0x00000001, 0x0201f800, 0x001046e4, + 0x812e59c0, 0x0402004d, 0x59a8005e, 0x80000040, + 0x4803505e, 0x0201f800, 0x0010c0f4, 0x04000004, + 0x59240200, 0x8400051a, 0x48024a00, 0x417a8000, + 0x59cc0000, 0x82000500, 0x00ffffff, 0x59240805, + 0x4803c857, 0x4807c857, 0x800409c0, 0x0400001d, + 0x80041580, 0x0400001b, 0x4c000000, 0x42028000, + 0x0000002a, 0x59240400, 0x8c00050a, 0x04020007, + 0x42003000, 0x00000002, 0x42028800, 0x0000ffff, + 0x0201f800, 0x0010b195, 0x417a7800, 0x0201f800, + 0x0010200c, 0x0201f800, 0x00102087, 0x42028000, + 0x00000002, 0x59cc0c08, 0x8c040d1e, 0x04020004, + 0x59240a00, 0x84040d56, 0x48064a00, 0x5c000000, + 0x48024805, 0x40000800, 0x812000f0, 0x80040540, + 0x48026813, 0x40040000, 0x83200c80, 0x00000040, + 0x04021004, 0x49238830, 0x84000570, 0x48038832, + 0x59240200, 0x82000540, 0x00000206, 0x48024a00, + 0x59240400, 0x8c00050c, 0x04000005, 0x4a026426, + 0x00000051, 0x0401f85d, 0x0401f055, 0x42000000, + 0x00000001, 0x0201f800, 0x00104e36, 0x0201f800, + 0x00020b9d, 0x0401f04e, 0x592c0009, 0x82000500, + 0x00ffffff, 0x0402000a, 0x0201f800, 0x00020864, + 0x59cc0000, 0x82000500, 0x00ffffff, 0x44002800, + 0x4200b000, 0x00000001, 0x0401f860, 0x0201f800, + 0x00108127, 0x0401f03e, 0x812e59c0, 0x04020037, + 0x59340412, 0x800001c0, 0x0400002f, 0x80000040, + 0x48026c12, 0x59cc0c07, 0x82043500, 0x000000ff, + 0x481bc857, 0x82180580, 0x00000003, 0x04020019, + 0x59cc0207, 0x4803c857, 0x82000d00, 0x0000ff00, + 0x4807c857, 0x82040580, 0x00000d00, 0x04020011, + 0x59240a00, 0x84040d48, 0x48064a00, 0x42000800, + 0x0000000b, 0x0201f800, 0x001045ea, 0x4a026407, + 0x00000001, 0x4a026203, 0x00000001, 0x4a026403, + 0x00000001, 0x0201f800, 0x00106d1c, 0x0401f018, + 0x42000800, 0x00000003, 0x0201f800, 0x001045ea, + 0x4a026202, 0x0000ffff, 0x4a026203, 0x00000001, + 0x4a026403, 0x00000051, 0x0201f800, 0x00106d1c, + 0x0401f00b, 0x42002800, 0x00000003, 0x0201f800, + 0x0010a3f8, 0x0401f006, 0x4200b000, 0x00000002, + 0x0401f840, 0x0201f800, 0x001086a8, 0x5c027800, + 0x5c028800, 0x5c028000, 0x5c024000, 0x5c024800, + 0x5c00b000, 0x1c01f000, 0x4933c857, 0x42028800, + 0x000007fc, 0x42003000, 0x00fffffc, 0x0201f800, + 0x00104628, 0x02020800, 0x0010032e, 0x4936600a, + 0x417a7800, 0x0201f800, 0x001045df, 0x42000800, + 0x00000003, 0x0201f800, 0x001045ea, 0x497a6c12, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000002, + 0x0201f000, 0x00106d1c, 0x492fc857, 0x4c580000, + 0x4c000000, 0x8058b1c0, 0x0400000b, 0x82580500, + 0xfffffff0, 0x02020800, 0x0010032e, 0x8058b0d0, + 0x592c0409, 0x82000500, 0xfffff0ff, 0x80580540, + 0x48025c09, 0x5c000000, 0x5c00b000, 0x1c01f000, + 0x492fc857, 0x4c000000, 0x4c040000, 0x800000d8, + 0x592c0c09, 0x82040d00, 0xffff0fff, 0x80040540, + 0x48025c09, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x4933c857, 0x4d2c0000, 0x59325809, 0x592c0208, + 0x8400055e, 0x48025a08, 0x4c500000, 0x4c540000, + 0x4c580000, 0x0401ffd9, 0x0201f800, 0x00020864, + 0x46002800, 0x00000018, 0x80142800, 0x8058b040, + 0x83cca400, 0x00000007, 0x4014a800, 0x0201f800, + 0x0010c086, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x0401f807, 0x42018800, + 0x00000001, 0x04000003, 0x42018800, 0x00000000, + 0x1c01f000, 0x59325809, 0x592c0205, 0x82000580, + 0x00000152, 0x1c01f000, 0x59300028, 0x80000540, + 0x02020800, 0x00100aec, 0x1c01f000, 0x59300008, + 0x82000500, 0x04000800, 0x82000580, 0x04000800, + 0x04020003, 0x59300220, 0x48025c10, 0x1c01f000, + 0x4d2c0000, 0x59325809, 0x59300203, 0x4933c857, + 0x492fc857, 0x493bc857, 0x4803c857, 0x82003480, + 0x0000000e, 0x02021800, 0x0010032e, 0x0c01f803, + 0x5c025800, 0x1c01f000, 0x00109f80, 0x00109f8b, + 0x00109fc9, 0x00109f80, 0x00109f80, 0x00109f80, + 0x00109f80, 0x00109f80, 0x00109f82, 0x00109f80, + 0x00109f80, 0x00109f80, 0x00109f80, 0x00109f80, + 0x0201f800, 0x0010032e, 0x83383480, 0x00000058, + 0x02021800, 0x0010032e, 0x493a6403, 0x4a026203, + 0x00000001, 0x0201f000, 0x00106d1c, 0x83380580, + 0x00000013, 0x04020010, 0x492fc857, 0x592c000d, + 0x800001c0, 0x04000006, 0x4a026203, 0x00000002, + 0x59a8002a, 0x48026006, 0x1c01f000, 0x4a025a07, + 0x00000000, 0x0201f800, 0x000203ef, 0x0201f000, + 0x00020b9d, 0x83380580, 0x00000027, 0x0400001b, + 0x83380580, 0x00000014, 0x04000012, 0x83380580, + 0x00000015, 0x04000005, 0x83380580, 0x00000016, + 0x02020800, 0x0010032e, 0x0201f800, 0x00107226, + 0x02020000, 0x00107f37, 0x59300203, 0x82000580, + 0x00000002, 0x02020800, 0x0010032e, 0x0401f016, + 0x4937c857, 0x0201f800, 0x00106d91, 0x4a02580f, + 0x00000011, 0x0401f006, 0x4937c857, 0x0201f800, + 0x00106d91, 0x4a02580f, 0x00000010, 0x4a025a07, + 0x00000031, 0x4a02580e, 0x00000004, 0x0201f800, + 0x000203ef, 0x0201f800, 0x00104cbe, 0x0201f000, + 0x00107eb4, 0x59341400, 0x82081d00, 0x000000ff, + 0x59300c03, 0x480bc857, 0x4807c857, 0x82040580, + 0x00000053, 0x0400002e, 0x82040580, 0x00000002, + 0x04000016, 0x82040580, 0x00000001, 0x04000017, + 0x82040580, 0x00000003, 0x0400001c, 0x82040580, + 0x00000005, 0x0400001d, 0x82040580, 0x00000033, + 0x0400001a, 0x82040580, 0x00000000, 0x0400001b, + 0x82040580, 0x00000004, 0x02020800, 0x0010032e, + 0x0401f89f, 0x0401f016, 0x820c0580, 0x00000003, + 0x04000849, 0x0401f012, 0x820c0580, 0x0000000b, + 0x0402000f, 0x42000800, 0x00000007, 0x0201f800, + 0x001045ea, 0x0401f00a, 0x820c0580, 0x00000005, + 0x04000862, 0x0401f006, 0x820c0580, 0x00000009, + 0x04000887, 0x0401f002, 0x0401f891, 0x4a026403, + 0x00000052, 0x59a8105a, 0x592c040c, 0x8c000500, + 0x04000003, 0x42001000, 0x00000008, 0x592c040c, + 0x8c000516, 0x04000003, 0x82081400, 0x00000018, + 0x592c000d, 0x497a580e, 0x497a580f, 0x80080c80, + 0x04000009, 0x04001005, 0x4a025a07, 0x00000007, + 0x40001000, 0x0401f006, 0x4a025a07, 0x00000015, + 0x0401f003, 0x4a025a07, 0x00000000, 0x480a580d, + 0x0201f800, 0x001080a1, 0x04000010, 0x592c1001, + 0x480a600c, 0x58080800, 0x82080400, 0x00000002, + 0x592c1012, 0x592c1813, 0x42003000, 0x00000000, + 0x42002000, 0x00101086, 0x0201f800, 0x0010825e, + 0x04000002, 0x1c01f000, 0x4a025a07, 0x0000002c, + 0x497a580d, 0x0201f800, 0x000203ef, 0x0201f000, + 0x00020b9d, 0x83380580, 0x00000015, 0x0402000b, + 0x59a80070, 0x8c000502, 0x0402000c, 0x41780800, + 0x0201f800, 0x001046e4, 0x42000800, 0x00000004, + 0x0201f000, 0x001045ea, 0x42000800, 0x00000007, + 0x0201f000, 0x001045ea, 0x0201f800, 0x001050f7, + 0x42001000, 0x00000010, 0x04020009, 0x59340002, + 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, + 0x040007eb, 0x42001000, 0x00000008, 0x0201f800, + 0x00104d1c, 0x040007e6, 0x592c040c, 0x84000540, + 0x48025c0c, 0x0401f7e9, 0x83380580, 0x00000015, + 0x0402000f, 0x59a80070, 0x8c000502, 0x04020010, + 0x0201f800, 0x00104752, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x001045df, 0x5c027800, 0x42000800, + 0x00000006, 0x0201f000, 0x001045ea, 0x42000800, + 0x00000004, 0x0201f000, 0x001045ea, 0x0201f800, + 0x001050f7, 0x42001000, 0x00000010, 0x04020009, + 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, + 0x00ff0000, 0x040007e7, 0x42001000, 0x00000008, + 0x0201f800, 0x00104d1c, 0x040007e2, 0x592c040c, + 0x84000540, 0x48025c0c, 0x0401f7e9, 0x42000800, + 0x00000004, 0x0201f000, 0x001045ea, 0x83380580, + 0x00000015, 0x04020005, 0x0201f800, 0x0010b107, + 0x02000800, 0x0010491c, 0x1c01f000, 0x83380580, + 0x00000015, 0x0402001d, 0x4c580000, 0x83cc1400, + 0x00000008, 0x4200b000, 0x00000002, 0x83341c00, + 0x00000006, 0x0201f800, 0x00108c57, 0x04020012, + 0x83cc1400, 0x0000000a, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000008, 0x0201f800, 0x00108c57, + 0x04020009, 0x59342200, 0x59cc1007, 0x800811c0, + 0x04000003, 0x480a6801, 0x84102542, 0x8410251a, + 0x48126a00, 0x5c00b000, 0x1c01f000, 0x42000000, + 0x0010cf3b, 0x0201f800, 0x0010bfb3, 0x0201f800, + 0x00106e41, 0x59300203, 0x4933c857, 0x4803c857, 0x82000c80, 0x0000000e, 0x02021800, 0x0010032e, - 0x0c01f001, 0x0010a151, 0x0010a14f, 0x0010a158, - 0x0010a178, 0x0010a156, 0x0010a14f, 0x0010a14f, - 0x0010a14f, 0x0010a14f, 0x0010a14f, 0x0010a14f, - 0x0010a14f, 0x0010a14f, 0x0010a14f, 0x0201f800, - 0x0010032e, 0x5c03e000, 0x02000800, 0x00106c29, - 0x80000580, 0x1c01f000, 0x0201f800, 0x00100c75, - 0x5c03e000, 0x02000800, 0x00106c29, 0x8d3e7d02, - 0x04020017, 0x4d2c0000, 0x59325809, 0x4a025a07, - 0x00000005, 0x0201f800, 0x000203ef, 0x5c025800, - 0x497a6009, 0x8d3e7d00, 0x0402000f, 0x4a026226, - 0x0000000a, 0x4a026403, 0x00000085, 0x4a026203, - 0x00000009, 0x4a026407, 0x00000002, 0x42000800, - 0x8000404b, 0x0201f800, 0x00020b3e, 0x81780080, - 0x1c01f000, 0x0201f800, 0x00107cbe, 0x0401f7fc, - 0x0201f800, 0x0010931e, 0x04020004, 0x0201f800, - 0x00106f25, 0x04020009, 0x0201f800, 0x0010fd55, - 0x80c40040, 0x040007d7, 0x0201f800, 0x00106b47, - 0x02020800, 0x0010032e, 0x59300203, 0x82000d80, - 0x00000003, 0x02000800, 0x0010032e, 0x82000c80, - 0x0000000e, 0x02021800, 0x0010032e, 0x0c01f7b2, - 0x4933c857, 0x4d340000, 0x4d240000, 0x4d200000, - 0x836c0580, 0x00000003, 0x0402001c, 0x599c0018, - 0x8c000516, 0x04000004, 0x0201f800, 0x0010399f, - 0x0401f016, 0x42000800, 0x00000004, 0x0201f800, - 0x001044f1, 0x59300426, 0x82000580, 0x00000021, - 0x04000006, 0x59240400, 0x8c00050c, 0x04000007, - 0x4a026426, 0x00000021, 0x0201f800, 0x00109cbc, - 0x82000540, 0x00000001, 0x5c024000, 0x5c024800, - 0x5c026800, 0x1c01f000, 0x80000580, 0x0401f7fb, - 0x4d340000, 0x5932680a, 0x0201f800, 0x00104992, - 0x5c026800, 0x0201f000, 0x00020b9d, 0x4803c856, - 0x4c5c0000, 0x4d200000, 0x4014b800, 0x0201f800, - 0x00101f51, 0x59a8005e, 0x80000040, 0x4803505e, - 0x59240200, 0x82000500, 0xfffffeef, 0x84000546, - 0x48024a00, 0x497a4805, 0x4d400000, 0x42028000, - 0x00000001, 0x405c2800, 0x42000000, 0x00000001, - 0x0201f800, 0x00104d11, 0x42028000, 0x0000002a, - 0x4d3c0000, 0x42027800, 0x00000002, 0x0201f800, - 0x00101fa9, 0x5c027800, 0x5c028000, 0x5c024000, - 0x5c00b800, 0x813261c0, 0x02020000, 0x00107cbe, - 0x1c01f000, 0x59303009, 0x58181a05, 0x820c1d00, - 0x000000ff, 0x820c0580, 0x00000048, 0x04000004, - 0x820c0580, 0x0000006a, 0x04020046, 0x58180409, - 0x8c000500, 0x04000043, 0x42000000, 0x0010dfe6, - 0x50006000, 0x41781800, 0x5830200b, 0x41300000, - 0x80100580, 0x04000006, 0x40101800, 0x580c2000, - 0x801021c0, 0x040207fa, 0x0401f036, 0x4933c857, - 0x59302000, 0x497a6000, 0x800c19c0, 0x0402001f, - 0x4933c856, 0x42007000, 0x00020cf0, 0x58300009, - 0x800001c0, 0x04000019, 0x49786009, 0x58380001, - 0x80300580, 0x04020008, 0x4933c856, 0x49787002, - 0x4810600b, 0x801021c0, 0x0402001e, 0x4978600a, - 0x0401f01c, 0x4933c856, 0x4810600b, 0x801021c0, - 0x04020002, 0x4978600a, 0x4c180000, 0x4c300000, - 0x0201f800, 0x00100657, 0x5c006000, 0x0401fd5b, - 0x5c003000, 0x0401f00f, 0x4933c856, 0x800c19c0, - 0x04020008, 0x801021c0, 0x04000003, 0x4810600b, - 0x0401f008, 0x4978600b, 0x4978600a, 0x0401f005, - 0x48101800, 0x801021c0, 0x04020002, 0x480c600a, - 0x58180409, 0x84000500, 0x48003409, 0x49783209, + 0x0c01f803, 0x0201f000, 0x00106e2e, 0x0010a0cf, + 0x0010a0de, 0x0010a0d0, 0x0010a0cd, 0x0010a0cd, + 0x0010a0cd, 0x0010a0cd, 0x0010a0cd, 0x0010a0cd, + 0x0010a0cd, 0x0010a0cd, 0x0010a0cd, 0x0010a0cd, + 0x0010a0cd, 0x0201f800, 0x0010032e, 0x1c01f000, + 0x59300403, 0x82000580, 0x00000052, 0x02000000, + 0x0010960f, 0x0201f800, 0x00104cbe, 0x59325809, + 0x4a025a07, 0x00000006, 0x0201f800, 0x000203ef, + 0x0201f000, 0x00107eb4, 0x59301804, 0x840c0520, + 0x48026004, 0x598c000f, 0x81300580, 0x04020010, + 0x8c0c1d20, 0x04020010, 0x42001000, 0x0010ce5b, + 0x50081000, 0x58080002, 0x82000580, 0x00000100, + 0x0400000f, 0x5808000b, 0x81300580, 0x02020800, + 0x0010032e, 0x4978100b, 0x0401f003, 0x8c0c1d20, + 0x040207dc, 0x0201f800, 0x001101de, 0x80c40040, + 0x040007d8, 0x0201f800, 0x0010032e, 0x0201f800, + 0x00107161, 0x040007f8, 0x59300203, 0x82000c80, + 0x0000000e, 0x02021800, 0x0010032e, 0x0c01f7bc, + 0x4933c857, 0x4c500000, 0x4c540000, 0x4c580000, + 0x592c0c08, 0x48065814, 0x59cc0809, 0x48065808, + 0x59cc0808, 0x4806580c, 0x59a8086f, 0x82040500, + 0x000003ff, 0x800010c4, 0x8c040d14, 0x04000005, + 0x59cc0002, 0x82000500, 0x00000003, 0x80081480, + 0x480a621b, 0x412c0800, 0x0201f800, 0x0010056e, + 0x02000800, 0x0010032e, 0x492c080a, 0x58040409, + 0x84000552, 0x84000540, 0x48000c09, 0x82081400, + 0x00000003, 0x80081104, 0x83cca400, 0x00000006, + 0x832cac00, 0x00000005, 0x42000800, 0x00000010, + 0x82080480, 0x00000010, 0x04021003, 0x40080800, + 0x80000580, 0x4004b000, 0x4c000000, 0x0201f800, + 0x0010c0b0, 0x5c000000, 0x800001c0, 0x0400000d, + 0x412c1000, 0x4c000000, 0x0201f800, 0x0010056e, + 0x02000800, 0x0010032e, 0x492c1001, 0x832cac00, + 0x00000005, 0x5c000000, 0x40001000, 0x0401f7e9, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x1c01f000, + 0x4933c857, 0x4d2c0000, 0x4c380000, 0x59325809, + 0x5930021b, 0x48025a09, 0x59301012, 0x4a026203, + 0x00000002, 0x592c020b, 0x8c000500, 0x04000004, + 0x59300016, 0x592c1010, 0x80081480, 0x40080000, + 0x0401f98a, 0x80001540, 0x04020008, 0x4a025a07, + 0x00000000, 0x592c000c, 0x82000500, 0x00000c00, + 0x0400000b, 0x0401f00b, 0x8c08153e, 0x04000006, + 0x4a025a07, 0x00000007, 0x80081080, 0x80081000, + 0x0401f003, 0x4a025a07, 0x00000015, 0x480a5808, + 0x42000000, 0x0010e2e6, 0x50007000, 0x5838000a, + 0x80000540, 0x04020008, 0x4930700b, 0x4930700a, + 0x58380002, 0x82000580, 0x00000000, 0x04020809, + 0x0401f005, 0x82001400, 0x00000000, 0x45301000, + 0x4930700a, 0x5c007000, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x592c000a, 0x40001000, 0x48007009, + 0x82080400, 0x00000005, 0x48007003, 0x592c000e, + 0x592c100f, 0x48007006, 0x48087007, 0x592c0014, + 0x592c1209, 0x80080c80, 0x04001002, 0x40001000, + 0x82081400, 0x00000003, 0x80081104, 0x82080480, + 0x00000010, 0x04021003, 0x80000580, 0x0401f003, + 0x42001000, 0x00000010, 0x4800700c, 0x48087004, + 0x800810c4, 0x48087005, 0x40381000, 0x0201f000, + 0x00020016, 0x4d2c0000, 0x0201f800, 0x0010056e, + 0x02000800, 0x0010032e, 0x42000800, 0x0010e2e6, + 0x452c0800, 0x497a580a, 0x497a580b, 0x497a580c, + 0x4a025808, 0x0010a1b4, 0x4a025802, 0x00000100, + 0x4a025801, 0x00000000, 0x5c025800, 0x1c01f000, + 0x4833c857, 0x4d300000, 0x4d2c0000, 0x4c5c0000, + 0x4030b800, 0x585c0009, 0x80025d40, 0x04020004, + 0x585c000b, 0x4c000000, 0x0401f044, 0x585c0002, + 0x82000580, 0x00000100, 0x04020022, 0x592c0801, + 0x4c040000, 0x0201f800, 0x00100594, 0x5c000800, + 0x800409c0, 0x0400001c, 0x4804b809, 0x585c100c, + 0x800811c0, 0x04020005, 0x40065800, 0x0201f800, + 0x0010059d, 0x0401f014, 0x82080480, 0x00000010, + 0x04021003, 0x80000580, 0x0401f003, 0x42001000, + 0x00000010, 0x4800b80c, 0x4808b804, 0x800810c4, + 0x4808b805, 0x82040400, 0x00000005, 0x4800b803, + 0x405c1000, 0x0201f800, 0x00020016, 0x0401f025, + 0x0401f828, 0x585c000b, 0x80026540, 0x59300000, + 0x80000d40, 0x04020002, 0x4800b80a, 0x4800b80b, + 0x497a6000, 0x4c000000, 0x4978b809, 0x59325809, + 0x4a025a05, 0x00000103, 0x59300402, 0x48025c07, + 0x592c100c, 0x4c080000, 0x0201f800, 0x000203ef, + 0x0201f800, 0x001099b4, 0x5c001000, 0x8c081518, + 0x04000004, 0x0201f800, 0x00109a87, 0x0401f003, + 0x0201f800, 0x00020b9d, 0x405c7000, 0x5c000000, + 0x80026540, 0x04000003, 0x59325809, 0x0401ff79, + 0x5c00b800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x483bc857, 0x58380009, 0x40025800, 0x0201f800, + 0x0010059d, 0x5838000b, 0x80026540, 0x59300009, + 0x80025d40, 0x4a025a07, 0x00000002, 0x1c01f000, + 0x4803c857, 0x4933c857, 0x4d1c0000, 0x497a601d, + 0x41323800, 0x40026000, 0x4d3c0000, 0x42027800, + 0x00000005, 0x0401f843, 0x5c027800, 0x411e6000, + 0x4933c857, 0x59300415, 0x84000502, 0x48026415, + 0x5c023800, 0x1c01f000, 0x481bc857, 0x4933c857, + 0x4c5c0000, 0x4c600000, 0x4010b800, 0x4014c000, + 0x0201f800, 0x0010b73d, 0x0201f800, 0x00101fb4, + 0x59240400, 0x8c00050a, 0x04020008, 0x40602800, + 0x405c3000, 0x0201f800, 0x0010b195, 0x82000540, + 0x00000001, 0x0401f002, 0x80000580, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x42026000, 0x00111584, 0x59a8000d, 0x81640580, + 0x0400001a, 0x59300c07, 0x82040580, 0x00000001, + 0x0400000d, 0x82040580, 0x00000004, 0x04000006, + 0x82040580, 0x00000010, 0x02000800, 0x00109578, + 0x0401f009, 0x59300203, 0x82000d80, 0x00000007, + 0x04000005, 0x4807c857, 0x0201f800, 0x00109baa, + 0x04020808, 0x83326400, 0x0000002c, 0x41580000, + 0x81300480, 0x040017e5, 0x5c026000, 0x1c01f000, + 0x4933c857, 0x59300403, 0x4803c857, 0x0201f800, + 0x00106e41, 0x4df00000, 0x59300407, 0x4803c857, + 0x82000d80, 0x00000002, 0x04000018, 0x82000d80, + 0x00000001, 0x04000009, 0x82000d80, 0x00000004, + 0x04000006, 0x4933c856, 0x5c03e000, 0x02000800, + 0x00106e2e, 0x0401f04f, 0x59300203, 0x82000d80, + 0x00000001, 0x04000018, 0x82000d80, 0x00000002, + 0x04000035, 0x82000d80, 0x00000005, 0x04000032, + 0x0201f800, 0x0010032e, 0x59300203, 0x82000d80, + 0x00000009, 0x0400000c, 0x82000d80, 0x0000000b, + 0x04000009, 0x82000d80, 0x0000000a, 0x04000026, + 0x82000d80, 0x0000000c, 0x04000023, 0x0201f800, + 0x0010032e, 0x598c000f, 0x81300580, 0x04020004, + 0x0201f800, 0x00107161, 0x0402001b, 0x59300004, + 0x4803c857, 0x8c000520, 0x04000004, 0x84000520, + 0x48026004, 0x0401f014, 0x0201f800, 0x001101de, + 0x80c40040, 0x02020800, 0x0010032e, 0x5c03e000, + 0x02000800, 0x00106e2e, 0x59300407, 0x82000d80, + 0x00000002, 0x0400001b, 0x0201f800, 0x00104cbe, + 0x0201f800, 0x001099e2, 0x02000800, 0x001086a8, + 0x0401f014, 0x5c03e000, 0x02000800, 0x00106e2e, + 0x59300407, 0x82000d80, 0x00000002, 0x0400000d, + 0x5930081c, 0x58040200, 0x8c000500, 0x04000132, + 0x0201f800, 0x00104cbe, 0x0201f800, 0x001099e2, + 0x02000800, 0x001086a8, 0x8d3e7d00, 0x04000005, + 0x0201f800, 0x0010b827, 0x0201f000, 0x00107eb4, + 0x4a026226, 0x00000001, 0x4a026403, 0x00000085, + 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, + 0x42000800, 0x8000004b, 0x0201f000, 0x00020b3e, + 0x83300480, 0x00111500, 0x04001006, 0x41540000, + 0x81300480, 0x04021003, 0x80000580, 0x1c01f000, + 0x81780080, 0x1c01f000, 0x592c720b, 0x8c387500, + 0x04020008, 0x59307008, 0x8c387516, 0x04000005, + 0x59307009, 0x58387010, 0x59300013, 0x80380480, + 0x1c01f000, 0x59a8085a, 0x59cc2808, 0x82140500, + 0x00000c00, 0x04000004, 0x82040480, 0x00000010, + 0x04001018, 0x80001580, 0x8c142d12, 0x04000005, + 0x82040480, 0x00000014, 0x04001012, 0x59cc100a, + 0x80000580, 0x8c142d10, 0x04000005, 0x82040480, + 0x00000018, 0x0400100b, 0x59cc000b, 0x80080400, + 0x04001008, 0x04000006, 0x82000400, 0x00000018, + 0x80040480, 0x04001003, 0x80000580, 0x1c01f000, + 0x42000000, 0x0010cf18, 0x0201f800, 0x0010bfb3, + 0x82000540, 0x00000001, 0x0401f7f9, 0x4933c857, + 0x4937c857, 0x4923c857, 0x4927c857, 0x492fc857, + 0x48efc857, 0x4d1c0000, 0x4d300000, 0x41323800, + 0x0201f800, 0x00107ef8, 0x04000021, 0x48ee602a, + 0x4926601c, 0x4936600a, 0x591c0407, 0x82000580, + 0x00000003, 0x04000008, 0x591c0202, 0x4803c857, + 0x4802641a, 0x591c0402, 0x4802621a, 0x4803c857, + 0x0401f007, 0x591c0202, 0x4803c857, 0x4802621a, + 0x591c0402, 0x4802641a, 0x4803c857, 0x491e6027, + 0x4a026407, 0x00000001, 0x492e6009, 0x4d380000, + 0x42027000, 0x00000057, 0x0201f800, 0x00020bc1, + 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, + 0x5c023800, 0x1c01f000, 0x4933c857, 0x493bc857, + 0x4937c857, 0x4d2c0000, 0x4c500000, 0x4c540000, + 0x4c580000, 0x59325809, 0x0201f800, 0x0010989f, + 0x04000023, 0x83cca400, 0x00000006, 0x832cac00, + 0x00000007, 0x83380580, 0x00000016, 0x04020009, + 0x59a8005a, 0x82000580, 0x00000008, 0x04020014, + 0x492fc857, 0x4200b000, 0x00000002, 0x0401f00b, + 0x83380580, 0x00000015, 0x0402000d, 0x492fc857, + 0x59a8005a, 0x82000580, 0x00000018, 0x04020008, + 0x4200b000, 0x00000006, 0x0201f800, 0x0010c086, + 0x0201f800, 0x00108127, 0x0401f005, 0x0201f800, + 0x001086a8, 0x0201f800, 0x00020b9d, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x0201f800, 0x00106e41, 0x4df00000, + 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, + 0x0010032e, 0x0c01f001, 0x0010a38e, 0x0010a38c, + 0x0010a395, 0x0010a3b5, 0x0010a393, 0x0010a38c, + 0x0010a38c, 0x0010a38c, 0x0010a38c, 0x0010a38c, + 0x0010a38c, 0x0010a38c, 0x0010a38c, 0x0010a38c, + 0x0201f800, 0x0010032e, 0x5c03e000, 0x02000800, + 0x00106e2e, 0x80000580, 0x1c01f000, 0x0201f800, + 0x00100c76, 0x5c03e000, 0x02000800, 0x00106e2e, + 0x8d3e7d02, 0x04020017, 0x4d2c0000, 0x59325809, + 0x4a025a07, 0x00000005, 0x0201f800, 0x000203ef, + 0x5c025800, 0x497a6009, 0x8d3e7d00, 0x0402000f, + 0x4a026226, 0x0000000a, 0x4a026403, 0x00000085, + 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, + 0x42000800, 0x8000404b, 0x0201f800, 0x00020b3e, + 0x81780080, 0x1c01f000, 0x0201f800, 0x00107eb4, + 0x0401f7fc, 0x0201f800, 0x00109552, 0x04020004, + 0x0201f800, 0x0010712a, 0x04020009, 0x0201f800, + 0x00110065, 0x80c40040, 0x040007d7, 0x0201f800, + 0x00106d4c, 0x02020800, 0x0010032e, 0x59300203, + 0x82000d80, 0x00000003, 0x02000800, 0x0010032e, + 0x82000c80, 0x0000000e, 0x02021800, 0x0010032e, + 0x0c01f7b2, 0x4933c857, 0x4d340000, 0x4d240000, + 0x4d200000, 0x836c0580, 0x00000003, 0x0402001c, + 0x599c0018, 0x8c000516, 0x04000004, 0x0201f800, + 0x00103a8f, 0x0401f016, 0x42000800, 0x00000004, + 0x0201f800, 0x001045ea, 0x59300426, 0x82000580, + 0x00000021, 0x04000006, 0x59240400, 0x8c00050c, + 0x04000007, 0x4a026426, 0x00000021, 0x0201f800, + 0x00109efa, 0x82000540, 0x00000001, 0x5c024000, + 0x5c024800, 0x5c026800, 0x1c01f000, 0x80000580, + 0x0401f7fb, 0x4d340000, 0x5932680a, 0x0201f800, + 0x00104a94, 0x5c026800, 0x0201f000, 0x00020b9d, + 0x4803c856, 0x4c5c0000, 0x4d200000, 0x4014b800, + 0x0201f800, 0x00101fb4, 0x59a8005e, 0x80000040, + 0x4803505e, 0x836c0580, 0x00000002, 0x04020004, + 0x59240200, 0x8400051a, 0x48024a00, 0x59240200, + 0x82000500, 0xfffffeef, 0x84000546, 0x48024a00, + 0x497a4805, 0x4d400000, 0x42028000, 0x00000001, + 0x405c2800, 0x42000000, 0x00000001, 0x0201f800, + 0x00104e36, 0x42028000, 0x0000002a, 0x4d3c0000, + 0x42027800, 0x00000002, 0x0201f800, 0x0010200c, + 0x5c027800, 0x5c028000, 0x5c024000, 0x5c00b800, + 0x813261c0, 0x02020000, 0x00107eb4, 0x1c01f000, + 0x59303009, 0x58181a05, 0x820c1d00, 0x000000ff, + 0x820c0580, 0x00000048, 0x04000004, 0x820c0580, + 0x0000006a, 0x04020046, 0x58180409, 0x8c000500, + 0x04000043, 0x42000000, 0x0010e2e6, 0x50006000, + 0x41781800, 0x5830200b, 0x41300000, 0x80100580, + 0x04000006, 0x40101800, 0x580c2000, 0x801021c0, + 0x040207fa, 0x0401f036, 0x4933c857, 0x59302000, + 0x497a6000, 0x800c19c0, 0x0402001f, 0x4933c856, + 0x42007000, 0x00020cf0, 0x58300009, 0x800001c0, + 0x04000019, 0x49786009, 0x58380001, 0x80300580, + 0x04020008, 0x4933c856, 0x49787002, 0x4810600b, + 0x801021c0, 0x0402001e, 0x4978600a, 0x0401f01c, + 0x4933c856, 0x4810600b, 0x801021c0, 0x04020002, + 0x4978600a, 0x4c180000, 0x4c300000, 0x0201f800, + 0x00100657, 0x5c006000, 0x0401fd56, 0x5c003000, + 0x0401f00f, 0x4933c856, 0x800c19c0, 0x04020008, + 0x801021c0, 0x04000003, 0x4810600b, 0x0401f008, + 0x4978600b, 0x4978600a, 0x0401f005, 0x48101800, + 0x801021c0, 0x04020002, 0x480c600a, 0x58180409, + 0x84000500, 0x48003409, 0x49783209, 0x1c01f000, + 0x4933c857, 0x4927c857, 0x59a8021b, 0x82000540, + 0x00000003, 0x4803521b, 0x4c5c0000, 0x4d400000, + 0x59ccb800, 0x825cbd00, 0x00ffffff, 0x42028000, + 0x00000000, 0x0201f800, 0x00101fb4, 0x0201f800, + 0x00108c0d, 0x485f500f, 0x04000024, 0x4d3c0000, + 0x42028000, 0x0000002a, 0x59240400, 0x8c00050a, + 0x04020008, 0x59240200, 0x84000556, 0x48024a00, + 0x42003000, 0x00000002, 0x0201f800, 0x0010b18b, + 0x42027800, 0x00000002, 0x0201f800, 0x0010200c, + 0x42000000, 0x0010cf23, 0x0201f800, 0x0010bfb3, + 0x59cc0408, 0x8c00051e, 0x04020009, 0x42000800, + 0x0010cfd1, 0x58040406, 0x8c000500, 0x04020004, + 0x59a8021b, 0x84000552, 0x4803521b, 0x42028000, + 0x00000002, 0x5c027800, 0x41780800, 0x0201f800, + 0x001046e4, 0x59240200, 0x4803c857, 0x4927c857, + 0x82000540, 0x00000066, 0x48024a00, 0x485e4805, + 0x812000f0, 0x805c0540, 0x48026813, 0x49238830, + 0x84000570, 0x48038832, 0x59a8121b, 0x59cc0408, + 0x8c00051a, 0x04020005, 0x84081514, 0x4a0370e5, + 0x00000800, 0x0401f004, 0x84081554, 0x4a0370e5, + 0x00000c00, 0x480b521b, 0x0201f800, 0x00109bb8, + 0x59a8021b, 0x8400054a, 0x4803521b, 0x49238830, + 0x845c0570, 0x48038832, 0x42000800, 0x00000004, + 0x0201f800, 0x001045ea, 0x59a80a1b, 0x84040d50, + 0x59cc0013, 0x8c00053e, 0x04000003, 0x8c000536, + 0x04000004, 0x59cc0017, 0x8c000536, 0x04020002, + 0x84040d10, 0x4807521b, 0x4807541b, 0x42001800, + 0x0010e2e8, 0x59240400, 0x8c00050c, 0x04000006, + 0x4a026426, 0x00000021, 0x0201f800, 0x00109efa, + 0x0401f00b, 0x405c0800, 0x41781000, 0x42000000, + 0x00000001, 0x42028000, 0x00000000, 0x0201f800, + 0x00104e36, 0x0201f800, 0x00020b9d, 0x59a8021b, + 0x4803c857, 0x8c000506, 0x04020009, 0x41781800, + 0x0201f800, 0x0010c0f4, 0x04000003, 0x42001800, + 0x00000010, 0x0201f800, 0x00101f3c, 0x805c0110, + 0x48035018, 0x48038881, 0x59a80016, 0x80000040, + 0x4803c857, 0x48035016, 0x04020018, 0x59a8021b, + 0x8400050a, 0x4803521b, 0x4803541b, 0x4a038802, + 0x0000ffff, 0x42001800, 0x0010cb46, 0x0201f800, + 0x00100533, 0x42001800, 0x0010cb53, 0x0201f800, + 0x00100533, 0x4a035017, 0x0000ffff, 0x0201f800, + 0x001071f9, 0x4a0378e4, 0x00000080, 0x4a038802, + 0x0000ffff, 0x850e1d02, 0x5c028000, 0x5c00b800, 0x1c01f000, 0x4933c857, 0x59368c03, 0x4c180000, 0x59300203, 0x82003480, 0x0000000e, 0x02021800, 0x0010032e, 0x0c01f803, 0x5c003000, 0x1c01f000, - 0x0010a24a, 0x0010a7ee, 0x0010a936, 0x0010a24a, - 0x0010a24a, 0x0010a24a, 0x0010a24a, 0x0010a24a, - 0x0010a26d, 0x0010a24a, 0x0010a24a, 0x0010a24a, - 0x0010a24a, 0x0010a24a, 0x0201f800, 0x0010032e, + 0x0010a53a, 0x0010aaef, 0x0010ac3a, 0x0010a53a, + 0x0010a53a, 0x0010a53a, 0x0010a53a, 0x0010a53a, + 0x0010a55d, 0x0010a53a, 0x0010a53a, 0x0010a53a, + 0x0010a53a, 0x0010a53a, 0x0201f800, 0x0010032e, 0x4933c857, 0x42028800, 0x0000ffff, 0x813669c0, 0x04000002, 0x59368c03, 0x4c180000, 0x59300203, 0x82003480, 0x0000000e, 0x02021800, 0x0010032e, - 0x0c01f803, 0x5c003000, 0x1c01f000, 0x0010a269, - 0x0010ac1a, 0x0010a269, 0x0010a269, 0x0010a269, - 0x0010a269, 0x0010a269, 0x0010a269, 0x0010ab5b, - 0x0010b031, 0x0010b067, 0x0010b031, 0x0010b067, - 0x0010a269, 0x0201f800, 0x0010032e, 0x0201f800, + 0x0c01f803, 0x5c003000, 0x1c01f000, 0x0010a559, + 0x0010af29, 0x0010a559, 0x0010a559, 0x0010a559, + 0x0010a559, 0x0010a559, 0x0010a559, 0x0010ae62, + 0x0010b348, 0x0010b37e, 0x0010b348, 0x0010b37e, + 0x0010a559, 0x0201f800, 0x0010032e, 0x0201f800, 0x0010032e, 0x83383480, 0x00000057, 0x02021800, 0x0010032e, 0x41380000, 0x493bc857, 0x4d1c0000, 0x4d400000, 0x0c01f804, 0x5c028000, 0x5c023800, - 0x1c01f000, 0x0010a2d9, 0x0010a503, 0x0010a2d9, - 0x0010a2d9, 0x0010a2d9, 0x0010a50e, 0x0010a2d9, - 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, - 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, - 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, - 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, - 0x0010a30f, 0x0010a361, 0x0010a37c, 0x0010a3fd, - 0x0010a45b, 0x0010a49f, 0x0010a4cf, 0x0010a2d9, - 0x0010a2d9, 0x0010a516, 0x0010a2d9, 0x0010a2d9, - 0x0010a524, 0x0010a52d, 0x0010a2d9, 0x0010a2d9, - 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, 0x0010a5cf, - 0x0010a2d9, 0x0010a2d9, 0x0010a43b, 0x0010a2d9, - 0x0010a2d9, 0x0010a58e, 0x0010a2d9, 0x0010a2d9, - 0x0010a2d9, 0x0010a5dd, 0x0010a2d9, 0x0010a2d9, - 0x0010a2d9, 0x0010a627, 0x0010a2d9, 0x0010a2d9, - 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, - 0x0010a694, 0x0010a2d9, 0x0010a6c3, 0x0010a6ce, - 0x0010a2d9, 0x0010a2d9, 0x0010a2db, 0x0010a6d9, - 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, 0x0010a2ec, - 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, 0x0010a6e0, - 0x0010a6e8, 0x0010a706, 0x0010a2d9, 0x0010a2d9, - 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, 0x0010a300, - 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, - 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, 0x0010a2d9, - 0x0010a2d9, 0x0201f800, 0x0010032e, 0x4933c857, - 0x0201f800, 0x0010b099, 0x02020000, 0x0010a711, - 0x0201f800, 0x00101d49, 0x02020000, 0x0010a711, + 0x1c01f000, 0x0010a5c9, 0x0010a7fa, 0x0010a5c9, + 0x0010a5c9, 0x0010a5c9, 0x0010a805, 0x0010a5c9, + 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, + 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, + 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, + 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, + 0x0010a602, 0x0010a655, 0x0010a670, 0x0010a6f1, + 0x0010a74f, 0x0010a793, 0x0010a7c3, 0x0010a5c9, + 0x0010a5c9, 0x0010a80d, 0x0010a5c9, 0x0010a5c9, + 0x0010a81b, 0x0010a824, 0x0010a5c9, 0x0010a5c9, + 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, 0x0010a8c6, + 0x0010a5c9, 0x0010a5c9, 0x0010a72f, 0x0010a5c9, + 0x0010a5c9, 0x0010a885, 0x0010a5c9, 0x0010a5c9, + 0x0010a5c9, 0x0010a8d4, 0x0010a5c9, 0x0010a5c9, + 0x0010a5c9, 0x0010a91e, 0x0010a5c9, 0x0010a5c9, + 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, + 0x0010a98b, 0x0010a5c9, 0x0010a9be, 0x0010a9c9, + 0x0010a5c9, 0x0010a5c9, 0x0010a5cb, 0x0010a9d4, + 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, 0x0010a5dc, + 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, 0x0010a9db, + 0x0010a9e3, 0x0010aa04, 0x0010a5c9, 0x0010a5c9, + 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, 0x0010a5f0, + 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, + 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, 0x0010a5c9, + 0x0010a5c9, 0x0201f800, 0x0010032e, 0x4933c857, + 0x0201f800, 0x0010b3b0, 0x02020000, 0x0010aa12, + 0x0201f800, 0x00101d52, 0x02020000, 0x0010aa12, 0x59cc0407, 0x4802601d, 0x4a026403, 0x00000045, - 0x4a026203, 0x00000001, 0x0201f000, 0x00106b17, - 0x4933c857, 0x0201f800, 0x0010b099, 0x02020000, - 0x0010a711, 0x0201f800, 0x00101d49, 0x02020000, - 0x0010a711, 0x0201f800, 0x0010a752, 0x040201e7, + 0x4a026203, 0x00000001, 0x0201f000, 0x00106d1c, + 0x4933c857, 0x0201f800, 0x0010b3b0, 0x02020000, + 0x0010aa12, 0x0201f800, 0x00101d52, 0x02020000, + 0x0010aa12, 0x0201f800, 0x0010aa53, 0x040201eb, 0x59cc0007, 0x4802601d, 0x4a026403, 0x0000004a, - 0x4a026203, 0x00000001, 0x0201f000, 0x00106b17, - 0x4933c857, 0x0201f800, 0x0010b099, 0x02020000, - 0x0010a711, 0x0201f800, 0x00101d49, 0x02020000, - 0x0010a711, 0x4a026403, 0x00000056, 0x4a026203, - 0x00000001, 0x0201f000, 0x00106b17, 0x4933c857, - 0x0201f800, 0x00101d49, 0x0402000c, 0x0201f800, - 0x00104856, 0x04020009, 0x5932481c, 0x59240200, - 0x82000500, 0x00000003, 0x82000580, 0x00000003, - 0x04000009, 0x0401f3f4, 0x4a026403, 0x00000009, + 0x4a026203, 0x00000001, 0x0201f000, 0x00106d1c, + 0x4933c857, 0x0201f800, 0x0010b3b0, 0x02020000, + 0x0010aa12, 0x0201f800, 0x00101d52, 0x02020000, + 0x0010aa12, 0x0201f800, 0x0010aa53, 0x040201d7, + 0x4a026403, 0x00000056, 0x4a026203, 0x00000001, + 0x0201f000, 0x00106d1c, 0x4933c857, 0x0201f800, + 0x00101d52, 0x0402000d, 0x0201f800, 0x00104956, + 0x0402000a, 0x5932481c, 0x59240200, 0x82000500, + 0x00000003, 0x82000580, 0x00000003, 0x0400000a, + 0x0201f000, 0x0010aa12, 0x4a026403, 0x00000009, 0x4a02641b, 0x00000009, 0x4a02621b, 0x00000000, - 0x0401f1e6, 0x0201f800, 0x00104943, 0x0400002b, + 0x0401f1e9, 0x0201f800, 0x00104a45, 0x0400002b, 0x59340200, 0x8c00051a, 0x04000004, 0x5934000a, - 0x84000560, 0x4802680a, 0x0201f800, 0x0010ad88, + 0x84000560, 0x4802680a, 0x0201f800, 0x0010b097, 0x0402002c, 0x42028000, 0x00000029, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010fc72, 0x5c027800, - 0x42000000, 0x0010cc25, 0x0201f800, 0x0010bc88, - 0x41780800, 0x0201f800, 0x001045e8, 0x4a026403, + 0x417a7800, 0x0201f800, 0x0010ff80, 0x5c027800, + 0x42000000, 0x0010cf25, 0x0201f800, 0x0010bfb3, + 0x41780800, 0x0201f800, 0x001046e4, 0x4a026403, 0x00000008, 0x42003000, 0x00000003, 0x59240400, - 0x8c00050a, 0x040201c5, 0x59cc400b, 0x59cc380c, + 0x8c00050a, 0x040201c8, 0x59cc400b, 0x59cc380c, 0x59cc180d, 0x59cc080e, 0x9c2041c0, 0x9c1c39c0, 0x9c0c19c0, 0x9c0409c0, 0x4a026203, 0x00000007, - 0x41782800, 0x0401f1ac, 0x0201f800, 0x0010ae51, + 0x41782800, 0x0401f1af, 0x0201f800, 0x0010b160, 0x040207da, 0x4a026403, 0x00000009, 0x4a02641b, - 0x0000000e, 0x4a02621b, 0x00001900, 0x0401f1af, + 0x0000000e, 0x4a02621b, 0x00001900, 0x0401f1b2, 0x4a026403, 0x00000009, 0x4a02641b, 0x00000003, - 0x0401f1aa, 0x4933c857, 0x0201f800, 0x00101d49, - 0x040203ad, 0x0201f800, 0x00104856, 0x040203aa, - 0x493a6403, 0x0201f800, 0x0010ad16, 0x0402000a, + 0x0401f1ad, 0x4933c857, 0x0201f800, 0x00101d52, + 0x040203ba, 0x0201f800, 0x00104956, 0x040203b7, + 0x493a6403, 0x0201f800, 0x0010b025, 0x0402000a, 0x4a026403, 0x00000006, 0x59240400, 0x8c00050a, - 0x0402019a, 0x4a026203, 0x00000007, 0x0201f000, - 0x0010b43f, 0x4a026403, 0x00000007, 0x4a02641b, - 0x00000009, 0x4a02621b, 0x00000000, 0x0401f18f, - 0x4933c857, 0x0201f800, 0x00104856, 0x04020392, + 0x0402019d, 0x4a026203, 0x00000007, 0x0201f000, + 0x0010b76a, 0x4a026403, 0x00000007, 0x4a02641b, + 0x00000009, 0x4a02621b, 0x00000000, 0x0401f192, + 0x4933c857, 0x0201f800, 0x00104956, 0x0402039f, 0x5934000a, 0x82000500, 0x00010000, 0x82000580, - 0x00010000, 0x02020800, 0x0010b099, 0x02000800, - 0x00101d49, 0x04020388, 0x59cc0001, 0x82000500, + 0x00010000, 0x02020800, 0x0010b3b0, 0x02000800, + 0x00101d52, 0x04020395, 0x59cc0001, 0x82000500, 0x00ffff00, 0x82000580, 0x00fffc00, 0x04020007, 0x59a80006, 0x8c00050e, 0x04000004, 0x59240400, - 0x8c00050a, 0x04020048, 0x0201f800, 0x00104943, + 0x8c00050a, 0x04020048, 0x0201f800, 0x00104a45, 0x04020005, 0x42027800, 0x00000001, 0x0201f800, - 0x001044e6, 0x0201f800, 0x00104936, 0x04000004, + 0x001045df, 0x0201f800, 0x00104a38, 0x04000004, 0x82000580, 0x00000703, 0x04020042, 0x59cc0206, 0x82003500, 0x00000003, 0x04020045, 0x82003480, 0x00000014, 0x04001042, 0x59a8305a, 0x80183480, 0x0400103f, 0x5934300a, 0x84183516, 0x82000580, 0x00000014, 0x04020002, 0x84183556, 0x481a680a, 0x59cc0406, 0x82000500, 0x00000003, 0x04020034, - 0x0201f800, 0x0010add5, 0x0402003c, 0x0201f800, - 0x0010491a, 0x04020007, 0x4c600000, 0x4178c000, - 0x417a7800, 0x0201f800, 0x00101cda, 0x5c00c000, + 0x0201f800, 0x0010b0e4, 0x0402003c, 0x0201f800, + 0x00104a1c, 0x04020007, 0x4c600000, 0x4178c000, + 0x417a7800, 0x0201f800, 0x00101ce3, 0x5c00c000, 0x836c0580, 0x00000003, 0x04020009, 0x42003000, - 0x00000006, 0x0201f800, 0x0010b40a, 0x42000000, - 0x0010cc24, 0x0201f800, 0x0010bc88, 0x0201f800, - 0x00104652, 0x4a026403, 0x0000000a, 0x42003000, + 0x00000006, 0x0201f800, 0x0010b735, 0x42000000, + 0x0010cf24, 0x0201f800, 0x0010bfb3, 0x0201f800, + 0x00104752, 0x4a026403, 0x0000000a, 0x42003000, 0x00000020, 0x59cc1a0a, 0x41780800, 0x41784000, - 0x41783800, 0x59240400, 0x8c00050a, 0x0402012f, + 0x41783800, 0x59240400, 0x8c00050a, 0x04020132, 0x0401f772, 0x4a026403, 0x0000000b, 0x4a02641b, - 0x0000000b, 0x4a02621b, 0x00002c00, 0x0401f127, + 0x0000000b, 0x4a02621b, 0x00002c00, 0x0401f12a, 0x4a026403, 0x0000000b, 0x4a02641b, 0x00000009, - 0x4a02621b, 0x00001e00, 0x0401f120, 0x42000000, - 0x0010cb7f, 0x0201f800, 0x0010bc88, 0x4a026403, + 0x4a02621b, 0x00001e00, 0x0401f123, 0x42000000, + 0x0010ce7f, 0x0201f800, 0x0010bfb3, 0x4a026403, 0x0000000b, 0x4a02641b, 0x00000007, 0x4a02621b, - 0x00000000, 0x0401f115, 0x4a026403, 0x0000000b, + 0x00000000, 0x0401f118, 0x4a026403, 0x0000000b, 0x4a02641b, 0x00000003, 0x4a02621b, 0x00000000, - 0x0401f10e, 0x4933c857, 0x0201f800, 0x00104856, - 0x04020311, 0x0201f800, 0x0010b099, 0x0402030e, - 0x0201f800, 0x00101d49, 0x0402030b, 0x59cc0206, + 0x0401f111, 0x4933c857, 0x0201f800, 0x00104956, + 0x0402031e, 0x0201f800, 0x0010b3b0, 0x0402031b, + 0x0201f800, 0x00101d52, 0x04020318, 0x59cc0206, 0x82003500, 0x00000003, 0x04020023, 0x82003480, 0x00000014, 0x04001020, 0x59a8305a, 0x80180480, 0x0400101d, 0x59cc0406, 0x82000500, 0x00000003, 0x04020019, 0x59340400, 0x82000580, 0x00000707, 0x0400001c, 0x417a7800, 0x4c600000, 0x4178c000, - 0x0201f800, 0x00101cda, 0x5c00c000, 0x42003000, - 0x0000000a, 0x0201f800, 0x0010b40a, 0x42000000, - 0x0010cc21, 0x0201f800, 0x0010bc88, 0x4a026403, + 0x0201f800, 0x00101ce3, 0x5c00c000, 0x42003000, + 0x0000000a, 0x0201f800, 0x0010b735, 0x42000000, + 0x0010cf21, 0x0201f800, 0x0010bfb3, 0x4a026403, 0x0000000c, 0x41782800, 0x42003000, 0x00000021, 0x0401f7ad, 0x4a026403, 0x0000000d, 0x4a02641b, - 0x00000007, 0x4a02621b, 0x00000000, 0x0401f0d7, + 0x00000007, 0x4a02621b, 0x00000000, 0x0401f0da, 0x4a026403, 0x0000000d, 0x4a02641b, 0x00000009, - 0x4a02621b, 0x00001e00, 0x0401f0d0, 0x4933c857, - 0x0201f800, 0x00104856, 0x040202d3, 0x0201f800, - 0x0010b099, 0x040202d0, 0x0201f800, 0x00101d49, - 0x040202cd, 0x0401fb0d, 0x0402000e, 0x493a6403, - 0x0401fb14, 0x04020004, 0x4a026403, 0x0000002e, + 0x4a02621b, 0x00001e00, 0x0401f0d3, 0x4933c857, + 0x0201f800, 0x00104956, 0x040202e0, 0x0201f800, + 0x0010b3b0, 0x040202dd, 0x0201f800, 0x00101d52, + 0x040202da, 0x0401fb1a, 0x0402000e, 0x493a6403, + 0x0401fb21, 0x04020004, 0x4a026403, 0x0000002e, 0x0401f722, 0x4a026403, 0x0000000d, 0x4a02641b, - 0x00000007, 0x4a02621b, 0x00000000, 0x0401f0b7, + 0x00000007, 0x4a02621b, 0x00000000, 0x0401f0ba, 0x4a026403, 0x0000000d, 0x4a02641b, 0x00000009, - 0x4a02621b, 0x00001e00, 0x0401f0b0, 0x4933c857, - 0x0201f800, 0x00104856, 0x040206c0, 0x59240200, + 0x4a02621b, 0x00001e00, 0x0401f0b3, 0x4933c857, + 0x0201f800, 0x00104956, 0x040206c0, 0x59240200, 0x82000500, 0x00000003, 0x82000580, 0x00000003, - 0x040202ad, 0x0201f800, 0x00104936, 0x04020033, - 0x0201f800, 0x0010addd, 0x0402000d, 0x4a026403, - 0x0000000e, 0x59240400, 0x8c00050a, 0x0402009b, + 0x040202ba, 0x0201f800, 0x00104a38, 0x04020033, + 0x0201f800, 0x0010b0ec, 0x0402000d, 0x4a026403, + 0x0000000e, 0x59240400, 0x8c00050a, 0x0402009e, 0x42003000, 0x00000052, 0x59cc4008, 0x59cc3809, 0x59cc180a, 0x59cc080b, 0x0401f6d4, 0x4933c857, - 0x42003000, 0x00000003, 0x0201f800, 0x0010b412, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010fc72, - 0x5c027800, 0x42000000, 0x0010cc23, 0x0201f800, - 0x0010bc88, 0x59340200, 0x84000558, 0x48026a00, - 0x42000800, 0x0000000b, 0x0201f800, 0x001044f1, - 0x59240400, 0x8c00050a, 0x04020075, 0x42003000, - 0x00000007, 0x0401f063, 0x4933c857, 0x4a026403, + 0x42003000, 0x00000003, 0x0201f800, 0x0010b73d, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ff80, + 0x5c027800, 0x42000000, 0x0010cf23, 0x0201f800, + 0x0010bfb3, 0x59340200, 0x84000558, 0x48026a00, + 0x42000800, 0x0000000b, 0x0201f800, 0x001045ea, + 0x59240400, 0x8c00050a, 0x04020078, 0x42003000, + 0x00000007, 0x0401f066, 0x4933c857, 0x4a026403, 0x0000000f, 0x4a02641b, 0x00000003, 0x4a02621b, - 0x00001e00, 0x0401f071, 0x59340400, 0x82000580, + 0x00001e00, 0x0401f074, 0x59340400, 0x82000580, 0x00000703, 0x040007f5, 0x0401f040, 0x4933c857, - 0x0201f800, 0x00104856, 0x0402026f, 0x5932481c, + 0x0201f800, 0x00104956, 0x0402027c, 0x5932481c, 0x59240200, 0x82000500, 0x00000003, 0x82000580, - 0x00000003, 0x04020268, 0x0201f800, 0x0010492d, - 0x0402002e, 0x0201f800, 0x0010adf8, 0x02000800, - 0x0010ad88, 0x04020006, 0x4a026403, 0x00000010, + 0x00000003, 0x04020275, 0x0201f800, 0x00104a2f, + 0x0402002e, 0x0201f800, 0x0010b107, 0x02000800, + 0x0010b097, 0x04020006, 0x4a026403, 0x00000010, 0x42003000, 0x00000050, 0x0401f68d, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010fc72, 0x5c027800, - 0x42003000, 0x00000003, 0x0201f800, 0x0010b412, - 0x42000000, 0x0010cc23, 0x0201f800, 0x0010bc88, + 0x417a7800, 0x0201f800, 0x0010ff80, 0x5c027800, + 0x42003000, 0x00000003, 0x0201f800, 0x0010b73d, + 0x42000000, 0x0010cf23, 0x0201f800, 0x0010bfb3, 0x59340200, 0x84000558, 0x48026a00, 0x0401f7c5, 0x4a026403, 0x00000011, 0x4a02641b, 0x00000003, - 0x4a02621b, 0x00001e00, 0x0401f03c, 0x4933c857, - 0x0201f800, 0x00101d49, 0x02000800, 0x0010b099, - 0x0402023d, 0x0401fa7d, 0x04020008, 0x4a026403, - 0x00000012, 0x0401f031, 0x59340400, 0x82000580, - 0x00000703, 0x040007eb, 0x4d3c0000, 0x417a7800, - 0x42028000, 0x00000029, 0x0201f800, 0x0010fc72, - 0x5c027800, 0x42003000, 0x00000017, 0x0201f800, - 0x0010b412, 0x42000000, 0x0010cc23, 0x0201f800, - 0x0010bc88, 0x0201f800, 0x00101f51, 0x59240400, - 0x8c00050a, 0x04020012, 0x42003000, 0x00000006, - 0x42028000, 0x00000029, 0x4933c857, 0x4a026403, - 0x00000001, 0x4a026203, 0x00000007, 0x41782800, - 0x0401f003, 0x42028000, 0x00000046, 0x0201f800, - 0x0010ae7c, 0x0201f000, 0x0010b43f, 0x4933c857, - 0x4a026403, 0x00000001, 0x42000800, 0x0000000b, - 0x0201f800, 0x001044f1, 0x4a026203, 0x00000001, - 0x0201f000, 0x00106b17, 0x4933c857, 0x42000800, - 0x00000009, 0x0201f800, 0x001044f1, 0x4a026403, - 0x00000005, 0x0401f7f5, 0x0201f800, 0x0010b099, - 0x040201f9, 0x0201f800, 0x00101d49, 0x040201f6, - 0x0401fa36, 0x040207c1, 0x4a026403, 0x00000020, - 0x4a026203, 0x00000001, 0x0201f000, 0x00106b17, - 0x0201f800, 0x00101d49, 0x040201eb, 0x4a026403, - 0x00000023, 0x4a026203, 0x00000001, 0x0201f000, - 0x00106b17, 0x0201f800, 0x0010b099, 0x02000800, - 0x00101d49, 0x040201e0, 0x0401fa20, 0x040207ab, - 0x59cc0807, 0x82040500, 0x00ffff00, 0x0402000a, - 0x59340212, 0x82000500, 0x0000ff00, 0x04000006, - 0x5932481c, 0x59240005, 0x82000500, 0x000000ff, - 0x0401f003, 0x5932481c, 0x59240005, 0x82040d00, - 0x00ffffff, 0x80040580, 0x04020014, 0x59cc1408, - 0x0201f800, 0x00109ac1, 0x04000025, 0x591c0202, - 0x82001580, 0x0000ffff, 0x04000004, 0x59cc1208, - 0x80080580, 0x0402001e, 0x591c000a, 0x81340580, - 0x0402001b, 0x591c0407, 0x82000580, 0x00000007, - 0x04020017, 0x0401f027, 0x59cc1208, 0x82080580, - 0x0000ffff, 0x0400000c, 0x0201f800, 0x00109ac1, - 0x0400000f, 0x59cc1408, 0x591c0202, 0x80080580, - 0x04020024, 0x591c000a, 0x81340580, 0x04020021, - 0x0401f010, 0x59cc1408, 0x41780000, 0x0201f800, - 0x0010abca, 0x040207f8, 0x0401f017, 0x4a026403, - 0x00000026, 0x4a02621b, 0x00001700, 0x59cc1208, - 0x82081580, 0x0000ffff, 0x04020794, 0x0401f00e, - 0x591c0407, 0x82000580, 0x00000007, 0x040207f4, - 0x591c0403, 0x82000580, 0x00000024, 0x04020006, - 0x4d300000, 0x411e6000, 0x0201f800, 0x00020b9d, - 0x5c026000, 0x4a026403, 0x00000025, 0x0401f783, - 0x59cc1408, 0x41780000, 0x0201f800, 0x0010abca, - 0x040207e3, 0x0401f7f8, 0x4933c857, 0x4d3c0000, - 0x42027800, 0x00000001, 0x0201f800, 0x001044e6, - 0x5c027800, 0x4c580000, 0x4200b000, 0x00000002, - 0x83a81c00, 0x00000002, 0x83cc1400, 0x0000000b, - 0x0201f800, 0x00108a31, 0x5c00b000, 0x04000004, - 0x4a026403, 0x00000031, 0x0401f768, 0x0201f800, - 0x00020b9d, 0x4200b000, 0x00000002, 0x83a81c00, - 0x00000000, 0x83cc1400, 0x0000000d, 0x0201f800, - 0x00108a31, 0x04020010, 0x0201f800, 0x0010609c, - 0x0400000d, 0x59300407, 0x82000580, 0x00000001, - 0x04020009, 0x59300403, 0x82000580, 0x00000002, - 0x04020005, 0x5930000a, 0x81340580, 0x02000800, - 0x00020b9d, 0x0201f800, 0x00104fc6, 0x0402000f, - 0x0201f800, 0x00104fe2, 0x04020008, 0x4a035014, - 0x00000001, 0x4202d800, 0x00000001, 0x0201f800, - 0x00104f20, 0x0401f005, 0x42000000, 0x00000001, - 0x0201f800, 0x00104f97, 0x1c01f000, 0x0201f800, - 0x00101d49, 0x04020140, 0x0401f980, 0x0402070b, - 0x493a6403, 0x0401f9f0, 0x04020004, 0x4a026403, - 0x0000002b, 0x0401f731, 0x4a026403, 0x0000002c, - 0x0401f72e, 0x4933c857, 0x0201f800, 0x00106239, - 0x04020131, 0x0201f800, 0x00101d49, 0x0402012e, - 0x0201f800, 0x0010491a, 0x0402071d, 0x59cc0408, - 0x4802641a, 0x59cc0208, 0x4802621a, 0x59cc0807, - 0x59340002, 0x82000500, 0x00ffffff, 0x80040580, - 0x04000016, 0x5932481c, 0x59240005, 0x80040580, - 0x04020025, 0x59cc1408, 0x0201f800, 0x00109ac1, - 0x04000027, 0x831c0580, 0xffffffff, 0x04000007, - 0x0201f800, 0x0010afc0, 0x04000021, 0x0201f800, - 0x0010b3f1, 0x0400001e, 0x491e6027, 0x4a026403, - 0x00000036, 0x0401f106, 0x59cc1208, 0x82080580, - 0x0000ffff, 0x04000009, 0x0201f800, 0x00109ac1, - 0x04000013, 0x591c0202, 0x59cc0c08, 0x80040580, - 0x0402000f, 0x0401f7e8, 0x59cc1408, 0x42000000, - 0x00000001, 0x0201f800, 0x0010abca, 0x04000008, - 0x0401f7e1, 0x4803c856, 0x4a02641b, 0x00000009, - 0x4a02621b, 0x00001500, 0x0401f006, 0x4803c856, - 0x4a02641b, 0x00000003, 0x4a02621b, 0x00001700, - 0x4a026403, 0x00000037, 0x0401f0e5, 0x4933c857, - 0x0201f800, 0x00106239, 0x040200e7, 0x0201f800, - 0x00101d49, 0x040200e4, 0x0201f800, 0x0010491a, - 0x040206d3, 0x0201f800, 0x0010483c, 0x04000055, - 0x59cc0407, 0x4802641a, 0x59cc1207, 0x480a621a, - 0x82080580, 0x0000ffff, 0x04000005, 0x0201f800, - 0x00109ac1, 0x04000043, 0x0401f00a, 0x59cc1407, - 0x42000000, 0x00000001, 0x0201f800, 0x0010abca, - 0x0400003c, 0x831c0580, 0xffffffff, 0x04000039, - 0x59cc0c07, 0x591c0202, 0x80040580, 0x04020035, - 0x0201f800, 0x0010b3f1, 0x04000032, 0x591c0415, - 0x8c000516, 0x0402003d, 0x4d300000, 0x411e6000, - 0x0201f800, 0x001091e5, 0x5c026000, 0x4a023a03, - 0x00000007, 0x59cc0c09, 0x82040d00, 0x0000ff00, - 0x840409c0, 0x82040580, 0x00000001, 0x0400000c, - 0x82040580, 0x00000005, 0x0400000e, 0x82040580, - 0x00000007, 0x04020015, 0x42000000, 0x0010cc10, - 0x0201f800, 0x0010bc88, 0x0401f00a, 0x42000000, - 0x0010cc0f, 0x0201f800, 0x0010bc88, 0x0401f008, - 0x42000000, 0x0010cc0e, 0x0201f800, 0x0010bc88, - 0x591c0009, 0x80000540, 0x04000004, 0x59cc2808, - 0x0201f000, 0x0010afd4, 0x4803c856, 0x4a02641b, - 0x00000009, 0x4a02621b, 0x00002a00, 0x0401f006, - 0x4803c856, 0x4a02641b, 0x00000003, 0x4a02621b, - 0x00000300, 0x4a026403, 0x0000003b, 0x0401f084, - 0x4803c856, 0x4a02641b, 0x0000000b, 0x4a02621b, - 0x00000000, 0x0401f7f8, 0x4803c856, 0x4a02641b, - 0x00000007, 0x4a02621b, 0x00000000, 0x0401f7f2, - 0x4c080000, 0x0201f800, 0x00104856, 0x04000029, - 0x0201f800, 0x0010481c, 0x0201f800, 0x0010b106, - 0x04020021, 0x5932481c, 0x59240200, 0x82000540, - 0x000000e0, 0x48024a00, 0x59a8021b, 0x82000540, - 0x00000003, 0x4803521b, 0x59a80018, 0x800000d0, - 0x59a8080f, 0x82040d00, 0x000000ff, 0x80041540, - 0x480b500f, 0x42000800, 0x00000003, 0x0201f800, - 0x00106c63, 0x497b501d, 0x8d0e1d20, 0x04000004, - 0x4a032804, 0x000007d0, 0x0401f001, 0x0201f800, - 0x00020b9d, 0x0201f800, 0x00101df2, 0x5c001000, - 0x1c01f000, 0x0201f800, 0x0010b128, 0x0401f7fc, - 0x5c001000, 0x0201f000, 0x00020b9d, 0x0201f800, - 0x00101d49, 0x0402004c, 0x0201f800, 0x0010b12e, - 0x4a026403, 0x00000047, 0x4a026203, 0x00000001, - 0x0201f000, 0x00106b17, 0x0201f800, 0x00101d49, - 0x04020041, 0x0201f800, 0x0010b12e, 0x4a026403, + 0x4a02621b, 0x00001e00, 0x0401f03f, 0x4933c857, + 0x0201f800, 0x00101d52, 0x02000800, 0x0010b3b0, + 0x0402024a, 0x0401fa8a, 0x04020008, 0x4a026403, + 0x00000012, 0x0401f034, 0x59340400, 0x82000580, + 0x00000703, 0x040007eb, 0x83340580, 0x0010e23c, + 0x0400000c, 0x4d3c0000, 0x417a7800, 0x42028000, + 0x00000029, 0x0201f800, 0x0010ff80, 0x5c027800, + 0x42003000, 0x00000017, 0x0201f800, 0x0010b73d, + 0x42000000, 0x0010cf23, 0x0201f800, 0x0010bfb3, + 0x0201f800, 0x00101fb4, 0x59240400, 0x8c00050a, + 0x04020012, 0x42003000, 0x00000006, 0x42028000, + 0x00000029, 0x4933c857, 0x4a026403, 0x00000001, + 0x4a026203, 0x00000007, 0x41782800, 0x0401f003, + 0x42028000, 0x00000046, 0x0201f800, 0x0010b18b, + 0x0201f000, 0x0010b76a, 0x4933c857, 0x4a026403, + 0x00000001, 0x42000800, 0x0000000b, 0x0201f800, + 0x001045ea, 0x4a026203, 0x00000001, 0x0201f000, + 0x00106d1c, 0x4933c857, 0x42000800, 0x00000009, + 0x0201f800, 0x001045ea, 0x4a026403, 0x00000005, + 0x0401f7f5, 0x0201f800, 0x0010b3b0, 0x04020203, + 0x0201f800, 0x00101d52, 0x04020200, 0x0401fa40, + 0x040207be, 0x4a026403, 0x00000020, 0x4a026203, + 0x00000001, 0x0201f000, 0x00106d1c, 0x0201f800, + 0x00101d52, 0x040201f5, 0x4a026403, 0x00000023, + 0x4a026203, 0x00000001, 0x0201f000, 0x00106d1c, + 0x0201f800, 0x0010b3b0, 0x02000800, 0x00101d52, + 0x040201ea, 0x0401fa2a, 0x040207a8, 0x59cc0807, + 0x82040500, 0x00ffff00, 0x0402000a, 0x59340212, + 0x82000500, 0x0000ff00, 0x04000006, 0x5932481c, + 0x59240005, 0x82000500, 0x000000ff, 0x0401f003, + 0x5932481c, 0x59240005, 0x82040d00, 0x00ffffff, + 0x80040580, 0x04020014, 0x59cc1408, 0x0201f800, + 0x00109cf9, 0x04000025, 0x591c0202, 0x82001580, + 0x0000ffff, 0x04000004, 0x59cc1208, 0x80080580, + 0x0402001e, 0x591c000a, 0x81340580, 0x0402001b, + 0x591c0407, 0x82000580, 0x00000007, 0x04020017, + 0x0401f027, 0x59cc1208, 0x82080580, 0x0000ffff, + 0x0400000c, 0x0201f800, 0x00109cf9, 0x0400000f, + 0x59cc1408, 0x591c0202, 0x80080580, 0x04020024, + 0x591c000a, 0x81340580, 0x04020021, 0x0401f010, + 0x59cc1408, 0x41780000, 0x0201f800, 0x0010aed1, + 0x040207f8, 0x0401f017, 0x4a026403, 0x00000026, + 0x4a02621b, 0x00001700, 0x59cc1208, 0x82081580, + 0x0000ffff, 0x04020794, 0x0401f00e, 0x591c0407, + 0x82000580, 0x00000007, 0x040207f4, 0x591c0403, + 0x82000580, 0x00000024, 0x04020006, 0x4d300000, + 0x411e6000, 0x0201f800, 0x00020b9d, 0x5c026000, + 0x4a026403, 0x00000025, 0x0401f783, 0x59cc1408, + 0x41780000, 0x0201f800, 0x0010aed1, 0x040207e3, + 0x0401f7f8, 0x4933c857, 0x4d3c0000, 0x42027800, + 0x00000001, 0x0201f800, 0x001045df, 0x5c027800, + 0x4c580000, 0x4200b000, 0x00000002, 0x83a81c00, + 0x00000002, 0x83cc1400, 0x0000000b, 0x0201f800, + 0x00108c57, 0x5c00b000, 0x04000004, 0x4a026403, + 0x00000031, 0x0401f768, 0x0201f800, 0x00020b9d, + 0x4200b000, 0x00000002, 0x83a81c00, 0x00000000, + 0x83cc1400, 0x0000000d, 0x0201f800, 0x00108c57, + 0x04020010, 0x0201f800, 0x00106268, 0x0400000d, + 0x59300407, 0x82000580, 0x00000001, 0x04020009, + 0x59300403, 0x82000580, 0x00000002, 0x04020005, + 0x5930000a, 0x81340580, 0x02000800, 0x00020b9d, + 0x0201f800, 0x001050f7, 0x0402000f, 0x0201f800, + 0x00105113, 0x04020008, 0x4a035014, 0x00000001, + 0x4202d800, 0x00000001, 0x0201f800, 0x00105051, + 0x0401f005, 0x42000000, 0x00000001, 0x0201f800, + 0x001050c8, 0x1c01f000, 0x0201f800, 0x00101d52, + 0x0402014a, 0x0401f98a, 0x04020708, 0x493a6403, + 0x0401f9fa, 0x04020004, 0x4a026403, 0x0000002b, + 0x0401f731, 0x4a026403, 0x0000002c, 0x0401f72e, + 0x4933c857, 0x0201f800, 0x00106405, 0x0402013b, + 0x0201f800, 0x00101d52, 0x04020138, 0x0201f800, + 0x00104a1c, 0x040206f5, 0x59cc0408, 0x4802641a, + 0x59cc0208, 0x4802621a, 0x59cc0807, 0x59340002, + 0x82000500, 0x00ffffff, 0x80040580, 0x04000016, + 0x5932481c, 0x59240005, 0x80040580, 0x04020025, + 0x59cc1408, 0x0201f800, 0x00109cf9, 0x04000027, + 0x831c0580, 0xffffffff, 0x04000007, 0x0201f800, + 0x0010b2d7, 0x04000021, 0x0201f800, 0x0010b71c, + 0x0400001e, 0x491e6027, 0x4a026403, 0x00000036, + 0x0401f110, 0x59cc1208, 0x82080580, 0x0000ffff, + 0x04000009, 0x0201f800, 0x00109cf9, 0x04000013, + 0x591c0202, 0x59cc0c08, 0x80040580, 0x0402000f, + 0x0401f7e8, 0x59cc1408, 0x42000000, 0x00000001, + 0x0201f800, 0x0010aed1, 0x04000008, 0x0401f7e1, + 0x4803c856, 0x4a02641b, 0x00000009, 0x4a02621b, + 0x00001500, 0x0401f006, 0x4803c856, 0x4a02641b, + 0x00000003, 0x4a02621b, 0x00001700, 0x4a026403, + 0x00000037, 0x0401f0ef, 0x4933c857, 0x0201f800, + 0x00106405, 0x040200f1, 0x0201f800, 0x00101d52, + 0x040200ee, 0x0201f800, 0x00104a1c, 0x040206ab, + 0x0201f800, 0x0010493c, 0x04000055, 0x59cc0407, + 0x4802641a, 0x59cc1207, 0x480a621a, 0x82080580, + 0x0000ffff, 0x04000005, 0x0201f800, 0x00109cf9, + 0x04000043, 0x0401f00a, 0x59cc1407, 0x42000000, + 0x00000001, 0x0201f800, 0x0010aed1, 0x0400003c, + 0x831c0580, 0xffffffff, 0x04000039, 0x59cc0c07, + 0x591c0202, 0x80040580, 0x04020035, 0x0201f800, + 0x0010b71c, 0x04000032, 0x591c0415, 0x8c000516, + 0x0402003d, 0x4d300000, 0x411e6000, 0x0201f800, + 0x00109419, 0x5c026000, 0x4a023a03, 0x00000007, + 0x59cc0c09, 0x82040d00, 0x0000ff00, 0x840409c0, + 0x82040580, 0x00000001, 0x0400000c, 0x82040580, + 0x00000005, 0x0400000e, 0x82040580, 0x00000007, + 0x04020015, 0x42000000, 0x0010cf10, 0x0201f800, + 0x0010bfb3, 0x0401f00a, 0x42000000, 0x0010cf0f, + 0x0201f800, 0x0010bfb3, 0x0401f008, 0x42000000, + 0x0010cf0e, 0x0201f800, 0x0010bfb3, 0x591c0009, + 0x80000540, 0x04000004, 0x59cc2808, 0x0201f000, + 0x0010b2eb, 0x4803c856, 0x4a02641b, 0x00000009, + 0x4a02621b, 0x00002a00, 0x0401f006, 0x4803c856, + 0x4a02641b, 0x00000003, 0x4a02621b, 0x00000300, + 0x4a026403, 0x0000003b, 0x0401f08e, 0x4803c856, + 0x4a02641b, 0x0000000b, 0x4a02621b, 0x00000000, + 0x0401f7f8, 0x4803c856, 0x4a02641b, 0x00000007, + 0x4a02621b, 0x00000000, 0x0401f7f2, 0x59cc0001, + 0x82000580, 0x00fffffe, 0x04020084, 0x4c080000, + 0x0201f800, 0x00104956, 0x04000029, 0x0201f800, + 0x0010491c, 0x0201f800, 0x0010b41d, 0x04020021, + 0x5932481c, 0x59240200, 0x82000540, 0x000000e0, + 0x48024a00, 0x59a8021b, 0x82000540, 0x00000003, + 0x4803521b, 0x59a80018, 0x800000d0, 0x59a8080f, + 0x82040d00, 0x000000ff, 0x80041540, 0x480b500f, + 0x42000800, 0x00000003, 0x0201f800, 0x00106e68, + 0x497b501d, 0x8d0e1d20, 0x04000004, 0x4a032804, + 0x000007d0, 0x0401f001, 0x0201f800, 0x00020b9d, + 0x0201f800, 0x00101e2e, 0x5c001000, 0x1c01f000, + 0x0201f800, 0x0010b43f, 0x0401f7fc, 0x5c001000, + 0x0201f000, 0x00020b9d, 0x0201f800, 0x00101d52, + 0x04020052, 0x0201f800, 0x0010b445, 0x4a026403, 0x00000047, 0x4a026203, 0x00000001, 0x0201f000, - 0x00106b17, 0x0201f800, 0x00101d49, 0x04020036, - 0x0201f800, 0x0010b12e, 0x0201f000, 0x00020b9d, - 0x0401f834, 0x04000030, 0x4a026403, 0x0000004e, - 0x4a026203, 0x00000001, 0x0201f000, 0x00106b17, - 0x4a026403, 0x0000004f, 0x497a601d, 0x59cc0a06, - 0x82040d00, 0x000000ff, 0x800409c0, 0x0400061b, - 0x82040580, 0x00000001, 0x04020005, 0x59cc0808, - 0x59a80005, 0x80040580, 0x04000614, 0x82040580, - 0x00000002, 0x0402000a, 0x83cc1400, 0x0000000b, - 0x4200b000, 0x00000002, 0x83341c00, 0x00000006, - 0x0201f800, 0x00108a31, 0x04000608, 0x4a02601d, - 0x00000001, 0x0401f605, 0x4a026403, 0x00000050, - 0x59cc0207, 0x4802601d, 0x0401f600, 0x4a026203, - 0x00000001, 0x42000800, 0x80000040, 0x0201f000, - 0x00020b3e, 0x4803c857, 0x0201f000, 0x00020b9d, - 0x4d2c0000, 0x4c500000, 0x4c580000, 0x4c540000, - 0x59a8005a, 0x82000c80, 0x00000841, 0x0402102d, - 0x0201f800, 0x0010056e, 0x0400002a, 0x492e6009, - 0x59a8005a, 0x48025802, 0x82000400, 0x00000003, - 0x80000104, 0x83cca400, 0x00000006, 0x82000c80, - 0x0000000a, 0x04001015, 0x4a025811, 0x0000000a, - 0x4200b000, 0x0000000a, 0x832c0400, 0x00000006, - 0x4000a800, 0x0201f800, 0x0010bd5b, 0x412c7000, - 0x800409c0, 0x04020003, 0x49787001, 0x0401f00e, - 0x0201f800, 0x0010056e, 0x0400000e, 0x492c7001, - 0x40040000, 0x0401f7ea, 0x48025811, 0x4000b000, - 0x832c0400, 0x00000006, 0x4000a800, 0x0201f800, - 0x0010bd5b, 0x82000540, 0x00000001, 0x0401f006, - 0x497b505a, 0x59325809, 0x0201f800, 0x0010059d, - 0x80000580, 0x5c00a800, 0x5c00b000, 0x5c00a000, - 0x5c025800, 0x1c01f000, 0x4d340000, 0x5932680a, - 0x59343400, 0x4933c857, 0x4937c857, 0x481bc857, - 0x0201f800, 0x0010492d, 0x5c026800, 0x1c01f000, - 0x4933c857, 0x4c600000, 0x4d3c0000, 0x4d440000, - 0x4d340000, 0x0401f870, 0x0402005a, 0x59cc0207, - 0x82000d00, 0x0000ff00, 0x900411c0, 0x59cc000a, - 0x82000500, 0x00ffffff, 0x80081540, 0x480a601d, - 0x8c040d18, 0x0400001a, 0x42003000, 0x00000008, - 0x0201f800, 0x0010b402, 0x42000000, 0x0010cc22, - 0x0201f800, 0x0010bc88, 0x59240400, 0x8c00050a, - 0x04020009, 0x42002800, 0x00000002, 0x42003000, - 0x00000024, 0x42028000, 0x00000046, 0x0201f800, - 0x0010ae7c, 0x4200c000, 0x00000001, 0x417a7800, - 0x0201f800, 0x00101cda, 0x0401f039, 0x8c040d1a, - 0x04000034, 0x59cc000a, 0x59cc3800, 0x821c3d00, - 0x00ffffff, 0x0201f800, 0x00105f68, 0x02000800, - 0x0010497a, 0x0402002b, 0x5930001c, 0x4c000000, - 0x0201f800, 0x00104971, 0x4926601c, 0x5930000a, - 0x4c000000, 0x59240c00, 0x8c040d0a, 0x0402000f, - 0x59340c03, 0x59341802, 0x820c1d00, 0x00ffffff, - 0x58002403, 0x42002800, 0x00000004, 0x42003000, - 0x00000024, 0x42028000, 0x00000046, 0x41301000, - 0x0201f800, 0x0010ae8c, 0x4936600a, 0x42003000, - 0x00000009, 0x0201f800, 0x0010b40a, 0x42000000, - 0x0010cc22, 0x0201f800, 0x0010bc88, 0x417a7800, - 0x4178c000, 0x0201f800, 0x00101cda, 0x5c000000, - 0x4802600a, 0x5c000000, 0x4802601c, 0x0401f004, - 0x82000540, 0x00000001, 0x0401f002, 0x80000580, - 0x5c026800, 0x5c028800, 0x5c027800, 0x5c00c000, - 0x1c01f000, 0x4933c857, 0x59cc0206, 0x82000480, - 0x00000010, 0x04021006, 0x4a02621b, 0x00000000, - 0x82000540, 0x00000001, 0x0401f002, 0x80000580, - 0x1c01f000, 0x4933c857, 0x4a02621b, 0x00000000, - 0x59cc0407, 0x82000500, 0x0000ff00, 0x82000580, - 0x00000800, 0x0402000d, 0x59cc0206, 0x59a8085a, - 0x80040480, 0x0400100a, 0x59cc0006, 0x82000500, - 0x00ff0000, 0x82000d80, 0x00140000, 0x04000003, - 0x82000d80, 0x00100000, 0x1c01f000, 0x42000000, - 0x0010cc17, 0x0201f800, 0x0010bc88, 0x82000540, - 0x00000001, 0x0401f7f9, 0x59300403, 0x82003480, - 0x00000057, 0x02021800, 0x0010032e, 0x83383580, - 0x00000013, 0x04020007, 0x4803c857, 0x4c000000, - 0x0201f800, 0x0010b4ff, 0x5c000000, 0x0c01f018, - 0x4933c857, 0x493bc857, 0x83383580, 0x00000027, - 0x04000005, 0x83383580, 0x00000014, 0x02020800, - 0x0010032e, 0x493bc857, 0x4937c857, 0x0201f800, - 0x0010b4fc, 0x0201f800, 0x0010481c, 0x42000800, - 0x00000007, 0x0201f800, 0x001044f1, 0x0201f800, - 0x00106b8c, 0x0201f000, 0x00107cbe, 0x0010a873, - 0x0010a87c, 0x0010a873, 0x0010a873, 0x0010a873, - 0x0010a87c, 0x0010a887, 0x0010a926, 0x0010a8e1, - 0x0010a926, 0x0010a8fc, 0x0010a926, 0x0010a903, - 0x0010a926, 0x0010a908, 0x0010a926, 0x0010a908, - 0x0010a926, 0x0010a926, 0x0010a873, 0x0010a873, - 0x0010a873, 0x0010a873, 0x0010a873, 0x0010a873, - 0x0010a873, 0x0010a873, 0x0010a873, 0x0010a873, - 0x0010a873, 0x0010a87c, 0x0010a873, 0x0010a926, - 0x0010a873, 0x0010a873, 0x0010a926, 0x0010a873, - 0x0010a926, 0x0010a926, 0x0010a873, 0x0010a873, - 0x0010a873, 0x0010a873, 0x0010a926, 0x0010a926, - 0x0010a873, 0x0010a926, 0x0010a926, 0x0010a873, - 0x0010a881, 0x0010a873, 0x0010a873, 0x0010a873, - 0x0010a873, 0x0010a90b, 0x0010a926, 0x0010a873, - 0x0010a873, 0x0010a90c, 0x0010a926, 0x0010a873, - 0x0010a873, 0x0010a873, 0x0010a873, 0x0010a873, - 0x0010a873, 0x0010a873, 0x0010a873, 0x0010a873, - 0x0010a875, 0x0010a873, 0x0010a875, 0x0010a873, - 0x0010a873, 0x0010a875, 0x0010a873, 0x0010a873, - 0x0010a873, 0x0010a875, 0x0010a875, 0x0010a875, - 0x0010a873, 0x0010a873, 0x0010a873, 0x0010a873, - 0x0010a873, 0x0010a875, 0x0010a873, 0x0010a873, - 0x0010a873, 0x0010a873, 0x0010a873, 0x0010a873, - 0x0010a873, 0x0010a873, 0x0010a873, 0x0201f800, - 0x0010032e, 0x4d2c0000, 0x59325809, 0x0201f800, - 0x0010059d, 0x5c025800, 0x0201f000, 0x00020b9d, - 0x59a8002a, 0x48026006, 0x4a026203, 0x00000002, - 0x1c01f000, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x001044e6, 0x5c027800, 0x0401f0a0, 0x0201f800, - 0x00104936, 0x0400009d, 0x59a8021b, 0x8c000508, - 0x04000012, 0x5932680a, 0x4c580000, 0x4200b000, - 0x00000002, 0x83a81c00, 0x00000002, 0x83341400, - 0x00000006, 0x0201f800, 0x00108a31, 0x80000540, - 0x5c00b000, 0x0402008d, 0x59340200, 0x8400051a, - 0x48026a00, 0x0401f031, 0x599c0017, 0x8c00050a, - 0x04020086, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x001044e6, 0x5c027800, 0x42000800, 0x00000007, - 0x0201f800, 0x001044f1, 0x59340212, 0x82000500, - 0x0000ff00, 0x04020017, 0x83440d80, 0x000007fe, - 0x04020076, 0x0201f800, 0x00101f51, 0x59a8021b, - 0x8c000514, 0x04000071, 0x83240580, 0x0010ccd1, - 0x04020006, 0x4d300000, 0x0201f800, 0x00101dc6, - 0x5c026000, 0x0401f069, 0x59a8221b, 0x8c102514, - 0x04000066, 0x0201f800, 0x00101f2a, 0x0401f063, + 0x00106d1c, 0x0201f800, 0x00101d52, 0x04020047, + 0x0201f800, 0x0010b445, 0x4a026403, 0x00000047, + 0x4a026203, 0x00000001, 0x0201f000, 0x00106d1c, + 0x0201f800, 0x00101d52, 0x0402003c, 0x0201f800, + 0x0010b445, 0x0201f000, 0x00020b9d, 0x0401f83a, + 0x04000036, 0x4a026403, 0x0000004e, 0x4a026203, + 0x00000001, 0x0201f000, 0x00106d1c, 0x0201f800, + 0x00104a2f, 0x040205ed, 0x4a026403, 0x0000004f, + 0x497a601d, 0x59cc0a06, 0x82040d00, 0x000000ff, + 0x800409c0, 0x04000614, 0x82040580, 0x00000001, + 0x04020005, 0x59cc0808, 0x59a80005, 0x80040580, + 0x0400060d, 0x82040580, 0x00000002, 0x0402000a, + 0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000006, 0x0201f800, 0x00108c57, + 0x04000601, 0x4a02601d, 0x00000001, 0x0401f5fe, + 0x0201f800, 0x00104a2f, 0x040205cc, 0x4a026403, + 0x00000050, 0x59cc0207, 0x4802601d, 0x0401f5f6, + 0x4a026203, 0x00000001, 0x42000800, 0x80000040, + 0x0201f000, 0x00020b3e, 0x4803c857, 0x0201f000, + 0x00020b9d, 0x4d2c0000, 0x4c500000, 0x4c580000, + 0x4c540000, 0x59a8005a, 0x82000c80, 0x00000841, + 0x0402102d, 0x0201f800, 0x0010056e, 0x0400002a, + 0x492e6009, 0x59a8005a, 0x48025802, 0x82000400, + 0x00000003, 0x80000104, 0x83cca400, 0x00000006, + 0x82000c80, 0x0000000a, 0x04001015, 0x4a025811, + 0x0000000a, 0x4200b000, 0x0000000a, 0x832c0400, + 0x00000006, 0x4000a800, 0x0201f800, 0x0010c086, + 0x412c7000, 0x800409c0, 0x04020003, 0x49787001, + 0x0401f00e, 0x0201f800, 0x0010056e, 0x0400000e, + 0x492c7001, 0x40040000, 0x0401f7ea, 0x48025811, + 0x4000b000, 0x832c0400, 0x00000006, 0x4000a800, + 0x0201f800, 0x0010c086, 0x82000540, 0x00000001, + 0x0401f006, 0x497b505a, 0x59325809, 0x0201f800, + 0x0010059d, 0x80000580, 0x5c00a800, 0x5c00b000, + 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4d340000, + 0x5932680a, 0x59343400, 0x4933c857, 0x4937c857, + 0x481bc857, 0x0201f800, 0x00104a2f, 0x5c026800, + 0x1c01f000, 0x4933c857, 0x4c600000, 0x4d3c0000, + 0x4d440000, 0x4d340000, 0x0401f870, 0x0402005a, + 0x59cc0207, 0x82000d00, 0x0000ff00, 0x900411c0, + 0x59cc000a, 0x82000500, 0x00ffffff, 0x80081540, + 0x480a601d, 0x8c040d18, 0x0400001a, 0x42003000, + 0x00000008, 0x0201f800, 0x0010b72d, 0x42000000, + 0x0010cf22, 0x0201f800, 0x0010bfb3, 0x59240400, + 0x8c00050a, 0x04020009, 0x42002800, 0x00000002, + 0x42003000, 0x00000024, 0x42028000, 0x00000046, + 0x0201f800, 0x0010b18b, 0x4200c000, 0x00000001, + 0x417a7800, 0x0201f800, 0x00101ce3, 0x0401f039, + 0x8c040d1a, 0x04000034, 0x59cc000a, 0x59cc3800, + 0x821c3d00, 0x00ffffff, 0x0201f800, 0x00106134, + 0x02000800, 0x00104a7c, 0x0402002b, 0x5930001c, + 0x4c000000, 0x0201f800, 0x00104a73, 0x4926601c, + 0x5930000a, 0x4c000000, 0x59240c00, 0x8c040d0a, + 0x0402000f, 0x59340c03, 0x59341802, 0x820c1d00, + 0x00ffffff, 0x58002403, 0x42002800, 0x00000004, + 0x42003000, 0x00000024, 0x42028000, 0x00000046, + 0x41301000, 0x0201f800, 0x0010b19b, 0x4936600a, + 0x42003000, 0x00000009, 0x0201f800, 0x0010b735, + 0x42000000, 0x0010cf22, 0x0201f800, 0x0010bfb3, + 0x417a7800, 0x4178c000, 0x0201f800, 0x00101ce3, + 0x5c000000, 0x4802600a, 0x5c000000, 0x4802601c, + 0x0401f004, 0x82000540, 0x00000001, 0x0401f002, + 0x80000580, 0x5c026800, 0x5c028800, 0x5c027800, + 0x5c00c000, 0x1c01f000, 0x4933c857, 0x59cc0206, + 0x82000480, 0x00000010, 0x04021006, 0x4a02621b, + 0x00000000, 0x82000540, 0x00000001, 0x0401f002, + 0x80000580, 0x1c01f000, 0x4933c857, 0x4a02621b, + 0x00000000, 0x59cc0407, 0x82000500, 0x0000ff00, + 0x82000580, 0x00000800, 0x0402000d, 0x59cc0206, + 0x59a8085a, 0x80040480, 0x0400100a, 0x59cc0006, + 0x82000500, 0x00ff0000, 0x82000d80, 0x00140000, + 0x04000003, 0x82000d80, 0x00100000, 0x1c01f000, + 0x42000000, 0x0010cf17, 0x0201f800, 0x0010bfb3, + 0x82000540, 0x00000001, 0x0401f7f9, 0x59300403, + 0x82003480, 0x00000057, 0x02021800, 0x0010032e, + 0x83383580, 0x00000013, 0x04020007, 0x4803c857, + 0x4c000000, 0x0201f800, 0x0010b82a, 0x5c000000, + 0x0c01f018, 0x4933c857, 0x493bc857, 0x83383580, + 0x00000027, 0x04000005, 0x83383580, 0x00000014, + 0x02020800, 0x0010032e, 0x493bc857, 0x4937c857, + 0x0201f800, 0x0010b827, 0x0201f800, 0x0010491c, + 0x42000800, 0x00000007, 0x0201f800, 0x001045ea, + 0x0201f800, 0x00106d91, 0x0201f000, 0x00107eb4, + 0x0010ab74, 0x0010ab7d, 0x0010ab74, 0x0010ab74, + 0x0010ab74, 0x0010ab7d, 0x0010ab88, 0x0010ac2a, + 0x0010abe5, 0x0010ac2a, 0x0010ac00, 0x0010ac2a, + 0x0010ac07, 0x0010ac2a, 0x0010ac0c, 0x0010ac2a, + 0x0010ac0c, 0x0010ac2a, 0x0010ac2a, 0x0010ab74, + 0x0010ab74, 0x0010ab74, 0x0010ab74, 0x0010ab74, + 0x0010ab74, 0x0010ab74, 0x0010ab74, 0x0010ab74, + 0x0010ab74, 0x0010ab74, 0x0010ab7d, 0x0010ab74, + 0x0010ac2a, 0x0010ab74, 0x0010ab74, 0x0010ac2a, + 0x0010ab74, 0x0010ac2a, 0x0010ac2a, 0x0010ab74, + 0x0010ab74, 0x0010ab74, 0x0010ab74, 0x0010ac2a, + 0x0010ac2a, 0x0010ab74, 0x0010ac2a, 0x0010ac2a, + 0x0010ab74, 0x0010ab82, 0x0010ab74, 0x0010ab74, + 0x0010ab74, 0x0010ab74, 0x0010ac0f, 0x0010ac2a, + 0x0010ab74, 0x0010ab74, 0x0010ac10, 0x0010ac2a, + 0x0010ab74, 0x0010ab74, 0x0010ab74, 0x0010ab74, + 0x0010ab74, 0x0010ab74, 0x0010ab74, 0x0010ab74, + 0x0010ab74, 0x0010ab76, 0x0010ab74, 0x0010ab76, + 0x0010ab74, 0x0010ab74, 0x0010ab76, 0x0010ab74, + 0x0010ab74, 0x0010ab74, 0x0010ab76, 0x0010ab76, + 0x0010ab76, 0x0010ab74, 0x0010ab74, 0x0010ab74, + 0x0010ab74, 0x0010ab74, 0x0010ab76, 0x0010ab74, + 0x0010ab74, 0x0010ab74, 0x0010ab74, 0x0010ab74, + 0x0010ab74, 0x0010ab74, 0x0010ab74, 0x0010ab74, + 0x0201f800, 0x0010032e, 0x4d2c0000, 0x59325809, + 0x0201f800, 0x0010059d, 0x5c025800, 0x0201f000, + 0x00020b9d, 0x59a8002a, 0x48026006, 0x4a026203, + 0x00000002, 0x1c01f000, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x001045df, 0x5c027800, 0x0401f0a3, + 0x0201f800, 0x00104a38, 0x040000a0, 0x59a8021b, + 0x8c000508, 0x04000012, 0x5932680a, 0x4c580000, + 0x4200b000, 0x00000002, 0x83a81c00, 0x00000002, + 0x83341400, 0x00000006, 0x0201f800, 0x00108c57, + 0x80000540, 0x5c00b000, 0x04020090, 0x59340200, + 0x8400051a, 0x48026a00, 0x0401f034, 0x599c0017, + 0x8c00050a, 0x0402000a, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x001045df, 0x5c027800, 0x42000800, + 0x00000007, 0x0201f800, 0x001045ea, 0x59340212, + 0x82000500, 0x0000ff00, 0x04020017, 0x83440d80, + 0x000007fe, 0x04020079, 0x0201f800, 0x00101fb4, + 0x59a8021b, 0x8c000514, 0x04000074, 0x83240580, + 0x0010cfd1, 0x04020006, 0x4d300000, 0x0201f800, + 0x00101e01, 0x5c026000, 0x0401f06c, 0x59a8221b, + 0x8c102514, 0x04000069, 0x0201f800, 0x00101f94, + 0x0401f066, 0x599c0017, 0x8c00050a, 0x04020063, 0x599c0019, 0x8c00050e, 0x04020060, 0x416c0000, 0x82000580, 0x00000002, 0x04020004, 0x59a80016, 0x80000000, 0x48035016, 0x42000800, 0x00000003, - 0x0201f800, 0x001044f1, 0x4a026407, 0x00000001, + 0x0201f800, 0x001045ea, 0x4a026407, 0x00000001, 0x4a026203, 0x00000001, 0x4a026403, 0x00000002, - 0x0201f800, 0x00106b17, 0x4ce80000, 0x4201d000, - 0x00000001, 0x0201f800, 0x00106314, 0x5c01d000, + 0x0201f800, 0x00106d1c, 0x4ce80000, 0x4201d000, + 0x00000001, 0x0201f800, 0x00106519, 0x5c01d000, 0x1c01f000, 0x59340200, 0x8400051a, 0x48026a00, - 0x0201f800, 0x0010492d, 0x04000040, 0x0201f800, - 0x00106827, 0x42000800, 0x00000004, 0x0201f800, - 0x001044f1, 0x0201f800, 0x0010b435, 0x04020037, - 0x42000800, 0x00000005, 0x0201f800, 0x001044f1, + 0x0201f800, 0x00104a2f, 0x04000040, 0x0201f800, + 0x00106a2c, 0x42000800, 0x00000004, 0x0201f800, + 0x001045ea, 0x0201f800, 0x0010b760, 0x04020037, + 0x42000800, 0x00000005, 0x0201f800, 0x001045ea, 0x4a026407, 0x00000001, 0x4a026203, 0x00000001, - 0x4a026403, 0x00000003, 0x0201f000, 0x00106b17, - 0x0201f800, 0x00104936, 0x04020028, 0x42000800, + 0x4a026403, 0x00000003, 0x0201f000, 0x00106d1c, + 0x0201f800, 0x00104a38, 0x04020028, 0x42000800, 0x00000006, 0x0401f827, 0x0401f024, 0x42000800, - 0x00000004, 0x0201f800, 0x001044f1, 0x0401f783, - 0x0201f800, 0x0010481c, 0x0401f01c, 0x0401f01b, + 0x00000004, 0x0201f800, 0x001045ea, 0x0401f780, + 0x0201f800, 0x0010491c, 0x0401f01c, 0x0401f01b, 0x59300827, 0x4807c857, 0x800409c0, 0x04000017, 0x5804001d, 0x81300580, 0x04020014, 0x4978081d, 0x58041415, 0x8c081516, 0x04000010, 0x8c081514, @@ -25374,1389 +25619,1406 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x812e59c0, 0x04000009, 0x492fc857, 0x4d300000, 0x40066000, 0x417a7800, 0x0201f800, 0x00020a86, 0x5c026000, 0x0401f001, 0x0201f000, 0x00020b9d, - 0x4933c857, 0x4807c857, 0x0201f800, 0x001044f1, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x001044e6, + 0x4933c857, 0x4807c857, 0x0201f800, 0x001045ea, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x001045df, 0x5c027800, 0x5934000a, 0x84000520, 0x4802680a, - 0x0201f000, 0x0010481c, 0x59340400, 0x4803c857, + 0x0201f000, 0x0010491c, 0x59340400, 0x4803c857, 0x80000110, 0x82003480, 0x0000000c, 0x02021800, 0x0010032e, 0x83383580, 0x00000015, 0x04020002, 0x0c01f006, 0x83383580, 0x00000016, 0x02020800, - 0x0010032e, 0x0c01f00d, 0x0010854a, 0x0010854a, - 0x0010854a, 0x0010854a, 0x0010854a, 0x0010854a, - 0x0010a98a, 0x0010a95e, 0x0010854a, 0x0010854a, - 0x0010854a, 0x0010854a, 0x0010854a, 0x0010854a, - 0x0010854a, 0x0010854a, 0x0010854a, 0x0010854a, - 0x0010a98a, 0x0010a991, 0x0010854a, 0x0010854a, - 0x0010854a, 0x0010854a, 0x4933c857, 0x5932481c, + 0x0010032e, 0x0c01f00d, 0x0010875e, 0x0010875e, + 0x0010875e, 0x0010875e, 0x0010875e, 0x0010875e, + 0x0010ac8e, 0x0010ac62, 0x0010875e, 0x0010875e, + 0x0010875e, 0x0010875e, 0x0010875e, 0x0010875e, + 0x0010875e, 0x0010875e, 0x0010875e, 0x0010875e, + 0x0010ac8e, 0x0010ac95, 0x0010875e, 0x0010875e, + 0x0010875e, 0x0010875e, 0x4933c857, 0x5932481c, 0x59240400, 0x8c000508, 0x0400001b, 0x813669c0, 0x04000019, 0x59340212, 0x82000500, 0x0000ff00, 0x04000015, 0x599c0019, 0x8c00050e, 0x04020012, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x001044e6, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x001045df, 0x5c027800, 0x42000800, 0x00000003, 0x0201f800, - 0x001044f1, 0x4a026407, 0x00000001, 0x4a026203, + 0x001045ea, 0x4a026407, 0x00000001, 0x4a026203, 0x00000001, 0x4a026403, 0x00000002, 0x0201f000, - 0x00106b17, 0x59cc0001, 0x59340802, 0x80040580, + 0x00106d1c, 0x59cc0001, 0x59340802, 0x80040580, 0x82000500, 0x00ffffff, 0x02020000, 0x00020b9d, - 0x59345002, 0x0201f800, 0x001041e4, 0x482a6802, + 0x59345002, 0x0201f800, 0x001042dd, 0x482a6802, 0x0201f000, 0x00020b9d, 0x4933c857, 0x59303403, 0x82183580, 0x0000001e, 0x02000000, 0x00020b9d, - 0x1c01f000, 0x4933c857, 0x0201f800, 0x0010890a, + 0x1c01f000, 0x4933c857, 0x0201f800, 0x00108b22, 0x02020000, 0x00020b9d, 0x4a026203, 0x00000001, - 0x4a026403, 0x00000001, 0x0201f000, 0x00106b17, + 0x4a026403, 0x00000001, 0x0201f000, 0x00106d1c, 0x493bc857, 0x83380580, 0x00000051, 0x0402000b, - 0x0201f800, 0x00107021, 0x02020000, 0x00107d3d, + 0x0201f800, 0x00107226, 0x02020000, 0x00107f37, 0x59300203, 0x82000580, 0x00000002, 0x0400006e, 0x0201f800, 0x0010032e, 0x83380580, 0x00000027, 0x04000014, 0x83380580, 0x00000048, 0x04000006, 0x83380580, 0x00000014, 0x0400000e, 0x02020800, - 0x0010032e, 0x0201f800, 0x00107021, 0x02020000, - 0x00107d3d, 0x59300203, 0x82000580, 0x00000004, + 0x0010032e, 0x0201f800, 0x00107226, 0x02020000, + 0x00107f37, 0x59300203, 0x82000580, 0x00000004, 0x02000000, 0x00020c9d, 0x0201f800, 0x0010032e, 0x4933c857, 0x59300403, 0x82000c80, 0x00000044, 0x02021800, 0x0010032e, 0x82000480, 0x00000040, 0x02001800, 0x0010032e, 0x40027000, 0x4803c857, - 0x0c01f001, 0x0010a9d1, 0x0010a9d3, 0x0010a9d3, - 0x0010a9ee, 0x0201f800, 0x0010032e, 0x0201f800, - 0x00106b8c, 0x59325809, 0x812e59c0, 0x04000016, + 0x0c01f001, 0x0010acd5, 0x0010acd7, 0x0010acd7, + 0x0010acf2, 0x0201f800, 0x0010032e, 0x0201f800, + 0x00106d91, 0x59325809, 0x812e59c0, 0x04000016, 0x832c0500, 0x00ff0000, 0x04000013, 0x4a026203, 0x00000002, 0x5932680a, 0x59340200, 0x8c00050e, 0x0402000d, 0x42028000, 0x00000004, 0x0201f800, - 0x0010ae66, 0x497a6009, 0x59300006, 0x80000540, + 0x0010b175, 0x497a6009, 0x59300006, 0x80000540, 0x04020003, 0x59a8002b, 0x48026006, 0x4a026203, - 0x00000007, 0x1c01f000, 0x0201f800, 0x00106b8c, - 0x0201f800, 0x00109667, 0x02000000, 0x00107cbe, + 0x00000007, 0x1c01f000, 0x0201f800, 0x00106d91, + 0x0201f800, 0x0010989f, 0x02000000, 0x00107eb4, 0x59325809, 0x0201f800, 0x00100594, 0x0201f000, - 0x00107cbe, 0x0201f800, 0x0010032e, 0x59325809, + 0x00107eb4, 0x0201f800, 0x0010032e, 0x59325809, 0x592c040b, 0x8c000502, 0x04000007, 0x4a026203, 0x00000007, 0x42027000, 0x00000043, 0x0201f000, 0x00020bc1, 0x4a026203, 0x00000004, 0x1c01f000, - 0x0201f800, 0x0010b09f, 0x02000000, 0x00020c9b, + 0x0201f800, 0x0010b3b6, 0x02000000, 0x00020c9b, 0x1c01f000, 0x4a026203, 0x00000001, 0x4a026403, 0x00000041, 0x42027800, 0x80002042, 0x0201f000, 0x00020b3e, 0x83380580, 0x00000051, 0x04000006, 0x83380580, 0x00000041, 0x02020800, 0x0010032e, 0x1c01f000, 0x0201f800, 0x00020afd, 0x0201f800, - 0x0010b0e3, 0x0201f000, 0x00020b9d, 0x83380480, + 0x0010b3fa, 0x0201f000, 0x00020b9d, 0x83380480, 0x00000052, 0x02021800, 0x0010032e, 0x83380480, 0x00000049, 0x02001800, 0x0010032e, 0x0c01f001, - 0x0010aa37, 0x0010aa5e, 0x0010aa35, 0x0010aa35, - 0x0010aa35, 0x0010aa35, 0x0010aa5e, 0x0010aa35, - 0x0010aa7f, 0x0201f800, 0x0010032e, 0x59325809, + 0x0010ad3b, 0x0010ad65, 0x0010ad39, 0x0010ad39, + 0x0010ad39, 0x0010ad39, 0x0010ad65, 0x0010ad39, + 0x0010ad86, 0x0201f800, 0x0010032e, 0x59325809, 0x592c040b, 0x8c00051e, 0x04000013, 0x82000d00, - 0x000000c0, 0x82040d80, 0x00000080, 0x04000013, - 0x59300804, 0x8c040d18, 0x04020010, 0x59300415, + 0x000000c0, 0x82040d80, 0x00000080, 0x04000016, + 0x59300804, 0x8c040d18, 0x04020013, 0x59300415, 0x8c000516, 0x04000004, 0x4a026203, 0x00000007, - 0x0401f015, 0x42027000, 0x00000041, 0x0201f000, + 0x0401f018, 0x42027000, 0x00000041, 0x0201f000, 0x00020cbc, 0x4a026203, 0x00000007, 0x497a6006, - 0x0201f000, 0x00020afd, 0x59325809, 0x592c0c0b, - 0x8c040d1a, 0x04020005, 0x0201f800, 0x00020afd, - 0x0201f000, 0x00020b9d, 0x0201f800, 0x0010b09f, - 0x040007fa, 0x1c01f000, 0x0201f800, 0x00106b6c, - 0x59325809, 0x5932680a, 0x59340200, 0x8c00050e, - 0x0400000e, 0x592c040b, 0x82000500, 0x000000c0, - 0x82000580, 0x00000080, 0x04000005, 0x592c0010, - 0x59301816, 0x800c1c80, 0x480e6016, 0x4a026203, - 0x00000002, 0x0401f00d, 0x42028000, 0x00000004, - 0x0401fbf2, 0x59300006, 0x80000540, 0x04020004, - 0x59a8002b, 0x800000c2, 0x48026006, 0x497a6009, - 0x4a026203, 0x00000007, 0x1c01f000, 0x4933c857, - 0x0201f800, 0x00107021, 0x02020800, 0x0010032e, - 0x59300203, 0x82000580, 0x00000002, 0x0400078e, - 0x0201f800, 0x0010032e, 0x4a026203, 0x00000007, - 0x497a6006, 0x0201f000, 0x00020afd, 0x4a026203, - 0x00000007, 0x497a6006, 0x0201f000, 0x00020af8, - 0x59300415, 0x8c00051c, 0x02020000, 0x00020cad, - 0x59325809, 0x592c2010, 0x40080000, 0x80102480, - 0x59300016, 0x80102400, 0x48126016, 0x0201f000, - 0x00020cad, 0x8c040d0e, 0x0402000a, 0x4a026203, - 0x00000006, 0x0401f823, 0x59300028, 0x80000540, - 0x02020800, 0x00100b15, 0x0201f000, 0x00020af8, - 0x4a026203, 0x00000002, 0x1c01f000, 0x42000800, - 0x00000001, 0x0201f800, 0x00100b15, 0x82040580, - 0x00000001, 0x02000000, 0x00020cb4, 0x0401f7d8, - 0x59300415, 0x8c00051c, 0x04000006, 0x0201f800, - 0x0010089c, 0x02000000, 0x00020ca6, 0x1c01f000, - 0x59300012, 0x80000540, 0x04020005, 0x0201f800, - 0x0010089c, 0x02000000, 0x00020ca6, 0x1c01f000, - 0x492fc857, 0x480bc857, 0x8c08153e, 0x04000006, - 0x80081080, 0x80081000, 0x42000800, 0x00000009, - 0x0401f003, 0x42000800, 0x00000015, 0x480a580c, - 0x1c01f000, 0x83380580, 0x00000013, 0x04000005, - 0x83380580, 0x00000014, 0x02020800, 0x0010032e, - 0x59300415, 0x8c000516, 0x02000800, 0x0010032e, - 0x1c01f000, 0x0201f800, 0x0010032e, 0x59300009, - 0x80000540, 0x02020800, 0x0010032e, 0x1c01f000, - 0x59300415, 0x8c000516, 0x02000800, 0x0010032e, - 0x1c01f000, 0x4a026203, 0x00000004, 0x493a6403, - 0x42000800, 0x80002001, 0x0201f000, 0x00020b3e, - 0x4a026203, 0x00000003, 0x493a6403, 0x0201f800, - 0x00020172, 0x59325809, 0x592c040b, 0x8c00051e, - 0x04000012, 0x82000500, 0x000000c0, 0x82000580, - 0x00000080, 0x04000011, 0x59300415, 0x8c000512, - 0x0402000a, 0x8c000510, 0x04020008, 0x592c040d, - 0x80000540, 0x04020005, 0x82080d40, 0x80003065, - 0x0201f000, 0x00020b30, 0x82080d40, 0x80002065, - 0x0201f000, 0x00020b30, 0x82080d40, 0x80002042, + 0x59300415, 0x8c000516, 0x0402000e, 0x0201f000, + 0x00020afd, 0x59325809, 0x592c0c0b, 0x8c040d1a, + 0x04020005, 0x0201f800, 0x00020afd, 0x0201f000, + 0x00020b9d, 0x0201f800, 0x0010b3b6, 0x040007fa, + 0x1c01f000, 0x0201f800, 0x00106d71, 0x59325809, + 0x5932680a, 0x59340200, 0x8c00050e, 0x0400000e, + 0x592c040b, 0x82000500, 0x000000c0, 0x82000580, + 0x00000080, 0x04000005, 0x592c0010, 0x59301816, + 0x800c1c80, 0x480e6016, 0x4a026203, 0x00000002, + 0x0401f00d, 0x42028000, 0x00000004, 0x0401fbfa, + 0x59300006, 0x80000540, 0x04020004, 0x59a8002b, + 0x800000c2, 0x48026006, 0x497a6009, 0x4a026203, + 0x00000007, 0x1c01f000, 0x4933c857, 0x0201f800, + 0x00107226, 0x02020800, 0x0010032e, 0x59300203, + 0x82000580, 0x00000002, 0x0400078b, 0x0201f800, + 0x0010032e, 0x4a026203, 0x00000007, 0x497a6006, + 0x0201f000, 0x00020afd, 0x4a026203, 0x00000007, + 0x497a6006, 0x0201f000, 0x00020af8, 0x59300415, + 0x8c00051c, 0x02020000, 0x00020cad, 0x59325809, + 0x592c2010, 0x40080000, 0x80102480, 0x59300016, + 0x80102400, 0x48126016, 0x0201f000, 0x00020cad, + 0x8c040d0e, 0x0402000a, 0x4a026203, 0x00000006, + 0x0401f823, 0x59300028, 0x80000540, 0x02020800, + 0x00100b16, 0x0201f000, 0x00020af8, 0x4a026203, + 0x00000002, 0x1c01f000, 0x42000800, 0x00000001, + 0x0201f800, 0x00100b16, 0x82040580, 0x00000001, + 0x02000000, 0x00020cb4, 0x0401f7d8, 0x59300415, + 0x8c00051c, 0x04000006, 0x0201f800, 0x0010089a, + 0x02000000, 0x00020ca6, 0x1c01f000, 0x59300012, + 0x80000540, 0x04020005, 0x0201f800, 0x0010089a, + 0x02000000, 0x00020ca6, 0x1c01f000, 0x492fc857, + 0x480bc857, 0x8c08153e, 0x04000006, 0x80081080, + 0x80081000, 0x42000800, 0x00000009, 0x0401f003, + 0x42000800, 0x00000015, 0x480a580c, 0x1c01f000, + 0x83380580, 0x00000013, 0x04000005, 0x83380580, + 0x00000014, 0x02020800, 0x0010032e, 0x59300415, + 0x8c000516, 0x02000800, 0x0010032e, 0x1c01f000, + 0x0201f800, 0x0010032e, 0x59300009, 0x80000540, + 0x02020800, 0x0010032e, 0x1c01f000, 0x59300415, + 0x8c000516, 0x02000800, 0x0010032e, 0x1c01f000, + 0x4a026203, 0x00000004, 0x493a6403, 0x42000800, + 0x80002001, 0x0201f000, 0x00020b3e, 0x4a026203, + 0x00000003, 0x493a6403, 0x0201f800, 0x00020172, + 0x59325809, 0x592c040b, 0x8c00051e, 0x04000012, + 0x82000500, 0x000000c0, 0x82000580, 0x00000080, + 0x04000011, 0x59300415, 0x8c000512, 0x0402000a, + 0x8c000510, 0x04020008, 0x592c040d, 0x80000540, + 0x04020005, 0x82080d40, 0x80003065, 0x0201f000, + 0x00020b30, 0x82080d40, 0x80002065, 0x0201f000, + 0x00020b30, 0x82080d40, 0x80002042, 0x0201f000, + 0x00020b30, 0x4933c857, 0x493bc857, 0x83380480, + 0x00000044, 0x02021800, 0x0010032e, 0x83380480, + 0x00000041, 0x02001800, 0x0010032e, 0x0c01f001, + 0x0010ae2b, 0x0010ae3b, 0x0010ae50, 0x59325809, + 0x592c040b, 0x8c00051e, 0x0400001d, 0x82001d00, + 0x000000c0, 0x820c1d80, 0x000000c0, 0x04000018, + 0x4a026203, 0x00000001, 0x493a6403, 0x42000800, + 0x80002042, 0x0201f000, 0x00020b3e, 0x59325809, + 0x592c040b, 0x8c00051e, 0x0400000d, 0x82001d00, + 0x000000c0, 0x820c1d80, 0x000000c0, 0x04000008, + 0x4a026203, 0x00000001, 0x493a6403, 0x42000800, + 0x80002001, 0x0201f000, 0x00020b3e, 0x497a6009, + 0x497a6006, 0x42028000, 0x00000004, 0x0401f326, + 0x59325809, 0x592c040b, 0x8c00051e, 0x040007f8, + 0x82001d00, 0x000000c0, 0x820c1d80, 0x000000c0, + 0x040007f3, 0x4a026203, 0x00000003, 0x493a6403, + 0x0201f800, 0x00020172, 0x82080d40, 0x80002065, 0x0201f000, 0x00020b30, 0x4933c857, 0x493bc857, - 0x83380480, 0x00000044, 0x02021800, 0x0010032e, - 0x83380480, 0x00000041, 0x02001800, 0x0010032e, - 0x0c01f001, 0x0010ab24, 0x0010ab34, 0x0010ab49, - 0x59325809, 0x592c040b, 0x8c00051e, 0x0400001d, - 0x82001d00, 0x000000c0, 0x820c1d80, 0x000000c0, - 0x04000018, 0x4a026203, 0x00000001, 0x493a6403, - 0x42000800, 0x80002042, 0x0201f000, 0x00020b3e, - 0x59325809, 0x592c040b, 0x8c00051e, 0x0400000d, - 0x82001d00, 0x000000c0, 0x820c1d80, 0x000000c0, - 0x04000008, 0x4a026203, 0x00000001, 0x493a6403, - 0x42000800, 0x80002001, 0x0201f000, 0x00020b3e, - 0x497a6009, 0x497a6006, 0x42028000, 0x00000004, - 0x0401f31e, 0x59325809, 0x592c040b, 0x8c00051e, - 0x040007f8, 0x82001d00, 0x000000c0, 0x820c1d80, - 0x000000c0, 0x040007f3, 0x4a026203, 0x00000003, - 0x493a6403, 0x0201f800, 0x00020172, 0x82080d40, - 0x80002065, 0x0201f000, 0x00020b30, 0x4933c857, - 0x493bc857, 0x83380580, 0x00000085, 0x04000006, - 0x83380580, 0x00000088, 0x0400000a, 0x0201f800, - 0x0010032e, 0x4a026203, 0x00000009, 0x493a6403, - 0x42000800, 0x8000004b, 0x0201f000, 0x00020b3e, - 0x83300580, 0x0011120c, 0x02020800, 0x0010032e, - 0x4d1c0000, 0x813669c0, 0x04000004, 0x0201f800, - 0x0010b099, 0x04020053, 0x59cc1404, 0x41780000, - 0x0401f852, 0x0400001a, 0x59cc0204, 0x82001580, - 0x0000ffff, 0x04000004, 0x591c1402, 0x80080580, - 0x04020013, 0x591c0407, 0x82000500, 0x0000001f, - 0x82002580, 0x00000006, 0x04000007, 0x82002580, - 0x00000004, 0x04000031, 0x82002580, 0x00000011, - 0x04020007, 0x497a3a05, 0x42002000, 0x00000054, - 0x0201f800, 0x00107e13, 0x0401f036, 0x59240400, - 0x8c00050a, 0x04020004, 0x42023800, 0xffffffff, - 0x0401f7f6, 0x813669c0, 0x04020011, 0x59cc0001, - 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x4c1c0000, - 0x0201f800, 0x00105f68, 0x5c003800, 0x04020025, - 0x0201f800, 0x00101f66, 0x0201f800, 0x0010452c, - 0x04020020, 0x4926601c, 0x4936600a, 0x4a026403, - 0x00000087, 0x59cc1204, 0x82081580, 0x0000ffff, - 0x04020003, 0x4a026403, 0x00000086, 0x4d2c0000, - 0x0201f800, 0x0010b462, 0x0201f800, 0x00104c77, - 0x5c025800, 0x0401f00f, 0x591c0403, 0x82000580, - 0x00000038, 0x040007d1, 0x591c0203, 0x82000580, - 0x00000007, 0x040207d2, 0x4d300000, 0x411e6000, - 0x0201f800, 0x00107cbe, 0x5c026000, 0x0401f7cc, - 0x5c023800, 0x1c01f000, 0x4933c857, 0x480bc857, - 0x4c5c0000, 0x4000b800, 0x42002800, 0x00111264, - 0x41300000, 0x80140580, 0x0400001c, 0x58140203, - 0x82000580, 0x00000000, 0x04000018, 0x58140202, - 0x80080580, 0x04020015, 0x58141c07, 0x820c0580, - 0x00000005, 0x04000011, 0x8c5cbd00, 0x04000004, - 0x820c0580, 0x00000007, 0x0400000c, 0x820c0580, - 0x00000009, 0x04000031, 0x5930200a, 0x5814000a, - 0x800001c0, 0x0400000b, 0x801021c0, 0x04000003, - 0x80100580, 0x04000012, 0x82142c00, 0x0000002c, - 0x41540000, 0x80140480, 0x04021019, 0x0401f7dd, - 0x58140027, 0x801021c0, 0x04000005, 0x58102002, - 0x82102500, 0x00ffffff, 0x0401f7f2, 0x8c5cbd00, - 0x040207f2, 0x59302027, 0x0401f7ee, 0x40163800, - 0x8c5cbd00, 0x04000008, 0x4c080000, 0x4c140000, - 0x0201f800, 0x0010b3f1, 0x5c002800, 0x5c001000, - 0x040007e6, 0x81300540, 0x0401f00a, 0x8c5cbd00, - 0x04000008, 0x40080800, 0x42023800, 0xffffffff, - 0x0201f800, 0x00104c81, 0x040007f7, 0x80000580, - 0x5c00b800, 0x1c01f000, 0x58141808, 0x8c0c1d10, - 0x040207d6, 0x0401f7cd, 0x4933c857, 0x83300580, - 0x001111e0, 0x0402003e, 0x4a026203, 0x00000000, - 0x83380580, 0x00000013, 0x0402002d, 0x59300403, - 0x82000580, 0x00000092, 0x02020800, 0x0010032e, - 0x59a80052, 0x59325809, 0x812e59c0, 0x04000006, - 0x812c0580, 0x02020800, 0x0010032e, 0x592c0000, - 0x497a5800, 0x800001c0, 0x04000005, 0x48035052, - 0x0201f800, 0x00107c34, 0x0401f003, 0x497b5052, - 0x497b5053, 0x812e59c0, 0x04000020, 0x592c0205, - 0x82000580, 0x00000055, 0x02000000, 0x00100594, - 0x83380580, 0x00000013, 0x04020005, 0x4a025a07, - 0x00000000, 0x0201f000, 0x000203ef, 0x4a025a07, - 0x00000031, 0x4a025812, 0x00000004, 0x4a025813, - 0x000000ff, 0x0201f000, 0x000203ef, 0x83380580, - 0x00000027, 0x04000005, 0x83380580, 0x00000014, - 0x02020800, 0x0010032e, 0x493bc857, 0x0201f800, - 0x00106b8c, 0x0401f7ca, 0x1c01f000, 0x4933c857, - 0x83380580, 0x00000013, 0x0402000e, 0x59300403, - 0x4803c857, 0x82000c80, 0x00000085, 0x02001800, - 0x0010032e, 0x82000c80, 0x00000093, 0x02021800, - 0x0010032e, 0x82000480, 0x00000085, 0x0c01f019, - 0x83380580, 0x00000027, 0x04000005, 0x83380580, - 0x00000014, 0x02020000, 0x00107d3d, 0x493bc857, - 0x0201f800, 0x00106b8c, 0x59325809, 0x812e59c0, - 0x02000000, 0x00107cbe, 0x4a025a07, 0x00000031, + 0x83380580, 0x00000085, 0x04000006, 0x83380580, + 0x00000088, 0x0400000a, 0x0201f800, 0x0010032e, + 0x4a026203, 0x00000009, 0x493a6403, 0x42000800, + 0x8000004b, 0x0201f000, 0x00020b3e, 0x83300580, + 0x0011152c, 0x02020800, 0x0010032e, 0x4d1c0000, + 0x813669c0, 0x04000004, 0x0201f800, 0x0010b3b0, + 0x04020053, 0x59cc1404, 0x41780000, 0x0401f852, + 0x0400001a, 0x59cc0204, 0x82001580, 0x0000ffff, + 0x04000004, 0x591c1402, 0x80080580, 0x04020013, + 0x591c0407, 0x82000500, 0x0000001f, 0x82002580, + 0x00000006, 0x04000007, 0x82002580, 0x00000004, + 0x04000031, 0x82002580, 0x00000011, 0x04020007, + 0x497a3a05, 0x42002000, 0x00000054, 0x0201f800, + 0x0010800d, 0x0401f036, 0x59240400, 0x8c00050a, + 0x04020004, 0x42023800, 0xffffffff, 0x0401f7f6, + 0x813669c0, 0x04020011, 0x59cc0001, 0x59cc3800, + 0x821c3d00, 0x00ffffff, 0x4c1c0000, 0x0201f800, + 0x00106134, 0x5c003800, 0x04020025, 0x0201f800, + 0x00101fc9, 0x0201f800, 0x00104628, 0x04020020, + 0x4926601c, 0x4936600a, 0x4a026403, 0x00000087, + 0x59cc1204, 0x82081580, 0x0000ffff, 0x04020003, + 0x4a026403, 0x00000086, 0x4d2c0000, 0x0201f800, + 0x0010b78d, 0x0201f800, 0x00104d7c, 0x5c025800, + 0x0401f00f, 0x591c0403, 0x82000580, 0x00000038, + 0x040007d1, 0x591c0203, 0x82000580, 0x00000007, + 0x040207d2, 0x4d300000, 0x411e6000, 0x0201f800, + 0x00107eb4, 0x5c026000, 0x0401f7cc, 0x5c023800, + 0x1c01f000, 0x4933c857, 0x480bc857, 0x4c5c0000, + 0x4000b800, 0x42002800, 0x00111584, 0x41300000, + 0x80140580, 0x0400001f, 0x58140203, 0x82000580, + 0x00000000, 0x0400001b, 0x58140202, 0x80080580, + 0x04020018, 0x58141c07, 0x820c0580, 0x00000005, + 0x04000014, 0x8c5cbd00, 0x04000004, 0x820c0580, + 0x00000007, 0x0400000f, 0x820c0580, 0x00000009, + 0x04000039, 0x5930200a, 0x5814000a, 0x800001c0, + 0x0400000e, 0x82001d80, 0x0010e23c, 0x0400000b, + 0x801021c0, 0x04000003, 0x80100580, 0x04000012, + 0x82142c00, 0x0000002c, 0x41540000, 0x80140480, + 0x0402101e, 0x0401f7da, 0x58140027, 0x801021c0, + 0x04000005, 0x58102002, 0x82102500, 0x00ffffff, + 0x0401f7f2, 0x8c5cbd00, 0x040207f2, 0x59302027, + 0x0401f7ee, 0x40163800, 0x8c5cbd00, 0x04000008, + 0x4c080000, 0x4c140000, 0x0201f800, 0x0010b71c, + 0x5c002800, 0x5c001000, 0x040007e6, 0x591c000a, + 0x800001c0, 0x04020003, 0x5930000a, 0x4802380a, + 0x81300540, 0x0401f00a, 0x8c5cbd00, 0x04000008, + 0x40080800, 0x42023800, 0xffffffff, 0x0201f800, + 0x00104d86, 0x040007f2, 0x80000580, 0x5c00b800, + 0x1c01f000, 0x58141808, 0x8c0c1d10, 0x040207d1, + 0x0401f7c5, 0x4933c857, 0x83300580, 0x00111500, + 0x0402003e, 0x4a026203, 0x00000000, 0x83380580, + 0x00000013, 0x0402002d, 0x59300403, 0x82000580, + 0x00000092, 0x02020800, 0x0010032e, 0x59a80052, + 0x59325809, 0x812e59c0, 0x04000006, 0x812c0580, + 0x02020800, 0x0010032e, 0x592c0000, 0x497a5800, + 0x800001c0, 0x04000005, 0x48035052, 0x0201f800, + 0x00107e2a, 0x0401f003, 0x497b5052, 0x497b5053, + 0x812e59c0, 0x04000020, 0x592c0205, 0x82000580, + 0x00000055, 0x02000000, 0x00100594, 0x83380580, + 0x00000013, 0x04020005, 0x4a025a07, 0x00000000, + 0x0201f000, 0x000203ef, 0x4a025a07, 0x00000031, 0x4a025812, 0x00000004, 0x4a025813, 0x000000ff, - 0x0201f800, 0x000203ef, 0x0201f000, 0x00107cbe, - 0x0010ac92, 0x0010ac99, 0x0010ac99, 0x0010ac92, - 0x0010ac92, 0x0010ac92, 0x0010ac92, 0x0010ac92, - 0x0010ac92, 0x0010ac92, 0x0010ac92, 0x0010ac92, - 0x0010ac92, 0x0010ac94, 0x0201f800, 0x0010032e, - 0x59325809, 0x4a025a07, 0x00000000, 0x0201f800, - 0x000203ef, 0x0201f000, 0x00020b9d, 0x4933c857, - 0x42000000, 0x0010cc33, 0x0201f800, 0x0010bc88, - 0x0201f800, 0x0010b0e3, 0x497a6205, 0x42028000, - 0x0000000b, 0x0401f807, 0x4a026407, 0x00000006, - 0x4a026203, 0x00000007, 0x497a6006, 0x1c01f000, - 0x4933c857, 0x4943c857, 0x59300407, 0x82000580, - 0x00000007, 0x04020002, 0x1c01f000, 0x0201f800, - 0x00106c3c, 0x4df00000, 0x0201f800, 0x00109667, - 0x0400000a, 0x59300809, 0x58040000, 0x80001540, - 0x04000006, 0x49780800, 0x4d2c0000, 0x400a5800, - 0x0401f9a6, 0x5c025800, 0x0201f800, 0x00109330, - 0x82000c80, 0x0000000e, 0x02021800, 0x0010032e, - 0x0c01f001, 0x0010acec, 0x0010acf0, 0x0010acd7, - 0x0010acff, 0x0010ad13, 0x0010acd7, 0x0010acd7, - 0x0010acd7, 0x0010acd7, 0x0010acd7, 0x0010acd7, - 0x0010acd7, 0x0010acd7, 0x0010acd7, 0x4d400000, - 0x59300028, 0x80000540, 0x04000005, 0x41400800, - 0x0201f800, 0x00100b15, 0x40068000, 0x4d2c0000, - 0x59325809, 0x0201f800, 0x00109667, 0x04020983, - 0x4c5c0000, 0x5930b80a, 0x0201f800, 0x00107cbe, - 0x485e600a, 0x5c00b800, 0x5c025800, 0x5c028000, - 0x5c03e000, 0x02000000, 0x00106c29, 0x1c01f000, - 0x598c000f, 0x81300580, 0x04020004, 0x0201f800, - 0x00106f5c, 0x04020018, 0x0201f800, 0x0010fece, - 0x80c40040, 0x040007de, 0x0201f800, 0x00106b47, - 0x04000011, 0x0201f800, 0x0010032e, 0x0201f800, - 0x0010931e, 0x04020004, 0x0201f800, 0x00106f25, - 0x04020009, 0x0201f800, 0x0010fd55, 0x80c40040, - 0x040007cf, 0x0201f800, 0x00106b47, 0x02020800, - 0x0010032e, 0x59300203, 0x82000c80, 0x0000000e, - 0x02021800, 0x0010032e, 0x0c01f7b7, 0x0201f800, - 0x00100c75, 0x0401f7c2, 0x4933c857, 0x4d240000, - 0x4d440000, 0x4d340000, 0x59cc3800, 0x821c3d00, - 0x00ffffff, 0x59cc0007, 0x4c000000, 0x59cc0001, - 0x82000500, 0x00ffffff, 0x82000d80, 0x00fffffe, - 0x5c000000, 0x04020005, 0x801c0d80, 0x0402005d, - 0x42000000, 0x00fffffe, 0x0201f800, 0x00105f68, - 0x02000800, 0x0010497a, 0x04020056, 0x5930001c, - 0x4c000000, 0x0201f800, 0x00104971, 0x4926601c, - 0x5930000a, 0x4c000000, 0x59242c00, 0x8c142d0a, - 0x04020014, 0x81342d80, 0x04000003, 0x42002800, - 0x00000004, 0x58002403, 0x59340c03, 0x59341802, - 0x820c1d00, 0x00ffffff, 0x42003000, 0x00000005, - 0x59cc4008, 0x59cc3809, 0x9c2041c0, 0x9c1c39c0, - 0x42028000, 0x00000046, 0x41301000, 0x0401f941, - 0x4936600a, 0x83440d80, 0x000007fe, 0x04020016, - 0x42003000, 0x0000001a, 0x0201f800, 0x0010b412, - 0x42000000, 0x0010cc20, 0x0201f800, 0x0010bc88, + 0x0201f000, 0x000203ef, 0x83380580, 0x00000027, + 0x04000005, 0x83380580, 0x00000014, 0x02020800, + 0x0010032e, 0x493bc857, 0x0201f800, 0x00106d91, + 0x0401f7ca, 0x1c01f000, 0x4933c857, 0x83380580, + 0x00000013, 0x0402000e, 0x59300403, 0x4803c857, + 0x82000c80, 0x00000085, 0x02001800, 0x0010032e, + 0x82000c80, 0x00000093, 0x02021800, 0x0010032e, + 0x82000480, 0x00000085, 0x0c01f019, 0x83380580, + 0x00000027, 0x04000005, 0x83380580, 0x00000014, + 0x02020000, 0x00107f37, 0x493bc857, 0x0201f800, + 0x00106d91, 0x59325809, 0x812e59c0, 0x02000000, + 0x00107eb4, 0x4a025a07, 0x00000031, 0x4a025812, + 0x00000004, 0x4a025813, 0x000000ff, 0x0201f800, + 0x000203ef, 0x0201f000, 0x00107eb4, 0x0010afa1, + 0x0010afa8, 0x0010afa8, 0x0010afa1, 0x0010afa1, + 0x0010afa1, 0x0010afa1, 0x0010afa1, 0x0010afa1, + 0x0010afa1, 0x0010afa1, 0x0010afa1, 0x0010afa1, + 0x0010afa3, 0x0201f800, 0x0010032e, 0x59325809, + 0x4a025a07, 0x00000000, 0x0201f800, 0x000203ef, + 0x0201f000, 0x00020b9d, 0x4933c857, 0x42000000, + 0x0010cf33, 0x0201f800, 0x0010bfb3, 0x0201f800, + 0x0010b3fa, 0x497a6205, 0x42028000, 0x0000000b, + 0x0401f807, 0x4a026407, 0x00000006, 0x4a026203, + 0x00000007, 0x497a6006, 0x1c01f000, 0x4933c857, + 0x4943c857, 0x59300407, 0x82000580, 0x00000007, + 0x04020002, 0x1c01f000, 0x0201f800, 0x00106e41, + 0x4df00000, 0x0201f800, 0x0010989f, 0x0400000a, + 0x59300809, 0x58040000, 0x80001540, 0x04000006, + 0x49780800, 0x4d2c0000, 0x400a5800, 0x0401f9a6, + 0x5c025800, 0x0201f800, 0x00109564, 0x82000c80, + 0x0000000e, 0x02021800, 0x0010032e, 0x0c01f001, + 0x0010affb, 0x0010afff, 0x0010afe6, 0x0010b00e, + 0x0010b022, 0x0010afe6, 0x0010afe6, 0x0010afe6, + 0x0010afe6, 0x0010afe6, 0x0010afe6, 0x0010afe6, + 0x0010afe6, 0x0010afe6, 0x4d400000, 0x59300028, + 0x80000540, 0x04000005, 0x41400800, 0x0201f800, + 0x00100b16, 0x40068000, 0x4d2c0000, 0x59325809, + 0x0201f800, 0x0010989f, 0x04020983, 0x4c5c0000, + 0x5930b80a, 0x0201f800, 0x00107eb4, 0x485e600a, + 0x5c00b800, 0x5c025800, 0x5c028000, 0x5c03e000, + 0x02000000, 0x00106e2e, 0x1c01f000, 0x598c000f, + 0x81300580, 0x04020004, 0x0201f800, 0x00107161, + 0x04020018, 0x0201f800, 0x001101de, 0x80c40040, + 0x040007de, 0x0201f800, 0x00106d4c, 0x04000011, + 0x0201f800, 0x0010032e, 0x0201f800, 0x00109552, + 0x04020004, 0x0201f800, 0x0010712a, 0x04020009, + 0x0201f800, 0x00110065, 0x80c40040, 0x040007cf, + 0x0201f800, 0x00106d4c, 0x02020800, 0x0010032e, + 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, + 0x0010032e, 0x0c01f7b7, 0x0201f800, 0x00100c76, + 0x0401f7c2, 0x4933c857, 0x4d240000, 0x4d440000, + 0x4d340000, 0x59cc3800, 0x821c3d00, 0x00ffffff, + 0x59cc0007, 0x4c000000, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x82000d80, 0x00fffffe, 0x5c000000, + 0x04020005, 0x801c0d80, 0x0402005d, 0x42000000, + 0x00fffffe, 0x0201f800, 0x00106134, 0x02000800, + 0x00104a7c, 0x04020056, 0x5930001c, 0x4c000000, + 0x0201f800, 0x00104a73, 0x4926601c, 0x5930000a, + 0x4c000000, 0x59242c00, 0x8c142d0a, 0x04020014, + 0x81342d80, 0x04000003, 0x42002800, 0x00000004, + 0x58002403, 0x59340c03, 0x59341802, 0x820c1d00, + 0x00ffffff, 0x42003000, 0x00000005, 0x59cc4008, + 0x59cc3809, 0x9c2041c0, 0x9c1c39c0, 0x42028000, + 0x00000046, 0x41301000, 0x0401f941, 0x4936600a, + 0x83440d80, 0x000007fe, 0x04020016, 0x42003000, + 0x0000001a, 0x0201f800, 0x0010b73d, 0x42000000, + 0x0010cf20, 0x0201f800, 0x0010bfb3, 0x4d3c0000, + 0x4d400000, 0x42028000, 0x00000029, 0x0201f800, + 0x00101fb4, 0x42027800, 0x0000000a, 0x0201f800, + 0x0010200c, 0x5c028000, 0x5c027800, 0x0401f012, + 0x42003000, 0x0000000b, 0x0201f800, 0x0010b73d, + 0x42000000, 0x0010cf20, 0x0201f800, 0x0010bfb3, 0x4d3c0000, 0x4d400000, 0x42028000, 0x00000029, - 0x0201f800, 0x00101f51, 0x42027800, 0x0000000a, - 0x0201f800, 0x00101fa9, 0x5c028000, 0x5c027800, - 0x0401f012, 0x42003000, 0x0000000b, 0x0201f800, - 0x0010b412, 0x42000000, 0x0010cc20, 0x0201f800, - 0x0010bc88, 0x4d3c0000, 0x4d400000, 0x42028000, - 0x00000029, 0x417a7800, 0x0201f800, 0x0010fc72, - 0x5c028000, 0x5c027800, 0x5c000000, 0x4802600a, - 0x5c000000, 0x4802601c, 0x59cc0007, 0x83440d80, - 0x000007fe, 0x04020005, 0x42000000, 0x00fffffe, - 0x4a026c00, 0x00000707, 0x48026802, 0x80000580, - 0x5c026800, 0x5c028800, 0x5c024800, 0x1c01f000, - 0x4933c857, 0x4c040000, 0x59a8005a, 0x82000580, - 0x00000074, 0x04020040, 0x59cc0a08, 0x82040480, - 0x00000100, 0x04001033, 0x59cc0c08, 0x82040500, - 0x00008000, 0x04000035, 0x59a80013, 0x80000540, - 0x04020009, 0x5930100a, 0x58080212, 0x82000500, - 0x0000ff00, 0x04000004, 0x82040500, 0x00000800, - 0x0400002a, 0x59cc0c09, 0x80040840, 0x04001024, - 0x59a80a1b, 0x8c040d06, 0x04000004, 0x59cc0c0f, - 0x8c040d1e, 0x04020012, 0x59cc0a17, 0x800409c0, - 0x04020012, 0x59cc0a18, 0x82040480, 0x00000100, - 0x04001014, 0x59cc0c18, 0x800409c0, 0x0402000e, - 0x59cc0c19, 0x80040840, 0x04001011, 0x59cc0c1a, - 0x80040840, 0x04001011, 0x0401f018, 0x4a02621b, - 0x00000100, 0x0401f012, 0x4a02621b, 0x00000300, - 0x0401f00f, 0x4a02621b, 0x00000500, 0x0401f00c, - 0x4a02621b, 0x00000700, 0x0401f009, 0x4a02621b, - 0x00000900, 0x0401f006, 0x4a02621b, 0x00000f00, - 0x0401f003, 0x4a02621b, 0x00002d00, 0x82000540, - 0x00000001, 0x0401f002, 0x80000580, 0x5c000800, - 0x1c01f000, 0x59cc0407, 0x4803c857, 0x82000580, - 0x00000800, 0x04000003, 0x4a02621b, 0x00000000, - 0x1c01f000, 0x4933c857, 0x4c580000, 0x59cc000c, - 0x59340802, 0x82040d00, 0x00ffffff, 0x80040580, - 0x04020012, 0x83cc1400, 0x00000008, 0x4200b000, + 0x417a7800, 0x0201f800, 0x0010ff80, 0x5c028000, + 0x5c027800, 0x5c000000, 0x4802600a, 0x5c000000, + 0x4802601c, 0x59cc0007, 0x83440d80, 0x000007fe, + 0x04020005, 0x42000000, 0x00fffffe, 0x4a026c00, + 0x00000707, 0x48026802, 0x80000580, 0x5c026800, + 0x5c028800, 0x5c024800, 0x1c01f000, 0x4933c857, + 0x4c040000, 0x59a8005a, 0x82000580, 0x00000074, + 0x04020040, 0x59cc0a08, 0x82040480, 0x00000100, + 0x04001033, 0x59cc0c08, 0x82040500, 0x00008000, + 0x04000035, 0x59a80013, 0x80000540, 0x04020009, + 0x5930100a, 0x58080212, 0x82000500, 0x0000ff00, + 0x04000004, 0x82040500, 0x00000800, 0x0400002a, + 0x59cc0c09, 0x80040840, 0x04001024, 0x59a80a1b, + 0x8c040d06, 0x04000004, 0x59cc0c0f, 0x8c040d1e, + 0x04020012, 0x59cc0a17, 0x800409c0, 0x04020012, + 0x59cc0a18, 0x82040480, 0x00000100, 0x04001014, + 0x59cc0c18, 0x800409c0, 0x0402000e, 0x59cc0c19, + 0x80040840, 0x04001011, 0x59cc0c1a, 0x80040840, + 0x04001011, 0x0401f018, 0x4a02621b, 0x00000100, + 0x0401f012, 0x4a02621b, 0x00000300, 0x0401f00f, + 0x4a02621b, 0x00000500, 0x0401f00c, 0x4a02621b, + 0x00000700, 0x0401f009, 0x4a02621b, 0x00000900, + 0x0401f006, 0x4a02621b, 0x00000f00, 0x0401f003, + 0x4a02621b, 0x00002d00, 0x82000540, 0x00000001, + 0x0401f002, 0x80000580, 0x5c000800, 0x1c01f000, + 0x59cc0407, 0x4803c857, 0x82000580, 0x00000800, + 0x04000003, 0x4a02621b, 0x00000000, 0x1c01f000, + 0x4933c857, 0x4c580000, 0x59cc000c, 0x59340802, + 0x82040d00, 0x00ffffff, 0x80040580, 0x04020012, + 0x83cc1400, 0x00000008, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000006, 0x0201f800, 0x00108c57, + 0x04020009, 0x83cc1400, 0x0000000a, 0x4200b000, + 0x00000002, 0x83341c00, 0x00000008, 0x0201f800, + 0x00108c57, 0x5c00b000, 0x1c01f000, 0x4933c857, + 0x4c580000, 0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002, 0x83341c00, 0x00000006, 0x0201f800, - 0x00108a31, 0x04020009, 0x83cc1400, 0x0000000a, + 0x00108c57, 0x0402000c, 0x83cc1400, 0x0000000d, 0x4200b000, 0x00000002, 0x83341c00, 0x00000008, - 0x0201f800, 0x00108a31, 0x5c00b000, 0x1c01f000, - 0x4933c857, 0x4c580000, 0x83cc1400, 0x0000000b, - 0x4200b000, 0x00000002, 0x83341c00, 0x00000006, - 0x0201f800, 0x00108a31, 0x0402000c, 0x83cc1400, - 0x0000000d, 0x4200b000, 0x00000002, 0x83341c00, - 0x00000008, 0x0201f800, 0x00108a31, 0x04000014, - 0x4933c856, 0x4933c856, 0x4933c857, 0x59340009, - 0x4803c857, 0x5934000e, 0x4803c857, 0x59340008, - 0x4803c857, 0x5934000d, 0x4803c857, 0x59340007, - 0x4803c857, 0x5934000c, 0x4803c857, 0x59340006, - 0x4803c857, 0x5934000b, 0x4803c857, 0x5c00b000, - 0x1c01f000, 0x4933c857, 0x813261c0, 0x0400002d, - 0x83300d80, 0x0011120c, 0x0400002a, 0x8d3e7d06, - 0x04020028, 0x59300c07, 0x82040580, 0x00000001, - 0x0400000a, 0x82040580, 0x00000002, 0x04020021, - 0x59300226, 0x82000580, 0x00000001, 0x0402001d, - 0x59300c17, 0x0401f002, 0x59300c03, 0x82040580, - 0x00000039, 0x04000004, 0x82040580, 0x00000035, - 0x04020014, 0x4d300000, 0x4d1c0000, 0x59326027, - 0x4933c857, 0x0201f800, 0x00109acc, 0x02000800, - 0x0010032e, 0x591c001d, 0x497a381d, 0x591c0c15, - 0x84040d02, 0x48063c15, 0x5c023800, 0x5c026000, - 0x81300580, 0x02020800, 0x0010032e, 0x497a6027, - 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, - 0x4d3c0000, 0x42027800, 0x00000001, 0x0201f800, - 0x001044e6, 0x5c027800, 0x4c580000, 0x4200b000, - 0x00000002, 0x83a81c00, 0x00000002, 0x83cc1400, - 0x0000000b, 0x0201f800, 0x00108a31, 0x5c00b000, - 0x80000540, 0x1c01f000, 0x492fc857, 0x4943c857, - 0x59a8000c, 0x812c0480, 0x04001011, 0x59a8000a, - 0x812c0480, 0x0402100e, 0x592c0000, 0x80005d40, - 0x04000008, 0x497a5800, 0x49425a07, 0x4c2c0000, - 0x0201f800, 0x000203ef, 0x5c025800, 0x0401f7f7, - 0x49425a07, 0x0201f000, 0x000203ef, 0x1c01f000, - 0x42002000, 0x0000ffff, 0x5930100a, 0x800811c0, - 0x04000002, 0x58082403, 0x41301000, 0x0401f009, - 0x40682800, 0x406c3000, 0x41781000, 0x41442000, - 0x0401f004, 0x41781000, 0x42002000, 0x0000ffff, - 0x5c000000, 0x4c000000, 0x4803c857, 0x480bc857, - 0x4813c857, 0x492fc857, 0x4943c857, 0x4d2c0000, - 0x4c040000, 0x4c080000, 0x4c0c0000, 0x4c100000, - 0x4c140000, 0x4c180000, 0x4c1c0000, 0x4c200000, - 0x0201f800, 0x00100583, 0x02000800, 0x0010032e, - 0x5c004000, 0x5c003800, 0x5c003000, 0x5c002800, - 0x5c002000, 0x5c001800, 0x5c001000, 0x5c000800, - 0x4a025805, 0x0000010d, 0x800811c0, 0x04000017, - 0x83400580, 0x00000029, 0x04020010, 0x82180580, - 0x00000002, 0x0400000a, 0x82180580, 0x00000003, - 0x04000007, 0x82180580, 0x00000008, 0x04000004, - 0x82180580, 0x00000009, 0x04020004, 0x4a02580a, - 0xffffffff, 0x0401f002, 0x480a580a, 0x58080202, - 0x48025c14, 0x0401f005, 0x4a02580a, 0xffffffff, - 0x4a025c14, 0x0000ffff, 0x83400580, 0x00000046, - 0x04000002, 0x41782800, 0x480e580d, 0x4806580e, - 0x4822580f, 0x481e5810, 0x48165a08, 0x481a5c09, - 0x49425a09, 0x48125a07, 0x82100580, 0x0000ffff, - 0x04000014, 0x4d440000, 0x4d340000, 0x40128800, - 0x83440480, 0x000007f0, 0x04001004, 0x0201f800, - 0x0010497a, 0x0401f003, 0x0201f800, 0x0002034c, - 0x02020800, 0x0010032e, 0x59340002, 0x82000500, - 0x00ffffff, 0x48025813, 0x5c026800, 0x5c028800, - 0x497a5800, 0x497a5c05, 0x812000d0, 0x48025c11, - 0x0201f800, 0x0010b349, 0x5c025800, 0x1c01f000, - 0x5c000000, 0x4c000000, 0x4803c857, 0x480bc857, - 0x480fc857, 0x4813c857, 0x4817c857, 0x4d2c0000, + 0x0201f800, 0x00108c57, 0x04000014, 0x4933c856, + 0x4933c856, 0x4933c857, 0x59340009, 0x4803c857, + 0x5934000e, 0x4803c857, 0x59340008, 0x4803c857, + 0x5934000d, 0x4803c857, 0x59340007, 0x4803c857, + 0x5934000c, 0x4803c857, 0x59340006, 0x4803c857, + 0x5934000b, 0x4803c857, 0x5c00b000, 0x1c01f000, + 0x4933c857, 0x813261c0, 0x0400002d, 0x83300d80, + 0x0011152c, 0x0400002a, 0x8d3e7d06, 0x04020028, + 0x59300c07, 0x82040580, 0x00000001, 0x0400000a, + 0x82040580, 0x00000002, 0x04020021, 0x59300226, + 0x82000580, 0x00000001, 0x0402001d, 0x59300c17, + 0x0401f002, 0x59300c03, 0x82040580, 0x00000039, + 0x04000004, 0x82040580, 0x00000035, 0x04020014, + 0x4d300000, 0x4d1c0000, 0x59326027, 0x4933c857, + 0x0201f800, 0x00109d04, 0x02000800, 0x0010032e, + 0x591c001d, 0x497a381d, 0x591c0c15, 0x84040d02, + 0x48063c15, 0x5c023800, 0x5c026000, 0x81300580, + 0x02020800, 0x0010032e, 0x497a6027, 0x1c01f000, + 0x5c000000, 0x4c000000, 0x4803c857, 0x4d3c0000, + 0x42027800, 0x00000001, 0x0201f800, 0x001045df, + 0x5c027800, 0x4c580000, 0x4200b000, 0x00000002, + 0x83a81c00, 0x00000002, 0x83cc1400, 0x0000000b, + 0x0201f800, 0x00108c57, 0x5c00b000, 0x80000540, + 0x1c01f000, 0x492fc857, 0x4943c857, 0x59a8000c, + 0x812c0480, 0x04001011, 0x59a8000a, 0x812c0480, + 0x0402100e, 0x592c0000, 0x80005d40, 0x04000008, + 0x497a5800, 0x49425a07, 0x4c2c0000, 0x0201f800, + 0x000203ef, 0x5c025800, 0x0401f7f7, 0x49425a07, + 0x0201f000, 0x000203ef, 0x1c01f000, 0x42002000, + 0x0000ffff, 0x5930100a, 0x800811c0, 0x04000002, + 0x58082403, 0x41301000, 0x0401f009, 0x40682800, + 0x406c3000, 0x41781000, 0x41442000, 0x0401f004, + 0x41781000, 0x42002000, 0x0000ffff, 0x5c000000, + 0x4c000000, 0x4803c857, 0x480bc857, 0x4813c857, + 0x492fc857, 0x4943c857, 0x4d2c0000, 0x4c040000, 0x4c080000, 0x4c0c0000, 0x4c100000, 0x4c140000, - 0x0201f800, 0x00100583, 0x02000800, 0x0010032e, - 0x5c002800, 0x5c002000, 0x5c001800, 0x5c001000, - 0x04011000, 0x832c0400, 0x00000005, 0x4803c840, - 0x4a03c842, 0x00000010, 0x40000000, 0x040117ff, - 0x4a025805, 0x0000010d, 0x4a025a09, 0x00000049, - 0x480a5a0b, 0x480e5c0b, 0x48125a0c, 0x48165c0c, - 0x82080580, 0x00008014, 0x04020068, 0x820c0580, - 0x0000ffff, 0x04020065, 0x82100580, 0x00000006, - 0x04020062, 0x4d240000, 0x42024800, 0x0010ccd1, - 0x59240005, 0x5c024800, 0x0201f800, 0x00104fc6, - 0x04000009, 0x82000d00, 0x00ffff00, 0x04020006, - 0x82000c00, 0x00102057, 0x50040800, 0x80040910, - 0x48065a0d, 0x82000d00, 0x0000ffff, 0x48065c0d, - 0x80000120, 0x48025a0e, 0x59a8021b, 0x82001500, - 0x00003500, 0x480a5a0f, 0x8c000502, 0x0400001f, - 0x8c000506, 0x04000009, 0x82000d00, 0x0000000a, - 0x82040d80, 0x0000000a, 0x04020004, 0x4a025c0e, - 0x00000001, 0x0401f022, 0x8c00050a, 0x04000009, - 0x82000d00, 0x00000022, 0x82040d80, 0x00000022, - 0x04020004, 0x4a025c0e, 0x00000003, 0x0401f018, - 0x8c000508, 0x04000009, 0x82000d00, 0x00000012, - 0x82040d80, 0x00000012, 0x04020004, 0x4a025c0e, - 0x00000002, 0x0401f00e, 0x0201f800, 0x00104fc6, - 0x04020004, 0x4a025c0e, 0x00000004, 0x0401f008, - 0x8c000506, 0x04000004, 0x4a025c0e, 0x00000005, - 0x0401f003, 0x4a025c0e, 0x00000000, 0x59a8002a, - 0x48025c0f, 0x59a8002b, 0x48025a10, 0x59c40801, - 0x82040d00, 0x00018000, 0x82040580, 0x00000000, - 0x04020004, 0x4a025c10, 0x00000000, 0x0401f00f, - 0x82040580, 0x00008000, 0x04020004, 0x4a025c10, - 0x00000001, 0x0401f009, 0x82040580, 0x00010000, - 0x04020004, 0x4a025c10, 0x00000003, 0x0401f003, - 0x4a025c10, 0x00000004, 0x0401fbcb, 0x5c025800, - 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, - 0x04000003, 0x42018800, 0x00000000, 0x1c01f000, - 0x5930080a, 0x800409c0, 0x04000004, 0x58040403, - 0x81440580, 0x1c01f000, 0x82000540, 0x00000001, - 0x0401f7fd, 0x4933c857, 0x4c040000, 0x59300403, - 0x82000d80, 0x0000001e, 0x04020016, 0x800000d0, - 0x59300a17, 0x82040d00, 0x000000ff, 0x80040540, - 0x4803c857, 0x48026417, 0x4a026403, 0x00000085, - 0x4a026203, 0x00000009, 0x4a026407, 0x00000005, - 0x4a026226, 0x00000004, 0x59a8002b, 0x48026006, - 0x42000800, 0x8000004b, 0x0201f800, 0x00020b3e, - 0x5c000800, 0x1c01f000, 0x4933c857, 0x40000000, - 0x40000000, 0x1c01f000, 0x59300415, 0x4933c857, - 0x4803c857, 0x8c000518, 0x04000009, 0x8c000512, - 0x02020000, 0x001098a4, 0x0401f929, 0x0201f800, - 0x00020afd, 0x0201f800, 0x00020b9d, 0x1c01f000, - 0x591c0407, 0x4803c857, 0x82000c80, 0x00000009, - 0x0402100b, 0x0c01f001, 0x0010afcf, 0x0010afcf, - 0x0010afcf, 0x0010afd1, 0x0010afcf, 0x0010afd1, - 0x0010afd1, 0x0010afcf, 0x0010afd1, 0x80000580, - 0x1c01f000, 0x82000540, 0x00000001, 0x1c01f000, - 0x591c0407, 0x82000500, 0x0000001f, 0x82000580, - 0x00000006, 0x0400000e, 0x4803c857, 0x4a026403, - 0x0000003b, 0x4a02641b, 0x00000009, 0x4a02621b, - 0x00002a00, 0x4a026203, 0x00000001, 0x42000800, - 0x80000040, 0x0201f000, 0x00020b3e, 0x4803c856, - 0x4c040000, 0x4c140000, 0x4d300000, 0x411e6000, - 0x0401f8f7, 0x497a6205, 0x59300415, 0x4803c857, - 0x82000500, 0xffffadff, 0x48026415, 0x497a6405, - 0x5c026000, 0x0201f800, 0x00100583, 0x02000800, - 0x0010032e, 0x5c002800, 0x5c000800, 0x4a025805, - 0x0000010d, 0x497a5800, 0x497a5c05, 0x4a025a09, - 0x00000045, 0x491e580a, 0x59300402, 0x48025c08, - 0x5930041a, 0x48025c0c, 0x591c0415, 0x84000556, - 0x48023c15, 0x591c180a, 0x580c0403, 0x48025a07, - 0x580c0002, 0x82000500, 0x00ffffff, 0x48025813, - 0x59cc0404, 0x48025c14, 0x497a5a08, 0x4816580b, - 0x48065a0c, 0x580c0013, 0x82000500, 0xff000000, - 0x80000120, 0x48025c11, 0x0401fb2f, 0x493a6403, - 0x4d400000, 0x42028000, 0x00000045, 0x591c0202, - 0x4c000000, 0x4d300000, 0x411e6000, 0x0401fc89, - 0x5c026000, 0x5c000000, 0x48023a02, 0x5c028000, - 0x491e6027, 0x4932381d, 0x4a023c07, 0x00000006, - 0x4a023a03, 0x00000007, 0x497a3806, 0x497a3a05, - 0x1c01f000, 0x4933c857, 0x83380580, 0x00000013, - 0x0402000b, 0x59300403, 0x4803c857, 0x82000d80, - 0x00000085, 0x0400002b, 0x82000d80, 0x0000008b, - 0x04000028, 0x0201f800, 0x0010032e, 0x83380580, - 0x00000027, 0x0402000c, 0x0201f800, 0x00106b8c, - 0x4d2c0000, 0x4d400000, 0x59325809, 0x42028000, - 0x00000004, 0x0401fe1d, 0x5c028000, 0x5c025800, - 0x1c01f000, 0x83380580, 0x00000014, 0x040007f3, - 0x83380580, 0x00000089, 0x04000005, 0x83380580, - 0x0000008a, 0x02020000, 0x00107d3d, 0x0201f800, - 0x00107021, 0x02020000, 0x00107d3d, 0x59300a03, - 0x82040580, 0x0000000a, 0x04000009, 0x82040580, - 0x0000000c, 0x04000006, 0x0201f800, 0x0010032e, - 0x4a026203, 0x0000000a, 0x1c01f000, 0x83380480, - 0x00000093, 0x0402100c, 0x83380480, 0x00000085, - 0x04001009, 0x83380580, 0x00000089, 0x0400000a, - 0x83380580, 0x0000008a, 0x04000024, 0x0201f800, - 0x0010032e, 0x493bc857, 0x4933c857, 0x0201f000, - 0x00107d3d, 0x4933c857, 0x4c340000, 0x41306800, - 0x0201f800, 0x00107cfe, 0x04000013, 0x4a026203, - 0x00000001, 0x4a026403, 0x0000001e, 0x59cc0c07, - 0x4806641a, 0x59cc0a07, 0x4806621a, 0x5834080a, - 0x4806600a, 0x5834081c, 0x4806601c, 0x4a026407, - 0x00000004, 0x42000800, 0x80000040, 0x0201f800, - 0x00020b3e, 0x40366000, 0x0201f800, 0x00020b9d, - 0x5c006800, 0x1c01f000, 0x4933c857, 0x0201f000, - 0x00020b9d, 0x5930080a, 0x58040200, 0x8c00051a, - 0x02020800, 0x001003f5, 0x1c01f000, 0x0201f800, - 0x00104842, 0x0400001e, 0x4a026203, 0x00000002, - 0x59300415, 0x84000558, 0x48026415, 0x8c000512, - 0x04000004, 0x59a8002c, 0x48026205, 0x0401f007, - 0x59a8082c, 0x59a8002a, 0x80040400, 0x82000400, - 0x0000001e, 0x48026205, 0x5930000a, 0x82000c00, - 0x00000011, 0x50040000, 0x80000540, 0x04000004, - 0x82000c00, 0x00000000, 0x0401f7fb, 0x45300800, - 0x497a6000, 0x82000540, 0x00000001, 0x1c01f000, - 0x82100500, 0xfffffeef, 0x0402001c, 0x4d2c0000, - 0x4937c857, 0x59340811, 0x83341400, 0x00000011, - 0x800409c0, 0x0400000e, 0x40040000, 0x81300580, - 0x04000005, 0x82041400, 0x00000000, 0x58040800, - 0x0401f7f8, 0x59300800, 0x497a6000, 0x44041000, - 0x0201f800, 0x00020afd, 0x0401f002, 0x4933c857, - 0x5c025800, 0x492e6009, 0x0201f800, 0x00020afd, - 0x0201f000, 0x00020b9d, 0x492fc857, 0x4a025a07, - 0x00000006, 0x0201f000, 0x000203ef, 0x4c340000, - 0x5930000a, 0x800001c0, 0x04000011, 0x82006c00, - 0x00000011, 0x50340000, 0x80000540, 0x0400000a, - 0x81300580, 0x04000005, 0x50340000, 0x82006c00, - 0x00000000, 0x0401f7f8, 0x59300000, 0x44006800, - 0x497a6000, 0x5c006800, 0x1c01f000, 0x59300c07, - 0x82040580, 0x00000005, 0x040007fb, 0x82040580, - 0x00000011, 0x040007f8, 0x82040580, 0x00000006, - 0x040007f5, 0x82040580, 0x00000001, 0x040007f2, - 0x0201f800, 0x0010032e, 0x4933c857, 0x4c080000, - 0x4c0c0000, 0x4c580000, 0x59a81018, 0x59cc1807, - 0x820c1d00, 0x00ffffff, 0x800c0110, 0x80083580, - 0x04020014, 0x83cc1400, 0x00000008, 0x4200b000, - 0x00000002, 0x5930000a, 0x82001c00, 0x00000006, - 0x0201f800, 0x00108a31, 0x0402000a, 0x83cc1400, - 0x0000000a, 0x4200b000, 0x00000002, 0x5930000a, - 0x82001c00, 0x00000008, 0x0201f800, 0x00108a31, - 0x5c00b000, 0x5c001800, 0x5c001000, 0x1c01f000, - 0x4933c856, 0x493a6403, 0x0201f800, 0x00104122, - 0x0201f000, 0x00101df2, 0x493bc857, 0x4d2c0000, - 0x0201f800, 0x00100583, 0x02000800, 0x0010032e, - 0x832cac00, 0x00000006, 0x4c580000, 0x4c540000, - 0x4200b000, 0x00000006, 0x4578a800, 0x8054a800, - 0x8058b040, 0x040207fd, 0x83380580, 0x00000046, - 0x04020004, 0x4a025805, 0x00000144, 0x0401f008, - 0x4a025805, 0x00000146, 0x83380580, 0x00000041, - 0x04000003, 0x4a025a07, 0x00000001, 0x59cc0007, - 0x82000500, 0xff000000, 0x80000110, 0x59cc1008, - 0x82081500, 0xff000000, 0x80081540, 0x480a580b, - 0x83380580, 0x00000046, 0x04020006, 0x59cc0007, - 0x82000500, 0x00ffffff, 0x4802580c, 0x0401f005, - 0x59cc0008, 0x82000500, 0x00ffffff, 0x4802580c, - 0x83380580, 0x00000046, 0x04020004, 0x83cc1400, - 0x00000009, 0x0401f003, 0x83cc1400, 0x0000000d, - 0x50080000, 0x9c0001c0, 0x4802580d, 0x80081000, - 0x50080000, 0x9c0001c0, 0x4802580e, 0x83380580, - 0x00000046, 0x04020008, 0x59cc000b, 0x9c0001c0, - 0x4802580f, 0x59cc000c, 0x9c0001c0, 0x48025810, - 0x0401f007, 0x59cc000f, 0x9c0001c0, 0x4802580f, - 0x59cc0010, 0x9c0001c0, 0x48025810, 0x83380580, - 0x00000046, 0x04020004, 0x83cc1400, 0x00000011, - 0x0401f003, 0x83cc1400, 0x00000015, 0x412c3000, - 0x82183400, 0x00000011, 0x4200b000, 0x00000004, - 0x50080000, 0x9c0001c0, 0x44003000, 0x80081000, - 0x80183000, 0x8058b040, 0x040207fa, 0x5c00a800, - 0x5c00b000, 0x0201f800, 0x000203ef, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x492fc857, 0x5930080a, - 0x58040200, 0x8c00051e, 0x04000004, 0x592c0209, - 0x84000558, 0x48025a09, 0x1c01f000, 0x59e0180f, - 0x599c0413, 0x800c1000, 0x80080580, 0x04020002, - 0x41781000, 0x59e00010, 0x59e00810, 0x80040d80, - 0x040207fd, 0x80080580, 0x0400000b, 0x4c080000, - 0x599c0814, 0x599c1015, 0x800c00cc, 0x80040c00, - 0x82081440, 0x00000000, 0x5c001800, 0x82000540, - 0x00000001, 0x4803c857, 0x1c01f000, 0x59300203, - 0x4933c857, 0x4937c857, 0x493bc857, 0x4803c857, - 0x82003480, 0x0000000e, 0x02021800, 0x0010032e, - 0x0c01f001, 0x0010b1d3, 0x0010b2f6, 0x0010b1d3, - 0x0010b1d3, 0x0010b1d3, 0x0010b1d3, 0x0010b1d3, - 0x0010b250, 0x0010b1d5, 0x0010b1d3, 0x0010b1d3, - 0x0010b1d3, 0x0010b1d3, 0x0010b1d3, 0x0201f800, - 0x0010032e, 0x83380580, 0x0000004c, 0x02020800, - 0x0010032e, 0x0201f800, 0x00104856, 0x04020023, - 0x59a80a1b, 0x5932481c, 0x59240200, 0x82000500, - 0x000000e0, 0x82000580, 0x00000080, 0x0400001b, - 0x8c040d12, 0x04000032, 0x59cc0806, 0x82040d00, - 0xff000000, 0x82040580, 0x03000000, 0x04000020, - 0x82040580, 0x50000000, 0x04000005, 0x82040580, - 0x52000000, 0x02020000, 0x00020b9d, 0x813669c0, - 0x04000007, 0x497a6027, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010fc72, 0x5c027800, 0x4a026403, - 0x00000001, 0x0401f014, 0x59cc0806, 0x82040d00, - 0xff000000, 0x82040580, 0x03000000, 0x04000008, - 0x82040580, 0x50000000, 0x04000005, 0x82040580, - 0x52000000, 0x02020000, 0x00020b9d, 0x4a026403, - 0x00000009, 0x4a02641b, 0x00000009, 0x4a02621b, - 0x00000000, 0x4a026407, 0x00000004, 0x4a026203, - 0x00000001, 0x0201f000, 0x00106b17, 0x59240400, - 0x8c00050a, 0x04020020, 0x59cc0806, 0x4807c857, - 0x82040d00, 0xff000000, 0x82040580, 0x03000000, - 0x04000013, 0x82040580, 0x20000000, 0x04000010, - 0x82040580, 0x21000000, 0x0400000d, 0x82040580, - 0x24000000, 0x0400000a, 0x82040580, 0x50000000, - 0x04000007, 0x82040580, 0x52000000, 0x04000004, - 0x82040580, 0x05000000, 0x0402000a, 0x9c0431c0, - 0x42028000, 0x00000046, 0x42002800, 0x00000001, - 0x0401fc44, 0x0401f91c, 0x02000800, 0x0010032e, - 0x42002000, 0x00000051, 0x0201f800, 0x00107e13, - 0x59cc0000, 0x82000500, 0x00ffffff, 0x82000580, - 0x00ffffff, 0x04000005, 0x4a026203, 0x00000007, - 0x493a6403, 0x1c01f000, 0x59325818, 0x812e59c0, - 0x02020800, 0x0010059d, 0x0201f000, 0x00020b9d, - 0x4d2c0000, 0x4c580000, 0x4c500000, 0x4c540000, - 0x41385000, 0x83380580, 0x00000054, 0x02020800, - 0x0010032e, 0x59325809, 0x592c0c0c, 0x82040d00, - 0x0000e000, 0x82040580, 0x00002000, 0x04020081, - 0x59300818, 0x800409c0, 0x04000016, 0x58041405, - 0x41cca800, 0x8204a400, 0x00000006, 0x82080480, - 0x00000010, 0x04021005, 0x4008b000, 0x0201f800, - 0x0010bd5b, 0x0401f00b, 0x40001000, 0x4200b000, - 0x0000000f, 0x0201f800, 0x0010bd5b, 0x58040801, - 0x800409c0, 0x040207f0, 0x0201f800, 0x0010032e, - 0x813669c0, 0x04000067, 0x59344c00, 0x592c0c0a, - 0x4807c857, 0x4827c857, 0x82040d00, 0x000000ff, - 0x82040580, 0x00000003, 0x0400002a, 0x82040580, - 0x00000005, 0x04000033, 0x82040580, 0x00000020, - 0x0400003f, 0x82040580, 0x00000052, 0x0400004b, - 0x82040580, 0x00000050, 0x0400004b, 0x82040580, - 0x00000021, 0x04000004, 0x82040580, 0x00000024, - 0x0402004c, 0x82240500, 0x0000ff00, 0x82000580, - 0x00000700, 0x04000008, 0x42000800, 0x00000009, - 0x0201f800, 0x001044f1, 0x42005000, 0x0000000c, - 0x0401f040, 0x4a025a07, 0x00000031, 0x4a02580e, - 0x00000009, 0x59340400, 0x4802580f, 0x0201f800, - 0x000203ef, 0x0201f800, 0x00107cbe, 0x0401f046, - 0x0201f800, 0x001041e4, 0x41780800, 0x0201f800, - 0x001045e8, 0x42000800, 0x00000003, 0x0201f800, - 0x001044f1, 0x42005000, 0x00000008, 0x0401f029, - 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x4c1c0000, - 0x0201f800, 0x00101f66, 0x5c003800, 0x04020021, - 0x59cc0007, 0x0201f800, 0x0010620a, 0x0402001d, - 0x0201f800, 0x001041e4, 0x0401f01a, 0x82240500, - 0x0000ff00, 0x82000580, 0x00000700, 0x040007d6, - 0x82240500, 0x000000ff, 0x82000580, 0x00000009, - 0x040007d1, 0x0201f800, 0x00104652, 0x42005000, - 0x0000000a, 0x0401f00b, 0x42005000, 0x0000000e, - 0x0401f003, 0x42005000, 0x00000010, 0x82240500, - 0x0000ff00, 0x82000580, 0x00000700, 0x040007c2, - 0x482a6403, 0x4a026203, 0x00000001, 0x592c000e, - 0x48026012, 0x497a6014, 0x59a8002b, 0x48026006, - 0x417a7800, 0x0201f800, 0x00106b17, 0x59325818, - 0x812e59c0, 0x04000004, 0x0201f800, 0x0010059d, - 0x497a6018, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x5c025800, 0x1c01f000, 0x4d2c0000, 0x59325809, - 0x83380580, 0x00000013, 0x0402002a, 0x492fc857, - 0x59300c03, 0x82040580, 0x00000054, 0x0400001e, - 0x82040580, 0x00000010, 0x04000018, 0x82040580, - 0x0000000e, 0x04000015, 0x82040580, 0x00000008, - 0x0400000d, 0x82040580, 0x0000000c, 0x0400000a, - 0x82040580, 0x0000000a, 0x02020800, 0x0010032e, - 0x42000800, 0x00000006, 0x0201f800, 0x001044f1, - 0x0401f009, 0x42000800, 0x00000004, 0x0201f800, - 0x001044f1, 0x0401f004, 0x59340200, 0x8400051a, - 0x48026a00, 0x4a025a07, 0x00000000, 0x0201f800, - 0x000203ef, 0x0201f800, 0x00020b9d, 0x0401f024, - 0x83380580, 0x00000027, 0x0400000f, 0x83380580, - 0x00000014, 0x02020800, 0x0010032e, 0x492fc857, - 0x0201f800, 0x00106b8c, 0x42028000, 0x00000031, - 0x42000800, 0x00000004, 0x42001000, 0x000000ff, - 0x0401f00a, 0x492fc857, 0x0201f800, 0x00106b8c, - 0x42028000, 0x00000031, 0x42000800, 0x00000004, - 0x42001000, 0x00000010, 0x49425a07, 0x4806580e, - 0x480a580f, 0x0201f800, 0x000203ef, 0x0201f800, - 0x00104bb9, 0x0201f800, 0x00107cbe, 0x5c025800, - 0x1c01f000, 0x492fc857, 0x42007000, 0x00020cf0, - 0x58380806, 0x492c7006, 0x800409c0, 0x04020004, - 0x492c7007, 0x0201f000, 0x00020026, 0x492c0800, - 0x1c01f000, 0x4d2c0000, 0x4c580000, 0x4c500000, - 0x4c540000, 0x4933c857, 0x4937c857, 0x59cc0806, - 0x4807c857, 0x82040d00, 0xff000000, 0x82040580, - 0x03000000, 0x0400000d, 0x82040580, 0x05000000, - 0x0400000a, 0x82040580, 0x21000000, 0x04000032, - 0x82040580, 0x24000000, 0x0400002f, 0x82040580, - 0x20000000, 0x04020031, 0x0201f800, 0x00100583, - 0x0400002e, 0x492fc857, 0x492e6018, 0x59a8b05a, - 0x8258b400, 0x0000001b, 0x8258b500, 0xfffffffc, - 0x8058b104, 0x485a5c05, 0x412c7800, 0x41cca000, - 0x82580480, 0x00000010, 0x04021006, 0x832cac00, - 0x00000006, 0x0201f800, 0x0010bd5b, 0x0401f016, - 0x40580800, 0x4200b000, 0x0000000f, 0x832cac00, - 0x00000006, 0x0201f800, 0x0010bd5b, 0x8204b480, - 0x0000000f, 0x0201f800, 0x00100583, 0x04000004, - 0x492c7801, 0x412c7800, 0x0401f7ea, 0x59325818, - 0x0201f800, 0x0010059d, 0x497a6018, 0x80000580, - 0x0401f006, 0x59340200, 0x84000554, 0x48026a00, - 0x82000540, 0x00000001, 0x5c00a800, 0x5c00a000, - 0x5c00b000, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x492fc857, 0x4d2c0000, 0x59300a03, 0x82040580, - 0x00000007, 0x04000037, 0x82040580, 0x00000001, - 0x02020800, 0x0010032e, 0x0201f800, 0x00106c3c, - 0x4df00000, 0x598c000f, 0x81300580, 0x04020016, - 0x59300004, 0x8c000520, 0x04000004, 0x84000520, - 0x48026004, 0x0401f016, 0x42001000, 0x0010cb5b, - 0x50081000, 0x58080002, 0x82000580, 0x00000100, - 0x04000006, 0x5808000b, 0x81300580, 0x02020800, - 0x0010032e, 0x0401f00a, 0x0201f800, 0x00106f5c, - 0x04020021, 0x59300004, 0x8c000520, 0x04000004, - 0x84000520, 0x48026004, 0x0401f004, 0x0201f800, - 0x0010fece, 0x80c40040, 0x5c03e000, 0x02000800, - 0x00106c29, 0x0201f800, 0x00109667, 0x02000800, - 0x0010032e, 0x59325809, 0x4a025a07, 0x00000005, - 0x0201f800, 0x000203ef, 0x0201f800, 0x00104bb9, - 0x59325818, 0x812e59c0, 0x02020800, 0x0010059d, - 0x0201f800, 0x00107cbe, 0x80000580, 0x5c025800, - 0x1c01f000, 0x5c03e000, 0x02000800, 0x00106c29, - 0x59300c07, 0x82040580, 0x00000011, 0x040007b7, - 0x0401f7f7, 0x4c040000, 0x59340200, 0x4803c857, - 0x8c00051c, 0x04000009, 0x59cc0805, 0x591c001a, - 0x4803c857, 0x80040580, 0x04000004, 0x80000580, - 0x4803c856, 0x0401f003, 0x82000540, 0x00000001, - 0x5c000800, 0x1c01f000, 0x4c000000, 0x4c0c0000, - 0x4c100000, 0x42001800, 0x0000ffff, 0x42002000, - 0x00000004, 0x0401f013, 0x4c000000, 0x4c0c0000, - 0x4c100000, 0x5930200a, 0x58101c03, 0x42002000, - 0x00000004, 0x0401f00b, 0x4c000000, 0x4c0c0000, - 0x4c100000, 0x5930200a, 0x801021c0, 0x02000800, - 0x0010032e, 0x58101c03, 0x42002000, 0x00000007, - 0x480fc857, 0x4813c857, 0x481bc857, 0x0201f800, - 0x00101f51, 0x0201f800, 0x00103931, 0x5c002000, - 0x5c001800, 0x5c000000, 0x1c01f000, 0x8d0e1d20, - 0x0400000c, 0x4d400000, 0x4d200000, 0x42024000, - 0x000000ff, 0x850e1d44, 0x42028000, 0x0000002a, - 0x0201f800, 0x0010ae89, 0x5c024000, 0x5c028000, - 0x1c01f000, 0x59a8021b, 0x8c000508, 0x04000005, - 0x599c0017, 0x8c00050a, 0x04020002, 0x1c01f000, - 0x82000540, 0x00000001, 0x1c01f000, 0x59300429, - 0x84000540, 0x48026429, 0x1c01f000, 0x4c640000, - 0x0201f800, 0x00109a94, 0x59300203, 0x82000580, - 0x00000008, 0x04020015, 0x4200c800, 0x00000032, - 0x42000000, 0x20000000, 0x41300800, 0x0201f800, - 0x001008c9, 0x0400000d, 0x59300203, 0x82000580, - 0x00000008, 0x04020009, 0x42000000, 0x0000001e, - 0x80000040, 0x040207ff, 0x8064c840, 0x040207f1, - 0x0201f800, 0x0010032e, 0x0201f800, 0x00109aac, - 0x5c00c800, 0x1c01f000, 0x0201f800, 0x00100583, - 0x02000800, 0x0010032e, 0x59340403, 0x49265802, - 0x49365803, 0x4a025a05, 0x00000055, 0x48025c07, - 0x4a025c08, 0x00001000, 0x59340802, 0x82040d00, - 0x00ffffff, 0x59300403, 0x82000580, 0x00000086, - 0x42000000, 0x85000000, 0x04020003, 0x42000000, - 0x84000000, 0x80040540, 0x4802580a, 0x59240005, - 0x4802580b, 0x42000000, 0x00990000, 0x59300c07, - 0x82040d80, 0x00000005, 0x04000002, 0x8400052e, - 0x4802580c, 0x497a580d, 0x59cc0004, 0x4802580e, - 0x497a580f, 0x42000800, 0x00030300, 0x59300403, - 0x82000580, 0x00000086, 0x04020006, 0x59cc0004, - 0x48025811, 0x4a025812, 0x0000ffff, 0x41780800, - 0x48065810, 0x1c01f000, 0x492fc857, 0x59a82852, - 0x801429c0, 0x0400005f, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x4d2c0000, 0x4d300000, 0x42026000, - 0x001111e0, 0x592c0c07, 0x592c100a, 0x82081500, - 0x00ffffff, 0x592c180b, 0x592c200e, 0x40165800, - 0x4014c000, 0x4014c800, 0x592c0205, 0x82000580, - 0x00000155, 0x0402003e, 0x592c0407, 0x80040580, - 0x0402003b, 0x592c000a, 0x82000500, 0x00ffffff, - 0x80080580, 0x04020036, 0x592c000b, 0x82000500, - 0x00ffffff, 0x800c0580, 0x04020031, 0x592c000e, - 0x80100580, 0x0402002e, 0x4c040000, 0x4c080000, - 0x4c0c0000, 0x4c100000, 0x40640000, 0x812c0580, - 0x0402001b, 0x59300203, 0x82000580, 0x00000000, - 0x04000013, 0x59300009, 0x800001c0, 0x04000010, - 0x0201f800, 0x00106c3c, 0x4df00000, 0x0201f800, - 0x00106b26, 0x0201f800, 0x0010fe38, 0x80c40040, - 0x04020003, 0x4a026203, 0x00000000, 0x5c03e000, - 0x02000800, 0x00106c29, 0x497a6009, 0x592cc800, - 0x4064c000, 0x4064b800, 0x0401f003, 0x592cb800, - 0x485cc000, 0x4a025a07, 0x00000005, 0x0201f800, - 0x000203ef, 0x405e5800, 0x5c002000, 0x5c001800, - 0x5c001000, 0x5c000800, 0x0401f003, 0x412cc000, - 0x592e5800, 0x812e59c0, 0x040207bc, 0x48675052, - 0x48635053, 0x0201f800, 0x00107c34, 0x5c026000, - 0x5c025800, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x1c01f000, 0x42000800, 0x0000000b, 0x0401f006, - 0x42000800, 0x00000004, 0x0401f003, 0x42000800, - 0x00000001, 0x4d2c0000, 0x59325809, 0x812e59c0, - 0x04000012, 0x592c0205, 0x82000500, 0x000000ff, - 0x82000580, 0x0000000e, 0x0402000c, 0x592c0000, - 0x48026009, 0x497a5800, 0x48065a09, 0x0201f800, - 0x00105b84, 0x04000003, 0x0401fe37, 0x0401f003, - 0x0201f800, 0x000203ef, 0x5c025800, 0x1c01f000, - 0x42001000, 0x00001000, 0x80081040, 0x04000010, - 0x0201f800, 0x0010bdab, 0x040007fc, 0x42001000, - 0x00007b00, 0x5808081c, 0x4a030000, 0x00000000, - 0x82040d00, 0xffff0000, 0x82040580, 0x84320000, - 0x04020003, 0x4a035078, 0x8000001b, 0x1c01f000, - 0x4d340000, 0x4d440000, 0x599c0018, 0x82000500, - 0xffffffcf, 0x82000540, 0x00000010, 0x48033818, - 0x599c0019, 0x82000500, 0xffff1fff, 0x82000540, - 0x00006000, 0x48033819, 0x42003000, 0x0000fc0e, - 0x417a8800, 0x0201f800, 0x00104531, 0x42003000, - 0x0010bf80, 0x45783000, 0x49375079, 0x4a026c03, - 0x0000ffff, 0x497a6806, 0x497a6807, 0x4a026c08, - 0x000004b0, 0x4a026a08, 0x00000014, 0x497a6809, - 0x4a026c04, 0x00000008, 0x5c028800, 0x5c026800, - 0x1c01f000, 0x4a038893, 0x00000001, 0x59340400, - 0x82000500, 0x000000ff, 0x82000580, 0x00000003, - 0x04000017, 0x0201f800, 0x00107d08, 0x04000014, - 0x4933c857, 0x59aa6879, 0x4936600a, 0x4a026407, - 0x00000012, 0x42000800, 0x00000003, 0x0201f800, - 0x001044f1, 0x42001000, 0x00000008, 0x0201f800, - 0x001072bc, 0x4a0378e4, 0x0c000000, 0x42027000, - 0x000000d0, 0x0201f800, 0x00020bc1, 0x1c01f000, - 0x4d400000, 0x4d340000, 0x0201f800, 0x00106c3c, - 0x4df00000, 0x59aa6879, 0x42028000, 0x00000029, - 0x0401f9cc, 0x4a026c00, 0x00000707, 0x5c03e000, - 0x02000800, 0x00106c29, 0x5c026800, 0x5c028000, - 0x1c01f000, 0x4a03c013, 0x00010001, 0x4a03c014, - 0x00010001, 0x4a03c013, 0x00010000, 0x42000000, - 0x0000000f, 0x80000040, 0x040207ff, 0x4a03c013, - 0x00010001, 0x1c01f000, 0x4803c856, 0x592c0a07, - 0x8c040d1e, 0x04020008, 0x80140110, 0x80000040, - 0x04000022, 0x4a033006, 0x0010b5b6, 0x0201f000, - 0x000206d1, 0x80140110, 0x80000040, 0x02020000, - 0x00105519, 0x592c0208, 0x82000c80, 0x00001001, - 0x04001003, 0x0201f000, 0x00105529, 0x592c1014, - 0x82080500, 0xffff0003, 0x02020000, 0x00105529, - 0x4202e000, 0x00000002, 0x42000000, 0x0010dfe7, - 0x50007000, 0x592c0012, 0x592c0813, 0x48007006, - 0x48047007, 0x492c700a, 0x4978700d, 0x4978700b, - 0x0201f000, 0x00105b42, 0x59a80878, 0x8c040d3e, - 0x02000000, 0x00105511, 0x59aa6879, 0x59340400, - 0x82000580, 0x00000404, 0x04020053, 0x59a80078, - 0x8c000506, 0x0402004c, 0x592c080a, 0x48066809, - 0x592c1207, 0x59341806, 0x8c081506, 0x04000002, - 0x59341807, 0x480e580a, 0x8c081502, 0x04020005, - 0x40040000, 0x800c0480, 0x0400102d, 0x0401f02f, - 0x592c0810, 0x82040500, 0x00000003, 0x0402004a, - 0x592c0011, 0x80000540, 0x04020011, 0x592c000f, - 0x82000500, 0x00000003, 0x04020043, 0x0201f800, - 0x00020b7b, 0x04000038, 0x4932580b, 0x4a026407, - 0x00000012, 0x492e6009, 0x4936600a, 0x42027000, - 0x000000d1, 0x0201f000, 0x00020bc1, 0x592e600b, - 0x0201f800, 0x00109acc, 0x0400002f, 0x59300407, - 0x82000580, 0x00000012, 0x0402002b, 0x59300809, - 0x800409c0, 0x04020015, 0x59300203, 0x82000580, - 0x00000007, 0x04020024, 0x492e6009, 0x42027000, - 0x000000d9, 0x0201f000, 0x00020bc1, 0x8c081500, - 0x040007d4, 0x480e580a, 0x59a80078, 0x8400054c, - 0x84000508, 0x48035078, 0x4a025a07, 0x00000000, - 0x0201f000, 0x000203ef, 0x58041000, 0x800811c0, - 0x04000003, 0x40080800, 0x0401f7fc, 0x492c0800, - 0x1c01f000, 0x4a025a07, 0x00000028, 0x0201f000, - 0x000203ef, 0x4a025a07, 0x00000029, 0x0201f000, - 0x000203ef, 0x4a025a07, 0x0000002c, 0x0201f000, - 0x000203ef, 0x4a025a07, 0x00000008, 0x0201f000, - 0x000203ef, 0x4a025a07, 0x00000003, 0x4a025c07, - 0x00000002, 0x0201f000, 0x000203ef, 0x4803c856, - 0x80140110, 0x80000040, 0x04000005, 0x4a033006, - 0x0010b62b, 0x0201f000, 0x000206d1, 0x59a80878, - 0x8c040d3e, 0x02000000, 0x00105511, 0x592c0a07, - 0x82040480, 0x00000004, 0x02021000, 0x00105529, - 0x59a80078, 0x8c000506, 0x0402001d, 0x59aa6879, - 0x59340400, 0x82000580, 0x00000404, 0x0402001c, - 0x0201f800, 0x00020b7b, 0x0400001d, 0x4a026407, - 0x00000012, 0x492e6009, 0x4936600a, 0x592c0a07, - 0x82040580, 0x00000002, 0x04000004, 0x592c0010, - 0x800001c0, 0x04000016, 0x82040400, 0x0010b64f, - 0x50027000, 0x0201f000, 0x00020bc1, 0x000000d4, - 0x000000d5, 0x000000d3, 0x000000d6, 0x4a025a07, - 0x00000028, 0x0201f000, 0x000203ef, 0x4a025a07, - 0x00000029, 0x0201f000, 0x000203ef, 0x4a025a07, - 0x0000002c, 0x0201f000, 0x000203ef, 0x0201f800, - 0x00020b9d, 0x0201f000, 0x00105529, 0x492fc857, - 0x59a80878, 0x8c040d3e, 0x42000800, 0x00004001, - 0x040000b6, 0x59a80078, 0x8c000506, 0x42000800, - 0x00000028, 0x040200b1, 0x59aa6879, 0x59340400, - 0x82000580, 0x00000404, 0x42000800, 0x00000029, - 0x040200aa, 0x4a025a05, 0x0000012b, 0x4a025806, - 0xaa00feed, 0x4a025a07, 0x00000004, 0x4a025a08, - 0x00000001, 0x59a0020b, 0x48025810, 0x48025814, - 0x48025a0a, 0x59a00408, 0x59a01208, 0x900811c0, - 0x80081540, 0x480a5812, 0x59a0040a, 0x59a0120a, - 0x900811c0, 0x80081540, 0x480a5813, 0x59a00407, - 0x48025a0b, 0x59a0040b, 0x48025c0b, 0x0201f800, - 0x00020b7b, 0x42000800, 0x0000002c, 0x0400008b, - 0x4a026407, 0x00000012, 0x492e6009, 0x4936600a, - 0x42027000, 0x000000de, 0x0201f000, 0x00020bc1, - 0x59cc0801, 0x82040d00, 0x00ffffff, 0x82040580, - 0x0000fc0e, 0x04020014, 0x59cc0800, 0x82040d00, - 0x00ffffff, 0x82040580, 0x0000fc0e, 0x04020010, - 0x59cc0c00, 0x80040910, 0x82040580, 0x00000022, - 0x04000011, 0x82040580, 0x00000023, 0x04000027, - 0x82040580, 0x00000005, 0x0400004e, 0x4807c857, - 0x0401f008, 0x4807c857, 0x0401f006, 0x4807c857, - 0x42000000, 0x0010ccb2, 0x0201f800, 0x0010bc88, - 0x1c01f000, 0x59cc0806, 0x59a80078, 0x8c00050a, - 0x04020010, 0x82040580, 0x05000000, 0x0402000d, - 0x42027000, 0x000000da, 0x0201f800, 0x00107d08, - 0x59aa6879, 0x4936600a, 0x4a026407, 0x00000013, - 0x59cc0404, 0x48026202, 0x0201f000, 0x00020bc1, - 0x4807c857, 0x42000000, 0x0010ccb2, 0x0201f800, - 0x0010bc88, 0x1c01f000, 0x0201f800, 0x0010609c, - 0x0400001f, 0x59300c07, 0x82040580, 0x00000012, - 0x02020800, 0x001003f5, 0x0402001c, 0x5932680a, - 0x59cc0a04, 0x48066202, 0x59300004, 0x8c00053e, - 0x02020800, 0x00107021, 0x04020014, 0x42027000, - 0x000000dc, 0x59cc0806, 0x82040580, 0x02000000, - 0x02000000, 0x00020bc1, 0x82040580, 0x01000000, - 0x02020800, 0x001003f5, 0x04020008, 0x42027000, - 0x000000dd, 0x0201f000, 0x00020bc1, 0x59cc0c04, - 0x4807c857, 0x0401f002, 0x4933c857, 0x42000000, - 0x0010ccb2, 0x0201f800, 0x0010bc88, 0x1c01f000, - 0x0201f800, 0x0010609c, 0x04000013, 0x59300c07, - 0x82040580, 0x00000012, 0x02020800, 0x001003f5, - 0x04020010, 0x5932680a, 0x59cc0a04, 0x48066202, - 0x59300004, 0x8c00053e, 0x02020800, 0x00107021, - 0x04020008, 0x42027000, 0x000000db, 0x0201f000, - 0x00020bc1, 0x59cc0c04, 0x4807c857, 0x0401f002, - 0x4933c857, 0x42000000, 0x0010ccb2, 0x0201f800, - 0x0010bc88, 0x1c01f000, 0x492fc857, 0x4807c857, - 0x82040580, 0x00000000, 0x02000000, 0x00102207, - 0x4a034207, 0x00004005, 0x48074407, 0x0201f000, - 0x0010220a, 0x48066004, 0x59bc00ea, 0x8c000516, - 0x040207fe, 0x83300400, 0xc0000000, 0x480378e1, - 0x1c01f000, 0x4d300000, 0x598c000d, 0x80026540, - 0x0400000e, 0x0201f800, 0x00106c22, 0x0201f800, - 0x00106c10, 0x59300000, 0x800001c0, 0x04000004, - 0x4803180d, 0x497a6000, 0x0401f003, 0x497b180d, - 0x497b180c, 0x80000580, 0x5c026000, 0x1c01f000, - 0x4d2c0000, 0x4d300000, 0x4d340000, 0x4c5c0000, - 0x4178b800, 0x598e600d, 0x813261c0, 0x0400000b, - 0x0201f800, 0x00106b26, 0x59300000, 0x4c000000, - 0x405c3000, 0x0401f826, 0x0201f800, 0x0010feea, - 0x5c026000, 0x0401f7f5, 0x5c00b800, 0x5c026800, - 0x5c026000, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x4c5c0000, 0x813261c0, 0x02000800, 0x0010032e, - 0x41300000, 0x598cb80d, 0x41783000, 0x805cb9c0, - 0x0400000f, 0x805c0d80, 0x04000004, 0x405c3000, - 0x5818b800, 0x0401f7fa, 0x0401f80d, 0x598c000f, - 0x81300580, 0x02000800, 0x001072c9, 0x497a6008, - 0x80000580, 0x5c00b800, 0x1c01f000, 0x82000540, - 0x00000001, 0x5c00b800, 0x1c01f000, 0x59300800, - 0x497a6000, 0x0201f800, 0x00106c10, 0x801831c0, - 0x04020009, 0x598c000c, 0x81300580, 0x04020004, - 0x4803180c, 0x4803180d, 0x0401f008, 0x4807180d, - 0x0401f006, 0x48043000, 0x598c000c, 0x81300580, - 0x04020002, 0x481b180c, 0x0201f000, 0x00106c22, - 0x59325809, 0x59300c03, 0x82040480, 0x000000df, - 0x04021004, 0x82040480, 0x000000d0, 0x0401f002, - 0x81780040, 0x04001002, 0x0c01f008, 0x4933c857, - 0x493bc857, 0x42000000, 0x0010ccb4, 0x0201f800, - 0x0010bc88, 0x1c01f000, 0x0010b7c0, 0x0010b7d7, - 0x0010b7f4, 0x0010b805, 0x0010b816, 0x0010b829, - 0x0010b83c, 0x0010b850, 0x0010b797, 0x0010b797, - 0x0010b797, 0x0010b797, 0x0010b797, 0x0010b797, - 0x0010b7ad, 0x42000800, 0x00000022, 0x0401f8d1, - 0x592c0a0a, 0x4805a207, 0x592c0a0b, 0x4805a208, - 0x592c0c0b, 0x4805a408, 0x4a01a006, 0x0c000000, - 0x59340408, 0x48026006, 0x42000800, 0x00000003, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00107b6e, - 0x42000800, 0x00000022, 0x0401f8be, 0x497b8880, - 0x59a8001f, 0x82000500, 0x0000ffff, 0x4c000000, - 0x0201f800, 0x001015e0, 0x5c000000, 0x48038880, - 0x4a01a006, 0x03000000, 0x4801a207, 0x59a80004, - 0x4801a407, 0x42000800, 0x00000002, 0x42001000, - 0x0000dc00, 0x0201f000, 0x00107b6e, 0x42000800, - 0x00000022, 0x0401f8a7, 0x592c0a07, 0x592c100f, - 0x592c0010, 0x80080580, 0x82000500, 0x00000003, - 0x0402008c, 0x82080500, 0x00000003, 0x04020089, - 0x42001800, 0x00000002, 0x8c040d06, 0x04020003, - 0x42001800, 0x00000001, 0x4a01a006, 0x04000000, - 0x4809a007, 0x480da008, 0x42000800, 0x00000003, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00107b6e, - 0x42000800, 0x00000022, 0x0401f88a, 0x59300819, - 0x5930101a, 0x5930181b, 0x4a01a006, 0x06000000, - 0x4805a007, 0x4809a008, 0x480da009, 0x42000800, - 0x00000004, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00107b6e, 0x42000800, 0x00000022, 0x0401f879, - 0x592c0a0a, 0x592c100b, 0x592c180c, 0x4a01a006, - 0x07000000, 0x4805a207, 0x480da008, 0x4809a009, - 0x42000800, 0x00000004, 0x42001000, 0x0000dc00, - 0x0201f000, 0x00107b6e, 0x42000800, 0x00000022, - 0x0401f868, 0x592c080a, 0x592c1010, 0x82080500, - 0xfffc0003, 0x0402004f, 0x80081104, 0x4a01a006, - 0x08000000, 0x4805a007, 0x4809a008, 0x42000800, - 0x00000003, 0x42001000, 0x0000dc00, 0x0201f000, - 0x00107b6e, 0x42000800, 0x00000022, 0x0401f855, - 0x592c080a, 0x592c1010, 0x82080500, 0xfffc0003, - 0x0402003c, 0x80081104, 0x4a01a006, 0x09000000, - 0x4805a007, 0x4809a008, 0x42000800, 0x00000003, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00107b6e, - 0x42000800, 0x00000022, 0x0401f842, 0x592c080a, - 0x592c1010, 0x592c180b, 0x82080500, 0xffff0000, - 0x04020028, 0x4a01a006, 0x0a000000, 0x4805a207, - 0x480da407, 0x4809a008, 0x42000800, 0x00000003, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00107b6e, - 0x42000800, 0x00000022, 0x0401f82e, 0x4a01a006, - 0x0b000000, 0x42000800, 0x00000001, 0x42001000, - 0x0000dc00, 0x0201f000, 0x00107b6e, 0x59300c03, - 0x82040580, 0x000000d8, 0x04000003, 0x0201f800, - 0x0010032e, 0x42000800, 0x00000023, 0x0401f81d, - 0x4a01a006, 0x02000000, 0x42000800, 0x00000001, - 0x42001000, 0x0000dc00, 0x0201f000, 0x00107b6e, - 0x592c0006, 0x4803c857, 0x480bc857, 0x0201f800, - 0x00106b8c, 0x4a025a07, 0x00000003, 0x4a025c07, - 0x00000002, 0x592c0205, 0x82000500, 0x000000ff, - 0x82000580, 0x0000002b, 0x04020002, 0x480a5808, - 0x0201f800, 0x000203ef, 0x0201f000, 0x00020b9d, - 0x81a5a000, 0x4a01a001, 0x0000fc0e, 0x4979a005, - 0x4979a003, 0x4a034800, 0x00000011, 0x59307002, - 0x82040580, 0x00000022, 0x04020007, 0x4a01a000, - 0x2200fc0e, 0x4a01a002, 0xfe290000, 0x4839a004, - 0x1c01f000, 0x82040580, 0x00000023, 0x02020800, - 0x0010032e, 0x4a01a000, 0x2300fc0e, 0x4a01a002, - 0xfe980000, 0x903871c0, 0x4839a004, 0x1c01f000, - 0x4a034800, 0x00000011, 0x81a5a000, 0x4a01a000, - 0x0100fc0e, 0x4a01a001, 0x0000fc0e, 0x4a01a002, - 0xfe000008, 0x41781000, 0x42000800, 0x01000000, - 0x592c0205, 0x82000500, 0x000000ff, 0x82000580, - 0x0000001b, 0x04020006, 0x592c1011, 0x592c0207, - 0x8c00051c, 0x04020002, 0x41780800, 0x4805a003, - 0x59300002, 0x4801a004, 0x4809a005, 0x59340c08, - 0x42001000, 0x00000100, 0x0201f800, 0x00106a79, - 0x0201f800, 0x001063ff, 0x83180d40, 0x00000038, - 0x42001000, 0x0000c920, 0x0201f000, 0x00107b8d, - 0x59300a03, 0x82040480, 0x00000009, 0x04021004, - 0x82040480, 0x00000001, 0x0401f002, 0x81780040, - 0x0c021002, 0x0401f22c, 0x0010b8d6, 0x0010b8f3, - 0x0010b953, 0x0010b995, 0x0010baf9, 0x0010baf9, - 0x0010b9f5, 0x0010ba1e, 0x83380580, 0x00000013, - 0x04000015, 0x83380580, 0x00000014, 0x0402021e, - 0x59300c03, 0x4807c857, 0x0201f800, 0x00106b8c, - 0x0201f800, 0x00109667, 0x04000009, 0x4d2c0000, - 0x59325809, 0x4a025a07, 0x00000001, 0x497a5c07, - 0x0201f800, 0x000203ef, 0x5c025800, 0x0201f000, - 0x00107cbe, 0x59300c03, 0x82040580, 0x000000d8, - 0x04020209, 0x0201f000, 0x00020b9d, 0x83380480, - 0x000000de, 0x04021004, 0x83380480, 0x000000db, - 0x0401f002, 0x81780040, 0x040011ff, 0x0c01f001, - 0x0010b8ff, 0x0010b915, 0x0010b91f, 0x59300c03, - 0x82040580, 0x000000d1, 0x0400000c, 0x82040580, - 0x000000d5, 0x040201f4, 0x42000800, 0x80000000, - 0x4a026203, 0x00000002, 0x4a026403, 0x000000d9, - 0x0201f000, 0x00020b30, 0x59340408, 0x48026006, - 0x42000800, 0x80000040, 0x4a026203, 0x00000003, - 0x0401f7f6, 0x59300c03, 0x82040480, 0x000000da, - 0x04021004, 0x82040480, 0x000000d0, 0x0401f002, - 0x81780040, 0x0c02101b, 0x0401f1db, 0x0201f800, - 0x00109667, 0x0402000a, 0x59300c03, 0x82040580, - 0x000000d2, 0x040201d4, 0x42000000, 0x0010ccb1, - 0x0401fb60, 0x0201f000, 0x00020b9d, 0x4933c857, - 0x59cc1207, 0x80081110, 0x4d2c0000, 0x59325809, - 0x4a025a07, 0x00000003, 0x480a5c07, 0x0201f800, - 0x000203ef, 0x5c025800, 0x0201f000, 0x00020b9d, - 0x0010ba4d, 0x0010baf9, 0x0010b946, 0x0010b946, - 0x0010baf9, 0x0010b946, 0x0010baf9, 0x0010b942, - 0x0010baf9, 0x0010ba8d, 0x41780800, 0x0401fa83, - 0x0201f000, 0x00020b9d, 0x0201f800, 0x00109667, - 0x04000009, 0x4d2c0000, 0x59325809, 0x4a025a07, - 0x00000000, 0x497a5c07, 0x0201f800, 0x000203ef, - 0x5c025800, 0x0201f000, 0x00020b9d, 0x0201f800, - 0x00109667, 0x0400003e, 0x83380580, 0x0000004a, - 0x0400002c, 0x83380580, 0x00000049, 0x0402019e, - 0x4d2c0000, 0x59325809, 0x592c0a05, 0x82040500, - 0x000000ff, 0x82000580, 0x0000001b, 0x04020019, - 0x592c0207, 0x8c00051c, 0x0402000f, 0x4a025a07, - 0x00000040, 0x497a5c07, 0x592c0000, 0x48026009, - 0x0201f800, 0x000203ef, 0x5c025800, 0x4a026203, - 0x00000007, 0x59300009, 0x800001c0, 0x04020082, - 0x1c01f000, 0x59a80078, 0x8400050a, 0x48035078, - 0x4a026203, 0x00000002, 0x5c025800, 0x1c01f000, - 0x4a025a07, 0x00000000, 0x497a5c07, 0x0201f800, - 0x000203ef, 0x5c025800, 0x0201f000, 0x00020b9d, - 0x4933c857, 0x0201f800, 0x00106e75, 0x0201f800, - 0x00106b6c, 0x4d2c0000, 0x59325809, 0x4a025a07, - 0x00000001, 0x497a5c07, 0x0201f800, 0x000203ef, - 0x5c025800, 0x0201f000, 0x00020b9d, 0x4803c856, - 0x0401f165, 0x0201f800, 0x00109667, 0x0400002c, - 0x83380480, 0x00000054, 0x04021004, 0x83380480, - 0x00000047, 0x0401f002, 0x81780040, 0x04001006, - 0x4d2c0000, 0x59325809, 0x0c01f823, 0x5c025800, - 0x1c01f000, 0x83380580, 0x000000dd, 0x04020152, - 0x4933c857, 0x0201f800, 0x00100c75, 0x0201f800, - 0x00109667, 0x04000016, 0x592c0a07, 0x82040580, - 0x00000004, 0x04020006, 0x42000800, 0x00000001, - 0x0401fd6a, 0x0201f000, 0x00020b9d, 0x4d2c0000, - 0x59325809, 0x59cc1207, 0x80081110, 0x4a025a07, - 0x00000003, 0x480a5c07, 0x0201f800, 0x000203ef, - 0x5c025800, 0x0201f000, 0x00020b9d, 0x4803c856, - 0x0401f135, 0x0010b9f1, 0x0010b9d2, 0x0010baf9, - 0x0010baf9, 0x0010baf9, 0x0010baf9, 0x0010baf9, - 0x0010baf9, 0x0010baf9, 0x0010baf9, 0x0010baf9, - 0x0010baf9, 0x0010b9d2, 0x59300812, 0x82040500, - 0xffff0000, 0x0402001c, 0x42001000, 0x00000000, - 0x592c0a07, 0x82040580, 0x00000004, 0x0402000e, - 0x82080580, 0x00000007, 0x04000007, 0x59300812, - 0x800409c0, 0x04000004, 0x4807c857, 0x42001000, - 0x00000015, 0x40080800, 0x0401fd38, 0x0201f000, - 0x00020b9d, 0x59300812, 0x48065808, 0x480a5a07, - 0x497a5c07, 0x0201f800, 0x000203ef, 0x0201f000, - 0x00020b9d, 0x4803c856, 0x42001000, 0x00000007, - 0x0401f7e4, 0x0201f800, 0x00109667, 0x0400001b, - 0x83380580, 0x000000d9, 0x040200ff, 0x59340408, - 0x48026006, 0x4a026403, 0x000000d9, 0x0201f800, - 0x00020168, 0x59306809, 0x58340207, 0x8c00051c, - 0x04020006, 0x42000800, 0x80000040, 0x4a026203, - 0x00000003, 0x0401f005, 0x42000800, 0x80000000, - 0x4a026203, 0x00000002, 0x4a026403, 0x000000d9, - 0x0201f000, 0x00020b30, 0x4803c856, 0x83380580, - 0x000000dd, 0x040200e4, 0x42001000, 0x0000800f, - 0x42001800, 0x00000005, 0x59cc2207, 0x80102110, - 0x0201f000, 0x001038bc, 0x83380480, 0x000000df, - 0x04021004, 0x83380480, 0x000000d0, 0x0401f002, - 0x81780040, 0x040010d4, 0x4933c857, 0x493bc857, - 0x59340a08, 0x48066006, 0x0c01f001, 0x0010ba3f, - 0x0010ba3b, 0x0010ba3f, 0x0010ba3f, 0x0010ba45, - 0x0010ba3d, 0x0010ba45, 0x0010ba3f, 0x0010ba3a, - 0x0010ba3a, 0x0010ba3a, 0x0010ba3a, 0x0010ba3a, - 0x0010ba3a, 0x0010ba45, 0x0401f0bf, 0x59340408, - 0x48026006, 0x0201f800, 0x00020168, 0x4a026203, - 0x00000002, 0x493a6403, 0x42000800, 0x80000000, - 0x0401f4e5, 0x0201f800, 0x0002011a, 0x4a026203, - 0x00000004, 0x493a6403, 0x42000800, 0x80000000, - 0x0401f4dd, 0x59cc0207, 0x59cc0c07, 0x59cc1008, - 0x59cc1809, 0x59cc220a, 0x59cc2c0a, 0x59cc300b, - 0x4a026c00, 0x00000404, 0x48026c04, 0x48038893, - 0x48035012, 0x48066a04, 0x480a6806, 0x480e6807, - 0x48126a08, 0x48166c08, 0x8c183500, 0x0400000d, - 0x59cc200d, 0x59cc280d, 0x4813c857, 0x4817c857, - 0x59cc200c, 0x42001000, 0x0000800f, 0x42001800, - 0x00000001, 0x901029c0, 0x0201f800, 0x001038bd, - 0x59a80878, 0x42001800, 0x00000003, 0x84040d4e, - 0x59342007, 0x8c183502, 0x0402000c, 0x82040d00, - 0xffffff7b, 0x8c183504, 0x04020004, 0x42001800, - 0x00000002, 0x0401f004, 0x42001800, 0x00000004, - 0x84040d44, 0x59342006, 0x48075078, 0x42001000, - 0x0000800f, 0x82102d00, 0xffff0000, 0x80142920, - 0x82102500, 0x0000ffff, 0x0201f800, 0x001038bd, - 0x59c80040, 0x84000534, 0x48039040, 0x0201f000, - 0x00020b9d, 0x0201f800, 0x00109667, 0x04000023, - 0x4d2c0000, 0x59325809, 0x592c0a05, 0x82040d00, - 0x000000ff, 0x82040580, 0x0000001b, 0x04020019, - 0x592c0a07, 0x8c040d04, 0x04020003, 0x0201f800, - 0x0010b581, 0x59340009, 0x4802580a, 0x8c040d06, - 0x04020007, 0x48026806, 0x59a80078, 0x8400054c, - 0x84000508, 0x48035078, 0x0401f002, 0x48026807, - 0x4a025a07, 0x00000000, 0x497a5c07, 0x0201f800, - 0x000203ef, 0x5c025800, 0x0201f000, 0x00020b9d, - 0x497a5808, 0x0401f7f7, 0x4803c856, 0x0401f046, - 0x59300a03, 0x82040480, 0x00000009, 0x04021004, - 0x82040480, 0x00000001, 0x0401f002, 0x81780040, - 0x0c021002, 0x0401f03c, 0x0010bac6, 0x0010baf9, - 0x0010baf9, 0x0010baf9, 0x0010baf9, 0x0010baf9, - 0x0010baf9, 0x0010bad2, 0x83380580, 0x00000013, - 0x04000008, 0x83380580, 0x00000014, 0x0402002e, - 0x59300c03, 0x4807c857, 0x0201f800, 0x00106b8c, - 0x0201f000, 0x00020b9d, 0x83380580, 0x000000da, - 0x04020025, 0x4933c857, 0x493bc857, 0x59cc0808, - 0x59cc1007, 0x59a81878, 0x820c1d00, 0xfffffffc, - 0x82040580, 0x00000000, 0x04020002, 0x840c1d42, - 0x82080580, 0x00000000, 0x04020002, 0x840c1d40, - 0x480f5078, 0x480fc857, 0x836c0580, 0x00000001, - 0x0400000a, 0x4202d800, 0x00000004, 0x4a035038, - 0x00000000, 0x497b5058, 0x42000000, 0x00000080, - 0x0201f800, 0x0010155c, 0x4a026403, 0x000000d8, + 0x4c180000, 0x4c1c0000, 0x4c200000, 0x0201f800, + 0x00100583, 0x02000800, 0x0010032e, 0x5c004000, + 0x5c003800, 0x5c003000, 0x5c002800, 0x5c002000, + 0x5c001800, 0x5c001000, 0x5c000800, 0x4a025805, + 0x0000010d, 0x800811c0, 0x0400001f, 0x83400580, + 0x00000029, 0x04020018, 0x82180580, 0x00000002, + 0x0400000d, 0x82180580, 0x00000003, 0x0400000a, + 0x82180580, 0x00000008, 0x04000007, 0x82180580, + 0x00000006, 0x04000007, 0x82180580, 0x00000009, + 0x04020009, 0x4a02580a, 0xffffffff, 0x0401f007, + 0x5808280a, 0x58140002, 0x82000500, 0x00ffffff, + 0x48025813, 0x480a580a, 0x58080202, 0x48025c14, + 0x0401f005, 0x4a02580a, 0xffffffff, 0x4a025c14, + 0x0000ffff, 0x83400580, 0x00000046, 0x04000002, + 0x41782800, 0x480e580d, 0x4806580e, 0x4822580f, + 0x481e5810, 0x48165a08, 0x481a5c09, 0x49425a09, + 0x48125a07, 0x82100580, 0x0000ffff, 0x04000014, + 0x4d440000, 0x4d340000, 0x40128800, 0x83440480, + 0x000007f0, 0x04001004, 0x0201f800, 0x00104a7c, + 0x0401f003, 0x0201f800, 0x0002034c, 0x02020800, + 0x0010032e, 0x59340002, 0x82000500, 0x00ffffff, + 0x48025813, 0x5c026800, 0x5c028800, 0x497a5800, + 0x497a5c05, 0x812000d0, 0x48025c11, 0x0201f800, + 0x0010b674, 0x5c025800, 0x1c01f000, 0x5c000000, + 0x4c000000, 0x4803c857, 0x480bc857, 0x480fc857, + 0x4813c857, 0x4817c857, 0x4d2c0000, 0x4c080000, + 0x4c0c0000, 0x4c100000, 0x4c140000, 0x0201f800, + 0x00100583, 0x02000800, 0x0010032e, 0x5c002800, + 0x5c002000, 0x5c001800, 0x5c001000, 0x04011000, + 0x832c0400, 0x00000005, 0x4803c840, 0x4a03c842, + 0x00000010, 0x40000000, 0x040117ff, 0x4a025805, + 0x0000010d, 0x4a025a09, 0x00000049, 0x480a5a0b, + 0x480e5c0b, 0x48125a0c, 0x48165c0c, 0x82080580, + 0x00008014, 0x04020068, 0x820c0580, 0x0000ffff, + 0x04020065, 0x82100580, 0x00000006, 0x04020062, + 0x4d240000, 0x42024800, 0x0010cfd1, 0x59240005, + 0x5c024800, 0x0201f800, 0x001050f7, 0x04000009, + 0x82000d00, 0x00ffff00, 0x04020006, 0x82000c00, + 0x00102116, 0x50040800, 0x80040910, 0x48065a0d, + 0x82000d00, 0x0000ffff, 0x48065c0d, 0x80000120, + 0x48025a0e, 0x59a8021b, 0x82001500, 0x00003500, + 0x480a5a0f, 0x8c000502, 0x0400001f, 0x8c000506, + 0x04000009, 0x82000d00, 0x0000000a, 0x82040d80, + 0x0000000a, 0x04020004, 0x4a025c0e, 0x00000001, + 0x0401f022, 0x8c00050a, 0x04000009, 0x82000d00, + 0x00000022, 0x82040d80, 0x00000022, 0x04020004, + 0x4a025c0e, 0x00000003, 0x0401f018, 0x8c000508, + 0x04000009, 0x82000d00, 0x00000012, 0x82040d80, + 0x00000012, 0x04020004, 0x4a025c0e, 0x00000002, + 0x0401f00e, 0x0201f800, 0x001050f7, 0x04020004, + 0x4a025c0e, 0x00000004, 0x0401f008, 0x8c000506, + 0x04000004, 0x4a025c0e, 0x00000005, 0x0401f003, + 0x4a025c0e, 0x00000000, 0x59a8002a, 0x48025c0f, + 0x59a8002b, 0x48025a10, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04020004, + 0x4a025c10, 0x00000000, 0x0401f00f, 0x82040580, + 0x00008000, 0x04020004, 0x4a025c10, 0x00000001, + 0x0401f009, 0x82040580, 0x00010000, 0x04020004, + 0x4a025c10, 0x00000003, 0x0401f003, 0x4a025c10, + 0x00000004, 0x0401fbdf, 0x5c025800, 0x1c01f000, + 0x0401f807, 0x42018800, 0x00000001, 0x04000003, + 0x42018800, 0x00000000, 0x1c01f000, 0x5930080a, + 0x800409c0, 0x04000004, 0x58040403, 0x81440580, + 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fd, + 0x4933c857, 0x4c040000, 0x59300403, 0x82000d80, + 0x0000001e, 0x04020016, 0x800000d0, 0x59300a17, + 0x82040d00, 0x000000ff, 0x80040540, 0x4803c857, + 0x48026417, 0x4a026403, 0x00000085, 0x4a026203, + 0x00000009, 0x4a026407, 0x00000005, 0x4a026226, + 0x00000004, 0x59a8002b, 0x48026006, 0x42000800, + 0x8000004b, 0x0201f800, 0x00020b3e, 0x5c000800, + 0x1c01f000, 0x4933c857, 0x40000000, 0x40000000, + 0x1c01f000, 0x59300415, 0x4933c857, 0x4803c857, + 0x8c000518, 0x04000009, 0x8c000512, 0x02020000, + 0x00109adc, 0x0401f929, 0x0201f800, 0x00020afd, + 0x0201f800, 0x00020b9d, 0x1c01f000, 0x591c0407, + 0x4803c857, 0x82000c80, 0x00000009, 0x0402100b, + 0x0c01f001, 0x0010b2e6, 0x0010b2e6, 0x0010b2e6, + 0x0010b2e8, 0x0010b2e6, 0x0010b2e8, 0x0010b2e8, + 0x0010b2e6, 0x0010b2e8, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x1c01f000, 0x591c0407, + 0x82000500, 0x0000001f, 0x82000580, 0x00000006, + 0x0400000e, 0x4803c857, 0x4a026403, 0x0000003b, + 0x4a02641b, 0x00000009, 0x4a02621b, 0x00002a00, 0x4a026203, 0x00000001, 0x42000800, 0x80000040, - 0x0401f431, 0x4933c857, 0x493bc857, 0x59300203, - 0x4803c857, 0x59300403, 0x4803c857, 0x42000000, - 0x0010ccb3, 0x0401f987, 0x1c01f000, 0x4933c857, - 0x4d2c0000, 0x4d3c0000, 0x417a5800, 0x417a7800, - 0x0201f800, 0x00109667, 0x04000003, 0x59325809, - 0x592e7a09, 0x0401f81a, 0x82000540, 0x00000001, - 0x5c027800, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x4d2c0000, 0x4d3c0000, 0x42027800, 0x00000040, - 0x42000000, 0x0010ccae, 0x0401f96e, 0x417a5800, - 0x0201f800, 0x00109667, 0x04000005, 0x59325809, - 0x592e7a09, 0x853e7d4c, 0x493e5a09, 0x0401f804, - 0x5c027800, 0x5c025800, 0x1c01f000, 0x0201f800, - 0x00106c3c, 0x4df00000, 0x0401f88b, 0x4803c857, - 0x82000c80, 0x00000009, 0x04021006, 0x0c01f808, - 0x5c03e000, 0x02000800, 0x00106c29, 0x1c01f000, - 0x42000000, 0x00000006, 0x0401f7f9, 0x0010bb8c, - 0x0010bb8d, 0x0010bb46, 0x0010bba3, 0x0010bbae, - 0x0010bb40, 0x0010bb40, 0x0010bb40, 0x0010bb8c, - 0x4d380000, 0x417a7000, 0x0401ffb7, 0x5c027000, - 0x0201f000, 0x00107cbe, 0x812e59c0, 0x04000021, - 0x42001000, 0x00000002, 0x833c0500, 0x00000081, - 0x04020007, 0x42001000, 0x00000006, 0x8d3e7d0c, - 0x04020003, 0x42001000, 0x00000004, 0x592c0a07, - 0x82040580, 0x00000004, 0x04020006, 0x40080800, - 0x0201f800, 0x0010b71e, 0x0201f000, 0x00107cbe, - 0x480a5a07, 0x0201f800, 0x000203ef, 0x59300403, - 0x82000580, 0x000000d0, 0x04020004, 0x5930100a, - 0x4a001400, 0x00000707, 0x0201f000, 0x00107cbe, - 0x59300c03, 0x82040580, 0x000000d7, 0x04020005, - 0x42000800, 0x00000004, 0x0401f858, 0x0401f7f0, - 0x8d3e7d0c, 0x040007ee, 0x5932680a, 0x59300816, - 0x59340412, 0x80040580, 0x04020007, 0x42000000, - 0x0010ccaf, 0x0401f90f, 0x0201f800, 0x0010b581, - 0x0401f7e3, 0x4933c857, 0x80040800, 0x48066016, - 0x4d380000, 0x59327403, 0x83380580, 0x000000d0, - 0x04020003, 0x4a038893, 0x00000001, 0x4a026203, - 0x00000008, 0x0201f800, 0x00020bc1, 0x5c027000, - 0x1c01f000, 0x8d3e7d0c, 0x04000006, 0x59300407, - 0x82000580, 0x00000013, 0x02000000, 0x001093d2, - 0x598c000f, 0x4803c857, 0x81300580, 0x04020004, - 0x0201f800, 0x00106f5c, 0x040207ac, 0x0201f800, - 0x0010b75b, 0x040007a9, 0x4803c856, 0x0201f800, - 0x00106b47, 0x040007a5, 0x0401f79e, 0x0201f800, - 0x0010931e, 0x04020004, 0x0201f800, 0x00106f25, - 0x0402079e, 0x0201f800, 0x0010fd55, 0x80c40040, - 0x040207f2, 0x0401f799, 0x812e59c0, 0x04000006, - 0x0201f800, 0x00106c29, 0x0201f800, 0x00100c75, - 0x0401f792, 0x59300004, 0x8c00053e, 0x0400000d, - 0x8c00050c, 0x0402000b, 0x59306c03, 0x82340580, - 0x000000d9, 0x04020004, 0x42000000, 0x00000003, - 0x0401f005, 0x42000000, 0x00000001, 0x0401f002, - 0x59300203, 0x1c01f000, 0x5931d82a, 0x58ef400a, - 0x58ee580c, 0x58ec0008, 0x48074407, 0x0801f800, - 0x1c01f000, 0x4817c857, 0x4c000000, 0x4c040000, - 0x8c142d2a, 0x04000004, 0x5988011e, 0x80000000, - 0x4803111e, 0x8c142d2e, 0x04000004, 0x5988011f, - 0x80000000, 0x4803111f, 0x8c142d2c, 0x04000013, - 0x40140000, 0x82000500, 0x00070000, 0x82000d80, - 0x00030000, 0x0400000d, 0x82000d80, 0x00040000, - 0x0400000a, 0x82000d80, 0x00050000, 0x04000007, - 0x59880005, 0x80000000, 0x48031005, 0x59880120, - 0x80000000, 0x48031120, 0x5c000800, 0x5c000000, - 0x1c01f000, 0x4817c857, 0x4c000000, 0x4c040000, - 0x8c142d2a, 0x04000004, 0x59880121, 0x80000000, - 0x48031121, 0x8c142d2e, 0x04000004, 0x59880122, - 0x80000000, 0x48031122, 0x8c142d2c, 0x04000013, - 0x40140000, 0x82000500, 0x00070000, 0x82000d80, - 0x00030000, 0x0400000d, 0x82000d80, 0x00040000, - 0x0400000a, 0x82000d80, 0x00050000, 0x04000007, - 0x59880005, 0x80000000, 0x48031005, 0x59880123, - 0x80000000, 0x48031123, 0x5c000800, 0x5c000000, - 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d2c, - 0x04000004, 0x5988010c, 0x80000000, 0x4803110c, - 0x8c040d2a, 0x04000004, 0x5988010d, 0x80000000, - 0x4803110d, 0x8c040d28, 0x04000004, 0x5988010e, - 0x80000000, 0x4803110e, 0x8c040d26, 0x04000004, - 0x5988010f, 0x80000000, 0x4803110f, 0x8c040d24, - 0x04000004, 0x59880110, 0x80000000, 0x48031110, - 0x8c040d22, 0x04000004, 0x59880111, 0x80000000, - 0x48031111, 0x8c040d20, 0x04000004, 0x59880112, - 0x80000000, 0x48031112, 0x5c000000, 0x1c01f000, - 0x4807c857, 0x4c000000, 0x59880113, 0x80000000, - 0x48031113, 0x5c000000, 0x1c01f000, 0x4807c857, - 0x4c000000, 0x8c040d1c, 0x04000004, 0x59880114, - 0x80000000, 0x48031114, 0x8c040d1a, 0x04000004, - 0x59880115, 0x80000000, 0x48031115, 0x5c000000, - 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d18, - 0x04000004, 0x59880116, 0x80000000, 0x48031116, - 0x8c040d16, 0x04000004, 0x59880117, 0x80000000, - 0x48031117, 0x8c040d14, 0x04000004, 0x59880118, - 0x80000000, 0x48031118, 0x5c000000, 0x1c01f000, - 0x4807c857, 0x4c000000, 0x8c040d10, 0x04000004, - 0x59880119, 0x80000000, 0x48031119, 0x8c040d0c, - 0x04000004, 0x5988011a, 0x80000000, 0x4803111a, + 0x0201f000, 0x00020b3e, 0x4803c856, 0x4c040000, + 0x4c140000, 0x4d300000, 0x411e6000, 0x0401f8f7, + 0x497a6205, 0x59300415, 0x4803c857, 0x82000500, + 0xffffadff, 0x48026415, 0x497a6405, 0x5c026000, + 0x0201f800, 0x00100583, 0x02000800, 0x0010032e, + 0x5c002800, 0x5c000800, 0x4a025805, 0x0000010d, + 0x497a5800, 0x497a5c05, 0x4a025a09, 0x00000045, + 0x491e580a, 0x59300402, 0x48025c08, 0x5930041a, + 0x48025c0c, 0x591c0415, 0x84000556, 0x48023c15, + 0x591c180a, 0x580c0403, 0x48025a07, 0x580c0002, + 0x82000500, 0x00ffffff, 0x48025813, 0x59cc0404, + 0x48025c14, 0x497a5a08, 0x4816580b, 0x48065a0c, + 0x580c0013, 0x82000500, 0xff000000, 0x80000120, + 0x48025c11, 0x0401fb43, 0x493a6403, 0x4d400000, + 0x42028000, 0x00000045, 0x591c0202, 0x4c000000, + 0x4d300000, 0x411e6000, 0x0401fc81, 0x5c026000, + 0x5c000000, 0x48023a02, 0x5c028000, 0x491e6027, + 0x4932381d, 0x4a023c07, 0x00000006, 0x4a023a03, + 0x00000007, 0x497a3806, 0x497a3a05, 0x1c01f000, + 0x4933c857, 0x83380580, 0x00000013, 0x0402000b, + 0x59300403, 0x4803c857, 0x82000d80, 0x00000085, + 0x0400002b, 0x82000d80, 0x0000008b, 0x04000028, + 0x0201f800, 0x0010032e, 0x83380580, 0x00000027, + 0x0402000c, 0x0201f800, 0x00106d91, 0x4d2c0000, + 0x4d400000, 0x59325809, 0x42028000, 0x00000004, + 0x0401fe15, 0x5c028000, 0x5c025800, 0x1c01f000, + 0x83380580, 0x00000014, 0x040007f3, 0x83380580, + 0x00000089, 0x04000005, 0x83380580, 0x0000008a, + 0x02020000, 0x00107f37, 0x0201f800, 0x00107226, + 0x02020000, 0x00107f37, 0x59300a03, 0x82040580, + 0x0000000a, 0x04000009, 0x82040580, 0x0000000c, + 0x04000006, 0x0201f800, 0x0010032e, 0x4a026203, + 0x0000000a, 0x1c01f000, 0x83380480, 0x00000093, + 0x0402100c, 0x83380480, 0x00000085, 0x04001009, + 0x83380580, 0x00000089, 0x0400000a, 0x83380580, + 0x0000008a, 0x04000024, 0x0201f800, 0x0010032e, + 0x493bc857, 0x4933c857, 0x0201f000, 0x00107f37, + 0x4933c857, 0x4c340000, 0x41306800, 0x0201f800, + 0x00107ef8, 0x04000013, 0x4a026203, 0x00000001, + 0x4a026403, 0x0000001e, 0x59cc0c07, 0x4806641a, + 0x59cc0a07, 0x4806621a, 0x5834080a, 0x4806600a, + 0x5834081c, 0x4806601c, 0x4a026407, 0x00000004, + 0x42000800, 0x80000040, 0x0201f800, 0x00020b3e, + 0x40366000, 0x0201f800, 0x00020b9d, 0x5c006800, + 0x1c01f000, 0x4933c857, 0x0201f000, 0x00020b9d, + 0x5930080a, 0x58040200, 0x8c00051a, 0x02020800, + 0x001003f5, 0x1c01f000, 0x0201f800, 0x00104942, + 0x0400001e, 0x4a026203, 0x00000002, 0x59300415, + 0x84000558, 0x48026415, 0x8c000512, 0x04000004, + 0x59a8002c, 0x48026205, 0x0401f007, 0x59a8082c, + 0x59a8002a, 0x80040400, 0x82000400, 0x0000001e, + 0x48026205, 0x5930000a, 0x82000c00, 0x00000011, + 0x50040000, 0x80000540, 0x04000004, 0x82000c00, + 0x00000000, 0x0401f7fb, 0x45300800, 0x497a6000, + 0x82000540, 0x00000001, 0x1c01f000, 0x82100500, + 0xfffffeef, 0x0402001c, 0x4d2c0000, 0x4937c857, + 0x59340811, 0x83341400, 0x00000011, 0x800409c0, + 0x0400000e, 0x40040000, 0x81300580, 0x04000005, + 0x82041400, 0x00000000, 0x58040800, 0x0401f7f8, + 0x59300800, 0x497a6000, 0x44041000, 0x0201f800, + 0x00020afd, 0x0401f002, 0x4933c857, 0x5c025800, + 0x492e6009, 0x0201f800, 0x00020afd, 0x0201f000, + 0x00020b9d, 0x492fc857, 0x4a025a07, 0x00000006, + 0x0201f000, 0x000203ef, 0x4c340000, 0x5930000a, + 0x800001c0, 0x04000011, 0x82006c00, 0x00000011, + 0x50340000, 0x80000540, 0x0400000a, 0x81300580, + 0x04000005, 0x50340000, 0x82006c00, 0x00000000, + 0x0401f7f8, 0x59300000, 0x44006800, 0x497a6000, + 0x5c006800, 0x1c01f000, 0x59300c07, 0x82040580, + 0x00000005, 0x040007fb, 0x82040580, 0x00000011, + 0x040007f8, 0x82040580, 0x00000006, 0x040007f5, + 0x82040580, 0x00000001, 0x040007f2, 0x0201f800, + 0x0010032e, 0x4933c857, 0x4c080000, 0x4c0c0000, + 0x4c580000, 0x59a81018, 0x59cc1807, 0x820c1d00, + 0x00ffffff, 0x800c0110, 0x80083580, 0x04020014, + 0x83cc1400, 0x00000008, 0x4200b000, 0x00000002, + 0x5930000a, 0x82001c00, 0x00000006, 0x0201f800, + 0x00108c57, 0x0402000a, 0x83cc1400, 0x0000000a, + 0x4200b000, 0x00000002, 0x5930000a, 0x82001c00, + 0x00000008, 0x0201f800, 0x00108c57, 0x5c00b000, + 0x5c001800, 0x5c001000, 0x1c01f000, 0x4933c856, + 0x493a6403, 0x0201f800, 0x0010421b, 0x0201f000, + 0x00101e2e, 0x493bc857, 0x4d2c0000, 0x0201f800, + 0x00100583, 0x02000800, 0x0010032e, 0x832cac00, + 0x00000006, 0x4c580000, 0x4c540000, 0x4200b000, + 0x00000006, 0x4578a800, 0x8054a800, 0x8058b040, + 0x040207fd, 0x83380580, 0x00000046, 0x04020004, + 0x4a025805, 0x00000144, 0x0401f008, 0x4a025805, + 0x00000146, 0x83380580, 0x00000041, 0x04000003, + 0x4a025a07, 0x00000001, 0x59cc0007, 0x82000500, + 0xff000000, 0x80000110, 0x59cc1008, 0x82081500, + 0xff000000, 0x80081540, 0x480a580b, 0x83380580, + 0x00000046, 0x04020006, 0x59cc0007, 0x82000500, + 0x00ffffff, 0x4802580c, 0x0401f005, 0x59cc0008, + 0x82000500, 0x00ffffff, 0x4802580c, 0x83380580, + 0x00000046, 0x04020004, 0x83cc1400, 0x00000009, + 0x0401f003, 0x83cc1400, 0x0000000d, 0x50080000, + 0x9c0001c0, 0x4802580d, 0x80081000, 0x50080000, + 0x9c0001c0, 0x4802580e, 0x83380580, 0x00000046, + 0x04020008, 0x59cc000b, 0x9c0001c0, 0x4802580f, + 0x59cc000c, 0x9c0001c0, 0x48025810, 0x0401f007, + 0x59cc000f, 0x9c0001c0, 0x4802580f, 0x59cc0010, + 0x9c0001c0, 0x48025810, 0x83380580, 0x00000046, + 0x04020004, 0x83cc1400, 0x00000011, 0x0401f003, + 0x83cc1400, 0x00000015, 0x412c3000, 0x82183400, + 0x00000011, 0x4200b000, 0x00000004, 0x50080000, + 0x9c0001c0, 0x44003000, 0x80081000, 0x80183000, + 0x8058b040, 0x040207fa, 0x5c00a800, 0x5c00b000, + 0x0201f800, 0x000203ef, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x492fc857, 0x5930080a, 0x58040200, + 0x8c00051e, 0x04000004, 0x592c0209, 0x84000558, + 0x48025a09, 0x1c01f000, 0x59e0180f, 0x599c0413, + 0x800c1000, 0x80080580, 0x04020002, 0x41781000, + 0x59e00010, 0x59e00810, 0x80040d80, 0x040207fd, + 0x80080580, 0x0400000b, 0x4c080000, 0x599c0814, + 0x599c1015, 0x800c00cc, 0x80040c00, 0x82081440, + 0x00000000, 0x5c001800, 0x82000540, 0x00000001, + 0x4803c857, 0x1c01f000, 0x59300203, 0x4933c857, + 0x4937c857, 0x493bc857, 0x4803c857, 0x82003480, + 0x0000000e, 0x02021800, 0x0010032e, 0x0c01f001, + 0x0010b4ea, 0x0010b60f, 0x0010b4ea, 0x0010b4ea, + 0x0010b4ea, 0x0010b4ea, 0x0010b4ea, 0x0010b56a, + 0x0010b4ec, 0x0010b4ea, 0x0010b4ea, 0x0010b4ea, + 0x0010b4ea, 0x0010b4ea, 0x0201f800, 0x0010032e, + 0x83380580, 0x0000004c, 0x02020800, 0x0010032e, + 0x0201f800, 0x00104956, 0x04020023, 0x59a80a1b, + 0x5932481c, 0x59240200, 0x82000500, 0x000000e0, + 0x82000580, 0x00000080, 0x0400001b, 0x8c040d12, + 0x04000032, 0x59cc0806, 0x82040d00, 0xff000000, + 0x82040580, 0x03000000, 0x04000020, 0x82040580, + 0x50000000, 0x04000005, 0x82040580, 0x52000000, + 0x02020000, 0x00020b9d, 0x83340580, 0x0010e23c, + 0x04000006, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010ff80, 0x5c027800, 0x4a026403, 0x00000001, + 0x0401f014, 0x59cc0806, 0x82040d00, 0xff000000, + 0x82040580, 0x03000000, 0x04000008, 0x82040580, + 0x50000000, 0x04000005, 0x82040580, 0x52000000, + 0x02020000, 0x00020b9d, 0x4a026403, 0x00000009, + 0x4a02641b, 0x00000009, 0x4a02621b, 0x00000000, + 0x4a026407, 0x00000004, 0x4a026203, 0x00000001, + 0x0201f000, 0x00106d1c, 0x59240400, 0x8c00050a, + 0x04020023, 0x0201f800, 0x0010c0f9, 0x04020020, + 0x59cc0806, 0x4807c857, 0x82040d00, 0xff000000, + 0x82040580, 0x03000000, 0x04000013, 0x82040580, + 0x20000000, 0x04000010, 0x82040580, 0x21000000, + 0x0400000d, 0x82040580, 0x24000000, 0x0400000a, + 0x82040580, 0x50000000, 0x04000007, 0x82040580, + 0x52000000, 0x04000004, 0x82040580, 0x05000000, + 0x0402000a, 0x9c0431c0, 0x42028000, 0x00000046, + 0x42002800, 0x00000001, 0x0401fc39, 0x0401f92d, + 0x02000800, 0x0010032e, 0x42002000, 0x00000051, + 0x0201f800, 0x0010800d, 0x59cc0000, 0x82000500, + 0x00ffffff, 0x82000580, 0x00ffffff, 0x04000005, + 0x4a026203, 0x00000007, 0x493a6403, 0x1c01f000, + 0x59325818, 0x812e59c0, 0x02020800, 0x0010059d, + 0x0201f000, 0x00020b9d, 0x4d2c0000, 0x4c580000, + 0x4c500000, 0x4c540000, 0x41385000, 0x83380580, + 0x00000054, 0x02020800, 0x0010032e, 0x59325809, + 0x592c0c0c, 0x82040d00, 0x0000e000, 0x82040580, + 0x00002000, 0x04020080, 0x59300818, 0x800409c0, + 0x04000016, 0x58041405, 0x41cca800, 0x8204a400, + 0x00000006, 0x82080480, 0x00000010, 0x04021005, + 0x4008b000, 0x0201f800, 0x0010c086, 0x0401f00b, + 0x40001000, 0x4200b000, 0x0000000f, 0x0201f800, + 0x0010c086, 0x58040801, 0x800409c0, 0x040207f0, + 0x0201f800, 0x0010032e, 0x83340580, 0x0010e23c, + 0x04000065, 0x59344c00, 0x592c0c0a, 0x4807c857, + 0x4827c857, 0x82040d00, 0x000000ff, 0x82040580, + 0x00000003, 0x0400002a, 0x82040580, 0x00000005, + 0x04000031, 0x82040580, 0x00000020, 0x0400003d, + 0x82040580, 0x00000052, 0x04000049, 0x82040580, + 0x00000050, 0x04000049, 0x82040580, 0x00000021, + 0x04000004, 0x82040580, 0x00000024, 0x0402004a, + 0x82240500, 0x0000ff00, 0x82000580, 0x00000700, + 0x04000008, 0x42000800, 0x00000009, 0x0201f800, + 0x001045ea, 0x42005000, 0x0000000c, 0x0401f03e, + 0x4a025a07, 0x00000031, 0x4a02580e, 0x00000009, + 0x59340400, 0x4802580f, 0x0201f800, 0x000203ef, + 0x0201f800, 0x00107eb4, 0x0401f044, 0x41780800, + 0x0201f800, 0x001046e4, 0x42000800, 0x00000003, + 0x0201f800, 0x001045ea, 0x42005000, 0x00000008, + 0x0401f029, 0x59cc3800, 0x821c3d00, 0x00ffffff, + 0x4c1c0000, 0x0201f800, 0x00101fc9, 0x5c003800, + 0x04020021, 0x59cc0007, 0x0201f800, 0x001063d6, + 0x0402001d, 0x4a026c00, 0x00000707, 0x0401f01a, + 0x82240500, 0x0000ff00, 0x82000580, 0x00000700, + 0x040007d8, 0x82240500, 0x000000ff, 0x82000580, + 0x00000009, 0x040007d3, 0x0201f800, 0x00104752, + 0x42005000, 0x0000000a, 0x0401f00b, 0x42005000, + 0x0000000e, 0x0401f003, 0x42005000, 0x00000010, + 0x82240500, 0x0000ff00, 0x82000580, 0x00000700, + 0x040007c4, 0x482a6403, 0x4a026203, 0x00000001, + 0x592c000e, 0x48026012, 0x497a6014, 0x59a8002b, + 0x48026006, 0x417a7800, 0x0201f800, 0x00106d1c, + 0x59325818, 0x812e59c0, 0x04000004, 0x0201f800, + 0x0010059d, 0x497a6018, 0x5c00a800, 0x5c00a000, + 0x5c00b000, 0x5c025800, 0x1c01f000, 0x4d2c0000, + 0x59325809, 0x83380580, 0x00000013, 0x0402003c, + 0x492fc857, 0x59300c03, 0x82040580, 0x00000054, + 0x04000030, 0x82040580, 0x00000010, 0x0400002a, + 0x82040580, 0x0000000e, 0x04000027, 0x59341400, + 0x82081d00, 0x0000ff00, 0x82081500, 0x000000ff, + 0x82040580, 0x00000008, 0x04000013, 0x82040580, + 0x0000000c, 0x04000013, 0x82040580, 0x0000000a, + 0x02020800, 0x0010032e, 0x820c0580, 0x00000700, + 0x04000018, 0x82080580, 0x00000009, 0x04000015, + 0x42000800, 0x00000006, 0x0201f800, 0x001045ea, + 0x0401f010, 0x42000000, 0x00000003, 0x0401f003, + 0x42000000, 0x00000009, 0x80080580, 0x04020009, + 0x42000800, 0x00000004, 0x0201f800, 0x001045ea, + 0x0401f004, 0x59340200, 0x8400051a, 0x48026a00, + 0x4a025a07, 0x00000000, 0x0201f800, 0x000203ef, + 0x0201f800, 0x00020b9d, 0x0401f024, 0x83380580, + 0x00000027, 0x0400000f, 0x83380580, 0x00000014, + 0x02020800, 0x0010032e, 0x492fc857, 0x0201f800, + 0x00106d91, 0x42028000, 0x00000031, 0x42000800, + 0x00000004, 0x42001000, 0x000000ff, 0x0401f00a, + 0x492fc857, 0x0201f800, 0x00106d91, 0x42028000, + 0x00000031, 0x42000800, 0x00000004, 0x42001000, + 0x00000010, 0x49425a07, 0x4806580e, 0x480a580f, + 0x0201f800, 0x000203ef, 0x0201f800, 0x00104cbe, + 0x0201f800, 0x00107eb4, 0x5c025800, 0x1c01f000, + 0x492fc857, 0x42007000, 0x00020cf0, 0x58380806, + 0x492c7006, 0x800409c0, 0x04020004, 0x492c7007, + 0x0201f000, 0x00020026, 0x492c0800, 0x1c01f000, + 0x4d2c0000, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4933c857, 0x4937c857, 0x59cc0806, 0x4807c857, + 0x82040d00, 0xff000000, 0x82040580, 0x03000000, + 0x0400000d, 0x82040580, 0x05000000, 0x0400000a, + 0x82040580, 0x21000000, 0x04000032, 0x82040580, + 0x24000000, 0x0400002f, 0x82040580, 0x20000000, + 0x04020031, 0x0201f800, 0x00100583, 0x0400002e, + 0x492fc857, 0x492e6018, 0x59a8b05a, 0x8258b400, + 0x0000001b, 0x8258b500, 0xfffffffc, 0x8058b104, + 0x485a5c05, 0x412c7800, 0x41cca000, 0x82580480, + 0x00000010, 0x04021006, 0x832cac00, 0x00000006, + 0x0201f800, 0x0010c086, 0x0401f016, 0x40580800, + 0x4200b000, 0x0000000f, 0x832cac00, 0x00000006, + 0x0201f800, 0x0010c086, 0x8204b480, 0x0000000f, + 0x0201f800, 0x00100583, 0x04000004, 0x492c7801, + 0x412c7800, 0x0401f7ea, 0x59325818, 0x0201f800, + 0x0010059d, 0x497a6018, 0x80000580, 0x0401f006, + 0x59340200, 0x84000554, 0x48026a00, 0x82000540, + 0x00000001, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x492fc857, + 0x4d2c0000, 0x59300a03, 0x82040580, 0x00000007, + 0x04000037, 0x82040580, 0x00000001, 0x02020800, + 0x0010032e, 0x0201f800, 0x00106e41, 0x4df00000, + 0x598c000f, 0x81300580, 0x04020016, 0x59300004, + 0x8c000520, 0x04000004, 0x84000520, 0x48026004, + 0x0401f016, 0x42001000, 0x0010ce5b, 0x50081000, + 0x58080002, 0x82000580, 0x00000100, 0x04000006, + 0x5808000b, 0x81300580, 0x02020800, 0x0010032e, + 0x0401f00a, 0x0201f800, 0x00107161, 0x04020021, + 0x59300004, 0x8c000520, 0x04000004, 0x84000520, + 0x48026004, 0x0401f004, 0x0201f800, 0x001101de, + 0x80c40040, 0x5c03e000, 0x02000800, 0x00106e2e, + 0x0201f800, 0x0010989f, 0x02000800, 0x0010032e, + 0x59325809, 0x4a025a07, 0x00000005, 0x0201f800, + 0x000203ef, 0x0201f800, 0x00104cbe, 0x59325818, + 0x812e59c0, 0x02020800, 0x0010059d, 0x0201f800, + 0x00107eb4, 0x80000580, 0x5c025800, 0x1c01f000, + 0x5c03e000, 0x02000800, 0x00106e2e, 0x59300c07, + 0x82040580, 0x00000011, 0x040007b7, 0x0401f7f7, + 0x4c040000, 0x59340200, 0x4803c857, 0x8c00051c, + 0x04000009, 0x59cc0805, 0x591c001a, 0x4803c857, + 0x80040580, 0x04000004, 0x80000580, 0x4803c856, + 0x0401f003, 0x82000540, 0x00000001, 0x5c000800, + 0x1c01f000, 0x4c000000, 0x4c0c0000, 0x4c100000, + 0x42001800, 0x0000ffff, 0x42002000, 0x00000004, + 0x0401f013, 0x4c000000, 0x4c0c0000, 0x4c100000, + 0x5930200a, 0x58101c03, 0x42002000, 0x00000004, + 0x0401f00b, 0x4c000000, 0x4c0c0000, 0x4c100000, + 0x5930200a, 0x801021c0, 0x02000800, 0x0010032e, + 0x58101c03, 0x42002000, 0x00000007, 0x480fc857, + 0x4813c857, 0x481bc857, 0x0201f800, 0x00101fb4, + 0x0201f800, 0x00103a21, 0x5c002000, 0x5c001800, + 0x5c000000, 0x1c01f000, 0x8d0e1d20, 0x0400000c, + 0x4d400000, 0x4d200000, 0x42024000, 0x000000ff, + 0x850e1d44, 0x42028000, 0x0000002a, 0x0201f800, + 0x0010b198, 0x5c024000, 0x5c028000, 0x1c01f000, + 0x59a8021b, 0x8c000508, 0x04000005, 0x599c0017, + 0x8c00050a, 0x04020002, 0x1c01f000, 0x82000540, + 0x00000001, 0x1c01f000, 0x59300429, 0x84000540, + 0x48026429, 0x1c01f000, 0x4c640000, 0x0201f800, + 0x00109ccc, 0x59300203, 0x82000580, 0x00000008, + 0x04020015, 0x4200c800, 0x00000032, 0x42000000, + 0x20000000, 0x41300800, 0x0201f800, 0x001008c7, + 0x0400000d, 0x59300203, 0x82000580, 0x00000008, + 0x04020009, 0x42000000, 0x0000001e, 0x80000040, + 0x040207ff, 0x8064c840, 0x040207f1, 0x0201f800, + 0x0010032e, 0x0201f800, 0x00109ce4, 0x5c00c800, + 0x1c01f000, 0x0201f800, 0x00100583, 0x02000800, + 0x0010032e, 0x59340403, 0x49265802, 0x49365803, + 0x4a025a05, 0x00000055, 0x48025c07, 0x4a025c08, + 0x00001000, 0x59340802, 0x82040d00, 0x00ffffff, + 0x59300403, 0x82000580, 0x00000086, 0x42000000, + 0x85000000, 0x04020003, 0x42000000, 0x84000000, + 0x80040540, 0x4802580a, 0x59240005, 0x4802580b, + 0x42000000, 0x00990000, 0x59300c07, 0x82040d80, + 0x00000005, 0x04000002, 0x8400052e, 0x4802580c, + 0x497a580d, 0x59cc0004, 0x4802580e, 0x497a580f, + 0x42000800, 0x00030300, 0x59300403, 0x82000580, + 0x00000086, 0x04020006, 0x59cc0004, 0x48025811, + 0x4a025812, 0x0000ffff, 0x41780800, 0x48065810, + 0x1c01f000, 0x492fc857, 0x59a82852, 0x801429c0, + 0x0400005f, 0x4c5c0000, 0x4c600000, 0x4c640000, + 0x4d2c0000, 0x4d300000, 0x42026000, 0x00111500, + 0x592c0c07, 0x592c100a, 0x82081500, 0x00ffffff, + 0x592c180b, 0x592c200e, 0x40165800, 0x4014c000, + 0x4014c800, 0x592c0205, 0x82000580, 0x00000155, + 0x0402003e, 0x592c0407, 0x80040580, 0x0402003b, + 0x592c000a, 0x82000500, 0x00ffffff, 0x80080580, + 0x04020036, 0x592c000b, 0x82000500, 0x00ffffff, + 0x800c0580, 0x04020031, 0x592c000e, 0x80100580, + 0x0402002e, 0x4c040000, 0x4c080000, 0x4c0c0000, + 0x4c100000, 0x40640000, 0x812c0580, 0x0402001b, + 0x59300203, 0x82000580, 0x00000000, 0x04000013, + 0x59300009, 0x800001c0, 0x04000010, 0x0201f800, + 0x00106e41, 0x4df00000, 0x0201f800, 0x00106d2b, + 0x0201f800, 0x00110148, 0x80c40040, 0x04020003, + 0x4a026203, 0x00000000, 0x5c03e000, 0x02000800, + 0x00106e2e, 0x497a6009, 0x592cc800, 0x4064c000, + 0x4064b800, 0x0401f003, 0x592cb800, 0x485cc000, + 0x4a025a07, 0x00000005, 0x0201f800, 0x000203ef, + 0x405e5800, 0x5c002000, 0x5c001800, 0x5c001000, + 0x5c000800, 0x0401f003, 0x412cc000, 0x592e5800, + 0x812e59c0, 0x040207bc, 0x48675052, 0x48635053, + 0x0201f800, 0x00107e2a, 0x5c026000, 0x5c025800, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x42000800, 0x0000000b, 0x0401f006, 0x42000800, + 0x00000004, 0x0401f003, 0x42000800, 0x00000001, + 0x4d2c0000, 0x59325809, 0x812e59c0, 0x04000012, + 0x592c0205, 0x82000500, 0x000000ff, 0x82000580, + 0x0000000e, 0x0402000c, 0x592c0000, 0x48026009, + 0x497a5800, 0x48065a09, 0x0201f800, 0x00105d3b, + 0x04000003, 0x0401fe37, 0x0401f003, 0x0201f800, + 0x000203ef, 0x5c025800, 0x1c01f000, 0x42001000, + 0x00001000, 0x80081040, 0x04000010, 0x0201f800, + 0x0010c0d6, 0x040007fc, 0x42001000, 0x00007b00, + 0x5808081c, 0x4a030000, 0x00000000, 0x82040d00, + 0xffff0000, 0x82040580, 0x84320000, 0x04020003, + 0x4a035078, 0x8000001b, 0x1c01f000, 0x4d340000, + 0x4d440000, 0x599c0018, 0x82000500, 0xffffffcf, + 0x82000540, 0x00000010, 0x48033818, 0x599c0019, + 0x82000500, 0xffff1fff, 0x82000540, 0x00006000, + 0x48033819, 0x42003000, 0x0000fc0e, 0x417a8800, + 0x0201f800, 0x0010462d, 0x42003000, 0x0010c280, + 0x45783000, 0x49375079, 0x4a026c03, 0x0000ffff, + 0x497a6806, 0x497a6807, 0x4a026c08, 0x000004b0, + 0x4a026a08, 0x00000014, 0x497a6809, 0x4a026c04, + 0x00000008, 0x5c028800, 0x5c026800, 0x1c01f000, + 0x4a038893, 0x00000001, 0x59340400, 0x82000500, + 0x000000ff, 0x82000580, 0x00000003, 0x04000017, + 0x0201f800, 0x00107f02, 0x04000014, 0x4933c857, + 0x59aa6879, 0x4936600a, 0x4a026407, 0x00000012, + 0x42000800, 0x00000003, 0x0201f800, 0x001045ea, + 0x42001000, 0x00000008, 0x0201f800, 0x001074c1, + 0x4a0378e4, 0x0c000000, 0x42027000, 0x000000d0, + 0x0201f800, 0x00020bc1, 0x1c01f000, 0x4d400000, + 0x4d340000, 0x0201f800, 0x00106e41, 0x4df00000, + 0x59aa6879, 0x42028000, 0x00000029, 0x0401f9cc, + 0x4a026c00, 0x00000707, 0x5c03e000, 0x02000800, + 0x00106e2e, 0x5c026800, 0x5c028000, 0x1c01f000, + 0x4a03c013, 0x00010001, 0x4a03c014, 0x00010001, + 0x4a03c013, 0x00010000, 0x42000000, 0x0000000f, + 0x80000040, 0x040207ff, 0x4a03c013, 0x00010001, + 0x1c01f000, 0x4803c856, 0x592c0a07, 0x8c040d1e, + 0x04020008, 0x80140110, 0x80000040, 0x04000022, + 0x4a033006, 0x0010b8e1, 0x0201f000, 0x000206d1, + 0x80140110, 0x80000040, 0x02020000, 0x0010564a, + 0x592c0208, 0x82000c80, 0x00001001, 0x04001003, + 0x0201f000, 0x0010565a, 0x592c1014, 0x82080500, + 0xffff0003, 0x02020000, 0x0010565a, 0x4202e000, + 0x00000002, 0x42000000, 0x0010e2e7, 0x50007000, + 0x592c0012, 0x592c0813, 0x48007006, 0x48047007, + 0x492c700a, 0x4978700d, 0x4978700b, 0x0201f000, + 0x00105cf9, 0x59a80878, 0x8c040d3e, 0x02000000, + 0x00105642, 0x59aa6879, 0x59340400, 0x82000580, + 0x00000404, 0x04020053, 0x59a80078, 0x8c000506, + 0x0402004c, 0x592c080a, 0x48066809, 0x592c1207, + 0x59341806, 0x8c081506, 0x04000002, 0x59341807, + 0x480e580a, 0x8c081502, 0x04020005, 0x40040000, + 0x800c0480, 0x0400102d, 0x0401f02f, 0x592c0810, + 0x82040500, 0x00000003, 0x0402004a, 0x592c0011, + 0x80000540, 0x04020011, 0x592c000f, 0x82000500, + 0x00000003, 0x04020043, 0x0201f800, 0x00020b7b, + 0x04000038, 0x4932580b, 0x4a026407, 0x00000012, + 0x492e6009, 0x4936600a, 0x42027000, 0x000000d1, + 0x0201f000, 0x00020bc1, 0x592e600b, 0x0201f800, + 0x00109d04, 0x0400002f, 0x59300407, 0x82000580, + 0x00000012, 0x0402002b, 0x59300809, 0x800409c0, + 0x04020015, 0x59300203, 0x82000580, 0x00000007, + 0x04020024, 0x492e6009, 0x42027000, 0x000000d9, + 0x0201f000, 0x00020bc1, 0x8c081500, 0x040007d4, + 0x480e580a, 0x59a80078, 0x8400054c, 0x84000508, + 0x48035078, 0x4a025a07, 0x00000000, 0x0201f000, + 0x000203ef, 0x58041000, 0x800811c0, 0x04000003, + 0x40080800, 0x0401f7fc, 0x492c0800, 0x1c01f000, + 0x4a025a07, 0x00000028, 0x0201f000, 0x000203ef, + 0x4a025a07, 0x00000029, 0x0201f000, 0x000203ef, + 0x4a025a07, 0x0000002c, 0x0201f000, 0x000203ef, + 0x4a025a07, 0x00000008, 0x0201f000, 0x000203ef, + 0x4a025a07, 0x00000003, 0x4a025c07, 0x00000002, + 0x0201f000, 0x000203ef, 0x4803c856, 0x80140110, + 0x80000040, 0x04000005, 0x4a033006, 0x0010b956, + 0x0201f000, 0x000206d1, 0x59a80878, 0x8c040d3e, + 0x02000000, 0x00105642, 0x592c0a07, 0x82040480, + 0x00000004, 0x02021000, 0x0010565a, 0x59a80078, + 0x8c000506, 0x0402001d, 0x59aa6879, 0x59340400, + 0x82000580, 0x00000404, 0x0402001c, 0x0201f800, + 0x00020b7b, 0x0400001d, 0x4a026407, 0x00000012, + 0x492e6009, 0x4936600a, 0x592c0a07, 0x82040580, + 0x00000002, 0x04000004, 0x592c0010, 0x800001c0, + 0x04000016, 0x82040400, 0x0010b97a, 0x50027000, + 0x0201f000, 0x00020bc1, 0x000000d4, 0x000000d5, + 0x000000d3, 0x000000d6, 0x4a025a07, 0x00000028, + 0x0201f000, 0x000203ef, 0x4a025a07, 0x00000029, + 0x0201f000, 0x000203ef, 0x4a025a07, 0x0000002c, + 0x0201f000, 0x000203ef, 0x0201f800, 0x00020b9d, + 0x0201f000, 0x0010565a, 0x492fc857, 0x59a80878, + 0x8c040d3e, 0x42000800, 0x00004001, 0x040000b6, + 0x59a80078, 0x8c000506, 0x42000800, 0x00000028, + 0x040200b1, 0x59aa6879, 0x59340400, 0x82000580, + 0x00000404, 0x42000800, 0x00000029, 0x040200aa, + 0x4a025a05, 0x0000012b, 0x4a025806, 0xaa00feed, + 0x4a025a07, 0x00000004, 0x4a025a08, 0x00000001, + 0x59a0020b, 0x48025810, 0x48025814, 0x48025a0a, + 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, + 0x480a5812, 0x59a0040a, 0x59a0120a, 0x900811c0, + 0x80081540, 0x480a5813, 0x59a00407, 0x48025a0b, + 0x59a0040b, 0x48025c0b, 0x0201f800, 0x00020b7b, + 0x42000800, 0x0000002c, 0x0400008b, 0x4a026407, + 0x00000012, 0x492e6009, 0x4936600a, 0x42027000, + 0x000000de, 0x0201f000, 0x00020bc1, 0x59cc0801, + 0x82040d00, 0x00ffffff, 0x82040580, 0x0000fc0e, + 0x04020014, 0x59cc0800, 0x82040d00, 0x00ffffff, + 0x82040580, 0x0000fc0e, 0x04020010, 0x59cc0c00, + 0x80040910, 0x82040580, 0x00000022, 0x04000011, + 0x82040580, 0x00000023, 0x04000027, 0x82040580, + 0x00000005, 0x0400004e, 0x4807c857, 0x0401f008, + 0x4807c857, 0x0401f006, 0x4807c857, 0x42000000, + 0x0010cfb2, 0x0201f800, 0x0010bfb3, 0x1c01f000, + 0x59cc0806, 0x59a80078, 0x8c00050a, 0x04020010, + 0x82040580, 0x05000000, 0x0402000d, 0x42027000, + 0x000000da, 0x0201f800, 0x00107f02, 0x59aa6879, + 0x4936600a, 0x4a026407, 0x00000013, 0x59cc0404, + 0x48026202, 0x0201f000, 0x00020bc1, 0x4807c857, + 0x42000000, 0x0010cfb2, 0x0201f800, 0x0010bfb3, + 0x1c01f000, 0x0201f800, 0x00106268, 0x0400001f, + 0x59300c07, 0x82040580, 0x00000012, 0x02020800, + 0x001003f5, 0x0402001c, 0x5932680a, 0x59cc0a04, + 0x48066202, 0x59300004, 0x8c00053e, 0x02020800, + 0x00107226, 0x04020014, 0x42027000, 0x000000dc, + 0x59cc0806, 0x82040580, 0x02000000, 0x02000000, + 0x00020bc1, 0x82040580, 0x01000000, 0x02020800, + 0x001003f5, 0x04020008, 0x42027000, 0x000000dd, + 0x0201f000, 0x00020bc1, 0x59cc0c04, 0x4807c857, + 0x0401f002, 0x4933c857, 0x42000000, 0x0010cfb2, + 0x0201f800, 0x0010bfb3, 0x1c01f000, 0x0201f800, + 0x00106268, 0x04000013, 0x59300c07, 0x82040580, + 0x00000012, 0x02020800, 0x001003f5, 0x04020010, + 0x5932680a, 0x59cc0a04, 0x48066202, 0x59300004, + 0x8c00053e, 0x02020800, 0x00107226, 0x04020008, + 0x42027000, 0x000000db, 0x0201f000, 0x00020bc1, + 0x59cc0c04, 0x4807c857, 0x0401f002, 0x4933c857, + 0x42000000, 0x0010cfb2, 0x0201f800, 0x0010bfb3, + 0x1c01f000, 0x492fc857, 0x4807c857, 0x82040580, + 0x00000000, 0x02000000, 0x001022c6, 0x4a034207, + 0x00004005, 0x48074407, 0x0201f000, 0x001022c9, + 0x48066004, 0x59bc00ea, 0x8c000516, 0x040207fe, + 0x83300400, 0xc0000000, 0x480378e1, 0x1c01f000, + 0x4d300000, 0x598c000d, 0x80026540, 0x0400000e, + 0x0201f800, 0x00106e27, 0x0201f800, 0x00106e15, + 0x59300000, 0x800001c0, 0x04000004, 0x4803180d, + 0x497a6000, 0x0401f003, 0x497b180d, 0x497b180c, + 0x80000580, 0x5c026000, 0x1c01f000, 0x4d2c0000, + 0x4d300000, 0x4d340000, 0x4c5c0000, 0x4178b800, + 0x598e600d, 0x813261c0, 0x0400000b, 0x0201f800, + 0x00106d2b, 0x59300000, 0x4c000000, 0x405c3000, + 0x0401f826, 0x0201f800, 0x001101fa, 0x5c026000, + 0x0401f7f5, 0x5c00b800, 0x5c026800, 0x5c026000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4c5c0000, + 0x813261c0, 0x02000800, 0x0010032e, 0x41300000, + 0x598cb80d, 0x41783000, 0x805cb9c0, 0x0400000f, + 0x805c0d80, 0x04000004, 0x405c3000, 0x5818b800, + 0x0401f7fa, 0x0401f80d, 0x598c000f, 0x81300580, + 0x02000800, 0x001074ce, 0x497a6008, 0x80000580, + 0x5c00b800, 0x1c01f000, 0x82000540, 0x00000001, + 0x5c00b800, 0x1c01f000, 0x59300800, 0x497a6000, + 0x0201f800, 0x00106e15, 0x801831c0, 0x04020009, + 0x598c000c, 0x81300580, 0x04020004, 0x4803180c, + 0x4803180d, 0x0401f008, 0x4807180d, 0x0401f006, + 0x48043000, 0x598c000c, 0x81300580, 0x04020002, + 0x481b180c, 0x0201f000, 0x00106e27, 0x59325809, + 0x59300c03, 0x82040480, 0x000000df, 0x04021004, + 0x82040480, 0x000000d0, 0x0401f002, 0x81780040, + 0x04001002, 0x0c01f008, 0x4933c857, 0x493bc857, + 0x42000000, 0x0010cfb4, 0x0201f800, 0x0010bfb3, + 0x1c01f000, 0x0010baeb, 0x0010bb02, 0x0010bb1f, + 0x0010bb30, 0x0010bb41, 0x0010bb54, 0x0010bb67, + 0x0010bb7b, 0x0010bac2, 0x0010bac2, 0x0010bac2, + 0x0010bac2, 0x0010bac2, 0x0010bac2, 0x0010bad8, + 0x42000800, 0x00000022, 0x0401f8d1, 0x592c0a0a, + 0x4805a207, 0x592c0a0b, 0x4805a208, 0x592c0c0b, + 0x4805a408, 0x4a01a006, 0x0c000000, 0x59340408, + 0x48026006, 0x42000800, 0x00000003, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x42000800, + 0x00000022, 0x0401f8be, 0x497b8880, 0x59a8001f, + 0x82000500, 0x0000ffff, 0x4c000000, 0x0201f800, + 0x001015e5, 0x5c000000, 0x48038880, 0x4a01a006, + 0x03000000, 0x4801a207, 0x59a80004, 0x4801a407, + 0x42000800, 0x00000002, 0x42001000, 0x0000dc00, + 0x0201f000, 0x00107d64, 0x42000800, 0x00000022, + 0x0401f8a7, 0x592c0a07, 0x592c100f, 0x592c0010, + 0x80080580, 0x82000500, 0x00000003, 0x0402008c, + 0x82080500, 0x00000003, 0x04020089, 0x42001800, + 0x00000002, 0x8c040d06, 0x04020003, 0x42001800, + 0x00000001, 0x4a01a006, 0x04000000, 0x4809a007, + 0x480da008, 0x42000800, 0x00000003, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x42000800, + 0x00000022, 0x0401f88a, 0x59300819, 0x5930101a, + 0x5930181b, 0x4a01a006, 0x06000000, 0x4805a007, + 0x4809a008, 0x480da009, 0x42000800, 0x00000004, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107d64, + 0x42000800, 0x00000022, 0x0401f879, 0x592c0a0a, + 0x592c100b, 0x592c180c, 0x4a01a006, 0x07000000, + 0x4805a207, 0x480da008, 0x4809a009, 0x42000800, + 0x00000004, 0x42001000, 0x0000dc00, 0x0201f000, + 0x00107d64, 0x42000800, 0x00000022, 0x0401f868, + 0x592c080a, 0x592c1010, 0x82080500, 0xfffc0003, + 0x0402004f, 0x80081104, 0x4a01a006, 0x08000000, + 0x4805a007, 0x4809a008, 0x42000800, 0x00000003, + 0x42001000, 0x0000dc00, 0x0201f000, 0x00107d64, + 0x42000800, 0x00000022, 0x0401f855, 0x592c080a, + 0x592c1010, 0x82080500, 0xfffc0003, 0x0402003c, + 0x80081104, 0x4a01a006, 0x09000000, 0x4805a007, + 0x4809a008, 0x42000800, 0x00000003, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x42000800, + 0x00000022, 0x0401f842, 0x592c080a, 0x592c1010, + 0x592c180b, 0x82080500, 0xffff0000, 0x04020028, + 0x4a01a006, 0x0a000000, 0x4805a207, 0x480da407, + 0x4809a008, 0x42000800, 0x00000003, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x42000800, + 0x00000022, 0x0401f82e, 0x4a01a006, 0x0b000000, + 0x42000800, 0x00000001, 0x42001000, 0x0000dc00, + 0x0201f000, 0x00107d64, 0x59300c03, 0x82040580, + 0x000000d8, 0x04000003, 0x0201f800, 0x0010032e, + 0x42000800, 0x00000023, 0x0401f81d, 0x4a01a006, + 0x02000000, 0x42000800, 0x00000001, 0x42001000, + 0x0000dc00, 0x0201f000, 0x00107d64, 0x592c0006, + 0x4803c857, 0x480bc857, 0x0201f800, 0x00106d91, + 0x4a025a07, 0x00000003, 0x4a025c07, 0x00000002, + 0x592c0205, 0x82000500, 0x000000ff, 0x82000580, + 0x0000002b, 0x04020002, 0x480a5808, 0x0201f800, + 0x000203ef, 0x0201f000, 0x00020b9d, 0x81a5a000, + 0x4a01a001, 0x0000fc0e, 0x4979a005, 0x4979a003, + 0x4a034800, 0x00000011, 0x59307002, 0x82040580, + 0x00000022, 0x04020007, 0x4a01a000, 0x2200fc0e, + 0x4a01a002, 0xfe290000, 0x4839a004, 0x1c01f000, + 0x82040580, 0x00000023, 0x02020800, 0x0010032e, + 0x4a01a000, 0x2300fc0e, 0x4a01a002, 0xfe980000, + 0x903871c0, 0x4839a004, 0x1c01f000, 0x4a034800, + 0x00000011, 0x81a5a000, 0x4a01a000, 0x0100fc0e, + 0x4a01a001, 0x0000fc0e, 0x4a01a002, 0xfe000008, + 0x41781000, 0x42000800, 0x01000000, 0x592c0205, + 0x82000500, 0x000000ff, 0x82000580, 0x0000001b, + 0x04020006, 0x592c1011, 0x592c0207, 0x8c00051c, + 0x04020002, 0x41780800, 0x4805a003, 0x59300002, + 0x4801a004, 0x4809a005, 0x59340c08, 0x42001000, + 0x00000100, 0x0201f800, 0x00106c7e, 0x0201f800, + 0x00106604, 0x83180d40, 0x00000038, 0x42001000, + 0x0000c920, 0x0201f000, 0x00107d83, 0x59300a03, + 0x82040480, 0x00000009, 0x04021004, 0x82040480, + 0x00000001, 0x0401f002, 0x81780040, 0x0c021002, + 0x0401f22c, 0x0010bc01, 0x0010bc1e, 0x0010bc7e, + 0x0010bcc0, 0x0010be24, 0x0010be24, 0x0010bd20, + 0x0010bd49, 0x83380580, 0x00000013, 0x04000015, + 0x83380580, 0x00000014, 0x0402021e, 0x59300c03, + 0x4807c857, 0x0201f800, 0x00106d91, 0x0201f800, + 0x0010989f, 0x04000009, 0x4d2c0000, 0x59325809, + 0x4a025a07, 0x00000001, 0x497a5c07, 0x0201f800, + 0x000203ef, 0x5c025800, 0x0201f000, 0x00107eb4, + 0x59300c03, 0x82040580, 0x000000d8, 0x04020209, + 0x0201f000, 0x00020b9d, 0x83380480, 0x000000de, + 0x04021004, 0x83380480, 0x000000db, 0x0401f002, + 0x81780040, 0x040011ff, 0x0c01f001, 0x0010bc2a, + 0x0010bc40, 0x0010bc4a, 0x59300c03, 0x82040580, + 0x000000d1, 0x0400000c, 0x82040580, 0x000000d5, + 0x040201f4, 0x42000800, 0x80000000, 0x4a026203, + 0x00000002, 0x4a026403, 0x000000d9, 0x0201f000, + 0x00020b30, 0x59340408, 0x48026006, 0x42000800, + 0x80000040, 0x4a026203, 0x00000003, 0x0401f7f6, + 0x59300c03, 0x82040480, 0x000000da, 0x04021004, + 0x82040480, 0x000000d0, 0x0401f002, 0x81780040, + 0x0c02101b, 0x0401f1db, 0x0201f800, 0x0010989f, + 0x0402000a, 0x59300c03, 0x82040580, 0x000000d2, + 0x040201d4, 0x42000000, 0x0010cfb1, 0x0401fb60, + 0x0201f000, 0x00020b9d, 0x4933c857, 0x59cc1207, + 0x80081110, 0x4d2c0000, 0x59325809, 0x4a025a07, + 0x00000003, 0x480a5c07, 0x0201f800, 0x000203ef, + 0x5c025800, 0x0201f000, 0x00020b9d, 0x0010bd78, + 0x0010be24, 0x0010bc71, 0x0010bc71, 0x0010be24, + 0x0010bc71, 0x0010be24, 0x0010bc6d, 0x0010be24, + 0x0010bdb8, 0x41780800, 0x0401fa83, 0x0201f000, + 0x00020b9d, 0x0201f800, 0x0010989f, 0x04000009, + 0x4d2c0000, 0x59325809, 0x4a025a07, 0x00000000, + 0x497a5c07, 0x0201f800, 0x000203ef, 0x5c025800, + 0x0201f000, 0x00020b9d, 0x0201f800, 0x0010989f, + 0x0400003e, 0x83380580, 0x0000004a, 0x0400002c, + 0x83380580, 0x00000049, 0x0402019e, 0x4d2c0000, + 0x59325809, 0x592c0a05, 0x82040500, 0x000000ff, + 0x82000580, 0x0000001b, 0x04020019, 0x592c0207, + 0x8c00051c, 0x0402000f, 0x4a025a07, 0x00000040, + 0x497a5c07, 0x592c0000, 0x48026009, 0x0201f800, + 0x000203ef, 0x5c025800, 0x4a026203, 0x00000007, + 0x59300009, 0x800001c0, 0x04020082, 0x1c01f000, + 0x59a80078, 0x8400050a, 0x48035078, 0x4a026203, + 0x00000002, 0x5c025800, 0x1c01f000, 0x4a025a07, + 0x00000000, 0x497a5c07, 0x0201f800, 0x000203ef, + 0x5c025800, 0x0201f000, 0x00020b9d, 0x4933c857, + 0x0201f800, 0x0010707a, 0x0201f800, 0x00106d71, + 0x4d2c0000, 0x59325809, 0x4a025a07, 0x00000001, + 0x497a5c07, 0x0201f800, 0x000203ef, 0x5c025800, + 0x0201f000, 0x00020b9d, 0x4803c856, 0x0401f165, + 0x0201f800, 0x0010989f, 0x0400002c, 0x83380480, + 0x00000054, 0x04021004, 0x83380480, 0x00000047, + 0x0401f002, 0x81780040, 0x04001006, 0x4d2c0000, + 0x59325809, 0x0c01f823, 0x5c025800, 0x1c01f000, + 0x83380580, 0x000000dd, 0x04020152, 0x4933c857, + 0x0201f800, 0x00100c76, 0x0201f800, 0x0010989f, + 0x04000016, 0x592c0a07, 0x82040580, 0x00000004, + 0x04020006, 0x42000800, 0x00000001, 0x0401fd6a, + 0x0201f000, 0x00020b9d, 0x4d2c0000, 0x59325809, + 0x59cc1207, 0x80081110, 0x4a025a07, 0x00000003, + 0x480a5c07, 0x0201f800, 0x000203ef, 0x5c025800, + 0x0201f000, 0x00020b9d, 0x4803c856, 0x0401f135, + 0x0010bd1c, 0x0010bcfd, 0x0010be24, 0x0010be24, + 0x0010be24, 0x0010be24, 0x0010be24, 0x0010be24, + 0x0010be24, 0x0010be24, 0x0010be24, 0x0010be24, + 0x0010bcfd, 0x59300812, 0x82040500, 0xffff0000, + 0x0402001c, 0x42001000, 0x00000000, 0x592c0a07, + 0x82040580, 0x00000004, 0x0402000e, 0x82080580, + 0x00000007, 0x04000007, 0x59300812, 0x800409c0, + 0x04000004, 0x4807c857, 0x42001000, 0x00000015, + 0x40080800, 0x0401fd38, 0x0201f000, 0x00020b9d, + 0x59300812, 0x48065808, 0x480a5a07, 0x497a5c07, + 0x0201f800, 0x000203ef, 0x0201f000, 0x00020b9d, + 0x4803c856, 0x42001000, 0x00000007, 0x0401f7e4, + 0x0201f800, 0x0010989f, 0x0400001b, 0x83380580, + 0x000000d9, 0x040200ff, 0x59340408, 0x48026006, + 0x4a026403, 0x000000d9, 0x0201f800, 0x00020168, + 0x59306809, 0x58340207, 0x8c00051c, 0x04020006, + 0x42000800, 0x80000040, 0x4a026203, 0x00000003, + 0x0401f005, 0x42000800, 0x80000000, 0x4a026203, + 0x00000002, 0x4a026403, 0x000000d9, 0x0201f000, + 0x00020b30, 0x4803c856, 0x83380580, 0x000000dd, + 0x040200e4, 0x42001000, 0x0000800f, 0x42001800, + 0x00000005, 0x59cc2207, 0x80102110, 0x0201f000, + 0x001039ac, 0x83380480, 0x000000df, 0x04021004, + 0x83380480, 0x000000d0, 0x0401f002, 0x81780040, + 0x040010d4, 0x4933c857, 0x493bc857, 0x59340a08, + 0x48066006, 0x0c01f001, 0x0010bd6a, 0x0010bd66, + 0x0010bd6a, 0x0010bd6a, 0x0010bd70, 0x0010bd68, + 0x0010bd70, 0x0010bd6a, 0x0010bd65, 0x0010bd65, + 0x0010bd65, 0x0010bd65, 0x0010bd65, 0x0010bd65, + 0x0010bd70, 0x0401f0bf, 0x59340408, 0x48026006, + 0x0201f800, 0x00020168, 0x4a026203, 0x00000002, + 0x493a6403, 0x42000800, 0x80000000, 0x0401f4e5, + 0x0201f800, 0x0002011a, 0x4a026203, 0x00000004, + 0x493a6403, 0x42000800, 0x80000000, 0x0401f4dd, + 0x59cc0207, 0x59cc0c07, 0x59cc1008, 0x59cc1809, + 0x59cc220a, 0x59cc2c0a, 0x59cc300b, 0x4a026c00, + 0x00000404, 0x48026c04, 0x48038893, 0x48035012, + 0x48066a04, 0x480a6806, 0x480e6807, 0x48126a08, + 0x48166c08, 0x8c183500, 0x0400000d, 0x59cc200d, + 0x59cc280d, 0x4813c857, 0x4817c857, 0x59cc200c, + 0x42001000, 0x0000800f, 0x42001800, 0x00000001, + 0x901029c0, 0x0201f800, 0x001039ad, 0x59a80878, + 0x42001800, 0x00000003, 0x84040d4e, 0x59342007, + 0x8c183502, 0x0402000c, 0x82040d00, 0xffffff7b, + 0x8c183504, 0x04020004, 0x42001800, 0x00000002, + 0x0401f004, 0x42001800, 0x00000004, 0x84040d44, + 0x59342006, 0x48075078, 0x42001000, 0x0000800f, + 0x82102d00, 0xffff0000, 0x80142920, 0x82102500, + 0x0000ffff, 0x0201f800, 0x001039ad, 0x59c80040, + 0x84000534, 0x48039040, 0x0201f000, 0x00020b9d, + 0x0201f800, 0x0010989f, 0x04000023, 0x4d2c0000, + 0x59325809, 0x592c0a05, 0x82040d00, 0x000000ff, + 0x82040580, 0x0000001b, 0x04020019, 0x592c0a07, + 0x8c040d04, 0x04020003, 0x0201f800, 0x0010b8ac, + 0x59340009, 0x4802580a, 0x8c040d06, 0x04020007, + 0x48026806, 0x59a80078, 0x8400054c, 0x84000508, + 0x48035078, 0x0401f002, 0x48026807, 0x4a025a07, + 0x00000000, 0x497a5c07, 0x0201f800, 0x000203ef, + 0x5c025800, 0x0201f000, 0x00020b9d, 0x497a5808, + 0x0401f7f7, 0x4803c856, 0x0401f046, 0x59300a03, + 0x82040480, 0x00000009, 0x04021004, 0x82040480, + 0x00000001, 0x0401f002, 0x81780040, 0x0c021002, + 0x0401f03c, 0x0010bdf1, 0x0010be24, 0x0010be24, + 0x0010be24, 0x0010be24, 0x0010be24, 0x0010be24, + 0x0010bdfd, 0x83380580, 0x00000013, 0x04000008, + 0x83380580, 0x00000014, 0x0402002e, 0x59300c03, + 0x4807c857, 0x0201f800, 0x00106d91, 0x0201f000, + 0x00020b9d, 0x83380580, 0x000000da, 0x04020025, + 0x4933c857, 0x493bc857, 0x59cc0808, 0x59cc1007, + 0x59a81878, 0x820c1d00, 0xfffffffc, 0x82040580, + 0x00000000, 0x04020002, 0x840c1d42, 0x82080580, + 0x00000000, 0x04020002, 0x840c1d40, 0x480f5078, + 0x480fc857, 0x836c0580, 0x00000001, 0x0400000a, + 0x4202d800, 0x00000004, 0x4a035038, 0x00000000, + 0x497b5058, 0x42000000, 0x00000080, 0x0201f800, + 0x0010155d, 0x4a026403, 0x000000d8, 0x4a026203, + 0x00000001, 0x42000800, 0x80000040, 0x0401f431, + 0x4933c857, 0x493bc857, 0x59300203, 0x4803c857, + 0x59300403, 0x4803c857, 0x42000000, 0x0010cfb3, + 0x0401f987, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x4d3c0000, 0x417a5800, 0x417a7800, 0x0201f800, + 0x0010989f, 0x04000003, 0x59325809, 0x592e7a09, + 0x0401f81a, 0x82000540, 0x00000001, 0x5c027800, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x4d3c0000, 0x42027800, 0x00000040, 0x42000000, + 0x0010cfae, 0x0401f96e, 0x417a5800, 0x0201f800, + 0x0010989f, 0x04000005, 0x59325809, 0x592e7a09, + 0x853e7d4c, 0x493e5a09, 0x0401f804, 0x5c027800, + 0x5c025800, 0x1c01f000, 0x0201f800, 0x00106e41, + 0x4df00000, 0x0401f88b, 0x4803c857, 0x82000c80, + 0x00000009, 0x04021006, 0x0c01f808, 0x5c03e000, + 0x02000800, 0x00106e2e, 0x1c01f000, 0x42000000, + 0x00000006, 0x0401f7f9, 0x0010beb7, 0x0010beb8, + 0x0010be71, 0x0010bece, 0x0010bed9, 0x0010be6b, + 0x0010be6b, 0x0010be6b, 0x0010beb7, 0x4d380000, + 0x417a7000, 0x0401ffb7, 0x5c027000, 0x0201f000, + 0x00107eb4, 0x812e59c0, 0x04000021, 0x42001000, + 0x00000002, 0x833c0500, 0x00000081, 0x04020007, + 0x42001000, 0x00000006, 0x8d3e7d0c, 0x04020003, + 0x42001000, 0x00000004, 0x592c0a07, 0x82040580, + 0x00000004, 0x04020006, 0x40080800, 0x0201f800, + 0x0010ba49, 0x0201f000, 0x00107eb4, 0x480a5a07, + 0x0201f800, 0x000203ef, 0x59300403, 0x82000580, + 0x000000d0, 0x04020004, 0x5930100a, 0x4a001400, + 0x00000707, 0x0201f000, 0x00107eb4, 0x59300c03, + 0x82040580, 0x000000d7, 0x04020005, 0x42000800, + 0x00000004, 0x0401f858, 0x0401f7f0, 0x8d3e7d0c, + 0x040007ee, 0x5932680a, 0x59300816, 0x59340412, + 0x80040580, 0x04020007, 0x42000000, 0x0010cfaf, + 0x0401f90f, 0x0201f800, 0x0010b8ac, 0x0401f7e3, + 0x4933c857, 0x80040800, 0x48066016, 0x4d380000, + 0x59327403, 0x83380580, 0x000000d0, 0x04020003, + 0x4a038893, 0x00000001, 0x4a026203, 0x00000008, + 0x0201f800, 0x00020bc1, 0x5c027000, 0x1c01f000, + 0x8d3e7d0c, 0x04000006, 0x59300407, 0x82000580, + 0x00000013, 0x02000000, 0x00109606, 0x598c000f, + 0x4803c857, 0x81300580, 0x04020004, 0x0201f800, + 0x00107161, 0x040207ac, 0x0201f800, 0x0010ba86, + 0x040007a9, 0x4803c856, 0x0201f800, 0x00106d4c, + 0x040007a5, 0x0401f79e, 0x0201f800, 0x00109552, + 0x04020004, 0x0201f800, 0x0010712a, 0x0402079e, + 0x0201f800, 0x00110065, 0x80c40040, 0x040207f2, + 0x0401f799, 0x812e59c0, 0x04000006, 0x0201f800, + 0x00106e2e, 0x0201f800, 0x00100c76, 0x0401f792, + 0x59300004, 0x8c00053e, 0x0400000d, 0x8c00050c, + 0x0402000b, 0x59306c03, 0x82340580, 0x000000d9, + 0x04020004, 0x42000000, 0x00000003, 0x0401f005, + 0x42000000, 0x00000001, 0x0401f002, 0x59300203, + 0x1c01f000, 0x5931d82a, 0x58ef400a, 0x58ee580c, + 0x58ec0008, 0x48074407, 0x0801f800, 0x1c01f000, + 0x4817c857, 0x4c000000, 0x4c040000, 0x8c142d2a, + 0x04000004, 0x5988011e, 0x80000000, 0x4803111e, + 0x8c142d2e, 0x04000004, 0x5988011f, 0x80000000, + 0x4803111f, 0x8c142d2c, 0x04000013, 0x40140000, + 0x82000500, 0x00070000, 0x82000d80, 0x00030000, + 0x0400000d, 0x82000d80, 0x00040000, 0x0400000a, + 0x82000d80, 0x00050000, 0x04000007, 0x59880005, + 0x80000000, 0x48031005, 0x59880120, 0x80000000, + 0x48031120, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x4817c857, 0x4c000000, 0x4c040000, 0x8c142d2a, + 0x04000004, 0x59880121, 0x80000000, 0x48031121, + 0x8c142d2e, 0x04000004, 0x59880122, 0x80000000, + 0x48031122, 0x8c142d2c, 0x04000013, 0x40140000, + 0x82000500, 0x00070000, 0x82000d80, 0x00030000, + 0x0400000d, 0x82000d80, 0x00040000, 0x0400000a, + 0x82000d80, 0x00050000, 0x04000007, 0x59880005, + 0x80000000, 0x48031005, 0x59880123, 0x80000000, + 0x48031123, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x4807c857, 0x4c000000, 0x8c040d2c, 0x04000004, + 0x5988010c, 0x80000000, 0x4803110c, 0x8c040d2a, + 0x04000004, 0x5988010d, 0x80000000, 0x4803110d, + 0x8c040d28, 0x04000004, 0x5988010e, 0x80000000, + 0x4803110e, 0x8c040d26, 0x04000004, 0x5988010f, + 0x80000000, 0x4803110f, 0x8c040d24, 0x04000004, + 0x59880110, 0x80000000, 0x48031110, 0x8c040d22, + 0x04000004, 0x59880111, 0x80000000, 0x48031111, + 0x8c040d20, 0x04000004, 0x59880112, 0x80000000, + 0x48031112, 0x5c000000, 0x1c01f000, 0x4807c857, + 0x4c000000, 0x59880113, 0x80000000, 0x48031113, 0x5c000000, 0x1c01f000, 0x4807c857, 0x4c000000, - 0x8c040d08, 0x04000004, 0x5988011b, 0x80000000, - 0x4803111b, 0x8c040d04, 0x04000004, 0x5988011c, - 0x80000000, 0x4803111c, 0x5c000000, 0x1c01f000, - 0x4807c856, 0x4c000000, 0x598800e5, 0x80000000, - 0x480310e5, 0x5c000000, 0x1c01f000, 0x40680000, - 0x5c036000, 0x4db00000, 0x49b3c857, 0x4c040000, - 0x50000800, 0x80040800, 0x04001002, 0x44040000, - 0x5c000800, 0x1c01f000, 0x480fc857, 0x4c000000, - 0x820c0580, 0x00000000, 0x04020004, 0x42000000, - 0x0010cbe5, 0x0401f014, 0x820c0580, 0x00001001, - 0x04020004, 0x42000000, 0x0010cbe6, 0x0401f00e, - 0x820c0580, 0x00001002, 0x04020004, 0x42000000, - 0x0010cbe7, 0x0401f008, 0x820c0c80, 0x0000201c, - 0x02021800, 0x0010032e, 0x820c0500, 0x0000001f, - 0x0c01f804, 0x0401ffdb, 0x5c000000, 0x1c01f000, - 0x0010bccc, 0x0010bccf, 0x0010bcd2, 0x0010bcd5, - 0x0010bcd8, 0x0010bcdb, 0x0010bcde, 0x0010bce1, - 0x0010bce4, 0x0010bce7, 0x0010bcea, 0x0010bced, - 0x0010bcf0, 0x0010bcf3, 0x0010bcf6, 0x0010bcf9, - 0x0010bcfc, 0x0010bcff, 0x0010bd02, 0x0010bd05, - 0x0010bd08, 0x0010bd0b, 0x0010bd0e, 0x0010bd11, - 0x0010bd14, 0x0010bd17, 0x0010bd1a, 0x0010bd1d, - 0x42000000, 0x0010cbe8, 0x1c01f000, 0x42000000, - 0x0010cbe9, 0x1c01f000, 0x42000000, 0x0010cbea, - 0x1c01f000, 0x42000000, 0x0010cbeb, 0x1c01f000, - 0x42000000, 0x0010cbec, 0x1c01f000, 0x42000000, - 0x0010cbed, 0x1c01f000, 0x42000000, 0x0010cbee, - 0x1c01f000, 0x42000000, 0x0010cbef, 0x1c01f000, - 0x42000000, 0x0010cbf0, 0x1c01f000, 0x42000000, - 0x0010cbf1, 0x1c01f000, 0x42000000, 0x0010cbf2, - 0x1c01f000, 0x42000000, 0x0010cbf3, 0x1c01f000, - 0x42000000, 0x0010cbf4, 0x1c01f000, 0x42000000, - 0x0010cbf5, 0x1c01f000, 0x42000000, 0x0010cbf6, - 0x1c01f000, 0x42000000, 0x0010cbf7, 0x1c01f000, - 0x42000000, 0x0010cbf8, 0x1c01f000, 0x42000000, - 0x0010cbf9, 0x1c01f000, 0x42000000, 0x0010cbfa, - 0x1c01f000, 0x42000000, 0x0010cbfb, 0x1c01f000, - 0x42000000, 0x0010cbfc, 0x1c01f000, 0x42000000, - 0x0010cbfd, 0x1c01f000, 0x42000000, 0x0010cbfe, - 0x1c01f000, 0x42000000, 0x0010cbff, 0x1c01f000, - 0x42000000, 0x0010cc00, 0x1c01f000, 0x42000000, - 0x0010cc01, 0x1c01f000, 0x42000000, 0x0010cc02, - 0x1c01f000, 0x42000000, 0x0010cc03, 0x1c01f000, - 0x480fc857, 0x4c000000, 0x820c0580, 0x00000001, - 0x04020004, 0x42000000, 0x0010cb68, 0x0401f012, - 0x820c0580, 0x00000002, 0x04020004, 0x42000000, - 0x0010cb69, 0x0401f00c, 0x820c0580, 0x00000003, - 0x04020004, 0x42000000, 0x0010cb6a, 0x0401f006, - 0x820c0580, 0x00000004, 0x04020004, 0x42000000, - 0x0010cb6b, 0x0401ff4f, 0x5c000000, 0x1c01f000, - 0x4c000000, 0x59a8021b, 0x4803c857, 0x59240a00, - 0x8c040d0a, 0x04000010, 0x8c000506, 0x04000004, - 0x42000000, 0x0010cb73, 0x0401f012, 0x8c00050a, - 0x04000004, 0x42000000, 0x0010cb72, 0x0401f00d, - 0x8c000508, 0x04000004, 0x42000000, 0x0010cb75, - 0x0401f008, 0x0201f800, 0x00104fc6, 0x04000006, - 0x8c000506, 0x04020004, 0x42000000, 0x0010cb74, - 0x0401ff30, 0x5c000000, 0x1c01f000, 0x8058b1c0, - 0x02000800, 0x0010032e, 0x5450a800, 0x8050a000, - 0x8054a800, 0x8058b040, 0x040207fc, 0x1c01f000, - 0x8058b1c0, 0x02000800, 0x0010032e, 0x4450a800, - 0x8054a800, 0x8058b040, 0x040207fd, 0x1c01f000, - 0x4813c857, 0x4817c857, 0x40140000, 0x80100480, - 0x02021800, 0x0010032e, 0x497bc841, 0x42007800, - 0x000000ff, 0x40100000, 0x80140480, 0x82006d00, - 0xffffff00, 0x04020002, 0x40007800, 0x4813c840, - 0x483fc842, 0x04011000, 0x40100000, 0x803c2400, - 0x40100000, 0x80140580, 0x040207f3, 0x45782800, - 0x1c01f000, 0x8058b1c0, 0x02000800, 0x0010032e, - 0x50500000, 0x9c0001c0, 0x4400a800, 0x8050a000, - 0x8054a800, 0x8058b040, 0x040207fa, 0x1c01f000, - 0x4c000000, 0x59a80007, 0x8c00051c, 0x5c000000, + 0x8c040d1c, 0x04000004, 0x59880114, 0x80000000, + 0x48031114, 0x8c040d1a, 0x04000004, 0x59880115, + 0x80000000, 0x48031115, 0x5c000000, 0x1c01f000, + 0x4807c857, 0x4c000000, 0x8c040d18, 0x04000004, + 0x59880116, 0x80000000, 0x48031116, 0x8c040d16, + 0x04000004, 0x59880117, 0x80000000, 0x48031117, + 0x8c040d14, 0x04000004, 0x59880118, 0x80000000, + 0x48031118, 0x5c000000, 0x1c01f000, 0x4807c857, + 0x4c000000, 0x8c040d10, 0x04000004, 0x59880119, + 0x80000000, 0x48031119, 0x8c040d0c, 0x04000004, + 0x5988011a, 0x80000000, 0x4803111a, 0x5c000000, + 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d08, + 0x04000004, 0x5988011b, 0x80000000, 0x4803111b, + 0x8c040d04, 0x04000004, 0x5988011c, 0x80000000, + 0x4803111c, 0x5c000000, 0x1c01f000, 0x4807c856, + 0x4c000000, 0x598800e5, 0x80000000, 0x480310e5, + 0x5c000000, 0x1c01f000, 0x40680000, 0x5c036000, + 0x4db00000, 0x49b3c857, 0x4c040000, 0x50000800, + 0x80040800, 0x04001002, 0x44040000, 0x5c000800, + 0x1c01f000, 0x480fc857, 0x4c000000, 0x820c0580, + 0x00000000, 0x04020004, 0x42000000, 0x0010cee5, + 0x0401f014, 0x820c0580, 0x00001001, 0x04020004, + 0x42000000, 0x0010cee6, 0x0401f00e, 0x820c0580, + 0x00001002, 0x04020004, 0x42000000, 0x0010cee7, + 0x0401f008, 0x820c0c80, 0x0000201c, 0x02021800, + 0x0010032e, 0x820c0500, 0x0000001f, 0x0c01f804, + 0x0401ffdb, 0x5c000000, 0x1c01f000, 0x0010bff7, + 0x0010bffa, 0x0010bffd, 0x0010c000, 0x0010c003, + 0x0010c006, 0x0010c009, 0x0010c00c, 0x0010c00f, + 0x0010c012, 0x0010c015, 0x0010c018, 0x0010c01b, + 0x0010c01e, 0x0010c021, 0x0010c024, 0x0010c027, + 0x0010c02a, 0x0010c02d, 0x0010c030, 0x0010c033, + 0x0010c036, 0x0010c039, 0x0010c03c, 0x0010c03f, + 0x0010c042, 0x0010c045, 0x0010c048, 0x42000000, + 0x0010cee8, 0x1c01f000, 0x42000000, 0x0010cee9, + 0x1c01f000, 0x42000000, 0x0010ceea, 0x1c01f000, + 0x42000000, 0x0010ceeb, 0x1c01f000, 0x42000000, + 0x0010ceec, 0x1c01f000, 0x42000000, 0x0010ceed, + 0x1c01f000, 0x42000000, 0x0010ceee, 0x1c01f000, + 0x42000000, 0x0010ceef, 0x1c01f000, 0x42000000, + 0x0010cef0, 0x1c01f000, 0x42000000, 0x0010cef1, + 0x1c01f000, 0x42000000, 0x0010cef2, 0x1c01f000, + 0x42000000, 0x0010cef3, 0x1c01f000, 0x42000000, + 0x0010cef4, 0x1c01f000, 0x42000000, 0x0010cef5, + 0x1c01f000, 0x42000000, 0x0010cef6, 0x1c01f000, + 0x42000000, 0x0010cef7, 0x1c01f000, 0x42000000, + 0x0010cef8, 0x1c01f000, 0x42000000, 0x0010cef9, + 0x1c01f000, 0x42000000, 0x0010cefa, 0x1c01f000, + 0x42000000, 0x0010cefb, 0x1c01f000, 0x42000000, + 0x0010cefc, 0x1c01f000, 0x42000000, 0x0010cefd, + 0x1c01f000, 0x42000000, 0x0010cefe, 0x1c01f000, + 0x42000000, 0x0010ceff, 0x1c01f000, 0x42000000, + 0x0010cf00, 0x1c01f000, 0x42000000, 0x0010cf01, + 0x1c01f000, 0x42000000, 0x0010cf02, 0x1c01f000, + 0x42000000, 0x0010cf03, 0x1c01f000, 0x480fc857, + 0x4c000000, 0x820c0580, 0x00000001, 0x04020004, + 0x42000000, 0x0010ce68, 0x0401f012, 0x820c0580, + 0x00000002, 0x04020004, 0x42000000, 0x0010ce69, + 0x0401f00c, 0x820c0580, 0x00000003, 0x04020004, + 0x42000000, 0x0010ce6a, 0x0401f006, 0x820c0580, + 0x00000004, 0x04020004, 0x42000000, 0x0010ce6b, + 0x0401ff4f, 0x5c000000, 0x1c01f000, 0x4c000000, + 0x59a8021b, 0x4803c857, 0x59240a00, 0x8c040d0a, + 0x04000010, 0x8c000506, 0x04000004, 0x42000000, + 0x0010ce73, 0x0401f012, 0x8c00050a, 0x04000004, + 0x42000000, 0x0010ce72, 0x0401f00d, 0x8c000508, + 0x04000004, 0x42000000, 0x0010ce75, 0x0401f008, + 0x0201f800, 0x001050f7, 0x04000006, 0x8c000506, + 0x04020004, 0x42000000, 0x0010ce74, 0x0401ff30, + 0x5c000000, 0x1c01f000, 0x8058b1c0, 0x02000800, + 0x0010032e, 0x5450a800, 0x8050a000, 0x8054a800, + 0x8058b040, 0x040207fc, 0x1c01f000, 0x8058b1c0, + 0x02000800, 0x0010032e, 0x4450a800, 0x8054a800, + 0x8058b040, 0x040207fd, 0x1c01f000, 0x4813c857, + 0x4817c857, 0x40140000, 0x80100480, 0x02021800, + 0x0010032e, 0x497bc841, 0x42007800, 0x000000ff, + 0x40100000, 0x80140480, 0x82006d00, 0xffffff00, + 0x04020002, 0x40007800, 0x4813c840, 0x483fc842, + 0x04011000, 0x40100000, 0x803c2400, 0x40100000, + 0x80140580, 0x040207f3, 0x45782800, 0x1c01f000, + 0x8058b1c0, 0x02000800, 0x0010032e, 0x50500000, + 0x9c0001c0, 0x4400a800, 0x8050a000, 0x8054a800, + 0x8058b040, 0x040207fa, 0x1c01f000, 0x4c000000, + 0x59a80007, 0x8c00051c, 0x5c000000, 0x1c01f000, + 0x0401f807, 0x42018800, 0x00000001, 0x04020003, + 0x42018800, 0x00000000, 0x1c01f000, 0x59a80007, + 0x8c000518, 0x1c01f000, 0x4200b000, 0x0010cfd0, + 0x5058b000, 0x1c01f000, 0x42006800, 0x0010cfd1, + 0x58340406, 0x8c000502, 0x040007f8, 0x4200b000, + 0x00000001, 0x1c01f000, 0x42006800, 0x00000064, + 0x80346840, 0x04000007, 0x4a030000, 0x00000001, + 0x40000000, 0x59807000, 0x8c387500, 0x040007f9, 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, 0x04020003, 0x42018800, 0x00000000, 0x1c01f000, - 0x59a80007, 0x8c000518, 0x1c01f000, 0x4200b000, - 0x0010ccd0, 0x5058b000, 0x1c01f000, 0x42006800, - 0x0010ccd1, 0x58340406, 0x8c000502, 0x040007f8, - 0x4200b000, 0x00000001, 0x1c01f000, 0x42006800, - 0x00000064, 0x80346840, 0x04000007, 0x4a030000, - 0x00000001, 0x40000000, 0x59807000, 0x8c387500, - 0x040007f9, 0x1c01f000, 0x00000001, 0x00000002, - 0x00000004, 0x00000008, 0x00000010, 0x00000020, - 0x00000040, 0x00000080, 0x00000100, 0x00000200, - 0x00000400, 0x00000800, 0x00001000, 0x00002000, - 0x00004000, 0x00008000, 0x00010000, 0x0010ccd1, - 0x0010ccdc, 0x0010cce7, 0x0010ccf2, 0x0010ccfd, - 0x0010cd08, 0x0010cd13, 0x0010cd1e, 0x0010cd29, - 0x0010cd34, 0x0010cd3f, 0x0010cd4a, 0x0010cd55, - 0x0010cd60, 0x0010cd6b, 0x0010cd76, 0x0010cd81, - 0x0010cd8c, 0x0010cd97, 0x0010cda2, 0x0010cdad, - 0x0010cdb8, 0x0010cdc3, 0x0010cdce, 0x0010cdd9, - 0x0010cde4, 0x0010cdef, 0x0010cdfa, 0x0010ce05, - 0x0010ce10, 0x0010ce1b, 0x0010ce26, 0x0010ce31, - 0x0010ce3c, 0x0010ce47, 0x0010ce52, 0x0010ce5d, - 0x0010ce68, 0x0010ce73, 0x0010ce7e, 0x0010ce89, - 0x0010ce94, 0x0010ce9f, 0x0010ceaa, 0x0010ceb5, - 0x0010cec0, 0x0010cecb, 0x0010ced6, 0x0010cee1, - 0x0010ceec, 0x0010cef7, 0x0010cf02, 0x0010cf0d, - 0x0010cf18, 0x0010cf23, 0x0010cf2e, 0x0010cf39, - 0x0010cf44, 0x0010cf4f, 0x0010cf5a, 0x0010cf65, - 0x0010cf70, 0x0010cf7b, 0x0010cf86, 0x0010cf91, - 0x0010cf9c, 0x0010cfa7, 0x0010cfb2, 0x0010cfbd, - 0x0010cfc8, 0x0010cfd3, 0x0010cfde, 0x0010cfe9, - 0x0010cff4, 0x0010cfff, 0x0010d00a, 0x0010d015, - 0x0010d020, 0x0010d02b, 0x0010d036, 0x0010d041, - 0x0010d04c, 0x0010d057, 0x0010d062, 0x0010d06d, - 0x0010d078, 0x0010d083, 0x0010d08e, 0x0010d099, - 0x0010d0a4, 0x0010d0af, 0x0010d0ba, 0x0010d0c5, - 0x0010d0d0, 0x0010d0db, 0x0010d0e6, 0x0010d0f1, - 0x0010d0fc, 0x0010d107, 0x0010d112, 0x0010d11d, - 0x0010d128, 0x0010d133, 0x0010d13e, 0x0010d149, - 0x0010d154, 0x0010d15f, 0x0010d16a, 0x0010d175, - 0x0010d180, 0x0010d18b, 0x0010d196, 0x0010d1a1, - 0x0010d1ac, 0x0010d1b7, 0x0010d1c2, 0x0010d1cd, - 0x0010d1d8, 0x0010d1e3, 0x0010d1ee, 0x0010d1f9, - 0x0010d204, 0x0010d20f, 0x0010d21a, 0x0010d225, - 0x0010d230, 0x0010d23b, 0x0010d246, 0x4a035071, - 0x0000001c, 0x4a035072, 0x00000013, 0x4a035073, - 0x00000001, 0x4a035074, 0x00000000, 0x59e00002, - 0x8c00051e, 0x42000000, 0x7ffe00fe, 0x04000003, - 0x42000000, 0x7ffe01fe, 0x50000800, 0x48075047, - 0x80040920, 0x82040580, 0x0000013e, 0x0402000b, - 0x59a80070, 0x84000548, 0x48035070, 0x4a035071, - 0x0000005a, 0x4a035072, 0x00000058, 0x4a035074, - 0x0000000f, 0x0401f045, 0x82040580, 0x0000013f, - 0x0400000a, 0x82040580, 0x0000014e, 0x04000007, - 0x82040580, 0x00000155, 0x04000004, 0x82040580, - 0x00000156, 0x0402000b, 0x59a80070, 0x8400054a, - 0x48035070, 0x4a035071, 0x00000055, 0x4a035072, - 0x00000052, 0x4a035074, 0x00000009, 0x0401f02f, - 0x59e00003, 0x82000500, 0x00030000, 0x82000580, - 0x00000000, 0x04020029, 0x82040580, 0x00000147, - 0x04000019, 0x82040580, 0x0000012c, 0x04000016, - 0x82040580, 0x0000012a, 0x04000007, 0x82040580, - 0x0000012b, 0x04000004, 0x82040580, 0x00000145, - 0x0402001a, 0x59a80070, 0x84000546, 0x48035070, - 0x4a035071, 0x0000003d, 0x4a035072, 0x00000038, - 0x4a035073, 0x0000001e, 0x4a035074, 0x00000001, - 0x0401f00c, 0x59a80070, 0x84000544, 0x48035070, - 0x4a035071, 0x0000003d, 0x4a035072, 0x00000038, - 0x4a035073, 0x0000001e, 0x4a035074, 0x00000001, - 0x4a0378e4, 0x000c0000, 0x59a80070, 0x8c000502, - 0x04000005, 0x82000500, 0x00000030, 0x02000800, - 0x0010032e, 0x1c01f000, 0x42b9a2d1, - 0x00000000, 0x00000000, 0x00112000, 0x0000368c, + 0x42006800, 0x0010cfd1, 0x58340406, 0x8c000504, + 0x1c01f000, 0x0401f807, 0x42018800, 0x00000001, + 0x04020003, 0x42018800, 0x00000000, 0x1c01f000, + 0x42006800, 0x0010cfd1, 0x58340406, 0x8c000508, + 0x1c01f000, 0x59a80006, 0x8c000516, 0x1c01f000, + 0x00000001, 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, + 0x00000100, 0x00000200, 0x00000400, 0x00000800, + 0x00001000, 0x00002000, 0x00004000, 0x00008000, + 0x00010000, 0x0010cfd1, 0x0010cfdc, 0x0010cfe7, + 0x0010cff2, 0x0010cffd, 0x0010d008, 0x0010d013, + 0x0010d01e, 0x0010d029, 0x0010d034, 0x0010d03f, + 0x0010d04a, 0x0010d055, 0x0010d060, 0x0010d06b, + 0x0010d076, 0x0010d081, 0x0010d08c, 0x0010d097, + 0x0010d0a2, 0x0010d0ad, 0x0010d0b8, 0x0010d0c3, + 0x0010d0ce, 0x0010d0d9, 0x0010d0e4, 0x0010d0ef, + 0x0010d0fa, 0x0010d105, 0x0010d110, 0x0010d11b, + 0x0010d126, 0x0010d131, 0x0010d13c, 0x0010d147, + 0x0010d152, 0x0010d15d, 0x0010d168, 0x0010d173, + 0x0010d17e, 0x0010d189, 0x0010d194, 0x0010d19f, + 0x0010d1aa, 0x0010d1b5, 0x0010d1c0, 0x0010d1cb, + 0x0010d1d6, 0x0010d1e1, 0x0010d1ec, 0x0010d1f7, + 0x0010d202, 0x0010d20d, 0x0010d218, 0x0010d223, + 0x0010d22e, 0x0010d239, 0x0010d244, 0x0010d24f, + 0x0010d25a, 0x0010d265, 0x0010d270, 0x0010d27b, + 0x0010d286, 0x0010d291, 0x0010d29c, 0x0010d2a7, + 0x0010d2b2, 0x0010d2bd, 0x0010d2c8, 0x0010d2d3, + 0x0010d2de, 0x0010d2e9, 0x0010d2f4, 0x0010d2ff, + 0x0010d30a, 0x0010d315, 0x0010d320, 0x0010d32b, + 0x0010d336, 0x0010d341, 0x0010d34c, 0x0010d357, + 0x0010d362, 0x0010d36d, 0x0010d378, 0x0010d383, + 0x0010d38e, 0x0010d399, 0x0010d3a4, 0x0010d3af, + 0x0010d3ba, 0x0010d3c5, 0x0010d3d0, 0x0010d3db, + 0x0010d3e6, 0x0010d3f1, 0x0010d3fc, 0x0010d407, + 0x0010d412, 0x0010d41d, 0x0010d428, 0x0010d433, + 0x0010d43e, 0x0010d449, 0x0010d454, 0x0010d45f, + 0x0010d46a, 0x0010d475, 0x0010d480, 0x0010d48b, + 0x0010d496, 0x0010d4a1, 0x0010d4ac, 0x0010d4b7, + 0x0010d4c2, 0x0010d4cd, 0x0010d4d8, 0x0010d4e3, + 0x0010d4ee, 0x0010d4f9, 0x0010d504, 0x0010d50f, + 0x0010d51a, 0x0010d525, 0x0010d530, 0x0010d53b, + 0x0010d546, 0x4a035071, 0x0000001c, 0x4a035072, + 0x00000013, 0x4a035073, 0x00000001, 0x4a035074, + 0x00000000, 0x59e00002, 0x8c00051e, 0x42000000, + 0x7ffe00fe, 0x04000003, 0x42000000, 0x7ffe01fe, + 0x50000800, 0x48075047, 0x80040920, 0x82040580, + 0x0000013e, 0x0402000b, 0x59a80070, 0x84000548, + 0x48035070, 0x4a035071, 0x0000005a, 0x4a035072, + 0x00000058, 0x4a035074, 0x0000000f, 0x0401f045, + 0x82040580, 0x0000013f, 0x0400000a, 0x82040580, + 0x0000014e, 0x04000007, 0x82040580, 0x00000155, + 0x04000004, 0x82040580, 0x00000156, 0x0402000b, + 0x59a80070, 0x8400054a, 0x48035070, 0x4a035071, + 0x00000055, 0x4a035072, 0x00000052, 0x4a035074, + 0x00000009, 0x0401f02f, 0x59e00003, 0x82000500, + 0x00030000, 0x82000580, 0x00000000, 0x04020029, + 0x82040580, 0x00000147, 0x04000019, 0x82040580, + 0x0000012c, 0x04000016, 0x82040580, 0x0000012a, + 0x04000007, 0x82040580, 0x0000012b, 0x04000004, + 0x82040580, 0x00000145, 0x0402001a, 0x59a80070, + 0x84000546, 0x48035070, 0x4a035071, 0x0000003d, + 0x4a035072, 0x00000038, 0x4a035073, 0x0000001e, + 0x4a035074, 0x00000001, 0x0401f00c, 0x59a80070, + 0x84000544, 0x48035070, 0x4a035071, 0x0000003d, + 0x4a035072, 0x00000038, 0x4a035073, 0x0000001e, + 0x4a035074, 0x00000001, 0x4a0378e4, 0x000c0000, + 0x59a80070, 0x8c000502, 0x04000005, 0x82000500, + 0x00000030, 0x02000800, 0x0010032e, 0x1c01f000, + 0x6b3597d5, + 0x00000000, 0x00000000, 0x00112000, 0x000036ba, 0x00000000, 0x00000000, 0x00020000, 0x00000cef, 0x836c0580, 0x00000003, 0x02020000, 0x001002bd, - 0x42000000, 0x0010c817, 0x50000000, 0x800001c0, + 0x42000000, 0x0010cb17, 0x50000000, 0x800001c0, 0x04020a5e, 0x0401fa08, 0x0201f800, 0x000205ce, 0x0401fbfb, 0x0201f800, 0x00020b27, 0x0201f800, 0x00020988, 0x0401f7ef, 0x42007000, 0x00020cf0, @@ -26782,7 +27044,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0010032e, 0x42007000, 0x00020cf0, 0x58380000, 0x82001480, 0x00000004, 0x0c001004, 0x0201f800, 0x0010032e, 0x1c01f000, 0x0002002c, 0x00020072, - 0x0002007b, 0x0010106b, 0x82040d00, 0x43000f80, + 0x0002007b, 0x0010106c, 0x82040d00, 0x43000f80, 0x02020000, 0x0010063a, 0x58380002, 0x80000540, 0x0400000a, 0x0201f000, 0x0010062c, 0x82040d00, 0x43000f80, 0x02020000, 0x0010063a, 0x58380002, @@ -26792,8 +27054,8 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x80040400, 0x58300807, 0x48006006, 0x82040c40, 0x00000000, 0x48046007, 0x4030d000, 0x0809f800, 0x0401f792, 0x59b800ea, 0x82000d00, 0xf0000038, - 0x02020000, 0x0010077b, 0x8c000510, 0x02000000, - 0x0010077a, 0x59ba60e0, 0x81300182, 0x0402104b, + 0x02020000, 0x00100779, 0x8c000510, 0x02000000, + 0x00100778, 0x59ba60e0, 0x81300182, 0x0402104b, 0x04002031, 0x8532653e, 0x59300407, 0x82000580, 0x00000003, 0x04020029, 0x59300203, 0x82000580, 0x00000004, 0x04020025, 0x59325809, 0x59300004, @@ -26803,8 +27065,8 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x5932680a, 0x0201f800, 0x00020b9d, 0x5934000f, 0x5934140b, 0x80081040, 0x04001002, 0x480a6c0b, 0x80000540, 0x04020a99, 0x59b800ea, 0x8c000510, - 0x040207d9, 0x1c01f000, 0x0201f800, 0x00107021, - 0x040007e9, 0x0201f000, 0x00100770, 0x59300220, + 0x040207d9, 0x1c01f000, 0x0201f800, 0x00107226, + 0x040007e9, 0x0201f000, 0x0010076e, 0x59300220, 0x48025c10, 0x0401f7ea, 0x42027000, 0x00000055, 0x0401f022, 0x83326500, 0x3fffffff, 0x59300407, 0x82000580, 0x00000003, 0x04020011, 0x59325809, @@ -26814,52 +27076,52 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x80000540, 0x04020a75, 0x0401f7dc, 0x42027000, 0x00000054, 0x0401f009, 0x83300500, 0x60000000, 0x04000016, 0x81326580, 0x8000013a, 0x82000400, - 0x00100781, 0x50027000, 0x59300c07, 0x82040580, - 0x00000002, 0x02000000, 0x00100770, 0x59300004, + 0x0010077f, 0x50027000, 0x59300c07, 0x82040580, + 0x00000002, 0x02000000, 0x0010076e, 0x59300004, 0x8c00053e, 0x04020004, 0x0201f800, 0x00020bc1, - 0x0401f7c6, 0x0201f800, 0x00107021, 0x040007fb, - 0x0201f000, 0x00100770, 0x83300500, 0x1f000000, - 0x02000000, 0x00100773, 0x81326580, 0x80000130, + 0x0401f7c6, 0x0201f800, 0x00107226, 0x040007fb, + 0x0201f000, 0x0010076e, 0x83300500, 0x1f000000, + 0x02000000, 0x00100771, 0x81326580, 0x80000130, 0x82000c80, 0x00000014, 0x02021800, 0x0010032e, - 0x1201f000, 0x00100785, 0x82000500, 0xf0000000, + 0x1201f000, 0x00100783, 0x82000500, 0xf0000000, 0x82040d00, 0x0fffffff, 0x80040d40, 0x4807c857, - 0x59b800ea, 0x8c000516, 0x02020000, 0x001008a1, + 0x59b800ea, 0x8c000516, 0x02020000, 0x0010089f, 0x480770e1, 0x1c01f000, 0x59325809, 0x412c7000, 0x58380a05, 0x82040d00, 0x000000ff, 0x82040580, - 0x00000068, 0x02000000, 0x00100b88, 0x82040580, - 0x00000072, 0x02000000, 0x00100ba5, 0x58380a05, - 0x82040500, 0x0000000f, 0x82000c00, 0x00100f0a, - 0x50044000, 0x0c01f001, 0x00100b71, 0x00100b71, - 0x0002013e, 0x00100b71, 0x00100b71, 0x00100b71, - 0x00100b71, 0x00100b71, 0x0002014e, 0x00100bbe, - 0x00100b71, 0x00100b73, 0x00100bac, 0x00100b71, - 0x00100b71, 0x00100b71, 0x5838040b, 0x8c000500, + 0x00000068, 0x02000000, 0x00100b89, 0x82040580, + 0x00000072, 0x02000000, 0x00100ba6, 0x58380a05, + 0x82040500, 0x0000000f, 0x82000c00, 0x00100f0b, + 0x50044000, 0x0c01f001, 0x00100b72, 0x00100b72, + 0x0002013e, 0x00100b72, 0x00100b72, 0x00100b72, + 0x00100b72, 0x00100b72, 0x0002014e, 0x00100bbf, + 0x00100b72, 0x00100b74, 0x00100bad, 0x00100b72, + 0x00100b72, 0x00100b72, 0x5838040b, 0x8c000500, 0x02000800, 0x0010032e, 0x50200000, 0x80387c00, 0x583c1002, 0x583c2800, 0x583c2001, 0x58380a08, 0x58383010, 0x59303808, 0x58384c09, 0x5838000e, 0x48026013, 0x0401f010, 0x5838020b, 0x8c000502, - 0x02000000, 0x00100b71, 0x50200000, 0x80387c00, + 0x02000000, 0x00100b72, 0x50200000, 0x80387c00, 0x583c2800, 0x583c2001, 0x583c1002, 0x592c0a08, 0x592c4c09, 0x592c3010, 0x59303808, 0x497a6013, 0x497a6014, 0x4816600f, 0x48126010, 0x480a6011, 0x481a6012, 0x80040840, 0x4806600e, 0x02020000, - 0x00100beb, 0x841c3d40, 0x481e6008, 0x1c01f000, + 0x00100bec, 0x841c3d40, 0x481e6008, 0x1c01f000, 0x4d2c0000, 0x59325809, 0x592c0a05, 0x4807c857, 0x82040d00, 0x000000ff, 0x82040500, 0x0000000f, - 0x1201f000, 0x00100d47, 0x41787800, 0x59325809, - 0x592c0c0b, 0x8c040d02, 0x02000000, 0x00100d88, + 0x1201f000, 0x00100d48, 0x41787800, 0x59325809, + 0x592c0c0b, 0x8c040d02, 0x02000000, 0x00100d89, 0x592c000e, 0x592c1010, 0x592c0a05, 0x480a6012, 0x48026013, 0x48026014, 0x82040d00, 0x000000ff, - 0x82040580, 0x00000072, 0x02000000, 0x00100d8f, + 0x82040580, 0x00000072, 0x02000000, 0x00100d90, 0x412c3000, 0x82040500, 0x0000000f, 0x82000400, - 0x00100f0a, 0x50003800, 0x8c3c7d0e, 0x04000002, + 0x00100f0b, 0x50003800, 0x8c3c7d0e, 0x04000002, 0x801c3800, 0x501c0000, 0x592c1a08, 0x4802600b, 0x481a600c, 0x481e600d, 0x480e600e, 0x843c7d4a, 0x403c1000, 0x1c01f000, 0x592c0a05, 0x497a6013, 0x41787800, 0x82040d00, 0x000000ff, 0x82040580, - 0x00000068, 0x02000000, 0x00100d93, 0x412c3000, + 0x00000068, 0x02000000, 0x00100d94, 0x412c3000, 0x592c1a08, 0x82040500, 0x0000000f, 0x82000400, - 0x00100f0a, 0x50004000, 0x8c3c7d0e, 0x04000002, + 0x00100f0b, 0x50004000, 0x8c3c7d0e, 0x04000002, 0x80204000, 0x50200000, 0x4802600b, 0x481a600c, 0x4822600d, 0x480e600e, 0x483e6004, 0x80000580, 0x1c01f000, 0x59e00004, 0x8c00050e, 0x040206aa, @@ -26881,17 +27143,17 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x000201f5, 0x000201f5, 0x000201f5, 0x000201f5, 0x000201f5, 0x4c000000, 0x4df00000, 0x4203e000, 0xb0100000, 0x41f00000, 0x81fe1500, 0x8d0a1512, - 0x02020800, 0x001013ae, 0x8d0a1518, 0x02020800, + 0x02020800, 0x001013af, 0x8d0a1518, 0x02020800, 0x00020b4a, 0x8d0a151a, 0x04020e93, 0x83080500, 0x00000d00, 0x04020804, 0x5c03e000, 0x5c000000, - 0x1801f000, 0x8d0a1516, 0x02020800, 0x00101202, + 0x1801f000, 0x8d0a1516, 0x02020800, 0x00101203, 0x8d0a1514, 0x04020fa4, 0x8d0a1508, 0x02020800, - 0x00100fcd, 0x8d0a1500, 0x02020000, 0x00020a80, - 0x1c01f000, 0x42000000, 0x0010c81d, 0x50000000, - 0x8c000504, 0x04000014, 0x42000000, 0x0010c81d, + 0x00100fce, 0x8d0a1500, 0x02020000, 0x00020a80, + 0x1c01f000, 0x42000000, 0x0010cb1d, 0x50000000, + 0x8c000504, 0x04000014, 0x42000000, 0x0010cb1d, 0x50000000, 0x8c000502, 0x04020002, 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, 0x42034000, - 0x0010c7ff, 0x59a0001e, 0x59a1d806, 0x84000502, + 0x0010caff, 0x59a0001e, 0x59a1d806, 0x84000502, 0x4803401e, 0x58ec0008, 0x0801f800, 0x5c03e000, 0x1c01f000, 0x04027002, 0x04026002, 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, 0x59e00020, @@ -26899,18 +27161,18 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00000044, 0x04020008, 0x4803c857, 0x42000800, 0x00020cf0, 0x58040800, 0x82040d80, 0x00000000, 0x0402001d, 0x0201f800, 0x00100583, 0x0400001a, - 0x412dd800, 0x48efc857, 0x0201f800, 0x001039b6, - 0x42034000, 0x0010c7ff, 0x49a1d80a, 0x48ef4006, + 0x412dd800, 0x48efc857, 0x0201f800, 0x00103aa6, + 0x42034000, 0x0010caff, 0x49a1d80a, 0x48ef4006, 0x59a0001e, 0x84000544, 0x4803401e, 0x59e00020, 0x4803c857, 0x59e00021, 0x4803c857, 0x59e00022, 0x4803c857, 0x59e00023, 0x4803c857, 0x59e00024, - 0x4803c857, 0x0201f800, 0x0010215d, 0x0201f800, - 0x0010217c, 0x5c03e000, 0x1c01f000, 0x0201f800, - 0x0010bdab, 0x040007fe, 0x4203e000, 0x30000001, + 0x4803c857, 0x0201f800, 0x0010221c, 0x0201f800, + 0x0010223b, 0x5c03e000, 0x1c01f000, 0x0201f800, + 0x0010c0d6, 0x040007fe, 0x4203e000, 0x30000001, 0x4203e000, 0x40000000, 0x42000800, 0x00007a12, 0x45780800, 0x0401f7ff, 0x4da00000, 0x4df00000, 0x4203e000, 0x50000000, 0x04006050, 0x42034000, - 0x0010c7ff, 0x59a01018, 0x59a01819, 0x800c19c0, + 0x0010caff, 0x59a01018, 0x59a01819, 0x800c19c0, 0x0402000a, 0x59a0381c, 0x801c39c0, 0x02000800, 0x0010032e, 0x49a3c857, 0x481fc857, 0x59a0041d, 0x801c3c00, 0x0401f00c, 0x59a0041a, 0x82000400, @@ -26931,14 +27193,14 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x592c3814, 0x481f401c, 0x497b441d, 0x0201f800, 0x00100594, 0x5c025800, 0x5c03e000, 0x5c034000, 0x1c01f000, 0x830c0500, 0x00000003, 0x02020000, - 0x00104249, 0x59340400, 0x82000580, 0x00000606, - 0x02020000, 0x0010421b, 0x5934000d, 0x80027d40, - 0x02020000, 0x00104254, 0x0401f803, 0x80000580, + 0x00104342, 0x59340400, 0x82000580, 0x00000606, + 0x02020000, 0x00104314, 0x5934000d, 0x80027d40, + 0x02020000, 0x0010434d, 0x0401f803, 0x80000580, 0x1c01f000, 0x5934000f, 0x59341203, 0x80080540, 0x0402006b, 0x5934000b, 0x80001120, 0x82000500, 0x0000ffff, 0x80080480, 0x04021065, 0x0201f800, 0x00020b7b, 0x0400005e, 0x592e4411, 0x81224110, - 0x83200400, 0x0010bdc7, 0x50024800, 0x4926601c, + 0x83200400, 0x0010c10d, 0x50024800, 0x4926601c, 0x592c0407, 0x4936600a, 0x492e6009, 0x4a026407, 0x00000003, 0x4a026403, 0x00000040, 0x80081000, 0x480a6c0b, 0x800000c2, 0x800010c4, 0x80081400, @@ -26966,24 +27228,24 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x592c0407, 0x800000c2, 0x800018c4, 0x800c0400, 0x48025804, 0x1c01f000, 0x492c0800, 0x0401f7f9, 0x83440c80, 0x00000800, 0x04021009, 0x83440400, - 0x0010bf80, 0x50000000, 0x80000540, 0x04000004, + 0x0010c280, 0x50000000, 0x80000540, 0x04000004, 0x40026800, 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, 0x1c01f000, 0x59340203, 0x80000540, 0x04020054, 0x4d300000, 0x4d2c0000, 0x5934000f, 0x80025d40, 0x0400004d, 0x0201f800, 0x00020b7b, 0x04000048, 0x592c0000, 0x4802680f, 0x80000540, 0x04020002, 0x48026810, 0x592c2a05, 0x592e4411, - 0x81224110, 0x83200400, 0x0010bdc7, 0x50024800, + 0x81224110, 0x83200400, 0x0010c10d, 0x50024800, 0x4926601c, 0x4936600a, 0x82142d00, 0x000000ff, 0x82140580, 0x00000012, 0x0400003b, 0x82140580, 0x00000072, 0x04000038, 0x492e6009, 0x80081000, 0x480a6c0b, 0x4a026407, 0x00000003, 0x4a026403, 0x00000040, 0x592c0004, 0x497a5804, 0x48026006, 0x592c0809, 0x592c180a, 0x592c020b, 0x48066018, - 0x480e6019, 0x8c000502, 0x02000000, 0x00104716, + 0x480e6019, 0x8c000502, 0x02000000, 0x00104816, 0x4a026203, 0x00000004, 0x592c0208, 0x80000040, - 0x02020000, 0x00104709, 0x82140580, 0x00000018, - 0x02020000, 0x00104709, 0x592c1810, 0x59300008, + 0x02020000, 0x00104809, 0x82140580, 0x00000018, + 0x02020000, 0x00104809, 0x592c1810, 0x59300008, 0x82000540, 0x00000091, 0x480e6012, 0x48026008, 0x42000000, 0x80080004, 0x48026004, 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, 0x20000000, @@ -26993,24 +27255,24 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x1c01f000, 0x497a5800, 0x4932580a, 0x4a026407, 0x00000006, 0x4a026203, 0x00000007, 0x0401f802, 0x0401f7ed, 0x592e4408, 0x83224500, 0x000000ff, - 0x83200400, 0x0010bdc7, 0x50024800, 0x4926601c, + 0x83200400, 0x0010c10d, 0x50024800, 0x4926601c, 0x592c020d, 0x48026202, 0x59240206, 0x8c000510, - 0x02020000, 0x00104743, 0x8d0e1d0e, 0x02020000, - 0x0010473f, 0x59240200, 0x8c000516, 0x02020000, - 0x0010473b, 0x59340200, 0x8c000518, 0x02020000, - 0x00104737, 0x4a025a07, 0x00000000, 0x8c000508, - 0x02020000, 0x00104733, 0x492e6009, 0x4d3c0000, + 0x02020000, 0x00104843, 0x8d0e1d0e, 0x02020000, + 0x0010483f, 0x59240200, 0x8c000516, 0x02020000, + 0x0010483b, 0x59340200, 0x8c000518, 0x02020000, + 0x00104837, 0x4a025a07, 0x00000000, 0x8c000508, + 0x02020000, 0x00104833, 0x492e6009, 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00020a86, 0x5c027800, 0x1c01f000, 0x58040001, 0x49680800, 0x49780801, 0x815eb800, 0x4006d000, 0x80000d40, 0x040207fa, 0x497a5801, 0x59c80000, 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, 0x59980013, 0x48032823, 0x59d8010b, 0x48033014, 0x1c01f000, 0x592c0405, - 0x8c00051e, 0x02020000, 0x00104cdd, 0x497a5800, + 0x8c00051e, 0x02020000, 0x00104e02, 0x497a5800, 0x8d0e1d26, 0x0402000e, 0x0402d007, 0x592c0001, 0x492fb107, 0x80000d40, 0x04020fe3, 0x0400e0cd, 0x1c01f000, 0x0400e8cb, 0x0400d7f9, 0x42000000, - 0x0010cb7c, 0x0201f800, 0x0010bc8b, 0x0401f916, + 0x0010ce7c, 0x0201f800, 0x0010bfb6, 0x0401f916, 0x0400d921, 0x0400e0c3, 0x59d80105, 0x82000d00, 0x00018780, 0x04020130, 0x1c01f000, 0x59980011, 0x0c01f001, 0x00020411, 0x00020412, 0x0002041d, @@ -27087,8 +27349,8 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4807b107, 0x80000d40, 0x04020005, 0x48033016, 0x850e1d26, 0x48033017, 0x1c01f000, 0x0400d7f8, 0x0401f7fd, 0x59d80105, 0x82000500, 0x00018780, - 0x04020005, 0x42000000, 0x0010cb7c, 0x0201f000, - 0x0010bc8b, 0x4803c857, 0x485fc857, 0x8c00050e, + 0x04020005, 0x42000000, 0x0010ce7c, 0x0201f000, + 0x0010bfb6, 0x4803c857, 0x485fc857, 0x8c00050e, 0x02020800, 0x00100323, 0x4203e000, 0x50000000, 0x4200b800, 0x00008004, 0x0201f000, 0x00100333, 0x0400e784, 0x59d80105, 0x82000500, 0x00018780, @@ -27126,9 +27388,9 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x400a5000, 0x900811c0, 0x82081540, 0x0000001c, 0x480bc011, 0x4a03c017, 0x00000000, 0x4203e000, 0x30000001, 0x1c01f000, 0x41700000, 0x0c01f001, - 0x001054be, 0x000205d9, 0x001054be, 0x0002069f, - 0x001054bc, 0x001054bc, 0x001054bc, 0x001054bc, - 0x00105b56, 0x04010036, 0x59980004, 0x80000540, + 0x001055ef, 0x000205d9, 0x001055ef, 0x0002069f, + 0x001055ed, 0x001055ed, 0x001055ed, 0x001055ed, + 0x00105d0d, 0x04010036, 0x59980004, 0x80000540, 0x0402003b, 0x0402c01c, 0x4202f800, 0x00000010, 0x4df00000, 0x4203e000, 0x50000000, 0x49db3003, 0x59da5808, 0x592c2a05, 0x497a5800, 0x497a5801, @@ -27137,157 +27399,157 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04000009, 0x836c0580, 0x00000003, 0x04020006, 0x83700580, 0x00000001, 0x04020010, 0x0401001a, 0x0400c7e8, 0x0400fa90, 0x0400b27a, 0x59d40005, - 0x82000500, 0x43018780, 0x02020000, 0x001058bd, + 0x82000500, 0x43018780, 0x02020000, 0x00105a05, 0x59d80005, 0x82000500, 0x43018780, 0x02020000, - 0x001058c4, 0x1c01f000, 0x83700580, 0x00000003, + 0x00105a0c, 0x1c01f000, 0x83700580, 0x00000003, 0x04000897, 0x83700580, 0x00000001, 0x040207ee, 0x04010005, 0x0400c7d3, 0x0401f7eb, 0x4202f800, 0x00000010, 0x4df00000, 0x4203e000, 0x50000000, 0x49d73003, 0x59d65808, 0x0401f7cf, 0x4df00000, 0x4203e000, 0x50000000, 0x40025800, 0x592c2a05, 0x497b3003, 0x497b3004, 0x4202f800, 0x00000010, - 0x0401f7c8, 0x0201f800, 0x00105511, 0x5c03e000, - 0x0401f7d5, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x001055b2, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105521, - 0x00105511, 0x00105511, 0x00105511, 0x001055db, - 0x00105511, 0x00105511, 0x00105511, 0x0002070b, - 0x00105511, 0x000207bc, 0x00105511, 0x00105511, - 0x00105511, 0x000206c1, 0x00105511, 0x00105511, - 0x0010b58e, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105551, 0x00105511, - 0x0010b623, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x001058d3, 0x00105a43, 0x00105511, - 0x00105849, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x0010589b, 0x00105511, - 0x00105548, 0x00105511, 0x00105811, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x001057db, 0x00105511, - 0x001057db, 0x00105b1b, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00020835, - 0x00105ae0, 0x00105511, 0x00105b0e, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x000206c1, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x0002077e, - 0x00105511, 0x00105511, 0x00105511, 0x00105511, - 0x00105511, 0x00105511, 0x00105511, 0x4df00000, + 0x0401f7c8, 0x0201f800, 0x00105642, 0x5c03e000, + 0x0401f7d5, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x001056e3, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105652, + 0x00105642, 0x00105642, 0x00105642, 0x0010570c, + 0x00105642, 0x00105642, 0x00105642, 0x0002070b, + 0x00105642, 0x000207bc, 0x00105642, 0x00105642, + 0x00105642, 0x000206c1, 0x00105642, 0x00105642, + 0x0010b8b9, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105682, 0x00105642, + 0x0010b94e, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105a1b, 0x00105bd2, 0x00105642, + 0x0010598e, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x001059e3, 0x00105642, + 0x00105679, 0x00105642, 0x00105956, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105920, 0x00105642, + 0x00105920, 0x00105cd2, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00020835, + 0x00105c97, 0x00105642, 0x00105cc5, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x000206c1, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x0002077e, + 0x00105642, 0x00105642, 0x00105642, 0x00105642, + 0x00105642, 0x00105642, 0x00105642, 0x4df00000, 0x4203e000, 0x50000000, 0x59981003, 0x800811c0, - 0x02000000, 0x001054c3, 0x58080005, 0x82000d00, - 0x43018780, 0x02020000, 0x001058c4, 0x8c000508, - 0x02000000, 0x001054c0, 0x580a5808, 0x592c0205, + 0x02000000, 0x001055f4, 0x58080005, 0x82000d00, + 0x43018780, 0x02020000, 0x00105a0c, 0x8c000508, + 0x02000000, 0x001055f1, 0x580a5808, 0x592c0205, 0x497a5800, 0x497a5801, 0x82000500, 0x000000ff, - 0x82000c80, 0x0000004b, 0x02021000, 0x001054bf, - 0x1201f800, 0x001054c6, 0x5c03e000, 0x83700580, + 0x82000c80, 0x0000004b, 0x02021000, 0x001055f0, + 0x1201f800, 0x001055f7, 0x5c03e000, 0x83700580, 0x00000003, 0x040007e2, 0x0400f9cb, 0x0400b1b5, 0x1c01f000, 0x80140110, 0x82140d00, 0x000000ff, 0x82040d80, 0x00000068, 0x04020005, 0x80000040, - 0x02000000, 0x00105519, 0x0401f003, 0x80000040, - 0x0400000b, 0x02001000, 0x00105519, 0x4a033006, + 0x02000000, 0x0010564a, 0x0401f003, 0x80000040, + 0x0400000b, 0x02001000, 0x0010564a, 0x4a033006, 0x000206d7, 0x48033000, 0x492f3001, 0x492f3002, 0x4202e000, 0x00000003, 0x1c01f000, 0x592e8a07, - 0x83440c80, 0x000007f0, 0x02021000, 0x00105529, - 0x8d0e1d0e, 0x02020000, 0x0010555a, 0x592e4411, - 0x81224110, 0x83440400, 0x0010bf80, 0x50000000, - 0x80026d40, 0x02000000, 0x00105570, 0x59340013, - 0x80000130, 0x81200580, 0x02020000, 0x00105570, + 0x83440c80, 0x000007f0, 0x02021000, 0x0010565a, + 0x8d0e1d0e, 0x02020000, 0x0010568b, 0x592e4411, + 0x81224110, 0x83440400, 0x0010c280, 0x50000000, + 0x80026d40, 0x02000000, 0x001056a1, 0x59340013, + 0x80000130, 0x81200580, 0x02020000, 0x001056a1, 0x59340002, 0x592c0811, 0x80040580, 0x82000500, - 0x00ffffff, 0x02020000, 0x00105529, 0x5934000a, - 0x8c00052e, 0x02020000, 0x0010557a, 0x0201f800, - 0x000202c1, 0x02020000, 0x00105573, 0x1c01f000, + 0x00ffffff, 0x02020000, 0x0010565a, 0x5934000a, + 0x8c00052e, 0x02020000, 0x001056ab, 0x0201f800, + 0x000202c1, 0x02020000, 0x001056a4, 0x1c01f000, 0x59980802, 0x59980000, 0x48065800, 0x492c0801, 0x492f3002, 0x80000040, 0x48033000, 0x04000002, 0x1c01f000, 0x599a5801, 0x59980006, 0x4202e000, 0x00000001, 0x0801f800, 0x1c01f000, 0x80140110, - 0x02000000, 0x00105519, 0x80000040, 0x0402000b, + 0x02000000, 0x0010564a, 0x80000040, 0x0402000b, 0x592c240b, 0x8c102504, 0x0400000c, 0x592c0208, - 0x82000c80, 0x00001001, 0x02021000, 0x00105529, - 0x0201f000, 0x00105b30, 0x4a033006, 0x0002071d, + 0x82000c80, 0x00001001, 0x02021000, 0x0010565a, + 0x0201f000, 0x00105ce7, 0x4a033006, 0x0002071d, 0x0401f7b5, 0x592c240b, 0x592e8a07, 0x417a7800, 0x592e4408, 0x83224500, 0x000000ff, 0x83200580, - 0x000000ff, 0x02000000, 0x00105769, 0x83200400, - 0x0010bdc7, 0x50024800, 0x83440c80, 0x000007f0, - 0x02021000, 0x00105760, 0x83440c00, 0x0010bf80, - 0x50040000, 0x80026d40, 0x02000000, 0x00105764, + 0x000000ff, 0x02000000, 0x001058aa, 0x83200400, + 0x0010c10d, 0x50024800, 0x83440c80, 0x000007f0, + 0x02021000, 0x001058a1, 0x83440c00, 0x0010c280, + 0x50040000, 0x80026d40, 0x02000000, 0x001058a5, 0x59340013, 0x80000130, 0x81200580, 0x02020000, - 0x00105764, 0x59340002, 0x592c0809, 0x80040580, - 0x82000500, 0x00ffffff, 0x02020000, 0x00105529, + 0x001058a5, 0x59340002, 0x592c0809, 0x80040580, + 0x82000500, 0x00ffffff, 0x02020000, 0x0010565a, 0x59243a00, 0x821c0500, 0x00000003, 0x82000580, - 0x00000003, 0x02020000, 0x0010575c, 0x592e600a, - 0x497a5809, 0x83300480, 0x00111264, 0x02001000, - 0x00105786, 0x41540000, 0x81300480, 0x02021000, - 0x00105720, 0x592c0a0d, 0x59300202, 0x80040580, - 0x02020000, 0x00105786, 0x4936600a, 0x4926601c, - 0x8c10251c, 0x02020000, 0x0010570e, 0x59240206, - 0x8c000510, 0x02020000, 0x001057a9, 0x8d0e1d0e, - 0x02020000, 0x001056f3, 0x8c1c3d16, 0x02020000, - 0x0010579a, 0x59340200, 0x8c000518, 0x02020000, - 0x00105781, 0x59300c07, 0x82040580, 0x00000006, - 0x02020000, 0x001057ae, 0x8c102508, 0x02020000, - 0x001056e8, 0x59300809, 0x497a5804, 0x4a025a07, - 0x00000000, 0x800409c0, 0x02020000, 0x001056ee, - 0x59300415, 0x8c000516, 0x02020000, 0x0010578b, + 0x00000003, 0x02020000, 0x0010589d, 0x592e600a, + 0x497a5809, 0x83300480, 0x00111584, 0x02001000, + 0x001058c7, 0x41540000, 0x81300480, 0x02021000, + 0x00105861, 0x592c0a0d, 0x59300202, 0x80040580, + 0x02020000, 0x001058c7, 0x4936600a, 0x4926601c, + 0x8c10251c, 0x02020000, 0x0010584f, 0x59240206, + 0x8c000510, 0x02020000, 0x001058ea, 0x8d0e1d0e, + 0x02020000, 0x00105834, 0x8c1c3d16, 0x02020000, + 0x001058db, 0x59340200, 0x8c000518, 0x02020000, + 0x001058c2, 0x59300c07, 0x82040580, 0x00000006, + 0x02020000, 0x001058ef, 0x8c102508, 0x02020000, + 0x00105829, 0x59300809, 0x497a5804, 0x4a025a07, + 0x00000000, 0x800409c0, 0x02020000, 0x0010582f, + 0x59300415, 0x8c000516, 0x02020000, 0x001058cc, 0x492e6009, 0x0401f309, 0x80140110, 0x02000000, - 0x00105519, 0x80000040, 0x02000000, 0x00105519, + 0x0010564a, 0x80000040, 0x02000000, 0x0010564a, 0x592c0a08, 0x82040c80, 0x00001001, 0x02021000, - 0x00105529, 0x4a033006, 0x0002078c, 0x0401f746, - 0x592c0001, 0x80001540, 0x02000000, 0x00105519, + 0x0010565a, 0x4a033006, 0x0002078c, 0x0401f746, + 0x592c0001, 0x80001540, 0x02000000, 0x0010564a, 0x58080a05, 0x82040d00, 0x000000ff, 0x82040580, - 0x0000004a, 0x02020000, 0x00105521, 0x58080406, - 0x8c000510, 0x02020000, 0x00105529, 0x4202e000, + 0x0000004a, 0x02020000, 0x00105652, 0x58080406, + 0x8c000510, 0x02020000, 0x0010565a, 0x4202e000, 0x00000001, 0x592c240b, 0x8c102504, 0x0400077f, 0x40087800, 0x592c0208, 0x82000480, 0x00001001, - 0x02021000, 0x00105529, 0x583c1809, 0x583c200a, + 0x02021000, 0x0010565a, 0x583c1809, 0x583c200a, 0x583c100b, 0x82080500, 0xffff0003, 0x02020000, - 0x00105529, 0x4202e000, 0x00000002, 0x42000000, - 0x0010dfe7, 0x50007000, 0x4a00700f, 0x00000008, + 0x0010565a, 0x4202e000, 0x00000002, 0x42000000, + 0x0010e2e7, 0x50007000, 0x4a00700f, 0x00000008, 0x480c7006, 0x48107007, 0x492c700a, 0x4a00700d, - 0x00000009, 0x483c700b, 0x0201f000, 0x00105b42, + 0x00000009, 0x483c700b, 0x0201f000, 0x00105cf9, 0x492fc857, 0x592e4411, 0x81224110, 0x0201f800, - 0x00105acb, 0x04020067, 0x592c0205, 0x80000112, - 0x02020000, 0x00105519, 0x592e8a07, 0x0201f800, - 0x0002034c, 0x0402005f, 0x0201f800, 0x0010491a, + 0x00105c82, 0x04020067, 0x592c0205, 0x80000112, + 0x02020000, 0x0010564a, 0x592e8a07, 0x0201f800, + 0x00104a7c, 0x0402005f, 0x0201f800, 0x00104a1c, 0x0402005f, 0x592e780b, 0x493fc857, 0x8d3e7d3e, 0x04020007, 0x8d0e1d0e, 0x04020056, 0x0201f800, - 0x00104817, 0x02000000, 0x00105529, 0x833c1d00, - 0x0000001f, 0x02000000, 0x00105529, 0x592c0208, - 0x82000c80, 0x00001000, 0x02021000, 0x00105529, + 0x00104917, 0x02000000, 0x0010565a, 0x833c1d00, + 0x0000001f, 0x02000000, 0x0010565a, 0x592c0208, + 0x82000c80, 0x00001000, 0x02021000, 0x0010565a, 0x800000c2, 0x800008c4, 0x8005d400, 0x592e9009, 0x592e980a, 0x5934080d, 0x800409c0, 0x04000004, 0x58041802, 0x800c19c0, 0x04020038, 0x833c1d00, 0x0000001f, 0x81780040, 0x80000000, 0x800c1902, - 0x040217fe, 0x02020000, 0x00105529, 0x0c01f001, + 0x040217fe, 0x02020000, 0x0010565a, 0x0c01f001, 0x000207f9, 0x000207fc, 0x00020809, 0x0002080c, - 0x0002080f, 0x0201f800, 0x00109677, 0x0401f023, - 0x0201f800, 0x001047e9, 0x04000027, 0x80e9d1c0, - 0x02020800, 0x00106314, 0x42028000, 0x00000005, - 0x417a9000, 0x417a9800, 0x0201f800, 0x00109687, + 0x0002080f, 0x0201f800, 0x001098af, 0x0401f023, + 0x0201f800, 0x001048e9, 0x04000027, 0x80e9d1c0, + 0x02020800, 0x00106519, 0x42028000, 0x00000005, + 0x417a9000, 0x417a9800, 0x0201f800, 0x001098bf, 0x0401f016, 0x42027000, 0x0000004d, 0x0401f006, 0x42027000, 0x0000004e, 0x0401f003, 0x42027000, 0x00000052, 0x5934080d, 0x800409c0, 0x04000007, - 0x4d3c0000, 0x40067800, 0x0201f800, 0x001047c9, - 0x5c027800, 0x04000009, 0x0201f800, 0x00104692, - 0x02020800, 0x001096bd, 0x04000007, 0x8d3e7d3e, + 0x4d3c0000, 0x40067800, 0x0201f800, 0x001048c9, + 0x5c027800, 0x04000009, 0x0201f800, 0x00104792, + 0x02020800, 0x001098f5, 0x04000007, 0x8d3e7d3e, 0x0402000e, 0x1c01f000, 0x4a025a07, 0x00000030, 0x0401f00d, 0x4a025a07, 0x0000002c, 0x0401f00a, 0x4a025a07, 0x00000028, 0x0401f007, 0x4a025a07, 0x00000029, 0x0401f004, 0x497a580a, 0x4a025a07, 0x00000000, 0x4a025a05, 0x00000103, 0x0201f000, 0x000203ef, 0x492fc857, 0x80140110, 0x80000040, - 0x04000003, 0x0201f000, 0x00105519, 0x592c0208, + 0x04000003, 0x0201f000, 0x0010564a, 0x592c0208, 0x82000500, 0x000003ff, 0x48025a08, 0x8c000506, 0x04000004, 0x82000500, 0x00000070, 0x04020003, 0x8d0e1d0e, 0x04020018, 0x4a025a07, 0x0000dead, 0x592c0409, 0x82000500, 0x0000f0ff, 0x48025c09, - 0x0201f800, 0x001042f4, 0x04020002, 0x1c01f000, + 0x0201f800, 0x001043ed, 0x04020002, 0x1c01f000, 0x49425a07, 0x8058b1c0, 0x04000009, 0x0201f800, - 0x00109cd4, 0x0401f80f, 0x44042800, 0x82580580, + 0x00109f12, 0x0401f80f, 0x44042800, 0x82580580, 0x00000002, 0x04020002, 0x48082801, 0x0201f000, 0x000203ef, 0x42028000, 0x00000031, 0x42000800, 0x00000001, 0x4200b000, 0x00000001, 0x0401f7ed, @@ -27299,12 +27561,12 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x835c0480, 0x00000020, 0x0400100d, 0x815eb840, 0x416a5800, 0x592ed000, 0x492fb007, 0x497a5800, 0x497a5801, 0x0400b7f7, 0x59d80005, 0x82000500, - 0x43018780, 0x02020000, 0x001058c4, 0x5c03e000, + 0x43018780, 0x02020000, 0x00105a0c, 0x5c03e000, 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, 0x0402f00b, 0x835c0480, 0x00000020, 0x0400100d, 0x815eb840, 0x416a5800, 0x592ed000, 0x492fa807, 0x497a5800, 0x497a5801, 0x0400f7f7, 0x59d40005, - 0x82000500, 0x43018780, 0x02020000, 0x001058bd, + 0x82000500, 0x43018780, 0x02020000, 0x00105a05, 0x5c03e000, 0x1c01f000, 0x40307000, 0x5838000a, 0x80025d40, 0x04000026, 0x58380002, 0x82000580, 0x00000100, 0x04000028, 0x4c380000, 0x592c0a05, @@ -27321,7 +27583,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0400008d, 0x5838100f, 0x8c081500, 0x0402001b, 0x8c081506, 0x0402003b, 0x4200b000, 0x00000003, 0x832cac00, 0x00000012, 0x58380009, 0x5838100c, - 0x8008a400, 0x4c380000, 0x0201f800, 0x0010bd5b, + 0x8008a400, 0x4c380000, 0x0201f800, 0x0010c086, 0x5c007000, 0x5838000c, 0x82000400, 0x00000003, 0x4800700c, 0x4a00700f, 0x00000001, 0x58380004, 0x82000480, 0x00000003, 0x48007004, 0x82000580, @@ -27333,7 +27595,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x492c0801, 0x492c700b, 0x42000800, 0x0000000f, 0x0401f014, 0x4202e000, 0x00000008, 0x4a033005, 0x0002090a, 0x1c01f000, 0x4202e000, 0x00000002, - 0x42000000, 0x0010dfe7, 0x50007000, 0x0401f7e7, + 0x42000000, 0x0010e2e7, 0x50007000, 0x0401f7e7, 0x84081540, 0x4808700f, 0x5838180d, 0x583a580b, 0x400c0000, 0x42000800, 0x00000015, 0x80040c80, 0x58381004, 0x5838000e, 0x41783000, 0x80000540, @@ -27342,7 +27604,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x40080800, 0x4004b000, 0x412c0000, 0x800c0400, 0x4000a800, 0x58380009, 0x5838100c, 0x8008a400, 0x4c080000, 0x4c040000, 0x4c0c0000, 0x4c380000, - 0x0201f800, 0x0010bd5b, 0x5c007000, 0x5c001800, + 0x0201f800, 0x0010c086, 0x5c007000, 0x5c001800, 0x5c000800, 0x40040000, 0x58381004, 0x80080480, 0x48007004, 0x82000580, 0x00000003, 0x04000002, 0x84183500, 0x5c000000, 0x80041400, 0x82080480, @@ -27353,23 +27615,23 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00020958, 0x0002095d, 0x0002095a, 0x00020958, 0x000208f1, 0x0002095d, 0x0002095a, 0x00020958, 0x0201f800, 0x0010032e, 0x5838100e, 0x0201f000, - 0x00105b42, 0x5838080c, 0x82040400, 0x00000002, + 0x00105cf9, 0x5838080c, 0x82040400, 0x00000002, 0x58381009, 0x80080400, 0x50001000, 0x800811c0, 0x0402001a, 0x5838180f, 0x8c0c1d06, 0x04020011, 0x4202e000, 0x00000001, 0x583a580a, 0x4978700a, 0x4978700f, 0x592c0a05, 0x82040d00, 0x000000ff, 0x82040580, 0x00000012, 0x040005ab, 0x82040580, - 0x0000001b, 0x02000000, 0x0010b5b6, 0x0401f560, + 0x0000001b, 0x02000000, 0x0010b8e1, 0x0401f560, 0x4202e000, 0x00000001, 0x583a580a, 0x4978700a, 0x4978700f, 0x0401f5a0, 0x58380009, 0x80040c00, 0x82381c00, 0x00000006, 0x54041800, 0x80040800, - 0x800c1800, 0x54041800, 0x0201f000, 0x00105b42, + 0x800c1800, 0x54041800, 0x0201f000, 0x00105cf9, 0x4df00000, 0x4203e000, 0x50000000, 0x5994002e, 0x80000540, 0x040000ec, 0x4c000000, 0x8d0e1d32, - 0x02020800, 0x00101058, 0x59e00002, 0x8c00051e, + 0x02020800, 0x00101059, 0x59e00002, 0x8c00051e, 0x04020013, 0x42000000, 0x00001000, 0x50000000, 0x82000480, 0x24320002, 0x0402000d, 0x0201f800, - 0x0010bdab, 0x04000008, 0x42000800, 0x00007a17, + 0x0010c0d6, 0x04000008, 0x42000800, 0x00007a17, 0x50040000, 0x8c00050e, 0x04020003, 0x8400054e, 0x44000800, 0x4a030000, 0x00000000, 0x5c000000, 0x59947824, 0x4803282f, 0x803c0480, 0x04001004, @@ -27379,10 +27641,10 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x803c0040, 0x04000002, 0x483fc857, 0x59e40852, 0x59a8005d, 0x80040580, 0x04000004, 0x480bc857, 0x59e40052, 0x4803505d, 0x59940030, 0x803c0400, - 0x48032830, 0x0201f800, 0x001063cc, 0x59940000, + 0x48032830, 0x0201f800, 0x001065d1, 0x59940000, 0x82000580, 0x00000000, 0x04020006, 0x59940030, 0x48032831, 0x497b2830, 0x4a032800, 0x00000001, - 0x59bc00e4, 0x8c00052c, 0x02020800, 0x00106296, + 0x59bc00e4, 0x8c00052c, 0x02020800, 0x0010649b, 0x4c0c0000, 0x59940007, 0x80000d40, 0x04000013, 0x59941006, 0x5994002f, 0x80081c80, 0x04001004, 0x04000003, 0x480f2806, 0x0401f00c, 0x80040840, @@ -27425,19 +27687,19 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0000000a, 0x4803282b, 0x040027f7, 0x5994082e, 0x5994002f, 0x80040480, 0x02001800, 0x0010032e, 0x4803282e, 0x59940000, 0x0c01f001, 0x00020a7e, - 0x0010631b, 0x00106388, 0x5c03e000, 0x1c01f000, + 0x00106520, 0x0010658d, 0x5c03e000, 0x1c01f000, 0x5994002e, 0x80000000, 0x4803282e, 0x4203e000, 0x70000000, 0x1c01f000, 0x592c0004, 0x497a5804, 0x80000d40, 0x04020005, 0x592c0407, 0x800000c2, 0x800008c4, 0x80040c00, 0x592c040b, 0x48066006, - 0x82000d00, 0x00000003, 0x02000000, 0x00106521, + 0x82000d00, 0x00000003, 0x02000000, 0x00106726, 0x8c000500, 0x04020035, 0x59a80873, 0x80040840, - 0x040207ff, 0x8c00051e, 0x02000000, 0x001064fc, - 0x82000d00, 0x000000c0, 0x02020000, 0x001064f2, - 0x82000d00, 0x00002020, 0x02020000, 0x001064ef, - 0x813e79c0, 0x02020000, 0x001064ef, 0x592c0c0d, - 0x800409c0, 0x02020000, 0x001064ef, 0x59300a03, - 0x82040d80, 0x00000007, 0x02020000, 0x001064ef, + 0x040207ff, 0x8c00051e, 0x02000000, 0x00106701, + 0x82000d00, 0x000000c0, 0x02020000, 0x001066f7, + 0x82000d00, 0x00002020, 0x02020000, 0x001066f4, + 0x813e79c0, 0x02020000, 0x001066f4, 0x592c0c0d, + 0x800409c0, 0x02020000, 0x001066f4, 0x59300a03, + 0x82040d80, 0x00000007, 0x02020000, 0x001066f4, 0x4a026203, 0x00000003, 0x4a026403, 0x00000043, 0x0201f800, 0x00020172, 0x82080d40, 0x80003465, 0x8c040d0e, 0x04000008, 0x59301009, 0x58081001, @@ -27445,14 +27707,14 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x84040d14, 0x48066004, 0x497a6000, 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, 0xa0000000, 0x480378e1, 0x1c01f000, 0x8c000502, 0x02020000, - 0x00106544, 0x8c00051e, 0x0400000e, 0x82000d00, + 0x00106749, 0x8c00051e, 0x0400000e, 0x82000d00, 0x000000c0, 0x04000005, 0x82040d80, 0x000000c0, - 0x02020000, 0x00106549, 0x82000d00, 0x00002020, - 0x82040d80, 0x00002020, 0x02000000, 0x00106510, - 0x592c0208, 0x80000040, 0x02020000, 0x0010651a, + 0x02020000, 0x0010674e, 0x82000d00, 0x00002020, + 0x82040d80, 0x00002020, 0x02000000, 0x00106715, + 0x592c0208, 0x80000040, 0x02020000, 0x0010671f, 0x592c0205, 0x82000500, 0x000000ff, 0x82000580, - 0x00000012, 0x02020000, 0x0010651a, 0x592c180e, - 0x800c19c0, 0x02020000, 0x0010651a, 0x592c1810, + 0x00000012, 0x02020000, 0x0010671f, 0x592c180e, + 0x800c19c0, 0x02020000, 0x0010671f, 0x592c1810, 0x59300008, 0x82000540, 0x00000011, 0x480e6012, 0x48026008, 0x4a026203, 0x00000004, 0x4a026403, 0x00000042, 0x42000800, 0x80002001, 0x0401f047, @@ -27469,35 +27731,35 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0401f7f1, 0x0201f800, 0x000203dd, 0x0401f7ee, 0x59300020, 0x48025c10, 0x0401f7e9, 0x59840000, 0x80000540, 0x04020002, 0x1c01f000, 0x59840003, - 0x80000540, 0x02020000, 0x001065c1, 0x1c01f000, + 0x80000540, 0x02020000, 0x001067c6, 0x1c01f000, 0x48066004, 0x497a6000, 0x497a6001, 0x8d0e1d32, - 0x02000800, 0x00101058, 0x850e1d72, 0x59bc00ea, + 0x02000800, 0x00101059, 0x850e1d72, 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, 0xa0000000, 0x480378e1, 0x1c01f000, 0x59300004, 0x82000500, 0x00000100, 0x80040d40, 0x48066004, 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, 0x40000000, 0x480378e1, 0x1c01f000, 0x59bc00ea, 0x82001500, - 0xb0000018, 0x02020000, 0x00106c7a, 0x8c000510, + 0xb0000018, 0x02020000, 0x00106e7f, 0x8c000510, 0x0400002a, 0x59bc10e0, 0x82080500, 0xfffff000, 0x0402000a, 0x80080108, 0x820a3500, 0x0000000f, - 0x4803c857, 0x1201f000, 0x00106c80, 0x84000510, + 0x4803c857, 0x1201f000, 0x00106e85, 0x84000510, 0x48026004, 0x0401f016, 0x840a653e, 0x59300004, 0x8c000520, 0x040007fa, 0x82000500, 0xfffefeff, 0x48026004, 0x8c08153e, 0x04020005, 0x42027000, 0x00000013, 0x0401f858, 0x0401f009, 0x59300004, 0x8c000514, 0x04000003, 0x0401ff8f, 0x0401f02e, 0x42027000, 0x00000049, 0x0401f84f, 0x59bc00ea, - 0x82001500, 0xb0000018, 0x02020000, 0x00106c7a, + 0x82001500, 0xb0000018, 0x02020000, 0x00106e7f, 0x8c000510, 0x040207d8, 0x1c01f000, 0x59a80251, 0x81640480, 0x04001019, 0x41626000, 0x41580000, 0x59300a03, 0x82040d80, 0x00000000, 0x04020009, 0x4a026203, 0x00000008, 0x8166c840, 0x8332c400, 0x0000002c, 0x81600480, 0x04021009, 0x1c01f000, 0x83326400, 0x0000002c, 0x81300c80, 0x040017f1, - 0x42026000, 0x00111264, 0x0401f7ee, 0x837ac540, - 0x00111264, 0x1c01f000, 0x42000000, 0x0010cc16, - 0x0201f800, 0x0010bc88, 0x4967c857, 0x80026580, - 0x1c01f000, 0x83300480, 0x00111264, 0x02001800, + 0x42026000, 0x00111584, 0x0401f7ee, 0x837ac540, + 0x00111584, 0x1c01f000, 0x42000000, 0x0010cf16, + 0x0201f800, 0x0010bfb3, 0x4967c857, 0x80026580, + 0x1c01f000, 0x83300480, 0x00111584, 0x02001800, 0x0010032e, 0x41580000, 0x81300480, 0x0402100c, 0x457a6000, 0x4a026202, 0x0000ffff, 0x04011000, 0x83300400, 0x00000003, 0x4803c840, 0x4a03c842, @@ -27509,82 +27771,82 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x1c01f000, 0x4d340000, 0x4d240000, 0x5932481c, 0x5932680a, 0x59300407, 0x82000500, 0x0000001f, 0x0c01f804, 0x5c024800, 0x5c026800, 0x1c01f000, - 0x00107d2f, 0x00107d42, 0x00107d5c, 0x00020bec, - 0x0010a231, 0x0010a24c, 0x00020c6d, 0x00107d2f, - 0x00107d42, 0x001068b8, 0x00107d75, 0x00107d2f, - 0x00107d2f, 0x00107d2f, 0x00107d2f, 0x00107d2f, - 0x00109d26, 0x0010b1bb, 0x0010b8c4, 0x0010bab4, - 0x00107d2f, 0x00107d2f, 0x00107d2f, 0x00107d2f, - 0x00107d2f, 0x00107d2f, 0x00107d2f, 0x00107d2f, - 0x00107d2f, 0x00107d2f, 0x00107d2f, 0x00107d2f, + 0x00107f29, 0x00107f3c, 0x00107f56, 0x00020bec, + 0x0010a521, 0x0010a53c, 0x00020c6d, 0x00107f29, + 0x00107f3c, 0x00106abd, 0x00107f6f, 0x00107f29, + 0x00107f29, 0x00107f29, 0x00107f29, 0x00107f29, + 0x00109f64, 0x0010b4d2, 0x0010bbef, 0x0010bddf, + 0x00107f29, 0x00107f29, 0x00107f29, 0x00107f29, + 0x00107f29, 0x00107f29, 0x00107f29, 0x00107f29, + 0x00107f29, 0x00107f29, 0x00107f29, 0x00107f29, 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, - 0x0010032e, 0x0c01f001, 0x00107d73, 0x00108a69, - 0x00020c00, 0x00108cb4, 0x00108d4e, 0x00107d73, - 0x00107d73, 0x00107d73, 0x00108a4e, 0x00107d73, - 0x00107d73, 0x00107d73, 0x00107d73, 0x00108f50, + 0x0010032e, 0x0c01f001, 0x00107f6d, 0x00108c8f, + 0x00020c00, 0x00108eda, 0x00108f74, 0x00107f6d, + 0x00107f6d, 0x00107f6d, 0x00108c74, 0x00107f6d, + 0x00107f6d, 0x00107f6d, 0x00107f6d, 0x00109176, 0x83380480, 0x00000058, 0x04021007, 0x83380480, 0x00000040, 0x04001004, 0x4d2c0000, 0x0c01f803, - 0x5c025800, 0x1c01f000, 0x00108af3, 0x00108af3, - 0x00108af3, 0x00108af3, 0x00108af3, 0x00108af5, - 0x00108bcd, 0x00108af3, 0x00108af3, 0x00108af3, - 0x00108af3, 0x00108af3, 0x00108af3, 0x00108af3, - 0x00108af3, 0x00108af3, 0x00108af3, 0x00108af3, - 0x00108af3, 0x00108bd1, 0x00020c22, 0x00108af3, - 0x00108bd0, 0x00108bd2, 0x59325809, 0x59300812, + 0x5c025800, 0x1c01f000, 0x00108d19, 0x00108d19, + 0x00108d19, 0x00108d19, 0x00108d19, 0x00108d1b, + 0x00108df3, 0x00108d19, 0x00108d19, 0x00108d19, + 0x00108d19, 0x00108d19, 0x00108d19, 0x00108d19, + 0x00108d19, 0x00108d19, 0x00108d19, 0x00108d19, + 0x00108d19, 0x00108df7, 0x00020c22, 0x00108d19, + 0x00108df6, 0x00108df8, 0x59325809, 0x59300812, 0x59301402, 0x59340200, 0x8c00050e, 0x04020025, 0x0401f832, 0x04000005, 0x4a025a05, 0x00000103, 0x497a580a, 0x0401f00c, 0x4a025a05, 0x00000103, 0x4a025a07, 0x00000000, 0x497a580a, 0x40040000, - 0x0201f800, 0x0010a0a5, 0x80000d40, 0x02020800, - 0x00108d19, 0x48065808, 0x480a5c07, 0x59300008, + 0x0201f800, 0x0010a2e2, 0x80000d40, 0x02020800, + 0x00108f3f, 0x48065808, 0x480a5c07, 0x59300008, 0x82000500, 0x04000800, 0x82000580, 0x04000800, 0x04000017, 0x0201f800, 0x000203ef, 0x5934000f, 0x5934140b, 0x80081040, 0x04001002, 0x480a6c0b, 0x80000540, 0x02020800, 0x0002035a, 0x0401f752, 0x592c020b, 0x8c000502, 0x040007da, 0x800409c0, 0x040007de, 0x592c0209, 0x8c00050e, 0x040207db, - 0x4933c857, 0x0201f000, 0x0010988f, 0x59300220, + 0x4933c857, 0x0201f000, 0x00109ac7, 0x59300220, 0x48025c10, 0x0401f7e8, 0x592c020b, 0x8c000500, 0x04000010, 0x59300016, 0x592c3810, 0x801c3c80, 0x0400000c, 0x4a025a07, 0x00000015, 0x8c1c3d3e, 0x04000005, 0x4a025a07, 0x00000007, 0x801c3880, 0x801c3800, 0x481fc857, 0x821c0d40, 0x00000000, 0x1c01f000, 0x59300203, 0x82003480, 0x0000000e, - 0x02021800, 0x0010032e, 0x0c01f001, 0x0010a26b, - 0x00020c81, 0x0010aa15, 0x0010aa23, 0x00020c9d, - 0x0010a26b, 0x0010ab16, 0x00020cbc, 0x0010a26b, - 0x0010a26b, 0x0010a26b, 0x0010a26b, 0x0010a26b, - 0x0010a26b, 0x83380580, 0x00000013, 0x02020000, - 0x0010a99c, 0x59300403, 0x82027480, 0x00000044, + 0x02021800, 0x0010032e, 0x0c01f001, 0x0010a55b, + 0x00020c81, 0x0010ad19, 0x0010ad27, 0x00020c9d, + 0x0010a55b, 0x0010ae1d, 0x00020cbc, 0x0010a55b, + 0x0010a55b, 0x0010a55b, 0x0010a55b, 0x0010a55b, + 0x0010a55b, 0x83380580, 0x00000013, 0x02020000, + 0x0010aca0, 0x59300403, 0x82027480, 0x00000044, 0x02021800, 0x0010032e, 0x82000480, 0x00000040, - 0x02001800, 0x0010032e, 0x0c01f001, 0x0010a9f9, - 0x00020c93, 0x0010a9fb, 0x0010aa0d, 0x59325809, + 0x02001800, 0x0010032e, 0x0c01f001, 0x0010acfd, + 0x00020c93, 0x0010acff, 0x0010ad11, 0x59325809, 0x832c0500, 0x00ff0000, 0x04000005, 0x592c0c0b, - 0x8c040d1a, 0x02020000, 0x0010aa08, 0x0401fe62, + 0x8c040d1a, 0x02020000, 0x0010ad0c, 0x0401fe62, 0x0401f701, 0x83380580, 0x00000048, 0x04000007, - 0x83380580, 0x00000053, 0x02000000, 0x0010aab8, + 0x83380580, 0x00000053, 0x02000000, 0x0010adbf, 0x0201f800, 0x0010032e, 0x59300028, 0x59301012, 0x5930080a, 0x58040a00, 0x8c040d0e, 0x02020000, - 0x0010aa94, 0x800811c0, 0x02020000, 0x0010aaa1, - 0x59300028, 0x80000540, 0x02020000, 0x0010aaaf, + 0x0010ad9b, 0x800811c0, 0x02020000, 0x0010ada8, + 0x59300028, 0x80000540, 0x02020000, 0x0010adb6, 0x59325809, 0x592c040b, 0x8c00051e, 0x02000000, - 0x0010aa8a, 0x42027000, 0x00000041, 0x0401f001, + 0x0010ad91, 0x42027000, 0x00000041, 0x0401f001, 0x83380480, 0x00000054, 0x02021800, 0x0010032e, - 0x83380480, 0x00000040, 0x02001000, 0x0010aad5, - 0x0c01f001, 0x0010aae1, 0x00020cd9, 0x0010aaed, - 0x0010aaf4, 0x0010aae1, 0x0010aae1, 0x0010aae1, - 0x0010aae1, 0x0010aae3, 0x0010aae8, 0x0010aae8, - 0x0010aae1, 0x0010aae1, 0x0010aae1, 0x0010aae1, - 0x0010aae8, 0x0010aae1, 0x0010aae8, 0x0010aae1, - 0x0010aae3, 0x4a026203, 0x00000001, 0x493a6403, + 0x83380480, 0x00000040, 0x02001000, 0x0010addc, + 0x0c01f001, 0x0010ade8, 0x00020cd9, 0x0010adf4, + 0x0010adfb, 0x0010ade8, 0x0010ade8, 0x0010ade8, + 0x0010ade8, 0x0010adea, 0x0010adef, 0x0010adef, + 0x0010ade8, 0x0010ade8, 0x0010ade8, 0x0010ade8, + 0x0010adef, 0x0010ade8, 0x0010adef, 0x0010ade8, + 0x0010adea, 0x4a026203, 0x00000001, 0x493a6403, 0x42000800, 0x80002042, 0x0401f660, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x441faab4, 0x00000000, - 0x00000000, 0x0010f300, 0x00001a73, 0x42000000, - 0x00110db0, 0x42001000, 0x00110da1, 0x48001000, - 0x42013800, 0x001111b0, 0x42000000, 0x00110da0, + 0x00000000, 0x00000000, 0x440ec717, 0x00000000, + 0x00000000, 0x0010f600, 0x00001a9a, 0x42000000, + 0x001110d0, 0x42001000, 0x001110c1, 0x48001000, + 0x42013800, 0x001114d0, 0x42000000, 0x001110c0, 0x489c0000, 0x409d4000, 0x409d6800, 0x1c01f000, 0x4200d000, 0x0000000d, 0x42000000, 0x00000002, 0x4800d000, 0x0401f7fb, 0x4200d000, 0x0000000d, @@ -27592,7 +27854,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x1c01f000, 0x809d3840, 0x48813800, 0x4933c857, 0x5931040b, 0x82817480, 0x00000038, 0x0400000d, 0x0400100c, 0x82810480, 0x00000038, 0x4a025a06, - 0x00000038, 0x0201f800, 0x00103873, 0x40c65800, + 0x00000038, 0x0201f800, 0x00103963, 0x40c65800, 0x80c589c0, 0x040207f4, 0x4178d000, 0x0401f004, 0x48825a06, 0x4200d000, 0x00000001, 0x40698800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x42038000, @@ -27623,21 +27885,21 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0xe1290008, 0x486f9122, 0x0401f7e2, 0x4a039100, 0x0000e980, 0x1c01f000, 0x59c8d007, 0x8c68d500, 0x04000003, 0x4a03900d, 0x00000030, 0x1c01f000, - 0x0201f800, 0x00106c29, 0x59b8d0ea, 0x8268d500, + 0x0201f800, 0x00106e2e, 0x59b8d0ea, 0x8268d500, 0x00000007, 0x82697480, 0x00000003, 0x04000002, 0x0401f003, 0x4a0370e8, 0x00000001, 0x1c01f000, 0x4a038805, 0x00020000, 0x4200d000, 0x0000003c, - 0x0201f800, 0x001012d0, 0x4a038891, 0x0000ffff, + 0x0201f800, 0x001012d1, 0x4a038891, 0x0000ffff, 0x59c97035, 0x48bb9035, 0x4a03900d, 0x00000040, - 0x42038000, 0x00007700, 0x0201f800, 0x00100ca7, + 0x42038000, 0x00007700, 0x0201f800, 0x00100ca8, 0x4a038006, 0x20000000, 0x42038000, 0x00007720, - 0x0201f800, 0x00100ca7, 0x4a038006, 0x20000000, + 0x0201f800, 0x00100ca8, 0x4a038006, 0x20000000, 0x4a03a005, 0x20000000, 0x4a03a005, 0x30000000, 0x4a03b805, 0x30000001, 0x4a03b805, 0x20000000, 0x59d0d006, 0x8c68d50a, 0x040207fe, 0x59dcd006, 0x8c68d50a, 0x040207fb, 0x1c01f000, 0x4203a000, 0x00007600, 0x4200d000, 0x00000040, 0x0201f800, - 0x001012d0, 0x4a03a00a, 0x00000001, 0x4a03a005, + 0x001012d1, 0x4a03a00a, 0x00000001, 0x4a03a005, 0x20000000, 0x59d0d006, 0x4a03a005, 0x30000000, 0x59d0d006, 0x8c68d50a, 0x040207fe, 0x59d0d005, 0x59a0d211, 0x59a0dc11, 0x806c00e0, 0x8068d540, @@ -27662,24 +27924,24 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x59a8d00d, 0x41640000, 0x80697480, 0x04000015, 0x4967c857, 0x59a9704f, 0x48bbc857, 0x59a9704e, 0x48bbc857, 0x59a9704d, 0x48bbc857, 0x4a034407, - 0x00000018, 0x0201f800, 0x0010224a, 0x0401f12d, - 0x4a034407, 0x00000005, 0x0201f800, 0x0010224a, - 0x0401f128, 0x0201f800, 0x00102252, 0x0401f125, + 0x00000018, 0x0201f800, 0x00102309, 0x0401f12d, + 0x4a034407, 0x00000005, 0x0201f800, 0x00102309, + 0x0401f128, 0x0201f800, 0x00102311, 0x0401f125, 0x59a8d04e, 0x59a8004d, 0x80697480, 0x040207e9, - 0x0201f800, 0x00106c35, 0x598e600f, 0x0201f800, - 0x00106f55, 0x0201f800, 0x00106c35, 0x408e3000, - 0x0201f800, 0x001072f1, 0x59926004, 0x813261c0, - 0x0400000d, 0x0201f800, 0x00106e6e, 0x0201f800, - 0x00106c07, 0x0201f800, 0x00106c10, 0x42027800, + 0x0201f800, 0x00106e3a, 0x598e600f, 0x0201f800, + 0x0010715a, 0x0201f800, 0x00106e3a, 0x408e3000, + 0x0201f800, 0x001074f6, 0x59926004, 0x813261c0, + 0x0400000d, 0x0201f800, 0x00107073, 0x0201f800, + 0x00106e0c, 0x0201f800, 0x00106e15, 0x42027800, 0x00001000, 0x42028000, 0x0000002e, 0x0201f800, - 0x0010feea, 0x811a3000, 0x83197480, 0x00000004, - 0x040007ec, 0x040017eb, 0x0201f800, 0x001007f8, - 0x0201f800, 0x001029e3, 0x497b5061, 0x497b4408, - 0x4201d000, 0x003d0900, 0x0201f800, 0x00106490, + 0x001101fa, 0x811a3000, 0x83197480, 0x00000004, + 0x040007ec, 0x040017eb, 0x0201f800, 0x001007f6, + 0x0201f800, 0x00102aa7, 0x497b5061, 0x497b4408, + 0x4201d000, 0x003d0900, 0x0201f800, 0x00106695, 0x59c50880, 0x59c510a3, 0x497b4002, 0x0401febc, 0x0401ff5b, 0x4a03a005, 0x10000000, 0x59c4d005, 0x8268d540, 0x000000f0, 0x486b8805, 0x0401fed4, - 0x0201f800, 0x001029ec, 0x40c50000, 0x80c589c0, + 0x0201f800, 0x00102ab0, 0x40c50000, 0x80c589c0, 0x04020020, 0x59c8d001, 0x8068d1c0, 0x0402001d, 0x59dcd006, 0x8268d500, 0x43000f80, 0x0400000a, 0x59dcd006, 0x82697480, 0x00000000, 0x83f17500, @@ -27691,7 +27953,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x808101c0, 0x04020092, 0x59a0d408, 0x82697480, 0x0000dddd, 0x0400008e, 0x59c0d008, 0x8268d500, 0x0fffffff, 0x59c8d818, 0x826c0500, 0xf0000000, - 0x8068d540, 0x486b8008, 0x0201f800, 0x00100ca7, + 0x8068d540, 0x486b8008, 0x0201f800, 0x00100ca8, 0x59c0d806, 0x4a038006, 0x10000000, 0x59c0d809, 0x4883900d, 0x59c8d020, 0x8068e130, 0x59c8d020, 0x82690500, 0x00ffffff, 0x59c8d021, 0x8268fd00, @@ -27700,18 +27962,18 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04020004, 0x82717480, 0x00000032, 0x04000075, 0x486fc857, 0x4873c857, 0x4877c857, 0x4883c857, 0x487fc857, 0x487bc857, 0x59a9700f, 0x48bbc857, - 0x0201f800, 0x00102a03, 0x4a035061, 0x00000001, + 0x0201f800, 0x00102ac7, 0x4a035061, 0x00000001, 0x4200d000, 0x00000064, 0x0401f004, 0x8068d1c0, 0x04000072, 0x8068d040, 0x59c0d807, 0x8c6cdd04, - 0x040007fb, 0x0401fecb, 0x0201f800, 0x00106ff4, + 0x040007fb, 0x0401fecb, 0x0201f800, 0x001071f9, 0x0401febc, 0x4201d000, 0x000186a0, 0x0201f800, - 0x00106490, 0x488b88a3, 0x48878880, 0x59a8d061, - 0x8068d1c0, 0x04020050, 0x0201f800, 0x00102207, - 0x0401f07c, 0x4887c857, 0x0201f800, 0x0010224e, - 0x0401f078, 0x0201f800, 0x00107cfb, 0x40c66000, - 0x80c589c0, 0x04000041, 0x0201f800, 0x00103873, + 0x00106695, 0x488b88a3, 0x48878880, 0x59a8d061, + 0x8068d1c0, 0x04020050, 0x0201f800, 0x001022c6, + 0x0401f07c, 0x4887c857, 0x0201f800, 0x0010230d, + 0x0401f078, 0x0201f800, 0x00107ef5, 0x40c66000, + 0x80c589c0, 0x04000041, 0x0201f800, 0x00103963, 0x40c65800, 0x80c589c0, 0x04000022, 0x4a02601c, - 0x0010ccd1, 0x48898a05, 0x48898c05, 0x4882620b, + 0x0010cfd1, 0x48898a05, 0x48898c05, 0x4882620b, 0x4886640b, 0x59a0d40f, 0x8068d0e0, 0x59a0da0f, 0x406c0000, 0x8068d540, 0x486a600c, 0x59a0d40a, 0x8068d0e0, 0x59a0da0a, 0x406c0000, 0x8068d540, @@ -27719,22 +27981,22 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x406c0000, 0x8068d540, 0x486a600e, 0x59a0d411, 0x8068d0e0, 0x59a0da11, 0x406c0000, 0x8068d540, 0x486a600f, 0x0401fdfc, 0x80c589c0, 0x04020006, - 0x0201f800, 0x00107cbb, 0x4a034407, 0x00000002, + 0x0201f800, 0x00107eb1, 0x4a034407, 0x00000002, 0x0401f71e, 0x48ee602a, 0x58ee580c, 0x4a01d801, 0x00000001, 0x592cd206, 0x4869d805, 0x832cd400, 0x00000007, 0x4869d803, 0x4895d806, 0x4891d807, - 0x4a01d808, 0x0010f5a0, 0x4a034000, 0x00000001, + 0x4a01d808, 0x0010f8a0, 0x4a034000, 0x00000001, 0x49334001, 0x0401fec0, 0x0401f036, 0x4a035061, 0x00000001, 0x0401f7a8, 0x4a034407, 0x00000003, - 0x0401f706, 0x0201f800, 0x00102256, 0x0401f02d, + 0x0401f706, 0x0201f800, 0x00102315, 0x0401f02d, 0x82757480, 0x000000e1, 0x0402078a, 0x407c0000, 0x80817480, 0x04020787, 0x59a8d00f, 0x80697480, 0x04020784, 0x8278d500, 0x000000f0, 0x04020781, 0x0401fe4e, 0x0401f78b, 0x4a035061, 0x00000001, - 0x0201f800, 0x001018ec, 0x80c589c0, 0x04000008, + 0x0201f800, 0x001018f1, 0x80c589c0, 0x04000008, 0x59c4d005, 0x8268d500, 0x000000f0, 0x04000007, 0x4a034408, 0x0000bbbb, 0x0401f787, 0x4a034408, - 0x0000aaaa, 0x0401f784, 0x0201f800, 0x001029ec, + 0x0000aaaa, 0x0401f784, 0x0201f800, 0x00102ab0, 0x80c57040, 0x04000008, 0x59c0d007, 0x8268d500, 0x000501c0, 0x0400077c, 0x4a034408, 0x0000dddd, 0x0401f779, 0x4a034408, 0x0000cccc, 0x0401f776, @@ -27745,10 +28007,10 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x59a26001, 0x48ee602a, 0x58ee580c, 0x4979d801, 0x592cd206, 0x4869d805, 0x832cd400, 0x00000007, 0x4869d803, 0x5931700c, 0x48b9d806, 0x5931700d, - 0x48b9d807, 0x4a01d808, 0x0010f5a0, 0x4a034000, + 0x48b9d807, 0x4a01d808, 0x0010f8a0, 0x4a034000, 0x00000001, 0x40826000, 0x0401fe67, 0x0401f009, 0x41310000, 0x59a26001, 0x4933c857, 0x0201f800, - 0x00107cbe, 0x40826000, 0x0201f800, 0x00102256, + 0x00107eb4, 0x40826000, 0x0201f800, 0x00102315, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x412d1000, 0x41310800, @@ -27765,17 +28027,17 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x82697480, 0x00000103, 0x04000030, 0x41351800, 0x41452000, 0x592cd405, 0x8468d55e, 0x486a5c05, 0x42028800, 0x000007fd, 0x4200d000, 0x00fffffd, - 0x0201f800, 0x00104526, 0x40c66800, 0x80c589c0, - 0x04000010, 0x0201f800, 0x00109a1c, 0x80c589c0, + 0x0201f800, 0x00104622, 0x40c66800, 0x80c589c0, + 0x04000010, 0x0201f800, 0x00109c54, 0x80c589c0, 0x04000018, 0x40866000, 0x4881d801, 0x4a01d808, - 0x0010f57a, 0x0401f00f, 0x0201f800, 0x00102242, - 0x0201f800, 0x00107cbb, 0x40866000, 0x0401f019, - 0x59a26001, 0x0201f800, 0x00107cbb, 0x40866000, - 0x4a034407, 0x00000002, 0x0201f800, 0x0010224a, + 0x0010f87a, 0x0401f00f, 0x0201f800, 0x00102301, + 0x0201f800, 0x00107eb1, 0x40866000, 0x0401f019, + 0x59a26001, 0x0201f800, 0x00107eb1, 0x40866000, + 0x4a034407, 0x00000002, 0x0201f800, 0x00102309, 0x408a5800, 0x408e6800, 0x40928800, 0x0401f00d, - 0x0201f800, 0x00107cbb, 0x40866000, 0x4a034407, - 0x00000004, 0x0401f7f5, 0x0201f800, 0x00107cbb, - 0x40866000, 0x0201f800, 0x00102207, 0x408a5800, + 0x0201f800, 0x00107eb1, 0x40866000, 0x4a034407, + 0x00000004, 0x0401f7f5, 0x0201f800, 0x00107eb1, + 0x40866000, 0x0201f800, 0x001022c6, 0x408a5800, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000005, 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, @@ -27793,12 +28055,12 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x8068d0e0, 0x59a0da0e, 0x406c0000, 0x80691d40, 0x59a0d411, 0x8068d0e0, 0x59a0da11, 0x406c0000, 0x80691540, 0x4201d000, 0x00003a98, 0x0201f800, - 0x00106490, 0x4883a002, 0x59a97062, 0x48bba008, + 0x00106695, 0x4883a002, 0x59a97062, 0x48bba008, 0x488fa000, 0x488ba001, 0x59d0d005, 0x4a03a005, 0x10000000, 0x4178d000, 0x04025002, 0x8068d000, 0x8068d1c0, 0x04020007, 0x5884d001, 0x8068d000, 0x48690801, 0x4200d800, 0x00000001, 0x0401f011, - 0x4200d000, 0x0010f611, 0x4084d800, 0x4178e000, + 0x4200d000, 0x0010f911, 0x4084d800, 0x4178e000, 0x0201f800, 0x0010032b, 0x0401f7f4, 0x497a600d, 0x592e5801, 0x812e59c0, 0x040007df, 0x492e600c, 0x832cdc00, 0x00000006, 0x486e600b, 0x0401f7da, @@ -27812,7 +28074,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x48bbc857, 0x59d0d006, 0x8c68d504, 0x0400000a, 0x59d0d006, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, 0x82b97580, 0x0c000000, - 0x04020010, 0x0401f033, 0x4200d000, 0x0010f679, + 0x04020010, 0x0401f033, 0x4200d000, 0x0010f979, 0x4080e000, 0x0201f800, 0x0010032b, 0x59d0d006, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x040007f5, 0x82b97480, 0x0c000000, 0x040007f2, @@ -27826,8 +28088,8 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4a034408, 0x0000dddd, 0x0401f006, 0x48690001, 0x4080d000, 0x0401ff47, 0x80c589c0, 0x040207f6, 0x589d0000, 0x809d3800, 0x1c01f000, 0x0201f800, - 0x001018ec, 0x80c589c0, 0x04020002, 0x0401f009, - 0x4a034407, 0x00000017, 0x0201f800, 0x0010224a, + 0x001018f1, 0x80c589c0, 0x04020002, 0x0401f009, + 0x4a034407, 0x00000017, 0x0201f800, 0x00102309, 0x4203e000, 0x50000000, 0x497bc856, 0x0401f000, 0x1c01f000, 0x4068d800, 0x59c17009, 0x48bbc857, 0x59c0e009, 0x8270d500, 0x00e00000, 0x04000019, @@ -27868,7 +28130,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0400000c, 0x59c17007, 0x48bbc857, 0x59c0d007, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, 0x82b97580, 0x0c000000, 0x04020010, - 0x0401f035, 0x4200d000, 0x0010f75b, 0x4080e000, + 0x0401f035, 0x4200d000, 0x0010fa5b, 0x4080e000, 0x0201f800, 0x0010032b, 0x59c0d007, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x040007f5, 0x82b97480, 0x0c000000, 0x040007f2, 0x4a038006, @@ -27883,13 +28145,13 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x48690002, 0x4080d000, 0x0401ff54, 0x80c589c0, 0x040207f6, 0x589d0000, 0x809d3800, 0x1c01f000, 0x59a26000, 0x813261c0, 0x04000009, 0x59325809, - 0x812e59c0, 0x04000005, 0x0201f800, 0x00107cbb, + 0x812e59c0, 0x04000005, 0x0201f800, 0x00107eb1, 0x0201f800, 0x0010059d, 0x497b4000, 0x59a26001, 0x813261c0, 0x04000009, 0x59325809, 0x812e59c0, - 0x04000005, 0x0201f800, 0x00107cbb, 0x0201f800, + 0x04000005, 0x0201f800, 0x00107eb1, 0x0201f800, 0x0010059d, 0x497b4001, 0x1c01f000, 0x809d3840, - 0x48813800, 0x40690000, 0x0201f800, 0x00102a03, - 0x0201f800, 0x0010f3b1, 0x5880d00b, 0x8068d1c0, + 0x48813800, 0x40690000, 0x0201f800, 0x00102ac7, + 0x0201f800, 0x0010f6b1, 0x5880d00b, 0x8068d1c0, 0x04020004, 0x5880d00c, 0x8068d1c0, 0x04000007, 0x59a0d00d, 0x8068d1c0, 0x0402000a, 0x4200d000, 0x00000001, 0x0401f009, 0x5880d00d, 0x8068d1c0, @@ -27918,7 +28180,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00000003, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, 0x497bc856, 0x4203a000, 0x00007600, 0x4200d000, 0x00000040, - 0x0201f800, 0x001012d0, 0x4a03a00a, 0x00000001, + 0x0201f800, 0x001012d1, 0x4a03a00a, 0x00000001, 0x4a03a005, 0x20000000, 0x59d0d006, 0x4a03a005, 0x30000000, 0x59d0d006, 0x82690d00, 0x00000020, 0x8c68d50a, 0x040207fc, 0x59a0d20d, 0x48690005, @@ -27928,12 +28190,12 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x406c0000, 0x8068d540, 0x48690006, 0x59a0d40c, 0x8068d0e0, 0x59a0da0c, 0x826c0500, 0x0000fffc, 0x8068d540, 0x48690009, 0x486ba003, 0x0201f800, - 0x00107cfb, 0x40c66000, 0x80c589c0, 0x0400004f, + 0x00107ef5, 0x40c66000, 0x80c589c0, 0x0400004f, 0x49334001, 0x0201f800, 0x00100580, 0x40c65800, 0x80c589c0, 0x04000041, 0x4a025a05, 0x00000018, 0x4a025806, 0x00abcdef, 0x492e6009, 0x492e600c, 0x58817005, 0x48ba600e, 0x48865c11, 0x4a02601c, - 0x0010ccd1, 0x4a02600d, 0x00000004, 0x832cd400, + 0x0010cfd1, 0x4a02600d, 0x00000004, 0x832cd400, 0x00000012, 0x486a600b, 0x48690008, 0x4a01000a, 0x0000000c, 0x5880d005, 0x8068d040, 0x48690005, 0x4080d000, 0x0401ff5d, 0x59a0d408, 0x82697480, @@ -27946,14 +28208,14 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x83f17500, 0x03000000, 0x040007ef, 0x4979000a, 0x4178e000, 0x8270e400, 0x0000000c, 0x8068d840, 0x406cd000, 0x806cd9c0, 0x040207fb, 0x4871000a, - 0x486d0005, 0x0401f7e9, 0x4200d000, 0x0010f837, + 0x486d0005, 0x0401f7e9, 0x4200d000, 0x0010fb37, 0x4200d800, 0x00100580, 0x4080e000, 0x0201f800, - 0x0010032b, 0x0401f7b9, 0x4200d000, 0x0010f837, - 0x4200d800, 0x00107cfb, 0x4080e000, 0x0201f800, + 0x0010032b, 0x0401f7b9, 0x4200d000, 0x0010fb37, + 0x4200d800, 0x00107ef5, 0x4080e000, 0x0201f800, 0x0010032b, 0x0401f7ab, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x809d3840, 0x48813800, 0x40690000, 0x497bc856, 0x42038000, - 0x00007700, 0x0201f800, 0x00100ca7, 0x59c0d006, + 0x00007700, 0x0201f800, 0x00100ca8, 0x59c0d006, 0x59a0d40d, 0x48690005, 0x8068d1c0, 0x04020009, 0x497b9009, 0x59e0d003, 0x8268d540, 0x00008060, 0x486bc003, 0x4a038009, 0x00e00000, 0x0401f07d, @@ -27962,13 +28224,13 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x59a0da0f, 0x406c0000, 0x8068d540, 0x48690006, 0x59a0d40c, 0x8068d0e0, 0x59a0da0c, 0x826c0500, 0x0000fffc, 0x8068d540, 0x48690009, 0x486bc857, - 0x58817009, 0x48bb8003, 0x0201f800, 0x00107cfb, + 0x58817009, 0x48bb8003, 0x0201f800, 0x00107ef5, 0x40c66000, 0x80c589c0, 0x0400005a, 0x49334000, 0x0201f800, 0x00100580, 0x40c65800, 0x80c589c0, 0x0400004c, 0x4a025a05, 0x00000018, 0x4a025806, 0x00abcdef, 0x492e6009, 0x492e600c, 0x58817005, 0x48ba600e, 0x4a02600d, 0x00000004, 0x497a5c11, - 0x4a02601c, 0x0010ccd1, 0x832cd400, 0x00000012, + 0x4a02601c, 0x0010cfd1, 0x832cd400, 0x00000012, 0x486a600b, 0x48690008, 0x4a01000a, 0x0000000c, 0x5880d005, 0x8068d040, 0x48690005, 0x4080d000, 0x0401fed2, 0x59a0d408, 0x82697480, 0x0000dddd, @@ -27984,49 +28246,49 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x832cd400, 0x00000006, 0x48690008, 0x4080d000, 0x0401fea6, 0x80c589c0, 0x040207ea, 0x59a0d408, 0x82697480, 0x0000dddd, 0x0402078e, 0x0401f011, - 0x4200d000, 0x0010f8c8, 0x4200d800, 0x00100580, + 0x4200d000, 0x0010fbc8, 0x4200d800, 0x00100580, 0x4080e000, 0x0201f800, 0x0010032b, 0x0401f7ae, - 0x4200d000, 0x0010f8c8, 0x4200d800, 0x00107cfb, + 0x4200d000, 0x0010fbc8, 0x4200d800, 0x00107ef5, 0x4080e000, 0x0201f800, 0x0010032b, 0x0401f7a0, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690800, - 0x406d0000, 0x0201f800, 0x0010193b, 0x40800000, - 0x4084d000, 0x80c4dd00, 0x0201f800, 0x00101942, + 0x406d0000, 0x0201f800, 0x00101940, 0x40800000, + 0x4084d000, 0x80c4dd00, 0x0201f800, 0x00101947, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690800, 0x406d0000, 0x0201f800, - 0x0010193b, 0x40800000, 0x4084d000, 0x80c4dd40, - 0x0201f800, 0x00101942, 0x589d0801, 0x589d0000, + 0x00101940, 0x40800000, 0x4084d000, 0x80c4dd40, + 0x0201f800, 0x00101947, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x809d3840, 0x48813800, 0x4200d000, 0x000000ef, 0x0201f800, - 0x001015c3, 0x4a03500f, 0x000000ef, 0x59c4d0a3, + 0x001015c4, 0x4a03500f, 0x000000ef, 0x59c4d0a3, 0x8468d55a, 0x8468d53a, 0x486b88a3, 0x0201f800, - 0x0010161e, 0x80c589c0, 0x04000043, 0x4200d000, - 0x00000001, 0x0201f800, 0x001018a1, 0x4200d000, - 0x00000001, 0x0201f800, 0x00101827, 0x4178d000, + 0x00101623, 0x80c589c0, 0x04000043, 0x4200d000, + 0x00000001, 0x0201f800, 0x001018a6, 0x4200d000, + 0x00000001, 0x0201f800, 0x0010182c, 0x4178d000, 0x4200d800, 0x00000004, 0x0401ffd3, 0x4201d000, - 0x00000014, 0x0201f800, 0x0010645c, 0x59c4d008, + 0x00000014, 0x0201f800, 0x00106661, 0x59c4d008, 0x8468d54e, 0x8268d500, 0xffffffe1, 0x486b8808, 0x4a0388a7, 0x0000f7f7, 0x4a038805, 0x04000001, 0x4200d000, 0xbe20bfff, 0x4200d800, 0x80018000, - 0x0201f800, 0x001041ab, 0x4200d000, 0xfffeffff, - 0x4178d800, 0x0201f800, 0x001041ab, 0x42010000, + 0x0201f800, 0x001042a4, 0x4200d000, 0xfffeffff, + 0x4178d800, 0x0201f800, 0x001042a4, 0x42010000, 0x00001387, 0x0401f008, 0x80817040, 0x04000048, 0x80810040, 0x42000000, 0xffffffff, 0x80817480, 0x04000009, 0x4201d000, 0x00000014, 0x0201f800, - 0x0010645c, 0x0201f800, 0x001018ec, 0x80c589c0, + 0x00106661, 0x0201f800, 0x001018f1, 0x80c589c0, 0x040007f2, 0x59c4d005, 0x8268dd00, 0x04000000, 0x8c68d534, 0x04020018, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x82697480, 0x00000008, 0x04020031, - 0x0401f011, 0x0201f800, 0x0010162c, 0x80c589c0, - 0x04000006, 0x4178d000, 0x0201f800, 0x001018a1, + 0x0401f011, 0x0201f800, 0x00101631, 0x80c589c0, + 0x04000006, 0x4178d000, 0x0201f800, 0x001018a6, 0x4178d000, 0x0401f7bc, 0x4200d000, 0x00000002, - 0x0201f800, 0x001018a1, 0x4200d000, 0x00000002, + 0x0201f800, 0x001018a6, 0x4200d000, 0x00000002, 0x0401f7b5, 0x4200d000, 0x00020000, 0x0201f800, - 0x001041b2, 0x4201d000, 0x00000064, 0x0201f800, - 0x0010645c, 0x4200d000, 0xfeffffff, 0x4200d800, - 0x02000000, 0x0201f800, 0x001041ab, 0x4200d000, - 0xfdffffff, 0x4178d800, 0x0201f800, 0x001041ab, + 0x001042ab, 0x4201d000, 0x00000064, 0x0201f800, + 0x00106661, 0x4200d000, 0xfeffffff, 0x4200d800, + 0x02000000, 0x0201f800, 0x001042a4, 0x4200d000, + 0xfdffffff, 0x4178d800, 0x0201f800, 0x001042a4, 0x4a038805, 0x04000001, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x4178d800, 0x8068d1c0, 0x04020005, 0x4200d800, 0x00000001, 0x0401f002, 0x40c4d800, @@ -28039,45 +28301,45 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0402000e, 0x59a0d407, 0x82690500, 0x00000007, 0x82817480, 0x00000002, 0x04000015, 0x808101c0, 0x04000023, 0x80817040, 0x040000e0, 0x0201f800, - 0x0010224e, 0x0401f18d, 0x0201f800, 0x00101648, + 0x0010230d, 0x0401f18d, 0x0201f800, 0x0010164d, 0x80c589c0, 0x040007f0, 0x4200d000, 0x00000002, - 0x0201f800, 0x001018a1, 0x4200d000, 0x00000002, - 0x0201f800, 0x00101827, 0x0401f7e7, 0x8d0e1d0e, - 0x0402000c, 0x0201f800, 0x00104fbf, 0x80c589c0, + 0x0201f800, 0x001018a6, 0x4200d000, 0x00000002, + 0x0201f800, 0x0010182c, 0x0401f7e7, 0x8d0e1d0e, + 0x0402000c, 0x0201f800, 0x001050f0, 0x80c589c0, 0x04020170, 0x836d7480, 0x00000003, 0x04020005, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x04000010, - 0x0201f800, 0x00102252, 0x0401f170, 0x4200d000, + 0x0201f800, 0x00102311, 0x0401f170, 0x4200d000, 0x000000c0, 0x4200d800, 0x00000002, 0x0401ff26, 0x4080d000, 0x4200d800, 0x00000008, 0x0401ff22, 0x0401ff33, 0x80c589c0, 0x040000bb, 0x59a0d410, 0x8068d0e0, 0x59a0da10, 0x406c0000, 0x8068d540, 0x48694000, 0x497b4408, 0x4979400b, 0x4979400c, 0x4979400d, 0x49794002, 0x49794001, 0x0201f800, - 0x001029e3, 0x0201f800, 0x00106c35, 0x598e600f, - 0x0201f800, 0x00106f55, 0x0201f800, 0x00106c35, - 0x417a3000, 0x0201f800, 0x001072f1, 0x59926004, - 0x813261c0, 0x0400000d, 0x0201f800, 0x00106e6e, - 0x0201f800, 0x00106c07, 0x0201f800, 0x00106c10, + 0x00102aa7, 0x0201f800, 0x00106e3a, 0x598e600f, + 0x0201f800, 0x0010715a, 0x0201f800, 0x00106e3a, + 0x417a3000, 0x0201f800, 0x001074f6, 0x59926004, + 0x813261c0, 0x0400000d, 0x0201f800, 0x00107073, + 0x0201f800, 0x00106e0c, 0x0201f800, 0x00106e15, 0x42027800, 0x00001000, 0x42028000, 0x0000002e, - 0x0201f800, 0x0010feea, 0x811a3000, 0x83197480, + 0x0201f800, 0x001101fa, 0x811a3000, 0x83197480, 0x00000004, 0x040007ec, 0x040017eb, 0x0201f800, - 0x001007f8, 0x59a8d06d, 0x8068d1c0, 0x0402007f, + 0x001007f6, 0x59a8d06d, 0x8068d1c0, 0x0402007f, 0x49794004, 0x497b4002, 0x40a0d000, 0x0401fe44, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000126, 0x40a0d000, 0x0401fdad, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000120, 0x59a0d00d, 0x8068d1c0, 0x040200ef, 0x4979400e, 0x40a0d000, 0x0201f800, - 0x0010f611, 0x0201f800, 0x0010f358, 0x58a0d004, + 0x0010f911, 0x0201f800, 0x0010f658, 0x58a0d004, 0x8068d1c0, 0x04000053, 0x58a0e00e, 0x80717040, 0x0400007c, 0x59c8d001, 0x8068d1c0, 0x04020070, 0x59a0d002, 0x42000000, 0xfeedbeef, 0x80697480, 0x040000d8, 0x4a014003, 0x10000000, 0x40a0d000, 0x0401fc56, 0x4a034002, 0xfeedbeef, 0x40a0d000, - 0x0201f800, 0x0010f679, 0x59a0d408, 0x82697480, + 0x0201f800, 0x0010f979, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000028, 0x40a0d000, 0x0401fca7, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000022, - 0x0201f800, 0x0010f39f, 0x59c4d005, 0x8c68d534, - 0x040200cf, 0x0201f800, 0x001029ec, 0x80c589c0, + 0x0201f800, 0x0010f69f, 0x59c4d005, 0x8c68d534, + 0x040200cf, 0x0201f800, 0x00102ab0, 0x80c589c0, 0x040200ce, 0x59a0d00d, 0x8068d1c0, 0x04000016, 0x59a26000, 0x59a0d40d, 0x8068d1c0, 0x04000004, 0x5930d00e, 0x8068d1c0, 0x040207c7, 0x59a26001, @@ -28089,16 +28351,16 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04020042, 0x40a0d000, 0x0401fce5, 0x80c589c0, 0x04020051, 0x58a0d000, 0x8068d1c0, 0x04020047, 0x0401f04d, 0x59c8d001, 0x8068d1c0, 0x040207af, - 0x40a0d000, 0x0201f800, 0x0010f679, 0x59a0d408, + 0x40a0d000, 0x0201f800, 0x0010f979, 0x59a0d408, 0x82697480, 0x0000dddd, 0x040007a8, 0x0201f800, - 0x001029ec, 0x80c589c0, 0x040007f3, 0x0201f800, - 0x0010f6d0, 0x4a01400d, 0x0000aaaa, 0x4a01400e, + 0x00102ab0, 0x80c589c0, 0x040007f3, 0x0201f800, + 0x0010f9d0, 0x4a01400d, 0x0000aaaa, 0x4a01400e, 0x00000001, 0x0401f79d, 0x59c4d001, 0x8468d518, 0x486b8801, 0x0401f77f, 0x4200d000, 0x000000c0, 0x4080d800, 0x0401fe68, 0x0401fe79, 0x80c589c0, 0x04020747, 0x4088d000, 0x408cd800, 0x4090e000, 0x0201f800, 0x0010032b, 0x0401f741, 0x40a0d000, - 0x0201f800, 0x0010f6de, 0x80c589c0, 0x0400078d, + 0x0201f800, 0x0010f9de, 0x80c589c0, 0x0400078d, 0x4a01400e, 0x00000001, 0x4200e000, 0x00000001, 0x58a0d000, 0x8068d040, 0x48694000, 0x4200d800, 0x00030d40, 0x80717040, 0x04020004, 0x0401f7c2, @@ -28107,8 +28369,8 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x59c0d007, 0x8268d500, 0x000501c0, 0x04000058, 0x4a01400d, 0x0000dddd, 0x40a0d000, 0x0401fc98, 0x80c589c0, 0x04020004, 0x58a0d000, 0x8068d1c0, - 0x0402074c, 0x0201f800, 0x00106ff4, 0x0201f800, - 0x0010f3a5, 0x4201d000, 0x000186a0, 0x48978880, + 0x0402074c, 0x0201f800, 0x001071f9, 0x0201f800, + 0x0010f6a5, 0x4201d000, 0x000186a0, 0x48978880, 0x48938808, 0x488f88a3, 0x4887500f, 0x488b9040, 0x42038000, 0x00007700, 0x4a038009, 0xf4f60000, 0x4a038891, 0x0000ffff, 0x4a03900d, 0x00000040, @@ -28118,112 +28380,116 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x04000013, 0x4200d000, 0x000000c0, 0x4200d800, 0xfffffffc, 0x0401fe02, 0x4178d000, 0x4200d800, 0xfffffff7, 0x0401fdfe, 0x4178d000, 0x4200d800, - 0xfffffffb, 0x0401fdfa, 0x0201f800, 0x00104fdb, + 0xfffffffb, 0x0401fdfa, 0x0201f800, 0x0010510c, 0x40c50000, 0x80c589c0, 0x04000034, 0x59a0d408, 0x82697480, 0x0000dddd, 0x0400000f, 0x58a0d80b, 0x806cd9c0, 0x04020007, 0x58a0d00c, 0x8068d1c0, 0x04020004, 0x58a0d00d, 0x8068d1c0, 0x0400003d, 0x486f4407, 0x58a0d00c, 0x486b4208, 0x58a0d00d, - 0x486b4408, 0x0201f800, 0x0010225a, 0x0401f037, + 0x486b4408, 0x0201f800, 0x00102319, 0x0401f037, 0x4a014003, 0x10000004, 0x0401f729, 0x40a0d000, - 0x0201f800, 0x0010f611, 0x0401f70f, 0x0201f800, - 0x0010f6d0, 0x0401f7a7, 0x40a0d000, 0x0401fc40, + 0x0201f800, 0x0010f911, 0x0401f70f, 0x0201f800, + 0x0010f9d0, 0x0401f7a7, 0x40a0d000, 0x0401fc40, 0x80c589c0, 0x040007a5, 0x0401f7ab, 0x4a01400d, 0x0000bbbb, 0x0401f787, 0x4a01400d, 0x0000cccc, 0x58a0d000, 0x486b4210, 0x58a0d000, 0x8068d120, 0x486b4410, 0x0401f77f, 0x59a8d06e, 0x0201f800, - 0x00101b44, 0x0401f7b6, 0x4a0388a7, 0x0000f7f7, + 0x00101b49, 0x0401f7b6, 0x4a0388a7, 0x0000f7f7, 0x4200d000, 0xbeffffff, 0x4200d800, 0x80018000, - 0x0201f800, 0x001041ab, 0x4200d000, 0xfffeffff, - 0x4080d800, 0x0201f800, 0x001041ab, 0x0401f7c0, - 0x4a034407, 0x00000016, 0x0201f800, 0x0010224a, + 0x0201f800, 0x001042a4, 0x4200d000, 0xfffeffff, + 0x4080d800, 0x0201f800, 0x001042a4, 0x0401f7c0, + 0x4a034407, 0x00000016, 0x0201f800, 0x00102309, 0x0401f006, 0x40a0d000, 0x0401fc19, 0x0401f786, - 0x0201f800, 0x00102207, 0x589d2805, 0x589d2004, + 0x0201f800, 0x001022c6, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000015, 0x589d4000, 0x809d3800, - 0x1c01f000, 0x809d3840, 0x48813800, 0x4937c857, - 0x42010000, 0x00000001, 0x0201f800, 0x00107cfb, - 0x40c66000, 0x80c589c0, 0x04000015, 0x4925881c, - 0x4935880a, 0x48818c07, 0x417a7800, 0x0201f800, - 0x001044e6, 0x59a8d016, 0x8068d000, 0x486b5016, - 0x599cd019, 0x417a7000, 0x8c68d50e, 0x04020003, - 0x42027000, 0x00000004, 0x0201f800, 0x00107d2c, - 0x599cd208, 0x486a6c12, 0x41790000, 0x40818800, - 0x589d0000, 0x809d3800, 0x1c01f000, 0x4937c857, - 0x5934d200, 0x8468d502, 0x486a6a00, 0x1c01f000, - 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, - 0x48893802, 0x488d3803, 0x41350800, 0x41451000, - 0x412d1800, 0x4943c857, 0x493fc857, 0x0201f800, - 0x00106c35, 0x40c50000, 0x59a8d078, 0x82697480, - 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, - 0x82b97580, 0x0c000000, 0x04020068, 0x0201f800, - 0x001101b9, 0x0201f800, 0x001101a9, 0x0201f800, - 0x0011025c, 0x0201f800, 0x001103bf, 0x808101c0, - 0x04000003, 0x0201f800, 0x00106c29, 0x417a8800, - 0x0401f00a, 0x58c4d200, 0x8c68d50e, 0x0400000e, - 0x81468800, 0x83457480, 0x000007ef, 0x83f17500, - 0x03000000, 0x04000026, 0x0201f800, 0x001045e2, - 0x40c66800, 0x80c589c0, 0x040007f6, 0x8d3e7d06, - 0x040207f1, 0x8d3e7d18, 0x0400003f, 0x5935000f, - 0x0401f007, 0x49410207, 0x40825800, 0x58810000, + 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, + 0x48853801, 0x59a8d006, 0x82690d00, 0x00004000, + 0x4178d800, 0x8c68d51c, 0x04020020, 0x4937c857, + 0x42010000, 0x00000001, 0x0201f800, 0x00107ef5, + 0x40c66000, 0x80c589c0, 0x04020003, 0x4080d800, + 0x0401f016, 0x4925881c, 0x4935880a, 0x48818c07, + 0x40867800, 0x0201f800, 0x001045df, 0x59a8d016, + 0x8068d000, 0x486b5016, 0x599cd019, 0x40867000, + 0x8c68d50e, 0x04020003, 0x42027000, 0x00000004, + 0x0201f800, 0x00107f26, 0x599cd208, 0x486a6c12, + 0x41790000, 0x4080d800, 0x406d8800, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, + 0x4937c857, 0x5934d200, 0x8468d502, 0x486a6a00, + 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, + 0x48853801, 0x48893802, 0x488d3803, 0x41350800, + 0x41451000, 0x412d1800, 0x4943c857, 0x493fc857, + 0x0201f800, 0x00106e3a, 0x40c50000, 0x59a8d078, + 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, + 0x04000004, 0x82b97580, 0x0c000000, 0x04020069, + 0x0201f800, 0x001104b6, 0x0201f800, 0x001104a6, + 0x0201f800, 0x00110559, 0x0201f800, 0x001106bc, + 0x808101c0, 0x04000003, 0x0201f800, 0x00106e2e, + 0x417a8800, 0x0401f00a, 0x58c4d200, 0x8c68d50e, + 0x0400000e, 0x81468800, 0x83457480, 0x000007ef, + 0x83f17500, 0x03000000, 0x04000027, 0x0201f800, + 0x001046de, 0x40c66800, 0x80c589c0, 0x040007f6, + 0x8d3e7d06, 0x040207f1, 0x497a6c0b, 0x8d3e7d18, + 0x0400003f, 0x5935000f, 0x0401f007, 0x49410207, + 0x40825800, 0x58810000, 0x492fc857, 0x0201f800, + 0x000203ef, 0x808101c0, 0x040207f9, 0x497a680f, + 0x497a6810, 0x4937c857, 0x4a026c00, 0x00000707, + 0x497a6a03, 0x497a6811, 0x599cd401, 0x486a6a0b, + 0x5934d402, 0x8268d500, 0x000000ff, 0x486a6c02, + 0x81468800, 0x83457480, 0x000007ef, 0x040007dc, + 0x040017db, 0x8d3e7d02, 0x0400002f, 0x497b5018, + 0x42028800, 0x000007f0, 0x0401f007, 0x81468800, + 0x83457480, 0x000007ff, 0x83f17500, 0x03000000, + 0x04000025, 0x0201f800, 0x001046de, 0x40c66800, + 0x80c589c0, 0x040007f6, 0x48c7c857, 0x4a018c00, + 0x00000707, 0x58c4d00c, 0x8068d1c0, 0x040207f0, + 0x58c4d00f, 0x8068d1c0, 0x040207ed, 0x0201f800, + 0x001042dd, 0x81468800, 0x83457480, 0x000007ff, + 0x040007ed, 0x040017ec, 0x0401f00f, 0x4937c857, + 0x8d0e1d20, 0x04000004, 0x4a026c00, 0x00000707, + 0x0401f7ad, 0x0201f800, 0x001042dd, 0x0401f7aa, + 0x8c68d506, 0x04000797, 0x0201f800, 0x0010b89b, + 0x0401f794, 0x40866800, 0x408a8800, 0x408e5800, + 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000004, 0x1c01f000, 0x829d3c80, + 0x00000006, 0x48813800, 0x48853801, 0x48893802, + 0x488d3803, 0x48913804, 0x48953805, 0x41352800, + 0x41412000, 0x41451800, 0x412d1000, 0x4933c857, + 0x493fc857, 0x4927c857, 0x0201f800, 0x00106e3a, + 0x40c50800, 0x5932680a, 0x813669c0, 0x0400002b, + 0x5934d403, 0x406a8800, 0x42028000, 0x00000029, + 0x0201f800, 0x00110363, 0x0201f800, 0x00110447, + 0x0201f800, 0x001104e0, 0x0201f800, 0x00110916, + 0x4937c857, 0x8d3e7d06, 0x0402001f, 0x497a6c0b, + 0x8d3e7d18, 0x04000022, 0x5935000f, 0x808101c0, + 0x0400000b, 0x49410207, 0x40825800, 0x58810000, 0x492fc857, 0x0201f800, 0x000203ef, 0x808101c0, - 0x040207f9, 0x497a680f, 0x497a6810, 0x4937c857, + 0x040207f9, 0x4882680f, 0x48826810, 0x4937c857, 0x4a026c00, 0x00000707, 0x497a6a03, 0x497a6811, 0x599cd401, 0x486a6a0b, 0x5934d402, 0x8268d500, - 0x000000ff, 0x486a6c02, 0x81468800, 0x83457480, - 0x000007ef, 0x040007dd, 0x040017dc, 0x8d3e7d02, - 0x0400002f, 0x497b5018, 0x42028800, 0x000007f0, - 0x0401f007, 0x81468800, 0x83457480, 0x000007ff, - 0x83f17500, 0x03000000, 0x04000025, 0x0201f800, - 0x001045e2, 0x40c66800, 0x80c589c0, 0x040007f6, - 0x48c7c857, 0x4a018c00, 0x00000707, 0x58c4d00c, - 0x8068d1c0, 0x040207f0, 0x58c4d00f, 0x8068d1c0, - 0x040207ed, 0x0201f800, 0x001041e4, 0x81468800, - 0x83457480, 0x000007ff, 0x040007ed, 0x040017ec, - 0x0401f00f, 0x4937c857, 0x8d0e1d20, 0x04000004, - 0x4a026c00, 0x00000707, 0x0401f7ae, 0x0201f800, - 0x001041e4, 0x0401f7ab, 0x8c68d506, 0x04000798, - 0x0201f800, 0x0010b570, 0x0401f795, 0x40866800, - 0x408a8800, 0x408e5800, 0x589d1803, 0x589d1002, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000004, - 0x1c01f000, 0x829d3c80, 0x00000006, 0x48813800, - 0x48853801, 0x48893802, 0x488d3803, 0x48913804, - 0x48953805, 0x41352800, 0x41412000, 0x41451800, - 0x412d1000, 0x4933c857, 0x493fc857, 0x4927c857, - 0x0201f800, 0x00106c35, 0x40c50800, 0x5932680a, - 0x813669c0, 0x0400002a, 0x5934d403, 0x406a8800, - 0x42028000, 0x00000029, 0x0201f800, 0x00110053, - 0x0201f800, 0x0011014a, 0x0201f800, 0x001101e3, - 0x0201f800, 0x00110623, 0x4937c857, 0x8d3e7d06, - 0x0402001e, 0x8d3e7d18, 0x04000021, 0x5935000f, - 0x808101c0, 0x0400000b, 0x49410207, 0x40825800, - 0x58810000, 0x492fc857, 0x0201f800, 0x000203ef, - 0x808101c0, 0x040207f9, 0x4882680f, 0x48826810, - 0x4937c857, 0x4a026c00, 0x00000707, 0x497a6a03, - 0x497a6811, 0x599cd401, 0x486a6a0b, 0x5934d402, - 0x8268d500, 0x000000ff, 0x486a6c02, 0x808509c0, - 0x04000013, 0x0401f00c, 0x5934d200, 0x8c68d50e, - 0x040207fb, 0x8d3e7d18, 0x040207e1, 0x8d0e1d20, + 0x000000ff, 0x486a6c02, 0x808509c0, 0x04000014, + 0x0401f00d, 0x5934d200, 0x8c68d50e, 0x040207fb, + 0x497a6c0b, 0x8d3e7d18, 0x040207e0, 0x8d0e1d20, 0x04000008, 0x4a026c00, 0x00000707, 0x808509c0, - 0x04000007, 0x0201f800, 0x00106c29, 0x0401f004, - 0x0201f800, 0x001041e4, 0x0401f7ed, 0x408a5800, + 0x04000007, 0x0201f800, 0x00106e2e, 0x0401f004, + 0x0201f800, 0x001042dd, 0x0401f7ec, 0x408a5800, 0x408e8800, 0x40928000, 0x40966800, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000006, 0x1c01f000, 0x809d3840, 0x48813800, 0x4937c857, 0x42010000, - 0x00000001, 0x0201f800, 0x00107cfb, 0x40c66000, + 0x00000001, 0x0201f800, 0x00107ef5, 0x40c66000, 0x80c589c0, 0x0400001e, 0x4925881c, 0x4935880a, 0x5934d403, 0x82697480, 0x000007fe, 0x04000003, - 0x417a7800, 0x0401ff90, 0x48826407, 0x417a7800, - 0x0201f800, 0x001044e6, 0x4200d000, 0x00000003, - 0x0201f800, 0x001044f0, 0x836d7480, 0x00000003, + 0x417a7800, 0x0401ff8e, 0x48826407, 0x417a7800, + 0x0201f800, 0x001045df, 0x4200d000, 0x00000003, + 0x0201f800, 0x001045e9, 0x836d7480, 0x00000003, 0x04000004, 0x59a8d016, 0x8068d000, 0x486b5016, - 0x42027000, 0x00000002, 0x0201f800, 0x00107d2c, + 0x42027000, 0x00000002, 0x0201f800, 0x00107f26, 0x599cd208, 0x486a6c12, 0x41790000, 0x40818800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000003, 0x48813800, 0x48853801, 0x48893802, 0x40690800, 0x406d1000, 0x41bd0000, 0x0201f800, - 0x00106c10, 0x5880d031, 0x41300000, 0x80697480, + 0x00106e15, 0x5880d031, 0x41300000, 0x80697480, 0x04000018, 0x5880d030, 0x41300000, 0x80697480, 0x0400001f, 0x5930d800, 0x806cd9c0, 0x04020008, 0x59317001, 0x48b91001, 0x5930d001, 0x8068d1c0, @@ -28247,7 +28513,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x409d4000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x41790800, 0x40850000, 0x4933c857, 0x0201f800, - 0x00106c35, 0x40c52000, 0x41351800, 0x41191000, + 0x00106e3a, 0x40c52000, 0x41351800, 0x41191000, 0x49914003, 0x49d14000, 0x49a54001, 0x49154002, 0x5932680a, 0x59bce031, 0x4070d800, 0x8070e1c0, 0x04020008, 0x0401f01e, 0x406ce000, 0x586cd800, @@ -28258,47 +28524,47 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0401f005, 0x406d0000, 0x586cd801, 0x806cd9c0, 0x040007ec, 0x806d7480, 0x040207fb, 0x42010800, 0x00000001, 0x806cd9c0, 0x040207e8, 0x80857040, - 0x04000029, 0x417a3000, 0x0201f800, 0x001072f1, + 0x04000029, 0x417a3000, 0x0201f800, 0x001074f6, 0x5990d004, 0x41300000, 0x80697480, 0x0400000f, 0x811a3000, 0x83197480, 0x00000004, 0x040007f7, 0x040017f6, 0x408a3000, 0x408e6800, 0x58a32003, 0x58a3a000, 0x58a34801, 0x58a22802, 0x80917040, 0x04020019, 0x0401f011, 0x42010800, 0x00000001, - 0x0201f800, 0x00106e6e, 0x0201f800, 0x00106c07, - 0x0201f800, 0x00106c10, 0x408a3000, 0x408e6800, + 0x0201f800, 0x00107073, 0x0201f800, 0x00106e0c, + 0x0201f800, 0x00106e15, 0x408a3000, 0x408e6800, 0x58a32003, 0x58a3a000, 0x58a34801, 0x58a22802, - 0x80917040, 0x04020008, 0x0201f800, 0x00106c29, + 0x80917040, 0x04020008, 0x0201f800, 0x00106e2e, 0x0401f005, 0x4070d000, 0x4080d800, 0x0401ff40, 0x0401f7e1, 0x40858800, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000009, 0x589d4000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, 0x59310800, 0x497a6000, 0x0201f800, - 0x00106c10, 0x808101c0, 0x04000008, 0x48850000, + 0x00106e15, 0x808101c0, 0x04000008, 0x48850000, 0x598cd00a, 0x41300000, 0x80697480, 0x0402000b, 0x4883180a, 0x0401f009, 0x598cd00a, 0x41300000, 0x80697480, 0x04000003, 0x4887180b, 0x0401f003, - 0x4883180a, 0x4883180b, 0x0201f800, 0x00106c22, + 0x4883180a, 0x4883180b, 0x0201f800, 0x00106e27, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x598d000b, 0x41790800, 0x4933c857, 0x813261c0, 0x04020007, 0x0401f00a, 0x41300000, 0x80817480, 0x0400000e, 0x40810800, 0x58810000, 0x808101c0, 0x040207fa, 0x4178d000, 0x0401f015, - 0x4200d000, 0x000005a7, 0x4080d800, 0x4084e000, + 0x4200d000, 0x000005aa, 0x4080d800, 0x4084e000, 0x0201f800, 0x0010032b, 0x0401f7f6, 0x4084d000, 0x0401ffc4, 0x598cd00f, 0x41300000, 0x80697480, 0x04000005, 0x497a6008, 0x4200d000, 0x00000001, - 0x0401f004, 0x0201f800, 0x001072c9, 0x0401f7fa, + 0x0401f004, 0x0201f800, 0x001074ce, 0x0401f7fa, 0x40698800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, 0x59310800, - 0x497a6000, 0x0201f800, 0x00106c10, 0x808101c0, + 0x497a6000, 0x0201f800, 0x00106e15, 0x808101c0, 0x04000008, 0x48850000, 0x598cd008, 0x41300000, 0x80697480, 0x0402000b, 0x48831808, 0x0401f009, 0x598cd008, 0x41300000, 0x80697480, 0x04000003, 0x48871809, 0x0401f003, 0x48831808, 0x48831809, - 0x0201f800, 0x00106c22, 0x589d0801, 0x589d0000, + 0x0201f800, 0x00106e27, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x598d0009, 0x41790800, 0x4933c857, 0x813261c0, 0x04020007, @@ -28308,41 +28574,41 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x598cd00f, 0x41300000, 0x80697480, 0x04000011, 0x5930d403, 0x82697480, 0x00000042, 0x0400000b, 0x4200d000, 0x00000001, 0x0401f00d, 0x4200d000, - 0x0000055e, 0x4080d800, 0x4084e000, 0x0201f800, + 0x00000561, 0x4080d800, 0x4084e000, 0x0201f800, 0x0010032b, 0x0401f7e9, 0x497a6008, 0x0401f7f5, - 0x0201f800, 0x001072c9, 0x0401f7ee, 0x40698800, + 0x0201f800, 0x001074ce, 0x0401f7ee, 0x40698800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, 0x59310800, 0x497a6000, - 0x0201f800, 0x00106c10, 0x808101c0, 0x04000008, + 0x0201f800, 0x00106e15, 0x808101c0, 0x04000008, 0x48850000, 0x598cd004, 0x41300000, 0x80697480, 0x0402000b, 0x48831804, 0x0401f009, 0x598cd004, 0x41300000, 0x80697480, 0x04000003, 0x48871805, 0x0401f003, 0x48831804, 0x48831805, 0x0201f800, - 0x00106c22, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00106e27, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x598d0005, 0x40810800, 0x4933c857, 0x813261c0, 0x04020007, 0x0401f022, 0x41300000, 0x80817480, 0x04000007, 0x40810800, 0x58810000, 0x808101c0, 0x040207fa, 0x4178d000, 0x0401f02b, 0x598cd00f, 0x80697480, 0x04000025, - 0x0201f800, 0x00106c10, 0x598cd005, 0x40800000, + 0x0201f800, 0x00106e15, 0x598cd005, 0x40800000, 0x80697480, 0x04000017, 0x598cd004, 0x80697480, 0x04000009, 0x58817000, 0x48b90800, 0x49790000, - 0x0201f800, 0x00106c22, 0x4200d000, 0x00000001, + 0x0201f800, 0x00106e27, 0x4200d000, 0x00000001, 0x0401f017, 0x48871804, 0x49790000, 0x49790800, - 0x0401f7f8, 0x4200d000, 0x000005ea, 0x4080d800, + 0x0401f7f8, 0x4200d000, 0x000005ed, 0x4080d800, 0x4080e000, 0x0201f800, 0x0010032b, 0x0401f7de, 0x58817000, 0x48bb1805, 0x49790000, 0x598cd004, 0x80697480, 0x040207eb, 0x497b1804, 0x0401f7e9, - 0x0201f800, 0x001072c9, 0x0401f7da, 0x40698800, + 0x0201f800, 0x001074ce, 0x0401f7da, 0x40698800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, - 0x48853801, 0x41790000, 0x0201f800, 0x00106c35, + 0x48853801, 0x41790000, 0x0201f800, 0x00106e3a, 0x40c50800, 0x0401ff62, 0x80c57040, 0x04000007, 0x0401ff11, 0x80c57040, 0x04000004, 0x0401ffaf, 0x80c57040, 0x04020002, 0x40c50000, 0x80857040, - 0x04020003, 0x0201f800, 0x00106c29, 0x40818800, + 0x04020003, 0x0201f800, 0x00106e2e, 0x40818800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x5c00d000, 0x4c680000, 0x486bc857, @@ -28350,48 +28616,48 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4933c857, 0x4943c857, 0x493fc857, 0x5930d407, 0x486bc857, 0x5930dc07, 0x806c0040, 0x4000d000, 0x82697480, 0x00000012, 0x83f17500, 0x03000000, - 0x04000015, 0x0c01f001, 0x0010ff47, 0x0010ff23, - 0x0010ff2d, 0x0010ff47, 0x0010ff50, 0x0010ff5d, - 0x0010ff16, 0x0010ff16, 0x0010ff67, 0x0010ff6e, - 0x0010ff16, 0x0010ff16, 0x0010ff16, 0x0010ff16, - 0x0010ff16, 0x0010ff77, 0x0010ff77, 0x0010ff1c, - 0x0010ff1c, 0x4200d000, 0x00000a6e, 0x4130e000, + 0x04000015, 0x0c01f001, 0x00110257, 0x00110233, + 0x0011023d, 0x00110257, 0x00110260, 0x0011026d, + 0x00110226, 0x00110226, 0x00110277, 0x0011027e, + 0x00110226, 0x00110226, 0x00110226, 0x00110226, + 0x00110226, 0x00110287, 0x00110287, 0x0011022c, + 0x0011022c, 0x4200d000, 0x00000a7f, 0x4130e000, 0x0201f800, 0x0010032b, 0x0401f0a1, 0x0201f800, - 0x00109660, 0x80c589c0, 0x04020077, 0x0201f800, - 0x00107cbe, 0x0401f09a, 0x0201f800, 0x00109660, - 0x80c589c0, 0x04020066, 0x0201f800, 0x00107cbe, + 0x00109898, 0x80c589c0, 0x04020077, 0x0201f800, + 0x00107eb4, 0x0401f09a, 0x0201f800, 0x00109898, + 0x80c589c0, 0x04020066, 0x0201f800, 0x00107eb4, 0x8d3e7d1c, 0x04000092, 0x497a600a, 0x0401f090, 0x5930d008, 0x8c68d500, 0x04020053, 0x0201f800, - 0x00109660, 0x80c589c0, 0x040007f4, 0x592cd205, + 0x00109898, 0x80c589c0, 0x040007f4, 0x592cd205, 0x8268d500, 0x000000ff, 0x82697480, 0x00000014, - 0x04000003, 0x0201f800, 0x0010977c, 0x4a025a05, + 0x04000003, 0x0201f800, 0x001099b4, 0x4a025a05, 0x00000103, 0x49425a07, 0x497a580a, 0x0201f800, - 0x00109824, 0x0201f800, 0x0010b199, 0x0201f800, - 0x000203ef, 0x0401f7e1, 0x0201f800, 0x001102ca, - 0x80c589c0, 0x04020035, 0x0201f800, 0x001099c1, - 0x0201f800, 0x001084a2, 0x0401f7d8, 0x42000000, - 0x001111e0, 0x81317480, 0x0400004a, 0x0201f800, - 0x00109660, 0x80c589c0, 0x040007d0, 0x4200d000, - 0x000009b7, 0x412cd800, 0x4130e000, 0x0401f7bd, + 0x00109a5c, 0x0201f800, 0x0010b4b0, 0x0201f800, + 0x000203ef, 0x0401f7e1, 0x0201f800, 0x001105c7, + 0x80c589c0, 0x04020035, 0x0201f800, 0x00109bf9, + 0x0201f800, 0x001086a8, 0x0401f7d8, 0x42000000, + 0x00111500, 0x81317480, 0x0400004a, 0x0201f800, + 0x00109898, 0x80c589c0, 0x040007d0, 0x4200d000, + 0x000009c8, 0x412cd800, 0x4130e000, 0x0401f7bd, 0x5930d008, 0x8c68d500, 0x0402002a, 0x0201f800, - 0x00109660, 0x80c589c0, 0x040007c4, 0x0201f800, - 0x0010ae66, 0x0401f7c1, 0x0201f800, 0x00109660, - 0x80c589c0, 0x040007bd, 0x0201f800, 0x00106a40, - 0x0401f7ba, 0x0201f800, 0x00109660, 0x80c589c0, + 0x00109898, 0x80c589c0, 0x040007c4, 0x0201f800, + 0x0010b175, 0x0401f7c1, 0x0201f800, 0x00109898, + 0x80c589c0, 0x040007bd, 0x0201f800, 0x00106c45, + 0x0401f7ba, 0x0201f800, 0x00109898, 0x80c589c0, 0x040007b6, 0x49425a07, 0x497a5c0a, 0x0201f800, - 0x000203ef, 0x0401f7b1, 0x0201f800, 0x00109660, + 0x000203ef, 0x0401f7b1, 0x0201f800, 0x00109898, 0x80c589c0, 0x0402000b, 0x59325818, 0x0201f800, - 0x0010059d, 0x0401f7a9, 0x0201f800, 0x00101cb2, - 0x0401f7ca, 0x0201f800, 0x00100c75, 0x0401f7ac, + 0x0010059d, 0x0401f7a9, 0x0201f800, 0x00101cb7, + 0x0401f7ca, 0x0201f800, 0x00100c76, 0x0401f7ac, 0x49425a07, 0x0201f800, 0x000203ef, 0x0401f7f3, - 0x0201f800, 0x00100c75, 0x0401f7d5, 0x49425a07, + 0x0201f800, 0x00100c76, 0x0401f7d5, 0x49425a07, 0x0201f800, 0x000203ef, 0x5930d226, 0x82697480, - 0x00000003, 0x04020795, 0x0201f800, 0x0010977c, + 0x00000003, 0x04020795, 0x0201f800, 0x001099b4, 0x0401f792, 0x49425a07, 0x497a5c07, 0x0201f800, - 0x000203ef, 0x0201f800, 0x00107cbe, 0x0401f020, - 0x0201f800, 0x00109660, 0x80c589c0, 0x04000016, + 0x000203ef, 0x0201f800, 0x00107eb4, 0x0401f020, + 0x0201f800, 0x00109898, 0x80c589c0, 0x04000016, 0x59a8e052, 0x412c0000, 0x80717480, 0x04000005, - 0x4200d000, 0x000009d0, 0x412cd800, 0x0401f771, + 0x4200d000, 0x000009e1, 0x412cd800, 0x0401f771, 0x592d7000, 0x48bb5052, 0x592cd000, 0x8068d1c0, 0x04020002, 0x486b5053, 0x592cd205, 0x82697480, 0x00000055, 0x04000007, 0x49425a07, 0x0201f800, @@ -28401,12 +28667,12 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x00000002, 0x1c01f000, 0x809d3840, 0x48813800, 0x5930dc07, 0x406c0000, 0x826d7480, 0x00000013, 0x83f17500, 0x03000000, 0x04000016, 0x0c01f001, - 0x00110023, 0x0010fffa, 0x0011000a, 0x00110016, - 0x0010ffe9, 0x0010ffec, 0x00110034, 0x00110023, - 0x00110023, 0x00110023, 0x00110023, 0x0010ffe1, - 0x0010ffe1, 0x00110023, 0x0010ffe1, 0x00110023, - 0x00110023, 0x00110027, 0x0011003f, 0x0011003f, - 0x4200d000, 0x00000b61, 0x4130e000, 0x0201f800, + 0x00110333, 0x0011030a, 0x0011031a, 0x00110326, + 0x001102f9, 0x001102fc, 0x00110344, 0x00110333, + 0x00110333, 0x00110333, 0x00110333, 0x001102f1, + 0x001102f1, 0x00110333, 0x001102f1, 0x00110333, + 0x00110333, 0x00110337, 0x0011034f, 0x0011034f, + 0x4200d000, 0x00000b72, 0x4130e000, 0x0201f800, 0x0010032b, 0x4200d800, 0x00000001, 0x0401f067, 0x4178d800, 0x8d3e7d1a, 0x04020064, 0x833ce500, 0x00000001, 0x4178d800, 0x8d3e7d00, 0x0402005f, @@ -28415,10 +28681,10 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0401f7ed, 0x8d3e7d1a, 0x04020019, 0x8d3e7d00, 0x04020017, 0x833d0500, 0x00001000, 0x8d3e7d18, 0x040207e5, 0x8d3e7d06, 0x040007e3, 0x0201f800, - 0x0010996b, 0x4080d800, 0x80c589c0, 0x04020047, + 0x00109ba3, 0x4080d800, 0x80c589c0, 0x04020047, 0x0401f7dd, 0x8d3e7d00, 0x040007db, 0x5930d226, 0x82697480, 0x00000003, 0x04020005, 0x0201f800, - 0x00106b5f, 0x80c589c0, 0x040207d3, 0x4178d800, + 0x00106d64, 0x80c589c0, 0x040207d3, 0x4178d800, 0x0401f03a, 0x8d3e7d00, 0x04020033, 0x5930d00a, 0x833cdd00, 0x00001000, 0x8d3e7d18, 0x040207ca, 0x8d3e7d06, 0x040007c8, 0x5868d200, 0x8c68d50e, @@ -28432,498 +28698,494 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4068d800, 0x0401f011, 0x59a8d079, 0x5868d400, 0x8268d580, 0x00000707, 0x8068d080, 0x8068d000, 0x8068013e, 0x4200d000, 0x00000001, 0x8068dc80, - 0x0401f006, 0x0201f800, 0x00106b5f, 0x40c4d800, + 0x0401f006, 0x0201f800, 0x00106d64, 0x40c4d800, 0x80c589c0, 0x040207ca, 0x406d8800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000006, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x48953805, 0x4933c857, 0x0201f800, - 0x00106c35, 0x40c52800, 0x41352000, 0x41311000, - 0x412d1800, 0x41790800, 0x598e6005, 0x0401f007, - 0x813669c0, 0x0400002f, 0x813669c0, 0x04000023, - 0x41310800, 0x59326000, 0x813261c0, 0x04000031, - 0x5932680a, 0x813669c0, 0x040007f6, 0x5934d403, - 0x41440000, 0x80697480, 0x040207f2, 0x5930d01c, - 0x41240000, 0x80697480, 0x040207f0, 0x0401ff4b, - 0x80c589c0, 0x040007ef, 0x42010000, 0x00000001, - 0x0201f800, 0x00109660, 0x80c589c0, 0x04020026, - 0x808101c0, 0x040007e7, 0x0201f800, 0x00106b26, - 0x59310000, 0x4084d000, 0x0401fde3, 0x0401fe62, - 0x40826000, 0x0401f7e1, 0x5930d407, 0x82697480, - 0x00000010, 0x040207db, 0x83457480, 0x0000ffff, - 0x040207d8, 0x812649c0, 0x040207d6, 0x0401f7e4, - 0x5930d407, 0x82697480, 0x00000010, 0x040207cf, - 0x83457480, 0x0000ffff, 0x040207cc, 0x0401f7d8, - 0x408a6000, 0x408e5800, 0x40926800, 0x80957040, - 0x04000002, 0x0401f00e, 0x0201f800, 0x00106c29, - 0x0401f00b, 0x0201f800, 0x00109d0c, 0x80c589c0, - 0x040007d8, 0x5930d403, 0x82697480, 0x00000043, - 0x040207d4, 0x41790000, 0x0401f7d2, 0x589d2805, - 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000006, 0x1c01f000, - 0x829d3c80, 0x00000006, 0x48813800, 0x48853801, - 0x48893802, 0x488d3803, 0x48913804, 0x48953805, - 0x412d1800, 0x41312000, 0x41352800, 0x41790800, - 0x0201f800, 0x00106c35, 0x40c51000, 0x83457480, - 0x000007ef, 0x04000008, 0x04001007, 0x408e5800, - 0x40926000, 0x40966800, 0x80897040, 0x04000020, - 0x0401f031, 0x0201f800, 0x001045e2, 0x40c66800, - 0x80c589c0, 0x04000025, 0x598e600b, 0x0401f003, - 0x41310800, 0x59326000, 0x813261c0, 0x04000017, - 0x5930d01c, 0x41240000, 0x80697480, 0x040207f9, - 0x5930d00a, 0x41340000, 0x80697480, 0x040207f5, - 0x0401fede, 0x80c589c0, 0x040007f2, 0x0201f800, - 0x00106b26, 0x59310000, 0x4084d000, 0x0401fcdd, - 0x0401fdfd, 0x40826000, 0x0401f7ec, 0x0201f800, - 0x00106c29, 0x0401f010, 0x8d3e7d06, 0x04000004, - 0x5934d200, 0x8c68d50e, 0x040207d5, 0x0201f800, - 0x0010476a, 0x0401f7d2, 0x4200d000, 0x00000711, - 0x40c4d800, 0x4144e000, 0x0201f800, 0x0010032b, - 0x0401f7d6, 0x589d2805, 0x589d2004, 0x589d1803, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000006, 0x1c01f000, 0x829d3c80, 0x00000006, - 0x48813800, 0x48853801, 0x48893802, 0x488d3803, - 0x48913804, 0x48953805, 0x41311800, 0x41352000, - 0x412d2800, 0x41790800, 0x0201f800, 0x00106c35, - 0x40c51000, 0x598e6009, 0x0401f003, 0x41310800, - 0x59326000, 0x813261c0, 0x04000016, 0x5932680a, - 0x5930d01c, 0x41240000, 0x80697480, 0x040207f8, - 0x5934d403, 0x41440000, 0x80697480, 0x040207f4, - 0x0401fe9a, 0x80c589c0, 0x040007f1, 0x59310000, - 0x0201f800, 0x00106b26, 0x4084d000, 0x0401fce7, - 0x0401fdb9, 0x40826000, 0x813261c0, 0x040207ec, - 0x0201f800, 0x00107bbe, 0x0201f800, 0x00107c34, - 0x408e6000, 0x40926800, 0x40965800, 0x80897040, - 0x04000002, 0x0401f003, 0x0201f800, 0x00106c29, + 0x00106e3a, 0x40c52800, 0x41352000, 0x41311000, + 0x412d1800, 0x41790800, 0x598e6005, 0x0401f003, + 0x41310800, 0x59326000, 0x813261c0, 0x04000022, + 0x5932680a, 0x813669c0, 0x040007fa, 0x5934d403, + 0x41440000, 0x80697480, 0x040207f6, 0x5930d01c, + 0x41240000, 0x80697480, 0x04000003, 0x812649c0, + 0x040207f0, 0x0401ff4d, 0x80c589c0, 0x040007ed, + 0x42010000, 0x00000001, 0x0201f800, 0x00109898, + 0x80c589c0, 0x04020015, 0x808101c0, 0x040007e5, + 0x0201f800, 0x00106d2b, 0x59310000, 0x4084d000, + 0x0401fde5, 0x0401fe64, 0x40826000, 0x813261c0, + 0x040207e0, 0x408a6000, 0x408e5800, 0x40926800, + 0x80957040, 0x04000002, 0x0401f00e, 0x0201f800, + 0x00106e2e, 0x0401f00b, 0x0201f800, 0x00109f4a, + 0x80c589c0, 0x040007e9, 0x5930d403, 0x82697480, + 0x00000043, 0x040207e5, 0x41790000, 0x0401f7e3, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000006, - 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, - 0x48853801, 0x4947c857, 0x0201f800, 0x00106c35, - 0x40c50800, 0x413d0000, 0x853e7d00, 0x0401ffb7, - 0x0401ff64, 0x40827800, 0x80857040, 0x04000002, - 0x0401f003, 0x0201f800, 0x00106c29, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, - 0x829d3c80, 0x00000003, 0x48813800, 0x48853801, - 0x48893802, 0x41311000, 0x41790800, 0x598e600b, - 0x813261c0, 0x04000011, 0x0401fe58, 0x80c589c0, - 0x04020006, 0x41310800, 0x59326000, 0x813261c0, - 0x040207fa, 0x0401f009, 0x0201f800, 0x00106b26, - 0x59310000, 0x4084d000, 0x0401fc52, 0x0401fd72, - 0x40826000, 0x0401f7ef, 0x0201f800, 0x00104747, - 0x408a6000, 0x589d1002, 0x589d0801, 0x589d0000, - 0x829d3c00, 0x00000003, 0x1c01f000, 0x829d3c80, - 0x00000003, 0x48813800, 0x48853801, 0x48893802, - 0x41311000, 0x41790800, 0x598e6009, 0x813261c0, - 0x04000011, 0x0401fe35, 0x80c589c0, 0x04020006, - 0x41310800, 0x59326000, 0x813261c0, 0x040207fa, - 0x0401f009, 0x59310000, 0x0201f800, 0x00106b26, - 0x4084d000, 0x0401fc7d, 0x0401fd4f, 0x40826000, - 0x0401f7ef, 0x0201f800, 0x00107c14, 0x0201f800, - 0x00107c34, 0x408a6000, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000003, 0x1c01f000, - 0x809d3840, 0x48813800, 0x4943c857, 0x0201f800, - 0x00106c35, 0x40c50000, 0x0401ffd5, 0x0401ffb1, - 0x80817040, 0x04000002, 0x0401f003, 0x0201f800, - 0x00106c29, 0x589d0000, 0x809d3800, 0x1c01f000, - 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, - 0x48893802, 0x488d3803, 0x0201f800, 0x00106c35, - 0x40c51800, 0x41311000, 0x41790800, 0x598e6005, - 0x813261c0, 0x04000008, 0x0401fdfc, 0x80c589c0, - 0x04020009, 0x41310800, 0x59326000, 0x813261c0, - 0x040207fa, 0x408a6000, 0x808d7040, 0x0400000a, - 0x0401f00b, 0x0201f800, 0x00106b26, 0x59310000, - 0x4084d000, 0x0401fc94, 0x0401fd13, 0x40826000, - 0x0401f7ec, 0x0201f800, 0x00106c29, 0x589d1803, + 0x1c01f000, 0x829d3c80, 0x00000006, 0x48813800, + 0x48853801, 0x48893802, 0x488d3803, 0x48913804, + 0x48953805, 0x412d1800, 0x41312000, 0x41352800, + 0x41790800, 0x0201f800, 0x00106e3a, 0x40c51000, + 0x83457480, 0x000007ef, 0x04000008, 0x04001007, + 0x408e5800, 0x40926000, 0x40966800, 0x80897040, + 0x04000020, 0x0401f031, 0x0201f800, 0x001046de, + 0x40c66800, 0x80c589c0, 0x04000025, 0x598e600b, + 0x0401f003, 0x41310800, 0x59326000, 0x813261c0, + 0x04000017, 0x5930d01c, 0x41240000, 0x80697480, + 0x040207f9, 0x5930d00a, 0x41340000, 0x80697480, + 0x040207f5, 0x0401fef1, 0x80c589c0, 0x040007f2, + 0x0201f800, 0x00106d2b, 0x59310000, 0x4084d000, + 0x0401fcf0, 0x0401fe10, 0x40826000, 0x0401f7ec, + 0x0201f800, 0x00106e2e, 0x0401f010, 0x8d3e7d06, + 0x04000004, 0x5934d200, 0x8c68d50e, 0x040207d5, + 0x0201f800, 0x0010486a, 0x0401f7d2, 0x4200d000, + 0x00000714, 0x40c4d800, 0x4144e000, 0x0201f800, + 0x0010032b, 0x0401f7d6, 0x589d2805, 0x589d2004, + 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000006, 0x1c01f000, 0x829d3c80, + 0x00000006, 0x48813800, 0x48853801, 0x48893802, + 0x488d3803, 0x48913804, 0x48953805, 0x41311800, + 0x41352000, 0x412d2800, 0x41790800, 0x0201f800, + 0x00106e3a, 0x40c51000, 0x598e6009, 0x0401f003, + 0x41310800, 0x59326000, 0x813261c0, 0x04000016, + 0x5932680a, 0x5930d01c, 0x41240000, 0x80697480, + 0x040207f8, 0x5934d403, 0x41440000, 0x80697480, + 0x040207f4, 0x0401fead, 0x80c589c0, 0x040007f1, + 0x59310000, 0x0201f800, 0x00106d2b, 0x4084d000, + 0x0401fcfa, 0x0401fdcc, 0x40826000, 0x813261c0, + 0x040207ec, 0x0201f800, 0x00107db4, 0x0201f800, + 0x00107e2a, 0x408e6000, 0x40926800, 0x40965800, + 0x80897040, 0x04000002, 0x0401f003, 0x0201f800, + 0x00106e2e, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000004, 0x1c01f000, 0x809d3840, 0x48a13800, - 0x829d3c80, 0x00000005, 0x409d4000, 0x829d3c80, + 0x00000006, 0x1c01f000, 0x829d3c80, 0x00000002, + 0x48813800, 0x48853801, 0x4947c857, 0x0201f800, + 0x00106e3a, 0x40c50800, 0x413d0000, 0x853e7d00, + 0x0401ffb7, 0x0401ff64, 0x40827800, 0x80857040, + 0x04000002, 0x0401f003, 0x0201f800, 0x00106e2e, + 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, + 0x1c01f000, 0x829d3c80, 0x00000003, 0x48813800, + 0x48853801, 0x48893802, 0x41311000, 0x41790800, + 0x598e600b, 0x813261c0, 0x04000011, 0x0401fe6b, + 0x80c589c0, 0x04020006, 0x41310800, 0x59326000, + 0x813261c0, 0x040207fa, 0x0401f009, 0x0201f800, + 0x00106d2b, 0x59310000, 0x4084d000, 0x0401fc65, + 0x0401fd85, 0x40826000, 0x0401f7ef, 0x0201f800, + 0x00104847, 0x408a6000, 0x589d1002, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000003, 0x1c01f000, + 0x829d3c80, 0x00000003, 0x48813800, 0x48853801, + 0x48893802, 0x41311000, 0x41790800, 0x598e6009, + 0x813261c0, 0x04000011, 0x0401fe48, 0x80c589c0, + 0x04020006, 0x41310800, 0x59326000, 0x813261c0, + 0x040207fa, 0x0401f009, 0x59310000, 0x0201f800, + 0x00106d2b, 0x4084d000, 0x0401fc90, 0x0401fd62, + 0x40826000, 0x0401f7ef, 0x0201f800, 0x00107e0a, + 0x0201f800, 0x00107e2a, 0x408a6000, 0x589d1002, + 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000003, + 0x1c01f000, 0x809d3840, 0x48813800, 0x4943c857, + 0x0201f800, 0x00106e3a, 0x40c50000, 0x0401ffd5, + 0x0401ffb1, 0x80817040, 0x04000002, 0x0401f003, + 0x0201f800, 0x00106e2e, 0x589d0000, 0x809d3800, + 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, + 0x48853801, 0x48893802, 0x488d3803, 0x0201f800, + 0x00106e3a, 0x40c51800, 0x41311000, 0x41790800, + 0x598e6005, 0x813261c0, 0x04000008, 0x0401fe0f, + 0x80c589c0, 0x04020009, 0x41310800, 0x59326000, + 0x813261c0, 0x040207fa, 0x408a6000, 0x808d7040, + 0x0400000a, 0x0401f00b, 0x0201f800, 0x00106d2b, + 0x59310000, 0x4084d000, 0x0401fca7, 0x0401fd26, + 0x40826000, 0x0401f7ec, 0x0201f800, 0x00106e2e, + 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000004, 0x1c01f000, 0x809d3840, + 0x48a13800, 0x829d3c80, 0x00000005, 0x409d4000, + 0x829d3c80, 0x00000007, 0x48813800, 0x48853801, + 0x48893802, 0x488d3803, 0x48913804, 0x48953805, + 0x48993806, 0x4178d000, 0x48694004, 0x0201f800, + 0x00106e3a, 0x40c53000, 0x41311000, 0x41352000, + 0x41192800, 0x412d1800, 0x49914003, 0x49d14000, + 0x49a54001, 0x49154002, 0x59be6031, 0x813261c0, + 0x04000014, 0x41310800, 0x0401f007, 0x808101c0, + 0x04000003, 0x41310800, 0x40826000, 0x808101c0, + 0x0400000c, 0x59310000, 0x5932680a, 0x5930d01c, + 0x41240000, 0x80697480, 0x040207f5, 0x5934d403, + 0x41440000, 0x80697480, 0x040207f1, 0x0401f031, + 0x417a3000, 0x0401f007, 0x811a3000, 0x83197480, + 0x00000004, 0x83f17500, 0x03000000, 0x0400001a, + 0x0201f800, 0x001074f6, 0x59926004, 0x813261c0, + 0x040007f6, 0x5932680a, 0x5930d01c, 0x41240000, + 0x80697480, 0x040207f1, 0x5934d403, 0x41440000, + 0x80697480, 0x040207ed, 0x0401fdac, 0x80c589c0, + 0x040007ea, 0x0201f800, 0x00107073, 0x0201f800, + 0x00106e0c, 0x0201f800, 0x00106e15, 0x0401fcca, + 0x0401f7e2, 0x408a6000, 0x40926800, 0x40963000, + 0x408e5800, 0x58a32003, 0x58a3a000, 0x58a34801, + 0x58a22802, 0x80997040, 0x04000010, 0x0401f011, + 0x49314004, 0x40826000, 0x808101c0, 0x040007d1, + 0x59310001, 0x0401fd91, 0x80c589c0, 0x040007f9, + 0x4084d000, 0x58a0d804, 0x0201f800, 0x0011000c, + 0x0401fcb1, 0x0401f7f4, 0x0201f800, 0x00106e2e, + 0x589d3006, 0x589d2805, 0x589d2004, 0x589d1803, + 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x0000000c, 0x589d4000, 0x809d3800, 0x1c01f000, + 0x809d3840, 0x48a13800, 0x829d3c80, 0x00000007, + 0x409d4000, 0x829d3c80, 0x00000007, 0x48813800, + 0x48853801, 0x48893802, 0x488d3803, 0x48913804, + 0x48953805, 0x48993806, 0x41791800, 0x0201f800, + 0x00106e3a, 0x40c52800, 0x41313000, 0x49354005, + 0x492d4004, 0x49194006, 0x49914003, 0x49d14000, + 0x49a54001, 0x49154002, 0x59be6031, 0x813261c0, + 0x04000023, 0x41312000, 0x408d0800, 0x59311000, + 0x5932680a, 0x0401f009, 0x41311800, 0x808509c0, + 0x04000010, 0x808101c0, 0x04000002, 0x40826000, + 0x808101c0, 0x0400000d, 0x59310001, 0x0401fd4f, + 0x80c589c0, 0x040007f5, 0x4090d000, 0x408cd800, + 0x0201f800, 0x0011000c, 0x0401fc6f, 0x0401f7f2, + 0x41310800, 0x0401f7f0, 0x808911c0, 0x04000006, + 0x408a6000, 0x808509c0, 0x04000003, 0x40852000, + 0x40810800, 0x808911c0, 0x040207e1, 0x417a3000, + 0x0201f800, 0x001074f6, 0x59926004, 0x813261c0, + 0x04000004, 0x0401fd35, 0x80c589c0, 0x04020011, + 0x811a3000, 0x83197480, 0x00000004, 0x040007f5, + 0x040017f4, 0x409a6000, 0x58a26805, 0x58a25804, + 0x58a23006, 0x58a32003, 0x58a3a000, 0x58a34801, + 0x58a22802, 0x80957040, 0x0400000a, 0x0401f00b, + 0x0201f800, 0x00107073, 0x0201f800, 0x00106e0c, + 0x0201f800, 0x00106e15, 0x0401fc43, 0x0401f7e9, + 0x0201f800, 0x00106e2e, 0x589d3006, 0x589d2805, + 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x0000000e, 0x589d4000, + 0x809d3800, 0x1c01f000, 0x4178e000, 0x497bc856, + 0x5930dc03, 0x826cd480, 0x00000002, 0x82697480, + 0x00000002, 0x04000007, 0x04001006, 0x599cd019, + 0x8c68d50e, 0x04000005, 0x806cd9c0, 0x04020003, + 0x4200e000, 0x00000001, 0x40718800, 0x1c01f000, + 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, + 0x48893802, 0x488d3803, 0x412d0800, 0x41351000, + 0x41391800, 0x0201f800, 0x001102d3, 0x80c589c0, + 0x040000cd, 0x5932680a, 0x5930d407, 0x40680000, + 0x82697480, 0x00000013, 0x83f17500, 0x03000000, + 0x04000028, 0x0c01f001, 0x001106b2, 0x0011065f, + 0x0011066f, 0x00110624, 0x0011065f, 0x0011066f, + 0x00110647, 0x00110658, 0x0011061c, 0x0011067f, + 0x00110606, 0x0011061c, 0x0011061c, 0x0011061c, + 0x0011061c, 0x001106b2, 0x00110606, 0x00110603, + 0x0011061c, 0x0011061c, 0x59325818, 0x0201f800, + 0x0010059d, 0x5930d203, 0x82697480, 0x00000004, + 0x04000090, 0x59325809, 0x0201f800, 0x00109898, + 0x80c589c0, 0x04020083, 0x0201f800, 0x00107eb4, + 0x8d3e7d1c, 0x040000a0, 0x497a600a, 0x0401f09e, + 0x4200d000, 0x0000030f, 0x4000d800, 0x4130e000, + 0x0201f800, 0x0010032b, 0x0401f097, 0x59325809, + 0x0201f800, 0x00109898, 0x80c589c0, 0x0402006a, + 0x0201f800, 0x00107eb4, 0x0401f08f, 0x813669c0, + 0x04000077, 0x0201f800, 0x0010a424, 0x5930d203, + 0x82697480, 0x00000004, 0x04000081, 0x59325809, + 0x0201f800, 0x00109898, 0x80c589c0, 0x040007df, + 0x592cd205, 0x8268d500, 0x000000ff, 0x82697480, + 0x00000014, 0x04000003, 0x0201f800, 0x001099b4, + 0x4a025a05, 0x00000103, 0x5930d402, 0x486a5c07, + 0x592cd409, 0x8c68d512, 0x04020067, 0x49425a07, + 0x497a580a, 0x0201f800, 0x00109f56, 0x0201f800, + 0x000203ef, 0x0401f7c9, 0x5930d203, 0x82697480, + 0x00000004, 0x04000065, 0x59325809, 0x0201f800, + 0x00109898, 0x80c589c0, 0x040007c0, 0x49425a07, + 0x813669c0, 0x040007f0, 0x0201f800, 0x0010b4b0, + 0x0201f800, 0x00109f56, 0x0401f7ed, 0x5930d203, + 0x82697480, 0x00000011, 0x04020057, 0x5930d426, + 0x486a6203, 0x0401f054, 0x5930d403, 0x82697480, + 0x00000043, 0x04000050, 0x0201f800, 0x0010b827, + 0x0401ff62, 0x80c589c0, 0x0402003c, 0x0201f800, + 0x001099db, 0x80c589c0, 0x040007a4, 0x0201f800, + 0x001086a8, 0x0401f7a1, 0x59325809, 0x0201f800, + 0x00109898, 0x80c589c0, 0x0400079c, 0x49425a07, + 0x497a5c0a, 0x0201f800, 0x000203ef, 0x5930d226, + 0x82697480, 0x00000003, 0x04020794, 0x0201f800, + 0x001099b4, 0x0401f791, 0x5930d203, 0x82697480, + 0x00000004, 0x04020013, 0x5930d006, 0x8068d1c0, + 0x0400002d, 0x5930d415, 0x8468d558, 0x486a6415, + 0x0401f029, 0x49425a07, 0x497a5c07, 0x0201f800, + 0x000203ef, 0x0201f800, 0x00107eb4, 0x0401f022, + 0x49425a07, 0x0201f800, 0x000203ef, 0x0401f77b, + 0x59325809, 0x0201f800, 0x00106c32, 0x0401f777, + 0x0201f800, 0x00100c76, 0x0401f76f, 0x4200d000, + 0x00000182, 0x4134d800, 0x4130e000, 0x0201f800, + 0x0010032b, 0x0401f784, 0x0201f800, 0x00101cb7, + 0x0401f7c3, 0x412d0000, 0x592e580a, 0x0201f800, + 0x0010059d, 0x40825800, 0x0401f795, 0x0201f800, + 0x00100c76, 0x0401f77e, 0x0201f800, 0x00100c76, + 0x0401f79a, 0x40865800, 0x408a6800, 0x408e7000, + 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000004, 0x1c01f000, 0x829d3c80, + 0x00000002, 0x48813800, 0x48853801, 0x41310800, + 0x4933c857, 0x4943c857, 0x493fc857, 0x42010000, + 0x00111584, 0x59a8d00d, 0x41640000, 0x80697480, + 0x04000010, 0x41580000, 0x80817480, 0x0402100d, + 0x40826000, 0x8d3e7d12, 0x04000004, 0x40800000, + 0x80857480, 0x04000002, 0x0401ff06, 0x82810400, + 0x0000002c, 0x41580000, 0x80817480, 0x040017f5, + 0x41510000, 0x41540000, 0x80817480, 0x04021019, + 0x8d3e7d18, 0x04000017, 0x59a8d04d, 0x59a8004e, + 0x80697480, 0x04000013, 0x40826000, 0x5880d00a, + 0x8068d1c0, 0x04020005, 0x5880d203, 0x82697480, + 0x00000008, 0x04000008, 0x0401feee, 0x82810400, + 0x0000002c, 0x41540000, 0x80817480, 0x040017ed, + 0x0401f004, 0x0201f800, 0x0010b76e, 0x0401f7f7, + 0x40866000, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00000002, 0x1c01f000, 0x497a6226, 0x812e59c0, + 0x0400003d, 0x592cd205, 0x486bc857, 0x592cd205, + 0x8268d500, 0x000000ff, 0x82697480, 0x00000014, + 0x04000003, 0x4a026226, 0x00000003, 0x592cd409, + 0x8c68d510, 0x0402001d, 0x592cd209, 0x0201f800, + 0x00104e19, 0x0201f800, 0x00109f56, 0x0201f800, + 0x0010c0c0, 0x80c589c0, 0x0400001f, 0x4a026403, + 0x00000085, 0x4a026203, 0x00000009, 0x4a026407, + 0x00000002, 0x5930d004, 0x8268d500, 0x00000100, + 0x8268d540, 0x8000404b, 0x486a6004, 0x0201f800, + 0x00106e2e, 0x4200d000, 0x8000404b, 0x0201f800, + 0x00106d18, 0x0401f01f, 0x592cd209, 0x0201f800, + 0x00104e19, 0x4a025c09, 0x00000100, 0x0201f800, + 0x00109f56, 0x0201f800, 0x0010c0c0, 0x80c589c0, + 0x040207e3, 0x0201f800, 0x000203ef, 0x5930d226, + 0x82697480, 0x00000003, 0x0400000a, 0x497a6009, + 0x0401f7db, 0x4200d000, 0x00000527, 0x4130d800, + 0x412ce000, 0x0201f800, 0x0010032b, 0x0401f005, + 0x0201f800, 0x001099b4, 0x497a6009, 0x0401f7d0, + 0x1c01f000, 0x0201f800, 0x00106e2e, 0x812e59c0, + 0x0400001b, 0x592cd409, 0x8c68d510, 0x04020012, + 0x592cd209, 0x0201f800, 0x00104e19, 0x0201f800, + 0x00109f56, 0x0201f800, 0x000203ef, 0x5930d203, + 0x82697480, 0x0000000d, 0x0400000d, 0x0201f800, + 0x00106e2e, 0x5930d00a, 0x0201f800, 0x001049b8, + 0x0401f007, 0x592cd209, 0x0201f800, 0x00104e19, + 0x4a025c09, 0x00000100, 0x0401f7ed, 0x0201f800, + 0x00107eb4, 0x1c01f000, 0x829d3c80, 0x00000002, + 0x48813800, 0x48853801, 0x41790000, 0x0201f800, + 0x00109561, 0x40c50800, 0x48c7c857, 0x40840000, + 0x82857480, 0x0000000d, 0x83f17500, 0x03000000, + 0x0400002b, 0x0c01f001, 0x00110798, 0x001107de, + 0x001107ae, 0x00110785, 0x001107b0, 0x001107a0, + 0x00110798, 0x00110798, 0x00110798, 0x001107a0, + 0x001107a0, 0x001107a0, 0x001107a0, 0x001107ae, + 0x0201f800, 0x0010954b, 0x80c589c0, 0x04000005, + 0x0201f800, 0x00107123, 0x80c589c0, 0x04000063, + 0x0201f800, 0x00110065, 0x80c589c0, 0x04000017, + 0x5930d403, 0x486bc857, 0x5930d403, 0x82697480, + 0x00000040, 0x04020018, 0x0401ffaf, 0x42010000, + 0x00000001, 0x0401f073, 0x40840000, 0x82857480, + 0x0000000d, 0x040007d8, 0x040017d7, 0x4200d000, + 0x000004b7, 0x4130d800, 0x4084e000, 0x0201f800, + 0x0010032b, 0x0401f067, 0x497bc856, 0x0201f800, + 0x00106d45, 0x80c589c0, 0x04020044, 0x59317004, + 0x48bbc857, 0x0401ff4d, 0x0401f7e9, 0x812e59c0, + 0x04000050, 0x0201f800, 0x00109cec, 0x80c589c0, + 0x0400003e, 0x0201f800, 0x00106e2e, 0x592cd209, + 0x8468d50c, 0x486a5a09, 0x592cdc07, 0x806cd0c6, + 0x406c0000, 0x8068d400, 0x8068d400, 0x486a6006, + 0x4200d000, 0x10000000, 0x4130d800, 0x0201f800, + 0x001008be, 0x80c589c0, 0x0400000c, 0x592cd209, + 0x8c68d51c, 0x04000032, 0x59c8d001, 0x8068d1c0, + 0x0402003b, 0x4200d000, 0x40000000, 0x4130d800, + 0x0201f800, 0x001008be, 0x5930d203, 0x82697480, + 0x00000004, 0x040207c2, 0x41390000, 0x42027000, + 0x00000048, 0x0201f800, 0x00107f26, 0x40827000, + 0x0401f7bb, 0x598d700f, 0x48bbc857, 0x40b8d000, + 0x41300000, 0x80697480, 0x04000014, 0x0201f800, + 0x001101de, 0x80c589c0, 0x040207b0, 0x497bc856, + 0x0201f800, 0x00106d45, 0x4200d000, 0x000003f5, + 0x80c589c0, 0x040007b4, 0x5930d203, 0x486bc857, + 0x59310a03, 0x0401f01b, 0x0201f800, 0x00100c76, + 0x0401ff06, 0x0401f7a2, 0x0201f800, 0x0010715a, + 0x80c589c0, 0x040007f5, 0x0401f7e9, 0x8468d55c, + 0x486a5a09, 0x4a026006, 0x00000002, 0x0401f798, + 0x4200d000, 0x000004a7, 0x4130d800, 0x412ce000, + 0x0201f800, 0x0010032b, 0x0401f006, 0x41310000, + 0x0201f800, 0x00101270, 0x40826000, 0x0401f7c7, + 0x808101c0, 0x0400078d, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, + 0x00000002, 0x48813800, 0x48853801, 0x412d0800, + 0x41410000, 0x4200d000, 0x0010cf32, 0x0201f800, + 0x0010bfb2, 0x417a5800, 0x0201f800, 0x00109898, + 0x80c589c0, 0x04000009, 0x0201f800, 0x0010a424, + 0x59325809, 0x592cd209, 0x8468d54c, 0x486a5a09, + 0x42028000, 0x00000006, 0x0201f800, 0x00106e3a, + 0x0401ff3a, 0x0201f800, 0x00106e2e, 0x40828000, + 0x40865800, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, + 0x48813800, 0x48853801, 0x412d0800, 0x0201f800, + 0x001102d3, 0x80c589c0, 0x040000c3, 0x5930d407, + 0x40680000, 0x82697480, 0x00000013, 0x83f17500, + 0x03000000, 0x04000025, 0x0c01f001, 0x00110902, + 0x001108a6, 0x001108bc, 0x00110883, 0x001108a6, + 0x001108bc, 0x001108cc, 0x001108b5, 0x001108e1, + 0x0011085c, 0x00110872, 0x001108e1, 0x001108e1, + 0x001108e1, 0x001108e1, 0x00110902, 0x00110878, + 0x001108dd, 0x001108e1, 0x001108e1, 0x0201f800, + 0x0010689d, 0x80c589c0, 0x04000090, 0x5930d203, + 0x82697480, 0x00000004, 0x0402009f, 0x5930d006, + 0x8068d1c0, 0x0400009c, 0x5930d415, 0x8468d558, + 0x486a6415, 0x0401f098, 0x4200d000, 0x00000328, + 0x4000d800, 0x4130e000, 0x0201f800, 0x0010032b, + 0x0401f091, 0x5930d203, 0x82697480, 0x00000004, + 0x04020003, 0x0201f800, 0x00100c76, 0x59325809, + 0x0201f800, 0x00109898, 0x80c589c0, 0x0402006f, + 0x0201f800, 0x00107eb4, 0x8d3e7d1c, 0x04000082, + 0x497a600a, 0x0401f080, 0x0201f800, 0x0010a424, + 0x5930d203, 0x82697480, 0x00000004, 0x04000074, + 0x59325809, 0x0201f800, 0x00109898, 0x80c589c0, + 0x040007f0, 0x592cd205, 0x8268d500, 0x000000ff, + 0x82697480, 0x00000014, 0x04000003, 0x0201f800, + 0x001099b4, 0x4a025a05, 0x00000103, 0x592cd409, + 0x8c68d512, 0x0402005c, 0x49425a07, 0x497a580a, + 0x0201f800, 0x0010b4b0, 0x0201f800, 0x00109f56, + 0x0201f800, 0x00109a5c, 0x0201f800, 0x000203ef, + 0x0401f7d8, 0x5930d403, 0x82697480, 0x00000043, + 0x04000059, 0x0201f800, 0x001105c7, 0x80c589c0, + 0x04020046, 0x0201f800, 0x001099db, 0x80c589c0, + 0x040007cc, 0x0201f800, 0x001086a8, 0x0401f7c9, + 0x5930d203, 0x82697480, 0x00000011, 0x0402004a, + 0x5930d426, 0x486a6203, 0x0401f047, 0x59325809, + 0x0201f800, 0x00109898, 0x80c589c0, 0x040007bd, + 0x49425a07, 0x497a5c0a, 0x0201f800, 0x000203ef, + 0x5930d226, 0x82697480, 0x00000003, 0x040207b5, + 0x0201f800, 0x001099b4, 0x0401f7b2, 0x5930d203, + 0x82697480, 0x00000004, 0x04000030, 0x59325809, + 0x0201f800, 0x00109898, 0x80c589c0, 0x040007a9, + 0x49425a07, 0x0201f800, 0x0010b4b0, 0x0201f800, + 0x00109f56, 0x0201f800, 0x000203ef, 0x0401f7a1, + 0x59325818, 0x0201f800, 0x0010059d, 0x0401f798, + 0x59325809, 0x0201f800, 0x00109898, 0x80c589c0, + 0x04000798, 0x49425a07, 0x497a5c07, 0x0201f800, + 0x000203ef, 0x0401f793, 0x49425a07, 0x0201f800, + 0x000203ef, 0x0401f78f, 0x59325809, 0x0201f800, + 0x00106c32, 0x0401f78b, 0x0201f800, 0x00101cb7, + 0x0401f7b9, 0x412d0000, 0x592e580a, 0x0201f800, + 0x0010059d, 0x40825800, 0x0401f7a0, 0x0201f800, + 0x00100c76, 0x0401f78b, 0x0201f800, 0x00100c76, + 0x0401f7cf, 0x40865800, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000002, 0x1c01f000, 0x0201f800, + 0x0010b298, 0x80c589c0, 0x04000007, 0x812649c0, + 0x04000006, 0x5930d01c, 0x41240000, 0x80697480, + 0x04000002, 0x0401f003, 0x5932680a, 0x0401ff23, + 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, + 0x48853801, 0x48893802, 0x488d3803, 0x48913804, + 0x41311000, 0x41352000, 0x4933c857, 0x4947c857, + 0x4943c857, 0x0201f800, 0x00106e3a, 0x40c51800, + 0x0201f800, 0x0010b130, 0x41310800, 0x813261c0, + 0x0400004e, 0x42000000, 0x0011152c, 0x81317480, + 0x0400004a, 0x59a8d00d, 0x8068d040, 0x42010000, + 0x00111584, 0x40680000, 0x81657480, 0x0400000f, + 0x41580000, 0x80817480, 0x0402100c, 0x40826000, + 0x40800000, 0x80857480, 0x04000003, 0x4084d000, + 0x0401ffcb, 0x82810400, 0x0000002c, 0x41580000, + 0x80817480, 0x040017f6, 0x41510000, 0x41540000, + 0x80817480, 0x04021012, 0x8d3e7d18, 0x04000010, + 0x59a8d04d, 0x59a8004e, 0x80697480, 0x0400000c, + 0x40826000, 0x5880d00a, 0x8068d1c0, 0x0400000d, + 0x4084d000, 0x0401ffb6, 0x82810400, 0x0000002c, + 0x41540000, 0x80817480, 0x040017f0, 0x408a6000, + 0x40926800, 0x808d7040, 0x0400001e, 0x0401f023, + 0x0201f800, 0x001046de, 0x40c66800, 0x80c589c0, + 0x040007f2, 0x58c4d002, 0x5930d827, 0x82680500, + 0x00ffffff, 0x806d7480, 0x040207ec, 0x58c4d013, + 0x5930d826, 0x82680500, 0x00ffffff, 0x806d7480, + 0x040207e6, 0x5930d203, 0x82697480, 0x00000008, + 0x0400000b, 0x4936600a, 0x0401fec4, 0x82810400, + 0x0000002c, 0x0401f7df, 0x59a8d00d, 0x0401f7b8, + 0x0201f800, 0x00106e2e, 0x0401f004, 0x0201f800, + 0x0010b76e, 0x0401f7f4, 0x589d2004, 0x589d1803, + 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00000005, 0x1c01f000, 0x809d3840, 0x48a13800, + 0x829d3c80, 0x00000002, 0x409d4000, 0x829d3c80, 0x00000007, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x48953805, 0x48993806, - 0x4178d000, 0x48694004, 0x0201f800, 0x00106c35, - 0x40c53000, 0x41311000, 0x41352000, 0x41192800, - 0x412d1800, 0x49914003, 0x49d14000, 0x49a54001, - 0x49154002, 0x59be6031, 0x813261c0, 0x04000014, - 0x41310800, 0x0401f007, 0x808101c0, 0x04000003, - 0x41310800, 0x40826000, 0x808101c0, 0x0400000c, - 0x59310000, 0x5932680a, 0x5930d01c, 0x41240000, - 0x80697480, 0x040207f5, 0x5934d403, 0x41440000, - 0x80697480, 0x040207f1, 0x0401f031, 0x417a3000, - 0x0401f007, 0x811a3000, 0x83197480, 0x00000004, - 0x83f17500, 0x03000000, 0x0400001a, 0x0201f800, - 0x001072f1, 0x59926004, 0x813261c0, 0x040007f6, - 0x5932680a, 0x5930d01c, 0x41240000, 0x80697480, - 0x040207f1, 0x5934d403, 0x41440000, 0x80697480, - 0x040207ed, 0x0401fd99, 0x80c589c0, 0x040007ea, - 0x0201f800, 0x00106e6e, 0x0201f800, 0x00106c07, - 0x0201f800, 0x00106c10, 0x0401fcb7, 0x0401f7e2, - 0x408a6000, 0x40926800, 0x40963000, 0x408e5800, - 0x58a32003, 0x58a3a000, 0x58a34801, 0x58a22802, - 0x80997040, 0x04000010, 0x0401f011, 0x49314004, - 0x40826000, 0x808101c0, 0x040007d1, 0x59310001, - 0x0401fd7e, 0x80c589c0, 0x040007f9, 0x4084d000, - 0x58a0d804, 0x0201f800, 0x0010fcfc, 0x0401fc9e, - 0x0401f7f4, 0x0201f800, 0x00106c29, 0x589d3006, - 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x0000000c, - 0x589d4000, 0x809d3800, 0x1c01f000, 0x809d3840, - 0x48a13800, 0x829d3c80, 0x00000007, 0x409d4000, - 0x829d3c80, 0x00000007, 0x48813800, 0x48853801, - 0x48893802, 0x488d3803, 0x48913804, 0x48953805, - 0x48993806, 0x41791800, 0x0201f800, 0x00106c35, - 0x40c52800, 0x41313000, 0x49354005, 0x492d4004, - 0x49194006, 0x49914003, 0x49d14000, 0x49a54001, - 0x49154002, 0x59be6031, 0x813261c0, 0x04000023, - 0x41312000, 0x408d0800, 0x59311000, 0x5932680a, - 0x0401f009, 0x41311800, 0x808509c0, 0x04000010, - 0x808101c0, 0x04000002, 0x40826000, 0x808101c0, - 0x0400000d, 0x59310001, 0x0401fd3c, 0x80c589c0, - 0x040007f5, 0x4090d000, 0x408cd800, 0x0201f800, - 0x0010fcfc, 0x0401fc5c, 0x0401f7f2, 0x41310800, - 0x0401f7f0, 0x808911c0, 0x04000006, 0x408a6000, - 0x808509c0, 0x04000003, 0x40852000, 0x40810800, - 0x808911c0, 0x040207e1, 0x417a3000, 0x0201f800, - 0x001072f1, 0x59926004, 0x813261c0, 0x04000004, - 0x0401fd22, 0x80c589c0, 0x04020011, 0x811a3000, - 0x83197480, 0x00000004, 0x040007f5, 0x040017f4, - 0x409a6000, 0x58a26805, 0x58a25804, 0x58a23006, - 0x58a32003, 0x58a3a000, 0x58a34801, 0x58a22802, - 0x80957040, 0x0400000a, 0x0401f00b, 0x0201f800, - 0x00106e6e, 0x0201f800, 0x00106c07, 0x0201f800, - 0x00106c10, 0x0401fc30, 0x0401f7e9, 0x0201f800, - 0x00106c29, 0x589d3006, 0x589d2805, 0x589d2004, - 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, - 0x829d3c00, 0x0000000e, 0x589d4000, 0x809d3800, - 0x1c01f000, 0x4178e000, 0x497bc856, 0x5930dc03, - 0x826cd480, 0x00000002, 0x82697480, 0x00000002, - 0x04000007, 0x04001006, 0x599cd019, 0x8c68d50e, - 0x04000005, 0x806cd9c0, 0x04020003, 0x4200e000, - 0x00000001, 0x40718800, 0x1c01f000, 0x829d3c80, - 0x00000004, 0x48813800, 0x48853801, 0x48893802, - 0x488d3803, 0x412d0800, 0x41351000, 0x41391800, - 0x0201f800, 0x0010ffc3, 0x80c589c0, 0x040000cd, - 0x5932680a, 0x5930d407, 0x40680000, 0x82697480, - 0x00000013, 0x83f17500, 0x03000000, 0x04000028, - 0x0c01f001, 0x001103b5, 0x00110362, 0x00110372, - 0x00110327, 0x00110362, 0x00110372, 0x0011034a, - 0x0011035b, 0x0011031f, 0x00110382, 0x00110309, - 0x0011031f, 0x0011031f, 0x0011031f, 0x0011031f, - 0x001103b5, 0x00110309, 0x00110306, 0x0011031f, - 0x0011031f, 0x59325818, 0x0201f800, 0x0010059d, - 0x5930d203, 0x82697480, 0x00000004, 0x04000090, - 0x59325809, 0x0201f800, 0x00109660, 0x80c589c0, - 0x04020083, 0x0201f800, 0x00107cbe, 0x8d3e7d1c, - 0x040000a0, 0x497a600a, 0x0401f09e, 0x4200d000, - 0x0000030f, 0x4000d800, 0x4130e000, 0x0201f800, - 0x0010032b, 0x0401f097, 0x59325809, 0x0201f800, - 0x00109660, 0x80c589c0, 0x0402006a, 0x0201f800, - 0x00107cbe, 0x0401f08f, 0x813669c0, 0x04000077, - 0x0201f800, 0x0010a1e1, 0x5930d203, 0x82697480, - 0x00000004, 0x04000081, 0x59325809, 0x0201f800, - 0x00109660, 0x80c589c0, 0x040007df, 0x592cd205, - 0x8268d500, 0x000000ff, 0x82697480, 0x00000014, - 0x04000003, 0x0201f800, 0x0010977c, 0x4a025a05, - 0x00000103, 0x5930d402, 0x486a5c07, 0x592cd409, - 0x8c68d512, 0x04020067, 0x49425a07, 0x497a580a, - 0x0201f800, 0x00109d18, 0x0201f800, 0x000203ef, - 0x0401f7c9, 0x5930d203, 0x82697480, 0x00000004, - 0x04000065, 0x59325809, 0x0201f800, 0x00109660, - 0x80c589c0, 0x040007c0, 0x49425a07, 0x813669c0, - 0x040007f0, 0x0201f800, 0x0010b199, 0x0201f800, - 0x00109d18, 0x0401f7ed, 0x5930d203, 0x82697480, - 0x00000011, 0x04020057, 0x5930d426, 0x486a6203, - 0x0401f054, 0x5930d403, 0x82697480, 0x00000043, - 0x04000050, 0x0201f800, 0x0010b4fc, 0x0401ff62, - 0x80c589c0, 0x0402003c, 0x0201f800, 0x001097a3, - 0x80c589c0, 0x040007a4, 0x0201f800, 0x001084a2, - 0x0401f7a1, 0x59325809, 0x0201f800, 0x00109660, - 0x80c589c0, 0x0400079c, 0x49425a07, 0x497a5c0a, - 0x0201f800, 0x000203ef, 0x5930d226, 0x82697480, - 0x00000003, 0x04020794, 0x0201f800, 0x0010977c, - 0x0401f791, 0x5930d203, 0x82697480, 0x00000004, - 0x04020013, 0x5930d006, 0x8068d1c0, 0x0400002d, - 0x5930d415, 0x8468d558, 0x486a6415, 0x0401f029, - 0x49425a07, 0x497a5c07, 0x0201f800, 0x000203ef, - 0x0201f800, 0x00107cbe, 0x0401f022, 0x49425a07, - 0x0201f800, 0x000203ef, 0x0401f77b, 0x59325809, - 0x0201f800, 0x00106a2d, 0x0401f777, 0x0201f800, - 0x00100c75, 0x0401f76f, 0x4200d000, 0x00000182, - 0x4134d800, 0x4130e000, 0x0201f800, 0x0010032b, - 0x0401f784, 0x0201f800, 0x00101cb2, 0x0401f7c3, - 0x412d0000, 0x592e580a, 0x0201f800, 0x0010059d, - 0x40825800, 0x0401f795, 0x0201f800, 0x00100c75, - 0x0401f77e, 0x0201f800, 0x00100c75, 0x0401f79a, - 0x40865800, 0x408a6800, 0x408e7000, 0x589d1803, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000004, 0x1c01f000, 0x829d3c80, 0x00000002, - 0x48813800, 0x48853801, 0x41310800, 0x4933c857, - 0x4943c857, 0x493fc857, 0x42010000, 0x00111264, - 0x59a8d00d, 0x41640000, 0x80697480, 0x04000010, - 0x41580000, 0x80817480, 0x0402100d, 0x40826000, - 0x8d3e7d12, 0x04000004, 0x40800000, 0x80857480, - 0x04000002, 0x0401ff06, 0x82810400, 0x0000002c, - 0x41580000, 0x80817480, 0x040017f5, 0x41510000, - 0x41540000, 0x80817480, 0x04021019, 0x8d3e7d18, - 0x04000017, 0x59a8d04d, 0x59a8004e, 0x80697480, - 0x04000013, 0x40826000, 0x5880d00a, 0x8068d1c0, - 0x04020005, 0x5880d203, 0x82697480, 0x00000008, - 0x04000008, 0x0401feee, 0x82810400, 0x0000002c, - 0x41540000, 0x80817480, 0x040017ed, 0x0401f004, - 0x0201f800, 0x0010b443, 0x0401f7f7, 0x40866000, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, - 0x1c01f000, 0x497a6226, 0x812e59c0, 0x0400003d, - 0x592cd205, 0x486bc857, 0x592cd205, 0x8268d500, - 0x000000ff, 0x82697480, 0x00000014, 0x04000003, - 0x4a026226, 0x00000003, 0x592cd409, 0x8c68d510, - 0x0402001d, 0x592cd209, 0x0201f800, 0x00104cf4, - 0x0201f800, 0x00109d18, 0x0201f800, 0x0010bd95, - 0x80c589c0, 0x0400001f, 0x4a026403, 0x00000085, - 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, - 0x5930d004, 0x8268d500, 0x00000100, 0x8268d540, - 0x8000404b, 0x486a6004, 0x0201f800, 0x00106c29, - 0x4200d000, 0x8000404b, 0x0201f800, 0x00106b13, - 0x0401f01f, 0x592cd209, 0x0201f800, 0x00104cf4, - 0x4a025c09, 0x00000100, 0x0201f800, 0x00109d18, - 0x0201f800, 0x0010bd95, 0x80c589c0, 0x040207e3, - 0x0201f800, 0x000203ef, 0x5930d226, 0x82697480, - 0x00000003, 0x0400000a, 0x497a6009, 0x0401f7db, - 0x4200d000, 0x00000527, 0x4130d800, 0x412ce000, - 0x0201f800, 0x0010032b, 0x0401f005, 0x0201f800, - 0x0010977c, 0x497a6009, 0x0401f7d0, 0x1c01f000, - 0x0201f800, 0x00106c29, 0x812e59c0, 0x0400001b, - 0x592cd409, 0x8c68d510, 0x04020012, 0x592cd209, - 0x0201f800, 0x00104cf4, 0x0201f800, 0x00109d18, - 0x0201f800, 0x000203ef, 0x5930d203, 0x82697480, - 0x0000000d, 0x0400000d, 0x0201f800, 0x00106c29, - 0x5930d00a, 0x0201f800, 0x001048b8, 0x0401f007, - 0x592cd209, 0x0201f800, 0x00104cf4, 0x4a025c09, - 0x00000100, 0x0401f7ed, 0x0201f800, 0x00107cbe, - 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, - 0x48853801, 0x41790000, 0x0201f800, 0x0010932d, - 0x40c50800, 0x48c7c857, 0x40840000, 0x82857480, - 0x0000000d, 0x83f17500, 0x03000000, 0x0400002b, - 0x0c01f001, 0x0011049b, 0x001104e1, 0x001104b1, - 0x00110488, 0x001104b3, 0x001104a3, 0x0011049b, - 0x0011049b, 0x0011049b, 0x001104a3, 0x001104a3, - 0x001104a3, 0x001104a3, 0x001104b1, 0x0201f800, - 0x00109317, 0x80c589c0, 0x04000005, 0x0201f800, - 0x00106f1e, 0x80c589c0, 0x04000063, 0x0201f800, - 0x0010fd55, 0x80c589c0, 0x04000017, 0x5930d403, - 0x486bc857, 0x5930d403, 0x82697480, 0x00000040, - 0x04020018, 0x0401ffaf, 0x42010000, 0x00000001, - 0x0401f073, 0x40840000, 0x82857480, 0x0000000d, - 0x040007d8, 0x040017d7, 0x4200d000, 0x000004b7, - 0x4130d800, 0x4084e000, 0x0201f800, 0x0010032b, - 0x0401f067, 0x497bc856, 0x0201f800, 0x00106b40, - 0x80c589c0, 0x04020044, 0x59317004, 0x48bbc857, - 0x0401ff4d, 0x0401f7e9, 0x812e59c0, 0x04000050, - 0x0201f800, 0x00109ab4, 0x80c589c0, 0x0400003e, - 0x0201f800, 0x00106c29, 0x592cd209, 0x8468d50c, - 0x486a5a09, 0x592cdc07, 0x806cd0c6, 0x406c0000, - 0x8068d400, 0x8068d400, 0x486a6006, 0x4200d000, - 0x10000000, 0x4130d800, 0x0201f800, 0x001008c0, - 0x80c589c0, 0x0400000c, 0x592cd209, 0x8c68d51c, - 0x04000032, 0x59c8d001, 0x8068d1c0, 0x0402003b, - 0x4200d000, 0x40000000, 0x4130d800, 0x0201f800, - 0x001008c0, 0x5930d203, 0x82697480, 0x00000004, - 0x040207c2, 0x41390000, 0x42027000, 0x00000048, - 0x0201f800, 0x00107d2c, 0x40827000, 0x0401f7bb, - 0x598d700f, 0x48bbc857, 0x40b8d000, 0x41300000, - 0x80697480, 0x04000014, 0x0201f800, 0x0010fece, - 0x80c589c0, 0x040207b0, 0x497bc856, 0x0201f800, - 0x00106b40, 0x4200d000, 0x000003f5, 0x80c589c0, - 0x040007b4, 0x5930d203, 0x486bc857, 0x59310a03, - 0x0401f01b, 0x0201f800, 0x00100c75, 0x0401ff06, - 0x0401f7a2, 0x0201f800, 0x00106f55, 0x80c589c0, - 0x040007f5, 0x0401f7e9, 0x8468d55c, 0x486a5a09, - 0x4a026006, 0x00000002, 0x0401f798, 0x4200d000, - 0x000004a7, 0x4130d800, 0x412ce000, 0x0201f800, - 0x0010032b, 0x0401f006, 0x41310000, 0x0201f800, - 0x0010126f, 0x40826000, 0x0401f7c7, 0x808101c0, - 0x0400078d, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, - 0x48813800, 0x48853801, 0x412d0800, 0x41410000, - 0x4200d000, 0x0010cc32, 0x0201f800, 0x0010bc87, - 0x417a5800, 0x0201f800, 0x00109660, 0x80c589c0, - 0x04000009, 0x0201f800, 0x0010a1e1, 0x59325809, - 0x592cd209, 0x8468d54c, 0x486a5a09, 0x42028000, - 0x00000006, 0x0201f800, 0x00106c35, 0x0401ff3a, - 0x0201f800, 0x00106c29, 0x40828000, 0x40865800, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, - 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, - 0x48853801, 0x412d0800, 0x0201f800, 0x0010ffc3, - 0x80c589c0, 0x040000c3, 0x5930d407, 0x40680000, - 0x82697480, 0x00000013, 0x83f17500, 0x03000000, - 0x04000025, 0x0c01f001, 0x00110605, 0x001105a9, - 0x001105bf, 0x00110586, 0x001105a9, 0x001105bf, - 0x001105cf, 0x001105b8, 0x001105e4, 0x0011055f, - 0x00110575, 0x001105e4, 0x001105e4, 0x001105e4, - 0x001105e4, 0x00110605, 0x0011057b, 0x001105e0, - 0x001105e4, 0x001105e4, 0x0201f800, 0x00106698, - 0x80c589c0, 0x04000090, 0x5930d203, 0x82697480, - 0x00000004, 0x0402009f, 0x5930d006, 0x8068d1c0, - 0x0400009c, 0x5930d415, 0x8468d558, 0x486a6415, - 0x0401f098, 0x4200d000, 0x0000031c, 0x4000d800, - 0x4130e000, 0x0201f800, 0x0010032b, 0x0401f091, - 0x5930d203, 0x82697480, 0x00000004, 0x04020003, - 0x0201f800, 0x00100c75, 0x59325809, 0x0201f800, - 0x00109660, 0x80c589c0, 0x0402006f, 0x0201f800, - 0x00107cbe, 0x8d3e7d1c, 0x04000082, 0x497a600a, - 0x0401f080, 0x0201f800, 0x0010a1e1, 0x5930d203, - 0x82697480, 0x00000004, 0x04000074, 0x59325809, - 0x0201f800, 0x00109660, 0x80c589c0, 0x040007f0, - 0x592cd205, 0x8268d500, 0x000000ff, 0x82697480, - 0x00000014, 0x04000003, 0x0201f800, 0x0010977c, - 0x4a025a05, 0x00000103, 0x592cd409, 0x8c68d512, - 0x0402005c, 0x49425a07, 0x497a580a, 0x0201f800, - 0x0010b199, 0x0201f800, 0x00109d18, 0x0201f800, - 0x00109824, 0x0201f800, 0x000203ef, 0x0401f7d8, - 0x5930d403, 0x82697480, 0x00000043, 0x04000059, - 0x0201f800, 0x001102ca, 0x80c589c0, 0x04020046, - 0x0201f800, 0x001097a3, 0x80c589c0, 0x040007cc, - 0x0201f800, 0x001084a2, 0x0401f7c9, 0x5930d203, - 0x82697480, 0x00000011, 0x0402004a, 0x5930d426, - 0x486a6203, 0x0401f047, 0x59325809, 0x0201f800, - 0x00109660, 0x80c589c0, 0x040007bd, 0x49425a07, - 0x497a5c0a, 0x0201f800, 0x000203ef, 0x5930d226, - 0x82697480, 0x00000003, 0x040207b5, 0x0201f800, - 0x0010977c, 0x0401f7b2, 0x5930d203, 0x82697480, - 0x00000004, 0x04000030, 0x59325809, 0x0201f800, - 0x00109660, 0x80c589c0, 0x040007a9, 0x49425a07, - 0x0201f800, 0x0010b199, 0x0201f800, 0x00109d18, - 0x0201f800, 0x000203ef, 0x0401f7a1, 0x59325818, - 0x0201f800, 0x0010059d, 0x0401f798, 0x59325809, - 0x0201f800, 0x00109660, 0x80c589c0, 0x04000798, - 0x49425a07, 0x497a5c07, 0x0201f800, 0x000203ef, - 0x0401f793, 0x49425a07, 0x0201f800, 0x000203ef, - 0x0401f78f, 0x59325809, 0x0201f800, 0x00106a2d, - 0x0401f78b, 0x0201f800, 0x00101cb2, 0x0401f7b9, - 0x412d0000, 0x592e580a, 0x0201f800, 0x0010059d, - 0x40825800, 0x0401f7a0, 0x0201f800, 0x00100c75, - 0x0401f78b, 0x0201f800, 0x00100c75, 0x0401f7cf, - 0x40865800, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000002, 0x1c01f000, 0x0201f800, 0x0010af81, - 0x80c589c0, 0x0402000c, 0x5930d407, 0x82697480, - 0x00000010, 0x04000002, 0x0401f00f, 0x83457480, - 0x0000ffff, 0x040207fd, 0x5930d00a, 0x8068d1c0, - 0x040207fa, 0x812649c0, 0x04000005, 0x5930d01c, - 0x41240000, 0x80697480, 0x040207f4, 0x5932680a, - 0x0401ff19, 0x1c01f000, 0x829d3c80, 0x00000005, - 0x48813800, 0x48853801, 0x48893802, 0x488d3803, - 0x48913804, 0x41311000, 0x41352000, 0x4933c857, - 0x4947c857, 0x4943c857, 0x0201f800, 0x00106c35, - 0x40c51800, 0x0201f800, 0x0010ae21, 0x41310800, - 0x813261c0, 0x0400004e, 0x42000000, 0x0011120c, - 0x81317480, 0x0400004a, 0x59a8d00d, 0x8068d040, - 0x42010000, 0x00111264, 0x40680000, 0x81657480, - 0x0400000f, 0x41580000, 0x80817480, 0x0402100c, - 0x40826000, 0x40800000, 0x80857480, 0x04000003, - 0x4084d000, 0x0401ffc1, 0x82810400, 0x0000002c, - 0x41580000, 0x80817480, 0x040017f6, 0x41510000, - 0x41540000, 0x80817480, 0x04021012, 0x8d3e7d18, - 0x04000010, 0x59a8d04d, 0x59a8004e, 0x80697480, - 0x0400000c, 0x40826000, 0x5880d00a, 0x8068d1c0, - 0x0400000d, 0x4084d000, 0x0401ffac, 0x82810400, - 0x0000002c, 0x41540000, 0x80817480, 0x040017f0, - 0x408a6000, 0x40926800, 0x808d7040, 0x0400001e, - 0x0401f023, 0x0201f800, 0x001045e2, 0x40c66800, - 0x80c589c0, 0x040007f2, 0x58c4d002, 0x5930d827, - 0x82680500, 0x00ffffff, 0x806d7480, 0x040207ec, - 0x58c4d013, 0x5930d826, 0x82680500, 0x00ffffff, - 0x806d7480, 0x040207e6, 0x5930d203, 0x82697480, - 0x00000008, 0x0400000b, 0x4936600a, 0x0401feba, - 0x82810400, 0x0000002c, 0x0401f7df, 0x59a8d00d, - 0x0401f7b8, 0x0201f800, 0x00106c29, 0x0401f004, - 0x0201f800, 0x0010b443, 0x0401f7f4, 0x589d2004, - 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, - 0x829d3c00, 0x00000005, 0x1c01f000, 0x809d3840, - 0x48a13800, 0x829d3c80, 0x00000002, 0x409d4000, - 0x829d3c80, 0x00000007, 0x48813800, 0x48853801, - 0x48893802, 0x488d3803, 0x48913804, 0x48953805, - 0x48993806, 0x42010000, 0x00000001, 0x41793000, - 0x49214000, 0x49254001, 0x497bc856, 0x41310800, - 0x41351000, 0x41451800, 0x413d2000, 0x40592800, - 0x4200d000, 0x00110694, 0x0201f800, 0x00106301, - 0x59a8d21b, 0x8c68d508, 0x0400001d, 0x8c68d516, - 0x0402001b, 0x59aa6865, 0x813669c0, 0x0400009b, - 0x5934d400, 0x82697480, 0x00000404, 0x04020097, - 0x0201f800, 0x00107cfb, 0x40c66000, 0x80c589c0, - 0x0400008c, 0x48818c07, 0x4935880a, 0x409a7800, - 0x0201f800, 0x001044e6, 0x4200d000, 0x00000005, - 0x0201f800, 0x001044f0, 0x42027000, 0x00000003, - 0x0201f800, 0x00107d2c, 0x0401f084, 0x8268dd00, - 0x00000008, 0x8c68d506, 0x0400006c, 0x806cd9c0, - 0x04000002, 0x41790000, 0x0201f800, 0x0010bd9f, - 0x4200d000, 0x0010bdc7, 0x586a4800, 0x42028800, - 0x000007fe, 0x8058b1c0, 0x0400001e, 0x41440000, - 0x0401f005, 0x83264c00, 0x0000000b, 0x8058b040, - 0x04000018, 0x5924d009, 0x8068d400, 0x8268d480, - 0x000007f0, 0x586a6800, 0x813669c0, 0x040007f6, - 0x5924d200, 0x8268d500, 0x00000003, 0x82697480, - 0x00000003, 0x040207f0, 0x5934d200, 0x8c68d51a, - 0x040007ed, 0x8468d51a, 0x486a6a00, 0x80993000, - 0x83264c00, 0x0000000b, 0x8058b040, 0x040207ea, - 0x809931c0, 0x04000043, 0x8d0e1d20, 0x04020044, - 0x0201f800, 0x00101df2, 0x80817040, 0x0402004f, - 0x4200b000, 0x000007f0, 0x417a8800, 0x0401f004, - 0x81468800, 0x8058b040, 0x04000048, 0x0201f800, - 0x001045e2, 0x80c589c0, 0x040007fa, 0x5934d200, - 0x8c68d51a, 0x040007f7, 0x5934d403, 0x406a8800, + 0x42010000, 0x00000001, 0x41793000, 0x49214000, + 0x49254001, 0x497bc856, 0x41310800, 0x41351000, + 0x41451800, 0x413d2000, 0x40592800, 0x4200d000, + 0x00110987, 0x0201f800, 0x00106506, 0x59a8d21b, + 0x8c68d508, 0x0400001d, 0x8c68d516, 0x0402001b, + 0x59aa6865, 0x813669c0, 0x040000a4, 0x5934d400, + 0x82697480, 0x00000404, 0x040200a0, 0x0201f800, + 0x00107ef5, 0x40c66000, 0x80c589c0, 0x04000095, + 0x48818c07, 0x4935880a, 0x409a7800, 0x0201f800, + 0x001045df, 0x4200d000, 0x00000005, 0x0201f800, + 0x001045e9, 0x42027000, 0x00000003, 0x0201f800, + 0x00107f26, 0x0401f08d, 0x8268dd00, 0x00000008, + 0x8c68d506, 0x04000072, 0x806cd9c0, 0x04000002, + 0x41790000, 0x0201f800, 0x0010c0ca, 0x4200d000, + 0x0010c10d, 0x586a4800, 0x42028800, 0x000007fe, + 0x8058b1c0, 0x0400001f, 0x41440000, 0x0401f005, + 0x83264c00, 0x0000000b, 0x8058b040, 0x04000019, + 0x5924d009, 0x8068d400, 0x8268d480, 0x000007f0, + 0x586a6800, 0x813669c0, 0x040007f6, 0x5924d200, + 0x8268d500, 0x00000003, 0x82697480, 0x00000003, + 0x040207f0, 0x5934da00, 0x8c6cdd1a, 0x040007ed, + 0x826cd500, 0xffffdfff, 0x486a6a00, 0x80993000, + 0x83264c00, 0x0000000b, 0x8058b040, 0x040207e9, + 0x809931c0, 0x04000048, 0x8d0e1d20, 0x04020049, + 0x0201f800, 0x00101e2e, 0x80817040, 0x04020057, + 0x4200b000, 0x000007f0, 0x417a8800, 0x0401f01c, + 0x826cd540, 0x00001000, 0x486a6a00, 0x5934d200, + 0x8468d51a, 0x486a6a00, 0x4937c857, 0x4a026c00, + 0x00000707, 0x0201f800, 0x00106e3a, 0x40c50000, + 0x417a6000, 0x0201f800, 0x00110363, 0x0201f800, + 0x00110447, 0x417a7800, 0x0201f800, 0x001104e0, + 0x0201f800, 0x00110916, 0x80817040, 0x04000032, + 0x81468800, 0x8058b040, 0x04000038, 0x0201f800, + 0x001046de, 0x80c589c0, 0x040007fa, 0x5934da00, + 0x8c6cdd1a, 0x040007f7, 0x5934d403, 0x406a8800, 0x417a7800, 0x42028000, 0x00000029, 0x5934d013, 0x8068d130, 0x406a4000, 0x40680000, 0x4200d000, - 0x0010bdc7, 0x8068d400, 0x586a4800, 0x413cd000, - 0x413cd800, 0x0201f800, 0x0010ae84, 0x5934d200, - 0x8468d558, 0x486a6a00, 0x5934d200, 0x8468d51a, - 0x486a6a00, 0x4937c857, 0x4a026c00, 0x00000707, - 0x0201f800, 0x00106c35, 0x40c50000, 0x417a6000, - 0x0201f800, 0x00110053, 0x0201f800, 0x0011014a, - 0x417a7800, 0x0201f800, 0x001101e3, 0x0201f800, - 0x00110623, 0x80817040, 0x040207ce, 0x0201f800, - 0x00106c29, 0x0401f7cb, 0x8c68d50a, 0x04020794, - 0x80817040, 0x04020011, 0x0401f7c2, 0x4200d000, - 0x000007d0, 0x4200d800, 0x00110694, 0x0201f800, - 0x0010642f, 0x0201f800, 0x00101df2, 0x0401f7b7, - 0x4200d000, 0x00000098, 0x40c4d800, 0x4134e000, + 0x0010c10d, 0x8068d400, 0x586a4800, 0x5924d000, + 0x8068d120, 0x8268e500, 0x00000020, 0x8c68d50a, + 0x040207cc, 0x4070d000, 0x4070d800, 0x0201f800, + 0x0010b193, 0x5934da00, 0x0401f7c6, 0x8c68d50a, + 0x0402078e, 0x80817040, 0x04020014, 0x0401f7bd, + 0x4200d000, 0x000007d0, 0x4200d800, 0x00110987, + 0x0201f800, 0x00106634, 0x0201f800, 0x00101e2e, + 0x0401f7b2, 0x0201f800, 0x00106e2e, 0x0401f7cd, + 0x4200d000, 0x000000a0, 0x40c4d800, 0x4134e000, 0x0201f800, 0x0010032b, 0x58a24801, 0x58a24000, 0x40866000, 0x408a6800, 0x408e8800, 0x40927800, 0x4094b000, 0x589d3006, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000009, 0x589d4000, 0x809d3800, - 0x1c01f000, 0x497bc856, 0x0201f800, 0x00104fbf, - 0x80c589c0, 0x0402004f, 0x59a8d015, 0x8c68d504, - 0x04000028, 0x8d0e1d20, 0x0400001c, 0x4200b000, - 0x000007f0, 0x417a8800, 0x0401f004, 0x81468800, - 0x8058b040, 0x04000015, 0x0201f800, 0x001045e2, - 0x80c589c0, 0x040007fa, 0x0201f800, 0x00104926, - 0x80c589c0, 0x040007f6, 0x59a8d00f, 0x59340002, - 0x8068d580, 0x8268d500, 0x00ffff00, 0x040207f0, - 0x5934d200, 0x8468d55a, 0x486a6a00, 0x81468800, - 0x8058b040, 0x040207ed, 0x0201f800, 0x00104865, - 0x80c589c0, 0x04000026, 0x59a8d029, 0x4200d800, - 0x00110694, 0x0201f800, 0x0010642f, 0x0401f04d, - 0x59a8d21b, 0x8c68d506, 0x040007d7, 0x0201f800, - 0x0010bd9f, 0x4200d000, 0x0010bdc7, 0x586a4800, - 0x42028800, 0x000007fe, 0x0401f012, 0x5924d009, + 0x1c01f000, 0x497bc856, 0x0201f800, 0x001050f0, + 0x80c589c0, 0x04020054, 0x59a8d015, 0x8c68d504, + 0x04020004, 0x59a8d21b, 0x8c68d506, 0x0402002b, + 0x8d0e1d20, 0x04020004, 0x59a8d006, 0x8c68d51c, + 0x0400001c, 0x4200b000, 0x000007f0, 0x417a8800, + 0x0401f004, 0x81468800, 0x8058b040, 0x04000015, + 0x0201f800, 0x001046de, 0x80c589c0, 0x040007fa, + 0x0201f800, 0x00104a28, 0x80c589c0, 0x040007f6, + 0x59a8d00f, 0x59340002, 0x8068d580, 0x8268d500, + 0x00ffff00, 0x040207f0, 0x5934d200, 0x8468d55a, + 0x486a6a00, 0x81468800, 0x8058b040, 0x040207ed, + 0x0201f800, 0x00104965, 0x80c589c0, 0x04000022, + 0x59a8d029, 0x4200d800, 0x00110987, 0x0201f800, + 0x00106634, 0x0401f04b, 0x0201f800, 0x0010c0ca, + 0x4200d000, 0x0010c10d, 0x586a4800, 0x42028800, + 0x000007fe, 0x8058b1c0, 0x040007ce, 0x5924d009, 0x41440000, 0x8068d400, 0x8268d480, 0x000007f0, 0x586a6800, 0x813669c0, 0x04000007, 0x5924d200, 0x8268d500, 0x00000003, 0x82697480, 0x00000003, 0x0400002c, 0x8058b040, 0x83264c00, 0x0000000b, - 0x8058b1c0, 0x040207ee, 0x0401f7bb, 0x8d0e1d20, - 0x040007df, 0x4200d000, 0x000007d0, 0x0401f7d8, - 0x0201f800, 0x0010bd9f, 0x4200d000, 0x0010bdc7, - 0x586a4800, 0x42028800, 0x000007fe, 0x8058b1c0, - 0x040007ad, 0x41440000, 0x0401f005, 0x83264c00, - 0x0000000b, 0x8058b040, 0x040007a7, 0x5924d009, + 0x0401f7ed, 0x8d0e1d20, 0x04020004, 0x59a8d006, + 0x8c68d51c, 0x040007e0, 0x4200d000, 0x000007d0, + 0x0401f7d9, 0x0201f800, 0x0010c0ca, 0x4200d000, + 0x0010c10d, 0x586a4800, 0x42028800, 0x000007fe, + 0x8058b1c0, 0x040007ab, 0x41440000, 0x5924d009, 0x8068d400, 0x8268d480, 0x000007f0, 0x586a6800, - 0x813669c0, 0x040007f6, 0x5924d200, 0x8268d500, - 0x00000003, 0x82697480, 0x00000003, 0x040207f0, - 0x5934d200, 0x8468d51a, 0x486a6a00, 0x0401f7ec, - 0x0201f800, 0x00104926, 0x80c589c0, 0x040007d2, + 0x813669c0, 0x0400000a, 0x5924d200, 0x8268d500, + 0x00000003, 0x82697480, 0x00000003, 0x04020004, + 0x5934d200, 0x8468d51a, 0x486a6a00, 0x83264c00, + 0x0000000b, 0x8058b040, 0x040207ed, 0x0401f795, + 0x0201f800, 0x00104a28, 0x80c589c0, 0x040007d2, 0x5934d200, 0x8468d55a, 0x486a6a00, 0x0401f7ce, 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x40691000, 0x406d1800, 0x40710800, 0x41790000, 0x4880e000, 0x83457480, 0x000007ff, 0x83f17500, 0x03000000, 0x0400004e, 0x4880e002, 0x4944e001, 0x4144f000, - 0x4200d800, 0x0010bf80, 0x4200b000, 0x000007f0, + 0x4200d800, 0x0010c280, 0x4200b000, 0x000007f0, 0x83457480, 0x000007ef, 0x04000040, 0x0400103f, 0x4200b000, 0x00000010, 0x8344f480, 0x000007f0, 0x5924d809, 0x8058b1c0, 0x04000017, 0x40780000, @@ -28933,7 +29195,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x0400004f, 0x0400104e, 0x82697480, 0x00000800, 0x04000032, 0x48690801, 0x8058b040, 0x8058b1c0, 0x040207eb, 0x5884d802, 0x806cd9c0, 0x04000088, - 0x412d0000, 0x4088d000, 0x0201f800, 0x00104526, + 0x412d0000, 0x4088d000, 0x0201f800, 0x00104622, 0x4947c857, 0x4937c857, 0x40825800, 0x813669c0, 0x0400008f, 0x497a6a12, 0x59a8d21b, 0x8c68d50a, 0x0402000a, 0x8288dd00, 0x00ffff00, 0x04000073, @@ -28951,7 +29213,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x48b90803, 0x4947c857, 0x58857003, 0x48bbc857, 0x4a010800, 0x0000001b, 0x0401f058, 0x82697480, 0x000007f0, 0x040207b4, 0x49790801, 0x4200d800, - 0x0010bf80, 0x0401f7e3, 0x49450802, 0x83457480, + 0x0010c280, 0x0401f7e3, 0x49450802, 0x83457480, 0x000007ef, 0x0400001a, 0x04001019, 0x59a8d21b, 0x8c68d50a, 0x0400003c, 0x83457480, 0x000007fe, 0x0400004c, 0x5924d200, 0x8268d500, 0x00000220, @@ -28967,7 +29229,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x4947c857, 0x4873c857, 0x488fc857, 0x4a010800, 0x0000001a, 0x0401f019, 0x8288d500, 0x000000ff, 0x8068d0d0, 0x486a6a12, 0x0401f790, 0x4200d000, - 0x000003f1, 0x4084e000, 0x0201f800, 0x0010032b, + 0x0000044d, 0x4084e000, 0x0201f800, 0x0010032b, 0x0401f774, 0x5924d200, 0x8268e500, 0x00000020, 0x8c68d50a, 0x040207c8, 0x4947c857, 0x4a010800, 0x0000001f, 0x4070d000, 0x0401f02a, 0x4947c857, @@ -28976,72 +29238,72 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x82897480, 0x00fffffe, 0x04020017, 0x42010000, 0x00000001, 0x0401f7b4, 0x82897480, 0x00fffffc, 0x040007bf, 0x0401f779, 0x407e6800, 0x8c8d1d08, - 0x0400076f, 0x0201f800, 0x00104846, 0x80c589c0, + 0x0400076f, 0x0201f800, 0x00104946, 0x80c589c0, 0x0400076b, 0x4947c857, 0x4a010800, 0x0000001d, 0x0401f7e6, 0x4947c857, 0x4a010800, 0x0000001f, 0x0401f008, 0x4947c857, 0x488bc857, 0x58857001, 0x48bbc857, 0x4a010800, 0x00000019, 0x4070d000, 0x40698800, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000004, 0x1c01f000, - 0x4200d000, 0x00000080, 0x0201f800, 0x0010155b, - 0x0201f800, 0x0010646c, 0x59c4d0a3, 0x8468d506, - 0x486b88a3, 0x0201f800, 0x00104fcc, 0x80c589c0, - 0x04020005, 0x0201f800, 0x00104fea, 0x80c589c0, + 0x4200d000, 0x00000080, 0x0201f800, 0x0010155c, + 0x0201f800, 0x00106671, 0x59c4d0a3, 0x8468d506, + 0x486b88a3, 0x0201f800, 0x001050fd, 0x80c589c0, + 0x04020005, 0x0201f800, 0x0010511b, 0x80c589c0, 0x0400006c, 0x59c4d0a3, 0x8268d500, 0xbe7fffff, 0x486b88a3, 0x4200d000, 0x000000f8, 0x0201f800, - 0x00104106, 0x59c4d0a3, 0x8268d540, 0x00018000, + 0x001041ff, 0x59c4d0a3, 0x8268d540, 0x00018000, 0x8468d51c, 0x486b88a3, 0x59c4d0a3, 0x8468d520, 0x486b88a3, 0x497b8808, 0x59c4d006, 0x8268d500, 0xfbffff0e, 0x486b8806, 0x497b282c, 0x497b282d, - 0x4200d000, 0x000001f4, 0x4200d800, 0x00110a9f, - 0x0201f800, 0x001062ea, 0x4a038805, 0x00000001, - 0x0201f800, 0x0010161e, 0x80c589c0, 0x04020023, - 0x0201f800, 0x0010162c, 0x80c589c0, 0x04000035, - 0x4178d000, 0x0201f800, 0x001018a1, 0x4178d000, - 0x0201f800, 0x00101827, 0x0201f800, 0x00101925, - 0x4a035038, 0x00000001, 0x0201f800, 0x00104fcc, + 0x4200d000, 0x000001f4, 0x4200d800, 0x00110d9f, + 0x0201f800, 0x001064ef, 0x4a038805, 0x00000001, + 0x0201f800, 0x00101623, 0x80c589c0, 0x04020023, + 0x0201f800, 0x00101631, 0x80c589c0, 0x04000035, + 0x4178d000, 0x0201f800, 0x001018a6, 0x4178d000, + 0x0201f800, 0x0010182c, 0x0201f800, 0x0010192a, + 0x4a035038, 0x00000001, 0x0201f800, 0x001050fd, 0x80c589c0, 0x04000018, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x82697480, 0x00000008, 0x04000003, 0x4a038805, 0x04000000, 0x59c4d0a3, 0x8268d540, 0x0001c000, 0x486b88a3, 0x59c4d0a3, 0x8468d520, 0x486b88a3, 0x0401f050, 0x4200d000, 0x00000001, - 0x0201f800, 0x001018a1, 0x4200d000, 0x00000001, - 0x0401f7e0, 0x0201f800, 0x00104fea, 0x80c589c0, - 0x040207e6, 0x0201f800, 0x00104fdb, 0x4200d000, - 0x000001a1, 0x80c589c0, 0x04020033, 0x599cd818, + 0x0201f800, 0x001018a6, 0x4200d000, 0x00000001, + 0x0401f7e0, 0x0201f800, 0x0010511b, 0x80c589c0, + 0x040207e6, 0x0201f800, 0x0010510c, 0x4200d000, + 0x000001a9, 0x80c589c0, 0x04020033, 0x599cd818, 0x40c4e000, 0x0201f800, 0x0010032b, 0x0401f03a, - 0x0201f800, 0x0010163a, 0x80c589c0, 0x04020023, - 0x0201f800, 0x00101648, 0x80c589c0, 0x0400002e, + 0x0201f800, 0x0010163f, 0x80c589c0, 0x04020023, + 0x0201f800, 0x0010164d, 0x80c589c0, 0x0400002e, 0x59a8d043, 0x8068d1c0, 0x040007c8, 0x0201f800, - 0x00101655, 0x4a035038, 0x00000001, 0x0401f02a, - 0x0201f800, 0x00104fdb, 0x80c589c0, 0x0400001f, + 0x0010165a, 0x4a035038, 0x00000001, 0x0401f02a, + 0x0201f800, 0x0010510c, 0x80c589c0, 0x0400001f, 0x59c4d0a3, 0x8468d570, 0x8468d532, 0x486b88a3, 0x59a8d078, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, 0x82b97580, 0x0c000000, - 0x04020796, 0x0201f800, 0x0010540b, 0x4a038808, + 0x04020796, 0x0201f800, 0x0010553c, 0x4a038808, 0x00000008, 0x0401f791, 0x4200d000, 0x00000002, - 0x0201f800, 0x001018a1, 0x4200d000, 0x00000002, + 0x0201f800, 0x001018a6, 0x4200d000, 0x00000002, 0x0401f7a4, 0x4a035014, 0x00000001, 0x0201f800, - 0x00104f20, 0x0401f008, 0x4200d000, 0x0000014e, - 0x0401f7c7, 0x4200d000, 0x00000182, 0x59a8d837, + 0x00105051, 0x0401f008, 0x4200d000, 0x00000156, + 0x0401f7c7, 0x4200d000, 0x0000018a, 0x59a8d837, 0x0401f7c4, 0x1c01f000, 0x5994d02c, 0x8068d1c0, 0x04020006, 0x5994d02d, 0x4200d800, 0x00000001, 0x8068d1c0, 0x04000002, 0x4178d800, 0x406d8800, - 0x1c01f000, 0x0201f800, 0x0010181b, 0x4a035038, + 0x1c01f000, 0x0201f800, 0x00101820, 0x4a035038, 0x00000002, 0x497b5043, 0x59c4d0a3, 0x8468d520, - 0x486b88a3, 0x0201f800, 0x00104fdb, 0x80c589c0, + 0x486b88a3, 0x0201f800, 0x0010510c, 0x80c589c0, 0x04000002, 0x0401f009, 0x48c7282c, 0x48c7282d, - 0x4200d000, 0x0000002d, 0x4200d800, 0x00110a9f, - 0x0201f800, 0x001062ea, 0x1c01f000, 0x0401ffdf, + 0x4200d000, 0x0000002d, 0x4200d800, 0x00110d9f, + 0x0201f800, 0x001064ef, 0x1c01f000, 0x0401ffdf, 0x80c589c0, 0x04000004, 0x4a035038, 0x00000003, - 0x0401f01f, 0x0201f800, 0x00101648, 0x80c589c0, + 0x0401f01f, 0x0201f800, 0x0010164d, 0x80c589c0, 0x04000004, 0x59a8d043, 0x8068d1c0, 0x04020008, - 0x0201f800, 0x001018ec, 0x80c589c0, 0x04020002, + 0x0201f800, 0x001018f1, 0x80c589c0, 0x04020002, 0x0401f013, 0x0401ffd8, 0x0401f011, 0x0201f800, - 0x00101655, 0x59a8d042, 0x8c68d51e, 0x040007f9, - 0x0201f800, 0x00104fdb, 0x80c589c0, 0x04020003, + 0x0010165a, 0x59a8d042, 0x8c68d51e, 0x040007f9, + 0x0201f800, 0x0010510c, 0x80c589c0, 0x04020003, 0x0401ffcd, 0x0401f006, 0x4a035014, 0x00000001, - 0x0201f800, 0x00104f20, 0x0401f7fa, 0x1c01f000, + 0x0201f800, 0x00105051, 0x0401f7fa, 0x1c01f000, 0x4202d800, 0x00000001, 0x497b5038, 0x4a038805, 0x00000001, 0x497b282c, 0x497b282d, 0x497b8885, 0x1c01f000, 0x59a8d078, 0x82697480, 0x00000000, @@ -29050,7 +29312,7 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x000000c0, 0x04020005, 0x486b8885, 0x0401f008, 0x8468d506, 0x486b5078, 0x59c4d006, 0x8268d540, 0x000000f1, 0x486b8806, 0x0401ffe2, 0x1c01f000, - 0x0201f800, 0x00104fea, 0x80c589c0, 0x04000005, + 0x0201f800, 0x0010511b, 0x80c589c0, 0x04000005, 0x59a8d013, 0x82697480, 0x0000aaaa, 0x0400000c, 0x497b5013, 0x59c4d006, 0x8268d540, 0x04000001, 0x486b8806, 0x8d0e1d06, 0x04020008, 0x59c4d0a3, @@ -29059,24 +29321,24 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x809d3840, 0x48813800, 0x0401ff80, 0x80c589c0, 0x04000005, 0x4a035038, 0x00000003, 0x497b8885, 0x0401f03e, 0x4a038805, 0x000000f0, 0x0201f800, - 0x001018ec, 0x80c589c0, 0x0400002d, 0x0201f800, - 0x00104fdb, 0x80c589c0, 0x04020033, 0x59c4d0a4, + 0x001018f1, 0x80c589c0, 0x0400002d, 0x0201f800, + 0x0010510c, 0x80c589c0, 0x04020033, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x82697480, 0x00000008, 0x0400002b, 0x59c4d005, 0x82690500, 0x04000000, 0x8c68d534, 0x04020026, 0x5994d02c, 0x82697480, 0x00000002, 0x83f17500, 0x03000000, 0x040007e4, - 0x0201f800, 0x00104fea, 0x80c589c0, 0x040007e0, - 0x4a038805, 0x000000f0, 0x0201f800, 0x0010502f, + 0x0201f800, 0x0010511b, 0x80c589c0, 0x040007e0, + 0x4a038805, 0x000000f0, 0x0201f800, 0x00105160, 0x4a035013, 0x0000aaaa, 0x48835014, 0x59c4d0a3, 0x8468d546, 0x486b88a3, 0x4202d800, 0x00000001, 0x48835038, 0x4a038805, 0x00000001, 0x4883282c, 0x4883282d, 0x0401ff98, 0x0401f7cd, 0x0201f800, - 0x00101648, 0x80c589c0, 0x040007c9, 0x59a8d043, + 0x0010164d, 0x80c589c0, 0x040007c9, 0x59a8d043, 0x8068d1c0, 0x040007c6, 0x0401f7c3, 0x0401ffa5, 0x0401f7c3, 0x0401ff8c, 0x589d0000, 0x809d3800, 0x1c01f000, 0x497bc856, 0x4200d000, 0x00000080, - 0x0201f800, 0x0010155b, 0x497b5038, 0x0201f800, - 0x00101648, 0x80c589c0, 0x0400000e, 0x59a8d036, + 0x0201f800, 0x0010155c, 0x497b5038, 0x0201f800, + 0x0010164d, 0x80c589c0, 0x0400000e, 0x59a8d036, 0x8068d1c0, 0x04020008, 0x8068d1c0, 0x04020009, 0x4a035036, 0x0000000a, 0x4a035043, 0x00000001, 0x0401f004, 0x8068d040, 0x486b5036, 0x0401f7f7, @@ -29084,1165 +29346,1177 @@ static const uint32_t isp_2400_multi_risc_code[] = { 0x59a8d878, 0x826d7480, 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, 0x82b97580, 0x0c000000, 0x04020011, 0x4200e000, 0x00000003, 0x59a80038, - 0x80717480, 0x04001006, 0x0c01f001, 0x00110a99, - 0x00110a9b, 0x00110a9d, 0x00110a97, 0x4200d000, - 0x000000c3, 0x4000d800, 0x0201f800, 0x0010032b, + 0x80717480, 0x04001006, 0x0c01f001, 0x00110d99, + 0x00110d9b, 0x00110d9d, 0x00110d97, 0x4200d000, + 0x000000cb, 0x4000d800, 0x0201f800, 0x0010032b, 0x0401f019, 0x826cd500, 0x00000008, 0x8c6cdd06, 0x040207ed, 0x4202d800, 0x00000001, 0x486b5038, 0x486b282c, 0x486b282d, 0x59a8d078, 0x8468d506, 0x486b5078, 0x4a035014, 0x00000001, 0x0201f800, - 0x00104f20, 0x0401f008, 0x0401ffbb, 0x0401f006, + 0x00105051, 0x0401f008, 0x0401ffbb, 0x0401f006, 0x0401fe4c, 0x0401f004, 0x0401ff11, 0x0401f002, 0x0401ff6c, 0x1c01f000, 0x497b282d, 0x1c01f000, 0x809d3840, 0x48813800, 0x59a8d017, 0x82697480, - 0x0000ffff, 0x04000004, 0x0201f800, 0x00101df2, - 0x0401f0c3, 0x59a8da1b, 0x826cd500, 0x00000028, - 0x04000032, 0x8c6cdd00, 0x04000030, 0x4a038802, - 0x0000ffbf, 0x59a8da1b, 0x8c6cdd02, 0x0400002b, + 0x0000ffff, 0x04000004, 0x0201f800, 0x00101e2e, + 0x0401f0ea, 0x0201f800, 0x0010c0e1, 0x80c57040, + 0x04000098, 0x59a8da1b, 0x826cd500, 0x00000028, + 0x04020045, 0x8c6cdd08, 0x0400006b, 0x599cd019, + 0x8c68d510, 0x04020003, 0x8c6cdd16, 0x04000082, + 0x0201f800, 0x00104965, 0x80c589c0, 0x04020039, + 0x599cd019, 0x8c68d510, 0x04000063, 0x59a8d21b, + 0x8c68d508, 0x04000060, 0x4a038802, 0x0000ffff, + 0x4200d000, 0x0010cb46, 0x0201f800, 0x00100532, + 0x4200d000, 0x0010cb53, 0x0201f800, 0x00100532, + 0x850e1d02, 0x4a0378e4, 0x00000080, 0x4202d800, + 0x00000003, 0x4a035017, 0x0000ffff, 0x0201f800, + 0x00100430, 0x4178d000, 0x0201f800, 0x0010155c, + 0x59a8d21b, 0x8c68d506, 0x04000094, 0x599cd018, + 0x8268dd00, 0x00000800, 0x8c68d516, 0x0402008c, + 0x599cd019, 0x8c68d510, 0x04000004, 0x59a8d21b, + 0x8c68d508, 0x04020090, 0x417a4000, 0x4200d000, + 0x0000ffff, 0x4200d800, 0x00000006, 0x4120e000, + 0x0201f800, 0x00103a1e, 0x0201f800, 0x0010511b, + 0x80c589c0, 0x04000049, 0x0201f800, 0x001071f9, + 0x0401f09e, 0x8c6cdd00, 0x040007bb, 0x4a038802, + 0x0000ffbf, 0x59a8da1b, 0x8c6cdd02, 0x040007b6, 0x599ce018, 0x82710500, 0x00000800, 0x8c70e516, - 0x0402001d, 0x59a8d01c, 0x82697480, 0x0000ffff, - 0x04000019, 0x8c6cdd0a, 0x040200a2, 0x42024800, - 0x0010ccd1, 0x40824000, 0x5924d200, 0x8268d500, - 0x000000e0, 0x82697480, 0x000000e0, 0x04020058, - 0x0201f800, 0x00101c4e, 0x59a8d21b, 0x8268dd00, - 0x00000004, 0x8c68d504, 0x04020051, 0x406e5800, - 0x4200d000, 0x00000003, 0x0201f800, 0x00101c7d, - 0x0401f097, 0x8c70e516, 0x04020005, 0x59a8d01c, - 0x82697480, 0x0000ffff, 0x04000089, 0x59a8d01d, - 0x8068d1c0, 0x04020042, 0x8c6cdd08, 0x04000041, - 0x599cd019, 0x8c68d510, 0x04000042, 0x0201f800, - 0x00104865, 0x80c589c0, 0x04020039, 0x599cd019, - 0x8c68d510, 0x0400003e, 0x59a8d21b, 0x8c68d508, - 0x0400003b, 0x4a038802, 0x0000ffff, 0x4200d000, - 0x0010c846, 0x0201f800, 0x00100532, 0x4200d000, - 0x0010c853, 0x0201f800, 0x00100532, 0x850e1d02, - 0x4a0378e4, 0x00000080, 0x4202d800, 0x00000003, - 0x4a035017, 0x0000ffff, 0x0201f800, 0x00100430, - 0x4178d000, 0x0201f800, 0x0010155b, 0x59a8d21b, - 0x8c68d506, 0x04000046, 0x599cd018, 0x8268dd00, - 0x00000800, 0x8c68d516, 0x04020048, 0x599cd019, - 0x8c68d510, 0x04000004, 0x59a8d21b, 0x8c68d508, - 0x0402004a, 0x417a4000, 0x4200d000, 0x0000ffff, - 0x4200d800, 0x00000006, 0x4120e000, 0x0201f800, - 0x0010392e, 0x0201f800, 0x00104fea, 0x80c589c0, - 0x04000020, 0x0201f800, 0x00106ff4, 0x0401f04c, - 0x59a8d016, 0x8068d1c0, 0x040007c1, 0x0401f048, - 0x8c6cdd16, 0x040207be, 0x0401f045, 0x599cd018, - 0x8c68d516, 0x0400001d, 0x599cd017, 0x8c68d50a, - 0x040007c1, 0x4200b000, 0x000007f0, 0x417a8800, - 0x0401f004, 0x81468800, 0x8058b040, 0x040007ba, - 0x0201f800, 0x001045e2, 0x80c589c0, 0x040007fa, - 0x5934d200, 0x8c68d51a, 0x040007f7, 0x0401f030, - 0x0201f800, 0x00104fbf, 0x80c589c0, 0x04000016, - 0x59c4d006, 0x8468d534, 0x486b8806, 0x0201f800, - 0x00106ff4, 0x0401f7da, 0x0201f800, 0x00104bf4, - 0x80c589c0, 0x040007e1, 0x0401f021, 0x0201f800, - 0x00104fbf, 0x80c589c0, 0x040207b8, 0x59a8d21b, - 0x486b541b, 0x0401f7b5, 0x0201f800, 0x0010399f, - 0x0401f7c5, 0x59c4d006, 0x8268d500, 0xffffff0f, - 0x486b8806, 0x0401f7ea, 0x406e4000, 0x4200d000, - 0x000007fe, 0x4200d800, 0x00000004, 0x0401f7b7, - 0x0201f800, 0x00101f00, 0x0401f75d, 0x8c6cdd04, - 0x04020777, 0x826cd500, 0x00004000, 0x8c6cdd1c, - 0x04020773, 0x406a5800, 0x0401f766, 0x589d0000, - 0x809d3800, 0x1c01f000, 0x59c4d00d, 0x8c68d51e, - 0x04020004, 0x59c4d005, 0x8c68d500, 0x0400000c, - 0x0201f800, 0x00100448, 0x0201f800, 0x00104fbf, - 0x80c589c0, 0x0400000f, 0x0201f800, 0x00104f20, - 0x816d7040, 0x040000a6, 0x0401f12f, 0x4a035043, - 0x00000001, 0x4202d800, 0x00000004, 0x4200d000, - 0x0010cc8d, 0x0201f800, 0x0010bc87, 0x0401f126, - 0x0201f800, 0x00104fea, 0x80c589c0, 0x0402008e, - 0x0201f800, 0x001039eb, 0x59c4d0a4, 0x8268d500, - 0x0000000f, 0x82697480, 0x00000006, 0x83f17500, - 0x03000000, 0x040007e9, 0x0201f800, 0x0010646c, - 0x59c4d0a3, 0x8468d528, 0x486b88a3, 0x59a8d060, - 0x8068d1c0, 0x040000d9, 0x59a8e075, 0x8270d500, - 0x00001f00, 0x8068d910, 0x826d7480, 0x00000002, - 0x83f17500, 0x03000000, 0x040000bd, 0x59a8d015, - 0x8468d546, 0x486b5015, 0x0201f800, 0x00104fcc, - 0x80c589c0, 0x040000bd, 0x59c4d006, 0x8268d540, - 0x44000001, 0x486b8806, 0x59c4d006, 0x8268d500, - 0xffffff0f, 0x486b8806, 0x497b9005, 0x4178d000, - 0x0201f800, 0x00104d10, 0x4a038802, 0x0000ffff, - 0x4a0378e4, 0x00003000, 0x4200d000, 0x0010c89c, - 0x5868d400, 0x8c68d508, 0x04020003, 0x4a0378e4, - 0x000c0000, 0x4200d000, 0x0010cb66, 0x0201f800, - 0x0010bc87, 0x59a8d00f, 0x4200d800, 0x00000003, - 0x0201f800, 0x00106c61, 0x4200d000, 0x00008010, - 0x59a8d809, 0x0201f800, 0x001038ba, 0x59c8d015, - 0x8468d548, 0x486b9015, 0x0201f800, 0x0010181b, - 0x59a8d008, 0x8468d500, 0x486b5008, 0x850e1d0a, - 0x0201f800, 0x00110766, 0x0201f800, 0x00104fbf, - 0x80c589c0, 0x04020003, 0x8d0e1d06, 0x040200a0, - 0x0201f800, 0x00104865, 0x80c589c0, 0x04000092, - 0x59c4d002, 0x8468d50c, 0x486b8802, 0x497b501d, - 0x497b501c, 0x497b5057, 0x0201f800, 0x00104fbf, - 0x80c589c0, 0x0400007d, 0x497b521b, 0x0201f800, - 0x00101603, 0x59a8d01f, 0x82680500, 0xffff0000, - 0x80c4d540, 0x486b501f, 0x599cd017, 0x8c68d50a, - 0x04000004, 0x59a8d21b, 0x8468d544, 0x486b521b, - 0x4200d000, 0x00000005, 0x0201f800, 0x001072bb, - 0x497b501d, 0x497b5016, 0x4a035017, 0x0000ffff, - 0x4a0378e4, 0x080000c0, 0x4202d800, 0x00000002, - 0x0201f800, 0x00104fbf, 0x80c589c0, 0x04020007, - 0x59a8d21b, 0x8268d500, 0x0000000c, 0x82697480, - 0x00000004, 0x04000769, 0x0201f800, 0x00101df2, - 0x0401f095, 0x5994d02d, 0x42000000, 0x001040f1, - 0x80697480, 0x04000042, 0x59c4d006, 0x8268d540, - 0x000000c0, 0x486b8806, 0x0401f76a, 0x59a8d011, - 0x82697480, 0x00000009, 0x04020758, 0x497b500f, - 0x0201f800, 0x0010bd9f, 0x42024800, 0x0010ccd1, - 0x497a4805, 0x0401f00a, 0x5924d200, 0x8c68d500, - 0x04000004, 0x8268d500, 0xfffff815, 0x486a4a00, - 0x83264c00, 0x0000000b, 0x8058b040, 0x8058b1c0, - 0x040207f6, 0x4a038805, 0x000000f0, 0x0201f800, - 0x00104fdb, 0x80c589c0, 0x0400004b, 0x59c4d006, - 0x8268d540, 0x000000f1, 0x486b8806, 0x59c4d006, - 0x8268d500, 0xbbffffff, 0x486b8806, 0x0201f800, - 0x0010646c, 0x0201f800, 0x00106c6c, 0x59a8d878, - 0x826d7480, 0x00000000, 0x83f17500, 0x0c000000, - 0x04000004, 0x82b97580, 0x0c000000, 0x0402004d, - 0x4a038893, 0x00000001, 0x4200d000, 0x0010cb6f, - 0x0201f800, 0x0010bc87, 0x497b5056, 0x4200d000, - 0x00008030, 0x4178d800, 0x0401f773, 0x5994d02c, - 0x8068d1c0, 0x0402072b, 0x0401f7bc, 0x806cd840, - 0x8270d500, 0x00ff0000, 0x806c00d0, 0x8068d540, - 0x486b9035, 0x0401f73e, 0x59c4d006, 0x8268d540, - 0x440000f1, 0x0401f748, 0x59a8d01f, 0x8268d500, - 0xffff0000, 0x486b501f, 0x0201f800, 0x00101603, - 0x48c78880, 0x0401f785, 0x0201f800, 0x0010402d, - 0x0401f035, 0x0201f800, 0x00104fbf, 0x80c589c0, - 0x04000011, 0x59a8d018, 0x8068d1c0, 0x0402076c, - 0x0201f800, 0x001099aa, 0x0401f769, 0x4a035056, - 0x00000001, 0x850e1d0e, 0x0201f800, 0x00103b46, - 0x0401f025, 0x59c4d006, 0x8268d540, 0x440000f1, - 0x0401f7ba, 0x0201f800, 0x001099aa, 0x59a8d21b, - 0x8c68d506, 0x0402075a, 0x59a8d018, 0x8068d1c0, - 0x04020007, 0x59a8d41b, 0x8c68d508, 0x04000754, - 0x82697480, 0x0000ffff, 0x04000751, 0x4a03541b, - 0x0000ffff, 0x0201f800, 0x00104162, 0x0401f74c, - 0x59aa6879, 0x5934d400, 0x82697480, 0x00000404, - 0x04020007, 0x8c6cdd0c, 0x040006d8, 0x826cd500, - 0x00000003, 0x040007ad, 0x0401f003, 0x0201f800, - 0x0010b551, 0x1c01f000, 0x809d3840, 0x48a13800, - 0x829d3c80, 0x00000005, 0x409d4000, 0x829d3c80, - 0x00000007, 0x48813800, 0x48853801, 0x48893802, - 0x488d3803, 0x48913804, 0x48953805, 0x48993806, - 0x4200e000, 0x00000001, 0x48714000, 0x4178e000, - 0x48714003, 0x48714004, 0x48594001, 0x49214002, - 0x82691d00, 0x00ffffff, 0x826d3500, 0x00ffffff, - 0x828cd500, 0x00ff0000, 0x82697480, 0x00ff0000, - 0x0400005e, 0x41792800, 0x4200b000, 0x000007f0, - 0x41ad0800, 0x40951000, 0x828d2500, 0x00ffff00, - 0x0401f00f, 0x809121c0, 0x04000032, 0x59a8d00f, - 0x8268d500, 0x00ffff00, 0x40900000, 0x80697480, - 0x0400002c, 0x4178e000, 0x48714004, 0x80850800, - 0x80891000, 0x8058b040, 0x04000021, 0x58850000, - 0x808101c0, 0x04000036, 0x5880d212, 0x8268d500, - 0x0000ff00, 0x040207ec, 0x5880d002, 0x8268d500, - 0x00ffffff, 0x408c0000, 0x80697480, 0x040207f0, - 0x4098d000, 0x0201f800, 0x00101f65, 0x5880d813, - 0x806cd130, 0x41200000, 0x80697480, 0x040207e8, - 0x4200e000, 0x00000001, 0x48714004, 0x5924d005, - 0x826c0500, 0x00ffffff, 0x80697480, 0x04000004, - 0x812000f0, 0x8068d540, 0x48690013, 0x58a0d004, - 0x8068d1c0, 0x04000020, 0x408a8800, 0x0401f048, - 0x5880d002, 0x8268d500, 0x000000ff, 0x828c0500, - 0x000000ff, 0x80697480, 0x040207d1, 0x4098d000, - 0x0201f800, 0x00101f65, 0x5880d813, 0x806cd130, - 0x41200000, 0x80697480, 0x040207c9, 0x4200d000, - 0x00000001, 0x48694004, 0x0401f7e1, 0x809529c0, - 0x040207c3, 0x58a0e003, 0x8070e1c0, 0x040207c0, - 0x40892800, 0x4200d000, 0x00000001, 0x48694003, - 0x0401f7bb, 0x58a0e003, 0x8070e1c0, 0x04000018, - 0x40968800, 0x0401f026, 0x828d7480, 0x00fffffb, - 0x040007a1, 0x040017a0, 0x828d7480, 0x00ffffff, - 0x0400079d, 0x828d7480, 0x00fffffd, 0x0400001a, - 0x828d7480, 0x00fffffd, 0x83f17500, 0x03000000, - 0x0400000c, 0x828d7480, 0x00fffffc, 0x0400000f, - 0x4178d000, 0x48694000, 0x0401f011, 0x488fc857, - 0x489bc857, 0x58a0d003, 0x48694000, 0x0401f00c, - 0x828d7480, 0x00fffffe, 0x040207f6, 0x42028800, - 0x000007fe, 0x0401f006, 0x42028800, 0x000007fc, - 0x0401f003, 0x42028800, 0x000007fd, 0x58a24002, - 0x58a0b001, 0x58a18800, 0x589d3006, 0x589d2805, - 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x0000000c, 0x589d4000, - 0x809d3800, 0x1c01f000, 0x486bc857, 0x0401ff4f, - 0x1c01f000, 0x00000000, 0x00000001, 0x00000002, - 0x00000003, 0x00000004, 0x00000005, 0x00000006, - 0x00000007, 0x00000008, 0x00000009, 0x0000000a, - 0x0000000b, 0x0000000c, 0x0000000d, 0x0000000e, - 0x0000000f, 0x67515372, 0x02800004, 0x00000000, - 0x0000c000, 0x000008a0, 0x073fca5a, 0x0705a5a5, - 0x01928009, 0x070ff0e1, 0x03800006, 0x04958010, - 0x05308000, 0x05008000, 0x0600902f, 0x06a00602, - 0x0202f051, 0x042e4020, 0x018f02af, 0x033e5000, - 0x03020000, 0x068d0020, 0x06930516, 0x03920518, - 0x050fb056, 0x040010e6, 0x002fb008, 0x060ff0e6, - 0x00580401, 0x054880ff, 0x0781001e, 0x038c03c6, - 0x038a03c5, 0x078b03c3, 0x048e8010, 0x0678aae5, - 0x06000051, 0x078181c9, 0x040010e6, 0x0448e0e6, - 0x04818010, 0x002fb008, 0x0448e0e6, 0x04818010, - 0x060ff0e6, 0x00580401, 0x054880ff, 0x04818010, - 0x022a5001, 0x030430d4, 0x06780043, 0x030e0000, - 0x030450ff, 0x06780043, 0x03019000, 0x03a1820a, - 0x0781873a, 0x027c0045, 0x03020000, 0x06810040, - 0x027c0045, 0x03040000, 0x04810116, 0x027c0045, - 0x03080000, 0x048107ab, 0x04908040, 0x00910738, - 0x010410a6, 0x0379ff41, 0x037fffff, 0x072d6000, - 0x07601441, 0x050f80ff, 0x032fa009, 0x07f00000, - 0x05600400, 0x050f80ff, 0x056c04ff, 0x0481075d, - 0x073fa009, 0x06000001, 0x0279ff02, 0x0700ffff, - 0x070ff0d1, 0x0179feff, 0x0700ffff, 0x045c0402, - 0x0681875d, 0x060ff0d0, 0x0179feff, 0x0700ffff, - 0x050010ff, 0x057dfeff, 0x0700ffff, 0x05810730, - 0x05602600, 0x050f80ff, 0x073fa009, 0x06000001, - 0x0079fe02, 0x0700ffff, 0x045c0401, 0x07818730, - 0x05601041, 0x050f80ff, 0x032fa069, 0x07480000, - 0x0481074f, 0x06780043, 0x070000f0, 0x07810072, - 0x037c00ff, 0x06000010, 0x07810072, 0x0180074b, - 0x0379ff00, 0x070fffff, 0x06780043, 0x07f00000, - 0x075a0000, 0x020ef001, 0x0186074d, 0x05484000, - 0x03a1822d, 0x062d6001, 0x002fb001, 0x070ff069, - 0x00868085, 0x060ff079, 0x055c0441, 0x06810010, - 0x012fb000, 0x060560fb, 0x0380008b, 0x060ff079, - 0x02868208, 0x070ff069, 0x055c0441, 0x06810010, - 0x060560fb, 0x0400d0d0, 0x062d6002, 0x0648300d, - 0x07810099, 0x070ff0d1, 0x062d6001, 0x045c040b, - 0x0781009c, 0x05488000, 0x05818099, 0x072e500c, - 0x00208001, 0x06a00607, 0x02800010, 0x062d6001, - 0x07f00000, 0x07f00000, 0x070ff0d1, 0x0179feff, - 0x070000ff, 0x055c040c, 0x0781810a, 0x0007b001, - 0x03079041, 0x0307a000, 0x06600a79, 0x050f80ff, - 0x053fa80a, 0x06000010, 0x068d00a8, 0x0307c003, - 0x0007d004, 0x0107e005, 0x0307f006, 0x02080007, - 0x00081008, 0x01082009, 0x0308300a, 0x018680bd, - 0x0448d07a, 0x058180bd, 0x0448b07a, 0x05810756, - 0x06604479, 0x050f80ff, 0x053fa809, 0x06000001, - 0x01680703, 0x076c0303, 0x07818756, 0x072d5003, - 0x0049107a, 0x068100c7, 0x070ff009, 0x0154040a, - 0x058280c6, 0x078d00c3, 0x0108200a, 0x032ff000, - 0x010770ff, 0x0008400b, 0x0308500c, 0x0678007a, - 0x04000108, 0x078100e1, 0x078d00cc, 0x06603c79, - 0x050f80ff, 0x073fa041, 0x0600004a, 0x0249007a, - 0x068100da, 0x068d00d3, 0x06602279, 0x050f80ff, - 0x032fa009, 0x07780000, 0x03800000, 0x078100e1, - 0x068d00da, 0x0678007a, 0x07f00000, 0x010880ff, - 0x02386008, 0x03010000, 0x038000e7, 0x078d00e1, - 0x0678007a, 0x07f00000, 0x010880ff, 0x03386000, - 0x03010000, 0x072e6300, 0x020ef07f, 0x02860010, - 0x070ff07d, 0x0450047c, 0x050f80ff, 0x002fa819, - 0x078d00ee, 0x02080001, 0x00081002, 0x0678007a, - 0x04000201, 0x078100fa, 0x0448807a, 0x068100f8, - 0x0379ff03, 0x070000ff, 0x0049107a, 0x02a18226, - 0x01082003, 0x068d00fb, 0x0448b07a, 0x07818103, - 0x0249007a, 0x05810106, 0x07780003, 0x03800000, - 0x05810106, 0x0338600c, 0x03010000, 0x00800108, - 0x02386004, 0x03010000, 0x072e6c00, 0x02800010, - 0x06780043, 0x070000f0, 0x04810758, 0x050020ff, - 0x027c0002, 0x06000010, 0x05810112, 0x00800758, - 0x0700c0d1, 0x0379ff0c, 0x070000ff, 0x028000a1, - 0x0204a051, 0x06780043, 0x070000f0, 0x037c00ff, - 0x06000010, 0x068181bf, 0x072d6000, 0x02948734, - 0x050fb056, 0x044880e6, 0x04818010, 0x060ff0d0, - 0x0179feff, 0x0700ffff, 0x057dfeff, 0x0700ffff, - 0x05810730, 0x0349c0e4, 0x06818173, 0x013e4000, - 0x070c0000, 0x07f00000, 0x0349c0e4, 0x06818173, - 0x070ff093, 0x045a0201, 0x070ff093, 0x045c0401, - 0x0781812e, 0x02046092, 0x04002046, 0x060ff002, - 0x045c0401, 0x0703a0ff, 0x04600202, 0x00540401, - 0x0782813c, 0x04500425, 0x070060ff, 0x0730ffff, - 0x0700000f, 0x0742000f, 0x05810200, 0x05a00718, - 0x0648a002, 0x0781813f, 0x00047089, 0x070ff047, - 0x045c0443, 0x077800ff, 0x07f00000, 0x068181fe, - 0x07780047, 0x0500e000, 0x0681871f, 0x070ff006, - 0x0086016d, 0x0179fe47, 0x0700000f, 0x010480ff, - 0x056c7048, 0x06818158, 0x007a0d4a, 0x04003801, - 0x0220f001, 0x01800165, 0x07608e48, 0x034a60ff, - 0x0700f0ff, 0x074b88ff, 0x037000ff, 0x07000600, - 0x05500448, 0x074d00ff, 0x045a044a, 0x0304a0ff, - 0x070ff00f, 0x01540406, 0x0482016d, 0x04950175, - 0x05a0024d, 0x03868178, 0x0134bfff, 0x070fffff, - 0x0104102e, 0x050fd041, 0x0080017a, 0x04950173, - 0x05a0024d, 0x00860173, 0x0202f00e, 0x052e4030, - 0x040fd02f, 0x05a002ac, 0x02800010, 0x0400e02f, - 0x042e4020, 0x0202f051, 0x0004100e, 0x0004b00e, - 0x024a6c46, 0x04500423, 0x050070ff, 0x03620024, - 0x050080ff, 0x04004046, 0x0700500f, 0x03206000, - 0x05601048, 0x0700a0ff, 0x0700900a, 0x070ff005, - 0x04500446, 0x00540425, 0x048201ab, 0x07601822, - 0x050f80ff, 0x063fa032, 0x06000002, 0x03203000, - 0x01204000, 0x03205000, 0x0120b000, 0x0320c000, - 0x05601641, 0x050f80ff, 0x043fa852, 0x06000001, - 0x070ff056, 0x056c02ff, 0x050fb0ff, 0x070560ff, - 0x03079041, 0x05601041, 0x050f80ff, 0x073fa011, - 0x0600003d, 0x06780043, 0x07f00000, 0x065a007a, - 0x010880ff, 0x04a00246, 0x048d01a4, 0x0208a04a, - 0x0108b04b, 0x02386001, 0x03010000, 0x072e6300, - 0x038000e8, 0x0500d00a, 0x05500405, 0x014a68ff, - 0x070090ff, 0x0154040a, 0x0700c0ff, 0x0600a023, - 0x0500b024, 0x02206001, 0x07601822, 0x050f80ff, - 0x063fa04a, 0x06000002, 0x07f00000, 0x07601222, - 0x050f80ff, 0x043fa819, 0x06000001, 0x0600a00d, - 0x01800190, 0x06780043, 0x070000f0, 0x050010ff, - 0x027c0001, 0x07000030, 0x04810726, 0x027c0001, - 0x06000020, 0x04810726, 0x0180074b, 0x074860ff, - 0x068181e5, 0x054880ff, 0x06810010, 0x070ff056, - 0x050fb0ff, 0x044880e5, 0x058101d4, 0x044880e6, - 0x04818010, 0x008001da, 0x056c02ff, 0x050fb0ff, - 0x070560ff, 0x072e5300, 0x044880e6, 0x04818010, - 0x072d5003, 0x06780043, 0x07f00000, 0x010880ff, - 0x058d01de, 0x03386005, 0x03010000, 0x033e6000, - 0x0700000c, 0x052e5200, 0x02800010, 0x0448e0e6, - 0x04818010, 0x002fb008, 0x0448e0e6, 0x04818010, - 0x05301fff, 0x0700000f, 0x06420001, 0x05810200, - 0x05a00718, 0x0648a002, 0x068181ec, 0x062e5080, - 0x04001089, 0x040fd002, 0x040fd001, 0x02499001, - 0x0481021f, 0x070ff0d4, 0x050fd0ff, 0x045c0401, - 0x077800ff, 0x07f00000, 0x0681821f, 0x02800010, - 0x002091fe, 0x0380060a, 0x01209200, 0x0380060a, - 0x00209202, 0x0380060a, 0x03209000, 0x0380060a, - 0x01209206, 0x0380060a, 0x00209208, 0x0380060a, - 0x06780043, 0x07009000, 0x06818215, 0x00498043, - 0x04810215, 0x0648a0e5, 0x04810216, 0x027c0045, - 0x03040000, 0x05810218, 0x075c00ff, 0x07c00000, - 0x056a02ff, 0x00800215, 0x01800214, 0x06780075, - 0x06000c07, 0x0781066c, 0x00209219, 0x070fc0ff, - 0x07a005f5, 0x070fc0ff, 0x05308000, 0x0700a000, - 0x06a00607, 0x033e5000, 0x0700000c, 0x02800010, - 0x070ff003, 0x01540477, 0x0782822b, 0x07003077, - 0x060ff051, 0x010770ff, 0x07c00000, 0x04602001, - 0x050f80ff, 0x063fa029, 0x06000008, 0x02015010, - 0x02016051, 0x00017051, 0x00011051, 0x05601c41, - 0x050f80ff, 0x053fa83a, 0x06000008, 0x07f00000, - 0x05601041, 0x050f80ff, 0x01464000, 0x032fa00a, - 0x07006011, 0x05007012, 0x04008013, 0x07009014, - 0x0600a015, 0x0400b016, 0x0700c017, 0x07c00000, - 0x072d5003, 0x04601679, 0x050f80ff, 0x048d0249, - 0x063fa051, 0x0600003e, 0x07c00000, 0x06005051, - 0x0400e02c, 0x0660060e, 0x050f80ff, 0x032fa009, - 0x0379ff00, 0x070000ff, 0x076c0000, 0x0581026f, - 0x0460580e, 0x0500e0ff, 0x034000ff, 0x01540427, - 0x05820299, 0x03400005, 0x070ff005, 0x055c0428, - 0x0481029b, 0x056c0805, 0x0681824f, 0x040f8029, - 0x053fa809, 0x07000024, 0x07f00000, 0x06600649, - 0x050f80ff, 0x032fa009, 0x0379ff00, 0x070000ff, - 0x076c0000, 0x0681824f, 0x05a0029f, 0x0400e049, - 0x00800270, 0x05a0029f, 0x072d6000, 0x0460040e, - 0x050f80ff, 0x0004d0d0, 0x0379ff4d, 0x0700ffff, - 0x0104e0d1, 0x0379ff4e, 0x0700ffff, 0x062d6002, - 0x032fa009, 0x0204f0d0, 0x064b004f, 0x07780000, - 0x07ffff00, 0x045a044f, 0x070000ff, 0x00201008, - 0x04002051, 0x06003051, 0x01204000, 0x07305000, - 0x07000060, 0x03206009, 0x05007022, 0x0460040e, - 0x050f80ff, 0x032fa042, 0x07f00000, 0x04604c0e, - 0x050f80ff, 0x053fa812, 0x06000026, 0x050010d1, - 0x0460340e, 0x050f80ff, 0x012fa80a, 0x060ff00e, - 0x055c042e, 0x0481029d, 0x07c00000, 0x0400e026, - 0x0080025b, 0x0500e02e, 0x00800270, 0x0400e051, - 0x00800298, 0x0340002d, 0x050f802b, 0x053fa80a, - 0x06000016, 0x07f00000, 0x0460580e, 0x0302c0ff, - 0x034000ff, 0x01540427, 0x058202aa, 0x07c00000, - 0x0202c026, 0x018002a9, 0x013e4000, 0x03080000, - 0x07c00000, 0x077800e4, 0x07000005, 0x058183b4, - 0x022a5002, 0x069082b3, 0x0391033c, 0x030400a6, - 0x0678aae5, 0x06000051, 0x03a1878e, 0x04600e40, - 0x050f80ff, 0x032fa021, 0x07f00000, 0x074b0000, - 0x076c0600, 0x0481833e, 0x060ff002, 0x01580403, - 0x06810349, 0x05600403, 0x050f80ff, 0x073fa009, - 0x06000002, 0x0279ff04, 0x0700ffff, 0x010440d7, - 0x0179fe44, 0x0700ffff, 0x045c0404, 0x04818340, - 0x0349f044, 0x0581834b, 0x02495001, 0x05818342, - 0x060ff079, 0x045c0440, 0x068182d6, 0x0644f07a, - 0x002fb008, 0x060ff079, 0x045c0440, 0x078182db, - 0x0644f07a, 0x002fb008, 0x0648f001, 0x05818333, - 0x04601040, 0x050f80ff, 0x06480001, 0x058102fa, - 0x0448e001, 0x0681031f, 0x02460001, 0x0644f001, - 0x012fa80a, 0x04008040, 0x00491001, 0x04818337, - 0x07a00614, 0x00868337, 0x070050d8, 0x05780105, - 0x07ffff00, 0x04600e02, 0x050f80ff, 0x053fa812, - 0x06000002, 0x06a005fe, 0x062da001, 0x013e4000, - 0x06000080, 0x06930013, 0x02920013, 0x02800010, - 0x0644f001, 0x012fa80a, 0x020ef002, 0x03860321, - 0x04600840, 0x050f80ff, 0x053fa809, 0x06000002, - 0x05780105, 0x00800440, 0x017c0105, 0x05000400, - 0x05818321, 0x04602002, 0x050f80ff, 0x053fa809, - 0x06000002, 0x07f00000, 0x04602c40, 0x050f80ff, - 0x070ff005, 0x053fa809, 0x06000002, 0x055c0405, - 0x05818321, 0x070050d8, 0x05780105, 0x07ffff00, - 0x06006051, 0x04600e02, 0x050f80ff, 0x053fa812, - 0x06000002, 0x04008040, 0x0045e008, 0x06a005fe, - 0x008002f4, 0x0644f001, 0x012fa80a, 0x050020d8, - 0x04600440, 0x050f80ff, 0x073fa00a, 0x06000001, - 0x06480001, 0x0581832d, 0x05308000, 0x03040000, - 0x06009040, 0x06a00602, 0x008002f4, 0x05a0078e, - 0x03200003, 0x06600c40, 0x050f80ff, 0x032fa00a, - 0x008002f4, 0x013e4000, 0x06000080, 0x03209333, - 0x0380060a, 0x06009008, 0x05308000, 0x05004000, - 0x06a00602, 0x008002f4, 0x02209002, 0x038003a5, - 0x03209000, 0x038003a5, 0x02209004, 0x038003a5, - 0x07a003bd, 0x062da001, 0x05308000, 0x05002000, - 0x06009040, 0x06a00602, 0x018002f5, 0x02209008, - 0x038003a5, 0x013e4000, 0x06000080, 0x02495001, - 0x0481839b, 0x04600840, 0x050f80ff, 0x053fa809, - 0x06000001, 0x0721f000, 0x0349f003, 0x06810357, - 0x0245f01f, 0x06000002, 0x05601600, 0x050f80ff, - 0x012fa809, 0x06480001, 0x0681039b, 0x04481001, - 0x0481839b, 0x04602640, 0x050f80ff, 0x012fa809, - 0x020ef001, 0x0086839b, 0x029b039b, 0x050020d8, - 0x062da001, 0x06303002, 0x05000430, 0x04600440, - 0x050f80ff, 0x073fa012, 0x06000001, 0x008f836d, - 0x050040d8, 0x062da001, 0x05602000, 0x050f80ff, - 0x073fa009, 0x06000001, 0x060ff004, 0x00540402, - 0x07820399, 0x06005051, 0x06006051, 0x06602440, - 0x050f80ff, 0x063fa01a, 0x06000002, 0x07f00000, - 0x06600a40, 0x050f80ff, 0x073fa00a, 0x07000003, - 0x07f00000, 0x04600840, 0x050f80ff, 0x053fa809, - 0x06000001, 0x05487003, 0x07810393, 0x060ff002, - 0x00540404, 0x05828393, 0x05308000, 0x07005000, - 0x06009040, 0x06a00602, 0x04008004, 0x06a00607, - 0x02800013, 0x060ff040, 0x045a041f, 0x010eb0ff, - 0x06930013, 0x02920013, 0x02800010, 0x04004002, - 0x03800377, 0x07a003bd, 0x062da001, 0x05308000, - 0x07005000, 0x06009040, 0x06a00602, 0x050080d8, - 0x06a00607, 0x062da001, 0x02800013, 0x050fd009, - 0x040fd040, 0x013e4000, 0x06000080, 0x05308000, - 0x03013000, 0x06a00602, 0x010440d7, 0x0349f044, - 0x078103b2, 0x062da001, 0x038f03b2, 0x03e00000, - 0x062da001, 0x02800013, 0x0249c0e5, 0x06810013, - 0x062da001, 0x07f00000, 0x07f00000, 0x033e5000, - 0x070c0000, 0x028f03b6, 0x03800011, 0x050020d8, - 0x04600440, 0x050f80ff, 0x073fa00a, 0x06000001, - 0x07c00000, 0x002fb001, 0x038003c6, 0x012fb000, - 0x03075087, 0x068d03c7, 0x03386000, 0x03020000, - 0x04482075, 0x04810438, 0x0648a0e6, 0x04810416, - 0x0642007f, 0x05810414, 0x0340007e, 0x060ff038, - 0x0154047e, 0x01d00403, 0x0560027d, 0x050f80ff, - 0x032fa009, 0x030ef000, 0x02860667, 0x0107d000, - 0x07600a00, 0x050f80ff, 0x032fa009, 0x03681e00, - 0x04500420, 0x050f80ff, 0x073fa009, 0x0700003f, - 0x038003d1, 0x070ff07d, 0x0450047c, 0x050f80ff, - 0x002fa819, 0x078d03e7, 0x02080001, 0x00081002, - 0x0678007a, 0x04000201, 0x078103f3, 0x0448807a, - 0x068103f1, 0x0379ff03, 0x070000ff, 0x0049107a, - 0x02a18226, 0x01082003, 0x068d03f4, 0x0448b07a, - 0x058183fc, 0x0249007a, 0x078103ff, 0x07780003, - 0x03800000, 0x078103ff, 0x0338600c, 0x03010000, - 0x00800401, 0x02386004, 0x03010000, 0x072e6c00, - 0x00800438, 0x01800409, 0x0080040b, 0x0080040d, - 0x0180040f, 0x01800411, 0x00800413, 0x0727c006, - 0x028003e3, 0x0727c009, 0x028003e3, 0x0727c00c, - 0x028003e3, 0x0727c00f, 0x028003e3, 0x0727c012, - 0x028003e3, 0x038003d4, 0x052e6800, 0x00800438, - 0x044880e6, 0x0781069c, 0x052e6200, 0x070ff088, - 0x0179feff, 0x070fffff, 0x01a18642, 0x04818638, - 0x0249607a, 0x07818456, 0x060ff083, 0x03868456, - 0x033e6000, 0x07000003, 0x0448b07a, 0x04810438, - 0x06604479, 0x050f80ff, 0x032fa009, 0x03680600, - 0x076c00ff, 0x06818438, 0x04604679, 0x050f80ff, - 0x032fa009, 0x07f00000, 0x074b0000, 0x070ff000, - 0x048d0432, 0x05001099, 0x064b0001, 0x045c0401, - 0x04810438, 0x0245a07a, 0x048d0438, 0x07286000, - 0x07f00000, 0x048d043b, 0x038c03c6, 0x0648c0e6, - 0x0681845b, 0x0448e0e6, 0x05810453, 0x01209441, - 0x02490075, 0x0681821f, 0x004920e6, 0x0581044e, - 0x07a006e1, 0x05001088, 0x00700101, 0x03100000, - 0x00088001, 0x033e6000, 0x07000088, 0x038006d2, - 0x02386001, 0x07030000, 0x033e6000, 0x06000008, - 0x018004ed, 0x02799075, 0x0700050f, 0x06810010, - 0x04601679, 0x050080ff, 0x06309052, 0x0600003e, - 0x0180045f, 0x06602479, 0x050080ff, 0x05309812, - 0x07000041, 0x0648007a, 0x05810471, 0x04488075, - 0x07818471, 0x0678007a, 0x04000108, 0x0481046d, - 0x06603c79, 0x050f80ff, 0x048d0468, 0x073fa042, - 0x0600004a, 0x048d046b, 0x02086051, 0x040f8008, - 0x070fa009, 0x0049107a, 0x02a184ef, 0x00798075, - 0x06000507, 0x04818683, 0x0448b075, 0x05810478, - 0x02493075, 0x0681067f, 0x0648c0e6, 0x0781848b, - 0x048d047a, 0x02386001, 0x07030000, 0x0049107a, - 0x05810481, 0x020ef083, 0x0186048b, 0x06483075, - 0x058104eb, 0x0678007a, 0x07000035, 0x01a185f5, - 0x05308000, 0x07060000, 0x06009079, 0x06a00602, - 0x018004eb, 0x06483075, 0x0681061f, 0x058d048d, - 0x02386001, 0x07030000, 0x0444e07a, 0x0648307a, - 0x068184bf, 0x0448707a, 0x048104e6, 0x0648f07a, - 0x058104a9, 0x07a005f5, 0x04008079, 0x07a00614, - 0x028684ba, 0x0049107a, 0x068184ba, 0x04600408, - 0x050f80ff, 0x053fa809, 0x06000002, 0x05780105, - 0x07ffff00, 0x05600e7b, 0x050f80ff, 0x053fa812, - 0x06000002, 0x06a005fe, 0x018004eb, 0x0760127b, - 0x050f80ff, 0x032fa009, 0x0349c000, 0x078184b8, - 0x04601079, 0x050f80ff, 0x073fa00a, 0x0600003d, - 0x07f00000, 0x06600a79, 0x050f80ff, 0x053fa80a, - 0x06000010, 0x018004eb, 0x0046e07a, 0x008004e6, - 0x06009008, 0x05308000, 0x05004000, 0x06a00602, - 0x018004eb, 0x0760187b, 0x050f80ff, 0x032fa011, - 0x070ff000, 0x04500401, 0x030460ff, 0x060ff025, - 0x00540446, 0x048204d3, 0x030460ff, 0x052e40c0, - 0x04092046, 0x0349a0e4, 0x068184d0, 0x003e4080, - 0x0700c000, 0x018004d4, 0x003e4080, 0x05008000, - 0x018004d4, 0x04092046, 0x070ff03a, 0x038684d8, - 0x013e4000, 0x07000003, 0x05a002ac, 0x06600679, - 0x050f80ff, 0x00201007, 0x012fa80a, 0x0046047a, - 0x034630ff, 0x050020ff, 0x06003051, 0x04601079, - 0x050f80ff, 0x073fa012, 0x06000001, 0x018004eb, - 0x07a005f5, 0x05308000, 0x03020000, 0x06009079, - 0x06a00602, 0x033e6a00, 0x0700000a, 0x02079051, - 0x02800010, 0x06605079, 0x050f80ff, 0x032fa009, - 0x070ff000, 0x02860508, 0x057dfeff, 0x07ffffff, - 0x06810508, 0x050f8000, 0x012fa811, 0x0079fe02, - 0x070000ff, 0x077d66ff, 0x060000dc, 0x04818508, - 0x060ff001, 0x01868509, 0x064b0002, 0x06420002, - 0x060ff002, 0x05500400, 0x050f80ff, 0x05004084, - 0x073fa00a, 0x06000002, 0x07c00000, 0x04600201, + 0x04020051, 0x59a8d01c, 0x82697480, 0x0000ffff, + 0x0400004d, 0x8c6cdd0a, 0x0402007a, 0x42024800, + 0x0010cfd1, 0x417a4000, 0x5924d200, 0x8268d500, + 0x000000e0, 0x82697480, 0x000000e0, 0x040207e5, + 0x0201f800, 0x00101c53, 0x59a8d21b, 0x8268dd00, + 0x00000004, 0x8c68d504, 0x040207de, 0x406e5800, + 0x4200d000, 0x00000003, 0x0201f800, 0x00101c82, + 0x0401f076, 0x59a8d016, 0x8068d1c0, 0x04000799, + 0x0401f072, 0x599cd018, 0x8c68d516, 0x04000043, + 0x599cd017, 0x8c68d50a, 0x04020004, 0x59a8d006, + 0x8c68d51c, 0x04000799, 0x4200b000, 0x000007f0, + 0x417a8800, 0x0401f004, 0x81468800, 0x8058b040, + 0x04000792, 0x0201f800, 0x001046de, 0x80c589c0, + 0x040007fa, 0x5934d200, 0x8c68d51a, 0x040007f7, + 0x0401f05a, 0x0401f059, 0x0201f800, 0x001050f0, + 0x80c589c0, 0x0400003e, 0x59c4d006, 0x8468d534, + 0x486b8806, 0x0201f800, 0x001071f9, 0x0401f7b1, + 0x0201f800, 0x00104965, 0x40c50000, 0x80c589c0, + 0x040207ac, 0x4202d800, 0x00000003, 0x0201f800, + 0x00100430, 0x4080d000, 0x0201f800, 0x0010155c, + 0x0401f042, 0x8c70e516, 0x04020005, 0x59a8d01c, + 0x82697480, 0x0000ffff, 0x04000034, 0x59a8d01d, + 0x8068d1c0, 0x0402079b, 0x0201f800, 0x0010c0ed, + 0x80c57040, 0x04000003, 0x59a8da1b, 0x0401f752, + 0x0201f800, 0x00102101, 0x80c57040, 0x04000791, + 0x59a8da1b, 0x0401f74c, 0x0201f800, 0x00104cf9, + 0x80c589c0, 0x040007bb, 0x0401f028, 0x0201f800, + 0x00103a8f, 0x0401f781, 0x0201f800, 0x001050f0, + 0x80c589c0, 0x0402076a, 0x59a8d21b, 0x486b541b, + 0x0401f767, 0x406e4000, 0x4200d000, 0x000007fe, + 0x4200d800, 0x00000004, 0x0401f771, 0x59c4d006, + 0x8268d500, 0xffffff0f, 0x486b8806, 0x0401f7c2, + 0x0201f800, 0x0010c0ed, 0x4200d000, 0x00000010, + 0x80c57040, 0x04000002, 0x4080d000, 0x0201f800, + 0x00101f62, 0x0401f77e, 0x8c6cdd04, 0x040207cc, + 0x826cd500, 0x00004000, 0x8c6cdd1c, 0x040207c8, + 0x406a5800, 0x0401f787, 0x589d0000, 0x809d3800, + 0x1c01f000, 0x59c4d00d, 0x8c68d51e, 0x04020004, + 0x59c4d005, 0x8c68d500, 0x0400000c, 0x0201f800, + 0x00100448, 0x0201f800, 0x001050f0, 0x80c589c0, + 0x0400000f, 0x0201f800, 0x00105051, 0x816d7040, + 0x040000a6, 0x0401f12f, 0x4a035043, 0x00000001, + 0x4202d800, 0x00000004, 0x4200d000, 0x0010cf8d, + 0x0201f800, 0x0010bfb2, 0x0401f126, 0x0201f800, + 0x0010511b, 0x80c589c0, 0x0402008e, 0x0201f800, + 0x00103ae4, 0x59c4d0a4, 0x8268d500, 0x0000000f, + 0x82697480, 0x00000006, 0x83f17500, 0x03000000, + 0x040007e9, 0x0201f800, 0x00106671, 0x59c4d0a3, + 0x8468d528, 0x486b88a3, 0x59a8d060, 0x8068d1c0, + 0x040000d9, 0x59a8e075, 0x8270d500, 0x00001f00, + 0x8068d910, 0x826d7480, 0x00000002, 0x83f17500, + 0x03000000, 0x040000bd, 0x59a8d015, 0x8468d546, + 0x486b5015, 0x0201f800, 0x001050fd, 0x80c589c0, + 0x040000bd, 0x59c4d006, 0x8268d540, 0x44000001, + 0x486b8806, 0x59c4d006, 0x8268d500, 0xffffff0f, + 0x486b8806, 0x497b9005, 0x4178d000, 0x0201f800, + 0x00104e35, 0x4a038802, 0x0000ffff, 0x4a0378e4, + 0x00003000, 0x4200d000, 0x0010cb9c, 0x5868d400, + 0x8c68d508, 0x04020003, 0x4a0378e4, 0x000c0000, + 0x4200d000, 0x0010ce66, 0x0201f800, 0x0010bfb2, + 0x59a8d00f, 0x4200d800, 0x00000003, 0x0201f800, + 0x00106e66, 0x4200d000, 0x00008010, 0x59a8d809, + 0x0201f800, 0x001039aa, 0x59c8d015, 0x8468d548, + 0x486b9015, 0x0201f800, 0x00101820, 0x59a8d008, + 0x8468d500, 0x486b5008, 0x850e1d0a, 0x0201f800, + 0x00110a62, 0x0201f800, 0x001050f0, 0x80c589c0, + 0x04020003, 0x8d0e1d06, 0x040200a0, 0x0201f800, + 0x00104965, 0x80c589c0, 0x04000092, 0x59c4d002, + 0x8468d50c, 0x486b8802, 0x497b501d, 0x497b501c, + 0x497b5057, 0x0201f800, 0x001050f0, 0x80c589c0, + 0x0400007d, 0x497b521b, 0x0201f800, 0x00101608, + 0x59a8d01f, 0x82680500, 0xffff0000, 0x80c4d540, + 0x486b501f, 0x599cd017, 0x8c68d50a, 0x04000004, + 0x59a8d21b, 0x8468d544, 0x486b521b, 0x4200d000, + 0x00000005, 0x0201f800, 0x001074c0, 0x497b501d, + 0x497b5016, 0x4a035017, 0x0000ffff, 0x4a0378e4, + 0x080000c0, 0x4202d800, 0x00000002, 0x0201f800, + 0x001050f0, 0x80c589c0, 0x04020007, 0x59a8d21b, + 0x8268d500, 0x0000000c, 0x82697480, 0x00000004, + 0x04000769, 0x0201f800, 0x00101e2e, 0x0401f095, + 0x5994d02d, 0x42000000, 0x001041ea, 0x80697480, + 0x04000042, 0x59c4d006, 0x8268d540, 0x000000c0, + 0x486b8806, 0x0401f76a, 0x59a8d011, 0x82697480, + 0x00000009, 0x04020758, 0x497b500f, 0x0201f800, + 0x0010c0ca, 0x42024800, 0x0010cfd1, 0x497a4805, + 0x0401f00a, 0x5924d200, 0x8c68d500, 0x04000004, + 0x8268d500, 0xffffd815, 0x486a4a00, 0x83264c00, + 0x0000000b, 0x8058b040, 0x8058b1c0, 0x040207f6, + 0x4a038805, 0x000000f0, 0x0201f800, 0x0010510c, + 0x80c589c0, 0x0400004b, 0x59c4d006, 0x8268d540, + 0x000000f1, 0x486b8806, 0x59c4d006, 0x8268d500, + 0xbbffffff, 0x486b8806, 0x0201f800, 0x00106671, + 0x0201f800, 0x00106e71, 0x59a8d878, 0x826d7480, + 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, + 0x82b97580, 0x0c000000, 0x0402004d, 0x4a038893, + 0x00000001, 0x4200d000, 0x0010ce6f, 0x0201f800, + 0x0010bfb2, 0x497b5056, 0x4200d000, 0x00008030, + 0x4178d800, 0x0401f773, 0x5994d02c, 0x8068d1c0, + 0x0402072b, 0x0401f7bc, 0x806cd840, 0x8270d500, + 0x00ff0000, 0x806c00d0, 0x8068d540, 0x486b9035, + 0x0401f73e, 0x59c4d006, 0x8268d540, 0x440000f1, + 0x0401f748, 0x59a8d01f, 0x8268d500, 0xffff0000, + 0x486b501f, 0x0201f800, 0x00101608, 0x48c78880, + 0x0401f785, 0x0201f800, 0x00104126, 0x0401f035, + 0x0201f800, 0x001050f0, 0x80c589c0, 0x04000011, + 0x59a8d018, 0x8068d1c0, 0x0402076c, 0x0201f800, + 0x00109be2, 0x0401f769, 0x4a035056, 0x00000001, + 0x850e1d0e, 0x0201f800, 0x00103c3f, 0x0401f025, + 0x59c4d006, 0x8268d540, 0x440000f1, 0x0401f7ba, + 0x0201f800, 0x00109be2, 0x59a8d21b, 0x8c68d506, + 0x0402075a, 0x59a8d018, 0x8068d1c0, 0x04020007, + 0x59a8d41b, 0x8c68d508, 0x04000754, 0x82697480, + 0x0000ffff, 0x04000751, 0x4a03541b, 0x0000ffff, + 0x0201f800, 0x0010425b, 0x0401f74c, 0x59aa6879, + 0x5934d400, 0x82697480, 0x00000404, 0x04020007, + 0x8c6cdd0c, 0x040006d8, 0x826cd500, 0x00000003, + 0x040007ad, 0x0401f003, 0x0201f800, 0x0010b87c, + 0x1c01f000, 0x809d3840, 0x48a13800, 0x829d3c80, + 0x00000005, 0x409d4000, 0x829d3c80, 0x00000007, + 0x48813800, 0x48853801, 0x48893802, 0x488d3803, + 0x48913804, 0x48953805, 0x48993806, 0x4200e000, + 0x00000001, 0x48714000, 0x4178e000, 0x48714003, + 0x48714004, 0x48594001, 0x49214002, 0x82691d00, + 0x00ffffff, 0x826d3500, 0x00ffffff, 0x828cd500, + 0x00ff0000, 0x82697480, 0x00ff0000, 0x0400005e, + 0x41792800, 0x4200b000, 0x000007f0, 0x41ad0800, + 0x40951000, 0x828d2500, 0x00ffff00, 0x0401f00f, + 0x809121c0, 0x04000032, 0x59a8d00f, 0x8268d500, + 0x00ffff00, 0x40900000, 0x80697480, 0x0400002c, + 0x4178e000, 0x48714004, 0x80850800, 0x80891000, + 0x8058b040, 0x04000021, 0x58850000, 0x808101c0, + 0x04000036, 0x5880d212, 0x8268d500, 0x0000ff00, + 0x040207ec, 0x5880d002, 0x8268d500, 0x00ffffff, + 0x408c0000, 0x80697480, 0x040207f0, 0x4098d000, + 0x0201f800, 0x00101fc8, 0x5880d813, 0x806cd130, + 0x41200000, 0x80697480, 0x040207e8, 0x4200e000, + 0x00000001, 0x48714004, 0x5924d005, 0x826c0500, + 0x00ffffff, 0x80697480, 0x04000004, 0x812000f0, + 0x8068d540, 0x48690013, 0x58a0d004, 0x8068d1c0, + 0x04000020, 0x408a8800, 0x0401f048, 0x5880d002, + 0x8268d500, 0x000000ff, 0x828c0500, 0x000000ff, + 0x80697480, 0x040207d1, 0x4098d000, 0x0201f800, + 0x00101fc8, 0x5880d813, 0x806cd130, 0x41200000, + 0x80697480, 0x040207c9, 0x4200d000, 0x00000001, + 0x48694004, 0x0401f7e1, 0x809529c0, 0x040207c3, + 0x58a0e003, 0x8070e1c0, 0x040207c0, 0x40892800, + 0x4200d000, 0x00000001, 0x48694003, 0x0401f7bb, + 0x58a0e003, 0x8070e1c0, 0x04000018, 0x40968800, + 0x0401f026, 0x828d7480, 0x00fffffb, 0x040007a1, + 0x040017a0, 0x828d7480, 0x00ffffff, 0x0400079d, + 0x828d7480, 0x00fffffd, 0x0400001a, 0x828d7480, + 0x00fffffd, 0x83f17500, 0x03000000, 0x0400000c, + 0x828d7480, 0x00fffffc, 0x0400000f, 0x4178d000, + 0x48694000, 0x0401f011, 0x488fc857, 0x489bc857, + 0x58a0d003, 0x48694000, 0x0401f00c, 0x828d7480, + 0x00fffffe, 0x040207f6, 0x42028800, 0x000007fe, + 0x0401f006, 0x42028800, 0x000007fc, 0x0401f003, + 0x42028800, 0x000007fd, 0x58a24002, 0x58a0b001, + 0x58a18800, 0x589d3006, 0x589d2805, 0x589d2004, + 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x0000000c, 0x589d4000, 0x809d3800, + 0x1c01f000, 0x486bc857, 0x0401ff4f, 0x1c01f000, + 0x00000000, 0x00000001, 0x00000002, 0x00000003, + 0x00000004, 0x00000005, 0x00000006, 0x00000007, + 0x00000008, 0x00000009, 0x0000000a, 0x0000000b, + 0x0000000c, 0x0000000d, 0x0000000e, 0x0000000f, + 0x0aba4754, 0x02800004, 0x00000000, 0x0000c000, + 0x000008a0, 0x073fca5a, 0x0705a5a5, 0x01928009, + 0x070ff0e1, 0x03800006, 0x04958010, 0x05308000, + 0x05008000, 0x0600902f, 0x06a00602, 0x0202f051, + 0x042e4020, 0x018f02af, 0x033e5000, 0x03020000, + 0x068d0020, 0x06930516, 0x03920518, 0x050fb056, + 0x040010e6, 0x002fb008, 0x060ff0e6, 0x00580401, + 0x054880ff, 0x0781001e, 0x038c03c6, 0x038a03c5, + 0x078b03c3, 0x048e8010, 0x0678aae5, 0x06000051, + 0x078181c9, 0x040010e6, 0x0448e0e6, 0x04818010, + 0x002fb008, 0x0448e0e6, 0x04818010, 0x060ff0e6, + 0x00580401, 0x054880ff, 0x04818010, 0x022a5001, + 0x030430d4, 0x06780043, 0x030e0000, 0x030450ff, + 0x06780043, 0x03019000, 0x03a1820a, 0x0781873a, + 0x027c0045, 0x03020000, 0x06810040, 0x027c0045, + 0x03040000, 0x04810116, 0x027c0045, 0x03080000, + 0x048107ab, 0x04908040, 0x00910738, 0x010410a6, + 0x0379ff41, 0x037fffff, 0x072d6000, 0x07601441, + 0x050f80ff, 0x032fa009, 0x07f00000, 0x05600400, + 0x050f80ff, 0x056c04ff, 0x0481075d, 0x073fa009, + 0x06000001, 0x0279ff02, 0x0700ffff, 0x070ff0d1, + 0x0179feff, 0x0700ffff, 0x045c0402, 0x0681875d, + 0x060ff0d0, 0x0179feff, 0x0700ffff, 0x050010ff, + 0x057dfeff, 0x0700ffff, 0x05810730, 0x05602600, 0x050f80ff, 0x073fa009, 0x06000001, 0x0079fe02, - 0x070000ff, 0x077d72ff, 0x070000dd, 0x04818508, - 0x064b0002, 0x06420002, 0x06000001, 0x02800502, - 0x0605004c, 0x0280051a, 0x06930516, 0x06a005fb, - 0x054bc450, 0x0781051d, 0x03d0051e, 0x0380051d, - 0x0380052e, 0x03800530, 0x028005ba, 0x028005cd, - 0x0280053d, 0x03800530, 0x03800584, 0x0380052e, - 0x0380052e, 0x038005d1, 0x0380052e, 0x028005d5, - 0x028005ea, 0x038005a6, 0x0380052e, 0x0380052e, - 0x0320952e, 0x0380060a, 0x073c3fff, 0x0700000f, - 0x0379ff50, 0x070fffff, 0x060ff079, 0x055c0450, - 0x078105ca, 0x002fb008, 0x060ff079, 0x055c0450, - 0x078105c9, 0x07a005ed, 0x028005c2, 0x0179fe50, - 0x070fffff, 0x070050ff, 0x060ff079, 0x055c0405, - 0x07810547, 0x002fb008, 0x060ff079, 0x055c0405, - 0x058185c6, 0x073c3fff, 0x0700000f, 0x070ff087, - 0x017980ff, 0x06000507, 0x05818556, 0x02203040, - 0x05002087, 0x0049d002, 0x05818556, 0x002fb008, - 0x07006087, 0x002fb008, 0x0149d006, 0x0781057e, - 0x0693055b, 0x01257000, 0x052e4003, 0x072e5030, - 0x0304c050, 0x02400057, 0x06740057, 0x06000004, - 0x06820016, 0x0049107a, 0x02a184ef, 0x04002083, - 0x07003084, 0x04004085, 0x06602479, 0x050f80ff, - 0x063fa01a, 0x06000001, 0x07a005f5, 0x06a006ea, - 0x033e6a00, 0x0700000a, 0x062e5020, 0x05a00718, - 0x02798102, 0x070000ff, 0x007c8002, 0x07000055, - 0x0781057b, 0x072e50c0, 0x0648a002, 0x0781057b, - 0x068d0576, 0x03386006, 0x03010000, 0x033e6000, - 0x0700000c, 0x003e4002, 0x07000a00, 0x018004ed, - 0x07420003, 0x0581854e, 0x00798002, 0x06000507, - 0x05818556, 0x0380055f, 0x0793058b, 0x01257000, - 0x073c3fff, 0x0700000f, 0x052e4003, 0x072e5030, - 0x0304c050, 0x067800e6, 0x07000041, 0x07810590, - 0x07a006f3, 0x0481859b, 0x002fb008, 0x067800e6, - 0x07000041, 0x07810596, 0x07a006f3, 0x0481859b, - 0x062e5020, 0x003e4002, 0x07000a00, 0x03e00000, - 0x02800010, 0x06740057, 0x07000018, 0x06820016, - 0x06a006ea, 0x033e6a00, 0x0700000a, 0x002fb008, - 0x06a006ea, 0x033e6a00, 0x0700000a, 0x03800596, - 0x0379ff50, 0x070fffff, 0x060ff079, 0x055c0450, - 0x058185ac, 0x0245507a, 0x002fb008, 0x060ff079, - 0x055c0450, 0x058185b1, 0x0245507a, 0x002fb008, - 0x05601050, 0x050f80ff, 0x012fa809, 0x02455001, - 0x05601050, 0x050f80ff, 0x012fa80a, 0x038005c3, - 0x059585ca, 0x0179fe50, 0x070fffff, 0x045c042f, - 0x058185ca, 0x0202f051, 0x042e4020, 0x038005c3, - 0x002fb008, 0x003e4002, 0x07000a00, 0x02800016, - 0x059385c9, 0x062e5020, 0x042e4002, 0x002fb008, - 0x013e4000, 0x05000e00, 0x02800016, 0x0179fe50, - 0x070fffff, 0x010210ff, 0x02800016, 0x0179fe50, - 0x070fffff, 0x050340ff, 0x038005c3, 0x0179fe50, - 0x070fffff, 0x0102e0ff, 0x05602a2e, 0x050f80ff, - 0x05222000, 0x07223000, 0x05224000, 0x07225000, - 0x07226000, 0x05227000, 0x05228000, 0x07229000, - 0x0722a000, 0x0522b000, 0x063fa051, 0x07000011, - 0x0202c026, 0x0522d000, 0x052e400c, 0x02800016, - 0x030430d4, 0x062e5008, 0x008001cd, 0x05601050, - 0x050f80ff, 0x032fa009, 0x03460000, 0x028005f8, - 0x0246007a, 0x0045207a, 0x038005f6, 0x0246007a, - 0x0600007a, 0x04601079, 0x050f80ff, 0x032fa00a, - 0x07c00000, 0x009285fb, 0x070500e1, 0x07c00000, - 0x0245f008, 0x078405ff, 0x020e0008, 0x07c00000, - 0x070ff009, 0x065a0008, 0x06840604, 0x020e0008, - 0x07c00000, 0x06840607, 0x020e0008, 0x07c00000, - 0x05308000, 0x0500d000, 0x06a00602, 0x07a0060f, - 0x02800010, 0x052e4300, 0x072e500c, 0x073c3fff, - 0x0700000f, 0x07c00000, 0x06602408, 0x050f80ff, - 0x032fa011, 0x076a0000, 0x0581861d, 0x066a0001, - 0x0781061d, 0x06006051, 0x07c00000, 0x02206001, - 0x07c00000, 0x0678007a, 0x07000021, 0x05818627, - 0x0049107a, 0x07810627, 0x073c3fff, 0x0700000f, - 0x0180048d, 0x040fd079, 0x0648307a, 0x0681062c, - 0x04a00785, 0x02800631, 0x06a005f2, 0x05308000, - 0x05001000, 0x06009079, 0x06a00602, 0x068d0631, - 0x033e6a00, 0x0600000e, 0x02079051, 0x03386006, - 0x03010000, 0x02800010, 0x0648307a, 0x0781063c, - 0x04a00785, 0x038006d2, 0x06a005f2, 0x05308000, - 0x05001000, 0x06009079, 0x06a00602, 0x038006d2, - 0x050010ff, 0x0448b07a, 0x07810650, 0x0049107a, - 0x07810650, 0x078d0647, 0x06604479, 0x050f80ff, - 0x032fa009, 0x03680600, 0x056c02ff, 0x05818650, - 0x046c1001, 0x06810652, 0x056a02ff, 0x07c00000, - 0x07a00655, 0x075c00ff, 0x07c00000, 0x078d0655, - 0x060ff07c, 0x070ff07d, 0x070ff07e, 0x060ff07f, - 0x060ff080, 0x070ff081, 0x070ff082, 0x060ff083, - 0x070ff084, 0x060ff085, 0x0338600c, 0x03010000, - 0x008a8662, 0x078d0663, 0x03386000, 0x03020000, - 0x07c00000, 0x0648307a, 0x07818206, 0x07a005f5, - 0x02209667, 0x0380060a, 0x04002089, 0x04780102, - 0x07f00000, 0x05001088, 0x04740101, 0x03100000, - 0x04780101, 0x07f00000, 0x060ff002, 0x045c0401, - 0x05818681, 0x00088001, 0x033e6000, 0x070000c0, - 0x0220901a, 0x05308000, 0x01012000, 0x06a00602, - 0x028006ce, 0x0220967f, 0x0380060a, 0x03209681, - 0x0180021d, 0x040fd075, 0x040fd07a, 0x040fd079, - 0x0648307a, 0x0681068c, 0x06780075, 0x06000007, - 0x04818697, 0x04a00785, 0x06486075, 0x06818204, - 0x02490075, 0x06818219, 0x04487075, 0x0581869f, - 0x0448b07a, 0x07810696, 0x00492075, 0x048186b0, - 0x028006a8, 0x05308000, 0x03010000, 0x06009079, - 0x06a00602, 0x02800010, 0x0448e0e6, 0x06818438, - 0x00800202, 0x0648307a, 0x048186ce, 0x05308000, - 0x0500e000, 0x06009079, 0x06a00602, 0x04008089, - 0x06a00607, 0x028006ce, 0x06a005f2, 0x05308000, - 0x0700f000, 0x06009079, 0x07000088, 0x07a006b7, - 0x06a00602, 0x02800010, 0x05308000, 0x01011000, - 0x06009079, 0x07000088, 0x07a006b7, 0x06a00602, - 0x02800010, 0x03386000, 0x07030000, 0x07f00000, - 0x068d06ba, 0x033e6a00, 0x0600000e, 0x02079051, - 0x0448b075, 0x078106c5, 0x02493075, 0x078106c5, - 0x05301005, 0x03010000, 0x028006c7, 0x05301006, - 0x03010000, 0x05002087, 0x06485002, 0x048186c7, - 0x0744c000, 0x01088000, 0x02086001, 0x07c00000, - 0x05001088, 0x07a006e1, 0x0644c001, 0x00088001, - 0x033e6a00, 0x0600000e, 0x004920e6, 0x058186d7, - 0x02079051, 0x078d06d7, 0x060ff089, 0x034990ff, - 0x078106de, 0x03386005, 0x03010000, 0x02800010, - 0x03386006, 0x03010000, 0x02800010, 0x078d06e1, - 0x03386000, 0x07030000, 0x07f00000, 0x068d06e5, - 0x070ff087, 0x074850ff, 0x048186e6, 0x07c00000, - 0x068d06ea, 0x02386001, 0x07030000, 0x07f00000, - 0x078d06ee, 0x070ff087, 0x074850ff, 0x048186ef, - 0x07c00000, 0x05002087, 0x0049d002, 0x06818702, - 0x002fb008, 0x067800e6, 0x07000041, 0x002fb008, - 0x06818702, 0x05a00718, 0x0448e002, 0x05810705, - 0x0648a002, 0x0781870f, 0x06486002, 0x05810709, - 0x02400057, 0x056a02ff, 0x07c00000, 0x05a00718, - 0x06788102, 0x06000004, 0x06818702, 0x04002089, - 0x070ff0d4, 0x045c0402, 0x077800ff, 0x07f00000, - 0x06818702, 0x00202010, 0x008c0702, 0x07f00000, - 0x06420002, 0x06818710, 0x06a006ea, 0x033e6a00, - 0x0700000a, 0x07c00000, 0x07f00000, 0x060ff0a2, - 0x045a0202, 0x060ff0a2, 0x045c0402, 0x06818719, - 0x07c00000, 0x05a002ac, 0x03495047, 0x05810724, - 0x0320901d, 0x01800781, 0x0220901f, 0x01800781, - 0x014980e4, 0x04818010, 0x013e4000, 0x07003000, - 0x05600e35, 0x050f80ff, 0x04a00883, 0x01208003, - 0x06a00607, 0x0180074b, 0x066c0045, 0x0481079e, - 0x03209009, 0x01800781, 0x03209011, 0x01800781, - 0x02209007, 0x01800781, 0x03209003, 0x01800781, - 0x00497043, 0x07818736, 0x00494043, 0x04810740, - 0x02209001, 0x01800781, 0x072d6000, 0x027c0045, - 0x03080000, 0x07818730, 0x060ff0d0, 0x0179feff, - 0x0700ffff, 0x057dfeff, 0x0700ffff, 0x058107ac, - 0x01800730, 0x0220900d, 0x01800781, 0x0320900f, - 0x01800781, 0x03493000, 0x04810754, 0x027c0045, - 0x070a0000, 0x0581075f, 0x0220900b, 0x01800781, - 0x0320900c, 0x01800759, 0x02209013, 0x05308000, - 0x01012000, 0x06a00602, 0x008001da, 0x03209005, - 0x01800781, 0x072e500c, 0x00208002, 0x06a00607, - 0x02800010, 0x02209015, 0x01800781, 0x05308000, - 0x05007000, 0x070090d1, 0x0379ff09, 0x0700ffff, - 0x06a00602, 0x03209017, 0x01800781, 0x033e5000, - 0x06000080, 0x02209019, 0x01800781, 0x033e5000, - 0x06000080, 0x060ff0d0, 0x0179feff, 0x0700ffff, - 0x057dfeff, 0x0700ffff, 0x04818010, 0x02400058, - 0x00642058, 0x06820010, 0x033e5000, 0x06000080, - 0x04058051, 0x0320901b, 0x01800781, 0x05308000, - 0x01012000, 0x06a00602, 0x008001cd, 0x05a002ac, - 0x070ff02e, 0x045c0479, 0x0581078d, 0x05308000, - 0x05008000, 0x06009079, 0x06a00602, 0x07c00000, - 0x034900e4, 0x06818798, 0x013e4000, 0x070000c0, - 0x07f00000, 0x034900e4, 0x07818796, 0x07c00000, - 0x013e4000, 0x06000080, 0x07f00000, 0x07f00000, - 0x07f00000, 0x034900e4, 0x05810790, 0x00800798, - 0x072d6000, 0x070ff0d1, 0x0179feff, 0x0700ffff, - 0x017c1cff, 0x070000fc, 0x0681875d, 0x079087a5, - 0x00910738, 0x010410a6, 0x0379ff41, 0x037fffff, - 0x03800066, 0x072d6000, 0x05a00863, 0x020ef004, - 0x01860765, 0x04602604, 0x050f80ff, 0x032fa009, - 0x060ff0d0, 0x0179feff, 0x0700ffff, 0x055c0400, - 0x07818763, 0x06600004, 0x050f80ff, 0x032fa009, - 0x07f00000, 0x074b0000, 0x05002000, 0x0769ff00, - 0x01640800, 0x05820765, 0x01640e00, 0x07828765, - 0x070ff036, 0x045c0404, 0x068187ce, 0x050f8030, - 0x032fa009, 0x0379ff00, 0x0700ffff, 0x070ff0d1, - 0x0179feff, 0x0700ffff, 0x055c0400, 0x05810763, - 0x04482034, 0x0481077c, 0x06483034, 0x0681877c, - 0x070ff0d4, 0x077800ff, 0x070000f0, 0x037c00ff, - 0x06000010, 0x058107ff, 0x024900e5, 0x068187df, - 0x033e5000, 0x070000c0, 0x07f00000, 0x024900e5, - 0x058107e2, 0x033e5000, 0x06000080, 0x02800010, - 0x04601c04, 0x050f80ff, 0x053fa809, 0x06000020, - 0x030ef041, 0x0086076d, 0x062d6002, 0x05602c41, - 0x050f80ff, 0x012fa809, 0x060ff0d0, 0x074b00ff, - 0x045c0401, 0x068187fd, 0x062d6001, 0x07602e41, - 0x050f80ff, 0x053fa809, 0x06000001, 0x070ff0d1, - 0x054b80ff, 0x074b0003, 0x055c0403, 0x068187fd, - 0x033e5000, 0x06000080, 0x01800895, 0x07600041, - 0x008007e3, 0x024900e5, 0x07818806, 0x033e5000, - 0x070000c0, 0x07f00000, 0x024900e5, 0x05810809, - 0x033e5000, 0x06000080, 0x02800010, 0x05a0084e, - 0x030ef041, 0x01860771, 0x04058051, 0x072d6000, - 0x07601241, 0x050f80ff, 0x012fa809, 0x0600a0d0, - 0x0500b0d1, 0x062d6001, 0x07f00000, 0x07f00000, - 0x0600c0d0, 0x0500d0d1, 0x062d6002, 0x0279ff0d, - 0x07ff0000, 0x044d800d, 0x060ff0d0, 0x074b00ff, - 0x065a000d, 0x06601401, 0x050f80ff, 0x073fa022, - 0x07000005, 0x0079fe0d, 0x070000ff, 0x050020ff, - 0x05602c41, 0x050f80ff, 0x073fa00a, 0x06000001, - 0x020ef004, 0x0186084b, 0x04601c04, 0x050f80ff, - 0x053fa809, 0x06000001, 0x050f80ff, 0x053fa80a, - 0x06000020, 0x07f00000, 0x07602e41, 0x050f80ff, - 0x073fa009, 0x06000001, 0x0279ff02, 0x070000ff, - 0x0678000d, 0x0700ff00, 0x065a0002, 0x07602e41, - 0x050f80ff, 0x073fa00a, 0x06000001, 0x07f00000, - 0x07600041, 0x050f80ff, 0x053fa80a, 0x06000001, - 0x07f00000, 0x07601441, 0x050f80ff, 0x073fa00a, - 0x06000002, 0x033e5000, 0x06000080, 0x01800895, - 0x040f8032, 0x073fa011, 0x06000001, 0x060ff002, - 0x055c0403, 0x07818856, 0x00041051, 0x07c00000, - 0x04600402, 0x04500432, 0x050f80ff, 0x053fa809, - 0x06000020, 0x07f00000, 0x00400402, 0x01680eff, - 0x070030ff, 0x040f8032, 0x053fa80a, 0x06000001, - 0x07c00000, 0x05004036, 0x060000d0, 0x0179fe00, - 0x0700ffff, 0x057dfeff, 0x0700ffff, 0x05810882, - 0x070000d1, 0x0379ff00, 0x0700ffff, 0x06005051, - 0x060ff031, 0x05500405, 0x050f80ff, 0x073fa009, - 0x06000002, 0x020ef004, 0x0086087c, 0x04600404, - 0x050f80ff, 0x012fa809, 0x0079fe01, 0x0700ffff, - 0x055c0400, 0x05810882, 0x01400405, 0x070050ff, - 0x057de0ff, 0x06000007, 0x0681886e, 0x04004051, - 0x07c00000, 0x072d6000, 0x07f00000, 0x07f00000, - 0x000110d0, 0x010120d1, 0x062d6001, 0x07f00000, - 0x07f00000, 0x020130d0, 0x010140d1, 0x062d6002, - 0x010170d4, 0x07f00000, 0x020150d0, 0x030160d1, - 0x053fa83a, 0x06000008, 0x07c00000, 0x07600c41, - 0x050f80ff, 0x01202003, 0x073fa00a, 0x06000001, - 0x07f00000, 0x05601041, 0x050f80ff, 0x032fa069, - 0x03800066, 0xdcdab525, 0x02800004, 0x00000000, - 0x00008000, 0x00000685, 0x040f801f, 0x012fa8c9, - 0x040f801f, 0x063fa091, 0x06000010, 0x03200005, - 0x07420000, 0x050fb000, 0x040f801f, 0x073fa011, - 0x06000038, 0x040f801f, 0x053fa859, 0x0700003a, - 0x050fe000, 0x0581800a, 0x0684004a, 0x04958019, - 0x030e0011, 0x072e4200, 0x03800014, 0x0291001f, - 0x050010c0, 0x04482001, 0x0781811e, 0x06483001, - 0x078181a6, 0x02920029, 0x068b0029, 0x008a01ab, - 0x050010c0, 0x06780001, 0x050007c0, 0x068182fe, - 0x06780001, 0x0500f800, 0x05818348, 0x0291003e, - 0x050fe02b, 0x0286003e, 0x03681e1d, 0x03d0002e, - 0x0380035c, 0x0280003e, 0x0280003e, 0x0280003e, - 0x0280003e, 0x0280038a, 0x0280003e, 0x0280003e, - 0x0380039f, 0x0280003e, 0x0280003e, 0x0280003e, - 0x0280003e, 0x0280003e, 0x0280003e, 0x0280003e, - 0x039200cf, 0x040fe031, 0x0286004a, 0x06000013, - 0x050fb000, 0x066c0073, 0x048104ae, 0x014920e4, - 0x0481804a, 0x03400000, 0x076c0a00, 0x05818042, - 0x0696004c, 0x03b900f3, 0x05908014, 0x010170e1, - 0x07780017, 0x03e00000, 0x068100b5, 0x050010ff, - 0x0179fe17, 0x031fffff, 0x070000ff, 0x05600800, - 0x050f80ff, 0x073fa009, 0x06000001, 0x06780002, - 0x02800040, 0x037c00ff, 0x03800000, 0x0681006b, - 0x0249f002, 0x068100ce, 0x0448e002, 0x0681006b, - 0x05600e00, 0x050f80ff, 0x073fa009, 0x06000001, - 0x06780002, 0x07ffff00, 0x037c00ff, 0x05000200, - 0x048180ce, 0x064bd401, 0x02d0006d, 0x038000cc, - 0x02800075, 0x0280007f, 0x02800089, 0x03800093, - 0x0280009d, 0x028000ab, 0x038000cc, 0x050fe027, - 0x00868079, 0x01028000, 0x0280007c, 0x07600027, - 0x050f80ff, 0x032fa00a, 0x01027000, 0x0340002b, - 0x028000ce, 0x040fe025, 0x00868083, 0x03026000, - 0x02800086, 0x06600025, 0x050f80ff, 0x032fa00a, - 0x03025000, 0x0340002b, 0x028000ce, 0x050fe021, - 0x0186808d, 0x01022000, 0x03800090, 0x07600021, - 0x050f80ff, 0x032fa00a, 0x01021000, 0x0340002b, - 0x028000ce, 0x040fe023, 0x00868097, 0x01024000, - 0x0380009a, 0x06600023, 0x050f80ff, 0x032fa00a, - 0x03023000, 0x0340002b, 0x028000ce, 0x05600800, - 0x050f80ff, 0x012fa839, 0x0448e001, 0x058180a9, - 0x06780004, 0x07ffff00, 0x037c00ff, 0x05000700, - 0x078100a9, 0x04a00107, 0x028000ce, 0x050fd000, - 0x028000ce, 0x040fe029, 0x018680af, 0x0302a000, - 0x038000b2, 0x06600029, 0x050f80ff, 0x032fa00a, - 0x03029000, 0x0340002b, 0x028000ce, 0x01640817, - 0x058280cc, 0x070ff017, 0x02d000b9, 0x028000c1, - 0x038000c3, 0x038000c6, 0x038000c9, 0x038000cc, - 0x038000cc, 0x038000cc, 0x038000cc, 0x03e00000, - 0x03800014, 0x059080c3, 0x030160e1, 0x028000ce, - 0x059080c6, 0x030150e1, 0x028000ce, 0x059080c9, - 0x010140e1, 0x028000ce, 0x060fc013, 0x07a0067d, - 0x03800014, 0x014940e4, 0x01a180d2, 0x0280004a, - 0x02681e0d, 0x050fb0ff, 0x04600876, 0x050f80ff, - 0x053fa809, 0x06000001, 0x05488003, 0x058180e1, - 0x0400800d, 0x0120d000, 0x013e4000, 0x05000200, - 0x06009076, 0x04002075, 0x07a00669, 0x07c00000, - 0x072e4800, 0x07000012, 0x018680e7, 0x060fc013, - 0x07c00000, 0x00012013, 0x0747f000, 0x05600800, - 0x050f80ff, 0x012fa839, 0x0249f001, 0x078100f9, - 0x01012000, 0x052e4c00, 0x07c00000, 0x050fd000, - 0x07c00000, 0x070000eb, 0x0349f000, 0x058180e8, - 0x05600800, 0x050f80ff, 0x012fa839, 0x06780004, - 0x07ffff00, 0x037c00ff, 0x07000300, 0x048180f1, - 0x0448e001, 0x048180f1, 0x0079c101, 0x07ffffff, - 0x027a4b01, 0x03800000, 0x05600800, 0x050f80ff, - 0x012fa80a, 0x07f00000, 0x06601807, 0x070030ff, - 0x050f80ff, 0x012fa809, 0x050f8003, 0x032fa00a, - 0x040fe001, 0x01860114, 0x04600201, 0x050f80ff, - 0x032fa00a, 0x07c00000, 0x050fe030, 0x02868119, - 0x07030000, 0x05031000, 0x0180011d, 0x07600030, - 0x050f80ff, 0x032fa00a, 0x07030000, 0x07c00000, - 0x022c0004, 0x056c041d, 0x04810134, 0x056c021d, - 0x0481014c, 0x056c081d, 0x04810180, 0x056c0e1d, - 0x0481015e, 0x076c061d, 0x0581019a, 0x0521d000, - 0x0002e013, 0x0202c013, 0x02020013, 0x0460021a, - 0x050f80ff, 0x053fa80a, 0x07000009, 0x03b600e2, - 0x0484801f, 0x0280004a, 0x040fe02c, 0x0086012a, - 0x06000013, 0x04001013, 0x0760122d, 0x050f80ff, - 0x032fa012, 0x07f00000, 0x0742002b, 0x0660002c, - 0x050f80ff, 0x053fa809, 0x06000001, 0x050fe003, - 0x00860149, 0x01028003, 0x0660002c, 0x050f80ff, - 0x053fa80a, 0x07000009, 0x0080019b, 0x00028013, - 0x00027013, 0x0080019b, 0x040fe02c, 0x00860129, - 0x0742002b, 0x0660002c, 0x050f80ff, 0x053fa809, - 0x06000001, 0x050fe003, 0x0086015b, 0x03026003, - 0x0660002c, 0x050f80ff, 0x053fa80a, 0x07000009, - 0x0080019b, 0x02026013, 0x02025013, 0x0080019b, - 0x040fe02c, 0x00860129, 0x0742002b, 0x0660002c, - 0x050f80ff, 0x053fa809, 0x06000001, 0x050fe003, - 0x0086016d, 0x0302a003, 0x0660002c, 0x050f80ff, - 0x053fa80a, 0x07000009, 0x0180016f, 0x0202a013, - 0x02029013, 0x0647f020, 0x06486020, 0x07818174, - 0x07a0034d, 0x00800179, 0x007a0120, 0x04000101, - 0x07a0034d, 0x0400802c, 0x06a00662, 0x0349a0e4, - 0x0581017d, 0x0421d008, 0x0080012a, 0x02948129, - 0x0521d005, 0x0080012a, 0x040fe02c, 0x00860129, - 0x0742002b, 0x0660002c, 0x050f80ff, 0x053fa809, - 0x06000001, 0x050fe003, 0x0086018f, 0x01022003, - 0x0660002c, 0x050f80ff, 0x053fa80a, 0x07000009, - 0x00800191, 0x00022013, 0x00021013, 0x0647f020, - 0x007a0120, 0x04000101, 0x07a0034d, 0x0400802c, - 0x06a00662, 0x02948129, 0x0521d005, 0x0080012a, - 0x00800132, 0x0647f020, 0x06486020, 0x078181a0, - 0x07a0034d, 0x00800129, 0x007a0120, 0x04000101, - 0x07a0034d, 0x0400802c, 0x06a00662, 0x00800129, - 0x040fd02c, 0x052e4003, 0x00208010, 0x06a00662, - 0x00800132, 0x00018098, 0x07480018, 0x068181bc, - 0x05481018, 0x068181ba, 0x05482018, 0x078181b8, - 0x07483018, 0x068181b6, 0x002fb004, 0x018001bd, - 0x012fb003, 0x018001bd, 0x002fb002, 0x018001bd, - 0x002fb001, 0x018001bd, 0x012fb000, 0x0179fe78, - 0x070000ff, 0x030190ff, 0x00017086, 0x048b01c1, - 0x03385000, 0x03020000, 0x07780017, 0x00430407, - 0x068182a7, 0x046c0419, 0x04810246, 0x046c0219, - 0x048101cd, 0x07219000, 0x0080022a, 0x07219000, - 0x07483017, 0x05810230, 0x05482017, 0x04810237, - 0x0448b075, 0x0681822a, 0x04601676, 0x050f80ff, - 0x073fa022, 0x0600003e, 0x06000080, 0x05001081, - 0x05002082, 0x06003083, 0x05004084, 0x06601e76, - 0x050f80ff, 0x022fa02a, 0x04487075, 0x04810229, - 0x06604476, 0x050f80ff, 0x032fa009, 0x03680600, - 0x056c02ff, 0x06818223, 0x07000090, 0x074b0000, - 0x050fe000, 0x00860223, 0x0560027b, 0x050f80ff, - 0x032fa009, 0x07f00000, 0x05600e00, 0x050f80ff, - 0x032fa009, 0x07f00000, 0x074b0000, 0x070ff08d, - 0x0179feff, 0x070000ff, 0x055c0400, 0x04810223, - 0x070ff017, 0x037a00ff, 0x05000400, 0x010170ff, - 0x04603e76, 0x050f80ff, 0x034a8400, 0x034a8800, - 0x05780100, 0x070000ff, 0x055a0400, 0x074b0a00, - 0x077bff00, 0x070000ff, 0x032fa00a, 0x07f00000, - 0x06603c76, 0x050f80ff, 0x07300fff, 0x070fffff, - 0x032fa00a, 0x07f00000, 0x06604876, 0x050f80ff, - 0x0700008d, 0x017a0100, 0x07ffff00, 0x032fa00a, - 0x07f00000, 0x04604a76, 0x050f80ff, 0x07300fff, - 0x070fffff, 0x032fa00a, 0x07f00000, 0x04604076, - 0x050f80ff, 0x06000013, 0x032fa00a, 0x0245a075, - 0x018002af, 0x06603c76, 0x050f80ff, 0x053fa842, - 0x06000045, 0x058b0227, 0x02085013, 0x07219000, - 0x07780078, 0x07ffff00, 0x045a0419, 0x010780ff, - 0x0484801f, 0x0280004a, 0x040fe07f, 0x0186023f, - 0x05a0025f, 0x0092022a, 0x040fe07f, 0x07a6825f, - 0x0080022a, 0x0760127b, 0x050f80ff, 0x032fa009, - 0x0744f000, 0x0760127b, 0x050f80ff, 0x032fa00a, - 0x018001d4, 0x052e400c, 0x040080fb, 0x046aa108, - 0x06009076, 0x04002075, 0x07a00669, 0x0080022a, - 0x06219001, 0x05482017, 0x05810253, 0x048b0249, - 0x060ff086, 0x0349f0ff, 0x078181c0, 0x07483017, - 0x05810250, 0x050fd0ff, 0x040fe07f, 0x07a6825f, - 0x0080022a, 0x05004084, 0x04a002e0, 0x0092022a, - 0x070ff07d, 0x0450047c, 0x056004ff, 0x050f80ff, - 0x032fa009, 0x070ff000, 0x00540479, 0x030790ff, - 0x00800237, 0x04487075, 0x04810267, 0x04605276, - 0x050f80ff, 0x032fa009, 0x060ff079, 0x01540400, - 0x01800269, 0x060ff079, 0x0054047a, 0x058202a0, - 0x058102a0, 0x070ff07d, 0x0450047c, 0x050f80ff, - 0x002fa819, 0x058b026f, 0x034960e4, 0x05810278, - 0x02681e01, 0x06818276, 0x03642203, 0x07828278, - 0x013e4000, 0x07003000, 0x02080001, 0x00081002, - 0x01082003, 0x058b027b, 0x04487075, 0x05810281, - 0x02385001, 0x03010000, 0x00800283, 0x03385000, - 0x03010000, 0x02400019, 0x070ff003, 0x04500479, - 0x030790ff, 0x0340007e, 0x0642007f, 0x058102a0, - 0x070ff07e, 0x050f80ff, 0x032fa009, 0x050fe000, - 0x0386829f, 0x070ff07d, 0x056002ff, 0x050f80ff, - 0x032fa009, 0x0107d000, 0x008602a1, 0x07600a7d, - 0x050f80ff, 0x032fa009, 0x03681e00, 0x0550041b, - 0x050f80ff, 0x032fa009, 0x0107e000, 0x070ff07e, - 0x0180028b, 0x0307c000, 0x07c00000, 0x052e400c, - 0x040080fb, 0x046aa108, 0x06009076, 0x04002075, - 0x03800669, 0x040fd076, 0x050fd017, 0x060ff086, - 0x077800ff, 0x07000060, 0x037c00ff, 0x07000060, - 0x078182a9, 0x07780078, 0x07ffff00, 0x045a0419, - 0x010780ff, 0x04487075, 0x058102ca, 0x07780017, - 0x05000400, 0x058102ca, 0x04601676, 0x050f80ff, - 0x073fa022, 0x0600003e, 0x0249a075, 0x078182c3, - 0x058b02be, 0x06603c76, 0x050f80ff, 0x053fa842, - 0x06000045, 0x052e400c, 0x040080fb, 0x026b4108, - 0x06009076, 0x04002075, 0x07a00669, 0x02800029, - 0x04601676, 0x050f80ff, 0x073fa022, 0x0600003e, - 0x052e400c, 0x04600876, 0x050f80ff, 0x053fa809, - 0x06000001, 0x05488003, 0x048102da, 0x0400d0fb, - 0x066a810d, 0x013e4000, 0x07000300, 0x02800029, - 0x040080fb, 0x066a8108, 0x06009076, 0x04002075, - 0x07a00669, 0x02800029, 0x0240007f, 0x0742007e, - 0x050f807e, 0x032fa009, 0x050fe000, 0x038682fa, - 0x070ff07d, 0x055c047b, 0x048102ef, 0x0760007d, - 0x050f80ff, 0x032fa009, 0x050fe000, 0x028682ef, - 0x070ff07b, 0x0107d0ff, 0x07600a7d, 0x050f80ff, - 0x032fa009, 0x03681e00, 0x0450041c, 0x0107e0ff, - 0x050f80ff, 0x032fa009, 0x050fe000, 0x018602fc, - 0x0307c000, 0x07c00000, 0x040fd076, 0x0380067d, - 0x010180c0, 0x0548e018, 0x05818317, 0x0748f018, - 0x04818313, 0x03490018, 0x0581830f, 0x01491018, - 0x0481830b, 0x073c0000, 0x06000040, 0x02200004, - 0x0280031a, 0x073c0000, 0x06000020, 0x03200003, - 0x0280031a, 0x073c0000, 0x06000010, 0x02200002, - 0x0280031a, 0x073c0000, 0x06000008, 0x02200001, - 0x0280031a, 0x073c0000, 0x06000004, 0x06000013, - 0x050fb000, 0x040fe076, 0x0286033d, 0x046c0273, - 0x04818329, 0x0448b075, 0x07810330, 0x06000013, - 0x04001013, 0x0760127b, 0x050f80ff, 0x032fa012, - 0x0046b075, 0x03b600e2, 0x02800331, 0x066c0073, - 0x0781032e, 0x040fd076, 0x07a0067d, 0x03800014, - 0x040fd076, 0x02800331, 0x00452075, 0x00077013, - 0x0647f075, 0x06486075, 0x04818337, 0x07a00353, - 0x0280033d, 0x007a0175, 0x04000101, 0x07a00353, - 0x04008076, 0x0245f008, 0x06a00662, 0x07273000, - 0x05600272, 0x050f80ff, 0x053fa80a, 0x07000009, - 0x0379ff78, 0x070000ff, 0x02076013, 0x02075013, - 0x0484801f, 0x0280004a, 0x070fc0ff, 0x052e400c, - 0x00208020, 0x06a00662, 0x02800346, 0x06000020, - 0x04001016, 0x0460082c, 0x050f80ff, 0x032fa012, - 0x07c00000, 0x06000075, 0x040010a2, 0x044b0801, - 0x060ff016, 0x065a0001, 0x04600876, 0x050f80ff, - 0x032fa012, 0x07c00000, 0x040fe02a, 0x02860362, - 0x0421d007, 0x0202c02a, 0x07a003a6, 0x0380037e, - 0x050fe022, 0x0286036d, 0x0421d004, 0x0302c022, - 0x07a003a6, 0x04488020, 0x0781037e, 0x040fd02c, - 0x0521d000, 0x0202c013, 0x02020013, 0x040fe026, - 0x03860384, 0x0421d001, 0x0202c026, 0x07a003a6, - 0x00683e20, 0x070060ff, 0x056c0206, 0x078103d8, - 0x056c0406, 0x068103ef, 0x076c0606, 0x05810465, - 0x04488020, 0x04818380, 0x056c1606, 0x04810473, - 0x07a00659, 0x02800398, 0x040fd02c, 0x0521d000, - 0x0202c013, 0x02020013, 0x050fe028, 0x02860398, - 0x0302c028, 0x0421d002, 0x07a003a6, 0x028003ad, - 0x040fe02a, 0x03860390, 0x0421d007, 0x0202c02a, - 0x07a003a6, 0x02800397, 0x050fe022, 0x02860398, - 0x0421d004, 0x0302c022, 0x07a003a6, 0x04488020, - 0x0581839a, 0x07a00659, 0x0484803e, 0x0280004a, - 0x040fd02c, 0x0521d000, 0x0202c013, 0x02020013, - 0x02800398, 0x040fe02a, 0x02860398, 0x0421d007, - 0x0202c02a, 0x07a003a6, 0x07a00659, 0x02800398, - 0x0460082c, 0x050f80ff, 0x032fa039, 0x03020000, - 0x0102d005, 0x01018006, 0x07c00000, 0x0400702c, - 0x05a004a6, 0x007a0101, 0x07060000, 0x07303000, - 0x07008290, 0x07600018, 0x050f80ff, 0x053fa809, - 0x07000003, 0x0448e007, 0x058183bb, 0x06006013, - 0x028003c2, 0x02400010, 0x078103bb, 0x06006010, - 0x0460342c, 0x050f80ff, 0x073fa00a, 0x07000003, - 0x050f801e, 0x032fa03a, 0x063aa020, 0x06000002, - 0x013e4000, 0x07000030, 0x029803c8, 0x070ff0f6, - 0x036830ff, 0x058183c9, 0x070f001e, 0x0760122d, - 0x050f10ff, 0x063f3c08, 0x0600000d, 0x013e4000, - 0x06000020, 0x040f801a, 0x0320000a, 0x022017d0, - 0x032fa012, 0x02800398, 0x04007013, 0x05a004a6, - 0x007a0101, 0x07050000, 0x07303000, 0x07008890, - 0x074d0005, 0x06006013, 0x050f801e, 0x032fa03a, - 0x07f00000, 0x05601c2d, 0x050f80ff, 0x022fa019, - 0x04001002, 0x04002013, 0x040f801f, 0x022fa01a, - 0x073aa00c, 0x06000002, 0x07300c03, 0x0600000d, - 0x01800493, 0x04007013, 0x05a004a6, 0x007a0101, - 0x03070000, 0x04602a2c, 0x050f80ff, 0x073fa009, - 0x06000004, 0x02499008, 0x078103fc, 0x07303000, - 0x07008890, 0x028003fe, 0x07303000, 0x04008980, - 0x05007003, 0x074d0005, 0x06006013, 0x050f801e, - 0x032fa03a, 0x07f00000, 0x0560162d, 0x050f80ff, - 0x032fa021, 0x07f00000, 0x064b0002, 0x02499008, - 0x0581040c, 0x0644c002, 0x054b0400, 0x050040ff, - 0x06698104, 0x07818421, 0x06000013, 0x04001013, - 0x04780102, 0x06000010, 0x06003013, 0x04004013, - 0x06005013, 0x06006013, 0x04007013, 0x00644015, - 0x0582041d, 0x04448002, 0x02205008, 0x040f801f, - 0x032fa042, 0x04008015, 0x0080045d, 0x046c8004, - 0x0681842f, 0x01208018, 0x06780002, 0x07000003, - 0x06818432, 0x06003001, 0x06000013, 0x04001013, - 0x04004013, 0x06005013, 0x040f801f, 0x022fa032, - 0x0080045d, 0x040fd02c, 0x07a0067d, 0x03800014, - 0x0379ff03, 0x070000ff, 0x04488002, 0x05810439, - 0x070ff003, 0x04500408, 0x050080ff, 0x0379ff00, - 0x070000ff, 0x06489002, 0x04810440, 0x070ff000, - 0x04500408, 0x050080ff, 0x07005003, 0x05004000, - 0x06003001, 0x06000013, 0x04001013, 0x040f801f, - 0x022fa032, 0x07f00000, 0x07601e2d, 0x050f80ff, - 0x022fa031, 0x07f00000, 0x06600c1f, 0x050f80ff, - 0x022fa032, 0x02680608, 0x0481045d, 0x016408ff, - 0x057dfeff, 0x07ffffff, 0x034000ff, 0x045a0407, - 0x070000ff, 0x0760061e, 0x050f80ff, 0x032fa00a, - 0x07f00000, 0x06600908, 0x0669f908, 0x027a0008, - 0x06000020, 0x070aa0ff, 0x024a2408, 0x037a00ff, - 0x060000dc, 0x070000ff, 0x01800493, 0x04007013, - 0x05a004a6, 0x007a0101, 0x07030000, 0x07303000, - 0x07008190, 0x06006013, 0x050f801e, 0x032fa03a, - 0x073aa000, 0x06000002, 0x07300c00, 0x07000005, - 0x01800493, 0x04007013, 0x05a004a6, 0x007a0101, - 0x07810000, 0x07303000, 0x07000090, 0x06006013, - 0x04600e2c, 0x050f80ff, 0x053fa809, 0x07000003, - 0x04780107, 0x07ffff00, 0x007c0107, 0x07000500, - 0x06818486, 0x07303000, 0x05000890, 0x074d0005, - 0x04602a2c, 0x050f80ff, 0x053fa809, 0x07000003, - 0x0049d007, 0x0581048d, 0x02206001, 0x050f801e, - 0x032fa03a, 0x073aa000, 0x06000002, 0x07300c00, - 0x07000005, 0x013e4000, 0x07000030, 0x01980495, - 0x070ff0f6, 0x036830ff, 0x07818496, 0x070f001e, - 0x040f101f, 0x070f3000, 0x013e4000, 0x06000020, - 0x040f801a, 0x0320000a, 0x022017d0, 0x032fa012, - 0x02800398, 0x03200000, 0x06006076, 0x008004a8, - 0x03200011, 0x0600602c, 0x07a0058e, 0x05600406, - 0x050f80ff, 0x053fa809, 0x06000002, 0x07c00000, - 0x02076031, 0x04600876, 0x050f80ff, 0x032fa039, - 0x03075000, 0x0107b005, 0x01018006, 0x06600076, - 0x050020ff, 0x050f80ff, 0x032fa011, 0x05031000, - 0x038684c5, 0x04031001, 0x038684c3, 0x06030013, - 0x07601818, 0x050f80ff, 0x053fa80a, 0x07000009, - 0x008004cb, 0x06030001, 0x008004cb, 0x040fe001, - 0x018604be, 0x07600030, 0x050f80ff, 0x012fa80a, - 0x06030001, 0x06000013, 0x04001013, 0x040f8002, - 0x032fa012, 0x06273001, 0x0448b075, 0x068184d6, - 0x06602276, 0x050f80ff, 0x053fa811, 0x0700003c, - 0x0179fe78, 0x070000ff, 0x030190ff, 0x038684de, - 0x04a004f2, 0x00078019, 0x009204f1, 0x03800587, - 0x040fd076, 0x040fd019, 0x04600276, 0x050020ff, - 0x050f80ff, 0x032fa009, 0x040f8002, 0x053fa80a, - 0x07000009, 0x050fe000, 0x038684ee, 0x07601818, - 0x050f80ff, 0x053fa80a, 0x07000009, 0x008004ef, - 0x05a00114, 0x07273000, 0x02076013, 0x0280004a, - 0x048b04f2, 0x03385000, 0x07030000, 0x05600818, - 0x050f80ff, 0x032fa009, 0x07f00000, 0x054b0400, - 0x0308a0ff, 0x04487075, 0x06810515, 0x06604476, - 0x050f80ff, 0x012fa811, 0x00680701, 0x046c0201, - 0x04818515, 0x0279ff02, 0x070000ff, 0x0379ff00, - 0x070000ff, 0x05001000, 0x060ff002, 0x01540400, - 0x06820513, 0x04001002, 0x060ff001, 0x04500402, - 0x070030ff, 0x01540400, 0x06820513, 0x05001003, - 0x0581850c, 0x00088001, 0x03800518, 0x0179fe00, - 0x070000ff, 0x010880ff, 0x0448b075, 0x0681052f, - 0x0560167b, 0x050f80ff, 0x002fa819, 0x02080002, - 0x01081003, 0x064b0001, 0x00082001, 0x034960e4, - 0x06810529, 0x02681e02, 0x05818527, 0x02642201, - 0x04828529, 0x013e4000, 0x07003000, 0x02083001, - 0x02079001, 0x0207a001, 0x00084013, 0x0207f013, - 0x0280057f, 0x06485075, 0x07810556, 0x02465075, - 0x04601676, 0x050f80ff, 0x073fa021, 0x0600003e, + 0x0700ffff, 0x045c0401, 0x07818730, 0x05601041, + 0x050f80ff, 0x032fa069, 0x07480000, 0x0481074f, + 0x06780043, 0x070000f0, 0x07810072, 0x037c00ff, + 0x06000010, 0x07810072, 0x0180074b, 0x0379ff00, + 0x070fffff, 0x06780043, 0x07f00000, 0x075a0000, + 0x020ef001, 0x0186074d, 0x05484000, 0x03a1822d, + 0x062d6001, 0x002fb001, 0x070ff069, 0x00868085, + 0x060ff079, 0x055c0441, 0x06810010, 0x012fb000, + 0x060560fb, 0x0380008b, 0x060ff079, 0x02868208, + 0x070ff069, 0x055c0441, 0x06810010, 0x060560fb, + 0x0400d0d0, 0x062d6002, 0x0648300d, 0x07810099, + 0x070ff0d1, 0x062d6001, 0x045c040b, 0x0781009c, + 0x05488000, 0x05818099, 0x072e500c, 0x00208001, + 0x06a00607, 0x02800010, 0x062d6001, 0x07f00000, + 0x07f00000, 0x070ff0d1, 0x0179feff, 0x070000ff, + 0x055c040c, 0x0781810a, 0x0007b001, 0x03079041, + 0x0307a000, 0x06600a79, 0x050f80ff, 0x053fa80a, + 0x06000010, 0x068d00a8, 0x0307c003, 0x0007d004, + 0x0107e005, 0x0307f006, 0x02080007, 0x00081008, + 0x01082009, 0x0308300a, 0x018680bd, 0x0448d07a, + 0x058180bd, 0x0448b07a, 0x05810756, 0x06604479, + 0x050f80ff, 0x053fa809, 0x06000001, 0x01680703, + 0x076c0303, 0x07818756, 0x072d5003, 0x0049107a, + 0x068100c7, 0x070ff009, 0x0154040a, 0x058280c6, + 0x078d00c3, 0x0108200a, 0x032ff000, 0x010770ff, + 0x0008400b, 0x0308500c, 0x0678007a, 0x04000108, + 0x078100e1, 0x078d00cc, 0x06603c79, 0x050f80ff, + 0x073fa041, 0x0600004a, 0x0249007a, 0x068100da, + 0x068d00d3, 0x06602279, 0x050f80ff, 0x032fa009, + 0x07780000, 0x03800000, 0x078100e1, 0x068d00da, + 0x0678007a, 0x07f00000, 0x010880ff, 0x02386008, + 0x03010000, 0x038000e7, 0x078d00e1, 0x0678007a, + 0x07f00000, 0x010880ff, 0x03386000, 0x03010000, + 0x072e6300, 0x020ef07f, 0x02860010, 0x070ff07d, + 0x0450047c, 0x050f80ff, 0x002fa819, 0x078d00ee, + 0x02080001, 0x00081002, 0x0678007a, 0x04000201, + 0x078100fa, 0x0448807a, 0x068100f8, 0x0379ff03, + 0x070000ff, 0x0049107a, 0x02a18226, 0x01082003, + 0x068d00fb, 0x0448b07a, 0x07818103, 0x0249007a, + 0x05810106, 0x07780003, 0x03800000, 0x05810106, + 0x0338600c, 0x03010000, 0x00800108, 0x02386004, + 0x03010000, 0x072e6c00, 0x02800010, 0x06780043, + 0x070000f0, 0x04810758, 0x050020ff, 0x027c0002, + 0x06000010, 0x05810112, 0x00800758, 0x0700c0d1, + 0x0379ff0c, 0x070000ff, 0x028000a1, 0x0204a051, + 0x06780043, 0x070000f0, 0x037c00ff, 0x06000010, + 0x068181bf, 0x072d6000, 0x02948734, 0x050fb056, + 0x044880e6, 0x04818010, 0x060ff0d0, 0x0179feff, + 0x0700ffff, 0x057dfeff, 0x0700ffff, 0x05810730, + 0x0349c0e4, 0x06818173, 0x013e4000, 0x070c0000, + 0x07f00000, 0x0349c0e4, 0x06818173, 0x070ff093, + 0x045a0201, 0x070ff093, 0x045c0401, 0x0781812e, + 0x02046092, 0x04002046, 0x060ff002, 0x045c0401, + 0x0703a0ff, 0x04600202, 0x00540401, 0x0782813c, + 0x04500425, 0x070060ff, 0x0730ffff, 0x0700000f, + 0x0742000f, 0x05810200, 0x05a00718, 0x0648a002, + 0x0781813f, 0x00047089, 0x070ff047, 0x045c0443, + 0x077800ff, 0x07f00000, 0x068181fe, 0x07780047, + 0x0500e000, 0x0681871f, 0x070ff006, 0x0086016d, + 0x0179fe47, 0x0700000f, 0x010480ff, 0x056c7048, + 0x06818158, 0x007a0d4a, 0x04003801, 0x0220f001, + 0x01800165, 0x07608e48, 0x034a60ff, 0x0700f0ff, + 0x074b88ff, 0x037000ff, 0x07000600, 0x05500448, + 0x074d00ff, 0x045a044a, 0x0304a0ff, 0x070ff00f, + 0x01540406, 0x0482016d, 0x04950175, 0x05a0024d, + 0x03868178, 0x0134bfff, 0x070fffff, 0x0104102e, + 0x050fd041, 0x0080017a, 0x04950173, 0x05a0024d, + 0x00860173, 0x0202f00e, 0x052e4030, 0x040fd02f, + 0x05a002ac, 0x02800010, 0x0400e02f, 0x042e4020, + 0x0202f051, 0x0004100e, 0x0004b00e, 0x024a6c46, + 0x04500423, 0x050070ff, 0x03620024, 0x050080ff, + 0x04004046, 0x0700500f, 0x03206000, 0x05601048, + 0x0700a0ff, 0x0700900a, 0x070ff005, 0x04500446, + 0x00540425, 0x048201ab, 0x07601822, 0x050f80ff, + 0x063fa032, 0x06000002, 0x03203000, 0x01204000, + 0x03205000, 0x0120b000, 0x0320c000, 0x05601641, + 0x050f80ff, 0x043fa852, 0x06000001, 0x070ff056, + 0x056c02ff, 0x050fb0ff, 0x070560ff, 0x03079041, + 0x05601041, 0x050f80ff, 0x073fa011, 0x0600003d, + 0x06780043, 0x07f00000, 0x065a007a, 0x010880ff, + 0x04a00246, 0x048d01a4, 0x0208a04a, 0x0108b04b, + 0x02386001, 0x03010000, 0x072e6300, 0x038000e8, + 0x0500d00a, 0x05500405, 0x014a68ff, 0x070090ff, + 0x0154040a, 0x0700c0ff, 0x0600a023, 0x0500b024, + 0x02206001, 0x07601822, 0x050f80ff, 0x063fa04a, + 0x06000002, 0x07f00000, 0x07601222, 0x050f80ff, + 0x043fa819, 0x06000001, 0x0600a00d, 0x01800190, + 0x06780043, 0x070000f0, 0x050010ff, 0x027c0001, + 0x07000030, 0x04810726, 0x027c0001, 0x06000020, + 0x04810726, 0x0180074b, 0x074860ff, 0x068181e5, + 0x054880ff, 0x06810010, 0x070ff056, 0x050fb0ff, + 0x044880e5, 0x058101d4, 0x044880e6, 0x04818010, + 0x008001da, 0x056c02ff, 0x050fb0ff, 0x070560ff, + 0x072e5300, 0x044880e6, 0x04818010, 0x072d5003, + 0x06780043, 0x07f00000, 0x010880ff, 0x058d01de, + 0x03386005, 0x03010000, 0x033e6000, 0x0700000c, + 0x052e5200, 0x02800010, 0x0448e0e6, 0x04818010, + 0x002fb008, 0x0448e0e6, 0x04818010, 0x05301fff, + 0x0700000f, 0x06420001, 0x05810200, 0x05a00718, + 0x0648a002, 0x068181ec, 0x062e5080, 0x04001089, + 0x040fd002, 0x040fd001, 0x02499001, 0x0481021f, + 0x070ff0d4, 0x050fd0ff, 0x045c0401, 0x077800ff, + 0x07f00000, 0x0681821f, 0x02800010, 0x002091fe, + 0x0380060a, 0x01209200, 0x0380060a, 0x00209202, + 0x0380060a, 0x03209000, 0x0380060a, 0x01209206, + 0x0380060a, 0x00209208, 0x0380060a, 0x06780043, + 0x07009000, 0x06818215, 0x00498043, 0x04810215, + 0x0648a0e5, 0x04810216, 0x027c0045, 0x03040000, + 0x05810218, 0x075c00ff, 0x07c00000, 0x056a02ff, + 0x00800215, 0x01800214, 0x06780075, 0x06000c07, + 0x0781066c, 0x00209219, 0x070fc0ff, 0x07a005f5, + 0x070fc0ff, 0x05308000, 0x0700a000, 0x06a00607, + 0x033e5000, 0x0700000c, 0x02800010, 0x070ff003, + 0x01540477, 0x0782822b, 0x07003077, 0x060ff051, + 0x010770ff, 0x07c00000, 0x04602001, 0x050f80ff, + 0x063fa029, 0x06000008, 0x02015010, 0x02016051, + 0x00017051, 0x00011051, 0x05601c41, 0x050f80ff, + 0x053fa83a, 0x06000008, 0x07f00000, 0x05601041, + 0x050f80ff, 0x01464000, 0x032fa00a, 0x07006011, + 0x05007012, 0x04008013, 0x07009014, 0x0600a015, + 0x0400b016, 0x0700c017, 0x07c00000, 0x072d5003, + 0x04601679, 0x050f80ff, 0x048d0249, 0x063fa051, + 0x0600003e, 0x07c00000, 0x06005051, 0x0400e02c, + 0x0660060e, 0x050f80ff, 0x032fa009, 0x0379ff00, + 0x070000ff, 0x076c0000, 0x0581026f, 0x0460580e, + 0x0500e0ff, 0x034000ff, 0x01540427, 0x05820299, + 0x03400005, 0x070ff005, 0x055c0428, 0x0481029b, + 0x056c0805, 0x0681824f, 0x040f8029, 0x053fa809, + 0x07000024, 0x07f00000, 0x06600649, 0x050f80ff, + 0x032fa009, 0x0379ff00, 0x070000ff, 0x076c0000, + 0x0681824f, 0x05a0029f, 0x0400e049, 0x00800270, + 0x05a0029f, 0x072d6000, 0x0460040e, 0x050f80ff, + 0x0004d0d0, 0x0379ff4d, 0x0700ffff, 0x0104e0d1, + 0x0379ff4e, 0x0700ffff, 0x062d6002, 0x032fa009, + 0x0204f0d0, 0x064b004f, 0x07780000, 0x07ffff00, + 0x045a044f, 0x070000ff, 0x00201008, 0x04002051, + 0x06003051, 0x01204000, 0x07305000, 0x07000060, + 0x03206009, 0x05007022, 0x0460040e, 0x050f80ff, + 0x032fa042, 0x07f00000, 0x04604c0e, 0x050f80ff, + 0x053fa812, 0x06000026, 0x050010d1, 0x0460340e, + 0x050f80ff, 0x012fa80a, 0x060ff00e, 0x055c042e, + 0x0481029d, 0x07c00000, 0x0400e026, 0x0080025b, + 0x0500e02e, 0x00800270, 0x0400e051, 0x00800298, + 0x0340002d, 0x050f802b, 0x053fa80a, 0x06000016, + 0x07f00000, 0x0460580e, 0x0302c0ff, 0x034000ff, + 0x01540427, 0x058202aa, 0x07c00000, 0x0202c026, + 0x018002a9, 0x013e4000, 0x03080000, 0x07c00000, + 0x077800e4, 0x07000005, 0x058183b4, 0x022a5002, + 0x069082b3, 0x0391033c, 0x030400a6, 0x0678aae5, + 0x06000051, 0x03a1878e, 0x04600e40, 0x050f80ff, + 0x032fa021, 0x07f00000, 0x074b0000, 0x076c0600, + 0x0481833e, 0x060ff002, 0x01580403, 0x06810349, + 0x05600403, 0x050f80ff, 0x073fa009, 0x06000002, + 0x0279ff04, 0x0700ffff, 0x010440d7, 0x0179fe44, + 0x0700ffff, 0x045c0404, 0x04818340, 0x0349f044, + 0x0581834b, 0x02495001, 0x05818342, 0x060ff079, + 0x045c0440, 0x068182d6, 0x0644f07a, 0x002fb008, + 0x060ff079, 0x045c0440, 0x078182db, 0x0644f07a, + 0x002fb008, 0x0648f001, 0x05818333, 0x04601040, + 0x050f80ff, 0x06480001, 0x058102fa, 0x0448e001, + 0x0681031f, 0x02460001, 0x0644f001, 0x012fa80a, + 0x04008040, 0x00491001, 0x04818337, 0x07a00614, + 0x00868337, 0x070050d8, 0x05780105, 0x07ffff00, + 0x04600e02, 0x050f80ff, 0x053fa812, 0x06000002, + 0x06a005fe, 0x062da001, 0x013e4000, 0x06000080, + 0x06930013, 0x02920013, 0x02800010, 0x0644f001, + 0x012fa80a, 0x020ef002, 0x03860321, 0x04600840, + 0x050f80ff, 0x053fa809, 0x06000002, 0x05780105, + 0x00800440, 0x017c0105, 0x05000400, 0x05818321, + 0x04602002, 0x050f80ff, 0x053fa809, 0x06000002, + 0x07f00000, 0x04602c40, 0x050f80ff, 0x070ff005, + 0x053fa809, 0x06000002, 0x055c0405, 0x05818321, + 0x070050d8, 0x05780105, 0x07ffff00, 0x06006051, + 0x04600e02, 0x050f80ff, 0x053fa812, 0x06000002, + 0x04008040, 0x0045e008, 0x06a005fe, 0x008002f4, + 0x0644f001, 0x012fa80a, 0x050020d8, 0x04600440, + 0x050f80ff, 0x073fa00a, 0x06000001, 0x06480001, + 0x0581832d, 0x05308000, 0x03040000, 0x06009040, + 0x06a00602, 0x008002f4, 0x05a0078e, 0x03200003, + 0x06600c40, 0x050f80ff, 0x032fa00a, 0x008002f4, + 0x013e4000, 0x06000080, 0x03209333, 0x0380060a, + 0x06009008, 0x05308000, 0x05004000, 0x06a00602, + 0x008002f4, 0x02209002, 0x038003a5, 0x03209000, + 0x038003a5, 0x02209004, 0x038003a5, 0x07a003bd, + 0x062da001, 0x05308000, 0x05002000, 0x06009040, + 0x06a00602, 0x018002f5, 0x02209008, 0x038003a5, + 0x013e4000, 0x06000080, 0x02495001, 0x0481839b, + 0x04600840, 0x050f80ff, 0x053fa809, 0x06000001, + 0x0721f000, 0x0349f003, 0x06810357, 0x0245f01f, + 0x06000002, 0x05601600, 0x050f80ff, 0x012fa809, + 0x06480001, 0x0681039b, 0x04481001, 0x0481839b, + 0x04602640, 0x050f80ff, 0x012fa809, 0x020ef001, + 0x0086839b, 0x029b039b, 0x050020d8, 0x062da001, + 0x06303002, 0x05000430, 0x04600440, 0x050f80ff, + 0x073fa012, 0x06000001, 0x008f836d, 0x050040d8, + 0x062da001, 0x05602000, 0x050f80ff, 0x073fa009, + 0x06000001, 0x060ff004, 0x00540402, 0x07820399, + 0x06005051, 0x06006051, 0x06602440, 0x050f80ff, + 0x063fa01a, 0x06000002, 0x07f00000, 0x06600a40, + 0x050f80ff, 0x073fa00a, 0x07000003, 0x07f00000, + 0x04600840, 0x050f80ff, 0x053fa809, 0x06000001, + 0x05487003, 0x07810393, 0x060ff002, 0x00540404, + 0x05828393, 0x05308000, 0x07005000, 0x06009040, + 0x06a00602, 0x04008004, 0x06a00607, 0x02800013, + 0x060ff040, 0x045a041f, 0x010eb0ff, 0x06930013, + 0x02920013, 0x02800010, 0x04004002, 0x03800377, + 0x07a003bd, 0x062da001, 0x05308000, 0x07005000, + 0x06009040, 0x06a00602, 0x050080d8, 0x06a00607, + 0x062da001, 0x02800013, 0x050fd009, 0x040fd040, + 0x013e4000, 0x06000080, 0x05308000, 0x03013000, + 0x06a00602, 0x010440d7, 0x0349f044, 0x078103b2, + 0x062da001, 0x038f03b2, 0x03e00000, 0x062da001, + 0x02800013, 0x0249c0e5, 0x06810013, 0x062da001, + 0x07f00000, 0x07f00000, 0x033e5000, 0x070c0000, + 0x028f03b6, 0x03800011, 0x050020d8, 0x04600440, + 0x050f80ff, 0x073fa00a, 0x06000001, 0x07c00000, + 0x002fb001, 0x038003c6, 0x012fb000, 0x03075087, + 0x068d03c7, 0x03386000, 0x03020000, 0x04482075, + 0x04810438, 0x0648a0e6, 0x04810416, 0x0642007f, + 0x05810414, 0x0340007e, 0x060ff038, 0x0154047e, + 0x01d00403, 0x0560027d, 0x050f80ff, 0x032fa009, + 0x030ef000, 0x02860667, 0x0107d000, 0x07600a00, + 0x050f80ff, 0x032fa009, 0x03681e00, 0x04500420, + 0x050f80ff, 0x073fa009, 0x0700003f, 0x038003d1, 0x070ff07d, 0x0450047c, 0x050f80ff, 0x002fa819, - 0x078b053a, 0x034960e4, 0x06810543, 0x02681e01, - 0x05818541, 0x03642203, 0x04828543, 0x013e4000, + 0x078d03e7, 0x02080001, 0x00081002, 0x0678007a, + 0x04000201, 0x078103f3, 0x0448807a, 0x068103f1, + 0x0379ff03, 0x070000ff, 0x0049107a, 0x02a18226, + 0x01082003, 0x068d03f4, 0x0448b07a, 0x058183fc, + 0x0249007a, 0x078103ff, 0x07780003, 0x03800000, + 0x078103ff, 0x0338600c, 0x03010000, 0x00800401, + 0x02386004, 0x03010000, 0x072e6c00, 0x00800438, + 0x01800409, 0x0080040b, 0x0080040d, 0x0180040f, + 0x01800411, 0x00800413, 0x0727c006, 0x028003e3, + 0x0727c009, 0x028003e3, 0x0727c00c, 0x028003e3, + 0x0727c00f, 0x028003e3, 0x0727c012, 0x028003e3, + 0x038003d4, 0x052e6800, 0x00800438, 0x044880e6, + 0x0781069c, 0x052e6200, 0x070ff088, 0x0179feff, + 0x070fffff, 0x01a18642, 0x04818638, 0x0249607a, + 0x07818456, 0x060ff083, 0x03868456, 0x033e6000, + 0x07000003, 0x0448b07a, 0x04810438, 0x06604479, + 0x050f80ff, 0x032fa009, 0x03680600, 0x076c00ff, + 0x06818438, 0x04604679, 0x050f80ff, 0x032fa009, + 0x07f00000, 0x074b0000, 0x070ff000, 0x048d0432, + 0x05001099, 0x064b0001, 0x045c0401, 0x04810438, + 0x0245a07a, 0x048d0438, 0x07286000, 0x07f00000, + 0x048d043b, 0x038c03c6, 0x0648c0e6, 0x0681845b, + 0x0448e0e6, 0x05810453, 0x01209441, 0x02490075, + 0x0681821f, 0x004920e6, 0x0581044e, 0x07a006e1, + 0x05001088, 0x00700101, 0x03100000, 0x00088001, + 0x033e6000, 0x07000088, 0x038006d2, 0x02386001, + 0x07030000, 0x033e6000, 0x06000008, 0x018004ed, + 0x02799075, 0x0700050f, 0x06810010, 0x04601679, + 0x050080ff, 0x06309052, 0x0600003e, 0x0180045f, + 0x06602479, 0x050080ff, 0x05309812, 0x07000041, + 0x0648007a, 0x05810471, 0x04488075, 0x07818471, + 0x0678007a, 0x04000108, 0x0481046d, 0x06603c79, + 0x050f80ff, 0x048d0468, 0x073fa042, 0x0600004a, + 0x048d046b, 0x02086051, 0x040f8008, 0x070fa009, + 0x0049107a, 0x02a184ef, 0x00798075, 0x06000507, + 0x04818683, 0x0448b075, 0x05810478, 0x02493075, + 0x0681067f, 0x0648c0e6, 0x0781848b, 0x048d047a, + 0x02386001, 0x07030000, 0x0049107a, 0x05810481, + 0x020ef083, 0x0186048b, 0x06483075, 0x058104eb, + 0x0678007a, 0x07000035, 0x01a185f5, 0x05308000, + 0x07060000, 0x06009079, 0x06a00602, 0x018004eb, + 0x06483075, 0x0681061f, 0x058d048d, 0x02386001, + 0x07030000, 0x0444e07a, 0x0648307a, 0x068184bf, + 0x0448707a, 0x048104e6, 0x0648f07a, 0x058104a9, + 0x07a005f5, 0x04008079, 0x07a00614, 0x028684ba, + 0x0049107a, 0x068184ba, 0x04600408, 0x050f80ff, + 0x053fa809, 0x06000002, 0x05780105, 0x07ffff00, + 0x05600e7b, 0x050f80ff, 0x053fa812, 0x06000002, + 0x06a005fe, 0x018004eb, 0x0760127b, 0x050f80ff, + 0x032fa009, 0x0349c000, 0x078184b8, 0x04601079, + 0x050f80ff, 0x073fa00a, 0x0600003d, 0x07f00000, + 0x06600a79, 0x050f80ff, 0x053fa80a, 0x06000010, + 0x018004eb, 0x0046e07a, 0x008004e6, 0x06009008, + 0x05308000, 0x05004000, 0x06a00602, 0x018004eb, + 0x0760187b, 0x050f80ff, 0x032fa011, 0x070ff000, + 0x04500401, 0x030460ff, 0x060ff025, 0x00540446, + 0x048204d3, 0x030460ff, 0x052e40c0, 0x04092046, + 0x0349a0e4, 0x068184d0, 0x003e4080, 0x0700c000, + 0x018004d4, 0x003e4080, 0x05008000, 0x018004d4, + 0x04092046, 0x070ff03a, 0x038684d8, 0x013e4000, + 0x07000003, 0x05a002ac, 0x06600679, 0x050f80ff, + 0x00201007, 0x012fa80a, 0x0046047a, 0x034630ff, + 0x050020ff, 0x06003051, 0x04601079, 0x050f80ff, + 0x073fa012, 0x06000001, 0x018004eb, 0x07a005f5, + 0x05308000, 0x03020000, 0x06009079, 0x06a00602, + 0x033e6a00, 0x0700000a, 0x02079051, 0x02800010, + 0x06605079, 0x050f80ff, 0x032fa009, 0x070ff000, + 0x02860508, 0x057dfeff, 0x07ffffff, 0x06810508, + 0x050f8000, 0x012fa811, 0x0079fe02, 0x070000ff, + 0x077d66ff, 0x060000dc, 0x04818508, 0x060ff001, + 0x01868509, 0x064b0002, 0x06420002, 0x060ff002, + 0x05500400, 0x050f80ff, 0x05004084, 0x073fa00a, + 0x06000002, 0x07c00000, 0x04600201, 0x050f80ff, + 0x073fa009, 0x06000001, 0x0079fe02, 0x070000ff, + 0x077d72ff, 0x070000dd, 0x04818508, 0x064b0002, + 0x06420002, 0x06000001, 0x02800502, 0x0605004c, + 0x0280051a, 0x06930516, 0x06a005fb, 0x054bc450, + 0x0781051d, 0x03d0051e, 0x0380051d, 0x0380052e, + 0x03800530, 0x028005ba, 0x028005cd, 0x0280053d, + 0x03800530, 0x03800584, 0x0380052e, 0x0380052e, + 0x038005d1, 0x0380052e, 0x028005d5, 0x028005ea, + 0x038005a6, 0x0380052e, 0x0380052e, 0x0320952e, + 0x0380060a, 0x073c3fff, 0x0700000f, 0x0379ff50, + 0x070fffff, 0x060ff079, 0x055c0450, 0x078105ca, + 0x002fb008, 0x060ff079, 0x055c0450, 0x078105c9, + 0x07a005ed, 0x028005c2, 0x0179fe50, 0x070fffff, + 0x070050ff, 0x060ff079, 0x055c0405, 0x07810547, + 0x002fb008, 0x060ff079, 0x055c0405, 0x058185c6, + 0x073c3fff, 0x0700000f, 0x070ff087, 0x017980ff, + 0x06000507, 0x05818556, 0x02203040, 0x05002087, + 0x0049d002, 0x05818556, 0x002fb008, 0x07006087, + 0x002fb008, 0x0149d006, 0x0781057e, 0x0693055b, + 0x01257000, 0x052e4003, 0x072e5030, 0x0304c050, + 0x02400057, 0x06740057, 0x06000004, 0x06820016, + 0x0049107a, 0x02a184ef, 0x04002083, 0x07003084, + 0x04004085, 0x06602479, 0x050f80ff, 0x063fa01a, + 0x06000001, 0x07a005f5, 0x06a006ea, 0x033e6a00, + 0x0700000a, 0x062e5020, 0x05a00718, 0x02798102, + 0x070000ff, 0x007c8002, 0x07000055, 0x0781057b, + 0x072e50c0, 0x0648a002, 0x0781057b, 0x068d0576, + 0x03386006, 0x03010000, 0x033e6000, 0x0700000c, + 0x003e4002, 0x07000a00, 0x018004ed, 0x07420003, + 0x0581854e, 0x00798002, 0x06000507, 0x05818556, + 0x0380055f, 0x0793058b, 0x01257000, 0x073c3fff, + 0x0700000f, 0x052e4003, 0x072e5030, 0x0304c050, + 0x067800e6, 0x07000041, 0x07810590, 0x07a006f3, + 0x0481859b, 0x002fb008, 0x067800e6, 0x07000041, + 0x07810596, 0x07a006f3, 0x0481859b, 0x062e5020, + 0x003e4002, 0x07000a00, 0x03e00000, 0x02800010, + 0x06740057, 0x07000018, 0x06820016, 0x06a006ea, + 0x033e6a00, 0x0700000a, 0x002fb008, 0x06a006ea, + 0x033e6a00, 0x0700000a, 0x03800596, 0x0379ff50, + 0x070fffff, 0x060ff079, 0x055c0450, 0x058185ac, + 0x0245507a, 0x002fb008, 0x060ff079, 0x055c0450, + 0x058185b1, 0x0245507a, 0x002fb008, 0x05601050, + 0x050f80ff, 0x012fa809, 0x02455001, 0x05601050, + 0x050f80ff, 0x012fa80a, 0x038005c3, 0x059585ca, + 0x0179fe50, 0x070fffff, 0x045c042f, 0x058185ca, + 0x0202f051, 0x042e4020, 0x038005c3, 0x002fb008, + 0x003e4002, 0x07000a00, 0x02800016, 0x059385c9, + 0x062e5020, 0x042e4002, 0x002fb008, 0x013e4000, + 0x05000e00, 0x02800016, 0x0179fe50, 0x070fffff, + 0x010210ff, 0x02800016, 0x0179fe50, 0x070fffff, + 0x050340ff, 0x038005c3, 0x0179fe50, 0x070fffff, + 0x0102e0ff, 0x05602a2e, 0x050f80ff, 0x05222000, + 0x07223000, 0x05224000, 0x07225000, 0x07226000, + 0x05227000, 0x05228000, 0x07229000, 0x0722a000, + 0x0522b000, 0x063fa051, 0x07000011, 0x0202c026, + 0x0522d000, 0x052e400c, 0x02800016, 0x030430d4, + 0x062e5008, 0x008001cd, 0x05601050, 0x050f80ff, + 0x032fa009, 0x03460000, 0x028005f8, 0x0246007a, + 0x0045207a, 0x038005f6, 0x0246007a, 0x0600007a, + 0x04601079, 0x050f80ff, 0x032fa00a, 0x07c00000, + 0x009285fb, 0x070500e1, 0x07c00000, 0x0245f008, + 0x078405ff, 0x020e0008, 0x07c00000, 0x070ff009, + 0x065a0008, 0x06840604, 0x020e0008, 0x07c00000, + 0x06840607, 0x020e0008, 0x07c00000, 0x05308000, + 0x0500d000, 0x06a00602, 0x07a0060f, 0x02800010, + 0x052e4300, 0x072e500c, 0x073c3fff, 0x0700000f, + 0x07c00000, 0x06602408, 0x050f80ff, 0x032fa011, + 0x076a0000, 0x0581861d, 0x066a0001, 0x0781061d, + 0x06006051, 0x07c00000, 0x02206001, 0x07c00000, + 0x0678007a, 0x07000021, 0x05818627, 0x0049107a, + 0x07810627, 0x073c3fff, 0x0700000f, 0x0180048d, + 0x040fd079, 0x0648307a, 0x0681062c, 0x04a00785, + 0x02800631, 0x06a005f2, 0x05308000, 0x05001000, + 0x06009079, 0x06a00602, 0x068d0631, 0x033e6a00, + 0x0600000e, 0x02079051, 0x03386006, 0x03010000, + 0x02800010, 0x0648307a, 0x0781063c, 0x04a00785, + 0x038006d2, 0x06a005f2, 0x05308000, 0x05001000, + 0x06009079, 0x06a00602, 0x038006d2, 0x050010ff, + 0x0448b07a, 0x07810650, 0x0049107a, 0x07810650, + 0x078d0647, 0x06604479, 0x050f80ff, 0x032fa009, + 0x03680600, 0x056c02ff, 0x05818650, 0x046c1001, + 0x06810652, 0x056a02ff, 0x07c00000, 0x07a00655, + 0x075c00ff, 0x07c00000, 0x078d0655, 0x060ff07c, + 0x070ff07d, 0x070ff07e, 0x060ff07f, 0x060ff080, + 0x070ff081, 0x070ff082, 0x060ff083, 0x070ff084, + 0x060ff085, 0x0338600c, 0x03010000, 0x008a8662, + 0x078d0663, 0x03386000, 0x03020000, 0x07c00000, + 0x0648307a, 0x07818206, 0x07a005f5, 0x02209667, + 0x0380060a, 0x04002089, 0x04780102, 0x07f00000, + 0x05001088, 0x04740101, 0x03100000, 0x04780101, + 0x07f00000, 0x060ff002, 0x045c0401, 0x05818681, + 0x00088001, 0x033e6000, 0x070000c0, 0x0220901a, + 0x05308000, 0x01012000, 0x06a00602, 0x028006ce, + 0x0220967f, 0x0380060a, 0x03209681, 0x0180021d, + 0x040fd075, 0x040fd07a, 0x040fd079, 0x0648307a, + 0x0681068c, 0x06780075, 0x06000007, 0x04818697, + 0x04a00785, 0x06486075, 0x06818204, 0x02490075, + 0x06818219, 0x04487075, 0x0581869f, 0x0448b07a, + 0x07810696, 0x00492075, 0x048186b0, 0x028006a8, + 0x05308000, 0x03010000, 0x06009079, 0x06a00602, + 0x02800010, 0x0448e0e6, 0x06818438, 0x00800202, + 0x0648307a, 0x048186ce, 0x05308000, 0x0500e000, + 0x06009079, 0x06a00602, 0x04008089, 0x06a00607, + 0x028006ce, 0x06a005f2, 0x05308000, 0x0700f000, + 0x06009079, 0x07000088, 0x07a006b7, 0x06a00602, + 0x02800010, 0x05308000, 0x01011000, 0x06009079, + 0x07000088, 0x07a006b7, 0x06a00602, 0x02800010, + 0x03386000, 0x07030000, 0x07f00000, 0x068d06ba, + 0x033e6a00, 0x0600000e, 0x02079051, 0x0448b075, + 0x078106c5, 0x02493075, 0x078106c5, 0x05301005, + 0x03010000, 0x028006c7, 0x05301006, 0x03010000, + 0x05002087, 0x06485002, 0x048186c7, 0x0744c000, + 0x01088000, 0x02086001, 0x07c00000, 0x05001088, + 0x07a006e1, 0x0644c001, 0x00088001, 0x033e6a00, + 0x0600000e, 0x004920e6, 0x058186d7, 0x02079051, + 0x078d06d7, 0x060ff089, 0x034990ff, 0x078106de, + 0x03386005, 0x03010000, 0x02800010, 0x03386006, + 0x03010000, 0x02800010, 0x078d06e1, 0x03386000, + 0x07030000, 0x07f00000, 0x068d06e5, 0x070ff087, + 0x074850ff, 0x048186e6, 0x07c00000, 0x068d06ea, + 0x02386001, 0x07030000, 0x07f00000, 0x078d06ee, + 0x070ff087, 0x074850ff, 0x048186ef, 0x07c00000, + 0x05002087, 0x0049d002, 0x06818702, 0x002fb008, + 0x067800e6, 0x07000041, 0x002fb008, 0x06818702, + 0x05a00718, 0x0448e002, 0x05810705, 0x0648a002, + 0x0781870f, 0x06486002, 0x05810709, 0x02400057, + 0x056a02ff, 0x07c00000, 0x05a00718, 0x06788102, + 0x06000004, 0x06818702, 0x04002089, 0x070ff0d4, + 0x045c0402, 0x077800ff, 0x07f00000, 0x06818702, + 0x00202010, 0x008c0702, 0x07f00000, 0x06420002, + 0x06818710, 0x06a006ea, 0x033e6a00, 0x0700000a, + 0x07c00000, 0x07f00000, 0x060ff0a2, 0x045a0202, + 0x060ff0a2, 0x045c0402, 0x06818719, 0x07c00000, + 0x05a002ac, 0x03495047, 0x05810724, 0x0320901d, + 0x01800781, 0x0220901f, 0x01800781, 0x014980e4, + 0x04818010, 0x013e4000, 0x07003000, 0x05600e35, + 0x050f80ff, 0x04a00883, 0x01208003, 0x06a00607, + 0x0180074b, 0x066c0045, 0x0481079e, 0x03209009, + 0x01800781, 0x03209011, 0x01800781, 0x02209007, + 0x01800781, 0x03209003, 0x01800781, 0x00497043, + 0x07818736, 0x00494043, 0x04810740, 0x02209001, + 0x01800781, 0x072d6000, 0x027c0045, 0x03080000, + 0x07818730, 0x060ff0d0, 0x0179feff, 0x0700ffff, + 0x057dfeff, 0x0700ffff, 0x058107ac, 0x01800730, + 0x0220900d, 0x01800781, 0x0320900f, 0x01800781, + 0x03493000, 0x04810754, 0x027c0045, 0x070a0000, + 0x0581075f, 0x0220900b, 0x01800781, 0x0320900c, + 0x01800759, 0x02209013, 0x05308000, 0x01012000, + 0x06a00602, 0x008001da, 0x03209005, 0x01800781, + 0x072e500c, 0x00208002, 0x06a00607, 0x02800010, + 0x02209015, 0x01800781, 0x05308000, 0x05007000, + 0x070090d1, 0x0379ff09, 0x0700ffff, 0x06a00602, + 0x03209017, 0x01800781, 0x033e5000, 0x06000080, + 0x02209019, 0x01800781, 0x033e5000, 0x06000080, + 0x060ff0d0, 0x0179feff, 0x0700ffff, 0x057dfeff, + 0x0700ffff, 0x04818010, 0x02400058, 0x00642058, + 0x06820010, 0x033e5000, 0x06000080, 0x04058051, + 0x0320901b, 0x01800781, 0x05308000, 0x01012000, + 0x06a00602, 0x008001cd, 0x05a002ac, 0x070ff02e, + 0x045c0479, 0x0581078d, 0x05308000, 0x05008000, + 0x06009079, 0x06a00602, 0x07c00000, 0x034900e4, + 0x06818798, 0x013e4000, 0x070000c0, 0x07f00000, + 0x034900e4, 0x07818796, 0x07c00000, 0x013e4000, + 0x06000080, 0x07f00000, 0x07f00000, 0x07f00000, + 0x034900e4, 0x05810790, 0x00800798, 0x072d6000, + 0x070ff0d1, 0x0179feff, 0x0700ffff, 0x017c1cff, + 0x070000fc, 0x0681875d, 0x079087a5, 0x00910738, + 0x010410a6, 0x0379ff41, 0x037fffff, 0x03800066, + 0x072d6000, 0x05a00863, 0x020ef004, 0x01860765, + 0x04602604, 0x050f80ff, 0x032fa009, 0x060ff0d0, + 0x0179feff, 0x0700ffff, 0x055c0400, 0x07818763, + 0x06600004, 0x050f80ff, 0x032fa009, 0x07f00000, + 0x074b0000, 0x05002000, 0x0769ff00, 0x01640800, + 0x05820765, 0x01640e00, 0x07828765, 0x070ff036, + 0x045c0404, 0x068187ce, 0x050f8030, 0x032fa009, + 0x0379ff00, 0x0700ffff, 0x070ff0d1, 0x0179feff, + 0x0700ffff, 0x055c0400, 0x05810763, 0x04482034, + 0x0481077c, 0x06483034, 0x0681877c, 0x070ff0d4, + 0x077800ff, 0x070000f0, 0x037c00ff, 0x06000010, + 0x058107ff, 0x024900e5, 0x068187df, 0x033e5000, + 0x070000c0, 0x07f00000, 0x024900e5, 0x058107e2, + 0x033e5000, 0x06000080, 0x02800010, 0x04601c04, + 0x050f80ff, 0x053fa809, 0x06000020, 0x030ef041, + 0x0086076d, 0x062d6002, 0x05602c41, 0x050f80ff, + 0x012fa809, 0x060ff0d0, 0x074b00ff, 0x045c0401, + 0x068187fd, 0x062d6001, 0x07602e41, 0x050f80ff, + 0x053fa809, 0x06000001, 0x070ff0d1, 0x054b80ff, + 0x074b0003, 0x055c0403, 0x068187fd, 0x033e5000, + 0x06000080, 0x01800895, 0x07600041, 0x008007e3, + 0x024900e5, 0x07818806, 0x033e5000, 0x070000c0, + 0x07f00000, 0x024900e5, 0x05810809, 0x033e5000, + 0x06000080, 0x02800010, 0x05a0084e, 0x030ef041, + 0x01860771, 0x04058051, 0x072d6000, 0x07601241, + 0x050f80ff, 0x012fa809, 0x0600a0d0, 0x0500b0d1, + 0x062d6001, 0x07f00000, 0x07f00000, 0x0600c0d0, + 0x0500d0d1, 0x062d6002, 0x0279ff0d, 0x07ff0000, + 0x044d800d, 0x060ff0d0, 0x074b00ff, 0x065a000d, + 0x06601401, 0x050f80ff, 0x073fa022, 0x07000005, + 0x0079fe0d, 0x070000ff, 0x050020ff, 0x05602c41, + 0x050f80ff, 0x073fa00a, 0x06000001, 0x020ef004, + 0x0186084b, 0x04601c04, 0x050f80ff, 0x053fa809, + 0x06000001, 0x050f80ff, 0x053fa80a, 0x06000020, + 0x07f00000, 0x07602e41, 0x050f80ff, 0x073fa009, + 0x06000001, 0x0279ff02, 0x070000ff, 0x0678000d, + 0x0700ff00, 0x065a0002, 0x07602e41, 0x050f80ff, + 0x073fa00a, 0x06000001, 0x07f00000, 0x07600041, + 0x050f80ff, 0x053fa80a, 0x06000001, 0x07f00000, + 0x07601441, 0x050f80ff, 0x073fa00a, 0x06000002, + 0x033e5000, 0x06000080, 0x01800895, 0x040f8032, + 0x073fa011, 0x06000001, 0x060ff002, 0x055c0403, + 0x07818856, 0x00041051, 0x07c00000, 0x04600402, + 0x04500432, 0x050f80ff, 0x053fa809, 0x06000020, + 0x07f00000, 0x00400402, 0x01680eff, 0x070030ff, + 0x040f8032, 0x053fa80a, 0x06000001, 0x07c00000, + 0x05004036, 0x060000d0, 0x0179fe00, 0x0700ffff, + 0x057dfeff, 0x0700ffff, 0x05810882, 0x070000d1, + 0x0379ff00, 0x0700ffff, 0x06005051, 0x060ff031, + 0x05500405, 0x050f80ff, 0x073fa009, 0x06000002, + 0x020ef004, 0x0086087c, 0x04600404, 0x050f80ff, + 0x012fa809, 0x0079fe01, 0x0700ffff, 0x055c0400, + 0x05810882, 0x01400405, 0x070050ff, 0x057de0ff, + 0x06000007, 0x0681886e, 0x04004051, 0x07c00000, + 0x072d6000, 0x07f00000, 0x07f00000, 0x000110d0, + 0x010120d1, 0x062d6001, 0x07f00000, 0x07f00000, + 0x020130d0, 0x010140d1, 0x062d6002, 0x010170d4, + 0x07f00000, 0x020150d0, 0x030160d1, 0x053fa83a, + 0x06000008, 0x07c00000, 0x07600c41, 0x050f80ff, + 0x01202003, 0x073fa00a, 0x06000001, 0x07f00000, + 0x05601041, 0x050f80ff, 0x032fa069, 0x03800066, + 0xdcdab525, 0x02800004, 0x00000000, 0x00008000, + 0x0000068c, 0x040f801f, 0x012fa8c9, 0x040f801f, + 0x063fa091, 0x06000010, 0x03200005, 0x07420000, + 0x050fb000, 0x040f801f, 0x073fa011, 0x06000038, + 0x040f801f, 0x053fa859, 0x0700003a, 0x050fe000, + 0x0581800a, 0x0684004a, 0x04958019, 0x030e0011, + 0x072e4200, 0x03800014, 0x0291001f, 0x050010c0, + 0x04482001, 0x0781811e, 0x06483001, 0x078181a6, + 0x02920029, 0x068b0029, 0x008a01ab, 0x050010c0, + 0x06780001, 0x050007c0, 0x068182fe, 0x06780001, + 0x0500f800, 0x05818348, 0x0291003e, 0x050fe02b, + 0x0286003e, 0x03681e1d, 0x03d0002e, 0x0380035c, + 0x0280003e, 0x0280003e, 0x0280003e, 0x0280003e, + 0x0280038a, 0x0280003e, 0x0280003e, 0x0380039f, + 0x0280003e, 0x0280003e, 0x0280003e, 0x0280003e, + 0x0280003e, 0x0280003e, 0x0280003e, 0x039200cf, + 0x040fe031, 0x0286004a, 0x06000013, 0x050fb000, + 0x066c0073, 0x048104ae, 0x014920e4, 0x0481804a, + 0x03400000, 0x076c0a00, 0x05818042, 0x0696004c, + 0x03b900f3, 0x05908014, 0x010170e1, 0x07780017, + 0x03e00000, 0x068100b5, 0x050010ff, 0x0179fe17, + 0x031fffff, 0x070000ff, 0x05600800, 0x050f80ff, + 0x073fa009, 0x06000001, 0x06780002, 0x02800040, + 0x037c00ff, 0x03800000, 0x0681006b, 0x0249f002, + 0x068100ce, 0x0448e002, 0x0681006b, 0x05600e00, + 0x050f80ff, 0x073fa009, 0x06000001, 0x06780002, + 0x07ffff00, 0x037c00ff, 0x05000200, 0x048180ce, + 0x064bd401, 0x02d0006d, 0x038000cc, 0x02800075, + 0x0280007f, 0x02800089, 0x03800093, 0x0280009d, + 0x028000ab, 0x038000cc, 0x050fe027, 0x00868079, + 0x01028000, 0x0280007c, 0x07600027, 0x050f80ff, + 0x032fa00a, 0x01027000, 0x0340002b, 0x028000ce, + 0x040fe025, 0x00868083, 0x03026000, 0x02800086, + 0x06600025, 0x050f80ff, 0x032fa00a, 0x03025000, + 0x0340002b, 0x028000ce, 0x050fe021, 0x0186808d, + 0x01022000, 0x03800090, 0x07600021, 0x050f80ff, + 0x032fa00a, 0x01021000, 0x0340002b, 0x028000ce, + 0x040fe023, 0x00868097, 0x01024000, 0x0380009a, + 0x06600023, 0x050f80ff, 0x032fa00a, 0x03023000, + 0x0340002b, 0x028000ce, 0x05600800, 0x050f80ff, + 0x012fa839, 0x0448e001, 0x058180a9, 0x06780004, + 0x07ffff00, 0x037c00ff, 0x05000700, 0x078100a9, + 0x04a00107, 0x028000ce, 0x050fd000, 0x028000ce, + 0x040fe029, 0x018680af, 0x0302a000, 0x038000b2, + 0x06600029, 0x050f80ff, 0x032fa00a, 0x03029000, + 0x0340002b, 0x028000ce, 0x01640817, 0x058280cc, + 0x070ff017, 0x02d000b9, 0x028000c1, 0x038000c3, + 0x038000c6, 0x038000c9, 0x038000cc, 0x038000cc, + 0x038000cc, 0x038000cc, 0x03e00000, 0x03800014, + 0x059080c3, 0x030160e1, 0x028000ce, 0x059080c6, + 0x030150e1, 0x028000ce, 0x059080c9, 0x010140e1, + 0x028000ce, 0x060fc013, 0x07a00684, 0x03800014, + 0x014940e4, 0x01a180d2, 0x0280004a, 0x02681e0d, + 0x050fb0ff, 0x04600876, 0x050f80ff, 0x053fa809, + 0x06000001, 0x05488003, 0x058180e1, 0x0400800d, + 0x0120d000, 0x013e4000, 0x05000200, 0x06009076, + 0x04002075, 0x06a00670, 0x07c00000, 0x072e4800, + 0x07000012, 0x018680e7, 0x060fc013, 0x07c00000, + 0x00012013, 0x0747f000, 0x05600800, 0x050f80ff, + 0x012fa839, 0x0249f001, 0x078100f9, 0x01012000, + 0x052e4c00, 0x07c00000, 0x050fd000, 0x07c00000, + 0x070000eb, 0x0349f000, 0x058180e8, 0x05600800, + 0x050f80ff, 0x012fa839, 0x06780004, 0x07ffff00, + 0x037c00ff, 0x07000300, 0x048180f1, 0x0448e001, + 0x048180f1, 0x0079c101, 0x07ffffff, 0x027a4b01, + 0x03800000, 0x05600800, 0x050f80ff, 0x012fa80a, + 0x07f00000, 0x06601807, 0x070030ff, 0x050f80ff, + 0x012fa809, 0x050f8003, 0x032fa00a, 0x040fe001, + 0x01860114, 0x04600201, 0x050f80ff, 0x032fa00a, + 0x07c00000, 0x050fe030, 0x02868119, 0x07030000, + 0x05031000, 0x0180011d, 0x07600030, 0x050f80ff, + 0x032fa00a, 0x07030000, 0x07c00000, 0x022c0004, + 0x056c041d, 0x04810134, 0x056c021d, 0x0481014c, + 0x056c081d, 0x04810180, 0x056c0e1d, 0x0481015e, + 0x076c061d, 0x0581019a, 0x0521d000, 0x0002e013, + 0x0202c013, 0x02020013, 0x0460021a, 0x050f80ff, + 0x053fa80a, 0x07000009, 0x03b600e2, 0x0484801f, + 0x0280004a, 0x040fe02c, 0x0086012a, 0x06000013, + 0x04001013, 0x0760122d, 0x050f80ff, 0x032fa012, + 0x07f00000, 0x0742002b, 0x0660002c, 0x050f80ff, + 0x053fa809, 0x06000001, 0x050fe003, 0x00860149, + 0x01028003, 0x0660002c, 0x050f80ff, 0x053fa80a, + 0x07000009, 0x0080019b, 0x00028013, 0x00027013, + 0x0080019b, 0x040fe02c, 0x00860129, 0x0742002b, + 0x0660002c, 0x050f80ff, 0x053fa809, 0x06000001, + 0x050fe003, 0x0086015b, 0x03026003, 0x0660002c, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x0080019b, + 0x02026013, 0x02025013, 0x0080019b, 0x040fe02c, + 0x00860129, 0x0742002b, 0x0660002c, 0x050f80ff, + 0x053fa809, 0x06000001, 0x050fe003, 0x0086016d, + 0x0302a003, 0x0660002c, 0x050f80ff, 0x053fa80a, + 0x07000009, 0x0180016f, 0x0202a013, 0x02029013, + 0x0647f020, 0x06486020, 0x07818174, 0x07a0034d, + 0x00800179, 0x007a0120, 0x04000101, 0x07a0034d, + 0x0400802c, 0x07a00669, 0x0349a0e4, 0x0581017d, + 0x0421d008, 0x0080012a, 0x02948129, 0x0521d005, + 0x0080012a, 0x040fe02c, 0x00860129, 0x0742002b, + 0x0660002c, 0x050f80ff, 0x053fa809, 0x06000001, + 0x050fe003, 0x0086018f, 0x01022003, 0x0660002c, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x00800191, + 0x00022013, 0x00021013, 0x0647f020, 0x007a0120, + 0x04000101, 0x07a0034d, 0x0400802c, 0x07a00669, + 0x02948129, 0x0521d005, 0x0080012a, 0x00800132, + 0x0647f020, 0x06486020, 0x078181a0, 0x07a0034d, + 0x00800129, 0x007a0120, 0x04000101, 0x07a0034d, + 0x0400802c, 0x07a00669, 0x00800129, 0x040fd02c, + 0x052e4003, 0x00208010, 0x07a00669, 0x00800132, + 0x00018098, 0x07480018, 0x068181bc, 0x05481018, + 0x068181ba, 0x05482018, 0x078181b8, 0x07483018, + 0x068181b6, 0x002fb004, 0x018001bd, 0x012fb003, + 0x018001bd, 0x002fb002, 0x018001bd, 0x002fb001, + 0x018001bd, 0x012fb000, 0x0179fe78, 0x070000ff, + 0x030190ff, 0x00017086, 0x048b01c1, 0x03385000, + 0x03020000, 0x07780017, 0x00430407, 0x068182a7, + 0x046c0419, 0x04810246, 0x046c0219, 0x048101cd, + 0x07219000, 0x0080022a, 0x07219000, 0x07483017, + 0x05810230, 0x05482017, 0x04810237, 0x0448b075, + 0x0681822a, 0x04601676, 0x050f80ff, 0x073fa022, + 0x0600003e, 0x06000080, 0x05001081, 0x05002082, + 0x06003083, 0x05004084, 0x06601e76, 0x050f80ff, + 0x022fa02a, 0x04487075, 0x04810229, 0x06604476, + 0x050f80ff, 0x032fa009, 0x03680600, 0x056c02ff, + 0x06818223, 0x07000090, 0x074b0000, 0x050fe000, + 0x00860223, 0x0560027b, 0x050f80ff, 0x032fa009, + 0x07f00000, 0x05600e00, 0x050f80ff, 0x032fa009, + 0x07f00000, 0x074b0000, 0x070ff08d, 0x0179feff, + 0x070000ff, 0x055c0400, 0x04810223, 0x070ff017, + 0x037a00ff, 0x05000400, 0x010170ff, 0x04603e76, + 0x050f80ff, 0x034a8400, 0x034a8800, 0x05780100, + 0x070000ff, 0x055a0400, 0x074b0a00, 0x077bff00, + 0x070000ff, 0x032fa00a, 0x07f00000, 0x06603c76, + 0x050f80ff, 0x07300fff, 0x070fffff, 0x032fa00a, + 0x07f00000, 0x06604876, 0x050f80ff, 0x0700008d, + 0x017a0100, 0x07ffff00, 0x032fa00a, 0x07f00000, + 0x04604a76, 0x050f80ff, 0x07300fff, 0x070fffff, + 0x032fa00a, 0x07f00000, 0x04604076, 0x050f80ff, + 0x06000013, 0x032fa00a, 0x0245a075, 0x018002af, + 0x06603c76, 0x050f80ff, 0x053fa842, 0x06000045, + 0x058b0227, 0x02085013, 0x07219000, 0x07780078, + 0x07ffff00, 0x045a0419, 0x010780ff, 0x0484801f, + 0x0280004a, 0x040fe07f, 0x0186023f, 0x05a0025f, + 0x0092022a, 0x040fe07f, 0x07a6825f, 0x0080022a, + 0x0760127b, 0x050f80ff, 0x032fa009, 0x0744f000, + 0x0760127b, 0x050f80ff, 0x032fa00a, 0x018001d4, + 0x052e400c, 0x040080fb, 0x046aa108, 0x06009076, + 0x04002075, 0x06a00670, 0x0080022a, 0x06219001, + 0x05482017, 0x05810253, 0x048b0249, 0x060ff086, + 0x0349f0ff, 0x078181c0, 0x07483017, 0x05810250, + 0x050fd0ff, 0x040fe07f, 0x07a6825f, 0x0080022a, + 0x05004084, 0x04a002e0, 0x0092022a, 0x070ff07d, + 0x0450047c, 0x056004ff, 0x050f80ff, 0x032fa009, + 0x070ff000, 0x00540479, 0x030790ff, 0x00800237, + 0x04487075, 0x04810267, 0x04605276, 0x050f80ff, + 0x032fa009, 0x060ff079, 0x01540400, 0x01800269, + 0x060ff079, 0x0054047a, 0x058202a0, 0x058102a0, + 0x070ff07d, 0x0450047c, 0x050f80ff, 0x002fa819, + 0x058b026f, 0x034960e4, 0x05810278, 0x02681e01, + 0x06818276, 0x03642203, 0x07828278, 0x013e4000, 0x07003000, 0x02080001, 0x00081002, 0x01082003, - 0x03079003, 0x04487075, 0x0781054e, 0x04605276, - 0x050f80ff, 0x032fa009, 0x03083000, 0x0280054f, - 0x0208307a, 0x0340007e, 0x0642007f, 0x0781056f, - 0x070ff07e, 0x05a0028b, 0x0192856f, 0x02800586, - 0x078b0556, 0x04601676, 0x050f80ff, 0x073fa041, - 0x0600003e, 0x07f00000, 0x04487075, 0x06810562, - 0x04605276, 0x050f80ff, 0x032fa009, 0x03083000, - 0x034960e4, 0x0781056f, 0x014980e4, 0x0581856f, - 0x06601e76, 0x050f80ff, 0x022fa019, 0x03681e00, - 0x0481856d, 0x02642202, 0x0582856f, 0x013e4000, - 0x07003000, 0x04602676, 0x050f80ff, 0x073fa009, - 0x06000007, 0x0008400e, 0x04487075, 0x0681057f, - 0x068b0576, 0x06603c76, 0x050f80ff, 0x053fa841, - 0x06000045, 0x078b057b, 0x02385001, 0x03010000, - 0x03800582, 0x068b057f, 0x03385000, 0x03010000, - 0x06219001, 0x040fe07f, 0x02860586, 0x0180025f, - 0x07c00000, 0x00683e75, 0x0681058c, 0x0448d075, - 0x068105ba, 0x028005f2, 0x06a0065d, 0x008004f1, - 0x0197859c, 0x07602418, 0x050f80ff, 0x012fa809, - 0x06780001, 0x070000ff, 0x075a0000, 0x05602618, - 0x050f80ff, 0x012fa809, 0x060ff001, 0x0569feff, - 0x054b08ff, 0x075a0000, 0x05600418, 0x050f80ff, - 0x012fa809, 0x040fe007, 0x018685a3, 0x01204000, - 0x038005b1, 0x00700101, 0x03010000, 0x06780001, - 0x07ff0000, 0x076c00ff, 0x048185ab, 0x00700101, - 0x03010000, 0x05600418, 0x050f80ff, 0x012fa80a, - 0x06780001, 0x07ff0000, 0x050040ff, 0x0279ff01, - 0x0700ffff, 0x05602618, 0x050f80ff, 0x073fa009, - 0x06000001, 0x0279ff02, 0x0700ffff, 0x07c00000, - 0x04007076, 0x0448b075, 0x078105d4, 0x03200011, - 0x06006076, 0x04a004a8, 0x007a0101, 0x07060000, - 0x07303000, 0x07008290, 0x07600018, 0x050f80ff, - 0x053fa809, 0x07000003, 0x0448e007, 0x058185cc, - 0x06006013, 0x038005ed, 0x02400010, 0x078105cc, - 0x06006010, 0x04603476, 0x050f80ff, 0x073fa00a, - 0x07000003, 0x038005ed, 0x0600007a, 0x02493075, - 0x058185dd, 0x04602c76, 0x050f80ff, 0x032fa009, - 0x060ff07a, 0x05500400, 0x070000ff, 0x06473075, - 0x04602c76, 0x050f80ff, 0x032fa00a, 0x05a004a3, - 0x007a0101, 0x03010000, 0x06303008, 0x05008000, - 0x0049b075, 0x068105ec, 0x06603676, 0x050f80ff, - 0x073fa009, 0x06000002, 0x0600600e, 0x050f8074, - 0x032fa03a, 0x053079a0, 0x0700000c, 0x03800639, - 0x00683e75, 0x076c0aff, 0x0781060f, 0x04007013, - 0x03200011, 0x06006076, 0x04a004a8, 0x007a0101, - 0x03070000, 0x04602a76, 0x050f80ff, 0x053fa809, - 0x06000001, 0x03499003, 0x07810606, 0x07303000, - 0x07008890, 0x053079a0, 0x0700000c, 0x0380060a, - 0x07303000, 0x04008980, 0x04307920, 0x0700000c, - 0x074d0005, 0x06006013, 0x050f8074, 0x032fa03a, - 0x03800639, 0x04602c76, 0x050f80ff, 0x032fa009, - 0x060ff07a, 0x05500400, 0x070000ff, 0x06473075, - 0x04602c76, 0x050f80ff, 0x032fa00a, 0x04007076, - 0x05a004a3, 0x007a0101, 0x03010000, 0x06303008, - 0x07008800, 0x074d0005, 0x0049b075, 0x07810627, + 0x058b027b, 0x04487075, 0x05810281, 0x02385001, + 0x03010000, 0x00800283, 0x03385000, 0x03010000, + 0x02400019, 0x070ff003, 0x04500479, 0x030790ff, + 0x0340007e, 0x0642007f, 0x058102a0, 0x070ff07e, + 0x050f80ff, 0x032fa009, 0x050fe000, 0x0386829f, + 0x070ff07d, 0x056002ff, 0x050f80ff, 0x032fa009, + 0x0107d000, 0x008602a1, 0x07600a7d, 0x050f80ff, + 0x032fa009, 0x03681e00, 0x0550041b, 0x050f80ff, + 0x032fa009, 0x0107e000, 0x070ff07e, 0x0180028b, + 0x0307c000, 0x07c00000, 0x052e400c, 0x040080fb, + 0x046aa108, 0x06009076, 0x04002075, 0x02800670, + 0x040fd076, 0x050fd017, 0x060ff086, 0x077800ff, + 0x07000060, 0x037c00ff, 0x07000060, 0x078182a9, + 0x07780078, 0x07ffff00, 0x045a0419, 0x010780ff, + 0x04487075, 0x058102ca, 0x07780017, 0x05000400, + 0x058102ca, 0x04601676, 0x050f80ff, 0x073fa022, + 0x0600003e, 0x0249a075, 0x078182c3, 0x058b02be, + 0x06603c76, 0x050f80ff, 0x053fa842, 0x06000045, + 0x052e400c, 0x040080fb, 0x026b4108, 0x06009076, + 0x04002075, 0x06a00670, 0x02800029, 0x04601676, + 0x050f80ff, 0x073fa022, 0x0600003e, 0x052e400c, + 0x04600876, 0x050f80ff, 0x053fa809, 0x06000001, + 0x05488003, 0x048102da, 0x0400d0fb, 0x066a810d, + 0x013e4000, 0x07000300, 0x02800029, 0x040080fb, + 0x066a8108, 0x06009076, 0x04002075, 0x06a00670, + 0x02800029, 0x0240007f, 0x0742007e, 0x050f807e, + 0x032fa009, 0x050fe000, 0x038682fa, 0x070ff07d, + 0x055c047b, 0x048102ef, 0x0760007d, 0x050f80ff, + 0x032fa009, 0x050fe000, 0x028682ef, 0x070ff07b, + 0x0107d0ff, 0x07600a7d, 0x050f80ff, 0x032fa009, + 0x03681e00, 0x0450041c, 0x0107e0ff, 0x050f80ff, + 0x032fa009, 0x050fe000, 0x018602fc, 0x0307c000, + 0x07c00000, 0x040fd076, 0x03800684, 0x010180c0, + 0x0548e018, 0x05818317, 0x0748f018, 0x04818313, + 0x03490018, 0x0581830f, 0x01491018, 0x0481830b, + 0x073c0000, 0x06000040, 0x02200004, 0x0280031a, + 0x073c0000, 0x06000020, 0x03200003, 0x0280031a, + 0x073c0000, 0x06000010, 0x02200002, 0x0280031a, + 0x073c0000, 0x06000008, 0x02200001, 0x0280031a, + 0x073c0000, 0x06000004, 0x06000013, 0x050fb000, + 0x040fe076, 0x0286033d, 0x046c0273, 0x04818329, + 0x0448b075, 0x07810330, 0x06000013, 0x04001013, + 0x0760127b, 0x050f80ff, 0x032fa012, 0x0046b075, + 0x03b600e2, 0x02800331, 0x066c0073, 0x0781032e, + 0x040fd076, 0x07a00684, 0x03800014, 0x040fd076, + 0x02800331, 0x00452075, 0x00077013, 0x0647f075, + 0x06486075, 0x04818337, 0x07a00353, 0x0280033d, + 0x007a0175, 0x04000101, 0x07a00353, 0x04008076, + 0x0245f008, 0x07a00669, 0x07273000, 0x05600272, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x0379ff78, + 0x070000ff, 0x02076013, 0x02075013, 0x0484801f, + 0x0280004a, 0x070fc0ff, 0x052e400c, 0x00208020, + 0x07a00669, 0x02800346, 0x06000020, 0x04001016, + 0x0460082c, 0x050f80ff, 0x032fa012, 0x07c00000, + 0x06000075, 0x040010a2, 0x044b0801, 0x060ff016, + 0x065a0001, 0x04600876, 0x050f80ff, 0x032fa012, + 0x07c00000, 0x040fe02a, 0x02860362, 0x0421d007, + 0x0202c02a, 0x07a003a6, 0x0380037e, 0x050fe022, + 0x0286036d, 0x0421d004, 0x0302c022, 0x07a003a6, + 0x04488020, 0x0781037e, 0x040fd02c, 0x0521d000, + 0x0202c013, 0x02020013, 0x040fe026, 0x03860384, + 0x0421d001, 0x0202c026, 0x07a003a6, 0x00683e20, + 0x070060ff, 0x056c0206, 0x078103d8, 0x056c0406, + 0x068103ef, 0x076c0606, 0x05810465, 0x04488020, + 0x04818380, 0x056c1606, 0x04810473, 0x07a00660, + 0x02800398, 0x040fd02c, 0x0521d000, 0x0202c013, + 0x02020013, 0x050fe028, 0x02860398, 0x0302c028, + 0x0421d002, 0x07a003a6, 0x028003ad, 0x040fe02a, + 0x03860390, 0x0421d007, 0x0202c02a, 0x07a003a6, + 0x02800397, 0x050fe022, 0x02860398, 0x0421d004, + 0x0302c022, 0x07a003a6, 0x04488020, 0x0581839a, + 0x07a00660, 0x0484803e, 0x0280004a, 0x040fd02c, + 0x0521d000, 0x0202c013, 0x02020013, 0x02800398, + 0x040fe02a, 0x02860398, 0x0421d007, 0x0202c02a, + 0x07a003a6, 0x07a00660, 0x02800398, 0x0460082c, + 0x050f80ff, 0x032fa039, 0x03020000, 0x0102d005, + 0x01018006, 0x07c00000, 0x0400702c, 0x05a004a6, + 0x007a0101, 0x07060000, 0x07303000, 0x07008290, + 0x07600018, 0x050f80ff, 0x053fa809, 0x07000003, + 0x0448e007, 0x058183bb, 0x06006013, 0x028003c2, + 0x02400010, 0x078103bb, 0x06006010, 0x0460342c, + 0x050f80ff, 0x073fa00a, 0x07000003, 0x050f801e, + 0x032fa03a, 0x063aa020, 0x06000002, 0x013e4000, + 0x07000030, 0x029803c8, 0x070ff0f6, 0x036830ff, + 0x058183c9, 0x070f001e, 0x0760122d, 0x050f10ff, + 0x063f3c08, 0x0600000d, 0x013e4000, 0x06000020, + 0x040f801a, 0x0320000a, 0x022017d0, 0x032fa012, + 0x02800398, 0x04007013, 0x05a004a6, 0x007a0101, + 0x07050000, 0x07303000, 0x07008890, 0x074d0005, + 0x06006013, 0x050f801e, 0x032fa03a, 0x07f00000, + 0x05601c2d, 0x050f80ff, 0x022fa019, 0x04001002, + 0x04002013, 0x040f801f, 0x022fa01a, 0x073aa00c, + 0x06000002, 0x07300c03, 0x0600000d, 0x01800493, + 0x04007013, 0x05a004a6, 0x007a0101, 0x03070000, + 0x04602a2c, 0x050f80ff, 0x073fa009, 0x06000004, + 0x02499008, 0x078103fc, 0x07303000, 0x07008890, + 0x028003fe, 0x07303000, 0x04008980, 0x05007003, + 0x074d0005, 0x06006013, 0x050f801e, 0x032fa03a, + 0x07f00000, 0x0560162d, 0x050f80ff, 0x032fa021, + 0x07f00000, 0x064b0002, 0x02499008, 0x0581040c, + 0x0644c002, 0x054b0400, 0x050040ff, 0x06698104, + 0x07818421, 0x06000013, 0x04001013, 0x04780102, + 0x06000010, 0x06003013, 0x04004013, 0x06005013, + 0x06006013, 0x04007013, 0x00644015, 0x0582041d, + 0x04448002, 0x02205008, 0x040f801f, 0x032fa042, + 0x04008015, 0x0080045d, 0x046c8004, 0x0681842f, + 0x01208018, 0x06780002, 0x07000003, 0x06818432, + 0x06003001, 0x06000013, 0x04001013, 0x04004013, + 0x06005013, 0x040f801f, 0x022fa032, 0x0080045d, + 0x040fd02c, 0x07a00684, 0x03800014, 0x0379ff03, + 0x070000ff, 0x04488002, 0x05810439, 0x070ff003, + 0x04500408, 0x050080ff, 0x0379ff00, 0x070000ff, + 0x06489002, 0x04810440, 0x070ff000, 0x04500408, + 0x050080ff, 0x07005003, 0x05004000, 0x06003001, + 0x06000013, 0x04001013, 0x040f801f, 0x022fa032, + 0x07f00000, 0x07601e2d, 0x050f80ff, 0x022fa031, + 0x07f00000, 0x06600c1f, 0x050f80ff, 0x022fa032, + 0x02680608, 0x0481045d, 0x016408ff, 0x057dfeff, + 0x07ffffff, 0x034000ff, 0x045a0407, 0x070000ff, + 0x0760061e, 0x050f80ff, 0x032fa00a, 0x07f00000, + 0x06600908, 0x0669f908, 0x027a0008, 0x06000020, + 0x070aa0ff, 0x024a2408, 0x037a00ff, 0x060000dc, + 0x070000ff, 0x01800493, 0x04007013, 0x05a004a6, + 0x007a0101, 0x07030000, 0x07303000, 0x07008190, + 0x06006013, 0x050f801e, 0x032fa03a, 0x073aa000, + 0x06000002, 0x07300c00, 0x07000005, 0x01800493, + 0x04007013, 0x05a004a6, 0x007a0101, 0x07810000, + 0x07303000, 0x07000090, 0x06006013, 0x04600e2c, + 0x050f80ff, 0x053fa809, 0x07000003, 0x04780107, + 0x07ffff00, 0x007c0107, 0x07000500, 0x06818486, + 0x07303000, 0x05000890, 0x074d0005, 0x04602a2c, + 0x050f80ff, 0x053fa809, 0x07000003, 0x0049d007, + 0x0581048d, 0x02206001, 0x050f801e, 0x032fa03a, + 0x073aa000, 0x06000002, 0x07300c00, 0x07000005, + 0x013e4000, 0x07000030, 0x01980495, 0x070ff0f6, + 0x036830ff, 0x07818496, 0x070f001e, 0x040f101f, + 0x070f3000, 0x013e4000, 0x06000020, 0x040f801a, + 0x0320000a, 0x022017d0, 0x032fa012, 0x02800398, + 0x03200000, 0x06006076, 0x008004a8, 0x03200011, + 0x0600602c, 0x07a0058e, 0x05600406, 0x050f80ff, + 0x053fa809, 0x06000002, 0x07c00000, 0x02076031, + 0x04600876, 0x050f80ff, 0x032fa039, 0x03075000, + 0x0107b005, 0x01018006, 0x06600076, 0x050020ff, + 0x050f80ff, 0x032fa011, 0x05031000, 0x038684c5, + 0x04031001, 0x038684c3, 0x06030013, 0x07601818, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x008004cb, + 0x06030001, 0x008004cb, 0x040fe001, 0x018604be, + 0x07600030, 0x050f80ff, 0x012fa80a, 0x06030001, + 0x06000013, 0x04001013, 0x040f8002, 0x032fa012, + 0x06273001, 0x0448b075, 0x068184d6, 0x06602276, + 0x050f80ff, 0x053fa811, 0x0700003c, 0x0179fe78, + 0x070000ff, 0x030190ff, 0x038684de, 0x04a004f2, + 0x00078019, 0x009204f1, 0x03800587, 0x040fd076, + 0x040fd019, 0x04600276, 0x050020ff, 0x050f80ff, + 0x032fa009, 0x040f8002, 0x053fa80a, 0x07000009, + 0x050fe000, 0x038684ee, 0x07601818, 0x050f80ff, + 0x053fa80a, 0x07000009, 0x008004ef, 0x05a00114, + 0x07273000, 0x02076013, 0x0280004a, 0x048b04f2, + 0x03385000, 0x07030000, 0x05600818, 0x050f80ff, + 0x032fa009, 0x07f00000, 0x054b0400, 0x0308a0ff, + 0x04487075, 0x06810515, 0x06604476, 0x050f80ff, + 0x012fa811, 0x00680701, 0x046c0201, 0x04818515, + 0x0279ff02, 0x070000ff, 0x0379ff00, 0x070000ff, + 0x05001000, 0x060ff002, 0x01540400, 0x06820513, + 0x04001002, 0x060ff001, 0x04500402, 0x070030ff, + 0x01540400, 0x06820513, 0x05001003, 0x0581850c, + 0x00088001, 0x03800518, 0x0179fe00, 0x070000ff, + 0x010880ff, 0x0448b075, 0x0681052f, 0x0560167b, + 0x050f80ff, 0x002fa819, 0x02080002, 0x01081003, + 0x064b0001, 0x00082001, 0x034960e4, 0x06810529, + 0x02681e02, 0x05818527, 0x02642201, 0x04828529, + 0x013e4000, 0x07003000, 0x02083001, 0x02079001, + 0x0207a001, 0x00084013, 0x0207f013, 0x0280057f, + 0x06485075, 0x07810556, 0x02465075, 0x04601676, + 0x050f80ff, 0x073fa021, 0x0600003e, 0x070ff07d, + 0x0450047c, 0x050f80ff, 0x002fa819, 0x078b053a, + 0x034960e4, 0x06810543, 0x02681e01, 0x05818541, + 0x03642203, 0x04828543, 0x013e4000, 0x07003000, + 0x02080001, 0x00081002, 0x01082003, 0x03079003, + 0x04487075, 0x0781054e, 0x04605276, 0x050f80ff, + 0x032fa009, 0x03083000, 0x0280054f, 0x0208307a, + 0x0340007e, 0x0642007f, 0x0781056f, 0x070ff07e, + 0x05a0028b, 0x0192856f, 0x02800586, 0x078b0556, + 0x04601676, 0x050f80ff, 0x073fa041, 0x0600003e, + 0x07f00000, 0x04487075, 0x06810562, 0x04605276, + 0x050f80ff, 0x032fa009, 0x03083000, 0x034960e4, + 0x0781056f, 0x014980e4, 0x0581856f, 0x06601e76, + 0x050f80ff, 0x022fa019, 0x03681e00, 0x0481856d, + 0x02642202, 0x0582856f, 0x013e4000, 0x07003000, + 0x04602676, 0x050f80ff, 0x073fa009, 0x06000007, + 0x0008400e, 0x04487075, 0x0681057f, 0x068b0576, + 0x06603c76, 0x050f80ff, 0x053fa841, 0x06000045, + 0x078b057b, 0x02385001, 0x03010000, 0x03800582, + 0x068b057f, 0x03385000, 0x03010000, 0x06219001, + 0x040fe07f, 0x02860586, 0x0180025f, 0x07c00000, + 0x00683e75, 0x0681058c, 0x0448d075, 0x068105c1, + 0x038005f9, 0x06a00664, 0x008004f1, 0x0197859c, + 0x07602418, 0x050f80ff, 0x012fa809, 0x06780001, + 0x070000ff, 0x075a0000, 0x05602618, 0x050f80ff, + 0x012fa809, 0x060ff001, 0x0569feff, 0x054b08ff, + 0x075a0000, 0x05600418, 0x050f80ff, 0x012fa809, + 0x040fe007, 0x018685a3, 0x01204000, 0x038005b8, + 0x05600e06, 0x050f80ff, 0x073fa009, 0x06000002, + 0x07f00000, 0x064d0004, 0x00700104, 0x03010000, + 0x06780004, 0x07ff0000, 0x076c00ff, 0x058185b1, + 0x00700104, 0x03010000, 0x064d0004, 0x05600e06, + 0x050f80ff, 0x073fa00a, 0x06000002, 0x07f00000, + 0x044b0804, 0x0279ff01, 0x0700ffff, 0x05602618, + 0x050f80ff, 0x073fa009, 0x06000001, 0x0279ff02, + 0x0700ffff, 0x07c00000, 0x04007076, 0x0448b075, + 0x078105db, 0x03200011, 0x06006076, 0x04a004a8, + 0x007a0101, 0x07060000, 0x07303000, 0x07008290, + 0x07600018, 0x050f80ff, 0x053fa809, 0x07000003, + 0x0448e007, 0x048185d3, 0x06006013, 0x028005f4, + 0x02400010, 0x068105d3, 0x06006010, 0x04603476, + 0x050f80ff, 0x073fa00a, 0x07000003, 0x028005f4, + 0x0600007a, 0x02493075, 0x058185e4, 0x04602c76, + 0x050f80ff, 0x032fa009, 0x060ff07a, 0x05500400, + 0x070000ff, 0x06473075, 0x04602c76, 0x050f80ff, + 0x032fa00a, 0x05a004a3, 0x007a0101, 0x03010000, + 0x06303008, 0x05008000, 0x0049b075, 0x078105f3, 0x06603676, 0x050f80ff, 0x073fa009, 0x06000002, - 0x0280062f, 0x06600a76, 0x050f80ff, 0x073fa009, - 0x07000003, 0x07f00000, 0x054b0406, 0x045a0404, - 0x050040ff, 0x0600600e, 0x050f8074, 0x032fa03a, - 0x0648c075, 0x06810637, 0x06307d20, 0x0700000c, - 0x03800639, 0x04307920, 0x0700000c, 0x0049b075, - 0x07810641, 0x0447b075, 0x04600876, 0x050f80ff, - 0x053fa80a, 0x0700003a, 0x0246f007, 0x013e4000, - 0x07000030, 0x02980643, 0x070ff0f6, 0x074850ff, - 0x05818644, 0x050f2074, 0x060a0007, 0x040070fb, - 0x046a7007, 0x050f40ff, 0x013e4000, 0x06000020, - 0x0320000a, 0x022011f4, 0x00202004, 0x06003013, - 0x0678007a, 0x07fff000, 0x07810656, 0x0020200e, - 0x050f8072, 0x032fa022, 0x008004f1, 0x01208060, - 0x0600902c, 0x04002020, 0x03800669, 0x040080fb, - 0x066ae108, 0x06009076, 0x04002075, 0x03800669, - 0x03201100, 0x04848667, 0x06420001, 0x05818663, - 0x02800680, 0x020e0008, 0x07c00000, 0x050fd009, - 0x040fd008, 0x03201100, 0x04848670, 0x06420001, - 0x0581866c, 0x02800680, 0x007a0102, 0x04000101, - 0x05600809, 0x050f80ff, 0x073fa00a, 0x06000001, - 0x020e0008, 0x0684067a, 0x030e0009, 0x07c00000, - 0x01011009, 0x052e4300, 0x07c00000, 0x052e400f, - 0x01208090, 0x02800662, 0x070fc0ff, 0x040f8013, - 0x032fa009, 0x02800683, 0x59b90e13, 0xffeea974 + 0x0600600e, 0x050f8074, 0x032fa03a, 0x053079a0, + 0x0700000c, 0x02800640, 0x00683e75, 0x076c0aff, + 0x06810616, 0x04007013, 0x03200011, 0x06006076, + 0x04a004a8, 0x007a0101, 0x03070000, 0x04602a76, + 0x050f80ff, 0x053fa809, 0x06000001, 0x03499003, + 0x0681060d, 0x07303000, 0x07008890, 0x053079a0, + 0x0700000c, 0x03800611, 0x07303000, 0x04008980, + 0x04307920, 0x0700000c, 0x074d0005, 0x06006013, + 0x050f8074, 0x032fa03a, 0x02800640, 0x04602c76, + 0x050f80ff, 0x032fa009, 0x060ff07a, 0x05500400, + 0x070000ff, 0x06473075, 0x04602c76, 0x050f80ff, + 0x032fa00a, 0x04007076, 0x05a004a3, 0x007a0101, + 0x03010000, 0x06303008, 0x07008800, 0x074d0005, + 0x0049b075, 0x0781062e, 0x06603676, 0x050f80ff, + 0x073fa009, 0x06000002, 0x03800636, 0x06600a76, + 0x050f80ff, 0x073fa009, 0x07000003, 0x07f00000, + 0x054b0406, 0x045a0404, 0x050040ff, 0x0600600e, + 0x050f8074, 0x032fa03a, 0x0648c075, 0x0681063e, + 0x06307d20, 0x0700000c, 0x02800640, 0x04307920, + 0x0700000c, 0x0049b075, 0x07810648, 0x0447b075, + 0x04600876, 0x050f80ff, 0x053fa80a, 0x0700003a, + 0x0246f007, 0x013e4000, 0x07000030, 0x0298064a, + 0x070ff0f6, 0x074850ff, 0x0581864b, 0x050f2074, + 0x060a0007, 0x040070fb, 0x046a7007, 0x050f40ff, + 0x013e4000, 0x06000020, 0x0320000a, 0x022011f4, + 0x00202004, 0x06003013, 0x0678007a, 0x07fff000, + 0x0681065d, 0x0020200e, 0x050f8072, 0x032fa022, + 0x008004f1, 0x01208060, 0x0600902c, 0x04002020, + 0x02800670, 0x040080fb, 0x066ae108, 0x06009076, + 0x04002075, 0x02800670, 0x03201100, 0x0484866e, + 0x06420001, 0x0581866a, 0x03800687, 0x020e0008, + 0x07c00000, 0x050fd009, 0x040fd008, 0x03201100, + 0x05848677, 0x06420001, 0x04818673, 0x03800687, + 0x007a0102, 0x04000101, 0x05600809, 0x050f80ff, + 0x073fa00a, 0x06000001, 0x020e0008, 0x07840681, + 0x030e0009, 0x07c00000, 0x01011009, 0x052e4300, + 0x07c00000, 0x052e400f, 0x01208090, 0x03800669, + 0x070fc0ff, 0x040f8013, 0x032fa009, 0x0280068a, + 0x2bac147e, 0xffeea946 }; #endif diff --git a/sys/dev/ispfw/asm_2500.h b/sys/dev/ispfw/asm_2500.h index 13498231237..2e20cbb20ea 100644 --- a/sys/dev/ispfw/asm_2500.h +++ b/sys/dev/ispfw/asm_2500.h @@ -30,25 +30,25 @@ * * * ******************************************************************** */ /* - * Firmware Version 5.04.00 (12:35 Jul 02, 2010) + * Firmware Version 5.05.00 (15:48 Dec 14, 2010) */ #ifdef ISP_2500 static const uint32_t isp_2500_risc_code[] = { - 0x0501f042, 0x0010d000, 0x00100000, 0x00008a8f, - 0x00000005, 0x00000004, 0x00000000, 0x00000080, + 0x0501f042, 0x0010d000, 0x00100000, 0x00008b5c, + 0x00000005, 0x00000005, 0x00000000, 0x00008080, 0x00000004, 0x00000000, 0x20434f50, 0x59524947, 0x48542032, 0x30303720, 0x514c4f47, 0x49432043, 0x4f52504f, 0x52415449, 0x4f4e2020, 0x20495350, 0x32357878, 0x20466972, 0x6d776172, 0x65202020, - 0x56657273, 0x696f6e20, 0x2020352e, 0x30342e30, + 0x56657273, 0x696f6e20, 0x2020352e, 0x30352e30, 0x30202024, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00100000, 0x00100000, - 0x00008a8f, 0xffffffff, 0x0010d004, 0x00020000, + 0x00008b5c, 0xffffffff, 0x0010d004, 0x00020000, 0x00000a08, 0xffffffff, 0x0010da0c, 0x0010ad00, - 0x00001add, 0xffffffff, 0x0010f4e9, 0x0000c000, - 0x00000705, 0x00ffffff, 0x0010fbee, 0x00008000, - 0x000003e3, 0x00ffffff, 0x0010ffd1, 0x0000a000, - 0x0000046c, 0x00ffffff, 0x0011043d, 0x0000400e, + 0x00001ae5, 0xffffffff, 0x0010f4f1, 0x0000c000, + 0x00000705, 0x00ffffff, 0x0010fbf6, 0x00008000, + 0x000003ea, 0x00ffffff, 0x0010ffe0, 0x0000a000, + 0x00000475, 0x00ffffff, 0x00110455, 0x0000400e, 0x00000808, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4203f000, 0x00021fff, 0x40000000, 0x4203e000, 0x90000100, 0x40000000, @@ -56,17 +56,17 @@ static const uint32_t isp_2500_risc_code[] = { 0x50000000, 0x8c000500, 0x05020003, 0x42000800, 0x00020000, 0x45780800, 0x80040800, 0x82040580, 0x00022000, 0x05fe07fc, 0x4178a000, 0x4200a800, - 0x00108a8f, 0x42000800, 0x0010ad00, 0x40540000, - 0x8004b480, 0x0545f90a, 0x0501fbc5, 0x600c6020, + 0x00108b5c, 0x42000800, 0x0010ad00, 0x40540000, + 0x8004b480, 0x0545f9d4, 0x0501fbc5, 0x600c6020, 0x50304800, 0x8c240500, 0x0500001c, 0x59e00016, - 0x8c000504, 0x05020019, 0x0545f954, 0x604808fa, + 0x8c000504, 0x05020019, 0x0545fa1e, 0x604808fa, 0x50041000, 0x82081500, 0xfffffffc, 0x90081d43, 0x90081540, 0x84244d00, 0x440c0800, 0x44080800, 0x44246000, 0x64030000, 0x4203e000, 0x70000000, 0x4203e000, 0xb0300000, 0x603ff84e, 0x59e00016, 0x8c000504, 0x05020002, 0x05fe47fd, 0x84244d40, - 0x44246000, 0x0545f93d, 0x64030000, 0x0501f9e8, - 0x4803c856, 0x0505fdfd, 0x6413c020, 0x4203e000, + 0x44246000, 0x0545fa07, 0x64030000, 0x0501f9e8, + 0x4803c856, 0x0505fdfb, 0x6413c020, 0x4203e000, 0x6000000f, 0x640f70e8, 0x640f78e8, 0x640da8e8, 0x59e00023, 0x8c000500, 0x0502002b, 0x42002800, 0x00100022, 0x58140800, 0x4817c857, 0x4807c857, @@ -77,48 +77,48 @@ static const uint32_t isp_2500_risc_code[] = { 0x8050a1c0, 0x05000014, 0x4c140000, 0x5814a801, 0x4857c857, 0x40500000, 0x80540480, 0x0500000b, 0x82540480, 0x0000400e, 0x05020005, 0x9050a404, - 0x0505ffe8, 0x05020028, 0x0501f004, 0x5814b002, - 0x485bc857, 0x0545f8ae, 0x5c002800, 0x90142c04, - 0x05fdf7e9, 0x0509fe1f, 0x42001000, 0x7ff481fe, + 0x0505ffe6, 0x05020028, 0x0501f004, 0x5814b002, + 0x485bc857, 0x0545f978, 0x5c002800, 0x90142c04, + 0x05fdf7e9, 0x0509fe1d, 0x42001000, 0x7ff481fe, 0x59e00002, 0x8c00051e, 0x05020003, 0x42001000, 0x7ff480fe, 0x50081000, 0x480b5058, 0x42002800, 0x00100022, 0x58140801, 0x4817c857, 0x4807c857, 0x800409c0, 0x05000023, 0x58142002, 0x4813c857, 0x58141003, 0x4c140000, 0x82040480, 0x0000400e, - 0x05020004, 0x0505fff2, 0x4803c856, 0x0501f003, + 0x05020004, 0x0505fff0, 0x4803c856, 0x0501f003, 0x0501fb4a, 0x05020004, 0x5c002800, 0x90142c04, 0x05fdf7ed, 0x4803c856, 0x4a03c020, 0x00004010, 0x4a03c011, 0x40100011, 0x05006000, 0x4203e000, 0x40000000, 0x59e00017, 0x60000800, 0x8c00050a, - 0x05060ea3, 0x8d0c0530, 0x05060e8f, 0x05060e91, + 0x05060ea1, 0x8d0c0530, 0x05060e8d, 0x05060e8f, 0x6403c017, 0x4203e000, 0x30000001, 0x0501f000, 0x4803c856, 0x0201f800, 0x0010ad04, 0x59e00024, - 0x8c000500, 0x05060f92, 0x0501fbc0, 0x0509fec5, + 0x8c000500, 0x05060f90, 0x0501fbc0, 0x0509fec3, 0x05020004, 0x4a03c014, 0x001c001c, 0x0501f003, 0x4a03c014, 0x081c001c, 0x4817c857, 0x0501fbde, - 0x42002000, 0x0010c7dd, 0x0545f874, 0x59a80067, + 0x42002000, 0x0010c7e5, 0x0545f93e, 0x59a80067, 0x800001c0, 0x0500000c, 0x59a80083, 0x8c000500, 0x05000005, 0x59a8000a, 0x82000480, 0x0013ffff, 0x05001005, 0x59a82067, 0x80102000, 0x59a8280a, - 0x0545f866, 0x0545f939, 0x0545f960, 0x59a8280a, + 0x0545f930, 0x0545fa06, 0x0545fa2d, 0x59a8280a, 0x60000812, 0x60001802, 0x4807500d, 0x480f5262, - 0x60901000, 0x0525fe53, 0x82040c00, 0x0010cca4, + 0x60901000, 0x0525fedf, 0x82040c00, 0x0010ccb4, 0x4807500b, 0x600400de, 0x50000000, 0x8c000502, 0x05000004, 0x59a80083, 0x84000540, 0x48035083, - 0x4a03c810, 0x00100000, 0x4a03c811, 0x00108a8f, - 0x4a03c812, 0x0010ad00, 0x4a03c813, 0x0010c7dc, + 0x4a03c810, 0x00100000, 0x4a03c811, 0x00108b5c, + 0x4a03c812, 0x0010ad00, 0x4a03c813, 0x0010c7e4, 0x0501fb7d, 0x6447c829, 0x59e40001, 0x82000540, 0x0003403f, 0x4803c801, 0x4a03c802, 0x00000933, 0x59e00003, 0x82000540, 0x00240000, 0x4803c003, 0x64ffc019, 0x60701000, 0x0501fad7, 0x4202c000, - 0x0010cca4, 0x59aab00b, 0x59aaa00b, 0x59aaa80b, + 0x0010ccb4, 0x59aab00b, 0x59aaa00b, 0x59aaa80b, 0x59aac80d, 0x49675061, 0x59a8000b, 0x4803500c, - 0x052dfc8a, 0x0501fbdf, 0x0501fc52, 0x0509f80a, - 0x59a8004b, 0x8c000508, 0x05000004, 0x0509fef2, - 0x0515fe15, 0x0509fff4, 0x0501fd65, 0x0505fa67, - 0x0525fe58, 0x0501f85d, 0x050df9d7, 0x0521fb11, - 0x051dfda2, 0x0525fbd5, 0x0509f839, 0x0505fe6d, - 0x4203e000, 0xf0000001, 0x0545f925, 0x6403c018, + 0x052dfd02, 0x0501fbdf, 0x0501fc52, 0x0509f808, + 0x59a8004b, 0x8c000508, 0x05000004, 0x0509fef0, + 0x0515fe19, 0x0509fff3, 0x0501fd65, 0x0505fa67, + 0x0525fee4, 0x0501f85d, 0x050df9d9, 0x0521fb47, + 0x051dfdd8, 0x0525fc61, 0x0509f837, 0x0505fe6b, + 0x4203e000, 0xf0000001, 0x0545f9f2, 0x6403c018, 0x4203e000, 0xa0000001, 0x59a80083, 0x80000540, 0x05000004, 0x4203e000, 0x20000551, 0x0501f003, 0x4203e000, 0x20000511, 0x4203e000, 0x50010000, @@ -127,29 +127,29 @@ static const uint32_t isp_2500_risc_code[] = { 0x40000010, 0x05006000, 0x4203e000, 0x40000000, 0x4df00000, 0x4203e000, 0x50000000, 0x59e00017, 0x60000800, 0x8c00050a, 0x0002088c, 0x8d0c0530, - 0x05060dfd, 0x0002098c, 0x5c03e000, 0x6403c017, + 0x05060dfb, 0x0002098c, 0x5c03e000, 0x6403c017, 0x4203e000, 0x30000001, 0x6002d800, 0x4203e000, 0xb0600000, 0x59a8008a, 0x4003f800, 0x0001f004, 0x4df00000, 0x4203e000, 0x50000000, 0x416c0000, 0x90000c88, 0x05021861, 0x0c01f803, 0x5c03e000, - 0x0001f006, 0x00100192, 0x0010c633, 0x0010c57a, - 0x00100191, 0x0010c52f, 0x00100191, 0x00100191, - 0x001001a3, 0x0501f855, 0x42000800, 0x00109410, + 0x0001f006, 0x00100192, 0x0010c63b, 0x0010c57f, + 0x00100191, 0x0010c534, 0x00100191, 0x00100191, + 0x001001a3, 0x0501f855, 0x42000800, 0x00109490, 0x5804001e, 0x8c000500, 0x0500000c, 0x84000500, 0x4800081e, 0x6012d800, 0x0501fa67, 0x49f3c857, 0x5c000800, 0x5c000000, 0x82000540, 0x00007e20, 0x4c000000, 0x4c040000, 0x1c01f000, 0x4a038805, - 0x000000f0, 0x1c01f000, 0x64175059, 0x6413505a, - 0x6403505b, 0x4a03505c, 0x00000080, 0x0521fa80, + 0x000000f0, 0x1c01f000, 0x64175059, 0x6417505a, + 0x6403505b, 0x4a03505c, 0x00008080, 0x0521fab6, 0x4a03541b, 0x0000ffff, 0x4a03500f, 0x00ffffff, - 0x0539f9cf, 0x4a03501f, 0x20200000, 0x4a035020, + 0x0539fa65, 0x4a03501f, 0x20200000, 0x4a035020, 0x88000200, 0x4a035021, 0x00ff001f, 0x4a035022, 0x000007d0, 0x4a035023, 0x80000000, 0x4a035024, 0x00000200, 0x4a035025, 0x00ff0000, 0x4a035026, 0x00010000, 0x4a03502d, 0x514c4f47, 0x4a03502e, 0x49432020, 0x1c01f000, 0x4d440000, 0x417a8800, 0x4c5c0000, 0x4178b800, 0x0001fac4, 0x05020004, - 0x051dfa6b, 0x05020002, 0x805cb800, 0x81468800, + 0x051dfa80, 0x05020002, 0x805cb800, 0x81468800, 0x83440580, 0x000007f0, 0x05fe07f8, 0x405c0800, 0x5c00b800, 0x5c028800, 0x1c01f000, 0x4803c857, 0x5c000000, 0x4c000000, 0x4803c857, 0x0501f80b, @@ -158,13 +158,13 @@ static const uint32_t isp_2500_risc_code[] = { 0x486fc857, 0x4873c857, 0x485fc857, 0x4203e000, 0x50000000, 0x6008b900, 0x05006000, 0x4c000000, 0x4c040000, 0x59bc00ea, 0x4803c857, 0x90000507, - 0x90000581, 0x05020003, 0x60000800, 0x0525ff64, + 0x90000581, 0x05020003, 0x60000800, 0x0525fff0, 0x59b800ea, 0x4803c857, 0x641370e8, 0x5c000800, 0x4807c025, 0x80040920, 0x4807c026, 0x5c000000, 0x4803c023, 0x80000120, 0x4803c024, 0x5c000000, 0x4803c857, 0x4803c021, 0x80000120, 0x4803c022, 0x41f80000, 0x4803c029, 0x80000120, 0x4803c02a, - 0x0541ffa9, 0x0500004a, 0x42000800, 0x00109c32, + 0x0545f873, 0x0500004a, 0x42000800, 0x00109cb2, 0x46000800, 0xfaceface, 0x80040800, 0x4c080000, 0x4c0c0000, 0x600010f4, 0x58080013, 0x44000800, 0x80040800, 0x58080022, 0x44000800, 0x80040800, @@ -185,29 +185,29 @@ static const uint32_t isp_2500_risc_code[] = { 0x80040800, 0x5c001800, 0x5c001000, 0x64030000, 0x485fc020, 0x905cb9c0, 0x905cbd52, 0x485fc011, 0x4203e000, 0x40000000, 0x6016d800, 0x59e00017, - 0x60000800, 0x8c00050a, 0x05060d25, 0x8d0c0530, - 0x05060d11, 0x05060d13, 0x6403c017, 0x4203e000, + 0x60000800, 0x8c00050a, 0x05060d23, 0x8d0c0530, + 0x05060d0f, 0x05060d11, 0x6403c017, 0x4203e000, 0x30000001, 0x0501f956, 0x05fdf7ff, 0x60100000, 0x0501f80c, 0x4a03c855, 0x0001eb5a, 0x59e40001, 0x82000540, 0xff000700, 0x4803c801, 0x42000000, - 0x00109885, 0x49780003, 0x49780004, 0x1c01f000, - 0x42000800, 0x00109887, 0x44000800, 0x59e40801, + 0x00109905, 0x49780003, 0x49780004, 0x1c01f000, + 0x42000800, 0x00109907, 0x44000800, 0x59e40801, 0x82041500, 0x00f3c0ff, 0x480bc801, 0x8c040524, 0x0500000b, 0x4c000000, 0x59e41052, 0x59e40054, - 0x800000d4, 0x82000400, 0x00109c5b, 0x80081480, + 0x800000d4, 0x82000400, 0x00109cdb, 0x80081480, 0x480bc853, 0x6503c800, 0x5c000000, 0x4a03c850, - 0x00109c5b, 0x800000d4, 0x82002400, 0x00109c5a, + 0x00109cdb, 0x800000d4, 0x82002400, 0x00109cda, 0x4813c851, 0x4a03c853, 0x00000400, 0x42000000, - 0x00109c5b, 0x82001400, 0x00001000, 0x45780000, + 0x00109cdb, 0x82001400, 0x00001000, 0x45780000, 0x80000000, 0x80081d80, 0x05fe07fd, 0x4807c801, - 0x1c01f000, 0x42002000, 0x00109885, 0x59e41801, + 0x1c01f000, 0x42002000, 0x00109905, 0x59e41801, 0x58100c01, 0x82040500, 0x00003800, 0x820c1d00, 0xffffc7ff, 0x800c1d40, 0x480fc801, 0x1c01f000, 0x5c036000, 0x4db00000, 0x49b3c857, 0x4803c857, 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x8d0c052a, 0x0500002f, 0x401c0000, 0x80040d40, 0x4004b800, 0x400cc000, 0x4018c800, 0x0501f8d3, - 0x41784000, 0x42002800, 0x00109885, 0x58142017, + 0x41784000, 0x42002800, 0x00109905, 0x58142017, 0x5814000d, 0x80100400, 0x445c0000, 0x80102000, 0x80000000, 0x82104d00, 0x000000ff, 0x050008a9, 0x0500001c, 0x4c000000, 0x0501f88e, 0x5c000000, @@ -219,18 +219,18 @@ static const uint32_t isp_2500_risc_code[] = { 0x05000004, 0x48102817, 0x802041c0, 0x05060b32, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x42001000, - 0x04000000, 0x41ccc800, 0x42002800, 0x00109885, + 0x04000000, 0x41ccc800, 0x42002800, 0x00109905, 0x59a80085, 0x82000d00, 0x000003ff, 0x4c000000, 0x58140212, 0x0501f85b, 0x5c000000, 0x4004b800, 0x4008c000, 0x905cbc06, 0x0501f016, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x42002800, 0x00109885, + 0x4c600000, 0x4c640000, 0x42002800, 0x00109905, 0x42001000, 0x03000000, 0x4000c800, 0x821c0500, 0x00003c00, 0x80000114, 0x821c0d00, 0x000003ff, 0x4c000000, 0x58140412, 0x0501f846, 0x5c000000, 0x4004b800, 0x4008c000, 0x805cbc00, 0x805cb840, 0x825c0480, 0x00000240, 0x05fe1edc, 0x0501f87b, 0x405c0000, 0x905cbc02, 0x80600d40, 0x42002800, - 0x00109885, 0x41784000, 0x58142017, 0x825c0480, + 0x00109905, 0x41784000, 0x58142017, 0x825c0480, 0x00000101, 0x05021029, 0x5814000d, 0x80100400, 0x44040000, 0x80102000, 0x80000000, 0x805cb840, 0x82104d00, 0x000000ff, 0x0500084a, 0x0500001b, @@ -259,7 +259,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x82102500, 0x000003ff, 0x80204000, 0x58140014, 0x80000000, 0x90000503, 0x48002814, 0x05000003, 0x400c0000, 0x0501f002, 0x5814000d, 0x80000540, - 0x4803c857, 0x1c01f000, 0x42002800, 0x00109885, + 0x4803c857, 0x1c01f000, 0x42002800, 0x00109905, 0x58140000, 0x8c00050a, 0x0500002f, 0x8c000502, 0x0502002d, 0x4c5c0000, 0x5814b821, 0x49782821, 0x8400050a, 0x48002800, 0x58142017, 0x4813c857, @@ -271,14 +271,14 @@ static const uint32_t isp_2500_risc_code[] = { 0x05fc0fc0, 0x05fc0e3d, 0x445c0000, 0x80000000, 0x80102000, 0x82104d00, 0x000000ff, 0x05fc0fb9, 0x05fc0e36, 0x48102817, 0x802041c0, 0x05060a5a, - 0x405c2000, 0x600c1800, 0x60a01100, 0x0515fa01, + 0x405c2000, 0x600c1800, 0x60a01100, 0x0515fa05, 0x5c00b800, 0x1c01f000, 0x1c01f000, 0x59a80072, 0x8c000530, 0x05fe07fe, 0x4c080000, 0x60101000, 0x0501f849, 0x5c001000, 0x4201d000, 0x00028b0a, - 0x0525faff, 0x4c080000, 0x60201000, 0x0501f842, - 0x5c001000, 0x4201d000, 0x00028b0a, 0x0525faf8, + 0x0525fb8b, 0x4c080000, 0x60201000, 0x0501f842, + 0x5c001000, 0x4201d000, 0x00028b0a, 0x0525fb84, 0x4c080000, 0x60401000, 0x0501f83b, 0x5c001000, - 0x4201d000, 0x00028b0a, 0x0525faf1, 0x05fdf7e8, + 0x4201d000, 0x00028b0a, 0x0525fb7d, 0x05fdf7e8, 0x8c00050c, 0x59a80872, 0x05020003, 0x84040d30, 0x0501f005, 0x84040d70, 0x48075072, 0x60001000, 0x0501f02d, 0x48075072, 0x916c0507, 0x0c01f001, @@ -321,13 +321,13 @@ static const uint32_t isp_2500_risc_code[] = { 0x417a6000, 0x417a6800, 0x417a7000, 0x417a7800, 0x417a8000, 0x417a8800, 0x417a9000, 0x417a9800, 0x417ae800, 0x417af800, 0x600300f8, 0x42031000, - 0x00109735, 0x607f1960, 0x60df2160, 0x42032800, - 0x001096fe, 0x42033000, 0x00020a12, 0x42034000, - 0x00109410, 0x42033800, 0x0010942f, 0x42034800, - 0x00109474, 0x42035000, 0x00109380, 0x42035800, - 0x00108b80, 0x417b6000, 0x600368de, 0x6003c860, + 0x001097b5, 0x607f1960, 0x60df2160, 0x42032800, + 0x0010977e, 0x42033000, 0x00020a12, 0x42034000, + 0x00109490, 0x42033800, 0x001094af, 0x42034800, + 0x001094f4, 0x42035000, 0x00109400, 0x42035800, + 0x00108c00, 0x417b6000, 0x600368de, 0x6003c860, 0x600371fe, 0x6003797e, 0x600380ee, 0x60038880, - 0x600390c0, 0x42039800, 0x0010996a, 0x6003a0ec, + 0x600390c0, 0x42039800, 0x001099ea, 0x6003a0ec, 0x6003a8e8, 0x6003b0e4, 0x6003b8e2, 0x6003c0e0, 0x6003d000, 0x4203e800, 0x000201b5, 0x417bd800, 0x1c01f000, 0x6407c830, 0x640fc831, 0x6413c832, @@ -344,9 +344,9 @@ static const uint32_t isp_2500_risc_code[] = { 0x50040000, 0x82000580, 0x55555555, 0x05fe07f1, 0x80142840, 0x4817c857, 0x4817c861, 0x4817500a, 0x1c01f000, 0x4817c857, 0x4c5c0000, 0x4c600000, - 0x0541fcd9, 0x05000030, 0x4817c857, 0x606c08f6, + 0x0541fda3, 0x05000030, 0x4817c857, 0x606c08f6, 0x50040800, 0x8c04053e, 0x0500002b, 0x4817c857, - 0x850e1d70, 0x4c040000, 0x4c140000, 0x0505fa86, + 0x850e1d70, 0x4c040000, 0x4c140000, 0x0505fa84, 0x5c002800, 0x5c000800, 0x59e0b81a, 0x8204b500, 0x000007ff, 0x8058b000, 0x485b506a, 0x600008f4, 0x58042029, 0x5804302a, 0x82102500, 0xfffffff8, @@ -378,18 +378,18 @@ static const uint32_t isp_2500_risc_code[] = { 0x1c01f000, 0x915c04a0, 0x0500100a, 0x496bc857, 0x815eb840, 0x416a5800, 0x592ed000, 0x497a5800, 0x497a5801, 0x497a5805, 0x812e59c0, 0x1c01f000, - 0x42000000, 0x001097ea, 0x0541fb33, 0x417a5800, + 0x42000000, 0x0010986a, 0x0541fbfd, 0x417a5800, 0x05fdf7fa, 0x0501f803, 0x412d8800, 0x1c01f000, 0x815eb840, 0x05001009, 0x416a5800, 0x492fc857, 0x592ed000, 0x497a5800, 0x497a5801, 0x497a5805, - 0x812e59c0, 0x1c01f000, 0x42000000, 0x001097ea, - 0x0541fb21, 0x417ab800, 0x417a5800, 0x05fdf7f9, + 0x812e59c0, 0x1c01f000, 0x42000000, 0x0010986a, + 0x0541fbeb, 0x417ab800, 0x417a5800, 0x05fdf7f9, 0x492fc857, 0x496a5800, 0x412ed000, 0x815eb800, 0x59c80000, 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, 0x492fc857, 0x812e59c0, 0x05000007, 0x592c0001, 0x497a5801, 0x4c000000, 0x05fdfff1, 0x5c025800, 0x05fdf7f9, 0x1c01f000, 0x42000000, - 0x001097ea, 0x0541fb08, 0x80025d80, 0x1c01f000, + 0x0010986a, 0x0541fbd2, 0x80025d80, 0x1c01f000, 0x4807c856, 0x42007000, 0x00020a09, 0x64007000, 0x59e00003, 0x82000540, 0x00008080, 0x4803c003, 0x4a03b805, 0x90000001, 0x59dc0006, 0x4a03b805, @@ -404,24 +404,24 @@ static const uint32_t isp_2500_risc_code[] = { 0x497bb807, 0x8058b040, 0x05fe07fe, 0x4a03b805, 0x30000000, 0x59dc0006, 0x4a03b805, 0x60000001, 0x4803c856, 0x05fdff90, 0x05fc0c20, 0x42001000, - 0x00109730, 0x452c1000, 0x64065801, 0x4a025802, - 0x00000100, 0x4a025808, 0x0010567e, 0x497a5809, + 0x001097b0, 0x452c1000, 0x64065801, 0x4a025802, + 0x00000100, 0x4a025808, 0x00105709, 0x497a5809, 0x497a580a, 0x497a580b, 0x05fdff83, 0x05fc0c13, - 0x42001000, 0x00109731, 0x452c1000, 0x64025801, + 0x42001000, 0x001097b1, 0x452c1000, 0x64025801, 0x4a025802, 0x00000100, 0x4a025808, 0x00100dbf, 0x497a5803, 0x497a5806, 0x497a5807, 0x497a5809, - 0x05fdff75, 0x05fc0c05, 0x42001000, 0x00109732, + 0x05fdff75, 0x05fc0c05, 0x42001000, 0x001097b2, 0x452c1000, 0x64025801, 0x4a025802, 0x00000100, 0x4a025808, 0x00100de3, 0x497a5803, 0x497a5806, 0x497a5807, 0x497a5809, 0x1c01f000, 0x40681000, 0x0001f81c, 0x1c01f000, 0x42001000, 0x0002002b, - 0x0521ff98, 0x0535fe41, 0x053dff20, 0x05000010, + 0x0525f824, 0x0535fed7, 0x053dffd8, 0x05000010, 0x4a03b805, 0x30000002, 0x59dc0006, 0x4807b800, 0x480bb801, 0x42007000, 0x00020a09, 0x65007002, 0x480c7008, 0x58380007, 0x90000405, 0x48007003, 0x640c7000, 0x4803b803, 0x0001f053, 0x42000000, - 0x00109752, 0x0541fa8c, 0x0535fe37, 0x60040800, - 0x42001000, 0x0002002b, 0x0521ff5b, 0x42007000, + 0x001097d2, 0x0541fb56, 0x0535fecd, 0x60040800, + 0x42001000, 0x0002002b, 0x0521ffe7, 0x42007000, 0x00020a09, 0x0001f034, 0x58380802, 0x600011fe, 0x82040480, 0x0000ff00, 0x05021003, 0x40041000, 0x80000580, 0x48007002, 0x480bb802, 0x59dc0006, @@ -461,7 +461,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x05000003, 0x48107005, 0x0501f008, 0x49787005, 0x49787004, 0x0501f005, 0x48101800, 0x801021c0, 0x05020002, 0x480c7004, 0x1c01f000, 0x4803c856, - 0x4dc00000, 0x42007000, 0x00109733, 0x64007400, + 0x4dc00000, 0x42007000, 0x001097b3, 0x64007400, 0x49787001, 0x600380ee, 0x60080800, 0x59c00007, 0x4a038006, 0x60000001, 0x59c00007, 0x4a038006, 0x60000003, 0x59c00007, 0x4a038006, 0x60000005, @@ -489,11 +489,11 @@ static const uint32_t isp_2500_risc_code[] = { 0x05fe07fa, 0x05fdfad5, 0x83c00580, 0x00007700, 0x05000003, 0x600380ee, 0x05fdf7f3, 0x4178a000, 0x805cb9c0, 0x0502000f, 0x6080b000, 0x91b8ac20, - 0x0541fa4b, 0x640770fb, 0x4a037020, 0x00100cde, + 0x0541fb15, 0x640770fb, 0x4a037020, 0x00100cde, 0x59a8002c, 0x82000500, 0x0000ffff, 0x48037021, - 0x4a037035, 0x001098b0, 0x4a037038, 0x00100cd5, - 0x640770fb, 0x6080b000, 0x91b8ac00, 0x0541fa3c, - 0x6100b000, 0xb1b8ac00, 0x0541fa39, 0x805cb9c0, + 0x4a037035, 0x00109930, 0x4a037038, 0x00100cd5, + 0x640770fb, 0x6080b000, 0x91b8ac00, 0x0541fb06, + 0x6100b000, 0xb1b8ac00, 0x0541fb03, 0x805cb9c0, 0x05020004, 0x4a0370e4, 0xaaaaaaaa, 0x0501f003, 0x4a0370e4, 0xa2aa2a82, 0x4a0370e5, 0xaaaaaaaa, 0x4a0370e6, 0xaaaaaaaa, 0x640370fb, 0x4a0370e6, @@ -505,114 +505,114 @@ static const uint32_t isp_2500_risc_code[] = { 0x4d340000, 0x4d400000, 0x4cfc0000, 0x4d380000, 0x4d3c0000, 0x4d440000, 0x4d4c0000, 0x4d480000, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4d040000, - 0x4cf40000, 0x4cf80000, 0x4cfc0000, 0x0001f8bd, - 0x5c01f800, 0x5c01f000, 0x5c01e800, 0x5c020800, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c029000, - 0x5c029800, 0x5c028800, 0x5c027800, 0x5c027000, - 0x5c01f800, 0x5c028000, 0x5c026800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x493bc857, 0x0001f0e1, - 0x83300500, 0x000000ff, 0x90000c87, 0x05fe1a6f, - 0x0c01f022, 0x1c01f000, 0x82000d00, 0xc2000038, - 0x05fe0a60, 0x05fdfa69, 0x00000000, 0x00000048, - 0x00000054, 0x00000053, 0x00100799, 0x001007b4, - 0x001007b1, 0x001007ce, 0x001007a2, 0x001007ab, - 0x00100799, 0x001007ca, 0x00100807, 0x00100799, - 0x00100809, 0x00100799, 0x00100799, 0x0010080c, - 0x00100810, 0x00100821, 0x00100832, 0x00100799, - 0x00100839, 0x00100843, 0x00100799, 0x00100799, - 0x00100799, 0x05fdfa4d, 0x001007a1, 0x001008c3, - 0x001007d9, 0x001007f9, 0x001007a1, 0x001007a1, - 0x001007a1, 0x05fdfa45, 0x4803c856, 0x59300004, - 0x8c00053e, 0x05020003, 0x61567000, 0x0005f105, - 0x0525fcd1, 0x05fc07fd, 0x1c01f000, 0x4803c856, - 0x0501f899, 0x40002800, 0x41782000, 0x615a7000, - 0x0005f105, 0x4803c856, 0x615e7000, 0x0005f105, - 0x4803c856, 0x59325809, 0x812e59c0, 0x05000012, - 0x59300008, 0x8c00051a, 0x0502000b, 0x592c0409, - 0x8c00051c, 0x05020003, 0x4a026013, 0xffffffff, - 0x59300004, 0x8c00053e, 0x05020005, 0x61227000, - 0x0005f105, 0x641e5a07, 0x05fdf7f8, 0x0525fcb2, - 0x05fc07fb, 0x1c01f000, 0x4803c856, 0x83300500, - 0x00ffffff, 0x0521f786, 0x1c01f000, 0x4c040000, - 0x59b808ea, 0x90040d07, 0x90040583, 0x05000004, - 0x42000000, 0x60000000, 0x0501f89a, 0x5c000800, - 0x1c01f000, 0x0501f8dd, 0x05000015, 0x59325809, - 0x812e59c0, 0x05000012, 0x592c0205, 0x82000500, - 0x000000ff, 0x90000da9, 0x0502000d, 0x59300203, - 0x90000583, 0x05000008, 0x59300808, 0x84040d26, - 0x48066008, 0x0001f929, 0x6503900d, 0x642370e5, - 0x1c01f000, 0x0525fc8c, 0x05fc07f8, 0x42000000, - 0x001097f0, 0x0541f8a4, 0x5988014a, 0x80000000, - 0x4803114a, 0x6503900d, 0x42000000, 0xc0000000, - 0x0001f11e, 0x4c5c0000, 0x4c600000, 0x4c640000, - 0x4200c800, 0x001098b7, 0x6000b860, 0x6014c002, - 0x0521fc6f, 0x4a0370e4, 0x02000000, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4933c857, - 0x0005f0e7, 0x4933c857, 0x0501fb3b, 0x1c01f000, - 0x41300800, 0x800409c0, 0x05fe09d8, 0x05fdf9cd, - 0x42000000, 0x001097f0, 0x0541f883, 0x4933c857, - 0x813261c0, 0x05fc09d1, 0x0501f82f, 0x40002800, - 0x053dffe6, 0x0501f894, 0x05000006, 0x5932680a, - 0x59340200, 0x8c00050e, 0x59300416, 0x05360b28, - 0x1c01f000, 0x42000000, 0x001097f0, 0x0541f872, - 0x4933c857, 0x813261c0, 0x05fc09c0, 0x0501f886, - 0x05000009, 0x0535f8bb, 0x05000007, 0x59325809, - 0x592c0209, 0x8400054e, 0x48025a09, 0x417a7800, - 0x0531fd80, 0x1c01f000, 0x485fc857, 0x5c000000, - 0x4d780000, 0x4203e000, 0x50000000, 0x6014b900, - 0x05fdf1b2, 0x4933c857, 0x913004a0, 0x05fe19ab, - 0x83300c00, 0x00109863, 0x50040000, 0x80000000, - 0x05001002, 0x44000800, 0x1c01f000, 0x4933c857, - 0x05fdf7f6, 0x4807c856, 0x59b800ea, 0x8c000510, - 0x05fc07fd, 0x59b800e0, 0x4803c857, 0x1c01f000, - 0x4803c856, 0x42000000, 0x10000000, 0x41300800, - 0x0501f020, 0x8c000510, 0x00000124, 0x4c040000, - 0x0501f808, 0x5c000800, 0x90100488, 0x00001124, - 0x4c040000, 0x05fdfef5, 0x5c000800, 0x0001f124, - 0x59b800e2, 0x59b820e2, 0x80100580, 0x05fe07fd, - 0x80102114, 0x0501f001, 0x40101800, 0x800c190a, - 0x9010051f, 0x900c1d1f, 0x800c2480, 0x9010251f, - 0x1c01f000, 0x40680000, 0x406c0800, 0x0501f805, - 0x60058800, 0x05020002, 0x60018800, 0x1c01f000, - 0x82000500, 0xf0000000, 0x82040d00, 0x0fffffff, - 0x80040d40, 0x4807c857, 0x42001000, 0x00109734, - 0x50080000, 0x80000540, 0x05020004, 0x640f70e5, - 0x4a0370e4, 0x00000300, 0x80000000, 0x44001000, - 0x60001008, 0x59b800ea, 0x8c000510, 0x0500000b, - 0x05fdffd8, 0x90100488, 0x05001007, 0x4c040000, - 0x4c080000, 0x05fdfec5, 0x5c001000, 0x5c000800, - 0x0501f01c, 0x59b800ea, 0x8c000516, 0x05020019, - 0x4a0370e4, 0x00300000, 0x480770e1, 0x600011fe, - 0x80081040, 0x05000010, 0x59b808e4, 0x8c040528, - 0x05fe07fc, 0x42001000, 0x00109734, 0x50080000, - 0x80000040, 0x05020004, 0x640b70e5, 0x4a0370e4, - 0x00000200, 0x05fc1945, 0x44001000, 0x8c04052c, - 0x1c01f000, 0x41f80000, 0x50000000, 0x05fdf93f, - 0x80081040, 0x05fe07d8, 0x41f80000, 0x50000000, - 0x05fdf93a, 0x4d380000, 0x59300c07, 0x90040589, - 0x05020004, 0x611e7000, 0x0005f905, 0x80000580, - 0x5c027000, 0x1c01f000, 0x4c500000, 0x6407900d, - 0x59c8a020, 0x640b900d, 0x59c80820, 0x8c50052e, - 0x05000002, 0x900409c0, 0x82040d00, 0x0000ffff, - 0x0521fb76, 0x5c00a000, 0x1c01f000, 0x42000000, - 0x001097e7, 0x053dffd0, 0x05fdfff0, 0x05000041, - 0x4933c857, 0x59300407, 0x90000580, 0x0500003d, - 0x59c82021, 0x6407900d, 0x59c82821, 0x82142d00, - 0x0000ffff, 0x59325809, 0x812e59c0, 0x05000035, - 0x5932680a, 0x0519fabe, 0x05360a59, 0x599c0019, - 0x8c00050c, 0x05020015, 0x0519fab9, 0x05020013, - 0x59300813, 0x4807c857, 0x592c0409, 0x8c00051c, - 0x0502000c, 0x8400055c, 0x48025c09, 0x592c0a05, - 0x82040d00, 0x000000ff, 0xb0040588, 0x05000003, - 0x90040598, 0x05020003, 0x59300813, 0x48065803, - 0x4a026013, 0x7fffffff, 0x48166015, 0x599c0019, - 0x8c00050c, 0x05020004, 0x59a80007, 0x8c00051e, - 0x05020014, 0x0501fc09, 0x05020012, 0x0501f9b7, + 0x4cf40000, 0x4cf80000, 0x0001f8bd, 0x5c01f000, + 0x5c01e800, 0x5c020800, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x5c029000, 0x5c029800, 0x5c028800, + 0x5c027800, 0x5c027000, 0x5c01f800, 0x5c028000, + 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x493bc857, 0x0001f0e1, 0x83300500, 0x000000ff, + 0x90000c87, 0x05fe1a71, 0x0c01f022, 0x1c01f000, + 0x82000d00, 0xc2000038, 0x05fe0a62, 0x05fdfa6b, + 0x00000000, 0x00000048, 0x00000054, 0x00000053, + 0x00100797, 0x001007b2, 0x001007af, 0x001007cc, + 0x001007a0, 0x001007a9, 0x00100797, 0x001007c8, + 0x00100805, 0x00100797, 0x00100807, 0x00100797, + 0x00100797, 0x0010080a, 0x0010080e, 0x0010081f, + 0x00100830, 0x00100797, 0x00100837, 0x00100841, + 0x00100797, 0x00100797, 0x00100797, 0x05fdfa4f, + 0x0010079f, 0x001008c1, 0x001007d7, 0x001007f7, + 0x0010079f, 0x0010079f, 0x0010079f, 0x05fdfa47, + 0x4803c856, 0x59300004, 0x8c00053e, 0x05020003, + 0x61567000, 0x0005f105, 0x0525fd5f, 0x05fc07fd, + 0x1c01f000, 0x4803c856, 0x0501f899, 0x40002800, + 0x41782000, 0x615a7000, 0x0005f105, 0x4803c856, + 0x615e7000, 0x0005f105, 0x4803c856, 0x59325809, + 0x812e59c0, 0x05000012, 0x59300008, 0x8c00051a, + 0x0502000b, 0x592c0409, 0x8c00051c, 0x05020003, + 0x4a026013, 0xffffffff, 0x59300004, 0x8c00053e, + 0x05020005, 0x61227000, 0x0005f105, 0x641e5a07, + 0x05fdf7f8, 0x0525fd40, 0x05fc07fb, 0x1c01f000, + 0x4803c856, 0x83300500, 0x00ffffff, 0x0525f014, + 0x1c01f000, 0x4c040000, 0x59b808ea, 0x90040d07, + 0x90040583, 0x05000004, 0x42000000, 0x60000000, + 0x0501f89a, 0x5c000800, 0x1c01f000, 0x0501f8dd, + 0x05000015, 0x59325809, 0x812e59c0, 0x05000012, + 0x592c0205, 0x82000500, 0x000000ff, 0x90000da9, + 0x0502000d, 0x59300203, 0x90000583, 0x05000008, + 0x59300808, 0x84040d26, 0x48066008, 0x0001f929, + 0x6503900d, 0x642370e5, 0x1c01f000, 0x0525fd1a, + 0x05fc07f8, 0x42000000, 0x00109870, 0x0541f970, + 0x5988014a, 0x80000000, 0x4803114a, 0x6503900d, + 0x42000000, 0xc0000000, 0x0001f11e, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x4200c800, 0x00109937, + 0x6000b860, 0x6014c002, 0x0521fcca, 0x4a0370e4, + 0x02000000, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x4933c857, 0x0005f0e7, 0x4933c857, + 0x0501fb3d, 0x1c01f000, 0x41300800, 0x800409c0, + 0x05fe09da, 0x05fdf9cf, 0x42000000, 0x00109870, + 0x0541f94f, 0x4933c857, 0x813261c0, 0x05fc09d3, + 0x0501f82f, 0x40002800, 0x0541f8b2, 0x0501f894, + 0x05000006, 0x5932680a, 0x59340200, 0x8c00050e, + 0x59300416, 0x05360bc0, 0x1c01f000, 0x42000000, + 0x00109870, 0x0541f93e, 0x4933c857, 0x813261c0, + 0x05fc09c2, 0x0501f886, 0x05000009, 0x0535f953, + 0x05000007, 0x59325809, 0x592c0209, 0x8400054e, + 0x48025a09, 0x417a7800, 0x0531fe15, 0x1c01f000, + 0x485fc857, 0x5c000000, 0x4d780000, 0x4203e000, + 0x50000000, 0x6014b900, 0x05fdf1b4, 0x4933c857, + 0x913004a0, 0x05fe19ad, 0x83300c00, 0x001098e3, + 0x50040000, 0x80000000, 0x05001002, 0x44000800, + 0x1c01f000, 0x4933c857, 0x05fdf7f6, 0x4807c856, + 0x59b800ea, 0x8c000510, 0x05fc07fd, 0x59b800e0, + 0x4803c857, 0x1c01f000, 0x4803c856, 0x42000000, + 0x10000000, 0x41300800, 0x0501f020, 0x8c000510, + 0x00000124, 0x4c040000, 0x0501f808, 0x5c000800, + 0x90100488, 0x00001124, 0x4c040000, 0x05fdfef7, + 0x5c000800, 0x0001f124, 0x59b800e2, 0x59b820e2, + 0x80100580, 0x05fe07fd, 0x80102114, 0x0501f001, + 0x40101800, 0x800c190a, 0x9010051f, 0x900c1d1f, + 0x800c2480, 0x9010251f, 0x1c01f000, 0x40680000, + 0x406c0800, 0x0501f805, 0x60058800, 0x05020002, + 0x60018800, 0x1c01f000, 0x82000500, 0xf0000000, + 0x82040d00, 0x0fffffff, 0x80040d40, 0x4807c857, + 0x42001000, 0x001097b4, 0x50080000, 0x80000540, + 0x05020004, 0x640f70e5, 0x4a0370e4, 0x00000300, + 0x80000000, 0x44001000, 0x60001008, 0x59b800ea, + 0x8c000510, 0x0500000b, 0x05fdffd8, 0x90100488, + 0x05001007, 0x4c040000, 0x4c080000, 0x05fdfec7, + 0x5c001000, 0x5c000800, 0x0501f01c, 0x59b800ea, + 0x8c000516, 0x05020019, 0x4a0370e4, 0x00300000, + 0x480770e1, 0x600011fe, 0x80081040, 0x05000010, + 0x59b808e4, 0x8c040528, 0x05fe07fc, 0x42001000, + 0x001097b4, 0x50080000, 0x80000040, 0x05020004, + 0x640b70e5, 0x4a0370e4, 0x00000200, 0x05fc1947, + 0x44001000, 0x8c04052c, 0x1c01f000, 0x41f80000, + 0x50000000, 0x05fdf941, 0x80081040, 0x05fe07d8, + 0x41f80000, 0x50000000, 0x05fdf93c, 0x4d380000, + 0x59300c07, 0x90040589, 0x05020004, 0x611e7000, + 0x0005f905, 0x80000580, 0x5c027000, 0x1c01f000, + 0x4c500000, 0x6407900d, 0x59c8a020, 0x640b900d, + 0x59c80820, 0x8c50052e, 0x05000002, 0x900409c0, + 0x82040d00, 0x0000ffff, 0x0521fbd1, 0x5c00a000, + 0x1c01f000, 0x42000000, 0x00109867, 0x0541f89c, + 0x05fdfff0, 0x05000043, 0x4933c857, 0x59300407, + 0x90000580, 0x0500003f, 0x59c82021, 0x6407900d, + 0x59c82821, 0x82142d00, 0x0000ffff, 0x59325809, + 0x812e59c0, 0x05000037, 0x5932680a, 0x0519fad3, + 0x05360af1, 0x599c0019, 0x8c00050c, 0x05020015, + 0x0519face, 0x05020013, 0x59300813, 0x4807c857, + 0x592c0409, 0x8c00051c, 0x0502000c, 0x8400055c, + 0x48025c09, 0x592c0a05, 0x82040d00, 0x000000ff, + 0xb0040588, 0x05000003, 0x90040598, 0x05020003, + 0x59300813, 0x48065803, 0x4a026013, 0x7fffffff, + 0x48166015, 0x0519fab9, 0x05000004, 0x59300416, + 0x8c00051c, 0x05000004, 0x599c0019, 0x8c00050c, + 0x05000014, 0x0501fc09, 0x05020012, 0x0501f9b7, 0x40280000, 0x4802600f, 0x05000005, 0x4832600d, 0x50200000, 0x4802600c, 0x4822600e, 0x59300416, 0x8c00051c, 0x05020004, 0x599c0019, 0x8c00050c, 0x05020871, 0x6503900d, 0x642370e5, 0x1c01f000, - 0x42000000, 0x001097f0, 0x053dff8b, 0x5988014c, + 0x42000000, 0x00109870, 0x0541f855, 0x5988014c, 0x80000000, 0x4803114c, 0x6503900d, 0x42000000, 0xc0000000, 0x0001f11e, 0x4cf80000, 0x58f40000, 0x8001f540, 0x0501f81e, 0x41781800, 0x0501f8ce, @@ -639,7 +639,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x4179f000, 0x5c025800, 0x1c01f000, 0x80f5e9c0, 0x05000008, 0x80f9f1c0, 0x05fe0ff6, 0x4d2c0000, 0x40f65800, 0x05fdfc07, 0x4179e800, 0x5c025800, - 0x1c01f000, 0x4cf40000, 0x0519fa1d, 0x0502002e, + 0x1c01f000, 0x4cf40000, 0x0519fa30, 0x0502002e, 0x59300808, 0x82040500, 0x00003000, 0x0502002a, 0x8c040522, 0x0500002a, 0x59300021, 0x8001ed40, 0x05fc0866, 0x82000580, 0xffffffff, 0x05000022, @@ -729,7 +729,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x58343801, 0x480e6012, 0x48166010, 0x481e6011, 0x0501f1ea, 0x4933c857, 0x5931f809, 0x59301006, 0x800811c0, 0x05000009, 0x41780800, 0x60280000, - 0x0521fca4, 0x80080102, 0x05020002, 0x84001542, + 0x0521fd30, 0x80080102, 0x05020002, 0x84001542, 0x80081040, 0x4809fc07, 0x640a6006, 0x592c040a, 0x90000508, 0x05000008, 0x0501f82b, 0x59300203, 0x90000584, 0x05020003, 0x61227000, 0x0005f905, @@ -747,39 +747,39 @@ static const uint32_t isp_2500_risc_code[] = { 0x05000021, 0x90040583, 0x0500001f, 0x59300407, 0x4c000000, 0x64026407, 0x61043000, 0x4a0370e5, 0x00003000, 0x42000000, 0x50000000, 0x41300800, - 0x4c180000, 0x05fdfd4b, 0x5c003000, 0x0500000d, + 0x4c180000, 0x05fdfd49, 0x5c003000, 0x0500000d, 0x60780000, 0x80000040, 0x05fe07ff, 0x80183040, 0x05fe07f5, 0x42000000, 0x40000000, 0x41300800, - 0x05fdfd40, 0x59880146, 0x80000000, 0x48031146, + 0x05fdfd3e, 0x59880146, 0x80000000, 0x48031146, 0x4a0370e5, 0x00002000, 0x5c000000, 0x48026407, 0x1c01f000, 0x59300008, 0x84000500, 0x48026008, 0x05fdf7fc, 0x59c00007, 0x4a038006, 0x30000000, 0x40000000, 0x59c00007, 0x8c00050a, 0x05fe07fe, 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, 0x4dc00000, 0x640370e8, 0x608380ee, 0x05fdfff2, - 0x600380ee, 0x05fdfff0, 0x0519fd90, 0x05020011, + 0x600380ee, 0x05fdfff0, 0x0519fdc6, 0x05020011, 0x4a038891, 0x0000ffff, 0x497b8880, 0x4ce80000, - 0x6059d000, 0x0521fb6e, 0x497b8892, 0x6059d000, - 0x0521fb6b, 0x5c01d000, 0x42000000, 0x0010983b, - 0x053dfd39, 0x0501f810, 0x5c038000, 0x0519f678, + 0x6059d000, 0x0521fbfa, 0x497b8892, 0x6059d000, + 0x0521fbf7, 0x5c01d000, 0x42000000, 0x001098bb, + 0x053dfe03, 0x0501f810, 0x5c038000, 0x0519f6ae, 0x0501f81f, 0x4c080000, 0x4c140000, 0x42000000, - 0x0010983c, 0x053dfd30, 0x0501f807, 0x5c002800, + 0x001098bc, 0x053dfdfa, 0x0501f807, 0x5c002800, 0x5c001000, 0x48178892, 0x480b8880, 0x5c038000, 0x1c01f000, 0x496fc857, 0x916c0583, 0x05020008, 0x4c080000, 0x4c0c0000, 0x61201100, 0x61fc19ff, - 0x0511fa44, 0x5c001800, 0x5c001000, 0x60f00800, - 0x0501fce1, 0x4a038891, 0x0000ffff, 0x6503900d, + 0x0511fa48, 0x5c001800, 0x5c001000, 0x60f00800, + 0x0501fcdf, 0x4a038891, 0x0000ffff, 0x6503900d, 0x05fdfb63, 0x640770e8, 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, 0x59c41080, 0x497b8880, - 0x4ce80000, 0x6059d000, 0x4c080000, 0x0521fb3c, + 0x4ce80000, 0x6059d000, 0x4c080000, 0x0521fbc8, 0x5c001000, 0x5c01d000, 0x59c42892, 0x497b8892, - 0x0519fd52, 0x05020002, 0x1c01f000, 0x61802004, + 0x0519fd88, 0x05020002, 0x1c01f000, 0x61802004, 0x59c418a4, 0x900c1d0f, 0x900c0580, 0x0500000c, 0x59c41805, 0x900c1d01, 0x0502000b, 0x59c418a4, 0x900c1d0f, 0x900c0487, 0x05001003, 0x900c048c, 0x05001003, 0x80102040, 0x05fe07f2, 0x497b8891, 0x1c01f000, 0x4c100000, 0x60642000, 0x64078805, - 0x0505fa63, 0x59c41805, 0x900c1d01, 0x05000005, + 0x0505fa61, 0x59c41805, 0x900c1d01, 0x05000005, 0x80102040, 0x05fe07fa, 0x5c002000, 0x05fdf7f4, 0x5c002000, 0x05fdf7f0, 0x4803c856, 0x1c01f000, 0x00100bc0, 0x00100bc0, 0x00100bc0, 0x00100bd4, @@ -801,11 +801,11 @@ static const uint32_t isp_2500_risc_code[] = { 0x59300015, 0x59301014, 0x80080580, 0x05020008, 0x800811c0, 0x05000039, 0x592c1209, 0x8c08051e, 0x05020036, 0x843c7d4a, 0x0501f034, 0x480bc857, - 0x42000000, 0x001097e8, 0x053dfc97, 0x59302015, + 0x42000000, 0x00109868, 0x053dfd61, 0x59302015, 0x59300416, 0x4803c857, 0x8c000514, 0x0502000f, 0x599c1819, 0x8c0c0512, 0x0500000a, 0x592c0810, 0x59300017, 0x80040c80, 0x05000005, 0x05001004, - 0x80040000, 0x80140480, 0x05001008, 0x0529fa2b, + 0x80040000, 0x80140480, 0x05001008, 0x0529faa7, 0x900c1d41, 0x0501f01f, 0x84000514, 0x48026416, 0x48126017, 0x4813c857, 0x4c3c0000, 0x0501f8e7, 0x5c007800, 0x05020017, 0x5930500f, 0x592c0209, @@ -815,20 +815,20 @@ static const uint32_t isp_2500_risc_code[] = { 0x4822600e, 0x482a600f, 0x480fc857, 0x4833c857, 0x4823c857, 0x482bc857, 0x80000580, 0x483e6004, 0x1c01f000, 0x05f9fdb5, 0x4933c857, 0x4d2c0000, - 0x59900005, 0x81300580, 0x05fa0db0, 0x0531fcad, + 0x59900005, 0x81300580, 0x05fa0db0, 0x0531fd43, 0x05f80dae, 0x59325809, 0x4d3c0000, 0x4d400000, - 0x59300004, 0x4803c857, 0x4c000000, 0x0521fec2, - 0x0521fc40, 0x5c000000, 0x8c000516, 0x0500000d, + 0x59300004, 0x4803c857, 0x4c000000, 0x0521ff4e, + 0x0521fccc, 0x5c000000, 0x8c000516, 0x0500000d, 0x592c0010, 0x4803c857, 0x48025808, 0x41780800, - 0x600a8000, 0x0519faf7, 0x4a025c07, 0x0000ffff, - 0x492fc857, 0x0001fb2c, 0x0529f987, 0x0501f012, + 0x600a8000, 0x0519fb2d, 0x4a025c07, 0x0000ffff, + 0x492fc857, 0x0001fb2c, 0x0529f9ff, 0x0501f012, 0x640a6203, 0x592c0209, 0x8400054e, 0x48025a09, 0x59300407, 0x90000586, 0x05020009, 0x811800ca, 0x81c80c00, 0x58040939, 0x592c000e, 0x80040480, 0x592c0810, 0x80040480, 0x4802580c, 0x417a7800, - 0x0531f950, 0x5c028000, 0x5c027800, 0x5c025800, + 0x0531f9e3, 0x5c028000, 0x5c027800, 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x59900005, - 0x81300580, 0x05fa0d7d, 0x0531fc7a, 0x05f80d7b, + 0x81300580, 0x05fa0d7d, 0x0531fd10, 0x05f80d7b, 0x59325809, 0x592c0209, 0x84000540, 0x48025a09, 0x05fdf7ca, 0x491bc857, 0x4dd00000, 0x4c580000, 0x41780800, 0x8007a0ca, 0x83d3a400, 0x00007600, @@ -896,10 +896,10 @@ static const uint32_t isp_2500_risc_code[] = { 0x59e4b800, 0x485fc857, 0x905c051f, 0x05fa0c77, 0x825c0500, 0x000000e0, 0x05f80c74, 0x8c5c050e, 0x05020807, 0x8c5c050c, 0x05020809, 0x8c5c050a, - 0x05020902, 0x5c00b800, 0x1c01f000, 0x4803c856, + 0x05020900, 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4a03c800, 0x00000080, 0x1c01f000, 0x4d2c0000, - 0x42007800, 0x00109885, 0x583c0003, 0x583c0804, - 0x80040540, 0x05000037, 0x42000800, 0x00109731, + 0x42007800, 0x00109905, 0x583c0003, 0x583c0804, + 0x80040540, 0x05000037, 0x42000800, 0x001097b1, 0x50065800, 0x592c0002, 0x90000580, 0x05000031, 0x59e40050, 0x59e40852, 0x80040480, 0x82000500, 0xfffffc00, 0x05020005, 0x59e40050, 0x59e40851, @@ -914,1707 +914,1708 @@ static const uint32_t isp_2500_risc_code[] = { 0x480a5806, 0x48065807, 0x59e40053, 0x800000c4, 0x48025805, 0x412c1000, 0x492fc857, 0x0001f81c, 0x5c025800, 0x6503c800, 0x1c01f000, 0x42007800, - 0x00109731, 0x503c7800, 0x4a007802, 0x00000100, - 0x42007800, 0x00109885, 0x583c0000, 0x84000552, + 0x001097b1, 0x503c7800, 0x4a007802, 0x00000100, + 0x42007800, 0x00109905, 0x583c0000, 0x84000552, 0x48007800, 0x583c100c, 0x480bc857, 0x80081000, 0x4808780c, 0x583c180b, 0x800c19c0, 0x05000013, 0x90080503, 0x05020011, 0x583c0007, 0x4803c857, 0x583c2008, 0x4813c857, 0x80102000, 0x80100580, 0x05020002, 0x41782000, 0x48107808, 0x400c0000, 0x80080580, 0x05020005, 0x4978780c, 0x60041800, - 0x60a01100, 0x050dffd7, 0x1c01f000, 0x42007800, - 0x00109885, 0x4d2c0000, 0x4c5c0000, 0x4c600000, + 0x60a01100, 0x050dffdb, 0x1c01f000, 0x42007800, + 0x00109905, 0x4d2c0000, 0x4c5c0000, 0x4c600000, 0x4030b800, 0x583cc000, 0x4a00b802, 0x00000100, 0x583c2015, 0x80100800, 0x583c0013, 0x80040580, 0x05020003, 0x8460c554, 0x41780800, 0x48047815, 0x8c600502, 0x05f80bf1, 0x8460c502, 0x48607800, - 0x42000000, 0x00109732, 0x50000000, 0x80300580, + 0x42000000, 0x001097b2, 0x50000000, 0x80300580, 0x05fa0bea, 0x583c081e, 0x800409c0, 0x05000008, 0x583c001f, 0x80040580, 0x05020005, 0x4978781f, - 0x60081800, 0x60a01100, 0x050dffb2, 0x8c600508, - 0x050a0999, 0x5c00c000, 0x5c00b800, 0x5c025800, + 0x60081800, 0x60a01100, 0x050dffb6, 0x8c600508, + 0x050a099e, 0x5c00c000, 0x5c00b800, 0x5c025800, 0x1c01f000, 0x4d2c0000, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x42000800, 0x00109732, 0x50065800, - 0x4a025808, 0x00100de3, 0x6000c008, 0x4200b800, - 0x00109885, 0x585cc800, 0x4867c857, 0x8d0c052a, - 0x05020011, 0x40ee5800, 0x492fc857, 0x4a025802, + 0x4c640000, 0x42000800, 0x001097b2, 0x50065800, + 0x4a025808, 0x00100de3, 0x6000c002, 0x4200b800, + 0x00109905, 0x585cc800, 0x4867c857, 0x8d0c052a, + 0x0502000f, 0x40ee5800, 0x492fc857, 0x4a025802, 0x00000100, 0x585c0014, 0x80000000, 0x90000503, - 0x4800b814, 0x4a025808, 0x00101fa1, 0x585cc017, - 0x8260c500, 0x000000ff, 0x05f80bbc, 0x8060c0c4, - 0x4863c857, 0x4c580000, 0x61e8b001, 0x8058b040, - 0x05f80bb6, 0x8c640502, 0x0500000b, 0x8d0c052a, - 0x05fa0bb2, 0x4c580000, 0x4c600000, 0x0001f988, - 0x585cc800, 0x5c00c000, 0x5c00b000, 0x485bc857, - 0x05fdf7f3, 0x5c00b000, 0x4200b800, 0x00109885, - 0x8464cd42, 0x4864b800, 0x592c0002, 0x90000580, - 0x05f80ba2, 0x585c100d, 0x585c0014, 0x585c0818, - 0x4978b818, 0x80000040, 0x05000005, 0x82040400, - 0x00000100, 0x4800b818, 0x80081400, 0x492fc857, - 0x480bc857, 0x4863c857, 0x480a5803, 0x585c001d, - 0x4803c857, 0x585c180e, 0x800c1400, 0x480a5806, - 0x4808b81b, 0x80600400, 0x4800b81d, 0x4803c857, - 0x800c0400, 0x4800b819, 0x585c0810, 0x4807c857, - 0x4803c857, 0x80040d80, 0x05020004, 0x4978b81d, - 0x585c080e, 0x4804b819, 0x585c080e, 0x80040580, - 0x82000500, 0x000003ff, 0x05020004, 0x585c001f, - 0x80000000, 0x4800b81f, 0x585c080f, 0x48065807, - 0x4807c857, 0x64025801, 0x48625805, 0x412c1000, - 0x0001f81c, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x5c025800, 0x1c01f000, 0x6483c800, 0x053dfa12, - 0x59e40000, 0x1c01f000, 0x60001020, 0x80081040, - 0x05000022, 0x053dfb30, 0x05fc07fd, 0x59800801, - 0x82040d00, 0xfff006ff, 0x82040d40, 0x000ff900, - 0x48070001, 0x59e00002, 0x8c00051e, 0x05020016, - 0x605c00f4, 0x50001000, 0x82081500, 0x03f00000, - 0x82080580, 0x00800000, 0x0500000f, 0x61901000, - 0x80081040, 0x0500000c, 0x59800881, 0x8c040514, - 0x05fc07fc, 0x82040500, 0x00000180, 0x82000580, - 0x00000180, 0x05020004, 0x59800080, 0x84000540, - 0x48030080, 0x90000541, 0x64030000, 0x1c01f000, - 0x053dfb0d, 0x59800802, 0x4807c857, 0x8c040520, - 0x05000007, 0x64030000, 0x60101020, 0x50080000, - 0x8400054c, 0x44001000, 0x0501f000, 0x82040500, - 0x00001084, 0x05fa0b35, 0x8c040510, 0x05000006, - 0x42000000, 0x00109883, 0x053df9df, 0x4a030002, - 0x00000100, 0x8c040522, 0x0500002d, 0x59e00002, - 0x8c00051e, 0x0502002a, 0x601c20f6, 0x50102800, - 0x4817c857, 0x605c00f4, 0x50003000, 0x82180500, - 0x000f0000, 0x40003800, 0x40144000, 0x821c0580, - 0x00020000, 0x05020002, 0x902041c0, 0x8c18050c, - 0x05000002, 0x842041c0, 0x82204500, 0x000000ff, - 0x90204401, 0x8c200510, 0x05000005, 0x42000000, - 0x00109884, 0x053df9c0, 0x61fc4001, 0x42001800, - 0xffffff00, 0x8c18050c, 0x05000003, 0x840c19c0, - 0x842041c0, 0x821c0580, 0x00020000, 0x05020003, - 0x900c19c0, 0x902041c0, 0x800c0505, 0x80200540, - 0x44002000, 0x4a030002, 0x00020000, 0x64030000, - 0x1c01f000, 0x4d2c0000, 0x64007000, 0x82040d00, - 0x43200f80, 0x05fa0af9, 0x58380008, 0x4803c00f, - 0x4a0370e4, 0x00003000, 0x0531fd4f, 0x583a5807, - 0x592c0000, 0x48007007, 0x800001c0, 0x05020002, - 0x49787006, 0x05f9fe7f, 0x5c025800, 0x42007000, - 0x00020a09, 0x0001f031, 0x4803c856, 0x4c3c0000, - 0x4d2c0000, 0x4d300000, 0x58300009, 0x80025d40, - 0x05f80ae2, 0x592e6009, 0x4c300000, 0x0531fd54, - 0x5c006000, 0x05f80add, 0x58300002, 0x82000580, - 0x00000100, 0x0502000d, 0x5930780d, 0x583c0001, - 0x80007d40, 0x0500000b, 0x4802600d, 0x90000402, - 0x48006003, 0x583c0000, 0x48006005, 0x40301000, - 0x0001f81c, 0x0501f008, 0x640a5a07, 0x492fc857, - 0x4c300000, 0x0001fb2c, 0x5c025800, 0x05f9fe59, - 0x0005f8e7, 0x5c026000, 0x5c025800, 0x5c007800, - 0x1c01f000, 0x4803c856, 0x4d2c0000, 0x4d300000, - 0x42007000, 0x00020a09, 0x58380800, 0x90040582, - 0x05020010, 0x58386001, 0x58300009, 0x812c0580, - 0x0502000c, 0x59e00004, 0x8c00050e, 0x05fc07fe, - 0x59dc0006, 0x4803c857, 0x4a03b805, 0x20000000, - 0x8c00053e, 0x05fc07f8, 0x64007000, 0x0501f018, - 0x58386005, 0x40305000, 0x803061c0, 0x05f80aa7, - 0x58300009, 0x812c0580, 0x05000004, 0x40305000, - 0x58306000, 0x05fdf7f9, 0x40280000, 0x80300580, - 0x58300000, 0x05000006, 0x48005000, 0x800001c0, - 0x05020007, 0x48287004, 0x0501f005, 0x800001c0, - 0x05020002, 0x48007004, 0x48007005, 0x40325800, - 0x05f9fe24, 0x5c026000, 0x5c025800, 0x0001f02b, - 0x4d2c0000, 0x0001f813, 0x05f80a8c, 0x412c1000, - 0x5c025800, 0x4a001008, 0x0002019d, 0x90080409, - 0x48001003, 0x0001f193, 0x4d2c0000, 0x40325800, - 0x05f9fe15, 0x5c025800, 0x1c01f000, 0x4807c857, - 0x05f9fa7e, 0x42001000, 0x00109c51, 0x4a001003, - 0x00109c5a, 0x4a001008, 0x0002019d, 0x49781009, - 0x1c01f000, 0x59e00017, 0x8c000500, 0x1c01f000, - 0x0001f9a6, 0x4d040000, 0x4c640000, 0x4c600000, - 0x40120800, 0x400cc800, 0x4014c000, 0x0501f021, - 0x4803c856, 0x42000800, 0x4fffffff, 0x46000800, - 0x00002bad, 0x50040000, 0x0501f000, 0x59e00017, - 0x8c00050c, 0x05020005, 0x59a80866, 0x58040003, - 0x8c000500, 0x0500000d, 0x4c080000, 0x59a81065, - 0x50080000, 0x84000542, 0x44001000, 0x5c001000, - 0x59e00017, 0x8c00050c, 0x05fe07fe, 0x58040003, - 0x8c000500, 0x05fe07fb, 0x4d040000, 0x4c640000, - 0x4c600000, 0x5804c800, 0x58060801, 0x5804c002, - 0x4a03b805, 0x20000000, 0x59dc0006, 0x4a03b805, - 0x30000000, 0x59dc0006, 0x4a03b805, 0x70000000, - 0x59dc0006, 0x4867b800, 0x4907b801, 0x6413b802, - 0x601c00e2, 0x44600000, 0x4a03b805, 0x30000000, - 0x59dc0006, 0x4a03b805, 0x10000003, 0x59dc0006, - 0x8c00053e, 0x05fc07fe, 0x4a03b805, 0x20000000, - 0x59dc0006, 0x5c00c000, 0x5c00c800, 0x5c020800, - 0x1c01f000, 0x4803c856, 0x053dfa00, 0x0001f1af, - 0x4803c856, 0x60f00800, 0x48079000, 0x59c80000, - 0x80040500, 0x05fe07fe, 0x497b9005, 0x4a039035, - 0x00880400, 0x59a8000d, 0x800000e0, 0x4803900e, - 0x64939011, 0x4a03900f, 0x0010cca4, 0x4a039010, - 0x0010cca4, 0x65db9015, 0x4a039003, 0x00001f07, - 0x6503900d, 0x4a039000, 0x00001600, 0x1c01f000, - 0x59c80007, 0x8c000508, 0x05020880, 0x59c80800, - 0x8c040516, 0x05020003, 0x90000506, 0x0c01f004, - 0x4807c857, 0x9000050e, 0x0c01f001, 0x00100ff0, - 0x00100fef, 0x0010485b, 0x00100fef, 0x00100ff2, - 0x00100fef, 0x00100ff2, 0x00100ff2, 0x00100fef, - 0x00100fef, 0x00100fef, 0x00100fef, 0x00100ff2, - 0x00100fef, 0x00100ff2, 0x00100fef, 0x05f9f9f7, - 0x4803c857, 0x1c01f000, 0x59c8080c, 0x4807c857, - 0x82040500, 0x00006000, 0x05000003, 0x053df859, - 0x0501f005, 0x82040500, 0x007f0000, 0x05000004, - 0x053df826, 0x0521fbf2, 0x0501f02c, 0x90040514, - 0x0500000d, 0x053df87e, 0x916c0583, 0x05000008, - 0x0519f8da, 0x05000003, 0x0511fd8c, 0x0501f004, - 0x64075014, 0x6006d800, 0x0519f852, 0x0501f820, - 0x0501f01e, 0x82040500, 0x00001c00, 0x05000004, - 0x053df84e, 0x0501f81a, 0x0501f018, 0x82040500, - 0x00000140, 0x05000004, 0x053df85b, 0x0501f814, - 0x0501f012, 0x82040500, 0x00008000, 0x0500000f, - 0x0519f8c2, 0x0500000b, 0x59c400a4, 0x9000050f, - 0x9000058b, 0x05020007, 0x4c040000, 0x0511fd86, - 0x60780000, 0x80000040, 0x05fe07ff, 0x5c000800, - 0x053df821, 0x0501f802, 0x1c01f000, 0x4c0c0000, - 0x4c100000, 0x4c140000, 0x05fdfb17, 0x5c002800, - 0x5c002000, 0x5c001800, 0x1c01f000, 0x4803c856, - 0x59a80804, 0x59a80020, 0x82000500, 0xfffff000, - 0x80040540, 0x48035020, 0x59a80024, 0x82000500, - 0xfffff000, 0x80040540, 0x48035024, 0x48078882, - 0x82040480, 0x00000204, 0x05021004, 0x42001000, - 0x00240f04, 0x0501f00f, 0x82040480, 0x00000404, - 0x05021004, 0x42001000, 0x00440800, 0x0501f009, - 0x82040480, 0x00000804, 0x05021004, 0x42001000, - 0x00840410, 0x0501f003, 0x42001000, 0x00880400, - 0x480b9035, 0x0501f331, 0x59c80815, 0x05f9f985, - 0x40680800, 0xb0040d3c, 0x48079000, 0x59c80000, - 0x80040500, 0x05fe07fe, 0x8c040504, 0x0500001b, - 0x59c80035, 0x48039035, 0x59a80083, 0x80000540, - 0x05000016, 0x4c300000, 0x600060de, 0x58300801, - 0x82040d00, 0xffc00000, 0x8004090c, 0x58300000, - 0x90000541, 0x48006000, 0x58300000, 0x8c000500, - 0x05fe07fe, 0x82000500, 0xfc00ffff, 0x80040540, - 0x84000574, 0x48006000, 0x58300000, 0x8c000534, - 0x05fe07fe, 0x5c006000, 0x59c80000, 0x82000540, - 0x00001200, 0x48039000, 0x1c01f000, 0x42006000, - 0x7ff4c000, 0x58300003, 0x8c000502, 0x0502000a, - 0x600060de, 0x64686000, 0x58300000, 0x8c000504, - 0x05fe07fe, 0x641c6002, 0x59a80083, 0x84000540, - 0x48035083, 0x1c01f000, 0x600060de, 0x58300801, - 0x9004050c, 0x05fa0955, 0x60f00800, 0x05fdf7c6, - 0x4853c857, 0x497b8801, 0x850e1d1a, 0x5050b000, - 0x485bc857, 0x8058b1c0, 0x0500089d, 0x82580480, - 0x00000804, 0x0502189a, 0x60040000, 0x61000801, - 0x0501fd76, 0x40582000, 0x8050a000, 0x50500000, - 0x80102400, 0x9058b483, 0x8050a000, 0x485bc857, - 0x4853c857, 0x50501000, 0x80082404, 0x60101800, - 0x82080500, 0x000000ff, 0x61000821, 0x0501fd67, - 0x80081110, 0x800c1840, 0x05fe07fa, 0x8050a000, - 0x8058b040, 0x05fe07f4, 0x4803c856, 0x41780000, - 0x61000801, 0x0501fd5d, 0x50501000, 0x80082404, - 0x0502087b, 0x4803c856, 0x1c01f000, 0x4a035044, - 0xaabbccdd, 0x600c0000, 0x0501fcb0, 0x600c0000, - 0x0501fcd8, 0x60300868, 0x0501fd48, 0x90040541, - 0x60300868, 0x0501fd4d, 0x60480888, 0x0501fd43, - 0x90040548, 0x60480888, 0x0501fd48, 0x60180818, - 0x0501fd3e, 0x82040540, 0x00000080, 0x60180818, - 0x0501fd42, 0x60480828, 0x0501fd38, 0x90040541, - 0x60480828, 0x0501fd3d, 0x59a8004b, 0x8c00050e, - 0x05000006, 0x4803c857, 0x82000500, 0x0000ff00, - 0x80000110, 0x0501f002, 0x60e00001, 0x60300800, - 0x0501fd32, 0x60380940, 0x0501fd28, 0x82040500, - 0xffffff0f, 0x0501fecb, 0x05020003, 0x90000540, - 0x0501f002, 0x90000550, 0x60380940, 0x0501fd27, - 0x60380938, 0x0501fd1d, 0x90040550, 0x60380938, - 0x0501fd22, 0x60800000, 0x61000859, 0x0501fd1f, - 0x61000000, 0x61000851, 0x0501fd1c, 0x60300000, - 0x61800861, 0x0501fd19, 0x60840000, 0x61800821, - 0x0501fd16, 0x59c40001, 0x84000574, 0x48038801, - 0x850e1d5a, 0x61602004, 0x6029d000, 0x0501f83c, - 0x4813c857, 0x61000849, 0x0501fd04, 0x4807c857, - 0x82041500, 0x000000c0, 0x82081580, 0x000000c0, - 0x05000004, 0x80102040, 0x05000825, 0x05fdf7f3, - 0x4803c856, 0x60c82000, 0x6029d000, 0x0501f82c, - 0x60380878, 0x0501fcf5, 0x90040d01, 0x05020004, - 0x80102040, 0x0500081a, 0x05fdf7f8, 0x4803c856, - 0x61702001, 0x6029d000, 0x051dfda1, 0x60380818, - 0x0501fcea, 0x90040d10, 0x05020004, 0x80102040, - 0x05f808be, 0x05fdf7f8, 0x4803c856, 0x60a02000, - 0x6029d000, 0x051dfd96, 0x603808b8, 0x0501fcdf, - 0x90040d04, 0x05000004, 0x80102040, 0x05f808b3, - 0x05fdf7f8, 0x4803c856, 0x1c01f000, 0x4803c856, - 0x4a03c020, 0x00004010, 0x4a03c011, 0x40100011, - 0x05006000, 0x4203e000, 0x40000000, 0x4203e000, - 0x30000001, 0x4803c856, 0x0501f000, 0x61201801, - 0x800c1840, 0x05fe07ff, 0x80e9d040, 0x05fe07fc, - 0x1c01f000, 0x4803c856, 0x497b88a9, 0x64078807, - 0x497b8807, 0x59c40005, 0x48038805, 0x0501fdae, - 0x0501fdf1, 0x0501f9e3, 0x4a0388a7, 0x0000f7f7, - 0x4a0388a3, 0x8000403c, 0x4a0388ae, 0x000061a8, - 0x59c40001, 0x82000540, 0x184fa063, 0x48038801, - 0x4a038810, 0x00410108, 0x4a038811, 0x00520608, - 0x4a038812, 0x00450320, 0x4a038813, 0x00440405, - 0x4a03881c, 0x004132e1, 0x4a038850, 0x80000108, - 0x64238860, 0x64238870, 0x4a038851, 0x80000508, - 0x4a038861, 0x00800000, 0x4a038871, 0x00800000, - 0x4a038852, 0x80000708, 0x4a038862, 0x00800000, - 0x4a038872, 0x00800000, 0x4a038853, 0x80000608, - 0x497b8863, 0x4a038873, 0x00800000, 0x4a038882, - 0x00000840, 0x4a0388a5, 0x000000fe, 0x647b88a6, - 0x4a0388b0, 0x00007530, 0x4a038802, 0x0000ffff, - 0x4a038806, 0xc0e80b00, 0x1c01f000, 0x850e1d4e, - 0x1c01f000, 0x59c40805, 0x59c40006, 0x80040d00, - 0x05f8085a, 0x82040500, 0x00e80b00, 0x05020004, - 0x8c04053e, 0x050208c4, 0x0501f005, 0x82040500, - 0x00880b00, 0x05fa0847, 0x05f9f850, 0x4c5c0000, - 0x4c600000, 0x59c4b805, 0x59c410a3, 0x84081518, - 0x825c0500, 0x04000000, 0x05020d2d, 0x59c40006, - 0x8c000500, 0x05000003, 0x8c5c0500, 0x0502007f, - 0x485fc857, 0x0515ff39, 0x0500001a, 0x59c40005, - 0x82000500, 0x000000c0, 0x05000042, 0x0515ff54, - 0x05020040, 0x59c40006, 0x82000500, 0x000000f0, - 0x05020004, 0x4a038805, 0x000000c0, 0x0501f039, - 0x59a80015, 0x84000506, 0x48035015, 0x42006000, - 0xff203fff, 0x42006800, 0x40000000, 0x0511fd11, - 0x60400800, 0x42001000, 0x0010365a, 0x051dfcfb, - 0x8c5c0534, 0x0502002b, 0x4a035013, 0x0000aaaa, - 0x59c40005, 0x8c00050c, 0x0502000f, 0x8c00050e, - 0x05020015, 0x8c00050a, 0x0502001b, 0x8c000508, - 0x05000008, 0x59a80011, 0x90000589, 0x05020005, - 0x42000000, 0x0010974d, 0x0539fec3, 0x0519f8c3, - 0x0501f04c, 0x42000000, 0x0010975b, 0x0539febe, - 0x41781800, 0x60042000, 0x0501fce5, 0x64035014, - 0x0501f00e, 0x42000000, 0x0010975c, 0x0539feb6, - 0x41781800, 0x60082000, 0x0501fcdd, 0x640b5014, - 0x0501f006, 0x42000000, 0x0010974f, 0x0539feae, - 0x0519f854, 0x0501f037, 0x0519f900, 0x0501f035, - 0x8c5c0534, 0x05000031, 0x59c40005, 0x8c00053a, - 0x05020004, 0x42000000, 0x00109743, 0x0539fea2, - 0x4a038805, 0x20000000, 0x0515fee8, 0x0502000e, - 0x4a038805, 0x04000000, 0x59c418a8, 0x60002000, - 0x0501fcc3, 0x0515fef7, 0x05020005, 0x64075014, - 0x6006d800, 0x0515fe5b, 0x0501f050, 0x41780000, - 0x0515feae, 0x0501fcb3, 0x4000c000, 0x0501fc2e, - 0x916c1584, 0x0502000b, 0x8c5c0500, 0x05020013, - 0x8d0c0506, 0x05020004, 0x59c410a3, 0x90081548, - 0x480b88a3, 0x59c41006, 0x84081540, 0x480b8806, - 0x4a038805, 0x04000000, 0x6006d800, 0x497b5010, - 0x8d0c0518, 0x05020004, 0x4803c856, 0x850e1d06, - 0x0511fb92, 0x050dfe77, 0x8c5c053c, 0x0502084f, - 0x8c5c0500, 0x0500002e, 0x42000000, 0x00109860, - 0x0539fe71, 0x64078805, 0x6148b006, 0x6191d000, - 0x4c580000, 0x051dfc9a, 0x0501fba5, 0x5c00b000, - 0x05000004, 0x8058b040, 0x05fe07f9, 0x0501f003, - 0x64078805, 0x0501f01e, 0x59c40006, 0x84000500, - 0x48038806, 0x0521f9e0, 0x497b8880, 0x0501fd7d, - 0x05000007, 0x59e00013, 0x8c000516, 0x05000004, - 0x60142000, 0x0519f8de, 0x0501f003, 0x60182000, - 0x0519f8db, 0x59c400a3, 0x82000500, 0xfcf8ffff, - 0x480388a3, 0x640b5071, 0x6012d800, 0x64078805, - 0x05f9f9b9, 0x0501fb1f, 0x497b5036, 0x64075043, - 0x497b506c, 0x0201f800, 0x0010c52f, 0x825cbd00, - 0xbbfffffe, 0x485f8805, 0x5c00c000, 0x5c00b800, - 0x1c01f000, 0x4d180000, 0x59c41004, 0x480bc857, - 0x8c080500, 0x05000006, 0x4803c856, 0x4a01a8e5, - 0x00000800, 0x0521fa65, 0x0501f007, 0x82080500, - 0x000001f0, 0x05000004, 0x4803c856, 0x0521fb7f, - 0x05220a7d, 0x4a038805, 0x80000000, 0x5c023000, - 0x1c01f000, 0x59c408a3, 0x4807c857, 0x84040d40, - 0x480788a3, 0x1c01f000, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x4cd80000, 0x4a038805, - 0x40000000, 0x42000000, 0x00109755, 0x0539fe1e, - 0x051dfebb, 0x59c41004, 0x8c080500, 0x05000040, - 0x598e600b, 0x4a01a8e5, 0x00000800, 0x813261c0, - 0x05000024, 0x59300403, 0x900005b2, 0x05020021, - 0x5930001e, 0x48038833, 0x4a038807, 0x00018000, - 0x6009d000, 0x051dfc3a, 0x497b8807, 0x6009d000, - 0x051dfc37, 0x0521f8cb, 0x60c1d0ea, 0x051dfc34, - 0x59c408a4, 0x90040d0f, 0x90040d80, 0x05000004, - 0x42000000, 0x00200000, 0x0501fb85, 0x051dfe06, - 0x59300009, 0x80000540, 0x05f40f4c, 0x40025800, - 0x4a025a05, 0x00000103, 0x5931d823, 0x58ef400a, - 0x58ec0008, 0x0801f800, 0x0005f8e7, 0x0501f032, - 0x598c000d, 0x82001c80, 0x000000c8, 0x0502100c, - 0x80000000, 0x4803180d, 0x59c400a4, 0x9000050f, - 0x90000582, 0x05020004, 0x42000000, 0x00200000, - 0x0501fb6b, 0x051dfbb5, 0x0501f023, 0x4933c857, - 0x0521f8a4, 0x813261c0, 0x0500001f, 0x64066203, - 0x609e7000, 0x0005f905, 0x0501f01b, 0x0521fb27, - 0x05000019, 0x0521fb4e, 0x051dfbd1, 0x59926005, - 0x813261c0, 0x0500000d, 0x61201801, 0x0521fb16, - 0x0502000a, 0x59c400a4, 0x9000050f, 0x90000582, - 0x05020004, 0x42000000, 0x00200000, 0x0501fb50, - 0x051dfba0, 0x0501f008, 0x4933c857, 0x0521f832, - 0x813261c0, 0x05000004, 0x613e7000, 0x640e6203, - 0x0005f905, 0x5c01b000, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x051df645, 0x40680000, - 0x810c0d80, 0x8c04050e, 0x0500004e, 0x4803c857, - 0x8d0c050e, 0x0500001f, 0x850e1d0e, 0x497b5071, - 0x42000000, 0x0010973c, 0x0539fdaf, 0x0539fe5b, - 0x60441100, 0x59c40001, 0x82000500, 0x00018000, - 0x90001d80, 0x0500000b, 0x82001d80, 0x00008000, - 0x0500000a, 0x82001d80, 0x00010000, 0x05000009, - 0x82001d80, 0x00018000, 0x05000008, 0x05f5feef, - 0x60001800, 0x0501f006, 0x60041800, 0x0501f004, - 0x600c1800, 0x0501f002, 0x60101800, 0x050df2b9, - 0x850e1d4e, 0x59a80871, 0x800409c0, 0x05020006, - 0x59c4000d, 0x8c000520, 0x05000003, 0x600c1800, - 0x0501f002, 0x40041800, 0x0539fe20, 0x4c0c0000, - 0x41782000, 0x0501fca7, 0x0500000f, 0x0501fc89, - 0x60042000, 0x0502000c, 0x0501fc94, 0x05020006, - 0x60082000, 0x0501f8b6, 0x05020007, 0x60102000, - 0x0501f005, 0x600c2000, 0x0501f890, 0x05020002, - 0x60142000, 0x5c001800, 0x60481100, 0x050dfa99, - 0x05f9f8e1, 0x0539fe83, 0x0502000a, 0x0501f845, - 0x4d400000, 0x4d3c0000, 0x60a28000, 0x60227800, - 0x0201f800, 0x0010b5d3, 0x5c027800, 0x5c028000, - 0x1c01f000, 0x4803c857, 0x82000400, 0x00101a21, - 0x50000800, 0x82040d00, 0x000000ff, 0x1c01f000, - 0x4803c856, 0x4c580000, 0x6040b000, 0x497b88ac, - 0x497b88ad, 0x8058b040, 0x05fe07fe, 0x5c00b000, - 0x1c01f000, 0x40680800, 0x4807c857, 0x4807500f, - 0x80041108, 0x6040b000, 0x497b88ac, 0x80000580, - 0x800811c0, 0x05020005, 0x9004050f, 0x82000400, - 0x001089c0, 0x50000000, 0x480388ad, 0x80081040, - 0x8058b040, 0x05fe07f6, 0x1c01f000, 0x4803c857, - 0x4c080000, 0x4c040000, 0x4c000000, 0x59c40892, - 0x4807c857, 0x80041580, 0x0500000e, 0x80041480, - 0x05021006, 0x80081080, 0x80081000, 0x4008b000, - 0x60040004, 0x0501f003, 0x4008b000, 0x60400004, - 0x48038886, 0x8058b040, 0x05fe07fe, 0x497b8886, - 0x5c000000, 0x5c000800, 0x5c001000, 0x1c01f000, - 0x4803c856, 0x8d0c0520, 0x05000003, 0x60ba8000, - 0x0535f780, 0x1c01f000, 0x0501f803, 0x40058800, - 0x1c01f000, 0x59a80083, 0x80000540, 0x05000008, - 0x0515fd6a, 0x60280800, 0x0502000e, 0x600008de, - 0x58040001, 0x8000092c, 0x0501f00a, 0x59c80835, - 0x82040d00, 0x00001f00, 0x80040910, 0x80040800, - 0x59a80083, 0x80000540, 0x05000002, 0x61680804, - 0x4807c857, 0x1c01f000, 0x59a80083, 0x80000540, - 0x0500001c, 0x599c1a01, 0x60a80801, 0x820c0480, - 0x00000204, 0x0500100a, 0x61680800, 0x820c0480, - 0x00000404, 0x05001006, 0x60b80800, 0x820c0480, - 0x00000804, 0x05001002, 0x60b40800, 0x4c300000, - 0x600060de, 0x58301000, 0x82081500, 0xfc00ffff, - 0x800400e0, 0x80080540, 0x84000574, 0x48006000, + 0x4800b814, 0x4a025808, 0x00101fa6, 0x585cc017, + 0x8260c500, 0x000000ff, 0x05f80bbc, 0x4c580000, + 0x61e8b001, 0x8058b040, 0x05f80bb8, 0x8c640502, + 0x0500000b, 0x8d0c052a, 0x05fa0bb4, 0x4c580000, + 0x4c600000, 0x0001f988, 0x585cc800, 0x5c00c000, + 0x5c00b000, 0x485bc857, 0x05fdf7f3, 0x5c00b000, + 0x4200b800, 0x00109905, 0x8464cd42, 0x4864b800, + 0x592c0002, 0x90000580, 0x05f80ba4, 0x585c100d, + 0x585c0018, 0x80081400, 0x80600400, 0x4800b818, + 0x585c0014, 0x800001c0, 0x05020002, 0x4978b818, + 0x8060c0c4, 0x492fc857, 0x480bc857, 0x4863c857, + 0x480a5803, 0x585c001d, 0x4803c857, 0x585c180e, + 0x800c1400, 0x480a5806, 0x4808b81b, 0x80600400, + 0x4800b81d, 0x4803c857, 0x800c0400, 0x4800b819, + 0x585c0810, 0x4807c857, 0x4803c857, 0x80040d80, + 0x05020004, 0x4978b81d, 0x585c080e, 0x4804b819, + 0x585c080e, 0x80040580, 0x82000500, 0x000003ff, + 0x05020004, 0x585c001f, 0x80000000, 0x4800b81f, + 0x585c080f, 0x48065807, 0x4807c857, 0x64025801, + 0x48625805, 0x412c1000, 0x0001f81c, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x5c025800, 0x1c01f000, + 0x6483c800, 0x053dfade, 0x59e40000, 0x1c01f000, + 0x60001020, 0x80081040, 0x05000022, 0x053dfbfc, + 0x05fc07fd, 0x59800801, 0x82040d00, 0xfff006ff, + 0x82040d40, 0x000ff900, 0x48070001, 0x59e00002, + 0x8c00051e, 0x05020016, 0x605c00f4, 0x50001000, + 0x82081500, 0x03f00000, 0x82080580, 0x00800000, + 0x0500000f, 0x61901000, 0x80081040, 0x0500000c, + 0x59800881, 0x8c040514, 0x05fc07fc, 0x82040500, + 0x00000180, 0x82000580, 0x00000180, 0x05020004, + 0x59800080, 0x84000540, 0x48030080, 0x90000541, + 0x64030000, 0x1c01f000, 0x053dfbd9, 0x59800802, + 0x4807c857, 0x8c040520, 0x05000007, 0x64030000, + 0x60101020, 0x50080000, 0x8400054c, 0x44001000, + 0x0501f000, 0x82040500, 0x00001084, 0x05fa0b37, + 0x8c040510, 0x05000006, 0x42000000, 0x00109903, + 0x053dfaab, 0x4a030002, 0x00000100, 0x8c040522, + 0x0500002d, 0x59e00002, 0x8c00051e, 0x0502002a, + 0x601c20f6, 0x50102800, 0x4817c857, 0x605c00f4, + 0x50003000, 0x82180500, 0x000f0000, 0x40003800, + 0x40144000, 0x821c0580, 0x00020000, 0x05020002, + 0x902041c0, 0x8c18050c, 0x05000002, 0x842041c0, + 0x82204500, 0x000000ff, 0x90204401, 0x8c200510, + 0x05000005, 0x42000000, 0x00109904, 0x053dfa8c, + 0x61fc4001, 0x42001800, 0xffffff00, 0x8c18050c, + 0x05000003, 0x840c19c0, 0x842041c0, 0x821c0580, + 0x00020000, 0x05020003, 0x900c19c0, 0x902041c0, + 0x800c0505, 0x80200540, 0x44002000, 0x4a030002, + 0x00020000, 0x64030000, 0x1c01f000, 0x4d2c0000, + 0x64007000, 0x82040d00, 0x43200f80, 0x05fa0afb, + 0x58380008, 0x4803c00f, 0x4a0370e4, 0x00003000, + 0x0531fde7, 0x583a5807, 0x592c0000, 0x48007007, + 0x800001c0, 0x05020002, 0x49787006, 0x05f9fe81, + 0x5c025800, 0x42007000, 0x00020a09, 0x0001f031, + 0x4803c856, 0x4c3c0000, 0x4d2c0000, 0x4d300000, + 0x58300009, 0x80025d40, 0x05f80ae4, 0x592e6009, + 0x4c300000, 0x0531fdec, 0x5c006000, 0x05f80adf, + 0x58300002, 0x82000580, 0x00000100, 0x0502000d, + 0x5930780d, 0x583c0001, 0x80007d40, 0x0500000b, + 0x4802600d, 0x90000402, 0x48006003, 0x583c0000, + 0x48006005, 0x40301000, 0x0001f81c, 0x0501f008, + 0x640a5a07, 0x492fc857, 0x4c300000, 0x0001fb2c, + 0x5c025800, 0x05f9fe5b, 0x0005f8e7, 0x5c026000, + 0x5c025800, 0x5c007800, 0x1c01f000, 0x4803c856, + 0x4d2c0000, 0x4d300000, 0x42007000, 0x00020a09, + 0x58380800, 0x90040582, 0x05020010, 0x58386001, + 0x58300009, 0x812c0580, 0x0502000c, 0x59e00004, + 0x8c00050e, 0x05fc07fe, 0x59dc0006, 0x4803c857, + 0x4a03b805, 0x20000000, 0x8c00053e, 0x05fc07f8, + 0x64007000, 0x0501f018, 0x58386005, 0x40305000, + 0x803061c0, 0x05f80aa9, 0x58300009, 0x812c0580, + 0x05000004, 0x40305000, 0x58306000, 0x05fdf7f9, + 0x40280000, 0x80300580, 0x58300000, 0x05000006, + 0x48005000, 0x800001c0, 0x05020007, 0x48287004, + 0x0501f005, 0x800001c0, 0x05020002, 0x48007004, + 0x48007005, 0x40325800, 0x05f9fe26, 0x5c026000, + 0x5c025800, 0x0001f02b, 0x4d2c0000, 0x0001f813, + 0x05f80a8e, 0x412c1000, 0x5c025800, 0x4a001008, + 0x0002019d, 0x90080409, 0x48001003, 0x0001f193, + 0x4d2c0000, 0x40325800, 0x05f9fe17, 0x5c025800, + 0x1c01f000, 0x4807c857, 0x05f9fa80, 0x42001000, + 0x00109cd1, 0x4a001003, 0x00109cda, 0x4a001008, + 0x0002019d, 0x49781009, 0x1c01f000, 0x59e00017, + 0x8c000500, 0x1c01f000, 0x0001f9a6, 0x4d040000, + 0x4c640000, 0x4c600000, 0x40120800, 0x400cc800, + 0x4014c000, 0x0501f021, 0x4803c856, 0x42000800, + 0x4fffffff, 0x46000800, 0x00002bad, 0x50040000, + 0x0501f000, 0x59e00017, 0x8c00050c, 0x05020005, + 0x59a80866, 0x58040003, 0x8c000500, 0x0500000d, + 0x4c080000, 0x59a81065, 0x50080000, 0x84000542, + 0x44001000, 0x5c001000, 0x59e00017, 0x8c00050c, + 0x05fe07fe, 0x58040003, 0x8c000500, 0x05fe07fb, + 0x4d040000, 0x4c640000, 0x4c600000, 0x5804c800, + 0x58060801, 0x5804c002, 0x4a03b805, 0x20000000, + 0x59dc0006, 0x4a03b805, 0x30000000, 0x59dc0006, + 0x4a03b805, 0x70000000, 0x59dc0006, 0x4867b800, + 0x4907b801, 0x6413b802, 0x601c00e2, 0x44600000, + 0x4a03b805, 0x30000000, 0x59dc0006, 0x4a03b805, + 0x10000003, 0x59dc0006, 0x8c00053e, 0x05fc07fe, + 0x4a03b805, 0x20000000, 0x59dc0006, 0x5c00c000, + 0x5c00c800, 0x5c020800, 0x1c01f000, 0x4803c856, + 0x053dfacc, 0x0001f1af, 0x4803c856, 0x60f00800, + 0x48079000, 0x59c80000, 0x80040500, 0x05fe07fe, + 0x497b9005, 0x4a039035, 0x00880400, 0x59a8000d, + 0x800000e0, 0x4803900e, 0x64939011, 0x4a03900f, + 0x0010ccb4, 0x4a039010, 0x0010ccb4, 0x65db9015, + 0x4a039003, 0x00001f07, 0x6503900d, 0x4a039000, + 0x00001600, 0x1c01f000, 0x59c80007, 0x8c000508, + 0x05020880, 0x59c80800, 0x8c040516, 0x05020003, + 0x90000506, 0x0c01f004, 0x4807c857, 0x9000050e, + 0x0c01f001, 0x00100fee, 0x00100fed, 0x001048a4, + 0x00100fed, 0x00100ff0, 0x00100fed, 0x00100ff0, + 0x00100ff0, 0x00100fed, 0x00100fed, 0x00100fed, + 0x00100fed, 0x00100ff0, 0x00100fed, 0x00100ff0, + 0x00100fed, 0x05f9f9f9, 0x4803c857, 0x1c01f000, + 0x59c8080c, 0x4807c857, 0x82040500, 0x00006000, + 0x05000003, 0x053df925, 0x0501f005, 0x82040500, + 0x007f0000, 0x05000004, 0x053df8f2, 0x0521fc80, + 0x0501f02c, 0x90040514, 0x0500000d, 0x053df94a, + 0x916c0583, 0x05000008, 0x0519f912, 0x05000003, + 0x0511fd9a, 0x0501f004, 0x64075014, 0x6006d800, + 0x0519f88a, 0x0501f820, 0x0501f01e, 0x82040500, + 0x00001c00, 0x05000004, 0x053df91a, 0x0501f81a, + 0x0501f018, 0x82040500, 0x00000140, 0x05000004, + 0x053df927, 0x0501f814, 0x0501f012, 0x82040500, + 0x00008000, 0x0500000f, 0x0519f8fa, 0x0500000b, + 0x59c400a4, 0x9000050f, 0x9000058b, 0x05020007, + 0x4c040000, 0x0511fd94, 0x60780000, 0x80000040, + 0x05fe07ff, 0x5c000800, 0x053df8ed, 0x0501f802, + 0x1c01f000, 0x4c0c0000, 0x4c100000, 0x4c140000, + 0x05fdfb19, 0x5c002800, 0x5c002000, 0x5c001800, + 0x1c01f000, 0x4803c856, 0x59a80804, 0x59a80020, + 0x82000500, 0xfffff000, 0x80040540, 0x48035020, + 0x59a80024, 0x82000500, 0xfffff000, 0x80040540, + 0x48035024, 0x48078882, 0x82040480, 0x00000204, + 0x05021004, 0x42001000, 0x00240f04, 0x0501f00f, + 0x82040480, 0x00000404, 0x05021004, 0x42001000, + 0x00440800, 0x0501f009, 0x82040480, 0x00000804, + 0x05021004, 0x42001000, 0x00840410, 0x0501f003, + 0x42001000, 0x00880400, 0x480b9035, 0x0501f331, + 0x59c80815, 0x05f9f987, 0x40680800, 0xb0040d3c, + 0x48079000, 0x59c80000, 0x80040500, 0x05fe07fe, + 0x8c040504, 0x0500001b, 0x59c80035, 0x48039035, + 0x59a80083, 0x80000540, 0x05000016, 0x4c300000, + 0x600060de, 0x58300801, 0x82040d00, 0xffc00000, + 0x8004090c, 0x58300000, 0x90000541, 0x48006000, + 0x58300000, 0x8c000500, 0x05fe07fe, 0x82000500, + 0xfc00ffff, 0x80040540, 0x84000574, 0x48006000, 0x58300000, 0x8c000534, 0x05fe07fe, 0x5c006000, - 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x4c000000, 0x59a80037, - 0x4803c857, 0x90000580, 0x5c000000, 0x1c01f000, - 0x0501f805, 0x60058800, 0x05000002, 0x60018800, - 0x1c01f000, 0x4c000000, 0x59a80037, 0x4803c857, - 0x90000581, 0x5c000000, 0x1c01f000, 0x0501f805, + 0x59c80000, 0x82000540, 0x00001200, 0x48039000, + 0x1c01f000, 0x42006000, 0x7ff4c000, 0x58300003, + 0x8c000502, 0x0502000a, 0x600060de, 0x64686000, + 0x58300000, 0x8c000504, 0x05fe07fe, 0x641c6002, + 0x59a80083, 0x84000540, 0x48035083, 0x1c01f000, + 0x600060de, 0x58300801, 0x9004050c, 0x05fa0957, + 0x60f00800, 0x05fdf7c6, 0x4853c857, 0x497b8801, + 0x850e1d1a, 0x5050b000, 0x485bc857, 0x8058b1c0, + 0x0500089d, 0x82580480, 0x00000804, 0x0502189a, + 0x60040000, 0x61000801, 0x0501fd76, 0x40582000, + 0x8050a000, 0x50500000, 0x80102400, 0x9058b483, + 0x8050a000, 0x485bc857, 0x4853c857, 0x50501000, + 0x80082404, 0x60101800, 0x82080500, 0x000000ff, + 0x61000821, 0x0501fd67, 0x80081110, 0x800c1840, + 0x05fe07fa, 0x8050a000, 0x8058b040, 0x05fe07f4, + 0x4803c856, 0x41780000, 0x61000801, 0x0501fd5d, + 0x50501000, 0x80082404, 0x0502087b, 0x4803c856, + 0x1c01f000, 0x4a035044, 0xaabbccdd, 0x600c0000, + 0x0501fcb0, 0x600c0000, 0x0501fcd8, 0x60300868, + 0x0501fd48, 0x90040541, 0x60300868, 0x0501fd4d, + 0x60480888, 0x0501fd43, 0x90040548, 0x60480888, + 0x0501fd48, 0x60180818, 0x0501fd3e, 0x82040540, + 0x00000080, 0x60180818, 0x0501fd42, 0x60480828, + 0x0501fd38, 0x90040541, 0x60480828, 0x0501fd3d, + 0x59a8004b, 0x8c00050e, 0x05000006, 0x4803c857, + 0x82000500, 0x0000ff00, 0x80000110, 0x0501f002, + 0x60e00001, 0x60300800, 0x0501fd32, 0x60380940, + 0x0501fd28, 0x82040500, 0xffffff0f, 0x0501fecb, + 0x05020003, 0x90000540, 0x0501f002, 0x90000550, + 0x60380940, 0x0501fd27, 0x60380938, 0x0501fd1d, + 0x90040550, 0x60380938, 0x0501fd22, 0x60800000, + 0x61000859, 0x0501fd1f, 0x61000000, 0x61000851, + 0x0501fd1c, 0x60300000, 0x61800861, 0x0501fd19, + 0x60840000, 0x61800821, 0x0501fd16, 0x59c40001, + 0x84000574, 0x48038801, 0x850e1d5a, 0x61602004, + 0x6029d000, 0x0501f83c, 0x4813c857, 0x61000849, + 0x0501fd04, 0x4807c857, 0x82041500, 0x000000c0, + 0x82081580, 0x000000c0, 0x05000004, 0x80102040, + 0x05000825, 0x05fdf7f3, 0x4803c856, 0x60c82000, + 0x6029d000, 0x0501f82c, 0x60380878, 0x0501fcf5, + 0x90040d01, 0x05020004, 0x80102040, 0x0500081a, + 0x05fdf7f8, 0x4803c856, 0x61702001, 0x6029d000, + 0x051dfe2f, 0x60380818, 0x0501fcea, 0x90040d10, + 0x05020004, 0x80102040, 0x05f808c0, 0x05fdf7f8, + 0x4803c856, 0x60a02000, 0x6029d000, 0x051dfe24, + 0x603808b8, 0x0501fcdf, 0x90040d04, 0x05000004, + 0x80102040, 0x05f808b5, 0x05fdf7f8, 0x4803c856, + 0x1c01f000, 0x4803c856, 0x4a03c020, 0x00004010, + 0x4a03c011, 0x40100011, 0x05006000, 0x4203e000, + 0x40000000, 0x4203e000, 0x30000001, 0x4803c856, + 0x0501f000, 0x61201801, 0x800c1840, 0x05fe07ff, + 0x80e9d040, 0x05fe07fc, 0x1c01f000, 0x4803c856, + 0x497b88a9, 0x64078807, 0x497b8807, 0x59c40005, + 0x48038805, 0x0501fdae, 0x0501fdf1, 0x0501f9e3, + 0x4a0388a7, 0x0000f7f7, 0x4a0388a3, 0x8000403c, + 0x4a0388ae, 0x000061a8, 0x59c40001, 0x82000540, + 0x184fa063, 0x48038801, 0x4a038810, 0x00410108, + 0x4a038811, 0x00520608, 0x4a038812, 0x00450320, + 0x4a038813, 0x00440405, 0x4a03881c, 0x004132e1, + 0x4a038850, 0x80000108, 0x64238860, 0x64238870, + 0x4a038851, 0x80000508, 0x4a038861, 0x00800000, + 0x4a038871, 0x00800000, 0x4a038852, 0x80000708, + 0x4a038862, 0x00800000, 0x4a038872, 0x00800000, + 0x4a038853, 0x80000608, 0x497b8863, 0x4a038873, + 0x00800000, 0x4a038882, 0x00000840, 0x4a0388a5, + 0x000000fe, 0x647b88a6, 0x4a0388b0, 0x00007530, + 0x4a038802, 0x0000ffff, 0x4a038806, 0xc0e80b00, + 0x1c01f000, 0x850e1d4e, 0x1c01f000, 0x59c40805, + 0x59c40006, 0x80040d00, 0x05f8085c, 0x82040500, + 0x00e80b00, 0x05020004, 0x8c04053e, 0x050208c4, + 0x0501f005, 0x82040500, 0x00880b00, 0x05fa0849, + 0x05f9f852, 0x4c5c0000, 0x4c600000, 0x59c4b805, + 0x59c410a3, 0x84081518, 0x825c0500, 0x04000000, + 0x05020d2d, 0x59c40006, 0x8c000500, 0x05000003, + 0x8c5c0500, 0x0502007f, 0x485fc857, 0x0515ff71, + 0x0500001a, 0x59c40005, 0x82000500, 0x000000c0, + 0x05000042, 0x0515ff8c, 0x05020040, 0x59c40006, + 0x82000500, 0x000000f0, 0x05020004, 0x4a038805, + 0x000000c0, 0x0501f039, 0x59a80015, 0x84000506, + 0x48035015, 0x42006000, 0xff203fff, 0x42006800, + 0x40000000, 0x0511fd1f, 0x60400800, 0x42001000, + 0x00103666, 0x051dfd89, 0x8c5c0534, 0x0502002b, + 0x4a035013, 0x0000aaaa, 0x59c40005, 0x8c00050c, + 0x0502000f, 0x8c00050e, 0x05020015, 0x8c00050a, + 0x0502001b, 0x8c000508, 0x05000008, 0x59a80011, + 0x90000589, 0x05020005, 0x42000000, 0x001097cd, + 0x0539ff8f, 0x0519f8fb, 0x0501f04c, 0x42000000, + 0x001097db, 0x0539ff8a, 0x41781800, 0x60042000, + 0x0501fce5, 0x64035014, 0x0501f00e, 0x42000000, + 0x001097dc, 0x0539ff82, 0x41781800, 0x60082000, + 0x0501fcdd, 0x640b5014, 0x0501f006, 0x42000000, + 0x001097cf, 0x0539ff7a, 0x0519f88c, 0x0501f037, + 0x0519f938, 0x0501f035, 0x8c5c0534, 0x05000031, + 0x59c40005, 0x8c00053a, 0x05020004, 0x42000000, + 0x001097c3, 0x0539ff6e, 0x4a038805, 0x20000000, + 0x0515ff20, 0x0502000e, 0x4a038805, 0x04000000, + 0x59c418a8, 0x60002000, 0x0501fcc3, 0x0515ff2f, + 0x05020005, 0x64075014, 0x6006d800, 0x0515fe93, + 0x0501f050, 0x41780000, 0x0515fee6, 0x0501fcb3, + 0x4000c000, 0x0501fc2e, 0x916c1584, 0x0502000b, + 0x8c5c0500, 0x05020013, 0x8d0c0506, 0x05020004, + 0x59c410a3, 0x90081548, 0x480b88a3, 0x59c41006, + 0x84081540, 0x480b8806, 0x4a038805, 0x04000000, + 0x6006d800, 0x497b5010, 0x8d0c0518, 0x05020004, + 0x4803c856, 0x850e1d06, 0x0511fba0, 0x050dfe85, + 0x8c5c053c, 0x0502084f, 0x8c5c0500, 0x0500002e, + 0x42000000, 0x001098e0, 0x0539ff3d, 0x64078805, + 0x6148b006, 0x6191d000, 0x4c580000, 0x051dfd28, + 0x0501fba5, 0x5c00b000, 0x05000004, 0x8058b040, + 0x05fe07f9, 0x0501f003, 0x64078805, 0x0501f01e, + 0x59c40006, 0x84000500, 0x48038806, 0x0521fa6e, + 0x497b8880, 0x0501fd7d, 0x05000007, 0x59e00013, + 0x8c000516, 0x05000004, 0x60142000, 0x0519f916, + 0x0501f003, 0x60182000, 0x0519f913, 0x59c400a3, + 0x82000500, 0xfcf8ffff, 0x480388a3, 0x640b5071, + 0x6012d800, 0x64078805, 0x05f9f9bb, 0x0501fb1f, + 0x497b5036, 0x64075043, 0x497b506c, 0x0201f800, + 0x0010c534, 0x825cbd00, 0xbbfffffe, 0x485f8805, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4d180000, + 0x59c41004, 0x480bc857, 0x8c080500, 0x05000006, + 0x4803c856, 0x4a01a8e5, 0x00000800, 0x0521faf3, + 0x0501f007, 0x82080500, 0x000001f0, 0x05000004, + 0x4803c856, 0x0521fc0d, 0x05220b0b, 0x4a038805, + 0x80000000, 0x5c023000, 0x1c01f000, 0x59c408a3, + 0x4807c857, 0x84040d40, 0x480788a3, 0x1c01f000, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x4cd80000, 0x4a038805, 0x40000000, 0x42000000, + 0x001097d5, 0x0539feea, 0x051dff49, 0x59c41004, + 0x8c080500, 0x05000040, 0x598e600b, 0x4a01a8e5, + 0x00000800, 0x813261c0, 0x05000024, 0x59300403, + 0x900005b2, 0x05020021, 0x5930001e, 0x48038833, + 0x4a038807, 0x00018000, 0x6009d000, 0x051dfcc8, + 0x497b8807, 0x6009d000, 0x051dfcc5, 0x0521f959, + 0x60c1d0ea, 0x051dfcc2, 0x59c408a4, 0x90040d0f, + 0x90040d80, 0x05000004, 0x42000000, 0x00200000, + 0x0501fb85, 0x051dfe94, 0x59300009, 0x80000540, + 0x05f40f4e, 0x40025800, 0x4a025a05, 0x00000103, + 0x5931d823, 0x58ef400a, 0x58ec0008, 0x0801f800, + 0x0005f8e7, 0x0501f032, 0x598c000d, 0x82001c80, + 0x000000c8, 0x0502100c, 0x80000000, 0x4803180d, + 0x59c400a4, 0x9000050f, 0x90000582, 0x05020004, + 0x42000000, 0x00200000, 0x0501fb6b, 0x051dfc43, + 0x0501f023, 0x4933c857, 0x0521f932, 0x813261c0, + 0x0500001f, 0x64066203, 0x609e7000, 0x0005f905, + 0x0501f01b, 0x0521fbb5, 0x05000019, 0x0521fbdc, + 0x051dfc5f, 0x59926005, 0x813261c0, 0x0500000d, + 0x61201801, 0x0521fba4, 0x0502000a, 0x59c400a4, + 0x9000050f, 0x90000582, 0x05020004, 0x42000000, + 0x00200000, 0x0501fb50, 0x051dfc2e, 0x0501f008, + 0x4933c857, 0x0521f8c0, 0x813261c0, 0x05000004, + 0x613e7000, 0x640e6203, 0x0005f905, 0x5c01b000, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x051df6d3, 0x40680000, 0x810c0d80, 0x8c04050e, + 0x0500004e, 0x4803c857, 0x8d0c050e, 0x0500001f, + 0x850e1d0e, 0x497b5071, 0x42000000, 0x001097bc, + 0x0539fe7b, 0x0539ff27, 0x60441100, 0x59c40001, + 0x82000500, 0x00018000, 0x90001d80, 0x0500000b, + 0x82001d80, 0x00008000, 0x0500000a, 0x82001d80, + 0x00010000, 0x05000009, 0x82001d80, 0x00018000, + 0x05000008, 0x05f5fef1, 0x60001800, 0x0501f006, + 0x60041800, 0x0501f004, 0x600c1800, 0x0501f002, + 0x60101800, 0x050df2bf, 0x850e1d4e, 0x59a80871, + 0x800409c0, 0x05020006, 0x59c4000d, 0x8c000520, + 0x05000003, 0x600c1800, 0x0501f002, 0x40041800, + 0x0539feec, 0x4c0c0000, 0x41782000, 0x0501fca7, + 0x0500000f, 0x0501fc89, 0x60042000, 0x0502000c, + 0x0501fc94, 0x05020006, 0x60082000, 0x0501f8b6, + 0x05020007, 0x60102000, 0x0501f005, 0x600c2000, + 0x0501f890, 0x05020002, 0x60142000, 0x5c001800, + 0x60481100, 0x050dfa9f, 0x05f9f8e3, 0x0539ff4f, + 0x0502000a, 0x0501f845, 0x4d400000, 0x4d3c0000, + 0x60a28000, 0x60227800, 0x0201f800, 0x0010b5e0, + 0x5c027800, 0x5c028000, 0x1c01f000, 0x4803c857, + 0x82000400, 0x00101a23, 0x50000800, 0x82040d00, + 0x000000ff, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x6040b000, 0x497b88ac, 0x497b88ad, 0x8058b040, + 0x05fe07fe, 0x5c00b000, 0x1c01f000, 0x40680800, + 0x4807c857, 0x4807500f, 0x80041108, 0x6040b000, + 0x497b88ac, 0x80000580, 0x800811c0, 0x05020005, + 0x9004050f, 0x82000400, 0x00108a8d, 0x50000000, + 0x480388ad, 0x80081040, 0x8058b040, 0x05fe07f6, + 0x1c01f000, 0x4803c857, 0x4c080000, 0x4c040000, + 0x4c000000, 0x59c40892, 0x4807c857, 0x80041580, + 0x0500000e, 0x80041480, 0x05021006, 0x80081080, + 0x80081000, 0x4008b000, 0x60040004, 0x0501f003, + 0x4008b000, 0x60400004, 0x48038886, 0x8058b040, + 0x05fe07fe, 0x497b8886, 0x5c000000, 0x5c000800, + 0x5c001000, 0x1c01f000, 0x4803c856, 0x8d0c0520, + 0x05000003, 0x60ba8000, 0x0539f033, 0x1c01f000, + 0x0501f803, 0x40058800, 0x1c01f000, 0x59a80083, + 0x80000540, 0x05000008, 0x0515fda2, 0x60280800, + 0x0502000e, 0x600008de, 0x58040001, 0x8000092c, + 0x0501f00a, 0x59c80835, 0x82040d00, 0x00001f00, + 0x80040910, 0x80040800, 0x59a80083, 0x80000540, + 0x05000002, 0x61680804, 0x4807c857, 0x1c01f000, + 0x59a80083, 0x80000540, 0x0500001c, 0x599c1a01, + 0x60a80801, 0x820c0480, 0x00000204, 0x0500100a, + 0x61680800, 0x820c0480, 0x00000404, 0x05001006, + 0x60b80800, 0x820c0480, 0x00000804, 0x05001002, + 0x60b40800, 0x4c300000, 0x600060de, 0x58301000, + 0x82081500, 0xfc00ffff, 0x800400e0, 0x80080540, + 0x84000574, 0x48006000, 0x58300000, 0x8c000534, + 0x05fe07fe, 0x5c006000, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, - 0x4c000000, 0x59a80037, 0x4803c857, 0x90000583, + 0x4c000000, 0x59a80037, 0x4803c857, 0x90000580, 0x5c000000, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, 0x4c000000, - 0x59a80037, 0x4803c857, 0x90000584, 0x5c000000, + 0x59a80037, 0x4803c857, 0x90000581, 0x5c000000, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, 0x4c000000, 0x59a80037, - 0x90000582, 0x5c000000, 0x1c01f000, 0x4c000000, - 0x4c040000, 0x4c080000, 0x4c380000, 0x59a8003a, - 0x90000c87, 0x05f61e05, 0x0c01f806, 0x5c007000, - 0x5c001000, 0x5c000800, 0x5c000000, 0x1c01f000, - 0x001013ef, 0x001013fc, 0x00101409, 0x0010140a, - 0x00101428, 0x00101429, 0x0010142a, 0x4803c856, - 0x6403503c, 0x600c0000, 0x0501f9aa, 0x600c0000, - 0x0501f97e, 0x0501fa06, 0x4803c856, 0x641b503a, - 0x60740800, 0x42001000, 0x0010142b, 0x051df2a5, - 0x497b503f, 0x64db5034, 0x64ab5033, 0x4803c856, - 0x6407503c, 0x600c0000, 0x0501f970, 0x4803c856, - 0x641b503a, 0x60740800, 0x42001000, 0x0010142b, - 0x051df298, 0x05f5fddd, 0x64db5034, 0x4803c856, - 0x640f503c, 0x60000800, 0x0501fa00, 0x90040d1c, - 0x9004059c, 0x05000008, 0x90040598, 0x05000008, - 0x90040594, 0x05000008, 0x90040590, 0x05000008, - 0x05f5fdce, 0x60040000, 0x0501f006, 0x60000000, - 0x0501f004, 0x60080000, 0x0501f002, 0x600c0000, - 0x0501f952, 0x497b5040, 0x4803c856, 0x641b503a, - 0x60740800, 0x42001000, 0x0010142b, 0x051df279, - 0x05f5fdbe, 0x05f5fdbd, 0x1c01f000, 0x4c000000, - 0x4c040000, 0x4c080000, 0x4c380000, 0x59a8003c, - 0x90000c87, 0x05f61db5, 0x0c01f806, 0x5c007000, - 0x5c001000, 0x5c000800, 0x5c000000, 0x1c01f000, - 0x0010143f, 0x0010145b, 0x001014ac, 0x001014c1, - 0x001014d5, 0x001014de, 0x001014df, 0x0501f990, - 0x05020018, 0x59a81042, 0x60000800, 0x0501f9cb, - 0x90040d1c, 0x9004059c, 0x05000008, 0x90040598, - 0x05000008, 0x90040594, 0x05000008, 0x90040590, - 0x05000008, 0x05f5fd99, 0x84081540, 0x0501f006, - 0x84081542, 0x0501f004, 0x84081544, 0x0501f002, - 0x84081546, 0x480b5042, 0x6407503a, 0x0501f003, - 0x0501f8be, 0x05fdff9d, 0x1c01f000, 0x0501f885, - 0x0500004f, 0x0501f972, 0x05020029, 0x60000800, - 0x0501f9ae, 0x59c41001, 0x82081500, 0x00018000, - 0x90040d1c, 0x90040590, 0x05000042, 0x90040594, - 0x05000006, 0x90040598, 0x0500000a, 0x9004059c, - 0x0500000a, 0x05f5fd79, 0x90080580, 0x05000039, - 0x82080580, 0x00008000, 0x05000036, 0x0501f003, - 0x90080580, 0x05000033, 0x60000800, 0x0501f997, - 0x59a80042, 0x90040d1c, 0x90041594, 0x05000006, - 0x90041598, 0x05000006, 0x9004159c, 0x05000006, - 0x05f60d66, 0x84000544, 0x0501f004, 0x84000542, - 0x0501f002, 0x84000540, 0x48035042, 0x59a8003f, - 0x80000000, 0x4803503f, 0x90000585, 0x05000003, - 0x0501f859, 0x0501f01d, 0x497b503f, 0x59c40801, - 0x82040d00, 0x00018000, 0x90040580, 0x0500000b, - 0x82040580, 0x00008000, 0x0500000a, 0x82040580, - 0x00010000, 0x05000009, 0x82040580, 0x00018000, - 0x05000008, 0x05f5fd49, 0x60040000, 0x0501f006, - 0x60000000, 0x0501f004, 0x60080000, 0x0501f002, - 0x600c0000, 0x0501f8f7, 0x640b503c, 0x0501f003, - 0x640f503a, 0x0501f002, 0x05fdff59, 0x1c01f000, - 0x0501f834, 0x05000013, 0x59a80033, 0x80000040, - 0x48035033, 0x0501f91e, 0x05020004, 0x640f503a, - 0x497b503b, 0x0501f00b, 0x59a80033, 0x80000540, - 0x05020003, 0x0501f891, 0x0501f002, 0x0501f841, - 0x0501f829, 0x497b503f, 0x6407503c, 0x05fdff44, - 0x1c01f000, 0x0501f81f, 0x05000012, 0x0501f90c, - 0x0502000d, 0x59a80040, 0x80000000, 0x48035040, - 0x90000587, 0x0502000a, 0x642b5036, 0x497b5043, - 0x59a80042, 0x8400055e, 0x48035042, 0x4803c857, - 0x0501f004, 0x0501f814, 0x6413503c, 0x05fdff4f, - 0x1c01f000, 0x0501f80b, 0x05000007, 0x0501f8f8, - 0x05020003, 0x05fdff32, 0x0501f003, 0x0501f80a, - 0x05fdff46, 0x1c01f000, 0x05f5fd08, 0x05f5fd07, - 0x59a80034, 0x80000040, 0x48035034, 0x05000885, - 0x1c01f000, 0x4c040000, 0x60000800, 0x0501f927, - 0x90040d1c, 0x9004059c, 0x05000008, 0x90040598, - 0x0500000a, 0x90040594, 0x0500000a, 0x90040590, - 0x05000004, 0x05f5fcf5, 0x600c0000, 0x0501f006, - 0x60080000, 0x0501f004, 0x60040000, 0x0501f002, - 0x60000000, 0x0501f8a3, 0x5c000800, 0x1c01f000, - 0x4c040000, 0x59c40801, 0x82040d00, 0x00018000, - 0x90040580, 0x0500000b, 0x82040580, 0x00008000, - 0x0500000c, 0x82040580, 0x00010000, 0x0500000b, - 0x82040580, 0x00018000, 0x05000004, 0x05f5fcdb, - 0x600c0000, 0x0501f006, 0x60080000, 0x0501f004, - 0x60040000, 0x0501f002, 0x60000000, 0x0501f85f, - 0x5c000800, 0x1c01f000, 0x4c040000, 0x59a8003f, - 0x80000000, 0x4803503f, 0x90000585, 0x05020019, + 0x4803c857, 0x90000583, 0x5c000000, 0x1c01f000, + 0x0501f805, 0x60058800, 0x05000002, 0x60018800, + 0x1c01f000, 0x4c000000, 0x59a80037, 0x4803c857, + 0x90000584, 0x5c000000, 0x1c01f000, 0x0501f805, + 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, + 0x4c000000, 0x59a80037, 0x90000582, 0x5c000000, + 0x1c01f000, 0x4c000000, 0x4c040000, 0x4c080000, + 0x4c380000, 0x59a8003a, 0x90000c87, 0x05f61e07, + 0x0c01f806, 0x5c007000, 0x5c001000, 0x5c000800, + 0x5c000000, 0x1c01f000, 0x001013ed, 0x001013fa, + 0x00101407, 0x00101408, 0x00101426, 0x00101427, + 0x00101428, 0x4803c856, 0x6403503c, 0x600c0000, + 0x0501f9aa, 0x600c0000, 0x0501f97e, 0x0501fa06, + 0x4803c856, 0x641b503a, 0x60740800, 0x42001000, + 0x00101429, 0x051df333, 0x497b503f, 0x64db5034, + 0x64ab5033, 0x4803c856, 0x6407503c, 0x600c0000, + 0x0501f970, 0x4803c856, 0x641b503a, 0x60740800, + 0x42001000, 0x00101429, 0x051df326, 0x05f5fddf, + 0x64db5034, 0x4803c856, 0x640f503c, 0x60000800, + 0x0501fa00, 0x90040d1c, 0x9004059c, 0x05000008, + 0x90040598, 0x05000008, 0x90040594, 0x05000008, + 0x90040590, 0x05000008, 0x05f5fdd0, 0x60040000, + 0x0501f006, 0x60000000, 0x0501f004, 0x60080000, + 0x0501f002, 0x600c0000, 0x0501f952, 0x497b5040, + 0x4803c856, 0x641b503a, 0x60740800, 0x42001000, + 0x00101429, 0x051df307, 0x05f5fdc0, 0x05f5fdbf, + 0x1c01f000, 0x4c000000, 0x4c040000, 0x4c080000, + 0x4c380000, 0x59a8003c, 0x90000c87, 0x05f61db7, + 0x0c01f806, 0x5c007000, 0x5c001000, 0x5c000800, + 0x5c000000, 0x1c01f000, 0x0010143d, 0x00101459, + 0x001014aa, 0x001014bf, 0x001014d3, 0x001014dc, + 0x001014dd, 0x0501f990, 0x05020018, 0x59a81042, + 0x60000800, 0x0501f9cb, 0x90040d1c, 0x9004059c, + 0x05000008, 0x90040598, 0x05000008, 0x90040594, + 0x05000008, 0x90040590, 0x05000008, 0x05f5fd9b, + 0x84081540, 0x0501f006, 0x84081542, 0x0501f004, + 0x84081544, 0x0501f002, 0x84081546, 0x480b5042, + 0x6407503a, 0x0501f003, 0x0501f8be, 0x05fdff9d, + 0x1c01f000, 0x0501f885, 0x0500004f, 0x0501f972, + 0x05020029, 0x60000800, 0x0501f9ae, 0x59c41001, + 0x82081500, 0x00018000, 0x90040d1c, 0x90040590, + 0x05000042, 0x90040594, 0x05000006, 0x90040598, + 0x0500000a, 0x9004059c, 0x0500000a, 0x05f5fd7b, + 0x90080580, 0x05000039, 0x82080580, 0x00008000, + 0x05000036, 0x0501f003, 0x90080580, 0x05000033, + 0x60000800, 0x0501f997, 0x59a80042, 0x90040d1c, + 0x90041594, 0x05000006, 0x90041598, 0x05000006, + 0x9004159c, 0x05000006, 0x05f60d68, 0x84000544, + 0x0501f004, 0x84000542, 0x0501f002, 0x84000540, + 0x48035042, 0x59a8003f, 0x80000000, 0x4803503f, + 0x90000585, 0x05000003, 0x0501f859, 0x0501f01d, 0x497b503f, 0x59c40801, 0x82040d00, 0x00018000, 0x90040580, 0x0500000b, 0x82040580, 0x00008000, - 0x0500000c, 0x82040580, 0x00010000, 0x0500000b, - 0x82040580, 0x00018000, 0x05000004, 0x05f5fcbb, - 0x600c0000, 0x0501f006, 0x60080000, 0x0501f004, - 0x60040000, 0x0501f002, 0x60000000, 0x0501f83f, - 0x60000800, 0x0501f8d9, 0x90040d1c, 0x9004059c, + 0x0500000a, 0x82040580, 0x00010000, 0x05000009, + 0x82040580, 0x00018000, 0x05000008, 0x05f5fd4b, + 0x60040000, 0x0501f006, 0x60000000, 0x0501f004, + 0x60080000, 0x0501f002, 0x600c0000, 0x0501f8f7, + 0x640b503c, 0x0501f003, 0x640f503a, 0x0501f002, + 0x05fdff59, 0x1c01f000, 0x0501f834, 0x05000013, + 0x59a80033, 0x80000040, 0x48035033, 0x0501f91e, + 0x05020004, 0x640f503a, 0x497b503b, 0x0501f00b, + 0x59a80033, 0x80000540, 0x05020003, 0x0501f891, + 0x0501f002, 0x0501f841, 0x0501f829, 0x497b503f, + 0x6407503c, 0x05fdff44, 0x1c01f000, 0x0501f81f, + 0x05000012, 0x0501f90c, 0x0502000d, 0x59a80040, + 0x80000000, 0x48035040, 0x90000587, 0x0502000a, + 0x642b5036, 0x497b5043, 0x59a80042, 0x8400055e, + 0x48035042, 0x4803c857, 0x0501f004, 0x0501f814, + 0x6413503c, 0x05fdff4f, 0x1c01f000, 0x0501f80b, + 0x05000007, 0x0501f8f8, 0x05020003, 0x05fdff32, + 0x0501f003, 0x0501f80a, 0x05fdff46, 0x1c01f000, + 0x05f5fd0a, 0x05f5fd09, 0x59a80034, 0x80000040, + 0x48035034, 0x05000885, 0x1c01f000, 0x4c040000, + 0x60000800, 0x0501f927, 0x90040d1c, 0x9004059c, 0x05000008, 0x90040598, 0x0500000a, 0x90040594, - 0x0500000a, 0x90040590, 0x05000004, 0x05f5fca7, + 0x0500000a, 0x90040590, 0x05000004, 0x05f5fcf7, 0x600c0000, 0x0501f006, 0x60080000, 0x0501f004, - 0x60040000, 0x0501f002, 0x60000000, 0x0501f855, - 0x5c000800, 0x1c01f000, 0x4c200000, 0x59a80042, - 0x82000500, 0x00007fff, 0x05f40c98, 0x59a84041, - 0x80204102, 0x05f41c95, 0x48235041, 0x80204500, - 0x05fc07fb, 0x8c000506, 0x05020008, 0x8c000504, - 0x05020008, 0x8c000502, 0x05020008, 0x8c000500, - 0x05020008, 0x05f5fc89, 0x600c0000, 0x0501f006, - 0x60080000, 0x0501f004, 0x60000000, 0x0501f002, - 0x60040000, 0x0501f80d, 0x5c004000, 0x1c01f000, - 0x05011000, 0x4a03c840, 0x001093ba, 0x6427c842, - 0x40000000, 0x05fd17ff, 0x64235041, 0x64035038, - 0x1c01f000, 0x40680000, 0x4c000000, 0x0501f932, - 0x5c000000, 0x0501fa4d, 0x60080800, 0x0501f897, - 0x82041500, 0xffffffe3, 0x59c41801, 0x820c1d00, - 0xfffe7fff, 0x800001c0, 0x05000007, 0x90000d81, - 0x0502000a, 0x9008055c, 0x900c1d40, 0x840c1d32, - 0x0501f012, 0x90080558, 0x820c1d40, 0x00008000, - 0x840c1d32, 0x0501f00d, 0x90000d82, 0x05020006, - 0x90080554, 0x820c1d40, 0x00010000, 0x840c1d32, - 0x0501f006, 0x90000d83, 0x05f60c54, 0x90080550, - 0x820c1d40, 0x02018000, 0x60080800, 0x0501f87f, - 0x480f8801, 0x0501f111, 0x1c01f000, 0x40680000, - 0x4c000000, 0x0501f903, 0x5c000000, 0x0501fa23, - 0x60000800, 0x0501f86d, 0x82041500, 0xffffffe3, - 0x59c41801, 0x800001c0, 0x05000006, 0x90000d81, - 0x05020007, 0x9008055c, 0x840c1d30, 0x0501f00d, - 0x90080558, 0x840c1d30, 0x0501f00a, 0x90000d82, - 0x05020004, 0x90080554, 0x840c1d30, 0x0501f005, - 0x90000d83, 0x05f60c31, 0x90080550, 0x840c1d70, - 0x480f8801, 0x60000800, 0x0501f85c, 0x0501f9f9, - 0x0500000d, 0x4a03c014, 0x00200020, 0x60000800, - 0x0501f84e, 0x90040d1c, 0x90040590, 0x05020004, - 0x4a03c013, 0x00200020, 0x0501f003, 0x4a03c013, - 0x00200000, 0x0501f0e8, 0x0501f805, 0x60058800, - 0x05000002, 0x60018800, 0x1c01f000, 0x4c580000, - 0x6050b000, 0x8058b040, 0x05000026, 0x59c4000d, - 0x8c000520, 0x05fe07fc, 0x0501f831, 0x59c4000d, - 0x8c000520, 0x05fe07f8, 0x59c40808, 0x82040d40, - 0x00000300, 0x48078808, 0x6120b001, 0x8058b040, - 0x05fe07ff, 0x6050b000, 0x8058b040, 0x05000015, - 0x59c4000d, 0x8c000520, 0x05020012, 0x0501f820, - 0x59c4000d, 0x8c000520, 0x0502000e, 0x6028b000, - 0x8058b040, 0x05000003, 0x0501f819, 0x05fdf7fd, - 0x6190b000, 0x59c4000d, 0x8c00051e, 0x05000005, - 0x8058b040, 0x05fe07fc, 0x80000580, 0x0501f002, - 0x90000541, 0x5c00b000, 0x1c01f000, 0x60080800, - 0x0501f812, 0x82040500, 0xfffffffe, 0x60080800, - 0x0501f816, 0x60000800, 0x0501f80c, 0x82040500, - 0xfffffffe, 0x60000800, 0x0501f010, 0x40000000, - 0x40000000, 0x40000000, 0x40000000, 0x40000000, - 0x1c01f000, 0x40680800, 0x4807880e, 0x59c4080f, - 0x82040d00, 0x000000ff, 0x40058800, 0x1c01f000, - 0x40680800, 0x406c0000, 0x900001c0, 0x80040d40, - 0x84040d40, 0x4807880e, 0x1c01f000, 0x82000d80, - 0x00200000, 0x05000009, 0x82000d80, 0x02000000, - 0x05000006, 0x82000d80, 0x01000000, 0x05000006, - 0x59c408a3, 0x0501f006, 0x59c408a3, 0x84040d30, - 0x0501f003, 0x59c408a3, 0x84040d32, 0x80040540, - 0x480388a3, 0x480788a3, 0x1c01f000, 0x59c400a3, - 0x84000556, 0x480388a3, 0x84000516, 0x480388a3, - 0x1c01f000, 0x485fc857, 0x4863c857, 0x4c640000, - 0x4d3c0000, 0x4d400000, 0x051dfddb, 0x48635009, - 0x40601800, 0x60002000, 0x0501f881, 0x42000000, - 0x0010975a, 0x0539fa54, 0x82600500, 0x0000ff00, - 0x82000580, 0x0000f700, 0x05020004, 0x42000000, - 0x00109742, 0x0539fa4c, 0x0539fb5a, 0x05020050, - 0x82600d00, 0x0000ff00, 0x800409c0, 0x0500000b, - 0x6004c800, 0x59a8000f, 0x82000500, 0x000000ff, - 0x80041110, 0x80081580, 0x0500001b, 0x82041580, - 0x0000ff00, 0x0500000a, 0x59c410a3, 0x82081500, - 0x00008000, 0x05000008, 0x59c410a7, 0x82081500, - 0x0000ff00, 0x82081580, 0x0000ff00, 0x6000c800, - 0x0500000d, 0x8d0c0502, 0x05020007, 0x8d0c0500, - 0x05020009, 0x599c1017, 0x8c08051a, 0x0500002a, - 0x850e1d42, 0x6008c800, 0x60128000, 0x60227800, - 0x0501f004, 0x850e1d40, 0x60128000, 0x417a7800, - 0x59a80005, 0x8c000502, 0x05020004, 0x8d0c050a, - 0x05020023, 0x850e1d4a, 0x42000000, 0x00109741, - 0x0539fa19, 0x59a81809, 0x604c1100, 0x0509ff39, - 0x8d0c0520, 0x0500000f, 0x4d400000, 0x82600500, - 0x000000ff, 0x61fe89ff, 0x40643000, 0x603a8000, - 0x0535fc61, 0x60040800, 0x60001002, 0x051df8bf, - 0x5c028000, 0x599c0817, 0x8c04050a, 0x0502000c, - 0x493fc857, 0x4943c857, 0x0201f800, 0x0010b5d3, - 0x0501f007, 0x8d0c0520, 0x05000005, 0x603e8000, - 0x61fe89ff, 0x60003000, 0x0535fc52, 0x497b8880, - 0x5c028000, 0x5c027800, 0x5c00c800, 0x1c01f000, - 0x60000800, 0x05fdff6d, 0x90040542, 0x60000800, - 0x05fdf772, 0x60080800, 0x05fdff68, 0x90040542, - 0x60080800, 0x05fdf76d, 0x60080800, 0x05fdff63, - 0x82040500, 0xfffffffd, 0x90000550, 0x60080800, - 0x05fdf766, 0x60000800, 0x05fdff5c, 0x82040500, - 0xfffffffd, 0x90000550, 0x60000800, 0x05fdf75f, - 0x59c408a8, 0x05fdff4e, 0x05fdff4d, 0x59c400a8, - 0x80040d80, 0x05fe07fb, 0x1c01f000, 0x59a80005, - 0x8c000500, 0x05000008, 0x59a80008, 0x8c000500, - 0x05020005, 0x84000540, 0x48035008, 0x60581100, - 0x0509fef0, 0x1c01f000, 0x1c01f000, 0x59c40801, - 0x82040d00, 0x00018000, 0x82040d80, 0x00018000, - 0x05000002, 0x84081518, 0x480b88a3, 0x1c01f000, - 0x42000800, 0x7ff4818e, 0x59e00002, 0x8c00051e, - 0x05020003, 0x42000800, 0x7ff4808e, 0x58041800, - 0x480f504b, 0x8c0c0500, 0x05020007, 0x8c0c0502, - 0x05000005, 0x58044001, 0x58042002, 0x58041003, - 0x0501f007, 0x42004000, 0x0003c014, 0x42002000, - 0x0003c014, 0x42001000, 0x0002e014, 0x480b5045, - 0x48135046, 0x48235047, 0x8c0c0500, 0x05020007, - 0x8c0c0504, 0x05000005, 0x58044004, 0x58042005, - 0x58041006, 0x0501f004, 0x60c8400d, 0x60c8200d, - 0x60c8100d, 0x480b5048, 0x48135049, 0x4823504a, - 0x1c01f000, 0x59a81048, 0x59a82049, 0x59a8404a, - 0x60380840, 0x05fdff0d, 0x82040d00, 0xffffffc0, - 0x82200500, 0x003f0000, 0x80000120, 0x80040540, - 0x60380840, 0x05fdff0d, 0x60380848, 0x05fdff03, - 0x82040d00, 0xffffffc0, 0x82200500, 0x0000fc00, - 0x80000114, 0x80040540, 0x60380848, 0x05fdff03, - 0x82200500, 0x000003e0, 0x8000010a, 0x603808d8, - 0x05fdfefe, 0x9020051f, 0x603808f0, 0x05fdfefb, - 0x82100500, 0x003f0000, 0x80000120, 0x60380908, - 0x05fdfef6, 0x82100500, 0x0000fc00, 0x80000114, - 0x60380918, 0x05fdfef1, 0x82100500, 0x000003e0, - 0x8000010a, 0x603808e0, 0x05fdfeec, 0x9010051f, - 0x603808f8, 0x05fdfee9, 0x82080500, 0x003f0000, - 0x80000120, 0x60380910, 0x05fdfee4, 0x82080500, - 0x0000fc00, 0x80000114, 0x60380920, 0x05fdfedf, - 0x82080500, 0x000003e0, 0x8000010a, 0x603808e8, - 0x05fdfeda, 0x9008051f, 0x60380900, 0x05fdfed7, - 0x1c01f000, 0x59a81045, 0x59a82046, 0x59a84047, - 0x9020051f, 0x800000c2, 0x84000540, 0x60480800, - 0x05fdfece, 0x82200500, 0x000001e0, 0x80000908, - 0x84040d40, 0x82200500, 0x00000600, 0x80000106, - 0x8400054a, 0x80040540, 0x60480830, 0x05fdfec3, - 0x82200500, 0x00001800, 0x80000916, 0x82200500, - 0x0003e000, 0x80000114, 0x84000544, 0x80040540, - 0x60480848, 0x05fdfeb9, 0x9010051f, 0x800000c2, - 0x84000540, 0x60480808, 0x05fdfeb4, 0x82100500, - 0x000001e0, 0x80000908, 0x84040d40, 0x82100500, + 0x60040000, 0x0501f002, 0x60000000, 0x0501f8a3, + 0x5c000800, 0x1c01f000, 0x4c040000, 0x59c40801, + 0x82040d00, 0x00018000, 0x90040580, 0x0500000b, + 0x82040580, 0x00008000, 0x0500000c, 0x82040580, + 0x00010000, 0x0500000b, 0x82040580, 0x00018000, + 0x05000004, 0x05f5fcdd, 0x600c0000, 0x0501f006, + 0x60080000, 0x0501f004, 0x60040000, 0x0501f002, + 0x60000000, 0x0501f85f, 0x5c000800, 0x1c01f000, + 0x4c040000, 0x59a8003f, 0x80000000, 0x4803503f, + 0x90000585, 0x05020019, 0x497b503f, 0x59c40801, + 0x82040d00, 0x00018000, 0x90040580, 0x0500000b, + 0x82040580, 0x00008000, 0x0500000c, 0x82040580, + 0x00010000, 0x0500000b, 0x82040580, 0x00018000, + 0x05000004, 0x05f5fcbd, 0x600c0000, 0x0501f006, + 0x60080000, 0x0501f004, 0x60040000, 0x0501f002, + 0x60000000, 0x0501f83f, 0x60000800, 0x0501f8d9, + 0x90040d1c, 0x9004059c, 0x05000008, 0x90040598, + 0x0500000a, 0x90040594, 0x0500000a, 0x90040590, + 0x05000004, 0x05f5fca9, 0x600c0000, 0x0501f006, + 0x60080000, 0x0501f004, 0x60040000, 0x0501f002, + 0x60000000, 0x0501f855, 0x5c000800, 0x1c01f000, + 0x4c200000, 0x59a80042, 0x82000500, 0x00007fff, + 0x05f40c9a, 0x59a84041, 0x80204102, 0x05f41c97, + 0x48235041, 0x80204500, 0x05fc07fb, 0x8c000506, + 0x05020008, 0x8c000504, 0x05020008, 0x8c000502, + 0x05020008, 0x8c000500, 0x05020008, 0x05f5fc8b, + 0x600c0000, 0x0501f006, 0x60080000, 0x0501f004, + 0x60000000, 0x0501f002, 0x60040000, 0x0501f80d, + 0x5c004000, 0x1c01f000, 0x05011000, 0x4a03c840, + 0x0010943a, 0x6427c842, 0x40000000, 0x05fd17ff, + 0x64235041, 0x64035038, 0x1c01f000, 0x40680000, + 0x4c000000, 0x0501f932, 0x5c000000, 0x0501fa4d, + 0x60080800, 0x0501f897, 0x82041500, 0xffffffe3, + 0x59c41801, 0x820c1d00, 0xfffe7fff, 0x800001c0, + 0x05000007, 0x90000d81, 0x0502000a, 0x9008055c, + 0x900c1d40, 0x840c1d32, 0x0501f012, 0x90080558, + 0x820c1d40, 0x00008000, 0x840c1d32, 0x0501f00d, + 0x90000d82, 0x05020006, 0x90080554, 0x820c1d40, + 0x00010000, 0x840c1d32, 0x0501f006, 0x90000d83, + 0x05f60c56, 0x90080550, 0x820c1d40, 0x02018000, + 0x60080800, 0x0501f87f, 0x480f8801, 0x0501f111, + 0x1c01f000, 0x40680000, 0x4c000000, 0x0501f903, + 0x5c000000, 0x0501fa23, 0x60000800, 0x0501f86d, + 0x82041500, 0xffffffe3, 0x59c41801, 0x800001c0, + 0x05000006, 0x90000d81, 0x05020007, 0x9008055c, + 0x840c1d30, 0x0501f00d, 0x90080558, 0x840c1d30, + 0x0501f00a, 0x90000d82, 0x05020004, 0x90080554, + 0x840c1d30, 0x0501f005, 0x90000d83, 0x05f60c33, + 0x90080550, 0x840c1d70, 0x480f8801, 0x60000800, + 0x0501f85c, 0x0501f9f9, 0x0500000d, 0x4a03c014, + 0x00200020, 0x60000800, 0x0501f84e, 0x90040d1c, + 0x90040590, 0x05020004, 0x4a03c013, 0x00200020, + 0x0501f003, 0x4a03c013, 0x00200000, 0x0501f0e8, + 0x0501f805, 0x60058800, 0x05000002, 0x60018800, + 0x1c01f000, 0x4c580000, 0x6050b000, 0x8058b040, + 0x05000026, 0x59c4000d, 0x8c000520, 0x05fe07fc, + 0x0501f831, 0x59c4000d, 0x8c000520, 0x05fe07f8, + 0x59c40808, 0x82040d40, 0x00000300, 0x48078808, + 0x6120b001, 0x8058b040, 0x05fe07ff, 0x6050b000, + 0x8058b040, 0x05000015, 0x59c4000d, 0x8c000520, + 0x05020012, 0x0501f820, 0x59c4000d, 0x8c000520, + 0x0502000e, 0x6028b000, 0x8058b040, 0x05000003, + 0x0501f819, 0x05fdf7fd, 0x6190b000, 0x59c4000d, + 0x8c00051e, 0x05000005, 0x8058b040, 0x05fe07fc, + 0x80000580, 0x0501f002, 0x90000541, 0x5c00b000, + 0x1c01f000, 0x60080800, 0x0501f812, 0x82040500, + 0xfffffffe, 0x60080800, 0x0501f816, 0x60000800, + 0x0501f80c, 0x82040500, 0xfffffffe, 0x60000800, + 0x0501f010, 0x40000000, 0x40000000, 0x40000000, + 0x40000000, 0x40000000, 0x1c01f000, 0x40680800, + 0x4807880e, 0x59c4080f, 0x82040d00, 0x000000ff, + 0x40058800, 0x1c01f000, 0x40680800, 0x406c0000, + 0x900001c0, 0x80040d40, 0x84040d40, 0x4807880e, + 0x1c01f000, 0x82000d80, 0x00200000, 0x05000009, + 0x82000d80, 0x02000000, 0x05000006, 0x82000d80, + 0x01000000, 0x05000006, 0x59c408a3, 0x0501f006, + 0x59c408a3, 0x84040d30, 0x0501f003, 0x59c408a3, + 0x84040d32, 0x80040540, 0x480388a3, 0x480788a3, + 0x1c01f000, 0x59c400a3, 0x84000556, 0x480388a3, + 0x84000516, 0x480388a3, 0x1c01f000, 0x485fc857, + 0x4863c857, 0x4c640000, 0x4d3c0000, 0x4d400000, + 0x051dfe69, 0x48635009, 0x40601800, 0x60002000, + 0x0501f881, 0x42000000, 0x001097da, 0x0539fb20, + 0x82600500, 0x0000ff00, 0x82000580, 0x0000f700, + 0x05020004, 0x42000000, 0x001097c2, 0x0539fb18, + 0x0539fc26, 0x05020050, 0x82600d00, 0x0000ff00, + 0x800409c0, 0x0500000b, 0x6004c800, 0x59a8000f, + 0x82000500, 0x000000ff, 0x80041110, 0x80081580, + 0x0500001b, 0x82041580, 0x0000ff00, 0x0500000a, + 0x59c410a3, 0x82081500, 0x00008000, 0x05000008, + 0x59c410a7, 0x82081500, 0x0000ff00, 0x82081580, + 0x0000ff00, 0x6000c800, 0x0500000d, 0x8d0c0502, + 0x05020007, 0x8d0c0500, 0x05020009, 0x599c1017, + 0x8c08051a, 0x0500002a, 0x850e1d42, 0x6008c800, + 0x60128000, 0x60227800, 0x0501f004, 0x850e1d40, + 0x60128000, 0x417a7800, 0x59a80005, 0x8c000502, + 0x05020004, 0x8d0c050a, 0x05020023, 0x850e1d4a, + 0x42000000, 0x001097c1, 0x0539fae5, 0x59a81809, + 0x604c1100, 0x0509ff3f, 0x8d0c0520, 0x0500000f, + 0x4d400000, 0x82600500, 0x000000ff, 0x61fe89ff, + 0x40643000, 0x603a8000, 0x0535fd14, 0x60040800, + 0x60001002, 0x051df94d, 0x5c028000, 0x599c0817, + 0x8c04050a, 0x0502000c, 0x493fc857, 0x4943c857, + 0x0201f800, 0x0010b5e0, 0x0501f007, 0x8d0c0520, + 0x05000005, 0x603e8000, 0x61fe89ff, 0x60003000, + 0x0535fd05, 0x497b8880, 0x5c028000, 0x5c027800, + 0x5c00c800, 0x1c01f000, 0x60000800, 0x05fdff6d, + 0x90040542, 0x60000800, 0x05fdf772, 0x60080800, + 0x05fdff68, 0x90040542, 0x60080800, 0x05fdf76d, + 0x60080800, 0x05fdff63, 0x82040500, 0xfffffffd, + 0x90000550, 0x60080800, 0x05fdf766, 0x60000800, + 0x05fdff5c, 0x82040500, 0xfffffffd, 0x90000550, + 0x60000800, 0x05fdf75f, 0x59c408a8, 0x05fdff4e, + 0x05fdff4d, 0x59c400a8, 0x80040d80, 0x05fe07fb, + 0x1c01f000, 0x59a80005, 0x8c000500, 0x05000008, + 0x59a80008, 0x8c000500, 0x05020005, 0x84000540, + 0x48035008, 0x60581100, 0x0509fef6, 0x1c01f000, + 0x1c01f000, 0x59c40801, 0x82040d00, 0x00018000, + 0x82040d80, 0x00018000, 0x05000002, 0x84081518, + 0x480b88a3, 0x1c01f000, 0x42000800, 0x7ff4818e, + 0x59e00002, 0x8c00051e, 0x05020003, 0x42000800, + 0x7ff4808e, 0x58041800, 0x480f504b, 0x8c0c0500, + 0x05020007, 0x8c0c0502, 0x05000005, 0x58044001, + 0x58042002, 0x58041003, 0x0501f007, 0x42004000, + 0x0003c014, 0x42002000, 0x0003c014, 0x42001000, + 0x0002e014, 0x480b5045, 0x48135046, 0x48235047, + 0x8c0c0500, 0x05020007, 0x8c0c0504, 0x05000005, + 0x58044004, 0x58042005, 0x58041006, 0x0501f004, + 0x60c8400d, 0x60c8200d, 0x60c8100d, 0x480b5048, + 0x48135049, 0x4823504a, 0x1c01f000, 0x59a81048, + 0x59a82049, 0x59a8404a, 0x60380840, 0x05fdff0d, + 0x82040d00, 0xffffffc0, 0x82200500, 0x003f0000, + 0x80000120, 0x80040540, 0x60380840, 0x05fdff0d, + 0x60380848, 0x05fdff03, 0x82040d00, 0xffffffc0, + 0x82200500, 0x0000fc00, 0x80000114, 0x80040540, + 0x60380848, 0x05fdff03, 0x82200500, 0x000003e0, + 0x8000010a, 0x603808d8, 0x05fdfefe, 0x9020051f, + 0x603808f0, 0x05fdfefb, 0x82100500, 0x003f0000, + 0x80000120, 0x60380908, 0x05fdfef6, 0x82100500, + 0x0000fc00, 0x80000114, 0x60380918, 0x05fdfef1, + 0x82100500, 0x000003e0, 0x8000010a, 0x603808e0, + 0x05fdfeec, 0x9010051f, 0x603808f8, 0x05fdfee9, + 0x82080500, 0x003f0000, 0x80000120, 0x60380910, + 0x05fdfee4, 0x82080500, 0x0000fc00, 0x80000114, + 0x60380920, 0x05fdfedf, 0x82080500, 0x000003e0, + 0x8000010a, 0x603808e8, 0x05fdfeda, 0x9008051f, + 0x60380900, 0x05fdfed7, 0x1c01f000, 0x59a81045, + 0x59a82046, 0x59a84047, 0x9020051f, 0x800000c2, + 0x84000540, 0x60480800, 0x05fdfece, 0x82200500, + 0x000001e0, 0x80000908, 0x84040d40, 0x82200500, 0x00000600, 0x80000106, 0x8400054a, 0x80040540, - 0x60480838, 0x05fdfea9, 0x82100500, 0x00001800, - 0x80000916, 0x82100500, 0x0003e000, 0x80000114, - 0x84000544, 0x80040540, 0x60480850, 0x05fdfe9f, - 0x9008051f, 0x800000c2, 0x84000540, 0x60480810, - 0x05fdfe9a, 0x82080500, 0x000001e0, 0x80000908, - 0x84040d40, 0x82080500, 0x00000600, 0x80000106, - 0x8400054a, 0x80040540, 0x60480840, 0x05fdfe8f, - 0x82080500, 0x00001800, 0x80000916, 0x82080500, + 0x60480830, 0x05fdfec3, 0x82200500, 0x00001800, + 0x80000916, 0x82200500, 0x0003e000, 0x80000114, + 0x84000544, 0x80040540, 0x60480848, 0x05fdfeb9, + 0x9010051f, 0x800000c2, 0x84000540, 0x60480808, + 0x05fdfeb4, 0x82100500, 0x000001e0, 0x80000908, + 0x84040d40, 0x82100500, 0x00000600, 0x80000106, + 0x8400054a, 0x80040540, 0x60480838, 0x05fdfea9, + 0x82100500, 0x00001800, 0x80000916, 0x82100500, 0x0003e000, 0x80000114, 0x84000544, 0x80040540, - 0x60480858, 0x05fdfe85, 0x1c01f000, 0x0501f805, + 0x60480850, 0x05fdfe9f, 0x9008051f, 0x800000c2, + 0x84000540, 0x60480810, 0x05fdfe9a, 0x82080500, + 0x000001e0, 0x80000908, 0x84040d40, 0x82080500, + 0x00000600, 0x80000106, 0x8400054a, 0x80040540, + 0x60480840, 0x05fdfe8f, 0x82080500, 0x00001800, + 0x80000916, 0x82080500, 0x0003e000, 0x80000114, + 0x84000544, 0x80040540, 0x60480858, 0x05fdfe85, + 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, + 0x60018800, 0x1c01f000, 0x4c000000, 0x0509ff3f, + 0x05020003, 0x90000541, 0x0501f003, 0x59e00013, + 0x8c00050e, 0x5c000000, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, - 0x4c000000, 0x0509ff39, 0x05020003, 0x90000541, - 0x0501f003, 0x59e00013, 0x8c00050e, 0x5c000000, - 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x4c140000, 0x4a03c013, - 0x03800300, 0x4a03c014, 0x03800380, 0x60800801, - 0x60281000, 0x0505f955, 0x05000002, 0x8c14050c, - 0x4a03c014, 0x03800000, 0x5c002800, 0x1c01f000, - 0x4c000000, 0x59a8004b, 0x8c000508, 0x05020004, - 0x90000541, 0x5c000000, 0x1c01f000, 0x80000580, - 0x05fdf7fd, 0x05fdfff7, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x4c5c0000, 0x4000b800, - 0x59a80044, 0x82000d80, 0xaabbccdd, 0x0500000f, - 0x90000c85, 0x05f61a1d, 0x4c000000, 0x0509fee5, - 0x5c000000, 0x05020003, 0x0c01f81a, 0x0501f016, - 0x4c000000, 0x0509fef6, 0x5c000000, 0x05fc07fb, - 0x0c01f819, 0x0501f010, 0x05fdffde, 0x0500000e, - 0x8d0c051a, 0x0500000c, 0x05fdffbe, 0x0502000a, - 0x05fdffca, 0x05020005, 0x905c0d83, 0x05020006, - 0x6008b800, 0x0501f004, 0x905c0d81, 0x05020002, - 0x600cb800, 0x405c0000, 0x5c00b800, 0x1c01f000, - 0x001017f2, 0x001017f3, 0x001017f4, 0x001017f5, - 0x001017f9, 0x001017fa, 0x001017fc, 0x0010180c, - 0x0010181a, 0x0010182a, 0x1c01f000, 0x1c01f000, - 0x1c01f000, 0x905c0d83, 0x05020002, 0x6008b800, - 0x1c01f000, 0x1c01f000, 0x6004b800, 0x1c01f000, - 0x05fdffb8, 0x05000007, 0x05fdff9a, 0x05020005, - 0x05fdffa6, 0x05000003, 0x6000b800, 0x0501f008, - 0x905c0d83, 0x05020003, 0x6000b800, 0x0501f004, - 0x905c0d82, 0x05020002, 0x05f5f9dc, 0x1c01f000, - 0x05fdffa8, 0x0500000c, 0x05fdff8a, 0x0502000a, - 0x05fdff96, 0x05020005, 0x905c0d83, 0x05020006, - 0x6008b800, 0x0501f004, 0x905c0d81, 0x05020002, - 0x600cb800, 0x1c01f000, 0x05fdff9a, 0x0500000b, - 0x05fdff7c, 0x05020009, 0x05fdff88, 0x05020002, - 0x0501f006, 0x905c0d83, 0x05000006, 0x905c0d81, - 0x05000004, 0x0501f004, 0x905c0d83, 0x05020002, - 0x6008b800, 0x1c01f000, 0x05fdff8a, 0x05000006, - 0x05fdff6c, 0x05020004, 0x05fdff78, 0x05020002, - 0x0501f004, 0x905c0d81, 0x05020002, 0x600cb800, - 0x1c01f000, 0x4803c856, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x4c580000, 0x497b504c, 0x4200c000, - 0x7ff52000, 0x0509fe95, 0x05020007, 0x4803c856, - 0x4a03c014, 0x07e30000, 0x59e0c813, 0x0501f8ba, - 0x0501f013, 0x82000d80, 0x3261103c, 0x050200b1, - 0x4803c856, 0x42000800, 0x7ff481e6, 0x59e06802, - 0x8c34051e, 0x05020003, 0x42000800, 0x7ff480e6, - 0x50040000, 0x4803c857, 0x48035053, 0x8c00051e, - 0x050000a4, 0x8200cd00, 0x000000ff, 0x4867c857, - 0x4867504d, 0x50600800, 0x4807504e, 0x4807c857, - 0x82040d80, 0x53434651, 0x05020098, 0x8060c000, - 0x50600800, 0x4807504f, 0x8060c000, 0x50600800, - 0x48075050, 0x8060c000, 0x50600800, 0x48075051, - 0x8060c000, 0x50600800, 0x82040d00, 0x0000ffff, - 0x48075052, 0x4200c000, 0x7ff52002, 0x5060b800, - 0x825cbd00, 0xffff0000, 0x805cb920, 0x805cb800, - 0x05001082, 0x8c5c051e, 0x05020080, 0x59e06802, - 0x8c34051e, 0x0502006a, 0x4803c856, 0x4200c000, - 0x7ff52045, 0x50603000, 0x82183500, 0x0000ffff, - 0x05000011, 0x80180497, 0x05021074, 0x8060c000, - 0x50602000, 0x82100500, 0xffff0000, 0x80000120, - 0x82100d00, 0x0000ffff, 0x4803c857, 0x4807c857, - 0x4c180000, 0x05fdfd89, 0x5c003000, 0x80183040, - 0x05fe07f3, 0x41780800, 0x40641000, 0x60100000, - 0x0519feec, 0x59e06802, 0x8c34051e, 0x05020057, - 0x4200c000, 0x7ff52005, 0x8008c418, 0x5060c800, - 0x800409c0, 0x0500000a, 0x90041581, 0x05020003, - 0x8064c910, 0x0501f006, 0x90041582, 0x05020003, - 0x8064c920, 0x0501f002, 0x8064c930, 0x8264cd00, - 0x000000ff, 0x4867c857, 0x48675054, 0x42001000, - 0x7ff52002, 0x50080000, 0x82000500, 0x0000ffff, - 0x4803c857, 0x8c00051e, 0x05020044, 0x80640480, - 0x05021042, 0x40640800, 0x405c1000, 0x0519fead, - 0x4803c857, 0x800001c0, 0x0502003c, 0x59e06802, - 0x8c34051e, 0x05020034, 0x4200c000, 0x7ff52045, - 0x805cc418, 0x8004c418, 0x05001034, 0x05000033, - 0x4863c857, 0x50600000, 0x82000500, 0x0000ffff, - 0x48035055, 0x8c00051e, 0x0502002c, 0x4803c857, - 0x80000c97, 0x05021029, 0x40601000, 0x80081000, - 0x50080800, 0x48075056, 0x80081000, 0x50080800, - 0x48075057, 0x4000b800, 0x8060c000, 0x50602000, + 0x4c140000, 0x4a03c013, 0x03800300, 0x4a03c014, + 0x03800380, 0x60800801, 0x60281000, 0x0505f95c, + 0x05000002, 0x8c14050c, 0x4a03c014, 0x03800000, + 0x5c002800, 0x1c01f000, 0x4c000000, 0x59a8004b, + 0x8c000508, 0x05020004, 0x90000541, 0x5c000000, + 0x1c01f000, 0x80000580, 0x05fdf7fd, 0x05fdfff7, + 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, + 0x4c5c0000, 0x4000b800, 0x59a80044, 0x82000d80, + 0xaabbccdd, 0x0500000f, 0x90000c85, 0x05f61a1f, + 0x4c000000, 0x0509feeb, 0x5c000000, 0x05020003, + 0x0c01f81a, 0x0501f016, 0x4c000000, 0x0509fefc, + 0x5c000000, 0x05fc07fb, 0x0c01f819, 0x0501f010, + 0x05fdffde, 0x0500000e, 0x8d0c051a, 0x0500000c, + 0x05fdffbe, 0x0502000a, 0x05fdffca, 0x05020005, + 0x905c0d83, 0x05020006, 0x6008b800, 0x0501f004, + 0x905c0d81, 0x05020002, 0x600cb800, 0x405c0000, + 0x5c00b800, 0x1c01f000, 0x001017f0, 0x001017f1, + 0x001017f2, 0x001017f3, 0x001017f7, 0x001017f8, + 0x001017fa, 0x0010180a, 0x00101818, 0x00101828, + 0x1c01f000, 0x1c01f000, 0x1c01f000, 0x905c0d83, + 0x05020002, 0x6008b800, 0x1c01f000, 0x1c01f000, + 0x6004b800, 0x1c01f000, 0x05fdffb8, 0x05000007, + 0x05fdff9a, 0x05020005, 0x05fdffa6, 0x05000003, + 0x6000b800, 0x0501f008, 0x905c0d83, 0x05020003, + 0x6000b800, 0x0501f004, 0x905c0d82, 0x05020002, + 0x05f5f9de, 0x1c01f000, 0x05fdffa8, 0x0500000c, + 0x05fdff8a, 0x0502000a, 0x05fdff96, 0x05020005, + 0x905c0d83, 0x05020006, 0x6008b800, 0x0501f004, + 0x905c0d81, 0x05020002, 0x600cb800, 0x1c01f000, + 0x05fdff9a, 0x0500000b, 0x05fdff7c, 0x05020009, + 0x05fdff88, 0x05020002, 0x0501f006, 0x905c0d83, + 0x05000006, 0x905c0d81, 0x05000004, 0x0501f004, + 0x905c0d83, 0x05020002, 0x6008b800, 0x1c01f000, + 0x05fdff8a, 0x05000006, 0x05fdff6c, 0x05020004, + 0x05fdff78, 0x05020002, 0x0501f004, 0x905c0d81, + 0x05020002, 0x600cb800, 0x1c01f000, 0x4803c856, + 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4c580000, + 0x497b504c, 0x4200c000, 0x7ff52000, 0x0509fe9b, + 0x05020007, 0x4803c856, 0x4a03c014, 0x07e30000, + 0x59e0c813, 0x0501f8bb, 0x0501f014, 0x59a80058, + 0x82000d80, 0x3261103c, 0x050200b1, 0x4803c856, + 0x42000800, 0x7ff481e6, 0x59e06802, 0x8c34051e, + 0x05020003, 0x42000800, 0x7ff480e6, 0x50040000, + 0x4803c857, 0x48035053, 0x8c00051e, 0x050000a4, + 0x8200cd00, 0x000000ff, 0x4867c857, 0x4867504d, + 0x50600800, 0x4807504e, 0x4807c857, 0x82040d80, + 0x53434651, 0x05020098, 0x8060c000, 0x50600800, + 0x4807504f, 0x8060c000, 0x50600800, 0x48075050, + 0x8060c000, 0x50600800, 0x48075051, 0x8060c000, + 0x50600800, 0x82040d00, 0x0000ffff, 0x48075052, + 0x4200c000, 0x7ff52002, 0x5060b800, 0x825cbd00, + 0xffff0000, 0x805cb920, 0x805cb800, 0x05001082, + 0x8c5c051e, 0x05020080, 0x59e06802, 0x8c34051e, + 0x0502006a, 0x4803c856, 0x4200c000, 0x7ff52045, + 0x50603000, 0x82183500, 0x0000ffff, 0x05000011, + 0x80180497, 0x05021074, 0x8060c000, 0x50602000, 0x82100500, 0xffff0000, 0x80000120, 0x82100d00, - 0x0000ffff, 0x4803c857, 0x4807c857, 0x05fdfd37, - 0x805cb840, 0x05fe07f5, 0x0501f016, 0x4803c856, - 0x42000000, 0x7ff52001, 0x5000b000, 0x8258b500, - 0xffff0000, 0x8058b124, 0x8258c400, 0x7ff52000, - 0xb060c400, 0x05fdf790, 0x8258c400, 0x7ff52000, - 0x05fdf7aa, 0x8258c400, 0x7ff52000, 0xb060c400, - 0x805cc418, 0x05fdf7cc, 0x4a03504c, 0xdeaddead, - 0x5c00b000, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x1c01f000, 0x4867c857, 0x90640d20, 0x8004690a, - 0x82640d00, 0x00000400, 0x80040912, 0x80046d4d, - 0x90640d01, 0x800408c4, 0x80046d4d, 0x90640d02, - 0x800408c4, 0x80046d4d, 0x82640d00, 0x00000100, - 0x80040908, 0x80046d4d, 0x82640d00, 0x00000080, - 0x80040904, 0x80046d4d, 0xb0640d00, 0x80046d4d, - 0x82640d00, 0x00000200, 0x80040904, 0x80046d4d, - 0x8234cd00, 0x000000ff, 0x1c01f000, 0x0509fdc8, - 0x0502000d, 0x4803c856, 0x4a03c014, 0x18001800, - 0x4a03c013, 0x18000800, 0x05fdfce5, 0x4a03c013, - 0x18000000, 0x61a1d007, 0x0519fd9d, 0x4a03c013, - 0x18000800, 0x1c01f000, 0x0509fdb9, 0x0502000d, - 0x4803c856, 0x4a03c014, 0x18001800, 0x4a03c013, - 0x18001800, 0x05fdfcd6, 0x4a03c013, 0x18001000, - 0x61a1d007, 0x0519fd8e, 0x4a03c013, 0x18001800, - 0x1c01f000, 0x0509fdaa, 0x0502000c, 0x60041800, - 0x42001000, 0x001093cd, 0x60900800, 0x60002180, - 0x50080000, 0x82000500, 0x000000ff, 0x4803c857, - 0x0509fe41, 0x05f408a1, 0x1c01f000, 0x4803c856, - 0x59a80006, 0x8c00051e, 0x05020008, 0x61f2880f, - 0x42003000, 0x00fffffc, 0x050dffec, 0x05020007, - 0x0501f808, 0x05000005, 0x4a03501c, 0x0000ffff, - 0x90000541, 0x1c01f000, 0x80000580, 0x05fdf7fe, - 0x4937c857, 0x0521fcae, 0x0500000f, 0x4936600a, - 0x64066407, 0x417a7800, 0x050dffa1, 0x600c0800, - 0x050dffaa, 0x59a8001d, 0x80000000, 0x4803501d, - 0x599c0208, 0x48026c12, 0x600a7000, 0x0005f905, - 0x90000541, 0x1c01f000, 0x40681000, 0x0501f805, - 0x60018800, 0x05000002, 0x60058800, 0x1c01f000, - 0x480bc857, 0x492fc857, 0x4c5c0000, 0x4008b800, - 0x61f6880f, 0x42003000, 0x00fffffd, 0x050dffc3, - 0x05020019, 0x5934000a, 0x84000544, 0x4802680a, - 0x0521fc8b, 0x05000014, 0x4936600a, 0x812e59c0, - 0x05000006, 0x592c0405, 0x8c00051e, 0x05000003, - 0x48ee6023, 0x0501f004, 0x59a8021b, 0x8400055c, - 0x4803521b, 0x492e6009, 0x64066407, 0x485e601e, - 0x608a7000, 0x0005f905, 0x90000541, 0x5c00b800, - 0x1c01f000, 0x80000580, 0x05fdf7fd, 0x4933c857, - 0x59a8021b, 0x8c000508, 0x05020010, 0x5930500a, - 0x482bc857, 0x916c0582, 0x0502000c, 0x0501f812, - 0x0502000a, 0x58280403, 0x82000580, 0x000007fc, - 0x05000007, 0x59a80016, 0x80000040, 0x4803c857, - 0x05f41842, 0x48035016, 0x1c01f000, 0x59a8001d, - 0x80000040, 0x4803c857, 0x05fc17fc, 0x4803501d, - 0x1c01f000, 0x59300009, 0x800001c0, 0x05020007, - 0x59300403, 0x90000581, 0x05020003, 0x90000541, - 0x0501f002, 0x80000580, 0x1c01f000, 0x4933c857, - 0x493fc857, 0x4947c857, 0x4d400000, 0x4d340000, - 0x4d440000, 0x4c580000, 0x0519ff75, 0x4df00000, - 0x8060c1c0, 0x05020003, 0x6004b000, 0x0501f003, - 0x61c0b00f, 0x417a8800, 0x41440000, 0x81ac0400, - 0x50000000, 0x80026d40, 0x05000015, 0x4d3c0000, - 0x60067800, 0x0511f9ec, 0x5c027800, 0x60a68000, - 0x0201f800, 0x0010bb8e, 0x0201f800, 0x0010bc6a, - 0x0201f800, 0x0010bd03, 0x0511fa61, 0x05020005, - 0x4937c857, 0x4a026c00, 0x00000404, 0x0501f002, - 0x0511fa90, 0x0201f800, 0x0010c0f3, 0x81468800, - 0x8058b040, 0x05fe07e5, 0x5c03e000, 0x05180f3c, - 0x5c00b000, 0x5c028800, 0x5c026800, 0x5c028000, - 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x4937c857, 0x4947c857, - 0x4c5c0000, 0x4c600000, 0x4c640000, 0x59a8006f, - 0x8c000500, 0x0500001d, 0x599c0017, 0x8c00050a, - 0x0502001a, 0x5934ba02, 0x825cbd00, 0x000000ff, - 0x485fc857, 0x4178c000, 0x4178c800, 0x82600400, - 0x001098d3, 0x50002000, 0x8060c1c0, 0x05000008, - 0x82100500, 0x000000ff, 0x82002d80, 0x000000ff, - 0x0500000a, 0x805c0580, 0x0500000a, 0x80102110, - 0x8064c800, 0x90640584, 0x05fe07f6, 0x8060c000, - 0x906005a0, 0x05fe07ed, 0x4813c857, 0x90000541, + 0x0000ffff, 0x4803c857, 0x4807c857, 0x4c180000, + 0x05fdfd88, 0x5c003000, 0x80183040, 0x05fe07f3, + 0x41780800, 0x40641000, 0x60100000, 0x0519ff79, + 0x59e06802, 0x8c34051e, 0x05020057, 0x4200c000, + 0x7ff52005, 0x8008c418, 0x5060c800, 0x800409c0, + 0x0500000a, 0x90041581, 0x05020003, 0x8064c910, + 0x0501f006, 0x90041582, 0x05020003, 0x8064c920, + 0x0501f002, 0x8064c930, 0x8264cd00, 0x000000ff, + 0x4867c857, 0x48675054, 0x42001000, 0x7ff52002, + 0x50080000, 0x82000500, 0x0000ffff, 0x4803c857, + 0x8c00051e, 0x05020044, 0x80640480, 0x05021042, + 0x40640800, 0x405c1000, 0x0519ff3a, 0x4803c857, + 0x800001c0, 0x0502003c, 0x59e06802, 0x8c34051e, + 0x05020034, 0x4200c000, 0x7ff52045, 0x805cc418, + 0x8004c418, 0x05001034, 0x05000033, 0x4863c857, + 0x50600000, 0x82000500, 0x0000ffff, 0x48035055, + 0x8c00051e, 0x0502002c, 0x4803c857, 0x80000c97, + 0x05021029, 0x40601000, 0x80081000, 0x50080800, + 0x48075056, 0x80081000, 0x50080800, 0x48075057, + 0x4000b800, 0x8060c000, 0x50602000, 0x82100500, + 0xffff0000, 0x80000120, 0x82100d00, 0x0000ffff, + 0x4803c857, 0x4807c857, 0x05fdfd36, 0x805cb840, + 0x05fe07f5, 0x0501f016, 0x4803c856, 0x42000000, + 0x7ff52001, 0x5000b000, 0x8258b500, 0xffff0000, + 0x8058b124, 0x8258c400, 0x7ff52000, 0xb060c400, + 0x05fdf790, 0x8258c400, 0x7ff52000, 0x05fdf7aa, + 0x8258c400, 0x7ff52000, 0xb060c400, 0x805cc418, + 0x05fdf7cc, 0x4a03504c, 0xdeaddead, 0x5c00b000, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x0501f805, 0x60058800, 0x05020002, 0x60018800, - 0x1c01f000, 0x59a8021b, 0x8c000512, 0x05f60885, - 0x1c01f000, 0x00007eef, 0x00007de8, 0x00007ce4, - 0x000080e2, 0x00007be1, 0x000080e0, 0x000080dc, - 0x000080da, 0x00007ad9, 0x000080d6, 0x000080d5, - 0x000080d4, 0x000080d3, 0x000080d2, 0x000080d1, - 0x000079ce, 0x000078cd, 0x000080cc, 0x000080cb, - 0x000080ca, 0x000080c9, 0x000080c7, 0x000080c6, - 0x000077c5, 0x000076c3, 0x000080bc, 0x000080ba, - 0x000075b9, 0x000080b6, 0x000074b5, 0x000073b4, - 0x000072b3, 0x000080b2, 0x000080b1, 0x000080ae, - 0x000071ad, 0x000080ac, 0x000070ab, 0x00006faa, - 0x00006ea9, 0x000080a7, 0x00006da6, 0x00006ca5, - 0x00006ba3, 0x00006a9f, 0x0000699e, 0x0000689d, - 0x0000809b, 0x00008098, 0x00006797, 0x00006690, - 0x0000658f, 0x00006488, 0x00006384, 0x00006282, - 0x00008081, 0x00008080, 0x0000617c, 0x0000607a, - 0x00008079, 0x00005f76, 0x00008075, 0x00008074, - 0x00008073, 0x00008072, 0x00008071, 0x0000806e, - 0x00005e6d, 0x0000806c, 0x00005d6b, 0x00005c6a, - 0x00005b69, 0x00008067, 0x00005a66, 0x00005965, - 0x00005863, 0x0000575c, 0x0000565a, 0x00005559, - 0x00008056, 0x00008055, 0x00005454, 0x00005353, - 0x00005252, 0x00005151, 0x0000504e, 0x00004f4d, - 0x0000804c, 0x0000804b, 0x00004e4a, 0x00004d49, - 0x00008047, 0x00004c46, 0x00008045, 0x00008043, - 0x0000803c, 0x0000803a, 0x00008039, 0x00008036, - 0x00004b35, 0x00008034, 0x00004a33, 0x00004932, - 0x00004831, 0x0000802e, 0x0000472d, 0x0000462c, - 0x0000452b, 0x0000442a, 0x00004329, 0x00004227, - 0x00008026, 0x00008025, 0x00004123, 0x0000401f, - 0x00003f1e, 0x00003e1d, 0x00003d1b, 0x00003c18, - 0x00008017, 0x00008010, 0x00003b0f, 0x00003a08, - 0x00008004, 0x00003902, 0x00008001, 0x00008000, - 0x00008000, 0x00003800, 0x00003700, 0x00003600, - 0x00008000, 0x00003500, 0x00008000, 0x00008000, - 0x00008000, 0x00003400, 0x00008000, 0x00008000, + 0x4867c857, 0x90640d20, 0x8004690a, 0x82640d00, + 0x00000400, 0x80040912, 0x80046d4d, 0x90640d01, + 0x800408c4, 0x80046d4d, 0x90640d02, 0x800408c4, + 0x80046d4d, 0x82640d00, 0x00000100, 0x80040908, + 0x80046d4d, 0x82640d00, 0x00000080, 0x80040904, + 0x80046d4d, 0xb0640d00, 0x80046d4d, 0x82640d00, + 0x00000200, 0x80040904, 0x80046d4d, 0x8234cd00, + 0x000000ff, 0x1c01f000, 0x0509fdcd, 0x0502000d, + 0x4803c856, 0x4a03c014, 0x18001800, 0x4a03c013, + 0x18000800, 0x05fdfce4, 0x4a03c013, 0x18000000, + 0x61a1d007, 0x0519fe2a, 0x4a03c013, 0x18000800, + 0x1c01f000, 0x0509fdbe, 0x0502000d, 0x4803c856, + 0x4a03c014, 0x18001800, 0x4a03c013, 0x18001800, + 0x05fdfcd5, 0x4a03c013, 0x18001000, 0x61a1d007, + 0x0519fe1b, 0x4a03c013, 0x18001800, 0x1c01f000, + 0x0509fdaf, 0x0502000c, 0x60041800, 0x42001000, + 0x0010944d, 0x60900800, 0x60002180, 0x50080000, + 0x82000500, 0x000000ff, 0x4803c857, 0x0509fe46, + 0x05f408a2, 0x1c01f000, 0x4803c856, 0x59a80006, + 0x8c00051e, 0x05020008, 0x61f2880f, 0x42003000, + 0x00fffffc, 0x050dfffc, 0x05020007, 0x0501f808, + 0x05000005, 0x4a03501c, 0x0000ffff, 0x90000541, + 0x1c01f000, 0x80000580, 0x05fdf7fe, 0x4937c857, + 0x0521fd2b, 0x0500000f, 0x4936600a, 0x64066407, + 0x417a7800, 0x050dffae, 0x600c0800, 0x050dffb7, + 0x59a8001d, 0x80000000, 0x4803501d, 0x599c0208, + 0x48026c12, 0x600a7000, 0x0005f905, 0x90000541, + 0x1c01f000, 0x40681000, 0x0501f805, 0x60018800, + 0x05000002, 0x60058800, 0x1c01f000, 0x480bc857, + 0x492fc857, 0x4c5c0000, 0x4008b800, 0x61f6880f, + 0x42003000, 0x00fffffd, 0x050dffd3, 0x05020019, + 0x5934000a, 0x84000544, 0x4802680a, 0x0521fd08, + 0x05000014, 0x4936600a, 0x812e59c0, 0x05000006, + 0x592c0405, 0x8c00051e, 0x05000003, 0x48ee6023, + 0x0501f004, 0x59a8021b, 0x8400055c, 0x4803521b, + 0x492e6009, 0x64066407, 0x485e601e, 0x608a7000, + 0x0005f905, 0x90000541, 0x5c00b800, 0x1c01f000, + 0x80000580, 0x05fdf7fd, 0x4933c857, 0x59a8021b, + 0x8c000508, 0x05020010, 0x5930500a, 0x482bc857, + 0x916c0582, 0x0502000c, 0x0501f815, 0x0502000a, + 0x58280403, 0x82000580, 0x000007fc, 0x05000007, + 0x59a80016, 0x80000040, 0x4803c857, 0x05f41843, + 0x48035016, 0x1c01f000, 0x5930041f, 0x900005a1, + 0x05fc07fd, 0x59a8001d, 0x80000040, 0x4803c857, + 0x05fc17f9, 0x4803501d, 0x1c01f000, 0x59300009, + 0x800001c0, 0x05020007, 0x59300403, 0x90000581, + 0x05020003, 0x90000541, 0x0501f002, 0x80000580, + 0x1c01f000, 0x4933c857, 0x493fc857, 0x4947c857, + 0x4d400000, 0x4d340000, 0x4d440000, 0x4c580000, + 0x0519ffff, 0x4df00000, 0x8060c1c0, 0x05020003, + 0x6004b000, 0x0501f003, 0x61c0b00f, 0x417a8800, + 0x41440000, 0x81ac0400, 0x50000000, 0x80026d40, + 0x05000015, 0x4d3c0000, 0x60067800, 0x0511f9fd, + 0x5c027800, 0x60a68000, 0x0201f800, 0x0010bb9e, + 0x0201f800, 0x0010bc6f, 0x0201f800, 0x0010bd08, + 0x0511fa74, 0x05020005, 0x4937c857, 0x4a026c00, + 0x00000404, 0x0501f002, 0x0511faa3, 0x0201f800, + 0x0010c0ee, 0x81468800, 0x8058b040, 0x05fe07e5, + 0x5c03e000, 0x05180fc6, 0x5c00b000, 0x5c028800, + 0x5c026800, 0x5c028000, 0x1c01f000, 0x0501f805, + 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, + 0x4937c857, 0x4947c857, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x59a8006f, 0x8c000500, 0x0500001d, + 0x599c0017, 0x8c00050a, 0x0502001a, 0x5934ba02, + 0x825cbd00, 0x000000ff, 0x485fc857, 0x4178c000, + 0x4178c800, 0x82600400, 0x00109953, 0x50002000, + 0x8060c1c0, 0x05000008, 0x82100500, 0x000000ff, + 0x82002d80, 0x000000ff, 0x0500000a, 0x805c0580, + 0x0500000a, 0x80102110, 0x8064c800, 0x90640584, + 0x05fe07f6, 0x8060c000, 0x906005a0, 0x05fe07ed, + 0x4813c857, 0x90000541, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x0501f805, 0x60058800, + 0x05020002, 0x60018800, 0x1c01f000, 0x59a8021b, + 0x8c000512, 0x05f60883, 0x1c01f000, 0x00007eef, + 0x00007de8, 0x00007ce4, 0x000080e2, 0x00007be1, + 0x000080e0, 0x000080dc, 0x000080da, 0x00007ad9, + 0x000080d6, 0x000080d5, 0x000080d4, 0x000080d3, + 0x000080d2, 0x000080d1, 0x000079ce, 0x000078cd, + 0x000080cc, 0x000080cb, 0x000080ca, 0x000080c9, + 0x000080c7, 0x000080c6, 0x000077c5, 0x000076c3, + 0x000080bc, 0x000080ba, 0x000075b9, 0x000080b6, + 0x000074b5, 0x000073b4, 0x000072b3, 0x000080b2, + 0x000080b1, 0x000080ae, 0x000071ad, 0x000080ac, + 0x000070ab, 0x00006faa, 0x00006ea9, 0x000080a7, + 0x00006da6, 0x00006ca5, 0x00006ba3, 0x00006a9f, + 0x0000699e, 0x0000689d, 0x0000809b, 0x00008098, + 0x00006797, 0x00006690, 0x0000658f, 0x00006488, + 0x00006384, 0x00006282, 0x00008081, 0x00008080, + 0x0000617c, 0x0000607a, 0x00008079, 0x00005f76, + 0x00008075, 0x00008074, 0x00008073, 0x00008072, + 0x00008071, 0x0000806e, 0x00005e6d, 0x0000806c, + 0x00005d6b, 0x00005c6a, 0x00005b69, 0x00008067, + 0x00005a66, 0x00005965, 0x00005863, 0x0000575c, + 0x0000565a, 0x00005559, 0x00008056, 0x00008055, + 0x00005454, 0x00005353, 0x00005252, 0x00005151, + 0x0000504e, 0x00004f4d, 0x0000804c, 0x0000804b, + 0x00004e4a, 0x00004d49, 0x00008047, 0x00004c46, + 0x00008045, 0x00008043, 0x0000803c, 0x0000803a, + 0x00008039, 0x00008036, 0x00004b35, 0x00008034, + 0x00004a33, 0x00004932, 0x00004831, 0x0000802e, + 0x0000472d, 0x0000462c, 0x0000452b, 0x0000442a, + 0x00004329, 0x00004227, 0x00008026, 0x00008025, + 0x00004123, 0x0000401f, 0x00003f1e, 0x00003e1d, + 0x00003d1b, 0x00003c18, 0x00008017, 0x00008010, + 0x00003b0f, 0x00003a08, 0x00008004, 0x00003902, + 0x00008001, 0x00008000, 0x00008000, 0x00003800, + 0x00003700, 0x00003600, 0x00008000, 0x00003500, + 0x00008000, 0x00008000, 0x00008000, 0x00003400, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00003300, 0x00003200, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x00003300, 0x00003200, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00003100, 0x00003000, 0x00008000, 0x00008000, - 0x00002f00, 0x00008000, 0x00002e00, 0x00002d00, - 0x00002c00, 0x00008000, 0x00008000, 0x00008000, - 0x00002b00, 0x00008000, 0x00002a00, 0x00002900, - 0x00002800, 0x00008000, 0x00002700, 0x00002600, - 0x00002500, 0x00002400, 0x00002300, 0x00002200, - 0x00008000, 0x00008000, 0x00002100, 0x00002000, - 0x00001f00, 0x00001e00, 0x00001d00, 0x00001c00, - 0x00008000, 0x00008000, 0x00001b00, 0x00001a00, - 0x00008000, 0x00001900, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x00003100, 0x00003000, + 0x00008000, 0x00008000, 0x00002f00, 0x00008000, + 0x00002e00, 0x00002d00, 0x00002c00, 0x00008000, + 0x00008000, 0x00008000, 0x00002b00, 0x00008000, + 0x00002a00, 0x00002900, 0x00002800, 0x00008000, + 0x00002700, 0x00002600, 0x00002500, 0x00002400, + 0x00002300, 0x00002200, 0x00008000, 0x00008000, + 0x00002100, 0x00002000, 0x00001f00, 0x00001e00, + 0x00001d00, 0x00001c00, 0x00008000, 0x00008000, + 0x00001b00, 0x00001a00, 0x00008000, 0x00001900, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00001800, 0x00008000, 0x00001700, 0x00001600, - 0x00001500, 0x00008000, 0x00001400, 0x00001300, - 0x00001200, 0x00001100, 0x00001000, 0x00000f00, - 0x00008000, 0x00008000, 0x00000e00, 0x00000d00, - 0x00000c00, 0x00000b00, 0x00000a00, 0x00000900, - 0x00008000, 0x00008000, 0x00000800, 0x00000700, - 0x00008000, 0x00000600, 0x00008000, 0x00008000, - 0x00008000, 0x00000500, 0x00000400, 0x00000300, - 0x00008000, 0x00000200, 0x00008000, 0x00008000, - 0x00008000, 0x00000100, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x00001800, 0x00008000, + 0x00001700, 0x00001600, 0x00001500, 0x00008000, + 0x00001400, 0x00001300, 0x00001200, 0x00001100, + 0x00001000, 0x00000f00, 0x00008000, 0x00008000, + 0x00000e00, 0x00000d00, 0x00000c00, 0x00000b00, + 0x00000a00, 0x00000900, 0x00008000, 0x00008000, + 0x00000800, 0x00000700, 0x00008000, 0x00000600, + 0x00008000, 0x00008000, 0x00008000, 0x00000500, + 0x00000400, 0x00000300, 0x00008000, 0x00000200, + 0x00008000, 0x00008000, 0x00008000, 0x00000100, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00000000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x00000000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x05f5fa34, 0x05f00ec4, 0x492f4017, - 0x1c01f000, 0x91a0ac07, 0x83a00580, 0x00109410, - 0x05000008, 0x492fc857, 0x812e59c0, 0x05f00ebb, - 0x912ca407, 0x6034b000, 0x0535fe31, 0x0501f00d, - 0x6040b000, 0x91e0a420, 0x50500000, 0x8050a000, - 0x50500800, 0x900409c0, 0x80040540, 0x4400a800, - 0x8050a000, 0x8054a800, 0x8058b040, 0x05fe07f7, - 0x1c01f000, 0x59a00207, 0xb0000cbf, 0x050210be, - 0x0c01f001, 0x00101bc7, 0x00101bfd, 0x00101bfd, - 0x00101c47, 0x00101c5c, 0x00101bfd, 0x00101bc7, - 0x00101c71, 0x00101c82, 0x00101bfd, 0x00101bfd, - 0x00101c97, 0x00101cb5, 0x00101cd3, 0x00101bfd, - 0x00101cf0, 0x00101bfd, 0x00101bfd, 0x00101d10, - 0x00101bfd, 0x00101dbf, 0x00101bfd, 0x00101bfd, - 0x00101bfd, 0x00101bfd, 0x00101de6, 0x00101e3d, - 0x00101bfd, 0x00101bfd, 0x00101bfd, 0x00101bfd, - 0x00101bfd, 0x00101e87, 0x00101bfd, 0x00101ec8, - 0x00101bfd, 0x00101bfd, 0x00101bfd, 0x00101bfd, - 0x00101ecd, 0x00101fc7, 0x00101bfd, 0x00101fce, - 0x00101bfd, 0x00101bfd, 0x00101bfd, 0x00101bfd, - 0x00101bfd, 0x00101fcf, 0x00102057, 0x001021f5, - 0x00102201, 0x00101bfd, 0x00101bfd, 0x00101bfd, - 0x00101bfd, 0x00102214, 0x00101bfd, 0x00101bfd, - 0x00101bfd, 0x00101bfd, 0x00101bfd, 0x00101bfd, - 0x00101bfd, 0x00102234, 0x00102272, 0x001022b6, - 0x001022cb, 0x0010ae15, 0x0010b404, 0x0010230a, - 0x00101bfd, 0x00101bfd, 0x00101bfd, 0x00101bfd, - 0x00101bfd, 0x00101bfd, 0x00101bfd, 0x00101bfd, - 0x00101bfd, 0x00101bfd, 0x00101bfd, 0x00101bfd, - 0x0010244f, 0x001024ac, 0x00101bfd, 0x00101bfd, - 0x00102508, 0x00101bfd, 0x00102582, 0x00102606, - 0x00101bfd, 0x00101bfd, 0x0010266d, 0x001026f7, - 0x00101bfd, 0x00102739, 0x0010289d, 0x00101bfd, - 0x001028ac, 0x00102926, 0x00101bfd, 0x00101bfd, - 0x00101bfd, 0x00101bfd, 0x0010297f, 0x00102999, - 0x001029b0, 0x00101bfd, 0x00102a26, 0x00101bfd, - 0x00101bfd, 0x00102a62, 0x00101bfd, 0x00102a83, - 0x00101bfd, 0x00101bfd, 0x00102ad7, 0x00102c08, - 0x00101bfd, 0x00101bfd, 0x00101bfd, 0x00101bfd, - 0x00101bfd, 0x00102c4a, 0x00102ccb, 0x00101bfd, - 0x48efc857, 0x4031d800, 0x58ef400a, 0x58ec0002, - 0x82000580, 0x00000200, 0x0500003b, 0x48efc857, - 0x4a034207, 0x00004000, 0x0509f9c4, 0x83a00580, - 0x00109410, 0x0500000b, 0x58ee5809, 0x4d2c0000, - 0x0501f850, 0x41a25800, 0x05f5f9a6, 0x40ee5800, - 0x05f5f9a4, 0x5c025800, 0x492fc857, 0x0001f32c, - 0x05026007, 0x59a0001e, 0x84000542, 0x4803401e, - 0x4a01d808, 0x00101bd8, 0x1c01f000, 0x59a00207, - 0x82000d80, 0x00004000, 0x05000005, 0x900001c0, - 0x90000551, 0x4803c011, 0x0501f004, 0x900001c0, - 0x90000550, 0x4803c011, 0x0501f844, 0x59e00017, - 0x8c00050a, 0x60000800, 0x0002088c, 0x8d0c0530, - 0x05fa0b81, 0x0002098c, 0x6403c017, 0x4203e000, - 0x30000001, 0x4203e000, 0x40000000, 0x40ee5800, - 0x05f5f980, 0x59a0001e, 0x84000504, 0x4803401e, - 0x1c01f000, 0x4803c856, 0x4a034207, 0x00004001, - 0x05fdf7ca, 0x4803c856, 0x4a034207, 0x00004002, - 0x05fdf7c6, 0x4803c856, 0x4a034207, 0x00004003, - 0x05fdf7c2, 0x4803c856, 0x4a034207, 0x00004005, - 0x05fdf7be, 0x4803c856, 0x4a034207, 0x00004006, - 0x05fdf7ba, 0x4803c856, 0x4a034207, 0x0000400b, - 0x05fdf7b6, 0x4803c856, 0x4a034207, 0x0000400c, - 0x05fdf7b2, 0x4803c856, 0x4a034207, 0x0000400c, - 0x05fdf7ae, 0x4a034207, 0x00004020, 0x05fdf7ab, - 0x4c580000, 0x4c500000, 0x4c540000, 0x58eca809, - 0x8054a9c0, 0x05f00dc1, 0x91a0a407, 0x9054ac07, - 0x6034b000, 0x0535fd36, 0x5c00a800, 0x5c00a000, - 0x5c00b000, 0x1c01f000, 0x4c580000, 0x4c500000, - 0x4c540000, 0x59a00007, 0x4803c857, 0x59a00008, - 0x4803c857, 0x59a00009, 0x4803c857, 0x91e0ac20, - 0x91a0a407, 0x6040b000, 0x50500000, 0x4400a800, - 0x8054a800, 0x900001c0, 0x4400a800, 0x8054a800, - 0x8050a000, 0x8058b040, 0x05fe07f8, 0x5c00a800, - 0x5c00a000, 0x5c00b000, 0x1c01f000, 0x59a00407, - 0x800000c2, 0x59a00a08, 0x900409c0, 0x80040540, - 0x84000540, 0x59a00c08, 0x8c040500, 0x0500000b, - 0x4c000000, 0x0535fd60, 0x5c000000, 0x05000004, - 0x48030004, 0x64030000, 0x05fdf771, 0x64030000, - 0x64134407, 0x05fc07b0, 0x4803880e, 0x05fdf76c, - 0x59a00407, 0x800000c2, 0x59a00c08, 0x8c040500, - 0x0500000d, 0x4c000000, 0x0535fd4f, 0x5c000000, - 0x05000006, 0x48030004, 0x59800805, 0x48074407, - 0x64030000, 0x05fdf75e, 0x64030000, 0x64134407, - 0x05fc079d, 0x4803880e, 0x59c4080f, 0x48074407, - 0x05fdf757, 0x59a01c07, 0x59a00208, 0x900c19c0, - 0x800c1d40, 0x580c0803, 0x80000580, 0x500c1000, - 0x80080400, 0x800c1800, 0x80040840, 0x05fe07fc, - 0x48034407, 0x900001c0, 0x48034208, 0x800001c0, - 0x05fc0747, 0x05fdf784, 0x64174407, 0x64134208, - 0x64034408, 0x59a8000a, 0x82000c80, 0x00140000, - 0x05021004, 0x42000000, 0x0013ffff, 0x0501f006, - 0x59a80883, 0x8c040500, 0x05000003, 0x82000400, - 0x00006000, 0x48034209, 0x900001c0, 0x48034409, - 0x4a03420a, 0x00000080, 0x05fdf731, 0x59a00408, - 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, - 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x59a00a09, - 0x59a00409, 0x900409c0, 0x80040d40, 0x59a0020b, - 0x90002490, 0x05fc1768, 0x59a02407, 0x900001c0, - 0x80100540, 0x59a8280a, 0x80142480, 0x050a10f1, - 0x42002800, 0x7fefffff, 0x80142480, 0x05fe175e, - 0x42002800, 0x7ffd0000, 0x80142480, 0x05fc175a, - 0x0509f0e8, 0x59a00408, 0x59a01208, 0x900811c0, - 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, - 0x800c1d40, 0x59a00a09, 0x59a00409, 0x900409c0, - 0x80040d40, 0x59a0020b, 0x90002490, 0x05fc174a, - 0x59a02407, 0x900001c0, 0x80100540, 0x59a8280a, - 0x80142480, 0x050a10d9, 0x42002800, 0x7fefffff, - 0x80142480, 0x05fe1740, 0x42002800, 0x7ffd0000, - 0x80142480, 0x05fc173c, 0x0509f0d0, 0x59a02408, - 0x59a00208, 0x901021c0, 0x80102540, 0x59a01a0b, - 0x59a00407, 0x900c19c0, 0x800c1d40, 0x41781000, - 0x820c0580, 0x00007c00, 0x0500000a, 0x820c0480, - 0x00007a00, 0x05001007, 0x820c0480, 0x00007cff, - 0x05021004, 0x0535fccc, 0x05000007, 0x80081000, - 0x44101800, 0x800811c0, 0x05fc06dd, 0x64030000, - 0x05fdf6db, 0x64030000, 0x64134407, 0x05fdf71a, + 0x00008000, 0x00008000, 0x00008000, 0x05f5fa32, + 0x05f00ec2, 0x492f4017, 0x1c01f000, 0x91a0ac07, + 0x83a00580, 0x00109490, 0x05000008, 0x492fc857, + 0x812e59c0, 0x05f00eb9, 0x912ca407, 0x6034b000, + 0x0535fef9, 0x0501f00d, 0x6040b000, 0x91e0a420, + 0x50500000, 0x8050a000, 0x50500800, 0x900409c0, + 0x80040540, 0x4400a800, 0x8050a000, 0x8054a800, + 0x8058b040, 0x05fe07f7, 0x1c01f000, 0x59a00207, + 0xb0000cbf, 0x050210be, 0x0c01f001, 0x00101bc9, + 0x00101bff, 0x00101bff, 0x00101c49, 0x00101c5e, + 0x00101bff, 0x00101bc9, 0x00101c73, 0x00101c84, + 0x00101bff, 0x00101bff, 0x00101c9c, 0x00101cba, + 0x00101cd8, 0x00101bff, 0x00101cf5, 0x00101bff, + 0x00101bff, 0x00101d15, 0x00101bff, 0x00101dc4, + 0x00101bff, 0x00101bff, 0x00101bff, 0x00101bff, + 0x00101deb, 0x00101e42, 0x00101bff, 0x00101bff, + 0x00101bff, 0x00101bff, 0x00101bff, 0x00101e8c, + 0x00101bff, 0x00101ecd, 0x00101bff, 0x00101bff, + 0x00101bff, 0x00101bff, 0x00101ed2, 0x00101fcc, + 0x00101bff, 0x00101fd3, 0x00101bff, 0x00101bff, + 0x00101bff, 0x00101bff, 0x00101bff, 0x00101fd4, + 0x0010205c, 0x001021fa, 0x00102206, 0x00101bff, + 0x00101bff, 0x00101bff, 0x00101bff, 0x00102219, + 0x00101bff, 0x00101bff, 0x00101bff, 0x00101bff, + 0x00101bff, 0x00101bff, 0x00101bff, 0x00102239, + 0x00102277, 0x001022bb, 0x001022d0, 0x0010ae15, + 0x0010b404, 0x0010230f, 0x00101bff, 0x00101bff, + 0x00101bff, 0x00101bff, 0x00101bff, 0x00101bff, + 0x00101bff, 0x00101bff, 0x00101bff, 0x00101bff, + 0x00101bff, 0x00101bff, 0x00102454, 0x001024b1, + 0x00101bff, 0x00101bff, 0x0010250d, 0x00101bff, + 0x00102587, 0x0010260b, 0x00101bff, 0x00101bff, + 0x00102672, 0x001026fc, 0x00101bff, 0x0010273e, + 0x001028a1, 0x00101bff, 0x001028b0, 0x0010292a, + 0x00101bff, 0x00101bff, 0x00101bff, 0x00101bff, + 0x00102983, 0x0010299d, 0x001029b4, 0x00101bff, + 0x00102a2a, 0x00101bff, 0x00101bff, 0x00102a66, + 0x00101bff, 0x00102a87, 0x00101bff, 0x00101bff, + 0x00102adb, 0x00102c0c, 0x00101bff, 0x00101bff, + 0x00101bff, 0x00101bff, 0x00101bff, 0x00102c4e, + 0x00102ccf, 0x00101bff, 0x48efc857, 0x4031d800, + 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, + 0x0500003b, 0x48efc857, 0x4a034207, 0x00004000, + 0x0509f9c6, 0x83a00580, 0x00109490, 0x0500000b, + 0x58ee5809, 0x4d2c0000, 0x0501f850, 0x41a25800, + 0x05f5f9a4, 0x40ee5800, 0x05f5f9a2, 0x5c025800, + 0x492fc857, 0x0001f32c, 0x05026007, 0x59a0001e, + 0x84000542, 0x4803401e, 0x4a01d808, 0x00101bda, + 0x1c01f000, 0x59a00207, 0x82000d80, 0x00004000, + 0x05000005, 0x900001c0, 0x90000551, 0x4803c011, + 0x0501f004, 0x900001c0, 0x90000550, 0x4803c011, + 0x0501f844, 0x59e00017, 0x8c00050a, 0x60000800, + 0x0002088c, 0x8d0c0530, 0x05fa0b7d, 0x0002098c, + 0x6403c017, 0x4203e000, 0x30000001, 0x4203e000, + 0x40000000, 0x40ee5800, 0x05f5f97e, 0x59a0001e, + 0x84000504, 0x4803401e, 0x1c01f000, 0x4803c856, + 0x4a034207, 0x00004001, 0x05fdf7ca, 0x4803c856, + 0x4a034207, 0x00004002, 0x05fdf7c6, 0x4803c856, + 0x4a034207, 0x00004003, 0x05fdf7c2, 0x4803c856, + 0x4a034207, 0x00004005, 0x05fdf7be, 0x4803c856, + 0x4a034207, 0x00004006, 0x05fdf7ba, 0x4803c856, + 0x4a034207, 0x0000400b, 0x05fdf7b6, 0x4803c856, + 0x4a034207, 0x0000400c, 0x05fdf7b2, 0x4803c856, + 0x4a034207, 0x0000400c, 0x05fdf7ae, 0x4a034207, + 0x00004020, 0x05fdf7ab, 0x4c580000, 0x4c500000, + 0x4c540000, 0x58eca809, 0x8054a9c0, 0x05f00dbf, + 0x91a0a407, 0x9054ac07, 0x6034b000, 0x0535fdfe, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x1c01f000, + 0x4c580000, 0x4c500000, 0x4c540000, 0x59a00007, + 0x4803c857, 0x59a00008, 0x4803c857, 0x59a00009, + 0x4803c857, 0x91e0ac20, 0x91a0a407, 0x6040b000, + 0x50500000, 0x4400a800, 0x8054a800, 0x900001c0, + 0x4400a800, 0x8054a800, 0x8050a000, 0x8058b040, + 0x05fe07f8, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x1c01f000, 0x59a00407, 0x800000c2, 0x59a00a08, + 0x900409c0, 0x80040540, 0x84000540, 0x59a00c08, + 0x8c040500, 0x0500000b, 0x4c000000, 0x0535fe28, + 0x5c000000, 0x05000004, 0x48030004, 0x64030000, + 0x05fdf771, 0x64030000, 0x64134407, 0x05fc07b0, + 0x4803880e, 0x05fdf76c, 0x59a00407, 0x800000c2, + 0x59a00c08, 0x8c040500, 0x0500000d, 0x4c000000, + 0x0535fe17, 0x5c000000, 0x05000006, 0x48030004, + 0x59800805, 0x48074407, 0x64030000, 0x05fdf75e, + 0x64030000, 0x64134407, 0x05fc079d, 0x4803880e, + 0x59c4080f, 0x48074407, 0x05fdf757, 0x59a01c07, + 0x59a00208, 0x900c19c0, 0x800c1d40, 0x580c0803, + 0x80000580, 0x500c1000, 0x80080400, 0x800c1800, + 0x80040840, 0x05fe07fc, 0x48034407, 0x900001c0, + 0x48034208, 0x800001c0, 0x05fc0747, 0x05fdf784, + 0x64174407, 0x64174208, 0x64034408, 0x59a8000a, + 0x82000c80, 0x00140000, 0x05021004, 0x42000000, + 0x0013ffff, 0x0501f006, 0x59a80883, 0x8c040500, + 0x05000003, 0x82000400, 0x00006000, 0x48034209, + 0x900001c0, 0x48034409, 0x60000101, 0x4803420a, + 0x900001c0, 0x4803440e, 0x6403400f, 0x05fdf72e, + 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, + 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, + 0x59a00a09, 0x59a00409, 0x900409c0, 0x80040d40, + 0x59a0020b, 0x90002490, 0x05fc1765, 0x59a02407, + 0x900001c0, 0x80100540, 0x59a8280a, 0x80142480, + 0x050a10f0, 0x42002800, 0x7fefffff, 0x80142480, + 0x05fe175b, 0x42002800, 0x7ffd0000, 0x80142480, + 0x05fc1757, 0x0509f0e7, 0x59a00408, 0x59a01208, + 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, + 0x900c19c0, 0x800c1d40, 0x59a00a09, 0x59a00409, + 0x900409c0, 0x80040d40, 0x59a0020b, 0x90002490, + 0x05fc1747, 0x59a02407, 0x900001c0, 0x80100540, + 0x59a8280a, 0x80142480, 0x050a10d8, 0x42002800, + 0x7fefffff, 0x80142480, 0x05fe173d, 0x42002800, + 0x7ffd0000, 0x80142480, 0x05fc1739, 0x0509f0cf, + 0x59a02408, 0x59a00208, 0x901021c0, 0x80102540, 0x59a01a0b, 0x59a00407, 0x900c19c0, 0x800c1d40, 0x41781000, 0x820c0580, 0x00007c00, 0x0500000a, 0x820c0480, 0x00007a00, 0x05001007, 0x820c0480, - 0x00007cff, 0x05021004, 0x0535fcb3, 0x0500000e, - 0x80081000, 0x500c0000, 0x82000d00, 0x0000ffff, - 0x48074208, 0x82000d00, 0xffff0000, 0x900409c0, - 0x48074408, 0x800811c0, 0x05fc06bd, 0x64030000, - 0x05fdf6bb, 0x64030000, 0x64134407, 0x05fdf6fa, - 0x4d2c0000, 0x4d340000, 0x4d300000, 0x4d440000, - 0x59a28c07, 0x0001fac4, 0x05000006, 0x5c028800, - 0x5c026000, 0x5c026800, 0x5c025800, 0x05fdf6f2, - 0x4937c857, 0x59a04408, 0x59a00208, 0x900001c0, - 0x80204540, 0x4823c857, 0x0501f877, 0x05000008, - 0x64074209, 0x4a034407, 0x0000ffff, 0x4a034208, - 0x0000ffff, 0x497b4408, 0x0501f03d, 0x497b4407, - 0x0501f879, 0x0500003f, 0x59300402, 0x48034407, - 0x59300202, 0x48034208, 0x59300006, 0x48034408, - 0x59a0020c, 0x8c000500, 0x05000030, 0x4933c857, - 0x050dff10, 0x05000003, 0x64274407, 0x0501f031, - 0x8d0c050e, 0x05000003, 0x64074407, 0x0501f02d, - 0x916c0583, 0x05000003, 0x641f4407, 0x0501f029, - 0x59340200, 0x8c00050e, 0x05000003, 0x64834407, - 0x0501f024, 0x59300407, 0x90000d83, 0x05020007, - 0x59300804, 0x9004051f, 0x90000584, 0x05020003, - 0x8c04053e, 0x05020015, 0x0509f82a, 0x05020003, - 0x640b4407, 0x0501f017, 0x492fc857, 0x4a025c05, - 0x00008000, 0x497a5a05, 0x497a5806, 0x052dfb29, - 0x05020003, 0x640f4407, 0x0501f00e, 0x4a01d808, - 0x00101d71, 0x5c028800, 0x5c026000, 0x5c026800, - 0x5c025800, 0x1c01f000, 0x640b4209, 0x5c028800, - 0x5c026000, 0x5c026800, 0x5c025800, 0x05fdf65c, + 0x00007cff, 0x05021004, 0x0535fd91, 0x05000007, + 0x80081000, 0x44101800, 0x800811c0, 0x05fc06da, + 0x64030000, 0x05fdf6d8, 0x64030000, 0x64134407, + 0x05fdf717, 0x59a01a0b, 0x59a00407, 0x900c19c0, + 0x800c1d40, 0x41781000, 0x820c0580, 0x00007c00, + 0x0500000a, 0x820c0480, 0x00007a00, 0x05001007, + 0x820c0480, 0x00007cff, 0x05021004, 0x0535fd78, + 0x0500000e, 0x80081000, 0x500c0000, 0x82000d00, + 0x0000ffff, 0x48074208, 0x82000d00, 0xffff0000, + 0x900409c0, 0x48074408, 0x800811c0, 0x05fc06ba, + 0x64030000, 0x05fdf6b8, 0x64030000, 0x64134407, + 0x05fdf6f7, 0x4d2c0000, 0x4d340000, 0x4d300000, + 0x4d440000, 0x59a28c07, 0x0001fac4, 0x05000006, 0x5c028800, 0x5c026000, 0x5c026800, 0x5c025800, - 0x05fdf699, 0x492fc857, 0x4933c857, 0x497a6020, - 0x592c0006, 0x82000580, 0x01000000, 0x05020003, - 0x64134407, 0x05fdf690, 0x4d2c0000, 0x912e5c07, - 0x592c0000, 0x82000580, 0x02000000, 0x05020011, - 0x4803c856, 0x64134209, 0x592c0804, 0x82040500, - 0x0000ffff, 0x48034409, 0x80040920, 0x4807420a, - 0x592c0805, 0x82040500, 0x0000ffff, 0x4803440a, - 0x80040920, 0x4807420b, 0x5c025800, 0x05fdf638, - 0x4803c856, 0x64174209, 0x592c0801, 0x82040500, - 0x0000ffff, 0x48034409, 0x80040920, 0x4807420a, - 0x05fdf7f6, 0x4937c857, 0x4823c857, 0x5934000f, - 0x80001d40, 0x05000005, 0x580c0006, 0x80200580, - 0x05020003, 0x81780000, 0x1c01f000, 0x580c0000, - 0x05fdf7f8, 0x4823c857, 0x4d2c0000, 0x42026000, - 0x0010cca4, 0x59300407, 0x90000d83, 0x05000003, - 0x90000d86, 0x05020007, 0x59325809, 0x812e59c0, - 0x05000004, 0x592c0006, 0x80200580, 0x05000009, - 0x91326424, 0x59a8000b, 0x81300480, 0x05fc17f2, - 0x417a6000, 0x80000580, 0x5c025800, 0x1c01f000, - 0x90000541, 0x5c025800, 0x1c01f000, 0x83a00580, - 0x00109410, 0x05fe063c, 0x64030000, 0x4a034207, - 0x00004000, 0x4a03c011, 0x40000010, 0x05fdfe67, - 0x59e00017, 0x8c00050a, 0x60000800, 0x0002088c, - 0x8d0c0530, 0x05fa09a4, 0x0002098c, 0x6403c017, - 0x4203e000, 0x30000001, 0x4203e000, 0x40000000, - 0x4203e000, 0xb0100000, 0x41fc0000, 0x8c00050a, - 0x05fc07fc, 0x0535fbd8, 0x05fc07ff, 0x59800802, - 0x8c040520, 0x05020003, 0x64030000, 0x05fdf7f5, - 0x60101020, 0x50080000, 0x8400054c, 0x44001000, - 0x64030000, 0x0501f000, 0x59a00c07, 0x800409c0, - 0x05000005, 0x916c0580, 0x05000003, 0x646b4407, - 0x05fdf61d, 0x42007000, 0x00109471, 0x58381c01, - 0x58382201, 0x58383202, 0x8c040500, 0x0500000b, - 0x59a01208, 0x82080500, 0x0000f003, 0x05fe0616, - 0x82080480, 0x00000841, 0x05fe1613, 0x82080480, - 0x00000100, 0x05fc1610, 0x40040000, 0x800c0540, - 0x90000528, 0x900005a8, 0x05fc060b, 0x8c04050a, - 0x05000006, 0x59a03c08, 0x901c0486, 0x05fe1606, - 0x901c0481, 0x05fc1604, 0x8c040506, 0x05000003, - 0x4a01a8e4, 0x0000c000, 0x8c040504, 0x05000004, - 0x59e00002, 0x8400056e, 0x4803c002, 0x8c040502, - 0x05000004, 0x600028ec, 0x4a002805, 0xd0000000, - 0x40040000, 0x800c0540, 0x48007401, 0x8c040500, - 0x05000002, 0x48087201, 0x8c04050a, 0x0500001a, - 0x481c7202, 0x4c0c0000, 0x4c100000, 0x4c180000, - 0x0519fb0f, 0x4df00000, 0x58383a02, 0x481fc857, - 0x41780000, 0x801c3840, 0x800010c8, 0x82081400, - 0x0000b037, 0x64001002, 0x801c1c80, 0x05021002, - 0x64081002, 0x80000000, 0x90001c85, 0x05fc17f7, - 0x5c03e000, 0x05180aea, 0x5c003000, 0x5c002000, - 0x5c001800, 0x480f4407, 0x48134208, 0x481b4408, - 0x05fdf58b, 0x4d440000, 0x4d340000, 0x59a28c07, - 0x0001fac4, 0x05020007, 0x050dfe06, 0x05000008, - 0x64274407, 0x5c026800, 0x5c028800, 0x05fdf5c2, - 0x5c026800, 0x5c028800, 0x05fdf5c3, 0x59a01208, - 0x59a01c08, 0x5934400a, 0x82203d00, 0x0000e000, - 0x801c391a, 0x8c080500, 0x0500001a, 0x900c0d07, - 0x90040580, 0x0500000b, 0x90040581, 0x05000009, - 0x90040583, 0x05000007, 0x90040584, 0x05000005, - 0x90040593, 0x05000003, 0x4937c857, 0x60100800, - 0x82204500, 0xffff1fff, 0x800400da, 0x80200540, - 0x4802680a, 0x4c080000, 0x4c1c0000, 0x0519facc, - 0x0511f82b, 0x0519fab6, 0x5c003800, 0x5c001000, - 0x481f4408, 0x5934400a, 0x82203d00, 0x0f000000, - 0x801c3930, 0x8c080504, 0x05020011, 0x8c080502, - 0x0500000b, 0x4823c857, 0x82204500, 0xf0ffffff, - 0x59a01a09, 0x900c0d0f, 0x800400f0, 0x8400056e, - 0x80200540, 0x4802680a, 0x4803c857, 0x481f4209, - 0x5c026800, 0x5c028800, 0x05fdf545, 0x82204500, - 0xf07fffff, 0x4822680a, 0x05fdf7f9, 0x8d0c050e, - 0x05000003, 0x64074407, 0x05fdf57f, 0x916c0583, - 0x0502000f, 0x59a8000f, 0x497b4407, 0x0511fa4f, - 0x0500000e, 0x82000d00, 0x00ffff00, 0x0502000b, - 0x82000c00, 0x00101a21, 0x50040800, 0x80040910, - 0x82041580, 0x00000080, 0x05020003, 0x641f4407, - 0x05fdf56d, 0x48074407, 0x82000d00, 0x0000ffff, - 0x48074208, 0x80000120, 0x48034408, 0x59a8021b, - 0x82001500, 0x00002100, 0x480b440a, 0x8c000502, - 0x05000016, 0x8c000506, 0x05000006, 0x90000d0a, - 0x90040d8a, 0x05020003, 0x6407420a, 0x0501f018, - 0x8c00050a, 0x05000006, 0x90000d22, 0x90040da2, - 0x05020003, 0x640f420a, 0x0501f011, 0x8c000508, - 0x05000006, 0x90000d12, 0x90040d92, 0x05020003, - 0x640b420a, 0x0501f00a, 0x0511fa20, 0x05020003, - 0x6413420a, 0x05fdf506, 0x8c000506, 0x05000003, - 0x64174407, 0x05fdf544, 0x6403420a, 0x05fdf500, - 0x59a8002a, 0x48034408, 0x59a8002b, 0x4803420a, - 0x05fdf4fb, 0x42007800, 0x00109885, 0x59a00407, - 0x4803c857, 0x90000c8a, 0x05fe153b, 0x0c01f001, - 0x00101f46, 0x00101ee6, 0x00101ef3, 0x00101f03, - 0x00101f22, 0x00101f47, 0x00101edf, 0x00101edf, - 0x00101f53, 0x00101f8e, 0x00101ee0, 0x05fdf52e, - 0x59a00208, 0x48007c01, 0x59a00408, 0x48007a01, - 0x05f1fbb5, 0x0501f061, 0x916c0580, 0x05fc0522, - 0x59a00a08, 0x59a00408, 0x900001c0, 0x80040d40, - 0x4807c857, 0x59a00a09, 0x59a00409, 0x900001c0, - 0x80040d40, 0x4807c857, 0x0501f054, 0x916c0580, - 0x05fc0515, 0x59a00408, 0x59a01208, 0x900001c0, - 0x80081540, 0x59a00409, 0x59a01a09, 0x900001c0, - 0x800c1d40, 0x42000000, 0x00109c5b, 0x480fc857, - 0x480bc857, 0x60000820, 0x0505f6a0, 0x59a00a08, - 0x59a00408, 0x900001c0, 0x80041d40, 0x820c0c80, - 0x00108a8f, 0x05fe1504, 0x820c0c80, 0x00100000, - 0x05fc1501, 0x480fc857, 0x903c7c22, 0x503c0800, - 0x800409c0, 0x05000005, 0x903c05a6, 0x05fc04fa, - 0x803c7800, 0x05fdf7fa, 0x59e41001, 0x82080d00, - 0xfffeffcf, 0x4807c801, 0x440c7800, 0x46001800, - 0x0201f800, 0x800c1800, 0x46001800, 0x001001d7, - 0x480bc801, 0x0501f025, 0x59a01a08, 0x59a00408, - 0x900001c0, 0x800c1d40, 0x480c7803, 0x59a02209, - 0x59a00409, 0x900001c0, 0x80102540, 0x48107804, - 0x59a0020a, 0x40001000, 0x48007807, 0x80000040, - 0x05fc14dd, 0x48007808, 0x60000880, 0x0519f831, - 0x80000540, 0x05000002, 0x05fdf4d7, 0x40040000, - 0x800c1c00, 0x05fc14d4, 0x4800780a, 0x480c7805, - 0x48107806, 0x4978780c, 0x59a0040a, 0x800000c4, - 0x4800780b, 0x59e40001, 0x4803c857, 0x82000540, - 0x00040000, 0x4803c801, 0x05fdf481, 0x49787803, - 0x49787804, 0x49787808, 0x49787807, 0x49787803, - 0x49787805, 0x49787806, 0x4978780c, 0x4978780b, - 0x59e40001, 0x84000524, 0x05fdf7f3, 0x4978781f, - 0x49787814, 0x49787815, 0x4978781d, 0x49787817, - 0x49787818, 0x59a01a08, 0x59a00408, 0x900001c0, - 0x800c1d40, 0x480c780e, 0x480c7819, 0x480c781b, + 0x05fdf6ef, 0x4937c857, 0x59a04408, 0x59a00208, + 0x900001c0, 0x80204540, 0x4823c857, 0x0501f877, + 0x05000008, 0x64074209, 0x4a034407, 0x0000ffff, + 0x4a034208, 0x0000ffff, 0x497b4408, 0x0501f03d, + 0x497b4407, 0x0501f879, 0x0500003f, 0x59300402, + 0x48034407, 0x59300202, 0x48034208, 0x59300006, + 0x48034408, 0x59a0020c, 0x8c000500, 0x05000030, + 0x4933c857, 0x050dff20, 0x05000003, 0x64274407, + 0x0501f031, 0x8d0c050e, 0x05000003, 0x64074407, + 0x0501f02d, 0x916c0583, 0x05000003, 0x641f4407, + 0x0501f029, 0x59340200, 0x8c00050e, 0x05000003, + 0x64834407, 0x0501f024, 0x59300407, 0x90000d83, + 0x05020007, 0x59300804, 0x9004051f, 0x90000584, + 0x05020003, 0x8c04053e, 0x05020015, 0x0509f829, + 0x05020003, 0x640b4407, 0x0501f017, 0x492fc857, + 0x4a025c05, 0x00008000, 0x497a5a05, 0x497a5806, + 0x052dfbba, 0x05020003, 0x640f4407, 0x0501f00e, + 0x4a01d808, 0x00101d76, 0x5c028800, 0x5c026000, + 0x5c026800, 0x5c025800, 0x1c01f000, 0x640b4209, + 0x5c028800, 0x5c026000, 0x5c026800, 0x5c025800, + 0x05fdf659, 0x5c028800, 0x5c026000, 0x5c026800, + 0x5c025800, 0x05fdf696, 0x492fc857, 0x4933c857, + 0x497a6020, 0x592c0006, 0x82000580, 0x01000000, + 0x05020003, 0x64134407, 0x05fdf68d, 0x4d2c0000, + 0x912e5c07, 0x592c0000, 0x82000580, 0x02000000, + 0x05020011, 0x4803c856, 0x64134209, 0x592c0804, + 0x82040500, 0x0000ffff, 0x48034409, 0x80040920, + 0x4807420a, 0x592c0805, 0x82040500, 0x0000ffff, + 0x4803440a, 0x80040920, 0x4807420b, 0x5c025800, + 0x05fdf635, 0x4803c856, 0x64174209, 0x592c0801, + 0x82040500, 0x0000ffff, 0x48034409, 0x80040920, + 0x4807420a, 0x05fdf7f6, 0x4937c857, 0x4823c857, + 0x5934000f, 0x80001d40, 0x05000005, 0x580c0006, + 0x80200580, 0x05020003, 0x81780000, 0x1c01f000, + 0x580c0000, 0x05fdf7f8, 0x4823c857, 0x4d2c0000, + 0x42026000, 0x0010ccb4, 0x59300407, 0x90000d83, + 0x05000003, 0x90000d86, 0x05020007, 0x59325809, + 0x812e59c0, 0x05000004, 0x592c0006, 0x80200580, + 0x05000009, 0x91326424, 0x59a8000b, 0x81300480, + 0x05fc17f2, 0x417a6000, 0x80000580, 0x5c025800, + 0x1c01f000, 0x90000541, 0x5c025800, 0x1c01f000, + 0x83a00580, 0x00109490, 0x05fe0639, 0x64030000, + 0x4a034207, 0x00004000, 0x4a03c011, 0x40000010, + 0x05fdfe64, 0x59e00017, 0x8c00050a, 0x60000800, + 0x0002088c, 0x8d0c0530, 0x05fa099d, 0x0002098c, + 0x6403c017, 0x4203e000, 0x30000001, 0x4203e000, + 0x40000000, 0x4203e000, 0xb0100000, 0x41fc0000, + 0x8c00050a, 0x05fc07fc, 0x0535fc9d, 0x05fc07ff, + 0x59800802, 0x8c040520, 0x05020003, 0x64030000, + 0x05fdf7f5, 0x60101020, 0x50080000, 0x8400054c, + 0x44001000, 0x64030000, 0x0501f000, 0x59a00c07, + 0x800409c0, 0x05000005, 0x916c0580, 0x05000003, + 0x646b4407, 0x05fdf61a, 0x42007000, 0x001094f1, + 0x58381c01, 0x58382201, 0x58383202, 0x8c040500, + 0x0500000b, 0x59a01208, 0x82080500, 0x0000f003, + 0x05fe0613, 0x82080480, 0x00000841, 0x05fe1610, + 0x82080480, 0x00000100, 0x05fc160d, 0x40040000, + 0x800c0540, 0x90000528, 0x900005a8, 0x05fc0608, + 0x8c04050a, 0x05000006, 0x59a03c08, 0x901c0486, + 0x05fe1603, 0x901c0481, 0x05fc1601, 0x8c040506, + 0x05000003, 0x4a01a8e4, 0x0000c000, 0x8c040504, + 0x05000004, 0x59e00002, 0x8400056e, 0x4803c002, + 0x8c040502, 0x05000004, 0x600028ec, 0x4a002805, + 0xd0000000, 0x40040000, 0x800c0540, 0x48007401, + 0x8c040500, 0x05000002, 0x48087201, 0x8c04050a, + 0x0500001a, 0x481c7202, 0x4c0c0000, 0x4c100000, + 0x4c180000, 0x0519fb96, 0x4df00000, 0x58383a02, + 0x481fc857, 0x41780000, 0x801c3840, 0x800010c8, + 0x82081400, 0x0000b037, 0x64001002, 0x801c1c80, + 0x05021002, 0x64081002, 0x80000000, 0x90001c85, + 0x05fc17f7, 0x5c03e000, 0x05180b71, 0x5c003000, + 0x5c002000, 0x5c001800, 0x480f4407, 0x48134208, + 0x481b4408, 0x05fdf588, 0x4d440000, 0x4d340000, + 0x59a28c07, 0x0001fac4, 0x05020007, 0x050dfe16, + 0x05000008, 0x64274407, 0x5c026800, 0x5c028800, + 0x05fdf5bf, 0x5c026800, 0x5c028800, 0x05fdf5c0, + 0x59a01208, 0x59a01c08, 0x5934400a, 0x82203d00, + 0x0000e000, 0x801c391a, 0x8c080500, 0x0500001a, + 0x900c0d07, 0x90040580, 0x0500000b, 0x90040581, + 0x05000009, 0x90040583, 0x05000007, 0x90040584, + 0x05000005, 0x90040593, 0x05000003, 0x4937c857, + 0x60100800, 0x82204500, 0xffff1fff, 0x800400da, + 0x80200540, 0x4802680a, 0x4c080000, 0x4c1c0000, + 0x0519fb53, 0x0511f83e, 0x0519fb3d, 0x5c003800, + 0x5c001000, 0x481f4408, 0x5934400a, 0x82203d00, + 0x0f000000, 0x801c3930, 0x8c080504, 0x05020011, + 0x8c080502, 0x0500000b, 0x4823c857, 0x82204500, + 0xf0ffffff, 0x59a01a09, 0x900c0d0f, 0x800400f0, + 0x8400056e, 0x80200540, 0x4802680a, 0x4803c857, + 0x481f4209, 0x5c026800, 0x5c028800, 0x05fdf542, + 0x82204500, 0xf07fffff, 0x4822680a, 0x05fdf7f9, + 0x8d0c050e, 0x05000003, 0x64074407, 0x05fdf57c, + 0x916c0583, 0x0502000f, 0x59a8000f, 0x497b4407, + 0x0511fa80, 0x0500000e, 0x82000d00, 0x00ffff00, + 0x0502000b, 0x82000c00, 0x00101a23, 0x50040800, + 0x80040910, 0x82041580, 0x00000080, 0x05020003, + 0x641f4407, 0x05fdf56a, 0x48074407, 0x82000d00, + 0x0000ffff, 0x48074208, 0x80000120, 0x48034408, + 0x59a8021b, 0x82001500, 0x00002100, 0x480b440a, + 0x8c000502, 0x05000016, 0x8c000506, 0x05000006, + 0x90000d0a, 0x90040d8a, 0x05020003, 0x6407420a, + 0x0501f018, 0x8c00050a, 0x05000006, 0x90000d22, + 0x90040da2, 0x05020003, 0x640f420a, 0x0501f011, + 0x8c000508, 0x05000006, 0x90000d12, 0x90040d92, + 0x05020003, 0x640b420a, 0x0501f00a, 0x0511fa51, + 0x05020003, 0x6413420a, 0x05fdf503, 0x8c000506, + 0x05000003, 0x64174407, 0x05fdf541, 0x6403420a, + 0x05fdf4fd, 0x59a8002a, 0x48034408, 0x59a8002b, + 0x4803420a, 0x05fdf4f8, 0x42007800, 0x00109905, + 0x59a00407, 0x4803c857, 0x90000c8a, 0x05fe1538, + 0x0c01f001, 0x00101f4b, 0x00101eeb, 0x00101ef8, + 0x00101f08, 0x00101f27, 0x00101f4c, 0x00101ee4, + 0x00101ee4, 0x00101f58, 0x00101f93, 0x00101ee5, + 0x05fdf52b, 0x59a00208, 0x48007c01, 0x59a00408, + 0x48007a01, 0x05f1fbb0, 0x0501f061, 0x916c0580, + 0x05fc051f, 0x59a00a08, 0x59a00408, 0x900001c0, + 0x80040d40, 0x4807c857, 0x59a00a09, 0x59a00409, + 0x900001c0, 0x80040d40, 0x4807c857, 0x0501f054, + 0x916c0580, 0x05fc0512, 0x59a00408, 0x59a01208, + 0x900001c0, 0x80081540, 0x59a00409, 0x59a01a09, + 0x900001c0, 0x800c1d40, 0x42000000, 0x00109cdb, + 0x480fc857, 0x480bc857, 0x60000820, 0x0505f69f, + 0x59a00a08, 0x59a00408, 0x900001c0, 0x80041d40, + 0x820c0c80, 0x00108b5c, 0x05fe1501, 0x820c0c80, + 0x00100000, 0x05fc14fe, 0x480fc857, 0x903c7c22, + 0x503c0800, 0x800409c0, 0x05000005, 0x903c05a6, + 0x05fc04f7, 0x803c7800, 0x05fdf7fa, 0x59e41001, + 0x82080d00, 0xfffeffcf, 0x4807c801, 0x440c7800, + 0x46001800, 0x0201f800, 0x800c1800, 0x46001800, + 0x001001d7, 0x480bc801, 0x0501f025, 0x59a01a08, + 0x59a00408, 0x900001c0, 0x800c1d40, 0x480c7803, 0x59a02209, 0x59a00409, 0x900001c0, 0x80102540, - 0x4810780f, 0x4810781a, 0x4810781c, 0x59a0020a, - 0x80000540, 0x05fc04a4, 0x48007813, 0x60000808, - 0x40001000, 0x0515fff7, 0x80000540, 0x05fe049e, - 0x40040000, 0x800c1c00, 0x05fc149b, 0x480c7810, - 0x48107811, 0x4a03420a, 0x00000400, 0x59a0040a, - 0x4800781e, 0x850e1d6a, 0x59a0040b, 0x48007a12, - 0x59a0020c, 0x48007c12, 0x600c0000, 0x05f1faf5, - 0x80102000, 0x4810780d, 0x48134209, 0x901021c0, - 0x48134409, 0x59e40052, 0x4803c857, 0x4a007816, - 0x00000400, 0x903c0416, 0x48034208, 0x900001c0, - 0x48034408, 0x05fdf43a, 0x583c0800, 0x830e1d00, - 0xffcfffff, 0x48ec7820, 0x4a01d802, 0x00000100, - 0x583c0017, 0x82000500, 0x000000ff, 0x05020008, - 0x4807c857, 0x8c040502, 0x05000004, 0x84040d48, - 0x48047800, 0x1c01f000, 0x0501f003, 0x05f5fe6e, - 0x1c01f000, 0x42007800, 0x00109885, 0x583dd820, - 0x58ef400a, 0x40ec6000, 0x583c0000, 0x48efc857, - 0x49a3c857, 0x4803c857, 0x82000500, 0x0000ffc0, - 0x48007800, 0x583c001d, 0x4803c857, 0x583c0819, - 0x4807c857, 0x48074208, 0x900409c0, 0x48074408, - 0x583c081a, 0x48074209, 0x900409c0, 0x48074409, - 0x583c081b, 0x4807420a, 0x900409c0, 0x4807440a, - 0x583c081c, 0x4807420b, 0x900409c0, 0x4807440b, - 0x49787818, 0x583c0017, 0x49787817, 0x82000500, - 0x000000ff, 0x05fe03fb, 0x05fdf401, 0x59a80005, - 0x48034407, 0x59a80006, 0x48034208, 0x59a80007, - 0x48034408, 0x05fdf3fa, 0x05f1fa18, 0x4803c856, - 0x59a0020c, 0x4803c857, 0x8c00051e, 0x05060751, - 0x05f9ffe0, 0x05000003, 0x05f9ffc2, 0x05000003, - 0x648b4407, 0x05fdf430, 0x4a03c013, 0x03800300, - 0x4a03c014, 0x03800380, 0x59a00c07, 0x82040580, - 0x000000a0, 0x05000004, 0x82040580, 0x000000a2, - 0x0502001c, 0x59a0140b, 0x82080480, 0x00000100, - 0x05021018, 0x59a0020c, 0x8c000500, 0x0502001f, - 0x59a00a0b, 0x800409c0, 0x05000012, 0xb0040481, - 0x05021010, 0x0505fd8b, 0x0500000a, 0x59a01008, - 0x900811c0, 0x59a0180a, 0x900c19c0, 0x59a00a0b, - 0x0505fda6, 0x4a01d808, 0x00102003, 0x1c01f000, - 0x640b4407, 0x4a03c014, 0x03800000, 0x05fdf40a, - 0x4a03c014, 0x03800000, 0x05fdf40b, 0x4031d800, - 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, - 0x00000200, 0x05fc03f8, 0x59a00c07, 0x59a0140b, - 0x59a0020c, 0x8c000500, 0x05020038, 0x912e5c05, - 0x4178c000, 0x59a0ba0b, 0x40600000, 0x812c0400, - 0x5000c800, 0x82641d00, 0x000000ff, 0x4c040000, - 0x4c080000, 0x0501f8b8, 0x5c001000, 0x5c000800, - 0x05000037, 0x805cb840, 0x05000032, 0x80081000, - 0x82641d00, 0x0000ff00, 0x800c1910, 0x4c040000, - 0x4c080000, 0x0501f8ac, 0x5c001000, 0x5c000800, - 0x0500002b, 0x805cb840, 0x05000026, 0x80081000, - 0x82641d00, 0x00ff0000, 0x800c1920, 0x4c040000, - 0x4c080000, 0x0501f8a0, 0x5c001000, 0x5c000800, - 0x0500001f, 0x805cb840, 0x0500001a, 0x80081000, - 0x82641d00, 0xff000000, 0x800c1930, 0x4c040000, - 0x4c080000, 0x0501f894, 0x5c001000, 0x5c000800, - 0x05000013, 0x805cb840, 0x0500000e, 0x80081000, - 0x8060c000, 0x05fdf7cd, 0x59a0020b, 0x82000500, - 0x000000ff, 0x40001800, 0x4c040000, 0x4c080000, - 0x0501f885, 0x5c001000, 0x5c000800, 0x05000004, - 0x4a03c014, 0x03800000, 0x05fdf375, 0x4a03c014, - 0x03800000, 0x64134407, 0x05fdf3b3, 0x4803c856, - 0x59a0020c, 0x4803c857, 0x8c00051e, 0x05060691, - 0x05f9ff58, 0x05000003, 0x05f9ff3a, 0x05000003, - 0x648b4407, 0x05fdf3a8, 0x4a03c013, 0x03800300, - 0x4a03c014, 0x03800380, 0x59a00c07, 0x82040580, - 0x000000a0, 0x05000004, 0x82040580, 0x000000a2, - 0x05020062, 0x59a0140b, 0x82080480, 0x00000100, - 0x0502105e, 0x59a0020c, 0x8c000500, 0x05020050, - 0x59a01a0b, 0x800c19c0, 0x05000058, 0xb00c0481, - 0x05021056, 0x0505fd03, 0x05020006, 0x640b4407, - 0x4a03c014, 0x03800000, 0x4803c857, 0x05fdf38a, - 0x912e5c05, 0x4178c000, 0x59a0ba0b, 0x4803c857, - 0x40600000, 0x812c0400, 0x4000c800, 0x4c040000, - 0x4c080000, 0x0501f879, 0x5c001000, 0x5c000800, - 0x0500003e, 0x4414c800, 0x805cb840, 0x0500002b, - 0x80081000, 0x4c040000, 0x4c080000, 0x0501f86f, - 0x5c001000, 0x5c000800, 0x05000034, 0x50640000, - 0x801428d0, 0x80140540, 0x4400c800, 0x805cb840, - 0x0500001e, 0x80081000, 0x4c040000, 0x4c080000, - 0x0501f862, 0x5c001000, 0x5c000800, 0x05000027, - 0x50640000, 0x801428e0, 0x80140540, 0x4400c800, - 0x805cb840, 0x05000011, 0x80081000, 0x4c040000, - 0x4c080000, 0x0501f855, 0x5c001000, 0x5c000800, - 0x0500001a, 0x50640000, 0x801428f0, 0x80140540, - 0x4400c800, 0x805cb840, 0x05000004, 0x80081000, - 0x8060c000, 0x05fdf7ca, 0x59a00a0b, 0x59a01008, - 0x900811c0, 0x59a0180a, 0x900c19c0, 0x4a03c014, - 0x03800000, 0x412c0000, 0x0505f4de, 0x4803c857, - 0x0501f83e, 0x05000005, 0x48174407, 0x4a03c014, - 0x03800000, 0x05fdf2fe, 0x4a03c014, 0x03800000, - 0x64134407, 0x05fdf33c, 0x4a03c014, 0x03800000, - 0x05fdf33d, 0x4c5c0000, 0x4c600000, 0x4c640000, - 0x4004b800, 0x4008c000, 0x400cc800, 0x0501f86d, - 0x0500000f, 0x0501f89b, 0x05020011, 0x4060b800, - 0x0501f898, 0x0502000e, 0x4064b800, 0x0501f895, - 0x0502000b, 0x0501f883, 0x4ce80000, 0x6021d027, - 0x0515fddf, 0x5c01d000, 0x90000541, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x0501f879, - 0x80000580, 0x05fdf7fa, 0x4c5c0000, 0x485fc857, - 0x0501f854, 0x05000008, 0x905cbd41, 0x0501f881, - 0x05020009, 0x0501f8bd, 0x0501f8ef, 0x0501f86d, - 0x90000541, 0x4803c857, 0x4867c857, 0x5c00b800, - 0x1c01f000, 0x0501f867, 0x80000580, 0x4803c857, - 0x485fc857, 0x05fdf7f8, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x4807c857, 0x480bc857, 0x4004b800, - 0x4008c000, 0x0501f83b, 0x0500000c, 0x0501f869, - 0x0502000f, 0x4c5c0000, 0x4060b800, 0x0501f865, - 0x5c00b800, 0x0502000a, 0x05fdffdc, 0x05000003, - 0x0501f850, 0x90000541, 0x40642800, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x0501f849, - 0x80000580, 0x4803c857, 0x4867c857, 0x05fdf7f7, - 0x4ce80000, 0x4c580000, 0x4803c856, 0x6030b000, - 0x6029d000, 0x0515fd9e, 0x4a03c013, 0x02000200, - 0x6029d000, 0x0515fd9a, 0x4a03c013, 0x02000000, - 0x8058b040, 0x05fe07f7, 0x61a00807, 0x4a03c013, - 0x03800300, 0x80040840, 0x0500000f, 0x4a03c014, - 0x03800000, 0x59e00013, 0x4a03c014, 0x03800380, - 0x82000500, 0x00000300, 0x82000580, 0x00000300, - 0x05fe07f3, 0x90000541, 0x5c00b000, 0x5c01d000, - 0x1c01f000, 0x4803c857, 0x80000580, 0x05fdf7fb, - 0x4ce80000, 0x4803c856, 0x61a00807, 0x4a03c013, - 0x03800300, 0x80040840, 0x05000016, 0x4a03c014, - 0x03800000, 0x59e00013, 0x4a03c014, 0x03800380, - 0x82000500, 0x00000300, 0x82000580, 0x00000300, - 0x05fe07f3, 0x6029d000, 0x0515fd6d, 0x4a03c013, - 0x01000000, 0x6029d000, 0x0515fd69, 0x4a03c013, - 0x02000000, 0x90000541, 0x5c01d000, 0x1c01f000, - 0x4803c857, 0x05fdffbf, 0x05fe07f3, 0x05fdf7fb, - 0x4803c856, 0x4a03c013, 0x01000000, 0x4ce80000, - 0x6029d000, 0x0515fd5a, 0x5c01d000, 0x4a03c013, - 0x02000200, 0x4ce80000, 0x6029d000, 0x0515fd54, - 0x5c01d000, 0x4a03c013, 0x01000100, 0x1c01f000, - 0x4c5c0000, 0x4c600000, 0x485fc857, 0x6020c000, - 0x825c0500, 0x00000080, 0x800000c2, 0x82000540, - 0x01000000, 0x4803c013, 0x4ce80000, 0x6029d000, - 0x0515fd43, 0x5c01d000, 0x4a03c013, 0x02000200, - 0x4ce80000, 0x6029d000, 0x0515fd3d, 0x5c01d000, - 0x4a03c013, 0x02000000, 0x805cb8c2, 0x8060c040, - 0x05fe07ec, 0x4a03c013, 0x01000100, 0x4ce80000, - 0x6029d000, 0x0515fd32, 0x5c01d000, 0x4a03c013, - 0x02000200, 0x4ce80000, 0x6029d000, 0x0515fd2c, - 0x5c01d000, 0x4a03c014, 0x03800000, 0x61a00807, - 0x59e0b813, 0x825cbd00, 0x00000100, 0x80040840, - 0x05000004, 0x405c0000, 0x80000540, 0x05fe07f9, - 0x4a03c014, 0x03800380, 0x4a03c013, 0x02000000, - 0x4ce80000, 0x6029d000, 0x0515fd19, 0x5c01d000, - 0x485fc857, 0x405c0000, 0x80000540, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x4c600000, 0x4803c856, - 0x4a03c013, 0x01000100, 0x6020c000, 0x61a0c807, - 0x4ce80000, 0x6029d000, 0x0515fd09, 0x5c01d000, - 0x4a03c013, 0x02000200, 0x4a03c014, 0x03800000, - 0x59e00013, 0x4a03c014, 0x03800380, 0x82000500, - 0x00000200, 0x05020003, 0x8064c840, 0x05fe07f7, - 0x4178c800, 0x0501f007, 0x4ce80000, 0x6029d000, - 0x0515fcf7, 0x5c01d000, 0x4a03c013, 0x02000200, - 0x4ce80000, 0x6029d000, 0x0515fcf1, 0x5c01d000, + 0x48107804, 0x59a0020a, 0x40001000, 0x48007807, + 0x80000040, 0x05fc14da, 0x48007808, 0x60000880, + 0x0519f8b8, 0x80000540, 0x05000002, 0x05fdf4d4, + 0x40040000, 0x800c1c00, 0x05fc14d1, 0x4800780a, + 0x480c7805, 0x48107806, 0x4978780c, 0x59a0040a, + 0x800000c4, 0x4800780b, 0x59e40001, 0x4803c857, + 0x82000540, 0x00040000, 0x4803c801, 0x05fdf47e, + 0x49787803, 0x49787804, 0x49787808, 0x49787807, + 0x49787803, 0x49787805, 0x49787806, 0x4978780c, + 0x4978780b, 0x59e40001, 0x84000524, 0x05fdf7f3, + 0x4978781f, 0x49787814, 0x49787815, 0x4978781d, + 0x49787817, 0x49787818, 0x59a01a08, 0x59a00408, + 0x900001c0, 0x800c1d40, 0x480c780e, 0x480c7819, + 0x480c781b, 0x59a02209, 0x59a00409, 0x900001c0, + 0x80102540, 0x4810780f, 0x4810781a, 0x4810781c, + 0x59a0020a, 0x80000540, 0x05fc04a1, 0x48007813, + 0x60000808, 0x40001000, 0x0519f87e, 0x80000540, + 0x05fe049b, 0x40040000, 0x800c1c00, 0x05fc1498, + 0x480c7810, 0x48107811, 0x4a03420a, 0x00000400, + 0x59a0040a, 0x4800781e, 0x850e1d6a, 0x59a0040b, + 0x48007a12, 0x59a0020c, 0x48007c12, 0x600c0000, + 0x05f1faf0, 0x80102000, 0x4810780d, 0x48134209, + 0x901021c0, 0x48134409, 0x59e40052, 0x4803c857, + 0x4a007816, 0x00000400, 0x903c0416, 0x48034208, + 0x900001c0, 0x48034408, 0x05fdf437, 0x583c0800, + 0x830e1d00, 0xffcfffff, 0x48ec7820, 0x4a01d802, + 0x00000100, 0x583c0017, 0x82000500, 0x000000ff, + 0x05020008, 0x4807c857, 0x8c040502, 0x05000004, + 0x84040d48, 0x48047800, 0x1c01f000, 0x0501f003, + 0x05f5fe69, 0x1c01f000, 0x42007800, 0x00109905, + 0x583dd820, 0x58ef400a, 0x40ec6000, 0x583c0000, + 0x48efc857, 0x49a3c857, 0x4803c857, 0x82000500, + 0x0000ffc0, 0x48007800, 0x583c001d, 0x4803c857, + 0x583c0819, 0x4807c857, 0x48074208, 0x900409c0, + 0x48074408, 0x583c081a, 0x48074209, 0x900409c0, + 0x48074409, 0x583c081b, 0x4807420a, 0x900409c0, + 0x4807440a, 0x583c081c, 0x4807420b, 0x900409c0, + 0x4807440b, 0x49787818, 0x583c0017, 0x49787817, + 0x82000500, 0x000000ff, 0x05fe03f8, 0x05fdf3fe, + 0x59a80005, 0x48034407, 0x59a80006, 0x48034208, + 0x59a80007, 0x48034408, 0x05fdf3f7, 0x05f1fa13, + 0x4803c856, 0x59a0020c, 0x4803c857, 0x8c00051e, + 0x05060750, 0x05f9ffd9, 0x05000003, 0x05f9ffbb, + 0x05000003, 0x648b4407, 0x05fdf42d, 0x4a03c013, + 0x03800300, 0x4a03c014, 0x03800380, 0x59a00c07, + 0x82040580, 0x000000a0, 0x05000004, 0x82040580, + 0x000000a2, 0x0502001c, 0x59a0140b, 0x82080480, + 0x00000100, 0x05021018, 0x59a0020c, 0x8c000500, + 0x0502001f, 0x59a00a0b, 0x800409c0, 0x05000012, + 0xb0040481, 0x05021010, 0x0505fd8a, 0x0500000a, + 0x59a01008, 0x900811c0, 0x59a0180a, 0x900c19c0, + 0x59a00a0b, 0x0505fda5, 0x4a01d808, 0x00102008, + 0x1c01f000, 0x640b4407, 0x4a03c014, 0x03800000, + 0x05fdf407, 0x4a03c014, 0x03800000, 0x05fdf408, + 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, + 0x82000580, 0x00000200, 0x05fc03f5, 0x59a00c07, + 0x59a0140b, 0x59a0020c, 0x8c000500, 0x05020038, + 0x912e5c05, 0x4178c000, 0x59a0ba0b, 0x40600000, + 0x812c0400, 0x5000c800, 0x82641d00, 0x000000ff, + 0x4c040000, 0x4c080000, 0x0501f8b8, 0x5c001000, + 0x5c000800, 0x05000037, 0x805cb840, 0x05000032, + 0x80081000, 0x82641d00, 0x0000ff00, 0x800c1910, + 0x4c040000, 0x4c080000, 0x0501f8ac, 0x5c001000, + 0x5c000800, 0x0500002b, 0x805cb840, 0x05000026, + 0x80081000, 0x82641d00, 0x00ff0000, 0x800c1920, + 0x4c040000, 0x4c080000, 0x0501f8a0, 0x5c001000, + 0x5c000800, 0x0500001f, 0x805cb840, 0x0500001a, + 0x80081000, 0x82641d00, 0xff000000, 0x800c1930, + 0x4c040000, 0x4c080000, 0x0501f894, 0x5c001000, + 0x5c000800, 0x05000013, 0x805cb840, 0x0500000e, + 0x80081000, 0x8060c000, 0x05fdf7cd, 0x59a0020b, + 0x82000500, 0x000000ff, 0x40001800, 0x4c040000, + 0x4c080000, 0x0501f885, 0x5c001000, 0x5c000800, + 0x05000004, 0x4a03c014, 0x03800000, 0x05fdf372, + 0x4a03c014, 0x03800000, 0x64134407, 0x05fdf3b0, + 0x4803c856, 0x59a0020c, 0x4803c857, 0x8c00051e, + 0x05060690, 0x05f9ff51, 0x05000003, 0x05f9ff33, + 0x05000003, 0x648b4407, 0x05fdf3a5, 0x4a03c013, + 0x03800300, 0x4a03c014, 0x03800380, 0x59a00c07, + 0x82040580, 0x000000a0, 0x05000004, 0x82040580, + 0x000000a2, 0x05020062, 0x59a0140b, 0x82080480, + 0x00000100, 0x0502105e, 0x59a0020c, 0x8c000500, + 0x05020050, 0x59a01a0b, 0x800c19c0, 0x05000058, + 0xb00c0481, 0x05021056, 0x0505fd02, 0x05020006, + 0x640b4407, 0x4a03c014, 0x03800000, 0x4803c857, + 0x05fdf387, 0x912e5c05, 0x4178c000, 0x59a0ba0b, + 0x4803c857, 0x40600000, 0x812c0400, 0x4000c800, + 0x4c040000, 0x4c080000, 0x0501f879, 0x5c001000, + 0x5c000800, 0x0500003e, 0x4414c800, 0x805cb840, + 0x0500002b, 0x80081000, 0x4c040000, 0x4c080000, + 0x0501f86f, 0x5c001000, 0x5c000800, 0x05000034, + 0x50640000, 0x801428d0, 0x80140540, 0x4400c800, + 0x805cb840, 0x0500001e, 0x80081000, 0x4c040000, + 0x4c080000, 0x0501f862, 0x5c001000, 0x5c000800, + 0x05000027, 0x50640000, 0x801428e0, 0x80140540, + 0x4400c800, 0x805cb840, 0x05000011, 0x80081000, + 0x4c040000, 0x4c080000, 0x0501f855, 0x5c001000, + 0x5c000800, 0x0500001a, 0x50640000, 0x801428f0, + 0x80140540, 0x4400c800, 0x805cb840, 0x05000004, + 0x80081000, 0x8060c000, 0x05fdf7ca, 0x59a00a0b, + 0x59a01008, 0x900811c0, 0x59a0180a, 0x900c19c0, + 0x4a03c014, 0x03800000, 0x412c0000, 0x0505f4dd, + 0x4803c857, 0x0501f83e, 0x05000005, 0x48174407, + 0x4a03c014, 0x03800000, 0x05fdf2fb, 0x4a03c014, + 0x03800000, 0x64134407, 0x05fdf339, 0x4a03c014, + 0x03800000, 0x05fdf33a, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4004b800, 0x4008c000, 0x400cc800, + 0x0501f86d, 0x0500000f, 0x0501f89b, 0x05020011, + 0x4060b800, 0x0501f898, 0x0502000e, 0x4064b800, + 0x0501f895, 0x0502000b, 0x0501f883, 0x4ce80000, + 0x6021d027, 0x0515fe66, 0x5c01d000, 0x90000541, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x0501f879, 0x80000580, 0x05fdf7fa, 0x4c5c0000, + 0x485fc857, 0x0501f854, 0x05000008, 0x905cbd41, + 0x0501f881, 0x05020009, 0x0501f8bd, 0x0501f8ef, + 0x0501f86d, 0x90000541, 0x4803c857, 0x4867c857, + 0x5c00b800, 0x1c01f000, 0x0501f867, 0x80000580, + 0x4803c857, 0x485fc857, 0x05fdf7f8, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x4807c857, 0x480bc857, + 0x4004b800, 0x4008c000, 0x0501f83b, 0x0500000c, + 0x0501f869, 0x0502000f, 0x4c5c0000, 0x4060b800, + 0x0501f865, 0x5c00b800, 0x0502000a, 0x05fdffdc, + 0x05000003, 0x0501f850, 0x90000541, 0x40642800, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x0501f849, 0x80000580, 0x4803c857, 0x4867c857, + 0x05fdf7f7, 0x4ce80000, 0x4c580000, 0x4803c856, + 0x6030b000, 0x6029d000, 0x0515fe25, 0x4a03c013, + 0x02000200, 0x6029d000, 0x0515fe21, 0x4a03c013, + 0x02000000, 0x8058b040, 0x05fe07f7, 0x61a00807, + 0x4a03c013, 0x03800300, 0x80040840, 0x0500000f, 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, - 0x03800380, 0x82000500, 0x00000100, 0x80000110, - 0x8064c8c2, 0x8064cd40, 0x4a03c013, 0x02000000, - 0x8060c040, 0x05fe07e9, 0x4867c857, 0x5c00c000, - 0x1c01f000, 0x4803c856, 0x4a03c013, 0x01000100, - 0x4ce80000, 0x6029d000, 0x0515fcd9, 0x5c01d000, + 0x03800380, 0x82000500, 0x00000300, 0x82000580, + 0x00000300, 0x05fe07f3, 0x90000541, 0x5c00b000, + 0x5c01d000, 0x1c01f000, 0x4803c857, 0x80000580, + 0x05fdf7fb, 0x4ce80000, 0x4803c856, 0x61a00807, + 0x4a03c013, 0x03800300, 0x80040840, 0x05000016, + 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, + 0x03800380, 0x82000500, 0x00000300, 0x82000580, + 0x00000300, 0x05fe07f3, 0x6029d000, 0x0515fdf4, + 0x4a03c013, 0x01000000, 0x6029d000, 0x0515fdf0, + 0x4a03c013, 0x02000000, 0x90000541, 0x5c01d000, + 0x1c01f000, 0x4803c857, 0x05fdffbf, 0x05fe07f3, + 0x05fdf7fb, 0x4803c856, 0x4a03c013, 0x01000000, + 0x4ce80000, 0x6029d000, 0x0515fde1, 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, 0x6029d000, - 0x0515fcd3, 0x5c01d000, 0x4a03c013, 0x02000000, - 0x1c01f000, 0x59a00408, 0x59a8082a, 0x4803502a, - 0x48074408, 0x59a00a0a, 0x90040494, 0x05021002, - 0x6140080f, 0x59a8002b, 0x4807502b, 0x4803420a, - 0x05fdf1c7, 0x59a00407, 0x59a00a08, 0x900409c0, - 0x80040d40, 0x59a00408, 0x59a01209, 0x900811c0, - 0x80081540, 0x59a00409, 0x59a01a0a, 0x900c19c0, - 0x800c1d40, 0x59a0040a, 0x59a0220b, 0x901021c0, - 0x80102540, 0x0531ffcf, 0x05fc01b5, 0x05fdf20a, - 0x916c0580, 0x0500000a, 0x59a80005, 0x59a00c07, - 0x80041580, 0xb0081500, 0x05fc01ad, 0x80080580, - 0x48035005, 0x05f1f9b7, 0x05fdf1a9, 0x59a00407, - 0x59a80805, 0x48035005, 0x80040d80, 0x8c04050c, - 0x05f209b0, 0x59a00208, 0x48035006, 0x59a00408, - 0x8c00051a, 0x05000009, 0x600018ec, 0x60140800, - 0x580c1006, 0x4a001805, 0x70000005, 0x900c1c20, - 0x80040840, 0x05fe07fb, 0x48035007, 0x05fdf194, - 0x8d0c050e, 0x05000003, 0x64074407, 0x05fdf1d2, - 0x050dfea6, 0x05020003, 0x645b4407, 0x05fdf1ce, - 0x916c0583, 0x05000003, 0x641f4407, 0x05fdf1ca, - 0x59a00c07, 0x82040500, 0xffffff00, 0x05fe01ca, - 0x82041580, 0x000000ff, 0x05020007, 0x59a8000f, - 0x82000500, 0x000000ff, 0x82001540, 0x0000ff00, - 0x0501f00f, 0x82040400, 0x00101a21, 0x50000000, - 0x80000110, 0x82000580, 0x00000080, 0x05fc01ba, - 0x59a8000f, 0x82000500, 0x000000ff, 0x80041580, - 0x05fc01b5, 0x840409c0, 0x80041540, 0x051dfbac, - 0x05020003, 0x640f4407, 0x05fdf1ab, 0x48ee6023, - 0x480a621e, 0x4a02641e, 0x0000bc09, 0x64066407, - 0x0505fb18, 0x05020004, 0x0005f8e7, 0x640b4407, - 0x05fdf1a1, 0x497a5a05, 0x497a5806, 0x4a025c05, - 0x00008000, 0x4a01d808, 0x001022b0, 0x492e6009, - 0x60ca7000, 0x0005f105, 0x8d0c050e, 0x05000003, - 0x64074407, 0x05fdf194, 0x050dfe68, 0x05020003, - 0x645b4407, 0x05fdf190, 0x916c0583, 0x05000003, - 0x641f4407, 0x05fdf18c, 0x59a00c07, 0x82040500, - 0xffffff00, 0x05fe018c, 0x82041580, 0x000000ff, - 0x05020007, 0x59a8000f, 0x82000500, 0x000000ff, - 0x82001540, 0x0000ff00, 0x0501f00f, 0x82040400, - 0x00101a21, 0x50000000, 0x80000110, 0x82000580, - 0x00000080, 0x05fc017c, 0x59a8000f, 0x82000500, - 0x000000ff, 0x80041580, 0x05fc0177, 0x840409c0, - 0x80041540, 0x051dfb6e, 0x05020003, 0x640f4407, - 0x05fdf16d, 0x48ee6023, 0x480a621e, 0x4a02641e, - 0x0000bc05, 0x64066407, 0x0505fada, 0x05020004, - 0x0005f8e7, 0x640b4407, 0x05fdf163, 0x497a5a05, - 0x497a5806, 0x4a025c05, 0x00008000, 0x4a01d808, - 0x001022b0, 0x492e6009, 0x60ca7000, 0x0005f105, - 0x592c0006, 0x82000580, 0x01000000, 0x05fe0114, - 0x64134407, 0x05fdf154, 0x497b4407, 0x497b4208, - 0x8d0c0520, 0x05000008, 0x59a8005e, 0x59a8085f, - 0x80040480, 0x59a80860, 0x48074407, 0x80041480, - 0x480b4208, 0x0505fbd1, 0x48034408, 0x59a8100d, - 0x59a80262, 0x80080480, 0x4803420a, 0x495f440a, - 0x59a8001a, 0x4803420c, 0x05fdf0fd, 0x8d0c050e, - 0x05000003, 0x64074407, 0x05fdf13b, 0x59a00407, - 0x8c000500, 0x0502000d, 0x59a80061, 0x81640480, - 0x05001008, 0x59a8000b, 0x81500580, 0x05000007, - 0x59a8005f, 0x59a8105e, 0x80080580, 0x05000003, - 0x64634407, 0x05fdf12c, 0x850e1d58, 0x4803c856, - 0x850e1d46, 0x0505fed1, 0x05fdf0e5, 0x599c0201, - 0x4803507a, 0x41780800, 0x60401076, 0x0515fc99, - 0x480b507b, 0x1c01f000, 0x0501f805, 0x60018800, - 0x05020002, 0x60058800, 0x1c01f000, 0x90000541, - 0x0502500b, 0x4203e000, 0x80000000, 0x40e81000, - 0x41780800, 0x61900000, 0x0515fc8a, 0x5994002e, - 0x80080400, 0x4803282e, 0x80000580, 0x1c01f000, - 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, - 0x4cd80000, 0x417a3000, 0x0519fb09, 0x0515fffe, - 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, - 0x5c032000, 0x1c01f000, 0x59c80003, 0x82000500, - 0xffffe0ff, 0x48039003, 0x61f00800, 0x05f5fd4a, - 0x4a03902c, 0x00200000, 0x61d0b003, 0x59c8002c, - 0x8c00052c, 0x05000006, 0x8058b040, 0x05fe07fc, - 0x600c0080, 0x41781000, 0x0501f11e, 0x640b5081, - 0x42006000, 0x0010244d, 0x50301000, 0x41784800, - 0x4a03902d, 0x00008000, 0x61d0b003, 0x59c8002c, - 0x8c000534, 0x05000006, 0x8058b040, 0x05fe07fc, - 0x600c0080, 0x41781000, 0x0501f10e, 0x0501f894, + 0x0515fddb, 0x5c01d000, 0x4a03c013, 0x01000100, + 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x485fc857, + 0x6020c000, 0x825c0500, 0x00000080, 0x800000c2, + 0x82000540, 0x01000000, 0x4803c013, 0x4ce80000, + 0x6029d000, 0x0515fdca, 0x5c01d000, 0x4a03c013, + 0x02000200, 0x4ce80000, 0x6029d000, 0x0515fdc4, + 0x5c01d000, 0x4a03c013, 0x02000000, 0x805cb8c2, + 0x8060c040, 0x05fe07ec, 0x4a03c013, 0x01000100, + 0x4ce80000, 0x6029d000, 0x0515fdb9, 0x5c01d000, + 0x4a03c013, 0x02000200, 0x4ce80000, 0x6029d000, + 0x0515fdb3, 0x5c01d000, 0x4a03c014, 0x03800000, + 0x61a00807, 0x59e0b813, 0x825cbd00, 0x00000100, + 0x80040840, 0x05000004, 0x405c0000, 0x80000540, + 0x05fe07f9, 0x4a03c014, 0x03800380, 0x4a03c013, + 0x02000000, 0x4ce80000, 0x6029d000, 0x0515fda0, + 0x5c01d000, 0x485fc857, 0x405c0000, 0x80000540, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4c600000, + 0x4803c856, 0x4a03c013, 0x01000100, 0x6020c000, + 0x61a0c807, 0x4ce80000, 0x6029d000, 0x0515fd90, + 0x5c01d000, 0x4a03c013, 0x02000200, 0x4a03c014, + 0x03800000, 0x59e00013, 0x4a03c014, 0x03800380, + 0x82000500, 0x00000200, 0x05020003, 0x8064c840, + 0x05fe07f7, 0x4178c800, 0x0501f007, 0x4ce80000, + 0x6029d000, 0x0515fd7e, 0x5c01d000, 0x4a03c013, + 0x02000200, 0x4ce80000, 0x6029d000, 0x0515fd78, + 0x5c01d000, 0x4a03c014, 0x03800000, 0x59e00013, + 0x4a03c014, 0x03800380, 0x82000500, 0x00000100, + 0x80000110, 0x8064c8c2, 0x8064cd40, 0x4a03c013, + 0x02000000, 0x8060c040, 0x05fe07e9, 0x4867c857, + 0x5c00c000, 0x1c01f000, 0x4803c856, 0x4a03c013, + 0x01000100, 0x4ce80000, 0x6029d000, 0x0515fd60, + 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, + 0x6029d000, 0x0515fd5a, 0x5c01d000, 0x4a03c013, + 0x02000000, 0x1c01f000, 0x59a00408, 0x59a8082a, + 0x4803502a, 0x48074408, 0x59a00a0a, 0x90040494, + 0x05021002, 0x6140080f, 0x59a8002b, 0x4807502b, + 0x4803420a, 0x05fdf1c4, 0x59a00407, 0x59a00a08, + 0x900409c0, 0x80040d40, 0x59a00408, 0x59a01209, + 0x900811c0, 0x80081540, 0x59a00409, 0x59a01a0a, + 0x900c19c0, 0x800c1d40, 0x59a0040a, 0x59a0220b, + 0x901021c0, 0x80102540, 0x0535f897, 0x05fc01b2, + 0x05fdf207, 0x916c0580, 0x0500000a, 0x59a80005, + 0x59a00c07, 0x80041580, 0xb0081500, 0x05fc01aa, + 0x80080580, 0x48035005, 0x05f1f9b2, 0x05fdf1a6, + 0x59a00407, 0x59a80805, 0x48035005, 0x80040d80, + 0x8c04050c, 0x05f209ab, 0x59a00208, 0x48035006, + 0x59a00408, 0x8c00051a, 0x05000009, 0x600018ec, + 0x60140800, 0x580c1006, 0x4a001805, 0x70000005, + 0x900c1c20, 0x80040840, 0x05fe07fb, 0x48035007, + 0x05fdf191, 0x8d0c050e, 0x05000003, 0x64074407, + 0x05fdf1cf, 0x050dfed7, 0x05020003, 0x645b4407, + 0x05fdf1cb, 0x916c0583, 0x05000003, 0x641f4407, + 0x05fdf1c7, 0x59a00c07, 0x82040500, 0xffffff00, + 0x05fe01c7, 0x82041580, 0x000000ff, 0x05020007, + 0x59a8000f, 0x82000500, 0x000000ff, 0x82001540, + 0x0000ff00, 0x0501f00f, 0x82040400, 0x00101a23, + 0x50000000, 0x80000110, 0x82000580, 0x00000080, + 0x05fc01b7, 0x59a8000f, 0x82000500, 0x000000ff, + 0x80041580, 0x05fc01b2, 0x840409c0, 0x80041540, + 0x051dfc23, 0x05020003, 0x640f4407, 0x05fdf1a8, + 0x48ee6023, 0x480a621e, 0x4a02641e, 0x0000bc09, + 0x64066407, 0x0505fb17, 0x05020004, 0x0005f8e7, + 0x640b4407, 0x05fdf19e, 0x497a5a05, 0x497a5806, + 0x4a025c05, 0x00008000, 0x4a01d808, 0x001022b5, + 0x492e6009, 0x60ca7000, 0x0005f105, 0x8d0c050e, + 0x05000003, 0x64074407, 0x05fdf191, 0x050dfe99, + 0x05020003, 0x645b4407, 0x05fdf18d, 0x916c0583, + 0x05000003, 0x641f4407, 0x05fdf189, 0x59a00c07, + 0x82040500, 0xffffff00, 0x05fe0189, 0x82041580, + 0x000000ff, 0x05020007, 0x59a8000f, 0x82000500, + 0x000000ff, 0x82001540, 0x0000ff00, 0x0501f00f, + 0x82040400, 0x00101a23, 0x50000000, 0x80000110, + 0x82000580, 0x00000080, 0x05fc0179, 0x59a8000f, + 0x82000500, 0x000000ff, 0x80041580, 0x05fc0174, + 0x840409c0, 0x80041540, 0x051dfbe5, 0x05020003, + 0x640f4407, 0x05fdf16a, 0x48ee6023, 0x480a621e, + 0x4a02641e, 0x0000bc05, 0x64066407, 0x0505fad9, + 0x05020004, 0x0005f8e7, 0x640b4407, 0x05fdf160, + 0x497a5a05, 0x497a5806, 0x4a025c05, 0x00008000, + 0x4a01d808, 0x001022b5, 0x492e6009, 0x60ca7000, + 0x0005f105, 0x592c0006, 0x82000580, 0x01000000, + 0x05fe0111, 0x64134407, 0x05fdf151, 0x497b4407, + 0x497b4208, 0x8d0c0520, 0x05000008, 0x59a8005e, + 0x59a8085f, 0x80040480, 0x59a80860, 0x48074407, + 0x80041480, 0x480b4208, 0x0505fbd0, 0x48034408, + 0x59a8100d, 0x59a80262, 0x80080480, 0x4803420a, + 0x495f440a, 0x59a8001a, 0x4803420c, 0x05fdf0fa, + 0x8d0c050e, 0x05000003, 0x64074407, 0x05fdf138, + 0x59a00407, 0x8c000500, 0x0502000d, 0x59a80061, + 0x81640480, 0x05001008, 0x59a8000b, 0x81500580, + 0x05000007, 0x59a8005f, 0x59a8105e, 0x80080580, + 0x05000003, 0x64634407, 0x05fdf129, 0x850e1d58, + 0x4803c856, 0x850e1d46, 0x0505fed8, 0x05fdf0e2, + 0x599c0201, 0x4803507a, 0x41780800, 0x60401076, + 0x0515fd20, 0x480b507b, 0x1c01f000, 0x0501f805, + 0x60018800, 0x05020002, 0x60058800, 0x1c01f000, + 0x90000541, 0x0502500b, 0x4203e000, 0x80000000, + 0x40e81000, 0x41780800, 0x61900000, 0x0515fd11, + 0x5994002e, 0x80080400, 0x4803282e, 0x80000580, + 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x4cd80000, 0x417a3000, 0x0519fb90, + 0x0519f885, 0x5c01b000, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x1c01f000, 0x59c80003, + 0x82000500, 0xffffe0ff, 0x48039003, 0x61f00800, + 0x05f5fd43, 0x4a03902c, 0x00200000, 0x61d0b003, + 0x59c8002c, 0x8c00052c, 0x05000006, 0x8058b040, + 0x05fe07fc, 0x600c0080, 0x41781000, 0x0501f11e, + 0x640b5081, 0x42006000, 0x00102452, 0x50301000, + 0x41784800, 0x4a03902d, 0x00008000, 0x61d0b003, + 0x59c8002c, 0x8c000534, 0x05000006, 0x8058b040, + 0x05fe07fc, 0x600c0080, 0x41781000, 0x0501f10e, + 0x0501f894, 0x80244800, 0x82240580, 0x000003b1, + 0x05fe07fc, 0x0501f918, 0x41784800, 0x0501f8b8, 0x80244800, 0x82240580, 0x000003b1, 0x05fe07fc, - 0x0501f918, 0x41784800, 0x0501f8b8, 0x80244800, - 0x82240580, 0x000003b1, 0x05fe07fc, 0x80306000, - 0x82300580, 0x0010244f, 0x05fe07e4, 0x59a80880, - 0x800409c0, 0x05000005, 0x60100080, 0x60081000, - 0x59a8187f, 0x0501f0f7, 0x42006000, 0x0010244d, - 0x64435081, 0x50301000, 0x41784800, 0x4a03902d, - 0x00000800, 0x0501f876, 0x80244800, 0x90240598, - 0x05fe07fd, 0x0501f8fb, 0x41784800, 0x0501f89b, - 0x80244800, 0x90240598, 0x05fe07fd, 0x80306000, - 0x82300580, 0x0010244f, 0x05fe07ef, 0x59a80880, - 0x800409c0, 0x05000005, 0x60100080, 0x60401000, - 0x59a8187f, 0x0501f0db, 0x42006000, 0x0010244d, - 0x64235081, 0x50301000, 0x41784800, 0x4a03902d, - 0x00000400, 0x0501f85a, 0x80244800, 0x82240580, - 0x00000088, 0x05fe07fc, 0x0501f8de, 0x41784800, - 0x0501f87e, 0x80244800, 0x82240580, 0x00000088, - 0x05fe07fc, 0x80306000, 0x82300580, 0x0010244f, - 0x05fe07ed, 0x59a80880, 0x800409c0, 0x05000005, - 0x60100080, 0x60201000, 0x59a8187f, 0x0501f0bd, - 0x42006000, 0x0010244d, 0x64835081, 0x50301000, - 0x41784800, 0x4a03902d, 0x00002000, 0x61d0b003, - 0x59c8002c, 0x8c000530, 0x05000006, 0x8058b040, - 0x05fe07fc, 0x600c0080, 0x41781000, 0x0501f0ad, - 0x59c8002c, 0x82000500, 0xffe0ffff, 0x82080d00, - 0x001f0000, 0x80040540, 0x4803902c, 0x0501f82c, - 0x80244800, 0x82240580, 0x00000110, 0x05fe07fc, - 0x0501f8b0, 0x41784800, 0x0501f850, 0x59c80034, - 0x82080d00, 0x001f0000, 0x82000500, 0x001f0000, - 0x80040580, 0x05000006, 0x59a80080, 0x80000000, - 0x48035080, 0x40240000, 0x4803507f, 0x80244800, - 0x82240580, 0x00000110, 0x05fe07f0, 0x80306000, - 0x82300580, 0x0010244f, 0x05fe07d1, 0x59a80880, - 0x800409c0, 0x05000004, 0x60100080, 0x60801000, - 0x59a8187f, 0x59c80803, 0x82040d40, 0x00001f00, - 0x48079003, 0x59c8002c, 0x8400052a, 0x4803902c, - 0x61f00800, 0x05f5fc9c, 0x05fdf009, 0x59c8002c, - 0x82000500, 0xffff0000, 0x82080d00, 0x0000ffff, - 0x80040540, 0x4803902c, 0x480b9028, 0x480b9029, - 0x59a80081, 0x90004584, 0x05000007, 0x90000590, - 0x05020003, 0x80080920, 0x4807903a, 0x480b902a, - 0x480b902b, 0x59c8002d, 0x82000500, 0xfffffc00, - 0x80240540, 0x4803902d, 0x61d0b003, 0x59c8002c, - 0x82000500, 0x18000000, 0x05000006, 0x8058b040, - 0x05fe07fb, 0x600c0080, 0x41781000, 0x0501f059, - 0x6407902e, 0x61d0b003, 0x59c8002e, 0x8c000500, - 0x05000005, 0x8058b040, 0x05fe07fc, 0x600c0080, - 0x0501f050, 0x1c01f000, 0x41783800, 0x59c8002d, - 0x82000500, 0xfffffc00, 0x80240d40, 0x4807902d, - 0x61d0b003, 0x59c8002c, 0x82000500, 0x18000000, - 0x05000006, 0x8058b040, 0x05fe07fb, 0x600c0080, - 0x41781000, 0x0501f03f, 0x59c81830, 0x59c80030, - 0x800c0d80, 0x05fe07fd, 0x80080d80, 0x05000002, - 0x801c3800, 0x59c82031, 0x59c80031, 0x80100d80, + 0x80306000, 0x82300580, 0x00102454, 0x05fe07e4, + 0x59a80880, 0x800409c0, 0x05000005, 0x60100080, + 0x60081000, 0x59a8187f, 0x0501f0f7, 0x42006000, + 0x00102452, 0x64435081, 0x50301000, 0x41784800, + 0x4a03902d, 0x00000800, 0x0501f876, 0x80244800, + 0x90240598, 0x05fe07fd, 0x0501f8fb, 0x41784800, + 0x0501f89b, 0x80244800, 0x90240598, 0x05fe07fd, + 0x80306000, 0x82300580, 0x00102454, 0x05fe07ef, + 0x59a80880, 0x800409c0, 0x05000005, 0x60100080, + 0x60401000, 0x59a8187f, 0x0501f0db, 0x42006000, + 0x00102452, 0x64235081, 0x50301000, 0x41784800, + 0x4a03902d, 0x00000400, 0x0501f85a, 0x80244800, + 0x82240580, 0x00000088, 0x05fe07fc, 0x0501f8de, + 0x41784800, 0x0501f87e, 0x80244800, 0x82240580, + 0x00000088, 0x05fe07fc, 0x80306000, 0x82300580, + 0x00102454, 0x05fe07ed, 0x59a80880, 0x800409c0, + 0x05000005, 0x60100080, 0x60201000, 0x59a8187f, + 0x0501f0bd, 0x42006000, 0x00102452, 0x64835081, + 0x50301000, 0x41784800, 0x4a03902d, 0x00002000, + 0x61d0b003, 0x59c8002c, 0x8c000530, 0x05000006, + 0x8058b040, 0x05fe07fc, 0x600c0080, 0x41781000, + 0x0501f0ad, 0x59c8002c, 0x82000500, 0xffe0ffff, + 0x82080d00, 0x001f0000, 0x80040540, 0x4803902c, + 0x0501f82c, 0x80244800, 0x82240580, 0x00000110, + 0x05fe07fc, 0x0501f8b0, 0x41784800, 0x0501f850, + 0x59c80034, 0x82080d00, 0x001f0000, 0x82000500, + 0x001f0000, 0x80040580, 0x05000006, 0x59a80080, + 0x80000000, 0x48035080, 0x40240000, 0x4803507f, + 0x80244800, 0x82240580, 0x00000110, 0x05fe07f0, + 0x80306000, 0x82300580, 0x00102454, 0x05fe07d1, + 0x59a80880, 0x800409c0, 0x05000004, 0x60100080, + 0x60801000, 0x59a8187f, 0x59c80803, 0x82040d40, + 0x00001f00, 0x48079003, 0x59c8002c, 0x8400052a, + 0x4803902c, 0x61f00800, 0x05f5fc95, 0x05fdf006, + 0x59c8002c, 0x82000500, 0xffff0000, 0x82080d00, + 0x0000ffff, 0x80040540, 0x4803902c, 0x480b9028, + 0x480b9029, 0x59a80081, 0x90004584, 0x05000007, + 0x90000590, 0x05020003, 0x80080920, 0x4807903a, + 0x480b902a, 0x480b902b, 0x59c8002d, 0x82000500, + 0xfffffc00, 0x80240540, 0x4803902d, 0x61d0b003, + 0x59c8002c, 0x82000500, 0x18000000, 0x05000006, + 0x8058b040, 0x05fe07fb, 0x600c0080, 0x41781000, + 0x0501f059, 0x6407902e, 0x61d0b003, 0x59c8002e, + 0x8c000500, 0x05000005, 0x8058b040, 0x05fe07fc, + 0x600c0080, 0x0501f050, 0x1c01f000, 0x41783800, + 0x59c8002d, 0x82000500, 0xfffffc00, 0x80240d40, + 0x4807902d, 0x61d0b003, 0x59c8002c, 0x82000500, + 0x18000000, 0x05000006, 0x8058b040, 0x05fe07fb, + 0x600c0080, 0x41781000, 0x0501f03f, 0x59c81830, + 0x59c80030, 0x800c0d80, 0x05fe07fd, 0x80080d80, + 0x05000002, 0x801c3800, 0x59c82031, 0x59c80031, + 0x80100d80, 0x05fe07fd, 0x80080d80, 0x05000002, + 0x801c3800, 0x59a80081, 0x90004584, 0x0500001e, + 0x61fc41ff, 0x90000590, 0x05020003, 0x42004000, + 0x7f7f7f7f, 0x59c82832, 0x59c80032, 0x80140d80, 0x05fe07fd, 0x80080d80, 0x05000002, 0x801c3800, - 0x59a80081, 0x90004584, 0x0500001e, 0x61fc41ff, - 0x90000590, 0x05020003, 0x42004000, 0x7f7f7f7f, - 0x59c82832, 0x59c80032, 0x80140d80, 0x05fe07fd, - 0x80080d80, 0x05000002, 0x801c3800, 0x59c83033, - 0x59c80033, 0x80180d80, 0x05fe07fd, 0x80080d80, - 0x05000002, 0x801c3800, 0x59c80034, 0x59c80834, - 0x80040d80, 0x05fe07fd, 0x80080d80, 0x40200000, - 0x80040d00, 0x0500000c, 0x801c3800, 0x0501f00a, - 0x59c80034, 0x59c80834, 0x80040d80, 0x05fe07fd, - 0x80080d80, 0x82040d00, 0x000000ff, 0x05000002, - 0x801c3800, 0x801c39c0, 0x05000005, 0x59a80080, - 0x801c0400, 0x48035080, 0x4827507f, 0x1c01f000, - 0x48034207, 0x48074407, 0x480b4208, 0x480f4408, - 0x48134209, 0x48174409, 0x59c80003, 0x82000540, - 0x00001f00, 0x48039003, 0x59c8002c, 0x8400052a, - 0x4803902c, 0x61f00800, 0x05f5fc13, 0x05f9f783, - 0x42000000, 0x00600000, 0x80000040, 0x05fe07ff, - 0x1c01f000, 0x5a5a5a5a, 0xa5a5a5a5, 0x59a00c0b, - 0x800409c0, 0x05f807bc, 0x900404a1, 0x05fa17ba, - 0x90040491, 0x05001002, 0x60400800, 0x59a00209, - 0x59a01408, 0x900811c0, 0x80081540, 0x59a00208, - 0x59a01c07, 0x900c19c0, 0x800c1d40, 0x0505f91d, - 0x05000005, 0x0505f93b, 0x4a01d808, 0x00102467, - 0x1c01f000, 0x640b4407, 0x05f9f7a3, 0x4031d800, - 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f80795, 0x59a00c0b, 0x90040491, 0x05001002, - 0x60400800, 0x59a0040c, 0x59a0120c, 0x900811c0, - 0x80081540, 0x59a0020a, 0x59a01c09, 0x900c19c0, - 0x800c1d40, 0x58ec0003, 0x0505f928, 0x4a01d808, - 0x0010247e, 0x1c01f000, 0x4031d800, 0x58ef400a, - 0x58ec0002, 0x82000580, 0x00000200, 0x05f8077e, - 0x59a00c0b, 0x90040491, 0x05f81741, 0x90040c90, + 0x59c83033, 0x59c80033, 0x80180d80, 0x05fe07fd, + 0x80080d80, 0x05000002, 0x801c3800, 0x59c80034, + 0x59c80834, 0x80040d80, 0x05fe07fd, 0x80080d80, + 0x40200000, 0x80040d00, 0x0500000c, 0x801c3800, + 0x0501f00a, 0x59c80034, 0x59c80834, 0x80040d80, + 0x05fe07fd, 0x80080d80, 0x82040d00, 0x000000ff, + 0x05000002, 0x801c3800, 0x801c39c0, 0x05000005, + 0x59a80080, 0x801c0400, 0x48035080, 0x4827507f, + 0x1c01f000, 0x48034207, 0x48074407, 0x480b4208, + 0x480f4408, 0x48134209, 0x48174409, 0x59c80003, + 0x82000540, 0x00001f00, 0x48039003, 0x59c8002c, + 0x8400052a, 0x4803902c, 0x61f00800, 0x05f5fc0c, + 0x05f9f780, 0x42000000, 0x00600000, 0x80000040, + 0x05fe07ff, 0x1c01f000, 0x5a5a5a5a, 0xa5a5a5a5, + 0x59a00c0b, 0x800409c0, 0x05f807b9, 0x900404a1, + 0x05fa17b7, 0x90040491, 0x05001002, 0x60400800, 0x59a00209, 0x59a01408, 0x900811c0, 0x80081540, 0x59a00208, 0x59a01c07, 0x900c19c0, 0x800c1d40, - 0xb0081400, 0x58ec0003, 0x0505f90a, 0x4a01d808, - 0x00102496, 0x1c01f000, 0x4031d800, 0x58ef400a, - 0x58ec0002, 0x82000580, 0x00000200, 0x05f80766, - 0x59a0040b, 0x90000c90, 0x59a0040c, 0x59a0120c, + 0x0505f91c, 0x05000005, 0x0505f93a, 0x4a01d808, + 0x0010246c, 0x1c01f000, 0x640b4407, 0x05f9f7a0, + 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, + 0x00000200, 0x05f80792, 0x59a00c0b, 0x90040491, + 0x05001002, 0x60400800, 0x59a0040c, 0x59a0120c, 0x900811c0, 0x80081540, 0x59a0020a, 0x59a01c09, - 0x900c19c0, 0x800c1d40, 0xb0081400, 0x58ec0003, - 0x0505f8fa, 0x4a01d808, 0x00101bc0, 0x1c01f000, - 0x48efc857, 0x59a00208, 0x59a01408, 0x900001c0, - 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, - 0x800c1d40, 0x59a00407, 0x48034000, 0x480b4001, - 0x480f4002, 0x0505f8c3, 0x05020003, 0x640b4407, - 0x05f9f74d, 0x60400800, 0x0505f8de, 0x4a01d808, - 0x001024c2, 0x1c01f000, 0x4031d800, 0x58ef400a, - 0x58ee580c, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f80739, 0x48efc857, 0x49a3c857, 0x492fc857, - 0x592c0a05, 0x80040910, 0x05020003, 0x64674407, - 0x05f9f739, 0x4805d80b, 0x0501f009, 0x4031d800, + 0x900c19c0, 0x800c1d40, 0x58ec0003, 0x0505f927, + 0x4a01d808, 0x00102483, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f80729, 0x48efc857, 0x49a3c857, 0x48efc857, - 0x49a3c857, 0x58ec000b, 0x80000040, 0x0500000d, - 0x4801d80b, 0x0505f89b, 0x05020003, 0x640b4407, - 0x05f9f725, 0x60400800, 0x58ec1006, 0x58ec1807, - 0x0505f8b4, 0x4a01d808, 0x001024d3, 0x1c01f000, - 0x58ee580c, 0x48efc857, 0x49a3c857, 0x492fc857, - 0x492f3004, 0x592c0405, 0x8400055e, 0x48025c05, - 0x4a01d808, 0x001024f7, 0x1c01f000, 0x4d2c0000, - 0x58ee580c, 0x48efc857, 0x49a3c857, 0x492fc857, - 0x592c0405, 0x8400051e, 0x48025c05, 0x59a00000, - 0x59a01001, 0x59a01802, 0x80081400, 0x900c1c40, - 0x912c0405, 0x60400800, 0x5c025800, 0x0505f09b, - 0x8d0c050e, 0x05000003, 0x64074407, 0x05f9f6fe, - 0x916c0583, 0x05000003, 0x641f4407, 0x05f9f6fa, - 0x59a0320c, 0x82183500, 0x000000ff, 0x59a28c07, - 0x0001fac4, 0x05fa06f8, 0x83440580, 0x000007fd, - 0x05000005, 0x0509ff1e, 0x05000003, 0x64274407, - 0x05f9f6ed, 0x0505f85f, 0x05020003, 0x640b4407, - 0x05f9f6e9, 0x801831c0, 0x05000007, 0x412c0800, - 0x0505f858, 0x05020003, 0x640b4407, 0x05f9f6e2, - 0x40065800, 0x4a025c05, 0x00008000, 0x497a5a05, - 0x0525fc68, 0x05020003, 0x640f4407, 0x05f9f6da, - 0x4a01d808, 0x00102533, 0x1c01f000, 0x592c0006, - 0x82000580, 0x01000000, 0x05020003, 0x64134407, - 0x05f9f6d1, 0x592c0407, 0x82002d00, 0x0000ff00, - 0x82000500, 0x000000ff, 0x80000904, 0x80040800, - 0x90040486, 0x05001002, 0x60140800, 0x4c500000, - 0x4c540000, 0x4c580000, 0x912ca407, 0x4050a800, - 0x4004b000, 0x0531fc51, 0x59a00408, 0x59a01208, - 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, - 0x900c19c0, 0x800c1d40, 0x912c0407, 0x4c140000, - 0x0505f84e, 0x5c002800, 0x801429c0, 0x05000003, - 0x4a01d808, 0x0010255e, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x1c01f000, 0x4031d800, 0x58ef400a, - 0x58ee580c, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f8069d, 0x812e59c0, 0x05ec0c80, 0x592c0007, - 0x82000500, 0xff000000, 0x80000904, 0x800409c0, - 0x05f8065b, 0x4807c857, 0x9004048e, 0x05001002, - 0x60340800, 0x592e5801, 0x812e59c0, 0x05ec0c73, - 0x4c500000, 0x4c540000, 0x4c580000, 0x912ca406, - 0x4050a800, 0x4004b000, 0x0531fc20, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x58ec1006, 0x58ec1807, - 0x912c0406, 0x0505f021, 0x0501fffa, 0x05020003, - 0x640b4407, 0x05f9f684, 0x59a00c07, 0x82040500, - 0x0000ff00, 0x840001c0, 0x90001487, 0x05fa1682, - 0x0c01f001, 0x00102594, 0x0010259a, 0x001025a0, - 0x001025a0, 0x001025a0, 0x001025a1, 0x001025a5, - 0x60340800, 0x42003800, 0x001025b6, 0x4a034000, - 0x00109457, 0x0501f00f, 0x60340800, 0x42003800, - 0x001025b6, 0x4a034000, 0x00109464, 0x0501f009, - 0x05f9f66d, 0x60200800, 0x42003800, 0x001025c3, - 0x0501f004, 0x60100800, 0x42003800, 0x001025f8, + 0x05f8077b, 0x59a00c0b, 0x90040491, 0x05f8173e, + 0x90040c90, 0x59a00209, 0x59a01408, 0x900811c0, + 0x80081540, 0x59a00208, 0x59a01c07, 0x900c19c0, + 0x800c1d40, 0xb0081400, 0x58ec0003, 0x0505f909, + 0x4a01d808, 0x0010249b, 0x1c01f000, 0x4031d800, + 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, + 0x05f80763, 0x59a0040b, 0x90000c90, 0x59a0040c, + 0x59a0120c, 0x900811c0, 0x80081540, 0x59a0020a, + 0x59a01c09, 0x900c19c0, 0x800c1d40, 0xb0081400, + 0x58ec0003, 0x0505f8f9, 0x4a01d808, 0x00101bc2, + 0x1c01f000, 0x48efc857, 0x59a00208, 0x59a01408, + 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, + 0x900001c0, 0x800c1d40, 0x59a00407, 0x48034000, + 0x480b4001, 0x480f4002, 0x0505f8c2, 0x05020003, + 0x640b4407, 0x05f9f74a, 0x60400800, 0x0505f8dd, + 0x4a01d808, 0x001024c7, 0x1c01f000, 0x4031d800, + 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, + 0x00000200, 0x05f80736, 0x48efc857, 0x49a3c857, + 0x492fc857, 0x592c0a05, 0x80040910, 0x05020003, + 0x64674407, 0x05f9f736, 0x4805d80b, 0x0501f009, + 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, + 0x00000200, 0x05f80726, 0x48efc857, 0x49a3c857, + 0x48efc857, 0x49a3c857, 0x58ec000b, 0x80000040, + 0x0500000d, 0x4801d80b, 0x0505f89a, 0x05020003, + 0x640b4407, 0x05f9f722, 0x60400800, 0x58ec1006, + 0x58ec1807, 0x0505f8b3, 0x4a01d808, 0x001024d8, + 0x1c01f000, 0x58ee580c, 0x48efc857, 0x49a3c857, + 0x492fc857, 0x492f3004, 0x592c0405, 0x8400055e, + 0x48025c05, 0x4a01d808, 0x001024fc, 0x1c01f000, + 0x4d2c0000, 0x58ee580c, 0x48efc857, 0x49a3c857, + 0x492fc857, 0x592c0405, 0x8400051e, 0x48025c05, + 0x59a00000, 0x59a01001, 0x59a01802, 0x80081400, + 0x900c1c40, 0x912c0405, 0x60400800, 0x5c025800, + 0x0505f09a, 0x8d0c050e, 0x05000003, 0x64074407, + 0x05f9f6fb, 0x916c0583, 0x05000003, 0x641f4407, + 0x05f9f6f7, 0x59a0320c, 0x82183500, 0x000000ff, + 0x59a28c07, 0x0001fac4, 0x05fa06f5, 0x83440580, + 0x000007fd, 0x05000005, 0x0509ff2e, 0x05000003, + 0x64274407, 0x05f9f6ea, 0x0505f85e, 0x05020003, + 0x640b4407, 0x05f9f6e6, 0x801831c0, 0x05000007, + 0x412c0800, 0x0505f857, 0x05020003, 0x640b4407, + 0x05f9f6df, 0x40065800, 0x4a025c05, 0x00008000, + 0x497a5a05, 0x0525fcf9, 0x05020003, 0x640f4407, + 0x05f9f6d7, 0x4a01d808, 0x00102538, 0x1c01f000, + 0x592c0006, 0x82000580, 0x01000000, 0x05020003, + 0x64134407, 0x05f9f6ce, 0x592c0407, 0x82002d00, + 0x0000ff00, 0x82000500, 0x000000ff, 0x80000904, + 0x80040800, 0x90040486, 0x05001002, 0x60140800, + 0x4c500000, 0x4c540000, 0x4c580000, 0x912ca407, + 0x4050a800, 0x4004b000, 0x0531fd16, 0x59a00408, + 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, + 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x912c0407, + 0x4c140000, 0x0505f84d, 0x5c002800, 0x801429c0, + 0x05000003, 0x4a01d808, 0x00102563, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x1c01f000, 0x4031d800, + 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, + 0x00000200, 0x05f8069a, 0x812e59c0, 0x05ec0c7b, + 0x592c0007, 0x82000500, 0xff000000, 0x80000904, + 0x800409c0, 0x05f80658, 0x4807c857, 0x9004048e, + 0x05001002, 0x60340800, 0x592e5801, 0x812e59c0, + 0x05ec0c6e, 0x4c500000, 0x4c540000, 0x4c580000, + 0x912ca406, 0x4050a800, 0x4004b000, 0x0531fce5, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x58ec1006, + 0x58ec1807, 0x912c0406, 0x0505f020, 0x0501fff9, + 0x05020003, 0x640b4407, 0x05f9f681, 0x59a00c07, + 0x82040500, 0x0000ff00, 0x840001c0, 0x90001487, + 0x05fa167f, 0x0c01f001, 0x00102599, 0x0010259f, + 0x001025a5, 0x001025a5, 0x001025a5, 0x001025a6, + 0x001025aa, 0x60340800, 0x42003800, 0x001025bb, + 0x4a034000, 0x001094d7, 0x0501f00f, 0x60340800, + 0x42003800, 0x001025bb, 0x4a034000, 0x001094e4, + 0x0501f009, 0x05f9f66a, 0x60200800, 0x42003800, + 0x001025c8, 0x0501f004, 0x60100800, 0x42003800, + 0x001025fd, 0x59a00208, 0x59a01408, 0x900001c0, + 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, + 0x800c1d40, 0x912c0406, 0x4c1c0000, 0x0501ffe9, + 0x5c003800, 0x481dd808, 0x1c01f000, 0x4031d800, + 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, + 0x00000200, 0x05f80642, 0x64075019, 0x6034b000, + 0x59a0a800, 0x912ca406, 0x0531fc9e, 0x05f9f602, + 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, + 0x82000580, 0x00000200, 0x05f80635, 0x912ca406, + 0x50500000, 0x82001500, 0x000c0016, 0x05fa063c, + 0x90500c03, 0x50040000, 0x90001501, 0x05fa0638, + 0x50500000, 0x90001528, 0x05000015, 0x900815a8, + 0x05fa0633, 0x80500800, 0x50040000, 0x90001513, + 0x90081593, 0x05fa062e, 0x80040800, 0x50040000, + 0x82001500, 0x00050000, 0x82081580, 0x00050000, + 0x05fa0627, 0x916c0580, 0x0500000e, 0x599c0019, + 0x8c00050e, 0x0502000b, 0x05f9f621, 0x80500800, + 0x50040000, 0x90001513, 0x05fa061d, 0x80040800, + 0x50040000, 0x82001500, 0x00050000, 0x05fa0618, + 0x6020b000, 0x4200a800, 0x001094cf, 0x0531fc2e, + 0x05f9f5cd, 0x4031d800, 0x58ef400a, 0x58ee580c, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f80600, + 0x6010b000, 0x4200a800, 0x0010992c, 0x912ca406, + 0x0531fc21, 0x850e1d50, 0x05f9f5bf, 0x0501ff75, + 0x05020003, 0x640b4407, 0x05f9f5fd, 0x912cac06, + 0x59a00c07, 0x82040500, 0x0000ff00, 0x840001c0, + 0x90001488, 0x05fa15fa, 0x0c01f001, 0x0010261f, + 0x00102622, 0x00102625, 0x00102625, 0x00102625, + 0x00102626, 0x00102625, 0x0010262c, 0x4200a000, + 0x001094d7, 0x0501f038, 0x4200a000, 0x001094e4, + 0x0501f035, 0x05f9f5ea, 0x6020b000, 0x40580800, + 0x4200a000, 0x001094cf, 0x0531fbff, 0x0501f031, + 0x59a00a0b, 0x6473420b, 0x9004049c, 0x05f815e0, + 0x603cb000, 0x4178a000, 0x0531fbff, 0x912cac06, + 0x6010b000, 0x91a8a41f, 0x0531fbf3, 0x916c0580, + 0x05000004, 0x6010b000, 0x91a8a400, 0x0531fbee, + 0x492f4000, 0x0501ff43, 0x05020003, 0x640b4407, + 0x05f9f5cb, 0x912cac06, 0x603cb000, 0x4178a000, + 0x0531fbed, 0x912cac07, 0x6010b000, 0x91a8a423, + 0x0531fbe1, 0x492f4001, 0x59a25800, 0x59a00208, + 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, + 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x912c0406, + 0x603c0800, 0x0501ff51, 0x4a01d808, 0x00102666, + 0x1c01f000, 0x6034b000, 0x40580800, 0x0531fc09, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, - 0x912c0406, 0x4c1c0000, 0x0501ffea, 0x5c003800, - 0x481dd808, 0x1c01f000, 0x4031d800, 0x58ef400a, - 0x58ee580c, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f80645, 0x64075019, 0x6034b000, 0x59a0a800, - 0x912ca406, 0x0531fbd9, 0x05f9f605, 0x4031d800, - 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, - 0x00000200, 0x05f80638, 0x912ca406, 0x50500000, - 0x82001500, 0x000c0016, 0x05fa063f, 0x90500c03, - 0x50040000, 0x90001501, 0x05fa063b, 0x50500000, - 0x90001528, 0x05000015, 0x900815a8, 0x05fa0636, - 0x80500800, 0x50040000, 0x90001513, 0x90081593, - 0x05fa0631, 0x80040800, 0x50040000, 0x82001500, - 0x00050000, 0x82081580, 0x00050000, 0x05fa062a, - 0x916c0580, 0x0500000e, 0x599c0019, 0x8c00050e, - 0x0502000b, 0x05f9f624, 0x80500800, 0x50040000, - 0x90001513, 0x05fa0620, 0x80040800, 0x50040000, - 0x82001500, 0x00050000, 0x05fa061b, 0x6020b000, - 0x4200a800, 0x0010944f, 0x0531fb69, 0x05f9f5d0, - 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, - 0x82000580, 0x00000200, 0x05f80603, 0x6010b000, - 0x4200a800, 0x001098ac, 0x912ca406, 0x0531fb5c, - 0x850e1d50, 0x05f9f5c2, 0x0501ff76, 0x05020003, - 0x640b4407, 0x05f9f600, 0x912cac06, 0x59a00c07, - 0x82040500, 0x0000ff00, 0x840001c0, 0x90001488, - 0x05fa15fd, 0x0c01f001, 0x0010261a, 0x0010261d, - 0x00102620, 0x00102620, 0x00102620, 0x00102621, - 0x00102620, 0x00102627, 0x4200a000, 0x00109457, - 0x0501f038, 0x4200a000, 0x00109464, 0x0501f035, - 0x05f9f5ed, 0x6020b000, 0x40580800, 0x4200a000, - 0x0010944f, 0x0531fb3a, 0x0501f031, 0x59a00a0b, - 0x6473420b, 0x9004049c, 0x05f815e3, 0x603cb000, - 0x4178a000, 0x0531fb3a, 0x912cac06, 0x6010b000, - 0x91a8a41f, 0x0531fb2e, 0x916c0580, 0x05000004, - 0x6010b000, 0x91a8a400, 0x0531fb29, 0x492f4000, - 0x0501ff44, 0x05020003, 0x640b4407, 0x05f9f5ce, - 0x912cac06, 0x603cb000, 0x4178a000, 0x0531fb28, - 0x912cac07, 0x6010b000, 0x91a8a423, 0x0531fb1c, - 0x492f4001, 0x59a25800, 0x59a00208, 0x59a01408, - 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, - 0x900001c0, 0x800c1d40, 0x912c0406, 0x603c0800, - 0x0501ff52, 0x4a01d808, 0x00102661, 0x1c01f000, - 0x6034b000, 0x40580800, 0x0531fb44, 0x59a00208, - 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, - 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x912c0406, - 0x0501f742, 0x4031d800, 0x58ef400a, 0x58ec0002, - 0x82000580, 0x00000200, 0x05f8059b, 0x59a25801, - 0x58ec1006, 0x58ec1807, 0x912c0406, 0x60340800, - 0x0501f736, 0x916c0580, 0x05020003, 0x641f4407, - 0x05f9f599, 0x59a01407, 0x800811c0, 0x0502002a, - 0x497b4208, 0x05f9f93f, 0x05000011, 0x05f9f921, - 0x64074208, 0x0502000e, 0x4c080000, 0x05f9f92b, - 0x5c001000, 0x05020006, 0x640b4208, 0x05f5fd4c, - 0x05020007, 0x64134208, 0x0501f005, 0x640f4208, - 0x05f5fd26, 0x05020002, 0x64174208, 0x59c40801, - 0x82040d00, 0x00018000, 0x90040580, 0x05020003, - 0x64034407, 0x0501f069, 0x82040580, 0x00008000, - 0x05020003, 0x64074407, 0x0501f064, 0x82040580, - 0x00010000, 0x05020003, 0x640f4407, 0x0501f05f, - 0x82040580, 0x00018000, 0x05ee0b4c, 0x64134407, - 0x0501f05a, 0x59a80086, 0x8c000502, 0x05000004, - 0x60080000, 0x40000800, 0x0501f012, 0x59a00208, - 0x4c000000, 0x0505f80b, 0x5c000000, 0x05000005, - 0x4c000000, 0x0505f81e, 0x5c000000, 0x05020007, - 0x90000d84, 0x05000003, 0x90000d82, 0x05020003, - 0x600c0000, 0x600c1000, 0x48034002, 0x59a80837, - 0x48035037, 0x599c7819, 0x823c7d00, 0xffff1fff, - 0x800000da, 0x803c7d40, 0x483f3819, 0x497b4208, - 0x05f9f8f8, 0x05000013, 0x05f9f8da, 0x64074208, - 0x05020010, 0x4c040000, 0x4c080000, 0x05f9f8e3, - 0x5c001000, 0x5c000800, 0x05020006, 0x640b4208, - 0x05f5fd03, 0x05020007, 0x64134208, 0x0501f005, - 0x640f4208, 0x05f5fcdd, 0x05020002, 0x64174208, - 0x05f5fcda, 0x0500000b, 0x05f5fce3, 0x05000009, - 0x05f5fcec, 0x05000007, 0x05f5fcf5, 0x05000005, - 0x05f5fcfe, 0x05000003, 0x48075037, 0x05f9f532, - 0x90080583, 0x05020005, 0x59a00002, 0x48035044, - 0x640b5037, 0x0501f005, 0x4a035044, 0xaabbccdd, - 0x90080582, 0x05020011, 0x59c40006, 0x84000500, - 0x48038806, 0x0515fd2c, 0x497b8880, 0x42000000, - 0x00109860, 0x0531f9a8, 0x4803c856, 0x850e1d48, - 0x4a038808, 0x00000200, 0x6012d800, 0x64078805, - 0x64075043, 0x05edfd0c, 0x05f9f4d1, 0x8d0c050e, - 0x05000003, 0x64074407, 0x05f9f50f, 0x916c0583, - 0x05000003, 0x641f4407, 0x05f9f50b, 0x59a28c07, - 0x59a0320c, 0x82183500, 0x000000ff, 0x0001fac4, - 0x05fa0509, 0x83440580, 0x000007fd, 0x05000005, - 0x0509fd2f, 0x05000003, 0x60240800, 0x05f9f4fe, - 0x0501fe70, 0x05020003, 0x640b4407, 0x05f9f4fa, - 0x497a5a05, 0x4a025c05, 0x00008000, 0x0525fa91, - 0x05020003, 0x640f4407, 0x05f9f4f3, 0x4a01d808, - 0x0010271a, 0x1c01f000, 0x592c0006, 0x82000d00, - 0x0000ffff, 0x82000500, 0xffff0000, 0x82000580, - 0x01000000, 0x05020003, 0x64134407, 0x05f9f4e6, - 0x80040904, 0x4c500000, 0x4c540000, 0x4c580000, - 0x912ca406, 0x4050a800, 0x4004b000, 0x0531fa6f, - 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x59a00208, - 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, - 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x912c0406, - 0x0501f66a, 0x60000020, 0x50000000, 0x82000480, - 0x25320001, 0x05020007, 0x4a03c014, 0x00400040, - 0x4a03c013, 0x00400000, 0x6041d04e, 0x0511ff80, - 0x496fc857, 0x916c0580, 0x05000003, 0x646b4407, - 0x05f9f4c1, 0x050df995, 0x05060e64, 0x60800800, - 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, - 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, - 0x419c0000, 0x49a3c857, 0x0501fe46, 0x4a01d808, - 0x0010275a, 0x1c01f000, 0x4833c857, 0x4031d800, - 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f804a1, 0x599c0200, 0x800001c0, 0x05f804aa, - 0x59a80086, 0x8c000502, 0x05000011, 0x599c0017, - 0x84000508, 0x48033817, 0x599c0019, 0x82000500, - 0xffff1fff, 0x82000540, 0x00004000, 0x48033819, - 0x599c0018, 0x84000510, 0x84000516, 0x82000500, - 0xffffffcf, 0x90000560, 0x0501f004, 0x8c000504, - 0x05000003, 0x599c0018, 0x48033818, 0x0525ffd9, - 0x850e1d20, 0x599c0017, 0x8c000508, 0x05000003, - 0x850e1d60, 0x0501f003, 0x8c00050a, 0x05fa048a, + 0x912c0406, 0x0501f741, 0x4031d800, 0x58ef400a, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f80598, + 0x59a25801, 0x58ec1006, 0x58ec1807, 0x912c0406, + 0x60340800, 0x0501f735, 0x916c0580, 0x05020003, + 0x641f4407, 0x05f9f596, 0x59a01407, 0x800811c0, + 0x0502002a, 0x497b4208, 0x05f9f938, 0x05000011, + 0x05f9f91a, 0x64074208, 0x0502000e, 0x4c080000, + 0x05f9f924, 0x5c001000, 0x05020006, 0x640b4208, + 0x05f5fd45, 0x05020007, 0x64134208, 0x0501f005, + 0x640f4208, 0x05f5fd1f, 0x05020002, 0x64174208, + 0x59c40801, 0x82040d00, 0x00018000, 0x90040580, + 0x05020003, 0x64034407, 0x0501f069, 0x82040580, + 0x00008000, 0x05020003, 0x64074407, 0x0501f064, + 0x82040580, 0x00010000, 0x05020003, 0x640f4407, + 0x0501f05f, 0x82040580, 0x00018000, 0x05ee0b47, + 0x64134407, 0x0501f05a, 0x59a80086, 0x8c000502, + 0x05000004, 0x60080000, 0x40000800, 0x0501f012, + 0x59a00208, 0x4c000000, 0x0505f80a, 0x5c000000, + 0x05000005, 0x4c000000, 0x0505f81d, 0x5c000000, + 0x05020007, 0x90000d84, 0x05000003, 0x90000d82, + 0x05020003, 0x600c0000, 0x600c1000, 0x48034002, + 0x59a80837, 0x48035037, 0x599c7819, 0x823c7d00, + 0xffff1fff, 0x800000da, 0x803c7d40, 0x483f3819, + 0x497b4208, 0x05f9f8f1, 0x05000013, 0x05f9f8d3, + 0x64074208, 0x05020010, 0x4c040000, 0x4c080000, + 0x05f9f8dc, 0x5c001000, 0x5c000800, 0x05020006, + 0x640b4208, 0x05f5fcfc, 0x05020007, 0x64134208, + 0x0501f005, 0x640f4208, 0x05f5fcd6, 0x05020002, + 0x64174208, 0x05f5fcd3, 0x0500000b, 0x05f5fcdc, + 0x05000009, 0x05f5fce5, 0x05000007, 0x05f5fcee, + 0x05000005, 0x05f5fcf7, 0x05000003, 0x48075037, + 0x05f9f52f, 0x90080583, 0x05020005, 0x59a00002, + 0x48035044, 0x640b5037, 0x0501f005, 0x4a035044, + 0xaabbccdd, 0x90080582, 0x05020011, 0x59c40006, + 0x84000500, 0x48038806, 0x0515fdb3, 0x497b8880, + 0x42000000, 0x001098e0, 0x0531fa6d, 0x4803c856, + 0x850e1d48, 0x4a038808, 0x00000200, 0x6012d800, + 0x64078805, 0x64075043, 0x05edfd07, 0x05f9f4ce, + 0x8d0c050e, 0x05000003, 0x64074407, 0x05f9f50c, + 0x916c0583, 0x05000003, 0x641f4407, 0x05f9f508, + 0x59a28c07, 0x59a0320c, 0x82183500, 0x000000ff, + 0x0001fac4, 0x05fa0506, 0x83440580, 0x000007fd, + 0x05000005, 0x0509fd3f, 0x05000003, 0x60240800, + 0x05f9f4fb, 0x0501fe6f, 0x05020003, 0x640b4407, + 0x05f9f4f7, 0x497a5a05, 0x4a025c05, 0x00008000, + 0x0525fb22, 0x05020003, 0x640f4407, 0x05f9f4f0, + 0x4a01d808, 0x0010271f, 0x1c01f000, 0x592c0006, + 0x82000d00, 0x0000ffff, 0x82000500, 0xffff0000, + 0x82000580, 0x01000000, 0x05020003, 0x64134407, + 0x05f9f4e3, 0x80040904, 0x4c500000, 0x4c540000, + 0x4c580000, 0x912ca406, 0x4050a800, 0x4004b000, + 0x0531fb34, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, + 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, + 0x912c0406, 0x0501f669, 0x60000020, 0x50000000, + 0x82000480, 0x25320001, 0x05020007, 0x4a03c014, + 0x00400040, 0x4a03c013, 0x00400000, 0x6041d04e, + 0x0515f807, 0x496fc857, 0x916c0580, 0x05000003, + 0x646b4407, 0x05f9f4be, 0x050df9c6, 0x05060e6b, + 0x60800800, 0x59a00408, 0x59a01208, 0x900811c0, + 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, + 0x800c1d40, 0x419c0000, 0x49a3c857, 0x0501fe45, + 0x4a01d808, 0x0010275f, 0x1c01f000, 0x4833c857, + 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, + 0x00000200, 0x05f8049e, 0x599c0200, 0x800001c0, + 0x05f804a7, 0x59a80086, 0x8c000502, 0x05000011, + 0x599c0017, 0x84000508, 0x48033817, 0x599c0019, + 0x82000500, 0xffff1fff, 0x82000540, 0x00004000, + 0x48033819, 0x599c0018, 0x84000510, 0x84000516, + 0x82000500, 0xffffffcf, 0x90000560, 0x0501f004, + 0x8c000504, 0x05000003, 0x599c0018, 0x48033818, + 0x0529f86a, 0x850e1d20, 0x599c0017, 0x8c000508, + 0x05000003, 0x850e1d60, 0x0501f006, 0x8c00050a, + 0x05fa0487, 0x59a80806, 0x8c040516, 0x05fa0484, 0x4803c857, 0x8c000504, 0x05020004, 0x59c408a3, 0x84040d7a, 0x480788a3, 0x8c000502, 0x05020004, 0x59c408a3, 0x84040d08, 0x480788a3, 0x599c0c02, 0x8c000500, 0x05020004, 0x8c000516, 0x0500000e, - 0x0501f001, 0xb00414bf, 0x05fa1477, 0x82041400, - 0x00101a21, 0x50081000, 0x82081500, 0x000000ff, + 0x0501f001, 0xb00414bf, 0x05fa1471, 0x82041400, + 0x00101a23, 0x50081000, 0x82081500, 0x000000ff, 0x8c000500, 0x05020004, 0x480b500f, 0x600c0800, - 0x0515f9c2, 0x599c0019, 0x8c000506, 0x05000003, - 0x4a03b805, 0x90000000, 0x8c00050e, 0x05020009, - 0x59a80805, 0x8c040514, 0x05000006, 0x42000800, - 0x0010944f, 0x50040800, 0x90040d28, 0x05fa045e, + 0x0515fa46, 0x599c0019, 0x8c000506, 0x05000003, + 0x4a03b805, 0x90000000, 0x8c00050e, 0x05020005, + 0x4c000000, 0x0505f8e7, 0x5c000000, 0x05fa045c, 0x90000530, 0x05000003, 0x80000108, 0x0501f002, 0x60080000, 0x48039040, 0x60080800, 0x82000400, - 0x00102899, 0x50001000, 0x0515f9a8, 0x599c0201, - 0x82000c80, 0x00000100, 0x05f8144f, 0x82000c80, - 0x00000841, 0x05fa144c, 0x90000507, 0x05fa044a, - 0x599c0401, 0x80000540, 0x05f80447, 0x59a80886, + 0x0010289d, 0x50001000, 0x0515fa30, 0x599c0201, + 0x82000c80, 0x00000100, 0x05f8144d, 0x82000c80, + 0x00000841, 0x05fa144a, 0x90000507, 0x05fa0448, + 0x599c0401, 0x80000540, 0x05f80445, 0x59a80886, 0x8c040502, 0x05000005, 0x90000c90, 0x05001003, 0x60400000, 0x48033c01, 0x850e1d52, 0x82000580, 0x0000ffff, 0x05000002, 0x850e1d12, 0x599c0409, - 0x599c0c07, 0x80040c80, 0x05fa1437, 0x80000040, - 0x05f80435, 0x599c0209, 0x599c0a07, 0x80040c80, - 0x05fa1431, 0x80000040, 0x05f8042f, 0x050dfc8a, - 0x0509ff25, 0x599c0201, 0x48035004, 0x05f5f850, + 0x599c0c07, 0x80040c80, 0x05fa1435, 0x80000040, + 0x05f80433, 0x599c0209, 0x599c0a07, 0x80040c80, + 0x05fa142f, 0x80000040, 0x05f8042d, 0x050dfcbc, + 0x0509ff57, 0x599c0201, 0x48035004, 0x05f5f84a, 0x599c020a, 0x800001c0, 0x05000003, 0x48035031, 0x0501f003, 0x4a035031, 0x000000c8, 0x8d0c0520, - 0x05000003, 0x0511ff16, 0x417a5000, 0x599c0003, + 0x05000003, 0x0511ff9e, 0x417a5000, 0x599c0003, 0x599c0804, 0x9c0001c0, 0x9c0409c0, 0x48035002, 0x48075003, 0x599c1017, 0x8c08051c, 0x05000006, 0x599c0005, 0x599c0806, 0x9c0001c0, 0x9c0409c0, 0x0501f003, 0x82000500, 0xf0ffffff, 0x48035000, - 0x48075001, 0x42001000, 0x00109457, 0x48001000, - 0x48041001, 0x42001000, 0x00109464, 0x48001000, + 0x48075001, 0x42001000, 0x001094d7, 0x48001000, + 0x48041001, 0x42001000, 0x001094e4, 0x48001000, 0x48041001, 0x599c1019, 0x82081500, 0x0000e000, - 0x497b4208, 0x05f5ffa7, 0x05000012, 0x05f5ff89, - 0x64074208, 0x0502000f, 0x4c080000, 0x05f5ff93, + 0x497b4208, 0x05f5ffa1, 0x05000012, 0x05f5ff83, + 0x64074208, 0x0502000f, 0x4c080000, 0x05f5ff8d, 0x5c001000, 0x05020007, 0x640b4208, 0x82080580, 0x00008000, 0x05020007, 0x64134208, 0x0501f005, 0x640f4208, 0x90080580, 0x05020002, 0x64174208, 0x90080580, 0x05020007, 0x64035037, 0x60040000, - 0x05f5fd78, 0x60040000, 0x05f5fd4c, 0x0501f02b, + 0x05f5fd72, 0x60040000, 0x05f5fd46, 0x0501f02b, 0x82080580, 0x00002000, 0x05020008, 0x64075037, - 0x60000000, 0x05f5fd6f, 0x60000000, 0x05f5fd43, - 0x05f9f8eb, 0x0501f021, 0x82080580, 0x00004000, + 0x60000000, 0x05f5fd69, 0x60000000, 0x05f5fd3d, + 0x05f9f8e6, 0x0501f021, 0x82080580, 0x00004000, 0x05020004, 0x640b5037, 0x64075043, 0x05fdf7f9, 0x82080580, 0x00006000, 0x0502000f, 0x59a80858, 0x82040d80, 0x01391077, 0x05020004, 0x59e00813, - 0x8c040500, 0x05fa03cc, 0x640f5037, 0x60080000, - 0x05f5fd58, 0x60080000, 0x05f5fd2c, 0x05fdf7e9, - 0x0501f00a, 0x82080580, 0x00008000, 0x05fa03c2, - 0x05f9f8de, 0x64135037, 0x600c0000, 0x05f5fd4d, - 0x600c0000, 0x05f5fd21, 0x599c1019, 0x82081500, + 0x8c040500, 0x05fa03ca, 0x640f5037, 0x60080000, + 0x05f5fd52, 0x60080000, 0x05f5fd26, 0x05fdf7e9, + 0x0501f00a, 0x82080580, 0x00008000, 0x05fa03c0, + 0x05f9f8d9, 0x64135037, 0x600c0000, 0x05f5fd47, + 0x600c0000, 0x05f5fd1b, 0x599c1019, 0x82081500, 0x0000e000, 0x4c080000, 0x0501fe8d, 0x5c001000, 0x05020004, 0x82080580, 0x00004000, 0x0500000b, 0x0501fe54, 0x05000003, 0x0501fe69, 0x05020009, @@ -2626,31 +2627,31 @@ static const uint32_t isp_2500_risc_code[] = { 0x599c1018, 0x90081530, 0x90080d80, 0x05000005, 0x90080d90, 0x05000008, 0x90080da0, 0x05020002, 0x48075013, 0x0501fdb7, 0x05000007, 0x4803c856, - 0x850e1d46, 0x05f5faf0, 0x59a8001f, 0x80040540, - 0x4803501f, 0x49f3c857, 0x42001000, 0x0010402e, - 0x0511fcf9, 0x42001000, 0x00104021, 0x0511fe27, + 0x850e1d46, 0x05f5faea, 0x59a8001f, 0x80040540, + 0x4803501f, 0x49f3c857, 0x42001000, 0x00104064, + 0x0511fd81, 0x42001000, 0x00104057, 0x0511feaf, 0x4a038805, 0xffffffff, 0x0501fe44, 0x05000005, 0x4a03c014, 0x00400040, 0x4a03c013, 0x00400000, 0x59a0001e, 0x84000540, 0x4803401e, 0x49f3c857, - 0x05f9f32f, 0x00000018, 0x0000000c, 0x00000018, + 0x05f9f32d, 0x00000018, 0x0000000c, 0x00000018, 0x00000020, 0x916c0580, 0x05020003, 0x601c0800, - 0x05f9f369, 0x60800800, 0x59a00408, 0x59a01208, + 0x05f9f367, 0x60800800, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x419c0000, 0x0501f4f7, - 0x8d0c050e, 0x05000003, 0x64074407, 0x05f9f35a, - 0x050df82e, 0x05020003, 0x645b4407, 0x05f9f356, + 0x8d0c050e, 0x05000003, 0x64074407, 0x05f9f358, + 0x050df860, 0x05020003, 0x645b4407, 0x05f9f354, 0x59a8006f, 0x8c000500, 0x0500000e, 0x64034407, 0x60800800, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, - 0x800c1d40, 0x42000000, 0x001098d3, 0x0501f4df, - 0x64074407, 0x6080b000, 0x4200a800, 0x001098d3, + 0x800c1d40, 0x42000000, 0x00109953, 0x0501f4df, + 0x64074407, 0x6080b000, 0x4200a800, 0x00109953, 0x4200a000, 0xffffffff, 0x4450a800, 0x8054a800, 0x8058b040, 0x05fe07fd, 0x4d440000, 0x4d340000, 0x42028800, 0xffffffff, 0x42002000, 0xffffffff, - 0x60043000, 0x60043800, 0x42001800, 0x001098d3, + 0x60043000, 0x60043800, 0x42001800, 0x00109953, 0x59a8100f, 0x82081500, 0x000000ff, 0x40180000, - 0x0c01f001, 0x001028e1, 0x001028e4, 0x001028e8, - 0x001028ec, 0x82102500, 0xffffff00, 0x0501f014, + 0x0c01f001, 0x001028e5, 0x001028e8, 0x001028ec, + 0x001028f0, 0x82102500, 0xffffff00, 0x0501f014, 0x82102500, 0xffff00ff, 0x840811c0, 0x0501f010, 0x82102500, 0xff00ffff, 0x900811c0, 0x0501f00c, 0x82102500, 0x00ffffff, 0x9c0801c0, 0x80102540, @@ -2659,30 +2660,30 @@ static const uint32_t isp_2500_risc_code[] = { 0x80102540, 0x81468800, 0xb1442cbf, 0x05021012, 0x4c080000, 0x4c0c0000, 0x4c180000, 0x4c1c0000, 0x0001fac4, 0x5c003800, 0x5c003000, 0x5c001800, - 0x5c001000, 0x05fe07f4, 0x0509fb42, 0x05fe07f2, + 0x5c001000, 0x05fe07f4, 0x0509fb53, 0x05fe07f2, 0x80183000, 0x801c3800, 0x59341202, 0x40180000, 0x0c01f7d1, 0x82100580, 0xffffffff, 0x05000002, - 0x44101800, 0x42001800, 0x001098d3, 0x500c0000, + 0x44101800, 0x42001800, 0x00109953, 0x500c0000, 0x82000500, 0xffffff00, 0x801c0540, 0x44001800, 0x5c026800, 0x5c028800, 0x60800800, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x42000000, - 0x001098d3, 0x0501f47d, 0x59a28c07, 0x59a0020c, + 0x00109953, 0x0501f47d, 0x59a28c07, 0x59a0020c, 0x8c000500, 0x0500000c, 0x59a01209, 0x59a00409, 0x82000500, 0x000000ff, 0x900001c0, 0x80081540, - 0x41784000, 0x0509faa7, 0x05000005, 0x48034407, - 0x05f9f2d9, 0x0001fac4, 0x05fa02d7, 0x0501fc45, - 0x05020003, 0x640b4407, 0x05f9f2cf, 0x59a0020c, - 0x8c000500, 0x05000003, 0x0509fb0a, 0x050204ff, + 0x41784000, 0x0509fab6, 0x05000005, 0x48034407, + 0x05f9f2d7, 0x0001fac4, 0x05fa02d5, 0x0501fc45, + 0x05020003, 0x640b4407, 0x05f9f2cd, 0x59a0020c, + 0x8c000500, 0x05000003, 0x0509fb1b, 0x050204ff, 0x59a0020c, 0x8c000502, 0x05000013, 0x83440480, - 0x000007f0, 0x05021010, 0x0509fb0b, 0x0502000e, - 0x497a5a05, 0x4a025c05, 0x00008000, 0x0525f834, - 0x05020003, 0x640f4407, 0x05f9f2bb, 0x4a01d808, - 0x00102952, 0x1c01f000, 0x59a28c07, 0x0001fac4, - 0x05fa02b9, 0x4c580000, 0x4c500000, 0x4c540000, + 0x000007f0, 0x05021010, 0x0509fb1c, 0x0502000e, + 0x497a5a05, 0x4a025c05, 0x00008000, 0x0525f8c6, + 0x05020003, 0x640f4407, 0x05f9f2b9, 0x4a01d808, + 0x00102956, 0x1c01f000, 0x59a28c07, 0x0001fac4, + 0x05fa02b7, 0x4c580000, 0x4c500000, 0x4c540000, 0x6028b000, 0x4134a000, 0x912e5c02, 0x412ca800, - 0x0531f803, 0x912cac06, 0x4054a000, 0x6010b000, - 0x0531f83a, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x0531f8c9, 0x912cac06, 0x4054a000, 0x6010b000, + 0x0531f900, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x592c0802, 0x82040500, 0x00ff00ff, 0x900001c0, 0x82041500, 0xff00ff00, 0x80080540, 0x48025802, 0x592c0801, 0x82040500, 0x00ff00ff, 0x900001c0, @@ -2690,49 +2691,49 @@ static const uint32_t isp_2500_risc_code[] = { 0x60280800, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x412c0000, 0x0501f424, 0x496fc857, - 0x496f4407, 0x497b4208, 0x05f5fe32, 0x05000015, - 0x05f5fe14, 0x64074208, 0x05020012, 0x4c080000, - 0x05f5fe1e, 0x5c001000, 0x05020008, 0x640b4208, - 0x916c0580, 0x0500000b, 0x05f5fa3d, 0x05020009, + 0x496f4407, 0x497b4208, 0x05f5fe2c, 0x05000015, + 0x05f5fe0e, 0x64074208, 0x05020012, 0x4c080000, + 0x05f5fe18, 0x5c001000, 0x05020008, 0x640b4208, + 0x916c0580, 0x0500000b, 0x05f5fa37, 0x05020009, 0x64134208, 0x0501f007, 0x640f4208, 0x916c0580, - 0x05000004, 0x05f5fa15, 0x05020002, 0x64174208, - 0x05f9f22f, 0x59a28c07, 0x0001fac4, 0x05fa0272, - 0x916c0583, 0x05000003, 0x641f4407, 0x05f9f26a, + 0x05000004, 0x05f5fa0f, 0x05020002, 0x64174208, + 0x05f9f22d, 0x59a28c07, 0x0001fac4, 0x05fa0270, + 0x916c0583, 0x05000003, 0x641f4407, 0x05f9f268, 0x91340c06, 0x59a0020c, 0x8c000500, 0x05000002, 0x91340c08, 0x58040001, 0x4803440a, 0x900001c0, 0x4803420a, 0x50040000, 0x48034408, 0x900001c0, - 0x48034208, 0x59340200, 0x48034407, 0x05f9f218, - 0x8d0c050e, 0x05000003, 0x64074407, 0x05f9f256, + 0x48034208, 0x59340200, 0x48034407, 0x05f9f216, + 0x8d0c050e, 0x05000003, 0x64074407, 0x05f9f254, 0x59a0220c, 0x8c100500, 0x05020021, 0x8c100506, - 0x05020004, 0x59a03209, 0x90180483, 0x05fa1252, - 0x59a28c07, 0x0001fac4, 0x05fa024f, 0x0509fa78, - 0x05000003, 0x64274407, 0x05f9f247, 0x0501fbb9, - 0x05020003, 0x640b4407, 0x05f9f243, 0x59a0220c, + 0x05020004, 0x59a03209, 0x90180483, 0x05fa1250, + 0x59a28c07, 0x0001fac4, 0x05fa024d, 0x0509fa89, + 0x05000003, 0x64274407, 0x05f9f245, 0x0501fbb9, + 0x05020003, 0x640b4407, 0x05f9f241, 0x59a0220c, 0x8c100506, 0x05000004, 0x59343002, 0x82183500, 0x00ffffff, 0x497a5a05, 0x4a025c05, 0x00008000, - 0x0521ff80, 0x05020003, 0x640f4407, 0x05f9f236, - 0x4a01d808, 0x00102a15, 0x1c01f000, 0x59a28c07, - 0x0001fac4, 0x05fa0234, 0x0509fa5d, 0x05000003, - 0x64274407, 0x05f9f22c, 0x0501fb9e, 0x05020003, - 0x640b4407, 0x05f9f228, 0x497a5a05, 0x4a025c05, + 0x0525f812, 0x05020003, 0x640f4407, 0x05f9f234, + 0x4a01d808, 0x00102a19, 0x1c01f000, 0x59a28c07, + 0x0001fac4, 0x05fa0232, 0x0509fa6e, 0x05000003, + 0x64274407, 0x05f9f22a, 0x0501fb9e, 0x05020003, + 0x640b4407, 0x05f9f226, 0x497a5a05, 0x4a025c05, 0x00008000, 0x0501fb97, 0x05020003, 0x640b4407, - 0x05f9f221, 0x592e5800, 0x0521ff76, 0x05020003, - 0x640f4407, 0x05f9f21c, 0x4a01d808, 0x001029f1, + 0x05f9f21f, 0x592e5800, 0x0525f808, 0x05020003, + 0x640f4407, 0x05f9f21a, 0x4a01d808, 0x001029f5, 0x1c01f000, 0x592c2806, 0x82140d80, 0x01000000, - 0x05020003, 0x64134407, 0x05f9f213, 0x60200800, + 0x05020003, 0x64134407, 0x05f9f211, 0x60200800, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x912c0406, 0x0501fba1, 0x8c140500, 0x05000003, - 0x4a01d808, 0x00102a07, 0x1c01f000, 0x4031d800, + 0x4a01d808, 0x00102a0b, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580d, 0x58ec0002, 0x82000580, - 0x00000200, 0x05f801f4, 0x812e59c0, 0x05e80fd7, + 0x00000200, 0x05f801f2, 0x812e59c0, 0x05e80fd3, 0x60200800, 0x912c0406, 0x58ec1006, 0x58ec1807, 0x0501f38e, 0x592c0006, 0x82000580, 0x01000000, - 0x05020003, 0x64134407, 0x05f9f1ef, 0x59a00208, + 0x05020003, 0x64134407, 0x05f9f1ed, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x60180800, 0x912c0407, 0x0501f37d, 0x59a00a0b, 0x800409c0, - 0x05f801e5, 0x82040480, 0x00000081, 0x05001002, + 0x05f801e3, 0x82040480, 0x00000081, 0x05001002, 0x60000801, 0x59c40085, 0x59881004, 0x80081400, 0x480b1004, 0x497b8885, 0x59c400b1, 0x48031022, 0x59c400b2, 0x48031021, 0x59c400a2, 0x48031023, @@ -2741,58 +2742,58 @@ static const uint32_t isp_2500_risc_code[] = { 0x80081400, 0x598800bb, 0x80081400, 0x480b1024, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, - 0x91880400, 0x0501fb55, 0x4a01d808, 0x00102a51, + 0x91880400, 0x0501fb55, 0x4a01d808, 0x00102a55, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, - 0x82000580, 0x00000200, 0x05f801ab, 0x59a0020c, + 0x82000580, 0x00000200, 0x05f801a9, 0x59a0020c, 0x8c000500, 0x05000006, 0x91880400, 0x4803c840, 0x641bc842, 0x05011000, 0x497b8885, 0x4a034208, - 0x00000080, 0x05f9f166, 0x8d0c050e, 0x05000003, - 0x64074407, 0x05f9f1a4, 0x0501fb16, 0x05020003, - 0x640b4407, 0x05f9f1a0, 0x497a5a05, 0x4a025c05, - 0x00008000, 0x59a00407, 0x800001c0, 0x05f8019e, + 0x00000080, 0x05f9f164, 0x8d0c050e, 0x05000003, + 0x64074407, 0x05f9f1a2, 0x0501fb16, 0x05020003, + 0x640b4407, 0x05f9f19e, 0x497a5a05, 0x4a025c05, + 0x00008000, 0x59a00407, 0x800001c0, 0x05f8019c, 0x82001580, 0x000000ff, 0x05000003, 0x90001484, - 0x05fa1199, 0x40001000, 0x05f5fefa, 0x05020003, - 0x640f4407, 0x05f9f190, 0x4a01d808, 0x00102a7d, + 0x05fa1197, 0x40001000, 0x05f5fef5, 0x05020003, + 0x640f4407, 0x05f9f18e, 0x4a01d808, 0x00102a81, 0x1c01f000, 0x592c0006, 0x82000580, 0x01000000, - 0x05fa0147, 0x64134407, 0x05f9f187, 0x59a01407, + 0x05fa0145, 0x64134407, 0x05f9f185, 0x59a01407, 0x8c080508, 0x05020005, 0x8d0c050e, 0x05000003, - 0x64074407, 0x05f9f180, 0x59a01c08, 0x820c0480, - 0x00001000, 0x05fa1180, 0x497b2804, 0x497b2805, + 0x64074407, 0x05f9f17e, 0x59a01c08, 0x820c0480, + 0x00001000, 0x05fa117e, 0x497b2804, 0x497b2805, 0x497b2826, 0x497b2827, 0x497b2829, 0x497b282a, 0x497b282c, 0x497b282d, 0x4803c856, 0x850e1d06, 0x8c080500, 0x05000004, 0x4803c856, 0x910e1d51, 0x0501f004, 0x8c080506, 0x05000002, 0x850e1d42, 0x850e1d0a, 0x6006d800, 0x82081500, 0x000000e0, - 0x8008010a, 0x0c02002a, 0x0509fe38, 0x05020008, - 0x64075014, 0x4a035013, 0x0000aaaa, 0x0509fdb1, + 0x8008010a, 0x0c02002a, 0x0509fe6a, 0x05020008, + 0x64075014, 0x4a035013, 0x0000aaaa, 0x0509fde3, 0x0501f018, 0x64035014, 0x05fdf7fb, 0x497b5013, - 0x0505fafe, 0x0511fe82, 0x0515f963, 0x0511fe6c, + 0x0505fb06, 0x0511ff0a, 0x0515f9eb, 0x0511fef4, 0x59a00a08, 0x480788a7, 0x59c400a3, 0x82000500, 0xfeffffff, 0x82000540, 0x80018000, 0x40000800, 0x84040d20, 0x480388a3, 0x480788a3, 0x497b5032, - 0x60b40800, 0x42001000, 0x0010362b, 0x0511fa9b, + 0x60b40800, 0x42001000, 0x00103637, 0x0511fb23, 0x59a00408, 0x800000c2, 0x800008c4, 0x8005d400, - 0x61fc01ff, 0x0509fe15, 0x05000003, 0x59a00208, - 0x80000110, 0x0501fb98, 0x05f9f0f9, 0x00102aa6, - 0x00102aa8, 0x00102aaf, 0x00101c0d, 0x00102aad, - 0x00101c0d, 0x00101c0d, 0x00101c0d, 0x916c0583, - 0x05000003, 0x641f4407, 0x05f9f12f, 0x59a00408, + 0x61fc01ff, 0x0509fe47, 0x05000003, 0x59a00208, + 0x80000110, 0x0501fb98, 0x05f9f0f7, 0x00102aaa, + 0x00102aac, 0x00102ab3, 0x00101c0f, 0x00102ab1, + 0x00101c0f, 0x00101c0f, 0x00101c0f, 0x916c0583, + 0x05000003, 0x641f4407, 0x05f9f12d, 0x59a00408, 0x59a00a08, 0x900409c0, 0x80040d40, 0x4805d806, 0x59a0040a, 0x59a00a0a, 0x900409c0, 0x80040d40, 0x4805d807, 0x6401d801, 0x0501fa96, 0x05020003, - 0x640b4407, 0x05f9f120, 0x417a8800, 0x497b4001, + 0x640b4407, 0x05f9f11e, 0x417a8800, 0x497b4001, 0x912c0406, 0x48034002, 0x59a00407, 0x8c000504, 0x0502008b, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4178b800, 0x59a0c407, 0x59a0c802, 0x0001fac4, - 0x05020027, 0x0509f93e, 0x05000003, 0x0509f8a7, + 0x05020027, 0x0509f94f, 0x05000003, 0x0509f8b6, 0x05020023, 0x8c60053e, 0x05020020, 0x8c600500, 0x05000008, 0x59340009, 0x4400c800, 0x8064c800, 0x59340008, 0x4400c800, 0x8064c800, 0x0501f007, 0x59340007, 0x4400c800, 0x8064c800, 0x59340006, 0x4400c800, 0x8064c800, 0x83440580, 0x000007fe, 0x0500000b, 0x83440580, 0x000007fc, 0x05000008, - 0x0509f934, 0x05000003, 0x85468d5e, 0x0501f004, - 0x0509f86b, 0x05020002, 0x85468d5e, 0x4544c800, + 0x0509f945, 0x05000003, 0x85468d5e, 0x0501f004, + 0x0509f87a, 0x05020002, 0x85468d5e, 0x4544c800, 0x85468d1e, 0x8064c800, 0x905cbc0c, 0x81468800, 0x83440480, 0x000007f0, 0x0500100c, 0x8c600506, 0x05000025, 0x83440580, 0x000007f0, 0x05020003, @@ -2803,29 +2804,29 @@ static const uint32_t isp_2500_risc_code[] = { 0x80040480, 0x05021004, 0x8460c57e, 0x4178b800, 0x05fdf7bb, 0x49474000, 0x485dd805, 0x59a00002, 0x4801d803, 0x40ec1000, 0x0001f81c, 0x4a01d808, - 0x00102b73, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x00102b77, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x8c60053e, 0x05020019, 0x805cb9c0, 0x05000021, 0x59a00001, 0x805c0400, 0x48034001, 0x59a00a0b, 0x800409c0, 0x05000005, 0x80040480, 0x05021003, 0x4178b800, 0x0501f00d, 0x59a00801, 0x48074407, 0x485dd805, 0x59a00002, 0x4801d803, - 0x4a01d808, 0x00101bc0, 0x40ec1000, 0x5c00c800, + 0x4a01d808, 0x00101bc2, 0x40ec1000, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0001f01c, 0x59a00001, 0x805c0c00, 0x59a0020b, 0x80040480, 0x48034208, 0x642b4407, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x05f9f09d, 0x59a00801, 0x48074407, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x05f9f055, 0x4031d800, + 0x05f9f09b, 0x59a00801, 0x48074407, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x05f9f053, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f80089, 0x59a28800, 0x05fdf777, 0x4c5c0000, + 0x05f80087, 0x59a28800, 0x05fdf777, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4178b800, 0x59a0c407, - 0x59a0c802, 0x0001fac4, 0x05020029, 0x0509f8b4, - 0x05000003, 0x0509f81d, 0x05020025, 0x8c60053e, + 0x59a0c802, 0x0001fac4, 0x05020029, 0x0509f8c5, + 0x05000003, 0x0509f82c, 0x05020025, 0x8c60053e, 0x05020022, 0x83440580, 0x000007fe, 0x0500000f, - 0x83440580, 0x000007fc, 0x0500000c, 0x0509f8b9, + 0x83440580, 0x000007fc, 0x0500000c, 0x0509f8ca, 0x05000005, 0x59340403, 0x8400055e, 0x48026c03, - 0x0501f006, 0x0505ffee, 0x05020004, 0x59340403, + 0x0501f006, 0x0505fffd, 0x05020004, 0x59340403, 0x8400055e, 0x48026c03, 0x4134a000, 0x4064a800, - 0x6018b000, 0x052dfdc2, 0x59340007, 0x4400a800, + 0x6018b000, 0x052dfe88, 0x59340007, 0x4400a800, 0x59340006, 0x4800a801, 0x59340009, 0x4800a802, 0x59340008, 0x4800a803, 0x59340403, 0x8400051e, 0x48026c03, 0x9064cc0a, 0x905cbc28, 0x81468800, @@ -2838,46 +2839,46 @@ static const uint32_t isp_2500_risc_code[] = { 0x05000006, 0x80040480, 0x05021004, 0x8460c57e, 0x4178b800, 0x05fdf7b8, 0x49474000, 0x485dd805, 0x59a00002, 0x4801d803, 0x40ec1000, 0x0001f81c, - 0x4a01d808, 0x00102c00, 0x5c00c800, 0x5c00c000, + 0x4a01d808, 0x00102c04, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x8c60053e, 0x05020019, 0x805cb9c0, 0x05000021, 0x59a00001, 0x805c0400, 0x48034001, 0x59a00a0b, 0x800409c0, 0x05000005, 0x80040480, 0x05021003, 0x4178b800, 0x0501f00d, 0x59a00801, 0x48074407, 0x485dd805, 0x59a00002, - 0x4801d803, 0x4a01d808, 0x00101bc0, 0x40ec1000, + 0x4801d803, 0x4a01d808, 0x00101bc2, 0x40ec1000, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0001f01c, 0x59a00001, 0x805c0c00, 0x59a0020b, 0x80040480, 0x48034208, 0x642b4407, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x05f9f010, 0x59a00801, 0x48074407, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x05f5f7c8, + 0x5c00b800, 0x05f9f00e, 0x59a00801, 0x48074407, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x05f5f7c6, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, - 0x00000200, 0x05f407fc, 0x59a28800, 0x05fdf774, + 0x00000200, 0x05f407fa, 0x59a28800, 0x05fdf774, 0x61f82800, 0x59a00c07, 0x59a01208, 0x59a01c08, 0x59a0220a, 0x82040500, 0x0000ff00, 0x840001c0, - 0x900034a0, 0x05f417fc, 0x80140480, 0x05f417fa, - 0x82040500, 0x000000ff, 0x900034a0, 0x05f417f6, - 0x80140480, 0x05f417f4, 0x82080500, 0x0000ff00, - 0x840001c0, 0x900034a0, 0x05f417ef, 0x80140480, - 0x05f417ed, 0x82080500, 0x000000ff, 0x900034a0, - 0x05f417e9, 0x80140480, 0x05f417e7, 0x820c0500, - 0x0000ff00, 0x840001c0, 0x900034a0, 0x05f417e2, - 0x80140480, 0x05f417e0, 0x820c0500, 0x000000ff, - 0x900034a0, 0x05f417dc, 0x80140480, 0x05f417da, + 0x900034a0, 0x05f417fa, 0x80140480, 0x05f417f8, + 0x82040500, 0x000000ff, 0x900034a0, 0x05f417f4, + 0x80140480, 0x05f417f2, 0x82080500, 0x0000ff00, + 0x840001c0, 0x900034a0, 0x05f417ed, 0x80140480, + 0x05f417eb, 0x82080500, 0x000000ff, 0x900034a0, + 0x05f417e7, 0x80140480, 0x05f417e5, 0x820c0500, + 0x0000ff00, 0x840001c0, 0x900034a0, 0x05f417e0, + 0x80140480, 0x05f417de, 0x820c0500, 0x000000ff, + 0x900034a0, 0x05f417da, 0x80140480, 0x05f417d8, 0x82100500, 0x0000ff00, 0x840001c0, 0x900034a0, - 0x05f417d5, 0x80140480, 0x05f417d3, 0x82100500, - 0x000000ff, 0x900034a0, 0x05f417cf, 0x80140480, - 0x05f417cd, 0x900401c0, 0x80080d40, 0x900c01c0, + 0x05f417d3, 0x80140480, 0x05f417d1, 0x82100500, + 0x000000ff, 0x900034a0, 0x05f417cd, 0x80140480, + 0x05f417cb, 0x900401c0, 0x80080d40, 0x900c01c0, 0x80101d40, 0x91a8342d, 0x44043000, 0x80183000, - 0x440c3000, 0x05f5f77e, 0x916c0583, 0x05000003, - 0x641f4407, 0x05f5f7bc, 0x59a00408, 0x59a00a08, + 0x440c3000, 0x05f5f77c, 0x916c0583, 0x05000003, + 0x641f4407, 0x05f5f7ba, 0x59a00408, 0x59a00a08, 0x900409c0, 0x80040d40, 0x4805d806, 0x59a0040a, 0x59a00a0a, 0x900409c0, 0x80040d40, 0x4805d807, 0x6401d801, 0x0501f923, 0x05020003, 0x640b4407, - 0x05f5f7ad, 0x417a8800, 0x497b4001, 0x912c0405, + 0x05f5f7ab, 0x417a8800, 0x497b4001, 0x912c0405, 0x48034002, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4178b800, 0x4178c800, 0x59a0c002, 0x41440000, 0x81ac0400, 0x50026800, 0x813669c0, 0x0500000a, - 0x0505ffcb, 0x05020008, 0x8c64053e, 0x05020005, + 0x0505ffdc, 0x05020008, 0x8c64053e, 0x05020005, 0x59340002, 0x4800c000, 0x4944c001, 0x9060c402, 0x905cbc08, 0x81468800, 0x83440480, 0x00000800, 0x0502101f, 0xb05c0480, 0x05021002, 0x05fdf7ec, @@ -2886,88 +2887,88 @@ static const uint32_t isp_2500_risc_code[] = { 0x800409c0, 0x05000006, 0x80040480, 0x05021004, 0x4178b800, 0x8464cd7e, 0x05fdf7dd, 0x49474000, 0x485dd805, 0x59a00002, 0x4801d803, 0x40ec1000, - 0x0001f81c, 0x4a01d808, 0x00102cc3, 0x5c00c800, + 0x0001f81c, 0x4a01d808, 0x00102cc7, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x8c64053e, 0x0502001a, 0x805cb9c0, 0x05000022, 0x59a00001, 0x805c0400, 0x48034001, 0x59a00a0b, 0x800409c0, 0x05000005, 0x80040480, 0x05021003, 0x4178b800, 0x0501f00e, 0x59a00801, 0x80040906, 0x48074407, 0x485dd805, 0x59a00002, 0x4801d803, 0x4a01d808, - 0x00101bc0, 0x40ec1000, 0x5c00c800, 0x5c00c000, + 0x00101bc2, 0x40ec1000, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0001f01c, 0x59a00001, 0x805c0c00, 0x59a0020b, 0x80040480, 0x48034208, 0x642b4407, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x05f5f74e, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x05f5f74c, 0x59a00801, 0x80040906, 0x48074407, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x05f5f705, 0x4031d800, + 0x5c00c000, 0x5c00b800, 0x05f5f703, 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f40739, 0x59a28800, 0x05fdf797, 0x8d0c050e, - 0x05000003, 0x64074407, 0x05f5f73b, 0x59a8021b, + 0x05f40737, 0x59a28800, 0x05fdf797, 0x8d0c050e, + 0x05000003, 0x64074407, 0x05f5f739, 0x59a8021b, 0x8c00050a, 0x05020005, 0x8c000506, 0x05020003, - 0x645b4407, 0x05f5f734, 0x0501f8a6, 0x05020003, - 0x640b4407, 0x05f5f730, 0x59a00c07, 0x80040902, + 0x645b4407, 0x05f5f732, 0x0501f8a6, 0x05020003, + 0x640b4407, 0x05f5f72e, 0x59a00c07, 0x80040902, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, - 0x912c0406, 0x0501f8b7, 0x4a01d808, 0x00102ce9, + 0x912c0406, 0x0501f8b7, 0x4a01d808, 0x00102ced, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580c, - 0x58ec0002, 0x82000580, 0x00000200, 0x05f40712, - 0x592c000a, 0x050dfe58, 0x05040c48, 0x05f6071a, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f40710, + 0x592c000a, 0x050dfead, 0x05040c53, 0x05f60718, 0x49474001, 0x481a6802, 0x592c000b, 0x82001d80, 0x70000000, 0x05020005, 0x0501f882, 0x0502000c, - 0x640b4407, 0x05f5f70c, 0x82001d80, 0x72000000, - 0x05f6070d, 0x0501f87b, 0x0502087a, 0x05020879, - 0x05020003, 0x640b4407, 0x05f5f703, 0x58ee580c, + 0x640b4407, 0x05f5f70a, 0x82001d80, 0x72000000, + 0x05f6070b, 0x0501f87b, 0x0502087a, 0x05020879, + 0x05020003, 0x640b4407, 0x05f5f701, 0x58ee580c, 0x4a025c05, 0x00008000, 0x497a5a05, 0x592c3209, 0x80183102, 0x592c1801, 0x4a001806, 0x01000000, - 0x0521fc5f, 0x05020003, 0x640f4407, 0x05f5f6f6, - 0x4a01d808, 0x00102d17, 0x1c01f000, 0x592c4000, + 0x0521fcf1, 0x05020003, 0x640f4407, 0x05f5f6f4, + 0x4a01d808, 0x00102d1b, 0x1c01f000, 0x592c4000, 0x592c0006, 0x82000580, 0x01000000, 0x05020003, - 0x64134407, 0x05f5f6ec, 0x4c580000, 0x4c500000, + 0x64134407, 0x05f5f6ea, 0x4c580000, 0x4c500000, 0x4c540000, 0x912c3c06, 0x401ca000, 0x401ca800, 0x5820280b, 0x6008b000, 0x82143580, 0x70000000, - 0x05000002, 0x603cb000, 0x052dfc70, 0x5c00a800, + 0x05000002, 0x603cb000, 0x052dfd36, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x401c0000, 0x58201007, 0x58201808, 0x58202206, 0x80102102, 0x82143580, - 0x70000000, 0x05020005, 0x90103482, 0x05f416d6, + 0x70000000, 0x05020005, 0x90103482, 0x05f416d4, 0x60080800, 0x0501f069, 0x82143580, 0x72000000, - 0x05f606d1, 0x901034aa, 0x05f416cf, 0x603c0800, - 0x0501f862, 0x4a01d808, 0x00102d44, 0x1c01f000, + 0x05f606cf, 0x901034aa, 0x05f416cd, 0x603c0800, + 0x0501f862, 0x4a01d808, 0x00102d48, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580d, 0x58ec0002, - 0x82000580, 0x00000200, 0x05f406b7, 0x592e5800, + 0x82000580, 0x00000200, 0x05f406b5, 0x592e5800, 0x912c0c06, 0x4c580000, 0x4c500000, 0x4c540000, - 0x4004a000, 0x4004a800, 0x603cb000, 0x052dfc47, + 0x4004a000, 0x4004a800, 0x603cb000, 0x052dfd0d, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x40ec1000, 0x64001001, 0x64f01005, 0x48041003, 0x0001f81c, - 0x4a01d808, 0x00102d5f, 0x1c01f000, 0x4031d800, + 0x4a01d808, 0x00102d63, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580d, 0x58ec0002, 0x82000580, - 0x00000200, 0x05f4069c, 0x912c0c06, 0x4c580000, + 0x00000200, 0x05f4069a, 0x912c0c06, 0x4c580000, 0x4c500000, 0x4c540000, 0x4004a000, 0x4004a800, - 0x6030b000, 0x052dfc2d, 0x5c00a800, 0x5c00a000, + 0x6030b000, 0x052dfcf3, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x40ec1000, 0x64001001, 0x64c01005, - 0x48041003, 0x0001f81c, 0x4a01d808, 0x00101bc0, + 0x48041003, 0x0001f81c, 0x4a01d808, 0x00101bc2, 0x1c01f000, 0x0501f803, 0x412d8800, 0x1c01f000, - 0x05e9ffec, 0x0500000e, 0x497a5800, 0x58ec000c, + 0x05e9ffe8, 0x0500000e, 0x497a5800, 0x58ec000c, 0x80000540, 0x05020004, 0x492dd80c, 0x492dd80d, 0x0501f006, 0x58ec000d, 0x48025800, 0x90000401, 0x452c0000, 0x492dd80d, 0x912c0405, 0x492fc857, 0x4803c857, 0x1c01f000, 0x4d2c0000, 0x58ec400c, 0x802041c0, 0x05000007, 0x4823c857, 0x40225800, - 0x592c4001, 0x497a5801, 0x05e9ffe2, 0x05fdf7f9, + 0x592c4001, 0x497a5801, 0x05e9ffde, 0x05fdf7f9, 0x4979d80c, 0x4979d80d, 0x5c025800, 0x1c01f000, 0x60043000, 0x0501f006, 0x60043000, 0x0501f005, 0x60003000, 0x0501f003, 0x60003000, 0x800408c4, - 0x800409c0, 0x05e80c41, 0x4803c857, 0x4807c857, + 0x800409c0, 0x05e80c3d, 0x4803c857, 0x4807c857, 0x480bc857, 0x480fc857, 0x481bc857, 0x48efc857, 0x4819d801, 0x4801d803, 0x4809d806, 0x480dd807, 0x4805d805, 0x40ec1000, 0x0001f81c, 0x4a01d808, - 0x00101bc0, 0x1c01f000, 0x40681000, 0x406c1800, + 0x00101bc2, 0x1c01f000, 0x40681000, 0x406c1800, 0x80002d80, 0x480bc857, 0x480fc857, 0x4813c857, 0x4817c857, 0x8d0c0520, 0x05000004, 0x59a80005, - 0x8c000516, 0x052a057e, 0x4d2c0000, 0x4da00000, - 0x42034000, 0x00109410, 0x59a00018, 0x800001c0, + 0x8c000516, 0x052a0632, 0x4d2c0000, 0x4da00000, + 0x42034000, 0x00109490, 0x59a00018, 0x800001c0, 0x05020014, 0x05006013, 0x480bc020, 0x480fc021, 0x4813c022, 0x4817c023, 0x900811c0, 0x90081552, 0x480bc011, 0x59e00017, 0x8c00050a, 0x60000800, - 0x0002088c, 0x8d0c0530, 0x05f2099b, 0x0002098c, + 0x0002088c, 0x8d0c0530, 0x05f20995, 0x0002098c, 0x6403c017, 0x4203e000, 0x30000001, 0x0501f049, 0x4c040000, 0x4c1c0000, 0x80000800, 0x48074018, 0x59a0381b, 0x481fc857, 0x801c39c0, 0x05020023, @@ -2975,13 +2976,13 @@ static const uint32_t isp_2500_risc_code[] = { 0x48034019, 0x59a0021a, 0x90000402, 0x90000c94, 0x4803421a, 0x05001003, 0x497b421a, 0x41780000, 0x59a03817, 0x801c3c00, 0x0501f02c, 0x4803c856, - 0x05e9ff74, 0x05000007, 0x492f401b, 0x492f401c, + 0x05e9ff70, 0x05000007, 0x492f401b, 0x492f401c, 0x412c3800, 0x497b421d, 0x497a5814, 0x0501f023, 0x5988001e, 0x80000000, 0x4803101e, 0x59a00018, 0x80000040, 0x48034018, 0x59a0021a, 0x59a03817, 0x801c3c00, 0x0501f019, 0x59a0021d, 0x90000402, 0x90000c93, 0x05021004, 0x4803421d, 0x801c3c00, - 0x0501f012, 0x05e9ff5b, 0x0502000b, 0x5988001e, + 0x0501f012, 0x05e9ff57, 0x0502000b, 0x5988001e, 0x80000000, 0x4803101e, 0x59a00018, 0x80000040, 0x48034018, 0x4803c856, 0x59a0021d, 0x801c3c00, 0x0501f006, 0x492f401b, 0x492c3814, 0x412c3800, @@ -2989,23 +2990,23 @@ static const uint32_t isp_2500_risc_code[] = { 0x48103c01, 0x48143a01, 0x5c003800, 0x5c000800, 0x5c034000, 0x5c025800, 0x1c01f000, 0x40681800, 0x406c2000, 0x40703000, 0x480fc857, 0x4813c857, - 0x481bc857, 0x42000000, 0x001097b5, 0x052dfa66, + 0x481bc857, 0x42000000, 0x00109835, 0x052dfb2c, 0x801800d0, 0x40002800, 0x60501100, 0x05fdf786, 0x4c000000, 0x599c0017, 0x8c000512, 0x5c000000, 0x1c01f000, 0x4c000000, 0x599c0018, 0x8c00050e, 0x5c000000, 0x1c01f000, 0x8d0c050e, 0x05000003, - 0x64074407, 0x05f5f5c8, 0x916c0583, 0x05000003, - 0x641f4407, 0x05f5f5c4, 0x599c0017, 0x8c00050a, - 0x05000003, 0x64234407, 0x05f5f5bf, 0x59340405, + 0x64074407, 0x05f5f5c6, 0x916c0583, 0x05000003, + 0x641f4407, 0x05f5f5c2, 0x599c0017, 0x8c00050a, + 0x05000003, 0x64234407, 0x05f5f5bd, 0x59340405, 0x8c000508, 0x05020003, 0x8c00050a, 0x05fe02f1, 0x497a5a05, 0x497a5806, 0x4a025c05, 0x00008000, - 0x0521fba7, 0x05020003, 0x640f4407, 0x05f5f5b2, - 0x4a01d808, 0x00102e5b, 0x1c01f000, 0x592c0006, + 0x0521fc39, 0x05020003, 0x640f4407, 0x05f5f5b0, + 0x4a01d808, 0x00102e5f, 0x1c01f000, 0x592c0006, 0x82000580, 0x01000000, 0x05020003, 0x64134407, - 0x05f5f5a9, 0x59a28c07, 0x0001fac4, 0x05f605aa, + 0x05f5f5a7, 0x59a28c07, 0x0001fac4, 0x05f605a8, 0x05fdf2dc, 0x82001580, 0x0000ffff, 0x05000006, - 0x050dfce1, 0x00000ac4, 0x05020008, 0x050dff31, - 0x0501f006, 0x61be880f, 0x0001fac4, 0x050c0f2d, + 0x050dfd36, 0x00000ac4, 0x05020008, 0x050dffb9, + 0x0501f006, 0x61be880f, 0x0001fac4, 0x050c0fb5, 0x81468840, 0x05fe17fd, 0x1c01f000, 0x4803c856, 0x4c0c0000, 0x4d340000, 0x4d440000, 0x61fa880f, 0x0001fac4, 0x05020006, 0x5934180a, 0x900c1d01, @@ -3014,7 +3015,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x05011000, 0x48efc840, 0x643fc842, 0x40000000, 0x05fd17ff, 0x4a01d80e, 0xbeefbeef, 0x1c01f000, 0x497b4000, 0x497b4001, 0x497b4002, 0x497b4003, - 0x497b4004, 0x1c01f000, 0x42002000, 0x0010cca4, + 0x497b4004, 0x1c01f000, 0x42002000, 0x0010ccb4, 0x41580000, 0x41781000, 0x58100c07, 0x800409c0, 0x0500000c, 0x90041d83, 0x0500000a, 0x90041c86, 0x05001007, 0x90041d8a, 0x05000005, 0x90041c8f, @@ -3022,57 +3023,57 @@ static const uint32_t isp_2500_risc_code[] = { 0x90102424, 0x80100c80, 0x05fc17f0, 0x40080000, 0x59a81262, 0x80080480, 0x05021002, 0x41780000, 0x81640480, 0x05021002, 0x41780000, 0x1c01f000, - 0x05f5f904, 0x05020015, 0x59a86858, 0x82346d80, - 0x3261103c, 0x05020011, 0x052dfafb, 0x0500000d, + 0x05f5f8fe, 0x05020015, 0x59a86858, 0x82346d80, + 0x3261103c, 0x05020011, 0x052dfbc1, 0x0500000d, 0x605c70f4, 0x50386800, 0x82347500, 0x03f00000, 0x82387580, 0x00400000, 0x05020007, 0x82347500, 0x000f0000, 0x82387580, 0x00010000, 0x05000002, - 0x90000541, 0x64030000, 0x1c01f000, 0x05f5f8ed, + 0x90000541, 0x64030000, 0x1c01f000, 0x05f5f8e7, 0x05020004, 0x59a86858, 0x82347580, 0x01651077, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x05f5f8e2, 0x0502000a, + 0x60018800, 0x1c01f000, 0x05f5f8dc, 0x0502000a, 0x59a86858, 0x82347580, 0x01661077, 0x05000006, 0x82347580, 0x01681077, 0x05000003, 0x82347580, 0x01761077, 0x1c01f000, 0x0501f805, 0x60058800, - 0x05000002, 0x60018800, 0x1c01f000, 0x05f5f8d1, + 0x05000002, 0x60018800, 0x1c01f000, 0x05f5f8cb, 0x05020007, 0x59a86858, 0x82347580, 0x01681077, 0x05000003, 0x82347580, 0x01761077, 0x1c01f000, - 0x4803c856, 0x05fdfff6, 0x65034407, 0x05f6051a, - 0x59a0020b, 0x4803c857, 0x800001c0, 0x05f4051a, - 0xb0000485, 0x05f61518, 0x59a0220c, 0x8c100500, + 0x4803c856, 0x05fdfff6, 0x65034407, 0x05f60518, + 0x59a0020b, 0x4803c857, 0x800001c0, 0x05f40518, + 0xb0000485, 0x05f61516, 0x59a0220c, 0x8c100500, 0x0502001b, 0x4803c856, 0x05fdfe82, 0x05020004, - 0x640b4407, 0x4803c856, 0x05f5f50b, 0x59a00c0b, + 0x640b4407, 0x4803c856, 0x05f5f509, 0x59a00c0b, 0x59a01a0b, 0x59a0220c, 0x59a02c07, 0x912e5c02, 0x412cc800, 0x4807c857, 0x480fc857, 0x4813c857, 0x4817c857, 0x4867c857, 0x0501f8cf, 0x05000017, 0x59a00a0b, 0x59a01008, 0x900811c0, 0x59a0180a, 0x900c19c0, 0x412c0000, 0x05fdf68e, 0x4807c856, - 0x59a00c0b, 0x59a01a0b, 0x900c0581, 0x05f604f6, + 0x59a00c0b, 0x59a01a0b, 0x900c0581, 0x05f604f4, 0x59a02c07, 0x91a0cc07, 0x4807c857, 0x4813c857, 0x4817c857, 0x0501f8bc, 0x05000004, 0x59a00a07, - 0x48074407, 0x05f5f4a6, 0x64134407, 0x05f5f4e6, + 0x48074407, 0x05f5f4a4, 0x64134407, 0x05f5f4e4, 0x59a0220c, 0x4813c857, 0x05fdffbd, 0x65034407, - 0x05f604e1, 0x59a00c0b, 0x4807c857, 0x8c100500, + 0x05f604df, 0x59a00c0b, 0x4807c857, 0x8c100500, 0x0502001b, 0x05fdfe4f, 0x05020003, 0x640b4407, - 0x05f5f4d9, 0x59a00a0b, 0xb0040485, 0x05f614da, + 0x05f5f4d7, 0x59a00a0b, 0xb0040485, 0x05f614d8, 0x59a01008, 0x900811c0, 0x59a0180a, 0x900c19c0, - 0x912c0402, 0x05fdfe65, 0x4a01d808, 0x00102f3d, + 0x912c0402, 0x05fdfe65, 0x4a01d808, 0x00102f41, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580c, - 0x58ec0002, 0x82000580, 0x00000200, 0x05f404be, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f404bc, 0x912c1402, 0x59a01a0b, 0x0501f003, 0x91a0140b, 0x60041800, 0x59a00c0b, 0x59a0220c, 0x59a02c07, 0x4807c857, 0x480bc857, 0x50080000, 0x82000500, 0x000000ff, 0x4803c857, 0x480fc857, 0x4813c857, - 0x4817c857, 0x0501f830, 0x64134407, 0x05f404b2, - 0x05f5f46f, 0x05fdff8a, 0x0502000d, 0x4803c856, + 0x4817c857, 0x0501f830, 0x64134407, 0x05f404b0, + 0x05f5f46d, 0x05fdff8a, 0x0502000d, 0x4803c856, 0x61c0083f, 0x61c4103f, 0x64000800, 0x46001000, 0x000001a7, 0x64040800, 0x64041000, 0x64080800, 0x50080000, 0x8400054e, 0x44001000, 0x1c01f000, 0x4803c856, 0x4c5c0000, 0x64103000, 0x60e0b817, - 0x05f1fe9b, 0x805cb840, 0x05000005, 0x501c6800, + 0x05f1fe95, 0x805cb840, 0x05000005, 0x501c6800, 0x90346d02, 0x05fe07fb, 0x90346d41, 0x485fc857, 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4c5c0000, - 0x64103000, 0x60e0b817, 0x05f1fe8d, 0x805cb840, + 0x64103000, 0x60e0b817, 0x05f1fe87, 0x805cb840, 0x05000006, 0x501c6800, 0x82346d00, 0x00000082, 0x05fe07fa, 0x90346d41, 0x485fc857, 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4c5c0000, 0x61c0303f, @@ -3107,7 +3108,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x64103000, 0x64403800, 0x05fdff7c, 0x0500006f, 0x640c3000, 0x46003800, 0x000000a1, 0x64103000, 0x46003800, 0x00000090, 0x05fdff74, 0x05000067, - 0x800c19c0, 0x05e809e1, 0x4178b800, 0x900c1581, + 0x800c19c0, 0x05e809dd, 0x4178b800, 0x900c1581, 0x05000040, 0x64103000, 0x64803800, 0x05fdff5d, 0x0500005e, 0x640c3000, 0x501c0800, 0x4807c857, 0x9c0409c0, 0x8004bd57, 0x485fc857, 0x480fc857, @@ -3128,36 +3129,38 @@ static const uint32_t isp_2500_risc_code[] = { 0x640c3000, 0x501c0800, 0x4807c857, 0x82040d00, 0x000000ff, 0x9c0409c0, 0x8004bd57, 0x4807c857, 0x485fc857, 0x4863c857, 0x4867c857, 0x480fc857, - 0x40301000, 0x41780800, 0x60100000, 0x050dff25, + 0x40301000, 0x41780800, 0x60100000, 0x050dffad, 0x4807c857, 0x800409c0, 0x05000006, 0x60100000, 0x80000c81, 0x805cb910, 0x80040840, 0x05fe07fe, 0x445cc800, 0x485fc857, 0x4863c857, 0x4867c857, 0x90000541, 0x4803c856, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, 0x60003020, 0x80183040, - 0x05000010, 0x052df93c, 0x05fc07fd, 0x05e9fe0c, + 0x05000010, 0x052dfa02, 0x05fc07fd, 0x05e9fe08, 0x605430f4, 0x50183800, 0x821c0500, 0x00007000, 0x05000006, 0x4803508b, 0x821c0500, 0xffff8fff, 0x44003000, 0x80000580, 0x64030000, 0x1c01f000, 0x4803c856, 0x4a034408, 0x0000cccc, 0x90000541, - 0x05fdf7fa, 0x052df928, 0x05fc07ff, 0x600008f4, + 0x05fdf7fa, 0x052df9ee, 0x05fc07ff, 0x600008f4, 0x58040015, 0x82000500, 0xffff8fff, 0x59a8108b, 0x80080540, 0x48000815, 0x64030000, 0x1c01f000, + 0x59a80005, 0x8c000514, 0x05000005, 0x42000000, + 0x001094cf, 0x50000000, 0x90000528, 0x1c01f000, 0x59c400a4, 0x4c580000, 0x4c500000, 0x4c540000, 0x9000050f, 0x90000487, 0x05001008, 0x90006c87, - 0x05ea194a, 0x0c01f807, 0x5c00a800, 0x5c00a000, + 0x05ea193e, 0x0c01f807, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x1c01f000, 0x0501f8e5, 0x05fdf7fb, - 0x001030ab, 0x001030b1, 0x001030d1, 0x001030eb, - 0x0010318d, 0x001030aa, 0x1c01f000, 0x59c40806, + 0x001030b7, 0x001030bd, 0x001030dd, 0x001030f7, + 0x00103199, 0x001030b6, 0x1c01f000, 0x59c40806, 0x8c040500, 0x05020003, 0x84040d40, 0x48078806, 0x1c01f000, 0x59c40005, 0x8c000534, 0x05020638, 0x4a038805, 0xffffffff, 0x42006000, 0x00020000, 0x0501fe1a, 0x59a80015, 0x82000500, 0xfffffffa, 0x84000542, 0x48035015, 0x497b521b, 0x42000800, - 0x001098d3, 0x45780800, 0x497b506f, 0x42006000, + 0x00109953, 0x45780800, 0x497b506f, 0x42006000, 0xffefffff, 0x42006800, 0x40000000, 0x0501fe05, 0x59c40006, 0x82000500, 0xffffff0f, 0x48038806, - 0x60400800, 0x42001000, 0x00103655, 0x050dfca7, + 0x60400800, 0x42001000, 0x00103661, 0x050dfd27, 0x0501f001, 0x42006000, 0xffffffff, 0x42006800, 0x00800000, 0x0501fdf7, 0x6120b001, 0x59c400a4, 0x9000050f, 0x9000058a, 0x0500000d, 0x8058b040, @@ -3165,13 +3168,13 @@ static const uint32_t isp_2500_risc_code[] = { 0x42006800, 0x00018000, 0x0501fdea, 0x42006000, 0xfffeffff, 0x41786800, 0x0501f5e6, 0x497b5010, 0x6403506e, 0x80000580, 0x0501f5ef, 0x4a038805, - 0xffffffff, 0x59a8006e, 0x90000c84, 0x05ea18f7, - 0x0c01f001, 0x001030f4, 0x0010311a, 0x00103186, + 0xffffffff, 0x59a8006e, 0x90000c84, 0x05ea18eb, + 0x0c01f001, 0x00103100, 0x00103126, 0x00103192, 0x4803c856, 0x59c400a3, 0x8400051e, 0x480388a3, 0x6407506e, 0x59c40008, 0x82000540, 0x00000280, - 0x48038808, 0x0501fdb7, 0x42007800, 0x0010947c, - 0x4a007806, 0x11010000, 0x4200a000, 0x00109382, - 0x4200a800, 0x00109483, 0x6008b000, 0x052df858, + 0x48038808, 0x0501fdb7, 0x42007800, 0x001094fc, + 0x4a007806, 0x11010000, 0x4200a000, 0x00109402, + 0x4200a800, 0x00109503, 0x6008b000, 0x052df916, 0x59c40802, 0x84040d0c, 0x48078802, 0x600c0800, 0x497b5077, 0x0501fcca, 0x64075077, 0x497b5073, 0x0501fdcf, 0x42006000, 0xffffffff, 0x42006800, @@ -3180,25 +3183,25 @@ static const uint32_t isp_2500_risc_code[] = { 0x80002540, 0x0500005e, 0x59c40004, 0x90000503, 0x05020065, 0x59a80815, 0x8c040502, 0x05000049, 0x9010058c, 0x0502004c, 0x90100418, 0x8000b104, - 0x41cc1000, 0x42001800, 0x0010947c, 0x50080800, + 0x41cc1000, 0x42001800, 0x001094fc, 0x50080800, 0x500c0000, 0x80040580, 0x05020019, 0x80081000, 0x800c1800, 0x8058b040, 0x05fe07f9, 0x0501fdac, 0x59c80015, 0x84000508, 0x48039015, 0x42006000, 0xffffffff, 0x42006800, 0x00500000, 0x0501fd91, - 0x640b506e, 0x640b5010, 0x05f1f9f6, 0x6140080f, - 0x42001000, 0x001035b3, 0x050dfd5e, 0x59a80015, + 0x640b506e, 0x640b5010, 0x05f1f9e8, 0x6140080f, + 0x42001000, 0x001035bf, 0x050dfdde, 0x59a80015, 0x84000506, 0x48035015, 0x0501f56e, 0x59cc0806, 0x82040d80, 0x11010000, 0x05020027, 0x59cc0800, 0x82040500, 0x00ffffff, 0x05000018, 0x82000580, 0x000000ef, 0x05020015, 0x59cc0801, 0x82040500, 0x00ffffff, 0x82000580, 0x000000ef, 0x0502000f, - 0x91cca407, 0x4200a800, 0x00109382, 0x6008b000, + 0x91cca407, 0x4200a800, 0x00109402, 0x6008b000, 0x50500800, 0x50540000, 0x80040480, 0x05001007, 0x05020011, 0x8050a000, 0x8054a800, 0x8058b040, 0x05fe07f8, 0x0501f00c, 0x59a80015, 0x84000502, 0x48035015, 0x59c80015, 0x84000508, 0x48039015, - 0x41cca000, 0x4200a800, 0x0010947c, 0x6024b000, - 0x0529ffef, 0x0501fd6e, 0x42006000, 0xffffffff, + 0x41cca000, 0x4200a800, 0x001094fc, 0x6024b000, + 0x052df8ad, 0x0501fd6e, 0x42006000, 0xffffffff, 0x42006800, 0x00080000, 0x0501fd56, 0x42006000, 0xfff7ffff, 0x41786800, 0x0501fd52, 0x42006000, 0xffffffff, 0x60006880, 0x0501fd4e, 0x59c40004, @@ -3206,118 +3209,118 @@ static const uint32_t isp_2500_risc_code[] = { 0x0501f453, 0x1c01f000, 0x1c01f000, 0x59a80010, 0x90006d8f, 0x05000003, 0x9000059b, 0x05020c1e, 0x1c01f000, 0x59a80015, 0x84000506, 0x48035015, - 0x497b5077, 0x59a80010, 0x90000c9e, 0x05ea1853, - 0x0c01f001, 0x001031c4, 0x001031d4, 0x001031f6, - 0x0010320a, 0x00103228, 0x0010324d, 0x0010326b, - 0x00103294, 0x001032b2, 0x001032cd, 0x00103302, - 0x00103326, 0x0010333a, 0x00103347, 0x0010335c, - 0x0010336e, 0x00103373, 0x00103394, 0x001033b3, - 0x001033d3, 0x001033f2, 0x0010341b, 0x00103455, - 0x00103475, 0x0010348b, 0x001034c5, 0x001034db, - 0x001034eb, 0x001034ec, 0x4803c856, 0x601ed800, - 0x0505ff2a, 0x05000006, 0x42006000, 0xffffffd7, + 0x497b5077, 0x59a80010, 0x90000c9e, 0x05ea1847, + 0x0c01f001, 0x001031d0, 0x001031e0, 0x00103202, + 0x00103216, 0x00103234, 0x00103259, 0x00103277, + 0x001032a0, 0x001032be, 0x001032d9, 0x0010330e, + 0x00103332, 0x00103346, 0x00103353, 0x00103368, + 0x0010337a, 0x0010337f, 0x001033a0, 0x001033bf, + 0x001033df, 0x001033fe, 0x00103427, 0x00103461, + 0x00103481, 0x00103497, 0x001034d1, 0x001034e7, + 0x001034f7, 0x001034f8, 0x4803c856, 0x601ed800, + 0x0505ff54, 0x05000006, 0x42006000, 0xffffffd7, 0x41786800, 0x0501fd13, 0x0501f009, 0x59c40006, 0x82000500, 0xffffff0f, 0x48038806, 0x4a038805, - 0x000000f0, 0x0509fa63, 0x0505fe91, 0x1c01f000, + 0x000000f0, 0x0509fa8d, 0x0505febb, 0x1c01f000, 0x4803c856, 0x42006000, 0xbf7fffff, 0x42006800, - 0x00400000, 0x0501fd03, 0x05f1f96a, 0x64075010, - 0x42001000, 0x00103655, 0x050dfbc6, 0x0501fc8f, - 0x6140080f, 0x42001000, 0x001035b3, 0x050df4cd, + 0x00400000, 0x0501fd03, 0x05f1f95c, 0x64075010, + 0x42001000, 0x00103661, 0x050dfc46, 0x0501fc8f, + 0x6140080f, 0x42001000, 0x001035bf, 0x050df54d, 0x59a80073, 0x90000594, 0x0502001e, 0x4803c857, 0x42006000, 0xffbfffff, 0x41786800, 0x0501fcf1, 0x59c40004, 0x90000503, 0x05020016, 0x42001000, - 0x001035b3, 0x050dfba0, 0x59cc1006, 0x82081580, + 0x001035bf, 0x050dfc20, 0x59cc1006, 0x82081580, 0x11020000, 0x05020010, 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, 0x8c000504, 0x05020007, - 0x42000000, 0x00109746, 0x0529fea7, 0x59a80015, + 0x42000000, 0x001097c6, 0x0529ff65, 0x59a80015, 0x84000544, 0x48035015, 0x64435010, 0x0501f180, 0x1c01f000, 0x0501f3b4, 0x4803c856, 0x640f5010, 0x42006000, 0xbf3fffff, 0x42006800, 0x00100000, - 0x0501fcd0, 0x42001000, 0x00103655, 0x050dfb95, - 0x0501fc5e, 0x42001000, 0x001035b3, 0x050dfb7e, - 0x42007800, 0x00109482, 0x46007800, 0x11020000, + 0x0501fcd0, 0x42001000, 0x00103661, 0x050dfc15, + 0x0501fc5e, 0x42001000, 0x001035bf, 0x050dfbfe, + 0x42007800, 0x00109502, 0x46007800, 0x11020000, 0x60140800, 0x0501f3ce, 0x59a80073, 0x80000540, - 0x0500001a, 0x4803c857, 0x42001000, 0x001035b3, - 0x050dfb71, 0x59a80073, 0x90000594, 0x05020014, + 0x0500001a, 0x4803c857, 0x42001000, 0x001035bf, + 0x050dfbf1, 0x59a80073, 0x90000594, 0x05020014, 0x59cc1006, 0x82081580, 0x11020000, 0x05020010, 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, - 0x8c000504, 0x05020007, 0x42000000, 0x00109746, - 0x0529fe75, 0x59a80015, 0x84000544, 0x48035015, + 0x8c000504, 0x05020007, 0x42000000, 0x001097c6, + 0x0529ff33, 0x59a80015, 0x84000544, 0x48035015, 0x64135010, 0x0501f003, 0x1c01f000, 0x0501f382, 0x4803c856, 0x64175010, 0x91cca406, 0x4200a800, - 0x00109482, 0x6014b000, 0x0529ff31, 0x42007800, - 0x00109482, 0x46007800, 0x11030000, 0x8d0c0506, + 0x00109502, 0x6014b000, 0x0529ffef, 0x42007800, + 0x00109502, 0x46007800, 0x11030000, 0x8d0c0506, 0x05020012, 0x59a80015, 0x8c000500, 0x0502000f, 0x59a8080f, 0x82040580, 0x00ffffff, 0x0500000b, - 0x82040d00, 0x000000ff, 0x82040400, 0x00101a21, + 0x82040d00, 0x000000ff, 0x82040400, 0x00101a23, 0x50000800, 0x80040910, 0x60101000, 0x0501fb10, 0x05000007, 0x0501fc32, 0x6010b000, 0x91cca407, - 0x4200a800, 0x00109483, 0x0529ff15, 0x60140800, + 0x4200a800, 0x00109503, 0x0529ffd3, 0x60140800, 0x0501f38b, 0x59a80073, 0x80000540, 0x0500001a, - 0x4803c857, 0x42001000, 0x001035b3, 0x050dfb2e, + 0x4803c857, 0x42001000, 0x001035bf, 0x050dfbae, 0x59a80073, 0x90000594, 0x05020014, 0x59cc1006, 0x82081580, 0x11030000, 0x05020010, 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, 0x8c000504, - 0x05020007, 0x42000000, 0x00109746, 0x0529fe32, + 0x05020007, 0x42000000, 0x001097c6, 0x0529fef0, 0x59a80015, 0x84000544, 0x48035015, 0x641b5010, 0x0501f003, 0x1c01f000, 0x0501f33f, 0x4803c856, - 0x641f5010, 0x91cca406, 0x4200a800, 0x00109482, - 0x6014b000, 0x0529feee, 0x42007800, 0x00109482, + 0x641f5010, 0x91cca406, 0x4200a800, 0x00109502, + 0x6014b000, 0x0529ffac, 0x42007800, 0x00109502, 0x46007800, 0x11040000, 0x8d0c0506, 0x0502001b, 0x59a80015, 0x8c000500, 0x05020018, 0x599c0017, 0x8c000500, 0x05000015, 0x599c1402, 0xb00804bf, - 0x05e61f66, 0x4c080000, 0x82081400, 0x00101a21, + 0x05e61f5a, 0x4c080000, 0x82081400, 0x00101a23, 0x50081000, 0x82081500, 0x000000ff, 0x480b500f, - 0x600c0800, 0x050dfed9, 0x5c000800, 0x60101000, - 0x0501fac7, 0x05000005, 0x05fdfbab, 0x05000003, + 0x600c0800, 0x050dff59, 0x5c000800, 0x60101000, + 0x0501fac7, 0x05000005, 0x05fdfba3, 0x05000003, 0x4803c856, 0x850e1d46, 0x60140800, 0x0501f344, 0x59a80073, 0x80000540, 0x0500001a, 0x4803c857, - 0x42001000, 0x001035b3, 0x050dfae7, 0x59a80073, + 0x42001000, 0x001035bf, 0x050dfb67, 0x59a80073, 0x90000594, 0x05020014, 0x59cc1006, 0x82081580, 0x11040000, 0x05020010, 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, 0x8c000504, 0x05020007, - 0x42000000, 0x00109746, 0x0529fdeb, 0x59a80015, + 0x42000000, 0x001097c6, 0x0529fea9, 0x59a80015, 0x84000544, 0x48035015, 0x64235010, 0x0501f003, 0x1c01f000, 0x0501f2f8, 0x4803c856, 0x64275010, - 0x91cca406, 0x4200a800, 0x00109482, 0x6014b000, - 0x0529fea7, 0x42007800, 0x00109482, 0x46007800, + 0x91cca406, 0x4200a800, 0x00109502, 0x6014b000, + 0x0529ff65, 0x42007800, 0x00109502, 0x46007800, 0x11050100, 0x8d0c0506, 0x05020008, 0x59a80015, 0x8c000500, 0x05020005, 0x0501fa2b, 0x05020003, 0x4803c856, 0x850e1d46, 0x60140800, 0x0501fb10, - 0x4d3c0000, 0x60067800, 0x0521fd15, 0x5c027800, + 0x4d3c0000, 0x60067800, 0x0521fd9f, 0x5c027800, 0x1c01f000, 0x59a80073, 0x80000540, 0x05000031, - 0x4803c857, 0x42001000, 0x001035b3, 0x050dfaae, + 0x4803c857, 0x42001000, 0x001035bf, 0x050dfb2e, 0x59a80073, 0x90000594, 0x0502002b, 0x59cc1006, 0x82080500, 0x11050000, 0x82000580, 0x11050000, 0x05020025, 0x8c080510, 0x05000011, 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, 0x8c000504, - 0x05020007, 0x42000000, 0x00109746, 0x0529fdae, + 0x05020007, 0x42000000, 0x001097c6, 0x0529fe6c, 0x59a80015, 0x84000544, 0x48035015, 0x6407506f, 0x642b5010, 0x0501f815, 0x0501f012, 0x80000540, 0x05020011, 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, 0x8c000504, 0x05020007, 0x42000000, - 0x00109746, 0x0529fd9c, 0x59a80015, 0x84000544, + 0x001097c6, 0x0529fe5a, 0x59a80015, 0x84000544, 0x48035015, 0x497b506f, 0x643b5010, 0x0501f05d, 0x1c01f000, 0x0501f2a8, 0x4803c856, 0x642f5010, - 0x42001000, 0x00109483, 0x4008a800, 0x6080b000, + 0x42001000, 0x00109503, 0x4008a800, 0x6080b000, 0x4600a800, 0xffffffff, 0x8054a800, 0x8058b040, - 0x05fe07fc, 0x42007800, 0x00109482, 0x46007800, - 0x11060000, 0x42001000, 0x00109483, 0x8d0c0506, + 0x05fe07fc, 0x42007800, 0x00109502, 0x46007800, + 0x11060000, 0x42001000, 0x00109503, 0x8d0c0506, 0x05000005, 0x50080000, 0x46001000, 0x00ffffff, 0x0501f00c, 0x50080800, 0x82040d00, 0x0000ffff, 0x59a8000f, 0x82000500, 0x000000ff, 0x82000540, 0x00000100, 0x800000e0, 0x80040d40, 0x44041000, 0x60840800, 0x0501f2b2, 0x59a80073, 0x80000540, 0x05000010, 0x4803c857, 0x59a80073, 0x42001000, - 0x001035b3, 0x050dfa54, 0x59a80073, 0x82000580, + 0x001035bf, 0x050dfad4, 0x59a80073, 0x82000580, 0x00000084, 0x05020008, 0x59cc1006, 0x82081580, 0x11060000, 0x05020004, 0x64335010, 0x0501f003, 0x1c01f000, 0x0501f270, 0x4803c856, 0x64375010, - 0x91cca406, 0x4200a800, 0x00109482, 0x6084b000, - 0x0529fe1f, 0x42007800, 0x00109482, 0x46007800, + 0x91cca406, 0x4200a800, 0x00109502, 0x6084b000, + 0x0529fedd, 0x42007800, 0x00109502, 0x46007800, 0x11070000, 0x60840800, 0x0501f291, 0x59a80073, 0x80000540, 0x05000011, 0x4803c857, 0x59a80073, - 0x42001000, 0x001035b3, 0x050dfa33, 0x82000580, + 0x42001000, 0x001035bf, 0x050dfab3, 0x82000580, 0x00000084, 0x0502000a, 0x59cc1006, 0x82081580, 0x11070000, 0x05020006, 0x6407506f, 0x0501fa35, 0x643b5010, 0x0501f003, 0x1c01f000, 0x0501f24e, @@ -3325,104 +3328,104 @@ static const uint32_t isp_2500_risc_code[] = { 0x497b5073, 0x42006000, 0xffffffff, 0x42006800, 0x00300000, 0x0501fb67, 0x42006000, 0xffdfffff, 0x41786800, 0x0501fb63, 0x6140080f, 0x42001000, - 0x001035b3, 0x050df1f1, 0x4803c856, 0x59a80073, + 0x001035bf, 0x050df271, 0x4803c856, 0x59a80073, 0x80000540, 0x05020238, 0x1c01f000, 0x4803c856, - 0x64475010, 0x91cca406, 0x4200a800, 0x00109482, - 0x6014b000, 0x0529fde6, 0x4200a800, 0x00109482, + 0x64475010, 0x91cca406, 0x4200a800, 0x00109502, + 0x6014b000, 0x0529fea4, 0x4200a800, 0x00109502, 0x4600a800, 0x11020000, 0x8d0c0506, 0x05020013, 0x59a8000f, 0x82000d00, 0xffff0000, 0x0500000f, 0x82000500, 0x000000ff, 0x0500000c, 0x82000c00, - 0x00101a21, 0x50040800, 0x80040910, 0xb00405be, + 0x00101a23, 0x50040800, 0x80040910, 0xb00405be, 0x05000006, 0x82040580, 0x00000080, 0x05000003, 0x60101000, 0x0501f9c2, 0x60140800, 0x0501f244, 0x59a80073, 0x80000540, 0x0500001c, 0x4803c857, - 0x42001000, 0x001035b3, 0x050df9e7, 0x59a80073, + 0x42001000, 0x001035bf, 0x050dfa67, 0x59a80073, 0x90000594, 0x05020014, 0x59cc1006, 0x82081580, 0x11030000, 0x05020010, 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, 0x8c000504, 0x05020007, - 0x42000000, 0x00109746, 0x0529fceb, 0x59a80015, + 0x42000000, 0x001097c6, 0x0529fda9, 0x59a80015, 0x84000544, 0x48035015, 0x644b5010, 0x0501f804, 0x0501f002, 0x0501f9f8, 0x1c01f000, 0x4803c856, - 0x644f5010, 0x91cca406, 0x4200a800, 0x00109482, - 0x6014b000, 0x0529fda6, 0x4200a800, 0x00109482, + 0x644f5010, 0x91cca406, 0x4200a800, 0x00109502, + 0x6014b000, 0x0529fe64, 0x4200a800, 0x00109502, 0x4600a800, 0x11030000, 0x8d0c0506, 0x05020012, 0x59a80015, 0x8c000500, 0x0502000f, 0x59a8080f, 0x82040580, 0x00ffffff, 0x0500000b, 0x82040d00, - 0x000000ff, 0x82040400, 0x00101a21, 0x50000800, + 0x000000ff, 0x82040400, 0x00101a23, 0x50000800, 0x80040910, 0x60101000, 0x0501f985, 0x05000002, 0x0501faa7, 0x60140800, 0x0501f205, 0x59a80073, 0x80000540, 0x0500001c, 0x4803c857, 0x42001000, - 0x001035b3, 0x050df9a8, 0x59a80073, 0x90000594, + 0x001035bf, 0x050dfa28, 0x59a80073, 0x90000594, 0x05020014, 0x59cc1006, 0x82081580, 0x11040000, 0x05020010, 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, 0x8c000504, 0x05020007, 0x42000000, - 0x00109746, 0x0529fcac, 0x59a80015, 0x84000544, + 0x001097c6, 0x0529fd6a, 0x59a80015, 0x84000544, 0x48035015, 0x64535010, 0x0501f804, 0x0501f002, 0x0501f9b9, 0x1c01f000, 0x4803c856, 0x64575010, - 0x91cca406, 0x4200a800, 0x00109482, 0x6014b000, - 0x0529fd67, 0x4200a800, 0x00109482, 0x4600a800, + 0x91cca406, 0x4200a800, 0x00109502, 0x6014b000, + 0x0529fe25, 0x4200a800, 0x00109502, 0x4600a800, 0x11040000, 0x8d0c0506, 0x0502001b, 0x59a80015, 0x8c000500, 0x05020018, 0x599c0017, 0x8c000500, - 0x05000015, 0x599c1402, 0xb00804bf, 0x05e61ddf, - 0x4c080000, 0x82081400, 0x00101a21, 0x50081000, + 0x05000015, 0x599c1402, 0xb00804bf, 0x05e61dd3, + 0x4c080000, 0x82081400, 0x00101a23, 0x50081000, 0x82081500, 0x000000ff, 0x480b500f, 0x600c0800, - 0x050dfd52, 0x5c000800, 0x60101000, 0x0501f940, - 0x05000005, 0x05fdfa24, 0x05000003, 0x4803c856, + 0x050dfdd2, 0x5c000800, 0x60101000, 0x0501f940, + 0x05000005, 0x05fdfa1c, 0x05000003, 0x4803c856, 0x850e1d46, 0x60140800, 0x0501f1bd, 0x59a80073, 0x80000540, 0x05000037, 0x4803c857, 0x42001000, - 0x001035b3, 0x050df960, 0x59a80073, 0x90000594, + 0x001035bf, 0x050df9e0, 0x59a80073, 0x90000594, 0x0502002f, 0x59cc1006, 0x82080500, 0x11050000, 0x82000580, 0x11050000, 0x05020029, 0x8c080510, 0x0500000f, 0x0501faac, 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, 0x8c000504, 0x05020007, - 0x42000000, 0x00109746, 0x0529fc5f, 0x59a80015, + 0x42000000, 0x001097c6, 0x0529fd1d, 0x59a80015, 0x84000544, 0x48035015, 0x0501f011, 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, 0x8c000504, - 0x05020007, 0x42000000, 0x00109746, 0x0529fc52, + 0x05020007, 0x42000000, 0x001097c6, 0x0529fd10, 0x59a80015, 0x84000544, 0x48035015, 0x90000541, 0x0501fa91, 0x497b506f, 0x0501f002, 0x6407506f, 0x59cc1007, 0x8c08053c, 0x05000002, 0x6423521b, 0x645b5010, 0x0501f804, 0x0501f002, 0x0501f956, 0x1c01f000, 0x4803c856, 0x91cca406, 0x4200a800, - 0x00109482, 0x6014b000, 0x0529fd05, 0x645f5010, + 0x00109502, 0x6014b000, 0x0529fdc3, 0x645f5010, 0x59a8006f, 0x8c000500, 0x05000006, 0x42001000, - 0x00109482, 0x46001000, 0x11050100, 0x0501f002, + 0x00109502, 0x46001000, 0x11050100, 0x0501f002, 0x646f5010, 0x8d0c0506, 0x05020008, 0x59a80015, 0x8c000500, 0x05020005, 0x0501f883, 0x05020003, 0x4803c856, 0x850e1d46, 0x60140800, 0x0501f968, - 0x4d3c0000, 0x60067800, 0x0521fb6d, 0x5c027800, + 0x4d3c0000, 0x60067800, 0x0521fbf7, 0x5c027800, 0x1c01f000, 0x59a80073, 0x80000540, 0x05000013, - 0x4803c857, 0x42001000, 0x001035b3, 0x050df906, + 0x4803c857, 0x42001000, 0x001035bf, 0x050df986, 0x59a80073, 0x82000580, 0x00000084, 0x0502000a, 0x59cc1006, 0x82081580, 0x11060000, 0x05020006, 0x80000580, 0x0501fa54, 0x64635010, 0x0501f804, 0x0501f002, 0x0501f920, 0x1c01f000, 0x4803c856, - 0x64675010, 0x91cca406, 0x4200a800, 0x00109482, - 0x6084b000, 0x0529fcce, 0x42003800, 0x00109483, + 0x64675010, 0x91cca406, 0x4200a800, 0x00109502, + 0x6084b000, 0x0529fd8c, 0x42003800, 0x00109503, 0x8d0c0506, 0x05020017, 0x401c2800, 0x50141000, 0x80080130, 0x80000000, 0x40001800, 0x82081500, 0x00ffffff, 0x800000f0, 0x80080540, 0x44002800, 0x59a8080f, 0x82040d00, 0x000000ff, 0x400c1000, - 0x80081104, 0x82082400, 0x00109483, 0x50101000, + 0x80081104, 0x82082400, 0x00109503, 0x50101000, 0x900c0503, 0x0c01f805, 0x80081540, 0x44082000, - 0x60840800, 0x0501f12a, 0x001034b2, 0x001034b7, - 0x001034bc, 0x001034c1, 0x800408f0, 0x40040000, + 0x60840800, 0x0501f12a, 0x001034be, 0x001034c3, + 0x001034c8, 0x001034cd, 0x800408f0, 0x40040000, 0x82081500, 0x00ffffff, 0x1c01f000, 0x800408e0, 0x40040000, 0x82081500, 0xff00ffff, 0x1c01f000, 0x800408d0, 0x40040000, 0x82081500, 0xffff00ff, 0x1c01f000, 0x40040000, 0x82081500, 0xffffff00, 0x1c01f000, 0x59a80073, 0x80000540, 0x05000013, - 0x4803c857, 0x42001000, 0x001035b3, 0x050df8b6, + 0x4803c857, 0x42001000, 0x001035bf, 0x050df936, 0x59a80073, 0x82000580, 0x00000084, 0x0502000a, 0x59cc1006, 0x82081580, 0x11070000, 0x05020006, 0x6407506f, 0x0501f8b7, 0x646b5010, 0x0501f804, 0x0501f002, 0x0501f8d0, 0x1c01f000, 0x90000541, 0x0501f9fd, 0x646f5010, 0x91cca406, 0x4200a800, - 0x00109482, 0x59a82073, 0x40100000, 0x8000b104, + 0x00109502, 0x59a82073, 0x40100000, 0x8000b104, 0x40580800, 0x5450a800, 0x8050a000, 0x8054a800, 0x8058b040, 0x05fe07fc, 0x0501f0ed, 0x1c01f000, 0x1c01f000, 0x4803c856, 0x60103000, 0x42004000, - 0x00109483, 0x599c2817, 0x8c140514, 0x0502001c, + 0x00109503, 0x599c2817, 0x8c140514, 0x0502001c, 0x600c1000, 0x40200000, 0x80080400, 0x50000800, 0x82042580, 0xffffffff, 0x05020005, 0x80081040, 0x80183040, 0x05fe07f8, 0x0501f054, 0x800811c0, @@ -3440,15 +3443,15 @@ static const uint32_t isp_2500_risc_code[] = { 0x800c0540, 0x44002000, 0x59a80015, 0x84000540, 0x48035015, 0x40580000, 0x60802800, 0x80142c80, 0x40080000, 0x600c3800, 0x801c0480, 0x800000ca, - 0x80142d40, 0x82144c00, 0x00101a21, 0x50242800, + 0x80142d40, 0x82144c00, 0x00101a23, 0x50242800, 0x82142d00, 0x000000ff, 0x4817500f, 0x4c040000, - 0x40140800, 0x05edfdfd, 0x5c000800, 0x40001800, + 0x40140800, 0x05edfdef, 0x5c000800, 0x40001800, 0x500c0000, 0x80100540, 0x44001800, 0x59a80015, - 0x84000540, 0x48035015, 0x4200a800, 0x00109483, - 0x4020a000, 0x6010b000, 0x0529fc11, 0x90000541, + 0x84000540, 0x48035015, 0x4200a800, 0x00109503, + 0x4020a000, 0x6010b000, 0x0529fccf, 0x90000541, 0x0501f002, 0x80000580, 0x1c01f000, 0x4807c857, 0x480bc857, 0x4008b000, 0x91cca407, 0x4200a800, - 0x00109483, 0x40541000, 0x0529fc05, 0x40041800, + 0x00109503, 0x40541000, 0x0529fcc3, 0x40041800, 0x41782000, 0x600c0000, 0x900c1ca0, 0x05001004, 0x80102000, 0x80000040, 0x05fdf7fc, 0x40041800, 0x801021c0, 0x05000004, 0x900c1ca0, 0x80102040, @@ -3456,88 +3459,88 @@ static const uint32_t isp_2500_risc_code[] = { 0x801020c2, 0x800c1840, 0x05fe07fe, 0x80083c00, 0x91cc2c07, 0x80142c00, 0x50140000, 0x80102d00, 0x05020011, 0x80100540, 0x44003800, 0x82042400, - 0x00101a21, 0x50102800, 0x82142d00, 0x000000ff, - 0x4817500f, 0x4c040000, 0x40140800, 0x05edfdbf, + 0x00101a23, 0x50102800, 0x82142d00, 0x000000ff, + 0x4817500f, 0x4c040000, 0x40140800, 0x05edfdb1, 0x5c000800, 0x59a80015, 0x84000540, 0x48035015, 0x80000580, 0x1c01f000, 0x4807c856, 0x605c1100, - 0x59a81832, 0x0529fb16, 0x05fdf82e, 0x1c01f000, + 0x59a81832, 0x0529fbd4, 0x05fdf826, 0x1c01f000, 0x4807c856, 0x6080b000, 0x91cca407, 0x4200a800, - 0x001098d3, 0x0529f409, 0x4807c856, 0x050dfe82, + 0x00109953, 0x0529f4c7, 0x4807c856, 0x050dff02, 0x61dc0801, 0x0501f8d5, 0x497b2804, 0x497b2805, 0x497b2826, 0x497b2827, 0x6006d800, 0x42006000, 0xbe7fffff, 0x42006800, 0x00018000, 0x0501f92d, 0x42006000, 0xfffeffff, 0x41786800, 0x0501f929, - 0x497b5032, 0x60b40800, 0x42001000, 0x0010362b, - 0x0509f7b6, 0x4807c856, 0x05fdffe8, 0x497b5010, + 0x497b5032, 0x60b40800, 0x42001000, 0x00103637, + 0x050df036, 0x4807c856, 0x05fdffe8, 0x497b5010, 0x497b5073, 0x1c01f000, 0x4807c856, 0x42006000, 0xffffffff, 0x60a06800, 0x0501f11a, 0x4807c856, - 0x05fdffd2, 0x050dfb7e, 0x4df00000, 0x050dfda1, - 0x5c03e000, 0x050c0b66, 0x59c400a4, 0x9000050f, + 0x05fdffd2, 0x050dfbfe, 0x4df00000, 0x050dfe21, + 0x5c03e000, 0x050c0be6, 0x59c400a4, 0x9000050f, 0x90000582, 0x0502000a, 0x42006000, 0xffffffff, 0x42006800, 0x00200000, 0x0501f90a, 0x42006000, 0xffdfffff, 0x41786800, 0x0501f906, 0x497b5010, 0x61dc0801, 0x0501f8a1, 0x59c400a3, 0x82000500, 0xbf20bfff, 0x82000540, 0x0001c000, 0x480388a3, 0x84000520, 0x480388a3, 0x497b5032, 0x60b40800, - 0x42001000, 0x0010362b, 0x0509f788, 0x497b5073, + 0x42001000, 0x00103637, 0x050df008, 0x497b5073, 0x59b400f5, 0x8c000500, 0x05020003, 0x90000541, 0x480368f5, 0x800400c4, 0x82000400, 0x00002000, 0x4803910a, 0x59b400f6, 0x90000518, 0x05fe07fe, - 0x4a0368f0, 0x0010947b, 0x42000000, 0x00109482, + 0x4a0368f0, 0x001094fb, 0x42000000, 0x00109502, 0x4c040000, 0x40043800, 0x50000800, 0x82040d80, 0x11010000, 0x0500000c, 0x50000800, 0x4807c857, 0x8d0c052a, 0x05000008, 0x4c000000, 0x821c3d40, - 0x0000dc00, 0x42000000, 0x0010947c, 0x05e5fcfc, + 0x0000dc00, 0x42000000, 0x001094fc, 0x05e5fcf0, 0x5c000000, 0x5c000800, 0x480368f1, 0x82040400, 0x0000dc00, 0x480368f3, 0x59c400a4, 0x9000050f, 0x90000588, 0x05020013, 0x4c5c0000, 0x4c600000, 0x59c4b805, 0x8c5c053a, 0x05020004, 0x42000000, - 0x00109743, 0x0529fa8c, 0x4a038805, 0x20000000, - 0x05f1f8ac, 0x4000c000, 0x05f1f827, 0x6006d800, + 0x001097c3, 0x0529fb4a, 0x4a038805, 0x20000000, + 0x05f1f89e, 0x4000c000, 0x05f1f819, 0x6006d800, 0x497b5010, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x59c8010b, 0x8c000502, 0x05fc07e8, 0x59c408a4, 0x90040d0f, 0x90040d8b, 0x05020005, 0x59a80810, 0x82040d40, 0x00002000, 0x0501f004, 0x59a8086e, 0x82040d40, 0x00001000, 0x48075032, 0x59a80877, 0x800409c0, 0x05020005, 0x6140080f, 0x42001000, - 0x001035b3, 0x050df877, 0x1c01f000, 0x4807c856, - 0x05fdff5a, 0x050dfb06, 0x4df00000, 0x050dfd29, - 0x5c03e000, 0x050c0aee, 0x59c400a4, 0x9000050f, + 0x001035bf, 0x050df8f7, 0x1c01f000, 0x4807c856, + 0x05fdff5a, 0x050dfb86, 0x4df00000, 0x050dfda9, + 0x5c03e000, 0x050c0b6e, 0x59c400a4, 0x9000050f, 0x90000582, 0x0502000a, 0x42006000, 0xffffffff, 0x42006800, 0x00200000, 0x0501f892, 0x42006000, - 0xffdfffff, 0x41786800, 0x0501f88e, 0x0505faaa, - 0x05000010, 0x0505fabe, 0x0502000e, 0x4a035013, - 0x0000aaaa, 0x4c040000, 0x05edfd2b, 0x59a8001f, + 0xffdfffff, 0x41786800, 0x0501f88e, 0x0505fad4, + 0x05000010, 0x0505fae8, 0x0502000e, 0x4a035013, + 0x0000aaaa, 0x4c040000, 0x05edfd1d, 0x59a8001f, 0x82000500, 0xffff0000, 0x80040540, 0x4803501f, - 0x5c000800, 0x64035014, 0x0505fa0e, 0x0501f005, - 0x64175071, 0x60000001, 0x05edfc8a, 0x05fdff3f, + 0x5c000800, 0x64035014, 0x0505fa38, 0x0501f005, + 0x64175071, 0x60000001, 0x05edfc7c, 0x05fdff3f, 0x1c01f000, 0x0501f809, 0x42006000, 0xbf7f7fff, 0x41786800, 0x0501f073, 0x42006000, 0xbf7f7fff, - 0x41786800, 0x0501f06f, 0x0505faa1, 0x05020009, + 0x41786800, 0x0501f06f, 0x0505facb, 0x05020009, 0x59c40006, 0x82000540, 0x000000f0, 0x48038806, 0x42006000, 0xbfffffff, 0x41786800, 0x0501f865, 0x1c01f000, 0x40680800, 0x800408d0, 0x59a80015, 0x8c000506, 0x05000006, 0x59a8000f, 0x82000500, 0x000000ff, 0x80040540, 0x0501f003, 0x82040540, 0x000000f7, 0x480388a7, 0x1c01f000, 0x4807c856, - 0x42000000, 0x001097db, 0x0529fa1b, 0x60143000, + 0x42000000, 0x0010985b, 0x0529fad9, 0x60143000, 0x4d3c0000, 0x4c180000, 0x60343000, 0x600a7800, - 0x0501f028, 0x4807c856, 0x42000000, 0x00109800, - 0x0529fa11, 0x60003000, 0x4d3c0000, 0x4c180000, + 0x0501f028, 0x4807c856, 0x42000000, 0x00109880, + 0x0529facf, 0x60003000, 0x4d3c0000, 0x4c180000, 0x603c3000, 0x600a7800, 0x0501f01e, 0x4807c856, - 0x42000000, 0x001097fe, 0x0529fa07, 0x600c3000, + 0x42000000, 0x0010987e, 0x0529fac5, 0x600c3000, 0x4d3c0000, 0x4c180000, 0x60383000, 0x600a7804, - 0x0501f014, 0x4807c856, 0x42000000, 0x001097fd, - 0x0529f9fd, 0x60103000, 0x4d3c0000, 0x4c180000, + 0x0501f014, 0x4807c856, 0x42000000, 0x0010987d, + 0x0529fabb, 0x60103000, 0x4d3c0000, 0x4c180000, 0x60403000, 0x600a7804, 0x0501f00a, 0x4807c856, - 0x42000000, 0x00109745, 0x0529f9f3, 0x60043000, + 0x42000000, 0x001097c5, 0x0529fab1, 0x60043000, 0x4d3c0000, 0x4c180000, 0x60303000, 0x600a7800, - 0x61fc19ff, 0x601c2000, 0x05f9ff80, 0x5c003000, - 0x4d400000, 0x0529f85e, 0x60aa8000, 0x0201f800, - 0x0010b5d3, 0x5c028000, 0x5c027800, 0x1c01f000, - 0x4807c856, 0x05011000, 0x4a03c840, 0x0010947b, + 0x61fc19ff, 0x601c2000, 0x05f9ff78, 0x5c003000, + 0x4d400000, 0x0529f91c, 0x60aa8000, 0x0201f800, + 0x0010b5e0, 0x5c028000, 0x5c027800, 0x1c01f000, + 0x4807c856, 0x05011000, 0x4a03c840, 0x001094fb, 0x6503c842, 0x40000000, 0x05fd17ff, 0x42007800, - 0x0010947b, 0x64447800, 0x803c7800, 0x4a007800, + 0x001094fb, 0x64447800, 0x803c7800, 0x4a007800, 0x220000ef, 0x4a007801, 0x000000ef, 0x4a007802, 0x01380000, 0x64007803, 0x4a007804, 0xffffffff, 0x64007805, 0x1c01f000, 0x40686000, 0x406c6800, @@ -3550,21 +3553,21 @@ static const uint32_t isp_2500_risc_code[] = { 0x4a039005, 0x00000140, 0x60180000, 0x80000040, 0x05fe07ff, 0x05fdf7f6, 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x59c4b805, 0x485fc856, 0x8c5c053a, - 0x05020004, 0x42000000, 0x00109743, 0x0529f9a2, - 0x4a038805, 0x20000000, 0x05edffc2, 0x4000c000, - 0x05edff3d, 0x4a038805, 0x04000000, 0x5c00c000, + 0x05020004, 0x42000000, 0x001097c3, 0x0529fa60, + 0x4a038805, 0x20000000, 0x05edffb4, 0x4000c000, + 0x05edff2f, 0x4a038805, 0x04000000, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x497a6a00, 0x4a026c00, 0x00000707, 0x497a6801, 0x497a6808, 0x497a6809, 0x497a6806, 0x497a6807, 0x497a6c0b, 0x497a680c, 0x8d0c0520, 0x05020005, 0x5934080f, 0x59340010, - 0x80040540, 0x05e60ad9, 0x4a026a04, 0x00000100, + 0x80040540, 0x05e60acd, 0x4a026a04, 0x00000100, 0x497a6a03, 0x59340402, 0x82000500, 0x000000ff, 0x48026c02, 0x497a6c04, 0x497a6a05, 0x497a6c05, 0x497a6811, 0x4d2c0000, 0x5934000d, 0x49466c03, - 0x80025d40, 0x05000003, 0x05e5fe63, 0x497a680d, + 0x80025d40, 0x05000003, 0x05e5fe57, 0x497a680d, 0x5c025800, 0x599c0401, 0x48026a0b, 0x599c0208, - 0x48026c12, 0x4a02680a, 0x00008000, 0x0501f746, - 0x60140000, 0x80000d80, 0x0501f024, 0x0501fd38, + 0x48026c12, 0x4a02680a, 0x00008000, 0x0501f752, + 0x60140000, 0x80000d80, 0x0501f024, 0x0501fd41, 0x05020013, 0x59a8021b, 0x8c00050a, 0x0502000d, 0x59340212, 0x82000500, 0x0000ff00, 0x4803c857, 0x05000008, 0x59340a00, 0x8c04051e, 0x0000028a, @@ -3575,64 +3578,64 @@ static const uint32_t isp_2500_risc_code[] = { 0x05000004, 0x492fc857, 0x60000820, 0x0501f003, 0x492fc857, 0x80000d80, 0x4803c857, 0x80028540, 0x1c01f000, 0x490fc857, 0x8d0c0500, 0x05fe07f0, - 0x0501fce3, 0x05fe07ea, 0x59340200, 0x8c00050e, + 0x0501fcec, 0x05fe07ea, 0x59340200, 0x8c00050e, 0x05fc07e7, 0x0001f28a, 0x4d480000, 0x4d4c0000, - 0x592e9009, 0x592e980a, 0x0501fbe3, 0x5c029800, + 0x592e9009, 0x592e980a, 0x0501fbea, 0x5c029800, 0x5c029000, 0x05fc07c7, 0x0001f28d, 0x492fc857, 0x592e8c07, 0x83440d80, 0x000007fc, 0x05000004, 0x83440480, 0x000007f0, 0x05021010, 0x0001fac4, - 0x0502000e, 0x0501fcdb, 0x0502000e, 0x0511fe98, + 0x0502000e, 0x0501fce4, 0x0502000e, 0x0511ff08, 0x05000015, 0x59340002, 0x4802600b, 0x4936600a, 0x492e6009, 0x642a6407, 0x61027000, 0x0005f905, 0x80000580, 0x0501f00b, 0x60a00000, 0x0501f008, - 0x0501fce7, 0x05fc07fd, 0x910c0d03, 0x05000003, + 0x0501fcf0, 0x05fc07fd, 0x910c0d03, 0x05000003, 0x60100000, 0x0501f002, 0x60a40000, 0x80000540, 0x1c01f000, 0x60b00000, 0x05fdf7fd, 0x492fc857, 0x592e8c07, 0x4947c857, 0x83440c80, 0x00000800, 0x60280000, 0x0502114b, 0x592c4208, 0x4823c857, - 0x9020050f, 0x0c01f001, 0x001037a5, 0x00103815, - 0x00103856, 0x0010385e, 0x00103866, 0x001037a2, - 0x001037a2, 0x001037a2, 0x00103870, 0x001038bb, - 0x001038d7, 0x001037a2, 0x001037a2, 0x001037a2, - 0x001037a2, 0x001037a2, 0x4803c857, 0x60300000, + 0x9020050f, 0x0c01f001, 0x001037b1, 0x00103821, + 0x00103862, 0x0010386a, 0x00103872, 0x001037ae, + 0x001037ae, 0x001037ae, 0x0010387c, 0x001038c7, + 0x001038e3, 0x001037ae, 0x001037ae, 0x001037ae, + 0x001037ae, 0x001037ae, 0x4803c857, 0x60300000, 0x0501f134, 0x592c1009, 0x82081500, 0x00ffffff, 0x59a8000f, 0x80084d80, 0x60400000, 0x0500012d, - 0x0501fc2c, 0x0500002b, 0x4803c857, 0x90004d9d, - 0x05020016, 0x0505ff98, 0x59340405, 0x4c000000, - 0x0501fc83, 0x5c000000, 0x05000004, 0x8c20050a, + 0x0501fc33, 0x0500002b, 0x4803c857, 0x90004d9d, + 0x05020016, 0x0505ffd3, 0x59340405, 0x4c000000, + 0x0501fc8c, 0x5c000000, 0x05000004, 0x8c20050a, 0x05000020, 0x80000580, 0x44002800, 0x59340008, 0x48002802, 0x59340009, 0x48002801, 0x59340006, 0x48002804, 0x59340007, 0x48002803, 0x6014b000, - 0x051dfd9a, 0x0501f136, 0x4803c857, 0x90004d9a, + 0x051dfe24, 0x0501f136, 0x4803c857, 0x90004d9a, 0x05020003, 0x40101000, 0x0501f113, 0x4803c857, 0x90004d9b, 0x05020003, 0x40181000, 0x0501f10e, 0x4803c857, 0x90004d9c, 0x0500010f, 0x90004d99, 0x60280000, 0x05000103, 0x60280000, 0x05020114, - 0x59a80086, 0x8c000502, 0x05000016, 0x0501fc5c, + 0x59a80086, 0x8c000502, 0x05000016, 0x0501fc65, 0x05000014, 0x59340212, 0x82000500, 0x0000ff00, 0x60401000, 0x0502000b, 0x60201000, 0x59a8021b, 0x8c000506, 0x05020008, 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, 0x05000005, - 0x0501fe88, 0x60700000, 0x40181000, 0x050200ee, - 0x0511fe17, 0x050000f6, 0x4936600a, 0x492e6009, + 0x0501fe94, 0x60700000, 0x40181000, 0x050200ee, + 0x0511fe87, 0x050000f6, 0x4936600a, 0x492e6009, 0x64066407, 0x8c20050a, 0x05000004, 0x592c0405, 0x8400055c, 0x48025c05, 0x4c200000, 0x4d3c0000, - 0x60027830, 0x0201f800, 0x0010b652, 0x5c027800, + 0x60027830, 0x0201f800, 0x0010b660, 0x5c027800, 0x5c004000, 0x8c200512, 0x0500000b, 0x599c0018, 0x8c000518, 0x05000008, 0x592c000a, 0x82000500, 0x00000380, 0x5934080a, 0x80040d40, 0x84040d54, 0x4806680a, 0x417a7800, 0x0501f8f1, 0x600c0800, 0x0501f8fa, 0x600a7000, 0x0005f905, 0x80000580, - 0x0501f0ea, 0x0001fac4, 0x050200d5, 0x0501fc26, - 0x05000009, 0x0501fc1e, 0x050200d5, 0x4c600000, - 0x4178c000, 0x60027830, 0x417a6000, 0x05f1f998, + 0x0501f0ea, 0x0001fac4, 0x050200d5, 0x0501fc2f, + 0x05000009, 0x0501fc27, 0x050200d5, 0x4c600000, + 0x4178c000, 0x60027830, 0x417a6000, 0x05f1f98e, 0x5c00c000, 0x59a80086, 0x8c000502, 0x05000016, - 0x0501fc13, 0x05000014, 0x59340212, 0x82000500, + 0x0501fc1c, 0x05000014, 0x59340212, 0x82000500, 0x0000ff00, 0x60401000, 0x0502000b, 0x60201000, 0x59a8021b, 0x8c000506, 0x05020008, 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, - 0x05000005, 0x0501fe3f, 0x60700000, 0x40181000, - 0x050200a5, 0x0511fdce, 0x050000ad, 0x5934080a, + 0x05000005, 0x0501fe4b, 0x60700000, 0x40181000, + 0x050200a5, 0x0511fe3e, 0x050000ad, 0x5934080a, 0x8c200512, 0x0500000c, 0x599c0018, 0x8c000518, 0x05000009, 0x592c000a, 0x82000500, 0x00000380, 0x82041500, 0xfffffc7f, 0x80080d40, 0x84040d54, @@ -3640,19 +3643,19 @@ static const uint32_t isp_2500_risc_code[] = { 0x492e6009, 0x64066407, 0x417a7800, 0x0501f8b0, 0x60140800, 0x0501f8b9, 0x600e7000, 0x0005f905, 0x80000580, 0x0501f0a9, 0x0001fac4, 0x05020094, - 0x0501fbf9, 0x05020096, 0x051dfcd3, 0x0500008c, + 0x0501fc02, 0x05020096, 0x051dfd5d, 0x0500008c, 0x80000580, 0x0501f0a1, 0x0001fac4, 0x0502008c, - 0x0501fbf1, 0x0502008e, 0x051df91d, 0x05000084, + 0x0501fbfa, 0x0502008e, 0x051df9a7, 0x05000084, 0x80000580, 0x0501f099, 0x0001fac4, 0x05020084, 0x83444d80, 0x000007fe, 0x60280000, 0x0502006d, - 0x051dfcd3, 0x0500007a, 0x80000580, 0x0501f08f, + 0x051dfd5d, 0x0500007a, 0x80000580, 0x0501f08f, 0xb0200530, 0x05020004, 0x8c20050e, 0x60300000, 0x05020064, 0x8c20050a, 0x0500000c, 0x4d3c0000, 0x600278a0, 0x8c20050e, 0x05020003, 0x853e7d56, - 0x853e7d1c, 0x82200500, 0x000004a0, 0x0501fb89, + 0x853e7d1c, 0x82200500, 0x000004a0, 0x0501fb90, 0x5c027800, 0x0501f07a, 0x8c200508, 0x0502001c, 0x592c1009, 0x82081500, 0x00ffffff, 0x59a8000f, - 0x80084d80, 0x60400000, 0x0500004e, 0x0501fb4d, + 0x80084d80, 0x60400000, 0x0500004e, 0x0501fb54, 0x05000022, 0x4803c857, 0x90004d9a, 0x05020003, 0x40101000, 0x0501f04c, 0x4803c857, 0x90004d9b, 0x05020003, 0x40181000, 0x0501f047, 0x4803c857, @@ -3660,17 +3663,17 @@ static const uint32_t isp_2500_risc_code[] = { 0x0500003c, 0x60280000, 0x0501f04d, 0x0001fac4, 0x0502004b, 0x4d3c0000, 0x600278a0, 0x8c20050e, 0x05020003, 0x853e7d56, 0x853e7d1c, 0x82200500, - 0x00000090, 0x0501fb4b, 0x5c027800, 0x60280000, + 0x00000090, 0x0501fb52, 0x5c027800, 0x60280000, 0x0502002c, 0x0501f04e, 0x916c0583, 0x601c0800, - 0x05020005, 0x051dfc3a, 0x05000006, 0x80000580, - 0x0501f04a, 0x0501fbc5, 0x05000042, 0x0501f044, - 0x0501fbc2, 0x0500002e, 0x0501f041, 0x0001fac4, + 0x05020005, 0x051dfcc4, 0x05000006, 0x80000580, + 0x0501f04a, 0x0501fbce, 0x05000042, 0x0501f044, + 0x0501fbcb, 0x0500002e, 0x0501f041, 0x0001fac4, 0x0502002f, 0x916c0583, 0x05020036, 0x8c200508, 0x05000008, 0x4c600000, 0x4178c000, 0x60027830, - 0x417a6000, 0x05f1f8f2, 0x5c00c000, 0x0501f034, - 0x0501fb75, 0x05000009, 0x0501fb6d, 0x05020024, + 0x417a6000, 0x05f1f8e8, 0x5c00c000, 0x0501f034, + 0x0501fb7e, 0x05000009, 0x0501fb76, 0x05020024, 0x4c600000, 0x4178c000, 0x60027830, 0x417a6000, - 0x05f1f8e7, 0x5c00c000, 0x480bc856, 0x051dfac5, + 0x05f1f8dd, 0x5c00c000, 0x480bc856, 0x051dfb4f, 0x05000013, 0x80000580, 0x0501f028, 0x05fdf7e4, 0x480bc857, 0x60640800, 0x40001000, 0x6008b000, 0x0501f008, 0x480bc857, 0x40000800, 0x6008b000, @@ -3685,56 +3688,57 @@ static const uint32_t isp_2500_risc_code[] = { 0x5932680a, 0x59341200, 0x813e79c0, 0x05000003, 0x84081540, 0x0501f002, 0x84081500, 0x480a6a00, 0x1c01f000, 0x40680800, 0x5932680a, 0x5c000000, - 0x4c000000, 0x4803c857, 0x4937c857, 0x90040586, - 0x05020003, 0x6018000c, 0x0501f014, 0x90040584, - 0x05020003, 0x60100008, 0x0501f010, 0x90040587, - 0x601c000e, 0x0500000d, 0x90040583, 0x600c000e, - 0x0500000a, 0x90040585, 0x60140008, 0x05000007, - 0x90040589, 0x60240008, 0x05000004, 0x9004058b, - 0x602c000e, 0x05e608c1, 0x4803c857, 0x48026c00, - 0x90040d86, 0x05020004, 0x59341404, 0x800811c0, - 0x05e408ba, 0x1c01f000, 0x40683000, 0x0501f80b, + 0x4c000000, 0x4803c857, 0x4937c857, 0x83340580, + 0x0010993e, 0x0500001f, 0x90040586, 0x05020003, + 0x6018000c, 0x0501f014, 0x90040584, 0x05020003, + 0x60100008, 0x0501f010, 0x90040587, 0x601c000e, + 0x0500000d, 0x90040583, 0x600c000e, 0x0500000a, + 0x90040585, 0x60140008, 0x05000007, 0x90040589, + 0x60240008, 0x05000004, 0x9004058b, 0x602c000e, + 0x05e608b2, 0x4803c857, 0x48026c00, 0x90040d86, + 0x05020004, 0x59341404, 0x800811c0, 0x05e408ab, + 0x1c01f000, 0x40683000, 0x0501f80b, 0x41358800, + 0x05000002, 0x41798800, 0x1c01f000, 0x40683000, + 0x0501f80a, 0x41358800, 0x05000002, 0x41798800, + 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, + 0x4947c857, 0x481bc857, 0x83440480, 0x00000800, + 0x05021037, 0x83441400, 0x00108c00, 0x50080000, + 0x80026d40, 0x0502000f, 0x4c180000, 0x4d2c0000, + 0x05e5fbfd, 0x412e6800, 0x5c025800, 0x5c003000, + 0x0500002b, 0x45341000, 0x497a680d, 0x497a6810, + 0x497a680f, 0x4c180000, 0x05fdfda8, 0x5c003000, + 0x59340a12, 0x4c040000, 0x0501ffae, 0x5c000800, + 0x05000009, 0x82180500, 0x00ffff00, 0x05000008, + 0x59a8100f, 0x82081500, 0x00ffff00, 0x80080580, + 0x05000003, 0x80000580, 0x0501f004, 0x82180500, + 0x000000ff, 0x800000d0, 0x80040d80, 0x05000003, + 0x4803c857, 0x48026a12, 0x83440580, 0x000007fe, + 0x05020004, 0x4a026802, 0x00fffffe, 0x0501f006, + 0x59340002, 0x80180580, 0x05000003, 0x481bc857, + 0x481a6802, 0x80000580, 0x1c01f000, 0x4803c856, + 0x90000541, 0x05fdf7fd, 0x0501f805, 0x60058800, + 0x05020002, 0x60018800, 0x1c01f000, 0x4947c857, + 0x83440480, 0x00000800, 0x0502100f, 0x83441400, + 0x00108c00, 0x50080000, 0x80026d40, 0x05000009, + 0x0501fab4, 0x05020008, 0x8d0c0502, 0x05000004, + 0x59340200, 0x8c00050e, 0x05000003, 0x90000541, + 0x1c01f000, 0x80000580, 0x05fdf7fe, 0x5c000000, + 0x4c000000, 0x4803c857, 0x4947c857, 0x0501f805, + 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, + 0x4d2c0000, 0x4d300000, 0x83440480, 0x00000800, + 0x0502101d, 0x83441400, 0x00108c00, 0x50080000, + 0x80026d40, 0x05000014, 0x45781000, 0x5934000d, + 0x80025d40, 0x05e60bc8, 0x59366011, 0x813261c0, + 0x0500000a, 0x4c640000, 0x5930c800, 0x59325809, + 0x0519ffba, 0x05e60bc0, 0x0005f8e7, 0x90666540, + 0x05fe07fa, 0x5c00c800, 0x0501fcbf, 0x41365800, + 0x05e5fbb1, 0x80000580, 0x5c026000, 0x5c025800, + 0x1c01f000, 0x90000541, 0x05fdf7fc, 0x0001fac4, 0x41358800, 0x05000002, 0x41798800, 0x1c01f000, - 0x40683000, 0x0501f80a, 0x41358800, 0x05000002, - 0x41798800, 0x1c01f000, 0x5c000000, 0x4c000000, - 0x4803c857, 0x4947c857, 0x481bc857, 0x83440480, - 0x00000800, 0x05021037, 0x83441400, 0x00108b80, - 0x50080000, 0x80026d40, 0x0502000f, 0x4c180000, - 0x4d2c0000, 0x05e5fc0c, 0x412e6800, 0x5c025800, - 0x5c003000, 0x0500002b, 0x45341000, 0x497a680d, - 0x497a6810, 0x497a680f, 0x4c180000, 0x05fdfdab, - 0x5c003000, 0x59340a12, 0x4c040000, 0x0501ff87, - 0x5c000800, 0x05000009, 0x82180500, 0x00ffff00, - 0x05000008, 0x59a8100f, 0x82081500, 0x00ffff00, - 0x80080580, 0x05000003, 0x80000580, 0x0501f004, - 0x82180500, 0x000000ff, 0x800000d0, 0x80040d80, - 0x05000003, 0x4803c857, 0x48026a12, 0x83440580, - 0x000007fe, 0x05020004, 0x4a026802, 0x00fffffe, - 0x0501f006, 0x59340002, 0x80180580, 0x05000003, - 0x481bc857, 0x481a6802, 0x80000580, 0x1c01f000, - 0x4803c856, 0x90000541, 0x05fdf7fd, 0x0501f805, - 0x60058800, 0x05020002, 0x60018800, 0x1c01f000, - 0x4947c857, 0x83440480, 0x00000800, 0x0502100f, - 0x83441400, 0x00108b80, 0x50080000, 0x80026d40, - 0x05000009, 0x0501faae, 0x05020008, 0x8d0c0502, - 0x05000004, 0x59340200, 0x8c00050e, 0x05000003, - 0x90000541, 0x1c01f000, 0x80000580, 0x05fdf7fe, - 0x5c000000, 0x4c000000, 0x4803c857, 0x4947c857, - 0x0501f805, 0x60058800, 0x05000002, 0x60018800, - 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x83440480, - 0x00000800, 0x0502101d, 0x83441400, 0x00108b80, - 0x50080000, 0x80026d40, 0x05000014, 0x45781000, - 0x5934000d, 0x80025d40, 0x05e60bd7, 0x59366011, - 0x813261c0, 0x0500000a, 0x4c640000, 0x5930c800, - 0x59325809, 0x0519ff33, 0x05e60bcf, 0x0005f8e7, - 0x90666540, 0x05fe07fa, 0x5c00c800, 0x0501fcb6, - 0x41365800, 0x05e5fbc0, 0x80000580, 0x5c026000, - 0x5c025800, 0x1c01f000, 0x90000541, 0x05fdf7fc, - 0x0001fac4, 0x41358800, 0x05000002, 0x41798800, - 0x1c01f000, 0x4c580000, 0x59cc0001, 0x4937c857, - 0x82000500, 0x00ffffff, 0x48026802, 0x497a6c01, - 0x497a6a01, 0x59340200, 0x84000502, 0x48026a00, - 0x0501ff0e, 0x05020018, 0x59340403, 0x82000580, + 0x4c580000, 0x59cc0001, 0x4937c857, 0x82000500, + 0x00ffffff, 0x48026802, 0x497a6c01, 0x497a6a01, + 0x59340200, 0x82000500, 0xffffdffd, 0x48026a00, + 0x0501ff34, 0x05020018, 0x59340403, 0x82000580, 0x000007fe, 0x05000005, 0x59a8021b, 0x8c00050a, 0x05020011, 0x0501f008, 0x59cc0408, 0x8c000518, 0x0500000d, 0x59cc0009, 0x48035028, 0x59cc000a, @@ -3744,218 +3748,220 @@ static const uint32_t isp_2500_risc_code[] = { 0x90000520, 0x05000005, 0x84040d40, 0x59a8121b, 0x8408155a, 0x480b521b, 0x5934000a, 0x82000500, 0xffffffee, 0x80040540, 0x4802680a, 0x91cca40b, - 0x9134ac06, 0x6008b000, 0x0525ff65, 0x91cca40d, - 0x9134ac08, 0x6008b000, 0x0525ff61, 0x59cc0a18, - 0x82040480, 0x00000800, 0x0502100a, 0x82040480, - 0x00000400, 0x05001003, 0x60000808, 0x0501f005, - 0x82040480, 0x00000200, 0x05001002, 0x60000804, - 0x42001000, 0x00109471, 0x58080201, 0x80041480, - 0x05001002, 0x40000800, 0x48066a04, 0x59340403, - 0x82000580, 0x000007fe, 0x05020003, 0x59cc0a08, - 0x48066a04, 0x0501fc7a, 0x5c00b000, 0x1c01f000, - 0x59a8021b, 0x4937c857, 0x8c000508, 0x05000007, - 0x84000556, 0x4803c857, 0x4803521b, 0x42001000, - 0x0010c15e, 0x0509fb5c, 0x59cc0207, 0x4803c857, - 0x48026a05, 0x59cc020a, 0x4803c857, 0x48026c05, - 0x59341200, 0x599c0818, 0x5934180a, 0x4807c857, - 0x480bc857, 0x480fc857, 0x59cc2006, 0x82102500, - 0xff000000, 0x82102580, 0x02000000, 0x05000007, - 0x8c00050e, 0x05000009, 0x8c0c0514, 0x05000003, - 0x8c0c050e, 0x05000005, 0x8c040518, 0x05000003, - 0x8408154a, 0x0501f002, 0x8408150a, 0x8c000510, - 0x05000009, 0x8c0c0514, 0x05000003, 0x8c0c0510, - 0x05000005, 0x8c040518, 0x05000003, 0x8408154e, - 0x0501f002, 0x8408150e, 0x8c000512, 0x05000009, - 0x8c0c0514, 0x05000003, 0x8c0c0512, 0x05000005, - 0x8c040518, 0x05000003, 0x8408155c, 0x0501f002, - 0x8408151c, 0x480a6a00, 0x1c01f000, 0x4803c856, - 0x4c5c0000, 0x4d2c0000, 0x4c580000, 0x5934000d, - 0x80025d40, 0x05000023, 0x592c0003, 0x90000488, - 0x0500100a, 0x412cb800, 0x592c0001, 0x80025d40, - 0x05fe07fa, 0x05e5faff, 0x0500002e, 0x492fc857, - 0x492cb801, 0x0501f01b, 0x912c0c04, 0x6020b000, - 0x50040000, 0x82000580, 0xffffffff, 0x05020006, - 0x80041000, 0x50080000, 0x82000580, 0xffffffff, - 0x05000005, 0x90040c02, 0x8058b040, 0x05fe07f5, - 0x05e1ff6a, 0x45480800, 0x454c1000, 0x592c1803, - 0x800c1800, 0x480e5803, 0x480fc857, 0x0501f010, - 0x05e5fae4, 0x05000013, 0x492fc857, 0x492e680d, - 0x497a5802, 0x64065803, 0x494a5804, 0x494e5805, - 0x912c0c06, 0x6038b000, 0x46000800, 0xffffffff, - 0x80040800, 0x8058b040, 0x05fe07fc, 0x90000541, - 0x5c00b000, 0x5c025800, 0x5c00b800, 0x1c01f000, - 0x80000580, 0x05fdf7fb, 0x4803c856, 0x4d3c0000, - 0x4d2c0000, 0x5934000d, 0x80025d40, 0x0500001c, - 0x592c0002, 0x80000540, 0x0502001c, 0x412e7800, - 0x0501f89d, 0x05020019, 0x46000800, 0xffffffff, - 0x46001000, 0xffffffff, 0x4813c857, 0x480fc857, - 0x580c0003, 0x90000c82, 0x05021012, 0x480fc857, - 0x400c0000, 0x812c0580, 0x05020004, 0x580c0001, - 0x4802680d, 0x0501f003, 0x580c0001, 0x48002001, - 0x400e5800, 0x05e5fabf, 0x90000541, 0x5c025800, - 0x5c027800, 0x1c01f000, 0x80000580, 0x05fdf7fc, - 0x80000040, 0x48001803, 0x4803c857, 0x05fdf7f7, - 0x64225a07, 0x0001f32c, 0x64a65a07, 0x0001f32c, - 0x64aa5a07, 0x0001f32c, 0x64a25a07, 0x0001f32c, - 0x643a5a07, 0x0001f32c, 0x4943c857, 0x4d440000, - 0x4d340000, 0x4d2c0000, 0x4c580000, 0x61c0b00f, - 0x417a8800, 0x0001fac4, 0x05020007, 0x8d3c0506, - 0x05000004, 0x59340200, 0x8c00050e, 0x05020002, - 0x0501f811, 0x81468800, 0x8058b040, 0x05fe07f6, - 0x83440480, 0x00000800, 0x05021006, 0x8d3c0502, - 0x05000004, 0x61c2880f, 0x6040b000, 0x05fdf7ee, - 0x5c00b000, 0x5c025800, 0x5c026800, 0x5c028800, - 0x1c01f000, 0x4d2c0000, 0x4c600000, 0x4c5c0000, - 0x4178b800, 0x5936580f, 0x812e59c0, 0x05000026, - 0x592c0205, 0x82000500, 0x000000ff, 0x90000592, - 0x0500001e, 0x8d3c0500, 0x05000003, 0x0501f840, - 0x0502001a, 0x592cc000, 0x497a5800, 0x805cb9c0, - 0x05020009, 0x59340010, 0x812c0580, 0x05020004, - 0x497a680f, 0x497a6810, 0x0501f008, 0x4862680f, - 0x0501f006, 0x4860b800, 0x59340010, 0x812c0580, - 0x05020002, 0x485e6810, 0x4a025a05, 0x00000103, - 0x49425a07, 0x497a580a, 0x0519ff1f, 0x0001fb2c, - 0x40625800, 0x05fdf7dd, 0x412cb800, 0x592e5800, - 0x05fdf7da, 0x5c00b800, 0x5c00c000, 0x5c025800, - 0x1c01f000, 0x4803c856, 0x41781800, 0x5934000f, - 0x80025d40, 0x05000014, 0x592c0006, 0x80200580, - 0x592c0000, 0x05000003, 0x412c1800, 0x05fdf7f9, - 0x592c0a05, 0x82040d00, 0x000000ff, 0x90040d92, - 0x05fc07fa, 0x497a5800, 0x800c19c0, 0x05000007, - 0x48001800, 0x80000540, 0x05020003, 0x480e6810, - 0x90000541, 0x1c01f000, 0x4802680f, 0x80000540, - 0x05fe07fd, 0x497a6810, 0x05fdf7fa, 0x592c0009, - 0x81480580, 0x05020003, 0x592c000a, 0x814c0580, - 0x1c01f000, 0x4803c856, 0x4c580000, 0x413c1800, - 0x400c2000, 0x593c0002, 0x80000540, 0x05020014, - 0x6020b000, 0x900c0c04, 0x50040000, 0x81480580, - 0x05020005, 0x80041000, 0x50080000, 0x814c0580, - 0x0500000b, 0x90040c02, 0x8058b040, 0x05fe07f7, - 0x400c2000, 0x580c0001, 0x80001d40, 0x05fe07f1, - 0x90000541, 0x5c00b000, 0x1c01f000, 0x80000580, - 0x05fdf7fd, 0x4937c857, 0x4c580000, 0x4d2c0000, - 0x5934000d, 0x80025d40, 0x05020011, 0x05e5fa05, - 0x0500000c, 0x492e680d, 0x64065802, 0x497a5803, - 0x912c0c04, 0x6040b000, 0x46000800, 0xffffffff, - 0x80040800, 0x8058b040, 0x05fe07fc, 0x90000541, - 0x5c025800, 0x5c00b000, 0x1c01f000, 0x4d2c0000, - 0x592e5801, 0x05e5fa0c, 0x5c025800, 0x497a5801, - 0x05fdf7ee, 0x4d2c0000, 0x5936580d, 0x812e59c0, - 0x05000005, 0x4937c857, 0x497a680d, 0x05e5fa02, - 0x90000541, 0x5c025800, 0x1c01f000, 0x59340405, - 0x4937c857, 0x4803c857, 0x8c000508, 0x1c01f000, - 0x4933c857, 0x5930380a, 0x581c0200, 0x8400051a, - 0x48003a00, 0x1c01f000, 0x0501f805, 0x60058800, - 0x05020002, 0x60018800, 0x1c01f000, 0x5930000a, - 0x50000000, 0x4933c857, 0x4803c857, 0x8c00050e, - 0x1c01f000, 0x5930000a, 0x50000000, 0x8c00050a, - 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x4933c856, 0x0501f8a5, - 0x05000005, 0x59340400, 0x82000d00, 0x000000ff, - 0x90041585, 0x1c01f000, 0x0501f805, 0x60058800, - 0x05020002, 0x60018800, 0x1c01f000, 0x4d340000, - 0x83ac0400, 0x000007fe, 0x50000000, 0x80026d40, - 0x05000003, 0x59340200, 0x8c00051a, 0x5c026800, - 0x1c01f000, 0x4937c857, 0x493fc857, 0x59340403, - 0x81ac0400, 0x50000000, 0x81340580, 0x05e20e27, - 0x59341200, 0x813e79c0, 0x05000003, 0x8408155e, - 0x0501f002, 0x8408151e, 0x480a6a00, 0x1c01f000, - 0x4937c857, 0x05edfe54, 0x05000005, 0x59a80828, - 0x42001000, 0x00103bd0, 0x0509fad2, 0x1c01f000, - 0x4937c857, 0x42001000, 0x00103bd0, 0x0509f9ae, - 0x59a8121b, 0x84081512, 0x480b521b, 0x1c01f000, - 0x4008d000, 0x4020d800, 0x909d3c84, 0x409ce000, - 0x0201f800, 0x0010c24e, 0x589c0000, 0x589c2001, - 0x589c2802, 0x589c3003, 0x909d3c04, 0x800001c0, - 0x1c01f000, 0x4d340000, 0x406a6800, 0x0501f803, - 0x5c026800, 0x1c01f000, 0x5934000f, 0x8d0c0512, - 0x05020005, 0x5934140b, 0x80081040, 0x05001002, - 0x480a6c0b, 0x80000540, 0x00020ad1, 0x1c01f000, - 0x4803c857, 0x4947c857, 0x4c300000, 0x90006530, - 0x05000005, 0x4c000000, 0x051df86d, 0x5c000000, - 0x0502000a, 0x8c00050e, 0x05000005, 0x0001fac4, - 0x05020006, 0x4937c857, 0x05fdfd92, 0x80000580, - 0x5c006000, 0x1c01f000, 0x90000541, 0x05fdf7fd, - 0x4803c857, 0x4c580000, 0x4d440000, 0x40001000, - 0x80000d80, 0x61c0b00f, 0x4c040000, 0x40068800, - 0x4c080000, 0x40080000, 0x05fdffe4, 0x5c001000, - 0x5c000800, 0x80040800, 0x8058b040, 0x05fe07f7, - 0x8c080514, 0x05000005, 0x84081514, 0x6004b000, - 0x61f0080f, 0x05fdf7f1, 0x4d300000, 0x4d400000, - 0x61fe89ff, 0x42026000, 0x0010cc5c, 0x497a600a, - 0x60a68000, 0x0509fd0e, 0x4df00000, 0x0201f800, - 0x0010bb8e, 0x0201f800, 0x0010c0f3, 0x5c03e000, - 0x05080cf3, 0x5c028000, 0x5c026000, 0x5c028800, - 0x5c00b000, 0x1c01f000, 0x0501f805, 0x60058800, - 0x05000002, 0x60018800, 0x1c01f000, 0x4c5c0000, - 0x59340400, 0x8200bd80, 0x00000606, 0x5c00b800, - 0x1c01f000, 0x4c5c0000, 0x59340400, 0x8200bd80, - 0x00000404, 0x5c00b800, 0x1c01f000, 0x0501f805, + 0x9134ac06, 0x6008b000, 0x0529f81f, 0x91cca40d, + 0x9134ac08, 0x6008b000, 0x0529f81b, 0x59cc0a18, + 0x59a80006, 0x8c00050c, 0x05020013, 0x82040480, + 0x00000800, 0x0502100a, 0x82040480, 0x00000400, + 0x05001003, 0x60000808, 0x0501f005, 0x82040480, + 0x00000200, 0x05001002, 0x60000804, 0x42001000, + 0x001094f1, 0x58080201, 0x80041480, 0x05001002, + 0x40000800, 0x48066a04, 0x59340403, 0x82000580, + 0x000007fe, 0x05020003, 0x59cc0a08, 0x48066a04, + 0x0501fc7f, 0x5c00b000, 0x1c01f000, 0x59a8021b, + 0x4937c857, 0x8c000508, 0x05000007, 0x84000556, + 0x4803c857, 0x4803521b, 0x42001000, 0x0010c159, + 0x0509fbd5, 0x59cc0207, 0x4803c857, 0x48026a05, + 0x59cc020a, 0x4803c857, 0x48026c05, 0x59341200, + 0x599c0818, 0x5934180a, 0x4807c857, 0x480bc857, + 0x480fc857, 0x59cc2006, 0x82102500, 0xff000000, + 0x82102580, 0x02000000, 0x05000007, 0x8c00050e, + 0x05000009, 0x8c0c0514, 0x05000003, 0x8c0c050e, + 0x05000005, 0x8c040518, 0x05000003, 0x8408154a, + 0x0501f002, 0x8408150a, 0x8c000510, 0x05000009, + 0x8c0c0514, 0x05000003, 0x8c0c0510, 0x05000005, + 0x8c040518, 0x05000003, 0x8408154e, 0x0501f002, + 0x8408150e, 0x8c000512, 0x05000009, 0x8c0c0514, + 0x05000003, 0x8c0c0512, 0x05000005, 0x8c040518, + 0x05000003, 0x8408155c, 0x0501f002, 0x8408151c, + 0x480a6a00, 0x1c01f000, 0x4803c856, 0x4c5c0000, + 0x4d2c0000, 0x4c580000, 0x5934000d, 0x80025d40, + 0x05000023, 0x592c0003, 0x90000488, 0x0500100a, + 0x412cb800, 0x592c0001, 0x80025d40, 0x05fe07fa, + 0x05e5faec, 0x0500002e, 0x492fc857, 0x492cb801, + 0x0501f01b, 0x912c0c04, 0x6020b000, 0x50040000, + 0x82000580, 0xffffffff, 0x05020006, 0x80041000, + 0x50080000, 0x82000580, 0xffffffff, 0x05000005, + 0x90040c02, 0x8058b040, 0x05fe07f5, 0x05e1ff57, + 0x45480800, 0x454c1000, 0x592c1803, 0x800c1800, + 0x480e5803, 0x480fc857, 0x0501f010, 0x05e5fad1, + 0x05000013, 0x492fc857, 0x492e680d, 0x497a5802, + 0x64065803, 0x494a5804, 0x494e5805, 0x912c0c06, + 0x6038b000, 0x46000800, 0xffffffff, 0x80040800, + 0x8058b040, 0x05fe07fc, 0x90000541, 0x5c00b000, + 0x5c025800, 0x5c00b800, 0x1c01f000, 0x80000580, + 0x05fdf7fb, 0x4803c856, 0x4d3c0000, 0x4d2c0000, + 0x5934000d, 0x80025d40, 0x0500001c, 0x592c0002, + 0x80000540, 0x0502001c, 0x412e7800, 0x0501f89d, + 0x05020019, 0x46000800, 0xffffffff, 0x46001000, + 0xffffffff, 0x4813c857, 0x480fc857, 0x580c0003, + 0x90000c82, 0x05021012, 0x480fc857, 0x400c0000, + 0x812c0580, 0x05020004, 0x580c0001, 0x4802680d, + 0x0501f003, 0x580c0001, 0x48002001, 0x400e5800, + 0x05e5faac, 0x90000541, 0x5c025800, 0x5c027800, + 0x1c01f000, 0x80000580, 0x05fdf7fc, 0x80000040, + 0x48001803, 0x4803c857, 0x05fdf7f7, 0x64225a07, + 0x0001f32c, 0x64a65a07, 0x0001f32c, 0x64aa5a07, + 0x0001f32c, 0x64a25a07, 0x0001f32c, 0x643a5a07, + 0x0001f32c, 0x4943c857, 0x4d440000, 0x4d340000, + 0x4d2c0000, 0x4c580000, 0x61c0b00f, 0x417a8800, + 0x0001fac4, 0x05020007, 0x8d3c0506, 0x05000004, + 0x59340200, 0x8c00050e, 0x05020002, 0x0501f811, + 0x81468800, 0x8058b040, 0x05fe07f6, 0x83440480, + 0x00000800, 0x05021006, 0x8d3c0502, 0x05000004, + 0x61c2880f, 0x6040b000, 0x05fdf7ee, 0x5c00b000, + 0x5c025800, 0x5c026800, 0x5c028800, 0x1c01f000, + 0x4d2c0000, 0x4c600000, 0x4c5c0000, 0x4178b800, + 0x5936580f, 0x812e59c0, 0x05000026, 0x592c0205, + 0x82000500, 0x000000ff, 0x90000592, 0x0500001e, + 0x8d3c0500, 0x05000003, 0x0501f840, 0x0502001a, + 0x592cc000, 0x497a5800, 0x805cb9c0, 0x05020009, + 0x59340010, 0x812c0580, 0x05020004, 0x497a680f, + 0x497a6810, 0x0501f008, 0x4862680f, 0x0501f006, + 0x4860b800, 0x59340010, 0x812c0580, 0x05020002, + 0x485e6810, 0x4a025a05, 0x00000103, 0x49425a07, + 0x497a580a, 0x0519ffa2, 0x0001fb2c, 0x40625800, + 0x05fdf7dd, 0x412cb800, 0x592e5800, 0x05fdf7da, + 0x5c00b800, 0x5c00c000, 0x5c025800, 0x1c01f000, + 0x4803c856, 0x41781800, 0x5934000f, 0x80025d40, + 0x05000014, 0x592c0006, 0x80200580, 0x592c0000, + 0x05000003, 0x412c1800, 0x05fdf7f9, 0x592c0a05, + 0x82040d00, 0x000000ff, 0x90040d92, 0x05fc07fa, + 0x497a5800, 0x800c19c0, 0x05000007, 0x48001800, + 0x80000540, 0x05020003, 0x480e6810, 0x90000541, + 0x1c01f000, 0x4802680f, 0x80000540, 0x05fe07fd, + 0x497a6810, 0x05fdf7fa, 0x592c0009, 0x81480580, + 0x05020003, 0x592c000a, 0x814c0580, 0x1c01f000, + 0x4803c856, 0x4c580000, 0x413c1800, 0x400c2000, + 0x593c0002, 0x80000540, 0x05020014, 0x6020b000, + 0x900c0c04, 0x50040000, 0x81480580, 0x05020005, + 0x80041000, 0x50080000, 0x814c0580, 0x0500000b, + 0x90040c02, 0x8058b040, 0x05fe07f7, 0x400c2000, + 0x580c0001, 0x80001d40, 0x05fe07f1, 0x90000541, + 0x5c00b000, 0x1c01f000, 0x80000580, 0x05fdf7fd, + 0x4937c857, 0x4c580000, 0x4d2c0000, 0x5934000d, + 0x80025d40, 0x05020011, 0x05e5f9f2, 0x0500000c, + 0x492e680d, 0x64065802, 0x497a5803, 0x912c0c04, + 0x6040b000, 0x46000800, 0xffffffff, 0x80040800, + 0x8058b040, 0x05fe07fc, 0x90000541, 0x5c025800, + 0x5c00b000, 0x1c01f000, 0x4d2c0000, 0x592e5801, + 0x05e5f9f9, 0x5c025800, 0x497a5801, 0x05fdf7ee, + 0x4d2c0000, 0x5936580d, 0x812e59c0, 0x05000005, + 0x4937c857, 0x497a680d, 0x05e5f9ef, 0x90000541, + 0x5c025800, 0x1c01f000, 0x59340405, 0x4937c857, + 0x4803c857, 0x8c000508, 0x1c01f000, 0x4933c857, + 0x5930380a, 0x581c0200, 0x8400051a, 0x48003a00, + 0x1c01f000, 0x0501f805, 0x60058800, 0x05020002, + 0x60018800, 0x1c01f000, 0x5930000a, 0x50000000, + 0x4933c857, 0x4803c857, 0x8c00050e, 0x1c01f000, + 0x5930000a, 0x50000000, 0x8c00050a, 0x1c01f000, + 0x0501f805, 0x60058800, 0x05000002, 0x60018800, + 0x1c01f000, 0x4933c856, 0x0501f8a7, 0x05000005, + 0x59340400, 0x82000d00, 0x000000ff, 0x90041585, + 0x1c01f000, 0x0501f805, 0x60058800, 0x05020002, + 0x60018800, 0x1c01f000, 0x4d340000, 0x83ac0400, + 0x000007fe, 0x50000000, 0x80026d40, 0x05000003, + 0x59340200, 0x8c00051a, 0x5c026800, 0x1c01f000, + 0x4937c857, 0x493fc857, 0x59340403, 0x81ac0400, + 0x50000000, 0x81340580, 0x05e20e14, 0x59341200, + 0x813e79c0, 0x05000003, 0x8408155e, 0x0501f002, + 0x8408151e, 0x480a6a00, 0x1c01f000, 0x4937c857, + 0x05edfe43, 0x05000005, 0x59a80828, 0x42001000, + 0x00103be3, 0x0509fb4b, 0x1c01f000, 0x4937c857, + 0x42001000, 0x00103be3, 0x0509fa27, 0x59a8121b, + 0x84081512, 0x480b521b, 0x1c01f000, 0x4008d000, + 0x4020d800, 0x909d3c84, 0x409ce000, 0x0201f800, + 0x0010c253, 0x589c0000, 0x589c2001, 0x589c2802, + 0x589c3003, 0x909d3c04, 0x800001c0, 0x1c01f000, + 0x4d340000, 0x406a6800, 0x0501f803, 0x5c026800, + 0x1c01f000, 0x5934000f, 0x8d0c0512, 0x05020005, + 0x5934140b, 0x80081040, 0x05001002, 0x480a6c0b, + 0x80000540, 0x00020ad1, 0x1c01f000, 0x4803c857, + 0x4947c857, 0x4c300000, 0x90006530, 0x05000005, + 0x4c000000, 0x051df8f0, 0x5c000000, 0x0502000a, + 0x8c00050e, 0x05000005, 0x0001fac4, 0x05020006, + 0x4937c857, 0x05fdfd8e, 0x80000580, 0x5c006000, + 0x1c01f000, 0x90000541, 0x05fdf7fd, 0x4803c857, + 0x4c580000, 0x4d440000, 0x40001000, 0x80000d80, + 0x61c0b00f, 0x4c040000, 0x40068800, 0x4c080000, + 0x40080000, 0x05fdffe4, 0x5c001000, 0x5c000800, + 0x80040800, 0x8058b040, 0x05fe07f7, 0x8c080514, + 0x05000005, 0x84081514, 0x6004b000, 0x61f0080f, + 0x05fdf7f1, 0x4d300000, 0x4d400000, 0x0501fad3, + 0x61fe89ff, 0x42026000, 0x0010cc6c, 0x4a02600a, + 0x0010993e, 0x60a68000, 0x0509fd85, 0x4df00000, + 0x0201f800, 0x0010bb9e, 0x0201f800, 0x0010c0ee, + 0x5c03e000, 0x05080d6a, 0x5c028000, 0x5c026000, + 0x5c028800, 0x5c00b000, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, - 0x4c5c0000, 0x59340400, 0x8200bd80, 0x00000404, - 0x05000003, 0x8200bd80, 0x00000606, 0x5c00b800, - 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x59340400, - 0x8200bd00, 0x0000ff00, 0x825cc580, 0x00000400, - 0x05000003, 0x825cc580, 0x00000600, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x0501f805, 0x60058800, - 0x05000002, 0x60018800, 0x1c01f000, 0x4c5c0000, - 0x59340400, 0x82000500, 0x000000ff, 0x9000bd83, - 0x05000002, 0x9000bd85, 0x5c00b800, 0x1c01f000, - 0x5c000000, 0x4c000000, 0x4803c857, 0x4c5c0000, - 0x59340400, 0x82000500, 0x0000ff00, 0x8400b9c0, - 0x805c0580, 0x4937c857, 0x4803c857, 0x48026c00, - 0x5c00b800, 0x1c01f000, 0x4c040000, 0x4c080000, - 0x592c0208, 0x8c00050c, 0x0500000d, 0x592e8c07, - 0x82000500, 0x00000080, 0x84000548, 0x4d3c0000, - 0x60027820, 0x05fdff6f, 0x5c027800, 0x90000541, - 0x5c001000, 0x5c000800, 0x1c01f000, 0x80000580, - 0x05fdf7fc, 0x592c040c, 0x82000500, 0x0000e000, - 0x82000580, 0x00006000, 0x0500001a, 0x916c0583, - 0x05000011, 0x916c0582, 0x050200d9, 0x59a8021b, - 0x90000d38, 0x05020005, 0x59a80813, 0x800409c0, - 0x05000009, 0x0501f0d2, 0x90000d03, 0x90040d83, - 0x050200cf, 0x90000d28, 0x05020003, 0x8c00050c, - 0x050000cb, 0x592c100b, 0x82080500, 0xff000000, - 0x050200b3, 0x59a8000f, 0x80080580, 0x050000ae, - 0x592c0c0c, 0x82040d00, 0x0000e000, 0x82040480, - 0x00008000, 0x050210ac, 0x592e8c07, 0x83440480, - 0x00000800, 0x05001013, 0x83440580, 0x0000ffff, - 0x05020099, 0x800409c0, 0x050200cd, 0x592c240a, - 0x82100500, 0xffffff00, 0x05020099, 0x480bc857, - 0x4813c857, 0x592c000e, 0x82000480, 0x00000841, - 0x0502109b, 0x614e7000, 0x417a6800, 0x0501f077, - 0x800409c0, 0x050200be, 0x41784000, 0x05fdff0d, - 0x050200ab, 0x59342204, 0x592c000e, 0x80100480, - 0x0500108f, 0x614e7000, 0x592c240a, 0x82100500, - 0xffffff00, 0x05020082, 0x4813c857, 0x592c000d, - 0x800001c0, 0x05000063, 0x90100584, 0x0500007a, - 0xb0100591, 0x05000078, 0x90100583, 0x0500000f, - 0x901005a0, 0x05000038, 0x901005a4, 0x05000032, - 0x901005a1, 0x05000032, 0xb0100590, 0x0500002a, - 0xb0100592, 0x05000026, 0x90100585, 0x05020053, - 0x60067000, 0x0501f018, 0x600a7000, 0x59a80086, - 0x8c000502, 0x05000014, 0x05fdff45, 0x05000012, + 0x4c5c0000, 0x59340400, 0x8200bd80, 0x00000606, + 0x5c00b800, 0x1c01f000, 0x4c5c0000, 0x59340400, + 0x8200bd80, 0x00000404, 0x5c00b800, 0x1c01f000, + 0x0501f805, 0x60058800, 0x05000002, 0x60018800, + 0x1c01f000, 0x4c5c0000, 0x59340400, 0x8200bd80, + 0x00000404, 0x05000003, 0x8200bd80, 0x00000606, + 0x5c00b800, 0x1c01f000, 0x4c5c0000, 0x4c600000, + 0x59340400, 0x8200bd00, 0x0000ff00, 0x825cc580, + 0x00000400, 0x05000003, 0x825cc580, 0x00000600, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x0501f805, + 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, + 0x4c5c0000, 0x59340400, 0x82000500, 0x000000ff, + 0x9000bd83, 0x05000002, 0x9000bd85, 0x5c00b800, + 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, + 0x4c5c0000, 0x59340400, 0x82000500, 0x0000ff00, + 0x8400b9c0, 0x805c0580, 0x4937c857, 0x4803c857, + 0x48026c00, 0x5c00b800, 0x1c01f000, 0x4c040000, + 0x4c080000, 0x592c0208, 0x8c00050c, 0x0500000d, + 0x592e8c07, 0x82000500, 0x00000080, 0x84000548, + 0x4d3c0000, 0x60027820, 0x05fdff6d, 0x5c027800, + 0x90000541, 0x5c001000, 0x5c000800, 0x1c01f000, + 0x80000580, 0x05fdf7fc, 0x592c040c, 0x82000500, + 0x0000e000, 0x82000580, 0x00006000, 0x0500001a, + 0x916c0583, 0x05000011, 0x916c0582, 0x050200dc, + 0x59a8021b, 0x90000d38, 0x05020005, 0x59a80813, + 0x800409c0, 0x05000009, 0x0501f0d5, 0x90000d03, + 0x90040d83, 0x050200d2, 0x90000d28, 0x05020003, + 0x8c00050c, 0x050000ce, 0x592c100b, 0x82080500, + 0xff000000, 0x050200b6, 0x59a8000f, 0x80080580, + 0x050000b1, 0x592c0c0c, 0x82040d00, 0x0000e000, + 0x82040480, 0x00008000, 0x050210af, 0x592e8c07, + 0x83440480, 0x00000800, 0x05001015, 0x83440580, + 0x0000ffff, 0x0502009c, 0x800409c0, 0x050200d0, + 0x592c240a, 0x82100500, 0xffffff00, 0x0502009c, + 0x480bc857, 0x4813c857, 0x592c000e, 0x82000480, + 0x00000841, 0x0502109e, 0x614e7000, 0x0501fa2b, + 0x42026800, 0x0010993e, 0x0501f077, 0x800409c0, + 0x050200bf, 0x41784000, 0x05fdff09, 0x050200ac, + 0x59342204, 0x592c000e, 0x80100480, 0x05001090, + 0x614e7000, 0x592c240a, 0x82100500, 0xffffff00, + 0x05020083, 0x4813c857, 0x592c000d, 0x800001c0, + 0x05000063, 0x90100584, 0x0500007b, 0xb0100591, + 0x05000079, 0x90100583, 0x0500000f, 0x901005a0, + 0x05000038, 0x901005a4, 0x05000032, 0x901005a1, + 0x05000032, 0xb0100590, 0x0500002a, 0xb0100592, + 0x05000026, 0x90100585, 0x05020053, 0x60067000, + 0x0501f018, 0x600a7000, 0x59a80086, 0x8c000502, + 0x05000014, 0x05fdff43, 0x05000012, 0x59340212, + 0x82000500, 0x0000ff00, 0x60401000, 0x0502000b, + 0x59a8021b, 0x8c000506, 0x05020057, 0x60201000, + 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, + 0x00ff0000, 0x05000003, 0x0501f972, 0x0502004e, + 0x0511f967, 0x05000060, 0x64426407, 0x4936600a, + 0x600c0800, 0x91380582, 0x05000002, 0x602c0800, + 0x05fdfbf2, 0x0501f034, 0x60027000, 0x0501f002, + 0x60127000, 0x05fdff3d, 0x05020058, 0x0501f02a, + 0x60ce7000, 0x0501f004, 0x60167000, 0x0501f002, + 0x600e7000, 0x05fdff2c, 0x05020050, 0x59a80086, + 0x8c000502, 0x05000014, 0x05fdff16, 0x05000012, 0x59340212, 0x82000500, 0x0000ff00, 0x60401000, - 0x0502000b, 0x59a8021b, 0x8c000506, 0x05020056, + 0x0502000b, 0x59a8021b, 0x8c000506, 0x0502002a, 0x60201000, 0x59340002, 0x82000500, 0x00ff0000, - 0x82000580, 0x00ff0000, 0x05000003, 0x0501f971, - 0x0502004d, 0x0511f902, 0x0500005f, 0x64426407, - 0x4936600a, 0x600c0800, 0x91380582, 0x05000002, - 0x602c0800, 0x05fdfbfd, 0x0501f034, 0x60027000, - 0x0501f002, 0x60127000, 0x05fdff3f, 0x05020057, - 0x0501f02a, 0x60ce7000, 0x0501f004, 0x60167000, - 0x0501f002, 0x600e7000, 0x05fdff2e, 0x0502004f, - 0x59a80086, 0x8c000502, 0x05000014, 0x05fdff18, - 0x05000012, 0x59340212, 0x82000500, 0x0000ff00, - 0x60401000, 0x0502000b, 0x59a8021b, 0x8c000506, - 0x05020029, 0x60201000, 0x59340002, 0x82000500, - 0x00ff0000, 0x82000580, 0x00ff0000, 0x05000003, - 0x0501f944, 0x05020020, 0x0511f8d5, 0x05000032, - 0x64426407, 0x4936600a, 0x60140800, 0x91380583, - 0x05000002, 0x60240800, 0x05fdfbd0, 0x0501f007, - 0x90102591, 0x05020024, 0x0511f8c9, 0x05000026, - 0x64426407, 0x4936600a, 0x492e6009, 0x49325809, - 0x813669c0, 0x05000007, 0x592c0c0c, 0x8c040518, + 0x82000580, 0x00ff0000, 0x05000003, 0x0501f945, + 0x05020021, 0x0511f93a, 0x05000033, 0x64426407, + 0x4936600a, 0x60140800, 0x91380583, 0x05000002, + 0x60240800, 0x05fdfbc5, 0x0501f007, 0x90102591, + 0x05020025, 0x0511f92e, 0x05000027, 0x64426407, + 0x4936600a, 0x492e6009, 0x49325809, 0x83340580, + 0x0010993e, 0x05000007, 0x592c0c0c, 0x8c040518, 0x05000004, 0x59340200, 0x84000514, 0x48026a00, 0x0005f905, 0x80000580, 0x1c01f000, 0x90000541, 0x05fdf7fe, 0x60281000, 0x0501f010, 0x60401000, @@ -3968,28 +3974,28 @@ static const uint32_t isp_2500_risc_code[] = { 0x05fdf7f7, 0x60228000, 0x0501f004, 0x601c0800, 0x416c1000, 0x05fdf7f2, 0x41780800, 0x41781000, 0x05fdf7db, 0x60028000, 0x05fdf7fc, 0x90004d9d, - 0x05e00c6e, 0x90004d9a, 0x05020004, 0x40101000, + 0x05e00c56, 0x90004d9a, 0x05020004, 0x40101000, 0x40000800, 0x05fdf7e6, 0x90004d9b, 0x05020003, 0x40181000, 0x05fdf7fb, 0x90004d9c, 0x05fc07f9, 0x90004d99, 0x05fc07cc, 0x05fdf7e1, 0x592e6009, - 0x0519fed3, 0x05fc07ca, 0x59300c07, 0x90040591, + 0x0519ff51, 0x05fc07ca, 0x59300c07, 0x90040591, 0x05fe07e1, 0x592c0c0c, 0x82041500, 0x0000e000, 0x82080580, 0x00006000, 0x05000021, 0x83440580, - 0x0000ffff, 0x05020005, 0x5932680a, 0x813669c0, - 0x0500000e, 0x05fdf7d4, 0x592c100b, 0x82081500, - 0x00ffffff, 0x41784000, 0x05fdfe3a, 0x05fe07d8, - 0x5930000a, 0x800001c0, 0x05000003, 0x81340580, - 0x05fe07c9, 0x4936600a, 0x61000810, 0x813669c0, - 0x05000002, 0x59340a04, 0x592c000e, 0x80040480, + 0x0000ffff, 0x05020007, 0x5932680a, 0x83340580, + 0x0010993e, 0x05fe07d4, 0x61000810, 0x0501f00f, + 0x592c100b, 0x82081500, 0x00ffffff, 0x41784000, + 0x05fdfe33, 0x05fe07d6, 0x5930000a, 0x82000d80, + 0x0010993e, 0x05000003, 0x81340580, 0x05fe07c6, + 0x4936600a, 0x59340a04, 0x592c000e, 0x80040480, 0x05fc17b3, 0x59300a03, 0x90040587, 0x05fe07be, - 0x492e6009, 0x61527000, 0x05fdf792, 0x0525f8ed, + 0x492e6009, 0x61527000, 0x05fdf791, 0x0525f99f, 0x05fc07c1, 0x05fdf7b8, 0x492fc857, 0x592e6009, 0x83300580, 0xffffffff, 0x05020040, 0x592c0208, 0x8c000500, 0x0502006b, 0x8d0c050e, 0x05020058, 0x592e8c07, 0x83440480, 0x00000800, 0x05021035, 0x41784000, 0x592c100a, 0x82081500, 0x00ffffff, - 0x05fdfe10, 0x05020050, 0x592e6014, 0x4933c857, - 0x83300580, 0xffffffff, 0x05000018, 0x0519fe8c, + 0x05fdfe0b, 0x05020050, 0x592e6014, 0x4933c857, + 0x83300580, 0xffffffff, 0x05000018, 0x0519ff0a, 0x05000032, 0x591c1407, 0x800811c0, 0x05000013, 0x592c040e, 0x591c0a02, 0x80040580, 0x0502000f, 0x591c000a, 0x800001c0, 0x05020007, 0x591c0820, @@ -4008,11 +4014,11 @@ static const uint32_t isp_2500_risc_code[] = { 0x40000800, 0x05fdf7f9, 0x492fc857, 0x60280800, 0x41781000, 0x05fdf7f5, 0x41780800, 0x41781000, 0x05fdf7f3, 0x60780800, 0x05fdf7fa, 0x60040800, - 0x05fdf7f8, 0x90004d9d, 0x05e00bcc, 0x90004d9a, + 0x05fdf7f8, 0x90004d9d, 0x05e00bb4, 0x90004d9a, 0x05020003, 0x40101000, 0x05fdf7eb, 0x90004d9b, 0x05020003, 0x40181000, 0x05fdf7e7, 0x90004d9c, 0x05fc07e5, 0x90004d99, 0x05fc07e3, 0x05fdf7e7, - 0x0525f93e, 0x60028000, 0x05fdf7e8, 0x5c000000, + 0x0525f9f0, 0x60028000, 0x05fdf7e8, 0x5c000000, 0x4c000000, 0x4803c857, 0x5930200a, 0x801021c0, 0x05000029, 0x58101400, 0x4813c857, 0x480bc857, 0x82081d00, 0x000000ff, 0x59300c03, 0x90040588, @@ -4033,7 +4039,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x60058800, 0x05020002, 0x60018800, 0x1c01f000, 0x4d440000, 0x4d340000, 0x80000580, 0x40001800, 0x40028800, 0x90080588, 0x05020002, 0x60041800, - 0x0001fac4, 0x0502000a, 0x05fdfdb9, 0x05020008, + 0x0001fac4, 0x0502000a, 0x05fdfdb6, 0x05020008, 0x800c19c0, 0x05000004, 0x59340405, 0x8c000508, 0x05000003, 0x80081040, 0x05000009, 0x81468800, 0x83440480, 0x00000800, 0x05fc17f2, 0x80000580, @@ -4044,481 +4050,492 @@ static const uint32_t isp_2500_risc_code[] = { 0x0000e000, 0x41781800, 0x90080580, 0x0500000a, 0x800c1800, 0x82080580, 0x00002000, 0x05000006, 0x800c1800, 0x82080580, 0x00006000, 0x05000002, - 0x800c1800, 0x42007000, 0x00109471, 0x58380401, + 0x800c1800, 0x42007000, 0x001094f1, 0x58380401, 0x8c000504, 0x05000006, 0x900c2c84, 0x05021016, - 0x820c0400, 0x00103ec7, 0x0501f012, 0x41782000, + 0x820c0400, 0x00103edf, 0x0501f012, 0x41782000, 0x59342a04, 0x82140480, 0x00000800, 0x05021006, 0x80102000, 0x82140480, 0x00000400, 0x05021002, 0x80102000, 0x800c00c2, 0x800c0400, 0x80100400, - 0x90002c89, 0x05021004, 0x82000400, 0x00103ecb, + 0x90002c89, 0x05021004, 0x82000400, 0x00103ee3, 0x50000800, 0x48066c04, 0x1c01f000, 0x00000002, 0x00000004, 0x00000008, 0x00000008, 0x00002802, 0x00001402, 0x00000a02, 0x00001402, 0x00000a02, 0x00000502, 0x00000a02, 0x00000502, 0x00000504, 0x59a80864, 0x800409c0, 0x05020004, 0x492f5063, - 0x492f5064, 0x050df683, 0x492c0800, 0x492f5064, + 0x492f5064, 0x050df6e3, 0x492c0800, 0x492f5064, 0x1c01f000, 0x5934000f, 0x41784000, 0x80001540, 0x0500000c, 0x58080205, 0x82000500, 0x000000ff, 0x90000592, 0x05020004, 0x5808020d, 0x80040580, 0x05000005, 0x58080000, 0x40084000, 0x05fdf7f4, - 0x90000541, 0x1c01f000, 0x64033011, 0x4a03b104, - 0x80000000, 0x4a03b104, 0x60000001, 0x497b3016, - 0x497b3017, 0x1c01f000, 0x599c0018, 0x4803c856, - 0x497b3014, 0x497b3015, 0x9000050f, 0x48033012, - 0x05000008, 0x599c0216, 0x82000500, 0x0000ffff, - 0x05020002, 0x60080000, 0x48033013, 0x850e1d62, - 0x1c01f000, 0x05fdfff1, 0x6413c826, 0x599c0209, - 0x80000540, 0x0500001c, 0x599c0207, 0x80000540, - 0x05000007, 0x800000cc, 0x599c080d, 0x80040400, - 0x4803b100, 0x497bb102, 0x59d80101, 0x599c000d, - 0x4803b100, 0x599c000e, 0x4803b101, 0x599c0207, - 0x80000540, 0x05020002, 0x497bb102, 0x599c0a09, - 0x82040540, 0x00400000, 0x4803b103, 0x6417b109, - 0x4a03b104, 0x10000001, 0x8d0c0522, 0x05020003, - 0x64073011, 0x1c01f000, 0x8d0c0520, 0x05020003, - 0x640b3011, 0x05fdf7fc, 0x640f3011, 0x05fdf7fa, - 0x592c0205, 0x492fc857, 0x80000540, 0x05000007, - 0x42034000, 0x00109410, 0x59a1d806, 0x80edd9c0, - 0x05e00ab2, 0x0501f005, 0x051df924, 0x05e20aaf, - 0x5931d823, 0x58ef400a, 0x58ec0008, 0x800001c0, - 0x05e00aaa, 0x0801f800, 0x1c01f000, 0x40680800, - 0x5c000000, 0x4c000000, 0x4803c857, 0x492fc857, - 0x4943c857, 0x4807c857, 0x4a025a05, 0x00000103, - 0x49425a07, 0x48065a09, 0x4a025c07, 0x0000ffff, - 0x813261c0, 0x05000003, 0x59300402, 0x48025c07, - 0x912c040a, 0x05011000, 0x4803c840, 0x642fc842, - 0x05011000, 0x1c01f000, 0x59a80011, 0x90000c8a, - 0x05e21a8e, 0x0c01f808, 0x4a038805, 0x000000f0, - 0x59c400a3, 0x82000500, 0x02870000, 0x05e20a87, - 0x1c01f000, 0x00103fde, 0x00103f6c, 0x00103f84, - 0x00103fad, 0x00103fd1, 0x001001e6, 0x001001e6, - 0x00103f84, 0x001001e6, 0x00103f6b, 0x1c01f000, - 0x600c2000, 0x0501fbae, 0x4a038808, 0x00000204, - 0x0501fba2, 0x59c40805, 0x8c04050e, 0x05020010, - 0x8c04050a, 0x05020009, 0x8c04050c, 0x05020005, - 0x8c040508, 0x0500000a, 0x640f5011, 0x0501f007, - 0x64035011, 0x0501f005, 0x42000000, 0x0010974d, - 0x0525f915, 0x640b5011, 0x0501f896, 0x1c01f000, - 0x60002000, 0x0501fb96, 0x4a038808, 0x00000202, - 0x59c40805, 0x8c040508, 0x05020020, 0x8c04050c, - 0x0502001c, 0x8c04050e, 0x05020018, 0x82040500, - 0x000000f0, 0x0502001b, 0x0501fb80, 0x4a038808, - 0x00000280, 0x59c40002, 0x8400050c, 0x48038802, - 0x0501f96d, 0x4d3c0000, 0x60067800, 0x051df844, - 0x5c027800, 0x59c410a3, 0x84081518, 0x05e9ff2c, - 0x4a038808, 0x00000280, 0x60082000, 0x0501fb78, - 0x64275011, 0x0501f007, 0x64075011, 0x0501f004, - 0x64035011, 0x0501f002, 0x640f5011, 0x0501f86d, - 0x1c01f000, 0x60042000, 0x0501fb6d, 0x59c410a3, - 0x84081518, 0x05e9ff1a, 0x4a038808, 0x00000280, - 0x59c40805, 0x8c04050a, 0x05020018, 0x8c04050c, - 0x05020014, 0x8c04050e, 0x05020010, 0x82040500, - 0x000000f0, 0x05020013, 0x59c40002, 0x8400050c, - 0x48038802, 0x0501f944, 0x4d3c0000, 0x60067800, - 0x051df81b, 0x5c027800, 0x60082000, 0x0501fb54, - 0x64275011, 0x0501f007, 0x64075011, 0x0501f004, - 0x64035011, 0x0501f002, 0x640b5011, 0x0501f849, - 0x1c01f000, 0x0501fc45, 0x4a038808, 0x00000208, - 0x59c40805, 0x8c04050c, 0x05020005, 0x8c04050e, - 0x05000005, 0x64075011, 0x0501f002, 0x64035011, - 0x0501f83c, 0x1c01f000, 0x60102000, 0x0501fb3c, - 0x0501f873, 0x59c40805, 0x8c04050c, 0x05020009, - 0x8c04050a, 0x05020005, 0x8c04050e, 0x05000005, - 0x64075011, 0x0501f002, 0x640b5011, 0x0501f82d, - 0x1c01f000, 0x0501f8f1, 0x05e209f8, 0x601c2000, - 0x0501fb2b, 0x8d0c050c, 0x05000010, 0x850e1d0c, - 0x64438805, 0x05e9fe12, 0x59c40005, 0x8c000508, - 0x05000006, 0x4a038808, 0x00000208, 0x64075014, - 0x6006d800, 0x0501f01a, 0x59c40006, 0x84000548, - 0x48038806, 0x0501f016, 0x59a80011, 0x90000581, - 0x05020012, 0x42000000, 0x0010974d, 0x0525f88e, - 0x4ce80000, 0x61a1d007, 0x0505feb9, 0x59c40005, - 0x90000530, 0x05000008, 0x8c00050a, 0x05000004, - 0x60002000, 0x0501fb0a, 0x0501f003, 0x60042000, - 0x0501fb07, 0x5c01d000, 0x64135011, 0x1c01f000, - 0x4c040000, 0x4c080000, 0x61900800, 0x42001000, - 0x00104021, 0x0505fe8c, 0x5c001000, 0x5c000800, - 0x1c01f000, 0x4803c856, 0x4c040000, 0x0509f910, - 0x4df00000, 0x0509fb33, 0x5c03e000, 0x050808f8, - 0x42000000, 0x0010974c, 0x0525f86b, 0x05fdffc2, - 0x5c000800, 0x1c01f000, 0x4803c856, 0x4c040000, - 0x4c080000, 0x0509f902, 0x4df00000, 0x0509fb25, - 0x5c03e000, 0x050808ea, 0x59c40006, 0x84000500, - 0x48038806, 0x0509fbdc, 0x497b8880, 0x42000000, - 0x0010974b, 0x0525f858, 0x05e9fd2a, 0x64135071, - 0x6012d800, 0x64078805, 0x42001000, 0x00104021, - 0x0505fe6e, 0x05e1fbbc, 0x0501f8ae, 0x05000005, - 0x42006000, 0xfeffffff, 0x41786800, 0x05f9fe81, - 0x0201f800, 0x0010c52f, 0x60000001, 0x05e9fa8d, - 0x5c001000, 0x5c000800, 0x1c01f000, 0x59c40008, - 0x82000580, 0x00000210, 0x05000005, 0x4a038808, - 0x00000210, 0x6021d027, 0x0505fe69, 0x1c01f000, - 0x4c040000, 0x59a80814, 0x90040580, 0x05000008, - 0x90040581, 0x05000008, 0x90040582, 0x05000008, - 0x90040583, 0x05000008, 0x0501f043, 0x64035011, - 0x0501f006, 0x64135011, 0x0501f004, 0x64075011, - 0x0501f002, 0x641f5011, 0x497b8880, 0x64078893, - 0x41780000, 0x05e9fade, 0x0509fba3, 0x916c0d84, - 0x05000008, 0x59c40006, 0x82000500, 0xffffff0f, - 0x82000540, 0x04000001, 0x48038806, 0x0501f007, - 0x59c40006, 0x82000500, 0xffffff0f, 0x82000540, - 0x04000000, 0x48038806, 0x0501f872, 0x05020005, - 0x59c40806, 0x82040d00, 0xfbffff0f, 0x48078806, - 0x59c40005, 0x8c000534, 0x05020026, 0x42006000, - 0xfc18ffff, 0x42006800, 0x01000000, 0x05f9fe3d, - 0x05e9fd77, 0x59c408a4, 0x90040d0f, 0x90040d8c, - 0x05020894, 0x0501f85f, 0x05000005, 0x42006000, - 0xfeffffff, 0x41786800, 0x05f9fe32, 0x916c0d84, - 0x0500000c, 0x05fdff7b, 0x5994102e, 0x41780800, - 0x60280000, 0x0505fedf, 0x40080000, 0x59a80831, - 0x80040c00, 0x42001000, 0x0010402e, 0x0505fdf9, - 0x64135014, 0x05fdfead, 0x0501f84a, 0x05020005, - 0x59c408a4, 0x90040d0f, 0x9004058c, 0x05e20937, - 0x5c000800, 0x1c01f000, 0x4803c856, 0x4c000000, - 0x0505fe1d, 0x4a03500f, 0x00ffffff, 0x497b5013, - 0x59a8001f, 0x82000500, 0xffff0000, 0x4803501f, - 0x497b8880, 0x497b8893, 0x41780000, 0x05e9fa90, - 0x59c40001, 0x82000500, 0xfffffcff, 0x48038801, - 0x42006000, 0xfc18ffff, 0x41786800, 0x05f9fe05, - 0x59c410a3, 0x84081518, 0x05e9fe01, 0x4a038808, - 0x00000200, 0x5c000000, 0x800001c0, 0x05fa0cc3, - 0x4a038805, 0x040000f0, 0x59c40006, 0x82000500, - 0xffffffcf, 0x82000540, 0x440000c1, 0x48038806, - 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x4c5c0000, 0x59a8b813, - 0x825cbd80, 0x0000aaaa, 0x5c00b800, 0x1c01f000, - 0x0501f805, 0x60058800, 0x05000002, 0x60018800, - 0x1c01f000, 0x4c5c0000, 0x599cb818, 0x905cbd30, - 0x905cbd80, 0x5c00b800, 0x1c01f000, 0x0501f805, + 0x90000541, 0x1c01f000, 0x42000000, 0x0010993e, + 0x4a000400, 0x00000707, 0x4a000204, 0x00000840, + 0x4a000403, 0x0000ffff, 0x49780200, 0x1c01f000, + 0x4d340000, 0x4d440000, 0x4c580000, 0x61c0b00f, + 0x4803c856, 0x417a8800, 0x0001fac4, 0x05020006, + 0x59340200, 0x8c00051a, 0x05000003, 0x8400051a, + 0x48026a00, 0x81468800, 0x8058b040, 0x05fe07f7, + 0x5c00b000, 0x5c028800, 0x5c026800, 0x1c01f000, + 0x64033011, 0x4a03b104, 0x80000000, 0x4a03b104, + 0x60000001, 0x497b3016, 0x497b3017, 0x1c01f000, + 0x599c0018, 0x4803c856, 0x497b3014, 0x497b3015, + 0x9000050f, 0x48033012, 0x05000008, 0x599c0216, + 0x82000500, 0x0000ffff, 0x05020002, 0x60080000, + 0x48033013, 0x850e1d62, 0x1c01f000, 0x05fdfff1, + 0x6413c826, 0x599c0209, 0x80000540, 0x0500001c, + 0x599c0207, 0x80000540, 0x05000007, 0x800000cc, + 0x599c080d, 0x80040400, 0x4803b100, 0x497bb102, + 0x59d80101, 0x599c000d, 0x4803b100, 0x599c000e, + 0x4803b101, 0x599c0207, 0x80000540, 0x05020002, + 0x497bb102, 0x599c0a09, 0x82040540, 0x00400000, + 0x4803b103, 0x6417b109, 0x4a03b104, 0x10000001, + 0x8d0c0522, 0x05020003, 0x64073011, 0x1c01f000, + 0x8d0c0520, 0x05020003, 0x640b3011, 0x05fdf7fc, + 0x640f3011, 0x05fdf7fa, 0x592c0205, 0x492fc857, + 0x80000540, 0x05000007, 0x42034000, 0x00109490, + 0x59a1d806, 0x80edd9c0, 0x05e00a7c, 0x0501f005, + 0x051df984, 0x05e20a79, 0x5931d823, 0x58ef400a, + 0x58ec0008, 0x800001c0, 0x05e00a74, 0x0801f800, + 0x1c01f000, 0x40680800, 0x5c000000, 0x4c000000, + 0x4803c857, 0x492fc857, 0x4943c857, 0x4807c857, + 0x4a025a05, 0x00000103, 0x49425a07, 0x48065a09, + 0x4a025c07, 0x0000ffff, 0x813261c0, 0x05000003, + 0x59300402, 0x48025c07, 0x912c040a, 0x05011000, + 0x4803c840, 0x642fc842, 0x05011000, 0x1c01f000, + 0x59a80011, 0x90000c8a, 0x05e21a58, 0x0c01f808, + 0x4a038805, 0x000000f0, 0x59c400a3, 0x82000500, + 0x02870000, 0x05e20a51, 0x1c01f000, 0x00104014, + 0x00103fa2, 0x00103fba, 0x00103fe3, 0x00104007, + 0x001001e6, 0x001001e6, 0x00103fba, 0x001001e6, + 0x00103fa1, 0x1c01f000, 0x600c2000, 0x0501fbae, + 0x4a038808, 0x00000204, 0x0501fba2, 0x59c40805, + 0x8c04050e, 0x05020010, 0x8c04050a, 0x05020009, + 0x8c04050c, 0x05020005, 0x8c040508, 0x0500000a, + 0x640f5011, 0x0501f007, 0x64035011, 0x0501f005, + 0x42000000, 0x001097cd, 0x0525f9a9, 0x640b5011, + 0x0501f896, 0x1c01f000, 0x60002000, 0x0501fb96, + 0x4a038808, 0x00000202, 0x59c40805, 0x8c040508, + 0x05020020, 0x8c04050c, 0x0502001c, 0x8c04050e, + 0x05020018, 0x82040500, 0x000000f0, 0x0502001b, + 0x0501fb80, 0x4a038808, 0x00000280, 0x59c40002, + 0x8400050c, 0x48038802, 0x0501f96d, 0x4d3c0000, + 0x60067800, 0x051df8a4, 0x5c027800, 0x59c410a3, + 0x84081518, 0x05e9fef4, 0x4a038808, 0x00000280, + 0x60082000, 0x0501fb78, 0x64275011, 0x0501f007, + 0x64075011, 0x0501f004, 0x64035011, 0x0501f002, + 0x640f5011, 0x0501f86d, 0x1c01f000, 0x60042000, + 0x0501fb6d, 0x59c410a3, 0x84081518, 0x05e9fee2, + 0x4a038808, 0x00000280, 0x59c40805, 0x8c04050a, + 0x05020018, 0x8c04050c, 0x05020014, 0x8c04050e, + 0x05020010, 0x82040500, 0x000000f0, 0x05020013, + 0x59c40002, 0x8400050c, 0x48038802, 0x0501f944, + 0x4d3c0000, 0x60067800, 0x051df87b, 0x5c027800, + 0x60082000, 0x0501fb54, 0x64275011, 0x0501f007, + 0x64075011, 0x0501f004, 0x64035011, 0x0501f002, + 0x640b5011, 0x0501f849, 0x1c01f000, 0x0501fc45, + 0x4a038808, 0x00000208, 0x59c40805, 0x8c04050c, + 0x05020005, 0x8c04050e, 0x05000005, 0x64075011, + 0x0501f002, 0x64035011, 0x0501f83c, 0x1c01f000, + 0x60102000, 0x0501fb3c, 0x0501f873, 0x59c40805, + 0x8c04050c, 0x05020009, 0x8c04050a, 0x05020005, + 0x8c04050e, 0x05000005, 0x64075011, 0x0501f002, + 0x640b5011, 0x0501f82d, 0x1c01f000, 0x0501f8f1, + 0x05e209c2, 0x601c2000, 0x0501fb2b, 0x8d0c050c, + 0x05000010, 0x850e1d0c, 0x64438805, 0x05e9fdda, + 0x59c40005, 0x8c000508, 0x05000006, 0x4a038808, + 0x00000208, 0x64075014, 0x6006d800, 0x0501f01a, + 0x59c40006, 0x84000548, 0x48038806, 0x0501f016, + 0x59a80011, 0x90000581, 0x05020012, 0x42000000, + 0x001097cd, 0x0525f922, 0x4ce80000, 0x61a1d007, + 0x0505ff0f, 0x59c40005, 0x90000530, 0x05000008, + 0x8c00050a, 0x05000004, 0x60002000, 0x0501fb0a, + 0x0501f003, 0x60042000, 0x0501fb07, 0x5c01d000, + 0x64135011, 0x1c01f000, 0x4c040000, 0x4c080000, + 0x61900800, 0x42001000, 0x00104057, 0x0505fee2, + 0x5c001000, 0x5c000800, 0x1c01f000, 0x4803c856, + 0x4c040000, 0x0509f966, 0x4df00000, 0x0509fb89, + 0x5c03e000, 0x0508094e, 0x42000000, 0x001097cc, + 0x0525f8ff, 0x05fdffc2, 0x5c000800, 0x1c01f000, + 0x4803c856, 0x4c040000, 0x4c080000, 0x0509f958, + 0x4df00000, 0x0509fb7b, 0x5c03e000, 0x05080940, + 0x59c40006, 0x84000500, 0x48038806, 0x0509fc32, + 0x497b8880, 0x42000000, 0x001097cb, 0x0525f8ec, + 0x05e9fcf2, 0x64135071, 0x6012d800, 0x64078805, + 0x42001000, 0x00104057, 0x0505fec4, 0x05e1fb86, + 0x0501f8ae, 0x05000005, 0x42006000, 0xfeffffff, + 0x41786800, 0x05f9fe57, 0x0201f800, 0x0010c534, + 0x60000001, 0x05e9fa55, 0x5c001000, 0x5c000800, + 0x1c01f000, 0x59c40008, 0x82000580, 0x00000210, + 0x05000005, 0x4a038808, 0x00000210, 0x6021d027, + 0x0505febf, 0x1c01f000, 0x4c040000, 0x59a80814, + 0x90040580, 0x05000008, 0x90040581, 0x05000008, + 0x90040582, 0x05000008, 0x90040583, 0x05000008, + 0x0501f043, 0x64035011, 0x0501f006, 0x64135011, + 0x0501f004, 0x64075011, 0x0501f002, 0x641f5011, + 0x497b8880, 0x64078893, 0x41780000, 0x05e9faa6, + 0x0509fbf9, 0x916c0d84, 0x05000008, 0x59c40006, + 0x82000500, 0xffffff0f, 0x82000540, 0x04000001, + 0x48038806, 0x0501f007, 0x59c40006, 0x82000500, + 0xffffff0f, 0x82000540, 0x04000000, 0x48038806, + 0x0501f872, 0x05020005, 0x59c40806, 0x82040d00, + 0xfbffff0f, 0x48078806, 0x59c40005, 0x8c000534, + 0x05020026, 0x42006000, 0xfc18ffff, 0x42006800, + 0x01000000, 0x05f9fe13, 0x05e9fd3f, 0x59c408a4, + 0x90040d0f, 0x90040d8c, 0x05020894, 0x0501f85f, + 0x05000005, 0x42006000, 0xfeffffff, 0x41786800, + 0x05f9fe08, 0x916c0d84, 0x0500000c, 0x05fdff7b, + 0x5994102e, 0x41780800, 0x60280000, 0x0505ff35, + 0x40080000, 0x59a80831, 0x80040c00, 0x42001000, + 0x00104064, 0x0505fe4f, 0x64135014, 0x05fdfead, + 0x0501f84a, 0x05020005, 0x59c408a4, 0x90040d0f, + 0x9004058c, 0x05e20901, 0x5c000800, 0x1c01f000, + 0x4803c856, 0x4c000000, 0x0505fe73, 0x4a03500f, + 0x00ffffff, 0x497b5013, 0x59a8001f, 0x82000500, + 0xffff0000, 0x4803501f, 0x497b8880, 0x497b8893, + 0x41780000, 0x05e9fa58, 0x59c40001, 0x82000500, + 0xfffffcff, 0x48038801, 0x42006000, 0xfc18ffff, + 0x41786800, 0x05f9fddb, 0x59c410a3, 0x84081518, + 0x05e9fdc9, 0x4a038808, 0x00000200, 0x5c000000, + 0x800001c0, 0x05fa0c99, 0x4a038805, 0x040000f0, + 0x59c40006, 0x82000500, 0xffffffcf, 0x82000540, + 0x440000c1, 0x48038806, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, - 0x4c5c0000, 0x599cb818, 0x905cbd30, 0x905cbd90, + 0x4c5c0000, 0x59a8b813, 0x825cbd80, 0x0000aaaa, 0x5c00b800, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, 0x4c5c0000, - 0x599cb818, 0x905cbd30, 0x905cbda0, 0x5c00b800, - 0x1c01f000, 0x490fc857, 0x910c0d13, 0x0500001b, - 0x599c1017, 0x4d3c0000, 0x910c0511, 0x05000005, - 0x417a7800, 0x8d0c0520, 0x05020007, 0x0501f00c, - 0x60227800, 0x8d0c0520, 0x05000009, 0x600c3000, - 0x0501f002, 0x60103000, 0x603a8000, 0x0521f9d5, - 0x599c1017, 0x8c08050a, 0x05020006, 0x60128000, - 0x0201f800, 0x0010b5d3, 0x4803c856, 0x850e1d08, - 0x5c027800, 0x0501f006, 0x8d0c0520, 0x05000004, - 0x603e8000, 0x60043000, 0x0521f9c6, 0x1c01f000, - 0x4803c856, 0x4c580000, 0x42000000, 0x00109861, - 0x0521ff69, 0x42000800, 0x00109b80, 0x59c40003, - 0x44000800, 0x59c40004, 0x48000801, 0x59c4000b, - 0x48000802, 0x59c4008e, 0x48000803, 0x59c4008f, - 0x48000804, 0x59c40090, 0x48000805, 0x59c40091, - 0x48000806, 0x59c40092, 0x48000807, 0x59c40093, - 0x48000808, 0x59c40099, 0x48000809, 0x59c4009e, - 0x4800080a, 0x59c400aa, 0x4800080b, 0x59c400af, - 0x4800080c, 0x59c400b2, 0x4800080d, 0x59c400b1, - 0x4800080e, 0x90040c0f, 0x41c41800, 0x60c0b000, - 0x580c0050, 0x44000800, 0x80040800, 0x800c1800, - 0x8058b040, 0x05fe07fb, 0x41c41800, 0x6080b000, - 0x580c0010, 0x44000800, 0x80040800, 0x800c1800, - 0x8058b040, 0x05fe07fb, 0x497b8830, 0x6100b000, - 0x59c40031, 0x44000800, 0x80040800, 0x8058b040, - 0x05fe07fc, 0x497b88ac, 0x6040b000, 0x59c400ad, - 0x44000800, 0x80040800, 0x8058b040, 0x05fe07fc, - 0x59c41001, 0x4c080000, 0x8408150c, 0x480b8801, - 0x4a0370e4, 0x00000300, 0x4a0370e5, 0xb0000000, - 0x60000810, 0x80040840, 0x05e00870, 0x59b800e5, - 0x8c000538, 0x05fe07fc, 0x4a0370e4, 0x00000200, - 0x42006000, 0xffffffff, 0x42006800, 0x80000000, - 0x05f9fd4c, 0x64078807, 0x497b8807, 0x0501faa1, - 0x4a038808, 0x00000210, 0x42006000, 0xfcf8ffff, - 0x42006800, 0x01000000, 0x05f9fd42, 0x5c001000, - 0x480b8801, 0x42000800, 0x00109b80, 0x50040000, - 0x48038803, 0x58040001, 0x48038804, 0x58040002, - 0x4803880b, 0x58040003, 0x4803888e, 0x58040004, - 0x4803888f, 0x58040005, 0x48038890, 0x58040006, - 0x48038891, 0x58040007, 0x48038892, 0x58040008, - 0x48038893, 0x58040009, 0x48038899, 0x5804000a, - 0x4803889e, 0x5804000b, 0x480388aa, 0x5804000c, - 0x480388af, 0x5804000d, 0x480388b2, 0x5804000e, - 0x480388b1, 0x90040c0f, 0x41c41800, 0x60c0b000, - 0x50040000, 0x48001850, 0x80040800, 0x800c1800, - 0x8058b040, 0x05fe07fb, 0x41c41800, 0x6080b000, - 0x50040000, 0x48001810, 0x80040800, 0x800c1800, - 0x8058b040, 0x05fe07fb, 0x497b8830, 0x6100b000, - 0x50040000, 0x48038831, 0x80040800, 0x8058b040, - 0x05fe07fc, 0x497b88ac, 0x6040b000, 0x50040000, - 0x480388ad, 0x80040800, 0x8058b040, 0x05fe07fc, - 0x497b8880, 0x41780000, 0x05e9f981, 0x59c408a4, - 0x90040d0f, 0x9004058c, 0x05e20814, 0x4a038805, - 0x04000000, 0x5c00b000, 0x1c01f000, 0x4803c856, - 0x4c580000, 0x4ce80000, 0x42000000, 0x0010974e, - 0x0521feb9, 0x59c41008, 0x4c080000, 0x82081500, - 0xffffff7f, 0x480b8808, 0x59c40004, 0x82000500, - 0x00003e02, 0x05000003, 0x6051d000, 0x0505fcdc, - 0x59c40006, 0x82000500, 0xffffff0f, 0x48038806, - 0x0501fa31, 0x64438805, 0x4a038808, 0x00000204, - 0x6194b000, 0x59c40005, 0x8c000508, 0x05020010, - 0x61a1d007, 0x0505fcce, 0x8058b040, 0x05fe07fa, - 0x601c2000, 0x0501f922, 0x0501fa1c, 0x0509fa1a, - 0x4803c856, 0x4a038808, 0x00000208, 0x64075014, - 0x6006d800, 0x90000541, 0x0501f032, 0x60042000, - 0x0501f917, 0x05e1fdca, 0x42000000, 0x0010983d, - 0x0521fe8d, 0x05e5f964, 0x497b8880, 0x59a8001f, - 0x82000500, 0x0000ffff, 0x4c000000, 0x05e9f940, - 0x5c000000, 0x48038880, 0x59c410a3, 0x84081518, - 0x05e9fcb7, 0x4a038808, 0x00000200, 0x64238805, - 0x6194b000, 0x4a038805, 0x000000f0, 0x05e9fbec, - 0x61c00801, 0x59c40005, 0x80040d00, 0x05000006, - 0x61a1d007, 0x0505fca2, 0x8058b040, 0x05fe07f6, - 0x05fdf7d4, 0x59c410a3, 0x84081558, 0x05e9fca4, - 0x60082000, 0x0501f8f2, 0x59c40006, 0x82000540, - 0x000000f0, 0x48038806, 0x59a80012, 0x80000540, - 0x05020002, 0x80000000, 0x48038893, 0x80000580, - 0x4df00000, 0x05e9fbfa, 0x5c03e000, 0x5c001000, - 0x480b8808, 0x5c01d000, 0x5c00b000, 0x1c01f000, - 0x4803c856, 0x4c580000, 0x4ce80000, 0x59c41008, + 0x599cb818, 0x905cbd30, 0x905cbd80, 0x5c00b800, + 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, + 0x60018800, 0x1c01f000, 0x4c5c0000, 0x599cb818, + 0x905cbd30, 0x905cbd90, 0x5c00b800, 0x1c01f000, + 0x0501f805, 0x60058800, 0x05000002, 0x60018800, + 0x1c01f000, 0x4c5c0000, 0x599cb818, 0x905cbd30, + 0x905cbda0, 0x5c00b800, 0x1c01f000, 0x490fc857, + 0x910c0d13, 0x0500001b, 0x599c1017, 0x4d3c0000, + 0x910c0511, 0x05000005, 0x417a7800, 0x8d0c0520, + 0x05020007, 0x0501f00c, 0x60227800, 0x8d0c0520, + 0x05000009, 0x600c3000, 0x0501f002, 0x60103000, + 0x603a8000, 0x0521fa50, 0x599c1017, 0x8c08050a, + 0x05020006, 0x60128000, 0x0201f800, 0x0010b5e0, + 0x4803c856, 0x850e1d08, 0x5c027800, 0x0501f006, + 0x8d0c0520, 0x05000004, 0x603e8000, 0x60043000, + 0x0521fa41, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x42000000, 0x001098e1, 0x0521fffd, 0x42000800, + 0x00109c00, 0x59c40003, 0x44000800, 0x59c40004, + 0x48000801, 0x59c4000b, 0x48000802, 0x59c4008e, + 0x48000803, 0x59c4008f, 0x48000804, 0x59c40090, + 0x48000805, 0x59c40091, 0x48000806, 0x59c40092, + 0x48000807, 0x59c40093, 0x48000808, 0x59c40099, + 0x48000809, 0x59c4009e, 0x4800080a, 0x59c400aa, + 0x4800080b, 0x59c400af, 0x4800080c, 0x59c400b2, + 0x4800080d, 0x59c400b1, 0x4800080e, 0x90040c0f, + 0x41c41800, 0x60c0b000, 0x580c0050, 0x44000800, + 0x80040800, 0x800c1800, 0x8058b040, 0x05fe07fb, + 0x41c41800, 0x6080b000, 0x580c0010, 0x44000800, + 0x80040800, 0x800c1800, 0x8058b040, 0x05fe07fb, + 0x497b8830, 0x6100b000, 0x59c40031, 0x44000800, + 0x80040800, 0x8058b040, 0x05fe07fc, 0x497b88ac, + 0x6040b000, 0x59c400ad, 0x44000800, 0x80040800, + 0x8058b040, 0x05fe07fc, 0x59c41001, 0x4c080000, + 0x8408150c, 0x480b8801, 0x4a0370e4, 0x00000300, + 0x4a0370e5, 0xb0000000, 0x60000810, 0x80040840, + 0x05e0083a, 0x59b800e5, 0x8c000538, 0x05fe07fc, + 0x4a0370e4, 0x00000200, 0x42006000, 0xffffffff, + 0x42006800, 0x80000000, 0x05f9fd22, 0x64078807, + 0x497b8807, 0x0501faa1, 0x4a038808, 0x00000210, + 0x42006000, 0xfcf8ffff, 0x42006800, 0x01000000, + 0x05f9fd18, 0x5c001000, 0x480b8801, 0x42000800, + 0x00109c00, 0x50040000, 0x48038803, 0x58040001, + 0x48038804, 0x58040002, 0x4803880b, 0x58040003, + 0x4803888e, 0x58040004, 0x4803888f, 0x58040005, + 0x48038890, 0x58040006, 0x48038891, 0x58040007, + 0x48038892, 0x58040008, 0x48038893, 0x58040009, + 0x48038899, 0x5804000a, 0x4803889e, 0x5804000b, + 0x480388aa, 0x5804000c, 0x480388af, 0x5804000d, + 0x480388b2, 0x5804000e, 0x480388b1, 0x90040c0f, + 0x41c41800, 0x60c0b000, 0x50040000, 0x48001850, + 0x80040800, 0x800c1800, 0x8058b040, 0x05fe07fb, + 0x41c41800, 0x6080b000, 0x50040000, 0x48001810, + 0x80040800, 0x800c1800, 0x8058b040, 0x05fe07fb, + 0x497b8830, 0x6100b000, 0x50040000, 0x48038831, + 0x80040800, 0x8058b040, 0x05fe07fc, 0x497b88ac, + 0x6040b000, 0x50040000, 0x480388ad, 0x80040800, + 0x8058b040, 0x05fe07fc, 0x497b8880, 0x41780000, + 0x05e9f949, 0x59c408a4, 0x90040d0f, 0x9004058c, + 0x05de0fde, 0x4a038805, 0x04000000, 0x5c00b000, + 0x1c01f000, 0x4803c856, 0x4c580000, 0x4ce80000, + 0x42000000, 0x001097ce, 0x0521ff4d, 0x59c41008, 0x4c080000, 0x82081500, 0xffffff7f, 0x480b8808, 0x59c40004, 0x82000500, 0x00003e02, 0x05000003, - 0x6051d000, 0x0505fc7a, 0x05e1fd85, 0x42000000, - 0x0010983e, 0x0521fe48, 0x05e5f91f, 0x60002000, - 0x0501f8cb, 0x4a038808, 0x00000202, 0x80000580, - 0x48038880, 0x48038893, 0x05e9f8f9, 0x6010b007, - 0x4a038805, 0x000000f0, 0x05e9fbad, 0x61c00801, - 0x59c40005, 0x80040d00, 0x05000016, 0x82000500, - 0x000000d0, 0x0502001f, 0x619dd000, 0x0505fc60, - 0x8058b040, 0x05fe07f3, 0x601c2000, 0x0501f8b4, - 0x0509f9ad, 0x0501f9ad, 0x4a038808, 0x00000208, - 0x64075014, 0x6006d800, 0x59c40006, 0x8400050a, - 0x48038806, 0x64838805, 0x90000541, 0x0501f01b, - 0x59c410a3, 0x84081518, 0x05e9fc55, 0x4a038808, - 0x00000200, 0x6095d000, 0x0505fc49, 0x59c410a3, - 0x84081558, 0x05e9fc4e, 0x60082000, 0x0501f89c, - 0x497b8880, 0x59a80012, 0x80000540, 0x05020002, - 0x80000000, 0x48038893, 0x59a8001f, 0x82000500, - 0x0000ffff, 0x4c000000, 0x05e9f8c5, 0x5c000000, - 0x48038880, 0x80000580, 0x4df00000, 0x05e9fba0, - 0x5c03e000, 0x5c001000, 0x480b8808, 0x5c01d000, - 0x5c00b000, 0x1c01f000, 0x4803c856, 0x60042000, - 0x0501f883, 0x59c40004, 0x82000500, 0x00003e02, - 0x05000008, 0x0509f978, 0x0501f978, 0x4a038808, - 0x00000208, 0x64075014, 0x6006d800, 0x0501f046, - 0x05e1fd2b, 0x42000000, 0x0010983f, 0x0521fdee, - 0x05e5f8c5, 0x59c40006, 0x84000508, 0x48038806, - 0x64438805, 0x850e1d4c, 0x61900800, 0x42001000, - 0x00104021, 0x0505fbf8, 0x59c410a3, 0x84081518, - 0x05e9fc17, 0x4a038808, 0x00000200, 0x497b8880, - 0x4a038805, 0x000000f0, 0x05e9fb4d, 0x61c00801, - 0x59c40005, 0x80040d00, 0x0500000b, 0x82000500, - 0x000000e0, 0x0502000d, 0x61a1d007, 0x0505fc00, - 0x0505fa7e, 0x59940004, 0x80000540, 0x05fe07f1, - 0x0501f021, 0x59c410a3, 0x84081558, 0x05e9fc00, - 0x60082000, 0x0501f84e, 0x4c080000, 0x42001000, - 0x00104021, 0x0505fbe1, 0x5c001000, 0x497b8880, + 0x6051d000, 0x0505fd32, 0x59c40006, 0x82000500, + 0xffffff0f, 0x48038806, 0x0501fa31, 0x64438805, + 0x4a038808, 0x00000204, 0x6194b000, 0x59c40005, + 0x8c000508, 0x05020010, 0x61a1d007, 0x0505fd24, + 0x8058b040, 0x05fe07fa, 0x601c2000, 0x0501f922, + 0x0501fa1c, 0x0509fa70, 0x4803c856, 0x4a038808, + 0x00000208, 0x64075014, 0x6006d800, 0x90000541, + 0x0501f032, 0x60042000, 0x0501f917, 0x05e1fd92, + 0x42000000, 0x001098bd, 0x0521ff21, 0x05e5f92e, + 0x497b8880, 0x59a8001f, 0x82000500, 0x0000ffff, + 0x4c000000, 0x05e9f908, 0x5c000000, 0x48038880, + 0x59c410a3, 0x84081518, 0x05e9fc7f, 0x4a038808, + 0x00000200, 0x64238805, 0x6194b000, 0x4a038805, + 0x000000f0, 0x05e9fbb4, 0x61c00801, 0x59c40005, + 0x80040d00, 0x05000006, 0x61a1d007, 0x0505fcf8, + 0x8058b040, 0x05fe07f6, 0x05fdf7d4, 0x59c410a3, + 0x84081558, 0x05e9fc6c, 0x60082000, 0x0501f8f2, + 0x59c40006, 0x82000540, 0x000000f0, 0x48038806, 0x59a80012, 0x80000540, 0x05020002, 0x80000000, - 0x48038893, 0x59a8001f, 0x82000500, 0x0000ffff, - 0x4c000000, 0x05e9f872, 0x5c000000, 0x48038880, - 0x850e1d0c, 0x59c40006, 0x84000548, 0x48038806, - 0x05e9fb4b, 0x59c40008, 0x82000540, 0x00000280, - 0x48038808, 0x1c01f000, 0x4803c856, 0x4d400000, - 0x4d3c0000, 0x0509f928, 0x0521feb6, 0x0502001d, - 0x599c1017, 0x8d0c0500, 0x05020009, 0x8c08051a, - 0x05000018, 0x850e1d42, 0x60128000, 0x60227800, - 0x8d0c0520, 0x05020006, 0x0501f00e, 0x60128000, - 0x417a7800, 0x8d0c0520, 0x0500000a, 0x4d400000, - 0x603a8000, 0x600c3000, 0x61fe89ff, 0x051dffe6, - 0x5c028000, 0x599c0817, 0x8c04050a, 0x05020005, - 0x4943c857, 0x493fc857, 0x0201f800, 0x0010b5d3, - 0x497b8880, 0x6006d800, 0x05fdfd4e, 0x5c027800, - 0x5c028000, 0x1c01f000, 0x05e1fcbd, 0x42000000, - 0x00109840, 0x0521fd80, 0x05e5f857, 0x60040000, - 0x05e9f837, 0x64078880, 0x05e9f315, 0x42000800, - 0x0010940c, 0x48100802, 0x90101488, 0x05001008, - 0x58040001, 0x4803c857, 0x4813c857, 0x58040003, - 0x80000000, 0x48000803, 0x60082000, 0x58040001, - 0x9000148b, 0x05001007, 0x4803c857, 0x4813c857, - 0x58040003, 0x80000000, 0x48000803, 0x60000000, - 0x48000800, 0x59c428a4, 0x90142d0f, 0x90142d8c, - 0x0c000002, 0x0501f0fb, 0x00104341, 0x0010435b, - 0x00104375, 0x0010438f, 0x001043a9, 0x001043bf, - 0x001043ce, 0x001043e1, 0x001043f4, 0x00104407, - 0x00104409, 0x40100000, 0x0c01f001, 0x0010434b, - 0x0010434d, 0x0010434f, 0x00104350, 0x00104352, - 0x00104354, 0x00104357, 0x00104359, 0x64080801, - 0x1c01f000, 0x640c0801, 0x0501f0bc, 0x1c01f000, - 0x641c0801, 0x1c01f000, 0x64100801, 0x0501f0ba, - 0x64140801, 0x0501f8be, 0x0501f0ba, 0x64140801, - 0x0501f0bb, 0x4813c857, 0x1c01f000, 0x40100000, - 0x0c01f001, 0x00104365, 0x00104367, 0x00104369, - 0x0010436a, 0x0010436c, 0x0010436e, 0x00104371, - 0x00104373, 0x64080801, 0x1c01f000, 0x640c0801, - 0x1c01f000, 0x1c01f000, 0x641c0801, 0x1c01f000, - 0x64100801, 0x0501f0a0, 0x64140801, 0x0501f8a4, - 0x0501f0a0, 0x64140801, 0x1c01f000, 0x64140801, - 0x0501f099, 0x40100000, 0x0c01f001, 0x0010437f, - 0x00104380, 0x00104382, 0x00104384, 0x00104386, - 0x00104388, 0x0010438b, 0x0010438d, 0x1c01f000, - 0x640c0801, 0x1c01f000, 0x64000801, 0x1c01f000, - 0x641c0801, 0x1c01f000, 0x64100801, 0x0501f086, - 0x64140801, 0x0501f88a, 0x0501f086, 0x64140801, - 0x1c01f000, 0x64140801, 0x0501f07f, 0x40100000, - 0x0c01f001, 0x00104399, 0x0010439b, 0x0010439c, - 0x0010439e, 0x001043a0, 0x001043a2, 0x001043a5, - 0x001043a7, 0x64080801, 0x1c01f000, 0x1c01f000, - 0x64000801, 0x1c01f000, 0x641c0801, 0x1c01f000, - 0x64100801, 0x0501f06c, 0x64140801, 0x0501f870, - 0x0501f06c, 0x64140801, 0x1c01f000, 0x64140801, - 0x0501f065, 0x40100000, 0x0c01f001, 0x001043b3, - 0x001043b5, 0x001043b5, 0x001043b6, 0x001043b5, - 0x001043b8, 0x001043bb, 0x001043bd, 0x64080801, - 0x1c01f000, 0x1c01f000, 0x641c0801, 0x1c01f000, - 0x64140801, 0x0501f85a, 0x0501f056, 0x64140801, - 0x1c01f000, 0x64140801, 0x0501f04f, 0x40100000, - 0x0c01f001, 0x001043cd, 0x001043cd, 0x001043cd, - 0x001043c9, 0x001043cb, 0x001043cd, 0x001043cd, - 0x001043cd, 0x641c0801, 0x1c01f000, 0x64100801, - 0x1c01f000, 0x1c01f000, 0x40100000, 0x0c01f001, - 0x001043d8, 0x001043da, 0x001043da, 0x001043db, - 0x001043dd, 0x001043df, 0x001043df, 0x001043df, - 0x64080801, 0x1c01f000, 0x1c01f000, 0x641c0801, - 0x1c01f000, 0x64100801, 0x0501f02f, 0x64200801, - 0x1c01f000, 0x40100000, 0x0c01f001, 0x001043eb, - 0x001043ed, 0x001043ef, 0x001043ef, 0x001043f0, - 0x001043f2, 0x001043f2, 0x001043f2, 0x64080801, + 0x48038893, 0x80000580, 0x4df00000, 0x05e9fbc2, + 0x5c03e000, 0x5c001000, 0x480b8808, 0x5c01d000, + 0x5c00b000, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x4ce80000, 0x59c41008, 0x4c080000, 0x82081500, + 0xffffff7f, 0x480b8808, 0x59c40004, 0x82000500, + 0x00003e02, 0x05000003, 0x6051d000, 0x0505fcd0, + 0x05e1fd4d, 0x42000000, 0x001098be, 0x0521fedc, + 0x05e5f8e9, 0x60002000, 0x0501f8cb, 0x4a038808, + 0x00000202, 0x80000580, 0x48038880, 0x48038893, + 0x05e9f8c1, 0x6010b007, 0x4a038805, 0x000000f0, + 0x05e9fb75, 0x61c00801, 0x59c40005, 0x80040d00, + 0x05000016, 0x82000500, 0x000000d0, 0x0502001f, + 0x619dd000, 0x0505fcb6, 0x8058b040, 0x05fe07f3, + 0x601c2000, 0x0501f8b4, 0x0509fa03, 0x0501f9ad, + 0x4a038808, 0x00000208, 0x64075014, 0x6006d800, + 0x59c40006, 0x8400050a, 0x48038806, 0x64838805, + 0x90000541, 0x0501f01b, 0x59c410a3, 0x84081518, + 0x05e9fc1d, 0x4a038808, 0x00000200, 0x6095d000, + 0x0505fc9f, 0x59c410a3, 0x84081558, 0x05e9fc16, + 0x60082000, 0x0501f89c, 0x497b8880, 0x59a80012, + 0x80000540, 0x05020002, 0x80000000, 0x48038893, + 0x59a8001f, 0x82000500, 0x0000ffff, 0x4c000000, + 0x05e9f88d, 0x5c000000, 0x48038880, 0x80000580, + 0x4df00000, 0x05e9fb68, 0x5c03e000, 0x5c001000, + 0x480b8808, 0x5c01d000, 0x5c00b000, 0x1c01f000, + 0x4803c856, 0x60042000, 0x0501f883, 0x59c40004, + 0x82000500, 0x00003e02, 0x05000008, 0x0509f9ce, + 0x0501f978, 0x4a038808, 0x00000208, 0x64075014, + 0x6006d800, 0x0501f046, 0x05e1fcf3, 0x42000000, + 0x001098bf, 0x0521fe82, 0x05e5f88f, 0x59c40006, + 0x84000508, 0x48038806, 0x64438805, 0x850e1d4c, + 0x61900800, 0x42001000, 0x00104057, 0x0505fc4e, + 0x59c410a3, 0x84081518, 0x05e9fbdf, 0x4a038808, + 0x00000200, 0x497b8880, 0x4a038805, 0x000000f0, + 0x05e9fb15, 0x61c00801, 0x59c40005, 0x80040d00, + 0x0500000b, 0x82000500, 0x000000e0, 0x0502000d, + 0x61a1d007, 0x0505fc56, 0x0505fad4, 0x59940004, + 0x80000540, 0x05fe07f1, 0x0501f021, 0x59c410a3, + 0x84081558, 0x05e9fbc8, 0x60082000, 0x0501f84e, + 0x4c080000, 0x42001000, 0x00104057, 0x0505fc37, + 0x5c001000, 0x497b8880, 0x59a80012, 0x80000540, + 0x05020002, 0x80000000, 0x48038893, 0x59a8001f, + 0x82000500, 0x0000ffff, 0x4c000000, 0x05e9f83a, + 0x5c000000, 0x48038880, 0x850e1d0c, 0x59c40006, + 0x84000548, 0x48038806, 0x05e9fb13, 0x59c40008, + 0x82000540, 0x00000280, 0x48038808, 0x1c01f000, + 0x4803c856, 0x4d400000, 0x4d3c0000, 0x0509f97e, + 0x0521ff4a, 0x0502001d, 0x599c1017, 0x8d0c0500, + 0x05020009, 0x8c08051a, 0x05000018, 0x850e1d42, + 0x60128000, 0x60227800, 0x8d0c0520, 0x05020006, + 0x0501f00e, 0x60128000, 0x417a7800, 0x8d0c0520, + 0x0500000a, 0x4d400000, 0x603a8000, 0x600c3000, + 0x61fe89ff, 0x0521f861, 0x5c028000, 0x599c0817, + 0x8c04050a, 0x05020005, 0x4943c857, 0x493fc857, + 0x0201f800, 0x0010b5e0, 0x497b8880, 0x6006d800, + 0x05fdfd4e, 0x5c027800, 0x5c028000, 0x1c01f000, + 0x05e1fc85, 0x42000000, 0x001098c0, 0x0521fe14, + 0x05e5f821, 0x60040000, 0x05e5ffff, 0x64078880, + 0x05e9f2dd, 0x42000800, 0x0010948c, 0x48100802, + 0x90101488, 0x05001008, 0x58040001, 0x4803c857, + 0x4813c857, 0x58040003, 0x80000000, 0x48000803, + 0x60082000, 0x58040001, 0x9000148b, 0x05001007, + 0x4803c857, 0x4813c857, 0x58040003, 0x80000000, + 0x48000803, 0x60000000, 0x48000800, 0x59c428a4, + 0x90142d0f, 0x90142d8c, 0x0c000002, 0x0501f0fb, + 0x00104377, 0x00104391, 0x001043ab, 0x001043c5, + 0x001043df, 0x001043f5, 0x00104404, 0x00104417, + 0x0010442a, 0x0010443d, 0x0010443f, 0x40100000, + 0x0c01f001, 0x00104381, 0x00104383, 0x00104385, + 0x00104386, 0x00104388, 0x0010438a, 0x0010438d, + 0x0010438f, 0x64080801, 0x1c01f000, 0x640c0801, + 0x0501f0bc, 0x1c01f000, 0x641c0801, 0x1c01f000, + 0x64100801, 0x0501f0ba, 0x64140801, 0x0501f8be, + 0x0501f0ba, 0x64140801, 0x0501f0bb, 0x4813c857, + 0x1c01f000, 0x40100000, 0x0c01f001, 0x0010439b, + 0x0010439d, 0x0010439f, 0x001043a0, 0x001043a2, + 0x001043a4, 0x001043a7, 0x001043a9, 0x64080801, 0x1c01f000, 0x640c0801, 0x1c01f000, 0x1c01f000, - 0x64100801, 0x0501f01c, 0x64200801, 0x1c01f000, - 0x40100000, 0x0c01f001, 0x001043fe, 0x001043fe, - 0x00104400, 0x00104401, 0x00104403, 0x00104400, - 0x00104405, 0x00104400, 0x64140801, 0x0501f00b, + 0x641c0801, 0x1c01f000, 0x64100801, 0x0501f0a0, + 0x64140801, 0x0501f8a4, 0x0501f0a0, 0x64140801, + 0x1c01f000, 0x64140801, 0x0501f099, 0x40100000, + 0x0c01f001, 0x001043b5, 0x001043b6, 0x001043b8, + 0x001043ba, 0x001043bc, 0x001043be, 0x001043c1, + 0x001043c3, 0x1c01f000, 0x640c0801, 0x1c01f000, + 0x64000801, 0x1c01f000, 0x641c0801, 0x1c01f000, + 0x64100801, 0x0501f086, 0x64140801, 0x0501f88a, + 0x0501f086, 0x64140801, 0x1c01f000, 0x64140801, + 0x0501f07f, 0x40100000, 0x0c01f001, 0x001043cf, + 0x001043d1, 0x001043d2, 0x001043d4, 0x001043d6, + 0x001043d8, 0x001043db, 0x001043dd, 0x64080801, + 0x1c01f000, 0x1c01f000, 0x64000801, 0x1c01f000, + 0x641c0801, 0x1c01f000, 0x64100801, 0x0501f06c, + 0x64140801, 0x0501f870, 0x0501f06c, 0x64140801, + 0x1c01f000, 0x64140801, 0x0501f065, 0x40100000, + 0x0c01f001, 0x001043e9, 0x001043eb, 0x001043eb, + 0x001043ec, 0x001043eb, 0x001043ee, 0x001043f1, + 0x001043f3, 0x64080801, 0x1c01f000, 0x1c01f000, + 0x641c0801, 0x1c01f000, 0x64140801, 0x0501f85a, + 0x0501f056, 0x64140801, 0x1c01f000, 0x64140801, + 0x0501f04f, 0x40100000, 0x0c01f001, 0x00104403, + 0x00104403, 0x00104403, 0x001043ff, 0x00104401, + 0x00104403, 0x00104403, 0x00104403, 0x641c0801, + 0x1c01f000, 0x64100801, 0x1c01f000, 0x1c01f000, + 0x40100000, 0x0c01f001, 0x0010440e, 0x00104410, + 0x00104410, 0x00104411, 0x00104413, 0x00104415, + 0x00104415, 0x00104415, 0x64080801, 0x1c01f000, 0x1c01f000, 0x641c0801, 0x1c01f000, 0x64100801, - 0x1c01f000, 0x64200801, 0x1c01f000, 0x64240801, - 0x1c01f000, 0x1c01f000, 0x42000000, 0x00109738, - 0x0521f489, 0x42000000, 0x00109735, 0x0521f486, - 0x42000000, 0x00109737, 0x0521f483, 0x42000000, - 0x00109736, 0x0521f480, 0x42000800, 0x0010940c, - 0x58040001, 0x48000800, 0x64140801, 0x64200802, - 0x1c01f000, 0x42000800, 0x0010940c, 0x58040001, - 0x48000800, 0x64040801, 0x64280802, 0x1c01f000, - 0x42000800, 0x0010940c, 0x58040001, 0x48000800, - 0x64180801, 0x64240802, 0x1c01f000, 0x42000800, - 0x0010940c, 0x64280801, 0x64280800, 0x1c01f000, - 0x496fc857, 0x4813c857, 0x40100000, 0x0c01f001, - 0x0010444a, 0x0010444a, 0x0010444a, 0x0010444a, - 0x0010443c, 0x00104444, 0x00104448, 0x0010444a, - 0x59a8021b, 0x8c000506, 0x05000003, 0x8c000502, - 0x0500000a, 0x0501f80a, 0x05fe07cb, 0x0501f007, - 0x0501f807, 0x05000005, 0x05fdffca, 0x05fdf7cc, - 0x0501f803, 0x05fe07ca, 0x1c01f000, 0x496fc857, - 0x416c0000, 0x90000c88, 0x05de1d98, 0x0c01f001, - 0x00104458, 0x0010445a, 0x0010445a, 0x0010445a, - 0x00104458, 0x00104458, 0x00104458, 0x0010445a, - 0x80000580, 0x1c01f000, 0x90000541, 0x1c01f000, - 0x6002e000, 0x497b3004, 0x4a03b004, 0x60000001, - 0x59d80005, 0x4a03b004, 0x90000001, 0x4a03a804, - 0x60000001, 0x59d40005, 0x4a03a804, 0x90000001, - 0x0501f3c3, 0x6413c825, 0x6413c827, 0x599c0409, - 0x80000d40, 0x0500001f, 0x599c0407, 0x80000540, - 0x05000007, 0x800000cc, 0x599c100b, 0x80080400, - 0x4803b000, 0x497bb002, 0x59d80001, 0x599c000b, - 0x4803b000, 0x599c000c, 0x4803b001, 0x599c0407, - 0x80000540, 0x05020002, 0x497bb002, 0x599c0c09, - 0x82040540, 0x00400000, 0x4803b003, 0x6417b009, - 0x4a03b004, 0x10000001, 0x59e00803, 0x82040d00, - 0xfffffeff, 0x82040d40, 0x00008000, 0x4807c003, - 0x599c040a, 0x80000540, 0x0500001f, 0x599c0408, - 0x80000540, 0x05000007, 0x800000cc, 0x599c100f, - 0x80080400, 0x4803a800, 0x497ba802, 0x59d40001, - 0x599c000f, 0x4803a800, 0x599c0010, 0x4803a801, - 0x599c0408, 0x80000540, 0x05020002, 0x497ba802, - 0x599c0c0a, 0x82040540, 0x00400000, 0x4803a803, - 0x6417a809, 0x4a03a804, 0x10000001, 0x59e00803, - 0x82040d00, 0xfffffbff, 0x82040d40, 0x00008000, - 0x4807c003, 0x800409c0, 0x05000004, 0x6006e000, - 0x0000be96, 0x0000f6a9, 0x1c01f000, 0x05ddfd33, - 0x1c01f000, 0x0501f850, 0x5c03e000, 0x0001f622, - 0x0001fe4a, 0x05fdf7fd, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104511, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00020641, 0x00104505, 0x00104505, 0x00104511, - 0x00104511, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x492fc857, 0x42000000, 0x001097f3, - 0x0521fb8d, 0x60000008, 0x0501f013, 0x492fc857, - 0x42000000, 0x001097f2, 0x0521fb87, 0x60000020, - 0x0501f00d, 0x492fc857, 0x42000000, 0x001097f1, - 0x0521fb81, 0x60000040, 0x0501f007, 0x492fc857, - 0x42000000, 0x001097f4, 0x0521fb7b, 0x60000010, - 0x0501f001, 0x4803c857, 0x592c0c05, 0x82040d00, - 0xffff80ff, 0x80040540, 0x59980803, 0x800409c0, - 0x05000002, 0x8400051e, 0x48025c05, 0x0001fb2c, - 0x91700583, 0x6006e000, 0x05000002, 0x1c01f000, - 0x599a5801, 0x812e59c0, 0x05fe07e3, 0x05ddfcb7, - 0x492fc857, 0x80140110, 0x05fc07d9, 0x80000040, - 0x05000020, 0x4a033006, 0x00104554, 0x0001f62b, - 0x492fc857, 0x0521fc6b, 0x00020636, 0x492fc856, - 0x83440400, 0x00108b80, 0x50000000, 0x80026d40, - 0x05000005, 0x4937c857, 0x59340200, 0x8c00050e, - 0x00020636, 0x60a28000, 0x41780800, 0x417a6000, - 0x05fdf9f8, 0x0515fce8, 0x0001f32c, 0x82000500, - 0x0f000000, 0x8000012a, 0x592c0c0b, 0x82040d00, - 0x0000ff87, 0x80040540, 0x48025c0b, 0x0001f63e, - 0x492fc857, 0x592c0409, 0x80000540, 0x05fe07c0, - 0x8d0c050e, 0x05020008, 0x592c0208, 0x80000540, - 0x05fc07bb, 0x497a5a07, 0x05f9fa05, 0x05020003, - 0x1c01f000, 0x60a00000, 0x48025a07, 0x0001f32c, - 0x592e8a07, 0x592c0407, 0x4947c857, 0x4803c857, - 0x82000500, 0x000000ff, 0x6004b800, 0x90000d81, - 0x0500000e, 0x417a8800, 0x61c0b80f, 0x90000d82, - 0x0500000a, 0x80000540, 0x0002032c, 0x592e8a07, - 0x0001fac4, 0x0002032c, 0x592e9009, 0x592e980a, - 0x05f9fd22, 0x0001f32c, 0x850e1d00, 0x0001fac4, - 0x05f80dfd, 0x81468800, 0x805cb840, 0x05fe07fc, - 0x0001f32c, 0x592c0a09, 0x4807c857, 0x9004058e, - 0x05000051, 0x900405aa, 0x05000019, 0x9004058f, - 0x050002b6, 0x900405ae, 0x050002b4, 0xb0040586, - 0x0500004d, 0xb0040585, 0x05000013, 0xb0040589, - 0x050002ae, 0x900405a9, 0x050202b0, 0x592e8a07, - 0x0001fac4, 0x050202a9, 0x59340200, 0x84000518, - 0x48026a00, 0x592e600a, 0x4933c857, 0x83300580, - 0xffffffff, 0x05020041, 0x0501f2a0, 0x850e1d04, - 0x0501f29e, 0x592c1408, 0x480bc857, 0x0515feaf, - 0x411e6000, 0x05020003, 0x4803c856, 0x0501f29b, - 0x59300c07, 0x90040584, 0x05000003, 0x4803c856, - 0x0501f296, 0x592c0208, 0x8c000506, 0x0500000b, - 0x0505fb83, 0x4df00000, 0x0505fa95, 0x0201f800, - 0x0010b998, 0x80c40040, 0x5c03e000, 0x05040b68, - 0x050df81d, 0x0501f285, 0x592e380a, 0x591c1416, - 0x8c080516, 0x05000285, 0x59300009, 0x800001c0, - 0x05de0c26, 0x84081554, 0x480a3c16, 0x64ea6403, - 0x592c040c, 0x80000540, 0x05000006, 0x64ee6403, - 0x592c020d, 0x4802641c, 0x592c040d, 0x4802621c, - 0x64066203, 0x42000800, 0x80000040, 0x0501fa7a, - 0x05000003, 0x492e6009, 0x0005f07c, 0x0005f87c, - 0x0501f26a, 0x59a80082, 0x84000510, 0x48035082, - 0x0501f266, 0x592c1208, 0x8c080500, 0x05020263, - 0x592e8a07, 0x592e600a, 0x0515fe7d, 0x05020003, - 0x4803c856, 0x0501f261, 0x59300c07, 0x90040584, - 0x05000003, 0x4803c856, 0x0501f25c, 0x59300a03, - 0x90040587, 0x05000003, 0x4803c856, 0x0501f257, - 0x59300c03, 0x90040581, 0x05000016, 0x90040582, - 0x0500000e, 0x90040588, 0x05000010, 0x9004058a, - 0x05000005, 0x9004058c, 0x05020014, 0x60240800, - 0x0501f011, 0x5932680a, 0x05f9fe57, 0x0502000f, - 0x60140800, 0x0501f00c, 0x417a7800, 0x0201f800, - 0x0010b652, 0x64066407, 0x600c0800, 0x0501f006, - 0x417a7800, 0x0201f800, 0x0010b652, 0x64066407, - 0x602c0800, 0x05f9fb01, 0x64066203, 0x0501fa3e, - 0x05000003, 0x492e6009, 0x0505f22a, 0x0505fa29, - 0x0501f22e, 0x59300416, 0x8c000518, 0x051e06a2, + 0x0501f02f, 0x64200801, 0x1c01f000, 0x40100000, + 0x0c01f001, 0x00104421, 0x00104423, 0x00104425, + 0x00104425, 0x00104426, 0x00104428, 0x00104428, + 0x00104428, 0x64080801, 0x1c01f000, 0x640c0801, + 0x1c01f000, 0x1c01f000, 0x64100801, 0x0501f01c, + 0x64200801, 0x1c01f000, 0x40100000, 0x0c01f001, + 0x00104434, 0x00104434, 0x00104436, 0x00104437, + 0x00104439, 0x00104436, 0x0010443b, 0x00104436, + 0x64140801, 0x0501f00b, 0x1c01f000, 0x641c0801, + 0x1c01f000, 0x64100801, 0x1c01f000, 0x64200801, + 0x1c01f000, 0x64240801, 0x1c01f000, 0x1c01f000, + 0x42000000, 0x001097b8, 0x0521f51d, 0x42000000, + 0x001097b5, 0x0521f51a, 0x42000000, 0x001097b7, + 0x0521f517, 0x42000000, 0x001097b6, 0x0521f514, + 0x42000800, 0x0010948c, 0x58040001, 0x48000800, + 0x64140801, 0x64200802, 0x1c01f000, 0x42000800, + 0x0010948c, 0x58040001, 0x48000800, 0x64040801, + 0x64280802, 0x1c01f000, 0x42000800, 0x0010948c, + 0x58040001, 0x48000800, 0x64180801, 0x64240802, + 0x1c01f000, 0x42000800, 0x0010948c, 0x64280801, + 0x64280800, 0x1c01f000, 0x496fc857, 0x4813c857, + 0x40100000, 0x0c01f001, 0x00104480, 0x00104480, + 0x00104480, 0x00104480, 0x00104472, 0x0010447a, + 0x0010447e, 0x00104480, 0x59a8021b, 0x8c000506, + 0x05000003, 0x8c000502, 0x0500000a, 0x0501f80a, + 0x05fe07cb, 0x0501f007, 0x0501f807, 0x05000005, + 0x05fdffca, 0x05fdf7cc, 0x0501f803, 0x05fe07ca, + 0x1c01f000, 0x496fc857, 0x416c0000, 0x90000c88, + 0x05de1d62, 0x0c01f001, 0x0010448e, 0x00104490, + 0x00104490, 0x00104490, 0x0010448e, 0x0010448e, + 0x0010448e, 0x00104490, 0x80000580, 0x1c01f000, + 0x90000541, 0x1c01f000, 0x6002e000, 0x497b3004, + 0x4a03b004, 0x60000001, 0x59d80005, 0x4a03b004, + 0x90000001, 0x4a03a804, 0x60000001, 0x59d40005, + 0x4a03a804, 0x90000001, 0x0501f3d6, 0x6413c825, + 0x6413c827, 0x599c0409, 0x80000d40, 0x0500001f, + 0x599c0407, 0x80000540, 0x05000007, 0x800000cc, + 0x599c100b, 0x80080400, 0x4803b000, 0x497bb002, + 0x59d80001, 0x599c000b, 0x4803b000, 0x599c000c, + 0x4803b001, 0x599c0407, 0x80000540, 0x05020002, + 0x497bb002, 0x599c0c09, 0x82040540, 0x00400000, + 0x4803b003, 0x6417b009, 0x4a03b004, 0x10000001, + 0x59e00803, 0x82040d00, 0xfffffeff, 0x82040d40, + 0x00008000, 0x4807c003, 0x599c040a, 0x80000540, + 0x0500001f, 0x599c0408, 0x80000540, 0x05000007, + 0x800000cc, 0x599c100f, 0x80080400, 0x4803a800, + 0x497ba802, 0x59d40001, 0x599c000f, 0x4803a800, + 0x599c0010, 0x4803a801, 0x599c0408, 0x80000540, + 0x05020002, 0x497ba802, 0x599c0c0a, 0x82040540, + 0x00400000, 0x4803a803, 0x6417a809, 0x4a03a804, + 0x10000001, 0x59e00803, 0x82040d00, 0xfffffbff, + 0x82040d40, 0x00008000, 0x4807c003, 0x800409c0, + 0x05000004, 0x6006e000, 0x0000be96, 0x0000f6a9, + 0x1c01f000, 0x05ddfcfd, 0x1c01f000, 0x0501f850, + 0x5c03e000, 0x0001f622, 0x0001fe4a, 0x05fdf7fd, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x00104547, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x00020641, 0x0010453b, + 0x0010453b, 0x00104547, 0x00104547, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x492fc857, + 0x42000000, 0x00109873, 0x0521fc21, 0x60000008, + 0x0501f013, 0x492fc857, 0x42000000, 0x00109872, + 0x0521fc1b, 0x60000020, 0x0501f00d, 0x492fc857, + 0x42000000, 0x00109871, 0x0521fc15, 0x60000040, + 0x0501f007, 0x492fc857, 0x42000000, 0x00109874, + 0x0521fc0f, 0x60000010, 0x0501f001, 0x4803c857, + 0x592c0c05, 0x82040d00, 0xffff80ff, 0x80040540, + 0x59980803, 0x800409c0, 0x05000002, 0x8400051e, + 0x48025c05, 0x0001fb2c, 0x91700583, 0x6006e000, + 0x05000002, 0x1c01f000, 0x599a5801, 0x812e59c0, + 0x05fe07e3, 0x05ddfc81, 0x492fc857, 0x80140110, + 0x05fc07d9, 0x80000040, 0x05000020, 0x4a033006, + 0x0010458a, 0x0001f62b, 0x492fc857, 0x0521fcff, + 0x00020636, 0x492fc856, 0x83440400, 0x00108c00, + 0x50000000, 0x80026d40, 0x05000005, 0x4937c857, + 0x59340200, 0x8c00050e, 0x00020636, 0x60a28000, + 0x41780800, 0x417a6000, 0x05fdf9f8, 0x0515fd48, + 0x0001f32c, 0x82000500, 0x0f000000, 0x8000012a, + 0x592c0c0b, 0x82040d00, 0x0000ff87, 0x80040540, + 0x48025c0b, 0x0001f63e, 0x492fc857, 0x592c0409, + 0x80000540, 0x05fe07c0, 0x8d0c050e, 0x05020008, + 0x592c0208, 0x80000540, 0x05fc07bb, 0x497a5a07, + 0x05f9f9db, 0x05020003, 0x1c01f000, 0x60a00000, + 0x48025a07, 0x0001f32c, 0x592e8a07, 0x592c0407, + 0x4947c857, 0x4803c857, 0x82000500, 0x000000ff, + 0x6004b800, 0x90000d81, 0x0500000e, 0x417a8800, + 0x61c0b80f, 0x90000d82, 0x0500000a, 0x80000540, + 0x0002032c, 0x592e8a07, 0x0001fac4, 0x0002032c, + 0x592e9009, 0x592e980a, 0x05f9fcff, 0x0001f32c, + 0x850e1d00, 0x0001fac4, 0x05f80dda, 0x81468800, + 0x805cb840, 0x05fe07fc, 0x0001f32c, 0x592c0a09, + 0x4807c857, 0x9004058e, 0x05000056, 0x900405aa, + 0x0500001e, 0x9004058f, 0x050002c9, 0x900405ae, + 0x050002c7, 0xb0040586, 0x05000052, 0xb0040585, + 0x05000018, 0xb0040589, 0x050002c1, 0x900405a9, + 0x050202c3, 0x592e8a07, 0x42026800, 0x0010993e, + 0x83440580, 0x0000ffff, 0x05000006, 0x0001fac4, + 0x050202b7, 0x59340200, 0x84000518, 0x48026a00, + 0x592e600a, 0x4933c857, 0x83300580, 0xffffffff, + 0x05020041, 0x0501f2ae, 0x850e1d04, 0x0501f2ac, + 0x592c1408, 0x480bc857, 0x0515ff0a, 0x411e6000, + 0x05020003, 0x4803c856, 0x0501f2a9, 0x59300c07, + 0x90040584, 0x05000003, 0x4803c856, 0x0501f2a4, + 0x592c0208, 0x8c000506, 0x0500000b, 0x0505fbd4, + 0x4df00000, 0x0505fae6, 0x0201f800, 0x0010b9a8, + 0x80c40040, 0x5c03e000, 0x05040bb9, 0x050df85a, + 0x0501f293, 0x592e380a, 0x591c1416, 0x8c080516, + 0x05000293, 0x59300009, 0x800001c0, 0x05de0beb, + 0x84081554, 0x480a3c16, 0x64ea6403, 0x592c040c, + 0x80000540, 0x05000006, 0x64ee6403, 0x592c020d, + 0x4802641c, 0x592c040d, 0x4802621c, 0x64066203, + 0x42000800, 0x80000040, 0x0501fa88, 0x05000003, + 0x492e6009, 0x0005f07c, 0x0005f87c, 0x0501f278, + 0x59a80082, 0x84000510, 0x48035082, 0x0501f274, + 0x592c1208, 0x8c080500, 0x05020271, 0x592e8a07, + 0x592e600a, 0x0515fed8, 0x05020003, 0x4803c856, + 0x0501f26f, 0x59300c07, 0x90040584, 0x05000003, + 0x4803c856, 0x0501f26a, 0x59300a03, 0x90040587, + 0x05000003, 0x4803c856, 0x0501f265, 0x59300c03, + 0x90040581, 0x05000016, 0x90040582, 0x0500000e, + 0x90040588, 0x05000010, 0x9004058a, 0x05000005, + 0x9004058c, 0x0502001d, 0x60240800, 0x0501f01a, + 0x5932680a, 0x05f9fe31, 0x05020018, 0x60140800, + 0x0501f015, 0x417a7800, 0x0201f800, 0x0010b660, + 0x64066407, 0x600c0800, 0x0501f00f, 0x83340580, + 0x0010993e, 0x05020007, 0x5930000a, 0x82000580, + 0x0010993e, 0x05020246, 0x64066407, 0x0501f007, + 0x417a7800, 0x0201f800, 0x0010b660, 0x64066407, + 0x602c0800, 0x05f9fac9, 0x64066203, 0x0501fa43, + 0x05000003, 0x492e6009, 0x0505f272, 0x0505fa71, + 0x0501f233, 0x59300416, 0x8c000518, 0x051e0716, 0x0501f088, 0x40000800, 0x58040000, 0x80000540, 0x05fe07fd, 0x492c0800, 0x1c01f000, 0x492fc857, 0x59300c07, 0x90040586, 0x0502007b, 0x59340400, @@ -4526,7 +4543,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x8c00051a, 0x00000682, 0x59340200, 0x8c00050e, 0x05000071, 0x59300203, 0x60067800, 0x90000587, 0x00020682, 0x640a6203, 0x0001f682, 0x600a8000, - 0x64526006, 0x4d2c0000, 0x051dfb2f, 0x5c025800, + 0x64526006, 0x4d2c0000, 0x051dfb9c, 0x5c025800, 0x59300c07, 0x4807c857, 0x90040587, 0x05020050, 0x492fc857, 0x64065a07, 0x0001f32c, 0x83300580, 0xffffffff, 0x0502004a, 0x592c240b, 0x492fc857, @@ -4536,7 +4553,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x0005f8ca, 0x05000059, 0x592c240b, 0x592c020d, 0x48026202, 0x4936600a, 0x4932580a, 0x641a6407, 0x641e6203, 0x0001f67d, 0x592c0a0d, 0x4c040000, - 0x05fdf885, 0x5c000800, 0x05020060, 0x58080000, + 0x05fdf859, 0x5c000800, 0x05020060, 0x58080000, 0x49781000, 0x802041c0, 0x05000006, 0x48004000, 0x80000540, 0x05020007, 0x48226810, 0x0501f005, 0x4802680f, 0x80000540, 0x05020002, 0x497a6810, @@ -4544,12 +4561,12 @@ static const uint32_t isp_2500_risc_code[] = { 0x5c025800, 0x05fdf7cb, 0x8c10051c, 0x05000015, 0x592c0207, 0x82000580, 0x0000ffff, 0x05020011, 0x592e600a, 0x83300580, 0xffffffff, 0x05fc07c1, - 0x0519f9e2, 0x0502000e, 0x592c220d, 0x59300202, + 0x0519fa34, 0x0502000e, 0x592c220d, 0x59300202, 0x80100580, 0x0502000a, 0x59300009, 0x800001c0, 0x05020004, 0x59300203, 0x90000587, 0x05fc07ac, 0x492fc857, 0x64a65a07, 0x0001f32c, 0x492fc857, 0x64225a07, 0x0001f32c, 0x4803c857, 0x8c000514, - 0x05000007, 0x42000000, 0x001097e2, 0x0521fa06, + 0x05000007, 0x42000000, 0x00109862, 0x0521fa8c, 0x492fc857, 0x492e6009, 0x1c01f000, 0x492fc857, 0x65165a07, 0x0001f32c, 0x492fc857, 0x64aa5a07, 0x0001f32c, 0x492fc857, 0x64a25a07, 0x0001f32c, @@ -4561,217 +4578,209 @@ static const uint32_t isp_2500_risc_code[] = { 0x492c0800, 0x1c01f000, 0x59340203, 0x492e680f, 0x492fc857, 0x4803c857, 0x80000540, 0x05020002, 0x64066a03, 0x1c01f000, 0x59a8000d, 0x81640480, - 0x05fe177c, 0x42026000, 0x0010cca4, 0x5930000a, - 0x81340580, 0x05020004, 0x59300202, 0x80040580, - 0x05fc076b, 0x91326424, 0x41580000, 0x81300480, - 0x05fc17f7, 0x05fdf76f, 0x492fc857, 0x592c0205, - 0x80000112, 0x05fe063e, 0x592e8a07, 0x0001fac4, - 0x0502004a, 0x05f9fd66, 0x0502004a, 0x592e780b, - 0x493fc857, 0x8d3c053e, 0x05020005, 0x8d0c050e, - 0x05020042, 0x05f9fcaa, 0x05fc063d, 0x913c1d1f, - 0x05fc063b, 0x592c0208, 0x82000c80, 0x00001000, - 0x05fe1637, 0x800000c2, 0x800008c4, 0x8005d400, - 0x592e9009, 0x592e980a, 0x5934080d, 0x800409c0, - 0x05000004, 0x58041802, 0x800c19c0, 0x0502002b, - 0x913c1d1f, 0x81780040, 0x80000000, 0x800c1902, - 0x05fe17fe, 0x05fe0626, 0x0c01f001, 0x001046f8, - 0x001046fa, 0x00104703, 0x00104705, 0x00104707, - 0x0515f9fb, 0x0501f019, 0x05f9fc63, 0x0500001d, - 0x80e9d1c0, 0x05020e9f, 0x60168000, 0x417a9000, - 0x417a9800, 0x0515f9fe, 0x0501f010, 0x61367000, - 0x0501f004, 0x613a7000, 0x0501f002, 0x614a7000, - 0x5934080d, 0x800409c0, 0x05000006, 0x4d3c0000, - 0x40067800, 0x05f9fc34, 0x5c027800, 0x05000007, - 0x05f9fb4b, 0x05160a1a, 0x05000006, 0x8d3c053e, - 0x0502000a, 0x1c01f000, 0x64c25a07, 0x0501f009, - 0x64b25a07, 0x0501f007, 0x64a25a07, 0x0501f005, - 0x64a65a07, 0x0501f003, 0x497a580a, 0x64025a07, - 0x4a025a05, 0x00000103, 0x0001f32c, 0x492fc857, - 0x80140110, 0x80000040, 0x05000002, 0x05fdf5e4, - 0x592c0208, 0x82000500, 0x000003ff, 0x48025a08, - 0x8c000506, 0x05000003, 0xb0000530, 0x05020003, - 0x8d0c050e, 0x05020014, 0x4a025a07, 0x0000dead, - 0x592c0409, 0x82000500, 0x0000f0ff, 0x48025c09, - 0x05f9f84f, 0x05020002, 0x1c01f000, 0x49425a07, - 0x8058b1c0, 0x05000007, 0x0515fe20, 0x0501f80a, - 0x44042800, 0x90580582, 0x05020002, 0x48082801, - 0x0001f32c, 0x60c68000, 0x60040800, 0x6004b000, - 0x05fdf7f3, 0x592c0409, 0x80000118, 0x912c2c0a, - 0x80142c00, 0x1c01f000, 0x492fc857, 0x641a5a09, - 0x0001f32c, 0x492fc857, 0x64065a09, 0x0001f32c, - 0x492fc857, 0x592e7c07, 0x833c0500, 0xfffffffe, - 0x05020039, 0x592c4008, 0x42026000, 0x0010cca4, - 0x41581800, 0x400c0000, 0x81300480, 0x0502101d, - 0x59300203, 0x90000580, 0x05000007, 0x59300009, - 0x80000d40, 0x05000004, 0x58040006, 0x80200580, - 0x05000003, 0x91326424, 0x05fdf7f3, 0x58040205, - 0x82000500, 0x000000ff, 0xb0000d93, 0x05000007, - 0xb0000d88, 0x05000005, 0x90000d98, 0x05000003, - 0x90000da9, 0x05fe07f4, 0x4d2c0000, 0x0511fe39, - 0x5c025800, 0x05000018, 0x64025a07, 0x0001f32c, - 0x592e8a07, 0x83440480, 0x000007f0, 0x05021012, - 0x83440400, 0x00108b80, 0x50000000, 0x80026d40, - 0x0500000d, 0x4d2c0000, 0x05f9fb97, 0x05000009, - 0x60168000, 0x592c0a09, 0x417a6000, 0x05f9ffb5, - 0x0515faaa, 0x0001fb2c, 0x5c025800, 0x05fdf7eb, - 0x5c025800, 0x64c65a07, 0x0001f32c, 0x492fc857, - 0x4d2c0000, 0x05ddfdd3, 0x05000011, 0x492fc857, - 0x412f4000, 0x05ddfdcf, 0x0500000b, 0x492fc857, - 0x412dd800, 0x05f1fee6, 0x05f1feee, 0x49a1d80a, - 0x5c025800, 0x492dd809, 0x48ef4006, 0x05e9fb82, - 0x05e9f399, 0x41a25800, 0x05ddfdd2, 0x5c025800, - 0x4a025a07, 0x00004005, 0x640a5c07, 0x0001f32c, - 0x4807c857, 0x485fc857, 0x6004b800, 0x5c000800, - 0x4c5c0000, 0x0501f005, 0x4807c857, 0x485fc857, - 0x5c000800, 0x4d780000, 0x4803c857, 0x492fc857, - 0x8c00050e, 0x05de0a23, 0x4203e000, 0x50000000, - 0x600cb900, 0x05ddf22d, 0x80140110, 0x80000040, - 0x05fe054b, 0x599c0019, 0x8c000510, 0x0502000b, - 0x05f9fcc9, 0x05020002, 0x1c01f000, 0x49425a07, - 0x4806580e, 0x480a580f, 0x4943c857, 0x4807c857, - 0x480bc857, 0x0001f32c, 0x592c040c, 0x82000500, - 0x0000e000, 0x82000580, 0x00006000, 0x05fc07f1, - 0x59a8021b, 0x8c000508, 0x05fc07ee, 0x592c120c, - 0x592c080b, 0x82040500, 0xff000000, 0x80040d80, - 0x80000110, 0x80081540, 0x05000004, 0x4806580b, - 0x0501f86c, 0x05fdf7e3, 0x60701000, 0x60640800, - 0x60c68000, 0x05fdf7e2, 0x80140110, 0x80000040, - 0x05fe0523, 0x05f9fdcd, 0x05020002, 0x1c01f000, - 0x49425a07, 0x48065812, 0x480a5813, 0x0001f32c, - 0x80140110, 0x05fc051a, 0x80000040, 0x0502000a, - 0x6006e000, 0x592c020b, 0x8c000504, 0x00000630, - 0x592c0208, 0x82000c80, 0x00001001, 0x05fe151c, - 0x0501f004, 0x4a033006, 0x00020630, 0x0001f62b, - 0x592c1014, 0x82080500, 0xffff0003, 0x05fe0514, - 0x600ae000, 0x42000000, 0x00109969, 0x50007000, - 0x592c0012, 0x592c0813, 0x48007006, 0x48047007, - 0x492c700a, 0x4978700d, 0x4978700b, 0x0501f001, - 0x4978700c, 0x82080480, 0x00000180, 0x4803c857, - 0x05001006, 0x4800700e, 0x4a007005, 0x00000180, - 0x65807004, 0x0501f005, 0x4978700e, 0x48087005, - 0x80081104, 0x48087004, 0x58380009, 0x48007003, - 0x40381000, 0x0001f01c, 0x4df00000, 0x4203e000, - 0x50000000, 0x05ddfd30, 0x05000003, 0x59980005, - 0x0801f800, 0x5c03e000, 0x1c01f000, 0x05ddfd2a, - 0x05dc09ba, 0x4a025809, 0x00109908, 0x42000800, - 0x00109969, 0x452c0800, 0x497a580a, 0x497a580b, - 0x497a580c, 0x497a580d, 0x497a580e, 0x4a025808, - 0x000206bc, 0x497a580f, 0x4a025802, 0x00000100, - 0x64065801, 0x1c01f000, 0x0501f808, 0x05fc0712, - 0x64065a09, 0x051df612, 0x0501f804, 0x05fc070b, - 0x641a5a09, 0x051df60e, 0x59a80005, 0x8c00051a, - 0x1c01f000, 0x59a80005, 0x8c00051c, 0x1c01f000, - 0x59a8000f, 0x80080580, 0x05020002, 0x1c01f000, - 0x480bc857, 0x480b500f, 0x497b8830, 0x82080d40, - 0x01000000, 0x48078832, 0x59c40002, 0x8400054c, - 0x48038802, 0x600c0800, 0x0505f108, 0x59c80007, - 0x8c000502, 0x0500006c, 0x915c2c85, 0x050014be, - 0x59c82817, 0x48175085, 0x497b9005, 0x82140500, - 0x00e00000, 0x05020050, 0x82140500, 0x000003ff, - 0x90001c06, 0x41cc2000, 0x600030c1, 0xb00c0480, - 0x05001004, 0x61001000, 0xb00c1c80, 0x0501f003, - 0x400c1000, 0x41781800, 0x54182000, 0x80102000, - 0x80183000, 0x80081040, 0x05fe07fc, 0x800c19c0, - 0x05000005, 0x59c80005, 0x80000000, 0x48039005, - 0x05fdf7ee, 0x82140500, 0x000003ff, 0x800018c4, - 0x8c140514, 0x05000004, 0x59cc0002, 0x90000503, - 0x800c1c80, 0x480f5073, 0x82140500, 0x01f60000, - 0x05020027, 0x82140500, 0x0000f000, 0x0500000b, - 0x82000c80, 0x00002000, 0x0502100f, 0x4a039005, - 0x00000140, 0x82140500, 0x0e000000, 0x80000132, - 0x0c01f837, 0x1c01f000, 0x59cc0400, 0x82000500, - 0x0000ff00, 0x82000580, 0x00008100, 0x05fc07f4, - 0x0501f019, 0x4817c857, 0x82140500, 0x000003ff, - 0x05020007, 0x59cc0400, 0x82000500, 0x0000ff00, - 0x82000580, 0x00008100, 0x0502000f, 0x42000000, - 0x00109852, 0x051dffec, 0x0501fbb6, 0x4803c856, - 0x4a039005, 0x00000140, 0x0501f01b, 0x4817c857, - 0x82140500, 0x00f60000, 0x05020003, 0x0501fbdf, - 0x05fe07d5, 0x05fdf829, 0x0500000e, 0x59c400a4, - 0x4803c857, 0x9000050f, 0x9000058a, 0x05020009, - 0x497b5073, 0x59c400a3, 0x82000540, 0x00080000, - 0x480388a3, 0x82000500, 0xfff7ffff, 0x480388a3, - 0x4817c856, 0x051dff15, 0x4a039005, 0x00000140, - 0x0501f036, 0x4803c856, 0x1c01f000, 0x001048d8, - 0x00104b52, 0x001048d3, 0x001048d3, 0x001048d3, - 0x001048d3, 0x001048d3, 0x001048d3, 0x4803c857, - 0x42000000, 0x001097ef, 0x051dffbf, 0x1c01f000, - 0x8d0c052a, 0x05000004, 0x4c140000, 0x05ddfa05, - 0x5c002800, 0x59cc0400, 0x82000d00, 0x0000ff00, - 0x82041500, 0x0000f000, 0x840409c0, 0x82080580, - 0x00002000, 0x0502000f, 0x916c0581, 0x0502000b, - 0x59cc0006, 0x82000500, 0xff000000, 0x82000580, - 0x11000000, 0x05de09b7, 0x0502000f, 0x05f1ffa5, - 0x0501fc52, 0x0501f00c, 0x0501f81b, 0x0501f00a, - 0x82080580, 0x00003000, 0x05020003, 0x0501fa04, - 0x0501f005, 0x82080580, 0x00008000, 0x05020002, - 0x0501fab1, 0x1c01f000, 0x4817c857, 0x42000000, - 0x001097ee, 0x051dff94, 0x916c0583, 0x05020009, - 0x4c080000, 0x4c0c0000, 0x61201100, 0x40141800, - 0x80142120, 0x05f1fcaf, 0x5c001800, 0x5c001000, - 0x1c01f000, 0x59cc0002, 0x82000500, 0xff000000, - 0x82001580, 0x01000000, 0x05000005, 0x82001580, - 0x23000000, 0x05de098f, 0x0502019b, 0x59a80073, - 0x90000484, 0x05001198, 0x900405a3, 0x05020042, - 0x59cc0004, 0x4803c857, 0x59cc0006, 0x82000500, - 0xff000000, 0x59cc0801, 0x82040d00, 0x00ffffff, - 0x80040540, 0x4803c857, 0x0501fb0f, 0x05dc097d, - 0x05000189, 0x59300c07, 0x90040590, 0x0500000a, - 0x90040591, 0x05000008, 0x90040581, 0x05000006, - 0x90040584, 0x05000004, 0x90040588, 0x05de0971, - 0x0502017d, 0x59300004, 0x82000500, 0x80010000, - 0x05000004, 0x0505fb40, 0x05de096a, 0x05020176, - 0x59cc0a04, 0x48066202, 0x59cc0006, 0x82000500, - 0xffff0000, 0x82000d80, 0x02000000, 0x05020003, - 0x60567000, 0x0005f105, 0x82000d80, 0x02140000, - 0x05fc07fc, 0x82000d80, 0x02100000, 0x05fc07f9, - 0x82000d80, 0x02100000, 0x05fc07f6, 0x82000d80, - 0x01000000, 0x05de0953, 0x0502015f, 0x59cc0006, - 0x82000500, 0x0000ffff, 0x05de094e, 0x0502015a, - 0x59a80073, 0x90000488, 0x05001157, 0x605a7000, - 0x05fdf7e9, 0x900405a2, 0x05de0946, 0x05020152, - 0x59cc0004, 0x4803c857, 0x59cc0006, 0x4803c857, - 0x59cc0001, 0x4803c857, 0x59a80073, 0x800001c0, - 0x05dc093c, 0x05000148, 0x59a80805, 0x8c040514, - 0x05000027, 0x0501f95a, 0x05020025, 0x0501f972, - 0x05000023, 0x61327000, 0x59cc0001, 0x82000500, - 0x00ffffff, 0x0501fb7c, 0x05000003, 0x61fe89ff, - 0x417a6800, 0x599c0019, 0x8c000510, 0x05000126, - 0x59a8021b, 0x8c000508, 0x05000123, 0x59cc1006, + 0x05fe177c, 0x42026000, 0x0010ccb4, 0x59300407, + 0x90000586, 0x05020007, 0x5930000a, 0x81340580, + 0x05020004, 0x59300202, 0x80040580, 0x05fc0768, + 0x91326424, 0x41580000, 0x81300480, 0x05fc17f4, + 0x05fdf76c, 0x492fc857, 0x592c0205, 0x80000112, + 0x05fe062d, 0x592e8a07, 0x0001fac4, 0x0502004a, + 0x05f9fd34, 0x0502004a, 0x592e780b, 0x493fc857, + 0x8d3c053e, 0x05020005, 0x8d0c050e, 0x05020042, + 0x05f9fc76, 0x05fc062c, 0x913c1d1f, 0x05fc062a, + 0x592c0208, 0x82000c80, 0x00001000, 0x05fe1626, + 0x800000c2, 0x800008c4, 0x8005d400, 0x592e9009, + 0x592e980a, 0x5934080d, 0x800409c0, 0x05000004, + 0x58041802, 0x800c19c0, 0x0502002b, 0x913c1d1f, + 0x81780040, 0x80000000, 0x800c1902, 0x05fe17fe, + 0x05fe0615, 0x0c01f001, 0x0010473f, 0x00104741, + 0x0010474a, 0x0010474c, 0x0010474e, 0x0515fa4a, + 0x0501f019, 0x05f9fc2f, 0x0500001d, 0x80e9d1c0, + 0x05020ee4, 0x60168000, 0x417a9000, 0x417a9800, + 0x0515fa4d, 0x0501f010, 0x61367000, 0x0501f004, + 0x613a7000, 0x0501f002, 0x614a7000, 0x5934080d, + 0x800409c0, 0x05000006, 0x4d3c0000, 0x40067800, + 0x05f9fc00, 0x5c027800, 0x05000007, 0x05f9fb17, + 0x05160a69, 0x05000006, 0x8d3c053e, 0x0502000a, + 0x1c01f000, 0x64c25a07, 0x0501f009, 0x64b25a07, + 0x0501f007, 0x64a25a07, 0x0501f005, 0x64a65a07, + 0x0501f003, 0x497a580a, 0x64025a07, 0x4a025a05, + 0x00000103, 0x0001f32c, 0x492fc857, 0x80140110, + 0x80000040, 0x05000002, 0x05fdf5d3, 0x592c0208, + 0x82000500, 0x000003ff, 0x48025a08, 0x8c000506, + 0x05000003, 0xb0000530, 0x05020003, 0x8d0c050e, + 0x05020014, 0x4a025a07, 0x0000dead, 0x592c0409, + 0x82000500, 0x0000f0ff, 0x48025c09, 0x05f9f814, + 0x05020002, 0x1c01f000, 0x49425a07, 0x8058b1c0, + 0x05000007, 0x0515fe6f, 0x0501f80a, 0x44042800, + 0x90580582, 0x05020002, 0x48082801, 0x0001f32c, + 0x60c68000, 0x60040800, 0x6004b000, 0x05fdf7f3, + 0x592c0409, 0x80000118, 0x912c2c0a, 0x80142c00, + 0x1c01f000, 0x492fc857, 0x641a5a09, 0x0001f32c, + 0x492fc857, 0x64065a09, 0x0001f32c, 0x492fc857, + 0x592e7c07, 0x833c0500, 0xfffffffe, 0x0502003b, + 0x592c4008, 0x42026000, 0x0010ccb4, 0x41581800, + 0x400c0000, 0x81300480, 0x0502101f, 0x59300203, + 0x90000580, 0x05000007, 0x59300009, 0x80000d40, + 0x05000004, 0x58040006, 0x80200580, 0x05000003, + 0x91326424, 0x05fdf7f3, 0x58040205, 0x82000500, + 0x000000ff, 0xb0000d93, 0x05000009, 0xb0000d88, + 0x05000007, 0x90000d98, 0x05000005, 0x90000da9, + 0x05000003, 0x90000d94, 0x05fe07f2, 0x4d2c0000, + 0x0511fe83, 0x5c025800, 0x05000018, 0x64025a07, + 0x0001f32c, 0x592e8a07, 0x83440480, 0x000007f0, + 0x05021012, 0x83440400, 0x00108c00, 0x50000000, + 0x80026d40, 0x0500000d, 0x4d2c0000, 0x05f9fb61, + 0x05000009, 0x60168000, 0x592c0a09, 0x417a6000, + 0x05f9ffa2, 0x0515faf7, 0x0001fb2c, 0x5c025800, + 0x05fdf7eb, 0x5c025800, 0x64c65a07, 0x0001f32c, + 0x492fc857, 0x4d2c0000, 0x05ddfd8a, 0x05000011, + 0x492fc857, 0x412f4000, 0x05ddfd86, 0x0500000b, + 0x492fc857, 0x412dd800, 0x05f1fea1, 0x05f1fea9, + 0x49a1d80a, 0x5c025800, 0x492dd809, 0x48ef4006, + 0x05e9fb3b, 0x05e9f352, 0x41a25800, 0x05ddfd89, + 0x5c025800, 0x4a025a07, 0x00004005, 0x640a5c07, + 0x0001f32c, 0x4807c857, 0x485fc857, 0x6004b800, + 0x5c000800, 0x4c5c0000, 0x0501f005, 0x4807c857, + 0x485fc857, 0x5c000800, 0x4d780000, 0x4803c857, + 0x492fc857, 0x8c00050e, 0x05de09da, 0x4203e000, + 0x50000000, 0x600cb900, 0x05ddf1e4, 0x80140110, + 0x80000040, 0x05fe0538, 0x599c0019, 0x8c000510, + 0x0502000b, 0x05f9fc95, 0x05020002, 0x1c01f000, + 0x49425a07, 0x4806580e, 0x480a580f, 0x4943c857, + 0x4807c857, 0x480bc857, 0x0001f32c, 0x592c040c, + 0x82000500, 0x0000e000, 0x82000580, 0x00006000, + 0x05fc07f1, 0x59a8021b, 0x8c000508, 0x05fc07ee, + 0x592c120c, 0x592c080b, 0x82040500, 0xff000000, + 0x80040d80, 0x80000110, 0x80081540, 0x05000004, + 0x4806580b, 0x0501f86c, 0x05fdf7e3, 0x60701000, + 0x60640800, 0x60c68000, 0x05fdf7e2, 0x80140110, + 0x80000040, 0x05fe0510, 0x05f9fd9c, 0x05020002, + 0x1c01f000, 0x49425a07, 0x48065812, 0x480a5813, + 0x0001f32c, 0x80140110, 0x05fc0507, 0x80000040, + 0x0502000a, 0x6006e000, 0x592c020b, 0x8c000504, + 0x00000630, 0x592c0208, 0x82000c80, 0x00001001, + 0x05fe1509, 0x0501f004, 0x4a033006, 0x00020630, + 0x0001f62b, 0x592c1014, 0x82080500, 0xffff0003, + 0x05fe0501, 0x600ae000, 0x42000000, 0x001099e9, + 0x50007000, 0x592c0012, 0x592c0813, 0x48007006, + 0x48047007, 0x492c700a, 0x4978700d, 0x4978700b, + 0x0501f001, 0x4978700c, 0x82080480, 0x00000180, + 0x4803c857, 0x05001006, 0x4800700e, 0x4a007005, + 0x00000180, 0x65807004, 0x0501f005, 0x4978700e, + 0x48087005, 0x80081104, 0x48087004, 0x58380009, + 0x48007003, 0x40381000, 0x0001f01c, 0x4df00000, + 0x4203e000, 0x50000000, 0x05ddfce7, 0x05000003, + 0x59980005, 0x0801f800, 0x5c03e000, 0x1c01f000, + 0x05ddfce1, 0x05dc0971, 0x4a025809, 0x00109988, + 0x42000800, 0x001099e9, 0x452c0800, 0x497a580a, + 0x497a580b, 0x497a580c, 0x497a580d, 0x497a580e, + 0x4a025808, 0x000206bc, 0x497a580f, 0x4a025802, + 0x00000100, 0x64065801, 0x1c01f000, 0x0501f808, + 0x05fc0710, 0x64065a09, 0x051df693, 0x0501f804, + 0x05fc0709, 0x641a5a09, 0x051df68f, 0x59a80005, + 0x8c00051a, 0x1c01f000, 0x59a80005, 0x8c00051c, + 0x1c01f000, 0x59a8000f, 0x80080580, 0x05020002, + 0x1c01f000, 0x480bc857, 0x480b500f, 0x497b8830, + 0x82080d40, 0x01000000, 0x48078832, 0x59c40002, + 0x8400054c, 0x48038802, 0x600c0800, 0x0505f14b, + 0x59c80007, 0x8c000502, 0x05000044, 0x915c2c85, + 0x050014ce, 0x59c82817, 0x48175085, 0x497b9005, + 0x82140500, 0x00e00000, 0x05020038, 0x82140500, + 0x000003ff, 0x90001c06, 0x41cc2000, 0x600030c1, + 0xb00c0480, 0x05001004, 0x61001000, 0xb00c1c80, + 0x0501f003, 0x400c1000, 0x41781800, 0x54182000, + 0x80102000, 0x80183000, 0x80081040, 0x05fe07fc, + 0x800c19c0, 0x05000005, 0x59c80005, 0x80000000, + 0x48039005, 0x05fdf7ee, 0x82140500, 0x000003ff, + 0x800018c4, 0x8c140514, 0x05000004, 0x59cc0002, + 0x90000503, 0x800c1c80, 0x480f5073, 0x82140500, + 0x01f60000, 0x0502000f, 0x0501fca9, 0x05020008, + 0x4a039005, 0x00000140, 0x82140500, 0x0e000000, + 0x80000132, 0x0c01f813, 0x1c01f000, 0x800001c0, + 0x0502000a, 0x4a039005, 0x00000140, 0x0501f00b, + 0x4817c857, 0x82140500, 0x00f60000, 0x05020003, + 0x0501fc07, 0x05fe07ed, 0x0501fcb7, 0x4a039005, + 0x00000140, 0x0501f036, 0x4803c856, 0x1c01f000, + 0x001048f9, 0x00104bab, 0x001048f4, 0x001048f4, + 0x001048f4, 0x001048f4, 0x001048f4, 0x001048f4, + 0x4803c857, 0x42000000, 0x0010986f, 0x0521f868, + 0x1c01f000, 0x8d0c052a, 0x05000004, 0x4c140000, + 0x05ddf9e4, 0x5c002800, 0x59cc0400, 0x82000d00, + 0x0000ff00, 0x82041500, 0x0000f000, 0x840409c0, + 0x82080580, 0x00002000, 0x0502000f, 0x916c0581, + 0x0502000b, 0x59cc0006, 0x82000500, 0xff000000, + 0x82000580, 0x11000000, 0x05de0996, 0x0502000f, + 0x05f1ff90, 0x0501fcbd, 0x0501f00c, 0x0501f81b, + 0x0501f00a, 0x82080580, 0x00003000, 0x05020003, + 0x0501fa22, 0x0501f005, 0x82080580, 0x00008000, + 0x05020002, 0x0501fae9, 0x1c01f000, 0x4817c857, + 0x42000000, 0x0010986e, 0x0521f83d, 0x916c0583, + 0x05020009, 0x4c080000, 0x4c0c0000, 0x61201100, + 0x40141800, 0x80142120, 0x05f1fc92, 0x5c001800, + 0x5c001000, 0x1c01f000, 0x59cc0002, 0x82000500, + 0xff000000, 0x82001580, 0x01000000, 0x05000005, + 0x82001580, 0x23000000, 0x05de096e, 0x050201b2, + 0x59a80073, 0x90000484, 0x050011af, 0x900405a3, + 0x05020042, 0x59cc0004, 0x4803c857, 0x59cc0006, + 0x82000500, 0xff000000, 0x59cc0801, 0x82040d00, + 0x00ffffff, 0x80040540, 0x4803c857, 0x0501fb47, + 0x05dc095c, 0x050001a0, 0x59300c07, 0x90040590, + 0x0500000a, 0x90040591, 0x05000008, 0x90040581, + 0x05000006, 0x90040584, 0x05000004, 0x90040588, + 0x05de0950, 0x05020194, 0x59300004, 0x82000500, + 0x80010000, 0x05000004, 0x0505fbab, 0x05de0949, + 0x0502018d, 0x59cc0a04, 0x48066202, 0x59cc0006, + 0x82000500, 0xffff0000, 0x82000d80, 0x02000000, + 0x05020003, 0x60567000, 0x0005f105, 0x82000d80, + 0x02140000, 0x05fc07fc, 0x82000d80, 0x02100000, + 0x05fc07f9, 0x82000d80, 0x02100000, 0x05fc07f6, + 0x82000d80, 0x01000000, 0x05de0932, 0x05020176, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x05de092d, + 0x05020171, 0x59a80073, 0x90000488, 0x0500116e, + 0x605a7000, 0x05fdf7e9, 0x900405a2, 0x05de0925, + 0x05020169, 0x59cc0004, 0x4803c857, 0x59cc0006, + 0x4803c857, 0x59cc0001, 0x4803c857, 0x59a80073, + 0x800001c0, 0x05dc091b, 0x0500015f, 0x59a80805, + 0x8c040514, 0x0500002a, 0x0501f978, 0x05020028, + 0x0501f990, 0x05000026, 0x61327000, 0x59cc0001, + 0x82000500, 0x00ffffff, 0x0501fbb4, 0x05000006, + 0x61fe89ff, 0x42026800, 0x0010993e, 0x05f9fd6b, + 0x481a6802, 0x599c0019, 0x8c000510, 0x05000139, + 0x59a8021b, 0x8c000508, 0x05000136, 0x59cc1006, 0x82081500, 0xffff0000, 0x82081580, 0x03000000, - 0x0502011d, 0x91641490, 0x05001130, 0x8400054c, + 0x05020130, 0x91641490, 0x05001144, 0x8400054c, 0x4803521b, 0x59cc1000, 0x82081500, 0x00ffffff, - 0x05fdfec0, 0x59cc0007, 0x82000500, 0x0000ffff, - 0x48038893, 0x48035012, 0x0501f10f, 0x59cc0006, + 0x05fdfee5, 0x59cc0007, 0x82000500, 0x0000ffff, + 0x48038893, 0x48035012, 0x0501f122, 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, 0x03000000, 0x05020024, 0x59a8021b, 0x8c000508, 0x0500001c, 0x8400054c, 0x4803521b, 0x59cc0800, 0x82040d00, 0x00ffffff, 0x4807500f, 0x497b8830, 0x84040d70, 0x48078832, 0x59c40802, 0x84040d4c, 0x48078802, 0x59cc0007, 0x82000500, 0x0000ffff, 0x48038893, - 0x48035012, 0x600c0800, 0x59a8100f, 0x0501ffb3, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x05de08f1, - 0x050200fd, 0x605e7000, 0x0501f0cf, 0x05f9ff27, - 0x05fe07f8, 0x8c000502, 0x05fe07f6, 0x0501f0f6, + 0x48035012, 0x600c0800, 0x59a8100f, 0x0505f81b, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x05de08cd, + 0x05020111, 0x605e7000, 0x0501f0cf, 0x05f9ff39, + 0x05fe07f8, 0x8c000502, 0x05fe07f6, 0x0501f10a, 0x82000d80, 0x04000000, 0x05020013, 0x59cc0006, - 0x82000500, 0x0000ffff, 0x05de08e2, 0x050200ee, - 0x05f9ff1a, 0x05000003, 0x60767000, 0x0501f0be, - 0x497b507d, 0x42001000, 0x0010c15e, 0x0501fbb6, + 0x82000500, 0x0000ffff, 0x05de08be, 0x05020102, + 0x05f9ff2c, 0x05000002, 0x0501f0be, 0x497b507d, + 0x42001000, 0x0010c159, 0x0501fc1f, 0x05f9fd21, 0x59a8021b, 0x84000548, 0x4803521b, 0x60c27000, 0x0501f0b5, 0x82000d80, 0x05000000, 0x05020008, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x05de08cd, - 0x050200d9, 0x60627000, 0x0501f0ab, 0x82000d80, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x05de08a9, + 0x050200ed, 0x60627000, 0x0501f0ab, 0x82000d80, 0x20100000, 0x05020003, 0x60667000, 0x0501f0a6, 0x82000d80, 0x21100000, 0x05020003, 0x606a7000, 0x0501f0a1, 0x82000d80, 0x52000000, 0x05020008, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x05de08b9, - 0x050200c5, 0x606e7000, 0x0501f097, 0x82000d80, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x05de0895, + 0x050200d9, 0x606e7000, 0x0501f097, 0x82000d80, 0x50000000, 0x05020008, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x05de08af, 0x050200bb, 0x60727000, + 0x0000ffff, 0x05de088b, 0x050200cf, 0x60727000, 0x0501f08d, 0x82000d80, 0x13000000, 0x05020003, 0x60d27000, 0x0501f088, 0x82000d80, 0x12000000, 0x05020008, 0x59cc0006, 0x82000500, 0x0000ffff, - 0x05de08a0, 0x050200ac, 0x60927000, 0x0501f07e, + 0x05de087c, 0x050200c0, 0x60927000, 0x0501f07e, 0x82000d00, 0xff000000, 0x82040d80, 0x24000000, 0x05020003, 0x60b67000, 0x0501f077, 0x82000d00, 0xff000000, 0x82040d80, 0x53000000, 0x05020003, @@ -4784,16 +4793,16 @@ static const uint32_t isp_2500_risc_code[] = { 0x59a81073, 0x80081480, 0x05001028, 0x90000484, 0x8000b104, 0x8058b1c0, 0x05000024, 0x505cc800, 0x8264c500, 0x03000000, 0x8060c130, 0x42000000, - 0x001097b9, 0x90602580, 0x05020004, 0x42000000, - 0x001097b6, 0x0501f00a, 0x90602581, 0x05020004, - 0x42000000, 0x001097b7, 0x0501f005, 0x90602582, - 0x05020003, 0x42000000, 0x001097b8, 0x051dfe4e, + 0x00109839, 0x90602580, 0x05020004, 0x42000000, + 0x00109836, 0x0501f00a, 0x90602581, 0x05020004, + 0x42000000, 0x00109837, 0x0501f005, 0x90602582, + 0x05020003, 0x42000000, 0x00109838, 0x051dfef4, 0x60541100, 0x82642500, 0x0000ffff, 0x80641920, - 0x05f1fb6c, 0x805cb800, 0x8058b040, 0x05fe07e4, + 0x05f1fb4c, 0x805cb800, 0x8058b040, 0x05fe07e4, 0x5c00b000, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x608e7000, 0x0501f030, 0x5c00b000, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x42000000, 0x001097ec, - 0x051df639, 0x82000d80, 0x60000000, 0x05020003, + 0x5c00c000, 0x5c00b800, 0x42000000, 0x0010986c, + 0x051df6df, 0x82000d80, 0x60000000, 0x05020003, 0x60fe7000, 0x0501f024, 0x82000d80, 0x78000000, 0x05020003, 0x61167000, 0x0501f01f, 0x82000d80, 0x10000000, 0x05020003, 0x613a7000, 0x0501f01a, @@ -4805,175 +4814,201 @@ static const uint32_t isp_2500_risc_code[] = { 0x7d000000, 0x05020003, 0x615a7000, 0x0501f002, 0x60767000, 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x821c0580, 0x00fffffe, 0x59cc0001, 0x05020004, - 0x40003000, 0x61fa880f, 0x0501f004, 0x0501f8bb, - 0x05de0814, 0x05020020, 0x05f5fead, 0x05de0811, - 0x0502001d, 0x59340200, 0x8c000514, 0x0500000a, - 0x913805b0, 0x05000008, 0x913805bf, 0x05000006, - 0x913805b4, 0x05000004, 0x913805a4, 0x05000002, - 0x61327000, 0x0509fb66, 0x05000014, 0x4936600a, - 0x64126407, 0x59cc0c04, 0x48066202, 0xb138058c, - 0x05020008, 0x64466407, 0x813669c0, 0x05020005, - 0x59cc0001, 0x82000500, 0x00ffffff, 0x48026020, + 0x40003000, 0x61fa880f, 0x0501f017, 0x0501f8f0, + 0x05da0ff0, 0x05020034, 0x83440480, 0x000007f0, + 0x05001001, 0x05f1fddf, 0x0500000f, 0x4c180000, + 0x0001fac4, 0x5c003000, 0x0500000e, 0x4c180000, + 0x0501f846, 0x5c003000, 0x05020007, 0x05f9fc43, + 0x42026800, 0x0010993e, 0x481a6802, 0x61fe89ff, + 0x0501f004, 0x05f5fe85, 0x05da0fda, 0x0502001e, + 0x59340200, 0x8c000514, 0x0500000a, 0x913805b0, + 0x05000008, 0x913805bf, 0x05000006, 0x913805b4, + 0x05000004, 0x913805a4, 0x05000002, 0x61327000, + 0x0509fbab, 0x05000015, 0x4936600a, 0x64126407, + 0x83340580, 0x0010993e, 0x05020005, 0x59cc0001, + 0x82000500, 0x00ffffff, 0x48026020, 0x59cc0c04, + 0x48066202, 0xb138058c, 0x05020002, 0x64466407, 0x0005f105, 0x598800b7, 0x4803c857, 0x80000000, 0x480310b7, 0x1c01f000, 0x61241100, 0x59cc1806, - 0x800c1930, 0x05f1faff, 0x0509fb55, 0x05d80fe9, - 0x05fc07f5, 0x4936600a, 0x64126407, 0x59cc0c04, - 0x48066202, 0x64266403, 0x6426641c, 0x4a02621c, - 0x00002900, 0x64066203, 0x0501f572, 0x59a8021b, - 0x4803c857, 0x8c000508, 0x05000013, 0x599c0019, - 0x8c000510, 0x05020010, 0x59cc0006, 0x82000500, - 0xff000000, 0x82000d80, 0x03000000, 0x0500000c, - 0x82000d80, 0x20000000, 0x05000009, 0x82000d80, - 0x05000000, 0x05000006, 0x82000d80, 0x21000000, - 0x05000003, 0x80000580, 0x1c01f000, 0x90000541, - 0x05fdf7fe, 0x59cc2006, 0x82102500, 0xff000000, - 0x9c1021c0, 0x0501f807, 0x820c1c00, 0x0010944f, - 0x500c1800, 0x800c0500, 0x4803c857, 0x1c01f000, - 0x40100800, 0x41781800, 0x900404a0, 0x05001004, - 0x800c1800, 0x40000800, 0x05fdf7fc, 0x9004050f, - 0x82000400, 0x001089c0, 0x50000000, 0x8c040508, - 0x05000002, 0x900001c0, 0x1c01f000, 0x4803c856, - 0x0501fa13, 0x05020009, 0x05e5ff1f, 0x05020007, - 0x59cc0002, 0x82000500, 0xff000000, 0x82000d80, - 0x08000000, 0x05000802, 0x1c01f000, 0x4803c856, - 0x59cc0400, 0x82000d00, 0x0000ff00, 0x840409c0, - 0x900405b3, 0x05020021, 0x0501f927, 0x05000037, - 0x59cc0a04, 0x48066202, 0x59a80073, 0x90000484, - 0x05001032, 0x59cc0006, 0x4803c857, 0x82000500, - 0xffff0000, 0x82000d80, 0x02000000, 0x05020007, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x05020027, - 0x60567000, 0x0005f105, 0x82000d80, 0x01000000, - 0x05020022, 0x59cc0006, 0x82000500, 0x0000ffff, - 0x0502001e, 0x59a80073, 0x90000488, 0x0500101b, - 0x605a7000, 0x0005f105, 0x900405b2, 0x05020017, - 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, - 0x14000000, 0x05020011, 0x59a80073, 0x90000490, - 0x0500100e, 0x60e27000, 0x59cc0001, 0x0501f80e, - 0x0502000a, 0x05f5fdfd, 0x05020008, 0x0509fac8, - 0x05000006, 0x4936600a, 0x64126407, 0x59cc0c04, - 0x48066202, 0x0005f105, 0x42000000, 0x001097ec, - 0x051df54d, 0x4803c857, 0x4000d000, 0x82003500, - 0x00ffffff, 0x0201f800, 0x0010c750, 0x40c40000, - 0x90000581, 0x1c01f000, 0x59a8021b, 0x8c00050e, - 0x05000003, 0x8c000502, 0x05000005, 0x59cc0c00, - 0x80040910, 0x9004050f, 0x0c01f002, 0x1c01f000, - 0x00104b6c, 0x00104b6c, 0x00104b6c, 0x00104c43, - 0x00104b6c, 0x00104b6e, 0x00104b8e, 0x00104b91, - 0x00104b6c, 0x00104b6c, 0x00104b6c, 0x00104b6c, - 0x00104b6c, 0x00104b6c, 0x00104b6c, 0x00104b6c, - 0x4803c856, 0x1c01f000, 0x0501f8c7, 0x0500001a, - 0x59a80073, 0x9000048c, 0x05001017, 0x59300407, - 0x90000583, 0x05020014, 0x59cc0001, 0x5932680a, - 0x813669c0, 0x05000010, 0x59340802, 0x80040580, - 0x82000500, 0x00ffffff, 0x0502000b, 0x59cc0a04, - 0x59300202, 0x82001580, 0x0000ffff, 0x05000003, - 0x80040580, 0x05020004, 0x48066202, 0x611a7000, - 0x0005f105, 0x59cc0004, 0x4803c857, 0x42000000, - 0x001097ed, 0x051df508, 0x59cc0004, 0x4803c857, - 0x1c01f000, 0x0501f8a4, 0x05000016, 0x59a80073, - 0x9000048c, 0x05001013, 0x59300407, 0x90000583, - 0x05020010, 0x59cc0001, 0x82000500, 0x00ffffff, - 0x5932680a, 0x813669c0, 0x0500000a, 0x59340802, - 0x82040d00, 0x00ffffff, 0x80040580, 0x05020005, - 0x59cc0a04, 0x48066202, 0x61167000, 0x0005f105, - 0x59cc0004, 0x4803c857, 0x42000000, 0x001097ed, - 0x051df4e9, 0x59cc0004, 0x4803c857, 0x59cc0000, - 0x82000500, 0xff000000, 0x59cc1001, 0x82081500, - 0x00ffffff, 0x80080540, 0x4803c857, 0x4817c857, - 0x0501f957, 0x05da0eeb, 0x0502000f, 0x05e5fe62, - 0x05da0ee8, 0x0502000c, 0x59cc0002, 0x82000500, - 0xff000000, 0x90000580, 0x05da0ee2, 0x05020006, - 0x9004050f, 0x90000c86, 0x05da1ede, 0x05021002, - 0x0c01f003, 0x4803c856, 0x1c01f000, 0x00104bd1, - 0x00104bd3, 0x00104bd1, 0x00104bd1, 0x00104c12, - 0x00104c1f, 0x4803c856, 0x1c01f000, 0x59a80073, - 0x800001c0, 0x05da0ecf, 0x05fe07fb, 0x59cc0802, - 0x4807c856, 0x8c04052e, 0x05020015, 0x42026000, - 0x0010cc5c, 0x59cc0001, 0x05fdff6b, 0x05020008, - 0x0001fac4, 0x05020006, 0x64166407, 0x64226203, - 0x4936600a, 0x60227001, 0x0005f105, 0x4803c857, - 0x61fe89ff, 0x417a6800, 0x59cc0001, 0x82000500, - 0x00ffffff, 0x48026020, 0x05fdf7f4, 0x59cc0001, - 0x4803c857, 0x05fdff58, 0x05da0eb2, 0x05fe07de, - 0x05f5fd46, 0x05da0eaf, 0x05fe07db, 0x59cc0005, - 0x8c000500, 0x05020005, 0x59340200, 0x8c00050e, - 0x05da0ea8, 0x05fe07d4, 0x05f9f84a, 0x0502000b, - 0x0501f835, 0x05d80ea3, 0x05fc07cf, 0x42026000, - 0x0010cc5c, 0x4936600a, 0x640a6407, 0x64226203, - 0x60227001, 0x0005f105, 0x0509f9fd, 0x05fc07c6, - 0x4936600a, 0x64126407, 0x59cc0c04, 0x48066202, - 0x60067000, 0x0005f105, 0x59cc0802, 0x8c04052e, - 0x05000009, 0x0501f820, 0x05000007, 0x0501f901, - 0x05020005, 0x59cc0a04, 0x48066202, 0x60267001, - 0x0005f105, 0x4933c857, 0x1c01f000, 0x59cc0004, - 0x4803c857, 0x59a80073, 0x90000484, 0x0500100c, - 0x59cc0802, 0x8c04052e, 0x05000009, 0x0501f80e, - 0x05000007, 0x0501f8ef, 0x05020005, 0x59cc0a04, - 0x48066202, 0x602a7001, 0x0005f105, 0x4933c857, - 0x42000000, 0x001097ec, 0x051df463, 0x59cc0a04, - 0x0501f002, 0x59cc0c04, 0x59a8000d, 0x59a81060, - 0x80080400, 0x80040480, 0x05021007, 0x800400c4, - 0x800408ca, 0x80040c00, 0x82066400, 0x0010cca4, - 0x1c01f000, 0x80000580, 0x05fdf7fe, 0x59cc0802, - 0x8c04052e, 0x05020016, 0x05fdffed, 0x05000014, - 0x59300407, 0x90000586, 0x05020011, 0x59cc0001, - 0x82000500, 0x00ffffff, 0x5932680a, 0x813669c0, - 0x0500000b, 0x59340802, 0x82040d00, 0x00ffffff, - 0x80040580, 0x05020006, 0x59a80073, 0x800001c0, - 0x05020003, 0x61467000, 0x0005f105, 0x59cc0004, - 0x4803c857, 0x42000000, 0x001097ed, 0x051df436, - 0x4803c856, 0x60143002, 0x0501f001, 0x481bc857, - 0x4c5c0000, 0x4c600000, 0x4c640000, 0x41ccc800, - 0x4014b800, 0x4018c000, 0x0501f805, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4803c856, - 0x4c580000, 0x58640400, 0x82000500, 0x0000f000, - 0x82000580, 0x0000c000, 0x05000018, 0x0509f990, - 0x05000016, 0x58640001, 0x05fdfecf, 0x05020015, - 0x05f5fcbe, 0x05020013, 0x4936600a, 0x05ddf8e9, - 0x05000010, 0x492e6019, 0x497a5800, 0x497a5a05, - 0x485e5c05, 0x912cac06, 0x601cb000, 0x4064a000, - 0x051dfcd7, 0x4862641c, 0x64fa6403, 0x64066407, - 0x64066203, 0x0501fbab, 0x5c00b000, 0x1c01f000, - 0x0005f8e7, 0x05fdf7fd, 0x4803c856, 0x59cc0400, - 0x82000d00, 0x0000ff00, 0x82040500, 0x0000f000, - 0x840409c0, 0x82000580, 0x00002000, 0x05020044, - 0x900405a2, 0x0502003b, 0x59c400a4, 0x9000050f, - 0x90000c87, 0x05001003, 0x9000048c, 0x0500103e, - 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, - 0x04000000, 0x05000038, 0x82000d80, 0x60000000, - 0x05000035, 0x82000d80, 0x54000000, 0x05000032, - 0x82000d80, 0x03000000, 0x05020019, 0x59a80a1b, - 0x8c040502, 0x0502002c, 0x8c040508, 0x0502002a, - 0x82000d80, 0x03000000, 0x05020003, 0x05f9fc23, - 0x05000025, 0x05f5fef2, 0x05000025, 0x59a80018, - 0x800000d0, 0x59a8080f, 0x82040d00, 0x000000ff, - 0x80040540, 0x59cc0800, 0x82040d00, 0x00ffffff, - 0x80040580, 0x05020016, 0x0501f017, 0x59c40802, - 0x8c04050c, 0x05020012, 0x82000d80, 0x52000000, - 0x05fc07ed, 0x82000d80, 0x05000000, 0x05fc07ea, - 0x82000d80, 0x50000000, 0x05fc07e7, 0x0501f008, - 0x900405a3, 0x05020006, 0x05fdff5b, 0x05000004, - 0x59300c03, 0x90040582, 0x05000003, 0x80000580, - 0x0501f002, 0x90000541, 0x1c01f000, 0x59cc0006, - 0x82000500, 0xffff0000, 0x82000d80, 0x03000000, - 0x05000004, 0x82000d80, 0x52000000, 0x05fe07f4, - 0x59a8021b, 0x90000509, 0x90000588, 0x05fc07f2, - 0x05fdf7ef, 0x4803c857, 0x4c580000, 0x40003000, - 0x61c0200f, 0x6040b000, 0x83ac7400, 0x000007f0, - 0x50380000, 0x80026d40, 0x05000006, 0x59340002, - 0x82000500, 0x00ffffff, 0x80180580, 0x0500000d, - 0x80102000, 0x80387000, 0x8058b040, 0x05fe07f5, - 0x82100480, 0x00000800, 0x60002000, 0x61c0b00f, - 0x41ac7000, 0x05fe17ef, 0x90000541, 0x0501f002, - 0x40128800, 0x5c00b000, 0x1c01f000, 0x59a8021b, - 0x8c00050e, 0x05000004, 0x8c000502, 0x05000003, + 0x800c1930, 0x05f1facb, 0x0509fb99, 0x05d80fb1, + 0x05fc07f5, 0x4936600a, 0x83340580, 0x0010993e, + 0x05020005, 0x59cc0001, 0x82000500, 0x00ffffff, + 0x48026020, 0x64126407, 0x59cc0c04, 0x48066202, + 0x64266403, 0x6426641c, 0x4a02621c, 0x00002900, + 0x64066203, 0x0501f5bf, 0x59a8021b, 0x4803c857, + 0x8c000508, 0x05000013, 0x599c0019, 0x8c000510, + 0x05020010, 0x59cc0006, 0x82000500, 0xff000000, + 0x82000d80, 0x03000000, 0x0500000c, 0x82000d80, + 0x20000000, 0x05000009, 0x82000d80, 0x05000000, + 0x05000006, 0x82000d80, 0x21000000, 0x05000003, 0x80000580, 0x1c01f000, 0x90000541, 0x05fdf7fe, - 0x59300c07, 0x90040582, 0x05000002, 0x90040585, - 0x1c01f000, 0x59c80000, 0x84000558, 0x84000512, - 0x48039000, 0x1c01f000, 0x4a032824, 0x000003e8, - 0x4a032802, 0x0010cca4, 0x64032800, 0x4a032808, - 0x0010556a, 0x60140000, 0x91947c09, 0x49787801, - 0x4a007804, 0x00105515, 0x903c7c05, 0x80000040, + 0x59cc2006, 0x82102500, 0xff000000, 0x9c1021c0, + 0x0501f807, 0x820c1c00, 0x001094cf, 0x500c1800, + 0x800c0500, 0x4803c857, 0x1c01f000, 0x40100800, + 0x41781800, 0x900404a0, 0x05001004, 0x800c1800, + 0x40000800, 0x05fdf7fc, 0x9004050f, 0x82000400, + 0x00108a8d, 0x50000000, 0x8c040508, 0x05000002, + 0x900001c0, 0x1c01f000, 0x4803c856, 0x0501fa2d, + 0x05020009, 0x05e5fee2, 0x05020007, 0x59cc0002, + 0x82000500, 0xff000000, 0x82000d80, 0x08000000, + 0x05000802, 0x1c01f000, 0x4803c856, 0x59cc0400, + 0x82000d00, 0x0000ff00, 0x840409c0, 0x900405b3, + 0x05020021, 0x0501f941, 0x05000051, 0x59cc0a04, + 0x48066202, 0x59a80073, 0x90000484, 0x0500104c, + 0x59cc0006, 0x4803c857, 0x82000500, 0xffff0000, + 0x82000d80, 0x02000000, 0x05020007, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x05020041, 0x60567000, + 0x0005f105, 0x82000d80, 0x01000000, 0x0502003c, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x05020038, + 0x59a80073, 0x90000488, 0x05001035, 0x605a7000, + 0x0005f105, 0x900405b2, 0x05020031, 0x59cc0006, + 0x82000500, 0xffff0000, 0x82000d80, 0x14000000, + 0x0502002b, 0x59a80073, 0x90000490, 0x05001028, + 0x60e27000, 0x59cc0001, 0x0501f828, 0x05020024, + 0x83440480, 0x000007f0, 0x05001001, 0x05f1fd19, + 0x0500000f, 0x4c180000, 0x0001fac4, 0x5c003000, + 0x0500000d, 0x4c180000, 0x05fdff80, 0x5c003000, + 0x05020007, 0x05f9fb7d, 0x42026800, 0x0010993e, + 0x481a6802, 0x61fe89ff, 0x0501f003, 0x05f5fdba, + 0x0502000f, 0x0509faf2, 0x0500000d, 0x4936600a, + 0x83340580, 0x0010993e, 0x05020005, 0x59cc0001, + 0x82000500, 0x00ffffff, 0x48026020, 0x64126407, + 0x59cc0c04, 0x48066202, 0x0005f105, 0x42000000, + 0x0010986c, 0x051df5be, 0x4803c857, 0x4000d000, + 0x82003500, 0x00ffffff, 0x0201f800, 0x0010c758, + 0x40c40000, 0x90000581, 0x1c01f000, 0x59a8021b, + 0x8c00050e, 0x05000003, 0x8c000502, 0x05000005, + 0x59cc0c00, 0x80040910, 0x9004050f, 0x0c01f002, + 0x1c01f000, 0x00104bc5, 0x00104bc5, 0x00104bc5, + 0x00104c9c, 0x00104bc5, 0x00104bc7, 0x00104be7, + 0x00104bea, 0x00104bc5, 0x00104bc5, 0x00104bc5, + 0x00104bc5, 0x00104bc5, 0x00104bc5, 0x00104bc5, + 0x00104bc5, 0x4803c856, 0x1c01f000, 0x0501f8c7, + 0x0500001a, 0x59a80073, 0x9000048c, 0x05001017, + 0x59300407, 0x90000583, 0x05020014, 0x59cc0001, + 0x5932680a, 0x813669c0, 0x05000010, 0x59340802, + 0x80040580, 0x82000500, 0x00ffffff, 0x0502000b, + 0x59cc0a04, 0x59300202, 0x82001580, 0x0000ffff, + 0x05000003, 0x80040580, 0x05020004, 0x48066202, + 0x611a7000, 0x0005f105, 0x59cc0004, 0x4803c857, + 0x42000000, 0x0010986d, 0x051df579, 0x59cc0004, + 0x4803c857, 0x1c01f000, 0x0501f8a4, 0x05000016, + 0x59a80073, 0x9000048c, 0x05001013, 0x59300407, + 0x90000583, 0x05020010, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x5932680a, 0x813669c0, 0x0500000a, + 0x59340802, 0x82040d00, 0x00ffffff, 0x80040580, + 0x05020005, 0x59cc0a04, 0x48066202, 0x61167000, + 0x0005f105, 0x59cc0004, 0x4803c857, 0x42000000, + 0x0010986d, 0x051df55a, 0x59cc0004, 0x4803c857, + 0x59cc0000, 0x82000500, 0xff000000, 0x59cc1001, + 0x82081500, 0x00ffffff, 0x80080540, 0x4803c857, + 0x4817c857, 0x0501f957, 0x05da0e92, 0x0502000f, + 0x05e5fe0b, 0x05da0e8f, 0x0502000c, 0x59cc0002, + 0x82000500, 0xff000000, 0x90000580, 0x05da0e89, + 0x05020006, 0x9004050f, 0x90000c86, 0x05da1e85, + 0x05021002, 0x0c01f003, 0x4803c856, 0x1c01f000, + 0x00104c2a, 0x00104c2c, 0x00104c2a, 0x00104c2a, + 0x00104c6b, 0x00104c78, 0x4803c856, 0x1c01f000, + 0x59a80073, 0x800001c0, 0x05da0e76, 0x05fe07fb, + 0x59cc0802, 0x4807c856, 0x8c04052e, 0x05020015, + 0x42026000, 0x0010cc6c, 0x59cc0001, 0x05fdff6b, + 0x05020008, 0x0001fac4, 0x05020006, 0x64166407, + 0x64226203, 0x4936600a, 0x60227001, 0x0005f105, + 0x4803c857, 0x61fe89ff, 0x417a6800, 0x59cc0001, + 0x82000500, 0x00ffffff, 0x48026020, 0x05fdf7f4, + 0x59cc0001, 0x4803c857, 0x05fdff58, 0x05da0e59, + 0x05fe07de, 0x05f5fcfc, 0x05da0e56, 0x05fe07db, + 0x59cc0005, 0x8c000500, 0x05020005, 0x59340200, + 0x8c00050e, 0x05da0e4f, 0x05fe07d4, 0x05f9f806, + 0x0502000b, 0x0501f835, 0x05d80e4a, 0x05fc07cf, + 0x42026000, 0x0010cc6c, 0x4936600a, 0x640a6407, + 0x64226203, 0x60227001, 0x0005f105, 0x0509fa20, + 0x05fc07c6, 0x4936600a, 0x64126407, 0x59cc0c04, + 0x48066202, 0x60067000, 0x0005f105, 0x59cc0802, + 0x8c04052e, 0x05000009, 0x0501f820, 0x05000007, + 0x0501f901, 0x05020005, 0x59cc0a04, 0x48066202, + 0x60267001, 0x0005f105, 0x4933c857, 0x1c01f000, + 0x59cc0004, 0x4803c857, 0x59a80073, 0x90000484, + 0x0500100c, 0x59cc0802, 0x8c04052e, 0x05000009, + 0x0501f80e, 0x05000007, 0x0501f8ef, 0x05020005, + 0x59cc0a04, 0x48066202, 0x602a7001, 0x0005f105, + 0x4933c857, 0x42000000, 0x0010986c, 0x051df4d4, + 0x59cc0a04, 0x0501f002, 0x59cc0c04, 0x59a8000d, + 0x59a81060, 0x80080400, 0x80040480, 0x05021007, + 0x800400c4, 0x800408ca, 0x80040c00, 0x82066400, + 0x0010ccb4, 0x1c01f000, 0x80000580, 0x05fdf7fe, + 0x59cc0802, 0x8c04052e, 0x05020016, 0x05fdffed, + 0x05000014, 0x59300407, 0x90000586, 0x05020011, + 0x59cc0001, 0x82000500, 0x00ffffff, 0x5932680a, + 0x813669c0, 0x0500000b, 0x59340802, 0x82040d00, + 0x00ffffff, 0x80040580, 0x05020006, 0x59a80073, + 0x800001c0, 0x05020003, 0x61467000, 0x0005f105, + 0x59cc0004, 0x4803c857, 0x42000000, 0x0010986d, + 0x051df4a7, 0x4803c856, 0x60143002, 0x0501f001, + 0x481bc857, 0x4c5c0000, 0x4c600000, 0x4c640000, + 0x41ccc800, 0x4014b800, 0x4018c000, 0x0501f805, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x4803c856, 0x4c580000, 0x58640400, 0x82000500, + 0x0000f000, 0x82000580, 0x0000c000, 0x05000018, + 0x0509f9b3, 0x05000016, 0x58640001, 0x05fdfecf, + 0x05020015, 0x05f5fc74, 0x05020013, 0x4936600a, + 0x05ddf890, 0x05000010, 0x492e6019, 0x497a5800, + 0x497a5a05, 0x485e5c05, 0x912cac06, 0x601cb000, + 0x4064a000, 0x051dfd48, 0x4862641c, 0x64fa6403, + 0x64066407, 0x64066203, 0x0501fbde, 0x5c00b000, + 0x1c01f000, 0x0005f8e7, 0x05fdf7fd, 0x4803c856, + 0x59cc0400, 0x82000d00, 0x0000ff00, 0x82040500, + 0x0000f000, 0x840409c0, 0x82000580, 0x00002000, + 0x05020044, 0x900405a2, 0x0502003b, 0x59c400a4, + 0x9000050f, 0x90000c87, 0x05001003, 0x9000048c, + 0x0500103e, 0x59cc0006, 0x82000500, 0xffff0000, + 0x82000d80, 0x04000000, 0x05000038, 0x82000d80, + 0x60000000, 0x05000035, 0x82000d80, 0x54000000, + 0x05000032, 0x82000d80, 0x03000000, 0x05020019, + 0x59a80a1b, 0x8c040502, 0x0502002c, 0x8c040508, + 0x0502002a, 0x82000d80, 0x03000000, 0x05020003, + 0x05f9fc00, 0x05000025, 0x05f5feac, 0x05000025, + 0x59a80018, 0x800000d0, 0x59a8080f, 0x82040d00, + 0x000000ff, 0x80040540, 0x59cc0800, 0x82040d00, + 0x00ffffff, 0x80040580, 0x05020016, 0x0501f017, + 0x59c40802, 0x8c04050c, 0x05020012, 0x82000d80, + 0x52000000, 0x05fc07ed, 0x82000d80, 0x05000000, + 0x05fc07ea, 0x82000d80, 0x50000000, 0x05fc07e7, + 0x0501f008, 0x900405a3, 0x05020006, 0x05fdff5b, + 0x05000004, 0x59300c03, 0x90040582, 0x05000003, + 0x80000580, 0x0501f002, 0x90000541, 0x1c01f000, + 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, + 0x03000000, 0x05000004, 0x82000d80, 0x52000000, + 0x05fe07f4, 0x59a8021b, 0x90000509, 0x90000588, + 0x05fc07f2, 0x05fdf7ef, 0x4803c857, 0x4c580000, + 0x40003000, 0x61c0200f, 0x6040b000, 0x83ac7400, + 0x000007f0, 0x50380000, 0x80026d40, 0x05000006, + 0x59340002, 0x82000500, 0x00ffffff, 0x80180580, + 0x0500000d, 0x80102000, 0x80387000, 0x8058b040, + 0x05fe07f5, 0x82100480, 0x00000800, 0x60002000, + 0x61c0b00f, 0x41ac7000, 0x05fe17ef, 0x90000541, + 0x0501f002, 0x40128800, 0x5c00b000, 0x1c01f000, + 0x59a8021b, 0x8c00050e, 0x05000004, 0x8c000502, + 0x05000003, 0x80000580, 0x1c01f000, 0x90000541, + 0x05fdf7fe, 0x59300c07, 0x90040582, 0x05000002, + 0x90040585, 0x1c01f000, 0x59c80000, 0x84000558, + 0x84000512, 0x48039000, 0x1c01f000, 0x82140500, + 0x0000f000, 0x05000006, 0x82000c80, 0x00002000, + 0x0502100a, 0x80000580, 0x1c01f000, 0x59cc0400, + 0x82000500, 0x0000ff00, 0x82000580, 0x00008100, + 0x05fc07fa, 0x0501f012, 0x4817c857, 0x82140500, + 0x000003ff, 0x05020007, 0x59cc0400, 0x82000500, + 0x0000ff00, 0x82000580, 0x00008100, 0x05020008, + 0x42000000, 0x001098d2, 0x051dfbc9, 0x05fdff22, + 0x4803c856, 0x90000541, 0x05fdf7e8, 0x41780000, + 0x05fdf7e6, 0x05f9fb77, 0x0500000e, 0x59c400a4, + 0x4803c857, 0x9000050f, 0x9000058a, 0x05020009, + 0x497b5073, 0x59c400a3, 0x82000540, 0x00080000, + 0x480388a3, 0x82000500, 0xfff7ffff, 0x480388a3, + 0x4817c856, 0x051df2f7, 0x4a032824, 0x000003e8, + 0x4a032802, 0x0010ccb4, 0x64032800, 0x4a032808, + 0x001055f6, 0x60140000, 0x91947c09, 0x49787801, + 0x4a007804, 0x001055a1, 0x903c7c05, 0x80000040, 0x05fe07fb, 0x4a032823, 0xffff0000, 0x6191d000, 0x0501f9af, 0x4201d000, 0x000186a0, 0x0501f1bc, 0x00000000, 0x00000005, 0x0000000a, 0x0000000f, @@ -4986,13 +5021,13 @@ static const uint32_t isp_2500_risc_code[] = { 0x5c029800, 0x5c028800, 0x5c027800, 0x5c027000, 0x5c01f800, 0x5c028000, 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, 0x59940004, 0x80000540, - 0x05020008, 0x5994002f, 0x80040400, 0x05d81c83, + 0x05020008, 0x5994002f, 0x80040400, 0x05d81bf7, 0x48032804, 0x480b2805, 0x642b2803, 0x80000580, 0x1c01f000, 0x59940029, 0x80000540, 0x05020008, - 0x5994002f, 0x80040400, 0x05d81c78, 0x48032829, + 0x5994002f, 0x80040400, 0x05d81bec, 0x48032829, 0x480b282a, 0x64072828, 0x80000580, 0x1c01f000, 0x40680800, 0x406c1000, 0x5994002c, 0x80000540, - 0x05020008, 0x5994002f, 0x80040400, 0x05d81c6b, + 0x05020008, 0x5994002f, 0x80040400, 0x05d81bdf, 0x4803282c, 0x480b282d, 0x642b282b, 0x80000580, 0x1c01f000, 0x4c000000, 0x59940005, 0x80080580, 0x05020003, 0x497b2804, 0x497b2805, 0x5c000000, @@ -5037,10 +5072,10 @@ static const uint32_t isp_2500_risc_code[] = { 0x91326424, 0x49332802, 0x41540000, 0x81300480, 0x05021005, 0x803c7840, 0x05fe07e0, 0x5c03e000, 0x1c01f000, 0x59940030, 0x48032831, 0x4a032802, - 0x0010cca4, 0x497b2830, 0x80000540, 0x0500000c, + 0x0010ccb4, 0x497b2830, 0x80000540, 0x0500000c, 0x64072800, 0x5c03e000, 0x1c01f000, 0x4c3c0000, - 0x0511fc2b, 0x5c007800, 0x05fdf7d8, 0x4c3c0000, - 0x0511f8dd, 0x5c007800, 0x05fdf7e6, 0x64032800, + 0x0511fc35, 0x5c007800, 0x05fdf7d8, 0x4c3c0000, + 0x0511f8e4, 0x5c007800, 0x05fdf7e6, 0x64032800, 0x5c03e000, 0x1c01f000, 0x59a80872, 0x8c040530, 0x05020025, 0x8c040532, 0x0500000f, 0x59a80061, 0x81640480, 0x05001016, 0x59a8000b, 0x81500580, @@ -5051,70 +5086,70 @@ static const uint32_t isp_2500_risc_code[] = { 0x900401c0, 0x9000051f, 0x80040d40, 0x900401c0, 0x80040580, 0x82001500, 0x00007000, 0x82040500, 0xffff8fff, 0x80080540, 0x48035072, 0x80081114, - 0x05d9fda5, 0x1c01f000, 0x4a032807, 0x000007d0, + 0x05d9fd19, 0x1c01f000, 0x4a032807, 0x000007d0, 0x642b2806, 0x4a01a8e5, 0x00000c00, 0x1c01f000, - 0x60100800, 0x91180485, 0x05da1b78, 0x91947c09, - 0x83180400, 0x00104d38, 0x50000000, 0x803c7c00, + 0x60100800, 0x91180485, 0x05da1aec, 0x91947c09, + 0x83180400, 0x00104dc4, 0x50000000, 0x803c7c00, 0x4a007801, 0x000001f4, 0x48047802, 0x64287800, - 0x49787803, 0x83180400, 0x00104d3d, 0x50000000, + 0x49787803, 0x83180400, 0x00104dc9, 0x50000000, 0x82000540, 0x00000155, 0x4801a8e5, 0x1c01f000, - 0x91180485, 0x05da1b65, 0x91947c09, 0x83180400, - 0x00104d38, 0x50000000, 0x803c7c00, 0x583c0002, + 0x91180485, 0x05da1ad9, 0x91947c09, 0x83180400, + 0x00104dc4, 0x50000000, 0x803c7c00, 0x583c0002, 0x80000040, 0x48007802, 0x05000004, 0x4a007801, 0x000001f4, 0x64287800, 0x1c01f000, 0x91180485, - 0x05da1b56, 0x91947c09, 0x83180400, 0x00104d38, + 0x05da1aca, 0x91947c09, 0x83180400, 0x00104dc4, 0x50000000, 0x803c7c00, 0x49787801, 0x83180400, - 0x00104d3d, 0x50000000, 0x4801a8e5, 0x1c01f000, + 0x00104dc9, 0x50000000, 0x4801a8e5, 0x1c01f000, 0x40680800, 0x406c1000, 0x0501f802, 0x1c01f000, 0x4807c857, 0x480bc857, 0x5994002f, 0x80040400, - 0x05d81b42, 0x48032804, 0x480b2805, 0x642b2803, + 0x05d81ab6, 0x48032804, 0x480b2805, 0x642b2803, 0x1c01f000, 0x4807c857, 0x480bc857, 0x5994002f, - 0x80040400, 0x05d81b39, 0x48032826, 0x480b2827, + 0x80040400, 0x05d81aad, 0x48032826, 0x480b2827, 0x642b2825, 0x1c01f000, 0x4c000000, 0x59940027, 0x80080580, 0x05020003, 0x48032826, 0x48032827, 0x5c000000, 0x1c01f000, 0x4807c857, 0x480bc857, - 0x5994002f, 0x80040400, 0x05d81b28, 0x4803282c, + 0x5994002f, 0x80040400, 0x05d81a9c, 0x4803282c, 0x480b282d, 0x642b282b, 0x1c01f000, 0x80e9d1c0, 0x0500000c, 0x0501f82e, 0x05025000, 0x4203e000, 0x80000000, 0x40e81000, 0x41780800, 0x61900000, 0x0501f8b4, 0x5994002e, 0x80080400, 0x4803282e, - 0x1c01f000, 0x42001000, 0x0010402e, 0x05fdfeae, - 0x42001000, 0x00104021, 0x05fdffdc, 0x42001000, - 0x001035b3, 0x05fdfea8, 0x42001000, 0x0010362b, - 0x05fdfea5, 0x42001000, 0x00103592, 0x05fdfea2, - 0x42001000, 0x00103655, 0x05fdf6b2, 0x4203e000, + 0x1c01f000, 0x42001000, 0x00104064, 0x05fdfeae, + 0x42001000, 0x00104057, 0x05fdffdc, 0x42001000, + 0x001035bf, 0x05fdfea8, 0x42001000, 0x00103637, + 0x05fdfea5, 0x42001000, 0x0010359e, 0x05fdfea2, + 0x42001000, 0x00103661, 0x05fdf6b2, 0x4203e000, 0x70000000, 0x4203e000, 0xb0300000, 0x40ebf800, 0x60f00000, 0x05004004, 0x80000040, 0x05fe07fe, 0x0501f006, 0x4203e000, 0x70000000, 0x42000000, - 0x00109813, 0x051df9a4, 0x1c01f000, 0x4203e000, + 0x00109893, 0x051df9e2, 0x1c01f000, 0x4203e000, 0x80000000, 0x4203e000, 0xb0400000, 0x40ebf800, 0x60f00000, 0x05005004, 0x80000040, 0x05fe07fe, 0x0501f006, 0x4203e000, 0x80000000, 0x42000000, - 0x00109814, 0x051df994, 0x1c01f000, 0x59a8080d, + 0x00109894, 0x051df9d2, 0x1c01f000, 0x59a8080d, 0x59a80262, 0x80040480, 0x599c0a02, 0x800409c0, 0x05020002, 0x80040800, 0x80041480, 0x05001002, 0x40000800, 0x48075060, 0x59a8100d, 0x40040000, 0x800acc80, 0x4967500d, 0x49675061, 0x59aaa80b, 0x41640800, 0x60901000, 0x0501f84e, 0x8206a400, - 0x0010cca4, 0x4953505d, 0x4152b000, 0x42006000, - 0x001098f3, 0x4a006005, 0x0000012c, 0x4a006006, - 0xda10da10, 0x64486009, 0x4a00600a, 0x001098f3, + 0x0010ccb4, 0x4953505d, 0x4152b000, 0x42006000, + 0x00109973, 0x4a006005, 0x0000012c, 0x4a006006, + 0xda10da10, 0x64486009, 0x4a00600a, 0x00109973, 0x4a00600b, 0x00100cd9, 0x599c0014, 0x48006012, - 0x599c0015, 0x48006013, 0x42006000, 0x0010cc14, + 0x599c0015, 0x48006013, 0x42006000, 0x0010cc24, 0x64206203, 0x64186407, 0x4a006002, 0xffff0000, - 0x4a006009, 0x001098f3, 0x4a006016, 0x001098f3, + 0x4a006009, 0x00109973, 0x4a006016, 0x00109973, 0x599c0014, 0x48006017, 0x599c0015, 0x48006018, 0x599c0413, 0x48006019, 0x4950601a, 0x4954601b, - 0x59a80060, 0x4800601c, 0x4a00601d, 0x001093dd, - 0x4a00601e, 0x001093de, 0x4a00601f, 0x001093df, - 0x42000000, 0xb0000000, 0x42000800, 0x0010cc14, + 0x59a80060, 0x4800601c, 0x4a00601d, 0x0010945d, + 0x4a00601e, 0x0010945e, 0x4a00601f, 0x0010945f, + 0x42000000, 0xb0000000, 0x42000800, 0x0010cc24, 0x0001f91e, 0x1c01f000, 0x4807c856, 0x59a80082, 0x800409c0, 0x05000003, 0x80080540, 0x0501f002, 0x80080500, 0x48035082, 0x1c01f000, 0x4803c856, - 0x4c000000, 0x05fdfbf4, 0x0502000b, 0x05f5f9e3, - 0x05da0a8e, 0x5c000000, 0x48026802, 0x0505feac, + 0x4c000000, 0x05fdfbc1, 0x0502000b, 0x05f5f966, + 0x05da0a02, 0x5c000000, 0x48026802, 0x0505fe9c, 0x05000006, 0x4936600a, 0x64066407, 0x60067000, - 0x0005f105, 0x5c000000, 0x1c01f000, 0x05d9fa83, + 0x0005f105, 0x5c000000, 0x1c01f000, 0x05d9f9f7, 0x4c0c0000, 0x4c100000, 0x4c140000, 0x4c180000, 0x80001d80, 0x80002580, 0x60803000, 0x90040501, 0x05000003, 0x40080000, 0x800c1c00, 0x400c2800, @@ -5130,7 +5165,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x41f00000, 0x82000500, 0xf7ffffff, 0x4003e000, 0x5c000000, 0x5c00b000, 0x1c01f000, 0x4c000000, 0x41f00000, 0x82000540, 0x08000000, 0x05fdf7f8, - 0x42007000, 0x00109471, 0x64147000, 0x64007401, + 0x42007000, 0x001094f1, 0x64147000, 0x64007401, 0x4a007201, 0x00000840, 0x64147202, 0x6401a8e8, 0x6443c82b, 0x0501f837, 0x4a01a8e9, 0x00003a0d, 0x4a01a8ee, 0x00080202, 0x6405a8e8, 0x640378e8, @@ -5150,10 +5185,10 @@ static const uint32_t isp_2500_risc_code[] = { 0x4c540000, 0x4a01a8e7, 0xaaaaaaaa, 0x4a01a8e6, 0xaaaaaaaa, 0x4a01a8e5, 0xaaaaaaaa, 0x4a01a8e4, 0xaaaaaaaa, 0x4a01a8ee, 0x00200000, 0x4979a8ee, - 0x6000b001, 0x90d4ac00, 0x4178a000, 0x051df974, + 0x6000b001, 0x90d4ac00, 0x4178a000, 0x051df9b2, 0x4a01a81d, 0x00100cd5, 0x4a01a81b, 0x00100cde, - 0x4a01a81c, 0x00100cee, 0x4a01a81e, 0x00109704, - 0x64031800, 0x600c0800, 0x42001800, 0x00109707, + 0x4a01a81c, 0x00100cee, 0x4a01a81e, 0x00109784, + 0x64031800, 0x600c0800, 0x42001800, 0x00109787, 0x417a3000, 0x811b20c8, 0x83932400, 0x0000b037, 0x48072000, 0x480f2001, 0x64032002, 0x800408c4, 0x900c1c05, 0x811a3000, 0x91180485, 0x05fc17f6, @@ -5162,9 +5197,9 @@ static const uint32_t isp_2500_risc_code[] = { 0x4a0378e7, 0xaaaaaaaa, 0x4a0378e6, 0xaaaaaaaa, 0x4a0378e5, 0xaaaaaaaa, 0x4a0378e4, 0xaaaaaaaa, 0x4a03781b, 0x00100cde, 0x4a03781c, 0x00100cee, - 0x4a03781d, 0x00109474, 0x4a03781e, 0x0010947b, - 0x42000800, 0x00109707, 0x417a3000, 0x8119b0c8, - 0x82d9b400, 0x0000bf32, 0x83180400, 0x0010561e, + 0x4a03781d, 0x001094f4, 0x4a03781e, 0x001094fb, + 0x42000800, 0x00109787, 0x417a3000, 0x8119b0c8, + 0x82d9b400, 0x0000bf32, 0x83180400, 0x001056aa, 0x50000000, 0x4801b002, 0x90040c05, 0x811a3000, 0x91180485, 0x05fc17f6, 0x5c023000, 0x5c01b000, 0x1c01f000, 0x40680800, 0x0005f87c, 0x1c01f000, @@ -5188,22 +5223,22 @@ static const uint32_t isp_2500_risc_code[] = { 0x05020003, 0x5930001a, 0x814c0580, 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x0501f8b1, 0x4df00000, 0x05fdfe0b, 0x59900002, 0x90000503, 0x0c01f001, - 0x00105098, 0x0010508d, 0x0010508c, 0x0010508c, - 0x05d9f95a, 0x59926005, 0x0501f874, 0x813261c0, + 0x00105124, 0x00105119, 0x00105118, 0x00105118, + 0x05d9f8ce, 0x59926005, 0x0501f874, 0x813261c0, 0x05000008, 0x59300004, 0x8c000516, 0x05000004, 0x59325809, 0x497a5809, 0x497a580a, 0x0501f871, 0x5c03e000, 0x05000886, 0x5c026000, 0x5c025800, 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, 0x4d300000, 0x4a01a8e5, 0x00000800, 0x0501f890, 0x4df00000, 0x598c0000, 0x90000507, 0x4803c857, - 0x0c01f001, 0x001050c9, 0x001050b2, 0x001050b9, - 0x001050bc, 0x001050c6, 0x001050c9, 0x001050b1, - 0x001050b1, 0x05d9f935, 0x598c000b, 0x80026540, - 0x05000003, 0x0501f818, 0x05da0930, 0x0501fd3c, + 0x0c01f001, 0x00105155, 0x0010513e, 0x00105145, + 0x00105148, 0x00105152, 0x00105155, 0x0010513d, + 0x0010513d, 0x05d9f8a9, 0x598c000b, 0x80026540, + 0x05000003, 0x0501f818, 0x05da08a4, 0x0501fd3c, 0x0501f011, 0x0501f823, 0x0501fd39, 0x0501f00e, 0x598c000b, 0x80026540, 0x0500000b, 0x0501f834, 0x05000004, 0x0501f80c, 0x05000002, 0x0501f819, - 0x0501fd2f, 0x0501f004, 0x0501f82d, 0x05da091f, + 0x0501fd2f, 0x0501f004, 0x0501f82d, 0x05da0893, 0x0501fd2b, 0x5c03e000, 0x05000855, 0x5c026000, 0x1c01f000, 0x598c0007, 0x81300580, 0x0502000c, 0x0501f848, 0x0501f837, 0x59300000, 0x800001c0, @@ -5234,13 +5269,13 @@ static const uint32_t isp_2500_risc_code[] = { 0x58d400ea, 0x90000507, 0x90000581, 0x0502000d, 0x4803c856, 0x60000800, 0x0501f831, 0x60000820, 0x58d400ea, 0x90000507, 0x90000583, 0x05000004, - 0x80040840, 0x05fe07fb, 0x05d9f8a4, 0x41782800, + 0x80040840, 0x05fe07fb, 0x05d9f818, 0x41782800, 0x59bc00ea, 0x90000507, 0x90000581, 0x0502000e, 0x4803c856, 0x60000800, 0x0501f80d, 0x4a0370e4, 0x00000c00, 0x60000820, 0x59bc00ea, 0x90000507, 0x90000583, 0x05000005, 0x80040840, 0x05fe07fb, - 0x05d9f892, 0x801429c0, 0x1c01f000, 0x59bc00ea, - 0x90000507, 0x90000581, 0x05da088c, 0x59bc00ea, + 0x05d9f806, 0x801429c0, 0x1c01f000, 0x59bc00ea, + 0x90000507, 0x90000581, 0x05da0800, 0x59bc00ea, 0x8c000516, 0x05fe07fe, 0x480778e1, 0x1c01f000, 0x40681000, 0x406c0800, 0x59bc00ea, 0x8c000516, 0x05fe07fe, 0x480778e1, 0x59bc00ea, 0x8c000516, @@ -5249,55 +5284,55 @@ static const uint32_t isp_2500_risc_code[] = { 0x58d400ea, 0x8c000516, 0x05fe07fe, 0x4805a8e1, 0x58d400ea, 0x8c000516, 0x05fe07fe, 0x4809a8e1, 0x1c01f000, 0x4a0378e4, 0x00002000, 0x42007000, - 0x00109471, 0x58380401, 0x8c000506, 0x05020003, + 0x001094f1, 0x58380401, 0x8c000506, 0x05020003, 0x4a01a8e4, 0x00008000, 0x1c01f000, 0x82000d00, - 0x02000018, 0x05da0857, 0x05d9f860, 0x0010527f, - 0x00105294, 0x0010518e, 0x0010527e, 0x0010518d, - 0x00105220, 0x05d9f859, 0x4d2c0000, 0x4d300000, + 0x02000018, 0x05d60fcb, 0x05d5ffd4, 0x0010530b, + 0x00105320, 0x0010521a, 0x0010530a, 0x00105219, + 0x001052ac, 0x05d5ffcd, 0x4d2c0000, 0x4d300000, 0x58d400ea, 0x8c000510, 0x05fc07fe, 0x58d660e0, - 0x813261c0, 0x05d80851, 0x59300004, 0x8c000520, + 0x813261c0, 0x05d40fc5, 0x59300004, 0x8c000520, 0x05000010, 0x82000500, 0xfffefeff, 0x48026004, 0x59325809, 0x59301407, 0x90080583, 0x05000006, - 0x90080586, 0x05da0845, 0x592c0a07, 0x0005f84e, + 0x90080586, 0x05d60fb9, 0x592c0a07, 0x0005f84e, 0x0501f006, 0x0001fb2c, 0x0005f8e7, 0x0501f003, 0x84000510, 0x48026004, 0x5c026000, 0x5c025800, - 0x1c01f000, 0x82000d00, 0x82000018, 0x05da082d, - 0x05d9f836, 0x001051c1, 0x001051c1, 0x001051c1, - 0x001051c1, 0x001051c2, 0x00105202, 0x001051c1, - 0x00105251, 0x001051c1, 0x0010527e, 0x001051c1, - 0x001051c1, 0x001051e1, 0x001051c1, 0x001051c1, - 0x001051c1, 0x05d9f825, 0x4d300000, 0x4d900000, + 0x1c01f000, 0x82000d00, 0x82000018, 0x05d60fa1, + 0x05d5ffaa, 0x0010524d, 0x0010524d, 0x0010524d, + 0x0010524d, 0x0010524e, 0x0010528e, 0x0010524d, + 0x001052dd, 0x0010524d, 0x0010530a, 0x0010524d, + 0x0010524d, 0x0010526d, 0x0010524d, 0x0010524d, + 0x0010524d, 0x05d5ff99, 0x4d300000, 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, 0x0501fc43, 0x59bc00ea, 0x8c000510, 0x05fc07fe, 0x59be60e0, 0x59300004, 0x8c000520, 0x0500000f, 0x82000500, 0xfffefeff, 0x48026004, 0x640e6203, - 0x05fdff5f, 0x05ddfa5d, 0x5c01b000, 0x5c022800, + 0x05fdff5f, 0x05ddf9d1, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c026000, 0x642378e4, 0x05fdf742, 0x84000510, 0x48026004, 0x05fdf7f6, 0x4d2c0000, 0x4d300000, 0x59bc00ea, 0x8c000510, 0x05fc07fe, 0x59be60e0, 0x813261c0, - 0x05d40ffe, 0x59300004, 0x8c000520, 0x05000014, + 0x05d40f72, 0x59300004, 0x8c000520, 0x05000014, 0x82000500, 0xfffefeff, 0x48026004, 0x59301407, - 0x90080583, 0x05d60ff5, 0x0201f800, 0x0010ba2e, - 0x80c40040, 0x05d60ff1, 0x59325809, 0x60040800, - 0x600a8000, 0x05f5fd47, 0x0001fb2c, 0x0005f8e7, + 0x90080583, 0x05d60f69, 0x0201f800, 0x0010ba3e, + 0x80c40040, 0x05d60f65, 0x59325809, 0x60040800, + 0x600a8000, 0x05f5fcf1, 0x0001fb2c, 0x0005f8e7, 0x5c026000, 0x5c025800, 0x1c01f000, 0x84000510, 0x48026004, 0x05fdf7fb, 0x4d300000, 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, 0x0501fc03, 0x59bc00ea, 0x8c000510, 0x05fc07fe, 0x59be60e0, 0x59300004, 0x8c000520, 0x0500000e, 0x82000500, 0xfffefeff, 0x48026004, 0x05fdff20, - 0x05ddfa51, 0x5c01b000, 0x5c022800, 0x5c034800, + 0x05ddf9c5, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c026000, 0x642378e4, 0x05fdf703, 0x84000510, 0x48026004, 0x05fdf7f6, 0x4d300000, 0x4d2c0000, 0x4d340000, 0x4da40000, 0x4cd00000, 0x58d400ea, 0x8c000510, 0x05fc07fe, - 0x58d660e0, 0x813261c0, 0x05d40fbc, 0x59300004, + 0x58d660e0, 0x813261c0, 0x05d40f30, 0x59300004, 0x8c000520, 0x0500001c, 0x82000500, 0xfffefeff, - 0x48026004, 0x5932680a, 0x42034800, 0x00109474, - 0x05011000, 0x4a03c840, 0x0010947b, 0x644bc842, - 0x05011000, 0x4a03c840, 0x0010948d, 0x4a03c842, - 0x000000ff, 0x05011000, 0x4a03c840, 0x0010958c, + 0x48026004, 0x5932680a, 0x42034800, 0x001094f4, + 0x05011000, 0x4a03c840, 0x001094fb, 0x644bc842, + 0x05011000, 0x4a03c840, 0x0010950d, 0x4a03c842, + 0x000000ff, 0x05011000, 0x4a03c840, 0x0010960c, 0x4a03c842, 0x000000ff, 0x0501fbe1, 0x5c01a000, 0x5c034800, 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, 0x84000510, 0x48026004, 0x5c01a000, @@ -5306,15 +5341,15 @@ static const uint32_t isp_2500_risc_code[] = { 0x4cd00000, 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, 0x0501fbb1, 0x59bc00ea, 0x8c000510, 0x05fc07fe, 0x59be60e0, 0x813261c0, - 0x05d40f86, 0x59300004, 0x8c000520, 0x0500000f, - 0x82000500, 0xfffefeff, 0x48026004, 0x0505fa00, + 0x05d40efa, 0x59300004, 0x8c000520, 0x0500000f, + 0x82000500, 0xfffefeff, 0x48026004, 0x0505f9ec, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c01a000, 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, 0x84000510, 0x48026004, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c01a000, 0x5c026800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x05d5ff68, 0x4d300000, - 0x4d380000, 0x42000000, 0x00109859, 0x0519fe12, + 0x5c026000, 0x1c01f000, 0x05d5fedc, 0x4d300000, + 0x4d380000, 0x42000000, 0x001098d9, 0x0519fe50, 0x05fdfeaf, 0x598e600b, 0x59c40004, 0x8c000506, 0x05000003, 0x0501f8cf, 0x64238804, 0x813261c0, 0x05000004, 0x0501fb79, 0x60527000, 0x0005f905, @@ -5322,9 +5357,9 @@ static const uint32_t isp_2500_risc_code[] = { 0x4d180000, 0x4d300000, 0x4d380000, 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, 0x05fdfe97, 0x417a3000, 0x59c40804, 0x83180400, - 0x001055cf, 0x50000000, 0x80040500, 0x05000017, - 0x42000000, 0x0010985a, 0x0519fdef, 0x0501fb64, - 0x59926005, 0x0501f858, 0x83180400, 0x001055cf, + 0x0010565b, 0x50000000, 0x80040500, 0x05000017, + 0x42000000, 0x001098da, 0x0519fe2d, 0x0501fb64, + 0x59926005, 0x0501f858, 0x83180400, 0x0010565b, 0x50000000, 0x48038804, 0x813261c0, 0x05000007, 0x59300004, 0x8c00050c, 0x05020002, 0x640e6203, 0x612a7000, 0x0005f905, 0x59c40004, 0x82000500, @@ -5350,22 +5385,22 @@ static const uint32_t isp_2500_risc_code[] = { 0x05fe07fe, 0x59c80840, 0x90040550, 0x48039040, 0x59c41008, 0x4c040000, 0x4c080000, 0x82081500, 0xffffff7f, 0x480b8808, 0x0501faa3, 0x05020006, - 0x0501faa7, 0x05000020, 0x48038804, 0x05ddf98d, + 0x0501faa7, 0x05000020, 0x48038804, 0x05ddf901, 0x0501f03b, 0x64238803, 0x59c40003, 0x90000503, 0x05fc07fe, 0x8c000502, 0x05020006, 0x0501fa9c, - 0x05000015, 0x48038804, 0x05ddf982, 0x0501f030, + 0x05000015, 0x48038804, 0x05ddf8f6, 0x0501f030, 0x0501fa9d, 0x05020007, 0x59c80040, 0x8400056a, 0x48039040, 0x59c80040, 0x8c00052a, 0x05fe07fe, 0x59c40005, 0x82000500, 0xc0000000, 0x05000006, 0x59c400a3, 0x84000540, 0x480388a3, 0x4a038805, - 0xc0000000, 0x05ddf940, 0x4a03a005, 0x30000000, + 0xc0000000, 0x05ddf8b4, 0x4a03a005, 0x30000000, 0x59d00006, 0x4a03a005, 0x30000000, 0x6401b006, 0x59d00005, 0x8c000504, 0x05fe07fe, 0x600008ec, 0x83180540, 0x60000000, 0x480008a1, 0x811800dc, 0x59c80840, 0x80040540, 0x48039040, 0x82000540, 0x00003000, 0x48039040, 0x59c80040, 0x82000500, - 0x00003000, 0x05fe07fd, 0x05ddf947, 0x83180400, - 0x001055cf, 0x50000000, 0x48038804, 0x80000580, + 0x00003000, 0x05fe07fd, 0x05ddf8bb, 0x83180400, + 0x0010565b, 0x50000000, 0x48038804, 0x80000580, 0x4df00000, 0x05fdfb3e, 0x5c03e000, 0x5c001000, 0x5c000800, 0x480b8808, 0x48079040, 0x1c01f000, 0x4803c856, 0x59b400f6, 0x90000538, 0x05fe07fe, @@ -5404,16 +5439,16 @@ static const uint32_t isp_2500_risc_code[] = { 0x604e7000, 0x59300004, 0x8c00050c, 0x00060905, 0x5c03e000, 0x05fc0d3e, 0x90000541, 0x1c01f000, 0x916c1581, 0x05fc07fb, 0x916c1584, 0x05fc07f9, - 0x42001000, 0x001035b3, 0x05fdf997, 0x5c03e000, + 0x42001000, 0x001035bf, 0x05fdf997, 0x5c03e000, 0x05fc0d33, 0x80000580, 0x1c01f000, 0x4d300000, 0x4d180000, 0x4d3c0000, 0x05fdfd41, 0x4df00000, 0x643da8e4, 0x643f78e4, 0x0501f9fd, 0x417a3000, 0x811808c8, 0x82040c00, 0x0000b037, 0x58066005, - 0x813261c0, 0x0500000b, 0x417a7800, 0x05f1ff94, + 0x813261c0, 0x0500000b, 0x417a7800, 0x05f1ff1b, 0x05000007, 0x59300c07, 0x90040583, 0x05000003, - 0x90040586, 0x05020002, 0x600a7800, 0x050df9a9, + 0x90040586, 0x05020002, 0x600a7800, 0x050df9b0, 0x811a3000, 0x91180485, 0x05fc17ee, 0x61000800, - 0x05ddfc4d, 0x642b78e4, 0x6429a8e4, 0x5c03e000, + 0x05ddfbbf, 0x642b78e4, 0x6429a8e4, 0x5c03e000, 0x05fc0d0f, 0x5c027800, 0x5c023000, 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, 0x05fdfd1c, 0x4df00000, 0x59c80840, 0x84040d74, 0x90040550, @@ -5445,8 +5480,8 @@ static const uint32_t isp_2500_risc_code[] = { 0x05fdfcb3, 0x4df00000, 0x59300004, 0x8c00053e, 0x05020006, 0x8c000520, 0x0500001e, 0x05fdfbdb, 0x0500001c, 0x0501f025, 0x598c000b, 0x81300580, - 0x0500000e, 0x050dfa18, 0x05020020, 0x0501f928, - 0x0500001e, 0x48038804, 0x0501f979, 0x05ddf80d, + 0x0500000e, 0x050dfa1f, 0x05020020, 0x0501f928, + 0x0500001e, 0x48038804, 0x0501f979, 0x05d9ff81, 0x05fdfbec, 0x61267000, 0x59300004, 0x8c00050c, 0x0502000b, 0x0501f00b, 0x59c40004, 0x8c000504, 0x05000012, 0x64138804, 0x05fdfbff, 0x604e7000, @@ -5456,17 +5491,17 @@ static const uint32_t isp_2500_risc_code[] = { 0x80000580, 0x1c01f000, 0x5c03e000, 0x05fc0c70, 0x5c027000, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x90000541, 0x1c01f000, - 0x59300407, 0x90000583, 0x05020007, 0x050dfc29, + 0x59300407, 0x90000583, 0x05020007, 0x050dfc33, 0x05000005, 0x59301009, 0x58080409, 0x84000550, 0x48001409, 0x1c01f000, 0x4a01a8e5, 0x00000800, 0x05fdfc6f, 0x59c400af, 0x800001c0, 0x05020003, - 0x05fdfc57, 0x05ddf5a0, 0x598c000d, 0x90001482, + 0x05fdfc57, 0x05ddf512, 0x598c000d, 0x90001482, 0x05021006, 0x80000000, 0x4803180d, 0x80000580, 0x05fdf996, 0x0500000e, 0x05fdfefe, 0x0502000c, - 0x05fdffe4, 0x42000000, 0x00109811, 0x0519fbbe, + 0x05fdffe4, 0x42000000, 0x00109891, 0x0519fbfc, 0x05fdfdef, 0x05000006, 0x0501f92c, 0x4d380000, 0x60527000, 0x0005f905, 0x5c027000, 0x05fdfc40, - 0x05ddf589, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x05ddf4fb, 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, 0x4d300000, 0x05fdf9a8, 0x05fdfc4b, 0x59c400af, 0x800001c0, 0x05000022, 0x0501f91f, 0x59926005, 0x4933c857, 0x59300004, @@ -5474,55 +5509,55 @@ static const uint32_t isp_2500_risc_code[] = { 0x05fdfb8c, 0x05fdfc2a, 0x42000800, 0x80000804, 0x0005f872, 0x0501f014, 0x60c018ea, 0x0501f8de, 0x05020003, 0x05fdf96f, 0x0501f00f, 0x05fdfe9c, - 0x0502000d, 0x05fdffb7, 0x42000000, 0x00109812, - 0x0519fb91, 0x59300004, 0x8c00050c, 0x05020002, + 0x0502000d, 0x05fdffb7, 0x42000000, 0x00109892, + 0x0519fbcf, 0x59300004, 0x8c00050c, 0x05020002, 0x640e6203, 0x4d380000, 0x612a7000, 0x0005f905, 0x5c027000, 0x05fdfc12, 0x5c026000, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x05ddf555, 0x4c600000, 0x4d900000, 0x4dd00000, + 0x05ddf4c7, 0x4c600000, 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, 0x4d300000, 0x4d2c0000, 0x05fdfc16, 0x0501f8ed, 0x59926005, - 0x813261c0, 0x05000040, 0x05f5fbbc, 0x05020005, - 0x4178c000, 0x0505f852, 0x05000002, 0x6004c000, - 0x05f5fbb6, 0x05020005, 0x8060c1c0, 0x05000003, - 0x0505f872, 0x0501f034, 0x05fdf952, 0x05020032, + 0x813261c0, 0x05000040, 0x05f5fb66, 0x05020005, + 0x4178c000, 0x0505f83e, 0x05000002, 0x6004c000, + 0x05f5fb60, 0x05020005, 0x8060c1c0, 0x05000003, + 0x0505f85e, 0x0501f034, 0x05fdf952, 0x05020032, 0x4933c857, 0x0501f88c, 0x05020015, 0x05fdf95c, 0x813261c0, 0x0500002c, 0x59325809, 0x812e59c0, - 0x05d40cae, 0x05f5fba5, 0x0502001c, 0x59c40093, + 0x05d40c22, 0x05f5fb4f, 0x0502001c, 0x59c40093, 0x4803c857, 0x800001c0, 0x05020009, 0x592c0209, - 0x84000550, 0x48025a09, 0x05f5fc95, 0x0502001e, + 0x84000550, 0x48025a09, 0x05f5fc3f, 0x0502001e, 0x592c0209, 0x84000510, 0x48025a09, 0x05fdf925, - 0x0501f019, 0x42000000, 0x00109812, 0x0519fb4a, + 0x0501f019, 0x42000000, 0x00109892, 0x0519fb88, 0x05fdfdb5, 0x592c0209, 0x84000550, 0x48025a09, 0x4d380000, 0x612a7000, 0x640e6203, 0x0005f905, 0x5c027000, 0x0501f00c, 0x59901007, 0x800811c0, 0x05fe07f1, 0x59c408af, 0x82040480, 0x000003e8, 0x05fe17ed, 0x80081000, 0x480b2007, 0x05fdf90d, - 0x05f1f832, 0x5c025800, 0x5c026000, 0x5c01b000, + 0x05edffb2, 0x5c025800, 0x5c026000, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c00c000, 0x05fdf3b6, 0x4d300000, 0x4d2c0000, 0x05fdfbc7, 0x598e600b, 0x4933c857, 0x813261c0, 0x0500003e, 0x59c41004, 0x480bc857, 0x8c080500, - 0x05000007, 0x05f5fb69, 0x05020012, 0x05f5fc60, + 0x05000007, 0x05f5fb13, 0x05020012, 0x05f5fc0a, 0x05020036, 0x05fdf8ed, 0x0501f034, 0x82080500, 0x000001fe, 0x05fe07fc, 0x59c8010b, 0x4803c857, - 0x8c000500, 0x05fc07f8, 0x42000000, 0x0010985b, - 0x0519fb11, 0x05fdfe4b, 0x0500086d, 0x0501f027, + 0x8c000500, 0x05fc07f8, 0x42000000, 0x001098db, + 0x0519fb4f, 0x05fdfe4b, 0x0500086d, 0x0501f027, 0x598c000d, 0x80000540, 0x0502000e, 0x59c408af, 0x82040480, 0x000003e8, 0x0502100a, 0x598c080d, 0x80040800, 0x4807180d, 0x05fdf8d4, 0x42000000, - 0x00109750, 0x0519fb00, 0x05edfffc, 0x0501f017, - 0x42000000, 0x00109811, 0x0519fafb, 0x05fdfdbd, + 0x001097d0, 0x0519fb3e, 0x05edff7c, 0x0501f017, + 0x42000000, 0x00109891, 0x0519fb39, 0x05fdfdbd, 0x813261c0, 0x05020003, 0x0501f855, 0x0501f00f, 0x59300407, 0x90000583, 0x05020007, 0x59325809, 0x812e59c0, 0x05000004, 0x592c0209, 0x84000550, 0x48025a09, 0x0501f85d, 0x4d380000, 0x60527000, 0x0005f905, 0x5c027000, 0x5c025800, 0x5c026000, - 0x05fdf36f, 0x59c40804, 0x83180400, 0x001055c5, + 0x05fdf36f, 0x59c40804, 0x83180400, 0x00105651, 0x50000000, 0x80040500, 0x1c01f000, 0x59c40804, - 0x83180400, 0x001055ca, 0x50000000, 0x80040500, + 0x83180400, 0x00105656, 0x50000000, 0x80040500, 0x1c01f000, 0x59c80840, 0x82040d00, 0x000e0000, - 0x83180400, 0x001055d4, 0x50000000, 0x80040580, + 0x83180400, 0x00105660, 0x50000000, 0x80040580, 0x1c01f000, 0x00000210, 0x00000420, 0x00000840, 0x00001080, 0x00002100, 0x00004000, 0x00008000, 0x00010000, 0x00020000, 0x00040000, 0x00080000, @@ -5541,225 +5576,219 @@ static const uint32_t isp_2500_risc_code[] = { 0x64171800, 0x0501f002, 0x64031800, 0x5c03e000, 0x05fc0b1b, 0x1c01f000, 0x59300004, 0x8c00050c, 0x05020002, 0x64066203, 0x1c01f000, 0x91180485, - 0x05d61bda, 0x491bc857, 0x811b20c8, 0x83932400, + 0x05d61b4e, 0x491bc857, 0x811b20c8, 0x83932400, 0x0000b037, 0x8119b0c8, 0x82d9b400, 0x0000bf32, 0x811ba0ca, 0x83d3a400, 0x00007600, 0x83180400, - 0x0010561e, 0x50034800, 0x811a28c2, 0x83162c00, - 0x00006100, 0x1c01f000, 0x0010968b, 0x001096a2, - 0x001096b9, 0x001096d0, 0x001096e7, 0x4933c857, + 0x001056aa, 0x50034800, 0x811a28c2, 0x83162c00, + 0x00006100, 0x1c01f000, 0x0010970b, 0x00109722, + 0x00109739, 0x00109750, 0x00109767, 0x4933c857, 0x59300407, 0x90000c92, 0x05021015, 0x05011000, - 0x0c01f001, 0x0010563b, 0x001056cb, 0x001059e1, - 0x00105a35, 0x001056cb, 0x001059e1, 0x00105a35, - 0x0010563b, 0x001056cb, 0x0010563b, 0x0010563b, - 0x0010563b, 0x0010563b, 0x0010563b, 0x0010563b, - 0x0010563b, 0x0010563f, 0x0010563f, 0x4803c857, + 0x0c01f001, 0x001056c7, 0x00105756, 0x00105a59, + 0x00105aad, 0x00105756, 0x00105a59, 0x00105aad, + 0x001056c7, 0x00105756, 0x001056c7, 0x001056c7, + 0x001056c7, 0x001056c7, 0x001056c7, 0x001056c7, + 0x001056c7, 0x001056cb, 0x001056cb, 0x4803c857, 0x05fdfaf7, 0x05fdfa60, 0x05fdf2e1, 0x42001000, - 0x00109730, 0x50081000, 0x4930100b, 0x58080002, - 0x82000580, 0x00000100, 0x05020037, 0x59325809, - 0x812e59c0, 0x05d40b9d, 0x492fc856, 0x5932680a, - 0x813669c0, 0x0500001e, 0x592c040c, 0x82000500, - 0x0000e000, 0x05000003, 0x0501fb88, 0x0501f002, - 0x0501fb78, 0x592c000e, 0x90000503, 0x05000006, - 0x90000583, 0x80000000, 0x58d00802, 0x80040540, - 0x4801a002, 0x42001000, 0x00109730, 0x50081000, - 0x4930100a, 0x492c1009, 0x90d00406, 0x48001003, - 0x592c000e, 0x48001005, 0x592c000f, 0x48001006, - 0x592c0010, 0x48001007, 0x0001f01c, 0x42026800, - 0x001098be, 0x592c080b, 0x48066802, 0x82040500, - 0x00ffff00, 0x05000007, 0x497a6a12, 0x59a8100f, - 0x82081500, 0x00ffff00, 0x80080580, 0x05fe07d7, - 0x82040d00, 0x000000ff, 0x800408d0, 0x48066a12, - 0x05fdf7d2, 0x1c01f000, 0x4d2c0000, 0x4d300000, - 0x4c580000, 0x4c540000, 0x4c500000, 0x58325809, - 0x812e59c0, 0x05d40b61, 0x58300002, 0x82000580, - 0x00000100, 0x0502001e, 0x5830000a, 0x5832600b, - 0x81300d80, 0x0502000e, 0x0501f82c, 0x05020012, - 0x592c080e, 0x90040c03, 0x80040904, 0x4004b000, - 0x4200a000, 0x0010947b, 0x4050a800, 0x0519fb03, - 0x600011b8, 0x0501fe07, 0x0501f007, 0x4803c857, - 0x4933c857, 0x813261c0, 0x05000003, 0x0501f81b, - 0x05fc0f9f, 0x5c00a000, 0x5c00a800, 0x5c00b000, - 0x5c026000, 0x5c025800, 0x1c01f000, 0x5830000a, - 0x5832600b, 0x4a006002, 0x00000100, 0x4803c857, - 0x4933c857, 0x81300d80, 0x05fe07ed, 0x0501f80b, - 0x05fe07f1, 0x4803c857, 0x0201f800, 0x0010ba2e, - 0x80c40040, 0x05d60b31, 0x640a5a07, 0x0001fb2c, - 0x0501ff1d, 0x05fdf7e8, 0x05fdfa79, 0x4df00000, - 0x598c000b, 0x81300580, 0x05020008, 0x598c0003, - 0x81300580, 0x05020005, 0x5c03e000, 0x05fc0a5c, - 0x80000580, 0x1c01f000, 0x4803c857, 0x5c03e000, - 0x05fc0a57, 0x90000541, 0x1c01f000, 0x59300403, - 0xb0000c98, 0x05d61b19, 0x4803c857, 0x0c01f001, - 0x00105817, 0x0010582f, 0x00105851, 0x00105954, - 0x0010590e, 0x00105912, 0x0010591e, 0x0010592e, - 0x00105924, 0x0010592e, 0x00105974, 0x0010592e, - 0x001059ae, 0x0010592e, 0x001059b9, 0x0010592e, - 0x00105924, 0x0010592e, 0x001059bd, 0x00105730, - 0x00105730, 0x00105730, 0x00105730, 0x00105730, - 0x00105730, 0x00105730, 0x00105730, 0x00105730, - 0x00105730, 0x00105730, 0x00105a4e, 0x00105a62, - 0x00105a6a, 0x00105730, 0x00105a81, 0x0010591e, - 0x00105730, 0x0010591e, 0x0010592e, 0x00105730, - 0x00105851, 0x00105954, 0x00105730, 0x00105ac9, - 0x0010592e, 0x00105730, 0x00105ad7, 0x0010592e, - 0x00105730, 0x00105924, 0x0010580a, 0x00105731, - 0x00105730, 0x00105aec, 0x00105b1d, 0x00105b94, - 0x00105730, 0x00105ba2, 0x0010591c, 0x00105b97, - 0x00105730, 0x00105a8b, 0x00105bd7, 0x00105730, - 0x00105730, 0x00105730, 0x00105730, 0x00105744, - 0x001057a5, 0x001057af, 0x00105730, 0x00105730, - 0x00105730, 0x001057e0, 0x001057e8, 0x00105730, - 0x00105730, 0x00105755, 0x0010577f, 0x00105c07, - 0x00105c3c, 0x00105c5c, 0x00105730, 0x00105730, - 0x00105730, 0x00105c32, 0x00105bb9, 0x00105aec, - 0x00105730, 0x00105730, 0x00105730, 0x00105730, - 0x00105730, 0x00105730, 0x00105730, 0x00105730, - 0x05d5fab6, 0x0501fa9b, 0x59325809, 0x592c000a, - 0x4801a006, 0x592c000b, 0x4801a007, 0x592c000c, - 0x4801a008, 0x592c000d, 0x4801a009, 0x592c000e, - 0x4801a00a, 0x4979a00b, 0x592c080a, 0x82040d00, - 0x00000fff, 0x80040904, 0x600011b8, 0x0501f55d, - 0x4a026202, 0x0000ffff, 0x0501fa86, 0x4d2c0000, - 0x4a01a006, 0x05000000, 0x59325809, 0x592c000a, - 0x4801a007, 0x592c000b, 0x4801a008, 0x592c000c, - 0x4801a009, 0x5c025800, 0x60100800, 0x600011b8, - 0x0501f54c, 0x4c580000, 0x4c500000, 0x4c540000, - 0x4d2c0000, 0x0501fa73, 0x5930040c, 0x90000503, + 0x001097b0, 0x50081000, 0x4930100b, 0x58080002, + 0x82000580, 0x00000100, 0x05020036, 0x59325809, + 0x812e59c0, 0x05d40b11, 0x492fc856, 0x5932680a, + 0x83340580, 0x0010993e, 0x0500001e, 0x592c040c, + 0x82000500, 0x0000e000, 0x05000003, 0x0501fb73, + 0x0501f002, 0x0501fb63, 0x592c000e, 0x90000503, 0x05000006, 0x90000583, 0x80000000, 0x58d00802, - 0x80040540, 0x4801a002, 0x59325809, 0x4200a800, - 0x0010947b, 0x592cb206, 0x9058b403, 0x8058b104, - 0x912ca407, 0x0519f9f6, 0x40580000, 0x8054ac00, - 0x592c0001, 0x80000540, 0x05000003, 0x40025800, - 0x05fdf7f5, 0x4200a000, 0x0010947b, 0x4050a800, - 0x5930b40c, 0x9058b403, 0x8058b104, 0x40580800, - 0x0519fa22, 0x600011b8, 0x5c025800, 0x5c00a800, - 0x5c00a000, 0x5c00b000, 0x0501f522, 0x4c580000, - 0x4c500000, 0x4c540000, 0x4d2c0000, 0x42034800, - 0x00109474, 0x0501fa55, 0x59325809, 0x592c0802, - 0x4807c857, 0x40041000, 0x80040904, 0x90081503, - 0x05000007, 0x80040800, 0x90081583, 0x80081000, - 0x58d00002, 0x80080540, 0x4801a002, 0x4a025806, - 0x02000000, 0x90d0ac06, 0x592cb011, 0x912ca406, - 0x0519f9c7, 0x40580000, 0x8054ac00, 0x592e5801, - 0x41780000, 0x812e5d40, 0x05fe07f8, 0x600011b8, - 0x5c025800, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x0501f4fc, 0x0501fa27, 0x4a01a006, 0x78000000, - 0x5930001e, 0x840001c0, 0x4801a407, 0x4979a207, - 0x60080800, 0x600011b8, 0x0501f4f2, 0x4c580000, - 0x4c540000, 0x4c500000, 0x0501fa28, 0x4a01a006, - 0x02000000, 0x59a80002, 0x4801a008, 0x59a80003, + 0x80040540, 0x4801a002, 0x42001000, 0x001097b0, + 0x50081000, 0x4930100a, 0x492c1009, 0x90d00406, + 0x48001003, 0x592c000e, 0x48001005, 0x592c000f, + 0x48001006, 0x592c0010, 0x48001007, 0x0001f01c, + 0x592c080b, 0x48066802, 0x82040500, 0x00ffff00, + 0x05000007, 0x497a6a12, 0x59a8100f, 0x82081500, + 0x00ffff00, 0x80080580, 0x05fe07d9, 0x82040d00, + 0x000000ff, 0x800408d0, 0x48066a12, 0x05fdf7d4, + 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x4c580000, + 0x4c540000, 0x4c500000, 0x58325809, 0x812e59c0, + 0x05d40ad6, 0x58300002, 0x82000580, 0x00000100, + 0x0502001e, 0x5830000a, 0x5832600b, 0x81300d80, + 0x0502000e, 0x0501f82c, 0x05020012, 0x592c080e, + 0x90040c03, 0x80040904, 0x4004b000, 0x4200a000, + 0x001094fb, 0x4050a800, 0x0519fb42, 0x600011b8, + 0x0501fdf4, 0x0501f007, 0x4803c857, 0x4933c857, + 0x813261c0, 0x05000003, 0x0501f81b, 0x05fc0fa0, + 0x5c00a000, 0x5c00a800, 0x5c00b000, 0x5c026000, + 0x5c025800, 0x1c01f000, 0x5830000a, 0x5832600b, + 0x4a006002, 0x00000100, 0x4803c857, 0x4933c857, + 0x81300d80, 0x05fe07ed, 0x0501f80b, 0x05fe07f1, + 0x4803c857, 0x0201f800, 0x0010ba3e, 0x80c40040, + 0x05d60aa6, 0x640a5a07, 0x0001fb2c, 0x0501ff0a, + 0x05fdf7e8, 0x05fdfa7a, 0x4df00000, 0x598c000b, + 0x81300580, 0x05020008, 0x598c0003, 0x81300580, + 0x05020005, 0x5c03e000, 0x05fc0a5d, 0x80000580, + 0x1c01f000, 0x4803c857, 0x5c03e000, 0x05fc0a58, + 0x90000541, 0x1c01f000, 0x59300403, 0xb0000c98, + 0x05d61a8e, 0x83340d80, 0x0010993e, 0x0502000a, + 0x59300820, 0x48066802, 0x82041500, 0x00ffff00, + 0x05020004, 0x800408d0, 0x48066a12, 0x0501f002, + 0x497a6a12, 0x4803c857, 0x0c01f001, 0x001058ae, + 0x001058c6, 0x001058d4, 0x001059c4, 0x00105991, + 0x00105995, 0x001059a1, 0x001059b1, 0x001059a7, + 0x001059b1, 0x001059e8, 0x001059b1, 0x00105a26, + 0x001059b1, 0x00105a31, 0x001059b1, 0x001059a7, + 0x001059b1, 0x00105a35, 0x001057c7, 0x001057c7, + 0x001057c7, 0x001057c7, 0x001057c7, 0x001057c7, + 0x001057c7, 0x001057c7, 0x001057c7, 0x001057c7, + 0x001057c7, 0x00105ac6, 0x00105ada, 0x00105ae2, + 0x001057c7, 0x00105af9, 0x001059a1, 0x001057c7, + 0x001059a1, 0x001059b1, 0x001057c7, 0x001058d4, + 0x001059c4, 0x001057c7, 0x00105b41, 0x001059b1, + 0x001057c7, 0x00105b4f, 0x001059b1, 0x001057c7, + 0x001059a7, 0x001058a1, 0x001057c8, 0x001057c7, + 0x00105b64, 0x00105b95, 0x00105c0c, 0x001057c7, + 0x00105c1a, 0x0010599f, 0x00105c0f, 0x001057c7, + 0x00105b03, 0x00105c4f, 0x001057c7, 0x001057c7, + 0x001057c7, 0x001057c7, 0x001057db, 0x0010583c, + 0x00105846, 0x001057c7, 0x001057c7, 0x001057c7, + 0x00105877, 0x0010587f, 0x001057c7, 0x001057c7, + 0x001057ec, 0x00105816, 0x00105c7f, 0x00105cb4, + 0x00105cd4, 0x001057c7, 0x001057c7, 0x001057c7, + 0x00105caa, 0x00105c31, 0x00105b64, 0x001057c7, + 0x001057c7, 0x001057c7, 0x001057c7, 0x001057c7, + 0x001057c7, 0x001057c7, 0x001057c7, 0x05d5fa1f, + 0x0501fa7c, 0x59325809, 0x592c000a, 0x4801a006, + 0x592c000b, 0x4801a007, 0x592c000c, 0x4801a008, + 0x592c000d, 0x4801a009, 0x592c000e, 0x4801a00a, + 0x4979a00b, 0x592c080a, 0x82040d00, 0x00000fff, + 0x80040904, 0x600011b8, 0x0501f53e, 0x4a026202, + 0x0000ffff, 0x0501fa67, 0x4d2c0000, 0x4a01a006, + 0x05000000, 0x59325809, 0x592c000a, 0x4801a007, + 0x592c000b, 0x4801a008, 0x592c000c, 0x4801a009, + 0x5c025800, 0x60100800, 0x600011b8, 0x0501f52d, + 0x4c580000, 0x4c500000, 0x4c540000, 0x4d2c0000, + 0x0501fa54, 0x5930040c, 0x90000503, 0x05000006, + 0x90000583, 0x80000000, 0x58d00802, 0x80040540, + 0x4801a002, 0x59325809, 0x4200a800, 0x001094fb, + 0x592cb206, 0x9058b403, 0x8058b104, 0x912ca407, + 0x0519fa29, 0x40580000, 0x8054ac00, 0x592c0001, + 0x80000540, 0x05000003, 0x40025800, 0x05fdf7f5, + 0x4200a000, 0x001094fb, 0x4050a800, 0x5930b40c, + 0x9058b403, 0x8058b104, 0x40580800, 0x0519fa55, + 0x600011b8, 0x5c025800, 0x5c00a800, 0x5c00a000, + 0x5c00b000, 0x0501f503, 0x4c580000, 0x4c500000, + 0x4c540000, 0x4d2c0000, 0x42034800, 0x001094f4, + 0x0501fa36, 0x59325809, 0x592c0802, 0x4807c857, + 0x40041000, 0x80040904, 0x90081503, 0x05000007, + 0x80040800, 0x90081583, 0x80081000, 0x58d00002, + 0x80080540, 0x4801a002, 0x4a025806, 0x02000000, + 0x90d0ac06, 0x592cb011, 0x912ca406, 0x0519f9fa, + 0x40580000, 0x8054ac00, 0x592e5801, 0x41780000, + 0x812e5d40, 0x05fe07f8, 0x600011b8, 0x5c025800, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x0501f4dd, + 0x0501fa08, 0x4a01a006, 0x78000000, 0x5930001e, + 0x840001c0, 0x4801a407, 0x4979a207, 0x60080800, + 0x600011b8, 0x0501f4d3, 0x4c580000, 0x4c540000, + 0x4c500000, 0x0501fa09, 0x4a01a006, 0x02000000, + 0x59a80002, 0x4801a008, 0x59a80003, 0x4801a009, + 0x59a80000, 0x4801a00a, 0x59a80001, 0x4801a00b, + 0x5930001e, 0x82000d80, 0x0000e000, 0x0500000e, + 0x82000d80, 0x0000df00, 0x05000004, 0x6441a407, + 0x60180800, 0x0501f015, 0x42001800, 0x001094d7, + 0x05d5fcae, 0x600001be, 0x4200a000, 0x001094d7, + 0x0501f007, 0x42001800, 0x001094e4, 0x05d5fca7, + 0x600001c0, 0x4200a000, 0x001094e4, 0x90000550, + 0x4801a407, 0x64d1a207, 0x6034b000, 0x90d0ac0c, + 0x0519f9b9, 0x604c0800, 0x600011b8, 0x5c00a000, + 0x5c00a800, 0x5c00b000, 0x0501f4a2, 0x0501f9cd, + 0x4a01a006, 0x63000028, 0x5930001e, 0x4801a007, + 0x60080800, 0x600011b8, 0x0501f49a, 0x0501f9d3, + 0x41780000, 0x41780800, 0x42002000, 0x00080000, + 0x0c01f80e, 0x80000000, 0x80040800, 0x60301000, + 0x82080540, 0x02000000, 0x4801a006, 0x800408e0, + 0x5930001e, 0x80040540, 0x4801a007, 0x80080904, + 0x600011b8, 0x0501f487, 0x00105897, 0x00105899, + 0x0010589b, 0x0010589d, 0x0010589f, 0x4811a008, + 0x1c01f000, 0x4811a009, 0x1c01f000, 0x4811a00a, + 0x1c01f000, 0x4811a00b, 0x1c01f000, 0x4811a00c, + 0x1c01f000, 0x4a02600a, 0x0010993e, 0x59a8000f, + 0x82000500, 0x000000ff, 0x800000d0, 0x42026800, + 0x0010993e, 0x48026a12, 0x0501f9f7, 0x41780800, + 0x600010b8, 0x0501f46b, 0x0501f996, 0x4a01a006, + 0x52000000, 0x4979a007, 0x599c0017, 0x82000500, + 0x00000801, 0x05000004, 0x599c0402, 0x05ddfa74, + 0x4805a007, 0x59a80002, 0x4801a008, 0x59a80003, 0x4801a009, 0x59a80000, 0x4801a00a, 0x59a80001, - 0x4801a00b, 0x5930001e, 0x82000d80, 0x0000e000, - 0x0500000e, 0x82000d80, 0x0000df00, 0x05000004, - 0x6441a407, 0x60180800, 0x0501f015, 0x42001800, - 0x00109457, 0x05d5fd45, 0x600001be, 0x4200a000, - 0x00109457, 0x0501f007, 0x42001800, 0x00109464, - 0x05d5fd3e, 0x600001c0, 0x4200a000, 0x00109464, - 0x90000550, 0x4801a407, 0x64d1a207, 0x6034b000, - 0x90d0ac0c, 0x0519f986, 0x604c0800, 0x600011b8, - 0x5c00a000, 0x5c00a800, 0x5c00b000, 0x0501f4c1, - 0x0501f9ec, 0x4a01a006, 0x63000028, 0x5930001e, - 0x4801a007, 0x60080800, 0x600011b8, 0x0501f4b9, - 0x0501f9f2, 0x41780000, 0x41780800, 0x42002000, - 0x00080000, 0x0c01f80e, 0x80000000, 0x80040800, - 0x60301000, 0x82080540, 0x02000000, 0x4801a006, - 0x800408e0, 0x5930001e, 0x80040540, 0x4801a007, - 0x80080904, 0x600011b8, 0x0501f4a6, 0x00105800, - 0x00105802, 0x00105804, 0x00105806, 0x00105808, - 0x4811a008, 0x1c01f000, 0x4811a009, 0x1c01f000, - 0x4811a00a, 0x1c01f000, 0x4811a00b, 0x1c01f000, - 0x4811a00c, 0x1c01f000, 0x4a02600a, 0x001098be, - 0x59a8000f, 0x82000500, 0x000000ff, 0x800000d0, - 0x42026800, 0x001098be, 0x48026a12, 0x0501fa16, - 0x41780800, 0x600010b8, 0x0501f48a, 0x0501f9b5, - 0x4a01a006, 0x52000000, 0x4979a007, 0x599c0017, - 0x82000500, 0x00000801, 0x05000004, 0x599c0402, - 0x05ddfb0d, 0x4805a007, 0x59a80002, 0x4801a008, - 0x59a80003, 0x4801a009, 0x59a80000, 0x4801a00a, - 0x59a80001, 0x4801a00b, 0x59a8000f, 0x4801a00c, - 0x601c0800, 0x600011b8, 0x0501f472, 0x4a026202, - 0x0000ffff, 0x4d340000, 0x813669c0, 0x05020011, - 0x42026800, 0x001098be, 0x4936600a, 0x4a026c03, - 0x0000ffff, 0x497a6a00, 0x59300020, 0x48026802, - 0x497a6020, 0x497a6a12, 0x82000d00, 0x00ffff00, - 0x05020004, 0x800000d0, 0x48026a12, 0x0501f001, - 0x0501f988, 0x5c026800, 0x4a01a006, 0x05000000, - 0x59a8000f, 0x4801a007, 0x59a80002, 0x59a80803, - 0x4801a008, 0x4805a009, 0x60100800, 0x600011b8, - 0x0501f450, 0x4a026202, 0x0000ffff, 0x0501f979, - 0x4d3c0000, 0x417a7800, 0x05f1fb63, 0x5c027800, - 0x4a01a006, 0x03000000, 0x59340403, 0x82000580, - 0x000007fe, 0x0502006a, 0x4a01a006, 0x04000000, - 0x81a40800, 0x4a000800, 0x22fffffe, 0x5934000a, - 0x84000500, 0x4802680a, 0x59a8021b, 0x8c000508, - 0x05000010, 0x59a8001f, 0x4801a007, 0x59a80020, - 0x82000500, 0x07deffff, 0x599c0818, 0x8c040516, - 0x05000002, 0x8400056a, 0x4801a008, 0x4a01a009, - 0x00002710, 0x59a80022, 0x4801a00a, 0x0501f038, - 0x59a8001f, 0x59a8121b, 0x8c080506, 0x05000003, - 0x82000500, 0xffff0000, 0x4801a007, 0x05f5f85f, - 0x0502000b, 0x59300c03, 0xb0041591, 0x05000008, - 0x497b8880, 0x82000500, 0x0000ffff, 0x4c000000, - 0x05ddfac7, 0x5c000000, 0x48038880, 0x59a80020, - 0x05f5f852, 0x05020004, 0x82000500, 0x37ffffff, - 0x0501f003, 0x82000500, 0x3fffffff, 0x599c0818, - 0x8c040516, 0x05000002, 0x8400056a, 0x8d0c0510, - 0x05000014, 0x59300c03, 0xb0041591, 0x05000011, - 0x900415b1, 0x0500000f, 0x4c580000, 0x4c500000, - 0x4c540000, 0x6010b000, 0x4200a000, 0x001098ac, - 0x90d0ac1f, 0x4c000000, 0x0519f8b9, 0x5c000000, - 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x8400057a, - 0x4801a008, 0x4979a009, 0x4979a00a, 0x59a80002, - 0x59a80803, 0x4801a00b, 0x4805a00c, 0x59a80000, - 0x59a80801, 0x4801a00d, 0x4805a00e, 0x4979a00f, - 0x4979a010, 0x4979a011, 0x4979a012, 0x4979a013, - 0x4979a014, 0x4979a015, 0x4979a016, 0x59a80023, - 0x84000576, 0x4801a017, 0x59a80024, 0x4801a018, - 0x4979a019, 0x4979a01a, 0x0501f045, 0x59a8021b, - 0x8c000508, 0x0500000c, 0x59a8001f, 0x82000500, - 0x0000ffff, 0x59c40880, 0x80040d80, 0x05000006, - 0x497b8880, 0x4c000000, 0x05ddfa7d, 0x5c000000, - 0x48038880, 0x59a8001f, 0x4801a007, 0x4c640000, - 0x4d2c0000, 0x59a8c820, 0x050df80a, 0x0500000d, - 0x050dfcba, 0x0502000b, 0x592c0208, 0x8c00050e, - 0x05000008, 0x8264cd00, 0x0000ffff, 0x592c000a, - 0x82000500, 0xffff0000, 0x8064cd40, 0x0501f005, - 0x59a80a1b, 0x90040d30, 0x05000002, 0x8464cd36, - 0x4865a008, 0x5c025800, 0x5c00c800, 0x59a80021, - 0x4801a009, 0x59a80022, 0x4801a00a, 0x59a80002, - 0x59a80803, 0x4801a00b, 0x4805a00c, 0x59a80000, - 0x59a80801, 0x4801a00d, 0x4805a00e, 0x4979a00f, - 0x4979a010, 0x4979a011, 0x4979a012, 0x4979a013, - 0x4979a014, 0x4979a015, 0x4979a016, 0x59a80023, - 0x4801a017, 0x59a80024, 0x4801a018, 0x59a80025, - 0x4801a019, 0x59a80026, 0x4801a01a, 0x60740800, - 0x600011b8, 0x0501f393, 0x0501f8be, 0x4a01a006, - 0x50000000, 0x05fdf7b6, 0x0501f8ba, 0x4a01a006, - 0x21100014, 0x4979a007, 0x4979a008, 0x4979a009, - 0x4979a00a, 0x60140800, 0x600011b8, 0x0501f385, - 0x0501f8b7, 0x0501f002, 0x0501f8bc, 0x4a01a006, - 0x02000000, 0x60040800, 0x600011b8, 0x0501f37d, - 0x0501f8b6, 0x4a01a006, 0x02000000, 0x59300403, - 0x900005b1, 0x05fe079e, 0x81a40800, 0x4a000801, - 0x00fffffe, 0x05fdf739, 0x4d340000, 0x813669c0, - 0x05020010, 0x42026800, 0x001098be, 0x4936600a, - 0x4a026c03, 0x0000ffff, 0x497a6a00, 0x59300020, - 0x48026802, 0x497a6020, 0x497a6a12, 0x82000d00, - 0x00ffff00, 0x05020003, 0x800000d0, 0x48026a12, - 0x0501f89a, 0x5c026800, 0x4a01a006, 0x01000000, + 0x4801a00b, 0x59a8000f, 0x4801a00c, 0x601c0800, + 0x600011b8, 0x0501f453, 0x4a026202, 0x0000ffff, + 0x0501f97c, 0x4a01a006, 0x05000000, 0x59a8000f, + 0x4801a007, 0x59a80002, 0x59a80803, 0x4801a008, + 0x4805a009, 0x60100800, 0x600011b8, 0x0501f445, + 0x4a026202, 0x0000ffff, 0x0501f96e, 0x4d3c0000, + 0x417a7800, 0x05f1faf3, 0x5c027800, 0x4a01a006, + 0x03000000, 0x59340403, 0x82000580, 0x000007fe, + 0x0502006a, 0x4a01a006, 0x04000000, 0x81a40800, + 0x4a000800, 0x22fffffe, 0x5934000a, 0x84000500, + 0x4802680a, 0x59a8021b, 0x8c000508, 0x05000010, + 0x59a8001f, 0x4801a007, 0x59a80020, 0x82000500, + 0x07deffff, 0x599c0818, 0x8c040516, 0x05000002, + 0x8400056a, 0x4801a008, 0x4a01a009, 0x00002710, + 0x59a80022, 0x4801a00a, 0x0501f038, 0x59a8001f, + 0x59a8121b, 0x8c080506, 0x05000003, 0x82000500, + 0xffff0000, 0x4801a007, 0x05f5f812, 0x0502000b, + 0x59300c03, 0xb0041591, 0x05000008, 0x497b8880, + 0x82000500, 0x0000ffff, 0x4c000000, 0x05ddfa42, + 0x5c000000, 0x48038880, 0x59a80020, 0x05f5f805, + 0x05020004, 0x82000500, 0x37ffffff, 0x0501f003, + 0x82000500, 0x3fffffff, 0x599c0818, 0x8c040516, + 0x05000002, 0x8400056a, 0x8d0c0510, 0x05000014, + 0x59300c03, 0xb0041591, 0x05000011, 0x900415b1, + 0x0500000f, 0x4c580000, 0x4c500000, 0x4c540000, + 0x6010b000, 0x4200a000, 0x0010992c, 0x90d0ac1f, + 0x4c000000, 0x0519f900, 0x5c000000, 0x5c00a800, + 0x5c00a000, 0x5c00b000, 0x8400057a, 0x4801a008, + 0x4979a009, 0x4979a00a, 0x59a80002, 0x59a80803, + 0x4801a00b, 0x4805a00c, 0x59a80000, 0x59a80801, + 0x4801a00d, 0x4805a00e, 0x4979a00f, 0x4979a010, + 0x4979a011, 0x4979a012, 0x4979a013, 0x4979a014, + 0x4979a015, 0x4979a016, 0x59a80023, 0x84000576, + 0x4801a017, 0x59a80024, 0x4801a018, 0x4979a019, + 0x4979a01a, 0x0501f045, 0x59a8021b, 0x8c000508, + 0x0500000c, 0x59a8001f, 0x82000500, 0x0000ffff, + 0x59c40880, 0x80040d80, 0x05000006, 0x497b8880, + 0x4c000000, 0x05ddf9f8, 0x5c000000, 0x48038880, + 0x59a8001f, 0x4801a007, 0x4c640000, 0x4d2c0000, + 0x59a8c820, 0x050df81d, 0x0500000d, 0x050dfccd, + 0x0502000b, 0x592c0208, 0x8c00050e, 0x05000008, + 0x8264cd00, 0x0000ffff, 0x592c000a, 0x82000500, + 0xffff0000, 0x8064cd40, 0x0501f005, 0x59a80a1b, + 0x90040d30, 0x05000002, 0x8464cd36, 0x4865a008, + 0x5c025800, 0x5c00c800, 0x59a80021, 0x4801a009, + 0x59a80022, 0x4801a00a, 0x59a80002, 0x59a80803, + 0x4801a00b, 0x4805a00c, 0x59a80000, 0x59a80801, + 0x4801a00d, 0x4805a00e, 0x4979a00f, 0x4979a010, + 0x4979a011, 0x4979a012, 0x4979a013, 0x4979a014, + 0x4979a015, 0x4979a016, 0x59a80023, 0x4801a017, + 0x59a80024, 0x4801a018, 0x59a80025, 0x4801a019, + 0x59a80026, 0x4801a01a, 0x60740800, 0x600011b8, + 0x0501f388, 0x0501f8b3, 0x4a01a006, 0x50000000, + 0x05fdf7b6, 0x0501f8af, 0x4a01a006, 0x21100014, + 0x4979a007, 0x4979a008, 0x4979a009, 0x4979a00a, + 0x60140800, 0x600011b8, 0x0501f37a, 0x0501f8ac, + 0x0501f002, 0x0501f8b1, 0x4a01a006, 0x02000000, + 0x60040800, 0x600011b8, 0x0501f372, 0x0501f8ab, + 0x4a01a006, 0x02000000, 0x59300403, 0x900005b1, + 0x05fe079e, 0x81a40800, 0x4a000801, 0x00fffffe, + 0x05fdf739, 0x0501f8a1, 0x4a01a006, 0x01000000, 0x5930041c, 0x80000540, 0x05000003, 0x4801a407, 0x0501f002, 0x640da407, 0x5930021c, 0x80000540, 0x05000003, 0x4801a207, 0x0501f003, 0x4a01a207, - 0x00002a00, 0x60080800, 0x600011b8, 0x0501f34d, - 0x4a026202, 0x0000ffff, 0x0501f876, 0x4a01a406, + 0x00002a00, 0x60080800, 0x600011b8, 0x0501f355, + 0x4a026202, 0x0000ffff, 0x0501f87e, 0x4a01a406, 0x00002010, 0x6451a206, 0x4a01a407, 0x00000800, - 0x4a01a207, 0x00002000, 0x60000008, 0x599c0817, + 0x4a01a207, 0x00002000, 0x60000008, 0x59a80807, + 0x8c04050c, 0x05000002, 0x80000580, 0x599c0817, 0x8c04050a, 0x05020002, 0x90000560, 0x8c040508, 0x05000002, 0x90000550, 0x90000542, 0x5934080a, 0x8c040514, 0x05000005, 0x82040d00, 0x00000380, 0x80040540, 0x0501f006, 0x599c0818, 0x8c040518, - 0x05000003, 0x82000540, 0x00000380, 0x0501f037, - 0x0501f866, 0x4a01a406, 0x00000210, 0x6451a206, + 0x05000003, 0x82000540, 0x00000380, 0x0501f03b, + 0x0501f86a, 0x4a01a406, 0x00000210, 0x6451a206, 0x4a01a407, 0x00000800, 0x5934000a, 0x8c000516, 0x05000013, 0x59340c05, 0x90040530, 0x05000013, 0x59340a05, 0x82040500, 0x0000c000, 0x05020009, @@ -5767,7 +5796,8 @@ static const uint32_t isp_2500_risc_code[] = { 0x0501f00c, 0x4a01a207, 0x00000100, 0x0501f009, 0x4a01a207, 0x00000400, 0x0501f006, 0x4a01a207, 0x00000700, 0x0501f003, 0x4a01a207, 0x00000800, - 0x60000008, 0x599c0817, 0x8c04050a, 0x05020002, + 0x60000008, 0x59a80807, 0x8c04050c, 0x05000002, + 0x80000580, 0x599c0817, 0x8c04050a, 0x05020002, 0x90000560, 0x8c040508, 0x05000002, 0x90000550, 0x90000542, 0x59340a00, 0x8c04050e, 0x0500000b, 0x84000550, 0x599c1017, 0x8c08050a, 0x05020004, @@ -5777,7 +5807,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x02100014, 0x4a01a007, 0x00000100, 0x4979a008, 0x4979a009, 0x4979a00a, 0x60140800, 0x600011b8, 0x0501f2e8, 0x0501f821, 0x4a01a006, 0x02000000, - 0x05fdf65e, 0x4933c857, 0x0501f81c, 0x4a01a006, + 0x05fdf67d, 0x4933c857, 0x0501f81c, 0x4a01a006, 0x01000000, 0x642da407, 0x60080800, 0x600011b8, 0x0501f2dc, 0x42005000, 0x32000000, 0x42006000, 0x08290000, 0x41786800, 0x41787800, 0x0501f2b1, @@ -5787,31 +5817,31 @@ static const uint32_t isp_2500_risc_code[] = { 0x41787800, 0x0501f2a3, 0x42005000, 0x23000000, 0x42006000, 0x01980000, 0x41786800, 0x41787800, 0x0501f29c, 0x59300403, 0x82000c80, 0x00000085, - 0x05d41802, 0x82000c80, 0x00000093, 0x05d21fff, - 0x82000480, 0x00000085, 0x0c01f001, 0x001059fa, - 0x001059f9, 0x001059f9, 0x001059f9, 0x001059f9, - 0x001059f9, 0x001059fa, 0x001059f9, 0x001059f9, - 0x001059f9, 0x001059f9, 0x001059f9, 0x001059f9, - 0x00105a01, 0x05d1ffed, 0x4933c857, 0x42034800, - 0x00109474, 0x0501f82c, 0x41780800, 0x600010b8, + 0x05d01f8a, 0x82000c80, 0x00000093, 0x05d21f87, + 0x82000480, 0x00000085, 0x0c01f001, 0x00105a72, + 0x00105a71, 0x00105a71, 0x00105a71, 0x00105a71, + 0x00105a71, 0x00105a72, 0x00105a71, 0x00105a71, + 0x00105a71, 0x00105a71, 0x00105a71, 0x00105a71, + 0x00105a79, 0x05d1ff75, 0x4933c857, 0x42034800, + 0x001094f4, 0x0501f82c, 0x41780800, 0x600010b8, 0x0501f2a0, 0x4d2c0000, 0x59325809, 0x4933c857, - 0x492fc857, 0x812e59c0, 0x05d00fe0, 0x59340a12, + 0x492fc857, 0x812e59c0, 0x05d00f68, 0x59340a12, 0x82040d00, 0x0000ff00, 0x592c000b, 0x82000500, 0x000000ff, 0x900001c0, 0x80040540, 0x90000551, 0x44034800, 0x81a5a000, 0x60241000, 0x600c0800, 0x592c000a, 0x82000500, 0xff000000, 0x82001d80, 0x84000000, 0x05000006, 0x82001d80, 0x85000000, - 0x05d20fca, 0x601c1000, 0x60040800, 0x912c1c0a, + 0x05d20f52, 0x601c1000, 0x60040800, 0x912c1c0a, 0x500c0000, 0x4401a000, 0x800c1800, 0x80d1a000, 0x80081040, 0x05fe07fb, 0x600011b8, 0x5c025800, 0x0501f278, 0x42005000, 0x81000000, 0x42006000, 0x00090000, 0x41786800, 0x41787800, 0x59301407, 0x90081585, 0x05020003, 0x42006000, 0x00890000, - 0x0501f248, 0x59300403, 0xb0000c93, 0x05d21faf, - 0xb000048b, 0x05d01fad, 0x5932680a, 0x59368c03, - 0x4803c857, 0x0c01f001, 0x00105aa2, 0x00105aaa, - 0x00105ab2, 0x00105aba, 0x00105a46, 0x00105a46, - 0x00105a46, 0x00105a9a, 0x05d1ffa0, 0x42005000, + 0x0501f248, 0x59300403, 0xb0000c93, 0x05d21f37, + 0xb000048b, 0x05d01f35, 0x5932680a, 0x59368c03, + 0x4803c857, 0x0c01f001, 0x00105b1a, 0x00105b22, + 0x00105b2a, 0x00105b32, 0x00105abe, 0x00105abe, + 0x00105abe, 0x00105b12, 0x05d1ff28, 0x42005000, 0x06000000, 0x42006000, 0x08290000, 0x41786800, 0x41787800, 0x0501f22f, 0x4933c857, 0x05fdff7d, 0x4a01a006, 0x12000000, 0x59300407, 0x90000584, @@ -5830,7 +5860,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x4a01a006, 0x62000000, 0x5930001e, 0x4801a007, 0x60080800, 0x600011b8, 0x0501f216, 0x05fdff41, 0x59300809, 0x4c500000, 0x4c540000, 0x4c580000, - 0x9004a40b, 0x5930b01e, 0x90d0ac06, 0x0515fecc, + 0x9004a40b, 0x5930b01e, 0x90d0ac06, 0x0515ff1e, 0x5930081e, 0x600011b8, 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x0501f207, 0x05fdffad, 0x59300019, 0x4801a006, 0x5930001a, 0x4801a007, 0x4a01a008, @@ -5854,35 +5884,35 @@ static const uint32_t isp_2500_risc_code[] = { 0x4979a408, 0x4979a208, 0x4979a409, 0x4979a209, 0x4979a00b, 0x60180800, 0x600011b8, 0x0501f1b5, 0x4933c857, 0x4937c857, 0x4d1c0000, 0x60d40800, - 0x050df91a, 0x05020020, 0x05fdfeda, 0x4a01a006, + 0x050df938, 0x05020020, 0x05fdfeda, 0x4a01a006, 0x13000000, 0x59323820, 0x59300403, 0xb0000597, - 0x05000004, 0x591c0416, 0x8c000502, 0x05d00eeb, + 0x05000004, 0x591c0416, 0x8c000502, 0x05d00e73, 0x591c001b, 0x4801a005, 0x591c0407, 0x90000583, 0x05000007, 0x5930080a, 0x58040002, 0x82000500, 0x00ffffff, 0x4801a007, 0x0501f003, 0x59a8000f, 0x4801a007, 0x5930041b, 0x4801a408, 0x5930021b, 0x4801a208, 0x600c0800, 0x600011b8, 0x5c023800, - 0x0501f190, 0x4803c856, 0x05f9fe21, 0x598c000b, - 0x81300580, 0x05d20ed1, 0x05f9fd87, 0x59300403, - 0xb0000597, 0x050408d4, 0x0005f8e7, 0x5c023800, - 0x05f9f603, 0x4803c856, 0x4d2c0000, 0x4d1c0000, - 0x59323820, 0x811e39c0, 0x05d00ec4, 0x831c0580, + 0x0501f190, 0x4803c856, 0x05f9fe35, 0x598c000b, + 0x81300580, 0x05d20e59, 0x05f9fd9b, 0x59300403, + 0xb0000597, 0x050408da, 0x0005f8e7, 0x5c023800, + 0x05f9f617, 0x4803c856, 0x4d2c0000, 0x4d1c0000, + 0x59323820, 0x811e39c0, 0x05d00e4c, 0x831c0580, 0xffffffff, 0x05000036, 0x591c0c07, 0x90040586, 0x0500000a, 0x90040583, 0x05000036, 0x64de6403, 0x640e641c, 0x4a02621c, 0x00001700, 0x5c023800, 0x5c025800, 0x0501f063, 0x0501f848, 0x42001000, 0x40000000, 0x591c0203, 0x591c0804, 0x8c04053e, - 0x05020020, 0x90000c8e, 0x0c001002, 0x05d1feab, - 0x00105b4d, 0x00105b58, 0x00105b4e, 0x00105b58, - 0x00105b54, 0x00105b4d, 0x00105b4d, 0x00105b58, - 0x00105b58, 0x00105b4d, 0x00105b4d, 0x00105b4d, - 0x00105b4d, 0x00105b4d, 0x00105b58, 0x00105b4d, - 0x00105b58, 0x05d1fe99, 0x591c0416, 0x4803c857, + 0x05020020, 0x90000c8e, 0x0c001002, 0x05d1fe33, + 0x00105bc5, 0x00105bd0, 0x00105bc6, 0x00105bd0, + 0x00105bcc, 0x00105bc5, 0x00105bc5, 0x00105bd0, + 0x00105bd0, 0x00105bc5, 0x00105bc5, 0x00105bc5, + 0x00105bc5, 0x00105bc5, 0x00105bd0, 0x00105bc5, + 0x00105bd0, 0x05d1fe21, 0x591c0416, 0x4803c857, 0x8c000518, 0x05000003, 0x8c000512, 0x05000003, 0x80001580, 0x0501f003, 0x42001000, 0x20000000, 0x591c0017, 0x4801a00a, 0x0501f01a, 0x0501f81f, 0x42001000, 0x40000000, 0x41780000, 0x05fdf7fa, - 0x0501f81a, 0x591e5809, 0x812e59c0, 0x05d00e83, + 0x0501f81a, 0x591e5809, 0x812e59c0, 0x05d00e0b, 0x592c1010, 0x591c0013, 0x80080480, 0x4801a00a, 0x591c0203, 0x591c0804, 0x8c04053e, 0x05020005, 0x90000d82, 0x05000006, 0x90000d84, 0x05000004, @@ -5914,7 +5944,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x60080800, 0x600011b8, 0x0501f0ca, 0x4803c856, 0x0501f809, 0x5930041c, 0x900001c0, 0x4801a005, 0x0501f90f, 0x41780800, 0x600010b8, 0x0501f8c1, - 0x05f9f286, 0x4803c856, 0x59300819, 0x90041c06, + 0x05f9f29a, 0x4803c856, 0x59300819, 0x90041c06, 0x64874800, 0x58040405, 0x82000500, 0x0000f000, 0x82000580, 0x00003000, 0x05000002, 0x65074800, 0x81a5a000, 0x580c0001, 0x82000d00, 0x00ffffff, @@ -5927,12 +5957,12 @@ static const uint32_t isp_2500_risc_code[] = { 0x5930001e, 0x800001c0, 0x05000006, 0x4a01a006, 0x01000000, 0x640da407, 0x60080800, 0x0501f021, 0x4a01a006, 0x02000000, 0x41780800, 0x916c0584, - 0x05020003, 0x84040d42, 0x0501f00c, 0x05f1fcc7, + 0x05020003, 0x84040d42, 0x0501f00c, 0x05f1fc85, 0x05020003, 0x84040d4a, 0x0501f002, 0x84040d48, 0x59a8021b, 0x8c000506, 0x05020003, 0x8c00050a, 0x05000002, 0x84040d46, 0x4805a207, 0x59c40085, 0x48031004, 0x4c580000, 0x4c500000, 0x4c540000, - 0x6018b000, 0x9188a400, 0x90d0ac08, 0x0515fd34, + 0x6018b000, 0x9188a400, 0x90d0ac08, 0x0515fd86, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x60200800, 0x600011b8, 0x0501f06f, 0x05fdfd9a, 0x4a01a006, 0x56000000, 0x59340006, 0x4801a007, 0x59340007, @@ -5941,15 +5971,15 @@ static const uint32_t isp_2500_risc_code[] = { 0x0500000b, 0x82040580, 0x0000ffff, 0x05000003, 0x90040487, 0x05021006, 0x4a01a006, 0x01000000, 0x640da407, 0x60080800, 0x0501f010, 0x4a01a006, - 0x0200001c, 0x6405a007, 0x42001000, 0x0010945c, + 0x0200001c, 0x6405a007, 0x42001000, 0x001094dc, 0x50080000, 0x9c0001c0, 0x4801a009, 0x59a8000f, 0x4801a00a, 0x59a80002, 0x59a80803, 0x4801a00b, 0x4805a00c, 0x601c0800, 0x600011b8, 0x0501f045, 0x4d2c0000, 0x05fdfd6f, 0x59325809, 0x592c0009, 0x82000500, 0x00ffffff, 0x4801a001, 0x4a01a006, - 0x51000000, 0x5c025800, 0x05fdf400, 0x4803c856, + 0x51000000, 0x5c025800, 0x05fdf40b, 0x4803c856, 0x59325809, 0x5932680a, 0x59300407, 0x4803c857, - 0x90000d8a, 0x05000002, 0x05d1fd78, 0x42005000, + 0x90000d8a, 0x05000002, 0x05d1fd00, 0x42005000, 0x02000000, 0x42006000, 0x20290000, 0x41786800, 0x41787800, 0x0501f805, 0x91180d78, 0x60801193, 0x0501f856, 0x1c01f000, 0x6001a000, 0x0501f002, @@ -5965,40 +5995,40 @@ static const uint32_t isp_2500_risc_code[] = { 0x4807c857, 0x4c040000, 0x0501f83d, 0x5c000800, 0x40040000, 0x80081540, 0x800000c4, 0x82000540, 0x00002000, 0x4803910a, 0x59b400f6, 0x90000518, - 0x05fe07fe, 0x42001800, 0x00109475, 0x580c0004, + 0x05fe07fe, 0x42001800, 0x001094f5, 0x580c0004, 0x4803c857, 0x580c0006, 0x4803c857, 0x580c1800, 0x480fc857, 0x8d0c052a, 0x0500000c, 0x820c1d00, 0xf8000000, 0x05000009, 0x4c040000, 0x4c080000, - 0x40083800, 0x42000000, 0x00109475, 0x05d1fe34, - 0x5c001000, 0x5c000800, 0x4a0368f0, 0x00109474, - 0x4a0368f1, 0x0010947b, 0x480b68f3, 0x59b400f6, + 0x40083800, 0x42000000, 0x001094f5, 0x05d1fdbc, + 0x5c001000, 0x5c000800, 0x4a0368f0, 0x001094f4, + 0x4a0368f1, 0x001094fb, 0x480b68f3, 0x59b400f6, 0x90000538, 0x05fe07fe, 0x4203e000, 0xb0800000, - 0x600bf800, 0x05f9f199, 0x4807c857, 0x480a2800, + 0x600bf800, 0x05f9f1ad, 0x4807c857, 0x480a2800, 0x4c040000, 0x0501f80e, 0x5c000800, 0x59b400f6, 0x8c00050a, 0x05fe07fe, 0x49a768f2, 0x480768f4, 0x59b400f6, 0x90000538, 0x05fe07fe, 0x4203e000, 0xb0800000, 0x600bf800, 0x1c01f000, 0x61a07007, 0x4203e000, 0xb0800000, 0x600ff800, 0x40000000, 0x40000000, 0x40000000, 0x0501b004, 0x80387040, - 0x05d00cfe, 0x05fdf7f9, 0x1c01f000, 0x82000500, + 0x05d00c86, 0x05fdf7f9, 0x1c01f000, 0x82000500, 0xffff0000, 0x82000580, 0x01050000, 0x0502000b, 0x599c0818, 0x8c040510, 0x05000008, 0x59a80806, 0x8c04050a, 0x05000005, 0x613c1100, 0x41781800, - 0x41782000, 0x05e9f8bf, 0x1c01f000, 0x1c01f000, + 0x41782000, 0x05e9f84b, 0x1c01f000, 0x1c01f000, 0x59a80063, 0x800001c0, 0x05000045, 0x4d2c0000, 0x4d300000, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x40025800, 0x4000c000, 0x4000c800, 0x42026000, - 0x0010cc38, 0x592c0407, 0x81440580, 0x0502002d, + 0x0010cc48, 0x592c0407, 0x81440580, 0x0502002d, 0x592c0205, 0xb0000595, 0x05000005, 0x8d3c0518, 0x05000028, 0x8d3c0516, 0x05020026, 0x40640000, 0x812c0580, 0x05020016, 0x59300203, 0x90000580, 0x0500000f, 0x59300009, 0x800001c0, 0x0500000c, - 0x05f9fc17, 0x4df00000, 0x05f9fb29, 0x0201f800, - 0x0010b998, 0x80c40040, 0x05020002, 0x64026203, - 0x5c03e000, 0x05f80bfa, 0x497a6009, 0x592cc800, + 0x05f9fc2b, 0x4df00000, 0x05f9fb3d, 0x0201f800, + 0x0010b9a8, 0x80c40040, 0x05020002, 0x64026203, + 0x5c03e000, 0x05f80c0e, 0x497a6009, 0x592cc800, 0x4064c000, 0x4064b800, 0x0501f003, 0x592cb800, 0x485cc000, 0x497a5800, 0x592c0205, 0x82000580, - 0x00000155, 0x05000003, 0x05d5f846, 0x0501f003, + 0x00000155, 0x05000003, 0x05d1ffce, 0x0501f003, 0x49425a07, 0x0001fb2c, 0x405e5800, 0x0501f003, 0x412cc000, 0x592e5800, 0x812e59c0, 0x05fe07ce, 0x48675063, 0x48635064, 0x5c00c800, 0x5c00c000, @@ -6010,116 +6040,117 @@ static const uint32_t isp_2500_risc_code[] = { 0x05000004, 0x61c2880f, 0x6040b000, 0x05fdf7f3, 0x5c00b000, 0x5c026800, 0x5c028800, 0x1c01f000, 0x4d300000, 0x59a81063, 0x800811c0, 0x05000016, - 0x42026000, 0x0010cc38, 0x59300203, 0x90000580, + 0x42026000, 0x0010cc48, 0x59300203, 0x90000580, 0x05020011, 0x58080803, 0x4806600a, 0x480a6009, 0x64166407, 0x64066203, 0x4a026403, 0x00000092, 0x41780800, 0x58080205, 0xb0000595, 0x05000002, 0x60040800, 0x48066422, 0x42000800, 0x80000040, 0x0005f87c, 0x5c026000, 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, - 0x4d180000, 0x4803c856, 0x417a3000, 0x05fdf88c, + 0x4d180000, 0x4803c856, 0x417a3000, 0x05fdf8a0, 0x59900805, 0x800409c0, 0x05000012, 0x91947c09, - 0x83180400, 0x00104d38, 0x50000000, 0x803c7c00, + 0x83180400, 0x00104dc4, 0x50000000, 0x803c7c00, 0x583c0003, 0x811808ca, 0x82040c00, 0x00006139, 0x50040800, 0x80040580, 0x05000006, 0x42000000, - 0x0010985c, 0x0515fb04, 0x90000541, 0x0501f004, + 0x001098dc, 0x0515fb56, 0x90000541, 0x0501f004, 0x811a3000, 0x91180585, 0x05fe07e9, 0x5c023000, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, 0x4d180000, 0x4803c856, 0x598c080b, 0x800409c0, 0x05000002, - 0x05f9f8be, 0x417a3000, 0x05fdf861, 0x59900805, + 0x05f9f8d2, 0x417a3000, 0x05fdf875, 0x59900805, 0x800409c0, 0x0500000f, 0x91947c09, 0x83180400, - 0x00104d38, 0x50000000, 0x803c7c00, 0x811808ca, + 0x00104dc4, 0x50000000, 0x803c7c00, 0x811808ca, 0x82040c00, 0x00006139, 0x50040800, 0x48047803, 0x4a007801, 0x000001f4, 0x64287800, 0x64107802, 0x811a3000, 0x91180585, 0x05fe07ec, 0x5c023000, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, 0x41781000, 0x42026000, - 0x0010cca4, 0x59a8180d, 0x480a6402, 0x4a026202, + 0x0010ccb4, 0x59a8180d, 0x480a6402, 0x4a026202, 0x0000ffff, 0x80081000, 0x800c1840, 0x05000003, 0x91326424, 0x05fdf7f9, 0x1c01f000, 0x0005f8e7, 0x1c01f000, 0x5c036000, 0x4db00000, 0x49b3c857, - 0x4933c857, 0x813261c0, 0x05000029, 0x59300203, - 0x90000580, 0x05000026, 0x59300407, 0x4803c857, + 0x4933c857, 0x813261c0, 0x0500002d, 0x59300203, + 0x90000580, 0x0500002a, 0x59300407, 0x4803c857, 0x90000d84, 0x0500000c, 0x90000d81, 0x0500000a, - 0x90000d83, 0x05000004, 0x90000d86, 0x05020012, - 0x0511fee9, 0x5930001e, 0x800001c0, 0x050e09d1, - 0x0501f00d, 0x59300820, 0x4807c857, 0x4d300000, - 0x40066000, 0x050dfa69, 0x5c026000, 0x05020006, + 0x90000d83, 0x05000004, 0x90000d86, 0x05020016, + 0x0511ff29, 0x5930001e, 0x800001c0, 0x050e09ef, + 0x0501f011, 0x5930000a, 0x82000580, 0x0010993e, + 0x0500000d, 0x59300820, 0x4807c857, 0x4d300000, + 0x40066000, 0x050dfa83, 0x5c026000, 0x05020006, 0x5804001e, 0x4803c857, 0x81300580, 0x05020002, 0x4978081e, 0x641e6407, 0x497a6009, 0x4a026004, 0x00004000, 0x59a8002a, 0xb0000c91, 0x05001002, 0x80000102, 0x48026006, 0x497a6205, 0x1c01f000, 0x0501f803, 0x41318800, 0x1c01f000, 0x91640490, - 0x05021007, 0x42000000, 0x001097eb, 0x0515fa8a, + 0x05021007, 0x42000000, 0x0010986b, 0x0515fad8, 0x4967c857, 0x80026580, 0x1c01f000, 0x8166c9c0, 0x05000018, 0x41626000, 0x41580000, 0x59300a03, 0x90040d80, 0x05000007, 0x91326424, 0x81300c80, - 0x05fc17fb, 0x42026000, 0x0010cca4, 0x05fdf7f8, + 0x05fc17fb, 0x42026000, 0x0010ccb4, 0x05fdf7f8, 0x4933c857, 0x8166c840, 0x91300c24, 0x80040480, 0x05021005, 0x4006c000, 0x64226203, 0x813261c0, - 0x1c01f000, 0x4202c000, 0x0010cca4, 0x05fdf7fb, - 0x42000000, 0x001097eb, 0x0515fa6b, 0x4933c856, + 0x1c01f000, 0x4202c000, 0x0010ccb4, 0x05fdf7fb, + 0x42000000, 0x0010986b, 0x0515fab9, 0x4933c856, 0x417a6000, 0x05fdf7f6, 0x0005f905, 0x1c01f000, 0x4933c857, 0x91380593, 0x05020008, 0x59300004, - 0x8c00053e, 0x05000004, 0x05f9fafd, 0x05f9fa66, - 0x05f9fae7, 0x1c01f000, 0x4933c857, 0x598800b7, + 0x8c00053e, 0x05000004, 0x05f9fb0d, 0x05f9fa76, + 0x05f9faf7, 0x1c01f000, 0x4933c857, 0x598800b7, 0x80000000, 0x480310b7, 0x1c01f000, 0x4933c857, - 0x59300203, 0x9000348e, 0x05d21ba4, 0x4d2c0000, - 0x0c01f803, 0x5c025800, 0x1c01f000, 0x00105e55, - 0x001062f7, 0x00106415, 0x00105e55, 0x00106457, - 0x00105f88, 0x00105e55, 0x00105e55, 0x0010628a, - 0x00105e55, 0x00105e55, 0x00105e55, 0x00105e55, - 0x00105e55, 0x05d1fb91, 0x4933c857, 0x59300203, - 0x9000348e, 0x05d21b8d, 0x0c01f001, 0x00105e69, - 0x00106c3c, 0x00105e69, 0x00105e69, 0x00105e69, - 0x00105e69, 0x00105e69, 0x00105e69, 0x00106be5, - 0x00106c50, 0x00106cac, 0x00106c50, 0x00106cac, - 0x00105e69, 0x05d1fb7d, 0x05d1fb7c, 0x4933c857, + 0x59300203, 0x9000348e, 0x05d21b28, 0x4d2c0000, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x00105ed1, + 0x00106375, 0x00106493, 0x00105ed1, 0x001064de, + 0x00106006, 0x00105ed1, 0x00105ed1, 0x00106308, + 0x00105ed1, 0x00105ed1, 0x00105ed1, 0x00105ed1, + 0x00105ed1, 0x05d1fb15, 0x4933c857, 0x59300203, + 0x9000348e, 0x05d21b11, 0x0c01f001, 0x00105ee5, + 0x00106cc6, 0x00105ee5, 0x00105ee5, 0x00105ee5, + 0x00105ee5, 0x00105ee5, 0x00105ee5, 0x00106c6f, + 0x00106ce3, 0x00106d3f, 0x00106ce3, 0x00106d3f, + 0x00105ee5, 0x05d1fb01, 0x05d1fb00, 0x4933c857, 0x4d2c0000, 0x59325809, 0x59300203, 0x9000348e, - 0x05d21b76, 0x0c01f803, 0x5c025800, 0x1c01f000, - 0x00105e82, 0x00105e82, 0x00105e82, 0x00105e97, - 0x00105ecc, 0x00105e82, 0x00105e82, 0x00105e82, - 0x00105e83, 0x00105e82, 0x00105e82, 0x00105e82, - 0x00105e82, 0x00105e82, 0x05d1fb64, 0x4933c857, - 0xb1380580, 0x05d20b61, 0x4a026008, 0x00082000, + 0x05d21afa, 0x0c01f803, 0x5c025800, 0x1c01f000, + 0x00105efe, 0x00105efe, 0x00105efe, 0x00105f13, + 0x00105f48, 0x00105efe, 0x00105efe, 0x00105efe, + 0x00105eff, 0x00105efe, 0x00105efe, 0x00105efe, + 0x00105efe, 0x00105efe, 0x05d1fae8, 0x4933c857, + 0xb1380580, 0x05d20ae5, 0x4a026008, 0x00082000, 0x640e6203, 0x493a6403, 0x64065c09, 0x592c000e, 0x48026013, 0x497a6015, 0x592c0209, 0x800000c2, 0x800010c4, 0x80081400, 0x480a6006, 0x0001f966, 0x42000800, 0x80000060, 0x0005f072, 0x4933c857, - 0xb1380490, 0x05d21b4d, 0xb1380489, 0x05d01b4b, - 0x0c01f001, 0x00105ea5, 0x00105eae, 0x00105ea4, - 0x00105ea4, 0x00105ea4, 0x00105ea4, 0x00105eb4, - 0x05d1fb42, 0x64126203, 0x640a5c09, 0x592c0208, + 0xb1380490, 0x05d21ad1, 0xb1380489, 0x05d01acf, + 0x0c01f001, 0x00105f21, 0x00105f2a, 0x00105f20, + 0x00105f20, 0x00105f20, 0x00105f20, 0x00105f30, + 0x05d1fac6, 0x64126203, 0x640a5c09, 0x592c0208, 0x48025c0a, 0x592c020a, 0x48025a08, 0x592c000d, - 0x4802580e, 0x1c01f000, 0x05f9f9d2, 0x0509fa35, + 0x4802580e, 0x1c01f000, 0x05f9f9e2, 0x0509fa4f, 0x05000003, 0x641a5a07, 0x0001fb2c, 0x0005f0e7, - 0x05f9f9cc, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010b652, 0x5c027800, 0x60503000, 0x41782800, + 0x05f9f9dc, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010b660, 0x5c027800, 0x60503000, 0x41782800, 0x60082000, 0x4d400000, 0x4d440000, 0x59368c03, - 0x60a68000, 0x050df90c, 0x5c028800, 0x5c028000, - 0x42000000, 0x001097f8, 0x0515f9cf, 0x0509fa1d, + 0x60a68000, 0x050df926, 0x5c028800, 0x5c028000, + 0x42000000, 0x00109878, 0x0515fa1d, 0x0509fa37, 0x000400e7, 0x64a65a07, 0x0001fb2c, 0x0005f0e7, 0x4933c857, 0xb1380588, 0x05000003, 0xb1380593, - 0x05d20b16, 0x592c0207, 0x90000587, 0x05000008, + 0x05d20a9a, 0x592c0207, 0x90000587, 0x05000008, 0x59300013, 0x80000540, 0x05000005, 0x592c080d, 0x80040480, 0x4802580d, 0x64565a07, 0x592c0207, 0x80000540, 0x05020002, 0x64025a07, 0x0001fb2c, 0x0005f0e7, 0x4933c857, 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x4c100000, 0x05d1fe7e, 0x05d00afb, + 0x4c640000, 0x4c100000, 0x05d1fe02, 0x05d00a7f, 0x497a5a07, 0x59a80085, 0x82000500, 0x0000f000, 0x48025c08, 0x59a80873, 0x90040c18, 0x48065a08, 0x412cb800, 0x4d2c0000, 0x41cca000, 0x6004c000, 0x60b0c800, 0x900404ad, 0x05021004, 0x912cac0a, - 0x0505fe5a, 0x0501f023, 0x40043000, 0x60b00800, - 0x912cac0a, 0x0505fe55, 0x901834ac, 0x4c180000, - 0x05d1fe64, 0x5c003000, 0x05000012, 0x8060c000, + 0x0505fe71, 0x0501f023, 0x40043000, 0x60b00800, + 0x912cac0a, 0x0505fe6c, 0x901834ac, 0x4c180000, + 0x05d1fde8, 0x5c003000, 0x05000012, 0x8060c000, 0x4a025805, 0x00000110, 0x492cb801, 0x90180cbd, - 0x05021005, 0x40180800, 0x912cac06, 0x0505fe47, + 0x05021005, 0x40180800, 0x912cac06, 0x0505fe5e, 0x0501f010, 0x9064cc3c, 0x901834bc, 0x60f00800, - 0x412cb800, 0x912cac06, 0x0505fe40, 0x05fdf7ec, + 0x412cb800, 0x912cac06, 0x0505fe57, 0x05fdf7ec, 0x5c025800, 0x592c0207, 0x8400055e, 0x48025a07, 0x592c0408, 0x80640540, 0x48025c08, 0x0501f002, 0x5c025800, 0x5c002000, 0x813669c0, 0x05000003, @@ -6129,2323 +6160,2338 @@ static const uint32_t isp_2500_risc_code[] = { 0xffffffff, 0x0500000a, 0x591c0009, 0x80000d40, 0x05000007, 0x58040205, 0x82000500, 0x000000ff, 0x90000592, 0x05020002, 0x58041006, 0x480a5806, - 0x846001c0, 0x80100540, 0x48025805, 0x592c0001, - 0x497a5801, 0x4c000000, 0x0001fb2c, 0x5c025800, - 0x812e59c0, 0x05fe07fa, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x5c00b000, 0x5c00a800, 0x5c00a000, - 0x5c025800, 0x1c01f000, 0x0511ff05, 0x05fdf7f7, - 0x4803c856, 0x4c5c0000, 0x4d2c0000, 0x4c500000, - 0x4c540000, 0x4c580000, 0x412cb800, 0x592c040c, - 0x8c000516, 0x05000003, 0x41cca000, 0x0501f002, - 0x91cca406, 0x4008b000, 0x41781000, 0xb058048c, - 0x05001003, 0x6130b000, 0x40001000, 0x4c080000, - 0x4d2c0000, 0x05d1fe03, 0x0500001f, 0x5c001800, - 0x492c1801, 0x485a5800, 0x9058b403, 0x8058b104, - 0x912cac02, 0x0515fa2d, 0x585c040c, 0x8c000500, - 0x0500000b, 0x912c1402, 0x8c000516, 0x05000002, - 0x90081406, 0x64041000, 0x80081000, 0x46001000, - 0x00000900, 0x84000500, 0x4800bc0c, 0x5c001000, - 0x800811c0, 0x05fe07e0, 0x90000541, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x5c025800, 0x5c00b800, - 0x1c01f000, 0x5c025800, 0x5c001000, 0x05fdf7f8, - 0x4933c857, 0x91380d95, 0x05020002, 0x0005f0e7, - 0x91380d96, 0x05d20a59, 0x0005f0e7, 0x4933c857, + 0x846001c0, 0x80100540, 0x48025805, 0x0515facf, + 0x05020010, 0x592c0001, 0x497a5801, 0x4c000000, + 0x0001fb2c, 0x5c025800, 0x812e59c0, 0x05fe07f8, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, + 0x0511ff51, 0x05fdf7f7, 0x4803c856, 0x4c5c0000, 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, - 0x59325809, 0x91cca406, 0x59cc1806, 0x820c0580, - 0x01000000, 0x05020003, 0x6008b000, 0x0501f00a, - 0x6020b000, 0x912cac06, 0x0515f9c1, 0x8c0c0500, - 0x05000007, 0x6020b000, 0x592e5801, 0x812e59c0, - 0x05d00a42, 0x912cac06, 0x0515f9b9, 0x0501f812, - 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x4c500000, 0x4c540000, - 0x4c580000, 0x91cca406, 0x5930a809, 0x9054ac06, - 0x601cb000, 0x0515f9aa, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x4933c857, 0x0509f92a, 0x000400e7, - 0x4d2c0000, 0x0509fdd9, 0x05020008, 0x41780800, - 0x4d400000, 0x60028000, 0x0509fcb3, 0x5c028000, - 0x5c025800, 0x0005f0e7, 0x5931d823, 0x58ef400a, - 0x58ee580c, 0x4a025a05, 0x00000103, 0x58ec0008, - 0x0801f800, 0x5c025800, 0x0005f0e7, 0x4933c857, - 0x59cc1806, 0x820c0580, 0x02000000, 0x05020019, - 0x4a026802, 0x00fffffd, 0x5934000a, 0x84000504, - 0x4802680a, 0x59300c1f, 0x900405a1, 0x05020005, - 0x61fc19ff, 0x60102000, 0x60483000, 0x05e5fe4b, - 0x59300809, 0x800409c0, 0x000400e7, 0x4a000a05, - 0x00000103, 0x480c0806, 0x5931d823, 0x58ef400a, - 0x58ee580c, 0x58ec0008, 0x0801f800, 0x0005f0e7, - 0x42000000, 0x00109801, 0x0515f8a7, 0x4c0c0000, - 0x0501f804, 0x5c001800, 0x05fe07ee, 0x1c01f000, - 0x4933c857, 0x4d2c0000, 0x59325809, 0x812e59c0, - 0x05020008, 0x497a6006, 0x497a6205, 0x4d380000, - 0x608a7000, 0x0501faf6, 0x5c027000, 0x80000580, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, - 0x4c500000, 0x4c540000, 0x4c580000, 0x59325809, - 0x592e5801, 0x912cac06, 0x91cca406, 0x59a80885, - 0x82040d00, 0x000003ff, 0x9004148f, 0x05001011, - 0x603cb000, 0x0515f94e, 0x592e5801, 0x912cac06, - 0x90080c8f, 0x05001008, 0x603cb000, 0x0515f948, - 0x592e5801, 0x912cac06, 0x9004148f, 0x05001005, - 0x603c1000, 0x4008b000, 0x0515f941, 0x0501f003, - 0x4004b000, 0x0515f93e, 0x5931d823, 0x58ef400a, - 0x58ee580c, 0x4a025a05, 0x00000103, 0x592e5801, - 0x58ec0008, 0x0801f800, 0x0005f8e7, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, + 0x412cb800, 0x592c040c, 0x8c000516, 0x05000003, + 0x41cca000, 0x0501f002, 0x91cca406, 0x4008b000, + 0x41781000, 0xb058048c, 0x05001003, 0x6130b000, + 0x40001000, 0x4c080000, 0x4d2c0000, 0x05d1fd85, + 0x0500001f, 0x5c001800, 0x492c1801, 0x485a5800, + 0x9058b403, 0x8058b104, 0x912cac02, 0x0515fa79, + 0x585c040c, 0x8c000500, 0x0500000b, 0x912c1402, + 0x8c000516, 0x05000002, 0x90081406, 0x64041000, + 0x80081000, 0x46001000, 0x00000900, 0x84000500, + 0x4800bc0c, 0x5c001000, 0x800811c0, 0x05fe07e0, + 0x90000541, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x5c00b800, 0x1c01f000, 0x5c025800, + 0x5c001000, 0x05fdf7f8, 0x4933c857, 0x91380d95, + 0x05020002, 0x0005f0e7, 0x91380d96, 0x05d209db, + 0x0005f0e7, 0x4933c857, 0x4d2c0000, 0x4c500000, + 0x4c540000, 0x4c580000, 0x59325809, 0x91cca406, + 0x59cc1806, 0x820c0580, 0x01000000, 0x05020003, + 0x6008b000, 0x0501f00a, 0x6020b000, 0x912cac06, + 0x0515fa0d, 0x8c0c0500, 0x05000007, 0x6020b000, + 0x592e5801, 0x812e59c0, 0x05d009c4, 0x912cac06, + 0x0515fa05, 0x0501f812, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x4c500000, 0x4c540000, 0x4c580000, 0x91cca406, + 0x5930a809, 0x9054ac06, 0x601cb000, 0x0515f9f6, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x4933c857, + 0x0509f942, 0x000400e7, 0x4d2c0000, 0x0509fdf1, + 0x05020008, 0x41780800, 0x4d400000, 0x60028000, + 0x0509fccb, 0x5c028000, 0x5c025800, 0x0005f0e7, + 0x5931d823, 0x58ef400a, 0x58ee580c, 0x4a025a05, + 0x00000103, 0x58ec0008, 0x0801f800, 0x5c025800, + 0x0005f0e7, 0x4933c857, 0x59cc1806, 0x820c0580, + 0x02000000, 0x05020019, 0x4a026802, 0x00fffffd, + 0x5934000a, 0x84000504, 0x4802680a, 0x59300c1f, + 0x900405a1, 0x05020005, 0x61fc19ff, 0x60102000, + 0x60483000, 0x05e5fdd1, 0x59300809, 0x800409c0, + 0x000400e7, 0x4a000a05, 0x00000103, 0x480c0806, + 0x5931d823, 0x58ef400a, 0x58ee580c, 0x58ec0008, + 0x0801f800, 0x0005f0e7, 0x42000000, 0x00109881, + 0x0515f8f3, 0x4c0c0000, 0x0501f804, 0x5c001800, + 0x05fe07ee, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x59325809, 0x812e59c0, 0x05020008, 0x497a6006, + 0x497a6205, 0x4d380000, 0x608a7000, 0x0501faf6, + 0x5c027000, 0x80000580, 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c500000, 0x4c540000, - 0x4c580000, 0x59cc0006, 0x82000d80, 0x01000000, - 0x05000021, 0x59cc0007, 0x9000b1c0, 0x8258b500, - 0x000000ff, 0x8058b104, 0x9058b402, 0x90580c87, - 0x05001002, 0x6018b000, 0x91cca406, 0x59301009, - 0x800811c0, 0x05d009a1, 0x9008ac06, 0x0515f918, - 0x82000d00, 0xff000000, 0x800409c0, 0x05000014, - 0x8200b500, 0x000000ff, 0x05000011, 0x8058b104, - 0x90580c8e, 0x05001002, 0x6034b000, 0x58081001, - 0x800811c0, 0x05d00991, 0x9008ac06, 0x0515f908, - 0x0501f007, 0x59301009, 0x800811c0, 0x05d0098b, - 0x48001006, 0x59cc0007, 0x48001007, 0x05fdff5a, - 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c500000, - 0x4c540000, 0x4c580000, 0x6008b000, 0x59cc0806, - 0x82040580, 0x01000000, 0x05000004, 0x8204b500, - 0x0000ffff, 0x8058b104, 0x91cca406, 0x59300009, - 0x9000ac06, 0x0515f8ea, 0x05fdff43, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x4803c857, 0x4807c857, 0x480bc857, - 0x480fc857, 0x4813c857, 0x481bc857, 0x492fc857, - 0x4d2c0000, 0x4c000000, 0x05d1fccf, 0x5c000000, - 0x0500000d, 0x48025803, 0x481a5801, 0x48125808, - 0x48065805, 0x480a5806, 0x480e5807, 0x5c001000, - 0x4c080000, 0x480a5809, 0x412c1000, 0x0001f81c, - 0x90000541, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x4937c857, 0x4d1c0000, 0x05f5fc75, 0x05020020, - 0x59cc0001, 0x82000500, 0x00ffffff, 0x59341002, - 0x82081500, 0x00ffffff, 0x80080580, 0x05020018, - 0x497a6205, 0x60d40800, 0x0509fb64, 0x0502000f, - 0x591c001e, 0x800001c0, 0x0500000c, 0x497a381e, - 0x591c0416, 0x8c000502, 0x05d00938, 0x84000502, - 0x48023c16, 0x591c1407, 0x90080583, 0x05000005, - 0x90080586, 0x05000005, 0x05fdfd1f, 0x0501f004, - 0x0501f805, 0x0501f002, 0x0501f8b2, 0x5c023800, - 0x1c01f000, 0x4d2c0000, 0x591e5809, 0x4933c857, - 0x491fc857, 0x493bc857, 0x492fc857, 0x91380595, - 0x050000a6, 0x91380596, 0x050200a2, 0x4d300000, - 0x411e6000, 0x59cc0207, 0x4803c857, 0x82000d00, - 0x0000ff00, 0x82040580, 0x00001700, 0x05000004, - 0x82040580, 0x00000300, 0x05020055, 0x591c0203, - 0x4803c857, 0x9000058d, 0x0500003a, 0x812e59c0, - 0x0500008f, 0x591c0202, 0x4803c857, 0x82000580, - 0x0000ffff, 0x05020079, 0x592c020b, 0x4803c857, - 0x90000503, 0x90000582, 0x05020007, 0x592c0810, - 0x591c0013, 0x4803c857, 0x4807c857, 0x80040580, - 0x0502006e, 0x591c0416, 0x4803c857, 0x8c000500, - 0x0502006a, 0x42000000, 0x001097de, 0x0511ffa6, - 0x41780800, 0x591c1006, 0x60280000, 0x05f5fe8d, - 0x592c0407, 0x4803c857, 0x800001c0, 0x0500000b, - 0x80080c80, 0x05001003, 0x05d208ec, 0x80001040, - 0x480a5c07, 0x800811c0, 0x05020004, 0x0201f800, - 0x0010c00d, 0x0501f063, 0x0509f8b2, 0x591c0819, - 0x591c001a, 0x48065809, 0x4802580a, 0x59300008, - 0x8c000500, 0x05d60a08, 0x497a3809, 0x0001fa84, - 0x0502004a, 0x411e6000, 0x05fdfcc7, 0x0501f055, - 0x05fdfcf7, 0x05000013, 0x591c0006, 0x48026006, - 0x4936600a, 0x640e6407, 0x492e6009, 0x591c0819, - 0x591c101a, 0x48066019, 0x480a601a, 0x4d380000, - 0x591e7403, 0x4d300000, 0x411e6000, 0x05fdfcb6, - 0x5c026000, 0x0005f905, 0x5c027000, 0x0501f041, - 0x59a8002c, 0x48023a05, 0x0501f03e, 0x59cc0407, - 0x9000058b, 0x05020026, 0x59340a00, 0x84040d0e, - 0x48066a00, 0x592c0a05, 0x82040d00, 0x000000ff, - 0x90040d94, 0x05000002, 0x640e621f, 0x59300008, - 0x8c000500, 0x05d609dc, 0x4d400000, 0x497a5c0a, - 0x600e8000, 0x592c0a09, 0x05edfe06, 0x0515f873, - 0x05020006, 0x0001fb2c, 0x59300a1f, 0x90040d83, - 0x05080874, 0x497a6009, 0x5c028000, 0x4a026403, - 0x00000085, 0x64266203, 0x640a6407, 0x42000800, - 0x80004040, 0x0509ff01, 0x0005f87c, 0x4203e000, - 0xb0800000, 0x6023f800, 0x0501f016, 0x59cc0207, - 0x82000580, 0x00002a00, 0x05020004, 0x59a8002c, - 0x48023a05, 0x0501f00f, 0x812e59c0, 0x05d0088f, - 0x4a025a05, 0x00000103, 0x591c0008, 0x8c000500, - 0x05d609b5, 0x591c0402, 0x48025c07, 0x640e5a07, - 0x497a5c0a, 0x0001fb2c, 0x05fdfc73, 0x05edfa87, - 0x5c026000, 0x0005f8e7, 0x0501f002, 0x5c026000, - 0x5c025800, 0x1c01f000, 0x0501f813, 0x05fdf7fd, - 0x4933c857, 0x91380595, 0x05020004, 0x59a8002c, - 0x48023a05, 0x0501f009, 0x91380596, 0x05020009, - 0x4d300000, 0x411e6000, 0x0511fb5b, 0x0005f853, - 0x0005f8e7, 0x5c026000, 0x497a381e, 0x0005f8e7, - 0x1c01f000, 0x4c5c0000, 0x591c0416, 0x84000540, - 0x48023c16, 0x59ccb80b, 0x4933c857, 0x491fc857, - 0x492fc857, 0x4803c857, 0x485fc857, 0x8c5c053c, - 0x05000005, 0x59a8002c, 0x48023a05, 0x497a381e, - 0x0501f049, 0x4d300000, 0x411e6000, 0x0505fc18, - 0x5c026000, 0x591c0407, 0x90000580, 0x05000042, - 0x591c0403, 0xb0000590, 0x0502000a, 0x4d300000, - 0x411e6000, 0x64066203, 0x42000800, 0x80000043, - 0x0005f87c, 0x5c026000, 0x497a381e, 0x0501f036, - 0x591c0203, 0x9000058d, 0x0500001c, 0x812e59c0, - 0x05d00842, 0x592c020b, 0x4803c857, 0x8c000500, - 0x0502001b, 0x8c000502, 0x05000014, 0x591c0416, - 0x8c00051c, 0x05020007, 0x591c0013, 0x4803c857, - 0x800001c0, 0x0500000d, 0x591c0014, 0x48023818, - 0x4a023814, 0x0fffffff, 0x592c0209, 0x8400051e, - 0x48025a09, 0x42000000, 0x001097e0, 0x0511feda, - 0x64063a16, 0x0501f016, 0x42000000, 0x001097e1, - 0x0511fed5, 0x641e3a16, 0x0501f011, 0x8c5c053a, - 0x05fe07fa, 0x59cc000a, 0x592c1810, 0x4803c857, - 0x480fc857, 0x800c0580, 0x05fc07f4, 0x59cc000a, - 0x4803c857, 0x48023818, 0x48023817, 0x42000000, - 0x001097df, 0x0511fec4, 0x64163a16, 0x5c00b800, - 0x0509f105, 0x5c00b800, 0x0005f0e7, 0x4933c857, - 0x4d1c0000, 0x05f5fb36, 0x0502003f, 0x59cc0001, - 0x59341002, 0x80080580, 0x82000500, 0x00ffffff, - 0x05020037, 0x5930141b, 0x0509fa70, 0x05d00803, - 0x591c1407, 0x90080587, 0x05000031, 0x90080582, - 0x0500002f, 0x90080580, 0x0500002d, 0x591c0202, - 0x82000d80, 0x0000ffff, 0x05000004, 0x59301a1b, - 0x800c0580, 0x05020026, 0x91380595, 0x05000022, - 0x4d300000, 0x4d2c0000, 0x411e6000, 0x59325809, - 0x0505feec, 0x05cc0fed, 0x592c0205, 0x82000500, - 0x000000ff, 0x90000594, 0x05000002, 0x640e621f, - 0x497a5c0a, 0x600e8000, 0x592c0a09, 0x05edfd3d, - 0x0511ffaa, 0x05020006, 0x0001fb2c, 0x59300a1f, - 0x90040d83, 0x05040fab, 0x497a6009, 0x5c025800, - 0x4a026403, 0x00000085, 0x64266203, 0x640a6407, - 0x42000800, 0x80004040, 0x0005f87c, 0x5c026000, - 0x0501f003, 0x59a8002c, 0x48023a05, 0x497a381e, - 0x0005f8e7, 0x5c023800, 0x1c01f000, 0x4933c857, - 0x4c580000, 0x4d2c0000, 0x59325809, 0x59342200, - 0x82102500, 0xffffdffd, 0x48126a00, 0x91383595, - 0x05000009, 0x0505febf, 0x05000045, 0x0509fb6f, - 0x05020003, 0x6008b000, 0x0509fb51, 0x0501f9c2, - 0x0501f058, 0x91cc1408, 0x6008b000, 0x91341c06, - 0x0501fd7d, 0x0502000f, 0x91cc140a, 0x6008b000, - 0x91341c08, 0x0501fd78, 0x0502000a, 0x05d9ff5c, - 0x59342200, 0x59cc1007, 0x800811c0, 0x05000003, - 0x480a6801, 0x84102542, 0x48126a00, 0x0501f047, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010b652, - 0x5c027800, 0x42000000, 0x001097f8, 0x0511fe4e, - 0x59340200, 0x84000558, 0x48026a00, 0x4d300000, - 0x05fdfbbb, 0x05cc0f99, 0x4936600a, 0x497a6009, - 0x64066407, 0x64066403, 0x600c3000, 0x0511fca8, - 0x8d0c0520, 0x0500000b, 0x41782800, 0x60043000, - 0x4d400000, 0x60a68000, 0x0511f886, 0x5c028000, - 0x64126407, 0x641e6203, 0x64066422, 0x0501f005, - 0x64066203, 0x602c0800, 0x05e9fea8, 0x05f5fdd5, - 0x5c026000, 0x0505fe7f, 0x0500001e, 0x0509fb2f, - 0x0502001e, 0x0501f984, 0x0501f01a, 0x42000000, - 0x001097fb, 0x0511fe28, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010b652, 0x42000000, 0x001097f8, - 0x0511fe21, 0x59340200, 0x84000558, 0x48026a00, - 0x600c3000, 0x41782800, 0x60142000, 0x4d400000, - 0x4d440000, 0x59368c03, 0x60a68000, 0x0509fd4e, - 0x5c028800, 0x5c028000, 0x5c027800, 0x05d9ff10, - 0x0005f8e7, 0x0501f002, 0x05fdfd33, 0x5c025800, - 0x5c00b000, 0x1c01f000, 0x4933c857, 0x41380000, - 0xb1383498, 0x05ce1f59, 0x0c01f001, 0x001062f3, - 0x001062f0, 0x001062f3, 0x001062f3, 0x001062f3, - 0x001062f3, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062f3, 0x001062ef, - 0x001062f3, 0x001062f3, 0x001062ef, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062ef, 0x001062f3, - 0x001062ef, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062ef, 0x001062f3, 0x001062f3, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062f3, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062f3, 0x001062f3, - 0x001062ef, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062f3, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062f3, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062f3, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062f3, 0x001062ef, 0x001062f3, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062ef, 0x001062ef, - 0x001062ef, 0x001062ef, 0x001062ef, 0x05cdfef7, - 0x64066203, 0x493a6403, 0x05f5f546, 0x4933c857, - 0x64066203, 0x493a6403, 0x05f5f542, 0x59300403, - 0xb0003498, 0x05ce1eed, 0x91383593, 0x05000074, - 0x913835a7, 0x0502003c, 0x4933c857, 0x05f5fd9e, - 0x0511fcc3, 0x0505fec6, 0x05000009, 0x0505fed8, - 0x05000033, 0x59300403, 0x90000da2, 0x0502002d, - 0x05fdfcec, 0x0500002d, 0x0501f02d, 0x05d9fe88, - 0x601c0800, 0x05e9fdfd, 0x0501f8df, 0x4d440000, - 0x59368c03, 0x83440580, 0x000007fe, 0x05020007, - 0x59a8121b, 0x84081540, 0x05edfdc8, 0x05020002, - 0x8408154a, 0x480b521b, 0x60a68000, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010b652, 0x5c027800, - 0x916c0583, 0x0500000b, 0x5932680a, 0x59340008, - 0x800001c0, 0x05020007, 0x59368c03, 0x4933c857, - 0x4937c857, 0x4947c857, 0x05e9fe6a, 0x0501f008, - 0x42000000, 0x001097f8, 0x0511fd67, 0x60543000, - 0x41782800, 0x600c2000, 0x0509fc9b, 0x5c028800, - 0x0509f85a, 0x0005f0e7, 0x1c01f000, 0x0501f8b6, - 0x05fdf7fc, 0x91380594, 0x05000008, 0x4933c857, - 0x05f9f93d, 0x05fe02fd, 0x59300203, 0x90000582, - 0x050000d5, 0x05cdfea5, 0x4933c857, 0x05f5fd5a, - 0x0511fc7f, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010b652, 0x5c027800, 0x60583000, 0x41782800, - 0x4d400000, 0x4d440000, 0x59368c03, 0x60242000, - 0x60a68000, 0x0509fc7c, 0x5c028800, 0x5c028000, - 0x42000000, 0x001097f8, 0x0511fd3f, 0x0505fe70, - 0x0502000b, 0x05d9fe3a, 0x0501f893, 0x59340c03, - 0x82040580, 0x000007fe, 0x05fe07d6, 0x59a80a1b, - 0x84040d40, 0x4807521b, 0x05fdf7d2, 0x0505fe78, - 0x05020003, 0x0501f888, 0x05fdf7ce, 0x59300403, - 0x90000db2, 0x05020003, 0x05ddf89f, 0x05fdf7c9, - 0x90000da2, 0x05000880, 0x05fdf7c6, 0x4933c857, - 0x4803c857, 0x0c01f001, 0x001063d3, 0x001063d3, - 0x001063d3, 0x001063d3, 0x001063d3, 0x001063d3, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063d2, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063d2, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063d2, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063d2, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063d2, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063d2, - 0x001063d5, 0x001063e8, 0x001063d2, 0x001063e8, - 0x001063e8, 0x001063d2, 0x001063d2, 0x001063d2, - 0x001063d2, 0x001063d2, 0x001063e8, 0x001063e8, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063d2, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063d2, - 0x001063e0, 0x001063e8, 0x001063d2, 0x001063db, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063db, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063e8, - 0x001063de, 0x001063d2, 0x001063d2, 0x001063d2, - 0x001063d2, 0x001063e8, 0x001063e8, 0x001063d2, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063e8, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063e8, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063e8, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063e8, - 0x001063d2, 0x001063e8, 0x001063d2, 0x001063d2, - 0x001063d2, 0x001063d2, 0x001063d2, 0x001063d2, - 0x001063d2, 0x001063d2, 0x05cdfe14, 0x640a6203, - 0x0505f667, 0x64166203, 0x59a8002c, 0x48026205, - 0x59a8002a, 0x48026006, 0x1c01f000, 0x59300820, - 0x49780a05, 0x0501f00b, 0x0505ffb0, 0x0005f0e7, - 0x05ddf829, 0x05f5fd52, 0x05000003, 0x05f5fcba, - 0x0005f0e7, 0x05f5fcb8, 0x0005f8e7, 0x05f5f538, - 0x4933c857, 0x640a6203, 0x59a8002a, 0x48026006, - 0x1c01f000, 0x4933c857, 0x0505fcf6, 0x05000025, - 0x4d2c0000, 0x0509f9a5, 0x05020007, 0x4d400000, - 0x60c68000, 0x60100800, 0x0509f87f, 0x5c028000, - 0x0501f01b, 0x59300c07, 0x90040590, 0x05000003, - 0x90040591, 0x05020007, 0x64c65a07, 0x6412580e, - 0x4a02580f, 0x000000ff, 0x0001fb2c, 0x0501f010, - 0x592c0405, 0x8c00051e, 0x0500000d, 0x4a025a05, - 0x00000103, 0x4a025806, 0x01000000, 0x4da00000, - 0x4cec0000, 0x5931d823, 0x58ef400a, 0x58ec0008, - 0x0801f800, 0x5c01d800, 0x5c034000, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x59340400, 0x82000500, - 0x000000ff, 0x9000348c, 0x05ce1dcc, 0x59303403, - 0xb0180d8d, 0x050407c2, 0x90180db3, 0x05040789, - 0x90180da8, 0x050405ee, 0x90180da9, 0x050405f8, - 0xb0180d97, 0x05080485, 0x90180d9f, 0x05fc0386, - 0xb0180d95, 0x05fc0366, 0x90180d80, 0x05fc05f0, - 0x90180da2, 0x05fc03a2, 0x90180db5, 0x05fc0468, - 0x90180db9, 0x05fc05a6, 0x90180dbd, 0x05fc03cf, - 0xb0180d84, 0x05fc03fb, 0xb0180d89, 0x05fc042e, - 0xb0180d83, 0x050800c2, 0x90180d84, 0x05020002, - 0x60040000, 0x91380d95, 0x05000004, 0x91380d96, - 0x05fe01fa, 0x0501f1c5, 0x4c000000, 0x0511fb82, - 0x5c000000, 0x4d2c0000, 0x4d3c0000, 0x0c01f804, - 0x5c027800, 0x5c025800, 0x1c01f000, 0x0010645e, - 0x00106462, 0x0010645e, 0x001064b2, 0x0010645e, - 0x001065a5, 0x00106619, 0x0010645e, 0x0010645e, - 0x001065ef, 0x0010645e, 0x001065fa, 0x4933c857, - 0x497a6008, 0x59300809, 0x58040000, 0x4a000a05, - 0x00000103, 0x0005f0e7, 0x4933c857, 0x40000000, - 0x40000000, 0x1c01f000, 0x4933c857, 0x05e9ff25, - 0x59a80073, 0xb00005b4, 0x0502003c, 0x050dfe0d, - 0x0502000e, 0x0501f83c, 0x0505fc7a, 0x05000009, - 0x0509f92a, 0x05020007, 0x41780800, 0x4d400000, - 0x60028000, 0x0509f804, 0x5c028000, 0x0501f002, - 0x05d9fd1f, 0x0005f0e7, 0x0505fc6e, 0x05000005, - 0x0509f91e, 0x05020003, 0x05fdff73, 0x0005f0e7, - 0x417a7800, 0x0201f800, 0x0010b652, 0x42000000, - 0x001097f8, 0x0511fc14, 0x59340200, 0x84000558, - 0x48026a00, 0x600c3000, 0x0511fa75, 0x4d300000, - 0x05fdf97f, 0x05cc0d5d, 0x4936600a, 0x497a6009, - 0x64066407, 0x64066403, 0x8d0c0520, 0x0500000b, - 0x64126407, 0x641e6203, 0x64066422, 0x60043000, - 0x4d400000, 0x60a68000, 0x41782800, 0x050dfe49, - 0x5c028000, 0x0501f005, 0x602c0800, 0x05e9fc6f, - 0x64066203, 0x05f5fb9b, 0x5c026000, 0x05fdff4e, - 0x05d9fcf3, 0x0005f0e7, 0x05fdff4b, 0x60040000, - 0x0501f0c9, 0x4933c857, 0x59340200, 0x8c000500, - 0x05000009, 0x4d3c0000, 0x417a7800, 0x05e9fc54, - 0x5c027800, 0x8d0c0520, 0x05000003, 0x60180800, - 0x05e9fc5a, 0x1c01f000, 0x4933c857, 0x59a80873, - 0xb00405b4, 0x0500000e, 0x4807c857, 0x82040580, - 0x00000100, 0x050200a0, 0x59cc0408, 0x4803c857, - 0x8c000500, 0x0500009c, 0x59341403, 0x82080580, - 0x000007fe, 0x05000006, 0x0501f097, 0x59341403, - 0x82080580, 0x000007fe, 0x05020015, 0x59a8021b, - 0x8c000506, 0x05000010, 0x59cc0000, 0x82000500, - 0x000000ff, 0x59a8080f, 0x82040d00, 0x000000ff, - 0x80040580, 0x05000008, 0x05d9fcc1, 0x0005f8e7, - 0x42000000, 0x001097e9, 0x0511fbbf, 0x6006d800, - 0x05e9f0ba, 0x0501fa18, 0x0501f043, 0x05e9fcea, - 0x59341403, 0x82080580, 0x000007fc, 0x05020022, - 0x4a026802, 0x00fffffc, 0x0505fc02, 0x0500000c, - 0x0509f8b2, 0x0502000a, 0x0501f89a, 0x41780800, - 0x4d400000, 0x60028000, 0x0505ff8b, 0x5c028000, - 0x60100800, 0x05e9fc1d, 0x0005f0e7, 0x60100800, - 0x05e9fc1a, 0x05d9fca2, 0x59300c1f, 0x900405a1, - 0x05000002, 0x0005f0e7, 0x61f6880f, 0x42003000, - 0x00fffffd, 0x05e9fc41, 0x05ce0cec, 0x4936600a, - 0x497a6c12, 0x640e601e, 0x64066203, 0x648a6403, - 0x05f5f338, 0x59a80086, 0x8c000502, 0x0500000d, - 0x05edfbda, 0x60401000, 0x05020008, 0x59340002, - 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, - 0x05000004, 0x60201000, 0x05edf966, 0x0502004a, - 0x0505fbd4, 0x0500004b, 0x0509f884, 0x05020005, - 0x592c0405, 0x8c00051c, 0x05fe07cc, 0x0501f869, - 0x60140800, 0x05e9fbf1, 0x64066203, 0x640e6403, - 0x05f5f31c, 0x59cc0408, 0x8c000518, 0x05000016, - 0x0505fe42, 0x05edfbbd, 0x05000008, 0x59cc0408, - 0x8c000516, 0x05000005, 0x5930041f, 0x900005a1, - 0x05fe07ba, 0x1c01f000, 0x59a8021b, 0x8400054a, - 0x4803521b, 0x4803541b, 0x59a8000f, 0x84000570, - 0x48038832, 0x5930041f, 0x900005a1, 0x05fe07af, - 0x1c01f000, 0x61bc1001, 0x480b500f, 0x497b8830, - 0x84081570, 0x480b8832, 0x0505fe45, 0x59a8021b, - 0x84000548, 0x4803521b, 0x4803541b, 0x050dfd7e, - 0x05fe07a2, 0x599c0019, 0x8c000510, 0x05020029, - 0x59a8021b, 0x8400054c, 0x4803521b, 0x601c0800, - 0x05e9fbc2, 0x417a7800, 0x05e9fbb5, 0x61a00001, - 0x05f1fdfd, 0x05e80bed, 0x05ce0c98, 0x4936600a, - 0x59340200, 0x8400051a, 0x48026a00, 0x600c0800, - 0x05e9fbb6, 0x64066407, 0x64066203, 0x640a6403, - 0x05f5f2e0, 0x05fdfe94, 0x60040000, 0x0501f012, - 0x599c0017, 0x8c00050a, 0x05fc07ba, 0x60100800, - 0x05e9fbaa, 0x4937507d, 0x59a8021b, 0x8c000508, - 0x05000008, 0x599c0018, 0x8c00051c, 0x05000005, - 0x61a00807, 0x42001000, 0x0010c15e, 0x05f5f935, - 0x0005f0e7, 0x4933c857, 0x80003540, 0x05000003, - 0x601c0800, 0x05e9fb99, 0x801831c0, 0x0502000b, - 0x59302009, 0x801021c0, 0x05000004, 0x58100405, - 0x8c00051e, 0x05020005, 0x59341c03, 0x60102000, - 0x60483000, 0x05e5f8ad, 0x05d9fc15, 0x0005f0e7, - 0x4c5c0000, 0x4d2c0000, 0x59325809, 0x05f1f9c6, - 0x5c025800, 0x59cc0008, 0x48002805, 0x59cc0009, - 0x48002806, 0x49782807, 0x49782808, 0x49782809, - 0x4978280a, 0x59cc0013, 0x8c00053e, 0x05000009, - 0x59cc0414, 0x900001c0, 0x59ccbc15, 0x805c0540, - 0x48002807, 0x59cc0416, 0x900001c0, 0x48002808, - 0x59cc0017, 0x8c00053e, 0x05000009, 0x59cc0418, - 0x900001c0, 0x59ccbc19, 0x805c0540, 0x48002809, - 0x59cc041a, 0x900001c0, 0x4800280a, 0x5c00b800, - 0x1c01f000, 0x4933c857, 0x59a80073, 0x90000594, - 0x05020036, 0x59a80086, 0x8c000502, 0x05000011, - 0x05edfb32, 0x60401000, 0x05020008, 0x59340002, - 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, - 0x05000008, 0x60201000, 0x05edf8be, 0x05000005, - 0x59a80086, 0x8400054c, 0x48035086, 0x0501f023, - 0x916c0583, 0x05020008, 0x59300009, 0x80000540, - 0x05020005, 0x59341c03, 0x60182000, 0x604c3000, - 0x05e5f866, 0x05e9fc57, 0x05fdfedf, 0x0501f9cd, - 0x05020016, 0x59340404, 0x80000540, 0x05000013, - 0x60180800, 0x05e9fb3d, 0x0505fb16, 0x0500000d, - 0x0505ffc6, 0x05020007, 0x41780800, 0x4d400000, - 0x60028000, 0x0505fea0, 0x5c028000, 0x0005f0e7, - 0x4a025a05, 0x00000103, 0x4a025806, 0x02000000, - 0x05d9fbb7, 0x0005f0e7, 0x05edf84d, 0x0505fb05, - 0x05000005, 0x0505ffb5, 0x05020003, 0x05fdfe0a, - 0x0005f0e7, 0x05fdfe08, 0x0511f9df, 0x80000580, - 0x59a80086, 0x8c00050c, 0x05000004, 0x8400050c, - 0x48035086, 0x90000541, 0x05fdf77f, 0x4933c857, - 0x59a80073, 0x90000594, 0x05020006, 0x602c0800, - 0x05e9fb16, 0x64066203, 0x64066403, 0x05f5f241, - 0x60040000, 0x05fdf774, 0x4933c857, 0x40003000, - 0x59a80073, 0x90000584, 0x05020006, 0x9018358b, - 0x05020003, 0x601c0800, 0x05e9fb08, 0x0005f0e7, - 0x60040000, 0x05fdf768, 0x4803c857, 0x4d2c0000, - 0x4d3c0000, 0x0c01f804, 0x5c027800, 0x5c025800, - 0x1c01f000, 0x0010645e, 0x00106625, 0x0010645e, - 0x00106668, 0x0010645e, 0x001066b5, 0x00106619, - 0x0010645e, 0x0010645e, 0x001066cb, 0x0010645e, - 0x001066d6, 0x4933c857, 0x4d1c0000, 0x59301403, - 0x90080583, 0x05000006, 0x9008159e, 0x05020002, - 0x0005f8e7, 0x5c023800, 0x1c01f000, 0x05fdff82, - 0x05fdf7fd, 0x4933c857, 0x42000000, 0x001097fc, - 0x0511fa6d, 0x0511f99c, 0x05e9fd5e, 0x0505fab9, - 0x05000007, 0x0505ff69, 0x05020005, 0x6008b000, - 0x0505ff4b, 0x05fdfdbc, 0x0005f0e7, 0x0501f8ae, - 0x05020020, 0x417a7800, 0x05e9fac9, 0x417a7800, - 0x0201f800, 0x0010b652, 0x42000000, 0x001097f8, - 0x0511fa59, 0x59340200, 0x84000558, 0x48026a00, - 0x640a6403, 0x600c3000, 0x0511f8b9, 0x8d0c0520, - 0x0500000b, 0x4d400000, 0x41782800, 0x60143000, - 0x60a68000, 0x050dfc97, 0x5c028000, 0x641e6203, - 0x64126407, 0x64066422, 0x1c01f000, 0x600c0800, - 0x05e9faba, 0x64066203, 0x05f5f9e6, 0x05fdf7fb, - 0x59cc0407, 0x90000589, 0x05020009, 0x59340412, - 0x82000500, 0x000000ff, 0x0500000b, 0x80000040, - 0x48026c12, 0x642a6006, 0x05fdf7f0, 0x59cc0207, - 0x82000500, 0x0000ff00, 0x82000580, 0x00001900, - 0x05fc07d3, 0x05fdfd88, 0x80000580, 0x05fdf706, - 0x4933c857, 0x0505fa7b, 0x0500000b, 0x0505ff2b, - 0x05020009, 0x4c580000, 0x6008b000, 0x0505ff0c, - 0x5c00b000, 0x05fdfd7c, 0x601c0800, 0x05e9fa97, - 0x0005f0e7, 0x05fdfd78, 0x59cc3407, 0x82183500, - 0x000000ff, 0x90180585, 0x05000016, 0x9018058b, - 0x05000011, 0x59cc0207, 0x82000500, 0x0000ff00, - 0x05020003, 0x90180589, 0x0500000e, 0x82000580, - 0x00001900, 0x05020008, 0x90180589, 0x05000009, - 0x60100800, 0x05e9fa81, 0x05d9fb09, 0x0511f93a, - 0x0005f0e7, 0x0511f938, 0x60040000, 0x05fdf6de, - 0x0505fa54, 0x59325809, 0x05000008, 0x592c0205, - 0x82000580, 0x00000139, 0x05fc07f7, 0x592c0405, - 0x8c00051e, 0x05fe07f4, 0x59340412, 0x800001c0, - 0x05000006, 0x80000040, 0x48026c12, 0x642a6006, - 0x645a6403, 0x1c01f000, 0x59340403, 0x82000580, - 0x000007fe, 0x05020006, 0x59a8021b, 0x84000540, - 0x4803521b, 0x05e5ffe2, 0x05fdf7e3, 0x0511f91a, - 0x417a7800, 0x0201f800, 0x0010b652, 0x60143000, - 0x0511f84b, 0x42000000, 0x001097f8, 0x0511f9e2, - 0x05fdf7da, 0x4933c857, 0x0501f838, 0x05020006, - 0x60140800, 0x05e9fa51, 0x64066203, 0x640e6403, - 0x05f5f17c, 0x60100800, 0x05e9fa4c, 0x0505fed7, - 0x05020007, 0x4c580000, 0x6008b000, 0x0505feb8, - 0x5c00b000, 0x05fdfd28, 0x0005f0e7, 0x05fdfd26, - 0x0511f8fd, 0x80000580, 0x05fdf6a3, 0x4933c857, - 0x0501f822, 0x05020006, 0x60240800, 0x05e9fa3b, - 0x64066203, 0x64166403, 0x05f5f166, 0x0511f8f2, - 0x60040000, 0x05fdf698, 0x4933c857, 0x0501f817, - 0x05020006, 0x602c0800, 0x05e9fa30, 0x64066203, - 0x64066403, 0x05f5f15b, 0x0511f8e7, 0x60040000, - 0x05fdf68d, 0x4933c857, 0x59cc0407, 0x90000583, - 0x05020009, 0x59cc0207, 0x82000500, 0x0000ff00, - 0x82000d80, 0x00002a00, 0x05000003, 0x82000d80, - 0x00001e00, 0x1c01f000, 0x4933c857, 0x90000541, - 0x1c01f000, 0x4933c857, 0x4d400000, 0x4c580000, - 0x59a8021b, 0x90000543, 0x4803521b, 0x0501f850, - 0x05000005, 0x4d300000, 0x4d340000, 0x4d440000, - 0x0501f01b, 0x0501f876, 0x05000027, 0x4d300000, - 0x4d340000, 0x4d440000, 0x59cc0408, 0x8c00051e, - 0x05020004, 0x59a8021b, 0x84000552, 0x4803521b, - 0x8d0c0520, 0x05000005, 0x60aa8000, 0x61fe89ff, - 0x60083000, 0x050dfffe, 0x60aa8000, 0x4d3c0000, - 0x60027804, 0x0201f800, 0x0010b5d3, 0x5c027800, - 0x42000000, 0x001097f8, 0x0511f97f, 0x0201f800, - 0x0010b83b, 0x6040b000, 0x61c2880f, 0x83440580, - 0x000007fe, 0x05000002, 0x05e9fa76, 0x81468800, - 0x8058b040, 0x05fe07fa, 0x5c028800, 0x5c026800, - 0x5c026000, 0x05e9faa0, 0x59cc0800, 0x82040d00, - 0x00ffffff, 0x4807500f, 0x80040110, 0x48035018, - 0x48038881, 0x59a80a1b, 0x84040d50, 0x59cc0013, - 0x8c00053e, 0x05000003, 0x8c000536, 0x05000004, - 0x59cc0017, 0x8c000536, 0x05020002, 0x84040d10, - 0x4807521b, 0x4807541b, 0x4c040000, 0x0509f9d7, - 0x5c000800, 0x05edf9a1, 0x05000006, 0x59cc0009, - 0x48035028, 0x59cc000a, 0x48035029, 0x0505fc1f, - 0x5c00b000, 0x5c028000, 0x1c01f000, 0x4933c857, - 0x59a8141b, 0x82080580, 0x0000ffff, 0x0500000b, - 0x4c080000, 0x05edf991, 0x5c001000, 0x0502000b, - 0x59cc0408, 0x8c000518, 0x05000005, 0x8c08050a, - 0x0500000a, 0x80000580, 0x1c01f000, 0x8c080508, - 0x05fe07fd, 0x0501f005, 0x90080530, 0x05020003, - 0x8c080506, 0x05fe07f8, 0x4a03541b, 0x0000ffff, - 0x42000000, 0x00109745, 0x0511f933, 0x60303000, - 0x61fc19ff, 0x601c2000, 0x05e1fec4, 0x4d400000, - 0x4d3c0000, 0x60043000, 0x050dffa1, 0x60aa8000, - 0x60027804, 0x0201f800, 0x0010b5d3, 0x5c028000, - 0x5c027800, 0x90000541, 0x1c01f000, 0x4933c857, - 0x4c580000, 0x59a80018, 0x800001c0, 0x0500001b, - 0x59cc1000, 0x82081500, 0x00ffff00, 0x80081110, - 0x80080580, 0x05000004, 0x42000000, 0x001097db, - 0x0501f010, 0x91cc140b, 0x6008b000, 0x91341c06, - 0x0501f829, 0x05000004, 0x42000000, 0x001097dc, - 0x0501f008, 0x91cc140d, 0x6008b000, 0x91341c08, - 0x0501f821, 0x05000005, 0x42000000, 0x001097dd, - 0x0511f905, 0x90000541, 0x5c00b000, 0x1c01f000, - 0x4933c857, 0x59cc0206, 0x90000594, 0x05020015, - 0x59cc0407, 0x82000580, 0x00000800, 0x05020011, - 0x59cc0207, 0x8c00051a, 0x0500000d, 0x82000500, - 0x00000f00, 0x82000580, 0x00000100, 0x05020008, - 0x59cc020a, 0x8c000508, 0x05020003, 0x8c00050a, - 0x05000003, 0x80000580, 0x1c01f000, 0x90000541, - 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, - 0x480bc857, 0x480fc857, 0x485bc857, 0x50080800, - 0x500c0000, 0x80042580, 0x05020007, 0x80081000, - 0x800c1800, 0x8058b040, 0x05fe07f9, 0x80000580, - 0x1c01f000, 0x4803c857, 0x4807c857, 0x480bc857, - 0x480fc857, 0x80040480, 0x05001004, 0x60040000, - 0x90040d41, 0x1c01f000, 0x41780000, 0x05fdf7fd, - 0xb1380493, 0x05ce1a1d, 0xb138048b, 0x05cc1a1b, - 0x0c01f001, 0x001067d6, 0x001067d6, 0x001067d6, - 0x001067d6, 0x001067d5, 0x001067d5, 0x001067d5, - 0x001067d6, 0x05cdfa11, 0x493bc857, 0x64366203, - 0x493a6403, 0x42000800, 0x80000000, 0x0005f07c, - 0x91380593, 0x05020005, 0x59300403, 0xb0000590, - 0x05ce0a06, 0x0005f0e7, 0x4933c857, 0x913805a7, - 0x05020026, 0x4933c857, 0x05f5f8b7, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010b652, 0x5c027800, - 0x42000000, 0x001097f8, 0x0511f8a7, 0x4d2c0000, - 0x59325809, 0x0505f8f3, 0x492fc857, 0x0500000b, - 0x4a025a05, 0x00000103, 0x59300c02, 0x48065c07, - 0x64a65a07, 0x497a580a, 0x592c0c09, 0x84040d50, - 0x48065c09, 0x0001fb2c, 0x5c025800, 0x60543000, - 0x41782800, 0x600c2000, 0x4d400000, 0x4d440000, - 0x59368c03, 0x60a68000, 0x0505ffc7, 0x5c028800, - 0x5c028000, 0x0005f0e7, 0x91380594, 0x05020009, - 0x59300403, 0xb0000c93, 0x05ce19d8, 0xb0000480, - 0x05cc19d6, 0x4933c857, 0x4803c857, 0x0c01f009, - 0xb1380593, 0x05000006, 0xb1380588, 0x05ce09cf, - 0x59300403, 0xb0000590, 0x05ce09cc, 0x1c01f000, - 0x00106830, 0x0010682f, 0x0010682f, 0x0010682f, - 0x0010682f, 0x0010682f, 0x0010682f, 0x0010682f, - 0x0010682f, 0x0010682f, 0x0010682f, 0x00106840, - 0x00106840, 0x00106840, 0x00106840, 0x0010682f, - 0x00106840, 0x0010682f, 0x00106840, 0x05cdf9b7, - 0x4933c857, 0x05f5f86c, 0x0505f8b2, 0x000400e7, - 0x4d2c0000, 0x59325809, 0x4a025a05, 0x00000103, - 0x59300402, 0x48025c07, 0x641a5a07, 0x497a580a, - 0x0001fb2c, 0x5c025800, 0x0505f976, 0x0005f0e7, - 0x4933c857, 0x05f5f85c, 0x0005f0e7, 0x05cdf9a3, - 0x5930001e, 0x800001c0, 0x05060f76, 0x59300004, - 0x8c00053e, 0x05020027, 0x0509f81a, 0x050200a6, - 0x59325809, 0x592c0c09, 0x59cc2808, 0x82141d00, - 0x00000c00, 0x05000002, 0x59cc1809, 0x84040d58, - 0x48065c09, 0x82143500, 0x00000fff, 0x05020020, - 0x59340200, 0x8c00050e, 0x0502008d, 0x0005f987, - 0x05020005, 0x64025a07, 0x59300813, 0x800409c0, - 0x05020955, 0x4a025a05, 0x00000103, 0x48065808, - 0x480e580b, 0x901409c0, 0x4806580a, 0x59300c02, - 0x48065c07, 0x0505fd32, 0x0001fb2c, 0x05e9fb7f, - 0x59cc0008, 0x8c000518, 0x050601ea, 0x0005f0e7, - 0x05f5fc09, 0x05fc07d9, 0x4d3c0000, 0x600a7800, - 0x0501fd3c, 0x5c027800, 0x05fdf7d4, 0x4817c857, - 0x480fc857, 0x82180500, 0x000000ff, 0x0500000b, - 0x592c0205, 0x82000500, 0x000000ff, 0xb0000588, - 0x05020006, 0x592c0408, 0x800001c0, 0x05000003, - 0x0505fe4c, 0x0505f683, 0x82180d00, 0x00000c00, - 0x05000004, 0x59340200, 0x8c00050e, 0x0502004b, - 0x64025a07, 0x41782000, 0x8c180510, 0x05000009, - 0x59cc200b, 0x801021c0, 0x05000006, 0x59cc000c, - 0x82000500, 0x000000ff, 0x05000002, 0x4803c857, - 0x4812580d, 0x41780000, 0x8c180512, 0x05000002, - 0x59cc000a, 0x4802580c, 0x80100c00, 0x05fc07bc, - 0x9004149d, 0x05001005, 0x592c0405, 0x8c00051e, - 0x0500001c, 0x60700800, 0x4c040000, 0x4c0c0000, - 0x4c140000, 0x0005f987, 0x05020005, 0x64025a07, - 0x59300813, 0x800409c0, 0x05020907, 0x5c002800, - 0x5c001800, 0x4a025a05, 0x00000103, 0x48065808, - 0x480e580b, 0x901409c0, 0x4806580a, 0x5c000800, - 0x4c500000, 0x4c540000, 0x91cca40c, 0x912cac0e, - 0x0501fca1, 0x5c00a800, 0x5c00a000, 0x05fdf7a8, + 0x4c580000, 0x59325809, 0x592e5801, 0x912cac06, + 0x91cca406, 0x59a80885, 0x82040d00, 0x000003ff, + 0x9004148f, 0x05001011, 0x603cb000, 0x0515f99a, + 0x592e5801, 0x912cac06, 0x90080c8f, 0x05001008, + 0x603cb000, 0x0515f994, 0x592e5801, 0x912cac06, + 0x9004148f, 0x05001005, 0x603c1000, 0x4008b000, + 0x0515f98d, 0x0501f003, 0x4004b000, 0x0515f98a, + 0x5931d823, 0x58ef400a, 0x58ee580c, 0x4a025a05, + 0x00000103, 0x592e5801, 0x58ec0008, 0x0801f800, + 0x0005f8e7, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x4c500000, 0x4c540000, 0x4c580000, 0x59cc0006, + 0x82000d80, 0x01000000, 0x05000021, 0x59cc0007, + 0x9000b1c0, 0x8258b500, 0x000000ff, 0x8058b104, + 0x9058b402, 0x90580c87, 0x05001002, 0x6018b000, + 0x91cca406, 0x59301009, 0x800811c0, 0x05d00923, + 0x9008ac06, 0x0515f964, 0x82000d00, 0xff000000, + 0x800409c0, 0x05000014, 0x8200b500, 0x000000ff, + 0x05000011, 0x8058b104, 0x90580c8e, 0x05001002, + 0x6034b000, 0x58081001, 0x800811c0, 0x05d00913, + 0x9008ac06, 0x0515f954, 0x0501f007, 0x59301009, + 0x800811c0, 0x05d0090d, 0x48001006, 0x59cc0007, + 0x48001007, 0x05fdff5a, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, + 0x6008b000, 0x59cc0806, 0x82040580, 0x01000000, + 0x05000004, 0x8204b500, 0x0000ffff, 0x8058b104, + 0x91cca406, 0x59300009, 0x9000ac06, 0x0515f936, + 0x05fdff43, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4803c857, + 0x4807c857, 0x480bc857, 0x480fc857, 0x4813c857, + 0x481bc857, 0x492fc857, 0x4d2c0000, 0x4c000000, + 0x05d1fc51, 0x5c000000, 0x0500000d, 0x48025803, + 0x481a5801, 0x48125808, 0x48065805, 0x480a5806, + 0x480e5807, 0x5c001000, 0x4c080000, 0x480a5809, + 0x412c1000, 0x0001f81c, 0x90000541, 0x5c025800, + 0x1c01f000, 0x4933c857, 0x4937c857, 0x4d1c0000, + 0x05f5fc50, 0x05020020, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x59341002, 0x82081500, 0x00ffffff, + 0x80080580, 0x05020018, 0x497a6205, 0x60d40800, + 0x0509fb7c, 0x0502000f, 0x591c001e, 0x800001c0, + 0x0500000c, 0x497a381e, 0x591c0416, 0x8c000502, + 0x05d008ba, 0x84000502, 0x48023c16, 0x591c1407, + 0x90080583, 0x05000005, 0x90080586, 0x05000005, + 0x05fdfd19, 0x0501f004, 0x0501f805, 0x0501f002, + 0x0501f8b2, 0x5c023800, 0x1c01f000, 0x4d2c0000, + 0x591e5809, 0x4933c857, 0x491fc857, 0x493bc857, + 0x492fc857, 0x91380595, 0x050000a6, 0x91380596, + 0x050200a2, 0x4d300000, 0x411e6000, 0x59cc0207, + 0x4803c857, 0x82000d00, 0x0000ff00, 0x82040580, + 0x00001700, 0x05000004, 0x82040580, 0x00000300, + 0x05020055, 0x591c0203, 0x4803c857, 0x9000058d, + 0x0500003a, 0x812e59c0, 0x0500008f, 0x591c0202, + 0x4803c857, 0x82000580, 0x0000ffff, 0x05020079, + 0x592c020b, 0x4803c857, 0x90000503, 0x90000582, + 0x05020007, 0x592c0810, 0x591c0013, 0x4803c857, + 0x4807c857, 0x80040580, 0x0502006e, 0x591c0416, + 0x4803c857, 0x8c000500, 0x0502006a, 0x42000000, + 0x0010985e, 0x0511fff2, 0x41780800, 0x591c1006, + 0x60280000, 0x05f5fe9b, 0x592c0407, 0x4803c857, + 0x800001c0, 0x0500000b, 0x80080c80, 0x05001003, + 0x05d2086e, 0x80001040, 0x480a5c07, 0x800811c0, + 0x05020004, 0x0201f800, 0x0010c012, 0x0501f063, + 0x0509f8ca, 0x591c0819, 0x591c001a, 0x48065809, + 0x4802580a, 0x59300008, 0x8c000500, 0x05d6098a, + 0x497a3809, 0x0001fa84, 0x0502004a, 0x411e6000, + 0x05fdfcc1, 0x0501f055, 0x05fdfcf5, 0x05000013, + 0x591c0006, 0x48026006, 0x4936600a, 0x640e6407, + 0x492e6009, 0x591c0819, 0x591c101a, 0x48066019, + 0x480a601a, 0x4d380000, 0x591e7403, 0x4d300000, + 0x411e6000, 0x05fdfcb0, 0x5c026000, 0x0005f905, + 0x5c027000, 0x0501f041, 0x59a8002c, 0x48023a05, + 0x0501f03e, 0x59cc0407, 0x9000058b, 0x05020026, + 0x59340a00, 0x84040d0e, 0x48066a00, 0x592c0a05, + 0x82040d00, 0x000000ff, 0x90040d94, 0x05000002, + 0x640e621f, 0x59300008, 0x8c000500, 0x05d6095e, + 0x4d400000, 0x497a5c0a, 0x600e8000, 0x592c0a09, + 0x05edfdbe, 0x0515f8bf, 0x05020006, 0x0001fb2c, + 0x59300a1f, 0x90040d83, 0x0508088c, 0x497a6009, + 0x5c028000, 0x4a026403, 0x00000085, 0x64266203, + 0x640a6407, 0x42000800, 0x80004040, 0x0509ff19, + 0x0005f87c, 0x4203e000, 0xb0800000, 0x6023f800, + 0x0501f016, 0x59cc0207, 0x82000580, 0x00002a00, + 0x05020004, 0x59a8002c, 0x48023a05, 0x0501f00f, + 0x812e59c0, 0x05d00811, 0x4a025a05, 0x00000103, + 0x591c0008, 0x8c000500, 0x05d60937, 0x591c0402, + 0x48025c07, 0x640e5a07, 0x497a5c0a, 0x0001fb2c, + 0x05fdfc6d, 0x05edfa1c, 0x5c026000, 0x0005f8e7, + 0x0501f002, 0x5c026000, 0x5c025800, 0x1c01f000, + 0x0501f813, 0x05fdf7fd, 0x4933c857, 0x91380595, + 0x05020004, 0x59a8002c, 0x48023a05, 0x0501f009, + 0x91380596, 0x05020009, 0x4d300000, 0x411e6000, + 0x0511fb95, 0x0005f853, 0x0005f8e7, 0x5c026000, + 0x497a381e, 0x0005f8e7, 0x1c01f000, 0x4c5c0000, + 0x591c0416, 0x84000540, 0x48023c16, 0x59ccb80b, + 0x4933c857, 0x491fc857, 0x492fc857, 0x4803c857, + 0x485fc857, 0x8c5c053c, 0x05000005, 0x59a8002c, + 0x48023a05, 0x497a381e, 0x0501f049, 0x4d300000, + 0x411e6000, 0x0505fc2d, 0x5c026000, 0x591c0407, + 0x90000580, 0x05000042, 0x591c0403, 0xb0000590, + 0x0502000a, 0x4d300000, 0x411e6000, 0x64066203, + 0x42000800, 0x80000043, 0x0005f87c, 0x5c026000, + 0x497a381e, 0x0501f036, 0x591c0203, 0x9000058d, + 0x0500001c, 0x812e59c0, 0x05cc0fc4, 0x592c020b, + 0x4803c857, 0x8c000500, 0x0502001b, 0x8c000502, + 0x05000014, 0x591c0416, 0x8c00051c, 0x05020007, + 0x591c0013, 0x4803c857, 0x800001c0, 0x0500000d, + 0x591c0014, 0x48023818, 0x4a023814, 0x0fffffff, + 0x592c0209, 0x8400051e, 0x48025a09, 0x42000000, + 0x00109860, 0x0511ff26, 0x64063a16, 0x0501f016, + 0x42000000, 0x00109861, 0x0511ff21, 0x641e3a16, + 0x0501f011, 0x8c5c053a, 0x05fe07fa, 0x59cc000a, + 0x592c1810, 0x4803c857, 0x480fc857, 0x800c0580, + 0x05fc07f4, 0x59cc000a, 0x4803c857, 0x48023818, + 0x48023817, 0x42000000, 0x0010985f, 0x0511ff10, + 0x64163a16, 0x5c00b800, 0x0509f11d, 0x5c00b800, + 0x0005f0e7, 0x4933c857, 0x4d1c0000, 0x05f5fb11, + 0x0502003f, 0x59cc0001, 0x59341002, 0x80080580, + 0x82000500, 0x00ffffff, 0x05020037, 0x5930141b, + 0x0509fa88, 0x05cc0f85, 0x591c1407, 0x90080587, + 0x05000031, 0x90080582, 0x0500002f, 0x90080580, + 0x0500002d, 0x591c0202, 0x82000d80, 0x0000ffff, + 0x05000004, 0x59301a1b, 0x800c0580, 0x05020026, + 0x91380595, 0x05000022, 0x4d300000, 0x4d2c0000, + 0x411e6000, 0x59325809, 0x0505ff04, 0x05cc0f6f, + 0x592c0205, 0x82000500, 0x000000ff, 0x90000594, + 0x05000002, 0x640e621f, 0x497a5c0a, 0x600e8000, + 0x592c0a09, 0x05edfcf5, 0x0511fff6, 0x05020006, + 0x0001fb2c, 0x59300a1f, 0x90040d83, 0x05040fc3, + 0x497a6009, 0x5c025800, 0x4a026403, 0x00000085, + 0x64266203, 0x640a6407, 0x42000800, 0x80004040, + 0x0005f87c, 0x5c026000, 0x0501f003, 0x59a8002c, + 0x48023a05, 0x497a381e, 0x0005f8e7, 0x5c023800, + 0x1c01f000, 0x4933c857, 0x4c580000, 0x4d2c0000, + 0x59325809, 0x59342200, 0x82102500, 0xffffdffd, + 0x48126a00, 0x91383595, 0x05000009, 0x0505fed7, + 0x05000045, 0x0509fb87, 0x05020003, 0x6008b000, + 0x0509fb69, 0x0501f9c2, 0x0501f058, 0x91cc1408, + 0x6008b000, 0x91341c06, 0x0501fd89, 0x0502000f, + 0x91cc140a, 0x6008b000, 0x91341c08, 0x0501fd84, + 0x0502000a, 0x05d9fedd, 0x59342200, 0x59cc1007, + 0x800811c0, 0x05000003, 0x480a6801, 0x84102542, + 0x48126a00, 0x0501f047, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010b660, 0x5c027800, 0x42000000, + 0x00109878, 0x0511fe9a, 0x59340200, 0x84000558, + 0x48026a00, 0x4d300000, 0x05fdfbb9, 0x05cc0f1b, + 0x4936600a, 0x497a6009, 0x64066407, 0x64066403, + 0x600c3000, 0x0511fcf4, 0x8d0c0520, 0x0500000b, + 0x41782800, 0x60043000, 0x4d400000, 0x60a68000, + 0x0511f8b9, 0x5c028000, 0x64126407, 0x641e6203, + 0x64066422, 0x0501f005, 0x64066203, 0x602c0800, + 0x05e9fe36, 0x05f5fde3, 0x5c026000, 0x0505fe97, + 0x0500001e, 0x0509fb47, 0x0502001e, 0x0501f984, + 0x0501f01a, 0x42000000, 0x0010987b, 0x0511fe74, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010b660, + 0x42000000, 0x00109878, 0x0511fe6d, 0x59340200, + 0x84000558, 0x48026a00, 0x600c3000, 0x41782800, + 0x60142000, 0x4d400000, 0x4d440000, 0x59368c03, + 0x60a68000, 0x0509fd66, 0x5c028800, 0x5c028000, + 0x5c027800, 0x05d9fe91, 0x0005f8e7, 0x0501f002, + 0x05fdfd33, 0x5c025800, 0x5c00b000, 0x1c01f000, + 0x4933c857, 0x41380000, 0xb1383498, 0x05ce1edb, + 0x0c01f001, 0x00106371, 0x0010636e, 0x00106371, + 0x00106371, 0x00106371, 0x00106371, 0x0010636d, + 0x0010636d, 0x0010636d, 0x0010636d, 0x0010636d, + 0x0010636d, 0x0010636d, 0x0010636d, 0x0010636d, + 0x0010636d, 0x0010636d, 0x0010636d, 0x0010636d, + 0x0010636d, 0x0010636d, 0x0010636d, 0x0010636d, + 0x0010636d, 0x0010636d, 0x0010636d, 0x0010636d, + 0x0010636d, 0x0010636d, 0x0010636d, 0x0010636d, + 0x00106371, 0x0010636d, 0x00106371, 0x00106371, + 0x0010636d, 0x0010636d, 0x0010636d, 0x0010636d, + 0x0010636d, 0x00106371, 0x0010636d, 0x0010636d, + 0x0010636d, 0x0010636d, 0x0010636d, 0x0010636d, + 0x0010636d, 0x0010636d, 0x0010636d, 0x00106371, + 0x00106371, 0x0010636d, 0x0010636d, 0x0010636d, + 0x0010636d, 0x0010636d, 0x0010636d, 0x0010636d, + 0x0010636d, 0x0010636d, 0x00106371, 0x0010636d, + 0x0010636d, 0x0010636d, 0x0010636d, 0x0010636d, + 0x00106371, 0x00106371, 0x0010636d, 0x0010636d, + 0x0010636d, 0x0010636d, 0x00106371, 0x0010636d, + 0x0010636d, 0x0010636d, 0x00106371, 0x0010636d, + 0x0010636d, 0x0010636d, 0x00106371, 0x0010636d, + 0x0010636d, 0x0010636d, 0x00106371, 0x0010636d, + 0x00106371, 0x0010636d, 0x0010636d, 0x0010636d, + 0x0010636d, 0x0010636d, 0x0010636d, 0x0010636d, + 0x0010636d, 0x05cdfe79, 0x64066203, 0x493a6403, + 0x05f5f554, 0x4933c857, 0x64066203, 0x493a6403, + 0x05f5f550, 0x59300403, 0xb0003498, 0x05ce1e6f, + 0x91383593, 0x05000074, 0x913835a7, 0x0502003c, + 0x4933c857, 0x05f5fdac, 0x0511fd0f, 0x0505fede, + 0x05000009, 0x0505fef0, 0x05000033, 0x59300403, + 0x90000da2, 0x0502002d, 0x05fdfcec, 0x0500002d, + 0x0501f02d, 0x05d9fe09, 0x601c0800, 0x05e9fd8b, + 0x0501f8df, 0x4d440000, 0x59368c03, 0x83440580, + 0x000007fe, 0x05020007, 0x59a8121b, 0x84081540, + 0x05edfd80, 0x05020002, 0x8408154a, 0x480b521b, + 0x60a68000, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010b660, 0x5c027800, 0x916c0583, 0x0500000b, + 0x5932680a, 0x59340008, 0x800001c0, 0x05020007, + 0x59368c03, 0x4933c857, 0x4937c857, 0x4947c857, + 0x05e9fdfb, 0x0501f008, 0x42000000, 0x00109878, + 0x0511fdb3, 0x60543000, 0x41782800, 0x600c2000, + 0x0509fcb3, 0x5c028800, 0x0509f872, 0x0005f0e7, + 0x1c01f000, 0x0501f8b6, 0x05fdf7fc, 0x91380594, + 0x05000008, 0x4933c857, 0x05f9f94b, 0x05fe02fb, + 0x59300203, 0x90000582, 0x050000d5, 0x05cdfe27, + 0x4933c857, 0x05f5fd68, 0x0511fccb, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010b660, 0x5c027800, + 0x60583000, 0x41782800, 0x4d400000, 0x4d440000, + 0x59368c03, 0x60242000, 0x60a68000, 0x0509fc94, + 0x5c028800, 0x5c028000, 0x42000000, 0x00109878, + 0x0511fd8b, 0x0505fe88, 0x0502000b, 0x05d9fdbb, + 0x0501f893, 0x59340c03, 0x82040580, 0x000007fe, + 0x05fe07d6, 0x59a80a1b, 0x84040d40, 0x4807521b, + 0x05fdf7d2, 0x0505fe90, 0x05020003, 0x0501f888, + 0x05fdf7ce, 0x59300403, 0x90000db2, 0x05020003, + 0x05ddf823, 0x05fdf7c9, 0x90000da2, 0x05000880, + 0x05fdf7c6, 0x4933c857, 0x4803c857, 0x0c01f001, + 0x00106451, 0x00106451, 0x00106451, 0x00106451, + 0x00106451, 0x00106451, 0x00106450, 0x00106450, + 0x00106450, 0x00106450, 0x00106450, 0x00106450, + 0x00106450, 0x00106450, 0x00106450, 0x00106450, + 0x00106450, 0x00106450, 0x00106450, 0x00106450, + 0x00106450, 0x00106450, 0x00106450, 0x00106450, + 0x00106450, 0x00106450, 0x00106450, 0x00106450, + 0x00106450, 0x00106450, 0x00106453, 0x00106466, + 0x00106450, 0x00106466, 0x00106466, 0x00106450, + 0x00106450, 0x00106450, 0x00106450, 0x00106450, + 0x00106466, 0x00106466, 0x00106450, 0x00106450, + 0x00106450, 0x00106450, 0x00106450, 0x00106450, + 0x00106450, 0x00106450, 0x0010645e, 0x00106466, + 0x00106450, 0x00106459, 0x00106450, 0x00106450, + 0x00106450, 0x00106459, 0x00106450, 0x00106450, + 0x00106450, 0x00106466, 0x0010645c, 0x00106450, + 0x00106450, 0x00106450, 0x00106450, 0x00106466, + 0x00106466, 0x00106450, 0x00106450, 0x00106450, + 0x00106450, 0x00106466, 0x00106450, 0x00106450, + 0x00106450, 0x00106466, 0x00106450, 0x00106450, + 0x00106450, 0x00106466, 0x00106450, 0x00106450, + 0x00106450, 0x00106466, 0x00106450, 0x00106466, + 0x00106450, 0x00106450, 0x00106450, 0x00106450, + 0x00106450, 0x00106450, 0x00106450, 0x00106450, + 0x05cdfd96, 0x640a6203, 0x0505f67f, 0x64166203, + 0x59a8002c, 0x48026205, 0x59a8002a, 0x48026006, + 0x1c01f000, 0x59300820, 0x49780a05, 0x0501f00b, + 0x0505ffc8, 0x0005f0e7, 0x05d9ffad, 0x05f5fd60, + 0x05000003, 0x05f5fcc8, 0x0005f0e7, 0x05f5fcc6, + 0x0005f8e7, 0x05f5f546, 0x4933c857, 0x640a6203, + 0x59a8002a, 0x48026006, 0x1c01f000, 0x4933c857, + 0x0505fd0e, 0x05000025, 0x4d2c0000, 0x0509f9bd, + 0x05020007, 0x4d400000, 0x60c68000, 0x60100800, + 0x0509f897, 0x5c028000, 0x0501f01b, 0x59300c07, + 0x90040590, 0x05000003, 0x90040591, 0x05020007, + 0x64c65a07, 0x6412580e, 0x4a02580f, 0x000000ff, + 0x0001fb2c, 0x0501f010, 0x592c0405, 0x8c00051e, + 0x0500000d, 0x4a025a05, 0x00000103, 0x4a025806, + 0x01000000, 0x4da00000, 0x4cec0000, 0x5931d823, + 0x58ef400a, 0x58ec0008, 0x0801f800, 0x5c01d800, + 0x5c034000, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x83340580, 0x0010993e, 0x05020007, 0x91380d95, + 0x05000003, 0x91380d96, 0x05fe021c, 0x0511fbf4, + 0x0005f0e7, 0x59340400, 0x82000500, 0x000000ff, + 0x9000348c, 0x05ce1d45, 0x59303403, 0xb0180d8d, + 0x050407d1, 0x90180db3, 0x05040798, 0x90180da8, + 0x050405fd, 0x90180da9, 0x05040607, 0xb0180d97, + 0x05080494, 0x90180d9f, 0x05fc037d, 0xb0180d95, + 0x05fc035d, 0x90180d80, 0x05fc05e7, 0x90180da2, + 0x05fc0399, 0x90180db5, 0x05fc045f, 0x90180db9, + 0x05fc059d, 0x90180dbd, 0x05fc03c6, 0xb0180d84, + 0x05fc03f2, 0xb0180d89, 0x05fc0425, 0xb0180d83, + 0x050800d1, 0x90180d84, 0x05020002, 0x60040000, + 0x91380d95, 0x05000004, 0x91380d96, 0x05fe01ef, + 0x0501f1c5, 0x4c000000, 0x0511fbc5, 0x5c000000, + 0x4d2c0000, 0x4d3c0000, 0x0c01f804, 0x5c027800, + 0x5c025800, 0x1c01f000, 0x001064e5, 0x001064e9, + 0x001064e5, 0x00106539, 0x001064e5, 0x0010662c, + 0x001066a0, 0x001064e5, 0x001064e5, 0x00106676, + 0x001064e5, 0x00106681, 0x4933c857, 0x497a6008, + 0x59300809, 0x58040000, 0x4a000a05, 0x00000103, + 0x0005f0e7, 0x4933c857, 0x40000000, 0x40000000, + 0x1c01f000, 0x4933c857, 0x05e9feb1, 0x59a80073, + 0xb00005b4, 0x0502003c, 0x050dfe37, 0x0502000e, + 0x0501f83c, 0x0505fc89, 0x05000009, 0x0509f939, + 0x05020007, 0x41780800, 0x4d400000, 0x60028000, + 0x0509f813, 0x5c028000, 0x0501f002, 0x05d9fc97, + 0x0005f0e7, 0x0505fc7d, 0x05000005, 0x0509f92d, + 0x05020003, 0x05fdff6a, 0x0005f0e7, 0x417a7800, + 0x0201f800, 0x0010b660, 0x42000000, 0x00109878, + 0x0511fc57, 0x59340200, 0x84000558, 0x48026a00, + 0x600c3000, 0x0511fab8, 0x4d300000, 0x05fdf974, + 0x05cc0cd6, 0x4936600a, 0x497a6009, 0x64066407, + 0x64066403, 0x8d0c0520, 0x0500000b, 0x64126407, + 0x641e6203, 0x64066422, 0x60043000, 0x4d400000, + 0x60a68000, 0x41782800, 0x050dfe73, 0x5c028000, + 0x0501f005, 0x602c0800, 0x05e9fbf4, 0x64066203, + 0x05f5fba0, 0x5c026000, 0x05fdff45, 0x05d9fc6b, + 0x0005f0e7, 0x05fdff42, 0x60040000, 0x0501f0c9, + 0x4933c857, 0x59340200, 0x8c000500, 0x05000009, + 0x4d3c0000, 0x417a7800, 0x05e9fbd9, 0x5c027800, + 0x8d0c0520, 0x05000003, 0x60180800, 0x05e9fbdf, + 0x1c01f000, 0x4933c857, 0x59a80873, 0xb00405b4, + 0x0500000e, 0x4807c857, 0x82040580, 0x00000100, + 0x050200a0, 0x59cc0408, 0x4803c857, 0x8c000500, + 0x0500009c, 0x59341403, 0x82080580, 0x000007fe, + 0x05000006, 0x0501f097, 0x59341403, 0x82080580, + 0x000007fe, 0x05020015, 0x59a8021b, 0x8c000506, + 0x05000010, 0x59cc0000, 0x82000500, 0x000000ff, + 0x59a8080f, 0x82040d00, 0x000000ff, 0x80040580, + 0x05000008, 0x05d9fc39, 0x0005f8e7, 0x42000000, + 0x00109869, 0x0511fc02, 0x6006d800, 0x05e9f03f, + 0x0501fa18, 0x0501f043, 0x05e9fc72, 0x59341403, + 0x82080580, 0x000007fc, 0x05020022, 0x4a026802, + 0x00fffffc, 0x0505fc11, 0x0500000c, 0x0509f8c1, + 0x0502000a, 0x0501f89a, 0x41780800, 0x4d400000, + 0x60028000, 0x0505ff9a, 0x5c028000, 0x60100800, + 0x05e9fba2, 0x0005f0e7, 0x60100800, 0x05e9fb9f, + 0x05d9fc1a, 0x59300c1f, 0x900405a1, 0x05000002, + 0x0005f0e7, 0x61f6880f, 0x42003000, 0x00fffffd, + 0x05e9fbc9, 0x05ce0c65, 0x4936600a, 0x497a6c12, + 0x640e601e, 0x64066203, 0x648a6403, 0x05f5f33d, + 0x59a80086, 0x8c000502, 0x0500000d, 0x05edfb89, + 0x60401000, 0x05020008, 0x59340002, 0x82000500, + 0x00ff0000, 0x82000580, 0x00ff0000, 0x05000004, + 0x60201000, 0x05edf8f7, 0x0502004a, 0x0505fbe3, + 0x0500004b, 0x0509f893, 0x05020005, 0x592c0405, + 0x8c00051c, 0x05fe07cc, 0x0501f869, 0x60140800, + 0x05e9fb76, 0x64066203, 0x640e6403, 0x05f5f321, + 0x59cc0408, 0x8c000518, 0x05000016, 0x0505fe51, + 0x05edfb6c, 0x05000008, 0x59cc0408, 0x8c000516, + 0x05000005, 0x5930041f, 0x900005a1, 0x05fe07ba, + 0x1c01f000, 0x59a8021b, 0x8400054a, 0x4803521b, + 0x4803541b, 0x59a8000f, 0x84000570, 0x48038832, + 0x5930041f, 0x900005a1, 0x05fe07af, 0x1c01f000, + 0x61bc1001, 0x480b500f, 0x497b8830, 0x84081570, + 0x480b8832, 0x0505fe54, 0x59a8021b, 0x84000548, + 0x4803521b, 0x4803541b, 0x050dfda8, 0x05fe07a2, + 0x599c0019, 0x8c000510, 0x05020029, 0x59a8021b, + 0x8400054c, 0x4803521b, 0x601c0800, 0x05e9fb47, + 0x417a7800, 0x05e9fb3a, 0x61a00001, 0x05f1fdcf, + 0x05e80b75, 0x05ce0c11, 0x4936600a, 0x59340200, + 0x8400051a, 0x48026a00, 0x600c0800, 0x05e9fb3b, + 0x64066407, 0x64066203, 0x640a6403, 0x05f5f2e5, + 0x05fdfe8b, 0x60040000, 0x0501f012, 0x599c0017, + 0x8c00050a, 0x05fc07ba, 0x60100800, 0x05e9fb2f, + 0x4937507d, 0x59a8021b, 0x8c000508, 0x05000008, + 0x599c0018, 0x8c00051c, 0x05000005, 0x61a00807, + 0x42001000, 0x0010c159, 0x05f5f93a, 0x0005f0e7, + 0x4933c857, 0x80003540, 0x05000003, 0x601c0800, + 0x05e9fb1e, 0x801831c0, 0x0502000b, 0x59302009, + 0x801021c0, 0x05000004, 0x58100405, 0x8c00051e, + 0x05020005, 0x59341c03, 0x60102000, 0x60483000, + 0x05e5f82a, 0x05d9fb8d, 0x0005f0e7, 0x4c5c0000, + 0x4d2c0000, 0x59325809, 0x05f1f986, 0x5c025800, + 0x59cc0008, 0x48002805, 0x59cc0009, 0x48002806, + 0x49782807, 0x49782808, 0x49782809, 0x4978280a, + 0x59cc0013, 0x8c00053e, 0x05000009, 0x59cc0414, + 0x900001c0, 0x59ccbc15, 0x805c0540, 0x48002807, + 0x59cc0416, 0x900001c0, 0x48002808, 0x59cc0017, + 0x8c00053e, 0x05000009, 0x59cc0418, 0x900001c0, + 0x59ccbc19, 0x805c0540, 0x48002809, 0x59cc041a, + 0x900001c0, 0x4800280a, 0x5c00b800, 0x1c01f000, + 0x4933c857, 0x59a80073, 0x90000594, 0x05020036, + 0x59a80086, 0x8c000502, 0x05000011, 0x05edfae1, + 0x60401000, 0x05020008, 0x59340002, 0x82000500, + 0x00ff0000, 0x82000580, 0x00ff0000, 0x05000008, + 0x60201000, 0x05edf84f, 0x05000005, 0x59a80086, + 0x8400054c, 0x48035086, 0x0501f023, 0x916c0583, + 0x05020008, 0x59300009, 0x80000540, 0x05020005, + 0x59341c03, 0x60182000, 0x604c3000, 0x05e1ffe3, + 0x05e9fbe3, 0x05fdfedf, 0x0501f9d0, 0x05020016, + 0x59340404, 0x80000540, 0x05000013, 0x60180800, + 0x05e9fac2, 0x0505fb25, 0x0500000d, 0x0505ffd5, + 0x05020007, 0x41780800, 0x4d400000, 0x60028000, + 0x0505feaf, 0x5c028000, 0x0005f0e7, 0x4a025a05, + 0x00000103, 0x4a025806, 0x02000000, 0x05d9fb2f, + 0x0005f0e7, 0x05e9ffde, 0x0505fb14, 0x05000005, + 0x0505ffc4, 0x05020003, 0x05fdfe01, 0x0005f0e7, + 0x05fdfdff, 0x0511fa22, 0x80000580, 0x59a80086, + 0x8c00050c, 0x05000004, 0x8400050c, 0x48035086, + 0x90000541, 0x05fdf77f, 0x4933c857, 0x59a80073, + 0x90000594, 0x05020006, 0x602c0800, 0x05e9fa9b, + 0x64066203, 0x64066403, 0x05f5f246, 0x60040000, + 0x05fdf774, 0x4933c857, 0x40003000, 0x59a80073, + 0x90000584, 0x05020006, 0x9018358b, 0x05020003, + 0x601c0800, 0x05e9fa8d, 0x0005f0e7, 0x60040000, + 0x05fdf768, 0x4803c857, 0x4d2c0000, 0x4d3c0000, + 0x0c01f804, 0x5c027800, 0x5c025800, 0x1c01f000, + 0x001064e5, 0x001066ac, 0x001064e5, 0x001066ef, + 0x001064e5, 0x0010673c, 0x001066a0, 0x001064e5, + 0x001064e5, 0x00106752, 0x001064e5, 0x0010675d, + 0x4933c857, 0x4d1c0000, 0x59301403, 0x90080583, + 0x05000006, 0x9008159e, 0x05020002, 0x0005f8e7, + 0x5c023800, 0x1c01f000, 0x05fdff82, 0x05fdf7fd, + 0x4933c857, 0x42000000, 0x0010987c, 0x0511fab0, + 0x0511f9df, 0x05e9fcea, 0x0505fac8, 0x05000007, + 0x0505ff78, 0x05020005, 0x6008b000, 0x0505ff5a, + 0x05fdfdb3, 0x0005f0e7, 0x0501f8ae, 0x05020020, + 0x417a7800, 0x05e9fa4e, 0x417a7800, 0x0201f800, + 0x0010b660, 0x42000000, 0x00109878, 0x0511fa9c, + 0x59340200, 0x84000558, 0x48026a00, 0x640a6403, + 0x600c3000, 0x0511f8fc, 0x8d0c0520, 0x0500000b, + 0x4d400000, 0x41782800, 0x60143000, 0x60a68000, + 0x050dfcc1, 0x5c028000, 0x641e6203, 0x64126407, + 0x64066422, 0x1c01f000, 0x600c0800, 0x05e9fa3f, + 0x64066203, 0x05f5f9eb, 0x05fdf7fb, 0x59cc0407, + 0x90000589, 0x05020009, 0x59340412, 0x82000500, + 0x000000ff, 0x0500000b, 0x80000040, 0x48026c12, + 0x642a6006, 0x05fdf7f0, 0x59cc0207, 0x82000500, + 0x0000ff00, 0x82000580, 0x00001900, 0x05fc07d3, + 0x05fdfd7f, 0x80000580, 0x05fdf706, 0x4933c857, + 0x0505fa8a, 0x0500000b, 0x0505ff3a, 0x05020009, + 0x4c580000, 0x6008b000, 0x0505ff1b, 0x5c00b000, + 0x05fdfd73, 0x601c0800, 0x05e9fa1c, 0x0005f0e7, + 0x05fdfd6f, 0x59cc3407, 0x82183500, 0x000000ff, + 0x90180585, 0x05000016, 0x9018058b, 0x05000011, + 0x59cc0207, 0x82000500, 0x0000ff00, 0x05020003, + 0x90180589, 0x0500000e, 0x82000580, 0x00001900, + 0x05020008, 0x90180589, 0x05000009, 0x60100800, + 0x05e9fa06, 0x05d9fa81, 0x0511f97d, 0x0005f0e7, + 0x0511f97b, 0x60040000, 0x05fdf6de, 0x0505fa63, + 0x59325809, 0x05000008, 0x592c0205, 0x82000580, + 0x00000139, 0x05fc07f7, 0x592c0405, 0x8c00051e, + 0x05fe07f4, 0x59340412, 0x800001c0, 0x05000006, + 0x80000040, 0x48026c12, 0x642a6006, 0x645a6403, + 0x1c01f000, 0x59340403, 0x82000580, 0x000007fe, + 0x05020006, 0x59a8021b, 0x84000540, 0x4803521b, + 0x05e5ff67, 0x05fdf7e3, 0x0511f95d, 0x417a7800, + 0x0201f800, 0x0010b660, 0x60143000, 0x0511f88e, + 0x42000000, 0x00109878, 0x0511fa25, 0x05fdf7da, + 0x4933c857, 0x0501f838, 0x05020006, 0x60140800, + 0x05e9f9d6, 0x64066203, 0x640e6403, 0x05f5f181, + 0x60100800, 0x05e9f9d1, 0x0505fee6, 0x05020007, + 0x4c580000, 0x6008b000, 0x0505fec7, 0x5c00b000, + 0x05fdfd1f, 0x0005f0e7, 0x05fdfd1d, 0x0511f940, + 0x80000580, 0x05fdf6a3, 0x4933c857, 0x0501f822, + 0x05020006, 0x60240800, 0x05e9f9c0, 0x64066203, + 0x64166403, 0x05f5f16b, 0x0511f935, 0x60040000, + 0x05fdf698, 0x4933c857, 0x0501f817, 0x05020006, + 0x602c0800, 0x05e9f9b5, 0x64066203, 0x64066403, + 0x05f5f160, 0x0511f92a, 0x60040000, 0x05fdf68d, + 0x4933c857, 0x59cc0407, 0x90000583, 0x05020009, + 0x59cc0207, 0x82000500, 0x0000ff00, 0x82000d80, + 0x00002a00, 0x05000003, 0x82000d80, 0x00001e00, + 0x1c01f000, 0x4933c857, 0x90000541, 0x1c01f000, + 0x4933c857, 0x4d400000, 0x4c580000, 0x59a8021b, + 0x90000543, 0x4803521b, 0x0501f853, 0x05000005, + 0x4d300000, 0x4d340000, 0x4d440000, 0x0501f01b, + 0x0501f879, 0x05000027, 0x4d300000, 0x4d340000, + 0x4d440000, 0x59cc0408, 0x8c00051e, 0x05020004, + 0x59a8021b, 0x84000552, 0x4803521b, 0x8d0c0520, + 0x05000005, 0x60aa8000, 0x61fe89ff, 0x60083000, + 0x0511f841, 0x60aa8000, 0x4d3c0000, 0x60027804, + 0x0201f800, 0x0010b5e0, 0x5c027800, 0x42000000, + 0x00109878, 0x0511f9c2, 0x0201f800, 0x0010b84b, + 0x6040b000, 0x61c2880f, 0x83440580, 0x000007fe, + 0x05000002, 0x05e9f9fe, 0x81468800, 0x8058b040, + 0x05fe07fa, 0x5c028800, 0x5c026800, 0x5c026000, + 0x05e9fa28, 0x59cc0800, 0x82040d00, 0x00ffffff, + 0x4807500f, 0x80040110, 0x48035018, 0x48038881, + 0x59a80a1b, 0x84040d50, 0x59cc0013, 0x8c00053e, + 0x05000003, 0x8c000536, 0x05000004, 0x59cc0017, + 0x8c000536, 0x05020002, 0x84040d10, 0x4807521b, + 0x4807541b, 0x59cc0408, 0x8c000518, 0x05000004, + 0x4c040000, 0x0509f9e3, 0x5c000800, 0x05edf94d, + 0x05000006, 0x59cc0009, 0x48035028, 0x59cc000a, + 0x48035029, 0x0505fc2b, 0x5c00b000, 0x5c028000, + 0x1c01f000, 0x4933c857, 0x59a8141b, 0x82080580, + 0x0000ffff, 0x0500000b, 0x4c080000, 0x05edf93d, + 0x5c001000, 0x0502000b, 0x59cc0408, 0x8c000518, + 0x05000005, 0x8c08050a, 0x0500000a, 0x80000580, + 0x1c01f000, 0x8c080508, 0x05fe07fd, 0x0501f005, + 0x90080530, 0x05020003, 0x8c080506, 0x05fe07f8, + 0x4a03541b, 0x0000ffff, 0x42000000, 0x001097c5, + 0x0511f973, 0x60303000, 0x61fc19ff, 0x601c2000, + 0x05e1fe3e, 0x4d400000, 0x4d3c0000, 0x60043000, + 0x050dffe1, 0x60aa8000, 0x60027804, 0x0201f800, + 0x0010b5e0, 0x5c028000, 0x5c027800, 0x90000541, + 0x1c01f000, 0x4933c857, 0x4c580000, 0x59a80018, + 0x800001c0, 0x0500001b, 0x59cc1000, 0x82081500, + 0x00ffff00, 0x80081110, 0x80080580, 0x05000004, + 0x42000000, 0x0010985b, 0x0501f010, 0x91cc140b, + 0x6008b000, 0x91341c06, 0x0501f829, 0x05000004, + 0x42000000, 0x0010985c, 0x0501f008, 0x91cc140d, + 0x6008b000, 0x91341c08, 0x0501f821, 0x05000005, + 0x42000000, 0x0010985d, 0x0511f945, 0x90000541, + 0x5c00b000, 0x1c01f000, 0x4933c857, 0x59cc0206, + 0x90000594, 0x05020015, 0x59cc0407, 0x82000580, + 0x00000800, 0x05020011, 0x59cc0207, 0x8c00051a, + 0x0500000d, 0x82000500, 0x00000f00, 0x82000580, + 0x00000100, 0x05020008, 0x59cc020a, 0x8c000508, + 0x05020003, 0x8c00050a, 0x05000003, 0x80000580, + 0x1c01f000, 0x90000541, 0x1c01f000, 0x5c000000, + 0x4c000000, 0x4803c857, 0x480bc857, 0x480fc857, + 0x485bc857, 0x50080800, 0x500c0000, 0x80042580, + 0x05020007, 0x80081000, 0x800c1800, 0x8058b040, + 0x05fe07f9, 0x80000580, 0x1c01f000, 0x4803c857, + 0x4807c857, 0x480bc857, 0x480fc857, 0x80040480, + 0x05001004, 0x60040000, 0x90040d41, 0x1c01f000, + 0x41780000, 0x05fdf7fd, 0xb1380493, 0x05ce1993, + 0xb138048b, 0x05cc1991, 0x0c01f001, 0x00106860, + 0x00106860, 0x00106860, 0x00106860, 0x0010685f, + 0x0010685f, 0x0010685f, 0x00106860, 0x05cdf987, + 0x493bc857, 0x64366203, 0x493a6403, 0x42000800, + 0x80000000, 0x0005f07c, 0x91380593, 0x05020005, + 0x59300403, 0xb0000590, 0x05ce097c, 0x0005f0e7, + 0x4933c857, 0x913805a7, 0x05020026, 0x4933c857, + 0x05f5f8b9, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010b660, 0x5c027800, 0x42000000, 0x00109878, + 0x0511f8e7, 0x4d2c0000, 0x59325809, 0x0505f8ff, + 0x492fc857, 0x0500000b, 0x4a025a05, 0x00000103, + 0x59300c02, 0x48065c07, 0x64a65a07, 0x497a580a, + 0x592c0c09, 0x84040d50, 0x48065c09, 0x0001fb2c, + 0x5c025800, 0x60543000, 0x41782800, 0x600c2000, + 0x4d400000, 0x4d440000, 0x59368c03, 0x60a68000, + 0x0505ffd3, 0x5c028800, 0x5c028000, 0x0005f0e7, + 0x91380594, 0x05020009, 0x59300403, 0xb0000c93, + 0x05ce194e, 0xb0000480, 0x05cc194c, 0x4933c857, + 0x4803c857, 0x0c01f009, 0xb1380593, 0x05000006, + 0xb1380588, 0x05ce0945, 0x59300403, 0xb0000590, + 0x05ce0942, 0x1c01f000, 0x001068ba, 0x001068b9, + 0x001068b9, 0x001068b9, 0x001068b9, 0x001068b9, + 0x001068b9, 0x001068b9, 0x001068b9, 0x001068b9, + 0x001068b9, 0x001068ca, 0x001068ca, 0x001068ca, + 0x001068ca, 0x001068b9, 0x001068ca, 0x001068b9, + 0x001068ca, 0x05cdf92d, 0x4933c857, 0x05f5f86e, + 0x0505f8be, 0x000400e7, 0x4d2c0000, 0x59325809, + 0x4a025a05, 0x00000103, 0x59300402, 0x48025c07, + 0x641a5a07, 0x497a580a, 0x0001fb2c, 0x5c025800, + 0x0505f982, 0x0005f0e7, 0x4933c857, 0x05f5f85e, + 0x0005f0e7, 0x05cdf919, 0x5930001e, 0x800001c0, + 0x05060f82, 0x59300004, 0x8c00053e, 0x05020027, + 0x0509f826, 0x050200a6, 0x59325809, 0x592c0c09, + 0x59cc2808, 0x82141d00, 0x00000c00, 0x05000002, + 0x59cc1809, 0x84040d58, 0x48065c09, 0x82143500, + 0x00000fff, 0x05020020, 0x59340200, 0x8c00050e, + 0x0502008d, 0x0005f987, 0x05020005, 0x64025a07, + 0x59300813, 0x800409c0, 0x05020955, 0x4a025a05, + 0x00000103, 0x48065808, 0x480e580b, 0x901409c0, + 0x4806580a, 0x59300c02, 0x48065c07, 0x0505fd3e, + 0x0001fb2c, 0x05e9fb08, 0x59cc0008, 0x8c000518, + 0x050601f6, 0x0005f0e7, 0x05f5fc0b, 0x05fc07d9, + 0x4d3c0000, 0x600a7800, 0x0501fd45, 0x5c027800, + 0x05fdf7d4, 0x4817c857, 0x480fc857, 0x82180500, + 0x000000ff, 0x0500000b, 0x592c0205, 0x82000500, + 0x000000ff, 0xb0000588, 0x05020006, 0x592c0408, + 0x800001c0, 0x05000003, 0x0505fe58, 0x0505f68f, + 0x82180d00, 0x00000c00, 0x05000004, 0x59340200, + 0x8c00050e, 0x0502004b, 0x64025a07, 0x41782000, + 0x8c180510, 0x05000009, 0x59cc200b, 0x801021c0, + 0x05000006, 0x59cc000c, 0x82000500, 0x000000ff, + 0x05000002, 0x4803c857, 0x4812580d, 0x41780000, + 0x8c180512, 0x05000002, 0x59cc000a, 0x4802580c, + 0x80100c00, 0x05fc07bc, 0x9004149d, 0x05001005, + 0x592c0405, 0x8c00051e, 0x0500001c, 0x60700800, 0x4c040000, 0x4c0c0000, 0x4c140000, 0x0005f987, 0x05020005, 0x64025a07, 0x59300813, 0x800409c0, - 0x050208ed, 0x48065808, 0x5c002800, 0x5c001800, - 0x59301402, 0x480a5c07, 0x480e580b, 0x901401c0, - 0x4802580a, 0x0505fcca, 0x5c000800, 0x0501fc46, - 0x0501fc72, 0x05fdf796, 0x592c020b, 0x8c000502, - 0x05fc07b4, 0x592c0209, 0x8c00050e, 0x05fe07b1, - 0x59300013, 0x800c0d80, 0x05fc07ae, 0x4803c857, - 0x480fc857, 0x8c180514, 0x050401af, 0x80000540, - 0x05fc07a8, 0x4807c856, 0x0505f1ab, 0x592c020b, - 0x8c000502, 0x05fc0772, 0x59300013, 0x800001c0, - 0x05fc0771, 0x592c0209, 0x8c00050e, 0x05fe076e, - 0x0505f1a1, 0x1c01f000, 0x59cc2006, 0x59cc2807, - 0x0501f037, 0x0501f036, 0x1c01f000, 0x4933c857, - 0x59300004, 0x8c00053e, 0x0502002d, 0x5930001e, - 0x800001c0, 0x05060ebf, 0x59325809, 0x592c0c09, - 0x41782800, 0x41781800, 0x84040d58, 0x48065c09, - 0x41783000, 0x59340200, 0x8c00050e, 0x05020015, - 0x0005f987, 0x05020006, 0x64025a07, 0x59300813, - 0x4807c857, 0x800409c0, 0x050208a7, 0x4a025a05, + 0x05020907, 0x5c002800, 0x5c001800, 0x4a025a05, 0x00000103, 0x48065808, 0x480e580b, 0x901409c0, - 0x4806580a, 0x4933c857, 0x59300c02, 0x48065c07, - 0x0505fc83, 0x0001fb2c, 0x05e9fad0, 0x0005f0e7, - 0x592c020b, 0x8c000502, 0x05fc07ea, 0x59300013, - 0x4803c857, 0x800001c0, 0x05fc07e8, 0x592c0209, - 0x8c00050e, 0x05fe07e5, 0x0505f16b, 0x05f5fb52, - 0x05fc07d3, 0x4933c857, 0x1c01f000, 0x4c5c0000, - 0x4c600000, 0x4010b800, 0x4014c000, 0x5930001e, - 0x800001c0, 0x4c140000, 0x05060e8a, 0x5c002800, - 0x59325809, 0x592c020b, 0x8c000502, 0x05020020, - 0x8c000500, 0x05000025, 0x640a6203, 0x650e6403, - 0x405c0000, 0x592c0810, 0x80040c80, 0x40600000, - 0x80040480, 0x0500101a, 0x8060c1c0, 0x05000011, - 0x59300004, 0x8c00053e, 0x0502000a, 0x485e6015, - 0x48626013, 0x497a6205, 0x5c00c000, 0x5c00b800, - 0x05d1fa9a, 0x0502000c, 0x59300804, 0x0005f072, - 0x4c140000, 0x05f5fb28, 0x5c002800, 0x05fc07f4, - 0x5c00c000, 0x5c00b800, 0x05f9f4e4, 0x5c00c000, - 0x5c00b800, 0x4933c857, 0x1c01f000, 0x4807c857, - 0x4004c000, 0x05fdf7e5, 0x4803c857, 0x05fdf7f5, - 0xb1380498, 0x05021004, 0xb1380480, 0x05001002, - 0x0c01f002, 0x1c01f000, 0x0010697e, 0x0010697e, - 0x0010697e, 0x0010697e, 0x0010697e, 0x0010697e, - 0x0010697e, 0x0010697e, 0x0010697e, 0x0010697e, - 0x0010697f, 0x0010697e, 0x0010697e, 0x0010697e, - 0x0010697e, 0x00106989, 0x0010697e, 0x0010697e, - 0x0010697e, 0x0010697e, 0x001069ad, 0x0010697e, - 0x0010697e, 0x0010697e, 0x05cdf868, 0x4933c857, - 0x05f5f981, 0x640a6203, 0x59a8002c, 0x48026205, - 0x59300013, 0x59300817, 0x80040c80, 0x48066017, - 0x05f1f6f8, 0x4933c857, 0x05f1fef6, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010b652, 0x5c027800, - 0x42000000, 0x001097f8, 0x050dff03, 0x0501ff51, - 0x0500000e, 0x4d2c0000, 0x59325809, 0x4a025a05, - 0x00000103, 0x59300402, 0x48025c07, 0x64a65a07, - 0x497a580a, 0x592c0c09, 0x84040d50, 0x48065c09, - 0x0001fb2c, 0x5c025800, 0x60503000, 0x41782800, - 0x4d400000, 0x4d440000, 0x59368c03, 0x60082000, - 0x60a68000, 0x0505fe24, 0x5c028800, 0x5c028000, - 0x0005f0e7, 0x4933c857, 0x59300809, 0x4978080a, - 0x4978080b, 0x58041409, 0x84081558, 0x48080c09, - 0x1c01f000, 0x4807c857, 0x8c04053e, 0x05020022, - 0x497a5a07, 0x59300021, 0x80000540, 0x05000017, - 0x497a5a07, 0x4c040000, 0x4c080000, 0x4c0c0000, - 0x4c100000, 0x4c140000, 0x40002800, 0x58141003, - 0x40040000, 0x80081480, 0x48082803, 0x40140000, - 0x05d1f838, 0x5c002800, 0x5c002000, 0x5c001800, - 0x5c001000, 0x5c000800, 0x592c0207, 0x80000540, - 0x05020008, 0x0501f005, 0x592c0409, 0x8c00051c, - 0x05000002, 0x592c0803, 0x4807c857, 0x64565a07, - 0x1c01f000, 0x59300021, 0x80000540, 0x05000007, - 0x64465a07, 0x59300021, 0x4c040000, 0x05d1f821, - 0x5c000800, 0x05fdf7f7, 0x4807c856, 0x641e5a07, - 0x1c01f000, 0xb1380498, 0x05021006, 0xb1380480, - 0x05001004, 0x4d2c0000, 0x0c01f803, 0x5c025800, - 0x1c01f000, 0x00106a05, 0x00106a05, 0x00106a05, - 0x00106a05, 0x00106a05, 0x00106a07, 0x00106a06, - 0x00106a05, 0x00106a7b, 0x00106a05, 0x00106a05, - 0x00106a05, 0x00106a05, 0x00106a05, 0x00106a05, - 0x00106a05, 0x00106a05, 0x00106a05, 0x00106a05, - 0x00106b2c, 0x00106b50, 0x00106b33, 0x00106a06, - 0x00106b59, 0x05c9ffe1, 0x1c01f000, 0x5930001e, - 0x800001c0, 0x05060db3, 0x59300008, 0x8c00050e, - 0x0500006e, 0x8c000500, 0x05000060, 0x8c00051c, - 0x05000008, 0x84000500, 0x48026008, 0x59325809, - 0x592c3c09, 0x841c3d58, 0x481e5c09, 0x0005f13e, - 0x59325809, 0x592c3c09, 0x841c3d58, 0x59300008, - 0x8c00051c, 0x05fe07f4, 0x481e5c09, 0x60140000, - 0x40000000, 0x80000040, 0x05fe07fe, 0x59300008, - 0x8c00051c, 0x05fe07ec, 0x59cc0808, 0x592c0205, - 0x82000500, 0x000000ff, 0xb0000588, 0x0502000a, - 0x497a580c, 0x82040500, 0x000000ff, 0x05000006, - 0x592c0408, 0x800001c0, 0x05000003, 0x0505fc9d, - 0x05d1f0a1, 0x900421c0, 0x4812580a, 0x41782000, - 0x82040500, 0x00000c00, 0x05000002, 0x59cc2009, - 0x82043500, 0x00000fff, 0x0502001e, 0x481e5c09, - 0x64025a07, 0x801831c0, 0x05d00093, 0x41782000, - 0x8c180510, 0x05000002, 0x59cc200b, 0x4812580d, - 0x41780000, 0x8c180512, 0x05000002, 0x59cc000a, - 0x4802580c, 0x80100c00, 0x05c81f98, 0x05d00086, - 0x9004149d, 0x05021009, 0x4c500000, 0x4c540000, - 0x91cca40c, 0x912cac0e, 0x0501fb07, 0x5c00a800, - 0x5c00a000, 0x05d1f07c, 0x0501fabf, 0x05d1f07a, - 0x412c7800, 0x05cdfb0b, 0x05c80f88, 0x492c780a, - 0x841c3d52, 0x481c7c09, 0x4a025a05, 0x00000103, - 0x4812580b, 0x900401c0, 0x4802580a, 0x583c0405, - 0x583c1006, 0x583c2209, 0x48025c05, 0x480a5806, - 0x48125a09, 0x05fdf7d2, 0x8c000524, 0x05fc07a2, - 0x59325809, 0x4c000000, 0x592c0409, 0x8c00051c, - 0x5c000000, 0x05020003, 0x4a026013, 0xffffffff, - 0x84000524, 0x05fdf798, 0x1c01f000, 0x59a8002c, - 0x48026205, 0x59325809, 0x640a6203, 0x592c2409, - 0x59300808, 0x4933c857, 0x4807c857, 0x592c0205, - 0x82000500, 0x000000ff, 0xb0000588, 0x05020003, - 0x8c100500, 0x0506047f, 0x64025a07, 0x8c04051e, - 0x05000022, 0x41780800, 0x497a580a, 0x592c1c0a, - 0x59300013, 0x59341200, 0x497a6205, 0x8c08050e, - 0x05020062, 0x4807c857, 0x4806580b, 0x80000d40, - 0x05fe0f1d, 0x59300402, 0x48025c07, 0x48065808, - 0x4a025a05, 0x00000103, 0x4c040000, 0x4c0c0000, - 0x4c100000, 0x0505fafa, 0x5c002000, 0x5c001800, - 0x5c000800, 0x8c100512, 0x05020016, 0x4c0c0000, - 0x0001fb2c, 0x05e9f941, 0x5c001800, 0x8c0c0518, - 0x000400e7, 0x0501f7ab, 0x4813c857, 0x8c100518, - 0x05000044, 0x41780800, 0x592c1c0a, 0x820c0580, - 0x00001000, 0x05fc07db, 0x8c100512, 0x05fc07d9, - 0x592c780a, 0x583c080b, 0x583c1c0a, 0x05fdf7d5, - 0x4807c857, 0x592c780a, 0x59300402, 0x592c1405, - 0x8c08051e, 0x0502000c, 0x592c1207, 0x48007c07, - 0x48047808, 0x48087a07, 0x84102512, 0x48107c09, - 0x4c0c0000, 0x05cdfab8, 0x403e5800, 0x0501fa7b, - 0x05fdf7dd, 0x48025c07, 0x48065808, 0x583c080d, - 0x583c000c, 0x80040c00, 0x9004149d, 0x05001005, - 0x583c1001, 0x480a5801, 0x49787801, 0x60700800, - 0x90040c14, 0x4c0c0000, 0x4c500000, 0x4c540000, - 0x903ca409, 0x912cac09, 0x4c100000, 0x4c3c0000, - 0x0501fa7d, 0x5c007800, 0x5c002000, 0x5c00a800, - 0x5c00a000, 0x84102512, 0x48125c09, 0x403e5800, - 0x05cdfa99, 0x0505fab2, 0x42034000, 0x00109410, - 0x59a1d806, 0x80edd9c0, 0x05c80ef8, 0x48efc857, - 0x58ec0008, 0x4803c857, 0x0801f800, 0x05fdf7b6, - 0x4933c857, 0x1c01f000, 0x59301416, 0x480bc857, - 0x8c08051c, 0x0502000e, 0x80000540, 0x4803c857, - 0x05fc0799, 0x80042c80, 0x05fe1797, 0x8c080514, - 0x05020005, 0x592c0810, 0x4807c857, 0x80040480, - 0x48026018, 0x8408155c, 0x480a6416, 0x59301008, - 0x8408151e, 0x480a6008, 0x4c100000, 0x4c3c0000, - 0x4d400000, 0x592e8207, 0x64065a07, 0x0505fa8c, - 0x49425a07, 0x5c028000, 0x5c007800, 0x5c002000, - 0x497a580a, 0x8c100512, 0x05000005, 0x4d2c0000, - 0x403e5800, 0x05cdfa68, 0x5c025800, 0x82102500, - 0xffffedff, 0x48125c09, 0x59301006, 0x800811c0, - 0x05000771, 0x59a8002c, 0x80080480, 0x0502176e, - 0x4a025a05, 0x00000103, 0x641a5a07, 0x497a5c0a, - 0x492fc857, 0x0001fb2c, 0x05e9f8c0, 0x0005f0e7, - 0x59325809, 0x592c0409, 0x8c000518, 0x05000003, - 0x412df800, 0x05cdf7bc, 0x1c01f000, 0x4933c857, - 0x59325809, 0x497a580a, 0x64025a07, 0x4a025a05, - 0x00000103, 0x59300813, 0x4807c857, 0x800409c0, - 0x05020008, 0x48065808, 0x59300c02, 0x48065c07, - 0x0505fa5b, 0x0001fb2c, 0x05e9f8a8, 0x0005f0e7, - 0x59340200, 0x8c00050e, 0x05020005, 0x59300813, - 0x05fdfe6d, 0x48065808, 0x05fdf7f4, 0x592c0209, - 0x8c00050e, 0x05fe07fa, 0x4933c857, 0x0501f742, - 0x4933c857, 0x59325809, 0x812e59c0, 0x05c80e93, - 0x592c020b, 0x8c000502, 0x05c80e90, 0x640a6006, - 0x1c01f000, 0x5930001e, 0x800001c0, 0x05060c61, - 0x59300008, 0x4933c857, 0x4803c857, 0x8c00050e, - 0x05000032, 0x8c000500, 0x05000024, 0x8c00051c, - 0x05000009, 0x84000500, 0x48026008, 0x59325809, - 0x592c3c09, 0x481fc857, 0x841c3d58, 0x481e5c09, - 0x0005f13e, 0x59325809, 0x592c3c09, 0x841c3d58, - 0x59300008, 0x8c00051c, 0x05fe07f3, 0x481e5c09, - 0x60140000, 0x40000000, 0x80000040, 0x05fe07fe, - 0x59300008, 0x8c00051c, 0x05fe07eb, 0x592c0205, - 0x82000500, 0x000000ff, 0xb0000588, 0x05020003, - 0x497a580c, 0x0501f002, 0x497a580a, 0x481e5c09, - 0x64025a07, 0x05cdf750, 0x8c000524, 0x05fc07de, - 0x59325809, 0x4c000000, 0x592c0409, 0x8c00051c, - 0x5c000000, 0x05020003, 0x4a026013, 0xffffffff, - 0x84000524, 0x05fdf7d4, 0x1c01f000, 0x4933c857, - 0x41780800, 0xb1380498, 0x05021009, 0xb1380480, - 0x05001007, 0x4d2c0000, 0x59325809, 0x812e59c0, - 0x0c020805, 0x5c025800, 0x0005f0e7, 0x493bc857, - 0x1c01f000, 0x00106bb9, 0x00106bb9, 0x00106bb9, - 0x00106bb9, 0x00106bb9, 0x00106bba, 0x00106bb9, - 0x00106bb9, 0x00106bb9, 0x00106bb9, 0x00106bb9, - 0x00106bb9, 0x00106bb9, 0x00106bb9, 0x00106bb9, - 0x00106bb9, 0x00106bb9, 0x00106bb9, 0x00106bb9, - 0x00106bb9, 0x00106bbd, 0x00106bb9, 0x00106bb9, - 0x00106bb9, 0x05c9fe2d, 0x59cc0808, 0x497a5808, - 0x4807c857, 0x59300402, 0x48025c07, 0x4a025a05, - 0x00000103, 0x900401c0, 0x4802580a, 0x64025a07, - 0x800409c0, 0x0000032c, 0x59cc0009, 0x4802580b, - 0x82042500, 0x00000100, 0x05000002, 0x59cc200b, - 0x4812580d, 0x82040500, 0x00000200, 0x05000002, - 0x59cc000a, 0x4802580c, 0x80100c00, 0x05c81e13, - 0x0000032c, 0x9004149d, 0x05001005, 0x592c0405, - 0x8c00051e, 0x0500000a, 0x60700800, 0x4c500000, - 0x4c540000, 0x91cca40c, 0x912cac0e, 0x0501f97e, - 0x5c00a800, 0x5c00a000, 0x0001f32c, 0x0501f936, - 0x0501f162, 0x83380480, 0x00000093, 0x05ca1dff, - 0x83380480, 0x00000085, 0x05c81dfc, 0x0c01f001, - 0x00106bfa, 0x00106bf9, 0x00106bf9, 0x00106bff, - 0x00106bf9, 0x00106bf9, 0x00106bf9, 0x00106bf9, - 0x00106bf9, 0x00106bf9, 0x00106bf9, 0x00106bf9, - 0x00106bf9, 0x05c9fded, 0x64066203, 0x493a6403, - 0x42000800, 0x80000040, 0x0005f07c, 0x83300580, - 0x0010cc5c, 0x05ca0de5, 0x4933c857, 0x59cc1404, - 0x0505f84e, 0x05000023, 0x591c0203, 0x90000580, - 0x05000020, 0x591c000a, 0x81340580, 0x0502001d, - 0x59cc1204, 0x82080580, 0x0000ffff, 0x05000007, - 0x591c0202, 0x82000d80, 0x0000ffff, 0x05000003, - 0x80080580, 0x05020013, 0x4d300000, 0x4d1c0000, - 0x411e6000, 0x0501f98e, 0x5c023800, 0x5c026000, - 0x0500000a, 0x59cc0005, 0x8c000500, 0x05020003, - 0x0501f944, 0x0501f002, 0x640a3a03, 0x4a026403, - 0x00000086, 0x0501f005, 0x0501f974, 0x05fc07f6, - 0x4a026403, 0x00000087, 0x4d2c0000, 0x050dfb0c, - 0x05e9faa8, 0x5c025800, 0x59340200, 0x8c00050e, - 0x0500000b, 0x59cc1404, 0x0505f820, 0x05000008, - 0x591c0416, 0x8c00051a, 0x05000005, 0x4d300000, - 0x411e6000, 0x0501fe6a, 0x5c026000, 0x1c01f000, - 0x91380593, 0x0502000a, 0x59300403, 0x4803c857, - 0x82000d80, 0x00000086, 0x0500000c, 0x82000d80, - 0x00000087, 0x05ca0da1, 0x0501f008, 0x913805a7, - 0x05000003, 0x91380594, 0x05ca0d9c, 0x493bc857, - 0x05f1fc51, 0x05f9f188, 0x4933c857, 0x0005f0e7, - 0x91380593, 0x05020006, 0x59300403, 0x4803c857, - 0x82000480, 0x00000085, 0x0c01f03d, 0x913805a7, - 0x05020035, 0x4933c857, 0x05f1fc43, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010b652, 0x5c027800, - 0x60543000, 0x41782800, 0x600c2000, 0x60a68000, - 0x4d400000, 0x4d440000, 0x59368c03, 0x0505fb66, - 0x5c028800, 0x5c028000, 0x42000000, 0x001097f8, - 0x050dfc29, 0x0501fc77, 0x000400e7, 0x4d2c0000, - 0x59325809, 0x592c0205, 0x82000500, 0x000000ff, - 0x90000594, 0x05020d3f, 0x4a025a05, 0x00000103, - 0x59300402, 0x48025c07, 0x497a580a, 0x49425a07, - 0x0001fb2c, 0x5c025800, 0x0005f0e7, 0x83380580, - 0x00000089, 0x05000004, 0x83380580, 0x0000008a, - 0x05fa01b6, 0x05f1fff4, 0x05fa01b4, 0x59300a03, - 0x9004058a, 0x05000022, 0x9004058c, 0x05000020, - 0x05c9fd5a, 0x91380594, 0x05fe07f1, 0x4933c857, - 0x05f1fc0d, 0x601a8000, 0x05fdf7db, 0x00106ca1, - 0x00106ca0, 0x00106ca0, 0x00106ca0, 0x00106ca0, - 0x00106ca0, 0x00106ca6, 0x00106ca0, 0x00106ca0, - 0x00106ca0, 0x00106ca0, 0x00106ca0, 0x00106ca0, - 0x05c9fd46, 0x4933c857, 0x59a8002a, 0x48026006, - 0x642a6203, 0x1c01f000, 0x4933c857, 0x59a8002a, - 0x48026006, 0x64326203, 0x1c01f000, 0x5932680a, - 0x83380580, 0x00000089, 0x05000007, 0x83380580, - 0x0000008a, 0x0500001f, 0x4933c857, 0x493bc857, - 0x05f9f186, 0x4933c857, 0x59325809, 0x59300a1f, - 0x90040583, 0x05020007, 0x0501fc2a, 0x0500000d, - 0x0001fb2c, 0x05e5ff2d, 0x497a6009, 0x0501f009, - 0x5930021f, 0x90000581, 0x05020006, 0x59300c18, - 0x900405b9, 0x05000016, 0x900405b5, 0x05000014, - 0x59cc0c07, 0x4806641b, 0x59cc0a07, 0x4806621b, - 0x59300203, 0x4802641f, 0x64466203, 0x05f9f106, - 0x4933c857, 0x5930021f, 0x90000581, 0x0502003c, - 0x59300c18, 0x900405b5, 0x05000005, 0x9004059e, - 0x05000003, 0x900405b9, 0x05020035, 0x4933c857, - 0x4c5c0000, 0x4c600000, 0x4d1c0000, 0x4130b800, - 0x4004c000, 0x0501ff29, 0x05020028, 0x906005b5, - 0x05020004, 0x591c0c16, 0x8c040502, 0x05000023, - 0x05f9f91f, 0x05000021, 0x491fc857, 0x4933c857, - 0x906005b5, 0x05000003, 0x906005b9, 0x05020002, - 0x4932381e, 0x48626403, 0x64066203, 0x64066407, - 0x585c080a, 0x4807c857, 0x4806600a, 0x585c0c17, - 0x4807c857, 0x48066417, 0x585c0a17, 0x4807c857, - 0x48066217, 0x585c0a18, 0x4807c857, 0x48066218, - 0x585c0c1b, 0x4807c857, 0x4806641b, 0x585c0a1b, - 0x4807c857, 0x4806621b, 0x491e6020, 0x42000800, - 0x80000040, 0x0005f87c, 0x405e6000, 0x5c023800, - 0x5c00c000, 0x5c00b800, 0x0005f0e7, 0x0501fbd5, - 0x05000008, 0x4d2c0000, 0x59325809, 0x0001fb2c, - 0x5930021f, 0x90000583, 0x05e40ed4, 0x5c025800, - 0x0005f0e7, 0x4803c856, 0x4c500000, 0x4c540000, - 0x412c7800, 0x4c3c0000, 0x60042800, 0x82040480, - 0x00000101, 0x05001002, 0x60000802, 0x40043000, - 0x60700800, 0x91cca40c, 0x912cac0e, 0x0501f836, - 0x9018349c, 0x592e5801, 0x812e59c0, 0x05ce0856, - 0x05cdf83c, 0x05000011, 0x80142800, 0x4a025805, - 0x00000110, 0x492c7801, 0x90180cbd, 0x05021005, - 0x40180800, 0x912cac06, 0x0501f827, 0x0501f007, - 0x901834bc, 0x60f00800, 0x412c7800, 0x912cac06, - 0x0501f821, 0x05fdf7ef, 0x5c007800, 0x841429c0, - 0x90142d43, 0x48147a05, 0x403e5800, 0x5c00a800, - 0x5c00a000, 0x1c01f000, 0x492fc857, 0x812e59c0, - 0x0500000d, 0x4d2c0000, 0x4c3c0000, 0x592c7801, - 0x803c79c0, 0x05000005, 0x497a5801, 0x0001fb2c, - 0x403e5800, 0x05fdf7fa, 0x5c007800, 0x0001fb2c, - 0x5c025800, 0x1c01f000, 0x4803c856, 0x4c580000, - 0x90040403, 0x8000b104, 0x050dfc05, 0x5c00b000, - 0x1c01f000, 0x4803c856, 0x4c580000, 0x90040c03, - 0x8004b104, 0x050dfbfe, 0x5c00b000, 0x1c01f000, - 0x591c0c07, 0x90040583, 0x05000005, 0x90040582, - 0x05000003, 0x9004058a, 0x05020021, 0x4d300000, - 0x4d2c0000, 0x411e6000, 0x59325809, 0x0501fb75, - 0x05000018, 0x59300c07, 0x9004058a, 0x05000019, - 0x90040583, 0x05020007, 0x592c0a05, 0x82040d00, - 0x000000ff, 0x90040d94, 0x05000002, 0x640e621f, - 0x0501f813, 0x4d400000, 0x604e8000, 0x592c0a09, - 0x84040d54, 0x05e9f9bf, 0x5c028000, 0x0505f818, - 0x0001fb2c, 0x5930021f, 0x90000583, 0x05000c2d, - 0x05f9f84d, 0x5c025800, 0x5c026000, 0x1c01f000, - 0x644e5a07, 0x642a621f, 0x05fdf7f5, 0x592c0409, - 0x8c000512, 0x05000008, 0x84000512, 0x48025c09, - 0x4d2c0000, 0x592e580a, 0x05c9ffeb, 0x5c025800, - 0x497a580a, 0x1c01f000, 0x59cc0005, 0x8c000500, - 0x0502000a, 0x591c0407, 0x90000582, 0x05020007, - 0x591c0c03, 0x82040580, 0x00000085, 0x05000003, - 0x82040580, 0x0000008b, 0x1c01f000, 0x4933c857, - 0x4d3c0000, 0x600a7800, 0x59300407, 0x90000c92, - 0x05ca1c3a, 0x0c01f808, 0x5c027800, 0x1c01f000, - 0x4933c857, 0x59300407, 0x90000c92, 0x05ca1c33, - 0x0c01f001, 0x00106dcb, 0x00106dc8, 0x00106dc8, - 0x00106df0, 0x00106dc7, 0x00106dc8, 0x00106ddc, - 0x00106dc8, 0x00106dc7, 0x00106dc7, 0x001078cf, - 0x00106dc8, 0x00106dc8, 0x00106dc7, 0x00106dc7, - 0x00106dc7, 0x00106ec3, 0x00106dc8, 0x05c9fc1f, - 0x4803c856, 0x80000580, 0x1c01f000, 0x4803c856, - 0x8d3c0502, 0x0502000e, 0x0501fb16, 0x0500000a, - 0x59325809, 0x41780800, 0x4d400000, 0x60168000, - 0x05e9f96c, 0x5c028000, 0x0501ffc5, 0x0501fc5f, - 0x0001fb2c, 0x05f5fffc, 0x90000541, 0x1c01f000, - 0x4933c857, 0x05e5fdb6, 0x0500000b, 0x59300416, - 0x84000556, 0x48026416, 0x0501f80e, 0x4df00000, - 0x59300416, 0x84000516, 0x48026416, 0x5c03e000, - 0x1c01f000, 0x4d400000, 0x60428000, 0x0509fb76, - 0x641a6407, 0x641e6203, 0x5c028000, 0x1c01f000, - 0x4933c857, 0x05f1fb42, 0x4df00000, 0x0501f8c0, - 0x90000c8e, 0x05ca1bf1, 0x0c01f001, 0x00106e06, - 0x00106e72, 0x00106e18, 0x00106e82, 0x00106e6f, - 0x00106e05, 0x00106e06, 0x00106e06, 0x00106e09, - 0x00106e06, 0x00106e06, 0x00106e06, 0x00106e06, - 0x00106e18, 0x05c9fbe1, 0x5c03e000, 0x05f00b18, - 0x05fdf7c0, 0x5c03e000, 0x05f00b15, 0x59300407, - 0x90000583, 0x05fe07be, 0x59300203, 0x9000058d, - 0x05fc07bb, 0x8d3c0502, 0x05fe07b9, 0x4d340000, - 0x5932680a, 0x05e5fdd5, 0x5c026800, 0x05fdf7b4, - 0x0505fb0c, 0x0505fa31, 0x59300004, 0x8400055c, - 0x48026004, 0x4203e000, 0xb0800000, 0x6023f800, - 0x05f1faff, 0x59300407, 0x90000586, 0x05000048, - 0x8d3c0502, 0x05020046, 0x497a621f, 0x59300203, - 0x9000058d, 0x05000002, 0x640e621f, 0x0501fab9, - 0x05020004, 0x8d3c0500, 0x05000032, 0x0501f02a, - 0x4d2c0000, 0x4d400000, 0x59325809, 0x0501fc03, - 0x592c0409, 0x8c000512, 0x05000008, 0x4d2c0000, - 0x84000512, 0x48025c09, 0x592c080a, 0x40065800, - 0x05c9ff45, 0x5c025800, 0x4d400000, 0x60168000, - 0x592c0a09, 0x8c04050e, 0x05000003, 0x600a8000, - 0x0501f001, 0x05e9f8fb, 0x5c028000, 0x0501ff54, - 0x8d3c0500, 0x05020003, 0x050dfb64, 0x05020003, - 0x0001fb2c, 0x497a6009, 0x5c028000, 0x5c025800, - 0x8d3c0500, 0x0500000a, 0x59300a1f, 0x90040d83, - 0x05020005, 0x4d340000, 0x5932680a, 0x05e5fd93, - 0x5c026800, 0x05f5ff7c, 0x0501f011, 0x050dfb53, - 0x05020004, 0x59300a1f, 0x90040d83, 0x05000b55, - 0x4a026403, 0x00000085, 0x64266203, 0x640a6407, - 0x42000800, 0x80004040, 0x0505f9e4, 0x0005f87c, - 0x4203e000, 0xb0800000, 0x6023f800, 0x5c03e000, - 0x05f20ac7, 0x90000541, 0x1c01f000, 0x05f1fab0, - 0x05cdfca1, 0x05fdf7a7, 0x598c000b, 0x81300580, - 0x05020003, 0x05f1fd5b, 0x05020026, 0x0201f800, - 0x0010ba2e, 0x80c40040, 0x05020005, 0x59300c03, - 0xb0040580, 0x05fc078c, 0x05fdf79a, 0x05f1f9e3, - 0x0500001c, 0x05c9fb65, 0x0501f823, 0x05020003, - 0x05f1fd17, 0x05020017, 0x0201f800, 0x0010b8bb, - 0x80c40040, 0x0500000f, 0x05f1f9d8, 0x05000011, - 0x59300407, 0x90000583, 0x05ca0b58, 0x59300004, - 0x9000051f, 0x90000585, 0x05ca0b54, 0x58d400ec, - 0x82000500, 0x00000f00, 0x05fe0782, 0x05c9fb4f, - 0x59300c03, 0xb0040580, 0x05fc076f, 0x05fdf77d, - 0x59300203, 0x90000c8e, 0x05ca1b48, 0x0c01f758, - 0x0501f805, 0x60058800, 0x05000002, 0x60018800, - 0x1c01f000, 0x417a3000, 0x60df2160, 0x59900005, - 0x81300580, 0x05000006, 0x91932410, 0x811a3000, - 0x91180485, 0x05fc17fa, 0x90000541, 0x1c01f000, - 0x0501f803, 0x40018800, 0x1c01f000, 0x59300004, - 0x8c00053e, 0x0500000c, 0x8c00050c, 0x0502000a, - 0x8c000516, 0x05020004, 0x90000d1f, 0x90040585, - 0x05020003, 0x600c0000, 0x0501f004, 0x60040000, - 0x0501f002, 0x59300203, 0x1c01f000, 0x4933c857, - 0x05f1fa6f, 0x4df00000, 0x59300203, 0x90000c8e, - 0x05ca1b1e, 0x0c01f001, 0x00106ed9, 0x00106eec, - 0x00106edc, 0x00106ed8, 0x00106ed8, 0x00106ed8, - 0x00106ed8, 0x00106ed8, 0x00106ed8, 0x00106ed8, - 0x00106ed8, 0x00106ed8, 0x00106ed8, 0x00106ed8, - 0x05c9fb0e, 0x5c03e000, 0x05f00a45, 0x05fdf6ed, - 0x5c03e000, 0x05f00a42, 0x4d2c0000, 0x59325809, - 0x59300403, 0xb0000592, 0x05d00843, 0x0501fa01, - 0x05c80b02, 0x64165a07, 0x0001fb2c, 0x05e5ff44, - 0x05f5feed, 0x5c025800, 0x90000541, 0x1c01f000, - 0x598c000b, 0x81300580, 0x05020018, 0x59300004, - 0x8c000520, 0x05000004, 0x84000520, 0x48026004, - 0x0501f018, 0x42001000, 0x00109730, 0x50081000, - 0x58080002, 0x82000580, 0x00000100, 0x05000009, - 0x5808000b, 0x81300580, 0x05ca0ae8, 0x0201f800, - 0x0010ba2e, 0x80c40040, 0x05ca0ae4, 0x05fdf7d9, - 0x05f1fccc, 0x0502000c, 0x59300004, 0x8c000520, - 0x05000004, 0x84000520, 0x48026004, 0x05fdf7d1, - 0x0201f800, 0x0010ba2e, 0x80c40040, 0x05fc07cd, - 0x05c9fad6, 0x59300203, 0x90000c8e, 0x05ca1ad3, - 0x0c01f7b6, 0x4d340000, 0x5932680a, 0x59300407, - 0x4933c857, 0x4803c857, 0x90000c92, 0x05ca1acb, - 0x0c01f803, 0x5c026800, 0x1c01f000, 0x00106f34, - 0x00106f54, 0x00107044, 0x0010c00d, 0x0010703b, - 0x00107040, 0x00108155, 0x00106f3b, 0x00107037, - 0x00106f31, 0x00107097, 0x00106f31, 0x00106f31, - 0x00106f31, 0x00106f31, 0x000208e7, 0x0010768c, - 0x0010768c, 0x05c9fab5, 0x0501faa9, 0x05f804ba, - 0x1c01f000, 0x05f1f9fe, 0x05f1f967, 0x05f1f9e8, - 0x0005f0e7, 0x64066006, 0x1c01f000, 0x4d340000, - 0x4c5c0000, 0x59300203, 0x90000591, 0x05020011, - 0x5932680a, 0x4130b800, 0x0005f8ca, 0x0500000c, - 0x64066203, 0x647a6403, 0x585c041b, 0x4802641b, - 0x585c021b, 0x4802621b, 0x4936600a, 0x64066407, - 0x42000800, 0x80000040, 0x0005f87c, 0x405e6000, - 0x0005f8e7, 0x5c00b800, 0x5c026800, 0x1c01f000, - 0x42000000, 0x00109803, 0x050df93f, 0x050df86a, - 0x59300203, 0x90000c8e, 0x05ca1a8c, 0x4803c857, - 0x0c01f001, 0x00106f6b, 0x00106f39, 0x00106f6c, - 0x00106f6b, 0x00106f6c, 0x00106f6c, 0x00106f35, - 0x00106f6b, 0x00106f32, 0x00106f6b, 0x00106f6b, + 0x4806580a, 0x5c000800, 0x4c500000, 0x4c540000, + 0x91cca40c, 0x912cac0e, 0x0501fcaa, 0x5c00a800, + 0x5c00a000, 0x05fdf7a8, 0x4c040000, 0x4c0c0000, + 0x4c140000, 0x0005f987, 0x05020005, 0x64025a07, + 0x59300813, 0x800409c0, 0x050208ed, 0x48065808, + 0x5c002800, 0x5c001800, 0x59301402, 0x480a5c07, + 0x480e580b, 0x901401c0, 0x4802580a, 0x0505fcd6, + 0x5c000800, 0x0501fc4f, 0x0501fc7b, 0x05fdf796, + 0x592c020b, 0x8c000502, 0x05fc07b4, 0x592c0209, + 0x8c00050e, 0x05fe07b1, 0x59300013, 0x800c0d80, + 0x05fc07ae, 0x4803c857, 0x480fc857, 0x8c180514, + 0x050401bb, 0x80000540, 0x05fc07a8, 0x4807c856, + 0x0505f1b7, 0x592c020b, 0x8c000502, 0x05fc0772, + 0x59300013, 0x800001c0, 0x05fc0771, 0x592c0209, + 0x8c00050e, 0x05fe076e, 0x0505f1ad, 0x1c01f000, + 0x59cc2006, 0x59cc2807, 0x0501f037, 0x0501f036, + 0x1c01f000, 0x4933c857, 0x59300004, 0x8c00053e, + 0x0502002d, 0x5930001e, 0x800001c0, 0x05060ecb, + 0x59325809, 0x592c0c09, 0x41782800, 0x41781800, + 0x84040d58, 0x48065c09, 0x41783000, 0x59340200, + 0x8c00050e, 0x05020015, 0x0005f987, 0x05020006, + 0x64025a07, 0x59300813, 0x4807c857, 0x800409c0, + 0x050208a7, 0x4a025a05, 0x00000103, 0x48065808, + 0x480e580b, 0x901409c0, 0x4806580a, 0x4933c857, + 0x59300c02, 0x48065c07, 0x0505fc8f, 0x0001fb2c, + 0x05e9fa59, 0x0005f0e7, 0x592c020b, 0x8c000502, + 0x05fc07ea, 0x59300013, 0x4803c857, 0x800001c0, + 0x05fc07e8, 0x592c0209, 0x8c00050e, 0x05fe07e5, + 0x0505f177, 0x05f5fb54, 0x05fc07d3, 0x4933c857, + 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x4010b800, + 0x4014c000, 0x5930001e, 0x800001c0, 0x4c140000, + 0x05060e96, 0x5c002800, 0x59325809, 0x592c020b, + 0x8c000502, 0x05020020, 0x8c000500, 0x05000025, + 0x640a6203, 0x650e6403, 0x405c0000, 0x592c0810, + 0x80040c80, 0x40600000, 0x80040480, 0x0500101a, + 0x8060c1c0, 0x05000011, 0x59300004, 0x8c00053e, + 0x0502000a, 0x485e6015, 0x48626013, 0x497a6205, + 0x5c00c000, 0x5c00b800, 0x05d1fa10, 0x0502000c, + 0x59300804, 0x0005f072, 0x4c140000, 0x05f5fb2a, + 0x5c002800, 0x05fc07f4, 0x5c00c000, 0x5c00b800, + 0x05f9f4d6, 0x5c00c000, 0x5c00b800, 0x4933c857, + 0x1c01f000, 0x4807c857, 0x4004c000, 0x05fdf7e5, + 0x4803c857, 0x05fdf7f5, 0xb1380498, 0x05021004, + 0xb1380480, 0x05001002, 0x0c01f002, 0x1c01f000, + 0x00106a08, 0x00106a08, 0x00106a08, 0x00106a08, + 0x00106a08, 0x00106a08, 0x00106a08, 0x00106a08, + 0x00106a08, 0x00106a08, 0x00106a09, 0x00106a08, + 0x00106a08, 0x00106a08, 0x00106a08, 0x00106a13, + 0x00106a08, 0x00106a08, 0x00106a08, 0x00106a08, + 0x00106a37, 0x00106a08, 0x00106a08, 0x00106a08, + 0x05c9ffde, 0x4933c857, 0x05f5f983, 0x640a6203, + 0x59a8002c, 0x48026205, 0x59300013, 0x59300817, + 0x80040c80, 0x48066017, 0x05f1f6fa, 0x4933c857, + 0x05f1fef8, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010b660, 0x5c027800, 0x42000000, 0x00109878, + 0x050dff43, 0x0501ff5d, 0x0500000e, 0x4d2c0000, + 0x59325809, 0x4a025a05, 0x00000103, 0x59300402, + 0x48025c07, 0x64a65a07, 0x497a580a, 0x592c0c09, + 0x84040d50, 0x48065c09, 0x0001fb2c, 0x5c025800, + 0x60503000, 0x41782800, 0x4d400000, 0x4d440000, + 0x59368c03, 0x60082000, 0x60a68000, 0x0505fe30, + 0x5c028800, 0x5c028000, 0x0005f0e7, 0x4933c857, + 0x59300809, 0x4978080a, 0x4978080b, 0x58041409, + 0x84081558, 0x48080c09, 0x1c01f000, 0x4807c857, + 0x8c04053e, 0x05020022, 0x497a5a07, 0x59300021, + 0x80000540, 0x05000017, 0x497a5a07, 0x4c040000, + 0x4c080000, 0x4c0c0000, 0x4c100000, 0x4c140000, + 0x40002800, 0x58141003, 0x40040000, 0x80081480, + 0x48082803, 0x40140000, 0x05cdffae, 0x5c002800, + 0x5c002000, 0x5c001800, 0x5c001000, 0x5c000800, + 0x592c0207, 0x80000540, 0x05020008, 0x0501f005, + 0x592c0409, 0x8c00051c, 0x05000002, 0x592c0803, + 0x4807c857, 0x64565a07, 0x1c01f000, 0x59300021, + 0x80000540, 0x05000007, 0x64465a07, 0x59300021, + 0x4c040000, 0x05cdff97, 0x5c000800, 0x05fdf7f7, + 0x4807c856, 0x641e5a07, 0x1c01f000, 0xb1380498, + 0x05021006, 0xb1380480, 0x05001004, 0x4d2c0000, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x00106a8f, + 0x00106a8f, 0x00106a8f, 0x00106a8f, 0x00106a8f, + 0x00106a91, 0x00106a90, 0x00106a8f, 0x00106b05, + 0x00106a8f, 0x00106a8f, 0x00106a8f, 0x00106a8f, + 0x00106a8f, 0x00106a8f, 0x00106a8f, 0x00106a8f, + 0x00106a8f, 0x00106a8f, 0x00106bb6, 0x00106bda, + 0x00106bbd, 0x00106a90, 0x00106be3, 0x05c9ff57, + 0x1c01f000, 0x5930001e, 0x800001c0, 0x05060dbf, + 0x59300008, 0x8c00050e, 0x0500006e, 0x8c000500, + 0x05000060, 0x8c00051c, 0x05000008, 0x84000500, + 0x48026008, 0x59325809, 0x592c3c09, 0x841c3d58, + 0x481e5c09, 0x0005f13e, 0x59325809, 0x592c3c09, + 0x841c3d58, 0x59300008, 0x8c00051c, 0x05fe07f4, + 0x481e5c09, 0x60140000, 0x40000000, 0x80000040, + 0x05fe07fe, 0x59300008, 0x8c00051c, 0x05fe07ec, + 0x59cc0808, 0x592c0205, 0x82000500, 0x000000ff, + 0xb0000588, 0x0502000a, 0x497a580c, 0x82040500, + 0x000000ff, 0x05000006, 0x592c0408, 0x800001c0, + 0x05000003, 0x0505fca9, 0x05d1f017, 0x900421c0, + 0x4812580a, 0x41782000, 0x82040500, 0x00000c00, + 0x05000002, 0x59cc2009, 0x82043500, 0x00000fff, + 0x0502001e, 0x481e5c09, 0x64025a07, 0x801831c0, + 0x05d00009, 0x41782000, 0x8c180510, 0x05000002, + 0x59cc200b, 0x4812580d, 0x41780000, 0x8c180512, + 0x05000002, 0x59cc000a, 0x4802580c, 0x80100c00, + 0x05c81f0e, 0x05cc07fc, 0x9004149d, 0x05021009, + 0x4c500000, 0x4c540000, 0x91cca40c, 0x912cac0e, + 0x0501fb10, 0x5c00a800, 0x5c00a000, 0x05cdf7f2, + 0x0501fac8, 0x05cdf7f0, 0x412c7800, 0x05cdfa81, + 0x05c80efe, 0x492c780a, 0x841c3d52, 0x481c7c09, + 0x4a025a05, 0x00000103, 0x4812580b, 0x900401c0, + 0x4802580a, 0x583c0405, 0x583c1006, 0x583c2209, + 0x48025c05, 0x480a5806, 0x48125a09, 0x05fdf7d2, + 0x8c000524, 0x05fc07a2, 0x59325809, 0x4c000000, + 0x592c0409, 0x8c00051c, 0x5c000000, 0x05020003, + 0x4a026013, 0xffffffff, 0x84000524, 0x05fdf798, + 0x1c01f000, 0x59a8002c, 0x48026205, 0x59325809, + 0x640a6203, 0x592c2409, 0x59300808, 0x4933c857, + 0x4807c857, 0x592c0205, 0x82000500, 0x000000ff, + 0xb0000588, 0x05020003, 0x8c100500, 0x0506048b, + 0x64025a07, 0x8c04051e, 0x05000022, 0x41780800, + 0x497a580a, 0x592c1c0a, 0x59300013, 0x59341200, + 0x497a6205, 0x8c08050e, 0x05020062, 0x4807c857, + 0x4806580b, 0x80000d40, 0x05fe0f1d, 0x59300402, + 0x48025c07, 0x48065808, 0x4a025a05, 0x00000103, + 0x4c040000, 0x4c0c0000, 0x4c100000, 0x0505fb06, + 0x5c002000, 0x5c001800, 0x5c000800, 0x8c100512, + 0x05020016, 0x4c0c0000, 0x0001fb2c, 0x05e9f8ca, + 0x5c001800, 0x8c0c0518, 0x000400e7, 0x0501f7b7, + 0x4813c857, 0x8c100518, 0x05000044, 0x41780800, + 0x592c1c0a, 0x820c0580, 0x00001000, 0x05fc07db, + 0x8c100512, 0x05fc07d9, 0x592c780a, 0x583c080b, + 0x583c1c0a, 0x05fdf7d5, 0x4807c857, 0x592c780a, + 0x59300402, 0x592c1405, 0x8c08051e, 0x0502000c, + 0x592c1207, 0x48007c07, 0x48047808, 0x48087a07, + 0x84102512, 0x48107c09, 0x4c0c0000, 0x05cdfa2e, + 0x403e5800, 0x0501fa84, 0x05fdf7dd, 0x48025c07, + 0x48065808, 0x583c080d, 0x583c000c, 0x80040c00, + 0x9004149d, 0x05001005, 0x583c1001, 0x480a5801, + 0x49787801, 0x60700800, 0x90040c14, 0x4c0c0000, + 0x4c500000, 0x4c540000, 0x903ca409, 0x912cac09, + 0x4c100000, 0x4c3c0000, 0x0501fa86, 0x5c007800, + 0x5c002000, 0x5c00a800, 0x5c00a000, 0x84102512, + 0x48125c09, 0x403e5800, 0x05cdfa0f, 0x0505fabe, + 0x42034000, 0x00109490, 0x59a1d806, 0x80edd9c0, + 0x05c80e6e, 0x48efc857, 0x58ec0008, 0x4803c857, + 0x0801f800, 0x05fdf7b6, 0x4933c857, 0x1c01f000, + 0x59301416, 0x480bc857, 0x8c08051c, 0x0502000e, + 0x80000540, 0x4803c857, 0x05fc0799, 0x80042c80, + 0x05fe1797, 0x8c080514, 0x05020005, 0x592c0810, + 0x4807c857, 0x80040480, 0x48026018, 0x8408155c, + 0x480a6416, 0x59301008, 0x8408151e, 0x480a6008, + 0x4c100000, 0x4c3c0000, 0x4d400000, 0x592e8207, + 0x64065a07, 0x0505fa98, 0x49425a07, 0x5c028000, + 0x5c007800, 0x5c002000, 0x497a580a, 0x8c100512, + 0x05000005, 0x4d2c0000, 0x403e5800, 0x05cdf9de, + 0x5c025800, 0x82102500, 0xffffedff, 0x48125c09, + 0x59301006, 0x800811c0, 0x0500077d, 0x59a8002c, + 0x80080480, 0x0502177a, 0x4a025a05, 0x00000103, + 0x641a5a07, 0x497a5c0a, 0x492fc857, 0x0001fb2c, + 0x05e9f849, 0x0005f0e7, 0x59325809, 0x592c0409, + 0x8c000518, 0x05000003, 0x412df800, 0x05cdf732, + 0x1c01f000, 0x4933c857, 0x59325809, 0x497a580a, + 0x64025a07, 0x4a025a05, 0x00000103, 0x59300813, + 0x4807c857, 0x800409c0, 0x05020008, 0x48065808, + 0x59300c02, 0x48065c07, 0x0505fa67, 0x0001fb2c, + 0x05e9f831, 0x0005f0e7, 0x59340200, 0x8c00050e, + 0x05020005, 0x59300813, 0x05fdfe6d, 0x48065808, + 0x05fdf7f4, 0x592c0209, 0x8c00050e, 0x05fe07fa, + 0x4933c857, 0x0501f74e, 0x4933c857, 0x59325809, + 0x812e59c0, 0x05c80e09, 0x592c020b, 0x8c000502, + 0x05c80e06, 0x640a6006, 0x1c01f000, 0x5930001e, + 0x800001c0, 0x05060c6d, 0x59300008, 0x4933c857, + 0x4803c857, 0x8c00050e, 0x05000032, 0x8c000500, + 0x05000024, 0x8c00051c, 0x05000009, 0x84000500, + 0x48026008, 0x59325809, 0x592c3c09, 0x481fc857, + 0x841c3d58, 0x481e5c09, 0x0005f13e, 0x59325809, + 0x592c3c09, 0x841c3d58, 0x59300008, 0x8c00051c, + 0x05fe07f3, 0x481e5c09, 0x60140000, 0x40000000, + 0x80000040, 0x05fe07fe, 0x59300008, 0x8c00051c, + 0x05fe07eb, 0x592c0205, 0x82000500, 0x000000ff, + 0xb0000588, 0x05020003, 0x497a580c, 0x0501f002, + 0x497a580a, 0x481e5c09, 0x64025a07, 0x05cdf6c6, + 0x8c000524, 0x05fc07de, 0x59325809, 0x4c000000, + 0x592c0409, 0x8c00051c, 0x5c000000, 0x05020003, + 0x4a026013, 0xffffffff, 0x84000524, 0x05fdf7d4, + 0x1c01f000, 0x4933c857, 0x41780800, 0xb1380498, + 0x05021009, 0xb1380480, 0x05001007, 0x4d2c0000, + 0x59325809, 0x812e59c0, 0x0c020805, 0x5c025800, + 0x0005f0e7, 0x493bc857, 0x1c01f000, 0x00106c43, + 0x00106c43, 0x00106c43, 0x00106c43, 0x00106c43, + 0x00106c44, 0x00106c43, 0x00106c43, 0x00106c43, + 0x00106c43, 0x00106c43, 0x00106c43, 0x00106c43, + 0x00106c43, 0x00106c43, 0x00106c43, 0x00106c43, + 0x00106c43, 0x00106c43, 0x00106c43, 0x00106c47, + 0x00106c43, 0x00106c43, 0x00106c43, 0x05c9fda3, + 0x59cc0808, 0x497a5808, 0x4807c857, 0x59300402, + 0x48025c07, 0x4a025a05, 0x00000103, 0x900401c0, + 0x4802580a, 0x64025a07, 0x800409c0, 0x0000032c, + 0x59cc0009, 0x4802580b, 0x82042500, 0x00000100, + 0x05000002, 0x59cc200b, 0x4812580d, 0x82040500, + 0x00000200, 0x05000002, 0x59cc000a, 0x4802580c, + 0x80100c00, 0x05c81d89, 0x0000032c, 0x9004149d, + 0x05001005, 0x592c0405, 0x8c00051e, 0x0500000a, + 0x60700800, 0x4c500000, 0x4c540000, 0x91cca40c, + 0x912cac0e, 0x0501f987, 0x5c00a800, 0x5c00a000, + 0x0001f32c, 0x0501f93f, 0x0501f16b, 0x83380480, + 0x00000093, 0x05ca1d75, 0x83380480, 0x00000085, + 0x05c81d72, 0x0c01f001, 0x00106c84, 0x00106c83, + 0x00106c83, 0x00106c89, 0x00106c83, 0x00106c83, + 0x00106c83, 0x00106c83, 0x00106c83, 0x00106c83, + 0x00106c83, 0x00106c83, 0x00106c83, 0x05c9fd63, + 0x64066203, 0x493a6403, 0x42000800, 0x80000040, + 0x0005f07c, 0x83300580, 0x0010cc6c, 0x05ca0d5b, + 0x4933c857, 0x59cc1404, 0x0505f85a, 0x05000023, + 0x591c0203, 0x90000580, 0x05000020, 0x591c000a, + 0x81340580, 0x0502001d, 0x59cc1204, 0x82080580, + 0x0000ffff, 0x05000007, 0x591c0202, 0x82000d80, + 0x0000ffff, 0x05000003, 0x80080580, 0x05020013, + 0x4d300000, 0x4d1c0000, 0x411e6000, 0x0501f997, + 0x5c023800, 0x5c026000, 0x0500000a, 0x59cc0005, + 0x8c000500, 0x05020003, 0x0501f94d, 0x0501f002, + 0x640a3a03, 0x4a026403, 0x00000086, 0x0501f005, + 0x0501f97d, 0x05fc07f6, 0x4a026403, 0x00000087, + 0x4d2c0000, 0x050dfb4c, 0x05e9fa36, 0x5c025800, + 0x59340200, 0x8c00050e, 0x0500000b, 0x59cc1404, + 0x0505f82c, 0x05000008, 0x591c0416, 0x8c00051a, + 0x05000005, 0x4d300000, 0x411e6000, 0x0501fe76, + 0x5c026000, 0x1c01f000, 0x91380593, 0x0502000a, + 0x59300403, 0x4803c857, 0x82000d80, 0x00000086, + 0x05000015, 0x82000d80, 0x00000087, 0x05ca0d17, + 0x0501f011, 0x913805a7, 0x05000003, 0x91380594, + 0x05ca0d12, 0x493bc857, 0x05f1fc53, 0x0501fca3, + 0x05f80175, 0x4d2c0000, 0x59325809, 0x0001fb2c, + 0x59300a1f, 0x90040d83, 0x05000d6c, 0x5c025800, + 0x05f9f16d, 0x4933c857, 0x0005f0e7, 0x91380593, + 0x05020006, 0x59300403, 0x4803c857, 0x82000480, + 0x00000085, 0x0c01f03d, 0x913805a7, 0x05020035, + 0x4933c857, 0x05f1fc3c, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010b660, 0x5c027800, 0x60543000, + 0x41782800, 0x600c2000, 0x60a68000, 0x4d400000, + 0x4d440000, 0x59368c03, 0x0505fb69, 0x5c028800, + 0x5c028000, 0x42000000, 0x00109878, 0x050dfc60, + 0x0501fc7a, 0x000400e7, 0x4d2c0000, 0x59325809, + 0x592c0205, 0x82000500, 0x000000ff, 0x90000594, + 0x05020d42, 0x4a025a05, 0x00000103, 0x59300402, + 0x48025c07, 0x497a580a, 0x49425a07, 0x0001fb2c, + 0x5c025800, 0x0005f0e7, 0x83380580, 0x00000089, + 0x05000004, 0x83380580, 0x0000008a, 0x05fa019f, + 0x05f1ffed, 0x05fa019d, 0x59300a03, 0x9004058a, + 0x05000022, 0x9004058c, 0x05000020, 0x05c9fcc7, + 0x91380594, 0x05fe07f1, 0x4933c857, 0x05f1fc06, + 0x601a8000, 0x05fdf7db, 0x00106d34, 0x00106d33, + 0x00106d33, 0x00106d33, 0x00106d33, 0x00106d33, + 0x00106d39, 0x00106d33, 0x00106d33, 0x00106d33, + 0x00106d33, 0x00106d33, 0x00106d33, 0x05c9fcb3, + 0x4933c857, 0x59a8002a, 0x48026006, 0x642a6203, + 0x1c01f000, 0x4933c857, 0x59a8002a, 0x48026006, + 0x64326203, 0x1c01f000, 0x5932680a, 0x83380580, + 0x00000089, 0x05000007, 0x83380580, 0x0000008a, + 0x0500001f, 0x4933c857, 0x493bc857, 0x05f9f16f, + 0x4933c857, 0x59325809, 0x59300a1f, 0x90040583, + 0x05020007, 0x0501fc2d, 0x0500000d, 0x0001fb2c, + 0x05e5fead, 0x497a6009, 0x0501f009, 0x5930021f, + 0x90000581, 0x05020006, 0x59300c18, 0x900405b9, + 0x05000016, 0x900405b5, 0x05000014, 0x59cc0c07, + 0x4806641b, 0x59cc0a07, 0x4806621b, 0x59300203, + 0x4802641f, 0x64466203, 0x05f9f0eb, 0x4933c857, + 0x5930021f, 0x90000581, 0x0502003c, 0x59300c18, + 0x900405b5, 0x05000005, 0x9004059e, 0x05000003, + 0x900405b9, 0x05020035, 0x4933c857, 0x4c5c0000, + 0x4c600000, 0x4d1c0000, 0x4130b800, 0x4004c000, + 0x0501ff2c, 0x05020028, 0x906005b5, 0x05020004, + 0x591c0c16, 0x8c040502, 0x05000023, 0x05f9f908, + 0x05000021, 0x491fc857, 0x4933c857, 0x906005b5, + 0x05000003, 0x906005b9, 0x05020002, 0x4932381e, + 0x48626403, 0x64066203, 0x64066407, 0x585c080a, + 0x4807c857, 0x4806600a, 0x585c0c17, 0x4807c857, + 0x48066417, 0x585c0a17, 0x4807c857, 0x48066217, + 0x585c0a18, 0x4807c857, 0x48066218, 0x585c0c1b, + 0x4807c857, 0x4806641b, 0x585c0a1b, 0x4807c857, + 0x4806621b, 0x491e6020, 0x42000800, 0x80000040, + 0x0005f87c, 0x405e6000, 0x5c023800, 0x5c00c000, + 0x5c00b800, 0x0005f0e7, 0x0501fbd8, 0x05000008, + 0x4d2c0000, 0x59325809, 0x0001fb2c, 0x5930021f, + 0x90000583, 0x05e40e54, 0x5c025800, 0x0005f0e7, + 0x4803c856, 0x4c500000, 0x4c540000, 0x412c7800, + 0x4c3c0000, 0x60042800, 0x82040480, 0x00000101, + 0x05001002, 0x60000802, 0x40043000, 0x60700800, + 0x91cca40c, 0x912cac0e, 0x0501f836, 0x9018349c, + 0x592e5801, 0x812e59c0, 0x05ca0fc3, 0x05c9ffa9, + 0x05000011, 0x80142800, 0x4a025805, 0x00000110, + 0x492c7801, 0x90180cbd, 0x05021005, 0x40180800, + 0x912cac06, 0x0501f827, 0x0501f007, 0x901834bc, + 0x60f00800, 0x412c7800, 0x912cac06, 0x0501f821, + 0x05fdf7ef, 0x5c007800, 0x841429c0, 0x90142d43, + 0x48147a05, 0x403e5800, 0x5c00a800, 0x5c00a000, + 0x1c01f000, 0x492fc857, 0x812e59c0, 0x0500000d, + 0x4d2c0000, 0x4c3c0000, 0x592c7801, 0x803c79c0, + 0x05000005, 0x497a5801, 0x0001fb2c, 0x403e5800, + 0x05fdf7fa, 0x5c007800, 0x0001fb2c, 0x5c025800, + 0x1c01f000, 0x4803c856, 0x4c580000, 0x90040403, + 0x8000b104, 0x050dfc3c, 0x5c00b000, 0x1c01f000, + 0x4803c856, 0x4c580000, 0x90040c03, 0x8004b104, + 0x050dfc35, 0x5c00b000, 0x1c01f000, 0x591c0c07, + 0x90040583, 0x05000005, 0x90040582, 0x05000003, + 0x9004058a, 0x05020021, 0x4d300000, 0x4d2c0000, + 0x411e6000, 0x59325809, 0x0501fb78, 0x05000018, + 0x59300c07, 0x9004058a, 0x05000019, 0x90040583, + 0x05020007, 0x592c0a05, 0x82040d00, 0x000000ff, + 0x90040d94, 0x05000002, 0x640e621f, 0x0501f813, + 0x4d400000, 0x604e8000, 0x592c0a09, 0x84040d54, + 0x05e9f962, 0x5c028000, 0x0505f81b, 0x0001fb2c, + 0x5930021f, 0x90000583, 0x05000c30, 0x05f9f832, + 0x5c025800, 0x5c026000, 0x1c01f000, 0x644e5a07, + 0x642a621f, 0x05fdf7f5, 0x592c0409, 0x8c000512, + 0x05000008, 0x84000512, 0x48025c09, 0x4d2c0000, + 0x592e580a, 0x05c9ff58, 0x5c025800, 0x497a580a, + 0x1c01f000, 0x59cc0005, 0x8c000500, 0x0502000a, + 0x591c0407, 0x90000582, 0x05020007, 0x591c0c03, + 0x82040580, 0x00000085, 0x05000003, 0x82040580, + 0x0000008b, 0x1c01f000, 0x4933c857, 0x4d3c0000, + 0x600a7800, 0x59300407, 0x90000c92, 0x05ca1ba7, + 0x0c01f808, 0x5c027800, 0x1c01f000, 0x4933c857, + 0x59300407, 0x90000c92, 0x05ca1ba0, 0x0c01f001, + 0x00106e5e, 0x00106e5b, 0x00106e5b, 0x00106e83, + 0x00106e5a, 0x00106e5b, 0x00106e6f, 0x00106e5b, + 0x00106e5a, 0x00106e5a, 0x00107965, 0x00106e5b, + 0x00106e5b, 0x00106e5a, 0x00106e5a, 0x00106e5a, + 0x00106f56, 0x00106e5b, 0x05c9fb8c, 0x4803c856, + 0x80000580, 0x1c01f000, 0x4803c856, 0x8d3c0502, + 0x0502000e, 0x0501fb19, 0x0500000a, 0x59325809, + 0x41780800, 0x4d400000, 0x60168000, 0x05e9f90f, + 0x5c028000, 0x0501ffc8, 0x0501fc62, 0x0001fb2c, + 0x05f5ffe1, 0x90000541, 0x1c01f000, 0x4933c857, + 0x05e5fd36, 0x0500000b, 0x59300416, 0x84000556, + 0x48026416, 0x0501f80e, 0x4df00000, 0x59300416, + 0x84000516, 0x48026416, 0x5c03e000, 0x1c01f000, + 0x4d400000, 0x60428000, 0x0509fb94, 0x641a6407, + 0x641e6203, 0x5c028000, 0x1c01f000, 0x4933c857, + 0x05f1fb3b, 0x4df00000, 0x0501f8c0, 0x90000c8e, + 0x05ca1b5e, 0x0c01f001, 0x00106e99, 0x00106f05, + 0x00106eab, 0x00106f15, 0x00106f02, 0x00106e98, + 0x00106e99, 0x00106e99, 0x00106e9c, 0x00106e99, + 0x00106e99, 0x00106e99, 0x00106e99, 0x00106eab, + 0x05c9fb4e, 0x5c03e000, 0x05f00b11, 0x05fdf7c0, + 0x5c03e000, 0x05f00b0e, 0x59300407, 0x90000583, + 0x05fe07be, 0x59300203, 0x9000058d, 0x05fc07bb, + 0x8d3c0502, 0x05fe07b9, 0x4d340000, 0x5932680a, + 0x05e5fd55, 0x5c026800, 0x05fdf7b4, 0x0505fb0f, + 0x0505fa34, 0x59300004, 0x8400055c, 0x48026004, + 0x4203e000, 0xb0800000, 0x6023f800, 0x05f1faf8, + 0x59300407, 0x90000586, 0x05000048, 0x8d3c0502, + 0x05020046, 0x497a621f, 0x59300203, 0x9000058d, + 0x05000002, 0x640e621f, 0x0501fabc, 0x05020004, + 0x8d3c0500, 0x05000032, 0x0501f02a, 0x4d2c0000, + 0x4d400000, 0x59325809, 0x0501fc06, 0x592c0409, + 0x8c000512, 0x05000008, 0x4d2c0000, 0x84000512, + 0x48025c09, 0x592c080a, 0x40065800, 0x05c9feb2, + 0x5c025800, 0x4d400000, 0x60168000, 0x592c0a09, + 0x8c04050e, 0x05000003, 0x600a8000, 0x0501f001, + 0x05e9f89e, 0x5c028000, 0x0501ff57, 0x8d3c0500, + 0x05020003, 0x050dfb9b, 0x05020003, 0x0001fb2c, + 0x497a6009, 0x5c028000, 0x5c025800, 0x8d3c0500, + 0x0500000a, 0x59300a1f, 0x90040d83, 0x05020005, + 0x4d340000, 0x5932680a, 0x05e5fd13, 0x5c026800, + 0x05f5ff61, 0x0501f011, 0x050dfb8a, 0x05020004, + 0x59300a1f, 0x90040d83, 0x05000b58, 0x4a026403, + 0x00000085, 0x64266203, 0x640a6407, 0x42000800, + 0x80004040, 0x0505f9e7, 0x0005f87c, 0x4203e000, + 0xb0800000, 0x6023f800, 0x5c03e000, 0x05f20ac0, + 0x90000541, 0x1c01f000, 0x05f1faa9, 0x05cdfc0e, + 0x05fdf7a7, 0x598c000b, 0x81300580, 0x05020003, + 0x05f1fd54, 0x05020026, 0x0201f800, 0x0010ba3e, + 0x80c40040, 0x05020005, 0x59300c03, 0xb0040580, + 0x05fc078c, 0x05fdf79a, 0x05f1f9dc, 0x0500001c, + 0x05c9fad2, 0x0501f823, 0x05020003, 0x05f1fd10, + 0x05020017, 0x0201f800, 0x0010b8cb, 0x80c40040, + 0x0500000f, 0x05f1f9d1, 0x05000011, 0x59300407, + 0x90000583, 0x05ca0ac5, 0x59300004, 0x9000051f, + 0x90000585, 0x05ca0ac1, 0x58d400ec, 0x82000500, + 0x00000f00, 0x05fe0782, 0x05c9fabc, 0x59300c03, + 0xb0040580, 0x05fc076f, 0x05fdf77d, 0x59300203, + 0x90000c8e, 0x05ca1ab5, 0x0c01f758, 0x0501f805, + 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, + 0x417a3000, 0x60df2160, 0x59900005, 0x81300580, + 0x05000006, 0x91932410, 0x811a3000, 0x91180485, + 0x05fc17fa, 0x90000541, 0x1c01f000, 0x0501f803, + 0x40018800, 0x1c01f000, 0x59300004, 0x8c00053e, + 0x0500000c, 0x8c00050c, 0x0502000a, 0x8c000516, + 0x05020004, 0x90000d1f, 0x90040585, 0x05020003, + 0x600c0000, 0x0501f004, 0x60040000, 0x0501f002, + 0x59300203, 0x1c01f000, 0x4933c857, 0x05f1fa68, + 0x4df00000, 0x59300203, 0x90000c8e, 0x05ca1a8b, + 0x0c01f001, 0x00106f6c, 0x00106f7f, 0x00106f6f, + 0x00106f6b, 0x00106f6b, 0x00106f6b, 0x00106f6b, + 0x00106f6b, 0x00106f6b, 0x00106f6b, 0x00106f6b, 0x00106f6b, 0x00106f6b, 0x00106f6b, 0x05c9fa7b, - 0x4d2c0000, 0x59340400, 0x82000500, 0x000000ff, - 0x90000c8c, 0x05ca1a75, 0x59303403, 0x90180d84, - 0x05020003, 0x60040000, 0x0501f004, 0x90180d80, - 0x05020002, 0x60040000, 0x4803c857, 0x0c01f803, - 0x5c025800, 0x1c01f000, 0x00106f8a, 0x00106ff9, - 0x00106f8b, 0x00106fb2, 0x00106f8b, 0x0010700f, - 0x00106f8b, 0x00106f92, 0x00106f8a, 0x0010700f, - 0x00106f8a, 0x00106f9d, 0x05c9fa5c, 0x59300403, - 0x90000d96, 0x05000023, 0x90000d84, 0x05000021, - 0x90000d82, 0x0500001f, 0x0501fa49, 0x0500001d, - 0x59300403, 0x90000da2, 0x0500007b, 0x90000db9, - 0x0500007f, 0x90000db5, 0x0500007d, 0x90000d9e, - 0x05000015, 0x0501f947, 0x05000005, 0x0501fdf7, - 0x05020003, 0x05e5fccb, 0x0501f00e, 0x59300403, - 0x90000d81, 0x05020003, 0x05e5fc91, 0x05000009, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010b652, - 0x5c027800, 0x42000000, 0x001097f8, 0x050df8e6, - 0x05f9fc3d, 0x05f5f624, 0x0501f932, 0x05000003, - 0x0501fde2, 0x05000073, 0x59300c03, 0x90040596, - 0x0500003c, 0x90040582, 0x05020022, 0x59a8021b, - 0x8c000502, 0x0502000c, 0x05e9f920, 0x0502000a, - 0x05e9f93f, 0x05020004, 0x60040000, 0x05e9f8ef, - 0x0501f064, 0x64075014, 0x6006d800, 0x05e9f895, - 0x0501f060, 0x59340412, 0x82000500, 0x000000ff, - 0x05000010, 0x80000040, 0x48026c12, 0x497a6205, - 0x4d300000, 0x05f5fe36, 0x5c000000, 0x05000008, - 0x49780009, 0x641c0407, 0x4a000006, 0x00000398, - 0x4936600a, 0x64066407, 0x0501f01a, 0x40026000, - 0x59300403, 0x90000d82, 0x0502000b, 0x59340403, - 0x82000580, 0x000007fe, 0x05020007, 0x59a8021b, - 0x84000540, 0x4803521b, 0x05e1feaf, 0x05f9fc06, - 0x0501f00a, 0x05f9fc04, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010b652, 0x5c027800, 0x42000000, - 0x001097f8, 0x050df8a4, 0x05d5f9a1, 0x05f5f5e2, - 0x600c0800, 0x05e5f915, 0x64066203, 0x640a6403, - 0x05f1f040, 0x0501f8eb, 0x05fe07b6, 0x05d5f998, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010b652, - 0x5c027800, 0x42000000, 0x001097f8, 0x050df892, - 0x60603000, 0x41782800, 0x60002000, 0x4d400000, - 0x4d440000, 0x59368c03, 0x60a68000, 0x0501ffc2, - 0x5c028800, 0x5c028000, 0x05f5f5c7, 0x05e5fc5d, - 0x05fdf7d9, 0x42000000, 0x00109802, 0x050df882, - 0x05f5ffe0, 0x05fe07d4, 0x1c01f000, 0x59300c03, - 0x0501fbf2, 0x000600e7, 0x916c0583, 0x05000003, - 0x640a6006, 0x1c01f000, 0x59300403, 0x48026418, + 0x5c03e000, 0x05f00a3e, 0x05fdf6ed, 0x5c03e000, + 0x05f00a3b, 0x4d2c0000, 0x59325809, 0x59300403, + 0xb0000592, 0x05cc0fae, 0x0501fa04, 0x05c80a6f, + 0x64165a07, 0x0001fb2c, 0x05e5fec9, 0x05f5fed2, + 0x5c025800, 0x90000541, 0x1c01f000, 0x598c000b, + 0x81300580, 0x05020018, 0x59300004, 0x8c000520, + 0x05000004, 0x84000520, 0x48026004, 0x0501f018, + 0x42001000, 0x001097b0, 0x50081000, 0x58080002, + 0x82000580, 0x00000100, 0x05000009, 0x5808000b, + 0x81300580, 0x05ca0a55, 0x0201f800, 0x0010ba3e, + 0x80c40040, 0x05ca0a51, 0x05fdf7d9, 0x05f1fcc5, + 0x0502000c, 0x59300004, 0x8c000520, 0x05000004, + 0x84000520, 0x48026004, 0x05fdf7d1, 0x0201f800, + 0x0010ba3e, 0x80c40040, 0x05fc07cd, 0x05c9fa43, + 0x59300203, 0x90000c8e, 0x05ca1a40, 0x0c01f7b6, + 0x4d340000, 0x5932680a, 0x59300407, 0x4933c857, + 0x4803c857, 0x90000c92, 0x05ca1a38, 0x0c01f803, + 0x5c026800, 0x1c01f000, 0x00106fc7, 0x00106fe7, + 0x001070da, 0x0010c012, 0x001070d1, 0x001070d6, + 0x00108206, 0x00106fce, 0x001070cd, 0x00106fc4, + 0x0010712d, 0x00106fc4, 0x00106fc4, 0x00106fc4, + 0x00106fc4, 0x000208e7, 0x00107722, 0x00107722, + 0x05c9fa22, 0x0501faac, 0x05f804a5, 0x1c01f000, + 0x05f1f9f7, 0x05f1f960, 0x05f1f9e1, 0x0005f0e7, + 0x64066006, 0x1c01f000, 0x4d340000, 0x4c5c0000, + 0x59300203, 0x90000591, 0x05020011, 0x5932680a, + 0x4130b800, 0x0005f8ca, 0x0500000c, 0x64066203, + 0x647a6403, 0x585c041b, 0x4802641b, 0x585c021b, + 0x4802621b, 0x4936600a, 0x64066407, 0x42000800, + 0x80000040, 0x0005f87c, 0x405e6000, 0x0005f8e7, + 0x5c00b800, 0x5c026800, 0x1c01f000, 0x42000000, + 0x00109883, 0x050df976, 0x050df8a1, 0x59300203, + 0x90000c8e, 0x05ca19f9, 0x4803c857, 0x0c01f001, + 0x00106ffe, 0x00106fcc, 0x00106fff, 0x00106ffe, + 0x00106fff, 0x00106fff, 0x00106fc8, 0x00106ffe, + 0x00106fc5, 0x00106ffe, 0x00106ffe, 0x00106ffe, + 0x00106ffe, 0x00106ffe, 0x05c9f9e8, 0x83340580, + 0x0010993e, 0x05f4064c, 0x4d2c0000, 0x59340400, + 0x82000500, 0x000000ff, 0x90000c8c, 0x05ca19df, + 0x59303403, 0x90180d84, 0x05020003, 0x60040000, + 0x0501f004, 0x90180d80, 0x05020002, 0x60040000, + 0x4803c857, 0x0c01f803, 0x5c025800, 0x1c01f000, + 0x00107020, 0x0010708f, 0x00107021, 0x00107048, + 0x00107021, 0x001070a5, 0x00107021, 0x00107028, + 0x00107020, 0x001070a5, 0x00107020, 0x00107033, + 0x05c9f9c6, 0x59300403, 0x90000d96, 0x05000023, + 0x90000d84, 0x05000021, 0x90000d82, 0x0500001f, + 0x0501fa49, 0x0500001d, 0x59300403, 0x90000da2, + 0x0500007b, 0x90000db9, 0x0500007f, 0x90000db5, + 0x0500007d, 0x90000d9e, 0x05000015, 0x0501f947, + 0x05000005, 0x0501fdf7, 0x05020003, 0x05e5fc4a, + 0x0501f00e, 0x59300403, 0x90000d81, 0x05020003, + 0x05e5fc10, 0x05000009, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010b660, 0x5c027800, 0x42000000, + 0x00109878, 0x050df91a, 0x05f9fc25, 0x05f5f606, + 0x0501f932, 0x05000003, 0x0501fde2, 0x05000073, + 0x59300c03, 0x90040596, 0x0500003c, 0x90040582, + 0x05020022, 0x59a8021b, 0x8c000502, 0x0502000c, + 0x05e9f8c0, 0x0502000a, 0x05e9f8df, 0x05020004, + 0x60040000, 0x05e9f88f, 0x0501f064, 0x64075014, + 0x6006d800, 0x05e9f835, 0x0501f060, 0x59340412, + 0x82000500, 0x000000ff, 0x05000010, 0x80000040, + 0x48026c12, 0x497a6205, 0x4d300000, 0x05f5fe1c, + 0x5c000000, 0x05000008, 0x49780009, 0x641c0407, + 0x4a000006, 0x00000398, 0x4936600a, 0x64066407, + 0x0501f01a, 0x40026000, 0x59300403, 0x90000d82, + 0x0502000b, 0x59340403, 0x82000580, 0x000007fe, + 0x05020007, 0x59a8021b, 0x84000540, 0x4803521b, + 0x05e1fe25, 0x05f9fbee, 0x0501f00a, 0x05f9fbec, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010b660, + 0x5c027800, 0x42000000, 0x00109878, 0x050df8d8, + 0x05d5f90a, 0x05f5f5c4, 0x600c0800, 0x05e5f88b, + 0x64066203, 0x640a6403, 0x05f1f036, 0x0501f8eb, + 0x05fe07b6, 0x05d5f901, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010b660, 0x5c027800, 0x42000000, + 0x00109878, 0x050df8c6, 0x60603000, 0x41782800, + 0x60002000, 0x4d400000, 0x4d440000, 0x59368c03, + 0x60a68000, 0x0501ffc2, 0x5c028800, 0x5c028000, + 0x05f5f5a9, 0x05e5fbdc, 0x05fdf7d9, 0x42000000, + 0x00109882, 0x050df8b6, 0x05f5ffc8, 0x05fe07d4, + 0x1c01f000, 0x59300c03, 0x0501fbf2, 0x000600e7, + 0x916c0583, 0x05000003, 0x640a6006, 0x1c01f000, + 0x59300403, 0x48026418, 0x6406621f, 0x4a026403, + 0x00000085, 0x64266203, 0x640a6407, 0x42000800, + 0x80000040, 0x0005f07c, 0x05f9fbad, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010b660, 0x5c027800, + 0x42000000, 0x00109878, 0x050df899, 0x497a6009, + 0x641e6407, 0x4a026006, 0x00000398, 0x497a6205, + 0x1c01f000, 0x42000000, 0x00109889, 0x050df890, + 0x05fdf717, 0x42000000, 0x00109884, 0x050df88c, + 0x0509ffb7, 0x05f5f578, 0x42000000, 0x00109886, + 0x050df887, 0x1c01f000, 0x42000000, 0x00109885, + 0x050df883, 0x59300203, 0x90000c8e, 0x05ca1907, + 0x4803c857, 0x0c01f001, 0x001070f0, 0x00106fcc, + 0x001070f0, 0x001070f0, 0x001070f0, 0x001070f0, + 0x001070f0, 0x001070f0, 0x001070f0, 0x00106fcc, + 0x001070f1, 0x00106fcc, 0x001070f7, 0x001070f0, + 0x05c9f8f6, 0x4a026403, 0x0000008b, 0x642e6203, + 0x42000800, 0x80004040, 0x0005f07c, 0x59300a1f, + 0x0501f882, 0x0500000b, 0x4d2c0000, 0x59325809, + 0x641a5a07, 0x497a5c0a, 0x0001fb2c, 0x59300a1f, + 0x90040d83, 0x05e40afc, 0x5c025800, 0x497a6009, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010b660, + 0x5c027800, 0x60443000, 0x0509febb, 0x42000000, + 0x00109878, 0x050df852, 0x4c5c0000, 0x4130b800, + 0x05f5fd73, 0x05000007, 0x4936600a, 0x4d300000, + 0x405e6000, 0x05f5fd38, 0x5c026000, 0x0501f002, + 0x405e6000, 0x5c00b800, 0x497a6009, 0x64066407, + 0x64066403, 0x8d0c0520, 0x0500000b, 0x64126407, + 0x641e6203, 0x64066422, 0x60103000, 0x4d400000, + 0x60a68000, 0x41782800, 0x0509fa6b, 0x5c028000, + 0x1c01f000, 0x602c0800, 0x05e1ffec, 0x64066203, + 0x05edf798, 0x42000000, 0x0010988b, 0x050df830, + 0x59300203, 0x90000c8e, 0x05ca18b4, 0x4803c857, + 0x0c01f001, 0x00107153, 0x00107143, 0x00107145, + 0x00107154, 0x00107144, 0x00107143, 0x00107143, + 0x00107143, 0x00107143, 0x00107143, 0x00107143, + 0x00107143, 0x00107143, 0x00107143, 0x05c9f8a3, + 0x05cdf9cd, 0x4d2c0000, 0x59325809, 0x641a5a07, + 0x0001fb2c, 0x5c025800, 0x497a6009, 0x642a621f, + 0x4a026403, 0x00000085, 0x64266203, 0x640a6407, + 0x42000800, 0x80004040, 0x0005f07c, 0x1c01f000, + 0x05f1f86b, 0x4df00000, 0x05fdfde2, 0x05020003, + 0x05f1facf, 0x0502000a, 0x0201f800, 0x0010b8cb, + 0x80c40040, 0x05020004, 0x5c03e000, 0x05f1f84c, + 0x05fdf7e5, 0x05edff8d, 0x05ca0884, 0x5c03e000, + 0x05f1f847, 0x59300203, 0x90000d83, 0x05c8087f, + 0x90000c8e, 0x05ca187d, 0x0c01f7cb, 0x59a8000d, + 0x59a80860, 0x80040400, 0x80080480, 0x05021003, + 0x90000541, 0x1c01f000, 0x480bc857, 0x80000580, + 0x1c01f000, 0x0501f805, 0x60018800, 0x05000002, + 0x60058800, 0x1c01f000, 0x4c040000, 0x59300809, + 0x59a8000c, 0x80040480, 0x05001007, 0x59a8000a, + 0x80040480, 0x05021004, 0x800409c0, 0x5c000800, + 0x1c01f000, 0x800409c0, 0x05ca0860, 0x4803c856, + 0x05fdf7fb, 0x4803c856, 0x4d300000, 0x0005f8ca, + 0x05000007, 0x0501f827, 0x4d380000, 0x612e7000, + 0x0005f905, 0x5c027000, 0x90000541, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x05f5fcec, + 0x05000018, 0x0501f81b, 0x4d300000, 0x05f1f824, + 0x4df00000, 0x4d3c0000, 0x60027840, 0x0201f800, + 0x0010bc6f, 0x0201f800, 0x0010bd08, 0x0201f800, + 0x0010c0ee, 0x5c027800, 0x5c03e000, 0x05f00804, + 0x5c026000, 0x8d3c053e, 0x05020008, 0x4d380000, + 0x61327000, 0x0005f905, 0x5c027000, 0x90000541, + 0x5c026000, 0x1c01f000, 0x0005f8e7, 0x05fdf7fc, + 0x592c0408, 0x494a6019, 0x494e601a, 0x4936600a, + 0x492e6009, 0x640e6407, 0x59340802, 0x4806600b, + 0x800000c2, 0x800008c4, 0x80040400, 0x48026006, + 0x1c01f000, 0x493bc857, 0x4d300000, 0x0005f8ca, + 0x0500000a, 0x05fdffef, 0x4d400000, 0x60168000, + 0x0501f80a, 0x5c028000, 0x8d3c053e, 0x05020005, + 0x0005f905, 0x90000541, 0x5c026000, 0x1c01f000, + 0x0005f8e7, 0x05fdf7fc, 0x4803c856, 0x05edffec, + 0x4df00000, 0x4d3c0000, 0x4d440000, 0x59368c03, + 0x60067840, 0x0201f800, 0x0010bbea, 0x0201f800, + 0x0010bc34, 0x0201f800, 0x0010bd08, 0x0201f800, + 0x0010c0ee, 0x5c028800, 0x5c027800, 0x5c03e000, + 0x05ec07c7, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x05f5fc9b, 0x0500000b, 0x481a601e, 0x48ee6023, + 0x4936600a, 0x64066407, 0x492e6009, 0x4d380000, + 0x607e7000, 0x0005f905, 0x5c027000, 0x90000541, + 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x05f5fc8b, 0x0500000a, 0x48ee6023, 0x4936600a, + 0x64066407, 0x492e6009, 0x4d380000, 0x61567000, + 0x0005f905, 0x5c027000, 0x90000541, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x05f5fc7c, + 0x0500000b, 0x481a601e, 0x48ee6023, 0x4936600a, + 0x64066407, 0x492e6009, 0x4d380000, 0x60f67000, + 0x0005f905, 0x5c027000, 0x90000541, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x05f5fc6c, + 0x05000010, 0x4936600a, 0x492fc857, 0x4933c857, + 0x592c0405, 0x8c00051e, 0x05000003, 0x48efc857, + 0x48ee6023, 0x64066407, 0x492e6009, 0x4d380000, + 0x60027000, 0x0005f905, 0x5c027000, 0x90000541, + 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x05f5fc57, 0x0500000b, 0x48ee6023, 0x481a601e, + 0x4936600a, 0x64066407, 0x492e6009, 0x4d380000, + 0x61127000, 0x0005f905, 0x5c027000, 0x90000541, + 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x05f5fc47, 0x0500000b, 0x481a601e, 0x48ee6023, + 0x4936600a, 0x64066407, 0x492e6009, 0x4d380000, + 0x61267000, 0x0005f905, 0x5c027000, 0x90000541, + 0x5c026000, 0x1c01f000, 0x5930000a, 0x80001540, + 0x05c40f9a, 0x8d0c0512, 0x05020007, 0x5808040b, + 0x4803c856, 0x80000040, 0x05001003, 0x4800140b, + 0x05020008, 0x58080010, 0x80000540, 0x05000005, + 0x58080203, 0x80000540, 0x05020002, 0x64041203, + 0x1c01f000, 0x4803c856, 0x59300403, 0x90000d82, + 0x0500000b, 0x90000d83, 0x05000009, 0x90000d84, + 0x05000007, 0x599c0819, 0x8c04050e, 0x05000003, + 0x90000d80, 0x05000002, 0x90000541, 0x1c01f000, + 0x0501f805, 0x60058800, 0x05000002, 0x60018800, + 0x1c01f000, 0x4803c856, 0x4c000000, 0x4d2c0000, + 0x59300407, 0x90000584, 0x05000017, 0x59300009, + 0x80025d40, 0x800001c0, 0x05000013, 0x0501fbb1, + 0x0500000f, 0x59300407, 0x90004590, 0x0500000c, + 0x90004591, 0x0500000a, 0x90004583, 0x0500000a, + 0x90004582, 0x05000008, 0x9000458a, 0x05000006, + 0x592c0405, 0x8c00051e, 0x05000003, 0x80000580, + 0x0501f002, 0x90000541, 0x5c025800, 0x5c000000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x05f5fbf0, + 0x0500000f, 0x4936600a, 0x48ee6023, 0x64066407, + 0x492e6009, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010b660, 0x5c027800, 0x4d380000, 0x60a27000, + 0x0005f905, 0x5c027000, 0x90000541, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x91380595, 0x05020008, + 0x59a80073, 0xb00005b4, 0x05020005, 0x05e1ff29, + 0x64066203, 0x64a66403, 0x05edf616, 0x05f9f9bc, + 0x0005f0e7, 0x4803c856, 0x91380596, 0x05020004, + 0x60100800, 0x05e1fe61, 0x05f5f581, 0x91380595, + 0x0502000d, 0x59a80073, 0x90000594, 0x0502000a, + 0x05e1ff73, 0x05f9fd61, 0x05020007, 0x59340404, + 0x80000540, 0x05000004, 0x60180800, 0x05e1fe53, + 0x05f5f573, 0x05f9f9a6, 0x0005f0e7, 0x4803c856, + 0x592c0207, 0x90000585, 0x05000002, 0x1c01f000, + 0x4803c856, 0x592c0209, 0x8400054a, 0x48025a09, + 0x1c01f000, 0x59300809, 0x800409c0, 0x05000008, + 0x58040205, 0x82000580, 0x00000152, 0x05020004, + 0x59a8082a, 0x48066006, 0x1c01f000, 0x599c0416, + 0x800001c0, 0x05000007, 0x90000c84, 0x05001005, + 0x800000c2, 0x800008c4, 0x80040c00, 0x05fdf7f6, + 0x59300403, 0x90000582, 0x05fe07f2, 0x5930080a, + 0x58040403, 0x82000580, 0x000007fe, 0x05fe07ed, + 0x60a00800, 0x05fdf7ec, 0x497a6205, 0x497a6009, + 0x64066203, 0x65426403, 0x42000800, 0x80000043, + 0x0005f07c, 0x4933c857, 0x4d340000, 0x5932680a, + 0x59340200, 0x8c00050e, 0x05000005, 0x59300407, + 0x90000c92, 0x05021004, 0x0c01f805, 0x5c026800, + 0x1c01f000, 0x05fdfcc6, 0x05fdf7fd, 0x00106fc7, + 0x00107315, 0x00107319, 0x0010731c, 0x00108478, + 0x00108490, 0x00108494, 0x00106fc7, 0x00106fc7, + 0x00106fc7, 0x00106fc7, 0x00106fc7, 0x00106fc7, + 0x00106fc7, 0x00106fc7, 0x00106fc7, 0x00106fc7, + 0x00106fc7, 0x4803c856, 0x40000000, 0x40000000, + 0x1c01f000, 0x40000000, 0x40000000, 0x1c01f000, + 0x5930001e, 0x4803c857, 0x59300416, 0x4933c857, + 0x4803c857, 0x8c000502, 0x05000005, 0x4803c857, + 0x84000540, 0x48026416, 0x1c01f000, 0x42000000, + 0xd0000000, 0x41300800, 0x05c9fd44, 0x0501f80e, + 0x0502000c, 0x59300c16, 0x59300403, 0xb0000580, + 0x05000003, 0x84040d40, 0x0501f004, 0x59a8002a, + 0x9000040a, 0x48026205, 0x84040d42, 0x48066416, + 0x1c01f000, 0x4933c857, 0x4d340000, 0x5932680a, + 0x59340a00, 0x8c04050e, 0x05c40ea8, 0x5930001e, + 0x80000540, 0x0502002c, 0x59300403, 0x4803c857, + 0xb0000580, 0x05000003, 0x8d0c050e, 0x05020024, + 0x4d1c0000, 0x41323800, 0x05f5fb39, 0x0500001e, + 0x4932381e, 0x591c0416, 0x84000542, 0x48023c16, + 0x4936600a, 0x591c0407, 0x90000583, 0x05000006, + 0x591c0202, 0x4802641b, 0x591c0402, 0x4802621b, + 0x0501f005, 0x591c0202, 0x4802621b, 0x591c0402, + 0x4802641b, 0x491e6020, 0x64066407, 0x64d66403, + 0x64066203, 0x42000800, 0x80000040, 0x0005f87c, + 0x411e6000, 0x5c023800, 0x80000580, 0x5c026800, + 0x1c01f000, 0x411e6000, 0x5c023800, 0x59a8002c, + 0x48026205, 0x90000541, 0x05fdf7f9, 0x4933c857, + 0x4d2c0000, 0x4932381e, 0x4a026202, 0x0000ffff, + 0x591e5809, 0x591c0008, 0x8c00051e, 0x05000005, + 0x8400051e, 0x48023808, 0x497a580a, 0x0501f016, + 0x592c0409, 0x8c000518, 0x05000013, 0x84000518, + 0x48025c09, 0x4d400000, 0x592e8207, 0x64065a07, + 0x0501faad, 0x49425a07, 0x5c028000, 0x497a580a, + 0x592c0409, 0x8c000512, 0x05000007, 0x4d2c0000, + 0x84000512, 0x48025c09, 0x592e580a, 0x05c9f9f2, + 0x5c025800, 0x59a8002c, 0x48026205, 0x591c0216, + 0x48026218, 0x90000d81, 0x05000006, 0x640a3a03, + 0x90000585, 0x05000007, 0x497a6017, 0x0501f01c, + 0x591c0008, 0x84000540, 0x48023808, 0x64123a03, + 0x591c0416, 0x4803c857, 0x8400051c, 0x84000554, + 0x48023c16, 0x592c0010, 0x40001000, 0x591c0818, + 0x80040480, 0x05fe17f1, 0x591c0018, 0x82000500, + 0xfffffffc, 0x48026017, 0x48023818, 0x591c0a16, + 0x4807c857, 0x90040d85, 0x05020005, 0x480bc857, + 0x4803c857, 0x4a023814, 0xffffffff, 0x591c0402, + 0x4802641b, 0x591c0202, 0x4802621b, 0x591e680a, + 0x4936600a, 0x64066407, 0x64e66403, 0x64066203, + 0x42000800, 0x80000040, 0x0005f87c, 0x5c025800, + 0x1c01f000, 0x4933c857, 0x59300416, 0x8c000514, + 0x05000015, 0x8c00051c, 0x05020012, 0x59300018, + 0x80100480, 0x05001006, 0x05000005, 0x59300416, + 0x84000514, 0x8400055c, 0x0501f009, 0x48126018, + 0x48126014, 0x40100000, 0x592c1810, 0x800c0480, + 0x48026013, 0x59300416, 0x84000514, 0x48026416, + 0x1c01f000, 0x4933c857, 0x8c00051c, 0x05020008, + 0x59300014, 0x4803c857, 0x48026018, 0x59300416, + 0x8400055c, 0x4803c857, 0x48026416, 0x1c01f000, + 0x0501f805, 0x60058800, 0x05000002, 0x60018800, + 0x1c01f000, 0x59300c03, 0x4933c857, 0x4807c857, + 0x900404b4, 0x05001005, 0x900404bc, 0x05021003, + 0x80000580, 0x1c01f000, 0x90000541, 0x05fdf7fe, + 0x41780800, 0x59a81028, 0x60c80000, 0x05edfc11, + 0x800811c0, 0x05020002, 0x60501000, 0x480b502a, + 0x59a81029, 0x480b5022, 0x41780800, 0x61900000, + 0x05edfc08, 0x800811c0, 0x05020002, 0x60501000, + 0x480b502b, 0x9008140a, 0x480b502c, 0x60040800, + 0x05edfdf0, 0x42000000, 0x30000000, 0x40080800, + 0x0001f91e, 0x600c0800, 0x59a8100f, 0x05edfddb, + 0x05e1f7c7, 0x64a3502a, 0x6453502b, 0x4a035022, + 0x000007d0, 0x60781000, 0x480b502c, 0x60040800, + 0x05edfde0, 0x42000000, 0x30000000, 0x40080800, + 0x0001f91e, 0x600c0800, 0x59a8100f, 0x05edf5cb, + 0x4933c857, 0x4d2c0000, 0x59300403, 0x900005be, + 0x05020004, 0x59325819, 0x812e59c0, 0x05ca094d, + 0x5c025800, 0x1c01f000, 0x4937c857, 0x4d300000, + 0x05f5fa53, 0x0500000b, 0x4936600a, 0x64066407, + 0x492e6009, 0x60240800, 0x05e1fce0, 0x4d380000, + 0x60ce7000, 0x0005f905, 0x5c027000, 0x90000541, + 0x5c026000, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x4c580000, 0x4d3c0000, 0x59325809, 0x91380595, + 0x0502001d, 0x59a8b073, 0x90580c99, 0x05001002, + 0x6060b000, 0x8058b104, 0x0501f9aa, 0x80000580, + 0x0501f9b9, 0x912cac0a, 0x91cca406, 0x0509fdda, + 0x4c600000, 0x6004c000, 0x592c100b, 0x8c080518, + 0x05020006, 0x59a8000f, 0x592c100e, 0x80080580, + 0x05020006, 0x4178c000, 0x5930100a, 0x58081403, + 0x417a7800, 0x05d1fd5c, 0x5c00c000, 0x05f5fbd8, + 0x0501f005, 0x6008b000, 0x0501f9af, 0x05f9f808, + 0x0005f8e7, 0x5c027800, 0x5c00b000, 0x5c025800, + 0x1c01f000, 0x4933c856, 0x60018800, 0x4936600a, + 0x64066407, 0x492e6009, 0x4d380000, 0x61367000, + 0x0005f905, 0x5c027000, 0x90000541, 0x60058800, + 0x1c01f000, 0x4803c856, 0x4d2c0000, 0x91380595, + 0x05020025, 0x59a80873, 0x59325809, 0x5930040c, + 0x80040580, 0x05020020, 0x4c500000, 0x4c540000, + 0x4c580000, 0x91cca406, 0x4050a800, 0x5930b40c, + 0x9058b403, 0x8058b104, 0x0509fdde, 0x91cca406, + 0x592cb206, 0x9058b403, 0x8058b104, 0x912cac07, + 0x0509fd9d, 0x592e5801, 0x812e59c0, 0x05fe07f9, + 0x5931d823, 0x58ef400a, 0x58ee580c, 0x4a025a05, + 0x00000103, 0x58ec0008, 0x0801f800, 0x59300402, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, + 0x1c01f000, 0x05f5ffce, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x90040db5, 0x05000005, 0x5930141b, + 0x0501f844, 0x05000025, 0x0501f006, 0x4d300000, + 0x59326020, 0x0501f848, 0x5c026000, 0x0500001e, + 0x591c0c07, 0x90040583, 0x05000003, 0x90040586, + 0x0502001b, 0x591c0c02, 0x5930041b, 0x80040580, + 0x05000009, 0x5930021b, 0x80040580, 0x05020014, + 0x591c0a02, 0x5930041b, 0x80040580, 0x05020010, + 0x0501f009, 0x59300a1b, 0x82040580, 0x0000ffff, + 0x05000005, 0x591c0202, 0x59300a1b, 0x80040580, + 0x05020007, 0x591c000a, 0x5930080a, 0x80040580, + 0x1c01f000, 0x417a3800, 0x90000541, 0x1c01f000, + 0x4803c856, 0x4203e000, 0xb0800000, 0x600009fe, + 0x4203f800, 0x30000000, 0x40000000, 0x80040840, + 0x05c40d12, 0x05ffb7fb, 0x1c01f000, 0x4803c856, + 0x4203e000, 0xb0800000, 0x4203f800, 0x20000000, + 0x1c01f000, 0x0501f805, 0x60058800, 0x05020002, + 0x60018800, 0x1c01f000, 0x59300808, 0x8c04051e, + 0x592c0c09, 0x05020002, 0x8c040518, 0x1c01f000, + 0x05fdfc83, 0x05000007, 0x800800c4, 0x800808ca, + 0x80040c00, 0x82063c00, 0x0010ccb4, 0x491fc857, + 0x1c01f000, 0x0501fbff, 0x05020007, 0x59301402, + 0x05fdfff4, 0x05000007, 0x411c0000, 0x81300580, + 0x05000003, 0x81780500, 0x0501f002, 0x81300540, + 0x1c01f000, 0x4d300000, 0x0001fac4, 0x0502000a, + 0x42026000, 0x0010cc6c, 0x4936600a, 0x492e6009, + 0x0201f800, 0x0010b660, 0x80000580, 0x5c026000, + 0x1c01f000, 0x90000541, 0x05fdf7fd, 0x4933c857, + 0x05fdfc6e, 0x05c40cd9, 0x4d2c0000, 0x4d340000, + 0x4d440000, 0x4c580000, 0x59325809, 0x5932680a, + 0x49425a07, 0x05e9fa7b, 0x592e8c07, 0x592c4208, + 0x9020050f, 0x0c01f806, 0x5c00b000, 0x5c028800, + 0x5c026800, 0x5c025800, 0x1c01f000, 0x00107531, + 0x0010754f, 0x00107555, 0x00107558, 0x00107560, + 0x0010752f, 0x0010752f, 0x0010752f, 0x00107563, + 0x0010756d, 0x0010756d, 0x0010752f, 0x0010752f, + 0x0010752f, 0x0010752f, 0x0010752f, 0x4803c857, + 0x05c5fcb6, 0x814281c0, 0x05020011, 0x41785800, + 0x592c0405, 0x8c00051c, 0x05020002, 0x59345c05, + 0x442c2800, 0x59340008, 0x48002802, 0x59340009, + 0x48002801, 0x59340006, 0x48002804, 0x59340007, + 0x48002803, 0x602cb000, 0x0501f02d, 0x592c0208, + 0x8c00051e, 0x6008b000, 0x05020029, 0x9004b540, + 0x05000027, 0x44042800, 0x5932680a, 0x59340400, + 0x48002801, 0x6008b000, 0x0501f021, 0x814281c0, + 0x05fe07f3, 0x59345c05, 0x442c2800, 0x6004b000, + 0x0501f01b, 0x9140b540, 0x05000019, 0x0501f021, + 0x814281c0, 0x0502001f, 0x59340200, 0x44002800, + 0x59340001, 0x48002801, 0x6008b000, 0x0501f010, + 0x9140b540, 0x05020017, 0x0501f00d, 0x9140b540, + 0x0500000b, 0x05e1ff2a, 0x05000012, 0x8c20050e, + 0x05000002, 0x497a600a, 0x4178b000, 0x497a5a07, + 0x0501f003, 0x9140b540, 0x0502000a, 0x592c0405, + 0x8400051c, 0x48025c05, 0x592c0208, 0x8400051e, + 0x48025a08, 0x0501f87f, 0x497a6009, 0x0001f32c, + 0x592c0208, 0x8c00051e, 0x6008b000, 0x05fe07f4, + 0x9004b540, 0x05fc07f2, 0x44042800, 0x6004b000, + 0x05fdf7ef, 0x4937c857, 0x4d300000, 0x05f5f900, + 0x0500000b, 0x4936600a, 0x64066407, 0x492e6009, + 0x602c0800, 0x05e1fb8d, 0x4d380000, 0x610e7000, + 0x0005f905, 0x5c027000, 0x90000541, 0x5c026000, + 0x1c01f000, 0x4937c857, 0x4d2c0000, 0x59325809, + 0x91380595, 0x05020022, 0x59a80073, 0x90000584, + 0x0502001f, 0x59a8000f, 0x592c100a, 0x80080580, + 0x05020011, 0x4d440000, 0x592e8c07, 0x592c0208, + 0x4803c856, 0x82000500, 0x00000080, 0x84000548, + 0x4d3c0000, 0x60027820, 0x8c00050e, 0x05000002, + 0x853e7d5c, 0x05e1fe5e, 0x5c027800, 0x5c028800, + 0x0501f003, 0x4803c856, 0x05e1fee1, 0x05fdfbcb, + 0x05000011, 0x4d400000, 0x60028000, 0x41780800, + 0x05fdff57, 0x5c028000, 0x0501f00a, 0x05e1fed8, + 0x05fe07f7, 0x05fdfbc1, 0x05000007, 0x4c580000, + 0x6008b000, 0x0501f854, 0x5c00b000, 0x05f5feac, + 0x0005f8e7, 0x5c025800, 0x1c01f000, 0x4937c857, + 0x4d300000, 0x05f5f8be, 0x0500000d, 0x4936600a, + 0x64066407, 0x4d3c0000, 0x4d380000, 0x417a7800, + 0x05e1fb3f, 0x492e6009, 0x60127000, 0x0005f905, + 0x5c027000, 0x5c027800, 0x90000541, 0x5c026000, + 0x1c01f000, 0x4937c857, 0x4d300000, 0x05f5f8ac, + 0x0500000b, 0x4936600a, 0x600c0800, 0x05e1fb3b, + 0x64066407, 0x492e6009, 0x4d380000, 0x61467000, + 0x0005f905, 0x5c027000, 0x90000541, 0x5c026000, + 0x1c01f000, 0x4933c857, 0x61f2880f, 0x42003000, + 0x00fffffc, 0x05e1fb60, 0x05c60bfc, 0x4936600a, + 0x417a7800, 0x05e1fb1e, 0x600c0800, 0x05e1fb27, + 0x497a6c12, 0x64066203, 0x640a6403, 0x05edf2d1, + 0x492fc857, 0x4c580000, 0x4c000000, 0x8058b1c0, + 0x0500000a, 0x82580500, 0xfffffff0, 0x05c60beb, + 0x8058b0d0, 0x592c0409, 0x82000500, 0xfffff0ff, + 0x80580540, 0x48025c09, 0x5c000000, 0x5c00b000, + 0x1c01f000, 0x492fc857, 0x4c000000, 0x4c040000, + 0x800000d8, 0x592c0c09, 0x82040d00, 0xffff0fff, + 0x80040540, 0x48025c09, 0x5c000800, 0x5c000000, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x59325809, + 0x592c0208, 0x8400055e, 0x48025a08, 0x4c500000, + 0x4c540000, 0x4c580000, 0x05fdffda, 0x05e9f975, + 0x64602800, 0x80142800, 0x8058b040, 0x91cca407, + 0x4014a800, 0x0509fc08, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x5c025800, 0x1c01f000, 0x0501f805, + 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, + 0x59325809, 0x592c0205, 0x82000580, 0x00000152, + 0x1c01f000, 0x59300021, 0x80000540, 0x05ca0bcd, + 0x1c01f000, 0x4d2c0000, 0x59325809, 0x59300203, + 0x4933c857, 0x492fc857, 0x493bc857, 0x4803c857, + 0x9000348e, 0x05c61ba9, 0x0c01f803, 0x5c025800, + 0x1c01f000, 0x0010764f, 0x00107655, 0x0010767c, + 0x0010764f, 0x0010764f, 0x0010764f, 0x0010764f, + 0x0010764f, 0x00107650, 0x0010764f, 0x0010764f, + 0x0010764f, 0x0010764f, 0x0010764f, 0x05c5fb97, + 0xb1383498, 0x05c61b95, 0x493a6403, 0x64066203, + 0x05edf270, 0x91380593, 0x0502000c, 0x492fc857, + 0x592c000d, 0x800001c0, 0x05000005, 0x640a6203, + 0x59a8002a, 0x48026006, 0x1c01f000, 0x64025a07, + 0x0001fb2c, 0x0005f0e7, 0x913805a7, 0x05000011, + 0x91380594, 0x0500000b, 0x91380595, 0x05000003, + 0x91380596, 0x05c60b7d, 0x05edfe9b, 0x05f6004b, + 0x59300203, 0x90000582, 0x05c60b78, 0x0501f00d, + 0x4937c857, 0x05edfab8, 0x6446580f, 0x0501f004, + 0x4937c857, 0x05edfab4, 0x6442580f, 0x64c65a07, + 0x6412580e, 0x0001fb2c, 0x05e1ffc9, 0x05f1f7d2, + 0x59341400, 0x82081d00, 0x000000ff, 0x59300c03, + 0x480bc857, 0x4807c857, 0xb0040593, 0x05000020, + 0x90040582, 0x0500000f, 0x90040581, 0x05000010, + 0x90040583, 0x05000013, 0x90040585, 0x05000014, + 0x900405b3, 0x05000012, 0x90040580, 0x05000013, + 0x90040584, 0x05c60b55, 0x0501f874, 0x0501f010, + 0x900c0583, 0x05000837, 0x0501f00d, 0x900c058b, + 0x0502000b, 0x601c0800, 0x05e1fa7c, 0x0501f008, + 0x900c0585, 0x05000849, 0x0501f005, 0x900c0589, + 0x05000864, 0x0501f002, 0x0501f869, 0x654a6403, + 0x59a81073, 0x592c040c, 0x8c000500, 0x05000002, + 0x60201000, 0x592c040c, 0x8c000516, 0x05000002, + 0x90081418, 0x592c000d, 0x497a580e, 0x497a580f, + 0x80080c80, 0x05000007, 0x05001004, 0x641e5a07, + 0x40001000, 0x0501f004, 0x64565a07, 0x0501f002, + 0x64025a07, 0x480a580d, 0x05f5f914, 0x0500000d, + 0x592c1001, 0x480a600d, 0x58080800, 0x90080402, + 0x592c1012, 0x592c1813, 0x60003000, 0x42002000, + 0x00100efc, 0x05f5fa35, 0x05000002, 0x1c01f000, + 0x64b25a07, 0x497a580d, 0x0001fb2c, 0x0005f0e7, + 0x91380595, 0x05020007, 0x59a80086, 0x8c000502, + 0x05020006, 0x05e1fb03, 0x60100800, 0x05e1f243, + 0x601c0800, 0x05e1f241, 0x05e5fa3e, 0x60401000, + 0x05020008, 0x59340002, 0x82000500, 0x00ff0000, + 0x82000580, 0x00ff0000, 0x05fc07f3, 0x60201000, + 0x05e1ffac, 0x05fc07f0, 0x592c040c, 0x84000540, + 0x48025c0c, 0x05fdf7ef, 0x91380595, 0x0502000b, + 0x59a80086, 0x8c000502, 0x0502000a, 0x05e1fb44, + 0x4d3c0000, 0x417a7800, 0x05e1fa1d, 0x5c027800, + 0x60180800, 0x05e1f225, 0x60100800, 0x05e1f223, + 0x05e5fa20, 0x60401000, 0x05020008, 0x59340002, + 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, + 0x05fc07ef, 0x60201000, 0x05e1ff8e, 0x05fc07ec, + 0x592c040c, 0x84000540, 0x48025c0c, 0x05fdf7ef, + 0x60100800, 0x05e1f211, 0x91380595, 0x05020003, + 0x0505fc1d, 0x05e00c92, 0x1c01f000, 0x91380595, + 0x05020015, 0x4c580000, 0x91cc1408, 0x6008b000, + 0x91341c06, 0x05f9f926, 0x0502000e, 0x91cc140a, + 0x6008b000, 0x91341c08, 0x05f9f921, 0x05020009, + 0x59342200, 0x59cc1007, 0x800811c0, 0x05000003, + 0x480a6801, 0x84102542, 0x8410251a, 0x48126a00, + 0x5c00b000, 0x1c01f000, 0x42000000, 0x00109890, + 0x0509fa3b, 0x05edfa9a, 0x59300203, 0x4933c857, + 0x4803c857, 0x90000c8e, 0x05c61abc, 0x0c01f802, + 0x05edf27f, 0x0010773c, 0x00107745, 0x0010773d, + 0x0010773b, 0x0010773b, 0x0010773b, 0x0010773b, + 0x0010773b, 0x0010773b, 0x0010773b, 0x0010773b, + 0x0010773b, 0x0010773b, 0x0010773b, 0x05c5faab, + 0x1c01f000, 0x59300403, 0xb0000592, 0x05fc008d, + 0x05e1ff03, 0x59325809, 0x641a5a07, 0x0001fb2c, + 0x05f1f709, 0x59301804, 0x840c0520, 0x48026004, + 0x598c000b, 0x81300580, 0x0502000f, 0x8c0c0520, + 0x0502000f, 0x42001000, 0x001097b0, 0x50081000, + 0x58080002, 0x82000580, 0x00000100, 0x0500000d, + 0x5808000b, 0x81300580, 0x05c60a90, 0x4978100b, + 0x0501f003, 0x8c0c0520, 0x05fe07e3, 0x0201f800, + 0x0010ba3e, 0x80c40040, 0x05fc07df, 0x05c5fa87, + 0x05edfcfc, 0x05fc07fa, 0x59300203, 0x90000c8e, + 0x05c61a82, 0x0c01f7c8, 0x4933c857, 0x4c500000, + 0x4c540000, 0x4c580000, 0x592c0c08, 0x48065814, + 0x59cc0809, 0x48065808, 0x59cc0808, 0x4806580c, + 0x59a80885, 0x82040500, 0x000003ff, 0x800010c4, + 0x8c040514, 0x05000004, 0x59cc0002, 0x90000503, + 0x80081480, 0x480a621c, 0x412c0800, 0x05c5fdda, + 0x05c40a6a, 0x492c080a, 0x58040409, 0x84000552, + 0x84000540, 0x48000c09, 0x90081403, 0x80081104, + 0x91cca406, 0x912cac05, 0x60400800, 0x90080490, + 0x05021003, 0x40080800, 0x80000580, 0x4004b000, + 0x4c000000, 0x0509fad7, 0x5c000000, 0x800001c0, + 0x0500000a, 0x412c1000, 0x4c000000, 0x05c5fdc2, + 0x05c40a52, 0x492c1001, 0x912cac05, 0x5c000000, + 0x40001000, 0x05fdf7ee, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x4c380000, 0x59325809, 0x5930021c, 0x48025a09, + 0x59301013, 0x640a6203, 0x592c020b, 0x8c000500, + 0x05000004, 0x59300017, 0x592c1010, 0x80081480, + 0x800811c0, 0x05020007, 0x64025a07, 0x592c000c, + 0x82000500, 0x00000c00, 0x05000009, 0x0501f009, + 0x8c08053e, 0x05000005, 0x641e5a07, 0x80081080, + 0x80081000, 0x0501f002, 0x64565a07, 0x480a5808, + 0x42000000, 0x001099e8, 0x50007000, 0x5838000a, + 0x80000540, 0x05020007, 0x4930700b, 0x4930700a, + 0x58380002, 0x90000580, 0x05020808, 0x0501f004, + 0x90001400, 0x45301000, 0x4930700a, 0x5c007000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x592c000a, + 0x40001000, 0x48007009, 0x90080405, 0x48007003, + 0x592c000e, 0x592c100f, 0x48007006, 0x48087007, + 0x592c0014, 0x592c1209, 0x80080c80, 0x05001002, + 0x40001000, 0x90081403, 0x80081104, 0x90080490, + 0x05021003, 0x80000580, 0x0501f002, 0x60401000, + 0x4800700c, 0x48087004, 0x800810c4, 0x48087005, + 0x40381000, 0x0001f01c, 0x4d2c0000, 0x05c5fd6a, + 0x05c409fa, 0x42000800, 0x001099e8, 0x452c0800, + 0x497a580a, 0x497a580b, 0x497a580c, 0x4a025808, + 0x001077fa, 0x4a025802, 0x00000100, 0x64025801, + 0x5c025800, 0x1c01f000, 0x4833c857, 0x4d300000, + 0x4d2c0000, 0x4c5c0000, 0x4030b800, 0x585c0009, + 0x80025d40, 0x05020004, 0x585c000b, 0x4c000000, + 0x0501f03a, 0x585c0002, 0x82000580, 0x00000100, + 0x0502001c, 0x592c0801, 0x4c040000, 0x05c5fd6d, + 0x5c000800, 0x800409c0, 0x05000017, 0x4804b809, + 0x585c100c, 0x800811c0, 0x05020004, 0x40065800, + 0x05c5fd6d, 0x0501f010, 0x90080490, 0x05021003, + 0x80000580, 0x0501f002, 0x60401000, 0x4800b80c, + 0x4808b804, 0x800810c4, 0x4808b805, 0x90040405, + 0x4800b803, 0x405c1000, 0x0001f81c, 0x0501f021, + 0x0501f824, 0x585c000b, 0x80026540, 0x59300000, + 0x80000d40, 0x05020002, 0x4800b80a, 0x4800b80b, + 0x497a6000, 0x4c000000, 0x4978b809, 0x59325809, + 0x4a025a05, 0x00000103, 0x59300402, 0x48025c07, + 0x592c100c, 0x4c080000, 0x0001fb2c, 0x05fdfa13, + 0x5c001000, 0x8c080518, 0x05000003, 0x05fdfab3, + 0x0501f002, 0x0005f8e7, 0x405c7000, 0x5c000000, + 0x80026540, 0x05000003, 0x59325809, 0x05fdff8b, + 0x5c00b800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x483bc857, 0x58380009, 0x40025800, 0x05c5fd36, + 0x5838000b, 0x80026540, 0x59300009, 0x80025d40, + 0x640a5a07, 0x1c01f000, 0x4803c857, 0x4933c857, + 0x4d1c0000, 0x497a601e, 0x41323800, 0x40026000, + 0x4d3c0000, 0x60167800, 0x0501f836, 0x5c027800, + 0x411e6000, 0x4933c857, 0x59300416, 0x84000502, + 0x48026416, 0x5c023800, 0x1c01f000, 0x481bc857, + 0x4933c857, 0x4c5c0000, 0x4c600000, 0x4010b800, + 0x4014c000, 0x0505ff5c, 0x8d0c0520, 0x05000006, + 0x40602800, 0x405c3000, 0x0505fb2c, 0x90000541, + 0x0501f002, 0x80000580, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x42026000, + 0x0010ccb4, 0x59a8000d, 0x81640580, 0x05000013, + 0x59300c07, 0x90040581, 0x05000009, 0x90040584, + 0x05000004, 0x90040590, 0x05f80ed4, 0x0501f007, + 0x59300203, 0x90000d87, 0x05000004, 0x4807c857, + 0x05fdfb65, 0x05020807, 0x91326424, 0x41580000, + 0x81300480, 0x05fc17ec, 0x5c026000, 0x1c01f000, + 0x4933c857, 0x59300403, 0x4803c857, 0x05edf92c, + 0x4df00000, 0x59300407, 0x4803c857, 0x90000d82, + 0x05000011, 0x90000d81, 0x05000007, 0x90000d84, + 0x05000005, 0x4933c856, 0x5c03e000, 0x05ec090c, + 0x0501f036, 0x59300203, 0x90000d81, 0x05000010, + 0x90000d82, 0x05000027, 0x90000d85, 0x05000025, + 0x05c5f93e, 0x59300203, 0x90000d89, 0x05000008, + 0x90000d8b, 0x05000006, 0x90000d8a, 0x0500001d, + 0x90000d8c, 0x0500001b, 0x05c5f934, 0x598c000b, + 0x81300580, 0x05020003, 0x05edfba6, 0x05020015, + 0x59300004, 0x4803c857, 0x8c000520, 0x05000004, + 0x84000520, 0x48026004, 0x0501f00e, 0x0201f800, + 0x0010ba3e, 0x80c40040, 0x05c60924, 0x5c03e000, + 0x05ec08e7, 0x59300407, 0x90000d82, 0x0500000f, + 0x05e1fd7b, 0x05fdf9a8, 0x05f40ba1, 0x0501f00b, + 0x5c03e000, 0x05ec08de, 0x59300407, 0x90000d82, + 0x05000006, 0x05e1fd72, 0x05fdf99f, 0x05f40b98, + 0x8d3c0500, 0x05000003, 0x0505ffb7, 0x05f1f576, 0x6406621f, 0x4a026403, 0x00000085, 0x64266203, 0x640a6407, 0x42000800, 0x80000040, 0x0005f07c, - 0x05f9fbc5, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010b652, 0x5c027800, 0x42000000, 0x001097f8, - 0x050df865, 0x497a6009, 0x641e6407, 0x4a026006, - 0x00000398, 0x497a6205, 0x1c01f000, 0x42000000, - 0x00109809, 0x050df85c, 0x05fdf71a, 0x42000000, - 0x00109804, 0x050df858, 0x0509ff83, 0x05f5f596, - 0x42000000, 0x00109806, 0x050df853, 0x1c01f000, - 0x42000000, 0x00109805, 0x050df84f, 0x59300203, - 0x90000c8e, 0x05ca199d, 0x4803c857, 0x0c01f001, - 0x0010705a, 0x00106f39, 0x0010705a, 0x0010705a, - 0x0010705a, 0x0010705a, 0x0010705a, 0x0010705a, - 0x0010705a, 0x00106f39, 0x0010705b, 0x00106f39, - 0x00107061, 0x0010705a, 0x05c9f98c, 0x4a026403, - 0x0000008b, 0x642e6203, 0x42000800, 0x80004040, - 0x0005f07c, 0x59300a1f, 0x0501f882, 0x0500000b, - 0x4d2c0000, 0x59325809, 0x641a5a07, 0x497a5c0a, - 0x0001fb2c, 0x59300a1f, 0x90040d83, 0x05e40b7f, - 0x5c025800, 0x497a6009, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010b652, 0x5c027800, 0x60443000, - 0x0509fe87, 0x42000000, 0x001097f8, 0x050df81e, - 0x4c5c0000, 0x4130b800, 0x05f5fd8d, 0x05000007, - 0x4936600a, 0x4d300000, 0x405e6000, 0x05f5fd56, - 0x5c026000, 0x0501f002, 0x405e6000, 0x5c00b800, - 0x497a6009, 0x64066407, 0x64066403, 0x8d0c0520, - 0x0500000b, 0x64126407, 0x641e6203, 0x64066422, - 0x60103000, 0x4d400000, 0x60a68000, 0x41782800, - 0x0509fa50, 0x5c028000, 0x1c01f000, 0x602c0800, - 0x05e5f876, 0x64066203, 0x05edf7a2, 0x42000000, - 0x0010980b, 0x0509fffc, 0x59300203, 0x90000c8e, - 0x05ca194a, 0x4803c857, 0x0c01f001, 0x001070bd, - 0x001070ad, 0x001070af, 0x001070be, 0x001070ae, - 0x001070ad, 0x001070ad, 0x001070ad, 0x001070ad, - 0x001070ad, 0x001070ad, 0x001070ad, 0x001070ad, - 0x001070ad, 0x05c9f939, 0x05cdfa63, 0x4d2c0000, - 0x59325809, 0x641a5a07, 0x0001fb2c, 0x5c025800, - 0x497a6009, 0x642a621f, 0x4a026403, 0x00000085, - 0x64266203, 0x640a6407, 0x42000800, 0x80004040, - 0x0005f07c, 0x1c01f000, 0x05f1f875, 0x4df00000, - 0x05fdfde5, 0x05020003, 0x05f1fad9, 0x0502000a, - 0x0201f800, 0x0010b8bb, 0x80c40040, 0x05020004, - 0x5c03e000, 0x05f1f856, 0x05fdf7e5, 0x05edff97, - 0x05ca091a, 0x5c03e000, 0x05f1f851, 0x59300203, - 0x90000d83, 0x05c80915, 0x90000c8e, 0x05ca1913, - 0x0c01f7cb, 0x59a8000d, 0x59a80860, 0x80040400, - 0x80080480, 0x05021003, 0x90000541, 0x1c01f000, - 0x480bc857, 0x80000580, 0x1c01f000, 0x0501f805, - 0x60018800, 0x05000002, 0x60058800, 0x1c01f000, - 0x4c040000, 0x59300809, 0x59a8000c, 0x80040480, - 0x05001007, 0x59a8000a, 0x80040480, 0x05021004, - 0x800409c0, 0x5c000800, 0x1c01f000, 0x800409c0, - 0x05ca08f6, 0x4803c856, 0x05fdf7fb, 0x4803c856, - 0x4d300000, 0x0005f8ca, 0x05000007, 0x0501f827, - 0x4d380000, 0x612e7000, 0x0005f905, 0x5c027000, - 0x90000541, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x05f5fd06, 0x05000018, 0x0501f81b, - 0x4d300000, 0x05f1f82e, 0x4df00000, 0x4d3c0000, - 0x60027840, 0x0201f800, 0x0010bc6a, 0x0201f800, - 0x0010bd03, 0x0201f800, 0x0010c0f3, 0x5c027800, - 0x5c03e000, 0x05f0080e, 0x5c026000, 0x8d3c053e, - 0x05020008, 0x4d380000, 0x61327000, 0x0005f905, - 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, - 0x0005f8e7, 0x05fdf7fc, 0x592c0408, 0x494a6019, - 0x494e601a, 0x4936600a, 0x492e6009, 0x640e6407, - 0x59340802, 0x4806600b, 0x800000c2, 0x800008c4, - 0x80040400, 0x48026006, 0x1c01f000, 0x493bc857, - 0x4d300000, 0x0005f8ca, 0x0500000a, 0x05fdffef, - 0x4d400000, 0x60168000, 0x0501f80a, 0x5c028000, - 0x8d3c053e, 0x05020005, 0x0005f905, 0x90000541, - 0x5c026000, 0x1c01f000, 0x0005f8e7, 0x05fdf7fc, - 0x4803c856, 0x05edfff6, 0x4df00000, 0x4d3c0000, - 0x4d440000, 0x59368c03, 0x60067840, 0x0201f800, - 0x0010bbe5, 0x0201f800, 0x0010bc2f, 0x0201f800, - 0x0010bd03, 0x0201f800, 0x0010c0f3, 0x5c028800, - 0x5c027800, 0x5c03e000, 0x05ec07d1, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x05f5fcb5, 0x0500000b, - 0x481a601e, 0x48ee6023, 0x4936600a, 0x64066407, - 0x492e6009, 0x4d380000, 0x607e7000, 0x0005f905, - 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x05f5fca5, 0x0500000a, - 0x48ee6023, 0x4936600a, 0x64066407, 0x492e6009, - 0x4d380000, 0x61567000, 0x0005f905, 0x5c027000, - 0x90000541, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x05f5fc96, 0x0500000b, 0x481a601e, - 0x48ee6023, 0x4936600a, 0x64066407, 0x492e6009, - 0x4d380000, 0x60f67000, 0x0005f905, 0x5c027000, - 0x90000541, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x05f5fc86, 0x05000010, 0x4936600a, - 0x492fc857, 0x4933c857, 0x592c0405, 0x8c00051e, - 0x05000003, 0x48efc857, 0x48ee6023, 0x64066407, - 0x492e6009, 0x4d380000, 0x60027000, 0x0005f905, - 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x05f5fc71, 0x0500000b, - 0x48ee6023, 0x481a601e, 0x4936600a, 0x64066407, - 0x492e6009, 0x4d380000, 0x61127000, 0x0005f905, - 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x05f5fc61, 0x0500000b, - 0x481a601e, 0x48ee6023, 0x4936600a, 0x64066407, - 0x492e6009, 0x4d380000, 0x61267000, 0x0005f905, - 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, - 0x5930000a, 0x80001540, 0x05c80830, 0x8d0c0512, - 0x05020007, 0x5808040b, 0x4803c856, 0x80000040, - 0x05001003, 0x4800140b, 0x05020008, 0x58080010, - 0x80000540, 0x05000005, 0x58080203, 0x80000540, - 0x05020002, 0x64041203, 0x1c01f000, 0x4803c856, - 0x59300403, 0x90000d82, 0x0500000b, 0x90000d83, - 0x05000009, 0x90000d84, 0x05000007, 0x599c0819, - 0x8c04050e, 0x05000003, 0x90000d80, 0x05000002, - 0x90000541, 0x1c01f000, 0x0501f805, 0x60058800, - 0x05000002, 0x60018800, 0x1c01f000, 0x4803c856, - 0x4c000000, 0x4d2c0000, 0x59300407, 0x90000584, - 0x05000017, 0x59300009, 0x80025d40, 0x800001c0, - 0x05000013, 0x0501fbb1, 0x0500000f, 0x59300407, - 0x90004590, 0x0500000c, 0x90004591, 0x0500000a, - 0x90004583, 0x0500000a, 0x90004582, 0x05000008, - 0x9000458a, 0x05000006, 0x592c0405, 0x8c00051e, - 0x05000003, 0x80000580, 0x0501f002, 0x90000541, - 0x5c025800, 0x5c000000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x05f5fc0a, 0x0500000f, 0x4936600a, - 0x48ee6023, 0x64066407, 0x492e6009, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010b652, 0x5c027800, - 0x4d380000, 0x60a27000, 0x0005f905, 0x5c027000, - 0x90000541, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x91380595, 0x05020008, 0x59a80073, 0xb00005b4, - 0x05020005, 0x05e1ffb0, 0x64066203, 0x64a66403, - 0x05edf620, 0x05f9f9d4, 0x0005f0e7, 0x4803c856, - 0x91380596, 0x05020004, 0x60100800, 0x05e1feeb, - 0x05f5f599, 0x91380595, 0x0502000d, 0x59a80073, - 0x90000594, 0x0502000a, 0x05e1fff6, 0x05f9fd6d, - 0x05020007, 0x59340404, 0x80000540, 0x05000004, - 0x60180800, 0x05e1fedd, 0x05f5f58b, 0x05f9f9be, - 0x0005f0e7, 0x4803c856, 0x592c0207, 0x90000585, - 0x05000002, 0x1c01f000, 0x4803c856, 0x592c0209, - 0x8400054a, 0x48025a09, 0x1c01f000, 0x59300809, - 0x800409c0, 0x05000008, 0x58040205, 0x82000580, - 0x00000152, 0x05020004, 0x59a8082a, 0x48066006, - 0x1c01f000, 0x599c0416, 0x800001c0, 0x05000007, - 0x90000c84, 0x05001005, 0x800000c2, 0x800008c4, - 0x80040c00, 0x05fdf7f6, 0x59300403, 0x90000582, - 0x05fe07f2, 0x5930080a, 0x58040403, 0x82000580, - 0x000007fe, 0x05fe07ed, 0x60a00800, 0x05fdf7ec, - 0x497a6205, 0x497a6009, 0x64066203, 0x65426403, - 0x42000800, 0x80000043, 0x0005f07c, 0x4933c857, - 0x4d340000, 0x5932680a, 0x59340200, 0x8c00050e, - 0x05000005, 0x59300407, 0x90000c92, 0x05021004, - 0x0c01f805, 0x5c026800, 0x1c01f000, 0x05fdfcc9, - 0x05fdf7fd, 0x00106f34, 0x0010727f, 0x00107283, - 0x00107286, 0x001083c0, 0x001083d8, 0x001083dc, - 0x00106f34, 0x00106f34, 0x00106f34, 0x00106f34, - 0x00106f34, 0x00106f34, 0x00106f34, 0x00106f34, - 0x00106f34, 0x00106f34, 0x00106f34, 0x4803c856, - 0x40000000, 0x40000000, 0x1c01f000, 0x40000000, - 0x40000000, 0x1c01f000, 0x5930001e, 0x4803c857, - 0x59300416, 0x4933c857, 0x4803c857, 0x8c000502, - 0x05000005, 0x4803c857, 0x84000540, 0x48026416, - 0x1c01f000, 0x42000000, 0xd0000000, 0x41300800, - 0x05c9fddc, 0x0501f80e, 0x0502000c, 0x59300c16, - 0x59300403, 0xb0000580, 0x05000003, 0x84040d40, - 0x0501f004, 0x59a8002a, 0x9000040a, 0x48026205, - 0x84040d42, 0x48066416, 0x1c01f000, 0x4933c857, - 0x4d340000, 0x5932680a, 0x59340a00, 0x8c04050e, - 0x05c40f3e, 0x5930001e, 0x80000540, 0x0502002c, - 0x59300403, 0x4803c857, 0xb0000580, 0x05000003, - 0x8d0c050e, 0x05020024, 0x4d1c0000, 0x41323800, - 0x05f5fb53, 0x0500001e, 0x4932381e, 0x591c0416, - 0x84000542, 0x48023c16, 0x4936600a, 0x591c0407, - 0x90000583, 0x05000006, 0x591c0202, 0x4802641b, - 0x591c0402, 0x4802621b, 0x0501f005, 0x591c0202, - 0x4802621b, 0x591c0402, 0x4802641b, 0x491e6020, - 0x64066407, 0x64d66403, 0x64066203, 0x42000800, - 0x80000040, 0x0005f87c, 0x411e6000, 0x5c023800, - 0x80000580, 0x5c026800, 0x1c01f000, 0x411e6000, - 0x5c023800, 0x59a8002c, 0x48026205, 0x90000541, - 0x05fdf7f9, 0x4933c857, 0x4d2c0000, 0x4932381e, - 0x4a026202, 0x0000ffff, 0x591e5809, 0x591c0008, - 0x8c00051e, 0x05000005, 0x8400051e, 0x48023808, - 0x497a580a, 0x0501f016, 0x592c0409, 0x8c000518, - 0x05000013, 0x84000518, 0x48025c09, 0x4d400000, - 0x592e8207, 0x64065a07, 0x0501faad, 0x49425a07, - 0x5c028000, 0x497a580a, 0x592c0409, 0x8c000512, - 0x05000007, 0x4d2c0000, 0x84000512, 0x48025c09, - 0x592e580a, 0x05c9fa88, 0x5c025800, 0x59a8002c, - 0x48026205, 0x591c0216, 0x48026218, 0x90000d81, - 0x05000006, 0x640a3a03, 0x90000585, 0x05000007, - 0x497a6017, 0x0501f01c, 0x591c0008, 0x84000540, - 0x48023808, 0x64123a03, 0x591c0416, 0x4803c857, - 0x8400051c, 0x84000554, 0x48023c16, 0x592c0010, - 0x40001000, 0x591c0818, 0x80040480, 0x05fe17f1, - 0x591c0018, 0x82000500, 0xfffffffc, 0x48026017, - 0x48023818, 0x591c0a16, 0x4807c857, 0x90040d85, - 0x05020005, 0x480bc857, 0x4803c857, 0x4a023814, - 0xffffffff, 0x591c0402, 0x4802641b, 0x591c0202, - 0x4802621b, 0x591e680a, 0x4936600a, 0x64066407, - 0x64e66403, 0x64066203, 0x42000800, 0x80000040, - 0x0005f87c, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x59300416, 0x8c000514, 0x05000015, 0x8c00051c, - 0x05020012, 0x59300018, 0x80100480, 0x05001006, - 0x05000005, 0x59300416, 0x84000514, 0x8400055c, - 0x0501f009, 0x48126018, 0x48126014, 0x40100000, - 0x592c1810, 0x800c0480, 0x48026013, 0x59300416, - 0x84000514, 0x48026416, 0x1c01f000, 0x4933c857, - 0x8c00051c, 0x05020008, 0x59300014, 0x4803c857, - 0x48026018, 0x59300416, 0x8400055c, 0x4803c857, - 0x48026416, 0x1c01f000, 0x0501f805, 0x60058800, - 0x05000002, 0x60018800, 0x1c01f000, 0x59300c03, - 0x4933c857, 0x4807c857, 0x900404b4, 0x05001005, - 0x900404bc, 0x05021003, 0x80000580, 0x1c01f000, - 0x90000541, 0x05fdf7fe, 0x41780800, 0x59a81028, - 0x60c80000, 0x05edfc1b, 0x800811c0, 0x05020002, - 0x60501000, 0x480b502a, 0x59a81029, 0x480b5022, - 0x41780800, 0x61900000, 0x05edfc12, 0x800811c0, - 0x05020002, 0x60501000, 0x480b502b, 0x9008140a, - 0x480b502c, 0x60040800, 0x05edfdfa, 0x42000000, - 0x30000000, 0x40080800, 0x0001f91e, 0x600c0800, - 0x59a8100f, 0x05edfde5, 0x05e5f04a, 0x64a3502a, - 0x6453502b, 0x4a035022, 0x000007d0, 0x60781000, - 0x480b502c, 0x60040800, 0x05edfdea, 0x42000000, - 0x30000000, 0x40080800, 0x0001f91e, 0x600c0800, - 0x59a8100f, 0x05edf5d5, 0x4933c857, 0x4d2c0000, - 0x59300403, 0x900005be, 0x05020004, 0x59325819, - 0x812e59c0, 0x05ca09e3, 0x5c025800, 0x1c01f000, - 0x4937c857, 0x4d300000, 0x05f5fa6d, 0x0500000b, - 0x4936600a, 0x64066407, 0x492e6009, 0x60240800, - 0x05e1fd6a, 0x4d380000, 0x60ce7000, 0x0005f905, - 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, - 0x4933c857, 0x4d2c0000, 0x4c580000, 0x4d3c0000, - 0x59325809, 0x91380595, 0x0502001d, 0x59a8b073, - 0x90580c99, 0x05001002, 0x6060b000, 0x8058b104, - 0x0501f9aa, 0x80000580, 0x0501f9b9, 0x912cac0a, - 0x91cca406, 0x0509fda6, 0x4c600000, 0x6004c000, - 0x592c100b, 0x8c080518, 0x05020006, 0x59a8000f, - 0x592c100e, 0x80080580, 0x05020006, 0x4178c000, - 0x5930100a, 0x58081403, 0x417a7800, 0x05d1fdf0, - 0x5c00c000, 0x05f5fbf0, 0x0501f005, 0x6008b000, - 0x0501f9af, 0x05f9f820, 0x0005f8e7, 0x5c027800, - 0x5c00b000, 0x5c025800, 0x1c01f000, 0x4933c856, - 0x60018800, 0x4936600a, 0x64066407, 0x492e6009, - 0x4d380000, 0x61367000, 0x0005f905, 0x5c027000, - 0x90000541, 0x60058800, 0x1c01f000, 0x4803c856, - 0x4d2c0000, 0x91380595, 0x05020025, 0x59a80873, - 0x59325809, 0x5930040c, 0x80040580, 0x05020020, - 0x4c500000, 0x4c540000, 0x4c580000, 0x91cca406, - 0x4050a800, 0x5930b40c, 0x9058b403, 0x8058b104, - 0x0509fdaa, 0x91cca406, 0x592cb206, 0x9058b403, - 0x8058b104, 0x912cac07, 0x0509fd69, 0x592e5801, - 0x812e59c0, 0x05fe07f9, 0x5931d823, 0x58ef400a, - 0x58ee580c, 0x4a025a05, 0x00000103, 0x58ec0008, - 0x0801f800, 0x59300402, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x5c025800, 0x1c01f000, 0x05f5ffe6, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x90040db5, - 0x05000005, 0x5930141b, 0x0501f844, 0x05000025, - 0x0501f006, 0x4d300000, 0x59326020, 0x0501f848, - 0x5c026000, 0x0500001e, 0x591c0c07, 0x90040583, - 0x05000003, 0x90040586, 0x0502001b, 0x591c0c02, - 0x5930041b, 0x80040580, 0x05000009, 0x5930021b, - 0x80040580, 0x05020014, 0x591c0a02, 0x5930041b, - 0x80040580, 0x05020010, 0x0501f009, 0x59300a1b, - 0x82040580, 0x0000ffff, 0x05000005, 0x591c0202, - 0x59300a1b, 0x80040580, 0x05020007, 0x591c000a, - 0x5930080a, 0x80040580, 0x1c01f000, 0x417a3800, - 0x90000541, 0x1c01f000, 0x4803c856, 0x4203e000, - 0xb0800000, 0x600009fe, 0x4203f800, 0x30000000, - 0x40000000, 0x80040840, 0x05c40da8, 0x05ffb7fb, - 0x1c01f000, 0x4803c856, 0x4203e000, 0xb0800000, - 0x4203f800, 0x20000000, 0x1c01f000, 0x0501f805, - 0x60058800, 0x05020002, 0x60018800, 0x1c01f000, - 0x59300808, 0x8c04051e, 0x592c0c09, 0x05020002, - 0x8c040518, 0x1c01f000, 0x05fdfc83, 0x05000007, - 0x800800c4, 0x800808ca, 0x80040c00, 0x82063c00, - 0x0010cca4, 0x491fc857, 0x1c01f000, 0x0501fbff, - 0x05020007, 0x59301402, 0x05fdfff4, 0x05000007, - 0x411c0000, 0x81300580, 0x05000003, 0x81780500, - 0x0501f002, 0x81300540, 0x1c01f000, 0x4d300000, - 0x0001fac4, 0x0502000a, 0x42026000, 0x0010cc5c, - 0x4936600a, 0x492e6009, 0x0201f800, 0x0010b652, - 0x80000580, 0x5c026000, 0x1c01f000, 0x90000541, - 0x05fdf7fd, 0x4933c857, 0x05fdfc6e, 0x05c40d6f, - 0x4d2c0000, 0x4d340000, 0x4d440000, 0x4c580000, - 0x59325809, 0x5932680a, 0x49425a07, 0x05e9faca, - 0x592e8c07, 0x592c4208, 0x9020050f, 0x0c01f806, - 0x5c00b000, 0x5c028800, 0x5c026800, 0x5c025800, - 0x1c01f000, 0x0010749b, 0x001074b9, 0x001074bf, - 0x001074c2, 0x001074ca, 0x00107499, 0x00107499, - 0x00107499, 0x001074cd, 0x001074d7, 0x001074d7, - 0x00107499, 0x00107499, 0x00107499, 0x00107499, - 0x00107499, 0x4803c857, 0x05c5fd4c, 0x814281c0, - 0x05020011, 0x41785800, 0x592c0405, 0x8c00051c, - 0x05020002, 0x59345c05, 0x442c2800, 0x59340008, - 0x48002802, 0x59340009, 0x48002801, 0x59340006, - 0x48002804, 0x59340007, 0x48002803, 0x602cb000, - 0x0501f02d, 0x592c0208, 0x8c00051e, 0x6008b000, - 0x05020029, 0x9004b540, 0x05000027, 0x44042800, - 0x5932680a, 0x59340400, 0x48002801, 0x6008b000, - 0x0501f021, 0x814281c0, 0x05fe07f3, 0x59345c05, - 0x442c2800, 0x6004b000, 0x0501f01b, 0x9140b540, - 0x05000019, 0x0501f021, 0x814281c0, 0x0502001f, - 0x59340200, 0x44002800, 0x59340001, 0x48002801, - 0x6008b000, 0x0501f010, 0x9140b540, 0x05020017, - 0x0501f00d, 0x9140b540, 0x0500000b, 0x05e1ffab, - 0x05000012, 0x8c20050e, 0x05000002, 0x497a600a, - 0x4178b000, 0x497a5a07, 0x0501f003, 0x9140b540, - 0x0502000a, 0x592c0405, 0x8400051c, 0x48025c05, - 0x592c0208, 0x8400051e, 0x48025a08, 0x0501f87f, - 0x497a6009, 0x0001f32c, 0x592c0208, 0x8c00051e, - 0x6008b000, 0x05fe07f4, 0x9004b540, 0x05fc07f2, - 0x44042800, 0x6004b000, 0x05fdf7ef, 0x4937c857, - 0x4d300000, 0x05f5f91a, 0x0500000b, 0x4936600a, - 0x64066407, 0x492e6009, 0x602c0800, 0x05e1fc17, - 0x4d380000, 0x610e7000, 0x0005f905, 0x5c027000, - 0x90000541, 0x5c026000, 0x1c01f000, 0x4937c857, - 0x4d2c0000, 0x59325809, 0x91380595, 0x05020022, - 0x59a80073, 0x90000584, 0x0502001f, 0x59a8000f, - 0x592c100a, 0x80080580, 0x05020011, 0x4d440000, - 0x592e8c07, 0x592c0208, 0x4803c856, 0x82000500, - 0x00000080, 0x84000548, 0x4d3c0000, 0x60027820, - 0x8c00050e, 0x05000002, 0x853e7d5c, 0x05e1fee1, - 0x5c027800, 0x5c028800, 0x0501f003, 0x4803c856, - 0x05e1ff62, 0x05fdfbcb, 0x05000011, 0x4d400000, - 0x60028000, 0x41780800, 0x05fdff57, 0x5c028000, - 0x0501f00a, 0x05e1ff59, 0x05fe07f7, 0x05fdfbc1, - 0x05000007, 0x4c580000, 0x6008b000, 0x0501f854, - 0x5c00b000, 0x05f5fec4, 0x0005f8e7, 0x5c025800, - 0x1c01f000, 0x4937c857, 0x4d300000, 0x05f5f8d8, - 0x0500000d, 0x4936600a, 0x64066407, 0x4d3c0000, - 0x4d380000, 0x417a7800, 0x05e1fbc9, 0x492e6009, - 0x60127000, 0x0005f905, 0x5c027000, 0x5c027800, - 0x90000541, 0x5c026000, 0x1c01f000, 0x4937c857, - 0x4d300000, 0x05f5f8c6, 0x0500000b, 0x4936600a, - 0x600c0800, 0x05e1fbc5, 0x64066407, 0x492e6009, - 0x4d380000, 0x61467000, 0x0005f905, 0x5c027000, - 0x90000541, 0x5c026000, 0x1c01f000, 0x4933c857, - 0x61f2880f, 0x42003000, 0x00fffffc, 0x05e1fbe7, - 0x05c60c92, 0x4936600a, 0x417a7800, 0x05e1fba8, - 0x600c0800, 0x05e1fbb1, 0x497a6c12, 0x64066203, - 0x640a6403, 0x05edf2db, 0x492fc857, 0x4c580000, - 0x4c000000, 0x8058b1c0, 0x0500000a, 0x82580500, - 0xfffffff0, 0x05c60c81, 0x8058b0d0, 0x592c0409, - 0x82000500, 0xfffff0ff, 0x80580540, 0x48025c09, - 0x5c000000, 0x5c00b000, 0x1c01f000, 0x492fc857, - 0x4c000000, 0x4c040000, 0x800000d8, 0x592c0c09, - 0x82040d00, 0xffff0fff, 0x80040540, 0x48025c09, - 0x5c000800, 0x5c000000, 0x1c01f000, 0x4933c857, - 0x4d2c0000, 0x59325809, 0x592c0208, 0x8400055e, - 0x48025a08, 0x4c500000, 0x4c540000, 0x4c580000, - 0x05fdffda, 0x05e9f9c4, 0x64602800, 0x80142800, - 0x8058b040, 0x91cca407, 0x4014a800, 0x0509fbd4, + 0x60007040, 0x4203e000, 0xb0800000, 0x6033f800, + 0x40000000, 0x40000000, 0x40000000, 0x0501b004, + 0x80387040, 0x05c408fd, 0x05fdf7f9, 0x1c01f000, + 0x4203e000, 0xb0800000, 0x6023f800, 0x1c01f000, + 0x83300480, 0x0010cc48, 0x05001006, 0x41540000, + 0x81300480, 0x05021003, 0x80000580, 0x1c01f000, + 0x81780080, 0x1c01f000, 0x59a80873, 0x59cc2808, + 0x82140500, 0x00000c00, 0x05000003, 0x90040490, + 0x05001015, 0x80001580, 0x8c140512, 0x05000004, + 0x90040494, 0x05001010, 0x59cc100a, 0x80000580, + 0x8c140510, 0x05000004, 0x90040498, 0x0500100a, + 0x59cc000b, 0x80080400, 0x05001007, 0x05000005, + 0x90000418, 0x80040480, 0x05001003, 0x80000580, + 0x1c01f000, 0x42000000, 0x0010986d, 0x0509f848, + 0x90000541, 0x05fdf7fb, 0x4933c857, 0x4937c857, + 0x492fc857, 0x48efc857, 0x4d1c0000, 0x4d300000, + 0x41323800, 0x05f1fd62, 0x0500001b, 0x48ee6023, + 0x4936600a, 0x591c0407, 0x90000583, 0x05000008, + 0x591c0202, 0x4803c857, 0x4802641b, 0x591c0402, + 0x4802621b, 0x4803c857, 0x0501f007, 0x591c0202, + 0x4803c857, 0x4802621b, 0x591c0402, 0x4802641b, + 0x4803c857, 0x491e6020, 0x64066407, 0x492e6009, + 0x4d380000, 0x615e7000, 0x0005f905, 0x5c027000, + 0x90000541, 0x5c026000, 0x5c023800, 0x1c01f000, + 0x4933c857, 0x493bc857, 0x4937c857, 0x4d2c0000, + 0x4c500000, 0x4c540000, 0x4c580000, 0x59325809, + 0x05fdf832, 0x05000017, 0x91cca406, 0x912cac07, + 0x91380596, 0x05020007, 0x59a80073, 0x90000588, + 0x0502000e, 0x492fc857, 0x6008b000, 0x0501f008, + 0x91380595, 0x05020009, 0x492fc857, 0x59a80073, + 0x90000598, 0x05020005, 0x6018b000, 0x0509f8ce, + 0x05f1fedb, 0x0501f003, 0x05f5fb0d, 0x0005f8e7, 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x59325809, 0x592c0205, - 0x82000580, 0x00000152, 0x1c01f000, 0x59300021, - 0x80000540, 0x05ca0c63, 0x1c01f000, 0x4d2c0000, - 0x59325809, 0x59300203, 0x4933c857, 0x492fc857, - 0x493bc857, 0x4803c857, 0x9000348e, 0x05c61c3f, - 0x0c01f803, 0x5c025800, 0x1c01f000, 0x001075b9, - 0x001075bf, 0x001075e6, 0x001075b9, 0x001075b9, - 0x001075b9, 0x001075b9, 0x001075b9, 0x001075ba, - 0x001075b9, 0x001075b9, 0x001075b9, 0x001075b9, - 0x001075b9, 0x05c5fc2d, 0xb1383498, 0x05c61c2b, - 0x493a6403, 0x64066203, 0x05edf27a, 0x91380593, - 0x0502000c, 0x492fc857, 0x592c000d, 0x800001c0, - 0x05000005, 0x640a6203, 0x59a8002a, 0x48026006, - 0x1c01f000, 0x64025a07, 0x0001fb2c, 0x0005f0e7, - 0x913805a7, 0x05000011, 0x91380594, 0x0500000b, - 0x91380595, 0x05000003, 0x91380596, 0x05c60c13, - 0x05edfea5, 0x05f60065, 0x59300203, 0x90000582, - 0x05c60c0e, 0x0501f00d, 0x4937c857, 0x05edfac2, - 0x6446580f, 0x0501f004, 0x4937c857, 0x05edfabe, - 0x6442580f, 0x64c65a07, 0x6412580e, 0x0001fb2c, - 0x05e5f847, 0x05f1f7f0, 0x59341400, 0x82081d00, - 0x000000ff, 0x59300c03, 0x480bc857, 0x4807c857, - 0xb0040593, 0x05000020, 0x90040582, 0x0500000f, - 0x90040581, 0x05000010, 0x90040583, 0x05000013, - 0x90040585, 0x05000014, 0x900405b3, 0x05000012, - 0x90040580, 0x05000013, 0x90040584, 0x05c60beb, - 0x0501f874, 0x0501f010, 0x900c0583, 0x05000837, - 0x0501f00d, 0x900c058b, 0x0502000b, 0x601c0800, - 0x05e1fb06, 0x0501f008, 0x900c0585, 0x05000849, - 0x0501f005, 0x900c0589, 0x05000864, 0x0501f002, - 0x0501f869, 0x654a6403, 0x59a81073, 0x592c040c, - 0x8c000500, 0x05000002, 0x60201000, 0x592c040c, - 0x8c000516, 0x05000002, 0x90081418, 0x592c000d, - 0x497a580e, 0x497a580f, 0x80080c80, 0x05000007, - 0x05001004, 0x641e5a07, 0x40001000, 0x0501f004, - 0x64565a07, 0x0501f002, 0x64025a07, 0x480a580d, - 0x05f5f92c, 0x0500000d, 0x592c1001, 0x480a600d, - 0x58080800, 0x90080402, 0x592c1012, 0x592c1813, - 0x60003000, 0x42002000, 0x00100efe, 0x05f5fa4d, - 0x05000002, 0x1c01f000, 0x64b25a07, 0x497a580d, - 0x0001fb2c, 0x0005f0e7, 0x91380595, 0x05020007, - 0x59a80086, 0x8c000502, 0x05020006, 0x05e1fb8a, - 0x60100800, 0x05e1f2cd, 0x601c0800, 0x05e1f2cb, - 0x05e5fa9e, 0x60401000, 0x05020008, 0x59340002, - 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, - 0x05fc07f3, 0x60201000, 0x05e5f82a, 0x05fc07f0, - 0x592c040c, 0x84000540, 0x48025c0c, 0x05fdf7ef, - 0x91380595, 0x0502000b, 0x59a80086, 0x8c000502, - 0x0502000a, 0x05e1fbc7, 0x4d3c0000, 0x417a7800, - 0x05e1faa7, 0x5c027800, 0x60180800, 0x05e1f2af, - 0x60100800, 0x05e1f2ad, 0x05e5fa80, 0x60401000, - 0x05020008, 0x59340002, 0x82000500, 0x00ff0000, - 0x82000580, 0x00ff0000, 0x05fc07ef, 0x60201000, - 0x05e5f80c, 0x05fc07ec, 0x592c040c, 0x84000540, - 0x48025c0c, 0x05fdf7ef, 0x60100800, 0x05e1f29b, - 0x91380595, 0x05020003, 0x0505fc02, 0x05e00d15, - 0x1c01f000, 0x91380595, 0x05020015, 0x4c580000, - 0x91cc1408, 0x6008b000, 0x91341c06, 0x05f9f932, - 0x0502000e, 0x91cc140a, 0x6008b000, 0x91341c08, - 0x05f9f92d, 0x05020009, 0x59342200, 0x59cc1007, - 0x800811c0, 0x05000003, 0x480a6801, 0x84102542, - 0x8410251a, 0x48126a00, 0x5c00b000, 0x1c01f000, - 0x42000000, 0x00109810, 0x0509fa07, 0x05edfaa4, - 0x59300203, 0x4933c857, 0x4803c857, 0x90000c8e, - 0x05c61b52, 0x0c01f802, 0x05edf289, 0x001076a6, - 0x001076af, 0x001076a7, 0x001076a5, 0x001076a5, - 0x001076a5, 0x001076a5, 0x001076a5, 0x001076a5, - 0x001076a5, 0x001076a5, 0x001076a5, 0x001076a5, - 0x001076a5, 0x05c5fb41, 0x1c01f000, 0x59300403, - 0xb0000592, 0x05fc0090, 0x05e1ff81, 0x59325809, - 0x641a5a07, 0x0001fb2c, 0x05f1f727, 0x59301804, - 0x840c0520, 0x48026004, 0x598c000b, 0x81300580, - 0x0502000f, 0x8c0c0520, 0x0502000f, 0x42001000, - 0x00109730, 0x50081000, 0x58080002, 0x82000580, - 0x00000100, 0x0500000d, 0x5808000b, 0x81300580, - 0x05c60b26, 0x4978100b, 0x0501f003, 0x8c0c0520, - 0x05fe07e3, 0x0201f800, 0x0010ba2e, 0x80c40040, - 0x05fc07df, 0x05c5fb1d, 0x05edfd06, 0x05fc07fa, - 0x59300203, 0x90000c8e, 0x05c61b18, 0x0c01f7c8, - 0x4933c857, 0x4c500000, 0x4c540000, 0x4c580000, - 0x592c0c08, 0x48065814, 0x59cc0809, 0x48065808, - 0x59cc0808, 0x4806580c, 0x59a80885, 0x82040500, - 0x000003ff, 0x800010c4, 0x8c040514, 0x05000004, - 0x59cc0002, 0x90000503, 0x80081480, 0x480a621c, - 0x412c0800, 0x05c5fe70, 0x05c40b00, 0x492c080a, - 0x58040409, 0x84000552, 0x84000540, 0x48000c09, - 0x90081403, 0x80081104, 0x91cca406, 0x912cac05, - 0x60400800, 0x90080490, 0x05021003, 0x40080800, - 0x80000580, 0x4004b000, 0x4c000000, 0x0509faa3, - 0x5c000000, 0x800001c0, 0x0500000a, 0x412c1000, - 0x4c000000, 0x05c5fe58, 0x05c40ae8, 0x492c1001, - 0x912cac05, 0x5c000000, 0x40001000, 0x05fdf7ee, - 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x1c01f000, - 0x4933c857, 0x4d2c0000, 0x4c380000, 0x59325809, - 0x5930021c, 0x48025a09, 0x59301013, 0x640a6203, - 0x592c020b, 0x8c000500, 0x05000004, 0x59300017, - 0x592c1010, 0x80081480, 0x800811c0, 0x05020007, - 0x64025a07, 0x592c000c, 0x82000500, 0x00000c00, - 0x05000009, 0x0501f009, 0x8c08053e, 0x05000005, - 0x641e5a07, 0x80081080, 0x80081000, 0x0501f002, - 0x64565a07, 0x480a5808, 0x42000000, 0x00109968, - 0x50007000, 0x5838000a, 0x80000540, 0x05020007, - 0x4930700b, 0x4930700a, 0x58380002, 0x90000580, - 0x05020808, 0x0501f004, 0x90001400, 0x45301000, - 0x4930700a, 0x5c007000, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x592c000a, 0x40001000, 0x48007009, - 0x90080405, 0x48007003, 0x592c000e, 0x592c100f, - 0x48007006, 0x48087007, 0x592c0014, 0x592c1209, - 0x80080c80, 0x05001002, 0x40001000, 0x90081403, - 0x80081104, 0x90080490, 0x05021003, 0x80000580, - 0x0501f002, 0x60401000, 0x4800700c, 0x48087004, - 0x800810c4, 0x48087005, 0x40381000, 0x0001f01c, - 0x4d2c0000, 0x05c5fe00, 0x05c40a90, 0x42000800, - 0x00109968, 0x452c0800, 0x497a580a, 0x497a580b, - 0x497a580c, 0x4a025808, 0x00107764, 0x4a025802, - 0x00000100, 0x64025801, 0x5c025800, 0x1c01f000, - 0x4833c857, 0x4d300000, 0x4d2c0000, 0x4c5c0000, - 0x4030b800, 0x585c0009, 0x80025d40, 0x05020004, - 0x585c000b, 0x4c000000, 0x0501f03a, 0x585c0002, - 0x82000580, 0x00000100, 0x0502001c, 0x592c0801, - 0x4c040000, 0x05c5fe03, 0x5c000800, 0x800409c0, - 0x05000017, 0x4804b809, 0x585c100c, 0x800811c0, - 0x05020004, 0x40065800, 0x05c5fe03, 0x0501f010, - 0x90080490, 0x05021003, 0x80000580, 0x0501f002, - 0x60401000, 0x4800b80c, 0x4808b804, 0x800810c4, - 0x4808b805, 0x90040405, 0x4800b803, 0x405c1000, - 0x0001f81c, 0x0501f021, 0x0501f824, 0x585c000b, - 0x80026540, 0x59300000, 0x80000d40, 0x05020002, - 0x4800b80a, 0x4800b80b, 0x497a6000, 0x4c000000, - 0x4978b809, 0x59325809, 0x4a025a05, 0x00000103, - 0x59300402, 0x48025c07, 0x592c100c, 0x4c080000, - 0x0001fb2c, 0x05fdfa13, 0x5c001000, 0x8c080518, - 0x05000003, 0x05fdfab3, 0x0501f002, 0x0005f8e7, - 0x405c7000, 0x5c000000, 0x80026540, 0x05000003, - 0x59325809, 0x05fdff8b, 0x5c00b800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x483bc857, 0x58380009, - 0x40025800, 0x05c5fdcc, 0x5838000b, 0x80026540, - 0x59300009, 0x80025d40, 0x640a5a07, 0x1c01f000, - 0x4803c857, 0x4933c857, 0x4d1c0000, 0x497a601e, - 0x41323800, 0x40026000, 0x4d3c0000, 0x60167800, - 0x0501f836, 0x5c027800, 0x411e6000, 0x4933c857, - 0x59300416, 0x84000502, 0x48026416, 0x5c023800, - 0x1c01f000, 0x481bc857, 0x4933c857, 0x4c5c0000, - 0x4c600000, 0x4010b800, 0x4014c000, 0x0505ff28, - 0x8d0c0520, 0x05000006, 0x40602800, 0x405c3000, - 0x0505fb11, 0x90000541, 0x0501f002, 0x80000580, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x42026000, 0x0010cca4, 0x59a8000d, - 0x81640580, 0x05000013, 0x59300c07, 0x90040581, - 0x05000009, 0x90040584, 0x05000004, 0x90040590, - 0x05f80ed7, 0x0501f007, 0x59300203, 0x90000d87, - 0x05000004, 0x4807c857, 0x05fdfb65, 0x05020807, - 0x91326424, 0x41580000, 0x81300480, 0x05fc17ec, - 0x5c026000, 0x1c01f000, 0x4933c857, 0x59300403, - 0x4803c857, 0x05edf936, 0x4df00000, 0x59300407, - 0x4803c857, 0x90000d82, 0x05000011, 0x90000d81, - 0x05000007, 0x90000d84, 0x05000005, 0x4933c856, - 0x5c03e000, 0x05ec0916, 0x0501f036, 0x59300203, - 0x90000d81, 0x05000010, 0x90000d82, 0x05000027, - 0x90000d85, 0x05000025, 0x05c5f9d4, 0x59300203, - 0x90000d89, 0x05000008, 0x90000d8b, 0x05000006, - 0x90000d8a, 0x0500001d, 0x90000d8c, 0x0500001b, - 0x05c5f9ca, 0x598c000b, 0x81300580, 0x05020003, - 0x05edfbb0, 0x05020015, 0x59300004, 0x4803c857, - 0x8c000520, 0x05000004, 0x84000520, 0x48026004, - 0x0501f00e, 0x0201f800, 0x0010ba2e, 0x80c40040, - 0x05c609ba, 0x5c03e000, 0x05ec08f1, 0x59300407, - 0x90000d82, 0x05000004, 0x05e1fdf9, 0x05fdf9a8, - 0x05f40bb9, 0x05f1f5a0, 0x5c03e000, 0x05ec08e8, - 0x59300407, 0x90000d82, 0x05000006, 0x05e1fdf0, - 0x05fdf99f, 0x05f40bb0, 0x8d3c0500, 0x05000003, - 0x0505ff83, 0x05f1f594, 0x6406621f, 0x4a026403, - 0x00000085, 0x64266203, 0x640a6407, 0x42000800, - 0x80000040, 0x0005f07c, 0x60007040, 0x4203e000, - 0xb0800000, 0x6033f800, 0x40000000, 0x40000000, - 0x40000000, 0x0501b004, 0x80387040, 0x05c40993, - 0x05fdf7f9, 0x1c01f000, 0x4203e000, 0xb0800000, - 0x6023f800, 0x1c01f000, 0x83300480, 0x0010cc38, - 0x05001006, 0x41540000, 0x81300480, 0x05021003, - 0x80000580, 0x1c01f000, 0x81780080, 0x1c01f000, - 0x59a80873, 0x59cc2808, 0x82140500, 0x00000c00, - 0x05000003, 0x90040490, 0x05001015, 0x80001580, - 0x8c140512, 0x05000004, 0x90040494, 0x05001010, - 0x59cc100a, 0x80000580, 0x8c140510, 0x05000004, - 0x90040498, 0x0500100a, 0x59cc000b, 0x80080400, - 0x05001007, 0x05000005, 0x90000418, 0x80040480, - 0x05001003, 0x80000580, 0x1c01f000, 0x42000000, - 0x001097ed, 0x0509f814, 0x90000541, 0x05fdf7fb, - 0x4933c857, 0x4937c857, 0x492fc857, 0x48efc857, - 0x4d1c0000, 0x4d300000, 0x41323800, 0x05f1fd7c, - 0x0500001b, 0x48ee6023, 0x4936600a, 0x591c0407, - 0x90000583, 0x05000008, 0x591c0202, 0x4803c857, - 0x4802641b, 0x591c0402, 0x4802621b, 0x4803c857, - 0x0501f007, 0x591c0202, 0x4803c857, 0x4802621b, - 0x591c0402, 0x4802641b, 0x4803c857, 0x491e6020, - 0x64066407, 0x492e6009, 0x4d380000, 0x615e7000, - 0x0005f905, 0x5c027000, 0x90000541, 0x5c026000, - 0x5c023800, 0x1c01f000, 0x4933c857, 0x493bc857, - 0x4937c857, 0x4d2c0000, 0x4c500000, 0x4c540000, - 0x4c580000, 0x59325809, 0x05fdf832, 0x05000017, - 0x91cca406, 0x912cac07, 0x91380596, 0x05020007, - 0x59a80073, 0x90000588, 0x0502000e, 0x492fc857, - 0x6008b000, 0x0501f008, 0x91380595, 0x05020009, - 0x492fc857, 0x59a80073, 0x90000598, 0x05020005, - 0x6018b000, 0x0509f89a, 0x05f1fef3, 0x0501f003, - 0x05f5fb25, 0x0005f8e7, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x05edf863, 0x4df00000, 0x59300203, 0x90000c8e, - 0x05c61912, 0x0c01f001, 0x001078e5, 0x001078e4, - 0x001078ea, 0x00107902, 0x001078e9, 0x001078e4, - 0x001078e4, 0x001078e4, 0x001078e4, 0x001078e4, - 0x001078e4, 0x001078e4, 0x001078e4, 0x001078e4, - 0x05c5f902, 0x5c03e000, 0x05ec0839, 0x80000580, - 0x1c01f000, 0x05c9fa28, 0x5c03e000, 0x05ec0834, - 0x8d3c0502, 0x05020011, 0x4d2c0000, 0x59325809, - 0x64165a07, 0x0001fb2c, 0x5c025800, 0x497a6009, - 0x8d3c0500, 0x0502000b, 0x642a621f, 0x4a026403, - 0x00000085, 0x64266203, 0x640a6407, 0x42000800, - 0x80004040, 0x0005f87c, 0x81780080, 0x1c01f000, - 0x05f1fcd5, 0x05fdf7fd, 0x05f9fda3, 0x05020003, - 0x05edfa97, 0x05020007, 0x0201f800, 0x0010b8bb, - 0x80c40040, 0x05fc07e1, 0x05e9ff58, 0x05c608db, - 0x59300203, 0x90000d83, 0x05c408d8, 0x90000c8e, - 0x05c618d6, 0x0c01f7c5, 0x4933c857, 0x4d340000, - 0x916c0583, 0x0502000d, 0x599c0018, 0x8c000516, - 0x05000003, 0x05d9fd5a, 0x0501f008, 0x60100800, - 0x05ddffee, 0x6486641f, 0x05fdfc31, 0x90000541, - 0x5c026800, 0x1c01f000, 0x80000580, 0x05fdf7fd, - 0x59303009, 0x58181a05, 0x820c1d00, 0x000000ff, - 0xb00c0588, 0x05000003, 0xb00c05aa, 0x05020045, - 0x58180409, 0x8c000500, 0x05000042, 0x42000000, - 0x00109968, 0x50006000, 0x41781800, 0x5830200b, - 0x41300000, 0x80100580, 0x05000006, 0x40101800, - 0x580c2000, 0x801021c0, 0x05fe07fa, 0x0501f035, - 0x4933c857, 0x59302000, 0x497a6000, 0x800c19c0, - 0x0502001e, 0x4933c856, 0x42007000, 0x00020a09, - 0x58300009, 0x800001c0, 0x05000018, 0x49786009, - 0x58380001, 0x80300580, 0x05020008, 0x4933c856, - 0x49787002, 0x4810600b, 0x801021c0, 0x0502001d, - 0x4978600a, 0x0501f01b, 0x4933c856, 0x4810600b, - 0x801021c0, 0x05020002, 0x4978600a, 0x4c180000, - 0x4c300000, 0x05c5fd36, 0x5c006000, 0x05fdfe09, - 0x5c003000, 0x0501f00f, 0x4933c856, 0x800c19c0, - 0x05020008, 0x801021c0, 0x05000003, 0x4810600b, - 0x0501f008, 0x4978600b, 0x4978600a, 0x0501f005, - 0x48101800, 0x801021c0, 0x05020002, 0x480c600a, - 0x58180409, 0x84000500, 0x48003409, 0x49783209, - 0x1c01f000, 0x4933c857, 0x59368c03, 0x4c180000, - 0x59300203, 0x9000348e, 0x05c61870, 0x0c01f803, - 0x5c003000, 0x1c01f000, 0x00107988, 0x00107dbe, - 0x00107ec0, 0x00107988, 0x00107988, 0x00107988, - 0x00107988, 0x00107988, 0x001079a5, 0x00107988, - 0x00107988, 0x00107988, 0x00107988, 0x00107988, - 0x05c5f85e, 0x4933c857, 0x61fe89ff, 0x813669c0, - 0x05000002, 0x59368c03, 0x4c180000, 0x59300203, - 0x9000348e, 0x05c61855, 0x0c01f803, 0x5c003000, - 0x1c01f000, 0x001079a3, 0x001080f5, 0x001079a3, - 0x001079a3, 0x001079a3, 0x001079a3, 0x001079a3, - 0x001079a3, 0x0010805e, 0x00108445, 0x0010846e, - 0x00108445, 0x0010846e, 0x001079a3, 0x05c5f843, - 0x05c5f842, 0xb1383497, 0x05c61840, 0x41380000, - 0x493bc857, 0x4d1c0000, 0x4d400000, 0x0c01f804, - 0x5c028000, 0x5c023800, 0x1c01f000, 0x00107a0f, - 0x00107b9e, 0x00107a0f, 0x00107a0f, 0x00107a0f, - 0x00107ba4, 0x00107a0f, 0x00107a0f, 0x00107a0f, - 0x00107a0f, 0x00107a0f, 0x00107a0f, 0x00107a0f, - 0x00107a0f, 0x00107a0f, 0x00107a0f, 0x00107a0f, - 0x00107a0f, 0x00107a0f, 0x00107a0f, 0x00107a0f, - 0x00107a0f, 0x00107a0f, 0x00107a2e, 0x00107a6c, - 0x00107a7d, 0x00107adc, 0x00107b20, 0x00107b56, - 0x00107b7b, 0x00107a0f, 0x00107a0f, 0x00107ba9, - 0x00107a0f, 0x00107a0f, 0x00107bb2, 0x00107bb7, - 0x00107a0f, 0x00107a0f, 0x00107a0f, 0x00107a0f, - 0x00107a0f, 0x00107c34, 0x00107a0f, 0x00107a0f, - 0x00107b09, 0x00107a0f, 0x00107a0f, 0x00107c0a, - 0x00107a0f, 0x00107a0f, 0x00107a0f, 0x00107c3f, - 0x00107a0f, 0x00107a0f, 0x00107a0f, 0x00107c7b, - 0x00107a0f, 0x00107a0f, 0x00107a0f, 0x00107a0f, - 0x00107a0f, 0x00107a0f, 0x00107cd0, 0x00107a0f, - 0x00107a0f, 0x00107a0f, 0x00107a0f, 0x00107a0f, - 0x00107a10, 0x00107a0f, 0x00107a0f, 0x00107a0f, - 0x00107a0f, 0x00107a1a, 0x00107a0f, 0x00107a0f, - 0x00107a0f, 0x00107cf3, 0x00107cf8, 0x00107d0e, - 0x00107a0f, 0x00107a0f, 0x00107a0f, 0x00107a0f, - 0x00107a0f, 0x00107a26, 0x00107a0f, 0x00107a0f, - 0x00107a0f, 0x00107a0f, 0x00107a0f, 0x00107a0f, - 0x00107a0f, 0x00107a0f, 0x00107a0f, 0x05c1ffd7, - 0x4933c857, 0x0505fa84, 0x05020304, 0x05d1f80a, - 0x05020302, 0x59cc0407, 0x4802601e, 0x65166403, - 0x64066203, 0x05e9f61f, 0x4933c857, 0x0505fa7a, - 0x050202fa, 0x05d1f800, 0x050202f8, 0x0501fb2a, - 0x05020167, 0x59cc0007, 0x4802601e, 0x652a6403, - 0x64066203, 0x05e9f613, 0x4933c857, 0x0505fa6e, - 0x050202ee, 0x05cdfff4, 0x050202ec, 0x655a6403, - 0x64066203, 0x05e9f60b, 0x4933c857, 0x05cdffee, - 0x0502000b, 0x05e1f97e, 0x05020009, 0x59a8021b, + 0x1c01f000, 0x4933c857, 0x05edf859, 0x4df00000, + 0x59300203, 0x90000c8e, 0x05c6187c, 0x0c01f001, + 0x0010797b, 0x0010797a, 0x00107980, 0x00107998, + 0x0010797f, 0x0010797a, 0x0010797a, 0x0010797a, + 0x0010797a, 0x0010797a, 0x0010797a, 0x0010797a, + 0x0010797a, 0x0010797a, 0x05c5f86c, 0x5c03e000, + 0x05ec082f, 0x80000580, 0x1c01f000, 0x05c9f992, + 0x5c03e000, 0x05ec082a, 0x8d3c0502, 0x05020011, + 0x4d2c0000, 0x59325809, 0x64165a07, 0x0001fb2c, + 0x5c025800, 0x497a6009, 0x8d3c0500, 0x0502000b, + 0x642a621f, 0x4a026403, 0x00000085, 0x64266203, + 0x640a6407, 0x42000800, 0x80004040, 0x0005f87c, + 0x81780080, 0x1c01f000, 0x05f1fcb7, 0x05fdf7fd, + 0x05f9fda0, 0x05020003, 0x05edfa8d, 0x05020007, + 0x0201f800, 0x0010b8cb, 0x80c40040, 0x05fc07e1, + 0x05e9ff4e, 0x05c60845, 0x59300203, 0x90000d83, + 0x05c40842, 0x90000c8e, 0x05c61840, 0x0c01f7c5, + 0x4933c857, 0x4d340000, 0x916c0583, 0x0502000d, + 0x599c0018, 0x8c000516, 0x05000003, 0x05d9fcc8, + 0x0501f008, 0x60100800, 0x05ddff64, 0x6486641f, + 0x05fdfc31, 0x90000541, 0x5c026800, 0x1c01f000, + 0x80000580, 0x05fdf7fd, 0x59303009, 0x58181a05, + 0x820c1d00, 0x000000ff, 0xb00c0588, 0x05000003, + 0xb00c05aa, 0x05020045, 0x58180409, 0x8c000500, + 0x05000042, 0x42000000, 0x001099e8, 0x50006000, + 0x41781800, 0x5830200b, 0x41300000, 0x80100580, + 0x05000006, 0x40101800, 0x580c2000, 0x801021c0, + 0x05fe07fa, 0x0501f035, 0x4933c857, 0x59302000, + 0x497a6000, 0x800c19c0, 0x0502001e, 0x4933c856, + 0x42007000, 0x00020a09, 0x58300009, 0x800001c0, + 0x05000018, 0x49786009, 0x58380001, 0x80300580, + 0x05020008, 0x4933c856, 0x49787002, 0x4810600b, + 0x801021c0, 0x0502001d, 0x4978600a, 0x0501f01b, + 0x4933c856, 0x4810600b, 0x801021c0, 0x05020002, + 0x4978600a, 0x4c180000, 0x4c300000, 0x05c5fca0, + 0x5c006000, 0x05fdfe09, 0x5c003000, 0x0501f00f, + 0x4933c856, 0x800c19c0, 0x05020008, 0x801021c0, + 0x05000003, 0x4810600b, 0x0501f008, 0x4978600b, + 0x4978600a, 0x0501f005, 0x48101800, 0x801021c0, + 0x05020002, 0x480c600a, 0x58180409, 0x84000500, + 0x48003409, 0x49783209, 0x1c01f000, 0x4933c857, + 0x59368c03, 0x4c180000, 0x59300203, 0x9000348e, + 0x05c21fda, 0x0c01f803, 0x5c003000, 0x1c01f000, + 0x00107a1e, 0x00107e61, 0x00107f66, 0x00107a1e, + 0x00107a1e, 0x00107a1e, 0x00107a1e, 0x00107a1e, + 0x00107a3b, 0x00107a1e, 0x00107a1e, 0x00107a1e, + 0x00107a1e, 0x00107a1e, 0x05c1ffc8, 0x4933c857, + 0x61fe89ff, 0x813669c0, 0x05000002, 0x59368c03, + 0x4c180000, 0x59300203, 0x9000348e, 0x05c21fbf, + 0x0c01f803, 0x5c003000, 0x1c01f000, 0x00107a39, + 0x001081a6, 0x00107a39, 0x00107a39, 0x00107a39, + 0x00107a39, 0x00107a39, 0x00107a39, 0x00108107, + 0x001084fd, 0x00108526, 0x001084fd, 0x00108526, + 0x00107a39, 0x05c1ffad, 0x05c1ffac, 0xb1383497, + 0x05c21faa, 0x41380000, 0x493bc857, 0x4d1c0000, + 0x4d400000, 0x0c01f804, 0x5c028000, 0x5c023800, + 0x1c01f000, 0x00107aa5, 0x00107c39, 0x00107aa5, + 0x00107aa5, 0x00107aa5, 0x00107c3f, 0x00107aa5, + 0x00107aa5, 0x00107aa5, 0x00107aa5, 0x00107aa5, + 0x00107aa5, 0x00107aa5, 0x00107aa5, 0x00107aa5, + 0x00107aa5, 0x00107aa5, 0x00107aa5, 0x00107aa5, + 0x00107aa5, 0x00107aa5, 0x00107aa5, 0x00107aa5, + 0x00107ac6, 0x00107b04, 0x00107b15, 0x00107b74, + 0x00107bb8, 0x00107bee, 0x00107c13, 0x00107aa5, + 0x00107aa5, 0x00107c44, 0x00107aa5, 0x00107aa5, + 0x00107c4d, 0x00107c52, 0x00107aa5, 0x00107aa5, + 0x00107aa5, 0x00107aa5, 0x00107aa5, 0x00107ccf, + 0x00107aa5, 0x00107aa5, 0x00107ba1, 0x00107aa5, + 0x00107aa5, 0x00107ca5, 0x00107aa5, 0x00107aa5, + 0x00107aa5, 0x00107cda, 0x00107aa5, 0x00107aa5, + 0x00107aa5, 0x00107d16, 0x00107aa5, 0x00107aa5, + 0x00107aa5, 0x00107aa5, 0x00107aa5, 0x00107aa5, + 0x00107d6b, 0x00107aa5, 0x00107aa5, 0x00107aa5, + 0x00107aa5, 0x00107aa5, 0x00107aa6, 0x00107aa5, + 0x00107aa5, 0x00107aa5, 0x00107aa5, 0x00107ab0, + 0x00107aa5, 0x00107aa5, 0x00107aa5, 0x00107d92, + 0x00107d97, 0x00107daf, 0x00107aa5, 0x00107aa5, + 0x00107aa5, 0x00107aa5, 0x00107aa5, 0x00107abc, + 0x00107aa5, 0x00107aa5, 0x00107aa5, 0x00107aa5, + 0x00107aa5, 0x00107aa5, 0x00107aa5, 0x00107aa5, + 0x00107aa5, 0x05c1ff41, 0x4933c857, 0x0505faa6, + 0x05020311, 0x05cdff76, 0x0502030f, 0x59cc0407, + 0x4802601e, 0x65166403, 0x64066203, 0x05e9f615, + 0x4933c857, 0x0505fa9c, 0x05020307, 0x05cdff6c, + 0x05020305, 0x0501fb37, 0x05020169, 0x59cc0007, + 0x4802601e, 0x652a6403, 0x64066203, 0x05e9f609, + 0x4933c857, 0x0505fa90, 0x050202fb, 0x05cdff60, + 0x050202f9, 0x0501fb2b, 0x0502015d, 0x655a6403, + 0x64066203, 0x05e9f5ff, 0x4933c857, 0x05cdff58, + 0x0502000b, 0x05e1f8f9, 0x05020009, 0x59a8021b, 0x8c000500, 0x0502000a, 0x8c000506, 0x05020004, - 0x05e1fea6, 0x05020006, 0x0501f2dc, 0x64266403, - 0x6426641c, 0x6402621c, 0x0501f164, 0x05e1fa24, + 0x05e1fe44, 0x05020006, 0x0501f2e7, 0x64266403, + 0x6426641c, 0x6402621c, 0x0501f167, 0x05e1f9a1, 0x05000022, 0x59340200, 0x8c00051a, 0x05000004, - 0x5934000a, 0x84000560, 0x4802680a, 0x0501ffc8, + 0x5934000a, 0x84000560, 0x4802680a, 0x0501ffe1, 0x05020021, 0x60a68000, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010b652, 0x5c027800, 0x42000000, - 0x001097fa, 0x0505fe44, 0x05ddff73, 0x64226403, - 0x600c3000, 0x8d0c0520, 0x0500014c, 0x59cc400b, + 0x0201f800, 0x0010b660, 0x5c027800, 0x42000000, + 0x0010987a, 0x0505fe76, 0x05ddfeea, 0x64226403, + 0x600c3000, 0x8d0c0520, 0x0500014f, 0x59cc400b, 0x59cc380c, 0x59cc180d, 0x59cc080e, 0x9c2041c0, 0x9c1c39c0, 0x9c0c19c0, 0x9c0409c0, 0x641e6203, - 0x41782800, 0x0501f13a, 0x0505f85b, 0x05fe07e4, + 0x41782800, 0x0501f13d, 0x0505f874, 0x05fe07e4, 0x64266403, 0x643a641c, 0x4a02621c, 0x00001900, - 0x0501f13a, 0x64266403, 0x640e641c, 0x0501f137, - 0x4933c857, 0x05cdffb0, 0x050202a8, 0x05e1f940, - 0x050202a6, 0x493a6403, 0x0501ff45, 0x05020006, - 0x641a6403, 0x8d0c0520, 0x0500012c, 0x641e6203, - 0x0505f4a4, 0x641e6403, 0x6426641c, 0x6402621c, - 0x0501f126, 0x4933c857, 0x05e1f931, 0x05020297, + 0x0501f13d, 0x64266403, 0x640e641c, 0x0501f13a, + 0x4933c857, 0x05cdff1a, 0x050202b3, 0x05e1f8bb, + 0x050202b1, 0x493a6403, 0x0501ff5e, 0x05020006, + 0x641a6403, 0x8d0c0520, 0x0500012f, 0x641e6203, + 0x0505f4d6, 0x641e6403, 0x6426641c, 0x6402621c, + 0x0501f129, 0x4933c857, 0x05e1f8ac, 0x050202a2, 0x5934000a, 0x82000500, 0x00010000, 0x82000580, - 0x00010000, 0x05060a10, 0x05cc0f97, 0x0502028f, + 0x00010000, 0x05060a30, 0x05cc0f01, 0x0502029a, 0x59cc0001, 0x82000500, 0x00ffff00, 0x82000580, 0x00fffc00, 0x05020006, 0x59a80006, 0x8c00050e, - 0x05000003, 0x8d0c0520, 0x05000035, 0x05e1f9d0, - 0x05020003, 0x60067800, 0x05ddfe69, 0x05e1f9ba, + 0x05000003, 0x8d0c0520, 0x05000035, 0x05e1f94d, + 0x05020003, 0x60067800, 0x05ddfddd, 0x05e1f937, 0x05000004, 0x82000580, 0x00000703, 0x05020031, 0x59cc0206, 0x90003503, 0x05020033, 0x90003494, 0x05001031, 0x59a83073, 0x80183480, 0x0500102e, 0x5934300a, 0x84183516, 0x90000594, 0x05020002, 0x84183556, 0x481a680a, 0x59cc0406, 0x90000503, - 0x05020025, 0x0501ffad, 0x0502002a, 0x05e1f988, + 0x05020025, 0x0501ffc6, 0x0502002a, 0x05e1f905, 0x05020006, 0x4c600000, 0x4178c000, 0x417a7800, - 0x05cdff03, 0x5c00c000, 0x916c0583, 0x05020006, - 0x60183000, 0x0505fc3b, 0x42000000, 0x001097f9, - 0x0505fdd9, 0x05ddff5f, 0x642a6403, 0x60803000, + 0x05cdfe6d, 0x5c00c000, 0x916c0583, 0x05020006, + 0x60183000, 0x0505fc6d, 0x42000000, 0x00109879, + 0x0505fe0b, 0x05ddfeda, 0x642a6403, 0x60803000, 0x59cc1a0a, 0x41780800, 0x41784000, 0x41783800, - 0x8d0c0520, 0x050000dd, 0x05fdf799, 0x642e6403, - 0x642e641c, 0x4a02621c, 0x00002c00, 0x0501f0d7, + 0x8d0c0520, 0x050000e0, 0x05fdf799, 0x642e6403, + 0x642e641c, 0x4a02621c, 0x00002c00, 0x0501f0da, 0x642e6403, 0x6426641c, 0x4a02621c, 0x00001e00, - 0x0501f0d2, 0x42000000, 0x00109754, 0x0505fdc2, - 0x642e6403, 0x641e641c, 0x6402621c, 0x0501f0cb, - 0x642e6403, 0x640e641c, 0x6402621c, 0x0501f0c7, - 0x4933c857, 0x05e1f8d2, 0x05020238, 0x0505f9b6, - 0x05020236, 0x05cdff3c, 0x05020234, 0x59cc0206, + 0x0501f0d5, 0x42000000, 0x001097d4, 0x0505fdf4, + 0x642e6403, 0x641e641c, 0x6402621c, 0x0501f0ce, + 0x642e6403, 0x640e641c, 0x6402621c, 0x0501f0ca, + 0x4933c857, 0x05e1f84d, 0x05020243, 0x0505f9d6, + 0x05020241, 0x05cdfea6, 0x0502023f, 0x59cc0206, 0x90003503, 0x0502001b, 0x90003494, 0x05001019, 0x59a83073, 0x80180480, 0x05001016, 0x59cc0406, 0x90000503, 0x05020013, 0x59340400, 0x82000580, 0x00000707, 0x05000013, 0x417a7800, 0x4c600000, - 0x4178c000, 0x05cdfec2, 0x5c00c000, 0x60283000, - 0x0505fbfc, 0x42000000, 0x001097f6, 0x0505fd9a, + 0x4178c000, 0x05cdfe2c, 0x5c00c000, 0x60283000, + 0x0505fc2e, 0x42000000, 0x00109876, 0x0505fdcc, 0x64326403, 0x41782800, 0x60843000, 0x05fdf7c5, - 0x64366403, 0x641e641c, 0x6402621c, 0x0501f09f, + 0x64366403, 0x641e641c, 0x6402621c, 0x0501f0a2, 0x64366403, 0x6426641c, 0x4a02621c, 0x00001e00, - 0x0501f09a, 0x4933c857, 0x05e1f8a5, 0x0502020b, - 0x0505f989, 0x05020209, 0x05cdff0f, 0x05020207, - 0x0501fa39, 0x0502000a, 0x493a6403, 0x0501fa3f, + 0x0501f09d, 0x4933c857, 0x05e1f820, 0x05020216, + 0x0505f9a9, 0x05020214, 0x05cdfe79, 0x05020212, + 0x0501fa44, 0x0502000a, 0x493a6403, 0x0501fa4a, 0x05020003, 0x64ba6403, 0x05fdf75f, 0x64366403, - 0x641e641c, 0x6402621c, 0x0501f088, 0x64366403, - 0x6426641c, 0x4a02621c, 0x00001e00, 0x0501f083, - 0x4933c857, 0x05e1f88e, 0x05fe0719, 0x59a8021b, + 0x641e641c, 0x6402621c, 0x0501f08b, 0x64366403, + 0x6426641c, 0x4a02621c, 0x00001e00, 0x0501f086, + 0x4933c857, 0x05e1f809, 0x05fe0719, 0x59a8021b, 0x8c000500, 0x05020005, 0x8c000506, 0x05fe0714, - 0x05e1fdb6, 0x050001ed, 0x05e1f927, 0x05020026, - 0x0501ff35, 0x0502000a, 0x643a6403, 0x8d0c0520, - 0x05000072, 0x61483000, 0x59cc4008, 0x59cc3809, + 0x05e1fd54, 0x050001f8, 0x05e1f8a4, 0x05020026, + 0x0501ff4e, 0x0502000a, 0x643a6403, 0x8d0c0520, + 0x05000075, 0x61483000, 0x59cc4008, 0x59cc3809, 0x59cc180a, 0x59cc080b, 0x05fdf725, 0x4933c857, - 0x600c3000, 0x0505fbc2, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010b652, 0x5c027800, 0x42000000, - 0x001097f8, 0x0505fd54, 0x59340200, 0x84000558, - 0x48026a00, 0x602c0800, 0x05ddfdc4, 0x8d0c0520, - 0x05000056, 0x601c3000, 0x0501f04b, 0x4933c857, + 0x600c3000, 0x0505fbf4, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010b660, 0x5c027800, 0x42000000, + 0x00109878, 0x0505fd86, 0x59340200, 0x84000558, + 0x48026a00, 0x602c0800, 0x05ddfd38, 0x8d0c0520, + 0x05000059, 0x601c3000, 0x0501f04e, 0x4933c857, 0x643e6403, 0x640e641c, 0x4a02621c, 0x00001e00, - 0x0501f052, 0x59340400, 0x82000580, 0x00000703, - 0x05fc07f7, 0x0501f032, 0x4933c857, 0x05e1f858, - 0x050201be, 0x59a8021b, 0x8c000500, 0x05020005, - 0x8c000506, 0x050201b9, 0x05e1fd80, 0x050001b7, - 0x05e1f8e8, 0x05020022, 0x0501ff12, 0x05000eac, + 0x0501f055, 0x59340400, 0x82000580, 0x00000703, + 0x05fc07f7, 0x0501f032, 0x4933c857, 0x05ddffd3, + 0x050201c9, 0x59a8021b, 0x8c000500, 0x05020005, + 0x8c000506, 0x050201c4, 0x05e1fd1e, 0x050001c2, + 0x05e1f865, 0x05020022, 0x0501ff2b, 0x05000ec5, 0x05020004, 0x64426403, 0x61403000, 0x05fdf6ee, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010b652, - 0x5c027800, 0x600c3000, 0x0505fb8d, 0x42000000, - 0x001097f8, 0x0505fd24, 0x59340200, 0x84000558, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010b660, + 0x5c027800, 0x600c3000, 0x0505fbbf, 0x42000000, + 0x00109878, 0x0505fd56, 0x59340200, 0x84000558, 0x48026a00, 0x05fdf7d2, 0x64466403, 0x640e641c, - 0x4a02621c, 0x00001e00, 0x0501f028, 0x4933c857, - 0x05cdfea1, 0x05040918, 0x05020198, 0x0501f9ca, - 0x05020007, 0x644a6403, 0x0501f020, 0x59340400, - 0x82000580, 0x00000703, 0x05fc07f0, 0x4d3c0000, - 0x417a7800, 0x60a68000, 0x0201f800, 0x0010b652, - 0x5c027800, 0x605c3000, 0x0505fb6d, 0x42000000, - 0x001097f8, 0x0505fd04, 0x8d0c0520, 0x0500000b, - 0x60183000, 0x60a68000, 0x4933c857, 0x64066403, - 0x641e6203, 0x41782800, 0x0501f002, 0x611a8000, - 0x0501ff44, 0x0505f37f, 0x4933c857, 0x64066403, - 0x602c0800, 0x05ddfd69, 0x64066203, 0x05e9f495, - 0x4933c857, 0x60240800, 0x05ddfd64, 0x64166403, - 0x05fdf7fa, 0x0505f8ec, 0x0502016c, 0x05cdfe72, - 0x0502016a, 0x0501f99c, 0x05fe07d9, 0x64826403, - 0x64066203, 0x05e9f487, 0x05cdfe6b, 0x05020163, - 0x648e6403, 0x64066203, 0x05e9f482, 0x0505f8de, - 0x05cc0e65, 0x0502015d, 0x0501f98f, 0x05fe07cc, - 0x59cc0807, 0x82040500, 0x00ffff00, 0x05020009, - 0x59340212, 0x82000500, 0x0000ff00, 0x05000005, - 0x59a8000f, 0x82000500, 0x000000ff, 0x0501f002, - 0x59a8000f, 0x82040d00, 0x00ffffff, 0x80040580, - 0x05020012, 0x59cc1408, 0x05fdf884, 0x05000022, - 0x591c0202, 0x82001580, 0x0000ffff, 0x05000004, - 0x59cc1208, 0x80080580, 0x0502001b, 0x591c000a, - 0x81340580, 0x05020018, 0x591c0407, 0x90000587, - 0x05020015, 0x0501f022, 0x59cc1208, 0x82080580, - 0x0000ffff, 0x0500000b, 0x05fdf870, 0x0500000e, - 0x59cc1408, 0x591c0202, 0x80080580, 0x0502001e, - 0x591c000a, 0x81340580, 0x0502001b, 0x0501f00e, - 0x59cc1408, 0x41780000, 0x0501fcc4, 0x05fe07f9, - 0x0501f013, 0x649a6403, 0x4a02621c, 0x00001700, - 0x59cc1208, 0x82081580, 0x0000ffff, 0x05fe07ab, - 0x0501f00b, 0x591c0407, 0x90000587, 0x05fe07f6, - 0x591c0403, 0x900005a4, 0x05020005, 0x4d300000, - 0x411e6000, 0x0005f8e7, 0x5c026000, 0x64966403, - 0x05fdf79e, 0x59cc1408, 0x41780000, 0x0501fcab, - 0x05fe07e9, 0x05fdf7fa, 0x4933c857, 0x4d3c0000, - 0x60067800, 0x05ddfcf2, 0x5c027800, 0x4c580000, - 0x6008b000, 0x91a81c02, 0x91cc140b, 0x05f5fb9a, - 0x5c00b000, 0x05000003, 0x64c66403, 0x05fdf78b, - 0x0005f8e7, 0x6008b000, 0x91a81c00, 0x91cc140d, - 0x05f5fb91, 0x0502000c, 0x05e9f817, 0x0500000a, - 0x59300407, 0x90000581, 0x05020007, 0x59300403, - 0x90000582, 0x05020004, 0x5930000a, 0x81340580, - 0x000408e7, 0x05e1fcb5, 0x05020009, 0x05e1fcc9, - 0x05020005, 0x64075014, 0x6006d800, 0x05e1fc2d, - 0x0501f003, 0x60040000, 0x05e1fc80, 0x1c01f000, - 0x05cdfde9, 0x050200e1, 0x0501f913, 0x05fe0750, - 0x493a6403, 0x0501f962, 0x05020003, 0x64ae6403, - 0x05fdf766, 0x64b26403, 0x05fdf764, 0x4933c857, - 0x05e9f8cf, 0x050200d5, 0x05cdfddb, 0x050200d3, - 0x05ddfff3, 0x05fe0759, 0x59cc0408, 0x4802641b, - 0x59cc0208, 0x4802621b, 0x59cc0807, 0x59340002, - 0x82000500, 0x00ffffff, 0x80040580, 0x05000011, - 0x59a8000f, 0x80040580, 0x0502001e, 0x59cc1408, - 0x05f9fffe, 0x05000020, 0x831c0580, 0xffffffff, - 0x05000005, 0x0501ff8e, 0x0500001b, 0x0505fa83, - 0x05000019, 0x491e6020, 0x64da6403, 0x0501f0b3, - 0x59cc1208, 0x82080580, 0x0000ffff, 0x05000008, - 0x05f9ffee, 0x05000010, 0x591c0202, 0x59cc0c08, - 0x80040580, 0x0502000c, 0x05fdf7ec, 0x59cc1408, - 0x60040000, 0x0501fc45, 0x05000007, 0x05fdf7e7, - 0x4803c856, 0x6426641c, 0x4a02621c, 0x00001500, + 0x4a02621c, 0x00001e00, 0x0501f02b, 0x4933c857, + 0x05cdfe0b, 0x05040938, 0x050201a3, 0x0501f9d5, + 0x05020007, 0x644a6403, 0x0501f023, 0x59340400, + 0x82000580, 0x00000703, 0x05fc07f0, 0x83340580, + 0x0010993e, 0x05000009, 0x4d3c0000, 0x417a7800, + 0x60a68000, 0x0201f800, 0x0010b660, 0x5c027800, + 0x605c3000, 0x0505fb9c, 0x42000000, 0x00109878, + 0x0505fd33, 0x8d0c0520, 0x0500000b, 0x60183000, + 0x60a68000, 0x4933c857, 0x64066403, 0x641e6203, + 0x41782800, 0x0501f002, 0x611a8000, 0x0501ff5a, + 0x0505f3ae, 0x4933c857, 0x64066403, 0x602c0800, + 0x05ddfcda, 0x64066203, 0x05e9f486, 0x4933c857, + 0x60240800, 0x05ddfcd5, 0x64166403, 0x05fdf7fa, + 0x0505f909, 0x05020174, 0x05cdfdd9, 0x05020172, + 0x0501f9a4, 0x05fe07d6, 0x64826403, 0x64066203, + 0x05e9f478, 0x05cdfdd2, 0x0502016b, 0x648e6403, + 0x64066203, 0x05e9f473, 0x0505f8fb, 0x05cc0dcc, + 0x05020165, 0x0501f997, 0x05fe07c9, 0x59cc0807, + 0x82040500, 0x00ffff00, 0x05020009, 0x59340212, + 0x82000500, 0x0000ff00, 0x05000005, 0x59a8000f, + 0x82000500, 0x000000ff, 0x0501f002, 0x59a8000f, + 0x82040d00, 0x00ffffff, 0x80040580, 0x05020012, + 0x59cc1408, 0x05fdf87f, 0x05000022, 0x591c0202, + 0x82001580, 0x0000ffff, 0x05000004, 0x59cc1208, + 0x80080580, 0x0502001b, 0x591c000a, 0x81340580, + 0x05020018, 0x591c0407, 0x90000587, 0x05020015, + 0x0501f022, 0x59cc1208, 0x82080580, 0x0000ffff, + 0x0500000b, 0x05fdf86b, 0x0500000e, 0x59cc1408, + 0x591c0202, 0x80080580, 0x0502001e, 0x591c000a, + 0x81340580, 0x0502001b, 0x0501f00e, 0x59cc1408, + 0x41780000, 0x0501fcd2, 0x05fe07f9, 0x0501f013, + 0x649a6403, 0x4a02621c, 0x00001700, 0x59cc1208, + 0x82081580, 0x0000ffff, 0x05fe07ab, 0x0501f00b, + 0x591c0407, 0x90000587, 0x05fe07f6, 0x591c0403, + 0x900005a4, 0x05020005, 0x4d300000, 0x411e6000, + 0x0005f8e7, 0x5c026000, 0x64966403, 0x05fdf79e, + 0x59cc1408, 0x41780000, 0x0501fcb9, 0x05fe07e9, + 0x05fdf7fa, 0x4933c857, 0x4d3c0000, 0x60067800, + 0x05ddfc63, 0x5c027800, 0x4c580000, 0x6008b000, + 0x91a81c02, 0x91cc140b, 0x05f5fb89, 0x5c00b000, + 0x05000003, 0x64c66403, 0x05fdf78b, 0x0005f8e7, + 0x6008b000, 0x91a81c00, 0x91cc140d, 0x05f5fb80, + 0x0502000c, 0x05e5ffd5, 0x0500000a, 0x59300407, + 0x90000581, 0x05020007, 0x59300403, 0x90000582, + 0x05020004, 0x5930000a, 0x81340580, 0x000408e7, + 0x05e1fc50, 0x05020009, 0x05e1fc64, 0x05020005, + 0x64075014, 0x6006d800, 0x05e1fbc8, 0x0501f003, + 0x60040000, 0x05e1fc1b, 0x1c01f000, 0x05cdfd50, + 0x050200e9, 0x0501f91b, 0x05fe074d, 0x493a6403, + 0x0501f96a, 0x05020003, 0x64ae6403, 0x05fdf766, + 0x64b26403, 0x05fdf764, 0x4933c857, 0x05e9f88d, + 0x050200dd, 0x05cdfd42, 0x050200db, 0x05ddff6d, + 0x05fe073f, 0x59cc0408, 0x4802641b, 0x59cc0208, + 0x4802621b, 0x59cc0807, 0x59340002, 0x82000500, + 0x00ffffff, 0x80040580, 0x05000011, 0x59a8000f, + 0x80040580, 0x0502001e, 0x59cc1408, 0x05f9fff9, + 0x05000020, 0x831c0580, 0xffffffff, 0x05000005, + 0x0501ffab, 0x0500001b, 0x0505fab2, 0x05000019, + 0x491e6020, 0x64da6403, 0x0501f0bb, 0x59cc1208, + 0x82080580, 0x0000ffff, 0x05000008, 0x05f9ffe9, + 0x05000010, 0x591c0202, 0x59cc0c08, 0x80040580, + 0x0502000c, 0x05fdf7ec, 0x59cc1408, 0x60040000, + 0x0501fc53, 0x05000007, 0x05fdf7e7, 0x4803c856, + 0x6426641c, 0x4a02621c, 0x00001500, 0x0501f005, + 0x4803c856, 0x640e641c, 0x4a02621c, 0x00001700, + 0x64de6403, 0x0501f0a0, 0x4933c857, 0x05e9f851, + 0x050200a1, 0x05cdfd06, 0x0502009f, 0x05ddff31, + 0x05fe0703, 0x05ddfe89, 0x05000045, 0x59cc0407, + 0x4802641b, 0x59cc1207, 0x480a621b, 0x82080580, + 0x0000ffff, 0x05000004, 0x05f9ffc2, 0x05000036, + 0x0501f008, 0x59cc1407, 0x60040000, 0x0501fc30, + 0x05000031, 0x831c0580, 0xffffffff, 0x0500002e, + 0x59cc0c07, 0x591c0202, 0x80040580, 0x0502002a, + 0x0505fa74, 0x05000028, 0x591c0416, 0x8c000516, + 0x0502002f, 0x4d300000, 0x411e6000, 0x05f9f8ff, + 0x5c026000, 0x641e3a03, 0x59cc0c09, 0x82040d00, + 0x0000ff00, 0x840409c0, 0x90040581, 0x05000009, + 0x90040585, 0x0500000b, 0x90040587, 0x05020011, + 0x42000000, 0x00109865, 0x0505fc15, 0x0501f008, + 0x42000000, 0x00109864, 0x0505fc11, 0x0501f007, + 0x42000000, 0x00109863, 0x0505fc0d, 0x591c0009, + 0x80000540, 0x05000003, 0x59cc2808, 0x0501f75a, + 0x4803c856, 0x6426641c, 0x4a02621c, 0x00002a00, 0x0501f005, 0x4803c856, 0x640e641c, 0x4a02621c, - 0x00001700, 0x64de6403, 0x0501f098, 0x4933c857, - 0x05e9f893, 0x05020099, 0x05cdfd9f, 0x05020097, - 0x05ddffb7, 0x05fe071d, 0x05ddff11, 0x05000045, - 0x59cc0407, 0x4802641b, 0x59cc1207, 0x480a621b, - 0x82080580, 0x0000ffff, 0x05000004, 0x05f9ffc7, - 0x05000036, 0x0501f008, 0x59cc1407, 0x60040000, - 0x0501fc22, 0x05000031, 0x831c0580, 0xffffffff, - 0x0500002e, 0x59cc0c07, 0x591c0202, 0x80040580, - 0x0502002a, 0x0505fa45, 0x05000028, 0x591c0416, - 0x8c000516, 0x0502002f, 0x4d300000, 0x411e6000, - 0x05f9f907, 0x5c026000, 0x641e3a03, 0x59cc0c09, - 0x82040d00, 0x0000ff00, 0x840409c0, 0x90040581, - 0x05000009, 0x90040585, 0x0500000b, 0x90040587, - 0x05020011, 0x42000000, 0x001097e5, 0x0505fbe6, - 0x0501f008, 0x42000000, 0x001097e4, 0x0505fbe2, - 0x0501f007, 0x42000000, 0x001097e3, 0x0505fbde, - 0x591c0009, 0x80000540, 0x05000003, 0x59cc2808, - 0x0501f73d, 0x4803c856, 0x6426641c, 0x4a02621c, - 0x00002a00, 0x0501f005, 0x4803c856, 0x640e641c, - 0x4a02621c, 0x00000300, 0x64ee6403, 0x0501f04b, - 0x4803c856, 0x642e641c, 0x6402621c, 0x05fdf7fb, - 0x4803c856, 0x641e641c, 0x6402621c, 0x05fdf7f7, - 0x4c080000, 0x05ddfede, 0x0500001f, 0x05ddfeb5, - 0x0505f819, 0x0502001a, 0x59a8021b, 0x90000543, - 0x4803521b, 0x59a80018, 0x800000d0, 0x59a8080f, - 0x82040d00, 0x000000ff, 0x80041540, 0x480b500f, - 0x600c0800, 0x05e9fc81, 0x497b501d, 0x8d0c0520, - 0x05000006, 0x4a032804, 0x000007d0, 0x599c0017, - 0x8c00050a, 0x05020008, 0x0005f8e7, 0x0201f800, - 0x0010b83b, 0x5c001000, 0x1c01f000, 0x0505f818, - 0x05fdf7fd, 0x5c001000, 0x0005f0e7, 0x0501f825, - 0x05000022, 0x653a6403, 0x64066203, 0x05e9f341, - 0x653e6403, 0x497a601e, 0x59cc0a06, 0x82040d00, - 0x000000ff, 0x800409c0, 0x05fc06a4, 0x90040581, - 0x05020005, 0x59cc0808, 0x59a80005, 0x80040580, - 0x05fc069e, 0x90040582, 0x05020006, 0x91cc140b, - 0x6008b000, 0x91341c06, 0x05f5faa3, 0x05fc0697, - 0x6406601e, 0x05fdf695, 0x65426403, 0x59cc0207, - 0x4802601e, 0x05fdf691, 0x64066203, 0x42000800, - 0x80000040, 0x0005f07c, 0x4803c857, 0x0005f0e7, - 0x4d2c0000, 0x4c500000, 0x4c580000, 0x4c540000, - 0x59a80073, 0x82000c80, 0x00000841, 0x05021021, - 0x05c5f835, 0x0500001f, 0x492e6009, 0x59a80073, - 0x48025802, 0x90000403, 0x80000104, 0x91cca406, - 0x90000c8a, 0x05001010, 0x642a5811, 0x6028b000, - 0x912c0406, 0x4000a800, 0x0505fc31, 0x412c7000, - 0x800409c0, 0x05020003, 0x49787001, 0x0501f00b, - 0x05c5f821, 0x0500000b, 0x492c7001, 0x40040000, - 0x05fdf7f0, 0x48025811, 0x4000b000, 0x912c0406, - 0x4000a800, 0x0505fc22, 0x90000541, 0x0501f005, - 0x497b5073, 0x59325809, 0x05c5f83f, 0x80000580, - 0x5c00a800, 0x5c00b000, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x4d340000, 0x5932680a, 0x59343400, - 0x4933c857, 0x4937c857, 0x481bc857, 0x05ddfef9, - 0x5c026800, 0x1c01f000, 0x4933c857, 0x4c600000, - 0x4d3c0000, 0x4d440000, 0x4d340000, 0x0501f84d, - 0x0502003b, 0x59cc0207, 0x82000d00, 0x0000ff00, - 0x900411c0, 0x59cc000a, 0x82000500, 0x00ffffff, - 0x80081540, 0x480a601e, 0x8c040518, 0x05000010, - 0x60203000, 0x0505f989, 0x42000000, 0x001097f7, - 0x0505fb2d, 0x8d0c0520, 0x05000005, 0x60082800, - 0x60903000, 0x611a8000, 0x0501fd72, 0x6004c000, - 0x417a7800, 0x05cdfc46, 0x0501f023, 0x8c04051a, - 0x0500001f, 0x59cc000a, 0x05e5fdd3, 0x00000ac4, - 0x0502001b, 0x5930000a, 0x4c000000, 0x8d0c0520, - 0x0500000b, 0x59340c03, 0x59341802, 0x820c1d00, - 0x00ffffff, 0x58002403, 0x60102800, 0x60903000, - 0x611a8000, 0x41301000, 0x0501fd68, 0x4936600a, - 0x60243000, 0x0505f96b, 0x42000000, 0x001097f7, - 0x0505fb09, 0x417a7800, 0x4178c000, 0x05cdfc28, - 0x5c000000, 0x4802600a, 0x0501f003, 0x90000541, - 0x0501f002, 0x80000580, 0x5c026800, 0x5c028800, - 0x5c027800, 0x5c00c000, 0x1c01f000, 0x4933c857, - 0x59cc0206, 0x90000490, 0x05021004, 0x6402621c, - 0x90000541, 0x0501f002, 0x80000580, 0x1c01f000, - 0x4933c857, 0x6402621c, 0x59cc0407, 0x82000500, - 0x0000ff00, 0x82000580, 0x00000800, 0x0502000d, - 0x59cc0206, 0x59a80873, 0x80040480, 0x0500100a, - 0x59cc0006, 0x82000500, 0x00ff0000, 0x82000d80, - 0x00140000, 0x05000003, 0x82000d80, 0x00100000, - 0x1c01f000, 0x42000000, 0x001097ec, 0x0505fada, - 0x90000541, 0x05fdf7fb, 0x59300403, 0xb0003497, - 0x05c21c26, 0x91383593, 0x05020006, 0x4803c857, - 0x4c000000, 0x0505fa00, 0x5c000000, 0x0c01f00f, - 0x4933c857, 0x493bc857, 0x913835a7, 0x05000003, - 0x91383594, 0x05c20c19, 0x493bc857, 0x4937c857, - 0x0505f9f3, 0x05ddfdb7, 0x601c0800, 0x05ddfb37, - 0x05e9fac9, 0x05f1f000, 0x00107e36, 0x00107e3c, - 0x00107e36, 0x00107e36, 0x00107e36, 0x00107e3c, - 0x00107e45, 0x00107eb4, 0x00107e80, 0x00107eb4, - 0x00107e8f, 0x00107eb4, 0x00107e94, 0x00107eb4, - 0x00107e97, 0x00107eb4, 0x00107e97, 0x00107eb4, - 0x00107eb4, 0x00107e36, 0x00107e36, 0x00107e36, - 0x00107e36, 0x00107e36, 0x00107e36, 0x00107e36, - 0x00107e36, 0x00107e36, 0x00107e36, 0x00107e36, - 0x00107e3c, 0x00107e36, 0x00107eb4, 0x00107e36, - 0x00107e36, 0x00107eb4, 0x00107e36, 0x00107eb4, - 0x00107eb4, 0x00107e36, 0x00107e36, 0x00107e36, - 0x00107e36, 0x00107eb4, 0x00107eb4, 0x00107e36, - 0x00107eb4, 0x00107eb4, 0x00107e36, 0x00107e40, - 0x00107e36, 0x00107e36, 0x00107e36, 0x00107e36, - 0x00107e99, 0x00107eb4, 0x00107e36, 0x00107e36, - 0x00107e9a, 0x00107eb4, 0x00107e36, 0x00107e36, - 0x00107e36, 0x00107e36, 0x00107e36, 0x00107e36, - 0x00107e36, 0x00107e36, 0x00107e36, 0x00107e37, - 0x00107e36, 0x00107e36, 0x00107e36, 0x00107e36, - 0x00107e37, 0x00107e36, 0x00107e36, 0x00107e36, - 0x00107e37, 0x00107e37, 0x00107e37, 0x00107e36, - 0x00107e36, 0x00107e36, 0x00107e36, 0x00107e36, - 0x00107e37, 0x00107e36, 0x00107e36, 0x00107e36, - 0x00107e36, 0x00107e36, 0x00107e36, 0x00107e36, - 0x00107e36, 0x00107e36, 0x05c1fbb0, 0x4d2c0000, - 0x59325809, 0x05c1ff48, 0x5c025800, 0x0005f0e7, - 0x59a8002a, 0x48026006, 0x640a6203, 0x1c01f000, - 0x4d3c0000, 0x417a7800, 0x05ddfabd, 0x5c027800, - 0x0501f070, 0x05ddfe0c, 0x0500006e, 0x59a8021b, - 0x8c000508, 0x0500000e, 0x5932680a, 0x4c580000, - 0x6008b000, 0x91a81c02, 0x91341406, 0x05f5f95e, - 0x80000540, 0x5c00b000, 0x05020062, 0x59340200, - 0x8400051a, 0x48026a00, 0x0501f01f, 0x599c0017, - 0x8c00050a, 0x0502005b, 0x4d3c0000, 0x417a7800, - 0x05ddfaa3, 0x5c027800, 0x601c0800, 0x05ddfaab, - 0x59340212, 0x82000500, 0x0000ff00, 0x05020009, - 0x83440d80, 0x000007fe, 0x0502004e, 0x4d300000, - 0x02000800, 0x0010b6da, 0x5c026000, 0x0501f049, - 0x599c0019, 0x8c00050e, 0x05020046, 0x416c0000, - 0x90000582, 0x05020004, 0x59a80016, 0x80000000, - 0x48035016, 0x600c0800, 0x05ddfa94, 0x64066407, - 0x64066203, 0x640a6403, 0x05e9f9be, 0x4ce80000, - 0x6005d000, 0x05e5ff1f, 0x5c01d000, 0x1c01f000, - 0x59340200, 0x8400051a, 0x48026a00, 0x05ddfdc5, - 0x05000030, 0x60100800, 0x05ddfa84, 0x0505f88c, - 0x0502002c, 0x60140800, 0x05ddfa80, 0x64066407, - 0x64066203, 0x640e6403, 0x05e9f1aa, 0x05ddfdc2, - 0x05020024, 0x60180800, 0x0501f823, 0x0501f021, - 0x60100800, 0x05ddfa75, 0x05fdf7b1, 0x05ddfcf1, - 0x0501f01c, 0x0501f01b, 0x59300820, 0x4807c857, - 0x800409c0, 0x05000017, 0x5804001e, 0x81300580, - 0x05020014, 0x4978081e, 0x58041416, 0x8c080516, - 0x05000010, 0x8c080514, 0x0500000e, 0x84081516, - 0x48080c16, 0x58065809, 0x812e59c0, 0x05000009, - 0x492fc857, 0x4d300000, 0x40066000, 0x641e6203, - 0x417a7800, 0x0005f843, 0x5c026000, 0x0501f001, - 0x0005f0e7, 0x4933c857, 0x4807c857, 0x05ddfa53, - 0x4d3c0000, 0x417a7800, 0x05ddfa45, 0x5c027800, - 0x5934000a, 0x84000520, 0x4802680a, 0x05ddf4c9, - 0x59340400, 0x4803c857, 0x80000110, 0x9000348c, - 0x05c21b22, 0x91383595, 0x05020002, 0x0c01f004, - 0x91383596, 0x05c20b1d, 0x0c01f00d, 0x0010645e, - 0x0010645e, 0x0010645e, 0x0010645e, 0x0010645e, - 0x0010645e, 0x00107f04, 0x00107ee3, 0x0010645e, - 0x0010645e, 0x0010645e, 0x0010645e, 0x0010645e, - 0x0010645e, 0x0010645e, 0x0010645e, 0x0010645e, - 0x0010645e, 0x00107f04, 0x00107f09, 0x0010645e, - 0x0010645e, 0x0010645e, 0x0010645e, 0x4933c857, - 0x599c0017, 0x8c00050a, 0x05020014, 0x813669c0, - 0x05000012, 0x59340212, 0x82000500, 0x0000ff00, - 0x0500000e, 0x599c0019, 0x8c00050e, 0x0502000b, - 0x4d3c0000, 0x417a7800, 0x05ddfa0d, 0x5c027800, - 0x600c0800, 0x05ddfa15, 0x64066407, 0x64066203, - 0x640a6403, 0x05e9f13f, 0x59cc0001, 0x59340802, - 0x80040580, 0x82000500, 0x00ffffff, 0x000600e7, - 0x59345002, 0x05d9fffd, 0x482a6802, 0x0005f0e7, - 0x4933c857, 0x59303403, 0x9018359e, 0x000400e7, - 0x1c01f000, 0x4933c857, 0x05f1ffe4, 0x000600e7, - 0x64066203, 0x64066403, 0x05e9f12a, 0x493bc857, - 0xb1380591, 0x05020007, 0x05e9fd67, 0x05ee0727, - 0x59300203, 0x90000582, 0x0500004b, 0x05c1facf, - 0x913805a7, 0x0500000c, 0xb1380588, 0x05000004, - 0x91380594, 0x05000008, 0x05c20ac8, 0x05e9fd5a, - 0x05ee071a, 0x59300203, 0x90000584, 0x000401be, - 0x05c1fac2, 0x4933c857, 0x59300403, 0xb0000c84, - 0x05c21abe, 0xb0000480, 0x05c01abc, 0x40027000, - 0x4803c857, 0x0c01f001, 0x00107f32, 0x00107f33, - 0x00107f33, 0x00107f49, 0x05c1fab4, 0x05e9f96a, - 0x59325809, 0x812e59c0, 0x05000012, 0x832c0500, - 0x00ff0000, 0x0500000f, 0x640a6203, 0x5932680a, - 0x59340200, 0x8c00050e, 0x0502000a, 0x60128000, - 0x0501fb8c, 0x497a6009, 0x59300006, 0x80000540, - 0x05020003, 0x59a8002b, 0x48026006, 0x641e6203, - 0x1c01f000, 0x05e9f954, 0x05f9f99a, 0x05ec068a, - 0x59325809, 0x05c1fe2b, 0x05edf687, 0x05c1fa97, - 0x59325809, 0x592c040b, 0x8c000502, 0x05000004, - 0x641e6203, 0x610e7000, 0x0005f105, 0x64126203, - 0x1c01f000, 0x0501fd41, 0x000401bc, 0x1c01f000, - 0x64066203, 0x65066403, 0x42027800, 0x80002042, - 0x0005f07c, 0xb1380591, 0x05000004, 0xb1380581, - 0x05c20a82, 0x1c01f000, 0x0005f853, 0x0501fd6a, - 0x0005f0e7, 0xb1380492, 0x05c21a7c, 0xb1380489, - 0x05c01a7a, 0x0c01f001, 0x00107f78, 0x00107f97, - 0x00107f77, 0x00107f77, 0x00107f77, 0x00107f77, - 0x00107f97, 0x00107f77, 0x00107fb4, 0x05c1fa6f, - 0x59325809, 0x592c040b, 0x8c00051e, 0x05000010, - 0x82000d00, 0x000000c0, 0x82040d80, 0x00000080, - 0x0500000e, 0x59300804, 0x8c040518, 0x0502000b, - 0x59300416, 0x8c000516, 0x05000003, 0x641e6203, - 0x0501f00e, 0x61067000, 0x0005f1da, 0x641e6203, - 0x497a6006, 0x0005f053, 0x59325809, 0x592c0c0b, - 0x8c04051a, 0x05020003, 0x0005f853, 0x0005f0e7, - 0x0501fd06, 0x05fc07fd, 0x1c01f000, 0x05e9f8e9, - 0x59325809, 0x5932680a, 0x59340200, 0x8c00050e, - 0x0500000d, 0x592c040b, 0x82000500, 0x000000c0, - 0x82000580, 0x00000080, 0x05000005, 0x592c0010, - 0x59301817, 0x800c1c80, 0x480e6017, 0x640a6203, - 0x0501f00b, 0x60128000, 0x0501fb22, 0x59300006, - 0x80000540, 0x05020004, 0x59a8002b, 0x800000c2, - 0x48026006, 0x497a6009, 0x641e6203, 0x1c01f000, - 0x4933c857, 0x05e9fcc4, 0x05c20a30, 0x59300203, - 0x90000582, 0x05fc07a8, 0x05c1fa2c, 0x641e6203, - 0x497a6006, 0x0005f053, 0x641e6203, 0x497a6006, - 0x0005f04e, 0x59300416, 0x8c00051c, 0x000601c9, - 0x59325809, 0x592c2010, 0x40080000, 0x80102480, - 0x59300017, 0x80102400, 0x48126017, 0x0005f1c9, - 0x8c04050e, 0x05020007, 0x641a6203, 0x0501f818, - 0x59300021, 0x80000540, 0x05c60a55, 0x0005f04e, - 0x640a6203, 0x1c01f000, 0x60040800, 0x05c5fa50, - 0x90040581, 0x000401ce, 0x05fdf7e4, 0x59300416, - 0x8c00051c, 0x05000004, 0x05c5f86e, 0x000401c3, - 0x1c01f000, 0x59300013, 0x80000540, 0x05020003, - 0x05c5f868, 0x000401c3, 0x1c01f000, 0x492fc857, - 0x480bc857, 0x8c08053e, 0x05000005, 0x80081080, - 0x80081000, 0x60240800, 0x0501f002, 0x60540800, - 0x480a580c, 0x1c01f000, 0x91380593, 0x05000003, - 0x91380594, 0x05c209f1, 0x59300416, 0x8c000516, - 0x05c009ee, 0x1c01f000, 0x05c1f9ec, 0x59300009, - 0x80000540, 0x05c209e9, 0x1c01f000, 0x59300416, - 0x8c000516, 0x05c009e5, 0x1c01f000, 0x64126203, + 0x00000300, 0x64ee6403, 0x0501f053, 0x4803c856, + 0x642e641c, 0x6402621c, 0x05fdf7fb, 0x4803c856, + 0x641e641c, 0x6402621c, 0x05fdf7f7, 0x59cc0001, + 0x82000580, 0x00fffffe, 0x0502004b, 0x4c080000, + 0x05ddfe52, 0x0500001f, 0x05ddfe29, 0x0505f832, + 0x0502001a, 0x59a8021b, 0x90000543, 0x4803521b, + 0x59a80018, 0x800000d0, 0x59a8080f, 0x82040d00, + 0x000000ff, 0x80041540, 0x480b500f, 0x600c0800, + 0x05e9fc6e, 0x497b501d, 0x8d0c0520, 0x05000006, + 0x4a032804, 0x000007d0, 0x599c0017, 0x8c00050a, + 0x05020008, 0x0005f8e7, 0x0201f800, 0x0010b84b, + 0x5c001000, 0x1c01f000, 0x0505f831, 0x05fdf7fd, + 0x5c001000, 0x0005f0e7, 0x0501f829, 0x05000026, + 0x653a6403, 0x64066203, 0x05e9f32e, 0x05ddfec6, + 0x05fe0687, 0x653e6403, 0x497a601e, 0x59cc0a06, + 0x82040d00, 0x000000ff, 0x800409c0, 0x05fc069e, + 0x90040581, 0x05020005, 0x59cc0808, 0x59a80005, + 0x80040580, 0x05fc0698, 0x90040582, 0x05020006, + 0x91cc140b, 0x6008b000, 0x91341c06, 0x05f5fa8c, + 0x05fc0691, 0x6406601e, 0x05fdf68f, 0x05ddfeae, + 0x05fe066f, 0x65426403, 0x59cc0207, 0x4802601e, + 0x05fdf689, 0x64066203, 0x42000800, 0x80000040, + 0x0005f07c, 0x4803c857, 0x0005f0e7, 0x4d2c0000, + 0x4c500000, 0x4c580000, 0x4c540000, 0x59a80073, + 0x82000c80, 0x00000841, 0x05021021, 0x05c1ff92, + 0x0500001f, 0x492e6009, 0x59a80073, 0x48025802, + 0x90000403, 0x80000104, 0x91cca406, 0x90000c8a, + 0x05001010, 0x642a5811, 0x6028b000, 0x912c0406, + 0x4000a800, 0x0505fc58, 0x412c7000, 0x800409c0, + 0x05020003, 0x49787001, 0x0501f00b, 0x05c1ff7e, + 0x0500000b, 0x492c7001, 0x40040000, 0x05fdf7f0, + 0x48025811, 0x4000b000, 0x912c0406, 0x4000a800, + 0x0505fc49, 0x90000541, 0x0501f005, 0x497b5073, + 0x59325809, 0x05c1ff9c, 0x80000580, 0x5c00a800, + 0x5c00b000, 0x5c00a000, 0x5c025800, 0x1c01f000, + 0x4d340000, 0x5932680a, 0x59343400, 0x4933c857, + 0x4937c857, 0x481bc857, 0x05ddfe6b, 0x5c026800, + 0x1c01f000, 0x4933c857, 0x4c600000, 0x4d3c0000, + 0x4d440000, 0x4d340000, 0x0501f84d, 0x0502003b, + 0x59cc0207, 0x82000d00, 0x0000ff00, 0x900411c0, + 0x59cc000a, 0x82000500, 0x00ffffff, 0x80081540, + 0x480a601e, 0x8c040518, 0x05000010, 0x60203000, + 0x0505f9b0, 0x42000000, 0x00109877, 0x0505fb54, + 0x8d0c0520, 0x05000005, 0x60082800, 0x60903000, + 0x611a8000, 0x0501fd80, 0x6004c000, 0x417a7800, + 0x05cdfba5, 0x0501f023, 0x8c04051a, 0x0500001f, + 0x59cc000a, 0x05e5fd89, 0x00000ac4, 0x0502001b, + 0x5930000a, 0x4c000000, 0x8d0c0520, 0x0500000b, + 0x59340c03, 0x59341802, 0x820c1d00, 0x00ffffff, + 0x58002403, 0x60102800, 0x60903000, 0x611a8000, + 0x41301000, 0x0501fd76, 0x4936600a, 0x60243000, + 0x0505f992, 0x42000000, 0x00109877, 0x0505fb30, + 0x417a7800, 0x4178c000, 0x05cdfb87, 0x5c000000, + 0x4802600a, 0x0501f003, 0x90000541, 0x0501f002, + 0x80000580, 0x5c026800, 0x5c028800, 0x5c027800, + 0x5c00c000, 0x1c01f000, 0x4933c857, 0x59cc0206, + 0x90000490, 0x05021004, 0x6402621c, 0x90000541, + 0x0501f002, 0x80000580, 0x1c01f000, 0x4933c857, + 0x6402621c, 0x59cc0407, 0x82000500, 0x0000ff00, + 0x82000580, 0x00000800, 0x0502000d, 0x59cc0206, + 0x59a80873, 0x80040480, 0x0500100a, 0x59cc0006, + 0x82000500, 0x00ff0000, 0x82000d80, 0x00140000, + 0x05000003, 0x82000d80, 0x00100000, 0x1c01f000, + 0x42000000, 0x0010986c, 0x0505fb01, 0x90000541, + 0x05fdf7fb, 0x59300403, 0xb0003497, 0x05c21b83, + 0x91383593, 0x05020006, 0x4803c857, 0x4c000000, + 0x0505fa27, 0x5c000000, 0x0c01f00f, 0x4933c857, + 0x493bc857, 0x913835a7, 0x05000003, 0x91383594, + 0x05c20b76, 0x493bc857, 0x4937c857, 0x0505fa1a, + 0x05ddfd27, 0x601c0800, 0x05ddfaa0, 0x05e9fab2, + 0x05edf7d5, 0x00107ed9, 0x00107edf, 0x00107ed9, + 0x00107ed9, 0x00107ed9, 0x00107edf, 0x00107ee8, + 0x00107f5a, 0x00107f26, 0x00107f5a, 0x00107f35, + 0x00107f5a, 0x00107f3a, 0x00107f5a, 0x00107f3d, + 0x00107f5a, 0x00107f3d, 0x00107f5a, 0x00107f5a, + 0x00107ed9, 0x00107ed9, 0x00107ed9, 0x00107ed9, + 0x00107ed9, 0x00107ed9, 0x00107ed9, 0x00107ed9, + 0x00107ed9, 0x00107ed9, 0x00107ed9, 0x00107edf, + 0x00107ed9, 0x00107f5a, 0x00107ed9, 0x00107ed9, + 0x00107f5a, 0x00107ed9, 0x00107f5a, 0x00107f5a, + 0x00107ed9, 0x00107ed9, 0x00107ed9, 0x00107ed9, + 0x00107f5a, 0x00107f5a, 0x00107ed9, 0x00107f5a, + 0x00107f5a, 0x00107ed9, 0x00107ee3, 0x00107ed9, + 0x00107ed9, 0x00107ed9, 0x00107ed9, 0x00107f3f, + 0x00107f5a, 0x00107ed9, 0x00107ed9, 0x00107f40, + 0x00107f5a, 0x00107ed9, 0x00107ed9, 0x00107ed9, + 0x00107ed9, 0x00107ed9, 0x00107ed9, 0x00107ed9, + 0x00107ed9, 0x00107ed9, 0x00107eda, 0x00107ed9, + 0x00107ed9, 0x00107ed9, 0x00107ed9, 0x00107eda, + 0x00107ed9, 0x00107ed9, 0x00107ed9, 0x00107eda, + 0x00107eda, 0x00107eda, 0x00107ed9, 0x00107ed9, + 0x00107ed9, 0x00107ed9, 0x00107ed9, 0x00107eda, + 0x00107ed9, 0x00107ed9, 0x00107ed9, 0x00107ed9, + 0x00107ed9, 0x00107ed9, 0x00107ed9, 0x00107ed9, + 0x00107ed9, 0x05c1fb0d, 0x4d2c0000, 0x59325809, + 0x05c1fea5, 0x5c025800, 0x0005f0e7, 0x59a8002a, + 0x48026006, 0x640a6203, 0x1c01f000, 0x4d3c0000, + 0x417a7800, 0x05ddfa26, 0x5c027800, 0x0501f073, + 0x05ddfd7e, 0x05000071, 0x59a8021b, 0x8c000508, + 0x0500000e, 0x5932680a, 0x4c580000, 0x6008b000, + 0x91a81c02, 0x91341406, 0x05f5f945, 0x80000540, + 0x5c00b000, 0x05020065, 0x59340200, 0x8400051a, + 0x48026a00, 0x0501f022, 0x599c0017, 0x8c00050a, + 0x05020007, 0x4d3c0000, 0x417a7800, 0x05ddfa0c, + 0x5c027800, 0x601c0800, 0x05ddfa14, 0x59340212, + 0x82000500, 0x0000ff00, 0x05020009, 0x83440d80, + 0x000007fe, 0x05020051, 0x4d300000, 0x02000800, + 0x0010b6ea, 0x5c026000, 0x0501f04c, 0x599c0017, + 0x8c00050a, 0x05020049, 0x599c0019, 0x8c00050e, + 0x05020046, 0x416c0000, 0x90000582, 0x05020004, + 0x59a80016, 0x80000000, 0x48035016, 0x600c0800, + 0x05ddf9fa, 0x64066407, 0x64066203, 0x640a6403, + 0x05e9f9a4, 0x4ce80000, 0x6005d000, 0x05e5ff05, + 0x5c01d000, 0x1c01f000, 0x59340200, 0x8400051a, + 0x48026a00, 0x05ddfd34, 0x05000030, 0x60100800, + 0x05ddf9ea, 0x0505f8b0, 0x0502002c, 0x60140800, + 0x05ddf9e6, 0x64066407, 0x64066203, 0x640e6403, + 0x05e9f190, 0x05ddfd31, 0x05020024, 0x60180800, + 0x0501f823, 0x0501f021, 0x60100800, 0x05ddf9db, + 0x05fdf7ae, 0x05ddfc5e, 0x0501f01c, 0x0501f01b, + 0x59300820, 0x4807c857, 0x800409c0, 0x05000017, + 0x5804001e, 0x81300580, 0x05020014, 0x4978081e, + 0x58041416, 0x8c080516, 0x05000010, 0x8c080514, + 0x0500000e, 0x84081516, 0x48080c16, 0x58065809, + 0x812e59c0, 0x05000009, 0x492fc857, 0x4d300000, + 0x40066000, 0x641e6203, 0x417a7800, 0x0005f843, + 0x5c026000, 0x0501f001, 0x0005f0e7, 0x4933c857, + 0x4807c857, 0x05ddf9b9, 0x4d3c0000, 0x417a7800, + 0x05ddf9ab, 0x5c027800, 0x5934000a, 0x84000520, + 0x4802680a, 0x05ddf436, 0x59340400, 0x4803c857, + 0x80000110, 0x9000348c, 0x05c21a7c, 0x91383595, + 0x05020002, 0x0c01f004, 0x91383596, 0x05c20a77, + 0x0c01f00d, 0x001064e5, 0x001064e5, 0x001064e5, + 0x001064e5, 0x001064e5, 0x001064e5, 0x00107faa, + 0x00107f89, 0x001064e5, 0x001064e5, 0x001064e5, + 0x001064e5, 0x001064e5, 0x001064e5, 0x001064e5, + 0x001064e5, 0x001064e5, 0x001064e5, 0x00107faa, + 0x00107faf, 0x001064e5, 0x001064e5, 0x001064e5, + 0x001064e5, 0x4933c857, 0x599c0017, 0x8c00050a, + 0x05020014, 0x813669c0, 0x05000012, 0x59340212, + 0x82000500, 0x0000ff00, 0x0500000e, 0x599c0019, + 0x8c00050e, 0x0502000b, 0x4d3c0000, 0x417a7800, + 0x05ddf973, 0x5c027800, 0x600c0800, 0x05ddf97b, + 0x64066407, 0x64066203, 0x640a6403, 0x05e9f125, + 0x59cc0001, 0x59340802, 0x80040580, 0x82000500, + 0x00ffffff, 0x000600e7, 0x59345002, 0x05d9ff63, + 0x482a6802, 0x0005f0e7, 0x4933c857, 0x59303403, + 0x9018359e, 0x000400e7, 0x1c01f000, 0x4933c857, + 0x05f1ffc5, 0x000600e7, 0x64066203, 0x64066403, + 0x05e9f110, 0x493bc857, 0xb1380591, 0x05020007, + 0x05e9fd4d, 0x05ee06fd, 0x59300203, 0x90000582, + 0x0500004b, 0x05c1fa29, 0x913805a7, 0x0500000c, + 0xb1380588, 0x05000004, 0x91380594, 0x05000008, + 0x05c20a22, 0x05e9fd40, 0x05ee06f0, 0x59300203, + 0x90000584, 0x000401be, 0x05c1fa1c, 0x4933c857, + 0x59300403, 0xb0000c84, 0x05c21a18, 0xb0000480, + 0x05c01a16, 0x40027000, 0x4803c857, 0x0c01f001, + 0x00107fd8, 0x00107fd9, 0x00107fd9, 0x00107fef, + 0x05c1fa0e, 0x05e9f950, 0x59325809, 0x812e59c0, + 0x05000012, 0x832c0500, 0x00ff0000, 0x0500000f, + 0x640a6203, 0x5932680a, 0x59340200, 0x8c00050e, + 0x0502000a, 0x60128000, 0x0501fb97, 0x497a6009, + 0x59300006, 0x80000540, 0x05020003, 0x59a8002b, + 0x48026006, 0x641e6203, 0x1c01f000, 0x05e9f93a, + 0x05f9f98a, 0x05ec065c, 0x59325809, 0x05c1fd85, + 0x05edf659, 0x05c1f9f1, 0x59325809, 0x592c040b, + 0x8c000502, 0x05000004, 0x641e6203, 0x610e7000, + 0x0005f105, 0x64126203, 0x1c01f000, 0x0501fd53, + 0x000401bc, 0x1c01f000, 0x64066203, 0x65066403, + 0x42027800, 0x80002042, 0x0005f07c, 0xb1380591, + 0x05000004, 0xb1380581, 0x05c209dc, 0x1c01f000, + 0x0005f853, 0x0501fd7c, 0x0005f0e7, 0xb1380492, + 0x05c219d6, 0xb1380489, 0x05c019d4, 0x0c01f001, + 0x0010801e, 0x00108040, 0x0010801d, 0x0010801d, + 0x0010801d, 0x0010801d, 0x00108040, 0x0010801d, + 0x0010805d, 0x05c1f9c9, 0x59325809, 0x592c040b, + 0x8c00051e, 0x05000010, 0x82000d00, 0x000000c0, + 0x82040d80, 0x00000080, 0x05000011, 0x59300804, + 0x8c040518, 0x0502000e, 0x59300416, 0x8c000516, + 0x05000003, 0x641e6203, 0x0501f011, 0x61067000, + 0x0005f1da, 0x641e6203, 0x497a6006, 0x59300416, + 0x8c000516, 0x0502000a, 0x0005f053, 0x59325809, + 0x592c0c0b, 0x8c04051a, 0x05020003, 0x0005f853, + 0x0005f0e7, 0x0501fd15, 0x05fc07fd, 0x1c01f000, + 0x05e9f8cc, 0x59325809, 0x5932680a, 0x59340200, + 0x8c00050e, 0x0500000d, 0x592c040b, 0x82000500, + 0x000000c0, 0x82000580, 0x00000080, 0x05000005, + 0x592c0010, 0x59301817, 0x800c1c80, 0x480e6017, + 0x640a6203, 0x0501f00b, 0x60128000, 0x0501fb2a, + 0x59300006, 0x80000540, 0x05020004, 0x59a8002b, + 0x800000c2, 0x48026006, 0x497a6009, 0x641e6203, + 0x1c01f000, 0x4933c857, 0x05e9fca7, 0x05c20987, + 0x59300203, 0x90000582, 0x05fc07a5, 0x05c1f983, + 0x641e6203, 0x497a6006, 0x0005f053, 0x641e6203, + 0x497a6006, 0x0005f04e, 0x59300416, 0x8c00051c, + 0x000601c9, 0x59325809, 0x592c2010, 0x40080000, + 0x80102480, 0x59300017, 0x80102400, 0x48126017, + 0x0005f1c9, 0x8c04050e, 0x05020007, 0x641a6203, + 0x0501f818, 0x59300021, 0x80000540, 0x05c609ac, + 0x0005f04e, 0x640a6203, 0x1c01f000, 0x60040800, + 0x05c5f9a7, 0x90040581, 0x000401ce, 0x05fdf7e4, + 0x59300416, 0x8c00051c, 0x05000004, 0x05c1ffc3, + 0x000401c3, 0x1c01f000, 0x59300013, 0x80000540, + 0x05020003, 0x05c1ffbd, 0x000401c3, 0x1c01f000, + 0x492fc857, 0x480bc857, 0x8c08053e, 0x05000005, + 0x80081080, 0x80081000, 0x60240800, 0x0501f002, + 0x60540800, 0x480a580c, 0x1c01f000, 0x91380593, + 0x05000003, 0x91380594, 0x05c20948, 0x59300416, + 0x8c000516, 0x05c00945, 0x1c01f000, 0x05c1f943, + 0x59300009, 0x80000540, 0x05c20940, 0x1c01f000, + 0x59300416, 0x8c000516, 0x05c0093c, 0x1c01f000, + 0x64126203, 0x493a6403, 0x42000800, 0x80002001, + 0x0005f07c, 0x640e6203, 0x493a6403, 0x0001f96f, + 0x59325809, 0x592c040b, 0x8c00051e, 0x05000011, + 0x82000500, 0x000000c0, 0x82000580, 0x00000080, + 0x0500000f, 0x59300416, 0x8c000512, 0x05020009, + 0x8c000510, 0x05020007, 0x592c040d, 0x80000540, + 0x05020004, 0x82080d40, 0x80003065, 0x0005f072, + 0x82080d40, 0x80002065, 0x0005f072, 0x82080d40, + 0x80002042, 0x0005f072, 0x4933c857, 0x493bc857, + 0xb1380484, 0x05c21915, 0xb1380481, 0x05c01913, + 0x0c01f001, 0x001080d8, 0x001080e6, 0x001080f8, + 0x59325809, 0x592c040b, 0x8c00051e, 0x05000019, + 0x82001d00, 0x000000c0, 0x820c1d80, 0x000000c0, + 0x05000014, 0x64066203, 0x493a6403, 0x42000800, + 0x80002042, 0x0005f07c, 0x59325809, 0x592c040b, + 0x8c00051e, 0x0500000b, 0x82001d00, 0x000000c0, + 0x820c1d80, 0x000000c0, 0x05000006, 0x64066203, 0x493a6403, 0x42000800, 0x80002001, 0x0005f07c, - 0x640e6203, 0x493a6403, 0x0001f96f, 0x59325809, - 0x592c040b, 0x8c00051e, 0x05000011, 0x82000500, - 0x000000c0, 0x82000580, 0x00000080, 0x0500000f, - 0x59300416, 0x8c000512, 0x05020009, 0x8c000510, - 0x05020007, 0x592c040d, 0x80000540, 0x05020004, - 0x82080d40, 0x80003065, 0x0005f072, 0x82080d40, - 0x80002065, 0x0005f072, 0x82080d40, 0x80002042, - 0x0005f072, 0x4933c857, 0x493bc857, 0xb1380484, - 0x05c219be, 0xb1380481, 0x05c019bc, 0x0c01f001, - 0x0010802f, 0x0010803d, 0x0010804f, 0x59325809, - 0x592c040b, 0x8c00051e, 0x05000019, 0x82001d00, - 0x000000c0, 0x820c1d80, 0x000000c0, 0x05000014, - 0x64066203, 0x493a6403, 0x42000800, 0x80002042, - 0x0005f07c, 0x59325809, 0x592c040b, 0x8c00051e, - 0x0500000b, 0x82001d00, 0x000000c0, 0x820c1d80, - 0x000000c0, 0x05000006, 0x64066203, 0x493a6403, - 0x42000800, 0x80002001, 0x0005f07c, 0x497a6009, - 0x497a6006, 0x60128000, 0x0501f27e, 0x59325809, - 0x592c040b, 0x8c00051e, 0x05fc07f9, 0x82001d00, - 0x000000c0, 0x820c1d80, 0x000000c0, 0x05fc07f4, - 0x640e6203, 0x493a6403, 0x0001f96f, 0x82080d40, - 0x80002065, 0x0005f072, 0x4933c857, 0x493bc857, - 0x83380580, 0x00000085, 0x05000005, 0x83380580, - 0x00000088, 0x05000007, 0x05c1f980, 0x64266203, - 0x493a6403, 0x42000800, 0x80000040, 0x0005f07c, - 0x83300580, 0x0010cc5c, 0x05c20978, 0x4d1c0000, - 0x813669c0, 0x05000003, 0x0501fc23, 0x0502003d, - 0x59cc1404, 0x41780000, 0x0501f83c, 0x05000014, - 0x59cc0204, 0x82001580, 0x0000ffff, 0x05000004, - 0x591c1402, 0x80080580, 0x0502000d, 0x591c0407, - 0x9000051f, 0x90002586, 0x05000005, 0x90002584, - 0x05000021, 0x90002591, 0x05020005, 0x497a3a05, - 0x61502000, 0x05edfe58, 0x0501f026, 0x8d0c0520, - 0x05000004, 0x42023800, 0xffffffff, 0x05fdf7f9, - 0x813669c0, 0x05020007, 0x59cc0001, 0x05e5fab6, - 0x0502001c, 0x05ddf8a5, 0x0502001a, 0x4936600a, - 0x4a026403, 0x00000087, 0x59cc1204, 0x82081580, - 0x0000ffff, 0x05020003, 0x4a026403, 0x00000086, - 0x4d2c0000, 0x0501fe96, 0x05ddfe32, 0x5c025800, - 0x0501f00c, 0x591c0403, 0x900005b8, 0x05fc07e1, - 0x591c0203, 0x90000587, 0x05fe07e1, 0x4d300000, - 0x411e6000, 0x05edfd28, 0x5c026000, 0x05fdf7dc, - 0x5c023800, 0x1c01f000, 0x4933c857, 0x480bc857, - 0x4c5c0000, 0x4000b800, 0x42002800, 0x0010cca4, - 0x41300000, 0x80140580, 0x05000016, 0x58140203, - 0x90000580, 0x05000013, 0x58140202, 0x80080580, - 0x05020010, 0x58141c07, 0x900c0585, 0x0500000d, - 0x8c5c0500, 0x05000003, 0x900c0587, 0x05000009, - 0x5930200a, 0x5814000a, 0x800001c0, 0x0500000a, + 0x497a6009, 0x497a6006, 0x60128000, 0x0501f286, + 0x59325809, 0x592c040b, 0x8c00051e, 0x05fc07f9, + 0x82001d00, 0x000000c0, 0x820c1d80, 0x000000c0, + 0x05fc07f4, 0x640e6203, 0x493a6403, 0x0001f96f, + 0x82080d40, 0x80002065, 0x0005f072, 0x4933c857, + 0x493bc857, 0x83380580, 0x00000085, 0x05000005, + 0x83380580, 0x00000088, 0x05000007, 0x05c1f8d7, + 0x64266203, 0x493a6403, 0x42000800, 0x80000040, + 0x0005f07c, 0x83300580, 0x0010cc6c, 0x05c208cf, + 0x4d1c0000, 0x813669c0, 0x05000003, 0x0501fc32, + 0x0502003d, 0x59cc1404, 0x41780000, 0x0501f83c, + 0x05000014, 0x59cc0204, 0x82001580, 0x0000ffff, + 0x05000004, 0x591c1402, 0x80080580, 0x0502000d, + 0x591c0407, 0x9000051f, 0x90002586, 0x05000005, + 0x90002584, 0x05000021, 0x90002591, 0x05020005, + 0x497a3a05, 0x61502000, 0x05edfe2b, 0x0501f026, + 0x8d0c0520, 0x05000004, 0x42023800, 0xffffffff, + 0x05fdf7f9, 0x813669c0, 0x05020007, 0x59cc0001, + 0x05e5fa66, 0x0502001c, 0x05ddf80b, 0x0502001a, + 0x4936600a, 0x4a026403, 0x00000087, 0x59cc1204, + 0x82081580, 0x0000ffff, 0x05020003, 0x4a026403, + 0x00000086, 0x4d2c0000, 0x0501feb7, 0x05ddfda1, + 0x5c025800, 0x0501f00c, 0x591c0403, 0x900005b8, + 0x05fc07e1, 0x591c0203, 0x90000587, 0x05fe07e1, + 0x4d300000, 0x411e6000, 0x05edfcf7, 0x5c026000, + 0x05fdf7dc, 0x5c023800, 0x1c01f000, 0x4933c857, + 0x480bc857, 0x4c5c0000, 0x4000b800, 0x42002800, + 0x0010ccb4, 0x41300000, 0x80140580, 0x05000019, + 0x58140203, 0x90000580, 0x05000016, 0x58140202, + 0x80080580, 0x05020013, 0x58141c07, 0x900c0585, + 0x05000010, 0x8c5c0500, 0x05000003, 0x900c0587, + 0x0500000c, 0x5930200a, 0x5814000a, 0x800001c0, + 0x0500000d, 0x82001d80, 0x0010993e, 0x0500000a, 0x801021c0, 0x05000003, 0x80100580, 0x05000011, - 0x90142c24, 0x41540000, 0x80140480, 0x05021018, - 0x05fdf7e4, 0x58140020, 0x801021c0, 0x05000005, + 0x90142c24, 0x41540000, 0x80140480, 0x0502101d, + 0x05fdf7e1, 0x58140020, 0x801021c0, 0x05000005, 0x58102002, 0x82102500, 0x00ffffff, 0x05fdf7f3, 0x8c5c0500, 0x05fe07f3, 0x59302020, 0x05fdf7ef, 0x40163800, 0x8c5c0500, 0x05000007, 0x4c080000, - 0x4c140000, 0x0501fdf9, 0x5c002800, 0x5c001000, - 0x05fc07e8, 0x81300540, 0x0501f009, 0x8c5c0500, - 0x05000007, 0x40080800, 0x42023800, 0xffffffff, - 0x05ddfded, 0x05fc07f8, 0x80000580, 0x5c00b800, - 0x1c01f000, 0x4933c857, 0x83300580, 0x0010cc38, - 0x0502002d, 0x64026203, 0x91380593, 0x05020022, - 0x59300403, 0x82000580, 0x00000092, 0x05c208e7, - 0x59a80063, 0x59325809, 0x812e59c0, 0x05000005, - 0x812c0580, 0x05c208e1, 0x592c0000, 0x497a5800, - 0x800001c0, 0x05000004, 0x48035063, 0x05edfc51, - 0x0501f003, 0x497b5063, 0x497b5064, 0x812e59c0, - 0x05000014, 0x592c0205, 0xb0000595, 0x05c00465, - 0x91380593, 0x05020003, 0x64025a07, 0x0001f32c, - 0x64c65a07, 0x64125812, 0x4a025813, 0x000000ff, - 0x0001f32c, 0x913805a7, 0x05000003, 0x91380594, - 0x05c208c6, 0x493bc857, 0x05e5ff7b, 0x05fdf7d9, - 0x1c01f000, 0x4933c857, 0x91380593, 0x0502000c, - 0x59300403, 0x4803c857, 0x82000c80, 0x00000085, - 0x05c018ba, 0x82000c80, 0x00000093, 0x05c218b7, - 0x82000480, 0x00000085, 0x0c01f010, 0x913805a7, - 0x05000003, 0x91380594, 0x05ee0504, 0x493bc857, - 0x05e5ff65, 0x59325809, 0x812e59c0, 0x05ec049a, - 0x64c65a07, 0x64125812, 0x4a025813, 0x000000ff, - 0x0001fb2c, 0x05edf494, 0x00108150, 0x00108154, - 0x00108154, 0x00108150, 0x00108150, 0x00108150, - 0x00108150, 0x00108150, 0x00108150, 0x00108150, - 0x00108150, 0x00108150, 0x00108150, 0x00108151, - 0x05c1f896, 0x59325809, 0x64025a07, 0x0001fb2c, - 0x0005f0e7, 0x4933c857, 0x42000000, 0x00109808, - 0x0501ff3d, 0x0501fb78, 0x497a6205, 0x602e8000, - 0x0501f805, 0x641a6407, 0x641e6203, 0x497a6006, - 0x1c01f000, 0x4933c857, 0x4943c857, 0x59300407, - 0x90000587, 0x05020002, 0x1c01f000, 0x05e5ffcc, - 0x4df00000, 0x05f5ff7b, 0x0500000a, 0x59300809, - 0x58040000, 0x80001540, 0x05000006, 0x49780800, - 0x4d2c0000, 0x400a5800, 0x0501f95a, 0x5c025800, - 0x05f5fd3f, 0x90000c8e, 0x05c21870, 0x0c01f001, - 0x00108198, 0x0010819b, 0x00108186, 0x001081a7, - 0x001081b5, 0x00108186, 0x00108186, 0x00108186, - 0x00108186, 0x00108186, 0x00108186, 0x00108186, - 0x00108186, 0x00108186, 0x4d400000, 0x59300021, - 0x80000540, 0x05000004, 0x41400800, 0x05c5f89c, - 0x40068000, 0x4d2c0000, 0x59325809, 0x05f5ff55, - 0x0502093c, 0x4c5c0000, 0x5930b80a, 0x05edfc42, - 0x485e600a, 0x5c00b800, 0x5c025800, 0x5c028000, - 0x5c03e000, 0x05e40786, 0x1c01f000, 0x598c000b, - 0x81300580, 0x05020003, 0x05e9fa32, 0x05020012, - 0x0201f800, 0x0010ba2e, 0x80c40040, 0x05fc07e3, - 0x05e5febe, 0x0500000c, 0x05c1f840, 0x05f5fcfe, - 0x05020003, 0x05e9f9f2, 0x05020007, 0x0201f800, - 0x0010b8bb, 0x80c40040, 0x05fc07d8, 0x05e5feb3, - 0x05c20836, 0x59300203, 0x90000c8e, 0x05c21833, - 0x0c01f7c4, 0x05c5f95c, 0x05fdf7d0, 0x4933c857, - 0x4d440000, 0x4d340000, 0x59cc3800, 0x821c3d00, - 0x00ffffff, 0x59cc0007, 0x4c000000, 0x59cc0001, - 0x82000500, 0x00ffffff, 0x82000d80, 0x00fffffe, - 0x5c000000, 0x05020005, 0x801c0d80, 0x05020045, - 0x42000000, 0x00fffffe, 0x05e5f97f, 0x00000ac4, - 0x05020040, 0x5930000a, 0x4c000000, 0x8d0c0520, - 0x05000011, 0x81342d80, 0x05000002, 0x60102800, - 0x58002403, 0x59340c03, 0x59341802, 0x820c1d00, - 0x00ffffff, 0x60143000, 0x59cc4008, 0x59cc3809, - 0x9c2041c0, 0x9c1c39c0, 0x611a8000, 0x41301000, - 0x0501f90e, 0x4936600a, 0x83440d80, 0x000007fe, - 0x0502000f, 0x60683000, 0x0501fd15, 0x42000000, - 0x001097f5, 0x0501feac, 0x4d3c0000, 0x4d400000, - 0x60a68000, 0x602a7804, 0x0201f800, 0x0010b5d3, - 0x5c028000, 0x5c027800, 0x0501f00e, 0x602c3000, - 0x0501fd07, 0x42000000, 0x001097f5, 0x0501fe9e, - 0x4d3c0000, 0x4d400000, 0x60a68000, 0x417a7800, - 0x0201f800, 0x0010b652, 0x5c028000, 0x5c027800, - 0x5c000000, 0x4802600a, 0x59cc0007, 0x83440d80, - 0x000007fe, 0x05020005, 0x42000000, 0x00fffffe, - 0x4a026c00, 0x00000707, 0x48026802, 0x80000580, - 0x5c026800, 0x5c028800, 0x1c01f000, 0x4933c857, - 0x4c040000, 0x59a80073, 0xb00005b4, 0x05020040, - 0x59cc0a08, 0x82040480, 0x00000100, 0x05001033, - 0x59cc0c08, 0x82040500, 0x00008000, 0x05000035, - 0x59a80013, 0x80000540, 0x05020009, 0x5930100a, - 0x58080212, 0x82000500, 0x0000ff00, 0x05000004, - 0x82040500, 0x00000800, 0x0500002a, 0x59cc0c09, - 0x80040840, 0x05001024, 0x59a80a1b, 0x8c040506, - 0x05000004, 0x59cc0c0f, 0x8c04051e, 0x05020012, - 0x59cc0a17, 0x800409c0, 0x05020012, 0x59cc0a18, - 0x82040480, 0x00000100, 0x05001014, 0x59cc0c18, - 0x800409c0, 0x0502000e, 0x59cc0c19, 0x80040840, - 0x05001011, 0x59cc0c1a, 0x80040840, 0x05001011, - 0x0501f017, 0x4a02621c, 0x00000100, 0x0501f012, - 0x4a02621c, 0x00000300, 0x0501f00f, 0x4a02621c, - 0x00000500, 0x0501f00c, 0x4a02621c, 0x00000700, - 0x0501f009, 0x4a02621c, 0x00000900, 0x0501f006, - 0x4a02621c, 0x00000f00, 0x0501f003, 0x4a02621c, - 0x00002d00, 0x90000541, 0x0501f002, 0x80000580, - 0x5c000800, 0x1c01f000, 0x59cc0407, 0x4803c857, - 0x82000580, 0x00000800, 0x05000002, 0x6402621c, - 0x1c01f000, 0x4933c857, 0x4c580000, 0x59cc000c, - 0x59340802, 0x82040d00, 0x00ffffff, 0x80040580, - 0x0502000a, 0x91cc1408, 0x6008b000, 0x91341c06, - 0x05f1fd41, 0x05020005, 0x91cc140a, 0x6008b000, - 0x91341c08, 0x05f1fd3c, 0x5c00b000, 0x1c01f000, - 0x4933c857, 0x4c580000, 0x91cc140b, 0x6008b000, - 0x91341c06, 0x05f1fd34, 0x05020008, 0x91cc140d, - 0x6008b000, 0x91341c08, 0x05f1fd2f, 0x05000014, - 0x4933c856, 0x4933c856, 0x4933c857, 0x59340009, - 0x4803c857, 0x5934000e, 0x4803c857, 0x59340008, - 0x4803c857, 0x5934000d, 0x4803c857, 0x59340007, - 0x4803c857, 0x5934000c, 0x4803c857, 0x59340006, - 0x4803c857, 0x5934000b, 0x4803c857, 0x5c00b000, - 0x1c01f000, 0x4933c857, 0x813261c0, 0x05000025, - 0x83300d80, 0x0010cc5c, 0x05000022, 0x8d3c0506, - 0x05020020, 0x59300c07, 0x90040581, 0x05000008, - 0x90040582, 0x0502001b, 0x5930021f, 0x90000581, - 0x05020018, 0x59300c18, 0x0501f002, 0x59300c03, - 0x900405b9, 0x05000003, 0x900405b5, 0x05020011, - 0x4d300000, 0x4d1c0000, 0x59326020, 0x4933c857, - 0x05f9f9ab, 0x05bc0f35, 0x591c001e, 0x497a381e, - 0x591c0c16, 0x84040d02, 0x48063c16, 0x5c023800, - 0x5c026000, 0x81300580, 0x05be0f2c, 0x497a6020, - 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, - 0x4d3c0000, 0x60067800, 0x05d9fe3d, 0x5c027800, - 0x4c580000, 0x6008b000, 0x91a81c02, 0x91cc140b, - 0x05f1fce5, 0x5c00b000, 0x80000540, 0x1c01f000, - 0x492fc857, 0x4943c857, 0x59a8000c, 0x812c0480, - 0x0500100f, 0x59a8000a, 0x812c0480, 0x0502100c, - 0x592c0000, 0x80005d40, 0x05000007, 0x497a5800, - 0x49425a07, 0x4c2c0000, 0x0001fb2c, 0x5c025800, - 0x05fdf7f8, 0x49425a07, 0x0001f32c, 0x1c01f000, - 0x61fc21ff, 0x5930100a, 0x800811c0, 0x05000002, - 0x58082403, 0x41301000, 0x0501f008, 0x40682800, - 0x406c3000, 0x41781000, 0x41442000, 0x0501f003, - 0x41781000, 0x61fc21ff, 0x5c000000, 0x4c000000, - 0x4803c857, 0x480bc857, 0x4813c857, 0x492fc857, - 0x4943c857, 0x4d2c0000, 0x4c040000, 0x4c080000, - 0x4c0c0000, 0x4c100000, 0x4c140000, 0x4c180000, - 0x4c1c0000, 0x4c200000, 0x05c1fa6a, 0x05bc0ee7, - 0x5c004000, 0x5c003800, 0x5c003000, 0x5c002800, - 0x5c002000, 0x5c001800, 0x5c001000, 0x5c000800, - 0x4a025805, 0x0000010d, 0x800811c0, 0x05000012, - 0x914005a9, 0x0502000c, 0x90180582, 0x05000007, - 0x90180583, 0x05000005, 0x90180588, 0x05000003, - 0x90180589, 0x05020004, 0x4a02580a, 0xffffffff, - 0x0501f002, 0x480a580a, 0x58080202, 0x48025c14, + 0x4c140000, 0x0501fe17, 0x5c002800, 0x5c001000, + 0x05fc07e8, 0x591c000a, 0x800001c0, 0x05020003, + 0x5930000a, 0x4802380a, 0x81300540, 0x0501f009, + 0x8c5c0500, 0x05000007, 0x40080800, 0x42023800, + 0xffffffff, 0x05ddfd54, 0x05fc07f3, 0x80000580, + 0x5c00b800, 0x1c01f000, 0x4933c857, 0x83300580, + 0x0010cc48, 0x0502002d, 0x64026203, 0x91380593, + 0x05020022, 0x59300403, 0x82000580, 0x00000092, + 0x05c20836, 0x59a80063, 0x59325809, 0x812e59c0, + 0x05000005, 0x812c0580, 0x05c20830, 0x592c0000, + 0x497a5800, 0x800001c0, 0x05000004, 0x48035063, + 0x05edfc18, 0x0501f003, 0x497b5063, 0x497b5064, + 0x812e59c0, 0x05000014, 0x592c0205, 0xb0000595, + 0x05c003b4, 0x91380593, 0x05020003, 0x64025a07, + 0x0001f32c, 0x64c65a07, 0x64125812, 0x4a025813, + 0x000000ff, 0x0001f32c, 0x913805a7, 0x05000003, + 0x91380594, 0x05c20815, 0x493bc857, 0x05e5ff56, + 0x05fdf7d9, 0x1c01f000, 0x4933c857, 0x91380593, + 0x0502000c, 0x59300403, 0x4803c857, 0x82000c80, + 0x00000085, 0x05c01809, 0x82000c80, 0x00000093, + 0x05c21806, 0x82000480, 0x00000085, 0x0c01f010, + 0x913805a7, 0x05000003, 0x91380594, 0x05ee04cf, + 0x493bc857, 0x05e5ff40, 0x59325809, 0x812e59c0, + 0x05ec0461, 0x64c65a07, 0x64125812, 0x4a025813, + 0x000000ff, 0x0001fb2c, 0x05edf45b, 0x00108201, + 0x00108205, 0x00108205, 0x00108201, 0x00108201, + 0x00108201, 0x00108201, 0x00108201, 0x00108201, + 0x00108201, 0x00108201, 0x00108201, 0x00108201, + 0x00108202, 0x05bdffe5, 0x59325809, 0x64025a07, + 0x0001fb2c, 0x0005f0e7, 0x4933c857, 0x42000000, + 0x00109888, 0x0501ff56, 0x0501fb7f, 0x497a6205, + 0x602e8000, 0x0501f805, 0x641a6407, 0x641e6203, + 0x497a6006, 0x1c01f000, 0x4933c857, 0x4943c857, + 0x59300407, 0x90000587, 0x05020002, 0x1c01f000, + 0x05e5ffa7, 0x4df00000, 0x05f5ff60, 0x0500000a, + 0x59300809, 0x58040000, 0x80001540, 0x05000006, + 0x49780800, 0x4d2c0000, 0x400a5800, 0x0501f95a, + 0x5c025800, 0x05f5fd21, 0x90000c8e, 0x05be1fbf, + 0x0c01f001, 0x00108249, 0x0010824c, 0x00108237, + 0x00108258, 0x00108266, 0x00108237, 0x00108237, + 0x00108237, 0x00108237, 0x00108237, 0x00108237, + 0x00108237, 0x00108237, 0x00108237, 0x4d400000, + 0x59300021, 0x80000540, 0x05000004, 0x41400800, + 0x05c1ffeb, 0x40068000, 0x4d2c0000, 0x59325809, + 0x05f5ff3a, 0x0502093c, 0x4c5c0000, 0x5930b80a, + 0x05edfc09, 0x485e600a, 0x5c00b800, 0x5c025800, + 0x5c028000, 0x5c03e000, 0x05e40761, 0x1c01f000, + 0x598c000b, 0x81300580, 0x05020003, 0x05e9fa0d, + 0x05020012, 0x0201f800, 0x0010ba3e, 0x80c40040, + 0x05fc07e3, 0x05e5fe99, 0x0500000c, 0x05bdff8f, + 0x05f5fce0, 0x05020003, 0x05e9f9cd, 0x05020007, + 0x0201f800, 0x0010b8cb, 0x80c40040, 0x05fc07d8, + 0x05e5fe8e, 0x05be0f85, 0x59300203, 0x90000c8e, + 0x05be1f82, 0x0c01f7c4, 0x05c5f8ab, 0x05fdf7d0, + 0x4933c857, 0x4d440000, 0x4d340000, 0x59cc3800, + 0x821c3d00, 0x00ffffff, 0x59cc0007, 0x4c000000, + 0x59cc0001, 0x82000500, 0x00ffffff, 0x82000d80, + 0x00fffffe, 0x5c000000, 0x05020005, 0x801c0d80, + 0x05020045, 0x42000000, 0x00fffffe, 0x05e5f927, + 0x00000ac4, 0x05020040, 0x5930000a, 0x4c000000, + 0x8d0c0520, 0x05000011, 0x81342d80, 0x05000002, + 0x60102800, 0x58002403, 0x59340c03, 0x59341802, + 0x820c1d00, 0x00ffffff, 0x60143000, 0x59cc4008, + 0x59cc3809, 0x9c2041c0, 0x9c1c39c0, 0x611a8000, + 0x41301000, 0x0501f90e, 0x4936600a, 0x83440d80, + 0x000007fe, 0x0502000f, 0x60683000, 0x0501fd2e, + 0x42000000, 0x00109875, 0x0501fec5, 0x4d3c0000, + 0x4d400000, 0x60a68000, 0x602a7804, 0x0201f800, + 0x0010b5e0, 0x5c028000, 0x5c027800, 0x0501f00e, + 0x602c3000, 0x0501fd20, 0x42000000, 0x00109875, + 0x0501feb7, 0x4d3c0000, 0x4d400000, 0x60a68000, + 0x417a7800, 0x0201f800, 0x0010b660, 0x5c028000, + 0x5c027800, 0x5c000000, 0x4802600a, 0x59cc0007, + 0x83440d80, 0x000007fe, 0x05020005, 0x42000000, + 0x00fffffe, 0x4a026c00, 0x00000707, 0x48026802, + 0x80000580, 0x5c026800, 0x5c028800, 0x1c01f000, + 0x4933c857, 0x4c040000, 0x59a80073, 0xb00005b4, + 0x05020040, 0x59cc0a08, 0x82040480, 0x00000100, + 0x05001033, 0x59cc0c08, 0x82040500, 0x00008000, + 0x05000035, 0x59a80013, 0x80000540, 0x05020009, + 0x5930100a, 0x58080212, 0x82000500, 0x0000ff00, + 0x05000004, 0x82040500, 0x00000800, 0x0500002a, + 0x59cc0c09, 0x80040840, 0x05001024, 0x59a80a1b, + 0x8c040506, 0x05000004, 0x59cc0c0f, 0x8c04051e, + 0x05020012, 0x59cc0a17, 0x800409c0, 0x05020012, + 0x59cc0a18, 0x82040480, 0x00000100, 0x05001014, + 0x59cc0c18, 0x800409c0, 0x0502000e, 0x59cc0c19, + 0x80040840, 0x05001011, 0x59cc0c1a, 0x80040840, + 0x05001011, 0x0501f017, 0x4a02621c, 0x00000100, + 0x0501f012, 0x4a02621c, 0x00000300, 0x0501f00f, + 0x4a02621c, 0x00000500, 0x0501f00c, 0x4a02621c, + 0x00000700, 0x0501f009, 0x4a02621c, 0x00000900, + 0x0501f006, 0x4a02621c, 0x00000f00, 0x0501f003, + 0x4a02621c, 0x00002d00, 0x90000541, 0x0501f002, + 0x80000580, 0x5c000800, 0x1c01f000, 0x59cc0407, + 0x4803c857, 0x82000580, 0x00000800, 0x05000002, + 0x6402621c, 0x1c01f000, 0x4933c857, 0x4c580000, + 0x59cc000c, 0x59340802, 0x82040d00, 0x00ffffff, + 0x80040580, 0x0502000a, 0x91cc1408, 0x6008b000, + 0x91341c06, 0x05f1fd1a, 0x05020005, 0x91cc140a, + 0x6008b000, 0x91341c08, 0x05f1fd15, 0x5c00b000, + 0x1c01f000, 0x4933c857, 0x4c580000, 0x91cc140b, + 0x6008b000, 0x91341c06, 0x05f1fd0d, 0x05020008, + 0x91cc140d, 0x6008b000, 0x91341c08, 0x05f1fd08, + 0x05000014, 0x4933c856, 0x4933c856, 0x4933c857, + 0x59340009, 0x4803c857, 0x5934000e, 0x4803c857, + 0x59340008, 0x4803c857, 0x5934000d, 0x4803c857, + 0x59340007, 0x4803c857, 0x5934000c, 0x4803c857, + 0x59340006, 0x4803c857, 0x5934000b, 0x4803c857, + 0x5c00b000, 0x1c01f000, 0x4933c857, 0x813261c0, + 0x05000025, 0x83300d80, 0x0010cc6c, 0x05000022, + 0x8d3c0506, 0x05020020, 0x59300c07, 0x90040581, + 0x05000008, 0x90040582, 0x0502001b, 0x5930021f, + 0x90000581, 0x05020018, 0x59300c18, 0x0501f002, + 0x59300c03, 0x900405b9, 0x05000003, 0x900405b5, + 0x05020011, 0x4d300000, 0x4d1c0000, 0x59326020, + 0x4933c857, 0x05f9f990, 0x05bc0e84, 0x591c001e, + 0x497a381e, 0x591c0c16, 0x84040d02, 0x48063c16, + 0x5c023800, 0x5c026000, 0x81300580, 0x05be0e7b, + 0x497a6020, 0x1c01f000, 0x5c000000, 0x4c000000, + 0x4803c857, 0x4d3c0000, 0x60067800, 0x05d9fd98, + 0x5c027800, 0x4c580000, 0x6008b000, 0x91a81c02, + 0x91cc140b, 0x05f1fcbe, 0x5c00b000, 0x80000540, + 0x1c01f000, 0x492fc857, 0x4943c857, 0x59a8000c, + 0x812c0480, 0x0500100f, 0x59a8000a, 0x812c0480, + 0x0502100c, 0x592c0000, 0x80005d40, 0x05000007, + 0x497a5800, 0x49425a07, 0x4c2c0000, 0x0001fb2c, + 0x5c025800, 0x05fdf7f8, 0x49425a07, 0x0001f32c, + 0x1c01f000, 0x61fc21ff, 0x5930100a, 0x800811c0, + 0x05000002, 0x58082403, 0x41301000, 0x0501f008, + 0x40682800, 0x406c3000, 0x41781000, 0x41442000, + 0x0501f003, 0x41781000, 0x61fc21ff, 0x5c000000, + 0x4c000000, 0x4803c857, 0x480bc857, 0x4813c857, + 0x492fc857, 0x4943c857, 0x4d2c0000, 0x4c040000, + 0x4c080000, 0x4c0c0000, 0x4c100000, 0x4c140000, + 0x4c180000, 0x4c1c0000, 0x4c200000, 0x05c1f9b9, + 0x05bc0e36, 0x5c004000, 0x5c003800, 0x5c003000, + 0x5c002800, 0x5c002000, 0x5c001800, 0x5c001000, + 0x5c000800, 0x4a025805, 0x0000010d, 0x800811c0, + 0x05000019, 0x914005a9, 0x05020013, 0x90180582, + 0x05000009, 0x90180583, 0x05000007, 0x90180588, + 0x05000005, 0x90180586, 0x05000006, 0x90180589, + 0x05020009, 0x4a02580a, 0xffffffff, 0x0501f007, + 0x5808280a, 0x58140002, 0x82000500, 0x00ffffff, + 0x48025813, 0x480a580a, 0x58080202, 0x48025c14, 0x0501f005, 0x4a02580a, 0xffffffff, 0x4a025c14, 0x0000ffff, 0xb1400586, 0x05000002, 0x41782800, 0x480e580d, 0x4806580e, 0x4822580f, 0x481e5810, 0x48165a08, 0x481a5c09, 0x49425a09, 0x48125a07, 0x82100580, 0x0000ffff, 0x0500000c, 0x4d440000, - 0x4d340000, 0x40128800, 0x0001fac4, 0x05be0eb3, + 0x4d340000, 0x40128800, 0x0001fac4, 0x05be0dfb, 0x59340002, 0x82000500, 0x00ffffff, 0x48025813, 0x5c026800, 0x5c028800, 0x497a5800, 0x497a5c05, - 0x0501fb17, 0x5c025800, 0x1c01f000, 0x5c000000, + 0x0501fb29, 0x5c025800, 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, 0x480bc857, 0x480fc857, 0x4813c857, 0x4817c857, 0x4d2c0000, 0x4c080000, - 0x4c0c0000, 0x4c100000, 0x4c140000, 0x05c1fa1d, - 0x05bc0e9a, 0x5c002800, 0x5c002000, 0x5c001800, + 0x4c0c0000, 0x4c100000, 0x4c140000, 0x05c1f965, + 0x05bc0de2, 0x5c002800, 0x5c002000, 0x5c001800, 0x5c001000, 0x05011000, 0x912c0405, 0x4803c840, 0x6443c842, 0x40000000, 0x05fd17ff, 0x4a025805, 0x0000010d, 0x65265a09, 0x480a5a0b, 0x480e5c0b, 0x48125a0c, 0x48165c0c, 0x82080580, 0x00008014, 0x05020050, 0x820c0580, 0x0000ffff, 0x0502004d, - 0x90100586, 0x0502004b, 0x59a8000f, 0x05ddfd77, + 0x90100586, 0x0502004b, 0x59a8000f, 0x05ddfcf5, 0x05000009, 0x82000d00, 0x00ffff00, 0x05020006, - 0x82000c00, 0x00101a21, 0x50040800, 0x80040910, + 0x82000c00, 0x00101a23, 0x50040800, 0x80040910, 0x48065a0d, 0x82000d00, 0x0000ffff, 0x48065c0d, 0x80000120, 0x48025a0e, 0x59a8021b, 0x82001500, 0x00002100, 0x480a5a0f, 0x8c000502, 0x05000016, @@ -8454,7 +8500,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x05000006, 0x90000d22, 0x90040da2, 0x05020003, 0x640e5c0e, 0x0501f011, 0x8c000508, 0x05000006, 0x90000d12, 0x90040d92, 0x05020003, 0x640a5c0e, - 0x0501f00a, 0x05ddfd4d, 0x05020003, 0x64125c0e, + 0x0501f00a, 0x05ddfccb, 0x05020003, 0x64125c0e, 0x0501f006, 0x8c000506, 0x05000003, 0x64165c0e, 0x0501f002, 0x64025c0e, 0x59a8002a, 0x48025c0f, 0x59a8002b, 0x48025a10, 0x59c40801, 0x82040d00, @@ -8462,7 +8508,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x0501f00c, 0x82040580, 0x00008000, 0x05020003, 0x64065c10, 0x0501f007, 0x82040580, 0x00010000, 0x05020003, 0x640e5c10, 0x0501f002, 0x64125c10, - 0x0501faa3, 0x5c025800, 0x1c01f000, 0x0501f805, + 0x0501fab5, 0x5c025800, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, 0x5930080a, 0x800409c0, 0x05000004, 0x58040403, 0x81440580, 0x1c01f000, 0x90000541, 0x05fdf7fe, @@ -8474,12 +8520,12 @@ static const uint32_t isp_2500_risc_code[] = { 0x80000040, 0x0005f87c, 0x5c000800, 0x1c01f000, 0x4933c857, 0x40000000, 0x40000000, 0x1c01f000, 0x59300416, 0x4933c857, 0x4803c857, 0x8c000518, - 0x05000006, 0x8c000512, 0x05f606c1, 0x0501f8ee, + 0x05000006, 0x8c000512, 0x05f6069f, 0x0501f8ee, 0x0005f853, 0x0005f8e7, 0x1c01f000, 0x591c0407, 0x4803c857, 0x90000c89, 0x0502100b, 0x0c01f001, - 0x001083f5, 0x001083f5, 0x001083f5, 0x001083f7, - 0x001083f5, 0x001083f7, 0x001083f7, 0x001083f5, - 0x001083f7, 0x80000580, 0x1c01f000, 0x90000541, + 0x001084ad, 0x001084ad, 0x001084ad, 0x001084af, + 0x001084ad, 0x001084af, 0x001084af, 0x001084ad, + 0x001084af, 0x80000580, 0x1c01f000, 0x90000541, 0x1c01f000, 0x591c0407, 0x9000051f, 0x90000586, 0x0500000a, 0x4803c857, 0x64ee6403, 0x6426641c, 0x4a02621c, 0x00002a00, 0x64066203, 0x42000800, @@ -8487,40 +8533,40 @@ static const uint32_t isp_2500_risc_code[] = { 0x4c140000, 0x4d300000, 0x411e6000, 0x0501f8c6, 0x497a6205, 0x59300416, 0x4803c857, 0x82000500, 0xffffadff, 0x48026416, 0x497a6405, 0x5c026000, - 0x05c1f954, 0x05bc0dd1, 0x5c002800, 0x5c000800, + 0x05c1f89c, 0x05bc0d19, 0x5c002800, 0x5c000800, 0x4a025805, 0x0000010d, 0x497a5800, 0x497a5c05, 0x65165a09, 0x491e580a, 0x59300402, 0x48025c08, 0x5930041b, 0x48025c0c, 0x591c0416, 0x84000556, 0x48023c16, 0x591c180a, 0x580c0403, 0x48025a07, 0x580c0002, 0x82000500, 0x00ffffff, 0x48025813, 0x59cc0404, 0x48025c14, 0x497a5a08, 0x4816580b, - 0x48065a0c, 0x0501fa22, 0x493a6403, 0x4d400000, + 0x48065a0c, 0x0501fa34, 0x493a6403, 0x4d400000, 0x61168000, 0x591c0202, 0x4c000000, 0x4d300000, - 0x411e6000, 0x05fdfd28, 0x5c026000, 0x5c000000, + 0x411e6000, 0x05fdfd21, 0x5c026000, 0x5c000000, 0x48023a02, 0x5c028000, 0x491e6020, 0x4932381e, 0x641a3c07, 0x641e3a03, 0x497a3806, 0x497a3a05, 0x1c01f000, 0x4933c857, 0x91380593, 0x0502000a, 0x59300403, 0x4803c857, 0x82000d80, 0x00000085, 0x05000020, 0x82000d80, 0x0000008b, 0x0500001d, - 0x05bdfd96, 0x913805a7, 0x0502000a, 0x05e5fc4a, + 0x05bdfcde, 0x913805a7, 0x0502000a, 0x05e5fc1e, 0x4d2c0000, 0x4d400000, 0x59325809, 0x60128000, - 0x05fdfe74, 0x5c028000, 0x5c025800, 0x1c01f000, + 0x05fdfe6d, 0x5c028000, 0x5c025800, 0x1c01f000, 0x91380594, 0x05fc07f6, 0x83380580, 0x00000089, - 0x05000004, 0x83380580, 0x0000008a, 0x05ee01d7, - 0x05e9f815, 0x05ee01d5, 0x59300a03, 0x9004058a, - 0x05000006, 0x9004058c, 0x05000004, 0x05bdfd7b, + 0x05000004, 0x83380580, 0x0000008a, 0x05ee019b, + 0x05e5ffe9, 0x05ee0199, 0x59300a03, 0x9004058a, + 0x05000006, 0x9004058c, 0x05000004, 0x05bdfcc3, 0x642a6203, 0x1c01f000, 0x83380480, 0x00000093, 0x0502100b, 0x83380480, 0x00000085, 0x05001008, 0x83380580, 0x00000089, 0x05000008, 0x83380580, - 0x0000008a, 0x0500001a, 0x05bdfd6c, 0x493bc857, - 0x4933c857, 0x05edf1bd, 0x4933c857, 0x4c340000, - 0x41306800, 0x05edf986, 0x0500000d, 0x64066203, + 0x0000008a, 0x0500001a, 0x05bdfcb4, 0x493bc857, + 0x4933c857, 0x05edf181, 0x4933c857, 0x4c340000, + 0x41306800, 0x05edf94a, 0x0500000d, 0x64066203, 0x647a6403, 0x59cc0c07, 0x4806641b, 0x59cc0a07, 0x4806621b, 0x5834080a, 0x4806600a, 0x64126407, 0x42000800, 0x80000040, 0x0005f87c, 0x40366000, 0x0005f8e7, 0x5c006800, 0x1c01f000, 0x4933c857, 0x0005f0e7, 0x5930080a, 0x58040200, 0x8c00051a, - 0x05be0e0c, 0x1c01f000, 0x05d9feff, 0x05000019, + 0x05be0d54, 0x1c01f000, 0x05d9fe5a, 0x05000019, 0x640a6203, 0x59300416, 0x84000558, 0x48026416, 0x8c000512, 0x05000004, 0x59a8002c, 0x48026205, 0x0501f006, 0x59a8082c, 0x59a8002a, 0x80040400, @@ -8541,14 +8587,14 @@ static const uint32_t isp_2500_risc_code[] = { 0x497a6000, 0x5c006800, 0x1c01f000, 0x59300c07, 0x90040585, 0x05fc07fc, 0x90040591, 0x05fc07fa, 0x90040586, 0x05fc07f8, 0x90040581, 0x05fc07f6, - 0x05bdfcfa, 0x4933c857, 0x4c080000, 0x4c0c0000, + 0x05bdfc42, 0x4933c857, 0x4c080000, 0x4c0c0000, 0x4c580000, 0x59a81018, 0x59cc1807, 0x820c1d00, 0x00ffffff, 0x800c0110, 0x80083580, 0x0502000c, 0x91cc1408, 0x6008b000, 0x5930000a, 0x90001c06, - 0x05f1fab1, 0x05020006, 0x91cc140a, 0x6008b000, - 0x5930000a, 0x90001c08, 0x05f1faab, 0x5c00b000, + 0x05f1fa83, 0x05020006, 0x91cc140a, 0x6008b000, + 0x5930000a, 0x90001c08, 0x05f1fa7d, 0x5c00b000, 0x5c001800, 0x5c001000, 0x1c01f000, 0x4933c856, - 0x493a6403, 0x05d9f978, 0x0201f000, 0x0010b83b, + 0x493a6403, 0x05d9f8cc, 0x0201f000, 0x0010b84b, 0x4933c857, 0x492fc857, 0x5930080a, 0x58040200, 0x8c00051e, 0x05000004, 0x592c0209, 0x84000558, 0x48025a09, 0x1c01f000, 0x59e0180f, 0x599c0413, @@ -8558,353 +8604,358 @@ static const uint32_t isp_2500_risc_code[] = { 0x599c1015, 0x800c00cc, 0x80040c00, 0x90081440, 0x5c001800, 0x90000541, 0x4803c857, 0x1c01f000, 0x59300203, 0x4933c857, 0x4937c857, 0x493bc857, - 0x4803c857, 0x9000348e, 0x05be1cb4, 0x0c01f001, - 0x00108542, 0x0010861d, 0x00108542, 0x00108542, - 0x00108542, 0x00108542, 0x00108542, 0x001085a5, - 0x00108543, 0x00108542, 0x00108542, 0x00108542, - 0x00108542, 0x00108542, 0x05bdfca4, 0xb138058c, - 0x05be0ca2, 0x05d9fe6a, 0x0502001d, 0x59a80a1b, + 0x4803c857, 0x9000348e, 0x05be1bfc, 0x0c01f001, + 0x001085fa, 0x001086d8, 0x001085fa, 0x001085fa, + 0x001085fa, 0x001085fa, 0x001085fa, 0x0010865f, + 0x001085fb, 0x001085fa, 0x001085fa, 0x001085fa, + 0x001085fa, 0x001085fa, 0x05bdfbec, 0xb138058c, + 0x05be0bea, 0x05d9fdc5, 0x0502001d, 0x59a80a1b, 0x90040509, 0x90000588, 0x05000019, 0x8c040512, 0x05000029, 0x59cc0806, 0x82040d00, 0xff000000, 0x82040580, 0x03000000, 0x0500001d, 0x82040580, 0x50000000, 0x05000004, 0x82040580, 0x52000000, - 0x000600e7, 0x813669c0, 0x05000007, 0x497a6020, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010b652, + 0x000600e7, 0x83340580, 0x0010993e, 0x05000006, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010b660, 0x5c027800, 0x64066403, 0x0501f010, 0x59cc0806, 0x82040d00, 0xff000000, 0x82040580, 0x03000000, 0x05000007, 0x82040580, 0x50000000, 0x05000004, 0x82040580, 0x52000000, 0x000600e7, 0x64266403, 0x6426641c, 0x6402621c, 0x64126407, 0x64066203, - 0x05e5f2c4, 0x8d0c0520, 0x0500001e, 0x59cc0806, - 0x4807c857, 0x82040d00, 0xff000000, 0x82040580, - 0x03000000, 0x05000013, 0x82040580, 0x20000000, - 0x05000010, 0x82040580, 0x21000000, 0x0500000d, - 0x82040580, 0x24000000, 0x0500000a, 0x82040580, - 0x50000000, 0x05000007, 0x82040580, 0x52000000, - 0x05000004, 0x82040580, 0x05000000, 0x05020007, - 0x9c0431c0, 0x611a8000, 0x60042800, 0x05fdfd4d, - 0x0501f8ca, 0x05bc0c51, 0x61442000, 0x05edf94a, - 0x59cc0000, 0x82000500, 0x00ffffff, 0x82000580, - 0x00ffffff, 0x05000004, 0x641e6203, 0x493a6403, - 0x1c01f000, 0x59325819, 0x812e59c0, 0x05be0fde, - 0x0005f0e7, 0x4d2c0000, 0x4c580000, 0x4c500000, - 0x4c540000, 0x41385000, 0xb1380594, 0x05be0c3b, - 0x59325809, 0x592c0c0c, 0x82040d00, 0x0000e000, - 0x82040580, 0x00002000, 0x05020058, 0x59300819, - 0x800409c0, 0x05000010, 0x58041405, 0x41cca800, - 0x9004a406, 0x90080490, 0x05021004, 0x4008b000, - 0x0501fba3, 0x0501f008, 0x40001000, 0x603cb000, - 0x0501fb9f, 0x58040801, 0x800409c0, 0x05fe07f5, - 0x05bdfc22, 0x813669c0, 0x05000044, 0x59344c00, - 0x592c0c0a, 0x4807c857, 0x4827c857, 0x82040d00, - 0x000000ff, 0x90040583, 0x0500001d, 0x90040585, - 0x05000021, 0x900405a0, 0x05000024, 0xb0040592, - 0x0500002e, 0xb0040590, 0x0500002e, 0x900405a1, - 0x05000003, 0x900405a4, 0x05020030, 0x82240500, - 0x0000ff00, 0x82000580, 0x00000700, 0x05000005, - 0x60240800, 0x05d9fb29, 0x60305000, 0x0501f027, - 0x64c65a07, 0x6426580e, 0x59340400, 0x4802580f, - 0x0001fb2c, 0x05e9ffec, 0x0501f02e, 0x05d9f913, - 0x05d9fbd9, 0x600c0800, 0x05d9fb1c, 0x60205000, - 0x0501f01a, 0x59cc0007, 0x05e1feff, 0x05020017, - 0x05d9f90a, 0x0501f015, 0x82240500, 0x0000ff00, - 0x82000580, 0x00000700, 0x05fc07ea, 0x82240500, - 0x000000ff, 0x90000589, 0x05fc07e6, 0x05d9fc1d, - 0x60285000, 0x0501f009, 0x60385000, 0x0501f002, - 0x60405000, 0x82240500, 0x0000ff00, 0x82000580, - 0x00000700, 0x05fc07db, 0x482a6403, 0x64066203, - 0x592c000e, 0x48026013, 0x497a6015, 0x59a8002b, - 0x48026006, 0x417a7800, 0x05e5fa26, 0x59325819, - 0x812e59c0, 0x05000003, 0x05bdff6b, 0x497a6019, - 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x5c025800, - 0x1c01f000, 0x4d2c0000, 0x59325809, 0x91380593, - 0x0502001c, 0x492fc857, 0x59300c03, 0xb0040594, - 0x05000014, 0x90040590, 0x0500000f, 0x9004058e, - 0x0500000d, 0x90040588, 0x05000008, 0x9004058c, - 0x05000006, 0x9004058a, 0x05be0bb8, 0x60180800, - 0x05d9fada, 0x0501f007, 0x60100800, 0x05d9fad7, - 0x0501f004, 0x59340200, 0x8400051a, 0x48026a00, - 0x64025a07, 0x0001fb2c, 0x0005f8e7, 0x0501f016, - 0x913805a7, 0x05000009, 0x91380594, 0x05be0ba7, - 0x492fc857, 0x05e5fa5c, 0x60c68000, 0x60100800, - 0x61fc1001, 0x0501f006, 0x492fc857, 0x05e5fa56, - 0x60c68000, 0x60100800, 0x60401000, 0x49425a07, - 0x4806580e, 0x480a580f, 0x0001fb2c, 0x05d9ffdc, - 0x05e9ff85, 0x5c025800, 0x1c01f000, 0x492fc857, - 0x42007000, 0x00020a09, 0x58380806, 0x492c7006, - 0x800409c0, 0x05020003, 0x492c7007, 0x0001f02b, - 0x492c0800, 0x1c01f000, 0x4d2c0000, 0x4c580000, - 0x4c500000, 0x4c540000, 0x4933c857, 0x4937c857, - 0x59cc0806, 0x4807c857, 0x82040d00, 0xff000000, - 0x82040580, 0x03000000, 0x0500000d, 0x82040580, - 0x05000000, 0x0500000a, 0x82040580, 0x21000000, - 0x05000027, 0x82040580, 0x24000000, 0x05000024, - 0x82040580, 0x20000000, 0x05020025, 0x05bdfef1, - 0x05000023, 0x492fc857, 0x492e6019, 0x59a8b073, - 0x9058b41b, 0x8258b500, 0xfffffffc, 0x8058b104, - 0x485a5c05, 0x412c7800, 0x41cca000, 0x90580490, - 0x05021004, 0x912cac06, 0x0501fad9, 0x0501f010, - 0x40580800, 0x603cb000, 0x912cac06, 0x0501fad4, - 0x9004b48f, 0x05bdfedb, 0x05000004, 0x492c7801, - 0x412c7800, 0x05fdf7f2, 0x59325819, 0x05bdfeee, - 0x497a6019, 0x80000580, 0x0501f005, 0x59340200, - 0x84000554, 0x48026a00, 0x90000541, 0x5c00a800, + 0x05e5f298, 0x8d0c0520, 0x05000020, 0x0501fc5b, + 0x0502001e, 0x59cc0806, 0x4807c857, 0x82040d00, + 0xff000000, 0x82040580, 0x03000000, 0x05000013, + 0x82040580, 0x20000000, 0x05000010, 0x82040580, + 0x21000000, 0x0500000d, 0x82040580, 0x24000000, + 0x0500000a, 0x82040580, 0x50000000, 0x05000007, + 0x82040580, 0x52000000, 0x05000004, 0x82040580, + 0x05000000, 0x05020007, 0x9c0431c0, 0x611a8000, + 0x60042800, 0x05fdfd44, 0x0501f8da, 0x05bc0b97, + 0x61442000, 0x05edf90c, 0x59cc0000, 0x82000500, + 0x00ffffff, 0x82000580, 0x00ffffff, 0x05000004, + 0x641e6203, 0x493a6403, 0x1c01f000, 0x59325819, + 0x812e59c0, 0x05be0f24, 0x0005f0e7, 0x4d2c0000, + 0x4c580000, 0x4c500000, 0x4c540000, 0x41385000, + 0xb1380594, 0x05be0b81, 0x59325809, 0x592c0c0c, + 0x82040d00, 0x0000e000, 0x82040580, 0x00002000, + 0x05020059, 0x59300819, 0x800409c0, 0x05000010, + 0x58041405, 0x41cca800, 0x9004a406, 0x90080490, + 0x05021004, 0x4008b000, 0x0501fbb3, 0x0501f008, + 0x40001000, 0x603cb000, 0x0501fbaf, 0x58040801, + 0x800409c0, 0x05fe07f5, 0x05bdfb68, 0x83340580, + 0x0010993e, 0x05000044, 0x59344c00, 0x592c0c0a, + 0x4807c857, 0x4827c857, 0x82040d00, 0x000000ff, + 0x90040583, 0x0500001d, 0x90040585, 0x05000020, + 0x900405a0, 0x05000024, 0xb0040592, 0x0500002e, + 0xb0040590, 0x0500002e, 0x900405a1, 0x05000003, + 0x900405a4, 0x05020030, 0x82240500, 0x0000ff00, + 0x82000580, 0x00000700, 0x05000005, 0x60240800, + 0x05d9fa7a, 0x60305000, 0x0501f027, 0x64c65a07, + 0x6426580e, 0x59340400, 0x4802580f, 0x0001fb2c, + 0x05e9ffa9, 0x0501f02e, 0x05d9fb2e, 0x600c0800, + 0x05d9fa6e, 0x60205000, 0x0501f01b, 0x59cc0007, + 0x05e1fe9e, 0x05020018, 0x4a026c00, 0x00000707, + 0x0501f015, 0x82240500, 0x0000ff00, 0x82000580, + 0x00000700, 0x05fc07ea, 0x82240500, 0x000000ff, + 0x90000589, 0x05fc07e6, 0x05d9fb75, 0x60285000, + 0x0501f009, 0x60385000, 0x0501f002, 0x60405000, + 0x82240500, 0x0000ff00, 0x82000580, 0x00000700, + 0x05fc07db, 0x482a6403, 0x64066203, 0x592c000e, + 0x48026013, 0x497a6015, 0x59a8002b, 0x48026006, + 0x417a7800, 0x05e5f9f7, 0x59325819, 0x812e59c0, + 0x05000003, 0x05bdfeb0, 0x497a6019, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x492fc857, 0x4d2c0000, 0x59300a03, - 0x90040587, 0x0500002c, 0x90040581, 0x05be0b3f, - 0x05e5fa8b, 0x4df00000, 0x598c000b, 0x81300580, - 0x05020014, 0x59300004, 0x8c000520, 0x05000004, - 0x84000520, 0x48026004, 0x0501f014, 0x42001000, - 0x00109730, 0x50081000, 0x58080002, 0x82000580, - 0x00000100, 0x05000005, 0x5808000b, 0x81300580, - 0x05be0b2a, 0x0501f009, 0x05e5fd12, 0x05020019, - 0x59300004, 0x8c000520, 0x05000004, 0x84000520, - 0x48026004, 0x0501f004, 0x0201f800, 0x0010ba2e, - 0x80c40040, 0x5c03e000, 0x05e40a55, 0x05f5fa19, - 0x05bc0b1a, 0x59325809, 0x64165a07, 0x0001fb2c, - 0x05d9ff5b, 0x59325819, 0x812e59c0, 0x05be0eae, - 0x05e9ff01, 0x80000580, 0x5c025800, 0x1c01f000, - 0x5c03e000, 0x05e40a46, 0x59300c07, 0x90040591, - 0x05fc07c7, 0x05fdf7f9, 0x4c040000, 0x59340200, - 0x4803c857, 0x8c00051c, 0x05000009, 0x59cc0805, - 0x591c001b, 0x4803c857, 0x80040580, 0x05000004, - 0x80000580, 0x4803c856, 0x0501f002, 0x90000541, - 0x5c000800, 0x1c01f000, 0x4c000000, 0x4c0c0000, - 0x4c100000, 0x61fc19ff, 0x60102000, 0x0501f010, - 0x4c000000, 0x4c0c0000, 0x4c100000, 0x5930200a, - 0x58101c03, 0x60102000, 0x0501f009, 0x4c000000, - 0x4c0c0000, 0x4c100000, 0x5930200a, 0x801021c0, - 0x05bc0ae6, 0x58101c03, 0x601c2000, 0x480fc857, - 0x4813c857, 0x481bc857, 0x05d1ff24, 0x5c002000, - 0x5c001800, 0x5c000000, 0x1c01f000, 0x8d0c0520, - 0x05000006, 0x4d400000, 0x850e1d44, 0x60aa8000, - 0x05fdfbdc, 0x5c028000, 0x1c01f000, 0x59a8021b, - 0x8c000508, 0x05000005, 0x599c0017, 0x8c00050a, - 0x05020002, 0x1c01f000, 0x90000541, 0x1c01f000, - 0x59300422, 0x84000540, 0x48026422, 0x1c01f000, - 0x4c640000, 0x05f5fd15, 0x59300203, 0x90000588, - 0x05020010, 0x60c8c800, 0x42000000, 0x20000000, - 0x41300800, 0x05c1f947, 0x0500000a, 0x59300203, - 0x90000588, 0x05020007, 0x60780000, 0x80000040, - 0x05fe07ff, 0x8064c840, 0x05fe07f4, 0x05bdfab3, - 0x05f5fd0d, 0x5c00c800, 0x1c01f000, 0x05bdfe31, - 0x05bc0aae, 0x59340403, 0x49365803, 0x65565a05, - 0x48025c07, 0x4a025c08, 0x00001000, 0x59340802, - 0x82040d00, 0x00ffffff, 0x59300403, 0x82000580, - 0x00000086, 0x42000000, 0x85000000, 0x05020003, - 0x42000000, 0x84000000, 0x80040540, 0x4802580a, - 0x59a8000f, 0x4802580b, 0x42000000, 0x00990000, - 0x59300c07, 0x90040d85, 0x05000002, 0x8400052e, - 0x4802580c, 0x497a580d, 0x59cc0004, 0x4802580e, - 0x497a580f, 0x42000800, 0x00030300, 0x59300403, - 0x82000580, 0x00000086, 0x05020006, 0x59cc0004, - 0x48025811, 0x4a025812, 0x0000ffff, 0x41780800, - 0x48065810, 0x1c01f000, 0x492fc857, 0x59a82863, - 0x801429c0, 0x05000057, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x4d2c0000, 0x4d300000, 0x42026000, - 0x0010cc38, 0x592c0c07, 0x592c100a, 0x82081500, - 0x00ffffff, 0x592c180b, 0x592c200e, 0x40165800, - 0x4014c000, 0x4014c800, 0x592c0205, 0x82000580, - 0x00000155, 0x05020037, 0x592c0407, 0x80040580, - 0x05020034, 0x592c000a, 0x82000500, 0x00ffffff, - 0x80080580, 0x0502002f, 0x592c000b, 0x82000500, - 0x00ffffff, 0x800c0580, 0x0502002a, 0x592c000e, - 0x80100580, 0x05020027, 0x4c040000, 0x4c080000, - 0x4c0c0000, 0x4c100000, 0x40640000, 0x812c0580, - 0x05020016, 0x59300203, 0x90000580, 0x0500000f, - 0x59300009, 0x800001c0, 0x0500000c, 0x05e5f998, - 0x4df00000, 0x05e5f8aa, 0x0201f800, 0x0010b998, - 0x80c40040, 0x05020002, 0x64026203, 0x5c03e000, - 0x05e4097b, 0x497a6009, 0x592cc800, 0x4064c000, - 0x4064b800, 0x0501f003, 0x592cb800, 0x485cc000, - 0x64165a07, 0x0001fb2c, 0x405e5800, 0x5c002000, - 0x5c001800, 0x5c001000, 0x5c000800, 0x0501f003, - 0x412cc000, 0x592e5800, 0x812e59c0, 0x05fe07c3, - 0x48675063, 0x48635064, 0x05e9fda2, 0x5c026000, - 0x5c025800, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x1c01f000, 0x602c0800, 0x0501f004, 0x60100800, - 0x0501f002, 0x60040800, 0x4d2c0000, 0x59325809, - 0x812e59c0, 0x0500000f, 0x592c0205, 0x82000500, - 0x000000ff, 0x9000058e, 0x0502000a, 0x592c0000, - 0x48026009, 0x497a5800, 0x48065a09, 0x05e1f873, - 0x05000003, 0x05fdfe7e, 0x0501f002, 0x0001fb2c, - 0x5c025800, 0x1c01f000, 0x4817c857, 0x4c000000, - 0x4c040000, 0x8c14052a, 0x05000004, 0x5988011e, - 0x80000000, 0x4803111e, 0x8c14052e, 0x05000004, - 0x5988011f, 0x80000000, 0x4803111f, 0x8c14052c, - 0x05000013, 0x40140000, 0x82000500, 0x00070000, - 0x82000d80, 0x00030000, 0x0500000d, 0x82000d80, - 0x00040000, 0x0500000a, 0x82000d80, 0x00050000, - 0x05000007, 0x59880005, 0x80000000, 0x48031005, - 0x59880120, 0x80000000, 0x48031120, 0x5c000800, - 0x5c000000, 0x1c01f000, 0x4817c857, 0x4c000000, - 0x4c040000, 0x8c14052a, 0x05000004, 0x59880121, - 0x80000000, 0x48031121, 0x8c14052e, 0x05000004, - 0x59880122, 0x80000000, 0x48031122, 0x8c14052c, - 0x05000013, 0x40140000, 0x82000500, 0x00070000, - 0x82000d80, 0x00030000, 0x0500000d, 0x82000d80, - 0x00040000, 0x0500000a, 0x82000d80, 0x00050000, - 0x05000007, 0x59880005, 0x80000000, 0x48031005, - 0x59880123, 0x80000000, 0x48031123, 0x5c000800, + 0x4d2c0000, 0x59325809, 0x91380593, 0x0502002b, + 0x492fc857, 0x59300c03, 0xb0040594, 0x05000023, + 0x90040590, 0x0500001e, 0x9004058e, 0x0500001c, + 0x59341400, 0x82081d00, 0x0000ff00, 0x82081500, + 0x000000ff, 0x90040588, 0x0500000d, 0x9004058c, + 0x0500000d, 0x9004058a, 0x05be0af8, 0x820c0580, + 0x00000700, 0x05000011, 0x90080589, 0x0500000f, + 0x60180800, 0x05d9fa21, 0x0501f00c, 0x600c0000, + 0x0501f002, 0x60240000, 0x80080580, 0x05020007, + 0x60100800, 0x05d9fa19, 0x0501f004, 0x59340200, + 0x8400051a, 0x48026a00, 0x64025a07, 0x0001fb2c, + 0x0005f8e7, 0x0501f016, 0x913805a7, 0x05000009, + 0x91380594, 0x05be0add, 0x492fc857, 0x05e5fa1e, + 0x60c68000, 0x60100800, 0x61fc1001, 0x0501f006, + 0x492fc857, 0x05e5fa18, 0x60c68000, 0x60100800, + 0x60401000, 0x49425a07, 0x4806580e, 0x480a580f, + 0x0001fb2c, 0x05d9ff2a, 0x05e9ff33, 0x5c025800, + 0x1c01f000, 0x492fc857, 0x42007000, 0x00020a09, + 0x58380806, 0x492c7006, 0x800409c0, 0x05020003, + 0x492c7007, 0x0001f02b, 0x492c0800, 0x1c01f000, + 0x4d2c0000, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4933c857, 0x4937c857, 0x59cc0806, 0x4807c857, + 0x82040d00, 0xff000000, 0x82040580, 0x03000000, + 0x0500000d, 0x82040580, 0x05000000, 0x0500000a, + 0x82040580, 0x21000000, 0x05000027, 0x82040580, + 0x24000000, 0x05000024, 0x82040580, 0x20000000, + 0x05020025, 0x05bdfe27, 0x05000023, 0x492fc857, + 0x492e6019, 0x59a8b073, 0x9058b41b, 0x8258b500, + 0xfffffffc, 0x8058b104, 0x485a5c05, 0x412c7800, + 0x41cca000, 0x90580490, 0x05021004, 0x912cac06, + 0x0501fad9, 0x0501f010, 0x40580800, 0x603cb000, + 0x912cac06, 0x0501fad4, 0x9004b48f, 0x05bdfe11, + 0x05000004, 0x492c7801, 0x412c7800, 0x05fdf7f2, + 0x59325819, 0x05bdfe24, 0x497a6019, 0x80000580, + 0x0501f005, 0x59340200, 0x84000554, 0x48026a00, + 0x90000541, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x492fc857, + 0x4d2c0000, 0x59300a03, 0x90040587, 0x0500002c, + 0x90040581, 0x05be0a75, 0x05e5fa4d, 0x4df00000, + 0x598c000b, 0x81300580, 0x05020014, 0x59300004, + 0x8c000520, 0x05000004, 0x84000520, 0x48026004, + 0x0501f014, 0x42001000, 0x001097b0, 0x50081000, + 0x58080002, 0x82000580, 0x00000100, 0x05000005, + 0x5808000b, 0x81300580, 0x05be0a60, 0x0501f009, + 0x05e5fcd4, 0x05020019, 0x59300004, 0x8c000520, + 0x05000004, 0x84000520, 0x48026004, 0x0501f004, + 0x0201f800, 0x0010ba3e, 0x80c40040, 0x5c03e000, + 0x05e40a17, 0x05f5f9e5, 0x05bc0a50, 0x59325809, + 0x64165a07, 0x0001fb2c, 0x05d9fea9, 0x59325819, + 0x812e59c0, 0x05be0de4, 0x05e9feaf, 0x80000580, + 0x5c025800, 0x1c01f000, 0x5c03e000, 0x05e40a08, + 0x59300c07, 0x90040591, 0x05fc07c7, 0x05fdf7f9, + 0x4c040000, 0x59340200, 0x4803c857, 0x8c00051c, + 0x05000009, 0x59cc0805, 0x591c001b, 0x4803c857, + 0x80040580, 0x05000004, 0x80000580, 0x4803c856, + 0x0501f002, 0x90000541, 0x5c000800, 0x1c01f000, + 0x4c000000, 0x4c0c0000, 0x4c100000, 0x61fc19ff, + 0x60102000, 0x0501f010, 0x4c000000, 0x4c0c0000, + 0x4c100000, 0x5930200a, 0x58101c03, 0x60102000, + 0x0501f009, 0x4c000000, 0x4c0c0000, 0x4c100000, + 0x5930200a, 0x801021c0, 0x05bc0a1c, 0x58101c03, + 0x601c2000, 0x480fc857, 0x4813c857, 0x481bc857, + 0x05d1fe5e, 0x5c002000, 0x5c001800, 0x5c000000, + 0x1c01f000, 0x8d0c0520, 0x05000006, 0x4d400000, + 0x850e1d44, 0x60aa8000, 0x05fdfbc3, 0x5c028000, + 0x1c01f000, 0x59a8021b, 0x8c000508, 0x05000005, + 0x599c0017, 0x8c00050a, 0x05020002, 0x1c01f000, + 0x90000541, 0x1c01f000, 0x59300422, 0x84000540, + 0x48026422, 0x1c01f000, 0x4c640000, 0x05f5fce1, + 0x59300203, 0x90000588, 0x05020010, 0x60c8c800, + 0x42000000, 0x20000000, 0x41300800, 0x05c1f87b, + 0x0500000a, 0x59300203, 0x90000588, 0x05020007, + 0x60780000, 0x80000040, 0x05fe07ff, 0x8064c840, + 0x05fe07f4, 0x05bdf9e9, 0x05f5fcd9, 0x5c00c800, + 0x1c01f000, 0x05bdfd67, 0x05bc09e4, 0x59340403, + 0x49365803, 0x65565a05, 0x48025c07, 0x4a025c08, + 0x00001000, 0x59340802, 0x82040d00, 0x00ffffff, + 0x59300403, 0x82000580, 0x00000086, 0x42000000, + 0x85000000, 0x05020003, 0x42000000, 0x84000000, + 0x80040540, 0x4802580a, 0x59a8000f, 0x4802580b, + 0x42000000, 0x00990000, 0x59300c07, 0x90040d85, + 0x05000002, 0x8400052e, 0x4802580c, 0x497a580d, + 0x59cc0004, 0x4802580e, 0x497a580f, 0x42000800, + 0x00030300, 0x59300403, 0x82000580, 0x00000086, + 0x05020006, 0x59cc0004, 0x48025811, 0x4a025812, + 0x0000ffff, 0x41780800, 0x48065810, 0x1c01f000, + 0x492fc857, 0x59a82863, 0x801429c0, 0x05000057, + 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4d2c0000, + 0x4d300000, 0x42026000, 0x0010cc48, 0x592c0c07, + 0x592c100a, 0x82081500, 0x00ffffff, 0x592c180b, + 0x592c200e, 0x40165800, 0x4014c000, 0x4014c800, + 0x592c0205, 0x82000580, 0x00000155, 0x05020037, + 0x592c0407, 0x80040580, 0x05020034, 0x592c000a, + 0x82000500, 0x00ffffff, 0x80080580, 0x0502002f, + 0x592c000b, 0x82000500, 0x00ffffff, 0x800c0580, + 0x0502002a, 0x592c000e, 0x80100580, 0x05020027, + 0x4c040000, 0x4c080000, 0x4c0c0000, 0x4c100000, + 0x40640000, 0x812c0580, 0x05020016, 0x59300203, + 0x90000580, 0x0500000f, 0x59300009, 0x800001c0, + 0x0500000c, 0x05e5f95a, 0x4df00000, 0x05e5f86c, + 0x0201f800, 0x0010b9a8, 0x80c40040, 0x05020002, + 0x64026203, 0x5c03e000, 0x05e4093d, 0x497a6009, + 0x592cc800, 0x4064c000, 0x4064b800, 0x0501f003, + 0x592cb800, 0x485cc000, 0x64165a07, 0x0001fb2c, + 0x405e5800, 0x5c002000, 0x5c001800, 0x5c001000, + 0x5c000800, 0x0501f003, 0x412cc000, 0x592e5800, + 0x812e59c0, 0x05fe07c3, 0x48675063, 0x48635064, + 0x05e9fd50, 0x5c026000, 0x5c025800, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x602c0800, + 0x0501f004, 0x60100800, 0x0501f002, 0x60040800, + 0x4d2c0000, 0x59325809, 0x812e59c0, 0x0500000f, + 0x592c0205, 0x82000500, 0x000000ff, 0x9000058e, + 0x0502000a, 0x592c0000, 0x48026009, 0x497a5800, + 0x48065a09, 0x05ddfff2, 0x05000003, 0x05fdfe7e, + 0x0501f002, 0x0001fb2c, 0x5c025800, 0x1c01f000, + 0x4817c857, 0x4c000000, 0x4c040000, 0x8c14052a, + 0x05000004, 0x5988011e, 0x80000000, 0x4803111e, + 0x8c14052e, 0x05000004, 0x5988011f, 0x80000000, + 0x4803111f, 0x8c14052c, 0x05000013, 0x40140000, + 0x82000500, 0x00070000, 0x82000d80, 0x00030000, + 0x0500000d, 0x82000d80, 0x00040000, 0x0500000a, + 0x82000d80, 0x00050000, 0x05000007, 0x59880005, + 0x80000000, 0x48031005, 0x59880120, 0x80000000, + 0x48031120, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x4817c857, 0x4c000000, 0x4c040000, 0x8c14052a, + 0x05000004, 0x59880121, 0x80000000, 0x48031121, + 0x8c14052e, 0x05000004, 0x59880122, 0x80000000, + 0x48031122, 0x8c14052c, 0x05000013, 0x40140000, + 0x82000500, 0x00070000, 0x82000d80, 0x00030000, + 0x0500000d, 0x82000d80, 0x00040000, 0x0500000a, + 0x82000d80, 0x00050000, 0x05000007, 0x59880005, + 0x80000000, 0x48031005, 0x59880123, 0x80000000, + 0x48031123, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x4807c857, 0x4c000000, 0x8c04052c, 0x05000004, + 0x5988010c, 0x80000000, 0x4803110c, 0x8c04052a, + 0x05000004, 0x5988010d, 0x80000000, 0x4803110d, + 0x8c040528, 0x05000004, 0x5988010e, 0x80000000, + 0x4803110e, 0x8c040526, 0x05000004, 0x5988010f, + 0x80000000, 0x4803110f, 0x8c040524, 0x05000004, + 0x59880110, 0x80000000, 0x48031110, 0x8c040522, + 0x05000004, 0x59880111, 0x80000000, 0x48031111, + 0x8c040520, 0x05000004, 0x59880112, 0x80000000, + 0x48031112, 0x5c000000, 0x1c01f000, 0x4807c857, + 0x4c000000, 0x59880113, 0x80000000, 0x48031113, 0x5c000000, 0x1c01f000, 0x4807c857, 0x4c000000, - 0x8c04052c, 0x05000004, 0x5988010c, 0x80000000, - 0x4803110c, 0x8c04052a, 0x05000004, 0x5988010d, - 0x80000000, 0x4803110d, 0x8c040528, 0x05000004, - 0x5988010e, 0x80000000, 0x4803110e, 0x8c040526, - 0x05000004, 0x5988010f, 0x80000000, 0x4803110f, - 0x8c040524, 0x05000004, 0x59880110, 0x80000000, - 0x48031110, 0x8c040522, 0x05000004, 0x59880111, - 0x80000000, 0x48031111, 0x8c040520, 0x05000004, - 0x59880112, 0x80000000, 0x48031112, 0x5c000000, - 0x1c01f000, 0x4807c857, 0x4c000000, 0x59880113, - 0x80000000, 0x48031113, 0x5c000000, 0x1c01f000, - 0x4807c857, 0x4c000000, 0x8c04051c, 0x05000004, - 0x59880114, 0x80000000, 0x48031114, 0x8c04051a, - 0x05000004, 0x59880115, 0x80000000, 0x48031115, - 0x5c000000, 0x1c01f000, 0x4807c857, 0x4c000000, - 0x8c040518, 0x05000004, 0x59880116, 0x80000000, - 0x48031116, 0x8c040516, 0x05000004, 0x59880117, - 0x80000000, 0x48031117, 0x8c040514, 0x05000004, - 0x59880118, 0x80000000, 0x48031118, 0x5c000000, - 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040510, - 0x05000004, 0x59880119, 0x80000000, 0x48031119, - 0x8c04050c, 0x05000004, 0x5988011a, 0x80000000, - 0x4803111a, 0x5c000000, 0x1c01f000, 0x4807c857, - 0x4c000000, 0x8c040508, 0x05000004, 0x5988011b, - 0x80000000, 0x4803111b, 0x8c040504, 0x05000004, - 0x5988011c, 0x80000000, 0x4803111c, 0x5c000000, - 0x1c01f000, 0x4807c856, 0x4c000000, 0x598800e5, - 0x80000000, 0x480310e5, 0x5c000000, 0x1c01f000, - 0x40680000, 0x5c036000, 0x4db00000, 0x49b3c857, - 0x4c040000, 0x50000800, 0x80040800, 0x05001002, - 0x44040000, 0x5c000800, 0x1c01f000, 0x480fc857, - 0x4c000000, 0x900c0580, 0x05020004, 0x42000000, - 0x001097ba, 0x0501f012, 0x820c0580, 0x00001001, - 0x05020004, 0x42000000, 0x001097bb, 0x0501f00c, - 0x820c0580, 0x00001002, 0x05020004, 0x42000000, - 0x001097bc, 0x0501f006, 0x820c0c80, 0x0000201c, - 0x05be1932, 0x900c051f, 0x0c01f804, 0x05fdffde, - 0x5c000000, 0x1c01f000, 0x001088d6, 0x001088d9, - 0x001088dc, 0x001088df, 0x001088e2, 0x001088e5, - 0x001088e8, 0x001088eb, 0x001088ee, 0x001088f1, - 0x001088f4, 0x001088f7, 0x001088fa, 0x001088fd, - 0x00108900, 0x00108903, 0x00108906, 0x00108909, - 0x0010890c, 0x0010890f, 0x00108912, 0x00108915, - 0x00108918, 0x0010891b, 0x0010891e, 0x00108921, - 0x00108924, 0x00108927, 0x42000000, 0x001097bd, - 0x1c01f000, 0x42000000, 0x001097be, 0x1c01f000, - 0x42000000, 0x001097bf, 0x1c01f000, 0x42000000, - 0x001097c0, 0x1c01f000, 0x42000000, 0x001097c1, - 0x1c01f000, 0x42000000, 0x001097c2, 0x1c01f000, - 0x42000000, 0x001097c3, 0x1c01f000, 0x42000000, - 0x001097c4, 0x1c01f000, 0x42000000, 0x001097c5, - 0x1c01f000, 0x42000000, 0x001097c6, 0x1c01f000, - 0x42000000, 0x001097c7, 0x1c01f000, 0x42000000, - 0x001097c8, 0x1c01f000, 0x42000000, 0x001097c9, - 0x1c01f000, 0x42000000, 0x001097ca, 0x1c01f000, - 0x42000000, 0x001097cb, 0x1c01f000, 0x42000000, - 0x001097cc, 0x1c01f000, 0x42000000, 0x001097cd, - 0x1c01f000, 0x42000000, 0x001097ce, 0x1c01f000, - 0x42000000, 0x001097cf, 0x1c01f000, 0x42000000, - 0x001097d0, 0x1c01f000, 0x42000000, 0x001097d1, - 0x1c01f000, 0x42000000, 0x001097d2, 0x1c01f000, - 0x42000000, 0x001097d3, 0x1c01f000, 0x42000000, - 0x001097d4, 0x1c01f000, 0x42000000, 0x001097d5, - 0x1c01f000, 0x42000000, 0x001097d6, 0x1c01f000, - 0x42000000, 0x001097d7, 0x1c01f000, 0x42000000, - 0x001097d8, 0x1c01f000, 0x480fc857, 0x4c000000, - 0x900c0581, 0x05020004, 0x42000000, 0x0010973d, - 0x0501f00f, 0x900c0582, 0x05020004, 0x42000000, - 0x0010973e, 0x0501f00a, 0x900c0583, 0x05020004, - 0x42000000, 0x0010973f, 0x0501f005, 0x900c0584, - 0x05020004, 0x42000000, 0x00109740, 0x05fdff56, - 0x5c000000, 0x1c01f000, 0x4c000000, 0x59a8021b, - 0x4803c857, 0x8c000502, 0x05000010, 0x8c000506, - 0x05000004, 0x42000000, 0x00109748, 0x0501f011, - 0x8c00050a, 0x05000004, 0x42000000, 0x00109747, - 0x0501f00c, 0x8c000508, 0x05000004, 0x42000000, - 0x0010974a, 0x0501f007, 0x05d9ff88, 0x05000006, - 0x8c000506, 0x05020004, 0x42000000, 0x00109749, - 0x05fdff39, 0x5c000000, 0x1c01f000, 0x8058b1c0, - 0x05bc0886, 0x5450a800, 0x8050a000, 0x8054a800, - 0x8058b040, 0x05fe07fc, 0x1c01f000, 0x8058b1c0, - 0x05bc087e, 0x4450a800, 0x8054a800, 0x8058b040, - 0x05fe07fd, 0x1c01f000, 0x4813c857, 0x4817c857, - 0x40140000, 0x80100480, 0x05be1874, 0x497bc841, - 0x41787000, 0x42006800, 0x00140000, 0x59a80083, - 0x8c000500, 0x05000003, 0x42006800, 0x0013a000, - 0x4837c857, 0x8010048d, 0x05021005, 0x8014048d, - 0x05001003, 0x40147000, 0x80342840, 0x61fc7801, - 0x40100000, 0x80140480, 0x82006d00, 0xffffff00, - 0x05020002, 0x40007800, 0x4813c840, 0x483fc842, - 0x05011000, 0x40100000, 0x803c2400, 0x40100000, - 0x80140580, 0x05fe07f3, 0x45782800, 0x803871c0, - 0x05000005, 0x40382800, 0x41787000, 0x80102000, - 0x05fdf7eb, 0x1c01f000, 0x8058b1c0, 0x05bc084b, - 0x50500000, 0x9c0001c0, 0x4400a800, 0x8050a000, - 0x8054a800, 0x8058b040, 0x05fe07fa, 0x1c01f000, - 0x4c000000, 0x59a80007, 0x8c00051c, 0x5c000000, - 0x1c01f000, 0x0501f805, 0x60058800, 0x05020002, - 0x60018800, 0x1c01f000, 0x59a80007, 0x8c000518, - 0x1c01f000, 0x61906800, 0x80346840, 0x05000006, - 0x64070000, 0x40000000, 0x59807000, 0x8c380500, - 0x05fc07fa, 0x1c01f000, 0x640f0000, 0x40000000, - 0x59800000, 0x8c000500, 0x05fc07fc, 0x1c01f000, - 0x00000001, 0x00000002, 0x00000004, 0x00000008, - 0x00000010, 0x00000020, 0x00000040, 0x00000080, - 0x00000100, 0x00000200, 0x00000400, 0x00000800, - 0x00001000, 0x00002000, 0x00004000, 0x00008000, - 0x00010000, 0x00020000, 0x00040000, 0x00080000, - 0x00100000, 0x00200000, 0x00400000, 0x00800000, - 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, - 0x40000000, 0x600070e0, 0x60007820, 0x4a007016, - 0x00010001, 0x58380016, 0x8c000500, 0x05fc07fc, - 0x600c4000, 0x60003002, 0x64807808, 0x583c2808, - 0x8c14053e, 0x05000004, 0x80183040, 0x05fe07fc, - 0x0501f00d, 0x583c2808, 0x82140500, 0x20000400, - 0x82000580, 0x00000400, 0x05020005, 0x82140500, - 0x00000300, 0x90000580, 0x05000007, 0x80204040, - 0x05fe07ee, 0x4a007016, 0x00010000, 0x90000541, - 0x0501f040, 0x650c7808, 0x583c0009, 0x8c000500, - 0x05000005, 0x60002000, 0x4a007016, 0x00010000, - 0x0501f037, 0x65007808, 0x583c5809, 0x65047808, - 0x583c6009, 0x65087808, 0x583c6809, 0x4a007016, - 0x00010000, 0x82102d00, 0xf0000000, 0x90140580, - 0x05000002, 0x0501f020, 0x60202800, 0x60003000, - 0x803000c8, 0x40003800, 0x8030010a, 0x801c3d80, - 0x40300000, 0x80180580, 0x80100400, 0x801c0400, - 0x802c5c00, 0x803400c8, 0x40003800, 0x8034010a, - 0x801c3d80, 0x40340000, 0x80180580, 0x801c0400, - 0x80306400, 0x802c00c8, 0x40003800, 0x802c010a, - 0x801c3d80, 0x402c0000, 0x80180580, 0x801c0400, - 0x80346c00, 0x82183400, 0x9e3779b9, 0x80142840, - 0x05fe07e4, 0x0502000b, 0x402c0000, 0x80040580, - 0x05fe07c7, 0x40300000, 0x80080580, 0x05fe07c4, - 0x40340000, 0x800c0580, 0x05fe07c1, 0x80000580, - 0x1c01f000, 0x1c01f000, 0x42005000, 0x7ff4c000, - 0x58280800, 0x58281001, 0x58281802, 0x58282003, - 0x05fdff98, 0x05020807, 0x82101d00, 0x0fffffff, - 0x480fc021, 0x900c01c0, 0x4803c022, 0x1c01f000, - 0x497bc021, 0x497bc022, 0x4a03c020, 0x00004020, - 0x4a03c011, 0x40200011, 0x6016d800, 0x05027011, - 0x59e00020, 0x90000582, 0x0502000e, 0x05006000, - 0x4203e000, 0x40000000, 0x59e00017, 0x60000800, - 0x8c00050a, 0x05c20d22, 0x8d0c0530, 0x05c20d0e, - 0x05c20d10, 0x6403c017, 0x4203e000, 0x30000001, - 0x05bdf953, 0x05fdf7ff, 0x59a80886, 0x8c100502, - 0x05000003, 0x84040d42, 0x0501f007, 0x8c100504, - 0x05000003, 0x84040d44, 0x0501f003, 0x8c100500, - 0x84040d40, 0x48075086, 0x1c01f000, 0x59a80086, - 0x8c000502, 0x05000009, 0x4a035087, 0x0000008b, - 0x4a035088, 0x0000008b, 0x4a035089, 0x0000008b, - 0x6413508a, 0x0501f00c, 0x8c000504, 0x05000006, - 0x65bf5087, 0x65bf5088, 0x65df5089, 0x6403508a, - 0x0501f005, 0x64cf5087, 0x64cf5088, 0x64975089, - 0x6403508a, 0x1c01f000, 0x4024843a, - 0x00000000, 0x00000000, 0x0010d000, 0x00003c46, + 0x8c04051c, 0x05000004, 0x59880114, 0x80000000, + 0x48031114, 0x8c04051a, 0x05000004, 0x59880115, + 0x80000000, 0x48031115, 0x5c000000, 0x1c01f000, + 0x4807c857, 0x4c000000, 0x8c040518, 0x05000004, + 0x59880116, 0x80000000, 0x48031116, 0x8c040516, + 0x05000004, 0x59880117, 0x80000000, 0x48031117, + 0x8c040514, 0x05000004, 0x59880118, 0x80000000, + 0x48031118, 0x5c000000, 0x1c01f000, 0x4807c857, + 0x4c000000, 0x8c040510, 0x05000004, 0x59880119, + 0x80000000, 0x48031119, 0x8c04050c, 0x05000004, + 0x5988011a, 0x80000000, 0x4803111a, 0x5c000000, + 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040508, + 0x05000004, 0x5988011b, 0x80000000, 0x4803111b, + 0x8c040504, 0x05000004, 0x5988011c, 0x80000000, + 0x4803111c, 0x5c000000, 0x1c01f000, 0x4807c856, + 0x4c000000, 0x598800e5, 0x80000000, 0x480310e5, + 0x5c000000, 0x1c01f000, 0x40680000, 0x5c036000, + 0x4db00000, 0x49b3c857, 0x4c040000, 0x50000800, + 0x80040800, 0x05001002, 0x44040000, 0x5c000800, + 0x1c01f000, 0x480fc857, 0x4c000000, 0x900c0580, + 0x05020004, 0x42000000, 0x0010983a, 0x0501f012, + 0x820c0580, 0x00001001, 0x05020004, 0x42000000, + 0x0010983b, 0x0501f00c, 0x820c0580, 0x00001002, + 0x05020004, 0x42000000, 0x0010983c, 0x0501f006, + 0x820c0c80, 0x0000201c, 0x05be1868, 0x900c051f, + 0x0c01f804, 0x05fdffde, 0x5c000000, 0x1c01f000, + 0x001089a0, 0x001089a3, 0x001089a6, 0x001089a9, + 0x001089ac, 0x001089af, 0x001089b2, 0x001089b5, + 0x001089b8, 0x001089bb, 0x001089be, 0x001089c1, + 0x001089c4, 0x001089c7, 0x001089ca, 0x001089cd, + 0x001089d0, 0x001089d3, 0x001089d6, 0x001089d9, + 0x001089dc, 0x001089df, 0x001089e2, 0x001089e5, + 0x001089e8, 0x001089eb, 0x001089ee, 0x001089f1, + 0x42000000, 0x0010983d, 0x1c01f000, 0x42000000, + 0x0010983e, 0x1c01f000, 0x42000000, 0x0010983f, + 0x1c01f000, 0x42000000, 0x00109840, 0x1c01f000, + 0x42000000, 0x00109841, 0x1c01f000, 0x42000000, + 0x00109842, 0x1c01f000, 0x42000000, 0x00109843, + 0x1c01f000, 0x42000000, 0x00109844, 0x1c01f000, + 0x42000000, 0x00109845, 0x1c01f000, 0x42000000, + 0x00109846, 0x1c01f000, 0x42000000, 0x00109847, + 0x1c01f000, 0x42000000, 0x00109848, 0x1c01f000, + 0x42000000, 0x00109849, 0x1c01f000, 0x42000000, + 0x0010984a, 0x1c01f000, 0x42000000, 0x0010984b, + 0x1c01f000, 0x42000000, 0x0010984c, 0x1c01f000, + 0x42000000, 0x0010984d, 0x1c01f000, 0x42000000, + 0x0010984e, 0x1c01f000, 0x42000000, 0x0010984f, + 0x1c01f000, 0x42000000, 0x00109850, 0x1c01f000, + 0x42000000, 0x00109851, 0x1c01f000, 0x42000000, + 0x00109852, 0x1c01f000, 0x42000000, 0x00109853, + 0x1c01f000, 0x42000000, 0x00109854, 0x1c01f000, + 0x42000000, 0x00109855, 0x1c01f000, 0x42000000, + 0x00109856, 0x1c01f000, 0x42000000, 0x00109857, + 0x1c01f000, 0x42000000, 0x00109858, 0x1c01f000, + 0x480fc857, 0x4c000000, 0x900c0581, 0x05020004, + 0x42000000, 0x001097bd, 0x0501f00f, 0x900c0582, + 0x05020004, 0x42000000, 0x001097be, 0x0501f00a, + 0x900c0583, 0x05020004, 0x42000000, 0x001097bf, + 0x0501f005, 0x900c0584, 0x05020004, 0x42000000, + 0x001097c0, 0x05fdff56, 0x5c000000, 0x1c01f000, + 0x4c000000, 0x59a8021b, 0x4803c857, 0x8c000502, + 0x05000010, 0x8c000506, 0x05000004, 0x42000000, + 0x001097c8, 0x0501f011, 0x8c00050a, 0x05000004, + 0x42000000, 0x001097c7, 0x0501f00c, 0x8c000508, + 0x05000004, 0x42000000, 0x001097ca, 0x0501f007, + 0x05d9fef4, 0x05000006, 0x8c000506, 0x05020004, + 0x42000000, 0x001097c9, 0x05fdff39, 0x5c000000, + 0x1c01f000, 0x8058b1c0, 0x05b80fbc, 0x5450a800, + 0x8050a000, 0x8054a800, 0x8058b040, 0x05fe07fc, + 0x1c01f000, 0x8058b1c0, 0x05b80fb4, 0x4450a800, + 0x8054a800, 0x8058b040, 0x05fe07fd, 0x1c01f000, + 0x4813c857, 0x4817c857, 0x40140000, 0x80100480, + 0x05ba1faa, 0x497bc841, 0x41787000, 0x42006800, + 0x00140000, 0x59a80083, 0x8c000500, 0x05000003, + 0x42006800, 0x0013a000, 0x4837c857, 0x8010048d, + 0x05021005, 0x8014048d, 0x05001003, 0x40147000, + 0x80342840, 0x61fc7801, 0x40100000, 0x80140480, + 0x82006d00, 0xffffff00, 0x05020002, 0x40007800, + 0x4813c840, 0x483fc842, 0x05011000, 0x40100000, + 0x803c2400, 0x40100000, 0x80140580, 0x05fe07f3, + 0x45782800, 0x803871c0, 0x05000005, 0x40382800, + 0x41787000, 0x80102000, 0x05fdf7eb, 0x1c01f000, + 0x8058b1c0, 0x05b80f81, 0x50500000, 0x9c0001c0, + 0x4400a800, 0x8050a000, 0x8054a800, 0x8058b040, + 0x05fe07fa, 0x1c01f000, 0x4c000000, 0x59a80007, + 0x8c00051c, 0x5c000000, 0x1c01f000, 0x0501f805, + 0x60058800, 0x05020002, 0x60018800, 0x1c01f000, + 0x59a80007, 0x8c000518, 0x1c01f000, 0x61906800, + 0x80346840, 0x05000006, 0x64070000, 0x40000000, + 0x59807000, 0x8c380500, 0x05fc07fa, 0x1c01f000, + 0x640f0000, 0x40000000, 0x59800000, 0x8c000500, + 0x05fc07fc, 0x1c01f000, 0x59a80006, 0x8c000516, + 0x1c01f000, 0x00000001, 0x00000002, 0x00000004, + 0x00000008, 0x00000010, 0x00000020, 0x00000040, + 0x00000080, 0x00000100, 0x00000200, 0x00000400, + 0x00000800, 0x00001000, 0x00002000, 0x00004000, + 0x00008000, 0x00010000, 0x00020000, 0x00040000, + 0x00080000, 0x00100000, 0x00200000, 0x00400000, + 0x00800000, 0x01000000, 0x02000000, 0x04000000, + 0x08000000, 0x10000000, 0x20000000, 0x40000000, + 0x80000000, 0x40000000, 0x600070e0, 0x60007820, + 0x4a007016, 0x00010001, 0x58380016, 0x8c000500, + 0x05fc07fc, 0x600c4000, 0x60003002, 0x64807808, + 0x583c2808, 0x8c14053e, 0x05000004, 0x80183040, + 0x05fe07fc, 0x0501f00d, 0x583c2808, 0x82140500, + 0x20000400, 0x82000580, 0x00000400, 0x05020005, + 0x82140500, 0x00000300, 0x90000580, 0x05000007, + 0x80204040, 0x05fe07ee, 0x4a007016, 0x00010000, + 0x90000541, 0x0501f040, 0x650c7808, 0x583c0009, + 0x8c000500, 0x05000005, 0x60002000, 0x4a007016, + 0x00010000, 0x0501f037, 0x65007808, 0x583c5809, + 0x65047808, 0x583c6009, 0x65087808, 0x583c6809, + 0x4a007016, 0x00010000, 0x82102d00, 0xf0000000, + 0x90140580, 0x05000002, 0x0501f020, 0x60202800, + 0x60003000, 0x803000c8, 0x40003800, 0x8030010a, + 0x801c3d80, 0x40300000, 0x80180580, 0x80100400, + 0x801c0400, 0x802c5c00, 0x803400c8, 0x40003800, + 0x8034010a, 0x801c3d80, 0x40340000, 0x80180580, + 0x801c0400, 0x80306400, 0x802c00c8, 0x40003800, + 0x802c010a, 0x801c3d80, 0x402c0000, 0x80180580, + 0x801c0400, 0x80346c00, 0x82183400, 0x9e3779b9, + 0x80142840, 0x05fe07e4, 0x0502000b, 0x402c0000, + 0x80040580, 0x05fe07c7, 0x40300000, 0x80080580, + 0x05fe07c4, 0x40340000, 0x800c0580, 0x05fe07c1, + 0x80000580, 0x1c01f000, 0x1c01f000, 0x42005000, + 0x7ff4c000, 0x58280800, 0x58281001, 0x58281802, + 0x58282003, 0x05fdff98, 0x05020807, 0x82101d00, + 0x0fffffff, 0x480fc021, 0x900c01c0, 0x4803c022, + 0x1c01f000, 0x497bc021, 0x497bc022, 0x4a03c020, + 0x00004020, 0x4a03c011, 0x40200011, 0x6016d800, + 0x05027011, 0x59e00020, 0x90000582, 0x0502000e, + 0x05006000, 0x4203e000, 0x40000000, 0x59e00017, + 0x60000800, 0x8c00050a, 0x05c20c53, 0x8d0c0530, + 0x05c20c3f, 0x05c20c41, 0x6403c017, 0x4203e000, + 0x30000001, 0x05bdf886, 0x05fdf7ff, 0x59a80886, + 0x8c100502, 0x05000003, 0x84040d42, 0x0501f007, + 0x8c100504, 0x05000003, 0x84040d44, 0x0501f003, + 0x8c100500, 0x84040d40, 0x48075086, 0x1c01f000, + 0x59a80086, 0x8c000502, 0x05000009, 0x4a035087, + 0x0000008b, 0x4a035088, 0x0000008b, 0x4a035089, + 0x0000008b, 0x6413508a, 0x0501f00c, 0x8c000504, + 0x05000006, 0x65bf5087, 0x65bf5088, 0x65df5089, + 0x6403508a, 0x0501f005, 0x64cf5087, 0x64cf5088, + 0x64975089, 0x6403508a, 0x1c01f000, 0xf3199441, + 0x00000000, 0x00000000, 0x0010d000, 0x00003c5e, 0x00000000, 0x00000000, 0x00020000, 0x00000a08, - 0x916c0583, 0x01020180, 0x42000000, 0x00109428, + 0x916c0583, 0x01020180, 0x42000000, 0x001094a8, 0x50000000, 0x800001c0, 0x05020a0f, 0x0501f9cb, 0x0501fd37, 0x0501fb39, 0x59a80068, 0x80000540, 0x01020e7c, 0x0501ff5a, 0x05fdf7f2, 0x915c04a0, @@ -8931,7 +8982,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x8c040508, 0x010209e6, 0x42007000, 0x00020a09, 0x58380000, 0x90001484, 0x0c001003, 0x0101f9e6, 0x1c01f000, 0x00020031, 0x00020071, 0x00020078, - 0x00100ee9, 0x82040d00, 0x43200f80, 0x0102061f, + 0x00100ee7, 0x82040d00, 0x43200f80, 0x0102061f, 0x58380002, 0x80000540, 0x05000008, 0x0101f612, 0x82040d00, 0x43200f80, 0x0102061f, 0x58380002, 0x80000540, 0x05fe07d6, 0x58386001, 0x58300008, @@ -8951,7 +9002,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x58300802, 0x82040580, 0x00000100, 0x0102062c, 0x4d2c0000, 0x40325800, 0x0101fd79, 0x5c025800, 0x0101f637, 0x59b800ea, 0x82000d00, 0xf2000038, - 0x0102077a, 0x8c000510, 0x01000779, 0x59ba60e0, + 0x01020778, 0x8c000510, 0x01000777, 0x59ba60e0, 0x81300182, 0x0502103d, 0x05002024, 0x8532653e, 0x59300407, 0x90000583, 0x0502001e, 0x59300203, 0x90000584, 0x0502001b, 0x59325809, 0x59300004, @@ -8960,7 +9011,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x5934000f, 0x8d0c0512, 0x05020005, 0x5934140b, 0x80081040, 0x05001002, 0x480a6c0b, 0x80000540, 0x050209f1, 0x59b800ea, 0x8c000510, 0x05fe07e0, - 0x1c01f000, 0x0129fc79, 0x05fc07ef, 0x0101f772, + 0x1c01f000, 0x0129fd05, 0x05fc07ef, 0x0101f770, 0x61567000, 0x0501f021, 0x83326500, 0x3fffffff, 0x59300407, 0x90000583, 0x05020012, 0x59325809, 0x5932680a, 0x4a025a05, 0x00000103, 0x497a580a, @@ -8969,14 +9020,14 @@ static const uint32_t isp_2500_risc_code[] = { 0x480a6c0b, 0x80000540, 0x050209d3, 0x05fdf7e2, 0x61527000, 0x0501f009, 0x83300500, 0x60000000, 0x05000011, 0x81326580, 0x8000013a, 0x82000400, - 0x0010077e, 0x50027000, 0x59300c07, 0x90040582, - 0x01000772, 0x59300004, 0x8c00053e, 0x05020003, - 0x0501fff5, 0x05fdf7d0, 0x0129fc79, 0x05fc07fd, - 0x0101f772, 0x83300500, 0x1f000000, 0x01000774, + 0x0010077c, 0x50027000, 0x59300c07, 0x90040582, + 0x01000770, 0x59300004, 0x8c00053e, 0x05020003, + 0x0501fff5, 0x05fdf7d0, 0x0129fd05, 0x05fc07fd, + 0x0101f770, 0x83300500, 0x1f000000, 0x01000772, 0x81326580, 0x80000130, 0x90000c94, 0x010219e6, - 0x1201f000, 0x00100782, 0x82000500, 0xf0000000, + 0x1201f000, 0x00100780, 0x82000500, 0xf0000000, 0x82040d00, 0x0fffffff, 0x80040d40, 0x4807c857, - 0x59b800ea, 0x8c000516, 0x01060051, 0x480770e1, + 0x59b800ea, 0x8c000516, 0x0106004f, 0x480770e1, 0x1c01f000, 0x59325809, 0x412c7000, 0x58380a05, 0x9004050f, 0x82000c00, 0x00100cde, 0x50044000, 0x0c01f001, 0x00100a75, 0x00100a75, 0x00020141, @@ -9002,44 +9053,44 @@ static const uint32_t isp_2500_risc_code[] = { 0x592c1a08, 0x4802600c, 0x481a600d, 0x481e600e, 0x480e600f, 0x843c7d4a, 0x403c1000, 0x1c01f000, 0x59e00004, 0x8c00050e, 0x05fe06d5, 0x1c01f000, - 0x42001000, 0x00109c51, 0x58080009, 0x80000540, - 0x01060758, 0x4a001003, 0x00109c5a, 0x4c080000, + 0x42001000, 0x00109cd1, 0x58080009, 0x80000540, + 0x01060756, 0x4a001003, 0x00109cda, 0x4c080000, 0x0501f812, 0x5c001000, 0x48141009, 0x480c1006, 0x48101007, 0x64001001, 0x64101005, 0x64041004, 0x05fdf680, 0x58300802, 0x82040580, 0x00000100, - 0x01060767, 0x82300580, 0x00109c51, 0x01060762, + 0x01060765, 0x82300580, 0x00109cd1, 0x01060760, 0x49786009, 0x1c01f000, 0x61901800, 0x800c1840, 0x05000006, 0x64070000, 0x40000000, 0x59800000, - 0x8c000500, 0x05fc07fa, 0x010407b9, 0x600028f4, + 0x8c000500, 0x05fc07fa, 0x010407b7, 0x600028f4, 0x58142024, 0x58141823, 0x58142825, 0x64030000, 0x1c01f000, 0x4c000000, 0x4df00000, 0x4203e000, 0xb0100000, 0x41f00000, 0x81fe1500, 0x8d080512, - 0x010a0989, 0x8d08051c, 0x05020eca, 0x8d080518, + 0x010a0987, 0x8d08051c, 0x05020eca, 0x8d080518, 0x05020efd, 0x8d08051a, 0x05fe0efb, 0x83080500, 0x00000d00, 0x05020804, 0x5c03e000, 0x5c000000, - 0x1801f000, 0x8d080516, 0x01060fd4, 0x8d080514, + 0x1801f000, 0x8d080516, 0x01060fd2, 0x8d080514, 0x05fe0fbc, 0x8d080508, 0x01060d6b, 0x8d080500, - 0x05020e6d, 0x8d08050c, 0x010a088e, 0x8d08050a, - 0x010606a4, 0x1c01f000, 0x42000000, 0x0010942e, + 0x05020e6d, 0x8d08050c, 0x010a088c, 0x8d08050a, + 0x010606a2, 0x1c01f000, 0x42000000, 0x001094ae, 0x50000000, 0x8c000504, 0x05000014, 0x42000000, - 0x0010942e, 0x50000000, 0x8c000502, 0x05020002, + 0x001094ae, 0x50000000, 0x8c000502, 0x05020002, 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, - 0x42034000, 0x00109410, 0x59a0001e, 0x59a1d806, + 0x42034000, 0x00109490, 0x59a0001e, 0x59a1d806, 0x84000502, 0x4803401e, 0x58ec0008, 0x0801f800, 0x5c03e000, 0x1c01f000, 0x05027002, 0x05026002, 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, 0x59e00020, 0xb0000d85, 0x05000003, 0xb0000d84, 0x05020007, 0x4803c857, 0x42000800, 0x00020a09, 0x58040800, 0x90040d80, 0x05020019, 0x0101fd68, - 0x05000017, 0x412dd800, 0x48efc857, 0x0115fe83, - 0x42034000, 0x00109410, 0x49a1d80a, 0x48ef4006, + 0x05000017, 0x412dd800, 0x48efc857, 0x0115fe87, + 0x42034000, 0x00109490, 0x49a1d80a, 0x48ef4006, 0x59a0001e, 0x84000544, 0x4803401e, 0x59e00020, 0x4803c857, 0x59e00021, 0x4803c857, 0x59e00022, 0x4803c857, 0x59e00023, 0x4803c857, 0x59e00024, - 0x4803c857, 0x010dfb25, 0x010dfb3d, 0x5c03e000, + 0x4803c857, 0x010dfb27, 0x010dfb3f, 0x5c03e000, 0x1c01f000, 0x4c5c0000, 0x4da00000, 0x4df00000, 0x4203e000, 0x50000000, 0x05006062, 0x42034000, - 0x00109410, 0x59a01018, 0x59a01819, 0x800c19c0, + 0x00109490, 0x59a01018, 0x59a01819, 0x800c19c0, 0x05020009, 0x59a0381c, 0x801c39c0, 0x010009e6, 0x49a3c857, 0x481fc857, 0x59a0041d, 0x801c3c00, 0x0501f00a, 0x59a0041a, 0x90000402, 0x4803441a, @@ -9064,9 +9115,9 @@ static const uint32_t isp_2500_risc_code[] = { 0x60083800, 0x42000800, 0x25000000, 0x585c1800, 0x585c3001, 0x900c19c0, 0x901831c0, 0x0101faa9, 0x5c03e000, 0x5c034000, 0x5c00b800, 0x1c01f000, - 0x910c0503, 0x011a0751, 0x59340400, 0x82000580, - 0x00000606, 0x011a072b, 0x5934000d, 0x80027d40, - 0x011a075a, 0x5934000f, 0x59341203, 0x80080540, + 0x910c0503, 0x011a075d, 0x59340400, 0x82000580, + 0x00000606, 0x011a0737, 0x5934000d, 0x80027d40, + 0x011a0766, 0x5934000f, 0x59341203, 0x80080540, 0x05020021, 0x8d0c0512, 0x05000010, 0x0501fe37, 0x05000017, 0x59a80087, 0x80000040, 0x05fe07ff, 0x492e6009, 0x4936600a, 0x58d400ea, 0x8c000516, @@ -9081,7 +9132,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x592c0407, 0x800000c2, 0x800018c4, 0x800c0400, 0x48025804, 0x1c01f000, 0x492c0800, 0x05fdf7f9, 0x83440c80, 0x00000800, 0x05021009, 0x83440400, - 0x00108b80, 0x50000000, 0x80000540, 0x05000004, + 0x00108c00, 0x50000000, 0x80000540, 0x05000004, 0x40026800, 0x80000580, 0x1c01f000, 0x90000541, 0x1c01f000, 0x59340203, 0x80000540, 0x0502002b, 0x4d300000, 0x4d2c0000, 0x5934000f, 0x80025d40, @@ -9097,20 +9148,20 @@ static const uint32_t isp_2500_risc_code[] = { 0x5c025800, 0x5c026000, 0x1c01f000, 0x497a5800, 0x4932580a, 0x641a6407, 0x641e6203, 0x0501f802, 0x05fdf7eb, 0x592c020d, 0x48026202, 0x59a80082, - 0x8c000510, 0x011e02cc, 0x8d0c050e, 0x011e02ca, - 0x8d0c0504, 0x011e02c8, 0x59340200, 0x8c000518, - 0x011e02c6, 0x64025a07, 0x8c000508, 0x011e02c4, + 0x8c000510, 0x011e02df, 0x8d0c050e, 0x011e02dd, + 0x8d0c0504, 0x011e02db, 0x59340200, 0x8c000518, + 0x011e02d9, 0x64025a07, 0x8c000508, 0x011e02d7, 0x492e6009, 0x4d3c0000, 0x417a7800, 0x0501fd2c, 0x5c027800, 0x1c01f000, 0x58040001, 0x49680800, 0x49780801, 0x815eb800, 0x4006d000, 0x80000d40, 0x05fe07fa, 0x497a5801, 0x59c80000, 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, 0x59980013, 0x48032823, 0x59d8010b, 0x48033014, 0x1c01f000, - 0x592c0405, 0x8c00051e, 0x011e072c, 0x497a5800, + 0x592c0405, 0x8c00051e, 0x011e0762, 0x497a5800, 0x8d0c0526, 0x0502000d, 0x0502d007, 0x592c0001, 0x492fb107, 0x80000d40, 0x05fe0fe4, 0x0500e0de, 0x1c01f000, 0x0500e8dc, 0x05fcd7f9, 0x42000000, - 0x00109751, 0x0145f898, 0x0501f939, 0x0500d944, + 0x001097d1, 0x0145f962, 0x0501f939, 0x0500d944, 0x0500e0d5, 0x59d80105, 0x82000d00, 0x01218780, 0x05020152, 0x1c01f000, 0x59980011, 0x0c01f001, 0x0002034c, 0x0002034d, 0x00020358, 0x00020398, @@ -9196,7 +9247,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x05020005, 0x48033016, 0x850e1d26, 0x48033017, 0x1c01f000, 0x05fcd7f8, 0x05fdf7fd, 0x59d80105, 0x82000500, 0x01218780, 0x05020004, 0x42000000, - 0x00109751, 0x0145f098, 0x4803c857, 0x485fc857, + 0x001097d1, 0x0145f162, 0x4803c857, 0x485fc857, 0x8c00050e, 0x010209dc, 0x4203e000, 0x50000000, 0x6010b900, 0x0101f1ea, 0x05fce777, 0x59d80105, 0x82000500, 0x01218780, 0x05fe07f4, 0x8d0c0524, @@ -9240,9 +9291,9 @@ static const uint32_t isp_2500_risc_code[] = { 0x8d0c0530, 0x05020007, 0x6403c017, 0x4203e000, 0x30000001, 0x1c01f000, 0x05fdfb4e, 0x05fdf7fb, 0x8c000500, 0x05fe0c4b, 0x05fdf7f8, 0x41700000, - 0x0c01f001, 0x001044b4, 0x0002054e, 0x001044b4, - 0x00020609, 0x001044b3, 0x001044b3, 0x001044b3, - 0x001044b3, 0x00104822, 0x0501002e, 0x59980004, + 0x0c01f001, 0x001044ea, 0x0002054e, 0x001044ea, + 0x00020609, 0x001044e9, 0x001044e9, 0x001044e9, + 0x001044e9, 0x0010486b, 0x0501002e, 0x59980004, 0x80000540, 0x05020032, 0x0502c018, 0x6042f800, 0x4df00000, 0x4203e000, 0x50000000, 0x49db3003, 0x59da5808, 0x592c2a05, 0x497a5800, 0x497a5801, @@ -9250,90 +9301,90 @@ static const uint32_t isp_2500_risc_code[] = { 0x0c01f82f, 0x5c03e000, 0x817ef840, 0x05000007, 0x916c0583, 0x05020005, 0x91700581, 0x0502000e, 0x05010015, 0x05fcc7eb, 0x0500f93f, 0x0500b12b, - 0x59d40005, 0x82000500, 0x43218780, 0x012207ac, - 0x59d80005, 0x82000500, 0x43218780, 0x012207b2, + 0x59d40005, 0x82000500, 0x43218780, 0x012207f5, + 0x59d80005, 0x82000500, 0x43218780, 0x012207fb, 0x1c01f000, 0x91700583, 0x05000893, 0x91700581, 0x05fe07f2, 0x05010004, 0x05fcc7da, 0x05fdf7ef, 0x6042f800, 0x4df00000, 0x4203e000, 0x50000000, 0x49d73003, 0x59d65808, 0x05fdf7d7, 0x4df00000, 0x4203e000, 0x50000000, 0x40025800, 0x592c2a05, 0x497b3003, 0x497b3004, 0x6042f800, 0x05fdf7d1, - 0x0121fd05, 0x5c03e000, 0x05fdf7dc, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104564, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104511, 0x00104505, 0x00104505, - 0x00104505, 0x00104581, 0x00104505, 0x00104505, - 0x00104505, 0x0002064f, 0x00104505, 0x001046ca, - 0x00104505, 0x00104505, 0x00104505, 0x00020625, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104530, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104754, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104793, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x001047f0, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104723, 0x001047be, 0x00104505, - 0x001047e6, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x00104505, 0x00104505, 0x00104505, - 0x00104505, 0x4df00000, 0x4203e000, 0x50000000, - 0x59981003, 0x800811c0, 0x012004b8, 0x58080005, - 0x82000d00, 0x43218780, 0x012207b2, 0x8c000508, - 0x012004b6, 0x580a5808, 0x592c0205, 0x497a5800, + 0x0121fd3b, 0x5c03e000, 0x05fdf7dc, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010459a, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x00104547, 0x0010453b, 0x0010453b, + 0x0010453b, 0x001045b7, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0002064f, 0x0010453b, 0x00104711, + 0x0010453b, 0x0010453b, 0x0010453b, 0x00020625, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x00104566, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010479b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x001047dc, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x00104839, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010476a, 0x00104807, 0x0010453b, + 0x0010482f, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x0010453b, 0x0010453b, 0x0010453b, + 0x0010453b, 0x4df00000, 0x4203e000, 0x50000000, + 0x59981003, 0x800811c0, 0x012004ee, 0x58080005, + 0x82000d00, 0x43218780, 0x012207fb, 0x8c000508, + 0x012004ec, 0x580a5808, 0x592c0205, 0x497a5800, 0x497a5801, 0x82000500, 0x000000ff, 0xb0000c8b, - 0x012214b5, 0x1201f800, 0x001044ba, 0x5c03e000, + 0x012214eb, 0x1201f800, 0x001044f0, 0x5c03e000, 0x91700583, 0x05fc07e8, 0x0500f887, 0x0500b073, 0x1c01f000, 0x80140110, 0x80000040, 0x05000009, - 0x0120150b, 0x4a033006, 0x00020630, 0x48033000, + 0x01201541, 0x4a033006, 0x00020630, 0x48033000, 0x492f3001, 0x492f3002, 0x600ee000, 0x1c01f000, - 0x592e8a07, 0x83440c80, 0x000007f0, 0x01221517, - 0x8d0c050e, 0x01220538, 0x83440400, 0x00108b80, - 0x50000000, 0x80026d40, 0x01200545, 0x5934000a, - 0x8c00052e, 0x0122054b, 0x05fdfc46, 0x01220547, + 0x592e8a07, 0x83440c80, 0x000007f0, 0x0122154d, + 0x8d0c050e, 0x0122056e, 0x83440400, 0x00108c00, + 0x50000000, 0x80026d40, 0x0120057b, 0x5934000a, + 0x8c00052e, 0x01220581, 0x05fdfc46, 0x0122057d, 0x1c01f000, 0x59980802, 0x59980000, 0x48065800, 0x492c0801, 0x492f3002, 0x80000040, 0x48033000, 0x05000002, 0x1c01f000, 0x599a5801, 0x59980006, 0x6006e000, 0x0801f800, 0x1c01f000, 0x80140110, - 0x0120050b, 0x80000040, 0x05020009, 0x592c240b, + 0x01200541, 0x80000040, 0x05020009, 0x592c240b, 0x8c100504, 0x0500000a, 0x592c0208, 0x82000c80, - 0x00001001, 0x01221517, 0x0125f000, 0x4a033006, + 0x00001001, 0x0122154d, 0x0125f049, 0x4a033006, 0x0002065e, 0x05fdf7ce, 0x592c240b, 0x592e8a07, - 0x417a7800, 0x83440480, 0x00000800, 0x0122166e, - 0x83440400, 0x00108b80, 0x50000000, 0x80026d40, - 0x0120066e, 0x59340002, 0x592c0809, 0x80040580, - 0x82000500, 0x00ffffff, 0x01220517, 0x592e600a, - 0x497a5809, 0x83300480, 0x0010cca4, 0x01201687, - 0xa1300495, 0x0122163b, 0x592c0a0d, 0x59300202, - 0x80040580, 0x01220687, 0x4936600a, 0x8c10051c, - 0x0122062f, 0x59a80082, 0x8c000510, 0x0122069f, - 0x8d0c050e, 0x0122061b, 0x8d0c0504, 0x01220696, - 0x59340200, 0x8c000518, 0x01220684, 0x59300c07, - 0x90040586, 0x012206a2, 0x8c100508, 0x01220611, + 0x417a7800, 0x83440480, 0x00000800, 0x012216b2, + 0x83440400, 0x00108c00, 0x50000000, 0x80026d40, + 0x012006b2, 0x59340002, 0x592c0809, 0x80040580, + 0x82000500, 0x00ffffff, 0x0122054d, 0x592e600a, + 0x497a5809, 0x83300480, 0x0010ccb4, 0x012016cb, + 0xa1300495, 0x0122167f, 0x592c0a0d, 0x59300202, + 0x80040580, 0x012206cb, 0x4936600a, 0x8c10051c, + 0x01220673, 0x59a80082, 0x8c000510, 0x012206e3, + 0x8d0c050e, 0x0122065f, 0x8d0c0504, 0x012206da, + 0x59340200, 0x8c000518, 0x012206c8, 0x59300c07, + 0x90040586, 0x012206e6, 0x8c100508, 0x01220655, 0x59300809, 0x497a5804, 0x64025a07, 0x800409c0, - 0x01220616, 0x59300416, 0x8c000516, 0x0122068a, + 0x0122065a, 0x59300416, 0x8c000516, 0x012206ce, 0x492e6009, 0x0501f1ae, 0x4df00000, 0x4203e000, 0x50000000, 0x0502b00a, 0x915c04a0, 0x0500100c, 0x815eb840, 0x416a5800, 0x592ed000, 0x492fb007, 0x497a5800, 0x497a5801, 0x05fcb7f8, 0x59d80005, - 0x82000500, 0x43218780, 0x012207b2, 0x5c03e000, + 0x82000500, 0x43218780, 0x012207fb, 0x5c03e000, 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, 0x0502f00a, 0x915c04a0, 0x0500100c, 0x815eb840, 0x416a5800, 0x592ed000, 0x492fa807, 0x497a5800, 0x497a5801, 0x05fcf7f8, 0x59d40005, 0x82000500, - 0x43218780, 0x012207ac, 0x5c03e000, 0x1c01f000, + 0x43218780, 0x012207f5, 0x5c03e000, 0x1c01f000, 0x40307000, 0x5838000a, 0x80025d40, 0x05000018, 0x58380002, 0x82000580, 0x00000100, 0x05000019, 0x4c380000, 0x592c0205, 0x82000500, 0x000000ff, @@ -9345,7 +9396,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x58380004, 0x90000483, 0x05000074, 0x5838000f, 0x8c000500, 0x05020012, 0x600cb000, 0x912cac12, 0x58380009, 0x5838100c, 0x8008a400, 0x4c380000, - 0x0145f95f, 0x5c007000, 0x5838000c, 0x90000403, + 0x0145fa29, 0x5c007000, 0x5838000c, 0x90000403, 0x4800700c, 0x6404700f, 0x58380004, 0x90000483, 0x48007004, 0x90000583, 0x05000060, 0x5838000d, 0x80001d40, 0x0502001b, 0x4c380000, 0x0101fd55, @@ -9354,14 +9405,14 @@ static const uint32_t isp_2500_risc_code[] = { 0x05020002, 0x5838000a, 0x40000800, 0x492c0801, 0x492c700b, 0x603c0800, 0x0501f00e, 0x6022e000, 0x4a033005, 0x0002070b, 0x1c01f000, 0x600ae000, - 0x42000000, 0x00109969, 0x50007000, 0x05fdf7eb, + 0x42000000, 0x001099e9, 0x50007000, 0x05fdf7eb, 0x583a580b, 0x400c0000, 0x60540800, 0x80040c80, 0x58381004, 0x5838000e, 0x41783000, 0x80000540, 0x05020004, 0x84183540, 0x90081483, 0x05000037, 0x40080000, 0x80040480, 0x05001002, 0x40080800, 0x4004b000, 0x412c0000, 0x800c0400, 0x4000a800, 0x58380009, 0x5838100c, 0x8008a400, 0x4c080000, - 0x4c040000, 0x4c0c0000, 0x4c380000, 0x0145f95f, + 0x4c040000, 0x4c0c0000, 0x4c380000, 0x0145fa29, 0x5c007000, 0x5c001800, 0x5c000800, 0x40040000, 0x58381004, 0x80080480, 0x48007004, 0x90000583, 0x05000002, 0x84183500, 0x5c000000, 0x80041400, @@ -9371,13 +9422,13 @@ static const uint32_t isp_2500_risc_code[] = { 0x480c700d, 0x40180000, 0x0c01f001, 0x0002074f, 0x00020752, 0x00020750, 0x0002074f, 0x000206f6, 0x00020752, 0x00020750, 0x0002074f, 0x0101f9e6, - 0x5838100e, 0x0125f010, 0x5838080c, 0x90040402, + 0x5838100e, 0x0125f059, 0x5838080c, 0x90040402, 0x58381009, 0x80080400, 0x50001000, 0x800811c0, 0x0502000b, 0x6006e000, 0x583a580a, 0x4978700a, 0x4978700f, 0x592c0205, 0x82000500, 0x000000ff, 0x90000592, 0x05fc06fd, 0x05fdf6ce, 0x58380009, 0x80040c00, 0x90381c06, 0x54041800, 0x80040800, - 0x800c1800, 0x54041800, 0x0125f010, 0x4df00000, + 0x800c1800, 0x54041800, 0x0125f059, 0x4df00000, 0x4203e000, 0x50000000, 0x5994002e, 0x80000540, 0x050000c6, 0x4c000000, 0x5c000000, 0x59947824, 0x4803282f, 0x803c0480, 0x05001004, 0x05000003, @@ -9387,7 +9438,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x05000002, 0x483fc857, 0x59e40852, 0x59a80076, 0x80040580, 0x05000004, 0x480bc857, 0x59e40052, 0x48035076, 0x59940030, 0x803c0400, 0x48032830, - 0x0125fe3e, 0x59940000, 0x90000580, 0x05020005, + 0x0125feca, 0x59940000, 0x90000580, 0x05020005, 0x59940030, 0x48032831, 0x497b2830, 0x64072800, 0x4c0c0000, 0x58d400e5, 0x8c000514, 0x05000013, 0x59940807, 0x59941006, 0x5994002f, 0x80081c80, @@ -9429,7 +9480,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x0801f800, 0x0501f004, 0x9000040a, 0x4803282b, 0x05fc27f8, 0x5994082e, 0x5994002f, 0x80040480, 0x010019e6, 0x4803282e, 0x59940000, 0x0c01f001, - 0x0002083b, 0x00104da3, 0x00104e04, 0x5c03e000, + 0x0002083b, 0x00104e2f, 0x00104e90, 0x5c03e000, 0x1c01f000, 0x5994002e, 0x80000000, 0x4803282e, 0x4203e000, 0x70000000, 0x1c01f000, 0x813e79c0, 0x05020009, 0x59a80089, 0x80000040, 0x05fe07ff, @@ -9449,11 +9500,11 @@ static const uint32_t isp_2500_risc_code[] = { 0x59300004, 0x82000500, 0x00000100, 0x80040d40, 0x48066004, 0x58d400ea, 0x8c000516, 0x05fe07fe, 0x83300400, 0x40000000, 0x4801a8e1, 0x1c01f000, - 0x58d400ea, 0x82001500, 0x32000018, 0x012a0183, + 0x58d400ea, 0x82001500, 0x32000018, 0x012a020f, 0x8c000510, 0x0500002f, 0x58d410e0, 0x82080500, 0xfffff000, 0x0502000d, 0x900a350f, 0x80081108, 0x480bc857, 0x90080487, 0x010219e6, 0x90080481, - 0x010019e6, 0x1201f000, 0x00105187, 0x84000510, + 0x010019e6, 0x1201f000, 0x00105213, 0x84000510, 0x48026004, 0x0501f019, 0x840a653e, 0x59300804, 0x8c040520, 0x05fc07fa, 0x82040d00, 0xfffefeff, 0x48066004, 0x8c08053e, 0x05020009, 0x8c040514, @@ -9461,19 +9512,19 @@ static const uint32_t isp_2500_risc_code[] = { 0x604e7000, 0x0501f858, 0x0501f008, 0x8c040514, 0x05000004, 0x05fdffa2, 0x0501f835, 0x0501f003, 0x61267000, 0x0501f850, 0x58d400ea, 0x82001500, - 0x32000018, 0x012a0183, 0x8c000510, 0x05fe07d3, + 0x32000018, 0x012a020f, 0x8c000510, 0x05fe07d3, 0x1c01f000, 0x59bc00ea, 0x82001500, 0xb2000018, - 0x012a01ad, 0x8c000510, 0x05000007, 0x59bc10e0, + 0x012a0239, 0x8c000510, 0x05000007, 0x59bc10e0, 0x80080108, 0x900a350f, 0x4803c857, 0x1201f000, - 0x001051b1, 0x1c01f000, 0x59a80262, 0x81640480, + 0x0010523d, 0x1c01f000, 0x59a80262, 0x81640480, 0x05001015, 0x41626000, 0x41580000, 0x59300a03, 0x90040d80, 0x05020007, 0x64226203, 0x8166c840, 0x9132c424, 0x81600480, 0x05021008, 0x1c01f000, 0x91326424, 0x81300c80, 0x05fc17f5, 0x42026000, - 0x0010cca4, 0x05fdf7f2, 0x837ac540, 0x0010cca4, - 0x1c01f000, 0x42000000, 0x001097eb, 0x0145f895, + 0x0010ccb4, 0x05fdf7f2, 0x837ac540, 0x0010ccb4, + 0x1c01f000, 0x42000000, 0x0010986b, 0x0145f95f, 0x4967c857, 0x80026580, 0x1c01f000, 0x83300480, - 0x0010cca4, 0x010019e6, 0x41580000, 0x81300480, + 0x0010ccb4, 0x010019e6, 0x41580000, 0x81300480, 0x0502100a, 0x457a6000, 0x4a026202, 0x0000ffff, 0x05011000, 0x91300403, 0x4803c840, 0x6487c842, 0x8166c800, 0x1c01f000, 0x41540000, 0x81300480, @@ -9482,80 +9533,80 @@ static const uint32_t isp_2500_risc_code[] = { 0x05011000, 0x91300403, 0x4803c840, 0x6487c842, 0x1c01f000, 0x4d340000, 0x5932680a, 0x59300407, 0x9000051f, 0x0c01f803, 0x5c026800, 0x1c01f000, - 0x00105e30, 0x00105e3f, 0x00105e56, 0x0002092c, - 0x00107971, 0x00107989, 0x00020997, 0x00105e30, - 0x00105e3f, 0x00104f63, 0x00105e6b, 0x00105e30, - 0x00105e30, 0x00105e30, 0x00105e30, 0x00105e30, - 0x0010759f, 0x0010852c, 0x00105e30, 0x00105e30, - 0x00105e30, 0x00105e30, 0x00105e30, 0x00105e30, - 0x00105e30, 0x00105e30, 0x00105e30, 0x00105e30, - 0x00105e30, 0x00105e30, 0x00105e30, 0x00105e30, + 0x00105eac, 0x00105ebb, 0x00105ed2, 0x0002092c, + 0x00107a07, 0x00107a1f, 0x00020997, 0x00105eac, + 0x00105ebb, 0x00104fef, 0x00105ee7, 0x00105eac, + 0x00105eac, 0x00105eac, 0x00105eac, 0x00105eac, + 0x00107635, 0x001085e4, 0x00105eac, 0x00105eac, + 0x00105eac, 0x00105eac, 0x00105eac, 0x00105eac, + 0x00105eac, 0x00105eac, 0x00105eac, 0x00105eac, + 0x00105eac, 0x00105eac, 0x00105eac, 0x00105eac, 0x59300203, 0x90000c8e, 0x010219e6, 0x0c01f001, - 0x00105e6a, 0x001067dc, 0x0002093e, 0x00106960, - 0x001069e5, 0x00105e6a, 0x00105e6a, 0x00105e6a, - 0x001067c8, 0x00105e6a, 0x00105e6a, 0x00105e6a, - 0x00105e6a, 0x00106b93, 0xb1380498, 0x05021006, + 0x00105ee6, 0x00106866, 0x0002093e, 0x001069ea, + 0x00106a6f, 0x00105ee6, 0x00105ee6, 0x00105ee6, + 0x00106852, 0x00105ee6, 0x00105ee6, 0x00105ee6, + 0x00105ee6, 0x00106c1d, 0xb1380498, 0x05021006, 0xb1380480, 0x05001004, 0x4d2c0000, 0x0c01f803, - 0x5c025800, 0x1c01f000, 0x00106843, 0x00106843, - 0x00106843, 0x00106843, 0x00106843, 0x00106844, - 0x001068f2, 0x00106843, 0x00106843, 0x00106843, - 0x00106843, 0x00106843, 0x00106843, 0x00106843, - 0x00106843, 0x00106843, 0x00106843, 0x00106843, - 0x00106843, 0x001068f6, 0x0002095e, 0x00106843, - 0x001068f5, 0x001068f7, 0x59325809, 0x59300813, + 0x5c025800, 0x1c01f000, 0x001068cd, 0x001068cd, + 0x001068cd, 0x001068cd, 0x001068cd, 0x001068ce, + 0x0010697c, 0x001068cd, 0x001068cd, 0x001068cd, + 0x001068cd, 0x001068cd, 0x001068cd, 0x001068cd, + 0x001068cd, 0x001068cd, 0x001068cd, 0x001068cd, + 0x001068cd, 0x00106980, 0x0002095e, 0x001068cd, + 0x0010697f, 0x00106981, 0x59325809, 0x59300813, 0x59301402, 0x59340200, 0x8c00050e, 0x0502001a, 0x0501f823, 0x05000005, 0x4a025a05, 0x00000103, 0x497a580a, 0x0501f007, 0x4a025a05, 0x00000103, - 0x64025a07, 0x497a580a, 0x800409c0, 0x013609b5, + 0x64025a07, 0x497a580a, 0x800409c0, 0x01360a3f, 0x48065808, 0x480a5c07, 0x05fdf9ba, 0x5934000f, 0x8d0c0512, 0x05020005, 0x5934140b, 0x80081040, 0x05001002, 0x480a6c0b, 0x80000540, 0x05fe0956, 0x05fdf76b, 0x592c020b, 0x8c000502, 0x05fc07e5, 0x800409c0, 0x05fc07e9, 0x592c0209, 0x8c00050e, - 0x05fe07e6, 0x4933c857, 0x0139f291, 0x592c020b, + 0x05fe07e6, 0x4933c857, 0x0139f327, 0x592c020b, 0x8c000500, 0x0500000d, 0x59300017, 0x592c3810, 0x801c3c80, 0x05000009, 0x64565a07, 0x8c1c053e, 0x05000004, 0x641e5a07, 0x801c3880, 0x801c3800, 0x481fc857, 0x901c0d40, 0x1c01f000, 0x59300203, - 0x9000348e, 0x010219e6, 0x0c01f001, 0x001079a4, - 0x000209a9, 0x00107f61, 0x00107f69, 0x000209be, - 0x001079a4, 0x00108025, 0x000209da, 0x001079a4, - 0x001079a4, 0x001079a4, 0x001079a4, 0x001079a4, - 0x001079a4, 0x91380593, 0x013e070f, 0x59300403, + 0x9000348e, 0x010219e6, 0x0c01f001, 0x00107a3a, + 0x000209a9, 0x00108007, 0x0010800f, 0x000209be, + 0x00107a3a, 0x001080ce, 0x000209da, 0x00107a3a, + 0x00107a3a, 0x00107a3a, 0x00107a3a, 0x00107a3a, + 0x00107a3a, 0x91380593, 0x013e07b5, 0x59300403, 0xb0027484, 0x010219e6, 0xb0000480, 0x010019e6, - 0x0c01f001, 0x00107f4f, 0x000209b5, 0x00107f50, - 0x00107f5c, 0x59325809, 0x832c0500, 0x00ff0000, - 0x05000004, 0x592c0c0b, 0x8c04051a, 0x013e0759, + 0x0c01f001, 0x00107ff5, 0x000209b5, 0x00107ff6, + 0x00108002, 0x59325809, 0x832c0500, 0x00ff0000, + 0x05000004, 0x592c0c0b, 0x8c04051a, 0x013e07ff, 0x05fdfe97, 0x05fdf72a, 0xb1380588, 0x05000004, - 0xb1380593, 0x013c07db, 0x0101f9e6, 0x59300021, + 0xb1380593, 0x01400084, 0x0101f9e6, 0x59300021, 0x59301013, 0x5930080a, 0x58040a00, 0x8c04050e, - 0x013e07c1, 0x800811c0, 0x013e07cc, 0x59300021, - 0x80000540, 0x013e07d6, 0x59325809, 0x592c040b, - 0x8c00051e, 0x013c07bb, 0x64066203, 0x65066403, + 0x0142006a, 0x800811c0, 0x01420075, 0x59300021, + 0x80000540, 0x0142007f, 0x59325809, 0x592c040b, + 0x8c00051e, 0x01400064, 0x64066203, 0x65066403, 0x42000800, 0x80002042, 0x8c00051a, 0x05020002, 0x84040d54, 0x05fdf6a3, 0xb1380494, 0x010219e6, - 0xb1380480, 0x013c17f2, 0x0c01f001, 0x00107ffa, - 0x000209f3, 0x00108003, 0x00108008, 0x00107ffa, - 0x00107ffa, 0x00107ffa, 0x00107ffa, 0x00107ffb, - 0x00107fff, 0x00107fff, 0x00107ffa, 0x00107ffa, - 0x00107ffa, 0x00107ffa, 0x00107fff, 0x00107ffa, - 0x00107fff, 0x00107ffa, 0x00107ffb, 0x64066203, + 0xb1380480, 0x0140109b, 0x0c01f001, 0x001080a3, + 0x000209f3, 0x001080ac, 0x001080b1, 0x001080a3, + 0x001080a3, 0x001080a3, 0x001080a3, 0x001080a4, + 0x001080a8, 0x001080a8, 0x001080a3, 0x001080a3, + 0x001080a3, 0x001080a3, 0x001080a8, 0x001080a3, + 0x001080a8, 0x001080a3, 0x001080a4, 0x64066203, 0x493a6403, 0x42000800, 0x80002042, 0x05fdf685, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x9edc9de5, - 0x00000000, 0x00000000, 0x0010ad00, 0x00001add, - 0x42000000, 0x0010c810, 0x42001000, 0x0010c801, - 0x48001000, 0x42013800, 0x0010cc10, 0x42000000, - 0x0010c800, 0x489c0000, 0x409d4000, 0x409d6800, + 0x00000000, 0x00000000, 0x00000000, 0x9ec459b0, + 0x00000000, 0x00000000, 0x0010ad00, 0x00001ae5, + 0x42000000, 0x0010c820, 0x42001000, 0x0010c811, + 0x48001000, 0x42013800, 0x0010cc20, 0x42000000, + 0x0010c810, 0x489c0000, 0x409d4000, 0x409d6800, 0x1c01f000, 0x4200d000, 0x0000000d, 0x42000000, 0x00000002, 0x4800d000, 0x0401f7fb, 0x4200d000, 0x0000000d, 0x42000000, 0x00000001, 0x4800d000, 0x0401f7fb, 0x1c01f000, 0x809d3840, 0x48813800, 0x4933c857, 0x5931040c, 0x82817480, 0x00000038, 0x0400000d, 0x0400100c, 0x82810480, 0x00000038, - 0x4a025a06, 0x00000038, 0x0201f800, 0x00102d79, + 0x4a025a06, 0x00000038, 0x0201f800, 0x00102d7d, 0x40c65800, 0x80c589c0, 0x040207f4, 0x4178d000, 0x0401f004, 0x48825a06, 0x4200d000, 0x00000001, 0x40698800, 0x589d0000, 0x809d3800, 0x1c01f000, @@ -9586,11 +9637,11 @@ static const uint32_t isp_2500_risc_code[] = { 0x486b9121, 0x4a039123, 0xe1290008, 0x486f9122, 0x0401f7e2, 0x4a039100, 0x0000e980, 0x1c01f000, 0x59c8d007, 0x8c68d500, 0x04000003, 0x4a03900d, - 0x00000030, 0x1c01f000, 0x0201f800, 0x0010511f, + 0x00000030, 0x1c01f000, 0x0201f800, 0x001051ab, 0x59b8d0ea, 0x8268d500, 0x00000007, 0x82697480, 0x00000003, 0x04000002, 0x0401f003, 0x4a0370e8, 0x00000001, 0x1c01f000, 0x4a038805, 0x00020000, - 0x4200d000, 0x0000003c, 0x0201f800, 0x00101058, + 0x4200d000, 0x0000003c, 0x0201f800, 0x00101056, 0x4a038891, 0x0000ffff, 0x59c97035, 0x48bb9035, 0x4a03900d, 0x00000040, 0x42038000, 0x00007700, 0x0201f800, 0x00100b3d, 0x4a038006, 0x20000000, @@ -9600,7 +9651,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x4a03b805, 0x20000000, 0x59d0d006, 0x8c68d50a, 0x040207fe, 0x59dcd006, 0x8c68d50a, 0x040207fb, 0x1c01f000, 0x4203a000, 0x00007600, 0x4200d000, - 0x00000040, 0x0201f800, 0x00101058, 0x4a03a00a, + 0x00000040, 0x0201f800, 0x00101056, 0x4a03a00a, 0x00000001, 0x4a03a005, 0x20000000, 0x59d0d006, 0x4a03a005, 0x30000000, 0x59d0d006, 0x8c68d50a, 0x040207fe, 0x59d0d005, 0x59a0d211, 0x59a0dc11, @@ -9626,14 +9677,14 @@ static const uint32_t isp_2500_risc_code[] = { 0x80697480, 0x04000015, 0x4967c857, 0x59a97060, 0x48bbc857, 0x59a9705f, 0x48bbc857, 0x59a9705e, 0x48bbc857, 0x4a034407, 0x00000018, 0x0201f800, - 0x00101c09, 0x0401f131, 0x4a034407, 0x00000005, - 0x0201f800, 0x00101c09, 0x0401f12c, 0x0201f800, - 0x00101c11, 0x0401f129, 0x59a8d05f, 0x59a8005e, - 0x80697480, 0x040207e9, 0x0201f800, 0x0010306d, - 0x80c589c0, 0x0402004b, 0x0201f800, 0x00101c15, - 0x0401f11e, 0x4887c857, 0x0201f800, 0x00101c0d, - 0x0401f11a, 0x0201f800, 0x00105e04, 0x40c66000, - 0x80c589c0, 0x0400003c, 0x0201f800, 0x00102d79, + 0x00101c0b, 0x0401f131, 0x4a034407, 0x00000005, + 0x0201f800, 0x00101c0b, 0x0401f12c, 0x0201f800, + 0x00101c13, 0x0401f129, 0x59a8d05f, 0x59a8005e, + 0x80697480, 0x040207e9, 0x0201f800, 0x00103071, + 0x80c589c0, 0x0402004b, 0x0201f800, 0x00101c17, + 0x0401f11e, 0x4887c857, 0x0201f800, 0x00101c0f, + 0x0401f11a, 0x0201f800, 0x00105e80, 0x40c66000, + 0x80c589c0, 0x0400003c, 0x0201f800, 0x00102d7d, 0x40c65800, 0x80c589c0, 0x04000020, 0x48898a05, 0x48898c05, 0x4882620c, 0x4886640c, 0x59a0d40f, 0x8068d0e0, 0x59a0da0f, 0x406c0000, 0x8068d540, @@ -9642,27 +9693,27 @@ static const uint32_t isp_2500_risc_code[] = { 0x8068d0e0, 0x59a0da0e, 0x406c0000, 0x8068d540, 0x486a600f, 0x59a0d411, 0x8068d0e0, 0x59a0da11, 0x406c0000, 0x8068d540, 0x486a6010, 0x0401fe9b, - 0x80c589c0, 0x04020006, 0x0201f800, 0x00105dd3, + 0x80c589c0, 0x04020006, 0x0201f800, 0x00105e4b, 0x4a034407, 0x00000002, 0x0401f7be, 0x48ee6023, 0x58ee580c, 0x4a01d801, 0x00000001, 0x592cd206, 0x4869d805, 0x832cd400, 0x00000007, 0x4869d803, 0x4895d806, 0x4891d807, 0x4a01d808, 0x0010afa5, 0x4a034000, 0x00000001, 0x49334001, 0x0401ff60, 0x0401f0da, 0x4a034407, 0x00000003, 0x0401f7a9, - 0x0201f800, 0x0010512e, 0x598e600b, 0x0201f800, - 0x001053cb, 0x0201f800, 0x0010512e, 0x408e3000, - 0x0201f800, 0x0010560b, 0x59926005, 0x813261c0, - 0x0400000d, 0x0201f800, 0x001052fc, 0x0201f800, - 0x00105102, 0x0201f800, 0x00105108, 0x42027800, + 0x0201f800, 0x001051ba, 0x598e600b, 0x0201f800, + 0x00105457, 0x0201f800, 0x001051ba, 0x408e3000, + 0x0201f800, 0x00105697, 0x59926005, 0x813261c0, + 0x0400000d, 0x0201f800, 0x00105388, 0x0201f800, + 0x0010518e, 0x0201f800, 0x00105194, 0x42027800, 0x00001000, 0x42028000, 0x0000002e, 0x0201f800, - 0x0010ba4a, 0x811a3000, 0x83197480, 0x00000004, - 0x040007ec, 0x040017eb, 0x0201f800, 0x001007cf, - 0x0201f800, 0x001022e3, 0x497b5079, 0x497b4408, - 0x4201d000, 0x003d0900, 0x0201f800, 0x00104ef3, + 0x0010ba5a, 0x811a3000, 0x83197480, 0x00000004, + 0x040007ec, 0x040017eb, 0x0201f800, 0x001007cd, + 0x0201f800, 0x001022e8, 0x497b5079, 0x497b4408, + 0x4201d000, 0x003d0900, 0x0201f800, 0x00104f7f, 0x59c50880, 0x59c510a3, 0x497b4002, 0x0401fe6d, 0x0401ff0d, 0x4a03a005, 0x10000000, 0x59c4d005, 0x8268d540, 0x000000f0, 0x486b8805, 0x0401fe85, - 0x0201f800, 0x001022ea, 0x40c50000, 0x80c589c0, + 0x0201f800, 0x001022ef, 0x40c50000, 0x80c589c0, 0x04020020, 0x59c8d001, 0x8068d1c0, 0x0402001d, 0x59dcd006, 0x8268d500, 0x43200f80, 0x0400000a, 0x59dcd006, 0x82697480, 0x00000000, 0x83f17500, @@ -9683,23 +9734,23 @@ static const uint32_t isp_2500_risc_code[] = { 0x04020004, 0x82797480, 0x00000032, 0x0400002b, 0x486fc857, 0x487bc857, 0x4877c857, 0x4883c857, 0x487fc857, 0x4873c857, 0x59a9700f, 0x48bbc857, - 0x0201f800, 0x001022fc, 0x4a035079, 0x00000001, + 0x0201f800, 0x00102301, 0x4a035079, 0x00000001, 0x4200d000, 0x00000064, 0x0401f004, 0x8068d1c0, 0x04000028, 0x8068d040, 0x59c0d807, 0x8c6cdd04, - 0x040007fb, 0x0401fe7d, 0x0201f800, 0x00103089, - 0x0201f800, 0x00105456, 0x0401fe6c, 0x4201d000, - 0x000186a0, 0x0201f800, 0x00104ef3, 0x488b88a3, + 0x040007fb, 0x0401fe7d, 0x0201f800, 0x0010308d, + 0x0201f800, 0x001054e2, 0x0401fe6c, 0x4201d000, + 0x000186a0, 0x0201f800, 0x00104f7f, 0x488b88a3, 0x48878880, 0x59a8d079, 0x8068d1c0, 0x04020713, - 0x0201f800, 0x00101bc7, 0x0401f030, 0x4a035079, + 0x0201f800, 0x00101bc9, 0x0401f030, 0x4a035079, 0x00000001, 0x0401f7ec, 0x82757480, 0x000000e1, 0x040207d4, 0x407c0000, 0x80817480, 0x040207d1, 0x59a8d00f, 0x80697480, 0x040207ce, 0x8270d500, 0x000000f0, 0x040207cb, 0x0401fe4a, 0x0401f7d5, - 0x4a035079, 0x00000001, 0x0201f800, 0x001015ca, + 0x4a035079, 0x00000001, 0x0201f800, 0x001015c8, 0x80c589c0, 0x04000008, 0x59c4d005, 0x8268d500, 0x000000f0, 0x04000007, 0x4a034408, 0x0000bbbb, 0x0401f7d1, 0x4a034408, 0x0000aaaa, 0x0401f7ce, - 0x0201f800, 0x001022ea, 0x80c57040, 0x04000008, + 0x0201f800, 0x001022ef, 0x80c57040, 0x04000008, 0x59c0d007, 0x8268d500, 0x000501c0, 0x040007c6, 0x4a034408, 0x0000dddd, 0x0401f7c3, 0x4a034408, 0x0000cccc, 0x0401f7c0, 0x589d2805, 0x589d2004, @@ -9712,8 +9763,8 @@ static const uint32_t isp_2500_risc_code[] = { 0x48b9d806, 0x5931700e, 0x48b9d807, 0x4a01d808, 0x0010afa5, 0x4a034000, 0x00000001, 0x40826000, 0x0401fe63, 0x0401f009, 0x41310000, 0x59a26001, - 0x4933c857, 0x0201f800, 0x00105dd5, 0x40826000, - 0x0201f800, 0x00101c15, 0x589d0000, 0x809d3800, + 0x4933c857, 0x0201f800, 0x00105e4d, 0x40826000, + 0x0201f800, 0x00101c17, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x412d1000, 0x41310800, 0x59a26001, 0x4069d800, @@ -9729,18 +9780,18 @@ static const uint32_t isp_2500_risc_code[] = { 0x58ee580c, 0x592cd205, 0x82697480, 0x00000103, 0x04000030, 0x41351800, 0x41452000, 0x592cd405, 0x8468d55e, 0x486a5c05, 0x42028800, 0x000007fd, - 0x4200d000, 0x00fffffd, 0x0201f800, 0x0010392e, + 0x4200d000, 0x00fffffd, 0x0201f800, 0x0010393d, 0x40c66800, 0x80c589c0, 0x04000010, 0x0201f800, - 0x001073d3, 0x80c589c0, 0x04000018, 0x40866000, + 0x00107469, 0x80c589c0, 0x04000018, 0x40866000, 0x4881d801, 0x4a01d808, 0x0010af7f, 0x0401f00f, - 0x0201f800, 0x00101c01, 0x0201f800, 0x00105dd3, + 0x0201f800, 0x00101c03, 0x0201f800, 0x00105e4b, 0x40866000, 0x0401f019, 0x59a26001, 0x0201f800, - 0x00105dd3, 0x40866000, 0x4a034407, 0x00000002, - 0x0201f800, 0x00101c09, 0x408a5800, 0x408e6800, - 0x40928800, 0x0401f00d, 0x0201f800, 0x00105dd3, + 0x00105e4b, 0x40866000, 0x4a034407, 0x00000002, + 0x0201f800, 0x00101c0b, 0x408a5800, 0x408e6800, + 0x40928800, 0x0401f00d, 0x0201f800, 0x00105e4b, 0x40866000, 0x4a034407, 0x00000004, 0x0401f7f5, - 0x0201f800, 0x00105dd3, 0x40866000, 0x0201f800, - 0x00101bc7, 0x408a5800, 0x589d2004, 0x589d1803, + 0x0201f800, 0x00105e4b, 0x40866000, 0x0201f800, + 0x00101bc9, 0x408a5800, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000005, 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, @@ -9757,7 +9808,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x4883a003, 0x59a0d40e, 0x8068d0e0, 0x59a0da0e, 0x406c0000, 0x80691d40, 0x59a0d411, 0x8068d0e0, 0x59a0da11, 0x406c0000, 0x80691540, 0x4201d000, - 0x00003a98, 0x0201f800, 0x00104ef3, 0x4883a002, + 0x00003a98, 0x0201f800, 0x00104f7f, 0x4883a002, 0x59a9707a, 0x48bba008, 0x488fa000, 0x488ba001, 0x59d0d005, 0x4a03a005, 0x10000000, 0x4178d000, 0x04025002, 0x8068d000, 0x8068d1c0, 0x04020007, @@ -9790,9 +9841,9 @@ static const uint32_t isp_2500_risc_code[] = { 0x0401ff4e, 0x0401f009, 0x4a034408, 0x0000dddd, 0x0401f006, 0x48690001, 0x4080d000, 0x0401ff47, 0x80c589c0, 0x040207f6, 0x589d0000, 0x809d3800, - 0x1c01f000, 0x0201f800, 0x001015ca, 0x80c589c0, + 0x1c01f000, 0x0201f800, 0x001015c8, 0x80c589c0, 0x04020002, 0x0401f009, 0x4a034407, 0x00000017, - 0x0201f800, 0x00101c09, 0x4203e000, 0x50000000, + 0x0201f800, 0x00101c0b, 0x4203e000, 0x50000000, 0x497bc856, 0x0401f000, 0x1c01f000, 0x4068d800, 0x59c17009, 0x48bbc857, 0x59c0e009, 0x8270d500, 0x00e00000, 0x04000019, 0x586cd000, 0x486b4210, @@ -9848,12 +9899,12 @@ static const uint32_t isp_2500_risc_code[] = { 0x0401ff54, 0x80c589c0, 0x040207f6, 0x589d0000, 0x809d3800, 0x1c01f000, 0x59a26000, 0x813261c0, 0x04000009, 0x59325809, 0x812e59c0, 0x04000005, - 0x0201f800, 0x00105dd3, 0x0201f800, 0x00100581, + 0x0201f800, 0x00105e4b, 0x0201f800, 0x00100581, 0x497b4000, 0x59a26001, 0x813261c0, 0x04000009, 0x59325809, 0x812e59c0, 0x04000005, 0x0201f800, - 0x00105dd3, 0x0201f800, 0x00100581, 0x497b4001, + 0x00105e4b, 0x0201f800, 0x00100581, 0x497b4001, 0x1c01f000, 0x809d3840, 0x48813800, 0x40690000, - 0x0201f800, 0x001022fc, 0x0201f800, 0x0010adb2, + 0x0201f800, 0x00102301, 0x0201f800, 0x0010adb2, 0x5880d00b, 0x8068d1c0, 0x04020004, 0x5880d00c, 0x8068d1c0, 0x04000007, 0x59a0d00d, 0x8068d1c0, 0x0402000a, 0x4200d000, 0x00000001, 0x0401f009, @@ -9861,38 +9912,38 @@ static const uint32_t isp_2500_risc_code[] = { 0x8068d1c0, 0x040007f8, 0x0401ffd0, 0x0401f7f6, 0x40698800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x809d3840, 0x48813800, 0x4200d000, 0x000000ef, - 0x0201f800, 0x0010133d, 0x59c4d0a3, 0x8468d55a, - 0x8468d53a, 0x486b88a3, 0x0201f800, 0x001013a5, + 0x0201f800, 0x0010133b, 0x59c4d0a3, 0x8468d55a, + 0x8468d53a, 0x486b88a3, 0x0201f800, 0x001013a3, 0x80c589c0, 0x04000040, 0x4200d000, 0x00000001, - 0x0201f800, 0x0010159b, 0x4200d000, 0x00000001, - 0x0201f800, 0x00101571, 0x4201d000, 0x00000014, - 0x0201f800, 0x00104ec3, 0x59c4d008, 0x8268d540, + 0x0201f800, 0x00101599, 0x4200d000, 0x00000001, + 0x0201f800, 0x0010156f, 0x4201d000, 0x00000014, + 0x0201f800, 0x00104f4f, 0x59c4d008, 0x8268d540, 0x00000280, 0x8268d500, 0xffffffe1, 0x486b8808, 0x4a0388a7, 0x0000f7f7, 0x4a038805, 0x04000001, 0x4200d000, 0xbe20bfff, 0x4200d800, 0x80018000, - 0x0201f800, 0x001036ca, 0x4200d000, 0xfffeffff, - 0x4178d800, 0x0201f800, 0x001036ca, 0x42010000, + 0x0201f800, 0x001036d6, 0x4200d000, 0xfffeffff, + 0x4178d800, 0x0201f800, 0x001036d6, 0x42010000, 0x00001387, 0x0401f008, 0x80817040, 0x04000053, 0x80810040, 0x42000000, 0xffffffff, 0x80817480, 0x04000009, 0x4201d000, 0x00000014, 0x0201f800, - 0x00104ec3, 0x0201f800, 0x001015ca, 0x80c589c0, + 0x00104f4f, 0x0201f800, 0x001015c8, 0x80c589c0, 0x040007f2, 0x59c4d005, 0x8268dd00, 0x04000000, 0x8c68d534, 0x0402001c, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x82697480, 0x00000008, 0x0402003c, - 0x0401f015, 0x0201f800, 0x001013b0, 0x80c589c0, - 0x04000006, 0x4178d000, 0x0201f800, 0x0010159b, - 0x4178d000, 0x0401f7bf, 0x0201f800, 0x001013bb, + 0x0401f015, 0x0201f800, 0x001013ae, 0x80c589c0, + 0x04000006, 0x4178d000, 0x0201f800, 0x00101599, + 0x4178d000, 0x0401f7bf, 0x0201f800, 0x001013b9, 0x80c589c0, 0x04000026, 0x4200d000, 0x00000002, - 0x0201f800, 0x0010159b, 0x4200d000, 0x00000002, + 0x0201f800, 0x00101599, 0x4200d000, 0x00000002, 0x0401f7b4, 0x4200d000, 0x00020000, 0x0201f800, - 0x001036d1, 0x4201d000, 0x00000064, 0x0201f800, - 0x00104ec3, 0x4200d000, 0xfeffffff, 0x4200d800, - 0x02000000, 0x0201f800, 0x001036ca, 0x4200d000, - 0xfdffffff, 0x4178d800, 0x0201f800, 0x001036ca, + 0x001036dd, 0x4201d000, 0x00000064, 0x0201f800, + 0x00104f4f, 0x4200d000, 0xfeffffff, 0x4200d800, + 0x02000000, 0x0201f800, 0x001036d6, 0x4200d000, + 0xfdffffff, 0x4178d800, 0x0201f800, 0x001036d6, 0x4a038805, 0x04000001, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x4178d800, 0x8068d1c0, 0x0402000c, 0x4200d800, 0x00000001, 0x0401f009, 0x4200d000, - 0x00000003, 0x0201f800, 0x0010159b, 0x4200d000, + 0x00000003, 0x0201f800, 0x00101599, 0x4200d000, 0x00000003, 0x0401f78f, 0x40c4d800, 0x406d8800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000003, 0x48813800, 0x48853801, 0x48893802, @@ -9917,7 +9968,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x829d3c00, 0x00000003, 0x1c01f000, 0x809d3840, 0x48813800, 0x40690000, 0x497bc856, 0x4203a000, 0x00007600, 0x4200d000, 0x00000040, 0x0201f800, - 0x00101058, 0x4a03a00a, 0x00000001, 0x4a03a005, + 0x00101056, 0x4a03a00a, 0x00000001, 0x4a03a005, 0x20000000, 0x59d0d006, 0x4a03a005, 0x30000000, 0x59d0d006, 0x8c68d50a, 0x040207fe, 0x59a0d20d, 0x48690005, 0x8068d1c0, 0x04020002, 0x0401f06d, @@ -9926,7 +9977,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x59a0da0e, 0x406c0000, 0x8068d540, 0x48690006, 0x59a0d40c, 0x8068d0e0, 0x59a0da0c, 0x826c0500, 0x0000fffc, 0x8068d540, 0x48690009, 0x486ba003, - 0x0201f800, 0x00105e04, 0x40c66000, 0x80c589c0, + 0x0201f800, 0x00105e80, 0x40c66000, 0x80c589c0, 0x0400004c, 0x49334001, 0x0201f800, 0x00100565, 0x40c65800, 0x80c589c0, 0x0400003e, 0x4a025a05, 0x00000018, 0x4a025806, 0x00abcdef, 0x492e6009, @@ -9946,7 +9997,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x040207fb, 0x4871000a, 0x486d0005, 0x0401f7e9, 0x4200d000, 0x0010b2c7, 0x4200d800, 0x00100565, 0x4080e000, 0x0201f800, 0x001001e3, 0x0401f7bc, - 0x4200d000, 0x0010b2c7, 0x4200d800, 0x00105e04, + 0x4200d000, 0x0010b2c7, 0x4200d800, 0x00105e80, 0x4080e000, 0x0201f800, 0x001001e3, 0x0401f7ae, 0x589d0000, 0x809d3800, 0x1c01f000, 0x809d3840, 0x48813800, 0x40690000, 0x497bc856, 0x42038000, @@ -9959,7 +10010,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x59a0da0f, 0x406c0000, 0x8068d540, 0x48690006, 0x59a0d40c, 0x8068d0e0, 0x59a0da0c, 0x826c0500, 0x0000fffc, 0x8068d540, 0x48690009, 0x486bc857, - 0x58817009, 0x48bb8003, 0x0201f800, 0x00105e04, + 0x58817009, 0x48bb8003, 0x0201f800, 0x00105e80, 0x40c66000, 0x80c589c0, 0x04000057, 0x49334000, 0x0201f800, 0x00100565, 0x40c65800, 0x80c589c0, 0x04000049, 0x4a025a05, 0x00000018, 0x4a025806, @@ -9983,16 +10034,16 @@ static const uint32_t isp_2500_risc_code[] = { 0x0401f011, 0x4200d000, 0x0010b34f, 0x4200d800, 0x00100565, 0x4080e000, 0x0201f800, 0x001001e3, 0x0401f7b1, 0x4200d000, 0x0010b34f, 0x4200d800, - 0x00105e04, 0x4080e000, 0x0201f800, 0x001001e3, + 0x00105e80, 0x4080e000, 0x0201f800, 0x001001e3, 0x0401f7a3, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, - 0x40690800, 0x406d0000, 0x0201f800, 0x0010160d, + 0x40690800, 0x406d0000, 0x0201f800, 0x0010160b, 0x40800000, 0x4084d000, 0x80c4dd00, 0x0201f800, - 0x00101614, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00101612, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690800, 0x406d0000, - 0x0201f800, 0x0010160d, 0x40800000, 0x4084d000, - 0x80c4dd40, 0x0201f800, 0x00101614, 0x589d0801, + 0x0201f800, 0x0010160b, 0x40800000, 0x4084d000, + 0x80c4dd40, 0x0201f800, 0x00101612, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x809d3840, 0x48a13800, 0x829d3c80, 0x0000000f, 0x409d4000, 0x829d3c80, 0x00000005, 0x48813800, @@ -10001,22 +10052,22 @@ static const uint32_t isp_2500_risc_code[] = { 0x59c51808, 0x59c52080, 0x8d0e1d0e, 0x040200a3, 0x59a0d407, 0x8268dd00, 0x00000007, 0x826d7480, 0x00000002, 0x040000aa, 0x806cd9c0, 0x04000006, - 0x806d7040, 0x04000144, 0x0201f800, 0x00101c0d, + 0x806d7040, 0x04000144, 0x0201f800, 0x00101c0f, 0x0401f17f, 0x4200d000, 0x00000802, 0x4200d800, 0x00000002, 0x0401ffc9, 0x0401fdc2, 0x80c589c0, 0x04000144, 0x59a0d410, 0x8068d0e0, 0x59a0da10, 0x406c0000, 0x8068d540, 0x48694000, 0x497b4408, 0x4979400b, 0x4979400c, 0x4979400d, 0x49794002, - 0x49794001, 0x0201f800, 0x001022e3, 0x0201f800, - 0x0010306d, 0x80c589c0, 0x040000fe, 0x0201f800, - 0x0010512e, 0x598e600b, 0x0201f800, 0x001053cb, - 0x0201f800, 0x0010512e, 0x417a3000, 0x0201f800, - 0x0010560b, 0x59926005, 0x813261c0, 0x0400000d, - 0x0201f800, 0x001052fc, 0x0201f800, 0x00105102, - 0x0201f800, 0x00105108, 0x42027800, 0x00001000, - 0x42028000, 0x0000002e, 0x0201f800, 0x0010ba4a, + 0x49794001, 0x0201f800, 0x001022e8, 0x0201f800, + 0x00103071, 0x80c589c0, 0x040000fe, 0x0201f800, + 0x001051ba, 0x598e600b, 0x0201f800, 0x00105457, + 0x0201f800, 0x001051ba, 0x417a3000, 0x0201f800, + 0x00105697, 0x59926005, 0x813261c0, 0x0400000d, + 0x0201f800, 0x00105388, 0x0201f800, 0x0010518e, + 0x0201f800, 0x00105194, 0x42027800, 0x00001000, + 0x42028000, 0x0000002e, 0x0201f800, 0x0010ba5a, 0x811a3000, 0x83197480, 0x00000004, 0x040007ec, - 0x040017eb, 0x0201f800, 0x001007cf, 0x49794004, + 0x040017eb, 0x0201f800, 0x001007cd, 0x49794004, 0x497b4002, 0x40a0d000, 0x0401feed, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000138, 0x40a0d000, 0x0401fe5f, 0x59a0d408, 0x82697480, 0x0000dddd, @@ -10032,21 +10083,21 @@ static const uint32_t isp_2500_risc_code[] = { 0x04000028, 0x40a0d000, 0x0401fcce, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000022, 0x0201f800, 0x0010ada0, 0x59c4d005, 0x8c68d534, 0x0402003c, - 0x0201f800, 0x001022ea, 0x80c589c0, 0x040200e4, + 0x0201f800, 0x001022ef, 0x80c589c0, 0x040200e4, 0x59a0d00d, 0x8068d1c0, 0x04000016, 0x59a26000, 0x59a0d40d, 0x8068d1c0, 0x04000004, 0x5930d00f, 0x8068d1c0, 0x040207c7, 0x59a26001, 0x59a0d20d, 0x8068d1c0, 0x04000004, 0x5930d00f, 0x8068d1c0, 0x040207c0, 0x58a0d002, 0x8068d1c0, 0x040207bd, 0x58a0d001, 0x8068d1c0, 0x040207ba, 0x0401fcff, - 0x58a0e00e, 0x0401f024, 0x0201f800, 0x001013d1, + 0x58a0e00e, 0x0401f024, 0x0201f800, 0x001013cf, 0x80c589c0, 0x0400075b, 0x4200d000, 0x00000003, - 0x0201f800, 0x0010159b, 0x4200d000, 0x00000003, - 0x0201f800, 0x00101571, 0x0401f752, 0x8d0e1d0e, - 0x0402000c, 0x0201f800, 0x001040d9, 0x80c589c0, + 0x0201f800, 0x00101599, 0x4200d000, 0x00000003, + 0x0201f800, 0x0010156f, 0x0401f752, 0x8d0e1d0e, + 0x0402000c, 0x0201f800, 0x0010410f, 0x80c589c0, 0x040200bf, 0x836d7480, 0x00000003, 0x04020005, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x0400075a, - 0x0201f800, 0x00101c11, 0x0401f0cd, 0x4a01400d, + 0x0201f800, 0x00101c13, 0x0401f0cd, 0x4a01400d, 0x0000bbbb, 0x4a01400e, 0x00000001, 0x4200e000, 0x00000001, 0x58a0d000, 0x8068d040, 0x48694000, 0x4200d800, 0x00030d40, 0x80717040, 0x04020004, @@ -10056,7 +10107,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x04020003, 0x0201f800, 0x0010b0d5, 0x4a01400d, 0x0000dddd, 0x40a0d000, 0x0401fcd7, 0x80c589c0, 0x04020004, 0x58a0d000, 0x8068d1c0, 0x04020764, - 0x0201f800, 0x00103089, 0x0201f800, 0x00105456, + 0x0201f800, 0x0010308d, 0x0201f800, 0x001054e2, 0x0201f800, 0x0010ada6, 0x4201d000, 0x000186a0, 0x48938880, 0x488f8808, 0x488b88a3, 0x4883500f, 0x48879040, 0x42038000, 0x00007700, 0x4a038009, @@ -10066,16 +10117,16 @@ static const uint32_t isp_2500_risc_code[] = { 0x82697480, 0x00000002, 0x04000010, 0x4200d000, 0x00000802, 0x4200d800, 0xfffffffc, 0x0401fec1, 0x4200d000, 0x0000240c, 0x4200d800, 0xffffff7f, - 0x0401febc, 0x0201f800, 0x001040ef, 0x40c50000, + 0x0401febc, 0x0201f800, 0x00104125, 0x40c50000, 0x80c589c0, 0x04000067, 0x59a0d408, 0x82697480, 0x0000dddd, 0x0400000f, 0x58a0d80b, 0x806cd9c0, 0x04020007, 0x58a0d00c, 0x8068d1c0, 0x04020004, 0x58a0d00d, 0x8068d1c0, 0x0400006b, 0x486f4407, 0x58a0d00c, 0x486b4208, 0x58a0d00d, 0x486b4408, - 0x0201f800, 0x00101c19, 0x0401f065, 0x59c8d001, + 0x0201f800, 0x00101c1b, 0x0401f065, 0x59c8d001, 0x8068d1c0, 0x04020738, 0x40a0d000, 0x0201f800, 0x0010b07e, 0x59a0d408, 0x82697480, 0x0000dddd, - 0x04000731, 0x0201f800, 0x001022ea, 0x80c589c0, + 0x04000731, 0x0201f800, 0x001022ef, 0x80c589c0, 0x040007f3, 0x0201f800, 0x0010b0d5, 0x4a01400d, 0x0000aaaa, 0x4a01400e, 0x00000001, 0x0401f726, 0x40a0d000, 0x0201f800, 0x0010b0e3, 0x80c589c0, @@ -10092,98 +10143,102 @@ static const uint32_t isp_2500_risc_code[] = { 0x8068d1c0, 0x04020774, 0x0401f77a, 0x4a01400d, 0x0000cccc, 0x58a0d000, 0x486b4210, 0x58a0d000, 0x8068d120, 0x486b4410, 0x0401f74f, 0x4a034407, - 0x00000016, 0x0201f800, 0x00101c09, 0x0401f014, + 0x00000016, 0x0201f800, 0x00101c0b, 0x0401f014, 0x4a0388a7, 0x0000f7f7, 0x4200d000, 0xbeffffff, - 0x4200d800, 0x80018000, 0x0201f800, 0x001036ca, + 0x4200d800, 0x80018000, 0x0201f800, 0x001036d6, 0x4200d000, 0xfffeffff, 0x4080d800, 0x0201f800, - 0x001036ca, 0x0401f78d, 0x40a0d000, 0x0401fc2e, - 0x0401f75c, 0x0201f800, 0x00101bc7, 0x589d2004, + 0x001036d6, 0x0401f78d, 0x40a0d000, 0x0401fc2e, + 0x0401f75c, 0x0201f800, 0x00101bc9, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000014, 0x589d4000, 0x809d3800, 0x1c01f000, 0x4937c857, 0x5934d200, 0x8468d502, - 0x486a6a00, 0x1c01f000, 0x809d3840, 0x48813800, + 0x486a6a00, 0x1c01f000, 0x829d3c80, 0x00000002, + 0x48813800, 0x48853801, 0x59a8d006, 0x82690d00, + 0x00004000, 0x4178d800, 0x8c68d51c, 0x0402001f, 0x4937c857, 0x42010000, 0x00000001, 0x0201f800, - 0x00105e04, 0x40c66000, 0x80c589c0, 0x04000014, - 0x4935880a, 0x48818c07, 0x417a7800, 0x0201f800, - 0x001038ff, 0x59a8d016, 0x8068d000, 0x486b5016, - 0x599cd019, 0x417a7000, 0x8c68d50e, 0x04020003, - 0x42027000, 0x00000004, 0x0201f800, 0x00105e2e, - 0x599cd208, 0x486a6c12, 0x41790000, 0x40818800, - 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, - 0x00000004, 0x48813800, 0x48853801, 0x48893802, - 0x488d3803, 0x41350800, 0x41451000, 0x412d1800, - 0x4943c857, 0x493fc857, 0x0201f800, 0x0010512e, - 0x40c50000, 0x0201f800, 0x0010bcd9, 0x0201f800, - 0x0010bcc9, 0x0201f800, 0x0010bd73, 0x0201f800, - 0x0010beb7, 0x808101c0, 0x04000003, 0x0201f800, - 0x0010511f, 0x417a8800, 0x0401f00a, 0x58c4d200, - 0x8c68d50e, 0x0400000e, 0x81468800, 0x83457480, - 0x000007ef, 0x83f17500, 0x03000000, 0x04000026, - 0x0201f800, 0x001039c0, 0x40c66800, 0x80c589c0, - 0x040007f6, 0x8d3e7d06, 0x040207f1, 0x8d3e7d18, - 0x0400003f, 0x5935000f, 0x0401f007, 0x49410207, - 0x40825800, 0x58810000, 0x492fc857, 0x0201f800, - 0x0002032c, 0x808101c0, 0x040207f9, 0x497a680f, - 0x497a6810, 0x4937c857, 0x4a026c00, 0x00000707, - 0x497a6a03, 0x497a6811, 0x599cd401, 0x486a6a0b, - 0x5934d402, 0x8268d500, 0x000000ff, 0x486a6c02, - 0x81468800, 0x83457480, 0x000007ef, 0x040007dd, - 0x040017dc, 0x8d3e7d02, 0x0400002a, 0x497b5018, - 0x42028800, 0x000007f0, 0x0401f007, 0x81468800, - 0x83457480, 0x000007ff, 0x83f17500, 0x03000000, - 0x04000020, 0x0201f800, 0x001039c0, 0x40c66800, - 0x80c589c0, 0x040007f6, 0x48c7c857, 0x4a018c00, - 0x00000707, 0x58c4d00c, 0x8068d1c0, 0x040207f0, - 0x58c4d00f, 0x8068d1c0, 0x040207ed, 0x0201f800, - 0x001036fe, 0x81468800, 0x83457480, 0x000007ff, - 0x040007ed, 0x040017ec, 0x0401f00a, 0x4937c857, - 0x8d0e1d20, 0x04000004, 0x4a026c00, 0x00000707, - 0x0401f7ae, 0x0201f800, 0x001036fe, 0x0401f7ab, - 0x40866800, 0x408a8800, 0x408e5800, 0x589d1803, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000004, 0x1c01f000, 0x829d3c80, 0x00000006, - 0x48813800, 0x48853801, 0x48893802, 0x488d3803, - 0x48913804, 0x48953805, 0x41352800, 0x41412000, - 0x41451800, 0x412d1000, 0x4933c857, 0x493fc857, - 0x0201f800, 0x0010512e, 0x40c50800, 0x5932680a, - 0x813669c0, 0x0400002a, 0x5934d403, 0x406a8800, - 0x42028000, 0x00000029, 0x0201f800, 0x0010bb8e, - 0x0201f800, 0x0010bc6a, 0x0201f800, 0x0010bd03, - 0x0201f800, 0x0010c0f3, 0x4937c857, 0x8d3e7d06, - 0x0402001e, 0x8d3e7d18, 0x04000021, 0x5935000f, - 0x808101c0, 0x0400000b, 0x49410207, 0x40825800, - 0x58810000, 0x492fc857, 0x0201f800, 0x0002032c, - 0x808101c0, 0x040207f9, 0x4882680f, 0x48826810, - 0x4937c857, 0x4a026c00, 0x00000707, 0x497a6a03, - 0x497a6811, 0x599cd401, 0x486a6a0b, 0x5934d402, - 0x8268d500, 0x000000ff, 0x486a6c02, 0x808509c0, - 0x04000013, 0x0401f00c, 0x5934d200, 0x8c68d50e, - 0x040207fb, 0x8d3e7d18, 0x040207e1, 0x8d0e1d20, + 0x00105e80, 0x40c66000, 0x80c589c0, 0x04020003, + 0x4080d800, 0x0401f015, 0x4935880a, 0x48818c07, + 0x40867800, 0x0201f800, 0x0010390b, 0x59a8d016, + 0x8068d000, 0x486b5016, 0x599cd019, 0x40867000, + 0x8c68d50e, 0x04020003, 0x42027000, 0x00000004, + 0x0201f800, 0x00105eaa, 0x599cd208, 0x486a6c12, + 0x41790000, 0x4080d800, 0x406d8800, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, + 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, + 0x48893802, 0x488d3803, 0x41350800, 0x41451000, + 0x412d1800, 0x4943c857, 0x493fc857, 0x0201f800, + 0x001051ba, 0x40c50000, 0x0201f800, 0x0010bcde, + 0x0201f800, 0x0010bcce, 0x0201f800, 0x0010bd78, + 0x0201f800, 0x0010bebc, 0x808101c0, 0x04000003, + 0x0201f800, 0x001051ab, 0x417a8800, 0x0401f00a, + 0x58c4d200, 0x8c68d50e, 0x0400000e, 0x81468800, + 0x83457480, 0x000007ef, 0x83f17500, 0x03000000, + 0x04000027, 0x0201f800, 0x001039cf, 0x40c66800, + 0x80c589c0, 0x040007f6, 0x8d3e7d06, 0x040207f1, + 0x497a6c0b, 0x8d3e7d18, 0x0400003f, 0x5935000f, + 0x0401f007, 0x49410207, 0x40825800, 0x58810000, + 0x492fc857, 0x0201f800, 0x0002032c, 0x808101c0, + 0x040207f9, 0x497a680f, 0x497a6810, 0x4937c857, + 0x4a026c00, 0x00000707, 0x497a6a03, 0x497a6811, + 0x599cd401, 0x486a6a0b, 0x5934d402, 0x8268d500, + 0x000000ff, 0x486a6c02, 0x81468800, 0x83457480, + 0x000007ef, 0x040007dc, 0x040017db, 0x8d3e7d02, + 0x0400002a, 0x497b5018, 0x42028800, 0x000007f0, + 0x0401f007, 0x81468800, 0x83457480, 0x000007ff, + 0x83f17500, 0x03000000, 0x04000020, 0x0201f800, + 0x001039cf, 0x40c66800, 0x80c589c0, 0x040007f6, + 0x48c7c857, 0x4a018c00, 0x00000707, 0x58c4d00c, + 0x8068d1c0, 0x040207f0, 0x58c4d00f, 0x8068d1c0, + 0x040207ed, 0x0201f800, 0x0010370a, 0x81468800, + 0x83457480, 0x000007ff, 0x040007ed, 0x040017ec, + 0x0401f00a, 0x4937c857, 0x8d0e1d20, 0x04000004, + 0x4a026c00, 0x00000707, 0x0401f7ad, 0x0201f800, + 0x0010370a, 0x0401f7aa, 0x40866800, 0x408a8800, + 0x408e5800, 0x589d1803, 0x589d1002, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000004, 0x1c01f000, + 0x829d3c80, 0x00000006, 0x48813800, 0x48853801, + 0x48893802, 0x488d3803, 0x48913804, 0x48953805, + 0x41352800, 0x41412000, 0x41451800, 0x412d1000, + 0x4933c857, 0x493fc857, 0x0201f800, 0x001051ba, + 0x40c50800, 0x5932680a, 0x813669c0, 0x0400002b, + 0x5934d403, 0x406a8800, 0x42028000, 0x00000029, + 0x0201f800, 0x0010bb9e, 0x0201f800, 0x0010bc6f, + 0x0201f800, 0x0010bd08, 0x0201f800, 0x0010c0ee, + 0x4937c857, 0x8d3e7d06, 0x0402001f, 0x497a6c0b, + 0x8d3e7d18, 0x04000022, 0x5935000f, 0x808101c0, + 0x0400000b, 0x49410207, 0x40825800, 0x58810000, + 0x492fc857, 0x0201f800, 0x0002032c, 0x808101c0, + 0x040207f9, 0x4882680f, 0x48826810, 0x4937c857, + 0x4a026c00, 0x00000707, 0x497a6a03, 0x497a6811, + 0x599cd401, 0x486a6a0b, 0x5934d402, 0x8268d500, + 0x000000ff, 0x486a6c02, 0x808509c0, 0x04000014, + 0x0401f00d, 0x5934d200, 0x8c68d50e, 0x040207fb, + 0x497a6c0b, 0x8d3e7d18, 0x040207e0, 0x8d0e1d20, 0x04000008, 0x4a026c00, 0x00000707, 0x808509c0, - 0x04000007, 0x0201f800, 0x0010511f, 0x0401f004, - 0x0201f800, 0x001036fe, 0x0401f7ed, 0x408a5800, + 0x04000007, 0x0201f800, 0x001051ab, 0x0401f004, + 0x0201f800, 0x0010370a, 0x0401f7ec, 0x408a5800, 0x408e8800, 0x40928000, 0x40966800, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000006, 0x1c01f000, 0x809d3840, 0x48813800, 0x4937c857, 0x42010000, - 0x00000001, 0x0201f800, 0x00105e04, 0x40c66000, + 0x00000001, 0x0201f800, 0x00105e80, 0x40c66000, 0x80c589c0, 0x0400001d, 0x4935880a, 0x5934d403, 0x82697480, 0x000007fe, 0x04000003, 0x417a7800, - 0x0401ff92, 0x48826407, 0x417a7800, 0x0201f800, - 0x001038ff, 0x4200d000, 0x00000003, 0x0201f800, - 0x00103909, 0x836d7480, 0x00000003, 0x04000004, + 0x0401ff90, 0x48826407, 0x417a7800, 0x0201f800, + 0x0010390b, 0x4200d000, 0x00000003, 0x0201f800, + 0x00103915, 0x836d7480, 0x00000003, 0x04000004, 0x59a8d016, 0x8068d000, 0x486b5016, 0x42027000, - 0x00000002, 0x0201f800, 0x00105e2e, 0x599cd208, + 0x00000002, 0x0201f800, 0x00105eaa, 0x599cd208, 0x486a6c12, 0x41790000, 0x40818800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x497bc856, 0x42010000, 0x00000001, 0x48835017, 0x42028800, 0x000007fe, - 0x4200d000, 0x00fffffe, 0x0201f800, 0x0010392e, - 0x40c66800, 0x80c589c0, 0x04000012, 0x0401fec2, + 0x4200d000, 0x00fffffe, 0x0201f800, 0x0010393d, + 0x40c66800, 0x80c589c0, 0x04000012, 0x0401feb2, 0x0401ffc4, 0x40c50800, 0x80c589c0, 0x0402000d, 0x599cd208, 0x486a6c12, 0x59a8d21b, 0x8268d500, 0xffffdefc, 0x486b521b, 0x59a8d21b, 0x8468d54e, - 0x486b521b, 0x0201f800, 0x0010737f, 0x40850000, + 0x486b521b, 0x0201f800, 0x00107415, 0x40850000, 0x40818800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, @@ -10193,58 +10248,58 @@ static const uint32_t isp_2500_risc_code[] = { 0x83f17500, 0x03000000, 0x04000044, 0x406d1000, 0x497bc856, 0x406c0000, 0x4200d000, 0x0000007e, 0x8068b480, 0x8058b1c0, 0x0400003c, 0x42012000, - 0x00101a21, 0x0401f014, 0x42010800, 0x00000001, - 0x0201f800, 0x00103e6d, 0x0201f800, 0x00103c32, + 0x00101a23, 0x0401f014, 0x42010800, 0x00000001, + 0x0201f800, 0x00103e85, 0x0201f800, 0x00103c47, 0x80c57040, 0x04000034, 0x59a8d06f, 0x8c68d502, 0x04020041, 0x4937c857, 0x599cd019, 0x8c68d50e, 0x04000066, 0x8058b040, 0x80891000, 0x8058b1c0, 0x04000026, 0x40880000, 0x8090d400, 0x5868d000, 0x82690500, 0x000000ff, 0x408c0000, 0x80817480, - 0x040007f5, 0x4080d000, 0x0201f800, 0x0010c750, + 0x040007f5, 0x4080d000, 0x0201f800, 0x0010c758, 0x80c589c0, 0x0400005e, 0x59a8d086, 0x8c68d502, 0x04000007, 0x4200d000, 0x00000010, 0x0201f800, - 0x00103e6e, 0x80c57040, 0x04000010, 0x41790800, - 0x0201f800, 0x001039c0, 0x80c589c0, 0x040207d3, + 0x00103e86, 0x80c57040, 0x04000010, 0x41790800, + 0x0201f800, 0x001039cf, 0x80c589c0, 0x040207d3, 0x599cd019, 0x8c68d50e, 0x040207df, 0x4080d000, - 0x0201f800, 0x00103934, 0x80c589c0, 0x040207cd, + 0x0201f800, 0x00103943, 0x80c589c0, 0x040207cd, 0x488b5017, 0x0401f048, 0x4a035017, 0x0000ffff, 0x0401f045, 0x8d0e1d02, 0x04020034, 0x59a8d06f, - 0x8c68d500, 0x04000005, 0x0201f800, 0x001019e9, - 0x80c57040, 0x040007cc, 0x0401fe4c, 0x80c57040, + 0x8c68d500, 0x04000005, 0x0201f800, 0x001019eb, + 0x80c57040, 0x040007cc, 0x0401fe3c, 0x80c57040, 0x040207c9, 0x0401f7ef, 0x4200b000, 0x0000007e, - 0x0401f7b1, 0x0201f800, 0x00103c5e, 0x40c50000, + 0x0401f7b1, 0x0201f800, 0x00103c73, 0x40c50000, 0x80c589c0, 0x040207c0, 0x808509c0, 0x04000029, - 0x0201f800, 0x001019e9, 0x80c57040, 0x040007ba, - 0x42026000, 0x0010cc5c, 0x4936600a, 0x48826009, - 0x40827800, 0x0401fed5, 0x4200d000, 0x001097f8, - 0x0201f800, 0x00108894, 0x8d0e1d20, 0x040007ae, + 0x0201f800, 0x001019eb, 0x80c57040, 0x040007ba, + 0x42026000, 0x0010cc6c, 0x4936600a, 0x48826009, + 0x40827800, 0x0401fed3, 0x4200d000, 0x00109878, + 0x0201f800, 0x0010895e, 0x8d0e1d20, 0x040007ae, 0x41450000, 0x41410800, 0x5934d403, 0x406a8800, 0x42028000, 0x00000029, 0x4178d000, 0x4200d800, - 0x00000008, 0x0201f800, 0x001082e7, 0x40828800, + 0x00000008, 0x0201f800, 0x00108398, 0x40828800, 0x40868000, 0x0401f7a0, 0x5934d200, 0x8c68d50e, - 0x04000796, 0x0401f7ca, 0x0401fe17, 0x0401ff19, + 0x04000796, 0x0401f7ca, 0x0401fe07, 0x0401ff19, 0x80c57040, 0x04020798, 0x488b5017, 0x0401f796, - 0x0201f800, 0x00103998, 0x0401f793, 0x4937c857, + 0x0201f800, 0x001039a7, 0x0401f793, 0x4937c857, 0x0401f7b8, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000005, 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x59a8d00f, 0x82691d00, 0x000000ff, 0x59a90817, 0x82857480, 0x0000ffff, 0x0400006a, 0x41791000, - 0x42012000, 0x001098d3, 0x80840104, 0x8090d400, + 0x42012000, 0x00109953, 0x80840104, 0x8090d400, 0x5868d000, 0x8284dd00, 0x00000003, 0x826d7480, 0x00000002, 0x04000057, 0x826d7480, 0x00000002, 0x83f17500, 0x03000000, 0x04000030, 0x806d7040, 0x04000052, 0x82690500, 0x000000ff, 0x82817480, 0x000000ff, 0x04000032, 0x40800000, 0x4200d000, - 0x00101a21, 0x8068d400, 0x5868d000, 0x8068d110, + 0x00101a23, 0x8068d400, 0x5868d000, 0x8068d110, 0x82697480, 0x00000080, 0x0400001c, 0x408c0000, 0x80817480, 0x04000019, 0x808101c0, 0x04000017, 0x59a8d086, 0x8c68d502, 0x04000007, 0x4200d000, - 0x00000010, 0x0201f800, 0x00103e6e, 0x80c57040, + 0x00000010, 0x0201f800, 0x00103e86, 0x80c57040, 0x0400003f, 0x417a8800, 0x4080d000, 0x0201f800, - 0x0010c7c9, 0x80c589c0, 0x0400002c, 0x0201f800, - 0x0010397b, 0x80c589c0, 0x0402002e, 0x599cd019, + 0x0010c7d1, 0x80c589c0, 0x0400002c, 0x0201f800, + 0x0010398a, 0x80c589c0, 0x0402002e, 0x599cd019, 0x8c68d50e, 0x0400001a, 0x80850800, 0x80897040, 0x040207c6, 0x0401f030, 0x826d7480, 0x00000003, 0x040207d1, 0x8068d130, 0x82690500, 0x000000ff, @@ -10252,11 +10307,11 @@ static const uint32_t isp_2500_risc_code[] = { 0x00000003, 0x04020022, 0x59a8d06f, 0x8468d542, 0x486b506f, 0x4a035017, 0x0000ffff, 0x0401fefb, 0x42011000, 0x00000001, 0x0401f7e9, 0x4080d000, - 0x0201f800, 0x0010392e, 0x80c589c0, 0x04000007, - 0x0201f800, 0x00103e6d, 0x0401fd9b, 0x0401fe9d, + 0x0201f800, 0x0010393d, 0x80c589c0, 0x04000007, + 0x0201f800, 0x00103e85, 0x0401fd8b, 0x0401fe9d, 0x80c589c0, 0x040007dd, 0x48875017, 0x0401f00e, 0x8068d120, 0x0401f7b0, 0x8068d110, 0x0401f7ae, - 0x0201f800, 0x00103e6d, 0x0401fd94, 0x0401f7f5, + 0x0201f800, 0x00103e85, 0x0401fd84, 0x0401f7f5, 0x42010800, 0x00000001, 0x0401f795, 0x4a035017, 0x0000ffff, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000005, @@ -10264,18 +10319,18 @@ static const uint32_t isp_2500_risc_code[] = { 0x0000ffff, 0x0401f009, 0x59a8d06f, 0x8c68d500, 0x04000003, 0x8c68d502, 0x04000003, 0x0401fecb, 0x0401f002, 0x0401ff70, 0x1c01f000, 0x809d3840, - 0x48813800, 0x59a9021b, 0x0201f800, 0x00103baa, + 0x48813800, 0x59a9021b, 0x0201f800, 0x00103bbd, 0x80c589c0, 0x04000002, 0x0401f01d, 0x0201f800, - 0x001040d9, 0x80c589c0, 0x04000007, 0x8c810500, + 0x0010410f, 0x80c589c0, 0x04000007, 0x8c810500, 0x0402000a, 0x8c81050e, 0x040207f8, 0x0401fe8f, 0x0401f013, 0x8c810506, 0x040207f9, 0x4080d000, - 0x0401ffdd, 0x0401f00e, 0x0201f800, 0x00101a18, - 0x80c589c0, 0x040207ed, 0x0201f800, 0x001040d9, + 0x0401ffdd, 0x0401f00e, 0x0201f800, 0x00101a1a, + 0x80c589c0, 0x040207ed, 0x0201f800, 0x0010410f, 0x80c589c0, 0x04000004, 0x4a035017, 0x0000ffff, 0x0401f003, 0x4080d000, 0x0401ffcf, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000003, 0x48813800, 0x48853801, 0x48893802, 0x40690800, - 0x406d1000, 0x40d50000, 0x0201f800, 0x00105108, + 0x406d1000, 0x40d50000, 0x0201f800, 0x00105194, 0x5880d02f, 0x41300000, 0x80697480, 0x04000018, 0x5880d02e, 0x41300000, 0x80697480, 0x0400001f, 0x5930d800, 0x806cd9c0, 0x04020008, 0x59317001, @@ -10299,7 +10354,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x48a13800, 0x829d3c80, 0x00000005, 0x409d4000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x41790800, - 0x40850000, 0x4933c857, 0x0201f800, 0x0010512e, + 0x40850000, 0x4933c857, 0x0201f800, 0x001051ba, 0x40c52000, 0x41351800, 0x41191000, 0x49914003, 0x49d14000, 0x49a54001, 0x49154002, 0x48d94004, 0x5932680a, 0x58d4e02f, 0x4070d800, 0x8070e1c0, @@ -10311,45 +10366,45 @@ static const uint32_t isp_2500_risc_code[] = { 0x0401f005, 0x406d0000, 0x586cd801, 0x806cd9c0, 0x040007ec, 0x806d7480, 0x040207fb, 0x42010800, 0x00000001, 0x806cd9c0, 0x040207e8, 0x80857040, - 0x04000020, 0x417a3000, 0x0201f800, 0x0010560b, + 0x04000020, 0x417a3000, 0x0201f800, 0x00105697, 0x5990d005, 0x41300000, 0x80697480, 0x04000010, 0x811a3000, 0x83197480, 0x00000004, 0x040007f7, 0x040017f6, 0x408a3000, 0x408e6800, 0x58a32003, 0x58a3a000, 0x58a34801, 0x58a22802, 0x58a1b004, 0x80917040, 0x04020011, 0x0401f00e, 0x42010800, - 0x00000001, 0x0201f800, 0x001052fc, 0x0201f800, - 0x00105102, 0x0201f800, 0x00105108, 0x0401f7ee, + 0x00000001, 0x0201f800, 0x00105388, 0x0201f800, + 0x0010518e, 0x0201f800, 0x00105194, 0x0401f7ee, 0x4070d000, 0x4080d800, 0x0401ff48, 0x0401f7ea, - 0x0201f800, 0x0010511f, 0x40858800, 0x589d2004, + 0x0201f800, 0x001051ab, 0x40858800, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x0000000a, 0x589d4000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, 0x59310800, 0x497a6000, - 0x0201f800, 0x00105108, 0x808101c0, 0x04000008, + 0x0201f800, 0x00105194, 0x808101c0, 0x04000008, 0x48850000, 0x598cd008, 0x41300000, 0x80697480, 0x0402000b, 0x48831808, 0x0401f009, 0x598cd008, 0x41300000, 0x80697480, 0x04000003, 0x48871809, 0x0401f003, 0x48831808, 0x48831809, 0x0201f800, - 0x00105118, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x001051a4, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x598d0009, 0x41790800, 0x4933c857, 0x813261c0, 0x04020007, 0x0401f00a, 0x41300000, 0x80817480, 0x0400000e, 0x40810800, 0x58810000, 0x808101c0, 0x040207fa, 0x4178d000, - 0x0401f015, 0x4200d000, 0x000005a7, 0x4080d800, + 0x0401f015, 0x4200d000, 0x000005aa, 0x4080d800, 0x4084e000, 0x0201f800, 0x001001e3, 0x0401f7f6, 0x4084d000, 0x0401ffc4, 0x598cd00b, 0x41300000, 0x80697480, 0x04000005, 0x497a6008, 0x4200d000, - 0x00000001, 0x0401f004, 0x0201f800, 0x001055f3, + 0x00000001, 0x0401f004, 0x0201f800, 0x0010567f, 0x0401f7fa, 0x40698800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, - 0x59310800, 0x497a6000, 0x0201f800, 0x00105108, + 0x59310800, 0x497a6000, 0x0201f800, 0x00105194, 0x808101c0, 0x04000008, 0x48850000, 0x598cd006, 0x41300000, 0x80697480, 0x0402000b, 0x48831806, 0x0401f009, 0x598cd006, 0x41300000, 0x80697480, 0x04000003, 0x48871807, 0x0401f003, 0x48831806, - 0x48831807, 0x0201f800, 0x00105118, 0x589d0801, + 0x48831807, 0x0201f800, 0x001051a4, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x598d0007, 0x41790800, 0x4933c857, 0x813261c0, @@ -10359,41 +10414,41 @@ static const uint32_t isp_2500_risc_code[] = { 0x0401ffcb, 0x598cd00b, 0x41300000, 0x80697480, 0x04000011, 0x5930d403, 0x82697480, 0x00000042, 0x0400000b, 0x4200d000, 0x00000001, 0x0401f00d, - 0x4200d000, 0x0000055e, 0x4080d800, 0x4084e000, + 0x4200d000, 0x00000561, 0x4080d800, 0x4084e000, 0x0201f800, 0x001001e3, 0x0401f7e9, 0x497a6008, - 0x0401f7f5, 0x0201f800, 0x001055f3, 0x0401f7ee, + 0x0401f7f5, 0x0201f800, 0x0010567f, 0x0401f7ee, 0x40698800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, 0x59310800, - 0x497a6000, 0x0201f800, 0x00105108, 0x808101c0, + 0x497a6000, 0x0201f800, 0x00105194, 0x808101c0, 0x04000008, 0x48850000, 0x598cd002, 0x41300000, 0x80697480, 0x0402000b, 0x48831802, 0x0401f009, 0x598cd002, 0x41300000, 0x80697480, 0x04000003, 0x48871803, 0x0401f003, 0x48831802, 0x48831803, - 0x0201f800, 0x00105118, 0x589d0801, 0x589d0000, + 0x0201f800, 0x001051a4, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x598d0003, 0x40810800, 0x4933c857, 0x813261c0, 0x04020007, 0x0401f022, 0x41300000, 0x80817480, 0x04000007, 0x40810800, 0x58810000, 0x808101c0, 0x040207fa, 0x4178d000, 0x0401f02b, 0x598cd00b, 0x80697480, - 0x04000025, 0x0201f800, 0x00105108, 0x598cd003, + 0x04000025, 0x0201f800, 0x00105194, 0x598cd003, 0x40800000, 0x80697480, 0x04000017, 0x598cd002, 0x80697480, 0x04000009, 0x58817000, 0x48b90800, - 0x49790000, 0x0201f800, 0x00105118, 0x4200d000, + 0x49790000, 0x0201f800, 0x001051a4, 0x4200d000, 0x00000001, 0x0401f017, 0x48871802, 0x49790000, - 0x49790800, 0x0401f7f8, 0x4200d000, 0x000005ea, + 0x49790800, 0x0401f7f8, 0x4200d000, 0x000005ed, 0x4080d800, 0x4080e000, 0x0201f800, 0x001001e3, 0x0401f7de, 0x58817000, 0x48bb1803, 0x49790000, 0x598cd002, 0x80697480, 0x040207eb, 0x497b1802, - 0x0401f7e9, 0x0201f800, 0x001055f3, 0x0401f7da, + 0x0401f7e9, 0x0201f800, 0x0010567f, 0x0401f7da, 0x40698800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x41790000, 0x0201f800, - 0x0010512e, 0x40c50800, 0x0401ff62, 0x80c57040, + 0x001051ba, 0x40c50800, 0x0401ff62, 0x80c57040, 0x04000007, 0x0401ff11, 0x80c57040, 0x04000004, 0x0401ffaf, 0x80c57040, 0x04020002, 0x40c50000, - 0x80857040, 0x04020003, 0x0201f800, 0x0010511f, + 0x80857040, 0x04020003, 0x0201f800, 0x001051ab, 0x40818800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x5c00d000, 0x4c680000, @@ -10401,42 +10456,42 @@ static const uint32_t isp_2500_risc_code[] = { 0x59325809, 0x4933c857, 0x4943c857, 0x493fc857, 0x5930d407, 0x486bc857, 0x5930dc07, 0x806c0040, 0x4000d000, 0x82697480, 0x00000010, 0x83f17500, - 0x03000000, 0x04000013, 0x0c01f001, 0x0010baaf, - 0x0010ba87, 0x0010ba95, 0x0010baaf, 0x0010bab8, - 0x0010bac5, 0x0010ba74, 0x0010ba74, 0x0010ba74, - 0x0010bacf, 0x0010ba74, 0x0010ba74, 0x0010ba74, - 0x0010ba74, 0x0010ba74, 0x0010ba7a, 0x0010ba7a, - 0x4200d000, 0x00000a6e, 0x4130e000, 0x0201f800, - 0x001001e3, 0x0401f08b, 0x0201f800, 0x001070df, + 0x03000000, 0x04000013, 0x0c01f001, 0x0010babf, + 0x0010ba97, 0x0010baa5, 0x0010babf, 0x0010bac8, + 0x0010bad5, 0x0010ba84, 0x0010ba84, 0x0010ba84, + 0x0010badf, 0x0010ba84, 0x0010ba84, 0x0010ba84, + 0x0010ba84, 0x0010ba84, 0x0010ba8a, 0x0010ba8a, + 0x4200d000, 0x00000a7f, 0x4130e000, 0x0201f800, + 0x001001e3, 0x0401f08b, 0x0201f800, 0x00107175, 0x80c589c0, 0x0402005b, 0x59325819, 0x0201f800, - 0x00100581, 0x0201f800, 0x00105dd5, 0x8d3e7d1c, + 0x00100581, 0x0201f800, 0x00105e4d, 0x8d3e7d1c, 0x04000080, 0x497a600a, 0x0401f07e, 0x0201f800, - 0x001070df, 0x80c589c0, 0x040007f7, 0x49425a07, + 0x00107175, 0x80c589c0, 0x040007f7, 0x49425a07, 0x0201f800, 0x0002032c, 0x5930d21f, 0x82697480, - 0x00000003, 0x040207f0, 0x0201f800, 0x001071b4, + 0x00000003, 0x040207f0, 0x0201f800, 0x0010724a, 0x0401f7ed, 0x5930d008, 0x8c68d500, 0x04020045, - 0x0201f800, 0x001070df, 0x80c589c0, 0x040007e6, + 0x0201f800, 0x00107175, 0x80c589c0, 0x040007e6, 0x592cd205, 0x8268d500, 0x000000ff, 0x82697480, - 0x00000014, 0x04000003, 0x0201f800, 0x001071b4, + 0x00000014, 0x04000003, 0x0201f800, 0x0010724a, 0x4a025a05, 0x00000103, 0x49425a07, 0x497a580a, - 0x0201f800, 0x00107231, 0x0201f800, 0x0010850c, + 0x0201f800, 0x001072c7, 0x0201f800, 0x001085c4, 0x0201f800, 0x0002032c, 0x0401f7d3, 0x0201f800, - 0x0010bde3, 0x80c589c0, 0x04020030, 0x0201f800, - 0x0010738e, 0x0201f800, 0x001063ed, 0x0401f7ca, - 0x42000000, 0x0010cc38, 0x81317480, 0x0400002a, - 0x0201f800, 0x001070df, 0x80c589c0, 0x040007c2, - 0x4200d000, 0x000009b7, 0x412cd800, 0x4130e000, + 0x0010bde8, 0x80c589c0, 0x04020030, 0x0201f800, + 0x00107424, 0x0201f800, 0x0010646b, 0x0401f7ca, + 0x42000000, 0x0010cc48, 0x81317480, 0x0400002a, + 0x0201f800, 0x00107175, 0x80c589c0, 0x040007c2, + 0x4200d000, 0x000009c8, 0x412cd800, 0x4130e000, 0x0401f7b3, 0x5930d008, 0x8c68d500, 0x04020018, - 0x0201f800, 0x001070df, 0x80c589c0, 0x040007b6, - 0x0201f800, 0x001082cc, 0x0401f7b3, 0x0201f800, - 0x001070df, 0x80c589c0, 0x040007af, 0x49425a07, + 0x0201f800, 0x00107175, 0x80c589c0, 0x040007b6, + 0x0201f800, 0x0010837d, 0x0401f7b3, 0x0201f800, + 0x00107175, 0x80c589c0, 0x040007af, 0x49425a07, 0x497a5c0a, 0x0201f800, 0x0002032c, 0x0401f7aa, 0x49425a07, 0x0201f800, 0x0002032c, 0x0401f7a3, 0x0201f800, 0x00100b11, 0x0401f7ba, 0x0201f800, - 0x00100b11, 0x0401f7e7, 0x0201f800, 0x00101993, - 0x0401f7cf, 0x0201f800, 0x001070df, 0x80c589c0, + 0x00100b11, 0x0401f7e7, 0x0201f800, 0x00101992, + 0x0401f7cf, 0x0201f800, 0x00107175, 0x80c589c0, 0x04000016, 0x59a8e063, 0x412c0000, 0x80717480, - 0x04000005, 0x4200d000, 0x000009d0, 0x412cd800, + 0x04000005, 0x4200d000, 0x000009e1, 0x412cd800, 0x0401f787, 0x592d7000, 0x48bb5063, 0x592cd000, 0x8068d1c0, 0x04020002, 0x486b5064, 0x592cd205, 0x82697480, 0x00000055, 0x04000007, 0x49425a07, @@ -10446,12 +10501,12 @@ static const uint32_t isp_2500_risc_code[] = { 0x829d3c00, 0x00000002, 0x1c01f000, 0x809d3840, 0x48813800, 0x5930dc07, 0x406c0000, 0x826d7480, 0x00000011, 0x83f17500, 0x03000000, 0x04000014, - 0x0c01f001, 0x0010bb69, 0x0010bb40, 0x0010bb50, - 0x0010bb5c, 0x0010bb2f, 0x0010bb32, 0x0010bb7a, - 0x0010bb69, 0x0010bb69, 0x0010bb69, 0x0010bb69, - 0x0010bb27, 0x0010bb27, 0x0010bb69, 0x0010bb27, - 0x0010bb69, 0x0010bb69, 0x0010bb6d, 0x4200d000, - 0x00000b61, 0x4130e000, 0x0201f800, 0x001001e3, + 0x0c01f001, 0x0010bb79, 0x0010bb50, 0x0010bb60, + 0x0010bb6c, 0x0010bb3f, 0x0010bb42, 0x0010bb8a, + 0x0010bb79, 0x0010bb79, 0x0010bb79, 0x0010bb79, + 0x0010bb37, 0x0010bb37, 0x0010bb79, 0x0010bb37, + 0x0010bb79, 0x0010bb79, 0x0010bb7d, 0x4200d000, + 0x00000b72, 0x4130e000, 0x0201f800, 0x001001e3, 0x4200d800, 0x00000001, 0x0401f05c, 0x4178d800, 0x8d3e7d1a, 0x04020059, 0x833ce500, 0x00000001, 0x4178d800, 0x8d3e7d00, 0x04020054, 0x8d3e7d18, @@ -10459,10 +10514,10 @@ static const uint32_t isp_2500_risc_code[] = { 0x4070d800, 0x8c68d500, 0x0402004c, 0x0401f7ed, 0x8d3e7d1a, 0x04020019, 0x8d3e7d00, 0x04020017, 0x833d0500, 0x00001000, 0x8d3e7d18, 0x040207e5, - 0x8d3e7d06, 0x040007e3, 0x0201f800, 0x00107352, + 0x8d3e7d06, 0x040007e3, 0x0201f800, 0x001073e8, 0x4080d800, 0x80c589c0, 0x0402003c, 0x0401f7dd, 0x8d3e7d00, 0x040007db, 0x5930d21f, 0x82697480, - 0x00000003, 0x04020005, 0x0201f800, 0x00105075, + 0x00000003, 0x04020005, 0x0201f800, 0x00105101, 0x80c589c0, 0x040207d3, 0x4178d800, 0x0401f02f, 0x8d3e7d00, 0x04020028, 0x5930d00a, 0x833cdd00, 0x00001000, 0x8d3e7d18, 0x040207ca, 0x8d3e7d06, @@ -10474,760 +10529,758 @@ static const uint32_t isp_2500_risc_code[] = { 0x4068d800, 0x0401f011, 0x4178d800, 0x8d3e7d00, 0x0402000e, 0x833cd500, 0x00001000, 0x4200d800, 0x00000001, 0x8d3e7d18, 0x04020008, 0x4068d800, - 0x0401f006, 0x0201f800, 0x00105075, 0x40c4d800, + 0x0401f006, 0x0201f800, 0x00105101, 0x40c4d800, 0x80c589c0, 0x040207d5, 0x406d8800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000006, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x48953805, 0x4933c857, 0x0201f800, - 0x0010512e, 0x40c52800, 0x41352000, 0x41311000, - 0x412d1800, 0x41790800, 0x598e6003, 0x0401f005, - 0x813669c0, 0x04000026, 0x41310800, 0x59326000, - 0x813261c0, 0x0400001c, 0x5932680a, 0x813669c0, - 0x040007f8, 0x5934d403, 0x41440000, 0x80697480, - 0x040207f4, 0x0401ff5e, 0x80c589c0, 0x040007f3, - 0x42010000, 0x00000001, 0x0201f800, 0x001070df, - 0x80c589c0, 0x0402001d, 0x808101c0, 0x040007eb, - 0x0201f800, 0x00105047, 0x59310000, 0x4084d000, - 0x0401fe0e, 0x0401fe8d, 0x40826000, 0x813261c0, - 0x040207e6, 0x408a6000, 0x408e5800, 0x40926800, - 0x80957040, 0x0400000a, 0x0401f016, 0x5930d407, - 0x82697480, 0x00000010, 0x040207d8, 0x83457480, - 0x0000ffff, 0x040207d5, 0x0401f7df, 0x0201f800, - 0x0010511f, 0x0401f00b, 0x0201f800, 0x00107591, - 0x80c589c0, 0x040007e1, 0x5930d403, 0x82697480, - 0x00000043, 0x040207dd, 0x41790000, 0x0401f7db, - 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000006, - 0x1c01f000, 0x829d3c80, 0x00000006, 0x48813800, - 0x48853801, 0x48893802, 0x488d3803, 0x48913804, - 0x48953805, 0x412d1800, 0x41312000, 0x41352800, - 0x41790800, 0x0201f800, 0x0010512e, 0x40c51000, - 0x0201f800, 0x001039c0, 0x40c66800, 0x80c589c0, - 0x04000027, 0x598e6009, 0x0401f003, 0x41310800, - 0x59326000, 0x813261c0, 0x04000011, 0x5930d00a, - 0x41340000, 0x80697480, 0x040207f9, 0x0401ff08, - 0x80c589c0, 0x040007f6, 0x0201f800, 0x00105047, - 0x59310000, 0x4084d000, 0x0401fd1f, 0x0401fe3f, - 0x40826000, 0x813261c0, 0x040207f1, 0x8d3e7d06, - 0x04000004, 0x5934d200, 0x8c68d50e, 0x04020003, - 0x0201f800, 0x00103aed, 0x408e5800, 0x40926000, - 0x40966800, 0x80897040, 0x04000002, 0x0401f00b, - 0x0201f800, 0x0010511f, 0x0401f008, 0x4200d000, - 0x00000711, 0x40c4d800, 0x4144e000, 0x0201f800, - 0x001001e3, 0x0401f7d4, 0x589d2805, 0x589d2004, + 0x001051ba, 0x40c52800, 0x41352000, 0x41311000, + 0x412d1800, 0x41790800, 0x598e6003, 0x0401f00a, + 0x5932680a, 0x813669c0, 0x04000005, 0x5934d403, + 0x41440000, 0x80697480, 0x0400000b, 0x41310800, + 0x59326000, 0x813261c0, 0x040207f6, 0x408a6000, + 0x408e5800, 0x40926800, 0x80957040, 0x04000015, + 0x0401f021, 0x0401ff5a, 0x80c589c0, 0x040007f4, + 0x42010000, 0x00000001, 0x0201f800, 0x00107175, + 0x80c589c0, 0x0402000e, 0x808101c0, 0x040007ec, + 0x0201f800, 0x001050d3, 0x59310000, 0x4084d000, + 0x0401fe0a, 0x0401fe89, 0x40826000, 0x0401f7e6, + 0x0201f800, 0x001051ab, 0x0401f00b, 0x0201f800, + 0x00107627, 0x80c589c0, 0x040007f0, 0x5930d403, + 0x82697480, 0x00000043, 0x040207ec, 0x41790000, + 0x0401f7ea, 0x589d2805, 0x589d2004, 0x589d1803, + 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00000006, 0x1c01f000, 0x829d3c80, 0x00000006, + 0x48813800, 0x48853801, 0x48893802, 0x488d3803, + 0x48913804, 0x48953805, 0x412d1800, 0x41312000, + 0x41352800, 0x41790800, 0x0201f800, 0x001051ba, + 0x40c51000, 0x0201f800, 0x001039cf, 0x40c66800, + 0x80c589c0, 0x04000027, 0x598e6009, 0x0401f003, + 0x41310800, 0x59326000, 0x813261c0, 0x04000011, + 0x5930d00a, 0x41340000, 0x80697480, 0x040207f9, + 0x0401ff13, 0x80c589c0, 0x040007f6, 0x0201f800, + 0x001050d3, 0x59310000, 0x4084d000, 0x0401fd2a, + 0x0401fe4a, 0x40826000, 0x813261c0, 0x040207f1, + 0x8d3e7d06, 0x04000004, 0x5934d200, 0x8c68d50e, + 0x04020003, 0x0201f800, 0x00103b00, 0x408e5800, + 0x40926000, 0x40966800, 0x80897040, 0x04000002, + 0x0401f00b, 0x0201f800, 0x001051ab, 0x0401f008, + 0x4200d000, 0x00000714, 0x40c4d800, 0x4144e000, + 0x0201f800, 0x001001e3, 0x0401f7d4, 0x589d2805, + 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000006, 0x1c01f000, + 0x829d3c80, 0x00000006, 0x48813800, 0x48853801, + 0x48893802, 0x488d3803, 0x48913804, 0x48953805, + 0x41311800, 0x41352000, 0x412d2800, 0x41790800, + 0x0201f800, 0x001051ba, 0x40c51000, 0x598e6007, + 0x0401f003, 0x41310800, 0x59326000, 0x813261c0, + 0x04000012, 0x5932680a, 0x5934d403, 0x41440000, + 0x80697480, 0x040207f8, 0x0401fecd, 0x80c589c0, + 0x040007f5, 0x59310000, 0x0201f800, 0x001050d3, + 0x4084d000, 0x0401fd32, 0x0401fe04, 0x40826000, + 0x813261c0, 0x040207f0, 0x0201f800, 0x00105d74, + 0x0201f800, 0x00105dd4, 0x408e6000, 0x40926800, + 0x40965800, 0x80897040, 0x04000002, 0x0401f003, + 0x0201f800, 0x001051ab, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000006, 0x1c01f000, 0x829d3c80, - 0x00000006, 0x48813800, 0x48853801, 0x48893802, - 0x488d3803, 0x48913804, 0x48953805, 0x41311800, - 0x41352000, 0x412d2800, 0x41790800, 0x0201f800, - 0x0010512e, 0x40c51000, 0x598e6007, 0x0401f003, - 0x41310800, 0x59326000, 0x813261c0, 0x04000012, - 0x5932680a, 0x5934d403, 0x41440000, 0x80697480, - 0x040207f8, 0x0401fec2, 0x80c589c0, 0x040007f5, - 0x59310000, 0x0201f800, 0x00105047, 0x4084d000, - 0x0401fd27, 0x0401fdf9, 0x40826000, 0x813261c0, - 0x040207f0, 0x0201f800, 0x00105cfc, 0x0201f800, - 0x00105d5c, 0x408e6000, 0x40926800, 0x40965800, - 0x80897040, 0x04000002, 0x0401f003, 0x0201f800, - 0x0010511f, 0x589d2805, 0x589d2004, 0x589d1803, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000006, 0x1c01f000, 0x829d3c80, 0x00000002, - 0x48813800, 0x48853801, 0x4947c857, 0x0201f800, - 0x0010512e, 0x40c50800, 0x413d0000, 0x853e7d00, - 0x0401ffbb, 0x0401ff70, 0x40827800, 0x80857040, - 0x04000002, 0x0401f003, 0x0201f800, 0x0010511f, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, + 0x00000002, 0x48813800, 0x48853801, 0x4947c857, + 0x0201f800, 0x001051ba, 0x40c50800, 0x413d0000, + 0x853e7d00, 0x0401ffbb, 0x0401ff70, 0x40827800, + 0x80857040, 0x04000002, 0x0401f003, 0x0201f800, + 0x001051ab, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000003, + 0x48813800, 0x48853801, 0x48893802, 0x41311000, + 0x41790800, 0x598e6009, 0x813261c0, 0x04000011, + 0x0401fe8b, 0x80c589c0, 0x04020006, 0x41310800, + 0x59326000, 0x813261c0, 0x040207fa, 0x0401f009, + 0x0201f800, 0x001050d3, 0x59310000, 0x4084d000, + 0x0401fc9d, 0x0401fdbd, 0x40826000, 0x0401f7ef, + 0x0201f800, 0x00103ae1, 0x408a6000, 0x589d1002, + 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000003, 0x1c01f000, 0x829d3c80, 0x00000003, 0x48813800, 0x48853801, 0x48893802, 0x41311000, 0x41790800, - 0x598e6009, 0x813261c0, 0x04000011, 0x0401fe80, + 0x598e6007, 0x813261c0, 0x04000011, 0x0401fe68, 0x80c589c0, 0x04020006, 0x41310800, 0x59326000, - 0x813261c0, 0x040207fa, 0x0401f009, 0x0201f800, - 0x00105047, 0x59310000, 0x4084d000, 0x0401fc92, - 0x0401fdb2, 0x40826000, 0x0401f7ef, 0x0201f800, - 0x00103ace, 0x408a6000, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000003, 0x1c01f000, - 0x829d3c80, 0x00000003, 0x48813800, 0x48853801, - 0x48893802, 0x41311000, 0x41790800, 0x598e6007, - 0x813261c0, 0x04000011, 0x0401fe5d, 0x80c589c0, - 0x04020006, 0x41310800, 0x59326000, 0x813261c0, - 0x040207fa, 0x0401f009, 0x59310000, 0x0201f800, - 0x00105047, 0x4084d000, 0x0401fcbd, 0x0401fd8f, - 0x40826000, 0x0401f7ef, 0x0201f800, 0x00105d44, - 0x0201f800, 0x00105d5c, 0x408a6000, 0x589d1002, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000003, - 0x1c01f000, 0x809d3840, 0x48813800, 0x4943c857, - 0x0201f800, 0x0010512e, 0x40c50000, 0x0401ffd5, - 0x0401ffb1, 0x80817040, 0x04000002, 0x0401f003, - 0x0201f800, 0x0010511f, 0x589d0000, 0x809d3800, - 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, - 0x48853801, 0x48893802, 0x488d3803, 0x0201f800, - 0x0010512e, 0x40c51800, 0x41311000, 0x41790800, - 0x598e6003, 0x813261c0, 0x04000008, 0x0401fe24, - 0x80c589c0, 0x04020009, 0x41310800, 0x59326000, - 0x813261c0, 0x040207fa, 0x408a6000, 0x808d7040, - 0x0400000a, 0x0401f00b, 0x0201f800, 0x00105047, - 0x59310000, 0x4084d000, 0x0401fcd4, 0x0401fd53, - 0x40826000, 0x0401f7ec, 0x0201f800, 0x0010511f, - 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, - 0x829d3c00, 0x00000004, 0x1c01f000, 0x809d3840, - 0x48a13800, 0x829d3c80, 0x00000006, 0x409d4000, - 0x829d3c80, 0x00000007, 0x48813800, 0x48853801, - 0x48893802, 0x488d3803, 0x48913804, 0x48953805, - 0x48993806, 0x41791000, 0x0201f800, 0x0010512e, - 0x48c54005, 0x41311800, 0x41352800, 0x41193000, - 0x412d2000, 0x49914003, 0x49d14000, 0x49a54001, - 0x49154002, 0x48d94004, 0x58d6602f, 0x813261c0, - 0x0400000e, 0x41310800, 0x59310000, 0x5932680a, - 0x5934d403, 0x41440000, 0x80697480, 0x04000028, - 0x808101c0, 0x04000003, 0x41310800, 0x40826000, - 0x808101c0, 0x040207f5, 0x417a3000, 0x0201f800, - 0x0010560b, 0x59926005, 0x813261c0, 0x04000006, + 0x813261c0, 0x040207fa, 0x0401f009, 0x59310000, + 0x0201f800, 0x001050d3, 0x4084d000, 0x0401fcc8, + 0x0401fd9a, 0x40826000, 0x0401f7ef, 0x0201f800, + 0x00105dbc, 0x0201f800, 0x00105dd4, 0x408a6000, + 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00000003, 0x1c01f000, 0x809d3840, 0x48813800, + 0x4943c857, 0x0201f800, 0x001051ba, 0x40c50000, + 0x0401ffd5, 0x0401ffb1, 0x80817040, 0x04000002, + 0x0401f003, 0x0201f800, 0x001051ab, 0x589d0000, + 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000004, + 0x48813800, 0x48853801, 0x48893802, 0x488d3803, + 0x0201f800, 0x001051ba, 0x40c51800, 0x41311000, + 0x41790800, 0x598e6003, 0x813261c0, 0x04000008, + 0x0401fe2f, 0x80c589c0, 0x04020009, 0x41310800, + 0x59326000, 0x813261c0, 0x040207fa, 0x408a6000, + 0x808d7040, 0x0400000a, 0x0401f00b, 0x0201f800, + 0x001050d3, 0x59310000, 0x4084d000, 0x0401fcdf, + 0x0401fd5e, 0x40826000, 0x0401f7ec, 0x0201f800, + 0x001051ab, 0x589d1803, 0x589d1002, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000004, 0x1c01f000, + 0x809d3840, 0x48a13800, 0x829d3c80, 0x00000006, + 0x409d4000, 0x829d3c80, 0x00000007, 0x48813800, + 0x48853801, 0x48893802, 0x488d3803, 0x48913804, + 0x48953805, 0x48993806, 0x41791000, 0x0201f800, + 0x001051ba, 0x48c54005, 0x41311800, 0x41352800, + 0x41193000, 0x412d2000, 0x49914003, 0x49d14000, + 0x49a54001, 0x49154002, 0x48d94004, 0x58d6602f, + 0x813261c0, 0x0400000e, 0x41310800, 0x59310000, 0x5932680a, 0x5934d403, 0x41440000, 0x80697480, - 0x04000024, 0x811a3000, 0x83197480, 0x00000004, - 0x040007f3, 0x040017f2, 0x408e6000, 0x40966800, - 0x409a3000, 0x40925800, 0x58a32003, 0x58a3a000, - 0x58a34801, 0x58a22802, 0x58a1b004, 0x58a0d005, - 0x80697040, 0x04000010, 0x0401f01d, 0x41311000, - 0x40826000, 0x808101c0, 0x040007e0, 0x59310001, - 0x0401fdbb, 0x80c589c0, 0x040007f9, 0x4084d000, - 0x4088d800, 0x0201f800, 0x0010b862, 0x0401fcf3, - 0x0401f7f4, 0x0201f800, 0x0010511f, 0x0401f00c, - 0x0401fdaf, 0x80c589c0, 0x040007db, 0x0201f800, - 0x001052fc, 0x0201f800, 0x00105102, 0x0201f800, - 0x00105108, 0x0401fce5, 0x0401f7d3, 0x589d3006, - 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x0000000d, - 0x589d4000, 0x809d3800, 0x1c01f000, 0x809d3840, - 0x48a13800, 0x829d3c80, 0x00000008, 0x409d4000, - 0x829d3c80, 0x00000007, 0x48813800, 0x48853801, - 0x48893802, 0x488d3803, 0x48913804, 0x48953805, - 0x48993806, 0x41791800, 0x0201f800, 0x0010512e, - 0x40c52800, 0x41313000, 0x49354006, 0x492d4005, - 0x49194007, 0x49914003, 0x49d14000, 0x49a54001, - 0x49154002, 0x48d94004, 0x58d6602f, 0x813261c0, - 0x04000023, 0x41312000, 0x408d0800, 0x59311000, - 0x5932680a, 0x0401f009, 0x41311800, 0x808509c0, - 0x04000010, 0x808101c0, 0x04000002, 0x40826000, - 0x808101c0, 0x0400000d, 0x59310001, 0x0401fd6c, - 0x80c589c0, 0x040007f5, 0x4090d000, 0x408cd800, - 0x0201f800, 0x0010b862, 0x0401fca4, 0x0401f7f2, - 0x41310800, 0x0401f7f0, 0x808911c0, 0x04000006, - 0x408a6000, 0x808509c0, 0x04000003, 0x40852000, - 0x40810800, 0x808911c0, 0x040207e1, 0x417a3000, - 0x0201f800, 0x0010560b, 0x59926005, 0x813261c0, - 0x04000004, 0x0401fd52, 0x80c589c0, 0x04020012, - 0x811a3000, 0x83197480, 0x00000004, 0x040007f5, - 0x040017f4, 0x409a6000, 0x58a26806, 0x58a25805, - 0x58a23007, 0x58a32003, 0x58a3a000, 0x58a34801, - 0x58a22802, 0x58a1b004, 0x80957040, 0x0400000a, - 0x0401f00b, 0x0201f800, 0x001052fc, 0x0201f800, - 0x00105102, 0x0201f800, 0x00105108, 0x0401fc77, - 0x0401f7e8, 0x0201f800, 0x0010511f, 0x589d3006, - 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x0000000f, - 0x589d4000, 0x809d3800, 0x1c01f000, 0x4178e000, - 0x497bc856, 0x5930dc03, 0x826cd480, 0x00000002, - 0x82697480, 0x00000002, 0x04000007, 0x04001006, - 0x599cd019, 0x8c68d50e, 0x04000005, 0x806cd9c0, - 0x04020003, 0x4200e000, 0x00000001, 0x40718800, - 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, - 0x48853801, 0x48893802, 0x488d3803, 0x412d0800, - 0x41351000, 0x41391800, 0x0201f800, 0x0010bb0b, - 0x80c589c0, 0x040000ac, 0x5932680a, 0x5930dc07, - 0x406c0000, 0x826d7480, 0x00000011, 0x83f17500, - 0x03000000, 0x04000026, 0x0c01f001, 0x0010bead, - 0x0010be58, 0x0010be68, 0x0010be35, 0x0010be58, - 0x0010be68, 0x0010be78, 0x0010be89, 0x0010be2f, - 0x0010be2f, 0x0010be20, 0x0010be2f, 0x0010be2f, - 0x0010be2f, 0x0010be2f, 0x0010bead, 0x0010be20, - 0x0010be1d, 0x59325819, 0x0201f800, 0x00100581, - 0x5930d203, 0x82697480, 0x00000004, 0x04000071, - 0x59325809, 0x0201f800, 0x001070df, 0x80c589c0, - 0x04020068, 0x0201f800, 0x00105dd5, 0x8d3e7d1c, - 0x04000081, 0x497a600a, 0x0401f07f, 0x4200d000, - 0x0000030f, 0x4130e000, 0x0201f800, 0x001001e3, - 0x0401f079, 0x813669c0, 0x04000061, 0x0201f800, - 0x00107924, 0x5930d203, 0x82697480, 0x00000004, - 0x0400006e, 0x59325809, 0x0201f800, 0x001070df, - 0x80c589c0, 0x040007e8, 0x592cd205, 0x8268d500, + 0x04000028, 0x808101c0, 0x04000003, 0x41310800, + 0x40826000, 0x808101c0, 0x040207f5, 0x417a3000, + 0x0201f800, 0x00105697, 0x59926005, 0x813261c0, + 0x04000006, 0x5932680a, 0x5934d403, 0x41440000, + 0x80697480, 0x04000024, 0x811a3000, 0x83197480, + 0x00000004, 0x040007f3, 0x040017f2, 0x408e6000, + 0x40966800, 0x409a3000, 0x40925800, 0x58a32003, + 0x58a3a000, 0x58a34801, 0x58a22802, 0x58a1b004, + 0x58a0d005, 0x80697040, 0x04000010, 0x0401f01d, + 0x41311000, 0x40826000, 0x808101c0, 0x040007e0, + 0x59310001, 0x0401fdc6, 0x80c589c0, 0x040007f9, + 0x4084d000, 0x4088d800, 0x0201f800, 0x0010b872, + 0x0401fcfe, 0x0401f7f4, 0x0201f800, 0x001051ab, + 0x0401f00c, 0x0401fdba, 0x80c589c0, 0x040007db, + 0x0201f800, 0x00105388, 0x0201f800, 0x0010518e, + 0x0201f800, 0x00105194, 0x0401fcf0, 0x0401f7d3, + 0x589d3006, 0x589d2805, 0x589d2004, 0x589d1803, + 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x0000000d, 0x589d4000, 0x809d3800, 0x1c01f000, + 0x809d3840, 0x48a13800, 0x829d3c80, 0x00000008, + 0x409d4000, 0x829d3c80, 0x00000007, 0x48813800, + 0x48853801, 0x48893802, 0x488d3803, 0x48913804, + 0x48953805, 0x48993806, 0x41791800, 0x0201f800, + 0x001051ba, 0x40c52800, 0x41313000, 0x49354006, + 0x492d4005, 0x49194007, 0x49914003, 0x49d14000, + 0x49a54001, 0x49154002, 0x48d94004, 0x58d6602f, + 0x813261c0, 0x04000023, 0x41312000, 0x408d0800, + 0x59311000, 0x5932680a, 0x0401f009, 0x41311800, + 0x808509c0, 0x04000010, 0x808101c0, 0x04000002, + 0x40826000, 0x808101c0, 0x0400000d, 0x59310001, + 0x0401fd77, 0x80c589c0, 0x040007f5, 0x4090d000, + 0x408cd800, 0x0201f800, 0x0010b872, 0x0401fcaf, + 0x0401f7f2, 0x41310800, 0x0401f7f0, 0x808911c0, + 0x04000006, 0x408a6000, 0x808509c0, 0x04000003, + 0x40852000, 0x40810800, 0x808911c0, 0x040207e1, + 0x417a3000, 0x0201f800, 0x00105697, 0x59926005, + 0x813261c0, 0x04000004, 0x0401fd5d, 0x80c589c0, + 0x04020012, 0x811a3000, 0x83197480, 0x00000004, + 0x040007f5, 0x040017f4, 0x409a6000, 0x58a26806, + 0x58a25805, 0x58a23007, 0x58a32003, 0x58a3a000, + 0x58a34801, 0x58a22802, 0x58a1b004, 0x80957040, + 0x0400000a, 0x0401f00b, 0x0201f800, 0x00105388, + 0x0201f800, 0x0010518e, 0x0201f800, 0x00105194, + 0x0401fc82, 0x0401f7e8, 0x0201f800, 0x001051ab, + 0x589d3006, 0x589d2805, 0x589d2004, 0x589d1803, + 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x0000000f, 0x589d4000, 0x809d3800, 0x1c01f000, + 0x4178e000, 0x497bc856, 0x5930dc03, 0x826cd480, + 0x00000002, 0x82697480, 0x00000002, 0x04000007, + 0x04001006, 0x599cd019, 0x8c68d50e, 0x04000005, + 0x806cd9c0, 0x04020003, 0x4200e000, 0x00000001, + 0x40718800, 0x1c01f000, 0x829d3c80, 0x00000004, + 0x48813800, 0x48853801, 0x48893802, 0x488d3803, + 0x412d0800, 0x41351000, 0x41391800, 0x0201f800, + 0x0010bb1b, 0x80c589c0, 0x040000ac, 0x5932680a, + 0x5930dc07, 0x406c0000, 0x826d7480, 0x00000011, + 0x83f17500, 0x03000000, 0x04000026, 0x0c01f001, + 0x0010beb2, 0x0010be5d, 0x0010be6d, 0x0010be3a, + 0x0010be5d, 0x0010be6d, 0x0010be7d, 0x0010be8e, + 0x0010be34, 0x0010be34, 0x0010be25, 0x0010be34, + 0x0010be34, 0x0010be34, 0x0010be34, 0x0010beb2, + 0x0010be25, 0x0010be22, 0x59325819, 0x0201f800, + 0x00100581, 0x5930d203, 0x82697480, 0x00000004, + 0x04000071, 0x59325809, 0x0201f800, 0x00107175, + 0x80c589c0, 0x04020068, 0x0201f800, 0x00105e4d, + 0x8d3e7d1c, 0x04000081, 0x497a600a, 0x0401f07f, + 0x4200d000, 0x0000030f, 0x4130e000, 0x0201f800, + 0x001001e3, 0x0401f079, 0x813669c0, 0x04000061, + 0x0201f800, 0x001079ba, 0x5930d203, 0x82697480, + 0x00000004, 0x0400006e, 0x59325809, 0x0201f800, + 0x00107175, 0x80c589c0, 0x040007e8, 0x592cd205, + 0x8268d500, 0x000000ff, 0x82697480, 0x00000014, + 0x04000003, 0x0201f800, 0x0010724a, 0x4a025a05, + 0x00000103, 0x5930d402, 0x486a5c07, 0x592cd409, + 0x8c68d512, 0x04020051, 0x49425a07, 0x497a580a, + 0x0201f800, 0x00107631, 0x0201f800, 0x0002032c, + 0x0401f7d2, 0x5930d403, 0x82697480, 0x00000043, + 0x04000052, 0x0201f800, 0x0010888d, 0x0401ff85, + 0x80c589c0, 0x0402003e, 0x0201f800, 0x0010726c, + 0x80c589c0, 0x040007c5, 0x0201f800, 0x0010646b, + 0x0401f7c2, 0x59325809, 0x0201f800, 0x00107175, + 0x80c589c0, 0x040007bd, 0x49425a07, 0x497a5c0a, + 0x0201f800, 0x0002032c, 0x5930d21f, 0x82697480, + 0x00000003, 0x040207b5, 0x0201f800, 0x0010724a, + 0x0401f7b2, 0x5930d203, 0x82697480, 0x00000004, + 0x0400002c, 0x59325809, 0x0201f800, 0x00107175, + 0x80c589c0, 0x040007a9, 0x49425a07, 0x813669c0, + 0x040007d0, 0x0201f800, 0x001085c4, 0x0201f800, + 0x00107631, 0x0401f7cd, 0x5930d203, 0x82697480, + 0x00000011, 0x04020021, 0x5930d41f, 0x486a6203, + 0x0401f01e, 0x49425a07, 0x0201f800, 0x0002032c, + 0x0401f796, 0x0201f800, 0x00100b11, 0x0401f78e, + 0x4200d000, 0x00000182, 0x4134d800, 0x4130e000, + 0x0201f800, 0x001001e3, 0x0401f79a, 0x0201f800, + 0x00101992, 0x0401f7c1, 0x412d0000, 0x592e580a, + 0x0201f800, 0x00100581, 0x40825800, 0x0401f7ab, + 0x0201f800, 0x00100b11, 0x0401f7d3, 0x0201f800, + 0x00100b11, 0x0401f791, 0x40865800, 0x408a6800, + 0x408e7000, 0x589d1803, 0x589d1002, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000004, 0x1c01f000, + 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, + 0x41310800, 0x4933c857, 0x4943c857, 0x493fc857, + 0x42010000, 0x0010ccb4, 0x59a8d00d, 0x41640000, + 0x80697480, 0x04000010, 0x41580000, 0x80817480, + 0x0402100d, 0x40826000, 0x8d3e7d12, 0x04000004, + 0x40800000, 0x80857480, 0x04000002, 0x0401ff27, + 0x82810400, 0x00000024, 0x41580000, 0x80817480, + 0x040017f5, 0x41510000, 0x41540000, 0x80817480, + 0x04021019, 0x8d3e7d18, 0x04000017, 0x59a8d05e, + 0x59a8005f, 0x80697480, 0x04000013, 0x40826000, + 0x5880d00a, 0x8068d1c0, 0x04020005, 0x5880d203, + 0x82697480, 0x00000008, 0x04000008, 0x0401ff0f, + 0x82810400, 0x00000024, 0x41540000, 0x80817480, + 0x040017ed, 0x0401f004, 0x0201f800, 0x001087ea, + 0x0401f7f7, 0x40866000, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000002, 0x1c01f000, 0x809d3840, + 0x48813800, 0x497a621f, 0x812e59c0, 0x04000041, + 0x592cd205, 0x486bc857, 0x592cd205, 0x8268d500, 0x000000ff, 0x82697480, 0x00000014, 0x04000003, - 0x0201f800, 0x001071b4, 0x4a025a05, 0x00000103, - 0x5930d402, 0x486a5c07, 0x592cd409, 0x8c68d512, - 0x04020051, 0x49425a07, 0x497a580a, 0x0201f800, - 0x0010759b, 0x0201f800, 0x0002032c, 0x0401f7d2, - 0x5930d403, 0x82697480, 0x00000043, 0x04000052, - 0x0201f800, 0x001087c3, 0x0401ff85, 0x80c589c0, - 0x0402003e, 0x0201f800, 0x001071d6, 0x80c589c0, - 0x040007c5, 0x0201f800, 0x001063ed, 0x0401f7c2, - 0x59325809, 0x0201f800, 0x001070df, 0x80c589c0, - 0x040007bd, 0x49425a07, 0x497a5c0a, 0x0201f800, - 0x0002032c, 0x5930d21f, 0x82697480, 0x00000003, - 0x040207b5, 0x0201f800, 0x001071b4, 0x0401f7b2, - 0x5930d203, 0x82697480, 0x00000004, 0x0400002c, - 0x59325809, 0x0201f800, 0x001070df, 0x80c589c0, - 0x040007a9, 0x49425a07, 0x813669c0, 0x040007d0, - 0x0201f800, 0x0010850c, 0x0201f800, 0x0010759b, - 0x0401f7cd, 0x5930d203, 0x82697480, 0x00000011, - 0x04020021, 0x5930d41f, 0x486a6203, 0x0401f01e, - 0x49425a07, 0x0201f800, 0x0002032c, 0x0401f796, - 0x0201f800, 0x00100b11, 0x0401f78e, 0x4200d000, - 0x00000182, 0x4134d800, 0x4130e000, 0x0201f800, - 0x001001e3, 0x0401f79a, 0x0201f800, 0x00101993, - 0x0401f7c1, 0x412d0000, 0x592e580a, 0x0201f800, - 0x00100581, 0x40825800, 0x0401f7ab, 0x0201f800, - 0x00100b11, 0x0401f7d3, 0x0201f800, 0x00100b11, - 0x0401f791, 0x40865800, 0x408a6800, 0x408e7000, - 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, - 0x829d3c00, 0x00000004, 0x1c01f000, 0x829d3c80, - 0x00000002, 0x48813800, 0x48853801, 0x41310800, - 0x4933c857, 0x4943c857, 0x493fc857, 0x42010000, - 0x0010cca4, 0x59a8d00d, 0x41640000, 0x80697480, - 0x04000010, 0x41580000, 0x80817480, 0x0402100d, - 0x40826000, 0x8d3e7d12, 0x04000004, 0x40800000, - 0x80857480, 0x04000002, 0x0401ff27, 0x82810400, - 0x00000024, 0x41580000, 0x80817480, 0x040017f5, - 0x41510000, 0x41540000, 0x80817480, 0x04021019, - 0x8d3e7d18, 0x04000017, 0x59a8d05e, 0x59a8005f, - 0x80697480, 0x04000013, 0x40826000, 0x5880d00a, - 0x8068d1c0, 0x04020005, 0x5880d203, 0x82697480, - 0x00000008, 0x04000008, 0x0401ff0f, 0x82810400, - 0x00000024, 0x41540000, 0x80817480, 0x040017ed, - 0x0401f004, 0x0201f800, 0x00108720, 0x0401f7f7, - 0x40866000, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000002, 0x1c01f000, 0x809d3840, 0x48813800, - 0x497a621f, 0x812e59c0, 0x04000041, 0x592cd205, - 0x486bc857, 0x592cd205, 0x8268d500, 0x000000ff, - 0x82697480, 0x00000014, 0x04000003, 0x4a02621f, - 0x00000003, 0x592cd409, 0x8c68d510, 0x04020021, - 0x592cd209, 0x0201f800, 0x00103f3f, 0x0201f800, - 0x0010759b, 0x0201f800, 0x001089a9, 0x80c589c0, - 0x04000023, 0x4a026403, 0x00000085, 0x4a026203, - 0x00000009, 0x4a026407, 0x00000002, 0x59310004, - 0x82810500, 0x00000100, 0x0201f800, 0x0010784a, - 0x82810540, 0x80004040, 0x48826004, 0x0201f800, - 0x00107856, 0x0201f800, 0x0010511f, 0x4200d000, - 0x80004040, 0x0201f800, 0x00105035, 0x0401f01f, - 0x592cd209, 0x0201f800, 0x00103f3f, 0x4a025c09, - 0x00000100, 0x0201f800, 0x0010759b, 0x0201f800, - 0x001089a9, 0x80c589c0, 0x040207df, 0x0201f800, - 0x0002032c, 0x5930d21f, 0x82697480, 0x00000003, - 0x0400000a, 0x497a6009, 0x0401f7d7, 0x4200d000, - 0x00000527, 0x4130d800, 0x412ce000, 0x0201f800, - 0x001001e3, 0x0401f005, 0x0201f800, 0x001071b4, - 0x497a6009, 0x0401f7cc, 0x589d0000, 0x809d3800, - 0x1c01f000, 0x0201f800, 0x0010511f, 0x812e59c0, - 0x0400001b, 0x592cd409, 0x8c68d510, 0x04020012, - 0x592cd209, 0x0201f800, 0x00103f3f, 0x0201f800, - 0x0010759b, 0x0201f800, 0x0002032c, 0x5930d203, - 0x82697480, 0x0000000d, 0x0400000d, 0x0201f800, - 0x0010511f, 0x5930d00a, 0x0201f800, 0x00103be5, - 0x0401f007, 0x592cd209, 0x0201f800, 0x00103f3f, - 0x4a025c09, 0x00000100, 0x0401f7ed, 0x0201f800, - 0x00105dd5, 0x1c01f000, 0x829d3c80, 0x00000002, - 0x48813800, 0x48853801, 0x41790000, 0x0201f800, - 0x00106eb0, 0x40c50800, 0x48c7c857, 0x40840000, - 0x82857480, 0x0000000d, 0x83f17500, 0x03000000, - 0x0400002b, 0x0c01f001, 0x0010bf9b, 0x0010bfd3, - 0x0010bfb1, 0x0010bf88, 0x0010bfb3, 0x0010bfa3, - 0x0010bf9b, 0x0010bf9b, 0x0010bf9b, 0x0010bfa3, - 0x0010bfa3, 0x0010bfa3, 0x0010bfa3, 0x0010bfb1, - 0x0201f800, 0x00106ea0, 0x80c589c0, 0x04000005, - 0x0201f800, 0x00105396, 0x80c589c0, 0x04000055, - 0x0201f800, 0x0010b8bb, 0x80c589c0, 0x04000017, - 0x5930d403, 0x486bc857, 0x5930d403, 0x82697480, - 0x00000040, 0x04020018, 0x0401ffaf, 0x42010000, - 0x00000001, 0x0401f069, 0x40840000, 0x82857480, - 0x0000000d, 0x040007d8, 0x040017d7, 0x4200d000, - 0x000004b7, 0x4130d800, 0x4084e000, 0x0201f800, - 0x001001e3, 0x0401f05d, 0x497bc856, 0x0201f800, - 0x0010505d, 0x80c589c0, 0x04020036, 0x59317004, - 0x48bbc857, 0x0401ff45, 0x0401f7e9, 0x812e59c0, - 0x0400004c, 0x0201f800, 0x00107447, 0x80c589c0, - 0x04000030, 0x0201f800, 0x0010511f, 0x592cd209, - 0x8468d50c, 0x486a5a09, 0x592cdc07, 0x806cd0c6, - 0x406c0000, 0x8068d400, 0x8068d400, 0x486a6006, - 0x4200d000, 0x10000000, 0x4130d800, 0x0201f800, - 0x00100869, 0x80c589c0, 0x0400002b, 0x592cd209, - 0x8c68d51c, 0x04020024, 0x8468d55c, 0x486a5a09, - 0x4a026006, 0x00000002, 0x0401f7c9, 0x598d700b, - 0x48bbc857, 0x40b8d000, 0x41300000, 0x80697480, - 0x04000014, 0x0201f800, 0x0010ba2e, 0x80c589c0, - 0x040207be, 0x497bc856, 0x0201f800, 0x0010505d, - 0x4200d000, 0x000003f5, 0x80c589c0, 0x040007c2, - 0x5930d203, 0x486bc857, 0x59310a03, 0x0401f01f, - 0x0201f800, 0x00100b11, 0x0401ff0c, 0x0401f7b0, - 0x0201f800, 0x001053cb, 0x80c589c0, 0x040007f5, - 0x0401f7e9, 0x41310000, 0x0201f800, 0x0010102b, - 0x40826000, 0x5930d203, 0x82697480, 0x00000004, - 0x040207a3, 0x41390000, 0x42027000, 0x00000048, - 0x0201f800, 0x00105e2e, 0x40827000, 0x0401f79c, - 0x4200d000, 0x000004a7, 0x4130d800, 0x412ce000, - 0x0201f800, 0x001001e3, 0x808101c0, 0x04000797, + 0x4a02621f, 0x00000003, 0x592cd409, 0x8c68d510, + 0x04020021, 0x592cd209, 0x0201f800, 0x00103f75, + 0x0201f800, 0x00107631, 0x0201f800, 0x00108a73, + 0x80c589c0, 0x04000023, 0x4a026403, 0x00000085, + 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, + 0x59310004, 0x82810500, 0x00000100, 0x0201f800, + 0x001078e0, 0x82810540, 0x80004040, 0x48826004, + 0x0201f800, 0x001078ec, 0x0201f800, 0x001051ab, + 0x4200d000, 0x80004040, 0x0201f800, 0x001050c1, + 0x0401f01f, 0x592cd209, 0x0201f800, 0x00103f75, + 0x4a025c09, 0x00000100, 0x0201f800, 0x00107631, + 0x0201f800, 0x00108a73, 0x80c589c0, 0x040207df, + 0x0201f800, 0x0002032c, 0x5930d21f, 0x82697480, + 0x00000003, 0x0400000a, 0x497a6009, 0x0401f7d7, + 0x4200d000, 0x00000527, 0x4130d800, 0x412ce000, + 0x0201f800, 0x001001e3, 0x0401f005, 0x0201f800, + 0x0010724a, 0x497a6009, 0x0401f7cc, 0x589d0000, + 0x809d3800, 0x1c01f000, 0x0201f800, 0x001051ab, + 0x812e59c0, 0x0400001b, 0x592cd409, 0x8c68d510, + 0x04020012, 0x592cd209, 0x0201f800, 0x00103f75, + 0x0201f800, 0x00107631, 0x0201f800, 0x0002032c, + 0x5930d203, 0x82697480, 0x0000000d, 0x0400000d, + 0x0201f800, 0x001051ab, 0x5930d00a, 0x0201f800, + 0x00103bf8, 0x0401f007, 0x592cd209, 0x0201f800, + 0x00103f75, 0x4a025c09, 0x00000100, 0x0401f7ed, + 0x0201f800, 0x00105e4d, 0x1c01f000, 0x829d3c80, + 0x00000002, 0x48813800, 0x48853801, 0x41790000, + 0x0201f800, 0x00106f43, 0x40c50800, 0x48c7c857, + 0x40840000, 0x82857480, 0x0000000d, 0x83f17500, + 0x03000000, 0x0400002b, 0x0c01f001, 0x0010bfa0, + 0x0010bfd8, 0x0010bfb6, 0x0010bf8d, 0x0010bfb8, + 0x0010bfa8, 0x0010bfa0, 0x0010bfa0, 0x0010bfa0, + 0x0010bfa8, 0x0010bfa8, 0x0010bfa8, 0x0010bfa8, + 0x0010bfb6, 0x0201f800, 0x00106f33, 0x80c589c0, + 0x04000005, 0x0201f800, 0x00105422, 0x80c589c0, + 0x04000055, 0x0201f800, 0x0010b8cb, 0x80c589c0, + 0x04000017, 0x5930d403, 0x486bc857, 0x5930d403, + 0x82697480, 0x00000040, 0x04020018, 0x0401ffaf, + 0x42010000, 0x00000001, 0x0401f069, 0x40840000, + 0x82857480, 0x0000000d, 0x040007d8, 0x040017d7, + 0x4200d000, 0x000004b7, 0x4130d800, 0x4084e000, + 0x0201f800, 0x001001e3, 0x0401f05d, 0x497bc856, + 0x0201f800, 0x001050e9, 0x80c589c0, 0x04020036, + 0x59317004, 0x48bbc857, 0x0401ff45, 0x0401f7e9, + 0x812e59c0, 0x0400004c, 0x0201f800, 0x001074dd, + 0x80c589c0, 0x04000030, 0x0201f800, 0x001051ab, + 0x592cd209, 0x8468d50c, 0x486a5a09, 0x592cdc07, + 0x806cd0c6, 0x406c0000, 0x8068d400, 0x8068d400, + 0x486a6006, 0x4200d000, 0x10000000, 0x4130d800, + 0x0201f800, 0x00100867, 0x80c589c0, 0x0400002b, + 0x592cd209, 0x8c68d51c, 0x04020024, 0x8468d55c, + 0x486a5a09, 0x4a026006, 0x00000002, 0x0401f7c9, + 0x598d700b, 0x48bbc857, 0x40b8d000, 0x41300000, + 0x80697480, 0x04000014, 0x0201f800, 0x0010ba3e, + 0x80c589c0, 0x040207be, 0x497bc856, 0x0201f800, + 0x001050e9, 0x4200d000, 0x000003f5, 0x80c589c0, + 0x040007c2, 0x5930d203, 0x486bc857, 0x59310a03, + 0x0401f01f, 0x0201f800, 0x00100b11, 0x0401ff0c, + 0x0401f7b0, 0x0201f800, 0x00105457, 0x80c589c0, + 0x040007f5, 0x0401f7e9, 0x41310000, 0x0201f800, + 0x00101029, 0x40826000, 0x5930d203, 0x82697480, + 0x00000004, 0x040207a3, 0x41390000, 0x42027000, + 0x00000048, 0x0201f800, 0x00105eaa, 0x40827000, + 0x0401f79c, 0x4200d000, 0x000004a7, 0x4130d800, + 0x412ce000, 0x0201f800, 0x001001e3, 0x808101c0, + 0x04000797, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, + 0x48813800, 0x48853801, 0x412d0800, 0x41410000, + 0x4200d000, 0x00109887, 0x0201f800, 0x0010895e, + 0x417a5800, 0x0201f800, 0x00107175, 0x80c589c0, + 0x04000009, 0x0201f800, 0x001079ba, 0x59325809, + 0x592cd209, 0x8468d54c, 0x486a5a09, 0x42028000, + 0x00000006, 0x0201f800, 0x001051ba, 0x0401ff44, + 0x0201f800, 0x001051ab, 0x40828000, 0x40865800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, - 0x48853801, 0x412d0800, 0x41410000, 0x4200d000, - 0x00109807, 0x0201f800, 0x00108894, 0x417a5800, - 0x0201f800, 0x001070df, 0x80c589c0, 0x04000009, - 0x0201f800, 0x00107924, 0x59325809, 0x592cd209, - 0x8468d54c, 0x486a5a09, 0x42028000, 0x00000006, - 0x0201f800, 0x0010512e, 0x0401ff44, 0x0201f800, - 0x0010511f, 0x40828000, 0x40865800, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, - 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, - 0x412d0800, 0x0201f800, 0x0010bb0b, 0x80c589c0, - 0x040000a3, 0x5930dc07, 0x406c0000, 0x826d7480, - 0x00000011, 0x83f17500, 0x03000000, 0x04000025, - 0x0c01f001, 0x0010c0db, 0x0010c091, 0x0010c0a0, - 0x0010c06e, 0x0010c091, 0x0010c0a0, 0x0010c0b7, - 0x0010c0b0, 0x0010c064, 0x0010c064, 0x0010c053, - 0x0010c064, 0x0010c064, 0x0010c064, 0x0010c064, - 0x0010c0db, 0x0010c059, 0x0010c06a, 0x5930d203, - 0x82697480, 0x00000004, 0x04020003, 0x0201f800, - 0x00100b11, 0x59325809, 0x0201f800, 0x001070df, - 0x80c589c0, 0x0402006b, 0x0201f800, 0x00105dd5, - 0x8d3e7d1c, 0x0400007a, 0x497a600a, 0x0401f078, - 0x4200d000, 0x0000031c, 0x4130e000, 0x0201f800, - 0x001001e3, 0x0401f072, 0x59325819, 0x0201f800, - 0x00100581, 0x0401f7ec, 0x0201f800, 0x00107924, - 0x5930d203, 0x82697480, 0x00000004, 0x0400005c, - 0x59325809, 0x0201f800, 0x001070df, 0x80c589c0, - 0x040007e6, 0x592cd205, 0x8268d500, 0x000000ff, - 0x82697480, 0x00000014, 0x04000003, 0x0201f800, - 0x001071b4, 0x4a025a05, 0x00000103, 0x592cd409, - 0x8c68d512, 0x0402004d, 0x49425a07, 0x497a580a, - 0x0201f800, 0x0010850c, 0x0201f800, 0x0010759b, - 0x0201f800, 0x00107231, 0x0201f800, 0x0002032c, - 0x0401f7ce, 0x5930d403, 0x82697480, 0x00000043, - 0x04000047, 0x0201f800, 0x0010bde3, 0x80c589c0, - 0x04020034, 0x0201f800, 0x001071d6, 0x80c589c0, - 0x040007c2, 0x0201f800, 0x001063ed, 0x0401f7bf, - 0x59325809, 0x0201f800, 0x001070df, 0x80c589c0, - 0x040007ba, 0x49425a07, 0x497a5c0a, 0x0201f800, - 0x0002032c, 0x5930d21f, 0x82697480, 0x00000003, - 0x040207b2, 0x0201f800, 0x001071b4, 0x0401f7af, - 0x5930d203, 0x82697480, 0x00000011, 0x04020028, - 0x5930d41f, 0x486a6203, 0x0401f025, 0x5930d203, - 0x82697480, 0x00000004, 0x0400001e, 0x59325809, - 0x0201f800, 0x001070df, 0x80c589c0, 0x0400079f, - 0x49425a07, 0x0201f800, 0x0010850c, 0x0201f800, - 0x0010759b, 0x0201f800, 0x0002032c, 0x0401f797, - 0x49425a07, 0x0201f800, 0x0002032c, 0x0401f793, - 0x0201f800, 0x00101993, 0x0401f7cb, 0x0201f800, - 0x00100b11, 0x0401f7a3, 0x412d0000, 0x592e580a, - 0x0201f800, 0x00100581, 0x40825800, 0x0401f7af, - 0x0201f800, 0x00100b11, 0x0401f7e1, 0x40865800, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, - 0x1c01f000, 0x0201f800, 0x001083b3, 0x80c589c0, - 0x0402000c, 0x5930d407, 0x82697480, 0x00000010, - 0x04000002, 0x0401f009, 0x83457480, 0x0000ffff, - 0x040207fd, 0x5930d00a, 0x8068d1c0, 0x040207fa, - 0x5932680a, 0x0401ff3f, 0x1c01f000, 0x829d3c80, - 0x00000005, 0x48813800, 0x48853801, 0x48893802, - 0x488d3803, 0x48913804, 0x41311000, 0x41352000, - 0x4933c857, 0x4947c857, 0x4943c857, 0x0201f800, - 0x0010512e, 0x40c51800, 0x0201f800, 0x00108295, - 0x41310800, 0x813261c0, 0x04000048, 0x42000000, - 0x0010cc5c, 0x81317480, 0x04000044, 0x59a8d00d, - 0x8068d040, 0x42010000, 0x0010cca4, 0x40680000, - 0x81657480, 0x0400000f, 0x41580000, 0x80817480, - 0x0402100c, 0x40826000, 0x40800000, 0x80857480, - 0x04000003, 0x4084d000, 0x0401ffc7, 0x82810400, - 0x00000024, 0x41580000, 0x80817480, 0x040017f6, - 0x41510000, 0x41540000, 0x80817480, 0x04021012, - 0x8d3e7d18, 0x04000010, 0x59a8d05e, 0x59a8005f, - 0x80697480, 0x0400000c, 0x40826000, 0x5880d00a, - 0x8068d1c0, 0x0400000d, 0x4084d000, 0x0401ffb2, - 0x82810400, 0x00000024, 0x41540000, 0x80817480, - 0x040017f0, 0x408a6000, 0x40926800, 0x808d7040, - 0x04000018, 0x0401f01d, 0x0201f800, 0x001039c0, - 0x40c66800, 0x80c589c0, 0x040007f2, 0x58c4d002, - 0x5930d820, 0x82680500, 0x00ffffff, 0x806d7480, - 0x040207ec, 0x5930d203, 0x82697480, 0x00000008, - 0x0400000b, 0x4936600a, 0x0401fee6, 0x82810400, - 0x00000024, 0x0401f7e5, 0x59a8d00d, 0x0401f7be, - 0x0201f800, 0x0010511f, 0x0401f004, 0x0201f800, - 0x00108720, 0x0401f7f4, 0x589d2004, 0x589d1803, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000005, 0x1c01f000, 0x829d3c80, 0x00000007, + 0x48853801, 0x412d0800, 0x0201f800, 0x0010bb1b, + 0x80c589c0, 0x040000a3, 0x5930dc07, 0x406c0000, + 0x826d7480, 0x00000011, 0x83f17500, 0x03000000, + 0x04000025, 0x0c01f001, 0x0010c0e0, 0x0010c096, + 0x0010c0a5, 0x0010c073, 0x0010c096, 0x0010c0a5, + 0x0010c0bc, 0x0010c0b5, 0x0010c069, 0x0010c069, + 0x0010c058, 0x0010c069, 0x0010c069, 0x0010c069, + 0x0010c069, 0x0010c0e0, 0x0010c05e, 0x0010c06f, + 0x5930d203, 0x82697480, 0x00000004, 0x04020003, + 0x0201f800, 0x00100b11, 0x59325809, 0x0201f800, + 0x00107175, 0x80c589c0, 0x0402006b, 0x0201f800, + 0x00105e4d, 0x8d3e7d1c, 0x0400007a, 0x497a600a, + 0x0401f078, 0x4200d000, 0x00000328, 0x4130e000, + 0x0201f800, 0x001001e3, 0x0401f072, 0x59325819, + 0x0201f800, 0x00100581, 0x0401f7ec, 0x0201f800, + 0x001079ba, 0x5930d203, 0x82697480, 0x00000004, + 0x0400005c, 0x59325809, 0x0201f800, 0x00107175, + 0x80c589c0, 0x040007e6, 0x592cd205, 0x8268d500, + 0x000000ff, 0x82697480, 0x00000014, 0x04000003, + 0x0201f800, 0x0010724a, 0x4a025a05, 0x00000103, + 0x592cd409, 0x8c68d512, 0x0402004d, 0x49425a07, + 0x497a580a, 0x0201f800, 0x001085c4, 0x0201f800, + 0x00107631, 0x0201f800, 0x001072c7, 0x0201f800, + 0x0002032c, 0x0401f7ce, 0x5930d403, 0x82697480, + 0x00000043, 0x04000047, 0x0201f800, 0x0010bde8, + 0x80c589c0, 0x04020034, 0x0201f800, 0x0010726c, + 0x80c589c0, 0x040007c2, 0x0201f800, 0x0010646b, + 0x0401f7bf, 0x59325809, 0x0201f800, 0x00107175, + 0x80c589c0, 0x040007ba, 0x49425a07, 0x497a5c0a, + 0x0201f800, 0x0002032c, 0x5930d21f, 0x82697480, + 0x00000003, 0x040207b2, 0x0201f800, 0x0010724a, + 0x0401f7af, 0x5930d203, 0x82697480, 0x00000011, + 0x04020028, 0x5930d41f, 0x486a6203, 0x0401f025, + 0x5930d203, 0x82697480, 0x00000004, 0x0400001e, + 0x59325809, 0x0201f800, 0x00107175, 0x80c589c0, + 0x0400079f, 0x49425a07, 0x0201f800, 0x001085c4, + 0x0201f800, 0x00107631, 0x0201f800, 0x0002032c, + 0x0401f797, 0x49425a07, 0x0201f800, 0x0002032c, + 0x0401f793, 0x0201f800, 0x00101992, 0x0401f7cb, + 0x0201f800, 0x00100b11, 0x0401f7a3, 0x412d0000, + 0x592e580a, 0x0201f800, 0x00100581, 0x40825800, + 0x0401f7af, 0x0201f800, 0x00100b11, 0x0401f7e1, + 0x40865800, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00000002, 0x1c01f000, 0x0201f800, 0x0010846b, + 0x80c589c0, 0x04020002, 0x0401f003, 0x5932680a, + 0x0401ff49, 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, - 0x48913804, 0x48953805, 0x48993806, 0x42010000, - 0x00000001, 0x41790800, 0x497bc856, 0x41311000, - 0x41351800, 0x41452000, 0x413d2800, 0x40593000, - 0x4200d000, 0x0010c15e, 0x0201f800, 0x00104d89, - 0x59a8d21b, 0x8c68d508, 0x0400001d, 0x8c68d516, - 0x0402001b, 0x59aa687d, 0x813669c0, 0x04000076, - 0x5934d400, 0x82697480, 0x00000404, 0x04020072, - 0x0201f800, 0x00105e04, 0x40c66000, 0x80c589c0, - 0x04000067, 0x48818c07, 0x4935880a, 0x40867800, - 0x0201f800, 0x001038ff, 0x4200d000, 0x00000005, - 0x0201f800, 0x00103909, 0x42027000, 0x00000003, - 0x0201f800, 0x00105e2e, 0x0401f05f, 0x8c68d506, - 0x04020003, 0x8c68d50a, 0x04000014, 0x0201f800, - 0x00103baa, 0x80c589c0, 0x0400000a, 0x83acd400, - 0x000007fe, 0x586a6800, 0x5934d200, 0x8468d51a, - 0x486a6a00, 0x59a8d21b, 0x8c68d506, 0x0402003b, - 0x808509c0, 0x04000005, 0x8d0e1d20, 0x0402003b, - 0x0201f800, 0x0010b83b, 0x80817040, 0x04020046, - 0x4200b000, 0x000007f0, 0x417a8800, 0x0401f004, - 0x81468800, 0x8058b040, 0x0400003f, 0x0201f800, - 0x001039c0, 0x80c589c0, 0x040007fa, 0x5934d200, - 0x8c68d51a, 0x040007f7, 0x5934d403, 0x406a8800, - 0x417a7800, 0x42028000, 0x00000029, 0x413cd000, - 0x413cd800, 0x0201f800, 0x001082e7, 0x5934d200, - 0x8468d558, 0x486a6a00, 0x5934d200, 0x8468d51a, + 0x48913804, 0x41311000, 0x41352000, 0x4933c857, + 0x4947c857, 0x4943c857, 0x0201f800, 0x001051ba, + 0x40c51800, 0x0201f800, 0x00108346, 0x41310800, + 0x813261c0, 0x04000048, 0x42000000, 0x0010cc6c, + 0x81317480, 0x04000044, 0x59a8d00d, 0x8068d040, + 0x42010000, 0x0010ccb4, 0x40680000, 0x81657480, + 0x0400000f, 0x41580000, 0x80817480, 0x0402100c, + 0x40826000, 0x40800000, 0x80857480, 0x04000003, + 0x4084d000, 0x0401ffd1, 0x82810400, 0x00000024, + 0x41580000, 0x80817480, 0x040017f6, 0x41510000, + 0x41540000, 0x80817480, 0x04021012, 0x8d3e7d18, + 0x04000010, 0x59a8d05e, 0x59a8005f, 0x80697480, + 0x0400000c, 0x40826000, 0x5880d00a, 0x8068d1c0, + 0x0400000d, 0x4084d000, 0x0401ffbc, 0x82810400, + 0x00000024, 0x41540000, 0x80817480, 0x040017f0, + 0x408a6000, 0x40926800, 0x808d7040, 0x04000018, + 0x0401f01d, 0x0201f800, 0x001039cf, 0x40c66800, + 0x80c589c0, 0x040007f2, 0x58c4d002, 0x5930d820, + 0x82680500, 0x00ffffff, 0x806d7480, 0x040207ec, + 0x5930d203, 0x82697480, 0x00000008, 0x0400000b, + 0x4936600a, 0x0401fef0, 0x82810400, 0x00000024, + 0x0401f7e5, 0x59a8d00d, 0x0401f7be, 0x0201f800, + 0x001051ab, 0x0401f004, 0x0201f800, 0x001087ea, + 0x0401f7f4, 0x589d2004, 0x589d1803, 0x589d1002, + 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000005, + 0x1c01f000, 0x829d3c80, 0x00000007, 0x48813800, + 0x48853801, 0x48893802, 0x488d3803, 0x48913804, + 0x48953805, 0x48993806, 0x42010000, 0x00000001, + 0x41790800, 0x497bc856, 0x41311000, 0x41351800, + 0x41452000, 0x413d2800, 0x40593000, 0x4200d000, + 0x0010c159, 0x0201f800, 0x00104e15, 0x59a8d21b, + 0x8c68d508, 0x0400001d, 0x8c68d516, 0x0402001b, + 0x59aa687d, 0x813669c0, 0x0400007a, 0x5934d400, + 0x82697480, 0x00000404, 0x04020076, 0x0201f800, + 0x00105e80, 0x40c66000, 0x80c589c0, 0x0400006b, + 0x48818c07, 0x4935880a, 0x40867800, 0x0201f800, + 0x0010390b, 0x4200d000, 0x00000005, 0x0201f800, + 0x00103915, 0x42027000, 0x00000003, 0x0201f800, + 0x00105eaa, 0x0401f063, 0x8c68d506, 0x04020003, + 0x8c68d50a, 0x04000014, 0x0201f800, 0x00103bbd, + 0x80c589c0, 0x0400000a, 0x83acd400, 0x000007fe, + 0x586a6800, 0x5934d200, 0x8468d51a, 0x486a6a00, + 0x59a8d21b, 0x8c68d506, 0x0402003c, 0x808509c0, + 0x04000005, 0x8d0e1d20, 0x0402003c, 0x0201f800, + 0x0010b84b, 0x80817040, 0x0402004a, 0x4200b000, + 0x000007f0, 0x417a8800, 0x0401f01c, 0x826cd540, + 0x00001000, 0x486a6a00, 0x5934d200, 0x8468d51a, 0x486a6a00, 0x4937c857, 0x4a026c00, 0x00000707, - 0x0201f800, 0x0010512e, 0x40c50000, 0x417a6000, - 0x0201f800, 0x0010bb8e, 0x0201f800, 0x0010bc6a, - 0x417a7800, 0x0201f800, 0x0010bd03, 0x0201f800, - 0x0010c0f3, 0x80817040, 0x040207d6, 0x0201f800, - 0x0010511f, 0x0401f7d3, 0x41790000, 0x42010800, - 0x00000001, 0x0401f7c3, 0x4200d000, 0x000007d0, - 0x4200d800, 0x0010c15e, 0x0201f800, 0x00104e9c, - 0x0201f800, 0x0010b83b, 0x0401f7c0, 0x4200d000, - 0x00000098, 0x40c4d800, 0x4134e000, 0x0201f800, - 0x001001e3, 0x408a6000, 0x408e6800, 0x40928800, - 0x40967800, 0x4098b000, 0x589d3006, 0x589d2805, - 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000007, 0x1c01f000, - 0x497bc856, 0x0201f800, 0x001040d9, 0x80c589c0, - 0x0402002b, 0x59a8d015, 0x8c68d504, 0x04000031, - 0x8d0e1d20, 0x0400001c, 0x4200b000, 0x000007f0, - 0x417a8800, 0x0401f004, 0x81468800, 0x8058b040, - 0x04000015, 0x0201f800, 0x001039c0, 0x80c589c0, - 0x040007fa, 0x0201f800, 0x00103c43, 0x80c589c0, - 0x040007f6, 0x59a8d00f, 0x59340002, 0x8068d580, - 0x8268d500, 0x00ffff00, 0x040207f0, 0x5934d200, - 0x8468d55a, 0x486a6a00, 0x81468800, 0x8058b040, - 0x040207ed, 0x0201f800, 0x00103baa, 0x80c589c0, - 0x04000020, 0x59a8d029, 0x4200d800, 0x0010c15e, - 0x0201f800, 0x00104e9c, 0x0401f01f, 0x83acd400, - 0x000007fe, 0x586a6800, 0x813669c0, 0x040007d5, - 0x5934d200, 0x8468d51a, 0x486a6a00, 0x0401f7d1, - 0x59a8d21b, 0x8c68d506, 0x040007ce, 0x83acd400, - 0x000007fe, 0x586a6800, 0x813669c0, 0x040007c9, - 0x0201f800, 0x00103c43, 0x80c589c0, 0x040007c5, - 0x5934d200, 0x8468d55a, 0x486a6a00, 0x0401f7c1, - 0x8d0e1d20, 0x040007e5, 0x4200d000, 0x000007d0, - 0x0401f7de, 0x1c01f000, 0x829d3c80, 0x00000003, - 0x48813800, 0x48853801, 0x48893802, 0x40691000, - 0x40710800, 0x4978e000, 0x83457480, 0x000007ff, - 0x83f17500, 0x03000000, 0x04000047, 0x4978e002, - 0x4944e001, 0x4144e800, 0x42010000, 0x00108b80, - 0x4200b000, 0x000007f0, 0x83457480, 0x000007ef, - 0x04000039, 0x04001038, 0x4200b000, 0x00000010, - 0x8058b1c0, 0x04000017, 0x40740000, 0x8080d400, - 0x5868f000, 0x8078f1c0, 0x04020043, 0x5884e001, - 0x41440000, 0x80717480, 0x0400005b, 0x8070d000, - 0x8074e800, 0x83457480, 0x000007ef, 0x0400004d, - 0x0400104c, 0x82697480, 0x00000800, 0x0400002e, - 0x48690801, 0x8058b040, 0x8058b1c0, 0x040207eb, - 0x5884d802, 0x806cd9c0, 0x04000065, 0x412d0000, - 0x4088d000, 0x0201f800, 0x0010392e, 0x4947c857, - 0x4937c857, 0x40825800, 0x813669c0, 0x04000062, - 0x497a6a12, 0x59a8d21b, 0x8c68d50a, 0x0402000a, - 0x8288dd00, 0x00ffff00, 0x04000050, 0x59a8d00f, - 0x8268d500, 0x00ffff00, 0x406c0000, 0x80697480, - 0x0400004a, 0x488a6802, 0x4200d000, 0x00000001, - 0x0401f079, 0x82697480, 0x00fffffb, 0x040007c9, - 0x040017c8, 0x4947c857, 0x488bc857, 0x58857001, - 0x48bbc857, 0x4a010800, 0x00000019, 0x4178d000, - 0x0401f06d, 0x4a010801, 0x000007f0, 0x4200e800, - 0x000007f0, 0x42010000, 0x00108b80, 0x8058b040, - 0x0401f7ce, 0x5878d002, 0x8268e500, 0x00ffffff, - 0x48710803, 0x40880000, 0x80717480, 0x04000049, - 0x5884e001, 0x41440000, 0x80717480, 0x040207b8, - 0x58797002, 0x48b90803, 0x4947c857, 0x58857003, - 0x48bbc857, 0x4a010800, 0x0000001b, 0x0401f7e4, - 0x82697480, 0x000007f0, 0x040207b6, 0x49790801, - 0x42010000, 0x00108b80, 0x4178e800, 0x8058b040, - 0x0401f7b2, 0x49450802, 0x83457480, 0x000007ef, - 0x0400000e, 0x0400100d, 0x83457480, 0x000007fc, - 0x04000028, 0x83457480, 0x000007fd, 0x0400001a, - 0x83457480, 0x000007ff, 0x0402001a, 0x82897480, - 0x00ffffff, 0x04020017, 0x5884d002, 0x8468d55e, - 0x48690802, 0x0401f792, 0x8288d500, 0x000000ff, - 0x8068d0d0, 0x486a6a12, 0x0401f7b3, 0x4200d000, - 0x000003f1, 0x4084e000, 0x0201f800, 0x001001e3, - 0x0401f797, 0x4947c857, 0x4a010800, 0x0000000a, - 0x0401f7b7, 0x82897480, 0x00fffffd, 0x040007eb, - 0x4947c857, 0x488bc857, 0x58857001, 0x48bbc857, - 0x4a010800, 0x00000019, 0x4078d000, 0x0401f01a, - 0x82897480, 0x00fffffc, 0x040007e0, 0x0401f7f5, - 0x5884d001, 0x41440000, 0x80697480, 0x04000007, - 0x4947c857, 0x4873c857, 0x486fc857, 0x4a010800, - 0x0000001a, 0x0401f79e, 0x407a6800, 0x8c6cdd08, - 0x0400078e, 0x0201f800, 0x00103b9d, 0x80c589c0, - 0x0400078a, 0x4947c857, 0x4a010800, 0x0000001d, - 0x0401f793, 0x40698800, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000003, 0x1c01f000, - 0x809d3840, 0x48813800, 0x4200d000, 0x00009c0e, - 0x4200d800, 0xfffffff7, 0x0201f800, 0x0010b3e0, - 0x4200d000, 0x00009c0e, 0x4200d800, 0x00000010, - 0x0201f800, 0x0010b3f2, 0x59c4d0a3, 0x8468d518, - 0x486b88a3, 0x0201f800, 0x00102ede, 0x80c589c0, - 0x04000007, 0x599cd019, 0x8268d500, 0x0000e000, - 0x82697480, 0x00004000, 0x0400008c, 0x4200d000, - 0x00000080, 0x0201f800, 0x001012db, 0x0201f800, - 0x00104ed1, 0x59c4d0a3, 0x8468d506, 0x486b88a3, - 0x0201f800, 0x001040e4, 0x80c589c0, 0x04020005, - 0x0201f800, 0x001040fa, 0x80c589c0, 0x0400006c, - 0x59c4d0a3, 0x8268d500, 0xbe7fffff, 0x486b88a3, - 0x4200d000, 0x000000f8, 0x0201f800, 0x00103669, - 0x59c4d0a3, 0x8268d540, 0x00018000, 0x8468d51c, - 0x486b88a3, 0x59c4d0a3, 0x8468d520, 0x486b88a3, - 0x4a038808, 0x00000200, 0x59c4d006, 0x8268d500, - 0xfbffff0e, 0x486b8806, 0x497b282c, 0x497b282d, - 0x4200d000, 0x000001f4, 0x4200d800, 0x0010c547, - 0x0201f800, 0x00104d74, 0x4a038805, 0x00000001, - 0x0201f800, 0x001013a5, 0x80c589c0, 0x04020023, - 0x0201f800, 0x001013b0, 0x80c589c0, 0x04000035, - 0x4178d000, 0x0201f800, 0x0010159b, 0x4178d000, - 0x0201f800, 0x00101571, 0x0201f800, 0x001015fb, - 0x4a035038, 0x00000001, 0x0201f800, 0x001040e4, - 0x80c589c0, 0x04000018, 0x59c4d0a4, 0x8268d500, - 0x0000000f, 0x82697480, 0x00000008, 0x04000003, - 0x4a038805, 0x04000000, 0x59c4d0a3, 0x8268d540, - 0x0001c000, 0x486b88a3, 0x59c4d0a3, 0x8468d520, - 0x486b88a3, 0x0401f077, 0x4200d000, 0x00000001, - 0x0201f800, 0x0010159b, 0x4200d000, 0x00000001, - 0x0401f7e0, 0x0201f800, 0x001040fa, 0x80c589c0, - 0x040207e6, 0x0201f800, 0x001040ef, 0x4200d000, - 0x000001a1, 0x80c589c0, 0x04020052, 0x599cd818, - 0x40c4e000, 0x0201f800, 0x001001e3, 0x0401f061, - 0x0201f800, 0x001013bb, 0x80c589c0, 0x04020030, - 0x0201f800, 0x001013c6, 0x80c589c0, 0x04000039, - 0x4200d000, 0x00000003, 0x0201f800, 0x0010159b, - 0x4200d000, 0x00000003, 0x0401f7c2, 0x0201f800, - 0x001040ef, 0x4200d000, 0x0000014e, 0x80c589c0, - 0x040007e7, 0x59c4d0a3, 0x8468d570, 0x8468d532, - 0x486b88a3, 0x0201f800, 0x00104416, 0x4a038808, - 0x00000208, 0x0401f799, 0x59a8d86b, 0x826d0500, - 0x00000007, 0x04020019, 0x59a8d037, 0x82697480, - 0x00000002, 0x04000018, 0x0201f800, 0x00101568, - 0x48835036, 0x0201f800, 0x0010191b, 0x4a035044, - 0x00000003, 0x4a035037, 0x00000002, 0x4a035043, - 0x00000001, 0x59a8d86b, 0x0401f00b, 0x4200d000, - 0x00000002, 0x0201f800, 0x0010159b, 0x4200d000, - 0x00000002, 0x0401f797, 0x82817480, 0x00000004, - 0x04000019, 0x806cd000, 0x486b506b, 0x0401f754, - 0x0201f800, 0x001013d1, 0x80c589c0, 0x0400000e, - 0x59a8d043, 0x8068d1c0, 0x0400078c, 0x0201f800, - 0x001013db, 0x4a035038, 0x00000001, 0x0401f015, - 0x4a035014, 0x00000001, 0x0201f800, 0x0010405c, - 0x0401f010, 0x4200d000, 0x00000182, 0x59a8d837, - 0x0401f7a8, 0x497b2804, 0x497b2805, 0x0201f800, - 0x0010192a, 0x4a035043, 0x00000001, 0x4a035044, - 0xaabbccdd, 0x48835037, 0x59a8d86b, 0x0401f7de, - 0x589d0000, 0x809d3800, 0x1c01f000, 0x5994d02c, - 0x8068d1c0, 0x04020006, 0x5994d02d, 0x4200d800, - 0x00000001, 0x8068d1c0, 0x04000002, 0x4178d800, - 0x406d8800, 0x1c01f000, 0x0201f800, 0x00101568, - 0x4a035038, 0x00000002, 0x497b5043, 0x59c4d0a3, - 0x8468d520, 0x486b88a3, 0x0201f800, 0x00102ede, - 0x80c589c0, 0x04000002, 0x0401f00d, 0x0201f800, - 0x001040ef, 0x80c589c0, 0x040207fc, 0x48c7282c, - 0x48c7282d, 0x4200d000, 0x0000002d, 0x4200d800, - 0x0010c547, 0x0201f800, 0x00104d74, 0x1c01f000, - 0x0401ffdb, 0x80c589c0, 0x04000004, 0x4a035038, - 0x00000003, 0x0401f01f, 0x0201f800, 0x001013d1, - 0x80c589c0, 0x04000004, 0x59a8d043, 0x8068d1c0, - 0x04020008, 0x0201f800, 0x001015ca, 0x80c589c0, - 0x04020002, 0x0401f013, 0x0401ffd4, 0x0401f011, - 0x0201f800, 0x001013db, 0x59a8d042, 0x8c68d51e, - 0x040007f9, 0x0201f800, 0x001040ef, 0x80c589c0, - 0x04020003, 0x0401ffc9, 0x0401f006, 0x4a035014, - 0x00000001, 0x0201f800, 0x0010405c, 0x0401f7fa, - 0x1c01f000, 0x4202d800, 0x00000001, 0x497b5038, - 0x4a038805, 0x00000001, 0x497b282c, 0x497b282d, - 0x497b8885, 0x1c01f000, 0x59c4d005, 0x8268d500, - 0x000000c0, 0x04020003, 0x486b8885, 0x0401f006, - 0x59c4d006, 0x8268d540, 0x000000f1, 0x486b8806, - 0x0401ffed, 0x1c01f000, 0x0201f800, 0x001040fa, - 0x80c589c0, 0x04000005, 0x59a8d013, 0x82697480, - 0x0000aaaa, 0x0400000c, 0x497b5013, 0x59c4d006, - 0x8268d540, 0x04000001, 0x486b8806, 0x8d0e1d06, - 0x04020008, 0x59c4d0a3, 0x8468d546, 0x486b88a3, - 0x0401f004, 0x4a03500f, 0x00ffffff, 0x0401f7f3, - 0x0401ffd5, 0x1c01f000, 0x809d3840, 0x48813800, - 0x0401ff87, 0x80c589c0, 0x04000005, 0x4a035038, - 0x00000003, 0x497b8885, 0x0401f08b, 0x4a038805, - 0x000000f0, 0x0201f800, 0x001015ca, 0x80c589c0, - 0x04000042, 0x0201f800, 0x001017bd, 0x80c589c0, - 0x04000048, 0x59a8d04b, 0x8c68d50c, 0x0400005e, - 0x0201f800, 0x001017bd, 0x80c589c0, 0x0402000b, - 0x4a03c014, 0x00200020, 0x59c4d001, 0x8268d500, - 0x00018000, 0x82697480, 0x00018000, 0x0400005f, - 0x4a03c013, 0x00200000, 0x0201f800, 0x001040ef, - 0x80c589c0, 0x0402004a, 0x59c4d0a4, 0x8268d500, - 0x0000000f, 0x82697480, 0x00000008, 0x0400002b, - 0x59c4d005, 0x82690500, 0x04000000, 0x8c68d534, - 0x04020026, 0x5994d02c, 0x82697480, 0x00000002, - 0x83f17500, 0x03000000, 0x040007cf, 0x0201f800, - 0x001040fa, 0x80c589c0, 0x040007cb, 0x4a038805, - 0x000000f0, 0x0201f800, 0x00104128, 0x4a035013, - 0x0000aaaa, 0x48835014, 0x59c4d0a3, 0x8468d546, - 0x486b88a3, 0x4202d800, 0x00000001, 0x48835038, - 0x4a038805, 0x00000001, 0x4883282c, 0x4883282d, - 0x0401ff8e, 0x0401f7b8, 0x0201f800, 0x001013d1, - 0x80c589c0, 0x040007b4, 0x59a8d043, 0x8068d1c0, - 0x040007b1, 0x0401f7ae, 0x0401ff90, 0x0401f7ae, - 0x0201f800, 0x00101793, 0x80c589c0, 0x040007b6, - 0x0201f800, 0x001017a1, 0x80c589c0, 0x04000022, - 0x0201f800, 0x001013c6, 0x80c589c0, 0x0400002a, - 0x59a8d044, 0x42000000, 0xaabbccdd, 0x80697480, - 0x04000004, 0x82697480, 0x00000004, 0x040207a6, - 0x4a035038, 0x00000003, 0x0401f023, 0x0401ff6b, - 0x0401f021, 0x4200d000, 0x00009c0e, 0x4200d800, - 0xffffffef, 0x0201f800, 0x0010b3e0, 0x4200d000, - 0x00009c0e, 0x4200d800, 0x00000008, 0x0201f800, - 0x0010b3f2, 0x0401f797, 0x4a03c013, 0x00200020, - 0x0401f7a2, 0x0201f800, 0x001013a5, 0x80c589c0, - 0x0400000b, 0x59a8d044, 0x42000000, 0xaabbccdd, - 0x80697480, 0x040007e3, 0x8068d1c0, 0x04020786, - 0x0401f7e0, 0x59a8d044, 0x0401f7db, 0x59a8d044, - 0x0401f7fa, 0x589d0000, 0x809d3800, 0x1c01f000, - 0x497bc856, 0x4200d000, 0x00000080, 0x0201f800, - 0x001012db, 0x497b5038, 0x0201f800, 0x001013d1, - 0x80c589c0, 0x0400000e, 0x59a8d036, 0x8068d1c0, - 0x04020008, 0x8068d1c0, 0x04020009, 0x4a035036, - 0x0000000a, 0x4a035043, 0x00000001, 0x0401f004, - 0x8068d040, 0x486b5036, 0x0401f7f7, 0x497b8885, - 0x0201f800, 0x001003ba, 0x1c01f000, 0x4200e000, - 0x00000003, 0x59a80038, 0x80717480, 0x04001006, - 0x0c01f001, 0x0010c541, 0x0010c543, 0x0010c545, - 0x0010c53f, 0x4200d000, 0x000000c3, 0x4000d800, - 0x0201f800, 0x001001e3, 0x0401f008, 0x0401ffd5, - 0x0401f006, 0x0401fddb, 0x0401f004, 0x0401fee9, - 0x0401f002, 0x0401ff39, 0x1c01f000, 0x497b282d, - 0x1c01f000, 0x0201f800, 0x00102ede, 0x80c589c0, - 0x04000007, 0x599cd019, 0x8268d500, 0x0000e000, - 0x82697480, 0x00004000, 0x04000003, 0x4178d000, - 0x0401f024, 0x59c4d001, 0x8268d500, 0x00018000, - 0x82697480, 0x00010000, 0x040207f9, 0x59a8d06c, - 0x82697480, 0x00000002, 0x83f17500, 0x03000000, - 0x040007f3, 0x0201f800, 0x0010192a, 0x4a035043, - 0x00000001, 0x4a035044, 0xaabbccdd, 0x4a035037, - 0x00000004, 0x497b5038, 0x4202d800, 0x00000004, - 0x59a8d06c, 0x8068d000, 0x486b506c, 0x59a8d06b, - 0x8268d500, 0xfffffff8, 0x8468d544, 0x486b506b, - 0x0201f800, 0x00100401, 0x4200d000, 0x00000001, - 0x40698800, 0x1c01f000, 0x59a8d017, 0x82697480, - 0x0000ffff, 0x04000004, 0x0201f800, 0x0010b83b, - 0x0401f0b2, 0x59a8da1b, 0x826cd500, 0x00000028, - 0x04000025, 0x8c6cdd00, 0x04000023, 0x4a038802, - 0x0000ffbf, 0x59a8da1b, 0x8c6cdd02, 0x0400001e, - 0x599ce018, 0x8c70e516, 0x04020012, 0x59a8d01c, - 0x82697480, 0x0000ffff, 0x0400000e, 0x0201f800, - 0x00101947, 0x59a8d21b, 0x8268dd00, 0x00000004, - 0x8c68d504, 0x04020051, 0x406e5800, 0x4200d000, - 0x00000003, 0x0201f800, 0x0010196a, 0x0401f093, - 0x8c70e516, 0x04020005, 0x59a8d01c, 0x82697480, - 0x0000ffff, 0x04000085, 0x59a8d01d, 0x8068d1c0, - 0x04020042, 0x8c6cdd08, 0x04000041, 0x599cd019, - 0x8c68d510, 0x04000042, 0x0201f800, 0x00103baa, - 0x80c589c0, 0x04020039, 0x599cd019, 0x8c68d510, - 0x0400003e, 0x59a8d21b, 0x8c68d508, 0x0400003b, - 0x4a038802, 0x0000ffff, 0x4200d000, 0x00109457, - 0x0201f800, 0x0010050d, 0x4200d000, 0x00109464, - 0x0201f800, 0x0010050d, 0x850e1d02, 0x4a01a8e4, - 0x00000080, 0x4202d800, 0x00000003, 0x4a035017, - 0x0000ffff, 0x0201f800, 0x001003e8, 0x4178d000, - 0x0201f800, 0x001012db, 0x497b506c, 0x59a8d21b, - 0x8c68d506, 0x04000048, 0x599cd018, 0x8268e500, - 0x00000800, 0x8c68d516, 0x04020040, 0x599cd019, - 0x8c68d510, 0x04000004, 0x59a8d21b, 0x8c68d508, - 0x04020049, 0x4200d000, 0x0000ffff, 0x4200d800, - 0x00000006, 0x4178e000, 0x0201f800, 0x00102e27, - 0x0201f800, 0x001040fa, 0x80c589c0, 0x04000020, - 0x0201f800, 0x00105456, 0x0401f048, 0x59a8d016, - 0x8068d1c0, 0x040007c1, 0x0401f044, 0x8c6cdd16, - 0x040207be, 0x0401f041, 0x599cd018, 0x8c68d516, - 0x0400001d, 0x599cd017, 0x8c68d50a, 0x040007c1, + 0x0201f800, 0x001051ba, 0x40c50000, 0x417a6000, + 0x0201f800, 0x0010bb9e, 0x0201f800, 0x0010bc6f, + 0x417a7800, 0x0201f800, 0x0010bd08, 0x0201f800, + 0x0010c0ee, 0x80817040, 0x04000025, 0x81468800, + 0x8058b040, 0x0400002b, 0x0201f800, 0x001039cf, + 0x80c589c0, 0x040007fa, 0x5934da00, 0x8c6cdd1a, + 0x040007f7, 0x5934d403, 0x406a8800, 0x417a7800, + 0x42028000, 0x00000029, 0x8d0e1d20, 0x040007d8, + 0x413cd000, 0x413cd800, 0x0201f800, 0x00108398, + 0x5934da00, 0x0401f7d2, 0x41790000, 0x42010800, + 0x00000001, 0x0401f7c2, 0x4200d000, 0x000007d0, + 0x4200d800, 0x0010c159, 0x0201f800, 0x00104f28, + 0x0201f800, 0x0010b84b, 0x0401f7bf, 0x0201f800, + 0x001051ab, 0x0401f7da, 0x4200d000, 0x000000a0, + 0x40c4d800, 0x4134e000, 0x0201f800, 0x001001e3, + 0x408a6000, 0x408e6800, 0x40928800, 0x40967800, + 0x4098b000, 0x589d3006, 0x589d2805, 0x589d2004, + 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000007, 0x1c01f000, 0x497bc856, + 0x0201f800, 0x0010410f, 0x80c589c0, 0x0402002e, + 0x59a8d015, 0x8c68d504, 0x04000034, 0x8d0e1d20, + 0x04020004, 0x59a8d006, 0x8c68d51c, 0x0400001c, 0x4200b000, 0x000007f0, 0x417a8800, 0x0401f004, - 0x81468800, 0x8058b040, 0x040007ba, 0x0201f800, - 0x001039c0, 0x80c589c0, 0x040007fa, 0x5934d200, + 0x81468800, 0x8058b040, 0x04000015, 0x0201f800, + 0x001039cf, 0x80c589c0, 0x040007fa, 0x0201f800, + 0x00103c58, 0x80c589c0, 0x040007f6, 0x59a8d00f, + 0x59340002, 0x8068d580, 0x8268d500, 0x00ffff00, + 0x040207f0, 0x5934d200, 0x8468d55a, 0x486a6a00, + 0x81468800, 0x8058b040, 0x040207ed, 0x0201f800, + 0x00103bbd, 0x80c589c0, 0x04000020, 0x59a8d029, + 0x4200d800, 0x0010c159, 0x0201f800, 0x00104f28, + 0x0401f022, 0x83acd400, 0x000007fe, 0x586a6800, + 0x813669c0, 0x040007d2, 0x5934d200, 0x8468d51a, + 0x486a6a00, 0x0401f7ce, 0x59a8d21b, 0x8c68d506, + 0x040007cb, 0x83acd400, 0x000007fe, 0x586a6800, + 0x813669c0, 0x040007c6, 0x0201f800, 0x00103c58, + 0x80c589c0, 0x040007c2, 0x5934d200, 0x8468d55a, + 0x486a6a00, 0x0401f7be, 0x8d0e1d20, 0x04020004, + 0x59a8d006, 0x8c68d51c, 0x040007e2, 0x4200d000, + 0x000007d0, 0x0401f7db, 0x1c01f000, 0x829d3c80, + 0x00000003, 0x48813800, 0x48853801, 0x48893802, + 0x40691000, 0x40710800, 0x4978e000, 0x83457480, + 0x000007ff, 0x83f17500, 0x03000000, 0x04000047, + 0x4978e002, 0x4944e001, 0x4144e800, 0x42010000, + 0x00108c00, 0x4200b000, 0x000007f0, 0x83457480, + 0x000007ef, 0x04000039, 0x04001038, 0x4200b000, + 0x00000010, 0x8058b1c0, 0x04000017, 0x40740000, + 0x8080d400, 0x5868f000, 0x8078f1c0, 0x04020043, + 0x5884e001, 0x41440000, 0x80717480, 0x0400005b, + 0x8070d000, 0x8074e800, 0x83457480, 0x000007ef, + 0x0400004d, 0x0400104c, 0x82697480, 0x00000800, + 0x0400002e, 0x48690801, 0x8058b040, 0x8058b1c0, + 0x040207eb, 0x5884d802, 0x806cd9c0, 0x04000065, + 0x412d0000, 0x4088d000, 0x0201f800, 0x0010393d, + 0x4947c857, 0x4937c857, 0x40825800, 0x813669c0, + 0x04000062, 0x497a6a12, 0x59a8d21b, 0x8c68d50a, + 0x0402000a, 0x8288dd00, 0x00ffff00, 0x04000050, + 0x59a8d00f, 0x8268d500, 0x00ffff00, 0x406c0000, + 0x80697480, 0x0400004a, 0x488a6802, 0x4200d000, + 0x00000001, 0x0401f079, 0x82697480, 0x00fffffb, + 0x040007c9, 0x040017c8, 0x4947c857, 0x488bc857, + 0x58857001, 0x48bbc857, 0x4a010800, 0x00000019, + 0x4178d000, 0x0401f06d, 0x4a010801, 0x000007f0, + 0x4200e800, 0x000007f0, 0x42010000, 0x00108c00, + 0x8058b040, 0x0401f7ce, 0x5878d002, 0x8268e500, + 0x00ffffff, 0x48710803, 0x40880000, 0x80717480, + 0x04000049, 0x5884e001, 0x41440000, 0x80717480, + 0x040207b8, 0x58797002, 0x48b90803, 0x4947c857, + 0x58857003, 0x48bbc857, 0x4a010800, 0x0000001b, + 0x0401f7e4, 0x82697480, 0x000007f0, 0x040207b6, + 0x49790801, 0x42010000, 0x00108c00, 0x4178e800, + 0x8058b040, 0x0401f7b2, 0x49450802, 0x83457480, + 0x000007ef, 0x0400000e, 0x0400100d, 0x83457480, + 0x000007fc, 0x04000028, 0x83457480, 0x000007fd, + 0x0400001a, 0x83457480, 0x000007ff, 0x0402001a, + 0x82897480, 0x00ffffff, 0x04020017, 0x5884d002, + 0x8468d55e, 0x48690802, 0x0401f792, 0x8288d500, + 0x000000ff, 0x8068d0d0, 0x486a6a12, 0x0401f7b3, + 0x4200d000, 0x0000044d, 0x4084e000, 0x0201f800, + 0x001001e3, 0x0401f797, 0x4947c857, 0x4a010800, + 0x0000000a, 0x0401f7b7, 0x82897480, 0x00fffffd, + 0x040007eb, 0x4947c857, 0x488bc857, 0x58857001, + 0x48bbc857, 0x4a010800, 0x00000019, 0x4078d000, + 0x0401f01a, 0x82897480, 0x00fffffc, 0x040007e0, + 0x0401f7f5, 0x5884d001, 0x41440000, 0x80697480, + 0x04000007, 0x4947c857, 0x4873c857, 0x486fc857, + 0x4a010800, 0x0000001a, 0x0401f79e, 0x407a6800, + 0x8c6cdd08, 0x0400078e, 0x0201f800, 0x00103bb0, + 0x80c589c0, 0x0400078a, 0x4947c857, 0x4a010800, + 0x0000001d, 0x0401f793, 0x40698800, 0x589d1002, + 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000003, + 0x1c01f000, 0x809d3840, 0x48813800, 0x4200d000, + 0x00009c0e, 0x4200d800, 0xfffffff7, 0x0201f800, + 0x0010b3e0, 0x4200d000, 0x00009c0e, 0x4200d800, + 0x00000010, 0x0201f800, 0x0010b3f2, 0x59c4d0a3, + 0x8468d518, 0x486b88a3, 0x0201f800, 0x00102ee2, + 0x80c589c0, 0x04000007, 0x599cd019, 0x8268d500, + 0x0000e000, 0x82697480, 0x00004000, 0x0400008c, + 0x4200d000, 0x00000080, 0x0201f800, 0x001012d9, + 0x0201f800, 0x00104f5d, 0x59c4d0a3, 0x8468d506, + 0x486b88a3, 0x0201f800, 0x0010411a, 0x80c589c0, + 0x04020005, 0x0201f800, 0x00104130, 0x80c589c0, + 0x0400006c, 0x59c4d0a3, 0x8268d500, 0xbe7fffff, + 0x486b88a3, 0x4200d000, 0x000000f8, 0x0201f800, + 0x00103675, 0x59c4d0a3, 0x8268d540, 0x00018000, + 0x8468d51c, 0x486b88a3, 0x59c4d0a3, 0x8468d520, + 0x486b88a3, 0x4a038808, 0x00000200, 0x59c4d006, + 0x8268d500, 0xfbffff0e, 0x486b8806, 0x497b282c, + 0x497b282d, 0x4200d000, 0x000001f4, 0x4200d800, + 0x0010c54c, 0x0201f800, 0x00104e00, 0x4a038805, + 0x00000001, 0x0201f800, 0x001013a3, 0x80c589c0, + 0x04020023, 0x0201f800, 0x001013ae, 0x80c589c0, + 0x04000035, 0x4178d000, 0x0201f800, 0x00101599, + 0x4178d000, 0x0201f800, 0x0010156f, 0x0201f800, + 0x001015f9, 0x4a035038, 0x00000001, 0x0201f800, + 0x0010411a, 0x80c589c0, 0x04000018, 0x59c4d0a4, + 0x8268d500, 0x0000000f, 0x82697480, 0x00000008, + 0x04000003, 0x4a038805, 0x04000000, 0x59c4d0a3, + 0x8268d540, 0x0001c000, 0x486b88a3, 0x59c4d0a3, + 0x8468d520, 0x486b88a3, 0x0401f077, 0x4200d000, + 0x00000001, 0x0201f800, 0x00101599, 0x4200d000, + 0x00000001, 0x0401f7e0, 0x0201f800, 0x00104130, + 0x80c589c0, 0x040207e6, 0x0201f800, 0x00104125, + 0x4200d000, 0x000001a9, 0x80c589c0, 0x04020052, + 0x599cd818, 0x40c4e000, 0x0201f800, 0x001001e3, + 0x0401f061, 0x0201f800, 0x001013b9, 0x80c589c0, + 0x04020030, 0x0201f800, 0x001013c4, 0x80c589c0, + 0x04000039, 0x4200d000, 0x00000003, 0x0201f800, + 0x00101599, 0x4200d000, 0x00000003, 0x0401f7c2, + 0x0201f800, 0x00104125, 0x4200d000, 0x00000156, + 0x80c589c0, 0x040007e7, 0x59c4d0a3, 0x8468d570, + 0x8468d532, 0x486b88a3, 0x0201f800, 0x0010444c, + 0x4a038808, 0x00000208, 0x0401f799, 0x59a8d86b, + 0x826d0500, 0x00000007, 0x04020019, 0x59a8d037, + 0x82697480, 0x00000002, 0x04000018, 0x0201f800, + 0x00101566, 0x48835036, 0x0201f800, 0x0010191a, + 0x4a035044, 0x00000003, 0x4a035037, 0x00000002, + 0x4a035043, 0x00000001, 0x59a8d86b, 0x0401f00b, + 0x4200d000, 0x00000002, 0x0201f800, 0x00101599, + 0x4200d000, 0x00000002, 0x0401f797, 0x82817480, + 0x00000004, 0x04000019, 0x806cd000, 0x486b506b, + 0x0401f754, 0x0201f800, 0x001013cf, 0x80c589c0, + 0x0400000e, 0x59a8d043, 0x8068d1c0, 0x0400078c, + 0x0201f800, 0x001013d9, 0x4a035038, 0x00000001, + 0x0401f015, 0x4a035014, 0x00000001, 0x0201f800, + 0x00104092, 0x0401f010, 0x4200d000, 0x0000018a, + 0x59a8d837, 0x0401f7a8, 0x497b2804, 0x497b2805, + 0x0201f800, 0x00101929, 0x4a035043, 0x00000001, + 0x4a035044, 0xaabbccdd, 0x48835037, 0x59a8d86b, + 0x0401f7de, 0x589d0000, 0x809d3800, 0x1c01f000, + 0x5994d02c, 0x8068d1c0, 0x04020006, 0x5994d02d, + 0x4200d800, 0x00000001, 0x8068d1c0, 0x04000002, + 0x4178d800, 0x406d8800, 0x1c01f000, 0x0201f800, + 0x00101566, 0x4a035038, 0x00000002, 0x497b5043, + 0x59c4d0a3, 0x8468d520, 0x486b88a3, 0x0201f800, + 0x00102ee2, 0x80c589c0, 0x04000002, 0x0401f00d, + 0x0201f800, 0x00104125, 0x80c589c0, 0x040207fc, + 0x48c7282c, 0x48c7282d, 0x4200d000, 0x0000002d, + 0x4200d800, 0x0010c54c, 0x0201f800, 0x00104e00, + 0x1c01f000, 0x0401ffdb, 0x80c589c0, 0x04000004, + 0x4a035038, 0x00000003, 0x0401f01f, 0x0201f800, + 0x001013cf, 0x80c589c0, 0x04000004, 0x59a8d043, + 0x8068d1c0, 0x04020008, 0x0201f800, 0x001015c8, + 0x80c589c0, 0x04020002, 0x0401f013, 0x0401ffd4, + 0x0401f011, 0x0201f800, 0x001013d9, 0x59a8d042, + 0x8c68d51e, 0x040007f9, 0x0201f800, 0x00104125, + 0x80c589c0, 0x04020003, 0x0401ffc9, 0x0401f006, + 0x4a035014, 0x00000001, 0x0201f800, 0x00104092, + 0x0401f7fa, 0x1c01f000, 0x4202d800, 0x00000001, + 0x497b5038, 0x4a038805, 0x00000001, 0x497b282c, + 0x497b282d, 0x497b8885, 0x1c01f000, 0x59c4d005, + 0x8268d500, 0x000000c0, 0x04020003, 0x486b8885, + 0x0401f006, 0x59c4d006, 0x8268d540, 0x000000f1, + 0x486b8806, 0x0401ffed, 0x1c01f000, 0x0201f800, + 0x00104130, 0x80c589c0, 0x04000005, 0x59a8d013, + 0x82697480, 0x0000aaaa, 0x0400000c, 0x497b5013, + 0x59c4d006, 0x8268d540, 0x04000001, 0x486b8806, + 0x8d0e1d06, 0x04020008, 0x59c4d0a3, 0x8468d546, + 0x486b88a3, 0x0401f004, 0x4a03500f, 0x00ffffff, + 0x0401f7f3, 0x0401ffd5, 0x1c01f000, 0x809d3840, + 0x48813800, 0x0401ff87, 0x80c589c0, 0x04000005, + 0x4a035038, 0x00000003, 0x497b8885, 0x0401f08b, + 0x4a038805, 0x000000f0, 0x0201f800, 0x001015c8, + 0x80c589c0, 0x04000042, 0x0201f800, 0x001017bb, + 0x80c589c0, 0x04000048, 0x59a8d04b, 0x8c68d50c, + 0x0400005e, 0x0201f800, 0x001017bb, 0x80c589c0, + 0x0402000b, 0x4a03c014, 0x00200020, 0x59c4d001, + 0x8268d500, 0x00018000, 0x82697480, 0x00018000, + 0x0400005f, 0x4a03c013, 0x00200000, 0x0201f800, + 0x00104125, 0x80c589c0, 0x0402004a, 0x59c4d0a4, + 0x8268d500, 0x0000000f, 0x82697480, 0x00000008, + 0x0400002b, 0x59c4d005, 0x82690500, 0x04000000, + 0x8c68d534, 0x04020026, 0x5994d02c, 0x82697480, + 0x00000002, 0x83f17500, 0x03000000, 0x040007cf, + 0x0201f800, 0x00104130, 0x80c589c0, 0x040007cb, + 0x4a038805, 0x000000f0, 0x0201f800, 0x0010415e, + 0x4a035013, 0x0000aaaa, 0x48835014, 0x59c4d0a3, + 0x8468d546, 0x486b88a3, 0x4202d800, 0x00000001, + 0x48835038, 0x4a038805, 0x00000001, 0x4883282c, + 0x4883282d, 0x0401ff8e, 0x0401f7b8, 0x0201f800, + 0x001013cf, 0x80c589c0, 0x040007b4, 0x59a8d043, + 0x8068d1c0, 0x040007b1, 0x0401f7ae, 0x0401ff90, + 0x0401f7ae, 0x0201f800, 0x00101791, 0x80c589c0, + 0x040007b6, 0x0201f800, 0x0010179f, 0x80c589c0, + 0x04000022, 0x0201f800, 0x001013c4, 0x80c589c0, + 0x0400002a, 0x59a8d044, 0x42000000, 0xaabbccdd, + 0x80697480, 0x04000004, 0x82697480, 0x00000004, + 0x040207a6, 0x4a035038, 0x00000003, 0x0401f023, + 0x0401ff6b, 0x0401f021, 0x4200d000, 0x00009c0e, + 0x4200d800, 0xffffffef, 0x0201f800, 0x0010b3e0, + 0x4200d000, 0x00009c0e, 0x4200d800, 0x00000008, + 0x0201f800, 0x0010b3f2, 0x0401f797, 0x4a03c013, + 0x00200020, 0x0401f7a2, 0x0201f800, 0x001013a3, + 0x80c589c0, 0x0400000b, 0x59a8d044, 0x42000000, + 0xaabbccdd, 0x80697480, 0x040007e3, 0x8068d1c0, + 0x04020786, 0x0401f7e0, 0x59a8d044, 0x0401f7db, + 0x59a8d044, 0x0401f7fa, 0x589d0000, 0x809d3800, + 0x1c01f000, 0x497bc856, 0x4200d000, 0x00000080, + 0x0201f800, 0x001012d9, 0x497b5038, 0x0201f800, + 0x001013cf, 0x80c589c0, 0x0400000e, 0x59a8d036, + 0x8068d1c0, 0x04020008, 0x8068d1c0, 0x04020009, + 0x4a035036, 0x0000000a, 0x4a035043, 0x00000001, + 0x0401f004, 0x8068d040, 0x486b5036, 0x0401f7f7, + 0x497b8885, 0x0201f800, 0x001003ba, 0x1c01f000, + 0x4200e000, 0x00000003, 0x59a80038, 0x80717480, + 0x04001006, 0x0c01f001, 0x0010c546, 0x0010c548, + 0x0010c54a, 0x0010c544, 0x4200d000, 0x000000cb, + 0x4000d800, 0x0201f800, 0x001001e3, 0x0401f008, + 0x0401ffd5, 0x0401f006, 0x0401fddb, 0x0401f004, + 0x0401fee9, 0x0401f002, 0x0401ff39, 0x1c01f000, + 0x497b282d, 0x1c01f000, 0x0201f800, 0x00102ee2, + 0x80c589c0, 0x04000007, 0x599cd019, 0x8268d500, + 0x0000e000, 0x82697480, 0x00004000, 0x04000003, + 0x4178d000, 0x0401f024, 0x59c4d001, 0x8268d500, + 0x00018000, 0x82697480, 0x00010000, 0x040207f9, + 0x59a8d06c, 0x82697480, 0x00000002, 0x83f17500, + 0x03000000, 0x040007f3, 0x0201f800, 0x00101929, + 0x4a035043, 0x00000001, 0x4a035044, 0xaabbccdd, + 0x4a035037, 0x00000004, 0x497b5038, 0x4202d800, + 0x00000004, 0x59a8d06c, 0x8068d000, 0x486b506c, + 0x59a8d06b, 0x8268d500, 0xfffffff8, 0x8468d544, + 0x486b506b, 0x0201f800, 0x00100401, 0x4200d000, + 0x00000001, 0x40698800, 0x1c01f000, 0x59a8d017, + 0x82697480, 0x0000ffff, 0x04000004, 0x0201f800, + 0x0010b84b, 0x0401f0b5, 0x59a8da1b, 0x826cd500, + 0x00000028, 0x04000025, 0x8c6cdd00, 0x04000023, + 0x4a038802, 0x0000ffbf, 0x59a8da1b, 0x8c6cdd02, + 0x0400001e, 0x599ce018, 0x8c70e516, 0x04020012, + 0x59a8d01c, 0x82697480, 0x0000ffff, 0x0400000e, + 0x0201f800, 0x00101946, 0x59a8d21b, 0x8268dd00, + 0x00000004, 0x8c68d504, 0x0402005a, 0x406e5800, + 0x4200d000, 0x00000003, 0x0201f800, 0x00101969, + 0x0401f096, 0x8c70e516, 0x04020005, 0x59a8d01c, + 0x82697480, 0x0000ffff, 0x04000088, 0x59a8d01d, + 0x8068d1c0, 0x0402004b, 0x8c6cdd08, 0x0400004a, + 0x599cd019, 0x8c68d510, 0x0400004b, 0x0201f800, + 0x00103bbd, 0x80c589c0, 0x04020042, 0x599cd019, + 0x8c68d510, 0x04000004, 0x59a8d21b, 0x8c68d508, + 0x0402000a, 0x599cd018, 0x8c68d516, 0x0400005a, + 0x599cd017, 0x8c68d50a, 0x0402003e, 0x59a8d006, + 0x8c68d51c, 0x0402003b, 0x4a038802, 0x0000ffff, + 0x4200d000, 0x001094d7, 0x0201f800, 0x0010050d, + 0x4200d000, 0x001094e4, 0x0201f800, 0x0010050d, + 0x850e1d02, 0x4a01a8e4, 0x00000080, 0x4202d800, + 0x00000003, 0x4a035017, 0x0000ffff, 0x0201f800, + 0x001003e8, 0x4178d000, 0x0201f800, 0x001012d9, + 0x497b506c, 0x59a8d21b, 0x8c68d506, 0x04000042, + 0x599cd018, 0x8268e500, 0x00000800, 0x8c68d516, + 0x0402003a, 0x599cd019, 0x8c68d510, 0x04000004, + 0x59a8d21b, 0x8c68d508, 0x0402003e, 0x4200d000, + 0x0000ffff, 0x4200d800, 0x00000006, 0x4178e000, + 0x0201f800, 0x00102e2b, 0x0201f800, 0x00104130, + 0x80c589c0, 0x0400001a, 0x0201f800, 0x001054e2, + 0x0401f042, 0x59a8d016, 0x8068d1c0, 0x040007b8, + 0x0401f03e, 0x8c6cdd16, 0x040207b5, 0x0401f03b, + 0x4200b000, 0x000007f0, 0x417a8800, 0x0401f004, + 0x81468800, 0x8058b040, 0x040007c0, 0x0201f800, + 0x001039cf, 0x80c589c0, 0x040007fa, 0x5934d200, 0x8c68d51a, 0x040007f7, 0x0401f02c, 0x0201f800, - 0x001040d9, 0x80c589c0, 0x04000016, 0x59c4d006, - 0x8468d534, 0x486b8806, 0x0201f800, 0x00105456, - 0x0401f7da, 0x0201f800, 0x00103e5a, 0x80c589c0, - 0x040007e1, 0x0401f01d, 0x0201f800, 0x00102e73, - 0x0401f7cc, 0x0201f800, 0x001040d9, 0x80c589c0, - 0x040207b6, 0x59a8d21b, 0x486b541b, 0x0401f7b3, - 0x59c4d006, 0x8268d500, 0xffffff0f, 0x486b8806, - 0x0401f7ea, 0x4200d000, 0x000007fe, 0x4200d800, - 0x00000004, 0x0401f7b9, 0x8c6cdd04, 0x0402077b, - 0x826cd500, 0x00004000, 0x8c6cdd1c, 0x04020777, - 0x406a5800, 0x0401f76a, 0x1c01f000, 0x809d3840, + 0x0010410f, 0x80c589c0, 0x0400001b, 0x59c4d006, + 0x8468d534, 0x486b8806, 0x0201f800, 0x001054e2, + 0x0401f7e0, 0x0201f800, 0x00103e72, 0x80c589c0, + 0x040007a4, 0x0401f01d, 0x0201f800, 0x00102e77, + 0x0401f7d2, 0x0201f800, 0x0010410f, 0x80c589c0, + 0x040207bc, 0x59a8d21b, 0x486b541b, 0x0401f7b9, + 0x4200d000, 0x000007fe, 0x4200d800, 0x00000004, + 0x0401f7c4, 0x59c4d006, 0x8268d500, 0xffffff0f, + 0x486b8806, 0x0401f7e5, 0x8c6cdd04, 0x04020778, + 0x826cd500, 0x00004000, 0x8c6cdd1c, 0x04020774, + 0x406a5800, 0x0401f767, 0x1c01f000, 0x809d3840, 0x48813800, 0x59c4d00d, 0x8c68d51e, 0x04020004, 0x59c4d005, 0x8c68d500, 0x0400000c, 0x0201f800, - 0x001003fa, 0x0201f800, 0x001040d9, 0x80c589c0, - 0x0400000f, 0x0201f800, 0x0010405c, 0x816d7040, + 0x001003fa, 0x0201f800, 0x0010410f, 0x80c589c0, + 0x0400000f, 0x0201f800, 0x00104092, 0x816d7040, 0x040000a2, 0x0401f108, 0x4a035043, 0x00000001, - 0x4202d800, 0x00000004, 0x4200d000, 0x00109862, - 0x0201f800, 0x00108894, 0x0401f0ff, 0x0201f800, - 0x001040fa, 0x80c589c0, 0x0402008a, 0x0201f800, - 0x00103094, 0x59c4d0a4, 0x8268d500, 0x0000000f, + 0x4202d800, 0x00000004, 0x4200d000, 0x001098e2, + 0x0201f800, 0x0010895e, 0x0401f0ff, 0x0201f800, + 0x00104130, 0x80c589c0, 0x0402008a, 0x0201f800, + 0x001030a0, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x82697480, 0x00000006, 0x83f17500, 0x03000000, - 0x040007e9, 0x0201f800, 0x00104ed1, 0x59c4d0a3, + 0x040007e9, 0x0201f800, 0x00104f5d, 0x59c4d0a3, 0x8468d528, 0x486b88a3, 0x59a8d078, 0x8068d1c0, 0x040000a8, 0x59a8d015, 0x8468d546, 0x486b5015, - 0x0201f800, 0x001040e4, 0x80c589c0, 0x040200a8, + 0x0201f800, 0x0010411a, 0x80c589c0, 0x040200a8, 0x59c4d006, 0x8268d540, 0x440000f1, 0x486b8806, - 0x497b9005, 0x0401fed8, 0x80c589c0, 0x040207d2, + 0x497b9005, 0x0401fed5, 0x80c589c0, 0x040207d2, 0x4a038802, 0x0000ffff, 0x4a0378e4, 0x00003000, - 0x4200d000, 0x00109472, 0x5868d400, 0x8c68d508, + 0x4200d000, 0x001094f2, 0x5868d400, 0x8c68d508, 0x04020003, 0x4a01a8e4, 0x0000c000, 0x4200d000, - 0x0010973b, 0x0201f800, 0x00108894, 0x59a8d00f, - 0x4200d800, 0x00000003, 0x0201f800, 0x00105160, + 0x001097bb, 0x0201f800, 0x0010895e, 0x59a8d00f, + 0x4200d800, 0x00000003, 0x0201f800, 0x001051ec, 0x4200d000, 0x00008010, 0x59a8d809, 0x0201f800, - 0x00102db6, 0x59c4d001, 0x8268d500, 0x00018000, + 0x00102dba, 0x59c4d001, 0x8268d500, 0x00018000, 0x82697480, 0x00018000, 0x04000091, 0x59c4d0a3, 0x8468d518, 0x486b88a3, 0x59c8d015, 0x8468d548, - 0x486b9015, 0x0201f800, 0x00101568, 0x59a8d008, + 0x486b9015, 0x0201f800, 0x00101566, 0x59a8d008, 0x8468d500, 0x486b5008, 0x850e1d0a, 0x0201f800, - 0x0010c200, 0x0201f800, 0x001040d9, 0x80c589c0, + 0x0010c1ff, 0x0201f800, 0x0010410f, 0x80c589c0, 0x04020003, 0x8d0e1d06, 0x0402008e, 0x0201f800, - 0x00103baa, 0x80c589c0, 0x04000080, 0x59c4d002, + 0x00103bbd, 0x80c589c0, 0x04000080, 0x59c4d002, 0x8468d50c, 0x486b8802, 0x497b501d, 0x497b501c, - 0x497b5070, 0x0201f800, 0x001040d9, 0x80c589c0, - 0x04000067, 0x497b521b, 0x0201f800, 0x0010136e, + 0x497b5070, 0x0201f800, 0x0010410f, 0x80c589c0, + 0x04000067, 0x497b521b, 0x0201f800, 0x0010136c, 0x59a8d01f, 0x82680500, 0xffff0000, 0x80c4d540, 0x486b501f, 0x599cd017, 0x8c68d50a, 0x04000004, 0x59a8d21b, 0x8468d544, 0x486b521b, 0x4200d000, - 0x00000005, 0x0201f800, 0x001055eb, 0x497b501d, + 0x00000005, 0x0201f800, 0x00105677, 0x497b501d, 0x497b5016, 0x4a035017, 0x0000ffff, 0x4a01a8e4, 0x000000c0, 0x4202d800, 0x00000002, 0x0201f800, - 0x001040d9, 0x80c589c0, 0x04020007, 0x59a8d21b, + 0x0010410f, 0x80c589c0, 0x04020007, 0x59a8d21b, 0x8268d500, 0x0000000c, 0x82697480, 0x00000004, - 0x0400076d, 0x0201f800, 0x0010b83b, 0x0401f072, - 0x5994d02d, 0x42000000, 0x00103655, 0x80697480, + 0x0400076d, 0x0201f800, 0x0010b84b, 0x0401f072, + 0x5994d02d, 0x42000000, 0x00103661, 0x80697480, 0x0400002f, 0x59c4d006, 0x8268d540, 0x000000c0, 0x486b8806, 0x0401f76e, 0x59a8d011, 0x82697480, 0x00000009, 0x0402075c, 0x497b500f, 0x4a038893, 0x00000001, 0x4a038805, 0x000000f0, 0x0201f800, - 0x001040ef, 0x80c589c0, 0x04000034, 0x59c4d006, + 0x00104125, 0x80c589c0, 0x04000034, 0x59c4d006, 0x8268d540, 0x000000f1, 0x486b8806, 0x59c4d006, 0x8268d500, 0xbbffffff, 0x486b8806, 0x0201f800, - 0x00104ed1, 0x0201f800, 0x00105179, 0x0401fe4a, + 0x00104f5d, 0x0201f800, 0x00105205, 0x0401fe47, 0x40c50000, 0x80c589c0, 0x04020743, 0x4200d000, - 0x00109744, 0x0201f800, 0x00108894, 0x4883506f, + 0x001097c4, 0x0201f800, 0x0010895e, 0x4883506f, 0x4200d000, 0x00008030, 0x4080d800, 0x0401f780, - 0x0201f800, 0x001035a9, 0x0401f03f, 0x5994d02c, + 0x0201f800, 0x001035b5, 0x0401f03f, 0x5994d02c, 0x8068d1c0, 0x04020742, 0x0401f7cf, 0x59c4d006, 0x8268d540, 0x44000001, 0x486b8806, 0x59c4d006, 0x8268d500, 0xffffff0f, 0x0401f755, 0x59a8d01f, 0x8268d500, 0xffff0000, 0x486b501f, 0x0201f800, - 0x0010136e, 0x48c78880, 0x0401f79b, 0x59c4d0a3, + 0x0010136c, 0x48c78880, 0x0401f79b, 0x59c4d0a3, 0x8468d558, 0x0401f770, 0x59c4d006, 0x8268d540, - 0x440000f1, 0x0401f7d1, 0x0201f800, 0x001040d9, + 0x440000f1, 0x0401f7d1, 0x0201f800, 0x0010410f, 0x80c589c0, 0x0400000d, 0x59a8d018, 0x8068d1c0, - 0x0402077e, 0x0201f800, 0x0010737f, 0x0401f77b, + 0x0402077e, 0x0201f800, 0x00107415, 0x0401f77b, 0x4a03506f, 0x00000001, 0x850e1d0e, 0x0201f800, - 0x001031b2, 0x0401f014, 0x0201f800, 0x0010737f, + 0x001031be, 0x0401f014, 0x0201f800, 0x00107415, 0x59a8d21b, 0x8c68d506, 0x04020770, 0x59a8d018, 0x8068d1c0, 0x04020007, 0x59a8d41b, 0x8c68d508, 0x0400076a, 0x82697480, 0x0000ffff, 0x04000767, - 0x4a03541b, 0x0000ffff, 0x0201f800, 0x0010369f, + 0x4a03541b, 0x0000ffff, 0x0201f800, 0x001036ab, 0x0401f762, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x42011800, @@ -11264,7 +11317,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x00000004, 0x00000005, 0x00000006, 0x00000007, 0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c, 0x0000000d, 0x0000000e, 0x0000000f, - 0x4ffe73bb, 0x02800004, 0x00000000, 0x0000c000, + 0x01e5e2c1, 0x02800004, 0x00000000, 0x0000c000, 0x00000705, 0x073fca5a, 0x0705a5a5, 0x01928009, 0x070ff0e1, 0x03800006, 0x053f2aaa, 0x070aaaaa, 0x073f3aaa, 0x070aaaaa, 0x05958014, 0x05308000, @@ -11714,7 +11767,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x050f80ff, 0x01202003, 0x073fa00a, 0x06000001, 0x07f00000, 0x05601041, 0x050f80ff, 0x032fa071, 0x028000cb, 0xd17e39c3, 0x02800004, 0x00000000, - 0x00008000, 0x000003e3, 0x033d0aaa, 0x070aaaaa, + 0x00008000, 0x000003ea, 0x033d0aaa, 0x070aaaaa, 0x013d1aaa, 0x070aaaaa, 0x050f801e, 0x012fa8d1, 0x050f801e, 0x043fa889, 0x0700000f, 0x03200005, 0x07420000, 0x050fb000, 0x050f801e, 0x073fa021, @@ -11728,16 +11781,16 @@ static const uint32_t isp_2500_risc_code[] = { 0x0380003a, 0x03e00000, 0x03800018, 0x04908031, 0x030160e1, 0x0380003c, 0x04908034, 0x030150e1, 0x0380003c, 0x04908037, 0x010140e1, 0x0380003c, - 0x060fc013, 0x07a003db, 0x03800018, 0x014940e4, + 0x060fc013, 0x07a003e2, 0x03800018, 0x014940e4, 0x00a18040, 0x03800021, 0x02681e0d, 0x050fb0ff, 0x04600875, 0x050f80ff, 0x053fa809, 0x06000001, 0x05488003, 0x0481804f, 0x0400800d, 0x0120d000, 0x013e4000, 0x05000200, 0x06009075, 0x04002076, - 0x06a003c7, 0x07c00000, 0x000170e3, 0x050fe017, + 0x06a003ce, 0x07c00000, 0x000170e3, 0x050fe017, 0x05878056, 0x0547f417, 0x0301f0ff, 0x01800147, 0x054bc417, 0x050fb0ff, 0x03640aff, 0x0482805e, 0x0179fe17, 0x070fffff, 0x030750ff, 0x01800281, - 0x050fd017, 0x07a003db, 0x0380001d, 0x00018098, + 0x050fd017, 0x07a003e2, 0x0380001d, 0x00018098, 0x07480018, 0x05818072, 0x05481018, 0x04818070, 0x05482018, 0x0481806e, 0x07483018, 0x0581806c, 0x002fb004, 0x02800073, 0x012fb003, 0x02800073, @@ -11760,7 +11813,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x05a680d8, 0x038000a6, 0x0760127b, 0x050f80ff, 0x032fa009, 0x0744f000, 0x0760127b, 0x050f80ff, 0x032fa00a, 0x03800087, 0x052e400c, 0x040080fb, - 0x046aa108, 0x06009075, 0x04002076, 0x06a003c7, + 0x046aa108, 0x06009075, 0x04002076, 0x06a003ce, 0x038000a6, 0x04278001, 0x05482017, 0x078100cc, 0x068b00c2, 0x060ff086, 0x0349f0ff, 0x04818073, 0x07483017, 0x078100c9, 0x050fd0ff, 0x040fe07f, @@ -11780,14 +11833,14 @@ static const uint32_t isp_2500_risc_code[] = { 0x050f80ff, 0x032fa009, 0x0107e000, 0x070ff07e, 0x028000ef, 0x0307c000, 0x07c00000, 0x052e400c, 0x040080fb, 0x046aa108, 0x06009075, 0x04002076, - 0x028003c7, 0x040fd075, 0x050fd017, 0x060ff086, + 0x028003ce, 0x040fd075, 0x050fd017, 0x060ff086, 0x077800ff, 0x07000060, 0x037c00ff, 0x07000060, 0x0681810d, 0x06601875, 0x050f80ff, 0x073fa022, 0x0600003e, 0x052e400c, 0x04600875, 0x050f80ff, 0x053fa809, 0x06000001, 0x05488003, 0x04810123, 0x0400d0fb, 0x066a810d, 0x013e4000, 0x07000300, 0x03800021, 0x040080fb, 0x066a8108, 0x06009075, - 0x04002076, 0x06a003c7, 0x03800021, 0x0240007f, + 0x04002076, 0x06a003ce, 0x03800021, 0x0240007f, 0x0742007e, 0x050f807e, 0x032fa009, 0x050fe000, 0x02868143, 0x070ff07d, 0x055c047b, 0x04810138, 0x0760007d, 0x050f80ff, 0x032fa009, 0x050fe000, @@ -11795,7 +11848,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x050f80ff, 0x032fa009, 0x03681e00, 0x0450041c, 0x0107e0ff, 0x050f80ff, 0x032fa009, 0x050fe000, 0x00860145, 0x0307c000, 0x07c00000, 0x040fd075, - 0x038003db, 0x0460081f, 0x050f80ff, 0x032fa039, + 0x038003e2, 0x0460081f, 0x050f80ff, 0x032fa039, 0x01021000, 0x03020005, 0x01018006, 0x01683e21, 0x00d0014f, 0x0180016f, 0x0180019a, 0x018001b7, 0x0080022f, 0x00800173, 0x0180016f, 0x0180016f, @@ -11805,7 +11858,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x0180016f, 0x0180016f, 0x0180016f, 0x0180016f, 0x0180016f, 0x0180016f, 0x0180016f, 0x0180016f, 0x0180016f, 0x0180016f, 0x0180016f, 0x0180016f, - 0x0180016f, 0x050fd0ff, 0x07a003db, 0x03800018, + 0x0180016f, 0x050fd0ff, 0x07a003e2, 0x03800018, 0x0380001d, 0x01494021, 0x0781824b, 0x0400701f, 0x04a00279, 0x007a0101, 0x07060000, 0x07303000, 0x07008290, 0x03496021, 0x0681817f, 0x06006013, @@ -11841,7 +11894,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x06780002, 0x07000003, 0x07818200, 0x06003001, 0x06000013, 0x04001013, 0x04004013, 0x06005013, 0x050f801e, 0x022fa032, 0x01800227, 0x040fd01f, - 0x07a003db, 0x03800018, 0x0379ff03, 0x070000ff, + 0x07a003e2, 0x03800018, 0x0379ff03, 0x070000ff, 0x04488002, 0x04810207, 0x070ff003, 0x04500408, 0x050080ff, 0x0379ff00, 0x070000ff, 0x06489002, 0x0481020e, 0x070ff000, 0x04500408, 0x050080ff, @@ -11870,7 +11923,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x01860271, 0x03200006, 0x0760141b, 0x050f80ff, 0x073fa009, 0x06000001, 0x04008013, 0x0660181f, 0x050f80ff, 0x022fa04a, 0x00800175, 0x012080c0, - 0x0600901f, 0x05002021, 0x06a003c7, 0x01800172, + 0x0600901f, 0x05002021, 0x06a003ce, 0x01800172, 0x03200000, 0x06006075, 0x0180027b, 0x03200011, 0x0600601f, 0x05a002fa, 0x05600406, 0x050f80ff, 0x053fa809, 0x06000002, 0x07c00000, 0x04600875, @@ -11884,7 +11937,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x018002f3, 0x072d0300, 0x039b829f, 0x018002f3, 0x072d0c00, 0x029b82a2, 0x018002f3, 0x033d0000, 0x07000003, 0x039b82a5, 0x018002f3, 0x040fd075, - 0x050fd078, 0x07a003db, 0x0380001d, 0x048b02ad, + 0x050fd078, 0x07a003e2, 0x0380001d, 0x048b02ad, 0x03385000, 0x07030000, 0x05600818, 0x050f80ff, 0x032fa009, 0x07f00000, 0x054b0400, 0x0308a0ff, 0x0179fe00, 0x070000ff, 0x010880ff, 0x0448b076, @@ -11903,349 +11956,353 @@ static const uint32_t isp_2500_risc_code[] = { 0x0008400e, 0x058b02eb, 0x03385000, 0x03010000, 0x04278001, 0x040fe07f, 0x008602f2, 0x038000d8, 0x07c00000, 0x00683e76, 0x048102f8, 0x0448d076, - 0x0781031e, 0x03800355, 0x07a003bb, 0x018002ac, + 0x06810325, 0x0380035c, 0x06a003c2, 0x018002ac, 0x01978305, 0x07602418, 0x050f80ff, 0x012fa809, 0x06780001, 0x070000ff, 0x075a0000, 0x070ff014, 0x0569feff, 0x054b08ff, 0x075a0000, 0x05600418, 0x050f80ff, 0x012fa809, 0x040fe007, 0x0186830c, - 0x01204000, 0x0280031a, 0x00700101, 0x03010000, - 0x06780001, 0x07ff0000, 0x076c00ff, 0x05818314, - 0x00700101, 0x03010000, 0x05600418, 0x050f80ff, - 0x012fa80a, 0x06780001, 0x07ff0000, 0x050040ff, - 0x0279ff01, 0x0700ffff, 0x05002014, 0x07c00000, - 0x04007075, 0x0448b076, 0x06810334, 0x03200011, - 0x06006075, 0x05a0027b, 0x007a0101, 0x07060000, - 0x07303000, 0x07008290, 0x02496076, 0x0481832c, - 0x06006013, 0x03800347, 0x02400010, 0x0681032c, - 0x06006010, 0x06603675, 0x050f80ff, 0x073fa00a, - 0x07000003, 0x03800347, 0x0600007a, 0x02493076, - 0x0481833d, 0x06602e75, 0x050f80ff, 0x032fa009, - 0x060ff07a, 0x05500400, 0x070000ff, 0x06473076, - 0x06602e75, 0x050f80ff, 0x032fa00a, 0x04a00276, - 0x007a0101, 0x03010000, 0x06303008, 0x05008000, - 0x0600600e, 0x072d0003, 0x019b8347, 0x050a4000, - 0x060a5001, 0x060a6002, 0x050a7003, 0x040a8004, - 0x070a9005, 0x050ae006, 0x053079a0, 0x0600000e, - 0x060a0007, 0x062d0002, 0x018002ac, 0x00683e76, - 0x076c0aff, 0x0781037d, 0x04007013, 0x03200011, - 0x06006075, 0x05a0027b, 0x007a0101, 0x03070000, - 0x04602c75, 0x050f80ff, 0x053fa809, 0x06000001, - 0x03499003, 0x07810369, 0x07303000, 0x07008890, - 0x053079a0, 0x0700000c, 0x0280036d, 0x07303000, - 0x04008980, 0x04307920, 0x0700000c, 0x074d0005, - 0x06006013, 0x072d0003, 0x019b836f, 0x050a4000, - 0x060a5001, 0x060a6002, 0x050a7003, 0x040a8004, - 0x070a9005, 0x050ae006, 0x007a0107, 0x06000020, - 0x060a0007, 0x062d0002, 0x018002ac, 0x06602e75, - 0x050f80ff, 0x032fa009, 0x060ff07a, 0x05500400, - 0x070000ff, 0x06473076, 0x06602e75, 0x050f80ff, - 0x032fa00a, 0x04007075, 0x04a00276, 0x007a0101, - 0x03010000, 0x06303008, 0x07008800, 0x074d0005, - 0x06600a75, 0x050f80ff, 0x073fa009, 0x07000003, - 0x07f00000, 0x054b0406, 0x045a0404, 0x050040ff, - 0x0600600e, 0x072d0003, 0x009b8397, 0x050a4000, - 0x060a5001, 0x060a6002, 0x050a7003, 0x040a8004, - 0x070a9005, 0x050ae006, 0x04307920, 0x0600000e, - 0x06307d20, 0x0600000e, 0x0648c076, 0x048183a8, - 0x04307920, 0x0600000e, 0x060a0007, 0x062d0002, - 0x018002ac, 0x072d0003, 0x009b83ab, 0x070ff0f6, - 0x03687eff, 0x048183ad, 0x050f2074, 0x060a0007, - 0x040070fb, 0x046a7007, 0x050f40ff, 0x062d0002, - 0x018002ac, 0x01208060, 0x0600901f, 0x05002021, - 0x028003c7, 0x040080fb, 0x066ae108, 0x06009075, - 0x04002076, 0x028003c7, 0x03201100, 0x058483c5, - 0x06420001, 0x048183c1, 0x038003de, 0x020e0008, - 0x07c00000, 0x050fd009, 0x040fd008, 0x03201100, - 0x048483ce, 0x06420001, 0x058183ca, 0x038003de, - 0x007a0102, 0x04000101, 0x05600809, 0x050f80ff, - 0x073fa00a, 0x06000001, 0x020e0008, 0x078403d8, - 0x030e0009, 0x07c00000, 0x01011009, 0x052e4300, - 0x07c00000, 0x052e400f, 0x01208090, 0x038003c0, - 0x070fc0ff, 0x040f8013, 0x032fa009, 0x038003e1, - 0xe466d97c, 0x02800004, 0x00000000, 0x0000a000, - 0x0000046c, 0x033d0aaa, 0x070aaaaa, 0x013d1aaa, - 0x070aaaaa, 0x008c02c8, 0x078e032b, 0x068d0337, - 0x038f0399, 0x02910013, 0x040f7029, 0x02860013, - 0x066c001f, 0x078103b4, 0x066c0a1f, 0x068103d6, - 0x040f702f, 0x0386001d, 0x06000010, 0x050fb000, - 0x066c0079, 0x05810412, 0x0398001d, 0x03400000, - 0x076c0a00, 0x04818016, 0x07960021, 0x05998021, - 0x06a0009e, 0x02800008, 0x050f7012, 0x07a682a3, - 0x04908008, 0x030150e1, 0x06780015, 0x07fffff0, - 0x06810064, 0x0079fe15, 0x031fffff, 0x030160ff, - 0x064bd415, 0x03d0002d, 0x01800155, 0x028000c2, - 0x03800035, 0x02800040, 0x0380004b, 0x03800056, - 0x02800076, 0x02800076, 0x040f7025, 0x01868039, - 0x02026016, 0x0280003d, 0x06600025, 0x050f80ff, - 0x073fa00a, 0x0600000b, 0x02025016, 0x02400029, - 0x03800078, 0x050f7021, 0x01868044, 0x00022016, - 0x03800048, 0x07600021, 0x050f80ff, 0x073fa00a, - 0x0600000b, 0x00021016, 0x02400029, 0x03800078, - 0x040f7023, 0x0086804f, 0x00024016, 0x03800053, - 0x06600023, 0x050f80ff, 0x073fa00a, 0x0600000b, - 0x02023016, 0x02400029, 0x03800078, 0x04600816, - 0x050f80ff, 0x012fa839, 0x06780004, 0x07ffff00, - 0x037c00ff, 0x05000700, 0x06810062, 0x0448e001, - 0x04818062, 0x07a000a9, 0x03800078, 0x040fd016, - 0x03800078, 0x0279f015, 0x07ffffff, 0x04818076, - 0x060ff015, 0x03d00069, 0x03800071, 0x02800073, + 0x01204000, 0x03800321, 0x05600e06, 0x050f80ff, + 0x073fa009, 0x06000002, 0x07f00000, 0x064d0004, + 0x00700104, 0x03010000, 0x06780004, 0x07ff0000, + 0x076c00ff, 0x0481831a, 0x00700104, 0x03010000, + 0x064d0004, 0x05600e06, 0x050f80ff, 0x073fa00a, + 0x06000002, 0x07f00000, 0x044b0804, 0x0279ff01, + 0x0700ffff, 0x05002014, 0x07c00000, 0x04007075, + 0x0448b076, 0x0681033b, 0x03200011, 0x06006075, + 0x05a0027b, 0x007a0101, 0x07060000, 0x07303000, + 0x07008290, 0x02496076, 0x05818333, 0x06006013, + 0x0380034e, 0x02400010, 0x07810333, 0x06006010, + 0x06603675, 0x050f80ff, 0x073fa00a, 0x07000003, + 0x0380034e, 0x0600007a, 0x02493076, 0x05818344, + 0x06602e75, 0x050f80ff, 0x032fa009, 0x060ff07a, + 0x05500400, 0x070000ff, 0x06473076, 0x06602e75, + 0x050f80ff, 0x032fa00a, 0x04a00276, 0x007a0101, + 0x03010000, 0x06303008, 0x05008000, 0x0600600e, + 0x072d0003, 0x019b834e, 0x050a4000, 0x060a5001, + 0x060a6002, 0x050a7003, 0x040a8004, 0x070a9005, + 0x050ae006, 0x053079a0, 0x0600000e, 0x060a0007, + 0x062d0002, 0x018002ac, 0x00683e76, 0x076c0aff, + 0x07810384, 0x04007013, 0x03200011, 0x06006075, + 0x05a0027b, 0x007a0101, 0x03070000, 0x04602c75, + 0x050f80ff, 0x053fa809, 0x06000001, 0x03499003, + 0x06810370, 0x07303000, 0x07008890, 0x053079a0, + 0x0700000c, 0x03800374, 0x07303000, 0x04008980, + 0x04307920, 0x0700000c, 0x074d0005, 0x06006013, + 0x072d0003, 0x009b8376, 0x050a4000, 0x060a5001, + 0x060a6002, 0x050a7003, 0x040a8004, 0x070a9005, + 0x050ae006, 0x007a0107, 0x06000020, 0x060a0007, + 0x062d0002, 0x018002ac, 0x06602e75, 0x050f80ff, + 0x032fa009, 0x060ff07a, 0x05500400, 0x070000ff, + 0x06473076, 0x06602e75, 0x050f80ff, 0x032fa00a, + 0x04007075, 0x04a00276, 0x007a0101, 0x03010000, + 0x06303008, 0x07008800, 0x074d0005, 0x06600a75, + 0x050f80ff, 0x073fa009, 0x07000003, 0x07f00000, + 0x054b0406, 0x045a0404, 0x050040ff, 0x0600600e, + 0x072d0003, 0x009b839e, 0x050a4000, 0x060a5001, + 0x060a6002, 0x050a7003, 0x040a8004, 0x070a9005, + 0x050ae006, 0x04307920, 0x0600000e, 0x06307d20, + 0x0600000e, 0x0648c076, 0x058183af, 0x04307920, + 0x0600000e, 0x060a0007, 0x062d0002, 0x018002ac, + 0x072d0003, 0x019b83b2, 0x070ff0f6, 0x03687eff, + 0x058183b4, 0x050f2074, 0x060a0007, 0x040070fb, + 0x046a7007, 0x050f40ff, 0x062d0002, 0x018002ac, + 0x01208060, 0x0600901f, 0x05002021, 0x028003ce, + 0x040080fb, 0x066ae108, 0x06009075, 0x04002076, + 0x028003ce, 0x03201100, 0x058483cc, 0x06420001, + 0x048183c8, 0x028003e5, 0x020e0008, 0x07c00000, + 0x050fd009, 0x040fd008, 0x03201100, 0x048483d5, + 0x06420001, 0x058183d1, 0x028003e5, 0x007a0102, + 0x04000101, 0x05600809, 0x050f80ff, 0x073fa00a, + 0x06000001, 0x020e0008, 0x068403df, 0x030e0009, + 0x07c00000, 0x01011009, 0x052e4300, 0x07c00000, + 0x052e400f, 0x01208090, 0x028003c7, 0x070fc0ff, + 0x040f8013, 0x032fa009, 0x038003e8, 0xb459e03b, + 0x02800004, 0x00000000, 0x0000a000, 0x00000475, + 0x033d0aaa, 0x070aaaaa, 0x013d1aaa, 0x070aaaaa, + 0x018c02d1, 0x068e0334, 0x068d0340, 0x028f03a2, + 0x02910013, 0x040f7029, 0x02860013, 0x066c001f, + 0x078103bd, 0x066c0a1f, 0x068103df, 0x040f702f, + 0x0386001d, 0x06000010, 0x050fb000, 0x066c0079, + 0x0581041b, 0x0398001d, 0x03400000, 0x076c0a00, + 0x04818016, 0x07960021, 0x05998021, 0x06a0009e, + 0x02800008, 0x050f7012, 0x07a682ac, 0x04908008, + 0x030150e1, 0x06780015, 0x07fffff0, 0x06810064, + 0x0079fe15, 0x031fffff, 0x030160ff, 0x064bd415, + 0x03d0002d, 0x01800155, 0x028000c2, 0x03800035, + 0x02800040, 0x0380004b, 0x03800056, 0x02800076, + 0x02800076, 0x040f7025, 0x01868039, 0x02026016, + 0x0280003d, 0x06600025, 0x050f80ff, 0x073fa00a, + 0x0600000b, 0x02025016, 0x02400029, 0x03800078, + 0x050f7021, 0x01868044, 0x00022016, 0x03800048, + 0x07600021, 0x050f80ff, 0x073fa00a, 0x0600000b, + 0x00021016, 0x02400029, 0x03800078, 0x040f7023, + 0x0086804f, 0x00024016, 0x03800053, 0x06600023, + 0x050f80ff, 0x073fa00a, 0x0600000b, 0x02023016, + 0x02400029, 0x03800078, 0x04600816, 0x050f80ff, + 0x012fa839, 0x06780004, 0x07ffff00, 0x037c00ff, + 0x05000700, 0x06810062, 0x0448e001, 0x04818062, + 0x07a000a9, 0x03800078, 0x040fd016, 0x03800078, + 0x0279f015, 0x07ffffff, 0x04818076, 0x060ff015, + 0x03d00069, 0x03800071, 0x02800073, 0x02800076, 0x02800076, 0x02800076, 0x02800076, 0x02800076, - 0x02800076, 0x02800076, 0x03e00000, 0x02800008, - 0x04908073, 0x010140e1, 0x03800078, 0x060fc010, - 0x04a00464, 0x02800008, 0x072e4800, 0x03016011, - 0x0186807e, 0x060fc010, 0x07c00000, 0x00011010, - 0x0647f016, 0x072d000c, 0x009b8080, 0x04600816, - 0x050f80ff, 0x012fa839, 0x0249f001, 0x04818097, - 0x06780004, 0x07ffff00, 0x037c00ff, 0x07000300, - 0x0481809b, 0x0448e001, 0x0481809b, 0x0079c101, - 0x07ffffff, 0x007a0b01, 0x03800000, 0x04600816, - 0x050f80ff, 0x012fa80a, 0x062d0008, 0x038000a9, - 0x062d0008, 0x00011016, 0x052e4c00, 0x07c00000, - 0x062d0008, 0x040fd016, 0x07c00000, 0x030160eb, - 0x0249f016, 0x0481807f, 0x04600816, 0x050f80ff, - 0x012fa839, 0x06783f01, 0x03800060, 0x007c0b01, - 0x03800000, 0x0581809c, 0x06601807, 0x070030ff, - 0x050f80ff, 0x012fa809, 0x050f8003, 0x073fa00a, - 0x0600000b, 0x040f7001, 0x038600b7, 0x04600201, - 0x050f80ff, 0x073fa00a, 0x0600000b, 0x07c00000, - 0x050f702e, 0x008680bc, 0x0002e016, 0x0202f016, - 0x028000c1, 0x0760002e, 0x050f80ff, 0x073fa00a, - 0x0600000b, 0x0002e016, 0x07c00000, 0x0430e004, - 0x03080000, 0x06601216, 0x050f80ff, 0x073fa011, - 0x07000005, 0x07f00000, 0x0660000b, 0x050f80ff, - 0x022fa019, 0x0700c000, 0x0279ff02, 0x0700ffff, - 0x00017002, 0x0760220a, 0x050f80ff, 0x012fa809, - 0x0079fe01, 0x0700ffff, 0x055c0417, 0x06818143, - 0x0400d010, 0x0548e00c, 0x078100db, 0x0245600e, - 0x07600a0a, 0x050f80ff, 0x032fa039, 0x02015002, - 0x064b0015, 0x0379ff03, 0x070000ff, 0x01018003, - 0x05420418, 0x048180e6, 0x0045700e, 0x0179fe06, - 0x070000ff, 0x0700f0ff, 0x04603216, 0x050f80ff, - 0x073fa012, 0x06000002, 0x0769ff00, 0x076c9000, - 0x048180f1, 0x0444b00e, 0x0368060f, 0x03d000f3, - 0x028000fd, 0x028000f8, 0x038000ff, 0x028000f7, - 0x00800143, 0x007a010e, 0x07001800, 0x076c3000, - 0x02a1823e, 0x07818128, 0x0220f002, 0x01800106, - 0x0120d081, 0x007a010e, 0x05001000, 0x076c3000, - 0x02a1823e, 0x07818128, 0x0220f004, 0x0548700c, - 0x05810109, 0x0644900d, 0x024a1815, 0x004a2c15, - 0x04500415, 0x070030ff, 0x0700000f, 0x017a0100, - 0x05004000, 0x0400100e, 0x05304000, 0x07000030, - 0x04002010, 0x0600500d, 0x0700600a, 0x0400700b, - 0x05008017, 0x06600616, 0x050f80ff, 0x022fa04a, - 0x0448b00e, 0x05818056, 0x050f7027, 0x03868121, - 0x00028016, 0x00800125, 0x07600027, 0x050f80ff, - 0x073fa00a, 0x0600000b, 0x00027016, 0x02400029, - 0x03800078, 0x040fd016, 0x050fd00a, 0x07600a0a, - 0x050f80ff, 0x032fa009, 0x05780100, 0x07ffff00, - 0x017a0700, 0x06000001, 0x050f80ff, 0x032fa00a, - 0x07f00000, 0x05600e0a, 0x050f80ff, 0x022fa019, - 0x05780100, 0x07ffff00, 0x076a0500, 0x00202001, - 0x0560200a, 0x050f80ff, 0x012fa809, 0x06003010, - 0x05600e0a, 0x050f80ff, 0x032fa022, 0x0180014d, - 0x050fd00a, 0x07600a0a, 0x050f80ff, 0x032fa009, - 0x0379ff00, 0x0380ffff, 0x0145b000, 0x07600a0a, - 0x050f80ff, 0x032fa00a, 0x07303000, 0x07000030, - 0x04600e16, 0x050f80ff, 0x053fa80a, 0x06000001, - 0x04a00292, 0x03800078, 0x06600616, 0x050f80ff, - 0x012fa841, 0x0079fe01, 0x070000ff, 0x070090ff, - 0x0500d006, 0x0600a007, 0x0400b008, 0x07600a0a, - 0x050f80ff, 0x032fa009, 0x0769ff00, 0x0660000b, - 0x050f80ff, 0x073fa009, 0x07000006, 0x07f00000, - 0x04602c16, 0x050f80ff, 0x053fa809, 0x0600000b, - 0x07479017, 0x056c0e09, 0x04810170, 0x076c0c09, - 0x02a18464, 0x0560160a, 0x050f80ff, 0x053fa809, - 0x06000007, 0x07f00000, 0x074b000f, 0x0368060f, - 0x01d00178, 0x0080017c, 0x008001da, 0x008001ae, - 0x018001f9, 0x0748f00f, 0x048101f7, 0x0530e042, - 0x02080002, 0x0578400f, 0x06000020, 0x017c40ff, - 0x06000020, 0x07818188, 0x0748500c, 0x05810188, - 0x03459017, 0x04602c16, 0x050f80ff, 0x053fa80a, - 0x0600000b, 0x0569800f, 0x06818194, 0x0548d00f, - 0x06818191, 0x0644a00e, 0x056c0e09, 0x0581019f, - 0x008001fb, 0x050010ff, 0x046c8001, 0x078181a3, - 0x056c0e09, 0x0581019f, 0x05601a0a, 0x050f80ff, - 0x012fa809, 0x04780101, 0x07ffff00, 0x048101fb, - 0x06300001, 0x04000410, 0x05a0020a, 0x03800035, - 0x026d0001, 0x058101a6, 0x018001f9, 0x0530e042, - 0x02080002, 0x04a00225, 0x078181f5, 0x07300003, - 0x05000430, 0x05a0020a, 0x03800056, 0x0630e445, - 0x02080002, 0x056c0e09, 0x068181fb, 0x0748f00f, - 0x058101bb, 0x0569800f, 0x078181f9, 0x0548d00f, - 0x078181bd, 0x007a010e, 0x06000010, 0x018001c3, - 0x0246a00e, 0x018001c3, 0x0246a00e, 0x0748500f, - 0x058101c3, 0x0748500c, 0x058101c3, 0x03459017, - 0x0349a017, 0x078181ca, 0x04602c16, 0x050f80ff, - 0x053fa80a, 0x0600000b, 0x018001d4, 0x0747a017, - 0x05001017, 0x05601c0a, 0x050f80ff, 0x073fa009, - 0x06000001, 0x07f00000, 0x04602c16, 0x050f80ff, - 0x012fa812, 0x04a00225, 0x078181f5, 0x07300003, - 0x05000430, 0x05a0020a, 0x03800056, 0x056c0e09, - 0x068181fb, 0x0430e001, 0x02080002, 0x0644000d, - 0x0748f00f, 0x058101eb, 0x0569800f, 0x078181f9, + 0x02800076, 0x03e00000, 0x02800008, 0x04908073, + 0x010140e1, 0x03800078, 0x060fc010, 0x04a0046d, + 0x02800008, 0x072e4800, 0x03016011, 0x0186807e, + 0x060fc010, 0x07c00000, 0x00011010, 0x0647f016, + 0x072d000c, 0x009b8080, 0x04600816, 0x050f80ff, + 0x012fa839, 0x0249f001, 0x04818097, 0x06780004, + 0x07ffff00, 0x037c00ff, 0x07000300, 0x0481809b, + 0x0448e001, 0x0481809b, 0x0079c101, 0x07ffffff, + 0x007a0b01, 0x03800000, 0x04600816, 0x050f80ff, + 0x012fa80a, 0x062d0008, 0x038000a9, 0x062d0008, + 0x00011016, 0x052e4c00, 0x07c00000, 0x062d0008, + 0x040fd016, 0x07c00000, 0x030160eb, 0x0249f016, + 0x0481807f, 0x04600816, 0x050f80ff, 0x012fa839, + 0x06783f01, 0x03800060, 0x007c0b01, 0x03800000, + 0x0581809c, 0x06601807, 0x070030ff, 0x050f80ff, + 0x012fa809, 0x050f8003, 0x073fa00a, 0x0600000b, + 0x040f7001, 0x038600b7, 0x04600201, 0x050f80ff, + 0x073fa00a, 0x0600000b, 0x07c00000, 0x050f702e, + 0x008680bc, 0x0002e016, 0x0202f016, 0x028000c1, + 0x0760002e, 0x050f80ff, 0x073fa00a, 0x0600000b, + 0x0002e016, 0x07c00000, 0x0430e004, 0x03080000, + 0x06601216, 0x050f80ff, 0x073fa011, 0x07000005, + 0x07f00000, 0x0660000b, 0x050f80ff, 0x022fa019, + 0x0700c000, 0x0279ff02, 0x0700ffff, 0x00017002, + 0x0760220a, 0x050f80ff, 0x012fa809, 0x0079fe01, + 0x0700ffff, 0x055c0417, 0x06818143, 0x0400d010, + 0x0548e00c, 0x078100db, 0x0245600e, 0x07600a0a, + 0x050f80ff, 0x032fa039, 0x02015002, 0x064b0015, + 0x0379ff03, 0x070000ff, 0x01018003, 0x05420418, + 0x048180e6, 0x0045700e, 0x0179fe06, 0x070000ff, + 0x0700f0ff, 0x04603216, 0x050f80ff, 0x073fa012, + 0x06000002, 0x0769ff00, 0x076c9000, 0x048180f1, + 0x0444b00e, 0x0368060f, 0x03d000f3, 0x028000fd, + 0x028000f8, 0x038000ff, 0x028000f7, 0x00800143, + 0x007a010e, 0x07001800, 0x076c3000, 0x03a18247, + 0x07818128, 0x0220f002, 0x01800106, 0x0120d081, + 0x007a010e, 0x05001000, 0x076c3000, 0x03a18247, + 0x07818128, 0x0220f004, 0x0548700c, 0x05810109, + 0x0644900d, 0x024a1815, 0x004a2c15, 0x04500415, + 0x070030ff, 0x0700000f, 0x017a0100, 0x05004000, + 0x0400100e, 0x05304000, 0x07000030, 0x04002010, + 0x0600500d, 0x0700600a, 0x0400700b, 0x05008017, + 0x06600616, 0x050f80ff, 0x022fa04a, 0x0448b00e, + 0x05818056, 0x050f7027, 0x03868121, 0x00028016, + 0x00800125, 0x07600027, 0x050f80ff, 0x073fa00a, + 0x0600000b, 0x00027016, 0x02400029, 0x03800078, + 0x040fd016, 0x050fd00a, 0x07600a0a, 0x050f80ff, + 0x032fa009, 0x05780100, 0x07ffff00, 0x017a0700, + 0x06000001, 0x050f80ff, 0x032fa00a, 0x07f00000, + 0x05600e0a, 0x050f80ff, 0x022fa019, 0x05780100, + 0x07ffff00, 0x076a0500, 0x00202001, 0x0560200a, + 0x050f80ff, 0x012fa809, 0x06003010, 0x05600e0a, + 0x050f80ff, 0x032fa022, 0x0180014d, 0x050fd00a, + 0x07600a0a, 0x050f80ff, 0x032fa009, 0x0379ff00, + 0x0380ffff, 0x0145b000, 0x07600a0a, 0x050f80ff, + 0x032fa00a, 0x07303000, 0x07000030, 0x04600e16, + 0x050f80ff, 0x053fa80a, 0x06000001, 0x04a0029b, + 0x03800078, 0x06600616, 0x050f80ff, 0x012fa841, + 0x0079fe01, 0x070000ff, 0x070090ff, 0x0500d006, + 0x0600a007, 0x0400b008, 0x07600a0a, 0x050f80ff, + 0x032fa009, 0x0769ff00, 0x0660000b, 0x050f80ff, + 0x073fa009, 0x07000006, 0x07f00000, 0x04602c16, + 0x050f80ff, 0x053fa809, 0x0600000b, 0x07479017, + 0x056c0e09, 0x04810170, 0x076c0c09, 0x02a1846d, + 0x0560160a, 0x050f80ff, 0x053fa809, 0x06000007, + 0x07f00000, 0x074b000f, 0x0368060f, 0x01d00178, + 0x0080017c, 0x008001da, 0x008001ae, 0x018001f9, + 0x0748f00f, 0x048101f7, 0x0530e042, 0x02080002, 0x0578400f, 0x06000020, 0x017c40ff, 0x06000020, - 0x078181eb, 0x0748500c, 0x058101eb, 0x03459017, + 0x07818188, 0x0748500c, 0x05810188, 0x03459017, 0x04602c16, 0x050f80ff, 0x053fa80a, 0x0600000b, - 0x04a00225, 0x078181f5, 0x06300004, 0x04000420, - 0x05a0020a, 0x03800035, 0x02200010, 0x018001fc, - 0x02200001, 0x018001fc, 0x03200006, 0x018001fc, - 0x02200004, 0x040fd016, 0x050fd00a, 0x050fd000, - 0x05600e0a, 0x050f80ff, 0x032fa00a, 0x07303000, - 0x07000060, 0x04600e16, 0x050f80ff, 0x053fa80a, - 0x06000001, 0x04a00292, 0x03800078, 0x05600e0a, - 0x050f80ff, 0x053fa809, 0x06000001, 0x07f00000, - 0x074b0003, 0x034a1803, 0x014a2c03, 0x05500403, - 0x070030ff, 0x0400100e, 0x04002010, 0x05304000, - 0x07000060, 0x0600500d, 0x0700600a, 0x0400700b, + 0x0569800f, 0x06818194, 0x0548d00f, 0x06818191, + 0x0644a00e, 0x056c0e09, 0x0581019f, 0x008001fb, + 0x050010ff, 0x046c8001, 0x078181a3, 0x056c0e09, + 0x0581019f, 0x05601a0a, 0x050f80ff, 0x012fa809, + 0x04780101, 0x07ffff00, 0x048101fb, 0x06300001, + 0x04000410, 0x05a00211, 0x03800035, 0x026d0001, + 0x058101a6, 0x018001f9, 0x0530e042, 0x02080002, + 0x05a0022e, 0x078181f5, 0x07300003, 0x05000430, + 0x05a00211, 0x03800056, 0x0630e445, 0x02080002, + 0x056c0e09, 0x068181fb, 0x0748f00f, 0x058101bb, + 0x0569800f, 0x078181f9, 0x0548d00f, 0x078181bd, + 0x007a010e, 0x06000010, 0x018001c3, 0x0246a00e, + 0x018001c3, 0x0246a00e, 0x0748500f, 0x058101c3, + 0x0748500c, 0x058101c3, 0x03459017, 0x0349a017, + 0x078181ca, 0x04602c16, 0x050f80ff, 0x053fa80a, + 0x0600000b, 0x018001d4, 0x0747a017, 0x05001017, + 0x05601c0a, 0x050f80ff, 0x073fa009, 0x06000001, + 0x07f00000, 0x04602c16, 0x050f80ff, 0x012fa812, + 0x05a0022e, 0x078181f5, 0x07300003, 0x05000430, + 0x05a00211, 0x03800056, 0x056c0e09, 0x068181fb, + 0x0430e001, 0x02080002, 0x0644000d, 0x0748f00f, + 0x058101eb, 0x0569800f, 0x078181f9, 0x0578400f, + 0x06000020, 0x017c40ff, 0x06000020, 0x078181eb, + 0x0748500c, 0x058101eb, 0x03459017, 0x04602c16, + 0x050f80ff, 0x053fa80a, 0x0600000b, 0x05a0022e, + 0x078181f5, 0x06300004, 0x04000420, 0x05a00211, + 0x03800035, 0x02200010, 0x018001fc, 0x02200001, + 0x018001fc, 0x03200006, 0x018001fc, 0x02200004, + 0x040fd016, 0x050fd00a, 0x050fd000, 0x05600e0a, + 0x050f80ff, 0x032fa00a, 0x07f00000, 0x04600e16, + 0x050f80ff, 0x053fa809, 0x06000001, 0x05780103, + 0x070000ff, 0x017a0103, 0x07000600, 0x04600e16, + 0x050f80ff, 0x053fa80a, 0x06000001, 0x04a0029b, + 0x03800078, 0x05600e0a, 0x050f80ff, 0x053fa809, + 0x06000001, 0x07f00000, 0x074b0003, 0x034a1803, + 0x014a2c03, 0x05500403, 0x070030ff, 0x0400100e, + 0x04002010, 0x04600e16, 0x050f80ff, 0x073fa009, + 0x06000002, 0x0600500d, 0x0700600a, 0x0400700b, 0x0460040b, 0x050f80ff, 0x073fa009, 0x06000004, 0x0279ff08, 0x0700ffff, 0x06600616, 0x050f80ff, 0x022fa04a, 0x07c00000, 0x03681e00, 0x070090ff, - 0x076c2400, 0x0681823b, 0x05601c0a, 0x050f80ff, + 0x076c2400, 0x07818244, 0x05601c0a, 0x050f80ff, 0x043fa819, 0x06000002, 0x05008005, 0x0500100a, - 0x06780007, 0x07ffff00, 0x05810233, 0x0245500e, + 0x06780007, 0x07ffff00, 0x0581023c, 0x0245500e, 0x0560100a, 0x050f80ff, 0x053fa809, 0x06000001, - 0x0379ff03, 0x070000ff, 0x01018003, 0x0180024e, - 0x040fd016, 0x050fd00a, 0x00800464, 0x0447400e, - 0x03681e00, 0x070090ff, 0x076c3000, 0x05810248, - 0x076c9000, 0x05810248, 0x040fd016, 0x050fd00a, - 0x00800464, 0x0500100a, 0x0560200a, 0x050f80ff, - 0x053fa809, 0x07000003, 0x04008010, 0x05a00256, - 0x07818255, 0x07003018, 0x06601816, 0x050f80ff, + 0x0379ff03, 0x070000ff, 0x01018003, 0x00800257, + 0x040fd016, 0x050fd00a, 0x0080046d, 0x0447400e, + 0x03681e00, 0x070090ff, 0x076c3000, 0x04810251, + 0x076c9000, 0x04810251, 0x040fd016, 0x050fd00a, + 0x0080046d, 0x0500100a, 0x0560200a, 0x050f80ff, + 0x053fa809, 0x07000003, 0x04008010, 0x05a0025f, + 0x0681825e, 0x07003018, 0x06601816, 0x050f80ff, 0x022fa04a, 0x075c00ff, 0x07c00000, 0x070ff009, 0x0550041b, 0x050f80ff, 0x073fa009, 0x06000001, - 0x05a0026a, 0x06818268, 0x060ff001, 0x05500400, + 0x04a00273, 0x07818271, 0x060ff001, 0x05500400, 0x050f80ff, 0x063fa019, 0x06000002, 0x07f00000, - 0x07420018, 0x05810269, 0x02400002, 0x05a0026a, - 0x05810269, 0x056a02ff, 0x07c00000, 0x070ff01d, - 0x00540402, 0x00d0026d, 0x00800273, 0x00800275, - 0x01800277, 0x00800279, 0x0180027b, 0x0180027d, - 0x03200006, 0x01800290, 0x03200009, 0x01800290, - 0x0320000c, 0x01800290, 0x0320000f, 0x01800290, - 0x03200012, 0x01800290, 0x04600201, 0x050f80ff, - 0x012fa809, 0x040f7001, 0x0086028c, 0x06600a01, + 0x07420018, 0x05810272, 0x02400002, 0x04a00273, + 0x05810272, 0x056a02ff, 0x07c00000, 0x070ff01d, + 0x00540402, 0x00d00276, 0x0080027c, 0x0180027e, + 0x00800280, 0x01800282, 0x01800284, 0x00800286, + 0x03200006, 0x01800299, 0x03200009, 0x01800299, + 0x0320000c, 0x01800299, 0x0320000f, 0x01800299, + 0x03200012, 0x01800299, 0x04600201, 0x050f80ff, + 0x012fa809, 0x040f7001, 0x01860295, 0x06600a01, 0x050f80ff, 0x073fa009, 0x06000001, 0x02681e02, 0x0550041b, 0x050f80ff, 0x073fa009, 0x06000001, - 0x0180026a, 0x040fd016, 0x040fd002, 0x056a02ff, - 0x00800291, 0x075c00ff, 0x07c00000, 0x050f7012, - 0x01860299, 0x06600013, 0x050f80ff, 0x073fa00a, + 0x00800273, 0x040fd016, 0x040fd002, 0x056a02ff, + 0x0180029a, 0x075c00ff, 0x07c00000, 0x050f7012, + 0x008602a2, 0x06600013, 0x050f80ff, 0x073fa00a, 0x0600000b, 0x07c00000, 0x070ff0e2, 0x077800ff, - 0x033e0000, 0x077400ff, 0x031a0000, 0x058202be, - 0x058102be, 0x00012016, 0x02013016, 0x07c00000, + 0x033e0000, 0x077400ff, 0x031a0000, 0x048202c7, + 0x048102c7, 0x00012016, 0x02013016, 0x07c00000, 0x070ff0e2, 0x077800ff, 0x033e0000, 0x077400ff, - 0x031a0000, 0x048202ab, 0x048102ab, 0x07c00000, + 0x031a0000, 0x058202b4, 0x058102b4, 0x07c00000, 0x03016012, 0x06600016, 0x050f80ff, 0x032fa009, 0x07f00000, 0x06600016, 0x050f80ff, 0x073fa00a, - 0x06000008, 0x050f7000, 0x018602b8, 0x01012000, - 0x008002ba, 0x00012010, 0x02013010, 0x04600816, + 0x06000008, 0x050f7000, 0x008602c1, 0x01012000, + 0x018002c3, 0x00012010, 0x02013010, 0x04600816, 0x050f80ff, 0x073fa009, 0x06000007, 0x0647f00e, 0x007a010e, 0x04000101, 0x04600816, 0x050f80ff, 0x073fa00a, 0x06000007, 0x072e0030, 0x020e0016, 0x07c00000, 0x0391000a, 0x0784001d, 0x022c0004, - 0x046c041f, 0x058102db, 0x046c021f, 0x058102f3, - 0x046c081f, 0x07810305, 0x066c061f, 0x0681031f, + 0x046c041f, 0x058102e4, 0x046c021f, 0x058102fc, + 0x046c081f, 0x0681030e, 0x066c061f, 0x07810328, 0x0721f000, 0x0202c010, 0x0202a010, 0x02020010, - 0x052e5800, 0x02b60079, 0x068d0337, 0x0380000c, - 0x040f702a, 0x018602d4, 0x06000010, 0x04001010, + 0x052e5800, 0x02b60079, 0x068d0340, 0x0380000c, + 0x040f702a, 0x018602dd, 0x06000010, 0x04001010, 0x0760122b, 0x050f80ff, 0x032fa012, 0x07f00000, 0x06420029, 0x0660002a, 0x050f80ff, 0x053fa809, - 0x06000001, 0x050f7003, 0x018602f0, 0x01028003, + 0x06000001, 0x050f7003, 0x018602f9, 0x01028003, 0x0660002a, 0x050f80ff, 0x073fa00a, 0x06000008, - 0x02800320, 0x00028010, 0x00027010, 0x02800320, - 0x040f702a, 0x008602d3, 0x06420029, 0x0660002a, + 0x02800329, 0x00028010, 0x00027010, 0x02800329, + 0x040f702a, 0x008602dc, 0x06420029, 0x0660002a, 0x050f80ff, 0x053fa809, 0x06000001, 0x050f7003, - 0x02860302, 0x03026003, 0x0660002a, 0x050f80ff, - 0x073fa00a, 0x06000008, 0x02800320, 0x02026010, - 0x02025010, 0x02800320, 0x040f702a, 0x008602d3, + 0x0286030b, 0x03026003, 0x0660002a, 0x050f80ff, + 0x073fa00a, 0x06000008, 0x02800329, 0x02026010, + 0x02025010, 0x02800329, 0x040f702a, 0x008602dc, 0x06420029, 0x0660002a, 0x050f80ff, 0x053fa809, - 0x06000001, 0x050f7003, 0x03860314, 0x01022003, + 0x06000001, 0x050f7003, 0x0386031d, 0x01022003, 0x0660002a, 0x050f80ff, 0x073fa00a, 0x06000008, - 0x02800316, 0x00022010, 0x00021010, 0x0647f020, - 0x007a0120, 0x04000101, 0x07a003a5, 0x0400802a, - 0x04a00449, 0x029482d3, 0x0721f005, 0x018002d4, - 0x008002d9, 0x0647f020, 0x06486020, 0x04818325, - 0x07a003a5, 0x008002d3, 0x007a0120, 0x04000101, - 0x07a003a5, 0x0400802a, 0x04a00449, 0x008002d3, + 0x0280031f, 0x00022010, 0x00021010, 0x0647f020, + 0x007a0120, 0x04000101, 0x06a003ae, 0x0400802a, + 0x04a00452, 0x029482dc, 0x0721f005, 0x018002dd, + 0x018002e2, 0x0647f020, 0x06486020, 0x0581832e, + 0x06a003ae, 0x008002dc, 0x007a0120, 0x04000101, + 0x06a003ae, 0x0400802a, 0x04a00452, 0x008002dc, 0x0391000a, 0x070ff0e2, 0x077800ff, 0x033e0000, - 0x077400ff, 0x031a0000, 0x068282d9, 0x040fd02a, - 0x052e4003, 0x00208010, 0x04a00449, 0x008002d9, - 0x0784001d, 0x030150c0, 0x0448e015, 0x05818365, - 0x0648f015, 0x0481835d, 0x02490015, 0x05818355, - 0x00491015, 0x0581834d, 0x00492015, 0x06810397, - 0x033d0000, 0x07000003, 0x009b8397, 0x033d0000, + 0x077400ff, 0x031a0000, 0x078282e2, 0x040fd02a, + 0x052e4003, 0x00208010, 0x04a00452, 0x018002e2, + 0x0784001d, 0x030150c0, 0x0448e015, 0x0481836e, + 0x0648f015, 0x05818366, 0x02490015, 0x0481835e, + 0x00491015, 0x05818356, 0x00492015, 0x078103a0, + 0x033d0000, 0x07000003, 0x019b83a0, 0x033d0000, 0x06000002, 0x073c0000, 0x06000040, 0x052e5200, - 0x02200004, 0x0380036c, 0x072d0c00, 0x019b8341, + 0x02200004, 0x02800375, 0x072d0c00, 0x009b834a, 0x052d0800, 0x073c0000, 0x06000020, 0x062e5080, - 0x03200003, 0x0380036c, 0x072d0300, 0x019b833f, + 0x03200003, 0x02800375, 0x072d0300, 0x019b8348, 0x052d0200, 0x073c0000, 0x06000010, 0x062e5020, - 0x02200002, 0x0380036c, 0x072d00c0, 0x009b833d, + 0x02200002, 0x02800375, 0x072d00c0, 0x009b8346, 0x062d0080, 0x073c0000, 0x06000008, 0x062e5008, - 0x02200001, 0x0380036c, 0x072d0030, 0x009b833b, + 0x02200001, 0x02800375, 0x072d0030, 0x019b8344, 0x062d0020, 0x073c0000, 0x06000004, 0x062e5002, 0x06000010, 0x0784001d, 0x0392000c, 0x050fb000, - 0x040f707c, 0x03860393, 0x046c0279, 0x0581837d, - 0x0448b07a, 0x07810384, 0x06000010, 0x04001010, + 0x040f707c, 0x0386039c, 0x046c0279, 0x04818386, + 0x0448b07a, 0x0781038d, 0x06000010, 0x04001010, 0x0760127b, 0x050f80ff, 0x032fa012, 0x0046b07a, - 0x02b60079, 0x03800387, 0x066c0079, 0x07810382, - 0x040fd07c, 0x04a00464, 0x02800008, 0x040fd07c, - 0x03800387, 0x0045207a, 0x0279ff7a, 0x07ffd7ff, - 0x0007d010, 0x0647f07a, 0x0648607a, 0x0581838d, - 0x06a003ab, 0x03800393, 0x007a017a, 0x04000101, - 0x06a003ab, 0x0400807c, 0x0245f008, 0x04a00449, + 0x02b60079, 0x03800390, 0x066c0079, 0x0781038b, + 0x040fd07c, 0x04a0046d, 0x02800008, 0x040fd07c, + 0x03800390, 0x0045207a, 0x0279ff7a, 0x07ffd7ff, + 0x0007d010, 0x0647f07a, 0x0648607a, 0x05818396, + 0x07a003b4, 0x0380039c, 0x007a017a, 0x04000101, + 0x07a003b4, 0x0400807c, 0x0245f008, 0x04a00452, 0x07279000, 0x0007e010, 0x0207c010, 0x0207a010, - 0x008c02c8, 0x0380000c, 0x0392000c, 0x070ff0e2, + 0x018c02d1, 0x0380000c, 0x0392000c, 0x070ff0e2, 0x077800ff, 0x033e0000, 0x077400ff, 0x031a0000, - 0x04828397, 0x070fc0ff, 0x052e400c, 0x00208020, - 0x04a00449, 0x02800397, 0x06000020, 0x05001014, + 0x058283a0, 0x070fc0ff, 0x052e400c, 0x00208020, + 0x04a00452, 0x038003a0, 0x06000020, 0x05001014, 0x0460082a, 0x050f80ff, 0x032fa012, 0x07c00000, 0x0600007a, 0x040010a2, 0x044b0801, 0x070ff014, 0x065a0001, 0x0460087c, 0x050f80ff, 0x032fa012, - 0x07c00000, 0x050f7022, 0x038603c3, 0x070ff0e2, + 0x07c00000, 0x050f7022, 0x038603cc, 0x070ff0e2, 0x077800ff, 0x033e0000, 0x077400ff, 0x031a0000, - 0x04828013, 0x0302a022, 0x04a00404, 0x04488020, - 0x078103e7, 0x040fd02a, 0x0202a010, 0x02020010, - 0x040f7026, 0x038603d1, 0x0202a026, 0x04a00404, - 0x04488020, 0x048183cd, 0x0621f001, 0x00683e20, - 0x058183f9, 0x038003e8, 0x040fd02a, 0x0202a010, - 0x0002b010, 0x02020010, 0x050f7028, 0x00860401, - 0x0621f002, 0x0302a028, 0x028003f8, 0x070ff0e2, + 0x04828013, 0x0302a022, 0x04a0040d, 0x04488020, + 0x078103f0, 0x040fd02a, 0x0202a010, 0x02020010, + 0x040f7026, 0x028603da, 0x0202a026, 0x04a0040d, + 0x04488020, 0x048183d6, 0x0621f001, 0x00683e20, + 0x06818402, 0x028003f1, 0x040fd02a, 0x0202a010, + 0x0002b010, 0x02020010, 0x050f7028, 0x0186040a, + 0x0621f002, 0x0302a028, 0x00800401, 0x070ff0e2, 0x077800ff, 0x033e0000, 0x077400ff, 0x031a0000, - 0x04828013, 0x050f7022, 0x00860401, 0x0302a022, - 0x04a00404, 0x04488020, 0x078103e7, 0x040fd02a, - 0x0202a010, 0x0002b010, 0x02020010, 0x00800401, + 0x04828013, 0x050f7022, 0x0186040a, 0x0302a022, + 0x04a0040d, 0x04488020, 0x078103f0, 0x040fd02a, + 0x0202a010, 0x0002b010, 0x02020010, 0x0180040a, 0x0621f004, 0x070ff0e2, 0x077800ff, 0x033e0000, - 0x077400ff, 0x031a0000, 0x058283f3, 0x01208060, - 0x0600902a, 0x04002020, 0x05a00450, 0x00800401, + 0x077400ff, 0x031a0000, 0x058283fc, 0x01208060, + 0x0600902a, 0x04002020, 0x05a00459, 0x0180040a, 0x0202a010, 0x02020010, 0x0002b010, 0x0721f000, - 0x00800401, 0x04a00404, 0x0400102a, 0x0245f001, - 0x05a0040a, 0x050f801e, 0x0320000a, 0x022017d0, - 0x032fa012, 0x072e5c00, 0x008c02c8, 0x068d0337, + 0x0180040a, 0x04a0040d, 0x0400102a, 0x0245f001, + 0x04a00413, 0x050f801e, 0x0320000a, 0x022017d0, + 0x032fa012, 0x072e5c00, 0x018c02d1, 0x068d0340, 0x02800013, 0x0460082a, 0x050f80ff, 0x022fa031, 0x03020000, 0x0102b005, 0x07c00000, 0x01200100, - 0x049a040e, 0x060f0001, 0x07c00000, 0x07420000, - 0x0681840b, 0x060fc010, 0x00800464, 0x0392001d, + 0x059a0417, 0x060f0001, 0x07c00000, 0x07420000, + 0x07818414, 0x060fc010, 0x0080046d, 0x0392001d, 0x0207c02f, 0x0460087c, 0x050f80ff, 0x032fa039, 0x0307a000, 0x0107b005, 0x0307f006, 0x0660007c, 0x050020ff, 0x050f80ff, 0x032fa011, 0x0302f000, - 0x0286842a, 0x0202f001, 0x03868428, 0x0002e010, + 0x03868433, 0x0202f001, 0x02868431, 0x0002e010, 0x0660187f, 0x050f80ff, 0x073fa00a, 0x06000008, - 0x01800430, 0x0002e001, 0x01800430, 0x040f7001, - 0x00860423, 0x0760002e, 0x050f80ff, 0x012fa80a, + 0x01800439, 0x0002e001, 0x01800439, 0x040f7001, + 0x0086042c, 0x0760002e, 0x050f80ff, 0x012fa80a, 0x0002e001, 0x06000010, 0x04001010, 0x040f8002, 0x032fa012, 0x06279001, 0x0400107c, 0x060ff0fb, - 0x054bc8ff, 0x065a0001, 0x05a0040a, 0x0320000a, + 0x054bc8ff, 0x065a0001, 0x04a00413, 0x0320000a, 0x022011f4, 0x00202004, 0x06003010, 0x0249507a, - 0x05810441, 0x0020200e, 0x050f8078, 0x032fa022, - 0x030e5077, 0x008c02c8, 0x068d0337, 0x040f702f, - 0x00868013, 0x0380001d, 0x03201100, 0x0784844e, - 0x06420001, 0x0681844a, 0x00800467, 0x020e0008, + 0x0481044a, 0x0020200e, 0x050f8078, 0x032fa022, + 0x030e5077, 0x018c02d1, 0x068d0340, 0x040f702f, + 0x00868013, 0x0380001d, 0x03201100, 0x06848457, + 0x06420001, 0x07818453, 0x00800470, 0x020e0008, 0x07c00000, 0x050fd009, 0x040fd008, 0x03201100, - 0x06848457, 0x06420001, 0x07818453, 0x00800467, + 0x07848460, 0x06420001, 0x0781845c, 0x00800470, 0x007a0102, 0x04000101, 0x05600809, 0x050f80ff, - 0x073fa00a, 0x06000001, 0x020e0008, 0x06848462, - 0x06420001, 0x0681845e, 0x00800467, 0x030e0009, - 0x07c00000, 0x052e400f, 0x00208040, 0x00800449, - 0x070fc0ff, 0x040f8010, 0x032fa009, 0x0180046a, - 0x2902a276, 0x00000000, 0x00000000, 0x0000400e, + 0x073fa00a, 0x06000001, 0x020e0008, 0x0684846b, + 0x06420001, 0x06818467, 0x00800470, 0x030e0009, + 0x07c00000, 0x052e400f, 0x00208040, 0x00800452, + 0x070fc0ff, 0x040f8010, 0x032fa009, 0x00800473, + 0xf6229e3f, 0x00000000, 0x00000000, 0x0000400e, 0x00000808, 0x00000803, 0x00011f0f, 0x02080b02, 0xe6e5610b, 0x7f04e630, 0x7f028001, 0x30e2e500, 0x017e04e4, 0x007e0280, 0x08605fee, 0xe4f7f953, @@ -12759,7 +12816,7 @@ static const uint32_t isp_2500_risc_code[] = { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000f1f01, 0xc3002003, 0xb9f6ad13, - 0xffffb7ea, 0xffeef3ba + 0xffffb7ea, 0xffeef3a2 }; #endif #ifdef ISP_2500_MULTI @@ -12770,25 +12827,22 @@ static const uint32_t isp_2500_risc_code[] = { * * * ******************************************************************** * */ -/* - * Firmware Version 5.04.00 (12:37 Jul 02, 2010) - */ static const uint32_t isp_2500_multi_risc_code[] = { - 0x0501f042, 0x00111000, 0x00100000, 0x0000a29b, - 0x00000005, 0x00000004, 0x00000000, 0x00000095, + 0x0501f042, 0x00111000, 0x00100000, 0x0000a562, + 0x00000005, 0x00000005, 0x00000000, 0x00009095, 0x00000004, 0x00000000, 0x20434f50, 0x59524947, 0x48542032, 0x30303720, 0x514c4f47, 0x49432043, 0x4f52504f, 0x52415449, 0x4f4e2020, 0x20495350, 0x32357878, 0x20466972, 0x6d776172, 0x65202020, - 0x56657273, 0x696f6e20, 0x2020352e, 0x30342e30, + 0x56657273, 0x696f6e20, 0x2020352e, 0x30352e30, 0x30202024, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00100000, 0x00100000, - 0x0000a29b, 0xffffffff, 0x00111004, 0x00020000, - 0x00000d9e, 0xffffffff, 0x00111da2, 0x0010e300, - 0x00001ae9, 0xffffffff, 0x0011388b, 0x0000c000, - 0x0000093b, 0x00ffffff, 0x001141c6, 0x00008000, - 0x00000599, 0x00ffffff, 0x0011475f, 0x0000a000, - 0x0000059b, 0x00ffffff, 0x00114cfa, 0x0000400e, + 0x0000a562, 0xffffffff, 0x00111004, 0x00020000, + 0x00000d9e, 0xffffffff, 0x00111da2, 0x0010e500, + 0x00001b0f, 0xffffffff, 0x001138b1, 0x0000c000, + 0x0000093b, 0x00ffffff, 0x001141ec, 0x00008000, + 0x000005a0, 0x00ffffff, 0x0011478c, 0x0000a000, + 0x000005a3, 0x00ffffff, 0x00114d2f, 0x0000400e, 0x00000808, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4203f000, 0x00021fff, 0x40000000, 0x4203e000, 0x90000100, 0x40000000, @@ -12796,17 +12850,17 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x50000000, 0x8c000500, 0x05020003, 0x42000800, 0x00020000, 0x45780800, 0x80040800, 0x82040580, 0x00022000, 0x05fe07fc, 0x4178a000, 0x4200a800, - 0x0010a29b, 0x42000800, 0x0010e300, 0x40540000, - 0x8004b480, 0x0551f80b, 0x0501fbce, 0x600c6020, + 0x0010a562, 0x42000800, 0x0010e500, 0x40540000, + 0x8004b480, 0x0551fabb, 0x0501fbce, 0x600c6020, 0x50304800, 0x8c240500, 0x0500001c, 0x59e00016, - 0x8c000504, 0x05020019, 0x0551f860, 0x604808fa, + 0x8c000504, 0x05020019, 0x0551fb10, 0x604808fa, 0x50041000, 0x82081500, 0xfffffffc, 0x90081d43, 0x90081540, 0x84244d00, 0x440c0800, 0x44080800, 0x44246000, 0x64030000, 0x4203e000, 0x70000000, 0x4203e000, 0xb0300000, 0x603ff84e, 0x59e00016, 0x8c000504, 0x05020002, 0x05fe47fd, 0x84244d40, - 0x44246000, 0x0551f849, 0x64030000, 0x0501f9f1, - 0x4803c856, 0x0505ff74, 0x6413c020, 0x4203e000, + 0x44246000, 0x0551faf9, 0x64030000, 0x0501f9f1, + 0x4803c856, 0x0505ff72, 0x6413c020, 0x4203e000, 0x6000000f, 0x640f70e8, 0x640f78e8, 0x640da8e8, 0x59e00023, 0x8c000500, 0x0502002b, 0x42002800, 0x00100022, 0x58140800, 0x4817c857, 0x4807c857, @@ -12817,48 +12871,48 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x8050a1c0, 0x05000014, 0x4c140000, 0x5814a801, 0x4857c857, 0x40500000, 0x80540480, 0x0500000b, 0x82540480, 0x0000400e, 0x05020005, 0x9050a404, - 0x0509fadf, 0x05020028, 0x0501f004, 0x5814b002, - 0x485bc857, 0x054dffaf, 0x5c002800, 0x90142c04, - 0x05fdf7e9, 0x050df957, 0x42001000, 0x7ff481fe, + 0x0509fadd, 0x05020028, 0x0501f004, 0x5814b002, + 0x485bc857, 0x0551fa5f, 0x5c002800, 0x90142c04, + 0x05fdf7e9, 0x050df958, 0x42001000, 0x7ff481fe, 0x59e00002, 0x8c00051e, 0x05020003, 0x42001000, 0x7ff480fe, 0x50081000, 0x480b505c, 0x42002800, 0x00100022, 0x58140801, 0x4817c857, 0x4807c857, 0x800409c0, 0x05000023, 0x58142002, 0x4813c857, 0x58141003, 0x4c140000, 0x82040480, 0x0000400e, - 0x05020004, 0x0509fae9, 0x4803c856, 0x0501f003, + 0x05020004, 0x0509fae7, 0x4803c856, 0x0501f003, 0x0501fb53, 0x05020004, 0x5c002800, 0x90142c04, 0x05fdf7ed, 0x4803c856, 0x4a03c020, 0x00004010, 0x4a03c011, 0x40100011, 0x05006000, 0x4203e000, 0x40000000, 0x59e00017, 0x60000800, 0x8c00050a, - 0x050a0995, 0x8d0c0530, 0x050a0981, 0x050a0983, + 0x050a0993, 0x8d0c0530, 0x050a097f, 0x050a0981, 0x6403c017, 0x4203e000, 0x30000001, 0x0501f000, - 0x4803c856, 0x0201f800, 0x0010e304, 0x59e00024, - 0x8c000500, 0x050a0a89, 0x0501fbc9, 0x050df9fd, + 0x4803c856, 0x0201f800, 0x0010e504, 0x59e00024, + 0x8c000500, 0x050a0a87, 0x0501fbc9, 0x050df9fe, 0x05020004, 0x4a03c014, 0x001c001c, 0x0501f003, 0x4a03c014, 0x081c001c, 0x4817c857, 0x0501fbe7, - 0x42002000, 0x0010fde9, 0x054dff75, 0x59a8006b, + 0x42002000, 0x0011000f, 0x0551fa25, 0x59a8006b, 0x800001c0, 0x0500000c, 0x59a8008a, 0x8c000500, 0x05000005, 0x59a8000a, 0x82000480, 0x0013ffff, 0x05001005, 0x59a8206b, 0x80102000, 0x59a8280a, - 0x054dff67, 0x0551f945, 0x0551f96c, 0x59a8280a, + 0x0551fa17, 0x0551fc0c, 0x0551fc33, 0x59a8280a, 0x60000812, 0x60001802, 0x4807500d, 0x480f5266, - 0x60c01000, 0x052dfc0f, 0x82040c00, 0x001102e4, + 0x60c01000, 0x052dfdd1, 0x82040c00, 0x00110514, 0x4807500b, 0x600400de, 0x50000000, 0x8c000502, 0x05000004, 0x59a8008a, 0x84000540, 0x4803508a, - 0x4a03c810, 0x00100000, 0x4a03c811, 0x0010a29b, - 0x4a03c812, 0x0010e300, 0x4a03c813, 0x0010fde8, + 0x4a03c810, 0x00100000, 0x4a03c811, 0x0010a562, + 0x4a03c812, 0x0010e500, 0x4a03c813, 0x0011000e, 0x0501fb86, 0x6447c829, 0x59e40001, 0x82000540, 0x0003403f, 0x4803c801, 0x4a03c802, 0x00000933, 0x59e00003, 0x82000540, 0x00240000, 0x4803c003, 0x64ffc019, 0x60701000, 0x0501fae0, 0x4202c000, - 0x001102e4, 0x59aab00b, 0x59aaa00b, 0x59aaa80b, + 0x00110514, 0x59aab00b, 0x59aaa00b, 0x59aaa80b, 0x59aac80d, 0x49675065, 0x59a8000b, 0x4803500c, - 0x0501fbe9, 0x0535fbc7, 0x0501fbf2, 0x0501fc65, - 0x0509fb00, 0x59a8004f, 0x8c000508, 0x05000004, - 0x050dfa29, 0x0519fd6f, 0x050dfb2b, 0x0501fd78, - 0x0505fb2c, 0x052dfc13, 0x0501f85d, 0x050dffc8, - 0x0525fc74, 0x0521fe4e, 0x052df979, 0x0509fb2f, - 0x0509f95e, 0x4203e000, 0xf0000001, 0x0551f930, + 0x0501fbe9, 0x0535fd7b, 0x0501fbf2, 0x0501fc65, + 0x0509fafe, 0x59a8004f, 0x8c000508, 0x05000004, + 0x050dfa2a, 0x0519fe3a, 0x050dfb2d, 0x0501fd78, + 0x0505fb2c, 0x052dfdd5, 0x0501f85d, 0x0511f86b, + 0x0525fd79, 0x0521ff4b, 0x052dfb3b, 0x0509fb2d, + 0x0509f95c, 0x4203e000, 0xf0000001, 0x0551fbf7, 0x6403c018, 0x4203e000, 0xa0000001, 0x59a8008a, 0x80000540, 0x05000004, 0x4203e000, 0x20000551, 0x0501f003, 0x4203e000, 0x20000511, 0x4203e000, @@ -12867,22 +12921,22 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4a03c011, 0x40000010, 0x05006000, 0x4203e000, 0x40000000, 0x4df00000, 0x4203e000, 0x50000000, 0x59e00017, 0x60000800, 0x8c00050a, 0x0002088c, - 0x8d0c0530, 0x050a08ee, 0x000209af, 0x5c03e000, + 0x8d0c0530, 0x050a08ec, 0x000209af, 0x5c03e000, 0x6403c017, 0x4203e000, 0x30000001, 0x6002d800, 0x4203e000, 0xb0600000, 0x59a80091, 0x4003f800, 0x0001f004, 0x4df00000, 0x4203e000, 0x50000000, 0x416c0000, 0x90000c88, 0x05021869, 0x0c01f803, - 0x5c03e000, 0x0001f006, 0x00100193, 0x0010fbf4, - 0x0010fb25, 0x00100192, 0x0010fada, 0x00100192, + 0x5c03e000, 0x0001f006, 0x00100193, 0x0010fe1a, + 0x0010fd24, 0x00100192, 0x0010fcd9, 0x00100192, 0x00100192, 0x001001a4, 0x0501f85d, 0x42000800, - 0x0010ac19, 0x5804001e, 0x8c000500, 0x0500000c, + 0x0010ae99, 0x5804001e, 0x8c000500, 0x0500000c, 0x84000500, 0x4800081e, 0x6012d800, 0x0501fa6f, 0x49f3c857, 0x5c000800, 0x5c000000, 0x82000540, 0x00007e20, 0x4c000000, 0x4c040000, 0x1c01f000, 0x4a038805, 0x000000f0, 0x1c01f000, 0x6417505d, - 0x6413505e, 0x6403505f, 0x4a035060, 0x00000095, - 0x0525fbe3, 0x4a03541b, 0x0000ffff, 0x4a03500f, - 0x00ffffff, 0x0541fd15, 0x4a03501f, 0x20200000, + 0x6417505e, 0x6403505f, 0x4a035060, 0x00009095, + 0x0525fce8, 0x4a03541b, 0x0000ffff, 0x4a03500f, + 0x00ffffff, 0x0541fef6, 0x4a03501f, 0x20200000, 0x4a035020, 0x88000200, 0x4a035021, 0x00ff001f, 0x4a035022, 0x000007d0, 0x4a035023, 0x80000a00, 0x4a035024, 0xa0000200, 0x4a035025, 0x00ff0004, @@ -12891,7 +12945,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4a03502a, 0x00010000, 0x4a035031, 0x514c4f47, 0x4a035032, 0x49432020, 0x1c01f000, 0x4d440000, 0x417a8800, 0x4c5c0000, 0x4178b800, 0x0001fae7, - 0x05020004, 0x0521fac6, 0x05020002, 0x805cb800, + 0x05020004, 0x0521fba2, 0x05020002, 0x805cb800, 0x81468800, 0x83440580, 0x000007f0, 0x05fe07f8, 0x405c0800, 0x5c00b800, 0x5c028800, 0x1c01f000, 0x4803c857, 0x5c000000, 0x4c000000, 0x4803c857, @@ -12901,13 +12955,13 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4203e000, 0x50000000, 0x6008b900, 0x05006000, 0x4c000000, 0x4c040000, 0x59bc00ea, 0x4803c857, 0x90000507, 0x90000581, 0x05020003, 0x60000800, - 0x052dfda5, 0x59b800ea, 0x4803c857, 0x641370e8, + 0x052dff67, 0x59b800ea, 0x4803c857, 0x641370e8, 0x5c000800, 0x4807c025, 0x80040920, 0x4807c026, 0x5c000000, 0x4803c023, 0x80000120, 0x4803c024, 0x5c000000, 0x4803c857, 0x4803c021, 0x80000120, 0x4803c022, 0x41f80000, 0x4803c029, 0x80000120, - 0x4803c02a, 0x054dfeac, 0x0500004a, 0x42000800, - 0x0010cf8e, 0x46000800, 0xfaceface, 0x80040800, + 0x4803c02a, 0x0551f95c, 0x0500004a, 0x42000800, + 0x0010d20e, 0x46000800, 0xfaceface, 0x80040800, 0x4c080000, 0x4c0c0000, 0x600010f4, 0x58080013, 0x44000800, 0x80040800, 0x58080022, 0x44000800, 0x80040800, 0x58080023, 0x44000800, 0x80040800, @@ -12927,29 +12981,29 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x44000800, 0x80040800, 0x5c001800, 0x5c001000, 0x64030000, 0x485fc020, 0x905cb9c0, 0x905cbd52, 0x485fc011, 0x4203e000, 0x40000000, 0x6016d800, - 0x59e00017, 0x60000800, 0x8c00050a, 0x050a080e, - 0x8d0c0530, 0x05060ffa, 0x05060ffc, 0x6403c017, + 0x59e00017, 0x60000800, 0x8c00050a, 0x050a080c, + 0x8d0c0530, 0x05060ff8, 0x05060ffa, 0x6403c017, 0x4203e000, 0x30000001, 0x0501f956, 0x05fdf7ff, 0x60100000, 0x0501f80c, 0x4a03c855, 0x0001eb5a, 0x59e40001, 0x82000540, 0xff000700, 0x4803c801, - 0x42000000, 0x0010b0e4, 0x49780003, 0x49780004, - 0x1c01f000, 0x42000800, 0x0010b0e6, 0x44000800, + 0x42000000, 0x0010b364, 0x49780003, 0x49780004, + 0x1c01f000, 0x42000800, 0x0010b366, 0x44000800, 0x59e40801, 0x82041500, 0x00f3c0ff, 0x480bc801, 0x8c040524, 0x0500000b, 0x4c000000, 0x59e41052, - 0x59e40054, 0x800000d4, 0x82000400, 0x0010cfb7, + 0x59e40054, 0x800000d4, 0x82000400, 0x0010d237, 0x80081480, 0x480bc853, 0x6503c800, 0x5c000000, - 0x4a03c850, 0x0010cfb7, 0x800000d4, 0x82002400, - 0x0010cfb6, 0x4813c851, 0x4a03c853, 0x00000400, - 0x42000000, 0x0010cfb7, 0x82001400, 0x00001000, + 0x4a03c850, 0x0010d237, 0x800000d4, 0x82002400, + 0x0010d236, 0x4813c851, 0x4a03c853, 0x00000400, + 0x42000000, 0x0010d237, 0x82001400, 0x00001000, 0x45780000, 0x80000000, 0x80081d80, 0x05fe07fd, - 0x4807c801, 0x1c01f000, 0x42002000, 0x0010b0e4, + 0x4807c801, 0x1c01f000, 0x42002000, 0x0010b364, 0x59e41801, 0x58100c01, 0x82040500, 0x00003800, 0x820c1d00, 0xffffc7ff, 0x800c1d40, 0x480fc801, 0x1c01f000, 0x5c036000, 0x4db00000, 0x49b3c857, 0x4803c857, 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x8d0c052a, 0x0500002f, 0x401c0000, 0x80040d40, 0x4004b800, 0x400cc000, 0x4018c800, - 0x0501f8d3, 0x41784000, 0x42002800, 0x0010b0e4, + 0x0501f8d3, 0x41784000, 0x42002800, 0x0010b364, 0x58142017, 0x5814000d, 0x80100400, 0x445c0000, 0x80102000, 0x80000000, 0x82104d00, 0x000000ff, 0x050008a9, 0x0500001c, 0x4c000000, 0x0501f88e, @@ -12962,17 +13016,17 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x05060ca0, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x42001000, 0x04000000, 0x41ccc800, 0x42002800, - 0x0010b0e4, 0x59a8008c, 0x82000d00, 0x000003ff, + 0x0010b364, 0x59a8008c, 0x82000d00, 0x000003ff, 0x4c000000, 0x58140212, 0x0501f85b, 0x5c000000, 0x4004b800, 0x4008c000, 0x905cbc06, 0x0501f016, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x42002800, - 0x0010b0e4, 0x42001000, 0x03000000, 0x4000c800, + 0x0010b364, 0x42001000, 0x03000000, 0x4000c800, 0x821c0500, 0x00003c00, 0x80000114, 0x821c0d00, 0x000003ff, 0x4c000000, 0x58140412, 0x0501f846, 0x5c000000, 0x4004b800, 0x4008c000, 0x805cbc00, 0x805cb840, 0x825c0480, 0x00000240, 0x05fe1edc, 0x0501f87b, 0x405c0000, 0x905cbc02, 0x80600d40, - 0x42002800, 0x0010b0e4, 0x41784000, 0x58142017, + 0x42002800, 0x0010b364, 0x41784000, 0x58142017, 0x825c0480, 0x00000101, 0x05021029, 0x5814000d, 0x80100400, 0x44040000, 0x80102000, 0x80000000, 0x805cb840, 0x82104d00, 0x000000ff, 0x0500084a, @@ -13002,7 +13056,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x58140014, 0x80000000, 0x90000503, 0x48002814, 0x05000003, 0x400c0000, 0x0501f002, 0x5814000d, 0x80000540, 0x4803c857, 0x1c01f000, 0x42002800, - 0x0010b0e4, 0x58140000, 0x8c00050a, 0x0500002f, + 0x0010b364, 0x58140000, 0x8c00050a, 0x0500002f, 0x8c000502, 0x0502002d, 0x4c5c0000, 0x5814b821, 0x49782821, 0x8400050a, 0x48002800, 0x58142017, 0x4813c857, 0x5814000d, 0x80100400, 0x41784000, @@ -13014,13 +13068,13 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x80000000, 0x80102000, 0x82104d00, 0x000000ff, 0x05fc0fb9, 0x05fc0e36, 0x48102817, 0x802041c0, 0x05060bc8, 0x405c2000, 0x600c1800, 0x60a01100, - 0x0519f942, 0x5c00b800, 0x1c01f000, 0x1c01f000, + 0x0519fa0d, 0x5c00b800, 0x1c01f000, 0x1c01f000, 0x59a80076, 0x8c000530, 0x05fe07fe, 0x4c080000, 0x60101000, 0x0501f849, 0x5c001000, 0x4201d000, - 0x00028b0a, 0x052df8b2, 0x4c080000, 0x60201000, + 0x00028b0a, 0x052dfa74, 0x4c080000, 0x60201000, 0x0501f842, 0x5c001000, 0x4201d000, 0x00028b0a, - 0x052df8ab, 0x4c080000, 0x60401000, 0x0501f83b, - 0x5c001000, 0x4201d000, 0x00028b0a, 0x052df8a4, + 0x052dfa6d, 0x4c080000, 0x60401000, 0x0501f83b, + 0x5c001000, 0x4201d000, 0x00028b0a, 0x052dfa66, 0x05fdf7e8, 0x8c00050c, 0x59a80876, 0x05020003, 0x84040d30, 0x0501f005, 0x84040d70, 0x48075076, 0x60001000, 0x0501f02d, 0x48075076, 0x916c0507, @@ -13063,13 +13117,13 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x417a5800, 0x417a6000, 0x417a6800, 0x417a7000, 0x417a7800, 0x417a8000, 0x417a8800, 0x417a9000, 0x417a9800, 0x417ae800, 0x417af800, 0x600300f8, - 0x42031000, 0x0010af93, 0x607f1960, 0x60df2160, - 0x42032800, 0x0010af07, 0x42033000, 0x00020da8, - 0x42034000, 0x0010ac19, 0x42033800, 0x0010ac38, - 0x42034800, 0x0010ac7d, 0x42035000, 0x0010ab80, - 0x42035800, 0x0010a380, 0x417b6000, 0x600368de, + 0x42031000, 0x0010b213, 0x607f1960, 0x60df2160, + 0x42032800, 0x0010b187, 0x42033000, 0x00020da8, + 0x42034000, 0x0010ae99, 0x42033800, 0x0010aeb8, + 0x42034800, 0x0010aefd, 0x42035000, 0x0010ae00, + 0x42035800, 0x0010a600, 0x417b6000, 0x600368de, 0x6003c860, 0x600371fe, 0x6003797e, 0x600380ee, - 0x60038880, 0x600390c0, 0x42039800, 0x0010ccc6, + 0x60038880, 0x600390c0, 0x42039800, 0x0010cf46, 0x6003a0ec, 0x6003a8e8, 0x6003b0e4, 0x6003b8e2, 0x6003c0e0, 0x6003d000, 0x4203e800, 0x000201d8, 0x417bd800, 0x1c01f000, 0x6407c830, 0x640fc831, @@ -13086,10 +13140,10 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x05020005, 0x50040000, 0x82000580, 0x55555555, 0x05fe07f1, 0x80142840, 0x4817c857, 0x4817c861, 0x4817500a, 0x1c01f000, 0x4817c857, 0x4c5c0000, - 0x4c600000, 0x054dfbdc, 0x05000030, 0x4817c857, + 0x4c600000, 0x054dfe8c, 0x05000030, 0x4817c857, 0x606c08f6, 0x50040800, 0x8c04053e, 0x0500002b, 0x4817c857, 0x850e1d70, 0x4c040000, 0x4c140000, - 0x0505fd6f, 0x5c002800, 0x5c000800, 0x59e0b81a, + 0x0505fd6d, 0x5c002800, 0x5c000800, 0x59e0b81a, 0x8204b500, 0x000007ff, 0x8058b000, 0x485b506e, 0x600008f4, 0x58042029, 0x5804302a, 0x82102500, 0xfffffff8, 0x82183500, 0xfffffff8, 0x40100000, @@ -13103,8 +13157,8 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x800409c0, 0x05020006, 0x49781c0c, 0x64081a0c, 0x641c1804, 0x59a8000f, 0x48001805, 0x05fdfcb0, 0x800409c0, 0x05020002, 0x80040800, 0x48041806, - 0x1c01f000, 0x61fcb001, 0x42024800, 0x0010b111, - 0x42000000, 0x0010bc11, 0x48024809, 0x90000410, + 0x1c01f000, 0x61fcb001, 0x42024800, 0x0010b391, + 0x42000000, 0x0010be91, 0x48024809, 0x90000410, 0x91264c0b, 0x8058b040, 0x05fe07fc, 0x1c01f000, 0x59a8080c, 0x4006d000, 0x6006b800, 0x59a8180a, 0x480fc857, 0x41783000, 0x90041415, 0x90082415, @@ -13123,18 +13177,18 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x1c01f000, 0x915c04a0, 0x0500100a, 0x496bc857, 0x815eb840, 0x416a5800, 0x592ed000, 0x497a5800, 0x497a5801, 0x497a5805, 0x812e59c0, 0x1c01f000, - 0x42000000, 0x0010b048, 0x054dfa1f, 0x417a5800, + 0x42000000, 0x0010b2c8, 0x054dfccf, 0x417a5800, 0x05fdf7fa, 0x0501f803, 0x412d8800, 0x1c01f000, 0x815eb840, 0x05001009, 0x416a5800, 0x492fc857, 0x592ed000, 0x497a5800, 0x497a5801, 0x497a5805, - 0x812e59c0, 0x1c01f000, 0x42000000, 0x0010b048, - 0x054dfa0d, 0x417ab800, 0x417a5800, 0x05fdf7f9, + 0x812e59c0, 0x1c01f000, 0x42000000, 0x0010b2c8, + 0x054dfcbd, 0x417ab800, 0x417a5800, 0x05fdf7f9, 0x492fc857, 0x496a5800, 0x412ed000, 0x815eb800, 0x59c80000, 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, 0x492fc857, 0x812e59c0, 0x05000007, 0x592c0001, 0x497a5801, 0x4c000000, 0x05fdfff1, 0x5c025800, 0x05fdf7f9, 0x1c01f000, 0x42000000, - 0x0010b048, 0x054df9f7, 0x80025d80, 0x1c01f000, + 0x0010b2c8, 0x054dfca7, 0x80025d80, 0x1c01f000, 0x4807c856, 0x42007000, 0x00020d9f, 0x64007000, 0x59e00003, 0x82000540, 0x00008080, 0x4803c003, 0x4a03b805, 0x90000001, 0x59dc0006, 0x4a03b805, @@ -13149,24 +13203,24 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x497bb807, 0x8058b040, 0x05fe07fe, 0x4a03b805, 0x30000000, 0x59dc0006, 0x4a03b805, 0x60000001, 0x4803c856, 0x05fdff90, 0x05fc0c15, 0x42001000, - 0x0010af8e, 0x452c1000, 0x64065801, 0x4a025802, - 0x00000100, 0x4a025808, 0x00106545, 0x497a5809, + 0x0010b20e, 0x452c1000, 0x64065801, 0x4a025802, + 0x00000100, 0x4a025808, 0x00106706, 0x497a5809, 0x497a580a, 0x497a580b, 0x05fdff83, 0x05fc0c08, - 0x42001000, 0x0010af8f, 0x452c1000, 0x64025801, + 0x42001000, 0x0010b20f, 0x452c1000, 0x64025801, 0x4a025802, 0x00000100, 0x4a025808, 0x00100f36, 0x497a5803, 0x497a5806, 0x497a5807, 0x497a5809, - 0x05fdff75, 0x05fc0bfa, 0x42001000, 0x0010af90, + 0x05fdff75, 0x05fc0bfa, 0x42001000, 0x0010b210, 0x452c1000, 0x64025801, 0x4a025802, 0x00000100, 0x4a025808, 0x00100f5a, 0x497a5803, 0x497a5806, 0x497a5807, 0x497a5809, 0x1c01f000, 0x40681000, 0x0001f81c, 0x1c01f000, 0x42001000, 0x0002002b, - 0x0529fd29, 0x0541f98d, 0x0549fdce, 0x05000010, + 0x0529feeb, 0x0541fb6e, 0x054df86c, 0x05000010, 0x4a03b805, 0x30000002, 0x59dc0006, 0x4807b800, 0x480bb801, 0x42007000, 0x00020d9f, 0x65007002, 0x480c7008, 0x58380007, 0x90000405, 0x48007003, 0x640c7000, 0x4803b803, 0x0001f053, 0x42000000, - 0x0010afb0, 0x054df978, 0x0541f983, 0x60040800, - 0x42001000, 0x0002002b, 0x0529fcec, 0x42007000, + 0x0010b230, 0x054dfc28, 0x0541fb64, 0x60040800, + 0x42001000, 0x0002002b, 0x0529feae, 0x42007000, 0x00020d9f, 0x0001f034, 0x58380802, 0x600011fe, 0x82040480, 0x0000ff00, 0x05021003, 0x40041000, 0x80000580, 0x48007002, 0x480bb802, 0x59dc0006, @@ -13206,7 +13260,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x05000003, 0x48107005, 0x0501f008, 0x49787005, 0x49787004, 0x0501f005, 0x48101800, 0x801021c0, 0x05020002, 0x480c7004, 0x1c01f000, 0x4803c856, - 0x4dc00000, 0x42007000, 0x0010af91, 0x64007400, + 0x4dc00000, 0x42007000, 0x0010b211, 0x64007400, 0x49787001, 0x600380ee, 0x60080800, 0x59c00007, 0x4a038006, 0x60000001, 0x59c00007, 0x4a038006, 0x60000003, 0x59c00007, 0x4a038006, 0x60000005, @@ -13246,12 +13300,12 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x90000001, 0x80040840, 0x05fe07fa, 0x05fdfa98, 0x83c00580, 0x00007700, 0x05000003, 0x600380ee, 0x05fdf7f3, 0x4178a000, 0x805cb9c0, 0x0502000f, - 0x6080b000, 0x91b8ac20, 0x054df906, 0x640770fb, + 0x6080b000, 0x91b8ac20, 0x054dfbb6, 0x640770fb, 0x4a037020, 0x00100e26, 0x59a80030, 0x82000500, - 0x0000ffff, 0x48037021, 0x4a037035, 0x0010cc01, + 0x0000ffff, 0x48037021, 0x4a037035, 0x0010ce81, 0x4a037038, 0x00100e1d, 0x640770fb, 0x6080b000, - 0x91b8ac00, 0x054df8f7, 0x6100b000, 0xb1b8ac00, - 0x054df8f4, 0x805cb9c0, 0x05020006, 0x4a0370e4, + 0x91b8ac00, 0x054dfba7, 0x6100b000, 0xb1b8ac00, + 0x054dfba4, 0x805cb9c0, 0x05020006, 0x4a0370e4, 0xaaaaaaaa, 0x4a0370e5, 0xaaaaaaaa, 0x0501f005, 0x4a0370e4, 0xa2aa2a82, 0x4a0370e5, 0xaaaaa2aa, 0x4a0370e6, 0xaaaaaaaa, 0x640370fb, 0x4a0370e6, @@ -13263,122 +13317,122 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4d340000, 0x4d400000, 0x4cfc0000, 0x4d380000, 0x4d3c0000, 0x4d440000, 0x4d4c0000, 0x4d480000, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4d040000, - 0x4cf40000, 0x4cf80000, 0x4cfc0000, 0x0001f8bd, - 0x5c01f800, 0x5c01f000, 0x5c01e800, 0x5c020800, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c029000, - 0x5c029800, 0x5c028800, 0x5c027800, 0x5c027000, - 0x5c01f800, 0x5c028000, 0x5c026800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x493bc857, 0x0001f0ea, - 0x83300500, 0x000000ff, 0x90000c87, 0x05fe1a30, - 0x0c01f022, 0x1c01f000, 0x82000d00, 0xc2000038, - 0x05fe0a21, 0x05fdfa2a, 0x00000000, 0x00000048, - 0x00000054, 0x00000053, 0x001007e1, 0x00100801, - 0x001007f9, 0x0010081b, 0x001007ea, 0x001007f3, - 0x001007fc, 0x00100817, 0x00100867, 0x001007e1, - 0x00100869, 0x001007e1, 0x001007e1, 0x0010086c, - 0x00100870, 0x00100881, 0x00100892, 0x0010081c, - 0x00100899, 0x001008a3, 0x001007e1, 0x001007e1, - 0x001007e1, 0x05fdfa0e, 0x001007e9, 0x00100923, - 0x00100839, 0x00100859, 0x001007e9, 0x001007e9, - 0x001007e9, 0x05fdfa06, 0x4803c856, 0x59300004, - 0x8c00053e, 0x05020003, 0x61567000, 0x0005f478, - 0x052dfb45, 0x05fc07fd, 0x1c01f000, 0x4803c856, - 0x0501f8b1, 0x40002800, 0x41782000, 0x615a7000, - 0x0005f478, 0x4803c856, 0x615e7000, 0x0005f478, - 0x4803c856, 0x0529f87f, 0x42000000, 0x80000000, - 0x0001f12d, 0x4803c856, 0x59325809, 0x812e59c0, - 0x05000012, 0x59300008, 0x8c00051a, 0x0502000b, - 0x592c0409, 0x8c00051c, 0x05020003, 0x4a026013, - 0xffffffff, 0x59300004, 0x8c00053e, 0x05020005, - 0x61227000, 0x0005f478, 0x641e5a07, 0x05fdf7f8, - 0x052dfb21, 0x05fc07fb, 0x1c01f000, 0x4803c856, - 0x83300500, 0x00ffffff, 0x0529f4f5, 0x1c01f000, - 0x4803c856, 0x813261c0, 0x05fc09d1, 0x053dfaf3, - 0x0500000b, 0x59325809, 0x592c0209, 0x84000552, - 0x48025a09, 0x0505f8aa, 0x59300004, 0x8c00053e, - 0x05020004, 0x417a7800, 0x0539ff46, 0x1c01f000, - 0x052dfb09, 0x05fc07fc, 0x1c01f000, 0x4c040000, - 0x59b808ea, 0x90040d07, 0x90040583, 0x05000004, - 0x42000000, 0x60000000, 0x0501f89a, 0x5c000800, - 0x1c01f000, 0x0501f8dd, 0x05000015, 0x59325809, - 0x812e59c0, 0x05000012, 0x592c0205, 0x82000500, - 0x000000ff, 0x90000da9, 0x0502000d, 0x59300203, - 0x90000583, 0x05000008, 0x59300808, 0x84040d26, - 0x48066008, 0x0001f938, 0x6503900d, 0x642370e5, - 0x1c01f000, 0x052dfae8, 0x05fc07f8, 0x42000000, - 0x0010b04e, 0x0549ff44, 0x5988014a, 0x80000000, - 0x4803114a, 0x6503900d, 0x42000000, 0xc0000000, - 0x0001f12d, 0x4c5c0000, 0x4c600000, 0x4c640000, - 0x4200c800, 0x0010cc08, 0x6000b860, 0x6014c002, - 0x0529f947, 0x4a0370e4, 0x02000000, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4933c857, - 0x0005f45a, 0x4933c857, 0x0501fba1, 0x1c01f000, - 0x41300800, 0x800409c0, 0x05fe0981, 0x05fdf976, - 0x42000000, 0x0010b04e, 0x0549ff23, 0x4933c857, - 0x813261c0, 0x05fc097a, 0x0501f82f, 0x40002800, - 0x0549fe86, 0x0501f894, 0x05000006, 0x5932680a, - 0x59340200, 0x8c00050e, 0x59300416, 0x053e0d8c, - 0x1c01f000, 0x42000000, 0x0010b04e, 0x0549ff12, - 0x4933c857, 0x813261c0, 0x05fc0969, 0x0501f886, - 0x05000009, 0x053dfa89, 0x05000007, 0x59325809, - 0x592c0209, 0x8400054e, 0x48025a09, 0x417a7800, - 0x0539fee0, 0x1c01f000, 0x485fc857, 0x5c000000, - 0x4d780000, 0x4203e000, 0x50000000, 0x6014b900, - 0x05fdf15b, 0x4933c857, 0x913004a0, 0x05fe1954, - 0x83300c00, 0x0010b0c1, 0x50040000, 0x80000000, - 0x05001002, 0x44000800, 0x1c01f000, 0x4933c857, - 0x05fdf7f6, 0x4807c856, 0x59b800ea, 0x8c000510, - 0x05fc07fd, 0x59b800e0, 0x4803c857, 0x1c01f000, - 0x4803c856, 0x42000000, 0x10000000, 0x41300800, - 0x0501f020, 0x8c000510, 0x00000133, 0x4c040000, - 0x0501f808, 0x5c000800, 0x90100488, 0x00001133, - 0x4c040000, 0x05fdfedd, 0x5c000800, 0x0001f133, - 0x59b800e2, 0x59b820e2, 0x80100580, 0x05fe07fd, - 0x80102114, 0x0501f001, 0x40101800, 0x800c190a, - 0x9010051f, 0x900c1d1f, 0x800c2480, 0x9010251f, - 0x1c01f000, 0x40680000, 0x406c0800, 0x0501f805, - 0x60058800, 0x05020002, 0x60018800, 0x1c01f000, - 0x82000500, 0xf0000000, 0x82040d00, 0x0fffffff, - 0x80040d40, 0x4807c857, 0x42001000, 0x0010af92, - 0x50080000, 0x80000540, 0x05020004, 0x640f70e5, - 0x4a0370e4, 0x00000300, 0x80000000, 0x44001000, - 0x60001008, 0x59b800ea, 0x8c000510, 0x0500000b, - 0x05fdffd8, 0x90100488, 0x05001007, 0x4c040000, - 0x4c080000, 0x05fdfead, 0x5c001000, 0x5c000800, - 0x0501f01c, 0x59b800ea, 0x8c000516, 0x05020019, - 0x4a0370e4, 0x00300000, 0x480770e1, 0x600011fe, - 0x80081040, 0x05000010, 0x59b808e4, 0x8c040528, - 0x05fe07fc, 0x42001000, 0x0010af92, 0x50080000, - 0x80000040, 0x05020004, 0x640b70e5, 0x4a0370e4, - 0x00000200, 0x05fc18ee, 0x44001000, 0x8c04052c, - 0x1c01f000, 0x41f80000, 0x50000000, 0x05fdf8e8, - 0x80081040, 0x05fe07d8, 0x41f80000, 0x50000000, - 0x05fdf8e3, 0x4d380000, 0x59300c07, 0x90040589, - 0x05020004, 0x611e7000, 0x0005fc78, 0x80000580, - 0x5c027000, 0x1c01f000, 0x4c500000, 0x6407900d, - 0x59c8a020, 0x640b900d, 0x59c80820, 0x8c50052e, - 0x05000002, 0x900409c0, 0x82040d00, 0x0000ffff, - 0x0525fe8b, 0x5c00a000, 0x1c01f000, 0x42000000, - 0x0010b045, 0x0549fe70, 0x05fdfff0, 0x0500004a, - 0x4933c857, 0x59300407, 0x90000580, 0x05000046, - 0x59c82021, 0x6407900d, 0x59c82821, 0x82142d00, - 0x0000ffff, 0x59325809, 0x812e59c0, 0x0500003e, - 0x5932680a, 0x051dfa95, 0x053e0cbd, 0x599c0019, - 0x8c00050c, 0x0502001b, 0x051dfa90, 0x05020019, - 0x59300813, 0x4807c857, 0x592c0409, 0x8c00051c, - 0x05020012, 0x8400055c, 0x48025c09, 0x592c0a05, - 0x82040d00, 0x000000ff, 0xb0040588, 0x05000007, - 0x90040598, 0x05000005, 0xb00405a8, 0x05000003, - 0xb00405aa, 0x05020005, 0x59300013, 0x0541fb6f, - 0x80000d40, 0x48065803, 0x4a026013, 0x7fffffff, - 0x59300008, 0x8c000516, 0x0502001b, 0x48166015, - 0x599c0019, 0x8c00050c, 0x05020004, 0x59a80007, - 0x8c00051e, 0x05020014, 0x0501fce8, 0x05020012, + 0x4cf40000, 0x4cf80000, 0x0001f8bd, 0x5c01f000, + 0x5c01e800, 0x5c020800, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x5c029000, 0x5c029800, 0x5c028800, + 0x5c027800, 0x5c027000, 0x5c01f800, 0x5c028000, + 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x493bc857, 0x0001f0ea, 0x83300500, 0x000000ff, + 0x90000c87, 0x05fe1a32, 0x0c01f022, 0x1c01f000, + 0x82000d00, 0xc2000038, 0x05fe0a23, 0x05fdfa2c, + 0x00000000, 0x00000048, 0x00000054, 0x00000053, + 0x001007df, 0x001007ff, 0x001007f7, 0x00100819, + 0x001007e8, 0x001007f1, 0x001007fa, 0x00100815, + 0x00100865, 0x001007df, 0x00100867, 0x001007df, + 0x001007df, 0x0010086a, 0x0010086e, 0x0010087f, + 0x00100890, 0x0010081a, 0x00100897, 0x001008a1, + 0x001007df, 0x001007df, 0x001007df, 0x05fdfa10, + 0x001007e7, 0x00100921, 0x00100837, 0x00100857, + 0x001007e7, 0x001007e7, 0x001007e7, 0x05fdfa08, + 0x4803c856, 0x59300004, 0x8c00053e, 0x05020003, + 0x61567000, 0x0005f478, 0x052dfd09, 0x05fc07fd, + 0x1c01f000, 0x4803c856, 0x0501f8b1, 0x40002800, + 0x41782000, 0x615a7000, 0x0005f478, 0x4803c856, + 0x615e7000, 0x0005f478, 0x4803c856, 0x0529fa0c, + 0x42000000, 0x80000000, 0x0001f12d, 0x4803c856, + 0x59325809, 0x812e59c0, 0x05000012, 0x59300008, + 0x8c00051a, 0x0502000b, 0x592c0409, 0x8c00051c, + 0x05020003, 0x4a026013, 0xffffffff, 0x59300004, + 0x8c00053e, 0x05020005, 0x61227000, 0x0005f478, + 0x641e5a07, 0x05fdf7f8, 0x052dfce5, 0x05fc07fb, + 0x1c01f000, 0x4803c856, 0x83300500, 0x00ffffff, + 0x0529f6b9, 0x1c01f000, 0x4803c856, 0x813261c0, + 0x05fc09d3, 0x053dfcd6, 0x0500000b, 0x59325809, + 0x592c0209, 0x84000552, 0x48025a09, 0x0505f8aa, + 0x59300004, 0x8c00053e, 0x05020004, 0x417a7800, + 0x053df926, 0x1c01f000, 0x052dfccd, 0x05fc07fc, + 0x1c01f000, 0x4c040000, 0x59b808ea, 0x90040d07, + 0x90040583, 0x05000004, 0x42000000, 0x60000000, + 0x0501f89a, 0x5c000800, 0x1c01f000, 0x0501f8dd, + 0x05000015, 0x59325809, 0x812e59c0, 0x05000012, + 0x592c0205, 0x82000500, 0x000000ff, 0x90000da9, + 0x0502000d, 0x59300203, 0x90000583, 0x05000008, + 0x59300808, 0x84040d26, 0x48066008, 0x0001f938, + 0x6503900d, 0x642370e5, 0x1c01f000, 0x052dfcac, + 0x05fc07f8, 0x42000000, 0x0010b2ce, 0x054df9f6, + 0x5988014a, 0x80000000, 0x4803114a, 0x6503900d, + 0x42000000, 0xc0000000, 0x0001f12d, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x4200c800, 0x0010ce88, + 0x6000b860, 0x6014c002, 0x0529fad8, 0x4a0370e4, + 0x02000000, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x4933c857, 0x0005f45a, 0x4933c857, + 0x0501fba3, 0x1c01f000, 0x41300800, 0x800409c0, + 0x05fe0983, 0x05fdf978, 0x42000000, 0x0010b2ce, + 0x054df9d5, 0x4933c857, 0x813261c0, 0x05fc097c, + 0x0501f82f, 0x40002800, 0x054df938, 0x0501f894, + 0x05000006, 0x5932680a, 0x59340200, 0x8c00050e, + 0x59300416, 0x053e0f6f, 0x1c01f000, 0x42000000, + 0x0010b2ce, 0x054df9c4, 0x4933c857, 0x813261c0, + 0x05fc096b, 0x0501f886, 0x05000009, 0x053dfc6c, + 0x05000007, 0x59325809, 0x592c0209, 0x8400054e, + 0x48025a09, 0x417a7800, 0x053df8c0, 0x1c01f000, + 0x485fc857, 0x5c000000, 0x4d780000, 0x4203e000, + 0x50000000, 0x6014b900, 0x05fdf15d, 0x4933c857, + 0x913004a0, 0x05fe1956, 0x83300c00, 0x0010b341, + 0x50040000, 0x80000000, 0x05001002, 0x44000800, + 0x1c01f000, 0x4933c857, 0x05fdf7f6, 0x4807c856, + 0x59b800ea, 0x8c000510, 0x05fc07fd, 0x59b800e0, + 0x4803c857, 0x1c01f000, 0x4803c856, 0x42000000, + 0x10000000, 0x41300800, 0x0501f020, 0x8c000510, + 0x00000133, 0x4c040000, 0x0501f808, 0x5c000800, + 0x90100488, 0x00001133, 0x4c040000, 0x05fdfedf, + 0x5c000800, 0x0001f133, 0x59b800e2, 0x59b820e2, + 0x80100580, 0x05fe07fd, 0x80102114, 0x0501f001, + 0x40101800, 0x800c190a, 0x9010051f, 0x900c1d1f, + 0x800c2480, 0x9010251f, 0x1c01f000, 0x40680000, + 0x406c0800, 0x0501f805, 0x60058800, 0x05020002, + 0x60018800, 0x1c01f000, 0x82000500, 0xf0000000, + 0x82040d00, 0x0fffffff, 0x80040d40, 0x4807c857, + 0x42001000, 0x0010b212, 0x50080000, 0x80000540, + 0x05020004, 0x640f70e5, 0x4a0370e4, 0x00000300, + 0x80000000, 0x44001000, 0x60001008, 0x59b800ea, + 0x8c000510, 0x0500000b, 0x05fdffd8, 0x90100488, + 0x05001007, 0x4c040000, 0x4c080000, 0x05fdfeaf, + 0x5c001000, 0x5c000800, 0x0501f01c, 0x59b800ea, + 0x8c000516, 0x05020019, 0x4a0370e4, 0x00300000, + 0x480770e1, 0x600011fe, 0x80081040, 0x05000010, + 0x59b808e4, 0x8c040528, 0x05fe07fc, 0x42001000, + 0x0010b212, 0x50080000, 0x80000040, 0x05020004, + 0x640b70e5, 0x4a0370e4, 0x00000200, 0x05fc18f0, + 0x44001000, 0x8c04052c, 0x1c01f000, 0x41f80000, + 0x50000000, 0x05fdf8ea, 0x80081040, 0x05fe07d8, + 0x41f80000, 0x50000000, 0x05fdf8e5, 0x4d380000, + 0x59300c07, 0x90040589, 0x05020004, 0x611e7000, + 0x0005fc78, 0x80000580, 0x5c027000, 0x1c01f000, + 0x4c500000, 0x6407900d, 0x59c8a020, 0x640b900d, + 0x59c80820, 0x8c50052e, 0x05000002, 0x900409c0, + 0x82040d00, 0x0000ffff, 0x0529f816, 0x5c00a000, + 0x1c01f000, 0x42000000, 0x0010b2c5, 0x054df922, + 0x05fdfff0, 0x0500004c, 0x4933c857, 0x59300407, + 0x90000580, 0x05000048, 0x59c82021, 0x6407900d, + 0x59c82821, 0x82142d00, 0x0000ffff, 0x59325809, + 0x812e59c0, 0x05000040, 0x5932680a, 0x051dfb71, + 0x053e0ea0, 0x599c0019, 0x8c00050c, 0x0502001b, + 0x051dfb6c, 0x05020019, 0x59300813, 0x4807c857, + 0x592c0409, 0x8c00051c, 0x05020012, 0x8400055c, + 0x48025c09, 0x592c0a05, 0x82040d00, 0x000000ff, + 0xb0040588, 0x05000007, 0x90040598, 0x05000005, + 0xb00405a8, 0x05000003, 0xb00405aa, 0x05020005, + 0x59300013, 0x0541fd57, 0x80000d40, 0x48065803, + 0x4a026013, 0x7fffffff, 0x59300008, 0x8c000516, + 0x0502001d, 0x48166015, 0x051dfb4e, 0x05000004, + 0x59300416, 0x8c00051c, 0x05000004, 0x599c0019, + 0x8c00050c, 0x05000014, 0x0501fce8, 0x05020012, 0x0501fa0b, 0x40280000, 0x4802600f, 0x05000005, 0x4832600d, 0x50200000, 0x4802600c, 0x4822600e, 0x59300416, 0x8c00051c, 0x05020004, 0x599c0019, 0x8c00050c, 0x05020871, 0x6503900d, 0x642370e5, - 0x1c01f000, 0x42000000, 0x0010b04e, 0x0549fe22, + 0x1c01f000, 0x42000000, 0x0010b2ce, 0x054df8d2, 0x5988014c, 0x80000000, 0x4803114c, 0x6503900d, 0x42000000, 0xc0000000, 0x0001f12d, 0x4cf80000, 0x58f40000, 0x8001f540, 0x0501f81e, 0x41781800, @@ -13405,7 +13459,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4979e800, 0x4179f000, 0x5c025800, 0x1c01f000, 0x80f5e9c0, 0x05000008, 0x80f9f1c0, 0x05fe0ff6, 0x4d2c0000, 0x40f65800, 0x05fdfbb2, 0x4179e800, - 0x5c025800, 0x1c01f000, 0x4cf40000, 0x051df9eb, + 0x5c025800, 0x1c01f000, 0x4cf40000, 0x051dfac5, 0x0502002e, 0x59300808, 0x82040500, 0x00003000, 0x0502002a, 0x8c040522, 0x0500002a, 0x5930002b, 0x8001ed40, 0x05fc0806, 0x82000580, 0xffffffff, @@ -13432,11 +13486,11 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x0501f022, 0x580c2a07, 0x580c0008, 0x59301813, 0x800c0580, 0x05000021, 0x90040580, 0x0500000e, 0x40140000, 0x4c080000, 0x400c1000, 0x41780800, - 0x0529faf4, 0x800409c0, 0x05fa0fa5, 0x90140c08, - 0x0529fad4, 0x5c001000, 0x40041800, 0x592c0803, + 0x0529fcb6, 0x800409c0, 0x05fa0fa5, 0x90140c08, + 0x0529fc96, 0x5c001000, 0x40041800, 0x592c0803, 0x0501f015, 0x90140408, 0x4c080000, 0x400c1000, - 0x41780800, 0x0529fae7, 0x800409c0, 0x05fa0f98, - 0x40140800, 0x0529fac7, 0x5c001000, 0x40041800, + 0x41780800, 0x0529fca9, 0x800409c0, 0x05fa0f98, + 0x40140800, 0x0529fc89, 0x5c001000, 0x40041800, 0x592c0803, 0x0501f008, 0x59301813, 0x40040000, 0x800c0580, 0x05020004, 0x497a5a02, 0x64125c01, 0x0501f007, 0x64065a02, 0x641a5c01, 0x497a5804, @@ -13484,7 +13538,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x05020005, 0x90183402, 0x80142840, 0x05fe07f7, 0x1c01f000, 0x90000541, 0x05fdf7fe, 0x05f9fedc, 0x592c020b, 0x8c000502, 0x05fc07fd, 0x497a6014, - 0x0501fdce, 0x412c7000, 0x59300008, 0x84000556, + 0x0501fdcc, 0x412c7000, 0x59300008, 0x84000556, 0x48026008, 0x9004050f, 0x82000c00, 0x00100e26, 0x50044000, 0x80204000, 0x50200000, 0x80187c00, 0x583c2800, 0x583c2001, 0x583c1002, 0x58380a08, @@ -13516,7 +13570,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x58342800, 0x58343801, 0x480e6012, 0x48166010, 0x481e6011, 0x0501f275, 0x4933c857, 0x5931f809, 0x59301006, 0x800811c0, 0x05000009, 0x41780800, - 0x60280000, 0x0529f9a3, 0x80080102, 0x05020002, + 0x60280000, 0x0529fb65, 0x80080102, 0x05020002, 0x84001542, 0x80081040, 0x4809fc07, 0x640a6006, 0x592c040a, 0x90000508, 0x05000008, 0x0501f834, 0x59300203, 0x90000584, 0x05020003, 0x61227000, @@ -13527,7 +13581,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x58fc0008, 0x0501f00a, 0x58fc0409, 0x8c000512, 0x05020019, 0x58fc0c0a, 0x8c040516, 0x05020003, 0x5c01f800, 0x1c01f000, 0x58fc000b, 0x4c000000, - 0x4d2c0000, 0x40fe5800, 0x59300013, 0x0541f8f7, + 0x4d2c0000, 0x40fe5800, 0x59300013, 0x0541fadd, 0x5c025800, 0x80000d40, 0x5c000000, 0x80040580, 0x05020007, 0x59300008, 0x84000500, 0x48026008, 0x61227000, 0x5c01f800, 0x0005f478, 0x5c01f800, @@ -13536,10 +13590,10 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x90040d07, 0x90040580, 0x05000021, 0x90040583, 0x0500001f, 0x59300407, 0x4c000000, 0x64026407, 0x61043000, 0x4a0370e5, 0x00003000, 0x42000000, - 0x50000000, 0x41300800, 0x4c180000, 0x05fdfce5, + 0x50000000, 0x41300800, 0x4c180000, 0x05fdfce3, 0x5c003000, 0x0500000d, 0x60780000, 0x80000040, 0x05fe07ff, 0x80183040, 0x05fe07f5, 0x42000000, - 0x40000000, 0x41300800, 0x05fdfcda, 0x59880146, + 0x40000000, 0x41300800, 0x05fdfcd8, 0x59880146, 0x80000000, 0x48031146, 0x4a0370e5, 0x00002000, 0x5c000000, 0x48026407, 0x1c01f000, 0x59300008, 0x84000500, 0x48026008, 0x05fdf7fc, 0x59c00007, @@ -13547,28 +13601,28 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x8c00050a, 0x05fe07fe, 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, 0x4dc00000, 0x640370e8, 0x608380ee, 0x05fdfff2, 0x600380ee, 0x05fdfff0, - 0x051dfe19, 0x05020011, 0x4a038891, 0x0000ffff, - 0x497b8880, 0x4ce80000, 0x6059d000, 0x0529f864, - 0x497b8892, 0x6059d000, 0x0529f861, 0x5c01d000, - 0x42000000, 0x0010b099, 0x0549fb73, 0x0501f810, - 0x5c038000, 0x051df707, 0x0501f81f, 0x4c080000, - 0x4c140000, 0x42000000, 0x0010b09a, 0x0549fb6a, + 0x051dff1e, 0x05020011, 0x4a038891, 0x0000ffff, + 0x497b8880, 0x4ce80000, 0x6059d000, 0x0529fa26, + 0x497b8892, 0x6059d000, 0x0529fa23, 0x5c01d000, + 0x42000000, 0x0010b319, 0x0549fe23, 0x0501f810, + 0x5c038000, 0x0521f00c, 0x0501f81f, 0x4c080000, + 0x4c140000, 0x42000000, 0x0010b31a, 0x0549fe1a, 0x0501f807, 0x5c002800, 0x5c001000, 0x48178892, 0x480b8880, 0x5c038000, 0x1c01f000, 0x496fc857, 0x916c0583, 0x05020008, 0x4c080000, 0x4c0c0000, - 0x61201100, 0x61fc19ff, 0x0515f8c8, 0x5c001800, - 0x5c001000, 0x60f00800, 0x0501ff12, 0x4a038891, + 0x61201100, 0x61fc19ff, 0x0515f993, 0x5c001800, + 0x5c001000, 0x60f00800, 0x0501ff10, 0x4a038891, 0x0000ffff, 0x6503900d, 0x05fdfae3, 0x640770e8, 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, 0x59c41080, 0x497b8880, 0x4ce80000, 0x6059d000, - 0x4c080000, 0x0529f832, 0x5c001000, 0x5c01d000, - 0x59c42892, 0x497b8892, 0x051dfddb, 0x05020002, + 0x4c080000, 0x0529f9f4, 0x5c001000, 0x5c01d000, + 0x59c42892, 0x497b8892, 0x051dfee0, 0x05020002, 0x1c01f000, 0x61802004, 0x59c418a4, 0x900c1d0f, 0x900c0580, 0x0500000c, 0x59c41805, 0x900c1d01, 0x0502000b, 0x59c418a4, 0x900c1d0f, 0x900c0487, 0x05001003, 0x900c048c, 0x05001003, 0x80102040, 0x05fe07f2, 0x497b8891, 0x1c01f000, 0x4c100000, - 0x60642000, 0x64078805, 0x0505fca0, 0x59c41805, + 0x60642000, 0x64078805, 0x0505fca1, 0x59c41805, 0x900c1d01, 0x05000005, 0x80102040, 0x05fe07fa, 0x5c002000, 0x05fdf7f4, 0x5c002000, 0x05fdf7f0, 0x4803c856, 0x1c01f000, 0x00100c86, 0x00100c86, @@ -13585,7 +13639,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4802600c, 0x492e600d, 0x480a600e, 0x480e600f, 0x497a6014, 0x05fdf7f3, 0x8c040500, 0x05020071, 0x82040d00, 0x00000080, 0x0500006e, 0x0001f18e, - 0x0501fc3a, 0x843c7d4e, 0x0001f19b, 0x59307804, + 0x0501fc38, 0x843c7d4e, 0x0001f19b, 0x59307804, 0x823c7d00, 0x01880080, 0x823c7d40, 0x80000005, 0x59300013, 0x82000500, 0xffff0000, 0x05000002, 0x843c7d6a, 0x59300015, 0x59301014, 0x80080580, @@ -13596,14 +13650,14 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x00008080, 0x05020016, 0x592c6001, 0x58300406, 0x90000503, 0x90000581, 0x05020011, 0x84040d1e, 0x48066004, 0x58300207, 0x59302015, 0x801021c0, - 0x0500000b, 0x40101000, 0x41780800, 0x0529f861, + 0x0500000b, 0x40101000, 0x41780800, 0x0529fa23, 0x800810c6, 0x59301814, 0x800c0482, 0x80100580, 0x05020003, 0x48126014, 0x05fdf7db, 0x42000000, - 0x0010b046, 0x0549fab0, 0x59302015, 0x59300416, + 0x0010b2c6, 0x0549fd60, 0x59302015, 0x59300416, 0x4803c857, 0x8c000514, 0x0502000f, 0x599c1819, 0x8c0c0512, 0x0500000a, 0x592c0810, 0x59300017, 0x80040c80, 0x05000005, 0x05001004, 0x80040000, - 0x80140480, 0x05001008, 0x0531f882, 0x900c1d41, + 0x80140480, 0x05001008, 0x0531fa3a, 0x900c1d41, 0x0501f01f, 0x84000514, 0x48026416, 0x48126017, 0x4813c857, 0x4c3c0000, 0x0501f948, 0x5c007800, 0x05020017, 0x5930500f, 0x592c0209, 0x4803c857, @@ -13613,21 +13667,21 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x482a600f, 0x480fc857, 0x4833c857, 0x4823c857, 0x482bc857, 0x80000580, 0x483e6004, 0x1c01f000, 0x05f9fcd7, 0x4933c857, 0x4d2c0000, 0x59900005, - 0x81300580, 0x05fa0cd2, 0x0539fdf4, 0x05f80cd0, + 0x81300580, 0x05fa0cd2, 0x0539ffd5, 0x05f80cd0, 0x59325809, 0x4d3c0000, 0x4d400000, 0x59300004, - 0x4803c857, 0x4c000000, 0x0529fc95, 0x0529f98e, + 0x4803c857, 0x4c000000, 0x0529fe57, 0x0529fb50, 0x5c000000, 0x8c000516, 0x0500000e, 0x592c0010, 0x4803c857, 0x48025808, 0x41780800, 0x600a8000, - 0x051dfabd, 0x4a025c07, 0x0000ffff, 0x492fc857, - 0x0001fb5b, 0x053dff80, 0x052dffdd, 0x0501f015, + 0x051dfbba, 0x4a025c07, 0x0000ffff, 0x492fc857, + 0x0001fb5b, 0x0541f966, 0x0531f991, 0x0501f015, 0x640a6203, 0x592c0209, 0x8c000512, 0x05020004, 0x592c0209, 0x8400054e, 0x48025a09, 0x59300407, 0x90000586, 0x05020009, 0x811800ca, 0x81c80c00, 0x58040939, 0x592c000e, 0x80040480, 0x592c0810, - 0x80040480, 0x4802580c, 0x417a7800, 0x0539fa25, + 0x80040480, 0x4802580c, 0x417a7800, 0x0539fc03, 0x5c028000, 0x5c027800, 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x59900005, 0x81300580, - 0x05fa0c9b, 0x0539fdbd, 0x05f80c99, 0x59325809, + 0x05fa0c9b, 0x0539ff9e, 0x05f80c99, 0x59325809, 0x592c0209, 0x84000540, 0x48025a09, 0x05fdf7c6, 0x491bc857, 0x4dd00000, 0x4c580000, 0x41780800, 0x8007a0ca, 0x83d3a400, 0x00007600, 0x4a03a005, @@ -13653,14 +13707,14 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x59d00810, 0x59d01011, 0x59d01812, 0x48002c23, 0x48042824, 0x48082825, 0x480c2826, 0x6401b006, 0x4a03a005, 0x30000000, 0x59d00006, 0x1c01f000, - 0x42000000, 0x0010b0e1, 0x0549f9d7, 0x600008ec, + 0x42000000, 0x0010b361, 0x0549fc87, 0x600008ec, 0x580410a2, 0x41780800, 0x9008050f, 0x8c000506, 0x05020003, 0x81180580, 0x05000006, 0x80040800, 0x80081108, 0x90040587, 0x05fe07f8, 0x05f9fc24, 0x4a039040, 0x04000000, 0x59c80040, 0x8c000532, 0x05fe07fe, 0x59d0000d, 0x800000e0, 0x59d0100c, 0x82081500, 0x0000ffff, 0x80081540, 0x480b9028, - 0x4d2c0000, 0x59325809, 0x0539fd38, 0x05f80c14, + 0x4d2c0000, 0x59325809, 0x0539ff19, 0x05f80c14, 0x59d02004, 0x592c0205, 0x82001500, 0x000000ff, 0x9000050f, 0x90000582, 0x05000003, 0xb00805ba, 0x05020004, 0x592c000e, 0x80102480, 0x05f81c08, @@ -13695,10 +13749,10 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x592c000e, 0x80102480, 0x801021c0, 0x41781000, 0x0500000e, 0x592c6001, 0x58300406, 0x58300a07, 0x90000503, 0x90000580, 0x05000002, 0x90040c08, - 0x40040000, 0x40101000, 0x41780800, 0x0525fed5, - 0x800409c0, 0x05020059, 0x0501faaa, 0x0500004f, + 0x40040000, 0x40101000, 0x41780800, 0x0529f897, + 0x800409c0, 0x05020059, 0x0501faa8, 0x0500004f, 0x0501f056, 0x59300004, 0x8c00050e, 0x0500000d, - 0x0501fb37, 0x05020051, 0x592c6001, 0x42004000, + 0x0501fb35, 0x05020051, 0x592c6001, 0x42004000, 0x00100e1e, 0x58300406, 0x8c000510, 0x0500000f, 0x5830540a, 0x42004000, 0x00100e1f, 0x0501f00b, 0x412c6000, 0x0501f847, 0x05000008, 0x90240582, @@ -13729,11 +13783,11 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x80000580, 0x1c01f000, 0x4c5c0000, 0x59e4b800, 0x485fc857, 0x905c051f, 0x05fa0b09, 0x825c0500, 0x000000e0, 0x05f80b06, 0x8c5c050e, 0x05020807, - 0x8c5c050c, 0x05020809, 0x8c5c050a, 0x05020902, + 0x8c5c050c, 0x05020809, 0x8c5c050a, 0x05020900, 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4a03c800, 0x00000080, 0x1c01f000, 0x4d2c0000, 0x42007800, - 0x0010b0e4, 0x583c0003, 0x583c0804, 0x80040540, - 0x05000037, 0x42000800, 0x0010af8f, 0x50065800, + 0x0010b364, 0x583c0003, 0x583c0804, 0x80040540, + 0x05000037, 0x42000800, 0x0010b20f, 0x50065800, 0x592c0002, 0x90000580, 0x05000031, 0x59e40050, 0x59e40852, 0x80040480, 0x82000500, 0xfffffc00, 0x05020005, 0x59e40050, 0x59e40851, 0x80040800, @@ -13747,958 +13801,971 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x64025801, 0x4a025808, 0x00100f36, 0x480a5806, 0x48065807, 0x59e40053, 0x800000c4, 0x48025805, 0x412c1000, 0x492fc857, 0x0001f81c, 0x5c025800, - 0x6503c800, 0x1c01f000, 0x42007800, 0x0010af8f, + 0x6503c800, 0x1c01f000, 0x42007800, 0x0010b20f, 0x503c7800, 0x4a007802, 0x00000100, 0x42007800, - 0x0010b0e4, 0x583c0000, 0x84000552, 0x48007800, + 0x0010b364, 0x583c0000, 0x84000552, 0x48007800, 0x583c100c, 0x480bc857, 0x80081000, 0x4808780c, 0x583c180b, 0x800c19c0, 0x05000013, 0x90080503, 0x05020011, 0x583c0007, 0x4803c857, 0x583c2008, 0x4813c857, 0x80102000, 0x80100580, 0x05020002, 0x41782000, 0x48107808, 0x400c0000, 0x80080580, 0x05020005, 0x4978780c, 0x60041800, 0x60a01100, - 0x0511fdaa, 0x1c01f000, 0x42007800, 0x0010b0e4, + 0x0511fe75, 0x1c01f000, 0x42007800, 0x0010b364, 0x4d2c0000, 0x4c5c0000, 0x4c600000, 0x4030b800, 0x583cc000, 0x4a00b802, 0x00000100, 0x583c2015, 0x80100800, 0x583c0013, 0x80040580, 0x05020003, 0x8460c554, 0x41780800, 0x48047815, 0x8c600502, 0x05f80a83, 0x8460c502, 0x48607800, 0x42000000, - 0x0010af90, 0x50000000, 0x80300580, 0x05fa0a7c, + 0x0010b210, 0x50000000, 0x80300580, 0x05fa0a7c, 0x583c081e, 0x800409c0, 0x05000008, 0x583c001f, 0x80040580, 0x05020005, 0x4978781f, 0x60081800, - 0x60a01100, 0x0511fd85, 0x8c600508, 0x050a0e21, + 0x60a01100, 0x0511fe50, 0x8c600508, 0x050a0ec7, 0x5c00c000, 0x5c00b800, 0x5c025800, 0x1c01f000, 0x4d2c0000, 0x4c5c0000, 0x4c600000, 0x4c640000, - 0x42000800, 0x0010af90, 0x50065800, 0x4a025808, - 0x00100f5a, 0x6000c008, 0x4200b800, 0x0010b0e4, - 0x585cc800, 0x4867c857, 0x8d0c052a, 0x05020011, + 0x42000800, 0x0010b210, 0x50065800, 0x4a025808, + 0x00100f5a, 0x6000c002, 0x4200b800, 0x0010b364, + 0x585cc800, 0x4867c857, 0x8d0c052a, 0x0502000f, 0x40ee5800, 0x492fc857, 0x4a025802, 0x00000100, 0x585c0014, 0x80000000, 0x90000503, 0x4800b814, - 0x4a025808, 0x001025a0, 0x585cc017, 0x8260c500, - 0x000000ff, 0x05f80a4e, 0x8060c0c4, 0x4863c857, - 0x4c580000, 0x61e8b001, 0x8058b040, 0x05f80a48, - 0x8c640502, 0x0500000b, 0x8d0c052a, 0x05fa0a44, - 0x4c580000, 0x4c600000, 0x0001f9ab, 0x585cc800, - 0x5c00c000, 0x5c00b000, 0x485bc857, 0x05fdf7f3, - 0x5c00b000, 0x4200b800, 0x0010b0e4, 0x8464cd42, - 0x4864b800, 0x592c0002, 0x90000580, 0x05f80a34, - 0x585c100d, 0x585c0014, 0x585c0818, 0x4978b818, - 0x80000040, 0x05000005, 0x82040400, 0x00000100, - 0x4800b818, 0x80081400, 0x492fc857, 0x480bc857, - 0x4863c857, 0x480a5803, 0x585c001d, 0x4803c857, - 0x585c180e, 0x800c1400, 0x480a5806, 0x4808b81b, - 0x80600400, 0x4800b81d, 0x4803c857, 0x800c0400, - 0x4800b819, 0x585c0810, 0x4807c857, 0x4803c857, - 0x80040d80, 0x05020004, 0x4978b81d, 0x585c080e, - 0x4804b819, 0x585c080e, 0x80040580, 0x82000500, - 0x000003ff, 0x05020004, 0x585c001f, 0x80000000, - 0x4800b81f, 0x585c080f, 0x48065807, 0x4807c857, - 0x64025801, 0x48625805, 0x412c1000, 0x0001f81c, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c025800, - 0x1c01f000, 0x6483c800, 0x0545ff9b, 0x59e40000, - 0x1c01f000, 0x60001020, 0x80081040, 0x05000022, - 0x0549f8c5, 0x05fc07fd, 0x59800801, 0x82040d00, - 0xfff006ff, 0x82040d40, 0x000ff900, 0x48070001, - 0x59e00002, 0x8c00051e, 0x05020016, 0x605c00f4, - 0x50001000, 0x82081500, 0x03f00000, 0x82080580, - 0x00800000, 0x0500000f, 0x61901000, 0x80081040, - 0x0500000c, 0x59800881, 0x8c040514, 0x05fc07fc, - 0x82040500, 0x00000180, 0x82000580, 0x00000180, - 0x05020004, 0x59800080, 0x84000540, 0x48030080, - 0x90000541, 0x64030000, 0x1c01f000, 0x0549f8a2, - 0x59800802, 0x4807c857, 0x8c040520, 0x05000007, - 0x64030000, 0x60101020, 0x50080000, 0x8400054c, - 0x44001000, 0x0501f000, 0x82040500, 0x00001084, - 0x05fa09c7, 0x8c040510, 0x05000006, 0x42000000, - 0x0010b0e2, 0x0545ff68, 0x4a030002, 0x00000100, - 0x8c040522, 0x0500002d, 0x59e00002, 0x8c00051e, - 0x0502002a, 0x601c20f6, 0x50102800, 0x4817c857, - 0x605c00f4, 0x50003000, 0x82180500, 0x000f0000, - 0x40003800, 0x40144000, 0x821c0580, 0x00020000, - 0x05020002, 0x902041c0, 0x8c18050c, 0x05000002, - 0x842041c0, 0x82204500, 0x000000ff, 0x90204401, - 0x8c200510, 0x05000005, 0x42000000, 0x0010b0e3, - 0x0545ff49, 0x61fc4001, 0x42001800, 0xffffff00, - 0x8c18050c, 0x05000003, 0x840c19c0, 0x842041c0, - 0x821c0580, 0x00020000, 0x05020003, 0x900c19c0, - 0x902041c0, 0x800c0505, 0x80200540, 0x44002000, - 0x4a030002, 0x00020000, 0x64030000, 0x1c01f000, - 0x4d2c0000, 0x64007000, 0x82040d00, 0x43200f80, - 0x05fa098b, 0x58380008, 0x4803c00f, 0x4a0370e4, - 0x00003000, 0x0539ff38, 0x583a5807, 0x592c0000, - 0x48007007, 0x800001c0, 0x05020002, 0x49787006, - 0x05f9fd1c, 0x5c025800, 0x42007000, 0x00020d9f, - 0x0001f031, 0x4803c856, 0x4c3c0000, 0x4d2c0000, - 0x4d300000, 0x58300009, 0x80025d40, 0x05f80974, - 0x592e6009, 0x4c300000, 0x0539ff3d, 0x5c006000, - 0x05f8096f, 0x58300002, 0x82000580, 0x00000100, - 0x0502000d, 0x5930780d, 0x583c0001, 0x80007d40, - 0x0500000b, 0x4802600d, 0x90000402, 0x48006003, - 0x583c0000, 0x48006005, 0x40301000, 0x0001f81c, - 0x0501f008, 0x640a5a07, 0x492fc857, 0x4c300000, - 0x0001fb5b, 0x5c025800, 0x05f9fcf6, 0x0005fc5a, - 0x5c026000, 0x5c025800, 0x5c007800, 0x1c01f000, - 0x4803c856, 0x4d2c0000, 0x4d300000, 0x42007000, - 0x00020d9f, 0x58380800, 0x90040582, 0x05020010, - 0x58386001, 0x58300009, 0x812c0580, 0x0502000c, - 0x59e00004, 0x8c00050e, 0x05fc07fe, 0x59dc0006, - 0x4803c857, 0x4a03b805, 0x20000000, 0x8c00053e, - 0x05fc07f8, 0x64007000, 0x0501f018, 0x58386005, - 0x40305000, 0x803061c0, 0x05f80939, 0x58300009, - 0x812c0580, 0x05000004, 0x40305000, 0x58306000, - 0x05fdf7f9, 0x40280000, 0x80300580, 0x58300000, - 0x05000006, 0x48005000, 0x800001c0, 0x05020007, - 0x48287004, 0x0501f005, 0x800001c0, 0x05020002, - 0x48007004, 0x48007005, 0x40325800, 0x05f9fcc1, - 0x5c026000, 0x5c025800, 0x0001f02b, 0x59300025, - 0x48025811, 0x59300026, 0x48025812, 0x59300a23, - 0x8c04050c, 0x05020007, 0x59300020, 0x59300a21, - 0x800408e0, 0x80040540, 0x5930081f, 0x0501f006, - 0x59300820, 0x59300221, 0x800408e0, 0x80040d40, - 0x5930001f, 0x9c0001c0, 0x9c0409c0, 0x48025813, - 0x48065814, 0x1c01f000, 0x592c0001, 0x80003540, - 0x05f80907, 0x58180a05, 0x82040d00, 0x000000ff, - 0xb004058a, 0x05fa0902, 0x592c1012, 0x592c1a13, - 0x58182206, 0x592c2c13, 0x592c0014, 0x800000e0, - 0x80142d40, 0x592c0014, 0x80003920, 0x58184406, - 0x58180207, 0x8c20050e, 0x05fa08f5, 0x800048e0, - 0x80244d40, 0x58180008, 0x4802602c, 0x8c20050c, - 0x05020009, 0x901c51c0, 0x841401c0, 0x82003d00, - 0x0000ffff, 0x80140120, 0x80280540, 0x9c0029c0, - 0x0501f003, 0x9c1429c0, 0x841c39c0, 0x480a601f, - 0x480e6020, 0x48126421, 0x48126221, 0x48166022, - 0x481e6423, 0x48226223, 0x48266024, 0x1c01f000, - 0x4c5c0000, 0x592c0001, 0x80006540, 0x05f808d8, - 0x58300a05, 0x82040d00, 0x000000ff, 0xb004058a, - 0x05fa08d3, 0x58302c06, 0x8c140506, 0x58300206, - 0x05000002, 0x80080400, 0x48026421, 0x48026221, - 0x58300207, 0x800008e0, 0x80040540, 0x48026024, - 0x8c14050a, 0x05020004, 0x592c0012, 0x80080400, - 0x4802601f, 0x58303207, 0x8c140510, 0x0502000c, - 0x90142d03, 0x90140582, 0x0500000e, 0x90140581, - 0x05000007, 0x40080800, 0x90180408, 0x40001000, - 0x0525fbe8, 0x40042000, 0x0501f006, 0x40080800, - 0x40181000, 0x4004b800, 0x0525fbe2, 0x40042000, - 0x4c100000, 0x05fdfd83, 0x05f808ad, 0x5c002000, - 0x50200000, 0x80004540, 0x0500005e, 0x58300a05, - 0x82040d00, 0x000000ff, 0xb004058a, 0x05020006, - 0x80204000, 0x58300406, 0x8c000510, 0x05000002, - 0x80204000, 0x50200000, 0x80000540, 0x0500000b, - 0x80301400, 0x58080002, 0x80102480, 0x0500101d, - 0x801021c0, 0x05000009, 0x80285040, 0x05000049, - 0x80204000, 0x05fdf7f4, 0x58300001, 0x80006540, - 0x05000044, 0x05fdf7df, 0x80285040, 0x05000041, - 0x80204000, 0x50200000, 0x80000540, 0x05020009, - 0x58300001, 0x80006540, 0x0500003a, 0x58300205, - 0x90004d0f, 0x82244400, 0x00100e26, 0x50204000, - 0x592c0209, 0x8400051e, 0x48025a09, 0x0501f010, - 0x80102080, 0x80102000, 0x48126012, 0x4813c857, - 0x58080802, 0x40100000, 0x80042480, 0x05f81874, - 0x58080000, 0x80102400, 0x48126010, 0x4813c857, - 0x592c0209, 0x8400055e, 0x48025a09, 0x59300008, - 0x8400052c, 0x48026008, 0x592c1001, 0x58080406, - 0x90000503, 0x90000581, 0x05020012, 0x599c0019, - 0x8c00050c, 0x0502000f, 0x90280581, 0x05020003, - 0x59300812, 0x0501f007, 0x80280840, 0x58080207, - 0x40001000, 0x0525fb8b, 0x59300012, 0x80040c00, - 0x48066013, 0x59300008, 0x8400056c, 0x48026008, - 0x592c1001, 0x58080406, 0x8c000510, 0x05000003, - 0x0501f822, 0x05000003, 0x80000580, 0x0501f002, - 0x90000541, 0x5c00b800, 0x1c01f000, 0x592c6801, - 0x803469c0, 0x05000017, 0x58347802, 0x58347406, - 0x90380503, 0x8c380510, 0x0c020006, 0x0c01f001, - 0x001011bb, 0x001011b8, 0x001011be, 0x001011c0, - 0x001011c0, 0x001011c0, 0x001011bb, 0x001011bb, - 0x803c00c6, 0x80102400, 0x0501f004, 0x803c00c6, - 0x80102480, 0x05001003, 0x80000580, 0x1c01f000, - 0x90000541, 0x1c01f000, 0x4c040000, 0x4c080000, - 0x4c600000, 0x592c0205, 0x82000500, 0x000000ff, - 0xb00005a8, 0x05000007, 0x90000582, 0x05000005, - 0x90000598, 0x05000003, 0x90000588, 0x05020037, - 0x592c6801, 0x803469c0, 0x05000034, 0x58340205, - 0x82000500, 0x000000ff, 0xb000058a, 0x0502002f, - 0x5834740a, 0x592cc208, 0x40380000, 0x8060c480, - 0x42007800, 0x00100e1f, 0x0501f82a, 0x05fe07ff, - 0x40607000, 0x503c0000, 0x80341400, 0x805c00c6, - 0x58088002, 0x80408480, 0x0500101b, 0x0500001a, - 0x58088800, 0x80448c00, 0x58089001, 0x90489440, - 0x59300827, 0x800409c0, 0x05000018, 0x4844080a, - 0x4848080b, 0x4840080c, 0x49780809, 0x80380040, - 0x05000003, 0x05020813, 0x48380809, 0x59300827, - 0x48340807, 0x483c0808, 0x503c0000, 0x48000806, - 0x90000541, 0x5c00c000, 0x5c001000, 0x5c000800, - 0x1c01f000, 0x58088002, 0x80400106, 0x805cbc80, - 0x0501f804, 0x05fe07dc, 0x80000580, 0x05fdf7f6, - 0x4803c856, 0x803c7800, 0x503c0000, 0x80000540, - 0x05000003, 0x80387040, 0x1c01f000, 0x58340001, - 0x80006d40, 0x0500000a, 0x58340205, 0x9000050f, - 0x82000400, 0x00100e26, 0x50007800, 0x803c79c0, - 0x05f40fd7, 0x80387040, 0x1c01f000, 0x40007000, - 0x1c01f000, 0x802850c6, 0x59306827, 0x58340006, - 0x58341007, 0x58341808, 0x58342009, 0x5834480d, - 0x80087c00, 0x583c0002, 0x80284480, 0x0500100f, - 0x80102040, 0x0500001f, 0x80244c80, 0x0500001d, - 0x40205000, 0x800c1800, 0x500c0000, 0x80000d40, - 0x05fe07f4, 0x58081001, 0x42001800, 0x00100e1d, - 0x60180000, 0x05fdf7ef, 0x80204080, 0x80204000, - 0x48106809, 0x583c0000, 0x80282c00, 0x583c3001, - 0x90183440, 0x500c0800, 0x48046806, 0x48086807, - 0x480c6808, 0x48106809, 0x4814680a, 0x4818680b, - 0x4820680c, 0x4824680d, 0x80000580, 0x1c01f000, - 0x90000541, 0x1c01f000, 0x4d2c0000, 0x0001f813, - 0x05f40fa3, 0x412c1000, 0x5c025800, 0x4a001008, - 0x000201c0, 0x90080409, 0x48001003, 0x0001f1b6, - 0x4d2c0000, 0x40325800, 0x05f9fb37, 0x5c025800, - 0x1c01f000, 0x4807c857, 0x05f5ff95, 0x42001000, - 0x0010cfad, 0x4a001003, 0x0010cfb6, 0x4a001008, - 0x000201c0, 0x49781009, 0x1c01f000, 0x59e00017, - 0x8c000500, 0x1c01f000, 0x0001f9c9, 0x4d040000, - 0x4c640000, 0x4c600000, 0x40120800, 0x400cc800, - 0x4014c000, 0x0501f021, 0x4803c856, 0x42000800, - 0x4fffffff, 0x46000800, 0x00002bad, 0x50040000, - 0x0501f000, 0x59e00017, 0x8c00050c, 0x05020005, - 0x59a8086a, 0x58040003, 0x8c000500, 0x0500000d, - 0x4c080000, 0x59a81069, 0x50080000, 0x84000542, - 0x44001000, 0x5c001000, 0x59e00017, 0x8c00050c, - 0x05fe07fe, 0x58040003, 0x8c000500, 0x05fe07fb, - 0x4d040000, 0x4c640000, 0x4c600000, 0x5804c800, - 0x58060801, 0x5804c002, 0x4a03b805, 0x20000000, - 0x59dc0006, 0x4a03b805, 0x30000000, 0x59dc0006, - 0x4a03b805, 0x70000000, 0x59dc0006, 0x4867b800, - 0x4907b801, 0x6413b802, 0x601c00e2, 0x44600000, - 0x4a03b805, 0x30000000, 0x59dc0006, 0x4a03b805, - 0x10000003, 0x59dc0006, 0x8c00053e, 0x05fc07fe, - 0x4a03b805, 0x20000000, 0x59dc0006, 0x5c00c000, - 0x5c00c800, 0x5c020800, 0x1c01f000, 0x4803c856, - 0x0545fe1a, 0x0001f1d2, 0x4803c856, 0x60f00800, - 0x48079000, 0x59c80000, 0x80040500, 0x05fe07fe, - 0x497b9005, 0x4a039035, 0x00880400, 0x59a8000d, - 0x800000e0, 0x4803900e, 0x64c39011, 0x4a03900f, - 0x001102e4, 0x4a039010, 0x001102e4, 0x65db9015, - 0x4a039003, 0x00001f07, 0x6503900d, 0x4a039000, - 0x00001600, 0x1c01f000, 0x59c80007, 0x8c000508, - 0x05020885, 0x59c80800, 0x8c040516, 0x05020003, - 0x90000506, 0x0c01f004, 0x4807c857, 0x9000050e, - 0x0c01f001, 0x001012e2, 0x001012e1, 0x0010534b, - 0x001012e1, 0x001012e4, 0x001012e1, 0x001012e4, - 0x001012e4, 0x001012e1, 0x001012e1, 0x001012e1, - 0x001012e1, 0x001012e4, 0x001012e1, 0x001012e4, - 0x001012e1, 0x05f5ff0e, 0x4803c857, 0x1c01f000, - 0x59c8080c, 0x4807c857, 0x82040500, 0x00006000, - 0x05000003, 0x0545fc67, 0x0501f005, 0x82040500, - 0x007f0000, 0x05000004, 0x0545fc34, 0x0525ffbc, - 0x0501f02c, 0x90040514, 0x0500000d, 0x0545fc8c, - 0x916c0583, 0x05000008, 0x0519ff37, 0x05000003, - 0x0515fa3d, 0x0501f004, 0x64075014, 0x6006d800, - 0x0519feaf, 0x0501f820, 0x0501f01e, 0x82040500, - 0x00001c00, 0x05000004, 0x0545fc5c, 0x0501f81a, - 0x0501f018, 0x82040500, 0x00000140, 0x05000004, - 0x0545fc69, 0x0501f814, 0x0501f012, 0x82040500, - 0x00008000, 0x0500000f, 0x0519ff1f, 0x0500000b, - 0x59c400a4, 0x9000050f, 0x9000058b, 0x05020007, - 0x4c040000, 0x0515fa37, 0x60780000, 0x80000040, - 0x05fe07ff, 0x5c000800, 0x0545fc2f, 0x0501f802, - 0x1c01f000, 0x4c0c0000, 0x4c100000, 0x4c140000, - 0x05fdf8eb, 0x5c002800, 0x5c002000, 0x5c001800, - 0x1c01f000, 0x4803c856, 0x59a80804, 0x59a80020, - 0x82000500, 0xfffff000, 0x80040540, 0x48035020, - 0x59a80024, 0x82000500, 0xfffff000, 0x80040540, - 0x48035024, 0x59a80028, 0x82000500, 0xfffff000, - 0x80040540, 0x48035028, 0x48078882, 0x82040480, - 0x00000204, 0x05021004, 0x42001000, 0x00240f04, - 0x0501f00f, 0x82040480, 0x00000404, 0x05021004, - 0x42001000, 0x00440800, 0x0501f009, 0x82040480, - 0x00000804, 0x05021004, 0x42001000, 0x00840410, - 0x0501f003, 0x42001000, 0x00880400, 0x480b9035, - 0x0501f33d, 0x59c80815, 0x05f5fe97, 0x40680800, - 0xb0040d3c, 0x48079000, 0x59c80000, 0x80040500, - 0x05fe07fe, 0x8c040504, 0x0500001b, 0x59c80035, - 0x48039035, 0x59a8008a, 0x80000540, 0x05000016, - 0x4c300000, 0x600060de, 0x58300801, 0x82040d00, - 0xffc00000, 0x8004090c, 0x58300000, 0x90000541, - 0x48006000, 0x58300000, 0x8c000500, 0x05fe07fe, - 0x82000500, 0xfc00ffff, 0x80040540, 0x84000574, - 0x48006000, 0x58300000, 0x8c000534, 0x05fe07fe, - 0x5c006000, 0x59c80000, 0x82000540, 0x00001200, - 0x48039000, 0x1c01f000, 0x42006000, 0x7ff4c000, - 0x58300003, 0x8c000502, 0x0502000a, 0x600060de, - 0x64686000, 0x58300000, 0x8c000504, 0x05fe07fe, - 0x641c6002, 0x59a8008a, 0x84000540, 0x4803508a, - 0x1c01f000, 0x600060de, 0x58300801, 0x9004050c, - 0x05f60e67, 0x60f00800, 0x05fdf7c6, 0x4853c857, - 0x497b8801, 0x850e1d1a, 0x5050b000, 0x485bc857, - 0x8058b1c0, 0x0500089d, 0x82580480, 0x00000804, - 0x0502189a, 0x60040000, 0x61000801, 0x0501fd82, - 0x40582000, 0x8050a000, 0x50500000, 0x80102400, - 0x9058b483, 0x8050a000, 0x485bc857, 0x4853c857, - 0x50501000, 0x80082404, 0x60101800, 0x82080500, - 0x000000ff, 0x61000821, 0x0501fd73, 0x80081110, - 0x800c1840, 0x05fe07fa, 0x8050a000, 0x8058b040, - 0x05fe07f4, 0x4803c856, 0x41780000, 0x61000801, - 0x0501fd69, 0x50501000, 0x80082404, 0x0502087b, - 0x4803c856, 0x1c01f000, 0x4a035048, 0xaabbccdd, - 0x600c0000, 0x0501fcbc, 0x600c0000, 0x0501fce4, - 0x60300868, 0x0501fd54, 0x90040541, 0x60300868, - 0x0501fd59, 0x60480888, 0x0501fd4f, 0x90040548, - 0x60480888, 0x0501fd54, 0x60180818, 0x0501fd4a, - 0x82040540, 0x00000080, 0x60180818, 0x0501fd4e, - 0x60480828, 0x0501fd44, 0x90040541, 0x60480828, - 0x0501fd49, 0x59a8004f, 0x8c00050e, 0x05000006, - 0x4803c857, 0x82000500, 0x0000ff00, 0x80000110, - 0x0501f002, 0x60e00001, 0x60300800, 0x0501fd3e, - 0x60380940, 0x0501fd34, 0x82040500, 0xffffff0f, - 0x0501ff0c, 0x05020003, 0x90000540, 0x0501f002, - 0x90000550, 0x60380940, 0x0501fd33, 0x60380938, - 0x0501fd29, 0x90040550, 0x60380938, 0x0501fd2e, - 0x60800000, 0x61000859, 0x0501fd2b, 0x61000000, - 0x61000851, 0x0501fd28, 0x60300000, 0x61800861, - 0x0501fd25, 0x60840000, 0x61800821, 0x0501fd22, - 0x59c40001, 0x84000574, 0x48038801, 0x850e1d5a, - 0x61602004, 0x6029d000, 0x0501f83c, 0x4813c857, - 0x61000849, 0x0501fd10, 0x4807c857, 0x82041500, - 0x000000c0, 0x82081580, 0x000000c0, 0x05000004, - 0x80102040, 0x05000825, 0x05fdf7f3, 0x4803c856, - 0x60c82000, 0x6029d000, 0x0501f82c, 0x60380878, - 0x0501fd01, 0x90040d01, 0x05020004, 0x80102040, - 0x0500081a, 0x05fdf7f8, 0x4803c856, 0x61702001, - 0x6029d000, 0x0525f866, 0x60380818, 0x0501fcf6, - 0x90040d10, 0x05020004, 0x80102040, 0x05f40dd0, - 0x05fdf7f8, 0x4803c856, 0x60a02000, 0x6029d000, - 0x0525f85b, 0x603808b8, 0x0501fceb, 0x90040d04, - 0x05000004, 0x80102040, 0x05f40dc5, 0x05fdf7f8, - 0x4803c856, 0x1c01f000, 0x4803c856, 0x4a03c020, - 0x00004010, 0x4a03c011, 0x40100011, 0x05006000, - 0x4203e000, 0x40000000, 0x4203e000, 0x30000001, - 0x4803c856, 0x0501f000, 0x61201801, 0x800c1840, - 0x05fe07ff, 0x80e9d040, 0x05fe07fc, 0x1c01f000, - 0x4803c856, 0x497b88a9, 0x64078807, 0x497b8807, - 0x59c40005, 0x48038805, 0x0501fdef, 0x0501fe32, - 0x0501f9e6, 0x4a0388a7, 0x0000f7f7, 0x4a0388a3, - 0x8000403c, 0x4a0388ae, 0x000061a8, 0x59c40001, - 0x82000540, 0x185fa063, 0x48038801, 0x4a038810, - 0x00410108, 0x4a038811, 0x00520608, 0x4a038812, - 0x00450320, 0x4a038813, 0x00440405, 0x4a03881c, - 0x004132e1, 0x4a038850, 0x80000108, 0x64238860, - 0x64238870, 0x4a038851, 0x80000508, 0x4a038861, - 0x00800000, 0x4a038871, 0x00800000, 0x4a038852, - 0x80000708, 0x4a038862, 0x00800000, 0x4a038872, - 0x00800000, 0x4a038853, 0x80000608, 0x497b8863, - 0x4a038873, 0x00800000, 0x4a038882, 0x00000840, - 0x4a0388a5, 0x000000fe, 0x647b88a6, 0x4a0388b0, - 0x00007530, 0x4a038802, 0x0000ffff, 0x4a038806, - 0xc0e80b00, 0x1c01f000, 0x850e1d4e, 0x1c01f000, - 0x59c40805, 0x59c40006, 0x80040d00, 0x05f40d6c, - 0x82040500, 0x00e80b00, 0x05020004, 0x8c04053e, - 0x050208c4, 0x0501f005, 0x82040500, 0x00880b00, - 0x05f60d59, 0x05f5fd62, 0x4c5c0000, 0x4c600000, - 0x59c4b805, 0x59c410a3, 0x84081518, 0x825c0500, - 0x04000000, 0x05020d6e, 0x59c40006, 0x8c000500, - 0x05000003, 0x8c5c0500, 0x0502007f, 0x485fc857, - 0x0519fd91, 0x0500001a, 0x59c40005, 0x82000500, - 0x000000c0, 0x05000042, 0x0519fdac, 0x05020040, - 0x59c40006, 0x82000500, 0x000000f0, 0x05020004, - 0x4a038805, 0x000000c0, 0x0501f039, 0x59a80015, - 0x84000506, 0x48035015, 0x42006000, 0xff203fff, - 0x42006800, 0x40000000, 0x0515f9db, 0x60400800, - 0x42001000, 0x00103dfd, 0x0521ffc0, 0x8c5c0534, - 0x0502002b, 0x4a035013, 0x0000aaaa, 0x59c40005, - 0x8c00050c, 0x0502000f, 0x8c00050e, 0x05020015, - 0x8c00050a, 0x0502001b, 0x8c000508, 0x05000008, - 0x59a80011, 0x90000589, 0x05020005, 0x42000000, - 0x0010afab, 0x0545facc, 0x0519ff21, 0x0501f04c, - 0x42000000, 0x0010afb9, 0x0545fac7, 0x41781800, - 0x60042000, 0x0501fd26, 0x64035014, 0x0501f00e, - 0x42000000, 0x0010afba, 0x0545fabf, 0x41781800, - 0x60082000, 0x0501fd1e, 0x640b5014, 0x0501f006, - 0x42000000, 0x0010afad, 0x0545fab7, 0x0519feb2, - 0x0501f037, 0x0519ff5e, 0x0501f035, 0x8c5c0534, - 0x05000031, 0x59c40005, 0x8c00053a, 0x05020004, - 0x42000000, 0x0010afa1, 0x0545faab, 0x4a038805, - 0x20000000, 0x0519fd40, 0x0502000e, 0x4a038805, - 0x04000000, 0x59c418a8, 0x60002000, 0x0501fd04, - 0x0519fd4f, 0x05020005, 0x64075014, 0x6006d800, - 0x0519fcb3, 0x0501f050, 0x41780000, 0x0519fd06, - 0x0501fcf4, 0x4000c000, 0x0501fc3a, 0x916c1584, - 0x0502000b, 0x8c5c0500, 0x05020013, 0x8d0c0506, - 0x05020004, 0x59c410a3, 0x90081548, 0x480b88a3, - 0x59c41006, 0x84081540, 0x480b8806, 0x4a038805, - 0x04000000, 0x6006d800, 0x497b5010, 0x8d0c0518, - 0x05020004, 0x4803c856, 0x850e1d06, 0x0515f83e, - 0x0511fadb, 0x8c5c053c, 0x0502084f, 0x8c5c0500, - 0x0500002e, 0x42000000, 0x0010b0be, 0x0545fa7a, - 0x64078805, 0x6148b006, 0x6191d000, 0x4c580000, - 0x0521ff5f, 0x0501fbb1, 0x5c00b000, 0x05000004, - 0x8058b040, 0x05fe07f9, 0x0501f003, 0x64078805, - 0x0501f01e, 0x59c40006, 0x84000500, 0x48038806, - 0x0525fda5, 0x497b8880, 0x0501fdbe, 0x05000007, - 0x59e00013, 0x8c000516, 0x05000004, 0x60142000, - 0x0519ff4b, 0x0501f003, 0x60182000, 0x0519ff48, - 0x59c400a3, 0x82000500, 0xfcf8ffff, 0x480388a3, - 0x640b5075, 0x6012d800, 0x64078805, 0x05f5fecb, - 0x0501fb2b, 0x497b503a, 0x64075047, 0x497b5070, - 0x0201f800, 0x0010fada, 0x825cbd00, 0xbbfffffe, - 0x485f8805, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x4d180000, 0x59c41004, 0x480bc857, 0x8c080500, - 0x05000006, 0x4803c856, 0x4a01a8e5, 0x00000800, - 0x0525fe2a, 0x0501f007, 0x82080500, 0x000001f0, - 0x05000004, 0x4803c856, 0x0525ff4f, 0x05260e42, - 0x4a038805, 0x80000000, 0x5c023000, 0x1c01f000, - 0x59c408a3, 0x4807c857, 0x84040d40, 0x480788a3, - 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x4cd80000, 0x4a038805, 0x40000000, - 0x42000000, 0x0010afb3, 0x0545fa27, 0x0525fa0e, - 0x59c41004, 0x8c080500, 0x05000040, 0x598e600b, - 0x4a01a8e5, 0x00000800, 0x813261c0, 0x05000024, - 0x59300403, 0x900005b2, 0x05020021, 0x5930001e, - 0x48038833, 0x4a038807, 0x00018000, 0x6009d000, - 0x0521feff, 0x497b8807, 0x6009d000, 0x0521fefc, - 0x0525fc90, 0x60c1d0ea, 0x0521fef9, 0x59c408a4, - 0x90040d0f, 0x90040d80, 0x05000004, 0x42000000, - 0x00200000, 0x0501fb91, 0x0525f944, 0x59300009, - 0x80000540, 0x05f40c5e, 0x40025800, 0x4a025a05, - 0x00000103, 0x5931d82d, 0x58ef400a, 0x58ec0008, - 0x0801f800, 0x0005fc5a, 0x0501f032, 0x598c000d, - 0x82001c80, 0x000000c8, 0x0502100c, 0x80000000, - 0x4803180d, 0x59c400a4, 0x9000050f, 0x90000582, - 0x05020004, 0x42000000, 0x00200000, 0x0501fb77, - 0x0521fe7a, 0x0501f023, 0x4933c857, 0x0525fc69, - 0x813261c0, 0x0500001f, 0x64066203, 0x609e7000, - 0x0005fc78, 0x0501f01b, 0x0525fef7, 0x05000019, - 0x0525ff1e, 0x0521fe96, 0x59926005, 0x813261c0, - 0x0500000d, 0x61201801, 0x0525fee6, 0x0502000a, - 0x59c400a4, 0x9000050f, 0x90000582, 0x05020004, - 0x42000000, 0x00200000, 0x0501fb5c, 0x0521fe65, - 0x0501f008, 0x4933c857, 0x0525fbf5, 0x813261c0, - 0x05000004, 0x613e7000, 0x640e6203, 0x0005fc78, - 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, - 0x5c032000, 0x0525f198, 0x40680000, 0x810c0d80, - 0x8c04050e, 0x05000051, 0x4803c857, 0x8d0c050e, - 0x0500001f, 0x850e1d0e, 0x497b5075, 0x42000000, - 0x0010af9a, 0x0545f9b8, 0x0545fa64, 0x60441100, - 0x59c40001, 0x82000500, 0x00018000, 0x90001d80, - 0x0500000b, 0x82001d80, 0x00008000, 0x0500000a, - 0x82001d80, 0x00010000, 0x05000009, 0x82001d80, - 0x00018000, 0x05000008, 0x05f5fc01, 0x60001800, - 0x0501f006, 0x60041800, 0x0501f004, 0x600c1800, - 0x0501f002, 0x60101800, 0x050df70c, 0x850e1d4e, - 0x59a80875, 0x800409c0, 0x05020006, 0x59c4000d, - 0x8c000520, 0x05000003, 0x600c1800, 0x0501f002, - 0x40041800, 0x0545fa29, 0x4c0c0000, 0x41782000, - 0x0501fce8, 0x0500000f, 0x0501fcca, 0x60042000, - 0x0502000c, 0x0501fcd5, 0x05020006, 0x60082000, - 0x0501f8c2, 0x05020007, 0x60102000, 0x0501f005, - 0x600c2000, 0x0501f89c, 0x05020002, 0x60142000, - 0x5c001800, 0x60481100, 0x050dfeec, 0x05f5fdf3, - 0x0545fa8d, 0x0502000d, 0x4d200000, 0x61fe4001, - 0x0501f84f, 0x5c024000, 0x4d400000, 0x4d3c0000, - 0x60a28000, 0x60227800, 0x0201f800, 0x0010ebe6, - 0x5c027800, 0x5c028000, 0x1c01f000, 0x4803c857, - 0x82000400, 0x00102013, 0x50000800, 0x82040d00, - 0x000000ff, 0x1c01f000, 0x4803c856, 0x4c580000, - 0x6040b000, 0x497b88ac, 0x497b88ad, 0x8058b040, - 0x05fe07fe, 0x5c00b000, 0x1c01f000, 0x40680800, - 0x4807c857, 0x80041908, 0x480f88ac, 0x9004250f, - 0x82102400, 0x0010a0cc, 0x50102000, 0x59c400ad, - 0x80100540, 0x480f88ac, 0x480388ad, 0x1c01f000, - 0x4807c857, 0x80041908, 0x480f88ac, 0x9004250f, - 0x82102400, 0x0010a0cc, 0x50102000, 0x59c400ad, - 0x80101500, 0x05000004, 0x80100580, 0x480f88ac, - 0x480388ad, 0x1c01f000, 0x4803c857, 0x4c080000, - 0x4c040000, 0x4c000000, 0x59c40892, 0x4807c857, - 0x80041580, 0x0500000e, 0x80041480, 0x05021006, - 0x80081080, 0x80081000, 0x4008b000, 0x60040004, - 0x0501f003, 0x4008b000, 0x60400004, 0x48038886, - 0x8058b040, 0x05fe07fe, 0x497b8886, 0x5c000000, - 0x5c000800, 0x5c001000, 0x1c01f000, 0x4803c856, - 0x8d0c0520, 0x05000003, 0x60ba8000, 0x0541f232, - 0x1c01f000, 0x0501f803, 0x40058800, 0x1c01f000, - 0x59a8008a, 0x80000540, 0x05000008, 0x0519fbb6, - 0x60280800, 0x0502000e, 0x600008de, 0x58040001, - 0x8000092c, 0x0501f00a, 0x59c80835, 0x82040d00, - 0x00001f00, 0x80040910, 0x80040800, 0x59a8008a, - 0x80000540, 0x05000002, 0x61680804, 0x4807c857, - 0x1c01f000, 0x59a8008a, 0x80000540, 0x0500001c, - 0x599c1a01, 0x60a80801, 0x820c0480, 0x00000204, - 0x0500100a, 0x61680800, 0x820c0480, 0x00000404, - 0x05001006, 0x60b80800, 0x820c0480, 0x00000804, - 0x05001002, 0x60b40800, 0x4c300000, 0x600060de, - 0x58301000, 0x82081500, 0xfc00ffff, 0x800400e0, - 0x80080540, 0x84000574, 0x48006000, 0x58300000, - 0x8c000534, 0x05fe07fe, 0x5c006000, 0x1c01f000, - 0x0501f805, 0x60058800, 0x05000002, 0x60018800, - 0x1c01f000, 0x4c000000, 0x59a8003b, 0x4803c857, - 0x90000580, 0x5c000000, 0x1c01f000, 0x0501f805, - 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, - 0x4c000000, 0x59a8003b, 0x4803c857, 0x90000581, - 0x5c000000, 0x1c01f000, 0x0501f805, 0x60058800, - 0x05000002, 0x60018800, 0x1c01f000, 0x4c000000, - 0x59a8003b, 0x4803c857, 0x90000583, 0x5c000000, + 0x4a025808, 0x00102646, 0x585cc017, 0x8260c500, + 0x000000ff, 0x05f80a4e, 0x4c580000, 0x61e8b001, + 0x8058b040, 0x05f80a4a, 0x8c640502, 0x0500000b, + 0x8d0c052a, 0x05fa0a46, 0x4c580000, 0x4c600000, + 0x0001f9ab, 0x585cc800, 0x5c00c000, 0x5c00b000, + 0x485bc857, 0x05fdf7f3, 0x5c00b000, 0x4200b800, + 0x0010b364, 0x8464cd42, 0x4864b800, 0x592c0002, + 0x90000580, 0x05f80a36, 0x585c100d, 0x585c0018, + 0x80081400, 0x80600400, 0x4800b818, 0x585c0014, + 0x800001c0, 0x05020002, 0x4978b818, 0x8060c0c4, + 0x492fc857, 0x480bc857, 0x4863c857, 0x480a5803, + 0x585c001d, 0x4803c857, 0x585c180e, 0x800c1400, + 0x480a5806, 0x4808b81b, 0x80600400, 0x4800b81d, + 0x4803c857, 0x800c0400, 0x4800b819, 0x585c0810, + 0x4807c857, 0x4803c857, 0x80040d80, 0x05020004, + 0x4978b81d, 0x585c080e, 0x4804b819, 0x585c080e, + 0x80040580, 0x82000500, 0x000003ff, 0x05020004, + 0x585c001f, 0x80000000, 0x4800b81f, 0x585c080f, + 0x48065807, 0x4807c857, 0x64025801, 0x48625805, + 0x412c1000, 0x0001f81c, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x5c025800, 0x1c01f000, 0x6483c800, + 0x0549fa4d, 0x59e40000, 0x1c01f000, 0x60001020, + 0x80081040, 0x05000022, 0x0549fb77, 0x05fc07fd, + 0x59800801, 0x82040d00, 0xfff006ff, 0x82040d40, + 0x000ff900, 0x48070001, 0x59e00002, 0x8c00051e, + 0x05020016, 0x605c00f4, 0x50001000, 0x82081500, + 0x03f00000, 0x82080580, 0x00800000, 0x0500000f, + 0x61901000, 0x80081040, 0x0500000c, 0x59800881, + 0x8c040514, 0x05fc07fc, 0x82040500, 0x00000180, + 0x82000580, 0x00000180, 0x05020004, 0x59800080, + 0x84000540, 0x48030080, 0x90000541, 0x64030000, + 0x1c01f000, 0x0549fb54, 0x59800802, 0x4807c857, + 0x8c040520, 0x05000007, 0x64030000, 0x60101020, + 0x50080000, 0x8400054c, 0x44001000, 0x0501f000, + 0x82040500, 0x00001084, 0x05fa09c9, 0x8c040510, + 0x05000006, 0x42000000, 0x0010b362, 0x0549fa1a, + 0x4a030002, 0x00000100, 0x8c040522, 0x0500002d, + 0x59e00002, 0x8c00051e, 0x0502002a, 0x601c20f6, + 0x50102800, 0x4817c857, 0x605c00f4, 0x50003000, + 0x82180500, 0x000f0000, 0x40003800, 0x40144000, + 0x821c0580, 0x00020000, 0x05020002, 0x902041c0, + 0x8c18050c, 0x05000002, 0x842041c0, 0x82204500, + 0x000000ff, 0x90204401, 0x8c200510, 0x05000005, + 0x42000000, 0x0010b363, 0x0549f9fb, 0x61fc4001, + 0x42001800, 0xffffff00, 0x8c18050c, 0x05000003, + 0x840c19c0, 0x842041c0, 0x821c0580, 0x00020000, + 0x05020003, 0x900c19c0, 0x902041c0, 0x800c0505, + 0x80200540, 0x44002000, 0x4a030002, 0x00020000, + 0x64030000, 0x1c01f000, 0x4d2c0000, 0x64007000, + 0x82040d00, 0x43200f80, 0x05fa098d, 0x58380008, + 0x4803c00f, 0x4a0370e4, 0x00003000, 0x053df91b, + 0x583a5807, 0x592c0000, 0x48007007, 0x800001c0, + 0x05020002, 0x49787006, 0x05f9fd1e, 0x5c025800, + 0x42007000, 0x00020d9f, 0x0001f031, 0x4803c856, + 0x4c3c0000, 0x4d2c0000, 0x4d300000, 0x58300009, + 0x80025d40, 0x05f80976, 0x592e6009, 0x4c300000, + 0x053df920, 0x5c006000, 0x05f80971, 0x58300002, + 0x82000580, 0x00000100, 0x0502000d, 0x5930780d, + 0x583c0001, 0x80007d40, 0x0500000b, 0x4802600d, + 0x90000402, 0x48006003, 0x583c0000, 0x48006005, + 0x40301000, 0x0001f81c, 0x0501f008, 0x640a5a07, + 0x492fc857, 0x4c300000, 0x0001fb5b, 0x5c025800, + 0x05f9fcf8, 0x0005fc5a, 0x5c026000, 0x5c025800, + 0x5c007800, 0x1c01f000, 0x4803c856, 0x4d2c0000, + 0x4d300000, 0x42007000, 0x00020d9f, 0x58380800, + 0x90040582, 0x05020010, 0x58386001, 0x58300009, + 0x812c0580, 0x0502000c, 0x59e00004, 0x8c00050e, + 0x05fc07fe, 0x59dc0006, 0x4803c857, 0x4a03b805, + 0x20000000, 0x8c00053e, 0x05fc07f8, 0x64007000, + 0x0501f018, 0x58386005, 0x40305000, 0x803061c0, + 0x05f8093b, 0x58300009, 0x812c0580, 0x05000004, + 0x40305000, 0x58306000, 0x05fdf7f9, 0x40280000, + 0x80300580, 0x58300000, 0x05000006, 0x48005000, + 0x800001c0, 0x05020007, 0x48287004, 0x0501f005, + 0x800001c0, 0x05020002, 0x48007004, 0x48007005, + 0x40325800, 0x05f9fcc3, 0x5c026000, 0x5c025800, + 0x0001f02b, 0x59300025, 0x48025811, 0x59300026, + 0x48025812, 0x59300a23, 0x8c04050c, 0x05020007, + 0x59300020, 0x59300a21, 0x800408e0, 0x80040540, + 0x5930081f, 0x0501f006, 0x59300820, 0x59300221, + 0x800408e0, 0x80040d40, 0x5930001f, 0x9c0001c0, + 0x9c0409c0, 0x48025813, 0x48065814, 0x1c01f000, + 0x592c0001, 0x80003540, 0x05f80909, 0x58180a05, + 0x82040d00, 0x000000ff, 0xb004058a, 0x05fa0904, + 0x592c1012, 0x592c1a13, 0x58182206, 0x592c2c13, + 0x592c0014, 0x800000e0, 0x80142d40, 0x592c0014, + 0x80003920, 0x58184406, 0x58180207, 0x8c20050e, + 0x05fa08f7, 0x800048e0, 0x80244d40, 0x58180008, + 0x4802602c, 0x8c20050c, 0x05020009, 0x901c51c0, + 0x841401c0, 0x82003d00, 0x0000ffff, 0x80140120, + 0x80280540, 0x9c0029c0, 0x0501f003, 0x9c1429c0, + 0x841c39c0, 0x480a601f, 0x480e6020, 0x48126421, + 0x48126221, 0x48166022, 0x481e6423, 0x48226223, + 0x48266024, 0x1c01f000, 0x4c5c0000, 0x592c0001, + 0x80006540, 0x05f808da, 0x58300a05, 0x82040d00, + 0x000000ff, 0xb004058a, 0x05fa08d5, 0x58302c06, + 0x8c140506, 0x58300206, 0x05000002, 0x80080400, + 0x48026421, 0x48026221, 0x58300207, 0x800008e0, + 0x80040540, 0x48026024, 0x8c14050a, 0x05020004, + 0x592c0012, 0x80080400, 0x4802601f, 0x58303207, + 0x8c140510, 0x0502000c, 0x90142d03, 0x90140582, + 0x0500000e, 0x90140581, 0x05000007, 0x40080800, + 0x90180408, 0x40001000, 0x0525fdac, 0x40042000, + 0x0501f006, 0x40080800, 0x40181000, 0x4004b800, + 0x0525fda6, 0x40042000, 0x4c100000, 0x05fdfd85, + 0x05f808af, 0x5c002000, 0x50200000, 0x80004540, + 0x0500005e, 0x58300a05, 0x82040d00, 0x000000ff, + 0xb004058a, 0x05020006, 0x80204000, 0x58300406, + 0x8c000510, 0x05000002, 0x80204000, 0x50200000, + 0x80000540, 0x0500000b, 0x80301400, 0x58080002, + 0x80102480, 0x0500101d, 0x801021c0, 0x05000009, + 0x80285040, 0x05000049, 0x80204000, 0x05fdf7f4, + 0x58300001, 0x80006540, 0x05000044, 0x05fdf7df, + 0x80285040, 0x05000041, 0x80204000, 0x50200000, + 0x80000540, 0x05020009, 0x58300001, 0x80006540, + 0x0500003a, 0x58300205, 0x90004d0f, 0x82244400, + 0x00100e26, 0x50204000, 0x592c0209, 0x8400051e, + 0x48025a09, 0x0501f010, 0x80102080, 0x80102000, + 0x48126012, 0x4813c857, 0x58080802, 0x40100000, + 0x80042480, 0x05f81876, 0x58080000, 0x80102400, + 0x48126010, 0x4813c857, 0x592c0209, 0x8400055e, + 0x48025a09, 0x59300008, 0x8400052c, 0x48026008, + 0x592c1001, 0x58080406, 0x90000503, 0x90000581, + 0x05020012, 0x599c0019, 0x8c00050c, 0x0502000f, + 0x90280581, 0x05020003, 0x59300812, 0x0501f007, + 0x80280840, 0x58080207, 0x40001000, 0x0525fd4f, + 0x59300012, 0x80040c00, 0x48066013, 0x59300008, + 0x8400056c, 0x48026008, 0x592c1001, 0x58080406, + 0x8c000510, 0x05000003, 0x0501f822, 0x05000003, + 0x80000580, 0x0501f002, 0x90000541, 0x5c00b800, + 0x1c01f000, 0x592c6801, 0x803469c0, 0x05000017, + 0x58347802, 0x58347406, 0x90380503, 0x8c380510, + 0x0c020006, 0x0c01f001, 0x001011b9, 0x001011b6, + 0x001011bc, 0x001011be, 0x001011be, 0x001011be, + 0x001011b9, 0x001011b9, 0x803c00c6, 0x80102400, + 0x0501f004, 0x803c00c6, 0x80102480, 0x05001003, + 0x80000580, 0x1c01f000, 0x90000541, 0x1c01f000, + 0x4c040000, 0x4c080000, 0x4c600000, 0x592c0205, + 0x82000500, 0x000000ff, 0xb00005a8, 0x05000007, + 0x90000582, 0x05000005, 0x90000598, 0x05000003, + 0x90000588, 0x05020037, 0x592c6801, 0x803469c0, + 0x05000034, 0x58340205, 0x82000500, 0x000000ff, + 0xb000058a, 0x0502002f, 0x5834740a, 0x592cc208, + 0x40380000, 0x8060c480, 0x42007800, 0x00100e1f, + 0x0501f82a, 0x05fe07ff, 0x40607000, 0x503c0000, + 0x80341400, 0x805c00c6, 0x58088002, 0x80408480, + 0x0500101b, 0x0500001a, 0x58088800, 0x80448c00, + 0x58089001, 0x90489440, 0x59300827, 0x800409c0, + 0x05000018, 0x4844080a, 0x4848080b, 0x4840080c, + 0x49780809, 0x80380040, 0x05000003, 0x05020813, + 0x48380809, 0x59300827, 0x48340807, 0x483c0808, + 0x503c0000, 0x48000806, 0x90000541, 0x5c00c000, + 0x5c001000, 0x5c000800, 0x1c01f000, 0x58088002, + 0x80400106, 0x805cbc80, 0x0501f804, 0x05fe07dc, + 0x80000580, 0x05fdf7f6, 0x4803c856, 0x803c7800, + 0x503c0000, 0x80000540, 0x05000003, 0x80387040, + 0x1c01f000, 0x58340001, 0x80006d40, 0x0500000a, + 0x58340205, 0x9000050f, 0x82000400, 0x00100e26, + 0x50007800, 0x803c79c0, 0x05f40fd9, 0x80387040, + 0x1c01f000, 0x40007000, 0x1c01f000, 0x802850c6, + 0x59306827, 0x58340006, 0x58341007, 0x58341808, + 0x58342009, 0x5834480d, 0x80087c00, 0x583c0002, + 0x80284480, 0x0500100f, 0x80102040, 0x0500001f, + 0x80244c80, 0x0500001d, 0x40205000, 0x800c1800, + 0x500c0000, 0x80000d40, 0x05fe07f4, 0x58081001, + 0x42001800, 0x00100e1d, 0x60180000, 0x05fdf7ef, + 0x80204080, 0x80204000, 0x48106809, 0x583c0000, + 0x80282c00, 0x583c3001, 0x90183440, 0x500c0800, + 0x48046806, 0x48086807, 0x480c6808, 0x48106809, + 0x4814680a, 0x4818680b, 0x4820680c, 0x4824680d, + 0x80000580, 0x1c01f000, 0x90000541, 0x1c01f000, + 0x4d2c0000, 0x0001f813, 0x05f40fa5, 0x412c1000, + 0x5c025800, 0x4a001008, 0x000201c0, 0x90080409, + 0x48001003, 0x0001f1b6, 0x4d2c0000, 0x40325800, + 0x05f9fb39, 0x5c025800, 0x1c01f000, 0x4807c857, + 0x05f5ff97, 0x42001000, 0x0010d22d, 0x4a001003, + 0x0010d236, 0x4a001008, 0x000201c0, 0x49781009, + 0x1c01f000, 0x59e00017, 0x8c000500, 0x1c01f000, + 0x0001f9c9, 0x4d040000, 0x4c640000, 0x4c600000, + 0x40120800, 0x400cc800, 0x4014c000, 0x0501f021, + 0x4803c856, 0x42000800, 0x4fffffff, 0x46000800, + 0x00002bad, 0x50040000, 0x0501f000, 0x59e00017, + 0x8c00050c, 0x05020005, 0x59a8086a, 0x58040003, + 0x8c000500, 0x0500000d, 0x4c080000, 0x59a81069, + 0x50080000, 0x84000542, 0x44001000, 0x5c001000, + 0x59e00017, 0x8c00050c, 0x05fe07fe, 0x58040003, + 0x8c000500, 0x05fe07fb, 0x4d040000, 0x4c640000, + 0x4c600000, 0x5804c800, 0x58060801, 0x5804c002, + 0x4a03b805, 0x20000000, 0x59dc0006, 0x4a03b805, + 0x30000000, 0x59dc0006, 0x4a03b805, 0x70000000, + 0x59dc0006, 0x4867b800, 0x4907b801, 0x6413b802, + 0x601c00e2, 0x44600000, 0x4a03b805, 0x30000000, + 0x59dc0006, 0x4a03b805, 0x10000003, 0x59dc0006, + 0x8c00053e, 0x05fc07fe, 0x4a03b805, 0x20000000, + 0x59dc0006, 0x5c00c000, 0x5c00c800, 0x5c020800, + 0x1c01f000, 0x4803c856, 0x0549f8cc, 0x0001f1d2, + 0x4803c856, 0x60f00800, 0x48079000, 0x59c80000, + 0x80040500, 0x05fe07fe, 0x497b9005, 0x4a039035, + 0x00880400, 0x59a8000d, 0x800000e0, 0x4803900e, + 0x64c39011, 0x4a03900f, 0x00110514, 0x4a039010, + 0x00110514, 0x65db9015, 0x4a039003, 0x00001f07, + 0x6503900d, 0x4a039000, 0x00001600, 0x1c01f000, + 0x59c80007, 0x8c000508, 0x05020885, 0x59c80800, + 0x8c040516, 0x05020003, 0x90000506, 0x0c01f004, + 0x4807c857, 0x9000050e, 0x0c01f001, 0x001012e0, + 0x001012df, 0x001054c4, 0x001012df, 0x001012e2, + 0x001012df, 0x001012e2, 0x001012e2, 0x001012df, + 0x001012df, 0x001012df, 0x001012df, 0x001012e2, + 0x001012df, 0x001012e2, 0x001012df, 0x05f5ff10, + 0x4803c857, 0x1c01f000, 0x59c8080c, 0x4807c857, + 0x82040500, 0x00006000, 0x05000003, 0x0545ff19, + 0x0501f005, 0x82040500, 0x007f0000, 0x05000004, + 0x0545fee6, 0x0529f980, 0x0501f02c, 0x90040514, + 0x0500000d, 0x0545ff3e, 0x916c0583, 0x05000008, + 0x051df83e, 0x05000003, 0x0515fb12, 0x0501f004, + 0x64075014, 0x6006d800, 0x0519ffb6, 0x0501f820, + 0x0501f01e, 0x82040500, 0x00001c00, 0x05000004, + 0x0545ff0e, 0x0501f81a, 0x0501f018, 0x82040500, + 0x00000140, 0x05000004, 0x0545ff1b, 0x0501f814, + 0x0501f012, 0x82040500, 0x00008000, 0x0500000f, + 0x051df826, 0x0500000b, 0x59c400a4, 0x9000050f, + 0x9000058b, 0x05020007, 0x4c040000, 0x0515fb0c, + 0x60780000, 0x80000040, 0x05fe07ff, 0x5c000800, + 0x0545fee1, 0x0501f802, 0x1c01f000, 0x4c0c0000, + 0x4c100000, 0x4c140000, 0x05fdf8ed, 0x5c002800, + 0x5c002000, 0x5c001800, 0x1c01f000, 0x4803c856, + 0x59a80804, 0x59a80020, 0x82000500, 0xfffff000, + 0x80040540, 0x48035020, 0x59a80024, 0x82000500, + 0xfffff000, 0x80040540, 0x48035024, 0x59a80028, + 0x82000500, 0xfffff000, 0x80040540, 0x48035028, + 0x48078882, 0x82040480, 0x00000204, 0x05021004, + 0x42001000, 0x00240f04, 0x0501f00f, 0x82040480, + 0x00000404, 0x05021004, 0x42001000, 0x00440800, + 0x0501f009, 0x82040480, 0x00000804, 0x05021004, + 0x42001000, 0x00840410, 0x0501f003, 0x42001000, + 0x00880400, 0x480b9035, 0x0501f340, 0x59c80815, + 0x05f5fe99, 0x40680800, 0xb0040d3c, 0x48079000, + 0x59c80000, 0x80040500, 0x05fe07fe, 0x8c040504, + 0x0500001b, 0x59c80035, 0x48039035, 0x59a8008a, + 0x80000540, 0x05000016, 0x4c300000, 0x600060de, + 0x58300801, 0x82040d00, 0xffc00000, 0x8004090c, + 0x58300000, 0x90000541, 0x48006000, 0x58300000, + 0x8c000500, 0x05fe07fe, 0x82000500, 0xfc00ffff, + 0x80040540, 0x84000574, 0x48006000, 0x58300000, + 0x8c000534, 0x05fe07fe, 0x5c006000, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, + 0x42006000, 0x7ff4c000, 0x58300003, 0x8c000502, + 0x0502000a, 0x600060de, 0x64686000, 0x58300000, + 0x8c000504, 0x05fe07fe, 0x641c6002, 0x59a8008a, + 0x84000540, 0x4803508a, 0x1c01f000, 0x600060de, + 0x58300801, 0x9004050c, 0x05f60e69, 0x60f00800, + 0x05fdf7c6, 0x4853c857, 0x497b8801, 0x850e1d1a, + 0x5050b000, 0x485bc857, 0x8058b1c0, 0x0500089d, + 0x82580480, 0x00000804, 0x0502189a, 0x60040000, + 0x61000801, 0x0501fd85, 0x40582000, 0x8050a000, + 0x50500000, 0x80102400, 0x9058b483, 0x8050a000, + 0x485bc857, 0x4853c857, 0x50501000, 0x80082404, + 0x60101800, 0x82080500, 0x000000ff, 0x61000821, + 0x0501fd76, 0x80081110, 0x800c1840, 0x05fe07fa, + 0x8050a000, 0x8058b040, 0x05fe07f4, 0x4803c856, + 0x41780000, 0x61000801, 0x0501fd6c, 0x50501000, + 0x80082404, 0x0502087b, 0x4803c856, 0x1c01f000, + 0x4a035048, 0xaabbccdd, 0x600c0000, 0x0501fcbf, + 0x600c0000, 0x0501fce7, 0x60300868, 0x0501fd57, + 0x90040541, 0x60300868, 0x0501fd5c, 0x60480888, + 0x0501fd52, 0x90040548, 0x60480888, 0x0501fd57, + 0x60180818, 0x0501fd4d, 0x82040540, 0x00000080, + 0x60180818, 0x0501fd51, 0x60480828, 0x0501fd47, + 0x90040541, 0x60480828, 0x0501fd4c, 0x59a8004f, + 0x8c00050e, 0x05000006, 0x4803c857, 0x82000500, + 0x0000ff00, 0x80000110, 0x0501f002, 0x60e00001, + 0x60300800, 0x0501fd41, 0x60380940, 0x0501fd37, + 0x82040500, 0xffffff0f, 0x0501ff0f, 0x05020003, + 0x90000540, 0x0501f002, 0x90000550, 0x60380940, + 0x0501fd36, 0x60380938, 0x0501fd2c, 0x90040550, + 0x60380938, 0x0501fd31, 0x60800000, 0x61000859, + 0x0501fd2e, 0x61000000, 0x61000851, 0x0501fd2b, + 0x60300000, 0x61800861, 0x0501fd28, 0x60840000, + 0x61800821, 0x0501fd25, 0x59c40001, 0x84000574, + 0x48038801, 0x850e1d5a, 0x61602004, 0x6029d000, + 0x0501f83c, 0x4813c857, 0x61000849, 0x0501fd13, + 0x4807c857, 0x82041500, 0x000000c0, 0x82081580, + 0x000000c0, 0x05000004, 0x80102040, 0x05000825, + 0x05fdf7f3, 0x4803c856, 0x60c82000, 0x6029d000, + 0x0501f82c, 0x60380878, 0x0501fd04, 0x90040d01, + 0x05020004, 0x80102040, 0x0500081a, 0x05fdf7f8, + 0x4803c856, 0x61702001, 0x6029d000, 0x0525fa2a, + 0x60380818, 0x0501fcf9, 0x90040d10, 0x05020004, + 0x80102040, 0x05f40dd2, 0x05fdf7f8, 0x4803c856, + 0x60a02000, 0x6029d000, 0x0525fa1f, 0x603808b8, + 0x0501fcee, 0x90040d04, 0x05000004, 0x80102040, + 0x05f40dc7, 0x05fdf7f8, 0x4803c856, 0x1c01f000, + 0x4803c856, 0x4a03c020, 0x00004010, 0x4a03c011, + 0x40100011, 0x05006000, 0x4203e000, 0x40000000, + 0x4203e000, 0x30000001, 0x4803c856, 0x0501f000, + 0x61201801, 0x800c1840, 0x05fe07ff, 0x80e9d040, + 0x05fe07fc, 0x1c01f000, 0x4803c856, 0x497b88a9, + 0x64078807, 0x497b8807, 0x59c40005, 0x48038805, + 0x0501fdf2, 0x0501fe35, 0x0501f9e6, 0x4a0388a7, + 0x0000f7f7, 0x4a0388a3, 0x8000403c, 0x4a0388ae, + 0x000061a8, 0x59c40001, 0x82000540, 0x185fa063, + 0x48038801, 0x4a038810, 0x00410108, 0x4a038811, + 0x00520608, 0x4a038812, 0x00450320, 0x4a038813, + 0x00440405, 0x4a03881c, 0x004132e1, 0x4a038850, + 0x80000108, 0x64238860, 0x64238870, 0x4a038851, + 0x80000508, 0x4a038861, 0x00800000, 0x4a038871, + 0x00800000, 0x4a038852, 0x80000708, 0x4a038862, + 0x00800000, 0x4a038872, 0x00800000, 0x4a038853, + 0x80000608, 0x497b8863, 0x4a038873, 0x00800000, + 0x4a038882, 0x00000840, 0x4a0388a5, 0x000000fe, + 0x647b88a6, 0x4a0388b0, 0x00007530, 0x4a038802, + 0x0000ffff, 0x4a038806, 0xc0e80b00, 0x1c01f000, + 0x850e1d4e, 0x1c01f000, 0x59c40805, 0x59c40006, + 0x80040d00, 0x05f40d6e, 0x82040500, 0x00e80b00, + 0x05020004, 0x8c04053e, 0x050208c4, 0x0501f005, + 0x82040500, 0x00880b00, 0x05f60d5b, 0x05f5fd64, + 0x4c5c0000, 0x4c600000, 0x59c4b805, 0x59c410a3, + 0x84081518, 0x825c0500, 0x04000000, 0x05020d71, + 0x59c40006, 0x8c000500, 0x05000003, 0x8c5c0500, + 0x0502007f, 0x485fc857, 0x0519fe98, 0x0500001a, + 0x59c40005, 0x82000500, 0x000000c0, 0x05000042, + 0x0519feb3, 0x05020040, 0x59c40006, 0x82000500, + 0x000000f0, 0x05020004, 0x4a038805, 0x000000c0, + 0x0501f039, 0x59a80015, 0x84000506, 0x48035015, + 0x42006000, 0xff203fff, 0x42006800, 0x40000000, + 0x0515fab0, 0x60400800, 0x42001000, 0x00103ed0, + 0x0525f984, 0x8c5c0534, 0x0502002b, 0x4a035013, + 0x0000aaaa, 0x59c40005, 0x8c00050c, 0x0502000f, + 0x8c00050e, 0x05020015, 0x8c00050a, 0x0502001b, + 0x8c000508, 0x05000008, 0x59a80011, 0x90000589, + 0x05020005, 0x42000000, 0x0010b22b, 0x0545fd7e, + 0x051df828, 0x0501f04c, 0x42000000, 0x0010b239, + 0x0545fd79, 0x41781800, 0x60042000, 0x0501fd29, + 0x64035014, 0x0501f00e, 0x42000000, 0x0010b23a, + 0x0545fd71, 0x41781800, 0x60082000, 0x0501fd21, + 0x640b5014, 0x0501f006, 0x42000000, 0x0010b22d, + 0x0545fd69, 0x0519ffb9, 0x0501f037, 0x051df865, + 0x0501f035, 0x8c5c0534, 0x05000031, 0x59c40005, + 0x8c00053a, 0x05020004, 0x42000000, 0x0010b221, + 0x0545fd5d, 0x4a038805, 0x20000000, 0x0519fe47, + 0x0502000e, 0x4a038805, 0x04000000, 0x59c418a8, + 0x60002000, 0x0501fd07, 0x0519fe56, 0x05020005, + 0x64075014, 0x6006d800, 0x0519fdba, 0x0501f050, + 0x41780000, 0x0519fe0d, 0x0501fcf7, 0x4000c000, + 0x0501fc3d, 0x916c1584, 0x0502000b, 0x8c5c0500, + 0x05020013, 0x8d0c0506, 0x05020004, 0x59c410a3, + 0x90081548, 0x480b88a3, 0x59c41006, 0x84081540, + 0x480b8806, 0x4a038805, 0x04000000, 0x6006d800, + 0x497b5010, 0x8d0c0518, 0x05020004, 0x4803c856, + 0x850e1d06, 0x0515f913, 0x0511fbb0, 0x8c5c053c, + 0x0502084f, 0x8c5c0500, 0x0500002e, 0x42000000, + 0x0010b33e, 0x0545fd2c, 0x64078805, 0x6148b006, + 0x6191d000, 0x4c580000, 0x0525f923, 0x0501fbb4, + 0x5c00b000, 0x05000004, 0x8058b040, 0x05fe07f9, + 0x0501f003, 0x64078805, 0x0501f01e, 0x59c40006, + 0x84000500, 0x48038806, 0x0525ff69, 0x497b8880, + 0x0501fdc1, 0x05000007, 0x59e00013, 0x8c000516, + 0x05000004, 0x60142000, 0x051df852, 0x0501f003, + 0x60182000, 0x051df84f, 0x59c400a3, 0x82000500, + 0xfcf8ffff, 0x480388a3, 0x640b5075, 0x6012d800, + 0x64078805, 0x05f5fecd, 0x0501fb2e, 0x497b503a, + 0x64075047, 0x497b5070, 0x0201f800, 0x0010fcd9, + 0x825cbd00, 0xbbfffffe, 0x485f8805, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x4d180000, 0x59c41004, + 0x480bc857, 0x8c080500, 0x05000006, 0x4803c856, + 0x4a01a8e5, 0x00000800, 0x0525ffee, 0x0501f007, + 0x82080500, 0x000001f0, 0x05000004, 0x4803c856, + 0x0529f913, 0x052a0806, 0x4a038805, 0x80000000, + 0x5c023000, 0x1c01f000, 0x59c408a3, 0x4807c857, + 0x84040d40, 0x480788a3, 0x1c01f000, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, + 0x4a038805, 0x40000000, 0x42000000, 0x0010b233, + 0x0545fcd9, 0x0525fbd2, 0x59c41004, 0x8c080500, + 0x05000040, 0x598e600b, 0x4a01a8e5, 0x00000800, + 0x813261c0, 0x05000024, 0x59300403, 0x900005b2, + 0x05020021, 0x5930001e, 0x48038833, 0x4a038807, + 0x00018000, 0x6009d000, 0x0525f8c3, 0x497b8807, + 0x6009d000, 0x0525f8c0, 0x0525fe54, 0x60c1d0ea, + 0x0525f8bd, 0x59c408a4, 0x90040d0f, 0x90040d80, + 0x05000004, 0x42000000, 0x00200000, 0x0501fb94, + 0x0525fb08, 0x59300009, 0x80000540, 0x05f40c60, + 0x40025800, 0x4a025a05, 0x00000103, 0x5931d82d, + 0x58ef400a, 0x58ec0008, 0x0801f800, 0x0005fc5a, + 0x0501f032, 0x598c000d, 0x82001c80, 0x000000c8, + 0x0502100c, 0x80000000, 0x4803180d, 0x59c400a4, + 0x9000050f, 0x90000582, 0x05020004, 0x42000000, + 0x00200000, 0x0501fb7a, 0x0525f83e, 0x0501f023, + 0x4933c857, 0x0525fe2d, 0x813261c0, 0x0500001f, + 0x64066203, 0x609e7000, 0x0005fc78, 0x0501f01b, + 0x0529f8bb, 0x05000019, 0x0529f8e2, 0x0525f85a, + 0x59926005, 0x813261c0, 0x0500000d, 0x61201801, + 0x0529f8aa, 0x0502000a, 0x59c400a4, 0x9000050f, + 0x90000582, 0x05020004, 0x42000000, 0x00200000, + 0x0501fb5f, 0x0525f829, 0x0501f008, 0x4933c857, + 0x0525fdb9, 0x813261c0, 0x05000004, 0x613e7000, + 0x640e6203, 0x0005fc78, 0x5c01b000, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x0525f35c, + 0x40680000, 0x810c0d80, 0x8c04050e, 0x05000051, + 0x4803c857, 0x8d0c050e, 0x0500001f, 0x850e1d0e, + 0x497b5075, 0x42000000, 0x0010b21a, 0x0545fc6a, + 0x0545fd16, 0x60441100, 0x59c40001, 0x82000500, + 0x00018000, 0x90001d80, 0x0500000b, 0x82001d80, + 0x00008000, 0x0500000a, 0x82001d80, 0x00010000, + 0x05000009, 0x82001d80, 0x00018000, 0x05000008, + 0x05f5fc03, 0x60001800, 0x0501f006, 0x60041800, + 0x0501f004, 0x600c1800, 0x0501f002, 0x60101800, + 0x050df7d9, 0x850e1d4e, 0x59a80875, 0x800409c0, + 0x05020006, 0x59c4000d, 0x8c000520, 0x05000003, + 0x600c1800, 0x0501f002, 0x40041800, 0x0545fcdb, + 0x4c0c0000, 0x41782000, 0x0501fceb, 0x0500000f, + 0x0501fccd, 0x60042000, 0x0502000c, 0x0501fcd8, + 0x05020006, 0x60082000, 0x0501f8c5, 0x05020007, + 0x60102000, 0x0501f005, 0x600c2000, 0x0501f89f, + 0x05020002, 0x60142000, 0x5c001800, 0x60481100, + 0x050dffb9, 0x05f5fdf5, 0x0545fd3f, 0x0502000d, + 0x4d200000, 0x61fe4001, 0x0501f852, 0x5c024000, + 0x4d400000, 0x4d3c0000, 0x60a28000, 0x60227800, + 0x0201f800, 0x0010edf3, 0x5c027800, 0x5c028000, + 0x1c01f000, 0x4803c857, 0x82000400, 0x001020b6, + 0x50000800, 0x82040d00, 0x000000ff, 0x1c01f000, + 0x4803c856, 0x4c580000, 0x6040b000, 0x497b88ac, + 0x497b88ad, 0x8058b040, 0x05fe07fe, 0x5c00b000, + 0x1c01f000, 0x40680800, 0x4807c857, 0x80041908, + 0x480f88ac, 0x9004250f, 0x82102400, 0x0010a393, + 0x50102000, 0x59c400ad, 0x80100540, 0x480f88ac, + 0x480388ad, 0x0545fd40, 0x05000002, 0x4807500f, + 0x1c01f000, 0x4807c857, 0x80041908, 0x480f88ac, + 0x9004250f, 0x82102400, 0x0010a393, 0x50102000, + 0x59c400ad, 0x80101500, 0x05000004, 0x80100580, + 0x480f88ac, 0x480388ad, 0x1c01f000, 0x4803c857, + 0x4c080000, 0x4c040000, 0x4c000000, 0x59c40892, + 0x4807c857, 0x80041580, 0x0500000e, 0x80041480, + 0x05021006, 0x80081080, 0x80081000, 0x4008b000, + 0x60040004, 0x0501f003, 0x4008b000, 0x60400004, + 0x48038886, 0x8058b040, 0x05fe07fe, 0x497b8886, + 0x5c000000, 0x5c000800, 0x5c001000, 0x1c01f000, + 0x4803c856, 0x8d0c0520, 0x05000003, 0x60ba8000, + 0x0541f4c8, 0x1c01f000, 0x0501f803, 0x40058800, + 0x1c01f000, 0x59a8008a, 0x80000540, 0x05000008, + 0x0519fcba, 0x60280800, 0x0502000e, 0x600008de, + 0x58040001, 0x8000092c, 0x0501f00a, 0x59c80835, + 0x82040d00, 0x00001f00, 0x80040910, 0x80040800, + 0x59a8008a, 0x80000540, 0x05000002, 0x61680804, + 0x4807c857, 0x1c01f000, 0x59a8008a, 0x80000540, + 0x0500001c, 0x599c1a01, 0x60a80801, 0x820c0480, + 0x00000204, 0x0500100a, 0x61680800, 0x820c0480, + 0x00000404, 0x05001006, 0x60b80800, 0x820c0480, + 0x00000804, 0x05001002, 0x60b40800, 0x4c300000, + 0x600060de, 0x58301000, 0x82081500, 0xfc00ffff, + 0x800400e0, 0x80080540, 0x84000574, 0x48006000, + 0x58300000, 0x8c000534, 0x05fe07fe, 0x5c006000, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, 0x4c000000, 0x59a8003b, - 0x4803c857, 0x90000584, 0x5c000000, 0x1c01f000, + 0x4803c857, 0x90000580, 0x5c000000, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, - 0x1c01f000, 0x4c000000, 0x59a8003b, 0x90000582, - 0x5c000000, 0x1c01f000, 0x4c000000, 0x4c040000, - 0x4c080000, 0x4c380000, 0x59a8003e, 0x90000c87, - 0x05f61b0b, 0x0c01f806, 0x5c007000, 0x5c001000, - 0x5c000800, 0x5c000000, 0x1c01f000, 0x001016f2, - 0x001016ff, 0x0010170c, 0x0010170d, 0x0010172b, - 0x0010172c, 0x0010172d, 0x4803c856, 0x64035040, - 0x600c0000, 0x0501f9aa, 0x600c0000, 0x0501f97e, - 0x0501fa06, 0x4803c856, 0x641b503e, 0x60740800, - 0x42001000, 0x0010172e, 0x0521f55e, 0x497b5043, - 0x64db5038, 0x64ab5037, 0x4803c856, 0x64075040, - 0x600c0000, 0x0501f970, 0x4803c856, 0x641b503e, - 0x60740800, 0x42001000, 0x0010172e, 0x0521f551, - 0x05f5fae3, 0x64db5038, 0x4803c856, 0x640f5040, - 0x60000800, 0x0501fa00, 0x90040d1c, 0x9004059c, - 0x05000008, 0x90040598, 0x05000008, 0x90040594, - 0x05000008, 0x90040590, 0x05000008, 0x05f5fad4, - 0x60040000, 0x0501f006, 0x60000000, 0x0501f004, - 0x60080000, 0x0501f002, 0x600c0000, 0x0501f952, - 0x497b5044, 0x4803c856, 0x641b503e, 0x60740800, - 0x42001000, 0x0010172e, 0x0521f532, 0x05f5fac4, - 0x05f5fac3, 0x1c01f000, 0x4c000000, 0x4c040000, - 0x4c080000, 0x4c380000, 0x59a80040, 0x90000c87, - 0x05f61abb, 0x0c01f806, 0x5c007000, 0x5c001000, - 0x5c000800, 0x5c000000, 0x1c01f000, 0x00101742, - 0x0010175e, 0x001017af, 0x001017c4, 0x001017d8, - 0x001017e1, 0x001017e2, 0x0501f990, 0x05020018, - 0x59a81046, 0x60000800, 0x0501f9cb, 0x90040d1c, + 0x1c01f000, 0x4c000000, 0x59a8003b, 0x4803c857, + 0x90000581, 0x5c000000, 0x1c01f000, 0x0501f805, + 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, + 0x4c000000, 0x59a8003b, 0x4803c857, 0x90000583, + 0x5c000000, 0x1c01f000, 0x0501f805, 0x60058800, + 0x05000002, 0x60018800, 0x1c01f000, 0x4c000000, + 0x59a8003b, 0x4803c857, 0x90000584, 0x5c000000, + 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, + 0x60018800, 0x1c01f000, 0x4c000000, 0x59a8003b, + 0x90000582, 0x5c000000, 0x1c01f000, 0x4c000000, + 0x4c040000, 0x4c080000, 0x4c380000, 0x59a8003e, + 0x90000c87, 0x05f61b0a, 0x0c01f806, 0x5c007000, + 0x5c001000, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x001016f3, 0x00101700, 0x0010170d, 0x0010170e, + 0x0010172c, 0x0010172d, 0x0010172e, 0x4803c856, + 0x64035040, 0x600c0000, 0x0501f9aa, 0x600c0000, + 0x0501f97e, 0x0501fa06, 0x4803c856, 0x641b503e, + 0x60740800, 0x42001000, 0x0010172f, 0x0521f71f, + 0x497b5043, 0x64db5038, 0x64ab5037, 0x4803c856, + 0x64075040, 0x600c0000, 0x0501f970, 0x4803c856, + 0x641b503e, 0x60740800, 0x42001000, 0x0010172f, + 0x0521f712, 0x05f5fae2, 0x64db5038, 0x4803c856, + 0x640f5040, 0x60000800, 0x0501fa00, 0x90040d1c, 0x9004059c, 0x05000008, 0x90040598, 0x05000008, 0x90040594, 0x05000008, 0x90040590, 0x05000008, - 0x05f5fa9f, 0x84081540, 0x0501f006, 0x84081542, - 0x0501f004, 0x84081544, 0x0501f002, 0x84081546, - 0x480b5046, 0x6407503e, 0x0501f003, 0x0501f8be, - 0x05fdff9d, 0x1c01f000, 0x0501f885, 0x0500004f, - 0x0501f972, 0x05020029, 0x60000800, 0x0501f9ae, - 0x59c41001, 0x82081500, 0x00018000, 0x90040d1c, - 0x90040590, 0x05000042, 0x90040594, 0x05000006, - 0x90040598, 0x0500000a, 0x9004059c, 0x0500000a, - 0x05f5fa7f, 0x90080580, 0x05000039, 0x82080580, - 0x00008000, 0x05000036, 0x0501f003, 0x90080580, - 0x05000033, 0x60000800, 0x0501f997, 0x59a80046, - 0x90040d1c, 0x90041594, 0x05000006, 0x90041598, - 0x05000006, 0x9004159c, 0x05000006, 0x05f60a6c, - 0x84000544, 0x0501f004, 0x84000542, 0x0501f002, - 0x84000540, 0x48035046, 0x59a80043, 0x80000000, - 0x48035043, 0x90000585, 0x05000003, 0x0501f859, - 0x0501f01d, 0x497b5043, 0x59c40801, 0x82040d00, - 0x00018000, 0x90040580, 0x0500000b, 0x82040580, - 0x00008000, 0x0500000a, 0x82040580, 0x00010000, - 0x05000009, 0x82040580, 0x00018000, 0x05000008, - 0x05f5fa4f, 0x60040000, 0x0501f006, 0x60000000, + 0x05f5fad3, 0x60040000, 0x0501f006, 0x60000000, 0x0501f004, 0x60080000, 0x0501f002, 0x600c0000, - 0x0501f8f7, 0x640b5040, 0x0501f003, 0x640f503e, - 0x0501f002, 0x05fdff59, 0x1c01f000, 0x0501f834, - 0x05000013, 0x59a80037, 0x80000040, 0x48035037, - 0x0501f91e, 0x05020004, 0x640f503e, 0x497b503f, - 0x0501f00b, 0x59a80037, 0x80000540, 0x05020003, - 0x0501f891, 0x0501f002, 0x0501f841, 0x0501f829, - 0x497b5043, 0x64075040, 0x05fdff44, 0x1c01f000, - 0x0501f81f, 0x05000012, 0x0501f90c, 0x0502000d, - 0x59a80044, 0x80000000, 0x48035044, 0x90000587, - 0x0502000a, 0x642b503a, 0x497b5047, 0x59a80046, - 0x8400055e, 0x48035046, 0x4803c857, 0x0501f004, - 0x0501f814, 0x64135040, 0x05fdff4f, 0x1c01f000, - 0x0501f80b, 0x05000007, 0x0501f8f8, 0x05020003, - 0x05fdff32, 0x0501f003, 0x0501f80a, 0x05fdff46, - 0x1c01f000, 0x05f5fa0e, 0x05f5fa0d, 0x59a80038, - 0x80000040, 0x48035038, 0x05000885, 0x1c01f000, - 0x4c040000, 0x60000800, 0x0501f927, 0x90040d1c, - 0x9004059c, 0x05000008, 0x90040598, 0x0500000a, - 0x90040594, 0x0500000a, 0x90040590, 0x05000004, - 0x05f5f9fb, 0x600c0000, 0x0501f006, 0x60080000, - 0x0501f004, 0x60040000, 0x0501f002, 0x60000000, - 0x0501f8a3, 0x5c000800, 0x1c01f000, 0x4c040000, - 0x59c40801, 0x82040d00, 0x00018000, 0x90040580, - 0x0500000b, 0x82040580, 0x00008000, 0x0500000c, - 0x82040580, 0x00010000, 0x0500000b, 0x82040580, - 0x00018000, 0x05000004, 0x05f5f9e1, 0x600c0000, - 0x0501f006, 0x60080000, 0x0501f004, 0x60040000, - 0x0501f002, 0x60000000, 0x0501f85f, 0x5c000800, - 0x1c01f000, 0x4c040000, 0x59a80043, 0x80000000, - 0x48035043, 0x90000585, 0x05020019, 0x497b5043, - 0x59c40801, 0x82040d00, 0x00018000, 0x90040580, - 0x0500000b, 0x82040580, 0x00008000, 0x0500000c, - 0x82040580, 0x00010000, 0x0500000b, 0x82040580, - 0x00018000, 0x05000004, 0x05f5f9c1, 0x600c0000, - 0x0501f006, 0x60080000, 0x0501f004, 0x60040000, - 0x0501f002, 0x60000000, 0x0501f83f, 0x60000800, - 0x0501f8d9, 0x90040d1c, 0x9004059c, 0x05000008, - 0x90040598, 0x0500000a, 0x90040594, 0x0500000a, - 0x90040590, 0x05000004, 0x05f5f9ad, 0x600c0000, - 0x0501f006, 0x60080000, 0x0501f004, 0x60040000, - 0x0501f002, 0x60000000, 0x0501f855, 0x5c000800, - 0x1c01f000, 0x4c200000, 0x59a80046, 0x82000500, - 0x00007fff, 0x05f4099e, 0x59a84045, 0x80204102, - 0x05f4199b, 0x48235045, 0x80204500, 0x05fc07fb, - 0x8c000506, 0x05020008, 0x8c000504, 0x05020008, - 0x8c000502, 0x05020008, 0x8c000500, 0x05020008, - 0x05f5f98f, 0x600c0000, 0x0501f006, 0x60080000, - 0x0501f004, 0x60000000, 0x0501f002, 0x60040000, - 0x0501f80d, 0x5c004000, 0x1c01f000, 0x05011000, - 0x4a03c840, 0x0010abbe, 0x6427c842, 0x40000000, - 0x05fd17ff, 0x64235045, 0x6403503c, 0x1c01f000, - 0x40680000, 0x4c000000, 0x0501f967, 0x5c000000, - 0x0501fa82, 0x60080800, 0x0501f897, 0x82041500, - 0xffffffe3, 0x59c41801, 0x820c1d00, 0xfffe7fff, - 0x800001c0, 0x05000007, 0x90000d81, 0x0502000a, - 0x9008055c, 0x900c1d40, 0x840c1d32, 0x0501f012, - 0x90080558, 0x820c1d40, 0x00008000, 0x840c1d32, - 0x0501f00d, 0x90000d82, 0x05020006, 0x90080554, - 0x820c1d40, 0x00010000, 0x840c1d32, 0x0501f006, - 0x90000d83, 0x05f6095a, 0x90080550, 0x820c1d40, - 0x02018000, 0x60080800, 0x0501f87f, 0x480f8801, - 0x0501f146, 0x1c01f000, 0x40680000, 0x4c000000, - 0x0501f938, 0x5c000000, 0x0501fa58, 0x60000800, - 0x0501f86d, 0x82041500, 0xffffffe3, 0x59c41801, - 0x800001c0, 0x05000006, 0x90000d81, 0x05020007, - 0x9008055c, 0x840c1d30, 0x0501f00d, 0x90080558, - 0x840c1d30, 0x0501f00a, 0x90000d82, 0x05020004, - 0x90080554, 0x840c1d30, 0x0501f005, 0x90000d83, - 0x05f60937, 0x90080550, 0x840c1d70, 0x480f8801, - 0x60000800, 0x0501f85c, 0x0501fa2e, 0x0500000d, - 0x4a03c014, 0x00200020, 0x60000800, 0x0501f84e, - 0x90040d1c, 0x90040590, 0x05020004, 0x4a03c013, - 0x00200020, 0x0501f003, 0x4a03c013, 0x00200000, - 0x0501f11d, 0x0501f805, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x4c580000, 0x6050b000, - 0x8058b040, 0x05000026, 0x59c4000d, 0x8c000520, - 0x05fe07fc, 0x0501f831, 0x59c4000d, 0x8c000520, - 0x05fe07f8, 0x59c40808, 0x82040d40, 0x00000300, - 0x48078808, 0x6120b001, 0x8058b040, 0x05fe07ff, - 0x6050b000, 0x8058b040, 0x05000015, 0x59c4000d, - 0x8c000520, 0x05020012, 0x0501f820, 0x59c4000d, - 0x8c000520, 0x0502000e, 0x6028b000, 0x8058b040, - 0x05000003, 0x0501f819, 0x05fdf7fd, 0x6190b000, - 0x59c4000d, 0x8c00051e, 0x05000005, 0x8058b040, - 0x05fe07fc, 0x80000580, 0x0501f002, 0x90000541, - 0x5c00b000, 0x1c01f000, 0x60080800, 0x0501f812, - 0x82040500, 0xfffffffe, 0x60080800, 0x0501f816, - 0x60000800, 0x0501f80c, 0x82040500, 0xfffffffe, - 0x60000800, 0x0501f010, 0x40000000, 0x40000000, - 0x40000000, 0x40000000, 0x40000000, 0x1c01f000, - 0x40680800, 0x4807880e, 0x59c4080f, 0x82040d00, - 0x000000ff, 0x40058800, 0x1c01f000, 0x40680800, - 0x406c0000, 0x900001c0, 0x80040d40, 0x84040d40, - 0x4807880e, 0x1c01f000, 0x82000d80, 0x00200000, - 0x05000009, 0x82000d80, 0x02000000, 0x05000006, - 0x82000d80, 0x01000000, 0x05000006, 0x59c408a3, - 0x0501f006, 0x59c408a3, 0x84040d30, 0x0501f003, - 0x59c408a3, 0x84040d32, 0x80040540, 0x480388a3, - 0x480788a3, 0x1c01f000, 0x59c400a3, 0x84000556, - 0x480388a3, 0x84000516, 0x480388a3, 0x1c01f000, - 0x485fc857, 0x4863c857, 0x4c640000, 0x4d3c0000, - 0x4d400000, 0x0525f994, 0x48635009, 0x40601800, - 0x60002000, 0x0501f8b6, 0x42000000, 0x0010afb8, - 0x0541fe51, 0x82600500, 0x0000ff00, 0x82000580, - 0x0000f700, 0x05020004, 0x42000000, 0x0010afa0, - 0x0541fe49, 0x0541ff58, 0x05020085, 0x82600d00, - 0x0000ff00, 0x61fe41ff, 0x800409c0, 0x0500001b, - 0x82041580, 0x0000f700, 0x05000013, 0x82041580, - 0x0000f800, 0x05000010, 0x82041580, 0x0000ff00, - 0x6000c800, 0x05000029, 0x840439c0, 0x0501fdda, - 0x05020019, 0x83200400, 0x0010a0ec, 0x50024800, - 0x59240200, 0x8c000500, 0x05000013, 0x6004c800, - 0x0501f01e, 0x42024800, 0x0010b111, 0x59240200, - 0x8c000502, 0x0500000c, 0x59c410a3, 0x82081500, - 0x00008000, 0x05000008, 0x59c410a7, 0x82081500, - 0x0000ff00, 0x82081580, 0x0000ff00, 0x6000c800, - 0x0500000e, 0x8d0c0502, 0x05020007, 0x8d0c0500, - 0x0502000a, 0x599c1017, 0x8c08051a, 0x0500004e, - 0x850e1d42, 0x61fe41ff, 0x6008c800, 0x60128000, - 0x60227800, 0x0501f004, 0x850e1d40, 0x60128000, - 0x417a7800, 0x59a80005, 0x8c000502, 0x05020004, - 0x8d0c050a, 0x05020046, 0x850e1d4a, 0x42000000, - 0x0010af9f, 0x0541fe04, 0x59a81809, 0x604c1100, - 0x050dfb6e, 0x83200580, 0x0000ffff, 0x05000018, - 0x59240400, 0x8c000508, 0x05000009, 0x417a7800, - 0x4d300000, 0x417a6000, 0x0501fdd5, 0x5c026000, - 0x59240400, 0x8c00050a, 0x05020031, 0x4d400000, - 0x82600500, 0x000000ff, 0x61fe89ff, 0x40643000, - 0x603a8000, 0x053dfef5, 0x60040800, 0x60001002, - 0x0521fb5a, 0x5c028000, 0x0501f025, 0x8d0c0520, - 0x05000018, 0x4c580000, 0x42024800, 0x0010b111, - 0x0541fefe, 0x4d400000, 0x59240200, 0x8c000500, - 0x05000004, 0x60040800, 0x60001002, 0x0521fb4b, - 0x91264c0b, 0x8058b040, 0x05fe07f8, 0x603a8000, - 0x61fe89ff, 0x40643000, 0x053dfedc, 0x5c028000, - 0x5c00b000, 0x599c0817, 0x8c04050a, 0x0502000c, - 0x493fc857, 0x4943c857, 0x0201f800, 0x0010ebe6, - 0x0501f007, 0x8d0c0520, 0x05000005, 0x603e8000, - 0x61fe89ff, 0x60003000, 0x053dfecf, 0x497b8880, - 0x5c028000, 0x5c027800, 0x5c00c800, 0x1c01f000, - 0x60000800, 0x05fdff38, 0x90040542, 0x60000800, - 0x05fdf73d, 0x60080800, 0x05fdff33, 0x90040542, - 0x60080800, 0x05fdf738, 0x60080800, 0x05fdff2e, - 0x82040500, 0xfffffffd, 0x90000550, 0x60080800, - 0x05fdf731, 0x60000800, 0x05fdff27, 0x82040500, - 0xfffffffd, 0x90000550, 0x60000800, 0x05fdf72a, - 0x59c408a8, 0x05fdff19, 0x05fdff18, 0x59c400a8, - 0x80040d80, 0x05fe07fb, 0x1c01f000, 0x59a80005, - 0x8c000500, 0x05000008, 0x59a80008, 0x8c000500, - 0x05020005, 0x84000540, 0x48035008, 0x60581100, - 0x050dfb02, 0x1c01f000, 0x1c01f000, 0x59c40801, - 0x82040d00, 0x00018000, 0x82040d80, 0x00018000, - 0x05000002, 0x84081518, 0x480b88a3, 0x1c01f000, - 0x42000800, 0x7ff4818e, 0x59e00002, 0x8c00051e, - 0x05020003, 0x42000800, 0x7ff4808e, 0x58041800, - 0x480f504f, 0x8c0c0500, 0x05020007, 0x8c0c0502, - 0x05000005, 0x58044001, 0x58042002, 0x58041003, - 0x0501f007, 0x42004000, 0x0003c014, 0x42002000, - 0x0003c014, 0x42001000, 0x0002e014, 0x480b5049, - 0x4813504a, 0x4823504b, 0x8c0c0500, 0x05020007, - 0x8c0c0504, 0x05000005, 0x58044004, 0x58042005, - 0x58041006, 0x0501f004, 0x60c8400d, 0x60c8200d, - 0x60c8100d, 0x480b504c, 0x4813504d, 0x4823504e, - 0x1c01f000, 0x59a8104c, 0x59a8204d, 0x59a8404e, - 0x60380840, 0x05fdfed8, 0x82040d00, 0xffffffc0, - 0x82200500, 0x003f0000, 0x80000120, 0x80040540, - 0x60380840, 0x05fdfed8, 0x60380848, 0x05fdfece, - 0x82040d00, 0xffffffc0, 0x82200500, 0x0000fc00, - 0x80000114, 0x80040540, 0x60380848, 0x05fdfece, - 0x82200500, 0x000003e0, 0x8000010a, 0x603808d8, - 0x05fdfec9, 0x9020051f, 0x603808f0, 0x05fdfec6, - 0x82100500, 0x003f0000, 0x80000120, 0x60380908, - 0x05fdfec1, 0x82100500, 0x0000fc00, 0x80000114, - 0x60380918, 0x05fdfebc, 0x82100500, 0x000003e0, - 0x8000010a, 0x603808e0, 0x05fdfeb7, 0x9010051f, - 0x603808f8, 0x05fdfeb4, 0x82080500, 0x003f0000, - 0x80000120, 0x60380910, 0x05fdfeaf, 0x82080500, - 0x0000fc00, 0x80000114, 0x60380920, 0x05fdfeaa, - 0x82080500, 0x000003e0, 0x8000010a, 0x603808e8, - 0x05fdfea5, 0x9008051f, 0x60380900, 0x05fdfea2, - 0x1c01f000, 0x59a81049, 0x59a8204a, 0x59a8404b, - 0x9020051f, 0x800000c2, 0x84000540, 0x60480800, - 0x05fdfe99, 0x82200500, 0x000001e0, 0x80000908, - 0x84040d40, 0x82200500, 0x00000600, 0x80000106, - 0x8400054a, 0x80040540, 0x60480830, 0x05fdfe8e, - 0x82200500, 0x00001800, 0x80000916, 0x82200500, - 0x0003e000, 0x80000114, 0x84000544, 0x80040540, - 0x60480848, 0x05fdfe84, 0x9010051f, 0x800000c2, - 0x84000540, 0x60480808, 0x05fdfe7f, 0x82100500, - 0x000001e0, 0x80000908, 0x84040d40, 0x82100500, - 0x00000600, 0x80000106, 0x8400054a, 0x80040540, - 0x60480838, 0x05fdfe74, 0x82100500, 0x00001800, - 0x80000916, 0x82100500, 0x0003e000, 0x80000114, - 0x84000544, 0x80040540, 0x60480850, 0x05fdfe6a, - 0x9008051f, 0x800000c2, 0x84000540, 0x60480810, - 0x05fdfe65, 0x82080500, 0x000001e0, 0x80000908, - 0x84040d40, 0x82080500, 0x00000600, 0x80000106, - 0x8400054a, 0x80040540, 0x60480840, 0x05fdfe5a, - 0x82080500, 0x00001800, 0x80000916, 0x82080500, - 0x0003e000, 0x80000114, 0x84000544, 0x80040540, - 0x60480858, 0x05fdfe50, 0x1c01f000, 0x0501f805, - 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, - 0x4c000000, 0x050dfb5c, 0x05020003, 0x90000541, - 0x0501f003, 0x59e00013, 0x8c00050e, 0x5c000000, - 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x4c140000, 0x4a03c013, - 0x03800300, 0x4a03c014, 0x03800380, 0x60800801, - 0x60281000, 0x0505fc1c, 0x05000002, 0x8c14050c, - 0x4a03c014, 0x03800000, 0x5c002800, 0x1c01f000, - 0x4c000000, 0x59a8004f, 0x8c000508, 0x05020004, - 0x90000541, 0x5c000000, 0x1c01f000, 0x80000580, - 0x05fdf7fd, 0x05fdfff7, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x4c5c0000, 0x4000b800, - 0x59a80048, 0x82000d80, 0xaabbccdd, 0x0500000f, - 0x90000c85, 0x05f21eee, 0x4c000000, 0x050dfb08, - 0x5c000000, 0x05020003, 0x0c01f81a, 0x0501f016, - 0x4c000000, 0x050dfb19, 0x5c000000, 0x05fc07fb, - 0x0c01f819, 0x0501f010, 0x05fdffde, 0x0500000e, - 0x8d0c051a, 0x0500000c, 0x05fdffbe, 0x0502000a, - 0x05fdffca, 0x05020005, 0x905c0d83, 0x05020006, - 0x6008b800, 0x0501f004, 0x905c0d81, 0x05020002, - 0x600cb800, 0x405c0000, 0x5c00b800, 0x1c01f000, - 0x00101b2a, 0x00101b2b, 0x00101b2c, 0x00101b2d, - 0x00101b31, 0x00101b32, 0x00101b34, 0x00101b44, - 0x00101b52, 0x00101b62, 0x1c01f000, 0x1c01f000, - 0x1c01f000, 0x905c0d83, 0x05020002, 0x6008b800, - 0x1c01f000, 0x1c01f000, 0x6004b800, 0x1c01f000, - 0x05fdffb8, 0x05000007, 0x05fdff9a, 0x05020005, - 0x05fdffa6, 0x05000003, 0x6000b800, 0x0501f008, - 0x905c0d83, 0x05020003, 0x6000b800, 0x0501f004, - 0x905c0d82, 0x05020002, 0x05f1fead, 0x1c01f000, - 0x05fdffa8, 0x0500000c, 0x05fdff8a, 0x0502000a, - 0x05fdff96, 0x05020005, 0x905c0d83, 0x05020006, - 0x6008b800, 0x0501f004, 0x905c0d81, 0x05020002, - 0x600cb800, 0x1c01f000, 0x05fdff9a, 0x0500000b, - 0x05fdff7c, 0x05020009, 0x05fdff88, 0x05020002, - 0x0501f006, 0x905c0d83, 0x05000006, 0x905c0d81, - 0x05000004, 0x0501f004, 0x905c0d83, 0x05020002, - 0x6008b800, 0x1c01f000, 0x05fdff8a, 0x05000006, - 0x05fdff6c, 0x05020004, 0x05fdff78, 0x05020002, - 0x0501f004, 0x905c0d81, 0x05020002, 0x600cb800, - 0x1c01f000, 0x4803c856, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x4c580000, 0x497b5050, 0x4200c000, - 0x7ff52000, 0x050dfab8, 0x05020007, 0x4803c856, - 0x4a03c014, 0x07e30000, 0x59e0c813, 0x0501f8ba, - 0x0501f013, 0x82000d80, 0x3261103c, 0x050200b1, - 0x4803c856, 0x42000800, 0x7ff481e6, 0x59e06802, - 0x8c34051e, 0x05020003, 0x42000800, 0x7ff480e6, - 0x50040000, 0x4803c857, 0x48035057, 0x8c00051e, - 0x050000a4, 0x8200cd00, 0x000000ff, 0x4867c857, - 0x48675051, 0x50600800, 0x48075052, 0x4807c857, - 0x82040d80, 0x53434651, 0x05020098, 0x8060c000, - 0x50600800, 0x48075053, 0x8060c000, 0x50600800, - 0x48075054, 0x8060c000, 0x50600800, 0x48075055, - 0x8060c000, 0x50600800, 0x82040d00, 0x0000ffff, - 0x48075056, 0x4200c000, 0x7ff52002, 0x5060b800, - 0x825cbd00, 0xffff0000, 0x805cb920, 0x805cb800, - 0x05001082, 0x8c5c051e, 0x05020080, 0x59e06802, - 0x8c34051e, 0x0502006a, 0x4803c856, 0x4200c000, - 0x7ff52045, 0x50603000, 0x82183500, 0x0000ffff, - 0x05000011, 0x80180497, 0x05021074, 0x8060c000, - 0x50602000, 0x82100500, 0xffff0000, 0x80000120, - 0x82100d00, 0x0000ffff, 0x4803c857, 0x4807c857, - 0x4c180000, 0x05fdfd54, 0x5c003000, 0x80183040, - 0x05fe07f3, 0x41780800, 0x40641000, 0x60100000, - 0x0521f970, 0x59e06802, 0x8c34051e, 0x05020057, - 0x4200c000, 0x7ff52005, 0x8008c418, 0x5060c800, - 0x800409c0, 0x0500000a, 0x90041581, 0x05020003, - 0x8064c910, 0x0501f006, 0x90041582, 0x05020003, - 0x8064c920, 0x0501f002, 0x8064c930, 0x8264cd00, - 0x000000ff, 0x4867c857, 0x48675058, 0x42001000, - 0x7ff52002, 0x50080000, 0x82000500, 0x0000ffff, - 0x4803c857, 0x8c00051e, 0x05020044, 0x80640480, - 0x05021042, 0x40640800, 0x405c1000, 0x0521f931, - 0x4803c857, 0x800001c0, 0x0502003c, 0x59e06802, - 0x8c34051e, 0x05020034, 0x4200c000, 0x7ff52045, - 0x805cc418, 0x8004c418, 0x05001034, 0x05000033, - 0x4863c857, 0x50600000, 0x82000500, 0x0000ffff, - 0x48035059, 0x8c00051e, 0x0502002c, 0x4803c857, - 0x80000c97, 0x05021029, 0x40601000, 0x80081000, - 0x50080800, 0x4807505a, 0x80081000, 0x50080800, - 0x4807505b, 0x4000b800, 0x8060c000, 0x50602000, - 0x82100500, 0xffff0000, 0x80000120, 0x82100d00, - 0x0000ffff, 0x4803c857, 0x4807c857, 0x05fdfd02, - 0x805cb840, 0x05fe07f5, 0x0501f016, 0x4803c856, - 0x42000000, 0x7ff52001, 0x5000b000, 0x8258b500, - 0xffff0000, 0x8058b124, 0x8258c400, 0x7ff52000, - 0xb060c400, 0x05fdf790, 0x8258c400, 0x7ff52000, - 0x05fdf7aa, 0x8258c400, 0x7ff52000, 0xb060c400, - 0x805cc418, 0x05fdf7cc, 0x4a035050, 0xdeaddead, - 0x5c00b000, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x1c01f000, 0x4867c857, 0x90640d20, 0x8004690a, - 0x82640d00, 0x00000400, 0x80040912, 0x80046d4d, - 0x90640d01, 0x800408c4, 0x80046d4d, 0x90640d02, - 0x800408c4, 0x80046d4d, 0x82640d00, 0x00000100, - 0x80040908, 0x80046d4d, 0x82640d00, 0x00000080, - 0x80040904, 0x80046d4d, 0xb0640d00, 0x80046d4d, - 0x82640d00, 0x00000200, 0x80040904, 0x80046d4d, - 0x8234cd00, 0x000000ff, 0x1c01f000, 0x050df9eb, - 0x0502000d, 0x4803c856, 0x4a03c014, 0x18001800, - 0x4a03c013, 0x18000800, 0x05fdfcb0, 0x4a03c013, - 0x18000000, 0x61a1d007, 0x0521f821, 0x4a03c013, - 0x18000800, 0x1c01f000, 0x050df9dc, 0x0502000d, - 0x4803c856, 0x4a03c014, 0x18001800, 0x4a03c013, - 0x18001800, 0x05fdfca1, 0x4a03c013, 0x18001000, - 0x61a1d007, 0x0521f812, 0x4a03c013, 0x18001800, - 0x1c01f000, 0x050df9cd, 0x0502000c, 0x60041800, - 0x42001000, 0x0010abd1, 0x60900800, 0x60002180, - 0x50080000, 0x82000500, 0x000000ff, 0x4803c857, - 0x050dfa64, 0x05f00d72, 0x1c01f000, 0x4803c856, - 0x59a80006, 0x8c00051e, 0x05020008, 0x61f2880f, - 0x42003000, 0x00fffffc, 0x0511fc8f, 0x05020007, - 0x0501f808, 0x05000005, 0x4a03501c, 0x0000ffff, - 0x90000541, 0x1c01f000, 0x80000580, 0x05fdf7fe, - 0x4937c857, 0x0529f8b4, 0x05000011, 0x4926601d, - 0x4936600a, 0x0535fa4c, 0x64066407, 0x417a7800, - 0x0511fc48, 0x600c0800, 0x0511fc51, 0x59a8001d, - 0x80000000, 0x4803501d, 0x599c0208, 0x48026c12, - 0x600a7000, 0x0005fc78, 0x90000541, 0x1c01f000, - 0x40681000, 0x0501f805, 0x60018800, 0x05000002, - 0x60058800, 0x1c01f000, 0x480bc857, 0x492fc857, - 0x4923c857, 0x4927c857, 0x4c5c0000, 0x4008b800, - 0x61f6880f, 0x42003000, 0x00fffffd, 0x0511fc62, - 0x0502001b, 0x5934000a, 0x84000544, 0x4802680a, - 0x0529f88d, 0x05000016, 0x4926601d, 0x4936600a, - 0x812e59c0, 0x05000006, 0x592c0405, 0x8c00051e, - 0x05000003, 0x48ee602d, 0x0501f004, 0x59a8021b, - 0x8400055c, 0x4803521b, 0x492e6009, 0x64066407, - 0x485e601e, 0x0535fa18, 0x608a7000, 0x0005fc78, - 0x90000541, 0x5c00b800, 0x1c01f000, 0x80000580, - 0x05fdf7fd, 0x4933c857, 0x59a8021b, 0x8c000508, - 0x05020010, 0x5930500a, 0x482bc857, 0x916c0582, - 0x0502000c, 0x0501f812, 0x0502000a, 0x58280403, - 0x82000580, 0x000007fc, 0x05000007, 0x59a80016, - 0x80000040, 0x4803c857, 0x05f01d0d, 0x48035016, - 0x1c01f000, 0x59a8001d, 0x80000040, 0x4803c857, - 0x05fc17fc, 0x4803501d, 0x1c01f000, 0x59300009, - 0x800001c0, 0x05020007, 0x59300403, 0x90000581, - 0x05020003, 0x90000541, 0x0501f002, 0x80000580, - 0x1c01f000, 0x4933c857, 0x493fc857, 0x4947c857, - 0x4927c857, 0x4d400000, 0x4d340000, 0x4d440000, - 0x4c580000, 0x0521fa80, 0x4df00000, 0x8060c1c0, - 0x05020003, 0x6004b000, 0x0501f003, 0x61c0b00f, - 0x417a8800, 0x41440000, 0x81ac0400, 0x50000000, - 0x80026d40, 0x0500001b, 0x59245005, 0x59340013, - 0x82000500, 0x00ffffff, 0x80280580, 0x05020015, - 0x4d3c0000, 0x60067800, 0x0511fefd, 0x5c027800, - 0x60a68000, 0x0201f800, 0x0010f051, 0x0201f800, - 0x0010f148, 0x0201f800, 0x0010f1e1, 0x0511ff80, - 0x05020005, 0x4937c857, 0x4a026c00, 0x00000404, - 0x0501f002, 0x0511ffaa, 0x0201f800, 0x0010f603, - 0x81468800, 0x8058b040, 0x05fe07df, 0x5c03e000, - 0x05200a41, 0x5c00b000, 0x5c028800, 0x5c026800, - 0x5c028000, 0x1c01f000, 0x4937c857, 0x4947c857, - 0x4c5c0000, 0x4c600000, 0x4c640000, 0x59a80073, - 0x8c000500, 0x0500001d, 0x599c0017, 0x8c00050a, - 0x0502001a, 0x5934ba02, 0x825cbd00, 0x000000ff, - 0x485fc857, 0x4178c000, 0x4178c800, 0x82600400, - 0x0010cc24, 0x50002000, 0x8060c1c0, 0x05000008, - 0x82100500, 0x000000ff, 0x82002d80, 0x000000ff, - 0x0500000a, 0x805c0580, 0x0500000a, 0x80102110, - 0x8064c800, 0x90640584, 0x05fe07f6, 0x8060c000, - 0x906005a0, 0x05fe07ed, 0x4813c857, 0x90000541, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x59a8021b, 0x8c000512, 0x05f20d53, 0x1c01f000, - 0x4c5c0000, 0x4c600000, 0x4c640000, 0x6004b000, - 0x42024800, 0x0010b111, 0x417a4000, 0x61fa880f, - 0x0515fcc9, 0x05000002, 0x0541fb50, 0x5924ba00, - 0x8c5c0500, 0x05000051, 0x83240d80, 0x0010b111, - 0x0502000f, 0x825cc500, 0x000000e0, 0x0502000c, - 0x0515fcbd, 0x05000004, 0x42000800, 0xffffff1d, - 0x0501fa62, 0x59a8021b, 0x82000500, 0xffffdafc, - 0x8400054e, 0x4803521b, 0x0501f006, 0x82600580, - 0x000000e0, 0x05020043, 0x8c5c050e, 0x0502003b, - 0x5924c809, 0x9064040e, 0x50000000, 0x4803c857, - 0x80026d40, 0x05000011, 0x0515fca7, 0x05000013, - 0x59340200, 0x8c00051a, 0x05020030, 0x59240805, - 0x80040910, 0x0500000d, 0x59a80018, 0x4803c857, - 0x4807c857, 0x80040580, 0x05000008, 0x4a026806, - 0xdeaddead, 0x0501f005, 0x42003000, 0x00fffffe, - 0x0511fb7d, 0x05020027, 0x0525ffab, 0x05000025, - 0x4936600a, 0x4926601d, 0x64066407, 0x417a7800, - 0x0511fb40, 0x0201f800, 0x0010ebe1, 0x600c0800, - 0x0511fb47, 0x0535f93c, 0x49235017, 0x4923c857, - 0x59240005, 0x82000500, 0x000000ff, 0x48024805, - 0x916c0583, 0x05000004, 0x59a80016, 0x80000000, - 0x48035016, 0x599c0208, 0x48026c12, 0x600a7000, - 0x0005fc78, 0x59240200, 0x82000500, 0xffffff9d, - 0x8400054e, 0x48024a00, 0x81224000, 0x91264c0b, - 0x8058b040, 0x05fe07aa, 0x4a035017, 0x0000ffff, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x4d300000, 0x4d440000, 0x4d340000, 0x61fa880f, - 0x42003000, 0x00fffffe, 0x0511fb4b, 0x0502001a, - 0x0525ff79, 0x05000018, 0x4927c857, 0x4923c857, - 0x497a6009, 0x4936600a, 0x4926601d, 0x64866429, - 0x64066407, 0x600c0800, 0x0511fb15, 0x599c0208, - 0x48026c12, 0x600a7000, 0x0005fc78, 0x497a4805, + 0x0501f952, 0x497b5044, 0x4803c856, 0x641b503e, + 0x60740800, 0x42001000, 0x0010172f, 0x0521f6f3, + 0x05f5fac3, 0x05f5fac2, 0x1c01f000, 0x4c000000, + 0x4c040000, 0x4c080000, 0x4c380000, 0x59a80040, + 0x90000c87, 0x05f61aba, 0x0c01f806, 0x5c007000, + 0x5c001000, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x00101743, 0x0010175f, 0x001017b0, 0x001017c5, + 0x001017d9, 0x001017e2, 0x001017e3, 0x0501f990, + 0x05020018, 0x59a81046, 0x60000800, 0x0501f9cb, + 0x90040d1c, 0x9004059c, 0x05000008, 0x90040598, + 0x05000008, 0x90040594, 0x05000008, 0x90040590, + 0x05000008, 0x05f5fa9e, 0x84081540, 0x0501f006, + 0x84081542, 0x0501f004, 0x84081544, 0x0501f002, + 0x84081546, 0x480b5046, 0x6407503e, 0x0501f003, + 0x0501f8be, 0x05fdff9d, 0x1c01f000, 0x0501f885, + 0x0500004f, 0x0501f972, 0x05020029, 0x60000800, + 0x0501f9ae, 0x59c41001, 0x82081500, 0x00018000, + 0x90040d1c, 0x90040590, 0x05000042, 0x90040594, + 0x05000006, 0x90040598, 0x0500000a, 0x9004059c, + 0x0500000a, 0x05f5fa7e, 0x90080580, 0x05000039, + 0x82080580, 0x00008000, 0x05000036, 0x0501f003, + 0x90080580, 0x05000033, 0x60000800, 0x0501f997, + 0x59a80046, 0x90040d1c, 0x90041594, 0x05000006, + 0x90041598, 0x05000006, 0x9004159c, 0x05000006, + 0x05f60a6b, 0x84000544, 0x0501f004, 0x84000542, + 0x0501f002, 0x84000540, 0x48035046, 0x59a80043, + 0x80000000, 0x48035043, 0x90000585, 0x05000003, + 0x0501f859, 0x0501f01d, 0x497b5043, 0x59c40801, + 0x82040d00, 0x00018000, 0x90040580, 0x0500000b, + 0x82040580, 0x00008000, 0x0500000a, 0x82040580, + 0x00010000, 0x05000009, 0x82040580, 0x00018000, + 0x05000008, 0x05f5fa4e, 0x60040000, 0x0501f006, + 0x60000000, 0x0501f004, 0x60080000, 0x0501f002, + 0x600c0000, 0x0501f8f7, 0x640b5040, 0x0501f003, + 0x640f503e, 0x0501f002, 0x05fdff59, 0x1c01f000, + 0x0501f834, 0x05000013, 0x59a80037, 0x80000040, + 0x48035037, 0x0501f91e, 0x05020004, 0x640f503e, + 0x497b503f, 0x0501f00b, 0x59a80037, 0x80000540, + 0x05020003, 0x0501f891, 0x0501f002, 0x0501f841, + 0x0501f829, 0x497b5043, 0x64075040, 0x05fdff44, + 0x1c01f000, 0x0501f81f, 0x05000012, 0x0501f90c, + 0x0502000d, 0x59a80044, 0x80000000, 0x48035044, + 0x90000587, 0x0502000a, 0x642b503a, 0x497b5047, + 0x59a80046, 0x8400055e, 0x48035046, 0x4803c857, + 0x0501f004, 0x0501f814, 0x64135040, 0x05fdff4f, + 0x1c01f000, 0x0501f80b, 0x05000007, 0x0501f8f8, + 0x05020003, 0x05fdff32, 0x0501f003, 0x0501f80a, + 0x05fdff46, 0x1c01f000, 0x05f5fa0d, 0x05f5fa0c, + 0x59a80038, 0x80000040, 0x48035038, 0x05000885, + 0x1c01f000, 0x4c040000, 0x60000800, 0x0501f927, + 0x90040d1c, 0x9004059c, 0x05000008, 0x90040598, + 0x0500000a, 0x90040594, 0x0500000a, 0x90040590, + 0x05000004, 0x05f5f9fa, 0x600c0000, 0x0501f006, + 0x60080000, 0x0501f004, 0x60040000, 0x0501f002, + 0x60000000, 0x0501f8a3, 0x5c000800, 0x1c01f000, + 0x4c040000, 0x59c40801, 0x82040d00, 0x00018000, + 0x90040580, 0x0500000b, 0x82040580, 0x00008000, + 0x0500000c, 0x82040580, 0x00010000, 0x0500000b, + 0x82040580, 0x00018000, 0x05000004, 0x05f5f9e0, + 0x600c0000, 0x0501f006, 0x60080000, 0x0501f004, + 0x60040000, 0x0501f002, 0x60000000, 0x0501f85f, + 0x5c000800, 0x1c01f000, 0x4c040000, 0x59a80043, + 0x80000000, 0x48035043, 0x90000585, 0x05020019, + 0x497b5043, 0x59c40801, 0x82040d00, 0x00018000, + 0x90040580, 0x0500000b, 0x82040580, 0x00008000, + 0x0500000c, 0x82040580, 0x00010000, 0x0500000b, + 0x82040580, 0x00018000, 0x05000004, 0x05f5f9c0, + 0x600c0000, 0x0501f006, 0x60080000, 0x0501f004, + 0x60040000, 0x0501f002, 0x60000000, 0x0501f83f, + 0x60000800, 0x0501f8d9, 0x90040d1c, 0x9004059c, + 0x05000008, 0x90040598, 0x0500000a, 0x90040594, + 0x0500000a, 0x90040590, 0x05000004, 0x05f5f9ac, + 0x600c0000, 0x0501f006, 0x60080000, 0x0501f004, + 0x60040000, 0x0501f002, 0x60000000, 0x0501f855, + 0x5c000800, 0x1c01f000, 0x4c200000, 0x59a80046, + 0x82000500, 0x00007fff, 0x05f4099d, 0x59a84045, + 0x80204102, 0x05f4199a, 0x48235045, 0x80204500, + 0x05fc07fb, 0x8c000506, 0x05020008, 0x8c000504, + 0x05020008, 0x8c000502, 0x05020008, 0x8c000500, + 0x05020008, 0x05f5f98e, 0x600c0000, 0x0501f006, + 0x60080000, 0x0501f004, 0x60000000, 0x0501f002, + 0x60040000, 0x0501f80d, 0x5c004000, 0x1c01f000, + 0x05011000, 0x4a03c840, 0x0010ae3e, 0x6427c842, + 0x40000000, 0x05fd17ff, 0x64235045, 0x6403503c, + 0x1c01f000, 0x40680000, 0x4c000000, 0x0501f967, + 0x5c000000, 0x0501fa82, 0x60080800, 0x0501f897, + 0x82041500, 0xffffffe3, 0x59c41801, 0x820c1d00, + 0xfffe7fff, 0x800001c0, 0x05000007, 0x90000d81, + 0x0502000a, 0x9008055c, 0x900c1d40, 0x840c1d32, + 0x0501f012, 0x90080558, 0x820c1d40, 0x00008000, + 0x840c1d32, 0x0501f00d, 0x90000d82, 0x05020006, + 0x90080554, 0x820c1d40, 0x00010000, 0x840c1d32, + 0x0501f006, 0x90000d83, 0x05f60959, 0x90080550, + 0x820c1d40, 0x02018000, 0x60080800, 0x0501f87f, + 0x480f8801, 0x0501f146, 0x1c01f000, 0x40680000, + 0x4c000000, 0x0501f938, 0x5c000000, 0x0501fa58, + 0x60000800, 0x0501f86d, 0x82041500, 0xffffffe3, + 0x59c41801, 0x800001c0, 0x05000006, 0x90000d81, + 0x05020007, 0x9008055c, 0x840c1d30, 0x0501f00d, + 0x90080558, 0x840c1d30, 0x0501f00a, 0x90000d82, + 0x05020004, 0x90080554, 0x840c1d30, 0x0501f005, + 0x90000d83, 0x05f60936, 0x90080550, 0x840c1d70, + 0x480f8801, 0x60000800, 0x0501f85c, 0x0501fa2e, + 0x0500000d, 0x4a03c014, 0x00200020, 0x60000800, + 0x0501f84e, 0x90040d1c, 0x90040590, 0x05020004, + 0x4a03c013, 0x00200020, 0x0501f003, 0x4a03c013, + 0x00200000, 0x0501f11d, 0x0501f805, 0x60058800, + 0x05000002, 0x60018800, 0x1c01f000, 0x4c580000, + 0x6050b000, 0x8058b040, 0x05000026, 0x59c4000d, + 0x8c000520, 0x05fe07fc, 0x0501f831, 0x59c4000d, + 0x8c000520, 0x05fe07f8, 0x59c40808, 0x82040d40, + 0x00000300, 0x48078808, 0x6120b001, 0x8058b040, + 0x05fe07ff, 0x6050b000, 0x8058b040, 0x05000015, + 0x59c4000d, 0x8c000520, 0x05020012, 0x0501f820, + 0x59c4000d, 0x8c000520, 0x0502000e, 0x6028b000, + 0x8058b040, 0x05000003, 0x0501f819, 0x05fdf7fd, + 0x6190b000, 0x59c4000d, 0x8c00051e, 0x05000005, + 0x8058b040, 0x05fe07fc, 0x80000580, 0x0501f002, + 0x90000541, 0x5c00b000, 0x1c01f000, 0x60080800, + 0x0501f812, 0x82040500, 0xfffffffe, 0x60080800, + 0x0501f816, 0x60000800, 0x0501f80c, 0x82040500, + 0xfffffffe, 0x60000800, 0x0501f010, 0x40000000, + 0x40000000, 0x40000000, 0x40000000, 0x40000000, + 0x1c01f000, 0x40680800, 0x4807880e, 0x59c4080f, + 0x82040d00, 0x000000ff, 0x40058800, 0x1c01f000, + 0x40680800, 0x406c0000, 0x900001c0, 0x80040d40, + 0x84040d40, 0x4807880e, 0x1c01f000, 0x82000d80, + 0x00200000, 0x05000009, 0x82000d80, 0x02000000, + 0x05000006, 0x82000d80, 0x01000000, 0x05000006, + 0x59c408a3, 0x0501f006, 0x59c408a3, 0x84040d30, + 0x0501f003, 0x59c408a3, 0x84040d32, 0x80040540, + 0x480388a3, 0x480788a3, 0x1c01f000, 0x59c400a3, + 0x84000556, 0x480388a3, 0x84000516, 0x480388a3, + 0x1c01f000, 0x485fc857, 0x4863c857, 0x4c640000, + 0x4d3c0000, 0x4d400000, 0x0525fb55, 0x48635009, + 0x40601800, 0x60002000, 0x0501f8b6, 0x42000000, + 0x0010b238, 0x0545f900, 0x82600500, 0x0000ff00, + 0x82000580, 0x0000f700, 0x05020004, 0x42000000, + 0x0010b220, 0x0545f8f8, 0x0545fa07, 0x05020085, + 0x82600d00, 0x0000ff00, 0x61fe41ff, 0x800409c0, + 0x0500001b, 0x82041580, 0x0000f700, 0x05000013, + 0x82041580, 0x0000f800, 0x05000010, 0x82041580, + 0x0000ff00, 0x6000c800, 0x05000029, 0x840439c0, + 0x0501fe32, 0x05020019, 0x83200400, 0x0010a3b3, + 0x50024800, 0x59240200, 0x8c000500, 0x05000013, + 0x6004c800, 0x0501f01e, 0x42024800, 0x0010b391, + 0x59240200, 0x8c000502, 0x0500000c, 0x59c410a3, + 0x82081500, 0x00008000, 0x05000008, 0x59c410a7, + 0x82081500, 0x0000ff00, 0x82081580, 0x0000ff00, + 0x6000c800, 0x0500000e, 0x8d0c0502, 0x05020007, + 0x8d0c0500, 0x0502000a, 0x599c1017, 0x8c08051a, + 0x0500004e, 0x850e1d42, 0x61fe41ff, 0x6008c800, + 0x60128000, 0x60227800, 0x0501f004, 0x850e1d40, + 0x60128000, 0x417a7800, 0x59a80005, 0x8c000502, + 0x05020004, 0x8d0c050a, 0x05020046, 0x850e1d4a, + 0x42000000, 0x0010b21f, 0x0545f8b3, 0x59a81809, + 0x604c1100, 0x050dfc38, 0x83200580, 0x0000ffff, + 0x05000018, 0x59240400, 0x8c000508, 0x05000009, + 0x417a7800, 0x4d300000, 0x417a6000, 0x0501fe2d, + 0x5c026000, 0x59240400, 0x8c00050a, 0x05020031, + 0x4d400000, 0x82600500, 0x000000ff, 0x61fe89ff, + 0x40643000, 0x603a8000, 0x0541f98b, 0x60040800, + 0x60001002, 0x0521fd1b, 0x5c028000, 0x0501f025, + 0x8d0c0520, 0x05000018, 0x4c580000, 0x42024800, + 0x0010b391, 0x0545f9ad, 0x4d400000, 0x59240200, + 0x8c000500, 0x05000004, 0x60040800, 0x60001002, + 0x0521fd0c, 0x91264c0b, 0x8058b040, 0x05fe07f8, + 0x603a8000, 0x61fe89ff, 0x40643000, 0x0541f972, + 0x5c028000, 0x5c00b000, 0x599c0817, 0x8c04050a, + 0x0502000c, 0x493fc857, 0x4943c857, 0x0201f800, + 0x0010edf3, 0x0501f007, 0x8d0c0520, 0x05000005, + 0x603e8000, 0x61fe89ff, 0x60003000, 0x0541f965, + 0x497b8880, 0x5c028000, 0x5c027800, 0x5c00c800, + 0x1c01f000, 0x60000800, 0x05fdff38, 0x90040542, + 0x60000800, 0x05fdf73d, 0x60080800, 0x05fdff33, + 0x90040542, 0x60080800, 0x05fdf738, 0x60080800, + 0x05fdff2e, 0x82040500, 0xfffffffd, 0x90000550, + 0x60080800, 0x05fdf731, 0x60000800, 0x05fdff27, + 0x82040500, 0xfffffffd, 0x90000550, 0x60000800, + 0x05fdf72a, 0x59c408a8, 0x05fdff19, 0x05fdff18, + 0x59c400a8, 0x80040d80, 0x05fe07fb, 0x1c01f000, + 0x59a80005, 0x8c000500, 0x05000008, 0x59a80008, + 0x8c000500, 0x05020005, 0x84000540, 0x48035008, + 0x60581100, 0x050dfbcc, 0x1c01f000, 0x1c01f000, + 0x59c40801, 0x82040d00, 0x00018000, 0x82040d80, + 0x00018000, 0x05000002, 0x84081518, 0x480b88a3, + 0x1c01f000, 0x42000800, 0x7ff4818e, 0x59e00002, + 0x8c00051e, 0x05020003, 0x42000800, 0x7ff4808e, + 0x58041800, 0x480f504f, 0x8c0c0500, 0x05020007, + 0x8c0c0502, 0x05000005, 0x58044001, 0x58042002, + 0x58041003, 0x0501f007, 0x42004000, 0x0003c014, + 0x42002000, 0x0003c014, 0x42001000, 0x0002e014, + 0x480b5049, 0x4813504a, 0x4823504b, 0x8c0c0500, + 0x05020007, 0x8c0c0504, 0x05000005, 0x58044004, + 0x58042005, 0x58041006, 0x0501f004, 0x60c8400d, + 0x60c8200d, 0x60c8100d, 0x480b504c, 0x4813504d, + 0x4823504e, 0x1c01f000, 0x59a8104c, 0x59a8204d, + 0x59a8404e, 0x60380840, 0x05fdfed8, 0x82040d00, + 0xffffffc0, 0x82200500, 0x003f0000, 0x80000120, + 0x80040540, 0x60380840, 0x05fdfed8, 0x60380848, + 0x05fdfece, 0x82040d00, 0xffffffc0, 0x82200500, + 0x0000fc00, 0x80000114, 0x80040540, 0x60380848, + 0x05fdfece, 0x82200500, 0x000003e0, 0x8000010a, + 0x603808d8, 0x05fdfec9, 0x9020051f, 0x603808f0, + 0x05fdfec6, 0x82100500, 0x003f0000, 0x80000120, + 0x60380908, 0x05fdfec1, 0x82100500, 0x0000fc00, + 0x80000114, 0x60380918, 0x05fdfebc, 0x82100500, + 0x000003e0, 0x8000010a, 0x603808e0, 0x05fdfeb7, + 0x9010051f, 0x603808f8, 0x05fdfeb4, 0x82080500, + 0x003f0000, 0x80000120, 0x60380910, 0x05fdfeaf, + 0x82080500, 0x0000fc00, 0x80000114, 0x60380920, + 0x05fdfeaa, 0x82080500, 0x000003e0, 0x8000010a, + 0x603808e8, 0x05fdfea5, 0x9008051f, 0x60380900, + 0x05fdfea2, 0x1c01f000, 0x59a81049, 0x59a8204a, + 0x59a8404b, 0x9020051f, 0x800000c2, 0x84000540, + 0x60480800, 0x05fdfe99, 0x82200500, 0x000001e0, + 0x80000908, 0x84040d40, 0x82200500, 0x00000600, + 0x80000106, 0x8400054a, 0x80040540, 0x60480830, + 0x05fdfe8e, 0x82200500, 0x00001800, 0x80000916, + 0x82200500, 0x0003e000, 0x80000114, 0x84000544, + 0x80040540, 0x60480848, 0x05fdfe84, 0x9010051f, + 0x800000c2, 0x84000540, 0x60480808, 0x05fdfe7f, + 0x82100500, 0x000001e0, 0x80000908, 0x84040d40, + 0x82100500, 0x00000600, 0x80000106, 0x8400054a, + 0x80040540, 0x60480838, 0x05fdfe74, 0x82100500, + 0x00001800, 0x80000916, 0x82100500, 0x0003e000, + 0x80000114, 0x84000544, 0x80040540, 0x60480850, + 0x05fdfe6a, 0x9008051f, 0x800000c2, 0x84000540, + 0x60480810, 0x05fdfe65, 0x82080500, 0x000001e0, + 0x80000908, 0x84040d40, 0x82080500, 0x00000600, + 0x80000106, 0x8400054a, 0x80040540, 0x60480840, + 0x05fdfe5a, 0x82080500, 0x00001800, 0x80000916, + 0x82080500, 0x0003e000, 0x80000114, 0x84000544, + 0x80040540, 0x60480858, 0x05fdfe50, 0x1c01f000, + 0x0501f805, 0x60058800, 0x05000002, 0x60018800, + 0x1c01f000, 0x4c000000, 0x050dfc26, 0x05020003, + 0x90000541, 0x0501f003, 0x59e00013, 0x8c00050e, + 0x5c000000, 0x1c01f000, 0x0501f805, 0x60058800, + 0x05000002, 0x60018800, 0x1c01f000, 0x4c140000, + 0x4a03c013, 0x03800300, 0x4a03c014, 0x03800380, + 0x60800801, 0x60281000, 0x0505fcc1, 0x05000002, + 0x8c14050c, 0x4a03c014, 0x03800000, 0x5c002800, + 0x1c01f000, 0x4c000000, 0x59a8004f, 0x8c000508, + 0x05020004, 0x90000541, 0x5c000000, 0x1c01f000, + 0x80000580, 0x05fdf7fd, 0x05fdfff7, 0x60058800, + 0x05000002, 0x60018800, 0x1c01f000, 0x4c5c0000, + 0x4000b800, 0x59a80048, 0x82000d80, 0xaabbccdd, + 0x0500000f, 0x90000c85, 0x05f21eed, 0x4c000000, + 0x050dfbd2, 0x5c000000, 0x05020003, 0x0c01f81a, + 0x0501f016, 0x4c000000, 0x050dfbe3, 0x5c000000, + 0x05fc07fb, 0x0c01f819, 0x0501f010, 0x05fdffde, + 0x0500000e, 0x8d0c051a, 0x0500000c, 0x05fdffbe, + 0x0502000a, 0x05fdffca, 0x05020005, 0x905c0d83, + 0x05020006, 0x6008b800, 0x0501f004, 0x905c0d81, + 0x05020002, 0x600cb800, 0x405c0000, 0x5c00b800, + 0x1c01f000, 0x00101b2b, 0x00101b2c, 0x00101b2d, + 0x00101b2e, 0x00101b32, 0x00101b33, 0x00101b35, + 0x00101b45, 0x00101b53, 0x00101b63, 0x1c01f000, + 0x1c01f000, 0x1c01f000, 0x905c0d83, 0x05020002, + 0x6008b800, 0x1c01f000, 0x1c01f000, 0x6004b800, + 0x1c01f000, 0x05fdffb8, 0x05000007, 0x05fdff9a, + 0x05020005, 0x05fdffa6, 0x05000003, 0x6000b800, + 0x0501f008, 0x905c0d83, 0x05020003, 0x6000b800, + 0x0501f004, 0x905c0d82, 0x05020002, 0x05f1feac, + 0x1c01f000, 0x05fdffa8, 0x0500000c, 0x05fdff8a, + 0x0502000a, 0x05fdff96, 0x05020005, 0x905c0d83, + 0x05020006, 0x6008b800, 0x0501f004, 0x905c0d81, + 0x05020002, 0x600cb800, 0x1c01f000, 0x05fdff9a, + 0x0500000b, 0x05fdff7c, 0x05020009, 0x05fdff88, + 0x05020002, 0x0501f006, 0x905c0d83, 0x05000006, + 0x905c0d81, 0x05000004, 0x0501f004, 0x905c0d83, + 0x05020002, 0x6008b800, 0x1c01f000, 0x05fdff8a, + 0x05000006, 0x05fdff6c, 0x05020004, 0x05fdff78, + 0x05020002, 0x0501f004, 0x905c0d81, 0x05020002, + 0x600cb800, 0x1c01f000, 0x4803c856, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x4c580000, 0x497b5050, + 0x4200c000, 0x7ff52000, 0x050dfb82, 0x05020007, + 0x4803c856, 0x4a03c014, 0x07e30000, 0x59e0c813, + 0x0501f8bb, 0x0501f014, 0x59a8005c, 0x82000d80, + 0x3261103c, 0x050200b1, 0x4803c856, 0x42000800, + 0x7ff481e6, 0x59e06802, 0x8c34051e, 0x05020003, + 0x42000800, 0x7ff480e6, 0x50040000, 0x4803c857, + 0x48035057, 0x8c00051e, 0x050000a4, 0x8200cd00, + 0x000000ff, 0x4867c857, 0x48675051, 0x50600800, + 0x48075052, 0x4807c857, 0x82040d80, 0x53434651, + 0x05020098, 0x8060c000, 0x50600800, 0x48075053, + 0x8060c000, 0x50600800, 0x48075054, 0x8060c000, + 0x50600800, 0x48075055, 0x8060c000, 0x50600800, + 0x82040d00, 0x0000ffff, 0x48075056, 0x4200c000, + 0x7ff52002, 0x5060b800, 0x825cbd00, 0xffff0000, + 0x805cb920, 0x805cb800, 0x05001082, 0x8c5c051e, + 0x05020080, 0x59e06802, 0x8c34051e, 0x0502006a, + 0x4803c856, 0x4200c000, 0x7ff52045, 0x50603000, + 0x82183500, 0x0000ffff, 0x05000011, 0x80180497, + 0x05021074, 0x8060c000, 0x50602000, 0x82100500, + 0xffff0000, 0x80000120, 0x82100d00, 0x0000ffff, + 0x4803c857, 0x4807c857, 0x4c180000, 0x05fdfd53, + 0x5c003000, 0x80183040, 0x05fe07f3, 0x41780800, + 0x40641000, 0x60100000, 0x0521fb30, 0x59e06802, + 0x8c34051e, 0x05020057, 0x4200c000, 0x7ff52005, + 0x8008c418, 0x5060c800, 0x800409c0, 0x0500000a, + 0x90041581, 0x05020003, 0x8064c910, 0x0501f006, + 0x90041582, 0x05020003, 0x8064c920, 0x0501f002, + 0x8064c930, 0x8264cd00, 0x000000ff, 0x4867c857, + 0x48675058, 0x42001000, 0x7ff52002, 0x50080000, + 0x82000500, 0x0000ffff, 0x4803c857, 0x8c00051e, + 0x05020044, 0x80640480, 0x05021042, 0x40640800, + 0x405c1000, 0x0521faf1, 0x4803c857, 0x800001c0, + 0x0502003c, 0x59e06802, 0x8c34051e, 0x05020034, + 0x4200c000, 0x7ff52045, 0x805cc418, 0x8004c418, + 0x05001034, 0x05000033, 0x4863c857, 0x50600000, + 0x82000500, 0x0000ffff, 0x48035059, 0x8c00051e, + 0x0502002c, 0x4803c857, 0x80000c97, 0x05021029, + 0x40601000, 0x80081000, 0x50080800, 0x4807505a, + 0x80081000, 0x50080800, 0x4807505b, 0x4000b800, + 0x8060c000, 0x50602000, 0x82100500, 0xffff0000, + 0x80000120, 0x82100d00, 0x0000ffff, 0x4803c857, + 0x4807c857, 0x05fdfd01, 0x805cb840, 0x05fe07f5, + 0x0501f016, 0x4803c856, 0x42000000, 0x7ff52001, + 0x5000b000, 0x8258b500, 0xffff0000, 0x8058b124, + 0x8258c400, 0x7ff52000, 0xb060c400, 0x05fdf790, + 0x8258c400, 0x7ff52000, 0x05fdf7aa, 0x8258c400, + 0x7ff52000, 0xb060c400, 0x805cc418, 0x05fdf7cc, + 0x4a035050, 0xdeaddead, 0x5c00b000, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4867c857, + 0x90640d20, 0x8004690a, 0x82640d00, 0x00000400, + 0x80040912, 0x80046d4d, 0x90640d01, 0x800408c4, + 0x80046d4d, 0x90640d02, 0x800408c4, 0x80046d4d, + 0x82640d00, 0x00000100, 0x80040908, 0x80046d4d, + 0x82640d00, 0x00000080, 0x80040904, 0x80046d4d, + 0xb0640d00, 0x80046d4d, 0x82640d00, 0x00000200, + 0x80040904, 0x80046d4d, 0x8234cd00, 0x000000ff, + 0x1c01f000, 0x050dfab4, 0x0502000d, 0x4803c856, + 0x4a03c014, 0x18001800, 0x4a03c013, 0x18000800, + 0x05fdfcaf, 0x4a03c013, 0x18000000, 0x61a1d007, + 0x0521f9e1, 0x4a03c013, 0x18000800, 0x1c01f000, + 0x050dfaa5, 0x0502000d, 0x4803c856, 0x4a03c014, + 0x18001800, 0x4a03c013, 0x18001800, 0x05fdfca0, + 0x4a03c013, 0x18001000, 0x61a1d007, 0x0521f9d2, + 0x4a03c013, 0x18001800, 0x1c01f000, 0x050dfa96, + 0x0502000c, 0x60041800, 0x42001000, 0x0010ae51, + 0x60900800, 0x60002180, 0x50080000, 0x82000500, + 0x000000ff, 0x4803c857, 0x050dfb2d, 0x05f00d70, + 0x1c01f000, 0x4803c856, 0x59a80006, 0x8c00051e, + 0x05020008, 0x61f2880f, 0x42003000, 0x00fffffc, + 0x0511fd63, 0x05020007, 0x0501f808, 0x05000005, + 0x4a03501c, 0x0000ffff, 0x90000541, 0x1c01f000, + 0x80000580, 0x05fdf7fe, 0x4937c857, 0x0529fa6a, + 0x05000011, 0x4926601d, 0x4936600a, 0x0535fc2b, + 0x64066407, 0x417a7800, 0x0511fd19, 0x600c0800, + 0x0511fd22, 0x59a8001d, 0x80000000, 0x4803501d, + 0x599c0208, 0x48026c12, 0x600a7000, 0x0005fc78, + 0x90000541, 0x1c01f000, 0x40681000, 0x0501f805, + 0x60018800, 0x05000002, 0x60058800, 0x1c01f000, + 0x480bc857, 0x492fc857, 0x4923c857, 0x4927c857, + 0x4c5c0000, 0x4008b800, 0x61f6880f, 0x42003000, + 0x00fffffd, 0x0511fd36, 0x0502001b, 0x5934000a, + 0x84000544, 0x4802680a, 0x0529fa43, 0x05000016, + 0x4926601d, 0x4936600a, 0x812e59c0, 0x05000006, + 0x592c0405, 0x8c00051e, 0x05000003, 0x48ee602d, + 0x0501f004, 0x59a8021b, 0x8400055c, 0x4803521b, + 0x492e6009, 0x64066407, 0x485e601e, 0x0535fbf7, + 0x608a7000, 0x0005fc78, 0x90000541, 0x5c00b800, + 0x1c01f000, 0x80000580, 0x05fdf7fd, 0x4933c857, + 0x59a8021b, 0x8c000508, 0x05020010, 0x5930500a, + 0x482bc857, 0x916c0582, 0x0502000c, 0x0501f815, + 0x0502000a, 0x58280403, 0x82000580, 0x000007fc, + 0x05000007, 0x59a80016, 0x80000040, 0x4803c857, + 0x05f01d0b, 0x48035016, 0x1c01f000, 0x59300429, + 0x900005a1, 0x05fc07fd, 0x59a8001d, 0x80000040, + 0x4803c857, 0x05fc17f9, 0x4803501d, 0x1c01f000, + 0x59300009, 0x800001c0, 0x05020007, 0x59300403, + 0x90000581, 0x05020003, 0x90000541, 0x0501f002, + 0x80000580, 0x1c01f000, 0x4933c857, 0x493fc857, + 0x4947c857, 0x4927c857, 0x4d400000, 0x4d340000, + 0x4d440000, 0x4c580000, 0x0521fc3d, 0x4df00000, + 0x8060c1c0, 0x05020003, 0x6004b000, 0x0501f003, + 0x61c0b00f, 0x417a8800, 0x41440000, 0x81ac0400, + 0x50000000, 0x80026d40, 0x0500001b, 0x59245005, + 0x59340013, 0x82000500, 0x00ffffff, 0x80280580, + 0x05020015, 0x4d3c0000, 0x60067800, 0x0511ffd2, + 0x5c027800, 0x60a68000, 0x0201f800, 0x0010f260, + 0x0201f800, 0x0010f344, 0x0201f800, 0x0010f3dd, + 0x0515f857, 0x05020005, 0x4937c857, 0x4a026c00, + 0x00000404, 0x0501f002, 0x0515f881, 0x0201f800, + 0x0010f7f5, 0x81468800, 0x8058b040, 0x05fe07df, + 0x5c03e000, 0x05200bfe, 0x5c00b000, 0x5c028800, + 0x5c026800, 0x5c028000, 0x1c01f000, 0x4937c857, + 0x4947c857, 0x4c5c0000, 0x4c600000, 0x4c640000, + 0x59a80073, 0x8c000500, 0x0500001d, 0x599c0017, + 0x8c00050a, 0x0502001a, 0x5934ba02, 0x825cbd00, + 0x000000ff, 0x485fc857, 0x4178c000, 0x4178c800, + 0x82600400, 0x0010cea4, 0x50002000, 0x8060c1c0, + 0x05000008, 0x82100500, 0x000000ff, 0x82002d80, + 0x000000ff, 0x0500000a, 0x805c0580, 0x0500000a, + 0x80102110, 0x8064c800, 0x90640584, 0x05fe07f6, + 0x8060c000, 0x906005a0, 0x05fe07ed, 0x4813c857, + 0x90000541, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x59a8021b, 0x8c000512, 0x05f20d4e, + 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x4c640000, + 0x4c500000, 0x6004b000, 0x42024800, 0x0010b391, + 0x417a4000, 0x61fa880f, 0x0541fe17, 0x05000020, + 0x0541fdf6, 0x5924ba00, 0x8c5c0500, 0x05000079, + 0x59a8a21b, 0x8c500506, 0x0500000d, 0x825c0500, + 0x000000e0, 0x82000580, 0x000000e0, 0x05000071, + 0x0501f87e, 0x59a80016, 0x4923c857, 0x4803c857, + 0x80000000, 0x48035016, 0x0501f06a, 0x8c5c051e, + 0x05000068, 0x4927c856, 0x6004b000, 0x825c0500, + 0x000000e1, 0x48024a00, 0x485fc857, 0x825cc500, + 0x000000e0, 0x0502001f, 0x0501f018, 0x0515fda7, + 0x05000002, 0x0541fdd9, 0x5924ba00, 0x8c5c0500, + 0x05000058, 0x0541fdf0, 0x05000005, 0x59a8021b, + 0x8c00050e, 0x05020013, 0x0501f004, 0x83240d80, + 0x0010b391, 0x0502000f, 0x825cc500, 0x000000e0, + 0x0502000c, 0x0515fd95, 0x05000004, 0x42000800, + 0xffffff1d, 0x0501fa91, 0x59a8021b, 0x82000500, + 0xffffdafc, 0x8400054e, 0x4803521b, 0x0501f006, + 0x82600580, 0x000000e0, 0x05020047, 0x8c5c050e, + 0x0502003c, 0x5924c809, 0x9064040e, 0x50000000, + 0x4803c857, 0x80026d40, 0x05000011, 0x0515fd7f, + 0x05000013, 0x59340200, 0x8c00051a, 0x05020031, + 0x59240805, 0x80040910, 0x0500000d, 0x59a80018, + 0x4803c857, 0x4807c857, 0x80040580, 0x05000008, + 0x4a026806, 0xdeaddead, 0x0501f005, 0x42003000, + 0x00fffffe, 0x0511fc26, 0x0502002b, 0x0529f936, + 0x05000029, 0x4936600a, 0x4926601d, 0x64066407, + 0x417a7800, 0x0511fbe6, 0x0201f800, 0x0010edee, + 0x600c0800, 0x0511fbed, 0x0535faf0, 0x49235017, + 0x4923c857, 0x59240005, 0x82000500, 0x000000ff, + 0x48024805, 0x916c0583, 0x05000004, 0x59a80016, + 0x80000000, 0x48035016, 0x599c0208, 0x48026c12, + 0x600a7000, 0x0005fc78, 0x59240200, 0x82000500, + 0xffffff9d, 0x8400054e, 0x8400055e, 0x48024a00, + 0x81224000, 0x91264c0b, 0x8058b040, 0x05000004, + 0x0541fd95, 0x05fe0780, 0x05fdf7a0, 0x4a035017, + 0x0000ffff, 0x5c00a000, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x4d300000, 0x4d440000, + 0x4d340000, 0x61fa880f, 0x42003000, 0x00fffffe, + 0x0511fbef, 0x0502001c, 0x0529f8ff, 0x0500001a, + 0x4927c857, 0x4923c857, 0x497a6009, 0x4936600a, + 0x4926601d, 0x64066407, 0x600c0800, 0x0511fbb7, + 0x599c0208, 0x48026c12, 0x600a7000, 0x0005fc78, + 0x59a80a1b, 0x8c040506, 0x05020002, 0x497a4805, 0x59240200, 0x82000500, 0xffffff9d, 0x8400054e, 0x48024a00, 0x5c026800, 0x5c028800, 0x5c026000, 0x1c01f000, 0x80000580, 0x05fdf7fb, 0x4d200000, 0x4d240000, 0x4c580000, 0x4d340000, 0x4d300000, - 0x4d3c0000, 0x4d380000, 0x4d440000, 0x0511fe05, - 0x05020009, 0x0515fc3c, 0x05000004, 0x59a8121b, - 0x8c080506, 0x05000003, 0x05fdff66, 0x0501f002, + 0x4d3c0000, 0x4d380000, 0x4d440000, 0x0511feab, + 0x05020009, 0x0515fd0d, 0x05000004, 0x59a8121b, + 0x8c080506, 0x05000003, 0x05fdff37, 0x0501f002, 0x0501f80a, 0x5c028800, 0x5c027000, 0x5c027800, 0x5c026000, 0x5c026800, 0x5c00b000, 0x5c024800, 0x5c024000, 0x1c01f000, 0x4803c856, 0x4c600000, - 0x0541fab2, 0x4200c000, 0x0010b10f, 0x50600000, + 0x0541fd2e, 0x4200c000, 0x0010b38f, 0x50600000, 0x82024580, 0x0000ffff, 0x05020004, 0x42024800, - 0x0010b111, 0x0501f008, 0x8058b480, 0x05000026, - 0x05001025, 0x40024000, 0x82000400, 0x0010a0ec, + 0x0010b391, 0x0501f008, 0x8058b480, 0x05000026, + 0x05001025, 0x40024000, 0x82000400, 0x0010a3b3, 0x50024800, 0x4520c000, 0x59240005, 0x82000500, 0x000000ff, 0x48024805, 0x59240200, 0x90000503, 0x90000583, 0x0502000e, 0x59240400, 0x8c000508, @@ -14711,19 +14778,19 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4923c857, 0x4c580000, 0x4c100000, 0x4c0c0000, 0x4c080000, 0x4c040000, 0x4d240000, 0x59243c08, 0x59a81817, 0x820c1580, 0x0000ffff, 0x05020002, - 0x60041800, 0x800c1104, 0x82082400, 0x0010cc24, - 0x50102000, 0x900c0503, 0x0c01f001, 0x00101e4f, - 0x00101e51, 0x00101e53, 0x00101e55, 0x40101000, + 0x60041800, 0x800c1104, 0x82082400, 0x0010cea4, + 0x50102000, 0x900c0503, 0x0c01f001, 0x00101e83, + 0x00101e85, 0x00101e87, 0x00101e89, 0x40101000, 0x0501f006, 0x80101110, 0x0501f004, 0x80101120, 0x0501f002, 0x80101130, 0x4c0c0000, 0x82080500, 0x000000ff, 0x801c0d80, 0x0500001c, 0x800001c0, 0x0500001a, 0x40000800, 0x82000580, 0x000000ff, - 0x0500001a, 0x0501f902, 0x05000014, 0x40040000, - 0x051df819, 0x0502001f, 0x0511fb20, 0x05000005, - 0x0201f800, 0x0010ebbd, 0x0500001a, 0x0501f00b, - 0x599c0019, 0x8c00050e, 0x05020008, 0x0511faa6, - 0x05020014, 0x0201f800, 0x0010ebe1, 0x0201f800, - 0x0010ecd0, 0x0500000f, 0x5c001800, 0x480f5017, + 0x0500001a, 0x0501f927, 0x05000014, 0x40040000, + 0x051df96e, 0x0502001f, 0x0511fbc2, 0x05000005, + 0x0201f800, 0x0010edbd, 0x0500001a, 0x0501f00b, + 0x599c0019, 0x8c00050e, 0x05020008, 0x0511fb48, + 0x05020014, 0x0201f800, 0x0010edee, 0x0201f800, + 0x0010eedf, 0x0500000f, 0x5c001800, 0x480f5017, 0x800c1800, 0x05fdf7cc, 0x5c001800, 0x4a035017, 0x0000ffff, 0x5c024800, 0x5c000800, 0x5c001000, 0x5c001800, 0x5c002000, 0x5c00b000, 0x1c01f000, @@ -14732,2436 +14799,2478 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x59243c08, 0x59a80017, 0x82001580, 0x0000ffff, 0x05020003, 0x4178a800, 0x0501f004, 0x8058b480, 0x05001021, 0x4000a800, 0x48575017, 0x8254bc00, - 0x00102013, 0x505cb800, 0x825cbd00, 0x000000ff, - 0x405c0800, 0x0501f8c6, 0x05000014, 0x405c0000, - 0x0519ffdd, 0x05020016, 0x0511fae4, 0x05000005, - 0x0201f800, 0x0010ebbd, 0x05000011, 0x0501f00b, - 0x599c0019, 0x8c00050e, 0x05020008, 0x0511fa6a, - 0x0502000b, 0x0201f800, 0x0010ebe1, 0x0201f800, - 0x0010ecd0, 0x05000006, 0x8054a800, 0x8058b040, + 0x001020b6, 0x505cb800, 0x825cbd00, 0x000000ff, + 0x405c0800, 0x0501f8eb, 0x05000014, 0x405c0000, + 0x051df932, 0x05020016, 0x0511fb86, 0x05000005, + 0x0201f800, 0x0010edbd, 0x05000011, 0x0501f00b, + 0x599c0019, 0x8c00050e, 0x05020008, 0x0511fb0c, + 0x0502000b, 0x0201f800, 0x0010edee, 0x0201f800, + 0x0010eedf, 0x05000006, 0x8054a800, 0x8058b040, 0x05fe07e2, 0x4a035017, 0x0000ffff, 0x5c00a800, 0x5c00b000, 0x5c00b800, 0x1c01f000, 0x4c580000, 0x4d440000, 0x61c0b00f, 0x80028d80, 0x0001fae7, - 0x05020019, 0x05fdfe6d, 0x05000017, 0x4937c857, - 0x0511fe28, 0x42026000, 0x00110284, 0x4936600a, + 0x05020019, 0x05fdfe3e, 0x05000017, 0x4937c857, + 0x0511fed0, 0x42026000, 0x001104b4, 0x4936600a, 0x497a6009, 0x4926601d, 0x417a7800, 0x0201f800, - 0x0010ec6c, 0x42000000, 0x0010b056, 0x0541f8c6, + 0x0010ee7a, 0x42000000, 0x0010b2d6, 0x0541fb42, 0x59240400, 0x8c00050a, 0x05020007, 0x41782800, - 0x60203000, 0x4d400000, 0x60a68000, 0x053df9c7, + 0x60203000, 0x4d400000, 0x60a68000, 0x053dfc2a, 0x5c028000, 0x81468800, 0x8058b040, 0x05fe07e4, - 0x5c028800, 0x5c00b000, 0x1c01f000, 0x4d200000, - 0x4d240000, 0x4c580000, 0x0541f9d0, 0x8058b040, - 0x05000014, 0x60064000, 0x42024800, 0x0010b11c, - 0x59a8021b, 0x8c000514, 0x05000012, 0x59240200, - 0x8c000510, 0x05020007, 0x59241200, 0x8c080500, - 0x05000004, 0x4923c856, 0x0501f812, 0x05000005, - 0x81224000, 0x91264c0b, 0x8058b040, 0x05fe07f4, + 0x5c028800, 0x5c00b000, 0x1c01f000, 0x4927c857, + 0x4c5c0000, 0x400cb800, 0x4d200000, 0x4d240000, + 0x4c580000, 0x0541fc49, 0x417a4000, 0x42024800, + 0x0010b391, 0x59240200, 0x8c000500, 0x0500000f, + 0x8c5c0508, 0x05000004, 0x8400055a, 0x48024a00, + 0x0501f00a, 0x82000500, 0x000000e0, 0x82000580, + 0x000000e0, 0x05000005, 0x4927c857, 0x4923c857, + 0x0501f838, 0x05000005, 0x81224000, 0x91264c0b, + 0x8058b040, 0x05fe07ec, 0x5c00b000, 0x5c024800, + 0x5c024000, 0x5c00b800, 0x1c01f000, 0x40681800, + 0x4d200000, 0x4d240000, 0x4c580000, 0x4c5c0000, + 0x400cb800, 0x485fc857, 0x0541fc24, 0x8058b040, + 0x05000017, 0x60064000, 0x42024800, 0x0010b39c, + 0x59a8021b, 0x8c000514, 0x05000016, 0x59241200, + 0x8c080510, 0x0502000a, 0x8c080500, 0x05000008, + 0x8c5c0508, 0x05000004, 0x8408155a, 0x480a4a00, + 0x0501f003, 0x0501f813, 0x05000005, 0x81224000, + 0x91264c0b, 0x8058b040, 0x05fe07f1, 0x5c00b800, 0x5c00b000, 0x5c024800, 0x5c024000, 0x1c01f000, 0x497a4805, 0x59240200, 0x90000501, 0x48024a00, - 0x91264c0b, 0x8058b040, 0x05fe07fa, 0x05fdf7f5, + 0x91264c0b, 0x8058b040, 0x05fe07fa, 0x05fdf7f4, 0x4927c857, 0x4923c857, 0x59a8021b, 0x8c000514, - 0x0500001d, 0x4c040000, 0x42000800, 0x0010b111, - 0x58040200, 0x8c00050c, 0x5c000800, 0x05000016, - 0x61fa880f, 0x42003000, 0x00fffffe, 0x0511fa02, - 0x05020011, 0x599c0208, 0x48026c12, 0x4d2c0000, - 0x417a5800, 0x0535f995, 0x5c025800, 0x0500000a, - 0x59a8007b, 0x80000000, 0x4803507b, 0x59240200, - 0x84000550, 0x84000512, 0x48024a00, 0x90000541, - 0x1c01f000, 0x80000580, 0x05fdf7fe, 0x4c580000, - 0x0541f98a, 0x417a4000, 0x42000800, 0x0010b111, - 0x5930001d, 0x80040580, 0x05000006, 0x81224000, - 0x90040c0b, 0x8058b040, 0x05fe07fa, 0x05f1fabc, - 0x4933c857, 0x4923c857, 0x5c00b000, 0x1c01f000, - 0x40683800, 0x4c580000, 0x0541f978, 0x417a4000, - 0x42024800, 0x0010b111, 0x59a8121b, 0x8c080508, - 0x0500000a, 0x821c0d80, 0x00fffffe, 0x0500001d, - 0x8c08050c, 0x0500001b, 0x59240005, 0x801c0580, - 0x05000018, 0x0501f014, 0x90080528, 0x05020005, - 0x59240005, 0x82000500, 0x000000ff, 0x0501f005, - 0x59240200, 0x8c000500, 0x05000004, 0x59240005, - 0x801c0580, 0x0500000b, 0x81224000, 0x91264c0b, - 0x8058b040, 0x05000004, 0x90080528, 0x05fe07f5, - 0x05fdf7f0, 0x61fe41ff, 0x90000541, 0x481fc856, - 0x4923c857, 0x5c00b000, 0x1c01f000, 0x4807c857, - 0x4c580000, 0x0541f94d, 0x42006800, 0x0010b111, - 0x58340005, 0x82000500, 0x000000ff, 0x80040580, - 0x05000005, 0x90346c0b, 0x8058b040, 0x05fe07f9, - 0x90000541, 0x5c00b000, 0x1c01f000, 0x4923c857, - 0x493fc857, 0x4c580000, 0x4d400000, 0x4d440000, - 0x4d340000, 0x4c5c0000, 0x0521f803, 0x4df00000, - 0x61c0b00f, 0x417a8800, 0x83440400, 0x0010a380, - 0x50000000, 0x80026d40, 0x05000021, 0x59340013, - 0x80000130, 0x81200580, 0x0502001d, 0x60a68000, - 0x833c0500, 0x00004000, 0x051e0eab, 0x0201f800, - 0x0010f051, 0x0201f800, 0x0010f148, 0x0201f800, - 0x0010f1e1, 0x0201f800, 0x0010f603, 0x8d3c051c, - 0x05000004, 0x41240800, 0x0511fd75, 0x0501f00c, - 0x8d3c0506, 0x05000004, 0x59340200, 0x8c00050e, - 0x05020007, 0x4937c857, 0x4a026c00, 0x00000707, - 0x59240400, 0x8c00050a, 0x050e0f1d, 0x81468800, - 0x8058b040, 0x05fe07d9, 0x8d3c0502, 0x0500001b, - 0x6040b000, 0x5924b809, 0x505c0000, 0x80026d40, - 0x05000013, 0x59368c03, 0x833c0500, 0x00004000, - 0x051e0e85, 0x0201f800, 0x0010f051, 0x0201f800, - 0x0010f148, 0x0201f800, 0x0010f1e1, 0x0201f800, - 0x0010f603, 0x8d3c051c, 0x05020003, 0x050dff04, - 0x0501f003, 0x41240800, 0x0511fd4d, 0x805cb800, - 0x8058b040, 0x05fe07e9, 0x4d300000, 0x61fe89ff, - 0x42026000, 0x00110284, 0x497a600a, 0x4926601d, - 0x60a68000, 0x0201f800, 0x0010f051, 0x0201f800, - 0x0010f603, 0x5c026000, 0x5c03e000, 0x051c0f9a, + 0x05000016, 0x61fa880f, 0x42003000, 0x00fffffe, + 0x0511fa7f, 0x05020011, 0x599c0208, 0x48026c12, + 0x4d2c0000, 0x417a5800, 0x0535fb1d, 0x5c025800, + 0x0500000a, 0x59a8007b, 0x80000000, 0x4803507b, + 0x59240200, 0x84000550, 0x84000512, 0x48024a00, + 0x90000541, 0x1c01f000, 0x80000580, 0x05fdf7fe, + 0x4c580000, 0x0541fbe1, 0x417a4000, 0x42000800, + 0x0010b391, 0x5930001d, 0x80040580, 0x05000006, + 0x81224000, 0x90040c0b, 0x8058b040, 0x05fe07fa, + 0x05f1fa63, 0x4933c857, 0x4923c857, 0x5c00b000, + 0x1c01f000, 0x40683800, 0x4c580000, 0x0541fbcf, + 0x417a4000, 0x42024800, 0x0010b391, 0x59a8121b, + 0x8c080508, 0x0500000a, 0x821c0d80, 0x00fffffe, + 0x0500001d, 0x8c08050c, 0x0500001b, 0x59240005, + 0x801c0580, 0x05000018, 0x0501f014, 0x90080528, + 0x05020005, 0x59240005, 0x82000500, 0x000000ff, + 0x0501f005, 0x59240200, 0x8c000500, 0x05000004, + 0x59240005, 0x801c0580, 0x0500000b, 0x81224000, + 0x91264c0b, 0x8058b040, 0x05000004, 0x90080528, + 0x05fe07f5, 0x05fdf7f0, 0x61fe41ff, 0x90000541, + 0x481fc856, 0x4923c857, 0x5c00b000, 0x1c01f000, + 0x4807c857, 0x4c580000, 0x0541fba4, 0x42006800, + 0x0010b391, 0x58340005, 0x82000500, 0x000000ff, + 0x80040580, 0x05000005, 0x90346c0b, 0x8058b040, + 0x05fe07f9, 0x90000541, 0x5c00b000, 0x1c01f000, + 0x4923c857, 0x493fc857, 0x4c580000, 0x4d400000, + 0x4d440000, 0x4d340000, 0x4c5c0000, 0x0521f96c, + 0x4df00000, 0x61c0b00f, 0x417a8800, 0x83440400, + 0x0010a600, 0x50000000, 0x80026d40, 0x05000022, + 0x59340013, 0x80000130, 0x81200580, 0x0502001e, + 0x60a68000, 0x833c0500, 0x00004000, 0x05220814, + 0x0201f800, 0x0010f260, 0x0201f800, 0x0010f344, + 0x0201f800, 0x0010f3dd, 0x0201f800, 0x0010f7f5, + 0x8d3c051c, 0x05000004, 0x41240800, 0x0511fdf8, + 0x0501f00d, 0x8d3c0506, 0x05000004, 0x59340200, + 0x8c00050e, 0x05020008, 0x4937c857, 0x497a6c0b, + 0x4a026c00, 0x00000707, 0x59240400, 0x8c00050a, + 0x050e0f96, 0x81468800, 0x8058b040, 0x05fe07d8, + 0x8d3c0502, 0x0500001b, 0x6040b000, 0x5924b809, + 0x505c0000, 0x80026d40, 0x05000013, 0x59368c03, + 0x833c0500, 0x00004000, 0x051e0fed, 0x0201f800, + 0x0010f260, 0x0201f800, 0x0010f344, 0x0201f800, + 0x0010f3dd, 0x0201f800, 0x0010f7f5, 0x8d3c051c, + 0x05020003, 0x050dff7d, 0x0501f003, 0x41240800, + 0x0511fdcf, 0x805cb800, 0x8058b040, 0x05fe07e9, + 0x4d300000, 0x61fe89ff, 0x42026000, 0x001104b4, + 0x4a02600a, 0x0010ce8f, 0x0515f858, 0x4926601d, + 0x60a68000, 0x0201f800, 0x0010f260, 0x0201f800, + 0x0010f7f5, 0x5c026000, 0x5c03e000, 0x05200900, 0x5c00b800, 0x5c026800, 0x5c028800, 0x5c028000, 0x5c00b000, 0x1c01f000, 0x4807c857, 0x4c580000, - 0x0541f8da, 0x42001000, 0x0010b111, 0x58080200, + 0x0541fb2e, 0x42001000, 0x0010b391, 0x58080200, 0x80040500, 0x48001200, 0x9008140b, 0x8058b040, 0x05fe07fb, 0x5c00b000, 0x1c01f000, 0x4803c856, 0x4d440000, 0x4d340000, 0x4c580000, 0x4c5c0000, 0x6040b000, 0x61c2880f, 0x5924b809, 0x83440580, 0x000007fe, 0x05000005, 0x505e6800, 0x813669c0, - 0x05000002, 0x050dfece, 0x81468800, 0x805cb800, + 0x05000002, 0x050dff45, 0x81468800, 0x805cb800, 0x8058b040, 0x05fe07f6, 0x5c00b800, 0x5c00b000, 0x5c026800, 0x5c028800, 0x1c01f000, 0x4923c857, - 0x61fa880f, 0x42003000, 0x00fffffe, 0x0511f916, + 0x61fa880f, 0x42003000, 0x00fffffe, 0x0511f990, 0x05020011, 0x599c0208, 0x48026c12, 0x4d2c0000, - 0x417a5800, 0x0535f8a9, 0x5c025800, 0x0500000a, + 0x417a5800, 0x0535fa2e, 0x5c025800, 0x0500000a, 0x59a8007b, 0x80000000, 0x4803507b, 0x59240200, 0x84000550, 0x84000512, 0x48024a00, 0x90000541, - 0x1c01f000, 0x80000580, 0x05fdf7fe, 0x00007eef, - 0x00007de8, 0x00007ce4, 0x000080e2, 0x00007be1, - 0x000080e0, 0x000080dc, 0x000080da, 0x00007ad9, - 0x000080d6, 0x000080d5, 0x000080d4, 0x000080d3, - 0x000080d2, 0x000080d1, 0x000079ce, 0x000078cd, - 0x000080cc, 0x000080cb, 0x000080ca, 0x000080c9, - 0x000080c7, 0x000080c6, 0x000077c5, 0x000076c3, - 0x000080bc, 0x000080ba, 0x000075b9, 0x000080b6, - 0x000074b5, 0x000073b4, 0x000072b3, 0x000080b2, - 0x000080b1, 0x000080ae, 0x000071ad, 0x000080ac, - 0x000070ab, 0x00006faa, 0x00006ea9, 0x000080a7, - 0x00006da6, 0x00006ca5, 0x00006ba3, 0x00006a9f, - 0x0000699e, 0x0000689d, 0x0000809b, 0x00008098, - 0x00006797, 0x00006690, 0x0000658f, 0x00006488, - 0x00006384, 0x00006282, 0x00008081, 0x00008080, - 0x0000617c, 0x0000607a, 0x00008079, 0x00005f76, - 0x00008075, 0x00008074, 0x00008073, 0x00008072, - 0x00008071, 0x0000806e, 0x00005e6d, 0x0000806c, - 0x00005d6b, 0x00005c6a, 0x00005b69, 0x00008067, - 0x00005a66, 0x00005965, 0x00005863, 0x0000575c, - 0x0000565a, 0x00005559, 0x00008056, 0x00008055, - 0x00005454, 0x00005353, 0x00005252, 0x00005151, - 0x0000504e, 0x00004f4d, 0x0000804c, 0x0000804b, - 0x00004e4a, 0x00004d49, 0x00008047, 0x00004c46, - 0x00008045, 0x00008043, 0x0000803c, 0x0000803a, - 0x00008039, 0x00008036, 0x00004b35, 0x00008034, - 0x00004a33, 0x00004932, 0x00004831, 0x0000802e, - 0x0000472d, 0x0000462c, 0x0000452b, 0x0000442a, - 0x00004329, 0x00004227, 0x00008026, 0x00008025, - 0x00004123, 0x0000401f, 0x00003f1e, 0x00003e1d, - 0x00003d1b, 0x00003c18, 0x00008017, 0x00008010, - 0x00003b0f, 0x00003a08, 0x00008004, 0x00003902, - 0x00008001, 0x00008000, 0x00008000, 0x00003800, - 0x00003700, 0x00003600, 0x00008000, 0x00003500, - 0x00008000, 0x00008000, 0x00008000, 0x00003400, + 0x1c01f000, 0x80000580, 0x05fdf7fe, 0x4923c857, + 0x4d300000, 0x4d440000, 0x61fa880f, 0x42003000, + 0x00fffffe, 0x0511f976, 0x0502001b, 0x0525fe86, + 0x05000019, 0x497a6009, 0x4936600a, 0x4926601d, + 0x64066407, 0x600c0800, 0x0511f940, 0x599c0208, + 0x48026c12, 0x600a7000, 0x0005fc78, 0x59240200, + 0x4927c857, 0x82000500, 0xffffff9d, 0x8400054e, + 0x48024a00, 0x59a8021b, 0x82000500, 0xffffdafc, + 0x8400054e, 0x4803521b, 0x5c028800, 0x5c026000, + 0x1c01f000, 0x80000580, 0x05fdf7fc, 0x4c580000, + 0x0541face, 0x485bc857, 0x41782800, 0x42002000, + 0x0010b391, 0x58100200, 0x90000503, 0x90000583, + 0x05020003, 0x90000541, 0x0501f005, 0x80142800, + 0x9010240b, 0x8058b040, 0x05fe07f7, 0x5c00b000, + 0x1c01f000, 0x0501f805, 0x60018800, 0x05000002, + 0x60058800, 0x1c01f000, 0x4c580000, 0x0541fab7, + 0x42001000, 0x0010b391, 0x58080200, 0x8c00051a, + 0x05020004, 0x9008140b, 0x8058b040, 0x05fe07fb, + 0x5c00b000, 0x1c01f000, 0x00007eef, 0x00007de8, + 0x00007ce4, 0x000080e2, 0x00007be1, 0x000080e0, + 0x000080dc, 0x000080da, 0x00007ad9, 0x000080d6, + 0x000080d5, 0x000080d4, 0x000080d3, 0x000080d2, + 0x000080d1, 0x000079ce, 0x000078cd, 0x000080cc, + 0x000080cb, 0x000080ca, 0x000080c9, 0x000080c7, + 0x000080c6, 0x000077c5, 0x000076c3, 0x000080bc, + 0x000080ba, 0x000075b9, 0x000080b6, 0x000074b5, + 0x000073b4, 0x000072b3, 0x000080b2, 0x000080b1, + 0x000080ae, 0x000071ad, 0x000080ac, 0x000070ab, + 0x00006faa, 0x00006ea9, 0x000080a7, 0x00006da6, + 0x00006ca5, 0x00006ba3, 0x00006a9f, 0x0000699e, + 0x0000689d, 0x0000809b, 0x00008098, 0x00006797, + 0x00006690, 0x0000658f, 0x00006488, 0x00006384, + 0x00006282, 0x00008081, 0x00008080, 0x0000617c, + 0x0000607a, 0x00008079, 0x00005f76, 0x00008075, + 0x00008074, 0x00008073, 0x00008072, 0x00008071, + 0x0000806e, 0x00005e6d, 0x0000806c, 0x00005d6b, + 0x00005c6a, 0x00005b69, 0x00008067, 0x00005a66, + 0x00005965, 0x00005863, 0x0000575c, 0x0000565a, + 0x00005559, 0x00008056, 0x00008055, 0x00005454, + 0x00005353, 0x00005252, 0x00005151, 0x0000504e, + 0x00004f4d, 0x0000804c, 0x0000804b, 0x00004e4a, + 0x00004d49, 0x00008047, 0x00004c46, 0x00008045, + 0x00008043, 0x0000803c, 0x0000803a, 0x00008039, + 0x00008036, 0x00004b35, 0x00008034, 0x00004a33, + 0x00004932, 0x00004831, 0x0000802e, 0x0000472d, + 0x0000462c, 0x0000452b, 0x0000442a, 0x00004329, + 0x00004227, 0x00008026, 0x00008025, 0x00004123, + 0x0000401f, 0x00003f1e, 0x00003e1d, 0x00003d1b, + 0x00003c18, 0x00008017, 0x00008010, 0x00003b0f, + 0x00003a08, 0x00008004, 0x00003902, 0x00008001, + 0x00008000, 0x00008000, 0x00003800, 0x00003700, + 0x00003600, 0x00008000, 0x00003500, 0x00008000, + 0x00008000, 0x00008000, 0x00003400, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00008000, 0x00003300, 0x00003200, + 0x00008000, 0x00003300, 0x00003200, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00008000, 0x00003100, 0x00003000, - 0x00008000, 0x00008000, 0x00002f00, 0x00008000, - 0x00002e00, 0x00002d00, 0x00002c00, 0x00008000, - 0x00008000, 0x00008000, 0x00002b00, 0x00008000, - 0x00002a00, 0x00002900, 0x00002800, 0x00008000, - 0x00002700, 0x00002600, 0x00002500, 0x00002400, - 0x00002300, 0x00002200, 0x00008000, 0x00008000, - 0x00002100, 0x00002000, 0x00001f00, 0x00001e00, - 0x00001d00, 0x00001c00, 0x00008000, 0x00008000, - 0x00001b00, 0x00001a00, 0x00008000, 0x00001900, + 0x00008000, 0x00003100, 0x00003000, 0x00008000, + 0x00008000, 0x00002f00, 0x00008000, 0x00002e00, + 0x00002d00, 0x00002c00, 0x00008000, 0x00008000, + 0x00008000, 0x00002b00, 0x00008000, 0x00002a00, + 0x00002900, 0x00002800, 0x00008000, 0x00002700, + 0x00002600, 0x00002500, 0x00002400, 0x00002300, + 0x00002200, 0x00008000, 0x00008000, 0x00002100, + 0x00002000, 0x00001f00, 0x00001e00, 0x00001d00, + 0x00001c00, 0x00008000, 0x00008000, 0x00001b00, + 0x00001a00, 0x00008000, 0x00001900, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00008000, 0x00001800, 0x00008000, - 0x00001700, 0x00001600, 0x00001500, 0x00008000, - 0x00001400, 0x00001300, 0x00001200, 0x00001100, - 0x00001000, 0x00000f00, 0x00008000, 0x00008000, - 0x00000e00, 0x00000d00, 0x00000c00, 0x00000b00, - 0x00000a00, 0x00000900, 0x00008000, 0x00008000, - 0x00000800, 0x00000700, 0x00008000, 0x00000600, - 0x00008000, 0x00008000, 0x00008000, 0x00000500, - 0x00000400, 0x00000300, 0x00008000, 0x00000200, - 0x00008000, 0x00008000, 0x00008000, 0x00000100, + 0x00008000, 0x00001800, 0x00008000, 0x00001700, + 0x00001600, 0x00001500, 0x00008000, 0x00001400, + 0x00001300, 0x00001200, 0x00001100, 0x00001000, + 0x00000f00, 0x00008000, 0x00008000, 0x00000e00, + 0x00000d00, 0x00000c00, 0x00000b00, 0x00000a00, + 0x00000900, 0x00008000, 0x00008000, 0x00000800, + 0x00000700, 0x00008000, 0x00000600, 0x00008000, + 0x00008000, 0x00008000, 0x00000500, 0x00000400, + 0x00000300, 0x00008000, 0x00000200, 0x00008000, + 0x00008000, 0x00008000, 0x00000100, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00008000, 0x00000000, 0x00008000, + 0x00008000, 0x00000000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, - 0x00008000, 0x00008000, 0x00008000, 0x05f1fc56, - 0x05f008db, 0x492f4017, 0x1c01f000, 0x91a0ac07, - 0x83a00580, 0x0010ac19, 0x05000008, 0x492fc857, - 0x812e59c0, 0x05f008d2, 0x912ca407, 0x6034b000, - 0x053dff40, 0x0501f00d, 0x6040b000, 0x91e0a420, - 0x50500000, 0x8050a000, 0x50500800, 0x900409c0, - 0x80040540, 0x4400a800, 0x8050a000, 0x8054a800, - 0x8058b040, 0x05fe07f7, 0x1c01f000, 0x59a00207, - 0xb0000cbf, 0x050210be, 0x0c01f001, 0x001021b9, - 0x001021ef, 0x001021ef, 0x00102239, 0x0010224e, - 0x001021ef, 0x001021b9, 0x00102263, 0x00102274, - 0x001021ef, 0x001021ef, 0x00102289, 0x001022a7, - 0x001022c5, 0x001021ef, 0x001022e2, 0x001021ef, - 0x001021ef, 0x00102302, 0x001021ef, 0x001023b5, - 0x001021ef, 0x001021ef, 0x001021ef, 0x001021ef, - 0x001023dc, 0x00102433, 0x001021ef, 0x001021ef, - 0x001021ef, 0x001021ef, 0x001021ef, 0x0010247f, - 0x001021ef, 0x001024c7, 0x001021ef, 0x001021ef, - 0x001021ef, 0x001021ef, 0x001024cc, 0x001025c6, - 0x001021ef, 0x001025cd, 0x001021ef, 0x001021ef, - 0x001021ef, 0x001021ef, 0x001021ef, 0x001025ce, - 0x00102656, 0x001027f4, 0x00102800, 0x001021ef, - 0x001021ef, 0x001021ef, 0x001021ef, 0x00102813, - 0x001021ef, 0x001021ef, 0x001021ef, 0x001021ef, - 0x001021ef, 0x001021ef, 0x001021ef, 0x00102837, - 0x00102875, 0x001028b9, 0x001028d0, 0x0010e415, - 0x0010ea14, 0x0010290f, 0x001021ef, 0x00102d9e, - 0x00102a54, 0x00102a8d, 0x001021ef, 0x001021ef, - 0x001021ef, 0x001021ef, 0x001021ef, 0x001021ef, - 0x001021ef, 0x001021ef, 0x00102aa8, 0x00102b05, - 0x001021ef, 0x001021ef, 0x00102b61, 0x001021ef, - 0x00102bdd, 0x00102c61, 0x001021ef, 0x001021ef, - 0x00102cd0, 0x00102d5a, 0x001021ef, 0x00102d9e, - 0x00102fe4, 0x001021ef, 0x00102ff3, 0x0010306d, - 0x001021ef, 0x001021ef, 0x001021ef, 0x001021ef, - 0x001030bc, 0x001030d6, 0x001030ef, 0x001021ef, - 0x00103165, 0x001021ef, 0x001021ef, 0x001031a3, - 0x001021ef, 0x001031c7, 0x001021ef, 0x001021ef, - 0x0010321b, 0x00103350, 0x001021ef, 0x001021ef, - 0x001021ef, 0x001021ef, 0x001021ef, 0x00103392, - 0x00103412, 0x001021ef, 0x48efc857, 0x4031d800, - 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x0500003b, 0x48efc857, 0x4a034207, 0x00004000, - 0x0509fb1c, 0x83a00580, 0x0010ac19, 0x0500000b, - 0x58ee5809, 0x4d2c0000, 0x0501f850, 0x41a25800, - 0x05f1fbc8, 0x40ee5800, 0x05f1fbc6, 0x5c025800, - 0x492fc857, 0x0001f35b, 0x05026007, 0x59a0001e, - 0x84000542, 0x4803401e, 0x4a01d808, 0x001021ca, - 0x1c01f000, 0x59a00207, 0x82000d80, 0x00004000, - 0x05000005, 0x900001c0, 0x90000551, 0x4803c011, - 0x0501f004, 0x900001c0, 0x90000550, 0x4803c011, - 0x0501f844, 0x59e00017, 0x8c00050a, 0x60000800, - 0x0002088c, 0x8d0c0530, 0x05fa0881, 0x000209af, - 0x6403c017, 0x4203e000, 0x30000001, 0x4203e000, - 0x40000000, 0x40ee5800, 0x05f1fba2, 0x59a0001e, - 0x84000504, 0x4803401e, 0x1c01f000, 0x4803c856, - 0x4a034207, 0x00004001, 0x05fdf7ca, 0x4803c856, - 0x4a034207, 0x00004002, 0x05fdf7c6, 0x4803c856, - 0x4a034207, 0x00004003, 0x05fdf7c2, 0x4803c856, - 0x4a034207, 0x00004005, 0x05fdf7be, 0x4803c856, - 0x4a034207, 0x00004006, 0x05fdf7ba, 0x4803c856, - 0x4a034207, 0x0000400b, 0x05fdf7b6, 0x4803c856, - 0x4a034207, 0x0000400c, 0x05fdf7b2, 0x4803c856, - 0x4a034207, 0x0000400c, 0x05fdf7ae, 0x4a034207, - 0x00004020, 0x05fdf7ab, 0x4c580000, 0x4c500000, - 0x4c540000, 0x58eca809, 0x8054a9c0, 0x05ec0fd8, - 0x91a0a407, 0x9054ac07, 0x6034b000, 0x053dfe45, + 0x00008000, 0x00008000, 0x05f1fbb3, 0x05f00838, + 0x492f4017, 0x1c01f000, 0x91a0ac07, 0x83a00580, + 0x0010ae99, 0x05000008, 0x492fc857, 0x812e59c0, + 0x05f0082f, 0x912ca407, 0x6034b000, 0x0541f94d, + 0x0501f00d, 0x6040b000, 0x91e0a420, 0x50500000, + 0x8050a000, 0x50500800, 0x900409c0, 0x80040540, + 0x4400a800, 0x8050a000, 0x8054a800, 0x8058b040, + 0x05fe07f7, 0x1c01f000, 0x59a00207, 0xb0000cbf, + 0x050210be, 0x0c01f001, 0x0010225c, 0x00102292, + 0x00102292, 0x001022dc, 0x001022f1, 0x00102292, + 0x0010225c, 0x00102306, 0x00102317, 0x00102292, + 0x00102292, 0x0010232f, 0x0010234d, 0x0010236b, + 0x00102292, 0x00102388, 0x00102292, 0x00102292, + 0x001023a8, 0x00102292, 0x0010245b, 0x00102292, + 0x00102292, 0x00102292, 0x00102292, 0x00102482, + 0x001024d9, 0x00102292, 0x00102292, 0x00102292, + 0x00102292, 0x00102292, 0x00102525, 0x00102292, + 0x0010256d, 0x00102292, 0x00102292, 0x00102292, + 0x00102292, 0x00102572, 0x0010266c, 0x00102292, + 0x00102673, 0x00102292, 0x00102292, 0x00102292, + 0x00102292, 0x00102292, 0x00102674, 0x001026fc, + 0x0010289a, 0x001028a6, 0x00102292, 0x00102292, + 0x00102292, 0x00102292, 0x001028b9, 0x00102292, + 0x00102292, 0x00102292, 0x00102292, 0x00102292, + 0x00102292, 0x00102292, 0x001028dd, 0x0010291b, + 0x0010295f, 0x00102976, 0x0010e615, 0x0010ec14, + 0x001029b5, 0x00102292, 0x00102e44, 0x00102afa, + 0x00102b33, 0x00102292, 0x00102292, 0x00102292, + 0x00102292, 0x00102292, 0x00102292, 0x00102292, + 0x00102292, 0x00102b4e, 0x00102bab, 0x00102292, + 0x00102292, 0x00102c07, 0x00102292, 0x00102c83, + 0x00102d07, 0x00102292, 0x00102292, 0x00102d76, + 0x00102e00, 0x00102292, 0x00102e44, 0x001030af, + 0x00102292, 0x001030be, 0x00103138, 0x00102292, + 0x00102292, 0x00102292, 0x00102292, 0x00103187, + 0x001031a1, 0x001031ba, 0x00102292, 0x00103230, + 0x00102292, 0x00102292, 0x0010326e, 0x00102292, + 0x00103292, 0x00102292, 0x00102292, 0x001032e6, + 0x0010341b, 0x00102292, 0x00102292, 0x00102292, + 0x00102292, 0x00102292, 0x0010345d, 0x001034dd, + 0x00102292, 0x48efc857, 0x4031d800, 0x58ef400a, + 0x58ec0002, 0x82000580, 0x00000200, 0x0500003b, + 0x48efc857, 0x4a034207, 0x00004000, 0x0509fb44, + 0x83a00580, 0x0010ae99, 0x0500000b, 0x58ee5809, + 0x4d2c0000, 0x0501f850, 0x41a25800, 0x05f1fb25, + 0x40ee5800, 0x05f1fb23, 0x5c025800, 0x492fc857, + 0x0001f35b, 0x05026007, 0x59a0001e, 0x84000542, + 0x4803401e, 0x4a01d808, 0x0010226d, 0x1c01f000, + 0x59a00207, 0x82000d80, 0x00004000, 0x05000005, + 0x900001c0, 0x90000551, 0x4803c011, 0x0501f004, + 0x900001c0, 0x90000550, 0x4803c011, 0x0501f844, + 0x59e00017, 0x8c00050a, 0x60000800, 0x0002088c, + 0x8d0c0530, 0x05f60fdc, 0x000209af, 0x6403c017, + 0x4203e000, 0x30000001, 0x4203e000, 0x40000000, + 0x40ee5800, 0x05f1faff, 0x59a0001e, 0x84000504, + 0x4803401e, 0x1c01f000, 0x4803c856, 0x4a034207, + 0x00004001, 0x05fdf7ca, 0x4803c856, 0x4a034207, + 0x00004002, 0x05fdf7c6, 0x4803c856, 0x4a034207, + 0x00004003, 0x05fdf7c2, 0x4803c856, 0x4a034207, + 0x00004005, 0x05fdf7be, 0x4803c856, 0x4a034207, + 0x00004006, 0x05fdf7ba, 0x4803c856, 0x4a034207, + 0x0000400b, 0x05fdf7b6, 0x4803c856, 0x4a034207, + 0x0000400c, 0x05fdf7b2, 0x4803c856, 0x4a034207, + 0x0000400c, 0x05fdf7ae, 0x4a034207, 0x00004020, + 0x05fdf7ab, 0x4c580000, 0x4c500000, 0x4c540000, + 0x58eca809, 0x8054a9c0, 0x05ec0f35, 0x91a0a407, + 0x9054ac07, 0x6034b000, 0x0541f852, 0x5c00a800, + 0x5c00a000, 0x5c00b000, 0x1c01f000, 0x4c580000, + 0x4c500000, 0x4c540000, 0x59a00007, 0x4803c857, + 0x59a00008, 0x4803c857, 0x59a00009, 0x4803c857, + 0x91e0ac20, 0x91a0a407, 0x6040b000, 0x50500000, + 0x4400a800, 0x8054a800, 0x900001c0, 0x4400a800, + 0x8054a800, 0x8050a000, 0x8058b040, 0x05fe07f8, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x1c01f000, - 0x4c580000, 0x4c500000, 0x4c540000, 0x59a00007, - 0x4803c857, 0x59a00008, 0x4803c857, 0x59a00009, - 0x4803c857, 0x91e0ac20, 0x91a0a407, 0x6040b000, - 0x50500000, 0x4400a800, 0x8054a800, 0x900001c0, - 0x4400a800, 0x8054a800, 0x8050a000, 0x8058b040, - 0x05fe07f8, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x1c01f000, 0x59a00407, 0x800000c2, 0x59a00a08, - 0x900409c0, 0x80040540, 0x84000540, 0x59a00c08, - 0x8c040500, 0x0500000b, 0x4c000000, 0x053dfe7a, - 0x5c000000, 0x05000004, 0x48030004, 0x64030000, - 0x05fdf771, 0x64030000, 0x64134407, 0x05fc07b0, - 0x4803880e, 0x05fdf76c, 0x59a00407, 0x800000c2, - 0x59a00c08, 0x8c040500, 0x0500000d, 0x4c000000, - 0x053dfe69, 0x5c000000, 0x05000006, 0x48030004, - 0x59800805, 0x48074407, 0x64030000, 0x05fdf75e, - 0x64030000, 0x64134407, 0x05fc079d, 0x4803880e, - 0x59c4080f, 0x48074407, 0x05fdf757, 0x59a01c07, - 0x59a00208, 0x900c19c0, 0x800c1d40, 0x580c0803, - 0x80000580, 0x500c1000, 0x80080400, 0x800c1800, - 0x80040840, 0x05fe07fc, 0x48034407, 0x900001c0, - 0x48034208, 0x800001c0, 0x05fc0747, 0x05fdf784, - 0x64174407, 0x64134208, 0x64034408, 0x59a8000a, - 0x82000c80, 0x00140000, 0x05021004, 0x42000000, - 0x0013ffff, 0x0501f006, 0x59a8088a, 0x8c040500, - 0x05000003, 0x82000400, 0x00006000, 0x48034209, - 0x900001c0, 0x48034409, 0x4a03420a, 0x00000095, - 0x05fdf731, 0x59a00408, 0x59a01208, 0x900811c0, - 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, - 0x800c1d40, 0x59a00a09, 0x59a00409, 0x900409c0, - 0x80040d40, 0x59a0020b, 0x90002490, 0x05fc1768, - 0x59a02407, 0x900001c0, 0x80100540, 0x59a8280a, - 0x80142480, 0x050a1249, 0x42002800, 0x7fefffff, - 0x80142480, 0x05fe175e, 0x42002800, 0x7ffd0000, - 0x80142480, 0x05fc175a, 0x0509f240, 0x59a00408, + 0x59a00407, 0x800000c2, 0x59a00a08, 0x900409c0, + 0x80040540, 0x84000540, 0x59a00c08, 0x8c040500, + 0x0500000b, 0x4c000000, 0x0541f887, 0x5c000000, + 0x05000004, 0x48030004, 0x64030000, 0x05fdf771, + 0x64030000, 0x64134407, 0x05fc07b0, 0x4803880e, + 0x05fdf76c, 0x59a00407, 0x800000c2, 0x59a00c08, + 0x8c040500, 0x0500000d, 0x4c000000, 0x0541f876, + 0x5c000000, 0x05000006, 0x48030004, 0x59800805, + 0x48074407, 0x64030000, 0x05fdf75e, 0x64030000, + 0x64134407, 0x05fc079d, 0x4803880e, 0x59c4080f, + 0x48074407, 0x05fdf757, 0x59a01c07, 0x59a00208, + 0x900c19c0, 0x800c1d40, 0x580c0803, 0x80000580, + 0x500c1000, 0x80080400, 0x800c1800, 0x80040840, + 0x05fe07fc, 0x48034407, 0x900001c0, 0x48034208, + 0x800001c0, 0x05fc0747, 0x05fdf784, 0x64174407, + 0x64174208, 0x64034408, 0x59a8000a, 0x82000c80, + 0x00140000, 0x05021004, 0x42000000, 0x0013ffff, + 0x0501f006, 0x59a8088a, 0x8c040500, 0x05000003, + 0x82000400, 0x00006000, 0x48034209, 0x900001c0, + 0x48034409, 0x60540121, 0x4803420a, 0x900001c0, + 0x4803440e, 0x6403400f, 0x05fdf72e, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x59a00a09, 0x59a00409, 0x900409c0, 0x80040d40, 0x59a0020b, - 0x90002490, 0x05fc174a, 0x59a02407, 0x900001c0, - 0x80100540, 0x59a8280a, 0x80142480, 0x050a1231, - 0x42002800, 0x7fefffff, 0x80142480, 0x05fe1740, - 0x42002800, 0x7ffd0000, 0x80142480, 0x05fc173c, - 0x0509f228, 0x59a02408, 0x59a00208, 0x901021c0, - 0x80102540, 0x59a01a0b, 0x59a00407, 0x900c19c0, - 0x800c1d40, 0x41781000, 0x820c0580, 0x00007c00, - 0x0500000a, 0x820c0480, 0x00007a00, 0x05001007, - 0x820c0480, 0x00007cff, 0x05021004, 0x053dfde6, - 0x05000007, 0x80081000, 0x44101800, 0x800811c0, - 0x05fc06dd, 0x64030000, 0x05fdf6db, 0x64030000, - 0x64134407, 0x05fdf71a, 0x59a01a0b, 0x59a00407, - 0x900c19c0, 0x800c1d40, 0x41781000, 0x820c0580, - 0x00007c00, 0x0500000a, 0x820c0480, 0x00007a00, - 0x05001007, 0x820c0480, 0x00007cff, 0x05021004, - 0x053dfdcd, 0x0500000e, 0x80081000, 0x500c0000, - 0x82000d00, 0x0000ffff, 0x48074208, 0x82000d00, - 0xffff0000, 0x900409c0, 0x48074408, 0x800811c0, - 0x05fc06bd, 0x64030000, 0x05fdf6bb, 0x64030000, - 0x64134407, 0x05fdf6fa, 0x4d2c0000, 0x4d340000, - 0x4d300000, 0x4d440000, 0x0509faab, 0x05020006, - 0x4923c857, 0x4927c857, 0x59a28c07, 0x0511f9e9, - 0x05000006, 0x5c028800, 0x5c026000, 0x5c026800, - 0x5c025800, 0x05fdf6ee, 0x4937c857, 0x59a04408, - 0x59a00208, 0x900001c0, 0x80204540, 0x4823c857, - 0x0501f877, 0x05000008, 0x64074209, 0x4a034407, - 0x0000ffff, 0x4a034208, 0x0000ffff, 0x497b4408, - 0x0501f03d, 0x497b4407, 0x0501f879, 0x0500003f, - 0x59300402, 0x48034407, 0x59300202, 0x48034208, - 0x59300006, 0x48034408, 0x59a0020c, 0x8c000500, - 0x05000030, 0x4933c857, 0x0511f97e, 0x05000003, - 0x64274407, 0x0501f031, 0x8d0c050e, 0x05000003, - 0x64074407, 0x0501f02d, 0x916c0583, 0x05000003, - 0x641f4407, 0x0501f029, 0x59340200, 0x8c00050e, - 0x05000003, 0x64834407, 0x0501f024, 0x59300407, - 0x90000d83, 0x05020007, 0x59300804, 0x9004051f, - 0x90000584, 0x05020003, 0x8c04053e, 0x05020015, - 0x0509f97e, 0x05020003, 0x640b4407, 0x0501f017, - 0x492fc857, 0x4a025c05, 0x00008000, 0x497a5a05, - 0x497a5806, 0x0535f998, 0x05020003, 0x640f4407, - 0x0501f00e, 0x4a01d808, 0x00102367, 0x5c028800, - 0x5c026000, 0x5c026800, 0x5c025800, 0x1c01f000, - 0x640b4209, 0x5c028800, 0x5c026000, 0x5c026800, - 0x5c025800, 0x05fdf658, 0x5c028800, 0x5c026000, - 0x5c026800, 0x5c025800, 0x05fdf695, 0x492fc857, - 0x4933c857, 0x497a602a, 0x592c0006, 0x82000580, - 0x01000000, 0x05020003, 0x64134407, 0x05fdf68c, - 0x4d2c0000, 0x912e5c07, 0x592c0000, 0x82000580, - 0x02000000, 0x05020011, 0x4803c856, 0x64134209, - 0x592c0804, 0x82040500, 0x0000ffff, 0x48034409, - 0x80040920, 0x4807420a, 0x592c0805, 0x82040500, - 0x0000ffff, 0x4803440a, 0x80040920, 0x4807420b, - 0x5c025800, 0x05fdf634, 0x4803c856, 0x64174209, - 0x592c0801, 0x82040500, 0x0000ffff, 0x48034409, - 0x80040920, 0x4807420a, 0x05fdf7f6, 0x4937c857, - 0x4823c857, 0x5934000f, 0x80001d40, 0x05000005, - 0x580c0006, 0x80200580, 0x05020003, 0x81780000, - 0x1c01f000, 0x580c0000, 0x05fdf7f8, 0x4823c857, - 0x4d2c0000, 0x42026000, 0x001102e4, 0x59300407, - 0x90000d83, 0x05000003, 0x90000d86, 0x05020007, - 0x59325809, 0x812e59c0, 0x05000004, 0x592c0006, - 0x80200580, 0x05000009, 0x91326430, 0x59a8000b, - 0x81300480, 0x05fc17f2, 0x417a6000, 0x80000580, - 0x5c025800, 0x1c01f000, 0x90000541, 0x5c025800, - 0x1c01f000, 0x83a00580, 0x0010ac19, 0x05fe0638, - 0x64030000, 0x4a034207, 0x00004000, 0x4a03c011, - 0x40000010, 0x05fdfe63, 0x59e00017, 0x8c00050a, - 0x60000800, 0x0002088c, 0x8d0c0530, 0x05f60ea0, - 0x000209af, 0x6403c017, 0x4203e000, 0x30000001, - 0x4203e000, 0x40000000, 0x4203e000, 0xb0100000, - 0x41fc0000, 0x8c00050a, 0x05fc07fc, 0x053dfcee, - 0x05fc07ff, 0x59800802, 0x8c040520, 0x05020003, - 0x64030000, 0x05fdf7f5, 0x60101020, 0x50080000, - 0x8400054c, 0x44001000, 0x64030000, 0x0501f000, - 0x59a00c07, 0x800409c0, 0x05000005, 0x916c0580, - 0x05000003, 0x646b4407, 0x05fdf619, 0x42007000, - 0x0010ac7a, 0x58381c01, 0x58382201, 0x58383202, - 0x8c040500, 0x0500000b, 0x59a01208, 0x82080500, - 0x0000f003, 0x05fe0612, 0x82080480, 0x00000841, - 0x05fe160f, 0x82080480, 0x00000100, 0x05fc160c, - 0x40040000, 0x800c0540, 0x90000528, 0x900005a8, - 0x05fc0607, 0x8c04050a, 0x05000006, 0x59a03c08, - 0x901c0486, 0x05fe1602, 0x901c0481, 0x05fc1600, - 0x8c040506, 0x05000003, 0x4a01a8e4, 0x0000c000, - 0x8c040504, 0x05000004, 0x59e00002, 0x8400056e, - 0x4803c002, 0x8c040502, 0x05000004, 0x600028ec, - 0x4a002805, 0xd0000000, 0x40040000, 0x800c0540, - 0x48007401, 0x8c040500, 0x05000002, 0x48087201, - 0x8c04050a, 0x0500001a, 0x481c7202, 0x4c0c0000, - 0x4c100000, 0x4c180000, 0x051dfb63, 0x4df00000, - 0x58383a02, 0x481fc857, 0x41780000, 0x801c3840, - 0x800010c8, 0x82081400, 0x0000b037, 0x64001002, - 0x801c1c80, 0x05021002, 0x64081002, 0x80000000, - 0x90001c85, 0x05fc17f7, 0x5c03e000, 0x051c0b3e, - 0x5c003000, 0x5c002000, 0x5c001800, 0x480f4407, - 0x48134208, 0x481b4408, 0x05fdf587, 0x4d440000, - 0x4d340000, 0x59a28c07, 0x0509f97b, 0x05020009, - 0x0511f8bc, 0x05020007, 0x0511f872, 0x05000008, - 0x64274407, 0x5c026800, 0x5c028800, 0x05fdf5bc, - 0x5c026800, 0x5c028800, 0x05fdf5bd, 0x59a01208, - 0x59a01c08, 0x5934400a, 0x82203d00, 0x0000e000, - 0x801c391a, 0x8c080500, 0x0500001a, 0x900c0d07, - 0x90040580, 0x0500000b, 0x90040581, 0x05000009, - 0x90040583, 0x05000007, 0x90040584, 0x05000005, - 0x90040593, 0x05000003, 0x4937c857, 0x60100800, - 0x82204500, 0xffff1fff, 0x800400da, 0x80200540, - 0x4802680a, 0x4c080000, 0x4c1c0000, 0x051dfb1e, - 0x0511fadc, 0x051dfb08, 0x5c003800, 0x5c001000, - 0x481f4408, 0x5934400a, 0x82203d00, 0x0f000000, - 0x801c3930, 0x8c080504, 0x05020011, 0x8c080502, - 0x0500000b, 0x4823c857, 0x82204500, 0xf0ffffff, - 0x59a01a09, 0x900c0d0f, 0x800400f0, 0x8400056e, - 0x80200540, 0x4802680a, 0x4803c857, 0x481f4209, - 0x5c026800, 0x5c028800, 0x05fdf53f, 0x82204500, - 0xf07fffff, 0x4822680a, 0x05fdf7f9, 0x8d0c050e, - 0x05000003, 0x64074407, 0x05fdf579, 0x916c0583, - 0x05020014, 0x0509f92c, 0x05fe0579, 0x59240200, - 0x8c000502, 0x0500003c, 0x59240005, 0x497b4407, - 0x0511fda1, 0x0500000e, 0x82000d00, 0x00ffff00, - 0x0502000b, 0x82000c00, 0x00102013, 0x50040800, - 0x80040910, 0x82041580, 0x00000080, 0x05020003, - 0x641f4407, 0x05fdf562, 0x48074407, 0x82000d00, - 0x0000ffff, 0x48074208, 0x80000120, 0x48034408, - 0x59a8021b, 0x82001500, 0x00003500, 0x480b440a, - 0x8c000502, 0x05000016, 0x8c000506, 0x05000006, - 0x90000d0a, 0x90040d8a, 0x05020003, 0x6407420a, - 0x0501f018, 0x8c00050a, 0x05000006, 0x90000d22, - 0x90040da2, 0x05020003, 0x640f420a, 0x0501f011, - 0x8c000508, 0x05000006, 0x90000d12, 0x90040d92, - 0x05020003, 0x640b420a, 0x0501f00a, 0x0511fd72, - 0x05020003, 0x6413420a, 0x05fdf4fb, 0x8c000506, - 0x05000003, 0x64174407, 0x05fdf539, 0x6403420a, - 0x05fdf4f5, 0x646f4407, 0x05fdf535, 0x59a8002e, - 0x48034408, 0x59a8002f, 0x4803420a, 0x05fdf4ee, - 0x42007800, 0x0010b0e4, 0x59a00407, 0x4803c857, - 0x90000c8a, 0x05fe152e, 0x0c01f001, 0x00102545, - 0x001024e5, 0x001024f2, 0x00102502, 0x00102521, - 0x00102546, 0x001024de, 0x001024de, 0x00102552, - 0x0010258d, 0x001024df, 0x05fdf521, 0x59a00208, - 0x48007c01, 0x59a00408, 0x48007a01, 0x05edfdbf, - 0x0501f061, 0x916c0580, 0x05fc0515, 0x59a00a08, - 0x59a00408, 0x900001c0, 0x80040d40, 0x4807c857, - 0x59a00a09, 0x59a00409, 0x900001c0, 0x80040d40, - 0x4807c857, 0x0501f054, 0x916c0580, 0x05fc0508, - 0x59a00408, 0x59a01208, 0x900001c0, 0x80081540, - 0x59a00409, 0x59a01a09, 0x900001c0, 0x800c1d40, - 0x42000000, 0x0010cfb7, 0x480fc857, 0x480bc857, - 0x60000820, 0x0505f7eb, 0x59a00a08, 0x59a00408, - 0x900001c0, 0x80041d40, 0x820c0c80, 0x0010a29b, - 0x05fe14f7, 0x820c0c80, 0x00100000, 0x05fc14f4, - 0x480fc857, 0x903c7c22, 0x503c0800, 0x800409c0, - 0x05000005, 0x903c05a6, 0x05fc04ed, 0x803c7800, - 0x05fdf7fa, 0x59e41001, 0x82080d00, 0xfffeffcf, - 0x4807c801, 0x440c7800, 0x46001800, 0x0201f800, - 0x800c1800, 0x46001800, 0x001001e0, 0x480bc801, - 0x0501f025, 0x59a01a08, 0x59a00408, 0x900001c0, - 0x800c1d40, 0x480c7803, 0x59a02209, 0x59a00409, - 0x900001c0, 0x80102540, 0x48107804, 0x59a0020a, - 0x40001000, 0x48007807, 0x80000040, 0x05fc14d0, - 0x48007808, 0x60000880, 0x0519ffee, 0x80000540, - 0x05000002, 0x05fdf4ca, 0x40040000, 0x800c1c00, - 0x05fc14c7, 0x4800780a, 0x480c7805, 0x48107806, - 0x4978780c, 0x59a0040a, 0x800000c4, 0x4800780b, - 0x59e40001, 0x4803c857, 0x82000540, 0x00040000, - 0x4803c801, 0x05fdf474, 0x49787803, 0x49787804, - 0x49787808, 0x49787807, 0x49787803, 0x49787805, - 0x49787806, 0x4978780c, 0x4978780b, 0x59e40001, - 0x84000524, 0x05fdf7f3, 0x4978781f, 0x49787814, - 0x49787815, 0x4978781d, 0x49787817, 0x49787818, - 0x59a01a08, 0x59a00408, 0x900001c0, 0x800c1d40, - 0x480c780e, 0x480c7819, 0x480c781b, 0x59a02209, - 0x59a00409, 0x900001c0, 0x80102540, 0x4810780f, - 0x4810781a, 0x4810781c, 0x59a0020a, 0x80000540, - 0x05fc0497, 0x48007813, 0x60000808, 0x40001000, - 0x0519ffb4, 0x80000540, 0x05fe0491, 0x40040000, - 0x800c1c00, 0x05fc148e, 0x480c7810, 0x48107811, - 0x4a03420a, 0x00000400, 0x59a0040a, 0x4800781e, - 0x850e1d6a, 0x59a0040b, 0x48007a12, 0x59a0020c, - 0x48007c12, 0x600c0000, 0x05edfcff, 0x80102000, - 0x4810780d, 0x48134209, 0x901021c0, 0x48134409, - 0x59e40052, 0x4803c857, 0x4a007816, 0x00000400, - 0x903c0416, 0x48034208, 0x900001c0, 0x48034408, - 0x05fdf42d, 0x583c0800, 0x830e1d00, 0xffcfffff, - 0x48ec7820, 0x4a01d802, 0x00000100, 0x583c0017, - 0x82000500, 0x000000ff, 0x05020008, 0x4807c857, - 0x8c040502, 0x05000004, 0x84040d48, 0x48047800, - 0x1c01f000, 0x0501f003, 0x05f5f9e6, 0x1c01f000, - 0x42007800, 0x0010b0e4, 0x583dd820, 0x58ef400a, - 0x40ec6000, 0x583c0000, 0x48efc857, 0x49a3c857, - 0x4803c857, 0x82000500, 0x0000ffc0, 0x48007800, - 0x583c001d, 0x4803c857, 0x583c0819, 0x4807c857, - 0x48074208, 0x900409c0, 0x48074408, 0x583c081a, - 0x48074209, 0x900409c0, 0x48074409, 0x583c081b, - 0x4807420a, 0x900409c0, 0x4807440a, 0x583c081c, - 0x4807420b, 0x900409c0, 0x4807440b, 0x49787818, - 0x583c0017, 0x49787817, 0x82000500, 0x000000ff, - 0x05fe03ee, 0x05fdf3f4, 0x59a80005, 0x48034407, - 0x59a80006, 0x48034208, 0x59a80007, 0x48034408, - 0x05fdf3ed, 0x05edfc22, 0x4803c856, 0x59a0020c, - 0x4803c857, 0x8c00051e, 0x050a00ad, 0x05f9fd19, - 0x05000003, 0x05f9fcfb, 0x05000003, 0x648b4407, - 0x05fdf423, 0x4a03c013, 0x03800300, 0x4a03c014, - 0x03800380, 0x59a00c07, 0x82040580, 0x000000a0, - 0x05000004, 0x82040580, 0x000000a2, 0x0502001c, - 0x59a0140b, 0x82080480, 0x00000100, 0x05021018, - 0x59a0020c, 0x8c000500, 0x0502001f, 0x59a00a0b, - 0x800409c0, 0x05000012, 0xb0040481, 0x05021010, - 0x0505fed6, 0x0500000a, 0x59a01008, 0x900811c0, - 0x59a0180a, 0x900c19c0, 0x59a00a0b, 0x0505fef1, - 0x4a01d808, 0x00102602, 0x1c01f000, 0x640b4407, - 0x4a03c014, 0x03800000, 0x05fdf3fd, 0x4a03c014, - 0x03800000, 0x05fdf3fe, 0x4031d800, 0x58ef400a, - 0x58ee580c, 0x58ec0002, 0x82000580, 0x00000200, - 0x05fc03eb, 0x59a00c07, 0x59a0140b, 0x59a0020c, - 0x8c000500, 0x05020038, 0x912e5c05, 0x4178c000, - 0x59a0ba0b, 0x40600000, 0x812c0400, 0x5000c800, - 0x82641d00, 0x000000ff, 0x4c040000, 0x4c080000, - 0x0501f8b8, 0x5c001000, 0x5c000800, 0x05000037, - 0x805cb840, 0x05000032, 0x80081000, 0x82641d00, - 0x0000ff00, 0x800c1910, 0x4c040000, 0x4c080000, - 0x0501f8ac, 0x5c001000, 0x5c000800, 0x0500002b, - 0x805cb840, 0x05000026, 0x80081000, 0x82641d00, - 0x00ff0000, 0x800c1920, 0x4c040000, 0x4c080000, - 0x0501f8a0, 0x5c001000, 0x5c000800, 0x0500001f, - 0x805cb840, 0x0500001a, 0x80081000, 0x82641d00, - 0xff000000, 0x800c1930, 0x4c040000, 0x4c080000, - 0x0501f894, 0x5c001000, 0x5c000800, 0x05000013, - 0x805cb840, 0x0500000e, 0x80081000, 0x8060c000, - 0x05fdf7cd, 0x59a0020b, 0x82000500, 0x000000ff, - 0x40001800, 0x4c040000, 0x4c080000, 0x0501f885, - 0x5c001000, 0x5c000800, 0x05000004, 0x4a03c014, - 0x03800000, 0x05fdf368, 0x4a03c014, 0x03800000, - 0x64134407, 0x05fdf3a6, 0x4803c856, 0x59a0020c, - 0x4803c857, 0x8c00051e, 0x050607ed, 0x05f9fc91, - 0x05000003, 0x05f9fc73, 0x05000003, 0x648b4407, - 0x05fdf39b, 0x4a03c013, 0x03800300, 0x4a03c014, - 0x03800380, 0x59a00c07, 0x82040580, 0x000000a0, - 0x05000004, 0x82040580, 0x000000a2, 0x05020062, - 0x59a0140b, 0x82080480, 0x00000100, 0x0502105e, - 0x59a0020c, 0x8c000500, 0x05020050, 0x59a01a0b, - 0x800c19c0, 0x05000058, 0xb00c0481, 0x05021056, - 0x0505fe4e, 0x05020006, 0x640b4407, 0x4a03c014, - 0x03800000, 0x4803c857, 0x05fdf37d, 0x912e5c05, - 0x4178c000, 0x59a0ba0b, 0x4803c857, 0x40600000, - 0x812c0400, 0x4000c800, 0x4c040000, 0x4c080000, - 0x0501f879, 0x5c001000, 0x5c000800, 0x0500003e, - 0x4414c800, 0x805cb840, 0x0500002b, 0x80081000, - 0x4c040000, 0x4c080000, 0x0501f86f, 0x5c001000, - 0x5c000800, 0x05000034, 0x50640000, 0x801428d0, - 0x80140540, 0x4400c800, 0x805cb840, 0x0500001e, - 0x80081000, 0x4c040000, 0x4c080000, 0x0501f862, - 0x5c001000, 0x5c000800, 0x05000027, 0x50640000, - 0x801428e0, 0x80140540, 0x4400c800, 0x805cb840, - 0x05000011, 0x80081000, 0x4c040000, 0x4c080000, - 0x0501f855, 0x5c001000, 0x5c000800, 0x0500001a, - 0x50640000, 0x801428f0, 0x80140540, 0x4400c800, - 0x805cb840, 0x05000004, 0x80081000, 0x8060c000, - 0x05fdf7ca, 0x59a00a0b, 0x59a01008, 0x900811c0, - 0x59a0180a, 0x900c19c0, 0x4a03c014, 0x03800000, - 0x412c0000, 0x0505f629, 0x4803c857, 0x0501f83e, - 0x05000005, 0x48174407, 0x4a03c014, 0x03800000, - 0x05fdf2f1, 0x4a03c014, 0x03800000, 0x64134407, - 0x05fdf32f, 0x4a03c014, 0x03800000, 0x05fdf330, - 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4004b800, - 0x4008c000, 0x400cc800, 0x0501f86d, 0x0500000f, - 0x0501f89b, 0x05020011, 0x4060b800, 0x0501f898, - 0x0502000e, 0x4064b800, 0x0501f895, 0x0502000b, - 0x0501f883, 0x4ce80000, 0x6021d027, 0x0519fd9c, - 0x5c01d000, 0x90000541, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x0501f879, 0x80000580, - 0x05fdf7fa, 0x4c5c0000, 0x485fc857, 0x0501f854, - 0x05000008, 0x905cbd41, 0x0501f881, 0x05020009, - 0x0501f8bd, 0x0501f8ef, 0x0501f86d, 0x90000541, - 0x4803c857, 0x4867c857, 0x5c00b800, 0x1c01f000, - 0x0501f867, 0x80000580, 0x4803c857, 0x485fc857, - 0x05fdf7f8, 0x4c5c0000, 0x4c600000, 0x4c640000, - 0x4807c857, 0x480bc857, 0x4004b800, 0x4008c000, - 0x0501f83b, 0x0500000c, 0x0501f869, 0x0502000f, - 0x4c5c0000, 0x4060b800, 0x0501f865, 0x5c00b800, - 0x0502000a, 0x05fdffdc, 0x05000003, 0x0501f850, - 0x90000541, 0x40642800, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x0501f849, 0x80000580, - 0x4803c857, 0x4867c857, 0x05fdf7f7, 0x4ce80000, - 0x4c580000, 0x4803c856, 0x6030b000, 0x6029d000, - 0x0519fd5b, 0x4a03c013, 0x02000200, 0x6029d000, - 0x0519fd57, 0x4a03c013, 0x02000000, 0x8058b040, - 0x05fe07f7, 0x61a00807, 0x4a03c013, 0x03800300, - 0x80040840, 0x0500000f, 0x4a03c014, 0x03800000, - 0x59e00013, 0x4a03c014, 0x03800380, 0x82000500, - 0x00000300, 0x82000580, 0x00000300, 0x05fe07f3, - 0x90000541, 0x5c00b000, 0x5c01d000, 0x1c01f000, - 0x4803c857, 0x80000580, 0x05fdf7fb, 0x4ce80000, - 0x4803c856, 0x61a00807, 0x4a03c013, 0x03800300, - 0x80040840, 0x05000016, 0x4a03c014, 0x03800000, - 0x59e00013, 0x4a03c014, 0x03800380, 0x82000500, - 0x00000300, 0x82000580, 0x00000300, 0x05fe07f3, - 0x6029d000, 0x0519fd2a, 0x4a03c013, 0x01000000, - 0x6029d000, 0x0519fd26, 0x4a03c013, 0x02000000, - 0x90000541, 0x5c01d000, 0x1c01f000, 0x4803c857, - 0x05fdffbf, 0x05fe07f3, 0x05fdf7fb, 0x4803c856, - 0x4a03c013, 0x01000000, 0x4ce80000, 0x6029d000, - 0x0519fd17, 0x5c01d000, 0x4a03c013, 0x02000200, - 0x4ce80000, 0x6029d000, 0x0519fd11, 0x5c01d000, - 0x4a03c013, 0x01000100, 0x1c01f000, 0x4c5c0000, - 0x4c600000, 0x485fc857, 0x6020c000, 0x825c0500, - 0x00000080, 0x800000c2, 0x82000540, 0x01000000, - 0x4803c013, 0x4ce80000, 0x6029d000, 0x0519fd00, - 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, - 0x6029d000, 0x0519fcfa, 0x5c01d000, 0x4a03c013, - 0x02000000, 0x805cb8c2, 0x8060c040, 0x05fe07ec, - 0x4a03c013, 0x01000100, 0x4ce80000, 0x6029d000, - 0x0519fcef, 0x5c01d000, 0x4a03c013, 0x02000200, - 0x4ce80000, 0x6029d000, 0x0519fce9, 0x5c01d000, - 0x4a03c014, 0x03800000, 0x61a00807, 0x59e0b813, - 0x825cbd00, 0x00000100, 0x80040840, 0x05000004, - 0x405c0000, 0x80000540, 0x05fe07f9, 0x4a03c014, - 0x03800380, 0x4a03c013, 0x02000000, 0x4ce80000, - 0x6029d000, 0x0519fcd6, 0x5c01d000, 0x485fc857, - 0x405c0000, 0x80000540, 0x5c00c000, 0x5c00b800, - 0x1c01f000, 0x4c600000, 0x4803c856, 0x4a03c013, - 0x01000100, 0x6020c000, 0x61a0c807, 0x4ce80000, - 0x6029d000, 0x0519fcc6, 0x5c01d000, 0x4a03c013, - 0x02000200, 0x4a03c014, 0x03800000, 0x59e00013, - 0x4a03c014, 0x03800380, 0x82000500, 0x00000200, - 0x05020003, 0x8064c840, 0x05fe07f7, 0x4178c800, - 0x0501f007, 0x4ce80000, 0x6029d000, 0x0519fcb4, - 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, - 0x6029d000, 0x0519fcae, 0x5c01d000, 0x4a03c014, + 0x90002490, 0x05fc1765, 0x59a02407, 0x900001c0, + 0x80100540, 0x59a8280a, 0x80142480, 0x050a126e, + 0x42002800, 0x7fefffff, 0x80142480, 0x05fe175b, + 0x42002800, 0x7ffd0000, 0x80142480, 0x05fc1757, + 0x0509f265, 0x59a00408, 0x59a01208, 0x900811c0, + 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, + 0x800c1d40, 0x59a00a09, 0x59a00409, 0x900409c0, + 0x80040d40, 0x59a0020b, 0x90002490, 0x05fc1747, + 0x59a02407, 0x900001c0, 0x80100540, 0x59a8280a, + 0x80142480, 0x050a1256, 0x42002800, 0x7fefffff, + 0x80142480, 0x05fe173d, 0x42002800, 0x7ffd0000, + 0x80142480, 0x05fc1739, 0x0509f24d, 0x59a02408, + 0x59a00208, 0x901021c0, 0x80102540, 0x59a01a0b, + 0x59a00407, 0x900c19c0, 0x800c1d40, 0x41781000, + 0x820c0580, 0x00007c00, 0x0500000a, 0x820c0480, + 0x00007a00, 0x05001007, 0x820c0480, 0x00007cff, + 0x05021004, 0x053dfff0, 0x05000007, 0x80081000, + 0x44101800, 0x800811c0, 0x05fc06da, 0x64030000, + 0x05fdf6d8, 0x64030000, 0x64134407, 0x05fdf717, + 0x59a01a0b, 0x59a00407, 0x900c19c0, 0x800c1d40, + 0x41781000, 0x820c0580, 0x00007c00, 0x0500000a, + 0x820c0480, 0x00007a00, 0x05001007, 0x820c0480, + 0x00007cff, 0x05021004, 0x053dffd7, 0x0500000e, + 0x80081000, 0x500c0000, 0x82000d00, 0x0000ffff, + 0x48074208, 0x82000d00, 0xffff0000, 0x900409c0, + 0x48074408, 0x800811c0, 0x05fc06ba, 0x64030000, + 0x05fdf6b8, 0x64030000, 0x64134407, 0x05fdf6f7, + 0x4d2c0000, 0x4d340000, 0x4d300000, 0x4d440000, + 0x0509fad0, 0x05020006, 0x4923c857, 0x4927c857, + 0x59a28c07, 0x0511fa1f, 0x05000006, 0x5c028800, + 0x5c026000, 0x5c026800, 0x5c025800, 0x05fdf6eb, + 0x4937c857, 0x59a04408, 0x59a00208, 0x900001c0, + 0x80204540, 0x4823c857, 0x0501f877, 0x05000008, + 0x64074209, 0x4a034407, 0x0000ffff, 0x4a034208, + 0x0000ffff, 0x497b4408, 0x0501f03d, 0x497b4407, + 0x0501f879, 0x0500003f, 0x59300402, 0x48034407, + 0x59300202, 0x48034208, 0x59300006, 0x48034408, + 0x59a0020c, 0x8c000500, 0x05000030, 0x4933c857, + 0x0511f9b4, 0x05000003, 0x64274407, 0x0501f031, + 0x8d0c050e, 0x05000003, 0x64074407, 0x0501f02d, + 0x916c0583, 0x05000003, 0x641f4407, 0x0501f029, + 0x59340200, 0x8c00050e, 0x05000003, 0x64834407, + 0x0501f024, 0x59300407, 0x90000d83, 0x05020007, + 0x59300804, 0x9004051f, 0x90000584, 0x05020003, + 0x8c04053e, 0x05020015, 0x0509f9a3, 0x05020003, + 0x640b4407, 0x0501f017, 0x492fc857, 0x4a025c05, + 0x00008000, 0x497a5a05, 0x497a5806, 0x0535fad8, + 0x05020003, 0x640f4407, 0x0501f00e, 0x4a01d808, + 0x0010240d, 0x5c028800, 0x5c026000, 0x5c026800, + 0x5c025800, 0x1c01f000, 0x640b4209, 0x5c028800, + 0x5c026000, 0x5c026800, 0x5c025800, 0x05fdf655, + 0x5c028800, 0x5c026000, 0x5c026800, 0x5c025800, + 0x05fdf692, 0x492fc857, 0x4933c857, 0x497a602a, + 0x592c0006, 0x82000580, 0x01000000, 0x05020003, + 0x64134407, 0x05fdf689, 0x4d2c0000, 0x912e5c07, + 0x592c0000, 0x82000580, 0x02000000, 0x05020011, + 0x4803c856, 0x64134209, 0x592c0804, 0x82040500, + 0x0000ffff, 0x48034409, 0x80040920, 0x4807420a, + 0x592c0805, 0x82040500, 0x0000ffff, 0x4803440a, + 0x80040920, 0x4807420b, 0x5c025800, 0x05fdf631, + 0x4803c856, 0x64174209, 0x592c0801, 0x82040500, + 0x0000ffff, 0x48034409, 0x80040920, 0x4807420a, + 0x05fdf7f6, 0x4937c857, 0x4823c857, 0x5934000f, + 0x80001d40, 0x05000005, 0x580c0006, 0x80200580, + 0x05020003, 0x81780000, 0x1c01f000, 0x580c0000, + 0x05fdf7f8, 0x4823c857, 0x4d2c0000, 0x42026000, + 0x00110514, 0x59300407, 0x90000d83, 0x05000003, + 0x90000d86, 0x05020007, 0x59325809, 0x812e59c0, + 0x05000004, 0x592c0006, 0x80200580, 0x05000009, + 0x91326430, 0x59a8000b, 0x81300480, 0x05fc17f2, + 0x417a6000, 0x80000580, 0x5c025800, 0x1c01f000, + 0x90000541, 0x5c025800, 0x1c01f000, 0x83a00580, + 0x0010ae99, 0x05fe0635, 0x64030000, 0x4a034207, + 0x00004000, 0x4a03c011, 0x40000010, 0x05fdfe60, + 0x59e00017, 0x8c00050a, 0x60000800, 0x0002088c, + 0x8d0c0530, 0x05f60df8, 0x000209af, 0x6403c017, + 0x4203e000, 0x30000001, 0x4203e000, 0x40000000, + 0x4203e000, 0xb0100000, 0x41fc0000, 0x8c00050a, + 0x05fc07fc, 0x053dfef8, 0x05fc07ff, 0x59800802, + 0x8c040520, 0x05020003, 0x64030000, 0x05fdf7f5, + 0x60101020, 0x50080000, 0x8400054c, 0x44001000, + 0x64030000, 0x0501f000, 0x59a00c07, 0x800409c0, + 0x05000005, 0x916c0580, 0x05000003, 0x646b4407, + 0x05fdf616, 0x42007000, 0x0010aefa, 0x58381c01, + 0x58382201, 0x58383202, 0x8c040500, 0x0500000b, + 0x59a01208, 0x82080500, 0x0000f003, 0x05fe060f, + 0x82080480, 0x00000841, 0x05fe160c, 0x82080480, + 0x00000100, 0x05fc1609, 0x40040000, 0x800c0540, + 0x90000528, 0x900005a8, 0x05fc0604, 0x8c04050a, + 0x05000006, 0x59a03c08, 0x901c0486, 0x05fe15ff, + 0x901c0481, 0x05fc15fd, 0x8c040506, 0x05000003, + 0x4a01a8e4, 0x0000c000, 0x8c040504, 0x05000004, + 0x59e00002, 0x8400056e, 0x4803c002, 0x8c040502, + 0x05000004, 0x600028ec, 0x4a002805, 0xd0000000, + 0x40040000, 0x800c0540, 0x48007401, 0x8c040500, + 0x05000002, 0x48087201, 0x8c04050a, 0x0500001a, + 0x481c7202, 0x4c0c0000, 0x4c100000, 0x4c180000, + 0x051dfc7f, 0x4df00000, 0x58383a02, 0x481fc857, + 0x41780000, 0x801c3840, 0x800010c8, 0x82081400, + 0x0000b037, 0x64001002, 0x801c1c80, 0x05021002, + 0x64081002, 0x80000000, 0x90001c85, 0x05fc17f7, + 0x5c03e000, 0x051c0c5a, 0x5c003000, 0x5c002000, + 0x5c001800, 0x480f4407, 0x48134208, 0x481b4408, + 0x05fdf584, 0x4d440000, 0x4d340000, 0x59a28c07, + 0x0509f9a0, 0x05020009, 0x0511f8f2, 0x05020007, + 0x0511f8a8, 0x05000008, 0x64274407, 0x5c026800, + 0x5c028800, 0x05fdf5b9, 0x5c026800, 0x5c028800, + 0x05fdf5ba, 0x59a01208, 0x59a01c08, 0x5934400a, + 0x82203d00, 0x0000e000, 0x801c391a, 0x8c080500, + 0x0500001a, 0x900c0d07, 0x90040580, 0x0500000b, + 0x90040581, 0x05000009, 0x90040583, 0x05000007, + 0x90040584, 0x05000005, 0x90040593, 0x05000003, + 0x4937c857, 0x60100800, 0x82204500, 0xffff1fff, + 0x800400da, 0x80200540, 0x4802680a, 0x4c080000, + 0x4c1c0000, 0x051dfc3a, 0x0511fb15, 0x051dfc24, + 0x5c003800, 0x5c001000, 0x481f4408, 0x5934400a, + 0x82203d00, 0x0f000000, 0x801c3930, 0x8c080504, + 0x05020011, 0x8c080502, 0x0500000b, 0x4823c857, + 0x82204500, 0xf0ffffff, 0x59a01a09, 0x900c0d0f, + 0x800400f0, 0x8400056e, 0x80200540, 0x4802680a, + 0x4803c857, 0x481f4209, 0x5c026800, 0x5c028800, + 0x05fdf53c, 0x82204500, 0xf07fffff, 0x4822680a, + 0x05fdf7f9, 0x8d0c050e, 0x05000003, 0x64074407, + 0x05fdf576, 0x916c0583, 0x05020014, 0x0509f951, + 0x05fe0576, 0x59240200, 0x8c000502, 0x0500003c, + 0x59240005, 0x497b4407, 0x0511fe00, 0x0500000e, + 0x82000d00, 0x00ffff00, 0x0502000b, 0x82000c00, + 0x001020b6, 0x50040800, 0x80040910, 0x82041580, + 0x00000080, 0x05020003, 0x641f4407, 0x05fdf55f, + 0x48074407, 0x82000d00, 0x0000ffff, 0x48074208, + 0x80000120, 0x48034408, 0x59a8021b, 0x82001500, + 0x00003500, 0x480b440a, 0x8c000502, 0x05000016, + 0x8c000506, 0x05000006, 0x90000d0a, 0x90040d8a, + 0x05020003, 0x6407420a, 0x0501f018, 0x8c00050a, + 0x05000006, 0x90000d22, 0x90040da2, 0x05020003, + 0x640f420a, 0x0501f011, 0x8c000508, 0x05000006, + 0x90000d12, 0x90040d92, 0x05020003, 0x640b420a, + 0x0501f00a, 0x0511fdd1, 0x05020003, 0x6413420a, + 0x05fdf4f8, 0x8c000506, 0x05000003, 0x64174407, + 0x05fdf536, 0x6403420a, 0x05fdf4f2, 0x646f4407, + 0x05fdf532, 0x59a8002e, 0x48034408, 0x59a8002f, + 0x4803420a, 0x05fdf4eb, 0x42007800, 0x0010b364, + 0x59a00407, 0x4803c857, 0x90000c8a, 0x05fe152b, + 0x0c01f001, 0x001025eb, 0x0010258b, 0x00102598, + 0x001025a8, 0x001025c7, 0x001025ec, 0x00102584, + 0x00102584, 0x001025f8, 0x00102633, 0x00102585, + 0x05fdf51e, 0x59a00208, 0x48007c01, 0x59a00408, + 0x48007a01, 0x05edfd19, 0x0501f061, 0x916c0580, + 0x05fc0512, 0x59a00a08, 0x59a00408, 0x900001c0, + 0x80040d40, 0x4807c857, 0x59a00a09, 0x59a00409, + 0x900001c0, 0x80040d40, 0x4807c857, 0x0501f054, + 0x916c0580, 0x05fc0505, 0x59a00408, 0x59a01208, + 0x900001c0, 0x80081540, 0x59a00409, 0x59a01a09, + 0x900001c0, 0x800c1d40, 0x42000000, 0x0010d237, + 0x480fc857, 0x480bc857, 0x60000820, 0x0509f010, + 0x59a00a08, 0x59a00408, 0x900001c0, 0x80041d40, + 0x820c0c80, 0x0010a562, 0x05fe14f4, 0x820c0c80, + 0x00100000, 0x05fc14f1, 0x480fc857, 0x903c7c22, + 0x503c0800, 0x800409c0, 0x05000005, 0x903c05a6, + 0x05fc04ea, 0x803c7800, 0x05fdf7fa, 0x59e41001, + 0x82080d00, 0xfffeffcf, 0x4807c801, 0x440c7800, + 0x46001800, 0x0201f800, 0x800c1800, 0x46001800, + 0x001001e0, 0x480bc801, 0x0501f025, 0x59a01a08, + 0x59a00408, 0x900001c0, 0x800c1d40, 0x480c7803, + 0x59a02209, 0x59a00409, 0x900001c0, 0x80102540, + 0x48107804, 0x59a0020a, 0x40001000, 0x48007807, + 0x80000040, 0x05fc14cd, 0x48007808, 0x60000880, + 0x051df90a, 0x80000540, 0x05000002, 0x05fdf4c7, + 0x40040000, 0x800c1c00, 0x05fc14c4, 0x4800780a, + 0x480c7805, 0x48107806, 0x4978780c, 0x59a0040a, + 0x800000c4, 0x4800780b, 0x59e40001, 0x4803c857, + 0x82000540, 0x00040000, 0x4803c801, 0x05fdf471, + 0x49787803, 0x49787804, 0x49787808, 0x49787807, + 0x49787803, 0x49787805, 0x49787806, 0x4978780c, + 0x4978780b, 0x59e40001, 0x84000524, 0x05fdf7f3, + 0x4978781f, 0x49787814, 0x49787815, 0x4978781d, + 0x49787817, 0x49787818, 0x59a01a08, 0x59a00408, + 0x900001c0, 0x800c1d40, 0x480c780e, 0x480c7819, + 0x480c781b, 0x59a02209, 0x59a00409, 0x900001c0, + 0x80102540, 0x4810780f, 0x4810781a, 0x4810781c, + 0x59a0020a, 0x80000540, 0x05fc0494, 0x48007813, + 0x60000808, 0x40001000, 0x051df8d0, 0x80000540, + 0x05fe048e, 0x40040000, 0x800c1c00, 0x05fc148b, + 0x480c7810, 0x48107811, 0x4a03420a, 0x00000400, + 0x59a0040a, 0x4800781e, 0x850e1d6a, 0x59a0040b, + 0x48007a12, 0x59a0020c, 0x48007c12, 0x600c0000, + 0x05edfc59, 0x80102000, 0x4810780d, 0x48134209, + 0x901021c0, 0x48134409, 0x59e40052, 0x4803c857, + 0x4a007816, 0x00000400, 0x903c0416, 0x48034208, + 0x900001c0, 0x48034408, 0x05fdf42a, 0x583c0800, + 0x830e1d00, 0xffcfffff, 0x48ec7820, 0x4a01d802, + 0x00000100, 0x583c0017, 0x82000500, 0x000000ff, + 0x05020008, 0x4807c857, 0x8c040502, 0x05000004, + 0x84040d48, 0x48047800, 0x1c01f000, 0x0501f003, + 0x05f5f940, 0x1c01f000, 0x42007800, 0x0010b364, + 0x583dd820, 0x58ef400a, 0x40ec6000, 0x583c0000, + 0x48efc857, 0x49a3c857, 0x4803c857, 0x82000500, + 0x0000ffc0, 0x48007800, 0x583c001d, 0x4803c857, + 0x583c0819, 0x4807c857, 0x48074208, 0x900409c0, + 0x48074408, 0x583c081a, 0x48074209, 0x900409c0, + 0x48074409, 0x583c081b, 0x4807420a, 0x900409c0, + 0x4807440a, 0x583c081c, 0x4807420b, 0x900409c0, + 0x4807440b, 0x49787818, 0x583c0017, 0x49787817, + 0x82000500, 0x000000ff, 0x05fe03eb, 0x05fdf3f1, + 0x59a80005, 0x48034407, 0x59a80006, 0x48034208, + 0x59a80007, 0x48034408, 0x05fdf3ea, 0x05edfb7c, + 0x4803c856, 0x59a0020c, 0x4803c857, 0x8c00051e, + 0x050a00d2, 0x05f9fc74, 0x05000003, 0x05f9fc56, + 0x05000003, 0x648b4407, 0x05fdf420, 0x4a03c013, + 0x03800300, 0x4a03c014, 0x03800380, 0x59a00c07, + 0x82040580, 0x000000a0, 0x05000004, 0x82040580, + 0x000000a2, 0x0502001c, 0x59a0140b, 0x82080480, + 0x00000100, 0x05021018, 0x59a0020c, 0x8c000500, + 0x0502001f, 0x59a00a0b, 0x800409c0, 0x05000012, + 0xb0040481, 0x05021010, 0x0505fefb, 0x0500000a, + 0x59a01008, 0x900811c0, 0x59a0180a, 0x900c19c0, + 0x59a00a0b, 0x0505ff16, 0x4a01d808, 0x001026a8, + 0x1c01f000, 0x640b4407, 0x4a03c014, 0x03800000, + 0x05fdf3fa, 0x4a03c014, 0x03800000, 0x05fdf3fb, + 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, + 0x82000580, 0x00000200, 0x05fc03e8, 0x59a00c07, + 0x59a0140b, 0x59a0020c, 0x8c000500, 0x05020038, + 0x912e5c05, 0x4178c000, 0x59a0ba0b, 0x40600000, + 0x812c0400, 0x5000c800, 0x82641d00, 0x000000ff, + 0x4c040000, 0x4c080000, 0x0501f8b8, 0x5c001000, + 0x5c000800, 0x05000037, 0x805cb840, 0x05000032, + 0x80081000, 0x82641d00, 0x0000ff00, 0x800c1910, + 0x4c040000, 0x4c080000, 0x0501f8ac, 0x5c001000, + 0x5c000800, 0x0500002b, 0x805cb840, 0x05000026, + 0x80081000, 0x82641d00, 0x00ff0000, 0x800c1920, + 0x4c040000, 0x4c080000, 0x0501f8a0, 0x5c001000, + 0x5c000800, 0x0500001f, 0x805cb840, 0x0500001a, + 0x80081000, 0x82641d00, 0xff000000, 0x800c1930, + 0x4c040000, 0x4c080000, 0x0501f894, 0x5c001000, + 0x5c000800, 0x05000013, 0x805cb840, 0x0500000e, + 0x80081000, 0x8060c000, 0x05fdf7cd, 0x59a0020b, + 0x82000500, 0x000000ff, 0x40001800, 0x4c040000, + 0x4c080000, 0x0501f885, 0x5c001000, 0x5c000800, + 0x05000004, 0x4a03c014, 0x03800000, 0x05fdf365, + 0x4a03c014, 0x03800000, 0x64134407, 0x05fdf3a3, + 0x4803c856, 0x59a0020c, 0x4803c857, 0x8c00051e, + 0x050a0012, 0x05f9fbec, 0x05000003, 0x05f9fbce, + 0x05000003, 0x648b4407, 0x05fdf398, 0x4a03c013, + 0x03800300, 0x4a03c014, 0x03800380, 0x59a00c07, + 0x82040580, 0x000000a0, 0x05000004, 0x82040580, + 0x000000a2, 0x05020062, 0x59a0140b, 0x82080480, + 0x00000100, 0x0502105e, 0x59a0020c, 0x8c000500, + 0x05020050, 0x59a01a0b, 0x800c19c0, 0x05000058, + 0xb00c0481, 0x05021056, 0x0505fe73, 0x05020006, + 0x640b4407, 0x4a03c014, 0x03800000, 0x4803c857, + 0x05fdf37a, 0x912e5c05, 0x4178c000, 0x59a0ba0b, + 0x4803c857, 0x40600000, 0x812c0400, 0x4000c800, + 0x4c040000, 0x4c080000, 0x0501f879, 0x5c001000, + 0x5c000800, 0x0500003e, 0x4414c800, 0x805cb840, + 0x0500002b, 0x80081000, 0x4c040000, 0x4c080000, + 0x0501f86f, 0x5c001000, 0x5c000800, 0x05000034, + 0x50640000, 0x801428d0, 0x80140540, 0x4400c800, + 0x805cb840, 0x0500001e, 0x80081000, 0x4c040000, + 0x4c080000, 0x0501f862, 0x5c001000, 0x5c000800, + 0x05000027, 0x50640000, 0x801428e0, 0x80140540, + 0x4400c800, 0x805cb840, 0x05000011, 0x80081000, + 0x4c040000, 0x4c080000, 0x0501f855, 0x5c001000, + 0x5c000800, 0x0500001a, 0x50640000, 0x801428f0, + 0x80140540, 0x4400c800, 0x805cb840, 0x05000004, + 0x80081000, 0x8060c000, 0x05fdf7ca, 0x59a00a0b, + 0x59a01008, 0x900811c0, 0x59a0180a, 0x900c19c0, + 0x4a03c014, 0x03800000, 0x412c0000, 0x0505f64e, + 0x4803c857, 0x0501f83e, 0x05000005, 0x48174407, + 0x4a03c014, 0x03800000, 0x05fdf2ee, 0x4a03c014, + 0x03800000, 0x64134407, 0x05fdf32c, 0x4a03c014, + 0x03800000, 0x05fdf32d, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4004b800, 0x4008c000, 0x400cc800, + 0x0501f86d, 0x0500000f, 0x0501f89b, 0x05020011, + 0x4060b800, 0x0501f898, 0x0502000e, 0x4064b800, + 0x0501f895, 0x0502000b, 0x0501f883, 0x4ce80000, + 0x6021d027, 0x0519feb8, 0x5c01d000, 0x90000541, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x0501f879, 0x80000580, 0x05fdf7fa, 0x4c5c0000, + 0x485fc857, 0x0501f854, 0x05000008, 0x905cbd41, + 0x0501f881, 0x05020009, 0x0501f8bd, 0x0501f8ef, + 0x0501f86d, 0x90000541, 0x4803c857, 0x4867c857, + 0x5c00b800, 0x1c01f000, 0x0501f867, 0x80000580, + 0x4803c857, 0x485fc857, 0x05fdf7f8, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x4807c857, 0x480bc857, + 0x4004b800, 0x4008c000, 0x0501f83b, 0x0500000c, + 0x0501f869, 0x0502000f, 0x4c5c0000, 0x4060b800, + 0x0501f865, 0x5c00b800, 0x0502000a, 0x05fdffdc, + 0x05000003, 0x0501f850, 0x90000541, 0x40642800, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x0501f849, 0x80000580, 0x4803c857, 0x4867c857, + 0x05fdf7f7, 0x4ce80000, 0x4c580000, 0x4803c856, + 0x6030b000, 0x6029d000, 0x0519fe77, 0x4a03c013, + 0x02000200, 0x6029d000, 0x0519fe73, 0x4a03c013, + 0x02000000, 0x8058b040, 0x05fe07f7, 0x61a00807, + 0x4a03c013, 0x03800300, 0x80040840, 0x0500000f, + 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, + 0x03800380, 0x82000500, 0x00000300, 0x82000580, + 0x00000300, 0x05fe07f3, 0x90000541, 0x5c00b000, + 0x5c01d000, 0x1c01f000, 0x4803c857, 0x80000580, + 0x05fdf7fb, 0x4ce80000, 0x4803c856, 0x61a00807, + 0x4a03c013, 0x03800300, 0x80040840, 0x05000016, + 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, + 0x03800380, 0x82000500, 0x00000300, 0x82000580, + 0x00000300, 0x05fe07f3, 0x6029d000, 0x0519fe46, + 0x4a03c013, 0x01000000, 0x6029d000, 0x0519fe42, + 0x4a03c013, 0x02000000, 0x90000541, 0x5c01d000, + 0x1c01f000, 0x4803c857, 0x05fdffbf, 0x05fe07f3, + 0x05fdf7fb, 0x4803c856, 0x4a03c013, 0x01000000, + 0x4ce80000, 0x6029d000, 0x0519fe33, 0x5c01d000, + 0x4a03c013, 0x02000200, 0x4ce80000, 0x6029d000, + 0x0519fe2d, 0x5c01d000, 0x4a03c013, 0x01000100, + 0x1c01f000, 0x4c5c0000, 0x4c600000, 0x485fc857, + 0x6020c000, 0x825c0500, 0x00000080, 0x800000c2, + 0x82000540, 0x01000000, 0x4803c013, 0x4ce80000, + 0x6029d000, 0x0519fe1c, 0x5c01d000, 0x4a03c013, + 0x02000200, 0x4ce80000, 0x6029d000, 0x0519fe16, + 0x5c01d000, 0x4a03c013, 0x02000000, 0x805cb8c2, + 0x8060c040, 0x05fe07ec, 0x4a03c013, 0x01000100, + 0x4ce80000, 0x6029d000, 0x0519fe0b, 0x5c01d000, + 0x4a03c013, 0x02000200, 0x4ce80000, 0x6029d000, + 0x0519fe05, 0x5c01d000, 0x4a03c014, 0x03800000, + 0x61a00807, 0x59e0b813, 0x825cbd00, 0x00000100, + 0x80040840, 0x05000004, 0x405c0000, 0x80000540, + 0x05fe07f9, 0x4a03c014, 0x03800380, 0x4a03c013, + 0x02000000, 0x4ce80000, 0x6029d000, 0x0519fdf2, + 0x5c01d000, 0x485fc857, 0x405c0000, 0x80000540, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4c600000, + 0x4803c856, 0x4a03c013, 0x01000100, 0x6020c000, + 0x61a0c807, 0x4ce80000, 0x6029d000, 0x0519fde2, + 0x5c01d000, 0x4a03c013, 0x02000200, 0x4a03c014, 0x03800000, 0x59e00013, 0x4a03c014, 0x03800380, - 0x82000500, 0x00000100, 0x80000110, 0x8064c8c2, - 0x8064cd40, 0x4a03c013, 0x02000000, 0x8060c040, - 0x05fe07e9, 0x4867c857, 0x5c00c000, 0x1c01f000, - 0x4803c856, 0x4a03c013, 0x01000100, 0x4ce80000, - 0x6029d000, 0x0519fc96, 0x5c01d000, 0x4a03c013, - 0x02000200, 0x4ce80000, 0x6029d000, 0x0519fc90, - 0x5c01d000, 0x4a03c013, 0x02000000, 0x1c01f000, - 0x59a00408, 0x59a8082e, 0x4803502e, 0x48074408, - 0x59a00a0a, 0x90040494, 0x05021002, 0x6140080f, - 0x59a8002f, 0x4807502f, 0x4803420a, 0x05fdf1ba, - 0x59a00407, 0x59a00a08, 0x900409c0, 0x80040d40, - 0x59a00408, 0x59a01209, 0x900811c0, 0x80081540, - 0x59a00409, 0x59a01a0a, 0x900c19c0, 0x800c1d40, - 0x59a0040a, 0x59a0220b, 0x901021c0, 0x80102540, - 0x053df9dc, 0x05fc01a8, 0x05fdf1fd, 0x916c0580, - 0x0500000a, 0x59a80005, 0x59a00c07, 0x80041580, - 0xb0081500, 0x05fc01a0, 0x80080580, 0x48035005, - 0x05edfbc1, 0x05fdf19c, 0x59a00407, 0x59a80805, - 0x48035005, 0x80040d80, 0x8c04050c, 0x05ee0bba, - 0x59a00208, 0x599c0818, 0x8c040510, 0x05000002, - 0x8400054a, 0x48035006, 0x59a00408, 0x8c00051a, - 0x05000009, 0x600018ec, 0x60140800, 0x580c1006, - 0x4a001805, 0x70000005, 0x900c1c20, 0x80040840, - 0x05fe07fb, 0x48035007, 0x05fdf183, 0x8d0c050e, - 0x05000003, 0x64074407, 0x05fdf1c1, 0x0511f9f2, - 0x05020003, 0x645b4407, 0x05fdf1bd, 0x916c0583, - 0x05000003, 0x641f4407, 0x05fdf1b9, 0x59a00c07, - 0x82040500, 0xffffff00, 0x05fe01b9, 0x82041580, + 0x82000500, 0x00000200, 0x05020003, 0x8064c840, + 0x05fe07f7, 0x4178c800, 0x0501f007, 0x4ce80000, + 0x6029d000, 0x0519fdd0, 0x5c01d000, 0x4a03c013, + 0x02000200, 0x4ce80000, 0x6029d000, 0x0519fdca, + 0x5c01d000, 0x4a03c014, 0x03800000, 0x59e00013, + 0x4a03c014, 0x03800380, 0x82000500, 0x00000100, + 0x80000110, 0x8064c8c2, 0x8064cd40, 0x4a03c013, + 0x02000000, 0x8060c040, 0x05fe07e9, 0x4867c857, + 0x5c00c000, 0x1c01f000, 0x4803c856, 0x4a03c013, + 0x01000100, 0x4ce80000, 0x6029d000, 0x0519fdb2, + 0x5c01d000, 0x4a03c013, 0x02000200, 0x4ce80000, + 0x6029d000, 0x0519fdac, 0x5c01d000, 0x4a03c013, + 0x02000000, 0x1c01f000, 0x59a00408, 0x59a8082e, + 0x4803502e, 0x48074408, 0x59a00a0a, 0x90040494, + 0x05021002, 0x6140080f, 0x59a8002f, 0x4807502f, + 0x4803420a, 0x05fdf1b7, 0x59a00407, 0x59a00a08, + 0x900409c0, 0x80040d40, 0x59a00408, 0x59a01209, + 0x900811c0, 0x80081540, 0x59a00409, 0x59a01a0a, + 0x900c19c0, 0x800c1d40, 0x59a0040a, 0x59a0220b, + 0x901021c0, 0x80102540, 0x053dfbfd, 0x05fc01a5, + 0x05fdf1fa, 0x916c0580, 0x0500000a, 0x59a80005, + 0x59a00c07, 0x80041580, 0xb0081500, 0x05fc019d, + 0x80080580, 0x48035005, 0x05edfb1b, 0x05fdf199, + 0x59a00407, 0x59a80805, 0x48035005, 0x80040d80, + 0x8c04050c, 0x05ee0b14, 0x59a00208, 0x599c0818, + 0x8c040510, 0x05000002, 0x8400054a, 0x48035006, + 0x59a00408, 0x8c00051a, 0x05000009, 0x600018ec, + 0x60140800, 0x580c1006, 0x4a001805, 0x70000005, + 0x900c1c20, 0x80040840, 0x05fe07fb, 0x48035007, + 0x05fdf180, 0x8d0c050e, 0x05000003, 0x64074407, + 0x05fdf1be, 0x0511fa51, 0x05020003, 0x645b4407, + 0x05fdf1ba, 0x916c0583, 0x05000003, 0x641f4407, + 0x05fdf1b6, 0x59a00c07, 0x82040500, 0xffffff00, + 0x05fe01b6, 0x82041580, 0x000000ff, 0x05020007, + 0x59a8000f, 0x82000500, 0x000000ff, 0x82001540, + 0x0000ff00, 0x0501f00f, 0x82040400, 0x001020b6, + 0x50000000, 0x80000110, 0x82000580, 0x00000080, + 0x05fc01a6, 0x59a8000f, 0x82000500, 0x000000ff, + 0x80041580, 0x05fc01a1, 0x840409c0, 0x80041540, + 0x0521fdf9, 0x05020003, 0x640f4407, 0x05fdf197, + 0x48ee602d, 0x480a621e, 0x4a02641e, 0x0000bc09, + 0x64066407, 0x0505fc84, 0x05020004, 0x0005fc5a, + 0x640b4407, 0x05fdf18d, 0x497a5a05, 0x497a5806, + 0x4a025c05, 0x00008000, 0x4a01d808, 0x00102959, + 0x492e6009, 0x60ca7000, 0x0005f478, 0x8d0c050e, + 0x05000003, 0x64074407, 0x05fdf180, 0x0511fa13, + 0x05020003, 0x645b4407, 0x05fdf17c, 0x916c0583, + 0x05000003, 0x641f4407, 0x05fdf178, 0x59a00c07, + 0x82040500, 0xffffff00, 0x05fe0178, 0x82041580, 0x000000ff, 0x05020007, 0x59a8000f, 0x82000500, 0x000000ff, 0x82001540, 0x0000ff00, 0x0501f00f, - 0x82040400, 0x00102013, 0x50000000, 0x80000110, - 0x82000580, 0x00000080, 0x05fc01a9, 0x59a8000f, - 0x82000500, 0x000000ff, 0x80041580, 0x05fc01a4, - 0x840409c0, 0x80041540, 0x0521fce7, 0x05020003, - 0x640f4407, 0x05fdf19a, 0x48ee602d, 0x480a621e, - 0x4a02641e, 0x0000bc09, 0x64066407, 0x0505fc5f, - 0x05020004, 0x0005fc5a, 0x640b4407, 0x05fdf190, + 0x82040400, 0x001020b6, 0x50000000, 0x80000110, + 0x82000580, 0x00000080, 0x05fc0168, 0x59a8000f, + 0x82000500, 0x000000ff, 0x80041580, 0x05fc0163, + 0x840409c0, 0x80041540, 0x0521fdbb, 0x05020003, + 0x640f4407, 0x05fdf159, 0x48ee602d, 0x480a621e, + 0x4a02641e, 0x0000bc05, 0x64066407, 0x0505fc46, + 0x05020004, 0x0005fc5a, 0x640b4407, 0x05fdf14f, 0x497a5a05, 0x497a5806, 0x4a025c05, 0x00008000, - 0x4a01d808, 0x001028b3, 0x492e6009, 0x60ca7000, - 0x0005f478, 0x8d0c050e, 0x05000003, 0x64074407, - 0x05fdf183, 0x0511f9b4, 0x05020003, 0x645b4407, - 0x05fdf17f, 0x916c0583, 0x05000003, 0x641f4407, - 0x05fdf17b, 0x59a00c07, 0x82040500, 0xffffff00, - 0x05fe017b, 0x82041580, 0x000000ff, 0x05020007, - 0x59a8000f, 0x82000500, 0x000000ff, 0x82001540, - 0x0000ff00, 0x0501f00f, 0x82040400, 0x00102013, - 0x50000000, 0x80000110, 0x82000580, 0x00000080, - 0x05fc016b, 0x59a8000f, 0x82000500, 0x000000ff, - 0x80041580, 0x05fc0166, 0x840409c0, 0x80041540, - 0x0521fca9, 0x05020003, 0x640f4407, 0x05fdf15c, - 0x48ee602d, 0x480a621e, 0x4a02641e, 0x0000bc05, - 0x64066407, 0x0505fc21, 0x05020004, 0x0005fc5a, - 0x640b4407, 0x05fdf152, 0x497a5a05, 0x497a5806, - 0x4a025c05, 0x00008000, 0x4a01d808, 0x001028b3, - 0x492e6009, 0x60ca7000, 0x0005f478, 0x592c0006, - 0x82000580, 0x01000000, 0x05fe0103, 0x64134407, - 0x05fdf143, 0x497b4407, 0x497b4208, 0x8d0c0520, - 0x05000008, 0x59a80062, 0x59a80863, 0x80040480, - 0x59a80864, 0x48074407, 0x80041480, 0x480b4208, - 0x0505fd29, 0x48034408, 0x59a8100d, 0x59a80266, - 0x80080480, 0x4803420a, 0x495f440a, 0x59a8001a, - 0x4803420c, 0x4a03440c, 0x000000fe, 0x05fdf0ea, - 0x8d0c050e, 0x05000003, 0x64074407, 0x05fdf128, - 0x59a00407, 0x8c000500, 0x0502000d, 0x59a80065, - 0x81640480, 0x05001008, 0x59a8000b, 0x81500580, - 0x05000007, 0x59a80063, 0x59a81062, 0x80080580, - 0x05000003, 0x64634407, 0x05fdf119, 0x850e1d58, - 0x4803c856, 0x850e1d46, 0x0509f82b, 0x05fdf0d2, - 0x599c0201, 0x4803507f, 0x41780800, 0x60401076, - 0x0519fc50, 0x480b5080, 0x1c01f000, 0x0501f805, - 0x60018800, 0x05020002, 0x60058800, 0x1c01f000, - 0x90000541, 0x0502500b, 0x4203e000, 0x80000000, - 0x40e81000, 0x41780800, 0x61900000, 0x0519fc41, - 0x5994002e, 0x80080400, 0x4803282e, 0x80000580, - 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x4cd80000, 0x417a3000, 0x051dfbcb, - 0x051df8b3, 0x5c01b000, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x1c01f000, 0x59c80003, - 0x82000500, 0xffffe0ff, 0x48039003, 0x61f00800, - 0x05f5fa3c, 0x4a03902c, 0x00200000, 0x61d0b003, - 0x59c8002c, 0x8c00052c, 0x05000006, 0x8058b040, - 0x05fe07fc, 0x600c0080, 0x41781000, 0x0501f11e, - 0x640b5088, 0x42006000, 0x00102a52, 0x50301000, - 0x41784800, 0x4a03902d, 0x00008000, 0x61d0b003, - 0x59c8002c, 0x8c000534, 0x05000006, 0x8058b040, - 0x05fe07fc, 0x600c0080, 0x41781000, 0x0501f10e, - 0x0501f894, 0x80244800, 0x82240580, 0x000003b1, - 0x05fe07fc, 0x0501f918, 0x41784800, 0x0501f8b8, - 0x80244800, 0x82240580, 0x000003b1, 0x05fe07fc, - 0x80306000, 0x82300580, 0x00102a54, 0x05fe07e4, + 0x4a01d808, 0x00102959, 0x492e6009, 0x60ca7000, + 0x0005f478, 0x592c0006, 0x82000580, 0x01000000, + 0x05fe0100, 0x64134407, 0x05fdf140, 0x497b4407, + 0x497b4208, 0x8d0c0520, 0x05000008, 0x59a80062, + 0x59a80863, 0x80040480, 0x59a80864, 0x48074407, + 0x80041480, 0x480b4208, 0x0505fd4e, 0x48034408, + 0x59a8100d, 0x59a80266, 0x80080480, 0x4803420a, + 0x495f440a, 0x59a8001a, 0x4803420c, 0x4a03440c, + 0x000000fe, 0x05fdf0e7, 0x8d0c050e, 0x05000003, + 0x64074407, 0x05fdf125, 0x59a00407, 0x8c000500, + 0x0502000d, 0x59a80065, 0x81640480, 0x05001008, + 0x59a8000b, 0x81500580, 0x05000007, 0x59a80063, + 0x59a81062, 0x80080580, 0x05000003, 0x64634407, + 0x05fdf116, 0x850e1d58, 0x4803c856, 0x850e1d46, + 0x0509f858, 0x05fdf0cf, 0x599c0201, 0x4803507f, + 0x41780800, 0x60401076, 0x0519fd6c, 0x480b5080, + 0x1c01f000, 0x0501f805, 0x60018800, 0x05020002, + 0x60058800, 0x1c01f000, 0x90000541, 0x0502500b, + 0x4203e000, 0x80000000, 0x40e81000, 0x41780800, + 0x61900000, 0x0519fd5d, 0x5994002e, 0x80080400, + 0x4803282e, 0x80000580, 0x1c01f000, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, + 0x417a3000, 0x051dfce7, 0x051df9cf, 0x5c01b000, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x1c01f000, 0x59c80003, 0x82000500, 0xffffe0ff, + 0x48039003, 0x61f00800, 0x05f5f994, 0x4a03902c, + 0x00200000, 0x61d0b003, 0x59c8002c, 0x8c00052c, + 0x05000006, 0x8058b040, 0x05fe07fc, 0x600c0080, + 0x41781000, 0x0501f11e, 0x640b5088, 0x42006000, + 0x00102af8, 0x50301000, 0x41784800, 0x4a03902d, + 0x00008000, 0x61d0b003, 0x59c8002c, 0x8c000534, + 0x05000006, 0x8058b040, 0x05fe07fc, 0x600c0080, + 0x41781000, 0x0501f10e, 0x0501f894, 0x80244800, + 0x82240580, 0x000003b1, 0x05fe07fc, 0x0501f918, + 0x41784800, 0x0501f8b8, 0x80244800, 0x82240580, + 0x000003b1, 0x05fe07fc, 0x80306000, 0x82300580, + 0x00102afa, 0x05fe07e4, 0x59a80887, 0x800409c0, + 0x05000005, 0x60100080, 0x60081000, 0x59a81886, + 0x0501f0f7, 0x42006000, 0x00102af8, 0x64435088, + 0x50301000, 0x41784800, 0x4a03902d, 0x00000800, + 0x0501f876, 0x80244800, 0x90240598, 0x05fe07fd, + 0x0501f8fb, 0x41784800, 0x0501f89b, 0x80244800, + 0x90240598, 0x05fe07fd, 0x80306000, 0x82300580, + 0x00102afa, 0x05fe07ef, 0x59a80887, 0x800409c0, + 0x05000005, 0x60100080, 0x60401000, 0x59a81886, + 0x0501f0db, 0x42006000, 0x00102af8, 0x64235088, + 0x50301000, 0x41784800, 0x4a03902d, 0x00000400, + 0x0501f85a, 0x80244800, 0x82240580, 0x00000088, + 0x05fe07fc, 0x0501f8de, 0x41784800, 0x0501f87e, + 0x80244800, 0x82240580, 0x00000088, 0x05fe07fc, + 0x80306000, 0x82300580, 0x00102afa, 0x05fe07ed, 0x59a80887, 0x800409c0, 0x05000005, 0x60100080, - 0x60081000, 0x59a81886, 0x0501f0f7, 0x42006000, - 0x00102a52, 0x64435088, 0x50301000, 0x41784800, - 0x4a03902d, 0x00000800, 0x0501f876, 0x80244800, - 0x90240598, 0x05fe07fd, 0x0501f8fb, 0x41784800, - 0x0501f89b, 0x80244800, 0x90240598, 0x05fe07fd, - 0x80306000, 0x82300580, 0x00102a54, 0x05fe07ef, - 0x59a80887, 0x800409c0, 0x05000005, 0x60100080, - 0x60401000, 0x59a81886, 0x0501f0db, 0x42006000, - 0x00102a52, 0x64235088, 0x50301000, 0x41784800, - 0x4a03902d, 0x00000400, 0x0501f85a, 0x80244800, - 0x82240580, 0x00000088, 0x05fe07fc, 0x0501f8de, - 0x41784800, 0x0501f87e, 0x80244800, 0x82240580, - 0x00000088, 0x05fe07fc, 0x80306000, 0x82300580, - 0x00102a54, 0x05fe07ed, 0x59a80887, 0x800409c0, - 0x05000005, 0x60100080, 0x60201000, 0x59a81886, - 0x0501f0bd, 0x42006000, 0x00102a52, 0x64835088, - 0x50301000, 0x41784800, 0x4a03902d, 0x00002000, - 0x61d0b003, 0x59c8002c, 0x8c000530, 0x05000006, - 0x8058b040, 0x05fe07fc, 0x600c0080, 0x41781000, - 0x0501f0ad, 0x59c8002c, 0x82000500, 0xffe0ffff, - 0x82080d00, 0x001f0000, 0x80040540, 0x4803902c, - 0x0501f82c, 0x80244800, 0x82240580, 0x00000110, - 0x05fe07fc, 0x0501f8b0, 0x41784800, 0x0501f850, - 0x59c80034, 0x82080d00, 0x001f0000, 0x82000500, - 0x001f0000, 0x80040580, 0x05000006, 0x59a80087, - 0x80000000, 0x48035087, 0x40240000, 0x48035086, - 0x80244800, 0x82240580, 0x00000110, 0x05fe07f0, - 0x80306000, 0x82300580, 0x00102a54, 0x05fe07d1, - 0x59a80887, 0x800409c0, 0x05000004, 0x60100080, - 0x60801000, 0x59a81886, 0x59c80803, 0x82040d40, - 0x00001f00, 0x48079003, 0x59c8002c, 0x8400052a, - 0x4803902c, 0x61f00800, 0x05f5f98e, 0x05f9f7f6, - 0x59c8002c, 0x82000500, 0xffff0000, 0x82080d00, - 0x0000ffff, 0x80040540, 0x4803902c, 0x480b9028, - 0x480b9029, 0x59a80088, 0x90004584, 0x05000007, - 0x90000590, 0x05020003, 0x80080920, 0x4807903a, - 0x480b902a, 0x480b902b, 0x59c8002d, 0x82000500, - 0xfffffc00, 0x80240540, 0x4803902d, 0x61d0b003, + 0x60201000, 0x59a81886, 0x0501f0bd, 0x42006000, + 0x00102af8, 0x64835088, 0x50301000, 0x41784800, + 0x4a03902d, 0x00002000, 0x61d0b003, 0x59c8002c, + 0x8c000530, 0x05000006, 0x8058b040, 0x05fe07fc, + 0x600c0080, 0x41781000, 0x0501f0ad, 0x59c8002c, + 0x82000500, 0xffe0ffff, 0x82080d00, 0x001f0000, + 0x80040540, 0x4803902c, 0x0501f82c, 0x80244800, + 0x82240580, 0x00000110, 0x05fe07fc, 0x0501f8b0, + 0x41784800, 0x0501f850, 0x59c80034, 0x82080d00, + 0x001f0000, 0x82000500, 0x001f0000, 0x80040580, + 0x05000006, 0x59a80087, 0x80000000, 0x48035087, + 0x40240000, 0x48035086, 0x80244800, 0x82240580, + 0x00000110, 0x05fe07f0, 0x80306000, 0x82300580, + 0x00102afa, 0x05fe07d1, 0x59a80887, 0x800409c0, + 0x05000004, 0x60100080, 0x60801000, 0x59a81886, + 0x59c80803, 0x82040d40, 0x00001f00, 0x48079003, + 0x59c8002c, 0x8400052a, 0x4803902c, 0x61f00800, + 0x05f5f8e6, 0x05f9f7f3, 0x59c8002c, 0x82000500, + 0xffff0000, 0x82080d00, 0x0000ffff, 0x80040540, + 0x4803902c, 0x480b9028, 0x480b9029, 0x59a80088, + 0x90004584, 0x05000007, 0x90000590, 0x05020003, + 0x80080920, 0x4807903a, 0x480b902a, 0x480b902b, + 0x59c8002d, 0x82000500, 0xfffffc00, 0x80240540, + 0x4803902d, 0x61d0b003, 0x59c8002c, 0x82000500, + 0x18000000, 0x05000006, 0x8058b040, 0x05fe07fb, + 0x600c0080, 0x41781000, 0x0501f059, 0x6407902e, + 0x61d0b003, 0x59c8002e, 0x8c000500, 0x05000005, + 0x8058b040, 0x05fe07fc, 0x600c0080, 0x0501f050, + 0x1c01f000, 0x41783800, 0x59c8002d, 0x82000500, + 0xfffffc00, 0x80240d40, 0x4807902d, 0x61d0b003, 0x59c8002c, 0x82000500, 0x18000000, 0x05000006, 0x8058b040, 0x05fe07fb, 0x600c0080, 0x41781000, - 0x0501f059, 0x6407902e, 0x61d0b003, 0x59c8002e, - 0x8c000500, 0x05000005, 0x8058b040, 0x05fe07fc, - 0x600c0080, 0x0501f050, 0x1c01f000, 0x41783800, - 0x59c8002d, 0x82000500, 0xfffffc00, 0x80240d40, - 0x4807902d, 0x61d0b003, 0x59c8002c, 0x82000500, - 0x18000000, 0x05000006, 0x8058b040, 0x05fe07fb, - 0x600c0080, 0x41781000, 0x0501f03f, 0x59c81830, - 0x59c80030, 0x800c0d80, 0x05fe07fd, 0x80080d80, - 0x05000002, 0x801c3800, 0x59c82031, 0x59c80031, - 0x80100d80, 0x05fe07fd, 0x80080d80, 0x05000002, - 0x801c3800, 0x59a80088, 0x90004584, 0x0500001e, - 0x61fc41ff, 0x90000590, 0x05020003, 0x42004000, - 0x7f7f7f7f, 0x59c82832, 0x59c80032, 0x80140d80, + 0x0501f03f, 0x59c81830, 0x59c80030, 0x800c0d80, 0x05fe07fd, 0x80080d80, 0x05000002, 0x801c3800, - 0x59c83033, 0x59c80033, 0x80180d80, 0x05fe07fd, - 0x80080d80, 0x05000002, 0x801c3800, 0x59c80034, + 0x59c82031, 0x59c80031, 0x80100d80, 0x05fe07fd, + 0x80080d80, 0x05000002, 0x801c3800, 0x59a80088, + 0x90004584, 0x0500001e, 0x61fc41ff, 0x90000590, + 0x05020003, 0x42004000, 0x7f7f7f7f, 0x59c82832, + 0x59c80032, 0x80140d80, 0x05fe07fd, 0x80080d80, + 0x05000002, 0x801c3800, 0x59c83033, 0x59c80033, + 0x80180d80, 0x05fe07fd, 0x80080d80, 0x05000002, + 0x801c3800, 0x59c80034, 0x59c80834, 0x80040d80, + 0x05fe07fd, 0x80080d80, 0x40200000, 0x80040d00, + 0x0500000c, 0x801c3800, 0x0501f00a, 0x59c80034, 0x59c80834, 0x80040d80, 0x05fe07fd, 0x80080d80, - 0x40200000, 0x80040d00, 0x0500000c, 0x801c3800, - 0x0501f00a, 0x59c80034, 0x59c80834, 0x80040d80, - 0x05fe07fd, 0x80080d80, 0x82040d00, 0x000000ff, - 0x05000002, 0x801c3800, 0x801c39c0, 0x05000005, - 0x59a80087, 0x801c0400, 0x48035087, 0x48275086, - 0x1c01f000, 0x48034207, 0x48074407, 0x480b4208, - 0x480f4408, 0x48134209, 0x48174409, 0x59c80003, - 0x82000540, 0x00001f00, 0x48039003, 0x59c8002c, - 0x8400052a, 0x4803902c, 0x61f00800, 0x05f5f905, - 0x05f9f770, 0x42000000, 0x00600000, 0x80000040, - 0x05fe07ff, 0x1c01f000, 0x5a5a5a5a, 0xa5a5a5a5, - 0x0505fa72, 0x05020003, 0x640b4407, 0x05f9f7a4, - 0x42005000, 0x0010b110, 0x50285000, 0x482b4000, - 0x4200a000, 0x0010b111, 0x59a00408, 0x59a01208, - 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, - 0x900c19c0, 0x800c1d40, 0x42024800, 0x0010b111, - 0x912cac05, 0x6018b000, 0x9050040b, 0x48034001, - 0x0539fdf4, 0x60180800, 0x800400c4, 0x80080c00, - 0x48074002, 0x900c0c40, 0x48074003, 0x60180800, - 0x912c0405, 0x0505fa77, 0x4a01d808, 0x00102a79, - 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, - 0x82000580, 0x00000200, 0x05f80775, 0x59a0a001, - 0x59a01000, 0x80081040, 0x480b4000, 0x05000005, - 0x59a01002, 0x59a01803, 0x58ee580c, 0x05fdf7e1, - 0x42000800, 0x0010b110, 0x50040800, 0x48074407, - 0x05f9f72d, 0x0505fa39, 0x05020003, 0x640b4407, - 0x05f9f76b, 0x59a00c0b, 0x42000000, 0x0010b110, - 0x50000000, 0x80040480, 0x05fa1769, 0x8204a400, - 0x0010a0ec, 0x5050a000, 0x912cac05, 0x6018b000, - 0x0539fdc4, 0x59a00408, 0x59a01208, 0x900811c0, - 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, - 0x800c1d40, 0x60180800, 0x912c0405, 0x0505f245, - 0x59a00c0b, 0x800409c0, 0x05f80755, 0x900404a1, - 0x05fa1753, 0x90040491, 0x05001002, 0x60400800, - 0x59a00209, 0x59a01408, 0x900811c0, 0x80081540, - 0x59a00208, 0x59a01c07, 0x900c19c0, 0x800c1d40, - 0x0505fa0e, 0x05000005, 0x0505fa2c, 0x4a01d808, - 0x00102ac0, 0x1c01f000, 0x640b4407, 0x05f9f73c, - 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, - 0x00000200, 0x05f8072e, 0x59a00c0b, 0x90040491, - 0x05001002, 0x60400800, 0x59a0040c, 0x59a0120c, - 0x900811c0, 0x80081540, 0x59a0020a, 0x59a01c09, - 0x900c19c0, 0x800c1d40, 0x58ec0003, 0x0505fa19, - 0x4a01d808, 0x00102ad7, 0x1c01f000, 0x4031d800, - 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f80717, 0x59a00c0b, 0x90040491, 0x05f816da, - 0x90040c90, 0x59a00209, 0x59a01408, 0x900811c0, - 0x80081540, 0x59a00208, 0x59a01c07, 0x900c19c0, - 0x800c1d40, 0xb0081400, 0x58ec0003, 0x0505f9fb, - 0x4a01d808, 0x00102aef, 0x1c01f000, 0x4031d800, - 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f806ff, 0x59a0040b, 0x90000c90, 0x59a0040c, - 0x59a0120c, 0x900811c0, 0x80081540, 0x59a0020a, - 0x59a01c09, 0x900c19c0, 0x800c1d40, 0xb0081400, - 0x58ec0003, 0x0505f9eb, 0x4a01d808, 0x001021b2, - 0x1c01f000, 0x48efc857, 0x59a00208, 0x59a01408, - 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, - 0x900001c0, 0x800c1d40, 0x59a00407, 0x48034000, - 0x480b4001, 0x480f4002, 0x0505f9b4, 0x05020003, - 0x640b4407, 0x05f9f6e6, 0x60400800, 0x0505f9cf, - 0x4a01d808, 0x00102b1b, 0x1c01f000, 0x4031d800, - 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, - 0x00000200, 0x05f806d2, 0x48efc857, 0x49a3c857, - 0x492fc857, 0x592c0a05, 0x80040910, 0x05020003, - 0x64674407, 0x05f9f6d2, 0x4805d80b, 0x0501f009, - 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, - 0x00000200, 0x05f806c2, 0x48efc857, 0x49a3c857, - 0x48efc857, 0x49a3c857, 0x58ec000b, 0x80000040, - 0x0500000d, 0x4801d80b, 0x0505f98c, 0x05020003, - 0x640b4407, 0x05f9f6be, 0x60400800, 0x58ec1006, - 0x58ec1807, 0x0505f9a5, 0x4a01d808, 0x00102b2c, - 0x1c01f000, 0x58ee580c, 0x48efc857, 0x49a3c857, - 0x492fc857, 0x492f3004, 0x592c0405, 0x8400055e, - 0x48025c05, 0x4a01d808, 0x00102b50, 0x1c01f000, - 0x4d2c0000, 0x58ee580c, 0x48efc857, 0x49a3c857, - 0x492fc857, 0x592c0405, 0x8400051e, 0x48025c05, - 0x59a00000, 0x59a01001, 0x59a01802, 0x80081400, - 0x900c1c40, 0x912c0405, 0x60400800, 0x5c025800, - 0x0505f18c, 0x8d0c050e, 0x05000003, 0x64074407, - 0x05f9f697, 0x916c0583, 0x05000003, 0x641f4407, - 0x05f9f693, 0x59a0320c, 0x82183500, 0x000000ff, - 0x59a28c07, 0x0505fa44, 0x05fa0691, 0x050df985, - 0x05fa068f, 0x83440580, 0x000007fd, 0x05000005, - 0x050df927, 0x05000003, 0x64274407, 0x05f9f684, - 0x0505f94e, 0x05020003, 0x640b4407, 0x05f9f680, - 0x801831c0, 0x05000007, 0x412c0800, 0x0505f947, - 0x05020003, 0x640b4407, 0x05f9f679, 0x40065800, - 0x4a025c05, 0x00008000, 0x497a5a05, 0x052df849, - 0x05020003, 0x640f4407, 0x05f9f671, 0x4a01d808, - 0x00102b8e, 0x1c01f000, 0x592c0006, 0x82000580, - 0x01000000, 0x05020003, 0x64134407, 0x05f9f668, - 0x592c0407, 0x82002d00, 0x0000ff00, 0x82000500, - 0x000000ff, 0x80000904, 0x80040800, 0x90040486, - 0x05001002, 0x60140800, 0x4c500000, 0x4c540000, - 0x4c580000, 0x912ca407, 0x4050a800, 0x4004b000, - 0x0539fcf7, 0x59a00408, 0x59a01208, 0x900811c0, - 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, - 0x800c1d40, 0x912c0407, 0x4c140000, 0x0505f93d, - 0x5c002800, 0x801429c0, 0x05000003, 0x4a01d808, - 0x00102bb9, 0x5c00b000, 0x5c00a800, 0x5c00a000, - 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580c, - 0x58ec0002, 0x82000580, 0x00000200, 0x05f80634, - 0x812e59c0, 0x05e80e2e, 0x592c0007, 0x82000500, - 0xff000000, 0x80000904, 0x800409c0, 0x05f805f2, - 0x4807c857, 0x9004048e, 0x05001002, 0x60340800, - 0x592e5801, 0x812e59c0, 0x05e80e21, 0x4c500000, - 0x4c540000, 0x4c580000, 0x912ca406, 0x4050a800, - 0x4004b000, 0x0539fcc6, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x58ec1006, 0x58ec1807, 0x912c0406, - 0x0505f110, 0x0505f8e9, 0x05020003, 0x640b4407, - 0x05f9f61b, 0x59a00c07, 0x82040500, 0x0000ff00, - 0x840001c0, 0x90001487, 0x05fa1619, 0x0c01f001, - 0x00102bef, 0x00102bf5, 0x00102bfb, 0x00102bfb, - 0x00102bfb, 0x00102bfc, 0x00102c00, 0x60340800, - 0x42003800, 0x00102c11, 0x4a034000, 0x0010ac60, - 0x0501f00f, 0x60340800, 0x42003800, 0x00102c11, - 0x4a034000, 0x0010ac6d, 0x0501f009, 0x05f9f604, - 0x60200800, 0x42003800, 0x00102c1e, 0x0501f004, - 0x60100800, 0x42003800, 0x00102c53, 0x59a00208, - 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, - 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x912c0406, - 0x4c1c0000, 0x0505f8d9, 0x5c003800, 0x481dd808, - 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580c, - 0x58ec0002, 0x82000580, 0x00000200, 0x05f805dc, - 0x64075019, 0x6034b000, 0x59a0a800, 0x912ca406, - 0x0539fc7f, 0x05f9f59c, 0x4031d800, 0x58ef400a, - 0x58ee580c, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f805cf, 0x912ca406, 0x50500000, 0x82001500, - 0x000c0016, 0x05fa05d6, 0x90500c03, 0x50040000, - 0x90001501, 0x05fa05d2, 0x50500000, 0x90001528, - 0x05000015, 0x900815a8, 0x05fa05cd, 0x80500800, - 0x50040000, 0x90001513, 0x90081593, 0x05fa05c8, - 0x80040800, 0x50040000, 0x82001500, 0x00050000, - 0x82081580, 0x00050000, 0x05fa05c1, 0x916c0580, - 0x0500000e, 0x599c0019, 0x8c00050e, 0x0502000b, - 0x05f9f5bb, 0x80500800, 0x50040000, 0x90001513, - 0x05fa05b7, 0x80040800, 0x50040000, 0x82001500, - 0x00050000, 0x05fa05b2, 0x6020b000, 0x4200a800, - 0x0010ac58, 0x0539fc0f, 0x05f9f567, 0x4031d800, - 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, - 0x00000200, 0x05f8059a, 0x6010b000, 0x4200a800, - 0x0010b10b, 0x912ca406, 0x0539fc02, 0x850e1d50, - 0x05f9f559, 0x0505f865, 0x05020003, 0x640b4407, - 0x05f9f597, 0x912cac06, 0x59a00c07, 0x82040500, - 0x0000ff00, 0x840001c0, 0x90001488, 0x05fa1594, - 0x0c01f001, 0x00102c75, 0x00102c78, 0x00102c7b, - 0x00102c7b, 0x00102c7b, 0x00102c7c, 0x00102c7b, - 0x00102c82, 0x4200a000, 0x0010ac60, 0x0501f040, - 0x4200a000, 0x0010ac6d, 0x0501f03d, 0x05f9f584, - 0x6020b000, 0x40580800, 0x4200a000, 0x0010ac58, - 0x0539fbe0, 0x0501f039, 0x59a00a0b, 0x6473420b, - 0x9004049c, 0x05f8157a, 0x603cb000, 0x4178a000, - 0x0539fbe0, 0x912cac06, 0x6010b000, 0x91a8a41f, - 0x0539fbd4, 0x916c0580, 0x05000004, 0x6010b000, - 0x91a8a400, 0x0539fbcf, 0x912cac12, 0x600cb000, - 0x91a8a423, 0x0539fbcb, 0x492f4000, 0x0505f82f, - 0x05020003, 0x640b4407, 0x05f9f561, 0x912cac06, - 0x603cb000, 0x4178a000, 0x0539fbca, 0x912cac06, - 0x6004b000, 0x91a8a426, 0x0539fbbe, 0x912cac07, - 0x6010b000, 0x91a8a427, 0x0539fbba, 0x492f4001, - 0x59a25800, 0x59a00208, 0x59a01408, 0x900001c0, - 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, - 0x800c1d40, 0x912c0406, 0x603c0800, 0x0505f839, - 0x4a01d808, 0x00102cc4, 0x1c01f000, 0x6034b000, - 0x40580800, 0x0539fbe2, 0x59a00208, 0x59a01408, - 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, - 0x900001c0, 0x800c1d40, 0x912c0406, 0x0505f029, - 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, - 0x00000200, 0x05f8052a, 0x59a25801, 0x58ec1006, - 0x58ec1807, 0x912c0406, 0x60340800, 0x0505f01d, - 0x916c0580, 0x05020003, 0x641f4407, 0x05f9f528, - 0x59a01407, 0x800811c0, 0x0502002a, 0x497b4208, - 0x05f5fe14, 0x05000011, 0x05f5fdf6, 0x64074208, - 0x0502000e, 0x4c080000, 0x05f5fe00, 0x5c001000, - 0x05020006, 0x640b4208, 0x05f5f9ec, 0x05020007, - 0x64134208, 0x0501f005, 0x640f4208, 0x05f5f9c6, - 0x05020002, 0x64174208, 0x59c40801, 0x82040d00, - 0x00018000, 0x90040580, 0x05020003, 0x64034407, - 0x0501f069, 0x82040580, 0x00008000, 0x05020003, - 0x64074407, 0x0501f064, 0x82040580, 0x00010000, - 0x05020003, 0x640f4407, 0x0501f05f, 0x82040580, - 0x00018000, 0x05ea0cf2, 0x64134407, 0x0501f05a, - 0x59a8008d, 0x8c000502, 0x05000004, 0x60080000, - 0x40000800, 0x0501f012, 0x59a00208, 0x4c000000, - 0x0505f903, 0x5c000000, 0x05000005, 0x4c000000, - 0x0505f916, 0x5c000000, 0x05020007, 0x90000d84, - 0x05000003, 0x90000d82, 0x05020003, 0x600c0000, - 0x600c1000, 0x48034002, 0x59a8083b, 0x4803503b, - 0x599c7819, 0x823c7d00, 0xffff1fff, 0x800000da, - 0x803c7d40, 0x483f3819, 0x497b4208, 0x05f5fdcd, - 0x05000013, 0x05f5fdaf, 0x64074208, 0x05020010, - 0x4c040000, 0x4c080000, 0x05f5fdb8, 0x5c001000, - 0x5c000800, 0x05020006, 0x640b4208, 0x05f5f9a3, - 0x05020007, 0x64134208, 0x0501f005, 0x640f4208, - 0x05f5f97d, 0x05020002, 0x64174208, 0x05f5f97a, - 0x0500000b, 0x05f5f983, 0x05000009, 0x05f5f98c, - 0x05000007, 0x05f5f995, 0x05000005, 0x05f5f99e, - 0x05000003, 0x4807503b, 0x05f9f4c1, 0x90080583, - 0x05020005, 0x59a00002, 0x48035048, 0x640b503b, - 0x0501f005, 0x4a035048, 0xaabbccdd, 0x90080582, - 0x05020011, 0x59c40006, 0x84000500, 0x48038806, - 0x0519fd85, 0x497b8880, 0x42000000, 0x0010b0be, - 0x0539fa45, 0x4803c856, 0x850e1d48, 0x4a038808, - 0x00000200, 0x6012d800, 0x64078805, 0x64075047, - 0x05e9feb2, 0x05f9f460, 0x8d0c050e, 0x05000003, - 0x64074407, 0x05f9f49e, 0x916c0583, 0x05000003, - 0x641f4407, 0x05f9f49a, 0x59a28c07, 0x59a0320c, - 0x82183500, 0x000000ff, 0x0505f84b, 0x05fa0498, - 0x0509ff8c, 0x05fa0496, 0x83440580, 0x000007fd, - 0x05000005, 0x0509ff2e, 0x05000003, 0x60240800, - 0x05f9f48b, 0x0501ff55, 0x05020003, 0x640b4407, - 0x05f9f487, 0x497a5a05, 0x4a025c05, 0x00008000, - 0x0529fe6b, 0x05020003, 0x640f4407, 0x05f9f480, - 0x4a01d808, 0x00102d7f, 0x1c01f000, 0x592c0006, - 0x82000d00, 0x0000ffff, 0x82000500, 0xffff0000, - 0x82000580, 0x01000000, 0x05020003, 0x64134407, - 0x05f9f473, 0x80040904, 0x4c500000, 0x4c540000, - 0x4c580000, 0x912ca406, 0x4050a800, 0x4004b000, - 0x0539fb0b, 0x5c00b000, 0x5c00a800, 0x5c00a000, - 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, - 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, - 0x912c0406, 0x0501f74f, 0x60000020, 0x50000000, - 0x82000480, 0x25320001, 0x05020007, 0x4a03c014, - 0x00400040, 0x4a03c013, 0x00400000, 0x6041d04e, - 0x0515fed7, 0x496fc857, 0x916c0580, 0x05000003, - 0x646b4407, 0x05f9f44e, 0x050dfc7f, 0x05060fa2, - 0x60800800, 0x59a00408, 0x59a01208, 0x900811c0, - 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, - 0x800c1d40, 0x419c0000, 0x49a3c857, 0x0501ff2b, - 0x4a01d808, 0x00102dbf, 0x1c01f000, 0x4833c857, - 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, - 0x00000200, 0x05f8042e, 0x599c0200, 0x800001c0, - 0x05f80437, 0x59a8008d, 0x8c000502, 0x05000011, - 0x599c0017, 0x84000508, 0x48033817, 0x599c0019, - 0x82000500, 0xffff1fff, 0x82000540, 0x00004000, - 0x48033819, 0x599c0018, 0x84000510, 0x84000516, - 0x82000500, 0xffffffcf, 0x90000560, 0x0501f004, - 0x8c000504, 0x05000003, 0x599c0018, 0x48033818, - 0x052dfdba, 0x850e1d20, 0x599c0017, 0x8c000508, - 0x05000003, 0x850e1d60, 0x0501f003, 0x8c00050a, - 0x05fa0417, 0x42024800, 0x0010b111, 0x64124a00, - 0x42000800, 0x0010b110, 0x64040800, 0x42000800, - 0x0010b10f, 0x46000800, 0x0000ffff, 0x59240c00, - 0x84040d46, 0x599c1017, 0x8c08050a, 0x05020002, - 0x84040d48, 0x8c080508, 0x05020002, 0x84040d4a, - 0x84040d4c, 0x48064c00, 0x59240a00, 0x84040d40, - 0x48064a00, 0x4803c857, 0x8c000504, 0x05020004, - 0x59c408a3, 0x84040d7a, 0x480788a3, 0x8c000502, - 0x05020004, 0x59c408a3, 0x84040d08, 0x480788a3, - 0x599c0c02, 0x8c000500, 0x0502000b, 0x8c000516, - 0x0500001f, 0x4c000000, 0x59240400, 0x84000542, - 0x840411c0, 0x80081540, 0x480a4c00, 0x5c000000, - 0x0501f008, 0x4c000000, 0x59240400, 0x84000540, - 0x840411c0, 0x80081540, 0x480a4c00, 0x5c000000, - 0xb00414bf, 0x05fa13de, 0x82041400, 0x00102013, - 0x50081000, 0x82081500, 0x000000ff, 0x48064a08, - 0x480a4805, 0x480a4c08, 0x8c000500, 0x05020004, - 0x480b500f, 0x600c0800, 0x0519f97e, 0x0501ff54, - 0x05000004, 0x59240400, 0x84000544, 0x48024c00, - 0x599c0019, 0x8c000506, 0x05000003, 0x4a03b805, - 0x90000000, 0x8c00050e, 0x05020009, 0x59a80805, - 0x8c040514, 0x05000006, 0x42000800, 0x0010ac58, - 0x50040800, 0x90040d28, 0x05fa03bd, 0x90000530, - 0x05000003, 0x80000108, 0x0501f002, 0x60080000, - 0x48039040, 0x60080800, 0x82000400, 0x00102fe0, - 0x50001000, 0x0519f95f, 0x599c0201, 0x82000c80, - 0x00000100, 0x05f813ae, 0x82000c80, 0x00000841, - 0x05fa13ab, 0x90000507, 0x05fa03a9, 0x599c0401, - 0x80000540, 0x05f803a6, 0x59a8088d, 0x8c040502, - 0x05000005, 0x90000c90, 0x05001003, 0x60400000, - 0x48033c01, 0x850e1d52, 0x82000580, 0x0000ffff, - 0x05000002, 0x850e1d12, 0x599c0409, 0x599c0c07, - 0x80040c80, 0x05fa1396, 0x80000040, 0x05f80394, - 0x599c0209, 0x599c0a07, 0x80040c80, 0x05fa1390, - 0x80000040, 0x05f8038e, 0x91a81423, 0x599c0818, - 0x8c040510, 0x05020005, 0x50080000, 0x8400053e, - 0x44001000, 0x0501f00b, 0x59a80006, 0x8400054a, - 0x48035006, 0x4a0370e4, 0x0000c000, 0x4c040000, - 0x59c408a3, 0x84040d3a, 0x480788a3, 0x5c000800, - 0x8c040512, 0x05020009, 0x50080000, 0x82000500, - 0xfffff5ff, 0x44001000, 0x80081000, 0x50080000, - 0x8400053e, 0x44001000, 0x050dff40, 0x050df923, - 0x599c0201, 0x48035004, 0x05f1fc93, 0x599c020a, - 0x800001c0, 0x05000003, 0x48035035, 0x0501f003, - 0x4a035035, 0x000000c8, 0x8d0c0520, 0x05000003, - 0x0515fe23, 0x417a5000, 0x599c0003, 0x599c0804, - 0x9c0001c0, 0x9c0409c0, 0x48024801, 0x48064802, - 0x48035002, 0x48075003, 0x599c1017, 0x8c08051c, - 0x05000006, 0x599c0005, 0x599c0806, 0x9c0001c0, - 0x9c0409c0, 0x0501f003, 0x82000500, 0xf0ffffff, - 0x48024803, 0x48064804, 0x48035000, 0x48075001, - 0x42001000, 0x0010ac60, 0x48001000, 0x48041001, - 0x42001000, 0x0010ac6d, 0x48001000, 0x48041001, - 0x59a00207, 0xb0000588, 0x05020092, 0x0501fe07, - 0x05020003, 0x640b4407, 0x05f9f339, 0x60400800, - 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, - 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, - 0x82081400, 0x00000080, 0xb0083400, 0x481b4002, - 0x900c3440, 0x481b4003, 0x912c0405, 0x0501fe13, - 0x4a01d808, 0x00102ed7, 0x1c01f000, 0x4031d800, - 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, - 0x00000200, 0x05f80316, 0x592c1005, 0x480bc857, - 0x80080120, 0x42024800, 0x0010b111, 0x48024c06, - 0x82081500, 0x0000ffff, 0x599c0818, 0x90040d30, - 0x90040580, 0x05020004, 0xb00804be, 0x05fa1314, - 0x0501f004, 0x82080480, 0x000000ff, 0x05fa1310, - 0x80080800, 0x42000000, 0x0010b110, 0x44040000, - 0x800811c0, 0x0500005b, 0x42024800, 0x0010b11c, - 0x80040840, 0x912e5c06, 0x600c4000, 0x592c0400, - 0x8c000506, 0x05000012, 0x59a8108d, 0x90081506, - 0x05fa02ff, 0x8c00050a, 0x05020003, 0x8d0c0520, - 0x05f802fb, 0x64164a00, 0x90001503, 0x05000006, - 0x840011c0, 0x82081500, 0x000000ff, 0x480a4a08, - 0x0501f003, 0x82000500, 0x000000ff, 0x48024c00, - 0x592c0001, 0x592c1002, 0x9c0001c0, 0x9c0811c0, - 0x48024801, 0x480a4802, 0x599c1817, 0x8c0c051c, - 0x05000006, 0x592c0003, 0x592c1004, 0x9c0001c0, - 0x9c0811c0, 0x0501f003, 0x82000500, 0xf0ffffff, - 0x48024803, 0x480a4804, 0x912e5c05, 0x91264c0b, - 0x80040840, 0x0500001d, 0x80204040, 0x05fe07d4, - 0x48074000, 0x49274001, 0x603c0800, 0x59a01002, - 0x59a01803, 0x9008343c, 0x481b4002, 0x900c3440, - 0x481b4003, 0x58ee580c, 0x912c0405, 0x0501fdb3, - 0x4a01d808, 0x00102f37, 0x1c01f000, 0x4031d800, - 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f802b7, 0x58ee580c, 0x912e5c05, 0x59a00800, - 0x59a24801, 0x05fdf7b9, 0x42006800, 0x0010b111, - 0x4200b000, 0x0010b110, 0x5058b000, 0x8058b040, - 0x05000008, 0x42024800, 0x0010b11c, 0x58340206, - 0x48024a06, 0x91264c0b, 0x8058b040, 0x05fe07fc, - 0x599c1019, 0x82081500, 0x0000e000, 0x497b4208, - 0x05f5fb98, 0x05000012, 0x05f5fb7a, 0x64074208, - 0x0502000f, 0x4c080000, 0x05f5fb84, 0x5c001000, - 0x05020007, 0x640b4208, 0x82080580, 0x00008000, - 0x05020007, 0x64134208, 0x0501f005, 0x640f4208, - 0x90080580, 0x05020002, 0x64174208, 0x90080580, - 0x05020007, 0x6403503b, 0x60040000, 0x05f5f934, - 0x60040000, 0x05f5f908, 0x0501f02b, 0x82080580, - 0x00002000, 0x05020008, 0x6407503b, 0x60000000, - 0x05f5f92b, 0x60000000, 0x05f5f8ff, 0x05f5fcdc, - 0x0501f021, 0x82080580, 0x00004000, 0x05020004, - 0x640b503b, 0x64075047, 0x05fdf7f9, 0x82080580, - 0x00006000, 0x0502000f, 0x59a8085c, 0x82040d80, - 0x01391077, 0x05020004, 0x59e00813, 0x8c040500, - 0x05fa0277, 0x640f503b, 0x60080000, 0x05f5f914, - 0x60080000, 0x05f5f8e8, 0x05fdf7e9, 0x0501f00a, - 0x82080580, 0x00008000, 0x05fa026d, 0x05f5fccf, - 0x6413503b, 0x600c0000, 0x05f5f909, 0x600c0000, - 0x05f5f8dd, 0x599c1019, 0x82081500, 0x0000e000, - 0x4c080000, 0x0501fea1, 0x5c001000, 0x05020004, - 0x82080580, 0x00004000, 0x0500000b, 0x0501fe68, - 0x05000003, 0x0501fe7d, 0x05020009, 0x82080580, - 0x00008000, 0x05000004, 0x82080580, 0x00004000, - 0x05020003, 0x600010c0, 0x0501f004, 0x599c0019, - 0x8c000518, 0x05000005, 0x8008111a, 0x480b5048, - 0x640b503b, 0x64075047, 0x599c0019, 0x8c000520, - 0x05000001, 0x4a035013, 0x0000aaaa, 0x599c1018, - 0x90081530, 0x90080d80, 0x05000005, 0x90080d90, - 0x05000008, 0x90080da0, 0x05020002, 0x48075013, - 0x0501fdba, 0x05000007, 0x4803c856, 0x850e1d46, - 0x05f1feac, 0x59a8001f, 0x80040540, 0x4803501f, - 0x49f3c857, 0x42001000, 0x0010497d, 0x0515fb57, - 0x42001000, 0x00104970, 0x0515fc9c, 0x4a038805, - 0xffffffff, 0x0501fe58, 0x05000005, 0x4a03c014, - 0x00400040, 0x4a03c013, 0x00400000, 0x59a0001e, - 0x84000540, 0x4803401e, 0x49f3c857, 0x05f9f1da, - 0x00000018, 0x0000000c, 0x00000018, 0x00000020, - 0x916c0580, 0x05020003, 0x601c0800, 0x05f9f214, - 0x60800800, 0x59a00408, 0x59a01208, 0x900811c0, - 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, - 0x800c1d40, 0x419c0000, 0x0501f4fa, 0x8d0c050e, - 0x05000003, 0x64074407, 0x05f9f205, 0x050dfa36, - 0x05020003, 0x645b4407, 0x05f9f201, 0x59a80073, - 0x8c000500, 0x0500000e, 0x64034407, 0x60800800, + 0x82040d00, 0x000000ff, 0x05000002, 0x801c3800, + 0x801c39c0, 0x05000005, 0x59a80087, 0x801c0400, + 0x48035087, 0x48275086, 0x1c01f000, 0x48034207, + 0x48074407, 0x480b4208, 0x480f4408, 0x48134209, + 0x48174409, 0x59c80003, 0x82000540, 0x00001f00, + 0x48039003, 0x59c8002c, 0x8400052a, 0x4803902c, + 0x61f00800, 0x05f5f85d, 0x05f9f76d, 0x42000000, + 0x00600000, 0x80000040, 0x05fe07ff, 0x1c01f000, + 0x5a5a5a5a, 0xa5a5a5a5, 0x0505fa97, 0x05020003, + 0x640b4407, 0x05f9f7a1, 0x42005000, 0x0010b390, + 0x50285000, 0x482b4000, 0x4200a000, 0x0010b391, 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, - 0x42000000, 0x0010cc24, 0x0501f4e2, 0x64074407, - 0x6080b000, 0x4200a800, 0x0010cc24, 0x4200a000, - 0xffffffff, 0x4450a800, 0x8054a800, 0x8058b040, - 0x05fe07fd, 0x4d440000, 0x4d340000, 0x42028800, - 0xffffffff, 0x42002000, 0xffffffff, 0x60043000, - 0x60043800, 0x42001800, 0x0010cc24, 0x59a8100f, - 0x82081500, 0x000000ff, 0x40180000, 0x0c01f001, - 0x00103028, 0x0010302b, 0x0010302f, 0x00103033, - 0x82102500, 0xffffff00, 0x0501f014, 0x82102500, - 0xffff00ff, 0x840811c0, 0x0501f010, 0x82102500, - 0xff00ffff, 0x900811c0, 0x0501f00c, 0x82102500, - 0x00ffffff, 0x9c0801c0, 0x80102540, 0x44101800, - 0x42003000, 0xffffffff, 0x42002000, 0xffffffff, - 0x800c1800, 0x0501f003, 0x40080000, 0x80102540, - 0x81468800, 0xb1442cbf, 0x05021012, 0x4c080000, - 0x4c0c0000, 0x4c180000, 0x4c1c0000, 0x0001fae7, - 0x5c003800, 0x5c003000, 0x5c001800, 0x5c001000, - 0x05fe07f4, 0x0509fc5f, 0x05fe07f2, 0x80183000, - 0x801c3800, 0x59341202, 0x40180000, 0x0c01f7d1, - 0x82100580, 0xffffffff, 0x05000002, 0x44101800, - 0x42001800, 0x0010cc24, 0x500c0000, 0x82000500, - 0xffffff00, 0x801c0540, 0x44001800, 0x5c026800, - 0x5c028800, 0x60800800, 0x59a00408, 0x59a01208, - 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, - 0x900c19c0, 0x800c1d40, 0x42000000, 0x0010cc24, - 0x0501f480, 0x59a28c07, 0x0501fd43, 0x05fa0190, - 0x0509fc84, 0x05fa018e, 0x0501fc54, 0x05020003, - 0x640b4407, 0x05f9f186, 0x59a0020c, 0x8c000500, - 0x05000003, 0x0509fc33, 0x0502050e, 0x59a0020c, - 0x8c000502, 0x05000015, 0x83440480, 0x000007f0, - 0x05021012, 0x0509fc34, 0x05020010, 0x497a5a05, - 0x4a025c05, 0x00008000, 0x59a24805, 0x0529fb32, - 0x05020003, 0x640f4407, 0x05f9f171, 0x4a01d808, - 0x0010308e, 0x1c01f000, 0x59a28c07, 0x59a2440b, - 0x0509fc64, 0x05fa016e, 0x4c580000, 0x4c500000, - 0x4c540000, 0x6028b000, 0x4134a000, 0x912e5c02, - 0x412ca800, 0x0535ffc7, 0x912cac06, 0x4054a000, - 0x6010b000, 0x0535fffe, 0x5c00a800, 0x5c00a000, - 0x5c00b000, 0x592c0802, 0x82040500, 0x00ff00ff, - 0x900001c0, 0x82041500, 0xff00ff00, 0x80080540, - 0x48025802, 0x592c0801, 0x82040500, 0x00ff00ff, - 0x900001c0, 0x82041500, 0xff00ff00, 0x80080540, - 0x48025801, 0x60280800, 0x59a00408, 0x59a01208, - 0x900811c0, 0x80081540, 0x59a0040a, 0x59a01a0a, - 0x900c19c0, 0x800c1d40, 0x412c0000, 0x0501f431, - 0x496fc857, 0x496f4407, 0x497b4208, 0x05f5fa2d, - 0x05000015, 0x05f5fa0f, 0x64074208, 0x05020012, - 0x4c080000, 0x05f5fa19, 0x5c001000, 0x05020008, - 0x640b4208, 0x916c0580, 0x0500000b, 0x05f1fe03, - 0x05020009, 0x64134208, 0x0501f007, 0x640f4208, - 0x916c0580, 0x05000004, 0x05f1fddb, 0x05020002, - 0x64174208, 0x05f9f0e4, 0x59a28c07, 0x0501fcda, - 0x05fa0127, 0x0509fc1b, 0x05fa0125, 0x916c0583, - 0x05000003, 0x641f4407, 0x05f9f11d, 0x91340c06, - 0x59a0020c, 0x8c000500, 0x05000002, 0x91340c08, - 0x58040001, 0x4803440a, 0x900001c0, 0x4803420a, - 0x50040000, 0x48034408, 0x900001c0, 0x48034208, - 0x59340200, 0x48034407, 0x05f9f0cb, 0x8d0c050e, - 0x05000003, 0x64074407, 0x05f9f109, 0x59a0220c, - 0x8c100500, 0x05020021, 0x8c100506, 0x05020004, - 0x59a03209, 0x90180483, 0x05fa1105, 0x59a28c07, - 0x0001fae7, 0x05fa0102, 0x0509fb9d, 0x05000003, - 0x64274407, 0x05f9f0fa, 0x0501fbc4, 0x05020003, - 0x640b4407, 0x05f9f0f6, 0x59a0220c, 0x8c100506, - 0x05000004, 0x59343002, 0x82183500, 0x00ffffff, - 0x497a5a05, 0x4a025c05, 0x00008000, 0x0529fa72, - 0x05020003, 0x640f4407, 0x05f9f0e9, 0x4a01d808, - 0x00103154, 0x1c01f000, 0x59a28c07, 0x0001fae7, - 0x05fa00e7, 0x0509fb82, 0x05000003, 0x64274407, - 0x05f9f0df, 0x0501fba9, 0x05020003, 0x640b4407, - 0x05f9f0db, 0x497a5a05, 0x4a025c05, 0x00008000, - 0x0501fba2, 0x05020003, 0x640b4407, 0x05f9f0d4, - 0x592e5800, 0x0529fa6b, 0x05020003, 0x640f4407, - 0x05f9f0cf, 0x4a01d808, 0x00103130, 0x1c01f000, - 0x592c2806, 0x82140d80, 0x01000000, 0x05020003, - 0x64134407, 0x05f9f0c6, 0x60200800, 0x59a00208, + 0x42024800, 0x0010b391, 0x912cac05, 0x6018b000, + 0x9050040b, 0x48034001, 0x0539fffe, 0x60180800, + 0x800400c4, 0x80080c00, 0x48074002, 0x900c0c40, + 0x48074003, 0x60180800, 0x912c0405, 0x0505fa9c, + 0x4a01d808, 0x00102b1f, 0x1c01f000, 0x4031d800, + 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, + 0x05f80772, 0x59a0a001, 0x59a01000, 0x80081040, + 0x480b4000, 0x05000005, 0x59a01002, 0x59a01803, + 0x58ee580c, 0x05fdf7e1, 0x42000800, 0x0010b390, + 0x50040800, 0x48074407, 0x05f9f72a, 0x0505fa5e, + 0x05020003, 0x640b4407, 0x05f9f768, 0x59a00c0b, + 0x42000000, 0x0010b390, 0x50000000, 0x80040480, + 0x05fa1766, 0x8204a400, 0x0010a3b3, 0x5050a000, + 0x912cac05, 0x6018b000, 0x0539ffce, 0x59a00408, + 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, + 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x60180800, + 0x912c0405, 0x0505f26a, 0x59a00c0b, 0x800409c0, + 0x05f80752, 0x900404a1, 0x05fa1750, 0x90040491, + 0x05001002, 0x60400800, 0x59a00209, 0x59a01408, + 0x900811c0, 0x80081540, 0x59a00208, 0x59a01c07, + 0x900c19c0, 0x800c1d40, 0x0505fa33, 0x05000005, + 0x0505fa51, 0x4a01d808, 0x00102b66, 0x1c01f000, + 0x640b4407, 0x05f9f739, 0x4031d800, 0x58ef400a, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f8072b, + 0x59a00c0b, 0x90040491, 0x05001002, 0x60400800, + 0x59a0040c, 0x59a0120c, 0x900811c0, 0x80081540, + 0x59a0020a, 0x59a01c09, 0x900c19c0, 0x800c1d40, + 0x58ec0003, 0x0505fa3e, 0x4a01d808, 0x00102b7d, + 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, + 0x82000580, 0x00000200, 0x05f80714, 0x59a00c0b, + 0x90040491, 0x05f816d7, 0x90040c90, 0x59a00209, + 0x59a01408, 0x900811c0, 0x80081540, 0x59a00208, + 0x59a01c07, 0x900c19c0, 0x800c1d40, 0xb0081400, + 0x58ec0003, 0x0505fa20, 0x4a01d808, 0x00102b95, + 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, + 0x82000580, 0x00000200, 0x05f806fc, 0x59a0040b, + 0x90000c90, 0x59a0040c, 0x59a0120c, 0x900811c0, + 0x80081540, 0x59a0020a, 0x59a01c09, 0x900c19c0, + 0x800c1d40, 0xb0081400, 0x58ec0003, 0x0505fa10, + 0x4a01d808, 0x00102255, 0x1c01f000, 0x48efc857, + 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, + 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, + 0x59a00407, 0x48034000, 0x480b4001, 0x480f4002, + 0x0505f9d9, 0x05020003, 0x640b4407, 0x05f9f6e3, + 0x60400800, 0x0505f9f4, 0x4a01d808, 0x00102bc1, + 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580c, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f806cf, + 0x48efc857, 0x49a3c857, 0x492fc857, 0x592c0a05, + 0x80040910, 0x05020003, 0x64674407, 0x05f9f6cf, + 0x4805d80b, 0x0501f009, 0x4031d800, 0x58ef400a, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f806bf, + 0x48efc857, 0x49a3c857, 0x48efc857, 0x49a3c857, + 0x58ec000b, 0x80000040, 0x0500000d, 0x4801d80b, + 0x0505f9b1, 0x05020003, 0x640b4407, 0x05f9f6bb, + 0x60400800, 0x58ec1006, 0x58ec1807, 0x0505f9ca, + 0x4a01d808, 0x00102bd2, 0x1c01f000, 0x58ee580c, + 0x48efc857, 0x49a3c857, 0x492fc857, 0x492f3004, + 0x592c0405, 0x8400055e, 0x48025c05, 0x4a01d808, + 0x00102bf6, 0x1c01f000, 0x4d2c0000, 0x58ee580c, + 0x48efc857, 0x49a3c857, 0x492fc857, 0x592c0405, + 0x8400051e, 0x48025c05, 0x59a00000, 0x59a01001, + 0x59a01802, 0x80081400, 0x900c1c40, 0x912c0405, + 0x60400800, 0x5c025800, 0x0505f1b1, 0x8d0c050e, + 0x05000003, 0x64074407, 0x05f9f694, 0x916c0583, + 0x05000003, 0x641f4407, 0x05f9f690, 0x59a0320c, + 0x82183500, 0x000000ff, 0x59a28c07, 0x0505fa69, + 0x05fa068e, 0x050df9bb, 0x05fa068c, 0x83440580, + 0x000007fd, 0x05000005, 0x050df95d, 0x05000003, + 0x64274407, 0x05f9f681, 0x0505f973, 0x05020003, + 0x640b4407, 0x05f9f67d, 0x801831c0, 0x05000007, + 0x412c0800, 0x0505f96c, 0x05020003, 0x640b4407, + 0x05f9f676, 0x40065800, 0x4a025c05, 0x00008000, + 0x497a5a05, 0x052df984, 0x05020003, 0x640f4407, + 0x05f9f66e, 0x4a01d808, 0x00102c34, 0x1c01f000, + 0x592c0006, 0x82000580, 0x01000000, 0x05020003, + 0x64134407, 0x05f9f665, 0x592c0407, 0x82002d00, + 0x0000ff00, 0x82000500, 0x000000ff, 0x80000904, + 0x80040800, 0x90040486, 0x05001002, 0x60140800, + 0x4c500000, 0x4c540000, 0x4c580000, 0x912ca407, + 0x4050a800, 0x4004b000, 0x0539ff01, 0x59a00408, + 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, + 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x912c0407, + 0x4c140000, 0x0505f962, 0x5c002800, 0x801429c0, + 0x05000003, 0x4a01d808, 0x00102c5f, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x1c01f000, 0x4031d800, + 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, + 0x00000200, 0x05f80631, 0x812e59c0, 0x05e80d88, + 0x592c0007, 0x82000500, 0xff000000, 0x80000904, + 0x800409c0, 0x05f805ef, 0x4807c857, 0x9004048e, + 0x05001002, 0x60340800, 0x592e5801, 0x812e59c0, + 0x05e80d7b, 0x4c500000, 0x4c540000, 0x4c580000, + 0x912ca406, 0x4050a800, 0x4004b000, 0x0539fed0, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x58ec1006, + 0x58ec1807, 0x912c0406, 0x0505f135, 0x0505f90e, + 0x05020003, 0x640b4407, 0x05f9f618, 0x59a00c07, + 0x82040500, 0x0000ff00, 0x840001c0, 0x90001487, + 0x05fa1616, 0x0c01f001, 0x00102c95, 0x00102c9b, + 0x00102ca1, 0x00102ca1, 0x00102ca1, 0x00102ca2, + 0x00102ca6, 0x60340800, 0x42003800, 0x00102cb7, + 0x4a034000, 0x0010aee0, 0x0501f00f, 0x60340800, + 0x42003800, 0x00102cb7, 0x4a034000, 0x0010aeed, + 0x0501f009, 0x05f9f601, 0x60200800, 0x42003800, + 0x00102cc4, 0x0501f004, 0x60100800, 0x42003800, + 0x00102cf9, 0x59a00208, 0x59a01408, 0x900001c0, + 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, + 0x800c1d40, 0x912c0406, 0x4c1c0000, 0x0505f8fe, + 0x5c003800, 0x481dd808, 0x1c01f000, 0x4031d800, + 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, + 0x00000200, 0x05f805d9, 0x64075019, 0x6034b000, + 0x59a0a800, 0x912ca406, 0x0539fe89, 0x05f9f599, + 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, + 0x82000580, 0x00000200, 0x05f805cc, 0x912ca406, + 0x50500000, 0x82001500, 0x000c0016, 0x05fa05d3, + 0x90500c03, 0x50040000, 0x90001501, 0x05fa05cf, + 0x50500000, 0x90001528, 0x05000015, 0x900815a8, + 0x05fa05ca, 0x80500800, 0x50040000, 0x90001513, + 0x90081593, 0x05fa05c5, 0x80040800, 0x50040000, + 0x82001500, 0x00050000, 0x82081580, 0x00050000, + 0x05fa05be, 0x916c0580, 0x0500000e, 0x599c0019, + 0x8c00050e, 0x0502000b, 0x05f9f5b8, 0x80500800, + 0x50040000, 0x90001513, 0x05fa05b4, 0x80040800, + 0x50040000, 0x82001500, 0x00050000, 0x05fa05af, + 0x6020b000, 0x4200a800, 0x0010aed8, 0x0539fe19, + 0x05f9f564, 0x4031d800, 0x58ef400a, 0x58ee580c, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f80597, + 0x6010b000, 0x4200a800, 0x0010b38b, 0x912ca406, + 0x0539fe0c, 0x850e1d50, 0x05f9f556, 0x0505f88a, + 0x05020003, 0x640b4407, 0x05f9f594, 0x912cac06, + 0x59a00c07, 0x82040500, 0x0000ff00, 0x840001c0, + 0x90001488, 0x05fa1591, 0x0c01f001, 0x00102d1b, + 0x00102d1e, 0x00102d21, 0x00102d21, 0x00102d21, + 0x00102d22, 0x00102d21, 0x00102d28, 0x4200a000, + 0x0010aee0, 0x0501f040, 0x4200a000, 0x0010aeed, + 0x0501f03d, 0x05f9f581, 0x6020b000, 0x40580800, + 0x4200a000, 0x0010aed8, 0x0539fdea, 0x0501f039, + 0x59a00a0b, 0x6473420b, 0x9004049c, 0x05f81577, + 0x603cb000, 0x4178a000, 0x0539fdea, 0x912cac06, + 0x6010b000, 0x91a8a41f, 0x0539fdde, 0x916c0580, + 0x05000004, 0x6010b000, 0x91a8a400, 0x0539fdd9, + 0x912cac12, 0x600cb000, 0x91a8a423, 0x0539fdd5, + 0x492f4000, 0x0505f854, 0x05020003, 0x640b4407, + 0x05f9f55e, 0x912cac06, 0x603cb000, 0x4178a000, + 0x0539fdd4, 0x912cac06, 0x6004b000, 0x91a8a426, + 0x0539fdc8, 0x912cac07, 0x6010b000, 0x91a8a427, + 0x0539fdc4, 0x492f4001, 0x59a25800, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, 0x912c0406, - 0x0501fbac, 0x8c140500, 0x05000003, 0x4a01d808, - 0x00103146, 0x1c01f000, 0x4031d800, 0x58ef400a, - 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f800a7, 0x812e59c0, 0x05e808a1, 0x60200800, - 0x912c0406, 0x58ec1006, 0x58ec1807, 0x0501f399, - 0x592c0006, 0x82000580, 0x01000000, 0x05020003, - 0x64134407, 0x05f9f0a2, 0x59a00208, 0x59a01408, + 0x603c0800, 0x0505f85e, 0x4a01d808, 0x00102d6a, + 0x1c01f000, 0x6034b000, 0x40580800, 0x0539fdec, + 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, + 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, + 0x912c0406, 0x0505f04e, 0x4031d800, 0x58ef400a, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f80527, + 0x59a25801, 0x58ec1006, 0x58ec1807, 0x912c0406, + 0x60340800, 0x0505f042, 0x916c0580, 0x05020003, + 0x641f4407, 0x05f9f525, 0x59a01407, 0x800811c0, + 0x0502002a, 0x497b4208, 0x05f5fd6f, 0x05000011, + 0x05f5fd51, 0x64074208, 0x0502000e, 0x4c080000, + 0x05f5fd5b, 0x5c001000, 0x05020006, 0x640b4208, + 0x05f5f947, 0x05020007, 0x64134208, 0x0501f005, + 0x640f4208, 0x05f5f921, 0x05020002, 0x64174208, + 0x59c40801, 0x82040d00, 0x00018000, 0x90040580, + 0x05020003, 0x64034407, 0x0501f069, 0x82040580, + 0x00008000, 0x05020003, 0x64074407, 0x0501f064, + 0x82040580, 0x00010000, 0x05020003, 0x640f4407, + 0x0501f05f, 0x82040580, 0x00018000, 0x05ea0c4c, + 0x64134407, 0x0501f05a, 0x59a8008d, 0x8c000502, + 0x05000004, 0x60080000, 0x40000800, 0x0501f012, + 0x59a00208, 0x4c000000, 0x0505f928, 0x5c000000, + 0x05000005, 0x4c000000, 0x0505f93b, 0x5c000000, + 0x05020007, 0x90000d84, 0x05000003, 0x90000d82, + 0x05020003, 0x600c0000, 0x600c1000, 0x48034002, + 0x59a8083b, 0x4803503b, 0x599c7819, 0x823c7d00, + 0xffff1fff, 0x800000da, 0x803c7d40, 0x483f3819, + 0x497b4208, 0x05f5fd28, 0x05000013, 0x05f5fd0a, + 0x64074208, 0x05020010, 0x4c040000, 0x4c080000, + 0x05f5fd13, 0x5c001000, 0x5c000800, 0x05020006, + 0x640b4208, 0x05f5f8fe, 0x05020007, 0x64134208, + 0x0501f005, 0x640f4208, 0x05f5f8d8, 0x05020002, + 0x64174208, 0x05f5f8d5, 0x0500000b, 0x05f5f8de, + 0x05000009, 0x05f5f8e7, 0x05000007, 0x05f5f8f0, + 0x05000005, 0x05f5f8f9, 0x05000003, 0x4807503b, + 0x05f9f4be, 0x90080583, 0x05020005, 0x59a00002, + 0x48035048, 0x640b503b, 0x0501f005, 0x4a035048, + 0xaabbccdd, 0x90080582, 0x05020011, 0x59c40006, + 0x84000500, 0x48038806, 0x0519fea1, 0x497b8880, + 0x42000000, 0x0010b33e, 0x0539fc4f, 0x4803c856, + 0x850e1d48, 0x4a038808, 0x00000200, 0x6012d800, + 0x64078805, 0x64075047, 0x05e9fe0c, 0x05f9f45d, + 0x8d0c050e, 0x05000003, 0x64074407, 0x05f9f49b, + 0x916c0583, 0x05000003, 0x641f4407, 0x05f9f497, + 0x59a28c07, 0x59a0320c, 0x82183500, 0x000000ff, + 0x0505f870, 0x05fa0495, 0x0509ffc2, 0x05fa0493, + 0x83440580, 0x000007fd, 0x05000005, 0x0509ff64, + 0x05000003, 0x60240800, 0x05f9f488, 0x0501ff7a, + 0x05020003, 0x640b4407, 0x05f9f484, 0x497a5a05, + 0x4a025c05, 0x00008000, 0x0529ffa6, 0x05020003, + 0x640f4407, 0x05f9f47d, 0x4a01d808, 0x00102e25, + 0x1c01f000, 0x592c0006, 0x82000d00, 0x0000ffff, + 0x82000500, 0xffff0000, 0x82000580, 0x01000000, + 0x05020003, 0x64134407, 0x05f9f470, 0x80040904, + 0x4c500000, 0x4c540000, 0x4c580000, 0x912ca406, + 0x4050a800, 0x4004b000, 0x0539fd15, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, - 0x900001c0, 0x800c1d40, 0x60180800, 0x912c0407, - 0x0501f388, 0x59a00a0b, 0x800409c0, 0x05f80098, - 0x0501fc49, 0x05fa0096, 0x82040480, 0x00000081, - 0x05001002, 0x60000801, 0x59c40085, 0x59881004, - 0x80081400, 0x480b1004, 0x497b8885, 0x59c400b1, - 0x48031022, 0x59c400b2, 0x48031021, 0x59c400a2, - 0x48031023, 0x598810b7, 0x598800b8, 0x80081400, - 0x598800b9, 0x80081400, 0x598800ba, 0x80081400, - 0x5988011d, 0x80081400, 0x598800bb, 0x80081400, - 0x480b1024, 0x59a00208, 0x59a01408, 0x900001c0, + 0x900001c0, 0x800c1d40, 0x912c0406, 0x0501f774, + 0x60000020, 0x50000000, 0x82000480, 0x25320001, + 0x05020007, 0x4a03c014, 0x00400040, 0x4a03c013, + 0x00400000, 0x6041d04e, 0x0515fff3, 0x496fc857, + 0x916c0580, 0x05000003, 0x646b4407, 0x05f9f44b, + 0x050dfcde, 0x05060fcf, 0x60800800, 0x59a00408, + 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, + 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x419c0000, + 0x49a3c857, 0x0501ff50, 0x4a01d808, 0x00102e65, + 0x1c01f000, 0x4833c857, 0x4031d800, 0x58ef400a, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f8042b, + 0x599c0200, 0x800001c0, 0x05f80434, 0x59a8008d, + 0x8c000502, 0x05000011, 0x599c0017, 0x84000508, + 0x48033817, 0x599c0019, 0x82000500, 0xffff1fff, + 0x82000540, 0x00004000, 0x48033819, 0x599c0018, + 0x84000510, 0x84000516, 0x82000500, 0xffffffcf, + 0x90000560, 0x0501f004, 0x8c000504, 0x05000003, + 0x599c0018, 0x48033818, 0x052dfefa, 0x850e1d20, + 0x599c0017, 0x8c000508, 0x05000003, 0x850e1d60, + 0x0501f006, 0x8c00050a, 0x05fa0414, 0x59a80806, + 0x8c040516, 0x05fa0411, 0x42024800, 0x0010b391, + 0x64124a00, 0x42000800, 0x0010b390, 0x64040800, + 0x42000800, 0x0010b38f, 0x46000800, 0x0000ffff, + 0x59240c00, 0x84040d46, 0x599c1017, 0x8c08050a, + 0x05020002, 0x84040d48, 0x8c080508, 0x05020002, + 0x84040d4a, 0x84040d4c, 0x48064c00, 0x59240a00, + 0x84040d40, 0x48064a00, 0x4803c857, 0x8c000504, + 0x05020004, 0x59c408a3, 0x84040d7a, 0x480788a3, + 0x8c000502, 0x05020004, 0x59c408a3, 0x84040d08, + 0x480788a3, 0x599c0c02, 0x8c000500, 0x0502000b, + 0x8c000516, 0x0500001f, 0x4c000000, 0x59240400, + 0x84000542, 0x840411c0, 0x80081540, 0x480a4c00, + 0x5c000000, 0x0501f008, 0x4c000000, 0x59240400, + 0x84000540, 0x840411c0, 0x80081540, 0x480a4c00, + 0x5c000000, 0xb00414bf, 0x05fa13d8, 0x82041400, + 0x001020b6, 0x50081000, 0x82081500, 0x000000ff, + 0x48064a08, 0x480a4805, 0x480a4c08, 0x8c000500, + 0x05020004, 0x480b500f, 0x600c0800, 0x0519fa97, + 0x0501ff76, 0x05000004, 0x59240400, 0x84000544, + 0x48024c00, 0x599c0019, 0x8c000506, 0x05000003, + 0x4a03b805, 0x90000000, 0x8c00050e, 0x05020005, + 0x4c000000, 0x0505f9d5, 0x5c000000, 0x05fa03bb, + 0x90000530, 0x05000003, 0x80000108, 0x0501f002, + 0x60080000, 0x48039040, 0x60080800, 0x82000400, + 0x001030ab, 0x50001000, 0x0519fa7c, 0x599c0201, + 0x82000c80, 0x00000100, 0x05f813ac, 0x82000c80, + 0x00000841, 0x05fa13a9, 0x90000507, 0x05fa03a7, + 0x599c0401, 0x80000540, 0x05f803a4, 0x59a8088d, + 0x8c040502, 0x05000005, 0x90000c90, 0x05001003, + 0x60400000, 0x48033c01, 0x850e1d52, 0x82000580, + 0x0000ffff, 0x05000002, 0x850e1d12, 0x599c0409, + 0x599c0c07, 0x80040c80, 0x05fa1394, 0x80000040, + 0x05f80392, 0x599c0209, 0x599c0a07, 0x80040c80, + 0x05fa138e, 0x80000040, 0x05f8038c, 0x91a81423, + 0x599c0818, 0x8c040510, 0x05020005, 0x50080000, + 0x8400053e, 0x44001000, 0x0501f00b, 0x59a80006, + 0x8400054a, 0x48035006, 0x4a0370e4, 0x0000c000, + 0x4c040000, 0x59c408a3, 0x84040d3a, 0x480788a3, + 0x5c000800, 0x8c040512, 0x05020009, 0x50080000, + 0x82000500, 0xfffff5ff, 0x44001000, 0x80081000, + 0x50080000, 0x8400053e, 0x44001000, 0x050dffa0, + 0x050df97b, 0x599c0201, 0x48035004, 0x05f1fbec, + 0x599c020a, 0x800001c0, 0x05000003, 0x48035035, + 0x0501f003, 0x4a035035, 0x000000c8, 0x8d0c0520, + 0x05000003, 0x0515ff40, 0x417a5000, 0x599c0003, + 0x599c0804, 0x9c0001c0, 0x9c0409c0, 0x48024801, + 0x48064802, 0x48035002, 0x48075003, 0x599c1017, + 0x8c08051c, 0x05000006, 0x599c0005, 0x599c0806, + 0x9c0001c0, 0x9c0409c0, 0x0501f003, 0x82000500, + 0xf0ffffff, 0x48024803, 0x48064804, 0x48035000, + 0x48075001, 0x42001000, 0x0010aee0, 0x48001000, + 0x48041001, 0x42001000, 0x0010aeed, 0x48001000, + 0x48041001, 0x59a00207, 0xb0000588, 0x050200b8, + 0x0501fe2d, 0x05020003, 0x640b4407, 0x05f9f337, + 0x60400800, 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, - 0x800c1d40, 0x91880400, 0x0501fb5e, 0x4a01d808, - 0x00103192, 0x1c01f000, 0x4031d800, 0x58ef400a, - 0x58ec0002, 0x82000580, 0x00000200, 0x05f8005c, - 0x59a0020c, 0x8c000500, 0x05000006, 0x91880400, - 0x4803c840, 0x641bc842, 0x05011000, 0x497b8885, - 0x4a034208, 0x00000080, 0x05f9f017, 0x8d0c050e, - 0x05000003, 0x64074407, 0x05f9f055, 0x0501fc0a, - 0x05fa0057, 0x0501fb1d, 0x05020003, 0x640b4407, - 0x05f9f04f, 0x497a5a05, 0x4a025c05, 0x00008000, - 0x59a00407, 0x800001c0, 0x05f8004d, 0x82001580, - 0x000000ff, 0x05000003, 0x90001484, 0x05fa1048, - 0x40001000, 0x59a24805, 0x05f5faf0, 0x05020003, - 0x640f4407, 0x05f9f03e, 0x4a01d808, 0x001031c1, - 0x1c01f000, 0x592c0006, 0x82000580, 0x01000000, - 0x05f607f5, 0x64134407, 0x05f9f035, 0x59a01407, - 0x8c080508, 0x05020005, 0x8d0c050e, 0x05000003, - 0x64074407, 0x05f9f02e, 0x59a01c08, 0x820c0480, - 0x00001000, 0x05fa102e, 0x497b2804, 0x497b2805, - 0x497b2826, 0x497b2827, 0x497b2829, 0x497b282a, - 0x497b282c, 0x497b282d, 0x4803c856, 0x850e1d06, - 0x8c080500, 0x05000004, 0x4803c856, 0x910e1d51, - 0x0501f004, 0x8c080506, 0x05000002, 0x850e1d42, - 0x850e1d0a, 0x6006d800, 0x82081500, 0x000000e0, - 0x8008010a, 0x0c02002a, 0x050df843, 0x05020008, - 0x64075014, 0x4a035013, 0x0000aaaa, 0x0509ffbc, - 0x0501f018, 0x64035014, 0x05fdf7fb, 0x497b5013, - 0x0505fb5d, 0x0515fd88, 0x0519f8db, 0x0515fd72, - 0x59a00a08, 0x480788a7, 0x59c400a3, 0x82000500, - 0xfeffffff, 0x82000540, 0x80018000, 0x40000800, - 0x84040d20, 0x480388a3, 0x480788a3, 0x497b5036, - 0x60b40800, 0x42001000, 0x00103dce, 0x0515f8fc, - 0x59a00408, 0x800000c2, 0x800008c4, 0x8005d400, - 0x61fc01ff, 0x050df820, 0x05000003, 0x59a00208, - 0x80000110, 0x0501fbb5, 0x05f5f7a7, 0x001031ea, - 0x001031ec, 0x001031f3, 0x001021ff, 0x001031f1, - 0x001021ff, 0x001021ff, 0x001021ff, 0x916c0583, - 0x05000003, 0x641f4407, 0x05f5f7dd, 0x0501fb92, - 0x05f607df, 0x59a00408, 0x59a00a08, 0x900409c0, - 0x80040d40, 0x4805d806, 0x59a0040a, 0x59a00a0a, - 0x900409c0, 0x80040d40, 0x4805d807, 0x6401d801, - 0x0501fa9a, 0x05020003, 0x640b4407, 0x05f5f7cc, - 0x417a8800, 0x497b4001, 0x912c0406, 0x48034002, - 0x59a00407, 0x8c000504, 0x0502008c, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x4178b800, 0x59a0c407, - 0x59a0c802, 0x59a2440b, 0x0509fab6, 0x05020027, - 0x0509fa5b, 0x05000003, 0x0509f997, 0x05020023, - 0x8c60053e, 0x05020020, 0x8c600500, 0x05000008, - 0x59340009, 0x4400c800, 0x8064c800, 0x59340008, - 0x4400c800, 0x8064c800, 0x0501f007, 0x59340007, - 0x4400c800, 0x8064c800, 0x59340006, 0x4400c800, - 0x8064c800, 0x83440580, 0x000007fe, 0x0500000b, - 0x83440580, 0x000007fc, 0x05000008, 0x0509fa51, - 0x05000003, 0x85468d5e, 0x0501f004, 0x0509f956, - 0x05020002, 0x85468d5e, 0x4544c800, 0x85468d1e, - 0x8064c800, 0x905cbc0c, 0x81468800, 0x83440480, - 0x000007f0, 0x0500100c, 0x8c600506, 0x05000025, - 0x83440580, 0x000007f0, 0x05020003, 0x61fa880f, - 0x0501f005, 0x83440580, 0x000007ff, 0x0502001d, - 0x61f2880f, 0x905c05bc, 0x05fe07c8, 0x59a00001, - 0x805c0400, 0x48034001, 0x8c60053e, 0x05020007, - 0x59a00a0b, 0x800409c0, 0x05000006, 0x80040480, - 0x05021004, 0x8460c57e, 0x4178b800, 0x05fdf7bb, - 0x49474000, 0x485dd805, 0x59a00002, 0x4801d803, - 0x40ec1000, 0x0001f81c, 0x4a01d808, 0x001032ba, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x8c60053e, 0x05020019, 0x805cb9c0, 0x05000021, - 0x59a00001, 0x805c0400, 0x48034001, 0x59a00a0b, - 0x800409c0, 0x05000005, 0x80040480, 0x05021003, - 0x4178b800, 0x0501f00d, 0x59a00801, 0x48074407, - 0x485dd805, 0x59a00002, 0x4801d803, 0x4a01d808, - 0x001021b2, 0x40ec1000, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x0001f01c, 0x59a00001, 0x805c0c00, - 0x59a0020b, 0x80040480, 0x48034208, 0x642b4407, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x05f5f748, - 0x59a00801, 0x48074407, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x05f5f700, 0x4031d800, 0x58ef400a, - 0x58ec0002, 0x82000580, 0x00000200, 0x05f40734, - 0x59a28800, 0x05fdf776, 0x4c5c0000, 0x4c600000, - 0x4c640000, 0x4178b800, 0x59a0c407, 0x59a0c802, - 0x59a2440b, 0x0509fa2b, 0x05020029, 0x0509f9d0, - 0x05000003, 0x0509f90c, 0x05020025, 0x8c60053e, - 0x05020022, 0x83440580, 0x000007fe, 0x0500000f, - 0x83440580, 0x000007fc, 0x0500000c, 0x0509f9d5, - 0x05000005, 0x59340403, 0x8400055e, 0x48026c03, - 0x0501f006, 0x0509f8d8, 0x05020004, 0x59340403, - 0x8400055e, 0x48026c03, 0x4134a000, 0x4064a800, - 0x6018b000, 0x0535fd7b, 0x59340007, 0x4400a800, - 0x59340006, 0x4800a801, 0x59340009, 0x4800a802, - 0x59340008, 0x4800a803, 0x59340403, 0x8400051e, - 0x48026c03, 0x9064cc0a, 0x905cbc28, 0x81468800, - 0x83440480, 0x000007f0, 0x0500100c, 0x8c600506, - 0x05000026, 0x83440580, 0x000007f0, 0x05020003, - 0x61fa880f, 0x0501f005, 0x83440580, 0x000007ff, - 0x0502001e, 0x61f2880f, 0x905c05a8, 0x05000002, - 0x05fdf7c4, 0x59a00001, 0x805c0400, 0x48034001, - 0x8c60053e, 0x05020007, 0x59a00a0b, 0x800409c0, - 0x05000006, 0x80040480, 0x05021004, 0x8460c57e, - 0x4178b800, 0x05fdf7b7, 0x49474000, 0x485dd805, - 0x59a00002, 0x4801d803, 0x40ec1000, 0x0001f81c, - 0x4a01d808, 0x00103348, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x8c60053e, 0x05020019, - 0x805cb9c0, 0x05000021, 0x59a00001, 0x805c0400, - 0x48034001, 0x59a00a0b, 0x800409c0, 0x05000005, - 0x80040480, 0x05021003, 0x4178b800, 0x0501f00d, - 0x59a00801, 0x48074407, 0x485dd805, 0x59a00002, - 0x4801d803, 0x4a01d808, 0x001021b2, 0x40ec1000, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0001f01c, - 0x59a00001, 0x805c0c00, 0x59a0020b, 0x80040480, - 0x48034208, 0x642b4407, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x05f5f6ba, 0x59a00801, 0x48074407, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x05f5f672, - 0x4031d800, 0x58ef400a, 0x58ec0002, 0x82000580, - 0x00000200, 0x05f406a6, 0x59a28800, 0x05fdf773, - 0x61f82800, 0x59a00c07, 0x59a01208, 0x59a01c08, - 0x59a0220a, 0x82040500, 0x0000ff00, 0x840001c0, - 0x900034a0, 0x05f416a6, 0x80140480, 0x05f416a4, - 0x82040500, 0x000000ff, 0x900034a0, 0x05f416a0, - 0x80140480, 0x05f4169e, 0x82080500, 0x0000ff00, - 0x840001c0, 0x900034a0, 0x05f41699, 0x80140480, - 0x05f41697, 0x82080500, 0x000000ff, 0x900034a0, - 0x05f41693, 0x80140480, 0x05f41691, 0x820c0500, - 0x0000ff00, 0x840001c0, 0x900034a0, 0x05f4168c, - 0x80140480, 0x05f4168a, 0x820c0500, 0x000000ff, - 0x900034a0, 0x05f41686, 0x80140480, 0x05f41684, - 0x82100500, 0x0000ff00, 0x840001c0, 0x900034a0, - 0x05f4167f, 0x80140480, 0x05f4167d, 0x82100500, - 0x000000ff, 0x900034a0, 0x05f41679, 0x80140480, - 0x05f41677, 0x900401c0, 0x80080d40, 0x900c01c0, - 0x80101d40, 0x91a83431, 0x44043000, 0x80183000, - 0x440c3000, 0x05f5f628, 0x916c0583, 0x05000003, - 0x641f4407, 0x05f5f666, 0x0501fa1b, 0x05f60668, + 0x800c1d40, 0x82081400, 0x00000080, 0xb0083400, + 0x481b4002, 0x900c3440, 0x481b4003, 0x912c0405, + 0x0501fe39, 0x4a01d808, 0x00102f7c, 0x1c01f000, + 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, + 0x82000580, 0x00000200, 0x05f80314, 0x592c1005, + 0x480bc857, 0x80080120, 0x42024800, 0x0010b391, + 0x48024c06, 0x82081500, 0x0000ffff, 0x599c0818, + 0x90040d30, 0x90040580, 0x05020004, 0xb00804be, + 0x05fa1312, 0x0501f001, 0x0539fbef, 0x05000014, + 0x82080480, 0x00000100, 0x05fa130c, 0x42000000, + 0x0010b390, 0x44080000, 0x800811c0, 0x05f80307, + 0x40080800, 0x42024800, 0x0010b391, 0x912e5c06, + 0x592c0400, 0x8c000506, 0x05020012, 0x59240200, + 0x84000500, 0x48024a00, 0x0501f00e, 0x82080480, + 0x000000ff, 0x05fa12f9, 0x80080800, 0x42000000, + 0x0010b390, 0x44040000, 0x800811c0, 0x0500006c, + 0x42024800, 0x0010b39c, 0x80040840, 0x912e5c06, + 0x600c4000, 0x592c0400, 0x8c000506, 0x05000012, + 0x59a8108d, 0x90081506, 0x05fa02e8, 0x8c00050a, + 0x05020003, 0x8d0c0520, 0x05f802e4, 0x64164a00, + 0x90001503, 0x05000006, 0x840011c0, 0x82081500, + 0x000000ff, 0x480a4a08, 0x0501f003, 0x82000500, + 0x000000ff, 0x48024c00, 0x592c0001, 0x592c1002, + 0x9c0001c0, 0x9c0811c0, 0x48024801, 0x480a4802, + 0x599c1817, 0x8c0c051c, 0x05000006, 0x592c0003, + 0x592c1004, 0x9c0001c0, 0x9c0811c0, 0x0501f003, + 0x82000500, 0xf0ffffff, 0x48024803, 0x480a4804, + 0x912e5c05, 0x91264c0b, 0x80040840, 0x0500001d, + 0x80204040, 0x05fe07d4, 0x48074000, 0x49274001, + 0x603c0800, 0x59a01002, 0x59a01803, 0x9008343c, + 0x481b4002, 0x900c3440, 0x481b4003, 0x58ee580c, + 0x912c0405, 0x0501fdc4, 0x4a01d808, 0x00102ff1, + 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, + 0x82000580, 0x00000200, 0x05f802a0, 0x58ee580c, + 0x912e5c05, 0x59a00800, 0x59a24801, 0x05fdf7b9, + 0x0539fb85, 0x05000010, 0x42006800, 0x0010b391, + 0x4200b000, 0x0010b390, 0x5058b000, 0x58340400, + 0x8c000506, 0x05000005, 0x58340200, 0x8400055e, + 0x48006a00, 0x0501f004, 0x90346c0b, 0x8058b040, + 0x05fe07f7, 0x42006800, 0x0010b391, 0x4200b000, + 0x0010b390, 0x5058b000, 0x8058b040, 0x05000008, + 0x42024800, 0x0010b39c, 0x58340206, 0x48024a06, + 0x91264c0b, 0x8058b040, 0x05fe07fc, 0x599c1019, + 0x82081500, 0x0000e000, 0x497b4208, 0x05f5face, + 0x05000012, 0x05f5fab0, 0x64074208, 0x0502000f, + 0x4c080000, 0x05f5faba, 0x5c001000, 0x05020007, + 0x640b4208, 0x82080580, 0x00008000, 0x05020007, + 0x64134208, 0x0501f005, 0x640f4208, 0x90080580, + 0x05020002, 0x64174208, 0x90080580, 0x05020007, + 0x6403503b, 0x60040000, 0x05f5f86a, 0x60040000, + 0x05f5f83e, 0x0501f02b, 0x82080580, 0x00002000, + 0x05020008, 0x6407503b, 0x60000000, 0x05f5f861, + 0x60000000, 0x05f5f835, 0x05f5fc13, 0x0501f021, + 0x82080580, 0x00004000, 0x05020004, 0x640b503b, + 0x64075047, 0x05fdf7f9, 0x82080580, 0x00006000, + 0x0502000f, 0x59a8085c, 0x82040d80, 0x01391077, + 0x05020004, 0x59e00813, 0x8c040500, 0x05fa024f, + 0x640f503b, 0x60080000, 0x05f5f84a, 0x60080000, + 0x05f5f81e, 0x05fdf7e9, 0x0501f00a, 0x82080580, + 0x00008000, 0x05fa0245, 0x05f5fc06, 0x6413503b, + 0x600c0000, 0x05f5f83f, 0x600c0000, 0x05f5f813, + 0x599c1019, 0x82081500, 0x0000e000, 0x4c080000, + 0x0501fea1, 0x5c001000, 0x05020004, 0x82080580, + 0x00004000, 0x0500000b, 0x0501fe68, 0x05000003, + 0x0501fe7d, 0x05020009, 0x82080580, 0x00008000, + 0x05000004, 0x82080580, 0x00004000, 0x05020003, + 0x600010c0, 0x0501f004, 0x599c0019, 0x8c000518, + 0x05000005, 0x8008111a, 0x480b5048, 0x640b503b, + 0x64075047, 0x599c0019, 0x8c000520, 0x05000001, + 0x4a035013, 0x0000aaaa, 0x599c1018, 0x90081530, + 0x90080d80, 0x05000005, 0x90080d90, 0x05000008, + 0x90080da0, 0x05020002, 0x48075013, 0x0501fdba, + 0x05000007, 0x4803c856, 0x850e1d46, 0x05f1fde2, + 0x59a8001f, 0x80040540, 0x4803501f, 0x49f3c857, + 0x42001000, 0x00104a82, 0x0515fc4e, 0x42001000, + 0x00104a75, 0x0515fd93, 0x4a038805, 0xffffffff, + 0x0501fe58, 0x05000005, 0x4a03c014, 0x00400040, + 0x4a03c013, 0x00400000, 0x59a0001e, 0x84000540, + 0x4803401e, 0x49f3c857, 0x05f9f1b2, 0x00000018, + 0x0000000c, 0x00000018, 0x00000020, 0x916c0580, + 0x05020003, 0x601c0800, 0x05f9f1ec, 0x60800800, + 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, + 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, + 0x419c0000, 0x0501f4fa, 0x8d0c050e, 0x05000003, + 0x64074407, 0x05f9f1dd, 0x050dfa70, 0x05020003, + 0x645b4407, 0x05f9f1d9, 0x59a80073, 0x8c000500, + 0x0500000e, 0x64034407, 0x60800800, 0x59a00408, + 0x59a01208, 0x900811c0, 0x80081540, 0x59a0040a, + 0x59a01a0a, 0x900c19c0, 0x800c1d40, 0x42000000, + 0x0010cea4, 0x0501f4e2, 0x64074407, 0x6080b000, + 0x4200a800, 0x0010cea4, 0x4200a000, 0xffffffff, + 0x4450a800, 0x8054a800, 0x8058b040, 0x05fe07fd, + 0x4d440000, 0x4d340000, 0x42028800, 0xffffffff, + 0x42002000, 0xffffffff, 0x60043000, 0x60043800, + 0x42001800, 0x0010cea4, 0x59a8100f, 0x82081500, + 0x000000ff, 0x40180000, 0x0c01f001, 0x001030f3, + 0x001030f6, 0x001030fa, 0x001030fe, 0x82102500, + 0xffffff00, 0x0501f014, 0x82102500, 0xffff00ff, + 0x840811c0, 0x0501f010, 0x82102500, 0xff00ffff, + 0x900811c0, 0x0501f00c, 0x82102500, 0x00ffffff, + 0x9c0801c0, 0x80102540, 0x44101800, 0x42003000, + 0xffffffff, 0x42002000, 0xffffffff, 0x800c1800, + 0x0501f003, 0x40080000, 0x80102540, 0x81468800, + 0xb1442cbf, 0x05021012, 0x4c080000, 0x4c0c0000, + 0x4c180000, 0x4c1c0000, 0x0001fae7, 0x5c003800, + 0x5c003000, 0x5c001800, 0x5c001000, 0x05fe07f4, + 0x0509fc70, 0x05fe07f2, 0x80183000, 0x801c3800, + 0x59341202, 0x40180000, 0x0c01f7d1, 0x82100580, + 0xffffffff, 0x05000002, 0x44101800, 0x42001800, + 0x0010cea4, 0x500c0000, 0x82000500, 0xffffff00, + 0x801c0540, 0x44001800, 0x5c026800, 0x5c028800, + 0x60800800, 0x59a00408, 0x59a01208, 0x900811c0, + 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, + 0x800c1d40, 0x42000000, 0x0010cea4, 0x0501f480, + 0x59a28c07, 0x0501fd43, 0x05fa0168, 0x0509fc95, + 0x05fa0166, 0x0501fc54, 0x05020003, 0x640b4407, + 0x05f9f15e, 0x59a0020c, 0x8c000500, 0x05000003, + 0x0509fc44, 0x0502050e, 0x59a0020c, 0x8c000502, + 0x05000015, 0x83440480, 0x000007f0, 0x05021012, + 0x0509fc45, 0x05020010, 0x497a5a05, 0x4a025c05, + 0x00008000, 0x59a24805, 0x0529fc48, 0x05020003, + 0x640f4407, 0x05f9f149, 0x4a01d808, 0x00103159, + 0x1c01f000, 0x59a28c07, 0x59a2440b, 0x0509fc75, + 0x05fa0146, 0x4c580000, 0x4c500000, 0x4c540000, + 0x6028b000, 0x4134a000, 0x912e5c02, 0x412ca800, + 0x0539f9ac, 0x912cac06, 0x4054a000, 0x6010b000, + 0x0539f9e3, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x592c0802, 0x82040500, 0x00ff00ff, 0x900001c0, + 0x82041500, 0xff00ff00, 0x80080540, 0x48025802, + 0x592c0801, 0x82040500, 0x00ff00ff, 0x900001c0, + 0x82041500, 0xff00ff00, 0x80080540, 0x48025801, + 0x60280800, 0x59a00408, 0x59a01208, 0x900811c0, + 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, + 0x800c1d40, 0x412c0000, 0x0501f431, 0x496fc857, + 0x496f4407, 0x497b4208, 0x05f5f963, 0x05000015, + 0x05f5f945, 0x64074208, 0x05020012, 0x4c080000, + 0x05f5f94f, 0x5c001000, 0x05020008, 0x640b4208, + 0x916c0580, 0x0500000b, 0x05f1fd39, 0x05020009, + 0x64134208, 0x0501f007, 0x640f4208, 0x916c0580, + 0x05000004, 0x05f1fd11, 0x05020002, 0x64174208, + 0x05f9f0bc, 0x59a28c07, 0x0501fcda, 0x05fa00ff, + 0x0509fc2c, 0x05fa00fd, 0x916c0583, 0x05000003, + 0x641f4407, 0x05f9f0f5, 0x91340c06, 0x59a0020c, + 0x8c000500, 0x05000002, 0x91340c08, 0x58040001, + 0x4803440a, 0x900001c0, 0x4803420a, 0x50040000, + 0x48034408, 0x900001c0, 0x48034208, 0x59340200, + 0x48034407, 0x05f9f0a3, 0x8d0c050e, 0x05000003, + 0x64074407, 0x05f9f0e1, 0x59a0220c, 0x8c100500, + 0x05020021, 0x8c100506, 0x05020004, 0x59a03209, + 0x90180483, 0x05fa10dd, 0x59a28c07, 0x0001fae7, + 0x05fa00da, 0x0509fbae, 0x05000003, 0x64274407, + 0x05f9f0d2, 0x0501fbc4, 0x05020003, 0x640b4407, + 0x05f9f0ce, 0x59a0220c, 0x8c100506, 0x05000004, + 0x59343002, 0x82183500, 0x00ffffff, 0x497a5a05, + 0x4a025c05, 0x00008000, 0x0529fb88, 0x05020003, + 0x640f4407, 0x05f9f0c1, 0x4a01d808, 0x0010321f, + 0x1c01f000, 0x59a28c07, 0x0001fae7, 0x05fa00bf, + 0x0509fb93, 0x05000003, 0x64274407, 0x05f9f0b7, + 0x0501fba9, 0x05020003, 0x640b4407, 0x05f9f0b3, + 0x497a5a05, 0x4a025c05, 0x00008000, 0x0501fba2, + 0x05020003, 0x640b4407, 0x05f9f0ac, 0x592e5800, + 0x0529fb81, 0x05020003, 0x640f4407, 0x05f9f0a7, + 0x4a01d808, 0x001031fb, 0x1c01f000, 0x592c2806, + 0x82140d80, 0x01000000, 0x05020003, 0x64134407, + 0x05f9f09e, 0x60200800, 0x59a00208, 0x59a01408, + 0x900001c0, 0x80081540, 0x59a0020a, 0x59a01c0a, + 0x900001c0, 0x800c1d40, 0x912c0406, 0x0501fbac, + 0x8c140500, 0x05000003, 0x4a01d808, 0x00103211, + 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580d, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f8007f, + 0x812e59c0, 0x05e40fd6, 0x60200800, 0x912c0406, + 0x58ec1006, 0x58ec1807, 0x0501f399, 0x592c0006, + 0x82000580, 0x01000000, 0x05020003, 0x64134407, + 0x05f9f07a, 0x59a00208, 0x59a01408, 0x900001c0, + 0x80081540, 0x59a0020a, 0x59a01c0a, 0x900001c0, + 0x800c1d40, 0x60180800, 0x912c0407, 0x0501f388, + 0x59a00a0b, 0x800409c0, 0x05f80070, 0x0501fc49, + 0x05fa006e, 0x82040480, 0x00000081, 0x05001002, + 0x60000801, 0x59c40085, 0x59881004, 0x80081400, + 0x480b1004, 0x497b8885, 0x59c400b1, 0x48031022, + 0x59c400b2, 0x48031021, 0x59c400a2, 0x48031023, + 0x598810b7, 0x598800b8, 0x80081400, 0x598800b9, + 0x80081400, 0x598800ba, 0x80081400, 0x5988011d, + 0x80081400, 0x598800bb, 0x80081400, 0x480b1024, + 0x59a00208, 0x59a01408, 0x900001c0, 0x80081540, + 0x59a0020a, 0x59a01c0a, 0x900001c0, 0x800c1d40, + 0x91880400, 0x0501fb5e, 0x4a01d808, 0x0010325d, + 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ec0002, + 0x82000580, 0x00000200, 0x05f80034, 0x59a0020c, + 0x8c000500, 0x05000006, 0x91880400, 0x4803c840, + 0x641bc842, 0x05011000, 0x497b8885, 0x4a034208, + 0x00000080, 0x05f5f7ef, 0x8d0c050e, 0x05000003, + 0x64074407, 0x05f9f02d, 0x0501fc0a, 0x05fa002f, + 0x0501fb1d, 0x05020003, 0x640b4407, 0x05f9f027, + 0x497a5a05, 0x4a025c05, 0x00008000, 0x59a00407, + 0x800001c0, 0x05f80025, 0x82001580, 0x000000ff, + 0x05000003, 0x90001484, 0x05fa1020, 0x40001000, + 0x59a24805, 0x05f5fa27, 0x05020003, 0x640f4407, + 0x05f9f016, 0x4a01d808, 0x0010328c, 0x1c01f000, + 0x592c0006, 0x82000580, 0x01000000, 0x05f607cd, + 0x64134407, 0x05f9f00d, 0x59a01407, 0x8c080508, + 0x05020005, 0x8d0c050e, 0x05000003, 0x64074407, + 0x05f9f006, 0x59a01c08, 0x820c0480, 0x00001000, + 0x05fa1006, 0x497b2804, 0x497b2805, 0x497b2826, + 0x497b2827, 0x497b2829, 0x497b282a, 0x497b282c, + 0x497b282d, 0x4803c856, 0x850e1d06, 0x8c080500, + 0x05000004, 0x4803c856, 0x910e1d51, 0x0501f004, + 0x8c080506, 0x05000002, 0x850e1d42, 0x850e1d0a, + 0x6006d800, 0x82081500, 0x000000e0, 0x8008010a, + 0x0c02002a, 0x050df87d, 0x05020008, 0x64075014, + 0x4a035013, 0x0000aaaa, 0x0509fff6, 0x0501f018, + 0x64035014, 0x05fdf7fb, 0x497b5013, 0x0505fb65, + 0x0515fe7f, 0x0519f9d2, 0x0515fe69, 0x59a00a08, + 0x480788a7, 0x59c400a3, 0x82000500, 0xfeffffff, + 0x82000540, 0x80018000, 0x40000800, 0x84040d20, + 0x480388a3, 0x480788a3, 0x497b5036, 0x60b40800, + 0x42001000, 0x00103ea1, 0x0515f9f3, 0x59a00408, + 0x800000c2, 0x800008c4, 0x8005d400, 0x61fc01ff, + 0x050df85a, 0x05000003, 0x59a00208, 0x80000110, + 0x0501fbb5, 0x05f5f77f, 0x001032b5, 0x001032b7, + 0x001032be, 0x001022a2, 0x001032bc, 0x001022a2, + 0x001022a2, 0x001022a2, 0x916c0583, 0x05000003, + 0x641f4407, 0x05f5f7b5, 0x0501fb92, 0x05f607b7, 0x59a00408, 0x59a00a08, 0x900409c0, 0x80040d40, 0x4805d806, 0x59a0040a, 0x59a00a0a, 0x900409c0, - 0x80040d40, 0x4805d807, 0x6401d801, 0x0501f923, - 0x05020003, 0x640b4407, 0x05f5f655, 0x417a8800, - 0x497b4001, 0x912c0405, 0x48034002, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x4178b800, 0x4178c800, - 0x59a0c002, 0x0509f943, 0x0502000a, 0x0509f8e8, - 0x05020008, 0x8c64053e, 0x05020005, 0x59340002, - 0x4800c000, 0x4944c001, 0x9060c402, 0x905cbc08, - 0x81468800, 0x83440480, 0x00000800, 0x0502101f, - 0xb05c0480, 0x05021002, 0x05fdf7ef, 0x59a00001, - 0x805c0400, 0x48034001, 0x8c64053e, 0x05000003, - 0x4178b800, 0x05fdf7e8, 0x59a00a0b, 0x800409c0, - 0x05000006, 0x80040480, 0x05021004, 0x4178b800, - 0x8464cd7e, 0x05fdf7e0, 0x49474000, 0x485dd805, - 0x59a00002, 0x4801d803, 0x40ec1000, 0x0001f81c, - 0x4a01d808, 0x0010340a, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x8c64053e, 0x0502001a, - 0x805cb9c0, 0x05000022, 0x59a00001, 0x805c0400, - 0x48034001, 0x59a00a0b, 0x800409c0, 0x05000005, - 0x80040480, 0x05021003, 0x4178b800, 0x0501f00e, - 0x59a00801, 0x80040906, 0x48074407, 0x485dd805, - 0x59a00002, 0x4801d803, 0x4a01d808, 0x001021b2, + 0x80040d40, 0x4805d807, 0x6401d801, 0x0501fa9a, + 0x05020003, 0x640b4407, 0x05f5f7a4, 0x417a8800, + 0x497b4001, 0x912c0406, 0x48034002, 0x59a00407, + 0x8c000504, 0x0502008c, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4178b800, 0x59a0c407, 0x59a0c802, + 0x59a2440b, 0x0509fac7, 0x05020027, 0x0509fa6c, + 0x05000003, 0x0509f9a6, 0x05020023, 0x8c60053e, + 0x05020020, 0x8c600500, 0x05000008, 0x59340009, + 0x4400c800, 0x8064c800, 0x59340008, 0x4400c800, + 0x8064c800, 0x0501f007, 0x59340007, 0x4400c800, + 0x8064c800, 0x59340006, 0x4400c800, 0x8064c800, + 0x83440580, 0x000007fe, 0x0500000b, 0x83440580, + 0x000007fc, 0x05000008, 0x0509fa62, 0x05000003, + 0x85468d5e, 0x0501f004, 0x0509f965, 0x05020002, + 0x85468d5e, 0x4544c800, 0x85468d1e, 0x8064c800, + 0x905cbc0c, 0x81468800, 0x83440480, 0x000007f0, + 0x0500100c, 0x8c600506, 0x05000025, 0x83440580, + 0x000007f0, 0x05020003, 0x61fa880f, 0x0501f005, + 0x83440580, 0x000007ff, 0x0502001d, 0x61f2880f, + 0x905c05bc, 0x05fe07c8, 0x59a00001, 0x805c0400, + 0x48034001, 0x8c60053e, 0x05020007, 0x59a00a0b, + 0x800409c0, 0x05000006, 0x80040480, 0x05021004, + 0x8460c57e, 0x4178b800, 0x05fdf7bb, 0x49474000, + 0x485dd805, 0x59a00002, 0x4801d803, 0x40ec1000, + 0x0001f81c, 0x4a01d808, 0x00103385, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x8c60053e, + 0x05020019, 0x805cb9c0, 0x05000021, 0x59a00001, + 0x805c0400, 0x48034001, 0x59a00a0b, 0x800409c0, + 0x05000005, 0x80040480, 0x05021003, 0x4178b800, + 0x0501f00d, 0x59a00801, 0x48074407, 0x485dd805, + 0x59a00002, 0x4801d803, 0x4a01d808, 0x00102255, 0x40ec1000, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0001f01c, 0x59a00001, 0x805c0c00, 0x59a0020b, 0x80040480, 0x48034208, 0x642b4407, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x05f5f5f9, 0x59a00801, - 0x80040906, 0x48074407, 0x5c00c800, 0x5c00c000, - 0x5c00b800, 0x05f5f5b0, 0x4031d800, 0x58ef400a, - 0x58ec0002, 0x82000580, 0x00000200, 0x05f405e4, - 0x59a28800, 0x05fdf79a, 0x8d0c050e, 0x05000003, - 0x64074407, 0x05f5f5e6, 0x59a8021b, 0x8c00050a, - 0x05020005, 0x8c000506, 0x05020003, 0x645b4407, - 0x05f5f5df, 0x0501f994, 0x05f605e1, 0x0501f8a7, - 0x05020003, 0x640b4407, 0x05f5f5d9, 0x59a00c07, - 0x80040902, 0x59a00408, 0x59a01208, 0x900811c0, - 0x80081540, 0x59a0040a, 0x59a01a0a, 0x900c19c0, - 0x800c1d40, 0x912c0406, 0x0501f8b8, 0x4a01d808, - 0x00103432, 0x1c01f000, 0x4031d800, 0x58ef400a, - 0x58ee580c, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f405bb, 0x592c000a, 0x59a8380f, 0x0511fa42, - 0x05040cd9, 0x05f605c2, 0x49474001, 0x481a6802, - 0x592c000b, 0x82001d80, 0x70000000, 0x05020005, - 0x0501f882, 0x0502000c, 0x640b4407, 0x05f5f5b4, - 0x82001d80, 0x72000000, 0x05f605b5, 0x0501f87b, - 0x0502087a, 0x05020879, 0x05020003, 0x640b4407, - 0x05f5f5ab, 0x58ee580c, 0x4a025c05, 0x00008000, - 0x497a5a05, 0x592c3209, 0x80183102, 0x592c1801, - 0x4a001806, 0x01000000, 0x0525ff4c, 0x05020003, - 0x640f4407, 0x05f5f59e, 0x4a01d808, 0x00103461, - 0x1c01f000, 0x592c4000, 0x592c0006, 0x82000580, - 0x01000000, 0x05020003, 0x64134407, 0x05f5f594, - 0x4c580000, 0x4c500000, 0x4c540000, 0x912c3c06, - 0x401ca000, 0x401ca800, 0x5820280b, 0x6008b000, - 0x82143580, 0x70000000, 0x05000002, 0x603cb000, - 0x0535fc27, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x401c0000, 0x58201007, 0x58201808, 0x58202206, - 0x80102102, 0x82143580, 0x70000000, 0x05020005, - 0x90103482, 0x05f4157e, 0x60080800, 0x0501f069, - 0x82143580, 0x72000000, 0x05f60579, 0x901034aa, - 0x05f41577, 0x603c0800, 0x0501f862, 0x4a01d808, - 0x0010348e, 0x1c01f000, 0x4031d800, 0x58ef400a, - 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, - 0x05f4055f, 0x592e5800, 0x912c0c06, 0x4c580000, - 0x4c500000, 0x4c540000, 0x4004a000, 0x4004a800, - 0x603cb000, 0x0535fbfe, 0x5c00a800, 0x5c00a000, - 0x5c00b000, 0x40ec1000, 0x64001001, 0x64f01005, - 0x48041003, 0x0001f81c, 0x4a01d808, 0x001034a9, + 0x5c00c000, 0x5c00b800, 0x05f5f720, 0x59a00801, + 0x48074407, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x05f5f6d8, 0x4031d800, 0x58ef400a, 0x58ec0002, + 0x82000580, 0x00000200, 0x05f4070c, 0x59a28800, + 0x05fdf776, 0x4c5c0000, 0x4c600000, 0x4c640000, + 0x4178b800, 0x59a0c407, 0x59a0c802, 0x59a2440b, + 0x0509fa3c, 0x05020029, 0x0509f9e1, 0x05000003, + 0x0509f91b, 0x05020025, 0x8c60053e, 0x05020022, + 0x83440580, 0x000007fe, 0x0500000f, 0x83440580, + 0x000007fc, 0x0500000c, 0x0509f9e6, 0x05000005, + 0x59340403, 0x8400055e, 0x48026c03, 0x0501f006, + 0x0509f8e7, 0x05020004, 0x59340403, 0x8400055e, + 0x48026c03, 0x4134a000, 0x4064a800, 0x6018b000, + 0x0535ff60, 0x59340007, 0x4400a800, 0x59340006, + 0x4800a801, 0x59340009, 0x4800a802, 0x59340008, + 0x4800a803, 0x59340403, 0x8400051e, 0x48026c03, + 0x9064cc0a, 0x905cbc28, 0x81468800, 0x83440480, + 0x000007f0, 0x0500100c, 0x8c600506, 0x05000026, + 0x83440580, 0x000007f0, 0x05020003, 0x61fa880f, + 0x0501f005, 0x83440580, 0x000007ff, 0x0502001e, + 0x61f2880f, 0x905c05a8, 0x05000002, 0x05fdf7c4, + 0x59a00001, 0x805c0400, 0x48034001, 0x8c60053e, + 0x05020007, 0x59a00a0b, 0x800409c0, 0x05000006, + 0x80040480, 0x05021004, 0x8460c57e, 0x4178b800, + 0x05fdf7b7, 0x49474000, 0x485dd805, 0x59a00002, + 0x4801d803, 0x40ec1000, 0x0001f81c, 0x4a01d808, + 0x00103413, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x8c60053e, 0x05020019, 0x805cb9c0, + 0x05000021, 0x59a00001, 0x805c0400, 0x48034001, + 0x59a00a0b, 0x800409c0, 0x05000005, 0x80040480, + 0x05021003, 0x4178b800, 0x0501f00d, 0x59a00801, + 0x48074407, 0x485dd805, 0x59a00002, 0x4801d803, + 0x4a01d808, 0x00102255, 0x40ec1000, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x0001f01c, 0x59a00001, + 0x805c0c00, 0x59a0020b, 0x80040480, 0x48034208, + 0x642b4407, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x05f5f692, 0x59a00801, 0x48074407, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x05f5f64a, 0x4031d800, + 0x58ef400a, 0x58ec0002, 0x82000580, 0x00000200, + 0x05f4067e, 0x59a28800, 0x05fdf773, 0x61f82800, + 0x59a00c07, 0x59a01208, 0x59a01c08, 0x59a0220a, + 0x82040500, 0x0000ff00, 0x840001c0, 0x900034a0, + 0x05f4167e, 0x80140480, 0x05f4167c, 0x82040500, + 0x000000ff, 0x900034a0, 0x05f41678, 0x80140480, + 0x05f41676, 0x82080500, 0x0000ff00, 0x840001c0, + 0x900034a0, 0x05f41671, 0x80140480, 0x05f4166f, + 0x82080500, 0x000000ff, 0x900034a0, 0x05f4166b, + 0x80140480, 0x05f41669, 0x820c0500, 0x0000ff00, + 0x840001c0, 0x900034a0, 0x05f41664, 0x80140480, + 0x05f41662, 0x820c0500, 0x000000ff, 0x900034a0, + 0x05f4165e, 0x80140480, 0x05f4165c, 0x82100500, + 0x0000ff00, 0x840001c0, 0x900034a0, 0x05f41657, + 0x80140480, 0x05f41655, 0x82100500, 0x000000ff, + 0x900034a0, 0x05f41651, 0x80140480, 0x05f4164f, + 0x900401c0, 0x80080d40, 0x900c01c0, 0x80101d40, + 0x91a83431, 0x44043000, 0x80183000, 0x440c3000, + 0x05f5f600, 0x916c0583, 0x05000003, 0x641f4407, + 0x05f5f63e, 0x0501fa1b, 0x05f60640, 0x59a00408, + 0x59a00a08, 0x900409c0, 0x80040d40, 0x4805d806, + 0x59a0040a, 0x59a00a0a, 0x900409c0, 0x80040d40, + 0x4805d807, 0x6401d801, 0x0501f923, 0x05020003, + 0x640b4407, 0x05f5f62d, 0x417a8800, 0x497b4001, + 0x912c0405, 0x48034002, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4178b800, 0x4178c800, 0x59a0c002, + 0x0509f954, 0x0502000a, 0x0509f8f9, 0x05020008, + 0x8c64053e, 0x05020005, 0x59340002, 0x4800c000, + 0x4944c001, 0x9060c402, 0x905cbc08, 0x81468800, + 0x83440480, 0x00000800, 0x0502101f, 0xb05c0480, + 0x05021002, 0x05fdf7ef, 0x59a00001, 0x805c0400, + 0x48034001, 0x8c64053e, 0x05000003, 0x4178b800, + 0x05fdf7e8, 0x59a00a0b, 0x800409c0, 0x05000006, + 0x80040480, 0x05021004, 0x4178b800, 0x8464cd7e, + 0x05fdf7e0, 0x49474000, 0x485dd805, 0x59a00002, + 0x4801d803, 0x40ec1000, 0x0001f81c, 0x4a01d808, + 0x001034d5, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x8c64053e, 0x0502001a, 0x805cb9c0, + 0x05000022, 0x59a00001, 0x805c0400, 0x48034001, + 0x59a00a0b, 0x800409c0, 0x05000005, 0x80040480, + 0x05021003, 0x4178b800, 0x0501f00e, 0x59a00801, + 0x80040906, 0x48074407, 0x485dd805, 0x59a00002, + 0x4801d803, 0x4a01d808, 0x00102255, 0x40ec1000, + 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x0001f01c, + 0x59a00001, 0x805c0c00, 0x59a0020b, 0x80040480, + 0x48034208, 0x642b4407, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x05f5f5d1, 0x59a00801, 0x80040906, + 0x48074407, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x05f5f588, 0x4031d800, 0x58ef400a, 0x58ec0002, + 0x82000580, 0x00000200, 0x05f405bc, 0x59a28800, + 0x05fdf79a, 0x8d0c050e, 0x05000003, 0x64074407, + 0x05f5f5be, 0x59a8021b, 0x8c00050a, 0x05020005, + 0x8c000506, 0x05020003, 0x645b4407, 0x05f5f5b7, + 0x0501f994, 0x05f605b9, 0x0501f8a7, 0x05020003, + 0x640b4407, 0x05f5f5b1, 0x59a00c07, 0x80040902, + 0x59a00408, 0x59a01208, 0x900811c0, 0x80081540, + 0x59a0040a, 0x59a01a0a, 0x900c19c0, 0x800c1d40, + 0x912c0406, 0x0501f8b8, 0x4a01d808, 0x001034fd, + 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580c, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f40593, + 0x592c000a, 0x59a8380f, 0x0511fb00, 0x05040ce4, + 0x05f6059a, 0x49474001, 0x481a6802, 0x592c000b, + 0x82001d80, 0x70000000, 0x05020005, 0x0501f882, + 0x0502000c, 0x640b4407, 0x05f5f58c, 0x82001d80, + 0x72000000, 0x05f6058d, 0x0501f87b, 0x0502087a, + 0x05020879, 0x05020003, 0x640b4407, 0x05f5f583, + 0x58ee580c, 0x4a025c05, 0x00008000, 0x497a5a05, + 0x592c3209, 0x80183102, 0x592c1801, 0x4a001806, + 0x01000000, 0x0529f862, 0x05020003, 0x640f4407, + 0x05f5f576, 0x4a01d808, 0x0010352c, 0x1c01f000, + 0x592c4000, 0x592c0006, 0x82000580, 0x01000000, + 0x05020003, 0x64134407, 0x05f5f56c, 0x4c580000, + 0x4c500000, 0x4c540000, 0x912c3c06, 0x401ca000, + 0x401ca800, 0x5820280b, 0x6008b000, 0x82143580, + 0x70000000, 0x05000002, 0x603cb000, 0x0535fe0c, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x401c0000, + 0x58201007, 0x58201808, 0x58202206, 0x80102102, + 0x82143580, 0x70000000, 0x05020005, 0x90103482, + 0x05f41556, 0x60080800, 0x0501f069, 0x82143580, + 0x72000000, 0x05f60551, 0x901034aa, 0x05f4154f, + 0x603c0800, 0x0501f862, 0x4a01d808, 0x00103559, 0x1c01f000, 0x4031d800, 0x58ef400a, 0x58ee580d, - 0x58ec0002, 0x82000580, 0x00000200, 0x05f40544, - 0x912c0c06, 0x4c580000, 0x4c500000, 0x4c540000, - 0x4004a000, 0x4004a800, 0x6030b000, 0x0535fbe4, - 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x40ec1000, - 0x64001001, 0x64c01005, 0x48041003, 0x0001f81c, - 0x4a01d808, 0x001021b2, 0x1c01f000, 0x0501f803, - 0x412d8800, 0x1c01f000, 0x05e9f8b6, 0x0500000e, - 0x497a5800, 0x58ec000c, 0x80000540, 0x05020004, - 0x492dd80c, 0x492dd80d, 0x0501f006, 0x58ec000d, - 0x48025800, 0x90000401, 0x452c0000, 0x492dd80d, - 0x912c0405, 0x492fc857, 0x4803c857, 0x1c01f000, - 0x4d2c0000, 0x58ec400c, 0x802041c0, 0x05000007, - 0x4823c857, 0x40225800, 0x592c4001, 0x497a5801, - 0x05e9f8ac, 0x05fdf7f9, 0x4979d80c, 0x4979d80d, - 0x5c025800, 0x1c01f000, 0x60043000, 0x0501f006, - 0x60043000, 0x0501f005, 0x60003000, 0x0501f003, - 0x60003000, 0x800408c4, 0x800409c0, 0x05e40d00, - 0x4803c857, 0x4807c857, 0x480bc857, 0x480fc857, - 0x481bc857, 0x48efc857, 0x4819d801, 0x4801d803, - 0x4809d806, 0x480dd807, 0x4805d805, 0x40ec1000, - 0x0001f81c, 0x4a01d808, 0x001021b2, 0x1c01f000, - 0x40681000, 0x406c1800, 0x80002d80, 0x480bc857, - 0x480fc857, 0x4813c857, 0x4817c857, 0x8d0c0520, - 0x05000004, 0x59a80005, 0x8c000516, 0x053203f0, - 0x4d2c0000, 0x4da00000, 0x42034000, 0x0010ac19, - 0x59a00018, 0x800001c0, 0x05020014, 0x05006013, - 0x480bc020, 0x480fc021, 0x4813c022, 0x4817c023, - 0x900811c0, 0x90081552, 0x480bc011, 0x59e00017, - 0x8c00050a, 0x60000800, 0x0002088c, 0x8d0c0530, - 0x05ee0d43, 0x000209af, 0x6403c017, 0x4203e000, - 0x30000001, 0x0501f049, 0x4c040000, 0x4c1c0000, - 0x80000800, 0x48074018, 0x59a0381b, 0x481fc857, - 0x801c39c0, 0x05020023, 0x9000048a, 0x0502100e, - 0x59a00019, 0x80000000, 0x48034019, 0x59a0021a, - 0x90000402, 0x90000c94, 0x4803421a, 0x05001003, - 0x497b421a, 0x41780000, 0x59a03817, 0x801c3c00, - 0x0501f02c, 0x4803c856, 0x05e9f83e, 0x05000007, - 0x492f401b, 0x492f401c, 0x412c3800, 0x497b421d, - 0x497a5814, 0x0501f023, 0x5988001e, 0x80000000, - 0x4803101e, 0x59a00018, 0x80000040, 0x48034018, - 0x59a0021a, 0x59a03817, 0x801c3c00, 0x0501f019, - 0x59a0021d, 0x90000402, 0x90000c93, 0x05021004, - 0x4803421d, 0x801c3c00, 0x0501f012, 0x05e9f825, - 0x0502000b, 0x5988001e, 0x80000000, 0x4803101e, - 0x59a00018, 0x80000040, 0x48034018, 0x4803c856, - 0x59a0021d, 0x801c3c00, 0x0501f006, 0x492f401b, - 0x492c3814, 0x412c3800, 0x497b421d, 0x497a5814, - 0x48083c00, 0x480c3a00, 0x48103c01, 0x48143a01, - 0x5c003800, 0x5c000800, 0x5c034000, 0x5c025800, - 0x1c01f000, 0x40681800, 0x406c2000, 0x40703000, - 0x480fc857, 0x4813c857, 0x481bc857, 0x42000000, - 0x0010b013, 0x0535fa1c, 0x801800d0, 0x81202d40, - 0x60501100, 0x05fdf786, 0x4c000000, 0x599c0017, - 0x8c000512, 0x5c000000, 0x1c01f000, 0x4c000000, - 0x599c0018, 0x8c00050e, 0x5c000000, 0x1c01f000, - 0x8d0c050e, 0x05000003, 0x64074407, 0x05f5f470, - 0x916c0583, 0x05000003, 0x641f4407, 0x05f5f46c, - 0x59a24805, 0x59240400, 0x8c000508, 0x05020003, - 0x64234407, 0x05f5f466, 0x59340405, 0x8c000508, - 0x05020003, 0x8c00050a, 0x05fe02e1, 0x497a5a05, - 0x497a5806, 0x4a025c05, 0x00008000, 0x0525fe9e, - 0x05020003, 0x640f4407, 0x05f5f459, 0x4a01d808, - 0x001035a6, 0x1c01f000, 0x592c0006, 0x82000580, - 0x01000000, 0x05020003, 0x64134407, 0x05f5f450, - 0x59a28c07, 0x59a2440b, 0x0505ff46, 0x05f60450, - 0x05fdf2cb, 0x4c040000, 0x59a2440b, 0x42000000, - 0x0010b110, 0x50000000, 0x81200480, 0x0502100d, - 0x83200c00, 0x0010a0ec, 0x50064800, 0x812649c0, - 0x05000008, 0x59240200, 0x8c000500, 0x05000005, - 0x49274005, 0x80000580, 0x5c000800, 0x1c01f000, - 0x90000541, 0x05fdf7fd, 0x61be880f, 0x0001fae7, - 0x05100d79, 0x81468840, 0x05fe17fd, 0x1c01f000, - 0x4803c856, 0x4c0c0000, 0x4d340000, 0x4d440000, - 0x61fa880f, 0x60024000, 0x0505ff22, 0x05020006, - 0x5934180a, 0x900c1d01, 0x900c1d81, 0x606c1100, - 0x05fdff2a, 0x5c028800, 0x5c026800, 0x5c001800, - 0x1c01f000, 0x48efc857, 0x05011000, 0x48efc840, - 0x643fc842, 0x40000000, 0x05fd17ff, 0x4a01d80e, - 0xbeefbeef, 0x1c01f000, 0x497b4000, 0x497b4001, - 0x497b4002, 0x497b4003, 0x497b4004, 0x497b4005, - 0x1c01f000, 0x42002000, 0x001102e4, 0x41580000, - 0x41781000, 0x58100c07, 0x800409c0, 0x0500000c, - 0x90041d83, 0x0500000a, 0x90041c86, 0x05001007, - 0x90041d8a, 0x05000005, 0x90041c8f, 0x05001004, - 0x90041c92, 0x05021002, 0x80081000, 0x90102430, - 0x80100c80, 0x05fc17f0, 0x40080000, 0x59a81266, - 0x80080480, 0x05021002, 0x41780000, 0x81640480, - 0x05021002, 0x41780000, 0x1c01f000, 0x05f1fce1, - 0x05020015, 0x59a8685c, 0x82346d80, 0x3261103c, - 0x05020011, 0x0535faac, 0x0500000d, 0x605c70f4, - 0x50386800, 0x82347500, 0x03f00000, 0x82387580, - 0x00400000, 0x05020007, 0x82347500, 0x000f0000, - 0x82387580, 0x00010000, 0x05000002, 0x90000541, - 0x64030000, 0x1c01f000, 0x05f1fcca, 0x05020004, - 0x59a8685c, 0x82347580, 0x01651077, 0x1c01f000, + 0x58ec0002, 0x82000580, 0x00000200, 0x05f40537, + 0x592e5800, 0x912c0c06, 0x4c580000, 0x4c500000, + 0x4c540000, 0x4004a000, 0x4004a800, 0x603cb000, + 0x0535fde3, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x40ec1000, 0x64001001, 0x64f01005, 0x48041003, + 0x0001f81c, 0x4a01d808, 0x00103574, 0x1c01f000, + 0x4031d800, 0x58ef400a, 0x58ee580d, 0x58ec0002, + 0x82000580, 0x00000200, 0x05f4051c, 0x912c0c06, + 0x4c580000, 0x4c500000, 0x4c540000, 0x4004a000, + 0x4004a800, 0x6030b000, 0x0535fdc9, 0x5c00a800, + 0x5c00a000, 0x5c00b000, 0x40ec1000, 0x64001001, + 0x64c01005, 0x48041003, 0x0001f81c, 0x4a01d808, + 0x00102255, 0x1c01f000, 0x0501f803, 0x412d8800, + 0x1c01f000, 0x05e5ffeb, 0x0500000e, 0x497a5800, + 0x58ec000c, 0x80000540, 0x05020004, 0x492dd80c, + 0x492dd80d, 0x0501f006, 0x58ec000d, 0x48025800, + 0x90000401, 0x452c0000, 0x492dd80d, 0x912c0405, + 0x492fc857, 0x4803c857, 0x1c01f000, 0x4d2c0000, + 0x58ec400c, 0x802041c0, 0x05000007, 0x4823c857, + 0x40225800, 0x592c4001, 0x497a5801, 0x05e5ffe1, + 0x05fdf7f9, 0x4979d80c, 0x4979d80d, 0x5c025800, + 0x1c01f000, 0x60043000, 0x0501f006, 0x60043000, + 0x0501f005, 0x60003000, 0x0501f003, 0x60003000, + 0x800408c4, 0x800409c0, 0x05e40c35, 0x4803c857, + 0x4807c857, 0x480bc857, 0x480fc857, 0x481bc857, + 0x48efc857, 0x4819d801, 0x4801d803, 0x4809d806, + 0x480dd807, 0x4805d805, 0x40ec1000, 0x0001f81c, + 0x4a01d808, 0x00102255, 0x1c01f000, 0x40681000, + 0x406c1800, 0x80002d80, 0x480bc857, 0x480fc857, + 0x4813c857, 0x4817c857, 0x8d0c0520, 0x05000004, + 0x59a80005, 0x8c000516, 0x053205c3, 0x4d2c0000, + 0x4da00000, 0x42034000, 0x0010ae99, 0x59a00018, + 0x800001c0, 0x05020014, 0x05006013, 0x480bc020, + 0x480fc021, 0x4813c022, 0x4817c023, 0x900811c0, + 0x90081552, 0x480bc011, 0x59e00017, 0x8c00050a, + 0x60000800, 0x0002088c, 0x8d0c0530, 0x05ee0c76, + 0x000209af, 0x6403c017, 0x4203e000, 0x30000001, + 0x0501f049, 0x4c040000, 0x4c1c0000, 0x80000800, + 0x48074018, 0x59a0381b, 0x481fc857, 0x801c39c0, + 0x05020023, 0x9000048a, 0x0502100e, 0x59a00019, + 0x80000000, 0x48034019, 0x59a0021a, 0x90000402, + 0x90000c94, 0x4803421a, 0x05001003, 0x497b421a, + 0x41780000, 0x59a03817, 0x801c3c00, 0x0501f02c, + 0x4803c856, 0x05e5ff73, 0x05000007, 0x492f401b, + 0x492f401c, 0x412c3800, 0x497b421d, 0x497a5814, + 0x0501f023, 0x5988001e, 0x80000000, 0x4803101e, + 0x59a00018, 0x80000040, 0x48034018, 0x59a0021a, + 0x59a03817, 0x801c3c00, 0x0501f019, 0x59a0021d, + 0x90000402, 0x90000c93, 0x05021004, 0x4803421d, + 0x801c3c00, 0x0501f012, 0x05e5ff5a, 0x0502000b, + 0x5988001e, 0x80000000, 0x4803101e, 0x59a00018, + 0x80000040, 0x48034018, 0x4803c856, 0x59a0021d, + 0x801c3c00, 0x0501f006, 0x492f401b, 0x492c3814, + 0x412c3800, 0x497b421d, 0x497a5814, 0x48083c00, + 0x480c3a00, 0x48103c01, 0x48143a01, 0x5c003800, + 0x5c000800, 0x5c034000, 0x5c025800, 0x1c01f000, + 0x40681800, 0x406c2000, 0x40703000, 0x480fc857, + 0x4813c857, 0x481bc857, 0x42000000, 0x0010b293, + 0x0535fc01, 0x801800d0, 0x81202d40, 0x60501100, + 0x05fdf786, 0x4c000000, 0x599c0017, 0x8c000512, + 0x5c000000, 0x1c01f000, 0x4c000000, 0x599c0018, + 0x8c00050e, 0x5c000000, 0x1c01f000, 0x8d0c050e, + 0x05000003, 0x64074407, 0x05f5f448, 0x916c0583, + 0x05000003, 0x641f4407, 0x05f5f444, 0x59a24805, + 0x59240400, 0x8c000508, 0x05020003, 0x64234407, + 0x05f5f43e, 0x59340405, 0x8c000508, 0x05020003, + 0x8c00050a, 0x05fe02e1, 0x497a5a05, 0x497a5806, + 0x4a025c05, 0x00008000, 0x0525ffb4, 0x05020003, + 0x640f4407, 0x05f5f431, 0x4a01d808, 0x00103671, + 0x1c01f000, 0x592c0006, 0x82000580, 0x01000000, + 0x05020003, 0x64134407, 0x05f5f428, 0x59a28c07, + 0x59a2440b, 0x0505ff57, 0x05f60428, 0x05fdf2cb, + 0x4c040000, 0x59a2440b, 0x42000000, 0x0010b390, + 0x50000000, 0x81200480, 0x0502100d, 0x83200c00, + 0x0010a3b3, 0x50064800, 0x812649c0, 0x05000008, + 0x59240200, 0x8c000500, 0x05000005, 0x49274005, + 0x80000580, 0x5c000800, 0x1c01f000, 0x90000541, + 0x05fdf7fd, 0x61be880f, 0x0001fae7, 0x05100e70, + 0x81468840, 0x05fe17fd, 0x1c01f000, 0x4803c856, + 0x4c0c0000, 0x4d340000, 0x4d440000, 0x61fa880f, + 0x60024000, 0x0505ff33, 0x05020006, 0x5934180a, + 0x900c1d01, 0x900c1d81, 0x606c1100, 0x05fdff2a, + 0x5c028800, 0x5c026800, 0x5c001800, 0x1c01f000, + 0x48efc857, 0x05011000, 0x48efc840, 0x643fc842, + 0x40000000, 0x05fd17ff, 0x4a01d80e, 0xbeefbeef, + 0x1c01f000, 0x497b4000, 0x497b4001, 0x497b4002, + 0x497b4003, 0x497b4004, 0x497b4005, 0x1c01f000, + 0x42002000, 0x00110514, 0x41580000, 0x41781000, + 0x58100c07, 0x800409c0, 0x0500000c, 0x90041d83, + 0x0500000a, 0x90041c86, 0x05001007, 0x90041d8a, + 0x05000005, 0x90041c8f, 0x05001004, 0x90041c92, + 0x05021002, 0x80081000, 0x90102430, 0x80100c80, + 0x05fc17f0, 0x40080000, 0x59a81266, 0x80080480, + 0x05021002, 0x41780000, 0x81640480, 0x05021002, + 0x41780000, 0x1c01f000, 0x05f1fc17, 0x05020015, + 0x59a8685c, 0x82346d80, 0x3261103c, 0x05020011, + 0x0535fc91, 0x0500000d, 0x605c70f4, 0x50386800, + 0x82347500, 0x03f00000, 0x82387580, 0x00400000, + 0x05020007, 0x82347500, 0x000f0000, 0x82387580, + 0x00010000, 0x05000002, 0x90000541, 0x64030000, + 0x1c01f000, 0x05f1fc00, 0x05020004, 0x59a8685c, + 0x82347580, 0x01651077, 0x1c01f000, 0x0501f805, + 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, + 0x05f1fbf5, 0x0502000a, 0x59a8685c, 0x82347580, + 0x01661077, 0x05000006, 0x82347580, 0x01681077, + 0x05000003, 0x82347580, 0x01761077, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, - 0x1c01f000, 0x05f1fcbf, 0x0502000a, 0x59a8685c, - 0x82347580, 0x01661077, 0x05000006, 0x82347580, - 0x01681077, 0x05000003, 0x82347580, 0x01761077, - 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x05f1fcae, 0x05020007, - 0x59a8685c, 0x82347580, 0x01681077, 0x05000003, - 0x82347580, 0x01761077, 0x1c01f000, 0x4803c856, - 0x05fdfff6, 0x65034407, 0x05f603b1, 0x59a0020b, - 0x4803c857, 0x800001c0, 0x05f403b1, 0xb0000485, - 0x05f613af, 0x59a0220c, 0x8c100500, 0x0502001b, - 0x4803c856, 0x05fdfe71, 0x05020004, 0x640b4407, - 0x4803c856, 0x05f5f3a2, 0x59a00c0b, 0x59a01a0b, - 0x59a0220c, 0x59a02c07, 0x912e5c02, 0x412cc800, - 0x4807c857, 0x480fc857, 0x4813c857, 0x4817c857, - 0x4867c857, 0x0501f8cf, 0x05000017, 0x59a00a0b, - 0x59a01008, 0x900811c0, 0x59a0180a, 0x900c19c0, - 0x412c0000, 0x05fdf67d, 0x4807c856, 0x59a00c0b, - 0x59a01a0b, 0x900c0581, 0x05f6038d, 0x59a02c07, - 0x91a0cc07, 0x4807c857, 0x4813c857, 0x4817c857, - 0x0501f8bc, 0x05000004, 0x59a00a07, 0x48074407, - 0x05f5f33d, 0x64134407, 0x05f5f37d, 0x59a0220c, - 0x4813c857, 0x05fdffbd, 0x65034407, 0x05f60378, - 0x59a00c0b, 0x4807c857, 0x8c100500, 0x0502001b, - 0x05fdfe3e, 0x05020003, 0x640b4407, 0x05f5f370, - 0x59a00a0b, 0xb0040485, 0x05f61371, 0x59a01008, - 0x900811c0, 0x59a0180a, 0x900c19c0, 0x912c0402, - 0x05fdfe54, 0x4a01d808, 0x00103698, 0x1c01f000, - 0x4031d800, 0x58ef400a, 0x58ee580c, 0x58ec0002, - 0x82000580, 0x00000200, 0x05f40355, 0x912c1402, - 0x59a01a0b, 0x0501f003, 0x91a0140b, 0x60041800, - 0x59a00c0b, 0x59a0220c, 0x59a02c07, 0x4807c857, - 0x480bc857, 0x50080000, 0x82000500, 0x000000ff, - 0x4803c857, 0x480fc857, 0x4813c857, 0x4817c857, - 0x0501f830, 0x64134407, 0x05f40349, 0x05f5f306, - 0x05fdff8a, 0x0502000d, 0x4803c856, 0x61c0083f, - 0x61c4103f, 0x64000800, 0x46001000, 0x000001a7, - 0x64040800, 0x64041000, 0x64080800, 0x50080000, - 0x8400054e, 0x44001000, 0x1c01f000, 0x4803c856, - 0x4c5c0000, 0x64103000, 0x60e0b817, 0x05f1fa43, - 0x805cb840, 0x05000005, 0x501c6800, 0x90346d02, - 0x05fe07fb, 0x90346d41, 0x485fc857, 0x5c00b800, - 0x1c01f000, 0x4803c856, 0x4c5c0000, 0x64103000, - 0x60e0b817, 0x05f1fa35, 0x805cb840, 0x05000006, - 0x501c6800, 0x82346d00, 0x00000082, 0x05fe07fa, + 0x1c01f000, 0x05f1fbe4, 0x05020007, 0x59a8685c, + 0x82347580, 0x01681077, 0x05000003, 0x82347580, + 0x01761077, 0x1c01f000, 0x4803c856, 0x05fdfff6, + 0x65034407, 0x05f60389, 0x59a0020b, 0x4803c857, + 0x800001c0, 0x05f40389, 0xb0000485, 0x05f61387, + 0x59a0220c, 0x8c100500, 0x0502001b, 0x4803c856, + 0x05fdfe71, 0x05020004, 0x640b4407, 0x4803c856, + 0x05f5f37a, 0x59a00c0b, 0x59a01a0b, 0x59a0220c, + 0x59a02c07, 0x912e5c02, 0x412cc800, 0x4807c857, + 0x480fc857, 0x4813c857, 0x4817c857, 0x4867c857, + 0x0501f8cf, 0x05000017, 0x59a00a0b, 0x59a01008, + 0x900811c0, 0x59a0180a, 0x900c19c0, 0x412c0000, + 0x05fdf67d, 0x4807c856, 0x59a00c0b, 0x59a01a0b, + 0x900c0581, 0x05f60365, 0x59a02c07, 0x91a0cc07, + 0x4807c857, 0x4813c857, 0x4817c857, 0x0501f8bc, + 0x05000004, 0x59a00a07, 0x48074407, 0x05f5f315, + 0x64134407, 0x05f5f355, 0x59a0220c, 0x4813c857, + 0x05fdffbd, 0x65034407, 0x05f60350, 0x59a00c0b, + 0x4807c857, 0x8c100500, 0x0502001b, 0x05fdfe3e, + 0x05020003, 0x640b4407, 0x05f5f348, 0x59a00a0b, + 0xb0040485, 0x05f61349, 0x59a01008, 0x900811c0, + 0x59a0180a, 0x900c19c0, 0x912c0402, 0x05fdfe54, + 0x4a01d808, 0x00103763, 0x1c01f000, 0x4031d800, + 0x58ef400a, 0x58ee580c, 0x58ec0002, 0x82000580, + 0x00000200, 0x05f4032d, 0x912c1402, 0x59a01a0b, + 0x0501f003, 0x91a0140b, 0x60041800, 0x59a00c0b, + 0x59a0220c, 0x59a02c07, 0x4807c857, 0x480bc857, + 0x50080000, 0x82000500, 0x000000ff, 0x4803c857, + 0x480fc857, 0x4813c857, 0x4817c857, 0x0501f830, + 0x64134407, 0x05f40321, 0x05f5f2de, 0x05fdff8a, + 0x0502000d, 0x4803c856, 0x61c0083f, 0x61c4103f, + 0x64000800, 0x46001000, 0x000001a7, 0x64040800, + 0x64041000, 0x64080800, 0x50080000, 0x8400054e, + 0x44001000, 0x1c01f000, 0x4803c856, 0x4c5c0000, + 0x64103000, 0x60e0b817, 0x05f1f979, 0x805cb840, + 0x05000005, 0x501c6800, 0x90346d02, 0x05fe07fb, 0x90346d41, 0x485fc857, 0x5c00b800, 0x1c01f000, - 0x4803c856, 0x4c5c0000, 0x61c0303f, 0x61c4383f, - 0x64103000, 0x61a0b807, 0x805cb840, 0x0500004b, - 0x501c0000, 0x8c00050c, 0x05fe07fc, 0x640c3000, - 0x46003800, 0x000000a0, 0x64103000, 0x46003800, - 0x00000090, 0x05fdffe0, 0x05000040, 0x8c10051c, - 0x05000008, 0x640c3000, 0x4807c857, 0x44043800, - 0x64103000, 0x64403800, 0x05fdffd7, 0x05000037, - 0x800c19c0, 0x05000033, 0x640c3000, 0x5008b800, - 0x445c3800, 0x485fc857, 0x480fc857, 0x800c1840, - 0x05000028, 0x64103000, 0x64403800, 0x05fdffca, - 0x0500002a, 0x640c3000, 0x805cb910, 0x445c3800, - 0x485fc857, 0x480fc857, 0x800c1840, 0x0500001d, - 0x64103000, 0x64403800, 0x05fdffbf, 0x0500001f, - 0x640c3000, 0x805cb910, 0x445c3800, 0x485fc857, - 0x480fc857, 0x800c1840, 0x05000012, 0x64103000, - 0x64403800, 0x05fdffb4, 0x05000014, 0x640c3000, - 0x805cb910, 0x445c3800, 0x485fc857, 0x480fc857, - 0x800c1840, 0x05000007, 0x64103000, 0x64403800, - 0x05fdffa9, 0x05000009, 0x80081000, 0x05fdf7d3, - 0x64103000, 0x65403800, 0x05fdffa3, 0x05000003, - 0x90000541, 0x4803c856, 0x5c00b800, 0x1c01f000, - 0x4803c856, 0x4c5c0000, 0x4c600000, 0x400c6000, - 0x61c0303f, 0x61c4383f, 0x64103000, 0x61a0b807, - 0x805cb840, 0x05000088, 0x501c0000, 0x4803c857, - 0x8c00050c, 0x05fe07fb, 0x8c10051c, 0x05000014, - 0x640c3000, 0x50180000, 0x4803c857, 0x501c0000, - 0x4803c857, 0x46003800, 0x000000a0, 0x64103000, - 0x46003800, 0x00000090, 0x05fdff83, 0x05000076, + 0x4803c856, 0x4c5c0000, 0x64103000, 0x60e0b817, + 0x05f1f96b, 0x805cb840, 0x05000006, 0x501c6800, + 0x82346d00, 0x00000082, 0x05fe07fa, 0x90346d41, + 0x485fc857, 0x5c00b800, 0x1c01f000, 0x4803c856, + 0x4c5c0000, 0x61c0303f, 0x61c4383f, 0x64103000, + 0x61a0b807, 0x805cb840, 0x0500004b, 0x501c0000, + 0x8c00050c, 0x05fe07fc, 0x640c3000, 0x46003800, + 0x000000a0, 0x64103000, 0x46003800, 0x00000090, + 0x05fdffe0, 0x05000040, 0x8c10051c, 0x05000008, 0x640c3000, 0x4807c857, 0x44043800, 0x64103000, - 0x64403800, 0x05fdff7c, 0x0500006f, 0x640c3000, - 0x46003800, 0x000000a1, 0x64103000, 0x46003800, - 0x00000090, 0x05fdff74, 0x05000067, 0x800c19c0, - 0x05e40a8f, 0x4178b800, 0x900c1581, 0x05000040, - 0x64103000, 0x64803800, 0x05fdff5d, 0x0500005e, - 0x640c3000, 0x501c0800, 0x4807c857, 0x9c0409c0, - 0x8004bd57, 0x485fc857, 0x480fc857, 0x805cb910, - 0x800c1840, 0x900c1581, 0x05000031, 0x64103000, - 0x64803800, 0x05fdff4e, 0x0500004f, 0x640c3000, + 0x64403800, 0x05fdffd7, 0x05000037, 0x800c19c0, + 0x05000033, 0x640c3000, 0x5008b800, 0x445c3800, + 0x485fc857, 0x480fc857, 0x800c1840, 0x05000028, + 0x64103000, 0x64403800, 0x05fdffca, 0x0500002a, + 0x640c3000, 0x805cb910, 0x445c3800, 0x485fc857, + 0x480fc857, 0x800c1840, 0x0500001d, 0x64103000, + 0x64403800, 0x05fdffbf, 0x0500001f, 0x640c3000, + 0x805cb910, 0x445c3800, 0x485fc857, 0x480fc857, + 0x800c1840, 0x05000012, 0x64103000, 0x64403800, + 0x05fdffb4, 0x05000014, 0x640c3000, 0x805cb910, + 0x445c3800, 0x485fc857, 0x480fc857, 0x800c1840, + 0x05000007, 0x64103000, 0x64403800, 0x05fdffa9, + 0x05000009, 0x80081000, 0x05fdf7d3, 0x64103000, + 0x65403800, 0x05fdffa3, 0x05000003, 0x90000541, + 0x4803c856, 0x5c00b800, 0x1c01f000, 0x4803c856, + 0x4c5c0000, 0x4c600000, 0x400c6000, 0x61c0303f, + 0x61c4383f, 0x64103000, 0x61a0b807, 0x805cb840, + 0x05000088, 0x501c0000, 0x4803c857, 0x8c00050c, + 0x05fe07fb, 0x8c10051c, 0x05000014, 0x640c3000, + 0x50180000, 0x4803c857, 0x501c0000, 0x4803c857, + 0x46003800, 0x000000a0, 0x64103000, 0x46003800, + 0x00000090, 0x05fdff83, 0x05000076, 0x640c3000, + 0x4807c857, 0x44043800, 0x64103000, 0x64403800, + 0x05fdff7c, 0x0500006f, 0x640c3000, 0x46003800, + 0x000000a1, 0x64103000, 0x46003800, 0x00000090, + 0x05fdff74, 0x05000067, 0x800c19c0, 0x05e409c4, + 0x4178b800, 0x900c1581, 0x05000040, 0x64103000, + 0x64803800, 0x05fdff5d, 0x0500005e, 0x640c3000, 0x501c0800, 0x4807c857, 0x9c0409c0, 0x8004bd57, 0x485fc857, 0x480fc857, 0x805cb910, 0x800c1840, - 0x900c1581, 0x05000022, 0x64103000, 0x64803800, - 0x05fdff3f, 0x05000040, 0x640c3000, 0x501c0800, + 0x900c1581, 0x05000031, 0x64103000, 0x64803800, + 0x05fdff4e, 0x0500004f, 0x640c3000, 0x501c0800, 0x4807c857, 0x9c0409c0, 0x8004bd57, 0x485fc857, 0x480fc857, 0x805cb910, 0x800c1840, 0x900c1581, - 0x05000013, 0x64103000, 0x64803800, 0x05fdff30, - 0x05000031, 0x640c3000, 0x501c0800, 0x4807c857, + 0x05000022, 0x64103000, 0x64803800, 0x05fdff3f, + 0x05000040, 0x640c3000, 0x501c0800, 0x4807c857, 0x9c0409c0, 0x8004bd57, 0x485fc857, 0x480fc857, - 0x445cc800, 0x8064c800, 0x4178b800, 0x800c1840, - 0x900c1581, 0x05000002, 0x05fdf7c2, 0x64103000, - 0x65a03800, 0x05fdff1e, 0x0500001f, 0x640c3000, - 0x501c0800, 0x4807c857, 0x82040d00, 0x000000ff, - 0x9c0409c0, 0x8004bd57, 0x4807c857, 0x485fc857, - 0x4863c857, 0x4867c857, 0x480fc857, 0x40301000, - 0x41780800, 0x60100000, 0x0511fd86, 0x4807c857, - 0x800409c0, 0x05000006, 0x60100000, 0x80000c81, - 0x805cb910, 0x80040840, 0x05fe07fe, 0x445cc800, - 0x485fc857, 0x4863c857, 0x4867c857, 0x90000541, - 0x4803c856, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x0501f805, 0x60058800, 0x05000002, 0x60018800, - 0x1c01f000, 0x60003020, 0x80183040, 0x05000010, - 0x0535f8ed, 0x05fc07fd, 0x05e5fec5, 0x605430f4, - 0x50183800, 0x821c0500, 0x00007000, 0x05000006, - 0x48035094, 0x821c0500, 0xffff8fff, 0x44003000, - 0x80000580, 0x64030000, 0x1c01f000, 0x4803c856, - 0x4a034408, 0x0000cccc, 0x90000541, 0x05fdf7fa, - 0x0535f8d9, 0x05fc07ff, 0x600008f4, 0x58040015, - 0x82000500, 0xffff8fff, 0x59a81094, 0x80080540, - 0x48000815, 0x64030000, 0x1c01f000, 0x59c400a4, - 0x4c580000, 0x4c500000, 0x4c540000, 0x9000050f, - 0x90000487, 0x05001008, 0x90006c87, 0x05e619f8, - 0x0c01f807, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x1c01f000, 0x0501f8e9, 0x05fdf7fb, 0x00103806, - 0x0010380c, 0x00103830, 0x0010384a, 0x001038ec, - 0x00103805, 0x1c01f000, 0x59c40806, 0x8c040500, - 0x05020003, 0x84040d40, 0x48078806, 0x1c01f000, - 0x59c40005, 0x8c000534, 0x0502069e, 0x4a038805, - 0xffffffff, 0x42006000, 0x00020000, 0x0501fe80, - 0x59a80015, 0x82000500, 0xfffffffa, 0x84000542, - 0x48035015, 0x497b521b, 0x42000800, 0x0010cc24, - 0x45780800, 0x497b5073, 0x42000000, 0x0010b10f, - 0x46000000, 0x0000ffff, 0x42006000, 0xffefffff, - 0x42006800, 0x40000000, 0x0501fe67, 0x59c40006, - 0x82000500, 0xffffff0f, 0x48038806, 0x60400800, - 0x42001000, 0x00103df8, 0x0511faed, 0x0501f001, - 0x42006000, 0xffffffff, 0x42006800, 0x00800000, - 0x0501fe59, 0x6120b001, 0x59c400a4, 0x9000050f, - 0x9000058a, 0x0500000d, 0x8058b040, 0x05fe07fb, - 0x497b5010, 0x42006000, 0xbf7fffff, 0x42006800, - 0x00018000, 0x0501fe4c, 0x42006000, 0xfffeffff, - 0x41786800, 0x0501f648, 0x497b5010, 0x64035072, - 0x80000580, 0x0501f651, 0x4a038805, 0xffffffff, - 0x59a80072, 0x90000c84, 0x05e619a1, 0x0c01f001, - 0x00103853, 0x00103879, 0x001038e5, 0x4803c856, - 0x59c400a3, 0x8400051e, 0x480388a3, 0x64075072, - 0x59c40008, 0x82000540, 0x00000280, 0x48038808, - 0x0501fe19, 0x42007800, 0x0010ac85, 0x4a007806, - 0x11010000, 0x4200a000, 0x0010b112, 0x4200a800, - 0x0010ac8c, 0x6008b000, 0x0531fffa, 0x59c40802, - 0x84040d0c, 0x48078802, 0x600c0800, 0x497b507c, - 0x0501fd0e, 0x6407507c, 0x497b5077, 0x0501fe31, - 0x42006000, 0xffffffff, 0x42006800, 0x00080000, - 0x0501fe19, 0x42006000, 0xfff7ffff, 0x41786800, - 0x0501f615, 0x59a80077, 0x497b5077, 0x80002540, - 0x0500005e, 0x59c40004, 0x90000503, 0x05020065, - 0x59a80815, 0x8c040502, 0x05000049, 0x9010058c, - 0x0502004c, 0x90100418, 0x8000b104, 0x41cc1000, - 0x42001800, 0x0010ac85, 0x50080800, 0x500c0000, - 0x80040580, 0x05020019, 0x80081000, 0x800c1800, - 0x8058b040, 0x05fe07f9, 0x0501fe0e, 0x59c80015, - 0x84000508, 0x48039015, 0x42006000, 0xffffffff, - 0x42006800, 0x00500000, 0x0501fdf3, 0x640b5072, - 0x640b5010, 0x05edfd91, 0x6140080f, 0x42001000, - 0x00103d56, 0x0511fbbb, 0x59a80015, 0x84000506, - 0x48035015, 0x0501f5d0, 0x59cc0806, 0x82040d80, - 0x11010000, 0x05020027, 0x59cc0800, 0x82040500, - 0x00ffffff, 0x05000018, 0x82000580, 0x000000ef, - 0x05020015, 0x59cc0801, 0x82040500, 0x00ffffff, - 0x82000580, 0x000000ef, 0x0502000f, 0x91cca407, - 0x4200a800, 0x0010b112, 0x6008b000, 0x50500800, - 0x50540000, 0x80040480, 0x05001007, 0x05020011, - 0x8050a000, 0x8054a800, 0x8058b040, 0x05fe07f8, - 0x0501f00c, 0x59a80015, 0x84000502, 0x48035015, - 0x59c80015, 0x84000508, 0x48039015, 0x41cca000, - 0x4200a800, 0x0010ac85, 0x6024b000, 0x0531ff91, - 0x0501fdd0, 0x42006000, 0xffffffff, 0x42006800, - 0x00080000, 0x0501fdb8, 0x42006000, 0xfff7ffff, - 0x41786800, 0x0501fdb4, 0x42006000, 0xffffffff, - 0x60006880, 0x0501fdb0, 0x59c40004, 0x90000503, - 0x05020004, 0x497b5077, 0x600c0800, 0x0501f497, - 0x1c01f000, 0x1c01f000, 0x59a80010, 0x90006d8f, - 0x05000003, 0x9000059b, 0x05020c62, 0x1c01f000, - 0x59a80015, 0x84000506, 0x48035015, 0x497b507c, - 0x59a80010, 0x90000c9e, 0x05e618fd, 0x0c01f001, - 0x00103923, 0x00103933, 0x00103955, 0x0010396f, - 0x0010398d, 0x00103990, 0x00103993, 0x00103996, - 0x00103999, 0x001039ad, 0x001039b0, 0x00103a04, - 0x00103a07, 0x00103a14, 0x00103a17, 0x00103a29, - 0x00103a2e, 0x00103a7d, 0x00103aa4, 0x00103b1c, - 0x00103b43, 0x00103b92, 0x00103bd8, 0x00103c26, - 0x00103c44, 0x00103c86, 0x00103ca4, 0x00103cb4, - 0x00103cb5, 0x4803c856, 0x601ed800, 0x0509f91a, - 0x05000006, 0x42006000, 0xffffffd7, 0x41786800, - 0x0501fd75, 0x0501f009, 0x59c40006, 0x82000500, - 0xffffff0f, 0x48038806, 0x4a038805, 0x000000f0, - 0x0509fc68, 0x0509f881, 0x1c01f000, 0x4803c856, - 0x42006000, 0xbf7fffff, 0x42006800, 0x00400000, - 0x0501fd65, 0x05edfd05, 0x64075010, 0x42001000, - 0x00103df8, 0x0511fa0c, 0x0501fcd3, 0x6140080f, - 0x42001000, 0x00103d56, 0x0511f32a, 0x59a80077, - 0x90000594, 0x0502001e, 0x4803c857, 0x42006000, - 0xffbfffff, 0x41786800, 0x0501fd53, 0x59c40004, - 0x90000503, 0x05020016, 0x42001000, 0x00103d56, - 0x0511f9e6, 0x59cc1006, 0x82081580, 0x11020000, - 0x05020010, 0x59cc1007, 0x8c08053e, 0x0500000a, - 0x59a80015, 0x8c000504, 0x05020007, 0x42000000, - 0x0010afa4, 0x0531fe48, 0x59a80015, 0x84000544, - 0x48035015, 0x64435010, 0x0501f0dc, 0x1c01f000, - 0x0501f3f8, 0x4803c856, 0x640f5010, 0x42006000, - 0xbf3fffff, 0x42006800, 0x00100000, 0x0501fd32, - 0x42001000, 0x00103df8, 0x0511f9db, 0x0501fca2, - 0x42001000, 0x00103d56, 0x0511f9c4, 0x59a8041b, - 0x90000528, 0x05000004, 0x42000800, 0xfffff815, - 0x05f1fe6e, 0x42007800, 0x0010ac8b, 0x46007800, - 0x11020000, 0x60140800, 0x0501f40c, 0x59a80077, - 0x80000540, 0x0500001a, 0x4803c857, 0x42001000, - 0x00103d56, 0x0511f9b1, 0x59a80077, 0x90000594, - 0x05020014, 0x59cc1006, 0x82081580, 0x11020000, - 0x05020010, 0x59cc1007, 0x8c08053e, 0x0500000a, - 0x59a80015, 0x8c000504, 0x05020007, 0x42000000, - 0x0010afa4, 0x0531fe10, 0x59a80015, 0x84000544, - 0x48035015, 0x64135010, 0x0501f003, 0x1c01f000, - 0x0501f3c0, 0x4803c856, 0x64175010, 0x0501f117, - 0x4c5c0000, 0x6004b800, 0x0501f0ed, 0x4803c856, - 0x641f5010, 0x0501f1b0, 0x4c5c0000, 0x6004b800, - 0x0501f186, 0x4803c856, 0x64275010, 0x91cca406, - 0x4200a800, 0x0010ac8b, 0x6014b000, 0x0531fec1, - 0x42007800, 0x0010ac8b, 0x46007800, 0x11050100, - 0x8d0c0506, 0x05000243, 0x60140800, 0x0501fbd3, - 0x4d3c0000, 0x60067800, 0x0529fa7e, 0x5c027800, - 0x1c01f000, 0x4c5c0000, 0x6004b800, 0x0501f1e5, - 0x4803c856, 0x642f5010, 0x42001000, 0x0010ac8c, - 0x4008a800, 0x6080b000, 0x4600a800, 0xffffffff, - 0x8054a800, 0x8058b040, 0x05fe07fc, 0x42007800, - 0x0010ac8b, 0x46007800, 0x11060000, 0x8d0c0506, - 0x05000005, 0x50080000, 0x46001000, 0x00ffffff, - 0x0501f03e, 0x42024800, 0x0010b111, 0x0531feef, - 0x40083000, 0x41782800, 0x41781800, 0x41782000, - 0x59240200, 0x8c000500, 0x05000012, 0x8c000502, - 0x05000010, 0x801429c0, 0x05020002, 0x800c1800, - 0x80142800, 0x59244408, 0x82204500, 0x000000ff, - 0x400c0000, 0x50182000, 0x0c01f810, 0x80102540, - 0x44103000, 0x800c19c0, 0x05020002, 0x80183000, - 0x91264c0b, 0x8058b040, 0x05fe07ea, 0x50080000, - 0x82000500, 0x00ffffff, 0x801428f0, 0x80140540, - 0x44001000, 0x0501f019, 0x001039ee, 0x001039f3, - 0x001039f8, 0x001039fd, 0x802000f0, 0x82102500, - 0x00ffffff, 0x800c1800, 0x1c01f000, 0x802000e0, - 0x82102500, 0xff00ffff, 0x800c1800, 0x1c01f000, - 0x802000d0, 0x82102500, 0xffff00ff, 0x800c1800, - 0x1c01f000, 0x40200000, 0x82102500, 0xffffff00, - 0x41781800, 0x1c01f000, 0x60840800, 0x0501f377, - 0x4c5c0000, 0x6004b800, 0x0501f222, 0x4803c856, - 0x64375010, 0x91cca406, 0x4200a800, 0x0010ac8b, - 0x6084b000, 0x0531fe53, 0x42007800, 0x0010ac8b, - 0x46007800, 0x11070000, 0x60840800, 0x0501f367, - 0x4c5c0000, 0x6004b800, 0x0501f272, 0x4803c856, - 0x90040d41, 0x0501fc81, 0x643f5010, 0x497b5077, - 0x42006000, 0xffffffff, 0x42006800, 0x00300000, - 0x0501fc6d, 0x42006000, 0xffdfffff, 0x41786800, - 0x0501fc69, 0x6140080f, 0x42001000, 0x00103d56, - 0x0511f0db, 0x4803c856, 0x59a80077, 0x80000540, - 0x05020320, 0x1c01f000, 0x4803c856, 0x64475010, - 0x91cca406, 0x4200a800, 0x0010ac8b, 0x6014b000, - 0x0531fe2c, 0x4200a800, 0x0010ac8b, 0x4600a800, - 0x11020000, 0x8d0c0506, 0x05020041, 0x59a80c1b, - 0x82040580, 0x0000ffff, 0x0500003d, 0x90040d30, - 0x05000005, 0x42000800, 0xfffff815, 0x05f1fd93, - 0x0501f037, 0x59cc0007, 0x8c00053c, 0x05000034, - 0x42024800, 0x0010b111, 0x0531fe6c, 0x59240200, - 0xb0000d23, 0xb0040da3, 0x05020021, 0x59240a08, - 0x42001000, 0x0010ac8c, 0x0501fab5, 0x05000009, - 0x59240c08, 0x05edfbef, 0x59240200, 0x84000502, - 0x84000518, 0x84000544, 0x48024a00, 0x0501f014, - 0x59240200, 0x82000540, 0x00001006, 0x84000506, - 0x48024a00, 0x48064a08, 0x82042c00, 0x00102013, - 0x50142800, 0x82142d00, 0x000000ff, 0x48164c08, - 0x59240005, 0x82000500, 0x00ffff00, 0x80140d40, - 0x48064805, 0x40140800, 0x05edfbca, 0x91264c0b, - 0x8058b040, 0x05fe07da, 0x42024800, 0x0010b111, - 0x59242a00, 0x8c140502, 0x05000005, 0x8c140500, - 0x05000003, 0x59242c08, 0x4817500f, 0x60140800, - 0x0501f2fe, 0x4c5c0000, 0x4178b800, 0x59a80077, - 0x80000540, 0x05000021, 0x4803c857, 0x42001000, - 0x00103d56, 0x0511f8a1, 0x59a80077, 0x90000594, - 0x05020019, 0x59cc1006, 0x82081580, 0x11030000, - 0x05020015, 0x59cc1007, 0x8c08053e, 0x0500000a, - 0x59a80015, 0x8c000504, 0x05020007, 0x42000000, - 0x0010afa4, 0x0531fd00, 0x59a80015, 0x84000544, - 0x48035015, 0x805cb9c0, 0x05000004, 0x641b5010, - 0x05fdfef7, 0x0501f005, 0x644b5010, 0x0501f805, - 0x0501f002, 0x0501faab, 0x5c00b800, 0x1c01f000, - 0x4803c856, 0x644f5010, 0x91cca407, 0x4200a800, - 0x0010ac8c, 0x6010b000, 0x0531fdb6, 0x4200a800, - 0x0010ac8b, 0x4600a800, 0x11030000, 0x8d0c0506, - 0x0502006a, 0x42024800, 0x0010b111, 0x0531fe03, - 0x4c600000, 0x4178c000, 0x59a8021b, 0x82000500, - 0xfffffffc, 0x4803521b, 0x59240200, 0x40000800, - 0x82040d00, 0xfffffb17, 0x48064a00, 0x8c000500, - 0x05000048, 0x8c000518, 0x05020046, 0x8c000502, - 0x05020004, 0x59240400, 0x8c000502, 0x05000041, - 0x59240a08, 0x42001000, 0x0010ac8c, 0x0501fa3c, - 0x0500002b, 0x59240005, 0x82000500, 0x00ffff00, - 0x48024805, 0x59240200, 0x8c000502, 0x05000019, - 0x59240207, 0x82000500, 0x0000ffff, 0x05000015, - 0x8060c000, 0x59240c08, 0x05edfb6a, 0x4c640000, - 0x4c580000, 0x4d2c0000, 0x5924c809, 0x6040b000, - 0x50640000, 0x800001c0, 0x05000004, 0x4578c800, - 0x40025800, 0x05e5faa7, 0x8064c800, 0x8058b040, - 0x05fe07f8, 0x5c025800, 0x5c00b000, 0x5c00c800, - 0x59240200, 0x84000502, 0x84000544, 0x48024a00, - 0x59240400, 0x8c000504, 0x05000016, 0x59240200, - 0x84000546, 0x48024a00, 0x0501f012, 0x59240200, - 0x90000546, 0x84000506, 0x48024a00, 0x82042c00, - 0x00102013, 0x50142800, 0x82142d00, 0x000000ff, - 0x48164c08, 0x59240005, 0x82000500, 0x00ffff00, - 0x80140d40, 0x48064805, 0x40140800, 0x05edfb31, - 0x59240200, 0x84000518, 0x48024a00, 0x91264c0b, - 0x8058b040, 0x05fe07ad, 0x8060c1c0, 0x05020b0b, - 0x5c00c000, 0x42024800, 0x0010b111, 0x59242a00, - 0x8c140502, 0x05000005, 0x8c140500, 0x05000003, - 0x59242c08, 0x4817500f, 0x60140800, 0x0501f25f, - 0x4c5c0000, 0x4178b800, 0x59a80077, 0x80000540, - 0x05000021, 0x4803c857, 0x42001000, 0x00103d56, - 0x0511f802, 0x59a80077, 0x90000594, 0x05020019, - 0x59cc1006, 0x82081580, 0x11040000, 0x05020015, - 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, - 0x8c000504, 0x05020007, 0x42000000, 0x0010afa4, - 0x0531fc61, 0x59a80015, 0x84000544, 0x48035015, - 0x805cb9c0, 0x05000004, 0x64235010, 0x05fdfe5e, - 0x0501f005, 0x64535010, 0x0501f805, 0x0501f002, - 0x0501fa0c, 0x5c00b800, 0x1c01f000, 0x4803c856, - 0x64575010, 0x91cca407, 0x4200a800, 0x0010ac8c, - 0x6010b000, 0x0531fd17, 0x4200a800, 0x0010ac8b, - 0x4600a800, 0x11040000, 0x8d0c0506, 0x05020041, - 0x42024800, 0x0010b111, 0x0531fd64, 0x59240400, - 0x8c000500, 0x0500002f, 0x59240200, 0x8c000500, - 0x0500002c, 0x8c000502, 0x0502002a, 0x59240c00, - 0x80040910, 0x82040d00, 0x000000ff, 0x42001000, - 0x0010ac8c, 0x0501f9a6, 0x05000010, 0x59240005, - 0x82000500, 0x00ffff00, 0x48024805, 0x59240200, - 0x84000502, 0x48024a00, 0x59242400, 0x8c100504, - 0x05000018, 0x84000546, 0x84000544, 0x48024a00, - 0x8060c000, 0x0501f013, 0x59240200, 0x90000546, - 0x84000506, 0x48024a00, 0x48064a08, 0x82042c00, - 0x00102013, 0x50142800, 0x82142d00, 0x000000ff, - 0x48164c08, 0x59240005, 0x82000500, 0x00ffff00, - 0x80140d40, 0x48064805, 0x40140800, 0x05edfab5, - 0x91264c0b, 0x8058b040, 0x05fe07cd, 0x42024800, - 0x0010b111, 0x59242a00, 0x8c140502, 0x05000005, - 0x8c140500, 0x05000003, 0x59242c08, 0x4817500f, - 0x60140800, 0x0501f1e9, 0x4c5c0000, 0x4178b800, - 0x59a80077, 0x80000540, 0x05000040, 0x4803c857, - 0x42001000, 0x00103d56, 0x050dff8c, 0x59a80077, - 0x90000594, 0x05020038, 0x59cc1006, 0x82080500, - 0x11050000, 0x82000580, 0x11050000, 0x05020032, - 0x8c080510, 0x05000013, 0x0501faf4, 0x59cc1007, - 0x8c08053e, 0x0500000a, 0x59a80015, 0x8c000504, - 0x05020007, 0x42000000, 0x0010afa4, 0x0531fbe6, - 0x59a80015, 0x84000544, 0x48035015, 0x805cb9c0, - 0x05000014, 0x642b5010, 0x05fdfdfa, 0x0501f01f, - 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, - 0x8c000504, 0x05020007, 0x42000000, 0x0010afa4, - 0x0531fbd5, 0x59a80015, 0x84000544, 0x48035015, - 0x90000541, 0x0501fad5, 0x497b5073, 0x0501f002, - 0x64075073, 0x59cc1007, 0x8c08053c, 0x05000002, - 0x6423521b, 0x805cb9c0, 0x05020004, 0x645b5010, - 0x0501f808, 0x0501f005, 0x643b5010, 0x05fdfe44, - 0x0501f002, 0x0501f977, 0x5c00b800, 0x1c01f000, - 0x4803c856, 0x91cca406, 0x4200a800, 0x0010ac8b, - 0x6014b000, 0x0531fc83, 0x645f5010, 0x59a80073, - 0x8c000500, 0x05000006, 0x42001000, 0x0010ac8b, - 0x46001000, 0x11050100, 0x0501f002, 0x646f5010, - 0x42024800, 0x0010b111, 0x0531fccc, 0x599c2817, - 0x59240200, 0x8c000500, 0x05000025, 0x8c000502, - 0x05020023, 0x8c000506, 0x05020021, 0x4c580000, - 0x0501f8c2, 0x5c00b000, 0x0502000b, 0x59240005, - 0x82000500, 0x00ffff00, 0x48024805, 0x59240200, - 0x84000502, 0x84000546, 0x84000544, 0x48024a00, - 0x0501f013, 0x59240200, 0x90000546, 0x84000506, - 0x48024a00, 0x48064a08, 0x82042c00, 0x00102013, - 0x50142800, 0x82142d00, 0x000000ff, 0x48164c08, - 0x59240005, 0x82000500, 0x00ffff00, 0x80140d40, - 0x48064805, 0x40140800, 0x05edfa26, 0x91264c0b, - 0x8058b040, 0x05fe07d7, 0x42024800, 0x0010b111, - 0x59242a00, 0x8c140502, 0x05000005, 0x8c140500, - 0x05000003, 0x59242c08, 0x4817500f, 0x60140800, - 0x0501f95a, 0x4d3c0000, 0x60067800, 0x0529f805, - 0x5c027800, 0x1c01f000, 0x4c5c0000, 0x4178b800, - 0x59a80077, 0x80000540, 0x05000018, 0x4803c857, - 0x42001000, 0x00103d56, 0x050dfef8, 0x59a80077, - 0x82000580, 0x00000084, 0x0502000f, 0x59cc1006, - 0x82081580, 0x11060000, 0x0502000b, 0x80000580, - 0x0501fa62, 0x805cb9c0, 0x05000004, 0x64335010, - 0x05fdfdcb, 0x0501f005, 0x64635010, 0x0501f805, - 0x0501f002, 0x0501f90b, 0x5c00b800, 0x1c01f000, - 0x4803c856, 0x64675010, 0x91cca406, 0x4200a800, - 0x0010ac8b, 0x6084b000, 0x0531fc16, 0x42003800, - 0x0010ac8c, 0x42024800, 0x0010b111, 0x4200b000, - 0x0010b110, 0x5058b000, 0x59240200, 0x8c000500, - 0x05000019, 0x8c000502, 0x05000017, 0x401c2800, - 0x50141000, 0x80080130, 0x80000000, 0x40001800, - 0x82081500, 0x00ffffff, 0x800000f0, 0x80080540, - 0x44002800, 0x59244408, 0x82204500, 0x000000ff, - 0x400c1000, 0x80081104, 0x82083400, 0x0010ac8c, - 0x50181000, 0x900c0503, 0x0c01f808, 0x80081540, - 0x44083000, 0x91264c0b, 0x8058b040, 0x05fe07e3, - 0x60840800, 0x0501f109, 0x00103c76, 0x00103c7a, - 0x00103c7e, 0x00103c82, 0x802000f0, 0x82081500, - 0x00ffffff, 0x1c01f000, 0x802000e0, 0x82081500, - 0xff00ffff, 0x1c01f000, 0x802000d0, 0x82081500, - 0xffff00ff, 0x1c01f000, 0x40200000, 0x82081500, - 0xffffff00, 0x1c01f000, 0x4c5c0000, 0x4178b800, - 0x59a80077, 0x80000540, 0x05000018, 0x4803c857, - 0x42001000, 0x00103d56, 0x050dfe98, 0x59a80077, - 0x82000580, 0x00000084, 0x0502000f, 0x59cc1006, - 0x82081580, 0x11070000, 0x0502000b, 0x64075073, - 0x0501f897, 0x805cb9c0, 0x05000004, 0x643b5010, - 0x05fdfd7b, 0x0501f005, 0x646b5010, 0x0501f805, - 0x0501f002, 0x0501f8ab, 0x5c00b800, 0x1c01f000, - 0x90000541, 0x0501f9f5, 0x646f5010, 0x91cca406, - 0x4200a800, 0x0010ac8b, 0x59a82077, 0x40100000, - 0x8000b104, 0x40580800, 0x5450a800, 0x8050a000, - 0x8054a800, 0x8058b040, 0x05fe07fc, 0x0501f0c7, - 0x1c01f000, 0x1c01f000, 0x4803c856, 0x60103000, - 0x42004000, 0x0010ac8c, 0x599c2817, 0x8c140514, - 0x0502001c, 0x600c1000, 0x40200000, 0x80080400, - 0x50000800, 0x82042580, 0xffffffff, 0x05020005, - 0x80081040, 0x80183040, 0x05fe07f8, 0x0501f03f, - 0x800811c0, 0x05020006, 0x82042580, 0x3fffffff, - 0x05000039, 0x82040d40, 0xc0000000, 0x6080b000, - 0x60041800, 0x40042000, 0x80102102, 0x0502101f, - 0x800c18c2, 0x8058b040, 0x05fe07fc, 0x0501f02e, - 0x41781000, 0x40200000, 0x80080400, 0x50000800, - 0x82042580, 0xffffffff, 0x05020005, 0x80081000, - 0x80183040, 0x05fe07f8, 0x0501f023, 0x800811c0, - 0x05020003, 0x82040d40, 0xc0000000, 0x6004b000, - 0x42001800, 0x80000000, 0x40042000, 0x801020c2, - 0x05021006, 0x800c1902, 0x8058b000, 0x905804a1, - 0x05fc17fb, 0x0501f014, 0x40200000, 0x80082400, - 0x50100000, 0x800c0540, 0x44002000, 0x59a80015, - 0x84000540, 0x48035015, 0x40580000, 0x60802800, - 0x80142c80, 0x40080000, 0x600c3800, 0x801c0480, - 0x800000ca, 0x80142d40, 0x40140800, 0x90000541, - 0x0501f002, 0x80000580, 0x1c01f000, 0x4807c857, - 0x480bc857, 0x40041800, 0x41782000, 0x600c0000, - 0x900c1ca0, 0x05001004, 0x80102000, 0x80000040, - 0x05fdf7fc, 0x40041800, 0x801021c0, 0x05000004, - 0x900c1ca0, 0x80102040, 0x05fe07fe, 0x60042000, - 0x800c19c0, 0x05000004, 0x801020c2, 0x800c1840, - 0x05fe07fe, 0x80083c00, 0x401c2800, 0x50140000, - 0x80102d00, 0x05020007, 0x80100540, 0x44003800, - 0x59a80015, 0x84000540, 0x48035015, 0x80000580, - 0x1c01f000, 0x4807c856, 0x605c1100, 0x59a81836, - 0x0531fa73, 0x05f9ffd5, 0x1c01f000, 0x4807c856, - 0x6080b000, 0x91cca407, 0x4200a800, 0x0010cc24, - 0x0531f367, 0x4807c856, 0x0511fd9b, 0x61dc0801, - 0x0501f8d5, 0x497b2804, 0x497b2805, 0x497b2826, - 0x497b2827, 0x6006d800, 0x42006000, 0xbe7fffff, - 0x42006800, 0x00018000, 0x0501f94b, 0x42006000, - 0xfffeffff, 0x41786800, 0x0501f947, 0x497b5036, - 0x60b40800, 0x42001000, 0x00103dce, 0x050df5b8, - 0x4807c856, 0x05fdffe8, 0x497b5010, 0x497b5077, - 0x1c01f000, 0x4807c856, 0x42006000, 0xffffffff, - 0x60a06800, 0x0501f138, 0x4807c856, 0x05fdffd2, - 0x0511fa25, 0x4df00000, 0x0511fcba, 0x5c03e000, - 0x05100a0d, 0x59c400a4, 0x9000050f, 0x90000582, - 0x0502000a, 0x42006000, 0xffffffff, 0x42006800, - 0x00200000, 0x0501f928, 0x42006000, 0xffdfffff, - 0x41786800, 0x0501f924, 0x497b5010, 0x61dc0801, - 0x0501f8a1, 0x59c400a3, 0x82000500, 0xbf20bfff, - 0x82000540, 0x0001c000, 0x480388a3, 0x84000520, - 0x480388a3, 0x497b5036, 0x60b40800, 0x42001000, - 0x00103dce, 0x050df58a, 0x497b5077, 0x59b400f5, - 0x8c000500, 0x05020003, 0x90000541, 0x480368f5, - 0x800400c4, 0x82000400, 0x00002000, 0x4803910a, - 0x59b400f6, 0x90000518, 0x05fe07fe, 0x4a0368f0, - 0x0010ac84, 0x42000000, 0x0010ac8b, 0x4c040000, - 0x40043800, 0x50000800, 0x82040d80, 0x11010000, - 0x0500000c, 0x50000800, 0x4807c857, 0x8d0c052a, - 0x05000008, 0x4c000000, 0x821c3d40, 0x0000dc00, - 0x42000000, 0x0010ac85, 0x05e1fd62, 0x5c000000, - 0x5c000800, 0x480368f1, 0x82040400, 0x0000dc00, - 0x480368f3, 0x59c400a4, 0x9000050f, 0x90000588, - 0x05020013, 0x4c5c0000, 0x4c600000, 0x59c4b805, - 0x8c5c053a, 0x05020004, 0x42000000, 0x0010afa1, - 0x0531f9e9, 0x4a038805, 0x20000000, 0x05edfc41, - 0x4000c000, 0x05edfb87, 0x6006d800, 0x497b5010, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x59c8010b, - 0x8c000502, 0x05fc07e8, 0x59c408a4, 0x90040d0f, - 0x90040d8b, 0x05020005, 0x59a80810, 0x82040d40, - 0x00002000, 0x0501f004, 0x59a80872, 0x82040d40, - 0x00001000, 0x48075036, 0x59a8087c, 0x800409c0, - 0x05020005, 0x6140080f, 0x42001000, 0x00103d56, - 0x050dfe90, 0x1c01f000, 0x4807c856, 0x05fdff5a, - 0x0511f9ad, 0x4df00000, 0x0511fc42, 0x5c03e000, - 0x05100995, 0x59c400a4, 0x9000050f, 0x90000582, - 0x0502000a, 0x42006000, 0xffffffff, 0x42006800, - 0x00200000, 0x0501f8b0, 0x42006000, 0xffdfffff, - 0x41786800, 0x0501f8ac, 0x0505fc56, 0x05000010, - 0x0505fc6a, 0x0502000e, 0x4a035013, 0x0000aaaa, - 0x4c040000, 0x05edf88b, 0x59a8001f, 0x82000500, - 0xffff0000, 0x80040540, 0x4803501f, 0x5c000800, - 0x64035014, 0x0505fbba, 0x0501f005, 0x64175075, - 0x60000001, 0x05e9ffde, 0x05fdff3f, 0x1c01f000, - 0x0501f809, 0x42006000, 0xbf7f7fff, 0x41786800, - 0x0501f091, 0x42006000, 0xbf7f7fff, 0x41786800, - 0x0501f08d, 0x0505fc4d, 0x05020009, 0x59c40006, - 0x82000540, 0x000000f0, 0x48038806, 0x42006000, - 0xbfffffff, 0x41786800, 0x0501f883, 0x1c01f000, - 0x40680800, 0x800408d0, 0x59a80015, 0x8c000506, - 0x05000006, 0x59a8000f, 0x82000500, 0x000000ff, - 0x80040540, 0x0501f003, 0x82040540, 0x000000f7, - 0x480388a7, 0x1c01f000, 0x4807c856, 0x42000000, - 0x0010b039, 0x0531f978, 0x60143000, 0x4d3c0000, - 0x4c180000, 0x60343000, 0x600a7800, 0x0501f037, - 0x4807c856, 0x42000000, 0x0010b05e, 0x0531f96e, - 0x60003000, 0x4d3c0000, 0x4c180000, 0x603c3000, - 0x61fc19ff, 0x601c2000, 0x05f9ff46, 0x5c003000, - 0x59240200, 0x84000556, 0x48024a00, 0x4d400000, - 0x60aa8000, 0x59240400, 0x8c00050a, 0x052c0a6a, - 0x600a7800, 0x05f1f93a, 0x5c028000, 0x5c027800, - 0x0005f45a, 0x4807c856, 0x42000000, 0x0010b05c, - 0x0531f955, 0x600c3000, 0x4d3c0000, 0x4c180000, - 0x60383000, 0x600a7804, 0x0501f014, 0x4807c856, - 0x42000000, 0x0010b05b, 0x0531f94b, 0x60103000, - 0x4d3c0000, 0x4c180000, 0x60403000, 0x600a7804, - 0x0501f00a, 0x4807c856, 0x42000000, 0x0010afa3, - 0x0531f941, 0x60043000, 0x4d3c0000, 0x4c180000, - 0x60303000, 0x600a7800, 0x61fc19ff, 0x601c2000, - 0x4d200000, 0x417a4000, 0x05f9ff16, 0x5c024000, - 0x5c003000, 0x4d400000, 0x052dff9d, 0x60aa8000, - 0x0201f800, 0x0010ebe6, 0x4c580000, 0x0531fa4f, - 0x42000800, 0x0010b111, 0x58040005, 0x82000500, - 0x000000ff, 0x48000805, 0x90040c0b, 0x8058b040, - 0x05fe07fa, 0x5c00b000, 0x5c028000, 0x5c027800, - 0x1c01f000, 0x4807c856, 0x05011000, 0x4a03c840, - 0x0010ac84, 0x6503c842, 0x40000000, 0x05fd17ff, - 0x42007800, 0x0010ac84, 0x64447800, 0x803c7800, - 0x4a007800, 0x220000ef, 0x4a007801, 0x000000ef, - 0x4a007802, 0x01380000, 0x64007803, 0x4a007804, - 0xffffffff, 0x64007805, 0x1c01f000, 0x40686000, - 0x406c6800, 0x59c400a3, 0x80300500, 0x80340540, - 0x480388a3, 0x1c01f000, 0x40686000, 0x4833c857, - 0x59c400a3, 0x80300540, 0x480388a3, 0x80300580, - 0x480388a3, 0x1c01f000, 0x4803c856, 0x05000003, - 0x6407507d, 0x0501f002, 0x497b507d, 0x1c01f000, - 0x59c80002, 0x80000540, 0x05000009, 0x80000040, - 0x05000007, 0x4a039005, 0x00000140, 0x60180000, - 0x80000040, 0x05fe07ff, 0x05fdf7f6, 0x1c01f000, - 0x4c5c0000, 0x4c600000, 0x59c4b805, 0x485fc856, - 0x8c5c053a, 0x05020004, 0x42000000, 0x0010afa1, - 0x0531f8e1, 0x4a038805, 0x20000000, 0x05edfb39, - 0x4000c000, 0x05edfa7f, 0x4a038805, 0x04000000, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x497a6a00, - 0x0501fab4, 0x4a026c00, 0x00000707, 0x497a6801, - 0x497a6808, 0x497a6809, 0x497a6806, 0x497a6807, - 0x497a6c0b, 0x497a680c, 0x59240400, 0x8c00050a, - 0x05000005, 0x5934080f, 0x59340010, 0x80040540, - 0x05e20b1f, 0x4a026a04, 0x00000100, 0x497a6a03, - 0x59340402, 0x82000500, 0x000000ff, 0x48026c02, - 0x497a6c04, 0x497a6a05, 0x497a6c05, 0x497a6811, - 0x4d2c0000, 0x5934000d, 0x49466c03, 0x80025d40, - 0x05000003, 0x05e1feb4, 0x497a680d, 0x5c025800, - 0x599c0401, 0x48026a0b, 0x599c0208, 0x48026c12, - 0x4a02680a, 0x00008000, 0x0505f032, 0x60140000, - 0x80000d80, 0x0501f024, 0x0501fdd4, 0x05020013, - 0x59a8021b, 0x8c00050a, 0x0502000d, 0x59340212, - 0x82000500, 0x0000ff00, 0x4803c857, 0x05000008, - 0x59340a00, 0x8c04051e, 0x000002ad, 0x60a40000, - 0x60000820, 0x492fc857, 0x0501f013, 0x492fc857, - 0x60a00000, 0x0501f00e, 0x8d0c0502, 0x05020003, - 0x8d0c0500, 0x05000003, 0x60100000, 0x0501f008, - 0x60a40000, 0x59340a00, 0x8c04051e, 0x05000004, - 0x492fc857, 0x60000820, 0x0501f003, 0x492fc857, - 0x80000d80, 0x4803c857, 0x80028540, 0x1c01f000, - 0x490fc857, 0x8d0c0500, 0x05fe07f0, 0x0501fd84, - 0x05fe07ea, 0x59340200, 0x8c00050e, 0x05fc07e7, - 0x0001f2ad, 0x4d480000, 0x4d4c0000, 0x592e9009, - 0x592e980a, 0x0501fc52, 0x5c029800, 0x5c029000, - 0x05fc07c7, 0x0001f2b0, 0x492fc857, 0x592e8c07, - 0x83440d80, 0x000007fc, 0x05000004, 0x83440480, - 0x000007f0, 0x05021016, 0x592e4408, 0x0509fb61, - 0x05000dc4, 0x05020012, 0x0501fd7a, 0x05020012, - 0x0515fe11, 0x05000019, 0x83200400, 0x0010a0ec, - 0x50024800, 0x4926601d, 0x59340002, 0x4802600b, - 0x4936600a, 0x492e6009, 0x642a6407, 0x61027000, - 0x0005fc78, 0x80000580, 0x0501f00b, 0x60a00000, - 0x0501f008, 0x0501fd7d, 0x05fc07fd, 0x910c0d03, - 0x05000003, 0x60100000, 0x0501f002, 0x60a40000, - 0x80000540, 0x1c01f000, 0x60b00000, 0x05fdf7fd, - 0x492fc857, 0x592e4408, 0x4923c857, 0x0509fb3d, - 0x592c4208, 0x0500000a, 0x60380000, 0x59240a00, - 0x8c040500, 0x05000160, 0x90200d0f, 0x90040d88, - 0x0502015d, 0x90200d30, 0x0500015b, 0x592e8c07, - 0x4947c857, 0x83440c80, 0x00000800, 0x60280000, - 0x05021155, 0x4823c857, 0x9020050f, 0x0c01f001, - 0x00103f7b, 0x00103ff2, 0x00104035, 0x0010403d, - 0x00104045, 0x00103f78, 0x00103f78, 0x00103f78, - 0x0010404f, 0x0010409c, 0x001040b8, 0x00103f78, - 0x00103f78, 0x00103f78, 0x00103f78, 0x00103f78, - 0x4803c857, 0x60300000, 0x0501f13f, 0x592c1009, - 0x82081500, 0x00ffffff, 0x59240005, 0x80084d80, - 0x60400000, 0x05000138, 0x0501fca7, 0x0500002d, - 0x4803c857, 0x90004d9d, 0x05020016, 0x0005f8e2, - 0x59340405, 0x4c000000, 0x0501fd11, 0x5c000000, - 0x05000004, 0x8c20050a, 0x05000022, 0x80000580, - 0x44002800, 0x59340008, 0x48002802, 0x59340009, - 0x48002801, 0x59340006, 0x48002804, 0x59340007, - 0x48002803, 0x6014b000, 0x0525f9c6, 0x0501f141, - 0x4803c857, 0x90004d9a, 0x05020003, 0x40101000, - 0x0501f11e, 0x4803c857, 0x90004d9b, 0x05020003, - 0x40181000, 0x0501f119, 0x4803c857, 0x90004d9f, - 0x0500011a, 0x90004d9c, 0x05000118, 0x90004d99, - 0x60280000, 0x0500010c, 0x60280000, 0x0502011d, - 0x59a8008d, 0x8c000502, 0x05000016, 0x0501fce8, - 0x05000014, 0x59340212, 0x82000500, 0x0000ff00, - 0x60401000, 0x0502000b, 0x60201000, 0x59a8021b, - 0x8c000506, 0x05020008, 0x59340002, 0x82000500, - 0x00ff0000, 0x82000580, 0x00ff0000, 0x05000005, - 0x0501ff59, 0x60700000, 0x40181000, 0x050200f7, - 0x0515fd7d, 0x050000ff, 0x82200500, 0x00000100, - 0x0501fc79, 0x4926601d, 0x4936600a, 0x0521ff12, - 0x492e6009, 0x64066407, 0x8c20050a, 0x05000004, - 0x592c0405, 0x8400055c, 0x48025c05, 0x4c200000, - 0x4d3c0000, 0x60027830, 0x0201f800, 0x0010ec6c, - 0x5c027800, 0x5c004000, 0x8c200512, 0x0500000b, - 0x599c0018, 0x8c000518, 0x05000008, 0x592c000a, - 0x82000500, 0x00000380, 0x5934080a, 0x80040d40, - 0x84040d54, 0x4806680a, 0x417a7800, 0x0501f8f5, - 0x600c0800, 0x0501f8fe, 0x600a7000, 0x0005fc78, - 0x80000580, 0x0501f0ee, 0x0501fd02, 0x050200d9, - 0x0501fcad, 0x05000009, 0x0501fca5, 0x050200d9, - 0x4c600000, 0x4178c000, 0x60027830, 0x417a6000, - 0x05edfcf9, 0x5c00c000, 0x59a8008d, 0x8c000502, - 0x05000016, 0x0501fc9a, 0x05000014, 0x59340212, - 0x82000500, 0x0000ff00, 0x60401000, 0x0502000b, - 0x60201000, 0x59a8021b, 0x8c000506, 0x05020008, - 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, - 0x00ff0000, 0x05000005, 0x0501ff0b, 0x60700000, - 0x40181000, 0x050200a9, 0x0515fd2f, 0x050000b1, - 0x5934080a, 0x8c200512, 0x0500000c, 0x599c0018, - 0x8c000518, 0x05000009, 0x592c000a, 0x82000500, - 0x00000380, 0x82041500, 0xfffffc7f, 0x80080d40, - 0x84040d54, 0x0501f002, 0x84040d14, 0x4806680a, - 0x4926601d, 0x4936600a, 0x0521feb7, 0x492e6009, - 0x64066407, 0x417a7800, 0x0501f8b2, 0x60140800, - 0x0501f8bb, 0x600e7000, 0x0005fc78, 0x80000580, - 0x0501f0ab, 0x0501fcbf, 0x05020096, 0x0501fc7e, - 0x05020098, 0x0525f861, 0x0500008e, 0x80000580, - 0x0501f0a3, 0x0501fcb7, 0x0502008e, 0x0501fc76, - 0x05020090, 0x0521fb78, 0x05000086, 0x80000580, - 0x0501f09b, 0x0501fcaf, 0x05020086, 0x83444d80, - 0x000007fe, 0x60280000, 0x0502006f, 0x0525f863, - 0x0500007c, 0x80000580, 0x0501f091, 0xb0200530, - 0x05020004, 0x8c20050e, 0x60300000, 0x05020066, - 0x8c20050a, 0x0500000c, 0x4d3c0000, 0x600278a0, - 0x8c20050e, 0x05020003, 0x853e7d56, 0x853e7d1c, - 0x82200500, 0x000004a0, 0x0501fc0a, 0x5c027800, - 0x0501f07c, 0x8c200508, 0x0502001e, 0x592c1009, - 0x82081500, 0x00ffffff, 0x59240005, 0x80084d80, - 0x60400000, 0x05000050, 0x0501fbbf, 0x05000024, - 0x4803c857, 0x90004d9a, 0x05020003, 0x40101000, - 0x0501f04e, 0x4803c857, 0x90004d9b, 0x05020003, - 0x40181000, 0x0501f049, 0x4803c857, 0x90004d9f, - 0x0500004a, 0x90004d9c, 0x05000048, 0x90004d99, - 0x60280000, 0x0500003c, 0x60280000, 0x0501f04d, - 0x0501fc74, 0x0502004b, 0x4d3c0000, 0x600278a0, - 0x8c20050e, 0x05020003, 0x853e7d56, 0x853e7d1c, - 0x82200500, 0x00000090, 0x0501fbc9, 0x5c027800, - 0x60280000, 0x0502002c, 0x0501f04e, 0x916c0583, - 0x601c0800, 0x05020005, 0x0521ffc0, 0x05000006, - 0x80000580, 0x0501f04a, 0x0501fc43, 0x05000042, - 0x0501f044, 0x0501fc40, 0x0500002e, 0x0501f041, - 0x0501fc58, 0x0502002f, 0x916c0583, 0x05020036, - 0x8c200508, 0x05000008, 0x4c600000, 0x4178c000, - 0x60027830, 0x417a6000, 0x05edfc4f, 0x5c00c000, - 0x0501f034, 0x0501fbf8, 0x05000009, 0x0501fbf0, - 0x05020024, 0x4c600000, 0x4178c000, 0x60027830, - 0x417a6000, 0x05edfc44, 0x5c00c000, 0x480bc856, - 0x0521fe3f, 0x05000013, 0x80000580, 0x0501f028, - 0x05fdf7e4, 0x480bc857, 0x60640800, 0x40001000, - 0x6008b000, 0x0501f008, 0x480bc857, 0x40000800, - 0x6008b000, 0x0501f004, 0x480bc857, 0x40000800, - 0x6004b000, 0x480bc857, 0x60c68000, 0x0501f017, - 0x480bc857, 0x600c0800, 0x6004b000, 0x05fdf7fa, - 0x480bc857, 0x60280800, 0x6004b000, 0x05fdf7f6, - 0x480bc857, 0x60240800, 0x40001000, 0x6008b000, - 0x05fdf7f1, 0x480bc857, 0x601c0800, 0x6004b000, - 0x05fdf7ed, 0x480bc857, 0x6004b000, 0x05fdf7ea, - 0x80028580, 0x4178b000, 0x90000541, 0x1c01f000, - 0x4937c857, 0x5932680a, 0x59341200, 0x813e79c0, - 0x05000003, 0x84081540, 0x0501f002, 0x84081500, - 0x480a6a00, 0x1c01f000, 0x40680800, 0x5932680a, - 0x5c000000, 0x4c000000, 0x4803c857, 0x4937c857, - 0x90040586, 0x05020003, 0x6018000c, 0x0501f014, - 0x90040584, 0x05020003, 0x60100008, 0x0501f010, - 0x90040587, 0x601c000e, 0x0500000d, 0x90040583, - 0x600c000e, 0x0500000a, 0x90040585, 0x60140008, - 0x05000007, 0x90040589, 0x60240008, 0x05000004, - 0x9004058b, 0x602c000e, 0x05e208e9, 0x4803c857, - 0x48026c00, 0x90040d86, 0x05020004, 0x59341404, - 0x800811c0, 0x05e008e2, 0x1c01f000, 0x40683000, - 0x0501f805, 0x41358800, 0x05000002, 0x41798800, - 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, - 0x4947c857, 0x481bc857, 0x83440480, 0x00000800, - 0x05021055, 0x83200400, 0x0010a0ec, 0x50024800, - 0x59240009, 0x83441480, 0x000007f0, 0x05001003, - 0x80081400, 0x0501f003, 0x83441400, 0x0010a380, - 0x50080000, 0x80026d40, 0x05000005, 0x59340013, - 0x80000130, 0x81200580, 0x05000016, 0x4c180000, - 0x4d2c0000, 0x05e1fc38, 0x412e6800, 0x5c025800, - 0x5c003000, 0x0500003c, 0x59242005, 0x812000f0, - 0x80102540, 0x48126813, 0x59242207, 0x80102000, - 0x48124a07, 0x45341000, 0x497a680d, 0x497a6810, - 0x497a680f, 0x4c180000, 0x05fdfd7d, 0x5c003000, - 0x59340a12, 0x4c040000, 0x0505f8e7, 0x5c000800, - 0x05000009, 0x82180500, 0x00ffff00, 0x05000008, - 0x59a8100f, 0x82081500, 0x00ffff00, 0x80080580, - 0x05000003, 0x80000580, 0x0501f004, 0x82180500, - 0x000000ff, 0x800000d0, 0x80040d80, 0x05000003, - 0x4803c857, 0x48026a12, 0x59340813, 0x59242005, - 0x812000f0, 0x80102540, 0x40040000, 0x80100580, - 0x05000003, 0x4813c857, 0x48126813, 0x83440580, - 0x000007fe, 0x05020004, 0x4a026802, 0x00fffffe, - 0x0501f006, 0x59340002, 0x80180580, 0x05000003, - 0x481bc857, 0x481a6802, 0x0501f806, 0x80000580, - 0x1c01f000, 0x4803c856, 0x90000541, 0x05fdf7fd, - 0x59341200, 0x84081508, 0x5934000a, 0x8c00050c, - 0x0502000b, 0x599c0018, 0x8c000510, 0x05000009, - 0x59a80006, 0x8c00050a, 0x05000005, 0x59340c03, - 0x82040480, 0x000007f0, 0x05001002, 0x84081548, - 0x480a6a00, 0x1c01f000, 0x4947c857, 0x83440480, - 0x00000800, 0x05021018, 0x83200400, 0x0010a0ec, - 0x50024800, 0x59240009, 0x83441480, 0x000007f0, - 0x05001003, 0x80081400, 0x0501f003, 0x83441400, - 0x0010a380, 0x50080000, 0x80026d40, 0x05000009, - 0x0501fb03, 0x05020008, 0x8d0c0502, 0x05000004, - 0x59340200, 0x8c00050e, 0x05000003, 0x90000541, - 0x1c01f000, 0x80000580, 0x05fdf7fe, 0x5c000000, - 0x4c000000, 0x4803c857, 0x4947c857, 0x0501f805, + 0x805cb910, 0x800c1840, 0x900c1581, 0x05000013, + 0x64103000, 0x64803800, 0x05fdff30, 0x05000031, + 0x640c3000, 0x501c0800, 0x4807c857, 0x9c0409c0, + 0x8004bd57, 0x485fc857, 0x480fc857, 0x445cc800, + 0x8064c800, 0x4178b800, 0x800c1840, 0x900c1581, + 0x05000002, 0x05fdf7c2, 0x64103000, 0x65a03800, + 0x05fdff1e, 0x0500001f, 0x640c3000, 0x501c0800, + 0x4807c857, 0x82040d00, 0x000000ff, 0x9c0409c0, + 0x8004bd57, 0x4807c857, 0x485fc857, 0x4863c857, + 0x4867c857, 0x480fc857, 0x40301000, 0x41780800, + 0x60100000, 0x0511fe7d, 0x4807c857, 0x800409c0, + 0x05000006, 0x60100000, 0x80000c81, 0x805cb910, + 0x80040840, 0x05fe07fe, 0x445cc800, 0x485fc857, + 0x4863c857, 0x4867c857, 0x90000541, 0x4803c856, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, - 0x4d2c0000, 0x4d300000, 0x83440480, 0x00000800, - 0x0502101d, 0x83441400, 0x0010a380, 0x50080000, - 0x80026d40, 0x05000014, 0x45781000, 0x5934000d, - 0x80025d40, 0x05e20bdc, 0x59366011, 0x813261c0, - 0x0500000a, 0x4c640000, 0x5930c800, 0x59325809, - 0x0521f952, 0x05e20bd4, 0x0005fc5a, 0x90666540, - 0x05fe07fa, 0x5c00c800, 0x0501fd56, 0x41365800, - 0x05e1fbc5, 0x80000580, 0x5c026000, 0x5c025800, - 0x1c01f000, 0x90000541, 0x05fdf7fc, 0x0001fae7, - 0x41358800, 0x05000002, 0x41798800, 0x1c01f000, - 0x4c580000, 0x59cc0001, 0x4937c857, 0x82000500, - 0x00ffffff, 0x48026802, 0x497a6c01, 0x497a6a01, - 0x59340200, 0x84000502, 0x48026a00, 0x4004b000, - 0x0505f84d, 0x05020012, 0x59340403, 0x82000580, - 0x000007fe, 0x05000005, 0x59a8021b, 0x8c00050a, - 0x0502000b, 0x0501f008, 0x59cc0408, 0x8c000518, - 0x05000007, 0x59cc0009, 0x4803502c, 0x59cc000a, - 0x4803502d, 0x8058b1c0, 0x05020001, 0x59cc0a09, - 0x90040d10, 0x59cc0408, 0x90000520, 0x05000005, - 0x84040d40, 0x59a8121b, 0x8408155a, 0x480b521b, - 0x5934000a, 0x82000500, 0xffffffee, 0x80040540, - 0x4802680a, 0x91cca40b, 0x9134ac06, 0x6008b000, - 0x052dfe5c, 0x91cca40d, 0x9134ac08, 0x6008b000, - 0x052dfe58, 0x59a8208c, 0x82100d00, 0x0000f000, - 0x82040d80, 0x00003000, 0x05020017, 0x59cc0013, - 0x8c00053e, 0x05000014, 0x59cc0414, 0x599c0818, - 0x8c040512, 0x0500000e, 0x8c00051e, 0x05000005, - 0x59340200, 0x84000546, 0x84000544, 0x48026a00, - 0x59cc0213, 0x8c000516, 0x05000005, 0x59340200, - 0x8400054c, 0x84000544, 0x48026a00, 0x59cc0a14, - 0x0501f005, 0x59340200, 0x84000508, 0x48026a00, - 0x59cc0a18, 0x82040480, 0x00000800, 0x0502100a, - 0x82040480, 0x00000400, 0x05001003, 0x60000808, - 0x0501f005, 0x82040480, 0x00000200, 0x05001002, - 0x60000804, 0x42001000, 0x0010ac7a, 0x58080201, - 0x80041480, 0x05001002, 0x40000800, 0x48066a04, - 0x59340403, 0x82000580, 0x000007fe, 0x05020003, - 0x59cc0a08, 0x48066a04, 0x0501fcfa, 0x5c00b000, - 0x1c01f000, 0x59a8021b, 0x4937c857, 0x8c000508, - 0x05000007, 0x84000556, 0x4803c857, 0x4803521b, - 0x42001000, 0x0010f674, 0x050df8d8, 0x59cc0207, - 0x4803c857, 0x48026a05, 0x59cc020a, 0x4803c857, - 0x48026c05, 0x59341200, 0x599c0818, 0x5934180a, - 0x4807c857, 0x480bc857, 0x480fc857, 0x59cc2006, - 0x82102500, 0xff000000, 0x82102580, 0x02000000, - 0x05000007, 0x8c00050e, 0x05000009, 0x8c0c0514, - 0x05000003, 0x8c0c050e, 0x05000005, 0x8c040518, - 0x05000003, 0x8408154a, 0x0501f002, 0x8408150a, - 0x8c000510, 0x05000009, 0x8c0c0514, 0x05000003, - 0x8c0c0510, 0x05000005, 0x8c040518, 0x05000003, - 0x8408154e, 0x0501f002, 0x8408150e, 0x8c000512, - 0x05000009, 0x8c0c0514, 0x05000003, 0x8c0c0512, - 0x05000005, 0x8c040518, 0x05000003, 0x8408155c, - 0x0501f002, 0x8408151c, 0x480a6a00, 0x1c01f000, - 0x4803c856, 0x4c5c0000, 0x4d2c0000, 0x4c580000, - 0x5934000d, 0x80025d40, 0x05000023, 0x592c0003, - 0x90000488, 0x0500100a, 0x412cb800, 0x592c0001, - 0x80025d40, 0x05fe07fa, 0x05e1faea, 0x0500002e, - 0x492fc857, 0x492cb801, 0x0501f01b, 0x912c0c04, - 0x6020b000, 0x50040000, 0x82000580, 0xffffffff, - 0x05020006, 0x80041000, 0x50080000, 0x82000580, - 0xffffffff, 0x05000005, 0x90040c02, 0x8058b040, - 0x05fe07f5, 0x05ddff4a, 0x45480800, 0x454c1000, - 0x592c1803, 0x800c1800, 0x480e5803, 0x480fc857, - 0x0501f010, 0x05e1facf, 0x05000013, 0x492fc857, - 0x492e680d, 0x497a5802, 0x64065803, 0x494a5804, - 0x494e5805, 0x912c0c06, 0x6038b000, 0x46000800, - 0xffffffff, 0x80040800, 0x8058b040, 0x05fe07fc, - 0x90000541, 0x5c00b000, 0x5c025800, 0x5c00b800, - 0x1c01f000, 0x80000580, 0x05fdf7fb, 0x4803c856, - 0x4d3c0000, 0x4d2c0000, 0x5934000d, 0x80025d40, - 0x0500001c, 0x592c0002, 0x80000540, 0x0502001c, - 0x412e7800, 0x0501f8a6, 0x05020019, 0x46000800, - 0xffffffff, 0x46001000, 0xffffffff, 0x4813c857, - 0x480fc857, 0x580c0003, 0x90000c82, 0x05021012, - 0x480fc857, 0x400c0000, 0x812c0580, 0x05020004, - 0x580c0001, 0x4802680d, 0x0501f003, 0x580c0001, - 0x48002001, 0x400e5800, 0x05e1faaa, 0x90000541, - 0x5c025800, 0x5c027800, 0x1c01f000, 0x80000580, - 0x05fdf7fc, 0x80000040, 0x48001803, 0x4803c857, - 0x05fdf7f7, 0x64225a07, 0x0001f35b, 0x64a65a07, - 0x0001f35b, 0x64aa5a07, 0x0001f35b, 0x64a25a07, - 0x0001f35b, 0x643a5a07, 0x0001f35b, 0x4943c857, - 0x4d440000, 0x4d340000, 0x4d2c0000, 0x4c580000, - 0x61c0b00f, 0x417a8800, 0x0001fae7, 0x05020007, - 0x8d3c0506, 0x05000004, 0x59340200, 0x8c00050e, - 0x05020002, 0x0501f811, 0x81468800, 0x8058b040, - 0x05fe07f6, 0x83440480, 0x00000800, 0x05021006, - 0x8d3c0502, 0x05000004, 0x61c2880f, 0x6040b000, - 0x05fdf7ee, 0x5c00b000, 0x5c025800, 0x5c026800, - 0x5c028800, 0x1c01f000, 0x4d2c0000, 0x4c600000, - 0x4c5c0000, 0x4178b800, 0x5936580f, 0x812e59c0, - 0x0500002b, 0x592c0205, 0x82000500, 0x000000ff, - 0x90000592, 0x05000023, 0xb00005a0, 0x05000021, - 0x90000588, 0x0500001f, 0x8d3c0500, 0x05000003, - 0x0501f845, 0x0502001b, 0x592cc000, 0x497a5800, - 0x805cb9c0, 0x05020009, 0x59340010, 0x812c0580, - 0x05020004, 0x497a680f, 0x497a6810, 0x0501f008, - 0x4862680f, 0x0501f006, 0x4860b800, 0x59340010, - 0x812c0580, 0x05020002, 0x485e6810, 0x0001ff6c, - 0x4a025a05, 0x00000103, 0x49425a07, 0x497a580a, - 0x0521f936, 0x0001fb5b, 0x40625800, 0x05fdf7d8, - 0x412cb800, 0x592e5800, 0x05fdf7d5, 0x5c00b800, - 0x5c00c000, 0x5c025800, 0x1c01f000, 0x4803c856, - 0x41781800, 0x5934000f, 0x80025d40, 0x05000018, - 0x592c0006, 0x80200580, 0x592c0000, 0x05000003, - 0x412c1800, 0x05fdf7f9, 0x592c0a05, 0x82040d00, - 0x000000ff, 0x90040d92, 0x05fc07fa, 0xb0040da0, - 0x05fc07f8, 0x90040d88, 0x05fc07f6, 0x497a5800, - 0x800c19c0, 0x05000007, 0x48001800, 0x80000540, - 0x05020003, 0x480e6810, 0x90000541, 0x1c01f000, - 0x4802680f, 0x80000540, 0x05fe07fd, 0x497a6810, - 0x05fdf7fa, 0x592c0009, 0x81480580, 0x05020003, - 0x592c000a, 0x814c0580, 0x1c01f000, 0x4803c856, - 0x4c580000, 0x413c1800, 0x400c2000, 0x593c0002, - 0x80000540, 0x05020014, 0x6020b000, 0x900c0c04, - 0x50040000, 0x81480580, 0x05020005, 0x80041000, - 0x50080000, 0x814c0580, 0x0500000b, 0x90040c02, - 0x8058b040, 0x05fe07f7, 0x400c2000, 0x580c0001, - 0x80001d40, 0x05fe07f1, 0x90000541, 0x5c00b000, - 0x1c01f000, 0x80000580, 0x05fdf7fd, 0x4937c857, - 0x4c580000, 0x4d2c0000, 0x5934000d, 0x80025d40, - 0x05020011, 0x05e1f9e7, 0x0500000c, 0x492e680d, - 0x64065802, 0x497a5803, 0x912c0c04, 0x6040b000, - 0x46000800, 0xffffffff, 0x80040800, 0x8058b040, - 0x05fe07fc, 0x90000541, 0x5c025800, 0x5c00b000, - 0x1c01f000, 0x4d2c0000, 0x592e5801, 0x05e1f9ee, - 0x5c025800, 0x497a5801, 0x05fdf7ee, 0x4d2c0000, - 0x5936580d, 0x812e59c0, 0x05000005, 0x4937c857, - 0x497a680d, 0x05e1f9e4, 0x90000541, 0x5c025800, - 0x1c01f000, 0x59340405, 0x4937c857, 0x4803c857, - 0x8c000508, 0x1c01f000, 0x4933c857, 0x5930380a, - 0x581c0200, 0x8400051a, 0x48003a00, 0x1c01f000, - 0x4933c857, 0x5930000a, 0x50000000, 0x8c000508, - 0x1c01f000, 0x0501f805, 0x60058800, 0x05020002, - 0x60018800, 0x1c01f000, 0x5930000a, 0x50000000, - 0x4933c857, 0x4803c857, 0x8c00050e, 0x1c01f000, - 0x5930000a, 0x50000000, 0x8c00050a, 0x1c01f000, - 0x0501f805, 0x60058800, 0x05000002, 0x60018800, - 0x1c01f000, 0x4933c856, 0x0501f8d2, 0x05000005, - 0x59340400, 0x82000d00, 0x000000ff, 0x90041585, - 0x1c01f000, 0x4803c856, 0x59a80a1b, 0x8c040506, - 0x0500000a, 0x5930081d, 0x58040200, 0x8c000500, - 0x05000006, 0x58040009, 0x9000040e, 0x50000800, - 0x58040200, 0x8c00051a, 0x1c01f000, 0x0501f805, + 0x60003020, 0x80183040, 0x05000010, 0x0535fad2, + 0x05fc07fd, 0x05e5fdfa, 0x605430f4, 0x50183800, + 0x821c0500, 0x00007000, 0x05000006, 0x48035094, + 0x821c0500, 0xffff8fff, 0x44003000, 0x80000580, + 0x64030000, 0x1c01f000, 0x4803c856, 0x4a034408, + 0x0000cccc, 0x90000541, 0x05fdf7fa, 0x0535fabe, + 0x05fc07ff, 0x600008f4, 0x58040015, 0x82000500, + 0xffff8fff, 0x59a81094, 0x80080540, 0x48000815, + 0x64030000, 0x1c01f000, 0x59a80005, 0x8c000514, + 0x05000005, 0x42000000, 0x0010aed8, 0x50000000, + 0x90000528, 0x1c01f000, 0x59c400a4, 0x4c580000, + 0x4c500000, 0x4c540000, 0x9000050f, 0x90000487, + 0x05001008, 0x90006c87, 0x05e61925, 0x0c01f807, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x1c01f000, + 0x0501f8e9, 0x05fdf7fb, 0x001038d9, 0x001038df, + 0x00103903, 0x0010391d, 0x001039bf, 0x001038d8, + 0x1c01f000, 0x59c40806, 0x8c040500, 0x05020003, + 0x84040d40, 0x48078806, 0x1c01f000, 0x59c40005, + 0x8c000534, 0x0502069e, 0x4a038805, 0xffffffff, + 0x42006000, 0x00020000, 0x0501fe80, 0x59a80015, + 0x82000500, 0xfffffffa, 0x84000542, 0x48035015, + 0x497b521b, 0x42000800, 0x0010cea4, 0x45780800, + 0x497b5073, 0x42000000, 0x0010b38f, 0x46000000, + 0x0000ffff, 0x42006000, 0xffefffff, 0x42006800, + 0x40000000, 0x0501fe67, 0x59c40006, 0x82000500, + 0xffffff0f, 0x48038806, 0x60400800, 0x42001000, + 0x00103ecb, 0x0511fbdc, 0x0501f001, 0x42006000, + 0xffffffff, 0x42006800, 0x00800000, 0x0501fe59, + 0x6120b001, 0x59c400a4, 0x9000050f, 0x9000058a, + 0x0500000d, 0x8058b040, 0x05fe07fb, 0x497b5010, + 0x42006000, 0xbf7fffff, 0x42006800, 0x00018000, + 0x0501fe4c, 0x42006000, 0xfffeffff, 0x41786800, + 0x0501f648, 0x497b5010, 0x64035072, 0x80000580, + 0x0501f651, 0x4a038805, 0xffffffff, 0x59a80072, + 0x90000c84, 0x05e618ce, 0x0c01f001, 0x00103926, + 0x0010394c, 0x001039b8, 0x4803c856, 0x59c400a3, + 0x8400051e, 0x480388a3, 0x64075072, 0x59c40008, + 0x82000540, 0x00000280, 0x48038808, 0x0501fe19, + 0x42007800, 0x0010af05, 0x4a007806, 0x11010000, + 0x4200a000, 0x0010b392, 0x4200a800, 0x0010af0c, + 0x6008b000, 0x0535f9d7, 0x59c40802, 0x84040d0c, + 0x48078802, 0x600c0800, 0x497b507c, 0x0501fd0e, + 0x6407507c, 0x497b5077, 0x0501fe31, 0x42006000, + 0xffffffff, 0x42006800, 0x00080000, 0x0501fe19, + 0x42006000, 0xfff7ffff, 0x41786800, 0x0501f615, + 0x59a80077, 0x497b5077, 0x80002540, 0x0500005e, + 0x59c40004, 0x90000503, 0x05020065, 0x59a80815, + 0x8c040502, 0x05000049, 0x9010058c, 0x0502004c, + 0x90100418, 0x8000b104, 0x41cc1000, 0x42001800, + 0x0010af05, 0x50080800, 0x500c0000, 0x80040580, + 0x05020019, 0x80081000, 0x800c1800, 0x8058b040, + 0x05fe07f9, 0x0501fe0e, 0x59c80015, 0x84000508, + 0x48039015, 0x42006000, 0xffffffff, 0x42006800, + 0x00500000, 0x0501fdf3, 0x640b5072, 0x640b5010, + 0x05edfcbc, 0x6140080f, 0x42001000, 0x00103e29, + 0x0511fcaa, 0x59a80015, 0x84000506, 0x48035015, + 0x0501f5d0, 0x59cc0806, 0x82040d80, 0x11010000, + 0x05020027, 0x59cc0800, 0x82040500, 0x00ffffff, + 0x05000018, 0x82000580, 0x000000ef, 0x05020015, + 0x59cc0801, 0x82040500, 0x00ffffff, 0x82000580, + 0x000000ef, 0x0502000f, 0x91cca407, 0x4200a800, + 0x0010b392, 0x6008b000, 0x50500800, 0x50540000, + 0x80040480, 0x05001007, 0x05020011, 0x8050a000, + 0x8054a800, 0x8058b040, 0x05fe07f8, 0x0501f00c, + 0x59a80015, 0x84000502, 0x48035015, 0x59c80015, + 0x84000508, 0x48039015, 0x41cca000, 0x4200a800, + 0x0010af05, 0x6024b000, 0x0535f96e, 0x0501fdd0, + 0x42006000, 0xffffffff, 0x42006800, 0x00080000, + 0x0501fdb8, 0x42006000, 0xfff7ffff, 0x41786800, + 0x0501fdb4, 0x42006000, 0xffffffff, 0x60006880, + 0x0501fdb0, 0x59c40004, 0x90000503, 0x05020004, + 0x497b5077, 0x600c0800, 0x0501f497, 0x1c01f000, + 0x1c01f000, 0x59a80010, 0x90006d8f, 0x05000003, + 0x9000059b, 0x05020c62, 0x1c01f000, 0x59a80015, + 0x84000506, 0x48035015, 0x497b507c, 0x59a80010, + 0x90000c9e, 0x05e6182a, 0x0c01f001, 0x001039f6, + 0x00103a06, 0x00103a28, 0x00103a42, 0x00103a60, + 0x00103a63, 0x00103a66, 0x00103a69, 0x00103a6c, + 0x00103a80, 0x00103a83, 0x00103ad7, 0x00103ada, + 0x00103ae7, 0x00103aea, 0x00103afc, 0x00103b01, + 0x00103b50, 0x00103b77, 0x00103bef, 0x00103c16, + 0x00103c65, 0x00103cab, 0x00103cf9, 0x00103d17, + 0x00103d59, 0x00103d77, 0x00103d87, 0x00103d88, + 0x4803c856, 0x601ed800, 0x0509f94c, 0x05000006, + 0x42006000, 0xffffffd7, 0x41786800, 0x0501fd75, + 0x0501f009, 0x59c40006, 0x82000500, 0xffffff0f, + 0x48038806, 0x4a038805, 0x000000f0, 0x0509fc9a, + 0x0509f8b3, 0x1c01f000, 0x4803c856, 0x42006000, + 0xbf7fffff, 0x42006800, 0x00400000, 0x0501fd65, + 0x05edfc30, 0x64075010, 0x42001000, 0x00103ecb, + 0x0511fafb, 0x0501fcd3, 0x6140080f, 0x42001000, + 0x00103e29, 0x0511f419, 0x59a80077, 0x90000594, + 0x0502001e, 0x4803c857, 0x42006000, 0xffbfffff, + 0x41786800, 0x0501fd53, 0x59c40004, 0x90000503, + 0x05020016, 0x42001000, 0x00103e29, 0x0511fad5, + 0x59cc1006, 0x82081580, 0x11020000, 0x05020010, + 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, + 0x8c000504, 0x05020007, 0x42000000, 0x0010b224, + 0x0535f825, 0x59a80015, 0x84000544, 0x48035015, + 0x64435010, 0x0501f0dc, 0x1c01f000, 0x0501f3f8, + 0x4803c856, 0x640f5010, 0x42006000, 0xbf3fffff, + 0x42006800, 0x00100000, 0x0501fd32, 0x42001000, + 0x00103ecb, 0x0511faca, 0x0501fca2, 0x42001000, + 0x00103e29, 0x0511fab3, 0x59a8041b, 0x90000528, + 0x05000004, 0x42000800, 0xffffd815, 0x05f1fdf7, + 0x42007800, 0x0010af0b, 0x46007800, 0x11020000, + 0x60140800, 0x0501f40c, 0x59a80077, 0x80000540, + 0x0500001a, 0x4803c857, 0x42001000, 0x00103e29, + 0x0511faa0, 0x59a80077, 0x90000594, 0x05020014, + 0x59cc1006, 0x82081580, 0x11020000, 0x05020010, + 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, + 0x8c000504, 0x05020007, 0x42000000, 0x0010b224, + 0x0531ffed, 0x59a80015, 0x84000544, 0x48035015, + 0x64135010, 0x0501f003, 0x1c01f000, 0x0501f3c0, + 0x4803c856, 0x64175010, 0x0501f117, 0x4c5c0000, + 0x6004b800, 0x0501f0ed, 0x4803c856, 0x641f5010, + 0x0501f1b0, 0x4c5c0000, 0x6004b800, 0x0501f186, + 0x4803c856, 0x64275010, 0x91cca406, 0x4200a800, + 0x0010af0b, 0x6014b000, 0x0535f89e, 0x42007800, + 0x0010af0b, 0x46007800, 0x11050100, 0x8d0c0506, + 0x05000243, 0x60140800, 0x0501fbd3, 0x4d3c0000, + 0x60067800, 0x0529fb91, 0x5c027800, 0x1c01f000, + 0x4c5c0000, 0x6004b800, 0x0501f1e5, 0x4803c856, + 0x642f5010, 0x42001000, 0x0010af0c, 0x4008a800, + 0x6080b000, 0x4600a800, 0xffffffff, 0x8054a800, + 0x8058b040, 0x05fe07fc, 0x42007800, 0x0010af0b, + 0x46007800, 0x11060000, 0x8d0c0506, 0x05000005, + 0x50080000, 0x46001000, 0x00ffffff, 0x0501f03e, + 0x42024800, 0x0010b391, 0x0535f8cc, 0x40083000, + 0x41782800, 0x41781800, 0x41782000, 0x59240200, + 0x8c000500, 0x05000012, 0x8c000502, 0x05000010, + 0x801429c0, 0x05020002, 0x800c1800, 0x80142800, + 0x59244408, 0x82204500, 0x000000ff, 0x400c0000, + 0x50182000, 0x0c01f810, 0x80102540, 0x44103000, + 0x800c19c0, 0x05020002, 0x80183000, 0x91264c0b, + 0x8058b040, 0x05fe07ea, 0x50080000, 0x82000500, + 0x00ffffff, 0x801428f0, 0x80140540, 0x44001000, + 0x0501f019, 0x00103ac1, 0x00103ac6, 0x00103acb, + 0x00103ad0, 0x802000f0, 0x82102500, 0x00ffffff, + 0x800c1800, 0x1c01f000, 0x802000e0, 0x82102500, + 0xff00ffff, 0x800c1800, 0x1c01f000, 0x802000d0, + 0x82102500, 0xffff00ff, 0x800c1800, 0x1c01f000, + 0x40200000, 0x82102500, 0xffffff00, 0x41781800, + 0x1c01f000, 0x60840800, 0x0501f377, 0x4c5c0000, + 0x6004b800, 0x0501f222, 0x4803c856, 0x64375010, + 0x91cca406, 0x4200a800, 0x0010af0b, 0x6084b000, + 0x0535f830, 0x42007800, 0x0010af0b, 0x46007800, + 0x11070000, 0x60840800, 0x0501f367, 0x4c5c0000, + 0x6004b800, 0x0501f272, 0x4803c856, 0x90040d41, + 0x0501fc81, 0x643f5010, 0x497b5077, 0x42006000, + 0xffffffff, 0x42006800, 0x00300000, 0x0501fc6d, + 0x42006000, 0xffdfffff, 0x41786800, 0x0501fc69, + 0x6140080f, 0x42001000, 0x00103e29, 0x0511f1ca, + 0x4803c856, 0x59a80077, 0x80000540, 0x05020320, + 0x1c01f000, 0x4803c856, 0x64475010, 0x91cca406, + 0x4200a800, 0x0010af0b, 0x6014b000, 0x0535f809, + 0x4200a800, 0x0010af0b, 0x4600a800, 0x11020000, + 0x8d0c0506, 0x05020041, 0x59a80c1b, 0x82040580, + 0x0000ffff, 0x0500003d, 0x90040d30, 0x05000005, + 0x42000800, 0xffffd815, 0x05f1fd1c, 0x0501f037, + 0x59cc0007, 0x8c00053c, 0x05000034, 0x42024800, + 0x0010b391, 0x0535f849, 0x59240200, 0xb0000d23, + 0xb0040da3, 0x05020021, 0x59240a08, 0x42001000, + 0x0010af0c, 0x0501fab5, 0x05000009, 0x59240c08, + 0x05edfb1d, 0x59240200, 0x84000502, 0x84000518, + 0x84000544, 0x48024a00, 0x0501f014, 0x59240200, + 0x82000540, 0x00001006, 0x84000506, 0x48024a00, + 0x48064a08, 0x82042c00, 0x001020b6, 0x50142800, + 0x82142d00, 0x000000ff, 0x48164c08, 0x59240005, + 0x82000500, 0x00ffff00, 0x80140d40, 0x48064805, + 0x40140800, 0x05edfaf5, 0x91264c0b, 0x8058b040, + 0x05fe07da, 0x42024800, 0x0010b391, 0x59242a00, + 0x8c140502, 0x05000005, 0x8c140500, 0x05000003, + 0x59242c08, 0x4817500f, 0x60140800, 0x0501f2fe, + 0x4c5c0000, 0x4178b800, 0x59a80077, 0x80000540, + 0x05000021, 0x4803c857, 0x42001000, 0x00103e29, + 0x0511f990, 0x59a80077, 0x90000594, 0x05020019, + 0x59cc1006, 0x82081580, 0x11030000, 0x05020015, + 0x59cc1007, 0x8c08053e, 0x0500000a, 0x59a80015, + 0x8c000504, 0x05020007, 0x42000000, 0x0010b224, + 0x0531fedd, 0x59a80015, 0x84000544, 0x48035015, + 0x805cb9c0, 0x05000004, 0x641b5010, 0x05fdfef7, + 0x0501f005, 0x644b5010, 0x0501f805, 0x0501f002, + 0x0501faab, 0x5c00b800, 0x1c01f000, 0x4803c856, + 0x644f5010, 0x91cca407, 0x4200a800, 0x0010af0c, + 0x6010b000, 0x0531ff93, 0x4200a800, 0x0010af0b, + 0x4600a800, 0x11030000, 0x8d0c0506, 0x0502006a, + 0x42024800, 0x0010b391, 0x0531ffe0, 0x4c600000, + 0x4178c000, 0x59a8021b, 0x82000500, 0xfffffffc, + 0x4803521b, 0x59240200, 0x40000800, 0x82040d00, + 0xfffffb17, 0x48064a00, 0x8c000500, 0x05000048, + 0x8c000518, 0x05020046, 0x8c000502, 0x05020004, + 0x59240400, 0x8c000502, 0x05000041, 0x59240a08, + 0x42001000, 0x0010af0c, 0x0501fa3c, 0x0500002b, + 0x59240005, 0x82000500, 0x00ffff00, 0x48024805, + 0x59240200, 0x8c000502, 0x05000019, 0x59240207, + 0x82000500, 0x0000ffff, 0x05000015, 0x8060c000, + 0x59240c08, 0x05edfa98, 0x4c640000, 0x4c580000, + 0x4d2c0000, 0x5924c809, 0x6040b000, 0x50640000, + 0x800001c0, 0x05000004, 0x4578c800, 0x40025800, + 0x05e5f9d4, 0x8064c800, 0x8058b040, 0x05fe07f8, + 0x5c025800, 0x5c00b000, 0x5c00c800, 0x59240200, + 0x84000502, 0x84000544, 0x48024a00, 0x59240400, + 0x8c000504, 0x05000016, 0x59240200, 0x84000546, + 0x48024a00, 0x0501f012, 0x59240200, 0x90000546, + 0x84000506, 0x48024a00, 0x82042c00, 0x001020b6, + 0x50142800, 0x82142d00, 0x000000ff, 0x48164c08, + 0x59240005, 0x82000500, 0x00ffff00, 0x80140d40, + 0x48064805, 0x40140800, 0x05edfa5c, 0x59240200, + 0x84000518, 0x48024a00, 0x91264c0b, 0x8058b040, + 0x05fe07ad, 0x8060c1c0, 0x05020b0b, 0x5c00c000, + 0x42024800, 0x0010b391, 0x59242a00, 0x8c140502, + 0x05000005, 0x8c140500, 0x05000003, 0x59242c08, + 0x4817500f, 0x60140800, 0x0501f25f, 0x4c5c0000, + 0x4178b800, 0x59a80077, 0x80000540, 0x05000021, + 0x4803c857, 0x42001000, 0x00103e29, 0x0511f8f1, + 0x59a80077, 0x90000594, 0x05020019, 0x59cc1006, + 0x82081580, 0x11040000, 0x05020015, 0x59cc1007, + 0x8c08053e, 0x0500000a, 0x59a80015, 0x8c000504, + 0x05020007, 0x42000000, 0x0010b224, 0x0531fe3e, + 0x59a80015, 0x84000544, 0x48035015, 0x805cb9c0, + 0x05000004, 0x64235010, 0x05fdfe5e, 0x0501f005, + 0x64535010, 0x0501f805, 0x0501f002, 0x0501fa0c, + 0x5c00b800, 0x1c01f000, 0x4803c856, 0x64575010, + 0x91cca407, 0x4200a800, 0x0010af0c, 0x6010b000, + 0x0531fef4, 0x4200a800, 0x0010af0b, 0x4600a800, + 0x11040000, 0x8d0c0506, 0x05020041, 0x42024800, + 0x0010b391, 0x0531ff41, 0x59240400, 0x8c000500, + 0x0500002f, 0x59240200, 0x8c000500, 0x0500002c, + 0x8c000502, 0x0502002a, 0x59240c00, 0x80040910, + 0x82040d00, 0x000000ff, 0x42001000, 0x0010af0c, + 0x0501f9a6, 0x05000010, 0x59240005, 0x82000500, + 0x00ffff00, 0x48024805, 0x59240200, 0x84000502, + 0x48024a00, 0x59242400, 0x8c100504, 0x05000018, + 0x84000546, 0x84000544, 0x48024a00, 0x8060c000, + 0x0501f013, 0x59240200, 0x90000546, 0x84000506, + 0x48024a00, 0x48064a08, 0x82042c00, 0x001020b6, + 0x50142800, 0x82142d00, 0x000000ff, 0x48164c08, + 0x59240005, 0x82000500, 0x00ffff00, 0x80140d40, + 0x48064805, 0x40140800, 0x05edf9e0, 0x91264c0b, + 0x8058b040, 0x05fe07cd, 0x42024800, 0x0010b391, + 0x59242a00, 0x8c140502, 0x05000005, 0x8c140500, + 0x05000003, 0x59242c08, 0x4817500f, 0x60140800, + 0x0501f1e9, 0x4c5c0000, 0x4178b800, 0x59a80077, + 0x80000540, 0x05000040, 0x4803c857, 0x42001000, + 0x00103e29, 0x0511f87b, 0x59a80077, 0x90000594, + 0x05020038, 0x59cc1006, 0x82080500, 0x11050000, + 0x82000580, 0x11050000, 0x05020032, 0x8c080510, + 0x05000013, 0x0501faf4, 0x59cc1007, 0x8c08053e, + 0x0500000a, 0x59a80015, 0x8c000504, 0x05020007, + 0x42000000, 0x0010b224, 0x0531fdc3, 0x59a80015, + 0x84000544, 0x48035015, 0x805cb9c0, 0x05000014, + 0x642b5010, 0x05fdfdfa, 0x0501f01f, 0x59cc1007, + 0x8c08053e, 0x0500000a, 0x59a80015, 0x8c000504, + 0x05020007, 0x42000000, 0x0010b224, 0x0531fdb2, + 0x59a80015, 0x84000544, 0x48035015, 0x90000541, + 0x0501fad5, 0x497b5073, 0x0501f002, 0x64075073, + 0x59cc1007, 0x8c08053c, 0x05000002, 0x6423521b, + 0x805cb9c0, 0x05020004, 0x645b5010, 0x0501f808, + 0x0501f005, 0x643b5010, 0x05fdfe44, 0x0501f002, + 0x0501f977, 0x5c00b800, 0x1c01f000, 0x4803c856, + 0x91cca406, 0x4200a800, 0x0010af0b, 0x6014b000, + 0x0531fe60, 0x645f5010, 0x59a80073, 0x8c000500, + 0x05000006, 0x42001000, 0x0010af0b, 0x46001000, + 0x11050100, 0x0501f002, 0x646f5010, 0x42024800, + 0x0010b391, 0x0531fea9, 0x599c2817, 0x59240200, + 0x8c000500, 0x05000025, 0x8c000502, 0x05020023, + 0x8c000506, 0x05020021, 0x4c580000, 0x0501f8c2, + 0x5c00b000, 0x0502000b, 0x59240005, 0x82000500, + 0x00ffff00, 0x48024805, 0x59240200, 0x84000502, + 0x84000546, 0x84000544, 0x48024a00, 0x0501f013, + 0x59240200, 0x90000546, 0x84000506, 0x48024a00, + 0x48064a08, 0x82042c00, 0x001020b6, 0x50142800, + 0x82142d00, 0x000000ff, 0x48164c08, 0x59240005, + 0x82000500, 0x00ffff00, 0x80140d40, 0x48064805, + 0x40140800, 0x05edf951, 0x91264c0b, 0x8058b040, + 0x05fe07d7, 0x42024800, 0x0010b391, 0x59242a00, + 0x8c140502, 0x05000005, 0x8c140500, 0x05000003, + 0x59242c08, 0x4817500f, 0x60140800, 0x0501f95a, + 0x4d3c0000, 0x60067800, 0x0529f918, 0x5c027800, + 0x1c01f000, 0x4c5c0000, 0x4178b800, 0x59a80077, + 0x80000540, 0x05000018, 0x4803c857, 0x42001000, + 0x00103e29, 0x050dffe7, 0x59a80077, 0x82000580, + 0x00000084, 0x0502000f, 0x59cc1006, 0x82081580, + 0x11060000, 0x0502000b, 0x80000580, 0x0501fa62, + 0x805cb9c0, 0x05000004, 0x64335010, 0x05fdfdcb, + 0x0501f005, 0x64635010, 0x0501f805, 0x0501f002, + 0x0501f90b, 0x5c00b800, 0x1c01f000, 0x4803c856, + 0x64675010, 0x91cca406, 0x4200a800, 0x0010af0b, + 0x6084b000, 0x0531fdf3, 0x42003800, 0x0010af0c, + 0x42024800, 0x0010b391, 0x4200b000, 0x0010b390, + 0x5058b000, 0x59240200, 0x8c000500, 0x05000019, + 0x8c000502, 0x05000017, 0x401c2800, 0x50141000, + 0x80080130, 0x80000000, 0x40001800, 0x82081500, + 0x00ffffff, 0x800000f0, 0x80080540, 0x44002800, + 0x59244408, 0x82204500, 0x000000ff, 0x400c1000, + 0x80081104, 0x82083400, 0x0010af0c, 0x50181000, + 0x900c0503, 0x0c01f808, 0x80081540, 0x44083000, + 0x91264c0b, 0x8058b040, 0x05fe07e3, 0x60840800, + 0x0501f109, 0x00103d49, 0x00103d4d, 0x00103d51, + 0x00103d55, 0x802000f0, 0x82081500, 0x00ffffff, + 0x1c01f000, 0x802000e0, 0x82081500, 0xff00ffff, + 0x1c01f000, 0x802000d0, 0x82081500, 0xffff00ff, + 0x1c01f000, 0x40200000, 0x82081500, 0xffffff00, + 0x1c01f000, 0x4c5c0000, 0x4178b800, 0x59a80077, + 0x80000540, 0x05000018, 0x4803c857, 0x42001000, + 0x00103e29, 0x050dff87, 0x59a80077, 0x82000580, + 0x00000084, 0x0502000f, 0x59cc1006, 0x82081580, + 0x11070000, 0x0502000b, 0x64075073, 0x0501f897, + 0x805cb9c0, 0x05000004, 0x643b5010, 0x05fdfd7b, + 0x0501f005, 0x646b5010, 0x0501f805, 0x0501f002, + 0x0501f8ab, 0x5c00b800, 0x1c01f000, 0x90000541, + 0x0501f9f5, 0x646f5010, 0x91cca406, 0x4200a800, + 0x0010af0b, 0x59a82077, 0x40100000, 0x8000b104, + 0x40580800, 0x5450a800, 0x8050a000, 0x8054a800, + 0x8058b040, 0x05fe07fc, 0x0501f0c7, 0x1c01f000, + 0x1c01f000, 0x4803c856, 0x60103000, 0x42004000, + 0x0010af0c, 0x599c2817, 0x8c140514, 0x0502001c, + 0x600c1000, 0x40200000, 0x80080400, 0x50000800, + 0x82042580, 0xffffffff, 0x05020005, 0x80081040, + 0x80183040, 0x05fe07f8, 0x0501f03f, 0x800811c0, + 0x05020006, 0x82042580, 0x3fffffff, 0x05000039, + 0x82040d40, 0xc0000000, 0x6080b000, 0x60041800, + 0x40042000, 0x80102102, 0x0502101f, 0x800c18c2, + 0x8058b040, 0x05fe07fc, 0x0501f02e, 0x41781000, + 0x40200000, 0x80080400, 0x50000800, 0x82042580, + 0xffffffff, 0x05020005, 0x80081000, 0x80183040, + 0x05fe07f8, 0x0501f023, 0x800811c0, 0x05020003, + 0x82040d40, 0xc0000000, 0x6004b000, 0x42001800, + 0x80000000, 0x40042000, 0x801020c2, 0x05021006, + 0x800c1902, 0x8058b000, 0x905804a1, 0x05fc17fb, + 0x0501f014, 0x40200000, 0x80082400, 0x50100000, + 0x800c0540, 0x44002000, 0x59a80015, 0x84000540, + 0x48035015, 0x40580000, 0x60802800, 0x80142c80, + 0x40080000, 0x600c3800, 0x801c0480, 0x800000ca, + 0x80142d40, 0x40140800, 0x90000541, 0x0501f002, + 0x80000580, 0x1c01f000, 0x4807c857, 0x480bc857, + 0x40041800, 0x41782000, 0x600c0000, 0x900c1ca0, + 0x05001004, 0x80102000, 0x80000040, 0x05fdf7fc, + 0x40041800, 0x801021c0, 0x05000004, 0x900c1ca0, + 0x80102040, 0x05fe07fe, 0x60042000, 0x800c19c0, + 0x05000004, 0x801020c2, 0x800c1840, 0x05fe07fe, + 0x80083c00, 0x401c2800, 0x50140000, 0x80102d00, + 0x05020007, 0x80100540, 0x44003800, 0x59a80015, + 0x84000540, 0x48035015, 0x80000580, 0x1c01f000, + 0x4807c856, 0x605c1100, 0x59a81836, 0x0531fc50, + 0x05f9ffcd, 0x1c01f000, 0x4807c856, 0x6080b000, + 0x91cca407, 0x4200a800, 0x0010cea4, 0x0531f544, + 0x4807c856, 0x0511fe8a, 0x61dc0801, 0x0501f8d5, + 0x497b2804, 0x497b2805, 0x497b2826, 0x497b2827, + 0x6006d800, 0x42006000, 0xbe7fffff, 0x42006800, + 0x00018000, 0x0501f94b, 0x42006000, 0xfffeffff, + 0x41786800, 0x0501f947, 0x497b5036, 0x60b40800, + 0x42001000, 0x00103ea1, 0x050df6a7, 0x4807c856, + 0x05fdffe8, 0x497b5010, 0x497b5077, 0x1c01f000, + 0x4807c856, 0x42006000, 0xffffffff, 0x60a06800, + 0x0501f138, 0x4807c856, 0x05fdffd2, 0x0511fb14, + 0x4df00000, 0x0511fda9, 0x5c03e000, 0x05100afc, + 0x59c400a4, 0x9000050f, 0x90000582, 0x0502000a, + 0x42006000, 0xffffffff, 0x42006800, 0x00200000, + 0x0501f928, 0x42006000, 0xffdfffff, 0x41786800, + 0x0501f924, 0x497b5010, 0x61dc0801, 0x0501f8a1, + 0x59c400a3, 0x82000500, 0xbf20bfff, 0x82000540, + 0x0001c000, 0x480388a3, 0x84000520, 0x480388a3, + 0x497b5036, 0x60b40800, 0x42001000, 0x00103ea1, + 0x050df679, 0x497b5077, 0x59b400f5, 0x8c000500, + 0x05020003, 0x90000541, 0x480368f5, 0x800400c4, + 0x82000400, 0x00002000, 0x4803910a, 0x59b400f6, + 0x90000518, 0x05fe07fe, 0x4a0368f0, 0x0010af04, + 0x42000000, 0x0010af0b, 0x4c040000, 0x40043800, + 0x50000800, 0x82040d80, 0x11010000, 0x0500000c, + 0x50000800, 0x4807c857, 0x8d0c052a, 0x05000008, + 0x4c000000, 0x821c3d40, 0x0000dc00, 0x42000000, + 0x0010af05, 0x05e1fc8f, 0x5c000000, 0x5c000800, + 0x480368f1, 0x82040400, 0x0000dc00, 0x480368f3, + 0x59c400a4, 0x9000050f, 0x90000588, 0x05020013, + 0x4c5c0000, 0x4c600000, 0x59c4b805, 0x8c5c053a, + 0x05020004, 0x42000000, 0x0010b221, 0x0531fbc6, + 0x4a038805, 0x20000000, 0x05edfb6f, 0x4000c000, + 0x05edfab5, 0x6006d800, 0x497b5010, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x59c8010b, 0x8c000502, + 0x05fc07e8, 0x59c408a4, 0x90040d0f, 0x90040d8b, + 0x05020005, 0x59a80810, 0x82040d40, 0x00002000, + 0x0501f004, 0x59a80872, 0x82040d40, 0x00001000, + 0x48075036, 0x59a8087c, 0x800409c0, 0x05020005, + 0x6140080f, 0x42001000, 0x00103e29, 0x050dff7f, + 0x1c01f000, 0x4807c856, 0x05fdff5a, 0x0511fa9c, + 0x4df00000, 0x0511fd31, 0x5c03e000, 0x05100a84, + 0x59c400a4, 0x9000050f, 0x90000582, 0x0502000a, + 0x42006000, 0xffffffff, 0x42006800, 0x00200000, + 0x0501f8b0, 0x42006000, 0xffdfffff, 0x41786800, + 0x0501f8ac, 0x0505fc88, 0x05000010, 0x0505fc9c, + 0x0502000e, 0x4a035013, 0x0000aaaa, 0x4c040000, + 0x05e9ffb9, 0x59a8001f, 0x82000500, 0xffff0000, + 0x80040540, 0x4803501f, 0x5c000800, 0x64035014, + 0x0505fbec, 0x0501f005, 0x64175075, 0x60000001, + 0x05e9ff09, 0x05fdff3f, 0x1c01f000, 0x0501f809, + 0x42006000, 0xbf7f7fff, 0x41786800, 0x0501f091, + 0x42006000, 0xbf7f7fff, 0x41786800, 0x0501f08d, + 0x0505fc7f, 0x05020009, 0x59c40006, 0x82000540, + 0x000000f0, 0x48038806, 0x42006000, 0xbfffffff, + 0x41786800, 0x0501f883, 0x1c01f000, 0x40680800, + 0x800408d0, 0x59a80015, 0x8c000506, 0x05000006, + 0x59a8000f, 0x82000500, 0x000000ff, 0x80040540, + 0x0501f003, 0x82040540, 0x000000f7, 0x480388a7, + 0x1c01f000, 0x4807c856, 0x42000000, 0x0010b2b9, + 0x0531fb55, 0x60143000, 0x4d3c0000, 0x4c180000, + 0x60343000, 0x600a7800, 0x0501f037, 0x4807c856, + 0x42000000, 0x0010b2de, 0x0531fb4b, 0x60003000, + 0x4d3c0000, 0x4c180000, 0x603c3000, 0x61fc19ff, + 0x601c2000, 0x05f9ff3e, 0x5c003000, 0x59240200, + 0x84000556, 0x48024a00, 0x4d400000, 0x60aa8000, + 0x59240400, 0x8c00050a, 0x052c0c2e, 0x600a7800, + 0x05f1f8c0, 0x5c028000, 0x5c027800, 0x0005f45a, + 0x4807c856, 0x42000000, 0x0010b2dc, 0x0531fb32, + 0x600c3000, 0x4d3c0000, 0x4c180000, 0x60383000, + 0x600a7804, 0x0501f014, 0x4807c856, 0x42000000, + 0x0010b2db, 0x0531fb28, 0x60103000, 0x4d3c0000, + 0x4c180000, 0x60403000, 0x600a7804, 0x0501f00a, + 0x4807c856, 0x42000000, 0x0010b223, 0x0531fb1e, + 0x60043000, 0x4d3c0000, 0x4c180000, 0x60303000, + 0x600a7800, 0x61fc19ff, 0x601c2000, 0x4d200000, + 0x417a4000, 0x05f9ff0e, 0x5c024000, 0x5c003000, + 0x4d400000, 0x0531f97a, 0x60aa8000, 0x0201f800, + 0x0010edf3, 0x4c580000, 0x0531fc2c, 0x42000800, + 0x0010b391, 0x58040005, 0x82000500, 0x000000ff, + 0x48000805, 0x90040c0b, 0x8058b040, 0x05fe07fa, + 0x5c00b000, 0x5c028000, 0x5c027800, 0x1c01f000, + 0x4807c856, 0x05011000, 0x4a03c840, 0x0010af04, + 0x6503c842, 0x40000000, 0x05fd17ff, 0x42007800, + 0x0010af04, 0x64447800, 0x803c7800, 0x4a007800, + 0x220000ef, 0x4a007801, 0x000000ef, 0x4a007802, + 0x01380000, 0x64007803, 0x4a007804, 0xffffffff, + 0x64007805, 0x1c01f000, 0x40686000, 0x406c6800, + 0x59c400a3, 0x80300500, 0x80340540, 0x480388a3, + 0x1c01f000, 0x40686000, 0x4833c857, 0x59c400a3, + 0x80300540, 0x480388a3, 0x80300580, 0x480388a3, + 0x1c01f000, 0x4803c856, 0x05000003, 0x6407507d, + 0x0501f002, 0x497b507d, 0x1c01f000, 0x59c80002, + 0x80000540, 0x05000009, 0x80000040, 0x05000007, + 0x4a039005, 0x00000140, 0x60180000, 0x80000040, + 0x05fe07ff, 0x05fdf7f6, 0x1c01f000, 0x4c5c0000, + 0x4c600000, 0x59c4b805, 0x485fc856, 0x8c5c053a, + 0x05020004, 0x42000000, 0x0010b221, 0x0531fabe, + 0x4a038805, 0x20000000, 0x05edfa67, 0x4000c000, + 0x05edf9ad, 0x4a038805, 0x04000000, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x497a6a00, 0x0501fab7, + 0x4a026c00, 0x00000707, 0x497a6801, 0x497a6808, + 0x497a6809, 0x497a6806, 0x497a6807, 0x497a6c0b, + 0x497a680c, 0x59240400, 0x8c00050a, 0x05000005, + 0x5934080f, 0x59340010, 0x80040540, 0x05e20a4c, + 0x4a026a04, 0x00000100, 0x497a6a03, 0x59340402, + 0x82000500, 0x000000ff, 0x48026c02, 0x497a6c04, + 0x497a6a05, 0x497a6c05, 0x497a6811, 0x4d2c0000, + 0x5934000d, 0x49466c03, 0x80025d40, 0x05000003, + 0x05e1fde1, 0x497a680d, 0x5c025800, 0x599c0401, + 0x48026a0b, 0x599c0208, 0x48026c12, 0x4a02680a, + 0x00008000, 0x0505f03e, 0x60140000, 0x80000d80, + 0x0501f024, 0x0501fddd, 0x05020013, 0x59a8021b, + 0x8c00050a, 0x0502000d, 0x59340212, 0x82000500, + 0x0000ff00, 0x4803c857, 0x05000008, 0x59340a00, + 0x8c04051e, 0x000002ad, 0x60a40000, 0x60000820, + 0x492fc857, 0x0501f013, 0x492fc857, 0x60a00000, + 0x0501f00e, 0x8d0c0502, 0x05020003, 0x8d0c0500, + 0x05000003, 0x60100000, 0x0501f008, 0x60a40000, + 0x59340a00, 0x8c04051e, 0x05000004, 0x492fc857, + 0x60000820, 0x0501f003, 0x492fc857, 0x80000d80, + 0x4803c857, 0x80028540, 0x1c01f000, 0x490fc857, + 0x8d0c0500, 0x05fe07f0, 0x0501fd8d, 0x05fe07ea, + 0x59340200, 0x8c00050e, 0x05fc07e7, 0x0001f2ad, + 0x4d480000, 0x4d4c0000, 0x592e9009, 0x592e980a, + 0x0501fc59, 0x5c029800, 0x5c029000, 0x05fc07c7, + 0x0001f2b0, 0x492fc857, 0x592e8c07, 0x83440d80, + 0x000007fc, 0x05000004, 0x83440480, 0x000007f0, + 0x05021016, 0x592e4408, 0x0509fc07, 0x05000dcd, + 0x05020012, 0x0501fd83, 0x05020012, 0x0515fef6, + 0x05000019, 0x83200400, 0x0010a3b3, 0x50024800, + 0x4926601d, 0x59340002, 0x4802600b, 0x4936600a, + 0x492e6009, 0x642a6407, 0x61027000, 0x0005fc78, + 0x80000580, 0x0501f00b, 0x60a00000, 0x0501f008, + 0x0501fd86, 0x05fc07fd, 0x910c0d03, 0x05000003, + 0x60100000, 0x0501f002, 0x60a40000, 0x80000540, + 0x1c01f000, 0x60b00000, 0x05fdf7fd, 0x492fc857, + 0x592e4408, 0x4923c857, 0x0509fbe3, 0x592c4208, + 0x0500000a, 0x60380000, 0x59240a00, 0x8c040500, + 0x05000160, 0x90200d0f, 0x90040d88, 0x0502015d, + 0x90200d30, 0x0500015b, 0x592e8c07, 0x4947c857, + 0x83440c80, 0x00000800, 0x60280000, 0x05021155, + 0x4823c857, 0x9020050f, 0x0c01f001, 0x0010404e, + 0x001040c5, 0x00104108, 0x00104110, 0x00104118, + 0x0010404b, 0x0010404b, 0x0010404b, 0x00104122, + 0x0010416f, 0x0010418b, 0x0010404b, 0x0010404b, + 0x0010404b, 0x0010404b, 0x0010404b, 0x4803c857, + 0x60300000, 0x0501f13f, 0x592c1009, 0x82081500, + 0x00ffffff, 0x59240005, 0x80084d80, 0x60400000, + 0x05000138, 0x0501fcae, 0x0500002d, 0x4803c857, + 0x90004d9d, 0x05020016, 0x0005f8e2, 0x59340405, + 0x4c000000, 0x0501fd1a, 0x5c000000, 0x05000004, + 0x8c20050a, 0x05000022, 0x80000580, 0x44002800, + 0x59340008, 0x48002802, 0x59340009, 0x48002801, + 0x59340006, 0x48002804, 0x59340007, 0x48002803, + 0x6014b000, 0x0525fad9, 0x0501f141, 0x4803c857, + 0x90004d9a, 0x05020003, 0x40101000, 0x0501f11e, + 0x4803c857, 0x90004d9b, 0x05020003, 0x40181000, + 0x0501f119, 0x4803c857, 0x90004d9f, 0x0500011a, + 0x90004d9c, 0x05000118, 0x90004d99, 0x60280000, + 0x0500010c, 0x60280000, 0x0502011d, 0x59a8008d, + 0x8c000502, 0x05000016, 0x0501fcf1, 0x05000014, + 0x59340212, 0x82000500, 0x0000ff00, 0x60401000, + 0x0502000b, 0x60201000, 0x59a8021b, 0x8c000506, + 0x05020008, 0x59340002, 0x82000500, 0x00ff0000, + 0x82000580, 0x00ff0000, 0x05000005, 0x0501ff65, + 0x60700000, 0x40181000, 0x050200f7, 0x0515fe62, + 0x050000ff, 0x82200500, 0x00000100, 0x0501fc80, + 0x4926601d, 0x4936600a, 0x0525f820, 0x492e6009, + 0x64066407, 0x8c20050a, 0x05000004, 0x592c0405, + 0x8400055c, 0x48025c05, 0x4c200000, 0x4d3c0000, + 0x60027830, 0x0201f800, 0x0010ee7a, 0x5c027800, + 0x5c004000, 0x8c200512, 0x0500000b, 0x599c0018, + 0x8c000518, 0x05000008, 0x592c000a, 0x82000500, + 0x00000380, 0x5934080a, 0x80040d40, 0x84040d54, + 0x4806680a, 0x417a7800, 0x0501f8f5, 0x600c0800, + 0x0501f8fe, 0x600a7000, 0x0005fc78, 0x80000580, + 0x0501f0ee, 0x0501fd0b, 0x050200d9, 0x0501fcb6, + 0x05000009, 0x0501fcae, 0x050200d9, 0x4c600000, + 0x4178c000, 0x60027830, 0x417a6000, 0x05edfc2b, + 0x5c00c000, 0x59a8008d, 0x8c000502, 0x05000016, + 0x0501fca3, 0x05000014, 0x59340212, 0x82000500, + 0x0000ff00, 0x60401000, 0x0502000b, 0x60201000, + 0x59a8021b, 0x8c000506, 0x05020008, 0x59340002, + 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, + 0x05000005, 0x0501ff17, 0x60700000, 0x40181000, + 0x050200a9, 0x0515fe14, 0x050000b1, 0x5934080a, + 0x8c200512, 0x0500000c, 0x599c0018, 0x8c000518, + 0x05000009, 0x592c000a, 0x82000500, 0x00000380, + 0x82041500, 0xfffffc7f, 0x80080d40, 0x84040d54, + 0x0501f002, 0x84040d14, 0x4806680a, 0x4926601d, + 0x4936600a, 0x0521ffc5, 0x492e6009, 0x64066407, + 0x417a7800, 0x0501f8b2, 0x60140800, 0x0501f8bb, + 0x600e7000, 0x0005fc78, 0x80000580, 0x0501f0ab, + 0x0501fcc8, 0x05020096, 0x0501fc87, 0x05020098, + 0x0525f96f, 0x0500008e, 0x80000580, 0x0501f0a3, + 0x0501fcc0, 0x0502008e, 0x0501fc7f, 0x05020090, + 0x0521fc86, 0x05000086, 0x80000580, 0x0501f09b, + 0x0501fcb8, 0x05020086, 0x83444d80, 0x000007fe, + 0x60280000, 0x0502006f, 0x0525f971, 0x0500007c, + 0x80000580, 0x0501f091, 0xb0200530, 0x05020004, + 0x8c20050e, 0x60300000, 0x05020066, 0x8c20050a, + 0x0500000c, 0x4d3c0000, 0x600278a0, 0x8c20050e, + 0x05020003, 0x853e7d56, 0x853e7d1c, 0x82200500, + 0x000004a0, 0x0501fc11, 0x5c027800, 0x0501f07c, + 0x8c200508, 0x0502001e, 0x592c1009, 0x82081500, + 0x00ffffff, 0x59240005, 0x80084d80, 0x60400000, + 0x05000050, 0x0501fbc6, 0x05000024, 0x4803c857, + 0x90004d9a, 0x05020003, 0x40101000, 0x0501f04e, + 0x4803c857, 0x90004d9b, 0x05020003, 0x40181000, + 0x0501f049, 0x4803c857, 0x90004d9f, 0x0500004a, + 0x90004d9c, 0x05000048, 0x90004d99, 0x60280000, + 0x0500003c, 0x60280000, 0x0501f04d, 0x0501fc7d, + 0x0502004b, 0x4d3c0000, 0x600278a0, 0x8c20050e, + 0x05020003, 0x853e7d56, 0x853e7d1c, 0x82200500, + 0x00000090, 0x0501fbd0, 0x5c027800, 0x60280000, + 0x0502002c, 0x0501f04e, 0x916c0583, 0x601c0800, + 0x05020005, 0x0525f8ce, 0x05000006, 0x80000580, + 0x0501f04a, 0x0501fc4c, 0x05000042, 0x0501f044, + 0x0501fc49, 0x0500002e, 0x0501f041, 0x0501fc61, + 0x0502002f, 0x916c0583, 0x05020036, 0x8c200508, + 0x05000008, 0x4c600000, 0x4178c000, 0x60027830, + 0x417a6000, 0x05edfb81, 0x5c00c000, 0x0501f034, + 0x0501fc01, 0x05000009, 0x0501fbf9, 0x05020024, + 0x4c600000, 0x4178c000, 0x60027830, 0x417a6000, + 0x05edfb76, 0x5c00c000, 0x480bc856, 0x0521ff4d, + 0x05000013, 0x80000580, 0x0501f028, 0x05fdf7e4, + 0x480bc857, 0x60640800, 0x40001000, 0x6008b000, + 0x0501f008, 0x480bc857, 0x40000800, 0x6008b000, + 0x0501f004, 0x480bc857, 0x40000800, 0x6004b000, + 0x480bc857, 0x60c68000, 0x0501f017, 0x480bc857, + 0x600c0800, 0x6004b000, 0x05fdf7fa, 0x480bc857, + 0x60280800, 0x6004b000, 0x05fdf7f6, 0x480bc857, + 0x60240800, 0x40001000, 0x6008b000, 0x05fdf7f1, + 0x480bc857, 0x601c0800, 0x6004b000, 0x05fdf7ed, + 0x480bc857, 0x6004b000, 0x05fdf7ea, 0x80028580, + 0x4178b000, 0x90000541, 0x1c01f000, 0x4937c857, + 0x5932680a, 0x59341200, 0x813e79c0, 0x05000003, + 0x84081540, 0x0501f002, 0x84081500, 0x480a6a00, + 0x1c01f000, 0x40680800, 0x5932680a, 0x5c000000, + 0x4c000000, 0x4803c857, 0x4937c857, 0x83340580, + 0x0010ce8f, 0x0500001f, 0x90040586, 0x05020003, + 0x6018000c, 0x0501f014, 0x90040584, 0x05020003, + 0x60100008, 0x0501f010, 0x90040587, 0x601c000e, + 0x0500000d, 0x90040583, 0x600c000e, 0x0500000a, + 0x90040585, 0x60140008, 0x05000007, 0x90040589, + 0x60240008, 0x05000004, 0x9004058b, 0x602c000e, + 0x05e20813, 0x4803c857, 0x48026c00, 0x90040d86, + 0x05020004, 0x59341404, 0x800811c0, 0x05e0080c, + 0x1c01f000, 0x40683000, 0x0501f805, 0x41358800, + 0x05000002, 0x41798800, 0x1c01f000, 0x5c000000, + 0x4c000000, 0x4803c857, 0x4947c857, 0x481bc857, + 0x83440480, 0x00000800, 0x05021055, 0x83200400, + 0x0010a3b3, 0x50024800, 0x59240009, 0x83441480, + 0x000007f0, 0x05001003, 0x80081400, 0x0501f003, + 0x83441400, 0x0010a600, 0x50080000, 0x80026d40, + 0x05000005, 0x59340013, 0x80000130, 0x81200580, + 0x05000016, 0x4c180000, 0x4d2c0000, 0x05e1fb62, + 0x412e6800, 0x5c025800, 0x5c003000, 0x0500003c, + 0x59242005, 0x812000f0, 0x80102540, 0x48126813, + 0x59242207, 0x80102000, 0x48124a07, 0x45341000, + 0x497a680d, 0x497a6810, 0x497a680f, 0x4c180000, + 0x05fdfd7a, 0x5c003000, 0x59340a12, 0x4c040000, + 0x0505f916, 0x5c000800, 0x05000009, 0x82180500, + 0x00ffff00, 0x05000008, 0x59a8100f, 0x82081500, + 0x00ffff00, 0x80080580, 0x05000003, 0x80000580, + 0x0501f004, 0x82180500, 0x000000ff, 0x800000d0, + 0x80040d80, 0x05000003, 0x4803c857, 0x48026a12, + 0x59340813, 0x59242005, 0x812000f0, 0x80102540, + 0x40040000, 0x80100580, 0x05000003, 0x4813c857, + 0x48126813, 0x83440580, 0x000007fe, 0x05020004, + 0x4a026802, 0x00fffffe, 0x0501f006, 0x59340002, + 0x80180580, 0x05000003, 0x481bc857, 0x481a6802, + 0x0501f806, 0x80000580, 0x1c01f000, 0x4803c856, + 0x90000541, 0x05fdf7fd, 0x59341200, 0x84081508, + 0x5934000a, 0x8c00050c, 0x0502000b, 0x599c0018, + 0x8c000510, 0x05000009, 0x59a80006, 0x8c00050a, + 0x05000005, 0x59340c03, 0x82040480, 0x000007f0, + 0x05001002, 0x84081548, 0x480a6a00, 0x1c01f000, + 0x4947c857, 0x83440480, 0x00000800, 0x05021018, + 0x83200400, 0x0010a3b3, 0x50024800, 0x59240009, + 0x83441480, 0x000007f0, 0x05001003, 0x80081400, + 0x0501f003, 0x83441400, 0x0010a600, 0x50080000, + 0x80026d40, 0x05000009, 0x0501fb09, 0x05020008, + 0x8d0c0502, 0x05000004, 0x59340200, 0x8c00050e, + 0x05000003, 0x90000541, 0x1c01f000, 0x80000580, + 0x05fdf7fe, 0x5c000000, 0x4c000000, 0x4803c857, + 0x4947c857, 0x0501f805, 0x60058800, 0x05000002, + 0x60018800, 0x1c01f000, 0x4d2c0000, 0x4d300000, + 0x83440480, 0x00000800, 0x0502101d, 0x83441400, + 0x0010a600, 0x50080000, 0x80026d40, 0x05000014, + 0x45781000, 0x5934000d, 0x80025d40, 0x05e20b06, + 0x59366011, 0x813261c0, 0x0500000a, 0x4c640000, + 0x5930c800, 0x59325809, 0x0521fa5d, 0x05e20afe, + 0x0005fc5a, 0x90666540, 0x05fe07fa, 0x5c00c800, + 0x0501fd5f, 0x41365800, 0x05e1faef, 0x80000580, + 0x5c026000, 0x5c025800, 0x1c01f000, 0x90000541, + 0x05fdf7fc, 0x0001fae7, 0x41358800, 0x05000002, + 0x41798800, 0x1c01f000, 0x4c580000, 0x59cc0001, + 0x4937c857, 0x82000500, 0x00ffffff, 0x48026802, + 0x497a6c01, 0x497a6a01, 0x59340200, 0x82000500, + 0xffffdffd, 0x48026a00, 0x4004b000, 0x0505f87b, + 0x05020012, 0x59340403, 0x82000580, 0x000007fe, + 0x05000005, 0x59a8021b, 0x8c00050a, 0x0502000b, + 0x0501f008, 0x59cc0408, 0x8c000518, 0x05000007, + 0x59cc0009, 0x4803502c, 0x59cc000a, 0x4803502d, + 0x8058b1c0, 0x05020001, 0x59cc0a09, 0x90040d10, + 0x59cc0408, 0x90000520, 0x05000005, 0x84040d40, + 0x59a8121b, 0x8408155a, 0x480b521b, 0x5934000a, + 0x82000500, 0xffffffee, 0x80040540, 0x4802680a, + 0x91cca40b, 0x9134ac06, 0x6008b000, 0x0531f835, + 0x91cca40d, 0x9134ac08, 0x6008b000, 0x0531f831, + 0x59a8208c, 0x82100d00, 0x0000f000, 0x82040d80, + 0x00003000, 0x05020017, 0x59cc0013, 0x8c00053e, + 0x05000014, 0x59cc0414, 0x599c0818, 0x8c040512, + 0x0500000e, 0x8c00051e, 0x05000005, 0x59340200, + 0x84000546, 0x84000544, 0x48026a00, 0x59cc0213, + 0x8c000516, 0x05000005, 0x59340200, 0x8400054c, + 0x84000544, 0x48026a00, 0x59cc0a14, 0x0501f005, + 0x59340200, 0x84000508, 0x48026a00, 0x59cc0a18, + 0x59a80006, 0x8c00050c, 0x05020013, 0x82040480, + 0x00000800, 0x0502100a, 0x82040480, 0x00000400, + 0x05001003, 0x60000808, 0x0501f005, 0x82040480, + 0x00000200, 0x05001002, 0x60000804, 0x42001000, + 0x0010aefa, 0x58080201, 0x80041480, 0x05001002, + 0x40000800, 0x48066a04, 0x59340403, 0x82000580, + 0x000007fe, 0x05020003, 0x59cc0a08, 0x48066a04, + 0x0501fcff, 0x5c00b000, 0x1c01f000, 0x59a8021b, + 0x4937c857, 0x8c000508, 0x05000007, 0x84000556, + 0x4803c857, 0x4803521b, 0x42001000, 0x0010f866, + 0x050df9c0, 0x59cc0207, 0x4803c857, 0x48026a05, + 0x59cc020a, 0x4803c857, 0x48026c05, 0x59341200, + 0x599c0818, 0x5934180a, 0x4807c857, 0x480bc857, + 0x480fc857, 0x59cc2006, 0x82102500, 0xff000000, + 0x82102580, 0x02000000, 0x05000007, 0x8c00050e, + 0x05000009, 0x8c0c0514, 0x05000003, 0x8c0c050e, + 0x05000005, 0x8c040518, 0x05000003, 0x8408154a, + 0x0501f002, 0x8408150a, 0x8c000510, 0x05000009, + 0x8c0c0514, 0x05000003, 0x8c0c0510, 0x05000005, + 0x8c040518, 0x05000003, 0x8408154e, 0x0501f002, + 0x8408150e, 0x8c000512, 0x05000009, 0x8c0c0514, + 0x05000003, 0x8c0c0512, 0x05000005, 0x8c040518, + 0x05000003, 0x8408155c, 0x0501f002, 0x8408151c, + 0x480a6a00, 0x1c01f000, 0x4803c856, 0x4c5c0000, + 0x4d2c0000, 0x4c580000, 0x5934000d, 0x80025d40, + 0x05000023, 0x592c0003, 0x90000488, 0x0500100a, + 0x412cb800, 0x592c0001, 0x80025d40, 0x05fe07fa, + 0x05e1fa10, 0x0500002e, 0x492fc857, 0x492cb801, + 0x0501f01b, 0x912c0c04, 0x6020b000, 0x50040000, + 0x82000580, 0xffffffff, 0x05020006, 0x80041000, + 0x50080000, 0x82000580, 0xffffffff, 0x05000005, + 0x90040c02, 0x8058b040, 0x05fe07f5, 0x05ddfe70, + 0x45480800, 0x454c1000, 0x592c1803, 0x800c1800, + 0x480e5803, 0x480fc857, 0x0501f010, 0x05e1f9f5, + 0x05000013, 0x492fc857, 0x492e680d, 0x497a5802, + 0x64065803, 0x494a5804, 0x494e5805, 0x912c0c06, + 0x6038b000, 0x46000800, 0xffffffff, 0x80040800, + 0x8058b040, 0x05fe07fc, 0x90000541, 0x5c00b000, + 0x5c025800, 0x5c00b800, 0x1c01f000, 0x80000580, + 0x05fdf7fb, 0x4803c856, 0x4d3c0000, 0x4d2c0000, + 0x5934000d, 0x80025d40, 0x0500001c, 0x592c0002, + 0x80000540, 0x0502001c, 0x412e7800, 0x0501f8a6, + 0x05020019, 0x46000800, 0xffffffff, 0x46001000, + 0xffffffff, 0x4813c857, 0x480fc857, 0x580c0003, + 0x90000c82, 0x05021012, 0x480fc857, 0x400c0000, + 0x812c0580, 0x05020004, 0x580c0001, 0x4802680d, + 0x0501f003, 0x580c0001, 0x48002001, 0x400e5800, + 0x05e1f9d0, 0x90000541, 0x5c025800, 0x5c027800, + 0x1c01f000, 0x80000580, 0x05fdf7fc, 0x80000040, + 0x48001803, 0x4803c857, 0x05fdf7f7, 0x64225a07, + 0x0001f35b, 0x64a65a07, 0x0001f35b, 0x64aa5a07, + 0x0001f35b, 0x64a25a07, 0x0001f35b, 0x643a5a07, + 0x0001f35b, 0x4943c857, 0x4d440000, 0x4d340000, + 0x4d2c0000, 0x4c580000, 0x61c0b00f, 0x417a8800, + 0x0001fae7, 0x05020007, 0x8d3c0506, 0x05000004, + 0x59340200, 0x8c00050e, 0x05020002, 0x0501f811, + 0x81468800, 0x8058b040, 0x05fe07f6, 0x83440480, + 0x00000800, 0x05021006, 0x8d3c0502, 0x05000004, + 0x61c2880f, 0x6040b000, 0x05fdf7ee, 0x5c00b000, + 0x5c025800, 0x5c026800, 0x5c028800, 0x1c01f000, + 0x4d2c0000, 0x4c600000, 0x4c5c0000, 0x4178b800, + 0x5936580f, 0x812e59c0, 0x0500002b, 0x592c0205, + 0x82000500, 0x000000ff, 0x90000592, 0x05000023, + 0xb00005a0, 0x05000021, 0x90000588, 0x0500001f, + 0x8d3c0500, 0x05000003, 0x0501f845, 0x0502001b, + 0x592cc000, 0x497a5800, 0x805cb9c0, 0x05020009, + 0x59340010, 0x812c0580, 0x05020004, 0x497a680f, + 0x497a6810, 0x0501f008, 0x4862680f, 0x0501f006, + 0x4860b800, 0x59340010, 0x812c0580, 0x05020002, + 0x485e6810, 0x0001ff6c, 0x4a025a05, 0x00000103, + 0x49425a07, 0x497a580a, 0x0521fa3d, 0x0001fb5b, + 0x40625800, 0x05fdf7d8, 0x412cb800, 0x592e5800, + 0x05fdf7d5, 0x5c00b800, 0x5c00c000, 0x5c025800, + 0x1c01f000, 0x4803c856, 0x41781800, 0x5934000f, + 0x80025d40, 0x05000018, 0x592c0006, 0x80200580, + 0x592c0000, 0x05000003, 0x412c1800, 0x05fdf7f9, + 0x592c0a05, 0x82040d00, 0x000000ff, 0x90040d92, + 0x05fc07fa, 0xb0040da0, 0x05fc07f8, 0x90040d88, + 0x05fc07f6, 0x497a5800, 0x800c19c0, 0x05000007, + 0x48001800, 0x80000540, 0x05020003, 0x480e6810, + 0x90000541, 0x1c01f000, 0x4802680f, 0x80000540, + 0x05fe07fd, 0x497a6810, 0x05fdf7fa, 0x592c0009, + 0x81480580, 0x05020003, 0x592c000a, 0x814c0580, + 0x1c01f000, 0x4803c856, 0x4c580000, 0x413c1800, + 0x400c2000, 0x593c0002, 0x80000540, 0x05020014, + 0x6020b000, 0x900c0c04, 0x50040000, 0x81480580, + 0x05020005, 0x80041000, 0x50080000, 0x814c0580, + 0x0500000b, 0x90040c02, 0x8058b040, 0x05fe07f7, + 0x400c2000, 0x580c0001, 0x80001d40, 0x05fe07f1, + 0x90000541, 0x5c00b000, 0x1c01f000, 0x80000580, + 0x05fdf7fd, 0x4937c857, 0x4c580000, 0x4d2c0000, + 0x5934000d, 0x80025d40, 0x05020011, 0x05e1f90d, + 0x0500000c, 0x492e680d, 0x64065802, 0x497a5803, + 0x912c0c04, 0x6040b000, 0x46000800, 0xffffffff, + 0x80040800, 0x8058b040, 0x05fe07fc, 0x90000541, + 0x5c025800, 0x5c00b000, 0x1c01f000, 0x4d2c0000, + 0x592e5801, 0x05e1f914, 0x5c025800, 0x497a5801, + 0x05fdf7ee, 0x4d2c0000, 0x5936580d, 0x812e59c0, + 0x05000005, 0x4937c857, 0x497a680d, 0x05e1f90a, + 0x90000541, 0x5c025800, 0x1c01f000, 0x59340405, + 0x4937c857, 0x4803c857, 0x8c000508, 0x1c01f000, + 0x4933c857, 0x5930380a, 0x581c0200, 0x8400051a, + 0x48003a00, 0x1c01f000, 0x4933c857, 0x5930000a, + 0x50000000, 0x8c000508, 0x1c01f000, 0x0501f805, 0x60058800, 0x05020002, 0x60018800, 0x1c01f000, - 0x4d340000, 0x4c580000, 0x59a80a1b, 0x8c040506, - 0x05000014, 0x052dfcb9, 0x42000800, 0x0010b111, - 0x58041009, 0x9008040e, 0x50026800, 0x813669c0, - 0x05000008, 0x58040200, 0x90000503, 0x90000583, - 0x05020004, 0x59340200, 0x8c00051a, 0x05020005, - 0x90040c0b, 0x8058b040, 0x05fe07f2, 0x80000580, - 0x5c00b000, 0x5c026800, 0x1c01f000, 0x4937c857, - 0x493fc857, 0x59341200, 0x813e79c0, 0x05000003, - 0x8408155e, 0x0501f002, 0x8408151e, 0x480a6a00, - 0x1c01f000, 0x4937c857, 0x05edf93e, 0x05000005, - 0x59a8082c, 0x42001000, 0x00104421, 0x050df83d, - 0x1c01f000, 0x4937c857, 0x42001000, 0x00104421, - 0x0509ff02, 0x59a8121b, 0x84081512, 0x480b521b, - 0x1c01f000, 0x4008d000, 0x4020d800, 0x909d3c84, - 0x409ce000, 0x0201f800, 0x0010f7c4, 0x589c0000, - 0x589c2001, 0x589c2802, 0x589c3003, 0x909d3c04, - 0x800001c0, 0x1c01f000, 0x4d340000, 0x406a6800, - 0x0501f803, 0x5c026800, 0x1c01f000, 0x5934000f, - 0x8d0c0512, 0x05020005, 0x5934140b, 0x80081040, - 0x05001002, 0x480a6c0b, 0x80000540, 0x00020af4, - 0x1c01f000, 0x59340a00, 0x84040d08, 0x80000540, - 0x05000005, 0x5934000a, 0x8400054c, 0x4802680a, - 0x0501f004, 0x599c0018, 0x8c000510, 0x05000002, - 0x84040d48, 0x48066a00, 0x1c01f000, 0x4803c857, - 0x4947c857, 0x4c300000, 0x90006530, 0x05000005, - 0x4c000000, 0x0521fb6e, 0x5c000000, 0x0502000b, - 0x8c00050e, 0x05000006, 0x0501f896, 0x05020007, - 0x4937c857, 0x41240800, 0x0501f8a9, 0x80000580, - 0x5c006000, 0x1c01f000, 0x90000541, 0x05fdf7fd, - 0x4803c857, 0x4c580000, 0x4d440000, 0x40001000, - 0x80000d80, 0x61c0b00f, 0x4c040000, 0x40068800, - 0x4c080000, 0x40080000, 0x05fdffe3, 0x5c001000, - 0x5c000800, 0x80040800, 0x8058b040, 0x05fe07f7, - 0x8c080514, 0x05000005, 0x84081514, 0x6004b000, - 0x61f0080f, 0x05fdf7f1, 0x4d300000, 0x4d400000, - 0x4d240000, 0x61fe89ff, 0x42026000, 0x00110284, - 0x497a600a, 0x417a4800, 0x4926601d, 0x60a68000, - 0x050dfaf5, 0x4df00000, 0x0201f800, 0x0010f051, - 0x0201f800, 0x0010f603, 0x5c03e000, 0x050c0ada, + 0x5930000a, 0x50000000, 0x4933c857, 0x4803c857, + 0x8c00050e, 0x1c01f000, 0x5930000a, 0x50000000, + 0x8c00050a, 0x1c01f000, 0x0501f805, 0x60058800, + 0x05000002, 0x60018800, 0x1c01f000, 0x4933c856, + 0x0501f8d4, 0x05000005, 0x59340400, 0x82000d00, + 0x000000ff, 0x90041585, 0x1c01f000, 0x4803c856, + 0x59a80a1b, 0x8c040506, 0x0500000a, 0x5930081d, + 0x58040200, 0x8c000500, 0x05000006, 0x58040009, + 0x9000040e, 0x50000800, 0x58040200, 0x8c00051a, + 0x1c01f000, 0x0501f805, 0x60058800, 0x05020002, + 0x60018800, 0x1c01f000, 0x4d340000, 0x4c580000, + 0x59a80a1b, 0x8c040506, 0x05000014, 0x052dfe8f, + 0x42000800, 0x0010b391, 0x58041009, 0x9008040e, + 0x50026800, 0x813669c0, 0x05000008, 0x58040200, + 0x90000503, 0x90000583, 0x05020004, 0x59340200, + 0x8c00051a, 0x05020005, 0x90040c0b, 0x8058b040, + 0x05fe07f2, 0x80000580, 0x5c00b000, 0x5c026800, + 0x1c01f000, 0x4937c857, 0x493fc857, 0x59341200, + 0x813e79c0, 0x05000003, 0x8408155e, 0x0501f002, + 0x8408151e, 0x480a6a00, 0x1c01f000, 0x4937c857, + 0x05edf869, 0x05000005, 0x59a8082c, 0x42001000, + 0x001044fb, 0x050df925, 0x1c01f000, 0x4937c857, + 0x42001000, 0x001044fb, 0x0509ffea, 0x59a8121b, + 0x84081512, 0x480b521b, 0x1c01f000, 0x4008d000, + 0x4020d800, 0x909d3c84, 0x409ce000, 0x0201f800, + 0x0010f9c3, 0x589c0000, 0x589c2001, 0x589c2802, + 0x589c3003, 0x909d3c04, 0x800001c0, 0x1c01f000, + 0x4d340000, 0x406a6800, 0x0501f803, 0x5c026800, + 0x1c01f000, 0x5934000f, 0x8d0c0512, 0x05020005, + 0x5934140b, 0x80081040, 0x05001002, 0x480a6c0b, + 0x80000540, 0x00020af4, 0x1c01f000, 0x59340a00, + 0x84040d08, 0x80000540, 0x05000005, 0x5934000a, + 0x8400054c, 0x4802680a, 0x0501f004, 0x599c0018, + 0x8c000510, 0x05000002, 0x84040d48, 0x48066a00, + 0x1c01f000, 0x4803c857, 0x4947c857, 0x4c300000, + 0x90006530, 0x05000005, 0x4c000000, 0x0521fc75, + 0x5c000000, 0x0502000b, 0x8c00050e, 0x05000006, + 0x0501f898, 0x05020007, 0x4937c857, 0x41240800, + 0x0501f8ab, 0x80000580, 0x5c006000, 0x1c01f000, + 0x90000541, 0x05fdf7fd, 0x4803c857, 0x4c580000, + 0x4d440000, 0x40001000, 0x80000d80, 0x61c0b00f, + 0x4c040000, 0x40068800, 0x4c080000, 0x40080000, + 0x05fdffe3, 0x5c001000, 0x5c000800, 0x80040800, + 0x8058b040, 0x05fe07f7, 0x8c080514, 0x05000005, + 0x84081514, 0x6004b000, 0x61f0080f, 0x05fdf7f1, + 0x4d300000, 0x4d400000, 0x4d240000, 0x0501fb1f, + 0x61fe89ff, 0x42026000, 0x001104b4, 0x4a02600a, + 0x0010ce8f, 0x417a4800, 0x4926601d, 0x60a68000, + 0x050dfbdb, 0x4df00000, 0x0201f800, 0x0010f260, + 0x0201f800, 0x0010f7f5, 0x5c03e000, 0x050c0bc0, 0x5c024800, 0x5c028000, 0x5c026000, 0x5c028800, 0x5c00b000, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, 0x4c5c0000, @@ -17183,1043 +17292,1073 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x1c01f000, 0x4c040000, 0x4c080000, 0x592c0208, 0x8c00050c, 0x0500000d, 0x592e8c07, 0x82000500, 0x00000080, 0x84000548, 0x4d3c0000, 0x60027820, - 0x05fdff6f, 0x5c027800, 0x90000541, 0x5c001000, + 0x05fdff6d, 0x5c027800, 0x90000541, 0x5c001000, 0x5c000800, 0x1c01f000, 0x80000580, 0x05fdf7fc, - 0x59340013, 0x80024130, 0x83224c00, 0x0010a0ec, - 0x51264800, 0x812649c0, 0x05dc0cfd, 0x1c01f000, + 0x59340013, 0x80024130, 0x83224c00, 0x0010a3b3, + 0x51264800, 0x812649c0, 0x05dc0c21, 0x1c01f000, 0x83440c80, 0x00000800, 0x05021013, 0x83200400, - 0x0010a0ec, 0x50024800, 0x59240009, 0x83440c80, + 0x0010a3b3, 0x50024800, 0x59240009, 0x83440c80, 0x000007f0, 0x05001003, 0x80040c00, 0x0501f003, - 0x83440c00, 0x0010a380, 0x50040000, 0x80026d40, + 0x83440c00, 0x0010a600, 0x50040000, 0x80026d40, 0x05000005, 0x59340013, 0x80000130, 0x81200580, 0x1c01f000, 0x90000541, 0x05fdf7fe, 0x4937c857, 0x4c580000, 0x4d440000, 0x59368c03, 0x83441480, - 0x000007f0, 0x05021003, 0x05fdfc91, 0x0501f00b, + 0x000007f0, 0x05021003, 0x05fdfc8b, 0x0501f00b, 0x58040009, 0x80080c00, 0x50040000, 0x81340580, - 0x05de0cd7, 0x4d2c0000, 0x45780800, 0x41365800, - 0x05e1f870, 0x5c025800, 0x80000580, 0x5c028800, + 0x05de0bfb, 0x4d2c0000, 0x45780800, 0x41365800, + 0x05ddff94, 0x5c025800, 0x80000580, 0x5c028800, 0x5c00b000, 0x1c01f000, 0x592c040c, 0x82000500, 0x0000e000, 0x82000580, 0x00006000, 0x0500001f, - 0x916c0583, 0x05000011, 0x916c0582, 0x050200f1, + 0x916c0583, 0x05000011, 0x916c0582, 0x050200f4, 0x59a8021b, 0x90000d38, 0x05020005, 0x59a80813, - 0x800409c0, 0x05000009, 0x0501f0ea, 0x90000d03, - 0x90040d83, 0x050200e7, 0x90000d28, 0x05020003, - 0x8c00050c, 0x050000e3, 0x592e4408, 0x83224500, - 0x000000ff, 0x0505fd53, 0x050200be, 0x592c100b, - 0x82080500, 0xff000000, 0x050200c6, 0x59240005, - 0x80080580, 0x050000c1, 0x592c0c0c, 0x82040d00, - 0x0000e000, 0x82040480, 0x00008000, 0x050210bf, - 0x592e8c07, 0x83440480, 0x00000800, 0x05001013, - 0x83440580, 0x0000ffff, 0x050200a8, 0x800409c0, - 0x050200e0, 0x592c240a, 0x82100500, 0xffffff00, - 0x050200ac, 0x480bc857, 0x4813c857, 0x592c000e, - 0x82000480, 0x00000841, 0x050210ae, 0x614e7000, - 0x417a6800, 0x0501f084, 0x800409c0, 0x050200d1, - 0x41784000, 0x05fdfec4, 0x050200be, 0x59342204, - 0x592c000e, 0x80100480, 0x050010a2, 0x614e7000, - 0x592c240a, 0x82100500, 0xffffff00, 0x05020095, - 0x4813c857, 0x592c0408, 0x82000500, 0x0000f000, - 0x82000580, 0x00003000, 0x05020006, 0x59340200, - 0x8c000508, 0x05020003, 0x90100583, 0x05020083, - 0x592c000d, 0x800001c0, 0x05000065, 0x90100584, - 0x05000082, 0xb0100591, 0x05000080, 0x90100583, - 0x0500000f, 0x901005a0, 0x05000039, 0x901005a4, - 0x05000033, 0x901005a1, 0x05000033, 0xb0100590, - 0x0500002b, 0xb0100592, 0x05000027, 0x90100585, - 0x05020055, 0x60067000, 0x0501f018, 0x600a7000, - 0x59a8008d, 0x8c000502, 0x05000014, 0x05fdff04, + 0x800409c0, 0x05000009, 0x0501f0ed, 0x90000d03, + 0x90040d83, 0x050200ea, 0x90000d28, 0x05020003, + 0x8c00050c, 0x050000e6, 0x592e4408, 0x83224500, + 0x000000ff, 0x0505fdf0, 0x050200c1, 0x592c100b, + 0x82080500, 0xff000000, 0x050200c9, 0x59240005, + 0x80080580, 0x050000c4, 0x592c0c0c, 0x82040d00, + 0x0000e000, 0x82040480, 0x00008000, 0x050210c2, + 0x592e8c07, 0x83440480, 0x00000800, 0x05001015, + 0x83440580, 0x0000ffff, 0x050200ab, 0x800409c0, + 0x050200e3, 0x592c240a, 0x82100500, 0xffffff00, + 0x050200af, 0x480bc857, 0x4813c857, 0x592c000e, + 0x82000480, 0x00000841, 0x050210b1, 0x614e7000, + 0x0501fa3e, 0x42026800, 0x0010ce8f, 0x0501f084, + 0x800409c0, 0x050200d2, 0x41784000, 0x05fdfec0, + 0x050200bf, 0x59342204, 0x592c000e, 0x80100480, + 0x050010a3, 0x614e7000, 0x592c240a, 0x82100500, + 0xffffff00, 0x05020096, 0x4813c857, 0x592c0408, + 0x82000500, 0x0000f000, 0x82000580, 0x00003000, + 0x05020006, 0x59340200, 0x8c000508, 0x05020003, + 0x90100583, 0x05020084, 0x592c000d, 0x800001c0, + 0x05000065, 0x90100584, 0x05000083, 0xb0100591, + 0x05000081, 0x90100583, 0x0500000f, 0x901005a0, + 0x05000039, 0x901005a4, 0x05000033, 0x901005a1, + 0x05000033, 0xb0100590, 0x0500002b, 0xb0100592, + 0x05000027, 0x90100585, 0x05020055, 0x60067000, + 0x0501f018, 0x600a7000, 0x59a8008d, 0x8c000502, + 0x05000014, 0x05fdff02, 0x05000012, 0x59340212, + 0x82000500, 0x0000ff00, 0x60401000, 0x0502000b, + 0x59a8021b, 0x8c000506, 0x0502005b, 0x60201000, + 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, + 0x00ff0000, 0x05000003, 0x0501f976, 0x05020052, + 0x0515f875, 0x05000068, 0x64426407, 0x4926601d, + 0x4936600a, 0x600c0800, 0x91380582, 0x05000002, + 0x602c0800, 0x05fdfb2d, 0x0501f036, 0x60027000, + 0x0501f002, 0x60127000, 0x05fdfefb, 0x0502005f, + 0x0501f02b, 0x60ce7000, 0x0501f004, 0x60167000, + 0x0501f002, 0x600e7000, 0x05fdfeea, 0x05020057, + 0x59a8008d, 0x8c000502, 0x05000014, 0x05fdfed4, 0x05000012, 0x59340212, 0x82000500, 0x0000ff00, 0x60401000, 0x0502000b, 0x59a8021b, 0x8c000506, - 0x0502005a, 0x60201000, 0x59340002, 0x82000500, + 0x0502002d, 0x60201000, 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, 0x05000003, - 0x0501f975, 0x05020051, 0x0511ff9b, 0x05000067, - 0x64426407, 0x4926601d, 0x4936600a, 0x600c0800, - 0x91380582, 0x05000002, 0x602c0800, 0x05fdfb38, - 0x0501f036, 0x60027000, 0x0501f002, 0x60127000, - 0x05fdfefd, 0x0502005e, 0x0501f02b, 0x60ce7000, - 0x0501f004, 0x60167000, 0x0501f002, 0x600e7000, - 0x05fdfeec, 0x05020056, 0x59a8008d, 0x8c000502, - 0x05000014, 0x05fdfed6, 0x05000012, 0x59340212, - 0x82000500, 0x0000ff00, 0x60401000, 0x0502000b, - 0x59a8021b, 0x8c000506, 0x0502002c, 0x60201000, - 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, - 0x00ff0000, 0x05000003, 0x0501f947, 0x05020023, - 0x0511ff6d, 0x05000039, 0x64426407, 0x4926601d, - 0x4936600a, 0x60140800, 0x91380583, 0x05000002, - 0x60240800, 0x05fdfb0a, 0x0501f008, 0x90102591, - 0x0502002a, 0x0511ff60, 0x0500002c, 0x64426407, - 0x4926601d, 0x4936600a, 0x0521fbc0, 0x492e6009, - 0x49325809, 0x813669c0, 0x05000007, 0x592c0c0c, - 0x8c040518, 0x05000004, 0x59340200, 0x84000514, - 0x48026a00, 0x0005fc78, 0x80000580, 0x1c01f000, - 0x90000541, 0x05fdf7fe, 0x60281000, 0x0501f014, - 0x60381000, 0x0501f012, 0x603c1000, 0x0501f010, - 0x60401000, 0x0501f00e, 0x60581000, 0x0501f00c, - 0x605c1000, 0x0501f00a, 0x60601000, 0x0501f008, - 0x606c1000, 0x0501f006, 0x60781000, 0x0501f004, - 0x60901000, 0x0501f002, 0x60801000, 0x60640800, - 0x60c68000, 0x05fdf7e7, 0x600c0800, 0x0501f002, - 0x60280800, 0x41781000, 0x05fdf7fa, 0x60240800, - 0x59341400, 0x05fdf7f7, 0x60228000, 0x0501f004, - 0x601c0800, 0x416c1000, 0x05fdf7f2, 0x41780800, - 0x41781000, 0x05fdf7d7, 0x60028000, 0x05fdf7fc, - 0x90004d9d, 0x05dc0bca, 0x90004d9a, 0x05020004, - 0x40101000, 0x40000800, 0x05fdf7e6, 0x90004d9b, - 0x05020003, 0x40181000, 0x05fdf7fb, 0x90004d9c, - 0x05fc07f9, 0x90004d99, 0x05fc07c8, 0x05fdf7e1, - 0x592e6009, 0x0521f986, 0x05fc07ca, 0x59300c07, - 0x90040591, 0x05fe07e1, 0x592c0c0c, 0x82041500, - 0x0000e000, 0x82080580, 0x00006000, 0x05000021, - 0x83440580, 0x0000ffff, 0x05020005, 0x5932680a, - 0x813669c0, 0x0500000e, 0x05fdf7d4, 0x592c100b, - 0x82081500, 0x00ffffff, 0x41784000, 0x05fdfdde, - 0x05fe07d8, 0x5930000a, 0x800001c0, 0x05000003, - 0x81340580, 0x05fe07c9, 0x4936600a, 0x61000810, - 0x813669c0, 0x05000002, 0x59340a04, 0x592c000e, - 0x80040480, 0x05fc17b3, 0x59300a03, 0x90040587, - 0x05fe07be, 0x492e6009, 0x61527000, 0x05fdf78e, - 0x0529ff31, 0x05fc07c1, 0x05fdf7b8, 0x492fc857, - 0x592e6009, 0x83300580, 0xffffffff, 0x05020041, - 0x592c0208, 0x8c000500, 0x0502006c, 0x8d0c050e, - 0x05020059, 0x592e8c07, 0x83440480, 0x00000800, - 0x05021036, 0x592c380b, 0x821c3d00, 0x00ffffff, - 0x05edf8c5, 0x05020039, 0x49265802, 0x41784000, - 0x592c100a, 0x82081500, 0x00ffffff, 0x05fdfdae, - 0x0502004b, 0x592e6014, 0x4933c857, 0x83300580, - 0xffffffff, 0x05000018, 0x0521f939, 0x0500002d, - 0x591c1407, 0x800811c0, 0x05000013, 0x592c040e, - 0x591c0a02, 0x80040580, 0x0502000f, 0x591c000a, - 0x800001c0, 0x05020007, 0x591c082a, 0x59340002, - 0x80040580, 0x82000500, 0x00ffffff, 0x0501f002, - 0x81340580, 0x05020004, 0x90080587, 0x0502002c, - 0x64923c03, 0x59240005, 0x592c080a, 0x82041500, - 0x00ffffff, 0x80081580, 0x0500000c, 0x80040932, - 0xb0040582, 0x0502000b, 0x49365803, 0x0501f8da, - 0x80000580, 0x1c01f000, 0x60281000, 0x0501f00a, - 0x60401000, 0x0501f008, 0x60501000, 0x0501f006, - 0x605c1000, 0x0501f004, 0x60601000, 0x0501f002, - 0x60f01000, 0x492fc857, 0x480bc857, 0x60640800, - 0x60c68000, 0x90000541, 0x05fdf7ef, 0x492fc857, - 0x4803c857, 0x480bc857, 0x40000800, 0x05fdf7f9, - 0x492fc857, 0x60280800, 0x41781000, 0x05fdf7f5, - 0x41780800, 0x41781000, 0x05fdf7f3, 0x60780800, - 0x05fdf7fa, 0x60040800, 0x05fdf7f8, 0x90004d9d, - 0x05dc0b27, 0x90004d9a, 0x05020003, 0x40101000, - 0x05fdf7eb, 0x90004d9b, 0x05020003, 0x40181000, - 0x05fdf7e7, 0x90004d9c, 0x05fc07e5, 0x90004d99, - 0x05fc07e3, 0x05fdf7e7, 0x0529ff90, 0x60028000, - 0x05fdf7e8, 0x5c000000, 0x4c000000, 0x4803c857, - 0x5930200a, 0x801021c0, 0x05000029, 0x58101400, - 0x4813c857, 0x480bc857, 0x82081d00, 0x000000ff, - 0x59300c03, 0x90040588, 0x05000018, 0x9004058a, - 0x05000010, 0x9004058c, 0x0500000b, 0x90040582, - 0x05000012, 0x90040581, 0x0500000d, 0x90040583, - 0x05000008, 0x90040585, 0x05000003, 0x900405b3, - 0x05020013, 0x900c0589, 0x0500000a, 0x0501f010, - 0x900c0585, 0x05000007, 0x0501f00d, 0x900c058b, - 0x05000004, 0x0501f00a, 0x900c0583, 0x05020008, - 0x82081d00, 0xffffff00, 0x840c01c0, 0x800c0540, - 0x4807c857, 0x4803c857, 0x48002400, 0x1c01f000, - 0x0501f805, 0x60058800, 0x05020002, 0x60018800, - 0x1c01f000, 0x599c0017, 0x8c00050a, 0x05000003, - 0x80000580, 0x1c01f000, 0x59a8021b, 0x90000528, - 0x05000007, 0x61f6880f, 0x417a4000, 0x05fdfddd, - 0x05020003, 0x5934000a, 0x8c000504, 0x1c01f000, - 0x1c01f000, 0x4d440000, 0x4d340000, 0x80000580, - 0x40001800, 0x40028800, 0x90080588, 0x05020002, - 0x60041800, 0x0001fae7, 0x0502000a, 0x05fdfd74, - 0x05020008, 0x800c19c0, 0x05000004, 0x59340405, - 0x8c000508, 0x05000003, 0x80081040, 0x05000009, - 0x81468800, 0x83440480, 0x00000800, 0x05fc17f2, - 0x80000580, 0x5c026800, 0x5c028800, 0x1c01f000, - 0x90000541, 0x5c026800, 0x5c028800, 0x1c01f000, - 0x60200800, 0x58d400e4, 0x8c00051c, 0x0502002f, - 0x59a8021b, 0x8c000508, 0x0502002c, 0x5934100a, - 0x82081500, 0x0000e000, 0x41781800, 0x90080580, - 0x0500000a, 0x800c1800, 0x82080580, 0x00002000, - 0x05000006, 0x800c1800, 0x82080580, 0x00006000, - 0x05000002, 0x800c1800, 0x42007000, 0x0010ac7a, - 0x58380401, 0x8c000504, 0x05000006, 0x900c2c84, - 0x05021016, 0x820c0400, 0x00104770, 0x0501f012, - 0x41782000, 0x59342a04, 0x82140480, 0x00000800, - 0x05021006, 0x80102000, 0x82140480, 0x00000400, - 0x05021002, 0x80102000, 0x800c00c2, 0x800c0400, - 0x80100400, 0x90002c89, 0x05021004, 0x82000400, - 0x00104774, 0x50000800, 0x48066c04, 0x1c01f000, - 0x00000002, 0x00000004, 0x00000008, 0x00000008, - 0x00002802, 0x00001402, 0x00000a02, 0x00001402, - 0x00000a02, 0x00000502, 0x00000a02, 0x00000502, - 0x00000504, 0x59a80868, 0x800409c0, 0x05020004, - 0x492f5067, 0x492f5068, 0x0511f50c, 0x492c0800, - 0x492f5068, 0x1c01f000, 0x5934000f, 0x41784000, - 0x80001540, 0x05000010, 0x58080205, 0x82000500, - 0x000000ff, 0x90000592, 0x05000005, 0xb00005a0, - 0x05000003, 0x90000588, 0x05020004, 0x5808020d, - 0x80040580, 0x05000005, 0x58080000, 0x40084000, - 0x05fdf7f0, 0x90000541, 0x1c01f000, 0x64033011, - 0x4a03b104, 0x80000000, 0x4a03b104, 0x60000001, - 0x497b3016, 0x497b3017, 0x1c01f000, 0x599c0018, - 0x4803c856, 0x497b3014, 0x497b3015, 0x9000050f, - 0x48033012, 0x05000008, 0x599c0216, 0x82000500, - 0x0000ffff, 0x05020002, 0x60080000, 0x48033013, - 0x850e1d62, 0x1c01f000, 0x05fdfff1, 0x6413c826, - 0x599c0209, 0x80000540, 0x0500001c, 0x599c0207, - 0x80000540, 0x05000007, 0x800000cc, 0x599c080d, - 0x80040400, 0x4803b100, 0x497bb102, 0x59d80101, - 0x599c000d, 0x4803b100, 0x599c000e, 0x4803b101, - 0x599c0207, 0x80000540, 0x05020002, 0x497bb102, - 0x599c0a09, 0x82040540, 0x00400000, 0x4803b103, - 0x6417b109, 0x4a03b104, 0x10000001, 0x8d0c0522, - 0x05020003, 0x64073011, 0x1c01f000, 0x8d0c0520, - 0x05020003, 0x640b3011, 0x05fdf7fc, 0x640f3011, - 0x05fdf7fa, 0x592c0205, 0x492fc857, 0x80000540, - 0x05000007, 0x42034000, 0x0010ac19, 0x59a1d806, - 0x80edd9c0, 0x05dc0a0e, 0x0501f005, 0x0521fcc8, - 0x05de0a0b, 0x5931d82d, 0x58ef400a, 0x58ec0008, - 0x800001c0, 0x05dc0a06, 0x0801f800, 0x1c01f000, - 0x40680800, 0x5c000000, 0x4c000000, 0x4803c857, - 0x492fc857, 0x4943c857, 0x4807c857, 0x4c040000, - 0x0001ff6c, 0x5c000800, 0x4a025a05, 0x00000103, - 0x49425a07, 0x48065a09, 0x4a025c07, 0x0000ffff, - 0x813261c0, 0x05000003, 0x59300402, 0x48025c07, - 0x592c0209, 0x8c000512, 0x05020006, 0x912c040a, - 0x05011000, 0x4803c840, 0x642fc842, 0x05011000, - 0x1c01f000, 0x40680000, 0x4c540000, 0x4c580000, - 0x4c5c0000, 0x4d2c0000, 0x4000b800, 0x052df8a3, - 0x4178a800, 0x05ddfd58, 0x0500008e, 0x05011000, - 0x485fc857, 0x4943c857, 0x4923c857, 0x912c0405, - 0x4803c840, 0x6443c842, 0x40000000, 0x05fd17ff, - 0x412c7000, 0x4a025805, 0x00000132, 0x497a5806, - 0x805cb9c0, 0x0502005e, 0x912e5c08, 0x417a4000, - 0x42024800, 0x0010b111, 0x41786800, 0x59240a00, - 0x9004050f, 0x0c01f001, 0x00104843, 0x00104843, - 0x00104843, 0x00104843, 0x00104843, 0x00104843, - 0x00104843, 0x0010483a, 0x00104843, 0x00104843, - 0x00104843, 0x00104843, 0x00104843, 0x00104843, - 0x00104843, 0x00104843, 0x8054a800, 0x812241c0, - 0x05020007, 0x59240805, 0x805c00f0, 0x80040d40, - 0x48065800, 0x812e5800, 0x0501f030, 0x90340503, - 0x0c01f001, 0x00104849, 0x00104851, 0x0010485a, - 0x00104863, 0x91200581, 0x05020003, 0x60042000, - 0x0501f020, 0x912004a0, 0x0500101d, 0x80346800, - 0x0501f01b, 0x912005a1, 0x05020004, 0x812e5800, - 0x60042000, 0x0501f017, 0xb1200480, 0x05001014, - 0x80346800, 0x0501f012, 0xb1200581, 0x05020004, - 0x812e5800, 0x60042000, 0x0501f00e, 0xb12004a0, - 0x0500100b, 0x80346800, 0x0501f009, 0xb12005a1, - 0x05020004, 0x812e5800, 0x60042000, 0x0501f005, - 0xb12004bf, 0x05001002, 0x80346800, 0x801020c2, - 0x90040507, 0x90000587, 0x05020004, 0x592c0000, - 0x80100540, 0x48025800, 0x91264c0b, 0x81224000, - 0x8058b040, 0x05fe07b2, 0x8054a9c0, 0x403a5800, - 0x05000027, 0x052df839, 0x8058b040, 0x805800d0, - 0x80540540, 0x48025a07, 0x0501f01c, 0x91400581, - 0x05020004, 0x48165a09, 0x90140583, 0x05000019, - 0x83400d00, 0x000000ff, 0x90040584, 0x05000015, - 0x90040586, 0x05000013, 0x83400d00, 0x0000ff00, - 0x05000003, 0x81400110, 0x4802580d, 0x814000d0, - 0x81200540, 0x48025c07, 0x8058b040, 0x805800d0, - 0x90000541, 0x48025a07, 0x59240805, 0x805c00f0, - 0x80040d40, 0x48065808, 0x0001fb5b, 0x0501f005, - 0x59cc0007, 0x4802580d, 0x05fdf7f1, 0x05ddfced, - 0x5c025800, 0x5c00b800, 0x5c00b000, 0x5c00a800, - 0x1c01f000, 0x59a80011, 0x90000c8a, 0x05de1948, - 0x0c01f808, 0x4a038805, 0x000000f0, 0x59c400a3, - 0x82000500, 0x02870000, 0x05de0941, 0x1c01f000, - 0x0010492d, 0x001048bb, 0x001048d3, 0x001048fc, - 0x00104920, 0x001001ef, 0x001001ef, 0x001048d3, - 0x001001ef, 0x001048ba, 0x1c01f000, 0x600c2000, - 0x0501fbc3, 0x4a038808, 0x00000204, 0x0501fbb7, - 0x59c40805, 0x8c04050e, 0x05020010, 0x8c04050a, - 0x05020009, 0x8c04050c, 0x05020005, 0x8c040508, - 0x0500000a, 0x640f5011, 0x0501f007, 0x64035011, - 0x0501f005, 0x42000000, 0x0010afab, 0x0529fec6, - 0x640b5011, 0x0501f896, 0x1c01f000, 0x60002000, - 0x0501fbab, 0x4a038808, 0x00000202, 0x59c40805, - 0x8c040508, 0x05020020, 0x8c04050c, 0x0502001c, - 0x8c04050e, 0x05020018, 0x82040500, 0x000000f0, - 0x0502001b, 0x0501fb95, 0x4a038808, 0x00000280, - 0x59c40002, 0x8400050c, 0x48038802, 0x0501f96d, - 0x4d3c0000, 0x60067800, 0x0521fb3e, 0x5c027800, - 0x59c410a3, 0x84081518, 0x05e9f915, 0x4a038808, - 0x00000280, 0x60082000, 0x0501fb8d, 0x64275011, - 0x0501f007, 0x64075011, 0x0501f004, 0x64035011, - 0x0501f002, 0x640f5011, 0x0501f86d, 0x1c01f000, - 0x60042000, 0x0501fb82, 0x59c410a3, 0x84081518, - 0x05e9f903, 0x4a038808, 0x00000280, 0x59c40805, - 0x8c04050a, 0x05020018, 0x8c04050c, 0x05020014, - 0x8c04050e, 0x05020010, 0x82040500, 0x000000f0, - 0x05020013, 0x59c40002, 0x8400050c, 0x48038802, - 0x0501f944, 0x4d3c0000, 0x60067800, 0x0521fb15, - 0x5c027800, 0x60082000, 0x0501fb69, 0x64275011, - 0x0501f007, 0x64075011, 0x0501f004, 0x64035011, - 0x0501f002, 0x640b5011, 0x0501f849, 0x1c01f000, - 0x0501fc5a, 0x4a038808, 0x00000208, 0x59c40805, - 0x8c04050c, 0x05020005, 0x8c04050e, 0x05000005, - 0x64075011, 0x0501f002, 0x64035011, 0x0501f83c, - 0x1c01f000, 0x60102000, 0x0501fb51, 0x0501f873, - 0x59c40805, 0x8c04050c, 0x05020009, 0x8c04050a, - 0x05020005, 0x8c04050e, 0x05000005, 0x64075011, - 0x0501f002, 0x640b5011, 0x0501f82d, 0x1c01f000, - 0x0501f8f1, 0x05de08b2, 0x601c2000, 0x0501fb40, - 0x8d0c050c, 0x05000010, 0x850e1d0c, 0x64438805, - 0x05e5ffc6, 0x59c40005, 0x8c000508, 0x05000006, - 0x4a038808, 0x00000208, 0x64075014, 0x6006d800, - 0x0501f01a, 0x59c40006, 0x84000548, 0x48038806, - 0x0501f016, 0x59a80011, 0x90000581, 0x05020012, - 0x42000000, 0x0010afab, 0x0529fe3f, 0x4ce80000, - 0x61a1d007, 0x0509fb26, 0x59c40005, 0x90000530, - 0x05000008, 0x8c00050a, 0x05000004, 0x60002000, - 0x0501fb1f, 0x0501f003, 0x60042000, 0x0501fb1c, - 0x5c01d000, 0x64135011, 0x1c01f000, 0x4c040000, - 0x4c080000, 0x61900800, 0x42001000, 0x00104970, - 0x0509faf9, 0x5c001000, 0x5c000800, 0x1c01f000, - 0x4803c856, 0x4c040000, 0x0509fe0b, 0x4df00000, - 0x050df8a0, 0x5c03e000, 0x05080df3, 0x42000000, - 0x0010afaa, 0x0529fe1c, 0x05fdffc2, 0x5c000800, - 0x1c01f000, 0x4803c856, 0x4c040000, 0x4c080000, - 0x0509fdfd, 0x4df00000, 0x050df892, 0x5c03e000, - 0x05080de5, 0x59c40006, 0x84000500, 0x48038806, - 0x050df949, 0x497b8880, 0x42000000, 0x0010afa9, - 0x0529fe09, 0x05e5fede, 0x64135075, 0x6012d800, - 0x64078805, 0x42001000, 0x00104970, 0x0509fadb, - 0x05ddfa76, 0x0501f8ae, 0x05000005, 0x42006000, - 0xfeffffff, 0x41786800, 0x05f9fcf3, 0x0201f800, - 0x0010fada, 0x60000001, 0x05e5fc35, 0x5c001000, - 0x5c000800, 0x1c01f000, 0x59c40008, 0x82000580, - 0x00000210, 0x05000005, 0x4a038808, 0x00000210, - 0x6021d027, 0x0509fad6, 0x1c01f000, 0x4c040000, - 0x59a80814, 0x90040580, 0x05000008, 0x90040581, - 0x05000008, 0x90040582, 0x05000008, 0x90040583, - 0x05000008, 0x0501f043, 0x64035011, 0x0501f006, - 0x64135011, 0x0501f004, 0x64075011, 0x0501f002, - 0x641f5011, 0x497b8880, 0x64078893, 0x41780000, - 0x05e5fc92, 0x050df910, 0x916c0d84, 0x05000008, + 0x0501f948, 0x05020024, 0x0515f847, 0x0500003a, + 0x64426407, 0x4926601d, 0x4936600a, 0x60140800, + 0x91380583, 0x05000002, 0x60240800, 0x05fdfaff, + 0x0501f008, 0x90102591, 0x0502002b, 0x0515f83a, + 0x0500002d, 0x64426407, 0x4926601d, 0x4936600a, + 0x0521fcc8, 0x492e6009, 0x49325809, 0x83340580, + 0x0010ce8f, 0x05000007, 0x592c0c0c, 0x8c040518, + 0x05000004, 0x59340200, 0x84000514, 0x48026a00, + 0x0005fc78, 0x80000580, 0x1c01f000, 0x90000541, + 0x05fdf7fe, 0x60281000, 0x0501f014, 0x60381000, + 0x0501f012, 0x603c1000, 0x0501f010, 0x60401000, + 0x0501f00e, 0x60581000, 0x0501f00c, 0x605c1000, + 0x0501f00a, 0x60601000, 0x0501f008, 0x606c1000, + 0x0501f006, 0x60781000, 0x0501f004, 0x60901000, + 0x0501f002, 0x60801000, 0x60640800, 0x60c68000, + 0x05fdf7e7, 0x600c0800, 0x0501f002, 0x60280800, + 0x41781000, 0x05fdf7fa, 0x60240800, 0x59341400, + 0x05fdf7f7, 0x60228000, 0x0501f004, 0x601c0800, + 0x416c1000, 0x05fdf7f2, 0x41780800, 0x41781000, + 0x05fdf7d7, 0x60028000, 0x05fdf7fc, 0x90004d9d, + 0x05dc0aeb, 0x90004d9a, 0x05020004, 0x40101000, + 0x40000800, 0x05fdf7e6, 0x90004d9b, 0x05020003, + 0x40181000, 0x05fdf7fb, 0x90004d9c, 0x05fc07f9, + 0x90004d99, 0x05fc07c8, 0x05fdf7e1, 0x592e6009, + 0x0521fa88, 0x05fc07ca, 0x59300c07, 0x90040591, + 0x05fe07e1, 0x592c0c0c, 0x82041500, 0x0000e000, + 0x82080580, 0x00006000, 0x05000021, 0x83440580, + 0x0000ffff, 0x05020007, 0x5932680a, 0x83340580, + 0x0010ce8f, 0x05fe07d4, 0x61000810, 0x0501f00f, + 0x592c100b, 0x82081500, 0x00ffffff, 0x41784000, + 0x05fdfdd7, 0x05fe07d6, 0x5930000a, 0x82000d80, + 0x0010ce8f, 0x05000003, 0x81340580, 0x05fe07c6, + 0x4936600a, 0x59340a04, 0x592c000e, 0x80040480, + 0x05fc17b3, 0x59300a03, 0x90040587, 0x05fe07be, + 0x492e6009, 0x61527000, 0x05fdf78d, 0x052df902, + 0x05fc07c1, 0x05fdf7b8, 0x492fc857, 0x592e6009, + 0x83300580, 0xffffffff, 0x05020041, 0x592c0208, + 0x8c000500, 0x0502006c, 0x8d0c050e, 0x05020059, + 0x592e8c07, 0x83440480, 0x00000800, 0x05021036, + 0x592c380b, 0x821c3d00, 0x00ffffff, 0x05edf83f, + 0x05020039, 0x49265802, 0x41784000, 0x592c100a, + 0x82081500, 0x00ffffff, 0x05fdfda9, 0x0502004b, + 0x592e6014, 0x4933c857, 0x83300580, 0xffffffff, + 0x05000018, 0x0521fa3b, 0x0500002d, 0x591c1407, + 0x800811c0, 0x05000013, 0x592c040e, 0x591c0a02, + 0x80040580, 0x0502000f, 0x591c000a, 0x800001c0, + 0x05020007, 0x591c082a, 0x59340002, 0x80040580, + 0x82000500, 0x00ffffff, 0x0501f002, 0x81340580, + 0x05020004, 0x90080587, 0x0502002c, 0x64923c03, + 0x59240005, 0x592c080a, 0x82041500, 0x00ffffff, + 0x80081580, 0x0500000c, 0x80040932, 0xb0040582, + 0x0502000b, 0x49365803, 0x0501f8da, 0x80000580, + 0x1c01f000, 0x60281000, 0x0501f00a, 0x60401000, + 0x0501f008, 0x60501000, 0x0501f006, 0x605c1000, + 0x0501f004, 0x60601000, 0x0501f002, 0x60f01000, + 0x492fc857, 0x480bc857, 0x60640800, 0x60c68000, + 0x90000541, 0x05fdf7ef, 0x492fc857, 0x4803c857, + 0x480bc857, 0x40000800, 0x05fdf7f9, 0x492fc857, + 0x60280800, 0x41781000, 0x05fdf7f5, 0x41780800, + 0x41781000, 0x05fdf7f3, 0x60780800, 0x05fdf7fa, + 0x60040800, 0x05fdf7f8, 0x90004d9d, 0x05dc0a48, + 0x90004d9a, 0x05020003, 0x40101000, 0x05fdf7eb, + 0x90004d9b, 0x05020003, 0x40181000, 0x05fdf7e7, + 0x90004d9c, 0x05fc07e5, 0x90004d99, 0x05fc07e3, + 0x05fdf7e7, 0x052df961, 0x60028000, 0x05fdf7e8, + 0x5c000000, 0x4c000000, 0x4803c857, 0x5930200a, + 0x801021c0, 0x05000029, 0x58101400, 0x4813c857, + 0x480bc857, 0x82081d00, 0x000000ff, 0x59300c03, + 0x90040588, 0x05000018, 0x9004058a, 0x05000010, + 0x9004058c, 0x0500000b, 0x90040582, 0x05000012, + 0x90040581, 0x0500000d, 0x90040583, 0x05000008, + 0x90040585, 0x05000003, 0x900405b3, 0x05020013, + 0x900c0589, 0x0500000a, 0x0501f010, 0x900c0585, + 0x05000007, 0x0501f00d, 0x900c058b, 0x05000004, + 0x0501f00a, 0x900c0583, 0x05020008, 0x82081d00, + 0xffffff00, 0x840c01c0, 0x800c0540, 0x4807c857, + 0x4803c857, 0x48002400, 0x1c01f000, 0x0501f805, + 0x60058800, 0x05020002, 0x60018800, 0x1c01f000, + 0x599c0017, 0x8c00050a, 0x05000003, 0x80000580, + 0x1c01f000, 0x59a8021b, 0x90000528, 0x05000007, + 0x61f6880f, 0x417a4000, 0x05fdfdda, 0x05020003, + 0x5934000a, 0x8c000504, 0x1c01f000, 0x1c01f000, + 0x4d440000, 0x4d340000, 0x80000580, 0x40001800, + 0x40028800, 0x90080588, 0x05020002, 0x60041800, + 0x0001fae7, 0x0502000a, 0x05fdfd71, 0x05020008, + 0x800c19c0, 0x05000004, 0x59340405, 0x8c000508, + 0x05000003, 0x80081040, 0x05000009, 0x81468800, + 0x83440480, 0x00000800, 0x05fc17f2, 0x80000580, + 0x5c026800, 0x5c028800, 0x1c01f000, 0x90000541, + 0x5c026800, 0x5c028800, 0x1c01f000, 0x60200800, + 0x58d400e4, 0x8c00051c, 0x0502002f, 0x59a8021b, + 0x8c000508, 0x0502002c, 0x5934100a, 0x82081500, + 0x0000e000, 0x41781800, 0x90080580, 0x0500000a, + 0x800c1800, 0x82080580, 0x00002000, 0x05000006, + 0x800c1800, 0x82080580, 0x00006000, 0x05000002, + 0x800c1800, 0x42007000, 0x0010aefa, 0x58380401, + 0x8c000504, 0x05000006, 0x900c2c84, 0x05021016, + 0x820c0400, 0x0010484f, 0x0501f012, 0x41782000, + 0x59342a04, 0x82140480, 0x00000800, 0x05021006, + 0x80102000, 0x82140480, 0x00000400, 0x05021002, + 0x80102000, 0x800c00c2, 0x800c0400, 0x80100400, + 0x90002c89, 0x05021004, 0x82000400, 0x00104853, + 0x50000800, 0x48066c04, 0x1c01f000, 0x00000002, + 0x00000004, 0x00000008, 0x00000008, 0x00002802, + 0x00001402, 0x00000a02, 0x00001402, 0x00000a02, + 0x00000502, 0x00000a02, 0x00000502, 0x00000504, + 0x59a80868, 0x800409c0, 0x05020004, 0x492f5067, + 0x492f5068, 0x0511f5e1, 0x492c0800, 0x492f5068, + 0x1c01f000, 0x5934000f, 0x41784000, 0x80001540, + 0x05000010, 0x58080205, 0x82000500, 0x000000ff, + 0x90000592, 0x05000005, 0xb00005a0, 0x05000003, + 0x90000588, 0x05020004, 0x5808020d, 0x80040580, + 0x05000005, 0x58080000, 0x40084000, 0x05fdf7f0, + 0x90000541, 0x1c01f000, 0x42000000, 0x0010ce8f, + 0x4a000400, 0x00000707, 0x4a000204, 0x00000840, + 0x4a000403, 0x0000ffff, 0x49780200, 0x1c01f000, + 0x4d340000, 0x4d440000, 0x4c580000, 0x61c0b00f, + 0x4803c856, 0x417a8800, 0x0001fae7, 0x05020006, + 0x59340200, 0x8c00051a, 0x05000003, 0x8400051a, + 0x48026a00, 0x81468800, 0x8058b040, 0x05fe07f7, + 0x5c00b000, 0x5c028800, 0x5c026800, 0x1c01f000, + 0x64033011, 0x4a03b104, 0x80000000, 0x4a03b104, + 0x60000001, 0x497b3016, 0x497b3017, 0x1c01f000, + 0x599c0018, 0x4803c856, 0x497b3014, 0x497b3015, + 0x9000050f, 0x48033012, 0x05000008, 0x599c0216, + 0x82000500, 0x0000ffff, 0x05020002, 0x60080000, + 0x48033013, 0x850e1d62, 0x1c01f000, 0x05fdfff1, + 0x6413c826, 0x599c0209, 0x80000540, 0x0500001c, + 0x599c0207, 0x80000540, 0x05000007, 0x800000cc, + 0x599c080d, 0x80040400, 0x4803b100, 0x497bb102, + 0x59d80101, 0x599c000d, 0x4803b100, 0x599c000e, + 0x4803b101, 0x599c0207, 0x80000540, 0x05020002, + 0x497bb102, 0x599c0a09, 0x82040540, 0x00400000, + 0x4803b103, 0x6417b109, 0x4a03b104, 0x10000001, + 0x8d0c0522, 0x05020003, 0x64073011, 0x1c01f000, + 0x8d0c0520, 0x05020003, 0x640b3011, 0x05fdf7fc, + 0x640f3011, 0x05fdf7fa, 0x592c0205, 0x492fc857, + 0x80000540, 0x05000007, 0x42034000, 0x0010ae99, + 0x59a1d806, 0x80edd9c0, 0x05dc0911, 0x0501f005, + 0x0521fdb1, 0x05de090e, 0x5931d82d, 0x58ef400a, + 0x58ec0008, 0x800001c0, 0x05dc0909, 0x0801f800, + 0x1c01f000, 0x40680800, 0x5c000000, 0x4c000000, + 0x4803c857, 0x492fc857, 0x4943c857, 0x4807c857, + 0x4c040000, 0x0001ff6c, 0x5c000800, 0x4a025a05, + 0x00000103, 0x49425a07, 0x48065a09, 0x4a025c07, + 0x0000ffff, 0x813261c0, 0x05000003, 0x59300402, + 0x48025c07, 0x592c0209, 0x8c000512, 0x05020006, + 0x912c040a, 0x05011000, 0x4803c840, 0x642fc842, + 0x05011000, 0x1c01f000, 0x40680000, 0x4c540000, + 0x4c580000, 0x4c5c0000, 0x4d2c0000, 0x4000b800, + 0x052dfa56, 0x4178a800, 0x05ddfc5b, 0x05000094, + 0x05011000, 0x485fc857, 0x4943c857, 0x4923c857, + 0x912c0405, 0x4803c840, 0x6443c842, 0x40000000, + 0x05fd17ff, 0x412c7000, 0x4a025805, 0x00000132, + 0x497a5806, 0x805cb9c0, 0x05020060, 0x912e5c08, + 0x417a4000, 0x42024800, 0x0010b391, 0x41786800, + 0x59240a00, 0x9004050f, 0x0c01f001, 0x00104940, + 0x00104940, 0x00104940, 0x00104940, 0x00104940, + 0x00104940, 0x00104940, 0x00104937, 0x00104940, + 0x00104940, 0x00104940, 0x00104940, 0x00104940, + 0x00104940, 0x00104940, 0x00104940, 0x8054a800, + 0x812241c0, 0x05020007, 0x59240805, 0x805c00f0, + 0x80040d40, 0x48065800, 0x812e5800, 0x0501f030, + 0x90340503, 0x0c01f001, 0x00104946, 0x0010494e, + 0x00104957, 0x00104960, 0x91200581, 0x05020003, + 0x60042000, 0x0501f020, 0x912004a0, 0x0500101d, + 0x80346800, 0x0501f01b, 0x912005a1, 0x05020004, + 0x812e5800, 0x60042000, 0x0501f017, 0xb1200480, + 0x05001014, 0x80346800, 0x0501f012, 0xb1200581, + 0x05020004, 0x812e5800, 0x60042000, 0x0501f00e, + 0xb12004a0, 0x0500100b, 0x80346800, 0x0501f009, + 0xb12005a1, 0x05020004, 0x812e5800, 0x60042000, + 0x0501f005, 0xb12004bf, 0x05001002, 0x80346800, + 0x801020c2, 0x90040507, 0x90000587, 0x05020004, + 0x592c0000, 0x80100540, 0x48025800, 0x91264c0b, + 0x81224000, 0x8058b040, 0x05fe07b2, 0x8054a9c0, + 0x403a5800, 0x0500002d, 0x052df9ec, 0x052dfa0a, + 0x05020002, 0x8058b040, 0x805800d0, 0x80540540, + 0x48025a07, 0x0501f01e, 0x91400581, 0x05020004, + 0x48165a09, 0x90140583, 0x0500001d, 0x83400d00, + 0x000000ff, 0x90040584, 0x05000019, 0x90040586, + 0x05000017, 0x83400d00, 0x0000ff00, 0x05000003, + 0x81400110, 0x4802580d, 0x814000d0, 0x81200540, + 0x48025c07, 0x052df9f0, 0x05020002, 0x8058b040, + 0x805800d0, 0x90000541, 0x48025a07, 0x59240805, + 0x805c00f0, 0x80040d40, 0x48065808, 0x052df9f5, + 0x0502000c, 0x0001fb5b, 0x0501f005, 0x59cc0007, + 0x4802580d, 0x05fdf7ed, 0x05ddfbea, 0x5c025800, + 0x5c00b800, 0x5c00b000, 0x5c00a800, 0x1c01f000, + 0x0529fe4c, 0x05fdf7fa, 0x59a80011, 0x90000c8a, + 0x05de1843, 0x0c01f808, 0x4a038805, 0x000000f0, + 0x59c400a3, 0x82000500, 0x02870000, 0x05de083c, + 0x1c01f000, 0x00104a32, 0x001049c0, 0x001049d8, + 0x00104a01, 0x00104a25, 0x001001ef, 0x001001ef, + 0x001049d8, 0x001001ef, 0x001049bf, 0x1c01f000, + 0x600c2000, 0x0501fbc3, 0x4a038808, 0x00000204, + 0x0501fbb7, 0x59c40805, 0x8c04050e, 0x05020010, + 0x8c04050a, 0x05020009, 0x8c04050c, 0x05020005, + 0x8c040508, 0x0500000a, 0x640f5011, 0x0501f007, + 0x64035011, 0x0501f005, 0x42000000, 0x0010b22b, + 0x052df871, 0x640b5011, 0x0501f896, 0x1c01f000, + 0x60002000, 0x0501fbab, 0x4a038808, 0x00000202, + 0x59c40805, 0x8c040508, 0x05020020, 0x8c04050c, + 0x0502001c, 0x8c04050e, 0x05020018, 0x82040500, + 0x000000f0, 0x0502001b, 0x0501fb95, 0x4a038808, + 0x00000280, 0x59c40002, 0x8400050c, 0x48038802, + 0x0501f96d, 0x4d3c0000, 0x60067800, 0x0521fc1f, + 0x5c027800, 0x59c410a3, 0x84081518, 0x05e9f811, + 0x4a038808, 0x00000280, 0x60082000, 0x0501fb8d, + 0x64275011, 0x0501f007, 0x64075011, 0x0501f004, + 0x64035011, 0x0501f002, 0x640f5011, 0x0501f86d, + 0x1c01f000, 0x60042000, 0x0501fb82, 0x59c410a3, + 0x84081518, 0x05e5ffff, 0x4a038808, 0x00000280, + 0x59c40805, 0x8c04050a, 0x05020018, 0x8c04050c, + 0x05020014, 0x8c04050e, 0x05020010, 0x82040500, + 0x000000f0, 0x05020013, 0x59c40002, 0x8400050c, + 0x48038802, 0x0501f944, 0x4d3c0000, 0x60067800, + 0x0521fbf6, 0x5c027800, 0x60082000, 0x0501fb69, + 0x64275011, 0x0501f007, 0x64075011, 0x0501f004, + 0x64035011, 0x0501f002, 0x640b5011, 0x0501f849, + 0x1c01f000, 0x0501fc5a, 0x4a038808, 0x00000208, + 0x59c40805, 0x8c04050c, 0x05020005, 0x8c04050e, + 0x05000005, 0x64075011, 0x0501f002, 0x64035011, + 0x0501f83c, 0x1c01f000, 0x60102000, 0x0501fb51, + 0x0501f873, 0x59c40805, 0x8c04050c, 0x05020009, + 0x8c04050a, 0x05020005, 0x8c04050e, 0x05000005, + 0x64075011, 0x0501f002, 0x640b5011, 0x0501f82d, + 0x1c01f000, 0x0501f8f1, 0x05da0fad, 0x601c2000, + 0x0501fb40, 0x8d0c050c, 0x05000010, 0x850e1d0c, + 0x64438805, 0x05e5fec2, 0x59c40005, 0x8c000508, + 0x05000006, 0x4a038808, 0x00000208, 0x64075014, + 0x6006d800, 0x0501f01a, 0x59c40006, 0x84000548, + 0x48038806, 0x0501f016, 0x59a80011, 0x90000581, + 0x05020012, 0x42000000, 0x0010b22b, 0x0529ffea, + 0x4ce80000, 0x61a1d007, 0x0509fbe3, 0x59c40005, + 0x90000530, 0x05000008, 0x8c00050a, 0x05000004, + 0x60002000, 0x0501fb1f, 0x0501f003, 0x60042000, + 0x0501fb1c, 0x5c01d000, 0x64135011, 0x1c01f000, + 0x4c040000, 0x4c080000, 0x61900800, 0x42001000, + 0x00104a75, 0x0509fbb6, 0x5c001000, 0x5c000800, + 0x1c01f000, 0x4803c856, 0x4c040000, 0x0509fec8, + 0x4df00000, 0x050df95d, 0x5c03e000, 0x05080eb0, + 0x42000000, 0x0010b22a, 0x0529ffc7, 0x05fdffc2, + 0x5c000800, 0x1c01f000, 0x4803c856, 0x4c040000, + 0x4c080000, 0x0509feba, 0x4df00000, 0x050df94f, + 0x5c03e000, 0x05080ea2, 0x59c40006, 0x84000500, + 0x48038806, 0x050dfa06, 0x497b8880, 0x42000000, + 0x0010b229, 0x0529ffb4, 0x05e5fdda, 0x64135075, + 0x6012d800, 0x64078805, 0x42001000, 0x00104a75, + 0x0509fb98, 0x05ddf971, 0x0501f8ae, 0x05000005, + 0x42006000, 0xfeffffff, 0x41786800, 0x05f9fcc1, + 0x0201f800, 0x0010fcd9, 0x60000001, 0x05e5fb2e, + 0x5c001000, 0x5c000800, 0x1c01f000, 0x59c40008, + 0x82000580, 0x00000210, 0x05000005, 0x4a038808, + 0x00000210, 0x6021d027, 0x0509fb93, 0x1c01f000, + 0x4c040000, 0x59a80814, 0x90040580, 0x05000008, + 0x90040581, 0x05000008, 0x90040582, 0x05000008, + 0x90040583, 0x05000008, 0x0501f043, 0x64035011, + 0x0501f006, 0x64135011, 0x0501f004, 0x64075011, + 0x0501f002, 0x641f5011, 0x497b8880, 0x64078893, + 0x41780000, 0x05e5fb8e, 0x050df9cd, 0x916c0d84, + 0x05000008, 0x59c40006, 0x82000500, 0xffffff0f, + 0x82000540, 0x04000001, 0x48038806, 0x0501f007, 0x59c40006, 0x82000500, 0xffffff0f, 0x82000540, - 0x04000001, 0x48038806, 0x0501f007, 0x59c40006, - 0x82000500, 0xffffff0f, 0x82000540, 0x04000000, - 0x48038806, 0x0501f872, 0x05020005, 0x59c40806, - 0x82040d00, 0xfbffff0f, 0x48078806, 0x59c40005, - 0x8c000534, 0x05020026, 0x42006000, 0xfc18ffff, - 0x42006800, 0x01000000, 0x05f9fcaf, 0x05e5ff2b, - 0x59c408a4, 0x90040d0f, 0x90040d8c, 0x0502089a, - 0x0501f85f, 0x05000005, 0x42006000, 0xfeffffff, - 0x41786800, 0x05f9fca4, 0x916c0d84, 0x0500000c, - 0x05fdff7b, 0x5994102e, 0x41780800, 0x60280000, - 0x0509fb4c, 0x40080000, 0x59a80835, 0x80040c00, - 0x42001000, 0x0010497d, 0x0509fa66, 0x64135014, - 0x05fdfead, 0x0501f84a, 0x05020005, 0x59c408a4, - 0x90040d0f, 0x9004058c, 0x05da0ff1, 0x5c000800, - 0x1c01f000, 0x4803c856, 0x4c000000, 0x0509fa8a, - 0x4a03500f, 0x00ffffff, 0x497b5013, 0x59a8001f, - 0x82000500, 0xffff0000, 0x4803501f, 0x497b8880, - 0x497b8893, 0x41780000, 0x05e5fc44, 0x59c40001, - 0x82000500, 0xfffffcff, 0x48038801, 0x42006000, - 0xfc18ffff, 0x41786800, 0x05f9fc77, 0x59c410a3, - 0x84081518, 0x05e5ffea, 0x4a038808, 0x00000200, - 0x5c000000, 0x800001c0, 0x05fa0b17, 0x4a038805, - 0x040000f0, 0x59c40006, 0x82000500, 0xffffffcf, - 0x82000540, 0x440000c1, 0x48038806, 0x1c01f000, + 0x04000000, 0x48038806, 0x0501f872, 0x05020005, + 0x59c40806, 0x82040d00, 0xfbffff0f, 0x48078806, + 0x59c40005, 0x8c000534, 0x05020026, 0x42006000, + 0xfc18ffff, 0x42006800, 0x01000000, 0x05f9fc7d, + 0x05e5fe27, 0x59c408a4, 0x90040d0f, 0x90040d8c, + 0x0502089a, 0x0501f85f, 0x05000005, 0x42006000, + 0xfeffffff, 0x41786800, 0x05f9fc72, 0x916c0d84, + 0x0500000c, 0x05fdff7b, 0x5994102e, 0x41780800, + 0x60280000, 0x0509fc09, 0x40080000, 0x59a80835, + 0x80040c00, 0x42001000, 0x00104a82, 0x0509fb23, + 0x64135014, 0x05fdfead, 0x0501f84a, 0x05020005, + 0x59c408a4, 0x90040d0f, 0x9004058c, 0x05da0eec, + 0x5c000800, 0x1c01f000, 0x4803c856, 0x4c000000, + 0x0509fb47, 0x4a03500f, 0x00ffffff, 0x497b5013, + 0x59a8001f, 0x82000500, 0xffff0000, 0x4803501f, + 0x497b8880, 0x497b8893, 0x41780000, 0x05e5fb40, + 0x59c40001, 0x82000500, 0xfffffcff, 0x48038801, + 0x42006000, 0xfc18ffff, 0x41786800, 0x05f9fc45, + 0x59c410a3, 0x84081518, 0x05e5fee6, 0x4a038808, + 0x00000200, 0x5c000000, 0x800001c0, 0x05fa0ae5, + 0x4a038805, 0x040000f0, 0x59c40006, 0x82000500, + 0xffffffcf, 0x82000540, 0x440000c1, 0x48038806, + 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, + 0x60018800, 0x1c01f000, 0x4c5c0000, 0x59a8b813, + 0x825cbd80, 0x0000aaaa, 0x5c00b800, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, - 0x1c01f000, 0x4c5c0000, 0x59a8b813, 0x825cbd80, - 0x0000aaaa, 0x5c00b800, 0x1c01f000, 0x0501f805, + 0x1c01f000, 0x4c5c0000, 0x599cb818, 0x905cbd30, + 0x905cbd80, 0x5c00b800, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, - 0x4c5c0000, 0x599cb818, 0x905cbd30, 0x905cbd80, + 0x4c5c0000, 0x599cb818, 0x905cbd30, 0x905cbd90, 0x5c00b800, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, 0x4c5c0000, - 0x599cb818, 0x905cbd30, 0x905cbd90, 0x5c00b800, - 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, - 0x60018800, 0x1c01f000, 0x4c5c0000, 0x599cb818, - 0x905cbd30, 0x905cbda0, 0x5c00b800, 0x1c01f000, - 0x490fc857, 0x910c0d13, 0x0500001e, 0x599c1017, - 0x4d3c0000, 0x910c0511, 0x05000005, 0x417a7800, - 0x8d0c0520, 0x05020007, 0x0501f00f, 0x60227800, - 0x8d0c0520, 0x0500000c, 0x600c3000, 0x0501f002, - 0x60103000, 0x603a8000, 0x4d200000, 0x61fe4001, - 0x0525fe39, 0x5c024000, 0x599c1017, 0x8c08050a, - 0x05020006, 0x60128000, 0x0201f800, 0x0010ebe6, - 0x4803c856, 0x850e1d08, 0x5c027800, 0x0501f009, - 0x8d0c0520, 0x05000007, 0x603e8000, 0x60043000, - 0x4d200000, 0x61fe4001, 0x0525fe27, 0x5c024000, - 0x1c01f000, 0x4803c856, 0x4c580000, 0x42000000, - 0x0010b0bf, 0x0529fd14, 0x42000800, 0x0010cedc, - 0x59c40003, 0x44000800, 0x59c40004, 0x48000801, - 0x59c4000b, 0x48000802, 0x59c4008e, 0x48000803, - 0x59c4008f, 0x48000804, 0x59c40090, 0x48000805, - 0x59c40091, 0x48000806, 0x59c40092, 0x48000807, - 0x59c40093, 0x48000808, 0x59c40099, 0x48000809, - 0x59c4009e, 0x4800080a, 0x59c400aa, 0x4800080b, - 0x59c400af, 0x4800080c, 0x59c400b2, 0x4800080d, - 0x59c400b1, 0x4800080e, 0x90040c0f, 0x41c41800, - 0x60c0b000, 0x580c0050, 0x44000800, 0x80040800, - 0x800c1800, 0x8058b040, 0x05fe07fb, 0x41c41800, - 0x6080b000, 0x580c0010, 0x44000800, 0x80040800, - 0x800c1800, 0x8058b040, 0x05fe07fb, 0x497b8830, - 0x6100b000, 0x59c40031, 0x44000800, 0x80040800, - 0x8058b040, 0x05fe07fc, 0x497b88ac, 0x6040b000, - 0x59c400ad, 0x44000800, 0x80040800, 0x8058b040, - 0x05fe07fc, 0x59c41001, 0x4c080000, 0x8408150c, - 0x480b8801, 0x4a0370e4, 0x00000300, 0x4a0370e5, - 0xb0000000, 0x60000810, 0x80040840, 0x05d80f24, - 0x59b800e5, 0x8c000538, 0x05fe07fc, 0x4a0370e4, - 0x00000200, 0x42006000, 0xffffffff, 0x42006800, - 0x80000000, 0x05f9fbb8, 0x64078807, 0x497b8807, - 0x0501fab0, 0x4a038808, 0x00000210, 0x42006000, - 0xfcf8ffff, 0x42006800, 0x01000000, 0x05f9fbae, - 0x5c001000, 0x480b8801, 0x42000800, 0x0010cedc, - 0x50040000, 0x48038803, 0x58040001, 0x48038804, - 0x58040002, 0x4803880b, 0x58040003, 0x4803888e, - 0x58040004, 0x4803888f, 0x58040005, 0x48038890, - 0x58040006, 0x48038891, 0x58040007, 0x48038892, - 0x58040008, 0x48038893, 0x58040009, 0x48038899, - 0x5804000a, 0x4803889e, 0x5804000b, 0x480388aa, - 0x5804000c, 0x480388af, 0x5804000d, 0x480388b2, - 0x5804000e, 0x480388b1, 0x90040c0f, 0x41c41800, - 0x60c0b000, 0x50040000, 0x48001850, 0x80040800, - 0x800c1800, 0x8058b040, 0x05fe07fb, 0x41c41800, - 0x6080b000, 0x50040000, 0x48001810, 0x80040800, - 0x800c1800, 0x8058b040, 0x05fe07fb, 0x497b8830, - 0x6100b000, 0x50040000, 0x48038831, 0x80040800, - 0x8058b040, 0x05fe07fc, 0x497b88ac, 0x6040b000, - 0x50040000, 0x480388ad, 0x80040800, 0x8058b040, - 0x05fe07fc, 0x497b8880, 0x41780000, 0x05e5fb2f, - 0x59c408a4, 0x90040d0f, 0x9004058c, 0x05da0ec8, - 0x4a038805, 0x04000000, 0x5c00b000, 0x1c01f000, - 0x4803c856, 0x4c580000, 0x4ce80000, 0x42000000, - 0x0010afac, 0x0529fc64, 0x59c41008, 0x4c080000, - 0x82081500, 0xffffff7f, 0x480b8808, 0x59c40004, - 0x82000500, 0x00003e02, 0x05000003, 0x6051d000, - 0x0509f943, 0x59c40006, 0x82000500, 0xffffff0f, - 0x48038806, 0x0501fa40, 0x64438805, 0x4a038808, - 0x00000204, 0x6194b000, 0x59c40005, 0x8c000508, - 0x05020010, 0x61a1d007, 0x0509f935, 0x8058b040, - 0x05fe07fa, 0x601c2000, 0x0501f931, 0x0501fa2b, - 0x0509ff81, 0x4803c856, 0x4a038808, 0x00000208, - 0x64075014, 0x6006d800, 0x90000541, 0x0501f032, - 0x60042000, 0x0501f926, 0x05ddfcd5, 0x42000000, - 0x0010b09b, 0x0529fc38, 0x05e1f8d5, 0x497b8880, - 0x59a8001f, 0x82000500, 0x0000ffff, 0x4c000000, - 0x05e5faee, 0x5c000000, 0x48038880, 0x59c410a3, - 0x84081518, 0x05e5fe9a, 0x4a038808, 0x00000200, - 0x64238805, 0x6194b000, 0x4a038805, 0x000000f0, - 0x05e5fd9a, 0x61c00801, 0x59c40005, 0x80040d00, - 0x05000006, 0x61a1d007, 0x0509f909, 0x8058b040, - 0x05fe07f6, 0x05fdf7d4, 0x59c410a3, 0x84081558, - 0x05e5fe87, 0x60082000, 0x0501f901, 0x59c40006, - 0x82000540, 0x000000f0, 0x48038806, 0x59a80012, - 0x80000540, 0x05020002, 0x80000000, 0x48038893, - 0x80000580, 0x4df00000, 0x05e5fda8, 0x5c03e000, - 0x5c001000, 0x480b8808, 0x5c01d000, 0x5c00b000, + 0x599cb818, 0x905cbd30, 0x905cbda0, 0x5c00b800, + 0x1c01f000, 0x490fc857, 0x910c0d13, 0x0500001e, + 0x599c1017, 0x4d3c0000, 0x910c0511, 0x05000005, + 0x417a7800, 0x8d0c0520, 0x05020007, 0x0501f00f, + 0x60227800, 0x8d0c0520, 0x0500000c, 0x600c3000, + 0x0501f002, 0x60103000, 0x603a8000, 0x4d200000, + 0x61fe4001, 0x0525ffcb, 0x5c024000, 0x599c1017, + 0x8c08050a, 0x05020006, 0x60128000, 0x0201f800, + 0x0010edf3, 0x4803c856, 0x850e1d08, 0x5c027800, + 0x0501f009, 0x8d0c0520, 0x05000007, 0x603e8000, + 0x60043000, 0x4d200000, 0x61fe4001, 0x0525ffb9, + 0x5c024000, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x42000000, 0x0010b33f, 0x0529febf, 0x42000800, + 0x0010d15c, 0x59c40003, 0x44000800, 0x59c40004, + 0x48000801, 0x59c4000b, 0x48000802, 0x59c4008e, + 0x48000803, 0x59c4008f, 0x48000804, 0x59c40090, + 0x48000805, 0x59c40091, 0x48000806, 0x59c40092, + 0x48000807, 0x59c40093, 0x48000808, 0x59c40099, + 0x48000809, 0x59c4009e, 0x4800080a, 0x59c400aa, + 0x4800080b, 0x59c400af, 0x4800080c, 0x59c400b2, + 0x4800080d, 0x59c400b1, 0x4800080e, 0x90040c0f, + 0x41c41800, 0x60c0b000, 0x580c0050, 0x44000800, + 0x80040800, 0x800c1800, 0x8058b040, 0x05fe07fb, + 0x41c41800, 0x6080b000, 0x580c0010, 0x44000800, + 0x80040800, 0x800c1800, 0x8058b040, 0x05fe07fb, + 0x497b8830, 0x6100b000, 0x59c40031, 0x44000800, + 0x80040800, 0x8058b040, 0x05fe07fc, 0x497b88ac, + 0x6040b000, 0x59c400ad, 0x44000800, 0x80040800, + 0x8058b040, 0x05fe07fc, 0x59c41001, 0x4c080000, + 0x8408150c, 0x480b8801, 0x4a0370e4, 0x00000300, + 0x4a0370e5, 0xb0000000, 0x60000810, 0x80040840, + 0x05d80e1f, 0x59b800e5, 0x8c000538, 0x05fe07fc, + 0x4a0370e4, 0x00000200, 0x42006000, 0xffffffff, + 0x42006800, 0x80000000, 0x05f9fb86, 0x64078807, + 0x497b8807, 0x0501fab0, 0x4a038808, 0x00000210, + 0x42006000, 0xfcf8ffff, 0x42006800, 0x01000000, + 0x05f9fb7c, 0x5c001000, 0x480b8801, 0x42000800, + 0x0010d15c, 0x50040000, 0x48038803, 0x58040001, + 0x48038804, 0x58040002, 0x4803880b, 0x58040003, + 0x4803888e, 0x58040004, 0x4803888f, 0x58040005, + 0x48038890, 0x58040006, 0x48038891, 0x58040007, + 0x48038892, 0x58040008, 0x48038893, 0x58040009, + 0x48038899, 0x5804000a, 0x4803889e, 0x5804000b, + 0x480388aa, 0x5804000c, 0x480388af, 0x5804000d, + 0x480388b2, 0x5804000e, 0x480388b1, 0x90040c0f, + 0x41c41800, 0x60c0b000, 0x50040000, 0x48001850, + 0x80040800, 0x800c1800, 0x8058b040, 0x05fe07fb, + 0x41c41800, 0x6080b000, 0x50040000, 0x48001810, + 0x80040800, 0x800c1800, 0x8058b040, 0x05fe07fb, + 0x497b8830, 0x6100b000, 0x50040000, 0x48038831, + 0x80040800, 0x8058b040, 0x05fe07fc, 0x497b88ac, + 0x6040b000, 0x50040000, 0x480388ad, 0x80040800, + 0x8058b040, 0x05fe07fc, 0x497b8880, 0x41780000, + 0x05e5fa2b, 0x59c408a4, 0x90040d0f, 0x9004058c, + 0x05da0dc3, 0x4a038805, 0x04000000, 0x5c00b000, 0x1c01f000, 0x4803c856, 0x4c580000, 0x4ce80000, - 0x59c41008, 0x4c080000, 0x82081500, 0xffffff7f, - 0x480b8808, 0x59c40004, 0x82000500, 0x00003e02, - 0x05000003, 0x6051d000, 0x0509f8e1, 0x05ddfc90, - 0x42000000, 0x0010b09c, 0x0529fbf3, 0x05e1f890, - 0x60002000, 0x0501f8da, 0x4a038808, 0x00000202, - 0x80000580, 0x48038880, 0x48038893, 0x05e5faa7, - 0x6010b007, 0x4a038805, 0x000000f0, 0x05e5fd5b, - 0x61c00801, 0x59c40005, 0x80040d00, 0x05000016, - 0x82000500, 0x000000d0, 0x0502001f, 0x619dd000, - 0x0509f8c7, 0x8058b040, 0x05fe07f3, 0x601c2000, - 0x0501f8c3, 0x0509ff14, 0x0501f9bc, 0x4a038808, - 0x00000208, 0x64075014, 0x6006d800, 0x59c40006, - 0x8400050a, 0x48038806, 0x64838805, 0x90000541, - 0x0501f01b, 0x59c410a3, 0x84081518, 0x05e5fe38, - 0x4a038808, 0x00000200, 0x6095d000, 0x0509f8b0, - 0x59c410a3, 0x84081558, 0x05e5fe31, 0x60082000, - 0x0501f8ab, 0x497b8880, 0x59a80012, 0x80000540, - 0x05020002, 0x80000000, 0x48038893, 0x59a8001f, - 0x82000500, 0x0000ffff, 0x4c000000, 0x05e5fa73, - 0x5c000000, 0x48038880, 0x80000580, 0x4df00000, - 0x05e5fd4e, 0x5c03e000, 0x5c001000, 0x480b8808, - 0x5c01d000, 0x5c00b000, 0x1c01f000, 0x4803c856, - 0x60042000, 0x0501f892, 0x59c40004, 0x82000500, - 0x00003e02, 0x05000008, 0x0509fedf, 0x0501f987, + 0x42000000, 0x0010b22c, 0x0529fe0f, 0x59c41008, + 0x4c080000, 0x82081500, 0xffffff7f, 0x480b8808, + 0x59c40004, 0x82000500, 0x00003e02, 0x05000003, + 0x6051d000, 0x0509fa00, 0x59c40006, 0x82000500, + 0xffffff0f, 0x48038806, 0x0501fa40, 0x64438805, + 0x4a038808, 0x00000204, 0x6194b000, 0x59c40005, + 0x8c000508, 0x05020010, 0x61a1d007, 0x0509f9f2, + 0x8058b040, 0x05fe07fa, 0x601c2000, 0x0501f931, + 0x0501fa2b, 0x050df83e, 0x4803c856, 0x4a038808, + 0x00000208, 0x64075014, 0x6006d800, 0x90000541, + 0x0501f032, 0x60042000, 0x0501f926, 0x05ddfbce, + 0x42000000, 0x0010b31b, 0x0529fde3, 0x05ddffd0, + 0x497b8880, 0x59a8001f, 0x82000500, 0x0000ffff, + 0x4c000000, 0x05e5f9ea, 0x5c000000, 0x48038880, + 0x59c410a3, 0x84081518, 0x05e5fd96, 0x4a038808, + 0x00000200, 0x64238805, 0x6194b000, 0x4a038805, + 0x000000f0, 0x05e5fc96, 0x61c00801, 0x59c40005, + 0x80040d00, 0x05000006, 0x61a1d007, 0x0509f9c6, + 0x8058b040, 0x05fe07f6, 0x05fdf7d4, 0x59c410a3, + 0x84081558, 0x05e5fd83, 0x60082000, 0x0501f901, + 0x59c40006, 0x82000540, 0x000000f0, 0x48038806, + 0x59a80012, 0x80000540, 0x05020002, 0x80000000, + 0x48038893, 0x80000580, 0x4df00000, 0x05e5fca4, + 0x5c03e000, 0x5c001000, 0x480b8808, 0x5c01d000, + 0x5c00b000, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x4ce80000, 0x59c41008, 0x4c080000, 0x82081500, + 0xffffff7f, 0x480b8808, 0x59c40004, 0x82000500, + 0x00003e02, 0x05000003, 0x6051d000, 0x0509f99e, + 0x05ddfb89, 0x42000000, 0x0010b31c, 0x0529fd9e, + 0x05ddff8b, 0x60002000, 0x0501f8da, 0x4a038808, + 0x00000202, 0x80000580, 0x48038880, 0x48038893, + 0x05e5f9a3, 0x6010b007, 0x4a038805, 0x000000f0, + 0x05e5fc57, 0x61c00801, 0x59c40005, 0x80040d00, + 0x05000016, 0x82000500, 0x000000d0, 0x0502001f, + 0x619dd000, 0x0509f984, 0x8058b040, 0x05fe07f3, + 0x601c2000, 0x0501f8c3, 0x0509ffd1, 0x0501f9bc, 0x4a038808, 0x00000208, 0x64075014, 0x6006d800, - 0x0501f046, 0x05ddfc36, 0x42000000, 0x0010b09d, - 0x0529fb99, 0x05e1f836, 0x59c40006, 0x84000508, - 0x48038806, 0x64438805, 0x850e1d4c, 0x61900800, - 0x42001000, 0x00104970, 0x0509f85f, 0x59c410a3, - 0x84081518, 0x05e5fdfa, 0x4a038808, 0x00000200, - 0x497b8880, 0x4a038805, 0x000000f0, 0x05e5fcfb, - 0x61c00801, 0x59c40005, 0x80040d00, 0x0500000b, - 0x82000500, 0x000000e0, 0x0502000d, 0x61a1d007, - 0x0509f867, 0x0505fece, 0x59940004, 0x80000540, - 0x05fe07f1, 0x0501f021, 0x59c410a3, 0x84081558, - 0x05e5fde3, 0x60082000, 0x0501f85d, 0x4c080000, - 0x42001000, 0x00104970, 0x0509f848, 0x5c001000, - 0x497b8880, 0x59a80012, 0x80000540, 0x05020002, - 0x80000000, 0x48038893, 0x59a8001f, 0x82000500, - 0x0000ffff, 0x4c000000, 0x05e5fa20, 0x5c000000, - 0x48038880, 0x850e1d0c, 0x59c40006, 0x84000548, - 0x48038806, 0x05e5fcf9, 0x59c40008, 0x82000540, - 0x00000280, 0x48038808, 0x1c01f000, 0x4803c856, - 0x4d400000, 0x4d3c0000, 0x0509fe8f, 0x0529fc62, - 0x0502002c, 0x599c1017, 0x8d0c0500, 0x05020009, - 0x8c08051a, 0x05000027, 0x850e1d42, 0x60128000, - 0x60227800, 0x8d0c0520, 0x05020006, 0x0501f01d, - 0x60128000, 0x417a7800, 0x8d0c0520, 0x05000019, - 0x0529fc5e, 0x42024800, 0x0010b111, 0x59240200, - 0x8c000500, 0x05000006, 0x4c580000, 0x60040800, - 0x60001002, 0x0509f8a9, 0x5c00b000, 0x91264c0b, - 0x8058b040, 0x05fe07f6, 0x61fe41ff, 0x4d400000, - 0x603a8000, 0x600c3000, 0x61fe89ff, 0x0525fc37, - 0x5c028000, 0x599c0817, 0x8c04050a, 0x05020005, - 0x4943c857, 0x493fc857, 0x0201f800, 0x0010ebe6, - 0x497b8880, 0x6006d800, 0x05fdfd39, 0x5c027800, - 0x5c028000, 0x1c01f000, 0x05ddfbb9, 0x42000000, - 0x0010b09e, 0x0529fb1c, 0x05ddffb9, 0x60040000, - 0x05e5f9d6, 0x64078880, 0x05e5f4b4, 0x42000800, - 0x0010ac15, 0x48100802, 0x90101488, 0x05001008, - 0x58040001, 0x4803c857, 0x4813c857, 0x58040003, - 0x80000000, 0x48000803, 0x60082000, 0x58040001, - 0x9000148b, 0x05001007, 0x4803c857, 0x4813c857, - 0x58040003, 0x80000000, 0x48000803, 0x60000000, - 0x48000800, 0x59c428a4, 0x90142d0f, 0x90142d8c, - 0x0c000002, 0x0501f0fb, 0x00104ca5, 0x00104cbf, - 0x00104cd9, 0x00104cf3, 0x00104d0d, 0x00104d23, - 0x00104d32, 0x00104d45, 0x00104d58, 0x00104d6b, - 0x00104d6d, 0x40100000, 0x0c01f001, 0x00104caf, - 0x00104cb1, 0x00104cb3, 0x00104cb4, 0x00104cb6, - 0x00104cb8, 0x00104cbb, 0x00104cbd, 0x64080801, - 0x1c01f000, 0x640c0801, 0x0501f0bc, 0x1c01f000, - 0x641c0801, 0x1c01f000, 0x64100801, 0x0501f0ba, - 0x64140801, 0x0501f8be, 0x0501f0ba, 0x64140801, - 0x0501f0bb, 0x4813c857, 0x1c01f000, 0x40100000, - 0x0c01f001, 0x00104cc9, 0x00104ccb, 0x00104ccd, - 0x00104cce, 0x00104cd0, 0x00104cd2, 0x00104cd5, - 0x00104cd7, 0x64080801, 0x1c01f000, 0x640c0801, - 0x1c01f000, 0x1c01f000, 0x641c0801, 0x1c01f000, - 0x64100801, 0x0501f0a0, 0x64140801, 0x0501f8a4, - 0x0501f0a0, 0x64140801, 0x1c01f000, 0x64140801, - 0x0501f099, 0x40100000, 0x0c01f001, 0x00104ce3, - 0x00104ce4, 0x00104ce6, 0x00104ce8, 0x00104cea, - 0x00104cec, 0x00104cef, 0x00104cf1, 0x1c01f000, - 0x640c0801, 0x1c01f000, 0x64000801, 0x1c01f000, - 0x641c0801, 0x1c01f000, 0x64100801, 0x0501f086, - 0x64140801, 0x0501f88a, 0x0501f086, 0x64140801, - 0x1c01f000, 0x64140801, 0x0501f07f, 0x40100000, - 0x0c01f001, 0x00104cfd, 0x00104cff, 0x00104d00, - 0x00104d02, 0x00104d04, 0x00104d06, 0x00104d09, - 0x00104d0b, 0x64080801, 0x1c01f000, 0x1c01f000, - 0x64000801, 0x1c01f000, 0x641c0801, 0x1c01f000, - 0x64100801, 0x0501f06c, 0x64140801, 0x0501f870, - 0x0501f06c, 0x64140801, 0x1c01f000, 0x64140801, - 0x0501f065, 0x40100000, 0x0c01f001, 0x00104d17, - 0x00104d19, 0x00104d19, 0x00104d1a, 0x00104d19, - 0x00104d1c, 0x00104d1f, 0x00104d21, 0x64080801, - 0x1c01f000, 0x1c01f000, 0x641c0801, 0x1c01f000, - 0x64140801, 0x0501f85a, 0x0501f056, 0x64140801, - 0x1c01f000, 0x64140801, 0x0501f04f, 0x40100000, - 0x0c01f001, 0x00104d31, 0x00104d31, 0x00104d31, - 0x00104d2d, 0x00104d2f, 0x00104d31, 0x00104d31, - 0x00104d31, 0x641c0801, 0x1c01f000, 0x64100801, - 0x1c01f000, 0x1c01f000, 0x40100000, 0x0c01f001, - 0x00104d3c, 0x00104d3e, 0x00104d3e, 0x00104d3f, - 0x00104d41, 0x00104d43, 0x00104d43, 0x00104d43, - 0x64080801, 0x1c01f000, 0x1c01f000, 0x641c0801, - 0x1c01f000, 0x64100801, 0x0501f02f, 0x64200801, - 0x1c01f000, 0x40100000, 0x0c01f001, 0x00104d4f, - 0x00104d51, 0x00104d53, 0x00104d53, 0x00104d54, - 0x00104d56, 0x00104d56, 0x00104d56, 0x64080801, - 0x1c01f000, 0x640c0801, 0x1c01f000, 0x1c01f000, - 0x64100801, 0x0501f01c, 0x64200801, 0x1c01f000, - 0x40100000, 0x0c01f001, 0x00104d62, 0x00104d62, - 0x00104d64, 0x00104d65, 0x00104d67, 0x00104d64, - 0x00104d69, 0x00104d64, 0x64140801, 0x0501f00b, + 0x59c40006, 0x8400050a, 0x48038806, 0x64838805, + 0x90000541, 0x0501f01b, 0x59c410a3, 0x84081518, + 0x05e5fd34, 0x4a038808, 0x00000200, 0x6095d000, + 0x0509f96d, 0x59c410a3, 0x84081558, 0x05e5fd2d, + 0x60082000, 0x0501f8ab, 0x497b8880, 0x59a80012, + 0x80000540, 0x05020002, 0x80000000, 0x48038893, + 0x59a8001f, 0x82000500, 0x0000ffff, 0x4c000000, + 0x05e5f96f, 0x5c000000, 0x48038880, 0x80000580, + 0x4df00000, 0x05e5fc4a, 0x5c03e000, 0x5c001000, + 0x480b8808, 0x5c01d000, 0x5c00b000, 0x1c01f000, + 0x4803c856, 0x60042000, 0x0501f892, 0x59c40004, + 0x82000500, 0x00003e02, 0x05000008, 0x0509ff9c, + 0x0501f987, 0x4a038808, 0x00000208, 0x64075014, + 0x6006d800, 0x0501f046, 0x05ddfb2f, 0x42000000, + 0x0010b31d, 0x0529fd44, 0x05ddff31, 0x59c40006, + 0x84000508, 0x48038806, 0x64438805, 0x850e1d4c, + 0x61900800, 0x42001000, 0x00104a75, 0x0509f91c, + 0x59c410a3, 0x84081518, 0x05e5fcf6, 0x4a038808, + 0x00000200, 0x497b8880, 0x4a038805, 0x000000f0, + 0x05e5fbf7, 0x61c00801, 0x59c40005, 0x80040d00, + 0x0500000b, 0x82000500, 0x000000e0, 0x0502000d, + 0x61a1d007, 0x0509f924, 0x0505ff8b, 0x59940004, + 0x80000540, 0x05fe07f1, 0x0501f021, 0x59c410a3, + 0x84081558, 0x05e5fcdf, 0x60082000, 0x0501f85d, + 0x4c080000, 0x42001000, 0x00104a75, 0x0509f905, + 0x5c001000, 0x497b8880, 0x59a80012, 0x80000540, + 0x05020002, 0x80000000, 0x48038893, 0x59a8001f, + 0x82000500, 0x0000ffff, 0x4c000000, 0x05e5f91c, + 0x5c000000, 0x48038880, 0x850e1d0c, 0x59c40006, + 0x84000548, 0x48038806, 0x05e5fbf5, 0x59c40008, + 0x82000540, 0x00000280, 0x48038808, 0x1c01f000, + 0x4803c856, 0x4d400000, 0x4d3c0000, 0x0509ff4c, + 0x0529fe0d, 0x0502002c, 0x599c1017, 0x8d0c0500, + 0x05020009, 0x8c08051a, 0x05000027, 0x850e1d42, + 0x60128000, 0x60227800, 0x8d0c0520, 0x05020006, + 0x0501f01d, 0x60128000, 0x417a7800, 0x8d0c0520, + 0x05000019, 0x0529fe09, 0x42024800, 0x0010b391, + 0x59240200, 0x8c000500, 0x05000006, 0x4c580000, + 0x60040800, 0x60001002, 0x0509f966, 0x5c00b000, + 0x91264c0b, 0x8058b040, 0x05fe07f6, 0x61fe41ff, + 0x4d400000, 0x603a8000, 0x600c3000, 0x61fe89ff, + 0x0525fdc9, 0x5c028000, 0x599c0817, 0x8c04050a, + 0x05020005, 0x4943c857, 0x493fc857, 0x0201f800, + 0x0010edf3, 0x497b8880, 0x6006d800, 0x05fdfd39, + 0x5c027800, 0x5c028000, 0x1c01f000, 0x05ddfab2, + 0x42000000, 0x0010b31e, 0x0529fcc7, 0x05ddfeb4, + 0x60040000, 0x05e5f8d2, 0x64078880, 0x05e5f3b0, + 0x42000800, 0x0010ae95, 0x48100802, 0x90101488, + 0x05001008, 0x58040001, 0x4803c857, 0x4813c857, + 0x58040003, 0x80000000, 0x48000803, 0x60082000, + 0x58040001, 0x9000148b, 0x05001007, 0x4803c857, + 0x4813c857, 0x58040003, 0x80000000, 0x48000803, + 0x60000000, 0x48000800, 0x59c428a4, 0x90142d0f, + 0x90142d8c, 0x0c000002, 0x0501f0fb, 0x00104daa, + 0x00104dc4, 0x00104dde, 0x00104df8, 0x00104e12, + 0x00104e28, 0x00104e37, 0x00104e4a, 0x00104e5d, + 0x00104e70, 0x00104e72, 0x40100000, 0x0c01f001, + 0x00104db4, 0x00104db6, 0x00104db8, 0x00104db9, + 0x00104dbb, 0x00104dbd, 0x00104dc0, 0x00104dc2, + 0x64080801, 0x1c01f000, 0x640c0801, 0x0501f0bc, 0x1c01f000, 0x641c0801, 0x1c01f000, 0x64100801, - 0x1c01f000, 0x64200801, 0x1c01f000, 0x64240801, - 0x1c01f000, 0x1c01f000, 0x42000000, 0x0010af96, - 0x0529f225, 0x42000000, 0x0010af93, 0x0529f222, - 0x42000000, 0x0010af95, 0x0529f21f, 0x42000000, - 0x0010af94, 0x0529f21c, 0x42000800, 0x0010ac15, - 0x58040001, 0x48000800, 0x64140801, 0x64200802, - 0x1c01f000, 0x42000800, 0x0010ac15, 0x58040001, - 0x48000800, 0x64040801, 0x64280802, 0x1c01f000, - 0x42000800, 0x0010ac15, 0x58040001, 0x48000800, - 0x64180801, 0x64240802, 0x1c01f000, 0x42000800, - 0x0010ac15, 0x64280801, 0x64280800, 0x1c01f000, - 0x496fc857, 0x4813c857, 0x40100000, 0x0c01f001, - 0x00104dae, 0x00104dae, 0x00104dae, 0x00104dae, - 0x00104da0, 0x00104da8, 0x00104dac, 0x00104dae, - 0x59a8021b, 0x8c000506, 0x05000003, 0x8c000502, - 0x0500000a, 0x0501f80a, 0x05fe07cb, 0x0501f007, - 0x0501f807, 0x05000005, 0x05fdffca, 0x05fdf7cc, - 0x0501f803, 0x05fe07ca, 0x1c01f000, 0x496fc857, - 0x416c0000, 0x90000c88, 0x05da1c3d, 0x0c01f001, - 0x00104dbc, 0x00104dbe, 0x00104dbe, 0x00104dbe, - 0x00104dbc, 0x00104dbc, 0x00104dbc, 0x00104dbe, - 0x80000580, 0x1c01f000, 0x90000541, 0x1c01f000, - 0x6002e000, 0x497b3004, 0x4a03b004, 0x60000001, - 0x59d80005, 0x4a03b004, 0x90000001, 0x4a03a804, - 0x60000001, 0x59d40005, 0x4a03a804, 0x90000001, - 0x0501fd55, 0x0501f541, 0x6413c825, 0x6413c827, - 0x599c0409, 0x80000d40, 0x0500001f, 0x599c0407, - 0x80000540, 0x05000007, 0x800000cc, 0x599c100b, - 0x80080400, 0x4803b000, 0x497bb002, 0x59d80001, - 0x599c000b, 0x4803b000, 0x599c000c, 0x4803b001, - 0x599c0407, 0x80000540, 0x05020002, 0x497bb002, - 0x599c0c09, 0x82040540, 0x00400000, 0x4803b003, - 0x6417b009, 0x4a03b004, 0x10000001, 0x59e00803, - 0x82040d00, 0xfffffeff, 0x82040d40, 0x00008000, - 0x4807c003, 0x599c040a, 0x80000540, 0x0500001f, - 0x599c0408, 0x80000540, 0x05000007, 0x800000cc, - 0x599c100f, 0x80080400, 0x4803a800, 0x497ba802, - 0x59d40001, 0x599c000f, 0x4803a800, 0x599c0010, - 0x4803a801, 0x599c0408, 0x80000540, 0x05020002, - 0x497ba802, 0x599c0c0a, 0x82040540, 0x00400000, - 0x4803a803, 0x6417a809, 0x4a03a804, 0x10000001, - 0x59e00803, 0x82040d00, 0xfffffbff, 0x82040d40, - 0x00008000, 0x4807c003, 0x800409c0, 0x05000004, - 0x6006e000, 0x0004b8ed, 0x0004f100, 0x1c01f000, - 0x05d9fbd7, 0x1c01f000, 0x0501f850, 0x5c03e000, - 0x0001f652, 0x0001ffb1, 0x05fdf7fd, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e76, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x000207a8, 0x00104e6a, 0x00104e6a, - 0x00104e76, 0x00104e76, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x000207a8, 0x492fc857, 0x42000000, - 0x0010b051, 0x0529f928, 0x60000008, 0x0501f013, - 0x492fc857, 0x42000000, 0x0010b050, 0x0529f922, - 0x60000020, 0x0501f00d, 0x492fc857, 0x42000000, - 0x0010b04f, 0x0529f91c, 0x60000040, 0x0501f007, - 0x492fc857, 0x42000000, 0x0010b052, 0x0529f916, - 0x60000010, 0x0501f001, 0x4803c857, 0x592c0c05, - 0x82040d00, 0xffff80ff, 0x80040540, 0x59980803, - 0x800409c0, 0x05000002, 0x8400051e, 0x48025c05, - 0x0001ff6c, 0x0001fb5b, 0x91700583, 0x6006e000, - 0x05000002, 0x1c01f000, 0x599a5801, 0x812e59c0, - 0x05fe07e2, 0x05d9fb5a, 0x60081000, 0x60000801, - 0x60401800, 0x0501f004, 0x600c1000, 0x41780800, - 0x60181800, 0x492fc857, 0x480bc857, 0x592c0205, - 0x82000500, 0x000000ff, 0xb00005aa, 0x05000004, - 0x480e5a07, 0x0001fb5b, 0x0501f00a, 0x4d400000, - 0x4c300000, 0x497a5c09, 0x497a5c0a, 0x400a8000, - 0x05fdf941, 0x0001fb5b, 0x5c006000, 0x5c028000, - 0x6006e000, 0x4a006002, 0x00000100, 0x58325809, - 0x49786009, 0x05d9fed7, 0x5c025800, 0x1c01f000, - 0x492fc857, 0x80140110, 0x05fc07b6, 0x80000040, - 0x05000026, 0x4a033006, 0x00104ee2, 0x0001f65b, - 0x492fc857, 0x0529f9e4, 0x00020799, 0x492fc856, - 0x83440400, 0x0010a380, 0x50000000, 0x80026d40, - 0x0500000b, 0x592e4411, 0x81224110, 0x59340013, - 0x80000130, 0x81200580, 0x05020005, 0x4937c857, - 0x59340200, 0x8c00050e, 0x00020799, 0x60a28000, - 0x41780800, 0x417a6000, 0x05fdf917, 0x0519fd9f, - 0x0001f35b, 0x82000500, 0x0f000000, 0x8000012a, - 0x592c0c0b, 0x82040d00, 0x0000ff87, 0x80040540, - 0x48025c0b, 0x0001f7a5, 0x492fc857, 0x592c0409, - 0x80000540, 0x05fe0797, 0x8d0c050e, 0x05020008, - 0x592c0208, 0x80000540, 0x05fc0792, 0x497a5a07, - 0x05f9f83a, 0x05020003, 0x1c01f000, 0x60a00000, - 0x48025a07, 0x0001f35b, 0x592e8a07, 0x592c0407, - 0x4947c857, 0x4803c857, 0x82000500, 0x000000ff, - 0x6004b800, 0x90000d81, 0x0500000e, 0x417a8800, - 0x61c0b80f, 0x90000d82, 0x0500000a, 0x80000540, - 0x0002035b, 0x592e8a07, 0x0001fae7, 0x0002035b, - 0x592e9009, 0x592e980a, 0x05f9fbbd, 0x0001f35b, - 0x850e1d00, 0x0001fae7, 0x05f80ca1, 0x81468800, - 0x805cb840, 0x05fe07fc, 0x0001f35b, 0x592c0a09, - 0x4807c857, 0x592e4411, 0x81224110, 0x9004058e, - 0x0500006b, 0x900405aa, 0x0500001d, 0x9004058f, - 0x05000413, 0x900405ae, 0x05000411, 0x4c040000, - 0x0501fb74, 0x5c000800, 0x05020411, 0xb0040586, - 0x0500007e, 0xb0040585, 0x05000029, 0xb0040589, - 0x05000407, 0x900405a9, 0x05020409, 0x592e8a07, - 0x05f9fdcc, 0x05020402, 0x59340200, 0x84000518, - 0x48026a00, 0x592e600a, 0x4933c857, 0x83300580, - 0xffffffff, 0x05020072, 0x0501f3f9, 0x83200580, - 0x000000ff, 0x05000008, 0x83200400, 0x0010a0ec, - 0x50024800, 0x59240a00, 0x84040d16, 0x48064a00, - 0x0501f3ef, 0x42024800, 0x0010b111, 0x0529f973, - 0x59240200, 0x8c000500, 0x05000004, 0x59240200, - 0x84000516, 0x48024a00, 0x91264c0b, 0x8058b040, - 0x05fe07f8, 0x850e1d04, 0x0501f3e1, 0x592c1408, - 0x480bc857, 0x051df865, 0x411e6000, 0x05020003, - 0x4803c856, 0x0501f3de, 0x59300c07, 0x90040584, - 0x05000003, 0x4803c856, 0x0501f3d9, 0x592c0208, - 0x8c000506, 0x0500000b, 0x0509f823, 0x4df00000, - 0x0505ff20, 0x0201f800, 0x0010eeb1, 0x80c40040, - 0x5c03e000, 0x05080808, 0x050dfdb1, 0x0501f3c8, - 0x592e380a, 0x591c1416, 0x8c080516, 0x050003c8, - 0x59300009, 0x800001c0, 0x05da0a85, 0x84081554, - 0x480a3c16, 0x64ea6403, 0x592c040c, 0x80000540, - 0x05000006, 0x64ee6403, 0x592c020d, 0x4802641c, - 0x592c040d, 0x4802621c, 0x64066203, 0x42000800, - 0x80000040, 0x0501fbbd, 0x05000003, 0x492e6009, - 0x0005f32e, 0x0005fb2e, 0x0501f3ad, 0x83200d80, - 0x000000ff, 0x05000010, 0x42000000, 0x0010b110, - 0x50000000, 0x81200480, 0x000610e7, 0x83200400, - 0x0010a0ec, 0x50024800, 0x59240200, 0x8c000500, - 0x000400e7, 0x59240206, 0x84000510, 0x48024a06, - 0x0501f39b, 0x42024800, 0x0010b111, 0x0529f91f, - 0x59240200, 0x8c000500, 0x05000004, 0x59240206, - 0x84000510, 0x48024a06, 0x91264c0b, 0x8058b040, - 0x05fe07f8, 0x0501f38e, 0x592c1208, 0x8c080500, - 0x0502038b, 0x592e8a07, 0x592e600a, 0x051df818, - 0x05020003, 0x4803c856, 0x0501f389, 0x59300c07, - 0x90040584, 0x05000003, 0x4803c856, 0x0501f384, - 0x59300a03, 0x90040587, 0x05000003, 0x4803c856, - 0x0501f37f, 0x59300c03, 0x90040581, 0x05000016, - 0x90040582, 0x0500000e, 0x90040588, 0x05000010, - 0x9004058a, 0x05000005, 0x9004058c, 0x05020014, - 0x60240800, 0x0501f011, 0x5932680a, 0x05f9fcf6, - 0x0502000f, 0x60140800, 0x0501f00c, 0x417a7800, - 0x0201f800, 0x0010ec6c, 0x64066407, 0x600c0800, - 0x0501f006, 0x417a7800, 0x0201f800, 0x0010ec6c, - 0x64066407, 0x602c0800, 0x05f9f91d, 0x64066203, - 0x0501fb66, 0x05000003, 0x492e6009, 0x0505f64f, - 0x0505fe4e, 0x0501f356, 0x59300416, 0x8c000518, - 0x052603a0, 0x0501f094, 0x40000800, 0x58040000, - 0x80000540, 0x05fe07fd, 0x492c0800, 0x1c01f000, - 0x492fc857, 0x59300c07, 0x90040586, 0x05020087, - 0x59340400, 0x82000580, 0x00000606, 0x05020004, - 0x59340200, 0x8c00051a, 0x000007fb, 0x59340200, - 0x8c00050e, 0x0500007d, 0x59300203, 0x60067800, - 0x90000587, 0x000207fb, 0x640a6203, 0x0001f7fb, - 0x600a8000, 0x64526006, 0x4d2c0000, 0x0521ff12, - 0x5c025800, 0x59300c07, 0x4807c857, 0x90040587, - 0x0502005c, 0x492fc857, 0x64065a07, 0x0001f35b, - 0x83300580, 0xffffffff, 0x05020056, 0x592c240b, - 0x492fc857, 0x4813c857, 0x8c10051c, 0x05020016, - 0x8c10051a, 0x05000003, 0x8c10050a, 0x05000062, - 0x59340a00, 0x8c04050e, 0x05000003, 0x8c10051e, - 0x0500005d, 0x0005fc3d, 0x05000065, 0x592c240b, - 0x59243a00, 0x592c020d, 0x48026202, 0x4936600a, - 0x4926601d, 0x4932580a, 0x641a6407, 0x641e6203, - 0x0001f7f6, 0x592c0a0d, 0x4c040000, 0x05f9ff67, - 0x5c000800, 0x0502006a, 0x58080000, 0x49781000, - 0x802041c0, 0x05000006, 0x48004000, 0x80000540, - 0x05020007, 0x48226810, 0x0501f005, 0x4802680f, - 0x80000540, 0x05020002, 0x497a6810, 0x4d2c0000, - 0x400a5800, 0x640a5a07, 0x0001fb5b, 0x5c025800, - 0x05fdf7c9, 0x8c10051c, 0x000207e7, 0x0501f01e, - 0x05f9fcbc, 0x000007dd, 0x42000000, 0x0010b110, - 0x50000000, 0x81200480, 0x0502102c, 0x8c10051c, - 0x05000015, 0x592c0207, 0x82000580, 0x0000ffff, - 0x05020011, 0x592e600a, 0x83300580, 0xffffffff, - 0x05fc07b5, 0x051dfc62, 0x0502000e, 0x592c220d, - 0x59300202, 0x80100580, 0x0502000a, 0x59300009, - 0x800001c0, 0x05020004, 0x59300203, 0x90000587, - 0x05fc07a0, 0x492fc857, 0x64a65a07, 0x0001f35b, - 0x492fc857, 0x64225a07, 0x0001f35b, 0x4803c857, - 0x8c000514, 0x05000007, 0x42000000, 0x0010b040, - 0x0525ff35, 0x492fc857, 0x492e6009, 0x1c01f000, - 0x492fc857, 0x65165a07, 0x0001f35b, 0x492fc857, - 0x64aa5a07, 0x0001f35b, 0x492fc857, 0x64a25a07, - 0x0001f35b, 0x492fc857, 0x641a5a07, 0x0001f35b, - 0x492fc857, 0x643a5a07, 0x0001f35b, 0x90040587, - 0x05fe07e4, 0x640a5a07, 0x0001f35b, 0x592c0407, - 0x800000c2, 0x800008c4, 0x80040400, 0x48025804, - 0x59340010, 0x492e6810, 0x492fc857, 0x80000d40, - 0x05000003, 0x492c0800, 0x1c01f000, 0x59340203, - 0x492e680f, 0x492fc857, 0x4803c857, 0x80000540, - 0x05020002, 0x64066a03, 0x1c01f000, 0x59a8000d, - 0x81640480, 0x05fe1770, 0x42026000, 0x001102e4, - 0x5930000a, 0x81340580, 0x05020004, 0x59300202, - 0x80040580, 0x05fc075f, 0x91326430, 0x41580000, - 0x81300480, 0x05fc17f7, 0x05fdf763, 0x492fc857, - 0x592e7c07, 0x833c0500, 0xfffffffe, 0x0502003d, - 0x592c4008, 0x42026000, 0x001102e4, 0x41581800, - 0x400c0000, 0x81300480, 0x05021021, 0x59300203, - 0x90000580, 0x05000007, 0x59300009, 0x80000d40, - 0x05000004, 0x58040006, 0x80200580, 0x05000003, - 0x91326430, 0x05fdf7f3, 0x58040205, 0x82000500, - 0x000000ff, 0xb0000d93, 0x0500000b, 0xb0000d88, - 0x05000009, 0x90000d98, 0x05000007, 0x90000da9, + 0x0501f0ba, 0x64140801, 0x0501f8be, 0x0501f0ba, + 0x64140801, 0x0501f0bb, 0x4813c857, 0x1c01f000, + 0x40100000, 0x0c01f001, 0x00104dce, 0x00104dd0, + 0x00104dd2, 0x00104dd3, 0x00104dd5, 0x00104dd7, + 0x00104dda, 0x00104ddc, 0x64080801, 0x1c01f000, + 0x640c0801, 0x1c01f000, 0x1c01f000, 0x641c0801, + 0x1c01f000, 0x64100801, 0x0501f0a0, 0x64140801, + 0x0501f8a4, 0x0501f0a0, 0x64140801, 0x1c01f000, + 0x64140801, 0x0501f099, 0x40100000, 0x0c01f001, + 0x00104de8, 0x00104de9, 0x00104deb, 0x00104ded, + 0x00104def, 0x00104df1, 0x00104df4, 0x00104df6, + 0x1c01f000, 0x640c0801, 0x1c01f000, 0x64000801, + 0x1c01f000, 0x641c0801, 0x1c01f000, 0x64100801, + 0x0501f086, 0x64140801, 0x0501f88a, 0x0501f086, + 0x64140801, 0x1c01f000, 0x64140801, 0x0501f07f, + 0x40100000, 0x0c01f001, 0x00104e02, 0x00104e04, + 0x00104e05, 0x00104e07, 0x00104e09, 0x00104e0b, + 0x00104e0e, 0x00104e10, 0x64080801, 0x1c01f000, + 0x1c01f000, 0x64000801, 0x1c01f000, 0x641c0801, + 0x1c01f000, 0x64100801, 0x0501f06c, 0x64140801, + 0x0501f870, 0x0501f06c, 0x64140801, 0x1c01f000, + 0x64140801, 0x0501f065, 0x40100000, 0x0c01f001, + 0x00104e1c, 0x00104e1e, 0x00104e1e, 0x00104e1f, + 0x00104e1e, 0x00104e21, 0x00104e24, 0x00104e26, + 0x64080801, 0x1c01f000, 0x1c01f000, 0x641c0801, + 0x1c01f000, 0x64140801, 0x0501f85a, 0x0501f056, + 0x64140801, 0x1c01f000, 0x64140801, 0x0501f04f, + 0x40100000, 0x0c01f001, 0x00104e36, 0x00104e36, + 0x00104e36, 0x00104e32, 0x00104e34, 0x00104e36, + 0x00104e36, 0x00104e36, 0x641c0801, 0x1c01f000, + 0x64100801, 0x1c01f000, 0x1c01f000, 0x40100000, + 0x0c01f001, 0x00104e41, 0x00104e43, 0x00104e43, + 0x00104e44, 0x00104e46, 0x00104e48, 0x00104e48, + 0x00104e48, 0x64080801, 0x1c01f000, 0x1c01f000, + 0x641c0801, 0x1c01f000, 0x64100801, 0x0501f02f, + 0x64200801, 0x1c01f000, 0x40100000, 0x0c01f001, + 0x00104e54, 0x00104e56, 0x00104e58, 0x00104e58, + 0x00104e59, 0x00104e5b, 0x00104e5b, 0x00104e5b, + 0x64080801, 0x1c01f000, 0x640c0801, 0x1c01f000, + 0x1c01f000, 0x64100801, 0x0501f01c, 0x64200801, + 0x1c01f000, 0x40100000, 0x0c01f001, 0x00104e67, + 0x00104e67, 0x00104e69, 0x00104e6a, 0x00104e6c, + 0x00104e69, 0x00104e6e, 0x00104e69, 0x64140801, + 0x0501f00b, 0x1c01f000, 0x641c0801, 0x1c01f000, + 0x64100801, 0x1c01f000, 0x64200801, 0x1c01f000, + 0x64240801, 0x1c01f000, 0x1c01f000, 0x42000000, + 0x0010b216, 0x0529f3d0, 0x42000000, 0x0010b213, + 0x0529f3cd, 0x42000000, 0x0010b215, 0x0529f3ca, + 0x42000000, 0x0010b214, 0x0529f3c7, 0x42000800, + 0x0010ae95, 0x58040001, 0x48000800, 0x64140801, + 0x64200802, 0x1c01f000, 0x42000800, 0x0010ae95, + 0x58040001, 0x48000800, 0x64040801, 0x64280802, + 0x1c01f000, 0x42000800, 0x0010ae95, 0x58040001, + 0x48000800, 0x64180801, 0x64240802, 0x1c01f000, + 0x42000800, 0x0010ae95, 0x64280801, 0x64280800, + 0x1c01f000, 0x496fc857, 0x4813c857, 0x40100000, + 0x0c01f001, 0x00104eb3, 0x00104eb3, 0x00104eb3, + 0x00104eb3, 0x00104ea5, 0x00104ead, 0x00104eb1, + 0x00104eb3, 0x59a8021b, 0x8c000506, 0x05000003, + 0x8c000502, 0x0500000a, 0x0501f80a, 0x05fe07cb, + 0x0501f007, 0x0501f807, 0x05000005, 0x05fdffca, + 0x05fdf7cc, 0x0501f803, 0x05fe07ca, 0x1c01f000, + 0x496fc857, 0x416c0000, 0x90000c88, 0x05da1b38, + 0x0c01f001, 0x00104ec1, 0x00104ec3, 0x00104ec3, + 0x00104ec3, 0x00104ec1, 0x00104ec1, 0x00104ec1, + 0x00104ec3, 0x80000580, 0x1c01f000, 0x90000541, + 0x1c01f000, 0x6002e000, 0x497b3004, 0x4a03b004, + 0x60000001, 0x59d80005, 0x4a03b004, 0x90000001, + 0x4a03a804, 0x60000001, 0x59d40005, 0x4a03a804, + 0x90000001, 0x0501fdc9, 0x0501f5b5, 0x6413c825, + 0x6413c827, 0x599c0409, 0x80000d40, 0x0500001f, + 0x599c0407, 0x80000540, 0x05000007, 0x800000cc, + 0x599c100b, 0x80080400, 0x4803b000, 0x497bb002, + 0x59d80001, 0x599c000b, 0x4803b000, 0x599c000c, + 0x4803b001, 0x599c0407, 0x80000540, 0x05020002, + 0x497bb002, 0x599c0c09, 0x82040540, 0x00400000, + 0x4803b003, 0x6417b009, 0x4a03b004, 0x10000001, + 0x59e00803, 0x82040d00, 0xfffffeff, 0x82040d40, + 0x00008000, 0x4807c003, 0x599c040a, 0x80000540, + 0x0500001f, 0x599c0408, 0x80000540, 0x05000007, + 0x800000cc, 0x599c100f, 0x80080400, 0x4803a800, + 0x497ba802, 0x59d40001, 0x599c000f, 0x4803a800, + 0x599c0010, 0x4803a801, 0x599c0408, 0x80000540, + 0x05020002, 0x497ba802, 0x599c0c0a, 0x82040540, + 0x00400000, 0x4803a803, 0x6417a809, 0x4a03a804, + 0x10000001, 0x59e00803, 0x82040d00, 0xfffffbff, + 0x82040d40, 0x00008000, 0x4807c003, 0x800409c0, + 0x05000004, 0x6006e000, 0x0004b8ed, 0x0004f100, + 0x1c01f000, 0x05d9fad2, 0x1c01f000, 0x0501f850, + 0x5c03e000, 0x0001f652, 0x0001ffb1, 0x05fdf7fd, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f7b, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x000207a8, 0x00104f6f, + 0x00104f6f, 0x00104f7b, 0x00104f7b, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x000207a8, 0x492fc857, + 0x42000000, 0x0010b2d1, 0x0529fad3, 0x60000008, + 0x0501f013, 0x492fc857, 0x42000000, 0x0010b2d0, + 0x0529facd, 0x60000020, 0x0501f00d, 0x492fc857, + 0x42000000, 0x0010b2cf, 0x0529fac7, 0x60000040, + 0x0501f007, 0x492fc857, 0x42000000, 0x0010b2d2, + 0x0529fac1, 0x60000010, 0x0501f001, 0x4803c857, + 0x592c0c05, 0x82040d00, 0xffff80ff, 0x80040540, + 0x59980803, 0x800409c0, 0x05000002, 0x8400051e, + 0x48025c05, 0x0001ff6c, 0x0001fb5b, 0x91700583, + 0x6006e000, 0x05000002, 0x1c01f000, 0x599a5801, + 0x812e59c0, 0x05fe07e2, 0x05d9fa55, 0x60081000, + 0x60000801, 0x60401800, 0x0501f004, 0x600c1000, + 0x41780800, 0x60181800, 0x492fc857, 0x480bc857, + 0x592c0205, 0x82000500, 0x000000ff, 0xb00005aa, + 0x05000004, 0x480e5a07, 0x0001fb5b, 0x0501f00a, + 0x4d400000, 0x4c300000, 0x497a5c09, 0x497a5c0a, + 0x400a8000, 0x05fdf939, 0x0001fb5b, 0x5c006000, + 0x5c028000, 0x6006e000, 0x4a006002, 0x00000100, + 0x58325809, 0x49786009, 0x05d9fdd2, 0x5c025800, + 0x1c01f000, 0x492fc857, 0x80140110, 0x05fc07b6, + 0x80000040, 0x05000026, 0x4a033006, 0x00104fe7, + 0x0001f65b, 0x492fc857, 0x0529fb8f, 0x00020799, + 0x492fc856, 0x83440400, 0x0010a600, 0x50000000, + 0x80026d40, 0x0500000b, 0x592e4411, 0x81224110, + 0x59340013, 0x80000130, 0x81200580, 0x05020005, + 0x4937c857, 0x59340200, 0x8c00050e, 0x00020799, + 0x60a28000, 0x41780800, 0x417a6000, 0x05fdf90f, + 0x0519fe7b, 0x0001f35b, 0x82000500, 0x0f000000, + 0x8000012a, 0x592c0c0b, 0x82040d00, 0x0000ff87, + 0x80040540, 0x48025c0b, 0x0001f7a5, 0x492fc857, + 0x592c0409, 0x80000540, 0x05fe0797, 0x8d0c050e, + 0x05020008, 0x592c0208, 0x80000540, 0x05fc0792, + 0x497a5a07, 0x05f9f808, 0x05020003, 0x1c01f000, + 0x60a00000, 0x48025a07, 0x0001f35b, 0x592e8a07, + 0x592c0407, 0x4947c857, 0x4803c857, 0x82000500, + 0x000000ff, 0x6004b800, 0x90000d81, 0x0500000e, + 0x417a8800, 0x61c0b80f, 0x90000d82, 0x0500000a, + 0x80000540, 0x0002035b, 0x592e8a07, 0x0001fae7, + 0x0002035b, 0x592e9009, 0x592e980a, 0x05f9fb92, + 0x0001f35b, 0x850e1d00, 0x0001fae7, 0x05f80c76, + 0x81468800, 0x805cb840, 0x05fe07fc, 0x0001f35b, + 0x592c0a09, 0x4807c857, 0x592e4411, 0x81224110, + 0x9004058e, 0x05000070, 0x900405aa, 0x05000022, + 0x9004058f, 0x05000487, 0x900405ae, 0x05000485, + 0x4c040000, 0x0501fbe8, 0x5c000800, 0x05020485, + 0xb0040586, 0x05000083, 0xb0040585, 0x0500002e, + 0xb0040589, 0x0500047b, 0x900405a9, 0x0502047d, + 0x592e8a07, 0x42026800, 0x0010ce8f, 0x83440580, + 0x0000ffff, 0x05000006, 0x05f9fd9e, 0x05020471, + 0x59340200, 0x84000518, 0x48026a00, 0x592e600a, + 0x4933c857, 0x83300580, 0xffffffff, 0x05020072, + 0x0501f468, 0x83200580, 0x000000ff, 0x05000008, + 0x83200400, 0x0010a3b3, 0x50024800, 0x59240a00, + 0x84040d16, 0x48064a00, 0x0501f45e, 0x42024800, + 0x0010b391, 0x0529fb19, 0x59240200, 0x8c000500, + 0x05000004, 0x59240200, 0x84000516, 0x48024a00, + 0x91264c0b, 0x8058b040, 0x05fe07f8, 0x850e1d04, + 0x0501f450, 0x592c1408, 0x480bc857, 0x051df93c, + 0x411e6000, 0x05020003, 0x4803c856, 0x0501f44d, + 0x59300c07, 0x90040584, 0x05000003, 0x4803c856, + 0x0501f448, 0x592c0208, 0x8c000506, 0x0500000b, + 0x0509f8db, 0x4df00000, 0x0505ffd8, 0x0201f800, + 0x0010f0c0, 0x80c40040, 0x5c03e000, 0x050808c0, + 0x050dfe5b, 0x0501f437, 0x592e380a, 0x591c1416, + 0x8c080516, 0x05000437, 0x59300009, 0x800001c0, + 0x05da097b, 0x84081554, 0x480a3c16, 0x64ea6403, + 0x592c040c, 0x80000540, 0x05000006, 0x64ee6403, + 0x592c020d, 0x4802641c, 0x592c040d, 0x4802621c, + 0x64066203, 0x42000800, 0x80000040, 0x0501fc2c, + 0x05000003, 0x492e6009, 0x0005f32e, 0x0005fb2e, + 0x0501f41c, 0x83200d80, 0x000000ff, 0x05000010, + 0x42000000, 0x0010b390, 0x50000000, 0x81200480, + 0x000610e7, 0x83200400, 0x0010a3b3, 0x50024800, + 0x59240200, 0x8c000500, 0x000400e7, 0x59240206, + 0x84000510, 0x48024a06, 0x0501f40a, 0x42024800, + 0x0010b391, 0x0529fac5, 0x59240200, 0x8c000500, + 0x05000004, 0x59240206, 0x84000510, 0x48024a06, + 0x91264c0b, 0x8058b040, 0x05fe07f8, 0x0501f3fd, + 0x592c1208, 0x8c080500, 0x050203fa, 0x592e8a07, + 0x592e600a, 0x051df8ef, 0x05020003, 0x4803c856, + 0x0501f3f8, 0x59300c07, 0x90040584, 0x05000003, + 0x4803c856, 0x0501f3f3, 0x59300a03, 0x90040587, + 0x05000003, 0x4803c856, 0x0501f3ee, 0x59300c03, + 0x90040581, 0x05000016, 0x90040582, 0x0500000e, + 0x90040588, 0x05000010, 0x9004058a, 0x05000005, + 0x9004058c, 0x0502001d, 0x60240800, 0x0501f01a, + 0x5932680a, 0x05f9fcc8, 0x05020018, 0x60140800, + 0x0501f015, 0x417a7800, 0x0201f800, 0x0010ee7a, + 0x64066407, 0x600c0800, 0x0501f00f, 0x83340580, + 0x0010ce8f, 0x05020007, 0x5930000a, 0x82000580, + 0x0010ce8f, 0x050203cf, 0x64066407, 0x0501f007, + 0x417a7800, 0x0201f800, 0x0010ee7a, 0x64066407, + 0x602c0800, 0x05f9f8dd, 0x64066203, 0x0501fbcc, + 0x05000003, 0x492e6009, 0x0505f6fe, 0x0505fefd, + 0x0501f3bc, 0x59300416, 0x8c000518, 0x0526052b, + 0x0501f094, 0x40000800, 0x58040000, 0x80000540, + 0x05fe07fd, 0x492c0800, 0x1c01f000, 0x492fc857, + 0x59300c07, 0x90040586, 0x05020087, 0x59340400, + 0x82000580, 0x00000606, 0x05020004, 0x59340200, + 0x8c00051a, 0x000007fb, 0x59340200, 0x8c00050e, + 0x0500007d, 0x59300203, 0x60067800, 0x90000587, + 0x000207fb, 0x640a6203, 0x0001f7fb, 0x600a8000, + 0x64526006, 0x4d2c0000, 0x0525f896, 0x5c025800, + 0x59300c07, 0x4807c857, 0x90040587, 0x0502005c, + 0x492fc857, 0x64065a07, 0x0001f35b, 0x83300580, + 0xffffffff, 0x05020056, 0x592c240b, 0x492fc857, + 0x4813c857, 0x8c10051c, 0x05020016, 0x8c10051a, + 0x05000003, 0x8c10050a, 0x05000062, 0x59340a00, + 0x8c04050e, 0x05000003, 0x8c10051e, 0x0500005d, + 0x0005fc3d, 0x05000065, 0x592c240b, 0x59243a00, + 0x592c020d, 0x48026202, 0x4936600a, 0x4926601d, + 0x4932580a, 0x641a6407, 0x641e6203, 0x0001f7f6, + 0x592c0a0d, 0x4c040000, 0x05f9ff33, 0x5c000800, + 0x0502006a, 0x58080000, 0x49781000, 0x802041c0, + 0x05000006, 0x48004000, 0x80000540, 0x05020007, + 0x48226810, 0x0501f005, 0x4802680f, 0x80000540, + 0x05020002, 0x497a6810, 0x4d2c0000, 0x400a5800, + 0x640a5a07, 0x0001fb5b, 0x5c025800, 0x05fdf7c9, + 0x8c10051c, 0x000207e7, 0x0501f01e, 0x05f9fc85, + 0x000007dd, 0x42000000, 0x0010b390, 0x50000000, + 0x81200480, 0x0502102c, 0x8c10051c, 0x05000015, + 0x592c0207, 0x82000580, 0x0000ffff, 0x05020011, + 0x592e600a, 0x83300580, 0xffffffff, 0x05fc07b5, + 0x051dfd35, 0x0502000e, 0x592c220d, 0x59300202, + 0x80100580, 0x0502000a, 0x59300009, 0x800001c0, + 0x05020004, 0x59300203, 0x90000587, 0x05fc07a0, + 0x492fc857, 0x64a65a07, 0x0001f35b, 0x492fc857, + 0x64225a07, 0x0001f35b, 0x4803c857, 0x8c000514, + 0x05000007, 0x42000000, 0x0010b2c0, 0x0529f8d2, + 0x492fc857, 0x492e6009, 0x1c01f000, 0x492fc857, + 0x65165a07, 0x0001f35b, 0x492fc857, 0x64aa5a07, + 0x0001f35b, 0x492fc857, 0x64a25a07, 0x0001f35b, + 0x492fc857, 0x641a5a07, 0x0001f35b, 0x492fc857, + 0x643a5a07, 0x0001f35b, 0x90040587, 0x05fe07e4, + 0x640a5a07, 0x0001f35b, 0x592c0407, 0x800000c2, + 0x800008c4, 0x80040400, 0x48025804, 0x59340010, + 0x492e6810, 0x492fc857, 0x80000d40, 0x05000003, + 0x492c0800, 0x1c01f000, 0x59340203, 0x492e680f, + 0x492fc857, 0x4803c857, 0x80000540, 0x05020002, + 0x64066a03, 0x1c01f000, 0x59a8000d, 0x81640480, + 0x05fe1770, 0x42026000, 0x00110514, 0x59300407, + 0x90000586, 0x05020007, 0x5930000a, 0x81340580, + 0x05020004, 0x59300202, 0x80040580, 0x05fc075c, + 0x91326430, 0x41580000, 0x81300480, 0x05fc17f4, + 0x05fdf760, 0x492fc857, 0x592e7c07, 0x833c0500, + 0xfffffffe, 0x0502003f, 0x592c4008, 0x42026000, + 0x00110514, 0x41581800, 0x400c0000, 0x81300480, + 0x05021023, 0x59300203, 0x90000580, 0x05000007, + 0x59300009, 0x80000d40, 0x05000004, 0x58040006, + 0x80200580, 0x05000003, 0x91326430, 0x05fdf7f3, + 0x58040205, 0x82000500, 0x000000ff, 0xb0000d93, + 0x0500000d, 0xb0000d88, 0x0500000b, 0x90000d98, + 0x05000009, 0x90000da9, 0x05000007, 0x90000d94, 0x05000005, 0xb00005a8, 0x05000003, 0x90000582, - 0x05fe07f0, 0x4d2c0000, 0x0515feae, 0x5c025800, + 0x05fe07ee, 0x4d2c0000, 0x0515ff74, 0x5c025800, 0x05000018, 0x64025a07, 0x0001f35b, 0x592e8a07, 0x83440480, 0x000007f0, 0x05021012, 0x83440400, - 0x0010a380, 0x50000000, 0x80026d40, 0x0500000d, - 0x4d2c0000, 0x05f9fa7a, 0x05000009, 0x60168000, - 0x592c0a09, 0x417a6000, 0x05f9ff17, 0x0519fba4, + 0x0010a600, 0x50000000, 0x80026d40, 0x0500000d, + 0x4d2c0000, 0x05f9fa3c, 0x05000009, 0x60168000, + 0x592c0a09, 0x417a6000, 0x05f9fefc, 0x0519fc6d, 0x0001fb5b, 0x5c025800, 0x05fdf7eb, 0x5c025800, 0x64c65a07, 0x0001f35b, 0x492fc857, 0x4d2c0000, - 0x05d9fc9c, 0x05000011, 0x492fc857, 0x412f4000, - 0x05d9fc98, 0x0500000b, 0x492fc857, 0x412dd800, - 0x05f1fcf5, 0x05f1fcfd, 0x49a1d80a, 0x5c025800, - 0x492dd809, 0x48ef4006, 0x05e9f829, 0x05e9f040, - 0x41a25800, 0x05d9fc9b, 0x5c025800, 0x4a025a07, + 0x05d9fb84, 0x05000011, 0x492fc857, 0x412f4000, + 0x05d9fb80, 0x0500000b, 0x492fc857, 0x412dd800, + 0x05f1fca8, 0x05f1fcb0, 0x49a1d80a, 0x5c025800, + 0x492dd809, 0x48ef4006, 0x05e5ffb4, 0x05e5f7cb, + 0x41a25800, 0x05d9fb83, 0x5c025800, 0x4a025a07, 0x00004005, 0x640a5c07, 0x0001f35b, 0x4807c857, 0x485fc857, 0x6004b800, 0x5c000800, 0x4c5c0000, 0x0501f005, 0x4807c857, 0x485fc857, 0x5c000800, 0x4d780000, 0x4803c857, 0x492fc857, 0x8c00050e, - 0x05da08e1, 0x4203e000, 0x50000000, 0x600cb900, - 0x05d9f0eb, 0x4803c856, 0x4c5c0000, 0x4c600000, + 0x05d60fc9, 0x4203e000, 0x50000000, 0x600cb900, + 0x05d5f7d3, 0x4803c856, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4d040000, 0x59a8008d, 0x90000506, - 0x0502008c, 0x916c0580, 0x0500008a, 0x592c0208, + 0x050200ca, 0x916c0580, 0x050000c8, 0x592c0208, 0x8200cd00, 0x000000ff, 0x592c0408, 0x8200c500, - 0x000000ff, 0x05000087, 0x42000000, 0x0010b110, - 0x50000000, 0x80600480, 0x05021082, 0x912c7c09, - 0x60064000, 0x60060800, 0x4200b800, 0xffffffff, - 0x83200580, 0x000000e1, 0x05020003, 0x4200b800, - 0x3fffffff, 0x503c0000, 0x805cbd00, 0x05020003, - 0x91224420, 0x0501f00f, 0x805cb902, 0x05021009, - 0x83200400, 0x0010a0ec, 0x50024800, 0x90640580, - 0x05000010, 0x8c640506, 0x05020031, 0x0501f069, - 0x81060800, 0x81224000, 0x910404a1, 0x05fc17f3, - 0x803c7800, 0x83200480, 0x00000100, 0x05fc17e2, - 0x61fa4001, 0x8060c1c0, 0x0502005e, 0x0501f045, - 0x59240a00, 0x90040d03, 0x90040d83, 0x05000059, - 0x59240c00, 0x8c04050a, 0x05020004, 0x8d0c0520, - 0x05000054, 0x0501f003, 0x8c040508, 0x05000051, - 0x4d3c0000, 0x4d300000, 0x600a78a0, 0x417a6000, - 0x05e5fe1f, 0x5c026000, 0x5c027800, 0x59240206, - 0x82000500, 0xfffffcff, 0x48024a06, 0x64164a00, - 0x05fdf8d1, 0x05020003, 0x05e5fda6, 0x0500003f, - 0x81060800, 0x81224000, 0x8060c040, 0x05fe07cb, - 0x05fdf8c9, 0x05020023, 0x0501f02e, 0x59240a00, - 0x8c040500, 0x05000037, 0x82040d00, 0xfffffffc, - 0x84040d44, 0x48064a00, 0x8c640502, 0x05020013, - 0x59240c08, 0x05e1fcd3, 0x4c5c0000, 0x4d3c0000, - 0x600a78a0, 0x4d300000, 0x417a6000, 0x05e5fdfc, + 0x000000ff, 0x050000c5, 0x42000000, 0x0010b390, + 0x50000000, 0x4c000000, 0x0529f94b, 0x5c000000, + 0x05000002, 0x80000000, 0x80600480, 0x050210bb, + 0x912c7c09, 0x592c0407, 0x4803c857, 0x8c000500, + 0x05000005, 0x0529f940, 0x050000b4, 0x417a4000, + 0x0501f002, 0x60064000, 0x60060800, 0x4200b800, + 0xffffffff, 0x83200580, 0x000000e1, 0x05020003, + 0x4200b800, 0x3fffffff, 0x503c0000, 0x805cbd00, + 0x05020003, 0x91224420, 0x0501f00f, 0x805cb902, + 0x05021009, 0x83200400, 0x0010a3b3, 0x50024800, + 0x90640580, 0x05000010, 0x8c640506, 0x05020044, + 0x0501f09a, 0x81060800, 0x81224000, 0x910404a1, + 0x05fc17f3, 0x803c7800, 0x83200480, 0x00000100, + 0x05fc17e2, 0x61fa4001, 0x8060c1c0, 0x0502008f, + 0x0501f071, 0x59240a00, 0x0529f921, 0x05000004, + 0x8c040500, 0x05020089, 0x0501f004, 0x90040d03, + 0x90040d83, 0x05000085, 0x59240c00, 0x8c04050a, + 0x05020004, 0x8d0c0520, 0x05000080, 0x0501f003, + 0x8c040508, 0x0500007d, 0x4d3c0000, 0x4d300000, + 0x600a78a0, 0x417a6000, 0x05e5fd4e, 0x5c026000, + 0x5c027800, 0x59240206, 0x82000500, 0xfffffcff, + 0x48024a06, 0x64164a00, 0x05fdf8ac, 0x05020011, + 0x59a8021b, 0x82000500, 0x00000082, 0x82000d80, + 0x00000082, 0x05000009, 0x8c00050e, 0x05020009, + 0x59240200, 0x8400055e, 0x48024a00, 0x05e5fddc, + 0x05000059, 0x0501f003, 0x05e5fcce, 0x0500005d, + 0x81060800, 0x81224000, 0x8060c040, 0x05fe07b8, + 0x05fdf896, 0x0502003c, 0x0501f047, 0x59240a00, + 0x8c040500, 0x05000055, 0x4c040000, 0x82040d00, + 0xffffdffc, 0x84040d44, 0x48064a00, 0x0529f8da, + 0x05000011, 0x59240200, 0x8c00051e, 0x0500000e, + 0x8400051e, 0x48024a00, 0x05e5fde5, 0x05000007, + 0x4813c857, 0x4817c857, 0x58100200, 0x8400055e, + 0x48002200, 0x0501f004, 0x59a8021b, 0x8400050e, + 0x4803521b, 0x5c000800, 0x8c640502, 0x05020013, + 0x59240c08, 0x05e1fb88, 0x4c5c0000, 0x4d3c0000, + 0x600a78a0, 0x4d300000, 0x417a6000, 0x05e5fd09, 0x5c026000, 0x5c027800, 0x5c00b800, 0x81060800, - 0x81224000, 0x8060c040, 0x05fe07b0, 0x90640589, - 0x05000008, 0x0501f013, 0x0501f822, 0x81060800, - 0x81224000, 0x8060c040, 0x05fe07a8, 0x0501f00d, - 0x916c0584, 0x0500000b, 0x05fdf8a3, 0x05020007, - 0x4a035013, 0x0000aaaa, 0x64075014, 0x6006d800, - 0x05fdf81b, 0x0501f003, 0x6006d800, 0x05f5fba2, - 0x497a5a07, 0x64025c07, 0x0001fb5b, 0x5c020800, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x60143000, 0x0501f004, 0x60083000, 0x0501f002, - 0x60043000, 0x49225a07, 0x481a5c07, 0x05fdf7f3, - 0x4923c857, 0x4d440000, 0x4d300000, 0x4d340000, - 0x4c580000, 0x4d400000, 0x4d3c0000, 0x4c5c0000, - 0x60a68000, 0x600a7820, 0x61c0b00f, 0x417a8800, - 0x83440400, 0x0010a380, 0x50000000, 0x80026d40, - 0x0500001e, 0x59340013, 0x80000130, 0x81200580, - 0x0502001a, 0x4937c857, 0x4947c857, 0x05f9faf1, - 0x05020046, 0x0505fdc0, 0x4df00000, 0x050dfb8e, - 0x05d8082f, 0x64066407, 0x4936600a, 0x4926601d, - 0x0201f800, 0x0010f051, 0x0201f800, 0x0010f148, - 0x0201f800, 0x0010f1e1, 0x0201f800, 0x0010f603, - 0x5c03e000, 0x05040d9c, 0x602c0800, 0x05f5ff1c, - 0x60067000, 0x0005fc78, 0x81468800, 0x83440580, - 0x0000ffff, 0x05000007, 0x8058b040, 0x05fe07d9, - 0x61fe89ff, 0x42026800, 0x0010cc0f, 0x0501f027, - 0x9064058b, 0x0502001d, 0x61c2880f, 0x6040b000, - 0x5924b809, 0x505c0000, 0x80026d40, 0x05000013, - 0x05f9fac8, 0x0502001d, 0x59340002, 0x82000500, - 0x00ffffff, 0x4803c857, 0x82000580, 0x00fffffd, - 0x0500000a, 0x050dfb60, 0x05d80801, 0x64066407, - 0x4936600a, 0x4926601d, 0x602c0800, 0x05f5fef8, - 0x60067000, 0x0005fc78, 0x805cb800, 0x81468800, - 0x8058b040, 0x05fe07e8, 0x5c00b800, 0x5c027800, - 0x5c028000, 0x5c00b000, 0x5c026800, 0x5c026000, - 0x5c028800, 0x1c01f000, 0x4947c857, 0x0505fd7a, - 0x4df00000, 0x417a6000, 0x0505fc2f, 0x0201f800, - 0x0010f051, 0x0201f800, 0x0010f148, 0x0201f800, - 0x0010f1e1, 0x0201f800, 0x0010f603, 0x4a026c00, - 0x00000707, 0x5c03e000, 0x05040d57, 0x83440580, - 0x0000ffff, 0x05fc07c7, 0x83441480, 0x000007f0, - 0x05fc17ba, 0x05fdf7dd, 0x4c640000, 0x59a8008d, - 0x90000506, 0x05020066, 0x916c0580, 0x05000064, - 0x497a5c07, 0x592c2208, 0x80100110, 0x8200cd00, - 0x000000ff, 0x05000058, 0x90640483, 0x05021056, - 0x4d2c0000, 0x4d040000, 0x417a0800, 0x592c1408, - 0x820a4500, 0x000000ff, 0x05000053, 0x0525fe83, - 0x40580000, 0x81200480, 0x0502104f, 0x83200400, - 0x0010a0ec, 0x50024800, 0x59240200, 0x8c000500, - 0x05020043, 0x592c0209, 0x8c00050a, 0x05020004, - 0x8d0c0520, 0x05000042, 0x0501f003, 0x8c000508, - 0x0500003f, 0x48024c00, 0x8c000502, 0x05000003, + 0x81224000, 0x8060c040, 0x05fe0789, 0x90640589, + 0x0500000d, 0x0501f018, 0x916c0584, 0x05fc07ed, + 0x90040d03, 0x90040d83, 0x05fe07ea, 0x0501f827, + 0x81060800, 0x81224000, 0x8060c040, 0x05fe077c, + 0x0501f00d, 0x916c0584, 0x0500000b, 0x05fdf857, + 0x05020007, 0x4a035013, 0x0000aaaa, 0x64075014, + 0x6006d800, 0x05f9ffcf, 0x0501f003, 0x6006d800, + 0x05f5fb24, 0x497a5a07, 0x64025c07, 0x0001fb5b, + 0x5c020800, 0x5c00c800, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x59240200, 0x82000500, 0xfffffffc, + 0x48024a00, 0x0501f006, 0x60143000, 0x0501f004, + 0x60083000, 0x0501f002, 0x60043000, 0x49225a07, + 0x481a5c07, 0x05fdf7ee, 0x4923c857, 0x4d440000, + 0x4d300000, 0x4d340000, 0x4c580000, 0x4d400000, + 0x4d3c0000, 0x4c5c0000, 0x60a68000, 0x600a7820, + 0x61c0b00f, 0x417a8800, 0x83440400, 0x0010a600, + 0x50000000, 0x80026d40, 0x0500001e, 0x59340013, + 0x80000130, 0x81200580, 0x0502001a, 0x4937c857, + 0x4947c857, 0x05f9fa77, 0x05020046, 0x0505fe2c, + 0x4df00000, 0x050dfbf0, 0x05d40ed9, 0x64066407, + 0x4936600a, 0x4926601d, 0x0201f800, 0x0010f260, + 0x0201f800, 0x0010f344, 0x0201f800, 0x0010f3dd, + 0x0201f800, 0x0010f7f5, 0x5c03e000, 0x05040e08, + 0x602c0800, 0x05f5fe99, 0x60067000, 0x0005fc78, + 0x81468800, 0x83440580, 0x0000ffff, 0x05000007, + 0x8058b040, 0x05fe07d9, 0x61fe89ff, 0x42026800, + 0x0010ce8f, 0x0501f027, 0x9064058b, 0x0502001d, + 0x61c2880f, 0x6040b000, 0x5924b809, 0x505c0000, + 0x80026d40, 0x05000013, 0x05f9fa4e, 0x0502001d, + 0x59340002, 0x82000500, 0x00ffffff, 0x4803c857, + 0x82000580, 0x00fffffd, 0x0500000a, 0x050dfbc2, + 0x05d40eab, 0x64066407, 0x4936600a, 0x4926601d, + 0x602c0800, 0x05f5fe75, 0x60067000, 0x0005fc78, + 0x805cb800, 0x81468800, 0x8058b040, 0x05fe07e8, + 0x5c00b800, 0x5c027800, 0x5c028000, 0x5c00b000, + 0x5c026800, 0x5c026000, 0x5c028800, 0x1c01f000, + 0x4947c857, 0x0505fde6, 0x4df00000, 0x417a6000, + 0x0505fc9b, 0x0201f800, 0x0010f260, 0x0201f800, + 0x0010f344, 0x0201f800, 0x0010f3dd, 0x0201f800, + 0x0010f7f5, 0x4a026c00, 0x00000707, 0x5c03e000, + 0x05040dc3, 0x83440580, 0x0000ffff, 0x05fc07c7, + 0x83441480, 0x000007f0, 0x05fc17ba, 0x05fdf7dd, + 0x4c640000, 0x4c600000, 0x59a8008d, 0x90000506, + 0x05020087, 0x916c0580, 0x05000085, 0x497a5c07, + 0x592c2208, 0x8210c500, 0x000000ff, 0x80100110, + 0x8200cd00, 0x000000ff, 0x05000077, 0x90640483, + 0x05021075, 0x4d2c0000, 0x4d040000, 0x417a0800, + 0x592c1408, 0x820a4500, 0x000000ff, 0x4923c857, + 0x0525ffda, 0x40580000, 0x81200480, 0x0502106e, + 0x83200400, 0x0010a3b3, 0x50024800, 0x90600583, + 0x05020012, 0x59a8021b, 0x8c000514, 0x0500000c, + 0x59240200, 0x82001d00, 0x00002001, 0x820c1d80, + 0x00002001, 0x05020006, 0x8c000510, 0x05020004, + 0x41781800, 0x05e5fbc7, 0x0501f042, 0x4803c857, + 0x60183000, 0x0501f061, 0x59240200, 0x8c000500, + 0x0502004f, 0x592c0209, 0x8c00050a, 0x05020004, + 0x8d0c0520, 0x0500004e, 0x0501f003, 0x8c000508, + 0x0500004b, 0x48024c00, 0x8c000502, 0x05000003, 0x80001110, 0x480a4a08, 0x592c000a, 0x9c0001c0, 0x48024801, 0x592c000b, 0x9c0001c0, 0x48024802, 0x592c000c, 0x9c0001c0, 0x48024803, 0x592c000d, 0x9c0001c0, 0x48024804, 0x810609c0, 0x05000002, - 0x912e5c85, 0x592c0a08, 0x8c040500, 0x05000011, + 0x912e5c85, 0x592c0a08, 0x8c040500, 0x0500001d, 0x4d3c0000, 0x4d300000, 0x600a78a0, 0x417a6000, - 0x05e5fd17, 0x5c026000, 0x5c027800, 0x59240206, + 0x05e5fc04, 0x5c026000, 0x5c027800, 0x59240206, 0x82000500, 0xfffffcff, 0x48024a06, 0x64164a00, - 0x05f9ffc9, 0x05020003, 0x05e5fc9e, 0x0500001e, + 0x05f9ff62, 0x0502000f, 0x05e5fcc1, 0x0502000b, + 0x59a8021b, 0x4803c857, 0x8c00050e, 0x05020009, + 0x59240200, 0x8400055e, 0x48024a00, 0x05e5fc94, + 0x05000021, 0x0501f003, 0x05e5fb86, 0x0500001e, 0x8064c840, 0x05000006, 0x592c1408, 0x80081110, - 0x81060800, 0x912e5c05, 0x05fdf7be, 0x5c020800, - 0x5c025800, 0x05f9ffbc, 0x0500001b, 0x592c0a08, + 0x81060800, 0x912e5c05, 0x05fdf79f, 0x5c020800, + 0x5c025800, 0x05f9ff49, 0x0500001b, 0x592c0a08, 0x8c040500, 0x05000018, 0x916c0584, 0x05000016, - 0x6006d800, 0x05f5fabc, 0x0501f013, 0x60043000, + 0x6006d800, 0x05f5fa17, 0x0501f013, 0x60043000, 0x0501f00e, 0x60083000, 0x0501f00e, 0x600c3000, 0x0501f00a, 0x60103000, 0x0501f008, 0x60143000, 0x0501f008, 0x60183000, 0x59240200, 0x82000500, 0xfffffffc, 0x48024a00, 0x5c020800, 0x5c025800, - 0x481a5c07, 0x0001fb5b, 0x5c00c800, 0x1c01f000, - 0x4c580000, 0x0525fe21, 0x40580000, 0x81200480, - 0x05021009, 0x83200400, 0x0010a0ec, 0x50024800, - 0x59240200, 0x90000503, 0x90000583, 0x5c00b000, - 0x1c01f000, 0x4923c857, 0x4927c857, 0x90000541, - 0x05fdf7fb, 0x80140110, 0x80000040, 0x05fe03cd, - 0x599c0019, 0x8c000510, 0x0502000b, 0x05f9fa7b, - 0x05020002, 0x1c01f000, 0x49425a07, 0x4806580e, - 0x480a580f, 0x4943c857, 0x4807c857, 0x480bc857, - 0x0001f35b, 0x592c040c, 0x82000500, 0x0000e000, - 0x82000580, 0x00006000, 0x05fc07f1, 0x59a8021b, - 0x8c000508, 0x05fc07ee, 0x592c120c, 0x592c080b, - 0x82040500, 0xff000000, 0x80040d80, 0x80000110, - 0x80081540, 0x05000004, 0x4806580b, 0x0501f876, - 0x05fdf7e3, 0x60701000, 0x60640800, 0x60c68000, - 0x05fdf7e2, 0x80140110, 0x80000040, 0x05fe03a5, - 0x05f9fb97, 0x05020002, 0x1c01f000, 0x49425a07, - 0x48065812, 0x480a5813, 0x0001f35b, 0x80140110, - 0x05fc039c, 0x80000040, 0x0502000a, 0x6006e000, - 0x592c020b, 0x8c000504, 0x00000791, 0x592c0208, - 0x82000c80, 0x00001001, 0x05fe139e, 0x0501f004, - 0x4a033006, 0x00020791, 0x0001f65b, 0x592c1014, - 0x82080500, 0xffff0003, 0x05fe0396, 0x600ae000, - 0x42000000, 0x0010ccba, 0x50007000, 0x592c0012, - 0x592c0813, 0x48007006, 0x48047007, 0x492c700a, - 0x4978700d, 0x4978700b, 0x0501f001, 0x4978700c, - 0x82080480, 0x00000180, 0x4803c857, 0x05001006, - 0x4800700e, 0x4a007005, 0x00000180, 0x65807004, - 0x0501f005, 0x4978700e, 0x48087005, 0x80081104, - 0x48087004, 0x58380009, 0x48007003, 0x40381000, - 0x0001f01c, 0x4df00000, 0x4203e000, 0x50000000, - 0x0001f813, 0x05000003, 0x59980005, 0x0801f800, - 0x5c03e000, 0x1c01f000, 0x05d9fa5b, 0x05d40ee0, - 0x4a025809, 0x0010cc59, 0x42000800, 0x0010ccba, - 0x452c0800, 0x497a580a, 0x497a580b, 0x497a580c, - 0x497a580d, 0x497a580e, 0x4a025808, 0x00020913, - 0x497a580f, 0x4a025802, 0x00000100, 0x64065801, - 0x1c01f000, 0x42000800, 0x0010ccbb, 0x64040801, - 0x4a000802, 0x00000100, 0x64400804, 0x65000805, - 0x4a000808, 0x0002068f, 0x1c01f000, 0x0501f808, - 0x000400ea, 0x64065a09, 0x0525f216, 0x0501f804, - 0x000400e7, 0x641a5a09, 0x0525f212, 0x59a80005, - 0x8c00051a, 0x1c01f000, 0x59a80005, 0x8c00051c, - 0x1c01f000, 0x59a8000f, 0x80080580, 0x05020002, - 0x1c01f000, 0x480bc857, 0x42024800, 0x0010b111, - 0x480a4805, 0x480b500f, 0x497b8830, 0x82080d40, - 0x01000000, 0x48078832, 0x59c40002, 0x8400054c, - 0x48038802, 0x600c0800, 0x0505f462, 0x59c80007, - 0x8c000502, 0x0500006c, 0x915c2c85, 0x0500176d, - 0x59c82817, 0x4817508c, 0x497b9005, 0x82140500, - 0x00e00000, 0x05020050, 0x82140500, 0x000003ff, - 0x90001c06, 0x41cc2000, 0x600030c1, 0xb00c0480, - 0x05001004, 0x61001000, 0xb00c1c80, 0x0501f003, - 0x400c1000, 0x41781800, 0x54182000, 0x80102000, - 0x80183000, 0x80081040, 0x05fe07fc, 0x800c19c0, - 0x05000005, 0x59c80005, 0x80000000, 0x48039005, - 0x05fdf7ee, 0x82140500, 0x000003ff, 0x800018c4, - 0x8c140514, 0x05000004, 0x59cc0002, 0x90000503, - 0x800c1c80, 0x480f5077, 0x82140500, 0x01f60000, - 0x05020027, 0x82140500, 0x0000f000, 0x0500000b, - 0x82000c80, 0x00004000, 0x0502100f, 0x4a039005, - 0x00000140, 0x82140500, 0x0e000000, 0x80000132, - 0x0c01f837, 0x1c01f000, 0x59cc0400, 0x82000500, - 0x0000ff00, 0x82000580, 0x00008100, 0x05fc07f4, - 0x0501f019, 0x4817c857, 0x82140500, 0x000003ff, - 0x05020007, 0x59cc0400, 0x82000500, 0x0000ff00, - 0x82000580, 0x00008100, 0x0502000f, 0x42000000, - 0x0010b0b0, 0x0525fbfc, 0x0501fdfb, 0x4803c856, - 0x4a039005, 0x00000140, 0x0501f01b, 0x4817c857, - 0x82140500, 0x00f60000, 0x05020003, 0x0501fe30, - 0x05fe07d5, 0x05f9fe88, 0x0500000e, 0x59c400a4, - 0x4803c857, 0x9000050f, 0x9000058a, 0x05020009, - 0x497b5077, 0x59c400a3, 0x82000540, 0x00080000, - 0x480388a3, 0x82000500, 0xfff7ffff, 0x480388a3, - 0x4817c856, 0x0525fb25, 0x4a039005, 0x00000140, - 0x0501f03b, 0x4803c856, 0x1c01f000, 0x001053c8, - 0x00105687, 0x001053c3, 0x001053c3, 0x001053c3, - 0x001053c3, 0x001053c3, 0x001053c3, 0x4803c857, - 0x42000000, 0x0010b04d, 0x0525fbcf, 0x1c01f000, - 0x8d0c052a, 0x05000004, 0x4c140000, 0x05d5ff1e, - 0x5c002800, 0x59cc0400, 0x82000d00, 0x0000ff00, - 0x82041500, 0x0000f000, 0x840409c0, 0x82080580, - 0x0000c000, 0x05020003, 0x0501fbe2, 0x0501f01b, - 0x82080580, 0x00002000, 0x0502000f, 0x916c0581, - 0x0502000b, 0x59cc0006, 0x82000500, 0xff000000, - 0x82000580, 0x11000000, 0x05d60ecb, 0x0502000f, - 0x05f1fc0b, 0x0501ff02, 0x0501f00c, 0x0501f81b, - 0x0501f00a, 0x82080580, 0x00003000, 0x05020003, - 0x0501fa34, 0x0501f005, 0x82080580, 0x00008000, - 0x05020002, 0x0501faff, 0x1c01f000, 0x4817c857, - 0x42000000, 0x0010b04c, 0x0525fb9f, 0x916c0583, - 0x05020009, 0x4c080000, 0x4c0c0000, 0x61201100, - 0x40141800, 0x80142120, 0x05f1f904, 0x5c001800, - 0x5c001000, 0x1c01f000, 0x59cc0002, 0x82000500, - 0xff000000, 0x82001580, 0x01000000, 0x05000005, - 0x82001580, 0x23000000, 0x05d60ea3, 0x0502058d, - 0x59a80077, 0x90000484, 0x050011c7, 0x900405a3, - 0x05020046, 0x59cc0004, 0x4803c857, 0x59cc0006, - 0x82000500, 0xff000000, 0x59cc0801, 0x82040d00, - 0x00ffffff, 0x80040540, 0x4803c857, 0x0501fb8f, - 0x05d40e91, 0x050001b8, 0x59300c07, 0x90040590, - 0x0500000a, 0x90040591, 0x05000008, 0x90040581, - 0x05000006, 0x90040584, 0x05000004, 0x90040588, - 0x05d60e85, 0x050201ac, 0x59300004, 0x82000500, - 0x80010000, 0x05000004, 0x0505ff07, 0x05d60e7e, - 0x050201a5, 0x59cc0a04, 0x48066202, 0x59cc0006, - 0x82000500, 0xffff0000, 0x82000d80, 0x02000000, - 0x05020007, 0x60567000, 0x0501fbcf, 0x0501fbf6, - 0x05d40e71, 0x05000198, 0x0005f478, 0x82000d80, - 0x02140000, 0x05fc07f8, 0x82000d80, 0x02100000, - 0x05fc07f5, 0x82000d80, 0x02100000, 0x05fc07f2, - 0x82000d80, 0x01000000, 0x05d60e63, 0x0502018a, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x05d60e5e, - 0x05020185, 0x59a80077, 0x90000488, 0x05001182, - 0x605a7000, 0x05fdf7e5, 0x900405a2, 0x05d60e56, - 0x0502017d, 0x59cc0004, 0x4803c857, 0x59cc0006, - 0x4803c857, 0x59cc0001, 0x4803c857, 0x59a80077, - 0x800001c0, 0x05d40e4c, 0x05000173, 0x59a80805, - 0x8c040514, 0x05000030, 0x0501f986, 0x0502002e, - 0x0501f99e, 0x0500002c, 0x61327000, 0x59cc3800, - 0x821c3d00, 0x00ffffff, 0x4c1c0000, 0x05e5faca, - 0x5c003800, 0x05000003, 0x05d5fe3b, 0x0501f162, - 0x59cc0001, 0x82000500, 0x00ffffff, 0x0501fdf7, - 0x05000003, 0x61fe89ff, 0x417a6800, 0x599c0019, - 0x8c000510, 0x05000144, 0x59a8021b, 0x8c000508, - 0x05000141, 0x59cc1006, 0x82081500, 0xffff0000, - 0x82081580, 0x03000000, 0x0502013b, 0x91641490, - 0x05001152, 0x8400054c, 0x4803521b, 0x59cc1000, - 0x82081500, 0x00ffffff, 0x05fdfeab, 0x59cc0007, + 0x481a5c07, 0x0001fb5b, 0x5c00c000, 0x5c00c800, + 0x1c01f000, 0x4c580000, 0x0525ff58, 0x40580000, + 0x81200480, 0x05021009, 0x83200400, 0x0010a3b3, + 0x50024800, 0x59240200, 0x90000503, 0x90000583, + 0x5c00b000, 0x1c01f000, 0x4923c857, 0x4927c857, + 0x90000541, 0x05fdf7fb, 0x80140110, 0x80000040, + 0x05fe0359, 0x599c0019, 0x8c000510, 0x0502000b, + 0x05f9f9de, 0x05020002, 0x1c01f000, 0x49425a07, + 0x4806580e, 0x480a580f, 0x4943c857, 0x4807c857, + 0x480bc857, 0x0001f35b, 0x592c040c, 0x82000500, + 0x0000e000, 0x82000580, 0x00006000, 0x05fc07f1, + 0x59a8021b, 0x8c000508, 0x05fc07ee, 0x592c120c, + 0x592c080b, 0x82040500, 0xff000000, 0x80040d80, + 0x80000110, 0x80081540, 0x05000004, 0x4806580b, + 0x0501f876, 0x05fdf7e3, 0x60701000, 0x60640800, + 0x60c68000, 0x05fdf7e2, 0x80140110, 0x80000040, + 0x05fe0331, 0x05f9fafd, 0x05020002, 0x1c01f000, + 0x49425a07, 0x48065812, 0x480a5813, 0x0001f35b, + 0x80140110, 0x05fc0328, 0x80000040, 0x0502000a, + 0x6006e000, 0x592c020b, 0x8c000504, 0x00000791, + 0x592c0208, 0x82000c80, 0x00001001, 0x05fe132a, + 0x0501f004, 0x4a033006, 0x00020791, 0x0001f65b, + 0x592c1014, 0x82080500, 0xffff0003, 0x05fe0322, + 0x600ae000, 0x42000000, 0x0010cf3a, 0x50007000, + 0x592c0012, 0x592c0813, 0x48007006, 0x48047007, + 0x492c700a, 0x4978700d, 0x4978700b, 0x0501f001, + 0x4978700c, 0x82080480, 0x00000180, 0x4803c857, + 0x05001006, 0x4800700e, 0x4a007005, 0x00000180, + 0x65807004, 0x0501f005, 0x4978700e, 0x48087005, + 0x80081104, 0x48087004, 0x58380009, 0x48007003, + 0x40381000, 0x0001f01c, 0x4df00000, 0x4203e000, + 0x50000000, 0x0001f813, 0x05000003, 0x59980005, + 0x0801f800, 0x5c03e000, 0x1c01f000, 0x05d9f8e2, + 0x05d40d67, 0x4a025809, 0x0010ced9, 0x42000800, + 0x0010cf3a, 0x452c0800, 0x497a580a, 0x497a580b, + 0x497a580c, 0x497a580d, 0x497a580e, 0x4a025808, + 0x00020913, 0x497a580f, 0x4a025802, 0x00000100, + 0x64065801, 0x1c01f000, 0x42000800, 0x0010cf3b, + 0x64040801, 0x4a000802, 0x00000100, 0x64400804, + 0x65000805, 0x4a000808, 0x0002068f, 0x1c01f000, + 0x0501f808, 0x000400ea, 0x64065a09, 0x0525f34d, + 0x0501f804, 0x000400e7, 0x641a5a09, 0x0525f349, + 0x59a80005, 0x8c00051a, 0x1c01f000, 0x59a80005, + 0x8c00051c, 0x1c01f000, 0x59a8000f, 0x80080580, + 0x05020002, 0x1c01f000, 0x480bc857, 0x42024800, + 0x0010b391, 0x480a4805, 0x480b500f, 0x497b8830, + 0x82080d40, 0x01000000, 0x48078832, 0x59c40002, + 0x8400054c, 0x48038802, 0x600c0800, 0x0505f4ab, + 0x59c80007, 0x8c000502, 0x05000044, 0x915c2c85, + 0x05001783, 0x59c82817, 0x4817508c, 0x497b9005, + 0x82140500, 0x00e00000, 0x05020038, 0x82140500, + 0x000003ff, 0x90001c06, 0x41cc2000, 0x600030c1, + 0xb00c0480, 0x05001004, 0x61001000, 0xb00c1c80, + 0x0501f003, 0x400c1000, 0x41781800, 0x54182000, + 0x80102000, 0x80183000, 0x80081040, 0x05fe07fc, + 0x800c19c0, 0x05000005, 0x59c80005, 0x80000000, + 0x48039005, 0x05fdf7ee, 0x82140500, 0x000003ff, + 0x800018c4, 0x8c140514, 0x05000004, 0x59cc0002, + 0x90000503, 0x800c1c80, 0x480f5077, 0x82140500, + 0x01f60000, 0x0502000f, 0x0501ff64, 0x05020008, + 0x4a039005, 0x00000140, 0x82140500, 0x0e000000, + 0x80000132, 0x0c01f813, 0x1c01f000, 0x800001c0, + 0x0502000a, 0x4a039005, 0x00000140, 0x0501f00b, + 0x4817c857, 0x82140500, 0x00f60000, 0x05020003, + 0x0501fe5e, 0x05fe07ed, 0x0501ff72, 0x4a039005, + 0x00000140, 0x0501f03b, 0x4803c856, 0x1c01f000, + 0x00105519, 0x00105810, 0x00105514, 0x00105514, + 0x00105514, 0x00105514, 0x00105514, 0x00105514, + 0x4803c857, 0x42000000, 0x0010b2cd, 0x0525fd2e, + 0x1c01f000, 0x8d0c052a, 0x05000004, 0x4c140000, + 0x05d5fdcd, 0x5c002800, 0x59cc0400, 0x82000d00, + 0x0000ff00, 0x82041500, 0x0000f000, 0x840409c0, + 0x82080580, 0x0000c000, 0x05020003, 0x0501fc1a, + 0x0501f01b, 0x82080580, 0x00002000, 0x0502000f, + 0x916c0581, 0x0502000b, 0x59cc0006, 0x82000500, + 0xff000000, 0x82000580, 0x11000000, 0x05d60d7a, + 0x0502000f, 0x05f1fb8d, 0x0501ff73, 0x0501f00c, + 0x0501f81b, 0x0501f00a, 0x82080580, 0x00003000, + 0x05020003, 0x0501fa52, 0x0501f005, 0x82080580, + 0x00008000, 0x05020002, 0x0501fb37, 0x1c01f000, + 0x4817c857, 0x42000000, 0x0010b2cc, 0x0525fcfe, + 0x916c0583, 0x05020009, 0x4c080000, 0x4c0c0000, + 0x61201100, 0x40141800, 0x80142120, 0x05f1f87e, + 0x5c001800, 0x5c001000, 0x1c01f000, 0x59cc0002, + 0x82000500, 0xff000000, 0x82001580, 0x01000000, + 0x05000005, 0x82001580, 0x23000000, 0x05d60d52, + 0x050205cb, 0x59a80077, 0x90000484, 0x050011de, + 0x900405a3, 0x05020046, 0x59cc0004, 0x4803c857, + 0x59cc0006, 0x82000500, 0xff000000, 0x59cc0801, + 0x82040d00, 0x00ffffff, 0x80040540, 0x4803c857, + 0x0501fbc7, 0x05d40d40, 0x050001cf, 0x59300c07, + 0x90040590, 0x0500000a, 0x90040591, 0x05000008, + 0x90040581, 0x05000006, 0x90040584, 0x05000004, + 0x90040588, 0x05d60d34, 0x050201c3, 0x59300004, + 0x82000500, 0x80010000, 0x05000004, 0x0505ff78, + 0x05d60d2d, 0x050201bc, 0x59cc0a04, 0x48066202, + 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, + 0x02000000, 0x05020007, 0x60567000, 0x0501fc07, + 0x0501fc30, 0x05d40d20, 0x050001af, 0x0005f478, + 0x82000d80, 0x02140000, 0x05fc07f8, 0x82000d80, + 0x02100000, 0x05fc07f5, 0x82000d80, 0x02100000, + 0x05fc07f2, 0x82000d80, 0x01000000, 0x05d60d12, + 0x050201a1, 0x59cc0006, 0x82000500, 0x0000ffff, + 0x05d60d0d, 0x0502019c, 0x59a80077, 0x90000488, + 0x05001199, 0x605a7000, 0x05fdf7e5, 0x900405a2, + 0x05d60d05, 0x05020194, 0x59cc0004, 0x4803c857, + 0x59cc0006, 0x4803c857, 0x59cc0001, 0x4803c857, + 0x59a80077, 0x800001c0, 0x05d40cfb, 0x0500018a, + 0x59a80805, 0x8c040514, 0x05000033, 0x0501f9a4, + 0x05020031, 0x0501f9bc, 0x0500002f, 0x61327000, + 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x4c1c0000, + 0x05e5f9d2, 0x5c003800, 0x05000003, 0x05d5fcea, + 0x0501f179, 0x59cc0001, 0x82000500, 0x00ffffff, + 0x0501fe35, 0x05000006, 0x61fe89ff, 0x42026800, + 0x0010ce8f, 0x05f9faad, 0x481a6802, 0x599c0019, + 0x8c000510, 0x05000157, 0x59a8021b, 0x8c000508, + 0x05000154, 0x59cc1006, 0x82081500, 0xffff0000, + 0x82081580, 0x03000000, 0x0502014e, 0x91641490, + 0x05001166, 0x8400054c, 0x4803521b, 0x59cc1000, + 0x82081500, 0x00ffffff, 0x05fdfed0, 0x59cc0007, 0x82000500, 0x0000ffff, 0x48038893, 0x48035012, - 0x0501f12d, 0x59cc0006, 0x82000500, 0xffff0000, + 0x0501f140, 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, 0x03000000, 0x05020032, 0x59a8021b, 0x8c000508, 0x05000020, 0x8400054c, 0x4803521b, 0x59cc0800, 0x82040d00, 0x00ffffff, 0x42024800, - 0x0010b111, 0x4807c857, 0x48064805, 0x4807500f, + 0x0010b391, 0x4807c857, 0x48064805, 0x4807500f, 0x497b8830, 0x84040d70, 0x48078832, 0x59c40802, 0x84040d4c, 0x48078802, 0x59cc0007, 0x82000500, 0x0000ffff, 0x48038893, 0x48035012, 0x600c0800, - 0x59a8100f, 0x0505faf7, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x05d60df4, 0x0502011b, 0x605e7000, + 0x59a8100f, 0x0505fb65, 0x59cc0006, 0x82000500, + 0x0000ffff, 0x05d60ca0, 0x0502012f, 0x605e7000, 0x0501f0e3, 0x4c000000, 0x82140500, 0x0000f000, 0x82000580, 0x00003000, 0x5c000000, 0x05fe07f3, - 0x05f9fd69, 0x05fe07f1, 0x8c000502, 0x05fe07ef, - 0x60583002, 0x0501fcd2, 0x4803c857, 0x0501f10a, + 0x05f9fd1a, 0x05fe07f1, 0x8c000502, 0x05fe07ef, + 0x60583002, 0x0501fd0d, 0x4803c857, 0x0501f11e, 0x82000d80, 0x04000000, 0x05020013, 0x59cc0006, - 0x82000500, 0x0000ffff, 0x05d60ddb, 0x05020102, - 0x05f9fd59, 0x05000003, 0x60767000, 0x0501f0c8, - 0x497b5082, 0x42001000, 0x0010f674, 0x0501fe4b, + 0x82000500, 0x0000ffff, 0x05d60c87, 0x05020116, + 0x05f9fd0a, 0x05000002, 0x0501f0c8, 0x497b5082, + 0x42001000, 0x0010f866, 0x0501feba, 0x05f9fa55, 0x59a8021b, 0x84000548, 0x4803521b, 0x60c27000, 0x0501f0bf, 0x82000d80, 0x05000000, 0x05020008, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x05d60dc6, - 0x050200ed, 0x60627000, 0x0501f0b5, 0x82000d80, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x05d60c72, + 0x05020101, 0x60627000, 0x0501f0b5, 0x82000d80, 0x20100000, 0x05020003, 0x60667000, 0x0501f0b0, 0x82000d80, 0x21100000, 0x05020003, 0x606a7000, 0x0501f0ab, 0x82000d80, 0x52000000, 0x05020008, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x05d60db2, - 0x050200d9, 0x606e7000, 0x0501f0a1, 0x82000d80, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x05d60c5e, + 0x050200ed, 0x606e7000, 0x0501f0a1, 0x82000d80, 0x50000000, 0x05020008, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x05d60da8, 0x050200cf, 0x60727000, + 0x0000ffff, 0x05d60c54, 0x050200e3, 0x60727000, 0x0501f097, 0x82000d80, 0x13000000, 0x05020003, 0x60d27000, 0x0501f092, 0x82000d80, 0x12000000, 0x05020008, 0x59cc0006, 0x82000500, 0x0000ffff, - 0x05d60d99, 0x050200c0, 0x60927000, 0x0501f088, + 0x05d60c45, 0x050200d4, 0x60927000, 0x0501f088, 0x82000d00, 0xff000000, 0x82040d80, 0x24000000, 0x05020003, 0x60b67000, 0x0501f081, 0x82000d00, 0xff000000, 0x82040d80, 0x53000000, 0x05020003, @@ -18231,19 +18370,19 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x00000401, 0x05021037, 0x90001503, 0x05020035, 0x59a81077, 0x80081480, 0x05001032, 0x90000484, 0x8000b104, 0x8058b1c0, 0x0500002e, 0x59cc3800, - 0x821c3d00, 0x00ffffff, 0x4d200000, 0x05e5f9f2, + 0x821c3d00, 0x00ffffff, 0x4d200000, 0x05e5f8f7, 0x05000003, 0x5c024000, 0x0501f026, 0x505cc800, 0x8264c500, 0x03000000, 0x8060c130, 0x42000000, - 0x0010b017, 0x90602580, 0x05020004, 0x42000000, - 0x0010b014, 0x0501f00a, 0x90602581, 0x05020004, - 0x42000000, 0x0010b015, 0x0501f005, 0x90602582, - 0x05020003, 0x42000000, 0x0010b016, 0x0525fa36, + 0x0010b297, 0x90602580, 0x05020004, 0x42000000, + 0x0010b294, 0x0501f00a, 0x90602581, 0x05020004, + 0x42000000, 0x0010b295, 0x0501f005, 0x90602582, + 0x05020003, 0x42000000, 0x0010b296, 0x0525fb92, 0x60541100, 0x82642500, 0x0000ffff, 0x80641920, - 0x41202800, 0x05edff9e, 0x805cb800, 0x8058b040, + 0x41202800, 0x05edff15, 0x805cb800, 0x8058b040, 0x05fe07e3, 0x5c024000, 0x5c00b000, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x608e7000, 0x0501f030, 0x5c00b000, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x42000000, 0x0010b04a, 0x0525f21f, 0x82000d80, + 0x42000000, 0x0010b2ca, 0x0525f37b, 0x82000d80, 0x60000000, 0x05020003, 0x60fe7000, 0x0501f024, 0x82000d80, 0x78000000, 0x05020003, 0x61167000, 0x0501f01f, 0x82000d80, 0x10000000, 0x05020003, @@ -18257,1207 +18396,1230 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x821c3d00, 0x00ffffff, 0x821c0580, 0x00fffffe, 0x59cc0001, 0x05020004, 0x40003000, 0x61fa880f, 0x0501f009, 0x59cc3800, 0x821c3d00, 0x00ffffff, - 0x4c1c0000, 0x0501f8d1, 0x5c003800, 0x05d60cfe, - 0x05020025, 0x05e5f988, 0x05f40b68, 0x05d60cfa, - 0x05020021, 0x59340200, 0x8c000514, 0x0500000a, - 0x913805b0, 0x05000008, 0x913805bf, 0x05000006, - 0x913805b4, 0x05000004, 0x913805a4, 0x05000002, - 0x61327000, 0x0509ff84, 0x05000018, 0x4926601d, - 0x4936600a, 0x64126407, 0x59cc0c04, 0x48066202, - 0xb138058c, 0x05020008, 0x64466407, 0x813669c0, - 0x05020005, 0x59cc0001, 0x82000500, 0x00ffffff, - 0x4802602a, 0x0501fa38, 0x0501fa90, 0x0004045a, + 0x4c1c0000, 0x0501f906, 0x5c003800, 0x05d60baa, + 0x05020039, 0x05e5f88d, 0x83440480, 0x000007f0, + 0x05001001, 0x05f1f9b1, 0x0500000f, 0x4c180000, + 0x05f5fec4, 0x5c003000, 0x0500000e, 0x4c180000, + 0x0501f84b, 0x5c003000, 0x05020007, 0x05f9f967, + 0x42026800, 0x0010ce8f, 0x481a6802, 0x61fe89ff, + 0x0501f004, 0x05f5fad7, 0x05d60b93, 0x05020022, + 0x59340200, 0x8c000514, 0x0500000a, 0x913805b0, + 0x05000008, 0x913805bf, 0x05000006, 0x913805b4, + 0x05000004, 0x913805a4, 0x05000002, 0x61327000, + 0x0509ffd5, 0x05000019, 0x4926601d, 0x4936600a, + 0x64126407, 0x83340580, 0x0010ce8f, 0x05020005, + 0x59cc0001, 0x82000500, 0x00ffffff, 0x4802602a, + 0x59cc0c04, 0x48066202, 0xb138058c, 0x05020002, + 0x64466407, 0x0501fa59, 0x0501fab3, 0x0004045a, 0x0005f478, 0x598800b7, 0x4803c857, 0x80000000, 0x480310b7, 0x1c01f000, 0x61241100, 0x59cc1806, - 0x800c1930, 0x05edff25, 0x0509ff6f, 0x05d40cce, - 0x05fc07f5, 0x4926601d, 0x4936600a, 0x64126407, - 0x59cc0c04, 0x48066202, 0x64266403, 0x6426641c, - 0x4a02621c, 0x00002900, 0x64066203, 0x0505f037, - 0x59a8021b, 0x4803c857, 0x8c000508, 0x05000013, - 0x599c0019, 0x8c000510, 0x05020010, 0x59cc0006, - 0x82000500, 0xff000000, 0x82000d80, 0x03000000, - 0x0500000c, 0x82000d80, 0x20000000, 0x05000009, - 0x82000d80, 0x05000000, 0x05000006, 0x82000d80, - 0x21000000, 0x05000003, 0x80000580, 0x1c01f000, - 0x90000541, 0x05fdf7fe, 0x59cc2006, 0x82102500, - 0xff000000, 0x9c1021c0, 0x0501f807, 0x820c1c00, - 0x0010ac58, 0x500c1800, 0x800c0500, 0x4803c857, - 0x1c01f000, 0x40100800, 0x41781800, 0x900404a0, - 0x05001004, 0x800c1800, 0x40000800, 0x05fdf7fc, - 0x9004050f, 0x82000400, 0x0010a0cc, 0x50000000, - 0x8c040508, 0x05000002, 0x900001c0, 0x1c01f000, - 0x4803c856, 0x0501fc77, 0x05020009, 0x05e1ff35, - 0x05020007, 0x59cc0002, 0x82000500, 0xff000000, - 0x82000d80, 0x08000000, 0x05000802, 0x1c01f000, - 0x4803c856, 0x59cc0400, 0x82000d00, 0x0000ff00, - 0x840409c0, 0x900405b3, 0x05020025, 0x0501f977, - 0x05000046, 0x59cc0a04, 0x48066202, 0x59a80077, - 0x90000484, 0x05001041, 0x59cc0006, 0x4803c857, - 0x82000500, 0xffff0000, 0x82000d80, 0x02000000, - 0x05020009, 0x59cc0006, 0x82000500, 0x0000ffff, - 0x05020036, 0x0501f9ec, 0x0004045a, 0x60567000, - 0x0005f478, 0x82000d80, 0x01000000, 0x0502002f, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x0502002b, - 0x59a80077, 0x90000488, 0x05001028, 0x0501f9de, - 0x0004045a, 0x605a7000, 0x0005f478, 0x900405b2, - 0x05020022, 0x59cc0006, 0x82000500, 0xffff0000, - 0x82000d80, 0x14000000, 0x0502001c, 0x59a80077, - 0x90000490, 0x05001019, 0x60e27000, 0x59cc0001, - 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x4c1c0000, - 0x0501f815, 0x5c003800, 0x05020010, 0x05e5f8ce, - 0x0502000e, 0x05f5faa8, 0x0502000c, 0x0509fed6, - 0x0500000a, 0x4926601d, 0x4936600a, 0x0519f86e, - 0x64126407, 0x59cc0c04, 0x48066202, 0x0501f9eb, - 0x0004045a, 0x0005f478, 0x42000000, 0x0010b04a, - 0x0525f119, 0x4803c857, 0x4000d000, 0x401cd800, - 0x82003500, 0x00ffffff, 0x0201f800, 0x0010fd25, - 0x40c40000, 0x90000581, 0x1c01f000, 0x59a8021b, - 0x8c00050e, 0x05000003, 0x8c000502, 0x05000005, - 0x59cc0c00, 0x80040910, 0x9004050f, 0x0c01f002, - 0x1c01f000, 0x001056a1, 0x001056a1, 0x001056a1, - 0x00105971, 0x001056a1, 0x001056a3, 0x001056ca, - 0x001056cd, 0x001056a1, 0x001056a1, 0x001056a1, - 0x001056a1, 0x001056a1, 0x001056a1, 0x001056a1, - 0x001056a1, 0x4803c856, 0x1c01f000, 0x0501f907, - 0x05000021, 0x59a80077, 0x9000048c, 0x0500101e, - 0x59300407, 0x90000583, 0x0502001b, 0x59cc0001, - 0x5932680a, 0x813669c0, 0x05000017, 0x59340802, - 0x80040580, 0x82000500, 0x00ffffff, 0x05020012, - 0x0501fc0d, 0x05020010, 0x59cc0a04, 0x59300202, - 0x82001580, 0x0000ffff, 0x05000003, 0x80040580, - 0x05020009, 0x48066202, 0x59300416, 0x8c00051a, - 0x05020005, 0x611a7000, 0x0501f937, 0x05000002, - 0x0005f478, 0x59cc0004, 0x4803c857, 0x42000000, - 0x0010b04b, 0x0525f0cc, 0x59cc0004, 0x4803c857, - 0x1c01f000, 0x0501f8dd, 0x0500001d, 0x59a80077, - 0x9000048c, 0x0500101a, 0x59300407, 0x90000583, - 0x05020017, 0x59cc0001, 0x82000500, 0x00ffffff, - 0x5932680a, 0x813669c0, 0x05000011, 0x59340802, - 0x82040d00, 0x00ffffff, 0x80040580, 0x0502000c, - 0x0501fbe1, 0x0502000a, 0x59cc0a04, 0x48066202, - 0x59300416, 0x8c00051a, 0x05020005, 0x61167000, - 0x0501f911, 0x05000002, 0x0005f478, 0x59cc0004, - 0x4803c857, 0x42000000, 0x0010b04b, 0x0525f0a6, - 0x59cc0004, 0x4803c857, 0x59cc0000, 0x82000500, - 0xff000000, 0x59cc1001, 0x82081500, 0x00ffffff, - 0x80080540, 0x4803c857, 0x4817c857, 0x0501fb9d, - 0x05d60bb1, 0x0502000e, 0x05e1fe5a, 0x05d60bae, - 0x0502000b, 0x59cc0002, 0x82000500, 0xff000000, - 0x90000580, 0x05020293, 0x9004050f, 0x90000c86, - 0x05d61ba5, 0x05021002, 0x0c01f003, 0x4803c856, - 0x1c01f000, 0x00105713, 0x00105715, 0x00105713, - 0x00105713, 0x0010577d, 0x0010578f, 0x4803c856, - 0x1c01f000, 0x59a80077, 0x800001c0, 0x05d60b96, - 0x05fe07fb, 0x59cc0802, 0x4807c856, 0x8c04052e, - 0x05020021, 0x42026000, 0x00110284, 0x497a6416, - 0x59cc0001, 0x59cc3800, 0x05fdff5b, 0x05020012, - 0x0001fae7, 0x05020010, 0x59cc3800, 0x821c3d00, - 0x00ffffff, 0x05e5f810, 0x05fe07e9, 0x4926601d, - 0x0515ffb5, 0x64166407, 0x64226203, 0x4936600a, - 0x60227001, 0x0501f8c8, 0x05d40b7b, 0x05fc07e0, - 0x0005f478, 0x4803c857, 0x61fe89ff, 0x417a6800, + 0x800c1930, 0x05edfe88, 0x0509ffbf, 0x05d40b66, + 0x05fc07f5, 0x4926601d, 0x4936600a, 0x83340580, + 0x0010ce8f, 0x05020005, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x4802602a, 0x64126407, 0x59cc0c04, + 0x48066202, 0x64266403, 0x6426641c, 0x4a02621c, + 0x00002900, 0x64066203, 0x0505f08a, 0x59a8021b, + 0x4803c857, 0x8c000508, 0x05000013, 0x599c0019, + 0x8c000510, 0x05020010, 0x59cc0006, 0x82000500, + 0xff000000, 0x82000d80, 0x03000000, 0x0500000c, + 0x82000d80, 0x20000000, 0x05000009, 0x82000d80, + 0x05000000, 0x05000006, 0x82000d80, 0x21000000, + 0x05000003, 0x80000580, 0x1c01f000, 0x90000541, + 0x05fdf7fe, 0x59cc2006, 0x82102500, 0xff000000, + 0x9c1021c0, 0x0501f807, 0x820c1c00, 0x0010aed8, + 0x500c1800, 0x800c0500, 0x4803c857, 0x1c01f000, + 0x40100800, 0x41781800, 0x900404a0, 0x05001004, + 0x800c1800, 0x40000800, 0x05fdf7fc, 0x9004050f, + 0x82000400, 0x0010a393, 0x50000000, 0x8c040508, + 0x05000002, 0x900001c0, 0x1c01f000, 0x4803c856, + 0x0501fc97, 0x05020009, 0x05e1fdcb, 0x05020007, + 0x59cc0002, 0x82000500, 0xff000000, 0x82000d80, + 0x08000000, 0x05000802, 0x1c01f000, 0x4803c856, + 0x59cc0400, 0x82000d00, 0x0000ff00, 0x840409c0, + 0x900405b3, 0x05020025, 0x0501f991, 0x05000060, + 0x59cc0a04, 0x48066202, 0x59a80077, 0x90000484, + 0x0500105b, 0x59cc0006, 0x4803c857, 0x82000500, + 0xffff0000, 0x82000d80, 0x02000000, 0x05020009, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x05020050, + 0x0501fa08, 0x0004045a, 0x60567000, 0x0005f478, + 0x82000d80, 0x01000000, 0x05020049, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x05020045, 0x59a80077, + 0x90000488, 0x05001042, 0x0501f9fa, 0x0004045a, + 0x605a7000, 0x0005f478, 0x900405b2, 0x0502003c, + 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, + 0x14000000, 0x05020036, 0x59a80077, 0x90000490, + 0x05001033, 0x60e27000, 0x59cc0001, 0x59cc3800, + 0x821c3d00, 0x00ffffff, 0x4c1c0000, 0x0501f82f, + 0x5c003800, 0x0502002a, 0x05e1ffb8, 0x05020028, + 0x83440480, 0x000007f0, 0x05001001, 0x05f1f8db, + 0x0500000f, 0x4c180000, 0x05f5fdee, 0x5c003000, + 0x0500000d, 0x4c180000, 0x05fdff75, 0x5c003000, + 0x05020007, 0x05f9f891, 0x42026800, 0x0010ce8f, + 0x481a6802, 0x61fe89ff, 0x0501f003, 0x05f5f9fc, + 0x05020013, 0x0509ff0c, 0x05000011, 0x4926601d, + 0x4936600a, 0x83340580, 0x0010ce8f, 0x05020005, 0x59cc0001, 0x82000500, 0x00ffffff, 0x4802602a, - 0x05fdf7ea, 0x59cc0001, 0x4803c857, 0x59cc3800, - 0x821c3d00, 0x00ffffff, 0x4c1c0000, 0x05fdff3a, - 0x5c003800, 0x05d60b68, 0x05fe07cd, 0x05e1fff2, - 0x05d60b65, 0x05fe07ca, 0x05f5f9cb, 0x05d60b62, - 0x05fe07c7, 0x59cc0005, 0x8c000500, 0x05020010, - 0x59340200, 0x8c00050e, 0x05d60b5b, 0x05fe07c0, - 0x59a8288c, 0x82140d00, 0x0000f000, 0x82040580, - 0x00003000, 0x05d40b54, 0x05fc07b9, 0x82040580, - 0x00002000, 0x05d40b50, 0x05fc07b5, 0x05f5fd4d, - 0x05020011, 0x0501f849, 0x05d40b4b, 0x05fc07b0, - 0x42026000, 0x00110284, 0x4926601d, 0x4936600a, - 0x497a6416, 0x0515ff78, 0x640a6407, 0x64226203, - 0x60227001, 0x0501f88c, 0x05d40b3f, 0x05fc07a4, - 0x0005f478, 0x0509fdd4, 0x05fc07a1, 0x4926601d, - 0x4936600a, 0x0515ff6c, 0x64126407, 0x59cc0c04, - 0x48066202, 0x60067000, 0x0501f87f, 0x0004045a, - 0x0005f478, 0x59cc0802, 0x8c04052e, 0x05020004, - 0x0501f828, 0x0500000c, 0x0501f007, 0x0501f827, - 0x05000009, 0x0501fb1c, 0x05020007, 0x59cc0a04, - 0x48066202, 0x60267001, 0x0501f86f, 0x05000002, - 0x0005f478, 0x4933c857, 0x1c01f000, 0x59cc0004, - 0x4803c857, 0x59a80077, 0x90000484, 0x05001011, - 0x59cc0802, 0x8c04052e, 0x05020004, 0x0501f811, - 0x0500000c, 0x0501f007, 0x0501f810, 0x05000009, - 0x0501fb05, 0x05020007, 0x59cc0a04, 0x48066202, - 0x602a7001, 0x0501f858, 0x05000002, 0x0005f478, - 0x4933c857, 0x42000000, 0x0010b04a, 0x0521f7ee, - 0x59cc0a04, 0x0501f002, 0x59cc0c04, 0x59a8000d, - 0x59a81064, 0x80080400, 0x80040480, 0x05021007, - 0x800400ca, 0x800408c8, 0x80040c00, 0x82066400, - 0x001102e4, 0x1c01f000, 0x80000580, 0x05fdf7fe, - 0x4803c856, 0x90040507, 0x0c01f001, 0x001057c3, - 0x001057d6, 0x001057e9, 0x001057f8, 0x001057f8, - 0x001057f8, 0x001057f8, 0x001057f8, 0x59cc0802, - 0x8c04052e, 0x0500000e, 0x05fdffe4, 0x05000007, + 0x0519f8c6, 0x64126407, 0x59cc0c04, 0x48066202, + 0x0501f9ed, 0x0004045a, 0x0005f478, 0x42000000, + 0x0010b2ca, 0x0525f240, 0x4803c857, 0x4000d000, + 0x401cd800, 0x82003500, 0x00ffffff, 0x0201f800, + 0x0010ff4b, 0x40c40000, 0x90000581, 0x1c01f000, + 0x59a8021b, 0x8c00050e, 0x05000003, 0x8c000502, + 0x05000005, 0x59cc0c00, 0x80040910, 0x9004050f, + 0x0c01f002, 0x1c01f000, 0x0010582a, 0x0010582a, + 0x0010582a, 0x00105b00, 0x0010582a, 0x0010582c, + 0x00105853, 0x00105856, 0x0010582a, 0x0010582a, + 0x0010582a, 0x0010582a, 0x0010582a, 0x0010582a, + 0x0010582a, 0x0010582a, 0x4803c856, 0x1c01f000, + 0x0501f907, 0x05000021, 0x59a80077, 0x9000048c, + 0x0500101e, 0x59300407, 0x90000583, 0x0502001b, + 0x59cc0001, 0x5932680a, 0x813669c0, 0x05000017, + 0x59340802, 0x80040580, 0x82000500, 0x00ffffff, + 0x05020012, 0x0501fc13, 0x05020010, 0x59cc0a04, + 0x59300202, 0x82001580, 0x0000ffff, 0x05000003, + 0x80040580, 0x05020009, 0x48066202, 0x59300416, + 0x8c00051a, 0x05020005, 0x611a7000, 0x0501f937, + 0x05000002, 0x0005f478, 0x59cc0004, 0x4803c857, + 0x42000000, 0x0010b2cb, 0x0525f1f3, 0x59cc0004, + 0x4803c857, 0x1c01f000, 0x0501f8dd, 0x0500001d, + 0x59a80077, 0x9000048c, 0x0500101a, 0x59300407, + 0x90000583, 0x05020017, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x5932680a, 0x813669c0, 0x05000011, + 0x59340802, 0x82040d00, 0x00ffffff, 0x80040580, + 0x0502000c, 0x0501fbe7, 0x0502000a, 0x59cc0a04, + 0x48066202, 0x59300416, 0x8c00051a, 0x05020005, + 0x61167000, 0x0501f911, 0x05000002, 0x0005f478, + 0x59cc0004, 0x4803c857, 0x42000000, 0x0010b2cb, + 0x0525f1cd, 0x59cc0004, 0x4803c857, 0x59cc0000, + 0x82000500, 0xff000000, 0x59cc1001, 0x82081500, + 0x00ffffff, 0x80080540, 0x4803c857, 0x4817c857, + 0x0501fba3, 0x05d60a28, 0x0502000e, 0x05e1fcd6, + 0x05d60a25, 0x0502000b, 0x59cc0002, 0x82000500, + 0xff000000, 0x90000580, 0x05020299, 0x9004050f, + 0x90000c86, 0x05d61a1c, 0x05021002, 0x0c01f003, + 0x4803c856, 0x1c01f000, 0x0010589c, 0x0010589e, + 0x0010589c, 0x0010589c, 0x00105906, 0x00105918, + 0x4803c856, 0x1c01f000, 0x59a80077, 0x800001c0, + 0x05d60a0d, 0x05fe07fb, 0x59cc0802, 0x4807c856, + 0x8c04052e, 0x05020021, 0x42026000, 0x001104b4, + 0x497a6416, 0x59cc0001, 0x59cc3800, 0x05fdff5b, + 0x05020012, 0x0001fae7, 0x05020010, 0x59cc3800, + 0x821c3d00, 0x00ffffff, 0x05e1fee0, 0x05fe07e9, + 0x4926601d, 0x0519f80d, 0x64166407, 0x64226203, + 0x4936600a, 0x60227001, 0x0501f8c8, 0x05d409f2, + 0x05fc07e0, 0x0005f478, 0x4803c857, 0x61fe89ff, + 0x417a6800, 0x59cc0001, 0x82000500, 0x00ffffff, + 0x4802602a, 0x05fdf7ea, 0x59cc0001, 0x4803c857, + 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x4c1c0000, + 0x05fdff3a, 0x5c003800, 0x05d609df, 0x05fe07cd, + 0x05e1fec2, 0x05d609dc, 0x05fe07ca, 0x05f5f918, + 0x05d609d9, 0x05fe07c7, 0x59cc0005, 0x8c000500, + 0x05020010, 0x59340200, 0x8c00050e, 0x05d609d2, + 0x05fe07c0, 0x59a8288c, 0x82140d00, 0x0000f000, + 0x82040580, 0x00003000, 0x05d409cb, 0x05fc07b9, + 0x82040580, 0x00002000, 0x05d409c7, 0x05fc07b5, + 0x05f5fca0, 0x05020011, 0x0501f849, 0x05d409c2, + 0x05fc07b0, 0x42026000, 0x001104b4, 0x4926601d, + 0x4936600a, 0x497a6416, 0x0515ffd0, 0x640a6407, + 0x64226203, 0x60227001, 0x0501f88c, 0x05d409b6, + 0x05fc07a4, 0x0005f478, 0x0509fe03, 0x05fc07a1, + 0x4926601d, 0x4936600a, 0x0515ffc4, 0x64126407, + 0x59cc0c04, 0x48066202, 0x60067000, 0x0501f87f, + 0x0004045a, 0x0005f478, 0x59cc0802, 0x8c04052e, + 0x05020004, 0x0501f828, 0x0500000c, 0x0501f007, + 0x0501f827, 0x05000009, 0x0501fb22, 0x05020007, + 0x59cc0a04, 0x48066202, 0x60267001, 0x0501f86f, + 0x05000002, 0x0005f478, 0x4933c857, 0x1c01f000, + 0x59cc0004, 0x4803c857, 0x59a80077, 0x90000484, + 0x05001011, 0x59cc0802, 0x8c04052e, 0x05020004, + 0x0501f811, 0x0500000c, 0x0501f007, 0x0501f810, + 0x05000009, 0x0501fb0b, 0x05020007, 0x59cc0a04, + 0x48066202, 0x602a7001, 0x0501f858, 0x05000002, + 0x0005f478, 0x4933c857, 0x42000000, 0x0010b2ca, + 0x0525f115, 0x59cc0a04, 0x0501f002, 0x59cc0c04, + 0x59a8000d, 0x59a81064, 0x80080400, 0x80040480, + 0x05021007, 0x800400ca, 0x800408c8, 0x80040c00, + 0x82066400, 0x00110514, 0x1c01f000, 0x80000580, + 0x05fdf7fe, 0x4803c856, 0x90040507, 0x0c01f001, + 0x0010594c, 0x0010595f, 0x00105972, 0x00105981, + 0x00105981, 0x00105981, 0x00105981, 0x00105981, + 0x59cc0802, 0x8c04052e, 0x0500000e, 0x05fdffe4, + 0x05000007, 0x59cc0802, 0x90040d30, 0x90040d90, + 0x05000004, 0x61827000, 0x0005f478, 0x1c01f000, + 0x59300416, 0x8400055c, 0x48026416, 0x0515f6ac, + 0x05fdffd5, 0x05fc07fa, 0x05fdf7f3, 0x59cc0802, + 0x8c04052e, 0x0500000e, 0x05fdffd1, 0x05000007, 0x59cc0802, 0x90040d30, 0x90040d90, 0x05000004, - 0x61827000, 0x0005f478, 0x1c01f000, 0x59300416, - 0x8400055c, 0x48026416, 0x0515f654, 0x05fdffd5, - 0x05fc07fa, 0x05fdf7f3, 0x59cc0802, 0x8c04052e, - 0x0500000e, 0x05fdffd1, 0x05000007, 0x59cc0802, - 0x90040d30, 0x90040d90, 0x05000004, 0x61867000, - 0x0005f478, 0x1c01f000, 0x59300416, 0x8400055c, - 0x48026416, 0x0515f641, 0x05fdffc2, 0x05fc07fa, - 0x05fdf7f3, 0x82140500, 0x0000f000, 0x82000580, - 0x00002000, 0x0502000b, 0x59cc0802, 0x8c04052e, - 0x05000008, 0x05fdffb9, 0x05000006, 0x59300416, - 0x8c000510, 0x05000003, 0x618a7000, 0x0005f478, - 0x1c01f000, 0x59a8288c, 0x8c14051a, 0x0500000c, - 0x4803c856, 0x4d300000, 0x5930100a, 0x4c080000, - 0x0509fd45, 0x5c001000, 0x05000003, 0x59cc2a04, - 0x0501f901, 0x5c026000, 0x1c01f000, 0x90000541, - 0x1c01f000, 0x4803c856, 0x4c0c0000, 0x4d340000, - 0x5930000a, 0x40026800, 0x59a81a1b, 0x05f9fa1e, - 0x0502001e, 0x813669c0, 0x05000015, 0x59340403, - 0x82000580, 0x000007fe, 0x05020011, 0x59cc0408, - 0x8c000518, 0x05000015, 0x5930001d, 0x82000580, - 0x0010b111, 0x05020011, 0x59cc0207, 0x80000540, - 0x05020002, 0x60040000, 0x48038893, 0x48035012, - 0x84000560, 0x480388b3, 0x0501f008, 0x59300403, - 0x90000582, 0x05000003, 0x91380597, 0x05020003, - 0x8c0c0508, 0x05fe07f1, 0x5c026800, 0x5c001800, - 0x1c01f000, 0x59a8288c, 0x8c14051a, 0x05000018, - 0x4803c856, 0x4d300000, 0x4c5c0000, 0x4130b800, - 0x0509fd0d, 0x0500000f, 0x485e602a, 0x585c0407, - 0x90000581, 0x05020008, 0x4d300000, 0x405e6000, - 0x0515fddb, 0x5c026000, 0x05000003, 0x4a026416, - 0x00000080, 0x585c100a, 0x59cc2a04, 0x0501f8be, - 0x5c00b800, 0x5c026000, 0x1c01f000, 0x90000541, - 0x1c01f000, 0x59a8288c, 0x8c14051a, 0x05000011, - 0x4803c856, 0x4d300000, 0x4c5c0000, 0x4130b800, - 0x4a026416, 0x00000100, 0x0509fcef, 0x05000006, - 0x485e602a, 0x585c2c02, 0x585c100a, 0x405c2000, - 0x0501f8ad, 0x5c00b800, 0x5c026000, 0x1c01f000, - 0x90000541, 0x1c01f000, 0x59a8288c, 0x8c14051a, - 0x05000016, 0x4803c856, 0x4d300000, 0x4c5c0000, - 0x4130b800, 0x4a026416, 0x00000100, 0x0509fcda, - 0x0500000b, 0x493a6403, 0x485e602a, 0x0515fdac, - 0x05000003, 0x4a026416, 0x00000080, 0x585c2c02, - 0x585c100a, 0x405c2000, 0x0501f893, 0x5c00b800, + 0x61867000, 0x0005f478, 0x1c01f000, 0x59300416, + 0x8400055c, 0x48026416, 0x0515f699, 0x05fdffc2, + 0x05fc07fa, 0x05fdf7f3, 0x82140500, 0x0000f000, + 0x82000580, 0x00002000, 0x0502000b, 0x59cc0802, + 0x8c04052e, 0x05000008, 0x05fdffb9, 0x05000006, + 0x59300416, 0x8c000510, 0x05000003, 0x618a7000, + 0x0005f478, 0x1c01f000, 0x59a8288c, 0x8c14051a, + 0x0500000c, 0x4803c856, 0x4d300000, 0x5930100a, + 0x4c080000, 0x0509fd74, 0x5c001000, 0x05000003, + 0x59cc2a04, 0x0501f903, 0x5c026000, 0x1c01f000, + 0x90000541, 0x1c01f000, 0x4803c856, 0x4c0c0000, + 0x4d340000, 0x5932680a, 0x59a81a1b, 0x05f9f99b, + 0x05020021, 0x813669c0, 0x05000018, 0x83340580, + 0x0010ce8f, 0x05000015, 0x59340403, 0x82000580, + 0x000007fe, 0x05020011, 0x59cc0408, 0x8c000518, + 0x05000015, 0x5930001d, 0x82000580, 0x0010b391, + 0x05020011, 0x59cc0207, 0x80000540, 0x05020002, + 0x60040000, 0x48038893, 0x48035012, 0x84000560, + 0x480388b3, 0x0501f008, 0x59300403, 0x90000582, + 0x05000003, 0x91380597, 0x05020003, 0x8c0c0508, + 0x05fe07f1, 0x5c026800, 0x5c001800, 0x1c01f000, + 0x59a8288c, 0x8c14051a, 0x05000018, 0x4803c856, + 0x4d300000, 0x4c5c0000, 0x4130b800, 0x0509fd3a, + 0x0500000f, 0x485e602a, 0x585c0407, 0x90000581, + 0x05020008, 0x4d300000, 0x405e6000, 0x0515fe31, + 0x5c026000, 0x05000003, 0x4a026416, 0x00000080, + 0x585c100a, 0x59cc2a04, 0x0501f8be, 0x5c00b800, 0x5c026000, 0x1c01f000, 0x90000541, 0x1c01f000, - 0x4803c856, 0x4c600000, 0x4c640000, 0x4c5c0000, - 0x4d200000, 0x4d240000, 0x4200c000, 0x0010cc01, - 0x5930c80a, 0x8064c9c0, 0x05020015, 0x58603800, - 0x821c3d00, 0x00ffffff, 0x4c1c0000, 0x05e1feae, - 0x5c003800, 0x05020061, 0x4d340000, 0x58600001, - 0x82000500, 0x00ffffff, 0x0501f9dc, 0x05d6095c, - 0x4936600a, 0x59341200, 0x5c026800, 0x0501fa0f, - 0x4a026416, 0x00000100, 0x65126403, 0x58601006, - 0x82081500, 0x0000f000, 0x82080480, 0x00002000, - 0x05001055, 0x42002000, 0xc0000000, 0x5930100a, - 0x58080200, 0x8c000508, 0x05000056, 0x8c00050c, - 0x05000013, 0x8c000504, 0x0500000a, 0x58602a02, - 0x82142d00, 0x00003000, 0x82140580, 0x00001000, - 0x0500000b, 0x82140580, 0x00002000, 0x05000044, - 0x8064c9c0, 0x05000004, 0x58600402, 0x8c000526, - 0x0500003d, 0x42002000, 0xc1000000, 0x41783000, - 0x4130b800, 0x0509fc88, 0x05000030, 0x58601804, - 0x8064c9c0, 0x05020006, 0x65126403, 0x585c0402, - 0x820c1d00, 0xffff0000, 0x800c1d40, 0x58600000, - 0x58600801, 0x58601003, 0x82000500, 0x00ffffff, - 0x82040d00, 0x00ffffff, 0x4a026416, 0x00000100, - 0x485e602a, 0x48026019, 0x4806601a, 0x480a601c, - 0x480e601d, 0x585c380a, 0x581c0a12, 0x82040d00, - 0x0000ff00, 0x800000e0, 0x80040540, 0x90000561, - 0x48026018, 0x585c0416, 0x58600802, 0x585c1407, - 0x8c00051c, 0x05020022, 0x4806601b, 0x480a6407, - 0x643e6203, 0x640e6006, 0x0509fad0, 0x4c100000, - 0x0501fd2b, 0x5c002000, 0x82100580, 0xc2000000, - 0x05020015, 0x90000541, 0x405e6000, 0x5c024800, - 0x5c024000, 0x5c00b800, 0x5c00c800, 0x5c00c000, - 0x1c01f000, 0x90000541, 0x05fdf7f9, 0x42002000, - 0xc2000000, 0x42003000, 0x02120000, 0x05fdf7c1, - 0x42002000, 0xc2000000, 0x42003000, 0x01050000, - 0x05fdf7bc, 0x80000580, 0x05fdf7ec, 0x90040d50, - 0x05fdf7de, 0x4803c856, 0x41782000, 0x0501f805, - 0x1c01f000, 0x4803c856, 0x0501f802, 0x1c01f000, - 0x4813c857, 0x59300416, 0x84000550, 0x48026416, - 0x4816621d, 0x480a600a, 0x493a6403, 0x643e6203, - 0x59cc0000, 0x82000500, 0x00ffffff, 0x48026019, - 0x82000500, 0x000000ff, 0x800000e0, 0x59cc0801, - 0x82040d00, 0x00ffffff, 0x4806601a, 0x82040d00, - 0x000000ff, 0x800811c0, 0x0500000a, 0x58080a12, - 0x0501f002, 0x800408d0, 0x80040540, 0x90000561, - 0x4803c857, 0x4807c857, 0x48026018, 0x0501f00e, - 0x4c000000, 0x4c040000, 0x05f9f8ff, 0x5c000800, - 0x5c000000, 0x05000007, 0x59a81a1b, 0x8c0c0506, - 0x05fc07f1, 0x90000561, 0x48026018, 0x0501f002, - 0x64866018, 0x59cc0404, 0x4802641d, 0x59cc0002, - 0x4802601b, 0x59cc0403, 0x4802641c, 0x59cc0203, - 0x4802621c, 0x801021c0, 0x05000002, 0x64082008, - 0x42002800, 0xc0000000, 0x800811c0, 0x0500000d, - 0x58080200, 0x8c000508, 0x05000015, 0x8c00050c, - 0x05000008, 0x8c000504, 0x05020019, 0x42002800, - 0xc1000000, 0x801021c0, 0x05000002, 0x64082008, - 0x40142000, 0x41783000, 0x0509fa60, 0x0501fcbc, - 0x90000541, 0x1c01f000, 0x42002000, 0xc2000000, - 0x42003000, 0x02120000, 0x0501f005, 0x42002000, - 0xc2000000, 0x42003000, 0x01050000, 0x0509fa53, - 0x0501fcaf, 0x80000580, 0x05fdf7f3, 0x59cc1002, - 0x82081500, 0x00003000, 0x82080580, 0x00001000, - 0x05fc07e8, 0x82080580, 0x00002000, 0x05fc07eb, - 0x05fdf7df, 0x59cc0802, 0x8c04052e, 0x0502001d, - 0x05fdfe34, 0x0500001b, 0x59300407, 0x90000586, - 0x05020018, 0x59cc0001, 0x82000500, 0x00ffffff, - 0x5932680a, 0x813669c0, 0x05000012, 0x59340802, - 0x82040d00, 0x00ffffff, 0x80040580, 0x0502000d, - 0x0501f93d, 0x0502000b, 0x59a80077, 0x800001c0, - 0x05020008, 0x61467000, 0x59300416, 0x8c00051a, - 0x05020004, 0x05fdfec0, 0x05000002, 0x0005f478, - 0x59cc0004, 0x4803c857, 0x42000000, 0x0010b04b, - 0x0521f601, 0x4803c856, 0x60143002, 0x0501f004, - 0x601c3004, 0x0501f802, 0x1c01f000, 0x481bc857, - 0x4c5c0000, 0x4c600000, 0x4c640000, 0x41ccc800, - 0x4014b800, 0x4018c000, 0x0501f805, 0x5c00c800, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4803c856, - 0x4c580000, 0x58640400, 0x82000500, 0x0000f000, - 0x82000580, 0x0000c000, 0x05000021, 0x0509fb96, - 0x0500001f, 0x58640001, 0x58643800, 0x821c3d00, - 0x00ffffff, 0x4c1c0000, 0x05fdfcc7, 0x5c003800, - 0x05020019, 0x05e1fd80, 0x05020017, 0x05f1ff5a, - 0x05020015, 0x4936600a, 0x0515fd23, 0x05d5fbbd, - 0x05000011, 0x4926601d, 0x492e6019, 0x497a5800, - 0x497a5a05, 0x485e5c05, 0x912cac06, 0x601cb000, - 0x4064a000, 0x0521fe97, 0x4862641c, 0x64fa6403, - 0x64066407, 0x64066203, 0x0501fc54, 0x5c00b000, - 0x1c01f000, 0x0005fc5a, 0x05fdf7fd, 0x4803c856, - 0x59cc0400, 0x82000d00, 0x0000ff00, 0x82040500, - 0x0000f000, 0x840409c0, 0x82000580, 0x00002000, - 0x05020055, 0x900405a2, 0x05020040, 0x59c400a4, - 0x9000050f, 0x90000c87, 0x05001003, 0x9000048c, - 0x05001064, 0x59cc0006, 0x82000500, 0xffff0000, - 0x82000d80, 0x04000000, 0x0500005e, 0x82000d80, - 0x60000000, 0x0500005b, 0x82000d80, 0x54000000, - 0x05000058, 0x82000d80, 0x03000000, 0x0502001e, - 0x59a80a1b, 0x8c040508, 0x05020052, 0x8c040502, - 0x05020060, 0x82000d80, 0x03000000, 0x05020008, - 0x82140d00, 0x0000f000, 0x82040d80, 0x00003000, - 0x05020003, 0x05f9f82c, 0x05000046, 0x05f5f9f1, - 0x05000046, 0x59a80018, 0x800000d0, 0x59a8080f, - 0x82040d00, 0x000000ff, 0x80040540, 0x59cc0800, - 0x82040d00, 0x00ffffff, 0x80040580, 0x05020037, - 0x0501f038, 0x59c40802, 0x8c04050c, 0x0502001e, - 0x82000d80, 0x52000000, 0x05fc07ed, 0x82000d80, - 0x05000000, 0x05fc07ea, 0x82000d80, 0x50000000, - 0x05fc07e7, 0x0501f029, 0x900405a3, 0x05020027, - 0x05fdfd8a, 0x05000025, 0x59300c03, 0x90040582, - 0x05000024, 0xb0040591, 0x05000022, 0x0501f00a, - 0x05fdfd82, 0x0500001d, 0x59300403, 0x90000582, - 0x0502001a, 0x59300203, 0x9000058e, 0x05020017, - 0x0501f018, 0x59a8021b, 0x8c000514, 0x05fc07f5, - 0x4c580000, 0x0521fe7d, 0xb0582481, 0x5c00b000, - 0x0500100e, 0x59cc0800, 0x82040d00, 0x00ffffff, - 0x42001000, 0x0010b3d1, 0x58080005, 0x80040580, - 0x05000008, 0x801021c0, 0x05000004, 0x80102040, - 0x9008140b, 0x05fdf7f9, 0x80000580, 0x0501f002, - 0x90000541, 0x1c01f000, 0x59cc0006, 0x82000500, - 0xffff0000, 0x82000d80, 0x03000000, 0x05000004, - 0x82000d80, 0x52000000, 0x05fe07f4, 0x59a8021b, - 0x90000509, 0x90000588, 0x05fc07f2, 0x05fdf7ef, - 0x59a8288c, 0x82140500, 0x0000f000, 0x82000580, - 0x00003000, 0x05fe07eb, 0x05f5ffcf, 0x05fe07e9, + 0x59a8288c, 0x8c14051a, 0x05000011, 0x4803c856, + 0x4d300000, 0x4c5c0000, 0x4130b800, 0x4a026416, + 0x00000100, 0x0509fd1c, 0x05000006, 0x485e602a, + 0x585c2c02, 0x585c100a, 0x405c2000, 0x0501f8ad, + 0x5c00b800, 0x5c026000, 0x1c01f000, 0x90000541, + 0x1c01f000, 0x59a8288c, 0x8c14051a, 0x05000016, + 0x4803c856, 0x4d300000, 0x4c5c0000, 0x4130b800, + 0x4a026416, 0x00000100, 0x0509fd07, 0x0500000b, + 0x493a6403, 0x485e602a, 0x0515fe02, 0x05000003, + 0x4a026416, 0x00000080, 0x585c2c02, 0x585c100a, + 0x405c2000, 0x0501f893, 0x5c00b800, 0x5c026000, + 0x1c01f000, 0x90000541, 0x1c01f000, 0x4803c856, + 0x4c600000, 0x4c640000, 0x4c5c0000, 0x4d200000, + 0x4d240000, 0x4200c000, 0x0010ce81, 0x5930c80a, + 0x8064c9c0, 0x05020015, 0x58603800, 0x821c3d00, + 0x00ffffff, 0x4c1c0000, 0x05e1fd7c, 0x5c003800, + 0x05020061, 0x4d340000, 0x58600001, 0x82000500, + 0x00ffffff, 0x0501f9e0, 0x05d20fd1, 0x4936600a, + 0x59341200, 0x5c026800, 0x0501fa13, 0x4a026416, + 0x00000100, 0x65126403, 0x58601006, 0x82081500, + 0x0000f000, 0x82080480, 0x00002000, 0x05001055, + 0x42002000, 0xc0000000, 0x5930100a, 0x58080200, + 0x8c000508, 0x05000056, 0x8c00050c, 0x05000013, + 0x8c000504, 0x0500000a, 0x58602a02, 0x82142d00, + 0x00003000, 0x82140580, 0x00001000, 0x0500000b, + 0x82140580, 0x00002000, 0x05000044, 0x8064c9c0, + 0x05000004, 0x58600402, 0x8c000526, 0x0500003d, + 0x42002000, 0xc1000000, 0x41783000, 0x4130b800, + 0x0509fcb5, 0x05000030, 0x58601804, 0x8064c9c0, + 0x05020006, 0x65126403, 0x585c0402, 0x820c1d00, + 0xffff0000, 0x800c1d40, 0x58600000, 0x58600801, + 0x58601003, 0x82000500, 0x00ffffff, 0x82040d00, + 0x00ffffff, 0x4a026416, 0x00000100, 0x485e602a, + 0x48026019, 0x4806601a, 0x480a601c, 0x480e601d, + 0x585c380a, 0x581c0a12, 0x82040d00, 0x0000ff00, + 0x800000e0, 0x80040540, 0x90000561, 0x48026018, + 0x585c0416, 0x58600802, 0x585c1407, 0x8c00051c, + 0x05020022, 0x4806601b, 0x480a6407, 0x643e6203, + 0x640e6006, 0x0509faf9, 0x4c100000, 0x0501fd62, + 0x5c002000, 0x82100580, 0xc2000000, 0x05020015, + 0x90000541, 0x405e6000, 0x5c024800, 0x5c024000, + 0x5c00b800, 0x5c00c800, 0x5c00c000, 0x1c01f000, + 0x90000541, 0x05fdf7f9, 0x42002000, 0xc2000000, + 0x42003000, 0x02120000, 0x05fdf7c1, 0x42002000, + 0xc2000000, 0x42003000, 0x01050000, 0x05fdf7bc, + 0x80000580, 0x05fdf7ec, 0x90040d50, 0x05fdf7de, + 0x4803c856, 0x41782000, 0x0501f805, 0x1c01f000, + 0x4803c856, 0x0501f802, 0x1c01f000, 0x4813c857, + 0x59300416, 0x84000550, 0x48026416, 0x4816621d, + 0x480a600a, 0x82080580, 0x0010ce8f, 0x05020002, + 0x41781000, 0x493a6403, 0x643e6203, 0x59cc0000, + 0x82000500, 0x00ffffff, 0x48026019, 0x82000500, + 0x000000ff, 0x800000e0, 0x59cc0801, 0x82040d00, + 0x00ffffff, 0x4806601a, 0x82040d00, 0x000000ff, + 0x800811c0, 0x0500000a, 0x58080a12, 0x0501f002, + 0x800408d0, 0x80040540, 0x90000561, 0x4803c857, + 0x4807c857, 0x48026018, 0x0501f00e, 0x4c000000, + 0x4c040000, 0x05f9f875, 0x5c000800, 0x5c000000, + 0x05000007, 0x59a81a1b, 0x8c0c0506, 0x05fc07f1, + 0x90000561, 0x48026018, 0x0501f002, 0x64866018, + 0x59cc0404, 0x4802641d, 0x59cc0002, 0x4802601b, + 0x59cc0403, 0x4802641c, 0x59cc0203, 0x4802621c, + 0x801021c0, 0x05000002, 0x64082008, 0x42002800, + 0xc0000000, 0x800811c0, 0x0500000d, 0x58080200, + 0x8c000508, 0x05000015, 0x8c00050c, 0x05000008, + 0x8c000504, 0x05020019, 0x42002800, 0xc1000000, + 0x801021c0, 0x05000002, 0x64082008, 0x40142000, + 0x41783000, 0x0509fa85, 0x0501fcef, 0x90000541, + 0x1c01f000, 0x42002000, 0xc2000000, 0x42003000, + 0x02120000, 0x0501f005, 0x42002000, 0xc2000000, + 0x42003000, 0x01050000, 0x0509fa78, 0x0501fce2, + 0x80000580, 0x05fdf7f3, 0x59cc1002, 0x82081500, + 0x00003000, 0x82080580, 0x00001000, 0x05fc07e8, + 0x82080580, 0x00002000, 0x05fc07eb, 0x05fdf7df, + 0x59cc0802, 0x8c04052e, 0x0502001d, 0x05fdfe2e, + 0x0500001b, 0x59300407, 0x90000586, 0x05020018, + 0x59cc0001, 0x82000500, 0x00ffffff, 0x5932680a, + 0x813669c0, 0x05000012, 0x59340802, 0x82040d00, + 0x00ffffff, 0x80040580, 0x0502000d, 0x0501f93d, + 0x0502000b, 0x59a80077, 0x800001c0, 0x05020008, + 0x61467000, 0x59300416, 0x8c00051a, 0x05020004, + 0x05fdfebc, 0x05000002, 0x0005f478, 0x59cc0004, + 0x4803c857, 0x42000000, 0x0010b2cb, 0x0521f722, + 0x4803c856, 0x60143002, 0x0501f004, 0x601c3004, + 0x0501f802, 0x1c01f000, 0x481bc857, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x41ccc800, 0x4014b800, + 0x4018c000, 0x0501f805, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x58640400, 0x82000500, 0x0000f000, 0x82000580, + 0x0000c000, 0x05000021, 0x0509fbbf, 0x0500001f, + 0x58640001, 0x58643800, 0x821c3d00, 0x00ffffff, + 0x4c1c0000, 0x05fdfcc1, 0x5c003800, 0x05020019, + 0x05e1fc4a, 0x05020017, 0x05f1fea1, 0x05020015, + 0x4936600a, 0x0515fd75, 0x05d5fa2e, 0x05000011, + 0x4926601d, 0x492e6019, 0x497a5800, 0x497a5a05, + 0x485e5c05, 0x912cac06, 0x601cb000, 0x4064a000, + 0x0521ffb8, 0x4862641c, 0x64fa6403, 0x64066407, + 0x64066203, 0x0501fc87, 0x5c00b000, 0x1c01f000, + 0x0005fc5a, 0x05fdf7fd, 0x4803c856, 0x59cc0400, + 0x82000d00, 0x0000ff00, 0x82040500, 0x0000f000, + 0x840409c0, 0x82000580, 0x00002000, 0x05020055, + 0x900405a2, 0x05020040, 0x59c400a4, 0x9000050f, + 0x90000c87, 0x05001003, 0x9000048c, 0x05001064, + 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, + 0x04000000, 0x0500005e, 0x82000d80, 0x60000000, + 0x0500005b, 0x82000d80, 0x54000000, 0x05000058, + 0x82000d80, 0x03000000, 0x0502001e, 0x59a80a1b, + 0x8c040508, 0x05020052, 0x8c040502, 0x05020060, + 0x82000d80, 0x03000000, 0x05020008, 0x82140d00, + 0x0000f000, 0x82040d80, 0x00003000, 0x05020003, + 0x05f5ffa2, 0x05000046, 0x05f5f93c, 0x05000046, 0x59a80018, 0x800000d0, 0x59a8080f, 0x82040d00, 0x000000ff, 0x80040540, 0x59cc0800, 0x82040d00, - 0x00ffffff, 0x80040580, 0x05fc07de, 0x60043002, - 0x05fdff2f, 0x05fdf7d9, 0x4803c857, 0x4c580000, - 0x40003000, 0x61c0200f, 0x6040b000, 0x59247009, - 0x50380000, 0x80026d40, 0x05000013, 0x59340002, - 0x82000500, 0x00ffffff, 0x80180580, 0x0502000e, - 0x59341013, 0x80080130, 0x81200580, 0x0502000a, - 0x82080500, 0x00ffffff, 0x59240805, 0x80040580, - 0x05000011, 0x812000f0, 0x80040d40, 0x48066813, - 0x0501f00d, 0x80102000, 0x80387000, 0x8058b040, - 0x05fe07e8, 0x82100480, 0x00000800, 0x60002000, - 0x61c0b00f, 0x41ac7000, 0x05fe17e2, 0x90000541, - 0x0501f002, 0x40128800, 0x5c00b000, 0x1c01f000, - 0x59a8021b, 0x8c00050e, 0x05000004, 0x8c000502, - 0x05000003, 0x80000580, 0x1c01f000, 0x90000541, - 0x05fdf7fe, 0x59300c07, 0x90040582, 0x05000002, - 0x90040585, 0x1c01f000, 0x60080800, 0x8c080508, - 0x05000007, 0x8c08050c, 0x05000004, 0x8c080504, - 0x05020004, 0x90040d44, 0x48066008, 0x1c01f000, - 0x42001800, 0x0010cc01, 0x580c1202, 0x82081500, - 0x00003000, 0x82080580, 0x00001000, 0x05fc07f7, - 0x82080580, 0x00002000, 0x05fc07f5, 0x05fdf7f2, - 0x59c80000, 0x84000558, 0x84000512, 0x48039000, - 0x1c01f000, 0x59cc0800, 0x59340013, 0x80040580, - 0x82000500, 0x00ffffff, 0x1c01f000, 0x4a032824, - 0x000003e8, 0x4a032802, 0x001102e4, 0x64032800, - 0x4a032808, 0x00106426, 0x60140000, 0x91947c09, - 0x49787801, 0x4a007804, 0x001063d1, 0x903c7c05, - 0x80000040, 0x05fe07fb, 0x4a032823, 0xffff0000, - 0x6191d000, 0x0501f9c6, 0x4201d000, 0x000186a0, - 0x0501f1d3, 0x00000000, 0x00000005, 0x0000000a, - 0x0000000f, 0x00000014, 0x00000002, 0x00000008, - 0x00000020, 0x00000080, 0x00000200, 0x4d300000, - 0x4d2c0000, 0x4d340000, 0x4d400000, 0x4cfc0000, - 0x4d380000, 0x4d3c0000, 0x4d440000, 0x4d4c0000, - 0x4d480000, 0x4c5c0000, 0x4c600000, 0x4c640000, - 0x0005fa04, 0x5c00c800, 0x5c00c000, 0x5c00b800, - 0x5c029000, 0x5c029800, 0x5c028800, 0x5c027800, - 0x5c027000, 0x5c01f800, 0x5c028000, 0x5c026800, - 0x5c025800, 0x5c026000, 0x1c01f000, 0x59940004, - 0x80000540, 0x05020008, 0x5994002f, 0x80040400, - 0x05d01ee7, 0x48032804, 0x480b2805, 0x642b2803, - 0x80000580, 0x1c01f000, 0x59940029, 0x80000540, - 0x05020008, 0x5994002f, 0x80040400, 0x05d01edc, - 0x48032829, 0x480b282a, 0x64072828, 0x80000580, - 0x1c01f000, 0x40680800, 0x406c1000, 0x5994002c, - 0x80000540, 0x05020008, 0x5994002f, 0x80040400, - 0x05d01ecf, 0x4803282c, 0x480b282d, 0x642b282b, - 0x80000580, 0x1c01f000, 0x4c000000, 0x59940005, - 0x80080580, 0x05020003, 0x497b2804, 0x497b2805, - 0x5c000000, 0x1c01f000, 0x40681000, 0x05fdfff7, - 0x1c01f000, 0x4c000000, 0x5994002a, 0x80080580, - 0x05020003, 0x497b2829, 0x497b282a, 0x5c000000, - 0x1c01f000, 0x4c000000, 0x5994002d, 0x80080580, - 0x05020003, 0x497b282c, 0x497b282d, 0x5c000000, - 0x1c01f000, 0x4937c857, 0x48ebc857, 0x59340203, - 0x80e80480, 0x05001002, 0x48ea6a03, 0x1c01f000, - 0x4d440000, 0x60407800, 0x59968801, 0x0001fae7, - 0x05020059, 0x59341a03, 0x800c1840, 0x05001015, - 0x59940031, 0x800c0480, 0x05000003, 0x48026a03, - 0x05021010, 0x5934000f, 0x497a6a03, 0x80000540, - 0x0500004d, 0x5934000b, 0x80001120, 0x82000500, - 0x0000ffff, 0x80080480, 0x05001003, 0x64066a03, - 0x0501f004, 0x4c3c0000, 0x0001faf4, 0x5c007800, - 0x4d2c0000, 0x41781800, 0x5934000f, 0x80025d40, - 0x0500003c, 0x592c0004, 0x80000d40, 0x05000006, - 0x59940031, 0x80040480, 0x48025804, 0x05001007, - 0x05000006, 0x412c1800, 0x592c0000, 0x80025d40, - 0x05000030, 0x05fdf7f4, 0x592c2000, 0x497a5800, - 0x800c19c0, 0x05020009, 0x59340010, 0x812c0580, - 0x05020004, 0x497a680f, 0x497a6810, 0x0501f008, - 0x4812680f, 0x0501f006, 0x48101800, 0x59340010, - 0x812c0580, 0x05020002, 0x480e6810, 0x592c0205, - 0x82000500, 0x000000ff, 0x90000592, 0x05000005, - 0xb00005a0, 0x05000003, 0x90000588, 0x05020003, - 0x642e5a07, 0x0501f00c, 0x4c0c0000, 0x4c100000, - 0x0001ff6c, 0x5c002000, 0x5c001800, 0x4a025a05, - 0x00000103, 0x641a5a07, 0x497a580a, 0x4a025c07, - 0x0000ffff, 0x4c0c0000, 0x4c100000, 0x0001fb5b, - 0x5c002000, 0x5c001800, 0x40100000, 0x05fdf7d0, - 0x5c025800, 0x81468800, 0x83440480, 0x00000800, - 0x05021007, 0x803c7840, 0x05fe07a1, 0x49472801, - 0x5c028800, 0x5c03e000, 0x1c01f000, 0x640b2800, - 0x497b2801, 0x05fdf7fb, 0x60407800, 0x59966002, - 0x59300205, 0x80000d40, 0x05000014, 0x59940031, - 0x80040480, 0x48026205, 0x4df00000, 0x4c040000, - 0x0515fb34, 0x5c000800, 0x05000009, 0x59300205, - 0x9000048b, 0x05021006, 0x9004048b, 0x05001004, - 0x4c3c0000, 0x0515fa61, 0x5c007800, 0x5c03e000, - 0x05001027, 0x05000026, 0x59300006, 0x80000d40, - 0x05000010, 0x4203e000, 0xb0800000, 0x4203f800, - 0x0c000000, 0x40000000, 0x40000000, 0x40000000, - 0x0503b008, 0x59940031, 0x80040480, 0x48026006, - 0x4203f800, 0x08000000, 0x05001019, 0x05000018, - 0x91326430, 0x49332802, 0x41540000, 0x81300480, - 0x05021005, 0x803c7840, 0x05fe07d2, 0x5c03e000, - 0x1c01f000, 0x59940030, 0x48032831, 0x4a032802, - 0x001102e4, 0x497b2830, 0x80000540, 0x0500000c, - 0x64072800, 0x5c03e000, 0x1c01f000, 0x4c3c0000, - 0x0515f930, 0x5c007800, 0x05fdf7d8, 0x4c3c0000, - 0x0511fcf7, 0x5c007800, 0x05fdf7e6, 0x64032800, - 0x5c03e000, 0x1c01f000, 0x59a80876, 0x8c040530, - 0x05020025, 0x8c040532, 0x0500000f, 0x59a80065, - 0x81640480, 0x05001016, 0x59a8000b, 0x81500580, - 0x05000005, 0x59a80063, 0x59a81062, 0x80080580, - 0x0502000f, 0x900411c0, 0x82081500, 0x00007000, - 0x0501f00f, 0x9004051f, 0x05000013, 0x80040840, - 0x9004051f, 0x05000003, 0x48075076, 0x0501f00e, - 0x900401c0, 0x9000051f, 0x80040d40, 0x900401c0, - 0x80040580, 0x82001500, 0x00007000, 0x82040500, - 0xffff8fff, 0x80080540, 0x48035076, 0x80081114, - 0x05d1fff2, 0x1c01f000, 0x4a032807, 0x000007d0, - 0x642b2806, 0x4a01a8e5, 0x00000c00, 0x1c01f000, - 0x60100800, 0x91180485, 0x05d21dc5, 0x91947c09, - 0x83180400, 0x00105add, 0x50000000, 0x803c7c00, - 0x4a007801, 0x000001f4, 0x48047802, 0x64287800, - 0x49787803, 0x83180400, 0x00105ae2, 0x50000000, - 0x82000540, 0x00000155, 0x4801a8e5, 0x1c01f000, - 0x91180485, 0x05d21db2, 0x91947c09, 0x83180400, - 0x00105add, 0x50000000, 0x803c7c00, 0x583c0002, - 0x80000040, 0x48007802, 0x05000004, 0x4a007801, - 0x000001f4, 0x64287800, 0x1c01f000, 0x91180485, - 0x05d21da3, 0x91947c09, 0x83180400, 0x00105add, - 0x50000000, 0x803c7c00, 0x49787801, 0x83180400, - 0x00105ae2, 0x50000000, 0x4801a8e5, 0x1c01f000, - 0x40680800, 0x406c1000, 0x0501f802, 0x1c01f000, + 0x00ffffff, 0x80040580, 0x05020037, 0x0501f038, + 0x59c40802, 0x8c04050c, 0x0502001e, 0x82000d80, + 0x52000000, 0x05fc07ed, 0x82000d80, 0x05000000, + 0x05fc07ea, 0x82000d80, 0x50000000, 0x05fc07e7, + 0x0501f029, 0x900405a3, 0x05020027, 0x05fdfd84, + 0x05000025, 0x59300c03, 0x90040582, 0x05000024, + 0xb0040591, 0x05000022, 0x0501f00a, 0x05fdfd7c, + 0x0500001d, 0x59300403, 0x90000582, 0x0502001a, + 0x59300203, 0x9000058e, 0x05020017, 0x0501f018, + 0x59a8021b, 0x8c000514, 0x05fc07f5, 0x4c580000, + 0x0521ff9e, 0xb0582481, 0x5c00b000, 0x0500100e, + 0x59cc0800, 0x82040d00, 0x00ffffff, 0x42001000, + 0x0010b651, 0x58080005, 0x80040580, 0x05000008, + 0x801021c0, 0x05000004, 0x80102040, 0x9008140b, + 0x05fdf7f9, 0x80000580, 0x0501f002, 0x90000541, + 0x1c01f000, 0x59cc0006, 0x82000500, 0xffff0000, + 0x82000d80, 0x03000000, 0x05000004, 0x82000d80, + 0x52000000, 0x05fe07f4, 0x59a8021b, 0x90000509, + 0x90000588, 0x05fc07f2, 0x05fdf7ef, 0x59a8288c, + 0x82140500, 0x0000f000, 0x82000580, 0x00003000, + 0x05fe07eb, 0x05f5ff45, 0x05fe07e9, 0x59a80018, + 0x800000d0, 0x59a8080f, 0x82040d00, 0x000000ff, + 0x80040540, 0x59cc0800, 0x82040d00, 0x00ffffff, + 0x80040580, 0x05fc07de, 0x60043002, 0x05fdff2f, + 0x05fdf7d9, 0x4803c857, 0x4c580000, 0x40003000, + 0x61c0200f, 0x6040b000, 0x59247009, 0x50380000, + 0x80026d40, 0x05000013, 0x59340002, 0x82000500, + 0x00ffffff, 0x80180580, 0x0502000e, 0x59341013, + 0x80080130, 0x81200580, 0x0502000a, 0x82080500, + 0x00ffffff, 0x59240805, 0x80040580, 0x05000011, + 0x812000f0, 0x80040d40, 0x48066813, 0x0501f00d, + 0x80102000, 0x80387000, 0x8058b040, 0x05fe07e8, + 0x82100480, 0x00000800, 0x60002000, 0x61c0b00f, + 0x41ac7000, 0x05fe17e2, 0x90000541, 0x0501f002, + 0x40128800, 0x5c00b000, 0x1c01f000, 0x59a8021b, + 0x8c00050e, 0x05000004, 0x8c000502, 0x05000003, + 0x80000580, 0x1c01f000, 0x90000541, 0x05fdf7fe, + 0x59300c07, 0x90040582, 0x05000002, 0x90040585, + 0x1c01f000, 0x60080800, 0x8c080508, 0x05000007, + 0x8c08050c, 0x05000004, 0x8c080504, 0x05020004, + 0x90040d44, 0x48066008, 0x1c01f000, 0x42001800, + 0x0010ce81, 0x580c1202, 0x82081500, 0x00003000, + 0x82080580, 0x00001000, 0x05fc07f7, 0x82080580, + 0x00002000, 0x05fc07f5, 0x05fdf7f2, 0x59c80000, + 0x84000558, 0x84000512, 0x48039000, 0x1c01f000, + 0x59cc0800, 0x59340013, 0x80040580, 0x82000500, + 0x00ffffff, 0x1c01f000, 0x82140500, 0x0000f000, + 0x05000006, 0x82000c80, 0x00004000, 0x0502100a, + 0x80000580, 0x1c01f000, 0x59cc0400, 0x82000500, + 0x0000ff00, 0x82000580, 0x00008100, 0x05fc07fa, + 0x0501f012, 0x4817c857, 0x82140500, 0x000003ff, + 0x05020007, 0x59cc0400, 0x82000500, 0x0000ff00, + 0x82000580, 0x00008100, 0x05020008, 0x42000000, + 0x0010b330, 0x0521fdd4, 0x05fdfeb2, 0x4803c856, + 0x90000541, 0x05fdf7e8, 0x41780000, 0x05fdf7e6, + 0x05f5feba, 0x0500000e, 0x59c400a4, 0x4803c857, + 0x9000050f, 0x9000058a, 0x05020009, 0x497b5077, + 0x59c400a3, 0x82000540, 0x00080000, 0x480388a3, + 0x82000500, 0xfff7ffff, 0x480388a3, 0x4817c856, + 0x0521f502, 0x4a032824, 0x000003e8, 0x4a032802, + 0x00110514, 0x64032800, 0x4a032808, 0x001065e8, + 0x60140000, 0x91947c09, 0x49787801, 0x4a007804, + 0x00106593, 0x903c7c05, 0x80000040, 0x05fe07fb, + 0x4a032823, 0xffff0000, 0x6191d000, 0x0501f9c6, + 0x4201d000, 0x000186a0, 0x0501f1d3, 0x00000000, + 0x00000005, 0x0000000a, 0x0000000f, 0x00000014, + 0x00000002, 0x00000008, 0x00000020, 0x00000080, + 0x00000200, 0x4d300000, 0x4d2c0000, 0x4d340000, + 0x4d400000, 0x4cfc0000, 0x4d380000, 0x4d3c0000, + 0x4d440000, 0x4d4c0000, 0x4d480000, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x0005fa04, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x5c029000, 0x5c029800, + 0x5c028800, 0x5c027800, 0x5c027000, 0x5c01f800, + 0x5c028000, 0x5c026800, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x59940004, 0x80000540, 0x05020008, + 0x5994002f, 0x80040400, 0x05d01d25, 0x48032804, + 0x480b2805, 0x642b2803, 0x80000580, 0x1c01f000, + 0x59940029, 0x80000540, 0x05020008, 0x5994002f, + 0x80040400, 0x05d01d1a, 0x48032829, 0x480b282a, + 0x64072828, 0x80000580, 0x1c01f000, 0x40680800, + 0x406c1000, 0x5994002c, 0x80000540, 0x05020008, + 0x5994002f, 0x80040400, 0x05d01d0d, 0x4803282c, + 0x480b282d, 0x642b282b, 0x80000580, 0x1c01f000, + 0x4c000000, 0x59940005, 0x80080580, 0x05020003, + 0x497b2804, 0x497b2805, 0x5c000000, 0x1c01f000, + 0x40681000, 0x05fdfff7, 0x1c01f000, 0x4c000000, + 0x5994002a, 0x80080580, 0x05020003, 0x497b2829, + 0x497b282a, 0x5c000000, 0x1c01f000, 0x4c000000, + 0x5994002d, 0x80080580, 0x05020003, 0x497b282c, + 0x497b282d, 0x5c000000, 0x1c01f000, 0x4937c857, + 0x48ebc857, 0x59340203, 0x80e80480, 0x05001002, + 0x48ea6a03, 0x1c01f000, 0x4d440000, 0x60407800, + 0x59968801, 0x0001fae7, 0x05020059, 0x59341a03, + 0x800c1840, 0x05001015, 0x59940031, 0x800c0480, + 0x05000003, 0x48026a03, 0x05021010, 0x5934000f, + 0x497a6a03, 0x80000540, 0x0500004d, 0x5934000b, + 0x80001120, 0x82000500, 0x0000ffff, 0x80080480, + 0x05001003, 0x64066a03, 0x0501f004, 0x4c3c0000, + 0x0001faf4, 0x5c007800, 0x4d2c0000, 0x41781800, + 0x5934000f, 0x80025d40, 0x0500003c, 0x592c0004, + 0x80000d40, 0x05000006, 0x59940031, 0x80040480, + 0x48025804, 0x05001007, 0x05000006, 0x412c1800, + 0x592c0000, 0x80025d40, 0x05000030, 0x05fdf7f4, + 0x592c2000, 0x497a5800, 0x800c19c0, 0x05020009, + 0x59340010, 0x812c0580, 0x05020004, 0x497a680f, + 0x497a6810, 0x0501f008, 0x4812680f, 0x0501f006, + 0x48101800, 0x59340010, 0x812c0580, 0x05020002, + 0x480e6810, 0x592c0205, 0x82000500, 0x000000ff, + 0x90000592, 0x05000005, 0xb00005a0, 0x05000003, + 0x90000588, 0x05020003, 0x642e5a07, 0x0501f00c, + 0x4c0c0000, 0x4c100000, 0x0001ff6c, 0x5c002000, + 0x5c001800, 0x4a025a05, 0x00000103, 0x641a5a07, + 0x497a580a, 0x4a025c07, 0x0000ffff, 0x4c0c0000, + 0x4c100000, 0x0001fb5b, 0x5c002000, 0x5c001800, + 0x40100000, 0x05fdf7d0, 0x5c025800, 0x81468800, + 0x83440480, 0x00000800, 0x05021007, 0x803c7840, + 0x05fe07a1, 0x49472801, 0x5c028800, 0x5c03e000, + 0x1c01f000, 0x640b2800, 0x497b2801, 0x05fdf7fb, + 0x60407800, 0x59966002, 0x59300205, 0x80000d40, + 0x05000014, 0x59940031, 0x80040480, 0x48026205, + 0x4df00000, 0x4c040000, 0x0515fb53, 0x5c000800, + 0x05000009, 0x59300205, 0x9000048b, 0x05021006, + 0x9004048b, 0x05001004, 0x4c3c0000, 0x0515fa80, + 0x5c007800, 0x5c03e000, 0x05001027, 0x05000026, + 0x59300006, 0x80000d40, 0x05000010, 0x4203e000, + 0xb0800000, 0x4203f800, 0x0c000000, 0x40000000, + 0x40000000, 0x40000000, 0x0503b008, 0x59940031, + 0x80040480, 0x48026006, 0x4203f800, 0x08000000, + 0x05001019, 0x05000018, 0x91326430, 0x49332802, + 0x41540000, 0x81300480, 0x05021005, 0x803c7840, + 0x05fe07d2, 0x5c03e000, 0x1c01f000, 0x59940030, + 0x48032831, 0x4a032802, 0x00110514, 0x497b2830, + 0x80000540, 0x0500000c, 0x64072800, 0x5c03e000, + 0x1c01f000, 0x4c3c0000, 0x0515f94f, 0x5c007800, + 0x05fdf7d8, 0x4c3c0000, 0x0511fd13, 0x5c007800, + 0x05fdf7e6, 0x64032800, 0x5c03e000, 0x1c01f000, + 0x59a80876, 0x8c040530, 0x05020025, 0x8c040532, + 0x0500000f, 0x59a80065, 0x81640480, 0x05001016, + 0x59a8000b, 0x81500580, 0x05000005, 0x59a80063, + 0x59a81062, 0x80080580, 0x0502000f, 0x900411c0, + 0x82081500, 0x00007000, 0x0501f00f, 0x9004051f, + 0x05000013, 0x80040840, 0x9004051f, 0x05000003, + 0x48075076, 0x0501f00e, 0x900401c0, 0x9000051f, + 0x80040d40, 0x900401c0, 0x80040580, 0x82001500, + 0x00007000, 0x82040500, 0xffff8fff, 0x80080540, + 0x48035076, 0x80081114, 0x05d1fe30, 0x1c01f000, + 0x4a032807, 0x000007d0, 0x642b2806, 0x4a01a8e5, + 0x00000c00, 0x1c01f000, 0x60100800, 0x91180485, + 0x05d21c03, 0x91947c09, 0x83180400, 0x00105c9f, + 0x50000000, 0x803c7c00, 0x4a007801, 0x000001f4, + 0x48047802, 0x64287800, 0x49787803, 0x83180400, + 0x00105ca4, 0x50000000, 0x82000540, 0x00000155, + 0x4801a8e5, 0x1c01f000, 0x91180485, 0x05d21bf0, + 0x91947c09, 0x83180400, 0x00105c9f, 0x50000000, + 0x803c7c00, 0x583c0002, 0x80000040, 0x48007802, + 0x05000004, 0x4a007801, 0x000001f4, 0x64287800, + 0x1c01f000, 0x91180485, 0x05d21be1, 0x91947c09, + 0x83180400, 0x00105c9f, 0x50000000, 0x803c7c00, + 0x49787801, 0x83180400, 0x00105ca4, 0x50000000, + 0x4801a8e5, 0x1c01f000, 0x40680800, 0x406c1000, + 0x0501f802, 0x1c01f000, 0x4807c857, 0x480bc857, + 0x5994002f, 0x80040400, 0x05d01bcd, 0x48032804, + 0x480b2805, 0x642b2803, 0x1c01f000, 0x4807c857, + 0x480bc857, 0x5994002f, 0x80040400, 0x05d01bc4, + 0x48032826, 0x480b2827, 0x642b2825, 0x1c01f000, + 0x4c000000, 0x59940027, 0x80080580, 0x05020003, + 0x48032826, 0x48032827, 0x5c000000, 0x1c01f000, 0x4807c857, 0x480bc857, 0x5994002f, 0x80040400, - 0x05d01d8f, 0x48032804, 0x480b2805, 0x642b2803, - 0x1c01f000, 0x4807c857, 0x480bc857, 0x5994002f, - 0x80040400, 0x05d01d86, 0x48032826, 0x480b2827, - 0x642b2825, 0x1c01f000, 0x4c000000, 0x59940027, - 0x80080580, 0x05020003, 0x48032826, 0x48032827, - 0x5c000000, 0x1c01f000, 0x4807c857, 0x480bc857, - 0x5994002f, 0x80040400, 0x05d01d75, 0x4803282c, - 0x480b282d, 0x642b282b, 0x1c01f000, 0x80e9d1c0, - 0x0500000c, 0x0501f82e, 0x05025000, 0x4203e000, - 0x80000000, 0x40e81000, 0x41780800, 0x61900000, - 0x0501f8b4, 0x5994002e, 0x80080400, 0x4803282e, - 0x1c01f000, 0x42001000, 0x0010497d, 0x05fdfe97, - 0x42001000, 0x00104970, 0x05fdffdc, 0x42001000, - 0x00103d56, 0x05fdfe91, 0x42001000, 0x00103dce, - 0x05fdfe8e, 0x42001000, 0x00103d35, 0x05fdfe8b, - 0x42001000, 0x00103df8, 0x05fdf69b, 0x4203e000, - 0x70000000, 0x4203e000, 0xb0300000, 0x40ebf800, - 0x60f00000, 0x05004004, 0x80000040, 0x05fe07fe, - 0x0501f006, 0x4203e000, 0x70000000, 0x42000000, - 0x0010b071, 0x0521fae8, 0x1c01f000, 0x4203e000, - 0x80000000, 0x4203e000, 0xb0400000, 0x40ebf800, - 0x60f00000, 0x05005004, 0x80000040, 0x05fe07fe, - 0x0501f006, 0x4203e000, 0x80000000, 0x42000000, - 0x0010b072, 0x0521fad8, 0x1c01f000, 0x59a8080d, - 0x59a80266, 0x80040480, 0x599c0a02, 0x800409c0, - 0x05020002, 0x80040800, 0x80041480, 0x05001002, - 0x40000800, 0x48075064, 0x59a8100d, 0x40040000, - 0x800acc80, 0x4967500d, 0x49675065, 0x59aaa80b, - 0x41640800, 0x60c01000, 0x0501f84e, 0x8206a400, - 0x001102e4, 0x49535061, 0x4152b000, 0x42006000, - 0x0010cc44, 0x4a006005, 0x0000012c, 0x4a006006, - 0xda10da10, 0x64486009, 0x4a00600a, 0x0010cc44, - 0x4a00600b, 0x00100e21, 0x599c0014, 0x48006012, - 0x599c0015, 0x48006013, 0x42006000, 0x00110224, - 0x64206203, 0x64186407, 0x4a006002, 0xffff0000, - 0x4a006009, 0x0010cc44, 0x4a006016, 0x0010cc44, - 0x599c0014, 0x48006017, 0x599c0015, 0x48006018, - 0x599c0413, 0x48006019, 0x4950601a, 0x4954601b, - 0x59a80064, 0x4800601c, 0x4a00601d, 0x0010abe1, - 0x4a00601e, 0x0010abe2, 0x4a00601f, 0x0010abe3, - 0x42000000, 0xb0000000, 0x42000800, 0x00110224, - 0x0001f92d, 0x1c01f000, 0x4807c856, 0x59240206, - 0x800409c0, 0x05000003, 0x80080540, 0x0501f002, - 0x80080500, 0x48024a06, 0x1c01f000, 0x4803c856, - 0x4c000000, 0x05fdf96c, 0x0502000b, 0x05f1fc02, - 0x05d20cdb, 0x5c000000, 0x48026802, 0x0509f82e, - 0x05000006, 0x4936600a, 0x64066407, 0x60067000, - 0x0005f478, 0x5c000000, 0x1c01f000, 0x05d1fcd0, - 0x4c0c0000, 0x4c100000, 0x4c140000, 0x4c180000, - 0x80001d80, 0x80002580, 0x60803000, 0x90040501, - 0x05000003, 0x40080000, 0x800c1c00, 0x400c2800, - 0x800c1902, 0x80102102, 0x90140501, 0x05000003, - 0x82102540, 0x80000000, 0x80040902, 0x80183040, - 0x05fe07f3, 0x40100800, 0x400c0000, 0x5c003000, - 0x5c002800, 0x5c002000, 0x5c001800, 0x1c01f000, - 0x4c580000, 0x6080b000, 0x80000540, 0x05000018, - 0x80041c80, 0x05021016, 0x800810c2, 0x80040982, - 0x05001006, 0x80041c80, 0x05021005, 0x8058b040, - 0x05fe07fa, 0x0501f006, 0x80041c80, 0x400c0800, - 0x80081000, 0x8058b040, 0x05fe07f4, 0x4c000000, - 0x41f00000, 0x82000500, 0xf7ffffff, 0x4003e000, - 0x5c000000, 0x5c00b000, 0x1c01f000, 0x4c000000, - 0x41f00000, 0x82000540, 0x08000000, 0x05fdf7f8, - 0x42007000, 0x0010ac7a, 0x64147000, 0x64007401, - 0x4a007201, 0x00000840, 0x64147202, 0x6401a8e8, - 0x6443c82b, 0x0501f84e, 0x4a01a8e9, 0x00003a0d, - 0x4a01a8ee, 0x00080202, 0x6405a8e8, 0x640378e8, - 0x6443c821, 0x6413c823, 0x0501f879, 0x4a0378e9, - 0x00003a0d, 0x4a0378ee, 0x00080302, 0x640778e8, - 0x41780800, 0x6003a0ec, 0x42001000, 0x0010af39, - 0x42001800, 0x0010dfb7, 0x600c2000, 0x6120297f, - 0x4a03a005, 0xd0000001, 0x59d00006, 0x4a03a005, - 0x90000001, 0x59d00006, 0x4a03a005, 0x60000001, - 0x59d00006, 0x4a03a005, 0x60000003, 0x59d00006, - 0x4a03a005, 0x60000005, 0x59d00006, 0x4a03a005, - 0x60000007, 0x59d00006, 0x4a03a005, 0x60000009, - 0x59d00006, 0x4a03a005, 0x6000000b, 0x64041001, - 0x4a001002, 0x00000100, 0x4a001008, 0x00020bf5, - 0x480c100a, 0x4810100c, 0x4814100d, 0x4978120e, - 0x4804140e, 0x4978100f, 0x820c1c00, 0x00000080, - 0x480c100b, 0x90081411, 0x801020c4, 0x80142800, - 0x91d3a420, 0x80040800, 0x90040485, 0x05fc17d7, - 0x59e00003, 0x82000500, 0xffffffe0, 0x82000540, - 0x00008000, 0x4803c003, 0x59c40006, 0x82000500, - 0xfffcffff, 0x48038806, 0x1c01f000, 0x4d900000, - 0x4d180000, 0x4c500000, 0x4c580000, 0x4c540000, - 0x4a01a8e7, 0xaaaaaaaa, 0x4a01a8e6, 0xaaaaaaaa, - 0x4a01a8e5, 0xaaaaaaaa, 0x4a01a8e4, 0xaaaaaaaa, - 0x4a01a8ee, 0x00200000, 0x4979a8ee, 0x4a01a8ce, - 0x0010a0ec, 0x6000b001, 0x90d4ac00, 0x4178a000, - 0x0521faa0, 0x4a01a81d, 0x00100e1d, 0x4a01a81b, - 0x00100e26, 0x4a01a81c, 0x00100e36, 0x4a01a81e, - 0x0010af0d, 0x64031800, 0x600c0800, 0x42001800, - 0x0010af10, 0x417a3000, 0x811b20c8, 0x83932400, - 0x0000b037, 0x48072000, 0x480f2001, 0x64032002, - 0x800408c4, 0x900c1c05, 0x811a3000, 0x91180485, - 0x05fc17f6, 0x5c00a800, 0x5c00b000, 0x5c00a000, - 0x5c023000, 0x5c032000, 0x1c01f000, 0x4cd80000, - 0x4d180000, 0x4a0378e7, 0xaaaaaaaa, 0x4a0378e6, - 0xaaaaaaaa, 0x4a0378e5, 0xaaaaaaaa, 0x4a0378e4, - 0xaaaaaaaa, 0x4a03781b, 0x00100e26, 0x4a03781c, - 0x00100e36, 0x4a03781d, 0x0010ac7d, 0x4a03781e, - 0x0010ac84, 0x42000800, 0x0010af10, 0x417a3000, - 0x42001000, 0x0010dfb7, 0x8119b0c8, 0x82d9b400, - 0x0000bf32, 0x83180400, 0x001064e5, 0x50000000, - 0x4801b002, 0x4809b000, 0x4809b001, 0x82081400, - 0x00000080, 0x90040c05, 0x811a3000, 0x91180485, - 0x05fc17f2, 0x5c023000, 0x5c01b000, 0x1c01f000, - 0x40680800, 0x0005fb2e, 0x1c01f000, 0x4933c857, - 0x42000800, 0x8000004e, 0x59300416, 0x8c000510, - 0x05000002, 0x84040d52, 0x48066004, 0x58d400ea, - 0x8c000516, 0x05fe07fe, 0x83300400, 0x80000000, - 0x4801a8e1, 0x1c01f000, 0x4933c857, 0x59300804, - 0x82040d00, 0x00000100, 0x82040d40, 0x80000040, + 0x05d01bb3, 0x4803282c, 0x480b282d, 0x642b282b, + 0x1c01f000, 0x80e9d1c0, 0x0500000c, 0x0501f82e, + 0x05025000, 0x4203e000, 0x80000000, 0x40e81000, + 0x41780800, 0x61900000, 0x0501f8b4, 0x5994002e, + 0x80080400, 0x4803282e, 0x1c01f000, 0x42001000, + 0x00104a82, 0x05fdfe97, 0x42001000, 0x00104a75, + 0x05fdffdc, 0x42001000, 0x00103e29, 0x05fdfe91, + 0x42001000, 0x00103ea1, 0x05fdfe8e, 0x42001000, + 0x00103e08, 0x05fdfe8b, 0x42001000, 0x00103ecb, + 0x05fdf69b, 0x4203e000, 0x70000000, 0x4203e000, + 0xb0300000, 0x40ebf800, 0x60f00000, 0x05004004, + 0x80000040, 0x05fe07fe, 0x0501f006, 0x4203e000, + 0x70000000, 0x42000000, 0x0010b2f1, 0x0521fbd6, + 0x1c01f000, 0x4203e000, 0x80000000, 0x4203e000, + 0xb0400000, 0x40ebf800, 0x60f00000, 0x05005004, + 0x80000040, 0x05fe07fe, 0x0501f006, 0x4203e000, + 0x80000000, 0x42000000, 0x0010b2f2, 0x0521fbc6, + 0x1c01f000, 0x59a8080d, 0x59a80266, 0x80040480, + 0x599c0a02, 0x800409c0, 0x05020002, 0x80040800, + 0x80041480, 0x05001002, 0x40000800, 0x48075064, + 0x59a8100d, 0x40040000, 0x800acc80, 0x4967500d, + 0x49675065, 0x59aaa80b, 0x41640800, 0x60c01000, + 0x0501f84e, 0x8206a400, 0x00110514, 0x49535061, + 0x4152b000, 0x42006000, 0x0010cec4, 0x4a006005, + 0x0000012c, 0x4a006006, 0xda10da10, 0x64486009, + 0x4a00600a, 0x0010cec4, 0x4a00600b, 0x00100e21, + 0x599c0014, 0x48006012, 0x599c0015, 0x48006013, + 0x42006000, 0x00110454, 0x64206203, 0x64186407, + 0x4a006002, 0xffff0000, 0x4a006009, 0x0010cec4, + 0x4a006016, 0x0010cec4, 0x599c0014, 0x48006017, + 0x599c0015, 0x48006018, 0x599c0413, 0x48006019, + 0x4950601a, 0x4954601b, 0x59a80064, 0x4800601c, + 0x4a00601d, 0x0010ae61, 0x4a00601e, 0x0010ae62, + 0x4a00601f, 0x0010ae63, 0x42000000, 0xb0000000, + 0x42000800, 0x00110454, 0x0001f92d, 0x1c01f000, + 0x4807c856, 0x59240206, 0x800409c0, 0x05000003, + 0x80080540, 0x0501f002, 0x80080500, 0x48024a06, + 0x1c01f000, 0x4803c856, 0x4c000000, 0x05fdf933, + 0x0502000b, 0x05f1fb16, 0x05d20b19, 0x5c000000, + 0x48026802, 0x0509f824, 0x05000006, 0x4936600a, + 0x64066407, 0x60067000, 0x0005f478, 0x5c000000, + 0x1c01f000, 0x05d1fb0e, 0x4c0c0000, 0x4c100000, + 0x4c140000, 0x4c180000, 0x80001d80, 0x80002580, + 0x60803000, 0x90040501, 0x05000003, 0x40080000, + 0x800c1c00, 0x400c2800, 0x800c1902, 0x80102102, + 0x90140501, 0x05000003, 0x82102540, 0x80000000, + 0x80040902, 0x80183040, 0x05fe07f3, 0x40100800, + 0x400c0000, 0x5c003000, 0x5c002800, 0x5c002000, + 0x5c001800, 0x1c01f000, 0x4c580000, 0x6080b000, + 0x80000540, 0x05000018, 0x80041c80, 0x05021016, + 0x800810c2, 0x80040982, 0x05001006, 0x80041c80, + 0x05021005, 0x8058b040, 0x05fe07fa, 0x0501f006, + 0x80041c80, 0x400c0800, 0x80081000, 0x8058b040, + 0x05fe07f4, 0x4c000000, 0x41f00000, 0x82000500, + 0xf7ffffff, 0x4003e000, 0x5c000000, 0x5c00b000, + 0x1c01f000, 0x4c000000, 0x41f00000, 0x82000540, + 0x08000000, 0x05fdf7f8, 0x42007000, 0x0010aefa, + 0x64147000, 0x64007401, 0x4a007201, 0x00000840, + 0x64147202, 0x6401a8e8, 0x6443c82b, 0x0501f84e, + 0x4a01a8e9, 0x00003a0d, 0x4a01a8ee, 0x00080202, + 0x6405a8e8, 0x640378e8, 0x6443c821, 0x6413c823, + 0x0501f879, 0x4a0378e9, 0x00003a0d, 0x4a0378ee, + 0x00080302, 0x640778e8, 0x41780800, 0x6003a0ec, + 0x42001000, 0x0010b1b9, 0x42001800, 0x0010e237, + 0x600c2000, 0x6120297f, 0x4a03a005, 0xd0000001, + 0x59d00006, 0x4a03a005, 0x90000001, 0x59d00006, + 0x4a03a005, 0x60000001, 0x59d00006, 0x4a03a005, + 0x60000003, 0x59d00006, 0x4a03a005, 0x60000005, + 0x59d00006, 0x4a03a005, 0x60000007, 0x59d00006, + 0x4a03a005, 0x60000009, 0x59d00006, 0x4a03a005, + 0x6000000b, 0x64041001, 0x4a001002, 0x00000100, + 0x4a001008, 0x00020bf5, 0x480c100a, 0x4810100c, + 0x4814100d, 0x4978120e, 0x4804140e, 0x4978100f, + 0x820c1c00, 0x00000080, 0x480c100b, 0x90081411, + 0x801020c4, 0x80142800, 0x91d3a420, 0x80040800, + 0x90040485, 0x05fc17d7, 0x59e00003, 0x82000500, + 0xffffffe0, 0x82000540, 0x00008000, 0x4803c003, + 0x59c40006, 0x82000500, 0xfffcffff, 0x48038806, + 0x1c01f000, 0x4d900000, 0x4d180000, 0x4c500000, + 0x4c580000, 0x4c540000, 0x4a01a8e7, 0xaaaaaaaa, + 0x4a01a8e6, 0xaaaaaaaa, 0x4a01a8e5, 0xaaaaaaaa, + 0x4a01a8e4, 0xaaaaaaaa, 0x4a01a8ee, 0x00200000, + 0x4979a8ee, 0x4a01a8ce, 0x0010a3b3, 0x6000b001, + 0x90d4ac00, 0x4178a000, 0x0521fb8e, 0x4a01a81d, + 0x00100e1d, 0x4a01a81b, 0x00100e26, 0x4a01a81c, + 0x00100e36, 0x4a01a81e, 0x0010b18d, 0x64031800, + 0x600c0800, 0x42001800, 0x0010b190, 0x417a3000, + 0x811b20c8, 0x83932400, 0x0000b037, 0x48072000, + 0x480f2001, 0x64032002, 0x800408c4, 0x900c1c05, + 0x811a3000, 0x91180485, 0x05fc17f6, 0x5c00a800, + 0x5c00b000, 0x5c00a000, 0x5c023000, 0x5c032000, + 0x1c01f000, 0x4cd80000, 0x4d180000, 0x4a0378e7, + 0xaaaaaaaa, 0x4a0378e6, 0xaaaaaaaa, 0x4a0378e5, + 0xaaaaaaaa, 0x4a0378e4, 0xaaaaaaaa, 0x4a03781b, + 0x00100e26, 0x4a03781c, 0x00100e36, 0x4a03781d, + 0x0010aefd, 0x4a03781e, 0x0010af04, 0x42000800, + 0x0010b190, 0x417a3000, 0x42001000, 0x0010e237, + 0x8119b0c8, 0x82d9b400, 0x0000bf32, 0x83180400, + 0x001066a7, 0x50000000, 0x4801b002, 0x4809b000, + 0x4809b001, 0x82081400, 0x00000080, 0x90040c05, + 0x811a3000, 0x91180485, 0x05fc17f2, 0x5c023000, + 0x5c01b000, 0x1c01f000, 0x40680800, 0x0005fb2e, + 0x1c01f000, 0x4933c857, 0x42000800, 0x8000004e, 0x59300416, 0x8c000510, 0x05000002, 0x84040d52, - 0x48066004, 0x497a6000, 0x58d400ea, 0x8c000516, - 0x05fe07fe, 0x83300400, 0x60000000, 0x4801a8e1, - 0x1c01f000, 0x0501f802, 0x1c01f000, 0x0501f946, - 0x4df00000, 0x4d300000, 0x4c5c0000, 0x4c600000, - 0x4130c000, 0x4178b800, 0x598e6005, 0x813261c0, - 0x05000036, 0x5930080a, 0x800409c0, 0x0502000d, - 0x4d340000, 0x0001fae7, 0x41340800, 0x5c026800, - 0x0502002b, 0x58040802, 0x59300019, 0x80040580, - 0x82000500, 0x00ffffff, 0x05000005, 0x0501f024, - 0x58040403, 0x81440580, 0x05020021, 0x5930501a, - 0x59340013, 0x82000500, 0x00ffffff, 0x80280580, - 0x0502001b, 0x5930002a, 0x80600580, 0x05000018, - 0x0501f820, 0x59302000, 0x497a6000, 0x805cb9c0, - 0x05020009, 0x598c0004, 0x81300580, 0x05020004, - 0x497b1805, 0x497b1804, 0x0501f008, 0x48131805, - 0x0501f006, 0x4810b800, 0x598c0004, 0x81300580, - 0x05020002, 0x485f1804, 0x4c100000, 0x0005fc5a, - 0x0501f8f2, 0x5c026000, 0x05fdf7cd, 0x4130b800, - 0x59326000, 0x05fdf7ca, 0x5c00c000, 0x5c00b800, - 0x5c026000, 0x5c03e000, 0x050008ef, 0x1c01f000, - 0x598c000b, 0x81300580, 0x05000003, 0x497a6008, - 0x1c01f000, 0x59c40004, 0x9000050c, 0x05000005, - 0x64338804, 0x4a01a8e5, 0x00000800, 0x0501f008, - 0x0501fb8c, 0x59300403, 0xb0000d80, 0x05000003, - 0xb0000582, 0x05020002, 0x497a6008, 0x0501fe2b, - 0x80000580, 0x1c01f000, 0x0501f805, 0x60058800, - 0x05000002, 0x60018800, 0x1c01f000, 0x59300804, - 0x8c040520, 0x05020003, 0x90000541, 0x1c01f000, - 0x4933c857, 0x4d380000, 0x59300804, 0x84040d20, - 0x48066004, 0x61267000, 0x59300203, 0x90000583, - 0x05000002, 0x604e7000, 0x0005fc78, 0x80000580, - 0x5c027000, 0x1c01f000, 0x0501f805, 0x60058800, - 0x05000002, 0x60018800, 0x1c01f000, 0x59300019, - 0x81480580, 0x05020003, 0x5930001a, 0x814c0580, - 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x0501f8c6, - 0x4df00000, 0x05fdfd92, 0x59900002, 0x90000503, - 0x0c01f001, 0x00105ecd, 0x00105ec2, 0x00105ec1, - 0x00105ec1, 0x05d1fb2e, 0x59926005, 0x0501f889, - 0x813261c0, 0x05000008, 0x59300004, 0x8c000516, - 0x05000004, 0x59325809, 0x497a5809, 0x497a580a, - 0x0501f886, 0x5c03e000, 0x0500089b, 0x5c026000, - 0x5c025800, 0x1c01f000, 0x5c000000, 0x4c000000, - 0x4803c857, 0x4d300000, 0x4a01a8e5, 0x00000800, - 0x0501f8a5, 0x4df00000, 0x598c0000, 0x90000507, - 0x4803c857, 0x0c01f001, 0x00105f04, 0x00105ee7, - 0x00105eee, 0x00105ef1, 0x00105efd, 0x00105f04, - 0x00105f01, 0x00105ee6, 0x05d1fb09, 0x598c000b, - 0x80026540, 0x05000003, 0x0501f81e, 0x05d20b04, - 0x0501fdce, 0x0501f017, 0x0501f829, 0x0501fdcb, - 0x0501f014, 0x598c000b, 0x80026540, 0x05000011, - 0x0501f83a, 0x05000006, 0x0501f847, 0x05000004, - 0x0501f810, 0x05000002, 0x0501f81d, 0x0501fdbf, - 0x0501f008, 0x0501f840, 0x05d20af1, 0x0501fdbb, - 0x0501f004, 0x0501f82d, 0x05d20aed, 0x0501fdb7, - 0x5c03e000, 0x05000864, 0x5c026000, 0x1c01f000, - 0x598c0007, 0x81300580, 0x0502000c, 0x0501f857, - 0x0501f846, 0x59300000, 0x800001c0, 0x05000004, - 0x48031807, 0x497a6000, 0x0501f003, 0x497b1807, - 0x497b1806, 0x80000580, 0x1c01f000, 0x4d2c0000, - 0x59300407, 0x90000583, 0x05020012, 0x598c0009, - 0x81300580, 0x0502000f, 0x0501f844, 0x59325809, - 0x497a5809, 0x497a580a, 0x0501f830, 0x59300000, - 0x800001c0, 0x05000004, 0x48031809, 0x497a6000, - 0x0501f003, 0x497b1808, 0x497b1809, 0x80000580, - 0x5c025800, 0x1c01f000, 0x598c0005, 0x81300580, - 0x0502000c, 0x0501f831, 0x0501f820, 0x59300000, - 0x800001c0, 0x05000004, 0x48031805, 0x497a6000, - 0x0501f003, 0x497b1805, 0x497b1804, 0x80000580, - 0x1c01f000, 0x598c0003, 0x81300580, 0x0502000c, - 0x0501f822, 0x0501f811, 0x59300000, 0x800001c0, - 0x05000004, 0x48031803, 0x497a6000, 0x0501f003, - 0x497b1803, 0x497b1802, 0x80000580, 0x1c01f000, - 0x64032002, 0x497b2005, 0x497b2006, 0x497b2007, - 0x4979b003, 0x1c01f000, 0x4c040000, 0x59300004, - 0x82000500, 0x7ffeffff, 0x48026004, 0x58d400e4, - 0x8c000514, 0x05000007, 0x58d40011, 0x81300580, - 0x05020004, 0x4979a811, 0x4a01a8e4, 0x00000800, - 0x5c000800, 0x1c01f000, 0x4803c856, 0x598c000a, - 0x80000540, 0x05000003, 0x80000040, 0x4803180a, - 0x1c01f000, 0x58d400ea, 0x90000507, 0x90000583, - 0x05020003, 0x4803c856, 0x6405a8e8, 0x59bc00ea, - 0x90000507, 0x90000583, 0x05020005, 0x4803c856, - 0x640778e8, 0x4a0370e4, 0x00000800, 0x1c01f000, + 0x48066004, 0x58d400ea, 0x8c000516, 0x05fe07fe, + 0x83300400, 0x80000000, 0x4801a8e1, 0x1c01f000, + 0x4933c857, 0x59300804, 0x82040d00, 0x00000100, + 0x82040d40, 0x80000040, 0x59300416, 0x8c000510, + 0x05000002, 0x84040d52, 0x48066004, 0x497a6000, + 0x58d400ea, 0x8c000516, 0x05fe07fe, 0x83300400, + 0x60000000, 0x4801a8e1, 0x1c01f000, 0x0501f802, + 0x1c01f000, 0x0501f946, 0x4df00000, 0x4d300000, + 0x4c5c0000, 0x4c600000, 0x4130c000, 0x4178b800, + 0x598e6005, 0x813261c0, 0x05000036, 0x5930080a, + 0x800409c0, 0x0502000d, 0x4d340000, 0x0001fae7, + 0x41340800, 0x5c026800, 0x0502002b, 0x58040802, + 0x59300019, 0x80040580, 0x82000500, 0x00ffffff, + 0x05000005, 0x0501f024, 0x58040403, 0x81440580, + 0x05020021, 0x5930501a, 0x59340013, 0x82000500, + 0x00ffffff, 0x80280580, 0x0502001b, 0x5930002a, + 0x80600580, 0x05000018, 0x0501f820, 0x59302000, + 0x497a6000, 0x805cb9c0, 0x05020009, 0x598c0004, + 0x81300580, 0x05020004, 0x497b1805, 0x497b1804, + 0x0501f008, 0x48131805, 0x0501f006, 0x4810b800, + 0x598c0004, 0x81300580, 0x05020002, 0x485f1804, + 0x4c100000, 0x0005fc5a, 0x0501f8f2, 0x5c026000, + 0x05fdf7cd, 0x4130b800, 0x59326000, 0x05fdf7ca, + 0x5c00c000, 0x5c00b800, 0x5c026000, 0x5c03e000, + 0x050008ef, 0x1c01f000, 0x598c000b, 0x81300580, + 0x05000003, 0x497a6008, 0x1c01f000, 0x59c40004, + 0x9000050c, 0x05000005, 0x64338804, 0x4a01a8e5, + 0x00000800, 0x0501f008, 0x0501fb8c, 0x59300403, + 0xb0000d80, 0x05000003, 0xb0000582, 0x05020002, + 0x497a6008, 0x0501fe2b, 0x80000580, 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, 0x60018800, - 0x1c01f000, 0x60042800, 0x58d400ea, 0x90000507, - 0x90000581, 0x0502000d, 0x4803c856, 0x60000800, - 0x0501f831, 0x60000820, 0x58d400ea, 0x90000507, - 0x90000583, 0x05000004, 0x80040840, 0x05fe07fb, - 0x05d1fa63, 0x41782800, 0x59bc00ea, 0x90000507, - 0x90000581, 0x0502000e, 0x4803c856, 0x60000800, - 0x0501f80d, 0x4a0370e4, 0x00000c00, 0x60000820, - 0x59bc00ea, 0x90000507, 0x90000583, 0x05000005, - 0x80040840, 0x05fe07fb, 0x05d1fa51, 0x801429c0, - 0x1c01f000, 0x59bc00ea, 0x90000507, 0x90000581, - 0x05d20a4b, 0x59bc00ea, 0x8c000516, 0x05fe07fe, - 0x480778e1, 0x1c01f000, 0x40681000, 0x406c0800, - 0x59bc00ea, 0x8c000516, 0x05fe07fe, 0x480778e1, - 0x59bc00ea, 0x8c000516, 0x05fe07fe, 0x480b78e1, - 0x1c01f000, 0x58d400ea, 0x8c000516, 0x05fe07fe, - 0x4805a8e1, 0x1c01f000, 0x58d400ea, 0x8c000516, - 0x05fe07fe, 0x4805a8e1, 0x58d400ea, 0x8c000516, - 0x05fe07fe, 0x4809a8e1, 0x1c01f000, 0x4a0378e4, - 0x00002000, 0x42007000, 0x0010ac7a, 0x58380401, - 0x8c000506, 0x05020003, 0x4a01a8e4, 0x00008000, - 0x1c01f000, 0x82000d00, 0x02000018, 0x05d20a16, - 0x05d1fa1f, 0x00106134, 0x00106149, 0x00105fd8, - 0x00106133, 0x00105fd7, 0x001060cd, 0x05d1fa18, - 0x4d2c0000, 0x4d300000, 0x58d400ea, 0x8c000510, - 0x05fc07fe, 0x58d660e0, 0x813261c0, 0x05d00a10, - 0x59300004, 0x8c000520, 0x05000010, 0x82000500, - 0xfffefeff, 0x48026004, 0x59325809, 0x59301407, - 0x90080583, 0x05000006, 0x90080586, 0x05d20a04, - 0x592c0a07, 0x0005fae7, 0x0501f006, 0x0001fb5b, - 0x0005fc5a, 0x0501f003, 0x84000510, 0x48026004, - 0x5c026000, 0x5c025800, 0x1c01f000, 0x82000d00, - 0x82000018, 0x05d209ec, 0x05d1f9f5, 0x0010600b, - 0x0010600b, 0x0010600b, 0x0010600c, 0x0010602c, - 0x001060af, 0x0010600b, 0x00106102, 0x0010600b, - 0x00106133, 0x0010604b, 0x00020b80, 0x0010608e, - 0x0010600b, 0x0010600b, 0x0010600b, 0x05d1f9e4, - 0x4d300000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x4cd80000, 0x0501fcc0, 0x59bc00ea, - 0x8c000510, 0x05fc07fe, 0x59be60e0, 0x59300004, - 0x8c000520, 0x05000010, 0x82000500, 0xfffefeff, - 0x48026004, 0x05fdff60, 0x05d5fd3e, 0x05d5fd9d, - 0x05d5fd5c, 0x5c01b000, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x5c026000, 0x642378e4, - 0x05fdf741, 0x84000510, 0x48026004, 0x05fdf7f6, - 0x4d300000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x4cd80000, 0x0501fca0, 0x59bc00ea, - 0x8c000510, 0x05fc07fe, 0x59be60e0, 0x59300004, - 0x8c000520, 0x0500000f, 0x82000500, 0xfffefeff, - 0x48026004, 0x640e6203, 0x05fdff3f, 0x05d5fcda, - 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, - 0x5c032000, 0x5c026000, 0x642378e4, 0x05fdf722, - 0x84000510, 0x48026004, 0x05fdf7f6, 0x4d300000, - 0x4d2c0000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x4cd80000, 0x0501fc80, 0x59bc00ea, - 0x8c000510, 0x05fc07fe, 0x59be60e0, 0x59300004, - 0x8c000520, 0x0500001a, 0x82000500, 0xfffefeff, - 0x48026004, 0x640e6203, 0x59325809, 0x812e59c0, - 0x05d0098f, 0x42000000, 0x0010b079, 0x051dff32, - 0x592c0209, 0x84000552, 0x48025a09, 0x05d9f868, - 0x05fdff15, 0x05d5fcb0, 0x5c01b000, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c025800, - 0x5c026000, 0x642378e4, 0x05fdf6f7, 0x84000510, - 0x48026004, 0x05fdf7f5, 0x42007000, 0x00020d9f, - 0x58380000, 0x90000580, 0x0500000d, 0x58d80805, - 0x8c040500, 0x0500000a, 0x83180400, 0x00020bf0, - 0x50006000, 0x58380001, 0x80300580, 0x05000005, - 0x4803c856, 0x05d1fe1e, 0x4979b005, 0x1c01f000, - 0x5830000f, 0x4803c857, 0x6404620e, 0x4978600f, - 0x49787002, 0x1c01f000, 0x4d2c0000, 0x4d300000, - 0x59bc00ea, 0x8c000510, 0x05fc07fe, 0x59be60e0, - 0x813261c0, 0x05d0095a, 0x59300004, 0x8c000520, - 0x05000014, 0x82000500, 0xfffefeff, 0x48026004, - 0x59301407, 0x90080583, 0x05d20951, 0x0201f800, - 0x0010eee3, 0x80c40040, 0x05d2094d, 0x59325809, - 0x60040800, 0x600a8000, 0x05f1ff47, 0x0001fb5b, - 0x0005fc5a, 0x5c026000, 0x5c025800, 0x1c01f000, - 0x84000510, 0x48026004, 0x05fdf7fb, 0x4d300000, - 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, - 0x4cd80000, 0x0501fc1d, 0x59bc00ea, 0x8c000510, - 0x05fc07fe, 0x59be60e0, 0x59300004, 0x8c000520, - 0x0500000e, 0x82000500, 0xfffefeff, 0x48026004, - 0x05fdfebd, 0x05d5fc8f, 0x5c01b000, 0x5c022800, + 0x1c01f000, 0x59300804, 0x8c040520, 0x05020003, + 0x90000541, 0x1c01f000, 0x4933c857, 0x4d380000, + 0x59300804, 0x84040d20, 0x48066004, 0x61267000, + 0x59300203, 0x90000583, 0x05000002, 0x604e7000, + 0x0005fc78, 0x80000580, 0x5c027000, 0x1c01f000, + 0x0501f805, 0x60058800, 0x05000002, 0x60018800, + 0x1c01f000, 0x59300019, 0x81480580, 0x05020003, + 0x5930001a, 0x814c0580, 0x1c01f000, 0x4d2c0000, + 0x4d300000, 0x0501f8c6, 0x4df00000, 0x05fdfd92, + 0x59900002, 0x90000503, 0x0c01f001, 0x0010608f, + 0x00106084, 0x00106083, 0x00106083, 0x05d1f96c, + 0x59926005, 0x0501f889, 0x813261c0, 0x05000008, + 0x59300004, 0x8c000516, 0x05000004, 0x59325809, + 0x497a5809, 0x497a580a, 0x0501f886, 0x5c03e000, + 0x0500089b, 0x5c026000, 0x5c025800, 0x1c01f000, + 0x5c000000, 0x4c000000, 0x4803c857, 0x4d300000, + 0x4a01a8e5, 0x00000800, 0x0501f8a5, 0x4df00000, + 0x598c0000, 0x90000507, 0x4803c857, 0x0c01f001, + 0x001060c6, 0x001060a9, 0x001060b0, 0x001060b3, + 0x001060bf, 0x001060c6, 0x001060c3, 0x001060a8, + 0x05d1f947, 0x598c000b, 0x80026540, 0x05000003, + 0x0501f81e, 0x05d20942, 0x0501fdce, 0x0501f017, + 0x0501f829, 0x0501fdcb, 0x0501f014, 0x598c000b, + 0x80026540, 0x05000011, 0x0501f83a, 0x05000006, + 0x0501f847, 0x05000004, 0x0501f810, 0x05000002, + 0x0501f81d, 0x0501fdbf, 0x0501f008, 0x0501f840, + 0x05d2092f, 0x0501fdbb, 0x0501f004, 0x0501f82d, + 0x05d2092b, 0x0501fdb7, 0x5c03e000, 0x05000864, + 0x5c026000, 0x1c01f000, 0x598c0007, 0x81300580, + 0x0502000c, 0x0501f857, 0x0501f846, 0x59300000, + 0x800001c0, 0x05000004, 0x48031807, 0x497a6000, + 0x0501f003, 0x497b1807, 0x497b1806, 0x80000580, + 0x1c01f000, 0x4d2c0000, 0x59300407, 0x90000583, + 0x05020012, 0x598c0009, 0x81300580, 0x0502000f, + 0x0501f844, 0x59325809, 0x497a5809, 0x497a580a, + 0x0501f830, 0x59300000, 0x800001c0, 0x05000004, + 0x48031809, 0x497a6000, 0x0501f003, 0x497b1808, + 0x497b1809, 0x80000580, 0x5c025800, 0x1c01f000, + 0x598c0005, 0x81300580, 0x0502000c, 0x0501f831, + 0x0501f820, 0x59300000, 0x800001c0, 0x05000004, + 0x48031805, 0x497a6000, 0x0501f003, 0x497b1805, + 0x497b1804, 0x80000580, 0x1c01f000, 0x598c0003, + 0x81300580, 0x0502000c, 0x0501f822, 0x0501f811, + 0x59300000, 0x800001c0, 0x05000004, 0x48031803, + 0x497a6000, 0x0501f003, 0x497b1803, 0x497b1802, + 0x80000580, 0x1c01f000, 0x64032002, 0x497b2005, + 0x497b2006, 0x497b2007, 0x4979b003, 0x1c01f000, + 0x4c040000, 0x59300004, 0x82000500, 0x7ffeffff, + 0x48026004, 0x58d400e4, 0x8c000514, 0x05000007, + 0x58d40011, 0x81300580, 0x05020004, 0x4979a811, + 0x4a01a8e4, 0x00000800, 0x5c000800, 0x1c01f000, + 0x4803c856, 0x598c000a, 0x80000540, 0x05000003, + 0x80000040, 0x4803180a, 0x1c01f000, 0x58d400ea, + 0x90000507, 0x90000583, 0x05020003, 0x4803c856, + 0x6405a8e8, 0x59bc00ea, 0x90000507, 0x90000583, + 0x05020005, 0x4803c856, 0x640778e8, 0x4a0370e4, + 0x00000800, 0x1c01f000, 0x0501f805, 0x60058800, + 0x05000002, 0x60018800, 0x1c01f000, 0x60042800, + 0x58d400ea, 0x90000507, 0x90000581, 0x0502000d, + 0x4803c856, 0x60000800, 0x0501f831, 0x60000820, + 0x58d400ea, 0x90000507, 0x90000583, 0x05000004, + 0x80040840, 0x05fe07fb, 0x05d1f8a1, 0x41782800, + 0x59bc00ea, 0x90000507, 0x90000581, 0x0502000e, + 0x4803c856, 0x60000800, 0x0501f80d, 0x4a0370e4, + 0x00000c00, 0x60000820, 0x59bc00ea, 0x90000507, + 0x90000583, 0x05000005, 0x80040840, 0x05fe07fb, + 0x05d1f88f, 0x801429c0, 0x1c01f000, 0x59bc00ea, + 0x90000507, 0x90000581, 0x05d20889, 0x59bc00ea, + 0x8c000516, 0x05fe07fe, 0x480778e1, 0x1c01f000, + 0x40681000, 0x406c0800, 0x59bc00ea, 0x8c000516, + 0x05fe07fe, 0x480778e1, 0x59bc00ea, 0x8c000516, + 0x05fe07fe, 0x480b78e1, 0x1c01f000, 0x58d400ea, + 0x8c000516, 0x05fe07fe, 0x4805a8e1, 0x1c01f000, + 0x58d400ea, 0x8c000516, 0x05fe07fe, 0x4805a8e1, + 0x58d400ea, 0x8c000516, 0x05fe07fe, 0x4809a8e1, + 0x1c01f000, 0x4a0378e4, 0x00002000, 0x42007000, + 0x0010aefa, 0x58380401, 0x8c000506, 0x05020003, + 0x4a01a8e4, 0x00008000, 0x1c01f000, 0x82000d00, + 0x02000018, 0x05d20854, 0x05d1f85d, 0x001062f6, + 0x0010630b, 0x0010619a, 0x001062f5, 0x00106199, + 0x0010628f, 0x05d1f856, 0x4d2c0000, 0x4d300000, + 0x58d400ea, 0x8c000510, 0x05fc07fe, 0x58d660e0, + 0x813261c0, 0x05d0084e, 0x59300004, 0x8c000520, + 0x05000010, 0x82000500, 0xfffefeff, 0x48026004, + 0x59325809, 0x59301407, 0x90080583, 0x05000006, + 0x90080586, 0x05d20842, 0x592c0a07, 0x0005fae7, + 0x0501f006, 0x0001fb5b, 0x0005fc5a, 0x0501f003, + 0x84000510, 0x48026004, 0x5c026000, 0x5c025800, + 0x1c01f000, 0x82000d00, 0x82000018, 0x05d2082a, + 0x05d1f833, 0x001061cd, 0x001061cd, 0x001061cd, + 0x001061ce, 0x001061ee, 0x00106271, 0x001061cd, + 0x001062c4, 0x001061cd, 0x001062f5, 0x0010620d, + 0x00020b80, 0x00106250, 0x001061cd, 0x001061cd, + 0x001061cd, 0x05d1f822, 0x4d300000, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, + 0x0501fcc0, 0x59bc00ea, 0x8c000510, 0x05fc07fe, + 0x59be60e0, 0x59300004, 0x8c000520, 0x05000010, + 0x82000500, 0xfffefeff, 0x48026004, 0x05fdff60, + 0x05d5fb7c, 0x05d5fbdb, 0x05d5fb9a, 0x5c01b000, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x5c026000, 0x642378e4, 0x05fdf741, 0x84000510, + 0x48026004, 0x05fdf7f6, 0x4d300000, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, + 0x0501fca0, 0x59bc00ea, 0x8c000510, 0x05fc07fe, + 0x59be60e0, 0x59300004, 0x8c000520, 0x0500000f, + 0x82000500, 0xfffefeff, 0x48026004, 0x640e6203, + 0x05fdff3f, 0x05d5fb18, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c026000, - 0x642378e4, 0x05fdf6a0, 0x84000510, 0x48026004, - 0x05fdf7f6, 0x4d300000, 0x4d2c0000, 0x4d340000, - 0x4da40000, 0x4cd00000, 0x4d240000, 0x58d400ea, - 0x8c000510, 0x05fc07fe, 0x58d660e0, 0x813261c0, - 0x05d00917, 0x59300004, 0x8c000520, 0x0500001e, - 0x82000500, 0xfffefeff, 0x48026004, 0x5932680a, - 0x42034800, 0x0010ac7d, 0x5932481d, 0x05011000, - 0x4a03c840, 0x0010ac84, 0x644bc842, 0x05011000, - 0x4a03c840, 0x0010ac96, 0x4a03c842, 0x000000ff, - 0x05011000, 0x4a03c840, 0x0010ad95, 0x4a03c842, - 0x000000ff, 0x0501fbf9, 0x5c024800, 0x5c01a000, - 0x5c034800, 0x5c026800, 0x5c025800, 0x5c026000, - 0x1c01f000, 0x84000510, 0x48026004, 0x5c024800, - 0x5c01a000, 0x5c034800, 0x5c026800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x4d300000, 0x4d2c0000, - 0x4d340000, 0x4cd00000, 0x4d240000, 0x4d900000, + 0x642378e4, 0x05fdf722, 0x84000510, 0x48026004, + 0x05fdf7f6, 0x4d300000, 0x4d2c0000, 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, - 0x0501fbc6, 0x59bc00ea, 0x8c000510, 0x05fc07fe, - 0x59be60e0, 0x813261c0, 0x05d008dd, 0x59300004, - 0x8c000520, 0x05000011, 0x82000500, 0xfffefeff, - 0x48026004, 0x5932481d, 0x0505fa5c, 0x5c01b000, - 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x5c024800, 0x5c01a000, 0x5c026800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x84000510, 0x48026004, + 0x0501fc80, 0x59bc00ea, 0x8c000510, 0x05fc07fe, + 0x59be60e0, 0x59300004, 0x8c000520, 0x0500001a, + 0x82000500, 0xfffefeff, 0x48026004, 0x640e6203, + 0x59325809, 0x812e59c0, 0x05cc0fcd, 0x42000000, + 0x0010b2f9, 0x0521f820, 0x592c0209, 0x84000552, + 0x48025a09, 0x05d5fea4, 0x05fdff15, 0x05d5faee, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, - 0x5c032000, 0x5c024800, 0x5c01a000, 0x5c026800, - 0x5c025800, 0x5c026000, 0x1c01f000, 0x05d1f8bc, - 0x4d300000, 0x4d380000, 0x42000000, 0x0010b0b7, - 0x051dfe5d, 0x05fdfe44, 0x598e600b, 0x59c40004, - 0x8c000506, 0x05000003, 0x0501f8d6, 0x64238804, - 0x813261c0, 0x05000004, 0x0501fb8b, 0x60527000, - 0x0005fc78, 0x6409a8e4, 0x5c027000, 0x5c026000, - 0x05fdf621, 0x4d180000, 0x4d300000, 0x4d380000, - 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, - 0x4cd80000, 0x05fdfe2c, 0x417a3000, 0x59c40804, - 0x83180400, 0x00106491, 0x50000000, 0x80040500, - 0x05000017, 0x42000000, 0x0010b0b8, 0x051dfe3a, - 0x0501fb76, 0x59926005, 0x0501f85d, 0x83180400, - 0x00106491, 0x50000000, 0x48038804, 0x813261c0, - 0x05000007, 0x59300004, 0x8c00050c, 0x05020002, - 0x640e6203, 0x612a7000, 0x0005fc78, 0x59c40004, - 0x82000500, 0x00f80000, 0x05000004, 0x811a3000, - 0x91180485, 0x05fc17e2, 0x6421a8e4, 0x5c01b000, - 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x5c027000, 0x5c026000, 0x5c023000, 0x05fdf5ee, - 0x4d2c0000, 0x4d340000, 0x5932680a, 0x598c0800, - 0x90040586, 0x05020004, 0x918c1405, 0x918c1c04, - 0x0501f00f, 0x90040584, 0x05020004, 0x918c1403, - 0x918c1c02, 0x0501f00a, 0x90040581, 0x05020004, - 0x918c1407, 0x918c1c06, 0x0501f005, 0x90040582, - 0x05020024, 0x918c1409, 0x918c1c08, 0x41306800, - 0x58340000, 0x80007d40, 0x0500001e, 0x583c000a, - 0x81340580, 0x05020006, 0x403c6800, 0x583c0000, - 0x80007d40, 0x05fe07fa, 0x0501f016, 0x4933c857, - 0x483fc857, 0x583c0000, 0x48006800, 0x49307800, - 0x443c1000, 0x500c0000, 0x803c0580, 0x05020002, - 0x44341800, 0x80000580, 0x4803180b, 0x4803180d, - 0x598c0000, 0x90000583, 0x05000002, 0x64031800, - 0x80000580, 0x5c026800, 0x5c025800, 0x1c01f000, - 0x90000541, 0x05fdf7fc, 0x0501f805, 0x60018800, - 0x05000002, 0x60058800, 0x1c01f000, 0x491bc857, - 0x59b400f6, 0x90000538, 0x05fe07fe, 0x59c80840, - 0x90040550, 0x48039040, 0x59c41008, 0x4c040000, - 0x4c080000, 0x82081500, 0xffffff7f, 0x480b8808, - 0x0501faa5, 0x05020006, 0x0501faa9, 0x05000020, - 0x48038804, 0x05d5fbbe, 0x0501f03d, 0x64238803, - 0x59c40003, 0x90000503, 0x05fc07fe, 0x8c000502, - 0x05020006, 0x0501fa9e, 0x05000015, 0x48038804, - 0x05d5fbb3, 0x0501f032, 0x0501faa5, 0x05020007, - 0x59c80040, 0x8400056a, 0x48039040, 0x59c80040, - 0x8c00052a, 0x05fe07fe, 0x59c40005, 0x82000500, - 0xc0000000, 0x05000006, 0x59c400a3, 0x84000540, - 0x480388a3, 0x4a038805, 0xc0000000, 0x05d5fb71, - 0x4a03a005, 0x30000000, 0x59d00006, 0x4a03a005, - 0x30000000, 0x6401b006, 0x59d00005, 0x8c000504, - 0x05fe07fe, 0x05fdfe81, 0x6403a014, 0x600008ec, - 0x83180540, 0x60000000, 0x480008a1, 0x811800dc, - 0x59c80840, 0x80040540, 0x48039040, 0x82000540, - 0x00003000, 0x48039040, 0x59c80040, 0x82000500, - 0x00003000, 0x05fe07fd, 0x05d5fb76, 0x83180400, - 0x00106491, 0x50000000, 0x48038804, 0x80000580, - 0x4df00000, 0x05fdfa3e, 0x5c03e000, 0x5c001000, - 0x5c000800, 0x480b8808, 0x48079040, 0x1c01f000, - 0x4803c856, 0x59b400f6, 0x90000538, 0x05fe07fe, - 0x59c80840, 0x90040550, 0x48039040, 0x59c41008, - 0x4c040000, 0x4c080000, 0x82081500, 0xffffff7f, - 0x480b8808, 0x59c40004, 0x90000503, 0x0502000e, - 0x59c40004, 0x9000050c, 0x05000004, 0x64338804, - 0x8c000504, 0x0501f022, 0x59c80040, 0x8400056e, - 0x48039040, 0x59c80040, 0x8c00052e, 0x05fe07fe, - 0x0501f01b, 0x64238803, 0x59c40003, 0x90000503, - 0x05fc07fe, 0x8c000502, 0x05020005, 0x59c40004, - 0x64338804, 0x8c000504, 0x0501f011, 0x59c80040, - 0x8400056a, 0x48039040, 0x59c80040, 0x8c00052a, - 0x05fe07fe, 0x59c40005, 0x82000500, 0xc0000000, - 0x05000007, 0x59c400a3, 0x84000540, 0x480388a3, - 0x4a038805, 0xc0000000, 0x80000580, 0x4a01a8e5, - 0x00000800, 0x5c001000, 0x5c000800, 0x480b8808, - 0x48079040, 0x1c01f000, 0x0501f805, 0x60058800, - 0x05000002, 0x60018800, 0x1c01f000, 0x5c000000, - 0x4c000000, 0x4803c857, 0x491bc857, 0x4933c857, - 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, - 0x4cd80000, 0x05fdfd1c, 0x4df00000, 0x0501fa6f, - 0x59900005, 0x800001c0, 0x05000012, 0x81300580, - 0x05020010, 0x59300004, 0x84000520, 0x48026004, - 0x05fdff4f, 0x0502000a, 0x5c03e000, 0x05fc0cfa, - 0x80000580, 0x5c01b000, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x1c01f000, 0x05fdfc3e, - 0x61267000, 0x59300004, 0x84000520, 0x48026004, - 0x8c00050c, 0x00060c78, 0x5c03e000, 0x05fc0cea, - 0x90000541, 0x5c01b000, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x1c01f000, 0x0501f805, - 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, - 0x4933c857, 0x05fdfcf0, 0x4df00000, 0x598c000b, - 0x80026540, 0x0500000f, 0x59300004, 0x84000520, - 0x48026004, 0x05fdff7f, 0x05000011, 0x05fdfc3b, - 0x604e7000, 0x59300004, 0x8c00050c, 0x00060c78, - 0x5c03e000, 0x05fc0ccc, 0x90000541, 0x1c01f000, - 0x916c1581, 0x05fc07fb, 0x916c1584, 0x05fc07f9, - 0x42001000, 0x00103d56, 0x05fdf880, 0x5c03e000, - 0x05fc0cc1, 0x80000580, 0x1c01f000, 0x4d300000, - 0x4d180000, 0x4d3c0000, 0x05fdfccf, 0x4df00000, - 0x643da8e4, 0x643f78e4, 0x0501fa08, 0x417a3000, - 0x811808c8, 0x82040c00, 0x0000b037, 0x58066005, - 0x813261c0, 0x0500000b, 0x417a7800, 0x05f1f90f, - 0x05000007, 0x59300c07, 0x90040583, 0x05000003, - 0x90040586, 0x05020002, 0x600a7800, 0x050dfcad, - 0x811a3000, 0x91180485, 0x05fc17ee, 0x61000800, - 0x05d9f888, 0x642b78e4, 0x6429a8e4, 0x5c03e000, - 0x05fc0c9d, 0x5c027800, 0x5c023000, 0x5c026000, - 0x1c01f000, 0x4803c856, 0x4d300000, 0x05fdfcaa, - 0x4df00000, 0x59c80840, 0x84040d74, 0x90040550, + 0x5c032000, 0x5c025800, 0x5c026000, 0x642378e4, + 0x05fdf6f7, 0x84000510, 0x48026004, 0x05fdf7f5, + 0x42007000, 0x00020d9f, 0x58380000, 0x90000580, + 0x0500000d, 0x58d80805, 0x8c040500, 0x0500000a, + 0x83180400, 0x00020bf0, 0x50006000, 0x58380001, + 0x80300580, 0x05000005, 0x4803c856, 0x05d1fc5c, + 0x4979b005, 0x1c01f000, 0x5830000f, 0x4803c857, + 0x6404620e, 0x4978600f, 0x49787002, 0x1c01f000, + 0x4d2c0000, 0x4d300000, 0x59bc00ea, 0x8c000510, + 0x05fc07fe, 0x59be60e0, 0x813261c0, 0x05cc0f98, + 0x59300004, 0x8c000520, 0x05000014, 0x82000500, + 0xfffefeff, 0x48026004, 0x59301407, 0x90080583, + 0x05ce0f8f, 0x0201f800, 0x0010f0f2, 0x80c40040, + 0x05ce0f8b, 0x59325809, 0x60040800, 0x600a8000, + 0x05f1fe82, 0x0001fb5b, 0x0005fc5a, 0x5c026000, + 0x5c025800, 0x1c01f000, 0x84000510, 0x48026004, + 0x05fdf7fb, 0x4d300000, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x4cd80000, 0x0501fc1d, + 0x59bc00ea, 0x8c000510, 0x05fc07fe, 0x59be60e0, + 0x59300004, 0x8c000520, 0x0500000e, 0x82000500, + 0xfffefeff, 0x48026004, 0x05fdfebd, 0x05d5facd, + 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x5c026000, 0x642378e4, 0x05fdf6a0, + 0x84000510, 0x48026004, 0x05fdf7f6, 0x4d300000, + 0x4d2c0000, 0x4d340000, 0x4da40000, 0x4cd00000, + 0x4d240000, 0x58d400ea, 0x8c000510, 0x05fc07fe, + 0x58d660e0, 0x813261c0, 0x05cc0f55, 0x59300004, + 0x8c000520, 0x0500001e, 0x82000500, 0xfffefeff, + 0x48026004, 0x5932680a, 0x42034800, 0x0010aefd, + 0x5932481d, 0x05011000, 0x4a03c840, 0x0010af04, + 0x644bc842, 0x05011000, 0x4a03c840, 0x0010af16, + 0x4a03c842, 0x000000ff, 0x05011000, 0x4a03c840, + 0x0010b015, 0x4a03c842, 0x000000ff, 0x0501fbf9, + 0x5c024800, 0x5c01a000, 0x5c034800, 0x5c026800, + 0x5c025800, 0x5c026000, 0x1c01f000, 0x84000510, + 0x48026004, 0x5c024800, 0x5c01a000, 0x5c034800, + 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x4d300000, 0x4d2c0000, 0x4d340000, 0x4cd00000, + 0x4d240000, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x4cd80000, 0x0501fbc6, 0x59bc00ea, + 0x8c000510, 0x05fc07fe, 0x59be60e0, 0x813261c0, + 0x05cc0f1b, 0x59300004, 0x8c000520, 0x05000011, + 0x82000500, 0xfffefeff, 0x48026004, 0x5932481d, + 0x0505fa4e, 0x5c01b000, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x5c024800, 0x5c01a000, + 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x84000510, 0x48026004, 0x5c01b000, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c024800, + 0x5c01a000, 0x5c026800, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x05cdfefa, 0x4d300000, 0x4d380000, + 0x42000000, 0x0010b337, 0x051dff4b, 0x05fdfe44, + 0x598e600b, 0x59c40004, 0x8c000506, 0x05000003, + 0x0501f8d6, 0x64238804, 0x813261c0, 0x05000004, + 0x0501fb8b, 0x60527000, 0x0005fc78, 0x6409a8e4, + 0x5c027000, 0x5c026000, 0x05fdf621, 0x4d180000, + 0x4d300000, 0x4d380000, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x4cd80000, 0x05fdfe2c, + 0x417a3000, 0x59c40804, 0x83180400, 0x00106653, + 0x50000000, 0x80040500, 0x05000017, 0x42000000, + 0x0010b338, 0x051dff28, 0x0501fb76, 0x59926005, + 0x0501f85d, 0x83180400, 0x00106653, 0x50000000, + 0x48038804, 0x813261c0, 0x05000007, 0x59300004, + 0x8c00050c, 0x05020002, 0x640e6203, 0x612a7000, + 0x0005fc78, 0x59c40004, 0x82000500, 0x00f80000, + 0x05000004, 0x811a3000, 0x91180485, 0x05fc17e2, + 0x6421a8e4, 0x5c01b000, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x5c027000, 0x5c026000, + 0x5c023000, 0x05fdf5ee, 0x4d2c0000, 0x4d340000, + 0x5932680a, 0x598c0800, 0x90040586, 0x05020004, + 0x918c1405, 0x918c1c04, 0x0501f00f, 0x90040584, + 0x05020004, 0x918c1403, 0x918c1c02, 0x0501f00a, + 0x90040581, 0x05020004, 0x918c1407, 0x918c1c06, + 0x0501f005, 0x90040582, 0x05020024, 0x918c1409, + 0x918c1c08, 0x41306800, 0x58340000, 0x80007d40, + 0x0500001e, 0x583c000a, 0x81340580, 0x05020006, + 0x403c6800, 0x583c0000, 0x80007d40, 0x05fe07fa, + 0x0501f016, 0x4933c857, 0x483fc857, 0x583c0000, + 0x48006800, 0x49307800, 0x443c1000, 0x500c0000, + 0x803c0580, 0x05020002, 0x44341800, 0x80000580, + 0x4803180b, 0x4803180d, 0x598c0000, 0x90000583, + 0x05000002, 0x64031800, 0x80000580, 0x5c026800, + 0x5c025800, 0x1c01f000, 0x90000541, 0x05fdf7fc, + 0x0501f805, 0x60018800, 0x05000002, 0x60058800, + 0x1c01f000, 0x491bc857, 0x59b400f6, 0x90000538, + 0x05fe07fe, 0x59c80840, 0x90040550, 0x48039040, + 0x59c41008, 0x4c040000, 0x4c080000, 0x82081500, + 0xffffff7f, 0x480b8808, 0x0501faa5, 0x05020006, + 0x0501faa9, 0x05000020, 0x48038804, 0x05d5f9fc, + 0x0501f03d, 0x64238803, 0x59c40003, 0x90000503, + 0x05fc07fe, 0x8c000502, 0x05020006, 0x0501fa9e, + 0x05000015, 0x48038804, 0x05d5f9f1, 0x0501f032, + 0x0501faa5, 0x05020007, 0x59c80040, 0x8400056a, + 0x48039040, 0x59c80040, 0x8c00052a, 0x05fe07fe, + 0x59c40005, 0x82000500, 0xc0000000, 0x05000006, + 0x59c400a3, 0x84000540, 0x480388a3, 0x4a038805, + 0xc0000000, 0x05d5f9af, 0x4a03a005, 0x30000000, + 0x59d00006, 0x4a03a005, 0x30000000, 0x6401b006, + 0x59d00005, 0x8c000504, 0x05fe07fe, 0x05fdfe81, + 0x6403a014, 0x600008ec, 0x83180540, 0x60000000, + 0x480008a1, 0x811800dc, 0x59c80840, 0x80040540, + 0x48039040, 0x82000540, 0x00003000, 0x48039040, + 0x59c80040, 0x82000500, 0x00003000, 0x05fe07fd, + 0x05d5f9b4, 0x83180400, 0x00106653, 0x50000000, + 0x48038804, 0x80000580, 0x4df00000, 0x05fdfa3e, + 0x5c03e000, 0x5c001000, 0x5c000800, 0x480b8808, + 0x48079040, 0x1c01f000, 0x4803c856, 0x59b400f6, + 0x90000538, 0x05fe07fe, 0x59c80840, 0x90040550, 0x48039040, 0x59c41008, 0x4c040000, 0x4c080000, - 0x82081500, 0xffffff7f, 0x480b8808, 0x600c1000, - 0x0501f9d3, 0x598e600b, 0x813261c0, 0x05fe0fa9, - 0x050009d6, 0x4a01a8e5, 0x00000800, 0x0501f809, - 0x5c001000, 0x5c000800, 0x480b8808, 0x48079040, - 0x5c03e000, 0x05fc0c7c, 0x5c026000, 0x1c01f000, - 0x4d380000, 0x4d180000, 0x4d300000, 0x4d900000, - 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, - 0x417a3000, 0x05fdf952, 0x811a3000, 0x91180585, - 0x05fe07fd, 0x0501f9ac, 0x0502000a, 0x5c01b000, + 0x82081500, 0xffffff7f, 0x480b8808, 0x59c40004, + 0x90000503, 0x0502000e, 0x59c40004, 0x9000050c, + 0x05000004, 0x64338804, 0x8c000504, 0x0501f022, + 0x59c80040, 0x8400056e, 0x48039040, 0x59c80040, + 0x8c00052e, 0x05fe07fe, 0x0501f01b, 0x64238803, + 0x59c40003, 0x90000503, 0x05fc07fe, 0x8c000502, + 0x05020005, 0x59c40004, 0x64338804, 0x8c000504, + 0x0501f011, 0x59c80040, 0x8400056a, 0x48039040, + 0x59c80040, 0x8c00052a, 0x05fe07fe, 0x59c40005, + 0x82000500, 0xc0000000, 0x05000007, 0x59c400a3, + 0x84000540, 0x480388a3, 0x4a038805, 0xc0000000, + 0x80000580, 0x4a01a8e5, 0x00000800, 0x5c001000, + 0x5c000800, 0x480b8808, 0x48079040, 0x1c01f000, + 0x0501f805, 0x60058800, 0x05000002, 0x60018800, + 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, + 0x491bc857, 0x4933c857, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x4cd80000, 0x05fdfd1c, + 0x4df00000, 0x0501fa6f, 0x59900005, 0x800001c0, + 0x05000012, 0x81300580, 0x05020010, 0x59300004, + 0x84000520, 0x48026004, 0x05fdff4f, 0x0502000a, + 0x5c03e000, 0x05fc0cfa, 0x80000580, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x5c026000, 0x5c023000, 0x5c027000, 0x1c01f000, - 0x0501f9ca, 0x59926005, 0x4933c857, 0x05fdfeb0, - 0x813261c0, 0x05fc07f2, 0x612a7000, 0x640e6203, - 0x0005fc78, 0x05fdf7ee, 0x4d300000, 0x4d180000, - 0x4d900000, 0x05fdfc68, 0x60001000, 0x598c0800, - 0x90040585, 0x0500099a, 0x417a3000, 0x811b20c8, - 0x83932400, 0x0000b037, 0x59900002, 0x90000581, - 0x0502000a, 0x60100800, 0x59926005, 0x59300013, - 0x82000500, 0xfff00000, 0x80000540, 0x05000002, - 0x60380800, 0x05fdf900, 0x811a3000, 0x91180485, - 0x05fc17ef, 0x59c81040, 0x84081534, 0x480b9040, - 0x05fdfc39, 0x5c032000, 0x5c023000, 0x5c026000, - 0x1c01f000, 0x4933c857, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x4cd80000, 0x4d380000, - 0x05fdfc41, 0x4df00000, 0x59300004, 0x8c00053e, - 0x05020006, 0x8c000520, 0x0500001e, 0x05fdfb54, - 0x0500001c, 0x0501f025, 0x598c000b, 0x81300580, - 0x0500000e, 0x050dfd2f, 0x05020020, 0x0501f928, - 0x0500001e, 0x48038804, 0x0501f984, 0x05d5fa3c, - 0x05fdfb65, 0x61267000, 0x59300004, 0x8c00050c, - 0x0502000b, 0x0501f00b, 0x59c40004, 0x8c000504, - 0x05000012, 0x64138804, 0x05fdfb78, 0x604e7000, - 0x59300004, 0x8c00050c, 0x05000002, 0x0005fc78, - 0x5c03e000, 0x05fc0c08, 0x5c027000, 0x5c01b000, + 0x1c01f000, 0x05fdfc3e, 0x61267000, 0x59300004, + 0x84000520, 0x48026004, 0x8c00050c, 0x00060c78, + 0x5c03e000, 0x05fc0cea, 0x90000541, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x80000580, 0x1c01f000, 0x5c03e000, 0x05fc0bfe, + 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, + 0x60018800, 0x1c01f000, 0x4933c857, 0x05fdfcf0, + 0x4df00000, 0x598c000b, 0x80026540, 0x0500000f, + 0x59300004, 0x84000520, 0x48026004, 0x05fdff7f, + 0x05000011, 0x05fdfc3b, 0x604e7000, 0x59300004, + 0x8c00050c, 0x00060c78, 0x5c03e000, 0x05fc0ccc, + 0x90000541, 0x1c01f000, 0x916c1581, 0x05fc07fb, + 0x916c1584, 0x05fc07f9, 0x42001000, 0x00103e29, + 0x05fdf880, 0x5c03e000, 0x05fc0cc1, 0x80000580, + 0x1c01f000, 0x4d300000, 0x4d180000, 0x4d3c0000, + 0x05fdfccf, 0x4df00000, 0x643da8e4, 0x643f78e4, + 0x0501fa08, 0x417a3000, 0x811808c8, 0x82040c00, + 0x0000b037, 0x58066005, 0x813261c0, 0x0500000b, + 0x417a7800, 0x05f1f827, 0x05000007, 0x59300c07, + 0x90040583, 0x05000003, 0x90040586, 0x05020002, + 0x600a7800, 0x050dfcc9, 0x811a3000, 0x91180485, + 0x05fc17ee, 0x61000800, 0x05d5fec4, 0x642b78e4, + 0x6429a8e4, 0x5c03e000, 0x05fc0c9d, 0x5c027800, + 0x5c023000, 0x5c026000, 0x1c01f000, 0x4803c856, + 0x4d300000, 0x05fdfcaa, 0x4df00000, 0x59c80840, + 0x84040d74, 0x90040550, 0x48039040, 0x59c41008, + 0x4c040000, 0x4c080000, 0x82081500, 0xffffff7f, + 0x480b8808, 0x600c1000, 0x0501f9d3, 0x598e600b, + 0x813261c0, 0x05fe0fa9, 0x050009d6, 0x4a01a8e5, + 0x00000800, 0x0501f809, 0x5c001000, 0x5c000800, + 0x480b8808, 0x48079040, 0x5c03e000, 0x05fc0c7c, + 0x5c026000, 0x1c01f000, 0x4d380000, 0x4d180000, + 0x4d300000, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x4cd80000, 0x417a3000, 0x05fdf952, + 0x811a3000, 0x91180585, 0x05fe07fd, 0x0501f9ac, + 0x0502000a, 0x5c01b000, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x5c026000, 0x5c023000, + 0x5c027000, 0x1c01f000, 0x0501f9ca, 0x59926005, + 0x4933c857, 0x05fdfeb0, 0x813261c0, 0x05fc07f2, + 0x612a7000, 0x640e6203, 0x0005fc78, 0x05fdf7ee, + 0x4d300000, 0x4d180000, 0x4d900000, 0x05fdfc68, + 0x60001000, 0x598c0800, 0x90040585, 0x0500099a, + 0x417a3000, 0x811b20c8, 0x83932400, 0x0000b037, + 0x59900002, 0x90000581, 0x0502000a, 0x60100800, + 0x59926005, 0x59300013, 0x82000500, 0xfff00000, + 0x80000540, 0x05000002, 0x60380800, 0x05fdf900, + 0x811a3000, 0x91180485, 0x05fc17ef, 0x59c81040, + 0x84081534, 0x480b9040, 0x05fdfc39, 0x5c032000, + 0x5c023000, 0x5c026000, 0x1c01f000, 0x4933c857, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x4cd80000, 0x4d380000, 0x05fdfc41, 0x4df00000, + 0x59300004, 0x8c00053e, 0x05020006, 0x8c000520, + 0x0500001e, 0x05fdfb54, 0x0500001c, 0x0501f025, + 0x598c000b, 0x81300580, 0x0500000e, 0x050dfd4b, + 0x05020020, 0x0501f928, 0x0500001e, 0x48038804, + 0x0501f984, 0x05d5f87a, 0x05fdfb65, 0x61267000, + 0x59300004, 0x8c00050c, 0x0502000b, 0x0501f00b, + 0x59c40004, 0x8c000504, 0x05000012, 0x64138804, + 0x05fdfb78, 0x604e7000, 0x59300004, 0x8c00050c, + 0x05000002, 0x0005fc78, 0x5c03e000, 0x05fc0c08, 0x5c027000, 0x5c01b000, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x90000541, 0x1c01f000, - 0x59300407, 0x90000583, 0x05020007, 0x050dff9b, - 0x05000005, 0x59301009, 0x58080409, 0x84000550, - 0x48001409, 0x1c01f000, 0x4a01a8e5, 0x00000800, - 0x05fdfbfd, 0x59c400af, 0x800001c0, 0x05020003, - 0x05fdfbe5, 0x05d9f1db, 0x598c000d, 0x90001482, - 0x05021006, 0x80000000, 0x4803180d, 0x80000580, - 0x05fdf896, 0x0500000e, 0x05fdfefe, 0x0502000c, - 0x05fdffe4, 0x42000000, 0x0010b06f, 0x051dfc02, - 0x05fdfde8, 0x05000006, 0x0501f937, 0x4d380000, - 0x60527000, 0x0005fc78, 0x5c027000, 0x05fdfbce, - 0x05d9f1c4, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x4cd80000, 0x4d300000, 0x05fdf8a8, - 0x05fdfbd9, 0x59c400af, 0x800001c0, 0x05000022, - 0x0501f92a, 0x59926005, 0x4933c857, 0x59300004, - 0x8c000516, 0x05000009, 0x05fdfea9, 0x0502001a, - 0x05fdfb05, 0x05fdfbb8, 0x42000800, 0x80000804, - 0x0005fb20, 0x0501f014, 0x60c018ea, 0x0501f8e9, - 0x05020003, 0x05fdf86f, 0x0501f00f, 0x05fdfe9c, - 0x0502000d, 0x05fdffb7, 0x42000000, 0x0010b070, - 0x051dfbd5, 0x59300004, 0x8c00050c, 0x05020002, - 0x640e6203, 0x4d380000, 0x612a7000, 0x0005fc78, - 0x5c027000, 0x05fdfba0, 0x5c026000, 0x5c01b000, + 0x5c03a000, 0x5c032000, 0x80000580, 0x1c01f000, + 0x5c03e000, 0x05fc0bfe, 0x5c027000, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x05d9f190, 0x4c600000, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x4cd80000, 0x4d300000, - 0x4d2c0000, 0x05fdfba4, 0x0501f8f8, 0x59926005, - 0x813261c0, 0x05000040, 0x05f1fe4f, 0x05020005, - 0x4178c000, 0x0505f8d4, 0x05000002, 0x6004c000, - 0x05f1fe49, 0x05020005, 0x8060c1c0, 0x05000003, - 0x0505f8f4, 0x0501f034, 0x05fdf852, 0x05020032, - 0x4933c857, 0x0501f892, 0x05020015, 0x05fdf85c, - 0x813261c0, 0x0500002c, 0x59325809, 0x812e59c0, - 0x05cc0dfb, 0x05f1fe38, 0x0502001c, 0x59c40093, - 0x4803c857, 0x800001c0, 0x05020009, 0x592c0209, - 0x84000550, 0x48025a09, 0x05f1ff2e, 0x0502001e, - 0x592c0209, 0x84000510, 0x48025a09, 0x05fdf825, - 0x0501f019, 0x42000000, 0x0010b070, 0x051dfb8e, - 0x05fdfdb3, 0x592c0209, 0x84000550, 0x48025a09, - 0x4d380000, 0x612a7000, 0x640e6203, 0x0005fc78, - 0x5c027000, 0x0501f00c, 0x59901007, 0x800811c0, - 0x05fe07f1, 0x59c408af, 0x82040480, 0x000003e8, - 0x05fe17ed, 0x80081000, 0x480b2007, 0x05fdf80d, - 0x05edf919, 0x5c025800, 0x5c026000, 0x5c01b000, - 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x5c00c000, 0x05fdf344, 0x4d300000, 0x4d2c0000, - 0x05fdfb55, 0x598e600b, 0x4933c857, 0x813261c0, - 0x0500003e, 0x59c41004, 0x480bc857, 0x8c080500, - 0x05000007, 0x05f1fdfc, 0x05020012, 0x05f1fef9, - 0x05020036, 0x05f9ffed, 0x0501f034, 0x82080500, - 0x000001fe, 0x05fe07fc, 0x59c8010b, 0x4803c857, - 0x8c000500, 0x05fc07f8, 0x42000000, 0x0010b0b9, - 0x051dfb55, 0x05fdfe4b, 0x05000878, 0x0501f027, - 0x598c000d, 0x80000540, 0x0502000e, 0x59c408af, - 0x82040480, 0x000003e8, 0x0502100a, 0x598c080d, - 0x80040800, 0x4807180d, 0x05f9ffd4, 0x42000000, - 0x0010afae, 0x051dfb44, 0x05edf8e3, 0x0501f017, - 0x42000000, 0x0010b06f, 0x051dfb3f, 0x05fdfdbd, - 0x813261c0, 0x05020003, 0x0501f860, 0x0501f00f, - 0x59300407, 0x90000583, 0x05020007, 0x59325809, - 0x812e59c0, 0x05000004, 0x592c0209, 0x84000550, - 0x48025a09, 0x0501f868, 0x4d380000, 0x60527000, - 0x0005fc78, 0x5c027000, 0x5c025800, 0x5c026000, - 0x05fdf2fd, 0x59c40804, 0x83180400, 0x00106487, + 0x90000541, 0x1c01f000, 0x59300407, 0x90000583, + 0x05020007, 0x050dffba, 0x05000005, 0x59301009, + 0x58080409, 0x84000550, 0x48001409, 0x1c01f000, + 0x4a01a8e5, 0x00000800, 0x05fdfbfd, 0x59c400af, + 0x800001c0, 0x05020003, 0x05fdfbe5, 0x05d9f017, + 0x598c000d, 0x90001482, 0x05021006, 0x80000000, + 0x4803180d, 0x80000580, 0x05fdf896, 0x0500000e, + 0x05fdfefe, 0x0502000c, 0x05fdffe4, 0x42000000, + 0x0010b2ef, 0x051dfcf0, 0x05fdfde8, 0x05000006, + 0x0501f937, 0x4d380000, 0x60527000, 0x0005fc78, + 0x5c027000, 0x05fdfbce, 0x05d9f000, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, + 0x4d300000, 0x05fdf8a8, 0x05fdfbd9, 0x59c400af, + 0x800001c0, 0x05000022, 0x0501f92a, 0x59926005, + 0x4933c857, 0x59300004, 0x8c000516, 0x05000009, + 0x05fdfea9, 0x0502001a, 0x05fdfb05, 0x05fdfbb8, + 0x42000800, 0x80000804, 0x0005fb20, 0x0501f014, + 0x60c018ea, 0x0501f8e9, 0x05020003, 0x05fdf86f, + 0x0501f00f, 0x05fdfe9c, 0x0502000d, 0x05fdffb7, + 0x42000000, 0x0010b2f0, 0x051dfcc3, 0x59300004, + 0x8c00050c, 0x05020002, 0x640e6203, 0x4d380000, + 0x612a7000, 0x0005fc78, 0x5c027000, 0x05fdfba0, + 0x5c026000, 0x5c01b000, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x05d5f7cc, 0x4c600000, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x4cd80000, 0x4d300000, 0x4d2c0000, 0x05fdfba4, + 0x0501f8f8, 0x59926005, 0x813261c0, 0x05000040, + 0x05f1fd92, 0x05020005, 0x4178c000, 0x0505f8c6, + 0x05000002, 0x6004c000, 0x05f1fd8c, 0x05020005, + 0x8060c1c0, 0x05000003, 0x0505f8e6, 0x0501f034, + 0x05fdf852, 0x05020032, 0x4933c857, 0x0501f892, + 0x05020015, 0x05fdf85c, 0x813261c0, 0x0500002c, + 0x59325809, 0x812e59c0, 0x05cc0c39, 0x05f1fd7b, + 0x0502001c, 0x59c40093, 0x4803c857, 0x800001c0, + 0x05020009, 0x592c0209, 0x84000550, 0x48025a09, + 0x05f1fe71, 0x0502001e, 0x592c0209, 0x84000510, + 0x48025a09, 0x05fdf825, 0x0501f019, 0x42000000, + 0x0010b2f0, 0x051dfc7c, 0x05fdfdb3, 0x592c0209, + 0x84000550, 0x48025a09, 0x4d380000, 0x612a7000, + 0x640e6203, 0x0005fc78, 0x5c027000, 0x0501f00c, + 0x59901007, 0x800811c0, 0x05fe07f1, 0x59c408af, + 0x82040480, 0x000003e8, 0x05fe17ed, 0x80081000, + 0x480b2007, 0x05fdf80d, 0x05edf82a, 0x5c025800, + 0x5c026000, 0x5c01b000, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x5c00c000, 0x05fdf344, + 0x4d300000, 0x4d2c0000, 0x05fdfb55, 0x598e600b, + 0x4933c857, 0x813261c0, 0x0500003e, 0x59c41004, + 0x480bc857, 0x8c080500, 0x05000007, 0x05f1fd3f, + 0x05020012, 0x05f1fe3c, 0x05020036, 0x05f9ffed, + 0x0501f034, 0x82080500, 0x000001fe, 0x05fe07fc, + 0x59c8010b, 0x4803c857, 0x8c000500, 0x05fc07f8, + 0x42000000, 0x0010b339, 0x051dfc43, 0x05fdfe4b, + 0x05000878, 0x0501f027, 0x598c000d, 0x80000540, + 0x0502000e, 0x59c408af, 0x82040480, 0x000003e8, + 0x0502100a, 0x598c080d, 0x80040800, 0x4807180d, + 0x05f9ffd4, 0x42000000, 0x0010b22e, 0x051dfc32, + 0x05e9fff4, 0x0501f017, 0x42000000, 0x0010b2ef, + 0x051dfc2d, 0x05fdfdbd, 0x813261c0, 0x05020003, + 0x0501f860, 0x0501f00f, 0x59300407, 0x90000583, + 0x05020007, 0x59325809, 0x812e59c0, 0x05000004, + 0x592c0209, 0x84000550, 0x48025a09, 0x0501f868, + 0x4d380000, 0x60527000, 0x0005fc78, 0x5c027000, + 0x5c025800, 0x5c026000, 0x05fdf2fd, 0x59c40804, + 0x83180400, 0x00106649, 0x50000000, 0x80040500, + 0x1c01f000, 0x59c40804, 0x83180400, 0x0010664e, 0x50000000, 0x80040500, 0x1c01f000, 0x59c40804, - 0x83180400, 0x0010648c, 0x50000000, 0x80040500, - 0x1c01f000, 0x59c40804, 0x83180400, 0x00106496, - 0x50000000, 0x80040500, 0x1c01f000, 0x59c80840, - 0x82040d00, 0x000e0000, 0x83180400, 0x0010649b, - 0x50000000, 0x80040580, 0x1c01f000, 0x00000210, - 0x00000420, 0x00000840, 0x00001080, 0x00002100, - 0x00004000, 0x00008000, 0x00010000, 0x00020000, - 0x00040000, 0x00080000, 0x00100000, 0x00200000, - 0x00400000, 0x00800000, 0x00084000, 0x00108000, - 0x00210000, 0x00420000, 0x00840000, 0x00000000, - 0x00020000, 0x00040000, 0x00060000, 0x00080000, - 0x59900007, 0x800c0c80, 0x05021003, 0x90000541, - 0x0501f004, 0x80000000, 0x48032007, 0x80000580, - 0x1c01f000, 0x417a3000, 0x05fdffd5, 0x05000005, - 0x811a3000, 0x91180585, 0x05fe07fc, 0x1c01f000, - 0x81780080, 0x1c01f000, 0x40681000, 0x480bc857, - 0x05fdfac9, 0x4df00000, 0x480b1800, 0x5c03e000, - 0x05fc0ab1, 0x1c01f000, 0x4803c856, 0x05fdfac2, - 0x4df00000, 0x497b180b, 0x497b1801, 0x497b180c, - 0x497b180d, 0x497b180e, 0x598c0000, 0x90000583, - 0x05000006, 0x916c0582, 0x05020003, 0x64171800, - 0x0501f002, 0x64031800, 0x5c03e000, 0x05fc0a9e, - 0x1c01f000, 0x59300004, 0x8c00050c, 0x05020002, - 0x64066203, 0x1c01f000, 0x91180485, 0x05ce1d1c, - 0x491bc857, 0x811b20c8, 0x83932400, 0x0000b037, - 0x8119b0c8, 0x82d9b400, 0x0000bf32, 0x811ba0ca, - 0x83d3a400, 0x00007600, 0x83180400, 0x001064e5, - 0x50034800, 0x811a28c2, 0x83162c00, 0x00006100, - 0x1c01f000, 0x0010ae94, 0x0010aeab, 0x0010aec2, - 0x0010aed9, 0x0010aef0, 0x4933c857, 0x59300407, - 0x90000c92, 0x05021015, 0x05011000, 0x0c01f001, - 0x00106502, 0x00106592, 0x001068dc, 0x0010693c, - 0x00106592, 0x001068dc, 0x0010693c, 0x00106502, - 0x00106592, 0x00106502, 0x00106502, 0x00106502, - 0x00106502, 0x00106502, 0x00106502, 0x00106502, - 0x00106506, 0x00106506, 0x4803c857, 0x05fdfa7a, - 0x05fdf9ce, 0x05fdf264, 0x42001000, 0x0010af8e, - 0x50081000, 0x4930100b, 0x58080002, 0x82000580, - 0x00000100, 0x05020037, 0x59325809, 0x812e59c0, - 0x05cc0cdf, 0x492fc856, 0x5932680a, 0x813669c0, - 0x0500001e, 0x592c040c, 0x82000500, 0x0000e000, - 0x05000003, 0x0501fbbc, 0x0501f002, 0x0501fbac, - 0x592c000e, 0x90000503, 0x05000006, 0x90000583, - 0x80000000, 0x58d00802, 0x80040540, 0x4801a002, - 0x42001000, 0x0010af8e, 0x50081000, 0x4930100a, - 0x492c1009, 0x90d00406, 0x48001003, 0x592c000e, - 0x48001005, 0x592c000f, 0x48001006, 0x592c0010, - 0x48001007, 0x0001f01c, 0x42026800, 0x0010cc0f, - 0x592c080b, 0x48066802, 0x82040500, 0x00ffff00, - 0x05000007, 0x497a6a12, 0x59a8100f, 0x82081500, - 0x00ffff00, 0x80080580, 0x05fe07d7, 0x82040d00, - 0x000000ff, 0x800408d0, 0x48066a12, 0x05fdf7d2, - 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x4c580000, - 0x4c540000, 0x4c500000, 0x58325809, 0x812e59c0, - 0x05cc0ca3, 0x58300002, 0x82000580, 0x00000100, - 0x0502001e, 0x5830000a, 0x5832600b, 0x81300d80, - 0x0502000e, 0x0501f82c, 0x05020012, 0x592c080e, - 0x90040c03, 0x80040904, 0x4004b000, 0x4200a000, - 0x0010ac84, 0x4050a800, 0x051dfb3d, 0x600011b8, - 0x0501fe64, 0x0501f007, 0x4803c857, 0x4933c857, - 0x813261c0, 0x05000003, 0x0501f81b, 0x05fc0f9f, - 0x5c00a000, 0x5c00a800, 0x5c00b000, 0x5c026000, - 0x5c025800, 0x1c01f000, 0x5830000a, 0x5832600b, - 0x4a006002, 0x00000100, 0x4803c857, 0x4933c857, - 0x81300d80, 0x05fe07ed, 0x0501f80b, 0x05fe07f1, - 0x4803c857, 0x0201f800, 0x0010eee3, 0x80c40040, - 0x05ce0c73, 0x640a5a07, 0x0001fb5b, 0x0501ff94, - 0x05fdf7e8, 0x05fdf9fc, 0x4df00000, 0x598c000b, - 0x81300580, 0x05020008, 0x598c0003, 0x81300580, - 0x05020005, 0x5c03e000, 0x05fc09df, 0x80000580, - 0x1c01f000, 0x4803c857, 0x5c03e000, 0x05fc09da, - 0x90000541, 0x1c01f000, 0x59300403, 0xb0000c98, - 0x05ce1c5b, 0x4803c857, 0x0c01f001, 0x001066df, - 0x001066f8, 0x0010671b, 0x0010684d, 0x00106807, - 0x0010680b, 0x00106817, 0x00106827, 0x0010681d, - 0x00106827, 0x0010686e, 0x00106827, 0x001068a9, - 0x00106827, 0x001068b4, 0x00106827, 0x0010681d, - 0x00106827, 0x001068b8, 0x001065f7, 0x001065f7, - 0x001065f7, 0x001065f7, 0x001065f7, 0x001065f7, - 0x001065f7, 0x001065f7, 0x001065f7, 0x001065f7, - 0x001065f7, 0x00106955, 0x0010696a, 0x00106972, - 0x001065f7, 0x00106989, 0x00106817, 0x001065f7, - 0x00106817, 0x00106827, 0x001065f7, 0x0010671b, - 0x0010684d, 0x001065f7, 0x001069d1, 0x00106827, - 0x001065f7, 0x001069df, 0x00106827, 0x001065f7, - 0x0010681d, 0x001066d2, 0x001065f8, 0x001065f7, - 0x001069f4, 0x00106a26, 0x00106a9e, 0x001065f7, - 0x00106aac, 0x00106815, 0x00106aa1, 0x001065f7, - 0x00106993, 0x00106ae1, 0x001065f7, 0x001065f7, - 0x001065f7, 0x001065f7, 0x0010660b, 0x0010666c, - 0x00106676, 0x001065f7, 0x001065f7, 0x001065f7, - 0x001066a8, 0x001066b0, 0x001065f7, 0x001065f7, - 0x0010661c, 0x00106646, 0x00106b11, 0x00106b46, - 0x00106b67, 0x001065f7, 0x001065f7, 0x001065f7, - 0x00106b3c, 0x00106ac3, 0x001069f4, 0x001065f7, - 0x001065f7, 0x001065f7, 0x001065f7, 0x001065f7, - 0x001065f7, 0x001065f7, 0x001065f7, 0x05cdfbf8, - 0x0501facf, 0x59325809, 0x592c000a, 0x4801a006, - 0x592c000b, 0x4801a007, 0x592c000c, 0x4801a008, - 0x592c000d, 0x4801a009, 0x592c000e, 0x4801a00a, - 0x4979a00b, 0x592c080a, 0x82040d00, 0x00000fff, - 0x80040904, 0x600011b8, 0x0501f5ba, 0x4a026202, - 0x0000ffff, 0x0501faba, 0x4d2c0000, 0x4a01a006, - 0x05000000, 0x59325809, 0x592c000a, 0x4801a007, - 0x592c000b, 0x4801a008, 0x592c000c, 0x4801a009, - 0x5c025800, 0x60100800, 0x600011b8, 0x0501f5a9, - 0x4c580000, 0x4c500000, 0x4c540000, 0x4d2c0000, - 0x0501faa7, 0x5930040c, 0x90000503, 0x05000006, - 0x90000583, 0x80000000, 0x58d00802, 0x80040540, - 0x4801a002, 0x59325809, 0x4200a800, 0x0010ac84, - 0x592cb206, 0x9058b403, 0x8058b104, 0x912ca407, - 0x051dfa30, 0x40580000, 0x8054ac00, 0x592c0001, - 0x80000540, 0x05000003, 0x40025800, 0x05fdf7f5, - 0x4200a000, 0x0010ac84, 0x4050a800, 0x5930b40c, - 0x9058b403, 0x8058b104, 0x40580800, 0x051dfa5c, - 0x600011b8, 0x5c025800, 0x5c00a800, 0x5c00a000, - 0x5c00b000, 0x0501f57f, 0x4c580000, 0x4c500000, - 0x4c540000, 0x4d2c0000, 0x42034800, 0x0010ac7d, - 0x0501fa89, 0x59325809, 0x592c0802, 0x4807c857, - 0x40041000, 0x80040904, 0x90081503, 0x05000007, - 0x80040800, 0x90081583, 0x80081000, 0x58d00002, - 0x80080540, 0x4801a002, 0x4a025806, 0x02000000, - 0x90d0ac06, 0x592cb011, 0x912ca406, 0x051dfa01, - 0x40580000, 0x8054ac00, 0x592e5801, 0x41780000, - 0x812e5d40, 0x05fe07f8, 0x600011b8, 0x5c025800, - 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x0501f559, - 0x0501fa5b, 0x4a01a006, 0x78000000, 0x5930001e, - 0x840001c0, 0x4801a407, 0x4979a207, 0x60080800, - 0x600011b8, 0x0501f54f, 0x4c580000, 0x4c540000, - 0x4c500000, 0x0501fa5c, 0x4a01a006, 0x02000000, - 0x5932481d, 0x59240001, 0x4801a008, 0x59240002, - 0x4801a009, 0x59240003, 0x4801a00a, 0x59240004, - 0x4801a00b, 0x5930001e, 0x82000d80, 0x0000e000, - 0x0500000e, 0x82000d80, 0x0000df00, 0x05000004, - 0x6441a407, 0x60180800, 0x0501f015, 0x42001800, - 0x0010ac60, 0x05cdfe86, 0x600001be, 0x4200a000, - 0x0010ac60, 0x0501f007, 0x42001800, 0x0010ac6d, - 0x05cdfe7f, 0x600001c0, 0x4200a000, 0x0010ac6d, - 0x90000550, 0x4801a407, 0x64d1a207, 0x6034b000, - 0x90d0ac0c, 0x051df9bf, 0x604c0800, 0x600011b8, - 0x5c00a000, 0x5c00a800, 0x5c00b000, 0x0501f51d, - 0x0501fa1f, 0x4a01a006, 0x63000028, 0x5930001e, - 0x4801a007, 0x60080800, 0x600011b8, 0x0501f515, - 0x0501fa25, 0x41780000, 0x41780800, 0x42002000, - 0x00080000, 0x0c01f80e, 0x80000000, 0x80040800, - 0x60301000, 0x82080540, 0x02000000, 0x4801a006, - 0x800408e0, 0x5930001e, 0x80040540, 0x4801a007, - 0x80080904, 0x600011b8, 0x0501f502, 0x001066c8, - 0x001066ca, 0x001066cc, 0x001066ce, 0x001066d0, - 0x4811a008, 0x1c01f000, 0x4811a009, 0x1c01f000, - 0x4811a00a, 0x1c01f000, 0x4811a00b, 0x1c01f000, - 0x4811a00c, 0x1c01f000, 0x4a02600a, 0x0010cc0f, - 0x59a8000f, 0x82000500, 0x000000ff, 0x800000d0, - 0x42026800, 0x0010cc0f, 0x48026a12, 0x0501fa51, - 0x41780800, 0x600010b8, 0x0501f4e6, 0x0501f9e8, - 0x4a01a006, 0x52000000, 0x4979a007, 0x5932481d, - 0x59240400, 0x90000503, 0x05000005, 0x59240400, - 0x80000110, 0x05d5ff3e, 0x4805a007, 0x59240001, - 0x4801a008, 0x59240002, 0x4801a009, 0x59240003, - 0x4801a00a, 0x59240004, 0x4801a00b, 0x59240005, - 0x4801a00c, 0x601c0800, 0x600011b8, 0x0501f4cd, - 0x4a026202, 0x0000ffff, 0x4d340000, 0x813669c0, - 0x05020011, 0x42026800, 0x0010cc0f, 0x4936600a, - 0x4a026c03, 0x0000ffff, 0x497a6a00, 0x5930002a, - 0x48026802, 0x497a602a, 0x497a6a12, 0x82000d00, - 0x00ffff00, 0x05020004, 0x800000d0, 0x48026a12, - 0x0501f001, 0x0501f9ba, 0x5c026800, 0x4a01a006, - 0x05000000, 0x5932481d, 0x59240005, 0x4801a007, - 0x59240001, 0x59240802, 0x4801a008, 0x4805a009, - 0x60100800, 0x600011b8, 0x0501f4aa, 0x4a026202, - 0x0000ffff, 0x0501f9aa, 0x4d3c0000, 0x417a7800, - 0x05edfcef, 0x5c027800, 0x4a01a006, 0x03000000, - 0x59340403, 0x82000580, 0x000007fe, 0x0502007f, - 0x4a01a006, 0x04000000, 0x81a40800, 0x4a000800, - 0x22fffffe, 0x5934000a, 0x84000500, 0x4802680a, - 0x59a8021b, 0x8c000508, 0x05000010, 0x59a8001f, - 0x4801a007, 0x59a80020, 0x82000500, 0x07deffff, - 0x599c0818, 0x8c040516, 0x05000002, 0x8400056a, - 0x4801a008, 0x4a01a009, 0x00002710, 0x59a80022, - 0x4801a00a, 0x0501f03a, 0x59a8001f, 0x59a8121b, - 0x8c080506, 0x05000003, 0x82000500, 0xffff0000, - 0x4801a007, 0x05f1fae4, 0x0502000b, 0x59300c03, - 0xb0041591, 0x05000008, 0x497b8880, 0x82000500, - 0x0000ffff, 0x4c000000, 0x05d5ff00, 0x5c000000, - 0x48038880, 0x59a80020, 0x05f1fad7, 0x05020006, - 0x82000500, 0xb7ffffff, 0x82000540, 0x80000000, - 0x0501f003, 0x82000500, 0x3fffffff, 0x599c0818, - 0x8c040516, 0x05000002, 0x8400056a, 0x8d0c0510, - 0x05000014, 0x59300c03, 0xb0041591, 0x05000011, - 0x900415b1, 0x0500000f, 0x4c580000, 0x4c500000, - 0x4c540000, 0x6010b000, 0x4200a000, 0x0010b10b, - 0x90d0ac1f, 0x4c000000, 0x051df8ee, 0x5c000000, - 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x8400057a, - 0x4801a008, 0x4979a009, 0x4979a00a, 0x59240001, - 0x59240802, 0x4801a00b, 0x4805a00c, 0x59240003, - 0x59240804, 0x4801a00d, 0x4805a00e, 0x4979a00f, - 0x4979a010, 0x4979a011, 0x4979a012, 0x599c0018, - 0x8c000510, 0x05000011, 0x59a80006, 0x8c00050a, - 0x05000004, 0x59a8021b, 0x8c000508, 0x0502000b, - 0x59a80023, 0x84000576, 0x4801a013, 0x59a80024, - 0x4801a014, 0x59a80025, 0x4801a015, 0x59a80026, - 0x4801a016, 0x0501f005, 0x4979a013, 0x4979a014, - 0x4979a015, 0x4979a016, 0x59a80027, 0x84000576, - 0x4801a017, 0x59a80028, 0x4801a018, 0x4979a019, - 0x4979a01a, 0x0501f05f, 0x59a8021b, 0x8c000508, - 0x0500000c, 0x59a8001f, 0x82000500, 0x0000ffff, - 0x59c40880, 0x80040d80, 0x05000006, 0x497b8880, - 0x4c000000, 0x05d5fea1, 0x5c000000, 0x48038880, - 0x59a8001f, 0x4801a007, 0x4c640000, 0x4d2c0000, - 0x59a8c820, 0x050dfb59, 0x0500000d, 0x0511f9dd, - 0x0502000b, 0x592c0208, 0x8c00050e, 0x05000008, - 0x8264cd00, 0x0000ffff, 0x592c000a, 0x82000500, - 0xffff0000, 0x8064cd40, 0x0501f005, 0x59a80a1b, - 0x90040d30, 0x05000002, 0x8464cd36, 0x4865a008, - 0x5c025800, 0x5c00c800, 0x59a80021, 0x4801a009, - 0x59a80022, 0x4801a00a, 0x59240001, 0x59240802, + 0x83180400, 0x00106658, 0x50000000, 0x80040500, + 0x1c01f000, 0x59c80840, 0x82040d00, 0x000e0000, + 0x83180400, 0x0010665d, 0x50000000, 0x80040580, + 0x1c01f000, 0x00000210, 0x00000420, 0x00000840, + 0x00001080, 0x00002100, 0x00004000, 0x00008000, + 0x00010000, 0x00020000, 0x00040000, 0x00080000, + 0x00100000, 0x00200000, 0x00400000, 0x00800000, + 0x00084000, 0x00108000, 0x00210000, 0x00420000, + 0x00840000, 0x00000000, 0x00020000, 0x00040000, + 0x00060000, 0x00080000, 0x59900007, 0x800c0c80, + 0x05021003, 0x90000541, 0x0501f004, 0x80000000, + 0x48032007, 0x80000580, 0x1c01f000, 0x417a3000, + 0x05fdffd5, 0x05000005, 0x811a3000, 0x91180585, + 0x05fe07fc, 0x1c01f000, 0x81780080, 0x1c01f000, + 0x40681000, 0x480bc857, 0x05fdfac9, 0x4df00000, + 0x480b1800, 0x5c03e000, 0x05fc0ab1, 0x1c01f000, + 0x4803c856, 0x05fdfac2, 0x4df00000, 0x497b180b, + 0x497b1801, 0x497b180c, 0x497b180d, 0x497b180e, + 0x598c0000, 0x90000583, 0x05000006, 0x916c0582, + 0x05020003, 0x64171800, 0x0501f002, 0x64031800, + 0x5c03e000, 0x05fc0a9e, 0x1c01f000, 0x59300004, + 0x8c00050c, 0x05020002, 0x64066203, 0x1c01f000, + 0x91180485, 0x05ce1b5a, 0x491bc857, 0x811b20c8, + 0x83932400, 0x0000b037, 0x8119b0c8, 0x82d9b400, + 0x0000bf32, 0x811ba0ca, 0x83d3a400, 0x00007600, + 0x83180400, 0x001066a7, 0x50034800, 0x811a28c2, + 0x83162c00, 0x00006100, 0x1c01f000, 0x0010b114, + 0x0010b12b, 0x0010b142, 0x0010b159, 0x0010b170, + 0x4933c857, 0x59300407, 0x90000c92, 0x05021015, + 0x05011000, 0x0c01f001, 0x001066c4, 0x00106753, + 0x00106a90, 0x00106af0, 0x00106753, 0x00106a90, + 0x00106af0, 0x001066c4, 0x00106753, 0x001066c4, + 0x001066c4, 0x001066c4, 0x001066c4, 0x001066c4, + 0x001066c4, 0x001066c4, 0x001066c8, 0x001066c8, + 0x4803c857, 0x05fdfa7a, 0x05fdf9ce, 0x05fdf264, + 0x42001000, 0x0010b20e, 0x50081000, 0x4930100b, + 0x58080002, 0x82000580, 0x00000100, 0x05020036, + 0x59325809, 0x812e59c0, 0x05cc0b1d, 0x492fc856, + 0x5932680a, 0x83340580, 0x0010ce8f, 0x0500001e, + 0x592c040c, 0x82000500, 0x0000e000, 0x05000003, + 0x0501fbad, 0x0501f002, 0x0501fb9d, 0x592c000e, + 0x90000503, 0x05000006, 0x90000583, 0x80000000, + 0x58d00802, 0x80040540, 0x4801a002, 0x42001000, + 0x0010b20e, 0x50081000, 0x4930100a, 0x492c1009, + 0x90d00406, 0x48001003, 0x592c000e, 0x48001005, + 0x592c000f, 0x48001006, 0x592c0010, 0x48001007, + 0x0001f01c, 0x592c080b, 0x48066802, 0x82040500, + 0x00ffff00, 0x05000007, 0x497a6a12, 0x59a8100f, + 0x82081500, 0x00ffff00, 0x80080580, 0x05fe07d9, + 0x82040d00, 0x000000ff, 0x800408d0, 0x48066a12, + 0x05fdf7d4, 0x1c01f000, 0x4d2c0000, 0x4d300000, + 0x4c580000, 0x4c540000, 0x4c500000, 0x58325809, + 0x812e59c0, 0x05cc0ae2, 0x58300002, 0x82000580, + 0x00000100, 0x0502001e, 0x5830000a, 0x5832600b, + 0x81300d80, 0x0502000e, 0x0501f82c, 0x05020012, + 0x592c080e, 0x90040c03, 0x80040904, 0x4004b000, + 0x4200a000, 0x0010af04, 0x4050a800, 0x051dfc2c, + 0x600011b8, 0x0501fe57, 0x0501f007, 0x4803c857, + 0x4933c857, 0x813261c0, 0x05000003, 0x0501f81b, + 0x05fc0fa0, 0x5c00a000, 0x5c00a800, 0x5c00b000, + 0x5c026000, 0x5c025800, 0x1c01f000, 0x5830000a, + 0x5832600b, 0x4a006002, 0x00000100, 0x4803c857, + 0x4933c857, 0x81300d80, 0x05fe07ed, 0x0501f80b, + 0x05fe07f1, 0x4803c857, 0x0201f800, 0x0010f0f2, + 0x80c40040, 0x05ce0ab2, 0x640a5a07, 0x0001fb5b, + 0x0501ff87, 0x05fdf7e8, 0x05fdf9fd, 0x4df00000, + 0x598c000b, 0x81300580, 0x05020008, 0x598c0003, + 0x81300580, 0x05020005, 0x5c03e000, 0x05fc09e0, + 0x80000580, 0x1c01f000, 0x4803c857, 0x5c03e000, + 0x05fc09db, 0x90000541, 0x1c01f000, 0x59300403, + 0xb0000c98, 0x05ce1a9a, 0x83340d80, 0x0010ce8f, + 0x0502000a, 0x5930082a, 0x48066802, 0x82041500, + 0x00ffff00, 0x05020004, 0x800408d0, 0x48066a12, + 0x0501f002, 0x497a6a12, 0x4803c857, 0x0c01f001, + 0x001068ac, 0x001068c5, 0x001068d4, 0x001069f9, + 0x001069c6, 0x001069ca, 0x001069d6, 0x001069e6, + 0x001069dc, 0x001069e6, 0x00106a1e, 0x001069e6, + 0x00106a5d, 0x001069e6, 0x00106a68, 0x001069e6, + 0x001069dc, 0x001069e6, 0x00106a6c, 0x001067c4, + 0x001067c4, 0x001067c4, 0x001067c4, 0x001067c4, + 0x001067c4, 0x001067c4, 0x001067c4, 0x001067c4, + 0x001067c4, 0x001067c4, 0x00106b09, 0x00106b1e, + 0x00106b26, 0x001067c4, 0x00106b3d, 0x001069d6, + 0x001067c4, 0x001069d6, 0x001069e6, 0x001067c4, + 0x001068d4, 0x001069f9, 0x001067c4, 0x00106b85, + 0x001069e6, 0x001067c4, 0x00106b93, 0x001069e6, + 0x001067c4, 0x001069dc, 0x0010689f, 0x001067c5, + 0x001067c4, 0x00106ba8, 0x00106bda, 0x00106c52, + 0x001067c4, 0x00106c60, 0x001069d4, 0x00106c55, + 0x001067c4, 0x00106b47, 0x00106c95, 0x001067c4, + 0x001067c4, 0x001067c4, 0x001067c4, 0x001067d8, + 0x00106839, 0x00106843, 0x001067c4, 0x001067c4, + 0x001067c4, 0x00106875, 0x0010687d, 0x001067c4, + 0x001067c4, 0x001067e9, 0x00106813, 0x00106cc5, + 0x00106cfa, 0x00106d1b, 0x001067c4, 0x001067c4, + 0x001067c4, 0x00106cf0, 0x00106c77, 0x00106ba8, + 0x001067c4, 0x001067c4, 0x001067c4, 0x001067c4, + 0x001067c4, 0x001067c4, 0x001067c4, 0x001067c4, + 0x05cdfa2b, 0x0501fab6, 0x59325809, 0x592c000a, + 0x4801a006, 0x592c000b, 0x4801a007, 0x592c000c, + 0x4801a008, 0x592c000d, 0x4801a009, 0x592c000e, + 0x4801a00a, 0x4979a00b, 0x592c080a, 0x82040d00, + 0x00000fff, 0x80040904, 0x600011b8, 0x0501f5a1, + 0x4a026202, 0x0000ffff, 0x0501faa1, 0x4d2c0000, + 0x4a01a006, 0x05000000, 0x59325809, 0x592c000a, + 0x4801a007, 0x592c000b, 0x4801a008, 0x592c000c, + 0x4801a009, 0x5c025800, 0x60100800, 0x600011b8, + 0x0501f590, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4d2c0000, 0x0501fa8e, 0x5930040c, 0x90000503, + 0x05000006, 0x90000583, 0x80000000, 0x58d00802, + 0x80040540, 0x4801a002, 0x59325809, 0x4200a800, + 0x0010af04, 0x592cb206, 0x9058b403, 0x8058b104, + 0x912ca407, 0x051dfb13, 0x40580000, 0x8054ac00, + 0x592c0001, 0x80000540, 0x05000003, 0x40025800, + 0x05fdf7f5, 0x4200a000, 0x0010af04, 0x4050a800, + 0x5930b40c, 0x9058b403, 0x8058b104, 0x40580800, + 0x051dfb3f, 0x600011b8, 0x5c025800, 0x5c00a800, + 0x5c00a000, 0x5c00b000, 0x0501f566, 0x4c580000, + 0x4c500000, 0x4c540000, 0x4d2c0000, 0x42034800, + 0x0010aefd, 0x0501fa70, 0x59325809, 0x592c0802, + 0x4807c857, 0x40041000, 0x80040904, 0x90081503, + 0x05000007, 0x80040800, 0x90081583, 0x80081000, + 0x58d00002, 0x80080540, 0x4801a002, 0x4a025806, + 0x02000000, 0x90d0ac06, 0x592cb011, 0x912ca406, + 0x051dfae4, 0x40580000, 0x8054ac00, 0x592e5801, + 0x41780000, 0x812e5d40, 0x05fe07f8, 0x600011b8, + 0x5c025800, 0x5c00a800, 0x5c00a000, 0x5c00b000, + 0x0501f540, 0x0501fa42, 0x4a01a006, 0x78000000, + 0x5930001e, 0x840001c0, 0x4801a407, 0x4979a207, + 0x60080800, 0x600011b8, 0x0501f536, 0x4c580000, + 0x4c540000, 0x4c500000, 0x0501fa43, 0x4a01a006, + 0x02000000, 0x5932481d, 0x59240001, 0x4801a008, + 0x59240002, 0x4801a009, 0x59240003, 0x4801a00a, + 0x59240004, 0x4801a00b, 0x5930001e, 0x82000d80, + 0x0000e000, 0x0500000e, 0x82000d80, 0x0000df00, + 0x05000004, 0x6441a407, 0x60180800, 0x0501f015, + 0x42001800, 0x0010aee0, 0x05cdfcb9, 0x600001be, + 0x4200a000, 0x0010aee0, 0x0501f007, 0x42001800, + 0x0010aeed, 0x05cdfcb2, 0x600001c0, 0x4200a000, + 0x0010aeed, 0x90000550, 0x4801a407, 0x64d1a207, + 0x6034b000, 0x90d0ac0c, 0x051dfaa2, 0x604c0800, + 0x600011b8, 0x5c00a000, 0x5c00a800, 0x5c00b000, + 0x0501f504, 0x0501fa06, 0x4a01a006, 0x63000028, + 0x5930001e, 0x4801a007, 0x60080800, 0x600011b8, + 0x0501f4fc, 0x0501fa0c, 0x41780000, 0x41780800, + 0x42002000, 0x00080000, 0x0c01f80e, 0x80000000, + 0x80040800, 0x60301000, 0x82080540, 0x02000000, + 0x4801a006, 0x800408e0, 0x5930001e, 0x80040540, + 0x4801a007, 0x80080904, 0x600011b8, 0x0501f4e9, + 0x00106895, 0x00106897, 0x00106899, 0x0010689b, + 0x0010689d, 0x4811a008, 0x1c01f000, 0x4811a009, + 0x1c01f000, 0x4811a00a, 0x1c01f000, 0x4811a00b, + 0x1c01f000, 0x4811a00c, 0x1c01f000, 0x4a02600a, + 0x0010ce8f, 0x59a8000f, 0x82000500, 0x000000ff, + 0x800000d0, 0x42026800, 0x0010ce8f, 0x48026a12, + 0x0501fa38, 0x41780800, 0x600010b8, 0x0501f4cd, + 0x0501f9cf, 0x4a01a006, 0x52000000, 0x4979a007, + 0x5932481d, 0x59240400, 0x90000503, 0x05000005, + 0x59240400, 0x80000110, 0x05d5fd6f, 0x4805a007, + 0x59240001, 0x4801a008, 0x59240002, 0x4801a009, + 0x59240003, 0x4801a00a, 0x59240004, 0x4801a00b, + 0x59240005, 0x4801a00c, 0x601c0800, 0x600011b8, + 0x0501f4b4, 0x4a026202, 0x0000ffff, 0x0501f9b4, + 0x4a01a006, 0x05000000, 0x5932481d, 0x59240005, + 0x4801a007, 0x59240001, 0x59240802, 0x4801a008, + 0x4805a009, 0x60100800, 0x600011b8, 0x0501f4a5, + 0x4a026202, 0x0000ffff, 0x0501f9a5, 0x4d3c0000, + 0x417a7800, 0x05edfc10, 0x5c027800, 0x4a01a006, + 0x03000000, 0x59340403, 0x82000580, 0x000007fe, + 0x05020085, 0x4a01a006, 0x04000000, 0x59a8021b, + 0x8c000506, 0x05000004, 0x5930081d, 0x58040408, + 0x4801a001, 0x81a40800, 0x4a000800, 0x22fffffe, + 0x5934000a, 0x84000500, 0x4802680a, 0x59a8021b, + 0x8c000508, 0x05000010, 0x59a8001f, 0x4801a007, + 0x59a80020, 0x82000500, 0x07deffff, 0x599c0818, + 0x8c040516, 0x05000002, 0x8400056a, 0x4801a008, + 0x4a01a009, 0x00002710, 0x59a80022, 0x4801a00a, + 0x0501f03a, 0x59a8001f, 0x59a8121b, 0x8c080506, + 0x05000003, 0x82000500, 0xffff0000, 0x4801a007, + 0x05f1fa2a, 0x0502000b, 0x59300c03, 0xb0041591, + 0x05000008, 0x497b8880, 0x82000500, 0x0000ffff, + 0x4c000000, 0x05d5fd42, 0x5c000000, 0x48038880, + 0x59a80020, 0x05f1fa1d, 0x05020006, 0x82000500, + 0xb7ffffff, 0x82000540, 0x80000000, 0x0501f003, + 0x82000500, 0x3fffffff, 0x599c0818, 0x8c040516, + 0x05000002, 0x8400056a, 0x8d0c0510, 0x05000014, + 0x59300c03, 0xb0041591, 0x05000011, 0x900415b1, + 0x0500000f, 0x4c580000, 0x4c500000, 0x4c540000, + 0x6010b000, 0x4200a000, 0x0010b38b, 0x90d0ac1f, + 0x4c000000, 0x051df9df, 0x5c000000, 0x5c00a800, + 0x5c00a000, 0x5c00b000, 0x8400057a, 0x4801a008, + 0x4979a009, 0x4979a00a, 0x59240001, 0x59240802, 0x4801a00b, 0x4805a00c, 0x59240003, 0x59240804, 0x4801a00d, 0x4805a00e, 0x4979a00f, 0x4979a010, - 0x4979a011, 0x4979a012, 0x59340200, 0x8c000508, - 0x05000005, 0x59a80023, 0x8400057e, 0x48035023, - 0x0501f00b, 0x599c0018, 0x8c000510, 0x05000011, - 0x59a80006, 0x8c00050a, 0x05000005, 0x59340c03, - 0x82040480, 0x000007f0, 0x0500100a, 0x59a80023, - 0x4801a013, 0x59a80024, 0x4801a014, 0x59a80025, - 0x4801a015, 0x59a80026, 0x4801a016, 0x0501f005, - 0x4979a013, 0x4979a014, 0x4979a015, 0x4979a016, - 0x59a80027, 0x4801a017, 0x59a80028, 0x4801a018, - 0x59a80029, 0x4801a019, 0x59a8002a, 0x4801a01a, - 0x60740800, 0x600011b8, 0x0501f3be, 0x0501f8c0, - 0x4a01a006, 0x50000000, 0x05fdf79c, 0x0501f8bc, - 0x4a01a006, 0x21100014, 0x4979a007, 0x4979a008, - 0x4979a009, 0x4979a00a, 0x60140800, 0x600011b8, - 0x0501f3b0, 0x0501f8b9, 0x0501f002, 0x0501f8be, - 0x4a01a006, 0x02000000, 0x60040800, 0x600011b8, - 0x0501f3a8, 0x0501f8b8, 0x4a01a006, 0x02000000, - 0x59300403, 0x900005b1, 0x05fe0784, 0x81a40800, - 0x4a000801, 0x00fffffe, 0x05fdf70a, 0x4d340000, - 0x813669c0, 0x05020010, 0x42026800, 0x0010cc0f, - 0x4936600a, 0x4a026c03, 0x0000ffff, 0x497a6a00, - 0x5930002a, 0x48026802, 0x497a602a, 0x497a6a12, - 0x82000d00, 0x00ffff00, 0x05020003, 0x800000d0, - 0x48026a12, 0x0501f89c, 0x5c026800, 0x4a01a006, + 0x4979a011, 0x4979a012, 0x599c0018, 0x8c000510, + 0x05000011, 0x59a80006, 0x8c00050a, 0x05000004, + 0x59a8021b, 0x8c000508, 0x0502000b, 0x59a80023, + 0x84000576, 0x4801a013, 0x59a80024, 0x4801a014, + 0x59a80025, 0x4801a015, 0x59a80026, 0x4801a016, + 0x0501f005, 0x4979a013, 0x4979a014, 0x4979a015, + 0x4979a016, 0x59a80027, 0x84000576, 0x4801a017, + 0x59a80028, 0x4801a018, 0x4979a019, 0x4979a01a, + 0x0501f05f, 0x59a8021b, 0x8c000508, 0x0500000c, + 0x59a8001f, 0x82000500, 0x0000ffff, 0x59c40880, + 0x80040d80, 0x05000006, 0x497b8880, 0x4c000000, + 0x05d5fce3, 0x5c000000, 0x48038880, 0x59a8001f, + 0x4801a007, 0x4c640000, 0x4d2c0000, 0x59a8c820, + 0x050dfb7b, 0x0500000d, 0x0511fa04, 0x0502000b, + 0x592c0208, 0x8c00050e, 0x05000008, 0x8264cd00, + 0x0000ffff, 0x592c000a, 0x82000500, 0xffff0000, + 0x8064cd40, 0x0501f005, 0x59a80a1b, 0x90040d30, + 0x05000002, 0x8464cd36, 0x4865a008, 0x5c025800, + 0x5c00c800, 0x59a80021, 0x4801a009, 0x59a80022, + 0x4801a00a, 0x59240001, 0x59240802, 0x4801a00b, + 0x4805a00c, 0x59240003, 0x59240804, 0x4801a00d, + 0x4805a00e, 0x4979a00f, 0x4979a010, 0x4979a011, + 0x4979a012, 0x59340200, 0x8c000508, 0x05000005, + 0x59a80023, 0x8400057e, 0x48035023, 0x0501f00b, + 0x599c0018, 0x8c000510, 0x05000011, 0x59a80006, + 0x8c00050a, 0x05000005, 0x59340c03, 0x82040480, + 0x000007f0, 0x0500100a, 0x59a80023, 0x4801a013, + 0x59a80024, 0x4801a014, 0x59a80025, 0x4801a015, + 0x59a80026, 0x4801a016, 0x0501f005, 0x4979a013, + 0x4979a014, 0x4979a015, 0x4979a016, 0x59a80027, + 0x4801a017, 0x59a80028, 0x4801a018, 0x59a80029, + 0x4801a019, 0x59a8002a, 0x4801a01a, 0x60740800, + 0x600011b8, 0x0501f3b3, 0x0501f8b5, 0x4a01a006, + 0x50000000, 0x05fdf79c, 0x0501f8b1, 0x4a01a006, + 0x21100014, 0x4979a007, 0x4979a008, 0x4979a009, + 0x4979a00a, 0x60140800, 0x600011b8, 0x0501f3a5, + 0x0501f8ae, 0x0501f002, 0x0501f8b3, 0x4a01a006, + 0x02000000, 0x60040800, 0x600011b8, 0x0501f39d, + 0x0501f8ad, 0x4a01a006, 0x02000000, 0x59300403, + 0x900005b1, 0x05fe0784, 0x81a40800, 0x4a000801, + 0x00fffffe, 0x05fdf70a, 0x0501f8a3, 0x4a01a006, 0x01000000, 0x5930041c, 0x80000540, 0x05000003, 0x4801a407, 0x0501f002, 0x640da407, 0x5930021c, 0x80000540, 0x05000003, 0x4801a207, 0x0501f003, 0x4a01a207, 0x00002a00, 0x60080800, 0x600011b8, - 0x0501f378, 0x4a026202, 0x0000ffff, 0x0501f878, + 0x0501f380, 0x4a026202, 0x0000ffff, 0x0501f880, 0x4a01a406, 0x00002010, 0x6451a206, 0x4a01a407, 0x00000800, 0x4a01a207, 0x00002000, 0x60000008, + 0x59a80807, 0x8c04050c, 0x05000002, 0x80000580, 0x5932481d, 0x59240c00, 0x8c040508, 0x05000004, 0x90000560, 0x8c04050a, 0x05020002, 0x90000550, 0x90000542, 0x5934080a, 0x8c040514, 0x05000005, 0x82040d00, 0x00000380, 0x80040540, 0x0501f006, 0x599c0818, 0x8c040518, 0x05000003, 0x82000540, - 0x00000380, 0x0501f038, 0x0501f867, 0x4a01a406, + 0x00000380, 0x0501f03c, 0x0501f86b, 0x4a01a406, 0x00000210, 0x6451a206, 0x4a01a407, 0x00000800, 0x5934000a, 0x8c000516, 0x05000013, 0x59340c05, 0x90040530, 0x05000013, 0x59340a05, 0x82040500, @@ -19465,7 +19627,8 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4a01a207, 0x00002100, 0x0501f00c, 0x4a01a207, 0x00000100, 0x0501f009, 0x4a01a207, 0x00000400, 0x0501f006, 0x4a01a207, 0x00000700, 0x0501f003, - 0x4a01a207, 0x00000800, 0x60000008, 0x5932481d, + 0x4a01a207, 0x00000800, 0x60000008, 0x59a80807, + 0x8c04050c, 0x05000002, 0x80000580, 0x5932481d, 0x59240c00, 0x8c040508, 0x05000004, 0x90000560, 0x8c04050a, 0x05020002, 0x90000550, 0x90000542, 0x59340a00, 0x8c04050e, 0x0500000b, 0x84000550, @@ -19475,7 +19638,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x0501f31c, 0x0501f82c, 0x4a01a006, 0x02100014, 0x4a01a007, 0x00000100, 0x4979a008, 0x4979a009, 0x4979a00a, 0x60140800, 0x600011b8, 0x0501f311, - 0x0501f821, 0x4a01a006, 0x02000000, 0x05fdf62b, + 0x0501f821, 0x4a01a006, 0x02000000, 0x05fdf644, 0x4933c857, 0x0501f81c, 0x4a01a006, 0x01000000, 0x642da407, 0x60080800, 0x600011b8, 0x0501f305, 0x42005000, 0x32000000, 0x42006000, 0x08290000, @@ -19485,23 +19648,23 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x42006000, 0x08980000, 0x41786800, 0x41787800, 0x0501f2bb, 0x42005000, 0x23000000, 0x42006000, 0x01980000, 0x41786800, 0x41787800, 0x0501f2b4, - 0x59300403, 0x82000c80, 0x00000085, 0x05cc1910, - 0x82000c80, 0x00000093, 0x05ce190d, 0x82000480, - 0x00000085, 0x0c01f001, 0x001068f5, 0x001068f4, - 0x001068f4, 0x001068f4, 0x001068f4, 0x001068f4, - 0x001068f5, 0x001068f4, 0x001068f4, 0x001068f4, - 0x001068f4, 0x001068f4, 0x001068f4, 0x001068fc, - 0x05cdf8fb, 0x4933c857, 0x42034800, 0x0010ac7d, + 0x59300403, 0x82000c80, 0x00000085, 0x05c81f5c, + 0x82000c80, 0x00000093, 0x05ca1f59, 0x82000480, + 0x00000085, 0x0c01f001, 0x00106aa9, 0x00106aa8, + 0x00106aa8, 0x00106aa8, 0x00106aa8, 0x00106aa8, + 0x00106aa9, 0x00106aa8, 0x00106aa8, 0x00106aa8, + 0x00106aa8, 0x00106aa8, 0x00106aa8, 0x00106ab0, + 0x05c9ff47, 0x4933c857, 0x42034800, 0x0010aefd, 0x0501f834, 0x41780800, 0x600010b8, 0x0501f2c9, 0x4d2c0000, 0x59325809, 0x4933c857, 0x492fc857, - 0x812e59c0, 0x05cc08ee, 0x59340a12, 0x82040d00, + 0x812e59c0, 0x05c80f3a, 0x59340a12, 0x82040d00, 0x0000ff00, 0x592c000b, 0x82000500, 0x000000ff, 0x900001c0, 0x80040540, 0x592c0c08, 0x82040d00, 0x0000f000, 0x82040d80, 0x00003000, 0x05020003, 0x90000570, 0x0501f002, 0x90000551, 0x44034800, 0x81a5a000, 0x60241000, 0x600c0800, 0x592c000a, 0x82000500, 0xff000000, 0x82001d80, 0x84000000, - 0x05000006, 0x82001d80, 0x85000000, 0x05ce08d0, + 0x05000006, 0x82001d80, 0x85000000, 0x05ca0f1c, 0x601c1000, 0x60040800, 0x912c1c0a, 0x500c0000, 0x4401a000, 0x800c1800, 0x80d1a000, 0x80081040, 0x05fe07fb, 0x600011b8, 0x5c025800, 0x0501f299, @@ -19509,11 +19672,11 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x41786800, 0x41787800, 0x59301407, 0x90081585, 0x05020003, 0x42006000, 0x00890000, 0x59301416, 0x8c08051a, 0x05000002, 0x60047800, 0x0501f254, - 0x59300403, 0xb0000c93, 0x05ce18b1, 0xb000048b, - 0x05cc18af, 0x5932680a, 0x59368c03, 0x4803c857, - 0x0c01f001, 0x001069aa, 0x001069b2, 0x001069ba, - 0x001069c2, 0x0010694d, 0x0010694d, 0x0010694d, - 0x001069a2, 0x05cdf8a2, 0x42005000, 0x06000000, + 0x59300403, 0xb0000c93, 0x05ca1efd, 0xb000048b, + 0x05c81efb, 0x5932680a, 0x59368c03, 0x4803c857, + 0x0c01f001, 0x00106b5e, 0x00106b66, 0x00106b6e, + 0x00106b76, 0x00106b01, 0x00106b01, 0x00106b01, + 0x00106b56, 0x05c9feee, 0x42005000, 0x06000000, 0x42006000, 0x08290000, 0x41786800, 0x41787800, 0x0501f23b, 0x4933c857, 0x05fdff71, 0x4a01a006, 0x12000000, 0x59300407, 0x90000584, 0x05020003, @@ -19532,7 +19695,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4a01a006, 0x62000000, 0x5930001e, 0x4801a007, 0x60080800, 0x600011b8, 0x0501f232, 0x05fdff34, 0x59300809, 0x4c500000, 0x4c540000, 0x4c580000, - 0x9004a40b, 0x5930b01e, 0x90d0ac06, 0x0519fec5, + 0x9004a40b, 0x5930b01e, 0x90d0ac06, 0x0519ffc1, 0x5930081e, 0x600011b8, 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x0501f223, 0x05fdffac, 0x59300019, 0x4801a006, 0x5930001a, 0x4801a007, 0x4a01a008, @@ -19556,36 +19719,36 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4979a408, 0x4979a208, 0x4979a409, 0x4979a209, 0x4979a00b, 0x60180800, 0x600011b8, 0x0501f1d1, 0x4933c857, 0x4937c857, 0x4d1c0000, 0x60d40800, - 0x050dfd72, 0x05020021, 0x05fdfecd, 0x4a01a006, + 0x050dfd9f, 0x05020021, 0x05fdfecd, 0x4a01a006, 0x13000000, 0x5932382a, 0x59300403, 0xb0000597, - 0x05000004, 0x591c0416, 0x8c000502, 0x05c80fec, + 0x05000004, 0x591c0416, 0x8c000502, 0x05c80e38, 0x591c001b, 0x4801a005, 0x591c0407, 0x90000583, 0x05000007, 0x5930080a, 0x58040002, 0x82000500, 0x00ffffff, 0x4801a007, 0x0501f004, 0x5932481d, 0x59240005, 0x4801a007, 0x5930041b, 0x4801a408, 0x5930021b, 0x4801a208, 0x600c0800, 0x600011b8, - 0x5c023800, 0x0501f1ab, 0x4803c856, 0x05f9fd62, - 0x598c000b, 0x81300580, 0x05ca0fd1, 0x05f9fcb3, - 0x59300403, 0xb0000597, 0x050409d7, 0x0005fc5a, - 0x5c023800, 0x05f9f544, 0x4803c856, 0x4d2c0000, - 0x4d1c0000, 0x5932382a, 0x811e39c0, 0x05c80fc4, + 0x5c023800, 0x0501f1ab, 0x4803c856, 0x05f9fd70, + 0x598c000b, 0x81300580, 0x05ca0e1d, 0x05f9fcc1, + 0x59300403, 0xb0000597, 0x050409e2, 0x0005fc5a, + 0x5c023800, 0x05f9f552, 0x4803c856, 0x4d2c0000, + 0x4d1c0000, 0x5932382a, 0x811e39c0, 0x05c80e10, 0x831c0580, 0xffffffff, 0x05000036, 0x591c0c07, 0x90040586, 0x0500000a, 0x90040583, 0x05000036, 0x64de6403, 0x640e641c, 0x4a02621c, 0x00001700, 0x5c023800, 0x5c025800, 0x0501f064, 0x0501f848, 0x42001000, 0x40000000, 0x591c0203, 0x591c0804, 0x8c04053e, 0x05020020, 0x90000c91, 0x0c001002, - 0x05c9ffab, 0x00106a56, 0x00106a61, 0x00106a57, - 0x00106a61, 0x00106a5d, 0x00106a56, 0x00106a56, - 0x00106a61, 0x00106a61, 0x00106a56, 0x00106a56, - 0x00106a56, 0x00106a56, 0x00106a56, 0x00106a61, - 0x00106a56, 0x00106a61, 0x05c9ff99, 0x591c0416, + 0x05c9fdf7, 0x00106c0a, 0x00106c15, 0x00106c0b, + 0x00106c15, 0x00106c11, 0x00106c0a, 0x00106c0a, + 0x00106c15, 0x00106c15, 0x00106c0a, 0x00106c0a, + 0x00106c0a, 0x00106c0a, 0x00106c0a, 0x00106c15, + 0x00106c0a, 0x00106c15, 0x05c9fde5, 0x591c0416, 0x4803c857, 0x8c000518, 0x05000003, 0x8c000512, 0x05000003, 0x80001580, 0x0501f003, 0x42001000, 0x20000000, 0x591c0017, 0x4801a00a, 0x0501f01a, 0x0501f81f, 0x42001000, 0x40000000, 0x41780000, 0x05fdf7fa, 0x0501f81a, 0x591e5809, 0x812e59c0, - 0x05c80f83, 0x592c1010, 0x591c0013, 0x80080480, + 0x05c80dcf, 0x592c1010, 0x591c0013, 0x80080480, 0x4801a00a, 0x591c0203, 0x591c0804, 0x8c04053e, 0x05020005, 0x90000d82, 0x05000006, 0x90000d84, 0x05000004, 0x42001000, 0x40000000, 0x0501f002, @@ -19616,7 +19779,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x80080540, 0x4801a007, 0x60080800, 0x600011b8, 0x0501f0e4, 0x4803c856, 0x0501f809, 0x5930041c, 0x900001c0, 0x4801a005, 0x0501f92d, 0x41780800, - 0x600010b8, 0x0501f8db, 0x05f9f138, 0x4803c856, + 0x600010b8, 0x0501f8db, 0x05f9f146, 0x4803c856, 0x59300819, 0x90041c06, 0x64874800, 0x58040405, 0x82000500, 0x0000f000, 0x82000580, 0x00003000, 0x05000002, 0x65074800, 0x81a5a000, 0x580c0001, @@ -19630,12 +19793,12 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x05000006, 0x4a01a006, 0x01000000, 0x640da407, 0x60080800, 0x0501f021, 0x4a01a006, 0x02000000, 0x41780800, 0x916c0584, 0x05020003, 0x84040d42, - 0x0501f00c, 0x05edff0c, 0x05020003, 0x84040d4a, + 0x0501f00c, 0x05edfe5d, 0x05020003, 0x84040d4a, 0x0501f002, 0x84040d48, 0x59a8021b, 0x8c000506, 0x05020003, 0x8c00050a, 0x05000002, 0x84040d46, 0x4805a207, 0x59c40085, 0x48031004, 0x4c580000, 0x4c500000, 0x4c540000, 0x6018b000, 0x9188a400, - 0x90d0ac08, 0x0519fd2b, 0x5c00a800, 0x5c00a000, + 0x90d0ac08, 0x0519fe27, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x60200800, 0x600011b8, 0x0501f089, 0x05fdfd8b, 0x4a01a006, 0x56000000, 0x59340006, 0x4801a007, 0x59340007, 0x4801a008, 0x600c0800, @@ -19644,16 +19807,16 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x0000ffff, 0x05000003, 0x90040487, 0x05021006, 0x4a01a006, 0x01000000, 0x640da407, 0x60080800, 0x0501f011, 0x4a01a006, 0x0200001c, 0x6405a007, - 0x42001000, 0x0010ac65, 0x50080000, 0x9c0001c0, + 0x42001000, 0x0010aee5, 0x50080000, 0x9c0001c0, 0x4801a009, 0x5932481d, 0x59240005, 0x4801a00a, 0x59240001, 0x59240802, 0x4801a00b, 0x4805a00c, 0x601c0800, 0x600011b8, 0x0501f05e, 0x4d2c0000, 0x05fdfd5f, 0x59325809, 0x812e59c0, 0x05020003, 0x4979a001, 0x0501f005, 0x592c0009, 0x82000500, 0x00ffffff, 0x4801a001, 0x4a01a006, 0x51000000, - 0x5c025800, 0x05fdf3bb, 0x4803c856, 0x59325809, + 0x5c025800, 0x05fdf3c6, 0x4803c856, 0x59325809, 0x5932680a, 0x59300407, 0x4803c857, 0x90000d8a, - 0x05000002, 0x05c9fe72, 0x42005000, 0x02000000, + 0x05000002, 0x05c9fcbe, 0x42005000, 0x02000000, 0x42006000, 0x20290000, 0x41786800, 0x41787800, 0x0501f805, 0x91180d78, 0x60801193, 0x0501f86b, 0x1c01f000, 0x6081a000, 0x59300416, 0x8c000510, @@ -19674,15 +19837,15 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4807c857, 0x4c040000, 0x0501f841, 0x5c000800, 0x40040000, 0x80081540, 0x800000c4, 0x82000540, 0x00002000, 0x4803910a, 0x59b400f6, 0x90000518, - 0x05fe07fe, 0x42001800, 0x0010ac7e, 0x580c0004, + 0x05fe07fe, 0x42001800, 0x0010aefe, 0x580c0004, 0x4803c857, 0x580c0006, 0x4803c857, 0x580c1800, 0x480fc857, 0x8d0c052a, 0x0500000c, 0x820c1d00, 0xf8000000, 0x05000009, 0x4c040000, 0x4c080000, - 0x40083800, 0x42000000, 0x0010ac7e, 0x05c9ff19, - 0x5c001000, 0x5c000800, 0x4a0368f0, 0x0010ac7d, - 0x4a0368f1, 0x0010ac84, 0x480b68f3, 0x59b400f6, + 0x40083800, 0x42000000, 0x0010aefe, 0x05c9fd65, + 0x5c001000, 0x5c000800, 0x4a0368f0, 0x0010aefd, + 0x4a0368f1, 0x0010af04, 0x480b68f3, 0x59b400f6, 0x90000538, 0x05fe07fe, 0x4203e000, 0xb0800000, - 0x600bf800, 0x05f9f031, 0x4807c857, 0x59300004, + 0x600bf800, 0x05f9f03f, 0x4807c857, 0x59300004, 0x8c000512, 0x05000002, 0x8408154c, 0x480a2800, 0x4c040000, 0x0501f80e, 0x5c000800, 0x59b400f6, 0x8c00050a, 0x05fe07fe, 0x49a768f2, 0x480768f4, @@ -19690,27 +19853,27 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0xb0800000, 0x600bf800, 0x1c01f000, 0x61a07007, 0x4203e000, 0xb0800000, 0x600ff800, 0x40000000, 0x40000000, 0x40000000, 0x0501b004, 0x80387040, - 0x05c80ddf, 0x05fdf7f9, 0x1c01f000, 0x82000500, + 0x05c80c2b, 0x05fdf7f9, 0x1c01f000, 0x82000500, 0xffff0000, 0x82000580, 0x01050000, 0x0502000b, 0x599c0818, 0x8c040510, 0x05000008, 0x59a80806, 0x8c04050a, 0x05000005, 0x613c1100, 0x41781800, - 0x41782000, 0x05e5f8e1, 0x1c01f000, 0x1c01f000, + 0x41782000, 0x05e1fff8, 0x1c01f000, 0x1c01f000, 0x59a80067, 0x800001c0, 0x0500004b, 0x4d2c0000, 0x4d300000, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x40025800, 0x4000c000, 0x4000c800, 0x42026000, - 0x00110254, 0x592c0407, 0x81440580, 0x05020033, + 0x00110484, 0x592c0407, 0x81440580, 0x05020033, 0x83240580, 0xffffffff, 0x05000004, 0x592c0002, 0x81240580, 0x0502002d, 0x592c0205, 0xb0000595, 0x05000005, 0x8d3c0518, 0x05000028, 0x8d3c0516, 0x05020026, 0x40640000, 0x812c0580, 0x05020016, 0x59300203, 0x90000580, 0x0500000f, 0x59300009, - 0x800001c0, 0x0500000c, 0x05f9fb33, 0x4df00000, - 0x05f9fa30, 0x0201f800, 0x0010eeb1, 0x80c40040, - 0x05020002, 0x64026203, 0x5c03e000, 0x05f80b16, + 0x800001c0, 0x0500000c, 0x05f9fb41, 0x4df00000, + 0x05f9fa3e, 0x0201f800, 0x0010f0c0, 0x80c40040, + 0x05020002, 0x64026203, 0x5c03e000, 0x05f80b24, 0x497a6009, 0x592cc800, 0x4064c000, 0x4064b800, 0x0501f003, 0x592cb800, 0x485cc000, 0x497a5800, 0x592c0205, 0x82000580, 0x00000155, 0x05000003, - 0x05cdf92c, 0x0501f003, 0x49425a07, 0x0001fb5b, + 0x05c9ff78, 0x0501f003, 0x49425a07, 0x0001fb5b, 0x405e5800, 0x0501f003, 0x412cc000, 0x592e5800, 0x812e59c0, 0x05fe07c8, 0x48675067, 0x48635068, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c026000, @@ -19722,7 +19885,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x8d3c0502, 0x05000004, 0x61c2880f, 0x6040b000, 0x05fdf7f3, 0x5c024800, 0x5c00b000, 0x5c026800, 0x5c028800, 0x1c01f000, 0x4d300000, 0x59a81067, - 0x800811c0, 0x05000022, 0x42026000, 0x00110254, + 0x800811c0, 0x05000022, 0x42026000, 0x00110484, 0x59300203, 0x90000580, 0x0502001d, 0x58080803, 0x58080002, 0x4802601d, 0x4806600a, 0x480a6009, 0x64166407, 0x64066203, 0x4a026403, 0x00000092, @@ -19733,129 +19896,130 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x00000100, 0x84040d52, 0x0005fb32, 0x5c026000, 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, 0x4d180000, 0x4803c856, - 0x417a3000, 0x05fdf815, 0x59900805, 0x800409c0, - 0x05000012, 0x91947c09, 0x83180400, 0x00105add, + 0x417a3000, 0x05fdf823, 0x59900805, 0x800409c0, + 0x05000012, 0x91947c09, 0x83180400, 0x00105c9f, 0x50000000, 0x803c7c00, 0x583c0003, 0x811808ca, 0x82040c00, 0x00006139, 0x50040800, 0x80040580, - 0x05000006, 0x42000000, 0x0010b0ba, 0x0519fac6, + 0x05000006, 0x42000000, 0x0010b33a, 0x0519fbc2, 0x90000541, 0x0501f004, 0x811a3000, 0x91180585, 0x05fe07e9, 0x5c023000, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, 0x4cd80000, 0x4d180000, 0x4803c856, 0x598c080b, - 0x800409c0, 0x05000002, 0x05f5ff3c, 0x417a3000, - 0x05f9ffea, 0x59900805, 0x800409c0, 0x0500000f, - 0x91947c09, 0x83180400, 0x00105add, 0x50000000, + 0x800409c0, 0x05000002, 0x05f5ff4a, 0x417a3000, + 0x05f9fff8, 0x59900805, 0x800409c0, 0x0500000f, + 0x91947c09, 0x83180400, 0x00105c9f, 0x50000000, 0x803c7c00, 0x811808ca, 0x82040c00, 0x00006139, 0x50040800, 0x48047803, 0x4a007801, 0x000001f4, 0x64287800, 0x64107802, 0x811a3000, 0x91180585, 0x05fe07ec, 0x5c023000, 0x5c01b000, 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, - 0x41781000, 0x42026000, 0x001102e4, 0x59a8180d, + 0x41781000, 0x42026000, 0x00110514, 0x59a8180d, 0x480a6402, 0x4a026202, 0x0000ffff, 0x80081000, 0x800c1840, 0x05000003, 0x91326430, 0x05fdf7f9, 0x1c01f000, 0x0005fc5a, 0x1c01f000, 0x5c036000, 0x4db00000, 0x49b3c857, 0x4933c857, 0x813261c0, - 0x05000029, 0x59300203, 0x90000580, 0x05000026, + 0x0500002d, 0x59300203, 0x90000580, 0x0500002a, 0x59300407, 0x4803c857, 0x90000d84, 0x0500000c, 0x90000d81, 0x0500000a, 0x90000d83, 0x05000004, - 0x90000d86, 0x05020012, 0x0515fe6e, 0x5930001e, - 0x800001c0, 0x050e0eda, 0x0501f00d, 0x5930082a, - 0x4807c857, 0x4d300000, 0x40066000, 0x050dff7c, + 0x90000d86, 0x05020016, 0x0515ff58, 0x5930001e, + 0x800001c0, 0x050e0f0c, 0x0501f011, 0x5930000a, + 0x82000580, 0x0010ce8f, 0x0500000d, 0x5930082a, + 0x4807c857, 0x4d300000, 0x40066000, 0x050dffaa, 0x5c026000, 0x05020006, 0x5804001e, 0x4803c857, 0x81300580, 0x05020002, 0x4978081e, 0x641e6407, 0x497a6009, 0x4a026004, 0x00004000, 0x59a8002e, 0xb0000c91, 0x05001002, 0x80000102, 0x48026006, 0x497a6205, 0x1c01f000, 0x0501f803, 0x41318800, 0x1c01f000, 0x91640490, 0x05021007, 0x42000000, - 0x0010b049, 0x0519fa4c, 0x4967c857, 0x80026580, + 0x0010b2c9, 0x0519fb44, 0x4967c857, 0x80026580, 0x1c01f000, 0x8166c9c0, 0x05000018, 0x41626000, 0x41580000, 0x59300a03, 0x90040d80, 0x05000007, 0x91326430, 0x81300c80, 0x05fc17fb, 0x42026000, - 0x001102e4, 0x05fdf7f8, 0x4933c857, 0x8166c840, + 0x00110514, 0x05fdf7f8, 0x4933c857, 0x8166c840, 0x91300c30, 0x80040480, 0x05021005, 0x4006c000, 0x64226203, 0x813261c0, 0x1c01f000, 0x4202c000, - 0x001102e4, 0x05fdf7fb, 0x42000000, 0x0010b049, - 0x0519fa2d, 0x4933c856, 0x417a6000, 0x05fdf7f6, + 0x00110514, 0x05fdf7fb, 0x42000000, 0x0010b2c9, + 0x0519fb25, 0x4933c856, 0x417a6000, 0x05fdf7f6, 0x0005fc78, 0x1c01f000, 0x4933c857, 0x91380593, 0x05020008, 0x59300004, 0x8c00053e, 0x05000004, - 0x05f9fa09, 0x05f9f95d, 0x05f9f9f3, 0x1c01f000, + 0x05f9fa13, 0x05f9f967, 0x05f9f9fd, 0x1c01f000, 0x4933c857, 0x598800b7, 0x80000000, 0x480310b7, 0x1c01f000, 0x4933c857, 0x59300203, 0x90003491, - 0x05ca1c6f, 0x4d2c0000, 0x0c01f803, 0x5c025800, - 0x1c01f000, 0x00106d96, 0x001072eb, 0x00107421, - 0x00106d96, 0x00107465, 0x00106f22, 0x00106d96, - 0x00106d96, 0x0010727e, 0x00106d96, 0x00106d96, - 0x00106d96, 0x00106d96, 0x00106d96, 0x0010849d, - 0x00106d96, 0x00106d96, 0x05c9fc59, 0x4933c857, - 0x59300203, 0x90003491, 0x05ca1c55, 0x0c01f001, - 0x00106dad, 0x00107dc1, 0x00106dad, 0x00106dad, - 0x00106dad, 0x00106dad, 0x00106dad, 0x00106dad, - 0x00107d61, 0x00107dd7, 0x00107e58, 0x00107dd7, - 0x00107e58, 0x00106dad, 0x001084c3, 0x00106dad, - 0x00106dad, 0x05c9fc42, 0x05c9fc41, 0x4933c857, + 0x05ca1ab7, 0x4d2c0000, 0x0c01f803, 0x5c025800, + 0x1c01f000, 0x00106f4e, 0x001074aa, 0x001075e0, + 0x00106f4e, 0x0010762d, 0x001070dc, 0x00106f4e, + 0x00106f4e, 0x0010743d, 0x00106f4e, 0x00106f4e, + 0x00106f4e, 0x00106f4e, 0x00106f4e, 0x0010867e, + 0x00106f4e, 0x00106f4e, 0x05c9faa1, 0x4933c857, + 0x59300203, 0x90003491, 0x05ca1a9d, 0x0c01f001, + 0x00106f65, 0x00107f96, 0x00106f65, 0x00106f65, + 0x00106f65, 0x00106f65, 0x00106f65, 0x00106f65, + 0x00107f36, 0x00107fb5, 0x00108036, 0x00107fb5, + 0x00108036, 0x00106f65, 0x001086a4, 0x00106f65, + 0x00106f65, 0x05c9fa8a, 0x05c9fa89, 0x4933c857, 0x4d300000, 0x4d1c0000, 0x59300203, 0x9000058f, - 0x05ca0c3b, 0x91380593, 0x05020025, 0x59300c03, + 0x05ca0a83, 0x91380593, 0x05020025, 0x59300c03, 0xb0040586, 0x05000015, 0xb0040584, 0x0502000a, - 0x4d300000, 0x5932602a, 0x050df9fd, 0x5c026000, + 0x4d300000, 0x5932602a, 0x050dfa26, 0x5c026000, 0x0500001c, 0x591c0416, 0x8400054a, 0x48023c16, 0x0501f010, 0x59300019, 0x82000500, 0xff000000, 0x82000580, 0xc2000000, 0x05020012, 0x5930001e, - 0x05fdfe47, 0x0501f00f, 0x59300416, 0x84000504, - 0x48026416, 0x5930141d, 0x050df9e0, 0x05000009, + 0x05fdfe43, 0x0501f00f, 0x59300416, 0x84000504, + 0x48026416, 0x5930141d, 0x050dfa09, 0x05000009, 0x411e6000, 0x5930001c, 0x80000540, 0x05000005, - 0x497a601c, 0x0801f800, 0x0501f002, 0x05f9f8f7, + 0x497a601c, 0x0801f800, 0x0501f002, 0x05f9f901, 0x5c023800, 0x5c026000, 0x0005f45a, 0x4933c857, 0x4d2c0000, 0x59325809, 0x59300203, 0x90003491, - 0x05ca1c0b, 0x0c01f803, 0x5c025800, 0x1c01f000, - 0x00106df9, 0x00106df9, 0x00106df9, 0x00106e0e, - 0x00106e5d, 0x00106df9, 0x00106df9, 0x00106df9, - 0x00106dfa, 0x00106df9, 0x00106df9, 0x00106df9, - 0x00106df9, 0x00106df9, 0x00106df9, 0x00106df9, - 0x00106e47, 0x05c9fbf6, 0x4933c857, 0xb1380580, - 0x05ca0bf3, 0x4a026008, 0x00082000, 0x640e6203, + 0x05ca1a53, 0x0c01f803, 0x5c025800, 0x1c01f000, + 0x00106fb1, 0x00106fb1, 0x00106fb1, 0x00106fc6, + 0x00107015, 0x00106fb1, 0x00106fb1, 0x00106fb1, + 0x00106fb2, 0x00106fb1, 0x00106fb1, 0x00106fb1, + 0x00106fb1, 0x00106fb1, 0x00106fb1, 0x00106fb1, + 0x00106fff, 0x05c9fa3e, 0x4933c857, 0xb1380580, + 0x05ca0a3b, 0x4a026008, 0x00082000, 0x640e6203, 0x493a6403, 0x64065c09, 0x592c000e, 0x48026013, 0x497a6015, 0x592c0209, 0x800000c2, 0x800010c4, 0x80081400, 0x480a6006, 0x0001f980, 0x42000800, 0x80000060, 0x0005f320, 0x4933c857, 0xb1380490, - 0x05ca1bdf, 0xb1380489, 0x05c81bdd, 0x0c01f001, - 0x00106e1c, 0x00106e29, 0x00106e1b, 0x00106e1b, - 0x00106e1b, 0x00106e1b, 0x00106e2f, 0x05c9fbd4, - 0x050df8d4, 0x05000003, 0x64426203, 0x0501f002, + 0x05ca1a27, 0xb1380489, 0x05c81a25, 0x0c01f001, + 0x00106fd4, 0x00106fe1, 0x00106fd3, 0x00106fd3, + 0x00106fd3, 0x00106fd3, 0x00106fe7, 0x05c9fa1c, + 0x050df8fd, 0x05000003, 0x64426203, 0x0501f002, 0x64126203, 0x640a5c09, 0x592c0208, 0x48025c0a, 0x592c020a, 0x48025a08, 0x592c000d, 0x4802580e, - 0x1c01f000, 0x05f9f88c, 0x0509fce8, 0x05000003, - 0x641a5a07, 0x0001fb5b, 0x0005f45a, 0x05f9f886, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ec6c, + 0x1c01f000, 0x05f9f896, 0x0509fd11, 0x05000003, + 0x641a5a07, 0x0001fb5b, 0x0005f45a, 0x05f9f890, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ee7a, 0x5c027800, 0x60503000, 0x41782800, 0x60082000, 0x4d400000, 0x4d440000, 0x59368c03, 0x60a68000, - 0x050dfdd8, 0x5c028800, 0x5c028000, 0x42000000, - 0x0010b056, 0x0519f954, 0x0509fcd0, 0x0004045a, + 0x050dfe06, 0x5c028800, 0x5c028000, 0x42000000, + 0x0010b2d6, 0x0519fa4c, 0x0509fcf9, 0x0004045a, 0x64a65a07, 0x0001fb5b, 0x0005f45a, 0x4933c857, 0xb13805a1, 0x05000006, 0xb13805a0, 0x05020007, 0x59cc0002, 0x8c000526, 0x05000005, 0xb1380589, - 0x05000004, 0x05c9fb9e, 0x05fdff26, 0x1c01f000, + 0x05000004, 0x05c9f9e6, 0x05fdff26, 0x1c01f000, 0x59a80030, 0x48026205, 0x64126203, 0x5930001c, 0x80000540, 0x05000003, 0x497a601c, 0x0801f800, 0x1c01f000, 0x4933c857, 0xb1380588, 0x05000003, - 0xb1380593, 0x05ca0b8e, 0x592c0207, 0x90000587, + 0xb1380593, 0x05ca09d6, 0x592c0207, 0x90000587, 0x05000008, 0x59300013, 0x80000540, 0x05000005, 0x592c080d, 0x80040480, 0x4802580d, 0x64565a07, 0x592c0207, 0x80000540, 0x05020002, 0x64025a07, 0x0001fb5b, 0x0005f45a, 0x4933c857, 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x4c100000, 0x05c9ff01, - 0x05c80b73, 0x497a5a07, 0x59a8008c, 0x82000500, + 0x4c600000, 0x4c640000, 0x4c100000, 0x05c9fd49, + 0x05c809bb, 0x497a5a07, 0x59a8008c, 0x82000500, 0x0000f000, 0x48025c08, 0x59a80877, 0x90040c18, 0x48065a08, 0x412cb800, 0x4d2c0000, 0x41cca000, 0x6004c000, 0x60b0c800, 0x900404ad, 0x05021004, - 0x912cac0a, 0x0509f888, 0x0501f023, 0x40043000, - 0x60b00800, 0x912cac0a, 0x0509f883, 0x901834ac, - 0x4c180000, 0x05c9fee7, 0x5c003000, 0x05000012, + 0x912cac0a, 0x0509f8ae, 0x0501f023, 0x40043000, + 0x60b00800, 0x912cac0a, 0x0509f8a9, 0x901834ac, + 0x4c180000, 0x05c9fd2f, 0x5c003000, 0x05000012, 0x8060c000, 0x4a025805, 0x00000110, 0x492cb801, 0x90180cbd, 0x05021005, 0x40180800, 0x912cac06, - 0x0509f875, 0x0501f010, 0x9064cc3c, 0x901834bc, - 0x60f00800, 0x412cb800, 0x912cac06, 0x0509f86e, + 0x0509f89b, 0x0501f010, 0x9064cc3c, 0x901834bc, + 0x60f00800, 0x412cb800, 0x912cac06, 0x0509f894, 0x05fdf7ec, 0x5c025800, 0x592c0207, 0x8400055e, 0x48025a07, 0x592c0408, 0x80640540, 0x48025c08, 0x0501f002, 0x5c025800, 0x5c002000, 0x813669c0, @@ -19868,2361 +20032,2414 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x05000003, 0x90000588, 0x05020002, 0x58041006, 0x480a5806, 0x592c0408, 0x81200540, 0x48025c08, 0x0501f002, 0x49225c06, 0x846001c0, 0x80100540, - 0x48025805, 0x592c0001, 0x497a5801, 0x4c000000, - 0x0001fb5b, 0x5c025800, 0x812e59c0, 0x05fe07fa, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, - 0x0515fe5c, 0x05fdf7f7, 0x4803c856, 0x4c5c0000, - 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, - 0x412cb800, 0x592c040c, 0x8c000516, 0x05000003, - 0x41cca000, 0x0501f002, 0x91cca406, 0x4008b000, - 0x41781000, 0xb058048c, 0x05001003, 0x6130b000, - 0x40001000, 0x4c080000, 0x4d2c0000, 0x05c9fe7d, - 0x0500001f, 0x5c001800, 0x492c1801, 0x485a5800, - 0x9058b403, 0x8058b104, 0x912cac02, 0x0519f994, - 0x585c040c, 0x8c000500, 0x0500000b, 0x912c1402, - 0x8c000516, 0x05000002, 0x90081406, 0x64041000, - 0x80081000, 0x46001000, 0x00000900, 0x84000500, - 0x4800bc0c, 0x5c001000, 0x800811c0, 0x05fe07e0, - 0x90000541, 0x5c00b000, 0x5c00a800, 0x5c00a000, - 0x5c025800, 0x5c00b800, 0x1c01f000, 0x5c025800, - 0x5c001000, 0x05fdf7f8, 0x4933c857, 0x91380d95, - 0x05020008, 0x0509ffcb, 0x05000005, 0x5930082a, - 0x58040416, 0x8400051a, 0x48000c16, 0x0005f45a, - 0x91380d96, 0x05ca0ac2, 0x0005f45a, 0x4933c857, - 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, - 0x59325809, 0x91cca406, 0x59cc1806, 0x820c0580, - 0x01000000, 0x05020003, 0x6008b000, 0x0501f00a, - 0x6020b000, 0x912cac06, 0x0519f922, 0x8c0c0500, - 0x05000007, 0x6020b000, 0x592e5801, 0x812e59c0, - 0x05c80aab, 0x912cac06, 0x0519f91a, 0x0501f812, - 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x4c500000, 0x4c540000, - 0x4c580000, 0x91cca406, 0x5930a809, 0x9054ac06, - 0x601cb000, 0x0519f90b, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x4933c857, 0x0509fbb8, 0x0004045a, - 0x4d2c0000, 0x050dfa3b, 0x05020008, 0x41780800, - 0x4d400000, 0x60028000, 0x050df87a, 0x5c028000, - 0x5c025800, 0x0005f45a, 0x5931d82d, 0x58ef400a, - 0x58ee580c, 0x4a025a05, 0x00000103, 0x58ec0008, - 0x0801f800, 0x5c025800, 0x0005f45a, 0x4933c857, - 0x59cc1806, 0x820c0580, 0x02000000, 0x0502001e, - 0x4a026802, 0x00fffffd, 0x5934000a, 0x84000504, - 0x4802680a, 0x60000000, 0x4c0c0000, 0x0501f823, - 0x5c001800, 0x59300c29, 0x900405a1, 0x05020006, - 0x05d5ffa7, 0x61fc19ff, 0x60102000, 0x60483000, - 0x05e1fdf0, 0x59300809, 0x800409c0, 0x0004045a, - 0x4a000a05, 0x00000103, 0x480c0806, 0x5931d82d, - 0x58ef400a, 0x58ee580c, 0x58ec0008, 0x0801f800, - 0x0005f45a, 0x42000000, 0x0010b05f, 0x0519f802, - 0x60180000, 0x4c0c0000, 0x0501f808, 0x5c001800, - 0x05fc07ed, 0x4c0c0000, 0x0501f819, 0x5c001800, - 0x05fe07e9, 0x1c01f000, 0x4933c857, 0x4d400000, - 0x4d240000, 0x4d200000, 0x5932481d, 0x40028000, - 0x59300429, 0xb0000d91, 0x05000003, 0x90000da1, - 0x05020006, 0x05d5ff7e, 0x60040000, 0x05edf85f, - 0x80000580, 0x0501f002, 0x90000541, 0x5c024000, - 0x5c024800, 0x5c028000, 0x1c01f000, 0x4933c857, - 0x4d2c0000, 0x59325809, 0x812e59c0, 0x0502000b, - 0x497a6006, 0x497a6205, 0x0509ff36, 0x05000002, - 0x497a6417, 0x4d380000, 0x608a7000, 0x0501fb28, - 0x5c027000, 0x80000580, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x4d2c0000, 0x4c500000, 0x4c540000, - 0x4c580000, 0x59325809, 0x592e5801, 0x912cac06, - 0x91cca406, 0x59a8088c, 0x82040d00, 0x000003ff, - 0x9004148f, 0x05001011, 0x603cb000, 0x0519f88d, - 0x592e5801, 0x912cac06, 0x90080c8f, 0x05001008, - 0x603cb000, 0x0519f887, 0x592e5801, 0x912cac06, - 0x9004148f, 0x05001005, 0x603c1000, 0x4008b000, - 0x0519f880, 0x0501f003, 0x4004b000, 0x0519f87d, - 0x5931d82d, 0x58ef400a, 0x58ee580c, 0x4a025a05, - 0x00000103, 0x592e5801, 0x58ec0008, 0x0801f800, - 0x0005fc5a, 0x5c00b000, 0x5c00a800, 0x5c00a000, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, - 0x4c500000, 0x4c540000, 0x4c580000, 0x59cc0006, - 0x82000d80, 0x01000000, 0x05000021, 0x59cc0007, - 0x9000b1c0, 0x8258b500, 0x000000ff, 0x8058b104, - 0x9058b402, 0x90580c87, 0x05001002, 0x6018b000, - 0x91cca406, 0x59301009, 0x800811c0, 0x05c809e8, - 0x9008ac06, 0x0519f857, 0x82000d00, 0xff000000, - 0x800409c0, 0x05000014, 0x8200b500, 0x000000ff, - 0x05000011, 0x8058b104, 0x90580c8e, 0x05001002, - 0x6034b000, 0x58081001, 0x800811c0, 0x05c809d8, - 0x9008ac06, 0x0519f847, 0x0501f007, 0x59301009, - 0x800811c0, 0x05c809d2, 0x48001006, 0x59cc0007, - 0x48001007, 0x05fdff38, 0x5c00b000, 0x5c00a800, + 0x48025805, 0x0519faff, 0x05020010, 0x592c0001, + 0x497a5801, 0x4c000000, 0x0001fb5b, 0x5c025800, + 0x812e59c0, 0x05fe07f8, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x0515ff52, 0x05fdf7f7, + 0x4803c856, 0x4c5c0000, 0x4d2c0000, 0x4c500000, + 0x4c540000, 0x4c580000, 0x412cb800, 0x592c040c, + 0x8c000516, 0x05000003, 0x41cca000, 0x0501f002, + 0x91cca406, 0x4008b000, 0x41781000, 0xb058048c, + 0x05001003, 0x6130b000, 0x40001000, 0x4c080000, + 0x4d2c0000, 0x05c9fcc3, 0x0500001f, 0x5c001800, + 0x492c1801, 0x485a5800, 0x9058b403, 0x8058b104, + 0x912cac02, 0x0519fa8a, 0x585c040c, 0x8c000500, + 0x0500000b, 0x912c1402, 0x8c000516, 0x05000002, + 0x90081406, 0x64041000, 0x80081000, 0x46001000, + 0x00000900, 0x84000500, 0x4800bc0c, 0x5c001000, + 0x800811c0, 0x05fe07e0, 0x90000541, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x5c025800, 0x5c00b800, + 0x1c01f000, 0x5c025800, 0x5c001000, 0x05fdf7f8, + 0x4933c857, 0x91380d95, 0x05020008, 0x0509fff2, + 0x05000005, 0x5930082a, 0x58040416, 0x8400051a, + 0x48000c16, 0x0005f45a, 0x91380d96, 0x05ca0908, + 0x0005f45a, 0x4933c857, 0x4d2c0000, 0x4c500000, + 0x4c540000, 0x4c580000, 0x59325809, 0x91cca406, + 0x59cc1806, 0x820c0580, 0x01000000, 0x05020003, + 0x6008b000, 0x0501f00a, 0x6020b000, 0x912cac06, + 0x0519fa18, 0x8c0c0500, 0x05000007, 0x6020b000, + 0x592e5801, 0x812e59c0, 0x05c808f1, 0x912cac06, + 0x0519fa10, 0x0501f812, 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x4c500000, 0x4c540000, 0x4c580000, 0x91cca406, + 0x5930a809, 0x9054ac06, 0x601cb000, 0x0519fa01, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x4933c857, + 0x0509fbdf, 0x0004045a, 0x4d2c0000, 0x050dfa67, + 0x05020008, 0x41780800, 0x4d400000, 0x60028000, + 0x050df8a1, 0x5c028000, 0x5c025800, 0x0005f45a, + 0x5931d82d, 0x58ef400a, 0x58ee580c, 0x4a025a05, + 0x00000103, 0x58ec0008, 0x0801f800, 0x5c025800, + 0x0005f45a, 0x4933c857, 0x59cc1806, 0x820c0580, + 0x02000000, 0x0502001e, 0x4a026802, 0x00fffffd, + 0x5934000a, 0x84000504, 0x4802680a, 0x60000000, + 0x4c0c0000, 0x0501f823, 0x5c001800, 0x59300c29, + 0x900405a1, 0x05020006, 0x05d5fe46, 0x61fc19ff, + 0x60102000, 0x60483000, 0x05e1fd01, 0x59300809, + 0x800409c0, 0x0004045a, 0x4a000a05, 0x00000103, + 0x480c0806, 0x5931d82d, 0x58ef400a, 0x58ee580c, + 0x58ec0008, 0x0801f800, 0x0005f45a, 0x42000000, + 0x0010b2df, 0x0519f8f8, 0x60180000, 0x4c0c0000, + 0x0501f808, 0x5c001800, 0x05fc07ed, 0x4c0c0000, + 0x0501f81e, 0x5c001800, 0x05fe07e9, 0x1c01f000, + 0x4933c857, 0x4d400000, 0x4d240000, 0x4d200000, + 0x5932481d, 0x40028000, 0x59300429, 0xb0000d91, + 0x05000003, 0x90000da1, 0x0502000b, 0x05d5fe1d, + 0x0519fa1d, 0x05020004, 0x59300429, 0x900005a1, + 0x05d40b6b, 0x60040000, 0x05e9ff9d, 0x80000580, + 0x0501f002, 0x90000541, 0x5c024000, 0x5c024800, + 0x5c028000, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x59325809, 0x812e59c0, 0x0502000b, 0x497a6006, + 0x497a6205, 0x0509ff58, 0x05000002, 0x497a6417, + 0x4d380000, 0x608a7000, 0x0501fb28, 0x5c027000, + 0x80000580, 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, - 0x6008b000, 0x59cc0806, 0x82040580, 0x01000000, - 0x05000004, 0x8204b500, 0x0000ffff, 0x8058b104, - 0x91cca406, 0x59300009, 0x9000ac06, 0x0519f829, - 0x05fdff21, 0x5c00b000, 0x5c00a800, 0x5c00a000, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x4803c857, - 0x4807c857, 0x480bc857, 0x480fc857, 0x4813c857, - 0x481bc857, 0x492fc857, 0x4d2c0000, 0x4c000000, - 0x05c9fd21, 0x5c000000, 0x0500000d, 0x48025803, - 0x481a5801, 0x48125808, 0x48065805, 0x480a5806, - 0x480e5807, 0x5c001000, 0x4c080000, 0x480a5809, - 0x412c1000, 0x0001f81c, 0x90000541, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x4937c857, 0x4d1c0000, - 0x05f5fa3c, 0x05020020, 0x59cc0001, 0x82000500, - 0x00ffffff, 0x59341002, 0x82081500, 0x00ffffff, - 0x80080580, 0x05020018, 0x497a6205, 0x60d40800, - 0x0509ff02, 0x0502000f, 0x591c001e, 0x800001c0, - 0x0500000c, 0x497a381e, 0x591c0416, 0x8c000502, - 0x05c8097f, 0x84000502, 0x48023c16, 0x591c1407, - 0x90080583, 0x05000005, 0x90080586, 0x05000005, - 0x05fdfc9b, 0x0501f004, 0x0501f805, 0x0501f002, - 0x0501f8c4, 0x5c023800, 0x1c01f000, 0x4d2c0000, - 0x591e5809, 0x4933c857, 0x491fc857, 0x493bc857, - 0x492fc857, 0x91380595, 0x050000b8, 0x91380596, - 0x050200b4, 0x4d300000, 0x411e6000, 0x59cc0207, - 0x4803c857, 0x82000d00, 0x0000ff00, 0x82040580, - 0x00001700, 0x05000004, 0x82040580, 0x00000300, - 0x05020065, 0x0509fe5b, 0x05000006, 0x591c0403, - 0xb0000590, 0x05020003, 0x05fdfc79, 0x0501f09d, - 0x591c0203, 0x4803c857, 0x9000058d, 0x05000041, - 0x812e59c0, 0x0500009a, 0x591c0202, 0x4803c857, - 0x82000580, 0x0000ffff, 0x05020082, 0x0509fe49, - 0x05000004, 0x591c0203, 0x90000d8e, 0x0502007d, - 0x592c020b, 0x4803c857, 0x90000503, 0x90000582, - 0x05020007, 0x592c0810, 0x591c0013, 0x4803c857, - 0x4807c857, 0x80040580, 0x05020072, 0x591c0416, - 0x4803c857, 0x8c000500, 0x0502006e, 0x42000000, - 0x0010b03c, 0x0515fed8, 0x41780800, 0x591c1006, - 0x60280000, 0x05f5fc7b, 0x592c0407, 0x4803c857, - 0x800001c0, 0x0500000b, 0x80080c80, 0x05001003, - 0x05ca0927, 0x80001040, 0x480a5c07, 0x800811c0, - 0x05020004, 0x0201f800, 0x0010f510, 0x0501f069, - 0x0509fb26, 0x591c0819, 0x591c001a, 0x48065809, - 0x4802580a, 0x592e4411, 0x81224110, 0x59300008, - 0x8c000500, 0x05ce0afe, 0x497a3809, 0x0001faa7, - 0x0502004c, 0x411e6000, 0x05fdfc35, 0x0501f059, - 0x05fdfc65, 0x05000015, 0x591c0006, 0x48026006, - 0x4926601d, 0x4936600a, 0x0509fdfb, 0x640e6407, - 0x492e6009, 0x591c0819, 0x591c101a, 0x48066019, - 0x480a601a, 0x4d380000, 0x591e7403, 0x4d300000, - 0x411e6000, 0x05fdfc22, 0x5c026000, 0x0005fc78, - 0x5c027000, 0x0501f043, 0x59a80030, 0x48023a05, - 0x0501f040, 0x59cc0407, 0x9000058b, 0x05020026, - 0x59340a00, 0x84040d0e, 0x48066a00, 0x592c0a05, - 0x82040d00, 0x000000ff, 0x90040d94, 0x05000002, - 0x640e6229, 0x59300008, 0x8c000500, 0x05ce0ad0, - 0x4d400000, 0x497a5c0a, 0x600e8000, 0x592c0a09, - 0x05e9fee1, 0x0515ffa2, 0x05020006, 0x0001fb5b, - 0x59300a29, 0x90040d83, 0x05080ae4, 0x497a6009, - 0x5c028000, 0x4a026403, 0x00000085, 0x64266203, - 0x640a6407, 0x42000800, 0x80004040, 0x050dfb80, - 0x0005fb2e, 0x4203e000, 0xb0800000, 0x6023f800, - 0x0501f018, 0x59cc0207, 0x82000580, 0x00002a00, - 0x05020004, 0x59a80030, 0x48023a05, 0x0501f011, - 0x812e59c0, 0x05c808c6, 0x0001ff6c, 0x497a6027, - 0x4a025a05, 0x00000103, 0x591c0008, 0x8c000500, - 0x05ce0aa7, 0x591c0402, 0x48025c07, 0x640e5a07, - 0x497a5c0a, 0x0001fb5b, 0x05fdfbdd, 0x05e9fb04, - 0x5c026000, 0x0005fc5a, 0x0501f002, 0x5c026000, - 0x5c025800, 0x1c01f000, 0x0501f813, 0x05fdf7fd, - 0x4933c857, 0x91380595, 0x05020004, 0x59a80030, - 0x48023a05, 0x0501f009, 0x91380596, 0x05020009, - 0x4d300000, 0x411e6000, 0x0515fa4a, 0x0005faec, - 0x0005fc5a, 0x5c026000, 0x497a381e, 0x0005fc5a, - 0x1c01f000, 0x4c5c0000, 0x591c0416, 0x84000540, - 0x48023c16, 0x59ccb80b, 0x4933c857, 0x491fc857, - 0x492fc857, 0x4803c857, 0x485fc857, 0x0509fd95, - 0x05020007, 0x8c5c053c, 0x05000005, 0x59a80030, - 0x48023a05, 0x497a381e, 0x0501f064, 0x4d300000, - 0x411e6000, 0x0505fe02, 0x5c026000, 0x591c0407, - 0x90000580, 0x0500005d, 0x591c0403, 0xb0000590, - 0x0502000a, 0x4d300000, 0x411e6000, 0x64066203, - 0x42000800, 0x80000043, 0x0005fb2e, 0x5c026000, - 0x497a381e, 0x0501f051, 0x591c0203, 0x9000058d, - 0x0500001c, 0x812e59c0, 0x05c80875, 0x592c020b, - 0x4803c857, 0x8c000500, 0x0502001b, 0x8c000502, - 0x05000014, 0x591c0416, 0x8c00051c, 0x05020007, - 0x591c0013, 0x4803c857, 0x800001c0, 0x0500000d, - 0x591c0014, 0x48023818, 0x4a023814, 0x0fffffff, - 0x592c0209, 0x8400051e, 0x48025a09, 0x42000000, - 0x0010b03e, 0x0515fe04, 0x64063a16, 0x0501f016, - 0x42000000, 0x0010b03f, 0x0515fdff, 0x641e3a16, - 0x0501f011, 0x8c5c053a, 0x05fe07fa, 0x59cc000a, - 0x592c1810, 0x4803c857, 0x480fc857, 0x800c0580, - 0x05fc07f4, 0x59cc000a, 0x4803c857, 0x48023818, - 0x48023817, 0x42000000, 0x0010b03d, 0x0515fdee, - 0x64163a16, 0x0509fd47, 0x0500001a, 0x591c0416, - 0x8c00051a, 0x05000017, 0x4803c857, 0x8c00051e, - 0x05000016, 0x4130b800, 0x05fdfb93, 0x0500000f, - 0x4926601d, 0x64066203, 0x647a6403, 0x585c041b, - 0x4802641b, 0x585c021b, 0x4802621b, 0x591e680a, - 0x4936600a, 0x0509fd24, 0x64066407, 0x42000800, - 0x80000040, 0x0005fb2e, 0x405e6000, 0x0501f003, - 0x5c00b800, 0x0509f3d8, 0x5c00b800, 0x0005f45a, - 0x4933c857, 0x4d1c0000, 0x05f5f8ce, 0x0502003f, - 0x59cc0001, 0x59341002, 0x80080580, 0x82000500, - 0x00ffffff, 0x05020037, 0x5930141b, 0x0509fddf, - 0x05c8081b, 0x591c1407, 0x90080587, 0x05000031, - 0x90080582, 0x0500002f, 0x90080580, 0x0500002d, - 0x591c0202, 0x82000d80, 0x0000ffff, 0x05000004, - 0x59301a1b, 0x800c0580, 0x05020026, 0x91380595, - 0x05000022, 0x4d300000, 0x4d2c0000, 0x411e6000, - 0x59325809, 0x0509f929, 0x05c80805, 0x592c0205, - 0x82000500, 0x000000ff, 0x90000594, 0x05000002, - 0x640e6229, 0x497a5c0a, 0x600e8000, 0x592c0a09, - 0x05e9fdf9, 0x0515feba, 0x05020006, 0x0001fb5b, - 0x59300a29, 0x90040d83, 0x050809fc, 0x497a6009, - 0x5c025800, 0x4a026403, 0x00000085, 0x64266203, - 0x640a6407, 0x42000800, 0x80004040, 0x0005fb2e, - 0x5c026000, 0x0501f003, 0x59a80030, 0x48023a05, - 0x497a381e, 0x0005fc5a, 0x5c023800, 0x1c01f000, - 0x4933c857, 0x4c580000, 0x4d2c0000, 0x59325809, - 0x59342200, 0x82102500, 0xffffdffd, 0x48126a00, - 0x91383595, 0x05000009, 0x0509f8fc, 0x05000048, - 0x0509ff80, 0x05020003, 0x6008b000, 0x0509ff62, - 0x0501f9dd, 0x0501f05b, 0x91cc1408, 0x6008b000, - 0x91341c06, 0x0501fe2b, 0x0502000f, 0x91cc140a, - 0x6008b000, 0x91341c08, 0x0501fe26, 0x0502000a, - 0x05d5faa9, 0x59342200, 0x59cc1007, 0x800811c0, - 0x05000003, 0x480a6801, 0x84102542, 0x48126a00, - 0x0501f04a, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010ec6c, 0x5c027800, 0x42000000, 0x0010b056, - 0x0515fd5d, 0x59340200, 0x84000558, 0x48026a00, - 0x4d300000, 0x05fdfb08, 0x05c40fb1, 0x4926601d, - 0x4936600a, 0x497a6009, 0x64066407, 0x64066403, - 0x600c3000, 0x0515fba9, 0x05d5fce1, 0x59240400, - 0x8c00050a, 0x0502000b, 0x41782800, 0x60043000, - 0x4d400000, 0x60a68000, 0x0511fe47, 0x5c028000, - 0x64126407, 0x641e6203, 0x6406642c, 0x0501f005, - 0x64066203, 0x602c0800, 0x05e5fe95, 0x05f5fbcb, - 0x5c026000, 0x0509f8b9, 0x0500001e, 0x0509ff3d, - 0x0502001e, 0x0501f99c, 0x0501f01a, 0x42000000, - 0x0010b059, 0x0515fd34, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010ec6c, 0x42000000, 0x0010b056, - 0x0515fd2d, 0x59340200, 0x84000558, 0x48026a00, - 0x600c3000, 0x41782800, 0x60142000, 0x4d400000, - 0x4d440000, 0x59368c03, 0x60a68000, 0x050df9a1, - 0x5c028800, 0x5c028000, 0x5c027800, 0x05d5fa5a, - 0x0005fc5a, 0x0501f002, 0x05fdfcdf, 0x5c025800, - 0x5c00b000, 0x1c01f000, 0x4933c857, 0x41380000, - 0xb1383498, 0x05c61f6e, 0x0c01f001, 0x001072e7, - 0x001072e4, 0x001072e7, 0x001072e7, 0x001072e7, - 0x001072e7, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e7, 0x001072e3, - 0x001072e7, 0x001072e7, 0x001072e3, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e3, 0x001072e7, - 0x001072e3, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e3, 0x001072e7, 0x001072e7, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e7, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e7, 0x001072e7, - 0x001072e3, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e7, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e7, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e7, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e7, 0x001072e3, 0x001072e7, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e3, 0x001072e3, - 0x001072e3, 0x001072e3, 0x001072e3, 0x05c5ff0c, - 0x64066203, 0x493a6403, 0x05f5f33c, 0x4933c857, - 0x64066203, 0x493a6403, 0x05f5f338, 0x59300403, - 0xb0003498, 0x05c61f02, 0x91383593, 0x05000083, - 0x913835a7, 0x05020043, 0x4933c857, 0x05f5fbdf, - 0x0515fbcf, 0x0509f914, 0x0500000c, 0x0509f926, - 0x0500003a, 0x59300403, 0x90000da2, 0x05020034, - 0x60140004, 0x05fdfca1, 0x05000031, 0x05fdfcb4, - 0x05000031, 0x0501f031, 0x600c0004, 0x05fdfc9b, - 0x0500002b, 0x05d5f9cc, 0x601c0800, 0x05e5fde4, - 0x0501f8f1, 0x4d440000, 0x59368c03, 0x83440580, - 0x000007fe, 0x05020007, 0x59a8121b, 0x84081540, - 0x05e9ff1d, 0x05020002, 0x8408154a, 0x480b521b, - 0x60a68000, 0x05f5fb22, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010ec6c, 0x5c027800, 0x916c0583, - 0x0500000b, 0x5932680a, 0x59340008, 0x800001c0, - 0x05020007, 0x59368c03, 0x4933c857, 0x4937c857, - 0x4947c857, 0x05e5fe7e, 0x0501f008, 0x42000000, - 0x0010b056, 0x0515fc6c, 0x60543000, 0x41782800, - 0x600c2000, 0x050df8e7, 0x5c028800, 0x0509fba6, - 0x0005f45a, 0x1c01f000, 0x0501f8c7, 0x05fdf7fc, - 0x91380594, 0x0500000c, 0x4933c857, 0xb13805a1, - 0x05000003, 0xb13805a0, 0x05fe07f7, 0x05f5fffa, - 0x05fe023c, 0x59300203, 0x9000058e, 0x0508015e, - 0x05c5feaf, 0x4933c857, 0x05f5fb90, 0x0515fb80, - 0x60082800, 0x59300403, 0xb0000591, 0x050c0258, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ec6c, - 0x5c027800, 0x60583000, 0x41782800, 0x4d400000, - 0x4d440000, 0x59368c03, 0x60242000, 0x60a68000, - 0x050df8c0, 0x5c028800, 0x5c028000, 0x42000000, - 0x0010b056, 0x0515fc3c, 0x0509f8af, 0x0502000b, - 0x05d5f975, 0x0501f89c, 0x59340c03, 0x82040580, - 0x000007fe, 0x05fe07ce, 0x59a80a1b, 0x84040d40, - 0x4807521b, 0x05fdf7ca, 0x0509f8b7, 0x05020003, - 0x0501f891, 0x05fdf7c6, 0x59300403, 0x90000db2, - 0x05020003, 0x05d5fe8e, 0x05fdf7c1, 0x90000da2, - 0x05000889, 0x05fdf7be, 0x4933c857, 0x4803c857, - 0x0c01f001, 0x001073d6, 0x001073d6, 0x001073d6, - 0x001073d6, 0x001073d6, 0x001073d6, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073d5, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073d5, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073d5, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073d5, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073d5, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073d5, 0x001073db, - 0x001073f1, 0x001073d5, 0x001073f1, 0x001073f1, - 0x001073d5, 0x001073d5, 0x001073d5, 0x001073d5, - 0x001073d5, 0x001073f1, 0x001073f1, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073d5, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073d5, 0x001073e9, - 0x001073f1, 0x001073d5, 0x001073e4, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073e4, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073f1, 0x001073e7, - 0x001073d5, 0x001073d5, 0x001073d5, 0x001073d5, - 0x001073f1, 0x001073f1, 0x001073d5, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073f1, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073f1, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073f1, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073f1, 0x001073d5, - 0x001073f1, 0x001073d5, 0x001073d5, 0x001073d5, - 0x001073d5, 0x001073d5, 0x001073d5, 0x001073d5, - 0x001073d5, 0x05c5fe1a, 0x640a6203, 0x0509fb19, - 0x05000002, 0x643a6203, 0x0509f0a6, 0x64166203, - 0x59a80030, 0x48026205, 0x0509fb12, 0x05000002, + 0x59325809, 0x592e5801, 0x912cac06, 0x91cca406, + 0x59a8088c, 0x82040d00, 0x000003ff, 0x9004148f, + 0x05001011, 0x603cb000, 0x0519f97e, 0x592e5801, + 0x912cac06, 0x90080c8f, 0x05001008, 0x603cb000, + 0x0519f978, 0x592e5801, 0x912cac06, 0x9004148f, + 0x05001005, 0x603c1000, 0x4008b000, 0x0519f971, + 0x0501f003, 0x4004b000, 0x0519f96e, 0x5931d82d, + 0x58ef400a, 0x58ee580c, 0x4a025a05, 0x00000103, + 0x592e5801, 0x58ec0008, 0x0801f800, 0x0005fc5a, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c500000, + 0x4c540000, 0x4c580000, 0x59cc0006, 0x82000d80, + 0x01000000, 0x05000021, 0x59cc0007, 0x9000b1c0, + 0x8258b500, 0x000000ff, 0x8058b104, 0x9058b402, + 0x90580c87, 0x05001002, 0x6018b000, 0x91cca406, + 0x59301009, 0x800811c0, 0x05c80829, 0x9008ac06, + 0x0519f948, 0x82000d00, 0xff000000, 0x800409c0, + 0x05000014, 0x8200b500, 0x000000ff, 0x05000011, + 0x8058b104, 0x90580c8e, 0x05001002, 0x6034b000, + 0x58081001, 0x800811c0, 0x05c80819, 0x9008ac06, + 0x0519f938, 0x0501f007, 0x59301009, 0x800811c0, + 0x05c80813, 0x48001006, 0x59cc0007, 0x48001007, + 0x05fdff33, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x4c500000, 0x4c540000, 0x4c580000, 0x6008b000, + 0x59cc0806, 0x82040580, 0x01000000, 0x05000004, + 0x8204b500, 0x0000ffff, 0x8058b104, 0x91cca406, + 0x59300009, 0x9000ac06, 0x0519f91a, 0x05fdff1c, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, + 0x1c01f000, 0x4933c857, 0x4803c857, 0x4807c857, + 0x480bc857, 0x480fc857, 0x4813c857, 0x481bc857, + 0x492fc857, 0x4d2c0000, 0x4c000000, 0x05c9fb62, + 0x5c000000, 0x0500000d, 0x48025803, 0x481a5801, + 0x48125808, 0x48065805, 0x480a5806, 0x480e5807, + 0x5c001000, 0x4c080000, 0x480a5809, 0x412c1000, + 0x0001f81c, 0x90000541, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x4937c857, 0x4d1c0000, 0x05f5fa0c, + 0x05020020, 0x59cc0001, 0x82000500, 0x00ffffff, + 0x59341002, 0x82081500, 0x00ffffff, 0x80080580, + 0x05020018, 0x497a6205, 0x60d40800, 0x0509ff24, + 0x0502000f, 0x591c001e, 0x800001c0, 0x0500000c, + 0x497a381e, 0x591c0416, 0x8c000502, 0x05c40fc0, + 0x84000502, 0x48023c16, 0x591c1407, 0x90080583, + 0x05000005, 0x90080586, 0x05000005, 0x05fdfc90, + 0x0501f004, 0x0501f805, 0x0501f002, 0x0501f8c4, + 0x5c023800, 0x1c01f000, 0x4d2c0000, 0x591e5809, + 0x4933c857, 0x491fc857, 0x493bc857, 0x492fc857, + 0x91380595, 0x050000b8, 0x91380596, 0x050200b4, + 0x4d300000, 0x411e6000, 0x59cc0207, 0x4803c857, + 0x82000d00, 0x0000ff00, 0x82040580, 0x00001700, + 0x05000004, 0x82040580, 0x00000300, 0x05020065, + 0x0509fe7d, 0x05000006, 0x591c0403, 0xb0000590, + 0x05020003, 0x05fdfc6e, 0x0501f09d, 0x591c0203, + 0x4803c857, 0x9000058d, 0x05000041, 0x812e59c0, + 0x0500009a, 0x591c0202, 0x4803c857, 0x82000580, + 0x0000ffff, 0x05020082, 0x0509fe6b, 0x05000004, + 0x591c0203, 0x90000d8e, 0x0502007d, 0x592c020b, + 0x4803c857, 0x90000503, 0x90000582, 0x05020007, + 0x592c0810, 0x591c0013, 0x4803c857, 0x4807c857, + 0x80040580, 0x05020072, 0x591c0416, 0x4803c857, + 0x8c000500, 0x0502006e, 0x42000000, 0x0010b2bc, + 0x0515ffc9, 0x41780800, 0x591c1006, 0x60280000, + 0x05f5fc7e, 0x592c0407, 0x4803c857, 0x800001c0, + 0x0500000b, 0x80080c80, 0x05001003, 0x05c60f68, + 0x80001040, 0x480a5c07, 0x800811c0, 0x05020004, + 0x0201f800, 0x0010f70c, 0x0501f069, 0x0509fb48, + 0x591c0819, 0x591c001a, 0x48065809, 0x4802580a, + 0x592e4411, 0x81224110, 0x59300008, 0x8c000500, + 0x05ce093f, 0x497a3809, 0x0001faa7, 0x0502004c, + 0x411e6000, 0x05fdfc2a, 0x0501f059, 0x05fdfc5e, + 0x05000015, 0x591c0006, 0x48026006, 0x4926601d, + 0x4936600a, 0x0509fe1d, 0x640e6407, 0x492e6009, + 0x591c0819, 0x591c101a, 0x48066019, 0x480a601a, + 0x4d380000, 0x591e7403, 0x4d300000, 0x411e6000, + 0x05fdfc17, 0x5c026000, 0x0005fc78, 0x5c027000, + 0x0501f043, 0x59a80030, 0x48023a05, 0x0501f040, + 0x59cc0407, 0x9000058b, 0x05020026, 0x59340a00, + 0x84040d0e, 0x48066a00, 0x592c0a05, 0x82040d00, + 0x000000ff, 0x90040d94, 0x05000002, 0x640e6229, + 0x59300008, 0x8c000500, 0x05ce0911, 0x4d400000, + 0x497a5c0a, 0x600e8000, 0x592c0a09, 0x05e9fe1f, + 0x0519f893, 0x05020006, 0x0001fb5b, 0x59300a29, + 0x90040d83, 0x05080b06, 0x497a6009, 0x5c028000, + 0x4a026403, 0x00000085, 0x64266203, 0x640a6407, + 0x42000800, 0x80004040, 0x050dfba7, 0x0005fb2e, + 0x4203e000, 0xb0800000, 0x6023f800, 0x0501f018, + 0x59cc0207, 0x82000580, 0x00002a00, 0x05020004, + 0x59a80030, 0x48023a05, 0x0501f011, 0x812e59c0, + 0x05c40f07, 0x0001ff6c, 0x497a6027, 0x4a025a05, + 0x00000103, 0x591c0008, 0x8c000500, 0x05ce08e8, + 0x591c0402, 0x48025c07, 0x640e5a07, 0x497a5c0a, + 0x0001fb5b, 0x05fdfbd2, 0x05e9fa1f, 0x5c026000, + 0x0005fc5a, 0x0501f002, 0x5c026000, 0x5c025800, + 0x1c01f000, 0x0501f813, 0x05fdf7fd, 0x4933c857, + 0x91380595, 0x05020004, 0x59a80030, 0x48023a05, + 0x0501f009, 0x91380596, 0x05020009, 0x4d300000, + 0x411e6000, 0x0515fb29, 0x0005faec, 0x0005fc5a, + 0x5c026000, 0x497a381e, 0x0005fc5a, 0x1c01f000, + 0x4c5c0000, 0x591c0416, 0x84000540, 0x48023c16, + 0x59ccb80b, 0x4933c857, 0x491fc857, 0x492fc857, + 0x4803c857, 0x485fc857, 0x0509fdb7, 0x05020007, + 0x8c5c053c, 0x05000005, 0x59a80030, 0x48023a05, + 0x497a381e, 0x0501f064, 0x4d300000, 0x411e6000, + 0x0505fe21, 0x5c026000, 0x591c0407, 0x90000580, + 0x0500005d, 0x591c0403, 0xb0000590, 0x0502000a, + 0x4d300000, 0x411e6000, 0x64066203, 0x42000800, + 0x80000043, 0x0005fb2e, 0x5c026000, 0x497a381e, + 0x0501f051, 0x591c0203, 0x9000058d, 0x0500001c, + 0x812e59c0, 0x05c40eb6, 0x592c020b, 0x4803c857, + 0x8c000500, 0x0502001b, 0x8c000502, 0x05000014, + 0x591c0416, 0x8c00051c, 0x05020007, 0x591c0013, + 0x4803c857, 0x800001c0, 0x0500000d, 0x591c0014, + 0x48023818, 0x4a023814, 0x0fffffff, 0x592c0209, + 0x8400051e, 0x48025a09, 0x42000000, 0x0010b2be, + 0x0515fef5, 0x64063a16, 0x0501f016, 0x42000000, + 0x0010b2bf, 0x0515fef0, 0x641e3a16, 0x0501f011, + 0x8c5c053a, 0x05fe07fa, 0x59cc000a, 0x592c1810, + 0x4803c857, 0x480fc857, 0x800c0580, 0x05fc07f4, + 0x59cc000a, 0x4803c857, 0x48023818, 0x48023817, + 0x42000000, 0x0010b2bd, 0x0515fedf, 0x64163a16, + 0x0509fd69, 0x0500001a, 0x591c0416, 0x8c00051a, + 0x05000017, 0x4803c857, 0x8c00051e, 0x05000016, + 0x4130b800, 0x05fdfb8c, 0x0500000f, 0x4926601d, + 0x64066203, 0x647a6403, 0x585c041b, 0x4802641b, + 0x585c021b, 0x4802621b, 0x591e680a, 0x4936600a, + 0x0509fd46, 0x64066407, 0x42000800, 0x80000040, + 0x0005fb2e, 0x405e6000, 0x0501f003, 0x5c00b800, + 0x0509f3fa, 0x5c00b800, 0x0005f45a, 0x4933c857, + 0x4d1c0000, 0x05f5f89e, 0x0502003f, 0x59cc0001, + 0x59341002, 0x80080580, 0x82000500, 0x00ffffff, + 0x05020037, 0x5930141b, 0x0509fe01, 0x05c40e5c, + 0x591c1407, 0x90080587, 0x05000031, 0x90080582, + 0x0500002f, 0x90080580, 0x0500002d, 0x591c0202, + 0x82000d80, 0x0000ffff, 0x05000004, 0x59301a1b, + 0x800c0580, 0x05020026, 0x91380595, 0x05000022, + 0x4d300000, 0x4d2c0000, 0x411e6000, 0x59325809, + 0x0509f94b, 0x05c40e46, 0x592c0205, 0x82000500, + 0x000000ff, 0x90000594, 0x05000002, 0x640e6229, + 0x497a5c0a, 0x600e8000, 0x592c0a09, 0x05e9fd37, + 0x0515ffab, 0x05020006, 0x0001fb5b, 0x59300a29, + 0x90040d83, 0x05080a1e, 0x497a6009, 0x5c025800, + 0x4a026403, 0x00000085, 0x64266203, 0x640a6407, + 0x42000800, 0x80004040, 0x0005fb2e, 0x5c026000, + 0x0501f003, 0x59a80030, 0x48023a05, 0x497a381e, + 0x0005fc5a, 0x5c023800, 0x1c01f000, 0x4933c857, + 0x4c580000, 0x4d2c0000, 0x59325809, 0x59342200, + 0x82102500, 0xffffdffd, 0x48126a00, 0x91383595, + 0x05000009, 0x0509f91e, 0x05000048, 0x0509ffa7, + 0x05020003, 0x6008b000, 0x0509ff89, 0x0501f9dd, + 0x0501f05b, 0x91cc1408, 0x6008b000, 0x91341c06, + 0x0501fe41, 0x0502000f, 0x91cc140a, 0x6008b000, + 0x91341c08, 0x0501fe3c, 0x0502000a, 0x05d5f8ec, + 0x59342200, 0x59cc1007, 0x800811c0, 0x05000003, + 0x480a6801, 0x84102542, 0x48126a00, 0x0501f04a, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ee7a, + 0x5c027800, 0x42000000, 0x0010b2d6, 0x0515fe4e, + 0x59340200, 0x84000558, 0x48026a00, 0x4d300000, + 0x05fdfb01, 0x05c40df2, 0x4926601d, 0x4936600a, + 0x497a6009, 0x64066407, 0x64066403, 0x600c3000, + 0x0515fc9a, 0x05d5fb7b, 0x59240400, 0x8c00050a, + 0x0502000b, 0x41782800, 0x60043000, 0x4d400000, + 0x60a68000, 0x0511ff1f, 0x5c028000, 0x64126407, + 0x641e6203, 0x6406642c, 0x0501f005, 0x64066203, + 0x602c0800, 0x05e5fda9, 0x05f5fbce, 0x5c026000, + 0x0509f8db, 0x0500001e, 0x0509ff64, 0x0502001e, + 0x0501f99c, 0x0501f01a, 0x42000000, 0x0010b2d9, + 0x0515fe25, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010ee7a, 0x42000000, 0x0010b2d6, 0x0515fe1e, + 0x59340200, 0x84000558, 0x48026a00, 0x600c3000, + 0x41782800, 0x60142000, 0x4d400000, 0x4d440000, + 0x59368c03, 0x60a68000, 0x050df9c8, 0x5c028800, + 0x5c028000, 0x5c027800, 0x05d5f89d, 0x0005fc5a, + 0x0501f002, 0x05fdfcda, 0x5c025800, 0x5c00b000, + 0x1c01f000, 0x4933c857, 0x41380000, 0xb1383498, + 0x05c61daf, 0x0c01f001, 0x001074a6, 0x001074a3, + 0x001074a6, 0x001074a6, 0x001074a6, 0x001074a6, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a6, 0x001074a2, 0x001074a6, + 0x001074a6, 0x001074a2, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a2, 0x001074a6, 0x001074a2, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a2, + 0x001074a6, 0x001074a6, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a6, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a6, 0x001074a6, 0x001074a2, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a6, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a6, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a6, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a6, + 0x001074a2, 0x001074a6, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a2, 0x001074a2, 0x001074a2, + 0x001074a2, 0x001074a2, 0x05c5fd4d, 0x64066203, + 0x493a6403, 0x05f5f33f, 0x4933c857, 0x64066203, + 0x493a6403, 0x05f5f33b, 0x59300403, 0xb0003498, + 0x05c61d43, 0x91383593, 0x05000083, 0x913835a7, + 0x05020043, 0x4933c857, 0x05f5fbe2, 0x0515fcc0, + 0x0509f936, 0x0500000c, 0x0509f948, 0x0500003a, + 0x59300403, 0x90000da2, 0x05020034, 0x60140004, + 0x05fdfc9c, 0x05000031, 0x05fdfcb4, 0x05000031, + 0x0501f031, 0x600c0004, 0x05fdfc96, 0x0500002b, + 0x05d5f80f, 0x601c0800, 0x05e5fcf8, 0x0501f8f1, + 0x4d440000, 0x59368c03, 0x83440580, 0x000007fe, + 0x05020007, 0x59a8121b, 0x84081540, 0x05e9fe63, + 0x05020002, 0x8408154a, 0x480b521b, 0x60a68000, + 0x05f5fb25, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010ee7a, 0x5c027800, 0x916c0583, 0x0500000b, + 0x5932680a, 0x59340008, 0x800001c0, 0x05020007, + 0x59368c03, 0x4933c857, 0x4937c857, 0x4947c857, + 0x05e5fd95, 0x0501f008, 0x42000000, 0x0010b2d6, + 0x0515fd5d, 0x60543000, 0x41782800, 0x600c2000, + 0x050df90e, 0x5c028800, 0x0509fbc8, 0x0005f45a, + 0x1c01f000, 0x0501f8c7, 0x05fdf7fc, 0x91380594, + 0x0500000c, 0x4933c857, 0xb13805a1, 0x05000003, + 0xb13805a0, 0x05fe07f7, 0x05f5fffd, 0x05fe0235, + 0x59300203, 0x9000058e, 0x05080180, 0x05c5fcf0, + 0x4933c857, 0x05f5fb93, 0x0515fc71, 0x60082800, + 0x59300403, 0xb0000591, 0x050c027f, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010ee7a, 0x5c027800, + 0x60583000, 0x41782800, 0x4d400000, 0x4d440000, + 0x59368c03, 0x60242000, 0x60a68000, 0x050df8e7, + 0x5c028800, 0x5c028000, 0x42000000, 0x0010b2d6, + 0x0515fd2d, 0x0509f8d1, 0x0502000b, 0x05d1ffb8, + 0x0501f89c, 0x59340c03, 0x82040580, 0x000007fe, + 0x05fe07ce, 0x59a80a1b, 0x84040d40, 0x4807521b, + 0x05fdf7ca, 0x0509f8d9, 0x05020003, 0x0501f891, + 0x05fdf7c6, 0x59300403, 0x90000db2, 0x05020003, + 0x05d5fd72, 0x05fdf7c1, 0x90000da2, 0x05000889, + 0x05fdf7be, 0x4933c857, 0x4803c857, 0x0c01f001, + 0x00107595, 0x00107595, 0x00107595, 0x00107595, + 0x00107595, 0x00107595, 0x00107594, 0x00107594, + 0x00107594, 0x00107594, 0x00107594, 0x00107594, + 0x00107594, 0x00107594, 0x00107594, 0x00107594, + 0x00107594, 0x00107594, 0x00107594, 0x00107594, + 0x00107594, 0x00107594, 0x00107594, 0x00107594, + 0x00107594, 0x00107594, 0x00107594, 0x00107594, + 0x00107594, 0x00107594, 0x0010759a, 0x001075b0, + 0x00107594, 0x001075b0, 0x001075b0, 0x00107594, + 0x00107594, 0x00107594, 0x00107594, 0x00107594, + 0x001075b0, 0x001075b0, 0x00107594, 0x00107594, + 0x00107594, 0x00107594, 0x00107594, 0x00107594, + 0x00107594, 0x00107594, 0x001075a8, 0x001075b0, + 0x00107594, 0x001075a3, 0x00107594, 0x00107594, + 0x00107594, 0x001075a3, 0x00107594, 0x00107594, + 0x00107594, 0x001075b0, 0x001075a6, 0x00107594, + 0x00107594, 0x00107594, 0x00107594, 0x001075b0, + 0x001075b0, 0x00107594, 0x00107594, 0x00107594, + 0x00107594, 0x001075b0, 0x00107594, 0x00107594, + 0x00107594, 0x001075b0, 0x00107594, 0x00107594, + 0x00107594, 0x001075b0, 0x00107594, 0x00107594, + 0x00107594, 0x001075b0, 0x00107594, 0x001075b0, + 0x00107594, 0x00107594, 0x00107594, 0x00107594, + 0x00107594, 0x00107594, 0x00107594, 0x00107594, + 0x05c5fc5b, 0x640a6203, 0x0509fb3b, 0x05000002, + 0x643a6203, 0x0509f0c8, 0x64166203, 0x59a80030, + 0x48026205, 0x0509fb34, 0x05000002, 0x643a6203, + 0x59a8002e, 0x48026006, 0x1c01f000, 0x5930082a, + 0x49780a05, 0x0501f00b, 0x0509fb10, 0x0005f45a, + 0x05d5fcf6, 0x05f5fb96, 0x05000003, 0x05f5fae9, + 0x0005f45a, 0x05f5fae7, 0x0005fc5a, 0x05f5f37c, + 0x4933c857, 0x640a6203, 0x0509fb1f, 0x05000002, 0x643a6203, 0x59a8002e, 0x48026006, 0x1c01f000, - 0x5930082a, 0x49780a05, 0x0501f00b, 0x0509faee, - 0x0005f45a, 0x05d5fe12, 0x05f5fb93, 0x05000003, - 0x05f5fae6, 0x0005f45a, 0x05f5fae4, 0x0005fc5a, - 0x05f5f379, 0x4933c857, 0x640a6203, 0x0509fafd, - 0x05000002, 0x643a6203, 0x59a8002e, 0x48026006, - 0x1c01f000, 0x4933c857, 0x0505ff18, 0x05000025, - 0x4d2c0000, 0x0509fd9b, 0x05020007, 0x4d400000, - 0x60c68000, 0x60100800, 0x0509fbda, 0x5c028000, - 0x0501f01b, 0x59300c07, 0x90040590, 0x05000003, - 0x90040591, 0x05020007, 0x64c65a07, 0x6412580e, - 0x4a02580f, 0x000000ff, 0x0001fb5b, 0x0501f010, - 0x592c0405, 0x8c00051e, 0x0500000d, 0x4a025a05, - 0x00000103, 0x4a025806, 0x01000000, 0x4da00000, - 0x4cec0000, 0x5931d82d, 0x58ef400a, 0x58ec0008, - 0x0801f800, 0x5c01d800, 0x5c034000, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x59340400, 0x82000500, - 0x000000ff, 0x9000348c, 0x05c61dc9, 0x59303403, - 0xb0180d8d, 0x05080316, 0x90180db3, 0x050802da, - 0x90180da8, 0x05080026, 0x90180da9, 0x05080031, - 0xb0180d97, 0x050c00e2, 0x90180d9f, 0x05fc031a, - 0xb0180d95, 0x05fc02fa, 0x90180d80, 0x05fc05d5, - 0x90180da2, 0x05fc0336, 0x90180db5, 0x05fc041e, - 0x90180db9, 0x05fc058b, 0x90180dbd, 0x05fc0385, - 0xb0180d84, 0x05fc03b1, 0xb0180d89, 0x05fc03e4, - 0xb0180d83, 0x0508041f, 0xb0180d91, 0x05080479, + 0x4933c857, 0x0505ff3a, 0x05000025, 0x4d2c0000, + 0x0509fdc2, 0x05020007, 0x4d400000, 0x60c68000, + 0x60100800, 0x0509fbfc, 0x5c028000, 0x0501f01b, + 0x59300c07, 0x90040590, 0x05000003, 0x90040591, + 0x05020007, 0x64c65a07, 0x6412580e, 0x4a02580f, + 0x000000ff, 0x0001fb5b, 0x0501f010, 0x592c0405, + 0x8c00051e, 0x0500000d, 0x4a025a05, 0x00000103, + 0x4a025806, 0x01000000, 0x4da00000, 0x4cec0000, + 0x5931d82d, 0x58ef400a, 0x58ec0008, 0x0801f800, + 0x5c01d800, 0x5c034000, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x83340580, 0x0010ce8f, 0x05020007, + 0x91380d95, 0x05000003, 0x91380d96, 0x05fe0149, + 0x0515fb8d, 0x0005f45a, 0x59340400, 0x82000500, + 0x000000ff, 0x9000348c, 0x05c61c01, 0x59303403, + 0xb0180d8d, 0x0508032f, 0x90180db3, 0x050802f3, + 0x90180da8, 0x0508003f, 0x90180da9, 0x0508004a, + 0xb0180d97, 0x050c0100, 0x90180d9f, 0x05fc030c, + 0xb0180d95, 0x05fc02ec, 0x90180d80, 0x05fc05cc, + 0x90180da2, 0x05fc0328, 0x90180db5, 0x05fc0415, + 0x90180db9, 0x05fc0582, 0x90180dbd, 0x05fc037c, + 0xb0180d84, 0x05fc03a8, 0xb0180d89, 0x05fc03db, + 0xb0180d83, 0x05080438, 0xb0180d91, 0x05080492, 0x90180d84, 0x05020002, 0x60040000, 0x91380d95, - 0x05000004, 0x91380d96, 0x05fe012a, 0x0501f1ee, - 0x4c000000, 0x0515fa74, 0x5c000000, 0x4d2c0000, + 0x05000004, 0x91380d96, 0x05fe011a, 0x0501f1f0, + 0x4c000000, 0x0515fb5c, 0x5c000000, 0x4d2c0000, 0x4d3c0000, 0x0c01f804, 0x5c027800, 0x5c025800, - 0x1c01f000, 0x0010746c, 0x00107470, 0x0010746c, - 0x001074c2, 0x0010746c, 0x001075c6, 0x00107650, - 0x0010746c, 0x0010746c, 0x00107614, 0x0010746c, - 0x0010761f, 0x4933c857, 0x497a6008, 0x59300809, + 0x1c01f000, 0x00107634, 0x00107638, 0x00107634, + 0x0010768a, 0x00107634, 0x00107790, 0x0010781a, + 0x00107634, 0x00107634, 0x001077de, 0x00107634, + 0x001077e9, 0x4933c857, 0x497a6008, 0x59300809, 0x58040000, 0x4a000a05, 0x00000103, 0x0005f45a, 0x4933c857, 0x40000000, 0x40000000, 0x1c01f000, - 0x4933c857, 0x05e5ff49, 0x59a80077, 0xb00005b4, - 0x0502003e, 0x0511fbb4, 0x0502000e, 0x0501f83e, - 0x0505fe9a, 0x05000009, 0x0509fd1e, 0x05020007, - 0x41780800, 0x4d400000, 0x60028000, 0x0509fb5d, - 0x5c028000, 0x0501f002, 0x05d5f84f, 0x0005f45a, - 0x0505fe8e, 0x05000005, 0x0509fd12, 0x05020003, - 0x05fdff71, 0x0005f45a, 0x417a7800, 0x0201f800, - 0x0010ec6c, 0x42000000, 0x0010b056, 0x0515fb06, + 0x4933c857, 0x05e5fe5b, 0x59a80077, 0xb00005b4, + 0x0502003e, 0x0511fc83, 0x0502000e, 0x0501f83e, + 0x0505feb3, 0x05000009, 0x0509fd3c, 0x05020007, + 0x41780800, 0x4d400000, 0x60028000, 0x0509fb76, + 0x5c028000, 0x0501f002, 0x05d1fe89, 0x0005f45a, + 0x0505fea7, 0x05000005, 0x0509fd30, 0x05020003, + 0x05fdff68, 0x0005f45a, 0x417a7800, 0x0201f800, + 0x0010ee7a, 0x42000000, 0x0010b2d6, 0x0515fbee, 0x59340200, 0x84000558, 0x48026a00, 0x600c3000, - 0x0515f95a, 0x4d300000, 0x05fdf8af, 0x05c40d58, + 0x0515fa42, 0x4d300000, 0x05fdf89f, 0x05c40b90, 0x4926601d, 0x4936600a, 0x497a6009, 0x64066407, 0x64066403, 0x59240400, 0x8c00050a, 0x0502000b, 0x64126407, 0x641e6203, 0x6406642c, 0x60043000, - 0x4d400000, 0x60a68000, 0x41782800, 0x0511fbee, - 0x5c028000, 0x0501f005, 0x602c0800, 0x05e5fc40, - 0x64066203, 0x05f5f975, 0x5c026000, 0x05fdff4a, - 0x05d5f821, 0x0005f45a, 0x05fdff47, 0x60040000, - 0x0501f0d6, 0x4933c857, 0x59340200, 0x8c000500, - 0x05000009, 0x4d3c0000, 0x417a7800, 0x05e5fc25, + 0x4d400000, 0x60a68000, 0x41782800, 0x0511fcbd, + 0x5c028000, 0x0501f005, 0x602c0800, 0x05e5fb4b, + 0x64066203, 0x05f5f96f, 0x5c026000, 0x05fdff41, + 0x05d1fe5b, 0x0005f45a, 0x05fdff3e, 0x60040000, + 0x0501f0d8, 0x4933c857, 0x59340200, 0x8c000500, + 0x05000009, 0x4d3c0000, 0x417a7800, 0x05e5fb30, 0x5c027800, 0x8d0c0520, 0x05000003, 0x60180800, - 0x05e5fc2b, 0x1c01f000, 0x4933c857, 0x59a80877, + 0x05e5fb36, 0x1c01f000, 0x4933c857, 0x59a80877, 0xb00405b4, 0x0500000e, 0x4807c857, 0x82040580, - 0x00000100, 0x050200ad, 0x59cc0408, 0x4803c857, - 0x8c000500, 0x050000a9, 0x59341403, 0x82080580, - 0x000007fe, 0x05000006, 0x0501f0a4, 0x59341403, - 0x82080580, 0x000007fe, 0x05020013, 0x59a8021b, + 0x00000100, 0x050200af, 0x59cc0408, 0x4803c857, + 0x8c000500, 0x050000ab, 0x59341403, 0x82080580, + 0x000007fe, 0x05000006, 0x0501f0a6, 0x59341403, + 0x82080580, 0x000007fe, 0x05020015, 0x59a8021b, 0x8c000506, 0x0500000e, 0x59cc0000, 0x82000500, 0x000000ff, 0x59240c08, 0x80040580, 0x05000008, - 0x05d1fff1, 0x0005fc5a, 0x42000000, 0x0010b047, - 0x0515fab1, 0x6006d800, 0x05e5f04f, 0x0501fa6d, - 0x0501f046, 0x41780800, 0x05e5fcea, 0x59341403, - 0x82080580, 0x000007fc, 0x05020024, 0x4a026802, - 0x00fffffc, 0x0505fe21, 0x0500000c, 0x0509fca5, - 0x0502000a, 0x0501f8ac, 0x41780800, 0x4d400000, - 0x60028000, 0x0509fae3, 0x5c028000, 0x60100800, - 0x05e5fbef, 0x0005f45a, 0x60100800, 0x05e5fbec, - 0x05d1ffd1, 0x59300c29, 0x900405a1, 0x05000003, - 0xb0040591, 0x0006045a, 0x05d5fa21, 0x61f6880f, - 0x42003000, 0x00fffffd, 0x05e5fc0b, 0x05c60ce4, - 0x4936600a, 0x497a6c12, 0x640e601e, 0x64066203, - 0x648a6403, 0x05f5f111, 0x59a8008d, 0x8c000502, - 0x0500000d, 0x05e9fd18, 0x60401000, 0x05020008, - 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, - 0x00ff0000, 0x05000004, 0x60201000, 0x05e9f9fe, - 0x05020056, 0x0505fdf1, 0x05000057, 0x0509fc75, - 0x05020005, 0x592c0405, 0x8c00051c, 0x05fe07ca, - 0x0501f879, 0x60140800, 0x05e5fbc1, 0x64066203, - 0x640e6403, 0x05f5f0f5, 0x59cc0408, 0x8c000518, - 0x05000017, 0x0509f978, 0x05e9fcfb, 0x05000008, - 0x59cc0408, 0x8c000516, 0x05000005, 0x59300429, - 0x900005a1, 0x05fe07b8, 0x1c01f000, 0x59a8021b, - 0x8400054a, 0x4803521b, 0x4803541b, 0x59a8000f, - 0x497b8830, 0x84000570, 0x48038832, 0x59300429, - 0x900005a1, 0x05fe07ac, 0x1c01f000, 0x59a8021b, - 0xb0000510, 0xb0000590, 0x05000009, 0x61bc1001, - 0x42024800, 0x0010b111, 0x480a4805, 0x480b500f, - 0x497b8830, 0x84081570, 0x480b8832, 0x0509f973, - 0x59a8021b, 0x84000548, 0x4803521b, 0x4803541b, - 0x0511fb1a, 0x05fe0798, 0x599c0019, 0x8c000510, - 0x0502002d, 0x59a8021b, 0x8400054c, 0x4803521b, - 0x601c0800, 0x05e5fb8a, 0x417a7800, 0x05e5fb7d, - 0x61bc3801, 0x61a00001, 0x05f1f917, 0x05e40bae, - 0x05c60c87, 0x4936600a, 0x05e5fe56, 0x05020002, - 0x497a6416, 0x59340200, 0x8400051a, 0x48026a00, - 0x600c0800, 0x05e5fb7a, 0x64066407, 0x64066203, - 0x640a6403, 0x05f5f0ad, 0x05fdfe83, 0x60040000, - 0x0501f012, 0x599c0017, 0x8c00050a, 0x05fc07ae, - 0x60100800, 0x05e5fb6e, 0x49375082, 0x59a8021b, - 0x8c000508, 0x05000008, 0x599c0018, 0x8c00051c, - 0x05000005, 0x61a00807, 0x42001000, 0x0010f674, - 0x05f1fed4, 0x0005f45a, 0x4933c857, 0x80003540, - 0x05000003, 0x601c0800, 0x05e5fb5d, 0x801831c0, - 0x0502000f, 0x59302009, 0x801021c0, 0x05000004, - 0x58100405, 0x8c00051e, 0x05020009, 0x59341c03, - 0x60102000, 0x60483000, 0x4d200000, 0x59364013, - 0x81224130, 0x05ddffd7, 0x5c024000, 0x05d1ff32, - 0x0005f45a, 0x4c5c0000, 0x4d2c0000, 0x59325809, - 0x0005f8e2, 0x5c025800, 0x59cc0008, 0x48002805, - 0x59cc0009, 0x48002806, 0x49782807, 0x49782808, - 0x49782809, 0x4978280a, 0x59cc0013, 0x8c00053e, - 0x05000009, 0x59cc0414, 0x900001c0, 0x59ccbc15, - 0x805c0540, 0x48002807, 0x59cc0416, 0x900001c0, - 0x48002808, 0x59cc0017, 0x8c00053e, 0x05000009, - 0x59cc0418, 0x900001c0, 0x59ccbc19, 0x805c0540, - 0x48002809, 0x59cc041a, 0x900001c0, 0x4800280a, - 0x5c00b800, 0x1c01f000, 0x4933c857, 0x59a80077, - 0x90000594, 0x0502003a, 0x59a8008d, 0x8c000502, - 0x05000011, 0x05e9fc60, 0x60401000, 0x05020008, - 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, - 0x00ff0000, 0x05000008, 0x60201000, 0x05e9f946, - 0x05000005, 0x59a8008d, 0x8400054c, 0x4803508d, - 0x0501f027, 0x916c0583, 0x0502000c, 0x59300009, - 0x80000540, 0x05020009, 0x59341c03, 0x60182000, - 0x604c3000, 0x4d200000, 0x59364013, 0x81224130, - 0x05ddff8c, 0x5c024000, 0x05e5fc5b, 0x05fdfeca, - 0x0501fa47, 0x05020016, 0x59340404, 0x80000540, - 0x05000013, 0x60180800, 0x05e5faf9, 0x0505fd1f, - 0x0500000d, 0x0509fba3, 0x05020007, 0x41780800, - 0x4d400000, 0x60028000, 0x0509f9e2, 0x5c028000, - 0x0005f45a, 0x4a025a05, 0x00000103, 0x4a025806, - 0x02000000, 0x05d1fed0, 0x0005f45a, 0x05e9f8d6, - 0x0505fd0e, 0x05000005, 0x0509fb92, 0x05020003, - 0x05fdfdf1, 0x0005f45a, 0x05fdfdef, 0x0515f8ba, - 0x80000580, 0x59a8008d, 0x8c00050c, 0x05000004, - 0x8400050c, 0x4803508d, 0x90000541, 0x05fdf777, - 0x4933c857, 0x59a80077, 0x90000594, 0x05020006, - 0x602c0800, 0x05e5fad2, 0x64066203, 0x64066403, - 0x05f5f006, 0x60040000, 0x05fdf76c, 0x4933c857, - 0x40003000, 0x59a80077, 0x90000584, 0x05020018, - 0x9018358b, 0x05020015, 0x5930081d, 0x58040200, - 0x8c000500, 0x05080771, 0x58040200, 0x8c000508, - 0x0500000c, 0x84000508, 0x48000a00, 0x600c0800, - 0x05e5fabb, 0x5930080a, 0x49780806, 0x4a026202, - 0x0000ffff, 0x64066203, 0x65466403, 0x05f1f7eb, - 0x601c0800, 0x05e5fab2, 0x0005f45a, 0x60040000, - 0x05fdf74e, 0x4803c857, 0x4d2c0000, 0x4d3c0000, - 0x0c01f804, 0x5c027800, 0x5c025800, 0x1c01f000, - 0x0010746c, 0x00107673, 0x0010746c, 0x001076b7, - 0x0010746c, 0x0010770c, 0x00107650, 0x0010746c, - 0x0010746c, 0x00107722, 0x0010746c, 0x0010772d, - 0x4933c857, 0x4d1c0000, 0x59301403, 0x90080583, - 0x0500001d, 0x9008159e, 0x05020019, 0x91381595, - 0x05020016, 0x4d300000, 0x5930141b, 0x0509f957, - 0x05c40b93, 0x591c1416, 0x8c08051e, 0x0500000b, - 0x05f9fee5, 0x05000009, 0x05e5fe8a, 0x4926601d, - 0x59340200, 0x8c000508, 0x05000003, 0x4a026416, - 0x00000100, 0x0505ff34, 0x82081500, 0xffff1fff, - 0x480a3c16, 0x5c026000, 0x0005fc5a, 0x5c023800, - 0x1c01f000, 0x05fdff55, 0x05fdf7fd, 0x4933c857, - 0x42000000, 0x0010b05a, 0x0515f91f, 0x0515f84e, - 0x05e5fd42, 0x0505fc99, 0x05000007, 0x0509fb1d, - 0x05020005, 0x6008b000, 0x0509faff, 0x05fdfd7a, - 0x0005f45a, 0x0501f8c3, 0x05020021, 0x417a7800, - 0x05e5fa5c, 0x417a7800, 0x0201f800, 0x0010ec6c, - 0x42000000, 0x0010b056, 0x0515f90b, 0x59340200, - 0x84000558, 0x48026a00, 0x640a6403, 0x600c3000, - 0x0511ff5e, 0x59240400, 0x8c00050a, 0x0502000b, - 0x4d400000, 0x41782800, 0x60143000, 0x60a68000, - 0x0511f9fd, 0x5c028000, 0x641e6203, 0x64126407, - 0x6406642c, 0x1c01f000, 0x600c0800, 0x05e5fa4c, - 0x64066203, 0x05f1ff81, 0x05fdf7fb, 0x59cc0407, - 0x90000589, 0x05020009, 0x59340412, 0x82000500, - 0x000000ff, 0x0500000b, 0x80000040, 0x48026c12, - 0x642a6006, 0x05fdf7f0, 0x59cc0207, 0x82000500, - 0x0000ff00, 0x82000580, 0x00001900, 0x05fc07d2, - 0x05fdfd45, 0x80000580, 0x05fdf6d4, 0x4933c857, - 0x0505fc5a, 0x0500000b, 0x0509fade, 0x05020009, - 0x4c580000, 0x6008b000, 0x0509fabf, 0x5c00b000, - 0x05fdfd39, 0x601c0800, 0x05e5fa29, 0x0005f45a, - 0x59340403, 0x82000580, 0x000007fc, 0x05020005, - 0x60100000, 0x05fdf8d5, 0x0500001a, 0x0501f026, - 0x05fdfd2d, 0x59cc3407, 0x82183500, 0x000000ff, - 0x90180585, 0x05000016, 0x9018058b, 0x05000011, - 0x59cc0207, 0x82000500, 0x0000ff00, 0x05020003, - 0x90180589, 0x0500000e, 0x82000580, 0x00001900, - 0x05020008, 0x90180589, 0x05000009, 0x60100800, - 0x05e5fa0b, 0x05d1fdf0, 0x0511ffe3, 0x0005f45a, - 0x0511ffe1, 0x60040000, 0x05fdf6a4, 0x0505fc2b, - 0x59325809, 0x05000008, 0x592c0205, 0x82000580, - 0x00000139, 0x05fc07f7, 0x592c0405, 0x8c00051e, - 0x05fe07f4, 0x59340412, 0x800001c0, 0x05000006, - 0x80000040, 0x48026c12, 0x642a6006, 0x645a6403, - 0x1c01f000, 0x59340403, 0x82000580, 0x000007fe, - 0x05020006, 0x59a8021b, 0x84000540, 0x4803521b, - 0x05e1ff3d, 0x05fdf7e3, 0x0511ffc3, 0x417a7800, - 0x0201f800, 0x0010ec6c, 0x60143000, 0x0511fee7, - 0x42000000, 0x0010b056, 0x0515f88b, 0x05fdf7da, - 0x4933c857, 0x0501f844, 0x05020006, 0x60140800, - 0x05e5f9db, 0x64066203, 0x640e6403, 0x05f1f70f, - 0x60100800, 0x05e5f9d6, 0x0509fa82, 0x05020007, - 0x4c580000, 0x6008b000, 0x0509fa63, 0x5c00b000, - 0x05fdfcdd, 0x0005f45a, 0x05fdfcdb, 0x0511ffa6, - 0x80000580, 0x05fdf669, 0x4933c857, 0x0501f82e, - 0x05020006, 0x60240800, 0x05e5f9c5, 0x64066203, - 0x64166403, 0x05f1f6f9, 0x0511ff9b, 0x60040000, - 0x05fdf65e, 0x4933c857, 0x5930081d, 0x58040200, - 0x8c000500, 0x05080669, 0x0501f81f, 0x05020006, - 0x602c0800, 0x05e5f9b6, 0x64066203, 0x64066403, - 0x05f1f6ea, 0x5930080a, 0x58040403, 0x82000580, - 0x000007fe, 0x05020004, 0x600c2800, 0x0509fe60, - 0x0005f45a, 0x0511ff84, 0x60040000, 0x05fdf647, - 0x4933c857, 0x59cc0407, 0x90000583, 0x05020009, - 0x59cc0207, 0x82000500, 0x0000ff00, 0x82000d80, - 0x00002a00, 0x05000003, 0x82000d80, 0x00001e00, - 0x1c01f000, 0x4933c857, 0x90000541, 0x1c01f000, - 0x4933c857, 0x4d400000, 0x4c580000, 0x60028000, - 0x05d1ffcf, 0x59a8021b, 0x90000543, 0x4803521b, - 0x0501f881, 0x05000005, 0x4d300000, 0x4d340000, - 0x4d440000, 0x0501f024, 0x0501f8aa, 0x05000028, - 0x4d300000, 0x4d340000, 0x4d440000, 0x83240580, - 0x0010b111, 0x0502001d, 0x59cc0408, 0x8c00051e, - 0x05020009, 0x42000800, 0x0010b111, 0x58040406, - 0x8c000500, 0x05020004, 0x59a8021b, 0x84000552, - 0x4803521b, 0x59240400, 0x8c00050a, 0x05020005, - 0x60aa8000, 0x61fe89ff, 0x60083000, 0x0511fe84, - 0x60aa8000, 0x4d3c0000, 0x60027804, 0x0201f800, - 0x0010ebe6, 0x5c027800, 0x42000000, 0x0010b056, - 0x0515f811, 0x05d1fe62, 0x05d5f85d, 0x600a8000, - 0x5c028800, 0x5c026800, 0x5c026000, 0x41780800, - 0x05e5fa48, 0x59cc0800, 0x82040d00, 0x00ffffff, - 0x59240200, 0xb0000566, 0x48024a00, 0x48064805, - 0x812000f0, 0x80040540, 0x48026813, 0x812241c0, - 0x05020005, 0x4c040000, 0x60040000, 0x05e9f86f, - 0x5c000800, 0x4927c857, 0x83240580, 0x0010b111, - 0x0502003a, 0x59a8121b, 0x59cc0408, 0x8c00051a, - 0x05020005, 0x84081514, 0x4a0370e5, 0x00000800, - 0x0501f004, 0x84081554, 0x4a0370e5, 0x00000c00, - 0x480b521b, 0x4807500f, 0x80040110, 0x48035018, - 0x48038881, 0x59a80a1b, 0x84040d50, 0x59cc0013, - 0x8c00053e, 0x05000003, 0x8c000536, 0x05000004, - 0x59cc0017, 0x8c000536, 0x05020002, 0x84040d10, - 0x4807521b, 0x4807541b, 0x59a8021b, 0x8c000506, - 0x0500000c, 0x916c0583, 0x05000004, 0x83240580, - 0x0010b111, 0x0500000b, 0x59240400, 0x8c00050c, - 0x05000008, 0x64866429, 0x0509f986, 0x0501f005, - 0x4c040000, 0x0509fdb1, 0x05d1ff11, 0x5c000800, - 0xb0040510, 0xb0000590, 0x05000008, 0x05e9fa5a, - 0x05000006, 0x59cc0009, 0x4803502c, 0x59cc000a, - 0x4803502d, 0x0505fed0, 0x5c00b000, 0x5c028000, - 0x1c01f000, 0x4933c857, 0x59a8141b, 0x82080580, - 0x0000ffff, 0x0500000b, 0x4c080000, 0x05e9fa4a, - 0x5c001000, 0x0502000b, 0x59cc0408, 0x8c000518, - 0x05000005, 0x8c08050a, 0x0500000a, 0x80000580, - 0x1c01f000, 0x8c080508, 0x05fe07fd, 0x0501f005, - 0x90080530, 0x05020003, 0x8c080506, 0x05fe07f8, - 0x4a03541b, 0x0000ffff, 0x42000000, 0x0010afa3, - 0x0511ff9d, 0x60303000, 0x61fc19ff, 0x601c2000, - 0x4d200000, 0x417a4000, 0x05ddfd76, 0x5c024000, - 0x4d400000, 0x4d3c0000, 0x60043000, 0x0511fdfc, - 0x60aa8000, 0x60027804, 0x0201f800, 0x0010ebe6, - 0x5c028000, 0x5c027800, 0x90000541, 0x1c01f000, - 0x4933c857, 0x4c580000, 0x59a80018, 0x800001c0, - 0x05000021, 0x59341806, 0x800c19c0, 0x0500001e, - 0x820c1d80, 0xdeaddead, 0x0500001a, 0x59cc1000, - 0x82081500, 0x00ffff00, 0x80081110, 0x80080580, - 0x05000004, 0x42000000, 0x0010b039, 0x0501f010, - 0x91cc140b, 0x6008b000, 0x91341c06, 0x0501f829, - 0x05000004, 0x42000000, 0x0010b03a, 0x0501f008, - 0x91cc140d, 0x6008b000, 0x91341c08, 0x0501f821, - 0x05000005, 0x42000000, 0x0010b03b, 0x0511ff66, - 0x90000541, 0x5c00b000, 0x1c01f000, 0x4933c857, - 0x59cc0206, 0x90000594, 0x05020015, 0x59cc0407, - 0x82000580, 0x00000800, 0x05020011, 0x59cc0207, - 0x8c00051a, 0x0500000d, 0x82000500, 0x00000f00, - 0x82000580, 0x00000100, 0x05020008, 0x59cc020a, - 0x8c000508, 0x05020003, 0x8c00050a, 0x05000003, - 0x80000580, 0x1c01f000, 0x90000541, 0x1c01f000, - 0x5c000000, 0x4c000000, 0x4803c857, 0x480bc857, - 0x480fc857, 0x485bc857, 0x50080800, 0x500c0000, - 0x80042580, 0x05020007, 0x80081000, 0x800c1800, - 0x8058b040, 0x05fe07f9, 0x80000580, 0x1c01f000, - 0x4803c857, 0x4807c857, 0x480bc857, 0x480fc857, - 0x80040480, 0x05001004, 0x60040000, 0x90040d41, - 0x1c01f000, 0x41780000, 0x05fdf7fd, 0xb1380493, - 0x05c61987, 0xb138048b, 0x05c41985, 0x0c01f001, - 0x00107875, 0x00107875, 0x00107875, 0x00107875, - 0x00107874, 0x00107874, 0x00107874, 0x00107875, - 0x05c5f97b, 0x493bc857, 0x64366203, 0x493a6403, - 0x42000800, 0x80000000, 0x0005f32e, 0x91380593, - 0x0502000b, 0x59300403, 0xb0000590, 0x05c60970, - 0x0505fe70, 0x05000005, 0x643a6203, 0x59a80030, - 0x48026205, 0x1c01f000, 0x0005f45a, 0x4933c857, - 0x913805a7, 0x05020027, 0x4933c857, 0x05f1fe47, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ec6c, - 0x5c027800, 0x42000000, 0x0010b056, 0x0511ff02, - 0x4d2c0000, 0x59325809, 0x0505fa7c, 0x492fc857, - 0x0500000c, 0x0509fc1c, 0x4a025a05, 0x00000103, - 0x59300c02, 0x48065c07, 0x64a65a07, 0x497a580a, - 0x592c0c09, 0x84040d50, 0x48065c09, 0x0001fb5b, - 0x5c025800, 0x60543000, 0x41782800, 0x600c2000, - 0x4d400000, 0x4d440000, 0x59368c03, 0x60a68000, - 0x0509fb68, 0x5c028800, 0x5c028000, 0x0005f45a, - 0x91380594, 0x05020009, 0x59300403, 0xb0000c93, - 0x05c6193b, 0xb0000480, 0x05c41939, 0x4933c857, - 0x4803c857, 0x0c01f013, 0xb13805a1, 0x05000003, - 0xb13805a0, 0x05020007, 0x05f5fa77, 0x05fa04b9, - 0x59300203, 0x9000058e, 0x05040410, 0x1c01f000, - 0xb1380593, 0x05000006, 0xb1380588, 0x05c60928, - 0x59300403, 0xb0000590, 0x05c60925, 0x1c01f000, - 0x001078e0, 0x001078df, 0x001078df, 0x001078df, - 0x001078df, 0x001078df, 0x001078df, 0x001078df, - 0x001078df, 0x001078df, 0x001078df, 0x001078f1, - 0x001078f1, 0x001078f1, 0x001078f1, 0x001078df, - 0x001078f1, 0x001078df, 0x001078f1, 0x05c5f910, - 0x4933c857, 0x05f1fdf1, 0x0505fa30, 0x0004045a, - 0x4d2c0000, 0x59325809, 0x0509fbcf, 0x4a025a05, - 0x00000103, 0x59300402, 0x48025c07, 0x641a5a07, - 0x497a580a, 0x0001fb5b, 0x5c025800, 0x0505fb07, - 0x0005f45a, 0x4933c857, 0x05f1fde0, 0x0005f45a, - 0x05c5f8fb, 0x5930001e, 0x800001c0, 0x050a0b0c, - 0x497a6205, 0x59300004, 0x8c00053e, 0x0502002a, - 0x0509fbcd, 0x050200b0, 0x59325809, 0x592c0c09, - 0x59cc2808, 0x82141d00, 0x00000c00, 0x05000002, - 0x59cc1809, 0x84040d58, 0x48065c09, 0x82143500, - 0x00000fff, 0x05020023, 0x59340200, 0x8c00050e, - 0x05020097, 0x0005fd0c, 0x05020006, 0x64025a07, - 0x59300013, 0x0509fbad, 0x80000d40, 0x050209fe, - 0x4a025a05, 0x00000103, 0x48065808, 0x480e580b, - 0x901409c0, 0x4806580a, 0x59300c02, 0x48065c07, - 0x0509f881, 0x0509f884, 0x0001fb5b, 0x0509fb96, - 0x05e5fb1b, 0x59cc0008, 0x8c000518, 0x050603f6, - 0x0005f45a, 0x05f5fa10, 0x05fc07d6, 0x4d3c0000, - 0x600a7800, 0x0501fe47, 0x5c027800, 0x05fdf7d1, - 0x4817c857, 0x480fc857, 0x82180500, 0x000000ff, - 0x0500000d, 0x592c0205, 0x82000500, 0x000000ff, - 0xb0000588, 0x05000003, 0x900005a2, 0x05020006, - 0x592c0408, 0x800001c0, 0x05000003, 0x0509f9d9, - 0x0509f210, 0x82180d00, 0x00000c00, 0x05000004, - 0x59340200, 0x8c00050e, 0x05020050, 0x64025a07, - 0x41782000, 0x8c180510, 0x05000009, 0x59cc200b, - 0x801021c0, 0x05000006, 0x59cc000c, 0x82000500, - 0x000000ff, 0x05000002, 0x4803c857, 0x4812580d, - 0x41780000, 0x8c180512, 0x05000002, 0x59cc000a, - 0x4802580c, 0x80100c00, 0x05fc07b7, 0x9004149d, - 0x05001005, 0x592c0405, 0x8c00051e, 0x05000020, - 0x60700800, 0x4c040000, 0x4c0c0000, 0x4c140000, - 0x0005fd0c, 0x05020006, 0x64025a07, 0x59300013, - 0x0509fb5a, 0x80000d40, 0x050209ab, 0x5c002800, - 0x5c001800, 0x4a025a05, 0x00000103, 0x48065808, - 0x480e580b, 0x901409c0, 0x4806580a, 0x5c000800, - 0x4c500000, 0x4c540000, 0x91cca40c, 0x912cac0e, - 0x0501fda8, 0x5c00a800, 0x5c00a000, 0x59300008, - 0x84000534, 0x48026008, 0x05fdf7a0, 0x4c040000, - 0x4c0c0000, 0x4c140000, 0x0005fd0c, 0x05020006, - 0x64025a07, 0x59300013, 0x0509fb3c, 0x80000d40, - 0x0502098d, 0x48065808, 0x5c002800, 0x5c001800, - 0x59301402, 0x480a5c07, 0x480e580b, 0x901401c0, - 0x4802580a, 0x0509f810, 0x5c000800, 0x0501fd49, - 0x0501fd75, 0x05fdf78e, 0x592c020b, 0x8c000502, - 0x05fc07af, 0x592c0209, 0x8c00050e, 0x05fe07ac, - 0x59300013, 0x800c0d80, 0x05fc07a9, 0x4803c857, - 0x480fc857, 0x8c180514, 0x050403b4, 0x80000540, - 0x05fc07a3, 0x4807c856, 0x0505f3b0, 0x592c020b, - 0x8c000502, 0x05fc0768, 0x59300013, 0x800001c0, - 0x05fc0767, 0x592c0209, 0x8c00050e, 0x05fe0764, - 0x0505f3a6, 0x1c01f000, 0x59cc2006, 0x59cc2807, - 0x0501f03b, 0x0501f03a, 0x1c01f000, 0x4933c857, - 0x59300004, 0x8c00053e, 0x05020031, 0x5930001e, - 0x800001c0, 0x050a0a4a, 0x497a6205, 0x59325809, - 0x592c0c09, 0x41782800, 0x41781800, 0x84040d58, - 0x48065c09, 0x41783000, 0x59340200, 0x8c00050e, - 0x05020018, 0x0005fd0c, 0x05020007, 0x64025a07, - 0x59300013, 0x0509faf5, 0x80000d40, 0x4807c857, - 0x05020945, 0x4a025a05, 0x00000103, 0x48065808, - 0x480e580b, 0x901409c0, 0x4806580a, 0x4933c857, - 0x59300c02, 0x48065c07, 0x0505ffc7, 0x0505ffca, - 0x0001fb5b, 0x0509fadc, 0x05e5fa61, 0x0005f45a, - 0x592c020b, 0x8c000502, 0x05fc07e7, 0x59300013, - 0x4803c857, 0x800001c0, 0x05fc07e5, 0x592c0209, - 0x8c00050e, 0x05fe07e2, 0x0505f36c, 0x05f5f94e, - 0x05fc07cf, 0x4933c857, 0x1c01f000, 0x4c5c0000, - 0x4c600000, 0x4010b800, 0x4014c000, 0x5930001e, - 0x800001c0, 0x4c140000, 0x050a0a11, 0x5c002800, - 0x59325809, 0x592c020b, 0x8c000502, 0x05020033, - 0x8c000500, 0x05000038, 0x640a6203, 0x650e6403, - 0x405c0000, 0x592c0810, 0x80040c80, 0x40600000, - 0x80040480, 0x0500102d, 0x8060c1c0, 0x05000024, - 0x59300004, 0x8c00050e, 0x05000007, 0x59300a23, - 0x90040503, 0x4c140000, 0x0c01f829, 0x5c002800, - 0x0500001b, 0x59300004, 0x8c00053e, 0x05020014, - 0x485e6015, 0x48626013, 0x497a6205, 0x5c00c000, - 0x5c00b800, 0x4c140000, 0x0505fcda, 0x5c002800, - 0x05000007, 0x4816602a, 0x4a02601c, 0x00107a1d, - 0x1c01f000, 0x5930282a, 0x497a602a, 0x05c9fa90, - 0x0502000c, 0x59300804, 0x0005f320, 0x4c140000, - 0x05f5f911, 0x5c002800, 0x05fc07ea, 0x5c00c000, - 0x5c00b800, 0x05f9f34f, 0x5c00c000, 0x5c00b800, - 0x4933c857, 0x1c01f000, 0x4807c857, 0x4004c000, - 0x05fdf7d2, 0x4803c857, 0x05fdf7f5, 0x00107a37, - 0x00107a3c, 0x00107a41, 0x00107a41, 0x59300224, - 0x48035093, 0x90000408, 0x48035092, 0x0501f00a, - 0x59300224, 0x48035092, 0x90000408, 0x48035093, - 0x0501f005, 0x59300224, 0x90000408, 0x48035092, - 0x48035093, 0x405c1000, 0x41780800, 0x59a80092, - 0x05f1faf4, 0x800409c0, 0x05020052, 0x40085000, - 0x592c1001, 0x800811c0, 0x0500004e, 0x58080205, - 0x82000500, 0x000000ff, 0xb000058a, 0x05020049, - 0x48281002, 0x59a80092, 0x40601000, 0x41780800, - 0x4c280000, 0x05f1fae3, 0x5c005000, 0x800409c0, - 0x05020038, 0x40041800, 0x59a80093, 0x59300804, - 0x8c040530, 0x05000005, 0x59300827, 0x800800c6, - 0x48000803, 0x59300224, 0x800c1c00, 0x80081040, - 0x05fe07fe, 0x480e602c, 0x592c4801, 0x802449c0, - 0x05c00f83, 0x58240a06, 0x592c1812, 0x59303023, - 0x8c180506, 0x05000003, 0x40280000, 0x80040c00, - 0x800400e0, 0x80040540, 0x48026021, 0x8c18050a, - 0x05020003, 0x40280000, 0x800c1c00, 0x480e601f, - 0x59300804, 0x8c040530, 0x0500000e, 0x4c280000, - 0x592c1001, 0x59306827, 0x592c5a0b, 0x0001ff1a, - 0x5c005000, 0x802851c0, 0x05ca0f97, 0x05020015, - 0x59300827, 0x58040003, 0x49780803, 0x4800080d, - 0x59300224, 0x59303023, 0x8c18050e, 0x05000002, - 0x80000580, 0x48026424, 0x90000541, 0x1c01f000, - 0x592c1810, 0x805c0418, 0x800c0580, 0x05fc07c6, - 0x4933c857, 0x485fc857, 0x4863c857, 0x480fc857, - 0x80000580, 0x1c01f000, 0xb1380498, 0x05021057, - 0xb1380480, 0x05001002, 0x0c01f002, 0x1c01f000, - 0x00107abc, 0x00107abc, 0x00107abc, 0x00107abc, - 0x00107abc, 0x00107abc, 0x00107abc, 0x00107abc, - 0x00107abc, 0x00107abc, 0x00107abd, 0x00107abc, - 0x00107abc, 0x00107abc, 0x00107abc, 0x00107ac7, - 0x00107abc, 0x00107abc, 0x00107abc, 0x00107abc, - 0x00107aec, 0x00107abc, 0x00107abc, 0x00107abc, - 0x05c1ff33, 0x4933c857, 0x05f1fefd, 0x640a6203, - 0x59a80030, 0x48026205, 0x59300013, 0x59300817, - 0x80040c80, 0x48066017, 0x05f1f3ef, 0x4933c857, - 0x05f1fbed, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010ec6c, 0x5c027800, 0x42000000, 0x0010b056, - 0x0511fcc5, 0x0505f841, 0x0500000f, 0x4d2c0000, - 0x59325809, 0x0509f9e0, 0x4a025a05, 0x00000103, - 0x59300402, 0x48025c07, 0x64a65a07, 0x497a580a, - 0x592c0c09, 0x84040d50, 0x48065c09, 0x0001fb5b, - 0x5c025800, 0x60503000, 0x41782800, 0x4d400000, - 0x4d440000, 0x59368c03, 0x60082000, 0x60a68000, - 0x0509f92c, 0x5c028800, 0x5c028000, 0x0005f45a, - 0x4933c857, 0x59cc0a04, 0x48066202, 0x59300809, - 0x4978080a, 0x4978080b, 0x58041409, 0x84081558, - 0x48080c09, 0x1c01f000, 0xb13805a1, 0x05020014, - 0x05f1fc85, 0x0501fd7f, 0x0502000c, 0x05f5f97e, - 0x05fc07ff, 0x811800ca, 0x81c80c00, 0x58040138, - 0x59cc0a03, 0x80000040, 0x80040580, 0x05020007, - 0x05f5f96f, 0x05000005, 0x59300c16, 0x84040d44, - 0x48066416, 0x497a6205, 0x05f1f45f, 0xb13805a0, - 0x05fe07fe, 0x59cc0002, 0x8c000526, 0x05fe07e9, - 0x05fdf7fa, 0x4807c857, 0x8c04053e, 0x05020022, - 0x497a5a07, 0x5930002b, 0x80000540, 0x05000017, - 0x497a5a07, 0x4c040000, 0x4c080000, 0x4c0c0000, - 0x4c100000, 0x4c140000, 0x40002800, 0x58141003, - 0x40040000, 0x80081480, 0x48082803, 0x40140000, - 0x05c5ff7a, 0x5c002800, 0x5c002000, 0x5c001800, - 0x5c001000, 0x5c000800, 0x592c0207, 0x80000540, - 0x05020008, 0x0501f005, 0x592c0409, 0x8c00051c, - 0x05000002, 0x592c0803, 0x4807c857, 0x64565a07, - 0x1c01f000, 0x5930002b, 0x80000540, 0x05000007, - 0x64465a07, 0x5930002b, 0x4c040000, 0x05c5ff63, - 0x5c000800, 0x05fdf7f7, 0x4807c856, 0x641e5a07, - 0x1c01f000, 0xb1380498, 0x05001006, 0xb13805a1, - 0x05000003, 0xb13805a0, 0x05c20ea9, 0x1c01f000, - 0xb1380480, 0x05001004, 0x4d2c0000, 0x0c01f803, - 0x5c025800, 0x1c01f000, 0x00107b66, 0x00107b66, - 0x00107b66, 0x00107b66, 0x00107b66, 0x00107b68, - 0x00107b67, 0x00107b66, 0x00107be0, 0x00107b66, - 0x00107b66, 0x00107b66, 0x00107b66, 0x00107b66, - 0x00107b66, 0x00107b66, 0x00107b66, 0x00107b66, - 0x00107b66, 0x00107ca2, 0x00107cca, 0x00107ca9, - 0x00107b67, 0x00107cd3, 0x05c1fe89, 0x1c01f000, - 0x5930001e, 0x800001c0, 0x050a0899, 0x59300008, - 0x8c00050e, 0x05000072, 0x8c000500, 0x05000064, - 0x8c00051c, 0x05000008, 0x84000500, 0x48026008, - 0x59325809, 0x592c3c09, 0x841c3d58, 0x481e5c09, - 0x0005f4b7, 0x59325809, 0x592c3c09, 0x841c3d58, - 0x59300008, 0x8c00051c, 0x05fe07f4, 0x481e5c09, - 0x60140000, 0x40000000, 0x80000040, 0x05fe07fe, - 0x59300008, 0x8c00051c, 0x05fe07ec, 0x59cc0a04, - 0x48066202, 0x59cc0808, 0x592c0205, 0x82000500, - 0x000000ff, 0xb0000588, 0x05000003, 0x900005a2, - 0x0502000a, 0x497a580c, 0x82040500, 0x000000ff, - 0x05000006, 0x592c0408, 0x800001c0, 0x05000003, - 0x0505ff7c, 0x05c5f7f9, 0x900421c0, 0x4812580a, - 0x41782000, 0x82040500, 0x00000c00, 0x05000002, - 0x59cc2009, 0x82043500, 0x00000fff, 0x0502001e, - 0x481e5c09, 0x64025a07, 0x801831c0, 0x05c407eb, - 0x41782000, 0x8c180510, 0x05000002, 0x59cc200b, - 0x4812580d, 0x41780000, 0x8c180512, 0x05000002, - 0x59cc000a, 0x4802580c, 0x80100c00, 0x05c01e3c, - 0x05c407de, 0x9004149d, 0x05021009, 0x4c500000, - 0x4c540000, 0x91cca40c, 0x912cac0e, 0x0501fb61, - 0x5c00a800, 0x5c00a000, 0x05c5f7d4, 0x0501fb19, - 0x05c5f7d2, 0x412c7800, 0x05c5f9ba, 0x05c00e2c, - 0x492c780a, 0x841c3d52, 0x481c7c09, 0x4a025a05, - 0x00000103, 0x4812580b, 0x900401c0, 0x4802580a, - 0x583c0405, 0x583c1006, 0x583c2209, 0x48025c05, - 0x480a5806, 0x48125a09, 0x05fdf7d2, 0x8c000524, - 0x05fc079e, 0x59325809, 0x4c000000, 0x592c0409, - 0x8c00051c, 0x5c000000, 0x05020003, 0x4a026013, - 0xffffffff, 0x84000524, 0x05fdf794, 0x1c01f000, - 0x59a80030, 0x48026205, 0x59325809, 0x640a6203, - 0x592c2409, 0x59300808, 0x4933c857, 0x4807c857, - 0x592c0205, 0x82000500, 0x000000ff, 0xb0000588, - 0x05000003, 0x900005a2, 0x05020003, 0x8c100500, - 0x0506075c, 0x64025a07, 0x8c04051e, 0x05000030, - 0x41780800, 0x497a580a, 0x592c1c0a, 0x59300008, - 0x8c00052c, 0x05000003, 0x4a026013, 0x7fffffff, - 0x59300013, 0x59341200, 0x497a6205, 0x8c08050e, - 0x0502006b, 0x4807c857, 0x4806580b, 0x0509f8bb, - 0x80000d40, 0x05fe0f0c, 0x59300402, 0x48025c07, - 0x48065808, 0x4a025a05, 0x00000103, 0x4c040000, - 0x592c0a09, 0x8c040512, 0x05000002, 0x64325a07, - 0x5c000800, 0x4c040000, 0x4c0c0000, 0x4c100000, - 0x0505fd89, 0x0509f8a0, 0x5c002000, 0x5c001800, - 0x5c000800, 0x8c100512, 0x05020017, 0x4c0c0000, - 0x0505fd85, 0x0001fb5b, 0x05e5f81d, 0x5c001800, - 0x8c0c0518, 0x0004045a, 0x0505f0f7, 0x4813c857, - 0x8c100518, 0x05000044, 0x41780800, 0x592c1c0a, - 0x820c0580, 0x00001000, 0x05fc07cd, 0x8c100512, - 0x05fc07cb, 0x592c780a, 0x583c080b, 0x583c1c0a, - 0x05fdf7c7, 0x4807c857, 0x592c780a, 0x59300402, - 0x592c1405, 0x8c08051e, 0x0502000c, 0x592c1207, - 0x48007c07, 0x48047808, 0x48087a07, 0x84102512, - 0x48107c09, 0x4c0c0000, 0x05c5f957, 0x403e5800, - 0x0501fac5, 0x05fdf7dd, 0x48025c07, 0x48065808, - 0x583c080d, 0x583c000c, 0x80040c00, 0x9004149d, - 0x05001005, 0x583c1001, 0x480a5801, 0x49787801, - 0x60700800, 0x90040c14, 0x4c0c0000, 0x4c500000, - 0x4c540000, 0x903ca409, 0x912cac09, 0x4c100000, - 0x4c3c0000, 0x0501fac7, 0x5c007800, 0x5c002000, - 0x5c00a800, 0x5c00a000, 0x84102512, 0x48125c09, - 0x403e5800, 0x05c5f938, 0x0505fd3f, 0x42034000, - 0x0010ac19, 0x59a1d806, 0x80edd9c0, 0x05c00d8c, - 0x48efc857, 0x58ec0008, 0x4803c857, 0x0801f800, - 0x05fdf7b6, 0x4933c857, 0x1c01f000, 0x59301416, - 0x480bc857, 0x8c08051c, 0x0502000e, 0x80000540, - 0x4803c857, 0x05fc0790, 0x80042c80, 0x05fe178e, - 0x8c080514, 0x05020005, 0x592c0810, 0x4807c857, - 0x80040480, 0x48026018, 0x8408155c, 0x480a6416, - 0x59301008, 0x8408151e, 0x480a6008, 0x4c100000, - 0x4c3c0000, 0x4d400000, 0x592e8207, 0x64065a07, - 0x0505fd19, 0x49425a07, 0x5c028000, 0x5c007800, - 0x5c002000, 0x497a580a, 0x8c100512, 0x05000005, - 0x4d2c0000, 0x403e5800, 0x05c5f907, 0x5c025800, - 0x82102500, 0xffffedff, 0x48125c09, 0x59301006, - 0x800811c0, 0x050400bd, 0x59a80030, 0x80080480, - 0x050610ba, 0x0509f81c, 0x4a025a05, 0x00000103, - 0x641a5a07, 0x497a5c0a, 0x492fc857, 0x0001fb5b, - 0x05e1ff9b, 0x0005f45a, 0x59325809, 0x592c0409, - 0x8c000518, 0x05000003, 0x412df800, 0x05c5f703, - 0x1c01f000, 0x4933c857, 0x59325809, 0x497a580a, - 0x64025a07, 0x4a025a05, 0x00000103, 0x59300813, - 0x4807c857, 0x800409c0, 0x0502000a, 0x48065808, - 0x59300c02, 0x48065c07, 0x0505fce7, 0x0505fffe, - 0x0505fce9, 0x0001fb5b, 0x05e1ff81, 0x0005f45a, - 0x59340200, 0x8c00050e, 0x05020007, 0x59300013, - 0x0505fffe, 0x80000d40, 0x05fdfe4f, 0x48065808, - 0x05fdf7f0, 0x592c0209, 0x8c00050e, 0x05fe07f8, - 0x4933c857, 0x0505f089, 0x4933c857, 0x59325809, - 0x812e59c0, 0x05c00d22, 0x592c020b, 0x8c000502, - 0x05c00d1f, 0x640a6006, 0x1c01f000, 0x5930001e, - 0x800001c0, 0x05060f2e, 0x59300008, 0x4933c857, - 0x4803c857, 0x8c00050e, 0x05000034, 0x8c000500, - 0x05000026, 0x8c00051c, 0x05000009, 0x84000500, - 0x48026008, 0x59325809, 0x592c3c09, 0x481fc857, - 0x841c3d58, 0x481e5c09, 0x0005f4b7, 0x59325809, - 0x592c3c09, 0x841c3d58, 0x59300008, 0x8c00051c, - 0x05fe07f3, 0x481e5c09, 0x60140000, 0x40000000, - 0x80000040, 0x05fe07fe, 0x59300008, 0x8c00051c, - 0x05fe07eb, 0x592c0205, 0x82000500, 0x000000ff, - 0xb0000588, 0x05000003, 0x900005a2, 0x05020003, - 0x497a580c, 0x0501f002, 0x497a580a, 0x481e5c09, - 0x64025a07, 0x05c5f691, 0x8c000524, 0x05fc07dc, - 0x59325809, 0x4c000000, 0x592c0409, 0x8c00051c, - 0x5c000000, 0x05020003, 0x4a026013, 0xffffffff, - 0x84000524, 0x05fdf7d2, 0x1c01f000, 0x4933c857, - 0x41780800, 0xb1380498, 0x05021009, 0xb1380480, - 0x05001007, 0x4d2c0000, 0x59325809, 0x812e59c0, - 0x0c020805, 0x5c025800, 0x0005f45a, 0x493bc857, - 0x1c01f000, 0x00107d35, 0x00107d35, 0x00107d35, - 0x00107d35, 0x00107d35, 0x00107d36, 0x00107d35, - 0x00107d35, 0x00107d35, 0x00107d35, 0x00107d35, - 0x00107d35, 0x00107d35, 0x00107d35, 0x00107d35, - 0x00107d35, 0x00107d35, 0x00107d35, 0x00107d35, - 0x00107d35, 0x00107d39, 0x00107d35, 0x00107d35, - 0x00107d35, 0x05c1fcba, 0x59cc0808, 0x497a5808, - 0x4807c857, 0x59300402, 0x48025c07, 0x4a025a05, - 0x00000103, 0x900401c0, 0x4802580a, 0x64025a07, - 0x800409c0, 0x0000035b, 0x59cc0009, 0x4802580b, - 0x82042500, 0x00000100, 0x05000002, 0x59cc200b, - 0x4812580d, 0x82040500, 0x00000200, 0x05000002, - 0x59cc000a, 0x4802580c, 0x80100c00, 0x05c01ca0, - 0x0000035b, 0x9004149d, 0x05001005, 0x592c0405, - 0x8c00051e, 0x0500000a, 0x60700800, 0x4c500000, - 0x4c540000, 0x91cca40c, 0x912cac0e, 0x0501f9c1, - 0x5c00a800, 0x5c00a000, 0x0001f35b, 0x0501f979, - 0x0501f1a5, 0x83380480, 0x00000093, 0x05c21c8c, - 0x83380480, 0x00000085, 0x05c01c89, 0x0c01f001, - 0x00107d76, 0x00107d75, 0x00107d75, 0x00107d7b, - 0x00107d75, 0x00107d75, 0x00107d75, 0x00107d75, - 0x00107d75, 0x00107d75, 0x00107d75, 0x00107d75, - 0x00107d75, 0x05c1fc7a, 0x64066203, 0x493a6403, - 0x42000800, 0x80000040, 0x0005f32e, 0x83300580, - 0x00110284, 0x05c20c72, 0x4933c857, 0x59cc1404, - 0x0505fa32, 0x0500002c, 0x591c0203, 0x90000580, - 0x05000029, 0x591c000a, 0x81340580, 0x05020026, - 0x59cc1204, 0x82080580, 0x0000ffff, 0x05000007, - 0x591c0202, 0x82000d80, 0x0000ffff, 0x05000003, - 0x80080580, 0x0502001c, 0x4d300000, 0x4d1c0000, - 0x411e6000, 0x0501f9d2, 0x5c023800, 0x5c026000, - 0x05000013, 0x59cc0005, 0x8c000500, 0x05020003, - 0x0501f987, 0x0501f002, 0x640a3a03, 0x4a026403, - 0x00000086, 0x59cc0005, 0x8c000500, 0x0500000c, - 0x591c0416, 0x8400055a, 0x48023c16, 0x59300416, - 0x8400055a, 0x48026416, 0x0501f005, 0x0501f9af, - 0x05fc07ed, 0x4a026403, 0x00000087, 0x4d2c0000, - 0x0511f87e, 0x05e5f9cc, 0x5c025800, 0x59340200, - 0x8c00050e, 0x0500000b, 0x59cc1404, 0x0505f9fb, - 0x05000008, 0x591c0416, 0x8c00051a, 0x05000005, - 0x4d300000, 0x411e6000, 0x0501ffa6, 0x5c026000, - 0x1c01f000, 0x91380593, 0x0502000a, 0x59300403, - 0x4803c857, 0x82000d80, 0x00000086, 0x0500000c, - 0x82000d80, 0x00000087, 0x05c20c25, 0x0501f008, - 0x913805a7, 0x05000003, 0x91380594, 0x05c20c20, - 0x493bc857, 0x05f1f901, 0x05f5f741, 0x4933c857, - 0x0505f91c, 0x05f6073e, 0x0005f45a, 0x91380593, - 0x05020006, 0x59300403, 0x4803c857, 0x82000480, - 0x00000085, 0x0c01f04c, 0x913805a7, 0x05020040, - 0x4933c857, 0x05f1f8f1, 0x59300416, 0x8c00051a, - 0x05020002, 0x0005f45a, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010ec6c, 0x5c027800, 0x60543000, - 0x41782800, 0x600c2000, 0x60a68000, 0x4d400000, - 0x4d440000, 0x59368c03, 0x0505fe22, 0x5c028800, - 0x5c028000, 0x42000000, 0x0010b056, 0x0511f99e, - 0x0501fd1a, 0x0004045a, 0x4d2c0000, 0x59325809, - 0x592c0205, 0x82000500, 0x000000ff, 0x90000594, - 0x05020df6, 0x0505feb4, 0x4a025a05, 0x00000103, - 0x59300402, 0x48025c07, 0x497a580a, 0x49425a07, - 0x0001fb5b, 0x5c025800, 0x0005f45a, 0xb13805a1, - 0x05000009, 0xb13805a0, 0x05000007, 0x83380580, - 0x00000089, 0x05000004, 0x83380580, 0x0000008a, - 0x05f60764, 0x05f1fd20, 0x05f60762, 0x59300a03, - 0x9004058e, 0x050006aa, 0x9004058a, 0x0500003c, - 0x9004058c, 0x0500003a, 0x05c1fbd1, 0x91380594, - 0x05fe07eb, 0x4933c857, 0x05f1f8b0, 0x59300416, - 0x8c00051a, 0x05020002, 0x0005f45a, 0x601a8000, - 0x05fdf7d0, 0x00107e37, 0x00107e36, 0x00107e36, - 0x00107e36, 0x00107e36, 0x00107e36, 0x00107e47, - 0x00107e36, 0x00107e36, 0x00107e36, 0x00107e36, - 0x00107e36, 0x00107e36, 0x05c1fbb9, 0x4933c857, - 0x0505f8b8, 0x0500000a, 0x643a6203, 0x59a80030, - 0x48026205, 0x59300416, 0x8c00051a, 0x05020003, - 0x59a8002e, 0x48026006, 0x1c01f000, 0x59a8002e, - 0x48026006, 0x642a6203, 0x1c01f000, 0x4933c857, - 0x0505f8a8, 0x0500000a, 0x643a6203, 0x59a80030, - 0x48026205, 0x59300416, 0x8c00051a, 0x05020003, - 0x59a8002e, 0x48026006, 0x1c01f000, 0x59a8002e, - 0x48026006, 0x64326203, 0x1c01f000, 0x5932680a, - 0x83380580, 0x00000089, 0x05000007, 0x83380580, - 0x0000008a, 0x0500002c, 0x4933c857, 0x493bc857, - 0x05f5f718, 0x4933c857, 0x59325809, 0x59300416, - 0x8c00051a, 0x0500000b, 0x59300229, 0x90000583, - 0x05c20b87, 0x640e6407, 0x59300429, 0x48026203, - 0x59340200, 0x8c00050e, 0x050206f6, 0x1c01f000, - 0x59300a29, 0x90040583, 0x05020007, 0x0501fc9f, - 0x0500000d, 0x0001fb5b, 0x05e1fdc5, 0x497a6009, - 0x0501f009, 0x59300229, 0x90000581, 0x05020006, - 0x59300c18, 0x900405b9, 0x05000019, 0x900405b5, - 0x05000017, 0x59cc0c07, 0x4806641b, 0x59cc0a07, - 0x4806621b, 0x59300203, 0x48026429, 0x64466203, - 0x05f5f68b, 0x4933c857, 0x59300416, 0x8c00051a, - 0x0006045a, 0x59300229, 0x90000581, 0x0502003f, - 0x59300c18, 0x900405b5, 0x05000005, 0x9004059e, - 0x05000003, 0x900405b9, 0x05020038, 0x4933c857, - 0x4c5c0000, 0x4c600000, 0x4d1c0000, 0x4130b800, - 0x4004c000, 0x0505f8cd, 0x0502002b, 0x906005b5, - 0x05020004, 0x591c0c16, 0x8c040502, 0x05000026, - 0x05f5fea1, 0x05000024, 0x491fc857, 0x4933c857, - 0x906005b5, 0x05000003, 0x906005b9, 0x05020002, - 0x4932381e, 0x585c081d, 0x4806601d, 0x48626403, - 0x64066203, 0x64066407, 0x585c080a, 0x4807c857, - 0x4806600a, 0x585c0c17, 0x4807c857, 0x48066417, - 0x585c0a17, 0x4807c857, 0x48066217, 0x585c0a18, - 0x4807c857, 0x48066218, 0x585c0c1b, 0x4807c857, - 0x4806641b, 0x585c0a1b, 0x4807c857, 0x4806621b, - 0x491e602a, 0x0505f81c, 0x42000800, 0x80000040, - 0x0005fb2e, 0x405e6000, 0x5c023800, 0x5c00c000, - 0x5c00b800, 0x0005f45a, 0x0501fc44, 0x05000008, - 0x4d2c0000, 0x59325809, 0x0001fb5b, 0x59300229, - 0x90000583, 0x05e00d66, 0x5c025800, 0x0005f45a, - 0x4803c856, 0x4c500000, 0x4c540000, 0x412c7800, - 0x4c3c0000, 0x60042800, 0x82040480, 0x00000101, - 0x05001002, 0x60000802, 0x40043000, 0x60700800, - 0x91cca40c, 0x912cac0e, 0x0501f836, 0x9018349c, - 0x592e5801, 0x812e59c0, 0x05c20eab, 0x05c1fe91, - 0x05000011, 0x80142800, 0x4a025805, 0x00000110, - 0x492c7801, 0x90180cbd, 0x05021005, 0x40180800, - 0x912cac06, 0x0501f827, 0x0501f007, 0x901834bc, - 0x60f00800, 0x412c7800, 0x912cac06, 0x0501f821, - 0x05fdf7ef, 0x5c007800, 0x841429c0, 0x90142d43, - 0x48147a05, 0x403e5800, 0x5c00a800, 0x5c00a000, - 0x1c01f000, 0x492fc857, 0x812e59c0, 0x0500000d, - 0x4d2c0000, 0x4c3c0000, 0x592c7801, 0x803c79c0, - 0x05000005, 0x497a5801, 0x0001fb5b, 0x403e5800, - 0x05fdf7fa, 0x5c007800, 0x0001fb5b, 0x5c025800, - 0x1c01f000, 0x4803c856, 0x4c580000, 0x90040403, - 0x8000b104, 0x0511f947, 0x5c00b000, 0x1c01f000, - 0x4803c856, 0x4c580000, 0x90040c03, 0x8004b104, - 0x0511f940, 0x5c00b000, 0x1c01f000, 0x591c0c07, - 0x90040583, 0x05000005, 0x90040582, 0x05000003, - 0x9004058a, 0x05020022, 0x4d300000, 0x4d2c0000, - 0x411e6000, 0x59325809, 0x0501fbe4, 0x05000019, - 0x59300c07, 0x9004058a, 0x0500001a, 0x90040583, - 0x05020007, 0x592c0a05, 0x82040d00, 0x000000ff, - 0x90040d94, 0x05000002, 0x640e6229, 0x0501f814, - 0x4d400000, 0x604e8000, 0x592c0a09, 0x84040d54, - 0x05e5f8ad, 0x5c028000, 0x0505fa5b, 0x0505fd72, - 0x0001fb5b, 0x59300229, 0x90000583, 0x05000caf, - 0x05f5fdcb, 0x5c025800, 0x5c026000, 0x1c01f000, - 0x644e5a07, 0x642a6229, 0x05fdf7f4, 0x592c0409, - 0x8c000512, 0x05000008, 0x84000512, 0x48025c09, - 0x4d2c0000, 0x592e580a, 0x05c1fe3f, 0x5c025800, - 0x497a580a, 0x1c01f000, 0x59cc0005, 0x8c000500, - 0x0502000a, 0x591c0407, 0x90000582, 0x05020007, - 0x591c0c03, 0x82040580, 0x00000085, 0x05000003, - 0x82040580, 0x0000008b, 0x1c01f000, 0x4933c857, - 0x4d3c0000, 0x600a7800, 0x59300407, 0x90000c92, - 0x05c21a83, 0x0c01f808, 0x5c027800, 0x1c01f000, - 0x4933c857, 0x59300407, 0x90000c92, 0x05c21a7c, - 0x0c01f001, 0x00107f8b, 0x00107f88, 0x00107f88, - 0x00107fba, 0x00107f87, 0x00107f88, 0x00107f9d, - 0x00107f88, 0x00107f87, 0x00107f87, 0x00108d38, - 0x00107f88, 0x00107f88, 0x00107f87, 0x00107f87, - 0x00107f87, 0x00108096, 0x00107f88, 0x05c1fa68, - 0x4803c856, 0x80000580, 0x1c01f000, 0x4803c856, - 0x8d3c0502, 0x0502000f, 0x0501fb84, 0x0500000b, - 0x59325809, 0x0505fd24, 0x41780800, 0x4d400000, - 0x60168000, 0x05e5f858, 0x5c028000, 0x0505fa06, - 0x0501fce3, 0x0001fb5b, 0x05f5fd79, 0x90000541, - 0x1c01f000, 0x4933c857, 0x0501fb74, 0x05000008, - 0x59300809, 0x58040209, 0x8c000512, 0x05000004, - 0x4d400000, 0x60328000, 0x0501f00f, 0x05e1fc23, - 0x0500000b, 0x59300416, 0x84000556, 0x48026416, - 0x0501f80e, 0x4df00000, 0x59300416, 0x84000516, - 0x48026416, 0x5c03e000, 0x1c01f000, 0x4d400000, - 0x60428000, 0x0509ff54, 0x641a6407, 0x641e6203, - 0x5c028000, 0x1c01f000, 0x4933c857, 0x05edffc2, - 0x4df00000, 0x0501f8c9, 0x90000c91, 0x05c21a30, - 0x0c01f001, 0x00107fd3, 0x00108045, 0x00107fe5, - 0x00108055, 0x00108042, 0x00107fd2, 0x00107fd3, - 0x00107fd3, 0x00107fd6, 0x00107fd3, 0x00107fd3, - 0x00107fd3, 0x00107fd3, 0x00107fe5, 0x00107fd6, - 0x00107fd3, 0x00107fd6, 0x05c1fa1d, 0x5c03e000, - 0x05ec0f95, 0x05fdf7b3, 0x5c03e000, 0x05ec0f92, - 0x59300407, 0x90000583, 0x05fe07b1, 0x59300203, - 0x9000058d, 0x05fc07ae, 0x8d3c0502, 0x05fe07ac, - 0x4d340000, 0x5932680a, 0x05e1fc59, 0x5c026800, - 0x05fdf7a7, 0x0505fdd8, 0x0505fcb5, 0x59300004, - 0x8400055c, 0x48026004, 0x4203e000, 0xb0800000, - 0x6023f800, 0x05edff7c, 0x59300407, 0x90000586, - 0x0500004c, 0x8d3c0502, 0x0502004e, 0x497a6229, - 0x59300203, 0x9000058d, 0x05000002, 0x640e6229, - 0x0501fb1a, 0x05020004, 0x8d3c0500, 0x05000036, - 0x0501f02e, 0x4d2c0000, 0x4d400000, 0x59325809, - 0x0501fc7b, 0x592c0409, 0x8c000512, 0x05000008, - 0x4d2c0000, 0x84000512, 0x48025c09, 0x592c080a, - 0x40065800, 0x05c1fd8c, 0x5c025800, 0x4d400000, - 0x60168000, 0x592c0a09, 0x8c04050e, 0x05000003, - 0x600a8000, 0x0501f004, 0x8c040512, 0x05000002, - 0x60328000, 0x05e1ffd8, 0x0505fc9f, 0x5c028000, - 0x0505f985, 0x8d3c0500, 0x05020003, 0x0511f894, - 0x05020003, 0x0001fb5b, 0x497a6009, 0x5c028000, - 0x5c025800, 0x8d3c0500, 0x0500000a, 0x59300a29, - 0x90040d83, 0x05020005, 0x4d340000, 0x5932680a, - 0x05e1fc13, 0x5c026800, 0x05f5fce9, 0x0501f011, - 0x0511f883, 0x05020004, 0x59300a29, 0x90040d83, - 0x05000bc6, 0x4a026403, 0x00000085, 0x64266203, - 0x640a6407, 0x42000800, 0x80004040, 0x0505fc64, - 0x0005fb2e, 0x4203e000, 0xb0800000, 0x6023f800, - 0x5c03e000, 0x05ee0f40, 0x90000541, 0x1c01f000, - 0x0505fc75, 0x05fdf7fb, 0x05edff27, 0x05c5fb94, - 0x05fdf7a1, 0x598c000b, 0x81300580, 0x05020003, - 0x05f1fa44, 0x05020026, 0x0201f800, 0x0010eee3, - 0x80c40040, 0x05020005, 0x59300c03, 0xb0040580, - 0x05fc0786, 0x05fdf794, 0x05edfe45, 0x0500001c, - 0x05c1f99b, 0x0501f823, 0x05020003, 0x05f1fa00, - 0x05020017, 0x0201f800, 0x0010ed56, 0x80c40040, - 0x0500000f, 0x05edfe3a, 0x05000011, 0x59300407, - 0x90000583, 0x05c2098e, 0x59300004, 0x9000051f, - 0x90000585, 0x05c2098a, 0x58d400ec, 0x82000500, - 0x00000f00, 0x05fe077c, 0x05c1f985, 0x59300c03, - 0xb0040580, 0x05fc0769, 0x05fdf777, 0x59300203, - 0x90000c91, 0x05c2197e, 0x0c01f74f, 0x0501f805, - 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, - 0x417a3000, 0x60df2160, 0x59900005, 0x81300580, - 0x05000006, 0x91932410, 0x811a3000, 0x91180485, - 0x05fc17fa, 0x90000541, 0x1c01f000, 0x0501f803, - 0x40018800, 0x1c01f000, 0x59300004, 0x8c00053e, - 0x0500000c, 0x8c00050c, 0x0502000a, 0x8c000516, - 0x05020004, 0x90000d1f, 0x90040585, 0x05020003, - 0x600c0000, 0x0501f004, 0x60040000, 0x0501f002, - 0x59300203, 0x1c01f000, 0x4933c857, 0x05edfee6, - 0x4df00000, 0x59300203, 0x90000c91, 0x05c21954, - 0x0c01f001, 0x001080af, 0x001080c2, 0x001080b2, - 0x001080ae, 0x001080ae, 0x001080ae, 0x001080ae, - 0x001080ae, 0x001080ae, 0x001080ae, 0x001080ae, - 0x001080ae, 0x001080ae, 0x001080ae, 0x001080b2, - 0x001080ae, 0x001080ae, 0x05c1f941, 0x5c03e000, - 0x05ec0eb9, 0x05fdf6d7, 0x5c03e000, 0x05ec0eb6, - 0x4d2c0000, 0x59325809, 0x59300403, 0xb0000592, - 0x05c40fe4, 0x0501fa59, 0x05c00935, 0x64165a07, - 0x0001fb5b, 0x05e1fe1c, 0x05f5fc55, 0x5c025800, - 0x90000541, 0x1c01f000, 0x598c000b, 0x81300580, - 0x05020018, 0x59300004, 0x8c000520, 0x05000004, - 0x84000520, 0x48026004, 0x0501f018, 0x42001000, - 0x0010af8e, 0x50081000, 0x58080002, 0x82000580, - 0x00000100, 0x05000009, 0x5808000b, 0x81300580, - 0x05c2091b, 0x0201f800, 0x0010eee3, 0x80c40040, - 0x05c20917, 0x05fdf7d9, 0x05f1f9b2, 0x0502000c, - 0x59300004, 0x8c000520, 0x05000004, 0x84000520, - 0x48026004, 0x05fdf7d1, 0x0201f800, 0x0010eee3, - 0x80c40040, 0x05fc07cd, 0x05c1f909, 0x59300203, - 0x90000c91, 0x05c21906, 0x0c01f7b3, 0x4d340000, - 0x4d240000, 0x5932481d, 0x5932680a, 0x59300407, - 0x4933c857, 0x4803c857, 0x90000c92, 0x05c218fc, - 0x0c01f804, 0x5c024800, 0x5c026800, 0x1c01f000, - 0x0010810d, 0x00108130, 0x00108265, 0x0010f510, - 0x0010825c, 0x00108261, 0x001096fd, 0x00108114, - 0x00108258, 0x0010810a, 0x001082c2, 0x0010810a, - 0x0010810a, 0x0010810a, 0x0010810a, 0x00020c5a, - 0x00108acd, 0x00108acd, 0x05c1f8e5, 0x0501fb12, - 0x05f802ed, 0x1c01f000, 0x05edfe6f, 0x05edfdc3, - 0x05edfe59, 0x0005f45a, 0x64066006, 0x1c01f000, - 0x4d340000, 0x4c5c0000, 0x59300203, 0x90000591, - 0x05020014, 0x5932680a, 0x4130b800, 0x0005fc3d, - 0x0500000f, 0x64066203, 0x647a6403, 0x585c041b, - 0x4802641b, 0x585c021b, 0x4802621b, 0x4936600a, - 0x585c001d, 0x4802601d, 0x0501fdbb, 0x64066407, - 0x42000800, 0x80000040, 0x0005fb2e, 0x405e6000, - 0x0005fc5a, 0x5c00b800, 0x5c026800, 0x1c01f000, - 0x42000000, 0x0010b061, 0x050dfe63, 0x050dfd8e, - 0x59300203, 0x90000c91, 0x05c218b9, 0x4803c857, - 0x0c01f001, 0x0010814a, 0x00108112, 0x0010814b, - 0x0010814a, 0x0010814b, 0x0010814b, 0x0010810e, - 0x0010814a, 0x0010810b, 0x0010814a, 0x0010814a, - 0x0010814a, 0x0010814a, 0x0010814a, 0x0010814b, - 0x0010814a, 0x0010814a, 0x05c1f8a5, 0x4d2c0000, - 0x59340400, 0x82000500, 0x000000ff, 0x90000c8c, - 0x05c2189f, 0x59303403, 0xb0180d91, 0x0500000c, - 0x90180d84, 0x05020003, 0x60040000, 0x0501f004, - 0x90180d80, 0x05020002, 0x60040000, 0x4803c857, - 0x0c01f823, 0x5c025800, 0x1c01f000, 0x42000000, - 0x0010b05d, 0x050dfe34, 0x05cdfdc5, 0x59340412, - 0x82000500, 0x000000ff, 0x05000016, 0x80000040, - 0x48026c12, 0x4d300000, 0x05f5fbdb, 0x5c000000, - 0x0500000f, 0x641c0407, 0x4a000006, 0x00000398, - 0x49238830, 0x4a038832, 0xffffffff, 0x4926601d, - 0x497a6009, 0x4936600a, 0x64066407, 0x64066203, - 0x65466403, 0x5c025800, 0x05edf4a8, 0x40026000, - 0x5c025800, 0x60042800, 0x0505f421, 0x0010818b, - 0x00108217, 0x0010818c, 0x001081c3, 0x0010818c, - 0x0010822d, 0x0010818c, 0x00108193, 0x0010818b, - 0x0010822d, 0x0010818b, 0x0010819e, 0x05c1f864, - 0x59300403, 0x90000d96, 0x05000033, 0x90000d84, - 0x05000031, 0x90000d82, 0x0500002f, 0x0501fa8a, - 0x0500002d, 0x59300403, 0x90000da2, 0x05000098, - 0x90000db9, 0x0500009f, 0x90000db5, 0x0500009d, - 0x90000d9e, 0x05000025, 0x0501f974, 0x05000005, - 0x0501fff8, 0x05020003, 0x05e1fb29, 0x0501f01e, - 0x59300403, 0x90000d81, 0x0502000f, 0x5930081d, - 0x58040200, 0x8c000500, 0x050403f0, 0x5930080a, - 0x58040403, 0x82000580, 0x000007fe, 0x05020004, - 0x60042800, 0x0505fbee, 0x0005f45a, 0x05e1fae8, - 0x0500000d, 0x59340403, 0x82000480, 0x000007f0, - 0x0502100a, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010ec6c, 0x5c027800, 0x42000000, 0x0010b056, - 0x050dfdd5, 0x05f9fa38, 0x05f5f351, 0x0501f94f, - 0x05000003, 0x0501ffd3, 0x05000083, 0x59300c03, - 0x90040596, 0x05000049, 0x90040582, 0x0502002d, - 0x59a8021b, 0x8c000502, 0x0502000c, 0x05e5f85e, - 0x0502000a, 0x05e5f87d, 0x05020004, 0x60040000, - 0x05e5f82d, 0x0501f074, 0x64075014, 0x6006d800, - 0x05e1ffd3, 0x0501f070, 0x59340200, 0x8c000508, - 0x05000007, 0x84000508, 0x48026a00, 0x59300416, - 0x84000510, 0x48026416, 0x0501f011, 0x59340412, - 0x82000500, 0x000000ff, 0x05000012, 0x80000040, - 0x48026c12, 0x5932481d, 0x497a6205, 0x4d300000, - 0x05f5fb59, 0x5c000000, 0x05000009, 0x49780009, - 0x641c0407, 0x4a000006, 0x00000398, 0x4926601d, - 0x4936600a, 0x64066407, 0x0501f01c, 0x40026000, - 0x59300403, 0x90000d82, 0x0502000d, 0x59340403, - 0x82000580, 0x000007fe, 0x05020007, 0x59a8021b, - 0x84000540, 0x4803521b, 0x05ddfc45, 0x05f9f9f6, - 0x0501f00c, 0x600c0002, 0x05f5fd98, 0x05f9f9f2, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ec6c, - 0x5c027800, 0x42000000, 0x0010b056, 0x050dfd86, - 0x05cdfac1, 0x05f5f302, 0x600c0800, 0x05ddfed8, - 0x64066203, 0x640a6403, 0x05edf40c, 0x0501f8fb, - 0x05fe07a9, 0x05cdfab8, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010ec6c, 0x5c027800, 0x42000000, - 0x0010b056, 0x050dfd74, 0x60603000, 0x41782800, - 0x60002000, 0x4d400000, 0x4d440000, 0x59368c03, - 0x60a68000, 0x0505f9eb, 0x5c028800, 0x5c028000, - 0x05f5f2e7, 0x05e1fa9e, 0x05fdf7d9, 0x42000000, - 0x0010b060, 0x050dfd64, 0x60140002, 0x05f5fd6b, - 0x05fc07d3, 0x05f5fd7e, 0x05fe07d1, 0x1c01f000, - 0x59300c03, 0x0501fd31, 0x0006045a, 0x916c0583, - 0x05000003, 0x640a6006, 0x1c01f000, 0x59300403, - 0x48026418, 0x64066229, 0x4a026403, 0x00000085, - 0x64266203, 0x640a6407, 0x42000800, 0x80000040, - 0x0005f32e, 0x05f9f9b0, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010ec6c, 0x5c027800, 0x42000000, - 0x0010b056, 0x050dfd44, 0x497a6009, 0x641e6407, - 0x4a026006, 0x00000398, 0x497a6205, 0x1c01f000, - 0x42000000, 0x0010b067, 0x050dfd3b, 0x05fdf6d5, - 0x42000000, 0x0010b062, 0x050dfd37, 0x050dfc62, - 0x05f5f2b3, 0x42000000, 0x0010b064, 0x050dfd32, - 0x1c01f000, 0x42000000, 0x0010b063, 0x050dfd2e, - 0x59300203, 0x90000c91, 0x05be1f85, 0x4803c857, - 0x0c01f001, 0x0010827e, 0x00108112, 0x0010827e, - 0x0010827e, 0x0010827e, 0x0010827e, 0x0010827e, - 0x0010827e, 0x0010827e, 0x00108112, 0x0010827f, - 0x00108112, 0x00108289, 0x0010827e, 0x0010827f, - 0x0010827e, 0x0010827e, 0x05bdff71, 0x59300403, - 0x82000580, 0x0000008b, 0x05000007, 0x4a026403, - 0x0000008b, 0x642e6203, 0x42000800, 0x80004040, - 0x0005f32e, 0x59300a29, 0x0501f888, 0x0500000b, - 0x4d2c0000, 0x59325809, 0x641a5a07, 0x497a5c0a, - 0x0001fb5b, 0x59300a29, 0x90040d83, 0x05e009a8, - 0x5c025800, 0x497a6009, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010ec6c, 0x5c027800, 0x60443000, - 0x050dfb52, 0x42000000, 0x0010b056, 0x050dfcf6, - 0x4c5c0000, 0x4130b800, 0x05f5faa3, 0x05000009, - 0x4936600a, 0x4926601d, 0x0501fc3b, 0x4d300000, - 0x405e6000, 0x05f5fa6a, 0x5c026000, 0x0501f002, - 0x405e6000, 0x5c00b800, 0x497a6009, 0x64066407, - 0x64066403, 0x59240400, 0x8c00050a, 0x0502000b, - 0x64126407, 0x641e6203, 0x6406642c, 0x60103000, - 0x4d400000, 0x60a68000, 0x41782800, 0x0509fdda, - 0x5c028000, 0x1c01f000, 0x602c0800, 0x05ddfe2c, - 0x64066203, 0x05edf361, 0x42000000, 0x0010b069, - 0x050dfcd1, 0x59300203, 0x90000c91, 0x05be1f28, - 0x4803c857, 0x0c01f001, 0x001082eb, 0x001082db, - 0x001082dd, 0x001082ec, 0x001082dc, 0x001082db, - 0x001082db, 0x001082db, 0x001082db, 0x001082db, - 0x001082db, 0x001082db, 0x001082db, 0x001082db, - 0x001082db, 0x001082db, 0x001082db, 0x05bdff14, - 0x05c5f8fb, 0x4d2c0000, 0x59325809, 0x641a5a07, - 0x0001fb5b, 0x5c025800, 0x497a6009, 0x642a6229, - 0x4a026403, 0x00000085, 0x64266203, 0x640a6407, - 0x42000800, 0x80004040, 0x0005f32e, 0x1c01f000, - 0x05edfc91, 0x4df00000, 0x05fdfd8a, 0x05020003, - 0x05edff67, 0x0502000a, 0x0201f800, 0x0010ed56, - 0x80c40040, 0x05020004, 0x5c03e000, 0x05edfc72, - 0x05fdf7e5, 0x05edfb9e, 0x05be0ef5, 0x5c03e000, - 0x05edfc6d, 0x59300203, 0x90000d83, 0x05bc0ef0, - 0x90000c91, 0x05be1eee, 0x0c01f7c8, 0x59a8000d, - 0x59a80864, 0x80040400, 0x80080480, 0x05021003, - 0x90000541, 0x1c01f000, 0x480bc857, 0x80000580, - 0x1c01f000, 0x0501f805, 0x60018800, 0x05000002, - 0x60058800, 0x1c01f000, 0x4c040000, 0x59300809, - 0x59a8000c, 0x80040480, 0x05001007, 0x59a8000a, - 0x80040480, 0x05021004, 0x800409c0, 0x5c000800, - 0x1c01f000, 0x800409c0, 0x05be0ed1, 0x4803c856, - 0x05fdf7fb, 0x4803c856, 0x4d300000, 0x0005fc3d, - 0x05000007, 0x0501f828, 0x4d380000, 0x612e7000, - 0x0005fc78, 0x5c027000, 0x90000541, 0x5c026000, - 0x1c01f000, 0x4803c856, 0x4d300000, 0x05f5fa16, - 0x05000019, 0x0501f81c, 0x4d300000, 0x05edfc4a, - 0x4df00000, 0x05edfb02, 0x4d3c0000, 0x60027840, - 0x0201f800, 0x0010f148, 0x0201f800, 0x0010f1e1, - 0x0201f800, 0x0010f603, 0x5c027800, 0x5c03e000, - 0x05ec0c29, 0x5c026000, 0x8d3c053e, 0x05020008, - 0x4d380000, 0x61327000, 0x0005fc78, 0x5c027000, - 0x90000541, 0x5c026000, 0x1c01f000, 0x0005fc5a, - 0x05fdf7fc, 0x592c0408, 0x494a6019, 0x494e601a, - 0x4936600a, 0x492e6009, 0x640e6407, 0x59340802, - 0x4806600b, 0x800000c2, 0x800008c4, 0x80040400, - 0x48026006, 0x05e1f993, 0x4926601d, 0x0501f386, - 0x493bc857, 0x4d300000, 0x0005fc3d, 0x0500000a, - 0x05fdffed, 0x4d400000, 0x60168000, 0x0501f80a, - 0x5c028000, 0x8d3c053e, 0x05020005, 0x0005fc78, - 0x90000541, 0x5c026000, 0x1c01f000, 0x0005fc5a, - 0x05fdf7fc, 0x4803c856, 0x05edfc0f, 0x4df00000, - 0x4d3c0000, 0x4d440000, 0x59368c03, 0x60067840, - 0x0201f800, 0x0010f0b7, 0x0201f800, 0x0010f109, - 0x0201f800, 0x0010f1e1, 0x0201f800, 0x0010f603, - 0x5c028800, 0x5c027800, 0x5c03e000, 0x05ec03ea, - 0x1c01f000, 0x4803c856, 0x4d300000, 0x05f5f9c2, - 0x0500000e, 0x481a601e, 0x48ee602d, 0x4936600a, - 0x05e1f964, 0x4926601d, 0x0501fb57, 0x64066407, - 0x492e6009, 0x4d380000, 0x607e7000, 0x0005fc78, - 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x05f5f9af, 0x0500000d, - 0x48ee602d, 0x4936600a, 0x05e1f952, 0x4926601d, - 0x0501fb45, 0x64066407, 0x492e6009, 0x4d380000, - 0x61567000, 0x0005fc78, 0x5c027000, 0x90000541, - 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x05f5f99d, 0x0500000e, 0x481a601e, 0x48ee602d, - 0x4936600a, 0x05e1f93f, 0x4926601d, 0x0501fb32, - 0x64066407, 0x492e6009, 0x4d380000, 0x60f67000, - 0x0005fc78, 0x5c027000, 0x90000541, 0x5c026000, - 0x1c01f000, 0x4803c856, 0x4d300000, 0x05f5f98a, - 0x05000012, 0x4926601d, 0x4936600a, 0x0501fb22, - 0x492fc857, 0x4933c857, 0x592c0405, 0x8c00051e, - 0x05000003, 0x48efc857, 0x48ee602d, 0x64066407, - 0x492e6009, 0x4d380000, 0x60027000, 0x0005fc78, - 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x05f5f973, 0x0500000e, - 0x48ee602d, 0x481a601e, 0x4936600a, 0x05e1f915, - 0x4926601d, 0x0501fb08, 0x64066407, 0x492e6009, - 0x4d380000, 0x61127000, 0x0005fc78, 0x5c027000, - 0x90000541, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x05f5f960, 0x0500000e, 0x481a601e, - 0x48ee602d, 0x4936600a, 0x05e1f902, 0x4926601d, - 0x0501faf5, 0x64066407, 0x492e6009, 0x4d380000, - 0x61267000, 0x0005fc78, 0x5c027000, 0x90000541, - 0x5c026000, 0x1c01f000, 0x5930000a, 0x80001540, - 0x05bc0df7, 0x8d0c0512, 0x05020007, 0x5808040b, - 0x4803c856, 0x80000040, 0x05001003, 0x4800140b, - 0x05020008, 0x58080010, 0x80000540, 0x05000005, - 0x58080203, 0x80000540, 0x05020002, 0x64041203, - 0x1c01f000, 0x4803c856, 0x59300403, 0x90000d82, - 0x0500000b, 0x90000d83, 0x05000009, 0x90000d84, - 0x05000007, 0x599c0819, 0x8c04050e, 0x05000003, - 0x90000d80, 0x05000002, 0x90000541, 0x1c01f000, - 0x0501f805, 0x60058800, 0x05000002, 0x60018800, - 0x1c01f000, 0x4803c856, 0x4c000000, 0x4d2c0000, - 0x59300407, 0x90000584, 0x05000017, 0x59300009, - 0x80025d40, 0x800001c0, 0x05000013, 0x0501fd71, - 0x0500000f, 0x59300407, 0x90004590, 0x0500000c, - 0x90004591, 0x0500000a, 0x90004583, 0x0500000a, - 0x90004582, 0x05000008, 0x9000458a, 0x05000006, - 0x592c0405, 0x8c00051e, 0x05000003, 0x80000580, - 0x0501f002, 0x90000541, 0x5c025800, 0x5c000000, - 0x1c01f000, 0x4803c856, 0x4d300000, 0x05f5f906, - 0x05000011, 0x4926601d, 0x4936600a, 0x0501fa9e, - 0x48ee602d, 0x64066407, 0x492e6009, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010ec6c, 0x5c027800, - 0x4d380000, 0x60a27000, 0x0005fc78, 0x5c027000, - 0x90000541, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x91380595, 0x05020009, 0x59a80077, 0xb00005b4, - 0x05020006, 0x41780800, 0x05ddfd7a, 0x64066203, - 0x64a66403, 0x05edf1c5, 0x05f5ff9b, 0x0005f45a, - 0x4803c856, 0x91380596, 0x05020004, 0x60100800, - 0x05ddfc87, 0x05f5f2f4, 0x91380595, 0x0502000d, - 0x59a80077, 0x90000594, 0x0502000a, 0x05ddfdda, - 0x05f9fbc7, 0x05020007, 0x59340404, 0x80000540, - 0x05000004, 0x60180800, 0x05ddfc79, 0x05f5f2e6, - 0x05f5ff85, 0x0005f45a, 0x4803c856, 0x592c0207, - 0x90000585, 0x05000002, 0x1c01f000, 0x4803c856, - 0x592c0209, 0x8400054a, 0x48025a09, 0x1c01f000, - 0x59300809, 0x800409c0, 0x05000008, 0x58040205, - 0x82000580, 0x00000152, 0x05020004, 0x59a8082e, - 0x48066006, 0x1c01f000, 0x599c0416, 0x800001c0, - 0x05000007, 0x90000c84, 0x05001005, 0x800000c2, - 0x800008c4, 0x80040c00, 0x05fdf7f6, 0x59300403, - 0x90000582, 0x05fe07f2, 0x5930080a, 0x58040403, - 0x82000580, 0x000007fe, 0x05fe07ed, 0x60a00800, - 0x05fdf7ec, 0x4803c856, 0x59300c03, 0xb13805a1, - 0x05000019, 0xb13805a0, 0x05000017, 0xb13805a2, - 0x0502001e, 0x497a6205, 0x90040582, 0x05000006, - 0x9004059e, 0x0500000e, 0x90040584, 0x05020017, - 0x0501f003, 0x600c0800, 0x05ddfc3d, 0x59340200, - 0x84000508, 0x48026a00, 0x59300416, 0x84000510, - 0x48026416, 0x64066203, 0x05edf16c, 0x64166203, - 0x0501f00a, 0x59340200, 0x8c00050e, 0x05020002, - 0x497a6205, 0x640a6203, 0x90040486, 0x05fc17c1, - 0x59a8002e, 0x48026006, 0x1c01f000, 0x4803c856, - 0xb13805a1, 0x05000003, 0xb13805a0, 0x0502000a, - 0x59303403, 0x82180580, 0x00000086, 0x05f40048, - 0x82180580, 0x00000087, 0x05f40045, 0x497a6205, - 0x642a6203, 0x1c01f000, 0x4803c856, 0xb13805a1, - 0x05000003, 0xb13805a0, 0x05020007, 0x59300403, - 0xb0000c91, 0x05be1d16, 0xb0000480, 0x05bc1d14, - 0x0c01f002, 0x1c01f000, 0x001084f0, 0x001084ef, - 0x001084ef, 0x001084fc, 0x001084ef, 0x001084ef, - 0x001084ef, 0x001084ef, 0x001084ef, 0x001084fc, - 0x001084ef, 0x001084fd, 0x001084fd, 0x001084fd, - 0x001084fd, 0x001084ef, 0x00108500, 0x05bdfd00, - 0x59340200, 0x8c00050e, 0x05020002, 0x497a6205, - 0x59300809, 0x5804020b, 0x8c000502, 0x05000003, - 0x64126203, 0x1c01f000, 0x640a6203, 0x1c01f000, - 0x1c01f000, 0x497a6205, 0x64366203, 0x1c01f000, - 0x0005f45a, 0x4803c856, 0xb13805a1, 0x05000006, - 0xb13805a0, 0x05020009, 0x59cc0002, 0x8c000526, - 0x05000007, 0x59300403, 0xb0000d83, 0x05000005, - 0xb0000d89, 0x05000003, 0x05f5f86a, 0x1c01f000, - 0x59a80030, 0x48026205, 0x640a6203, 0x5930001c, - 0x80000540, 0x05000003, 0x497a601c, 0x0801f800, - 0x1c01f000, 0x497a6205, 0x497a6009, 0x64066203, - 0x65426403, 0x42000800, 0x80000043, 0x0005f32e, - 0x4933c857, 0x4d340000, 0x5932680a, 0x59340200, - 0x8c00050e, 0x05000005, 0x59300407, 0x90000c92, - 0x05021004, 0x0c01f805, 0x5c026800, 0x1c01f000, - 0x05fdfbe1, 0x05fdf7fd, 0x0010810d, 0x00108540, - 0x00108544, 0x00108547, 0x00109a3f, 0x00109a57, - 0x00109a5b, 0x0010810d, 0x0010810d, 0x0010810d, - 0x0010810d, 0x0010810d, 0x0010810d, 0x0010810d, - 0x0010810d, 0x0010810d, 0x0010810d, 0x0010810d, - 0x4803c856, 0x40000000, 0x40000000, 0x1c01f000, - 0x40000000, 0x40000000, 0x1c01f000, 0x5930001e, - 0x4803c857, 0x59300416, 0x4933c857, 0x4803c857, - 0x8c000502, 0x05000005, 0x4803c857, 0x84000540, - 0x48026416, 0x1c01f000, 0x42000000, 0xd0000000, - 0x41300800, 0x05c1fb7b, 0x0501f80e, 0x0502000c, - 0x59300c16, 0x59300403, 0xb0000580, 0x05000003, - 0x84040d40, 0x0501f004, 0x59a8002e, 0x9000040a, - 0x48026205, 0x84040d42, 0x48066416, 0x1c01f000, - 0x4933c857, 0x4d340000, 0x5932680a, 0x59340a00, - 0x8c04050e, 0x05bc0c86, 0x5930001e, 0x80000540, - 0x0502002f, 0x59300403, 0x4803c857, 0xb0000580, - 0x05000003, 0x8d0c050e, 0x05020027, 0x4d1c0000, - 0x41323800, 0x05f1ffd0, 0x05000021, 0x4932381e, - 0x591c0416, 0x84000542, 0x48023c16, 0x4936600a, - 0x05ddff70, 0x4926601d, 0x0501f963, 0x591c0407, - 0x90000583, 0x05000006, 0x591c0202, 0x4802641b, - 0x591c0402, 0x4802621b, 0x0501f005, 0x591c0202, - 0x4802621b, 0x591c0402, 0x4802641b, 0x491e602a, - 0x64066407, 0x64d66403, 0x64066203, 0x42000800, - 0x80000040, 0x0005fb2e, 0x411e6000, 0x5c023800, - 0x80000580, 0x5c026800, 0x1c01f000, 0x411e6000, - 0x5c023800, 0x59a80030, 0x48026205, 0x90000541, - 0x05fdf7f9, 0x4933c857, 0x4d2c0000, 0x4932381e, - 0x4a026202, 0x0000ffff, 0x591e5809, 0x591c0008, - 0x8c00051e, 0x05000005, 0x8400051e, 0x48023808, - 0x497a580a, 0x0501f016, 0x592c0409, 0x8c000518, - 0x05000013, 0x84000518, 0x48025c09, 0x4d400000, - 0x592e8207, 0x64065a07, 0x0501fbeb, 0x49425a07, - 0x5c028000, 0x497a580a, 0x592c0409, 0x8c000512, - 0x05000007, 0x4d2c0000, 0x84000512, 0x48025c09, - 0x592e580a, 0x05bdffd8, 0x5c025800, 0x59a80030, - 0x48026205, 0x591c0216, 0x48026218, 0x90000d81, - 0x05000006, 0x640a3a03, 0x90000585, 0x05000007, - 0x497a6017, 0x0501f01c, 0x591c0008, 0x84000540, - 0x48023808, 0x64123a03, 0x591c0416, 0x4803c857, - 0x8400051c, 0x84000554, 0x48023c16, 0x592c0010, - 0x40001000, 0x591c0818, 0x80040480, 0x05fe17f1, - 0x591c0018, 0x82000500, 0xfffffffc, 0x48026017, - 0x48023818, 0x591c0a16, 0x4807c857, 0x90040d85, - 0x05020005, 0x480bc857, 0x4803c857, 0x4a023814, - 0xffffffff, 0x591c0402, 0x4802641b, 0x591c0202, - 0x4802621b, 0x591e680a, 0x4936600a, 0x64066407, - 0x64e66403, 0x64066203, 0x42000800, 0x80000040, - 0x0005fb2e, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x59300416, 0x8c000514, 0x05000015, 0x8c00051c, - 0x05020012, 0x59300018, 0x80100480, 0x05001006, - 0x05000005, 0x59300416, 0x84000514, 0x8400055c, - 0x0501f009, 0x48126018, 0x48126014, 0x40100000, - 0x592c1810, 0x800c0480, 0x48026013, 0x59300416, - 0x84000514, 0x48026416, 0x1c01f000, 0x4933c857, - 0x8c00051c, 0x05020008, 0x59300014, 0x4803c857, - 0x48026018, 0x59300416, 0x8400055c, 0x4803c857, - 0x48026416, 0x1c01f000, 0x0501f805, 0x60058800, - 0x05000002, 0x60018800, 0x1c01f000, 0x59300c03, - 0x4933c857, 0x4807c857, 0x900404b4, 0x05001005, - 0x900404bc, 0x05021003, 0x80000580, 0x1c01f000, - 0x90000541, 0x05fdf7fe, 0x4d340000, 0x4d240000, - 0x5932481d, 0x5932680a, 0x59300407, 0x90000c92, - 0x05021003, 0x4803c857, 0x0c01f804, 0x5c024800, - 0x5c026800, 0x1c01f000, 0x00108644, 0x00108646, - 0x00108649, 0x00108685, 0x00109a1c, 0x001099e8, - 0x00109a20, 0x00108645, 0x00108644, 0x00108645, - 0x00108645, 0x00108645, 0x00108645, 0x00108645, - 0x00108645, 0x00108645, 0x00108645, 0x00108645, - 0x05bdfbab, 0x1c01f000, 0x40000000, 0x40000000, - 0x1c01f000, 0x59300403, 0x82000d80, 0x00000085, - 0x05020007, 0x4a026403, 0x0000008b, 0x642e6203, - 0x42000800, 0x80004040, 0x0005f32e, 0x82000d80, - 0x0000008b, 0x0502002f, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010ec6c, 0x5c027800, 0x42000000, - 0x0010b056, 0x050df938, 0x05fdfcb4, 0x0500000e, - 0x4d2c0000, 0x59325809, 0x4a025a05, 0x00000103, - 0x59300402, 0x48025c07, 0x641a5a07, 0x497a580a, - 0x0001fb5b, 0x59300a29, 0x90040d83, 0x05fc0d8b, - 0x5c025800, 0x60443000, 0x0509ff80, 0x64066403, - 0x497a6009, 0x05cdf8b6, 0x59240400, 0x8c00050a, - 0x0502000b, 0x41782800, 0x60103000, 0x4d400000, - 0x60a68000, 0x0509fa1c, 0x5c028000, 0x64126407, - 0x641e6203, 0x6406642c, 0x1c01f000, 0x602c0800, - 0x05ddfa6b, 0x64066407, 0x64066203, 0x05e9f79f, - 0x1c01f000, 0x59300416, 0x8c00051a, 0x05020021, - 0x5930080a, 0x58040200, 0x8c00050e, 0x05000006, - 0x59300a03, 0x90040590, 0x05000003, 0x90040583, - 0x05020018, 0x05fdf8d6, 0x59300203, 0x90000d89, - 0x0500000b, 0x48026429, 0x4a026403, 0x00000085, - 0x59300416, 0x8400055a, 0x8400055e, 0x48026416, - 0x64266203, 0x640a6407, 0x640e6229, 0x59a8002f, - 0x48026205, 0x42000800, 0x80004040, 0x0501fdf8, - 0x0005fb2e, 0x4203e000, 0xb0800000, 0x6023f800, - 0x1c01f000, 0x41780800, 0x59a8102c, 0x60c80000, - 0x05e9fe90, 0x800811c0, 0x05020002, 0x60501000, - 0x480b502e, 0x59a8102d, 0x480b5022, 0x41780800, - 0x61900000, 0x05e9fe87, 0x800811c0, 0x05020002, - 0x60501000, 0x480b502f, 0x9008140a, 0x480b5030, - 0x60040800, 0x05edf8fd, 0x42000000, 0x30000000, - 0x40080800, 0x0001f92d, 0x600c0800, 0x59a8100f, - 0x05edf8e8, 0x05ddf554, 0x64a3502e, 0x6453502f, - 0x4a035022, 0x000007d0, 0x60781000, 0x480b5030, - 0x60040800, 0x05edf8ed, 0x42000000, 0x30000000, - 0x40080800, 0x0001f92d, 0x600c0800, 0x59a8100f, - 0x05edf0d8, 0x4933c857, 0x4d2c0000, 0x59300403, - 0x900005be, 0x05020004, 0x59325819, 0x812e59c0, - 0x05be0eb0, 0x5c025800, 0x1c01f000, 0x0501f802, - 0x1c01f000, 0x4933c857, 0x813669c0, 0x0500000c, - 0x59340200, 0x8c000508, 0x05000009, 0x4a026416, - 0x00000100, 0x8c00050c, 0x59300008, 0x05000002, - 0x84000544, 0x84000542, 0x48026008, 0x1c01f000, - 0x59300416, 0x8c000510, 0x1c01f000, 0x4937c857, - 0x4d300000, 0x05f1fe50, 0x0500000d, 0x4926601d, - 0x4936600a, 0x05fdffe8, 0x64066407, 0x492e6009, - 0x60240800, 0x05ddf9ee, 0x4d380000, 0x60ce7000, - 0x0005fc78, 0x5c027000, 0x90000541, 0x5c026000, - 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c580000, - 0x4d3c0000, 0x59325809, 0x91380595, 0x0502001d, - 0x59a8b077, 0x90580c99, 0x05001002, 0x6060b000, - 0x8058b104, 0x0501fa4f, 0x80000580, 0x0501fa5e, - 0x912cac0a, 0x91cca406, 0x050df94a, 0x4c600000, - 0x6004c000, 0x592c100b, 0x8c080518, 0x05020006, - 0x59240005, 0x592c100e, 0x80080580, 0x05020006, - 0x4178c000, 0x5930100a, 0x58081403, 0x417a7800, - 0x05c9fdd1, 0x5c00c000, 0x05f5f833, 0x0501f005, - 0x6008b000, 0x0501fa54, 0x05f5fccf, 0x0005fc5a, - 0x5c027800, 0x5c00b000, 0x5c025800, 0x1c01f000, - 0x4933c856, 0x60018800, 0x4a02601d, 0x0010b111, - 0x4936600a, 0x05fdffac, 0x64066407, 0x492e6009, - 0x4d380000, 0x61367000, 0x0005fc78, 0x5c027000, - 0x90000541, 0x60058800, 0x1c01f000, 0x4803c856, - 0x4d2c0000, 0x91380595, 0x05020025, 0x59a80877, - 0x59325809, 0x5930040c, 0x80040580, 0x05020020, - 0x4c500000, 0x4c540000, 0x4c580000, 0x91cca406, - 0x4050a800, 0x5930b40c, 0x9058b403, 0x8058b104, - 0x050df94b, 0x91cca406, 0x592cb206, 0x9058b403, - 0x8058b104, 0x912cac07, 0x050df90a, 0x592e5801, - 0x812e59c0, 0x05fe07f9, 0x5931d82d, 0x58ef400a, - 0x58ee580c, 0x4a025a05, 0x00000103, 0x58ec0008, - 0x0801f800, 0x59300402, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x5c025800, 0x1c01f000, 0x05f5fc92, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x90040db5, - 0x05000005, 0x5930141b, 0x0501f844, 0x05000025, - 0x0501f006, 0x4d300000, 0x5932602a, 0x0501f848, - 0x5c026000, 0x0500001e, 0x591c0c07, 0x90040583, - 0x05000003, 0x90040586, 0x0502001b, 0x591c0c02, - 0x5930041b, 0x80040580, 0x05000009, 0x5930021b, - 0x80040580, 0x05020014, 0x591c0a02, 0x5930041b, - 0x80040580, 0x05020010, 0x0501f009, 0x59300a1b, - 0x82040580, 0x0000ffff, 0x05000005, 0x591c0202, - 0x59300a1b, 0x80040580, 0x05020007, 0x591c000a, - 0x5930080a, 0x80040580, 0x1c01f000, 0x417a3800, - 0x90000541, 0x1c01f000, 0x4803c856, 0x4203e000, - 0xb0800000, 0x600009fe, 0x4203f800, 0x30000000, - 0x40000000, 0x80040840, 0x05bc0a51, 0x05ffb7fb, - 0x1c01f000, 0x4803c856, 0x4203e000, 0xb0800000, - 0x4203f800, 0x20000000, 0x1c01f000, 0x0501f805, - 0x60058800, 0x05020002, 0x60018800, 0x1c01f000, - 0x59300808, 0x8c04051e, 0x592c0c09, 0x05020002, - 0x8c040518, 0x1c01f000, 0x05fdfb51, 0x05000007, - 0x800800ca, 0x800808c8, 0x80040c00, 0x82063c00, - 0x001102e4, 0x491fc857, 0x1c01f000, 0x0501fcf0, - 0x05020007, 0x59301402, 0x05fdfff4, 0x05000007, - 0x411c0000, 0x81300580, 0x05000003, 0x81780500, - 0x0501f002, 0x81300540, 0x1c01f000, 0x4d300000, - 0x83440480, 0x000007f0, 0x05001003, 0x05ddfd29, - 0x0501f002, 0x0001fae7, 0x0502000c, 0x42026000, - 0x00110284, 0x4936600a, 0x492e6009, 0x05ddfd19, - 0x4926601d, 0x0201f800, 0x0010ec6c, 0x80000580, - 0x5c026000, 0x1c01f000, 0x90000541, 0x05fdf7fd, - 0x4933c857, 0x05fdfb35, 0x05bc0a11, 0x4d2c0000, - 0x4d340000, 0x4d440000, 0x4c580000, 0x59325809, - 0x5932680a, 0x49425a07, 0x0005f8e2, 0x592e8c07, - 0x592c4208, 0x9020050f, 0x0c01f806, 0x5c00b000, - 0x5c028800, 0x5c026800, 0x5c025800, 0x1c01f000, - 0x00108802, 0x00108820, 0x00108826, 0x00108829, - 0x00108831, 0x00108800, 0x00108800, 0x00108800, - 0x00108834, 0x0010883e, 0x0010883e, 0x00108800, - 0x00108800, 0x00108800, 0x00108800, 0x00108800, - 0x4803c857, 0x05bdf9ee, 0x814281c0, 0x05020011, - 0x41785800, 0x592c0405, 0x8c00051c, 0x05020002, - 0x59345c05, 0x442c2800, 0x59340008, 0x48002802, - 0x59340009, 0x48002801, 0x59340006, 0x48002804, - 0x59340007, 0x48002803, 0x602cb000, 0x0501f02d, - 0x592c0208, 0x8c00051e, 0x6008b000, 0x05020029, - 0x9004b540, 0x05000027, 0x44042800, 0x5932680a, - 0x59340400, 0x48002801, 0x6008b000, 0x0501f021, - 0x814281c0, 0x05fe07f3, 0x59345c05, 0x442c2800, - 0x6004b000, 0x0501f01b, 0x9140b540, 0x05000019, - 0x0501f021, 0x814281c0, 0x0502001f, 0x59340200, - 0x44002800, 0x59340001, 0x48002801, 0x6008b000, - 0x0501f010, 0x9140b540, 0x05020017, 0x0501f00d, - 0x9140b540, 0x0500000b, 0x05ddfca3, 0x05000012, - 0x8c20050e, 0x05000002, 0x497a600a, 0x4178b000, - 0x497a5a07, 0x0501f003, 0x9140b540, 0x0502000a, - 0x592c0405, 0x8400051c, 0x48025c05, 0x592c0208, - 0x8400051e, 0x48025a08, 0x0501f91a, 0x497a6009, - 0x0001f35b, 0x592c0208, 0x8c00051e, 0x6008b000, - 0x05fe07f4, 0x9004b540, 0x05fc07f2, 0x44042800, - 0x6004b000, 0x05fdf7ef, 0x4937c857, 0x4d300000, - 0x05f1fcf1, 0x0500000d, 0x4926601d, 0x4936600a, - 0x05fdfe89, 0x64066407, 0x492e6009, 0x602c0800, - 0x05ddf88f, 0x4d380000, 0x610e7000, 0x0005fc78, - 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, - 0x4937c857, 0x4d2c0000, 0x4d200000, 0x59340013, - 0x80024130, 0x59325809, 0x91380595, 0x05020022, - 0x59a80077, 0x90000584, 0x0502001f, 0x59240005, - 0x592c100a, 0x80080580, 0x05020011, 0x4d440000, - 0x592e8c07, 0x592c0208, 0x4803c856, 0x82000500, - 0x00000080, 0x84000548, 0x4d3c0000, 0x60027820, - 0x8c00050e, 0x05000002, 0x853e7d5c, 0x05ddfbd4, - 0x5c027800, 0x5c028800, 0x0501f003, 0x4803c856, - 0x05ddfc55, 0x05fdfa8d, 0x05000011, 0x4d400000, - 0x60028000, 0x41780800, 0x05fdff52, 0x5c028000, - 0x0501f00a, 0x05ddfc4c, 0x05fe07f7, 0x05fdfa83, - 0x05000007, 0x4c580000, 0x6008b000, 0x0501f8ea, - 0x5c00b000, 0x05f5fb64, 0x0005fc5a, 0x5c024000, - 0x5c025800, 0x1c01f000, 0x4937c857, 0x4d300000, - 0x05f1fca9, 0x0500000f, 0x4926601d, 0x4936600a, - 0x05fdfe41, 0x64066407, 0x4d3c0000, 0x4d380000, - 0x417a7800, 0x05ddf83b, 0x492e6009, 0x60127000, - 0x0005fc78, 0x5c027000, 0x5c027800, 0x90000541, - 0x5c026000, 0x1c01f000, 0x4937c857, 0x4d300000, - 0x05f1fc95, 0x0500000d, 0x4926601d, 0x4936600a, - 0x05fdfe2d, 0x600c0800, 0x05ddf835, 0x64066407, - 0x492e6009, 0x4d380000, 0x61467000, 0x0005fc78, - 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, - 0x4933c857, 0x4c580000, 0x4d240000, 0x4d200000, - 0x4d400000, 0x4d440000, 0x4d3c0000, 0x5932481d, - 0x59240a00, 0x8c040500, 0x0500007f, 0x05c9fe5c, - 0x59325809, 0x91383595, 0x0502004e, 0x60100800, - 0x05ddf81b, 0x60040800, 0x05ddf902, 0x812e59c0, - 0x0502003b, 0x59a8007b, 0x80000040, 0x4803507b, - 0x417a8000, 0x59cc0000, 0x82000500, 0x00ffffff, - 0x59240805, 0x4803c857, 0x4807c857, 0x800409c0, - 0x05000016, 0x80041580, 0x05000014, 0x4c000000, - 0x60aa8000, 0x59240400, 0x8c00050a, 0x05020004, - 0x60083000, 0x61fe89ff, 0x0505ffb4, 0x417a7800, - 0x05c9fe87, 0x05c9fef6, 0x600a8000, 0x59cc0c08, - 0x8c04051e, 0x05020004, 0x59240a00, 0x84040d56, - 0x48064a00, 0x5c000000, 0x48024805, 0x40000800, - 0x812000f0, 0x80040540, 0x48026813, 0x40040000, - 0xb1200c80, 0x05021004, 0x49238830, 0x84000570, - 0x48038832, 0x59240200, 0x82000540, 0x00000206, - 0x48024a00, 0x59240400, 0x8c00050c, 0x05000004, - 0x65466429, 0x0501f847, 0x0501f03f, 0x60040000, - 0x05ddfefe, 0x0005fc5a, 0x0501f03b, 0x592c0009, - 0x82000500, 0x00ffffff, 0x05020008, 0x0005f8e2, - 0x59cc0000, 0x82000500, 0x00ffffff, 0x44002800, - 0x6004b000, 0x0501f847, 0x05f1fe3f, 0x0501f02e, - 0x812e59c0, 0x05020029, 0x59340412, 0x800001c0, - 0x05000023, 0x80000040, 0x48026c12, 0x59cc0c07, - 0x82043500, 0x000000ff, 0x481bc857, 0x90180583, - 0x05020013, 0x59cc0207, 0x4803c857, 0x82000d00, - 0x0000ff00, 0x4807c857, 0x82040580, 0x00000d00, - 0x0502000b, 0x59240a00, 0x84040d48, 0x48064a00, - 0x602c0800, 0x05d9ffb6, 0x64066407, 0x64066203, - 0x64066403, 0x05e9fce9, 0x0501f00f, 0x600c0800, - 0x05d9ffaf, 0x4a026202, 0x0000ffff, 0x64066203, - 0x65466403, 0x05e9fce1, 0x0501f007, 0x600c2800, - 0x0501fc5b, 0x0501f004, 0x6008b000, 0x0501f836, - 0x05f5fab1, 0x5c027800, 0x5c028800, 0x5c028000, - 0x5c024000, 0x5c024800, 0x5c00b000, 0x1c01f000, - 0x4933c857, 0x61f2880f, 0x42003000, 0x00fffffc, - 0x05d9ffc1, 0x05be089a, 0x4936600a, 0x05fdfd8a, - 0x417a7800, 0x05d9ff87, 0x600c0800, 0x05d9ff90, - 0x497a6c12, 0x64066203, 0x640a6403, 0x05e9f4c3, - 0x492fc857, 0x4c580000, 0x4c000000, 0x8058b1c0, - 0x0500000a, 0x82580500, 0xfffffff0, 0x05be0888, - 0x8058b0d0, 0x592c0409, 0x82000500, 0xfffff0ff, - 0x80580540, 0x48025c09, 0x5c000000, 0x5c00b000, - 0x1c01f000, 0x492fc857, 0x4c000000, 0x4c040000, - 0x800000d8, 0x592c0c09, 0x82040d00, 0xffff0fff, - 0x80040540, 0x48025c09, 0x5c000800, 0x5c000000, - 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x59325809, - 0x592c0208, 0x8400055e, 0x48025a08, 0x4c500000, - 0x4c540000, 0x4c580000, 0x05fdffda, 0x0005f8e2, - 0x64602800, 0x80142800, 0x8058b040, 0x91cca407, - 0x4014a800, 0x0509fed3, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x5c025800, 0x1c01f000, 0x0501f805, - 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, - 0x59325809, 0x592c0205, 0x82000580, 0x00000152, - 0x1c01f000, 0x5930002b, 0x80000540, 0x05c208ff, - 0x1c01f000, 0x59300008, 0x82000500, 0x04000800, - 0x82000580, 0x04000800, 0x05020003, 0x59300221, - 0x48025c10, 0x1c01f000, 0x592c0408, 0x82000500, - 0x0000f000, 0x82000580, 0x00003000, 0x05020003, - 0x4a026416, 0x00000100, 0x1c01f000, 0x4d2c0000, - 0x59325809, 0x59300203, 0x4933c857, 0x492fc857, - 0x493bc857, 0x4803c857, 0x90003491, 0x05be1834, - 0x0c01f803, 0x5c025800, 0x1c01f000, 0x001089d0, - 0x001089d6, 0x00108a0e, 0x001089d0, 0x001089d0, - 0x001089d0, 0x001089d0, 0x001089d0, 0x001089d1, - 0x001089d0, 0x001089d0, 0x001089d0, 0x001089d0, - 0x001089d0, 0x00108ab5, 0x001089d0, 0x001089d0, - 0x05bdf81f, 0xb1383498, 0x05be181d, 0x493a6403, - 0x64066203, 0x05e9f44d, 0x91380593, 0x05020010, - 0x492fc857, 0x05fdfd17, 0x05000003, 0x643a6203, - 0x0501f005, 0x592c000d, 0x800001c0, 0x05000005, - 0x640a6203, 0x59a8002e, 0x48026006, 0x1c01f000, - 0x64025a07, 0x0001fb5b, 0x0005f45a, 0x913805a7, - 0x0500001e, 0x91380594, 0x05000018, 0x05fdfd05, - 0x0500000c, 0xb13805a1, 0x05000004, 0xb13805a0, - 0x05fe07f3, 0x4937c857, 0x05edf943, 0x05f20385, - 0x59300203, 0x9000058e, 0x050000bf, 0x05b9fff8, - 0x91380595, 0x05000003, 0x91380596, 0x05ba0ff4, - 0x05edf939, 0x05f2037b, 0x59300203, 0x90000582, - 0x05ba0fef, 0x0501f00d, 0x4937c857, 0x05e9fccf, - 0x6446580f, 0x0501f004, 0x4937c857, 0x05e9fccb, - 0x6442580f, 0x64c65a07, 0x6412580e, 0x0001fb5b, - 0x05ddfccd, 0x05f1f306, 0x59341400, 0x82081d00, - 0x000000ff, 0x59300c03, 0x480bc857, 0x4807c857, - 0xb0040593, 0x05000020, 0x90040582, 0x0500000f, - 0x90040581, 0x05000010, 0x90040583, 0x05000013, - 0x90040585, 0x05000014, 0x900405b3, 0x05000012, - 0x90040580, 0x05000013, 0x90040584, 0x05ba0fcc, - 0x0501f875, 0x0501f010, 0x900c0583, 0x05000837, - 0x0501f00d, 0x900c058b, 0x0502000b, 0x601c0800, - 0x05d9febf, 0x0501f008, 0x900c0585, 0x0500084a, - 0x0501f005, 0x900c0589, 0x05000865, 0x0501f002, - 0x0501f86a, 0x654a6403, 0x59a81077, 0x592c040c, - 0x8c000500, 0x05000002, 0x60201000, 0x592c040c, - 0x8c000516, 0x05000002, 0x90081418, 0x592c000d, - 0x497a580e, 0x497a580f, 0x80080c80, 0x05000007, - 0x05001004, 0x641e5a07, 0x40001000, 0x0501f004, - 0x64565a07, 0x0501f002, 0x64025a07, 0x480a580d, - 0x05f1fc9e, 0x0500000d, 0x592c1001, 0x480a600d, - 0x58080800, 0x90080402, 0x592c1012, 0x592c1813, - 0x60003000, 0x42002000, 0x00101075, 0x05f1fde7, - 0x05000002, 0x1c01f000, 0x64b25a07, 0x497a580d, - 0x0001fb5b, 0x0005f45a, 0x91380595, 0x05020008, - 0x59a8008d, 0x8c000502, 0x05020007, 0x41780800, - 0x05d9ff70, 0x60100800, 0x05d9f685, 0x601c0800, - 0x05d9f683, 0x05ddffc4, 0x60401000, 0x05020008, - 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, - 0x00ff0000, 0x05fc07f2, 0x60201000, 0x05ddfcaa, - 0x05fc07ef, 0x592c040c, 0x84000540, 0x48025c0c, - 0x05fdf7ef, 0x91380595, 0x0502000b, 0x59a8008d, - 0x8c000502, 0x0502000a, 0x05d9ffc7, 0x4d3c0000, - 0x417a7800, 0x05d9fe5f, 0x5c027800, 0x60180800, - 0x05d9f667, 0x60100800, 0x05d9f665, 0x05ddffa6, + 0x05d1fe2b, 0x0005fc5a, 0x42000000, 0x0010b2c7, + 0x0515fb99, 0x6006d800, 0x05e1f75a, 0x0515fcd2, + 0x050e0145, 0x0501fa6d, 0x0501f046, 0x41780800, + 0x05e5fbf6, 0x59341403, 0x82080580, 0x000007fc, + 0x05020024, 0x4a026802, 0x00fffffc, 0x0505fe38, + 0x0500000c, 0x0509fcc1, 0x0502000a, 0x0501f8ac, + 0x41780800, 0x4d400000, 0x60028000, 0x0509fafa, + 0x5c028000, 0x60100800, 0x05e5faf8, 0x0005f45a, + 0x60100800, 0x05e5faf5, 0x05d1fe09, 0x59300c29, + 0x900405a1, 0x05000003, 0xb0040591, 0x0006045a, + 0x05d5f8b0, 0x61f6880f, 0x42003000, 0x00fffffd, + 0x05e5fb17, 0x05c60b1a, 0x4936600a, 0x497a6c12, + 0x640e601e, 0x64066203, 0x648a6403, 0x05f5f109, + 0x59a8008d, 0x8c000502, 0x0500000d, 0x05e9fc53, 0x60401000, 0x05020008, 0x59340002, 0x82000500, - 0x00ff0000, 0x82000580, 0x00ff0000, 0x05fc07ef, - 0x60201000, 0x05ddfc8c, 0x05fc07ec, 0x592c040c, - 0x84000540, 0x48025c0c, 0x05fdf7ef, 0x60100800, - 0x05d9f653, 0x91380595, 0x05020003, 0x0505fd8e, - 0x05dc091e, 0x1c01f000, 0x91380595, 0x05020015, - 0x4c580000, 0x91cc1408, 0x6008b000, 0x91341c06, - 0x05f5fda8, 0x0502000e, 0x91cc140a, 0x6008b000, - 0x91341c08, 0x05f5fda3, 0x05020009, 0x59342200, - 0x59cc1007, 0x800811c0, 0x05000003, 0x480a6801, - 0x84102542, 0x8410251a, 0x48126a00, 0x5c00b000, - 0x1c01f000, 0x4803c856, 0xb13805a1, 0x0500000b, - 0xb13805a0, 0x05000009, 0xb13805a2, 0x05020011, - 0x64c65a07, 0x6412580e, 0x644a580f, 0x0001fb5b, - 0x05ddfc19, 0x0005f45a, 0x592c000d, 0x800001c0, - 0x05000005, 0x59a8002e, 0x48026006, 0x640a6203, - 0x1c01f000, 0x64025a07, 0x0001fb5b, 0x0005fc5a, - 0x1c01f000, 0x42000000, 0x0010b06e, 0x0509fcc6, - 0x05e9fcad, 0x59300203, 0x4933c857, 0x4803c857, - 0x90000c91, 0x05ba1f1a, 0x0c01f802, 0x05e9f492, - 0x00108aea, 0x00108af3, 0x00108aeb, 0x00108ae9, - 0x00108ae9, 0x00108ae9, 0x00108ae9, 0x00108ae9, - 0x00108ae9, 0x00108ae9, 0x00108ae9, 0x00108ae9, - 0x00108ae9, 0x00108ae9, 0x00108aeb, 0x00108ae9, - 0x00108ae9, 0x05b9ff06, 0x1c01f000, 0x59300403, - 0xb0000592, 0x05f80625, 0x05ddfbeb, 0x59325809, - 0x641a5a07, 0x0001fb5b, 0x05f1f221, 0x59301804, - 0x840c0520, 0x48026004, 0x598c000b, 0x81300580, - 0x0502000f, 0x8c0c0520, 0x0502000f, 0x42001000, - 0x0010af8e, 0x50081000, 0x58080002, 0x82000580, - 0x00000100, 0x0500000d, 0x5808000b, 0x81300580, - 0x05ba0eeb, 0x4978100b, 0x0501f003, 0x8c0c0520, - 0x05fe07e3, 0x0201f800, 0x0010eee3, 0x80c40040, - 0x05fc07df, 0x05b9fee2, 0x05e9ff7e, 0x05fc07fa, - 0x59300203, 0x90000c91, 0x05ba1edd, 0x0c01f7c5, - 0x4933c857, 0x4c500000, 0x4c540000, 0x4c580000, - 0x592c0c08, 0x48065814, 0x59cc0809, 0x48065808, - 0x59cc0808, 0x4806580c, 0x59a8088c, 0x82040500, - 0x000003ff, 0x800010c4, 0x8c040514, 0x05000004, - 0x59cc0002, 0x90000503, 0x80081480, 0x480a621c, - 0x412c0800, 0x05bdfa40, 0x05b80ec5, 0x492c080a, - 0x58040409, 0x84000552, 0x84000540, 0x48000c09, - 0x90081403, 0x80081104, 0x91cca406, 0x912cac05, - 0x60400800, 0x90080490, 0x05021003, 0x40080800, - 0x80000580, 0x4004b000, 0x4c000000, 0x0509fd60, - 0x5c000000, 0x800001c0, 0x0500000a, 0x412c1000, - 0x4c000000, 0x05bdfa28, 0x05b80ead, 0x492c1001, - 0x912cac05, 0x5c000000, 0x40001000, 0x05fdf7ee, - 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x1c01f000, - 0x4933c857, 0x4d2c0000, 0x4c380000, 0x59325809, - 0x5930021c, 0x48025a09, 0x59301013, 0x640a6203, - 0x592c020b, 0x8c000500, 0x05000004, 0x59300017, - 0x592c1010, 0x80081480, 0x40080000, 0x0501f963, - 0x80001540, 0x05020007, 0x64025a07, 0x592c000c, - 0x82000500, 0x00000c00, 0x05000009, 0x0501f009, - 0x8c08053e, 0x05000005, 0x641e5a07, 0x80081080, - 0x80081000, 0x0501f002, 0x64565a07, 0x480a5808, - 0x42000000, 0x0010ccb9, 0x50007000, 0x5838000a, - 0x80000540, 0x05020007, 0x4930700b, 0x4930700a, - 0x58380002, 0x90000580, 0x05020808, 0x0501f004, - 0x90001400, 0x45301000, 0x4930700a, 0x5c007000, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x592c000a, - 0x40001000, 0x48007009, 0x90080405, 0x48007003, - 0x592c000e, 0x592c100f, 0x48007006, 0x48087007, - 0x592c0014, 0x592c1209, 0x80080c80, 0x05001002, - 0x40001000, 0x90081403, 0x80081104, 0x90080490, - 0x05021003, 0x80000580, 0x0501f002, 0x60401000, - 0x4800700c, 0x48087004, 0x800810c4, 0x48087005, - 0x40381000, 0x0001f01c, 0x4d2c0000, 0x05bdf9ce, - 0x05b80e53, 0x42000800, 0x0010ccb9, 0x452c0800, - 0x497a580a, 0x497a580b, 0x497a580c, 0x4a025808, - 0x00108baa, 0x4a025802, 0x00000100, 0x64025801, - 0x5c025800, 0x1c01f000, 0x4833c857, 0x4d300000, - 0x4d2c0000, 0x4c5c0000, 0x4030b800, 0x585c0009, - 0x80025d40, 0x05020004, 0x585c000b, 0x4c000000, - 0x0501f03b, 0x585c0002, 0x82000580, 0x00000100, - 0x0502001c, 0x592c0801, 0x4c040000, 0x05bdf9d1, - 0x5c000800, 0x800409c0, 0x05000017, 0x4804b809, - 0x585c100c, 0x800811c0, 0x05020004, 0x40065800, - 0x05bdf9d1, 0x0501f010, 0x90080490, 0x05021003, - 0x80000580, 0x0501f002, 0x60401000, 0x4800b80c, - 0x4808b804, 0x800810c4, 0x4808b805, 0x90040405, - 0x4800b803, 0x405c1000, 0x0001f81c, 0x0501f022, - 0x0501f825, 0x585c000b, 0x80026540, 0x59300000, - 0x80000d40, 0x05020002, 0x4800b80a, 0x4800b80b, - 0x497a6000, 0x4c000000, 0x4978b809, 0x59325809, + 0x00ff0000, 0x82000580, 0x00ff0000, 0x05000004, + 0x60201000, 0x05e9f913, 0x05020056, 0x0505fe08, + 0x05000057, 0x0509fc91, 0x05020005, 0x592c0405, + 0x8c00051c, 0x05fe07ca, 0x0501f879, 0x60140800, + 0x05e5faca, 0x64066203, 0x640e6403, 0x05f5f0ed, + 0x59cc0408, 0x8c000518, 0x05000017, 0x0509f98f, + 0x05e9fc36, 0x05000008, 0x59cc0408, 0x8c000516, + 0x05000005, 0x59300429, 0x900005a1, 0x05fe07b8, + 0x1c01f000, 0x59a8021b, 0x8400054a, 0x4803521b, + 0x4803541b, 0x59a8000f, 0x497b8830, 0x84000570, + 0x48038832, 0x59300429, 0x900005a1, 0x05fe07ac, + 0x1c01f000, 0x59a8021b, 0xb0000510, 0xb0000590, + 0x05000009, 0x61bc1001, 0x42024800, 0x0010b391, + 0x480a4805, 0x480b500f, 0x497b8830, 0x84081570, + 0x480b8832, 0x0509f98a, 0x59a8021b, 0x84000548, + 0x4803521b, 0x4803541b, 0x0511fbe7, 0x05fe0798, + 0x599c0019, 0x8c000510, 0x0502002d, 0x59a8021b, + 0x8400054c, 0x4803521b, 0x601c0800, 0x05e5fa93, + 0x417a7800, 0x05e5fa86, 0x61bc3801, 0x61a00001, + 0x05f1f8d6, 0x05e40aba, 0x05c60abd, 0x4936600a, + 0x05e5fd66, 0x05020002, 0x497a6416, 0x59340200, + 0x8400051a, 0x48026a00, 0x600c0800, 0x05e5fa83, + 0x64066407, 0x64066203, 0x640a6403, 0x05f5f0a5, + 0x05fdfe78, 0x60040000, 0x0501f012, 0x599c0017, + 0x8c00050a, 0x05fc07ae, 0x60100800, 0x05e5fa77, + 0x49375082, 0x59a8021b, 0x8c000508, 0x05000008, + 0x599c0018, 0x8c00051c, 0x05000005, 0x61a00807, + 0x42001000, 0x0010f866, 0x05f1fecc, 0x0005f45a, + 0x4933c857, 0x80003540, 0x05000003, 0x601c0800, + 0x05e5fa66, 0x801831c0, 0x0502000f, 0x59302009, + 0x801021c0, 0x05000004, 0x58100405, 0x8c00051e, + 0x05020009, 0x59341c03, 0x60102000, 0x60483000, + 0x4d200000, 0x59364013, 0x81224130, 0x05ddfed8, + 0x5c024000, 0x05d1fd6a, 0x0005f45a, 0x4c5c0000, + 0x4d2c0000, 0x59325809, 0x0005f8e2, 0x5c025800, + 0x59cc0008, 0x48002805, 0x59cc0009, 0x48002806, + 0x49782807, 0x49782808, 0x49782809, 0x4978280a, + 0x59cc0013, 0x8c00053e, 0x05000009, 0x59cc0414, + 0x900001c0, 0x59ccbc15, 0x805c0540, 0x48002807, + 0x59cc0416, 0x900001c0, 0x48002808, 0x59cc0017, + 0x8c00053e, 0x05000009, 0x59cc0418, 0x900001c0, + 0x59ccbc19, 0x805c0540, 0x48002809, 0x59cc041a, + 0x900001c0, 0x4800280a, 0x5c00b800, 0x1c01f000, + 0x4933c857, 0x59a80077, 0x90000594, 0x0502003a, + 0x59a8008d, 0x8c000502, 0x05000011, 0x05e9fb9b, + 0x60401000, 0x05020008, 0x59340002, 0x82000500, + 0x00ff0000, 0x82000580, 0x00ff0000, 0x05000008, + 0x60201000, 0x05e9f85b, 0x05000005, 0x59a8008d, + 0x8400054c, 0x4803508d, 0x0501f027, 0x916c0583, + 0x0502000c, 0x59300009, 0x80000540, 0x05020009, + 0x59341c03, 0x60182000, 0x604c3000, 0x4d200000, + 0x59364013, 0x81224130, 0x05ddfe8d, 0x5c024000, + 0x05e5fb6b, 0x05fdfec8, 0x0501fa52, 0x05020016, + 0x59340404, 0x80000540, 0x05000013, 0x60180800, + 0x05e5fa02, 0x0505fd36, 0x0500000d, 0x0509fbbf, + 0x05020007, 0x41780800, 0x4d400000, 0x60028000, + 0x0509f9f9, 0x5c028000, 0x0005f45a, 0x4a025a05, + 0x00000103, 0x4a025806, 0x02000000, 0x05d1fd08, + 0x0005f45a, 0x05e5ffeb, 0x0505fd25, 0x05000005, + 0x0509fbae, 0x05020003, 0x05fdfde6, 0x0005f45a, + 0x05fdfde4, 0x0515f9a0, 0x80000580, 0x59a8008d, + 0x8c00050c, 0x05000004, 0x8400050c, 0x4803508d, + 0x90000541, 0x05fdf777, 0x4933c857, 0x59a80077, + 0x90000594, 0x05020006, 0x602c0800, 0x05e5f9db, + 0x64066203, 0x64066403, 0x05f1f7fe, 0x60040000, + 0x05fdf76c, 0x4933c857, 0x40003000, 0x59a80077, + 0x90000584, 0x05020018, 0x9018358b, 0x05020015, + 0x5930081d, 0x58040200, 0x8c000500, 0x0508078d, + 0x58040200, 0x8c000508, 0x0500000c, 0x84000508, + 0x48000a00, 0x600c0800, 0x05e5f9c4, 0x5930080a, + 0x49780806, 0x4a026202, 0x0000ffff, 0x64066203, + 0x65466403, 0x05f1f7e3, 0x601c0800, 0x05e5f9bb, + 0x0005f45a, 0x60040000, 0x05fdf74e, 0x4803c857, + 0x4d2c0000, 0x4d3c0000, 0x0c01f804, 0x5c027800, + 0x5c025800, 0x1c01f000, 0x00107634, 0x0010783d, + 0x00107634, 0x00107881, 0x00107634, 0x001078d6, + 0x0010781a, 0x00107634, 0x00107634, 0x001078ec, + 0x00107634, 0x001078f7, 0x4933c857, 0x4d1c0000, + 0x59301403, 0x90080583, 0x0500001d, 0x9008159e, + 0x05020019, 0x91381595, 0x05020016, 0x4d300000, + 0x5930141b, 0x0509f96e, 0x05c409c9, 0x591c1416, + 0x8c08051e, 0x0500000b, 0x05f9fed3, 0x05000009, + 0x05e5fd9c, 0x4926601d, 0x59340200, 0x8c000508, + 0x05000003, 0x4a026416, 0x00000100, 0x0505ff4b, + 0x82081500, 0xffff1fff, 0x480a3c16, 0x5c026000, + 0x0005fc5a, 0x5c023800, 0x1c01f000, 0x05fdff55, + 0x05fdf7fd, 0x4933c857, 0x42000000, 0x0010b2da, + 0x0515fa05, 0x0515f934, 0x05e5fc52, 0x0505fcb0, + 0x05000007, 0x0509fb39, 0x05020005, 0x6008b000, + 0x0509fb1b, 0x05fdfd6f, 0x0005f45a, 0x0501f8c3, + 0x05020021, 0x417a7800, 0x05e5f965, 0x417a7800, + 0x0201f800, 0x0010ee7a, 0x42000000, 0x0010b2d6, + 0x0515f9f1, 0x59340200, 0x84000558, 0x48026a00, + 0x640a6403, 0x600c3000, 0x0515f844, 0x59240400, + 0x8c00050a, 0x0502000b, 0x4d400000, 0x41782800, + 0x60143000, 0x60a68000, 0x0511faca, 0x5c028000, + 0x641e6203, 0x64126407, 0x6406642c, 0x1c01f000, + 0x600c0800, 0x05e5f955, 0x64066203, 0x05f1ff79, + 0x05fdf7fb, 0x59cc0407, 0x90000589, 0x05020009, + 0x59340412, 0x82000500, 0x000000ff, 0x0500000b, + 0x80000040, 0x48026c12, 0x642a6006, 0x05fdf7f0, + 0x59cc0207, 0x82000500, 0x0000ff00, 0x82000580, + 0x00001900, 0x05fc07d2, 0x05fdfd3a, 0x80000580, + 0x05fdf6d4, 0x4933c857, 0x0505fc71, 0x0500000b, + 0x0509fafa, 0x05020009, 0x4c580000, 0x6008b000, + 0x0509fadb, 0x5c00b000, 0x05fdfd2e, 0x601c0800, + 0x05e5f932, 0x0005f45a, 0x59340403, 0x82000580, + 0x000007fc, 0x05020005, 0x60100000, 0x05fdf8c5, + 0x0500001a, 0x0501f026, 0x05fdfd22, 0x59cc3407, + 0x82183500, 0x000000ff, 0x90180585, 0x05000016, + 0x9018058b, 0x05000011, 0x59cc0207, 0x82000500, + 0x0000ff00, 0x05020003, 0x90180589, 0x0500000e, + 0x82000580, 0x00001900, 0x05020008, 0x90180589, + 0x05000009, 0x60100800, 0x05e5f914, 0x05d1fc28, + 0x0515f8c9, 0x0005f45a, 0x0515f8c7, 0x60040000, + 0x05fdf6a4, 0x0505fc42, 0x59325809, 0x05000008, + 0x592c0205, 0x82000580, 0x00000139, 0x05fc07f7, + 0x592c0405, 0x8c00051e, 0x05fe07f4, 0x59340412, + 0x800001c0, 0x05000006, 0x80000040, 0x48026c12, + 0x642a6006, 0x645a6403, 0x1c01f000, 0x59340403, + 0x82000580, 0x000007fe, 0x05020006, 0x59a8021b, + 0x84000540, 0x4803521b, 0x05e1fe46, 0x05fdf7e3, + 0x0515f8a9, 0x417a7800, 0x0201f800, 0x0010ee7a, + 0x60143000, 0x0511ffcd, 0x42000000, 0x0010b2d6, + 0x0515f971, 0x05fdf7da, 0x4933c857, 0x0501f844, + 0x05020006, 0x60140800, 0x05e5f8e4, 0x64066203, + 0x640e6403, 0x05f1f707, 0x60100800, 0x05e5f8df, + 0x0509fa9e, 0x05020007, 0x4c580000, 0x6008b000, + 0x0509fa7f, 0x5c00b000, 0x05fdfcd2, 0x0005f45a, + 0x05fdfcd0, 0x0515f88c, 0x80000580, 0x05fdf669, + 0x4933c857, 0x0501f82e, 0x05020006, 0x60240800, + 0x05e5f8ce, 0x64066203, 0x64166403, 0x05f1f6f1, + 0x0515f881, 0x60040000, 0x05fdf65e, 0x4933c857, + 0x5930081d, 0x58040200, 0x8c000500, 0x05080685, + 0x0501f81f, 0x05020006, 0x602c0800, 0x05e5f8bf, + 0x64066203, 0x64066403, 0x05f1f6e2, 0x5930080a, + 0x58040403, 0x82000580, 0x000007fe, 0x05020004, + 0x600c2800, 0x0509fe7c, 0x0005f45a, 0x0515f86a, + 0x60040000, 0x05fdf647, 0x4933c857, 0x59cc0407, + 0x90000583, 0x05020009, 0x59cc0207, 0x82000500, + 0x0000ff00, 0x82000d80, 0x00002a00, 0x05000003, + 0x82000d80, 0x00001e00, 0x1c01f000, 0x4933c857, + 0x90000541, 0x1c01f000, 0x4933c857, 0x4d400000, + 0x4c580000, 0x60028000, 0x05d1fe5e, 0x59a8021b, + 0x90000543, 0x4803521b, 0x0501f88c, 0x05000005, + 0x4d300000, 0x4d340000, 0x4d440000, 0x0501f024, + 0x0501f8b5, 0x05000028, 0x4d300000, 0x4d340000, + 0x4d440000, 0x83240580, 0x0010b391, 0x0502001d, + 0x59cc0408, 0x8c00051e, 0x05020009, 0x42000800, + 0x0010b391, 0x58040406, 0x8c000500, 0x05020004, + 0x59a8021b, 0x84000552, 0x4803521b, 0x59240400, + 0x8c00050a, 0x05020005, 0x60aa8000, 0x61fe89ff, + 0x60083000, 0x0511ff6a, 0x60aa8000, 0x4d3c0000, + 0x60027804, 0x0201f800, 0x0010edf3, 0x5c027800, + 0x42000000, 0x0010b2d6, 0x0515f8f7, 0x05d1fccc, + 0x05d1feef, 0x600a8000, 0x5c028800, 0x5c026800, + 0x5c026000, 0x41780800, 0x05e5f954, 0x59cc0800, + 0x82040d00, 0x00ffffff, 0x59240200, 0xb0000566, + 0x48024a00, 0x48064805, 0x812000f0, 0x80040540, + 0x48026813, 0x812241c0, 0x05020005, 0x4c040000, + 0x60040000, 0x05e5ffa2, 0x5c000800, 0x4927c857, + 0x83240580, 0x0010b391, 0x0502001e, 0x59a8121b, + 0x59cc0408, 0x8c00051a, 0x05020005, 0x84081514, + 0x4a0370e5, 0x00000800, 0x0501f004, 0x84081554, + 0x4a0370e5, 0x00000c00, 0x480b521b, 0x4807500f, + 0x80040110, 0x48035018, 0x48038881, 0x59a80a1b, + 0x84040d50, 0x59cc0013, 0x8c00053e, 0x05000003, + 0x8c000536, 0x05000004, 0x59cc0017, 0x8c000536, + 0x05020002, 0x84040d10, 0x4807521b, 0x4807541b, + 0x59cc0408, 0x8c000518, 0x0500001b, 0x59a8021b, + 0x8c000506, 0x05000011, 0x916c0583, 0x05000004, + 0x83240580, 0x0010b391, 0x05000013, 0x59240400, + 0x8c00050c, 0x05020006, 0x4c040000, 0x60040000, + 0x05e5ff6f, 0x5c000800, 0x0501f00b, 0x64866429, + 0x0509f99a, 0x0501f008, 0x0515f9ed, 0x05020006, + 0x4c040000, 0x0509fdc3, 0x41781800, 0x05d1fd95, + 0x5c000800, 0xb0040510, 0xb0000590, 0x05000008, + 0x05e9f98a, 0x05000006, 0x59cc0009, 0x4803502c, + 0x59cc000a, 0x4803502d, 0x0505fedc, 0x5c00b000, + 0x5c028000, 0x1c01f000, 0x4933c857, 0x59a8141b, + 0x82080580, 0x0000ffff, 0x0500000b, 0x4c080000, + 0x05e9f97a, 0x5c001000, 0x0502000b, 0x59cc0408, + 0x8c000518, 0x05000005, 0x8c08050a, 0x0500000a, + 0x80000580, 0x1c01f000, 0x8c080508, 0x05fe07fd, + 0x0501f005, 0x90080530, 0x05020003, 0x8c080506, + 0x05fe07f8, 0x4a03541b, 0x0000ffff, 0x42000000, + 0x0010b223, 0x0515f878, 0x60303000, 0x61fc19ff, + 0x601c2000, 0x4d200000, 0x417a4000, 0x05ddfc6c, + 0x5c024000, 0x4d400000, 0x4d3c0000, 0x60043000, + 0x0511fed7, 0x60aa8000, 0x60027804, 0x0201f800, + 0x0010edf3, 0x5c028000, 0x5c027800, 0x90000541, + 0x1c01f000, 0x4933c857, 0x4c580000, 0x59a80018, + 0x800001c0, 0x05000021, 0x59341806, 0x800c19c0, + 0x0500001e, 0x820c1d80, 0xdeaddead, 0x0500001a, + 0x59cc1000, 0x82081500, 0x00ffff00, 0x80081110, + 0x80080580, 0x05000004, 0x42000000, 0x0010b2b9, + 0x0501f010, 0x91cc140b, 0x6008b000, 0x91341c06, + 0x0501f829, 0x05000004, 0x42000000, 0x0010b2ba, + 0x0501f008, 0x91cc140d, 0x6008b000, 0x91341c08, + 0x0501f821, 0x05000005, 0x42000000, 0x0010b2bb, + 0x0515f841, 0x90000541, 0x5c00b000, 0x1c01f000, + 0x4933c857, 0x59cc0206, 0x90000594, 0x05020015, + 0x59cc0407, 0x82000580, 0x00000800, 0x05020011, + 0x59cc0207, 0x8c00051a, 0x0500000d, 0x82000500, + 0x00000f00, 0x82000580, 0x00000100, 0x05020008, + 0x59cc020a, 0x8c000508, 0x05020003, 0x8c00050a, + 0x05000003, 0x80000580, 0x1c01f000, 0x90000541, + 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, + 0x480bc857, 0x480fc857, 0x485bc857, 0x50080800, + 0x500c0000, 0x80042580, 0x05020007, 0x80081000, + 0x800c1800, 0x8058b040, 0x05fe07f9, 0x80000580, + 0x1c01f000, 0x4803c857, 0x4807c857, 0x480bc857, + 0x480fc857, 0x80040480, 0x05001004, 0x60040000, + 0x90040d41, 0x1c01f000, 0x41780000, 0x05fdf7fd, + 0xb1380493, 0x05c21fb2, 0xb138048b, 0x05c01fb0, + 0x0c01f001, 0x00107a4a, 0x00107a4a, 0x00107a4a, + 0x00107a4a, 0x00107a49, 0x00107a49, 0x00107a49, + 0x00107a4a, 0x05c1ffa6, 0x493bc857, 0x64366203, + 0x493a6403, 0x42000800, 0x80000000, 0x0005f32e, + 0x91380593, 0x0502000b, 0x59300403, 0xb0000590, + 0x05c20f9b, 0x0505fe7c, 0x05000005, 0x643a6203, + 0x59a80030, 0x48026205, 0x1c01f000, 0x0005f45a, + 0x4933c857, 0x913805a7, 0x05020027, 0x4933c857, + 0x05f1fe34, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010ee7a, 0x5c027800, 0x42000000, 0x0010b2d6, + 0x0511ffdd, 0x4d2c0000, 0x59325809, 0x0505fa88, + 0x492fc857, 0x0500000c, 0x0509fc2d, 0x4a025a05, + 0x00000103, 0x59300c02, 0x48065c07, 0x64a65a07, + 0x497a580a, 0x592c0c09, 0x84040d50, 0x48065c09, + 0x0001fb5b, 0x5c025800, 0x60543000, 0x41782800, + 0x600c2000, 0x4d400000, 0x4d440000, 0x59368c03, + 0x60a68000, 0x0509fb79, 0x5c028800, 0x5c028000, + 0x0005f45a, 0x91380594, 0x05020009, 0x59300403, + 0xb0000c93, 0x05c21f66, 0xb0000480, 0x05c01f64, + 0x4933c857, 0x4803c857, 0x0c01f013, 0xb13805a1, + 0x05000003, 0xb13805a0, 0x05020007, 0x05f5fa64, + 0x05fa049c, 0x59300203, 0x9000058e, 0x0504041c, + 0x1c01f000, 0xb1380593, 0x05000006, 0xb1380588, + 0x05c20f53, 0x59300403, 0xb0000590, 0x05c20f50, + 0x1c01f000, 0x00107ab5, 0x00107ab4, 0x00107ab4, + 0x00107ab4, 0x00107ab4, 0x00107ab4, 0x00107ab4, + 0x00107ab4, 0x00107ab4, 0x00107ab4, 0x00107ab4, + 0x00107ac6, 0x00107ac6, 0x00107ac6, 0x00107ac6, + 0x00107ab4, 0x00107ac6, 0x00107ab4, 0x00107ac6, + 0x05c1ff3b, 0x4933c857, 0x05f1fdde, 0x0505fa3c, + 0x0004045a, 0x4d2c0000, 0x59325809, 0x0509fbe0, 0x4a025a05, 0x00000103, 0x59300402, 0x48025c07, - 0x592c100c, 0x4c080000, 0x0001fb5b, 0x0501f8ce, - 0x05fdf80e, 0x5c001000, 0x8c080518, 0x05000003, - 0x05fdf92d, 0x0501f002, 0x0005fc5a, 0x405c7000, - 0x5c000000, 0x80026540, 0x05000003, 0x59325809, - 0x05fdff8a, 0x5c00b800, 0x5c025800, 0x5c026000, - 0x1c01f000, 0x483bc857, 0x58380009, 0x40025800, - 0x05bdf999, 0x5838000b, 0x80026540, 0x59300009, - 0x80025d40, 0x640a5a07, 0x1c01f000, 0x4803c857, - 0x4933c857, 0x4d1c0000, 0x497a601e, 0x41323800, - 0x40026000, 0x4d3c0000, 0x60167800, 0x0501f838, - 0x5c027800, 0x411e6000, 0x4933c857, 0x59300416, - 0x84000502, 0x48026416, 0x5c023800, 0x1c01f000, - 0x481bc857, 0x4933c857, 0x4c5c0000, 0x4c600000, - 0x4010b800, 0x4014c000, 0x0509f9d4, 0x05c9fb0c, - 0x59240400, 0x8c00050a, 0x05020006, 0x40602800, - 0x405c3000, 0x0505fc7d, 0x90000541, 0x0501f002, - 0x80000580, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x42026000, 0x001102e4, - 0x59a8000d, 0x81640580, 0x05000013, 0x59300c07, - 0x90040581, 0x05000009, 0x90040584, 0x05000004, - 0x90040590, 0x05f80c61, 0x0501f007, 0x59300203, - 0x90000d87, 0x05000004, 0x4807c857, 0x05fdf9e0, - 0x05020807, 0x91326430, 0x41580000, 0x81300480, - 0x05fc17ec, 0x5c026000, 0x1c01f000, 0x4933c857, - 0x59300403, 0x4803c857, 0x05e9fb37, 0x4df00000, - 0x59300407, 0x4803c857, 0x90000d82, 0x05000013, - 0x90000d81, 0x05000007, 0x90000d84, 0x05000005, - 0x4933c856, 0x5c03e000, 0x05e80b17, 0x0501f03e, - 0x59300203, 0x90000d81, 0x05000014, 0x90000d82, - 0x0500002b, 0x90000d85, 0x05000029, 0x90000d8e, - 0x05000027, 0x05b9fd92, 0x59300203, 0x90000d89, - 0x0500000a, 0x90000d8b, 0x05000008, 0x90000d8a, - 0x0500001f, 0x90000d8c, 0x0500001d, 0x90000d8e, - 0x0500001b, 0x05b9fd86, 0x598c000b, 0x81300580, - 0x05020003, 0x05e9fe1f, 0x05020015, 0x59300004, - 0x4803c857, 0x8c000520, 0x05000004, 0x84000520, - 0x48026004, 0x0501f00e, 0x0201f800, 0x0010eee3, - 0x80c40040, 0x05ba0d76, 0x5c03e000, 0x05e80aee, - 0x59300407, 0x90000d82, 0x05000004, 0x05ddfa5a, - 0x05f9ff9d, 0x05f00f78, 0x05f1f091, 0x5c03e000, - 0x05e80ae5, 0x59300407, 0x90000d82, 0x0500000a, - 0x5930081d, 0x58040200, 0x8c000500, 0x0500010f, - 0x05ddfa4d, 0x05f9ff90, 0x05f00f6b, 0x8d3c0500, - 0x05000003, 0x0509fa32, 0x05f1f081, 0x64066229, - 0x4a026403, 0x00000085, 0x64266203, 0x640a6407, - 0x42000800, 0x80000040, 0x0005f32e, 0x60007040, - 0x4203e000, 0xb0800000, 0x6033f800, 0x40000000, - 0x40000000, 0x40000000, 0x0501b004, 0x80387040, - 0x05b80d4b, 0x05fdf7f9, 0x1c01f000, 0x4203e000, - 0xb0800000, 0x6023f800, 0x1c01f000, 0x83300480, - 0x00110254, 0x05001006, 0x41540000, 0x81300480, - 0x05021003, 0x80000580, 0x1c01f000, 0x81780080, - 0x1c01f000, 0x59300027, 0x80000540, 0x05000006, - 0x4d2c0000, 0x40025800, 0x05bdf8d2, 0x497a6027, - 0x5c025800, 0x1c01f000, 0x592c720b, 0x8c380500, - 0x05020008, 0x59307008, 0x8c380516, 0x05000005, - 0x59307009, 0x58387010, 0x59300014, 0x80380480, - 0x1c01f000, 0x59a80877, 0x59cc2808, 0x82140500, - 0x00000c00, 0x05000003, 0x90040490, 0x05001015, - 0x80001580, 0x8c140512, 0x05000004, 0x90040494, - 0x05001010, 0x59cc100a, 0x80000580, 0x8c140510, - 0x05000004, 0x90040498, 0x0500100a, 0x59cc000b, - 0x80080400, 0x05001007, 0x05000005, 0x90000418, - 0x80040480, 0x05001003, 0x80000580, 0x1c01f000, - 0x42000000, 0x0010b04b, 0x0509faaf, 0x90000541, - 0x05fdf7fb, 0x4933c857, 0x4937c857, 0x4923c857, - 0x4927c857, 0x492fc857, 0x48efc857, 0x4d1c0000, - 0x4d300000, 0x41323800, 0x05f1f853, 0x0500001d, - 0x48ee602d, 0x4926601d, 0x4936600a, 0x05fdf9ea, - 0x591c0407, 0x90000583, 0x05000008, 0x591c0202, - 0x4803c857, 0x4802641b, 0x591c0402, 0x4802621b, - 0x4803c857, 0x0501f007, 0x591c0202, 0x4803c857, - 0x4802621b, 0x591c0402, 0x4802641b, 0x4803c857, - 0x491e602a, 0x64066407, 0x492e6009, 0x4d380000, - 0x615e7000, 0x0005fc78, 0x5c027000, 0x90000541, - 0x5c026000, 0x5c023800, 0x1c01f000, 0x4933c857, - 0x493bc857, 0x4937c857, 0x4d2c0000, 0x4c500000, - 0x4c540000, 0x4c580000, 0x59325809, 0x05f9fdf7, - 0x05000017, 0x91cca406, 0x912cac07, 0x91380596, - 0x05020007, 0x59a80077, 0x90000588, 0x0502000e, - 0x492fc857, 0x6008b000, 0x0501f008, 0x91380595, - 0x05020009, 0x492fc857, 0x59a80077, 0x90000598, - 0x05020005, 0x6018b000, 0x0509fb32, 0x05f1fa2a, - 0x0501f003, 0x05f1fec8, 0x0005fc5a, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x05e9fa44, 0x4df00000, 0x59300203, - 0x90000c91, 0x05ba1cb2, 0x0c01f001, 0x00108d51, - 0x00108d50, 0x00108d56, 0x00108d6e, 0x00108d55, - 0x00108d50, 0x00108d50, 0x00108d50, 0x00108d50, - 0x00108d50, 0x00108d50, 0x00108d50, 0x00108d50, - 0x00108d50, 0x00108d50, 0x00108d50, 0x00108d56, - 0x05b9fc9f, 0x5c03e000, 0x05e80a17, 0x80000580, - 0x1c01f000, 0x05bdfe82, 0x5c03e000, 0x05e80a12, - 0x8d3c0502, 0x05020011, 0x4d2c0000, 0x59325809, - 0x64165a07, 0x0001fb5b, 0x5c025800, 0x497a6009, - 0x8d3c0500, 0x0502000b, 0x642a6229, 0x4a026403, + 0x641a5a07, 0x497a580a, 0x0001fb5b, 0x5c025800, + 0x0505fb13, 0x0005f45a, 0x4933c857, 0x05f1fdcd, + 0x0005f45a, 0x05c1ff26, 0x5930001e, 0x800001c0, + 0x050a0b1d, 0x497a6205, 0x59300004, 0x8c00053e, + 0x0502002a, 0x0509fbde, 0x050200b0, 0x59325809, + 0x592c0c09, 0x59cc2808, 0x82141d00, 0x00000c00, + 0x05000002, 0x59cc1809, 0x84040d58, 0x48065c09, + 0x82143500, 0x00000fff, 0x05020023, 0x59340200, + 0x8c00050e, 0x05020097, 0x0005fd0c, 0x05020006, + 0x64025a07, 0x59300013, 0x0509fbbe, 0x80000d40, + 0x050209fe, 0x4a025a05, 0x00000103, 0x48065808, + 0x480e580b, 0x901409c0, 0x4806580a, 0x59300c02, + 0x48065c07, 0x0509f892, 0x0509f895, 0x0001fb5b, + 0x0509fba7, 0x05e5fa20, 0x59cc0008, 0x8c000518, + 0x05060402, 0x0005f45a, 0x05f5f9fd, 0x05fc07d6, + 0x4d3c0000, 0x600a7800, 0x0501fe50, 0x5c027800, + 0x05fdf7d1, 0x4817c857, 0x480fc857, 0x82180500, + 0x000000ff, 0x0500000d, 0x592c0205, 0x82000500, + 0x000000ff, 0xb0000588, 0x05000003, 0x900005a2, + 0x05020006, 0x592c0408, 0x800001c0, 0x05000003, + 0x0509f9ea, 0x0509f221, 0x82180d00, 0x00000c00, + 0x05000004, 0x59340200, 0x8c00050e, 0x05020050, + 0x64025a07, 0x41782000, 0x8c180510, 0x05000009, + 0x59cc200b, 0x801021c0, 0x05000006, 0x59cc000c, + 0x82000500, 0x000000ff, 0x05000002, 0x4803c857, + 0x4812580d, 0x41780000, 0x8c180512, 0x05000002, + 0x59cc000a, 0x4802580c, 0x80100c00, 0x05fc07b7, + 0x9004149d, 0x05001005, 0x592c0405, 0x8c00051e, + 0x05000020, 0x60700800, 0x4c040000, 0x4c0c0000, + 0x4c140000, 0x0005fd0c, 0x05020006, 0x64025a07, + 0x59300013, 0x0509fb6b, 0x80000d40, 0x050209ab, + 0x5c002800, 0x5c001800, 0x4a025a05, 0x00000103, + 0x48065808, 0x480e580b, 0x901409c0, 0x4806580a, + 0x5c000800, 0x4c500000, 0x4c540000, 0x91cca40c, + 0x912cac0e, 0x0501fdb1, 0x5c00a800, 0x5c00a000, + 0x59300008, 0x84000534, 0x48026008, 0x05fdf7a0, + 0x4c040000, 0x4c0c0000, 0x4c140000, 0x0005fd0c, + 0x05020006, 0x64025a07, 0x59300013, 0x0509fb4d, + 0x80000d40, 0x0502098d, 0x48065808, 0x5c002800, + 0x5c001800, 0x59301402, 0x480a5c07, 0x480e580b, + 0x901401c0, 0x4802580a, 0x0509f821, 0x5c000800, + 0x0501fd52, 0x0501fd7e, 0x05fdf78e, 0x592c020b, + 0x8c000502, 0x05fc07af, 0x592c0209, 0x8c00050e, + 0x05fe07ac, 0x59300013, 0x800c0d80, 0x05fc07a9, + 0x4803c857, 0x480fc857, 0x8c180514, 0x050403c0, + 0x80000540, 0x05fc07a3, 0x4807c856, 0x0505f3bc, + 0x592c020b, 0x8c000502, 0x05fc0768, 0x59300013, + 0x800001c0, 0x05fc0767, 0x592c0209, 0x8c00050e, + 0x05fe0764, 0x0505f3b2, 0x1c01f000, 0x59cc2006, + 0x59cc2807, 0x0501f03b, 0x0501f03a, 0x1c01f000, + 0x4933c857, 0x59300004, 0x8c00053e, 0x05020031, + 0x5930001e, 0x800001c0, 0x050a0a5b, 0x497a6205, + 0x59325809, 0x592c0c09, 0x41782800, 0x41781800, + 0x84040d58, 0x48065c09, 0x41783000, 0x59340200, + 0x8c00050e, 0x05020018, 0x0005fd0c, 0x05020007, + 0x64025a07, 0x59300013, 0x0509fb06, 0x80000d40, + 0x4807c857, 0x05020945, 0x4a025a05, 0x00000103, + 0x48065808, 0x480e580b, 0x901409c0, 0x4806580a, + 0x4933c857, 0x59300c02, 0x48065c07, 0x0505ffd8, + 0x0505ffdb, 0x0001fb5b, 0x0509faed, 0x05e5f966, + 0x0005f45a, 0x592c020b, 0x8c000502, 0x05fc07e7, + 0x59300013, 0x4803c857, 0x800001c0, 0x05fc07e5, + 0x592c0209, 0x8c00050e, 0x05fe07e2, 0x0505f378, + 0x05f5f93b, 0x05fc07cf, 0x4933c857, 0x1c01f000, + 0x4c5c0000, 0x4c600000, 0x4010b800, 0x4014c000, + 0x5930001e, 0x800001c0, 0x4c140000, 0x050a0a22, + 0x5c002800, 0x59325809, 0x592c020b, 0x8c000502, + 0x05020033, 0x8c000500, 0x05000038, 0x640a6203, + 0x650e6403, 0x405c0000, 0x592c0810, 0x80040c80, + 0x40600000, 0x80040480, 0x0500102d, 0x8060c1c0, + 0x05000024, 0x59300004, 0x8c00050e, 0x05000007, + 0x59300a23, 0x90040503, 0x4c140000, 0x0c01f829, + 0x5c002800, 0x0500001b, 0x59300004, 0x8c00053e, + 0x05020014, 0x485e6015, 0x48626013, 0x497a6205, + 0x5c00c000, 0x5c00b800, 0x4c140000, 0x0505fce6, + 0x5c002800, 0x05000007, 0x4816602a, 0x4a02601c, + 0x00107bf2, 0x1c01f000, 0x5930282a, 0x497a602a, + 0x05c9f8bb, 0x0502000c, 0x59300804, 0x0005f320, + 0x4c140000, 0x05f5f8fe, 0x5c002800, 0x05fc07ea, + 0x5c00c000, 0x5c00b800, 0x05f9f332, 0x5c00c000, + 0x5c00b800, 0x4933c857, 0x1c01f000, 0x4807c857, + 0x4004c000, 0x05fdf7d2, 0x4803c857, 0x05fdf7f5, + 0x00107c0c, 0x00107c11, 0x00107c16, 0x00107c16, + 0x59300224, 0x48035093, 0x90000408, 0x48035092, + 0x0501f00a, 0x59300224, 0x48035092, 0x90000408, + 0x48035093, 0x0501f005, 0x59300224, 0x90000408, + 0x48035092, 0x48035093, 0x405c1000, 0x41780800, + 0x59a80092, 0x05f1fae1, 0x800409c0, 0x05020052, + 0x40085000, 0x592c1001, 0x800811c0, 0x0500004e, + 0x58080205, 0x82000500, 0x000000ff, 0xb000058a, + 0x05020049, 0x48281002, 0x59a80092, 0x40601000, + 0x41780800, 0x4c280000, 0x05f1fad0, 0x5c005000, + 0x800409c0, 0x05020038, 0x40041800, 0x59a80093, + 0x59300804, 0x8c040530, 0x05000005, 0x59300827, + 0x800800c6, 0x48000803, 0x59300224, 0x800c1c00, + 0x80081040, 0x05fe07fe, 0x480e602c, 0x592c4801, + 0x802449c0, 0x05c00dae, 0x58240a06, 0x592c1812, + 0x59303023, 0x8c180506, 0x05000003, 0x40280000, + 0x80040c00, 0x800400e0, 0x80040540, 0x48026021, + 0x8c18050a, 0x05020003, 0x40280000, 0x800c1c00, + 0x480e601f, 0x59300804, 0x8c040530, 0x0500000e, + 0x4c280000, 0x592c1001, 0x59306827, 0x592c5a0b, + 0x0001ff1a, 0x5c005000, 0x802851c0, 0x05ca0dc0, + 0x05020015, 0x59300827, 0x58040003, 0x49780803, + 0x4800080d, 0x59300224, 0x59303023, 0x8c18050e, + 0x05000002, 0x80000580, 0x48026424, 0x90000541, + 0x1c01f000, 0x592c1810, 0x805c0418, 0x800c0580, + 0x05fc07c6, 0x4933c857, 0x485fc857, 0x4863c857, + 0x480fc857, 0x80000580, 0x1c01f000, 0xb1380498, + 0x05021057, 0xb1380480, 0x05001002, 0x0c01f002, + 0x1c01f000, 0x00107c91, 0x00107c91, 0x00107c91, + 0x00107c91, 0x00107c91, 0x00107c91, 0x00107c91, + 0x00107c91, 0x00107c91, 0x00107c91, 0x00107c92, + 0x00107c91, 0x00107c91, 0x00107c91, 0x00107c91, + 0x00107c9c, 0x00107c91, 0x00107c91, 0x00107c91, + 0x00107c91, 0x00107cc1, 0x00107c91, 0x00107c91, + 0x00107c91, 0x05c1fd5e, 0x4933c857, 0x05f1feea, + 0x640a6203, 0x59a80030, 0x48026205, 0x59300013, + 0x59300817, 0x80040c80, 0x48066017, 0x05f1f3dc, + 0x4933c857, 0x05f1fbda, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010ee7a, 0x5c027800, 0x42000000, + 0x0010b2d6, 0x0511fda0, 0x0505f84d, 0x0500000f, + 0x4d2c0000, 0x59325809, 0x0509f9f1, 0x4a025a05, + 0x00000103, 0x59300402, 0x48025c07, 0x64a65a07, + 0x497a580a, 0x592c0c09, 0x84040d50, 0x48065c09, + 0x0001fb5b, 0x5c025800, 0x60503000, 0x41782800, + 0x4d400000, 0x4d440000, 0x59368c03, 0x60082000, + 0x60a68000, 0x0509f93d, 0x5c028800, 0x5c028000, + 0x0005f45a, 0x4933c857, 0x59cc0a04, 0x48066202, + 0x59300809, 0x4978080a, 0x4978080b, 0x58041409, + 0x84081558, 0x48080c09, 0x1c01f000, 0xb13805a1, + 0x05020014, 0x05f1fc72, 0x0501fd88, 0x0502000c, + 0x05f5f96b, 0x05fc07ff, 0x811800ca, 0x81c80c00, + 0x58040138, 0x59cc0a03, 0x80000040, 0x80040580, + 0x05020007, 0x05f5f95c, 0x05000005, 0x59300c16, + 0x84040d44, 0x48066416, 0x497a6205, 0x05f1f44c, + 0xb13805a0, 0x05fe07fe, 0x59cc0002, 0x8c000526, + 0x05fe07e9, 0x05fdf7fa, 0x4807c857, 0x8c04053e, + 0x05020022, 0x497a5a07, 0x5930002b, 0x80000540, + 0x05000017, 0x497a5a07, 0x4c040000, 0x4c080000, + 0x4c0c0000, 0x4c100000, 0x4c140000, 0x40002800, + 0x58141003, 0x40040000, 0x80081480, 0x48082803, + 0x40140000, 0x05c5fda5, 0x5c002800, 0x5c002000, + 0x5c001800, 0x5c001000, 0x5c000800, 0x592c0207, + 0x80000540, 0x05020008, 0x0501f005, 0x592c0409, + 0x8c00051c, 0x05000002, 0x592c0803, 0x4807c857, + 0x64565a07, 0x1c01f000, 0x5930002b, 0x80000540, + 0x05000007, 0x64465a07, 0x5930002b, 0x4c040000, + 0x05c5fd8e, 0x5c000800, 0x05fdf7f7, 0x4807c856, + 0x641e5a07, 0x1c01f000, 0xb1380498, 0x05001006, + 0xb13805a1, 0x05000003, 0xb13805a0, 0x05c20cd4, + 0x1c01f000, 0xb1380480, 0x05001004, 0x4d2c0000, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x00107d3b, + 0x00107d3b, 0x00107d3b, 0x00107d3b, 0x00107d3b, + 0x00107d3d, 0x00107d3c, 0x00107d3b, 0x00107db5, + 0x00107d3b, 0x00107d3b, 0x00107d3b, 0x00107d3b, + 0x00107d3b, 0x00107d3b, 0x00107d3b, 0x00107d3b, + 0x00107d3b, 0x00107d3b, 0x00107e77, 0x00107e9f, + 0x00107e7e, 0x00107d3c, 0x00107ea8, 0x05c1fcb4, + 0x1c01f000, 0x5930001e, 0x800001c0, 0x050a08aa, + 0x59300008, 0x8c00050e, 0x05000072, 0x8c000500, + 0x05000064, 0x8c00051c, 0x05000008, 0x84000500, + 0x48026008, 0x59325809, 0x592c3c09, 0x841c3d58, + 0x481e5c09, 0x0005f4b7, 0x59325809, 0x592c3c09, + 0x841c3d58, 0x59300008, 0x8c00051c, 0x05fe07f4, + 0x481e5c09, 0x60140000, 0x40000000, 0x80000040, + 0x05fe07fe, 0x59300008, 0x8c00051c, 0x05fe07ec, + 0x59cc0a04, 0x48066202, 0x59cc0808, 0x592c0205, + 0x82000500, 0x000000ff, 0xb0000588, 0x05000003, + 0x900005a2, 0x0502000a, 0x497a580c, 0x82040500, + 0x000000ff, 0x05000006, 0x592c0408, 0x800001c0, + 0x05000003, 0x0505ff8d, 0x05c5f624, 0x900421c0, + 0x4812580a, 0x41782000, 0x82040500, 0x00000c00, + 0x05000002, 0x59cc2009, 0x82043500, 0x00000fff, + 0x0502001e, 0x481e5c09, 0x64025a07, 0x801831c0, + 0x05c40616, 0x41782000, 0x8c180510, 0x05000002, + 0x59cc200b, 0x4812580d, 0x41780000, 0x8c180512, + 0x05000002, 0x59cc000a, 0x4802580c, 0x80100c00, + 0x05c01c67, 0x05c40609, 0x9004149d, 0x05021009, + 0x4c500000, 0x4c540000, 0x91cca40c, 0x912cac0e, + 0x0501fb6a, 0x5c00a800, 0x5c00a000, 0x05c5f5ff, + 0x0501fb22, 0x05c5f5fd, 0x412c7800, 0x05c1ffe5, + 0x05c00c57, 0x492c780a, 0x841c3d52, 0x481c7c09, + 0x4a025a05, 0x00000103, 0x4812580b, 0x900401c0, + 0x4802580a, 0x583c0405, 0x583c1006, 0x583c2209, + 0x48025c05, 0x480a5806, 0x48125a09, 0x05fdf7d2, + 0x8c000524, 0x05fc079e, 0x59325809, 0x4c000000, + 0x592c0409, 0x8c00051c, 0x5c000000, 0x05020003, + 0x4a026013, 0xffffffff, 0x84000524, 0x05fdf794, + 0x1c01f000, 0x59a80030, 0x48026205, 0x59325809, + 0x640a6203, 0x592c2409, 0x59300808, 0x4933c857, + 0x4807c857, 0x592c0205, 0x82000500, 0x000000ff, + 0xb0000588, 0x05000003, 0x900005a2, 0x05020003, + 0x8c100500, 0x0506076d, 0x64025a07, 0x8c04051e, + 0x05000030, 0x41780800, 0x497a580a, 0x592c1c0a, + 0x59300008, 0x8c00052c, 0x05000003, 0x4a026013, + 0x7fffffff, 0x59300013, 0x59341200, 0x497a6205, + 0x8c08050e, 0x0502006b, 0x4807c857, 0x4806580b, + 0x0509f8cc, 0x80000d40, 0x05fe0f0c, 0x59300402, + 0x48025c07, 0x48065808, 0x4a025a05, 0x00000103, + 0x4c040000, 0x592c0a09, 0x8c040512, 0x05000002, + 0x64325a07, 0x5c000800, 0x4c040000, 0x4c0c0000, + 0x4c100000, 0x0505fd9a, 0x0509f8b1, 0x5c002000, + 0x5c001800, 0x5c000800, 0x8c100512, 0x05020017, + 0x4c0c0000, 0x0505fd96, 0x0001fb5b, 0x05e1ff22, + 0x5c001800, 0x8c0c0518, 0x0004045a, 0x0505f103, + 0x4813c857, 0x8c100518, 0x05000044, 0x41780800, + 0x592c1c0a, 0x820c0580, 0x00001000, 0x05fc07cd, + 0x8c100512, 0x05fc07cb, 0x592c780a, 0x583c080b, + 0x583c1c0a, 0x05fdf7c7, 0x4807c857, 0x592c780a, + 0x59300402, 0x592c1405, 0x8c08051e, 0x0502000c, + 0x592c1207, 0x48007c07, 0x48047808, 0x48087a07, + 0x84102512, 0x48107c09, 0x4c0c0000, 0x05c1ff82, + 0x403e5800, 0x0501face, 0x05fdf7dd, 0x48025c07, + 0x48065808, 0x583c080d, 0x583c000c, 0x80040c00, + 0x9004149d, 0x05001005, 0x583c1001, 0x480a5801, + 0x49787801, 0x60700800, 0x90040c14, 0x4c0c0000, + 0x4c500000, 0x4c540000, 0x903ca409, 0x912cac09, + 0x4c100000, 0x4c3c0000, 0x0501fad0, 0x5c007800, + 0x5c002000, 0x5c00a800, 0x5c00a000, 0x84102512, + 0x48125c09, 0x403e5800, 0x05c1ff63, 0x0505fd50, + 0x42034000, 0x0010ae99, 0x59a1d806, 0x80edd9c0, + 0x05c00bb7, 0x48efc857, 0x58ec0008, 0x4803c857, + 0x0801f800, 0x05fdf7b6, 0x4933c857, 0x1c01f000, + 0x59301416, 0x480bc857, 0x8c08051c, 0x0502000e, + 0x80000540, 0x4803c857, 0x05fc0790, 0x80042c80, + 0x05fe178e, 0x8c080514, 0x05020005, 0x592c0810, + 0x4807c857, 0x80040480, 0x48026018, 0x8408155c, + 0x480a6416, 0x59301008, 0x8408151e, 0x480a6008, + 0x4c100000, 0x4c3c0000, 0x4d400000, 0x592e8207, + 0x64065a07, 0x0505fd2a, 0x49425a07, 0x5c028000, + 0x5c007800, 0x5c002000, 0x497a580a, 0x8c100512, + 0x05000005, 0x4d2c0000, 0x403e5800, 0x05c1ff32, + 0x5c025800, 0x82102500, 0xffffedff, 0x48125c09, + 0x59301006, 0x800811c0, 0x050400c9, 0x59a80030, + 0x80080480, 0x050610c6, 0x0509f82d, 0x4a025a05, + 0x00000103, 0x641a5a07, 0x497a5c0a, 0x492fc857, + 0x0001fb5b, 0x05e1fea0, 0x0005f45a, 0x59325809, + 0x592c0409, 0x8c000518, 0x05000003, 0x412df800, + 0x05c5f52e, 0x1c01f000, 0x4933c857, 0x59325809, + 0x497a580a, 0x64025a07, 0x4a025a05, 0x00000103, + 0x59300813, 0x4807c857, 0x800409c0, 0x0502000a, + 0x48065808, 0x59300c02, 0x48065c07, 0x0505fcf8, + 0x0509f80f, 0x0505fcfa, 0x0001fb5b, 0x05e1fe86, + 0x0005f45a, 0x59340200, 0x8c00050e, 0x05020007, + 0x59300013, 0x0509f80f, 0x80000d40, 0x05fdfe4f, + 0x48065808, 0x05fdf7f0, 0x592c0209, 0x8c00050e, + 0x05fe07f8, 0x4933c857, 0x0505f095, 0x4933c857, + 0x59325809, 0x812e59c0, 0x05c00b4d, 0x592c020b, + 0x8c000502, 0x05c00b4a, 0x640a6006, 0x1c01f000, + 0x5930001e, 0x800001c0, 0x05060f3f, 0x59300008, + 0x4933c857, 0x4803c857, 0x8c00050e, 0x05000034, + 0x8c000500, 0x05000026, 0x8c00051c, 0x05000009, + 0x84000500, 0x48026008, 0x59325809, 0x592c3c09, + 0x481fc857, 0x841c3d58, 0x481e5c09, 0x0005f4b7, + 0x59325809, 0x592c3c09, 0x841c3d58, 0x59300008, + 0x8c00051c, 0x05fe07f3, 0x481e5c09, 0x60140000, + 0x40000000, 0x80000040, 0x05fe07fe, 0x59300008, + 0x8c00051c, 0x05fe07eb, 0x592c0205, 0x82000500, + 0x000000ff, 0xb0000588, 0x05000003, 0x900005a2, + 0x05020003, 0x497a580c, 0x0501f002, 0x497a580a, + 0x481e5c09, 0x64025a07, 0x05c5f4bc, 0x8c000524, + 0x05fc07dc, 0x59325809, 0x4c000000, 0x592c0409, + 0x8c00051c, 0x5c000000, 0x05020003, 0x4a026013, + 0xffffffff, 0x84000524, 0x05fdf7d2, 0x1c01f000, + 0x4933c857, 0x41780800, 0xb1380498, 0x05021009, + 0xb1380480, 0x05001007, 0x4d2c0000, 0x59325809, + 0x812e59c0, 0x0c020805, 0x5c025800, 0x0005f45a, + 0x493bc857, 0x1c01f000, 0x00107f0a, 0x00107f0a, + 0x00107f0a, 0x00107f0a, 0x00107f0a, 0x00107f0b, + 0x00107f0a, 0x00107f0a, 0x00107f0a, 0x00107f0a, + 0x00107f0a, 0x00107f0a, 0x00107f0a, 0x00107f0a, + 0x00107f0a, 0x00107f0a, 0x00107f0a, 0x00107f0a, + 0x00107f0a, 0x00107f0a, 0x00107f0e, 0x00107f0a, + 0x00107f0a, 0x00107f0a, 0x05c1fae5, 0x59cc0808, + 0x497a5808, 0x4807c857, 0x59300402, 0x48025c07, + 0x4a025a05, 0x00000103, 0x900401c0, 0x4802580a, + 0x64025a07, 0x800409c0, 0x0000035b, 0x59cc0009, + 0x4802580b, 0x82042500, 0x00000100, 0x05000002, + 0x59cc200b, 0x4812580d, 0x82040500, 0x00000200, + 0x05000002, 0x59cc000a, 0x4802580c, 0x80100c00, + 0x05c01acb, 0x0000035b, 0x9004149d, 0x05001005, + 0x592c0405, 0x8c00051e, 0x0500000a, 0x60700800, + 0x4c500000, 0x4c540000, 0x91cca40c, 0x912cac0e, + 0x0501f9ca, 0x5c00a800, 0x5c00a000, 0x0001f35b, + 0x0501f982, 0x0501f1ae, 0x83380480, 0x00000093, + 0x05c21ab7, 0x83380480, 0x00000085, 0x05c01ab4, + 0x0c01f001, 0x00107f4b, 0x00107f4a, 0x00107f4a, + 0x00107f50, 0x00107f4a, 0x00107f4a, 0x00107f4a, + 0x00107f4a, 0x00107f4a, 0x00107f4a, 0x00107f4a, + 0x00107f4a, 0x00107f4a, 0x05c1faa5, 0x64066203, + 0x493a6403, 0x42000800, 0x80000040, 0x0005f32e, + 0x83300580, 0x001104b4, 0x05c20a9d, 0x4933c857, + 0x59cc1404, 0x0505fa3e, 0x0500002c, 0x591c0203, + 0x90000580, 0x05000029, 0x591c000a, 0x81340580, + 0x05020026, 0x59cc1204, 0x82080580, 0x0000ffff, + 0x05000007, 0x591c0202, 0x82000d80, 0x0000ffff, + 0x05000003, 0x80080580, 0x0502001c, 0x4d300000, + 0x4d1c0000, 0x411e6000, 0x0501f9db, 0x5c023800, + 0x5c026000, 0x05000013, 0x59cc0005, 0x8c000500, + 0x05020003, 0x0501f990, 0x0501f002, 0x640a3a03, + 0x4a026403, 0x00000086, 0x59cc0005, 0x8c000500, + 0x0500000c, 0x591c0416, 0x8400055a, 0x48023c16, + 0x59300416, 0x8400055a, 0x48026416, 0x0501f005, + 0x0501f9b8, 0x05fc07ed, 0x4a026403, 0x00000087, + 0x4d2c0000, 0x0511f959, 0x05e5f8d6, 0x5c025800, + 0x59340200, 0x8c00050e, 0x0500000b, 0x59cc1404, + 0x0505fa07, 0x05000008, 0x591c0416, 0x8c00051a, + 0x05000005, 0x4d300000, 0x411e6000, 0x0501ffb2, + 0x5c026000, 0x1c01f000, 0x91380593, 0x0502000a, + 0x59300403, 0x4803c857, 0x82000d80, 0x00000086, + 0x05000015, 0x82000d80, 0x00000087, 0x05c20a50, + 0x0501f011, 0x913805a7, 0x05000003, 0x91380594, + 0x05c20a4b, 0x493bc857, 0x05f1f8ee, 0x0501fd4c, + 0x05f4071f, 0x4d2c0000, 0x59325809, 0x0001fb5b, + 0x59300a29, 0x90040d83, 0x05000e29, 0x5c025800, + 0x05f5f717, 0x4933c857, 0x0505f91f, 0x05f60714, + 0x0005f45a, 0x91380593, 0x05020006, 0x59300403, + 0x4803c857, 0x82000480, 0x00000085, 0x0c01f04c, + 0x913805a7, 0x05020040, 0x4933c857, 0x05f1f8d5, + 0x59300416, 0x8c00051a, 0x05020002, 0x0005f45a, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ee7a, + 0x5c027800, 0x60543000, 0x41782800, 0x600c2000, + 0x60a68000, 0x4d400000, 0x4d440000, 0x59368c03, + 0x0505fe2a, 0x5c028800, 0x5c028000, 0x42000000, + 0x0010b2d6, 0x0511fa70, 0x0501fd1d, 0x0004045a, + 0x4d2c0000, 0x59325809, 0x592c0205, 0x82000500, + 0x000000ff, 0x90000594, 0x05020df9, 0x0505febc, + 0x4a025a05, 0x00000103, 0x59300402, 0x48025c07, + 0x497a580a, 0x49425a07, 0x0001fb5b, 0x5c025800, + 0x0005f45a, 0xb13805a1, 0x05000009, 0xb13805a0, + 0x05000007, 0x83380580, 0x00000089, 0x05000004, + 0x83380580, 0x0000008a, 0x05f6073e, 0x05f1fd04, + 0x05f6073c, 0x59300a03, 0x9004058e, 0x050006ad, + 0x9004058a, 0x0500003c, 0x9004058c, 0x0500003a, + 0x05c1f9f3, 0x91380594, 0x05fe07eb, 0x4933c857, + 0x05f1f894, 0x59300416, 0x8c00051a, 0x05020002, + 0x0005f45a, 0x601a8000, 0x05fdf7d0, 0x00108015, + 0x00108014, 0x00108014, 0x00108014, 0x00108014, + 0x00108014, 0x00108025, 0x00108014, 0x00108014, + 0x00108014, 0x00108014, 0x00108014, 0x00108014, + 0x05c1f9db, 0x4933c857, 0x0505f8bb, 0x0500000a, + 0x643a6203, 0x59a80030, 0x48026205, 0x59300416, + 0x8c00051a, 0x05020003, 0x59a8002e, 0x48026006, + 0x1c01f000, 0x59a8002e, 0x48026006, 0x642a6203, + 0x1c01f000, 0x4933c857, 0x0505f8ab, 0x0500000a, + 0x643a6203, 0x59a80030, 0x48026205, 0x59300416, + 0x8c00051a, 0x05020003, 0x59a8002e, 0x48026006, + 0x1c01f000, 0x59a8002e, 0x48026006, 0x64326203, + 0x1c01f000, 0x5932680a, 0x83380580, 0x00000089, + 0x05000007, 0x83380580, 0x0000008a, 0x0500002c, + 0x4933c857, 0x493bc857, 0x05f5f6f2, 0x4933c857, + 0x59325809, 0x59300416, 0x8c00051a, 0x0500000b, + 0x59300229, 0x90000583, 0x05c209a9, 0x640e6407, + 0x59300429, 0x48026203, 0x59340200, 0x8c00050e, + 0x050206f9, 0x1c01f000, 0x59300a29, 0x90040583, + 0x05020007, 0x0501fca2, 0x0500000d, 0x0001fb5b, + 0x05e1fcc1, 0x497a6009, 0x0501f009, 0x59300229, + 0x90000581, 0x05020006, 0x59300c18, 0x900405b9, + 0x05000019, 0x900405b5, 0x05000017, 0x59cc0c07, + 0x4806641b, 0x59cc0a07, 0x4806621b, 0x59300203, + 0x48026429, 0x64466203, 0x05f5f661, 0x4933c857, + 0x59300416, 0x8c00051a, 0x0006045a, 0x59300229, + 0x90000581, 0x0502003f, 0x59300c18, 0x900405b5, + 0x05000005, 0x9004059e, 0x05000003, 0x900405b9, + 0x05020038, 0x4933c857, 0x4c5c0000, 0x4c600000, + 0x4d1c0000, 0x4130b800, 0x4004c000, 0x0505f8d0, + 0x0502002b, 0x906005b5, 0x05020004, 0x591c0c16, + 0x8c040502, 0x05000026, 0x05f5fe7b, 0x05000024, + 0x491fc857, 0x4933c857, 0x906005b5, 0x05000003, + 0x906005b9, 0x05020002, 0x4932381e, 0x585c081d, + 0x4806601d, 0x48626403, 0x64066203, 0x64066407, + 0x585c080a, 0x4807c857, 0x4806600a, 0x585c0c17, + 0x4807c857, 0x48066417, 0x585c0a17, 0x4807c857, + 0x48066217, 0x585c0a18, 0x4807c857, 0x48066218, + 0x585c0c1b, 0x4807c857, 0x4806641b, 0x585c0a1b, + 0x4807c857, 0x4806621b, 0x491e602a, 0x0505f81f, + 0x42000800, 0x80000040, 0x0005fb2e, 0x405e6000, + 0x5c023800, 0x5c00c000, 0x5c00b800, 0x0005f45a, + 0x0501fc47, 0x05000008, 0x4d2c0000, 0x59325809, + 0x0001fb5b, 0x59300229, 0x90000583, 0x05e00c62, + 0x5c025800, 0x0005f45a, 0x4803c856, 0x4c500000, + 0x4c540000, 0x412c7800, 0x4c3c0000, 0x60042800, + 0x82040480, 0x00000101, 0x05001002, 0x60000802, + 0x40043000, 0x60700800, 0x91cca40c, 0x912cac0e, + 0x0501f836, 0x9018349c, 0x592e5801, 0x812e59c0, + 0x05c20ccd, 0x05c1fcb3, 0x05000011, 0x80142800, + 0x4a025805, 0x00000110, 0x492c7801, 0x90180cbd, + 0x05021005, 0x40180800, 0x912cac06, 0x0501f827, + 0x0501f007, 0x901834bc, 0x60f00800, 0x412c7800, + 0x912cac06, 0x0501f821, 0x05fdf7ef, 0x5c007800, + 0x841429c0, 0x90142d43, 0x48147a05, 0x403e5800, + 0x5c00a800, 0x5c00a000, 0x1c01f000, 0x492fc857, + 0x812e59c0, 0x0500000d, 0x4d2c0000, 0x4c3c0000, + 0x592c7801, 0x803c79c0, 0x05000005, 0x497a5801, + 0x0001fb5b, 0x403e5800, 0x05fdf7fa, 0x5c007800, + 0x0001fb5b, 0x5c025800, 0x1c01f000, 0x4803c856, + 0x4c580000, 0x90040403, 0x8000b104, 0x0511fa19, + 0x5c00b000, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x90040c03, 0x8004b104, 0x0511fa12, 0x5c00b000, + 0x1c01f000, 0x591c0c07, 0x90040583, 0x05000005, + 0x90040582, 0x05000003, 0x9004058a, 0x05020022, + 0x4d300000, 0x4d2c0000, 0x411e6000, 0x59325809, + 0x0501fbe7, 0x05000019, 0x59300c07, 0x9004058a, + 0x0500001a, 0x90040583, 0x05020007, 0x592c0a05, + 0x82040d00, 0x000000ff, 0x90040d94, 0x05000002, + 0x640e6229, 0x0501f814, 0x4d400000, 0x604e8000, + 0x592c0a09, 0x84040d54, 0x05e1ffcc, 0x5c028000, + 0x0505fa63, 0x0505fd7a, 0x0001fb5b, 0x59300229, + 0x90000583, 0x05000cb2, 0x05f5fda1, 0x5c025800, + 0x5c026000, 0x1c01f000, 0x644e5a07, 0x642a6229, + 0x05fdf7f4, 0x592c0409, 0x8c000512, 0x05000008, + 0x84000512, 0x48025c09, 0x4d2c0000, 0x592e580a, + 0x05c1fc61, 0x5c025800, 0x497a580a, 0x1c01f000, + 0x59cc0005, 0x8c000500, 0x0502000a, 0x591c0407, + 0x90000582, 0x05020007, 0x591c0c03, 0x82040580, + 0x00000085, 0x05000003, 0x82040580, 0x0000008b, + 0x1c01f000, 0x4933c857, 0x4d3c0000, 0x600a7800, + 0x59300407, 0x90000c92, 0x05c218a5, 0x0c01f808, + 0x5c027800, 0x1c01f000, 0x4933c857, 0x59300407, + 0x90000c92, 0x05c2189e, 0x0c01f001, 0x00108169, + 0x00108166, 0x00108166, 0x00108198, 0x00108165, + 0x00108166, 0x0010817b, 0x00108166, 0x00108165, + 0x00108165, 0x00108f1e, 0x00108166, 0x00108166, + 0x00108165, 0x00108165, 0x00108165, 0x00108274, + 0x00108166, 0x05c1f88a, 0x4803c856, 0x80000580, + 0x1c01f000, 0x4803c856, 0x8d3c0502, 0x0502000f, + 0x0501fb87, 0x0500000b, 0x59325809, 0x0505fd2c, + 0x41780800, 0x4d400000, 0x60168000, 0x05e1ff77, + 0x5c028000, 0x0505fa0e, 0x0501fce6, 0x0001fb5b, + 0x05f5fd4f, 0x90000541, 0x1c01f000, 0x4933c857, + 0x0501fb77, 0x05000008, 0x59300809, 0x58040209, + 0x8c000512, 0x05000004, 0x4d400000, 0x60328000, + 0x0501f00f, 0x05e1fb1f, 0x0500000b, 0x59300416, + 0x84000556, 0x48026416, 0x0501f80e, 0x4df00000, + 0x59300416, 0x84000516, 0x48026416, 0x5c03e000, + 0x1c01f000, 0x4d400000, 0x60428000, 0x050df80d, + 0x641a6407, 0x641e6203, 0x5c028000, 0x1c01f000, + 0x4933c857, 0x05edffa6, 0x4df00000, 0x0501f8c9, + 0x90000c91, 0x05c21852, 0x0c01f001, 0x001081b1, + 0x00108223, 0x001081c3, 0x00108233, 0x00108220, + 0x001081b0, 0x001081b1, 0x001081b1, 0x001081b4, + 0x001081b1, 0x001081b1, 0x001081b1, 0x001081b1, + 0x001081c3, 0x001081b4, 0x001081b1, 0x001081b4, + 0x05c1f83f, 0x5c03e000, 0x05ec0f79, 0x05fdf7b3, + 0x5c03e000, 0x05ec0f76, 0x59300407, 0x90000583, + 0x05fe07b1, 0x59300203, 0x9000058d, 0x05fc07ae, + 0x8d3c0502, 0x05fe07ac, 0x4d340000, 0x5932680a, + 0x05e1fb55, 0x5c026800, 0x05fdf7a7, 0x0505fde5, + 0x0505fcbd, 0x59300004, 0x8400055c, 0x48026004, + 0x4203e000, 0xb0800000, 0x6023f800, 0x05edff60, + 0x59300407, 0x90000586, 0x0500004c, 0x8d3c0502, + 0x0502004e, 0x497a6229, 0x59300203, 0x9000058d, + 0x05000002, 0x640e6229, 0x0501fb1d, 0x05020004, + 0x8d3c0500, 0x05000036, 0x0501f02e, 0x4d2c0000, + 0x4d400000, 0x59325809, 0x0501fc7e, 0x592c0409, + 0x8c000512, 0x05000008, 0x4d2c0000, 0x84000512, + 0x48025c09, 0x592c080a, 0x40065800, 0x05c1fbae, + 0x5c025800, 0x4d400000, 0x60168000, 0x592c0a09, + 0x8c04050e, 0x05000003, 0x600a8000, 0x0501f004, + 0x8c040512, 0x05000002, 0x60328000, 0x05e1fef7, + 0x0505fca7, 0x5c028000, 0x0505f98d, 0x8d3c0500, + 0x05020003, 0x0511f966, 0x05020003, 0x0001fb5b, + 0x497a6009, 0x5c028000, 0x5c025800, 0x8d3c0500, + 0x0500000a, 0x59300a29, 0x90040d83, 0x05020005, + 0x4d340000, 0x5932680a, 0x05e1fb0f, 0x5c026800, + 0x05f5fcbf, 0x0501f011, 0x0511f955, 0x05020004, + 0x59300a29, 0x90040d83, 0x05000bc9, 0x4a026403, 0x00000085, 0x64266203, 0x640a6407, 0x42000800, - 0x80004040, 0x0005fb2e, 0x81780080, 0x1c01f000, - 0x05edffa7, 0x05fdf7fd, 0x05f9fb0a, 0x05020003, - 0x05e9fce7, 0x05020007, 0x0201f800, 0x0010ed56, - 0x80c40040, 0x05fc07e1, 0x05e9f921, 0x05ba0c78, - 0x59300203, 0x90000d83, 0x05b80c75, 0x90000c91, - 0x05ba1c73, 0x0c01f7c2, 0x4933c857, 0x4d340000, - 0x4d240000, 0x4d200000, 0x916c0583, 0x05020015, - 0x599c0018, 0x8c000516, 0x05000003, 0x05d5f845, - 0x0501f010, 0x60100800, 0x05d9fb61, 0x59300429, - 0x900005a1, 0x05000005, 0x59240400, 0x8c00050c, - 0x05000004, 0x64866429, 0x05fdfbbe, 0x90000541, - 0x5c024000, 0x5c024800, 0x5c026800, 0x1c01f000, - 0x80000580, 0x05fdf7fb, 0x4d340000, 0x5932680a, - 0x05d9ff6f, 0x5c026800, 0x0005f45a, 0x4803c856, - 0x4c5c0000, 0x4d200000, 0x4014b800, 0x05c9f984, - 0x59a8007b, 0x80000040, 0x4803507b, 0x59240200, - 0x82000500, 0xfffffeef, 0x84000546, 0x48024a00, - 0x497a4805, 0x4d400000, 0x60068000, 0x405c2800, - 0x60040000, 0x05ddfa59, 0x60aa8000, 0x4d3c0000, - 0x600a7800, 0x05c9f9be, 0x5c027800, 0x5c028000, - 0x5c024000, 0x5c00b800, 0x813261c0, 0x05ee0758, - 0x1c01f000, 0x59303009, 0x58181a05, 0x820c1d00, - 0x000000ff, 0xb00c0588, 0x05000003, 0xb00c05aa, - 0x05020045, 0x58180409, 0x8c000500, 0x05000042, - 0x42000000, 0x0010ccb9, 0x50006000, 0x41781800, - 0x5830200b, 0x41300000, 0x80100580, 0x05000006, - 0x40101800, 0x580c2000, 0x801021c0, 0x05fe07fa, - 0x0501f035, 0x4933c857, 0x59302000, 0x497a6000, - 0x800c19c0, 0x0502001e, 0x4933c856, 0x42007000, - 0x00020d9f, 0x58300009, 0x800001c0, 0x05000018, - 0x49786009, 0x58380001, 0x80300580, 0x05020008, - 0x4933c856, 0x49787002, 0x4810600b, 0x801021c0, - 0x0502001d, 0x4978600a, 0x0501f01b, 0x4933c856, - 0x4810600b, 0x801021c0, 0x05020002, 0x4978600a, - 0x4c180000, 0x4c300000, 0x05bdf8b1, 0x5c006000, - 0x05fdfdb6, 0x5c003000, 0x0501f00f, 0x4933c856, - 0x800c19c0, 0x05020008, 0x801021c0, 0x05000003, - 0x4810600b, 0x0501f008, 0x4978600b, 0x4978600a, - 0x0501f005, 0x48101800, 0x801021c0, 0x05020002, - 0x480c600a, 0x58180409, 0x84000500, 0x48003409, - 0x49783209, 0x1c01f000, 0x4933c857, 0x59368c03, - 0x4c180000, 0x59300203, 0x90003491, 0x05ba1be0, - 0x0c01f803, 0x5c003000, 0x1c01f000, 0x00108e24, - 0x00109279, 0x001093f3, 0x00108e24, 0x00108e24, - 0x00108e24, 0x00108e24, 0x00108e24, 0x00108e44, - 0x00108e24, 0x00108e24, 0x00108e24, 0x00108e24, - 0x00108e24, 0x00109980, 0x00108e24, 0x00108e24, - 0x05b9fbcb, 0x4933c857, 0x61fe89ff, 0x813669c0, + 0x80004040, 0x0505fc6c, 0x0005fb2e, 0x4203e000, + 0xb0800000, 0x6023f800, 0x5c03e000, 0x05ee0f24, + 0x90000541, 0x1c01f000, 0x0505fc7d, 0x05fdf7fb, + 0x05edff0b, 0x05c5f9b6, 0x05fdf7a1, 0x598c000b, + 0x81300580, 0x05020003, 0x05f1fa28, 0x05020026, + 0x0201f800, 0x0010f0f2, 0x80c40040, 0x05020005, + 0x59300c03, 0xb0040580, 0x05fc0786, 0x05fdf794, + 0x05edfe29, 0x0500001c, 0x05bdffbd, 0x0501f823, + 0x05020003, 0x05f1f9e4, 0x05020017, 0x0201f800, + 0x0010ef65, 0x80c40040, 0x0500000f, 0x05edfe1e, + 0x05000011, 0x59300407, 0x90000583, 0x05be0fb0, + 0x59300004, 0x9000051f, 0x90000585, 0x05be0fac, + 0x58d400ec, 0x82000500, 0x00000f00, 0x05fe077c, + 0x05bdffa7, 0x59300c03, 0xb0040580, 0x05fc0769, + 0x05fdf777, 0x59300203, 0x90000c91, 0x05be1fa0, + 0x0c01f74f, 0x0501f805, 0x60058800, 0x05000002, + 0x60018800, 0x1c01f000, 0x417a3000, 0x60df2160, + 0x59900005, 0x81300580, 0x05000006, 0x91932410, + 0x811a3000, 0x91180485, 0x05fc17fa, 0x90000541, + 0x1c01f000, 0x0501f803, 0x40018800, 0x1c01f000, + 0x59300004, 0x8c00053e, 0x0500000c, 0x8c00050c, + 0x0502000a, 0x8c000516, 0x05020004, 0x90000d1f, + 0x90040585, 0x05020003, 0x600c0000, 0x0501f004, + 0x60040000, 0x0501f002, 0x59300203, 0x1c01f000, + 0x4933c857, 0x05edfeca, 0x4df00000, 0x59300203, + 0x90000c91, 0x05be1f76, 0x0c01f001, 0x0010828d, + 0x001082a0, 0x00108290, 0x0010828c, 0x0010828c, + 0x0010828c, 0x0010828c, 0x0010828c, 0x0010828c, + 0x0010828c, 0x0010828c, 0x0010828c, 0x0010828c, + 0x0010828c, 0x00108290, 0x0010828c, 0x0010828c, + 0x05bdff63, 0x5c03e000, 0x05ec0e9d, 0x05fdf6d7, + 0x5c03e000, 0x05ec0e9a, 0x4d2c0000, 0x59325809, + 0x59300403, 0xb0000592, 0x05c40e04, 0x0501fa5c, + 0x05bc0f57, 0x64165a07, 0x0001fb5b, 0x05e1fd1d, + 0x05f5fc2b, 0x5c025800, 0x90000541, 0x1c01f000, + 0x598c000b, 0x81300580, 0x05020018, 0x59300004, + 0x8c000520, 0x05000004, 0x84000520, 0x48026004, + 0x0501f018, 0x42001000, 0x0010b20e, 0x50081000, + 0x58080002, 0x82000580, 0x00000100, 0x05000009, + 0x5808000b, 0x81300580, 0x05be0f3d, 0x0201f800, + 0x0010f0f2, 0x80c40040, 0x05be0f39, 0x05fdf7d9, + 0x05f1f996, 0x0502000c, 0x59300004, 0x8c000520, + 0x05000004, 0x84000520, 0x48026004, 0x05fdf7d1, + 0x0201f800, 0x0010f0f2, 0x80c40040, 0x05fc07cd, + 0x05bdff2b, 0x59300203, 0x90000c91, 0x05be1f28, + 0x0c01f7b3, 0x4d340000, 0x4d240000, 0x5932481d, + 0x5932680a, 0x59300407, 0x4933c857, 0x4803c857, + 0x90000c92, 0x05be1f1e, 0x0c01f804, 0x5c024800, + 0x5c026800, 0x1c01f000, 0x001082eb, 0x0010830e, + 0x00108446, 0x0010f70c, 0x0010843d, 0x00108442, + 0x00109994, 0x001082f2, 0x00108439, 0x001082e8, + 0x001084a3, 0x001082e8, 0x001082e8, 0x001082e8, + 0x001082e8, 0x00020c5a, 0x00108cb3, 0x00108cb3, + 0x05bdff07, 0x0501fb15, 0x05f802ce, 0x1c01f000, + 0x05edfe53, 0x05edfda7, 0x05edfe3d, 0x0005f45a, + 0x64066006, 0x1c01f000, 0x4d340000, 0x4c5c0000, + 0x59300203, 0x90000591, 0x05020014, 0x5932680a, + 0x4130b800, 0x0005fc3d, 0x0500000f, 0x64066203, + 0x647a6403, 0x585c041b, 0x4802641b, 0x585c021b, + 0x4802621b, 0x4936600a, 0x585c001d, 0x4802601d, + 0x0501fdbe, 0x64066407, 0x42000800, 0x80000040, + 0x0005fb2e, 0x405e6000, 0x0005fc5a, 0x5c00b800, + 0x5c026800, 0x1c01f000, 0x42000000, 0x0010b2e1, + 0x050dff35, 0x050dfe60, 0x59300203, 0x90000c91, + 0x05be1edb, 0x4803c857, 0x0c01f001, 0x00108328, + 0x001082f0, 0x00108329, 0x00108328, 0x00108329, + 0x00108329, 0x001082ec, 0x00108328, 0x001082e9, + 0x00108328, 0x00108328, 0x00108328, 0x00108328, + 0x00108328, 0x00108329, 0x00108328, 0x00108328, + 0x05bdfec7, 0x83340580, 0x0010ce8f, 0x05f4039c, + 0x4d2c0000, 0x59340400, 0x82000500, 0x000000ff, + 0x90000c8c, 0x05be1ebe, 0x59303403, 0xb0180d91, + 0x0500000c, 0x90180d84, 0x05020003, 0x60040000, + 0x0501f004, 0x90180d80, 0x05020002, 0x60040000, + 0x4803c857, 0x0c01f823, 0x5c025800, 0x1c01f000, + 0x42000000, 0x0010b2dd, 0x050dff03, 0x05cdfc3d, + 0x59340412, 0x82000500, 0x000000ff, 0x05000016, + 0x80000040, 0x48026c12, 0x4d300000, 0x05f5fbb2, + 0x5c000000, 0x0500000f, 0x641c0407, 0x4a000006, + 0x00000398, 0x49238830, 0x4a038832, 0xffffffff, + 0x4926601d, 0x497a6009, 0x4936600a, 0x64066407, + 0x64066203, 0x65466403, 0x5c025800, 0x05edf489, + 0x40026000, 0x5c025800, 0x60042800, 0x0505f426, + 0x0010836c, 0x001083f8, 0x0010836d, 0x001083a4, + 0x0010836d, 0x0010840e, 0x0010836d, 0x00108374, + 0x0010836c, 0x0010840e, 0x0010836c, 0x0010837f, + 0x05bdfe83, 0x59300403, 0x90000d96, 0x05000033, + 0x90000d84, 0x05000031, 0x90000d82, 0x0500002f, + 0x0501fa8a, 0x0500002d, 0x59300403, 0x90000da2, + 0x05000098, 0x90000db9, 0x0500009f, 0x90000db5, + 0x0500009d, 0x90000d9e, 0x05000025, 0x0501f974, + 0x05000005, 0x0501fffd, 0x05020003, 0x05e1fa24, + 0x0501f01e, 0x59300403, 0x90000d81, 0x0502000f, + 0x5930081d, 0x58040200, 0x8c000500, 0x050403f5, + 0x5930080a, 0x58040403, 0x82000580, 0x000007fe, + 0x05020004, 0x60042800, 0x0505fbf3, 0x0005f45a, + 0x05e1f9e3, 0x0500000d, 0x59340403, 0x82000480, + 0x000007f0, 0x0502100a, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010ee7a, 0x5c027800, 0x42000000, + 0x0010b2d6, 0x050dfea4, 0x05f9fa16, 0x05f5f324, + 0x0501f94f, 0x05000003, 0x0501ffd8, 0x05000083, + 0x59300c03, 0x90040596, 0x05000049, 0x90040582, + 0x0502002d, 0x59a8021b, 0x8c000502, 0x0502000c, + 0x05e1ff82, 0x0502000a, 0x05e1ffa1, 0x05020004, + 0x60040000, 0x05e1ff51, 0x0501f074, 0x64075014, + 0x6006d800, 0x05e1fef7, 0x0501f070, 0x59340200, + 0x8c000508, 0x05000007, 0x84000508, 0x48026a00, + 0x59300416, 0x84000510, 0x48026416, 0x0501f011, + 0x59340412, 0x82000500, 0x000000ff, 0x05000012, + 0x80000040, 0x48026c12, 0x5932481d, 0x497a6205, + 0x4d300000, 0x05f5fb30, 0x5c000000, 0x05000009, + 0x49780009, 0x641c0407, 0x4a000006, 0x00000398, + 0x4926601d, 0x4936600a, 0x64066407, 0x0501f01c, + 0x40026000, 0x59300403, 0x90000d82, 0x0502000d, + 0x59340403, 0x82000580, 0x000007fe, 0x05020007, + 0x59a8021b, 0x84000540, 0x4803521b, 0x05ddfb37, + 0x05f9f9d4, 0x0501f00c, 0x600c0002, 0x05f5fd71, + 0x05f9f9d0, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010ee7a, 0x5c027800, 0x42000000, 0x0010b2d6, + 0x050dfe55, 0x05cdf8e2, 0x05f5f2d5, 0x600c0800, + 0x05ddfdca, 0x64066203, 0x640a6403, 0x05edf3ed, + 0x0501f8fb, 0x05fe07a9, 0x05cdf8d9, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010ee7a, 0x5c027800, + 0x42000000, 0x0010b2d6, 0x050dfe43, 0x60603000, + 0x41782800, 0x60002000, 0x4d400000, 0x4d440000, + 0x59368c03, 0x60a68000, 0x0505f9f0, 0x5c028800, + 0x5c028000, 0x05f5f2ba, 0x05e1f999, 0x05fdf7d9, + 0x42000000, 0x0010b2e0, 0x050dfe33, 0x60140002, + 0x05f5fd44, 0x05fc07d3, 0x05f5fd5c, 0x05fe07d1, + 0x1c01f000, 0x59300c03, 0x0501fd31, 0x0006045a, + 0x916c0583, 0x05000003, 0x640a6006, 0x1c01f000, + 0x59300403, 0x48026418, 0x64066229, 0x4a026403, + 0x00000085, 0x64266203, 0x640a6407, 0x42000800, + 0x80000040, 0x0005f32e, 0x05f9f98e, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010ee7a, 0x5c027800, + 0x42000000, 0x0010b2d6, 0x050dfe13, 0x497a6009, + 0x641e6407, 0x4a026006, 0x00000398, 0x497a6205, + 0x1c01f000, 0x42000000, 0x0010b2e7, 0x050dfe0a, + 0x05fdf6d2, 0x42000000, 0x0010b2e2, 0x050dfe06, + 0x050dfd31, 0x05f5f286, 0x42000000, 0x0010b2e4, + 0x050dfe01, 0x1c01f000, 0x42000000, 0x0010b2e3, + 0x050dfdfd, 0x59300203, 0x90000c91, 0x05be1da4, + 0x4803c857, 0x0c01f001, 0x0010845f, 0x001082f0, + 0x0010845f, 0x0010845f, 0x0010845f, 0x0010845f, + 0x0010845f, 0x0010845f, 0x0010845f, 0x001082f0, + 0x00108460, 0x001082f0, 0x0010846a, 0x0010845f, + 0x00108460, 0x0010845f, 0x0010845f, 0x05bdfd90, + 0x59300403, 0x82000580, 0x0000008b, 0x05000007, + 0x4a026403, 0x0000008b, 0x642e6203, 0x42000800, + 0x80004040, 0x0005f32e, 0x59300a29, 0x0501f888, + 0x0500000b, 0x4d2c0000, 0x59325809, 0x641a5a07, + 0x497a5c0a, 0x0001fb5b, 0x59300a29, 0x90040d83, + 0x05e008a1, 0x5c025800, 0x497a6009, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010ee7a, 0x5c027800, + 0x60443000, 0x050dfc21, 0x42000000, 0x0010b2d6, + 0x050dfdc5, 0x4c5c0000, 0x4130b800, 0x05f5fa7a, + 0x05000009, 0x4936600a, 0x4926601d, 0x0501fc3b, + 0x4d300000, 0x405e6000, 0x05f5fa3d, 0x5c026000, + 0x0501f002, 0x405e6000, 0x5c00b800, 0x497a6009, + 0x64066407, 0x64066403, 0x59240400, 0x8c00050a, + 0x0502000b, 0x64126407, 0x641e6203, 0x6406642c, + 0x60103000, 0x4d400000, 0x60a68000, 0x41782800, + 0x0509fe90, 0x5c028000, 0x1c01f000, 0x602c0800, + 0x05ddfd1e, 0x64066203, 0x05edf342, 0x42000000, + 0x0010b2e9, 0x050dfda0, 0x59300203, 0x90000c91, + 0x05be1d47, 0x4803c857, 0x0c01f001, 0x001084cc, + 0x001084bc, 0x001084be, 0x001084cd, 0x001084bd, + 0x001084bc, 0x001084bc, 0x001084bc, 0x001084bc, + 0x001084bc, 0x001084bc, 0x001084bc, 0x001084bc, + 0x001084bc, 0x001084bc, 0x001084bc, 0x001084bc, + 0x05bdfd33, 0x05c1ff1a, 0x4d2c0000, 0x59325809, + 0x641a5a07, 0x0001fb5b, 0x5c025800, 0x497a6009, + 0x642a6229, 0x4a026403, 0x00000085, 0x64266203, + 0x640a6407, 0x42000800, 0x80004040, 0x0005f32e, + 0x1c01f000, 0x05edfc72, 0x4df00000, 0x05fdfd87, + 0x05020003, 0x05edff48, 0x0502000a, 0x0201f800, + 0x0010ef65, 0x80c40040, 0x05020004, 0x5c03e000, + 0x05edfc53, 0x05fdf7e5, 0x05edfb7f, 0x05be0d14, + 0x5c03e000, 0x05edfc4e, 0x59300203, 0x90000d83, + 0x05bc0d0f, 0x90000c91, 0x05be1d0d, 0x0c01f7c8, + 0x59a8000d, 0x59a80864, 0x80040400, 0x80080480, + 0x05021003, 0x90000541, 0x1c01f000, 0x480bc857, + 0x80000580, 0x1c01f000, 0x0501f805, 0x60018800, + 0x05000002, 0x60058800, 0x1c01f000, 0x4c040000, + 0x59300809, 0x59a8000c, 0x80040480, 0x05001007, + 0x59a8000a, 0x80040480, 0x05021004, 0x800409c0, + 0x5c000800, 0x1c01f000, 0x800409c0, 0x05be0cf0, + 0x4803c856, 0x05fdf7fb, 0x4803c856, 0x4d300000, + 0x0005fc3d, 0x05000007, 0x0501f828, 0x4d380000, + 0x612e7000, 0x0005fc78, 0x5c027000, 0x90000541, + 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x05f5f9ed, 0x05000019, 0x0501f81c, 0x4d300000, + 0x05edfc2b, 0x4df00000, 0x05edfae3, 0x4d3c0000, + 0x60027840, 0x0201f800, 0x0010f344, 0x0201f800, + 0x0010f3dd, 0x0201f800, 0x0010f7f5, 0x5c027800, + 0x5c03e000, 0x05ec0c0a, 0x5c026000, 0x8d3c053e, + 0x05020008, 0x4d380000, 0x61327000, 0x0005fc78, + 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, + 0x0005fc5a, 0x05fdf7fc, 0x592c0408, 0x494a6019, + 0x494e601a, 0x4936600a, 0x492e6009, 0x640e6407, + 0x59340802, 0x4806600b, 0x800000c2, 0x800008c4, + 0x80040400, 0x48026006, 0x05e1f88e, 0x4926601d, + 0x0501f386, 0x493bc857, 0x4d300000, 0x0005fc3d, + 0x0500000a, 0x05fdffed, 0x4d400000, 0x60168000, + 0x0501f80a, 0x5c028000, 0x8d3c053e, 0x05020005, + 0x0005fc78, 0x90000541, 0x5c026000, 0x1c01f000, + 0x0005fc5a, 0x05fdf7fc, 0x4803c856, 0x05edfbf0, + 0x4df00000, 0x4d3c0000, 0x4d440000, 0x59368c03, + 0x60067840, 0x0201f800, 0x0010f2b3, 0x0201f800, + 0x0010f305, 0x0201f800, 0x0010f3dd, 0x0201f800, + 0x0010f7f5, 0x5c028800, 0x5c027800, 0x5c03e000, + 0x05ec03cb, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x05f5f999, 0x0500000e, 0x481a601e, 0x48ee602d, + 0x4936600a, 0x05e1f85f, 0x4926601d, 0x0501fb57, + 0x64066407, 0x492e6009, 0x4d380000, 0x607e7000, + 0x0005fc78, 0x5c027000, 0x90000541, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x05f5f986, + 0x0500000d, 0x48ee602d, 0x4936600a, 0x05e1f84d, + 0x4926601d, 0x0501fb45, 0x64066407, 0x492e6009, + 0x4d380000, 0x61567000, 0x0005fc78, 0x5c027000, + 0x90000541, 0x5c026000, 0x1c01f000, 0x4803c856, + 0x4d300000, 0x05f5f974, 0x0500000e, 0x481a601e, + 0x48ee602d, 0x4936600a, 0x05e1f83a, 0x4926601d, + 0x0501fb32, 0x64066407, 0x492e6009, 0x4d380000, + 0x60f67000, 0x0005fc78, 0x5c027000, 0x90000541, + 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x05f5f961, 0x05000012, 0x4926601d, 0x4936600a, + 0x0501fb22, 0x492fc857, 0x4933c857, 0x592c0405, + 0x8c00051e, 0x05000003, 0x48efc857, 0x48ee602d, + 0x64066407, 0x492e6009, 0x4d380000, 0x60027000, + 0x0005fc78, 0x5c027000, 0x90000541, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x05f5f94a, + 0x0500000e, 0x48ee602d, 0x481a601e, 0x4936600a, + 0x05e1f810, 0x4926601d, 0x0501fb08, 0x64066407, + 0x492e6009, 0x4d380000, 0x61127000, 0x0005fc78, + 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, + 0x4803c856, 0x4d300000, 0x05f5f937, 0x0500000e, + 0x481a601e, 0x48ee602d, 0x4936600a, 0x05ddfffd, + 0x4926601d, 0x0501faf5, 0x64066407, 0x492e6009, + 0x4d380000, 0x61267000, 0x0005fc78, 0x5c027000, + 0x90000541, 0x5c026000, 0x1c01f000, 0x5930000a, + 0x80001540, 0x05bc0c16, 0x8d0c0512, 0x05020007, + 0x5808040b, 0x4803c856, 0x80000040, 0x05001003, + 0x4800140b, 0x05020008, 0x58080010, 0x80000540, + 0x05000005, 0x58080203, 0x80000540, 0x05020002, + 0x64041203, 0x1c01f000, 0x4803c856, 0x59300403, + 0x90000d82, 0x0500000b, 0x90000d83, 0x05000009, + 0x90000d84, 0x05000007, 0x599c0819, 0x8c04050e, + 0x05000003, 0x90000d80, 0x05000002, 0x90000541, + 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, + 0x60018800, 0x1c01f000, 0x4803c856, 0x4c000000, + 0x4d2c0000, 0x59300407, 0x90000584, 0x05000017, + 0x59300009, 0x80025d40, 0x800001c0, 0x05000013, + 0x0501fd76, 0x0500000f, 0x59300407, 0x90004590, + 0x0500000c, 0x90004591, 0x0500000a, 0x90004583, + 0x0500000a, 0x90004582, 0x05000008, 0x9000458a, + 0x05000006, 0x592c0405, 0x8c00051e, 0x05000003, + 0x80000580, 0x0501f002, 0x90000541, 0x5c025800, + 0x5c000000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x05f5f8dd, 0x05000011, 0x4926601d, 0x4936600a, + 0x0501fa9e, 0x48ee602d, 0x64066407, 0x492e6009, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ee7a, + 0x5c027800, 0x4d380000, 0x60a27000, 0x0005fc78, + 0x5c027000, 0x90000541, 0x5c026000, 0x1c01f000, + 0x4803c856, 0x91380595, 0x05020009, 0x59a80077, + 0xb00005b4, 0x05020006, 0x41780800, 0x05ddfc6f, + 0x64066203, 0x64a66403, 0x05edf1a6, 0x05f5ff79, + 0x0005f45a, 0x4803c856, 0x91380596, 0x05020004, + 0x60100800, 0x05ddfb79, 0x05f5f2cd, 0x91380595, + 0x0502000d, 0x59a80077, 0x90000594, 0x0502000a, + 0x05ddfcd3, 0x05f9fbbb, 0x05020007, 0x59340404, + 0x80000540, 0x05000004, 0x60180800, 0x05ddfb6b, + 0x05f5f2bf, 0x05f5ff63, 0x0005f45a, 0x4803c856, + 0x592c0207, 0x90000585, 0x05000002, 0x1c01f000, + 0x4803c856, 0x592c0209, 0x8400054a, 0x48025a09, + 0x1c01f000, 0x59300809, 0x800409c0, 0x05000008, + 0x58040205, 0x82000580, 0x00000152, 0x05020004, + 0x59a8082e, 0x48066006, 0x1c01f000, 0x599c0416, + 0x800001c0, 0x05000007, 0x90000c84, 0x05001005, + 0x800000c2, 0x800008c4, 0x80040c00, 0x05fdf7f6, + 0x59300403, 0x90000582, 0x05fe07f2, 0x5930080a, + 0x58040403, 0x82000580, 0x000007fe, 0x05fe07ed, + 0x60a00800, 0x05fdf7ec, 0x4803c856, 0x59300c03, + 0xb13805a1, 0x05000019, 0xb13805a0, 0x05000017, + 0xb13805a2, 0x0502001e, 0x497a6205, 0x90040582, + 0x05000006, 0x9004059e, 0x0500000e, 0x90040584, + 0x05020017, 0x0501f003, 0x600c0800, 0x05ddfb2f, + 0x59340200, 0x84000508, 0x48026a00, 0x59300416, + 0x84000510, 0x48026416, 0x64066203, 0x05edf14d, + 0x64166203, 0x0501f00a, 0x59340200, 0x8c00050e, + 0x05020002, 0x497a6205, 0x640a6203, 0x90040486, + 0x05fc17c1, 0x59a8002e, 0x48026006, 0x1c01f000, + 0x4803c856, 0xb13805a1, 0x05000003, 0xb13805a0, + 0x0502000a, 0x59303403, 0x82180580, 0x00000086, + 0x05f4001b, 0x82180580, 0x00000087, 0x05f40018, + 0x497a6205, 0x642a6203, 0x1c01f000, 0x4803c856, + 0xb13805a1, 0x05000003, 0xb13805a0, 0x05020007, + 0x59300403, 0xb0000c91, 0x05be1b35, 0xb0000480, + 0x05bc1b33, 0x0c01f002, 0x1c01f000, 0x001086d1, + 0x001086d0, 0x001086d0, 0x001086dd, 0x001086d0, + 0x001086d0, 0x001086d0, 0x001086d0, 0x001086d0, + 0x001086dd, 0x001086d0, 0x001086de, 0x001086de, + 0x001086de, 0x001086de, 0x001086d0, 0x001086e1, + 0x05bdfb1f, 0x59340200, 0x8c00050e, 0x05020002, + 0x497a6205, 0x59300809, 0x5804020b, 0x8c000502, + 0x05000003, 0x64126203, 0x1c01f000, 0x640a6203, + 0x1c01f000, 0x1c01f000, 0x497a6205, 0x64366203, + 0x1c01f000, 0x0005f45a, 0x4803c856, 0xb13805a1, + 0x05000006, 0xb13805a0, 0x05020009, 0x59cc0002, + 0x8c000526, 0x05000007, 0x59300403, 0xb0000d83, + 0x05000005, 0xb0000d89, 0x05000003, 0x05f5f841, + 0x1c01f000, 0x59a80030, 0x48026205, 0x640a6203, + 0x5930001c, 0x80000540, 0x05000003, 0x497a601c, + 0x0801f800, 0x1c01f000, 0x497a6205, 0x497a6009, + 0x64066203, 0x65426403, 0x42000800, 0x80000043, + 0x0005f32e, 0x4933c857, 0x4d340000, 0x5932680a, + 0x59340200, 0x8c00050e, 0x05000005, 0x59300407, + 0x90000c92, 0x05021004, 0x0c01f805, 0x5c026800, + 0x1c01f000, 0x05fdfbde, 0x05fdf7fd, 0x001082eb, + 0x00108721, 0x00108725, 0x00108728, 0x00109cdd, + 0x00109cf5, 0x00109cf9, 0x001082eb, 0x001082eb, + 0x001082eb, 0x001082eb, 0x001082eb, 0x001082eb, + 0x001082eb, 0x001082eb, 0x001082eb, 0x001082eb, + 0x001082eb, 0x4803c856, 0x40000000, 0x40000000, + 0x1c01f000, 0x40000000, 0x40000000, 0x1c01f000, + 0x5930001e, 0x4803c857, 0x59300416, 0x4933c857, + 0x4803c857, 0x8c000502, 0x05000005, 0x4803c857, + 0x84000540, 0x48026416, 0x1c01f000, 0x42000000, + 0xd0000000, 0x41300800, 0x05c1f998, 0x0501f80e, + 0x0502000c, 0x59300c16, 0x59300403, 0xb0000580, + 0x05000003, 0x84040d40, 0x0501f004, 0x59a8002e, + 0x9000040a, 0x48026205, 0x84040d42, 0x48066416, + 0x1c01f000, 0x4933c857, 0x4d340000, 0x5932680a, + 0x59340a00, 0x8c04050e, 0x05bc0aa5, 0x5930001e, + 0x80000540, 0x0502002f, 0x59300403, 0x4803c857, + 0xb0000580, 0x05000003, 0x8d0c050e, 0x05020027, + 0x4d1c0000, 0x41323800, 0x05f1ffa7, 0x05000021, + 0x4932381e, 0x591c0416, 0x84000542, 0x48023c16, + 0x4936600a, 0x05ddfe6b, 0x4926601d, 0x0501f963, + 0x591c0407, 0x90000583, 0x05000006, 0x591c0202, + 0x4802641b, 0x591c0402, 0x4802621b, 0x0501f005, + 0x591c0202, 0x4802621b, 0x591c0402, 0x4802641b, + 0x491e602a, 0x64066407, 0x64d66403, 0x64066203, + 0x42000800, 0x80000040, 0x0005fb2e, 0x411e6000, + 0x5c023800, 0x80000580, 0x5c026800, 0x1c01f000, + 0x411e6000, 0x5c023800, 0x59a80030, 0x48026205, + 0x90000541, 0x05fdf7f9, 0x4933c857, 0x4d2c0000, + 0x4932381e, 0x4a026202, 0x0000ffff, 0x591e5809, + 0x591c0008, 0x8c00051e, 0x05000005, 0x8400051e, + 0x48023808, 0x497a580a, 0x0501f016, 0x592c0409, + 0x8c000518, 0x05000013, 0x84000518, 0x48025c09, + 0x4d400000, 0x592e8207, 0x64065a07, 0x0501fbf0, + 0x49425a07, 0x5c028000, 0x497a580a, 0x592c0409, + 0x8c000512, 0x05000007, 0x4d2c0000, 0x84000512, + 0x48025c09, 0x592e580a, 0x05bdfdf7, 0x5c025800, + 0x59a80030, 0x48026205, 0x591c0216, 0x48026218, + 0x90000d81, 0x05000006, 0x640a3a03, 0x90000585, + 0x05000007, 0x497a6017, 0x0501f01c, 0x591c0008, + 0x84000540, 0x48023808, 0x64123a03, 0x591c0416, + 0x4803c857, 0x8400051c, 0x84000554, 0x48023c16, + 0x592c0010, 0x40001000, 0x591c0818, 0x80040480, + 0x05fe17f1, 0x591c0018, 0x82000500, 0xfffffffc, + 0x48026017, 0x48023818, 0x591c0a16, 0x4807c857, + 0x90040d85, 0x05020005, 0x480bc857, 0x4803c857, + 0x4a023814, 0xffffffff, 0x591c0402, 0x4802641b, + 0x591c0202, 0x4802621b, 0x591e680a, 0x4936600a, + 0x64066407, 0x64e66403, 0x64066203, 0x42000800, + 0x80000040, 0x0005fb2e, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x59300416, 0x8c000514, 0x05000015, + 0x8c00051c, 0x05020012, 0x59300018, 0x80100480, + 0x05001006, 0x05000005, 0x59300416, 0x84000514, + 0x8400055c, 0x0501f009, 0x48126018, 0x48126014, + 0x40100000, 0x592c1810, 0x800c0480, 0x48026013, + 0x59300416, 0x84000514, 0x48026416, 0x1c01f000, + 0x4933c857, 0x8c00051c, 0x05020008, 0x59300014, + 0x4803c857, 0x48026018, 0x59300416, 0x8400055c, + 0x4803c857, 0x48026416, 0x1c01f000, 0x0501f805, + 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, + 0x59300c03, 0x4933c857, 0x4807c857, 0x900404b4, + 0x05001005, 0x900404bc, 0x05021003, 0x80000580, + 0x1c01f000, 0x90000541, 0x05fdf7fe, 0x4d340000, + 0x4d240000, 0x5932481d, 0x5932680a, 0x59300407, + 0x90000c92, 0x05021003, 0x4803c857, 0x0c01f804, + 0x5c024800, 0x5c026800, 0x1c01f000, 0x00108825, + 0x00108827, 0x0010882a, 0x00108866, 0x00109cba, + 0x00109c86, 0x00109cbe, 0x00108826, 0x00108825, + 0x00108826, 0x00108826, 0x00108826, 0x00108826, + 0x00108826, 0x00108826, 0x00108826, 0x00108826, + 0x00108826, 0x05bdf9ca, 0x1c01f000, 0x40000000, + 0x40000000, 0x1c01f000, 0x59300403, 0x82000d80, + 0x00000085, 0x05020007, 0x4a026403, 0x0000008b, + 0x642e6203, 0x42000800, 0x80004040, 0x0005f32e, + 0x82000d80, 0x0000008b, 0x0502002f, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010ee7a, 0x5c027800, + 0x42000000, 0x0010b2d6, 0x050dfa07, 0x05fdfcb4, + 0x0500000e, 0x4d2c0000, 0x59325809, 0x4a025a05, + 0x00000103, 0x59300402, 0x48025c07, 0x641a5a07, + 0x497a580a, 0x0001fb5b, 0x59300a29, 0x90040d83, + 0x05fc0d8b, 0x5c025800, 0x60443000, 0x050df84f, + 0x64066403, 0x497a6009, 0x05c9ff2e, 0x59240400, + 0x8c00050a, 0x0502000b, 0x41782800, 0x60103000, + 0x4d400000, 0x60a68000, 0x0509fad2, 0x5c028000, + 0x64126407, 0x641e6203, 0x6406642c, 0x1c01f000, + 0x602c0800, 0x05ddf95d, 0x64066407, 0x64066203, + 0x05e9f780, 0x1c01f000, 0x59300416, 0x8c00051a, + 0x05020021, 0x5930080a, 0x58040200, 0x8c00050e, + 0x05000006, 0x59300a03, 0x90040590, 0x05000003, + 0x90040583, 0x05020018, 0x05fdf8d3, 0x59300203, + 0x90000d89, 0x0500000b, 0x48026429, 0x4a026403, + 0x00000085, 0x59300416, 0x8400055a, 0x8400055e, + 0x48026416, 0x64266203, 0x640a6407, 0x640e6229, + 0x59a8002f, 0x48026205, 0x42000800, 0x80004040, + 0x0501fdfd, 0x0005fb2e, 0x4203e000, 0xb0800000, + 0x6023f800, 0x1c01f000, 0x41780800, 0x59a8102c, + 0x60c80000, 0x05e9fe71, 0x800811c0, 0x05020002, + 0x60501000, 0x480b502e, 0x59a8102d, 0x480b5022, + 0x41780800, 0x61900000, 0x05e9fe68, 0x800811c0, + 0x05020002, 0x60501000, 0x480b502f, 0x9008140a, + 0x480b5030, 0x60040800, 0x05edf8de, 0x42000000, + 0x30000000, 0x40080800, 0x0001f92d, 0x600c0800, + 0x59a8100f, 0x05edf8c9, 0x05ddf44d, 0x64a3502e, + 0x6453502f, 0x4a035022, 0x000007d0, 0x60781000, + 0x480b5030, 0x60040800, 0x05edf8ce, 0x42000000, + 0x30000000, 0x40080800, 0x0001f92d, 0x600c0800, + 0x59a8100f, 0x05edf0b9, 0x4933c857, 0x4d2c0000, + 0x59300403, 0x900005be, 0x05020004, 0x59325819, + 0x812e59c0, 0x05be0ccf, 0x5c025800, 0x1c01f000, + 0x0501f802, 0x1c01f000, 0x4933c857, 0x813669c0, + 0x0500000c, 0x59340200, 0x8c000508, 0x05000009, + 0x4a026416, 0x00000100, 0x8c00050c, 0x59300008, + 0x05000002, 0x84000544, 0x84000542, 0x48026008, + 0x1c01f000, 0x59300416, 0x8c000510, 0x1c01f000, + 0x4937c857, 0x4d300000, 0x05f1fe27, 0x0500000d, + 0x4926601d, 0x4936600a, 0x05fdffe8, 0x64066407, + 0x492e6009, 0x60240800, 0x05ddf8e0, 0x4d380000, + 0x60ce7000, 0x0005fc78, 0x5c027000, 0x90000541, + 0x5c026000, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x4c580000, 0x4d3c0000, 0x59325809, 0x91380595, + 0x0502001d, 0x59a8b077, 0x90580c99, 0x05001002, + 0x6060b000, 0x8058b104, 0x0501fa54, 0x80000580, + 0x0501fa63, 0x912cac0a, 0x91cca406, 0x050dfa19, + 0x4c600000, 0x6004c000, 0x592c100b, 0x8c080518, + 0x05020006, 0x59240005, 0x592c100e, 0x80080580, + 0x05020006, 0x4178c000, 0x5930100a, 0x58081403, + 0x417a7800, 0x05c9fbf5, 0x5c00c000, 0x05f5f80c, + 0x0501f005, 0x6008b000, 0x0501fa59, 0x05f5fcad, + 0x0005fc5a, 0x5c027800, 0x5c00b000, 0x5c025800, + 0x1c01f000, 0x4933c856, 0x60018800, 0x4a02601d, + 0x0010b391, 0x4936600a, 0x05fdffac, 0x64066407, + 0x492e6009, 0x4d380000, 0x61367000, 0x0005fc78, + 0x5c027000, 0x90000541, 0x60058800, 0x1c01f000, + 0x4803c856, 0x4d2c0000, 0x91380595, 0x05020025, + 0x59a80877, 0x59325809, 0x5930040c, 0x80040580, + 0x05020020, 0x4c500000, 0x4c540000, 0x4c580000, + 0x91cca406, 0x4050a800, 0x5930b40c, 0x9058b403, + 0x8058b104, 0x050dfa1a, 0x91cca406, 0x592cb206, + 0x9058b403, 0x8058b104, 0x912cac07, 0x050df9d9, + 0x592e5801, 0x812e59c0, 0x05fe07f9, 0x5931d82d, + 0x58ef400a, 0x58ee580c, 0x4a025a05, 0x00000103, + 0x58ec0008, 0x0801f800, 0x59300402, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, + 0x05f5fc70, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x90040db5, 0x05000005, 0x5930141b, 0x0501f844, + 0x05000025, 0x0501f006, 0x4d300000, 0x5932602a, + 0x0501f848, 0x5c026000, 0x0500001e, 0x591c0c07, + 0x90040583, 0x05000003, 0x90040586, 0x0502001b, + 0x591c0c02, 0x5930041b, 0x80040580, 0x05000009, + 0x5930021b, 0x80040580, 0x05020014, 0x591c0a02, + 0x5930041b, 0x80040580, 0x05020010, 0x0501f009, + 0x59300a1b, 0x82040580, 0x0000ffff, 0x05000005, + 0x591c0202, 0x59300a1b, 0x80040580, 0x05020007, + 0x591c000a, 0x5930080a, 0x80040580, 0x1c01f000, + 0x417a3800, 0x90000541, 0x1c01f000, 0x4803c856, + 0x4203e000, 0xb0800000, 0x600009fe, 0x4203f800, + 0x30000000, 0x40000000, 0x80040840, 0x05bc0870, + 0x05ffb7fb, 0x1c01f000, 0x4803c856, 0x4203e000, + 0xb0800000, 0x4203f800, 0x20000000, 0x1c01f000, + 0x0501f805, 0x60058800, 0x05020002, 0x60018800, + 0x1c01f000, 0x59300808, 0x8c04051e, 0x592c0c09, + 0x05020002, 0x8c040518, 0x1c01f000, 0x05fdfb51, + 0x05000007, 0x800800ca, 0x800808c8, 0x80040c00, + 0x82063c00, 0x00110514, 0x491fc857, 0x1c01f000, + 0x0501fcf5, 0x05020007, 0x59301402, 0x05fdfff4, + 0x05000007, 0x411c0000, 0x81300580, 0x05000003, + 0x81780500, 0x0501f002, 0x81300540, 0x1c01f000, + 0x4d300000, 0x83440480, 0x000007f0, 0x05001003, + 0x05ddfc24, 0x0501f002, 0x0001fae7, 0x0502000c, + 0x42026000, 0x001104b4, 0x4936600a, 0x492e6009, + 0x05ddfc14, 0x4926601d, 0x0201f800, 0x0010ee7a, + 0x80000580, 0x5c026000, 0x1c01f000, 0x90000541, + 0x05fdf7fd, 0x4933c857, 0x05fdfb35, 0x05bc0830, + 0x4d2c0000, 0x4d340000, 0x4d440000, 0x4c580000, + 0x59325809, 0x5932680a, 0x49425a07, 0x0005f8e2, + 0x592e8c07, 0x592c4208, 0x9020050f, 0x0c01f806, + 0x5c00b000, 0x5c028800, 0x5c026800, 0x5c025800, + 0x1c01f000, 0x001089e3, 0x00108a01, 0x00108a07, + 0x00108a0a, 0x00108a12, 0x001089e1, 0x001089e1, + 0x001089e1, 0x00108a15, 0x00108a1f, 0x00108a1f, + 0x001089e1, 0x001089e1, 0x001089e1, 0x001089e1, + 0x001089e1, 0x4803c857, 0x05bdf80d, 0x814281c0, + 0x05020011, 0x41785800, 0x592c0405, 0x8c00051c, + 0x05020002, 0x59345c05, 0x442c2800, 0x59340008, + 0x48002802, 0x59340009, 0x48002801, 0x59340006, + 0x48002804, 0x59340007, 0x48002803, 0x602cb000, + 0x0501f02d, 0x592c0208, 0x8c00051e, 0x6008b000, + 0x05020029, 0x9004b540, 0x05000027, 0x44042800, + 0x5932680a, 0x59340400, 0x48002801, 0x6008b000, + 0x0501f021, 0x814281c0, 0x05fe07f3, 0x59345c05, + 0x442c2800, 0x6004b000, 0x0501f01b, 0x9140b540, + 0x05000019, 0x0501f021, 0x814281c0, 0x0502001f, + 0x59340200, 0x44002800, 0x59340001, 0x48002801, + 0x6008b000, 0x0501f010, 0x9140b540, 0x05020017, + 0x0501f00d, 0x9140b540, 0x0500000b, 0x05ddfb9e, + 0x05000012, 0x8c20050e, 0x05000002, 0x497a600a, + 0x4178b000, 0x497a5a07, 0x0501f003, 0x9140b540, + 0x0502000a, 0x592c0405, 0x8400051c, 0x48025c05, + 0x592c0208, 0x8400051e, 0x48025a08, 0x0501f91f, + 0x497a6009, 0x0001f35b, 0x592c0208, 0x8c00051e, + 0x6008b000, 0x05fe07f4, 0x9004b540, 0x05fc07f2, + 0x44042800, 0x6004b000, 0x05fdf7ef, 0x4937c857, + 0x4d300000, 0x05f1fcc8, 0x0500000d, 0x4926601d, + 0x4936600a, 0x05fdfe89, 0x64066407, 0x492e6009, + 0x602c0800, 0x05d9ff81, 0x4d380000, 0x610e7000, + 0x0005fc78, 0x5c027000, 0x90000541, 0x5c026000, + 0x1c01f000, 0x4937c857, 0x4d2c0000, 0x4d200000, + 0x59340013, 0x80024130, 0x59325809, 0x91380595, + 0x05020022, 0x59a80077, 0x90000584, 0x0502001f, + 0x59240005, 0x592c100a, 0x80080580, 0x05020011, + 0x4d440000, 0x592e8c07, 0x592c0208, 0x4803c856, + 0x82000500, 0x00000080, 0x84000548, 0x4d3c0000, + 0x60027820, 0x8c00050e, 0x05000002, 0x853e7d5c, + 0x05ddfacd, 0x5c027800, 0x5c028800, 0x0501f003, + 0x4803c856, 0x05ddfb50, 0x05fdfa8d, 0x05000011, + 0x4d400000, 0x60028000, 0x41780800, 0x05fdff52, + 0x5c028000, 0x0501f00a, 0x05ddfb47, 0x05fe07f7, + 0x05fdfa83, 0x05000007, 0x4c580000, 0x6008b000, + 0x0501f8ef, 0x5c00b000, 0x05f5fb42, 0x0005fc5a, + 0x5c024000, 0x5c025800, 0x1c01f000, 0x4937c857, + 0x4d300000, 0x05f1fc80, 0x0500000f, 0x4926601d, + 0x4936600a, 0x05fdfe41, 0x64066407, 0x4d3c0000, + 0x4d380000, 0x417a7800, 0x05d9ff2d, 0x492e6009, + 0x60127000, 0x0005fc78, 0x5c027000, 0x5c027800, + 0x90000541, 0x5c026000, 0x1c01f000, 0x4937c857, + 0x4d300000, 0x05f1fc6c, 0x0500000d, 0x4926601d, + 0x4936600a, 0x05fdfe2d, 0x600c0800, 0x05d9ff27, + 0x64066407, 0x492e6009, 0x4d380000, 0x61467000, + 0x0005fc78, 0x5c027000, 0x90000541, 0x5c026000, + 0x1c01f000, 0x4933c857, 0x4c580000, 0x4d240000, + 0x4d200000, 0x4d400000, 0x4d440000, 0x4d3c0000, + 0x5932481d, 0x59240a00, 0x8c040500, 0x05000084, + 0x05c9fcd4, 0x59325809, 0x91383595, 0x05020053, + 0x60100800, 0x05d9ff0d, 0x60040800, 0x05d9fff7, + 0x812e59c0, 0x05020040, 0x59a8007b, 0x80000040, + 0x4803507b, 0x050df8d2, 0x05000004, 0x59240200, + 0x8400051a, 0x48024a00, 0x417a8000, 0x59cc0000, + 0x82000500, 0x00ffffff, 0x59240805, 0x4803c857, + 0x4807c857, 0x800409c0, 0x05000016, 0x80041580, + 0x05000014, 0x4c000000, 0x60aa8000, 0x59240400, + 0x8c00050a, 0x05020004, 0x60083000, 0x61fe89ff, + 0x0509f865, 0x417a7800, 0x05c9fcfa, 0x05c9fd6c, + 0x600a8000, 0x59cc0c08, 0x8c04051e, 0x05020004, + 0x59240a00, 0x84040d56, 0x48064a00, 0x5c000000, + 0x48024805, 0x40000800, 0x812000f0, 0x80040540, + 0x48026813, 0x40040000, 0xb1200c80, 0x05021004, + 0x49238830, 0x84000570, 0x48038832, 0x59240200, + 0x82000540, 0x00000206, 0x48024a00, 0x59240400, + 0x8c00050c, 0x05000004, 0x65466429, 0x0501f847, + 0x0501f03f, 0x60040000, 0x05ddfe15, 0x0005fc5a, + 0x0501f03b, 0x592c0009, 0x82000500, 0x00ffffff, + 0x05020008, 0x0005f8e2, 0x59cc0000, 0x82000500, + 0x00ffffff, 0x44002800, 0x6004b000, 0x0501f847, + 0x05f1fe13, 0x0501f02e, 0x812e59c0, 0x05020029, + 0x59340412, 0x800001c0, 0x05000023, 0x80000040, + 0x48026c12, 0x59cc0c07, 0x82043500, 0x000000ff, + 0x481bc857, 0x90180583, 0x05020013, 0x59cc0207, + 0x4803c857, 0x82000d00, 0x0000ff00, 0x4807c857, + 0x82040580, 0x00000d00, 0x0502000b, 0x59240a00, + 0x84040d48, 0x48064a00, 0x602c0800, 0x05d9fea3, + 0x64066407, 0x64066203, 0x64066403, 0x05e9fcc5, + 0x0501f00f, 0x600c0800, 0x05d9fe9c, 0x4a026202, + 0x0000ffff, 0x64066203, 0x65466403, 0x05e9fcbd, + 0x0501f007, 0x600c2800, 0x0501fc5b, 0x0501f004, + 0x6008b000, 0x0501f836, 0x05f5fa8a, 0x5c027800, + 0x5c028800, 0x5c028000, 0x5c024000, 0x5c024800, + 0x5c00b000, 0x1c01f000, 0x4933c857, 0x61f2880f, + 0x42003000, 0x00fffffc, 0x05d9feb1, 0x05ba0eb4, + 0x4936600a, 0x05fdfd85, 0x417a7800, 0x05d9fe74, + 0x600c0800, 0x05d9fe7d, 0x497a6c12, 0x64066203, + 0x640a6403, 0x05e9f49f, 0x492fc857, 0x4c580000, + 0x4c000000, 0x8058b1c0, 0x0500000a, 0x82580500, + 0xfffffff0, 0x05ba0ea2, 0x8058b0d0, 0x592c0409, + 0x82000500, 0xfffff0ff, 0x80580540, 0x48025c09, + 0x5c000000, 0x5c00b000, 0x1c01f000, 0x492fc857, + 0x4c000000, 0x4c040000, 0x800000d8, 0x592c0c09, + 0x82040d00, 0xffff0fff, 0x80040540, 0x48025c09, + 0x5c000800, 0x5c000000, 0x1c01f000, 0x4933c857, + 0x4d2c0000, 0x59325809, 0x592c0208, 0x8400055e, + 0x48025a08, 0x4c500000, 0x4c540000, 0x4c580000, + 0x05fdffda, 0x0005f8e2, 0x64602800, 0x80142800, + 0x8058b040, 0x91cca407, 0x4014a800, 0x0509ff9d, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, + 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, + 0x60018800, 0x1c01f000, 0x59325809, 0x592c0205, + 0x82000580, 0x00000152, 0x1c01f000, 0x5930002b, + 0x80000540, 0x05be0f19, 0x1c01f000, 0x59300008, + 0x82000500, 0x04000800, 0x82000580, 0x04000800, + 0x05020003, 0x59300221, 0x48025c10, 0x1c01f000, + 0x592c0408, 0x82000500, 0x0000f000, 0x82000580, + 0x00003000, 0x05020003, 0x4a026416, 0x00000100, + 0x1c01f000, 0x4d2c0000, 0x59325809, 0x59300203, + 0x4933c857, 0x492fc857, 0x493bc857, 0x4803c857, + 0x90003491, 0x05ba1e4e, 0x0c01f803, 0x5c025800, + 0x1c01f000, 0x00108bb6, 0x00108bbc, 0x00108bf4, + 0x00108bb6, 0x00108bb6, 0x00108bb6, 0x00108bb6, + 0x00108bb6, 0x00108bb7, 0x00108bb6, 0x00108bb6, + 0x00108bb6, 0x00108bb6, 0x00108bb6, 0x00108c9b, + 0x00108bb6, 0x00108bb6, 0x05b9fe39, 0xb1383498, + 0x05ba1e37, 0x493a6403, 0x64066203, 0x05e9f429, + 0x91380593, 0x05020010, 0x492fc857, 0x05fdfd12, + 0x05000003, 0x643a6203, 0x0501f005, 0x592c000d, + 0x800001c0, 0x05000005, 0x640a6203, 0x59a8002e, + 0x48026006, 0x1c01f000, 0x64025a07, 0x0001fb5b, + 0x0005f45a, 0x913805a7, 0x0500001e, 0x91380594, + 0x05000018, 0x05fdfd00, 0x0500000c, 0xb13805a1, + 0x05000004, 0xb13805a0, 0x05fe07f3, 0x4937c857, + 0x05edf91f, 0x05f20357, 0x59300203, 0x9000058e, + 0x050000bf, 0x05b9fe12, 0x91380595, 0x05000003, + 0x91380596, 0x05ba0e0e, 0x05edf915, 0x05f2034d, + 0x59300203, 0x90000582, 0x05ba0e09, 0x0501f00d, + 0x4937c857, 0x05e9fcab, 0x6446580f, 0x0501f004, + 0x4937c857, 0x05e9fca7, 0x6442580f, 0x64c65a07, + 0x6412580e, 0x0001fb5b, 0x05ddfbc6, 0x05f1f2d4, + 0x59341400, 0x82081d00, 0x000000ff, 0x59300c03, + 0x480bc857, 0x4807c857, 0xb0040593, 0x05000020, + 0x90040582, 0x0500000f, 0x90040581, 0x05000010, + 0x90040583, 0x05000013, 0x90040585, 0x05000014, + 0x900405b3, 0x05000012, 0x90040580, 0x05000013, + 0x90040584, 0x05ba0de6, 0x0501f875, 0x0501f010, + 0x900c0583, 0x05000837, 0x0501f00d, 0x900c058b, + 0x0502000b, 0x601c0800, 0x05d9fdac, 0x0501f008, + 0x900c0585, 0x0500084a, 0x0501f005, 0x900c0589, + 0x05000865, 0x0501f002, 0x0501f86a, 0x654a6403, + 0x59a81077, 0x592c040c, 0x8c000500, 0x05000002, + 0x60201000, 0x592c040c, 0x8c000516, 0x05000002, + 0x90081418, 0x592c000d, 0x497a580e, 0x497a580f, + 0x80080c80, 0x05000007, 0x05001004, 0x641e5a07, + 0x40001000, 0x0501f004, 0x64565a07, 0x0501f002, + 0x64025a07, 0x480a580d, 0x05f1fc72, 0x0500000d, + 0x592c1001, 0x480a600d, 0x58080800, 0x90080402, + 0x592c1012, 0x592c1813, 0x60003000, 0x42002000, + 0x00101073, 0x05f1fdc0, 0x05000002, 0x1c01f000, + 0x64b25a07, 0x497a580d, 0x0001fb5b, 0x0005f45a, + 0x91380595, 0x05020008, 0x59a8008d, 0x8c000502, + 0x05020007, 0x41780800, 0x05d9fe60, 0x60100800, + 0x05d9f572, 0x601c0800, 0x05d9f570, 0x05ddfee3, + 0x60401000, 0x05020008, 0x59340002, 0x82000500, + 0x00ff0000, 0x82000580, 0x00ff0000, 0x05fc07f2, + 0x60201000, 0x05ddfba3, 0x05fc07ef, 0x592c040c, + 0x84000540, 0x48025c0c, 0x05fdf7ef, 0x91380595, + 0x0502000b, 0x59a8008d, 0x8c000502, 0x0502000a, + 0x05d9febb, 0x4d3c0000, 0x417a7800, 0x05d9fd4c, + 0x5c027800, 0x60180800, 0x05d9f554, 0x60100800, + 0x05d9f552, 0x05ddfec5, 0x60401000, 0x05020008, + 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, + 0x00ff0000, 0x05fc07ef, 0x60201000, 0x05ddfb85, + 0x05fc07ec, 0x592c040c, 0x84000540, 0x48025c0c, + 0x05fdf7ef, 0x60100800, 0x05d9f540, 0x91380595, + 0x05020003, 0x0505fe3f, 0x05dc0812, 0x1c01f000, + 0x91380595, 0x05020015, 0x4c580000, 0x91cc1408, + 0x6008b000, 0x91341c06, 0x05f5fd97, 0x0502000e, + 0x91cc140a, 0x6008b000, 0x91341c08, 0x05f5fd92, + 0x05020009, 0x59342200, 0x59cc1007, 0x800811c0, + 0x05000003, 0x480a6801, 0x84102542, 0x8410251a, + 0x48126a00, 0x5c00b000, 0x1c01f000, 0x4803c856, + 0xb13805a1, 0x0500000b, 0xb13805a0, 0x05000009, + 0xb13805a2, 0x05020011, 0x64c65a07, 0x6412580e, + 0x644a580f, 0x0001fb5b, 0x05ddfb12, 0x0005f45a, + 0x592c000d, 0x800001c0, 0x05000005, 0x59a8002e, + 0x48026006, 0x640a6203, 0x1c01f000, 0x64025a07, + 0x0001fb5b, 0x0005fc5a, 0x1c01f000, 0x42000000, + 0x0010b2ee, 0x0509fd90, 0x05e9fc89, 0x59300203, + 0x4933c857, 0x4803c857, 0x90000c91, 0x05ba1d34, + 0x0c01f802, 0x05e9f46e, 0x00108cd0, 0x00108cd9, + 0x00108cd1, 0x00108ccf, 0x00108ccf, 0x00108ccf, + 0x00108ccf, 0x00108ccf, 0x00108ccf, 0x00108ccf, + 0x00108ccf, 0x00108ccf, 0x00108ccf, 0x00108ccf, + 0x00108cd1, 0x00108ccf, 0x00108ccf, 0x05b9fd20, + 0x1c01f000, 0x59300403, 0xb0000592, 0x05f8061d, + 0x05ddfae4, 0x59325809, 0x641a5a07, 0x0001fb5b, + 0x05f1f1ef, 0x59301804, 0x840c0520, 0x48026004, + 0x598c000b, 0x81300580, 0x0502000f, 0x8c0c0520, + 0x0502000f, 0x42001000, 0x0010b20e, 0x50081000, + 0x58080002, 0x82000580, 0x00000100, 0x0500000d, + 0x5808000b, 0x81300580, 0x05ba0d05, 0x4978100b, + 0x0501f003, 0x8c0c0520, 0x05fe07e3, 0x0201f800, + 0x0010f0f2, 0x80c40040, 0x05fc07df, 0x05b9fcfc, + 0x05e9ff5a, 0x05fc07fa, 0x59300203, 0x90000c91, + 0x05ba1cf7, 0x0c01f7c5, 0x4933c857, 0x4c500000, + 0x4c540000, 0x4c580000, 0x592c0c08, 0x48065814, + 0x59cc0809, 0x48065808, 0x59cc0808, 0x4806580c, + 0x59a8088c, 0x82040500, 0x000003ff, 0x800010c4, + 0x8c040514, 0x05000004, 0x59cc0002, 0x90000503, + 0x80081480, 0x480a621c, 0x412c0800, 0x05bdf85a, + 0x05b80cdf, 0x492c080a, 0x58040409, 0x84000552, + 0x84000540, 0x48000c09, 0x90081403, 0x80081104, + 0x91cca406, 0x912cac05, 0x60400800, 0x90080490, + 0x05021003, 0x40080800, 0x80000580, 0x4004b000, + 0x4c000000, 0x0509fe2a, 0x5c000000, 0x800001c0, + 0x0500000a, 0x412c1000, 0x4c000000, 0x05bdf842, + 0x05b80cc7, 0x492c1001, 0x912cac05, 0x5c000000, + 0x40001000, 0x05fdf7ee, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x4c380000, 0x59325809, 0x5930021c, 0x48025a09, + 0x59301013, 0x640a6203, 0x592c020b, 0x8c000500, + 0x05000004, 0x59300017, 0x592c1010, 0x80081480, + 0x40080000, 0x0501f963, 0x80001540, 0x05020007, + 0x64025a07, 0x592c000c, 0x82000500, 0x00000c00, + 0x05000009, 0x0501f009, 0x8c08053e, 0x05000005, + 0x641e5a07, 0x80081080, 0x80081000, 0x0501f002, + 0x64565a07, 0x480a5808, 0x42000000, 0x0010cf39, + 0x50007000, 0x5838000a, 0x80000540, 0x05020007, + 0x4930700b, 0x4930700a, 0x58380002, 0x90000580, + 0x05020808, 0x0501f004, 0x90001400, 0x45301000, + 0x4930700a, 0x5c007000, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x592c000a, 0x40001000, 0x48007009, + 0x90080405, 0x48007003, 0x592c000e, 0x592c100f, + 0x48007006, 0x48087007, 0x592c0014, 0x592c1209, + 0x80080c80, 0x05001002, 0x40001000, 0x90081403, + 0x80081104, 0x90080490, 0x05021003, 0x80000580, + 0x0501f002, 0x60401000, 0x4800700c, 0x48087004, + 0x800810c4, 0x48087005, 0x40381000, 0x0001f01c, + 0x4d2c0000, 0x05b9ffe8, 0x05b80c6d, 0x42000800, + 0x0010cf39, 0x452c0800, 0x497a580a, 0x497a580b, + 0x497a580c, 0x4a025808, 0x00108d90, 0x4a025802, + 0x00000100, 0x64025801, 0x5c025800, 0x1c01f000, + 0x4833c857, 0x4d300000, 0x4d2c0000, 0x4c5c0000, + 0x4030b800, 0x585c0009, 0x80025d40, 0x05020004, + 0x585c000b, 0x4c000000, 0x0501f03b, 0x585c0002, + 0x82000580, 0x00000100, 0x0502001c, 0x592c0801, + 0x4c040000, 0x05b9ffeb, 0x5c000800, 0x800409c0, + 0x05000017, 0x4804b809, 0x585c100c, 0x800811c0, + 0x05020004, 0x40065800, 0x05b9ffeb, 0x0501f010, + 0x90080490, 0x05021003, 0x80000580, 0x0501f002, + 0x60401000, 0x4800b80c, 0x4808b804, 0x800810c4, + 0x4808b805, 0x90040405, 0x4800b803, 0x405c1000, + 0x0001f81c, 0x0501f022, 0x0501f825, 0x585c000b, + 0x80026540, 0x59300000, 0x80000d40, 0x05020002, + 0x4800b80a, 0x4800b80b, 0x497a6000, 0x4c000000, + 0x4978b809, 0x59325809, 0x4a025a05, 0x00000103, + 0x59300402, 0x48025c07, 0x592c100c, 0x4c080000, + 0x0001fb5b, 0x0501f8ce, 0x05fdf809, 0x5c001000, + 0x8c080518, 0x05000003, 0x05fdf928, 0x0501f002, + 0x0005fc5a, 0x405c7000, 0x5c000000, 0x80026540, + 0x05000003, 0x59325809, 0x05fdff8a, 0x5c00b800, + 0x5c025800, 0x5c026000, 0x1c01f000, 0x483bc857, + 0x58380009, 0x40025800, 0x05b9ffb3, 0x5838000b, + 0x80026540, 0x59300009, 0x80025d40, 0x640a5a07, + 0x1c01f000, 0x4803c857, 0x4933c857, 0x4d1c0000, + 0x497a601e, 0x41323800, 0x40026000, 0x4d3c0000, + 0x60167800, 0x0501f838, 0x5c027800, 0x411e6000, + 0x4933c857, 0x59300416, 0x84000502, 0x48026416, + 0x5c023800, 0x1c01f000, 0x481bc857, 0x4933c857, + 0x4c5c0000, 0x4c600000, 0x4010b800, 0x4014c000, + 0x0509fa9e, 0x05c9f97f, 0x59240400, 0x8c00050a, + 0x05020006, 0x40602800, 0x405c3000, 0x0505fd2e, + 0x90000541, 0x0501f002, 0x80000580, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x42026000, 0x00110514, 0x59a8000d, 0x81640580, + 0x05000013, 0x59300c07, 0x90040581, 0x05000009, + 0x90040584, 0x05000004, 0x90040590, 0x05f80c59, + 0x0501f007, 0x59300203, 0x90000d87, 0x05000004, + 0x4807c857, 0x05fdf9db, 0x05020807, 0x91326430, + 0x41580000, 0x81300480, 0x05fc17ec, 0x5c026000, + 0x1c01f000, 0x4933c857, 0x59300403, 0x4803c857, + 0x05e9fb13, 0x4df00000, 0x59300407, 0x4803c857, + 0x90000d82, 0x05000013, 0x90000d81, 0x05000007, + 0x90000d84, 0x05000005, 0x4933c856, 0x5c03e000, + 0x05e80af3, 0x0501f03e, 0x59300203, 0x90000d81, + 0x05000014, 0x90000d82, 0x0500002b, 0x90000d85, + 0x05000029, 0x90000d8e, 0x05000027, 0x05b9fbac, + 0x59300203, 0x90000d89, 0x0500000a, 0x90000d8b, + 0x05000008, 0x90000d8a, 0x0500001f, 0x90000d8c, + 0x0500001d, 0x90000d8e, 0x0500001b, 0x05b9fba0, + 0x598c000b, 0x81300580, 0x05020003, 0x05e9fdfb, + 0x05020015, 0x59300004, 0x4803c857, 0x8c000520, + 0x05000004, 0x84000520, 0x48026004, 0x0501f00e, + 0x0201f800, 0x0010f0f2, 0x80c40040, 0x05ba0b90, + 0x5c03e000, 0x05e80aca, 0x59300407, 0x90000d82, + 0x05000013, 0x05ddf953, 0x05f9ff98, 0x05f00f51, + 0x0501f00f, 0x5c03e000, 0x05e80ac1, 0x59300407, + 0x90000d82, 0x0500000a, 0x5930081d, 0x58040200, + 0x8c000500, 0x0500010f, 0x05ddf946, 0x05f9ff8b, + 0x05f00f44, 0x8d3c0500, 0x05000003, 0x0509fafc, + 0x05f1f04f, 0x64066229, 0x4a026403, 0x00000085, + 0x64266203, 0x640a6407, 0x42000800, 0x80000040, + 0x0005f32e, 0x60007040, 0x4203e000, 0xb0800000, + 0x6033f800, 0x40000000, 0x40000000, 0x40000000, + 0x0501b004, 0x80387040, 0x05b80b65, 0x05fdf7f9, + 0x1c01f000, 0x4203e000, 0xb0800000, 0x6023f800, + 0x1c01f000, 0x83300480, 0x00110484, 0x05001006, + 0x41540000, 0x81300480, 0x05021003, 0x80000580, + 0x1c01f000, 0x81780080, 0x1c01f000, 0x59300027, + 0x80000540, 0x05000006, 0x4d2c0000, 0x40025800, + 0x05b9feec, 0x497a6027, 0x5c025800, 0x1c01f000, + 0x592c720b, 0x8c380500, 0x05020008, 0x59307008, + 0x8c380516, 0x05000005, 0x59307009, 0x58387010, + 0x59300014, 0x80380480, 0x1c01f000, 0x59a80877, + 0x59cc2808, 0x82140500, 0x00000c00, 0x05000003, + 0x90040490, 0x05001015, 0x80001580, 0x8c140512, + 0x05000004, 0x90040494, 0x05001010, 0x59cc100a, + 0x80000580, 0x8c140510, 0x05000004, 0x90040498, + 0x0500100a, 0x59cc000b, 0x80080400, 0x05001007, + 0x05000005, 0x90000418, 0x80040480, 0x05001003, + 0x80000580, 0x1c01f000, 0x42000000, 0x0010b2cb, + 0x0509fb79, 0x90000541, 0x05fdf7fb, 0x4933c857, + 0x4937c857, 0x4923c857, 0x4927c857, 0x492fc857, + 0x48efc857, 0x4d1c0000, 0x4d300000, 0x41323800, + 0x05f1f825, 0x0500001d, 0x48ee602d, 0x4926601d, + 0x4936600a, 0x05fdf9e5, 0x591c0407, 0x90000583, + 0x05000008, 0x591c0202, 0x4803c857, 0x4802641b, + 0x591c0402, 0x4802621b, 0x4803c857, 0x0501f007, + 0x591c0202, 0x4803c857, 0x4802621b, 0x591c0402, + 0x4802641b, 0x4803c857, 0x491e602a, 0x64066407, + 0x492e6009, 0x4d380000, 0x615e7000, 0x0005fc78, + 0x5c027000, 0x90000541, 0x5c026000, 0x5c023800, + 0x1c01f000, 0x4933c857, 0x493bc857, 0x4937c857, + 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, + 0x59325809, 0x05f9fdf2, 0x05000017, 0x91cca406, + 0x912cac07, 0x91380596, 0x05020007, 0x59a80077, + 0x90000588, 0x0502000e, 0x492fc857, 0x6008b000, + 0x0501f008, 0x91380595, 0x05020009, 0x492fc857, + 0x59a80077, 0x90000598, 0x05020005, 0x6018b000, + 0x0509fbfc, 0x05f1f9fe, 0x0501f003, 0x05f1fea1, + 0x0005fc5a, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x05e9fa20, + 0x4df00000, 0x59300203, 0x90000c91, 0x05ba1acc, + 0x0c01f001, 0x00108f37, 0x00108f36, 0x00108f3c, + 0x00108f54, 0x00108f3b, 0x00108f36, 0x00108f36, + 0x00108f36, 0x00108f36, 0x00108f36, 0x00108f36, + 0x00108f36, 0x00108f36, 0x00108f36, 0x00108f36, + 0x00108f36, 0x00108f3c, 0x05b9fab9, 0x5c03e000, + 0x05e809f3, 0x80000580, 0x1c01f000, 0x05bdfc9c, + 0x5c03e000, 0x05e809ee, 0x8d3c0502, 0x05020011, + 0x4d2c0000, 0x59325809, 0x64165a07, 0x0001fb5b, + 0x5c025800, 0x497a6009, 0x8d3c0500, 0x0502000b, + 0x642a6229, 0x4a026403, 0x00000085, 0x64266203, + 0x640a6407, 0x42000800, 0x80004040, 0x0005fb2e, + 0x81780080, 0x1c01f000, 0x05edff75, 0x05fdf7fd, + 0x05f9fb02, 0x05020003, 0x05e9fcc3, 0x05020007, + 0x0201f800, 0x0010ef65, 0x80c40040, 0x05fc07e1, + 0x05e9f8fd, 0x05ba0a92, 0x59300203, 0x90000d83, + 0x05b80a8f, 0x90000c91, 0x05ba1a8d, 0x0c01f7c2, + 0x4933c857, 0x4d340000, 0x4d240000, 0x4d200000, + 0x916c0583, 0x05020015, 0x599c0018, 0x8c000516, + 0x05000003, 0x05d1ff2a, 0x0501f010, 0x60100800, + 0x05d9fa4e, 0x59300429, 0x900005a1, 0x05000005, + 0x59240400, 0x8c00050c, 0x05000004, 0x64866429, + 0x05fdfbbe, 0x90000541, 0x5c024000, 0x5c024800, + 0x5c026800, 0x1c01f000, 0x80000580, 0x05fdf7fb, + 0x4d340000, 0x5932680a, 0x05d9fe65, 0x5c026800, + 0x0005f45a, 0x4803c856, 0x4c5c0000, 0x4d200000, + 0x4014b800, 0x05c5fff7, 0x59a8007b, 0x80000040, + 0x4803507b, 0x916c0582, 0x05020004, 0x59240200, + 0x8400051a, 0x48024a00, 0x59240200, 0x82000500, + 0xfffffeef, 0x84000546, 0x48024a00, 0x497a4805, + 0x4d400000, 0x60068000, 0x405c2800, 0x60040000, + 0x05ddf96b, 0x60aa8000, 0x4d3c0000, 0x600a7800, + 0x05c9f82c, 0x5c027800, 0x5c028000, 0x5c024000, + 0x5c00b800, 0x813261c0, 0x05ee0721, 0x1c01f000, + 0x59303009, 0x58181a05, 0x820c1d00, 0x000000ff, + 0xb00c0588, 0x05000003, 0xb00c05aa, 0x05020045, + 0x58180409, 0x8c000500, 0x05000042, 0x42000000, + 0x0010cf39, 0x50006000, 0x41781800, 0x5830200b, + 0x41300000, 0x80100580, 0x05000006, 0x40101800, + 0x580c2000, 0x801021c0, 0x05fe07fa, 0x0501f035, + 0x4933c857, 0x59302000, 0x497a6000, 0x800c19c0, + 0x0502001e, 0x4933c856, 0x42007000, 0x00020d9f, + 0x58300009, 0x800001c0, 0x05000018, 0x49786009, + 0x58380001, 0x80300580, 0x05020008, 0x4933c856, + 0x49787002, 0x4810600b, 0x801021c0, 0x0502001d, + 0x4978600a, 0x0501f01b, 0x4933c856, 0x4810600b, + 0x801021c0, 0x05020002, 0x4978600a, 0x4c180000, + 0x4c300000, 0x05b9fec6, 0x5c006000, 0x05fdfdb1, + 0x5c003000, 0x0501f00f, 0x4933c856, 0x800c19c0, + 0x05020008, 0x801021c0, 0x05000003, 0x4810600b, + 0x0501f008, 0x4978600b, 0x4978600a, 0x0501f005, + 0x48101800, 0x801021c0, 0x05020002, 0x480c600a, + 0x58180409, 0x84000500, 0x48003409, 0x49783209, + 0x1c01f000, 0x4933c857, 0x4927c857, 0x59a8021b, + 0x90000543, 0x4803521b, 0x4c5c0000, 0x4d400000, + 0x59ccb800, 0x825cbd00, 0x00ffffff, 0x60028000, + 0x05c5ff80, 0x05f5f9e0, 0x485f500f, 0x0500001d, + 0x4d3c0000, 0x60aa8000, 0x59240400, 0x8c00050a, + 0x05020006, 0x59240200, 0x84000556, 0x48024a00, + 0x60083000, 0x0505fb1f, 0x600a7800, 0x05c5ffbd, + 0x42000000, 0x0010b2d6, 0x0509fa33, 0x59cc0408, + 0x8c00051e, 0x05020009, 0x42000800, 0x0010b391, + 0x58040406, 0x8c000500, 0x05020004, 0x59a8021b, + 0x84000552, 0x4803521b, 0x600a8000, 0x5c027800, + 0x41780800, 0x05d9fa89, 0x59240200, 0x4803c857, + 0x4927c857, 0xb0000566, 0x48024a00, 0x485e4805, + 0x812000f0, 0x805c0540, 0x48026813, 0x49238830, + 0x84000570, 0x48038832, 0x59a8121b, 0x59cc0408, + 0x8c00051a, 0x05020005, 0x84081514, 0x4a0370e5, + 0x00000800, 0x0501f004, 0x84081554, 0x4a0370e5, + 0x00000c00, 0x480b521b, 0x05fdf850, 0x59a8021b, + 0x8400054a, 0x4803521b, 0x49238830, 0x845c0570, + 0x48038832, 0x60100800, 0x05d9f97c, 0x59a80a1b, + 0x84040d50, 0x59cc0013, 0x8c00053e, 0x05000003, + 0x8c000536, 0x05000004, 0x59cc0017, 0x8c000536, + 0x05020002, 0x84040d10, 0x4807521b, 0x4807541b, + 0x42001800, 0x0010cf46, 0x59240400, 0x8c00050c, + 0x05000004, 0x64866429, 0x05fdfae0, 0x0501f007, + 0x405c0800, 0x41781000, 0x60040000, 0x60028000, + 0x05ddf8ab, 0x0005fc5a, 0x59a8021b, 0x4803c857, + 0x8c000506, 0x05020006, 0x41781800, 0x0509fb28, + 0x05000002, 0x60401800, 0x05c5fead, 0x805c0110, + 0x48035018, 0x48038881, 0x59a80016, 0x80000040, + 0x4803c857, 0x48035016, 0x05020015, 0x59a8021b, + 0x8400050a, 0x4803521b, 0x4803541b, 0x4a038802, + 0x0000ffff, 0x42001800, 0x0010aee0, 0x05b9fca0, + 0x42001800, 0x0010aeed, 0x05b9fc9d, 0x4a035017, + 0x0000ffff, 0x05e9fc57, 0x4a01a8e4, 0x00000080, + 0x4a038802, 0x0000ffff, 0x850e1d02, 0x5c028000, + 0x5c00b800, 0x1c01f000, 0x4933c857, 0x59368c03, + 0x4c180000, 0x59300203, 0x90003491, 0x05ba1964, + 0x0c01f803, 0x5c003000, 0x1c01f000, 0x001090a0, + 0x00109502, 0x0010967f, 0x001090a0, 0x001090a0, + 0x001090a0, 0x001090a0, 0x001090a0, 0x001090c0, + 0x001090a0, 0x001090a0, 0x001090a0, 0x001090a0, + 0x001090a0, 0x00109c1e, 0x001090a0, 0x001090a0, + 0x05b9f94f, 0x4933c857, 0x61fe89ff, 0x813669c0, 0x05000002, 0x59368c03, 0x4c180000, 0x59300203, - 0x90003491, 0x05ba1bc2, 0x0c01f803, 0x5c003000, - 0x1c01f000, 0x00108e42, 0x00109691, 0x00108e42, - 0x00108e42, 0x00108e42, 0x00108e42, 0x00108e42, - 0x00108e42, 0x001095de, 0x00109ac9, 0x00109afe, - 0x00109ac9, 0x00109afe, 0x00108e42, 0x00109991, - 0x00108e42, 0x00108e42, 0x05b9fbad, 0x05b9fbac, - 0xb1383497, 0x05ba1baa, 0x41380000, 0x493bc857, + 0x90003491, 0x05ba1946, 0x0c01f803, 0x5c003000, + 0x1c01f000, 0x001090be, 0x00109928, 0x001090be, + 0x001090be, 0x001090be, 0x001090be, 0x001090be, + 0x001090be, 0x0010986d, 0x00109d67, 0x00109d9c, + 0x00109d67, 0x00109d9c, 0x001090be, 0x00109c2f, + 0x001090be, 0x001090be, 0x05b9f931, 0x05b9f930, + 0xb1383497, 0x05ba192e, 0x41380000, 0x493bc857, 0x4d1c0000, 0x4d400000, 0x0c01f804, 0x5c028000, - 0x5c023800, 0x1c01f000, 0x00108eae, 0x0010903f, - 0x00108eae, 0x00108eae, 0x00108eae, 0x00109045, - 0x00108eae, 0x00108eae, 0x00108eae, 0x00108eae, - 0x00108eae, 0x00108eae, 0x00108eae, 0x00108eae, - 0x00108eae, 0x00108eae, 0x00108eae, 0x00108eae, - 0x00108eae, 0x00108eae, 0x00108eae, 0x00108eae, - 0x00108eae, 0x00108ecd, 0x00108f0b, 0x00108f1d, - 0x00108f7e, 0x00108fc2, 0x00108ff7, 0x0010901a, - 0x00108eae, 0x00108eae, 0x0010904a, 0x00108eae, - 0x00108eae, 0x00109053, 0x00109058, 0x00108eae, - 0x00108eae, 0x00108eae, 0x00108eae, 0x00108eae, - 0x001090e1, 0x00108eae, 0x00108eae, 0x00108fab, - 0x00108eae, 0x00108eae, 0x001090b7, 0x00108eae, - 0x00108eae, 0x00108eae, 0x001090ec, 0x00108eae, - 0x00108eae, 0x00108eae, 0x00109129, 0x00108eae, - 0x00108eae, 0x00108eae, 0x00108eae, 0x00108eae, - 0x00108eae, 0x0010917e, 0x00108eae, 0x00108eae, - 0x00108eae, 0x00108eae, 0x00108eae, 0x00108eaf, - 0x00108eae, 0x00108eae, 0x00108eae, 0x00108eae, - 0x00108eb9, 0x00108eae, 0x00108eae, 0x00108eae, - 0x001091a3, 0x001091a8, 0x001091be, 0x00108eae, - 0x00108eae, 0x00108eae, 0x00108eae, 0x00108eae, - 0x00108ec5, 0x00108eae, 0x00108eae, 0x00108eae, - 0x00108eae, 0x00108eae, 0x00108eae, 0x00108eae, - 0x00108eae, 0x00108eae, 0x05b9fb41, 0x4933c857, - 0x0505fca8, 0x05020315, 0x05c5fea6, 0x05020313, + 0x5c023800, 0x1c01f000, 0x0010912a, 0x001092c0, + 0x0010912a, 0x0010912a, 0x0010912a, 0x001092c6, + 0x0010912a, 0x0010912a, 0x0010912a, 0x0010912a, + 0x0010912a, 0x0010912a, 0x0010912a, 0x0010912a, + 0x0010912a, 0x0010912a, 0x0010912a, 0x0010912a, + 0x0010912a, 0x0010912a, 0x0010912a, 0x0010912a, + 0x0010912a, 0x0010914b, 0x00109189, 0x0010919b, + 0x001091fc, 0x00109240, 0x00109275, 0x00109298, + 0x0010912a, 0x0010912a, 0x001092cb, 0x0010912a, + 0x0010912a, 0x001092d4, 0x001092d9, 0x0010912a, + 0x0010912a, 0x0010912a, 0x0010912a, 0x0010912a, + 0x00109362, 0x0010912a, 0x0010912a, 0x00109229, + 0x0010912a, 0x0010912a, 0x00109338, 0x0010912a, + 0x0010912a, 0x0010912a, 0x0010936d, 0x0010912a, + 0x0010912a, 0x0010912a, 0x001093aa, 0x0010912a, + 0x0010912a, 0x0010912a, 0x0010912a, 0x0010912a, + 0x0010912a, 0x001093ff, 0x0010912a, 0x0010912a, + 0x0010912a, 0x0010912a, 0x0010912a, 0x0010912b, + 0x0010912a, 0x0010912a, 0x0010912a, 0x0010912a, + 0x00109135, 0x0010912a, 0x0010912a, 0x0010912a, + 0x00109428, 0x0010942d, 0x00109445, 0x0010912a, + 0x0010912a, 0x0010912a, 0x0010912a, 0x0010912a, + 0x00109141, 0x0010912a, 0x0010912a, 0x0010912a, + 0x0010912a, 0x0010912a, 0x0010912a, 0x0010912a, + 0x0010912a, 0x0010912a, 0x05b9f8c5, 0x4933c857, + 0x0505fcca, 0x05020322, 0x05c5fc2f, 0x05020320, 0x59cc0407, 0x4802601e, 0x65166403, 0x64066203, - 0x05e5f76a, 0x4933c857, 0x0505fc9e, 0x0502030b, - 0x05c5fe9c, 0x05020309, 0x0501fb3b, 0x05020167, + 0x05e5f6b0, 0x4933c857, 0x0505fcc0, 0x05020318, + 0x05c5fc25, 0x05020316, 0x0501fb48, 0x05020169, 0x59cc0007, 0x4802601e, 0x652a6403, 0x64066203, - 0x05e5f75e, 0x4933c857, 0x0505fc92, 0x050202ff, - 0x05c5fe90, 0x050202fd, 0x655a6403, 0x64066203, - 0x05e5f756, 0x4933c857, 0x05c5fe8a, 0x05020009, - 0x05d9fd11, 0x05020007, 0x5932481d, 0x59240200, - 0x90000503, 0x90000583, 0x05000006, 0x0501f2ef, - 0x64266403, 0x6426641c, 0x6402621c, 0x0501f168, - 0x05d9fde6, 0x05000024, 0x59340200, 0x8c00051a, - 0x05000004, 0x5934000a, 0x84000560, 0x4802680a, - 0x0505f8e0, 0x05020023, 0x60a68000, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010ec6c, 0x5c027800, - 0x42000000, 0x0010b058, 0x0509f8a7, 0x41780800, - 0x05d9fae4, 0x64226403, 0x600c3000, 0x59240400, - 0x8c00050a, 0x0502014e, 0x59cc400b, 0x59cc380c, - 0x59cc180d, 0x59cc080e, 0x9c2041c0, 0x9c1c39c0, - 0x9c0c19c0, 0x9c0409c0, 0x641e6203, 0x41782800, - 0x0501f13c, 0x0505f971, 0x05fe07e2, 0x64266403, - 0x643a641c, 0x4a02621c, 0x00001900, 0x0501f13c, - 0x64266403, 0x640e641c, 0x0501f139, 0x4933c857, - 0x05c5fe4c, 0x050202b9, 0x05d9fcd3, 0x050202b7, - 0x493a6403, 0x0505f852, 0x05020007, 0x641a6403, - 0x59240400, 0x8c00050a, 0x0502012d, 0x641e6203, - 0x0505f6fb, 0x641e6403, 0x6426641c, 0x6402621c, - 0x0501f127, 0x4933c857, 0x05d9fcc3, 0x050202a7, - 0x5934000a, 0x82000500, 0x00010000, 0x82000580, - 0x00010000, 0x05060c33, 0x05c40e32, 0x0502029f, - 0x59cc0001, 0x82000500, 0x00ffff00, 0x82000580, - 0x00fffc00, 0x05020007, 0x59a80006, 0x8c00050e, - 0x05000004, 0x59240400, 0x8c00050a, 0x05020036, - 0x05d9fd8e, 0x05020003, 0x60067800, 0x05d9f9a9, - 0x05d9fd7d, 0x05000004, 0x82000580, 0x00000703, - 0x05020032, 0x59cc0206, 0x90003503, 0x05020034, - 0x90003494, 0x05001032, 0x59a83077, 0x80183480, - 0x0500102f, 0x5934300a, 0x84183516, 0x90000594, - 0x05020002, 0x84183556, 0x481a680a, 0x59cc0406, - 0x90000503, 0x05020026, 0x0505f8c1, 0x0502002b, - 0x05d9fd4b, 0x05020006, 0x4c600000, 0x4178c000, - 0x417a7800, 0x05c5fda0, 0x5c00c000, 0x916c0583, - 0x05020006, 0x60183000, 0x0505fe8d, 0x42000000, - 0x0010b057, 0x0509f838, 0x05d9fae7, 0x642a6403, - 0x60803000, 0x59cc1a0a, 0x41780800, 0x41784000, - 0x41783800, 0x59240400, 0x8c00050a, 0x050200dc, - 0x05fdf796, 0x642e6403, 0x642e641c, 0x4a02621c, - 0x00002c00, 0x0501f0d6, 0x642e6403, 0x6426641c, - 0x4a02621c, 0x00001e00, 0x0501f0d1, 0x42000000, - 0x0010afb2, 0x0509f820, 0x642e6403, 0x641e641c, - 0x6402621c, 0x0501f0ca, 0x642e6403, 0x640e641c, - 0x6402621c, 0x0501f0c6, 0x4933c857, 0x05d9fc62, - 0x05020246, 0x0505fbd7, 0x05020244, 0x05c5fdd5, - 0x05020242, 0x59cc0206, 0x90003503, 0x0502001b, - 0x90003494, 0x05001019, 0x59a83077, 0x80180480, - 0x05001016, 0x59cc0406, 0x90000503, 0x05020013, - 0x59340400, 0x82000580, 0x00000707, 0x05000013, - 0x417a7800, 0x4c600000, 0x4178c000, 0x05c5fd5e, - 0x5c00c000, 0x60283000, 0x0505fe4d, 0x42000000, - 0x0010b054, 0x0505fff8, 0x64326403, 0x41782800, - 0x60843000, 0x05fdf7c4, 0x64366403, 0x641e641c, - 0x6402621c, 0x0501f09e, 0x64366403, 0x6426641c, - 0x4a02621c, 0x00001e00, 0x0501f099, 0x4933c857, - 0x05d9fc35, 0x05020219, 0x0505fbaa, 0x05020217, - 0x05c5fda8, 0x05020215, 0x0501fa47, 0x0502000a, - 0x493a6403, 0x0501fa4d, 0x05020003, 0x64ba6403, - 0x05fdf75c, 0x64366403, 0x641e641c, 0x6402621c, - 0x0501f087, 0x64366403, 0x6426641c, 0x4a02621c, - 0x00001e00, 0x0501f082, 0x4933c857, 0x05d9fc1e, - 0x05fe0714, 0x59240200, 0x90000503, 0x90000583, - 0x050201fe, 0x05d9fcec, 0x05020028, 0x0505f84b, - 0x0502000b, 0x643a6403, 0x59240400, 0x8c00050a, - 0x05020073, 0x61483000, 0x59cc4008, 0x59cc3809, - 0x59cc180a, 0x59cc080b, 0x05fdf724, 0x4933c857, - 0x600c3000, 0x0505fe15, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010ec6c, 0x5c027800, 0x42000000, - 0x0010b056, 0x0505ffb4, 0x59340200, 0x84000558, - 0x48026a00, 0x602c0800, 0x05d9f905, 0x59240400, - 0x8c00050a, 0x05020056, 0x601c3000, 0x0501f04b, - 0x4933c857, 0x643e6403, 0x640e641c, 0x4a02621c, - 0x00001e00, 0x0501f052, 0x59340400, 0x82000580, - 0x00000703, 0x05fc07f7, 0x0501f030, 0x4933c857, - 0x05d9fbe9, 0x050201cd, 0x5932481d, 0x59240200, - 0x90000503, 0x90000583, 0x050201c8, 0x05d9fcad, - 0x05020022, 0x0505f828, 0x05000fc2, 0x05020004, - 0x64426403, 0x61403000, 0x05fdf6ed, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x0010ec6c, 0x5c027800, - 0x600c3000, 0x0505fde1, 0x42000000, 0x0010b056, - 0x0505ff85, 0x59340200, 0x84000558, 0x48026a00, - 0x05fdf7d3, 0x64466403, 0x640e641c, 0x4a02621c, - 0x00001e00, 0x0501f02a, 0x4933c857, 0x05c5fd3d, - 0x05040b3c, 0x050201a9, 0x0501f9db, 0x05020007, - 0x644a6403, 0x0501f022, 0x59340400, 0x82000580, - 0x00000703, 0x05fc07f0, 0x4d3c0000, 0x417a7800, - 0x60a68000, 0x0201f800, 0x0010ec6c, 0x5c027800, - 0x605c3000, 0x0505fdc1, 0x42000000, 0x0010b056, - 0x0505ff65, 0x05c5fef6, 0x59240400, 0x8c00050a, - 0x0502000b, 0x60183000, 0x60a68000, 0x4933c857, - 0x64066403, 0x641e6203, 0x41782800, 0x0501f002, - 0x611a8000, 0x0505f858, 0x0505f5d5, 0x4933c857, - 0x64066403, 0x602c0800, 0x05d9f8a9, 0x64066203, - 0x05e5f5de, 0x4933c857, 0x60240800, 0x05d9f8a4, - 0x64166403, 0x05fdf7fa, 0x0505fb0e, 0x0502017b, - 0x05c5fd0c, 0x05020179, 0x0501f9ab, 0x05fe07d7, - 0x64826403, 0x64066203, 0x05e5f5d0, 0x05c5fd05, - 0x05020172, 0x648e6403, 0x64066203, 0x05e5f5cb, - 0x0505fb00, 0x05c40cff, 0x0502016c, 0x0501f99e, - 0x05fe07ca, 0x59cc0807, 0x82040500, 0x00ffff00, - 0x0502000a, 0x59340212, 0x82000500, 0x0000ff00, - 0x05000006, 0x5932481d, 0x59240005, 0x82000500, - 0x000000ff, 0x0501f003, 0x5932481d, 0x59240005, - 0x82040d00, 0x00ffffff, 0x80040580, 0x05020015, - 0x59cc1408, 0x05f9ff41, 0x0500002c, 0x591c0202, - 0x82001580, 0x0000ffff, 0x05000004, 0x59cc1208, - 0x80080580, 0x05020025, 0x591c000a, 0x81340580, - 0x05020022, 0x591c0416, 0x8c00051a, 0x05020015, - 0x591c0407, 0x90000587, 0x0502001c, 0x0501f029, - 0x59cc1208, 0x82080580, 0x0000ffff, 0x05000012, - 0x05f9ff2a, 0x05000015, 0x59cc1408, 0x591c0202, - 0x80080580, 0x05020025, 0x591c000a, 0x81340580, - 0x05020022, 0x591c0416, 0x8c00051a, 0x05000013, - 0x82000500, 0xffff1fff, 0x48023c16, 0x491e602a, - 0x0501f018, 0x59cc1408, 0x41780000, 0x0501fdb0, - 0x05fe07f2, 0x0501f013, 0x649a6403, 0x4a02621c, - 0x00001700, 0x59cc1208, 0x82081580, 0x0000ffff, - 0x05fe079f, 0x0501f00b, 0x591c0407, 0x90000587, - 0x05fe07f6, 0x591c0403, 0x900005a4, 0x05020005, - 0x4d300000, 0x411e6000, 0x0005fc5a, 0x5c026000, - 0x64966403, 0x05fdf792, 0x59cc1408, 0x41780000, - 0x0501fd97, 0x05fe07e9, 0x05fdf7fa, 0x4933c857, - 0x4d3c0000, 0x60067800, 0x05d9f826, 0x5c027800, - 0x4c580000, 0x6008b000, 0x91a81c02, 0x91cc140b, - 0x05f1ff8c, 0x5c00b000, 0x05000003, 0x64c66403, - 0x05fdf77f, 0x0005fc5a, 0x6008b000, 0x91a81c00, - 0x91cc140d, 0x05f1ff83, 0x0502000c, 0x05e1fedf, - 0x0500000a, 0x59300407, 0x90000581, 0x05020007, - 0x59300403, 0x90000582, 0x05020004, 0x5930000a, - 0x81340580, 0x00040c5a, 0x05ddf957, 0x05020009, - 0x05ddf96b, 0x05020005, 0x64075014, 0x6006d800, - 0x05ddf8cf, 0x0501f003, 0x60040000, 0x05ddf922, - 0x1c01f000, 0x05c5fc77, 0x050200e4, 0x0501f916, - 0x05fe0742, 0x493a6403, 0x0501f970, 0x05020003, - 0x64ae6403, 0x05fdf75a, 0x64b26403, 0x05fdf758, - 0x4933c857, 0x05e5f9ab, 0x050200d8, 0x05c5fc69, - 0x050200d6, 0x05d9fbaa, 0x05fe074d, 0x59cc0408, - 0x4802641b, 0x59cc0208, 0x4802621b, 0x59cc0807, - 0x59340002, 0x82000500, 0x00ffffff, 0x80040580, - 0x05000012, 0x5932481d, 0x59240005, 0x80040580, - 0x0502001e, 0x59cc1408, 0x05f9feb0, 0x05000020, - 0x831c0580, 0xffffffff, 0x05000005, 0x0505f95f, - 0x0500001b, 0x0505fcc8, 0x05000019, 0x491e602a, - 0x64da6403, 0x0501f0b5, 0x59cc1208, 0x82080580, - 0x0000ffff, 0x05000008, 0x05f9fea0, 0x05000010, - 0x591c0202, 0x59cc0c08, 0x80040580, 0x0502000c, - 0x05fdf7ec, 0x59cc1408, 0x60040000, 0x0501fd30, - 0x05000007, 0x05fdf7e7, 0x4803c856, 0x6426641c, - 0x4a02621c, 0x00001500, 0x0501f005, 0x4803c856, - 0x640e641c, 0x4a02621c, 0x00001700, 0x64de6403, - 0x0501f09a, 0x4933c857, 0x05e5f96e, 0x0502009b, - 0x05c5fc2c, 0x05020099, 0x05d9fb6d, 0x05fe0710, - 0x05d9fa9a, 0x05000045, 0x59cc0407, 0x4802641b, - 0x59cc1207, 0x480a621b, 0x82080580, 0x0000ffff, - 0x05000004, 0x05f9fe79, 0x05000036, 0x0501f008, - 0x59cc1407, 0x60040000, 0x0501fd0d, 0x05000031, - 0x831c0580, 0xffffffff, 0x0500002e, 0x59cc0c07, - 0x591c0202, 0x80040580, 0x0502002a, 0x0505fc8a, - 0x05000028, 0x591c0416, 0x8c000516, 0x0502002f, - 0x4d300000, 0x411e6000, 0x05f5fe19, 0x5c026000, - 0x641e3a03, 0x59cc0c09, 0x82040d00, 0x0000ff00, - 0x840409c0, 0x90040581, 0x05000009, 0x90040585, - 0x0500000b, 0x90040587, 0x05020011, 0x42000000, - 0x0010b043, 0x0505fe38, 0x0501f008, 0x42000000, - 0x0010b042, 0x0505fe34, 0x0501f007, 0x42000000, - 0x0010b041, 0x0505fe30, 0x591c0009, 0x80000540, - 0x05000003, 0x59cc2808, 0x0505f10e, 0x4803c856, - 0x6426641c, 0x4a02621c, 0x00002a00, 0x0501f005, - 0x4803c856, 0x640e641c, 0x4a02621c, 0x00000300, - 0x64ee6403, 0x0501f04d, 0x4803c856, 0x642e641c, - 0x6402621c, 0x05fdf7fb, 0x4803c856, 0x641e641c, - 0x6402621c, 0x05fdf7f7, 0x4c080000, 0x05d9fa62, - 0x05000021, 0x05d9fa39, 0x0505fa2e, 0x0502001c, - 0x5932481d, 0x59240200, 0x82000540, 0x000000e0, - 0x48024a00, 0x59a8021b, 0x90000543, 0x4803521b, - 0x59a80018, 0x800000d0, 0x59a8080f, 0x82040d00, - 0x000000ff, 0x80041540, 0x480b500f, 0x600c0800, - 0x05e5fe18, 0x497b501d, 0x8d0c0520, 0x05000004, - 0x4a032804, 0x000007d0, 0x0501f001, 0x0005fc5a, - 0x05c5fc4b, 0x5c001000, 0x1c01f000, 0x0505fa2b, - 0x05fdf7fd, 0x5c001000, 0x0005f45a, 0x0501f825, - 0x05000022, 0x653a6403, 0x64066203, 0x05e5f47b, - 0x653e6403, 0x497a601e, 0x59cc0a06, 0x82040d00, - 0x000000ff, 0x800409c0, 0x05fc0695, 0x90040581, - 0x05020005, 0x59cc0808, 0x59a80005, 0x80040580, - 0x05fc068f, 0x90040582, 0x05020006, 0x91cc140b, - 0x6008b000, 0x91341c06, 0x05f1fe92, 0x05fc0688, - 0x6406601e, 0x05fdf686, 0x65426403, 0x59cc0207, - 0x4802601e, 0x05fdf682, 0x64066203, 0x42000800, - 0x80000040, 0x0005f32e, 0x4803c857, 0x0005f45a, - 0x4d2c0000, 0x4c500000, 0x4c580000, 0x4c540000, - 0x59a80077, 0x82000c80, 0x00000841, 0x05021021, - 0x05b9fb99, 0x0500001f, 0x492e6009, 0x59a80077, - 0x48025802, 0x90000403, 0x80000104, 0x91cca406, - 0x90000c8a, 0x05001010, 0x642a5811, 0x6028b000, - 0x912c0406, 0x4000a800, 0x0505fe82, 0x412c7000, - 0x800409c0, 0x05020003, 0x49787001, 0x0501f00b, - 0x05b9fb85, 0x0500000b, 0x492c7001, 0x40040000, - 0x05fdf7f0, 0x48025811, 0x4000b000, 0x912c0406, - 0x4000a800, 0x0505fe73, 0x90000541, 0x0501f005, - 0x497b5077, 0x59325809, 0x05b9fba3, 0x80000580, - 0x5c00a800, 0x5c00b000, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x4d340000, 0x5932680a, 0x59343400, - 0x4933c857, 0x4937c857, 0x481bc857, 0x05d9faad, - 0x5c026800, 0x1c01f000, 0x4933c857, 0x4c600000, - 0x4d3c0000, 0x4d440000, 0x4d340000, 0x0501f858, - 0x05020046, 0x59cc0207, 0x82000d00, 0x0000ff00, - 0x900411c0, 0x59cc000a, 0x82000500, 0x00ffffff, - 0x80081540, 0x480a601e, 0x8c040518, 0x05000011, - 0x60203000, 0x0505fbcc, 0x42000000, 0x0010b055, - 0x0505fd7d, 0x59240400, 0x8c00050a, 0x05020005, - 0x60082800, 0x60903000, 0x611a8000, 0x0501fe76, - 0x6004c000, 0x417a7800, 0x05c5fad3, 0x0501f02d, - 0x8c04051a, 0x05000029, 0x59cc000a, 0x59cc3800, - 0x821c3d00, 0x00ffffff, 0x05e1fc53, 0x05d80ac9, - 0x05020022, 0x5930001d, 0x4c000000, 0x05d9fabd, - 0x4926601d, 0x5930000a, 0x4c000000, 0x59240c00, - 0x8c04050a, 0x0502000b, 0x59340c03, 0x59341802, - 0x820c1d00, 0x00ffffff, 0x58002403, 0x60102800, - 0x60903000, 0x611a8000, 0x41301000, 0x0501fe64, - 0x4936600a, 0x60243000, 0x0505fba5, 0x42000000, - 0x0010b055, 0x0505fd50, 0x417a7800, 0x4178c000, - 0x05c5faad, 0x5c000000, 0x4802600a, 0x5c000000, - 0x4802601d, 0x0501f003, 0x90000541, 0x0501f002, - 0x80000580, 0x5c026800, 0x5c028800, 0x5c027800, - 0x5c00c000, 0x1c01f000, 0x4933c857, 0x59cc0206, - 0x90000490, 0x05021004, 0x6402621c, 0x90000541, - 0x0501f002, 0x80000580, 0x1c01f000, 0x4933c857, - 0x6402621c, 0x59cc0407, 0x82000500, 0x0000ff00, - 0x82000580, 0x00000800, 0x0502000d, 0x59cc0206, - 0x59a80877, 0x80040480, 0x0500100a, 0x59cc0006, - 0x82000500, 0x00ff0000, 0x82000d80, 0x00140000, - 0x05000003, 0x82000d80, 0x00100000, 0x1c01f000, - 0x42000000, 0x0010b04a, 0x0505fd1f, 0x90000541, - 0x05fdf7fb, 0x59300403, 0xb0003497, 0x05b61f74, - 0x91383593, 0x05020006, 0x4803c857, 0x4c000000, - 0x0505fc45, 0x5c000000, 0x0c01f019, 0x4933c857, - 0x493bc857, 0x913835a7, 0x0500000d, 0x91383594, - 0x0500000b, 0xb13805a1, 0x05000003, 0xb13805a0, - 0x05b60f63, 0x05e9f8a8, 0x05ee02ea, 0x59300203, - 0x9000058e, 0x05f8020c, 0x05b5ff5d, 0x493bc857, - 0x4937c857, 0x0505fc2e, 0x05d9f924, 0x601c0800, - 0x05d5fe53, 0x05e5fc39, 0x05edf279, 0x001092fb, - 0x00109309, 0x001092fb, 0x001092fb, 0x001092fb, - 0x00109309, 0x0010931a, 0x001093df, 0x00109360, - 0x001093df, 0x00109379, 0x001093df, 0x0010937e, - 0x001093df, 0x00109381, 0x001093df, 0x00109381, - 0x001093df, 0x001093df, 0x001092fb, 0x001092fb, - 0x001092fb, 0x001092fb, 0x001092fb, 0x001092fb, - 0x001092fb, 0x001092fb, 0x001092fb, 0x001092fb, - 0x001092fb, 0x00109309, 0x001092fb, 0x001093df, - 0x001092fb, 0x001092fb, 0x001093df, 0x001092fb, - 0x001093c5, 0x001093df, 0x001092fb, 0x001092fb, - 0x001092fb, 0x001092fb, 0x001093df, 0x001093df, - 0x001092fb, 0x001093df, 0x001093df, 0x001092fb, - 0x00109315, 0x001092fb, 0x001092fb, 0x001092fb, - 0x001092fb, 0x00109383, 0x001093df, 0x001092fb, - 0x001092fb, 0x001093ab, 0x001093df, 0x001092fb, - 0x001092fb, 0x001092fb, 0x001092fb, 0x001092fb, - 0x001092fb, 0x001092fb, 0x001092fb, 0x001092fb, - 0x001092fc, 0x001092fb, 0x001092fb, 0x001092fb, - 0x001092fb, 0x001092fc, 0x001092fb, 0x001092fb, - 0x001092fb, 0x001092fc, 0x001092fc, 0x001092fc, - 0x001092fb, 0x001092fb, 0x001092fb, 0x001092fb, - 0x001092fb, 0x001092fc, 0x001092fb, 0x001092fb, - 0x001092fb, 0x001092fb, 0x001092fb, 0x001092fb, - 0x001092fb, 0x001092fb, 0x001092fb, 0x05b5fef4, - 0x05f9fbf4, 0x05000007, 0x59a80030, 0x48026205, - 0x643a6203, 0x59a8002e, 0x48026006, 0x1c01f000, - 0x4d2c0000, 0x59325809, 0x05b9fa8f, 0x5c025800, - 0x0005f45a, 0x59a8002e, 0x48026006, 0x05f9fbe5, - 0x05000007, 0x4a02601c, 0x00109313, 0x59a80030, - 0x48026205, 0x643a6203, 0x1c01f000, 0x640a6203, - 0x1c01f000, 0x4d3c0000, 0x417a7800, 0x05d5fdc9, - 0x5c027800, 0x0501f0c6, 0x05d9f99b, 0x050000c4, - 0x59a8021b, 0x8c000508, 0x0500000e, 0x5932680a, - 0x4c580000, 0x6008b000, 0x91a81c02, 0x91341406, - 0x05f1fd28, 0x80000540, 0x5c00b000, 0x050200b8, - 0x59340200, 0x8400051a, 0x48026a00, 0x0501f02a, - 0x599c0017, 0x8c00050a, 0x050200b1, 0x4d3c0000, - 0x417a7800, 0x05d5fdaf, 0x5c027800, 0x601c0800, - 0x05d5fdb7, 0x59340212, 0x82000500, 0x0000ff00, - 0x05020014, 0x83440d80, 0x000007fe, 0x050200a4, - 0x05c5fbeb, 0x59a8021b, 0x8c000514, 0x050000a0, - 0x83240580, 0x0010b111, 0x05020005, 0x4d300000, - 0x05c5fa80, 0x5c026000, 0x0501f099, 0x59a8221b, - 0x8c100514, 0x05000096, 0x05c5fbba, 0x0501f094, + 0x05e5f6a4, 0x4933c857, 0x0505fcb4, 0x0502030c, + 0x05c5fc19, 0x0502030a, 0x0501fb3c, 0x0502015d, + 0x655a6403, 0x64066203, 0x05e5f69a, 0x4933c857, + 0x05c5fc11, 0x05020009, 0x05d9fb6d, 0x05020007, + 0x5932481d, 0x59240200, 0x90000503, 0x90000583, + 0x05000006, 0x0501f2fa, 0x64266403, 0x6426641c, + 0x6402621c, 0x0501f16b, 0x05d9fc44, 0x05000024, + 0x59340200, 0x8c00051a, 0x05000004, 0x5934000a, + 0x84000560, 0x4802680a, 0x0505f8f9, 0x05020023, + 0x60a68000, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010ee7a, 0x5c027800, 0x42000000, 0x0010b2d8, + 0x0509f8d9, 0x41780800, 0x05d9f93c, 0x64226403, + 0x600c3000, 0x59240400, 0x8c00050a, 0x05020151, + 0x59cc400b, 0x59cc380c, 0x59cc180d, 0x59cc080e, + 0x9c2041c0, 0x9c1c39c0, 0x9c0c19c0, 0x9c0409c0, + 0x641e6203, 0x41782800, 0x0501f13f, 0x0505f98a, + 0x05fe07e2, 0x64266403, 0x643a641c, 0x4a02621c, + 0x00001900, 0x0501f13f, 0x64266403, 0x640e641c, + 0x0501f13c, 0x4933c857, 0x05c5fbd3, 0x050202c4, + 0x05d9fb2f, 0x050202c2, 0x493a6403, 0x0505f86b, + 0x05020007, 0x641a6403, 0x59240400, 0x8c00050a, + 0x05020130, 0x641e6203, 0x0505f72d, 0x641e6403, + 0x6426641c, 0x6402621c, 0x0501f12a, 0x4933c857, + 0x05d9fb1f, 0x050202b2, 0x5934000a, 0x82000500, + 0x00010000, 0x82000580, 0x00010000, 0x05060c53, + 0x05c40bb9, 0x050202aa, 0x59cc0001, 0x82000500, + 0x00ffff00, 0x82000580, 0x00fffc00, 0x05020007, + 0x59a80006, 0x8c00050e, 0x05000004, 0x59240400, + 0x8c00050a, 0x05020036, 0x05d9fbec, 0x05020003, + 0x60067800, 0x05d5fffe, 0x05d9fbdb, 0x05000004, + 0x82000580, 0x00000703, 0x05020032, 0x59cc0206, + 0x90003503, 0x05020034, 0x90003494, 0x05001032, + 0x59a83077, 0x80183480, 0x0500102f, 0x5934300a, + 0x84183516, 0x90000594, 0x05020002, 0x84183556, + 0x481a680a, 0x59cc0406, 0x90000503, 0x05020026, + 0x0505f8da, 0x0502002b, 0x05d9fba9, 0x05020006, + 0x4c600000, 0x4178c000, 0x417a7800, 0x05c5fb27, + 0x5c00c000, 0x916c0583, 0x05020006, 0x60183000, + 0x0505febf, 0x42000000, 0x0010b2d7, 0x0509f86a, + 0x05d9f943, 0x642a6403, 0x60803000, 0x59cc1a0a, + 0x41780800, 0x41784000, 0x41783800, 0x59240400, + 0x8c00050a, 0x050200df, 0x05fdf796, 0x642e6403, + 0x642e641c, 0x4a02621c, 0x00002c00, 0x0501f0d9, + 0x642e6403, 0x6426641c, 0x4a02621c, 0x00001e00, + 0x0501f0d4, 0x42000000, 0x0010b232, 0x0509f852, + 0x642e6403, 0x641e641c, 0x6402621c, 0x0501f0cd, + 0x642e6403, 0x640e641c, 0x6402621c, 0x0501f0c9, + 0x4933c857, 0x05d9fabe, 0x05020251, 0x0505fbf7, + 0x0502024f, 0x05c5fb5c, 0x0502024d, 0x59cc0206, + 0x90003503, 0x0502001b, 0x90003494, 0x05001019, + 0x59a83077, 0x80180480, 0x05001016, 0x59cc0406, + 0x90000503, 0x05020013, 0x59340400, 0x82000580, + 0x00000707, 0x05000013, 0x417a7800, 0x4c600000, + 0x4178c000, 0x05c5fae5, 0x5c00c000, 0x60283000, + 0x0505fe7f, 0x42000000, 0x0010b2d4, 0x0509f82a, + 0x64326403, 0x41782800, 0x60843000, 0x05fdf7c4, + 0x64366403, 0x641e641c, 0x6402621c, 0x0501f0a1, + 0x64366403, 0x6426641c, 0x4a02621c, 0x00001e00, + 0x0501f09c, 0x4933c857, 0x05d9fa91, 0x05020224, + 0x0505fbca, 0x05020222, 0x05c5fb2f, 0x05020220, + 0x0501fa52, 0x0502000a, 0x493a6403, 0x0501fa58, + 0x05020003, 0x64ba6403, 0x05fdf75c, 0x64366403, + 0x641e641c, 0x6402621c, 0x0501f08a, 0x64366403, + 0x6426641c, 0x4a02621c, 0x00001e00, 0x0501f085, + 0x4933c857, 0x05d9fa7a, 0x05fe0714, 0x59240200, + 0x90000503, 0x90000583, 0x05020209, 0x05d9fb4a, + 0x05020028, 0x0505f864, 0x0502000b, 0x643a6403, + 0x59240400, 0x8c00050a, 0x05020076, 0x61483000, + 0x59cc4008, 0x59cc3809, 0x59cc180a, 0x59cc080b, + 0x05fdf724, 0x4933c857, 0x600c3000, 0x0505fe47, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ee7a, + 0x5c027800, 0x42000000, 0x0010b2d6, 0x0505ffe6, + 0x59340200, 0x84000558, 0x48026a00, 0x602c0800, + 0x05d5ff5a, 0x59240400, 0x8c00050a, 0x05020059, + 0x601c3000, 0x0501f04e, 0x4933c857, 0x643e6403, + 0x640e641c, 0x4a02621c, 0x00001e00, 0x0501f055, + 0x59340400, 0x82000580, 0x00000703, 0x05fc07f7, + 0x0501f030, 0x4933c857, 0x05d9fa45, 0x050201d8, + 0x5932481d, 0x59240200, 0x90000503, 0x90000583, + 0x050201d3, 0x05d9fb0b, 0x05020022, 0x0505f841, + 0x05000fdb, 0x05020004, 0x64426403, 0x61403000, + 0x05fdf6ed, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010ee7a, 0x5c027800, 0x600c3000, 0x0505fe13, + 0x42000000, 0x0010b2d6, 0x0505ffb7, 0x59340200, + 0x84000558, 0x48026a00, 0x05fdf7d3, 0x64466403, + 0x640e641c, 0x4a02621c, 0x00001e00, 0x0501f02d, + 0x4933c857, 0x05c5fac4, 0x05040b5c, 0x050201b4, + 0x0501f9e6, 0x05020007, 0x644a6403, 0x0501f025, + 0x59340400, 0x82000580, 0x00000703, 0x05fc07f0, + 0x83340580, 0x0010ce8f, 0x05000009, 0x4d3c0000, + 0x417a7800, 0x60a68000, 0x0201f800, 0x0010ee7a, + 0x5c027800, 0x605c3000, 0x0505fdf0, 0x42000000, + 0x0010b2d6, 0x0505ff94, 0x05c5fcce, 0x59240400, + 0x8c00050a, 0x0502000b, 0x60183000, 0x60a68000, + 0x4933c857, 0x64066403, 0x641e6203, 0x41782800, + 0x0501f002, 0x611a8000, 0x0505f86e, 0x0505f604, + 0x4933c857, 0x64066403, 0x602c0800, 0x05d5fefb, + 0x64066203, 0x05e5f51f, 0x4933c857, 0x60240800, + 0x05d5fef6, 0x64166403, 0x05fdf7fa, 0x0505fb2b, + 0x05020183, 0x05c5fa90, 0x05020181, 0x0501f9b3, + 0x05fe07d4, 0x64826403, 0x64066203, 0x05e5f511, + 0x05c5fa89, 0x0502017a, 0x648e6403, 0x64066203, + 0x05e5f50c, 0x0505fb1d, 0x05c40a83, 0x05020174, + 0x0501f9a6, 0x05fe07c7, 0x59cc0807, 0x82040500, + 0x00ffff00, 0x0502000a, 0x59340212, 0x82000500, + 0x0000ff00, 0x05000006, 0x5932481d, 0x59240005, + 0x82000500, 0x000000ff, 0x0501f003, 0x5932481d, + 0x59240005, 0x82040d00, 0x00ffffff, 0x80040580, + 0x05020015, 0x59cc1408, 0x05f9fea1, 0x0500002c, + 0x591c0202, 0x82001580, 0x0000ffff, 0x05000004, + 0x59cc1208, 0x80080580, 0x05020025, 0x591c000a, + 0x81340580, 0x05020022, 0x591c0416, 0x8c00051a, + 0x05020015, 0x591c0407, 0x90000587, 0x0502001c, + 0x0501f029, 0x59cc1208, 0x82080580, 0x0000ffff, + 0x05000012, 0x05f9fe8a, 0x05000015, 0x59cc1408, + 0x591c0202, 0x80080580, 0x05020025, 0x591c000a, + 0x81340580, 0x05020022, 0x591c0416, 0x8c00051a, + 0x05000013, 0x82000500, 0xffff1fff, 0x48023c16, + 0x491e602a, 0x0501f018, 0x59cc1408, 0x41780000, + 0x0501fdbe, 0x05fe07f2, 0x0501f013, 0x649a6403, + 0x4a02621c, 0x00001700, 0x59cc1208, 0x82081580, + 0x0000ffff, 0x05fe079f, 0x0501f00b, 0x591c0407, + 0x90000587, 0x05fe07f6, 0x591c0403, 0x900005a4, + 0x05020005, 0x4d300000, 0x411e6000, 0x0005fc5a, + 0x5c026000, 0x64966403, 0x05fdf792, 0x59cc1408, + 0x41780000, 0x0501fda5, 0x05fe07e9, 0x05fdf7fa, + 0x4933c857, 0x4d3c0000, 0x60067800, 0x05d5fe78, + 0x5c027800, 0x4c580000, 0x6008b000, 0x91a81c02, + 0x91cc140b, 0x05f1fee0, 0x5c00b000, 0x05000003, + 0x64c66403, 0x05fdf77f, 0x0005fc5a, 0x6008b000, + 0x91a81c00, 0x91cc140d, 0x05f1fed7, 0x0502000c, + 0x05e1fde7, 0x0500000a, 0x59300407, 0x90000581, + 0x05020007, 0x59300403, 0x90000582, 0x05020004, + 0x5930000a, 0x81340580, 0x00040c5a, 0x05d9ffdb, + 0x05020009, 0x05d9ffef, 0x05020005, 0x64075014, + 0x6006d800, 0x05d9ff53, 0x0501f003, 0x60040000, + 0x05d9ffa6, 0x1c01f000, 0x05c5f9fb, 0x050200ec, + 0x0501f91e, 0x05fe073f, 0x493a6403, 0x0501f978, + 0x05020003, 0x64ae6403, 0x05fdf75a, 0x64b26403, + 0x05fdf758, 0x4933c857, 0x05e5f8b9, 0x050200e0, + 0x05c5f9ed, 0x050200de, 0x05d9fa05, 0x05fe0731, + 0x59cc0408, 0x4802641b, 0x59cc0208, 0x4802621b, + 0x59cc0807, 0x59340002, 0x82000500, 0x00ffffff, + 0x80040580, 0x05000012, 0x5932481d, 0x59240005, + 0x80040580, 0x0502001e, 0x59cc1408, 0x05f9fe10, + 0x05000020, 0x831c0580, 0xffffffff, 0x05000005, + 0x0505f97c, 0x0500001b, 0x0505fcf7, 0x05000019, + 0x491e602a, 0x64da6403, 0x0501f0bd, 0x59cc1208, + 0x82080580, 0x0000ffff, 0x05000008, 0x05f9fe00, + 0x05000010, 0x591c0202, 0x59cc0c08, 0x80040580, + 0x0502000c, 0x05fdf7ec, 0x59cc1408, 0x60040000, + 0x0501fd3e, 0x05000007, 0x05fdf7e7, 0x4803c856, + 0x6426641c, 0x4a02621c, 0x00001500, 0x0501f005, + 0x4803c856, 0x640e641c, 0x4a02621c, 0x00001700, + 0x64de6403, 0x0501f0a2, 0x4933c857, 0x05e5f87c, + 0x050200a3, 0x05c5f9b0, 0x050200a1, 0x05d9f9c8, + 0x05fe06f4, 0x05d9f8f3, 0x05000045, 0x59cc0407, + 0x4802641b, 0x59cc1207, 0x480a621b, 0x82080580, + 0x0000ffff, 0x05000004, 0x05f9fdd9, 0x05000036, + 0x0501f008, 0x59cc1407, 0x60040000, 0x0501fd1b, + 0x05000031, 0x831c0580, 0xffffffff, 0x0500002e, + 0x59cc0c07, 0x591c0202, 0x80040580, 0x0502002a, + 0x0505fcb9, 0x05000028, 0x591c0416, 0x8c000516, + 0x0502002f, 0x4d300000, 0x411e6000, 0x05f5fd76, + 0x5c026000, 0x641e3a03, 0x59cc0c09, 0x82040d00, + 0x0000ff00, 0x840409c0, 0x90040581, 0x05000009, + 0x90040585, 0x0500000b, 0x90040587, 0x05020011, + 0x42000000, 0x0010b2c3, 0x0505fe67, 0x0501f008, + 0x42000000, 0x0010b2c2, 0x0505fe63, 0x0501f007, + 0x42000000, 0x0010b2c1, 0x0505fe5f, 0x591c0009, + 0x80000540, 0x05000003, 0x59cc2808, 0x0505f12b, + 0x4803c856, 0x6426641c, 0x4a02621c, 0x00002a00, + 0x0501f005, 0x4803c856, 0x640e641c, 0x4a02621c, + 0x00000300, 0x64ee6403, 0x0501f055, 0x4803c856, + 0x642e641c, 0x6402621c, 0x05fdf7fb, 0x4803c856, + 0x641e641c, 0x6402621c, 0x05fdf7f7, 0x59cc0001, + 0x82000580, 0x00fffffe, 0x0502004d, 0x4c080000, + 0x05d9f8b7, 0x05000021, 0x05d9f88e, 0x0505fa47, + 0x0502001c, 0x5932481d, 0x59240200, 0x82000540, + 0x000000e0, 0x48024a00, 0x59a8021b, 0x90000543, + 0x4803521b, 0x59a80018, 0x800000d0, 0x59a8080f, + 0x82040d00, 0x000000ff, 0x80041540, 0x480b500f, + 0x600c0800, 0x05e5fd55, 0x497b501d, 0x8d0c0520, + 0x05000004, 0x4a032804, 0x000007d0, 0x0501f001, + 0x0005fc5a, 0x05c5f9fa, 0x5c001000, 0x1c01f000, + 0x0505fa44, 0x05fdf7fd, 0x5c001000, 0x0005f45a, + 0x0501f829, 0x05000026, 0x653a6403, 0x64066203, + 0x05e5f3b8, 0x05d9f95b, 0x05fe0676, 0x653e6403, + 0x497a601e, 0x59cc0a06, 0x82040d00, 0x000000ff, + 0x800409c0, 0x05fc068f, 0x90040581, 0x05020005, + 0x59cc0808, 0x59a80005, 0x80040580, 0x05fc0689, + 0x90040582, 0x05020006, 0x91cc140b, 0x6008b000, + 0x91341c06, 0x05f1fde0, 0x05fc0682, 0x6406601e, + 0x05fdf680, 0x05d9f943, 0x05fe065e, 0x65426403, + 0x59cc0207, 0x4802601e, 0x05fdf67a, 0x64066203, + 0x42000800, 0x80000040, 0x0005f32e, 0x4803c857, + 0x0005f45a, 0x4d2c0000, 0x4c500000, 0x4c580000, + 0x4c540000, 0x59a80077, 0x82000c80, 0x00000841, + 0x05021021, 0x05b9f910, 0x0500001f, 0x492e6009, + 0x59a80077, 0x48025802, 0x90000403, 0x80000104, + 0x91cca406, 0x90000c8a, 0x05001010, 0x642a5811, + 0x6028b000, 0x912c0406, 0x4000a800, 0x0505fea9, + 0x412c7000, 0x800409c0, 0x05020003, 0x49787001, + 0x0501f00b, 0x05b9f8fc, 0x0500000b, 0x492c7001, + 0x40040000, 0x05fdf7f0, 0x48025811, 0x4000b000, + 0x912c0406, 0x4000a800, 0x0505fe9a, 0x90000541, + 0x0501f005, 0x497b5077, 0x59325809, 0x05b9f91a, + 0x80000580, 0x5c00a800, 0x5c00b000, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x4d340000, 0x5932680a, + 0x59343400, 0x4933c857, 0x4937c857, 0x481bc857, + 0x05d9f900, 0x5c026800, 0x1c01f000, 0x4933c857, + 0x4c600000, 0x4d3c0000, 0x4d440000, 0x4d340000, + 0x0501f858, 0x05020046, 0x59cc0207, 0x82000d00, + 0x0000ff00, 0x900411c0, 0x59cc000a, 0x82000500, + 0x00ffffff, 0x80081540, 0x480a601e, 0x8c040518, + 0x05000011, 0x60203000, 0x0505fbf3, 0x42000000, + 0x0010b2d5, 0x0505fda4, 0x59240400, 0x8c00050a, + 0x05020005, 0x60082800, 0x60903000, 0x611a8000, + 0x0501fe84, 0x6004c000, 0x417a7800, 0x05c5f84f, + 0x0501f02d, 0x8c04051a, 0x05000029, 0x59cc000a, + 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x05e1fb53, + 0x05d8091c, 0x05020022, 0x5930001d, 0x4c000000, + 0x05d9f910, 0x4926601d, 0x5930000a, 0x4c000000, + 0x59240c00, 0x8c04050a, 0x0502000b, 0x59340c03, + 0x59341802, 0x820c1d00, 0x00ffffff, 0x58002403, + 0x60102800, 0x60903000, 0x611a8000, 0x41301000, + 0x0501fe72, 0x4936600a, 0x60243000, 0x0505fbcc, + 0x42000000, 0x0010b2d5, 0x0505fd77, 0x417a7800, + 0x4178c000, 0x05c5f829, 0x5c000000, 0x4802600a, + 0x5c000000, 0x4802601d, 0x0501f003, 0x90000541, + 0x0501f002, 0x80000580, 0x5c026800, 0x5c028800, + 0x5c027800, 0x5c00c000, 0x1c01f000, 0x4933c857, + 0x59cc0206, 0x90000490, 0x05021004, 0x6402621c, + 0x90000541, 0x0501f002, 0x80000580, 0x1c01f000, + 0x4933c857, 0x6402621c, 0x59cc0407, 0x82000500, + 0x0000ff00, 0x82000580, 0x00000800, 0x0502000d, + 0x59cc0206, 0x59a80877, 0x80040480, 0x0500100a, + 0x59cc0006, 0x82000500, 0x00ff0000, 0x82000d80, + 0x00140000, 0x05000003, 0x82000d80, 0x00100000, + 0x1c01f000, 0x42000000, 0x0010b2ca, 0x0505fd46, + 0x90000541, 0x05fdf7fb, 0x59300403, 0xb0003497, + 0x05b61ceb, 0x91383593, 0x05020006, 0x4803c857, + 0x4c000000, 0x0505fc6c, 0x5c000000, 0x0c01f019, + 0x4933c857, 0x493bc857, 0x913835a7, 0x0500000d, + 0x91383594, 0x0500000b, 0xb13805a1, 0x05000003, + 0xb13805a0, 0x05b60cda, 0x05e5ffe1, 0x05ee0219, + 0x59300203, 0x9000058e, 0x05f80164, 0x05b5fcd4, + 0x493bc857, 0x4937c857, 0x0505fc55, 0x05d5ff75, + 0x601c0800, 0x05d5fc9d, 0x05e5fb72, 0x05edf1a4, + 0x00109584, 0x00109592, 0x00109584, 0x00109584, + 0x00109584, 0x00109592, 0x001095a3, 0x0010966b, + 0x001095ec, 0x0010966b, 0x00109605, 0x0010966b, + 0x0010960a, 0x0010966b, 0x0010960d, 0x0010966b, + 0x0010960d, 0x0010966b, 0x0010966b, 0x00109584, + 0x00109584, 0x00109584, 0x00109584, 0x00109584, + 0x00109584, 0x00109584, 0x00109584, 0x00109584, + 0x00109584, 0x00109584, 0x00109592, 0x00109584, + 0x0010966b, 0x00109584, 0x00109584, 0x0010966b, + 0x00109584, 0x00109651, 0x0010966b, 0x00109584, + 0x00109584, 0x00109584, 0x00109584, 0x0010966b, + 0x0010966b, 0x00109584, 0x0010966b, 0x0010966b, + 0x00109584, 0x0010959e, 0x00109584, 0x00109584, + 0x00109584, 0x00109584, 0x0010960f, 0x0010966b, + 0x00109584, 0x00109584, 0x00109637, 0x0010966b, + 0x00109584, 0x00109584, 0x00109584, 0x00109584, + 0x00109584, 0x00109584, 0x00109584, 0x00109584, + 0x00109584, 0x00109585, 0x00109584, 0x00109584, + 0x00109584, 0x00109584, 0x00109585, 0x00109584, + 0x00109584, 0x00109584, 0x00109585, 0x00109585, + 0x00109585, 0x00109584, 0x00109584, 0x00109584, + 0x00109584, 0x00109584, 0x00109585, 0x00109584, + 0x00109584, 0x00109584, 0x00109584, 0x00109584, + 0x00109584, 0x00109584, 0x00109584, 0x00109584, + 0x05b5fc6b, 0x05f9fb4c, 0x05000007, 0x59a80030, + 0x48026205, 0x643a6203, 0x59a8002e, 0x48026006, + 0x1c01f000, 0x4d2c0000, 0x59325809, 0x05b9f806, + 0x5c025800, 0x0005f45a, 0x59a8002e, 0x48026006, + 0x05f9fb3d, 0x05000007, 0x4a02601c, 0x0010959c, + 0x59a80030, 0x48026205, 0x643a6203, 0x1c01f000, + 0x640a6203, 0x1c01f000, 0x4d3c0000, 0x417a7800, + 0x05d5fc13, 0x5c027800, 0x0501f0c9, 0x05d5ffee, + 0x050000c7, 0x59a8021b, 0x8c000508, 0x0500000e, + 0x5932680a, 0x4c580000, 0x6008b000, 0x91a81c02, + 0x91341406, 0x05f1fc74, 0x80000540, 0x5c00b000, + 0x050200bb, 0x59340200, 0x8400051a, 0x48026a00, + 0x0501f02d, 0x599c0017, 0x8c00050a, 0x05020007, + 0x4d3c0000, 0x417a7800, 0x05d5fbf9, 0x5c027800, + 0x601c0800, 0x05d5fc01, 0x59340212, 0x82000500, + 0x0000ff00, 0x05020014, 0x83440d80, 0x000007fe, + 0x050200a7, 0x05c5f9bb, 0x59a8021b, 0x8c000514, + 0x050000a3, 0x83240580, 0x0010b391, 0x05020005, + 0x4d300000, 0x05c5f829, 0x5c026000, 0x0501f09c, + 0x59a8221b, 0x8c100514, 0x05000099, 0x05c5f991, + 0x0501f097, 0x599c0017, 0x8c00050a, 0x05020094, 0x599c0019, 0x8c00050e, 0x05020091, 0x416c0000, 0x90000582, 0x05020004, 0x59a80016, 0x80000000, - 0x48035016, 0x600c0800, 0x05d5fd95, 0x64066407, - 0x64066203, 0x640a6403, 0x05e5fac8, 0x4ce80000, - 0x6005d000, 0x05e1ffe4, 0x5c01d000, 0x1c01f000, - 0x59340200, 0x8400051a, 0x48026a00, 0x05d9f949, - 0x0500007b, 0x60100800, 0x05d5fd85, 0x0505faa3, - 0x05020077, 0x05f9fb87, 0x05000009, 0x59a80030, + 0x48035016, 0x600c0800, 0x05d5fbdc, 0x64066407, + 0x64066203, 0x640a6403, 0x05e5f9fe, 0x4ce80000, + 0x6005d000, 0x05e1ff1a, 0x5c01d000, 0x1c01f000, + 0x59340200, 0x8400051a, 0x48026a00, 0x05d5ff99, + 0x0500007b, 0x60100800, 0x05d5fbcc, 0x0505fac7, + 0x05020077, 0x05f9fadc, 0x05000009, 0x59a80030, 0x48026205, 0x643a6203, 0x59a8002e, 0x48026006, - 0x4a02601c, 0x00109373, 0x1c01f000, 0x60140800, - 0x05d5fd77, 0x64066407, 0x64066203, 0x640e6403, - 0x05e5f2aa, 0x05d9f93c, 0x05020065, 0x60180800, - 0x0501f86c, 0x0501f062, 0x60100800, 0x05d5fd6c, - 0x05fdf79c, 0x05d9f839, 0x0501f05d, 0x4d300000, - 0x05f9fb6c, 0x0500000c, 0x5930082a, 0x40066000, + 0x4a02601c, 0x001095ff, 0x1c01f000, 0x60140800, + 0x05d5fbbe, 0x64066407, 0x64066203, 0x640e6403, + 0x05e5f1e0, 0x05d5ff8c, 0x05020065, 0x60180800, + 0x0501f86c, 0x0501f062, 0x60100800, 0x05d5fbb3, + 0x05fdf799, 0x05d5fe87, 0x0501f05d, 0x4d300000, + 0x05f9fac1, 0x0500000c, 0x5930082a, 0x40066000, 0x59300416, 0x8c00051e, 0x05020003, 0x5c026000, - 0x0501f055, 0x5c026000, 0x4a02601c, 0x00109393, + 0x0501f055, 0x5c026000, 0x4a02601c, 0x0010961f, 0x0501f051, 0x5c026000, 0x0005f45a, 0x4c340000, - 0x41306800, 0x05edf9b0, 0x05000012, 0x64066203, + 0x41306800, 0x05edf8dc, 0x05000012, 0x64066203, 0x647a6403, 0x58340c1b, 0x4806641b, 0x58340a1b, 0x4806621b, 0x5834002a, 0x4802602a, 0x5834080a, - 0x4806600a, 0x5834081d, 0x4806601d, 0x05f9fb3e, + 0x4806600a, 0x5834081d, 0x4806601d, 0x05f9fa93, 0x64126407, 0x42000800, 0x80000040, 0x0005fb2e, 0x40366000, 0x5c006800, 0x0005f45a, 0x5930082a, 0x4807c857, 0x800409c0, 0x05000031, 0x5804001e, @@ -22231,549 +22448,554 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x84081516, 0x48080c16, 0x58065809, 0x812e59c0, 0x05000023, 0x492fc857, 0x4d300000, 0x40066000, 0x641e6203, 0x417a7800, 0x0005fadc, 0x5c026000, - 0x0501f01b, 0x05f9fb2b, 0x0004045a, 0x5930002a, + 0x0501f01b, 0x05f9fa80, 0x0004045a, 0x5930002a, 0x80000540, 0x05000018, 0x4c340000, 0x40006800, 0x58340407, 0x5c006800, 0x90000583, 0x0006045a, - 0x4a02601c, 0x001093d3, 0x0501f00f, 0x4d300000, - 0x4d1c0000, 0x5932382a, 0x05edf96f, 0x05000004, - 0x4a026416, 0x00000100, 0x05f9f9c3, 0x5c023800, - 0x5c026000, 0x0005f45a, 0x05d5fd0d, 0x05f9fb11, + 0x4a02601c, 0x0010965f, 0x0501f00f, 0x4d300000, + 0x4d1c0000, 0x5932382a, 0x05edf89b, 0x05000004, + 0x4a026416, 0x00000100, 0x05f9f918, 0x5c023800, + 0x5c026000, 0x0005f45a, 0x05d5fb54, 0x05f9fa66, 0x0004045a, 0x497a601c, 0x59a80030, 0x48026205, 0x643a6203, 0x59a8002e, 0x48026006, 0x1c01f000, - 0x4933c857, 0x4807c857, 0x05d5fd01, 0x4d3c0000, - 0x417a7800, 0x05d5fcf3, 0x5c027800, 0x5934000a, - 0x84000520, 0x4802680a, 0x05d5f7c8, 0x59340400, - 0x4803c857, 0x80000110, 0x9000348c, 0x05b61df8, + 0x4933c857, 0x4807c857, 0x05d5fb48, 0x4d3c0000, + 0x417a7800, 0x05d5fb3a, 0x5c027800, 0x5934000a, + 0x84000520, 0x4802680a, 0x05d5f616, 0x59340400, + 0x4803c857, 0x80000110, 0x9000348c, 0x05b61b6c, 0x91383595, 0x05020002, 0x0c01f004, 0x91383596, - 0x05b60df3, 0x0c01f00d, 0x0010746c, 0x0010746c, - 0x0010746c, 0x0010746c, 0x0010746c, 0x0010746c, - 0x00109438, 0x00109416, 0x0010746c, 0x0010746c, - 0x0010746c, 0x0010746c, 0x0010746c, 0x0010746c, - 0x0010746c, 0x0010746c, 0x0010746c, 0x0010746c, - 0x00109438, 0x00109449, 0x0010746c, 0x0010746c, - 0x0010746c, 0x0010746c, 0x4933c857, 0x5932481d, + 0x05b60b67, 0x0c01f00d, 0x00107634, 0x00107634, + 0x00107634, 0x00107634, 0x00107634, 0x00107634, + 0x001096c4, 0x001096a2, 0x00107634, 0x00107634, + 0x00107634, 0x00107634, 0x00107634, 0x00107634, + 0x00107634, 0x00107634, 0x00107634, 0x00107634, + 0x001096c4, 0x001096d5, 0x00107634, 0x00107634, + 0x00107634, 0x00107634, 0x4933c857, 0x5932481d, 0x59240400, 0x8c000508, 0x05000014, 0x813669c0, 0x05000012, 0x59340212, 0x82000500, 0x0000ff00, 0x0500000e, 0x599c0019, 0x8c00050e, 0x0502000b, - 0x4d3c0000, 0x417a7800, 0x05d5fcba, 0x5c027800, - 0x600c0800, 0x05d5fcc2, 0x64066407, 0x64066203, - 0x640a6403, 0x05e5f1f5, 0x59cc0001, 0x59340802, + 0x4d3c0000, 0x417a7800, 0x05d5fb01, 0x5c027800, + 0x600c0800, 0x05d5fb09, 0x64066407, 0x64066203, + 0x640a6403, 0x05e5f12b, 0x59cc0001, 0x59340802, 0x80040580, 0x82000500, 0x00ffffff, 0x0006045a, - 0x59345002, 0x05d5fa8a, 0x482a6802, 0x0005f45a, + 0x59345002, 0x05d5f8d1, 0x482a6802, 0x0005f45a, 0x4933c857, 0x59303403, 0x9018359e, 0x0502000d, 0x91383595, 0x0006045a, 0x4c340000, 0x5930682a, 0x803469c0, 0x05000005, 0x58343416, 0x82183500, 0xffff1fff, 0x48186c16, 0x5c006800, 0x0005f45a, - 0x1c01f000, 0x4933c857, 0x05f1fb07, 0x0006045a, - 0x64066203, 0x64066403, 0x05e5f1d4, 0x493bc857, - 0xb1380591, 0x05020007, 0x05e5fee3, 0x05ee0125, - 0x59300203, 0x90000582, 0x05000062, 0x05b5fd98, + 0x1c01f000, 0x4933c857, 0x05f1fa45, 0x0006045a, + 0x64066203, 0x64066403, 0x05e5f10a, 0x493bc857, + 0xb1380591, 0x05020007, 0x05e5fe19, 0x05ee0051, + 0x59300203, 0x90000582, 0x05000062, 0x05b5fb0c, 0x913805a7, 0x05000015, 0xb1380588, 0x0500000d, 0x91380594, 0x05000011, 0xb13805a1, 0x05000003, - 0xb13805a0, 0x05b60d8e, 0x05e5fed3, 0x05ee0115, - 0x59300203, 0x9000058e, 0x0500053a, 0x05b5fd88, - 0x05e5fecd, 0x05ee010f, 0x59300203, 0x90000584, - 0x0004054c, 0x05b5fd82, 0x4933c857, 0x59300403, - 0xb0000c84, 0x05b61d7e, 0xb0000480, 0x05b41d7c, - 0x40027000, 0x4803c857, 0x0c01f001, 0x0010947b, - 0x0010947c, 0x0010947c, 0x00109492, 0x05b5fd74, - 0x05e5fa56, 0x59325809, 0x812e59c0, 0x05000012, + 0xb13805a0, 0x05b60b02, 0x05e5fe09, 0x05ee0041, + 0x59300203, 0x9000058e, 0x0500054c, 0x05b5fafc, + 0x05e5fe03, 0x05ee003b, 0x59300203, 0x90000584, + 0x0004054c, 0x05b5faf6, 0x4933c857, 0x59300403, + 0xb0000c84, 0x05b61af2, 0xb0000480, 0x05b41af0, + 0x40027000, 0x4803c857, 0x0c01f001, 0x00109707, + 0x00109708, 0x00109708, 0x0010971e, 0x05b5fae8, + 0x05e5f98c, 0x59325809, 0x812e59c0, 0x05000012, 0x832c0500, 0x00ff0000, 0x0500000f, 0x640a6203, 0x5932680a, 0x59340200, 0x8c00050e, 0x0502000a, - 0x60128000, 0x0501fbf8, 0x497a6009, 0x59300006, + 0x60128000, 0x0501fc03, 0x497a6009, 0x59300006, 0x80000540, 0x05020003, 0x59a8002f, 0x48026006, - 0x641e6203, 0x1c01f000, 0x05e5fa40, 0x05f5fe7f, - 0x05ec007f, 0x59325809, 0x05b9f8f6, 0x05edf07c, - 0x05b5fd57, 0x05f9fa57, 0x05000005, 0x59a80030, + 0x641e6203, 0x1c01f000, 0x05e5f976, 0x05f5fdd4, + 0x05e807a7, 0x59325809, 0x05b5fe6a, 0x05e9f7a4, + 0x05b5facb, 0x05f9f9ac, 0x05000005, 0x59a80030, 0x48026205, 0x643a6203, 0x0501f009, 0x59325809, 0x592c040b, 0x8c000502, 0x05000004, 0x641e6203, 0x610e7000, 0x0005f478, 0x64126203, 0x1c01f000, - 0x0501feb5, 0x0004054a, 0x1c01f000, 0x05f9fa45, - 0x05000007, 0x4a02601c, 0x001094b3, 0x59a80030, + 0x0501fec7, 0x0004054a, 0x1c01f000, 0x05f9f99a, + 0x05000007, 0x4a02601c, 0x0010973f, 0x59a80030, 0x48026205, 0x643a6203, 0x1c01f000, 0x64066203, 0x65066403, 0x42027800, 0x80002042, 0x0005f32e, 0xb1380498, 0x05001008, 0xb13805a1, 0x05000004, - 0xb13805a0, 0x05000002, 0x05b5fd31, 0x4933c857, + 0xb13805a0, 0x05000002, 0x05b5faa5, 0x4933c857, 0x1c01f000, 0xb1380591, 0x05000004, 0xb1380581, - 0x05b60d2b, 0x1c01f000, 0x0005faec, 0x0501fecd, - 0x0005f45a, 0xb1380498, 0x05f2162c, 0xb1380492, - 0x05b61d23, 0xb1380489, 0x05b41d21, 0x0c01f001, - 0x001094da, 0x00109505, 0x001094d9, 0x001094d9, - 0x001094d9, 0x001094d9, 0x00109505, 0x001094d9, - 0x00109523, 0x05b5fd16, 0x05f9fa16, 0x0500000b, + 0x05b60a9f, 0x1c01f000, 0x0005faec, 0x0501fedf, + 0x0005f45a, 0xb1380498, 0x05f21575, 0xb1380492, + 0x05b61a97, 0xb1380489, 0x05b41a95, 0x0c01f001, + 0x00109766, 0x00109794, 0x00109765, 0x00109765, + 0x00109765, 0x00109765, 0x00109794, 0x00109765, + 0x001097b2, 0x05b5fa8a, 0x05f9f96b, 0x0500000b, 0x59300416, 0x8c000504, 0x05020008, 0x4a02601c, - 0x001094e6, 0x59a80030, 0x48026205, 0x64426203, + 0x00109772, 0x59a80030, 0x48026205, 0x64426203, 0x65266403, 0x1c01f000, 0x59325809, 0x592c040b, 0x8c00051e, 0x05000010, 0x82000d00, 0x000000c0, - 0x82040d80, 0x00000080, 0x0500000e, 0x59300804, - 0x8c040518, 0x0502000b, 0x59300416, 0x8c000516, - 0x05000003, 0x641e6203, 0x0501f00e, 0x61067000, - 0x0005f570, 0x641e6203, 0x497a6006, 0x0005f2ec, - 0x59325809, 0x592c0c0b, 0x8c04051a, 0x05020003, - 0x0005faec, 0x0005f45a, 0x0501fe5b, 0x05fc07fd, - 0x1c01f000, 0x05e5f9b0, 0x59325809, 0x5932680a, - 0x59340200, 0x8c00050e, 0x0500000d, 0x592c040b, - 0x82000500, 0x000000c0, 0x82000580, 0x00000080, - 0x05000005, 0x592c0010, 0x59301817, 0x800c1c80, - 0x480e6017, 0x640a6203, 0x0501f00c, 0x60128000, - 0x0501fb69, 0x05f9ff9c, 0x59300006, 0x80000540, - 0x05020004, 0x59a8002f, 0x800000c2, 0x48026006, - 0x497a6009, 0x641e6203, 0x1c01f000, 0x4933c857, - 0x05e5fe11, 0x05b60cca, 0x59300203, 0x90000582, - 0x05fc0790, 0x05b5fcc6, 0x641e6203, 0x497a6006, - 0x0005f2ec, 0x641e6203, 0x497a6006, 0x0005f2e7, - 0x59300416, 0x8c00051c, 0x0006055f, 0x59325809, - 0x592c2010, 0x40080000, 0x80102480, 0x59300017, - 0x80102400, 0x48126017, 0x0005f55f, 0x8c04050e, - 0x05020007, 0x641a6203, 0x0501f818, 0x5930002b, - 0x80000540, 0x05ba0d84, 0x0005f2e7, 0x640a6203, - 0x1c01f000, 0x60040800, 0x05b9fd7f, 0x90040581, - 0x00040564, 0x05fdf7e4, 0x59300416, 0x8c00051c, - 0x05000004, 0x05b9fb5f, 0x00040559, 0x1c01f000, - 0x59300013, 0x80000540, 0x05020003, 0x05b9fb59, - 0x00040559, 0x1c01f000, 0x492fc857, 0x480bc857, - 0x8c08053e, 0x05000005, 0x80081080, 0x80081000, - 0x60240800, 0x0501f002, 0x60540800, 0x480a580c, - 0x1c01f000, 0x1c01f000, 0x91380593, 0x05000003, - 0x91380594, 0x05b60c8a, 0x59300416, 0x8c000516, - 0x05b40c87, 0x1c01f000, 0x05b5fc85, 0x59300009, - 0x80000540, 0x05b60c82, 0x1c01f000, 0x59300416, - 0x8c000516, 0x05b40c7e, 0x1c01f000, 0x64126203, - 0x493a6403, 0x42000800, 0x80002001, 0x0005f32e, - 0x640e6203, 0x493a6403, 0x05f9f976, 0x05000007, - 0x59300416, 0x8c00050a, 0x05020004, 0x4a02601c, - 0x00109582, 0x1c01f000, 0x0001f989, 0x59325809, - 0x592c040b, 0x8c00051e, 0x05000011, 0x82000500, - 0x000000c0, 0x82000580, 0x00000080, 0x0500000f, - 0x59300416, 0x8c000512, 0x05020009, 0x8c000510, - 0x05020007, 0x592c040d, 0x80000540, 0x05020004, - 0x82080d40, 0x80003065, 0x0005f320, 0x82080d40, - 0x80002065, 0x0005f320, 0x82080d40, 0x80002042, - 0x0005f320, 0x4933c857, 0x493bc857, 0xb1380484, - 0x05b61c4f, 0xb1380481, 0x05b41c4d, 0x0c01f001, - 0x001095a7, 0x001095b5, 0x001095c7, 0x59325809, - 0x592c040b, 0x8c00051e, 0x05000019, 0x82001d00, - 0x000000c0, 0x820c1d80, 0x000000c0, 0x05000014, - 0x64066203, 0x493a6403, 0x42000800, 0x80002042, - 0x0005f32e, 0x59325809, 0x592c040b, 0x8c00051e, - 0x0500000b, 0x82001d00, 0x000000c0, 0x820c1d80, - 0x000000c0, 0x05000006, 0x64066203, 0x493a6403, - 0x42000800, 0x80002001, 0x0005f32e, 0x497a6009, - 0x497a6006, 0x60128000, 0x0501f2bb, 0x59325809, - 0x592c040b, 0x8c00051e, 0x05fc07f9, 0x82001d00, - 0x000000c0, 0x820c1d80, 0x000000c0, 0x05fc07f4, - 0x640e6203, 0x493a6403, 0x05f9f91e, 0x05000007, - 0x59300416, 0x8c00050a, 0x05020004, 0x4a02601c, - 0x001095da, 0x1c01f000, 0x0001f989, 0x82080d40, - 0x80002065, 0x0005f320, 0x4933c857, 0x493bc857, - 0x83380580, 0x00000085, 0x05000005, 0x83380580, - 0x00000088, 0x05000007, 0x05b5fc09, 0x64266203, - 0x493a6403, 0x42000800, 0x80000040, 0x0005f32e, - 0x83300580, 0x00110284, 0x05b60c01, 0x4d1c0000, - 0x813669c0, 0x05000003, 0x0501fd66, 0x05020056, - 0x59cc1404, 0x41780000, 0x0501f855, 0x05000025, - 0x59cc0204, 0x82001580, 0x0000ffff, 0x05000004, - 0x591c1402, 0x80080580, 0x0502001e, 0x05f9f8f1, - 0x05000010, 0x59cc0005, 0x8c000500, 0x0500000d, - 0x4d300000, 0x411e6000, 0x05f5f961, 0x5c026000, - 0x05000029, 0x591c0416, 0x8400055a, 0x48023c16, - 0x59300416, 0x8400055a, 0x48026416, 0x0501f028, - 0x591c0407, 0x9000051f, 0x90002586, 0x05000005, - 0x90002584, 0x05000029, 0x90002591, 0x05020005, - 0x497a3a05, 0x61502000, 0x05edf858, 0x0501f02e, - 0x59240400, 0x8c00050a, 0x05020004, 0x42023800, - 0xffffffff, 0x05fdf7f8, 0x813669c0, 0x0502000e, - 0x59cc0001, 0x59cc3800, 0x821c3d00, 0x00ffffff, - 0x4c1c0000, 0x05e1f854, 0x5c003800, 0x0502001e, - 0x05c5f90d, 0x05d5fae8, 0x0502001b, 0x4926601d, - 0x4936600a, 0x4a026403, 0x00000087, 0x59cc1204, - 0x82081580, 0x0000ffff, 0x05020003, 0x4a026403, - 0x00000086, 0x4d2c0000, 0x0501fff4, 0x05d9f942, - 0x5c025800, 0x0501f00c, 0x591c0403, 0x900005b8, - 0x05fc07d9, 0x591c0203, 0x90000587, 0x05fe07d9, - 0x4d300000, 0x411e6000, 0x05e9fecd, 0x5c026000, - 0x05fdf7d4, 0x5c023800, 0x1c01f000, 0x4933c857, - 0x480bc857, 0x4c5c0000, 0x4000b800, 0x42002800, - 0x001102e4, 0x41300000, 0x80140580, 0x05000019, - 0x58140203, 0x90000580, 0x05000016, 0x58140202, - 0x80080580, 0x05020013, 0x58140203, 0x9000058f, - 0x05000010, 0x58141c07, 0x900c0585, 0x0500000d, - 0x8c5c0500, 0x05000003, 0x900c0587, 0x05000009, - 0x5930200a, 0x5814000a, 0x800001c0, 0x0500000a, - 0x801021c0, 0x05000003, 0x80100580, 0x05000011, - 0x90142c30, 0x41540000, 0x80140480, 0x05021018, - 0x05fdf7e1, 0x5814002a, 0x801021c0, 0x05000005, - 0x58102002, 0x82102500, 0x00ffffff, 0x05fdf7f3, - 0x8c5c0500, 0x05fe07f3, 0x5930202a, 0x05fdf7ef, - 0x40163800, 0x8c5c0500, 0x05000007, 0x4c080000, - 0x4c140000, 0x0501ff50, 0x5c002800, 0x5c001000, - 0x05fc07e8, 0x81300540, 0x0501f009, 0x8c5c0500, - 0x05000007, 0x40080800, 0x42023800, 0xffffffff, - 0x05d9f8fa, 0x05fc07f8, 0x80000580, 0x5c00b800, - 0x1c01f000, 0x4933c857, 0x83300580, 0x00110254, - 0x0502002d, 0x64026203, 0x91380593, 0x05020022, - 0x59300403, 0x82000580, 0x00000092, 0x05b60b54, - 0x59a80067, 0x59325809, 0x812e59c0, 0x05000005, - 0x812c0580, 0x05b60b4e, 0x592c0000, 0x497a5800, - 0x800001c0, 0x05000004, 0x48035067, 0x05e9fde7, - 0x0501f003, 0x497b5067, 0x497b5068, 0x812e59c0, - 0x05000014, 0x592c0205, 0xb0000595, 0x05b406dd, - 0x91380593, 0x05020003, 0x64025a07, 0x0001f35b, - 0x64c65a07, 0x64125812, 0x4a025813, 0x000000ff, - 0x0001f35b, 0x913805a7, 0x05000003, 0x91380594, - 0x05b60b33, 0x493bc857, 0x05e5f814, 0x05fdf7d9, - 0x1c01f000, 0x4933c857, 0x91380593, 0x0502000c, - 0x59300403, 0x4803c857, 0x82000c80, 0x00000085, - 0x05b41b27, 0x82000c80, 0x00000093, 0x05b61b24, - 0x82000480, 0x00000085, 0x0c01f01c, 0x913805a7, - 0x0500000f, 0x91380594, 0x0500000d, 0x493bc857, - 0xb13805a1, 0x05000003, 0xb13805a0, 0x05020007, - 0x05e5fc5d, 0x05ea069f, 0x59300203, 0x9000058e, - 0x050002b5, 0x05b5fb12, 0x05e9f69a, 0x493bc857, - 0x05e1fff2, 0x59325809, 0x812e59c0, 0x05e80630, - 0x64c65a07, 0x64125812, 0x4a025813, 0x000000ff, - 0x0001fb5b, 0x05e9f62a, 0x001096f8, 0x001096fc, - 0x001096fc, 0x001096f8, 0x001096f8, 0x001096f8, - 0x001096f8, 0x001096f8, 0x001096f8, 0x001096f8, - 0x001096f8, 0x001096f8, 0x001096f8, 0x001096f9, - 0x05b5faf7, 0x59325809, 0x64025a07, 0x0001fb5b, - 0x0005f45a, 0x4933c857, 0x42000000, 0x0010b066, - 0x0505f895, 0x0501fc93, 0x497a6205, 0x602e8000, - 0x0501f805, 0x641a6407, 0x641e6203, 0x497a6006, - 0x1c01f000, 0x4933c857, 0x4943c857, 0x59300407, - 0x90000587, 0x05020002, 0x1c01f000, 0x05e5f86e, - 0x4df00000, 0x05f5fc01, 0x0500000a, 0x59300809, - 0x58040000, 0x80001540, 0x05000006, 0x49780800, - 0x4d2c0000, 0x400a5800, 0x0501f967, 0x5c025800, - 0x05f5f96a, 0x90000c91, 0x05b61ad1, 0x0c01f001, - 0x00109744, 0x00109747, 0x00109731, 0x00109753, - 0x00109761, 0x00109731, 0x00109731, 0x00109731, - 0x00109731, 0x00109731, 0x00109731, 0x00109731, - 0x00109731, 0x00109731, 0x00109731, 0x00109731, - 0x00109731, 0x05f9fd84, 0x4d400000, 0x5930002b, - 0x80000540, 0x05000004, 0x41400800, 0x05b9fb8e, - 0x40068000, 0x4d2c0000, 0x59325809, 0x05f5fbd7, - 0x05020945, 0x4c5c0000, 0x5930b80a, 0x05e9fdd4, - 0x485e600a, 0x5c00b800, 0x5c025800, 0x5c028000, - 0x5c03e000, 0x05e40024, 0x1c01f000, 0x598c000b, - 0x81300580, 0x05020003, 0x05e5fb42, 0x05020012, - 0x0201f800, 0x0010eee3, 0x80c40040, 0x05fc07e2, - 0x05e1ff47, 0x0500000c, 0x05b5fa9d, 0x05f5f925, - 0x05020003, 0x05e5fb02, 0x05020007, 0x0201f800, - 0x0010ed56, 0x80c40040, 0x05fc07d7, 0x05e1ff3c, - 0x05b60a93, 0x59300203, 0x90000c91, 0x05b61a90, - 0x0c01f7c0, 0x05b9fc76, 0x05fdf7cf, 0x4933c857, - 0x4d240000, 0x4d440000, 0x4d340000, 0x59cc3800, - 0x821c3d00, 0x00ffffff, 0x59cc0007, 0x4c000000, - 0x59cc0001, 0x82000500, 0x00ffffff, 0x82000d80, - 0x00fffffe, 0x5c000000, 0x05020005, 0x801c0d80, - 0x0502004c, 0x42000000, 0x00fffffe, 0x05ddff06, - 0x05d40d7c, 0x05020047, 0x5930001d, 0x4c000000, - 0x05d5fd70, 0x4926601d, 0x5930000a, 0x4c000000, - 0x59242c00, 0x8c14050a, 0x05020011, 0x81342d80, - 0x05000002, 0x60102800, 0x58002403, 0x59340c03, - 0x59341802, 0x820c1d00, 0x00ffffff, 0x60143000, - 0x59cc4008, 0x59cc3809, 0x9c2041c0, 0x9c1c39c0, - 0x611a8000, 0x41301000, 0x0501f911, 0x4936600a, - 0x83440d80, 0x000007fe, 0x0502000f, 0x60683000, - 0x0501fe56, 0x42000000, 0x0010b053, 0x0501fffa, - 0x4d3c0000, 0x4d400000, 0x60a68000, 0x05c1ff88, - 0x602a7800, 0x05c1ffd2, 0x5c028000, 0x5c027800, - 0x0501f00e, 0x602c3000, 0x0501fe48, 0x42000000, - 0x0010b053, 0x0501ffec, 0x4d3c0000, 0x4d400000, - 0x60a68000, 0x417a7800, 0x0201f800, 0x0010ec6c, - 0x5c028000, 0x5c027800, 0x5c000000, 0x4802600a, - 0x5c000000, 0x4802601d, 0x59cc0007, 0x83440d80, - 0x000007fe, 0x05020005, 0x42000000, 0x00fffffe, - 0x4a026c00, 0x00000707, 0x48026802, 0x80000580, - 0x5c026800, 0x5c028800, 0x5c024800, 0x1c01f000, - 0x4933c857, 0x4c040000, 0x59a80077, 0xb00005b4, - 0x05020040, 0x59cc0a08, 0x82040480, 0x00000100, - 0x05001033, 0x59cc0c08, 0x82040500, 0x00008000, - 0x05000035, 0x59a80013, 0x80000540, 0x05020009, - 0x5930100a, 0x58080212, 0x82000500, 0x0000ff00, - 0x05000004, 0x82040500, 0x00000800, 0x0500002a, - 0x59cc0c09, 0x80040840, 0x05001024, 0x59a80a1b, - 0x8c040506, 0x05000004, 0x59cc0c0f, 0x8c04051e, - 0x05020012, 0x59cc0a17, 0x800409c0, 0x05020012, - 0x59cc0a18, 0x82040480, 0x00000100, 0x05001014, - 0x59cc0c18, 0x800409c0, 0x0502000e, 0x59cc0c19, - 0x80040840, 0x05001011, 0x59cc0c1a, 0x80040840, - 0x05001011, 0x0501f017, 0x4a02621c, 0x00000100, - 0x0501f012, 0x4a02621c, 0x00000300, 0x0501f00f, - 0x4a02621c, 0x00000500, 0x0501f00c, 0x4a02621c, - 0x00000700, 0x0501f009, 0x4a02621c, 0x00000900, - 0x0501f006, 0x4a02621c, 0x00000f00, 0x0501f003, - 0x4a02621c, 0x00002d00, 0x90000541, 0x0501f002, - 0x80000580, 0x5c000800, 0x1c01f000, 0x59cc0407, - 0x4803c857, 0x82000580, 0x00000800, 0x05000002, - 0x6402621c, 0x1c01f000, 0x4933c857, 0x4c580000, - 0x59cc000c, 0x59340802, 0x82040d00, 0x00ffffff, - 0x80040580, 0x0502000a, 0x91cc1408, 0x6008b000, - 0x91341c06, 0x05f1f82b, 0x05020005, 0x91cc140a, - 0x6008b000, 0x91341c08, 0x05f1f826, 0x5c00b000, - 0x1c01f000, 0x4933c857, 0x4c580000, 0x91cc140b, - 0x6008b000, 0x91341c06, 0x05f1f81e, 0x05020008, - 0x91cc140d, 0x6008b000, 0x91341c08, 0x05f1f819, - 0x05000014, 0x4933c856, 0x4933c856, 0x4933c857, - 0x59340009, 0x4803c857, 0x5934000e, 0x4803c857, - 0x59340008, 0x4803c857, 0x5934000d, 0x4803c857, - 0x59340007, 0x4803c857, 0x5934000c, 0x4803c857, - 0x59340006, 0x4803c857, 0x5934000b, 0x4803c857, - 0x5c00b000, 0x1c01f000, 0x4933c857, 0x813261c0, - 0x05000025, 0x83300d80, 0x00110284, 0x05000022, - 0x8d3c0506, 0x05020020, 0x59300c07, 0x90040581, - 0x05000008, 0x90040582, 0x0502001b, 0x59300229, - 0x90000581, 0x05020018, 0x59300c18, 0x0501f002, - 0x59300c03, 0x900405b9, 0x05000003, 0x900405b5, - 0x05020011, 0x4d300000, 0x4d1c0000, 0x5932602a, - 0x4933c857, 0x05f5ff56, 0x05b40989, 0x591c001e, - 0x497a381e, 0x591c0c16, 0x84040d02, 0x48063c16, - 0x5c023800, 0x5c026000, 0x81300580, 0x05b60980, - 0x497a602a, 0x1c01f000, 0x5c000000, 0x4c000000, - 0x4803c857, 0x4d3c0000, 0x60067800, 0x05d5f869, - 0x5c027800, 0x4c580000, 0x6008b000, 0x91a81c02, - 0x91cc140b, 0x05edffcf, 0x5c00b000, 0x80000540, - 0x1c01f000, 0x492fc857, 0x4943c857, 0x59a8000c, - 0x812c0480, 0x0500100f, 0x59a8000a, 0x812c0480, - 0x0502100c, 0x592c0000, 0x80005d40, 0x05000007, - 0x497a5800, 0x49425a07, 0x4c2c0000, 0x0001fb5b, - 0x5c025800, 0x05fdf7f8, 0x49425a07, 0x0001f35b, - 0x1c01f000, 0x61fc21ff, 0x5930100a, 0x800811c0, - 0x05000002, 0x58082403, 0x41301000, 0x0501f008, - 0x40682800, 0x406c3000, 0x41781000, 0x41442000, - 0x0501f003, 0x41781000, 0x61fc21ff, 0x5c000000, - 0x4c000000, 0x4803c857, 0x480bc857, 0x4813c857, - 0x492fc857, 0x4943c857, 0x4d2c0000, 0x4c040000, - 0x4c080000, 0x4c0c0000, 0x4c100000, 0x4c140000, - 0x4c180000, 0x4c1c0000, 0x4c200000, 0x05b5fcc9, - 0x05b4093b, 0x5c004000, 0x5c003800, 0x5c003000, - 0x5c002800, 0x5c002000, 0x5c001800, 0x5c001000, - 0x5c000800, 0x4a025805, 0x0000010d, 0x800811c0, - 0x05000012, 0x914005a9, 0x0502000c, 0x90180582, - 0x05000007, 0x90180583, 0x05000005, 0x90180588, - 0x05000003, 0x90180589, 0x05020004, 0x4a02580a, - 0xffffffff, 0x0501f002, 0x480a580a, 0x58080202, - 0x48025c14, 0x0501f005, 0x4a02580a, 0xffffffff, - 0x4a025c14, 0x0000ffff, 0xb1400586, 0x05000002, - 0x41782800, 0x480e580d, 0x4806580e, 0x4822580f, - 0x481e5810, 0x48165a08, 0x481a5c09, 0x49425a09, - 0x48125a07, 0x82100580, 0x0000ffff, 0x05000011, - 0x4d440000, 0x4d340000, 0x40128800, 0x83440480, - 0x000007f0, 0x05001003, 0x05d5fc0a, 0x0501f002, - 0x0001fae7, 0x05b60902, 0x59340002, 0x82000500, - 0x00ffffff, 0x48025813, 0x5c026800, 0x5c028800, - 0x497a5800, 0x497a5c05, 0x812000d0, 0x48025c11, - 0x0501fc4c, 0x5c025800, 0x1c01f000, 0x5c000000, - 0x4c000000, 0x4803c857, 0x480bc857, 0x480fc857, - 0x4813c857, 0x4817c857, 0x4d2c0000, 0x4c080000, - 0x4c0c0000, 0x4c100000, 0x4c140000, 0x05b5fc75, - 0x05b408e7, 0x5c002800, 0x5c002000, 0x5c001800, - 0x5c001000, 0x05011000, 0x912c0405, 0x4803c840, - 0x6443c842, 0x40000000, 0x05fd17ff, 0x4a025805, - 0x0000010d, 0x65265a09, 0x480a5a0b, 0x480e5c0b, - 0x48125a0c, 0x48165c0c, 0x82080580, 0x00008014, - 0x05020054, 0x820c0580, 0x0000ffff, 0x05020051, - 0x90100586, 0x0502004f, 0x4d240000, 0x42024800, - 0x0010b111, 0x59240005, 0x5c024800, 0x05d9f906, - 0x05000009, 0x82000d00, 0x00ffff00, 0x05020006, - 0x82000c00, 0x00102013, 0x50040800, 0x80040910, - 0x48065a0d, 0x82000d00, 0x0000ffff, 0x48065c0d, - 0x80000120, 0x48025a0e, 0x59a8021b, 0x82001500, - 0x00003500, 0x480a5a0f, 0x8c000502, 0x05000016, - 0x8c000506, 0x05000006, 0x90000d0a, 0x90040d8a, - 0x05020003, 0x64065c0e, 0x0501f018, 0x8c00050a, - 0x05000006, 0x90000d22, 0x90040da2, 0x05020003, - 0x640e5c0e, 0x0501f011, 0x8c000508, 0x05000006, - 0x90000d12, 0x90040d92, 0x05020003, 0x640a5c0e, - 0x0501f00a, 0x05d9f8dc, 0x05020003, 0x64125c0e, - 0x0501f006, 0x8c000506, 0x05000003, 0x64165c0e, - 0x0501f002, 0x64025c0e, 0x59a8002e, 0x48025c0f, - 0x59a8002f, 0x48025a10, 0x59c40801, 0x82040d00, - 0x00018000, 0x90040580, 0x05020003, 0x64025c10, - 0x0501f00c, 0x82040580, 0x00008000, 0x05020003, - 0x64065c10, 0x0501f007, 0x82040580, 0x00010000, - 0x05020003, 0x640e5c10, 0x0501f002, 0x64125c10, - 0x0501fbd4, 0x5c025800, 0x1c01f000, 0x0501f805, - 0x60058800, 0x05000002, 0x60018800, 0x1c01f000, - 0x5930080a, 0x800409c0, 0x05000004, 0x58040403, - 0x81440580, 0x1c01f000, 0x90000541, 0x05fdf7fe, - 0x4933c857, 0xb13805a1, 0x05000003, 0xb13805a0, - 0x0502000c, 0x5932680a, 0x59340200, 0x8c00050e, - 0x05020002, 0x497a6205, 0x5930001c, 0x80000540, - 0x0004045a, 0x497a601c, 0x0801f800, 0x1c01f000, - 0x1c01f000, 0x4933c857, 0xb13805a1, 0x05000003, - 0xb13805a0, 0x05ea03e3, 0x59303403, 0x82180580, - 0x00000086, 0x05e8037a, 0x82180580, 0x00000087, - 0x05e80377, 0x497a6205, 0x642a6203, 0x1c01f000, - 0x4933c857, 0xb13805a1, 0x05000003, 0xb13805a0, - 0x05020008, 0x59300c03, 0x4807c857, 0xb004048a, - 0x05b61847, 0xb0040481, 0x05b41845, 0x0c01f002, - 0x1c01f000, 0x001099ba, 0x001099b7, 0x001099c7, - 0x001099b6, 0x001099b6, 0x001099b6, 0x001099b6, - 0x001099b6, 0x001099c7, 0x05b5f839, 0x497a6205, - 0x64126203, 0x1c01f000, 0x497a6205, 0x59325809, - 0x832c0500, 0x00ff0000, 0x05000004, 0x592c0c0b, - 0x8c04051a, 0x05020003, 0x0005faec, 0x0005f45a, - 0x0501f999, 0x05fc07fd, 0x1c01f000, 0x497a6205, - 0x59cc0002, 0x90000530, 0x90000590, 0x05f4045b, - 0x5930001c, 0x80000540, 0x05000004, 0x497a601c, + 0x82040d80, 0x00000080, 0x05000011, 0x59300804, + 0x8c040518, 0x0502000e, 0x59300416, 0x8c000516, + 0x05000003, 0x641e6203, 0x0501f011, 0x61067000, + 0x0005f570, 0x641e6203, 0x497a6006, 0x59300416, + 0x8c000516, 0x0502000a, 0x0005f2ec, 0x59325809, + 0x592c0c0b, 0x8c04051a, 0x05020003, 0x0005faec, + 0x0005f45a, 0x0501fe6a, 0x05fc07fd, 0x1c01f000, + 0x05e5f8e3, 0x59325809, 0x5932680a, 0x59340200, + 0x8c00050e, 0x0500000d, 0x592c040b, 0x82000500, + 0x000000c0, 0x82000580, 0x00000080, 0x05000005, + 0x592c0010, 0x59301817, 0x800c1c80, 0x480e6017, + 0x640a6203, 0x0501f00c, 0x60128000, 0x0501fb71, + 0x05f9fef3, 0x59300006, 0x80000540, 0x05020004, + 0x59a8002f, 0x800000c2, 0x48026006, 0x497a6009, + 0x641e6203, 0x1c01f000, 0x4933c857, 0x05e5fd44, + 0x05b60a3b, 0x59300203, 0x90000582, 0x05fc078d, + 0x05b5fa37, 0x641e6203, 0x497a6006, 0x0005f2ec, + 0x641e6203, 0x497a6006, 0x0005f2e7, 0x59300416, + 0x8c00051c, 0x0006055f, 0x59325809, 0x592c2010, + 0x40080000, 0x80102480, 0x59300017, 0x80102400, + 0x48126017, 0x0005f55f, 0x8c04050e, 0x05020007, + 0x641a6203, 0x0501f818, 0x5930002b, 0x80000540, + 0x05ba0af5, 0x0005f2e7, 0x640a6203, 0x1c01f000, + 0x60040800, 0x05b9faf0, 0x90040581, 0x00040564, + 0x05fdf7e4, 0x59300416, 0x8c00051c, 0x05000004, + 0x05b9f8ce, 0x00040559, 0x1c01f000, 0x59300013, + 0x80000540, 0x05020003, 0x05b9f8c8, 0x00040559, + 0x1c01f000, 0x492fc857, 0x480bc857, 0x8c08053e, + 0x05000005, 0x80081080, 0x80081000, 0x60240800, + 0x0501f002, 0x60540800, 0x480a580c, 0x1c01f000, + 0x1c01f000, 0x91380593, 0x05000003, 0x91380594, + 0x05b609fb, 0x59300416, 0x8c000516, 0x05b409f8, + 0x1c01f000, 0x05b5f9f6, 0x59300009, 0x80000540, + 0x05b609f3, 0x1c01f000, 0x59300416, 0x8c000516, + 0x05b409ef, 0x1c01f000, 0x64126203, 0x493a6403, + 0x42000800, 0x80002001, 0x0005f32e, 0x640e6203, + 0x493a6403, 0x05f9f8c8, 0x05000007, 0x59300416, + 0x8c00050a, 0x05020004, 0x4a02601c, 0x00109811, + 0x1c01f000, 0x0001f989, 0x59325809, 0x592c040b, + 0x8c00051e, 0x05000011, 0x82000500, 0x000000c0, + 0x82000580, 0x00000080, 0x0500000f, 0x59300416, + 0x8c000512, 0x05020009, 0x8c000510, 0x05020007, + 0x592c040d, 0x80000540, 0x05020004, 0x82080d40, + 0x80003065, 0x0005f320, 0x82080d40, 0x80002065, + 0x0005f320, 0x82080d40, 0x80002042, 0x0005f320, + 0x4933c857, 0x493bc857, 0xb1380484, 0x05b619c0, + 0xb1380481, 0x05b419be, 0x0c01f001, 0x00109836, + 0x00109844, 0x00109856, 0x59325809, 0x592c040b, + 0x8c00051e, 0x05000019, 0x82001d00, 0x000000c0, + 0x820c1d80, 0x000000c0, 0x05000014, 0x64066203, + 0x493a6403, 0x42000800, 0x80002042, 0x0005f32e, + 0x59325809, 0x592c040b, 0x8c00051e, 0x0500000b, + 0x82001d00, 0x000000c0, 0x820c1d80, 0x000000c0, + 0x05000006, 0x64066203, 0x493a6403, 0x42000800, + 0x80002001, 0x0005f32e, 0x497a6009, 0x497a6006, + 0x60128000, 0x0501f2c3, 0x59325809, 0x592c040b, + 0x8c00051e, 0x05fc07f9, 0x82001d00, 0x000000c0, + 0x820c1d80, 0x000000c0, 0x05fc07f4, 0x640e6203, + 0x493a6403, 0x05f9f870, 0x05000007, 0x59300416, + 0x8c00050a, 0x05020004, 0x4a02601c, 0x00109869, + 0x1c01f000, 0x0001f989, 0x82080d40, 0x80002065, + 0x0005f320, 0x4933c857, 0x493bc857, 0x83380580, + 0x00000085, 0x05000005, 0x83380580, 0x00000088, + 0x05000007, 0x05b5f97a, 0x64266203, 0x493a6403, + 0x42000800, 0x80000040, 0x0005f32e, 0x83300580, + 0x001104b4, 0x05b60972, 0x4d1c0000, 0x813669c0, + 0x05000003, 0x0501fd75, 0x05020056, 0x59cc1404, + 0x41780000, 0x0501f855, 0x05000025, 0x59cc0204, + 0x82001580, 0x0000ffff, 0x05000004, 0x591c1402, + 0x80080580, 0x0502001e, 0x05f9f843, 0x05000010, + 0x59cc0005, 0x8c000500, 0x0500000d, 0x4d300000, + 0x411e6000, 0x05f5f8b0, 0x5c026000, 0x05000029, + 0x591c0416, 0x8400055a, 0x48023c16, 0x59300416, + 0x8400055a, 0x48026416, 0x0501f028, 0x591c0407, + 0x9000051f, 0x90002586, 0x05000005, 0x90002584, + 0x05000029, 0x90002591, 0x05020005, 0x497a3a05, + 0x61502000, 0x05e9ff81, 0x0501f02e, 0x59240400, + 0x8c00050a, 0x05020004, 0x42023800, 0xffffffff, + 0x05fdf7f8, 0x813669c0, 0x0502000e, 0x59cc0001, + 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x4c1c0000, + 0x05ddff4e, 0x5c003800, 0x0502001e, 0x05c1fed7, + 0x05d5f92f, 0x0502001b, 0x4926601d, 0x4936600a, + 0x4a026403, 0x00000087, 0x59cc1204, 0x82081580, + 0x0000ffff, 0x05020003, 0x4a026403, 0x00000086, + 0x4d2c0000, 0x0505f815, 0x05d5ff92, 0x5c025800, + 0x0501f00c, 0x591c0403, 0x900005b8, 0x05fc07d9, + 0x591c0203, 0x90000587, 0x05fe07d9, 0x4d300000, + 0x411e6000, 0x05e9fdf2, 0x5c026000, 0x05fdf7d4, + 0x5c023800, 0x1c01f000, 0x4933c857, 0x480bc857, + 0x4c5c0000, 0x4000b800, 0x42002800, 0x00110514, + 0x41300000, 0x80140580, 0x0500001c, 0x58140203, + 0x90000580, 0x05000019, 0x58140202, 0x80080580, + 0x05020016, 0x58140203, 0x9000058f, 0x05000013, + 0x58141c07, 0x900c0585, 0x05000010, 0x8c5c0500, + 0x05000003, 0x900c0587, 0x0500000c, 0x5930200a, + 0x5814000a, 0x800001c0, 0x0500000d, 0x82001d80, + 0x0010ce8f, 0x0500000a, 0x801021c0, 0x05000003, + 0x80100580, 0x05000011, 0x90142c30, 0x41540000, + 0x80140480, 0x0502101d, 0x05fdf7de, 0x5814002a, + 0x801021c0, 0x05000005, 0x58102002, 0x82102500, + 0x00ffffff, 0x05fdf7f3, 0x8c5c0500, 0x05fe07f3, + 0x5930202a, 0x05fdf7ef, 0x40163800, 0x8c5c0500, + 0x05000007, 0x4c080000, 0x4c140000, 0x0501ff6e, + 0x5c002800, 0x5c001000, 0x05fc07e8, 0x591c000a, + 0x800001c0, 0x05020003, 0x5930000a, 0x4802380a, + 0x81300540, 0x0501f009, 0x8c5c0500, 0x05000007, + 0x40080800, 0x42023800, 0xffffffff, 0x05d5ff42, + 0x05fc07f3, 0x80000580, 0x5c00b800, 0x1c01f000, + 0x4933c857, 0x83300580, 0x00110484, 0x0502002d, + 0x64026203, 0x91380593, 0x05020022, 0x59300403, + 0x82000580, 0x00000092, 0x05b608bd, 0x59a80067, + 0x59325809, 0x812e59c0, 0x05000005, 0x812c0580, + 0x05b608b7, 0x592c0000, 0x497a5800, 0x800001c0, + 0x05000004, 0x48035067, 0x05e9fd04, 0x0501f003, + 0x497b5067, 0x497b5068, 0x812e59c0, 0x05000014, + 0x592c0205, 0xb0000595, 0x05b40446, 0x91380593, + 0x05020003, 0x64025a07, 0x0001f35b, 0x64c65a07, + 0x64125812, 0x4a025813, 0x000000ff, 0x0001f35b, + 0x913805a7, 0x05000003, 0x91380594, 0x05b6089c, + 0x493bc857, 0x05e1ff3f, 0x05fdf7d9, 0x1c01f000, + 0x4933c857, 0x91380593, 0x0502000c, 0x59300403, + 0x4803c857, 0x82000c80, 0x00000085, 0x05b41890, + 0x82000c80, 0x00000093, 0x05b6188d, 0x82000480, + 0x00000085, 0x0c01f01c, 0x913805a7, 0x0500000f, + 0x91380594, 0x0500000d, 0x493bc857, 0xb13805a1, + 0x05000003, 0xb13805a0, 0x05020007, 0x05e5fb88, + 0x05ea05c0, 0x59300203, 0x9000058e, 0x050002bc, + 0x05b5f87b, 0x05e9f5bb, 0x493bc857, 0x05e1ff1d, + 0x59325809, 0x812e59c0, 0x05e8054d, 0x64c65a07, + 0x64125812, 0x4a025813, 0x000000ff, 0x0001fb5b, + 0x05e9f547, 0x0010998f, 0x00109993, 0x00109993, + 0x0010998f, 0x0010998f, 0x0010998f, 0x0010998f, + 0x0010998f, 0x0010998f, 0x0010998f, 0x0010998f, + 0x0010998f, 0x0010998f, 0x00109990, 0x05b5f860, + 0x59325809, 0x64025a07, 0x0001fb5b, 0x0005f45a, + 0x4933c857, 0x42000000, 0x0010b2e6, 0x0505f8ae, + 0x0501fc9a, 0x497a6205, 0x602e8000, 0x0501f805, + 0x641a6407, 0x641e6203, 0x497a6006, 0x1c01f000, + 0x4933c857, 0x4943c857, 0x59300407, 0x90000587, + 0x05020002, 0x1c01f000, 0x05e1ff99, 0x4df00000, + 0x05f5fb4b, 0x0500000a, 0x59300809, 0x58040000, + 0x80001540, 0x05000006, 0x49780800, 0x4d2c0000, + 0x400a5800, 0x0501f967, 0x5c025800, 0x05f5f8b1, + 0x90000c91, 0x05b6183a, 0x0c01f001, 0x001099db, + 0x001099de, 0x001099c8, 0x001099ea, 0x001099f8, + 0x001099c8, 0x001099c8, 0x001099c8, 0x001099c8, + 0x001099c8, 0x001099c8, 0x001099c8, 0x001099c8, + 0x001099c8, 0x001099c8, 0x001099c8, 0x001099c8, + 0x05f9fcd3, 0x4d400000, 0x5930002b, 0x80000540, + 0x05000004, 0x41400800, 0x05b9f8f7, 0x40068000, + 0x4d2c0000, 0x59325809, 0x05f5fb21, 0x05020945, + 0x4c5c0000, 0x5930b80a, 0x05e9fcf1, 0x485e600a, + 0x5c00b800, 0x5c025800, 0x5c028000, 0x5c03e000, + 0x05e0074f, 0x1c01f000, 0x598c000b, 0x81300580, + 0x05020003, 0x05e5fa6d, 0x05020012, 0x0201f800, + 0x0010f0f2, 0x80c40040, 0x05fc07e2, 0x05e1fe72, + 0x0500000c, 0x05b5f806, 0x05f5f86c, 0x05020003, + 0x05e5fa2d, 0x05020007, 0x0201f800, 0x0010ef65, + 0x80c40040, 0x05fc07d7, 0x05e1fe67, 0x05b20ffc, + 0x59300203, 0x90000c91, 0x05b21ff9, 0x0c01f7c0, + 0x05b9f9df, 0x05fdf7cf, 0x4933c857, 0x4d240000, + 0x4d440000, 0x4d340000, 0x59cc3800, 0x821c3d00, + 0x00ffffff, 0x59cc0007, 0x4c000000, 0x59cc0001, + 0x82000500, 0x00ffffff, 0x82000d80, 0x00fffffe, + 0x5c000000, 0x05020005, 0x801c0d80, 0x0502004c, + 0x42000000, 0x00fffffe, 0x05ddfdf8, 0x05d40bc1, + 0x05020047, 0x5930001d, 0x4c000000, 0x05d5fbb5, + 0x4926601d, 0x5930000a, 0x4c000000, 0x59242c00, + 0x8c14050a, 0x05020011, 0x81342d80, 0x05000002, + 0x60102800, 0x58002403, 0x59340c03, 0x59341802, + 0x820c1d00, 0x00ffffff, 0x60143000, 0x59cc4008, + 0x59cc3809, 0x9c2041c0, 0x9c1c39c0, 0x611a8000, + 0x41301000, 0x0501f911, 0x4936600a, 0x83440d80, + 0x000007fe, 0x0502000f, 0x60683000, 0x0501fe6f, + 0x42000000, 0x0010b2d3, 0x0505f813, 0x4d3c0000, + 0x4d400000, 0x60a68000, 0x05c1fd4a, 0x602a7800, + 0x05c1fd94, 0x5c028000, 0x5c027800, 0x0501f00e, + 0x602c3000, 0x0501fe61, 0x42000000, 0x0010b2d3, + 0x0505f805, 0x4d3c0000, 0x4d400000, 0x60a68000, + 0x417a7800, 0x0201f800, 0x0010ee7a, 0x5c028000, + 0x5c027800, 0x5c000000, 0x4802600a, 0x5c000000, + 0x4802601d, 0x59cc0007, 0x83440d80, 0x000007fe, + 0x05020005, 0x42000000, 0x00fffffe, 0x4a026c00, + 0x00000707, 0x48026802, 0x80000580, 0x5c026800, + 0x5c028800, 0x5c024800, 0x1c01f000, 0x4933c857, + 0x4c040000, 0x59a80077, 0xb00005b4, 0x05020040, + 0x59cc0a08, 0x82040480, 0x00000100, 0x05001033, + 0x59cc0c08, 0x82040500, 0x00008000, 0x05000035, + 0x59a80013, 0x80000540, 0x05020009, 0x5930100a, + 0x58080212, 0x82000500, 0x0000ff00, 0x05000004, + 0x82040500, 0x00000800, 0x0500002a, 0x59cc0c09, + 0x80040840, 0x05001024, 0x59a80a1b, 0x8c040506, + 0x05000004, 0x59cc0c0f, 0x8c04051e, 0x05020012, + 0x59cc0a17, 0x800409c0, 0x05020012, 0x59cc0a18, + 0x82040480, 0x00000100, 0x05001014, 0x59cc0c18, + 0x800409c0, 0x0502000e, 0x59cc0c19, 0x80040840, + 0x05001011, 0x59cc0c1a, 0x80040840, 0x05001011, + 0x0501f017, 0x4a02621c, 0x00000100, 0x0501f012, + 0x4a02621c, 0x00000300, 0x0501f00f, 0x4a02621c, + 0x00000500, 0x0501f00c, 0x4a02621c, 0x00000700, + 0x0501f009, 0x4a02621c, 0x00000900, 0x0501f006, + 0x4a02621c, 0x00000f00, 0x0501f003, 0x4a02621c, + 0x00002d00, 0x90000541, 0x0501f002, 0x80000580, + 0x5c000800, 0x1c01f000, 0x59cc0407, 0x4803c857, + 0x82000580, 0x00000800, 0x05000002, 0x6402621c, + 0x1c01f000, 0x4933c857, 0x4c580000, 0x59cc000c, + 0x59340802, 0x82040d00, 0x00ffffff, 0x80040580, + 0x0502000a, 0x91cc1408, 0x6008b000, 0x91341c06, + 0x05edff69, 0x05020005, 0x91cc140a, 0x6008b000, + 0x91341c08, 0x05edff64, 0x5c00b000, 0x1c01f000, + 0x4933c857, 0x4c580000, 0x91cc140b, 0x6008b000, + 0x91341c06, 0x05edff5c, 0x05020008, 0x91cc140d, + 0x6008b000, 0x91341c08, 0x05edff57, 0x05000014, + 0x4933c856, 0x4933c856, 0x4933c857, 0x59340009, + 0x4803c857, 0x5934000e, 0x4803c857, 0x59340008, + 0x4803c857, 0x5934000d, 0x4803c857, 0x59340007, + 0x4803c857, 0x5934000c, 0x4803c857, 0x59340006, + 0x4803c857, 0x5934000b, 0x4803c857, 0x5c00b000, + 0x1c01f000, 0x4933c857, 0x813261c0, 0x05000025, + 0x83300d80, 0x001104b4, 0x05000022, 0x8d3c0506, + 0x05020020, 0x59300c07, 0x90040581, 0x05000008, + 0x90040582, 0x0502001b, 0x59300229, 0x90000581, + 0x05020018, 0x59300c18, 0x0501f002, 0x59300c03, + 0x900405b9, 0x05000003, 0x900405b5, 0x05020011, + 0x4d300000, 0x4d1c0000, 0x5932602a, 0x4933c857, + 0x05f5fea0, 0x05b00ef2, 0x591c001e, 0x497a381e, + 0x591c0c16, 0x84040d02, 0x48063c16, 0x5c023800, + 0x5c026000, 0x81300580, 0x05b20ee9, 0x497a602a, + 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, + 0x4d3c0000, 0x60067800, 0x05d1fea5, 0x5c027800, + 0x4c580000, 0x6008b000, 0x91a81c02, 0x91cc140b, + 0x05edff0d, 0x5c00b000, 0x80000540, 0x1c01f000, + 0x492fc857, 0x4943c857, 0x59a8000c, 0x812c0480, + 0x0500100f, 0x59a8000a, 0x812c0480, 0x0502100c, + 0x592c0000, 0x80005d40, 0x05000007, 0x497a5800, + 0x49425a07, 0x4c2c0000, 0x0001fb5b, 0x5c025800, + 0x05fdf7f8, 0x49425a07, 0x0001f35b, 0x1c01f000, + 0x61fc21ff, 0x5930100a, 0x800811c0, 0x05000002, + 0x58082403, 0x41301000, 0x0501f008, 0x40682800, + 0x406c3000, 0x41781000, 0x41442000, 0x0501f003, + 0x41781000, 0x61fc21ff, 0x5c000000, 0x4c000000, + 0x4803c857, 0x480bc857, 0x4813c857, 0x492fc857, + 0x4943c857, 0x4d2c0000, 0x4c040000, 0x4c080000, + 0x4c0c0000, 0x4c100000, 0x4c140000, 0x4c180000, + 0x4c1c0000, 0x4c200000, 0x05b5fa32, 0x05b00ea4, + 0x5c004000, 0x5c003800, 0x5c003000, 0x5c002800, + 0x5c002000, 0x5c001800, 0x5c001000, 0x5c000800, + 0x4a025805, 0x0000010d, 0x800811c0, 0x05000019, + 0x914005a9, 0x05020013, 0x90180582, 0x05000009, + 0x90180583, 0x05000007, 0x90180588, 0x05000005, + 0x90180586, 0x05000006, 0x90180589, 0x05020009, + 0x4a02580a, 0xffffffff, 0x0501f007, 0x5808280a, + 0x58140002, 0x82000500, 0x00ffffff, 0x48025813, + 0x480a580a, 0x58080202, 0x48025c14, 0x0501f005, + 0x4a02580a, 0xffffffff, 0x4a025c14, 0x0000ffff, + 0xb1400586, 0x05000002, 0x41782800, 0x480e580d, + 0x4806580e, 0x4822580f, 0x481e5810, 0x48165a08, + 0x481a5c09, 0x49425a09, 0x48125a07, 0x82100580, + 0x0000ffff, 0x05000011, 0x4d440000, 0x4d340000, + 0x40128800, 0x83440480, 0x000007f0, 0x05001003, + 0x05d5fa48, 0x0501f002, 0x0001fae7, 0x05b20e64, + 0x59340002, 0x82000500, 0x00ffffff, 0x48025813, + 0x5c026800, 0x5c028800, 0x497a5800, 0x497a5c05, + 0x812000d0, 0x48025c11, 0x0501fc5e, 0x5c025800, + 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, + 0x480bc857, 0x480fc857, 0x4813c857, 0x4817c857, + 0x4d2c0000, 0x4c080000, 0x4c0c0000, 0x4c100000, + 0x4c140000, 0x05b5f9d7, 0x05b00e49, 0x5c002800, + 0x5c002000, 0x5c001800, 0x5c001000, 0x05011000, + 0x912c0405, 0x4803c840, 0x6443c842, 0x40000000, + 0x05fd17ff, 0x4a025805, 0x0000010d, 0x65265a09, + 0x480a5a0b, 0x480e5c0b, 0x48125a0c, 0x48165c0c, + 0x82080580, 0x00008014, 0x05020054, 0x820c0580, + 0x0000ffff, 0x05020051, 0x90100586, 0x0502004f, + 0x4d240000, 0x42024800, 0x0010b391, 0x59240005, + 0x5c024800, 0x05d5ff6d, 0x05000009, 0x82000d00, + 0x00ffff00, 0x05020006, 0x82000c00, 0x001020b6, + 0x50040800, 0x80040910, 0x48065a0d, 0x82000d00, + 0x0000ffff, 0x48065c0d, 0x80000120, 0x48025a0e, + 0x59a8021b, 0x82001500, 0x00003500, 0x480a5a0f, + 0x8c000502, 0x05000016, 0x8c000506, 0x05000006, + 0x90000d0a, 0x90040d8a, 0x05020003, 0x64065c0e, + 0x0501f018, 0x8c00050a, 0x05000006, 0x90000d22, + 0x90040da2, 0x05020003, 0x640e5c0e, 0x0501f011, + 0x8c000508, 0x05000006, 0x90000d12, 0x90040d92, + 0x05020003, 0x640a5c0e, 0x0501f00a, 0x05d5ff43, + 0x05020003, 0x64125c0e, 0x0501f006, 0x8c000506, + 0x05000003, 0x64165c0e, 0x0501f002, 0x64025c0e, + 0x59a8002e, 0x48025c0f, 0x59a8002f, 0x48025a10, + 0x59c40801, 0x82040d00, 0x00018000, 0x90040580, + 0x05020003, 0x64025c10, 0x0501f00c, 0x82040580, + 0x00008000, 0x05020003, 0x64065c10, 0x0501f007, + 0x82040580, 0x00010000, 0x05020003, 0x640e5c10, + 0x0501f002, 0x64125c10, 0x0501fbe6, 0x5c025800, + 0x1c01f000, 0x0501f805, 0x60058800, 0x05000002, + 0x60018800, 0x1c01f000, 0x5930080a, 0x800409c0, + 0x05000004, 0x58040403, 0x81440580, 0x1c01f000, + 0x90000541, 0x05fdf7fe, 0x4933c857, 0xb13805a1, + 0x05000003, 0xb13805a0, 0x0502000c, 0x5932680a, + 0x59340200, 0x8c00050e, 0x05020002, 0x497a6205, + 0x5930001c, 0x80000540, 0x0004045a, 0x497a601c, 0x0801f800, 0x1c01f000, 0x1c01f000, 0x4933c857, - 0x493bc857, 0xb13805a1, 0x05000006, 0xb13805a0, - 0x05ea03a0, 0x59cc0002, 0x8c000526, 0x0500000c, - 0x59300403, 0x4803c857, 0xb0000589, 0x05b60810, - 0x497a6205, 0x5930001c, 0x80000540, 0x05000004, - 0x497a601c, 0x0801f800, 0x1c01f000, 0x1c01f000, - 0x4933c857, 0x59300403, 0x82000d80, 0x00000085, - 0x05020007, 0x4a026403, 0x0000008b, 0x642e6203, - 0x42000800, 0x80000040, 0x0005f32e, 0x82000d80, - 0x0000008b, 0x05020026, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x0010ec6c, 0x5c027800, 0x42000000, - 0x0010b056, 0x0501fd98, 0x59325809, 0x812e59c0, - 0x05000006, 0x832c0500, 0x00ff0000, 0x05000003, - 0x60128000, 0x05fdfe7c, 0x60443000, 0x0501fbe7, - 0x05c1fd1f, 0x59240400, 0x8c00050a, 0x0502000a, - 0x41782800, 0x60103000, 0x60a68000, 0x05fdfe86, - 0x6406642c, 0x64126407, 0x64066403, 0x641e6203, - 0x1c01f000, 0x602c0800, 0x05d1fed5, 0x64066407, - 0x64066403, 0x64066203, 0x05e1f408, 0x1c01f000, - 0x4933c857, 0x40000000, 0x40000000, 0x1c01f000, - 0x4933c857, 0x59300a03, 0x9004058e, 0x05000003, - 0x90040590, 0x05020019, 0x0501f96e, 0x05f1fd40, - 0x59300203, 0x90000d89, 0x0500000b, 0x48026429, - 0x4a026403, 0x00000085, 0x59300416, 0x8400055a, - 0x8400055e, 0x48026416, 0x64266203, 0x64166407, - 0x641a6229, 0x5932680a, 0x59340200, 0x8c00050e, - 0x05020003, 0x59a8002f, 0x48026006, 0x42000800, - 0x80000040, 0x0005fb2e, 0x1c01f000, 0x4933c857, - 0x4c040000, 0x59300403, 0x90000d9e, 0x05020012, - 0x800000d0, 0x59300a18, 0x82040d00, 0x000000ff, - 0x80040540, 0x4803c857, 0x48026418, 0x4a026403, - 0x00000085, 0x64266203, 0x64166407, 0x64126229, - 0x59a8002f, 0x48026006, 0x42000800, 0x80000040, - 0x0005fb2e, 0x5c000800, 0x1c01f000, 0x4933c857, - 0x40000000, 0x40000000, 0x1c01f000, 0x59300416, - 0x4933c857, 0x4803c857, 0x8c000518, 0x05000006, - 0x8c000512, 0x05f60303, 0x0501f932, 0x0005faec, - 0x0005fc5a, 0x1c01f000, 0x591c0407, 0x4803c857, - 0x90000c89, 0x0502100b, 0x0c01f001, 0x00109a74, - 0x00109a74, 0x00109a74, 0x00109a76, 0x00109a74, - 0x00109a76, 0x00109a76, 0x00109a74, 0x00109a76, - 0x80000580, 0x1c01f000, 0x90000541, 0x1c01f000, - 0x591c0407, 0x9000051f, 0x90000586, 0x0500000a, - 0x4803c857, 0x64ee6403, 0x6426641c, 0x4a02621c, - 0x00002a00, 0x64066203, 0x42000800, 0x80000040, - 0x0005f32e, 0x4803c856, 0x4c040000, 0x4c140000, - 0x4d300000, 0x411e6000, 0x0501f90a, 0x497a6205, - 0x59300416, 0x4803c857, 0x82000500, 0xffffadff, - 0x48026416, 0x497a6405, 0x5c026000, 0x05b5fae9, - 0x05b00f5b, 0x5c002800, 0x5c000800, 0x4a025805, - 0x0000010d, 0x497a5800, 0x497a5c05, 0x65165a09, - 0x491e580a, 0x59300402, 0x48025c08, 0x5930041b, - 0x48025c0c, 0x591c0416, 0x84000556, 0x48023c16, - 0x591c180a, 0x580c0403, 0x48025a07, 0x580c0002, - 0x82000500, 0x00ffffff, 0x48025813, 0x59cc0404, - 0x48025c14, 0x497a5a08, 0x4816580b, 0x48065a0c, - 0x580c0013, 0x82000500, 0xff000000, 0x80000120, - 0x48025c11, 0x0501fa8f, 0x493a6403, 0x4d400000, - 0x61168000, 0x591c0202, 0x4c000000, 0x4d300000, - 0x411e6000, 0x05fdfc4c, 0x5c026000, 0x5c000000, - 0x48023a02, 0x5c028000, 0x491e602a, 0x4932381e, - 0x641a3c07, 0x641e3a03, 0x497a3806, 0x497a3a05, - 0x1c01f000, 0x4933c857, 0x91380593, 0x0502000a, - 0x59300403, 0x4803c857, 0x82000d80, 0x00000085, - 0x05000026, 0x82000d80, 0x0000008b, 0x05000023, - 0x05b1ff1b, 0x913805a7, 0x0502000a, 0x05e1fbfb, - 0x4d2c0000, 0x4d400000, 0x59325809, 0x60128000, - 0x05fdfda5, 0x5c028000, 0x5c025800, 0x1c01f000, - 0x91380594, 0x05fc07f6, 0xb13805a1, 0x05000009, - 0xb13805a0, 0x05000007, 0x83380580, 0x00000089, - 0x05000004, 0x83380580, 0x0000008a, 0x05ea028d, - 0x05e5f849, 0x05ea028b, 0x59300a03, 0x9004058e, - 0x05fc06a1, 0x9004058a, 0x0500000c, 0x9004058c, - 0x0500000a, 0x05b1fefa, 0x05f5fbfa, 0x05000005, - 0x643a6203, 0x59a80030, 0x48026205, 0x1c01f000, - 0x642a6203, 0x1c01f000, 0x83380480, 0x00000093, - 0x0502100b, 0x83380480, 0x00000085, 0x05001008, - 0x83380580, 0x00000089, 0x05000008, 0x83380580, - 0x0000008a, 0x05000031, 0x05b1fee5, 0x493bc857, - 0x4933c857, 0x05e9f26b, 0x4933c857, 0x4c340000, - 0x05f5fbe0, 0x0500000b, 0x59300416, 0x8c00051a, - 0x05000008, 0x641a6407, 0x59300429, 0x90000d8e, - 0x05020002, 0x60080000, 0x48026203, 0x0501f01d, - 0x59300c16, 0x4c040000, 0x41306800, 0x05e9fa26, - 0x5c000800, 0x05000015, 0x48066416, 0x64066203, - 0x647a6403, 0x59cc0c07, 0x4806641b, 0x59cc0a07, - 0x4806621b, 0x5834080a, 0x4806600a, 0x5834081d, - 0x4806601d, 0x05f5fbc3, 0x05000004, 0x59300416, - 0x84000550, 0x48026416, 0x64126407, 0x42000800, - 0x80000040, 0x0005fb2e, 0x40366000, 0x0005fc5a, - 0x5c006800, 0x1c01f000, 0x4933c857, 0x59300416, - 0x8c00051a, 0x0502001a, 0x59300418, 0x82000d00, - 0x0000ff00, 0x900409c0, 0x9004059e, 0x05020014, - 0x4c340000, 0x41306800, 0x05e9f9ff, 0x0500000e, - 0x493a6403, 0x64066203, 0x64126407, 0x5834041b, - 0x4802641b, 0x5834021b, 0x4802621b, 0x5834080a, - 0x4806600a, 0x5834081d, 0x4806601d, 0x05f5fb8e, - 0x05e1face, 0x40366000, 0x5c006800, 0x0005f45a, - 0x5930080a, 0x58040200, 0x8c00051a, 0x05b20f52, - 0x1c01f000, 0x05d5f873, 0x05000019, 0x640a6203, - 0x59300416, 0x84000558, 0x48026416, 0x8c000512, - 0x05000004, 0x59a80030, 0x48026205, 0x0501f006, - 0x59a80830, 0x59a8002e, 0x80040400, 0x9000041e, - 0x48026205, 0x5930000a, 0x90000c11, 0x50040000, - 0x80000540, 0x05000003, 0x90000c00, 0x05fdf7fc, - 0x45300800, 0x497a6000, 0x90000541, 0x1c01f000, - 0x82100500, 0xfffffeef, 0x05020017, 0x4d2c0000, - 0x4937c857, 0x59340811, 0x91341411, 0x800409c0, - 0x0500000c, 0x40040000, 0x81300580, 0x05000004, - 0x90041400, 0x58040800, 0x05fdf7f9, 0x59300800, - 0x497a6000, 0x44041000, 0x0005faec, 0x0501f002, - 0x4933c857, 0x5c025800, 0x492e6009, 0x0005faec, - 0x0005f45a, 0x492fc857, 0x641a5a07, 0x0001f35b, - 0x4c340000, 0x5930000a, 0x800001c0, 0x0500000f, - 0x90006c11, 0x50340000, 0x80000540, 0x05000009, - 0x81300580, 0x05000004, 0x50340000, 0x90006c00, - 0x05fdf7f9, 0x59300000, 0x44006800, 0x497a6000, - 0x5c006800, 0x1c01f000, 0x59300c07, 0x90040585, - 0x05fc07fc, 0x90040591, 0x05fc07fa, 0x90040586, - 0x05fc07f8, 0x90040581, 0x05fc07f6, 0x05b1fe40, - 0x4933c857, 0x4c080000, 0x4c0c0000, 0x4c580000, - 0x59a81018, 0x59cc1807, 0x820c1d00, 0x00ffffff, - 0x800c0110, 0x80083580, 0x0502000c, 0x91cc1408, - 0x6008b000, 0x5930000a, 0x90001c06, 0x05edfc8d, - 0x05020006, 0x91cc140a, 0x6008b000, 0x5930000a, - 0x90001c08, 0x05edfc87, 0x5c00b000, 0x5c001800, - 0x5c001000, 0x1c01f000, 0x4933c856, 0x493a6403, - 0x05d1fa58, 0x05c1f21a, 0x4933c857, 0x492fc857, - 0x5930080a, 0x58040200, 0x8c00051e, 0x05000004, - 0x592c0209, 0x84000558, 0x48025a09, 0x1c01f000, - 0x59e0180f, 0x599c0413, 0x800c1000, 0x80080580, - 0x05020002, 0x41781000, 0x59e00010, 0x59e00810, - 0x80040d80, 0x05fe07fd, 0x80080580, 0x05000009, - 0x4c080000, 0x599c0814, 0x599c1015, 0x800c00cc, - 0x80040c00, 0x90081440, 0x5c001800, 0x90000541, - 0x4803c857, 0x1c01f000, 0x59300203, 0x4933c857, - 0x4937c857, 0x493bc857, 0x4803c857, 0x90003491, - 0x05b21dfb, 0x0c01f001, 0x00109c07, 0x00109cef, - 0x00109c07, 0x00109c07, 0x00109c07, 0x00109c07, - 0x00109c07, 0x00109c6f, 0x00109c08, 0x00109c07, - 0x00109c07, 0x00109c07, 0x00109c07, 0x00109c07, - 0x00109d36, 0x00109c07, 0x00109c07, 0x05b1fde8, - 0xb138058c, 0x05b20de6, 0x05d1ffd7, 0x05020021, - 0x59a80a1b, 0x5932481d, 0x59240200, 0x82000500, - 0x000000e0, 0x82000580, 0x00000080, 0x05000019, - 0x8c040512, 0x05000029, 0x59cc0806, 0x82040d00, - 0xff000000, 0x82040580, 0x03000000, 0x0500001d, - 0x82040580, 0x50000000, 0x05000004, 0x82040580, - 0x52000000, 0x0006045a, 0x813669c0, 0x05000007, - 0x497a602a, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x0010ec6c, 0x5c027800, 0x64066403, 0x0501f010, + 0xb13805a1, 0x05000003, 0xb13805a0, 0x05ea02fd, + 0x59303403, 0x82180580, 0x00000086, 0x05e80290, + 0x82180580, 0x00000087, 0x05e8028d, 0x497a6205, + 0x642a6203, 0x1c01f000, 0x4933c857, 0xb13805a1, + 0x05000003, 0xb13805a0, 0x05020008, 0x59300c03, + 0x4807c857, 0xb004048a, 0x05b21da9, 0xb0040481, + 0x05b01da7, 0x0c01f002, 0x1c01f000, 0x00109c58, + 0x00109c55, 0x00109c65, 0x00109c54, 0x00109c54, + 0x00109c54, 0x00109c54, 0x00109c54, 0x00109c65, + 0x05b1fd9b, 0x497a6205, 0x64126203, 0x1c01f000, + 0x497a6205, 0x59325809, 0x832c0500, 0x00ff0000, + 0x05000004, 0x592c0c0b, 0x8c04051a, 0x05020003, + 0x0005faec, 0x0005f45a, 0x0501f999, 0x05fc07fd, + 0x1c01f000, 0x497a6205, 0x59cc0002, 0x90000530, + 0x90000590, 0x05f4039e, 0x5930001c, 0x80000540, + 0x05000004, 0x497a601c, 0x0801f800, 0x1c01f000, + 0x1c01f000, 0x4933c857, 0x493bc857, 0xb13805a1, + 0x05000006, 0xb13805a0, 0x05ea02ba, 0x59cc0002, + 0x8c000526, 0x0500000c, 0x59300403, 0x4803c857, + 0xb0000589, 0x05b20d72, 0x497a6205, 0x5930001c, + 0x80000540, 0x05000004, 0x497a601c, 0x0801f800, + 0x1c01f000, 0x1c01f000, 0x4933c857, 0x59300403, + 0x82000d80, 0x00000085, 0x05020007, 0x4a026403, + 0x0000008b, 0x642e6203, 0x42000800, 0x80000040, + 0x0005f32e, 0x82000d80, 0x0000008b, 0x05020026, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010ee7a, + 0x5c027800, 0x42000000, 0x0010b2d6, 0x0501fdaa, + 0x59325809, 0x812e59c0, 0x05000006, 0x832c0500, + 0x00ff0000, 0x05000003, 0x60128000, 0x05fdfe75, + 0x60443000, 0x0501fbf9, 0x05c1fada, 0x59240400, + 0x8c00050a, 0x0502000a, 0x41782800, 0x60103000, + 0x60a68000, 0x05fdfe7f, 0x6406642c, 0x64126407, + 0x64066403, 0x641e6203, 0x1c01f000, 0x602c0800, + 0x05d1fd0a, 0x64066407, 0x64066403, 0x64066203, + 0x05e1f32c, 0x1c01f000, 0x4933c857, 0x40000000, + 0x40000000, 0x1c01f000, 0x4933c857, 0x59300a03, + 0x9004058e, 0x05000003, 0x90040590, 0x05020019, + 0x0501f96e, 0x05f1fc80, 0x59300203, 0x90000d89, + 0x0500000b, 0x48026429, 0x4a026403, 0x00000085, + 0x59300416, 0x8400055a, 0x8400055e, 0x48026416, + 0x64266203, 0x64166407, 0x641a6229, 0x5932680a, + 0x59340200, 0x8c00050e, 0x05020003, 0x59a8002f, + 0x48026006, 0x42000800, 0x80000040, 0x0005fb2e, + 0x1c01f000, 0x4933c857, 0x4c040000, 0x59300403, + 0x90000d9e, 0x05020012, 0x800000d0, 0x59300a18, + 0x82040d00, 0x000000ff, 0x80040540, 0x4803c857, + 0x48026418, 0x4a026403, 0x00000085, 0x64266203, + 0x64166407, 0x64126229, 0x59a8002f, 0x48026006, + 0x42000800, 0x80000040, 0x0005fb2e, 0x5c000800, + 0x1c01f000, 0x4933c857, 0x40000000, 0x40000000, + 0x1c01f000, 0x59300416, 0x4933c857, 0x4803c857, + 0x8c000518, 0x05000006, 0x8c000512, 0x05f60246, + 0x0501f932, 0x0005faec, 0x0005fc5a, 0x1c01f000, + 0x591c0407, 0x4803c857, 0x90000c89, 0x0502100b, + 0x0c01f001, 0x00109d12, 0x00109d12, 0x00109d12, + 0x00109d14, 0x00109d12, 0x00109d14, 0x00109d14, + 0x00109d12, 0x00109d14, 0x80000580, 0x1c01f000, + 0x90000541, 0x1c01f000, 0x591c0407, 0x9000051f, + 0x90000586, 0x0500000a, 0x4803c857, 0x64ee6403, + 0x6426641c, 0x4a02621c, 0x00002a00, 0x64066203, + 0x42000800, 0x80000040, 0x0005f32e, 0x4803c856, + 0x4c040000, 0x4c140000, 0x4d300000, 0x411e6000, + 0x0501f90a, 0x497a6205, 0x59300416, 0x4803c857, + 0x82000500, 0xffffadff, 0x48026416, 0x497a6405, + 0x5c026000, 0x05b5f84b, 0x05b00cbd, 0x5c002800, + 0x5c000800, 0x4a025805, 0x0000010d, 0x497a5800, + 0x497a5c05, 0x65165a09, 0x491e580a, 0x59300402, + 0x48025c08, 0x5930041b, 0x48025c0c, 0x591c0416, + 0x84000556, 0x48023c16, 0x591c180a, 0x580c0403, + 0x48025a07, 0x580c0002, 0x82000500, 0x00ffffff, + 0x48025813, 0x59cc0404, 0x48025c14, 0x497a5a08, + 0x4816580b, 0x48065a0c, 0x580c0013, 0x82000500, + 0xff000000, 0x80000120, 0x48025c11, 0x0501faa1, + 0x493a6403, 0x4d400000, 0x61168000, 0x591c0202, + 0x4c000000, 0x4d300000, 0x411e6000, 0x05fdfc45, + 0x5c026000, 0x5c000000, 0x48023a02, 0x5c028000, + 0x491e602a, 0x4932381e, 0x641a3c07, 0x641e3a03, + 0x497a3806, 0x497a3a05, 0x1c01f000, 0x4933c857, + 0x91380593, 0x0502000a, 0x59300403, 0x4803c857, + 0x82000d80, 0x00000085, 0x05000026, 0x82000d80, + 0x0000008b, 0x05000023, 0x05b1fc7d, 0x913805a7, + 0x0502000a, 0x05e1fb1f, 0x4d2c0000, 0x4d400000, + 0x59325809, 0x60128000, 0x05fdfd9e, 0x5c028000, + 0x5c025800, 0x1c01f000, 0x91380594, 0x05fc07f6, + 0xb13805a1, 0x05000009, 0xb13805a0, 0x05000007, + 0x83380580, 0x00000089, 0x05000004, 0x83380580, + 0x0000008a, 0x05ea01a7, 0x05e1ff6d, 0x05ea01a5, + 0x59300a03, 0x9004058e, 0x05fc06a1, 0x9004058a, + 0x0500000c, 0x9004058c, 0x0500000a, 0x05b1fc5c, + 0x05f5fb3d, 0x05000005, 0x643a6203, 0x59a80030, + 0x48026205, 0x1c01f000, 0x642a6203, 0x1c01f000, + 0x83380480, 0x00000093, 0x0502100b, 0x83380480, + 0x00000085, 0x05001008, 0x83380580, 0x00000089, + 0x05000008, 0x83380580, 0x0000008a, 0x05000031, + 0x05b1fc47, 0x493bc857, 0x4933c857, 0x05e9f185, + 0x4933c857, 0x4c340000, 0x05f5fb23, 0x0500000b, + 0x59300416, 0x8c00051a, 0x05000008, 0x641a6407, + 0x59300429, 0x90000d8e, 0x05020002, 0x60080000, + 0x48026203, 0x0501f01d, 0x59300c16, 0x4c040000, + 0x41306800, 0x05e9f940, 0x5c000800, 0x05000015, + 0x48066416, 0x64066203, 0x647a6403, 0x59cc0c07, + 0x4806641b, 0x59cc0a07, 0x4806621b, 0x5834080a, + 0x4806600a, 0x5834081d, 0x4806601d, 0x05f5fb06, + 0x05000004, 0x59300416, 0x84000550, 0x48026416, + 0x64126407, 0x42000800, 0x80000040, 0x0005fb2e, + 0x40366000, 0x0005fc5a, 0x5c006800, 0x1c01f000, + 0x4933c857, 0x59300416, 0x8c00051a, 0x0502001a, + 0x59300418, 0x82000d00, 0x0000ff00, 0x900409c0, + 0x9004059e, 0x05020014, 0x4c340000, 0x41306800, + 0x05e9f919, 0x0500000e, 0x493a6403, 0x64066203, + 0x64126407, 0x5834041b, 0x4802641b, 0x5834021b, + 0x4802621b, 0x5834080a, 0x4806600a, 0x5834081d, + 0x4806601d, 0x05f5fad1, 0x05e1f9f2, 0x40366000, + 0x5c006800, 0x0005f45a, 0x5930080a, 0x58040200, + 0x8c00051a, 0x05b20cb4, 0x1c01f000, 0x05d1feaf, + 0x05000019, 0x640a6203, 0x59300416, 0x84000558, + 0x48026416, 0x8c000512, 0x05000004, 0x59a80030, + 0x48026205, 0x0501f006, 0x59a80830, 0x59a8002e, + 0x80040400, 0x9000041e, 0x48026205, 0x5930000a, + 0x90000c11, 0x50040000, 0x80000540, 0x05000003, + 0x90000c00, 0x05fdf7fc, 0x45300800, 0x497a6000, + 0x90000541, 0x1c01f000, 0x82100500, 0xfffffeef, + 0x05020017, 0x4d2c0000, 0x4937c857, 0x59340811, + 0x91341411, 0x800409c0, 0x0500000c, 0x40040000, + 0x81300580, 0x05000004, 0x90041400, 0x58040800, + 0x05fdf7f9, 0x59300800, 0x497a6000, 0x44041000, + 0x0005faec, 0x0501f002, 0x4933c857, 0x5c025800, + 0x492e6009, 0x0005faec, 0x0005f45a, 0x492fc857, + 0x641a5a07, 0x0001f35b, 0x4c340000, 0x5930000a, + 0x800001c0, 0x0500000f, 0x90006c11, 0x50340000, + 0x80000540, 0x05000009, 0x81300580, 0x05000004, + 0x50340000, 0x90006c00, 0x05fdf7f9, 0x59300000, + 0x44006800, 0x497a6000, 0x5c006800, 0x1c01f000, + 0x59300c07, 0x90040585, 0x05fc07fc, 0x90040591, + 0x05fc07fa, 0x90040586, 0x05fc07f8, 0x90040581, + 0x05fc07f6, 0x05b1fba2, 0x4933c857, 0x4c080000, + 0x4c0c0000, 0x4c580000, 0x59a81018, 0x59cc1807, + 0x820c1d00, 0x00ffffff, 0x800c0110, 0x80083580, + 0x0502000c, 0x91cc1408, 0x6008b000, 0x5930000a, + 0x90001c06, 0x05edfbc4, 0x05020006, 0x91cc140a, + 0x6008b000, 0x5930000a, 0x90001c08, 0x05edfbbe, + 0x5c00b000, 0x5c001800, 0x5c001000, 0x1c01f000, + 0x4933c856, 0x493a6403, 0x05d1f88d, 0x05bdf7b0, + 0x4933c857, 0x492fc857, 0x5930080a, 0x58040200, + 0x8c00051e, 0x05000004, 0x592c0209, 0x84000558, + 0x48025a09, 0x1c01f000, 0x59e0180f, 0x599c0413, + 0x800c1000, 0x80080580, 0x05020002, 0x41781000, + 0x59e00010, 0x59e00810, 0x80040d80, 0x05fe07fd, + 0x80080580, 0x05000009, 0x4c080000, 0x599c0814, + 0x599c1015, 0x800c00cc, 0x80040c00, 0x90081440, + 0x5c001800, 0x90000541, 0x4803c857, 0x1c01f000, + 0x59300203, 0x4933c857, 0x4937c857, 0x493bc857, + 0x4803c857, 0x90003491, 0x05b21b5d, 0x0c01f001, + 0x00109ea5, 0x00109f90, 0x00109ea5, 0x00109ea5, + 0x00109ea5, 0x00109ea5, 0x00109ea5, 0x00109f0f, + 0x00109ea6, 0x00109ea5, 0x00109ea5, 0x00109ea5, + 0x00109ea5, 0x00109ea5, 0x00109fe6, 0x00109ea5, + 0x00109ea5, 0x05b1fb4a, 0xb138058c, 0x05b20b48, + 0x05d1fe13, 0x05020021, 0x59a80a1b, 0x5932481d, + 0x59240200, 0x82000500, 0x000000e0, 0x82000580, + 0x00000080, 0x05000019, 0x8c040512, 0x05000029, 0x59cc0806, 0x82040d00, 0xff000000, 0x82040580, - 0x03000000, 0x05000007, 0x82040580, 0x50000000, + 0x03000000, 0x0500001d, 0x82040580, 0x50000000, 0x05000004, 0x82040580, 0x52000000, 0x0006045a, - 0x64266403, 0x6426641c, 0x6402621c, 0x64126407, - 0x64066203, 0x05e1f1e5, 0x59240400, 0x8c00050a, + 0x83340580, 0x0010ce8f, 0x05000006, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010ee7a, 0x5c027800, + 0x64066403, 0x0501f010, 0x59cc0806, 0x82040d00, + 0xff000000, 0x82040580, 0x03000000, 0x05000007, + 0x82040580, 0x50000000, 0x05000004, 0x82040580, + 0x52000000, 0x0006045a, 0x64266403, 0x6426641c, + 0x6402621c, 0x64126407, 0x64066203, 0x05e1f109, + 0x59240400, 0x8c00050a, 0x05020020, 0x0501fcb1, 0x0502001e, 0x59cc0806, 0x4807c857, 0x82040d00, 0xff000000, 0x82040580, 0x03000000, 0x05000013, 0x82040580, 0x20000000, 0x05000010, 0x82040580, @@ -22781,60 +23003,64 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x0500000a, 0x82040580, 0x50000000, 0x05000007, 0x82040580, 0x52000000, 0x05000004, 0x82040580, 0x05000000, 0x05020007, 0x9c0431c0, 0x611a8000, - 0x60042800, 0x05fdfc38, 0x0501f8f1, 0x05b00d90, - 0x61442000, 0x05e9fa11, 0x59cc0000, 0x82000500, + 0x60042800, 0x05fdfc2f, 0x0501f901, 0x05b00af0, + 0x61442000, 0x05e9f929, 0x59cc0000, 0x82000500, 0x00ffffff, 0x82000580, 0x00ffffff, 0x05000004, 0x641e6203, 0x493a6403, 0x1c01f000, 0x59325819, - 0x812e59c0, 0x05b60928, 0x0005f45a, 0x4d2c0000, + 0x812e59c0, 0x05b20e88, 0x0005f45a, 0x4d2c0000, 0x4c580000, 0x4c500000, 0x4c540000, 0x41385000, - 0xb1380594, 0x05b20d7a, 0x59325809, 0x592c0c0c, + 0xb1380594, 0x05b20ada, 0x59325809, 0x592c0c0c, 0x82040d00, 0x0000e000, 0x82040580, 0x00002000, - 0x05020060, 0x59300819, 0x800409c0, 0x05000010, + 0x05020061, 0x59300819, 0x800409c0, 0x05000010, 0x58041405, 0x41cca800, 0x9004a406, 0x90080490, - 0x05021004, 0x4008b000, 0x0501fbda, 0x0501f008, - 0x40001000, 0x603cb000, 0x0501fbd6, 0x58040801, - 0x800409c0, 0x05fe07f5, 0x05b1fd61, 0x813669c0, - 0x0500004c, 0x59344c00, 0x592c0c0a, 0x4807c857, - 0x4827c857, 0x82040d00, 0x000000ff, 0x90040583, - 0x0500001d, 0x90040585, 0x05000022, 0x900405a0, - 0x0500002c, 0xb0040592, 0x05000036, 0xb0040590, - 0x05000036, 0x900405a1, 0x05000003, 0x900405a4, - 0x05020038, 0x82240500, 0x0000ff00, 0x82000580, - 0x00000700, 0x05000005, 0x60240800, 0x05d1fc40, - 0x60305000, 0x0501f02f, 0x64c65a07, 0x6426580e, - 0x59340400, 0x4802580f, 0x0001fb5b, 0x05e9f860, - 0x0501f036, 0x05d1fa0a, 0x41780800, 0x05d1fd1d, - 0x600c0800, 0x05d1fc32, 0x60205000, 0x0501f021, + 0x05021004, 0x4008b000, 0x0501fbea, 0x0501f008, + 0x40001000, 0x603cb000, 0x0501fbe6, 0x58040801, + 0x800409c0, 0x05fe07f5, 0x05b1fac1, 0x83340580, + 0x0010ce8f, 0x0500004c, 0x59344c00, 0x592c0c0a, + 0x4807c857, 0x4827c857, 0x82040d00, 0x000000ff, + 0x90040583, 0x0500001d, 0x90040585, 0x05000021, + 0x900405a0, 0x0500002c, 0xb0040592, 0x05000036, + 0xb0040590, 0x05000036, 0x900405a1, 0x05000003, + 0x900405a4, 0x05020038, 0x82240500, 0x0000ff00, + 0x82000580, 0x00000700, 0x05000005, 0x60240800, + 0x05d1fa72, 0x60305000, 0x0501f02f, 0x64c65a07, + 0x6426580e, 0x59340400, 0x4802580f, 0x0001fb5b, + 0x05e5ff73, 0x0501f036, 0x41780800, 0x05d1fb53, + 0x600c0800, 0x05d1fa65, 0x60205000, 0x0501f022, 0x59cc3800, 0x821c3d00, 0x00ffffff, 0x4c1c0000, - 0x05c1fa79, 0x5c003800, 0x0502001a, 0x59cc0007, - 0x05ddfdaa, 0x05020017, 0x05d1f9f9, 0x0501f015, + 0x05c1f832, 0x5c003800, 0x0502001b, 0x59cc0007, + 0x05ddfc99, 0x05020018, 0x4a026c00, 0x00000707, + 0x0501f015, 0x82240500, 0x0000ff00, 0x82000580, + 0x00000700, 0x05fc07e2, 0x82240500, 0x000000ff, + 0x90000589, 0x05fc07de, 0x05d1fbad, 0x60285000, + 0x0501f009, 0x60385000, 0x0501f002, 0x60405000, 0x82240500, 0x0000ff00, 0x82000580, 0x00000700, - 0x05fc07e2, 0x82240500, 0x000000ff, 0x90000589, - 0x05fc07de, 0x05d1fd74, 0x60285000, 0x0501f009, - 0x60385000, 0x0501f002, 0x60405000, 0x82240500, - 0x0000ff00, 0x82000580, 0x00000700, 0x05fc07d3, - 0x482a6403, 0x64066203, 0x592c000e, 0x48026013, - 0x497a6015, 0x59a8002f, 0x48026006, 0x417a7800, - 0x05e1f93e, 0x59325819, 0x812e59c0, 0x05000003, - 0x05b5f8ad, 0x497a6019, 0x5c00a800, 0x5c00a000, - 0x5c00b000, 0x5c025800, 0x1c01f000, 0x4d2c0000, - 0x59325809, 0x91380593, 0x05020022, 0x492fc857, - 0x59300c03, 0xb0040594, 0x05000014, 0x90040590, - 0x0500000f, 0x9004058e, 0x0500000d, 0x90040588, - 0x05000008, 0x9004058c, 0x05000006, 0x9004058a, - 0x05b20cef, 0x60180800, 0x05d1fbe9, 0x0501f007, - 0x60100800, 0x05d1fbe6, 0x0501f004, 0x59340200, - 0x8400051a, 0x48026a00, 0x05f5f9e6, 0x05000005, + 0x05fc07d3, 0x482a6403, 0x64066203, 0x592c000e, + 0x48026013, 0x497a6015, 0x59a8002f, 0x48026006, + 0x417a7800, 0x05e1f85f, 0x59325819, 0x812e59c0, + 0x05000003, 0x05b1fe0c, 0x497a6019, 0x5c00a800, + 0x5c00a000, 0x5c00b000, 0x5c025800, 0x1c01f000, + 0x4d2c0000, 0x59325809, 0x91380593, 0x05020031, + 0x492fc857, 0x59300c03, 0xb0040594, 0x05000023, + 0x90040590, 0x0500001e, 0x9004058e, 0x0500001c, + 0x59341400, 0x82081d00, 0x0000ff00, 0x82081500, + 0x000000ff, 0x90040588, 0x0500000d, 0x9004058c, + 0x0500000d, 0x9004058a, 0x05b20a49, 0x820c0580, + 0x00000700, 0x05000011, 0x90080589, 0x0500000f, + 0x60180800, 0x05d1fa11, 0x0501f00c, 0x600c0000, + 0x0501f002, 0x60240000, 0x80080580, 0x05020007, + 0x60100800, 0x05d1fa09, 0x0501f004, 0x59340200, + 0x8400051a, 0x48026a00, 0x05f5f917, 0x05000005, 0x59a80030, 0x48026006, 0x643a6203, 0x0501f025, 0x64025a07, 0x0001fb5b, 0x0005fc5a, 0x0501f021, 0xb13805a1, 0x05000003, 0xb13805a0, 0x05020008, - 0x5c025800, 0x05e1fe1c, 0x05ea005e, 0x59300203, - 0x9000058e, 0x05000019, 0x05b1fcd1, 0x913805a7, - 0x05000009, 0x91380594, 0x05b20ccd, 0x492fc857, - 0x05e1f9ae, 0x60c68000, 0x60100800, 0x61fc1001, - 0x0501f006, 0x492fc857, 0x05e1f9a8, 0x60c68000, + 0x5c025800, 0x05e1fd2e, 0x05e60766, 0x59300203, + 0x9000058e, 0x05000019, 0x05b1fa21, 0x913805a7, + 0x05000009, 0x91380594, 0x05b20a1d, 0x492fc857, + 0x05e1f8c0, 0x60c68000, 0x60100800, 0x61fc1001, + 0x0501f006, 0x492fc857, 0x05e1f8ba, 0x60c68000, 0x60100800, 0x60401000, 0x49425a07, 0x4806580e, - 0x480a580f, 0x0001fb5b, 0x05d5f9a7, 0x05e5ffe0, + 0x480a580f, 0x0001fb5b, 0x05d1ffd6, 0x05e5fee4, 0x5c025800, 0x1c01f000, 0x4933c857, 0xb13805a1, 0x05000003, 0xb13805a0, 0x05020009, 0x4d2c0000, 0x59325809, 0x812e59c0, 0x05000003, 0x64025a07, @@ -22848,32 +23074,32 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x82040580, 0x05000000, 0x0500000a, 0x82040580, 0x21000000, 0x05000027, 0x82040580, 0x24000000, 0x05000024, 0x82040580, 0x20000000, 0x05020025, - 0x05b5f814, 0x05000023, 0x492fc857, 0x492e6019, + 0x05b1fd64, 0x05000023, 0x492fc857, 0x492e6019, 0x59a8b077, 0x9058b41b, 0x8258b500, 0xfffffffc, 0x8058b104, 0x485a5c05, 0x412c7800, 0x41cca000, 0x90580490, 0x05021004, 0x912cac06, 0x0501fae9, 0x0501f010, 0x40580800, 0x603cb000, 0x912cac06, - 0x0501fae4, 0x9004b48f, 0x05b1fffe, 0x05000004, + 0x0501fae4, 0x9004b48f, 0x05b1fd4e, 0x05000004, 0x492c7801, 0x412c7800, 0x05fdf7f2, 0x59325819, - 0x05b5f811, 0x497a6019, 0x80000580, 0x0501f005, + 0x05b1fd61, 0x497a6019, 0x80000580, 0x0501f005, 0x59340200, 0x84000554, 0x48026a00, 0x90000541, 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x5c025800, 0x1c01f000, 0x4933c857, 0x492fc857, 0x4d2c0000, 0x59300a03, 0x90040587, 0x0500002e, 0x9004058e, - 0x05000028, 0x90040581, 0x05b20c55, 0x05e1f9e2, + 0x05000028, 0x90040581, 0x05b209a5, 0x05e1f8f4, 0x4df00000, 0x598c000b, 0x81300580, 0x05020014, 0x59300004, 0x8c000520, 0x05000004, 0x84000520, - 0x48026004, 0x0501f014, 0x42001000, 0x0010af8e, + 0x48026004, 0x0501f014, 0x42001000, 0x0010b20e, 0x50081000, 0x58080002, 0x82000580, 0x00000100, - 0x05000005, 0x5808000b, 0x81300580, 0x05b20c40, - 0x0501f009, 0x05e1fcdb, 0x05020019, 0x59300004, + 0x05000005, 0x5808000b, 0x81300580, 0x05b20990, + 0x0501f009, 0x05e1fbed, 0x05020019, 0x59300004, 0x8c000520, 0x05000004, 0x84000520, 0x48026004, - 0x0501f004, 0x0201f800, 0x0010eee3, 0x80c40040, - 0x5c03e000, 0x05e009ac, 0x05f1fd54, 0x05b00c30, - 0x59325809, 0x64165a07, 0x0001fb5b, 0x05d5f916, - 0x59325819, 0x812e59c0, 0x05b20fcf, 0x05e5ff4c, + 0x0501f004, 0x0201f800, 0x0010f0f2, 0x80c40040, + 0x5c03e000, 0x05e008be, 0x05f1fc85, 0x05b00980, + 0x59325809, 0x64165a07, 0x0001fb5b, 0x05d1ff45, + 0x59325819, 0x812e59c0, 0x05b20d1f, 0x05e5fe50, 0x80000580, 0x5c025800, 0x1c01f000, 0x5c03e000, - 0x05e0099d, 0x59300c07, 0x90040591, 0x05fc07c5, + 0x05e008af, 0x59300c07, 0x90040591, 0x05fc07c5, 0x05fdf7f9, 0x4c040000, 0x59340200, 0x4803c857, 0x8c00051c, 0x05000009, 0x59cc0805, 0x591c001b, 0x4803c857, 0x80040580, 0x05000004, 0x80000580, @@ -22882,24 +23108,24 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x61fc19ff, 0x60102000, 0x0501f010, 0x4c000000, 0x4c0c0000, 0x4c100000, 0x5930200a, 0x58101c03, 0x60102000, 0x0501f009, 0x4c000000, 0x4c0c0000, - 0x4c100000, 0x5930200a, 0x801021c0, 0x05b00bfc, + 0x4c100000, 0x5930200a, 0x801021c0, 0x05b0094c, 0x58101c03, 0x601c2000, 0x480fc857, 0x4813c857, - 0x481bc857, 0x05c1f92e, 0x05c9ff7a, 0x5c002000, + 0x481bc857, 0x05bdfed7, 0x05c9fd95, 0x5c002000, 0x5c001800, 0x5c000000, 0x1c01f000, 0x8d0c0520, 0x05000009, 0x4d400000, 0x4d200000, 0x61fe4001, - 0x850e1d44, 0x60aa8000, 0x05fdfa9b, 0x5c024000, + 0x850e1d44, 0x60aa8000, 0x05fdfa82, 0x5c024000, 0x5c028000, 0x1c01f000, 0x59a8021b, 0x8c000508, 0x05000005, 0x599c0017, 0x8c00050a, 0x05020002, 0x1c01f000, 0x90000541, 0x1c01f000, 0x5930042c, 0x84000540, 0x4802642c, 0x1c01f000, 0x4c640000, - 0x05f5f97e, 0x59300203, 0x90000588, 0x05020010, + 0x05f5f8af, 0x59300203, 0x90000588, 0x05020010, 0x60c8c800, 0x42000000, 0x20000000, 0x41300800, - 0x05b5fab0, 0x0500000a, 0x59300203, 0x90000588, + 0x05b1fffe, 0x0500000a, 0x59300203, 0x90000588, 0x05020007, 0x60780000, 0x80000040, 0x05fe07ff, - 0x8064c840, 0x05fe07f4, 0x05b1fbc5, 0x05f5f976, - 0x5c00c800, 0x1c01f000, 0x05b1ff4e, 0x05b00bc0, + 0x8064c840, 0x05fe07f4, 0x05b1f915, 0x05f5f8a7, + 0x5c00c800, 0x1c01f000, 0x05b1fc9e, 0x05b00910, 0x59340403, 0x49265802, 0x49365803, 0x65565a05, - 0x48025c07, 0x4a025c08, 0x00001000, 0x05f5f8b9, + 0x48025c07, 0x4a025c08, 0x00001000, 0x05f1ffea, 0x05000003, 0x4a025c08, 0x00003000, 0x59340802, 0x82040d00, 0x00ffffff, 0x59300403, 0x82000580, 0x00000086, 0x42000000, 0x85000000, 0x05020003, @@ -22914,7 +23140,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x48065810, 0x1c01f000, 0x492fc857, 0x59a82867, 0x801429c0, 0x05000057, 0x4c5c0000, 0x4c600000, 0x4c640000, 0x4d2c0000, 0x4d300000, 0x42026000, - 0x00110254, 0x592c0c07, 0x592c100a, 0x82081500, + 0x00110484, 0x592c0c07, 0x592c100a, 0x82081500, 0x00ffffff, 0x592c180b, 0x592c200e, 0x40165800, 0x4014c000, 0x4014c800, 0x592c0205, 0x82000580, 0x00000155, 0x05020037, 0x592c0407, 0x80040580, @@ -22924,21 +23150,21 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x80100580, 0x05020027, 0x4c040000, 0x4c080000, 0x4c0c0000, 0x4c100000, 0x40640000, 0x812c0580, 0x05020016, 0x59300203, 0x90000580, 0x0500000f, - 0x59300009, 0x800001c0, 0x0500000c, 0x05e1f8e2, - 0x4df00000, 0x05ddffdf, 0x0201f800, 0x0010eeb1, + 0x59300009, 0x800001c0, 0x0500000c, 0x05ddfff4, + 0x4df00000, 0x05ddfef1, 0x0201f800, 0x0010f0c0, 0x80c40040, 0x05020002, 0x64026203, 0x5c03e000, - 0x05e008c5, 0x497a6009, 0x592cc800, 0x4064c000, + 0x05dc0fd7, 0x497a6009, 0x592cc800, 0x4064c000, 0x4064b800, 0x0501f003, 0x592cb800, 0x485cc000, 0x64165a07, 0x0001fb5b, 0x405e5800, 0x5c002000, 0x5c001800, 0x5c001000, 0x5c000800, 0x0501f003, 0x412cc000, 0x592e5800, 0x812e59c0, 0x05fe07c3, - 0x48675067, 0x48635068, 0x05e5fdd4, 0x5c026000, + 0x48675067, 0x48635068, 0x05e5fcd8, 0x5c026000, 0x5c025800, 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x602c0800, 0x0501f004, 0x60100800, 0x0501f002, 0x60040800, 0x4d2c0000, 0x59325809, 0x812e59c0, 0x0500000f, 0x592c0205, 0x82000500, 0x000000ff, 0x9000058e, 0x0502000a, 0x592c0000, - 0x48026009, 0x497a5800, 0x48065a09, 0x05d9fc60, + 0x48026009, 0x497a5800, 0x48065a09, 0x05d9fb29, 0x05000003, 0x05fdfe6f, 0x0501f002, 0x0001fb5b, 0x5c025800, 0x1c01f000, 0x4817c857, 0x4c000000, 0x4c040000, 0x8c14052a, 0x05000004, 0x5988011e, @@ -22991,58 +23217,58 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4c040000, 0x50000800, 0x80040800, 0x05001002, 0x44040000, 0x5c000800, 0x1c01f000, 0x480fc857, 0x4c000000, 0x900c0580, 0x05020004, 0x42000000, - 0x0010b018, 0x0501f012, 0x820c0580, 0x00001001, - 0x05020004, 0x42000000, 0x0010b019, 0x0501f00c, + 0x0010b298, 0x0501f012, 0x820c0580, 0x00001001, + 0x05020004, 0x42000000, 0x0010b299, 0x0501f00c, 0x820c0580, 0x00001002, 0x05020004, 0x42000000, - 0x0010b01a, 0x0501f006, 0x820c0c80, 0x0000201c, - 0x05b21a3b, 0x900c051f, 0x0c01f804, 0x05fdffde, - 0x5c000000, 0x1c01f000, 0x00109fd6, 0x00109fd9, - 0x00109fdc, 0x00109fdf, 0x00109fe2, 0x00109fe5, - 0x00109fe8, 0x00109feb, 0x00109fee, 0x00109ff1, - 0x00109ff4, 0x00109ff7, 0x00109ffa, 0x00109ffd, - 0x0010a000, 0x0010a003, 0x0010a006, 0x0010a009, - 0x0010a00c, 0x0010a00f, 0x0010a012, 0x0010a015, - 0x0010a018, 0x0010a01b, 0x0010a01e, 0x0010a021, - 0x0010a024, 0x0010a027, 0x42000000, 0x0010b01b, - 0x1c01f000, 0x42000000, 0x0010b01c, 0x1c01f000, - 0x42000000, 0x0010b01d, 0x1c01f000, 0x42000000, - 0x0010b01e, 0x1c01f000, 0x42000000, 0x0010b01f, - 0x1c01f000, 0x42000000, 0x0010b020, 0x1c01f000, - 0x42000000, 0x0010b021, 0x1c01f000, 0x42000000, - 0x0010b022, 0x1c01f000, 0x42000000, 0x0010b023, - 0x1c01f000, 0x42000000, 0x0010b024, 0x1c01f000, - 0x42000000, 0x0010b025, 0x1c01f000, 0x42000000, - 0x0010b026, 0x1c01f000, 0x42000000, 0x0010b027, - 0x1c01f000, 0x42000000, 0x0010b028, 0x1c01f000, - 0x42000000, 0x0010b029, 0x1c01f000, 0x42000000, - 0x0010b02a, 0x1c01f000, 0x42000000, 0x0010b02b, - 0x1c01f000, 0x42000000, 0x0010b02c, 0x1c01f000, - 0x42000000, 0x0010b02d, 0x1c01f000, 0x42000000, - 0x0010b02e, 0x1c01f000, 0x42000000, 0x0010b02f, - 0x1c01f000, 0x42000000, 0x0010b030, 0x1c01f000, - 0x42000000, 0x0010b031, 0x1c01f000, 0x42000000, - 0x0010b032, 0x1c01f000, 0x42000000, 0x0010b033, - 0x1c01f000, 0x42000000, 0x0010b034, 0x1c01f000, - 0x42000000, 0x0010b035, 0x1c01f000, 0x42000000, - 0x0010b036, 0x1c01f000, 0x480fc857, 0x4c000000, - 0x900c0581, 0x05020004, 0x42000000, 0x0010af9b, + 0x0010b29a, 0x0501f006, 0x820c0c80, 0x0000201c, + 0x05ae1f8b, 0x900c051f, 0x0c01f804, 0x05fdffde, + 0x5c000000, 0x1c01f000, 0x0010a286, 0x0010a289, + 0x0010a28c, 0x0010a28f, 0x0010a292, 0x0010a295, + 0x0010a298, 0x0010a29b, 0x0010a29e, 0x0010a2a1, + 0x0010a2a4, 0x0010a2a7, 0x0010a2aa, 0x0010a2ad, + 0x0010a2b0, 0x0010a2b3, 0x0010a2b6, 0x0010a2b9, + 0x0010a2bc, 0x0010a2bf, 0x0010a2c2, 0x0010a2c5, + 0x0010a2c8, 0x0010a2cb, 0x0010a2ce, 0x0010a2d1, + 0x0010a2d4, 0x0010a2d7, 0x42000000, 0x0010b29b, + 0x1c01f000, 0x42000000, 0x0010b29c, 0x1c01f000, + 0x42000000, 0x0010b29d, 0x1c01f000, 0x42000000, + 0x0010b29e, 0x1c01f000, 0x42000000, 0x0010b29f, + 0x1c01f000, 0x42000000, 0x0010b2a0, 0x1c01f000, + 0x42000000, 0x0010b2a1, 0x1c01f000, 0x42000000, + 0x0010b2a2, 0x1c01f000, 0x42000000, 0x0010b2a3, + 0x1c01f000, 0x42000000, 0x0010b2a4, 0x1c01f000, + 0x42000000, 0x0010b2a5, 0x1c01f000, 0x42000000, + 0x0010b2a6, 0x1c01f000, 0x42000000, 0x0010b2a7, + 0x1c01f000, 0x42000000, 0x0010b2a8, 0x1c01f000, + 0x42000000, 0x0010b2a9, 0x1c01f000, 0x42000000, + 0x0010b2aa, 0x1c01f000, 0x42000000, 0x0010b2ab, + 0x1c01f000, 0x42000000, 0x0010b2ac, 0x1c01f000, + 0x42000000, 0x0010b2ad, 0x1c01f000, 0x42000000, + 0x0010b2ae, 0x1c01f000, 0x42000000, 0x0010b2af, + 0x1c01f000, 0x42000000, 0x0010b2b0, 0x1c01f000, + 0x42000000, 0x0010b2b1, 0x1c01f000, 0x42000000, + 0x0010b2b2, 0x1c01f000, 0x42000000, 0x0010b2b3, + 0x1c01f000, 0x42000000, 0x0010b2b4, 0x1c01f000, + 0x42000000, 0x0010b2b5, 0x1c01f000, 0x42000000, + 0x0010b2b6, 0x1c01f000, 0x480fc857, 0x4c000000, + 0x900c0581, 0x05020004, 0x42000000, 0x0010b21b, 0x0501f00f, 0x900c0582, 0x05020004, 0x42000000, - 0x0010af9c, 0x0501f00a, 0x900c0583, 0x05020004, - 0x42000000, 0x0010af9d, 0x0501f005, 0x900c0584, - 0x05020004, 0x42000000, 0x0010af9e, 0x05fdff56, + 0x0010b21c, 0x0501f00a, 0x900c0583, 0x05020004, + 0x42000000, 0x0010b21d, 0x0501f005, 0x900c0584, + 0x05020004, 0x42000000, 0x0010b21e, 0x05fdff56, 0x5c000000, 0x1c01f000, 0x4c000000, 0x59a8021b, 0x4803c857, 0x59240a00, 0x8c04050a, 0x05000010, - 0x8c000506, 0x05000004, 0x42000000, 0x0010afa6, + 0x8c000506, 0x05000004, 0x42000000, 0x0010b226, 0x0501f011, 0x8c00050a, 0x05000004, 0x42000000, - 0x0010afa5, 0x0501f00c, 0x8c000508, 0x05000004, - 0x42000000, 0x0010afa8, 0x0501f007, 0x05d5f9d6, + 0x0010b225, 0x0501f00c, 0x8c000508, 0x05000004, + 0x42000000, 0x0010b228, 0x0501f007, 0x05d5f82b, 0x05000006, 0x8c000506, 0x05020004, 0x42000000, - 0x0010afa7, 0x05fdff38, 0x5c000000, 0x1c01f000, - 0x8058b1c0, 0x05b0098e, 0x5450a800, 0x8050a000, + 0x0010b227, 0x05fdff38, 0x5c000000, 0x1c01f000, + 0x8058b1c0, 0x05ac0ede, 0x5450a800, 0x8050a000, 0x8054a800, 0x8058b040, 0x05fe07fc, 0x1c01f000, - 0x8058b1c0, 0x05b00986, 0x4450a800, 0x8054a800, + 0x8058b1c0, 0x05ac0ed6, 0x4450a800, 0x8054a800, 0x8058b040, 0x05fe07fd, 0x1c01f000, 0x4813c857, - 0x4817c857, 0x40140000, 0x80100480, 0x05b2197c, + 0x4817c857, 0x40140000, 0x80100480, 0x05ae1ecc, 0x497bc841, 0x41787000, 0x42006800, 0x00140000, 0x59a8008a, 0x8c000500, 0x05000003, 0x42006800, 0x0013a000, 0x4837c857, 0x8010048d, 0x05021005, @@ -23053,137 +23279,143 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x40100000, 0x80140580, 0x05fe07f3, 0x45782800, 0x803871c0, 0x05000005, 0x40382800, 0x41787000, 0x80102000, 0x05fdf7eb, 0x1c01f000, 0x8058b1c0, - 0x05b00953, 0x50500000, 0x9c0001c0, 0x4400a800, + 0x05ac0ea3, 0x50500000, 0x9c0001c0, 0x4400a800, 0x8050a000, 0x8054a800, 0x8058b040, 0x05fe07fa, 0x1c01f000, 0x4c000000, 0x59a80007, 0x8c00051c, 0x5c000000, 0x1c01f000, 0x0501f805, 0x60058800, 0x05020002, 0x60018800, 0x1c01f000, 0x59a80007, - 0x8c000518, 0x1c01f000, 0x4200b000, 0x0010b110, - 0x5058b000, 0x1c01f000, 0x42006800, 0x0010b111, + 0x8c000518, 0x1c01f000, 0x4200b000, 0x0010b390, + 0x5058b000, 0x1c01f000, 0x42006800, 0x0010b391, 0x58340406, 0x8c000502, 0x05fc07f8, 0x6004b000, 0x1c01f000, 0x61906800, 0x80346840, 0x05000006, 0x64070000, 0x40000000, 0x59807000, 0x8c380500, 0x05fc07fa, 0x1c01f000, 0x640f0000, 0x40000000, 0x59800000, 0x8c000500, 0x05fc07fc, 0x1c01f000, - 0x00000001, 0x00000002, 0x00000004, 0x00000008, - 0x00000010, 0x00000020, 0x00000040, 0x00000080, - 0x00000100, 0x00000200, 0x00000400, 0x00000800, - 0x00001000, 0x00002000, 0x00004000, 0x00008000, - 0x00010000, 0x00020000, 0x00040000, 0x00080000, - 0x00100000, 0x00200000, 0x00400000, 0x00800000, - 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, - 0x0010b111, 0x0010b11c, 0x0010b127, 0x0010b132, - 0x0010b13d, 0x0010b148, 0x0010b153, 0x0010b15e, - 0x0010b169, 0x0010b174, 0x0010b17f, 0x0010b18a, - 0x0010b195, 0x0010b1a0, 0x0010b1ab, 0x0010b1b6, - 0x0010b1c1, 0x0010b1cc, 0x0010b1d7, 0x0010b1e2, - 0x0010b1ed, 0x0010b1f8, 0x0010b203, 0x0010b20e, - 0x0010b219, 0x0010b224, 0x0010b22f, 0x0010b23a, - 0x0010b245, 0x0010b250, 0x0010b25b, 0x0010b266, - 0x0010b271, 0x0010b27c, 0x0010b287, 0x0010b292, - 0x0010b29d, 0x0010b2a8, 0x0010b2b3, 0x0010b2be, - 0x0010b2c9, 0x0010b2d4, 0x0010b2df, 0x0010b2ea, - 0x0010b2f5, 0x0010b300, 0x0010b30b, 0x0010b316, - 0x0010b321, 0x0010b32c, 0x0010b337, 0x0010b342, - 0x0010b34d, 0x0010b358, 0x0010b363, 0x0010b36e, - 0x0010b379, 0x0010b384, 0x0010b38f, 0x0010b39a, - 0x0010b3a5, 0x0010b3b0, 0x0010b3bb, 0x0010b3c6, - 0x0010b3d1, 0x0010b3dc, 0x0010b3e7, 0x0010b3f2, - 0x0010b3fd, 0x0010b408, 0x0010b413, 0x0010b41e, - 0x0010b429, 0x0010b434, 0x0010b43f, 0x0010b44a, - 0x0010b455, 0x0010b460, 0x0010b46b, 0x0010b476, - 0x0010b481, 0x0010b48c, 0x0010b497, 0x0010b4a2, - 0x0010b4ad, 0x0010b4b8, 0x0010b4c3, 0x0010b4ce, - 0x0010b4d9, 0x0010b4e4, 0x0010b4ef, 0x0010b4fa, - 0x0010b505, 0x0010b510, 0x0010b51b, 0x0010b526, - 0x0010b531, 0x0010b53c, 0x0010b547, 0x0010b552, - 0x0010b55d, 0x0010b568, 0x0010b573, 0x0010b57e, - 0x0010b589, 0x0010b594, 0x0010b59f, 0x0010b5aa, - 0x0010b5b5, 0x0010b5c0, 0x0010b5cb, 0x0010b5d6, - 0x0010b5e1, 0x0010b5ec, 0x0010b5f7, 0x0010b602, - 0x0010b60d, 0x0010b618, 0x0010b623, 0x0010b62e, - 0x0010b639, 0x0010b644, 0x0010b64f, 0x0010b65a, - 0x0010b665, 0x0010b670, 0x0010b67b, 0x0010b686, - 0x0010b691, 0x0010b69c, 0x0010b6a7, 0x0010b6b2, - 0x0010b6bd, 0x0010b6c8, 0x0010b6d3, 0x0010b6de, - 0x0010b6e9, 0x0010b6f4, 0x0010b6ff, 0x0010b70a, - 0x0010b715, 0x0010b720, 0x0010b72b, 0x0010b736, - 0x0010b741, 0x0010b74c, 0x0010b757, 0x0010b762, - 0x0010b76d, 0x0010b778, 0x0010b783, 0x0010b78e, - 0x0010b799, 0x0010b7a4, 0x0010b7af, 0x0010b7ba, - 0x0010b7c5, 0x0010b7d0, 0x0010b7db, 0x0010b7e6, - 0x0010b7f1, 0x0010b7fc, 0x0010b807, 0x0010b812, - 0x0010b81d, 0x0010b828, 0x0010b833, 0x0010b83e, - 0x0010b849, 0x0010b854, 0x0010b85f, 0x0010b86a, - 0x0010b875, 0x0010b880, 0x0010b88b, 0x0010b896, - 0x0010b8a1, 0x0010b8ac, 0x0010b8b7, 0x0010b8c2, - 0x0010b8cd, 0x0010b8d8, 0x0010b8e3, 0x0010b8ee, - 0x0010b8f9, 0x0010b904, 0x0010b90f, 0x0010b91a, - 0x0010b925, 0x0010b930, 0x0010b93b, 0x0010b946, - 0x0010b951, 0x0010b95c, 0x0010b967, 0x0010b972, - 0x0010b97d, 0x0010b988, 0x0010b993, 0x0010b99e, - 0x0010b9a9, 0x0010b9b4, 0x0010b9bf, 0x0010b9ca, - 0x0010b9d5, 0x0010b9e0, 0x0010b9eb, 0x0010b9f6, - 0x0010ba01, 0x0010ba0c, 0x0010ba17, 0x0010ba22, - 0x0010ba2d, 0x0010ba38, 0x0010ba43, 0x0010ba4e, - 0x0010ba59, 0x0010ba64, 0x0010ba6f, 0x0010ba7a, - 0x0010ba85, 0x0010ba90, 0x0010ba9b, 0x0010baa6, - 0x0010bab1, 0x0010babc, 0x0010bac7, 0x0010bad2, - 0x0010badd, 0x0010bae8, 0x0010baf3, 0x0010bafe, - 0x0010bb09, 0x0010bb14, 0x0010bb1f, 0x0010bb2a, - 0x0010bb35, 0x0010bb40, 0x0010bb4b, 0x0010bb56, - 0x0010bb61, 0x0010bb6c, 0x0010bb77, 0x0010bb82, - 0x0010bb8d, 0x0010bb98, 0x0010bba3, 0x0010bbae, - 0x0010bbb9, 0x0010bbc4, 0x0010bbcf, 0x0010bbda, - 0x0010bbe5, 0x0010bbf0, 0x0010bbfb, 0x0010bc06, - 0x40000000, 0x600070e0, 0x60007820, 0x4a007016, - 0x00010001, 0x58380016, 0x8c000500, 0x05fc07fc, - 0x600c4000, 0x60003002, 0x64807808, 0x583c2808, - 0x8c14053e, 0x05000004, 0x80183040, 0x05fe07fc, - 0x0501f00d, 0x583c2808, 0x82140500, 0x20000400, - 0x82000580, 0x00000400, 0x05020005, 0x82140500, - 0x00000300, 0x90000580, 0x05000007, 0x80204040, - 0x05fe07ee, 0x4a007016, 0x00010000, 0x90000541, - 0x0501f040, 0x650c7808, 0x583c0009, 0x8c000500, - 0x05000005, 0x60002000, 0x4a007016, 0x00010000, - 0x0501f037, 0x65007808, 0x583c5809, 0x65047808, - 0x583c6009, 0x65087808, 0x583c6809, 0x4a007016, - 0x00010000, 0x82102d00, 0xf0000000, 0x90140580, - 0x05000002, 0x0501f020, 0x60202800, 0x60003000, - 0x803000c8, 0x40003800, 0x8030010a, 0x801c3d80, - 0x40300000, 0x80180580, 0x80100400, 0x801c0400, - 0x802c5c00, 0x803400c8, 0x40003800, 0x8034010a, - 0x801c3d80, 0x40340000, 0x80180580, 0x801c0400, - 0x80306400, 0x802c00c8, 0x40003800, 0x802c010a, - 0x801c3d80, 0x402c0000, 0x80180580, 0x801c0400, - 0x80346c00, 0x82183400, 0x9e3779b9, 0x80142840, - 0x05fe07e4, 0x0502000b, 0x402c0000, 0x80040580, - 0x05fe07c7, 0x40300000, 0x80080580, 0x05fe07c4, - 0x40340000, 0x800c0580, 0x05fe07c1, 0x80000580, - 0x1c01f000, 0x1c01f000, 0x42005000, 0x7ff4c000, - 0x58280800, 0x58281001, 0x58281802, 0x58282003, - 0x05fdff98, 0x05020807, 0x82101d00, 0x0fffffff, - 0x480fc021, 0x900c01c0, 0x4803c022, 0x1c01f000, - 0x497bc021, 0x497bc022, 0x4a03c020, 0x00004020, - 0x4a03c011, 0x40200011, 0x6016d800, 0x05027011, - 0x59e00020, 0x90000582, 0x0502000e, 0x05006000, - 0x4203e000, 0x40000000, 0x59e00017, 0x60000800, - 0x8c00050a, 0x05ba0808, 0x8d0c0530, 0x05b60ff4, - 0x05b60ff6, 0x6403c017, 0x4203e000, 0x30000001, - 0x05b1f950, 0x05fdf7ff, 0x59a8088d, 0x8c100502, - 0x05000003, 0x84040d42, 0x0501f007, 0x8c100504, - 0x05000003, 0x84040d44, 0x0501f003, 0x8c100500, - 0x84040d40, 0x4807508d, 0x1c01f000, 0x59a8008d, - 0x8c000502, 0x05000009, 0x4a03508e, 0x0000008b, - 0x4a03508f, 0x0000008b, 0x4a035090, 0x0000008b, - 0x64135091, 0x0501f00c, 0x8c000504, 0x05000006, - 0x65bf508e, 0x65bf508f, 0x65df5090, 0x64035091, - 0x0501f005, 0x64cf508e, 0x64cf508f, 0x64975090, - 0x64035091, 0x1c01f000, 0xddc3f135, - 0x00000000, 0x00000000, 0x00111000, 0x00004503, + 0x0501f805, 0x60058800, 0x05020002, 0x60018800, + 0x1c01f000, 0x42006800, 0x0010b391, 0x58340406, + 0x8c000504, 0x1c01f000, 0x0501f805, 0x60058800, + 0x05020002, 0x60018800, 0x1c01f000, 0x42006800, + 0x0010b391, 0x58340406, 0x8c000508, 0x1c01f000, + 0x59a80006, 0x8c000516, 0x1c01f000, 0x00000001, + 0x00000002, 0x00000004, 0x00000008, 0x00000010, + 0x00000020, 0x00000040, 0x00000080, 0x00000100, + 0x00000200, 0x00000400, 0x00000800, 0x00001000, + 0x00002000, 0x00004000, 0x00008000, 0x00010000, + 0x00020000, 0x00040000, 0x00080000, 0x00100000, + 0x00200000, 0x00400000, 0x00800000, 0x01000000, + 0x02000000, 0x04000000, 0x08000000, 0x10000000, + 0x20000000, 0x40000000, 0x80000000, 0x0010b391, + 0x0010b39c, 0x0010b3a7, 0x0010b3b2, 0x0010b3bd, + 0x0010b3c8, 0x0010b3d3, 0x0010b3de, 0x0010b3e9, + 0x0010b3f4, 0x0010b3ff, 0x0010b40a, 0x0010b415, + 0x0010b420, 0x0010b42b, 0x0010b436, 0x0010b441, + 0x0010b44c, 0x0010b457, 0x0010b462, 0x0010b46d, + 0x0010b478, 0x0010b483, 0x0010b48e, 0x0010b499, + 0x0010b4a4, 0x0010b4af, 0x0010b4ba, 0x0010b4c5, + 0x0010b4d0, 0x0010b4db, 0x0010b4e6, 0x0010b4f1, + 0x0010b4fc, 0x0010b507, 0x0010b512, 0x0010b51d, + 0x0010b528, 0x0010b533, 0x0010b53e, 0x0010b549, + 0x0010b554, 0x0010b55f, 0x0010b56a, 0x0010b575, + 0x0010b580, 0x0010b58b, 0x0010b596, 0x0010b5a1, + 0x0010b5ac, 0x0010b5b7, 0x0010b5c2, 0x0010b5cd, + 0x0010b5d8, 0x0010b5e3, 0x0010b5ee, 0x0010b5f9, + 0x0010b604, 0x0010b60f, 0x0010b61a, 0x0010b625, + 0x0010b630, 0x0010b63b, 0x0010b646, 0x0010b651, + 0x0010b65c, 0x0010b667, 0x0010b672, 0x0010b67d, + 0x0010b688, 0x0010b693, 0x0010b69e, 0x0010b6a9, + 0x0010b6b4, 0x0010b6bf, 0x0010b6ca, 0x0010b6d5, + 0x0010b6e0, 0x0010b6eb, 0x0010b6f6, 0x0010b701, + 0x0010b70c, 0x0010b717, 0x0010b722, 0x0010b72d, + 0x0010b738, 0x0010b743, 0x0010b74e, 0x0010b759, + 0x0010b764, 0x0010b76f, 0x0010b77a, 0x0010b785, + 0x0010b790, 0x0010b79b, 0x0010b7a6, 0x0010b7b1, + 0x0010b7bc, 0x0010b7c7, 0x0010b7d2, 0x0010b7dd, + 0x0010b7e8, 0x0010b7f3, 0x0010b7fe, 0x0010b809, + 0x0010b814, 0x0010b81f, 0x0010b82a, 0x0010b835, + 0x0010b840, 0x0010b84b, 0x0010b856, 0x0010b861, + 0x0010b86c, 0x0010b877, 0x0010b882, 0x0010b88d, + 0x0010b898, 0x0010b8a3, 0x0010b8ae, 0x0010b8b9, + 0x0010b8c4, 0x0010b8cf, 0x0010b8da, 0x0010b8e5, + 0x0010b8f0, 0x0010b8fb, 0x0010b906, 0x0010b911, + 0x0010b91c, 0x0010b927, 0x0010b932, 0x0010b93d, + 0x0010b948, 0x0010b953, 0x0010b95e, 0x0010b969, + 0x0010b974, 0x0010b97f, 0x0010b98a, 0x0010b995, + 0x0010b9a0, 0x0010b9ab, 0x0010b9b6, 0x0010b9c1, + 0x0010b9cc, 0x0010b9d7, 0x0010b9e2, 0x0010b9ed, + 0x0010b9f8, 0x0010ba03, 0x0010ba0e, 0x0010ba19, + 0x0010ba24, 0x0010ba2f, 0x0010ba3a, 0x0010ba45, + 0x0010ba50, 0x0010ba5b, 0x0010ba66, 0x0010ba71, + 0x0010ba7c, 0x0010ba87, 0x0010ba92, 0x0010ba9d, + 0x0010baa8, 0x0010bab3, 0x0010babe, 0x0010bac9, + 0x0010bad4, 0x0010badf, 0x0010baea, 0x0010baf5, + 0x0010bb00, 0x0010bb0b, 0x0010bb16, 0x0010bb21, + 0x0010bb2c, 0x0010bb37, 0x0010bb42, 0x0010bb4d, + 0x0010bb58, 0x0010bb63, 0x0010bb6e, 0x0010bb79, + 0x0010bb84, 0x0010bb8f, 0x0010bb9a, 0x0010bba5, + 0x0010bbb0, 0x0010bbbb, 0x0010bbc6, 0x0010bbd1, + 0x0010bbdc, 0x0010bbe7, 0x0010bbf2, 0x0010bbfd, + 0x0010bc08, 0x0010bc13, 0x0010bc1e, 0x0010bc29, + 0x0010bc34, 0x0010bc3f, 0x0010bc4a, 0x0010bc55, + 0x0010bc60, 0x0010bc6b, 0x0010bc76, 0x0010bc81, + 0x0010bc8c, 0x0010bc97, 0x0010bca2, 0x0010bcad, + 0x0010bcb8, 0x0010bcc3, 0x0010bcce, 0x0010bcd9, + 0x0010bce4, 0x0010bcef, 0x0010bcfa, 0x0010bd05, + 0x0010bd10, 0x0010bd1b, 0x0010bd26, 0x0010bd31, + 0x0010bd3c, 0x0010bd47, 0x0010bd52, 0x0010bd5d, + 0x0010bd68, 0x0010bd73, 0x0010bd7e, 0x0010bd89, + 0x0010bd94, 0x0010bd9f, 0x0010bdaa, 0x0010bdb5, + 0x0010bdc0, 0x0010bdcb, 0x0010bdd6, 0x0010bde1, + 0x0010bdec, 0x0010bdf7, 0x0010be02, 0x0010be0d, + 0x0010be18, 0x0010be23, 0x0010be2e, 0x0010be39, + 0x0010be44, 0x0010be4f, 0x0010be5a, 0x0010be65, + 0x0010be70, 0x0010be7b, 0x0010be86, 0x40000000, + 0x600070e0, 0x60007820, 0x4a007016, 0x00010001, + 0x58380016, 0x8c000500, 0x05fc07fc, 0x600c4000, + 0x60003002, 0x64807808, 0x583c2808, 0x8c14053e, + 0x05000004, 0x80183040, 0x05fe07fc, 0x0501f00d, + 0x583c2808, 0x82140500, 0x20000400, 0x82000580, + 0x00000400, 0x05020005, 0x82140500, 0x00000300, + 0x90000580, 0x05000007, 0x80204040, 0x05fe07ee, + 0x4a007016, 0x00010000, 0x90000541, 0x0501f040, + 0x650c7808, 0x583c0009, 0x8c000500, 0x05000005, + 0x60002000, 0x4a007016, 0x00010000, 0x0501f037, + 0x65007808, 0x583c5809, 0x65047808, 0x583c6009, + 0x65087808, 0x583c6809, 0x4a007016, 0x00010000, + 0x82102d00, 0xf0000000, 0x90140580, 0x05000002, + 0x0501f020, 0x60202800, 0x60003000, 0x803000c8, + 0x40003800, 0x8030010a, 0x801c3d80, 0x40300000, + 0x80180580, 0x80100400, 0x801c0400, 0x802c5c00, + 0x803400c8, 0x40003800, 0x8034010a, 0x801c3d80, + 0x40340000, 0x80180580, 0x801c0400, 0x80306400, + 0x802c00c8, 0x40003800, 0x802c010a, 0x801c3d80, + 0x402c0000, 0x80180580, 0x801c0400, 0x80346c00, + 0x82183400, 0x9e3779b9, 0x80142840, 0x05fe07e4, + 0x0502000b, 0x402c0000, 0x80040580, 0x05fe07c7, + 0x40300000, 0x80080580, 0x05fe07c4, 0x40340000, + 0x800c0580, 0x05fe07c1, 0x80000580, 0x1c01f000, + 0x1c01f000, 0x42005000, 0x7ff4c000, 0x58280800, + 0x58281001, 0x58281802, 0x58282003, 0x05fdff98, + 0x05020807, 0x82101d00, 0x0fffffff, 0x480fc021, + 0x900c01c0, 0x4803c022, 0x1c01f000, 0x497bc021, + 0x497bc022, 0x4a03c020, 0x00004020, 0x4a03c011, + 0x40200011, 0x6016d800, 0x05027011, 0x59e00020, + 0x90000582, 0x0502000e, 0x05006000, 0x4203e000, + 0x40000000, 0x59e00017, 0x60000800, 0x8c00050a, + 0x05b60d3f, 0x8d0c0530, 0x05b60d2b, 0x05b60d2d, + 0x6403c017, 0x4203e000, 0x30000001, 0x05adfe89, + 0x05fdf7ff, 0x59a8088d, 0x8c100502, 0x05000003, + 0x84040d42, 0x0501f007, 0x8c100504, 0x05000003, + 0x84040d44, 0x0501f003, 0x8c100500, 0x84040d40, + 0x4807508d, 0x1c01f000, 0x59a8008d, 0x8c000502, + 0x05000009, 0x4a03508e, 0x0000008b, 0x4a03508f, + 0x0000008b, 0x4a035090, 0x0000008b, 0x64135091, + 0x0501f00c, 0x8c000504, 0x05000006, 0x65bf508e, + 0x65bf508f, 0x65df5090, 0x64035091, 0x0501f005, + 0x64cf508e, 0x64cf508f, 0x64975090, 0x64035091, + 0x1c01f000, 0x7334598d, + 0x00000000, 0x00000000, 0x00111000, 0x00004538, 0x00000000, 0x00000000, 0x00020000, 0x00000d9e, - 0x916c0583, 0x01020181, 0x42000000, 0x0010ac31, + 0x916c0583, 0x01020181, 0x42000000, 0x0010aeb1, 0x50000000, 0x800001c0, 0x05020a32, 0x0501f9ee, 0x0501fd66, 0x0501fb68, 0x59a8006c, 0x80000540, 0x01020e90, 0x0505f9f3, 0x05fdf7f2, 0x915c04a0, @@ -23210,7 +23442,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x8c040508, 0x010209ef, 0x42007000, 0x00020d9f, 0x58380000, 0x90001484, 0x0c001003, 0x0101f9ef, 0x1c01f000, 0x00020031, 0x00020071, 0x00020078, - 0x00101060, 0x82040d00, 0x43200f80, 0x01020633, + 0x0010105e, 0x82040d00, 0x43200f80, 0x01020633, 0x58380002, 0x80000540, 0x05000008, 0x0101f626, 0x82040d00, 0x43200f80, 0x01020633, 0x58380002, 0x80000540, 0x05fe07d6, 0x58386001, 0x58300008, @@ -23230,7 +23462,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x58300802, 0x82040580, 0x00000100, 0x01020640, 0x4d2c0000, 0x40325800, 0x0101fd8d, 0x5c025800, 0x0101f64b, 0x59b800ea, 0x82000d00, 0xf2000038, - 0x010207c2, 0x8c000510, 0x010007c1, 0x59ba60e0, + 0x010207c0, 0x8c000510, 0x010007bf, 0x59ba60e0, 0x81300182, 0x0502104c, 0x05002030, 0x8532653e, 0x59300407, 0x90000583, 0x0502002a, 0x59300203, 0x90000584, 0x05020027, 0x59325809, 0x59300004, @@ -23241,8 +23473,8 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x0505fb7a, 0x5934000f, 0x8d0c0512, 0x05020005, 0x5934140b, 0x80081040, 0x05001002, 0x480a6c0b, 0x80000540, 0x05020a0b, 0x59b800ea, 0x8c000510, - 0x05fe07d7, 0x1c01f000, 0x0131fb35, 0x05fc07e6, - 0x0101f7ba, 0x59300221, 0x48025c10, 0x05fdf7e8, + 0x05fe07d7, 0x1c01f000, 0x0131fcf7, 0x05fc07e6, + 0x0101f7b8, 0x59300221, 0x48025c10, 0x05fdf7e8, 0x61567000, 0x0501f024, 0x83326500, 0x3fffffff, 0x59300407, 0x90000583, 0x05020015, 0x59325809, 0x5932680a, 0x4a025a05, 0x00000103, 0x497a580a, @@ -23251,15 +23483,15 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x5934140b, 0x80081040, 0x05001002, 0x480a6c0b, 0x80000540, 0x050209e7, 0x05fdf7dc, 0x61527000, 0x0501f009, 0x83300500, 0x60000000, 0x05000011, - 0x81326580, 0x8000013a, 0x82000400, 0x001007c6, - 0x50027000, 0x59300c07, 0x90040582, 0x010007ba, + 0x81326580, 0x8000013a, 0x82000400, 0x001007c4, + 0x50027000, 0x59300c07, 0x90040582, 0x010007b8, 0x59300004, 0x8c00053e, 0x05020003, 0x0505fb59, - 0x05fdf7ca, 0x0131fb35, 0x05fc07fd, 0x0101f7ba, - 0x83300500, 0x1f000000, 0x010007bc, 0x81326580, + 0x05fdf7ca, 0x0131fcf7, 0x05fc07fd, 0x0101f7b8, + 0x83300500, 0x1f000000, 0x010007ba, 0x81326580, 0x80000130, 0x90000c94, 0x010219ef, 0x1201f000, - 0x001007ca, 0x82000500, 0xf0000000, 0x82040d00, + 0x001007c8, 0x82000500, 0xf0000000, 0x82040d00, 0x0fffffff, 0x80040d40, 0x4807c857, 0x59b800ea, - 0x8c000516, 0x010600b1, 0x480770e1, 0x1c01f000, + 0x8c000516, 0x010600af, 0x480770e1, 0x1c01f000, 0x59325809, 0x412c7000, 0x58380a05, 0x82040d00, 0x000000ff, 0xb00405a8, 0x01040314, 0xb00405aa, 0x01040314, 0xb00405ba, 0x0104032d, 0xb00405b2, @@ -23290,43 +23522,43 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4802600c, 0x481a600d, 0x481e600e, 0x480e600f, 0x843c7d4a, 0x403c1000, 0x1c01f000, 0x59e00004, 0x8c00050e, 0x05fe06b2, 0x1c01f000, 0x42001000, - 0x0010cfad, 0x58080009, 0x80000540, 0x010a024a, - 0x4a001003, 0x0010cfb6, 0x4c080000, 0x0501f812, + 0x0010d22d, 0x58080009, 0x80000540, 0x010a0248, + 0x4a001003, 0x0010d236, 0x4c080000, 0x0501f812, 0x5c001000, 0x48141009, 0x480c1006, 0x48101007, 0x64001001, 0x64101005, 0x64041004, 0x05fdf65d, - 0x58300802, 0x82040580, 0x00000100, 0x010a0259, - 0x82300580, 0x0010cfad, 0x010a0254, 0x49786009, + 0x58300802, 0x82040580, 0x00000100, 0x010a0257, + 0x82300580, 0x0010d22d, 0x010a0252, 0x49786009, 0x1c01f000, 0x61901800, 0x800c1840, 0x05000006, 0x64070000, 0x40000000, 0x59800000, 0x8c000500, - 0x05fc07fa, 0x010802ab, 0x600028f4, 0x58142024, + 0x05fc07fa, 0x010802a9, 0x600028f4, 0x58142024, 0x58141823, 0x58142825, 0x64030000, 0x1c01f000, 0x4c000000, 0x4df00000, 0x4203e000, 0xb0100000, - 0x41f00000, 0x81fe1500, 0x8d080512, 0x010a0c80, + 0x41f00000, 0x81fe1500, 0x8d080512, 0x010a0c7e, 0x8d08051c, 0x0506095d, 0x8d080518, 0x05060990, 0x8d08051a, 0x05fe0ed8, 0x83080500, 0x00000d00, 0x05020804, 0x5c03e000, 0x5c000000, 0x1801f000, - 0x8d080516, 0x010a0ac6, 0x8d080514, 0x05fe0fbc, + 0x8d080516, 0x010a0ac4, 0x8d080514, 0x05fe0fbc, 0x8d080508, 0x01060ee2, 0x8d080500, 0x050608e3, - 0x8d08050c, 0x010a0b85, 0x8d08050a, 0x010a001b, - 0x1c01f000, 0x42000000, 0x0010ac37, 0x50000000, - 0x8c000504, 0x05000014, 0x42000000, 0x0010ac37, + 0x8d08050c, 0x010a0b83, 0x8d08050a, 0x010a0019, + 0x1c01f000, 0x42000000, 0x0010aeb7, 0x50000000, + 0x8c000504, 0x05000014, 0x42000000, 0x0010aeb7, 0x50000000, 0x8c000502, 0x05020002, 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, 0x42034000, - 0x0010ac19, 0x59a0001e, 0x59a1d806, 0x84000502, + 0x0010ae99, 0x59a0001e, 0x59a1d806, 0x84000502, 0x4803401e, 0x58ec0008, 0x0801f800, 0x5c03e000, 0x1c01f000, 0x05027002, 0x05026002, 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, 0x59e00020, 0xb0000d85, 0x05000003, 0xb0000d84, 0x05020007, 0x4803c857, 0x42000800, 0x00020d9f, 0x58040800, 0x90040d80, 0x05020019, 0x0101fd7c, 0x05000017, - 0x412dd800, 0x48efc857, 0x0119fddd, 0x42034000, - 0x0010ac19, 0x49a1d80a, 0x48ef4006, 0x59a0001e, + 0x412dd800, 0x48efc857, 0x0119fea8, 0x42034000, + 0x0010ae99, 0x49a1d80a, 0x48ef4006, 0x59a0001e, 0x84000544, 0x4803401e, 0x59e00020, 0x4803c857, 0x59e00021, 0x4803c857, 0x59e00022, 0x4803c857, 0x59e00023, 0x4803c857, 0x59e00024, 0x4803c857, - 0x0111f917, 0x0111f92f, 0x5c03e000, 0x1c01f000, + 0x0111f9ba, 0x0111f9d2, 0x5c03e000, 0x1c01f000, 0x4c5c0000, 0x4da00000, 0x4df00000, 0x4203e000, - 0x50000000, 0x05006062, 0x42034000, 0x0010ac19, + 0x50000000, 0x05006062, 0x42034000, 0x0010ae99, 0x59a01018, 0x59a01819, 0x800c19c0, 0x05020009, 0x59a0381c, 0x801c39c0, 0x010009ef, 0x49a3c857, 0x481fc857, 0x59a0041d, 0x801c3c00, 0x0501f00a, @@ -23352,8 +23584,8 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x42000800, 0x25000000, 0x585c1800, 0x585c3001, 0x900c19c0, 0x901831c0, 0x0101fab2, 0x5c03e000, 0x5c034000, 0x5c00b800, 0x1c01f000, 0x910c0503, - 0x011e0714, 0x59340400, 0x82000580, 0x00000606, - 0x011e06ee, 0x5934000d, 0x80027d40, 0x011e071d, + 0x011e07e7, 0x59340400, 0x82000580, 0x00000606, + 0x011e07c1, 0x5934000d, 0x80027d40, 0x011e07f0, 0x5934000f, 0x59341203, 0x80080540, 0x05020021, 0x8d0c0512, 0x05000010, 0x0505f987, 0x05000017, 0x59a8008e, 0x80000040, 0x05fe07ff, 0x492e6009, @@ -23368,7 +23600,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x80000d40, 0x05020008, 0x492e680f, 0x592c0407, 0x800000c2, 0x800018c4, 0x800c0400, 0x48025804, 0x1c01f000, 0x492c0800, 0x05fdf7f9, 0x83440c80, - 0x00000800, 0x05021009, 0x83440400, 0x0010a380, + 0x00000800, 0x05021009, 0x83440400, 0x0010a600, 0x50000000, 0x80000540, 0x05000004, 0x40026800, 0x80000580, 0x1c01f000, 0x90000541, 0x1c01f000, 0x59340203, 0x80000540, 0x0502002f, 0x4d300000, @@ -23386,22 +23618,22 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x5c026000, 0x1c01f000, 0x497a5800, 0x4932580a, 0x641a6407, 0x641e6203, 0x0501f802, 0x05fdf7eb, 0x592e4408, 0x83224500, 0x000000ff, 0x83200400, - 0x0010a0ec, 0x50024800, 0x4926601d, 0x592c020d, - 0x48026202, 0x59240206, 0x8c000510, 0x012202f5, - 0x8d0c050e, 0x012202f3, 0x59240200, 0x8c000516, - 0x012202f1, 0x59340200, 0x8c000518, 0x012202ef, - 0x64025a07, 0x8c000508, 0x012202ed, 0x492e6009, + 0x0010a3b3, 0x50024800, 0x4926601d, 0x592c020d, + 0x48026202, 0x59240206, 0x8c000510, 0x012203cf, + 0x8d0c050e, 0x012203cd, 0x59240200, 0x8c000516, + 0x012203cb, 0x59340200, 0x8c000518, 0x012203c9, + 0x64025a07, 0x8c000508, 0x012203c7, 0x492e6009, 0x4d3c0000, 0x417a7800, 0x0501ff96, 0x5c027800, 0x1c01f000, 0x58040001, 0x49680800, 0x49780801, 0x815eb800, 0x4006d000, 0x80000d40, 0x05fe07fa, 0x497a5801, 0x59c80000, 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, 0x59980013, 0x48032823, 0x59d8010b, 0x48033014, 0x1c01f000, 0x592c0405, - 0x8c00051e, 0x012207d9, 0x497a5800, 0x8d0c0526, + 0x8c00051e, 0x012600d6, 0x497a5800, 0x8d0c0526, 0x0502000d, 0x0502d007, 0x592c0001, 0x492fb107, 0x80000d40, 0x05fe0fe4, 0x0500e0de, 0x1c01f000, - 0x0500e8dc, 0x05fcd7f9, 0x42000000, 0x0010afaf, - 0x014dff98, 0x0501f939, 0x0500d944, 0x0500e0d5, + 0x0500e8dc, 0x05fcd7f9, 0x42000000, 0x0010b22f, + 0x0151fa48, 0x0501f939, 0x0500d944, 0x0500e0d5, 0x59d80105, 0x82000d00, 0x01218780, 0x05020152, 0x1c01f000, 0x59980011, 0x0c01f001, 0x0002037b, 0x0002037c, 0x00020387, 0x000203c7, 0x1c01f000, @@ -23486,8 +23718,8 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x58040000, 0x4807b107, 0x80000d40, 0x05020005, 0x48033016, 0x850e1d26, 0x48033017, 0x1c01f000, 0x05fcd7f8, 0x05fdf7fd, 0x59d80105, 0x82000500, - 0x01218780, 0x05020004, 0x42000000, 0x0010afaf, - 0x014df798, 0x4803c857, 0x485fc857, 0x8c00050e, + 0x01218780, 0x05020004, 0x42000000, 0x0010b22f, + 0x0151f248, 0x4803c857, 0x485fc857, 0x8c00050e, 0x010209e5, 0x4203e000, 0x50000000, 0x6010b900, 0x0101f1f3, 0x05fce777, 0x59d80105, 0x82000500, 0x01218780, 0x05fe07f4, 0x8d0c0524, 0x05020002, @@ -23531,9 +23763,9 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x05020007, 0x6403c017, 0x4203e000, 0x30000001, 0x1c01f000, 0x05fdfb1f, 0x05fdf7fb, 0x8c000500, 0x05fe0c3f, 0x05fdf7f8, 0x41700000, 0x0c01f001, - 0x00104e19, 0x0002057d, 0x00104e19, 0x00020639, - 0x00104e18, 0x00104e18, 0x00104e18, 0x00104e18, - 0x00105305, 0x0501002e, 0x59980004, 0x80000540, + 0x00104f1e, 0x0002057d, 0x00104f1e, 0x00020639, + 0x00104f1d, 0x00104f1d, 0x00104f1d, 0x00104f1d, + 0x0010547e, 0x0501002e, 0x59980004, 0x80000540, 0x05020032, 0x0502c018, 0x6042f800, 0x4df00000, 0x4203e000, 0x50000000, 0x49db3003, 0x59da5808, 0x592c2a05, 0x497a5800, 0x497a5801, 0x82140500, @@ -23541,72 +23773,72 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x5c03e000, 0x817ef840, 0x05000007, 0x916c0583, 0x05020005, 0x91700581, 0x0502000e, 0x05010015, 0x05fcc7eb, 0x0500fb67, 0x0500b353, 0x59d40005, - 0x82000500, 0x43218780, 0x012a00f7, 0x59d80005, - 0x82000500, 0x43218780, 0x012a00fd, 0x1c01f000, + 0x82000500, 0x43218780, 0x012a020f, 0x59d80005, + 0x82000500, 0x43218780, 0x012a0215, 0x1c01f000, 0x91700583, 0x05000894, 0x91700581, 0x05fe07f2, 0x05010004, 0x05fcc7da, 0x05fdf7ef, 0x6042f800, 0x4df00000, 0x4203e000, 0x50000000, 0x49d73003, 0x59d65808, 0x05fdf7d7, 0x4df00000, 0x4203e000, 0x50000000, 0x40025800, 0x592c2a05, 0x497b3003, - 0x497b3004, 0x6042f800, 0x05fdf7d1, 0x0125fe6a, - 0x5c03e000, 0x05fdf7dc, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104ef2, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e76, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104f0f, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x000207b6, 0x00104e6a, 0x0002085f, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00020655, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104eb8, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00105109, 0x0010521a, - 0x00104e6a, 0x0010509b, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x001050de, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x001052d3, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x000208bc, 0x001052a1, 0x00104e6a, 0x001052c9, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00020660, 0x00104e6a, - 0x00020668, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x0002080f, 0x00104e6a, 0x00104e6a, 0x00104e6a, - 0x00104e6a, 0x00104e6a, 0x00104e6a, 0x00104e6a, + 0x497b3004, 0x6042f800, 0x05fdf7d1, 0x0125ff6f, + 0x5c03e000, 0x05fdf7dc, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104ff7, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f7b, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00105014, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x000207b6, 0x00104f6f, 0x0002085f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00020655, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104fbd, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00105221, 0x00105370, + 0x00104f6f, 0x001051b1, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x001051f6, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x0010544c, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x000208bc, 0x0010541a, 0x00104f6f, 0x00105442, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00020660, 0x00104f6f, + 0x00020668, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x0002080f, 0x00104f6f, 0x00104f6f, 0x00104f6f, + 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00104f6f, 0x00020668, 0x4df00000, 0x4203e000, 0x50000000, - 0x59981003, 0x800811c0, 0x0124061d, 0x58080005, - 0x82000d00, 0x43218780, 0x012a00fd, 0x8c000508, - 0x0124061b, 0x580a5808, 0x592c0205, 0x497a5800, + 0x59981003, 0x800811c0, 0x01240722, 0x58080005, + 0x82000d00, 0x43218780, 0x012a0215, 0x8c000508, + 0x01240720, 0x580a5808, 0x592c0205, 0x497a5800, 0x497a5801, 0x82000500, 0x000000ff, 0xb0000c8b, - 0x0126161a, 0x1201f800, 0x00104e1f, 0x5c03e000, + 0x0126171f, 0x1201f800, 0x00104f24, 0x5c03e000, 0x91700583, 0x05fc07e8, 0x0500faae, 0x0500b29a, 0x1c01f000, 0x80140110, 0x80000040, 0x0500013a, - 0x01241670, 0x4a033006, 0x00020791, 0x48033000, + 0x01241775, 0x4a033006, 0x00020791, 0x48033000, 0x492f3001, 0x492f3002, 0x600ee000, 0x1c01f000, - 0x497a5802, 0x80140110, 0x80000040, 0x01240670, - 0x01241670, 0x4a033006, 0x000206f8, 0x05fdf7f4, - 0x497a5802, 0x80140110, 0x80000040, 0x01260670, - 0x592c0208, 0x82000480, 0x00001001, 0x0126167c, - 0x592c0014, 0xb0000580, 0x0126067c, 0x4d2c0000, + 0x497a5802, 0x80140110, 0x80000040, 0x01240775, + 0x01241775, 0x4a033006, 0x000206f8, 0x05fdf7f4, + 0x497a5802, 0x80140110, 0x80000040, 0x01260775, + 0x592c0208, 0x82000480, 0x00001001, 0x01261781, + 0x592c0014, 0xb0000580, 0x01260781, 0x4d2c0000, 0x0101fd69, 0x05000010, 0x412c6800, 0x5c025800, - 0x600ae000, 0x42001000, 0x0010ccbb, 0x592c2012, + 0x600ae000, 0x42001000, 0x0010cf3b, 0x592c2012, 0x592c2813, 0x90340402, 0x48001003, 0x48101006, 0x48141007, 0x48341009, 0x492c100a, 0x05fdf999, 0x1c01f000, 0x5c025800, 0x492f3000, 0x6022e000, 0x4a033005, 0x0002068b, 0x1c01f000, 0x6006e000, 0x412c6800, 0x599a5800, 0x05fdf7ea, 0x4d2c0000, 0x5832580a, 0x592c5a05, 0x4978600a, 0x812e59c0, - 0x012406b0, 0x58300002, 0x82000580, 0x00000100, - 0x01260696, 0x42000000, 0x0010ccba, 0x50007000, + 0x012407b5, 0x58300002, 0x82000580, 0x00000100, + 0x0126079b, 0x42000000, 0x0010cf3a, 0x50007000, 0x58306809, 0x58340002, 0x592c0806, 0x80040580, - 0x0126069a, 0x58340803, 0x58341004, 0x58341805, + 0x0126079f, 0x58340803, 0x58341004, 0x58341805, 0x48065812, 0x480a5813, 0x480e5814, 0x822c0d80, 0x0000016a, 0x0502000e, 0x592c0a0b, 0x58342c06, 0x5834180c, 0x5834200d, 0x5834100e, 0x8c040504, @@ -23614,9 +23846,9 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4810680a, 0x4808680b, 0x0501f035, 0x592c0c0b, 0x90040d04, 0x592c0408, 0x80000110, 0x90000508, 0x80040d40, 0x05fdf7ee, 0x82080500, 0xffff0003, - 0x0126069a, 0x8c140510, 0x05000016, 0x5834380f, + 0x0126079f, 0x8c140510, 0x05000016, 0x5834380f, 0x58344010, 0x58343011, 0x8c040506, 0x05000004, - 0x82180500, 0xffff0003, 0x0126069a, 0x8c040504, + 0x82180500, 0xffff0003, 0x0126079f, 0x8c040504, 0x05020009, 0x8c040506, 0x0500001d, 0x481c7006, 0x48207007, 0x40181000, 0x603c3000, 0x607c3800, 0x0501f00f, 0x481c7010, 0x48207011, 0x48187012, @@ -23624,16 +23856,16 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x60303000, 0x60683800, 0x8c040506, 0x05020002, 0x60603800, 0x480c7006, 0x48107007, 0x481c700f, 0x492c700a, 0x4818700d, 0x4834700b, 0x48365801, - 0x65286805, 0x5c025800, 0x0129f2f3, 0x48365801, + 0x65286805, 0x5c025800, 0x0129f46c, 0x48365801, 0x65286805, 0x6006e000, 0x40341000, 0x822c0580, 0x0000016a, 0x05020004, 0x0501f80e, 0x5c025800, 0x1c01f000, 0x0501f92e, 0x5c025800, 0x1c01f000, - 0x592c0001, 0x80001540, 0x01240670, 0x58080a05, - 0x82040d00, 0x000000ff, 0xb004058a, 0x01260676, + 0x592c0001, 0x80001540, 0x01240775, 0x58080a05, + 0x82040d00, 0x000000ff, 0xb004058a, 0x0126077b, 0x58080406, 0x8c000510, 0x0500008f, 0x4d2c0000, 0x4c080000, 0x05fdf90e, 0x5c001000, 0x05000008, 0x412c6800, 0x5c025800, 0x48365802, 0x592c5a0b, - 0x0501f80e, 0x05000084, 0x0125f67c, 0x5c025800, + 0x0501f80e, 0x05000084, 0x0125f781, 0x5c025800, 0x492f3000, 0x6022e000, 0x4a033005, 0x00020715, 0x1c01f000, 0x6006e000, 0x412c6800, 0x599a5800, 0x592c1001, 0x05fdf7f1, 0x592c2208, 0x58084809, @@ -23667,87 +23899,87 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x59a8000a, 0x812c0480, 0x05021005, 0x0101fd8c, 0x5c025800, 0x497a5802, 0x1c01f000, 0x5c025800, 0x05fdf7fe, 0x592e8a07, 0x83440c80, 0x000007f0, - 0x0126167c, 0x8d0c050e, 0x012606c0, 0x592e4411, - 0x81224110, 0x83440400, 0x0010a380, 0x50000000, - 0x80026d40, 0x012406d3, 0x59340013, 0x80000130, - 0x81200580, 0x012606d3, 0x5934000a, 0x8c00052e, - 0x012606d9, 0x05fdfb02, 0x012606d5, 0x1c01f000, + 0x01261781, 0x8d0c050e, 0x012607c5, 0x592e4411, + 0x81224110, 0x83440400, 0x0010a600, 0x50000000, + 0x80026d40, 0x012407d8, 0x59340013, 0x80000130, + 0x81200580, 0x012607d8, 0x5934000a, 0x8c00052e, + 0x012607de, 0x05fdfb02, 0x012607da, 0x1c01f000, 0x59980802, 0x59980000, 0x48065800, 0x492c0801, 0x492f3002, 0x80000040, 0x48033000, 0x05000002, 0x1c01f000, 0x599a5801, 0x59980006, 0x6006e000, - 0x0801f800, 0x1c01f000, 0x80140110, 0x01240670, + 0x0801f800, 0x1c01f000, 0x80140110, 0x01240775, 0x80000040, 0x05020009, 0x592c240b, 0x8c100504, 0x0500000a, 0x592c0208, 0x82000c80, 0x00001001, - 0x0126167c, 0x0129f2e3, 0x4a033006, 0x000207c5, + 0x01261781, 0x0129f45c, 0x4a033006, 0x000207c5, 0x05fdf697, 0x592c240b, 0x592e8a07, 0x417a7800, 0x592e4408, 0x83224500, 0x000000ff, 0x83200580, - 0x000000ff, 0x0128003f, 0x83200400, 0x0010a0ec, - 0x50024800, 0x83440c80, 0x000007f0, 0x012a1038, - 0x83440c00, 0x0010a380, 0x50040000, 0x80026d40, - 0x0128003a, 0x59340013, 0x80000130, 0x81200580, - 0x012a003a, 0x59340002, 0x592c0809, 0x80040580, - 0x82000500, 0x00ffffff, 0x0126067c, 0x59243a00, - 0x901c0503, 0x90000583, 0x012a0035, 0x592e600a, - 0x497a5809, 0x83300480, 0x001102e4, 0x01281058, - 0xa1300495, 0x012a1000, 0x592c0a0d, 0x59300202, - 0x80040580, 0x012a0058, 0x4936600a, 0x4926601d, - 0x8c10051c, 0x012607f4, 0x59240206, 0x8c000510, - 0x012a0070, 0x8d0c050e, 0x012607e0, 0x8c1c0516, - 0x012a0067, 0x59340200, 0x8c000518, 0x012a0055, - 0x59300c07, 0x90040586, 0x012a0073, 0x8c100508, - 0x012607d6, 0x59300809, 0x497a5804, 0x64025a07, - 0x800409c0, 0x012607db, 0x59300416, 0x8c000516, - 0x012a005b, 0x492e6009, 0x0501f2ce, 0x497a5802, - 0x80140110, 0x01240670, 0x80000040, 0x01240670, - 0x592c0a08, 0x82040c80, 0x00001001, 0x0126167c, + 0x000000ff, 0x01280152, 0x83200400, 0x0010a3b3, + 0x50024800, 0x83440c80, 0x000007f0, 0x012a114b, + 0x83440c00, 0x0010a600, 0x50040000, 0x80026d40, + 0x0128014d, 0x59340013, 0x80000130, 0x81200580, + 0x012a014d, 0x59340002, 0x592c0809, 0x80040580, + 0x82000500, 0x00ffffff, 0x01260781, 0x59243a00, + 0x901c0503, 0x90000583, 0x012a0148, 0x592e600a, + 0x497a5809, 0x83300480, 0x00110514, 0x0128116b, + 0xa1300495, 0x012a1113, 0x592c0a0d, 0x59300202, + 0x80040580, 0x012a016b, 0x4936600a, 0x4926601d, + 0x8c10051c, 0x012a0107, 0x59240206, 0x8c000510, + 0x012a0183, 0x8d0c050e, 0x012a00f3, 0x8c1c0516, + 0x012a017a, 0x59340200, 0x8c000518, 0x012a0168, + 0x59300c07, 0x90040586, 0x012a0186, 0x8c100508, + 0x012a00e9, 0x59300809, 0x497a5804, 0x64025a07, + 0x800409c0, 0x012a00ee, 0x59300416, 0x8c000516, + 0x012a016e, 0x492e6009, 0x0501f2ce, 0x497a5802, + 0x80140110, 0x01240775, 0x80000040, 0x01240775, + 0x592c0a08, 0x82040c80, 0x00001001, 0x01261781, 0x4a033006, 0x0002081b, 0x05fdf641, 0x592c0001, - 0x80001540, 0x01240670, 0x58080a05, 0x82040d00, - 0x000000ff, 0xb004058a, 0x01260676, 0x58080406, + 0x80001540, 0x01240775, 0x58080a05, 0x82040d00, + 0x000000ff, 0xb004058a, 0x0126077b, 0x58080406, 0x8c000510, 0x0502001f, 0x6006e000, 0x592c240b, 0x8c100504, 0x05fc079d, 0x592c0205, 0x82000580, 0x0000017a, 0x05fc0799, 0x40087800, 0x592c0208, - 0x82000480, 0x00001001, 0x0126167c, 0x583c1809, + 0x82000480, 0x00001001, 0x01261781, 0x583c1809, 0x583c200a, 0x583c100b, 0x82080500, 0xffff0003, - 0x0126067c, 0x600ae000, 0x42000000, 0x0010ccba, + 0x01260781, 0x600ae000, 0x42000000, 0x0010cf3a, 0x50007000, 0x6420700f, 0x480c7006, 0x48107007, - 0x492c700a, 0x6424700d, 0x483c700b, 0x0129f2f3, - 0x592c240b, 0x8c100504, 0x0126067c, 0x4d2c0000, + 0x492c700a, 0x6424700d, 0x483c700b, 0x0129f46c, + 0x592c240b, 0x8c100504, 0x01260781, 0x4d2c0000, 0x4c080000, 0x05f9ffca, 0x5c001000, 0x0500000e, 0x412c6800, 0x5c025800, 0x592c5c0b, 0x802c5942, - 0x48365802, 0x05fdfec9, 0x05fc0773, 0x0125f67c, + 0x48365802, 0x05fdfec9, 0x05fc0773, 0x0125f781, 0x6006e000, 0x412c6800, 0x599a5800, 0x592c1001, 0x05fdf7f6, 0x5c025800, 0x492f3000, 0x6022e000, 0x4a033005, 0x00020854, 0x1c01f000, 0x492fc857, - 0x592e4411, 0x81224110, 0x0129fa90, 0x05020050, - 0x592c0205, 0x80000112, 0x01260670, 0x592e8a07, - 0x05fdfa7f, 0x0502004a, 0x0121fc9b, 0x0502004a, + 0x592e4411, 0x81224110, 0x0129fc09, 0x05020050, + 0x592c0205, 0x80000112, 0x01260775, 0x592e8a07, + 0x0121fdd0, 0x0502004a, 0x0121fd77, 0x0502004a, 0x592e780b, 0x493fc857, 0x8d3c053e, 0x05020005, - 0x8d0c050e, 0x05020042, 0x0121fbb5, 0x0124067c, - 0x913c1d1f, 0x0124067c, 0x592c0208, 0x82000c80, - 0x00001000, 0x0126167c, 0x800000c2, 0x800008c4, + 0x8d0c050e, 0x05020042, 0x0121fc8f, 0x01240781, + 0x913c1d1f, 0x01240781, 0x592c0208, 0x82000c80, + 0x00001000, 0x01261781, 0x800000c2, 0x800008c4, 0x8005d400, 0x592e9009, 0x592e980a, 0x5934080d, 0x800409c0, 0x05000004, 0x58041802, 0x800c19c0, 0x0502002b, 0x913c1d1f, 0x81780040, 0x80000000, - 0x800c1902, 0x05fe17fe, 0x0126067c, 0x0c01f001, + 0x800c1902, 0x05fe17fe, 0x01260781, 0x0c01f001, 0x00020891, 0x00020893, 0x0002089c, 0x0002089e, - 0x000208a0, 0x0141fb21, 0x0501f019, 0x0121fb8f, - 0x0500001d, 0x80e9d1c0, 0x012e0b41, 0x60168000, - 0x417a9000, 0x417a9800, 0x0141fb2d, 0x0501f010, + 0x000208a0, 0x0141fd02, 0x0501f019, 0x0121fc69, + 0x0500001d, 0x80e9d1c0, 0x012e0d03, 0x60168000, + 0x417a9000, 0x417a9800, 0x0141fd0e, 0x0501f010, 0x61367000, 0x0501f004, 0x613a7000, 0x0501f002, 0x614a7000, 0x5934080d, 0x800409c0, 0x05000006, - 0x4d3c0000, 0x40067800, 0x0121fb73, 0x5c027800, - 0x05000007, 0x0121fa84, 0x01420b5c, 0x05000006, + 0x4d3c0000, 0x40067800, 0x0121fc4d, 0x5c027800, + 0x05000007, 0x0121fb5e, 0x01420d3d, 0x05000006, 0x8d3c053e, 0x0502000a, 0x1c01f000, 0x64c25a07, 0x0501f009, 0x64b25a07, 0x0501f007, 0x64a25a07, 0x0501f005, 0x64a65a07, 0x0501f003, 0x497a580a, 0x64025a07, 0x4a025a05, 0x00000103, 0x05fdf2a0, 0x492fc857, 0x80140110, 0x80000040, 0x05000002, - 0x0125f670, 0x592c0208, 0x82000500, 0x000003ff, + 0x0125f775, 0x592c0208, 0x82000500, 0x000003ff, 0x48025a08, 0x8c000506, 0x05000003, 0xb0000530, 0x05020003, 0x8d0c050e, 0x05020014, 0x4a025a07, 0x0000dead, 0x592c0409, 0x82000500, 0x0000f0ff, - 0x48025c09, 0x011dff50, 0x05020002, 0x1c01f000, - 0x49425a07, 0x8058b1c0, 0x05000007, 0x0145f960, + 0x48025c09, 0x0121f823, 0x05020002, 0x1c01f000, + 0x49425a07, 0x8058b1c0, 0x05000007, 0x0145fb46, 0x0501f80a, 0x44042800, 0x90580582, 0x05020002, 0x48082801, 0x05fdf27e, 0x60c68000, 0x60040800, 0x6004b000, 0x05fdf7f3, 0x592c0409, 0x80000118, @@ -23757,12 +23989,12 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x0502b00a, 0x915c04a0, 0x0500100c, 0x815eb840, 0x416a5800, 0x592ed000, 0x492fb007, 0x497a5800, 0x497a5801, 0x05fcb7f8, 0x59d80005, 0x82000500, - 0x43218780, 0x012a00fd, 0x5c03e000, 0x1c01f000, + 0x43218780, 0x012a0215, 0x5c03e000, 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, 0x0502f00a, 0x915c04a0, 0x0500100c, 0x815eb840, 0x416a5800, 0x592ed000, 0x492fa807, 0x497a5800, 0x497a5801, 0x05fcf7f8, 0x59d40005, 0x82000500, 0x43218780, - 0x012a00f7, 0x5c03e000, 0x1c01f000, 0x40307000, + 0x012a020f, 0x5c03e000, 0x1c01f000, 0x40307000, 0x5838000a, 0x80025d40, 0x0500001c, 0x58380002, 0x82000580, 0x00000100, 0x0500001d, 0x4c380000, 0x592c0205, 0x82000500, 0x000000ff, 0x90000592, @@ -23775,7 +24007,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x90000483, 0x0500007c, 0x5838100f, 0x8c080500, 0x05020014, 0x8c080506, 0x05020032, 0x600cb000, 0x912cac12, 0x58380009, 0x5838100c, 0x8008a400, - 0x4c380000, 0x0151f860, 0x5c007000, 0x5838000c, + 0x4c380000, 0x0151fb10, 0x5c007000, 0x5838000c, 0x90000403, 0x4800700c, 0x6404700f, 0x58380004, 0x90000483, 0x48007004, 0x90000583, 0x05000066, 0x5838000d, 0x80001d40, 0x05020021, 0x4c380000, @@ -23784,7 +24016,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x80000540, 0x05020002, 0x5838000a, 0x40000800, 0x492c0801, 0x492c700b, 0x603c0800, 0x0501f014, 0x6022e000, 0x4a033005, 0x00020968, 0x1c01f000, - 0x600ae000, 0x42000000, 0x0010ccba, 0x50007000, + 0x600ae000, 0x42000000, 0x0010cf3a, 0x50007000, 0x5838180f, 0x8c0c0506, 0x05020067, 0x05fdf7e8, 0x84081540, 0x4808700f, 0x5838180d, 0x583a580b, 0x400c0000, 0x60540800, 0x80040c80, 0x58381004, @@ -23793,7 +24025,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x80040480, 0x05001002, 0x40080800, 0x4004b000, 0x412c0000, 0x800c0400, 0x4000a800, 0x58380009, 0x5838100c, 0x8008a400, 0x4c080000, 0x4c040000, - 0x4c0c0000, 0x4c380000, 0x0151f860, 0x5c007000, + 0x4c0c0000, 0x4c380000, 0x0151fb10, 0x5c007000, 0x5c001800, 0x5c000800, 0x40040000, 0x58381004, 0x80080480, 0x48007004, 0x90000583, 0x05000002, 0x84183500, 0x5c000000, 0x80041400, 0xb00804a0, @@ -23803,7 +24035,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x40180000, 0x0c01f001, 0x000209b2, 0x000209b5, 0x000209b3, 0x000209b2, 0x00020953, 0x000209b5, 0x000209b3, 0x000209b2, 0x0101f9ef, 0x5838100e, - 0x0129f2f3, 0x5838080c, 0x90040402, 0x58381009, + 0x0129f46c, 0x5838080c, 0x90040402, 0x58381009, 0x80080400, 0x50001000, 0x800811c0, 0x05020041, 0x5838180f, 0x8c0c0506, 0x0502000b, 0x6006e000, 0x583a580a, 0x4978700a, 0x4978700f, 0x592c0205, @@ -23820,9 +24052,9 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0xb00405ba, 0x05fe0513, 0x58080406, 0x8c000510, 0x05fc05d5, 0x05fdf656, 0x8c0c0504, 0x05fe07ef, 0x840c1d44, 0x480c700f, 0x58381810, 0x58382011, - 0x58381012, 0x480c7006, 0x48107007, 0x0129f2f3, + 0x58381012, 0x480c7006, 0x48107007, 0x0129f46c, 0x58380009, 0x80040c00, 0x90381c06, 0x54041800, - 0x80040800, 0x800c1800, 0x54041800, 0x0129f2f3, + 0x80040800, 0x800c1800, 0x54041800, 0x0129f46c, 0x4df00000, 0x4203e000, 0x50000000, 0x5994002e, 0x80000540, 0x050000c6, 0x4c000000, 0x5c000000, 0x59947824, 0x4803282f, 0x803c0480, 0x05001004, @@ -23832,7 +24064,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x803c0040, 0x05000002, 0x483fc857, 0x59e40852, 0x59a8007a, 0x80040580, 0x05000004, 0x480bc857, 0x59e40052, 0x4803507a, 0x59940030, 0x803c0400, - 0x48032830, 0x012dfbfa, 0x59940000, 0x90000580, + 0x48032830, 0x012dfdbc, 0x59940000, 0x90000580, 0x05020005, 0x59940030, 0x48032831, 0x497b2830, 0x64072800, 0x4c0c0000, 0x58d400e5, 0x8c000514, 0x05000013, 0x59940807, 0x59941006, 0x5994002f, @@ -23874,7 +24106,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x5994002d, 0x0801f800, 0x0501f004, 0x9000040a, 0x4803282b, 0x05fc27f8, 0x5994082e, 0x5994002f, 0x80040480, 0x010019ef, 0x4803282e, 0x59940000, - 0x0c01f001, 0x00020ad4, 0x00105b48, 0x00105bb2, + 0x0c01f001, 0x00020ad4, 0x00105d0a, 0x00105d74, 0x5c03e000, 0x1c01f000, 0x5994002e, 0x80000000, 0x4803282e, 0x4203e000, 0x70000000, 0x1c01f000, 0x813e79c0, 0x05020009, 0x59a80090, 0x80000040, @@ -23902,22 +24134,22 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x00000100, 0x80040d40, 0x48066004, 0x58d400ea, 0x8c000516, 0x05fe07fe, 0x83300400, 0x40000000, 0x4801a8e1, 0x1c01f000, 0x58d400ea, 0x82001500, - 0x32000018, 0x012e07cd, 0x8c000510, 0x0500002f, + 0x32000018, 0x0132018f, 0x8c000510, 0x0500002f, 0x58d410e0, 0x82080500, 0xfffff000, 0x0502000d, 0x900a350f, 0x80081108, 0x480bc857, 0x90080487, 0x010219ef, 0x90080481, 0x010019ef, 0x1201f000, - 0x00105fd1, 0x84000510, 0x48026004, 0x0501f019, + 0x00106193, 0x84000510, 0x48026004, 0x0501f019, 0x840a653e, 0x59300804, 0x8c040520, 0x05fc07fa, 0x82040d00, 0xfffefeff, 0x48066004, 0x8c08053e, 0x05020009, 0x8c040514, 0x05000004, 0x05fdff8d, 0x0501f8fa, 0x0501f00b, 0x604e7000, 0x0501f915, 0x0501f008, 0x8c040514, 0x05000004, 0x05fdff85, 0x0501f8f2, 0x0501f003, 0x61267000, 0x0501f90d, - 0x58d400ea, 0x82001500, 0x32000018, 0x012e07cd, + 0x58d400ea, 0x82001500, 0x32000018, 0x0132018f, 0x8c000510, 0x05fe07d3, 0x1c01f000, 0x59bc00ea, - 0x82001500, 0xb2000018, 0x012e07f7, 0x8c000510, + 0x82001500, 0xb2000018, 0x013201b9, 0x8c000510, 0x05000007, 0x59bc10e0, 0x80080108, 0x900a350f, - 0x4803c857, 0x1201f000, 0x00105ffb, 0x1c01f000, + 0x4803c857, 0x1201f000, 0x001061bd, 0x1c01f000, 0x4d300000, 0x59bc00ea, 0x8c000510, 0x05fc07fe, 0x59be60e0, 0x813261c0, 0x010009ef, 0x59300804, 0x8c04051c, 0x05020065, 0x59300027, 0x80006d40, @@ -23946,8 +24178,8 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x84000544, 0x4800680e, 0x05fdf7d7, 0x58387001, 0x48386807, 0x42002000, 0x00100e1d, 0x05fdf7ea, 0x84000542, 0x4800120e, 0x4933c857, 0x05fdf7cf, - 0x0010af39, 0x0010af4a, 0x0010af5b, 0x0010af6c, - 0x0010af7d, 0x5830020e, 0x8c000500, 0x0502001b, + 0x0010b1b9, 0x0010b1ca, 0x0010b1db, 0x0010b1ec, + 0x0010b1fd, 0x5830020e, 0x8c000500, 0x0502001b, 0x5830780f, 0x803c79c0, 0x05000030, 0x58300002, 0x82000580, 0x00000100, 0x0502002e, 0x583c0c07, 0x90040586, 0x05000003, 0x90040583, 0x05020027, @@ -23956,23 +24188,23 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x40000800, 0x5830000d, 0x44040000, 0x5830000c, 0x480378e7, 0x1c01f000, 0x4803c856, 0x4978620e, 0x8c000502, 0x05fc07fc, 0x4803c856, 0x4c300000, - 0x012dff7d, 0x5c006000, 0x58300c0e, 0x800410ca, + 0x0131f93f, 0x5c006000, 0x58300c0e, 0x800410ca, 0x82081400, 0x00007600, 0x4a001014, 0x00090000, 0x800410c8, 0x82081400, 0x0000bf32, 0x58080005, 0x84000500, 0x48001005, 0x5830000a, 0x5830080d, - 0x44000800, 0x012dff69, 0x483fc857, 0x05fdf7e6, + 0x44000800, 0x0131f92b, 0x483fc857, 0x05fdf7e6, 0x4d300000, 0x4d2c0000, 0x4d3c0000, 0x4c300000, 0x5832600f, 0x4933c857, 0x59325809, 0x592c0209, - 0x8400054e, 0x48025a09, 0x417a7800, 0x013dff70, + 0x8400054e, 0x48025a09, 0x417a7800, 0x0141f94e, 0x5c006000, 0x5c027800, 0x5c025800, 0x5c026000, 0x05fdf7d5, 0x59a80266, 0x81640480, 0x05001015, 0x41626000, 0x41580000, 0x59300a03, 0x90040d80, 0x05020007, 0x64226203, 0x8166c840, 0x9132c430, 0x81600480, 0x05021008, 0x1c01f000, 0x91326430, - 0x81300c80, 0x05fc17f5, 0x42026000, 0x001102e4, - 0x05fdf7f2, 0x837ac540, 0x001102e4, 0x1c01f000, - 0x42000000, 0x0010b049, 0x014dff95, 0x4967c857, - 0x80026580, 0x1c01f000, 0x83300480, 0x001102e4, + 0x81300c80, 0x05fc17f5, 0x42026000, 0x00110514, + 0x05fdf7f2, 0x837ac540, 0x00110514, 0x1c01f000, + 0x42000000, 0x0010b2c9, 0x0151fa45, 0x4967c857, + 0x80026580, 0x1c01f000, 0x83300480, 0x00110514, 0x010019ef, 0x41580000, 0x81300480, 0x0502100a, 0x457a6000, 0x4a026202, 0x0000ffff, 0x05011000, 0x91300403, 0x4803c840, 0x64b7c842, 0x8166c800, @@ -23982,81 +24214,81 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x91300403, 0x4803c840, 0x64b7c842, 0x1c01f000, 0x4d340000, 0x4d240000, 0x5932481d, 0x5932680a, 0x59300407, 0x9000051f, 0x0c01f804, 0x5c024800, - 0x5c026800, 0x1c01f000, 0x00106d6e, 0x00106d7d, - 0x00106d97, 0x00020ca2, 0x00108e0a, 0x00108e25, - 0x00020d1c, 0x00106d6e, 0x00106d7d, 0x00105d1f, - 0x00106ddf, 0x00106d6e, 0x00106d6e, 0x00106d6e, - 0x00106d6e, 0x00106daf, 0x001089b3, 0x00109bee, - 0x00106d6e, 0x00106d6e, 0x00106d6e, 0x00106d6e, - 0x00106d6e, 0x00106d6e, 0x00106d6e, 0x00106d6e, - 0x00106d6e, 0x00106d6e, 0x00106d6e, 0x00106d6e, - 0x00106d6e, 0x00106d6e, 0x59300203, 0x90000c91, - 0x010219ef, 0x0c01f001, 0x00106dae, 0x0010787b, - 0x00020cb7, 0x00107a9e, 0x00107b41, 0x00106dae, - 0x00106dae, 0x00106dae, 0x00107867, 0x00106dae, - 0x00106dae, 0x00106dae, 0x00106dae, 0x00107d0f, - 0x001084d2, 0x00106dae, 0x00108501, 0xb1380498, + 0x5c026800, 0x1c01f000, 0x00106f26, 0x00106f35, + 0x00106f4f, 0x00020ca2, 0x00109086, 0x001090a1, + 0x00020d1c, 0x00106f26, 0x00106f35, 0x00105ee1, + 0x00106f97, 0x00106f26, 0x00106f26, 0x00106f26, + 0x00106f26, 0x00106f67, 0x00108b99, 0x00109e8c, + 0x00106f26, 0x00106f26, 0x00106f26, 0x00106f26, + 0x00106f26, 0x00106f26, 0x00106f26, 0x00106f26, + 0x00106f26, 0x00106f26, 0x00106f26, 0x00106f26, + 0x00106f26, 0x00106f26, 0x59300203, 0x90000c91, + 0x010219ef, 0x0c01f001, 0x00106f66, 0x00107a50, + 0x00020cb7, 0x00107c73, 0x00107d16, 0x00106f66, + 0x00106f66, 0x00106f66, 0x00107a3c, 0x00106f66, + 0x00106f66, 0x00106f66, 0x00106f66, 0x00107ee4, + 0x001086b3, 0x00106f66, 0x001086e2, 0xb1380498, 0x05021006, 0xb1380480, 0x05001004, 0x4d2c0000, - 0x0c01f803, 0x5c025800, 0x1c01f000, 0x001078f4, - 0x001078f4, 0x001078f4, 0x001078f4, 0x001078f4, - 0x001078f5, 0x001079ae, 0x001078f4, 0x001078f4, - 0x001078f4, 0x001078f4, 0x001078f4, 0x001078f4, - 0x001078f4, 0x001078f4, 0x001078f4, 0x001078f4, - 0x001078f4, 0x001078f4, 0x001079b2, 0x00020cd7, - 0x001078f4, 0x001079b1, 0x001079b3, 0x59325809, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x00107ac9, + 0x00107ac9, 0x00107ac9, 0x00107ac9, 0x00107ac9, + 0x00107aca, 0x00107b83, 0x00107ac9, 0x00107ac9, + 0x00107ac9, 0x00107ac9, 0x00107ac9, 0x00107ac9, + 0x00107ac9, 0x00107ac9, 0x00107ac9, 0x00107ac9, + 0x00107ac9, 0x00107ac9, 0x00107b87, 0x00020cd7, + 0x00107ac9, 0x00107b86, 0x00107b88, 0x59325809, 0x59300813, 0x59301402, 0x59340200, 0x8c00050e, 0x05020023, 0x0501f82f, 0x05000005, 0x4a025a05, 0x00000103, 0x497a580a, 0x0501f009, 0x4a025a05, 0x00000103, 0x64025a07, 0x497a580a, 0x40040000, - 0x0145fcbe, 0x80000d40, 0x013e0b11, 0x48065808, + 0x0145fea4, 0x80000d40, 0x013e0ce6, 0x48065808, 0x480a5c07, 0x59300008, 0x82000500, 0x04000800, 0x82000580, 0x04000800, 0x05000017, 0x05f9fe68, - 0x0145fcb5, 0x5934000f, 0x8d0c0512, 0x05020005, + 0x0145fe9b, 0x5934000f, 0x8d0c0512, 0x05020005, 0x5934140b, 0x80081040, 0x05001002, 0x480a6c0b, 0x80000540, 0x05fa0df7, 0x05fdf75c, 0x592c020b, 0x8c000502, 0x05fc07dc, 0x800409c0, 0x05fc07e0, 0x592c0209, 0x8c00050e, 0x05fe07dd, 0x4933c857, - 0x0141f552, 0x59300221, 0x48025c10, 0x05fdf7e8, + 0x0141f733, 0x59300221, 0x48025c10, 0x05fdf7e8, 0x592c020b, 0x8c000500, 0x0500000d, 0x59300017, 0x592c3810, 0x801c3c80, 0x05000009, 0x64565a07, 0x8c1c053e, 0x05000004, 0x641e5a07, 0x801c3880, 0x801c3800, 0x481fc857, 0x901c0d40, 0x1c01f000, 0x59300203, 0x90003491, 0x010219ef, 0x0c01f001, - 0x00108e43, 0x00020d31, 0x001094b8, 0x001094c9, - 0x00020d4c, 0x00108e43, 0x0010959d, 0x00020d70, - 0x00108e43, 0x00108e43, 0x00108e43, 0x00108e43, - 0x00108e43, 0x00108e43, 0x001099a0, 0x00108e43, - 0x001099d3, 0x91380593, 0x014a044f, 0x59300403, + 0x001090bf, 0x00020d31, 0x00109744, 0x00109755, + 0x00020d4c, 0x001090bf, 0x0010982c, 0x00020d70, + 0x001090bf, 0x001090bf, 0x001090bf, 0x001090bf, + 0x001090bf, 0x001090bf, 0x00109c3e, 0x001090bf, + 0x00109c71, 0x91380593, 0x014a06db, 0x59300403, 0xb0027484, 0x010219ef, 0xb0000480, 0x010019ef, - 0x0c01f001, 0x00109498, 0x00020d3d, 0x00109499, - 0x001094ab, 0x0141fef0, 0x05000005, 0x59a80030, + 0x0c01f001, 0x00109724, 0x00020d3d, 0x00109725, + 0x00109737, 0x0145f8d1, 0x05000005, 0x59a80030, 0x48026205, 0x643a6203, 0x1c01f000, 0x59325809, 0x832c0500, 0x00ff0000, 0x05000004, 0x592c0c0b, - 0x8c04051a, 0x014a04a8, 0x05fdfda2, 0x05fdf70f, + 0x8c04051a, 0x014a0734, 0x05fdfda2, 0x05fdf70f, 0xb1380498, 0x05001007, 0xb13805a1, 0x05000003, 0xb13805a0, 0x010209ef, 0x4933c857, 0x1c01f000, - 0xb1380588, 0x05000004, 0xb1380593, 0x0148054a, + 0xb1380588, 0x05000004, 0xb1380593, 0x014807d9, 0x0101f9ef, 0x5930002b, 0x59301013, 0x5930080a, - 0x58040a00, 0x8c04050e, 0x014a0530, 0x800811c0, - 0x014a053b, 0x5930002b, 0x80000540, 0x014a0545, - 0x59325809, 0x592c040b, 0x8c00051e, 0x0148052a, + 0x58040a00, 0x8c04050e, 0x014a07bf, 0x800811c0, + 0x014a07ca, 0x5930002b, 0x80000540, 0x014a07d4, + 0x59325809, 0x592c040b, 0x8c00051e, 0x014807b9, 0x64066203, 0x65066403, 0x42000800, 0x80002042, 0x8c00051a, 0x05020002, 0x84040d54, 0x05fdf5bf, - 0xb1380498, 0x014a1561, 0xb1380480, 0x01481562, - 0x0c01f001, 0x0010956a, 0x00020d89, 0x00109573, - 0x00109578, 0x0010956a, 0x0010956a, 0x0010956a, - 0x0010956a, 0x0010956b, 0x0010956f, 0x0010956f, - 0x0010956a, 0x0010956a, 0x0010956a, 0x0010956a, - 0x0010956f, 0x0010956a, 0x0010956f, 0x0010956a, - 0x0010956b, 0x64066203, 0x493a6403, 0x42000800, + 0xb1380498, 0x014a17f0, 0xb1380480, 0x014817f1, + 0x0c01f001, 0x001097f9, 0x00020d89, 0x00109802, + 0x00109807, 0x001097f9, 0x001097f9, 0x001097f9, + 0x001097f9, 0x001097fa, 0x001097fe, 0x001097fe, + 0x001097f9, 0x001097f9, 0x001097f9, 0x001097f9, + 0x001097fe, 0x001097f9, 0x001097fe, 0x001097f9, + 0x001097fa, 0x64066203, 0x493a6403, 0x42000800, 0x80002042, 0x05fdf5a1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x6e2165bf, 0x00000000, 0x00000000, - 0x0010e300, 0x00001ae9, 0x42000000, 0x0010fe20, - 0x42001000, 0x0010fe11, 0x48001000, 0x42013800, - 0x00110220, 0x42000000, 0x0010fe10, 0x489c0000, + 0x00000000, 0x72bb9678, 0x00000000, 0x00000000, + 0x0010e500, 0x00001b0f, 0x42000000, 0x00110050, + 0x42001000, 0x00110041, 0x48001000, 0x42013800, + 0x00110450, 0x42000000, 0x00110040, 0x489c0000, 0x409d4000, 0x409d6800, 0x1c01f000, 0x4200d000, 0x0000000d, 0x42000000, 0x00000002, 0x4800d000, 0x0401f7fb, 0x4200d000, 0x0000000d, 0x42000000, @@ -24064,7 +24296,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x809d3840, 0x48813800, 0x4933c857, 0x5931040c, 0x82817480, 0x00000038, 0x0400000d, 0x0400100c, 0x82810480, 0x00000038, 0x4a025a06, 0x00000038, - 0x0201f800, 0x001034c3, 0x40c65800, 0x80c589c0, + 0x0201f800, 0x0010358e, 0x40c65800, 0x80c589c0, 0x040207f4, 0x4178d000, 0x0401f004, 0x48825a06, 0x4200d000, 0x00000001, 0x40698800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x42038000, 0x00007700, @@ -24095,11 +24327,11 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0xe1290008, 0x486f9122, 0x0401f7e2, 0x4a039100, 0x0000e980, 0x1c01f000, 0x59c8d007, 0x8c68d500, 0x04000003, 0x4a03900d, 0x00000030, 0x1c01f000, - 0x0201f800, 0x00105f69, 0x59b8d0ea, 0x8268d500, + 0x0201f800, 0x0010612b, 0x59b8d0ea, 0x8268d500, 0x00000007, 0x82697480, 0x00000003, 0x04000002, 0x0401f003, 0x4a0370e8, 0x00000001, 0x1c01f000, 0x4a038805, 0x00020000, 0x4200d000, 0x0000003c, - 0x0201f800, 0x0010134f, 0x4a038891, 0x0000ffff, + 0x0201f800, 0x0010134d, 0x4a038891, 0x0000ffff, 0x59c97035, 0x48bb9035, 0x4a03900d, 0x00000040, 0x42038000, 0x00007700, 0x0201f800, 0x00100c03, 0x4a038006, 0x20000000, 0x42038000, 0x00007720, @@ -24109,7 +24341,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x59d0d006, 0x8c68d50a, 0x040207fe, 0x59dcd006, 0x8c68d50a, 0x040207fb, 0x1c01f000, 0x4203a000, 0x00007600, 0x4200d000, 0x00000040, 0x0201f800, - 0x0010134f, 0x4a03a00a, 0x00000001, 0x4a03a005, + 0x0010134d, 0x4a03a00a, 0x00000001, 0x4a03a005, 0x20000000, 0x59d0d006, 0x4a03a005, 0x30000000, 0x59d0d006, 0x8c68d50a, 0x040207fe, 0x59d0d005, 0x59a0d211, 0x59a0dc11, 0x806c00e0, 0x8068d540, @@ -24134,16 +24366,16 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x59a8d00d, 0x41640000, 0x80697480, 0x04000015, 0x4967c857, 0x59a97064, 0x48bbc857, 0x59a97063, 0x48bbc857, 0x59a97062, 0x48bbc857, 0x4a034407, - 0x00000018, 0x0201f800, 0x001021fb, 0x0401f133, - 0x4a034407, 0x00000005, 0x0201f800, 0x001021fb, - 0x0401f12e, 0x0201f800, 0x00102203, 0x0401f12b, + 0x00000018, 0x0201f800, 0x0010229e, 0x0401f133, + 0x4a034407, 0x00000005, 0x0201f800, 0x0010229e, + 0x0401f12e, 0x0201f800, 0x001022a6, 0x0401f12b, 0x59a8d063, 0x59a80062, 0x80697480, 0x040207e9, - 0x0201f800, 0x001037c8, 0x80c589c0, 0x0402004d, - 0x0201f800, 0x00102207, 0x0401f120, 0x4887c857, - 0x0201f800, 0x001021ff, 0x0401f11c, 0x0201f800, - 0x00106d42, 0x40c66000, 0x80c589c0, 0x0400003e, - 0x0201f800, 0x001034c3, 0x40c65800, 0x80c589c0, - 0x04000022, 0x4a02601d, 0x0010b111, 0x48898a05, + 0x0201f800, 0x00103893, 0x80c589c0, 0x0402004d, + 0x0201f800, 0x001022aa, 0x0401f120, 0x4887c857, + 0x0201f800, 0x001022a2, 0x0401f11c, 0x0201f800, + 0x00106efa, 0x40c66000, 0x80c589c0, 0x0400003e, + 0x0201f800, 0x0010358e, 0x40c65800, 0x80c589c0, + 0x04000022, 0x4a02601d, 0x0010b391, 0x48898a05, 0x48898c05, 0x4882620c, 0x4886640c, 0x59a0d40f, 0x8068d0e0, 0x59a0da0f, 0x406c0000, 0x8068d540, 0x486a600d, 0x59a0d40a, 0x8068d0e0, 0x59a0da0a, @@ -24151,27 +24383,27 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x8068d0e0, 0x59a0da0e, 0x406c0000, 0x8068d540, 0x486a600f, 0x59a0d411, 0x8068d0e0, 0x59a0da11, 0x406c0000, 0x8068d540, 0x486a6010, 0x0401fe99, - 0x80c589c0, 0x04020006, 0x0201f800, 0x00106d11, + 0x80c589c0, 0x04020006, 0x0201f800, 0x00106ec5, 0x4a034407, 0x00000002, 0x0401f7bc, 0x48ee602d, 0x58ee580c, 0x4a01d801, 0x00000001, 0x592cd206, 0x4869d805, 0x832cd400, 0x00000007, 0x4869d803, - 0x4895d806, 0x4891d807, 0x4a01d808, 0x0010e5a7, + 0x4895d806, 0x4891d807, 0x4a01d808, 0x0010e7a7, 0x4a034000, 0x00000001, 0x49334001, 0x0401ff5e, 0x0401f0da, 0x4a034407, 0x00000003, 0x0401f7a7, - 0x0201f800, 0x00105f78, 0x598e600b, 0x0201f800, - 0x00106287, 0x0201f800, 0x00105f78, 0x408e3000, - 0x0201f800, 0x001064d2, 0x59926005, 0x813261c0, - 0x0400000d, 0x0201f800, 0x001061b6, 0x0201f800, - 0x00105f4c, 0x0201f800, 0x00105f52, 0x42027800, + 0x0201f800, 0x0010613a, 0x598e600b, 0x0201f800, + 0x00106449, 0x0201f800, 0x0010613a, 0x408e3000, + 0x0201f800, 0x00106694, 0x59926005, 0x813261c0, + 0x0400000d, 0x0201f800, 0x00106378, 0x0201f800, + 0x0010610e, 0x0201f800, 0x00106114, 0x42027800, 0x00001000, 0x42028000, 0x0000002e, 0x0201f800, - 0x0010eeff, 0x811a3000, 0x83197480, 0x00000004, - 0x040007ec, 0x040017eb, 0x0201f800, 0x0010082f, - 0x0201f800, 0x001028e8, 0x497b507e, 0x497b4408, - 0x4201d000, 0x003d0900, 0x0201f800, 0x00105caf, + 0x0010f10e, 0x811a3000, 0x83197480, 0x00000004, + 0x040007ec, 0x040017eb, 0x0201f800, 0x0010082d, + 0x0201f800, 0x0010298e, 0x497b507e, 0x497b4408, + 0x4201d000, 0x003d0900, 0x0201f800, 0x00105e71, 0x59c50880, 0x59c510a3, 0x497b4002, 0x0401fe6b, 0x0401ff0b, 0x4a03a005, 0x10000000, 0x59c4d005, 0x8268d540, 0x000000f0, 0x486b8805, 0x0401fe83, - 0x0201f800, 0x001028ef, 0x40c50000, 0x80c589c0, + 0x0201f800, 0x00102995, 0x40c50000, 0x80c589c0, 0x04020020, 0x59c8d001, 0x8068d1c0, 0x0402001d, 0x59dcd006, 0x8268d500, 0x43200f80, 0x0400000a, 0x59dcd006, 0x82697480, 0x00000000, 0x83f17500, @@ -24192,23 +24424,23 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x04020004, 0x82797480, 0x00000032, 0x0400002b, 0x486fc857, 0x487bc857, 0x4877c857, 0x4883c857, 0x487fc857, 0x4873c857, 0x59a9700f, 0x48bbc857, - 0x0201f800, 0x00102901, 0x4a03507e, 0x00000001, + 0x0201f800, 0x001029a7, 0x4a03507e, 0x00000001, 0x4200d000, 0x00000064, 0x0401f004, 0x8068d1c0, 0x04000028, 0x8068d040, 0x59c0d807, 0x8c6cdd04, - 0x040007fb, 0x0401fe7b, 0x0201f800, 0x001037e4, - 0x0201f800, 0x00106312, 0x0401fe6a, 0x4201d000, - 0x000186a0, 0x0201f800, 0x00105caf, 0x488b88a3, + 0x040007fb, 0x0401fe7b, 0x0201f800, 0x001038af, + 0x0201f800, 0x001064d4, 0x0401fe6a, 0x4201d000, + 0x000186a0, 0x0201f800, 0x00105e71, 0x488b88a3, 0x48878880, 0x59a8d07e, 0x8068d1c0, 0x04020711, - 0x0201f800, 0x001021b9, 0x0401f030, 0x4a03507e, + 0x0201f800, 0x0010225c, 0x0401f030, 0x4a03507e, 0x00000001, 0x0401f7ec, 0x82757480, 0x000000e1, 0x040207d4, 0x407c0000, 0x80817480, 0x040207d1, 0x59a8d00f, 0x80697480, 0x040207ce, 0x8270d500, 0x000000f0, 0x040207cb, 0x0401fe48, 0x0401f7d5, - 0x4a03507e, 0x00000001, 0x0201f800, 0x001018cd, + 0x4a03507e, 0x00000001, 0x0201f800, 0x001018ce, 0x80c589c0, 0x04000008, 0x59c4d005, 0x8268d500, 0x000000f0, 0x04000007, 0x4a034408, 0x0000bbbb, 0x0401f7d1, 0x4a034408, 0x0000aaaa, 0x0401f7ce, - 0x0201f800, 0x001028ef, 0x80c57040, 0x04000008, + 0x0201f800, 0x00102995, 0x80c57040, 0x04000008, 0x59c0d007, 0x8268d500, 0x000501c0, 0x040007c6, 0x4a034408, 0x0000dddd, 0x0401f7c3, 0x4a034408, 0x0000cccc, 0x0401f7c0, 0x589d2805, 0x589d2004, @@ -24219,10 +24451,10 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x58ee580c, 0x4979d801, 0x592cd206, 0x4869d805, 0x832cd400, 0x00000007, 0x4869d803, 0x5931700d, 0x48b9d806, 0x5931700e, 0x48b9d807, 0x4a01d808, - 0x0010e5a7, 0x4a034000, 0x00000001, 0x40826000, + 0x0010e7a7, 0x4a034000, 0x00000001, 0x40826000, 0x0401fe61, 0x0401f009, 0x41310000, 0x59a26001, - 0x4933c857, 0x0201f800, 0x00106d13, 0x40826000, - 0x0201f800, 0x00102207, 0x589d0000, 0x809d3800, + 0x4933c857, 0x0201f800, 0x00106ec7, 0x40826000, + 0x0201f800, 0x001022aa, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x412d1000, 0x41310800, 0x59a26001, 0x4069d800, @@ -24238,18 +24470,18 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x58ee580c, 0x592cd205, 0x82697480, 0x00000103, 0x04000030, 0x41351800, 0x41452000, 0x592cd405, 0x8468d55e, 0x486a5c05, 0x42028800, 0x000007fd, - 0x4200d000, 0x00fffffd, 0x0201f800, 0x0010410f, + 0x4200d000, 0x00fffffd, 0x0201f800, 0x001041e5, 0x40c66800, 0x80c589c0, 0x04000010, 0x0201f800, - 0x00108730, 0x80c589c0, 0x04000018, 0x40866000, - 0x4881d801, 0x4a01d808, 0x0010e581, 0x0401f00f, - 0x0201f800, 0x001021f3, 0x0201f800, 0x00106d11, + 0x00108911, 0x80c589c0, 0x04000018, 0x40866000, + 0x4881d801, 0x4a01d808, 0x0010e781, 0x0401f00f, + 0x0201f800, 0x00102296, 0x0201f800, 0x00106ec5, 0x40866000, 0x0401f019, 0x59a26001, 0x0201f800, - 0x00106d11, 0x40866000, 0x4a034407, 0x00000002, - 0x0201f800, 0x001021fb, 0x408a5800, 0x408e6800, - 0x40928800, 0x0401f00d, 0x0201f800, 0x00106d11, + 0x00106ec5, 0x40866000, 0x4a034407, 0x00000002, + 0x0201f800, 0x0010229e, 0x408a5800, 0x408e6800, + 0x40928800, 0x0401f00d, 0x0201f800, 0x00106ec5, 0x40866000, 0x4a034407, 0x00000004, 0x0401f7f5, - 0x0201f800, 0x00106d11, 0x40866000, 0x0201f800, - 0x001021b9, 0x408a5800, 0x589d2004, 0x589d1803, + 0x0201f800, 0x00106ec5, 0x40866000, 0x0201f800, + 0x0010225c, 0x408a5800, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000005, 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, @@ -24266,12 +24498,12 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4883a003, 0x59a0d40e, 0x8068d0e0, 0x59a0da0e, 0x406c0000, 0x80691d40, 0x59a0d411, 0x8068d0e0, 0x59a0da11, 0x406c0000, 0x80691540, 0x4201d000, - 0x00003a98, 0x0201f800, 0x00105caf, 0x4883a002, + 0x00003a98, 0x0201f800, 0x00105e71, 0x4883a002, 0x59a9707f, 0x48bba008, 0x488fa000, 0x488ba001, 0x59d0d005, 0x4a03a005, 0x10000000, 0x4178d000, 0x04025002, 0x8068d000, 0x8068d1c0, 0x04020007, 0x5884d001, 0x8068d000, 0x48690801, 0x4200d800, - 0x00000001, 0x0401f011, 0x4200d000, 0x0010e618, + 0x00000001, 0x0401f011, 0x4200d000, 0x0010e818, 0x4084d800, 0x4178e000, 0x0201f800, 0x001001ec, 0x0401f7f4, 0x497a600e, 0x592e5801, 0x812e59c0, 0x040007df, 0x492e600d, 0x832cdc00, 0x00000006, @@ -24286,7 +24518,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x8c68d504, 0x0400000a, 0x59d0d006, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, 0x82b97580, 0x0c000000, 0x04020010, 0x0401f033, - 0x4200d000, 0x0010e680, 0x4080e000, 0x0201f800, + 0x4200d000, 0x0010e880, 0x4080e000, 0x0201f800, 0x001001ec, 0x59d0d006, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x040007f5, 0x82b97480, 0x0c000000, 0x040007f2, 0x4a03a005, 0x20000000, @@ -24299,9 +24531,9 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x0401ff4e, 0x0401f009, 0x4a034408, 0x0000dddd, 0x0401f006, 0x48690001, 0x4080d000, 0x0401ff47, 0x80c589c0, 0x040207f6, 0x589d0000, 0x809d3800, - 0x1c01f000, 0x0201f800, 0x001018cd, 0x80c589c0, + 0x1c01f000, 0x0201f800, 0x001018ce, 0x80c589c0, 0x04020002, 0x0401f009, 0x4a034407, 0x00000017, - 0x0201f800, 0x001021fb, 0x4203e000, 0x50000000, + 0x0201f800, 0x0010229e, 0x4203e000, 0x50000000, 0x497bc856, 0x0401f000, 0x1c01f000, 0x4068d800, 0x59c17009, 0x48bbc857, 0x59c0e009, 0x8270d500, 0x00e00000, 0x04000019, 0x586cd000, 0x486b4210, @@ -24342,7 +24574,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x48bbc857, 0x59c0d007, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x04000004, 0x82b97580, 0x0c000000, 0x04020010, 0x0401f035, 0x4200d000, - 0x0010e762, 0x4080e000, 0x0201f800, 0x001001ec, + 0x0010e962, 0x4080e000, 0x0201f800, 0x001001ec, 0x59c0d007, 0x82697480, 0x00000000, 0x83f17500, 0x0c000000, 0x040007f5, 0x82b97480, 0x0c000000, 0x040007f2, 0x4a038006, 0x20000000, 0x59c0d007, @@ -24357,12 +24589,12 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x0401ff54, 0x80c589c0, 0x040207f6, 0x589d0000, 0x809d3800, 0x1c01f000, 0x59a26000, 0x813261c0, 0x04000009, 0x59325809, 0x812e59c0, 0x04000005, - 0x0201f800, 0x00106d11, 0x0201f800, 0x00100595, + 0x0201f800, 0x00106ec5, 0x0201f800, 0x00100595, 0x497b4000, 0x59a26001, 0x813261c0, 0x04000009, 0x59325809, 0x812e59c0, 0x04000005, 0x0201f800, - 0x00106d11, 0x0201f800, 0x00100595, 0x497b4001, + 0x00106ec5, 0x0201f800, 0x00100595, 0x497b4001, 0x1c01f000, 0x809d3840, 0x48813800, 0x40690000, - 0x0201f800, 0x00102901, 0x0201f800, 0x0010e3b2, + 0x0201f800, 0x001029a7, 0x0201f800, 0x0010e5b2, 0x5880d00b, 0x8068d1c0, 0x04020004, 0x5880d00c, 0x8068d1c0, 0x04000007, 0x59a0d00d, 0x8068d1c0, 0x0402000a, 0x4200d000, 0x00000001, 0x0401f009, @@ -24370,39 +24602,39 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x8068d1c0, 0x040007f8, 0x0401ffd0, 0x0401f7f6, 0x40698800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x809d3840, 0x48813800, 0x4200d000, 0x000000ef, - 0x0201f800, 0x00101637, 0x4a03500f, 0x000000ef, + 0x0201f800, 0x00101635, 0x4a03500f, 0x000000ef, 0x59c4d0a3, 0x8468d55a, 0x8468d53a, 0x486b88a3, - 0x0201f800, 0x001016a8, 0x80c589c0, 0x04000040, - 0x4200d000, 0x00000001, 0x0201f800, 0x0010189e, - 0x4200d000, 0x00000001, 0x0201f800, 0x00101874, - 0x4201d000, 0x00000014, 0x0201f800, 0x00105c7f, + 0x0201f800, 0x001016a9, 0x80c589c0, 0x04000040, + 0x4200d000, 0x00000001, 0x0201f800, 0x0010189f, + 0x4200d000, 0x00000001, 0x0201f800, 0x00101875, + 0x4201d000, 0x00000014, 0x0201f800, 0x00105e41, 0x59c4d008, 0x8268d540, 0x00000280, 0x8268d500, 0xffffffe1, 0x486b8808, 0x4a0388a7, 0x0000f7f7, 0x4a038805, 0x04000001, 0x4200d000, 0xbe20bfff, - 0x4200d800, 0x80018000, 0x0201f800, 0x00103e8b, + 0x4200d800, 0x80018000, 0x0201f800, 0x00103f5e, 0x4200d000, 0xfffeffff, 0x4178d800, 0x0201f800, - 0x00103e8b, 0x42010000, 0x00001387, 0x0401f008, + 0x00103f5e, 0x42010000, 0x00001387, 0x0401f008, 0x80817040, 0x04000053, 0x80810040, 0x42000000, 0xffffffff, 0x80817480, 0x04000009, 0x4201d000, - 0x00000014, 0x0201f800, 0x00105c7f, 0x0201f800, - 0x001018cd, 0x80c589c0, 0x040007f2, 0x59c4d005, + 0x00000014, 0x0201f800, 0x00105e41, 0x0201f800, + 0x001018ce, 0x80c589c0, 0x040007f2, 0x59c4d005, 0x8268dd00, 0x04000000, 0x8c68d534, 0x0402001c, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x82697480, 0x00000008, 0x0402003c, 0x0401f015, 0x0201f800, - 0x001016b3, 0x80c589c0, 0x04000006, 0x4178d000, - 0x0201f800, 0x0010189e, 0x4178d000, 0x0401f7bf, - 0x0201f800, 0x001016be, 0x80c589c0, 0x04000026, - 0x4200d000, 0x00000002, 0x0201f800, 0x0010189e, + 0x001016b4, 0x80c589c0, 0x04000006, 0x4178d000, + 0x0201f800, 0x0010189f, 0x4178d000, 0x0401f7bf, + 0x0201f800, 0x001016bf, 0x80c589c0, 0x04000026, + 0x4200d000, 0x00000002, 0x0201f800, 0x0010189f, 0x4200d000, 0x00000002, 0x0401f7b4, 0x4200d000, - 0x00020000, 0x0201f800, 0x00103e92, 0x4201d000, - 0x00000064, 0x0201f800, 0x00105c7f, 0x4200d000, + 0x00020000, 0x0201f800, 0x00103f65, 0x4201d000, + 0x00000064, 0x0201f800, 0x00105e41, 0x4200d000, 0xfeffffff, 0x4200d800, 0x02000000, 0x0201f800, - 0x00103e8b, 0x4200d000, 0xfdffffff, 0x4178d800, - 0x0201f800, 0x00103e8b, 0x4a038805, 0x04000001, + 0x00103f5e, 0x4200d000, 0xfdffffff, 0x4178d800, + 0x0201f800, 0x00103f5e, 0x4a038805, 0x04000001, 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x4178d800, 0x8068d1c0, 0x0402000c, 0x4200d800, 0x00000001, 0x0401f009, 0x4200d000, 0x00000003, 0x0201f800, - 0x0010189e, 0x4200d000, 0x00000003, 0x0401f78f, + 0x0010189f, 0x4200d000, 0x00000003, 0x0401f78f, 0x40c4d800, 0x406d8800, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000003, 0x48813800, 0x48853801, 0x48893802, 0x40690000, 0x492fc857, @@ -24427,7 +24659,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, 0x497bc856, 0x4203a000, 0x00007600, 0x4200d000, 0x00000040, 0x0201f800, - 0x0010134f, 0x4a03a00a, 0x00000001, 0x4a03a005, + 0x0010134d, 0x4a03a00a, 0x00000001, 0x4a03a005, 0x20000000, 0x59d0d006, 0x4a03a005, 0x30000000, 0x59d0d006, 0x82690d00, 0x00000020, 0x8c68d50a, 0x040207fc, 0x59a0d20d, 0x48690005, 0x8068d1c0, @@ -24436,12 +24668,12 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x59a0d40e, 0x8068d0e0, 0x59a0da0e, 0x406c0000, 0x8068d540, 0x48690006, 0x59a0d40c, 0x8068d0e0, 0x59a0da0c, 0x826c0500, 0x0000fffc, 0x8068d540, - 0x48690009, 0x486ba003, 0x0201f800, 0x00106d42, + 0x48690009, 0x486ba003, 0x0201f800, 0x00106efa, 0x40c66000, 0x80c589c0, 0x0400004f, 0x49334001, 0x0201f800, 0x00100579, 0x40c65800, 0x80c589c0, 0x04000041, 0x4a025a05, 0x00000018, 0x4a025806, 0x00abcdef, 0x492e6009, 0x492e600d, 0x58817005, - 0x48ba600f, 0x48865c11, 0x4a02601d, 0x0010b111, + 0x48ba600f, 0x48865c11, 0x4a02601d, 0x0010b391, 0x4a02600e, 0x00000004, 0x832cd400, 0x00000012, 0x486a600c, 0x48690008, 0x4a01000a, 0x0000000c, 0x5880d005, 0x8068d040, 0x48690005, 0x4080d000, @@ -24455,10 +24687,10 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x03000000, 0x040007ef, 0x4979000a, 0x4178e000, 0x8270e400, 0x0000000c, 0x8068d840, 0x406cd000, 0x806cd9c0, 0x040207fb, 0x4871000a, 0x486d0005, - 0x0401f7e9, 0x4200d000, 0x0010e8cb, 0x4200d800, + 0x0401f7e9, 0x4200d000, 0x0010eacb, 0x4200d800, 0x00100579, 0x4080e000, 0x0201f800, 0x001001ec, - 0x0401f7b9, 0x4200d000, 0x0010e8cb, 0x4200d800, - 0x00106d42, 0x4080e000, 0x0201f800, 0x001001ec, + 0x0401f7b9, 0x4200d000, 0x0010eacb, 0x4200d800, + 0x00106efa, 0x4080e000, 0x0201f800, 0x001001ec, 0x0401f7ab, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x809d3840, 0x48813800, 0x40690000, 0x497bc856, 0x42038000, 0x00007700, @@ -24471,13 +24703,13 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x406c0000, 0x8068d540, 0x48690006, 0x59a0d40c, 0x8068d0e0, 0x59a0da0c, 0x826c0500, 0x0000fffc, 0x8068d540, 0x48690009, 0x486bc857, 0x58817009, - 0x48bb8003, 0x0201f800, 0x00106d42, 0x40c66000, + 0x48bb8003, 0x0201f800, 0x00106efa, 0x40c66000, 0x80c589c0, 0x0400005a, 0x49334000, 0x0201f800, 0x00100579, 0x40c65800, 0x80c589c0, 0x0400004c, 0x4a025a05, 0x00000018, 0x4a025806, 0x00abcdef, 0x492e6009, 0x492e600d, 0x58817005, 0x48ba600f, 0x4a02600e, 0x00000004, 0x497a5c11, 0x4a02601d, - 0x0010b111, 0x832cd400, 0x00000012, 0x486a600c, + 0x0010b391, 0x832cd400, 0x00000012, 0x486a600c, 0x48690008, 0x4a01000a, 0x0000000c, 0x5880d005, 0x8068d040, 0x48690005, 0x4080d000, 0x0401fed2, 0x59a0d408, 0x82697480, 0x0000dddd, 0x040007c3, @@ -24493,19 +24725,19 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x00000006, 0x48690008, 0x4080d000, 0x0401fea6, 0x80c589c0, 0x040207ea, 0x59a0d408, 0x82697480, 0x0000dddd, 0x0402078e, 0x0401f011, 0x4200d000, - 0x0010e95c, 0x4200d800, 0x00100579, 0x4080e000, + 0x0010eb5c, 0x4200d800, 0x00100579, 0x4080e000, 0x0201f800, 0x001001ec, 0x0401f7ae, 0x4200d000, - 0x0010e95c, 0x4200d800, 0x00106d42, 0x4080e000, + 0x0010eb5c, 0x4200d800, 0x00106efa, 0x4080e000, 0x0201f800, 0x001001ec, 0x0401f7a0, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690800, 0x406d0000, - 0x0201f800, 0x00101910, 0x40800000, 0x4084d000, - 0x80c4dd00, 0x0201f800, 0x00101917, 0x589d0801, + 0x0201f800, 0x00101911, 0x40800000, 0x4084d000, + 0x80c4dd00, 0x0201f800, 0x00101918, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, - 0x40690800, 0x406d0000, 0x0201f800, 0x00101910, + 0x40690800, 0x406d0000, 0x0201f800, 0x00101911, 0x40800000, 0x4084d000, 0x80c4dd40, 0x0201f800, - 0x00101917, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00101918, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x809d3840, 0x48a13800, 0x829d3c80, 0x0000000f, 0x409d4000, 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, 0x48893802, @@ -24514,37 +24746,37 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x8d0e1d0e, 0x040200a3, 0x59a0d407, 0x8268dd00, 0x00000007, 0x826d7480, 0x00000002, 0x040000aa, 0x806cd9c0, 0x04000006, 0x806d7040, 0x04000144, - 0x0201f800, 0x001021ff, 0x0401f17f, 0x4200d000, + 0x0201f800, 0x001022a2, 0x0401f17f, 0x4200d000, 0x00000802, 0x4200d800, 0x00000002, 0x0401ffc9, 0x0401fdb4, 0x80c589c0, 0x04000144, 0x59a0d410, 0x8068d0e0, 0x59a0da10, 0x406c0000, 0x8068d540, 0x48694000, 0x497b4408, 0x4979400b, 0x4979400c, 0x4979400d, 0x49794002, 0x49794001, 0x0201f800, - 0x001028e8, 0x0201f800, 0x001037c8, 0x80c589c0, - 0x040000fe, 0x0201f800, 0x00105f78, 0x598e600b, - 0x0201f800, 0x00106287, 0x0201f800, 0x00105f78, - 0x417a3000, 0x0201f800, 0x001064d2, 0x59926005, - 0x813261c0, 0x0400000d, 0x0201f800, 0x001061b6, - 0x0201f800, 0x00105f4c, 0x0201f800, 0x00105f52, + 0x0010298e, 0x0201f800, 0x00103893, 0x80c589c0, + 0x040000fe, 0x0201f800, 0x0010613a, 0x598e600b, + 0x0201f800, 0x00106449, 0x0201f800, 0x0010613a, + 0x417a3000, 0x0201f800, 0x00106694, 0x59926005, + 0x813261c0, 0x0400000d, 0x0201f800, 0x00106378, + 0x0201f800, 0x0010610e, 0x0201f800, 0x00106114, 0x42027800, 0x00001000, 0x42028000, 0x0000002e, - 0x0201f800, 0x0010eeff, 0x811a3000, 0x83197480, + 0x0201f800, 0x0010f10e, 0x811a3000, 0x83197480, 0x00000004, 0x040007ec, 0x040017eb, 0x0201f800, - 0x0010082f, 0x49794004, 0x497b4002, 0x40a0d000, + 0x0010082d, 0x49794004, 0x497b4002, 0x40a0d000, 0x0401feea, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000138, 0x40a0d000, 0x0401fe53, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000132, 0x59a0d00d, 0x8068d1c0, 0x040200f2, 0x4979400e, 0x40a0d000, - 0x0201f800, 0x0010e618, 0x0201f800, 0x0010e358, + 0x0201f800, 0x0010e818, 0x0201f800, 0x0010e558, 0x58a0d004, 0x8068d1c0, 0x040000ca, 0x58a0e00e, 0x80717040, 0x04000062, 0x59c8d001, 0x8068d1c0, 0x040200d6, 0x59a0d002, 0x42000000, 0xfeedbeef, 0x80697480, 0x040000db, 0x4a014003, 0x10000000, 0x40a0d000, 0x0401fc6f, 0x4a034002, 0xfeedbeef, - 0x40a0d000, 0x0201f800, 0x0010e680, 0x59a0d408, + 0x40a0d000, 0x0201f800, 0x0010e880, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000028, 0x40a0d000, 0x0401fcc0, 0x59a0d408, 0x82697480, 0x0000dddd, - 0x04000022, 0x0201f800, 0x0010e3a0, 0x59c4d005, - 0x8c68d534, 0x0402003c, 0x0201f800, 0x001028ef, + 0x04000022, 0x0201f800, 0x0010e5a0, 0x59c4d005, + 0x8c68d534, 0x0402003c, 0x0201f800, 0x00102995, 0x80c589c0, 0x040200e4, 0x59a0d00d, 0x8068d1c0, 0x04000016, 0x59a26000, 0x59a0d40d, 0x8068d1c0, 0x04000004, 0x5930d00f, 0x8068d1c0, 0x040207c7, @@ -24552,13 +24784,13 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x5930d00f, 0x8068d1c0, 0x040207c0, 0x58a0d002, 0x8068d1c0, 0x040207bd, 0x58a0d001, 0x8068d1c0, 0x040207ba, 0x0401fcf1, 0x58a0e00e, 0x0401f024, - 0x0201f800, 0x001016d4, 0x80c589c0, 0x0400075b, - 0x4200d000, 0x00000003, 0x0201f800, 0x0010189e, - 0x4200d000, 0x00000003, 0x0201f800, 0x00101874, + 0x0201f800, 0x001016d5, 0x80c589c0, 0x0400075b, + 0x4200d000, 0x00000003, 0x0201f800, 0x0010189f, + 0x4200d000, 0x00000003, 0x0201f800, 0x00101875, 0x0401f752, 0x8d0e1d0e, 0x0402000c, 0x0201f800, - 0x00104a28, 0x80c589c0, 0x040200bf, 0x836d7480, + 0x00104b2d, 0x80c589c0, 0x040200bf, 0x836d7480, 0x00000003, 0x04020005, 0x59c4d0a4, 0x8268d500, - 0x0000000f, 0x0400075a, 0x0201f800, 0x00102203, + 0x0000000f, 0x0400075a, 0x0201f800, 0x001022a6, 0x0401f0cd, 0x4a01400d, 0x0000bbbb, 0x4a01400e, 0x00000001, 0x4200e000, 0x00000001, 0x58a0d000, 0x8068d040, 0x48694000, 0x4200d800, 0x00030d40, @@ -24566,10 +24798,10 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x04000004, 0x59c0d007, 0x8c68d504, 0x040007fc, 0x59c0d007, 0x8c68d504, 0x0402008a, 0x59c0d007, 0x8268d500, 0x000501c0, 0x04020003, 0x0201f800, - 0x0010e6d7, 0x4a01400d, 0x0000dddd, 0x40a0d000, + 0x0010e8d7, 0x4a01400d, 0x0000dddd, 0x40a0d000, 0x0401fcc9, 0x80c589c0, 0x04020004, 0x58a0d000, - 0x8068d1c0, 0x04020764, 0x0201f800, 0x001037e4, - 0x0201f800, 0x00106312, 0x0201f800, 0x0010e3a6, + 0x8068d1c0, 0x04020764, 0x0201f800, 0x001038af, + 0x0201f800, 0x001064d4, 0x0201f800, 0x0010e5a6, 0x4201d000, 0x000186a0, 0x48938880, 0x488f8808, 0x488b88a3, 0x4883500f, 0x48879040, 0x42038000, 0x00007700, 0x4a038009, 0xf4f60000, 0x4a038891, @@ -24579,22 +24811,22 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x04000010, 0x4200d000, 0x00000802, 0x4200d800, 0xfffffffc, 0x0401fec1, 0x4200d000, 0x0000240c, 0x4200d800, 0xffffff7f, 0x0401febc, 0x0201f800, - 0x00104a3e, 0x40c50000, 0x80c589c0, 0x04000067, + 0x00104b43, 0x40c50000, 0x80c589c0, 0x04000067, 0x59a0d408, 0x82697480, 0x0000dddd, 0x0400000f, 0x58a0d80b, 0x806cd9c0, 0x04020007, 0x58a0d00c, 0x8068d1c0, 0x04020004, 0x58a0d00d, 0x8068d1c0, 0x0400006b, 0x486f4407, 0x58a0d00c, 0x486b4208, - 0x58a0d00d, 0x486b4408, 0x0201f800, 0x0010220b, + 0x58a0d00d, 0x486b4408, 0x0201f800, 0x001022ae, 0x0401f065, 0x59c8d001, 0x8068d1c0, 0x04020738, - 0x40a0d000, 0x0201f800, 0x0010e680, 0x59a0d408, + 0x40a0d000, 0x0201f800, 0x0010e880, 0x59a0d408, 0x82697480, 0x0000dddd, 0x04000731, 0x0201f800, - 0x001028ef, 0x80c589c0, 0x040007f3, 0x0201f800, - 0x0010e6d7, 0x4a01400d, 0x0000aaaa, 0x4a01400e, + 0x00102995, 0x80c589c0, 0x040007f3, 0x0201f800, + 0x0010e8d7, 0x4a01400d, 0x0000aaaa, 0x4a01400e, 0x00000001, 0x0401f726, 0x40a0d000, 0x0201f800, - 0x0010e6e5, 0x80c589c0, 0x04020781, 0x59a0d002, + 0x0010e8e5, 0x80c589c0, 0x04020781, 0x59a0d002, 0x42000000, 0xfeedbeef, 0x80697480, 0x04020727, 0x4a014003, 0x10000004, 0x0401f726, 0x40a0d000, - 0x0201f800, 0x0010e618, 0x0401f70c, 0x4200d000, + 0x0201f800, 0x0010e818, 0x0401f70c, 0x4200d000, 0x00000802, 0x0401fe8b, 0x4200d000, 0x0000240c, 0x4200d800, 0x00000080, 0x0401fe86, 0x0401fc71, 0x80c589c0, 0x040206be, 0x4084d000, 0x4088d800, @@ -24605,412 +24837,411 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x0401f77a, 0x4a01400d, 0x0000cccc, 0x58a0d000, 0x486b4210, 0x58a0d000, 0x8068d120, 0x486b4410, 0x0401f74f, 0x4a034407, 0x00000016, 0x0201f800, - 0x001021fb, 0x0401f014, 0x4a0388a7, 0x0000f7f7, + 0x0010229e, 0x0401f014, 0x4a0388a7, 0x0000f7f7, 0x4200d000, 0xbeffffff, 0x4200d800, 0x80018000, - 0x0201f800, 0x00103e8b, 0x4200d000, 0xfffeffff, - 0x4080d800, 0x0201f800, 0x00103e8b, 0x0401f78d, + 0x0201f800, 0x00103f5e, 0x4200d000, 0xfffeffff, + 0x4080d800, 0x0201f800, 0x00103f5e, 0x0401f78d, 0x40a0d000, 0x0401fc20, 0x0401f75c, 0x0201f800, - 0x001021b9, 0x589d2004, 0x589d1803, 0x589d1002, + 0x0010225c, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000014, - 0x589d4000, 0x809d3800, 0x1c01f000, 0x809d3840, - 0x48813800, 0x4937c857, 0x42010000, 0x00000001, - 0x0201f800, 0x00106d42, 0x40c66000, 0x80c589c0, - 0x04000017, 0x4925881d, 0x4935880a, 0x0201f800, - 0x001086df, 0x48826407, 0x417a7800, 0x0201f800, - 0x001040e0, 0x59a8d016, 0x8068d000, 0x486b5016, - 0x599cd019, 0x417a7000, 0x8c68d50e, 0x04020003, - 0x42027000, 0x00000004, 0x0201f800, 0x00106d6c, - 0x599cd208, 0x486a6c12, 0x41790000, 0x40818800, - 0x589d0000, 0x809d3800, 0x1c01f000, 0x4937c857, - 0x5934d200, 0x8468d502, 0x486a6a00, 0x1c01f000, - 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, - 0x48893802, 0x488d3803, 0x41350800, 0x41451000, - 0x412d1800, 0x4943c857, 0x493fc857, 0x0201f800, - 0x00105f78, 0x40c50000, 0x8d3e7d18, 0x04000003, - 0x8d3e7d16, 0x04000068, 0x0201f800, 0x0010f1b7, - 0x0201f800, 0x0010f1a7, 0x0201f800, 0x0010f25c, - 0x0201f800, 0x0010f3a9, 0x808101c0, 0x04000003, - 0x0201f800, 0x00105f69, 0x417a8800, 0x0401f00a, - 0x58c4d200, 0x8c68d50e, 0x0400000e, 0x81468800, - 0x83457480, 0x000007ef, 0x83f17500, 0x03000000, - 0x04000026, 0x0201f800, 0x001041cf, 0x40c66800, - 0x80c589c0, 0x040007f6, 0x8d3e7d06, 0x040207f1, - 0x8d3e7d18, 0x0400003f, 0x5935000f, 0x0401f007, - 0x49410207, 0x40825800, 0x58810000, 0x492fc857, - 0x0201f800, 0x0002035b, 0x808101c0, 0x040207f9, - 0x497a680f, 0x497a6810, 0x4937c857, 0x4a026c00, - 0x00000707, 0x497a6a03, 0x497a6811, 0x599cd401, - 0x486a6a0b, 0x5934d402, 0x8268d500, 0x000000ff, - 0x486a6c02, 0x81468800, 0x83457480, 0x000007ef, - 0x040007dd, 0x040017dc, 0x8d3e7d02, 0x0400002d, - 0x497b5018, 0x42028800, 0x000007f0, 0x0401f007, - 0x81468800, 0x83457480, 0x000007ff, 0x83f17500, - 0x03000000, 0x04000023, 0x0201f800, 0x001041cf, - 0x40c66800, 0x80c589c0, 0x040007f6, 0x48c7c857, - 0x4a018c00, 0x00000707, 0x58c4d00c, 0x8068d1c0, - 0x040207f0, 0x58c4d00f, 0x8068d1c0, 0x040207ed, - 0x0201f800, 0x00103ebf, 0x81468800, 0x83457480, - 0x000007ff, 0x040007ed, 0x040017ec, 0x0401f00d, - 0x4937c857, 0x8d0e1d20, 0x04000004, 0x4a026c00, - 0x00000707, 0x0401f7ae, 0x0201f800, 0x00103ebf, - 0x0401f7ab, 0x0201f800, 0x0010edc4, 0x0401f797, - 0x40866800, 0x408a8800, 0x408e5800, 0x589d1803, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000004, 0x1c01f000, 0x829d3c80, 0x00000006, - 0x48813800, 0x48853801, 0x48893802, 0x488d3803, - 0x48913804, 0x48953805, 0x41352800, 0x41412000, - 0x41451800, 0x412d1000, 0x4933c857, 0x493fc857, - 0x4927c857, 0x0201f800, 0x00105f78, 0x40c50800, - 0x5932680a, 0x813669c0, 0x0400002f, 0x5934d403, - 0x406a8800, 0x42028000, 0x00000029, 0x8d3e7d18, - 0x0402002c, 0x0201f800, 0x0010f051, 0x0201f800, - 0x0010f148, 0x0201f800, 0x0010f1e1, 0x0201f800, - 0x0010f603, 0x4937c857, 0x8d3e7d06, 0x04000004, - 0x5934d200, 0x8c68d50e, 0x0402001b, 0x8d3e7d18, - 0x04000021, 0x5935000f, 0x808101c0, 0x0400000b, - 0x49410207, 0x40825800, 0x58810000, 0x492fc857, - 0x0201f800, 0x0002035b, 0x808101c0, 0x040207f9, - 0x4882680f, 0x48826810, 0x4937c857, 0x4a026c00, - 0x00000707, 0x497a6a03, 0x497a6811, 0x599cd401, - 0x486a6a0b, 0x5934d402, 0x8268d500, 0x000000ff, - 0x486a6c02, 0x808509c0, 0x04000013, 0x0401f00c, - 0x8d3e7d16, 0x040207d4, 0x0201f800, 0x00105e35, - 0x0401f7d1, 0x8d0e1d20, 0x04000008, 0x4a026c00, - 0x00000707, 0x808509c0, 0x04000007, 0x0201f800, - 0x00105f69, 0x0401f004, 0x0201f800, 0x00103ebf, - 0x0401f7ed, 0x408a5800, 0x408e8800, 0x40928000, - 0x40966800, 0x589d2805, 0x589d2004, 0x589d1803, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000006, 0x1c01f000, 0x809d3840, 0x48813800, - 0x4937c857, 0x42010000, 0x00000001, 0x0201f800, - 0x00106d42, 0x40c66000, 0x80c589c0, 0x04000020, - 0x4925881d, 0x4935880a, 0x5934d403, 0x82697480, - 0x000007fe, 0x04000003, 0x417a7800, 0x0401ff8b, - 0x0201f800, 0x001086df, 0x48826407, 0x417a7800, - 0x0201f800, 0x001040e0, 0x4200d000, 0x00000003, - 0x0201f800, 0x001040ea, 0x836d7480, 0x00000003, - 0x04000004, 0x59a8d016, 0x8068d000, 0x486b5016, - 0x42027000, 0x00000002, 0x0201f800, 0x00106d6c, - 0x599cd208, 0x486a6c12, 0x41790000, 0x40818800, - 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, - 0x00000003, 0x48813800, 0x48853801, 0x48893802, - 0x40690800, 0x406d1000, 0x40d50000, 0x0201f800, - 0x00105f52, 0x5880d02f, 0x41300000, 0x80697480, - 0x04000018, 0x5880d02e, 0x41300000, 0x80697480, - 0x0400001f, 0x5930d800, 0x806cd9c0, 0x04020008, - 0x59317001, 0x48b91001, 0x5930d001, 0x8068d1c0, - 0x04020025, 0x488a680c, 0x0401f038, 0x5930d801, - 0x806cd9c0, 0x04000022, 0x59317000, 0x48b8d800, - 0x486d0800, 0x497a6001, 0x497a6000, 0x0401f02f, - 0x5930d801, 0x806cd9c0, 0x04000010, 0x5930d000, - 0x8068d1c0, 0x04020025, 0x486d002e, 0x59317001, - 0x48b9002f, 0x497a6001, 0x0401f024, 0x5930d001, - 0x8068d1c0, 0x04020013, 0x4885002e, 0x48690800, - 0x486a680c, 0x0401f01d, 0x5930d000, 0x8068d1c0, - 0x04020012, 0x486d002f, 0x486d002e, 0x497a680c, - 0x0401f016, 0x486e6001, 0x0401f014, 0x59317000, - 0x48b90800, 0x486e680c, 0x497a6000, 0x0401f00f, - 0x59317001, 0x48b9002e, 0x59317001, 0x48b90800, - 0x497a6001, 0x0401f009, 0x59317000, 0x48b9002f, - 0x486e6000, 0x0401f7ee, 0x59317000, 0x48b8d800, - 0x497a6000, 0x0401f7da, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000003, 0x1c01f000, - 0x809d3840, 0x48a13800, 0x829d3c80, 0x00000005, - 0x409d4000, 0x829d3c80, 0x00000005, 0x48813800, - 0x48853801, 0x48893802, 0x488d3803, 0x48913804, - 0x41790800, 0x40850000, 0x4933c857, 0x0201f800, - 0x00105f78, 0x40c52000, 0x41351800, 0x41191000, - 0x49914003, 0x49d14000, 0x49a54001, 0x49154002, - 0x48d94004, 0x5932680a, 0x58d4e02f, 0x4070d800, - 0x8070e1c0, 0x04020008, 0x0401f01e, 0x406ce000, - 0x586cd800, 0x806cd9c0, 0x0400001a, 0x808509c0, - 0x04020018, 0x41300000, 0x806d7480, 0x04000011, - 0x586cd00a, 0x41340000, 0x80697480, 0x040207f4, - 0x406d0000, 0x586cd801, 0x806cd9c0, 0x040007f2, - 0x41300000, 0x0401f005, 0x406d0000, 0x586cd801, - 0x806cd9c0, 0x040007ec, 0x806d7480, 0x040207fb, - 0x42010800, 0x00000001, 0x806cd9c0, 0x040207e8, - 0x80857040, 0x04000020, 0x417a3000, 0x0201f800, - 0x001064d2, 0x5990d005, 0x41300000, 0x80697480, - 0x04000010, 0x811a3000, 0x83197480, 0x00000004, - 0x040007f7, 0x040017f6, 0x408a3000, 0x408e6800, - 0x58a32003, 0x58a3a000, 0x58a34801, 0x58a22802, - 0x58a1b004, 0x80917040, 0x04020011, 0x0401f00e, - 0x42010800, 0x00000001, 0x0201f800, 0x001061b6, - 0x0201f800, 0x00105f4c, 0x0201f800, 0x00105f52, - 0x0401f7ee, 0x4070d000, 0x4080d800, 0x0401ff48, - 0x0401f7ea, 0x0201f800, 0x00105f69, 0x40858800, - 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x0000000a, 0x589d4000, - 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000002, - 0x48813800, 0x48853801, 0x41310800, 0x598e6005, - 0x813261c0, 0x0400000b, 0x59310000, 0x0201f800, - 0x00105e7c, 0x0201f800, 0x00106d11, 0x0201f800, - 0x00105f62, 0x40826000, 0x813261c0, 0x040207f7, - 0x497b1805, 0x497b1804, 0x40866000, 0x589d0801, + 0x589d4000, 0x809d3800, 0x1c01f000, 0x829d3c80, + 0x00000002, 0x48813800, 0x48853801, 0x59a8d006, + 0x82690d00, 0x00004000, 0x4178d800, 0x8c68d51c, + 0x04020022, 0x4937c857, 0x42010000, 0x00000001, + 0x0201f800, 0x00106efa, 0x40c66000, 0x80c589c0, + 0x04020003, 0x4080d800, 0x0401f018, 0x4925881d, + 0x4935880a, 0x0201f800, 0x001088c0, 0x48826407, + 0x40867800, 0x0201f800, 0x001041b3, 0x59a8d016, + 0x8068d000, 0x486b5016, 0x599cd019, 0x40867000, + 0x8c68d50e, 0x04020003, 0x42027000, 0x00000004, + 0x0201f800, 0x00106f24, 0x599cd208, 0x486a6c12, + 0x41790000, 0x4080d800, 0x406d8800, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, + 0x4937c857, 0x5934d200, 0x8468d502, 0x486a6a00, + 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, + 0x48853801, 0x48893802, 0x488d3803, 0x41350800, + 0x41451000, 0x412d1800, 0x4943c857, 0x493fc857, + 0x0201f800, 0x0010613a, 0x40c50000, 0x8d3e7d18, + 0x04000003, 0x8d3e7d16, 0x04000069, 0x0201f800, + 0x0010f3b3, 0x0201f800, 0x0010f3a3, 0x0201f800, + 0x0010f458, 0x0201f800, 0x0010f5a5, 0x808101c0, + 0x04000003, 0x0201f800, 0x0010612b, 0x417a8800, + 0x0401f00a, 0x58c4d200, 0x8c68d50e, 0x0400000e, + 0x81468800, 0x83457480, 0x000007ef, 0x83f17500, + 0x03000000, 0x04000027, 0x0201f800, 0x001042a5, + 0x40c66800, 0x80c589c0, 0x040007f6, 0x8d3e7d06, + 0x040207f1, 0x497a6c0b, 0x8d3e7d18, 0x0400003f, + 0x5935000f, 0x0401f007, 0x49410207, 0x40825800, + 0x58810000, 0x492fc857, 0x0201f800, 0x0002035b, + 0x808101c0, 0x040207f9, 0x497a680f, 0x497a6810, + 0x4937c857, 0x4a026c00, 0x00000707, 0x497a6a03, + 0x497a6811, 0x599cd401, 0x486a6a0b, 0x5934d402, + 0x8268d500, 0x000000ff, 0x486a6c02, 0x81468800, + 0x83457480, 0x000007ef, 0x040007dc, 0x040017db, + 0x8d3e7d02, 0x0400002d, 0x497b5018, 0x42028800, + 0x000007f0, 0x0401f007, 0x81468800, 0x83457480, + 0x000007ff, 0x83f17500, 0x03000000, 0x04000023, + 0x0201f800, 0x001042a5, 0x40c66800, 0x80c589c0, + 0x040007f6, 0x48c7c857, 0x4a018c00, 0x00000707, + 0x58c4d00c, 0x8068d1c0, 0x040207f0, 0x58c4d00f, + 0x8068d1c0, 0x040207ed, 0x0201f800, 0x00103f92, + 0x81468800, 0x83457480, 0x000007ff, 0x040007ed, + 0x040017ec, 0x0401f00d, 0x4937c857, 0x8d0e1d20, + 0x04000004, 0x4a026c00, 0x00000707, 0x0401f7ad, + 0x0201f800, 0x00103f92, 0x0401f7aa, 0x0201f800, + 0x0010efd3, 0x0401f796, 0x40866800, 0x408a8800, + 0x408e5800, 0x589d1803, 0x589d1002, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000004, 0x1c01f000, + 0x829d3c80, 0x00000006, 0x48813800, 0x48853801, + 0x48893802, 0x488d3803, 0x48913804, 0x48953805, + 0x41352800, 0x41412000, 0x41451800, 0x412d1000, + 0x4933c857, 0x493fc857, 0x4927c857, 0x0201f800, + 0x0010613a, 0x40c50800, 0x5932680a, 0x813669c0, + 0x04000030, 0x5934d403, 0x406a8800, 0x42028000, + 0x00000029, 0x8d3e7d18, 0x0402002d, 0x0201f800, + 0x0010f260, 0x0201f800, 0x0010f344, 0x0201f800, + 0x0010f3dd, 0x0201f800, 0x0010f7f5, 0x4937c857, + 0x8d3e7d06, 0x04000004, 0x5934d200, 0x8c68d50e, + 0x0402001c, 0x497a6c0b, 0x8d3e7d18, 0x04000021, + 0x5935000f, 0x808101c0, 0x0400000b, 0x49410207, + 0x40825800, 0x58810000, 0x492fc857, 0x0201f800, + 0x0002035b, 0x808101c0, 0x040207f9, 0x4882680f, + 0x48826810, 0x4937c857, 0x4a026c00, 0x00000707, + 0x497a6a03, 0x497a6811, 0x599cd401, 0x486a6a0b, + 0x5934d402, 0x8268d500, 0x000000ff, 0x486a6c02, + 0x808509c0, 0x04000013, 0x0401f00c, 0x8d3e7d16, + 0x040207d3, 0x0201f800, 0x00105ff7, 0x0401f7d0, + 0x8d0e1d20, 0x04000008, 0x4a026c00, 0x00000707, + 0x808509c0, 0x04000007, 0x0201f800, 0x0010612b, + 0x0401f004, 0x0201f800, 0x00103f92, 0x0401f7ed, + 0x408a5800, 0x408e8800, 0x40928000, 0x40966800, + 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, + 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000006, + 0x1c01f000, 0x809d3840, 0x48813800, 0x4937c857, + 0x42010000, 0x00000001, 0x0201f800, 0x00106efa, + 0x40c66000, 0x80c589c0, 0x04000020, 0x4925881d, + 0x4935880a, 0x5934d403, 0x82697480, 0x000007fe, + 0x04000003, 0x417a7800, 0x0401ff8a, 0x0201f800, + 0x001088c0, 0x48826407, 0x417a7800, 0x0201f800, + 0x001041b3, 0x4200d000, 0x00000003, 0x0201f800, + 0x001041bd, 0x836d7480, 0x00000003, 0x04000004, + 0x59a8d016, 0x8068d000, 0x486b5016, 0x42027000, + 0x00000002, 0x0201f800, 0x00106f24, 0x599cd208, + 0x486a6c12, 0x41790000, 0x40818800, 0x589d0000, + 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000003, + 0x48813800, 0x48853801, 0x48893802, 0x40690800, + 0x406d1000, 0x40d50000, 0x0201f800, 0x00106114, + 0x5880d02f, 0x41300000, 0x80697480, 0x04000018, + 0x5880d02e, 0x41300000, 0x80697480, 0x0400001f, + 0x5930d800, 0x806cd9c0, 0x04020008, 0x59317001, + 0x48b91001, 0x5930d001, 0x8068d1c0, 0x04020025, + 0x488a680c, 0x0401f038, 0x5930d801, 0x806cd9c0, + 0x04000022, 0x59317000, 0x48b8d800, 0x486d0800, + 0x497a6001, 0x497a6000, 0x0401f02f, 0x5930d801, + 0x806cd9c0, 0x04000010, 0x5930d000, 0x8068d1c0, + 0x04020025, 0x486d002e, 0x59317001, 0x48b9002f, + 0x497a6001, 0x0401f024, 0x5930d001, 0x8068d1c0, + 0x04020013, 0x4885002e, 0x48690800, 0x486a680c, + 0x0401f01d, 0x5930d000, 0x8068d1c0, 0x04020012, + 0x486d002f, 0x486d002e, 0x497a680c, 0x0401f016, + 0x486e6001, 0x0401f014, 0x59317000, 0x48b90800, + 0x486e680c, 0x497a6000, 0x0401f00f, 0x59317001, + 0x48b9002e, 0x59317001, 0x48b90800, 0x497a6001, + 0x0401f009, 0x59317000, 0x48b9002f, 0x486e6000, + 0x0401f7ee, 0x59317000, 0x48b8d800, 0x497a6000, + 0x0401f7da, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000003, 0x1c01f000, 0x809d3840, + 0x48a13800, 0x829d3c80, 0x00000005, 0x409d4000, + 0x829d3c80, 0x00000005, 0x48813800, 0x48853801, + 0x48893802, 0x488d3803, 0x48913804, 0x41790800, + 0x40850000, 0x4933c857, 0x0201f800, 0x0010613a, + 0x40c52000, 0x41351800, 0x41191000, 0x49914003, + 0x49d14000, 0x49a54001, 0x49154002, 0x48d94004, + 0x5932680a, 0x58d4e02f, 0x4070d800, 0x8070e1c0, + 0x04020008, 0x0401f01e, 0x406ce000, 0x586cd800, + 0x806cd9c0, 0x0400001a, 0x808509c0, 0x04020018, + 0x41300000, 0x806d7480, 0x04000011, 0x586cd00a, + 0x41340000, 0x80697480, 0x040207f4, 0x406d0000, + 0x586cd801, 0x806cd9c0, 0x040007f2, 0x41300000, + 0x0401f005, 0x406d0000, 0x586cd801, 0x806cd9c0, + 0x040007ec, 0x806d7480, 0x040207fb, 0x42010800, + 0x00000001, 0x806cd9c0, 0x040207e8, 0x80857040, + 0x04000020, 0x417a3000, 0x0201f800, 0x00106694, + 0x5990d005, 0x41300000, 0x80697480, 0x04000010, + 0x811a3000, 0x83197480, 0x00000004, 0x040007f7, + 0x040017f6, 0x408a3000, 0x408e6800, 0x58a32003, + 0x58a3a000, 0x58a34801, 0x58a22802, 0x58a1b004, + 0x80917040, 0x04020011, 0x0401f00e, 0x42010800, + 0x00000001, 0x0201f800, 0x00106378, 0x0201f800, + 0x0010610e, 0x0201f800, 0x00106114, 0x0401f7ee, + 0x4070d000, 0x4080d800, 0x0401ff48, 0x0401f7ea, + 0x0201f800, 0x0010612b, 0x40858800, 0x589d2004, + 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x0000000a, 0x589d4000, 0x809d3800, + 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, + 0x48853801, 0x41310800, 0x598e6005, 0x813261c0, + 0x0400000b, 0x59310000, 0x0201f800, 0x0010603e, + 0x0201f800, 0x00106ec5, 0x0201f800, 0x00106124, + 0x40826000, 0x813261c0, 0x040207f7, 0x497b1805, + 0x497b1804, 0x40866000, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, + 0x00000002, 0x48813800, 0x48853801, 0x40690000, + 0x59310800, 0x497a6000, 0x0201f800, 0x00106114, + 0x808101c0, 0x04000008, 0x48850000, 0x598cd002, + 0x41300000, 0x80697480, 0x0402000b, 0x48831802, + 0x0401f009, 0x598cd002, 0x41300000, 0x80697480, + 0x04000003, 0x48871803, 0x0401f003, 0x48831802, + 0x48831803, 0x0201f800, 0x00106124, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, 0x59310800, 0x497a6000, 0x0201f800, - 0x00105f52, 0x808101c0, 0x04000008, 0x48850000, - 0x598cd002, 0x41300000, 0x80697480, 0x0402000b, - 0x48831802, 0x0401f009, 0x598cd002, 0x41300000, - 0x80697480, 0x04000003, 0x48871803, 0x0401f003, - 0x48831802, 0x48831803, 0x0201f800, 0x00105f62, + 0x00106114, 0x808101c0, 0x04000008, 0x48850000, + 0x598cd006, 0x41300000, 0x80697480, 0x0402000b, + 0x48831806, 0x0401f009, 0x598cd006, 0x41300000, + 0x80697480, 0x04000003, 0x48871807, 0x0401f003, + 0x48831806, 0x48831807, 0x0201f800, 0x00106124, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x40690000, 0x59310800, 0x497a6000, - 0x0201f800, 0x00105f52, 0x808101c0, 0x04000008, - 0x48850000, 0x598cd006, 0x41300000, 0x80697480, - 0x0402000b, 0x48831806, 0x0401f009, 0x598cd006, - 0x41300000, 0x80697480, 0x04000003, 0x48871807, - 0x0401f003, 0x48831806, 0x48831807, 0x0201f800, - 0x00105f62, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x0201f800, 0x00106114, 0x808101c0, 0x04000008, + 0x48850000, 0x598cd008, 0x41300000, 0x80697480, + 0x0402000b, 0x48831808, 0x0401f009, 0x598cd008, + 0x41300000, 0x80697480, 0x04000003, 0x48871809, + 0x0401f003, 0x48831808, 0x48831809, 0x0201f800, + 0x00106124, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, - 0x48813800, 0x48853801, 0x40690000, 0x59310800, - 0x497a6000, 0x0201f800, 0x00105f52, 0x808101c0, - 0x04000008, 0x48850000, 0x598cd008, 0x41300000, - 0x80697480, 0x0402000b, 0x48831808, 0x0401f009, - 0x598cd008, 0x41300000, 0x80697480, 0x04000003, - 0x48871809, 0x0401f003, 0x48831808, 0x48831809, - 0x0201f800, 0x00105f62, 0x589d0801, 0x589d0000, - 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, - 0x00000002, 0x48813800, 0x48853801, 0x598d0003, - 0x40810800, 0x4933c857, 0x813261c0, 0x04020007, - 0x0401f00a, 0x41300000, 0x80817480, 0x0400000e, - 0x40810800, 0x58810000, 0x808101c0, 0x040207fa, - 0x4178d000, 0x0401f02b, 0x4200d000, 0x000005ea, - 0x4080d800, 0x4080e000, 0x0201f800, 0x001001ec, - 0x0401f7f6, 0x598cd00b, 0x80697480, 0x0400001e, - 0x0201f800, 0x00105f52, 0x598cd003, 0x40800000, - 0x80697480, 0x04000010, 0x598cd002, 0x80697480, - 0x04000009, 0x58817000, 0x48b90800, 0x49790000, - 0x0201f800, 0x00105f62, 0x4200d000, 0x00000001, - 0x0401f010, 0x48871802, 0x49790000, 0x49790800, - 0x0401f7f8, 0x58817000, 0x48bb1803, 0x49790000, - 0x598cd002, 0x80697480, 0x040207f2, 0x497b1802, - 0x0401f7f0, 0x0201f800, 0x001064ba, 0x0401f7e1, - 0x40698800, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, - 0x48813800, 0x48853801, 0x598d0009, 0x41790800, + 0x48813800, 0x48853801, 0x598d0003, 0x40810800, 0x4933c857, 0x813261c0, 0x04020007, 0x0401f00a, 0x41300000, 0x80817480, 0x0400000e, 0x40810800, 0x58810000, 0x808101c0, 0x040207fa, 0x4178d000, - 0x0401f015, 0x4200d000, 0x000005a7, 0x4080d800, - 0x4084e000, 0x0201f800, 0x001001ec, 0x0401f7f6, - 0x4084d000, 0x0401ff81, 0x598cd00b, 0x41300000, - 0x80697480, 0x04000005, 0x497a6008, 0x4200d000, - 0x00000001, 0x0401f004, 0x0201f800, 0x001064ba, - 0x0401f7fa, 0x40698800, 0x589d0801, 0x589d0000, - 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, - 0x00000002, 0x48813800, 0x48853801, 0x598d0007, - 0x41790800, 0x4933c857, 0x813261c0, 0x04020007, - 0x0401f017, 0x41300000, 0x80817480, 0x04000007, - 0x40810800, 0x58810000, 0x808101c0, 0x040207fa, - 0x4178d000, 0x0401f01a, 0x4084d000, 0x0401ff3a, - 0x598cd00b, 0x41300000, 0x80697480, 0x04000011, - 0x5930d403, 0x82697480, 0x00000042, 0x0400000b, - 0x4200d000, 0x00000001, 0x0401f00d, 0x4200d000, - 0x0000055e, 0x4080d800, 0x4084e000, 0x0201f800, - 0x001001ec, 0x0401f7e9, 0x497a6008, 0x0401f7f5, - 0x0201f800, 0x001064ba, 0x0401f7ee, 0x40698800, + 0x0401f02b, 0x4200d000, 0x000005ed, 0x4080d800, + 0x4080e000, 0x0201f800, 0x001001ec, 0x0401f7f6, + 0x598cd00b, 0x80697480, 0x0400001e, 0x0201f800, + 0x00106114, 0x598cd003, 0x40800000, 0x80697480, + 0x04000010, 0x598cd002, 0x80697480, 0x04000009, + 0x58817000, 0x48b90800, 0x49790000, 0x0201f800, + 0x00106124, 0x4200d000, 0x00000001, 0x0401f010, + 0x48871802, 0x49790000, 0x49790800, 0x0401f7f8, + 0x58817000, 0x48bb1803, 0x49790000, 0x598cd002, + 0x80697480, 0x040207f2, 0x497b1802, 0x0401f7f0, + 0x0201f800, 0x0010667c, 0x0401f7e1, 0x40698800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, - 0x48853801, 0x41790000, 0x0201f800, 0x00105f78, - 0x40c50800, 0x0401ffc6, 0x80c57040, 0x04000007, - 0x0401ff96, 0x80c57040, 0x04000004, 0x0401ff50, - 0x80c57040, 0x04020002, 0x40c50000, 0x80857040, - 0x04020003, 0x0201f800, 0x00105f69, 0x40818800, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, - 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, - 0x48853801, 0x5c00d000, 0x4c680000, 0x486bc857, - 0x41350000, 0x412d0800, 0x5932680a, 0x59325809, - 0x4933c857, 0x4943c857, 0x493fc857, 0x5930d407, - 0x486bc857, 0x5930dc07, 0x806c0040, 0x4000d000, - 0x82697480, 0x00000010, 0x83f17500, 0x03000000, - 0x04000013, 0x0c01f001, 0x0010ef66, 0x0010ef3c, - 0x0010ef4a, 0x0010ef66, 0x0010ef6f, 0x0010ef7c, - 0x0010ef29, 0x0010ef29, 0x0010ef29, 0x0010ef86, - 0x0010ef29, 0x0010ef29, 0x0010ef29, 0x0010ef29, - 0x0010ef29, 0x0010ef2f, 0x0010ef2f, 0x4200d000, - 0x00000a6e, 0x4130e000, 0x0201f800, 0x001001ec, - 0x0401f092, 0x0201f800, 0x0010830d, 0x80c589c0, - 0x04020062, 0x59325819, 0x0201f800, 0x00100595, - 0x0201f800, 0x00106d13, 0x8d3e7d1c, 0x04000087, - 0x497a600a, 0x0401f085, 0x0201f800, 0x0010830d, - 0x80c589c0, 0x040007f7, 0x49425a07, 0x0201f800, - 0x0002035b, 0x5930d229, 0x82697480, 0x00000003, - 0x040207f0, 0x0201f800, 0x001083f6, 0x0401f7ed, - 0x5930d008, 0x8c68d500, 0x0402004c, 0x0201f800, - 0x0010830d, 0x80c589c0, 0x040007e6, 0x592cd205, - 0x8268d500, 0x000000ff, 0x82697480, 0x00000014, - 0x04000003, 0x0201f800, 0x001083f6, 0x0201f800, - 0x00108cb5, 0x4a025a05, 0x00000103, 0x49425a07, - 0x497a580a, 0x0201f800, 0x00108476, 0x0201f800, - 0x00109bce, 0x0201f800, 0x0002035b, 0x0401f7d1, - 0x0201f800, 0x0010f2cc, 0x80c589c0, 0x04020035, - 0x0201f800, 0x001086d5, 0x0201f800, 0x001073f9, - 0x0401f7c8, 0x42000000, 0x00110254, 0x81317480, - 0x0400002f, 0x0201f800, 0x0010830d, 0x80c589c0, - 0x040007c0, 0x4200d000, 0x000009b7, 0x412cd800, - 0x4130e000, 0x0401f7b1, 0x5930d008, 0x8c68d500, - 0x0402001d, 0x0201f800, 0x0010830d, 0x80c589c0, - 0x0402000d, 0x0201f800, 0x00108cb5, 0x0401f7b1, - 0x0201f800, 0x0010830d, 0x80c589c0, 0x040007ad, - 0x49425a07, 0x497a5c0a, 0x0201f800, 0x0002035b, - 0x0401f7a8, 0x0201f800, 0x00109881, 0x0201f800, - 0x00108cb5, 0x0401f7a3, 0x49425a07, 0x0201f800, - 0x0002035b, 0x0401f79c, 0x0201f800, 0x00100bd7, - 0x0401f7b3, 0x0201f800, 0x00100bd7, 0x0401f7e2, - 0x0201f800, 0x00101cd1, 0x0401f7ca, 0x0201f800, - 0x0010830d, 0x80c589c0, 0x04000016, 0x59a8e067, - 0x412c0000, 0x80717480, 0x04000005, 0x4200d000, - 0x000009d0, 0x412cd800, 0x0401f780, 0x592d7000, - 0x48bb5067, 0x592cd000, 0x8068d1c0, 0x04020002, - 0x486b5068, 0x592cd205, 0x82697480, 0x00000055, - 0x04000007, 0x49425a07, 0x0201f800, 0x0002035b, - 0x497a6203, 0x497a6009, 0x0401f004, 0x0201f800, - 0x0010058c, 0x0401f7fb, 0x40826800, 0x40865800, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, - 0x1c01f000, 0x809d3840, 0x48813800, 0x5930dc07, - 0x406c0000, 0x826d7480, 0x00000011, 0x83f17500, - 0x03000000, 0x04000014, 0x0c01f001, 0x0010f02c, - 0x0010effc, 0x0010f00c, 0x0010f018, 0x0010efeb, - 0x0010efee, 0x0010f030, 0x0010f02c, 0x0010f02c, - 0x0010f02c, 0x0010f02c, 0x0010efe3, 0x0010efe3, - 0x0010f02c, 0x0010efe3, 0x0010f025, 0x0010f02c, - 0x0010f03b, 0x4200d000, 0x00000b61, 0x4130e000, - 0x0201f800, 0x001001ec, 0x4200d800, 0x00000001, - 0x0401f063, 0x4178d800, 0x8d3e7d1a, 0x04020060, - 0x833ce500, 0x00000001, 0x4178d800, 0x8d3e7d00, - 0x0402005b, 0x8d3e7d18, 0x04000003, 0x8d3e7d16, - 0x040007f2, 0x5930d42c, 0x4070d800, 0x8c68d500, - 0x04020053, 0x0401f7ed, 0x8d3e7d1a, 0x04020019, - 0x8d3e7d00, 0x04020017, 0x833d0500, 0x00001000, - 0x8d3e7d18, 0x040207e5, 0x8d3e7d06, 0x040007e3, - 0x0201f800, 0x00108616, 0x4080d800, 0x80c589c0, - 0x04020043, 0x0401f7dd, 0x8d3e7d00, 0x040007db, - 0x5930d229, 0x82697480, 0x00000003, 0x04020005, - 0x0201f800, 0x00105eaa, 0x80c589c0, 0x040207d3, - 0x4178d800, 0x0401f036, 0x8d3e7d00, 0x0402002f, - 0x5930d00a, 0x833cdd00, 0x00001000, 0x8d3e7d18, - 0x040207ca, 0x8d3e7d06, 0x040007c8, 0x5868d200, - 0x8c68d50e, 0x0402002a, 0x0401f7c4, 0x8d3e7d18, - 0x040007f0, 0x4200d800, 0x00000001, 0x8d3e7d16, - 0x04000023, 0x0401f7eb, 0x4178d800, 0x8d3e7d00, - 0x0402001f, 0x0401f7b9, 0x4178d800, 0x8d3e7d00, - 0x0402001b, 0x833cd500, 0x00001000, 0x4200d800, - 0x00000001, 0x8d3e7d18, 0x04020015, 0x4068d800, - 0x0401f013, 0x833cd500, 0x00000001, 0x4178d800, - 0x8d3e7d00, 0x0402000e, 0x8d3e7d18, 0x040007f8, - 0x4200d800, 0x00000001, 0x8d3e7d16, 0x04000008, - 0x4068d800, 0x0401f006, 0x0201f800, 0x00105eaa, - 0x40c4d800, 0x80c589c0, 0x040207ce, 0x406d8800, - 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, - 0x00000006, 0x48813800, 0x48853801, 0x48893802, - 0x488d3803, 0x48913804, 0x48953805, 0x4933c857, - 0x0201f800, 0x00105f78, 0x40c52800, 0x41352000, - 0x41311000, 0x412d1800, 0x41790800, 0x598e6003, - 0x0401f007, 0x813669c0, 0x0400002f, 0x813669c0, - 0x04000023, 0x41310800, 0x59326000, 0x813261c0, - 0x04000031, 0x5932680a, 0x813669c0, 0x040007f6, - 0x5934d403, 0x41440000, 0x80697480, 0x040207f2, - 0x5930d01d, 0x41240000, 0x80697480, 0x040207f0, - 0x0401ff51, 0x80c589c0, 0x040007ef, 0x42010000, - 0x00000001, 0x0201f800, 0x0010830d, 0x80c589c0, - 0x04020026, 0x808101c0, 0x040007e7, 0x0201f800, - 0x00105e7c, 0x59310000, 0x4084d000, 0x0401fd59, - 0x0401fe79, 0x40826000, 0x0401f7e1, 0x5930d407, - 0x82697480, 0x00000010, 0x040207db, 0x83457480, - 0x0000ffff, 0x040207d8, 0x812649c0, 0x040207d6, - 0x0401f7e4, 0x5930d407, 0x82697480, 0x00000010, - 0x040207cf, 0x83457480, 0x0000ffff, 0x040207cc, - 0x0401f7d8, 0x408a6000, 0x408e5800, 0x40926800, + 0x48853801, 0x598d0009, 0x41790800, 0x4933c857, + 0x813261c0, 0x04020007, 0x0401f00a, 0x41300000, + 0x80817480, 0x0400000e, 0x40810800, 0x58810000, + 0x808101c0, 0x040207fa, 0x4178d000, 0x0401f015, + 0x4200d000, 0x000005aa, 0x4080d800, 0x4084e000, + 0x0201f800, 0x001001ec, 0x0401f7f6, 0x4084d000, + 0x0401ff81, 0x598cd00b, 0x41300000, 0x80697480, + 0x04000005, 0x497a6008, 0x4200d000, 0x00000001, + 0x0401f004, 0x0201f800, 0x0010667c, 0x0401f7fa, + 0x40698800, 0x589d0801, 0x589d0000, 0x829d3c00, + 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, + 0x48813800, 0x48853801, 0x598d0007, 0x41790800, + 0x4933c857, 0x813261c0, 0x04020007, 0x0401f017, + 0x41300000, 0x80817480, 0x04000007, 0x40810800, + 0x58810000, 0x808101c0, 0x040207fa, 0x4178d000, + 0x0401f01a, 0x4084d000, 0x0401ff3a, 0x598cd00b, + 0x41300000, 0x80697480, 0x04000011, 0x5930d403, + 0x82697480, 0x00000042, 0x0400000b, 0x4200d000, + 0x00000001, 0x0401f00d, 0x4200d000, 0x00000561, + 0x4080d800, 0x4084e000, 0x0201f800, 0x001001ec, + 0x0401f7e9, 0x497a6008, 0x0401f7f5, 0x0201f800, + 0x0010667c, 0x0401f7ee, 0x40698800, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, + 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, + 0x41790000, 0x0201f800, 0x0010613a, 0x40c50800, + 0x0401ffc6, 0x80c57040, 0x04000007, 0x0401ff96, + 0x80c57040, 0x04000004, 0x0401ff50, 0x80c57040, + 0x04020002, 0x40c50000, 0x80857040, 0x04020003, + 0x0201f800, 0x0010612b, 0x40818800, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, + 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, + 0x5c00d000, 0x4c680000, 0x486bc857, 0x41350000, + 0x412d0800, 0x5932680a, 0x59325809, 0x4933c857, + 0x4943c857, 0x493fc857, 0x5930d407, 0x486bc857, + 0x5930dc07, 0x806c0040, 0x4000d000, 0x82697480, + 0x00000010, 0x83f17500, 0x03000000, 0x04000013, + 0x0c01f001, 0x0010f175, 0x0010f14b, 0x0010f159, + 0x0010f175, 0x0010f17e, 0x0010f18b, 0x0010f138, + 0x0010f138, 0x0010f138, 0x0010f195, 0x0010f138, + 0x0010f138, 0x0010f138, 0x0010f138, 0x0010f138, + 0x0010f13e, 0x0010f13e, 0x4200d000, 0x00000a7f, + 0x4130e000, 0x0201f800, 0x001001ec, 0x0401f092, + 0x0201f800, 0x001084ee, 0x80c589c0, 0x04020062, + 0x59325819, 0x0201f800, 0x00100595, 0x0201f800, + 0x00106ec7, 0x8d3e7d1c, 0x04000087, 0x497a600a, + 0x0401f085, 0x0201f800, 0x001084ee, 0x80c589c0, + 0x040007f7, 0x49425a07, 0x0201f800, 0x0002035b, + 0x5930d229, 0x82697480, 0x00000003, 0x040207f0, + 0x0201f800, 0x001085d7, 0x0401f7ed, 0x5930d008, + 0x8c68d500, 0x0402004c, 0x0201f800, 0x001084ee, + 0x80c589c0, 0x040007e6, 0x592cd205, 0x8268d500, + 0x000000ff, 0x82697480, 0x00000014, 0x04000003, + 0x0201f800, 0x001085d7, 0x0201f800, 0x00108e9b, + 0x4a025a05, 0x00000103, 0x49425a07, 0x497a580a, + 0x0201f800, 0x00108657, 0x0201f800, 0x00109e6c, + 0x0201f800, 0x0002035b, 0x0401f7d1, 0x0201f800, + 0x0010f4c8, 0x80c589c0, 0x04020035, 0x0201f800, + 0x001088b6, 0x0201f800, 0x001075b8, 0x0401f7c8, + 0x42000000, 0x00110484, 0x81317480, 0x0400002f, + 0x0201f800, 0x001084ee, 0x80c589c0, 0x040007c0, + 0x4200d000, 0x000009c8, 0x412cd800, 0x4130e000, + 0x0401f7b1, 0x5930d008, 0x8c68d500, 0x0402001d, + 0x0201f800, 0x001084ee, 0x80c589c0, 0x0402000d, + 0x0201f800, 0x00108e9b, 0x0401f7b1, 0x0201f800, + 0x001084ee, 0x80c589c0, 0x040007ad, 0x49425a07, + 0x497a5c0a, 0x0201f800, 0x0002035b, 0x0401f7a8, + 0x0201f800, 0x00109b18, 0x0201f800, 0x00108e9b, + 0x0401f7a3, 0x49425a07, 0x0201f800, 0x0002035b, + 0x0401f79c, 0x0201f800, 0x00100bd7, 0x0401f7b3, + 0x0201f800, 0x00100bd7, 0x0401f7e2, 0x0201f800, + 0x00101cd3, 0x0401f7ca, 0x0201f800, 0x001084ee, + 0x80c589c0, 0x04000016, 0x59a8e067, 0x412c0000, + 0x80717480, 0x04000005, 0x4200d000, 0x000009e1, + 0x412cd800, 0x0401f780, 0x592d7000, 0x48bb5067, + 0x592cd000, 0x8068d1c0, 0x04020002, 0x486b5068, + 0x592cd205, 0x82697480, 0x00000055, 0x04000007, + 0x49425a07, 0x0201f800, 0x0002035b, 0x497a6203, + 0x497a6009, 0x0401f004, 0x0201f800, 0x0010058c, + 0x0401f7fb, 0x40826800, 0x40865800, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, + 0x809d3840, 0x48813800, 0x5930dc07, 0x406c0000, + 0x826d7480, 0x00000011, 0x83f17500, 0x03000000, + 0x04000014, 0x0c01f001, 0x0010f23b, 0x0010f20b, + 0x0010f21b, 0x0010f227, 0x0010f1fa, 0x0010f1fd, + 0x0010f23f, 0x0010f23b, 0x0010f23b, 0x0010f23b, + 0x0010f23b, 0x0010f1f2, 0x0010f1f2, 0x0010f23b, + 0x0010f1f2, 0x0010f234, 0x0010f23b, 0x0010f24a, + 0x4200d000, 0x00000b72, 0x4130e000, 0x0201f800, + 0x001001ec, 0x4200d800, 0x00000001, 0x0401f063, + 0x4178d800, 0x8d3e7d1a, 0x04020060, 0x833ce500, + 0x00000001, 0x4178d800, 0x8d3e7d00, 0x0402005b, + 0x8d3e7d18, 0x04000003, 0x8d3e7d16, 0x040007f2, + 0x5930d42c, 0x4070d800, 0x8c68d500, 0x04020053, + 0x0401f7ed, 0x8d3e7d1a, 0x04020019, 0x8d3e7d00, + 0x04020017, 0x833d0500, 0x00001000, 0x8d3e7d18, + 0x040207e5, 0x8d3e7d06, 0x040007e3, 0x0201f800, + 0x001087f7, 0x4080d800, 0x80c589c0, 0x04020043, + 0x0401f7dd, 0x8d3e7d00, 0x040007db, 0x5930d229, + 0x82697480, 0x00000003, 0x04020005, 0x0201f800, + 0x0010606c, 0x80c589c0, 0x040207d3, 0x4178d800, + 0x0401f036, 0x8d3e7d00, 0x0402002f, 0x5930d00a, + 0x833cdd00, 0x00001000, 0x8d3e7d18, 0x040207ca, + 0x8d3e7d06, 0x040007c8, 0x5868d200, 0x8c68d50e, + 0x0402002a, 0x0401f7c4, 0x8d3e7d18, 0x040007f0, + 0x4200d800, 0x00000001, 0x8d3e7d16, 0x04000023, + 0x0401f7eb, 0x4178d800, 0x8d3e7d00, 0x0402001f, + 0x0401f7b9, 0x4178d800, 0x8d3e7d00, 0x0402001b, + 0x833cd500, 0x00001000, 0x4200d800, 0x00000001, + 0x8d3e7d18, 0x04020015, 0x4068d800, 0x0401f013, + 0x833cd500, 0x00000001, 0x4178d800, 0x8d3e7d00, + 0x0402000e, 0x8d3e7d18, 0x040007f8, 0x4200d800, + 0x00000001, 0x8d3e7d16, 0x04000008, 0x4068d800, + 0x0401f006, 0x0201f800, 0x0010606c, 0x40c4d800, + 0x80c589c0, 0x040207ce, 0x406d8800, 0x589d0000, + 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000006, + 0x48813800, 0x48853801, 0x48893802, 0x488d3803, + 0x48913804, 0x48953805, 0x4933c857, 0x0201f800, + 0x0010613a, 0x40c52800, 0x41352000, 0x41311000, + 0x412d1800, 0x41790800, 0x598e6003, 0x0401f003, + 0x41310800, 0x59326000, 0x813261c0, 0x04000022, + 0x5932680a, 0x813669c0, 0x040007fa, 0x5934d403, + 0x41440000, 0x80697480, 0x040207f6, 0x5930d01d, + 0x41240000, 0x80697480, 0x04000003, 0x812649c0, + 0x040207f0, 0x0401ff53, 0x80c589c0, 0x040007ed, + 0x42010000, 0x00000001, 0x0201f800, 0x001084ee, + 0x80c589c0, 0x04020015, 0x808101c0, 0x040007e5, + 0x0201f800, 0x0010603e, 0x59310000, 0x4084d000, + 0x0401fd5b, 0x0401fe7b, 0x40826000, 0x813261c0, + 0x040207e0, 0x408a6000, 0x408e5800, 0x40926800, 0x80957040, 0x04000002, 0x0401f00e, 0x0201f800, - 0x00105f69, 0x0401f00b, 0x0201f800, 0x00108993, - 0x80c589c0, 0x040007d8, 0x5930d403, 0x82697480, - 0x00000043, 0x040207d4, 0x41790000, 0x0401f7d2, + 0x0010612b, 0x0401f00b, 0x0201f800, 0x00108b79, + 0x80c589c0, 0x040007e9, 0x5930d403, 0x82697480, + 0x00000043, 0x040207e5, 0x41790000, 0x0401f7e3, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000006, 0x1c01f000, 0x829d3c80, 0x00000006, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x48953805, 0x412d1800, 0x41312000, 0x41352800, - 0x41790800, 0x0201f800, 0x00105f78, 0x40c51000, + 0x41790800, 0x0201f800, 0x0010613a, 0x40c51000, 0x83457480, 0x000007ef, 0x04000008, 0x04001007, 0x408e5800, 0x40926000, 0x40966800, 0x80897040, - 0x04000020, 0x0401f031, 0x0201f800, 0x001041cf, + 0x04000020, 0x0401f031, 0x0201f800, 0x001042a5, 0x40c66800, 0x80c589c0, 0x04000025, 0x598e6009, 0x0401f003, 0x41310800, 0x59326000, 0x813261c0, 0x04000017, 0x5930d01d, 0x41240000, 0x80697480, 0x040207f9, 0x5930d00a, 0x41340000, 0x80697480, - 0x040207f5, 0x0401fee4, 0x80c589c0, 0x040007f2, - 0x0201f800, 0x00105e7c, 0x59310000, 0x4084d000, - 0x0401fd36, 0x0401fe14, 0x40826000, 0x0401f7ec, - 0x0201f800, 0x00105f69, 0x0401f010, 0x8d3e7d06, + 0x040207f5, 0x0401fef7, 0x80c589c0, 0x040007f2, + 0x0201f800, 0x0010603e, 0x59310000, 0x4084d000, + 0x0401fd49, 0x0401fe27, 0x40826000, 0x0401f7ec, + 0x0201f800, 0x0010612b, 0x0401f010, 0x8d3e7d06, 0x04000004, 0x5934d200, 0x8c68d50e, 0x040207d5, - 0x0201f800, 0x00104316, 0x0401f7d2, 0x4200d000, - 0x00000711, 0x40c4d800, 0x4144e000, 0x0201f800, + 0x0201f800, 0x001043f0, 0x0401f7d2, 0x4200d000, + 0x00000714, 0x40c4d800, 0x4144e000, 0x0201f800, 0x001001ec, 0x0401f7d6, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000006, 0x1c01f000, 0x829d3c80, 0x00000006, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x48953805, 0x41311800, 0x41352000, 0x412d2800, 0x41790800, 0x0201f800, - 0x00105f78, 0x40c51000, 0x598e6007, 0x0401f003, + 0x0010613a, 0x40c51000, 0x598e6007, 0x0401f003, 0x41310800, 0x59326000, 0x813261c0, 0x04000016, 0x5932680a, 0x5930d01d, 0x41240000, 0x80697480, 0x040207f8, 0x5934d403, 0x41440000, 0x80697480, - 0x040207f4, 0x0401fea0, 0x80c589c0, 0x040007f1, - 0x59310000, 0x0201f800, 0x00105e7c, 0x4084d000, - 0x0401fcd1, 0x0401fdd0, 0x40826000, 0x813261c0, - 0x040207ec, 0x0201f800, 0x00106c24, 0x0201f800, - 0x00106c8e, 0x408e6000, 0x40926800, 0x40965800, + 0x040207f4, 0x0401feb3, 0x80c589c0, 0x040007f1, + 0x59310000, 0x0201f800, 0x0010603e, 0x4084d000, + 0x0401fce4, 0x0401fde3, 0x40826000, 0x813261c0, + 0x040207ec, 0x0201f800, 0x00106dd8, 0x0201f800, + 0x00106e42, 0x408e6000, 0x40926800, 0x40965800, 0x80897040, 0x04000002, 0x0401f003, 0x0201f800, - 0x00105f69, 0x589d2805, 0x589d2004, 0x589d1803, + 0x0010612b, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000006, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x4947c857, 0x0201f800, - 0x00105f78, 0x40c50800, 0x413d0000, 0x853e7d00, + 0x0010613a, 0x40c50800, 0x413d0000, 0x853e7d00, 0x0401ffb7, 0x0401ff64, 0x40827800, 0x80857040, - 0x04000002, 0x0401f003, 0x0201f800, 0x00105f69, + 0x04000002, 0x0401f003, 0x0201f800, 0x0010612b, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000003, 0x48813800, 0x48853801, 0x48893802, 0x41311000, 0x41790800, - 0x598e6009, 0x813261c0, 0x04000011, 0x0401fe5e, + 0x598e6009, 0x813261c0, 0x04000011, 0x0401fe71, 0x80c589c0, 0x04020006, 0x41310800, 0x59326000, 0x813261c0, 0x040207fa, 0x0401f009, 0x0201f800, - 0x00105e7c, 0x59310000, 0x4084d000, 0x0401fcab, - 0x0401fd89, 0x40826000, 0x0401f7ef, 0x0201f800, - 0x001042f7, 0x408a6000, 0x589d1002, 0x589d0801, + 0x0010603e, 0x59310000, 0x4084d000, 0x0401fcbe, + 0x0401fd9c, 0x40826000, 0x0401f7ef, 0x0201f800, + 0x001043d1, 0x408a6000, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000003, 0x1c01f000, 0x829d3c80, 0x00000003, 0x48813800, 0x48853801, 0x48893802, 0x41311000, 0x41790800, 0x598e6007, - 0x813261c0, 0x04000011, 0x0401fe3b, 0x80c589c0, + 0x813261c0, 0x04000011, 0x0401fe4e, 0x80c589c0, 0x04020006, 0x41310800, 0x59326000, 0x813261c0, 0x040207fa, 0x0401f009, 0x59310000, 0x0201f800, - 0x00105e7c, 0x4084d000, 0x0401fc67, 0x0401fd66, - 0x40826000, 0x0401f7ef, 0x0201f800, 0x00106c72, - 0x0201f800, 0x00106c8e, 0x408a6000, 0x589d1002, + 0x0010603e, 0x4084d000, 0x0401fc7a, 0x0401fd79, + 0x40826000, 0x0401f7ef, 0x0201f800, 0x00106e26, + 0x0201f800, 0x00106e42, 0x408a6000, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000003, 0x1c01f000, 0x809d3840, 0x48813800, 0x4943c857, - 0x0201f800, 0x00105f78, 0x40c50000, 0x0401ffd5, + 0x0201f800, 0x0010613a, 0x40c50000, 0x0401ffd5, 0x0401ffb1, 0x80817040, 0x04000002, 0x0401f003, - 0x0201f800, 0x00105f69, 0x589d0000, 0x809d3800, + 0x0201f800, 0x0010612b, 0x589d0000, 0x809d3800, 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x0201f800, - 0x00105f78, 0x40c51800, 0x41311000, 0x41790800, - 0x598e6003, 0x813261c0, 0x04000008, 0x0401fe02, + 0x0010613a, 0x40c51800, 0x41311000, 0x41790800, + 0x598e6003, 0x813261c0, 0x04000008, 0x0401fe15, 0x80c589c0, 0x04020009, 0x41310800, 0x59326000, 0x813261c0, 0x040207fa, 0x408a6000, 0x808d7040, - 0x0400000a, 0x0401f00b, 0x0201f800, 0x00105e7c, - 0x59310000, 0x4084d000, 0x0401fc0a, 0x0401fd2a, - 0x40826000, 0x0401f7ec, 0x0201f800, 0x00105f69, + 0x0400000a, 0x0401f00b, 0x0201f800, 0x0010603e, + 0x59310000, 0x4084d000, 0x0401fc1d, 0x0401fd3d, + 0x40826000, 0x0401f7ec, 0x0201f800, 0x0010612b, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000004, 0x1c01f000, 0x809d3840, 0x48a13800, 0x829d3c80, 0x00000006, 0x409d4000, 0x829d3c80, 0x00000007, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x48953805, 0x48993806, 0x4178d000, 0x48694005, 0x0201f800, - 0x00105f78, 0x40c53000, 0x41311000, 0x41352000, + 0x0010613a, 0x40c53000, 0x41311000, 0x41352000, 0x41192800, 0x412d1800, 0x49914003, 0x49d14000, 0x49a54001, 0x49154002, 0x48d94004, 0x58d6602f, 0x813261c0, 0x04000014, 0x41310800, 0x0401f007, @@ -25020,48 +25251,48 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x5934d403, 0x41440000, 0x80697480, 0x040207f1, 0x0401f032, 0x417a3000, 0x0401f007, 0x811a3000, 0x83197480, 0x00000004, 0x83f17500, 0x03000000, - 0x0400001a, 0x0201f800, 0x001064d2, 0x59926005, + 0x0400001a, 0x0201f800, 0x00106694, 0x59926005, 0x813261c0, 0x040007f6, 0x5932680a, 0x5930d01d, 0x41240000, 0x80697480, 0x040207f1, 0x5934d403, - 0x41440000, 0x80697480, 0x040207ed, 0x0401fd9e, - 0x80c589c0, 0x040007ea, 0x0201f800, 0x001061b6, - 0x0201f800, 0x00105f4c, 0x0201f800, 0x00105f52, - 0x0401fccd, 0x0401f7e2, 0x408a6000, 0x40926800, + 0x41440000, 0x80697480, 0x040207ed, 0x0401fdb1, + 0x80c589c0, 0x040007ea, 0x0201f800, 0x00106378, + 0x0201f800, 0x0010610e, 0x0201f800, 0x00106114, + 0x0401fce0, 0x0401f7e2, 0x408a6000, 0x40926800, 0x40963000, 0x408e5800, 0x58a32003, 0x58a3a000, 0x58a34801, 0x58a22802, 0x58a1b004, 0x80997040, 0x04000010, 0x0401f011, 0x49314005, 0x40826000, - 0x808101c0, 0x040007d0, 0x59310001, 0x0401fd82, + 0x808101c0, 0x040007d0, 0x59310001, 0x0401fd95, 0x80c589c0, 0x040007f9, 0x4084d000, 0x58a0d805, - 0x0201f800, 0x0010ecfd, 0x0401fcb3, 0x0401f7f4, - 0x0201f800, 0x00105f69, 0x589d3006, 0x589d2805, + 0x0201f800, 0x0010ef0c, 0x0401fcc6, 0x0401f7f4, + 0x0201f800, 0x0010612b, 0x589d3006, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x0000000d, 0x589d4000, 0x809d3800, 0x1c01f000, 0x809d3840, 0x48a13800, 0x829d3c80, 0x00000008, 0x409d4000, 0x829d3c80, 0x00000007, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, 0x48953805, 0x48993806, - 0x41791800, 0x0201f800, 0x00105f78, 0x40c52800, + 0x41791800, 0x0201f800, 0x0010613a, 0x40c52800, 0x41313000, 0x49354006, 0x492d4005, 0x49194007, 0x49914003, 0x49d14000, 0x49a54001, 0x49154002, 0x48d94004, 0x58d6602f, 0x813261c0, 0x04000023, 0x41312000, 0x408d0800, 0x59311000, 0x5932680a, 0x0401f009, 0x41311800, 0x808509c0, 0x04000010, 0x808101c0, 0x04000002, 0x40826000, 0x808101c0, - 0x0400000d, 0x59310001, 0x0401fd3f, 0x80c589c0, + 0x0400000d, 0x59310001, 0x0401fd52, 0x80c589c0, 0x040007f5, 0x4090d000, 0x408cd800, 0x0201f800, - 0x0010ecfd, 0x0401fc70, 0x0401f7f2, 0x41310800, + 0x0010ef0c, 0x0401fc83, 0x0401f7f2, 0x41310800, 0x0401f7f0, 0x808911c0, 0x04000006, 0x408a6000, 0x808509c0, 0x04000003, 0x40852000, 0x40810800, 0x808911c0, 0x040207e1, 0x417a3000, 0x0201f800, - 0x001064d2, 0x59926005, 0x813261c0, 0x04000004, - 0x0401fd25, 0x80c589c0, 0x04020012, 0x811a3000, + 0x00106694, 0x59926005, 0x813261c0, 0x04000004, + 0x0401fd38, 0x80c589c0, 0x04020012, 0x811a3000, 0x83197480, 0x00000004, 0x040007f5, 0x040017f4, 0x409a6000, 0x58a26806, 0x58a25805, 0x58a23007, 0x58a32003, 0x58a3a000, 0x58a34801, 0x58a22802, 0x58a1b004, 0x80957040, 0x0400000a, 0x0401f00b, - 0x0201f800, 0x001061b6, 0x0201f800, 0x00105f4c, - 0x0201f800, 0x00105f52, 0x0401fc43, 0x0401f7e8, - 0x0201f800, 0x00105f69, 0x589d3006, 0x589d2805, + 0x0201f800, 0x00106378, 0x0201f800, 0x0010610e, + 0x0201f800, 0x00106114, 0x0401fc56, 0x0401f7e8, + 0x0201f800, 0x0010612b, 0x589d3006, 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x0000000f, 0x589d4000, 0x809d3800, 0x1c01f000, 0x4178e000, 0x497bc856, @@ -25071,58 +25302,58 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x4200e000, 0x00000001, 0x40718800, 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x412d0800, 0x41351000, - 0x41391800, 0x0201f800, 0x0010efc7, 0x80c589c0, + 0x41391800, 0x0201f800, 0x0010f1d6, 0x80c589c0, 0x040000b5, 0x5932680a, 0x5930dc07, 0x406c0000, 0x826d7480, 0x00000011, 0x83f17500, 0x03000000, - 0x04000026, 0x0c01f001, 0x0010f39f, 0x0010f345, - 0x0010f355, 0x0010f31e, 0x0010f345, 0x0010f355, - 0x0010f365, 0x0010f378, 0x0010f318, 0x0010f318, - 0x0010f309, 0x0010f318, 0x0010f318, 0x0010f318, - 0x0010f318, 0x0010f312, 0x0010f309, 0x0010f306, + 0x04000026, 0x0c01f001, 0x0010f59b, 0x0010f541, + 0x0010f551, 0x0010f51a, 0x0010f541, 0x0010f551, + 0x0010f561, 0x0010f574, 0x0010f514, 0x0010f514, + 0x0010f505, 0x0010f514, 0x0010f514, 0x0010f514, + 0x0010f514, 0x0010f50e, 0x0010f505, 0x0010f502, 0x59325819, 0x0201f800, 0x00100595, 0x5930d203, 0x82697480, 0x00000004, 0x04000077, 0x59325809, - 0x0201f800, 0x0010830d, 0x80c589c0, 0x0402006e, - 0x0201f800, 0x00106d13, 0x8d3e7d1c, 0x0400008a, + 0x0201f800, 0x001084ee, 0x80c589c0, 0x0402006e, + 0x0201f800, 0x00106ec7, 0x8d3e7d1c, 0x0400008a, 0x497a600a, 0x0401f088, 0x4200d000, 0x0000030f, 0x4130e000, 0x0201f800, 0x001001ec, 0x0401f082, - 0x813669c0, 0x04000067, 0x0201f800, 0x00108dbd, + 0x813669c0, 0x04000067, 0x0201f800, 0x00108fa8, 0x5930d203, 0x82697480, 0x00000004, 0x04000074, - 0x59325809, 0x0201f800, 0x0010830d, 0x80c589c0, + 0x59325809, 0x0201f800, 0x001084ee, 0x80c589c0, 0x040007e8, 0x592cd205, 0x8268d500, 0x000000ff, 0x82697480, 0x00000014, 0x04000003, 0x0201f800, - 0x001083f6, 0x0201f800, 0x00108cb5, 0x0201f800, + 0x001085d7, 0x0201f800, 0x00108e9b, 0x0201f800, 0x0002076c, 0x4a025a05, 0x00000103, 0x5930d402, 0x486a5c07, 0x592cd409, 0x8c68d512, 0x04020053, - 0x49425a07, 0x497a580a, 0x0201f800, 0x0010899d, + 0x49425a07, 0x497a580a, 0x0201f800, 0x00108b83, 0x0201f800, 0x0002035b, 0x0401f7ce, 0x5930d403, 0x82697480, 0x00000043, 0x04000057, 0x0201f800, - 0x00109ec3, 0x0401ff81, 0x80c589c0, 0x04020040, - 0x0201f800, 0x00108418, 0x80c589c0, 0x040007c1, - 0x0201f800, 0x001073f9, 0x0401f7be, 0x59325809, - 0x0201f800, 0x0010830d, 0x80c589c0, 0x040007b9, + 0x0010a173, 0x0401ff81, 0x80c589c0, 0x04020040, + 0x0201f800, 0x001085f9, 0x80c589c0, 0x040007c1, + 0x0201f800, 0x001075b8, 0x0401f7be, 0x59325809, + 0x0201f800, 0x001084ee, 0x80c589c0, 0x040007b9, 0x49425a07, 0x497a5c0a, 0x0201f800, 0x0002035b, 0x5930d229, 0x82697480, 0x00000003, 0x040207b1, - 0x0201f800, 0x001083f6, 0x0401f7ae, 0x5930d203, + 0x0201f800, 0x001085d7, 0x0401f7ae, 0x5930d203, 0x82697480, 0x00000004, 0x04000034, 0x59325809, - 0x0201f800, 0x0010830d, 0x80c589c0, 0x040007a5, + 0x0201f800, 0x001084ee, 0x80c589c0, 0x040007a5, 0x49425a07, 0x813669c0, 0x04020026, 0x0201f800, - 0x00108cb5, 0x0201f800, 0x0002076c, 0x0201f800, - 0x0010899d, 0x0401f7cb, 0x5930d203, 0x82697480, + 0x00108e9b, 0x0201f800, 0x0002076c, 0x0201f800, + 0x00108b83, 0x0401f7cb, 0x5930d203, 0x82697480, 0x00000011, 0x04020024, 0x5930d429, 0x486a6203, 0x0401f021, 0x49425a07, 0x0201f800, 0x0002035b, 0x0401f790, 0x0201f800, 0x00100bd7, 0x0401f788, 0x4200d000, 0x00000182, 0x4134d800, 0x4130e000, 0x0201f800, 0x001001ec, 0x0401f794, 0x0201f800, - 0x00101cd1, 0x0401f7bf, 0x412d0000, 0x592e580a, + 0x00101cd3, 0x0401f7bf, 0x412d0000, 0x592e580a, 0x0201f800, 0x00100595, 0x40825800, 0x0401f7a9, - 0x0201f800, 0x00109bce, 0x0401f7d9, 0x0201f800, + 0x0201f800, 0x00109e6c, 0x0401f7d9, 0x0201f800, 0x00100bd7, 0x0401f78b, 0x0201f800, 0x00100bd7, 0x0401f7cb, 0x40865800, 0x408a6800, 0x408e7000, 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000004, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x41310800, 0x4933c857, 0x4943c857, 0x493fc857, 0x42010000, - 0x001102e4, 0x59a8d00d, 0x41640000, 0x80697480, + 0x00110514, 0x59a8d00d, 0x41640000, 0x80697480, 0x04000010, 0x41580000, 0x80817480, 0x0402100d, 0x40826000, 0x8d3e7d12, 0x04000004, 0x40800000, 0x80857480, 0x04000002, 0x0401ff1e, 0x82810400, @@ -25133,2448 +25364,2462 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x8068d1c0, 0x04020005, 0x5880d203, 0x82697480, 0x00000008, 0x04000008, 0x0401ff06, 0x82810400, 0x00000030, 0x41540000, 0x80817480, 0x040017ed, - 0x0401f004, 0x0201f800, 0x00109e17, 0x0401f7f7, + 0x0401f004, 0x0201f800, 0x0010a0c7, 0x0401f7f7, 0x40866000, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x809d3840, 0x48813800, 0x497a6229, 0x812e59c0, 0x04000043, 0x592cd205, 0x486bc857, 0x592cd205, 0x8268d500, 0x000000ff, 0x82697480, 0x00000014, 0x04000005, 0x4a026229, - 0x00000003, 0x0201f800, 0x00108cb5, 0x592cd409, + 0x00000003, 0x0201f800, 0x00108e9b, 0x592cd409, 0x8c68d510, 0x04000023, 0x592cd209, 0x0201f800, - 0x001047ec, 0x4a025c09, 0x00000100, 0x0201f800, - 0x0010899d, 0x0201f800, 0x0010a0aa, 0x80c589c0, + 0x001048e9, 0x4a025c09, 0x00000100, 0x0201f800, + 0x00108b83, 0x0201f800, 0x0010a35a, 0x80c589c0, 0x04000021, 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, 0x4a026407, 0x00000002, 0x59310004, - 0x82810500, 0x00000100, 0x0201f800, 0x00108c9b, + 0x82810500, 0x00000100, 0x0201f800, 0x00108e81, 0x82810540, 0x80004040, 0x48826004, 0x0201f800, - 0x00108ca7, 0x0201f800, 0x00105f69, 0x4200d000, - 0x80004040, 0x0201f800, 0x00105e10, 0x0401f01d, - 0x592cd209, 0x0201f800, 0x001047ec, 0x0201f800, - 0x0010899d, 0x0201f800, 0x0010a0aa, 0x80c589c0, + 0x00108e8d, 0x0201f800, 0x0010612b, 0x4200d000, + 0x80004040, 0x0201f800, 0x00105fd2, 0x0401f01d, + 0x592cd209, 0x0201f800, 0x001048e9, 0x0201f800, + 0x00108b83, 0x0201f800, 0x0010a35a, 0x80c589c0, 0x040207e1, 0x0201f800, 0x0002035b, 0x5930d229, 0x82697480, 0x00000003, 0x0400000a, 0x497a6009, 0x0401f7d9, 0x4200d000, 0x00000527, 0x4130d800, 0x412ce000, 0x0201f800, 0x001001ec, 0x0401f005, - 0x0201f800, 0x001083f6, 0x497a6009, 0x0401f7ce, + 0x0201f800, 0x001085d7, 0x497a6009, 0x0401f7ce, 0x589d0000, 0x809d3800, 0x1c01f000, 0x0201f800, - 0x00105f69, 0x812e59c0, 0x0400001d, 0x0201f800, - 0x00108cb5, 0x592cd409, 0x8c68d510, 0x04020012, - 0x592cd209, 0x0201f800, 0x001047ec, 0x0201f800, - 0x0010899d, 0x0201f800, 0x0002035b, 0x5930d203, + 0x0010612b, 0x812e59c0, 0x0400001d, 0x0201f800, + 0x00108e9b, 0x592cd409, 0x8c68d510, 0x04020012, + 0x592cd209, 0x0201f800, 0x001048e9, 0x0201f800, + 0x00108b83, 0x0201f800, 0x0002035b, 0x5930d203, 0x82697480, 0x0000000d, 0x0400000d, 0x0201f800, - 0x00105f69, 0x5930d00a, 0x0201f800, 0x00104436, - 0x0401f007, 0x592cd209, 0x0201f800, 0x001047ec, + 0x0010612b, 0x5930d00a, 0x0201f800, 0x00104510, + 0x0401f007, 0x592cd209, 0x0201f800, 0x001048e9, 0x4a025c09, 0x00000100, 0x0401f7ed, 0x0201f800, - 0x00106d13, 0x1c01f000, 0x829d3c80, 0x00000002, + 0x00106ec7, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x41790000, 0x0201f800, - 0x00108083, 0x40c50800, 0x48c7c857, 0x40840000, + 0x00108261, 0x40c50800, 0x48c7c857, 0x40840000, 0x82857480, 0x00000010, 0x83f17500, 0x03000000, - 0x0400002e, 0x0c01f001, 0x0010f494, 0x0010f4ac, - 0x0010f4aa, 0x0010f481, 0x0010f4c1, 0x0010f49c, - 0x0010f494, 0x0010f494, 0x0010f494, 0x0010f49c, - 0x0010f49c, 0x0010f49c, 0x0010f49c, 0x0010f4aa, - 0x0010f4ac, 0x0010f49c, 0x0010f481, 0x0201f800, - 0x00108073, 0x80c589c0, 0x04000005, 0x0201f800, - 0x00106252, 0x80c589c0, 0x04000035, 0x0201f800, - 0x0010ed56, 0x80c589c0, 0x04000017, 0x5930d403, + 0x0400002e, 0x0c01f001, 0x0010f690, 0x0010f6a8, + 0x0010f6a6, 0x0010f67d, 0x0010f6bd, 0x0010f698, + 0x0010f690, 0x0010f690, 0x0010f690, 0x0010f698, + 0x0010f698, 0x0010f698, 0x0010f698, 0x0010f6a6, + 0x0010f6a8, 0x0010f698, 0x0010f67d, 0x0201f800, + 0x00108251, 0x80c589c0, 0x04000005, 0x0201f800, + 0x00106414, 0x80c589c0, 0x04000035, 0x0201f800, + 0x0010ef65, 0x80c589c0, 0x04000017, 0x5930d403, 0x486bc857, 0x5930d403, 0x82697480, 0x00000040, 0x04020018, 0x0401ffaa, 0x42010000, 0x00000001, 0x0401f073, 0x40840000, 0x82857480, 0x00000010, 0x040007d5, 0x040017d4, 0x4200d000, 0x000004b7, 0x4130d800, 0x4084e000, 0x0201f800, 0x001001ec, - 0x0401f067, 0x497bc856, 0x0201f800, 0x00105e92, + 0x0401f067, 0x497bc856, 0x0201f800, 0x00106054, 0x80c589c0, 0x04020016, 0x59317004, 0x48bbc857, 0x0401ff3e, 0x0401f7e9, 0x598d700b, 0x48bbc857, 0x40b8d000, 0x41300000, 0x80697480, 0x04000042, - 0x0201f800, 0x0010eee3, 0x80c589c0, 0x040207de, - 0x497bc856, 0x0201f800, 0x00105e92, 0x4200d000, + 0x0201f800, 0x0010f0f2, 0x80c589c0, 0x040207de, + 0x497bc856, 0x0201f800, 0x00106054, 0x4200d000, 0x000003f5, 0x80c589c0, 0x040007e2, 0x5930d203, 0x486bc857, 0x59310a03, 0x0401f049, 0x812e59c0, - 0x0400003b, 0x0201f800, 0x001087a7, 0x80c589c0, - 0x04000029, 0x0201f800, 0x00105f69, 0x592cd209, + 0x0400003b, 0x0201f800, 0x00108988, 0x80c589c0, + 0x04000029, 0x0201f800, 0x0010612b, 0x592cd209, 0x8468d50c, 0x486a5a09, 0x592cdc07, 0x806cd0c6, 0x406c0000, 0x8068d400, 0x8068d400, 0x486a6006, 0x4200d000, 0x10000000, 0x4130d800, 0x0201f800, - 0x001008c9, 0x80c589c0, 0x0400000c, 0x592cd209, + 0x001008c7, 0x80c589c0, 0x0400000c, 0x592cd209, 0x8c68d51c, 0x0400001d, 0x59c8d001, 0x8068d1c0, 0x04020026, 0x4200d000, 0x40000000, 0x4130d800, - 0x0201f800, 0x001008c9, 0x5930d203, 0x82697480, + 0x0201f800, 0x001008c7, 0x5930d203, 0x82697480, 0x00000004, 0x040207ad, 0x41390000, 0x42027000, - 0x00000048, 0x0201f800, 0x00106d6c, 0x40827000, + 0x00000048, 0x0201f800, 0x00106f24, 0x40827000, 0x0401f7a6, 0x0201f800, 0x00100bd7, 0x0401fef7, - 0x0401f7a2, 0x0201f800, 0x00106287, 0x80c589c0, + 0x0401f7a2, 0x0201f800, 0x00106449, 0x80c589c0, 0x040007c7, 0x0401f7bb, 0x8468d55c, 0x486a5a09, 0x4a026006, 0x00000002, 0x0401f798, 0x4200d000, 0x000004a7, 0x4130d800, 0x412ce000, 0x0201f800, 0x001001ec, 0x0401f006, 0x41310000, 0x0201f800, - 0x0010131d, 0x40826000, 0x0401f7dc, 0x808101c0, + 0x0010131b, 0x40826000, 0x0401f7dc, 0x808101c0, 0x0400078d, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, 0x48853801, 0x412d0800, 0x41410000, - 0x4200d000, 0x0010b065, 0x0201f800, 0x00109f94, - 0x417a5800, 0x0201f800, 0x0010830d, 0x80c589c0, - 0x04000009, 0x0201f800, 0x00108dbd, 0x59325809, + 0x4200d000, 0x0010b2e5, 0x0201f800, 0x0010a244, + 0x417a5800, 0x0201f800, 0x001084ee, 0x80c589c0, + 0x04000009, 0x0201f800, 0x00108fa8, 0x59325809, 0x592cd209, 0x8468d54c, 0x486a5a09, 0x42028000, - 0x00000006, 0x0201f800, 0x00105f78, 0x0401ff37, - 0x0201f800, 0x00105f69, 0x40828000, 0x40865800, + 0x00000006, 0x0201f800, 0x0010613a, 0x0401ff37, + 0x0201f800, 0x0010612b, 0x40828000, 0x40865800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, 0x1c01f000, 0x829d3c80, 0x00000002, 0x48813800, - 0x48853801, 0x412d0800, 0x0201f800, 0x0010efc7, + 0x48853801, 0x412d0800, 0x0201f800, 0x0010f1d6, 0x80c589c0, 0x040000aa, 0x5930dc07, 0x406c0000, 0x826d7480, 0x00000011, 0x83f17500, 0x03000000, - 0x04000028, 0x0c01f001, 0x0010f5e5, 0x0010f556, - 0x0010f5aa, 0x0010f583, 0x0010f556, 0x0010f5aa, - 0x0010f5c1, 0x0010f5ba, 0x0010f56a, 0x0010f56a, - 0x0010f570, 0x0010f56a, 0x0010f56a, 0x0010f56a, - 0x0010f56a, 0x0010f564, 0x0010f576, 0x0010f57f, + 0x04000028, 0x0c01f001, 0x0010f7e1, 0x0010f752, + 0x0010f7a6, 0x0010f77f, 0x0010f752, 0x0010f7a6, + 0x0010f7bd, 0x0010f7b6, 0x0010f766, 0x0010f766, + 0x0010f76c, 0x0010f766, 0x0010f766, 0x0010f766, + 0x0010f766, 0x0010f760, 0x0010f772, 0x0010f77b, 0x5930d403, 0x82697480, 0x00000043, 0x0400008c, - 0x0201f800, 0x0010f2cc, 0x80c589c0, 0x04020079, - 0x0201f800, 0x00108418, 0x80c589c0, 0x04000003, - 0x0201f800, 0x001073f9, 0x0201f800, 0x00106d13, + 0x0201f800, 0x0010f4c8, 0x80c589c0, 0x04020079, + 0x0201f800, 0x001085f9, 0x80c589c0, 0x04000003, + 0x0201f800, 0x001075b8, 0x0201f800, 0x00106ec7, 0x8d3e7d1c, 0x0400007e, 0x497a600a, 0x0401f07c, - 0x4200d000, 0x0000031c, 0x4130e000, 0x0201f800, + 0x4200d000, 0x00000328, 0x4130e000, 0x0201f800, 0x001001ec, 0x0401f076, 0x5930d203, 0x82697480, 0x00000004, 0x04020003, 0x0201f800, 0x00100bd7, - 0x59325809, 0x0201f800, 0x0010830d, 0x80c589c0, + 0x59325809, 0x0201f800, 0x001084ee, 0x80c589c0, 0x040007ea, 0x49425a07, 0x0201f800, 0x0002035b, 0x0401f7e6, 0x59325819, 0x0201f800, 0x00100595, - 0x0401f7f4, 0x0201f800, 0x00108dbd, 0x5930d203, + 0x0401f7f4, 0x0201f800, 0x00108fa8, 0x5930d203, 0x82697480, 0x00000004, 0x04000057, 0x59325809, - 0x0201f800, 0x0010830d, 0x80c589c0, 0x040007d7, + 0x0201f800, 0x001084ee, 0x80c589c0, 0x040007d7, 0x592cd205, 0x8268d500, 0x000000ff, 0x82697480, - 0x00000014, 0x04000003, 0x0201f800, 0x001083f6, - 0x0201f800, 0x00108cb5, 0x0201f800, 0x0002076c, + 0x00000014, 0x04000003, 0x0201f800, 0x001085d7, + 0x0201f800, 0x00108e9b, 0x0201f800, 0x0002076c, 0x4a025a05, 0x00000103, 0x592cd409, 0x8c68d512, 0x0402003b, 0x49425a07, 0x497a580a, 0x0201f800, - 0x00109bce, 0x0201f800, 0x0010899d, 0x0201f800, - 0x00108476, 0x0201f800, 0x0002035b, 0x0401f7bb, - 0x59325809, 0x0201f800, 0x0010830d, 0x80c589c0, + 0x00109e6c, 0x0201f800, 0x00108b83, 0x0201f800, + 0x00108657, 0x0201f800, 0x0002035b, 0x0401f7bb, + 0x59325809, 0x0201f800, 0x001084ee, 0x80c589c0, 0x040007b6, 0x49425a07, 0x497a5c0a, 0x0201f800, 0x0002035b, 0x5930d229, 0x82697480, 0x00000003, - 0x040207ae, 0x0201f800, 0x001083f6, 0x0401f7ab, + 0x040207ae, 0x0201f800, 0x001085d7, 0x0401f7ab, 0x5930d203, 0x82697480, 0x00000011, 0x04020028, 0x5930d429, 0x486a6203, 0x0401f025, 0x5930d203, 0x82697480, 0x00000004, 0x0400001e, 0x59325809, - 0x0201f800, 0x0010830d, 0x80c589c0, 0x0400079b, - 0x49425a07, 0x0201f800, 0x00109bce, 0x0201f800, - 0x00108cb5, 0x0201f800, 0x0002076c, 0x0201f800, - 0x0010899d, 0x0201f800, 0x0002035b, 0x0401f78f, - 0x0201f800, 0x00101cd1, 0x0401f786, 0x412d0000, + 0x0201f800, 0x001084ee, 0x80c589c0, 0x0400079b, + 0x49425a07, 0x0201f800, 0x00109e6c, 0x0201f800, + 0x00108e9b, 0x0201f800, 0x0002076c, 0x0201f800, + 0x00108b83, 0x0201f800, 0x0002035b, 0x0401f78f, + 0x0201f800, 0x00101cd3, 0x0401f786, 0x412d0000, 0x592e580a, 0x0201f800, 0x00100595, 0x40825800, 0x0401f7c1, 0x0201f800, 0x00100bd7, 0x0401f7a8, 0x0201f800, 0x00100bd7, 0x0401f7e1, 0x40865800, 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000002, - 0x1c01f000, 0x0201f800, 0x00109973, 0x80c589c0, - 0x0402000c, 0x5930d407, 0x82697480, 0x00000010, - 0x04000002, 0x0401f00f, 0x83457480, 0x0000ffff, - 0x040207fd, 0x5930d00a, 0x8068d1c0, 0x040207fa, - 0x812649c0, 0x04000005, 0x5930d01d, 0x41240000, - 0x80697480, 0x040207f4, 0x5932680a, 0x0401ff32, - 0x1c01f000, 0x829d3c80, 0x00000005, 0x48813800, + 0x1c01f000, 0x0201f800, 0x00109c11, 0x80c589c0, + 0x04000007, 0x812649c0, 0x04000006, 0x5930d01d, + 0x41240000, 0x80697480, 0x04000002, 0x0401f003, + 0x5932680a, 0x0401ff3c, 0x1c01f000, 0x829d3c80, + 0x00000005, 0x48813800, 0x48853801, 0x48893802, + 0x488d3803, 0x48913804, 0x41311000, 0x41352000, + 0x4933c857, 0x4947c857, 0x4943c857, 0x0201f800, + 0x0010613a, 0x40c51800, 0x0201f800, 0x00109ae1, + 0x41310800, 0x813261c0, 0x0400004e, 0x42000000, + 0x001104b4, 0x81317480, 0x0400004a, 0x59a8d00d, + 0x8068d040, 0x42010000, 0x00110514, 0x40680000, + 0x81657480, 0x0400000f, 0x41580000, 0x80817480, + 0x0402100c, 0x40826000, 0x40800000, 0x80857480, + 0x04000003, 0x4084d000, 0x0401ffcb, 0x82810400, + 0x00000030, 0x41580000, 0x80817480, 0x040017f6, + 0x41510000, 0x41540000, 0x80817480, 0x04021012, + 0x8d3e7d18, 0x04000010, 0x59a8d062, 0x59a80063, + 0x80697480, 0x0400000c, 0x40826000, 0x5880d00a, + 0x8068d1c0, 0x0400000d, 0x4084d000, 0x0401ffb6, + 0x82810400, 0x00000030, 0x41540000, 0x80817480, + 0x040017f0, 0x408a6000, 0x40926800, 0x808d7040, + 0x0400001e, 0x0401f023, 0x0201f800, 0x001042a5, + 0x40c66800, 0x80c589c0, 0x040007f2, 0x58c4d002, + 0x5930d82a, 0x82680500, 0x00ffffff, 0x806d7480, + 0x040207ec, 0x58c4d013, 0x5930d829, 0x82680500, + 0x00ffffff, 0x806d7480, 0x040207e6, 0x5930d203, + 0x82697480, 0x00000008, 0x0400000b, 0x4936600a, + 0x0401fedd, 0x82810400, 0x00000030, 0x0401f7df, + 0x59a8d00d, 0x0401f7b8, 0x0201f800, 0x0010612b, + 0x0401f004, 0x0201f800, 0x0010a0c7, 0x0401f7f4, + 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000005, 0x1c01f000, + 0x809d3840, 0x48a13800, 0x829d3c80, 0x00000002, + 0x409d4000, 0x829d3c80, 0x00000007, 0x48813800, 0x48853801, 0x48893802, 0x488d3803, 0x48913804, - 0x41311000, 0x41352000, 0x4933c857, 0x4947c857, - 0x4943c857, 0x0201f800, 0x00105f78, 0x40c51800, - 0x0201f800, 0x0010984a, 0x41310800, 0x813261c0, - 0x0400004e, 0x42000000, 0x00110284, 0x81317480, - 0x0400004a, 0x59a8d00d, 0x8068d040, 0x42010000, - 0x001102e4, 0x40680000, 0x81657480, 0x0400000f, - 0x41580000, 0x80817480, 0x0402100c, 0x40826000, - 0x40800000, 0x80857480, 0x04000003, 0x4084d000, - 0x0401ffc1, 0x82810400, 0x00000030, 0x41580000, - 0x80817480, 0x040017f6, 0x41510000, 0x41540000, - 0x80817480, 0x04021012, 0x8d3e7d18, 0x04000010, - 0x59a8d062, 0x59a80063, 0x80697480, 0x0400000c, - 0x40826000, 0x5880d00a, 0x8068d1c0, 0x0400000d, - 0x4084d000, 0x0401ffac, 0x82810400, 0x00000030, - 0x41540000, 0x80817480, 0x040017f0, 0x408a6000, - 0x40926800, 0x808d7040, 0x0400001e, 0x0401f023, - 0x0201f800, 0x001041cf, 0x40c66800, 0x80c589c0, - 0x040007f2, 0x58c4d002, 0x5930d82a, 0x82680500, - 0x00ffffff, 0x806d7480, 0x040207ec, 0x58c4d013, - 0x5930d829, 0x82680500, 0x00ffffff, 0x806d7480, - 0x040207e6, 0x5930d203, 0x82697480, 0x00000008, - 0x0400000b, 0x4936600a, 0x0401fed3, 0x82810400, - 0x00000030, 0x0401f7df, 0x59a8d00d, 0x0401f7b8, - 0x0201f800, 0x00105f69, 0x0401f004, 0x0201f800, - 0x00109e17, 0x0401f7f4, 0x589d2004, 0x589d1803, - 0x589d1002, 0x589d0801, 0x589d0000, 0x829d3c00, - 0x00000005, 0x1c01f000, 0x809d3840, 0x48a13800, - 0x829d3c80, 0x00000002, 0x409d4000, 0x829d3c80, - 0x00000007, 0x48813800, 0x48853801, 0x48893802, - 0x488d3803, 0x48913804, 0x48953805, 0x48993806, - 0x42010000, 0x00000001, 0x41793000, 0x49214000, - 0x49254001, 0x497bc856, 0x41310800, 0x41351000, - 0x41451800, 0x413d2000, 0x40592800, 0x4200d000, - 0x0010f674, 0x0201f800, 0x00105b2e, 0x59a8d21b, - 0x8c68d508, 0x0400001d, 0x8c68d516, 0x0402001b, - 0x59aa6882, 0x813669c0, 0x0400009d, 0x5934d400, - 0x82697480, 0x00000404, 0x04020099, 0x0201f800, - 0x00106d42, 0x40c66000, 0x80c589c0, 0x0400008e, - 0x48818c07, 0x4935880a, 0x409a7800, 0x0201f800, - 0x001040e0, 0x4200d000, 0x00000005, 0x0201f800, - 0x001040ea, 0x42027000, 0x00000003, 0x0201f800, - 0x00106d6c, 0x0401f086, 0x8268dd00, 0x00000008, - 0x8c68d506, 0x0400006e, 0x806cd9c0, 0x04000002, - 0x41790000, 0x0201f800, 0x0010a0b2, 0x4200d000, - 0x0010a0ec, 0x586a4800, 0x42028800, 0x000007fe, - 0x8058b1c0, 0x0400001e, 0x41440000, 0x0401f005, - 0x83264c00, 0x0000000b, 0x8058b040, 0x04000018, - 0x5924d009, 0x8068d400, 0x8268d480, 0x000007f0, - 0x586a6800, 0x813669c0, 0x040007f6, 0x5924d200, - 0x8268d500, 0x00000003, 0x82697480, 0x00000003, - 0x040207f0, 0x5934d200, 0x8c68d51a, 0x040007ed, - 0x8468d51a, 0x486a6a00, 0x80993000, 0x83264c00, - 0x0000000b, 0x8058b040, 0x040207ea, 0x809931c0, - 0x04000045, 0x8d0e1d20, 0x04020046, 0x0201f800, - 0x00101de7, 0x80817040, 0x04020051, 0x4200b000, - 0x000007f0, 0x417a8800, 0x0401f004, 0x81468800, - 0x8058b040, 0x0400004a, 0x0201f800, 0x001041cf, - 0x80c589c0, 0x040007fa, 0x5934d200, 0x8c68d51a, - 0x040007f7, 0x5934d403, 0x406a8800, 0x417a7800, - 0x42028000, 0x00000029, 0x5934d013, 0x8068d130, - 0x406a4000, 0x40680000, 0x4200d000, 0x0010a0ec, - 0x8068d400, 0x586a4800, 0x413cd000, 0x413cd800, - 0x0201f800, 0x0010989c, 0x5934d200, 0x8468d558, + 0x48953805, 0x48993806, 0x42010000, 0x00000001, + 0x41793000, 0x49214000, 0x49254001, 0x497bc856, + 0x41310800, 0x41351000, 0x41451800, 0x413d2000, + 0x40592800, 0x4200d000, 0x0010f866, 0x0201f800, + 0x00105cf0, 0x59a8d21b, 0x8c68d508, 0x0400001d, + 0x8c68d516, 0x0402001b, 0x59aa6882, 0x813669c0, + 0x040000a6, 0x5934d400, 0x82697480, 0x00000404, + 0x040200a2, 0x0201f800, 0x00106efa, 0x40c66000, + 0x80c589c0, 0x04000097, 0x48818c07, 0x4935880a, + 0x409a7800, 0x0201f800, 0x001041b3, 0x4200d000, + 0x00000005, 0x0201f800, 0x001041bd, 0x42027000, + 0x00000003, 0x0201f800, 0x00106f24, 0x0401f08f, + 0x8268dd00, 0x00000008, 0x8c68d506, 0x04000074, + 0x806cd9c0, 0x04000002, 0x41790000, 0x0201f800, + 0x0010a362, 0x4200d000, 0x0010a3b3, 0x586a4800, + 0x42028800, 0x000007fe, 0x8058b1c0, 0x0400001f, + 0x41440000, 0x0401f005, 0x83264c00, 0x0000000b, + 0x8058b040, 0x04000019, 0x5924d009, 0x8068d400, + 0x8268d480, 0x000007f0, 0x586a6800, 0x813669c0, + 0x040007f6, 0x5924d200, 0x8268d500, 0x00000003, + 0x82697480, 0x00000003, 0x040207f0, 0x5934da00, + 0x8c6cdd1a, 0x040007ed, 0x826cd500, 0xffffdfff, + 0x486a6a00, 0x80993000, 0x83264c00, 0x0000000b, + 0x8058b040, 0x040207e9, 0x809931c0, 0x0400004a, + 0x8d0e1d20, 0x0402004b, 0x0201f800, 0x00101e1b, + 0x80817040, 0x04020059, 0x4200b000, 0x000007f0, + 0x417a8800, 0x0401f01e, 0x826cd540, 0x00001000, 0x486a6a00, 0x5934d200, 0x8468d51a, 0x486a6a00, 0x4937c857, 0x4a026c00, 0x00000707, 0x0201f800, - 0x00105f78, 0x40c50000, 0x417a6000, 0x0201f800, - 0x00105e35, 0x0201f800, 0x0010f051, 0x0201f800, - 0x0010f148, 0x417a7800, 0x0201f800, 0x0010f1e1, - 0x0201f800, 0x0010f603, 0x80817040, 0x040207cc, - 0x0201f800, 0x00105f69, 0x0401f7c9, 0x8c68d50a, - 0x04020792, 0x80817040, 0x04020011, 0x0401f7c0, - 0x4200d000, 0x000007d0, 0x4200d800, 0x0010f674, - 0x0201f800, 0x00105c58, 0x0201f800, 0x00101de7, - 0x0401f7b5, 0x4200d000, 0x00000098, 0x40c4d800, - 0x4134e000, 0x0201f800, 0x001001ec, 0x58a24801, - 0x58a24000, 0x40866000, 0x408a6800, 0x408e8800, - 0x40927800, 0x4094b000, 0x589d3006, 0x589d2805, - 0x589d2004, 0x589d1803, 0x589d1002, 0x589d0801, - 0x589d0000, 0x829d3c00, 0x00000009, 0x589d4000, - 0x809d3800, 0x1c01f000, 0x497bc856, 0x0201f800, - 0x00104a28, 0x80c589c0, 0x0402004f, 0x59a8d015, - 0x8c68d504, 0x04000028, 0x8d0e1d20, 0x0400001c, - 0x4200b000, 0x000007f0, 0x417a8800, 0x0401f004, - 0x81468800, 0x8058b040, 0x04000015, 0x0201f800, - 0x001041cf, 0x80c589c0, 0x040007fa, 0x0201f800, - 0x001044a7, 0x80c589c0, 0x040007f6, 0x59a8d00f, - 0x59340002, 0x8068d580, 0x8268d500, 0x00ffff00, - 0x040207f0, 0x5934d200, 0x8468d55a, 0x486a6a00, - 0x81468800, 0x8058b040, 0x040207ed, 0x0201f800, - 0x001043ef, 0x80c589c0, 0x04000026, 0x59a8d02d, - 0x4200d800, 0x0010f674, 0x0201f800, 0x00105c58, - 0x0401f04d, 0x59a8d21b, 0x8c68d506, 0x040007d7, - 0x0201f800, 0x0010a0b2, 0x4200d000, 0x0010a0ec, - 0x586a4800, 0x42028800, 0x000007fe, 0x0401f012, - 0x5924d009, 0x41440000, 0x8068d400, 0x8268d480, - 0x000007f0, 0x586a6800, 0x813669c0, 0x04000007, - 0x5924d200, 0x8268d500, 0x00000003, 0x82697480, - 0x00000003, 0x0400002c, 0x8058b040, 0x83264c00, - 0x0000000b, 0x8058b1c0, 0x040207ee, 0x0401f7bb, - 0x8d0e1d20, 0x040007df, 0x4200d000, 0x000007d0, - 0x0401f7d8, 0x0201f800, 0x0010a0b2, 0x4200d000, - 0x0010a0ec, 0x586a4800, 0x42028800, 0x000007fe, - 0x8058b1c0, 0x040007ad, 0x41440000, 0x0401f005, - 0x83264c00, 0x0000000b, 0x8058b040, 0x040007a7, - 0x5924d009, 0x8068d400, 0x8268d480, 0x000007f0, - 0x586a6800, 0x813669c0, 0x040007f6, 0x5924d200, + 0x0010613a, 0x40c50000, 0x417a6000, 0x0201f800, + 0x00105ff7, 0x0201f800, 0x0010f260, 0x0201f800, + 0x0010f344, 0x417a7800, 0x0201f800, 0x0010f3dd, + 0x0201f800, 0x0010f7f5, 0x80817040, 0x04000032, + 0x81468800, 0x8058b040, 0x04000038, 0x0201f800, + 0x001042a5, 0x80c589c0, 0x040007fa, 0x5934da00, + 0x8c6cdd1a, 0x040007f7, 0x5934d403, 0x406a8800, + 0x417a7800, 0x42028000, 0x00000029, 0x5934d013, + 0x8068d130, 0x406a4000, 0x40680000, 0x4200d000, + 0x0010a3b3, 0x8068d400, 0x586a4800, 0x5924d000, + 0x8068d120, 0x8268e500, 0x00000020, 0x8c68d50a, + 0x040207ca, 0x4070d000, 0x4070d800, 0x0201f800, + 0x00109b33, 0x5934da00, 0x0401f7c4, 0x8c68d50a, + 0x0402078c, 0x80817040, 0x04020014, 0x0401f7bb, + 0x4200d000, 0x000007d0, 0x4200d800, 0x0010f866, + 0x0201f800, 0x00105e1a, 0x0201f800, 0x00101e1b, + 0x0401f7b0, 0x0201f800, 0x0010612b, 0x0401f7cd, + 0x4200d000, 0x000000a0, 0x40c4d800, 0x4134e000, + 0x0201f800, 0x001001ec, 0x58a24801, 0x58a24000, + 0x40866000, 0x408a6800, 0x408e8800, 0x40927800, + 0x4094b000, 0x589d3006, 0x589d2805, 0x589d2004, + 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x00000009, 0x589d4000, 0x809d3800, + 0x1c01f000, 0x497bc856, 0x0201f800, 0x00104b2d, + 0x80c589c0, 0x04020054, 0x59a8d015, 0x8c68d504, + 0x04020004, 0x59a8d21b, 0x8c68d506, 0x0402002b, + 0x8d0e1d20, 0x04020004, 0x59a8d006, 0x8c68d51c, + 0x0400001c, 0x4200b000, 0x000007f0, 0x417a8800, + 0x0401f004, 0x81468800, 0x8058b040, 0x04000015, + 0x0201f800, 0x001042a5, 0x80c589c0, 0x040007fa, + 0x0201f800, 0x00104583, 0x80c589c0, 0x040007f6, + 0x59a8d00f, 0x59340002, 0x8068d580, 0x8268d500, + 0x00ffff00, 0x040207f0, 0x5934d200, 0x8468d55a, + 0x486a6a00, 0x81468800, 0x8058b040, 0x040207ed, + 0x0201f800, 0x001044c9, 0x80c589c0, 0x04000022, + 0x59a8d02d, 0x4200d800, 0x0010f866, 0x0201f800, + 0x00105e1a, 0x0401f04b, 0x0201f800, 0x0010a362, + 0x4200d000, 0x0010a3b3, 0x586a4800, 0x42028800, + 0x000007fe, 0x8058b1c0, 0x040007ce, 0x5924d009, + 0x41440000, 0x8068d400, 0x8268d480, 0x000007f0, + 0x586a6800, 0x813669c0, 0x04000007, 0x5924d200, 0x8268d500, 0x00000003, 0x82697480, 0x00000003, - 0x040207f0, 0x5934d200, 0x8468d51a, 0x486a6a00, - 0x0401f7ec, 0x0201f800, 0x001044a7, 0x80c589c0, - 0x040007d2, 0x5934d200, 0x8468d55a, 0x486a6a00, - 0x0401f7ce, 0x1c01f000, 0x829d3c80, 0x00000004, - 0x48813800, 0x48853801, 0x48893802, 0x488d3803, - 0x40691000, 0x406d1800, 0x40710800, 0x41790000, - 0x4880e000, 0x83457480, 0x000007ff, 0x83f17500, - 0x03000000, 0x0400004e, 0x4880e002, 0x4944e001, - 0x4144f000, 0x4200d800, 0x0010a380, 0x4200b000, - 0x000007f0, 0x83457480, 0x000007ef, 0x04000040, - 0x0400103f, 0x4200b000, 0x00000010, 0x8344f480, - 0x000007f0, 0x5924d809, 0x8058b1c0, 0x04000017, - 0x40780000, 0x806cd400, 0x5868e000, 0x8070e1c0, - 0x04020044, 0x5884e801, 0x41440000, 0x80757480, - 0x0400005b, 0x8074d000, 0x8078f000, 0x83457480, - 0x000007ef, 0x0400004f, 0x0400104e, 0x82697480, - 0x00000800, 0x04000032, 0x48690801, 0x8058b040, - 0x8058b1c0, 0x040207eb, 0x5884d802, 0x806cd9c0, - 0x04000088, 0x412d0000, 0x4088d000, 0x0201f800, - 0x0010410f, 0x4947c857, 0x4937c857, 0x40825800, - 0x813669c0, 0x0400008f, 0x497a6a12, 0x59a8d21b, - 0x8c68d50a, 0x0402000a, 0x8288dd00, 0x00ffff00, - 0x04000073, 0x59a8d00f, 0x8268d500, 0x00ffff00, - 0x406c0000, 0x80697480, 0x0400006d, 0x488a6802, - 0x5924d005, 0x812000f0, 0x8068d540, 0x486a6813, - 0x4200d000, 0x00000001, 0x0401f0a3, 0x82697480, - 0x00fffffb, 0x040007c5, 0x040017c4, 0x4947c857, - 0x488bc857, 0x58857001, 0x48bbc857, 0x4a010800, - 0x00000019, 0x4080d000, 0x0401f097, 0x4a010801, - 0x000007f0, 0x4178f000, 0x8058b040, 0x0401f7cd, - 0x4070f800, 0x5870d002, 0x8268e500, 0x00ffffff, - 0x48710803, 0x40880000, 0x80717480, 0x04000035, - 0x5884e801, 0x41440000, 0x80757480, 0x040207b6, - 0x587d7002, 0x48b90803, 0x4947c857, 0x58857003, - 0x48bbc857, 0x4a010800, 0x0000001b, 0x0401f058, - 0x82697480, 0x000007f0, 0x040207b4, 0x49790801, - 0x4200d800, 0x0010a380, 0x0401f7e3, 0x49450802, - 0x83457480, 0x000007ef, 0x0400001a, 0x04001019, - 0x59a8d21b, 0x8c68d50a, 0x0400003c, 0x83457480, - 0x000007fe, 0x0400004c, 0x5924d200, 0x8268d500, - 0x00000220, 0x0400005d, 0x808101c0, 0x0402000d, - 0x82757480, 0x000007fc, 0x04000049, 0x82757480, - 0x000007fd, 0x0400003c, 0x82757480, 0x000007ff, - 0x040207bf, 0x82897480, 0x00ffffff, 0x040207bc, - 0x5884d002, 0x8468d55e, 0x48690802, 0x0401f786, - 0x587ce813, 0x8074d130, 0x41200000, 0x80697480, - 0x040207c8, 0x5924d005, 0x82740500, 0x00ffffff, - 0x80697480, 0x04000004, 0x812000f0, 0x8068d540, - 0x4868f813, 0x5884d001, 0x41440000, 0x80697480, - 0x0400002f, 0x4947c857, 0x4873c857, 0x488fc857, - 0x4a010800, 0x0000001a, 0x0401f019, 0x8288d500, - 0x000000ff, 0x8068d0d0, 0x486a6a12, 0x0401f790, - 0x4200d000, 0x000003f1, 0x4084e000, 0x0201f800, - 0x001001ec, 0x0401f774, 0x5924d200, 0x8268e500, - 0x00000020, 0x8c68d50a, 0x040207c8, 0x4947c857, - 0x4a010800, 0x0000001f, 0x4070d000, 0x0401f02a, - 0x4947c857, 0x4a010800, 0x0000000a, 0x4178d000, - 0x0401f025, 0x82897480, 0x00fffffd, 0x040007c9, - 0x0401f783, 0x82897480, 0x00fffffe, 0x04020017, - 0x42010000, 0x00000001, 0x0401f7b4, 0x82897480, - 0x00fffffc, 0x040007bf, 0x0401f779, 0x407e6800, - 0x8c8d1d08, 0x0400076f, 0x0201f800, 0x001043d4, - 0x80c589c0, 0x0400076b, 0x4947c857, 0x4a010800, - 0x0000001d, 0x0401f7e6, 0x4947c857, 0x4a010800, - 0x0000001f, 0x0401f008, 0x4947c857, 0x488bc857, + 0x0400002c, 0x8058b040, 0x83264c00, 0x0000000b, + 0x0401f7ed, 0x8d0e1d20, 0x04020004, 0x59a8d006, + 0x8c68d51c, 0x040007e0, 0x4200d000, 0x000007d0, + 0x0401f7d9, 0x0201f800, 0x0010a362, 0x4200d000, + 0x0010a3b3, 0x586a4800, 0x42028800, 0x000007fe, + 0x8058b1c0, 0x040007ab, 0x41440000, 0x5924d009, + 0x8068d400, 0x8268d480, 0x000007f0, 0x586a6800, + 0x813669c0, 0x0400000a, 0x5924d200, 0x8268d500, + 0x00000003, 0x82697480, 0x00000003, 0x04020004, + 0x5934d200, 0x8468d51a, 0x486a6a00, 0x83264c00, + 0x0000000b, 0x8058b040, 0x040207ed, 0x0401f795, + 0x0201f800, 0x00104583, 0x80c589c0, 0x040007d2, + 0x5934d200, 0x8468d55a, 0x486a6a00, 0x0401f7ce, + 0x1c01f000, 0x829d3c80, 0x00000004, 0x48813800, + 0x48853801, 0x48893802, 0x488d3803, 0x40691000, + 0x406d1800, 0x40710800, 0x41790000, 0x4880e000, + 0x83457480, 0x000007ff, 0x83f17500, 0x03000000, + 0x0400004e, 0x4880e002, 0x4944e001, 0x4144f000, + 0x4200d800, 0x0010a600, 0x4200b000, 0x000007f0, + 0x83457480, 0x000007ef, 0x04000040, 0x0400103f, + 0x4200b000, 0x00000010, 0x8344f480, 0x000007f0, + 0x5924d809, 0x8058b1c0, 0x04000017, 0x40780000, + 0x806cd400, 0x5868e000, 0x8070e1c0, 0x04020044, + 0x5884e801, 0x41440000, 0x80757480, 0x0400005b, + 0x8074d000, 0x8078f000, 0x83457480, 0x000007ef, + 0x0400004f, 0x0400104e, 0x82697480, 0x00000800, + 0x04000032, 0x48690801, 0x8058b040, 0x8058b1c0, + 0x040207eb, 0x5884d802, 0x806cd9c0, 0x04000088, + 0x412d0000, 0x4088d000, 0x0201f800, 0x001041e5, + 0x4947c857, 0x4937c857, 0x40825800, 0x813669c0, + 0x0400008f, 0x497a6a12, 0x59a8d21b, 0x8c68d50a, + 0x0402000a, 0x8288dd00, 0x00ffff00, 0x04000073, + 0x59a8d00f, 0x8268d500, 0x00ffff00, 0x406c0000, + 0x80697480, 0x0400006d, 0x488a6802, 0x5924d005, + 0x812000f0, 0x8068d540, 0x486a6813, 0x4200d000, + 0x00000001, 0x0401f0a3, 0x82697480, 0x00fffffb, + 0x040007c5, 0x040017c4, 0x4947c857, 0x488bc857, 0x58857001, 0x48bbc857, 0x4a010800, 0x00000019, - 0x4070d000, 0x40698800, 0x589d1803, 0x589d1002, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x00000004, - 0x1c01f000, 0x809d3840, 0x48813800, 0x4200d000, - 0x00009c0e, 0x4200d800, 0xfffffff7, 0x0201f800, - 0x0010e9f0, 0x4200d000, 0x00009c0e, 0x4200d800, - 0x00000010, 0x0201f800, 0x0010ea02, 0x59c4d0a3, - 0x8468d518, 0x486b88a3, 0x0201f800, 0x00103639, - 0x80c589c0, 0x04000007, 0x599cd019, 0x8268d500, - 0x0000e000, 0x82697480, 0x00004000, 0x0400008c, - 0x4200d000, 0x00000080, 0x0201f800, 0x001015d2, - 0x0201f800, 0x00105c8d, 0x59c4d0a3, 0x8468d506, - 0x486b88a3, 0x0201f800, 0x00104a33, 0x80c589c0, - 0x04020005, 0x0201f800, 0x00104a49, 0x80c589c0, - 0x0400006c, 0x59c4d0a3, 0x8268d500, 0xbe7fffff, - 0x486b88a3, 0x4200d000, 0x000000f8, 0x0201f800, - 0x00103e0c, 0x59c4d0a3, 0x8268d540, 0x00018000, - 0x8468d51c, 0x486b88a3, 0x59c4d0a3, 0x8468d520, - 0x486b88a3, 0x4a038808, 0x00000200, 0x59c4d006, - 0x8268d500, 0xfbffff0e, 0x486b8806, 0x497b282c, - 0x497b282d, 0x4200d000, 0x000001f4, 0x4200d800, - 0x0010faf2, 0x0201f800, 0x00105b19, 0x4a038805, - 0x00000001, 0x0201f800, 0x001016a8, 0x80c589c0, - 0x04020023, 0x0201f800, 0x001016b3, 0x80c589c0, - 0x04000035, 0x4178d000, 0x0201f800, 0x0010189e, - 0x4178d000, 0x0201f800, 0x00101874, 0x0201f800, - 0x001018fe, 0x4a03503c, 0x00000001, 0x0201f800, - 0x00104a33, 0x80c589c0, 0x04000018, 0x59c4d0a4, - 0x8268d500, 0x0000000f, 0x82697480, 0x00000008, - 0x04000003, 0x4a038805, 0x04000000, 0x59c4d0a3, - 0x8268d540, 0x0001c000, 0x486b88a3, 0x59c4d0a3, - 0x8468d520, 0x486b88a3, 0x0401f077, 0x4200d000, - 0x00000001, 0x0201f800, 0x0010189e, 0x4200d000, - 0x00000001, 0x0401f7e0, 0x0201f800, 0x00104a49, - 0x80c589c0, 0x040207e6, 0x0201f800, 0x00104a3e, - 0x4200d000, 0x000001a1, 0x80c589c0, 0x04020052, - 0x599cd818, 0x40c4e000, 0x0201f800, 0x001001ec, - 0x0401f061, 0x0201f800, 0x001016be, 0x80c589c0, - 0x04020030, 0x0201f800, 0x001016c9, 0x80c589c0, - 0x04000039, 0x4200d000, 0x00000003, 0x0201f800, - 0x0010189e, 0x4200d000, 0x00000003, 0x0401f7c2, - 0x0201f800, 0x00104a3e, 0x4200d000, 0x0000014e, - 0x80c589c0, 0x040007e7, 0x59c4d0a3, 0x8468d570, - 0x8468d532, 0x486b88a3, 0x0201f800, 0x00104d7a, - 0x4a038808, 0x00000208, 0x0401f799, 0x59a8d86f, - 0x826d0500, 0x00000007, 0x04020019, 0x59a8d03b, - 0x82697480, 0x00000002, 0x04000018, 0x0201f800, - 0x0010186b, 0x4883503a, 0x0201f800, 0x00101c53, - 0x4a035048, 0x00000003, 0x4a03503b, 0x00000002, - 0x4a035047, 0x00000001, 0x59a8d86f, 0x0401f00b, - 0x4200d000, 0x00000002, 0x0201f800, 0x0010189e, - 0x4200d000, 0x00000002, 0x0401f797, 0x82817480, - 0x00000004, 0x04000019, 0x806cd000, 0x486b506f, - 0x0401f754, 0x0201f800, 0x001016d4, 0x80c589c0, - 0x0400000e, 0x59a8d047, 0x8068d1c0, 0x0400078c, - 0x0201f800, 0x001016de, 0x4a03503c, 0x00000001, - 0x0401f015, 0x4a035014, 0x00000001, 0x0201f800, - 0x001049ab, 0x0401f010, 0x4200d000, 0x00000182, - 0x59a8d83b, 0x0401f7a8, 0x497b2804, 0x497b2805, - 0x0201f800, 0x00101c62, 0x4a035047, 0x00000001, - 0x4a035048, 0xaabbccdd, 0x4883503b, 0x59a8d86f, - 0x0401f7de, 0x589d0000, 0x809d3800, 0x1c01f000, - 0x5994d02c, 0x8068d1c0, 0x04020006, 0x5994d02d, - 0x4200d800, 0x00000001, 0x8068d1c0, 0x04000002, - 0x4178d800, 0x406d8800, 0x1c01f000, 0x0201f800, - 0x0010186b, 0x4a03503c, 0x00000002, 0x497b5047, - 0x59c4d0a3, 0x8468d520, 0x486b88a3, 0x0201f800, - 0x00103639, 0x80c589c0, 0x04000002, 0x0401f00d, - 0x0201f800, 0x00104a3e, 0x80c589c0, 0x040207fc, - 0x48c7282c, 0x48c7282d, 0x4200d000, 0x0000002d, - 0x4200d800, 0x0010faf2, 0x0201f800, 0x00105b19, - 0x1c01f000, 0x0401ffdb, 0x80c589c0, 0x04000004, - 0x4a03503c, 0x00000003, 0x0401f01f, 0x0201f800, - 0x001016d4, 0x80c589c0, 0x04000004, 0x59a8d047, - 0x8068d1c0, 0x04020008, 0x0201f800, 0x001018cd, - 0x80c589c0, 0x04020002, 0x0401f013, 0x0401ffd4, - 0x0401f011, 0x0201f800, 0x001016de, 0x59a8d046, - 0x8c68d51e, 0x040007f9, 0x0201f800, 0x00104a3e, - 0x80c589c0, 0x04020003, 0x0401ffc9, 0x0401f006, - 0x4a035014, 0x00000001, 0x0201f800, 0x001049ab, - 0x0401f7fa, 0x1c01f000, 0x4202d800, 0x00000001, - 0x497b503c, 0x4a038805, 0x00000001, 0x497b282c, - 0x497b282d, 0x497b8885, 0x1c01f000, 0x59c4d005, - 0x8268d500, 0x000000c0, 0x04020003, 0x486b8885, - 0x0401f006, 0x59c4d006, 0x8268d540, 0x000000f1, - 0x486b8806, 0x0401ffed, 0x1c01f000, 0x0201f800, - 0x00104a49, 0x80c589c0, 0x04000005, 0x59a8d013, - 0x82697480, 0x0000aaaa, 0x0400000c, 0x497b5013, - 0x59c4d006, 0x8268d540, 0x04000001, 0x486b8806, - 0x8d0e1d06, 0x04020008, 0x59c4d0a3, 0x8468d546, - 0x486b88a3, 0x0401f004, 0x4a03500f, 0x00ffffff, - 0x0401f7f3, 0x0401ffd5, 0x1c01f000, 0x809d3840, - 0x48813800, 0x0401ff87, 0x80c589c0, 0x04000005, - 0x4a03503c, 0x00000003, 0x497b8885, 0x0401f08b, - 0x4a038805, 0x000000f0, 0x0201f800, 0x001018cd, - 0x80c589c0, 0x04000042, 0x0201f800, 0x00101af5, - 0x80c589c0, 0x04000048, 0x59a8d04f, 0x8c68d50c, - 0x0400005e, 0x0201f800, 0x00101af5, 0x80c589c0, - 0x0402000b, 0x4a03c014, 0x00200020, 0x59c4d001, - 0x8268d500, 0x00018000, 0x82697480, 0x00018000, - 0x0400005f, 0x4a03c013, 0x00200000, 0x0201f800, - 0x00104a3e, 0x80c589c0, 0x0402004a, 0x59c4d0a4, - 0x8268d500, 0x0000000f, 0x82697480, 0x00000008, - 0x0400002b, 0x59c4d005, 0x82690500, 0x04000000, - 0x8c68d534, 0x04020026, 0x5994d02c, 0x82697480, - 0x00000002, 0x83f17500, 0x03000000, 0x040007cf, - 0x0201f800, 0x00104a49, 0x80c589c0, 0x040007cb, - 0x4a038805, 0x000000f0, 0x0201f800, 0x00104a7d, - 0x4a035013, 0x0000aaaa, 0x48835014, 0x59c4d0a3, - 0x8468d546, 0x486b88a3, 0x4202d800, 0x00000001, - 0x4883503c, 0x4a038805, 0x00000001, 0x4883282c, - 0x4883282d, 0x0401ff8e, 0x0401f7b8, 0x0201f800, - 0x001016d4, 0x80c589c0, 0x040007b4, 0x59a8d047, - 0x8068d1c0, 0x040007b1, 0x0401f7ae, 0x0401ff90, - 0x0401f7ae, 0x0201f800, 0x00101acb, 0x80c589c0, - 0x040007b6, 0x0201f800, 0x00101ad9, 0x80c589c0, - 0x04000022, 0x0201f800, 0x001016c9, 0x80c589c0, - 0x0400002a, 0x59a8d048, 0x42000000, 0xaabbccdd, - 0x80697480, 0x04000004, 0x82697480, 0x00000004, - 0x040207a6, 0x4a03503c, 0x00000003, 0x0401f023, - 0x0401ff6b, 0x0401f021, 0x4200d000, 0x00009c0e, - 0x4200d800, 0xffffffef, 0x0201f800, 0x0010e9f0, - 0x4200d000, 0x00009c0e, 0x4200d800, 0x00000008, - 0x0201f800, 0x0010ea02, 0x0401f797, 0x4a03c013, - 0x00200020, 0x0401f7a2, 0x0201f800, 0x001016a8, - 0x80c589c0, 0x0400000b, 0x59a8d048, 0x42000000, - 0xaabbccdd, 0x80697480, 0x040007e3, 0x8068d1c0, - 0x04020786, 0x0401f7e0, 0x59a8d048, 0x0401f7db, - 0x59a8d048, 0x0401f7fa, 0x589d0000, 0x809d3800, - 0x1c01f000, 0x497bc856, 0x4200d000, 0x00000080, - 0x0201f800, 0x001015d2, 0x497b503c, 0x0201f800, - 0x001016d4, 0x80c589c0, 0x0400000e, 0x59a8d03a, - 0x8068d1c0, 0x04020008, 0x8068d1c0, 0x04020009, - 0x4a03503a, 0x0000000a, 0x4a035047, 0x00000001, - 0x0401f004, 0x8068d040, 0x486b503a, 0x0401f7f7, - 0x497b8885, 0x0201f800, 0x001003c3, 0x1c01f000, - 0x4200e000, 0x00000003, 0x59a8003c, 0x80717480, - 0x04001006, 0x0c01f001, 0x0010faec, 0x0010faee, - 0x0010faf0, 0x0010faea, 0x4200d000, 0x000000c3, - 0x4000d800, 0x0201f800, 0x001001ec, 0x0401f008, - 0x0401ffd5, 0x0401f006, 0x0401fddb, 0x0401f004, - 0x0401fee9, 0x0401f002, 0x0401ff39, 0x1c01f000, - 0x497b282d, 0x1c01f000, 0x0201f800, 0x00103639, - 0x80c589c0, 0x04000007, 0x599cd019, 0x8268d500, - 0x0000e000, 0x82697480, 0x00004000, 0x04000003, - 0x4178d000, 0x0401f024, 0x59c4d001, 0x8268d500, - 0x00018000, 0x82697480, 0x00010000, 0x040207f9, - 0x59a8d070, 0x82697480, 0x00000002, 0x83f17500, - 0x03000000, 0x040007f3, 0x0201f800, 0x00101c62, - 0x4a035047, 0x00000001, 0x4a035048, 0xaabbccdd, - 0x4a03503b, 0x00000004, 0x497b503c, 0x4202d800, - 0x00000004, 0x59a8d070, 0x8068d000, 0x486b5070, - 0x59a8d06f, 0x8268d500, 0xfffffff8, 0x8468d544, - 0x486b506f, 0x0201f800, 0x0010040a, 0x4200d000, - 0x00000001, 0x40698800, 0x1c01f000, 0x809d3840, - 0x48813800, 0x59a8d017, 0x82697480, 0x0000ffff, - 0x04000004, 0x0201f800, 0x00101de7, 0x0401f0c4, - 0x59a8da1b, 0x826cd500, 0x00000028, 0x04000032, - 0x8c6cdd00, 0x04000030, 0x4a038802, 0x0000ffbf, - 0x59a8da1b, 0x8c6cdd02, 0x0400002b, 0x599ce018, - 0x82710500, 0x00000800, 0x8c70e516, 0x0402001d, - 0x59a8d01c, 0x82697480, 0x0000ffff, 0x04000019, - 0x8c6cdd0a, 0x040200a3, 0x42024800, 0x0010b111, - 0x40824000, 0x5924d200, 0x8268d500, 0x000000e0, - 0x82697480, 0x000000e0, 0x04020059, 0x0201f800, - 0x00101c7f, 0x59a8d21b, 0x8268dd00, 0x00000004, - 0x8c68d504, 0x04020052, 0x406e5800, 0x4200d000, - 0x00000003, 0x0201f800, 0x00101ca4, 0x0401f098, - 0x8c70e516, 0x04020005, 0x59a8d01c, 0x82697480, - 0x0000ffff, 0x0400008a, 0x59a8d01d, 0x8068d1c0, - 0x04020043, 0x8c6cdd08, 0x04000042, 0x599cd019, - 0x8c68d510, 0x04000043, 0x0201f800, 0x001043ef, + 0x4080d000, 0x0401f097, 0x4a010801, 0x000007f0, + 0x4178f000, 0x8058b040, 0x0401f7cd, 0x4070f800, + 0x5870d002, 0x8268e500, 0x00ffffff, 0x48710803, + 0x40880000, 0x80717480, 0x04000035, 0x5884e801, + 0x41440000, 0x80757480, 0x040207b6, 0x587d7002, + 0x48b90803, 0x4947c857, 0x58857003, 0x48bbc857, + 0x4a010800, 0x0000001b, 0x0401f058, 0x82697480, + 0x000007f0, 0x040207b4, 0x49790801, 0x4200d800, + 0x0010a600, 0x0401f7e3, 0x49450802, 0x83457480, + 0x000007ef, 0x0400001a, 0x04001019, 0x59a8d21b, + 0x8c68d50a, 0x0400003c, 0x83457480, 0x000007fe, + 0x0400004c, 0x5924d200, 0x8268d500, 0x00000220, + 0x0400005d, 0x808101c0, 0x0402000d, 0x82757480, + 0x000007fc, 0x04000049, 0x82757480, 0x000007fd, + 0x0400003c, 0x82757480, 0x000007ff, 0x040207bf, + 0x82897480, 0x00ffffff, 0x040207bc, 0x5884d002, + 0x8468d55e, 0x48690802, 0x0401f786, 0x587ce813, + 0x8074d130, 0x41200000, 0x80697480, 0x040207c8, + 0x5924d005, 0x82740500, 0x00ffffff, 0x80697480, + 0x04000004, 0x812000f0, 0x8068d540, 0x4868f813, + 0x5884d001, 0x41440000, 0x80697480, 0x0400002f, + 0x4947c857, 0x4873c857, 0x488fc857, 0x4a010800, + 0x0000001a, 0x0401f019, 0x8288d500, 0x000000ff, + 0x8068d0d0, 0x486a6a12, 0x0401f790, 0x4200d000, + 0x0000044d, 0x4084e000, 0x0201f800, 0x001001ec, + 0x0401f774, 0x5924d200, 0x8268e500, 0x00000020, + 0x8c68d50a, 0x040207c8, 0x4947c857, 0x4a010800, + 0x0000001f, 0x4070d000, 0x0401f02a, 0x4947c857, + 0x4a010800, 0x0000000a, 0x4178d000, 0x0401f025, + 0x82897480, 0x00fffffd, 0x040007c9, 0x0401f783, + 0x82897480, 0x00fffffe, 0x04020017, 0x42010000, + 0x00000001, 0x0401f7b4, 0x82897480, 0x00fffffc, + 0x040007bf, 0x0401f779, 0x407e6800, 0x8c8d1d08, + 0x0400076f, 0x0201f800, 0x001044ae, 0x80c589c0, + 0x0400076b, 0x4947c857, 0x4a010800, 0x0000001d, + 0x0401f7e6, 0x4947c857, 0x4a010800, 0x0000001f, + 0x0401f008, 0x4947c857, 0x488bc857, 0x58857001, + 0x48bbc857, 0x4a010800, 0x00000019, 0x4070d000, + 0x40698800, 0x589d1803, 0x589d1002, 0x589d0801, + 0x589d0000, 0x829d3c00, 0x00000004, 0x1c01f000, + 0x809d3840, 0x48813800, 0x4200d000, 0x00009c0e, + 0x4200d800, 0xfffffff7, 0x0201f800, 0x0010ebf0, + 0x4200d000, 0x00009c0e, 0x4200d800, 0x00000010, + 0x0201f800, 0x0010ec02, 0x59c4d0a3, 0x8468d518, + 0x486b88a3, 0x0201f800, 0x00103704, 0x80c589c0, + 0x04000007, 0x599cd019, 0x8268d500, 0x0000e000, + 0x82697480, 0x00004000, 0x0400008c, 0x4200d000, + 0x00000080, 0x0201f800, 0x001015d0, 0x0201f800, + 0x00105e4f, 0x59c4d0a3, 0x8468d506, 0x486b88a3, + 0x0201f800, 0x00104b38, 0x80c589c0, 0x04020005, + 0x0201f800, 0x00104b4e, 0x80c589c0, 0x0400006c, + 0x59c4d0a3, 0x8268d500, 0xbe7fffff, 0x486b88a3, + 0x4200d000, 0x000000f8, 0x0201f800, 0x00103edf, + 0x59c4d0a3, 0x8268d540, 0x00018000, 0x8468d51c, + 0x486b88a3, 0x59c4d0a3, 0x8468d520, 0x486b88a3, + 0x4a038808, 0x00000200, 0x59c4d006, 0x8268d500, + 0xfbffff0e, 0x486b8806, 0x497b282c, 0x497b282d, + 0x4200d000, 0x000001f4, 0x4200d800, 0x0010fcf1, + 0x0201f800, 0x00105cdb, 0x4a038805, 0x00000001, + 0x0201f800, 0x001016a9, 0x80c589c0, 0x04020023, + 0x0201f800, 0x001016b4, 0x80c589c0, 0x04000035, + 0x4178d000, 0x0201f800, 0x0010189f, 0x4178d000, + 0x0201f800, 0x00101875, 0x0201f800, 0x001018ff, + 0x4a03503c, 0x00000001, 0x0201f800, 0x00104b38, + 0x80c589c0, 0x04000018, 0x59c4d0a4, 0x8268d500, + 0x0000000f, 0x82697480, 0x00000008, 0x04000003, + 0x4a038805, 0x04000000, 0x59c4d0a3, 0x8268d540, + 0x0001c000, 0x486b88a3, 0x59c4d0a3, 0x8468d520, + 0x486b88a3, 0x0401f077, 0x4200d000, 0x00000001, + 0x0201f800, 0x0010189f, 0x4200d000, 0x00000001, + 0x0401f7e0, 0x0201f800, 0x00104b4e, 0x80c589c0, + 0x040207e6, 0x0201f800, 0x00104b43, 0x4200d000, + 0x000001a9, 0x80c589c0, 0x04020052, 0x599cd818, + 0x40c4e000, 0x0201f800, 0x001001ec, 0x0401f061, + 0x0201f800, 0x001016bf, 0x80c589c0, 0x04020030, + 0x0201f800, 0x001016ca, 0x80c589c0, 0x04000039, + 0x4200d000, 0x00000003, 0x0201f800, 0x0010189f, + 0x4200d000, 0x00000003, 0x0401f7c2, 0x0201f800, + 0x00104b43, 0x4200d000, 0x00000156, 0x80c589c0, + 0x040007e7, 0x59c4d0a3, 0x8468d570, 0x8468d532, + 0x486b88a3, 0x0201f800, 0x00104e7f, 0x4a038808, + 0x00000208, 0x0401f799, 0x59a8d86f, 0x826d0500, + 0x00000007, 0x04020019, 0x59a8d03b, 0x82697480, + 0x00000002, 0x04000018, 0x0201f800, 0x0010186c, + 0x4883503a, 0x0201f800, 0x00101c55, 0x4a035048, + 0x00000003, 0x4a03503b, 0x00000002, 0x4a035047, + 0x00000001, 0x59a8d86f, 0x0401f00b, 0x4200d000, + 0x00000002, 0x0201f800, 0x0010189f, 0x4200d000, + 0x00000002, 0x0401f797, 0x82817480, 0x00000004, + 0x04000019, 0x806cd000, 0x486b506f, 0x0401f754, + 0x0201f800, 0x001016d5, 0x80c589c0, 0x0400000e, + 0x59a8d047, 0x8068d1c0, 0x0400078c, 0x0201f800, + 0x001016df, 0x4a03503c, 0x00000001, 0x0401f015, + 0x4a035014, 0x00000001, 0x0201f800, 0x00104ab0, + 0x0401f010, 0x4200d000, 0x0000018a, 0x59a8d83b, + 0x0401f7a8, 0x497b2804, 0x497b2805, 0x0201f800, + 0x00101c64, 0x4a035047, 0x00000001, 0x4a035048, + 0xaabbccdd, 0x4883503b, 0x59a8d86f, 0x0401f7de, + 0x589d0000, 0x809d3800, 0x1c01f000, 0x5994d02c, + 0x8068d1c0, 0x04020006, 0x5994d02d, 0x4200d800, + 0x00000001, 0x8068d1c0, 0x04000002, 0x4178d800, + 0x406d8800, 0x1c01f000, 0x0201f800, 0x0010186c, + 0x4a03503c, 0x00000002, 0x497b5047, 0x59c4d0a3, + 0x8468d520, 0x486b88a3, 0x0201f800, 0x00103704, + 0x80c589c0, 0x04000002, 0x0401f00d, 0x0201f800, + 0x00104b43, 0x80c589c0, 0x040207fc, 0x48c7282c, + 0x48c7282d, 0x4200d000, 0x0000002d, 0x4200d800, + 0x0010fcf1, 0x0201f800, 0x00105cdb, 0x1c01f000, + 0x0401ffdb, 0x80c589c0, 0x04000004, 0x4a03503c, + 0x00000003, 0x0401f01f, 0x0201f800, 0x001016d5, + 0x80c589c0, 0x04000004, 0x59a8d047, 0x8068d1c0, + 0x04020008, 0x0201f800, 0x001018ce, 0x80c589c0, + 0x04020002, 0x0401f013, 0x0401ffd4, 0x0401f011, + 0x0201f800, 0x001016df, 0x59a8d046, 0x8c68d51e, + 0x040007f9, 0x0201f800, 0x00104b43, 0x80c589c0, + 0x04020003, 0x0401ffc9, 0x0401f006, 0x4a035014, + 0x00000001, 0x0201f800, 0x00104ab0, 0x0401f7fa, + 0x1c01f000, 0x4202d800, 0x00000001, 0x497b503c, + 0x4a038805, 0x00000001, 0x497b282c, 0x497b282d, + 0x497b8885, 0x1c01f000, 0x59c4d005, 0x8268d500, + 0x000000c0, 0x04020003, 0x486b8885, 0x0401f006, + 0x59c4d006, 0x8268d540, 0x000000f1, 0x486b8806, + 0x0401ffed, 0x1c01f000, 0x0201f800, 0x00104b4e, + 0x80c589c0, 0x04000005, 0x59a8d013, 0x82697480, + 0x0000aaaa, 0x0400000c, 0x497b5013, 0x59c4d006, + 0x8268d540, 0x04000001, 0x486b8806, 0x8d0e1d06, + 0x04020008, 0x59c4d0a3, 0x8468d546, 0x486b88a3, + 0x0401f004, 0x4a03500f, 0x00ffffff, 0x0401f7f3, + 0x0401ffd5, 0x1c01f000, 0x809d3840, 0x48813800, + 0x0401ff87, 0x80c589c0, 0x04000005, 0x4a03503c, + 0x00000003, 0x497b8885, 0x0401f08b, 0x4a038805, + 0x000000f0, 0x0201f800, 0x001018ce, 0x80c589c0, + 0x04000042, 0x0201f800, 0x00101af6, 0x80c589c0, + 0x04000048, 0x59a8d04f, 0x8c68d50c, 0x0400005e, + 0x0201f800, 0x00101af6, 0x80c589c0, 0x0402000b, + 0x4a03c014, 0x00200020, 0x59c4d001, 0x8268d500, + 0x00018000, 0x82697480, 0x00018000, 0x0400005f, + 0x4a03c013, 0x00200000, 0x0201f800, 0x00104b43, + 0x80c589c0, 0x0402004a, 0x59c4d0a4, 0x8268d500, + 0x0000000f, 0x82697480, 0x00000008, 0x0400002b, + 0x59c4d005, 0x82690500, 0x04000000, 0x8c68d534, + 0x04020026, 0x5994d02c, 0x82697480, 0x00000002, + 0x83f17500, 0x03000000, 0x040007cf, 0x0201f800, + 0x00104b4e, 0x80c589c0, 0x040007cb, 0x4a038805, + 0x000000f0, 0x0201f800, 0x00104b82, 0x4a035013, + 0x0000aaaa, 0x48835014, 0x59c4d0a3, 0x8468d546, + 0x486b88a3, 0x4202d800, 0x00000001, 0x4883503c, + 0x4a038805, 0x00000001, 0x4883282c, 0x4883282d, + 0x0401ff8e, 0x0401f7b8, 0x0201f800, 0x001016d5, + 0x80c589c0, 0x040007b4, 0x59a8d047, 0x8068d1c0, + 0x040007b1, 0x0401f7ae, 0x0401ff90, 0x0401f7ae, + 0x0201f800, 0x00101acc, 0x80c589c0, 0x040007b6, + 0x0201f800, 0x00101ada, 0x80c589c0, 0x04000022, + 0x0201f800, 0x001016ca, 0x80c589c0, 0x0400002a, + 0x59a8d048, 0x42000000, 0xaabbccdd, 0x80697480, + 0x04000004, 0x82697480, 0x00000004, 0x040207a6, + 0x4a03503c, 0x00000003, 0x0401f023, 0x0401ff6b, + 0x0401f021, 0x4200d000, 0x00009c0e, 0x4200d800, + 0xffffffef, 0x0201f800, 0x0010ebf0, 0x4200d000, + 0x00009c0e, 0x4200d800, 0x00000008, 0x0201f800, + 0x0010ec02, 0x0401f797, 0x4a03c013, 0x00200020, + 0x0401f7a2, 0x0201f800, 0x001016a9, 0x80c589c0, + 0x0400000b, 0x59a8d048, 0x42000000, 0xaabbccdd, + 0x80697480, 0x040007e3, 0x8068d1c0, 0x04020786, + 0x0401f7e0, 0x59a8d048, 0x0401f7db, 0x59a8d048, + 0x0401f7fa, 0x589d0000, 0x809d3800, 0x1c01f000, + 0x497bc856, 0x4200d000, 0x00000080, 0x0201f800, + 0x001015d0, 0x497b503c, 0x0201f800, 0x001016d5, + 0x80c589c0, 0x0400000e, 0x59a8d03a, 0x8068d1c0, + 0x04020008, 0x8068d1c0, 0x04020009, 0x4a03503a, + 0x0000000a, 0x4a035047, 0x00000001, 0x0401f004, + 0x8068d040, 0x486b503a, 0x0401f7f7, 0x497b8885, + 0x0201f800, 0x001003c3, 0x1c01f000, 0x4200e000, + 0x00000003, 0x59a8003c, 0x80717480, 0x04001006, + 0x0c01f001, 0x0010fceb, 0x0010fced, 0x0010fcef, + 0x0010fce9, 0x4200d000, 0x000000cb, 0x4000d800, + 0x0201f800, 0x001001ec, 0x0401f008, 0x0401ffd5, + 0x0401f006, 0x0401fddb, 0x0401f004, 0x0401fee9, + 0x0401f002, 0x0401ff39, 0x1c01f000, 0x497b282d, + 0x1c01f000, 0x0201f800, 0x00103704, 0x80c589c0, + 0x04000007, 0x599cd019, 0x8268d500, 0x0000e000, + 0x82697480, 0x00004000, 0x04000003, 0x4178d000, + 0x0401f024, 0x59c4d001, 0x8268d500, 0x00018000, + 0x82697480, 0x00010000, 0x040207f9, 0x59a8d070, + 0x82697480, 0x00000002, 0x83f17500, 0x03000000, + 0x040007f3, 0x0201f800, 0x00101c64, 0x4a035047, + 0x00000001, 0x4a035048, 0xaabbccdd, 0x4a03503b, + 0x00000004, 0x497b503c, 0x4202d800, 0x00000004, + 0x59a8d070, 0x8068d000, 0x486b5070, 0x59a8d06f, + 0x8268d500, 0xfffffff8, 0x8468d544, 0x486b506f, + 0x0201f800, 0x0010040a, 0x4200d000, 0x00000001, + 0x40698800, 0x1c01f000, 0x809d3840, 0x48813800, + 0x59a8d017, 0x82697480, 0x0000ffff, 0x04000004, + 0x0201f800, 0x00101e1b, 0x0401f0eb, 0x0201f800, + 0x0010a37c, 0x80c57040, 0x04000099, 0x59a8da1b, + 0x826cd500, 0x00000028, 0x04020046, 0x8c6cdd08, + 0x0400006c, 0x599cd019, 0x8c68d510, 0x04020003, + 0x8c6cdd16, 0x04000083, 0x0201f800, 0x001044c9, 0x80c589c0, 0x0402003a, 0x599cd019, 0x8c68d510, - 0x0400003f, 0x59a8d21b, 0x8c68d508, 0x0400003c, - 0x4a038802, 0x0000ffff, 0x4200d000, 0x0010ac60, - 0x0201f800, 0x00100516, 0x4200d000, 0x0010ac6d, + 0x04000064, 0x59a8d21b, 0x8c68d508, 0x04000061, + 0x4a038802, 0x0000ffff, 0x4200d000, 0x0010aee0, + 0x0201f800, 0x00100516, 0x4200d000, 0x0010aeed, 0x0201f800, 0x00100516, 0x850e1d02, 0x4a01a8e4, 0x00000080, 0x4202d800, 0x00000003, 0x4a035017, 0x0000ffff, 0x0201f800, 0x001003f1, 0x4178d000, - 0x0201f800, 0x001015d2, 0x497b5070, 0x59a8d21b, - 0x8c68d506, 0x04000046, 0x599cd018, 0x8268dd00, - 0x00000800, 0x8c68d516, 0x04020048, 0x599cd019, + 0x0201f800, 0x001015d0, 0x497b5070, 0x59a8d21b, + 0x8c68d506, 0x04000094, 0x599cd018, 0x8268dd00, + 0x00000800, 0x8c68d516, 0x0402008c, 0x599cd019, 0x8c68d510, 0x04000004, 0x59a8d21b, 0x8c68d508, - 0x0402004a, 0x417a4000, 0x4200d000, 0x0000ffff, + 0x04020090, 0x417a4000, 0x4200d000, 0x0000ffff, 0x4200d800, 0x00000006, 0x4120e000, 0x0201f800, - 0x00103571, 0x0201f800, 0x00104a49, 0x80c589c0, - 0x04000020, 0x0201f800, 0x00106312, 0x0401f04c, - 0x59a8d016, 0x8068d1c0, 0x040007c0, 0x0401f048, - 0x8c6cdd16, 0x040207bd, 0x0401f045, 0x599cd018, - 0x8c68d516, 0x0400001d, 0x599cd017, 0x8c68d50a, - 0x040007c0, 0x4200b000, 0x000007f0, 0x417a8800, - 0x0401f004, 0x81468800, 0x8058b040, 0x040007b9, - 0x0201f800, 0x001041cf, 0x80c589c0, 0x040007fa, - 0x5934d200, 0x8c68d51a, 0x040007f7, 0x0401f030, - 0x0201f800, 0x00104a28, 0x80c589c0, 0x04000016, - 0x59c4d006, 0x8468d534, 0x486b8806, 0x0201f800, - 0x00106312, 0x0401f7da, 0x0201f800, 0x00104708, - 0x80c589c0, 0x040007e1, 0x0401f021, 0x0201f800, - 0x00104a28, 0x80c589c0, 0x040207b8, 0x59a8d21b, - 0x486b541b, 0x0401f7b5, 0x0201f800, 0x001035cc, - 0x0401f7c5, 0x59c4d006, 0x8268d500, 0xffffff0f, - 0x486b8806, 0x0401f7ea, 0x406e4000, 0x4200d000, - 0x000007fe, 0x4200d800, 0x00000004, 0x0401f7b7, - 0x0201f800, 0x00101edf, 0x0401f75c, 0x8c6cdd04, - 0x04020776, 0x826cd500, 0x00004000, 0x8c6cdd1c, - 0x04020772, 0x406a5800, 0x0401f765, 0x589d0000, - 0x809d3800, 0x1c01f000, 0x809d3840, 0x48813800, - 0x59c4d00d, 0x8c68d51e, 0x04020004, 0x59c4d005, - 0x8c68d500, 0x0400000c, 0x0201f800, 0x00100403, - 0x0201f800, 0x00104a28, 0x80c589c0, 0x0400000f, - 0x0201f800, 0x001049ab, 0x816d7040, 0x040000a5, - 0x0401f11c, 0x4a035047, 0x00000001, 0x4202d800, - 0x00000004, 0x4200d000, 0x0010b0c0, 0x0201f800, - 0x00109f94, 0x0401f113, 0x0201f800, 0x00104a49, - 0x80c589c0, 0x0402008d, 0x0201f800, 0x001037ef, - 0x59c4d0a4, 0x8268d500, 0x0000000f, 0x82697480, - 0x00000006, 0x83f17500, 0x03000000, 0x040007e9, - 0x0201f800, 0x00105c8d, 0x59c4d0a3, 0x8468d528, - 0x486b88a3, 0x59a8d07d, 0x8068d1c0, 0x040000bc, - 0x59a8d015, 0x8468d546, 0x486b5015, 0x0201f800, - 0x00104a33, 0x80c589c0, 0x040200bc, 0x59c4d006, - 0x8268d540, 0x440000f1, 0x486b8806, 0x497b9005, - 0x0401fec2, 0x80c589c0, 0x040207d2, 0x40c4d000, - 0x0201f800, 0x00104809, 0x4a038802, 0x0000ffff, - 0x4a0378e4, 0x00003000, 0x4200d000, 0x0010ac7b, - 0x5868d400, 0x8c68d508, 0x04020003, 0x4a01a8e4, - 0x0000c000, 0x4200d000, 0x0010af99, 0x0201f800, - 0x00109f94, 0x59a8d00f, 0x4200d800, 0x00000003, - 0x0201f800, 0x00105faa, 0x4200d000, 0x00008010, - 0x59a8d809, 0x0201f800, 0x00103500, 0x59c4d001, - 0x8268d500, 0x00018000, 0x82697480, 0x00018000, - 0x040000a6, 0x59c4d0a3, 0x8468d518, 0x486b88a3, - 0x59c8d015, 0x8468d548, 0x486b9015, 0x0201f800, - 0x0010186b, 0x59a8d008, 0x8468d500, 0x486b5008, - 0x850e1d0a, 0x0201f800, 0x0010f748, 0x0201f800, - 0x00104a28, 0x80c589c0, 0x04020003, 0x8d0e1d06, - 0x0402009f, 0x0201f800, 0x001043ef, 0x80c589c0, - 0x04000091, 0x59c4d002, 0x8468d50c, 0x486b8802, - 0x497b501d, 0x497b501c, 0x497b5074, 0x0201f800, - 0x00104a28, 0x80c589c0, 0x04000078, 0x497b521b, - 0x0201f800, 0x00101671, 0x59a8d01f, 0x82680500, - 0xffff0000, 0x80c4d540, 0x486b501f, 0x599cd017, - 0x8c68d50a, 0x04000004, 0x59a8d21b, 0x8468d544, - 0x486b521b, 0x4200d000, 0x00000005, 0x0201f800, - 0x001064b2, 0x497b501d, 0x497b5016, 0x4a035017, - 0x0000ffff, 0x4a01a8e4, 0x000000c0, 0x4202d800, - 0x00000002, 0x0201f800, 0x00104a28, 0x80c589c0, - 0x04020007, 0x59a8d21b, 0x8268d500, 0x0000000c, - 0x82697480, 0x00000004, 0x0400076a, 0x0201f800, - 0x00101de7, 0x0401f083, 0x5994d02d, 0x42000000, - 0x00103df8, 0x80697480, 0x04000040, 0x59c4d006, - 0x8268d540, 0x000000c0, 0x486b8806, 0x0401f76b, - 0x59a8d011, 0x82697480, 0x00000009, 0x04020759, - 0x497b500f, 0x0201f800, 0x0010a0b2, 0x42024800, - 0x0010b111, 0x497a4805, 0x0401f00a, 0x5924d200, - 0x8c68d500, 0x04000004, 0x8268d500, 0xfffff815, - 0x486a4a00, 0x83264c00, 0x0000000b, 0x8058b040, - 0x8058b1c0, 0x040207f6, 0x4a038893, 0x00000001, - 0x4a038805, 0x000000f0, 0x0201f800, 0x00104a3e, - 0x80c589c0, 0x04000031, 0x59c4d006, 0x8268d540, - 0x000000f1, 0x486b8806, 0x59c4d006, 0x8268d500, - 0xbbffffff, 0x486b8806, 0x0201f800, 0x00105c8d, - 0x0201f800, 0x00105fc3, 0x0401fe20, 0x40c50000, - 0x80c589c0, 0x0402072f, 0x4200d000, 0x0010afa2, - 0x0201f800, 0x00109f94, 0x48835073, 0x4200d000, - 0x00008030, 0x4080d800, 0x0401f76f, 0x0201f800, - 0x00103d4c, 0x0401f03f, 0x5994d02c, 0x8068d1c0, - 0x0402072e, 0x0401f7be, 0x59c4d006, 0x8268d540, - 0x44000001, 0x486b8806, 0x59c4d006, 0x8268d500, - 0xffffff0f, 0x0401f741, 0x59a8d01f, 0x8268d500, - 0xffff0000, 0x486b501f, 0x0201f800, 0x00101671, - 0x48c78880, 0x0401f78a, 0x59c4d006, 0x8268d540, - 0x440000f1, 0x0401f7d4, 0x59c4d0a3, 0x8468d558, - 0x0401f75b, 0x0201f800, 0x00104a28, 0x80c589c0, - 0x0400000d, 0x59a8d018, 0x8068d1c0, 0x0402076d, - 0x0201f800, 0x001086c6, 0x0401f76a, 0x4a035073, - 0x00000001, 0x850e1d0e, 0x0201f800, 0x00103911, - 0x0401f014, 0x0201f800, 0x001086c6, 0x59a8d21b, - 0x8c68d506, 0x0402075f, 0x59a8d018, 0x8068d1c0, - 0x04020007, 0x59a8d41b, 0x8c68d508, 0x04000759, - 0x82697480, 0x0000ffff, 0x04000756, 0x4a03541b, - 0x0000ffff, 0x0201f800, 0x00103e51, 0x0401f751, - 0x589d0000, 0x809d3800, 0x1c01f000, 0x809d3840, - 0x48a13800, 0x829d3c80, 0x00000005, 0x409d4000, - 0x829d3c80, 0x00000007, 0x48813800, 0x48853801, - 0x48893802, 0x488d3803, 0x48913804, 0x48953805, - 0x48993806, 0x4200e000, 0x00000001, 0x48714000, - 0x4178e000, 0x48714003, 0x48714004, 0x48594001, - 0x49214002, 0x82691d00, 0x00ffffff, 0x826d3500, - 0x00ffffff, 0x828cd500, 0x00ff0000, 0x82697480, - 0x00ff0000, 0x0400005e, 0x41792800, 0x4200b000, - 0x000007f0, 0x41ad0800, 0x40951000, 0x828d2500, - 0x00ffff00, 0x0401f00f, 0x809121c0, 0x04000032, - 0x59a8d00f, 0x8268d500, 0x00ffff00, 0x40900000, - 0x80697480, 0x0400002c, 0x4178e000, 0x48714004, - 0x80850800, 0x80891000, 0x8058b040, 0x04000021, - 0x58850000, 0x808101c0, 0x04000036, 0x5880d212, - 0x8268d500, 0x0000ff00, 0x040207ec, 0x5880d002, - 0x8268d500, 0x00ffffff, 0x408c0000, 0x80697480, - 0x040207f0, 0x4098d000, 0x0201f800, 0x00101f38, - 0x5880d813, 0x806cd130, 0x41200000, 0x80697480, - 0x040207e8, 0x4200e000, 0x00000001, 0x48714004, - 0x5924d005, 0x826c0500, 0x00ffffff, 0x80697480, - 0x04000004, 0x812000f0, 0x8068d540, 0x48690013, - 0x58a0d004, 0x8068d1c0, 0x04000020, 0x408a8800, - 0x0401f048, 0x5880d002, 0x8268d500, 0x000000ff, - 0x828c0500, 0x000000ff, 0x80697480, 0x040207d1, - 0x4098d000, 0x0201f800, 0x00101f38, 0x5880d813, - 0x806cd130, 0x41200000, 0x80697480, 0x040207c9, - 0x4200d000, 0x00000001, 0x48694004, 0x0401f7e1, - 0x809529c0, 0x040207c3, 0x58a0e003, 0x8070e1c0, - 0x040207c0, 0x40892800, 0x4200d000, 0x00000001, - 0x48694003, 0x0401f7bb, 0x58a0e003, 0x8070e1c0, - 0x04000018, 0x40968800, 0x0401f026, 0x828d7480, - 0x00fffffb, 0x040007a1, 0x040017a0, 0x828d7480, - 0x00ffffff, 0x0400079d, 0x828d7480, 0x00fffffd, - 0x0400001a, 0x828d7480, 0x00fffffd, 0x83f17500, - 0x03000000, 0x0400000c, 0x828d7480, 0x00fffffc, - 0x0400000f, 0x4178d000, 0x48694000, 0x0401f011, - 0x488fc857, 0x489bc857, 0x58a0d003, 0x48694000, - 0x0401f00c, 0x828d7480, 0x00fffffe, 0x040207f6, - 0x42028800, 0x000007fe, 0x0401f006, 0x42028800, - 0x000007fc, 0x0401f003, 0x42028800, 0x000007fd, - 0x58a24002, 0x58a0b001, 0x58a18800, 0x589d3006, - 0x589d2805, 0x589d2004, 0x589d1803, 0x589d1002, - 0x589d0801, 0x589d0000, 0x829d3c00, 0x0000000c, - 0x589d4000, 0x809d3800, 0x1c01f000, 0x486bc857, - 0x0401ff4f, 0x1c01f000, 0x00000000, 0x00000001, - 0x00000002, 0x00000003, 0x00000004, 0x00000005, - 0x00000006, 0x00000007, 0x00000008, 0x00000009, - 0x0000000a, 0x0000000b, 0x0000000c, 0x0000000d, - 0x0000000e, 0x0000000f, 0xab44c07c, 0x02800004, - 0x00000000, 0x0000c000, 0x0000093b, 0x073fca5a, - 0x0705a5a5, 0x01928009, 0x070ff0e1, 0x03800006, - 0x053f2aaa, 0x070aaaaa, 0x073f3aaa, 0x070aaaaa, - 0x05958014, 0x05308000, 0x05008000, 0x0600902f, - 0x06a006b3, 0x0202f051, 0x042e4020, 0x008f02b0, - 0x033e5000, 0x03020000, 0x078d0024, 0x069305c2, - 0x029205c4, 0x050fb056, 0x040010e6, 0x002fb008, - 0x060ff0e6, 0x00580401, 0x054880ff, 0x07810022, - 0x018c0412, 0x018a0411, 0x058b040f, 0x079f0028, - 0x0098085b, 0x079f0028, 0x05990859, 0x058e8014, - 0x0678aae5, 0x06000051, 0x068181ce, 0x079a0014, - 0x022a5001, 0x030430d4, 0x06780043, 0x030e0000, - 0x030450ff, 0x06780043, 0x03019000, 0x02a1820b, - 0x078187f0, 0x027c0045, 0x03020000, 0x058180fc, - 0x05908039, 0x019107ee, 0x010410a6, 0x072d6000, - 0x05601041, 0x050f80ff, 0x032fa071, 0x070ff0d1, - 0x055c0403, 0x034a88ff, 0x06818808, 0x038000f0, - 0x07480000, 0x058107fa, 0x05481000, 0x05818050, - 0x06780043, 0x070000f0, 0x0681005b, 0x037c00ff, - 0x06000010, 0x078187f6, 0x0280005b, 0x06780043, - 0x070000f0, 0x037c00ff, 0x07000030, 0x0681005b, - 0x06780043, 0x070000f0, 0x037c00ff, 0x06000020, - 0x0681005b, 0x018007f6, 0x0379ff00, 0x070fffff, - 0x06780043, 0x07f00000, 0x075a0000, 0x020ef001, - 0x008607f8, 0x05484000, 0x03a1822e, 0x03680c00, - 0x07818822, 0x062d6002, 0x002fb001, 0x070ff069, - 0x00868070, 0x060ff079, 0x055c0441, 0x07810014, - 0x012fb000, 0x060560fb, 0x02800076, 0x060ff079, - 0x03868209, 0x070ff069, 0x055c0441, 0x07810014, - 0x060560fb, 0x070ff0d1, 0x062d6001, 0x055c040c, - 0x058180d7, 0x070ff0d1, 0x045c040d, 0x054b08ff, - 0x058180e1, 0x0007b001, 0x03079041, 0x0307a000, - 0x07489000, 0x07818103, 0x068d0083, 0x0207c004, - 0x0107d005, 0x0107e006, 0x0207f007, 0x02080008, - 0x01081009, 0x0108200a, 0x0208300b, 0x0186809a, - 0x0448d07a, 0x0581809a, 0x0448b07a, 0x04810801, - 0x0049707a, 0x0581809a, 0x04604679, 0x050f80ff, - 0x053fa809, 0x06000001, 0x01680703, 0x076c0303, - 0x06818801, 0x072d5003, 0x0049107a, 0x068100a4, - 0x070ff00a, 0x0054040b, 0x058280a3, 0x078d00a0, - 0x0008200b, 0x032ff000, 0x010770ff, 0x0108400c, - 0x0208500d, 0x0678007a, 0x06000008, 0x078100b7, - 0x078d00a9, 0x04603e79, 0x050f80ff, 0x073fa041, - 0x0600004a, 0x0049707a, 0x02a188b9, 0x068d00b0, - 0x0678007a, 0x07f00000, 0x010880ff, 0x02386008, - 0x03010000, 0x038000bd, 0x078d00b7, 0x0678007a, - 0x07f00000, 0x010880ff, 0x03386000, 0x03010000, - 0x072e6300, 0x020ef07f, 0x03860014, 0x070ff07d, - 0x0450047c, 0x050f80ff, 0x002fa819, 0x068d00c4, - 0x02080001, 0x00081002, 0x0678007a, 0x05000200, - 0x078100cc, 0x0049107a, 0x03a18227, 0x01082003, - 0x068d00cd, 0x0448b07a, 0x068100d3, 0x0338600c, - 0x03010000, 0x028000d5, 0x02386004, 0x03010000, - 0x072e6c00, 0x03800014, 0x062d6001, 0x07f00000, - 0x07f00000, 0x0400e0d0, 0x0648300e, 0x0681007a, - 0x072e500c, 0x00208001, 0x07a006b8, 0x03800014, - 0x06780043, 0x070000f0, 0x05810803, 0x050020ff, - 0x027c0002, 0x06000010, 0x068100ec, 0x027c0002, - 0x07000030, 0x068100ec, 0x01800803, 0x0500d0d1, - 0x0279ff0d, 0x070000ff, 0x0380007e, 0x020ef002, - 0x018607e8, 0x04602602, 0x050f80ff, 0x053fa809, - 0x06000008, 0x060ff0d0, 0x055c0411, 0x0179feff, - 0x0700ffff, 0x078187e8, 0x02800045, 0x027c0045, - 0x03040000, 0x0581010c, 0x027c0045, 0x03080000, - 0x058107ee, 0x03800039, 0x06600a79, 0x050f80ff, - 0x053fa80a, 0x06000010, 0x02800083, 0x05601041, - 0x050f80ff, 0x032fa071, 0x02800045, 0x0204a051, - 0x06780043, 0x070000f0, 0x037c00ff, 0x06000010, - 0x068181bf, 0x072d6000, 0x029487ea, 0x050fb056, - 0x044880e6, 0x05818014, 0x060ff0d0, 0x0179feff, - 0x0700ffff, 0x057dfeff, 0x0700ffff, 0x058107e8, - 0x053f2000, 0x07030000, 0x019d8014, 0x070ff093, - 0x045a0201, 0x070ff093, 0x045c0401, 0x06818120, - 0x02046092, 0x04002046, 0x060ff002, 0x045c0401, - 0x0703a0ff, 0x04600202, 0x00540401, 0x0782812e, - 0x04500425, 0x070060ff, 0x0730ffff, 0x0700000f, - 0x0742000f, 0x04810201, 0x04a007d0, 0x0648a002, - 0x06818131, 0x00047089, 0x070ff047, 0x045c0443, - 0x077800ff, 0x07f00000, 0x078181ff, 0x07780047, - 0x0500e000, 0x078187d7, 0x070ff006, 0x00860164, - 0x0179fe47, 0x0700000f, 0x010480ff, 0x056c7048, - 0x0681814a, 0x007a0d4a, 0x04003801, 0x0220f001, - 0x00800157, 0x07608e48, 0x034a60ff, 0x0700f0ff, - 0x074b88ff, 0x037000ff, 0x07000600, 0x05500448, - 0x074d00ff, 0x045a044a, 0x0304a0ff, 0x070ff00f, - 0x01540406, 0x04820164, 0x0595016c, 0x05a0024e, - 0x0386816f, 0x06780043, 0x070000f0, 0x037c00ff, - 0x07000030, 0x0581016a, 0x0134bfff, 0x070fffff, - 0x0104102e, 0x050fd041, 0x01800178, 0x0595016a, - 0x05a0024e, 0x0186016a, 0x0202f00e, 0x052e4030, - 0x040fd02f, 0x04a002ad, 0x03800014, 0x0400e02f, - 0x042e4020, 0x0202f051, 0x0004100e, 0x0004b00e, - 0x004980e5, 0x07818178, 0x06780043, 0x070000f0, - 0x037c00ff, 0x07000030, 0x0481081f, 0x024a6c46, - 0x04500423, 0x050070ff, 0x03620024, 0x050080ff, - 0x04004046, 0x0700500f, 0x03206000, 0x05601048, - 0x0700a0ff, 0x0700900a, 0x070ff005, 0x04500446, - 0x00540425, 0x048201ab, 0x07601822, 0x050f80ff, - 0x063fa032, 0x06000002, 0x03203000, 0x01204000, - 0x03205000, 0x0120b000, 0x0320c000, 0x07601841, - 0x050f80ff, 0x043fa852, 0x06000001, 0x070ff056, - 0x056c02ff, 0x050fb0ff, 0x070560ff, 0x03079041, - 0x05601041, 0x050f80ff, 0x073fa011, 0x0600003d, - 0x06780043, 0x07f00000, 0x065a007a, 0x010880ff, - 0x033e5000, 0x05002000, 0x05a00247, 0x048d01a4, - 0x0208a04a, 0x0108b04b, 0x02386001, 0x03010000, - 0x072e6300, 0x038000be, 0x0500d00a, 0x05500405, - 0x014a68ff, 0x070090ff, 0x0154040a, 0x0700c0ff, - 0x0600a023, 0x0500b024, 0x02206001, 0x07601822, - 0x050f80ff, 0x063fa04a, 0x06000002, 0x07f00000, - 0x07601222, 0x050f80ff, 0x043fa819, 0x06000001, - 0x0600a00d, 0x0180018e, 0x06780043, 0x070000f0, - 0x050010ff, 0x027c0001, 0x07000030, 0x058101c9, - 0x027c0001, 0x06000020, 0x058107de, 0x018007f6, - 0x0548e0e4, 0x058107de, 0x0334a000, 0x03080000, - 0x01800112, 0x074860ff, 0x068181ea, 0x054880ff, - 0x07810014, 0x070ff056, 0x050fb0ff, 0x044880e5, - 0x048101d9, 0x044880e6, 0x05818014, 0x008001df, - 0x056c02ff, 0x050fb0ff, 0x070560ff, 0x072e5300, - 0x044880e6, 0x05818014, 0x072d5003, 0x06780043, - 0x07f00000, 0x010880ff, 0x048d01e3, 0x03386005, - 0x03010000, 0x033e6000, 0x0700000c, 0x052e5200, - 0x03800014, 0x079a0014, 0x05301fff, 0x0700000f, - 0x06420001, 0x04810201, 0x04a007d0, 0x0648a002, - 0x078181ed, 0x062e5080, 0x04001089, 0x040fd002, - 0x040fd001, 0x02499001, 0x04810220, 0x070ff0d4, - 0x050fd0ff, 0x045c0401, 0x077800ff, 0x07f00000, - 0x06818220, 0x03800014, 0x012091ff, 0x038006bb, - 0x00209201, 0x038006bb, 0x01209203, 0x038006bb, - 0x03209000, 0x038006bb, 0x00209207, 0x038006bb, - 0x01209209, 0x038006bb, 0x06780043, 0x07009000, - 0x06818216, 0x00498043, 0x04810216, 0x0648a0e5, - 0x05810217, 0x027c0045, 0x03040000, 0x04810219, - 0x075c00ff, 0x07c00000, 0x056a02ff, 0x00800216, - 0x00800215, 0x06780075, 0x06000c07, 0x04810720, - 0x0020921a, 0x070fc0ff, 0x07a006a6, 0x070fc0ff, - 0x05308000, 0x0700a000, 0x07a006b8, 0x033e5000, - 0x0700000c, 0x03800014, 0x070ff003, 0x01540477, - 0x0682822c, 0x07003077, 0x060ff051, 0x010770ff, - 0x07c00000, 0x04602001, 0x050f80ff, 0x063fa029, - 0x06000008, 0x02015010, 0x02016051, 0x00017051, - 0x00011051, 0x07601e41, 0x050f80ff, 0x053fa83a, - 0x06000008, 0x07f00000, 0x05601041, 0x050f80ff, - 0x01464000, 0x032fa00a, 0x05007011, 0x05008012, - 0x06009013, 0x0700a014, 0x0400b015, 0x0600c016, - 0x0500d017, 0x07c00000, 0x072d5003, 0x06601879, - 0x050f80ff, 0x048d024a, 0x063fa051, 0x0600003e, - 0x07c00000, 0x06005051, 0x0400e02c, 0x0660060e, + 0x0010363c, 0x0201f800, 0x00104b4e, 0x80c589c0, + 0x04000049, 0x0201f800, 0x001064d4, 0x0401f09e, + 0x8c6cdd00, 0x040007ba, 0x4a038802, 0x0000ffbf, + 0x59a8da1b, 0x8c6cdd02, 0x040007b5, 0x599ce018, + 0x82710500, 0x00000800, 0x8c70e516, 0x04020051, + 0x59a8d01c, 0x82697480, 0x0000ffff, 0x0400004d, + 0x8c6cdd0a, 0x0402007a, 0x42024800, 0x0010b391, + 0x417a4000, 0x5924d200, 0x8268d500, 0x000000e0, + 0x82697480, 0x000000e0, 0x040207e5, 0x0201f800, + 0x00101c81, 0x59a8d21b, 0x8268dd00, 0x00000004, + 0x8c68d504, 0x040207de, 0x406e5800, 0x4200d000, + 0x00000003, 0x0201f800, 0x00101ca6, 0x0401f076, + 0x59a8d016, 0x8068d1c0, 0x04000798, 0x0401f072, + 0x599cd018, 0x8c68d516, 0x04000043, 0x599cd017, + 0x8c68d50a, 0x04020004, 0x59a8d006, 0x8c68d51c, + 0x04000798, 0x4200b000, 0x000007f0, 0x417a8800, + 0x0401f004, 0x81468800, 0x8058b040, 0x04000791, + 0x0201f800, 0x001042a5, 0x80c589c0, 0x040007fa, + 0x5934d200, 0x8c68d51a, 0x040007f7, 0x0401f05a, + 0x0401f059, 0x0201f800, 0x00104b2d, 0x80c589c0, + 0x0400003e, 0x59c4d006, 0x8468d534, 0x486b8806, + 0x0201f800, 0x001064d4, 0x0401f7b1, 0x0201f800, + 0x001044c9, 0x40c50000, 0x80c589c0, 0x040207ac, + 0x4202d800, 0x00000003, 0x0201f800, 0x001003f1, + 0x4080d000, 0x0201f800, 0x001015d0, 0x0401f042, + 0x8c70e516, 0x04020005, 0x59a8d01c, 0x82697480, + 0x0000ffff, 0x04000034, 0x59a8d01d, 0x8068d1c0, + 0x0402079b, 0x0201f800, 0x0010a386, 0x80c57040, + 0x04000003, 0x59a8da1b, 0x0401f751, 0x0201f800, + 0x001020a5, 0x80c57040, 0x04000791, 0x59a8da1b, + 0x0401f74b, 0x0201f800, 0x001047e7, 0x80c589c0, + 0x040007bb, 0x0401f028, 0x0201f800, 0x00103697, + 0x0401f781, 0x0201f800, 0x00104b2d, 0x80c589c0, + 0x0402076a, 0x59a8d21b, 0x486b541b, 0x0401f767, + 0x406e4000, 0x4200d000, 0x000007fe, 0x4200d800, + 0x00000004, 0x0401f771, 0x59c4d006, 0x8268d500, + 0xffffff0f, 0x486b8806, 0x0401f7c2, 0x0201f800, + 0x0010a386, 0x4200d000, 0x00000010, 0x80c57040, + 0x04000002, 0x4080d000, 0x0201f800, 0x00101f37, + 0x0401f77e, 0x8c6cdd04, 0x040207cc, 0x826cd500, + 0x00004000, 0x8c6cdd1c, 0x040207c8, 0x406a5800, + 0x0401f787, 0x589d0000, 0x809d3800, 0x1c01f000, + 0x809d3840, 0x48813800, 0x59c4d00d, 0x8c68d51e, + 0x04020004, 0x59c4d005, 0x8c68d500, 0x0400000c, + 0x0201f800, 0x00100403, 0x0201f800, 0x00104b2d, + 0x80c589c0, 0x0400000f, 0x0201f800, 0x00104ab0, + 0x816d7040, 0x040000a5, 0x0401f11c, 0x4a035047, + 0x00000001, 0x4202d800, 0x00000004, 0x4200d000, + 0x0010b340, 0x0201f800, 0x0010a244, 0x0401f113, + 0x0201f800, 0x00104b4e, 0x80c589c0, 0x0402008d, + 0x0201f800, 0x001038c2, 0x59c4d0a4, 0x8268d500, + 0x0000000f, 0x82697480, 0x00000006, 0x83f17500, + 0x03000000, 0x040007e9, 0x0201f800, 0x00105e4f, + 0x59c4d0a3, 0x8468d528, 0x486b88a3, 0x59a8d07d, + 0x8068d1c0, 0x040000bc, 0x59a8d015, 0x8468d546, + 0x486b5015, 0x0201f800, 0x00104b38, 0x80c589c0, + 0x040200bc, 0x59c4d006, 0x8268d540, 0x440000f1, + 0x486b8806, 0x497b9005, 0x0401fe9b, 0x80c589c0, + 0x040207d2, 0x40c4d000, 0x0201f800, 0x00104906, + 0x4a038802, 0x0000ffff, 0x4a0378e4, 0x00003000, + 0x4200d000, 0x0010aefb, 0x5868d400, 0x8c68d508, + 0x04020003, 0x4a01a8e4, 0x0000c000, 0x4200d000, + 0x0010b219, 0x0201f800, 0x0010a244, 0x59a8d00f, + 0x4200d800, 0x00000003, 0x0201f800, 0x0010616c, + 0x4200d000, 0x00008010, 0x59a8d809, 0x0201f800, + 0x001035cb, 0x59c4d001, 0x8268d500, 0x00018000, + 0x82697480, 0x00018000, 0x040000a6, 0x59c4d0a3, + 0x8468d518, 0x486b88a3, 0x59c8d015, 0x8468d548, + 0x486b9015, 0x0201f800, 0x0010186c, 0x59a8d008, + 0x8468d500, 0x486b5008, 0x850e1d0a, 0x0201f800, + 0x0010f943, 0x0201f800, 0x00104b2d, 0x80c589c0, + 0x04020003, 0x8d0e1d06, 0x0402009f, 0x0201f800, + 0x001044c9, 0x80c589c0, 0x04000091, 0x59c4d002, + 0x8468d50c, 0x486b8802, 0x497b501d, 0x497b501c, + 0x497b5074, 0x0201f800, 0x00104b2d, 0x80c589c0, + 0x04000078, 0x497b521b, 0x0201f800, 0x00101672, + 0x59a8d01f, 0x82680500, 0xffff0000, 0x80c4d540, + 0x486b501f, 0x599cd017, 0x8c68d50a, 0x04000004, + 0x59a8d21b, 0x8468d544, 0x486b521b, 0x4200d000, + 0x00000005, 0x0201f800, 0x00106674, 0x497b501d, + 0x497b5016, 0x4a035017, 0x0000ffff, 0x4a01a8e4, + 0x000000c0, 0x4202d800, 0x00000002, 0x0201f800, + 0x00104b2d, 0x80c589c0, 0x04020007, 0x59a8d21b, + 0x8268d500, 0x0000000c, 0x82697480, 0x00000004, + 0x0400076a, 0x0201f800, 0x00101e1b, 0x0401f083, + 0x5994d02d, 0x42000000, 0x00103ecb, 0x80697480, + 0x04000040, 0x59c4d006, 0x8268d540, 0x000000c0, + 0x486b8806, 0x0401f76b, 0x59a8d011, 0x82697480, + 0x00000009, 0x04020759, 0x497b500f, 0x0201f800, + 0x0010a362, 0x42024800, 0x0010b391, 0x497a4805, + 0x0401f00a, 0x5924d200, 0x8c68d500, 0x04000004, + 0x8268d500, 0xffffd815, 0x486a4a00, 0x83264c00, + 0x0000000b, 0x8058b040, 0x8058b1c0, 0x040207f6, + 0x4a038893, 0x00000001, 0x4a038805, 0x000000f0, + 0x0201f800, 0x00104b43, 0x80c589c0, 0x04000031, + 0x59c4d006, 0x8268d540, 0x000000f1, 0x486b8806, + 0x59c4d006, 0x8268d500, 0xbbffffff, 0x486b8806, + 0x0201f800, 0x00105e4f, 0x0201f800, 0x00106185, + 0x0401fdf9, 0x40c50000, 0x80c589c0, 0x0402072f, + 0x4200d000, 0x0010b222, 0x0201f800, 0x0010a244, + 0x48835073, 0x4200d000, 0x00008030, 0x4080d800, + 0x0401f76f, 0x0201f800, 0x00103e1f, 0x0401f03f, + 0x5994d02c, 0x8068d1c0, 0x0402072e, 0x0401f7be, + 0x59c4d006, 0x8268d540, 0x44000001, 0x486b8806, + 0x59c4d006, 0x8268d500, 0xffffff0f, 0x0401f741, + 0x59a8d01f, 0x8268d500, 0xffff0000, 0x486b501f, + 0x0201f800, 0x00101672, 0x48c78880, 0x0401f78a, + 0x59c4d006, 0x8268d540, 0x440000f1, 0x0401f7d4, + 0x59c4d0a3, 0x8468d558, 0x0401f75b, 0x0201f800, + 0x00104b2d, 0x80c589c0, 0x0400000d, 0x59a8d018, + 0x8068d1c0, 0x0402076d, 0x0201f800, 0x001088a7, + 0x0401f76a, 0x4a035073, 0x00000001, 0x850e1d0e, + 0x0201f800, 0x001039e4, 0x0401f014, 0x0201f800, + 0x001088a7, 0x59a8d21b, 0x8c68d506, 0x0402075f, + 0x59a8d018, 0x8068d1c0, 0x04020007, 0x59a8d41b, + 0x8c68d508, 0x04000759, 0x82697480, 0x0000ffff, + 0x04000756, 0x4a03541b, 0x0000ffff, 0x0201f800, + 0x00103f24, 0x0401f751, 0x589d0000, 0x809d3800, + 0x1c01f000, 0x809d3840, 0x48a13800, 0x829d3c80, + 0x00000005, 0x409d4000, 0x829d3c80, 0x00000007, + 0x48813800, 0x48853801, 0x48893802, 0x488d3803, + 0x48913804, 0x48953805, 0x48993806, 0x4200e000, + 0x00000001, 0x48714000, 0x4178e000, 0x48714003, + 0x48714004, 0x48594001, 0x49214002, 0x82691d00, + 0x00ffffff, 0x826d3500, 0x00ffffff, 0x828cd500, + 0x00ff0000, 0x82697480, 0x00ff0000, 0x0400005e, + 0x41792800, 0x4200b000, 0x000007f0, 0x41ad0800, + 0x40951000, 0x828d2500, 0x00ffff00, 0x0401f00f, + 0x809121c0, 0x04000032, 0x59a8d00f, 0x8268d500, + 0x00ffff00, 0x40900000, 0x80697480, 0x0400002c, + 0x4178e000, 0x48714004, 0x80850800, 0x80891000, + 0x8058b040, 0x04000021, 0x58850000, 0x808101c0, + 0x04000036, 0x5880d212, 0x8268d500, 0x0000ff00, + 0x040207ec, 0x5880d002, 0x8268d500, 0x00ffffff, + 0x408c0000, 0x80697480, 0x040207f0, 0x4098d000, + 0x0201f800, 0x00101f91, 0x5880d813, 0x806cd130, + 0x41200000, 0x80697480, 0x040207e8, 0x4200e000, + 0x00000001, 0x48714004, 0x5924d005, 0x826c0500, + 0x00ffffff, 0x80697480, 0x04000004, 0x812000f0, + 0x8068d540, 0x48690013, 0x58a0d004, 0x8068d1c0, + 0x04000020, 0x408a8800, 0x0401f048, 0x5880d002, + 0x8268d500, 0x000000ff, 0x828c0500, 0x000000ff, + 0x80697480, 0x040207d1, 0x4098d000, 0x0201f800, + 0x00101f91, 0x5880d813, 0x806cd130, 0x41200000, + 0x80697480, 0x040207c9, 0x4200d000, 0x00000001, + 0x48694004, 0x0401f7e1, 0x809529c0, 0x040207c3, + 0x58a0e003, 0x8070e1c0, 0x040207c0, 0x40892800, + 0x4200d000, 0x00000001, 0x48694003, 0x0401f7bb, + 0x58a0e003, 0x8070e1c0, 0x04000018, 0x40968800, + 0x0401f026, 0x828d7480, 0x00fffffb, 0x040007a1, + 0x040017a0, 0x828d7480, 0x00ffffff, 0x0400079d, + 0x828d7480, 0x00fffffd, 0x0400001a, 0x828d7480, + 0x00fffffd, 0x83f17500, 0x03000000, 0x0400000c, + 0x828d7480, 0x00fffffc, 0x0400000f, 0x4178d000, + 0x48694000, 0x0401f011, 0x488fc857, 0x489bc857, + 0x58a0d003, 0x48694000, 0x0401f00c, 0x828d7480, + 0x00fffffe, 0x040207f6, 0x42028800, 0x000007fe, + 0x0401f006, 0x42028800, 0x000007fc, 0x0401f003, + 0x42028800, 0x000007fd, 0x58a24002, 0x58a0b001, + 0x58a18800, 0x589d3006, 0x589d2805, 0x589d2004, + 0x589d1803, 0x589d1002, 0x589d0801, 0x589d0000, + 0x829d3c00, 0x0000000c, 0x589d4000, 0x809d3800, + 0x1c01f000, 0x486bc857, 0x0401ff4f, 0x1c01f000, + 0x00000000, 0x00000001, 0x00000002, 0x00000003, + 0x00000004, 0x00000005, 0x00000006, 0x00000007, + 0x00000008, 0x00000009, 0x0000000a, 0x0000000b, + 0x0000000c, 0x0000000d, 0x0000000e, 0x0000000f, + 0x9829698a, 0x02800004, 0x00000000, 0x0000c000, + 0x0000093b, 0x073fca5a, 0x0705a5a5, 0x01928009, + 0x070ff0e1, 0x03800006, 0x053f2aaa, 0x070aaaaa, + 0x073f3aaa, 0x070aaaaa, 0x05958014, 0x05308000, + 0x05008000, 0x0600902f, 0x06a006b3, 0x0202f051, + 0x042e4020, 0x008f02b0, 0x033e5000, 0x03020000, + 0x078d0024, 0x069305c2, 0x029205c4, 0x050fb056, + 0x040010e6, 0x002fb008, 0x060ff0e6, 0x00580401, + 0x054880ff, 0x07810022, 0x018c0412, 0x018a0411, + 0x058b040f, 0x079f0028, 0x0098085b, 0x079f0028, + 0x05990859, 0x058e8014, 0x0678aae5, 0x06000051, + 0x068181ce, 0x079a0014, 0x022a5001, 0x030430d4, + 0x06780043, 0x030e0000, 0x030450ff, 0x06780043, + 0x03019000, 0x02a1820b, 0x078187f0, 0x027c0045, + 0x03020000, 0x058180fc, 0x05908039, 0x019107ee, + 0x010410a6, 0x072d6000, 0x05601041, 0x050f80ff, + 0x032fa071, 0x070ff0d1, 0x055c0403, 0x034a88ff, + 0x06818808, 0x038000f0, 0x07480000, 0x058107fa, + 0x05481000, 0x05818050, 0x06780043, 0x070000f0, + 0x0681005b, 0x037c00ff, 0x06000010, 0x078187f6, + 0x0280005b, 0x06780043, 0x070000f0, 0x037c00ff, + 0x07000030, 0x0681005b, 0x06780043, 0x070000f0, + 0x037c00ff, 0x06000020, 0x0681005b, 0x018007f6, + 0x0379ff00, 0x070fffff, 0x06780043, 0x07f00000, + 0x075a0000, 0x020ef001, 0x008607f8, 0x05484000, + 0x03a1822e, 0x03680c00, 0x07818822, 0x062d6002, + 0x002fb001, 0x070ff069, 0x00868070, 0x060ff079, + 0x055c0441, 0x07810014, 0x012fb000, 0x060560fb, + 0x02800076, 0x060ff079, 0x03868209, 0x070ff069, + 0x055c0441, 0x07810014, 0x060560fb, 0x070ff0d1, + 0x062d6001, 0x055c040c, 0x058180d7, 0x070ff0d1, + 0x045c040d, 0x054b08ff, 0x058180e1, 0x0007b001, + 0x03079041, 0x0307a000, 0x07489000, 0x07818103, + 0x068d0083, 0x0207c004, 0x0107d005, 0x0107e006, + 0x0207f007, 0x02080008, 0x01081009, 0x0108200a, + 0x0208300b, 0x0186809a, 0x0448d07a, 0x0581809a, + 0x0448b07a, 0x04810801, 0x0049707a, 0x0581809a, + 0x04604679, 0x050f80ff, 0x053fa809, 0x06000001, + 0x01680703, 0x076c0303, 0x06818801, 0x072d5003, + 0x0049107a, 0x068100a4, 0x070ff00a, 0x0054040b, + 0x058280a3, 0x078d00a0, 0x0008200b, 0x032ff000, + 0x010770ff, 0x0108400c, 0x0208500d, 0x0678007a, + 0x06000008, 0x078100b7, 0x078d00a9, 0x04603e79, + 0x050f80ff, 0x073fa041, 0x0600004a, 0x0049707a, + 0x02a188b9, 0x068d00b0, 0x0678007a, 0x07f00000, + 0x010880ff, 0x02386008, 0x03010000, 0x038000bd, + 0x078d00b7, 0x0678007a, 0x07f00000, 0x010880ff, + 0x03386000, 0x03010000, 0x072e6300, 0x020ef07f, + 0x03860014, 0x070ff07d, 0x0450047c, 0x050f80ff, + 0x002fa819, 0x068d00c4, 0x02080001, 0x00081002, + 0x0678007a, 0x05000200, 0x078100cc, 0x0049107a, + 0x03a18227, 0x01082003, 0x068d00cd, 0x0448b07a, + 0x068100d3, 0x0338600c, 0x03010000, 0x028000d5, + 0x02386004, 0x03010000, 0x072e6c00, 0x03800014, + 0x062d6001, 0x07f00000, 0x07f00000, 0x0400e0d0, + 0x0648300e, 0x0681007a, 0x072e500c, 0x00208001, + 0x07a006b8, 0x03800014, 0x06780043, 0x070000f0, + 0x05810803, 0x050020ff, 0x027c0002, 0x06000010, + 0x068100ec, 0x027c0002, 0x07000030, 0x068100ec, + 0x01800803, 0x0500d0d1, 0x0279ff0d, 0x070000ff, + 0x0380007e, 0x020ef002, 0x018607e8, 0x04602602, + 0x050f80ff, 0x053fa809, 0x06000008, 0x060ff0d0, + 0x055c0411, 0x0179feff, 0x0700ffff, 0x078187e8, + 0x02800045, 0x027c0045, 0x03040000, 0x0581010c, + 0x027c0045, 0x03080000, 0x058107ee, 0x03800039, + 0x06600a79, 0x050f80ff, 0x053fa80a, 0x06000010, + 0x02800083, 0x05601041, 0x050f80ff, 0x032fa071, + 0x02800045, 0x0204a051, 0x06780043, 0x070000f0, + 0x037c00ff, 0x06000010, 0x068181bf, 0x072d6000, + 0x029487ea, 0x050fb056, 0x044880e6, 0x05818014, + 0x060ff0d0, 0x0179feff, 0x0700ffff, 0x057dfeff, + 0x0700ffff, 0x058107e8, 0x053f2000, 0x07030000, + 0x019d8014, 0x070ff093, 0x045a0201, 0x070ff093, + 0x045c0401, 0x06818120, 0x02046092, 0x04002046, + 0x060ff002, 0x045c0401, 0x0703a0ff, 0x04600202, + 0x00540401, 0x0782812e, 0x04500425, 0x070060ff, + 0x0730ffff, 0x0700000f, 0x0742000f, 0x04810201, + 0x04a007d0, 0x0648a002, 0x06818131, 0x00047089, + 0x070ff047, 0x045c0443, 0x077800ff, 0x07f00000, + 0x078181ff, 0x07780047, 0x0500e000, 0x078187d7, + 0x070ff006, 0x00860164, 0x0179fe47, 0x0700000f, + 0x010480ff, 0x056c7048, 0x0681814a, 0x007a0d4a, + 0x04003801, 0x0220f001, 0x00800157, 0x07608e48, + 0x034a60ff, 0x0700f0ff, 0x074b88ff, 0x037000ff, + 0x07000600, 0x05500448, 0x074d00ff, 0x045a044a, + 0x0304a0ff, 0x070ff00f, 0x01540406, 0x04820164, + 0x0595016c, 0x05a0024e, 0x0386816f, 0x06780043, + 0x070000f0, 0x037c00ff, 0x07000030, 0x0581016a, + 0x0134bfff, 0x070fffff, 0x0104102e, 0x050fd041, + 0x01800178, 0x0595016a, 0x05a0024e, 0x0186016a, + 0x0202f00e, 0x052e4030, 0x040fd02f, 0x04a002ad, + 0x03800014, 0x0400e02f, 0x042e4020, 0x0202f051, + 0x0004100e, 0x0004b00e, 0x004980e5, 0x07818178, + 0x06780043, 0x070000f0, 0x037c00ff, 0x07000030, + 0x0481081f, 0x024a6c46, 0x04500423, 0x050070ff, + 0x03620024, 0x050080ff, 0x04004046, 0x0700500f, + 0x03206000, 0x05601048, 0x0700a0ff, 0x0700900a, + 0x070ff005, 0x04500446, 0x00540425, 0x048201ab, + 0x07601822, 0x050f80ff, 0x063fa032, 0x06000002, + 0x03203000, 0x01204000, 0x03205000, 0x0120b000, + 0x0320c000, 0x07601841, 0x050f80ff, 0x043fa852, + 0x06000001, 0x070ff056, 0x056c02ff, 0x050fb0ff, + 0x070560ff, 0x03079041, 0x05601041, 0x050f80ff, + 0x073fa011, 0x0600003d, 0x06780043, 0x07f00000, + 0x065a007a, 0x010880ff, 0x033e5000, 0x05002000, + 0x05a00247, 0x048d01a4, 0x0208a04a, 0x0108b04b, + 0x02386001, 0x03010000, 0x072e6300, 0x038000be, + 0x0500d00a, 0x05500405, 0x014a68ff, 0x070090ff, + 0x0154040a, 0x0700c0ff, 0x0600a023, 0x0500b024, + 0x02206001, 0x07601822, 0x050f80ff, 0x063fa04a, + 0x06000002, 0x07f00000, 0x07601222, 0x050f80ff, + 0x043fa819, 0x06000001, 0x0600a00d, 0x0180018e, + 0x06780043, 0x070000f0, 0x050010ff, 0x027c0001, + 0x07000030, 0x058101c9, 0x027c0001, 0x06000020, + 0x058107de, 0x018007f6, 0x0548e0e4, 0x058107de, + 0x0334a000, 0x03080000, 0x01800112, 0x074860ff, + 0x068181ea, 0x054880ff, 0x07810014, 0x070ff056, + 0x050fb0ff, 0x044880e5, 0x048101d9, 0x044880e6, + 0x05818014, 0x008001df, 0x056c02ff, 0x050fb0ff, + 0x070560ff, 0x072e5300, 0x044880e6, 0x05818014, + 0x072d5003, 0x06780043, 0x07f00000, 0x010880ff, + 0x048d01e3, 0x03386005, 0x03010000, 0x033e6000, + 0x0700000c, 0x052e5200, 0x03800014, 0x079a0014, + 0x05301fff, 0x0700000f, 0x06420001, 0x04810201, + 0x04a007d0, 0x0648a002, 0x078181ed, 0x062e5080, + 0x04001089, 0x040fd002, 0x040fd001, 0x02499001, + 0x04810220, 0x070ff0d4, 0x050fd0ff, 0x045c0401, + 0x077800ff, 0x07f00000, 0x06818220, 0x03800014, + 0x012091ff, 0x038006bb, 0x00209201, 0x038006bb, + 0x01209203, 0x038006bb, 0x03209000, 0x038006bb, + 0x00209207, 0x038006bb, 0x01209209, 0x038006bb, + 0x06780043, 0x07009000, 0x06818216, 0x00498043, + 0x04810216, 0x0648a0e5, 0x05810217, 0x027c0045, + 0x03040000, 0x04810219, 0x075c00ff, 0x07c00000, + 0x056a02ff, 0x00800216, 0x00800215, 0x06780075, + 0x06000c07, 0x04810720, 0x0020921a, 0x070fc0ff, + 0x07a006a6, 0x070fc0ff, 0x05308000, 0x0700a000, + 0x07a006b8, 0x033e5000, 0x0700000c, 0x03800014, + 0x070ff003, 0x01540477, 0x0682822c, 0x07003077, + 0x060ff051, 0x010770ff, 0x07c00000, 0x04602001, + 0x050f80ff, 0x063fa029, 0x06000008, 0x02015010, + 0x02016051, 0x00017051, 0x00011051, 0x07601e41, + 0x050f80ff, 0x053fa83a, 0x06000008, 0x07f00000, + 0x05601041, 0x050f80ff, 0x01464000, 0x032fa00a, + 0x05007011, 0x05008012, 0x06009013, 0x0700a014, + 0x0400b015, 0x0600c016, 0x0500d017, 0x07c00000, + 0x072d5003, 0x06601879, 0x050f80ff, 0x048d024a, + 0x063fa051, 0x0600003e, 0x07c00000, 0x06005051, + 0x0400e02c, 0x0660060e, 0x050f80ff, 0x032fa009, + 0x0379ff00, 0x070000ff, 0x076c0000, 0x04810270, + 0x0660600e, 0x0500e0ff, 0x034000ff, 0x01540427, + 0x0582029a, 0x03400005, 0x070ff005, 0x055c0428, + 0x0581029c, 0x056c0805, 0x07818250, 0x040f8029, + 0x053fa809, 0x07000024, 0x07f00000, 0x06600649, 0x050f80ff, 0x032fa009, 0x0379ff00, 0x070000ff, - 0x076c0000, 0x04810270, 0x0660600e, 0x0500e0ff, - 0x034000ff, 0x01540427, 0x0582029a, 0x03400005, - 0x070ff005, 0x055c0428, 0x0581029c, 0x056c0805, - 0x07818250, 0x040f8029, 0x053fa809, 0x07000024, - 0x07f00000, 0x06600649, 0x050f80ff, 0x032fa009, - 0x0379ff00, 0x070000ff, 0x076c0000, 0x07818250, - 0x05a002a0, 0x0400e049, 0x01800271, 0x05a002a0, - 0x072d6000, 0x0460040e, 0x050f80ff, 0x0004d0d0, - 0x0379ff4d, 0x0700ffff, 0x0104e0d1, 0x0379ff4e, - 0x0700ffff, 0x062d6002, 0x032fa009, 0x0204f0d0, - 0x064b004f, 0x07780000, 0x07ffff00, 0x045a044f, - 0x070000ff, 0x00201008, 0x04002051, 0x06003051, - 0x01204000, 0x07305000, 0x07000060, 0x03206009, - 0x05007022, 0x0460040e, 0x050f80ff, 0x032fa042, - 0x07f00000, 0x0460520e, 0x050f80ff, 0x053fa812, - 0x06000026, 0x050010d1, 0x0660360e, 0x050f80ff, - 0x012fa80a, 0x060ff00e, 0x055c042e, 0x0481029e, - 0x07c00000, 0x0400e026, 0x0180025c, 0x0500e02e, - 0x01800271, 0x0400e051, 0x01800299, 0x0340002d, - 0x050f802b, 0x053fa80a, 0x06000016, 0x07f00000, - 0x0660600e, 0x0302c0ff, 0x034000ff, 0x01540427, - 0x048202ab, 0x07c00000, 0x0202c026, 0x018002aa, - 0x053f2000, 0x03020000, 0x07c00000, 0x022a5002, - 0x077800e4, 0x07000005, 0x058183ff, 0x010440d7, - 0x0678aae5, 0x06000051, 0x03a1881b, 0x079082b8, - 0x02910337, 0x030400a6, 0x04600e40, 0x050f80ff, - 0x022fa029, 0x07f00000, 0x074b0000, 0x076c0600, - 0x05818339, 0x060ff002, 0x01580403, 0x07810360, - 0x070ff044, 0x045c0404, 0x034a88ff, 0x0481833b, - 0x0349f044, 0x04818362, 0x02495001, 0x0481833d, - 0x030100d8, 0x062da001, 0x0149e044, 0x058102d8, - 0x038f82d1, 0x0700f0d7, 0x062da001, 0x0778000f, - 0x07a00000, 0x00a18352, 0x068182e9, 0x06480001, - 0x06810308, 0x0448e001, 0x058102ee, 0x00491001, - 0x0581834d, 0x06005010, 0x05780105, 0x07ffff00, - 0x06006051, 0x04600e02, 0x050f80ff, 0x053fa812, - 0x06000002, 0x0245f040, 0x058402e7, 0x020e0040, - 0x053f2000, 0x05008000, 0x07930017, 0x03920017, - 0x03800014, 0x060ff079, 0x045c0440, 0x068182f2, - 0x0644f07a, 0x002fb008, 0x060ff079, 0x045c0440, - 0x068182f7, 0x0644f07a, 0x002fb008, 0x0644f001, - 0x06489001, 0x058102ff, 0x04600440, 0x050f80ff, - 0x073fa00a, 0x06000008, 0x05a0081b, 0x054b0800, - 0x04002001, 0x05001000, 0x03200003, 0x06600c40, - 0x050f80ff, 0x022fa01a, 0x008002e9, 0x020ef002, - 0x0286032a, 0x04600840, 0x050f80ff, 0x053fa809, - 0x06000002, 0x05780105, 0x00800440, 0x017c0105, - 0x05000400, 0x0481832a, 0x04602002, 0x050f80ff, - 0x053fa809, 0x06000002, 0x07f00000, 0x06602e40, - 0x050f80ff, 0x070ff005, 0x053fa809, 0x06000002, - 0x055c0405, 0x0481832a, 0x06005010, 0x05780105, - 0x07ffff00, 0x06006051, 0x04600e02, 0x050f80ff, - 0x053fa812, 0x06000002, 0x007a0140, 0x07c00000, - 0x018002e7, 0x0644f001, 0x04601040, 0x050f80ff, - 0x012fa80a, 0x05308000, 0x03040000, 0x04600440, - 0x050f80ff, 0x073fa00a, 0x06000008, 0x06009040, - 0x06a006b3, 0x008002e9, 0x02209002, 0x028003ea, - 0x03209000, 0x028003ea, 0x02209004, 0x028003ea, - 0x05a00409, 0x062da001, 0x0149e044, 0x07810348, - 0x018f8341, 0x0700f0d7, 0x062da001, 0x0778000f, - 0x07a00000, 0x00a18352, 0x068182e9, 0x05308000, - 0x05002000, 0x06009040, 0x06a006b3, 0x008002e9, - 0x05308000, 0x05004000, 0x06009040, 0x06a006b3, - 0x008002e9, 0x0700600f, 0x0379ff06, 0x0700ffff, - 0x05602603, 0x050f80ff, 0x053fa809, 0x06000008, - 0x0179fe11, 0x0700ffff, 0x055c0406, 0x0481835e, - 0x07c00000, 0x056a02ff, 0x0280035d, 0x02209008, - 0x028003ea, 0x053f2000, 0x05008000, 0x02495001, - 0x058183c9, 0x012f200c, 0x019d8366, 0x04600840, - 0x050f80ff, 0x053fa809, 0x07000003, 0x0721f000, - 0x0249f007, 0x06810370, 0x0245f01f, 0x06000002, - 0x05601600, 0x050f80ff, 0x012fa809, 0x06480001, - 0x078103c9, 0x04481001, 0x058183c9, 0x06602840, - 0x050f80ff, 0x012fa809, 0x020ef001, 0x018683c9, - 0x079c03c9, 0x070050d8, 0x062da001, 0x06306002, - 0x05000430, 0x04600440, 0x050f80ff, 0x053fa812, - 0x06000002, 0x008f8386, 0x050040d8, 0x062da001, - 0x0149e044, 0x06810392, 0x018f838b, 0x0700f0d7, + 0x076c0000, 0x07818250, 0x05a002a0, 0x0400e049, + 0x01800271, 0x05a002a0, 0x072d6000, 0x0460040e, + 0x050f80ff, 0x0004d0d0, 0x0379ff4d, 0x0700ffff, + 0x0104e0d1, 0x0379ff4e, 0x0700ffff, 0x062d6002, + 0x032fa009, 0x0204f0d0, 0x064b004f, 0x07780000, + 0x07ffff00, 0x045a044f, 0x070000ff, 0x00201008, + 0x04002051, 0x06003051, 0x01204000, 0x07305000, + 0x07000060, 0x03206009, 0x05007022, 0x0460040e, + 0x050f80ff, 0x032fa042, 0x07f00000, 0x0460520e, + 0x050f80ff, 0x053fa812, 0x06000026, 0x050010d1, + 0x0660360e, 0x050f80ff, 0x012fa80a, 0x060ff00e, + 0x055c042e, 0x0481029e, 0x07c00000, 0x0400e026, + 0x0180025c, 0x0500e02e, 0x01800271, 0x0400e051, + 0x01800299, 0x0340002d, 0x050f802b, 0x053fa80a, + 0x06000016, 0x07f00000, 0x0660600e, 0x0302c0ff, + 0x034000ff, 0x01540427, 0x048202ab, 0x07c00000, + 0x0202c026, 0x018002aa, 0x053f2000, 0x03020000, + 0x07c00000, 0x022a5002, 0x077800e4, 0x07000005, + 0x058183ff, 0x010440d7, 0x0678aae5, 0x06000051, + 0x03a1881b, 0x079082b8, 0x02910337, 0x030400a6, + 0x04600e40, 0x050f80ff, 0x022fa029, 0x07f00000, + 0x074b0000, 0x076c0600, 0x05818339, 0x060ff002, + 0x01580403, 0x07810360, 0x070ff044, 0x045c0404, + 0x034a88ff, 0x0481833b, 0x0349f044, 0x04818362, + 0x02495001, 0x0481833d, 0x030100d8, 0x062da001, + 0x0149e044, 0x058102d8, 0x038f82d1, 0x0700f0d7, 0x062da001, 0x0778000f, 0x07a00000, 0x00a18352, - 0x058183c3, 0x05602000, 0x050f80ff, 0x073fa009, - 0x06000001, 0x060ff004, 0x00540402, 0x068203c7, - 0x06005051, 0x06006051, 0x04602640, 0x050f80ff, - 0x063fa01a, 0x06000002, 0x07f00000, 0x06600a40, - 0x050f80ff, 0x073fa00a, 0x07000003, 0x04487007, - 0x078103b1, 0x060ff002, 0x00540404, 0x058283b1, - 0x002f2008, 0x05308000, 0x07005000, 0x06009040, - 0x06a006b3, 0x04008004, 0x07a006b8, 0x03800017, - 0x06780007, 0x02800040, 0x058183c0, 0x0079c107, - 0x07ffffff, 0x007a0b07, 0x03800000, 0x04780104, - 0x07ffff00, 0x068103bc, 0x02455007, 0x04600840, - 0x050f80ff, 0x053fa80a, 0x07000003, 0x060ff040, - 0x045a041f, 0x030e30ff, 0x002f2008, 0x07930017, - 0x03920017, 0x03800014, 0x04004002, 0x03800399, - 0x002f2008, 0x05a00409, 0x062da001, 0x07f00000, - 0x008f83cd, 0x030100d8, 0x062da001, 0x0149e044, - 0x068103d9, 0x018f83d2, 0x0700f0d7, 0x062da001, - 0x0778000f, 0x07a00000, 0x00a18352, 0x05818017, - 0x05308000, 0x07005000, 0x06009040, 0x06a006b3, - 0x04008010, 0x07a006b8, 0x03800017, 0x05602603, - 0x050f80ff, 0x053fa809, 0x06000008, 0x07780044, - 0x073f0000, 0x055c0411, 0x077800ff, 0x07ff0000, - 0x07c00000, 0x050fd009, 0x040fd040, 0x053f2000, - 0x05008000, 0x05308000, 0x03013000, 0x06a006b3, - 0x010440d7, 0x0349f044, 0x068103f7, 0x062da001, - 0x028f03f7, 0x03e00000, 0x062da001, 0x0149e044, - 0x07810017, 0x038f03fc, 0x03e00000, 0x0700f0d7, - 0x062da001, 0x03800017, 0x059083ff, 0x0249c0e5, - 0x07810017, 0x062da001, 0x07f00000, 0x07f00000, - 0x033e5000, 0x070c0000, 0x008f0402, 0x02800015, - 0x050020d8, 0x04600440, 0x050f80ff, 0x073fa00a, - 0x06000001, 0x07c00000, 0x002fb001, 0x01800412, - 0x012fb000, 0x03075087, 0x048d0413, 0x03386000, - 0x03020000, 0x04482075, 0x048104b6, 0x0648a0e6, - 0x05810463, 0x0642007f, 0x04810461, 0x0340007e, - 0x060ff038, 0x0154047e, 0x00d00451, 0x0560027d, - 0x050f80ff, 0x032fa009, 0x030ef000, 0x0186071b, - 0x0107d000, 0x07600a00, 0x050f80ff, 0x032fa009, - 0x03681e00, 0x076c14ff, 0x0681842f, 0x0007e038, - 0x0727c006, 0x01800435, 0x03681e00, 0x04500420, - 0x050f80ff, 0x073fa009, 0x0700003f, 0x0180041d, - 0x070ff07d, 0x0450047c, 0x050f80ff, 0x002fa819, - 0x058d0439, 0x02080001, 0x00081002, 0x0678007a, - 0x05000200, 0x05810441, 0x0049107a, 0x03a18227, - 0x01082003, 0x058d0442, 0x0448b07a, 0x0681844a, - 0x0249007a, 0x0581044d, 0x07780003, 0x03800000, - 0x0581044d, 0x0338600c, 0x03010000, 0x0080044f, - 0x02386004, 0x03010000, 0x072e6c00, 0x008004b6, - 0x00800457, 0x01800459, 0x0080045b, 0x0080045d, - 0x0180045f, 0x00800420, 0x0727c006, 0x01800435, - 0x0727c009, 0x01800435, 0x0727c00c, 0x01800435, - 0x0727c00f, 0x01800435, 0x0727c012, 0x01800435, - 0x052e6800, 0x008004b6, 0x044880e6, 0x05810750, - 0x070ff088, 0x0179feff, 0x070fffff, 0x00a186f4, - 0x048186e9, 0x0249607a, 0x06818719, 0x060ff083, - 0x02868719, 0x013e6200, 0x07000003, 0x0448b07a, - 0x04810486, 0x0049707a, 0x06818486, 0x04604679, - 0x050f80ff, 0x032fa009, 0x03680600, 0x076c00ff, - 0x06818486, 0x06604879, 0x050f80ff, 0x032fa009, - 0x07f00000, 0x074b0000, 0x070ff000, 0x048d0480, - 0x05001099, 0x064b0001, 0x045c0401, 0x04810486, - 0x0245a07a, 0x048d0486, 0x018c0412, 0x0279127a, - 0x01040222, 0x016d02ff, 0x078184e8, 0x00798075, - 0x0700f50f, 0x078184e8, 0x06483075, 0x058104e8, - 0x04602679, 0x050f80ff, 0x053fa812, 0x07000041, - 0x058d0495, 0x004940e6, 0x0581049a, 0x072e6300, - 0x03800014, 0x0049707a, 0x0481049e, 0x0049807a, - 0x07810014, 0x02386001, 0x07030000, 0x0648f07a, - 0x058104b4, 0x04600479, 0x050f80ff, 0x053fa809, - 0x06000002, 0x05780105, 0x07ffff00, 0x06006051, + 0x068182e9, 0x06480001, 0x06810308, 0x0448e001, + 0x058102ee, 0x00491001, 0x0581834d, 0x06005010, + 0x05780105, 0x07ffff00, 0x06006051, 0x04600e02, + 0x050f80ff, 0x053fa812, 0x06000002, 0x0245f040, + 0x058402e7, 0x020e0040, 0x053f2000, 0x05008000, + 0x07930017, 0x03920017, 0x03800014, 0x060ff079, + 0x045c0440, 0x068182f2, 0x0644f07a, 0x002fb008, + 0x060ff079, 0x045c0440, 0x068182f7, 0x0644f07a, + 0x002fb008, 0x0644f001, 0x06489001, 0x058102ff, + 0x04600440, 0x050f80ff, 0x073fa00a, 0x06000008, + 0x05a0081b, 0x054b0800, 0x04002001, 0x05001000, + 0x03200003, 0x06600c40, 0x050f80ff, 0x022fa01a, + 0x008002e9, 0x020ef002, 0x0286032a, 0x04600840, + 0x050f80ff, 0x053fa809, 0x06000002, 0x05780105, + 0x00800440, 0x017c0105, 0x05000400, 0x0481832a, + 0x04602002, 0x050f80ff, 0x053fa809, 0x06000002, + 0x07f00000, 0x06602e40, 0x050f80ff, 0x070ff005, + 0x053fa809, 0x06000002, 0x055c0405, 0x0481832a, + 0x06005010, 0x05780105, 0x07ffff00, 0x06006051, + 0x04600e02, 0x050f80ff, 0x053fa812, 0x06000002, + 0x007a0140, 0x07c00000, 0x018002e7, 0x0644f001, + 0x04601040, 0x050f80ff, 0x012fa80a, 0x05308000, + 0x03040000, 0x04600440, 0x050f80ff, 0x073fa00a, + 0x06000008, 0x06009040, 0x06a006b3, 0x008002e9, + 0x02209002, 0x028003ea, 0x03209000, 0x028003ea, + 0x02209004, 0x028003ea, 0x05a00409, 0x062da001, + 0x0149e044, 0x07810348, 0x018f8341, 0x0700f0d7, + 0x062da001, 0x0778000f, 0x07a00000, 0x00a18352, + 0x068182e9, 0x05308000, 0x05002000, 0x06009040, + 0x06a006b3, 0x008002e9, 0x05308000, 0x05004000, + 0x06009040, 0x06a006b3, 0x008002e9, 0x0700600f, + 0x0379ff06, 0x0700ffff, 0x05602603, 0x050f80ff, + 0x053fa809, 0x06000008, 0x0179fe11, 0x0700ffff, + 0x055c0406, 0x0481835e, 0x07c00000, 0x056a02ff, + 0x0280035d, 0x02209008, 0x028003ea, 0x053f2000, + 0x05008000, 0x02495001, 0x058183c9, 0x012f200c, + 0x019d8366, 0x04600840, 0x050f80ff, 0x053fa809, + 0x07000003, 0x0721f000, 0x0249f007, 0x06810370, + 0x0245f01f, 0x06000002, 0x05601600, 0x050f80ff, + 0x012fa809, 0x06480001, 0x078103c9, 0x04481001, + 0x058183c9, 0x06602840, 0x050f80ff, 0x012fa809, + 0x020ef001, 0x018683c9, 0x079c03c9, 0x070050d8, + 0x062da001, 0x06306002, 0x05000430, 0x04600440, + 0x050f80ff, 0x053fa812, 0x06000002, 0x008f8386, + 0x050040d8, 0x062da001, 0x0149e044, 0x06810392, + 0x018f838b, 0x0700f0d7, 0x062da001, 0x0778000f, + 0x07a00000, 0x00a18352, 0x058183c3, 0x05602000, + 0x050f80ff, 0x073fa009, 0x06000001, 0x060ff004, + 0x00540402, 0x068203c7, 0x06005051, 0x06006051, + 0x04602640, 0x050f80ff, 0x063fa01a, 0x06000002, + 0x07f00000, 0x06600a40, 0x050f80ff, 0x073fa00a, + 0x07000003, 0x04487007, 0x078103b1, 0x060ff002, + 0x00540404, 0x058283b1, 0x002f2008, 0x05308000, + 0x07005000, 0x06009040, 0x06a006b3, 0x04008004, + 0x07a006b8, 0x03800017, 0x06780007, 0x02800040, + 0x058183c0, 0x0079c107, 0x07ffffff, 0x007a0b07, + 0x03800000, 0x04780104, 0x07ffff00, 0x068103bc, + 0x02455007, 0x04600840, 0x050f80ff, 0x053fa80a, + 0x07000003, 0x060ff040, 0x045a041f, 0x030e30ff, + 0x002f2008, 0x07930017, 0x03920017, 0x03800014, + 0x04004002, 0x03800399, 0x002f2008, 0x05a00409, + 0x062da001, 0x07f00000, 0x008f83cd, 0x030100d8, + 0x062da001, 0x0149e044, 0x068103d9, 0x018f83d2, + 0x0700f0d7, 0x062da001, 0x0778000f, 0x07a00000, + 0x00a18352, 0x05818017, 0x05308000, 0x07005000, + 0x06009040, 0x06a006b3, 0x04008010, 0x07a006b8, + 0x03800017, 0x05602603, 0x050f80ff, 0x053fa809, + 0x06000008, 0x07780044, 0x073f0000, 0x055c0411, + 0x077800ff, 0x07ff0000, 0x07c00000, 0x050fd009, + 0x040fd040, 0x053f2000, 0x05008000, 0x05308000, + 0x03013000, 0x06a006b3, 0x010440d7, 0x0349f044, + 0x068103f7, 0x062da001, 0x028f03f7, 0x03e00000, + 0x062da001, 0x0149e044, 0x07810017, 0x038f03fc, + 0x03e00000, 0x0700f0d7, 0x062da001, 0x03800017, + 0x059083ff, 0x0249c0e5, 0x07810017, 0x062da001, + 0x07f00000, 0x07f00000, 0x033e5000, 0x070c0000, + 0x008f0402, 0x02800015, 0x050020d8, 0x04600440, + 0x050f80ff, 0x073fa00a, 0x06000001, 0x07c00000, + 0x002fb001, 0x01800412, 0x012fb000, 0x03075087, + 0x048d0413, 0x03386000, 0x03020000, 0x04482075, + 0x048104b6, 0x0648a0e6, 0x05810463, 0x0642007f, + 0x04810461, 0x0340007e, 0x060ff038, 0x0154047e, + 0x00d00451, 0x0560027d, 0x050f80ff, 0x032fa009, + 0x030ef000, 0x0186071b, 0x0107d000, 0x07600a00, + 0x050f80ff, 0x032fa009, 0x03681e00, 0x076c14ff, + 0x0681842f, 0x0007e038, 0x0727c006, 0x01800435, + 0x03681e00, 0x04500420, 0x050f80ff, 0x073fa009, + 0x0700003f, 0x0180041d, 0x070ff07d, 0x0450047c, + 0x050f80ff, 0x002fa819, 0x058d0439, 0x02080001, + 0x00081002, 0x0678007a, 0x05000200, 0x05810441, + 0x0049107a, 0x03a18227, 0x01082003, 0x058d0442, + 0x0448b07a, 0x0681844a, 0x0249007a, 0x0581044d, + 0x07780003, 0x03800000, 0x0581044d, 0x0338600c, + 0x03010000, 0x0080044f, 0x02386004, 0x03010000, + 0x072e6c00, 0x008004b6, 0x00800457, 0x01800459, + 0x0080045b, 0x0080045d, 0x0180045f, 0x00800420, + 0x0727c006, 0x01800435, 0x0727c009, 0x01800435, + 0x0727c00c, 0x01800435, 0x0727c00f, 0x01800435, + 0x0727c012, 0x01800435, 0x052e6800, 0x008004b6, + 0x044880e6, 0x05810750, 0x070ff088, 0x0179feff, + 0x070fffff, 0x00a186f4, 0x048186e9, 0x0249607a, + 0x06818719, 0x060ff083, 0x02868719, 0x013e6200, + 0x07000003, 0x0448b07a, 0x04810486, 0x0049707a, + 0x06818486, 0x04604679, 0x050f80ff, 0x032fa009, + 0x03680600, 0x076c00ff, 0x06818486, 0x06604879, + 0x050f80ff, 0x032fa009, 0x07f00000, 0x074b0000, + 0x070ff000, 0x048d0480, 0x05001099, 0x064b0001, + 0x045c0401, 0x04810486, 0x0245a07a, 0x048d0486, + 0x018c0412, 0x0279127a, 0x01040222, 0x016d02ff, + 0x078184e8, 0x00798075, 0x0700f50f, 0x078184e8, + 0x06483075, 0x058104e8, 0x04602679, 0x050f80ff, + 0x053fa812, 0x07000041, 0x058d0495, 0x004940e6, + 0x0581049a, 0x072e6300, 0x03800014, 0x0049707a, + 0x0481049e, 0x0049807a, 0x07810014, 0x02386001, + 0x07030000, 0x0648f07a, 0x058104b4, 0x04600479, + 0x050f80ff, 0x053fa809, 0x06000002, 0x05780105, + 0x07ffff00, 0x06006051, 0x05600e7b, 0x050f80ff, + 0x053fa812, 0x06000002, 0x0245f079, 0x048404ae, + 0x020e0079, 0x033e6a00, 0x0700aa0a, 0x02079051, + 0x03800014, 0x0444e07a, 0x03800555, 0x048d04b6, + 0x018c0412, 0x018004cf, 0x060ff0e6, 0x077800ff, + 0x07000050, 0x078184cf, 0x02799075, 0x0500fd0f, + 0x037c00ff, 0x04000808, 0x078184cf, 0x0049107a, + 0x078184cf, 0x06601879, 0x050f80ff, 0x063fa052, + 0x0600003e, 0x048d04c8, 0x02386001, 0x07030000, + 0x033e6a00, 0x0700aa0a, 0x02079051, 0x03800014, + 0x0648c0e6, 0x078184ed, 0x0448e0e6, 0x048104e5, + 0x002094d3, 0x02490075, 0x06818220, 0x004920e6, + 0x048104e0, 0x05a00799, 0x05001088, 0x00700101, + 0x03100000, 0x00088001, 0x033e6000, 0x07000088, + 0x0080078a, 0x02386001, 0x07030000, 0x033e6000, + 0x06000008, 0x03800599, 0x02799075, 0x0700f50f, + 0x07810014, 0x06601879, 0x050080ff, 0x06309052, + 0x0600003e, 0x008004f1, 0x04602679, 0x050080ff, + 0x05309812, 0x07000041, 0x0648007a, 0x07810503, + 0x04488075, 0x05818503, 0x0678007a, 0x04000108, + 0x058104ff, 0x04603e79, 0x050f80ff, 0x058d04fa, + 0x073fa042, 0x0600004a, 0x048d04fd, 0x02086051, + 0x040f8008, 0x070fa009, 0x0049107a, 0x00a1859b, + 0x00798075, 0x0600f507, 0x06818737, 0x0448b075, + 0x0781050a, 0x02493075, 0x05810733, 0x004940e6, + 0x07810522, 0x02386001, 0x030e0000, 0x05001087, + 0x00494001, 0x07810514, 0x04780b01, 0x05004000, + 0x0681051f, 0x0249f076, 0x0681051a, 0x07a0091d, + 0x0647f076, 0x004940e6, 0x06810520, 0x03386000, + 0x030e0000, 0x033e6000, 0x0700c000, 0x03800014, + 0x04a008d6, 0x03386000, 0x030e0000, 0x0648c0e6, + 0x05818535, 0x078d0524, 0x02386001, 0x07030000, + 0x0049107a, 0x0781052b, 0x020ef083, 0x03860535, + 0x06483075, 0x06810597, 0x0678007a, 0x07000035, + 0x01a186a6, 0x05308000, 0x07060000, 0x06009079, + 0x06a006b3, 0x02800597, 0x06483075, 0x068106d0, + 0x068d0537, 0x02386001, 0x07030000, 0x0444e07a, + 0x0648307a, 0x0481856b, 0x0448707a, 0x06810592, + 0x0448107a, 0x04818592, 0x0648f07a, 0x07810555, + 0x07a006a6, 0x04008079, 0x07a006c5, 0x01868566, + 0x0049107a, 0x05818566, 0x04600408, 0x050f80ff, + 0x053fa809, 0x06000002, 0x05780105, 0x07ffff00, 0x05600e7b, 0x050f80ff, 0x053fa812, 0x06000002, - 0x0245f079, 0x048404ae, 0x020e0079, 0x033e6a00, - 0x0700aa0a, 0x02079051, 0x03800014, 0x0444e07a, - 0x03800555, 0x048d04b6, 0x018c0412, 0x018004cf, - 0x060ff0e6, 0x077800ff, 0x07000050, 0x078184cf, - 0x02799075, 0x0500fd0f, 0x037c00ff, 0x04000808, - 0x078184cf, 0x0049107a, 0x078184cf, 0x06601879, - 0x050f80ff, 0x063fa052, 0x0600003e, 0x048d04c8, - 0x02386001, 0x07030000, 0x033e6a00, 0x0700aa0a, - 0x02079051, 0x03800014, 0x0648c0e6, 0x078184ed, - 0x0448e0e6, 0x048104e5, 0x002094d3, 0x02490075, - 0x06818220, 0x004920e6, 0x048104e0, 0x05a00799, - 0x05001088, 0x00700101, 0x03100000, 0x00088001, - 0x033e6000, 0x07000088, 0x0080078a, 0x02386001, - 0x07030000, 0x033e6000, 0x06000008, 0x03800599, - 0x02799075, 0x0700f50f, 0x07810014, 0x06601879, - 0x050080ff, 0x06309052, 0x0600003e, 0x008004f1, - 0x04602679, 0x050080ff, 0x05309812, 0x07000041, - 0x0648007a, 0x07810503, 0x04488075, 0x05818503, - 0x0678007a, 0x04000108, 0x058104ff, 0x04603e79, - 0x050f80ff, 0x058d04fa, 0x073fa042, 0x0600004a, - 0x048d04fd, 0x02086051, 0x040f8008, 0x070fa009, - 0x0049107a, 0x00a1859b, 0x00798075, 0x0600f507, - 0x06818737, 0x0448b075, 0x0781050a, 0x02493075, - 0x05810733, 0x004940e6, 0x07810522, 0x02386001, - 0x030e0000, 0x05001087, 0x00494001, 0x07810514, - 0x04780b01, 0x05004000, 0x0681051f, 0x0249f076, - 0x0681051a, 0x07a0091d, 0x0647f076, 0x004940e6, - 0x06810520, 0x03386000, 0x030e0000, 0x033e6000, - 0x0700c000, 0x03800014, 0x04a008d6, 0x03386000, - 0x030e0000, 0x0648c0e6, 0x05818535, 0x078d0524, - 0x02386001, 0x07030000, 0x0049107a, 0x0781052b, - 0x020ef083, 0x03860535, 0x06483075, 0x06810597, - 0x0678007a, 0x07000035, 0x01a186a6, 0x05308000, - 0x07060000, 0x06009079, 0x06a006b3, 0x02800597, - 0x06483075, 0x068106d0, 0x068d0537, 0x02386001, - 0x07030000, 0x0444e07a, 0x0648307a, 0x0481856b, - 0x0448707a, 0x06810592, 0x0448107a, 0x04818592, - 0x0648f07a, 0x07810555, 0x07a006a6, 0x04008079, - 0x07a006c5, 0x01868566, 0x0049107a, 0x05818566, - 0x04600408, 0x050f80ff, 0x053fa809, 0x06000002, - 0x05780105, 0x07ffff00, 0x05600e7b, 0x050f80ff, - 0x053fa812, 0x06000002, 0x07a006af, 0x02800597, - 0x0760127b, 0x050f80ff, 0x032fa009, 0x0349c000, - 0x04818564, 0x04601079, 0x050f80ff, 0x073fa00a, - 0x0600003d, 0x07f00000, 0x06600a79, 0x050f80ff, - 0x053fa80a, 0x06000010, 0x02800597, 0x0046e07a, - 0x02800592, 0x06009008, 0x05308000, 0x05004000, - 0x06a006b3, 0x02800597, 0x0760187b, 0x050f80ff, - 0x032fa011, 0x070ff000, 0x04500401, 0x030460ff, - 0x060ff025, 0x00540446, 0x0682057f, 0x030460ff, - 0x052e40c0, 0x04092046, 0x0349a0e4, 0x0481857c, - 0x003e4080, 0x0700c000, 0x02800580, 0x003e4080, - 0x05008000, 0x02800580, 0x04092046, 0x070ff03a, - 0x01868584, 0x013e4000, 0x07000003, 0x04a002ad, - 0x06600679, 0x050f80ff, 0x00201007, 0x012fa80a, - 0x0046047a, 0x034630ff, 0x050020ff, 0x06003051, - 0x04601079, 0x050f80ff, 0x073fa012, 0x06000001, - 0x02800597, 0x07a006a6, 0x05308000, 0x03020000, - 0x06009079, 0x06a006b3, 0x033e6a00, 0x0700aa0a, - 0x02079051, 0x03800014, 0x06605679, 0x050f80ff, - 0x032fa009, 0x070ff000, 0x038605b4, 0x057dfeff, - 0x07ffffff, 0x078105b4, 0x050f8000, 0x012fa811, - 0x0079fe02, 0x070000ff, 0x077d66ff, 0x060000dc, - 0x058185b4, 0x060ff001, 0x008685b5, 0x064b0002, - 0x06420002, 0x060ff002, 0x05500400, 0x050f80ff, - 0x05004084, 0x073fa00a, 0x06000002, 0x07c00000, - 0x04600201, 0x050f80ff, 0x073fa009, 0x06000001, - 0x0079fe02, 0x070000ff, 0x077d72ff, 0x070000dd, - 0x058185b4, 0x064b0002, 0x06420002, 0x06000001, - 0x028005ae, 0x0605004c, 0x038005c6, 0x069305c2, - 0x07a006ac, 0x054bc450, 0x078105c9, 0x03d005ca, - 0x038005c9, 0x028005da, 0x028005dc, 0x02800668, - 0x0380067b, 0x028005e9, 0x028005dc, 0x02800632, - 0x028005da, 0x02800683, 0x0280067f, 0x028005da, - 0x02800686, 0x0280069b, 0x02800654, 0x028005da, - 0x028005da, 0x022095da, 0x038006bb, 0x073c3fff, - 0x0700000f, 0x0379ff50, 0x070fffff, 0x060ff079, - 0x055c0450, 0x07810678, 0x002fb008, 0x060ff079, - 0x055c0450, 0x07810677, 0x06a0069e, 0x02800670, - 0x0179fe50, 0x070fffff, 0x070050ff, 0x060ff079, - 0x055c0405, 0x078105f3, 0x002fb008, 0x060ff079, - 0x055c0405, 0x05818674, 0x073c3fff, 0x0700000f, - 0x070ff087, 0x017980ff, 0x0600f507, 0x04818602, - 0x02203040, 0x05002087, 0x0049d002, 0x04818602, - 0x002fb008, 0x07006087, 0x002fb008, 0x0149d006, - 0x0681062c, 0x06930607, 0x01257000, 0x052e4003, - 0x072e5030, 0x0304c050, 0x02400057, 0x06740057, - 0x06000004, 0x0682001a, 0x004940e6, 0x00a18910, - 0x0049107a, 0x00a1859b, 0x04002083, 0x07003084, - 0x04004085, 0x04602679, 0x050f80ff, 0x063fa01a, - 0x06000001, 0x07a006a6, 0x04a007a2, 0x033e6a00, - 0x0700aa0a, 0x062e5020, 0x04a007d0, 0x02798102, - 0x070000ff, 0x007c8002, 0x07000055, 0x06810629, - 0x072e50c0, 0x0648a002, 0x06810629, 0x078d0624, - 0x03386006, 0x03010000, 0x033e6000, 0x0700000c, - 0x003e4002, 0x07000a00, 0x03800599, 0x07420003, - 0x058185fa, 0x00798002, 0x0600f507, 0x04818602, - 0x0280060b, 0x07930639, 0x01257000, 0x073c3fff, - 0x0700000f, 0x052e4003, 0x072e5030, 0x0304c050, - 0x067800e6, 0x07000041, 0x0681063e, 0x04a007ab, - 0x04818649, 0x002fb008, 0x067800e6, 0x07000041, - 0x07810644, 0x04a007ab, 0x04818649, 0x062e5020, - 0x003e4002, 0x07000a00, 0x03e00000, 0x03800014, - 0x06740057, 0x07000018, 0x0682001a, 0x04a007a2, - 0x033e6a00, 0x0700aa0a, 0x002fb008, 0x04a007a2, - 0x033e6a00, 0x0700aa0a, 0x03800644, 0x0379ff50, - 0x070fffff, 0x060ff079, 0x055c0450, 0x0581865a, - 0x0245507a, 0x002fb008, 0x060ff079, 0x055c0450, - 0x0581865f, 0x0245507a, 0x002fb008, 0x05601050, - 0x050f80ff, 0x012fa809, 0x02455001, 0x05601050, - 0x050f80ff, 0x012fa80a, 0x03800671, 0x05958678, - 0x0179fe50, 0x070fffff, 0x045c042f, 0x05818678, - 0x0202f051, 0x042e4020, 0x03800671, 0x002fb008, - 0x003e4002, 0x07000a00, 0x0280001a, 0x05938677, - 0x062e5020, 0x042e4002, 0x002fb008, 0x013e4000, - 0x05000e00, 0x0280001a, 0x0179fe50, 0x070fffff, - 0x010210ff, 0x0280001a, 0x0179fe50, 0x070fffff, - 0x050340ff, 0x03800671, 0x023e5008, 0x05000800, - 0x0280001a, 0x0179fe50, 0x070fffff, 0x0102e0ff, - 0x05602c2e, 0x050f80ff, 0x05222000, 0x07223000, - 0x05224000, 0x07225000, 0x07226000, 0x05227000, - 0x05228000, 0x07229000, 0x0722a000, 0x0522b000, - 0x063fa051, 0x07000011, 0x0202c026, 0x0522d000, - 0x052e400c, 0x0280001a, 0x030430d4, 0x062e5008, - 0x018001d2, 0x05601050, 0x050f80ff, 0x032fa009, - 0x03460000, 0x038006a9, 0x0246007a, 0x0045207a, - 0x028006a7, 0x0246007a, 0x0600007a, 0x04601079, - 0x050f80ff, 0x032fa00a, 0x07c00000, 0x019286ac, - 0x070500e1, 0x07c00000, 0x0245f008, 0x068406b0, - 0x020e0008, 0x07c00000, 0x070ff009, 0x065a0008, - 0x068406b5, 0x020e0008, 0x07c00000, 0x078406b8, - 0x020e0008, 0x07c00000, 0x05308000, 0x0500d000, - 0x06a006b3, 0x07a006c0, 0x03800014, 0x052e4300, - 0x072e500c, 0x073c3fff, 0x0700000f, 0x07c00000, - 0x04602608, 0x050f80ff, 0x032fa011, 0x076a0000, - 0x048186ce, 0x066a0001, 0x068106ce, 0x06006051, - 0x07c00000, 0x02206001, 0x07c00000, 0x0678007a, - 0x06000020, 0x058186d8, 0x0049107a, 0x078106d8, - 0x073c3fff, 0x0700000f, 0x02800537, 0x040fd079, - 0x0648307a, 0x078106dd, 0x05a00812, 0x038006e2, - 0x07a006a3, 0x05308000, 0x05001000, 0x06009079, - 0x06a006b3, 0x078d06e2, 0x033e6a00, 0x0600aa0e, - 0x02079051, 0x03386006, 0x03010000, 0x03800014, - 0x052e6200, 0x0648307a, 0x078106ee, 0x05a00812, - 0x0080078a, 0x07a006a3, 0x05308000, 0x05001000, - 0x06009079, 0x06a006b3, 0x0080078a, 0x050010ff, - 0x0448b07a, 0x04810702, 0x0049107a, 0x04810702, - 0x078d06f9, 0x04604679, 0x050f80ff, 0x032fa009, - 0x03680600, 0x056c02ff, 0x06818702, 0x046c1001, - 0x04810704, 0x056a02ff, 0x07c00000, 0x04a00707, - 0x075c00ff, 0x07c00000, 0x048d0707, 0x060ff07c, - 0x070ff07d, 0x070ff07e, 0x060ff07f, 0x060ff080, - 0x070ff081, 0x070ff082, 0x060ff083, 0x070ff084, - 0x060ff085, 0x0338600c, 0x03010000, 0x038a8714, - 0x048d0715, 0x03386000, 0x03020000, 0x07c00000, - 0x052e6200, 0x018004e8, 0x0648307a, 0x06818207, - 0x07a006a6, 0x0120971b, 0x038006bb, 0x04002089, - 0x04780102, 0x07f00000, 0x05001088, 0x04740101, - 0x03100000, 0x04780101, 0x07f00000, 0x060ff002, - 0x045c0401, 0x07818735, 0x00088001, 0x033e6000, - 0x070000c0, 0x0220901a, 0x05308000, 0x01012000, - 0x06a006b3, 0x00800786, 0x01209733, 0x038006bb, - 0x01209735, 0x0180021e, 0x040fd075, 0x040fd07a, - 0x040fd079, 0x0648307a, 0x04810740, 0x06780075, - 0x06000007, 0x0781874b, 0x05a00812, 0x06486075, - 0x07818205, 0x02490075, 0x0681821a, 0x04487075, - 0x07818753, 0x0448b07a, 0x0481074a, 0x00492075, - 0x07818766, 0x0080075e, 0x05308000, 0x03010000, - 0x06009079, 0x06a006b3, 0x03800014, 0x0448e0e6, - 0x068184b6, 0x01800203, 0x0648307a, 0x06818786, - 0x004940e6, 0x00a18910, 0x05308000, 0x0500e000, - 0x06009079, 0x06a006b3, 0x04008089, 0x07a006b8, - 0x00800786, 0x07a006a3, 0x05308000, 0x0700f000, - 0x06009079, 0x07000088, 0x05a0076f, 0x06a006b3, - 0x03800014, 0x004940e6, 0x00a18910, 0x05308000, - 0x01011000, 0x06009079, 0x07000088, 0x05a0076f, - 0x06a006b3, 0x03800014, 0x03386000, 0x07030000, - 0x07f00000, 0x058d0772, 0x033e6a00, 0x0600aa0e, - 0x02079051, 0x0448b075, 0x0581077d, 0x02493075, - 0x0581077d, 0x05301005, 0x03010000, 0x0080077f, - 0x05301006, 0x03010000, 0x05002087, 0x06485002, - 0x0681877f, 0x0744c000, 0x01088000, 0x02086001, - 0x07c00000, 0x05001088, 0x05a00799, 0x0644c001, - 0x00088001, 0x033e6a00, 0x0600aa0e, 0x004920e6, - 0x0681878f, 0x02079051, 0x048d078f, 0x060ff089, - 0x034990ff, 0x05810796, 0x03386005, 0x03010000, - 0x03800014, 0x03386006, 0x03010000, 0x03800014, - 0x058d0799, 0x03386000, 0x07030000, 0x07f00000, - 0x048d079d, 0x070ff087, 0x074850ff, 0x0681879e, - 0x07c00000, 0x048d07a2, 0x02386001, 0x07030000, - 0x07f00000, 0x058d07a6, 0x070ff087, 0x074850ff, - 0x068187a7, 0x07c00000, 0x05002087, 0x0049d002, - 0x068187ba, 0x002fb008, 0x067800e6, 0x07000041, - 0x002fb008, 0x068187ba, 0x04a007d0, 0x0448e002, - 0x058107bd, 0x0648a002, 0x068187c7, 0x06486002, - 0x048107c1, 0x02400057, 0x056a02ff, 0x07c00000, - 0x04a007d0, 0x06788102, 0x06000004, 0x068187ba, - 0x04002089, 0x070ff0d4, 0x045c0402, 0x077800ff, - 0x07f00000, 0x068187ba, 0x00202010, 0x008c07ba, - 0x07f00000, 0x06420002, 0x068187c8, 0x04a007a2, - 0x033e6a00, 0x0700aa0a, 0x07c00000, 0x07f00000, - 0x060ff0a2, 0x045a0202, 0x060ff0a2, 0x045c0402, - 0x078187d1, 0x07c00000, 0x04a002ad, 0x03495047, - 0x048107dc, 0x0320901d, 0x0080080e, 0x0220901f, - 0x0080080e, 0x014980e4, 0x05818014, 0x013e4000, - 0x07003000, 0x05600e35, 0x050f80ff, 0x04a0083d, - 0x01208003, 0x07a006b8, 0x018007f6, 0x03209009, - 0x0080080e, 0x03209011, 0x0080080e, 0x02209007, - 0x0080080e, 0x03209003, 0x0080080e, 0x00497043, - 0x068187ec, 0x00494043, 0x058107e8, 0x02209001, - 0x0080080e, 0x0220900d, 0x0080080e, 0x0320900f, - 0x0080080e, 0x03493000, 0x058107ff, 0x027c0045, - 0x070a0000, 0x0581080a, 0x0220900b, 0x0080080e, - 0x0320900c, 0x00800804, 0x02209013, 0x05308000, - 0x01012000, 0x06a006b3, 0x008001df, 0x03209005, - 0x0080080e, 0x072e500c, 0x00208002, 0x07a006b8, - 0x03800014, 0x05308000, 0x01012000, 0x06a006b3, - 0x018001d2, 0x04a002ad, 0x070ff02e, 0x045c0479, - 0x0481081a, 0x05308000, 0x05008000, 0x06009079, - 0x06a006b3, 0x07c00000, 0x053f2000, 0x0700c000, - 0x039d881b, 0x07c00000, 0x033e5000, 0x0700f000, - 0x01800824, 0x033e5000, 0x05008000, 0x024960e5, - 0x0581082e, 0x0249a0e5, 0x0481082a, 0x0302f041, - 0x052e4030, 0x033e5000, 0x0700a000, 0x072e500c, - 0x03800014, 0x050f8035, 0x04a0083d, 0x00017008, - 0x01018009, 0x033e5000, 0x07000c00, 0x05308000, - 0x07006000, 0x07009041, 0x06a006b3, 0x05008017, - 0x07009018, 0x0249a0e5, 0x07818178, 0x03800066, - 0x072d6000, 0x07f00000, 0x07f00000, 0x000110d0, - 0x010120d1, 0x062d6001, 0x07f00000, 0x07f00000, - 0x020130d0, 0x010140d1, 0x062d6002, 0x010170d4, - 0x07f00000, 0x020150d0, 0x030160d1, 0x053fa83a, - 0x06000008, 0x07c00000, 0x07600c41, 0x050f80ff, - 0x01202003, 0x073fa00a, 0x06000001, 0x07f00000, - 0x05601041, 0x050f80ff, 0x032fa071, 0x00800108, - 0x002fb001, 0x0180085c, 0x012fb000, 0x02386001, - 0x030e0000, 0x03076087, 0x059f085f, 0x03386000, - 0x03020000, 0x00498076, 0x078188b1, 0x00497076, - 0x0681886b, 0x04482076, 0x0781887d, 0x02496076, - 0x078188a0, 0x008008ae, 0x075a00ff, 0x059f086c, - 0x03386000, 0x03010000, 0x033e6000, 0x07003000, - 0x00492076, 0x048108ae, 0x00491076, 0x068188ae, - 0x02490076, 0x068188ae, 0x0249a0e6, 0x0581087b, - 0x07a0091d, 0x018008a5, 0x0245f076, 0x008008ae, - 0x004980e6, 0x058108b7, 0x070ff074, 0x0086088f, - 0x070ff072, 0x05500471, 0x050f80ff, 0x002fa819, - 0x049f0885, 0x02080001, 0x00081002, 0x01082003, - 0x05a008e7, 0x018608b7, 0x04a008d6, 0x0249a0e6, - 0x078188a5, 0x008008ae, 0x04a008d6, 0x033e6000, - 0x07002200, 0x030ef003, 0x02868897, 0x033e6000, - 0x07002e00, 0x0045807a, 0x0249a0e6, 0x0481089b, - 0x06a006a7, 0x018008a9, 0x0648c0e6, 0x048108ae, - 0x03386000, 0x030e0000, 0x0180049a, 0x04a008d6, - 0x030ef003, 0x038688a5, 0x070ff074, 0x00860894, - 0x033e6000, 0x07002200, 0x0249a0e6, 0x048108ae, - 0x03386000, 0x030e0000, 0x033e6000, 0x05008000, - 0x03800522, 0x03386000, 0x030e0000, 0x03800028, - 0x040fd079, 0x033e6000, 0x0500a200, 0x03386000, - 0x030e0000, 0x0080075e, 0x012098b7, 0x038006bb, - 0x02386001, 0x030e0000, 0x06604e79, 0x050f80ff, - 0x032fa009, 0x03070000, 0x06600c70, 0x050f80ff, - 0x053fa821, 0x06000038, 0x07f00000, 0x06601470, - 0x050f80ff, 0x032fa021, 0x060ff002, 0x018608d4, - 0x059f08c9, 0x03080000, 0x00081001, 0x00082002, - 0x03083003, 0x070ff087, 0x033e6000, 0x07000300, - 0x03386000, 0x030e0000, 0x07c00000, 0x0045807a, - 0x018008d1, 0x06604e79, 0x050f80ff, 0x032fa009, - 0x03070000, 0x06600c70, 0x050f80ff, 0x053fa822, - 0x06000038, 0x059f08de, 0x06000080, 0x05001081, - 0x05002082, 0x06003083, 0x06601470, 0x050f80ff, - 0x032fa022, 0x07c00000, 0x07420074, 0x058108fc, - 0x02400073, 0x060ff038, 0x00540473, 0x00d008fe, - 0x05600272, 0x050f80ff, 0x032fa009, 0x030ef000, - 0x0286090e, 0x01072000, 0x07600a00, 0x050f80ff, - 0x032fa009, 0x03681e00, 0x076c14ff, 0x0481890e, - 0x02073038, 0x05271006, 0x07c00000, 0x022ff001, - 0x008008fb, 0x02800904, 0x03800906, 0x02800908, - 0x0380090a, 0x0380090c, 0x018008ed, 0x05271006, - 0x008008fb, 0x05271009, 0x008008fb, 0x0527100c, - 0x008008fb, 0x0527100f, 0x008008fb, 0x05271012, - 0x008008fb, 0x032ff000, 0x008008fb, 0x02386001, - 0x030e0000, 0x05001087, 0x069f0913, 0x00494001, - 0x06810919, 0x03386000, 0x030e0000, 0x07c00000, - 0x03386000, 0x03010000, 0x033e6000, 0x07003000, - 0x00208080, 0x05001087, 0x00494001, 0x04818925, - 0x00497001, 0x04818938, 0x06420008, 0x0581891e, - 0x00208070, 0x05001087, 0x00494001, 0x0581892b, - 0x0760031e, 0x0380091e, 0x01208060, 0x05001087, - 0x00494001, 0x04818931, 0x0760031d, 0x0380091e, - 0x04a008d6, 0x033e6000, 0x07002200, 0x069f0934, - 0x03386000, 0x030e0000, 0x07c00000, 0x04a008d6, - 0x02800934, 0x9fdf5eba, 0x02800004, 0x00000000, - 0x00008000, 0x00000599, 0x033d0aaa, 0x070aaaaa, - 0x013d1aaa, 0x070aaaaa, 0x050f801e, 0x012fa8d1, - 0x050f801e, 0x043fa889, 0x0700000f, 0x03200005, - 0x07420000, 0x050fb000, 0x050f801e, 0x073fa011, - 0x06000038, 0x050f801e, 0x053fa859, 0x0700003a, - 0x050fe000, 0x0481800e, 0x07840024, 0x0595801d, - 0x030e0011, 0x072e4200, 0x03800018, 0x02920040, - 0x068b0023, 0x028a0064, 0x0778aae7, 0x06000001, - 0x02a18419, 0x079a0053, 0x05908018, 0x010170e1, - 0x01640817, 0x0482803d, 0x070ff017, 0x02d0002a, - 0x02800032, 0x02800034, 0x02800037, 0x0380003a, - 0x0280003d, 0x0280003d, 0x0280003d, 0x0280003d, - 0x03e00000, 0x03800018, 0x04908034, 0x030160e1, - 0x0380003f, 0x04908037, 0x030150e1, 0x0380003f, - 0x0590803a, 0x010140e1, 0x0380003f, 0x060fc013, - 0x06a00591, 0x03800018, 0x014940e4, 0x00a18043, - 0x03800024, 0x02681e0d, 0x050fb0ff, 0x04600875, - 0x050f80ff, 0x053fa809, 0x06000001, 0x05488003, - 0x04818052, 0x0400800d, 0x0120d000, 0x013e4000, - 0x05000200, 0x06009075, 0x04002076, 0x07a0057d, - 0x07c00000, 0x000170e3, 0x050fe017, 0x05878059, - 0x0547f417, 0x0301f0ff, 0x00800229, 0x054bc417, - 0x050fb0ff, 0x03640aff, 0x04828061, 0x0179fe17, - 0x070fffff, 0x030750ff, 0x0280037c, 0x050fd017, - 0x06a00591, 0x0380001d, 0x00018098, 0x07480018, - 0x04818079, 0x05481018, 0x04818076, 0x05482018, - 0x04818073, 0x07483018, 0x04818070, 0x002fb004, - 0x030190cc, 0x0380007b, 0x012fb003, 0x020190cb, - 0x0380007b, 0x002fb002, 0x030190ca, 0x0380007b, - 0x002fb001, 0x030190c9, 0x0380007b, 0x012fb000, - 0x020190c8, 0x00017086, 0x01491017, 0x07810084, - 0x04a00194, 0x07781817, 0x05000200, 0x037c00ff, - 0x05000200, 0x05810122, 0x078b0084, 0x03385000, - 0x03020000, 0x07780017, 0x0043dc07, 0x068181d6, - 0x056c0478, 0x0481013b, 0x056c0278, 0x07810090, - 0x05278000, 0x01800122, 0x05278000, 0x07483017, - 0x04810125, 0x05482017, 0x0481012c, 0x0448b076, - 0x06818110, 0x06601875, 0x050f80ff, 0x073fa022, - 0x0600003e, 0x06000080, 0x05001081, 0x05002082, - 0x06003083, 0x05004084, 0x04602075, 0x050f80ff, - 0x022fa02a, 0x04487076, 0x0581010f, 0x04604675, - 0x050f80ff, 0x032fa009, 0x03680600, 0x050010ff, - 0x056c02ff, 0x058180e7, 0x07000090, 0x074b0000, - 0x050fe000, 0x038600e7, 0x0560027b, 0x050f80ff, - 0x032fa009, 0x07f00000, 0x05600e00, 0x050f80ff, - 0x032fa009, 0x07f00000, 0x074b0000, 0x070ff08d, - 0x0179feff, 0x070000ff, 0x055c0400, 0x078100e7, - 0x070ff017, 0x037a00ff, 0x05000400, 0x010170ff, - 0x04604075, 0x050f80ff, 0x034a8400, 0x034a8800, - 0x05780100, 0x070000ff, 0x055a0400, 0x074b0a00, - 0x077bff00, 0x070000ff, 0x032fa00a, 0x07f00000, - 0x04603e75, 0x050f80ff, 0x07300fff, 0x070fffff, - 0x032fa00a, 0x07f00000, 0x04604a75, 0x050f80ff, - 0x0700008d, 0x017a0100, 0x07ffff00, 0x032fa00a, - 0x07f00000, 0x04604c75, 0x050f80ff, 0x07300fff, - 0x070fffff, 0x032fa00a, 0x07f00000, 0x06604275, - 0x050f80ff, 0x06000013, 0x032fa00a, 0x0245a076, - 0x018001de, 0x066c0001, 0x07818109, 0x05482017, - 0x05810109, 0x070ff09a, 0x017910ff, 0x03088888, - 0x057d10ff, 0x03088888, 0x05810109, 0x070ff09a, - 0x045a0201, 0x070ff09a, 0x045c0401, 0x048180f1, - 0x050020ff, 0x060000fb, 0x06483001, 0x048180fd, - 0x00680e01, 0x055c0400, 0x04810102, 0x004a4001, - 0x02400002, 0x046c0e02, 0x048180f8, 0x01800109, - 0x040fd002, 0x052e400c, 0x040080fb, 0x046a6108, - 0x06009075, 0x04002076, 0x07a0057d, 0x04603e75, - 0x050f80ff, 0x053fa842, 0x06000045, 0x048b010d, - 0x02085013, 0x05278000, 0x02075013, 0x060ff0fb, - 0x00d00113, 0x01800118, 0x0080011a, 0x0080011c, - 0x0180011e, 0x00800120, 0x062d0020, 0x01800122, - 0x062d0080, 0x01800122, 0x052d0200, 0x01800122, - 0x052d0800, 0x01800122, 0x033d0000, 0x06000002, - 0x03920024, 0x0584801d, 0x02800023, 0x040fe07f, - 0x00860134, 0x04a00154, 0x01920122, 0x040fe07f, - 0x06a68154, 0x01800122, 0x0760127b, 0x050f80ff, - 0x032fa009, 0x0744f000, 0x0760127b, 0x050f80ff, - 0x032fa00a, 0x02800097, 0x052e400c, 0x040080fb, - 0x046aa108, 0x06009075, 0x04002076, 0x07a0057d, - 0x01800122, 0x04278001, 0x05482017, 0x05810148, - 0x048b013e, 0x060ff086, 0x0349f0ff, 0x0581807b, - 0x07483017, 0x04810145, 0x050fd0ff, 0x040fe07f, - 0x06a68154, 0x01800122, 0x05004084, 0x04a0020b, - 0x01920122, 0x070ff07d, 0x0450047c, 0x056004ff, - 0x050f80ff, 0x032fa009, 0x070ff000, 0x00540479, - 0x030790ff, 0x0080012c, 0x04487076, 0x0581015c, - 0x04605875, 0x050f80ff, 0x032fa009, 0x060ff079, - 0x01540400, 0x0080015e, 0x060ff079, 0x0054047a, - 0x0582018d, 0x0581018d, 0x070ff07d, 0x0450047c, - 0x050f80ff, 0x002fa819, 0x048b0164, 0x02080001, - 0x00081002, 0x01082003, 0x048b0168, 0x04487076, - 0x0481016e, 0x02385001, 0x03010000, 0x00800170, - 0x03385000, 0x03010000, 0x03400078, 0x070ff003, - 0x04500479, 0x030790ff, 0x0340007e, 0x0642007f, - 0x0581018d, 0x070ff07e, 0x050f80ff, 0x032fa009, - 0x050fe000, 0x0286818c, 0x070ff07d, 0x056002ff, - 0x050f80ff, 0x032fa009, 0x0107d000, 0x0186018e, - 0x07600a7d, 0x050f80ff, 0x032fa009, 0x03681e00, - 0x0550041b, 0x050f80ff, 0x032fa009, 0x0107e000, - 0x070ff07e, 0x01800178, 0x0307c000, 0x07c00000, + 0x07a006af, 0x02800597, 0x0760127b, 0x050f80ff, + 0x032fa009, 0x0349c000, 0x04818564, 0x04601079, + 0x050f80ff, 0x073fa00a, 0x0600003d, 0x07f00000, + 0x06600a79, 0x050f80ff, 0x053fa80a, 0x06000010, + 0x02800597, 0x0046e07a, 0x02800592, 0x06009008, + 0x05308000, 0x05004000, 0x06a006b3, 0x02800597, + 0x0760187b, 0x050f80ff, 0x032fa011, 0x070ff000, + 0x04500401, 0x030460ff, 0x060ff025, 0x00540446, + 0x0682057f, 0x030460ff, 0x052e40c0, 0x04092046, + 0x0349a0e4, 0x0481857c, 0x003e4080, 0x0700c000, + 0x02800580, 0x003e4080, 0x05008000, 0x02800580, + 0x04092046, 0x070ff03a, 0x01868584, 0x013e4000, + 0x07000003, 0x04a002ad, 0x06600679, 0x050f80ff, + 0x00201007, 0x012fa80a, 0x0046047a, 0x034630ff, + 0x050020ff, 0x06003051, 0x04601079, 0x050f80ff, + 0x073fa012, 0x06000001, 0x02800597, 0x07a006a6, + 0x05308000, 0x03020000, 0x06009079, 0x06a006b3, + 0x033e6a00, 0x0700aa0a, 0x02079051, 0x03800014, + 0x06605679, 0x050f80ff, 0x032fa009, 0x070ff000, + 0x038605b4, 0x057dfeff, 0x07ffffff, 0x078105b4, + 0x050f8000, 0x012fa811, 0x0079fe02, 0x070000ff, + 0x077d66ff, 0x060000dc, 0x058185b4, 0x060ff001, + 0x008685b5, 0x064b0002, 0x06420002, 0x060ff002, + 0x05500400, 0x050f80ff, 0x05004084, 0x073fa00a, + 0x06000002, 0x07c00000, 0x04600201, 0x050f80ff, + 0x073fa009, 0x06000001, 0x0079fe02, 0x070000ff, + 0x077d72ff, 0x070000dd, 0x058185b4, 0x064b0002, + 0x06420002, 0x06000001, 0x028005ae, 0x0605004c, + 0x038005c6, 0x069305c2, 0x07a006ac, 0x054bc450, + 0x078105c9, 0x03d005ca, 0x038005c9, 0x028005da, + 0x028005dc, 0x02800668, 0x0380067b, 0x028005e9, + 0x028005dc, 0x02800632, 0x028005da, 0x02800683, + 0x0280067f, 0x028005da, 0x02800686, 0x0280069b, + 0x02800654, 0x028005da, 0x028005da, 0x022095da, + 0x038006bb, 0x073c3fff, 0x0700000f, 0x0379ff50, + 0x070fffff, 0x060ff079, 0x055c0450, 0x07810678, + 0x002fb008, 0x060ff079, 0x055c0450, 0x07810677, + 0x06a0069e, 0x02800670, 0x0179fe50, 0x070fffff, + 0x070050ff, 0x060ff079, 0x055c0405, 0x078105f3, + 0x002fb008, 0x060ff079, 0x055c0405, 0x05818674, + 0x073c3fff, 0x0700000f, 0x070ff087, 0x017980ff, + 0x0600f507, 0x04818602, 0x02203040, 0x05002087, + 0x0049d002, 0x04818602, 0x002fb008, 0x07006087, + 0x002fb008, 0x0149d006, 0x0681062c, 0x06930607, + 0x01257000, 0x052e4003, 0x072e5030, 0x0304c050, + 0x02400057, 0x06740057, 0x06000004, 0x0682001a, + 0x004940e6, 0x00a18910, 0x0049107a, 0x00a1859b, + 0x04002083, 0x07003084, 0x04004085, 0x04602679, + 0x050f80ff, 0x063fa01a, 0x06000001, 0x07a006a6, + 0x04a007a2, 0x033e6a00, 0x0700aa0a, 0x062e5020, + 0x04a007d0, 0x02798102, 0x070000ff, 0x007c8002, + 0x07000055, 0x06810629, 0x072e50c0, 0x0648a002, + 0x06810629, 0x078d0624, 0x03386006, 0x03010000, + 0x033e6000, 0x0700000c, 0x003e4002, 0x07000a00, + 0x03800599, 0x07420003, 0x058185fa, 0x00798002, + 0x0600f507, 0x04818602, 0x0280060b, 0x07930639, + 0x01257000, 0x073c3fff, 0x0700000f, 0x052e4003, + 0x072e5030, 0x0304c050, 0x067800e6, 0x07000041, + 0x0681063e, 0x04a007ab, 0x04818649, 0x002fb008, + 0x067800e6, 0x07000041, 0x07810644, 0x04a007ab, + 0x04818649, 0x062e5020, 0x003e4002, 0x07000a00, + 0x03e00000, 0x03800014, 0x06740057, 0x07000018, + 0x0682001a, 0x04a007a2, 0x033e6a00, 0x0700aa0a, + 0x002fb008, 0x04a007a2, 0x033e6a00, 0x0700aa0a, + 0x03800644, 0x0379ff50, 0x070fffff, 0x060ff079, + 0x055c0450, 0x0581865a, 0x0245507a, 0x002fb008, + 0x060ff079, 0x055c0450, 0x0581865f, 0x0245507a, + 0x002fb008, 0x05601050, 0x050f80ff, 0x012fa809, + 0x02455001, 0x05601050, 0x050f80ff, 0x012fa80a, + 0x03800671, 0x05958678, 0x0179fe50, 0x070fffff, + 0x045c042f, 0x05818678, 0x0202f051, 0x042e4020, + 0x03800671, 0x002fb008, 0x003e4002, 0x07000a00, + 0x0280001a, 0x05938677, 0x062e5020, 0x042e4002, + 0x002fb008, 0x013e4000, 0x05000e00, 0x0280001a, + 0x0179fe50, 0x070fffff, 0x010210ff, 0x0280001a, + 0x0179fe50, 0x070fffff, 0x050340ff, 0x03800671, + 0x023e5008, 0x05000800, 0x0280001a, 0x0179fe50, + 0x070fffff, 0x0102e0ff, 0x05602c2e, 0x050f80ff, + 0x05222000, 0x07223000, 0x05224000, 0x07225000, + 0x07226000, 0x05227000, 0x05228000, 0x07229000, + 0x0722a000, 0x0522b000, 0x063fa051, 0x07000011, + 0x0202c026, 0x0522d000, 0x052e400c, 0x0280001a, + 0x030430d4, 0x062e5008, 0x018001d2, 0x05601050, + 0x050f80ff, 0x032fa009, 0x03460000, 0x038006a9, + 0x0246007a, 0x0045207a, 0x028006a7, 0x0246007a, + 0x0600007a, 0x04601079, 0x050f80ff, 0x032fa00a, + 0x07c00000, 0x019286ac, 0x070500e1, 0x07c00000, + 0x0245f008, 0x068406b0, 0x020e0008, 0x07c00000, + 0x070ff009, 0x065a0008, 0x068406b5, 0x020e0008, + 0x07c00000, 0x078406b8, 0x020e0008, 0x07c00000, + 0x05308000, 0x0500d000, 0x06a006b3, 0x07a006c0, + 0x03800014, 0x052e4300, 0x072e500c, 0x073c3fff, + 0x0700000f, 0x07c00000, 0x04602608, 0x050f80ff, + 0x032fa011, 0x076a0000, 0x048186ce, 0x066a0001, + 0x068106ce, 0x06006051, 0x07c00000, 0x02206001, + 0x07c00000, 0x0678007a, 0x06000020, 0x058186d8, + 0x0049107a, 0x078106d8, 0x073c3fff, 0x0700000f, + 0x02800537, 0x040fd079, 0x0648307a, 0x078106dd, + 0x05a00812, 0x038006e2, 0x07a006a3, 0x05308000, + 0x05001000, 0x06009079, 0x06a006b3, 0x078d06e2, + 0x033e6a00, 0x0600aa0e, 0x02079051, 0x03386006, + 0x03010000, 0x03800014, 0x052e6200, 0x0648307a, + 0x078106ee, 0x05a00812, 0x0080078a, 0x07a006a3, + 0x05308000, 0x05001000, 0x06009079, 0x06a006b3, + 0x0080078a, 0x050010ff, 0x0448b07a, 0x04810702, + 0x0049107a, 0x04810702, 0x078d06f9, 0x04604679, + 0x050f80ff, 0x032fa009, 0x03680600, 0x056c02ff, + 0x06818702, 0x046c1001, 0x04810704, 0x056a02ff, + 0x07c00000, 0x04a00707, 0x075c00ff, 0x07c00000, + 0x048d0707, 0x060ff07c, 0x070ff07d, 0x070ff07e, + 0x060ff07f, 0x060ff080, 0x070ff081, 0x070ff082, + 0x060ff083, 0x070ff084, 0x060ff085, 0x0338600c, + 0x03010000, 0x038a8714, 0x048d0715, 0x03386000, + 0x03020000, 0x07c00000, 0x052e6200, 0x018004e8, + 0x0648307a, 0x06818207, 0x07a006a6, 0x0120971b, + 0x038006bb, 0x04002089, 0x04780102, 0x07f00000, + 0x05001088, 0x04740101, 0x03100000, 0x04780101, + 0x07f00000, 0x060ff002, 0x045c0401, 0x07818735, + 0x00088001, 0x033e6000, 0x070000c0, 0x0220901a, + 0x05308000, 0x01012000, 0x06a006b3, 0x00800786, + 0x01209733, 0x038006bb, 0x01209735, 0x0180021e, + 0x040fd075, 0x040fd07a, 0x040fd079, 0x0648307a, + 0x04810740, 0x06780075, 0x06000007, 0x0781874b, + 0x05a00812, 0x06486075, 0x07818205, 0x02490075, + 0x0681821a, 0x04487075, 0x07818753, 0x0448b07a, + 0x0481074a, 0x00492075, 0x07818766, 0x0080075e, + 0x05308000, 0x03010000, 0x06009079, 0x06a006b3, + 0x03800014, 0x0448e0e6, 0x068184b6, 0x01800203, + 0x0648307a, 0x06818786, 0x004940e6, 0x00a18910, + 0x05308000, 0x0500e000, 0x06009079, 0x06a006b3, + 0x04008089, 0x07a006b8, 0x00800786, 0x07a006a3, + 0x05308000, 0x0700f000, 0x06009079, 0x07000088, + 0x05a0076f, 0x06a006b3, 0x03800014, 0x004940e6, + 0x00a18910, 0x05308000, 0x01011000, 0x06009079, + 0x07000088, 0x05a0076f, 0x06a006b3, 0x03800014, + 0x03386000, 0x07030000, 0x07f00000, 0x058d0772, + 0x033e6a00, 0x0600aa0e, 0x02079051, 0x0448b075, + 0x0581077d, 0x02493075, 0x0581077d, 0x05301005, + 0x03010000, 0x0080077f, 0x05301006, 0x03010000, + 0x05002087, 0x06485002, 0x0681877f, 0x0744c000, + 0x01088000, 0x02086001, 0x07c00000, 0x05001088, + 0x05a00799, 0x0644c001, 0x00088001, 0x033e6a00, + 0x0600aa0e, 0x004920e6, 0x0681878f, 0x02079051, + 0x048d078f, 0x060ff089, 0x034990ff, 0x05810796, + 0x03386005, 0x03010000, 0x03800014, 0x03386006, + 0x03010000, 0x03800014, 0x058d0799, 0x03386000, + 0x07030000, 0x07f00000, 0x048d079d, 0x070ff087, + 0x074850ff, 0x0681879e, 0x07c00000, 0x048d07a2, + 0x02386001, 0x07030000, 0x07f00000, 0x058d07a6, + 0x070ff087, 0x074850ff, 0x068187a7, 0x07c00000, + 0x05002087, 0x0049d002, 0x068187ba, 0x002fb008, + 0x067800e6, 0x07000041, 0x002fb008, 0x068187ba, + 0x04a007d0, 0x0448e002, 0x058107bd, 0x0648a002, + 0x068187c7, 0x06486002, 0x048107c1, 0x02400057, + 0x056a02ff, 0x07c00000, 0x04a007d0, 0x06788102, + 0x06000004, 0x068187ba, 0x04002089, 0x070ff0d4, + 0x045c0402, 0x077800ff, 0x07f00000, 0x068187ba, + 0x00202010, 0x008c07ba, 0x07f00000, 0x06420002, + 0x068187c8, 0x04a007a2, 0x033e6a00, 0x0700aa0a, + 0x07c00000, 0x07f00000, 0x060ff0a2, 0x045a0202, + 0x060ff0a2, 0x045c0402, 0x078187d1, 0x07c00000, + 0x04a002ad, 0x03495047, 0x048107dc, 0x0320901d, + 0x0080080e, 0x0220901f, 0x0080080e, 0x014980e4, + 0x05818014, 0x013e4000, 0x07003000, 0x05600e35, + 0x050f80ff, 0x04a0083d, 0x01208003, 0x07a006b8, + 0x018007f6, 0x03209009, 0x0080080e, 0x03209011, + 0x0080080e, 0x02209007, 0x0080080e, 0x03209003, + 0x0080080e, 0x00497043, 0x068187ec, 0x00494043, + 0x058107e8, 0x02209001, 0x0080080e, 0x0220900d, + 0x0080080e, 0x0320900f, 0x0080080e, 0x03493000, + 0x058107ff, 0x027c0045, 0x070a0000, 0x0581080a, + 0x0220900b, 0x0080080e, 0x0320900c, 0x00800804, + 0x02209013, 0x05308000, 0x01012000, 0x06a006b3, + 0x008001df, 0x03209005, 0x0080080e, 0x072e500c, + 0x00208002, 0x07a006b8, 0x03800014, 0x05308000, + 0x01012000, 0x06a006b3, 0x018001d2, 0x04a002ad, + 0x070ff02e, 0x045c0479, 0x0481081a, 0x05308000, + 0x05008000, 0x06009079, 0x06a006b3, 0x07c00000, + 0x053f2000, 0x0700c000, 0x039d881b, 0x07c00000, + 0x033e5000, 0x0700f000, 0x01800824, 0x033e5000, + 0x05008000, 0x024960e5, 0x0581082e, 0x0249a0e5, + 0x0481082a, 0x0302f041, 0x052e4030, 0x033e5000, + 0x0700a000, 0x072e500c, 0x03800014, 0x050f8035, + 0x04a0083d, 0x00017008, 0x01018009, 0x033e5000, + 0x07000c00, 0x05308000, 0x07006000, 0x07009041, + 0x06a006b3, 0x05008017, 0x07009018, 0x0249a0e5, + 0x07818178, 0x03800066, 0x072d6000, 0x07f00000, + 0x07f00000, 0x000110d0, 0x010120d1, 0x062d6001, + 0x07f00000, 0x07f00000, 0x020130d0, 0x010140d1, + 0x062d6002, 0x010170d4, 0x07f00000, 0x020150d0, + 0x030160d1, 0x053fa83a, 0x06000008, 0x07c00000, + 0x07600c41, 0x050f80ff, 0x01202003, 0x073fa00a, + 0x06000001, 0x07f00000, 0x05601041, 0x050f80ff, + 0x032fa071, 0x00800108, 0x002fb001, 0x0180085c, + 0x012fb000, 0x02386001, 0x030e0000, 0x03076087, + 0x059f085f, 0x03386000, 0x03020000, 0x00498076, + 0x078188b1, 0x00497076, 0x0681886b, 0x04482076, + 0x0781887d, 0x02496076, 0x078188a0, 0x008008ae, + 0x075a00ff, 0x059f086c, 0x03386000, 0x03010000, + 0x033e6000, 0x07003000, 0x00492076, 0x048108ae, + 0x00491076, 0x068188ae, 0x02490076, 0x068188ae, + 0x0249a0e6, 0x0581087b, 0x07a0091d, 0x018008a5, + 0x0245f076, 0x008008ae, 0x004980e6, 0x058108b7, + 0x070ff074, 0x0086088f, 0x070ff072, 0x05500471, + 0x050f80ff, 0x002fa819, 0x049f0885, 0x02080001, + 0x00081002, 0x01082003, 0x05a008e7, 0x018608b7, + 0x04a008d6, 0x0249a0e6, 0x078188a5, 0x008008ae, + 0x04a008d6, 0x033e6000, 0x07002200, 0x030ef003, + 0x02868897, 0x033e6000, 0x07002e00, 0x0045807a, + 0x0249a0e6, 0x0481089b, 0x06a006a7, 0x018008a9, + 0x0648c0e6, 0x048108ae, 0x03386000, 0x030e0000, + 0x0180049a, 0x04a008d6, 0x030ef003, 0x038688a5, + 0x070ff074, 0x00860894, 0x033e6000, 0x07002200, + 0x0249a0e6, 0x048108ae, 0x03386000, 0x030e0000, + 0x033e6000, 0x05008000, 0x03800522, 0x03386000, + 0x030e0000, 0x03800028, 0x040fd079, 0x033e6000, + 0x0500a200, 0x03386000, 0x030e0000, 0x0080075e, + 0x012098b7, 0x038006bb, 0x02386001, 0x030e0000, + 0x06604e79, 0x050f80ff, 0x032fa009, 0x03070000, + 0x06600c70, 0x050f80ff, 0x053fa821, 0x06000038, + 0x07f00000, 0x06601470, 0x050f80ff, 0x032fa021, + 0x060ff002, 0x018608d4, 0x059f08c9, 0x03080000, + 0x00081001, 0x00082002, 0x03083003, 0x070ff087, + 0x033e6000, 0x07000300, 0x03386000, 0x030e0000, + 0x07c00000, 0x0045807a, 0x018008d1, 0x06604e79, + 0x050f80ff, 0x032fa009, 0x03070000, 0x06600c70, + 0x050f80ff, 0x053fa822, 0x06000038, 0x059f08de, + 0x06000080, 0x05001081, 0x05002082, 0x06003083, + 0x06601470, 0x050f80ff, 0x032fa022, 0x07c00000, + 0x07420074, 0x058108fc, 0x02400073, 0x060ff038, + 0x00540473, 0x00d008fe, 0x05600272, 0x050f80ff, + 0x032fa009, 0x030ef000, 0x0286090e, 0x01072000, + 0x07600a00, 0x050f80ff, 0x032fa009, 0x03681e00, + 0x076c14ff, 0x0481890e, 0x02073038, 0x05271006, + 0x07c00000, 0x022ff001, 0x008008fb, 0x02800904, + 0x03800906, 0x02800908, 0x0380090a, 0x0380090c, + 0x018008ed, 0x05271006, 0x008008fb, 0x05271009, + 0x008008fb, 0x0527100c, 0x008008fb, 0x0527100f, + 0x008008fb, 0x05271012, 0x008008fb, 0x032ff000, + 0x008008fb, 0x02386001, 0x030e0000, 0x05001087, + 0x069f0913, 0x00494001, 0x06810919, 0x03386000, + 0x030e0000, 0x07c00000, 0x03386000, 0x03010000, + 0x033e6000, 0x07003000, 0x00208080, 0x05001087, + 0x00494001, 0x04818925, 0x00497001, 0x04818938, + 0x06420008, 0x0581891e, 0x00208070, 0x05001087, + 0x00494001, 0x0581892b, 0x0760031e, 0x0380091e, + 0x01208060, 0x05001087, 0x00494001, 0x04818931, + 0x0760031d, 0x0380091e, 0x04a008d6, 0x033e6000, + 0x07002200, 0x069f0934, 0x03386000, 0x030e0000, + 0x07c00000, 0x04a008d6, 0x02800934, 0x9fdf5eba, + 0x02800004, 0x00000000, 0x00008000, 0x000005a0, + 0x033d0aaa, 0x070aaaaa, 0x013d1aaa, 0x070aaaaa, + 0x050f801e, 0x012fa8d1, 0x050f801e, 0x043fa889, + 0x0700000f, 0x03200005, 0x07420000, 0x050fb000, + 0x050f801e, 0x073fa011, 0x06000038, 0x050f801e, + 0x053fa859, 0x0700003a, 0x050fe000, 0x0481800e, + 0x07840024, 0x0595801d, 0x030e0011, 0x072e4200, + 0x03800018, 0x02920040, 0x068b0023, 0x028a0064, + 0x0778aae7, 0x06000001, 0x02a18419, 0x079a0053, + 0x05908018, 0x010170e1, 0x01640817, 0x0482803d, + 0x070ff017, 0x02d0002a, 0x02800032, 0x02800034, + 0x02800037, 0x0380003a, 0x0280003d, 0x0280003d, + 0x0280003d, 0x0280003d, 0x03e00000, 0x03800018, + 0x04908034, 0x030160e1, 0x0380003f, 0x04908037, + 0x030150e1, 0x0380003f, 0x0590803a, 0x010140e1, + 0x0380003f, 0x060fc013, 0x06a00598, 0x03800018, + 0x014940e4, 0x00a18043, 0x03800024, 0x02681e0d, + 0x050fb0ff, 0x04600875, 0x050f80ff, 0x053fa809, + 0x06000001, 0x05488003, 0x04818052, 0x0400800d, + 0x0120d000, 0x013e4000, 0x05000200, 0x06009075, + 0x04002076, 0x07a00584, 0x07c00000, 0x000170e3, + 0x050fe017, 0x05878059, 0x0547f417, 0x0301f0ff, + 0x00800229, 0x054bc417, 0x050fb0ff, 0x03640aff, + 0x04828061, 0x0179fe17, 0x070fffff, 0x030750ff, + 0x0280037c, 0x050fd017, 0x06a00598, 0x0380001d, + 0x00018098, 0x07480018, 0x04818079, 0x05481018, + 0x04818076, 0x05482018, 0x04818073, 0x07483018, + 0x04818070, 0x002fb004, 0x030190cc, 0x0380007b, + 0x012fb003, 0x020190cb, 0x0380007b, 0x002fb002, + 0x030190ca, 0x0380007b, 0x002fb001, 0x030190c9, + 0x0380007b, 0x012fb000, 0x020190c8, 0x00017086, + 0x01491017, 0x07810084, 0x04a00194, 0x07781817, + 0x05000200, 0x037c00ff, 0x05000200, 0x05810122, + 0x078b0084, 0x03385000, 0x03020000, 0x07780017, + 0x0043dc07, 0x068181d6, 0x056c0478, 0x0481013b, + 0x056c0278, 0x07810090, 0x05278000, 0x01800122, + 0x05278000, 0x07483017, 0x04810125, 0x05482017, + 0x0481012c, 0x0448b076, 0x06818110, 0x06601875, + 0x050f80ff, 0x073fa022, 0x0600003e, 0x06000080, + 0x05001081, 0x05002082, 0x06003083, 0x05004084, + 0x04602075, 0x050f80ff, 0x022fa02a, 0x04487076, + 0x0581010f, 0x04604675, 0x050f80ff, 0x032fa009, + 0x03680600, 0x050010ff, 0x056c02ff, 0x058180e7, + 0x07000090, 0x074b0000, 0x050fe000, 0x038600e7, + 0x0560027b, 0x050f80ff, 0x032fa009, 0x07f00000, + 0x05600e00, 0x050f80ff, 0x032fa009, 0x07f00000, + 0x074b0000, 0x070ff08d, 0x0179feff, 0x070000ff, + 0x055c0400, 0x078100e7, 0x070ff017, 0x037a00ff, + 0x05000400, 0x010170ff, 0x04604075, 0x050f80ff, + 0x034a8400, 0x034a8800, 0x05780100, 0x070000ff, + 0x055a0400, 0x074b0a00, 0x077bff00, 0x070000ff, + 0x032fa00a, 0x07f00000, 0x04603e75, 0x050f80ff, + 0x07300fff, 0x070fffff, 0x032fa00a, 0x07f00000, + 0x04604a75, 0x050f80ff, 0x0700008d, 0x017a0100, + 0x07ffff00, 0x032fa00a, 0x07f00000, 0x04604c75, + 0x050f80ff, 0x07300fff, 0x070fffff, 0x032fa00a, + 0x07f00000, 0x06604275, 0x050f80ff, 0x06000013, + 0x032fa00a, 0x0245a076, 0x018001de, 0x066c0001, + 0x07818109, 0x05482017, 0x05810109, 0x070ff09a, + 0x017910ff, 0x03088888, 0x057d10ff, 0x03088888, + 0x05810109, 0x070ff09a, 0x045a0201, 0x070ff09a, + 0x045c0401, 0x048180f1, 0x050020ff, 0x060000fb, + 0x06483001, 0x048180fd, 0x00680e01, 0x055c0400, + 0x04810102, 0x004a4001, 0x02400002, 0x046c0e02, + 0x048180f8, 0x01800109, 0x040fd002, 0x052e400c, + 0x040080fb, 0x046a6108, 0x06009075, 0x04002076, + 0x07a00584, 0x04603e75, 0x050f80ff, 0x053fa842, + 0x06000045, 0x048b010d, 0x02085013, 0x05278000, + 0x02075013, 0x060ff0fb, 0x00d00113, 0x01800118, + 0x0080011a, 0x0080011c, 0x0180011e, 0x00800120, + 0x062d0020, 0x01800122, 0x062d0080, 0x01800122, + 0x052d0200, 0x01800122, 0x052d0800, 0x01800122, + 0x033d0000, 0x06000002, 0x03920024, 0x0584801d, + 0x02800023, 0x040fe07f, 0x00860134, 0x04a00154, + 0x01920122, 0x040fe07f, 0x06a68154, 0x01800122, + 0x0760127b, 0x050f80ff, 0x032fa009, 0x0744f000, + 0x0760127b, 0x050f80ff, 0x032fa00a, 0x02800097, 0x052e400c, 0x040080fb, 0x046aa108, 0x06009075, - 0x04002076, 0x0380057d, 0x060ff075, 0x018601d4, - 0x060ff073, 0x00540419, 0x048201ab, 0x058101b7, - 0x050010ff, 0x00202010, 0x00642001, 0x0782819f, - 0x04002001, 0x040f8073, 0x024a3c02, 0x017a02ff, - 0x06000c98, 0x070fa0ff, 0x060ff002, 0x06500073, - 0x03610072, 0x045c0473, 0x068181ba, 0x03073072, - 0x008001ba, 0x036100ff, 0x050010ff, 0x03610072, - 0x00540473, 0x057dfeff, 0x07ffffff, 0x01400203, - 0x00202010, 0x01642003, 0x0782819f, 0x05002003, - 0x0180019f, 0x04002013, 0x04001013, 0x01294000, - 0x07480077, 0x068181d5, 0x06604e75, 0x050f80ff, - 0x053fa809, 0x06000001, 0x07f00000, 0x05601c03, - 0x050f80ff, 0x053fa809, 0x06000001, 0x05481003, - 0x078181d1, 0x060ff002, 0x04500401, 0x016480ff, - 0x068281d5, 0x07440077, 0x040080fb, 0x006b6108, - 0x06009075, 0x07a00578, 0x008001d5, 0x060ff002, - 0x045c0401, 0x068181d5, 0x01294000, 0x07c00000, - 0x040fd075, 0x050fd017, 0x060ff086, 0x077800ff, - 0x07000060, 0x037c00ff, 0x07000060, 0x078181d8, - 0x04487076, 0x058101f5, 0x07780017, 0x05000400, - 0x058101f5, 0x06601875, 0x050f80ff, 0x073fa022, - 0x0600003e, 0x0249a076, 0x078181ee, 0x048b01e9, - 0x04603e75, 0x050f80ff, 0x053fa842, 0x06000045, - 0x052e400c, 0x040080fb, 0x026b4108, 0x06009075, - 0x04002076, 0x07a0057d, 0x03800024, 0x06601875, - 0x050f80ff, 0x073fa022, 0x0600003e, 0x052e400c, - 0x04600875, 0x050f80ff, 0x053fa809, 0x06000001, - 0x05488003, 0x05810205, 0x0400d0fb, 0x066a810d, - 0x013e4000, 0x07000300, 0x03800024, 0x040080fb, - 0x066a8108, 0x06009075, 0x04002076, 0x07a0057d, - 0x03800024, 0x0240007f, 0x0742007e, 0x050f807e, - 0x032fa009, 0x050fe000, 0x02868225, 0x070ff07d, - 0x055c047b, 0x0481021a, 0x0760007d, 0x050f80ff, - 0x032fa009, 0x050fe000, 0x0286821a, 0x070ff07b, - 0x0107d0ff, 0x07600a7d, 0x050f80ff, 0x032fa009, - 0x03681e00, 0x0450041c, 0x0107e0ff, 0x050f80ff, - 0x032fa009, 0x050fe000, 0x01860227, 0x0307c000, - 0x07c00000, 0x040fd075, 0x02800591, 0x0460081f, - 0x050f80ff, 0x032fa039, 0x01021000, 0x03020005, - 0x01018006, 0x01683e21, 0x00d00231, 0x00800251, - 0x0080027c, 0x01800299, 0x03800311, 0x01800255, - 0x00800251, 0x00800251, 0x00800251, 0x00800251, - 0x00800251, 0x00800251, 0x00800251, 0x00800251, - 0x00800251, 0x0380032d, 0x00800251, 0x00800251, - 0x00800251, 0x00800251, 0x00800251, 0x00800251, - 0x00800251, 0x00800251, 0x00800251, 0x00800251, - 0x00800251, 0x00800251, 0x00800251, 0x00800251, - 0x00800251, 0x00800251, 0x00800251, 0x050fd0ff, - 0x06a00591, 0x03800018, 0x0380001d, 0x01494021, - 0x0481833e, 0x0400701f, 0x06a00370, 0x007a0101, - 0x07060000, 0x07303000, 0x07008290, 0x03496021, - 0x06818261, 0x06006013, 0x00800268, 0x02400010, - 0x04810261, 0x06006010, 0x0660361f, 0x050f80ff, - 0x073fa00a, 0x07000003, 0x072d0003, 0x029b8268, - 0x010b1000, 0x000b2001, 0x020b3002, 0x010b4003, - 0x020b5004, 0x030b6005, 0x010b7006, 0x063aa020, - 0x07000012, 0x070ff0f6, 0x03687eff, 0x06818273, - 0x06601220, 0x050f10ff, 0x063f3008, 0x06000008, - 0x062d0002, 0x00800254, 0x04007013, 0x06a00370, - 0x007a0101, 0x07050000, 0x07303000, 0x07008890, - 0x074d0005, 0x06006013, 0x072d0003, 0x039b8284, - 0x010b1000, 0x000b2001, 0x020b3002, 0x010b4003, - 0x020b5004, 0x030b6005, 0x010b7006, 0x04601c20, - 0x050f80ff, 0x022fa019, 0x04001002, 0x04002013, - 0x050f801e, 0x022fa01a, 0x073aa00c, 0x07000012, - 0x07300003, 0x06000008, 0x02800326, 0x04007013, - 0x06a00370, 0x007a0101, 0x03070000, 0x04602c1f, - 0x050f80ff, 0x073fa009, 0x06000004, 0x02499008, - 0x058102a6, 0x07303000, 0x07008890, 0x008002a8, - 0x07303000, 0x04008980, 0x05007003, 0x074d0005, - 0x06006013, 0x072d0003, 0x029b82ab, 0x010b1000, - 0x000b2001, 0x020b3002, 0x010b4003, 0x020b5004, - 0x030b6005, 0x010b7006, 0x04601620, 0x050f80ff, - 0x032fa021, 0x07f00000, 0x064b0002, 0x02499008, - 0x048102bc, 0x0644c002, 0x054b0400, 0x050040ff, - 0x06698104, 0x078182d1, 0x06000013, 0x04001013, - 0x04780102, 0x06000010, 0x06003013, 0x04004013, - 0x06005013, 0x06006013, 0x04007013, 0x00644015, - 0x048202cd, 0x04448002, 0x02205008, 0x050f801e, - 0x032fa042, 0x04008015, 0x03800309, 0x046c8004, - 0x068182df, 0x01208018, 0x06780002, 0x07000003, - 0x078182e2, 0x06003001, 0x06000013, 0x04001013, - 0x04004013, 0x06005013, 0x050f801e, 0x022fa032, - 0x03800309, 0x040fd01f, 0x06a00591, 0x03800018, - 0x0379ff03, 0x070000ff, 0x04488002, 0x048102e9, - 0x070ff003, 0x04500408, 0x050080ff, 0x0379ff00, - 0x070000ff, 0x06489002, 0x058102f0, 0x070ff000, - 0x04500408, 0x050080ff, 0x07005003, 0x05004000, - 0x06003001, 0x06000013, 0x04001013, 0x050f801e, - 0x022fa032, 0x07f00000, 0x06601e20, 0x050f80ff, - 0x022fa031, 0x07f00000, 0x07600c1e, 0x050f80ff, - 0x022fa032, 0x02680608, 0x07810309, 0x016408ff, - 0x057dfeff, 0x07ffffff, 0x034000ff, 0x045a0407, - 0x010b40ff, 0x06600908, 0x0669f908, 0x027a0008, - 0x04000120, 0x070aa0ff, 0x024a2408, 0x037a00ff, - 0x06000080, 0x070000ff, 0x02800326, 0x04007013, - 0x06a00370, 0x007a0101, 0x07030000, 0x07303000, - 0x07008190, 0x06006013, 0x02800319, 0x072d0003, - 0x009b8319, 0x010b1000, 0x000b2001, 0x020b3002, - 0x010b4003, 0x020b5004, 0x030b6005, 0x010b7006, - 0x073aa000, 0x07000003, 0x062d0002, 0x00800254, - 0x070ff0f6, 0x03687eff, 0x04818326, 0x050f101e, - 0x070f3000, 0x062d0002, 0x00800254, 0x073aa000, - 0x06000002, 0x072d0003, 0x009b832f, 0x070ff0f6, - 0x036830ff, 0x04818331, 0x070ff0f6, 0x036830ff, - 0x04818334, 0x0660301f, 0x070f00ff, 0x07300c00, - 0x07000005, 0x070f3000, 0x062d0002, 0x00800254, - 0x05474021, 0x04602020, 0x050f80ff, 0x053fa809, - 0x07000003, 0x06780007, 0x07ffff00, 0x07810347, - 0x03455021, 0x06602420, 0x050f80ff, 0x063fa019, - 0x06000002, 0x06003013, 0x01497021, 0x0581835f, - 0x04601020, 0x050f80ff, 0x053fa809, 0x06000001, - 0x0379ff03, 0x070000ff, 0x07420003, 0x04600220, - 0x050f80ff, 0x012fa809, 0x040fe001, 0x02860364, - 0x03200006, 0x0760141b, 0x050f80ff, 0x073fa009, - 0x06000001, 0x04008013, 0x0660181f, 0x050f80ff, - 0x022fa04a, 0x00800257, 0x012080c0, 0x0600901f, - 0x05002021, 0x07a0057d, 0x00800254, 0x06489076, - 0x0681036d, 0x02200020, 0x0280036e, 0x03200000, - 0x06006075, 0x02800376, 0x07489021, 0x07810374, - 0x03200030, 0x02800375, 0x03200011, 0x0600601f, - 0x04a0048f, 0x05600406, 0x050f80ff, 0x053fa809, - 0x06000002, 0x07c00000, 0x04600875, 0x050f80ff, - 0x032fa039, 0x03076000, 0x0107b005, 0x01018006, - 0x0448b076, 0x05818388, 0x06602475, 0x050f80ff, - 0x053fa811, 0x0700003c, 0x00077013, 0x050fe078, - 0x008683a4, 0x06a003a8, 0x029203a7, 0x060ff0fb, - 0x02d0038f, 0x02800394, 0x02800397, 0x0380039a, - 0x0280039d, 0x038003a0, 0x072d0030, 0x009b8394, - 0x01800412, 0x072d00c0, 0x009b8397, 0x01800412, - 0x072d0300, 0x019b839a, 0x01800412, 0x072d0c00, - 0x009b839d, 0x01800412, 0x033d0000, 0x07000003, - 0x019b83a0, 0x01800412, 0x040fd075, 0x050fd078, - 0x06a00591, 0x0380001d, 0x068b03a8, 0x03385000, - 0x07030000, 0x05600818, 0x050f80ff, 0x032fa009, - 0x07f00000, 0x054b0400, 0x0308a0ff, 0x0179fe00, - 0x070000ff, 0x010880ff, 0x0448b076, 0x078103c3, - 0x0560167b, 0x050f80ff, 0x002fa819, 0x02080002, - 0x01081003, 0x064b0001, 0x00082001, 0x02083001, - 0x02079001, 0x0207a001, 0x00084013, 0x0207f013, - 0x00800402, 0x06485076, 0x078103e4, 0x02465076, - 0x06601875, 0x050f80ff, 0x073fa021, 0x0600003e, + 0x04002076, 0x07a00584, 0x01800122, 0x04278001, + 0x05482017, 0x05810148, 0x048b013e, 0x060ff086, + 0x0349f0ff, 0x0581807b, 0x07483017, 0x04810145, + 0x050fd0ff, 0x040fe07f, 0x06a68154, 0x01800122, + 0x05004084, 0x04a0020b, 0x01920122, 0x070ff07d, + 0x0450047c, 0x056004ff, 0x050f80ff, 0x032fa009, + 0x070ff000, 0x00540479, 0x030790ff, 0x0080012c, + 0x04487076, 0x0581015c, 0x04605875, 0x050f80ff, + 0x032fa009, 0x060ff079, 0x01540400, 0x0080015e, + 0x060ff079, 0x0054047a, 0x0582018d, 0x0581018d, 0x070ff07d, 0x0450047c, 0x050f80ff, 0x002fa819, - 0x068b03ce, 0x02080001, 0x00081002, 0x01082003, - 0x03079003, 0x04487076, 0x068103dc, 0x00498076, - 0x03a1840a, 0x04605875, 0x050f80ff, 0x032fa009, - 0x03083000, 0x038003dd, 0x0208307a, 0x0340007e, - 0x0642007f, 0x068103f2, 0x070ff07e, 0x05a00178, - 0x009283f2, 0x01800409, 0x078b03e4, 0x06601875, - 0x050f80ff, 0x073fa041, 0x0600003e, 0x07f00000, - 0x04487076, 0x078103f0, 0x04605875, 0x050f80ff, - 0x032fa009, 0x03083000, 0x00498076, 0x03a1840a, - 0x06602875, 0x050f80ff, 0x073fa009, 0x06000007, - 0x0008400e, 0x04487076, 0x04810402, 0x078b03f9, - 0x04603e75, 0x050f80ff, 0x053fa841, 0x06000045, - 0x068b03fe, 0x02385001, 0x03010000, 0x01800405, - 0x048b0402, 0x03385000, 0x03010000, 0x04278001, - 0x040fe07f, 0x01860409, 0x00800154, 0x07c00000, - 0x04094013, 0x03073072, 0x07440077, 0x040080fb, - 0x006b6108, 0x06009075, 0x07a00578, 0x07c00000, - 0x00683e76, 0x05810417, 0x0448d076, 0x058104bb, - 0x018004f9, 0x07a0056c, 0x028003a7, 0x06000013, - 0x00201001, 0x00202002, 0x0778aae7, 0x06000001, - 0x04810468, 0x050fb000, 0x070ff000, 0x01d00422, - 0x0180043c, 0x00800437, 0x00800432, 0x0180042d, - 0x01800427, 0x077800e7, 0x06000001, 0x05810465, - 0x072e7200, 0x030190cc, 0x00800440, 0x016880e7, - 0x05810465, 0x042e7080, 0x020190cb, 0x00800440, - 0x016820e7, 0x05810465, 0x042e7020, 0x030190ca, - 0x00800440, 0x016808e7, 0x05810465, 0x042e7008, - 0x030190c9, 0x00800440, 0x016802e7, 0x05810465, - 0x042e7002, 0x020190c8, 0x07480077, 0x05810465, - 0x03460077, 0x060ff075, 0x01860465, 0x06003094, - 0x0748a003, 0x07818465, 0x01683e03, 0x02203010, - 0x01540403, 0x014a1a03, 0x060ff073, 0x00540419, - 0x05820472, 0x05810478, 0x050010ff, 0x01540403, - 0x04820454, 0x06003001, 0x034a3c03, 0x017a02ff, - 0x06000c98, 0x040f8073, 0x070fa0ff, 0x070ff003, - 0x06500073, 0x03610072, 0x045c0473, 0x0781845f, - 0x03073072, 0x05394000, 0x07000090, 0x07f00000, - 0x06003094, 0x07489003, 0x07818469, 0x03400000, - 0x076c0a00, 0x0681841c, 0x07c00000, 0x060ff073, - 0x00540419, 0x0581047e, 0x0482047c, 0x01683e03, - 0x02203010, 0x01540403, 0x014a1a03, 0x01800450, - 0x03610072, 0x00540473, 0x057dfeff, 0x07ffffff, - 0x034000ff, 0x01800450, 0x040fd075, 0x040fd073, - 0x040fd019, 0x01800465, 0x040fd075, 0x02800591, + 0x048b0164, 0x02080001, 0x00081002, 0x01082003, + 0x048b0168, 0x04487076, 0x0481016e, 0x02385001, + 0x03010000, 0x00800170, 0x03385000, 0x03010000, + 0x03400078, 0x070ff003, 0x04500479, 0x030790ff, + 0x0340007e, 0x0642007f, 0x0581018d, 0x070ff07e, + 0x050f80ff, 0x032fa009, 0x050fe000, 0x0286818c, + 0x070ff07d, 0x056002ff, 0x050f80ff, 0x032fa009, + 0x0107d000, 0x0186018e, 0x07600a7d, 0x050f80ff, + 0x032fa009, 0x03681e00, 0x0550041b, 0x050f80ff, + 0x032fa009, 0x0107e000, 0x070ff07e, 0x01800178, + 0x0307c000, 0x07c00000, 0x052e400c, 0x040080fb, + 0x046aa108, 0x06009075, 0x04002076, 0x03800584, + 0x060ff075, 0x018601d4, 0x060ff073, 0x00540419, + 0x048201ab, 0x058101b7, 0x050010ff, 0x00202010, + 0x00642001, 0x0782819f, 0x04002001, 0x040f8073, + 0x024a3c02, 0x017a02ff, 0x06000c98, 0x070fa0ff, + 0x060ff002, 0x06500073, 0x03610072, 0x045c0473, + 0x068181ba, 0x03073072, 0x008001ba, 0x036100ff, + 0x050010ff, 0x03610072, 0x00540473, 0x057dfeff, + 0x07ffffff, 0x01400203, 0x00202010, 0x01642003, + 0x0782819f, 0x05002003, 0x0180019f, 0x04002013, + 0x04001013, 0x01294000, 0x07480077, 0x068181d5, 0x06604e75, 0x050f80ff, 0x053fa809, 0x06000001, 0x07f00000, 0x05601c03, 0x050f80ff, 0x053fa809, - 0x06000001, 0x05481003, 0x07818465, 0x07440077, - 0x040080fb, 0x006b6108, 0x06009075, 0x07a00578, - 0x01800465, 0x0297849d, 0x07602418, 0x050f80ff, - 0x012fa809, 0x06780001, 0x070000ff, 0x075a0000, - 0x05602618, 0x050f80ff, 0x012fa809, 0x060ff001, - 0x0569feff, 0x054b08ff, 0x075a0000, 0x05600418, - 0x050f80ff, 0x012fa809, 0x040fe007, 0x028684a4, - 0x01204000, 0x018004b2, 0x00700101, 0x03010000, - 0x06780001, 0x07ff0000, 0x076c00ff, 0x078184ac, - 0x00700101, 0x03010000, 0x05600418, 0x050f80ff, - 0x012fa80a, 0x06780001, 0x07ff0000, 0x050040ff, - 0x0279ff01, 0x0700ffff, 0x05602618, 0x050f80ff, - 0x073fa009, 0x06000001, 0x0279ff02, 0x0700ffff, - 0x07c00000, 0x04007075, 0x0448b076, 0x048104d5, - 0x06489076, 0x048104c2, 0x03200030, 0x018004c3, + 0x06000001, 0x05481003, 0x078181d1, 0x060ff002, + 0x04500401, 0x016480ff, 0x068281d5, 0x07440077, + 0x040080fb, 0x006b6108, 0x06009075, 0x06a0057f, + 0x008001d5, 0x060ff002, 0x045c0401, 0x068181d5, + 0x01294000, 0x07c00000, 0x040fd075, 0x050fd017, + 0x060ff086, 0x077800ff, 0x07000060, 0x037c00ff, + 0x07000060, 0x078181d8, 0x04487076, 0x058101f5, + 0x07780017, 0x05000400, 0x058101f5, 0x06601875, + 0x050f80ff, 0x073fa022, 0x0600003e, 0x0249a076, + 0x078181ee, 0x048b01e9, 0x04603e75, 0x050f80ff, + 0x053fa842, 0x06000045, 0x052e400c, 0x040080fb, + 0x026b4108, 0x06009075, 0x04002076, 0x07a00584, + 0x03800024, 0x06601875, 0x050f80ff, 0x073fa022, + 0x0600003e, 0x052e400c, 0x04600875, 0x050f80ff, + 0x053fa809, 0x06000001, 0x05488003, 0x05810205, + 0x0400d0fb, 0x066a810d, 0x013e4000, 0x07000300, + 0x03800024, 0x040080fb, 0x066a8108, 0x06009075, + 0x04002076, 0x07a00584, 0x03800024, 0x0240007f, + 0x0742007e, 0x050f807e, 0x032fa009, 0x050fe000, + 0x02868225, 0x070ff07d, 0x055c047b, 0x0481021a, + 0x0760007d, 0x050f80ff, 0x032fa009, 0x050fe000, + 0x0286821a, 0x070ff07b, 0x0107d0ff, 0x07600a7d, + 0x050f80ff, 0x032fa009, 0x03681e00, 0x0450041c, + 0x0107e0ff, 0x050f80ff, 0x032fa009, 0x050fe000, + 0x01860227, 0x0307c000, 0x07c00000, 0x040fd075, + 0x02800598, 0x0460081f, 0x050f80ff, 0x032fa039, + 0x01021000, 0x03020005, 0x01018006, 0x01683e21, + 0x00d00231, 0x00800251, 0x0080027c, 0x01800299, + 0x03800311, 0x01800255, 0x00800251, 0x00800251, + 0x00800251, 0x00800251, 0x00800251, 0x00800251, + 0x00800251, 0x00800251, 0x00800251, 0x0380032d, + 0x00800251, 0x00800251, 0x00800251, 0x00800251, + 0x00800251, 0x00800251, 0x00800251, 0x00800251, + 0x00800251, 0x00800251, 0x00800251, 0x00800251, + 0x00800251, 0x00800251, 0x00800251, 0x00800251, + 0x00800251, 0x050fd0ff, 0x06a00598, 0x03800018, + 0x0380001d, 0x01494021, 0x0481833e, 0x0400701f, + 0x06a00370, 0x007a0101, 0x07060000, 0x07303000, + 0x07008290, 0x03496021, 0x06818261, 0x06006013, + 0x00800268, 0x02400010, 0x04810261, 0x06006010, + 0x0660361f, 0x050f80ff, 0x073fa00a, 0x07000003, + 0x072d0003, 0x029b8268, 0x010b1000, 0x000b2001, + 0x020b3002, 0x010b4003, 0x020b5004, 0x030b6005, + 0x010b7006, 0x063aa020, 0x07000012, 0x070ff0f6, + 0x03687eff, 0x06818273, 0x06601220, 0x050f10ff, + 0x063f3008, 0x06000008, 0x062d0002, 0x00800254, + 0x04007013, 0x06a00370, 0x007a0101, 0x07050000, + 0x07303000, 0x07008890, 0x074d0005, 0x06006013, + 0x072d0003, 0x039b8284, 0x010b1000, 0x000b2001, + 0x020b3002, 0x010b4003, 0x020b5004, 0x030b6005, + 0x010b7006, 0x04601c20, 0x050f80ff, 0x022fa019, + 0x04001002, 0x04002013, 0x050f801e, 0x022fa01a, + 0x073aa00c, 0x07000012, 0x07300003, 0x06000008, + 0x02800326, 0x04007013, 0x06a00370, 0x007a0101, + 0x03070000, 0x04602c1f, 0x050f80ff, 0x073fa009, + 0x06000004, 0x02499008, 0x058102a6, 0x07303000, + 0x07008890, 0x008002a8, 0x07303000, 0x04008980, + 0x05007003, 0x074d0005, 0x06006013, 0x072d0003, + 0x029b82ab, 0x010b1000, 0x000b2001, 0x020b3002, + 0x010b4003, 0x020b5004, 0x030b6005, 0x010b7006, + 0x04601620, 0x050f80ff, 0x032fa021, 0x07f00000, + 0x064b0002, 0x02499008, 0x048102bc, 0x0644c002, + 0x054b0400, 0x050040ff, 0x06698104, 0x078182d1, + 0x06000013, 0x04001013, 0x04780102, 0x06000010, + 0x06003013, 0x04004013, 0x06005013, 0x06006013, + 0x04007013, 0x00644015, 0x048202cd, 0x04448002, + 0x02205008, 0x050f801e, 0x032fa042, 0x04008015, + 0x03800309, 0x046c8004, 0x068182df, 0x01208018, + 0x06780002, 0x07000003, 0x078182e2, 0x06003001, + 0x06000013, 0x04001013, 0x04004013, 0x06005013, + 0x050f801e, 0x022fa032, 0x03800309, 0x040fd01f, + 0x06a00598, 0x03800018, 0x0379ff03, 0x070000ff, + 0x04488002, 0x048102e9, 0x070ff003, 0x04500408, + 0x050080ff, 0x0379ff00, 0x070000ff, 0x06489002, + 0x058102f0, 0x070ff000, 0x04500408, 0x050080ff, + 0x07005003, 0x05004000, 0x06003001, 0x06000013, + 0x04001013, 0x050f801e, 0x022fa032, 0x07f00000, + 0x06601e20, 0x050f80ff, 0x022fa031, 0x07f00000, + 0x07600c1e, 0x050f80ff, 0x022fa032, 0x02680608, + 0x07810309, 0x016408ff, 0x057dfeff, 0x07ffffff, + 0x034000ff, 0x045a0407, 0x010b40ff, 0x06600908, + 0x0669f908, 0x027a0008, 0x04000120, 0x070aa0ff, + 0x024a2408, 0x037a00ff, 0x06000080, 0x070000ff, + 0x02800326, 0x04007013, 0x06a00370, 0x007a0101, + 0x07030000, 0x07303000, 0x07008190, 0x06006013, + 0x02800319, 0x072d0003, 0x009b8319, 0x010b1000, + 0x000b2001, 0x020b3002, 0x010b4003, 0x020b5004, + 0x030b6005, 0x010b7006, 0x073aa000, 0x07000003, + 0x062d0002, 0x00800254, 0x070ff0f6, 0x03687eff, + 0x04818326, 0x050f101e, 0x070f3000, 0x062d0002, + 0x00800254, 0x073aa000, 0x06000002, 0x072d0003, + 0x009b832f, 0x070ff0f6, 0x036830ff, 0x04818331, + 0x070ff0f6, 0x036830ff, 0x04818334, 0x0660301f, + 0x070f00ff, 0x07300c00, 0x07000005, 0x070f3000, + 0x062d0002, 0x00800254, 0x05474021, 0x04602020, + 0x050f80ff, 0x053fa809, 0x07000003, 0x06780007, + 0x07ffff00, 0x07810347, 0x03455021, 0x06602420, + 0x050f80ff, 0x063fa019, 0x06000002, 0x06003013, + 0x01497021, 0x0581835f, 0x04601020, 0x050f80ff, + 0x053fa809, 0x06000001, 0x0379ff03, 0x070000ff, + 0x07420003, 0x04600220, 0x050f80ff, 0x012fa809, + 0x040fe001, 0x02860364, 0x03200006, 0x0760141b, + 0x050f80ff, 0x073fa009, 0x06000001, 0x04008013, + 0x0660181f, 0x050f80ff, 0x022fa04a, 0x00800257, + 0x012080c0, 0x0600901f, 0x05002021, 0x07a00584, + 0x00800254, 0x06489076, 0x0681036d, 0x02200020, + 0x0280036e, 0x03200000, 0x06006075, 0x02800376, + 0x07489021, 0x07810374, 0x03200030, 0x02800375, + 0x03200011, 0x0600601f, 0x04a0048f, 0x05600406, + 0x050f80ff, 0x053fa809, 0x06000002, 0x07c00000, + 0x04600875, 0x050f80ff, 0x032fa039, 0x03076000, + 0x0107b005, 0x01018006, 0x0448b076, 0x05818388, + 0x06602475, 0x050f80ff, 0x053fa811, 0x0700003c, + 0x00077013, 0x050fe078, 0x008683a4, 0x06a003a8, + 0x029203a7, 0x060ff0fb, 0x02d0038f, 0x02800394, + 0x02800397, 0x0380039a, 0x0280039d, 0x038003a0, + 0x072d0030, 0x009b8394, 0x01800412, 0x072d00c0, + 0x009b8397, 0x01800412, 0x072d0300, 0x019b839a, + 0x01800412, 0x072d0c00, 0x009b839d, 0x01800412, + 0x033d0000, 0x07000003, 0x019b83a0, 0x01800412, + 0x040fd075, 0x050fd078, 0x06a00598, 0x0380001d, + 0x068b03a8, 0x03385000, 0x07030000, 0x05600818, + 0x050f80ff, 0x032fa009, 0x07f00000, 0x054b0400, + 0x0308a0ff, 0x0179fe00, 0x070000ff, 0x010880ff, + 0x0448b076, 0x078103c3, 0x0560167b, 0x050f80ff, + 0x002fa819, 0x02080002, 0x01081003, 0x064b0001, + 0x00082001, 0x02083001, 0x02079001, 0x0207a001, + 0x00084013, 0x0207f013, 0x00800402, 0x06485076, + 0x078103e4, 0x02465076, 0x06601875, 0x050f80ff, + 0x073fa021, 0x0600003e, 0x070ff07d, 0x0450047c, + 0x050f80ff, 0x002fa819, 0x068b03ce, 0x02080001, + 0x00081002, 0x01082003, 0x03079003, 0x04487076, + 0x068103dc, 0x00498076, 0x03a1840a, 0x04605875, + 0x050f80ff, 0x032fa009, 0x03083000, 0x038003dd, + 0x0208307a, 0x0340007e, 0x0642007f, 0x068103f2, + 0x070ff07e, 0x05a00178, 0x009283f2, 0x01800409, + 0x078b03e4, 0x06601875, 0x050f80ff, 0x073fa041, + 0x0600003e, 0x07f00000, 0x04487076, 0x078103f0, + 0x04605875, 0x050f80ff, 0x032fa009, 0x03083000, + 0x00498076, 0x03a1840a, 0x06602875, 0x050f80ff, + 0x073fa009, 0x06000007, 0x0008400e, 0x04487076, + 0x04810402, 0x078b03f9, 0x04603e75, 0x050f80ff, + 0x053fa841, 0x06000045, 0x068b03fe, 0x02385001, + 0x03010000, 0x01800405, 0x048b0402, 0x03385000, + 0x03010000, 0x04278001, 0x040fe07f, 0x01860409, + 0x00800154, 0x07c00000, 0x04094013, 0x03073072, + 0x07440077, 0x040080fb, 0x006b6108, 0x06009075, + 0x06a0057f, 0x07c00000, 0x00683e76, 0x05810417, + 0x0448d076, 0x048104c2, 0x03800500, 0x06a00573, + 0x028003a7, 0x06000013, 0x00201001, 0x00202002, + 0x0778aae7, 0x06000001, 0x04810468, 0x050fb000, + 0x070ff000, 0x01d00422, 0x0180043c, 0x00800437, + 0x00800432, 0x0180042d, 0x01800427, 0x077800e7, + 0x06000001, 0x05810465, 0x072e7200, 0x030190cc, + 0x00800440, 0x016880e7, 0x05810465, 0x042e7080, + 0x020190cb, 0x00800440, 0x016820e7, 0x05810465, + 0x042e7020, 0x030190ca, 0x00800440, 0x016808e7, + 0x05810465, 0x042e7008, 0x030190c9, 0x00800440, + 0x016802e7, 0x05810465, 0x042e7002, 0x020190c8, + 0x07480077, 0x05810465, 0x03460077, 0x060ff075, + 0x01860465, 0x06003094, 0x0748a003, 0x07818465, + 0x01683e03, 0x02203010, 0x01540403, 0x014a1a03, + 0x060ff073, 0x00540419, 0x05820472, 0x05810478, + 0x050010ff, 0x01540403, 0x04820454, 0x06003001, + 0x034a3c03, 0x017a02ff, 0x06000c98, 0x040f8073, + 0x070fa0ff, 0x070ff003, 0x06500073, 0x03610072, + 0x045c0473, 0x0781845f, 0x03073072, 0x05394000, + 0x07000090, 0x07f00000, 0x06003094, 0x07489003, + 0x07818469, 0x03400000, 0x076c0a00, 0x0681841c, + 0x07c00000, 0x060ff073, 0x00540419, 0x0581047e, + 0x0482047c, 0x01683e03, 0x02203010, 0x01540403, + 0x014a1a03, 0x01800450, 0x03610072, 0x00540473, + 0x057dfeff, 0x07ffffff, 0x034000ff, 0x01800450, + 0x040fd075, 0x040fd073, 0x040fd019, 0x01800465, + 0x040fd075, 0x02800598, 0x06604e75, 0x050f80ff, + 0x053fa809, 0x06000001, 0x07f00000, 0x05601c03, + 0x050f80ff, 0x053fa809, 0x06000001, 0x05481003, + 0x07818465, 0x07440077, 0x040080fb, 0x006b6108, + 0x06009075, 0x06a0057f, 0x01800465, 0x0297849d, + 0x07602418, 0x050f80ff, 0x012fa809, 0x06780001, + 0x070000ff, 0x075a0000, 0x05602618, 0x050f80ff, + 0x012fa809, 0x060ff001, 0x0569feff, 0x054b08ff, + 0x075a0000, 0x05600418, 0x050f80ff, 0x012fa809, + 0x040fe007, 0x028684a4, 0x01204000, 0x008004b9, + 0x05600e06, 0x050f80ff, 0x073fa009, 0x06000002, + 0x07f00000, 0x064d0004, 0x00700104, 0x03010000, + 0x06780004, 0x07ff0000, 0x076c00ff, 0x078184b2, + 0x00700104, 0x03010000, 0x064d0004, 0x05600e06, + 0x050f80ff, 0x073fa00a, 0x06000002, 0x07f00000, + 0x044b0804, 0x0279ff01, 0x0700ffff, 0x05602618, + 0x050f80ff, 0x073fa009, 0x06000001, 0x0279ff02, + 0x0700ffff, 0x07c00000, 0x04007075, 0x0448b076, + 0x048104dc, 0x06489076, 0x058104c9, 0x03200030, + 0x018004ca, 0x03200011, 0x06006075, 0x06a00376, + 0x007a0101, 0x07060000, 0x07303000, 0x07008290, + 0x02496076, 0x078184d4, 0x06006013, 0x008004ef, + 0x02400010, 0x058104d4, 0x06006010, 0x06603675, + 0x050f80ff, 0x073fa00a, 0x07000003, 0x008004ef, + 0x0600007a, 0x02493076, 0x068184e5, 0x06602e75, + 0x050f80ff, 0x032fa009, 0x060ff07a, 0x05500400, + 0x070000ff, 0x06473076, 0x06602e75, 0x050f80ff, + 0x032fa00a, 0x07a00369, 0x007a0101, 0x03010000, + 0x06303008, 0x05008000, 0x0600600e, 0x072d0003, + 0x029b84ef, 0x050a4000, 0x060a5001, 0x060a6002, + 0x050a7003, 0x040a8004, 0x070a9005, 0x050ae006, + 0x053079a0, 0x0600000e, 0x06489076, 0x048104fd, + 0x06446007, 0x060a0007, 0x062d0002, 0x028003a7, + 0x00683e76, 0x076c0aff, 0x0681052f, 0x04007013, + 0x06489076, 0x06810508, 0x03200030, 0x03800509, 0x03200011, 0x06006075, 0x06a00376, 0x007a0101, - 0x07060000, 0x07303000, 0x07008290, 0x02496076, - 0x068184cd, 0x06006013, 0x018004e8, 0x02400010, - 0x048104cd, 0x06006010, 0x06603675, 0x050f80ff, - 0x073fa00a, 0x07000003, 0x018004e8, 0x0600007a, - 0x02493076, 0x078184de, 0x06602e75, 0x050f80ff, - 0x032fa009, 0x060ff07a, 0x05500400, 0x070000ff, - 0x06473076, 0x06602e75, 0x050f80ff, 0x032fa00a, - 0x07a00369, 0x007a0101, 0x03010000, 0x06303008, - 0x05008000, 0x0600600e, 0x072d0003, 0x039b84e8, + 0x03070000, 0x04602c75, 0x050f80ff, 0x053fa809, + 0x06000001, 0x03499003, 0x07810518, 0x07303000, + 0x07008890, 0x053079a0, 0x0700000c, 0x0280051c, + 0x07303000, 0x04008980, 0x04307920, 0x0700000c, + 0x074d0005, 0x06006013, 0x072d0003, 0x019b851e, 0x050a4000, 0x060a5001, 0x060a6002, 0x050a7003, - 0x040a8004, 0x070a9005, 0x050ae006, 0x053079a0, - 0x0600000e, 0x06489076, 0x058104f6, 0x06446007, - 0x060a0007, 0x062d0002, 0x028003a7, 0x00683e76, - 0x076c0aff, 0x07810528, 0x04007013, 0x06489076, - 0x06810501, 0x03200030, 0x02800502, 0x03200011, - 0x06006075, 0x06a00376, 0x007a0101, 0x03070000, - 0x04602c75, 0x050f80ff, 0x053fa809, 0x06000001, - 0x03499003, 0x07810511, 0x07303000, 0x07008890, - 0x053079a0, 0x0700000c, 0x02800515, 0x07303000, - 0x04008980, 0x04307920, 0x0700000c, 0x074d0005, - 0x06006013, 0x072d0003, 0x019b8517, 0x050a4000, + 0x040a8004, 0x070a9005, 0x050ae006, 0x007a0107, + 0x06000020, 0x06489076, 0x0681052c, 0x06446007, + 0x060a0007, 0x062d0002, 0x028003a7, 0x06602e75, + 0x050f80ff, 0x032fa009, 0x060ff07a, 0x05500400, + 0x070000ff, 0x06473076, 0x06602e75, 0x050f80ff, + 0x032fa00a, 0x04007075, 0x07a00369, 0x007a0101, + 0x03010000, 0x06303008, 0x07008800, 0x074d0005, + 0x06600a75, 0x050f80ff, 0x073fa009, 0x07000003, + 0x07f00000, 0x054b0406, 0x045a0404, 0x050040ff, + 0x0600600e, 0x072d0003, 0x009b8549, 0x050a4000, 0x060a5001, 0x060a6002, 0x050a7003, 0x040a8004, - 0x070a9005, 0x050ae006, 0x007a0107, 0x06000020, - 0x06489076, 0x06810525, 0x06446007, 0x060a0007, - 0x062d0002, 0x028003a7, 0x06602e75, 0x050f80ff, - 0x032fa009, 0x060ff07a, 0x05500400, 0x070000ff, - 0x06473076, 0x06602e75, 0x050f80ff, 0x032fa00a, - 0x04007075, 0x07a00369, 0x007a0101, 0x03010000, - 0x06303008, 0x07008800, 0x074d0005, 0x06600a75, - 0x050f80ff, 0x073fa009, 0x07000003, 0x07f00000, - 0x054b0406, 0x045a0404, 0x050040ff, 0x0600600e, - 0x072d0003, 0x019b8542, 0x050a4000, 0x060a5001, - 0x060a6002, 0x050a7003, 0x040a8004, 0x070a9005, - 0x050ae006, 0x04307920, 0x0600000e, 0x06307d20, - 0x0600000e, 0x0648c076, 0x05818553, 0x04307920, - 0x0600000e, 0x06489076, 0x07810556, 0x06446007, - 0x060a0007, 0x062d0002, 0x028003a7, 0x072d0003, - 0x019b8559, 0x070ff0f6, 0x03687eff, 0x0481855b, - 0x050f2074, 0x06489076, 0x06810562, 0x06446007, - 0x060a0007, 0x040070fb, 0x046a7007, 0x050f40ff, - 0x062d0002, 0x028003a7, 0x01208060, 0x0600901f, - 0x05002021, 0x0380057d, 0x040080fb, 0x066ae108, - 0x06009075, 0x04002076, 0x0380057d, 0x03201100, - 0x04848576, 0x06420001, 0x05818572, 0x02800594, - 0x020e0008, 0x07c00000, 0x03201100, 0x0484858a, - 0x06420001, 0x04818579, 0x02800594, 0x050fd009, - 0x040fd008, 0x03201100, 0x05848584, 0x06420001, - 0x04818580, 0x02800594, 0x007a0102, 0x04000101, - 0x05600809, 0x050f80ff, 0x073fa00a, 0x06000001, - 0x020e0008, 0x0784058e, 0x030e0009, 0x07c00000, - 0x01011009, 0x052e4300, 0x07c00000, 0x052e400f, - 0x01208090, 0x03800571, 0x070fc0ff, 0x040f8013, - 0x032fa009, 0x02800597, 0x32e23120, 0x02800004, - 0x00000000, 0x0000a000, 0x0000059b, 0x033d0aaa, - 0x070aaaaa, 0x013d1aaa, 0x070aaaaa, 0x028c03ce, - 0x048e0445, 0x048d0451, 0x018f04b8, 0x02910013, - 0x040f7029, 0x02860013, 0x066c001f, 0x048104d3, - 0x066c0a1f, 0x07810500, 0x040f702f, 0x0386001d, - 0x06000010, 0x050fb000, 0x066c0079, 0x07810541, - 0x0398001d, 0x03400000, 0x076c0a00, 0x04818016, - 0x07960021, 0x05998021, 0x06a0009e, 0x02800008, - 0x050f7012, 0x05a683a9, 0x04908008, 0x030150e1, - 0x06780015, 0x07fffff0, 0x06810064, 0x0079fe15, - 0x031fffff, 0x030160ff, 0x064bd415, 0x03d0002d, - 0x01800174, 0x028000c2, 0x03800035, 0x02800040, - 0x0380004b, 0x03800056, 0x02800076, 0x02800076, - 0x040f7025, 0x01868039, 0x02026016, 0x0280003d, - 0x06600025, 0x050f80ff, 0x073fa00a, 0x0600000b, - 0x02025016, 0x02400029, 0x03800078, 0x050f7021, - 0x01868044, 0x00022016, 0x03800048, 0x07600021, - 0x050f80ff, 0x073fa00a, 0x0600000b, 0x00021016, - 0x02400029, 0x03800078, 0x040f7023, 0x0086804f, - 0x00024016, 0x03800053, 0x06600023, 0x050f80ff, - 0x073fa00a, 0x0600000b, 0x02023016, 0x02400029, - 0x03800078, 0x04600816, 0x050f80ff, 0x012fa839, - 0x06780004, 0x07ffff00, 0x037c00ff, 0x05000700, - 0x06810062, 0x0448e001, 0x04818062, 0x07a000a9, - 0x03800078, 0x040fd016, 0x03800078, 0x0279f015, - 0x07ffffff, 0x04818076, 0x060ff015, 0x03d00069, - 0x03800071, 0x02800073, 0x02800076, 0x02800076, + 0x070a9005, 0x050ae006, 0x04307920, 0x0600000e, + 0x06307d20, 0x0600000e, 0x0648c076, 0x0581855a, + 0x04307920, 0x0600000e, 0x06489076, 0x0681055d, + 0x06446007, 0x060a0007, 0x062d0002, 0x028003a7, + 0x072d0003, 0x019b8560, 0x070ff0f6, 0x03687eff, + 0x04818562, 0x050f2074, 0x06489076, 0x07810569, + 0x06446007, 0x060a0007, 0x040070fb, 0x046a7007, + 0x050f40ff, 0x062d0002, 0x028003a7, 0x01208060, + 0x0600901f, 0x05002021, 0x03800584, 0x040080fb, + 0x066ae108, 0x06009075, 0x04002076, 0x03800584, + 0x03201100, 0x0584857d, 0x06420001, 0x04818579, + 0x0280059b, 0x020e0008, 0x07c00000, 0x03201100, + 0x04848591, 0x06420001, 0x04818580, 0x0280059b, + 0x050fd009, 0x040fd008, 0x03201100, 0x0584858b, + 0x06420001, 0x05818587, 0x0280059b, 0x007a0102, + 0x04000101, 0x05600809, 0x050f80ff, 0x073fa00a, + 0x06000001, 0x020e0008, 0x07840595, 0x030e0009, + 0x07c00000, 0x01011009, 0x052e4300, 0x07c00000, + 0x052e400f, 0x01208090, 0x03800578, 0x070fc0ff, + 0x040f8013, 0x032fa009, 0x0280059e, 0x07d53768, + 0x02800004, 0x00000000, 0x0000a000, 0x000005a3, + 0x033d0aaa, 0x070aaaaa, 0x013d1aaa, 0x070aaaaa, + 0x028c03d6, 0x058e044d, 0x058d0459, 0x018f04c0, + 0x02910013, 0x040f7029, 0x02860013, 0x066c001f, + 0x058104db, 0x066c0a1f, 0x06810508, 0x040f702f, + 0x0386001d, 0x06000010, 0x050fb000, 0x066c0079, + 0x06810549, 0x0398001d, 0x03400000, 0x076c0a00, + 0x04818016, 0x07960021, 0x05998021, 0x06a0009e, + 0x02800008, 0x050f7012, 0x05a683b1, 0x04908008, + 0x030150e1, 0x06780015, 0x07fffff0, 0x06810064, + 0x0079fe15, 0x031fffff, 0x030160ff, 0x064bd415, + 0x03d0002d, 0x01800174, 0x028000c2, 0x03800035, + 0x02800040, 0x0380004b, 0x03800056, 0x02800076, + 0x02800076, 0x040f7025, 0x01868039, 0x02026016, + 0x0280003d, 0x06600025, 0x050f80ff, 0x073fa00a, + 0x0600000b, 0x02025016, 0x02400029, 0x03800078, + 0x050f7021, 0x01868044, 0x00022016, 0x03800048, + 0x07600021, 0x050f80ff, 0x073fa00a, 0x0600000b, + 0x00021016, 0x02400029, 0x03800078, 0x040f7023, + 0x0086804f, 0x00024016, 0x03800053, 0x06600023, + 0x050f80ff, 0x073fa00a, 0x0600000b, 0x02023016, + 0x02400029, 0x03800078, 0x04600816, 0x050f80ff, + 0x012fa839, 0x06780004, 0x07ffff00, 0x037c00ff, + 0x05000700, 0x06810062, 0x0448e001, 0x04818062, + 0x07a000a9, 0x03800078, 0x040fd016, 0x03800078, + 0x0279f015, 0x07ffffff, 0x04818076, 0x060ff015, + 0x03d00069, 0x03800071, 0x02800073, 0x02800076, 0x02800076, 0x02800076, 0x02800076, 0x02800076, - 0x03e00000, 0x02800008, 0x04908073, 0x010140e1, - 0x03800078, 0x060fc010, 0x07a00593, 0x02800008, - 0x072e4800, 0x03016011, 0x0186807e, 0x060fc010, - 0x07c00000, 0x00011010, 0x0647f016, 0x072d000c, - 0x009b8080, 0x04600816, 0x050f80ff, 0x012fa839, - 0x0249f001, 0x04818097, 0x06780004, 0x07ffff00, - 0x037c00ff, 0x07000300, 0x0481809b, 0x0448e001, - 0x0481809b, 0x0079c101, 0x07ffffff, 0x007a0b01, - 0x03800000, 0x04600816, 0x050f80ff, 0x012fa80a, - 0x062d0008, 0x038000a9, 0x062d0008, 0x00011016, - 0x052e4c00, 0x07c00000, 0x062d0008, 0x040fd016, - 0x07c00000, 0x030160eb, 0x0249f016, 0x0481807f, - 0x04600816, 0x050f80ff, 0x012fa839, 0x06783f01, - 0x03800060, 0x007c0b01, 0x03800000, 0x0581809c, - 0x06601807, 0x070030ff, 0x050f80ff, 0x012fa809, - 0x050f8003, 0x073fa00a, 0x0600000b, 0x040f7001, - 0x038600b7, 0x04600201, 0x050f80ff, 0x073fa00a, - 0x0600000b, 0x07c00000, 0x050f702e, 0x008680bc, - 0x0002e016, 0x0202f016, 0x028000c1, 0x0760002e, - 0x050f80ff, 0x073fa00a, 0x0600000b, 0x0002e016, - 0x07c00000, 0x0430e004, 0x03080000, 0x06601216, - 0x050f80ff, 0x073fa011, 0x07000005, 0x07f00000, - 0x0660000b, 0x050f80ff, 0x022fa019, 0x0700c000, - 0x0279ff02, 0x0700ffff, 0x00017002, 0x0760220a, - 0x050f80ff, 0x012fa809, 0x0079fe01, 0x0700ffff, - 0x055c0417, 0x06818162, 0x0400d010, 0x0548e00c, - 0x078100db, 0x0245600e, 0x0548400c, 0x068100e3, - 0x07300000, 0x05001000, 0x04602c16, 0x050f80ff, - 0x032fa00a, 0x0644900e, 0x07600a0a, 0x050f80ff, - 0x032fa039, 0x02015002, 0x064b0015, 0x0379ff03, - 0x070000ff, 0x01018003, 0x05420418, 0x058180ee, - 0x0045700e, 0x0179fe06, 0x070000ff, 0x0700f0ff, - 0x06006010, 0x04007010, 0x0760220a, 0x050f80ff, - 0x073fa009, 0x06000004, 0x07f00000, 0x064b8408, - 0x040080ce, 0x04500408, 0x050f80ff, 0x073fa009, - 0x06000004, 0x07f00000, 0x04603216, 0x050f80ff, - 0x063fa02a, 0x06000002, 0x0769ff00, 0x076c9000, - 0x04810108, 0x076cd400, 0x07818109, 0x0444b00e, - 0x0368060f, 0x00d0010b, 0x00800115, 0x00800110, - 0x01800117, 0x0180010f, 0x00800162, 0x007a010e, - 0x07001800, 0x076c3000, 0x03a1829a, 0x07818147, - 0x0220f002, 0x0180011e, 0x0120d081, 0x007a010e, - 0x05001000, 0x076c3000, 0x03a1829a, 0x07818147, - 0x0220f004, 0x0548400c, 0x04810125, 0x0220f00e, - 0x0444100d, 0x0748600c, 0x04810125, 0x0444200d, - 0x0548700c, 0x05810128, 0x0644900d, 0x024a1815, - 0x004a2c15, 0x04500415, 0x070030ff, 0x0700000f, - 0x017a0100, 0x05004000, 0x0400100e, 0x05304000, - 0x07000030, 0x04002010, 0x0600500d, 0x0700600a, - 0x0400700b, 0x05008017, 0x06600616, 0x050f80ff, - 0x022fa04a, 0x0448b00e, 0x05818056, 0x050f7027, - 0x02868140, 0x00028016, 0x01800144, 0x07600027, - 0x050f80ff, 0x073fa00a, 0x0600000b, 0x00027016, - 0x02400029, 0x03800078, 0x040fd016, 0x050fd00a, - 0x07600a0a, 0x050f80ff, 0x032fa009, 0x05780100, - 0x07ffff00, 0x017a0700, 0x06000001, 0x050f80ff, - 0x032fa00a, 0x07f00000, 0x05600e0a, 0x050f80ff, - 0x022fa019, 0x05780100, 0x07ffff00, 0x076a0500, - 0x00202001, 0x0560200a, 0x050f80ff, 0x012fa809, - 0x06003010, 0x05600e0a, 0x050f80ff, 0x032fa022, - 0x0180016c, 0x050fd00a, 0x07600a0a, 0x050f80ff, - 0x032fa009, 0x0379ff00, 0x0380ffff, 0x0145b000, - 0x07600a0a, 0x050f80ff, 0x032fa00a, 0x07303000, - 0x07000030, 0x04600e16, 0x050f80ff, 0x053fa80a, - 0x06000001, 0x06a00398, 0x03800078, 0x06600616, - 0x050f80ff, 0x012fa841, 0x0079fe01, 0x070000ff, - 0x070090ff, 0x0500d006, 0x0600a007, 0x0400b008, - 0x07600a0a, 0x050f80ff, 0x032fa009, 0x0769ff00, - 0x0660000b, 0x050f80ff, 0x073fa009, 0x07000006, - 0x07f00000, 0x04602c16, 0x050f80ff, 0x053fa809, - 0x0600000b, 0x07479017, 0x056c0e09, 0x0481018f, - 0x076c0c09, 0x01a18593, 0x0560160a, 0x050f80ff, - 0x053fa809, 0x06000007, 0x07f00000, 0x074b000f, - 0x0368060f, 0x00d00197, 0x0080019b, 0x01800214, - 0x018001d1, 0x0180023c, 0x0748f00f, 0x0581023a, - 0x0400d010, 0x0530e042, 0x02080002, 0x0578400f, - 0x06000020, 0x017c40ff, 0x06000020, 0x068181a8, - 0x0748500c, 0x048101a8, 0x03459017, 0x04602c16, + 0x02800076, 0x03e00000, 0x02800008, 0x04908073, + 0x010140e1, 0x03800078, 0x060fc010, 0x06a0059b, + 0x02800008, 0x072e4800, 0x03016011, 0x0186807e, + 0x060fc010, 0x07c00000, 0x00011010, 0x0647f016, + 0x072d000c, 0x009b8080, 0x04600816, 0x050f80ff, + 0x012fa839, 0x0249f001, 0x04818097, 0x06780004, + 0x07ffff00, 0x037c00ff, 0x07000300, 0x0481809b, + 0x0448e001, 0x0481809b, 0x0079c101, 0x07ffffff, + 0x007a0b01, 0x03800000, 0x04600816, 0x050f80ff, + 0x012fa80a, 0x062d0008, 0x038000a9, 0x062d0008, + 0x00011016, 0x052e4c00, 0x07c00000, 0x062d0008, + 0x040fd016, 0x07c00000, 0x030160eb, 0x0249f016, + 0x0481807f, 0x04600816, 0x050f80ff, 0x012fa839, + 0x06783f01, 0x03800060, 0x007c0b01, 0x03800000, + 0x0581809c, 0x06601807, 0x070030ff, 0x050f80ff, + 0x012fa809, 0x050f8003, 0x073fa00a, 0x0600000b, + 0x040f7001, 0x038600b7, 0x04600201, 0x050f80ff, + 0x073fa00a, 0x0600000b, 0x07c00000, 0x050f702e, + 0x008680bc, 0x0002e016, 0x0202f016, 0x028000c1, + 0x0760002e, 0x050f80ff, 0x073fa00a, 0x0600000b, + 0x0002e016, 0x07c00000, 0x0430e004, 0x03080000, + 0x06601216, 0x050f80ff, 0x073fa011, 0x07000005, + 0x07f00000, 0x0660000b, 0x050f80ff, 0x022fa019, + 0x0700c000, 0x0279ff02, 0x0700ffff, 0x00017002, + 0x0760220a, 0x050f80ff, 0x012fa809, 0x0079fe01, + 0x0700ffff, 0x055c0417, 0x06818162, 0x0400d010, + 0x0548e00c, 0x078100db, 0x0245600e, 0x0548400c, + 0x068100e3, 0x07300000, 0x05001000, 0x04602c16, + 0x050f80ff, 0x032fa00a, 0x0644900e, 0x07600a0a, + 0x050f80ff, 0x032fa039, 0x02015002, 0x064b0015, + 0x0379ff03, 0x070000ff, 0x01018003, 0x05420418, + 0x058180ee, 0x0045700e, 0x0179fe06, 0x070000ff, + 0x0700f0ff, 0x06006010, 0x04007010, 0x0760220a, + 0x050f80ff, 0x073fa009, 0x06000004, 0x07f00000, + 0x064b8408, 0x040080ce, 0x04500408, 0x050f80ff, + 0x073fa009, 0x06000004, 0x07f00000, 0x04603216, + 0x050f80ff, 0x063fa02a, 0x06000002, 0x0769ff00, + 0x076c9000, 0x04810108, 0x076cd400, 0x07818109, + 0x0444b00e, 0x0368060f, 0x00d0010b, 0x00800115, + 0x00800110, 0x01800117, 0x0180010f, 0x00800162, + 0x007a010e, 0x07001800, 0x076c3000, 0x02a182a2, + 0x07818147, 0x0220f002, 0x0180011e, 0x0120d081, + 0x007a010e, 0x05001000, 0x076c3000, 0x02a182a2, + 0x07818147, 0x0220f004, 0x0548400c, 0x04810125, + 0x0220f00e, 0x0444100d, 0x0748600c, 0x04810125, + 0x0444200d, 0x0548700c, 0x05810128, 0x0644900d, + 0x024a1815, 0x004a2c15, 0x04500415, 0x070030ff, + 0x0700000f, 0x017a0100, 0x05004000, 0x0400100e, + 0x05304000, 0x07000030, 0x04002010, 0x0600500d, + 0x0700600a, 0x0400700b, 0x05008017, 0x06600616, + 0x050f80ff, 0x022fa04a, 0x0448b00e, 0x05818056, + 0x050f7027, 0x02868140, 0x00028016, 0x01800144, + 0x07600027, 0x050f80ff, 0x073fa00a, 0x0600000b, + 0x00027016, 0x02400029, 0x03800078, 0x040fd016, + 0x050fd00a, 0x07600a0a, 0x050f80ff, 0x032fa009, + 0x05780100, 0x07ffff00, 0x017a0700, 0x06000001, + 0x050f80ff, 0x032fa00a, 0x07f00000, 0x05600e0a, + 0x050f80ff, 0x022fa019, 0x05780100, 0x07ffff00, + 0x076a0500, 0x00202001, 0x0560200a, 0x050f80ff, + 0x012fa809, 0x06003010, 0x05600e0a, 0x050f80ff, + 0x032fa022, 0x0180016c, 0x050fd00a, 0x07600a0a, + 0x050f80ff, 0x032fa009, 0x0379ff00, 0x0380ffff, + 0x0145b000, 0x07600a0a, 0x050f80ff, 0x032fa00a, + 0x07303000, 0x07000030, 0x04600e16, 0x050f80ff, + 0x053fa80a, 0x06000001, 0x07a003a0, 0x03800078, + 0x06600616, 0x050f80ff, 0x012fa841, 0x0079fe01, + 0x070000ff, 0x070090ff, 0x0400d010, 0x0600a007, + 0x0400b008, 0x07600a0a, 0x050f80ff, 0x032fa009, + 0x0769ff00, 0x0660000b, 0x050f80ff, 0x073fa009, + 0x07000006, 0x07f00000, 0x04602c16, 0x050f80ff, + 0x053fa809, 0x0600000b, 0x07479017, 0x056c0e09, + 0x0481018f, 0x076c0c09, 0x00a1859b, 0x0560160a, + 0x050f80ff, 0x053fa809, 0x06000007, 0x07f00000, + 0x074b000f, 0x0368060f, 0x00d00197, 0x0080019b, + 0x00800213, 0x008001d0, 0x0080023b, 0x0748f00f, + 0x05810239, 0x0530e042, 0x02080002, 0x0578400f, + 0x06000020, 0x017c40ff, 0x06000020, 0x068181a7, + 0x0748500c, 0x048101a7, 0x03459017, 0x04602c16, 0x050f80ff, 0x053fa80a, 0x0600000b, 0x0569800f, - 0x078181b4, 0x0548d00f, 0x078181b1, 0x0644a00e, - 0x056c0e09, 0x048101bf, 0x0080023e, 0x050010ff, - 0x046c8001, 0x078181c6, 0x056c0e09, 0x048101bf, + 0x068181b3, 0x0548d00f, 0x068181b0, 0x0644a00e, + 0x056c0e09, 0x058101be, 0x0080023d, 0x050010ff, + 0x046c8001, 0x078181c5, 0x056c0e09, 0x058101be, 0x05601a0a, 0x050f80ff, 0x012fa809, 0x04780101, - 0x07ffff00, 0x0481023e, 0x01498017, 0x048101c2, - 0x0644900e, 0x06300001, 0x04000410, 0x05a0024d, - 0x03800035, 0x026d0001, 0x058101c9, 0x0180023c, - 0x0530e042, 0x02080002, 0x04a00268, 0x06818238, - 0x07300003, 0x05000430, 0x05a0024d, 0x03800056, - 0x0630e445, 0x02080002, 0x056c0e09, 0x0681823e, - 0x0748f00f, 0x058101de, 0x0569800f, 0x0781823c, - 0x0548d00f, 0x068181e0, 0x007a010e, 0x06000010, - 0x008001e6, 0x0246a00e, 0x008001e6, 0x0246a00e, - 0x0748500f, 0x048101e6, 0x0748500c, 0x048101e6, - 0x03459017, 0x0349a017, 0x078181ed, 0x04602c16, - 0x050f80ff, 0x053fa80a, 0x0600000b, 0x008001f7, + 0x07ffff00, 0x0481023d, 0x01498017, 0x048101c1, + 0x0644900e, 0x06300001, 0x04000410, 0x05a00253, + 0x03800035, 0x026d0001, 0x048101c8, 0x0080023b, + 0x0530e042, 0x02080002, 0x04a00270, 0x06818237, + 0x07300003, 0x05000430, 0x05a00253, 0x03800056, + 0x0630e445, 0x02080002, 0x056c0e09, 0x0681823d, + 0x0748f00f, 0x058101dd, 0x0569800f, 0x0681823b, + 0x0548d00f, 0x068181df, 0x007a010e, 0x06000010, + 0x008001e5, 0x0246a00e, 0x008001e5, 0x0246a00e, + 0x0748500f, 0x048101e5, 0x0748500c, 0x048101e5, + 0x03459017, 0x0349a017, 0x068181ec, 0x04602c16, + 0x050f80ff, 0x053fa80a, 0x0600000b, 0x018001f6, 0x0747a017, 0x05001017, 0x05601c0a, 0x050f80ff, 0x073fa009, 0x06000001, 0x07f00000, 0x04602c16, - 0x050f80ff, 0x012fa812, 0x01498017, 0x058101fc, + 0x050f80ff, 0x012fa812, 0x01498017, 0x048101fb, 0x0644900e, 0x0279ff0e, 0x07ffffeb, 0x0448700e, - 0x0481020e, 0x06601216, 0x050f80ff, 0x012fa809, + 0x0481020d, 0x06601216, 0x050f80ff, 0x012fa809, 0x07f00000, 0x04600201, 0x050f80ff, 0x012fa809, 0x07f00000, 0x04600e01, 0x050f80ff, 0x012fa809, - 0x060ff001, 0x075a00ff, 0x0481020e, 0x0279ff0e, - 0x07ffffeb, 0x04a00268, 0x06818238, 0x07300003, - 0x05000430, 0x05a0024d, 0x03800056, 0x056c0e09, - 0x0681823e, 0x0430e001, 0x02080002, 0x0644000d, - 0x0748f00f, 0x04810225, 0x0569800f, 0x0781823c, + 0x060ff001, 0x075a00ff, 0x0481020d, 0x0279ff0e, + 0x07ffffeb, 0x04a00270, 0x06818237, 0x07300003, + 0x05000430, 0x05a00253, 0x03800056, 0x056c0e09, + 0x0681823d, 0x0430e001, 0x02080002, 0x0644000d, + 0x0748f00f, 0x05810224, 0x0569800f, 0x0681823b, 0x0578400f, 0x06000020, 0x017c40ff, 0x06000020, - 0x06818225, 0x0748500c, 0x04810225, 0x03459017, + 0x07818224, 0x0748500c, 0x05810224, 0x03459017, 0x04602c16, 0x050f80ff, 0x053fa80a, 0x0600000b, - 0x04a00268, 0x06818238, 0x01498017, 0x04810234, + 0x04a00270, 0x06818237, 0x01498017, 0x05810233, 0x0644900e, 0x0630000e, 0x04000420, 0x0748600c, - 0x05810236, 0x0444200d, 0x01800236, 0x06300004, - 0x04000420, 0x05a0024d, 0x03800035, 0x02200010, - 0x0180023f, 0x02200001, 0x0180023f, 0x03200006, - 0x0180023f, 0x02200004, 0x040fd016, 0x050fd00a, + 0x05810235, 0x0444200d, 0x01800235, 0x06300004, + 0x04000420, 0x05a00253, 0x03800035, 0x02200010, + 0x0080023e, 0x02200001, 0x0080023e, 0x03200006, + 0x0080023e, 0x02200004, 0x040fd016, 0x050fd00a, 0x050fd000, 0x05600e0a, 0x050f80ff, 0x032fa00a, - 0x07303000, 0x07000060, 0x04600e16, 0x050f80ff, - 0x053fa80a, 0x06000001, 0x06a00398, 0x03800078, - 0x05600e0a, 0x050f80ff, 0x053fa809, 0x06000001, - 0x07f00000, 0x074b0003, 0x034a1803, 0x014a2c03, - 0x05500403, 0x070030ff, 0x0400100e, 0x04002010, - 0x05304000, 0x07000060, 0x0600500d, 0x0700600a, - 0x0400700b, 0x0460040b, 0x050f80ff, 0x073fa009, - 0x06000004, 0x0279ff08, 0x0700ffff, 0x06600616, - 0x050f80ff, 0x022fa04a, 0x07c00000, 0x03681e00, - 0x070090ff, 0x076c2400, 0x04810283, 0x056cf400, - 0x04810270, 0x076ce400, 0x07818295, 0x0748000f, - 0x04810273, 0x0444b00d, 0x0548100f, 0x04810276, - 0x0444700e, 0x06a00316, 0x06818298, 0x05601c0a, - 0x050f80ff, 0x0448b00d, 0x0481027f, 0x073fa009, - 0x06000004, 0x00800289, 0x043fa819, 0x06000002, - 0x05008005, 0x00800289, 0x05601c0a, 0x050f80ff, - 0x043fa819, 0x06000002, 0x05008005, 0x0500100a, - 0x06780007, 0x07ffff00, 0x0581028d, 0x0245500e, - 0x0560100a, 0x050f80ff, 0x053fa809, 0x06000001, - 0x0379ff03, 0x070000ff, 0x01018003, 0x018002ca, - 0x040fd016, 0x050fd00a, 0x03800593, 0x056a02ff, - 0x07c00000, 0x0447400e, 0x03681e00, 0x070090ff, - 0x076c3000, 0x048102c4, 0x076c9000, 0x048102c4, - 0x056cd000, 0x048102a8, 0x076cd400, 0x048102a8, - 0x040fd016, 0x050fd00a, 0x03800593, 0x0748000f, - 0x048102ab, 0x0444700e, 0x0548100f, 0x048102ae, - 0x0444b00d, 0x06a00316, 0x078182c3, 0x0448700d, - 0x078182c9, 0x0644500e, 0x070ff009, 0x0550041b, - 0x050f80ff, 0x073fa009, 0x06000001, 0x03200009, - 0x02400002, 0x04488004, 0x058102be, 0x02400002, - 0x0320000c, 0x07003018, 0x06601816, 0x050f80ff, - 0x032fa022, 0x075c00ff, 0x07c00000, 0x0500100a, - 0x0560200a, 0x050f80ff, 0x053fa809, 0x07000003, - 0x04008010, 0x05a002d2, 0x078182d1, 0x07003018, - 0x06601816, 0x050f80ff, 0x022fa04a, 0x075c00ff, - 0x07c00000, 0x070ff009, 0x0550041b, 0x050f80ff, - 0x073fa009, 0x06000001, 0x0448b00d, 0x078182db, - 0x0448700e, 0x048102df, 0x02400002, 0x0049700d, - 0x048102df, 0x02400002, 0x05a002ee, 0x068182ec, - 0x060ff001, 0x05500400, 0x050f80ff, 0x063fa019, - 0x06000002, 0x07f00000, 0x07420018, 0x058102ed, - 0x02400002, 0x05a002ee, 0x058102ed, 0x056a02ff, - 0x07c00000, 0x070ff01d, 0x00540402, 0x00d002f1, - 0x008002f7, 0x018002f9, 0x008002fb, 0x008002fd, - 0x018002ff, 0x02800301, 0x03200006, 0x03800314, - 0x03200009, 0x03800314, 0x0320000c, 0x03800314, - 0x0320000f, 0x03800314, 0x03200012, 0x03800314, - 0x04600201, 0x050f80ff, 0x012fa809, 0x040f7001, - 0x02860310, 0x06600a01, 0x050f80ff, 0x073fa009, - 0x06000001, 0x02681e02, 0x0550041b, 0x050f80ff, - 0x073fa009, 0x06000001, 0x018002ee, 0x040fd016, - 0x040fd002, 0x056a02ff, 0x02800315, 0x075c00ff, - 0x07c00000, 0x0560020a, 0x050f80ff, 0x053fa809, - 0x06000007, 0x050f700f, 0x03860396, 0x07600a0f, - 0x050f80ff, 0x053fa809, 0x06000004, 0x0769ff09, - 0x056c9409, 0x05818396, 0x0760240a, 0x050f80ff, - 0x063fa019, 0x07000003, 0x07000006, 0x0079fe07, - 0x070000ff, 0x050010ff, 0x07600c0f, 0x050f80ff, - 0x063fa019, 0x06000002, 0x0379ff05, 0x070000ff, - 0x074b0c05, 0x055a0405, 0x070050ff, 0x0079fe04, - 0x070000ff, 0x050020ff, 0x064b0c04, 0x045a0402, - 0x050020ff, 0x064b0004, 0x04487004, 0x07810344, - 0x0379ff05, 0x070000ff, 0x04488004, 0x0481834a, - 0x04007010, 0x04008010, 0x04444004, 0x04488004, - 0x0781035f, 0x02680604, 0x076c06ff, 0x0481834a, - 0x00464004, 0x0045700d, 0x0045800e, 0x0760140f, - 0x050f80ff, 0x073fa009, 0x0700000c, 0x07f00000, - 0x074b0018, 0x0560040a, 0x050f80ff, 0x053fa809, - 0x06000001, 0x050f80ff, 0x073fa00a, 0x06000008, - 0x07f00000, 0x06604e16, 0x050f80ff, 0x053fa80a, - 0x06000001, 0x07f00000, 0x04605816, 0x050f80ff, - 0x073fa00a, 0x07000003, 0x06486004, 0x05818377, - 0x04780107, 0x07ffff00, 0x004a8c07, 0x04780107, - 0x07ff0000, 0x004a8007, 0x045a0407, 0x045a0404, - 0x050040ff, 0x06780008, 0x07ff00ff, 0x0279ff08, - 0x0700ff00, 0x014c80ff, 0x044d8008, 0x045a0408, - 0x070030ff, 0x0380038e, 0x04780107, 0x07ffff00, - 0x0079fe08, 0x070000ff, 0x045a0407, 0x050070ff, - 0x06780007, 0x07ff00ff, 0x0279ff07, 0x0700ff00, - 0x054d80ff, 0x004c8007, 0x045a0407, 0x070030ff, - 0x04780108, 0x07ffff00, 0x004a8c08, 0x04780108, - 0x07ff0000, 0x004a8008, 0x045a0408, 0x045a0404, - 0x050040ff, 0x04603e16, 0x050f80ff, 0x022fa032, - 0x0500100f, 0x05007006, 0x01681f09, 0x075c00ff, - 0x07c00000, 0x056a02ff, 0x07c00000, 0x050f7012, - 0x0386039f, 0x06600013, 0x050f80ff, 0x073fa00a, - 0x0600000b, 0x07c00000, 0x070ff0e2, 0x077800ff, - 0x033e0000, 0x077400ff, 0x031a0000, 0x068203c4, - 0x068103c4, 0x00012016, 0x02013016, 0x07c00000, - 0x070ff0e2, 0x077800ff, 0x033e0000, 0x077400ff, - 0x031a0000, 0x078203b1, 0x078103b1, 0x07c00000, - 0x03016012, 0x06600016, 0x050f80ff, 0x032fa009, - 0x07f00000, 0x06600016, 0x050f80ff, 0x073fa00a, - 0x06000008, 0x050f7000, 0x038603be, 0x01012000, - 0x038003c0, 0x00012010, 0x02013010, 0x04600816, - 0x050f80ff, 0x073fa009, 0x06000007, 0x0647f00e, - 0x007a010e, 0x04000101, 0x04600816, 0x050f80ff, - 0x073fa00a, 0x06000007, 0x072e0030, 0x020e0016, - 0x07c00000, 0x0391000a, 0x0784001d, 0x022c0004, - 0x046c041f, 0x068103e3, 0x046c021f, 0x068103fb, - 0x066c0c1f, 0x0481040d, 0x046c081f, 0x0481041f, - 0x066c061f, 0x05810439, 0x0721f000, 0x0202c010, - 0x0202a010, 0x02020010, 0x052e5800, 0x02b60079, - 0x048d0451, 0x0380000c, 0x040f702a, 0x028603dc, - 0x06000010, 0x04001010, 0x0760122b, 0x050f80ff, - 0x032fa012, 0x07f00000, 0x06420029, 0x0660002a, - 0x050f80ff, 0x053fa809, 0x06000001, 0x050f7003, - 0x028603f8, 0x01028003, 0x0660002a, 0x050f80ff, - 0x073fa00a, 0x06000008, 0x0180043a, 0x00028010, - 0x00027010, 0x0180043a, 0x040f702a, 0x038603db, - 0x06420029, 0x0660002a, 0x050f80ff, 0x053fa809, - 0x06000001, 0x050f7003, 0x0186040a, 0x03026003, - 0x0660002a, 0x050f80ff, 0x073fa00a, 0x06000008, - 0x0180043a, 0x02026010, 0x02025010, 0x0180043a, - 0x040f702a, 0x038603db, 0x06420029, 0x0660002a, - 0x050f80ff, 0x053fa809, 0x06000001, 0x050f7003, - 0x0086041c, 0x01024003, 0x0660002a, 0x050f80ff, - 0x073fa00a, 0x06000008, 0x01800430, 0x00024010, - 0x02023010, 0x01800430, 0x040f702a, 0x038603db, - 0x06420029, 0x0660002a, 0x050f80ff, 0x053fa809, - 0x06000001, 0x050f7003, 0x0186042e, 0x01022003, - 0x0660002a, 0x050f80ff, 0x073fa00a, 0x06000008, - 0x01800430, 0x00022010, 0x00021010, 0x0647f020, - 0x007a0120, 0x04000101, 0x04a004c4, 0x0400802a, - 0x07a00578, 0x019483db, 0x0721f005, 0x028003dc, - 0x038003e1, 0x0647f020, 0x06486020, 0x0781843f, - 0x04a004c4, 0x038003db, 0x007a0120, 0x04000101, - 0x04a004c4, 0x0400802a, 0x07a00578, 0x038003db, - 0x0391000a, 0x070ff0e2, 0x077800ff, 0x033e0000, - 0x077400ff, 0x031a0000, 0x058283e1, 0x040fd02a, - 0x052e4003, 0x00208010, 0x07a00578, 0x038003e1, - 0x0784001d, 0x030150c0, 0x0448e015, 0x0681847f, - 0x0648f015, 0x07818477, 0x02490015, 0x0781846f, - 0x00491015, 0x06818467, 0x00492015, 0x048104b6, - 0x033d0000, 0x07000003, 0x029b84b6, 0x033d0000, - 0x06000002, 0x073c0000, 0x06000040, 0x052e5200, - 0x02200004, 0x00800486, 0x072d0c00, 0x029b845b, - 0x052d0800, 0x073c0000, 0x06000020, 0x062e5080, - 0x03200003, 0x00800486, 0x072d0300, 0x039b8459, - 0x052d0200, 0x073c0000, 0x06000010, 0x062e5020, - 0x02200002, 0x00800486, 0x072d00c0, 0x029b8457, - 0x062d0080, 0x073c0000, 0x06000008, 0x062e5008, - 0x02200001, 0x00800486, 0x072d0030, 0x039b8455, - 0x062d0020, 0x073c0000, 0x06000004, 0x062e5002, - 0x06000010, 0x0784001d, 0x0392000c, 0x050fb000, - 0x040f707c, 0x018604b2, 0x046c0279, 0x06818497, - 0x0448b07a, 0x0481049e, 0x06000010, 0x04001010, - 0x0760127b, 0x050f80ff, 0x032fa012, 0x0046b07a, - 0x02b60079, 0x008004a1, 0x066c0079, 0x0581049c, - 0x040fd07c, 0x07a00593, 0x02800008, 0x040fd07c, - 0x008004a1, 0x0045207a, 0x0279ff7a, 0x07ffd7ff, - 0x0007d010, 0x0647f07a, 0x0648607a, 0x078184ac, - 0x0448707a, 0x058104aa, 0x040f70fb, 0x038684aa, - 0x0644f07a, 0x05a004ca, 0x018004b2, 0x007a017a, - 0x04000101, 0x05a004ca, 0x0400807c, 0x0245f008, - 0x07a00578, 0x07279000, 0x0007e010, 0x0207c010, - 0x0207a010, 0x028c03ce, 0x0380000c, 0x0392000c, - 0x070ff0e2, 0x077800ff, 0x033e0000, 0x077400ff, - 0x031a0000, 0x068284b6, 0x070fc0ff, 0x052e400c, - 0x00208020, 0x07a00578, 0x008004b6, 0x06000020, - 0x05001014, 0x0460082a, 0x050f80ff, 0x032fa012, - 0x07c00000, 0x0600007a, 0x040010a2, 0x044b0801, - 0x070ff014, 0x065a0001, 0x0460087c, 0x050f80ff, - 0x032fa012, 0x07c00000, 0x050f7024, 0x018604de, - 0x070ff0e2, 0x077800ff, 0x033e0000, 0x077400ff, - 0x031a0000, 0x04828013, 0x0721f006, 0x0302a024, - 0x03800527, 0x050f7022, 0x018604ed, 0x070ff0e2, + 0x07f00000, 0x04600e16, 0x050f80ff, 0x053fa809, + 0x06000001, 0x05780103, 0x070000ff, 0x017a0103, + 0x07000600, 0x04600e16, 0x050f80ff, 0x053fa80a, + 0x06000001, 0x07a003a0, 0x03800078, 0x05600e0a, + 0x050f80ff, 0x053fa809, 0x06000001, 0x07f00000, + 0x074b0003, 0x034a1803, 0x014a2c03, 0x05500403, + 0x070030ff, 0x0400100e, 0x04002010, 0x04600e16, + 0x050f80ff, 0x073fa009, 0x06000002, 0x0600500d, + 0x0700600a, 0x0400700b, 0x0460040b, 0x050f80ff, + 0x073fa009, 0x06000004, 0x0279ff08, 0x0700ffff, + 0x06600616, 0x050f80ff, 0x022fa04a, 0x07c00000, + 0x03681e00, 0x070090ff, 0x076c2400, 0x0581028b, + 0x056cf400, 0x05810278, 0x076ce400, 0x0681829d, + 0x0748000f, 0x0581027b, 0x0444b00d, 0x0548100f, + 0x0581027e, 0x0444700e, 0x07a0031e, 0x078182a0, + 0x05601c0a, 0x050f80ff, 0x0448b00d, 0x05810287, + 0x073fa009, 0x06000004, 0x00800291, 0x043fa819, + 0x06000002, 0x05008005, 0x00800291, 0x05601c0a, + 0x050f80ff, 0x043fa819, 0x06000002, 0x05008005, + 0x0500100a, 0x06780007, 0x07ffff00, 0x05810295, + 0x0245500e, 0x0560100a, 0x050f80ff, 0x053fa809, + 0x06000001, 0x0379ff03, 0x070000ff, 0x01018003, + 0x018002d2, 0x040fd016, 0x050fd00a, 0x0280059b, + 0x056a02ff, 0x07c00000, 0x0447400e, 0x03681e00, + 0x070090ff, 0x076c3000, 0x058102cc, 0x076c9000, + 0x058102cc, 0x056cd000, 0x048102b0, 0x076cd400, + 0x048102b0, 0x040fd016, 0x050fd00a, 0x0280059b, + 0x0748000f, 0x048102b3, 0x0444700e, 0x0548100f, + 0x048102b6, 0x0444b00d, 0x07a0031e, 0x068182cb, + 0x0448700d, 0x078182d1, 0x0644500e, 0x070ff009, + 0x0550041b, 0x050f80ff, 0x073fa009, 0x06000001, + 0x03200009, 0x02400002, 0x04488004, 0x058102c6, + 0x02400002, 0x0320000c, 0x07003018, 0x06601816, + 0x050f80ff, 0x032fa022, 0x075c00ff, 0x07c00000, + 0x0500100a, 0x0560200a, 0x050f80ff, 0x053fa809, + 0x07000003, 0x04008010, 0x04a002da, 0x068182d9, + 0x07003018, 0x06601816, 0x050f80ff, 0x022fa04a, + 0x075c00ff, 0x07c00000, 0x070ff009, 0x0550041b, + 0x050f80ff, 0x073fa009, 0x06000001, 0x0448b00d, + 0x068182e3, 0x0448700e, 0x058102e7, 0x02400002, + 0x0049700d, 0x058102e7, 0x02400002, 0x05a002f6, + 0x068182f4, 0x060ff001, 0x05500400, 0x050f80ff, + 0x063fa019, 0x06000002, 0x07f00000, 0x07420018, + 0x058102f5, 0x02400002, 0x05a002f6, 0x058102f5, + 0x056a02ff, 0x07c00000, 0x070ff01d, 0x00540402, + 0x01d002f9, 0x018002ff, 0x02800301, 0x03800303, + 0x03800305, 0x02800307, 0x03800309, 0x03200006, + 0x0280031c, 0x03200009, 0x0280031c, 0x0320000c, + 0x0280031c, 0x0320000f, 0x0280031c, 0x03200012, + 0x0280031c, 0x04600201, 0x050f80ff, 0x012fa809, + 0x040f7001, 0x03860318, 0x06600a01, 0x050f80ff, + 0x073fa009, 0x06000001, 0x02681e02, 0x0550041b, + 0x050f80ff, 0x073fa009, 0x06000001, 0x018002f6, + 0x040fd016, 0x040fd002, 0x056a02ff, 0x0380031d, + 0x075c00ff, 0x07c00000, 0x0560020a, 0x050f80ff, + 0x053fa809, 0x06000007, 0x050f700f, 0x0286039e, + 0x07600a0f, 0x050f80ff, 0x053fa809, 0x06000004, + 0x0769ff09, 0x056c9409, 0x0481839e, 0x0760240a, + 0x050f80ff, 0x063fa019, 0x07000003, 0x07000006, + 0x0079fe07, 0x070000ff, 0x050010ff, 0x07600c0f, + 0x050f80ff, 0x063fa019, 0x06000002, 0x0379ff05, + 0x070000ff, 0x074b0c05, 0x055a0405, 0x070050ff, + 0x0079fe04, 0x070000ff, 0x050020ff, 0x064b0c04, + 0x045a0402, 0x050020ff, 0x064b0004, 0x04487004, + 0x0681034c, 0x0379ff05, 0x070000ff, 0x04488004, + 0x04818352, 0x04007010, 0x04008010, 0x04444004, + 0x04488004, 0x06810367, 0x02680604, 0x076c06ff, + 0x04818352, 0x00464004, 0x0045700d, 0x0045800e, + 0x0760140f, 0x050f80ff, 0x073fa009, 0x0700000c, + 0x07f00000, 0x074b0018, 0x0560040a, 0x050f80ff, + 0x053fa809, 0x06000001, 0x050f80ff, 0x073fa00a, + 0x06000008, 0x07f00000, 0x06604e16, 0x050f80ff, + 0x053fa80a, 0x06000001, 0x07f00000, 0x04605816, + 0x050f80ff, 0x073fa00a, 0x07000003, 0x06486004, + 0x0481837f, 0x04780107, 0x07ffff00, 0x004a8c07, + 0x04780107, 0x07ff0000, 0x004a8007, 0x045a0407, + 0x045a0404, 0x050040ff, 0x06780008, 0x07ff00ff, + 0x0279ff08, 0x0700ff00, 0x014c80ff, 0x044d8008, + 0x045a0408, 0x070030ff, 0x03800396, 0x04780107, + 0x07ffff00, 0x0079fe08, 0x070000ff, 0x045a0407, + 0x050070ff, 0x06780007, 0x07ff00ff, 0x0279ff07, + 0x0700ff00, 0x054d80ff, 0x004c8007, 0x045a0407, + 0x070030ff, 0x04780108, 0x07ffff00, 0x004a8c08, + 0x04780108, 0x07ff0000, 0x004a8008, 0x045a0408, + 0x045a0404, 0x050040ff, 0x04603e16, 0x050f80ff, + 0x022fa032, 0x0500100f, 0x05007006, 0x01681f09, + 0x075c00ff, 0x07c00000, 0x056a02ff, 0x07c00000, + 0x050f7012, 0x028603a7, 0x06600013, 0x050f80ff, + 0x073fa00a, 0x0600000b, 0x07c00000, 0x070ff0e2, 0x077800ff, 0x033e0000, 0x077400ff, 0x031a0000, - 0x04828013, 0x0302a022, 0x07a00533, 0x04488020, - 0x06810516, 0x040fd02a, 0x0202a010, 0x02020010, - 0x040f7026, 0x008604fb, 0x0202a026, 0x07a00533, - 0x04488020, 0x068184f7, 0x0621f001, 0x00683e20, - 0x05818528, 0x03800517, 0x040fd02a, 0x0202a010, - 0x0002b010, 0x02020010, 0x050f7028, 0x03860530, - 0x0621f002, 0x0302a028, 0x03800527, 0x070ff0e2, + 0x078203cc, 0x078103cc, 0x00012016, 0x02013016, + 0x07c00000, 0x070ff0e2, 0x077800ff, 0x033e0000, + 0x077400ff, 0x031a0000, 0x068203b9, 0x068103b9, + 0x07c00000, 0x03016012, 0x06600016, 0x050f80ff, + 0x032fa009, 0x07f00000, 0x06600016, 0x050f80ff, + 0x073fa00a, 0x06000008, 0x050f7000, 0x038603c6, + 0x01012000, 0x028003c8, 0x00012010, 0x02013010, + 0x04600816, 0x050f80ff, 0x073fa009, 0x06000007, + 0x0647f00e, 0x007a010e, 0x04000101, 0x04600816, + 0x050f80ff, 0x073fa00a, 0x06000007, 0x072e0030, + 0x020e0016, 0x07c00000, 0x0391000a, 0x0784001d, + 0x022c0004, 0x046c041f, 0x078103eb, 0x046c021f, + 0x05810403, 0x066c0c1f, 0x04810415, 0x046c081f, + 0x05810427, 0x066c061f, 0x05810441, 0x0721f000, + 0x0202c010, 0x0202a010, 0x02020010, 0x052e5800, + 0x02b60079, 0x058d0459, 0x0380000c, 0x040f702a, + 0x038603e4, 0x06000010, 0x04001010, 0x0760122b, + 0x050f80ff, 0x032fa012, 0x07f00000, 0x06420029, + 0x0660002a, 0x050f80ff, 0x053fa809, 0x06000001, + 0x050f7003, 0x01860400, 0x01028003, 0x0660002a, + 0x050f80ff, 0x073fa00a, 0x06000008, 0x01800442, + 0x00028010, 0x00027010, 0x01800442, 0x040f702a, + 0x028603e3, 0x06420029, 0x0660002a, 0x050f80ff, + 0x053fa809, 0x06000001, 0x050f7003, 0x01860412, + 0x03026003, 0x0660002a, 0x050f80ff, 0x073fa00a, + 0x06000008, 0x01800442, 0x02026010, 0x02025010, + 0x01800442, 0x040f702a, 0x028603e3, 0x06420029, + 0x0660002a, 0x050f80ff, 0x053fa809, 0x06000001, + 0x050f7003, 0x01860424, 0x01024003, 0x0660002a, + 0x050f80ff, 0x073fa00a, 0x06000008, 0x00800438, + 0x00024010, 0x02023010, 0x00800438, 0x040f702a, + 0x028603e3, 0x06420029, 0x0660002a, 0x050f80ff, + 0x053fa809, 0x06000001, 0x050f7003, 0x01860436, + 0x01022003, 0x0660002a, 0x050f80ff, 0x073fa00a, + 0x06000008, 0x00800438, 0x00022010, 0x00021010, + 0x0647f020, 0x007a0120, 0x04000101, 0x05a004cc, + 0x0400802a, 0x06a00580, 0x009483e3, 0x0721f005, + 0x038003e4, 0x028003e9, 0x0647f020, 0x06486020, + 0x07818447, 0x05a004cc, 0x028003e3, 0x007a0120, + 0x04000101, 0x05a004cc, 0x0400802a, 0x06a00580, + 0x028003e3, 0x0391000a, 0x070ff0e2, 0x077800ff, + 0x033e0000, 0x077400ff, 0x031a0000, 0x048283e9, + 0x040fd02a, 0x052e4003, 0x00208010, 0x06a00580, + 0x028003e9, 0x0784001d, 0x030150c0, 0x0448e015, + 0x07818487, 0x0648f015, 0x0681847f, 0x02490015, + 0x07818477, 0x00491015, 0x0781846f, 0x00492015, + 0x058104be, 0x033d0000, 0x07000003, 0x039b84be, + 0x033d0000, 0x06000002, 0x073c0000, 0x06000040, + 0x052e5200, 0x02200004, 0x0180048e, 0x072d0c00, + 0x039b8463, 0x052d0800, 0x073c0000, 0x06000020, + 0x062e5080, 0x03200003, 0x0180048e, 0x072d0300, + 0x029b8461, 0x052d0200, 0x073c0000, 0x06000010, + 0x062e5020, 0x02200002, 0x0180048e, 0x072d00c0, + 0x039b845f, 0x062d0080, 0x073c0000, 0x06000008, + 0x062e5008, 0x02200001, 0x0180048e, 0x072d0030, + 0x029b845d, 0x062d0020, 0x073c0000, 0x06000004, + 0x062e5002, 0x06000010, 0x0784001d, 0x0392000c, + 0x050fb000, 0x040f707c, 0x008604ba, 0x046c0279, + 0x0781849f, 0x0448b07a, 0x058104a6, 0x06000010, + 0x04001010, 0x0760127b, 0x050f80ff, 0x032fa012, + 0x0046b07a, 0x02b60079, 0x018004a9, 0x066c0079, + 0x048104a4, 0x040fd07c, 0x06a0059b, 0x02800008, + 0x040fd07c, 0x018004a9, 0x0045207a, 0x0279ff7a, + 0x07ffd7ff, 0x0007d010, 0x0647f07a, 0x0648607a, + 0x078184b4, 0x0448707a, 0x058104b2, 0x040f70fb, + 0x038684b2, 0x0644f07a, 0x05a004d2, 0x008004ba, + 0x007a017a, 0x04000101, 0x05a004d2, 0x0400807c, + 0x0245f008, 0x06a00580, 0x07279000, 0x0007e010, + 0x0207c010, 0x0207a010, 0x028c03d6, 0x0380000c, + 0x0392000c, 0x070ff0e2, 0x077800ff, 0x033e0000, + 0x077400ff, 0x031a0000, 0x078284be, 0x070fc0ff, + 0x052e400c, 0x00208020, 0x06a00580, 0x018004be, + 0x06000020, 0x05001014, 0x0460082a, 0x050f80ff, + 0x032fa012, 0x07c00000, 0x0600007a, 0x040010a2, + 0x044b0801, 0x070ff014, 0x065a0001, 0x0460087c, + 0x050f80ff, 0x032fa012, 0x07c00000, 0x050f7024, + 0x008604e6, 0x070ff0e2, 0x077800ff, 0x033e0000, + 0x077400ff, 0x031a0000, 0x04828013, 0x0721f006, + 0x0302a024, 0x0280052f, 0x050f7022, 0x018604f5, + 0x070ff0e2, 0x077800ff, 0x033e0000, 0x077400ff, + 0x031a0000, 0x04828013, 0x0302a022, 0x06a0053b, + 0x04488020, 0x0781051e, 0x040fd02a, 0x0202a010, + 0x02020010, 0x040f7026, 0x03860503, 0x0202a026, + 0x06a0053b, 0x04488020, 0x078184ff, 0x0621f001, + 0x00683e20, 0x05818530, 0x0280051f, 0x040fd02a, + 0x0202a010, 0x0002b010, 0x02020010, 0x050f7028, + 0x02860538, 0x0621f002, 0x0302a028, 0x0280052f, + 0x070ff0e2, 0x077800ff, 0x033e0000, 0x077400ff, + 0x031a0000, 0x04828013, 0x050f7024, 0x02860513, + 0x0721f006, 0x0302a024, 0x0280052f, 0x050f7022, + 0x02860538, 0x0302a022, 0x06a0053b, 0x04488020, + 0x0781051e, 0x040fd02a, 0x0202a010, 0x0002b010, + 0x02020010, 0x02800538, 0x0621f004, 0x070ff0e2, 0x077800ff, 0x033e0000, 0x077400ff, 0x031a0000, - 0x04828013, 0x050f7024, 0x0286050b, 0x0721f006, - 0x0302a024, 0x03800527, 0x050f7022, 0x03860530, - 0x0302a022, 0x07a00533, 0x04488020, 0x06810516, - 0x040fd02a, 0x0202a010, 0x0002b010, 0x02020010, - 0x03800530, 0x0621f004, 0x070ff0e2, 0x077800ff, - 0x033e0000, 0x077400ff, 0x031a0000, 0x05828522, - 0x01208060, 0x0600902a, 0x04002020, 0x06a0057f, - 0x03800530, 0x0202a010, 0x02020010, 0x0002b010, - 0x0721f000, 0x03800530, 0x07a00533, 0x0400102a, - 0x0245f001, 0x07a00539, 0x050f801e, 0x0320000a, - 0x022017d0, 0x032fa012, 0x072e5c00, 0x028c03ce, - 0x048d0451, 0x02800013, 0x0460082a, 0x050f80ff, - 0x022fa031, 0x03020000, 0x0102b005, 0x07c00000, - 0x01200100, 0x069a053d, 0x060f0001, 0x07c00000, - 0x07420000, 0x0581853a, 0x060fc010, 0x03800593, - 0x0392001d, 0x0207c02f, 0x0460087c, 0x050f80ff, - 0x032fa039, 0x0307a000, 0x0107b005, 0x0307f006, - 0x0660007c, 0x050020ff, 0x050f80ff, 0x032fa011, - 0x0302f000, 0x01868559, 0x0202f001, 0x00868557, - 0x0002e010, 0x0660187f, 0x050f80ff, 0x073fa00a, - 0x06000008, 0x0380055f, 0x0002e001, 0x0380055f, - 0x040f7001, 0x02860552, 0x0760002e, 0x050f80ff, - 0x012fa80a, 0x0002e001, 0x06000010, 0x04001010, - 0x040f8002, 0x032fa012, 0x06279001, 0x0400107c, - 0x060ff0fb, 0x054bc8ff, 0x065a0001, 0x07a00539, - 0x0320000a, 0x022011f4, 0x00202004, 0x06003010, - 0x0249507a, 0x06810570, 0x0020200e, 0x050f8078, - 0x032fa022, 0x030e5077, 0x028c03ce, 0x048d0451, - 0x040f702f, 0x00868013, 0x0380001d, 0x03201100, - 0x0584857d, 0x06420001, 0x04818579, 0x03800596, - 0x020e0008, 0x07c00000, 0x050fd009, 0x040fd008, - 0x03201100, 0x04848586, 0x06420001, 0x05818582, - 0x03800596, 0x007a0102, 0x04000101, 0x05600809, - 0x050f80ff, 0x073fa00a, 0x06000001, 0x020e0008, - 0x04848591, 0x06420001, 0x0581858d, 0x03800596, - 0x030e0009, 0x07c00000, 0x052e400f, 0x00208040, - 0x03800578, 0x070fc0ff, 0x040f8010, 0x032fa009, - 0x03800599, 0xf152208d, 0x00000000, 0x00000000, - 0x0000400e, 0x00000808, 0x00000803, 0x00011f0f, - 0x02080b02, 0xe6e5610b, 0x7f04e630, 0x7f028001, - 0x30e2e500, 0x017e04e4, 0x007e0280, 0x08605fee, - 0xe4f7f953, 0x0b80fef5, 0x16120a7f, 0xf7f953b3, - 0x7530fe75, 0xf5e408fc, 0x08f943fd, 0x06000222, - 0x000f1f01, 0x75002003, 0xf5e40151, 0xf553f552, - 0x7f7ef552, 0x3d040204, 0x520536c2, 0x94d352e5, - 0x7505400c, 0x36d20152, 0x740c0790, 0x74a3f007, - 0xf5e4f0ff, 0x90f0a30c, 0xa3f01407, 0x200b75f0, - 0xf5e409f5, 0xd308e508, 0x03403094, 0x12090402, - 0x0b150600, 0x047008e5, 0x0280017f, 0x09e5007f, - 0x017e0470, 0x007e0280, 0x05605fee, 0xd2f31712, - 0xf7e15335, 0x094508e5, 0x250be5ff, 0x24e025e0, - 0xe482f583, 0x83f50734, 0xe285f0ef, 0xd352e520, - 0x0d400194, 0xe02a1b12, 0x4064a054, 0x04020370, - 0xf8f95300, 0xe4709490, 0x10f5e0f0, 0x1e1209af, - 0xef08af74, 0x82f50844, 0xe0808375, 0x44ef29f5, - 0x7582f507, 0xf5e09e83, 0xd3405422, 0x1e400094, - 0xf05429e5, 0x1b122170, 0x8044e02a, 0x5422e5f0, - 0x70086530, 0x2a1b1209, 0xf0bf54e0, 0x1b120980, - 0xf040742a, 0x12000402, 0x8375491b, 0xf0ff74ae, - 0x007e08af, 0xf50744ef, 0xe5fde082, 0x25e0250b, - 0xf58124e0, 0x0734e482, 0xf0ed83f5, 0xe00e0790, - 0x44eff004, 0x7582f507, 0xf5e09883, 0x5a1b1228, - 0x1b120c40, 0x0144e02a, 0x02691b12, 0x08affb03, - 0x8074007e, 0x8dcdefcd, 0xe083f582, 0x120ae030, - 0x44e02a1b, 0x0402f020, 0x2a1b1200, 0xf0df54e0, - 0x12ae44ee, 0xe430711b, 0x00040203, 0x1b129e74, - 0x03e0203c, 0x8f000402, 0xe0838e82, 0x0203e020, - 0x1b120004, 0x1044e02a, 0x4408e5f0, 0x7582f506, - 0x44e09e83, 0x08aff004, 0x44ef007e, 0xe082f506, - 0x1234e220, 0x44e02a1b, 0xe4e5f008, 0x7d04e630, - 0x7d028001, 0xc37ee500, 0x04500494, 0x0280017c, - 0x4dec007c, 0x35c20560, 0xee000402, 0x1b12d244, - 0xf0404471, 0x12000402, 0x54e02a1b, 0x1b12f0f7, - 0xd2837549, 0xf0bf54e0, 0xe0140790, 0x7ee5f004, - 0x7e750370, 0x7e08af01, 0x5a1b1200, 0x1b121240, - 0x0144e02a, 0xe0291b12, 0x1b120254, 0x00040269, - 0xe02a1b12, 0x1b120244, 0xfe54e029, 0xee35c2f0, - 0x828f8044, 0xf5e083f5, 0x44e35417, 0x9074f010, - 0x4408e5fc, 0x82f5fd07, 0x54e0838c, 0x0207903f, - 0xc054e0f0, 0x838c828d, 0x129274f0, 0x07903c1b, - 0x501b1203, 0x1b128274, 0x0407903c, 0x74501b12, - 0x3c1b12b4, 0x12050790, 0x9474501b, 0x4408e5fe, - 0x411b1206, 0xe03010f5, 0x8037d204, 0xe537c202, - 0x8f7f5410, 0xf0838e82, 0x12304430, 0x80543a1b, - 0x400094d3, 0x8039d204, 0x8f39c202, 0xe0838e82, - 0x12f08044, 0x40543a1b, 0x400094d3, 0x803ad204, - 0x8f3ac202, 0xe0838e82, 0x74f04044, 0x08e5fe92, - 0x1b120644, 0x04e73041, 0x028038d2, 0x828f38c2, - 0x54e0838e, 0x1e12f07f, 0x0af5e407, 0x80020320, - 0x03433003, 0x20171912, 0x03800202, 0x12034230, - 0x3030970c, 0x17191206, 0x12970c12, 0x1b124f0d, - 0xfb54e02a, 0xc30ae5f0, 0x46400194, 0x1208e143, - 0x44e02a1b, 0xe4e5f004, 0x122ae720, 0x8375491b, - 0x0854e0d2, 0x400094d3, 0x80017f04, 0xe5007f02, - 0x0194c30a, 0x017e0440, 0x007e0280, 0x05605eef, - 0x80981d12, 0x491b1217, 0xe0d28375, 0x02f00844, - 0x1b120004, 0xd2837549, 0xf0f754e0, 0x7f071e12, - 0xb3161208, 0x12fe8e74, 0x838e491b, 0x5410f5e0, - 0x10e5f0fe, 0xe5ff0144, 0x44edfd08, 0xef82f507, - 0x5410e5f0, 0x44edfffe, 0xef82f507, 0x75481b12, - 0x44e08683, 0x481b1210, 0xf01044e0, 0xe02a1b12, - 0x0144fd54, 0x2a1b12ff, 0x691b12ef, 0xe50c3230, - 0xf5084408, 0x82837582, 0xaff00574, 0x5918120b, - 0x08251074, 0x000208f5, 0xe5090585, 0x0794d309, - 0x00020350, 0xd37ee582, 0x04400094, 0x0280017f, - 0x7ee5007f, 0x50fa94c3, 0x80017e04, 0xee007e02, - 0x0502605f, 0x0b35307e, 0x7f01e143, 0xb3161209, - 0x53580002, 0x0002fee1, 0x8f6a8e58, 0x8d6c8c6b, - 0x016e756d, 0x75016f75, 0xf5e40170, 0xf574f573, - 0x2f079075, 0xf53cf5f0, 0xf546f53e, 0xf53df547, - 0xe56ff53f, 0xe50e706f, 0x126a456b, 0x83753707, - 0x803a7480, 0x37071208, 0x74808375, 0x3607121a, - 0xe0868375, 0xe4f00844, 0x74c36ef5, 0xff6e953f, - 0x75680812, 0xf0ef8283, 0x12741912, 0x33e5d308, - 0x070912f0, 0x40be0812, 0x706fe5e1, 0x3707120b, - 0x74808375, 0x0980f036, 0x75370712, 0x16748083, - 0x016e75f0, 0x75370712, 0x6ee5b483, 0x741912f0, - 0x6e253f74, 0x34e482f5, 0xe583f500, 0xbf74f033, - 0x82f56e25, 0x120034e4, 0xd840be08, 0xf570f5e4, - 0xf547f546, 0x0709126e, 0xfee083f5, 0xe0d30812, - 0x0024007c, 0xfe3eecff, 0xefd33bad, 0x509cee9d, - 0x80017b04, 0xe5007b02, 0x7a047070, 0x7a028001, - 0x605aeb00, 0x466e8506, 0xd3017075, 0x9cee9def, - 0x017f0450, 0x007f0280, 0x01b470e5, 0x80017e04, - 0xef007e02, 0x8503605e, 0x6e05476e, 0x7f646ee5, - 0x46e5a370, 0x47e50560, 0x85037eb4, 0x6fe54746, - 0x46850870, 0x77478576, 0x74c30e80, 0xf546957f, - 0x7f74c378, 0x79f54795, 0x37706fe5, 0x476546e5, - 0x73750c70, 0x01747501, 0x3df53cf5, 0xf5e43580, - 0x47e5c34e, 0x3cf54695, 0x71f513c3, 0x72f54625, - 0x403f94c3, 0x3df5e405, 0x74c34080, 0xf572953f, - 0xe537803d, 0x70476546, 0x0173750f, 0xf5017575, - 0x753ff53e, 0x2280014e, 0xc34ef5e4, 0x469547e5, - 0x13c33ef5, 0x462571f5, 0x94d372f5, 0xe405503f, - 0x06803ff5, 0xc12472e5, 0x6f053ff5, 0x94c36fe5, - 0x02035002, 0x6de57304, 0x02706c45, 0x74e50480, - 0x07907545, 0x017ff02f, 0x04603ee5, 0x14703ce5, - 0xf53cf5e4, 0xf53ef53d, 0xdf08123f, 0x02f00470, - 0x7a80b106, 0x95c33ce5, 0xe507403e, 0xff3e953c, - 0xe5c30680, 0xff3c953e, 0x95d376e5, 0x85054079, - 0x03807a76, 0xe57a7985, 0x7895c377, 0x77850550, - 0x8503807b, 0x7be57b78, 0x407a95d3, 0x957be530, - 0xf53cf57a, 0x7be5c33e, 0x07907a95, 0x3ce5f019, - 0x71f513c3, 0x72f57a25, 0x403f94c3, 0x3df5e405, - 0x74c31f80, 0xf572953f, 0x803ff53d, 0x3cf5e414, - 0x07903ef5, 0x0812f019, 0xf00370df, 0x01740380, - 0x680812f0, 0xe0d08375, 0xadfe0f54, 0x7e02703c, - 0x020fbe07, 0xfbee807e, 0x749bd3ef, 0x4098f880, - 0x3cf5e41f, 0x08123ef5, 0xf00370df, 0x01741280, - 0xfb08e5f0, 0xf50744eb, 0xd2837582, 0xf01044e0, - 0xebfb08e5, 0x82f50944, 0xed9e8375, 0x0744ebf0, - 0x837582f5, 0x12f0edca, 0x83756808, 0x22f0efcc, - 0x074408e5, 0x837582f5, 0xf054e0bc, 0x4408e5f0, - 0x7582f507, 0x54e0be83, 0x08e5f0f0, 0x82f50744, - 0xe0c08375, 0xe5f0f054, 0xf5074408, 0x90f02282, - 0xfee02807, 0x82f5e0a3, 0x8522838e, 0x41854242, - 0x40408541, 0xf52fc074, 0x3e027482, 0x42e583f5, - 0x2fe074f0, 0x027482f5, 0x2283f53e, 0xfd2942e5, - 0xe5fc33e4, 0xec9dc33c, 0x74f88064, 0xf5229880, - 0x0790e083, 0xfd1f5422, 0xe0a3fae0, 0x838a82f5, - 0x9022f0ed, 0xfce02207, 0x82f5e0a3, 0x9022838c, - 0xedff2407, 0xf0cf0744, 0x22f0efa3, 0x85383885, - 0x3a853939, 0x2fc0743a, 0x027482f5, 0x2283f53e, - 0xff260790, 0xcf0744ed, 0xf0efa3f0, 0xa074f022, - 0x7482f52f, 0x83f53e02, 0x25c07422, 0xe482f511, - 0x83f50134, 0x25007422, 0xe482f511, 0x83f50234, - 0x25607422, 0xe482f511, 0x83f50334, 0x25807422, - 0xe482f511, 0x83f50334, 0x25e07422, 0xe482f511, - 0x83f50334, 0x25407422, 0xe482f511, 0x83f50634, - 0x2f807422, 0x027482f5, 0x2283f53e, 0x82e583f5, - 0x82f50744, 0x22f040e5, 0x11254074, 0x34e482f5, - 0x2283f502, 0x1125c074, 0x34e482f5, 0x2283f503, - 0x11250074, 0x34e482f5, 0x2283f506, 0x11252074, - 0x34e482f5, 0x2283f506, 0xedfd08e5, 0x82f50744, - 0xf041e522, 0x016465e5, 0x7e226445, 0x007afb00, - 0x22007cfd, 0x11252074, 0x34e482f5, 0xa0742202, - 0x82f51125, 0x220334e4, 0x007e08af, 0xf50744ef, - 0x3e852282, 0x413f8542, 0x8522408f, 0x3d85423c, - 0x22408f41, 0x903f4575, 0xf0e42007, 0x83f522a3, - 0x05f032e5, 0xc36ee56e, 0xf0224094, 0x064408e5, - 0x742282f5, 0xf56e2500, 0x0034e482, 0xe52283f5, - 0x906c456d, 0xe4222f07, 0xd33ce5f9, 0x74223e95, - 0x82f52e80, 0xf50234e4, 0x7422e083, 0x82f52ea0, - 0xf50234e4, 0x7422e083, 0xf56e2580, 0x0034e482, - 0xfd422522, 0x22fc33e4, 0x85424285, 0x40854141, - 0x4ced2240, 0x09020360, 0x704eeff2, 0x26079037, - 0xe0960712, 0xd90712fd, 0x0790f0ed, 0x96071228, - 0x0712fde0, 0x12f0ede5, 0x54e09307, 0x0812fd1f, - 0xed83f584, 0x240790f0, 0xe0960712, 0x12fd1f54, - 0xf0ed3808, 0x4e0464ef, 0x07903770, 0x96071226, - 0x0712fde0, 0x90f0edf1, 0x07122807, 0x12fde096, - 0xf0edfd07, 0xe0930712, 0x12fd1f54, 0x83f58e08, - 0x0790f0ed, 0x96071224, 0xfd1f54e0, 0xed440812, - 0x0164eff0, 0x7d04704e, 0x7d028001, 0x0264ef00, - 0x7f04704e, 0x7f028001, 0x604def00, 0x26079078, - 0xe0420712, 0x090812ff, 0x3e0712ef, 0x0812ffe0, - 0x90f0ef15, 0x07122207, 0x1f54e042, 0x500812ff, - 0x0790f0ef, 0x42071224, 0xff1f54e0, 0xef5c0812, - 0x071222f0, 0x12f0e4d9, 0xf0e4e507, 0xf5840812, - 0x12f0e483, 0x14743808, 0xf10712f0, 0x0712f0e4, - 0x12f0e4fd, 0x83f58e08, 0x0812f0e4, 0xf0147444, - 0xe4090812, 0x150812f0, 0x0812f0e4, 0x12f0e450, - 0x14745c08, 0x648c22f0, 0x668a658d, 0xf5e4678b, - 0x704eef69, 0x161d0203, 0xe568f5e4, 0x70664567, - 0x37071232, 0xe4908375, 0x75360712, 0x12e4c283, - 0x83753607, 0x0812e4c4, 0x12297073, 0x83753707, - 0x0712e492, 0xc6837536, 0x360712e4, 0xe4c88375, - 0x901180f0, 0x07122607, 0x0812e442, 0x12057073, - 0xf0e43f07, 0x12161d12, 0x67e5801e, 0x33706645, - 0x75370712, 0x41e59083, 0x75360712, 0x41e5c283, - 0x75360712, 0x0812c483, 0x12297071, 0x83753707, - 0x1240e592, 0x83753607, 0x1240e5c6, 0x83753607, - 0x900e80c8, 0x07122607, 0x71081242, 0x07120670, - 0xf040e53f, 0x007e69af, 0x66ac67ad, 0x12490412, - 0x83753707, 0x94d3e0ca, 0x050c5000, 0xc368e568, - 0x03500594, 0x224b0a02, 0x75f7f953, 0xf5e410fc, - 0x30fe75fd, 0xf943fff5, 0x20e6e508, 0xff780be7, - 0xfdd8f6e4, 0x80fee653, 0xe4087809, 0x53fdd8f6, - 0x8175fee6, 0xa8f5e480, 0xa9c2a8d2, 0xe2e5afd2, - 0x2005e520, 0x038002e6, 0xe502e143, 0x0ee020e2, - 0x7f000090, 0xe4087e00, 0xfcdfa3f0, 0x0b02fade, - 0x01fa43b5, 0xf0c0e0c0, 0x82c083c0, 0x1112d0c0, - 0xd0d0d018, 0xd083d082, 0x53e0d0f0, 0x0232fefa, - 0x93e4d51a, 0x93e4f8a3, 0xdf08f6a3, 0xe42980f9, - 0x54f8a393, 0xc80c2407, 0x54c433c3, 0xc820440f, - 0xf4044083, 0x46018056, 0x80e4dff6, 0x0402010b, - 0x40201008, 0xff0f9080, 0x93017ee4, 0xffa3c160, - 0xe5303f54, 0xfe1f5409, 0x60a393e4, 0x54cf0e01, - 0x60e025c0, 0x80b840ad, 0x8d608cfe, 0xe7081261, - 0x0d402074, 0x7482f52f, 0x83f53e03, 0x80f03ee5, - 0x82f52f0b, 0xf53e0374, 0xf03ce583, 0x95d33ce5, - 0xe53c403e, 0x70604561, 0x0912e910, 0x123ee511, - 0x3b407507, 0x80a20812, 0xc33ee518, 0x1d403895, - 0xe5383e85, 0x8505603e, 0x0380393f, 0x8f393985, - 0x2108123a, 0x07123ee5, 0xf03fe5cd, 0xe5438022, - 0x70604561, 0x6c071219, 0x08120540, 0x122780ab, - 0x08121809, 0x1242e521, 0x41e5cd07, 0x3ce522f0, - 0x403895c3, 0x383c851d, 0x05603ce5, 0x80393d85, - 0x39398503, 0x08123a8f, 0x123ce521, 0x3de5cd07, - 0x388522f0, 0x39398538, 0x123a3a85, 0x38e52108, - 0xe5cd0712, 0x7f22f039, 0xb3161206, 0x12e41c12, - 0x0e12b70e, 0x0a44e0e6, 0xfe8e74f0, 0x12b70e12, - 0xf0efbe0e, 0xe53028e5, 0x0180d303, 0x750540c3, - 0x03802014, 0x12081475, 0x8375b70e, 0xf014e58a, - 0x7505ffb4, 0x06808012, 0x13c314e5, 0xf5e412f5, - 0x127ff516, 0x1312b818, 0xc30ae5a3, 0x09500194, - 0x16e51605, 0x401494c3, 0x20e4e5ea, 0x0e1228e7, - 0xd28375b7, 0xd30854e0, 0x04400094, 0x0280017f, - 0x0ae5007f, 0x400194c3, 0x80017e04, 0xef007e02, - 0x1203605e, 0x7fe5981d, 0x401194c3, 0xb70e1214, - 0xe0d28375, 0xe5f08044, 0x0fe720e4, 0x80981d12, - 0xb70e120a, 0xe0d28375, 0x12f07f54, 0x7422e41c, - 0x82088580, 0x17e583f5, 0xed0e12f0, 0x0790f0e4, - 0x0e12e002, 0x908375ca, 0x9274f0ef, 0x4408e5fe, - 0x82f5ff07, 0x54e0838e, 0x0790fdc0, 0x3f54e003, - 0x8e828f4d, 0x0790f083, 0x0e12e004, 0x828375ca, - 0x0790f0ef, 0xedffe005, 0x82f50744, 0xefb48375, - 0x75b60e12, 0x54e08083, 0x3730f0bf, 0x440f120a, - 0xe0948375, 0x30f08044, 0x0f120a38, 0x92837544, - 0xf08044e0, 0xe43028e5, 0x0a39201a, 0x75b70e12, - 0x54e08883, 0x3a20f07f, 0xb70e120a, 0xe0888375, - 0x74f0bf54, 0x0e12fe8c, 0xe0838eb7, 0x0e120f54, - 0x868375b6, 0xf0bf54e0, 0x064408e5, 0x75b00e12, - 0xf0e48a83, 0x704eef22, 0xd9071226, 0x0790fde0, - 0x88071226, 0xe0e50712, 0x280790fd, 0x12880712, - 0x07128408, 0x3808127f, 0x240790e0, 0xef850712, - 0x704e0464, 0xf1071229, 0x0790fde0, 0x88071226, - 0xe0fd0712, 0x280790fd, 0x12880712, 0x07128e08, - 0x4408127f, 0xfd1f54e0, 0x12240790, 0x64ef8807, - 0x04704e01, 0x0280017d, 0x64ef007d, 0x04704e02, - 0x0280017f, 0x4def007f, 0x08123560, 0x90ffe009, - 0x07122607, 0x12f0ef96, 0xffe01508, 0x12280790, - 0xf0ef9607, 0xe0500812, 0x12ff1f54, 0xf0ef9307, - 0xe05c0812, 0x90ff1f54, 0x07122407, 0x22f0ef96, - 0x837582f5, 0xe5f0e482, 0xf5074408, 0x838e2282, + 0x0482852a, 0x01208060, 0x0600902a, 0x04002020, + 0x07a00587, 0x02800538, 0x0202a010, 0x02020010, + 0x0002b010, 0x0721f000, 0x02800538, 0x06a0053b, + 0x0400102a, 0x0245f001, 0x07a00541, 0x050f801e, + 0x0320000a, 0x022017d0, 0x032fa012, 0x072e5c00, + 0x028c03d6, 0x058d0459, 0x02800013, 0x0460082a, + 0x050f80ff, 0x022fa031, 0x03020000, 0x0102b005, + 0x07c00000, 0x01200100, 0x069a0545, 0x060f0001, + 0x07c00000, 0x07420000, 0x05818542, 0x060fc010, + 0x0280059b, 0x0392001d, 0x0207c02f, 0x0460087c, + 0x050f80ff, 0x032fa039, 0x0307a000, 0x0107b005, + 0x0307f006, 0x0660007c, 0x050020ff, 0x050f80ff, + 0x032fa011, 0x0302f000, 0x00868561, 0x0202f001, + 0x0186855f, 0x0002e010, 0x0660187f, 0x050f80ff, + 0x073fa00a, 0x06000008, 0x02800567, 0x0002e001, + 0x02800567, 0x040f7001, 0x0386055a, 0x0760002e, + 0x050f80ff, 0x012fa80a, 0x0002e001, 0x06000010, + 0x04001010, 0x040f8002, 0x032fa012, 0x06279001, + 0x0400107c, 0x060ff0fb, 0x054bc8ff, 0x065a0001, + 0x07a00541, 0x0320000a, 0x022011f4, 0x00202004, + 0x06003010, 0x0249507a, 0x07810578, 0x0020200e, + 0x050f8078, 0x032fa022, 0x030e5077, 0x028c03d6, + 0x058d0459, 0x040f702f, 0x00868013, 0x0380001d, + 0x03201100, 0x04848585, 0x06420001, 0x05818581, + 0x0280059e, 0x020e0008, 0x07c00000, 0x050fd009, + 0x040fd008, 0x03201100, 0x0584858e, 0x06420001, + 0x0481858a, 0x0280059e, 0x007a0102, 0x04000101, + 0x05600809, 0x050f80ff, 0x073fa00a, 0x06000001, + 0x020e0008, 0x05848599, 0x06420001, 0x05818595, + 0x0280059e, 0x030e0009, 0x07c00000, 0x052e400f, + 0x00208040, 0x02800580, 0x070fc0ff, 0x040f8010, + 0x032fa009, 0x028005a1, 0xd672ebf2, 0x00000000, + 0x00000000, 0x0000400e, 0x00000808, 0x00000803, + 0x00011f0f, 0x02080b02, 0xe6e5610b, 0x7f04e630, + 0x7f028001, 0x30e2e500, 0x017e04e4, 0x007e0280, + 0x08605fee, 0xe4f7f953, 0x0b80fef5, 0x16120a7f, + 0xf7f953b3, 0x7530fe75, 0xf5e408fc, 0x08f943fd, + 0x06000222, 0x000f1f01, 0x75002003, 0xf5e40151, + 0xf553f552, 0x7f7ef552, 0x3d040204, 0x520536c2, + 0x94d352e5, 0x7505400c, 0x36d20152, 0x740c0790, + 0x74a3f007, 0xf5e4f0ff, 0x90f0a30c, 0xa3f01407, + 0x200b75f0, 0xf5e409f5, 0xd308e508, 0x03403094, + 0x12090402, 0x0b150600, 0x047008e5, 0x0280017f, + 0x09e5007f, 0x017e0470, 0x007e0280, 0x05605fee, + 0xd2f31712, 0xf7e15335, 0x094508e5, 0x250be5ff, + 0x24e025e0, 0xe482f583, 0x83f50734, 0xe285f0ef, + 0xd352e520, 0x0d400194, 0xe02a1b12, 0x4064a054, + 0x04020370, 0xf8f95300, 0xe4709490, 0x10f5e0f0, + 0x1e1209af, 0xef08af74, 0x82f50844, 0xe0808375, + 0x44ef29f5, 0x7582f507, 0xf5e09e83, 0xd3405422, + 0x1e400094, 0xf05429e5, 0x1b122170, 0x8044e02a, + 0x5422e5f0, 0x70086530, 0x2a1b1209, 0xf0bf54e0, + 0x1b120980, 0xf040742a, 0x12000402, 0x8375491b, + 0xf0ff74ae, 0x007e08af, 0xf50744ef, 0xe5fde082, + 0x25e0250b, 0xf58124e0, 0x0734e482, 0xf0ed83f5, + 0xe00e0790, 0x44eff004, 0x7582f507, 0xf5e09883, + 0x5a1b1228, 0x1b120c40, 0x0144e02a, 0x02691b12, + 0x08affb03, 0x8074007e, 0x8dcdefcd, 0xe083f582, + 0x120ae030, 0x44e02a1b, 0x0402f020, 0x2a1b1200, + 0xf0df54e0, 0x12ae44ee, 0xe430711b, 0x00040203, + 0x1b129e74, 0x03e0203c, 0x8f000402, 0xe0838e82, + 0x0203e020, 0x1b120004, 0x1044e02a, 0x4408e5f0, + 0x7582f506, 0x44e09e83, 0x08aff004, 0x44ef007e, + 0xe082f506, 0x1234e220, 0x44e02a1b, 0xe4e5f008, + 0x7d04e630, 0x7d028001, 0xc37ee500, 0x04500494, + 0x0280017c, 0x4dec007c, 0x35c20560, 0xee000402, + 0x1b12d244, 0xf0404471, 0x12000402, 0x54e02a1b, + 0x1b12f0f7, 0xd2837549, 0xf0bf54e0, 0xe0140790, + 0x7ee5f004, 0x7e750370, 0x7e08af01, 0x5a1b1200, + 0x1b121240, 0x0144e02a, 0xe0291b12, 0x1b120254, + 0x00040269, 0xe02a1b12, 0x1b120244, 0xfe54e029, + 0xee35c2f0, 0x828f8044, 0xf5e083f5, 0x44e35417, + 0x9074f010, 0x4408e5fc, 0x82f5fd07, 0x54e0838c, + 0x0207903f, 0xc054e0f0, 0x838c828d, 0x129274f0, + 0x07903c1b, 0x501b1203, 0x1b128274, 0x0407903c, + 0x74501b12, 0x3c1b12b4, 0x12050790, 0x9474501b, + 0x4408e5fe, 0x411b1206, 0xe03010f5, 0x8037d204, + 0xe537c202, 0x8f7f5410, 0xf0838e82, 0x12304430, + 0x80543a1b, 0x400094d3, 0x8039d204, 0x8f39c202, + 0xe0838e82, 0x12f08044, 0x40543a1b, 0x400094d3, + 0x803ad204, 0x8f3ac202, 0xe0838e82, 0x74f04044, + 0x08e5fe92, 0x1b120644, 0x04e73041, 0x028038d2, + 0x828f38c2, 0x54e0838e, 0x1e12f07f, 0x0af5e407, + 0x80020320, 0x03433003, 0x20171912, 0x03800202, + 0x12034230, 0x3030970c, 0x17191206, 0x12970c12, + 0x1b124f0d, 0xfb54e02a, 0xc30ae5f0, 0x46400194, + 0x1208e143, 0x44e02a1b, 0xe4e5f004, 0x122ae720, + 0x8375491b, 0x0854e0d2, 0x400094d3, 0x80017f04, + 0xe5007f02, 0x0194c30a, 0x017e0440, 0x007e0280, + 0x05605eef, 0x80981d12, 0x491b1217, 0xe0d28375, + 0x02f00844, 0x1b120004, 0xd2837549, 0xf0f754e0, + 0x7f071e12, 0xb3161208, 0x12fe8e74, 0x838e491b, 0x5410f5e0, 0x10e5f0fe, 0xe5ff0144, 0x44edfd08, - 0x2282f507, 0x54c415e5, 0x08e5ff07, 0x0844edfd, - 0x837582f5, 0x83752282, 0x4044e080, 0x4408e5f0, - 0x7582f508, 0xe5228a83, 0x25e02516, 0xf52f24e0, - 0x1a34e482, 0x93e483f5, 0x43220df5, 0xe14310e1, - 0xfde15380, 0x2210e185, 0xe02516e5, 0x3224e025, - 0x34e482f5, 0xe483f51a, 0x55852293, 0x83548582, - 0x22f015e5, 0x2054e2e5, 0x220094d3, 0x4054e2e5, - 0x220094d3, 0x064408e5, 0xfd2282f5, 0xebfb08e5, - 0x82f50744, 0x53f5e422, 0x40340f12, 0x80017f04, - 0x12007f02, 0x04403c0f, 0x0280017e, 0x4fee007e, - 0x0f020370, 0x10e185f7, 0x5302e143, 0xe1850fe1, - 0x51f5e410, 0x3f54e3e5, 0x0f1252f5, 0xad1d403c, - 0x1251af52, 0x60efb01c, 0x10e18508, 0x8040e143, - 0xbfe1530b, 0x120b0f12, 0xfb800600, 0x3f54e3e5, - 0xe4e551f5, 0x52f53f54, 0x40340f12, 0xaf52ad1d, - 0xb01c1251, 0x850860ef, 0xe14310e1, 0x530b8020, - 0x0f12dfe1, 0x0600120b, 0x0f12fb80, 0x7f044034, - 0x7f028001, 0x3c0f1200, 0x017e0440, 0x007e0280, - 0x03604fee, 0x220e0f12, 0x01001f01, 0x00002003, - 0x02001102, 0x10024010, 0x00000090, 0x00000000, - 0x1f011f01, 0x1257f5e4, 0x15123f16, 0x1012e4c6, - 0xb7141256, 0x12260790, 0x12e44207, 0xf0e43e07, - 0x12561012, 0x0790b714, 0x42071226, 0x071241e5, - 0xf040e53e, 0x007e57af, 0x007c56ad, 0xaf490412, - 0x02007e56, 0x90ffee11, 0xe0a32007, 0x56f5e4fd, - 0xfcfe40f5, 0x12fa56ab, 0x0f7f5111, 0xf5e4187d, - 0xfe40f556, 0xfa56abfc, 0xaf411512, 0x12007e56, - 0xffe47f1a, 0x1f7d56f5, 0xfcfe40f5, 0x22fa56ab, - 0x55f5e422, 0x74fd08e5, 0xed56f5a0, 0x57f50744, - 0xe53028e5, 0x0180d303, 0x7f0540c3, 0x0480ef28, - 0xc3ef147f, 0xe454f513, 0xcb0e12f9, 0xe08e8375, - 0xefce10f5, 0x94d3eece, 0xe5264000, 0x12fe5410, - 0x83754b0f, 0xe5f0ed8e, 0xfd014410, 0xf50744eb, - 0x85f0ed82, 0x56858257, 0xe330e083, 0x801e0901, - 0xe934c2d4, 0x405495c3, 0x2234d202, 0x00000f22, - 0x90113030, 0x93e40010, 0x109010f5, 0xf593e410, - 0x90101210, 0x22501112, 0xe730e2e5, 0x0310120e, - 0x303030c2, 0xfc101203, 0xe5213320, 0x2094c3fe, - 0xf9530950, 0x30fe75f7, 0xe508f943, 0x03e730f2, - 0xe57ff953, 0xd37054f1, 0xdf500094, 0x00000022, - 0x8f588e22, 0x8d5a8c59, 0x8b5c8a5b, 0x015e755d, - 0xf55ff5e4, 0x1262f560, 0x83753707, 0xc4ffe0d0, - 0x61f50f54, 0x85661e12, 0xe5d35e59, 0xe55b955e, - 0x7807125a, 0x07124b50, 0xbc837510, 0x125e45e0, - 0x83753607, 0x5e45e0be, 0x75360712, 0x45e0c083, - 0x5faff05e, 0x081260e5, 0x360a127b, 0x007e62af, - 0x5cac5dad, 0xe5490412, 0x7e5eaf61, 0x0503b400, - 0x80e21d12, 0xac5dad07, 0x1713125c, 0x11025e05, - 0x1007127a, 0xe0bc8375, 0x07124045, 0xbe837536, - 0x124045e0, 0x83753607, 0x4045e0c0, 0x588e22f0, - 0x5a75598f, 0x75017901, 0xfbe4015b, 0x75370712, - 0x54e0ae83, 0x0812ff1a, 0x13c4e068, 0xeffe0754, - 0x65ee0c70, 0x90077035, 0xb4e02f07, 0x35af0d01, - 0x0e12007e, 0xcfebcf05, 0xe5211e02, 0x45026459, - 0x7f047058, 0x7f028001, 0x4559e500, 0x7e047058, - 0x7e028001, 0x604fee00, 0x49418523, 0xe54b4085, - 0x70584559, 0xfe5aaf2c, 0xfccde9cd, 0x58aa59ab, - 0xaf360a12, 0x12007e5b, 0x1580211e, 0x007e5baf, - 0x90211e12, 0x07122607, 0x1249e542, 0x4be53e07, - 0xaffde4f0, 0x12fcfe35, 0x8c222209, 0x12658d64, - 0x3c40e708, 0x644565e5, 0x09121070, 0x3ee5c311, + 0xef82f507, 0x5410e5f0, 0x44edfffe, 0xef82f507, + 0x75481b12, 0x44e08683, 0x481b1210, 0xf01044e0, + 0xe02a1b12, 0x0144fd54, 0x2a1b12ff, 0x691b12ef, + 0xe50c3230, 0xf5084408, 0x82837582, 0xaff00574, + 0x5918120b, 0x08251074, 0x000208f5, 0xe5090585, + 0x0794d309, 0x00020350, 0xd37ee582, 0x04400094, + 0x0280017f, 0x7ee5007f, 0x50fa94c3, 0x80017e04, + 0xee007e02, 0x0502605f, 0x0b35307e, 0x7f01e143, + 0xb3161209, 0x53580002, 0x0002fee1, 0x8f6a8e58, + 0x8d6c8c6b, 0x016e756d, 0x75016f75, 0xf5e40170, + 0xf574f573, 0x2f079075, 0xf53cf5f0, 0xf546f53e, + 0xf53df547, 0xe56ff53f, 0xe50e706f, 0x126a456b, + 0x83753707, 0x803a7480, 0x37071208, 0x74808375, + 0x3607121a, 0xe0868375, 0xe4f00844, 0x74c36ef5, + 0xff6e953f, 0x75680812, 0xf0ef8283, 0x12741912, + 0x33e5d308, 0x070912f0, 0x40be0812, 0x706fe5e1, + 0x3707120b, 0x74808375, 0x0980f036, 0x75370712, + 0x16748083, 0x016e75f0, 0x75370712, 0x6ee5b483, + 0x741912f0, 0x6e253f74, 0x34e482f5, 0xe583f500, + 0xbf74f033, 0x82f56e25, 0x120034e4, 0xd840be08, + 0xf570f5e4, 0xf547f546, 0x0709126e, 0xfee083f5, + 0xe0d30812, 0x0024007c, 0xfe3eecff, 0xefd33bad, + 0x509cee9d, 0x80017b04, 0xe5007b02, 0x7a047070, + 0x7a028001, 0x605aeb00, 0x466e8506, 0xd3017075, + 0x9cee9def, 0x017f0450, 0x007f0280, 0x01b470e5, + 0x80017e04, 0xef007e02, 0x8503605e, 0x6e05476e, + 0x7f646ee5, 0x46e5a370, 0x47e50560, 0x85037eb4, + 0x6fe54746, 0x46850870, 0x77478576, 0x74c30e80, + 0xf546957f, 0x7f74c378, 0x79f54795, 0x37706fe5, + 0x476546e5, 0x73750c70, 0x01747501, 0x3df53cf5, + 0xf5e43580, 0x47e5c34e, 0x3cf54695, 0x71f513c3, + 0x72f54625, 0x403f94c3, 0x3df5e405, 0x74c34080, + 0xf572953f, 0xe537803d, 0x70476546, 0x0173750f, + 0xf5017575, 0x753ff53e, 0x2280014e, 0xc34ef5e4, + 0x469547e5, 0x13c33ef5, 0x462571f5, 0x94d372f5, + 0xe405503f, 0x06803ff5, 0xc12472e5, 0x6f053ff5, + 0x94c36fe5, 0x02035002, 0x6de57304, 0x02706c45, + 0x74e50480, 0x07907545, 0x017ff02f, 0x04603ee5, + 0x14703ce5, 0xf53cf5e4, 0xf53ef53d, 0xdf08123f, + 0x02f00470, 0x7a80b106, 0x95c33ce5, 0xe507403e, + 0xff3e953c, 0xe5c30680, 0xff3c953e, 0x95d376e5, + 0x85054079, 0x03807a76, 0xe57a7985, 0x7895c377, + 0x77850550, 0x8503807b, 0x7be57b78, 0x407a95d3, + 0x957be530, 0xf53cf57a, 0x7be5c33e, 0x07907a95, + 0x3ce5f019, 0x71f513c3, 0x72f57a25, 0x403f94c3, + 0x3df5e405, 0x74c31f80, 0xf572953f, 0x803ff53d, + 0x3cf5e414, 0x07903ef5, 0x0812f019, 0xf00370df, + 0x01740380, 0x680812f0, 0xe0d08375, 0xadfe0f54, + 0x7e02703c, 0x020fbe07, 0xfbee807e, 0x749bd3ef, + 0x4098f880, 0x3cf5e41f, 0x08123ef5, 0xf00370df, + 0x01741280, 0xfb08e5f0, 0xf50744eb, 0xd2837582, + 0xf01044e0, 0xebfb08e5, 0x82f50944, 0xed9e8375, + 0x0744ebf0, 0x837582f5, 0x12f0edca, 0x83756808, + 0x22f0efcc, 0x074408e5, 0x837582f5, 0xf054e0bc, + 0x4408e5f0, 0x7582f507, 0x54e0be83, 0x08e5f0f0, + 0x82f50744, 0xe0c08375, 0xe5f0f054, 0xf5074408, + 0x90f02282, 0xfee02807, 0x82f5e0a3, 0x8522838e, + 0x41854242, 0x40408541, 0xf52fc074, 0x3e027482, + 0x42e583f5, 0x2fe074f0, 0x027482f5, 0x2283f53e, + 0xfd2942e5, 0xe5fc33e4, 0xec9dc33c, 0x74f88064, + 0xf5229880, 0x0790e083, 0xfd1f5422, 0xe0a3fae0, + 0x838a82f5, 0x9022f0ed, 0xfce02207, 0x82f5e0a3, + 0x9022838c, 0xedff2407, 0xf0cf0744, 0x22f0efa3, + 0x85383885, 0x3a853939, 0x2fc0743a, 0x027482f5, + 0x2283f53e, 0xff260790, 0xcf0744ed, 0xf0efa3f0, + 0xa074f022, 0x7482f52f, 0x83f53e02, 0x25c07422, + 0xe482f511, 0x83f50134, 0x25007422, 0xe482f511, + 0x83f50234, 0x25607422, 0xe482f511, 0x83f50334, + 0x25807422, 0xe482f511, 0x83f50334, 0x25e07422, + 0xe482f511, 0x83f50334, 0x25407422, 0xe482f511, + 0x83f50634, 0x2f807422, 0x027482f5, 0x2283f53e, + 0x82e583f5, 0x82f50744, 0x22f040e5, 0x11254074, + 0x34e482f5, 0x2283f502, 0x1125c074, 0x34e482f5, + 0x2283f503, 0x11250074, 0x34e482f5, 0x2283f506, + 0x11252074, 0x34e482f5, 0x2283f506, 0xedfd08e5, + 0x82f50744, 0xf041e522, 0x016465e5, 0x7e226445, + 0x007afb00, 0x22007cfd, 0x11252074, 0x34e482f5, + 0xa0742202, 0x82f51125, 0x220334e4, 0x007e08af, + 0xf50744ef, 0x3e852282, 0x413f8542, 0x8522408f, + 0x3d85423c, 0x22408f41, 0x903f4575, 0xf0e42007, + 0x83f522a3, 0x05f032e5, 0xc36ee56e, 0xf0224094, + 0x064408e5, 0x742282f5, 0xf56e2500, 0x0034e482, + 0xe52283f5, 0x906c456d, 0xe4222f07, 0xd33ce5f9, + 0x74223e95, 0x82f52e80, 0xf50234e4, 0x7422e083, + 0x82f52ea0, 0xf50234e4, 0x7422e083, 0xf56e2580, + 0x0034e482, 0xfd422522, 0x22fc33e4, 0x85424285, + 0x40854141, 0x4ced2240, 0x09020360, 0x704eeff2, + 0x26079037, 0xe0960712, 0xd90712fd, 0x0790f0ed, + 0x96071228, 0x0712fde0, 0x12f0ede5, 0x54e09307, + 0x0812fd1f, 0xed83f584, 0x240790f0, 0xe0960712, + 0x12fd1f54, 0xf0ed3808, 0x4e0464ef, 0x07903770, + 0x96071226, 0x0712fde0, 0x90f0edf1, 0x07122807, + 0x12fde096, 0xf0edfd07, 0xe0930712, 0x12fd1f54, + 0x83f58e08, 0x0790f0ed, 0x96071224, 0xfd1f54e0, + 0xed440812, 0x0164eff0, 0x7d04704e, 0x7d028001, + 0x0264ef00, 0x7f04704e, 0x7f028001, 0x604def00, + 0x26079078, 0xe0420712, 0x090812ff, 0x3e0712ef, + 0x0812ffe0, 0x90f0ef15, 0x07122207, 0x1f54e042, + 0x500812ff, 0x0790f0ef, 0x42071224, 0xff1f54e0, + 0xef5c0812, 0x071222f0, 0x12f0e4d9, 0xf0e4e507, + 0xf5840812, 0x12f0e483, 0x14743808, 0xf10712f0, + 0x0712f0e4, 0x12f0e4fd, 0x83f58e08, 0x0812f0e4, + 0xf0147444, 0xe4090812, 0x150812f0, 0x0812f0e4, + 0x12f0e450, 0x14745c08, 0x648c22f0, 0x668a658d, + 0xf5e4678b, 0x704eef69, 0x161d0203, 0xe568f5e4, + 0x70664567, 0x37071232, 0xe4908375, 0x75360712, + 0x12e4c283, 0x83753607, 0x0812e4c4, 0x12297073, + 0x83753707, 0x0712e492, 0xc6837536, 0x360712e4, + 0xe4c88375, 0x901180f0, 0x07122607, 0x0812e442, + 0x12057073, 0xf0e43f07, 0x12161d12, 0x67e5801e, + 0x33706645, 0x75370712, 0x41e59083, 0x75360712, + 0x41e5c283, 0x75360712, 0x0812c483, 0x12297071, + 0x83753707, 0x1240e592, 0x83753607, 0x1240e5c6, + 0x83753607, 0x900e80c8, 0x07122607, 0x71081242, + 0x07120670, 0xf040e53f, 0x007e69af, 0x66ac67ad, + 0x12490412, 0x83753707, 0x94d3e0ca, 0x050c5000, + 0xc368e568, 0x03500594, 0x224b0a02, 0x75f7f953, + 0xf5e410fc, 0x30fe75fd, 0xf943fff5, 0x20e6e508, + 0xff780be7, 0xfdd8f6e4, 0x80fee653, 0xe4087809, + 0x53fdd8f6, 0x8175fee6, 0xa8f5e480, 0xa9c2a8d2, + 0xe2e5afd2, 0x2005e520, 0x038002e6, 0xe502e143, + 0x0ee020e2, 0x7f000090, 0xe4087e00, 0xfcdfa3f0, + 0x0b02fade, 0x01fa43b5, 0xf0c0e0c0, 0x82c083c0, + 0x1112d0c0, 0xd0d0d018, 0xd083d082, 0x53e0d0f0, + 0x0232fefa, 0x93e4d51a, 0x93e4f8a3, 0xdf08f6a3, + 0xe42980f9, 0x54f8a393, 0xc80c2407, 0x54c433c3, + 0xc820440f, 0xf4044083, 0x46018056, 0x80e4dff6, + 0x0402010b, 0x40201008, 0xff0f9080, 0x93017ee4, + 0xffa3c160, 0xe5303f54, 0xfe1f5409, 0x60a393e4, + 0x54cf0e01, 0x60e025c0, 0x80b840ad, 0x8d608cfe, + 0xe7081261, 0x0d402074, 0x7482f52f, 0x83f53e03, + 0x80f03ee5, 0x82f52f0b, 0xf53e0374, 0xf03ce583, + 0x95d33ce5, 0xe53c403e, 0x70604561, 0x0912e910, + 0x123ee511, 0x3b407507, 0x80a20812, 0xc33ee518, + 0x1d403895, 0xe5383e85, 0x8505603e, 0x0380393f, + 0x8f393985, 0x2108123a, 0x07123ee5, 0xf03fe5cd, + 0xe5438022, 0x70604561, 0x6c071219, 0x08120540, + 0x122780ab, 0x08121809, 0x1242e521, 0x41e5cd07, + 0x3ce522f0, 0x403895c3, 0x383c851d, 0x05603ce5, + 0x80393d85, 0x39398503, 0x08123a8f, 0x123ce521, + 0x3de5cd07, 0x388522f0, 0x39398538, 0x123a3a85, + 0x38e52108, 0xe5cd0712, 0x7f22f039, 0xb3161206, + 0x12e41c12, 0x0e12b70e, 0x0a44e0e6, 0xfe8e74f0, + 0x12b70e12, 0xf0efbe0e, 0xe53028e5, 0x0180d303, + 0x750540c3, 0x03802014, 0x12081475, 0x8375b70e, + 0xf014e58a, 0x7505ffb4, 0x06808012, 0x13c314e5, + 0xf5e412f5, 0x127ff516, 0x1312b818, 0xc30ae5a3, + 0x09500194, 0x16e51605, 0x401494c3, 0x20e4e5ea, + 0x0e1228e7, 0xd28375b7, 0xd30854e0, 0x04400094, + 0x0280017f, 0x0ae5007f, 0x400194c3, 0x80017e04, + 0xef007e02, 0x1203605e, 0x7fe5981d, 0x401194c3, + 0xb70e1214, 0xe0d28375, 0xe5f08044, 0x0fe720e4, + 0x80981d12, 0xb70e120a, 0xe0d28375, 0x12f07f54, + 0x7422e41c, 0x82088580, 0x17e583f5, 0xed0e12f0, + 0x0790f0e4, 0x0e12e002, 0x908375ca, 0x9274f0ef, + 0x4408e5fe, 0x82f5ff07, 0x54e0838e, 0x0790fdc0, + 0x3f54e003, 0x8e828f4d, 0x0790f083, 0x0e12e004, + 0x828375ca, 0x0790f0ef, 0xedffe005, 0x82f50744, + 0xefb48375, 0x75b60e12, 0x54e08083, 0x3730f0bf, + 0x440f120a, 0xe0948375, 0x30f08044, 0x0f120a38, + 0x92837544, 0xf08044e0, 0xe43028e5, 0x0a39201a, + 0x75b70e12, 0x54e08883, 0x3a20f07f, 0xb70e120a, + 0xe0888375, 0x74f0bf54, 0x0e12fe8c, 0xe0838eb7, + 0x0e120f54, 0x868375b6, 0xf0bf54e0, 0x064408e5, + 0x75b00e12, 0xf0e48a83, 0x704eef22, 0xd9071226, + 0x0790fde0, 0x88071226, 0xe0e50712, 0x280790fd, + 0x12880712, 0x07128408, 0x3808127f, 0x240790e0, + 0xef850712, 0x704e0464, 0xf1071229, 0x0790fde0, + 0x88071226, 0xe0fd0712, 0x280790fd, 0x12880712, + 0x07128e08, 0x4408127f, 0xfd1f54e0, 0x12240790, + 0x64ef8807, 0x04704e01, 0x0280017d, 0x64ef007d, + 0x04704e02, 0x0280017f, 0x4def007f, 0x08123560, + 0x90ffe009, 0x07122607, 0x12f0ef96, 0xffe01508, + 0x12280790, 0xf0ef9607, 0xe0500812, 0x12ff1f54, + 0xf0ef9307, 0xe05c0812, 0x90ff1f54, 0x07122407, + 0x22f0ef96, 0x837582f5, 0xe5f0e482, 0xf5074408, + 0x838e2282, 0x5410f5e0, 0x10e5f0fe, 0xe5ff0144, + 0x44edfd08, 0x2282f507, 0x54c415e5, 0x08e5ff07, + 0x0844edfd, 0x837582f5, 0x83752282, 0x4044e080, + 0x4408e5f0, 0x7582f508, 0xe5228a83, 0x25e02516, + 0xf52f24e0, 0x1a34e482, 0x93e483f5, 0x43220df5, + 0xe14310e1, 0xfde15380, 0x2210e185, 0xe02516e5, + 0x3224e025, 0x34e482f5, 0xe483f51a, 0x55852293, + 0x83548582, 0x22f015e5, 0x2054e2e5, 0x220094d3, + 0x4054e2e5, 0x220094d3, 0x064408e5, 0xfd2282f5, + 0xebfb08e5, 0x82f50744, 0x53f5e422, 0x40340f12, + 0x80017f04, 0x12007f02, 0x04403c0f, 0x0280017e, + 0x4fee007e, 0x0f020370, 0x10e185f7, 0x5302e143, + 0xe1850fe1, 0x51f5e410, 0x3f54e3e5, 0x0f1252f5, + 0xad1d403c, 0x1251af52, 0x60efb01c, 0x10e18508, + 0x8040e143, 0xbfe1530b, 0x120b0f12, 0xfb800600, + 0x3f54e3e5, 0xe4e551f5, 0x52f53f54, 0x40340f12, + 0xaf52ad1d, 0xb01c1251, 0x850860ef, 0xe14310e1, + 0x530b8020, 0x0f12dfe1, 0x0600120b, 0x0f12fb80, + 0x7f044034, 0x7f028001, 0x3c0f1200, 0x017e0440, + 0x007e0280, 0x03604fee, 0x220e0f12, 0x01001f01, + 0x00002003, 0x02001102, 0x10024010, 0x00000090, + 0x00000000, 0x1f011f01, 0x1257f5e4, 0x15123f16, + 0x1012e4c6, 0xb7141256, 0x12260790, 0x12e44207, + 0xf0e43e07, 0x12561012, 0x0790b714, 0x42071226, + 0x071241e5, 0xf040e53e, 0x007e57af, 0x007c56ad, + 0xaf490412, 0x02007e56, 0x90ffee11, 0xe0a32007, + 0x56f5e4fd, 0xfcfe40f5, 0x12fa56ab, 0x0f7f5111, + 0xf5e4187d, 0xfe40f556, 0xfa56abfc, 0xaf411512, + 0x12007e56, 0xffe47f1a, 0x1f7d56f5, 0xfcfe40f5, + 0x22fa56ab, 0x55f5e422, 0x74fd08e5, 0xed56f5a0, + 0x57f50744, 0xe53028e5, 0x0180d303, 0x7f0540c3, + 0x0480ef28, 0xc3ef147f, 0xe454f513, 0xcb0e12f9, + 0xe08e8375, 0xefce10f5, 0x94d3eece, 0xe5264000, + 0x12fe5410, 0x83754b0f, 0xe5f0ed8e, 0xfd014410, + 0xf50744eb, 0x85f0ed82, 0x56858257, 0xe330e083, + 0x801e0901, 0xe934c2d4, 0x405495c3, 0x2234d202, + 0x00000f22, 0x90113030, 0x93e40010, 0x109010f5, + 0xf593e410, 0x90101210, 0x22501112, 0xe730e2e5, + 0x0310120e, 0x303030c2, 0xfc101203, 0xe5213320, + 0x2094c3fe, 0xf9530950, 0x30fe75f7, 0xe508f943, + 0x03e730f2, 0xe57ff953, 0xd37054f1, 0xdf500094, + 0x00000022, 0x8f588e22, 0x8d5a8c59, 0x8b5c8a5b, + 0x015e755d, 0xf55ff5e4, 0x1262f560, 0x83753707, + 0xc4ffe0d0, 0x61f50f54, 0x85661e12, 0xe5d35e59, + 0xe55b955e, 0x7807125a, 0x07124b50, 0xbc837510, + 0x125e45e0, 0x83753607, 0x5e45e0be, 0x75360712, + 0x45e0c083, 0x5faff05e, 0x081260e5, 0x360a127b, + 0x007e62af, 0x5cac5dad, 0xe5490412, 0x7e5eaf61, + 0x0503b400, 0x80e21d12, 0xac5dad07, 0x1713125c, + 0x11025e05, 0x1007127a, 0xe0bc8375, 0x07124045, + 0xbe837536, 0x124045e0, 0x83753607, 0x4045e0c0, + 0x588e22f0, 0x5a75598f, 0x75017901, 0xfbe4015b, + 0x75370712, 0x54e0ae83, 0x0812ff1a, 0x13c4e068, + 0xeffe0754, 0x65ee0c70, 0x90077035, 0xb4e02f07, + 0x35af0d01, 0x0e12007e, 0xcfebcf05, 0xe5211e02, + 0x45026459, 0x7f047058, 0x7f028001, 0x4559e500, + 0x7e047058, 0x7e028001, 0x604fee00, 0x49418523, + 0xe54b4085, 0x70584559, 0xfe5aaf2c, 0xfccde9cd, + 0x58aa59ab, 0xaf360a12, 0x12007e5b, 0x1580211e, + 0x007e5baf, 0x90211e12, 0x07122607, 0x1249e542, + 0x4be53e07, 0xaffde4f0, 0x12fcfe35, 0x8c222209, + 0x12658d64, 0x3c40e708, 0x644565e5, 0x09121070, + 0x3ee5c311, 0x40760712, 0xa208123b, 0x3ee51880, + 0x403895c3, 0x383e851d, 0x05603ee5, 0x80393f85, + 0x39398503, 0x07123a8f, 0x123ee5b5, 0x3fe56007, + 0x3b8022f0, 0x644565e5, 0x07121170, 0x1205406c, + 0x1f80ab08, 0xe54b0712, 0xe522f041, 0x3895c33c, + 0x3c851d40, 0x603ce538, 0x393d8505, 0x39850380, + 0x123a8f39, 0x3ce5b507, 0xe5600712, 0x1222f03d, + 0x38e5ac07, 0xe5600712, 0x8c22f039, 0x12648d63, + 0x3c40e708, 0x634564e5, 0x09121070, 0x3ee5c311, 0x40760712, 0xa208123b, 0x3ee51880, 0x403895c3, 0x383e851d, 0x05603ee5, 0x80393f85, 0x39398503, 0x07123a8f, 0x123ee5b5, 0x3fe56007, 0x3b8022f0, - 0x644565e5, 0x07121170, 0x1205406c, 0x1f80ab08, + 0x634564e5, 0x07121170, 0x1205406c, 0x1f80ab08, 0xe54b0712, 0xe522f041, 0x3895c33c, 0x3c851d40, 0x603ce538, 0x393d8505, 0x39850380, 0x123a8f39, 0x3ce5b507, 0xe5600712, 0x1222f03d, 0x38e5ac07, - 0xe5600712, 0x8c22f039, 0x12648d63, 0x3c40e708, - 0x634564e5, 0x09121070, 0x3ee5c311, 0x40760712, - 0xa208123b, 0x3ee51880, 0x403895c3, 0x383e851d, - 0x05603ee5, 0x80393f85, 0x39398503, 0x07123a8f, - 0x123ee5b5, 0x3fe56007, 0x3b8022f0, 0x634564e5, - 0x07121170, 0x1205406c, 0x1f80ab08, 0xe54b0712, - 0xe522f041, 0x3895c33c, 0x3c851d40, 0x603ce538, - 0x393d8505, 0x39850380, 0x123a8f39, 0x3ce5b507, - 0xe5600712, 0x1222f03d, 0x38e5ac07, 0xe5600712, - 0xe522f039, 0x08e5fe0d, 0x0544548e, 0x157555f5, - 0x1282f50f, 0x17122d0f, 0x05312025, 0x80031575, - 0x0b157503, 0x94c30ae5, 0x12385001, 0x31202014, - 0x05150506, 0x15048015, 0xe5151515, 0x0194c30a, - 0x14122150, 0x04312020, 0x02801505, 0x0ae51515, - 0x500194c3, 0x2a0f120e, 0x20251712, 0x15050531, - 0xe52a0f12, 0x0408b415, 0x0280017f, 0x15e5007f, - 0x7e0407b4, 0x7e028001, 0x604fee00, 0x227f0502, - 0x85825585, 0x15e58354, 0x251712f0, 0x37071222, - 0x74ae8375, 0x360712ff, 0xf51a54e0, 0x13c4e034, - 0x35f50754, 0x2460fe24, 0x3c60fe24, 0x63700424, - 0xe52d3175, 0xb674fd08, 0x749f0712, 0x220790bc, - 0x74a20712, 0xc0071290, 0x3c809274, 0xe53a3175, - 0xba74fd08, 0x749f0712, 0x220790c0, 0x74c30712, - 0xc00712c4, 0x2080c874, 0xe5353175, 0xb874fd08, - 0x749f0712, 0x44edffbe, 0x22079007, 0xefa3f0cf, - 0x12c274f0, 0xc674c007, 0x0744edff, 0xa3f0cfa3, - 0x7522f0ef, 0x8e220134, 0x8c598f58, 0x8a5b8d5a, - 0x755d8b5c, 0xf5e4015e, 0x661e125f, 0xd35e5985, - 0x5b955ee5, 0x07125ae5, 0xe5575078, 0x705c455d, - 0x37071230, 0xe5928375, 0x3607125e, 0xe5c68375, - 0x3607125e, 0xe5c88375, 0x3607125e, 0xe5908375, - 0x3607125e, 0xe5c28375, 0x3607125e, 0x80c48375, - 0x3f071203, 0xaff05ee5, 0xad007e5f, 0x125cac5d, - 0x5eaf4904, 0x5dad007e, 0x0b125cac, 0x025e05d9, - 0x5dabcf14, 0x5bad5caa, 0x59af5aac, 0x1b0258ae, - 0x8d5c8c7b, 0x8b5e8a5d, 0x0160755f, 0xf561f5e4, - 0x1263f562, 0x608f661e, 0x9560e5d3, 0x125ce55d, - 0x61507807, 0x5e455fe5, 0x07122770, 0xb6837537, - 0x071260e5, 0xb8837536, 0x071260e5, 0xba837536, - 0xaff060e5, 0xe5007e61, 0x7d081262, 0x80360a12, - 0x24079019, 0xe5420712, 0x36071260, 0xe48e8375, - 0x74360712, 0x36071201, 0x63aff0e4, 0x5fad007e, - 0x04125eac, 0x7e60af49, 0xac5fad00, 0x8b12125e, - 0x15026005, 0xf5e42258, 0xaf59f558, 0x0744ef08, - 0x837582f5, 0xc4fde0d0, 0x5af50f54, 0xf50744ef, - 0x80837582, 0x12f00174, 0x83759a08, 0xf045e582, - 0xf50744ef, 0x8a837582, 0x12f0ff74, 0x07127419, - 0xbc837537, 0x12ef54e0, 0x83753607, 0xef54e0be, - 0x75360712, 0x54e0c083, 0x360712ef, 0xe0bc8375, - 0x07121044, 0xbe837536, 0x121044e0, 0x83753607, - 0x1044e0c0, 0xe558aff0, 0x7b081259, 0xe4360a02, - 0x017d58f5, 0x35af59f5, 0x0912fcfe, 0x37071222, - 0x74b68375, 0x36071210, 0x74b88375, 0x36071210, - 0x74ba8375, 0x36071210, 0x74bc8375, 0x36071210, - 0x74be8375, 0x36071210, 0x74c08375, 0x36071210, - 0xe4908375, 0x75360712, 0x12e4c283, 0x83753607, - 0x0712e4c4, 0x92837536, 0x360712e4, 0xe4c68375, - 0x75360712, 0xf0e4c883, 0xe5fe58af, 0x7d081259, - 0xe5360a02, 0x6ce430e2, 0xc054e7e5, 0x64704064, - 0x54c409e5, 0x08e5fe30, 0xe025e025, 0xfe4ec054, - 0x4e3f54ef, 0xae2be5fd, 0xc302782a, 0xce33ce33, - 0x82f5f9d8, 0xf0ed838e, 0x2aae2be5, 0x33c30278, - 0xd8ce33ce, 0x82f5fff9, 0xe5a3838e, 0x828ff0fe, - 0xa3a3838e, 0x8ff0fde5, 0xa3838e82, 0xfce5a3a3, - 0x2be5c3f0, 0x2ae5fa94, 0x08500094, 0x2be52b05, - 0x2a050270, 0xe4ffe422, 0x56f558f5, 0x827457f5, - 0xb70e12fc, 0xf5e0838c, 0xf07f5410, 0x804410e5, - 0xed4b0f12, 0x120a7ef0, 0x8375b70e, 0xe020e0a0, - 0x05f4de26, 0x7057e557, 0xe5560502, 0xfd012414, - 0xd3fc33e4, 0xe59d57e5, 0xd9409c56, 0x20940ae5, - 0x0a050250, 0xc208e143, 0xb70e1231, 0xe0a68375, - 0x12651255, 0x31d20370, 0x2231c222, 0xe0260790, - 0xf5e0a3fa, 0xe0838a82, 0x39e541f5, 0x404195c3, - 0x9539e526, 0xee9fc341, 0x40780712, 0x80017c04, - 0xe5007c02, 0x603f6441, 0x80017b04, 0xec007b02, - 0x0529605b, 0xc3288041, 0x399541e5, 0x12ee9fc3, - 0x04407807, 0x0280017f, 0x41e5007f, 0x017e0460, - 0x007e0280, 0x04605eef, 0x03804115, 0x85413985, - 0xe522403a, 0x60e430e2, 0xe230e1e5, 0x7009e55b, - 0x80017f04, 0xe5007f02, 0x7e047008, 0x7e028001, - 0x605fee00, 0xf8f95343, 0xe430e2e5, 0x30e1e53b, - 0xfa432ee2, 0xfbfa5302, 0x9010f5e4, 0x10e57094, - 0x30e1e5f0, 0x9490e7e2, 0x1065e070, 0xfa430360, - 0x90100504, 0x10e57094, 0x12e670f0, 0xe1800600, - 0x53fdfa53, 0xc080fbfa, 0x12548f22, 0xe1e50600, - 0x7f04e030, 0x7f028001, 0xd37ee500, 0x04400594, - 0x0280017e, 0x4fee007e, 0x54853d60, 0x20e2e511, - 0xce7432e1, 0x303c1b12, 0x017d04e7, 0x007d0280, - 0x838e828f, 0x04e630e0, 0x0280017f, 0x5def007f, - 0x1c121570, 0x12ce7467, 0xe6303c1b, 0x8044e007, - 0x80f943f0, 0x22f31712, 0xe5f70e12, 0x25e02516, - 0xf53024e0, 0x1a34e482, 0x93e483f5, 0x16e50ff5, - 0xe025e025, 0x82f53124, 0xf51a34e4, 0xf593e483, - 0x180f120e, 0x0fe510f5, 0x0e12f054, 0x8c8375ca, - 0x0fe5f0ef, 0x120ce030, 0x8375b70e, 0x4044e086, - 0x120a80f0, 0x8375b70e, 0xbf54e086, 0x440f12f0, - 0xe5828375, 0x7f22f00e, 0xb3161205, 0x12b70e12, - 0x0274e60e, 0xfe8e74f0, 0x12b70e12, 0xf0efbe0e, - 0x12701575, 0x34208a1e, 0x10157505, 0x15750380, - 0x8a1e1250, 0x74043420, 0x74028010, 0xf51525f0, - 0xd40e1215, 0x1012f0ef, 0x17342091, 0x306415e5, - 0x10740c60, 0x15f51525, 0xe40380b4, 0x0e1215f5, - 0x22f0efd4, 0x2a0790e4, 0x12f0a3f0, 0x83753707, - 0x7f54e082, 0xe0360712, 0x12f08044, 0x08123d00, - 0xa0837598, 0x1ae020e0, 0xe02b0790, 0x0670f004, - 0xe02a0790, 0x0790f004, 0x10b4e02a, 0xb4e0a3e1, - 0x44eedc00, 0x44effca6, 0x8c82f507, 0x32f5e083, - 0xfea844ee, 0xf50744ef, 0xe0838e82, 0x122233f5, - 0x83759808, 0x54c4e0d0, 0x4375fd0f, 0xff447501, - 0x74b70812, 0x3b75f004, 0x6014ed01, 0x0b60140c, - 0x240f6014, 0x800b7003, 0x12008009, 0xf004b408, - 0x08120680, 0xf00474b4, 0xfe8244ee, 0xf50744ef, - 0xe5838e82, 0xcb081245, 0xe5828375, 0x36071231, - 0xe0868375, 0x22f00844, 0x000f1f01, 0x90002003, - 0x920f2000, 0x940f2100, 0x960f2200, 0x980f2300, - 0x9a0f2400, 0x9c0f2500, 0x9e0f2600, 0xa00f2700, - 0xa2012001, 0xa4012101, 0xa6012201, 0xa8012301, - 0xaa012401, 0xac012501, 0xae012601, 0xb0012701, - 0xb4012801, 0xb60f2800, 0xb80f2840, 0xcb012861, - 0xeecacbef, 0xe4017fca, 0x704aebfd, 0xf508e524, - 0x12b67482, 0x08e52c08, 0xb87482f5, 0xe52c0812, - 0x7482f508, 0x2c0812ba, 0x007c007e, 0x80360a12, - 0x26079012, 0xe5420712, 0x0790f041, 0x42071224, - 0x12f040e5, 0x83753707, 0x0712e48e, 0x12017436, - 0xf0e43607, 0x26f5e422, 0xe15327f5, 0x752af5fe, - 0x08f5012b, 0x1612017f, 0x1c3030b3, 0xe4291a90, - 0x9010f593, 0x93e4f91f, 0x009010f5, 0xf593e441, - 0xf90f9010, 0x10f593e4, 0x1612027f, 0x550f12b3, - 0x1612037f, 0x060012b3, 0xe730e2e5, 0x00101209, - 0x12033030, 0x00020011, 0x0be5f047, 0xe025e025, - 0x82f58224, 0xf50734e4, 0x88742283, 0x4408e5fe, - 0x82f5ff07, 0x22e0838e, 0x4408e5f0, 0x2282f507, - 0xc054e0f0, 0x838e828f, 0x44ef22f0, 0x7582f507, - 0x54e08683, 0x0094d310, 0x0790f022, 0xf004e015, - 0x44effe22, 0x8e82f507, 0x8e22e083, 0x12618f60, - 0xffe4661e, 0xeeceedce, 0xe56195d3, 0x78071260, - 0x20743940, 0xe482f52e, 0x83f50334, 0xff0370e0, - 0x08122680, 0x9fc3fdef, 0xedcf1e40, 0x704aebcf, - 0x12428d0b, 0x41f5fb08, 0x0c80408e, 0xf5ef0812, - 0xfb081238, 0x3a8e39f5, 0x22bc801e, 0xe5015875, - 0x120c7035, 0xf5e0d907, 0xe507124a, 0xe54cf5e0, - 0x0c04b435, 0xe0f10712, 0x07124af5, 0x4cf5e0fd, - 0x01b435e5, 0x80017f04, 0xe5007f02, 0x0402b435, - 0x0280017e, 0x4fee007e, 0x08120c60, 0x4af5e009, - 0xe0150812, 0x41854cf5, 0x4b408549, 0x015b7522, - 0x12240790, 0x54e04207, 0x94d3ff1f, 0x8f045002, - 0xef058058, 0x58f5fe24, 0x1894c3ef, 0x59750540, - 0xef048018, 0x8559f504, 0x58af5a43, 0x59ad007e, - 0x5bab007c, 0x1512007a, 0x7e5aaf41, 0x8c171200, - 0x007e5baf, 0x907f1a02, 0x93e4fd10, 0xf02e0790, - 0x122d1412, 0x34e5cf19, 0x07123570, 0xce837537, - 0x1313ffe0, 0xf5075413, 0x240f5436, 0x240b60fe, - 0x240a60fe, 0x02187003, 0x1e026f1d, 0x14101252, - 0x1255f5e4, 0x5505461d, 0x94c355e5, 0x22f44005, - 0xedc3fce4, 0xf5effa9f, 0x00827583, 0x93e4ff79, - 0xa3cc6ccc, 0xf6daf8d9, 0xe430e2e5, 0xede58c02, - 0xefffff24, 0xf5ff8275, 0x6c93e483, 0x017f0370, - 0x22007f22, 0x75b70e12, 0xf0e48083, 0x074408e5, - 0x75b00e12, 0x0e128483, 0x868375b5, 0x75b50e12, - 0x54e08c83, 0xb60e12f3, 0x128e8375, 0x8375b50e, - 0xfb54e094, 0x071222f0, 0x8e837537, 0x360712e4, - 0x07120174, 0x0812e436, 0x8c8375cb, 0x122044e0, - 0x54e0cb08, 0x8474f0df, 0xf5820885, 0x7f54e083, - 0x8044e0f0, 0x567522f0, 0xf5fde401, 0xfe35af57, - 0x220912fc, 0x121d1c12, 0x1b123b1e, 0x7e57afcc, - 0x7c56ad00, 0x49041200, 0x007e56af, 0x75ee1102, - 0xfde40156, 0x35af57f5, 0x0912fcfe, 0x1d1c1222, - 0x123b1e12, 0x57afcc1b, 0x56ad007e, 0x0412007c, - 0x7e56af49, 0xee110200, 0x1216f5e4, 0xe5fef70e, - 0xff054408, 0x8f180f12, 0xf0838e82, 0x16e51605, - 0x401494c3, 0x1208e5e6, 0xf0e4de0e, 0x58f5e422, - 0x5af559f5, 0x58adfeff, 0x220912fc, 0x007e047f, - 0x007c58ad, 0x7f220912, 0xad007e02, 0x02007c58, - 0x3ce52209, 0xe5fc3e25, 0xfb002442, 0xecfa33e4, - 0x12ea9bc3, 0x0b407807, 0x3de5428c, 0x41f53f25, - 0x1222408f, 0x74221809, 0x8518f584, 0x19851908, - 0x83188582, 0xf07f54e0, 0xf08044e0, 0xf08044e0, - 0x704eef22, 0x3707120b, 0xe0d28375, 0x22f0df54, - 0x75370712, 0x44e0d283, 0x7522f020, 0x07900158, - 0x42071226, 0xf53f54e0, 0x3f071241, 0xf53f54e0, - 0x56752240, 0x57f5e402, 0xafbd1d12, 0xad007e57, - 0x02007c56, 0xf5e44904, 0xf541f542, 0xf538f540, - 0x223af539, 0xff0754ef, 0xf854f9e5, 0x22f9f54f, - 0xfee4017f, 0xffbe0e0f, 0x0e1222fb, 0x12f0efd4, - 0x00229110, 0x00000000, 0x00000000, 0x00000000, + 0xe5600712, 0xe522f039, 0x08e5fe0d, 0x0544548e, + 0x157555f5, 0x1282f50f, 0x17122d0f, 0x05312025, + 0x80031575, 0x0b157503, 0x94c30ae5, 0x12385001, + 0x31202014, 0x05150506, 0x15048015, 0xe5151515, + 0x0194c30a, 0x14122150, 0x04312020, 0x02801505, + 0x0ae51515, 0x500194c3, 0x2a0f120e, 0x20251712, + 0x15050531, 0xe52a0f12, 0x0408b415, 0x0280017f, + 0x15e5007f, 0x7e0407b4, 0x7e028001, 0x604fee00, + 0x227f0502, 0x85825585, 0x15e58354, 0x251712f0, + 0x37071222, 0x74ae8375, 0x360712ff, 0xf51a54e0, + 0x13c4e034, 0x35f50754, 0x2460fe24, 0x3c60fe24, + 0x63700424, 0xe52d3175, 0xb674fd08, 0x749f0712, + 0x220790bc, 0x74a20712, 0xc0071290, 0x3c809274, + 0xe53a3175, 0xba74fd08, 0x749f0712, 0x220790c0, + 0x74c30712, 0xc00712c4, 0x2080c874, 0xe5353175, + 0xb874fd08, 0x749f0712, 0x44edffbe, 0x22079007, + 0xefa3f0cf, 0x12c274f0, 0xc674c007, 0x0744edff, + 0xa3f0cfa3, 0x7522f0ef, 0x8e220134, 0x8c598f58, + 0x8a5b8d5a, 0x755d8b5c, 0xf5e4015e, 0x661e125f, + 0xd35e5985, 0x5b955ee5, 0x07125ae5, 0xe5575078, + 0x705c455d, 0x37071230, 0xe5928375, 0x3607125e, + 0xe5c68375, 0x3607125e, 0xe5c88375, 0x3607125e, + 0xe5908375, 0x3607125e, 0xe5c28375, 0x3607125e, + 0x80c48375, 0x3f071203, 0xaff05ee5, 0xad007e5f, + 0x125cac5d, 0x5eaf4904, 0x5dad007e, 0x0b125cac, + 0x025e05d9, 0x5dabcf14, 0x5bad5caa, 0x59af5aac, + 0x1b0258ae, 0x8d5c8c7b, 0x8b5e8a5d, 0x0160755f, + 0xf561f5e4, 0x1263f562, 0x608f661e, 0x9560e5d3, + 0x125ce55d, 0x61507807, 0x5e455fe5, 0x07122770, + 0xb6837537, 0x071260e5, 0xb8837536, 0x071260e5, + 0xba837536, 0xaff060e5, 0xe5007e61, 0x7d081262, + 0x80360a12, 0x24079019, 0xe5420712, 0x36071260, + 0xe48e8375, 0x74360712, 0x36071201, 0x63aff0e4, + 0x5fad007e, 0x04125eac, 0x7e60af49, 0xac5fad00, + 0x8b12125e, 0x15026005, 0xf5e42258, 0xaf59f558, + 0x0744ef08, 0x837582f5, 0xc4fde0d0, 0x5af50f54, + 0xf50744ef, 0x80837582, 0x12f00174, 0x83759a08, + 0xf045e582, 0xf50744ef, 0x8a837582, 0x12f0ff74, + 0x07127419, 0xbc837537, 0x12ef54e0, 0x83753607, + 0xef54e0be, 0x75360712, 0x54e0c083, 0x360712ef, + 0xe0bc8375, 0x07121044, 0xbe837536, 0x121044e0, + 0x83753607, 0x1044e0c0, 0xe558aff0, 0x7b081259, + 0xe4360a02, 0x017d58f5, 0x35af59f5, 0x0912fcfe, + 0x37071222, 0x74b68375, 0x36071210, 0x74b88375, + 0x36071210, 0x74ba8375, 0x36071210, 0x74bc8375, + 0x36071210, 0x74be8375, 0x36071210, 0x74c08375, + 0x36071210, 0xe4908375, 0x75360712, 0x12e4c283, + 0x83753607, 0x0712e4c4, 0x92837536, 0x360712e4, + 0xe4c68375, 0x75360712, 0xf0e4c883, 0xe5fe58af, + 0x7d081259, 0xe5360a02, 0x6ce430e2, 0xc054e7e5, + 0x64704064, 0x54c409e5, 0x08e5fe30, 0xe025e025, + 0xfe4ec054, 0x4e3f54ef, 0xae2be5fd, 0xc302782a, + 0xce33ce33, 0x82f5f9d8, 0xf0ed838e, 0x2aae2be5, + 0x33c30278, 0xd8ce33ce, 0x82f5fff9, 0xe5a3838e, + 0x828ff0fe, 0xa3a3838e, 0x8ff0fde5, 0xa3838e82, + 0xfce5a3a3, 0x2be5c3f0, 0x2ae5fa94, 0x08500094, + 0x2be52b05, 0x2a050270, 0xe4ffe422, 0x56f558f5, + 0x827457f5, 0xb70e12fc, 0xf5e0838c, 0xf07f5410, + 0x804410e5, 0xed4b0f12, 0x120a7ef0, 0x8375b70e, + 0xe020e0a0, 0x05f4de26, 0x7057e557, 0xe5560502, + 0xfd012414, 0xd3fc33e4, 0xe59d57e5, 0xd9409c56, + 0x20940ae5, 0x0a050250, 0xc208e143, 0xb70e1231, + 0xe0a68375, 0x12651255, 0x31d20370, 0x2231c222, + 0xe0260790, 0xf5e0a3fa, 0xe0838a82, 0x39e541f5, + 0x404195c3, 0x9539e526, 0xee9fc341, 0x40780712, + 0x80017c04, 0xe5007c02, 0x603f6441, 0x80017b04, + 0xec007b02, 0x0529605b, 0xc3288041, 0x399541e5, + 0x12ee9fc3, 0x04407807, 0x0280017f, 0x41e5007f, + 0x017e0460, 0x007e0280, 0x04605eef, 0x03804115, + 0x85413985, 0xe522403a, 0x60e430e2, 0xe230e1e5, + 0x7009e55b, 0x80017f04, 0xe5007f02, 0x7e047008, + 0x7e028001, 0x605fee00, 0xf8f95343, 0xe430e2e5, + 0x30e1e53b, 0xfa432ee2, 0xfbfa5302, 0x9010f5e4, + 0x10e57094, 0x30e1e5f0, 0x9490e7e2, 0x1065e070, + 0xfa430360, 0x90100504, 0x10e57094, 0x12e670f0, + 0xe1800600, 0x53fdfa53, 0xc080fbfa, 0x12548f22, + 0xe1e50600, 0x7f04e030, 0x7f028001, 0xd37ee500, + 0x04400594, 0x0280017e, 0x4fee007e, 0x54853d60, + 0x20e2e511, 0xce7432e1, 0x303c1b12, 0x017d04e7, + 0x007d0280, 0x838e828f, 0x04e630e0, 0x0280017f, + 0x5def007f, 0x1c121570, 0x12ce7467, 0xe6303c1b, + 0x8044e007, 0x80f943f0, 0x22f31712, 0xe5f70e12, + 0x25e02516, 0xf53024e0, 0x1a34e482, 0x93e483f5, + 0x16e50ff5, 0xe025e025, 0x82f53124, 0xf51a34e4, + 0xf593e483, 0x180f120e, 0x0fe510f5, 0x0e12f054, + 0x8c8375ca, 0x0fe5f0ef, 0x120ce030, 0x8375b70e, + 0x4044e086, 0x120a80f0, 0x8375b70e, 0xbf54e086, + 0x440f12f0, 0xe5828375, 0x7f22f00e, 0xb3161205, + 0x12b70e12, 0x0274e60e, 0xfe8e74f0, 0x12b70e12, + 0xf0efbe0e, 0x12701575, 0x34208a1e, 0x10157505, + 0x15750380, 0x8a1e1250, 0x74043420, 0x74028010, + 0xf51525f0, 0xd40e1215, 0x1012f0ef, 0x17342091, + 0x306415e5, 0x10740c60, 0x15f51525, 0xe40380b4, + 0x0e1215f5, 0x22f0efd4, 0x2a0790e4, 0x12f0a3f0, + 0x83753707, 0x7f54e082, 0xe0360712, 0x12f08044, + 0x08123d00, 0xa0837598, 0x1ae020e0, 0xe02b0790, + 0x0670f004, 0xe02a0790, 0x0790f004, 0x10b4e02a, + 0xb4e0a3e1, 0x44eedc00, 0x44effca6, 0x8c82f507, + 0x32f5e083, 0xfea844ee, 0xf50744ef, 0xe0838e82, + 0x122233f5, 0x83759808, 0x54c4e0d0, 0x4375fd0f, + 0xff447501, 0x74b70812, 0x3b75f004, 0x6014ed01, + 0x0b60140c, 0x240f6014, 0x800b7003, 0x12008009, + 0xf004b408, 0x08120680, 0xf00474b4, 0xfe8244ee, + 0xf50744ef, 0xe5838e82, 0xcb081245, 0xe5828375, + 0x36071231, 0xe0868375, 0x22f00844, 0x000f1f01, + 0x90002003, 0x920f2000, 0x940f2100, 0x960f2200, + 0x980f2300, 0x9a0f2400, 0x9c0f2500, 0x9e0f2600, + 0xa00f2700, 0xa2012001, 0xa4012101, 0xa6012201, + 0xa8012301, 0xaa012401, 0xac012501, 0xae012601, + 0xb0012701, 0xb4012801, 0xb60f2800, 0xb80f2840, + 0xcb012861, 0xeecacbef, 0xe4017fca, 0x704aebfd, + 0xf508e524, 0x12b67482, 0x08e52c08, 0xb87482f5, + 0xe52c0812, 0x7482f508, 0x2c0812ba, 0x007c007e, + 0x80360a12, 0x26079012, 0xe5420712, 0x0790f041, + 0x42071224, 0x12f040e5, 0x83753707, 0x0712e48e, + 0x12017436, 0xf0e43607, 0x26f5e422, 0xe15327f5, + 0x752af5fe, 0x08f5012b, 0x1612017f, 0x1c3030b3, + 0xe4291a90, 0x9010f593, 0x93e4f91f, 0x009010f5, + 0xf593e441, 0xf90f9010, 0x10f593e4, 0x1612027f, + 0x550f12b3, 0x1612037f, 0x060012b3, 0xe730e2e5, + 0x00101209, 0x12033030, 0x00020011, 0x0be5f047, + 0xe025e025, 0x82f58224, 0xf50734e4, 0x88742283, + 0x4408e5fe, 0x82f5ff07, 0x22e0838e, 0x4408e5f0, + 0x2282f507, 0xc054e0f0, 0x838e828f, 0x44ef22f0, + 0x7582f507, 0x54e08683, 0x0094d310, 0x0790f022, + 0xf004e015, 0x44effe22, 0x8e82f507, 0x8e22e083, + 0x12618f60, 0xffe4661e, 0xeeceedce, 0xe56195d3, + 0x78071260, 0x20743940, 0xe482f52e, 0x83f50334, + 0xff0370e0, 0x08122680, 0x9fc3fdef, 0xedcf1e40, + 0x704aebcf, 0x12428d0b, 0x41f5fb08, 0x0c80408e, + 0xf5ef0812, 0xfb081238, 0x3a8e39f5, 0x22bc801e, + 0xe5015875, 0x120c7035, 0xf5e0d907, 0xe507124a, + 0xe54cf5e0, 0x0c04b435, 0xe0f10712, 0x07124af5, + 0x4cf5e0fd, 0x01b435e5, 0x80017f04, 0xe5007f02, + 0x0402b435, 0x0280017e, 0x4fee007e, 0x08120c60, + 0x4af5e009, 0xe0150812, 0x41854cf5, 0x4b408549, + 0x015b7522, 0x12240790, 0x54e04207, 0x94d3ff1f, + 0x8f045002, 0xef058058, 0x58f5fe24, 0x1894c3ef, + 0x59750540, 0xef048018, 0x8559f504, 0x58af5a43, + 0x59ad007e, 0x5bab007c, 0x1512007a, 0x7e5aaf41, + 0x8c171200, 0x007e5baf, 0x907f1a02, 0x93e4fd10, + 0xf02e0790, 0x122d1412, 0x34e5cf19, 0x07123570, + 0xce837537, 0x1313ffe0, 0xf5075413, 0x240f5436, + 0x240b60fe, 0x240a60fe, 0x02187003, 0x1e026f1d, + 0x14101252, 0x1255f5e4, 0x5505461d, 0x94c355e5, + 0x22f44005, 0xedc3fce4, 0xf5effa9f, 0x00827583, + 0x93e4ff79, 0xa3cc6ccc, 0xf6daf8d9, 0xe430e2e5, + 0xede58c02, 0xefffff24, 0xf5ff8275, 0x6c93e483, + 0x017f0370, 0x22007f22, 0x75b70e12, 0xf0e48083, + 0x074408e5, 0x75b00e12, 0x0e128483, 0x868375b5, + 0x75b50e12, 0x54e08c83, 0xb60e12f3, 0x128e8375, + 0x8375b50e, 0xfb54e094, 0x071222f0, 0x8e837537, + 0x360712e4, 0x07120174, 0x0812e436, 0x8c8375cb, + 0x122044e0, 0x54e0cb08, 0x8474f0df, 0xf5820885, + 0x7f54e083, 0x8044e0f0, 0x567522f0, 0xf5fde401, + 0xfe35af57, 0x220912fc, 0x121d1c12, 0x1b123b1e, + 0x7e57afcc, 0x7c56ad00, 0x49041200, 0x007e56af, + 0x75ee1102, 0xfde40156, 0x35af57f5, 0x0912fcfe, + 0x1d1c1222, 0x123b1e12, 0x57afcc1b, 0x56ad007e, + 0x0412007c, 0x7e56af49, 0xee110200, 0x1216f5e4, + 0xe5fef70e, 0xff054408, 0x8f180f12, 0xf0838e82, + 0x16e51605, 0x401494c3, 0x1208e5e6, 0xf0e4de0e, + 0x58f5e422, 0x5af559f5, 0x58adfeff, 0x220912fc, + 0x007e047f, 0x007c58ad, 0x7f220912, 0xad007e02, + 0x02007c58, 0x3ce52209, 0xe5fc3e25, 0xfb002442, + 0xecfa33e4, 0x12ea9bc3, 0x0b407807, 0x3de5428c, + 0x41f53f25, 0x1222408f, 0x74221809, 0x8518f584, + 0x19851908, 0x83188582, 0xf07f54e0, 0xf08044e0, + 0xf08044e0, 0x704eef22, 0x3707120b, 0xe0d28375, + 0x22f0df54, 0x75370712, 0x44e0d283, 0x7522f020, + 0x07900158, 0x42071226, 0xf53f54e0, 0x3f071241, + 0xf53f54e0, 0x56752240, 0x57f5e402, 0xafbd1d12, + 0xad007e57, 0x02007c56, 0xf5e44904, 0xf541f542, + 0xf538f540, 0x223af539, 0xff0754ef, 0xf854f9e5, + 0x22f9f54f, 0xfee4017f, 0xffbe0e0f, 0x0e1222fb, + 0x12f0efd4, 0x00229110, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, @@ -27596,7 +27841,7 @@ static const uint32_t isp_2500_multi_risc_code[] = { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x000f1f01, 0xc3002003, - 0xb9f6ad13, 0xffffb7ea, 0xffeeaafd + 0x00000000, 0x00000000, 0x00000000, 0x000f1f01, + 0xc3002003, 0xb9f6ad13, 0xffffb7ea, 0xffeeaac8 }; #endif diff --git a/sys/dev/iwn/if_iwn.c b/sys/dev/iwn/if_iwn.c index b4861733a86..e1d6520e290 100644 --- a/sys/dev/iwn/if_iwn.c +++ b/sys/dev/iwn/if_iwn.c @@ -92,6 +92,9 @@ static const struct iwn_ident iwn_ident_table[] = { { 0x8086, 0x0885, "Intel Centrino Wireless-N + WiMAX 6150" }, { 0x8086, 0x0886, "Intel Centrino Wireless-N + WiMAX 6150" }, { 0x8086, 0x0896, "Intel Centrino Wireless-N 130" }, + { 0x8086, 0x0887, "Intel Centrino Wireless-N 130" }, + { 0x8086, 0x08ae, "Intel Centrino Wireless-N 100" }, + { 0x8086, 0x08af, "Intel Centrino Wireless-N 100" }, { 0x8086, 0x4229, "Intel Wireless WiFi Link 4965" }, { 0x8086, 0x422b, "Intel Centrino Ultimate-N 6300" }, { 0x8086, 0x422c, "Intel Centrino Advanced-N 6200" }, @@ -2002,8 +2005,6 @@ iwn_setregdomain(struct ieee80211com *ic, struct ieee80211_regdomain *rd, return 0; } -#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) - static void iwn_read_eeprom_enhinfo(struct iwn_softc *sc) { @@ -2431,23 +2432,66 @@ static void iwn_rx_compressed_ba(struct iwn_softc *sc, struct iwn_rx_desc *desc, struct iwn_rx_data *data) { + struct iwn_ops *ops = &sc->ops; struct ifnet *ifp = sc->sc_ifp; struct iwn_node *wn; struct ieee80211_node *ni; struct iwn_compressed_ba *ba = (struct iwn_compressed_ba *)(desc + 1); struct iwn_tx_ring *txq; + struct iwn_tx_data *txdata; struct ieee80211_tx_ampdu *tap; + struct mbuf *m; uint64_t bitmap; + uint16_t ssn; uint8_t tid; - int ackfailcnt = 0, i, shift; + int ackfailcnt = 0, i, lastidx, qid, *res, shift; bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD); - txq = &sc->txq[le16toh(ba->qid)]; - tap = sc->qid2tap[le16toh(ba->qid)]; + qid = le16toh(ba->qid); + txq = &sc->txq[ba->qid]; + tap = sc->qid2tap[ba->qid]; tid = tap->txa_tid; - ni = tap->txa_ni; - wn = (void *)ni; + wn = (void *)tap->txa_ni; + + res = NULL; + ssn = 0; + if (!IEEE80211_AMPDU_RUNNING(tap)) { + res = tap->txa_private; + ssn = tap->txa_start & 0xfff; + } + + for (lastidx = le16toh(ba->ssn) & 0xff; txq->read != lastidx;) { + txdata = &txq->data[txq->read]; + + /* Unmap and free mbuf. */ + bus_dmamap_sync(txq->data_dmat, txdata->map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(txq->data_dmat, txdata->map); + m = txdata->m, txdata->m = NULL; + ni = txdata->ni, txdata->ni = NULL; + + KASSERT(ni != NULL, ("no node")); + KASSERT(m != NULL, ("no mbuf")); + + if (m->m_flags & M_TXCB) + ieee80211_process_callback(ni, m, 1); + + m_freem(m); + ieee80211_free_node(ni); + + txq->queued--; + txq->read = (txq->read + 1) % IWN_TX_RING_COUNT; + } + + if (txq->queued == 0 && res != NULL) { + iwn_nic_lock(sc); + ops->ampdu_tx_stop(sc, qid, tid, ssn); + iwn_nic_unlock(sc); + sc->qid2tap[qid] = NULL; + free(res, M_DEVBUF); + return; + } if (wn->agg[tid].bitmap == 0) return; @@ -2459,6 +2503,7 @@ iwn_rx_compressed_ba(struct iwn_softc *sc, struct iwn_rx_desc *desc, if (wn->agg[tid].nframes > (64 - shift)) return; + ni = tap->txa_ni; bitmap = (le64toh(ba->bitmap) >> shift) & wn->agg[tid].bitmap; for (i = 0; bitmap; i++) { if ((bitmap & 1) == 0) { @@ -2758,19 +2803,20 @@ static void iwn_ampdu_tx_done(struct iwn_softc *sc, int qid, int idx, int nframes, void *stat) { + struct iwn_ops *ops = &sc->ops; struct ifnet *ifp = sc->sc_ifp; struct iwn_tx_ring *ring = &sc->txq[qid]; struct iwn_tx_data *data; struct mbuf *m; struct iwn_node *wn; struct ieee80211_node *ni; - struct ieee80211vap *vap; struct ieee80211_tx_ampdu *tap; uint64_t bitmap; uint32_t *status = stat; uint16_t *aggstatus = stat; + uint16_t ssn; uint8_t tid; - int bit, i, lastidx, seqno, shift, start; + int bit, i, lastidx, *res, seqno, shift, start; #ifdef NOT_YET if (nframes == 1) { @@ -2803,27 +2849,32 @@ iwn_ampdu_tx_done(struct iwn_softc *sc, int qid, int idx, int nframes, bitmap |= 1ULL << bit; } tap = sc->qid2tap[qid]; - if (tap != NULL) { - tid = tap->txa_tid; - wn = (void *)tap->txa_ni; - wn->agg[tid].bitmap = bitmap; - wn->agg[tid].startidx = start; - wn->agg[tid].nframes = nframes; + tid = tap->txa_tid; + wn = (void *)tap->txa_ni; + wn->agg[tid].bitmap = bitmap; + wn->agg[tid].startidx = start; + wn->agg[tid].nframes = nframes; + + res = NULL; + ssn = 0; + if (!IEEE80211_AMPDU_RUNNING(tap)) { + res = tap->txa_private; + ssn = tap->txa_start & 0xfff; } seqno = le32toh(*(status + nframes)) & 0xfff; for (lastidx = (seqno & 0xff); ring->read != lastidx;) { data = &ring->data[ring->read]; - KASSERT(data->ni != NULL, ("no node")); - /* Unmap and free mbuf. */ bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(ring->data_dmat, data->map); m = data->m, data->m = NULL; ni = data->ni, data->ni = NULL; - vap = ni->ni_vap; + + KASSERT(ni != NULL, ("no node")); + KASSERT(m != NULL, ("no mbuf")); if (m->m_flags & M_TXCB) ieee80211_process_callback(ni, m, 1); @@ -2835,6 +2886,15 @@ iwn_ampdu_tx_done(struct iwn_softc *sc, int qid, int idx, int nframes, ring->read = (ring->read + 1) % IWN_TX_RING_COUNT; } + if (ring->queued == 0 && res != NULL) { + iwn_nic_lock(sc); + ops->ampdu_tx_stop(sc, qid, tid, ssn); + iwn_nic_unlock(sc); + sc->qid2tap[qid] = NULL; + free(res, M_DEVBUF); + return; + } + sc->sc_tx_timer = 0; if (ring->queued < IWN_TX_RING_LOMARK) { sc->qfullmsk &= ~(1 << ring->qid); @@ -3311,6 +3371,11 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) if (m->m_flags & M_AMPDU_MPDU) { struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[ac]; + if (!IEEE80211_AMPDU_RUNNING(tap)) { + m_freem(m); + return EINVAL; + } + ac = *(int *)tap->txa_private; *(uint16_t *)wh->i_seq = htole16(ni->ni_txseqs[tid] << IEEE80211_SEQ_SEQ_SHIFT); @@ -5630,6 +5695,8 @@ iwn_ampdu_tx_start(struct ieee80211com *ic, struct ieee80211_node *ni, if ((error = iwn_nic_lock(sc)) != 0) return 0; qid = *(int *)tap->txa_private; + DPRINTF(sc, IWN_DEBUG_XMIT, "%s: ra=%d tid=%d ssn=%d qid=%d\n", + __func__, wn->id, tid, tap->txa_start, qid); ops->ampdu_tx_start(sc, ni, qid, tid, tap->txa_start & 0xfff); iwn_nic_unlock(sc); @@ -5645,10 +5712,14 @@ iwn_ampdu_tx_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap) uint8_t tid = tap->txa_tid; int qid; + sc->sc_addba_stop(ni, tap); + if (tap->txa_private == NULL) return; qid = *(int *)tap->txa_private; + if (sc->txq[qid].queued != 0) + return; if (iwn_nic_lock(sc) != 0) return; ops->ampdu_tx_stop(sc, qid, tid, tap->txa_start & 0xfff); @@ -5656,7 +5727,6 @@ iwn_ampdu_tx_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap) sc->qid2tap[qid] = NULL; free(tap->txa_private, M_DEVBUF); tap->txa_private = NULL; - sc->sc_addba_stop(ni, tap); } static void diff --git a/sys/dev/ixgbe/ixgbe.c b/sys/dev/ixgbe/ixgbe.c index 961e53eee13..5da5fec651e 100644 --- a/sys/dev/ixgbe/ixgbe.c +++ b/sys/dev/ixgbe/ixgbe.c @@ -47,7 +47,7 @@ int ixgbe_display_debug_stats = 0; /********************************************************************* * Driver version *********************************************************************/ -char ixgbe_driver_version[] = "2.4.5"; +char ixgbe_driver_version[] = "2.4.8"; /********************************************************************* * PCI Device ID Table @@ -80,8 +80,10 @@ static ixgbe_vendor_info_t ixgbe_vendor_info_array[] = {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_T3_LOM, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_COMBO_BACKPLANE, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BACKPLANE_FCOE, 0, 0, 0}, + {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_SF2, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_FCOE, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599EN_SFP, 0, 0, 0}, + {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T1, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T, 0, 0, 0}, /* required last entry */ {0, 0, 0, 0, 0} @@ -162,7 +164,7 @@ static void ixgbe_dma_free(struct adapter *, struct ixgbe_dma_alloc *); static void ixgbe_add_rx_process_limit(struct adapter *, const char *, const char *, int *, int); static bool ixgbe_tx_ctx_setup(struct tx_ring *, struct mbuf *); -static bool ixgbe_tso_setup(struct tx_ring *, struct mbuf *, u32 *); +static bool ixgbe_tso_setup(struct tx_ring *, struct mbuf *, u32 *, u32 *); static void ixgbe_set_ivar(struct adapter *, u8, u8, s8); static void ixgbe_configure_ivars(struct adapter *); static u8 * ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *); @@ -242,10 +244,6 @@ TUNABLE_INT("hw.ixgbe.max_interrupt_rate", &ixgbe_max_interrupt_rate); static int ixgbe_rx_process_limit = 128; TUNABLE_INT("hw.ixgbe.rx_process_limit", &ixgbe_rx_process_limit); -/* Flow control setting, default to full */ -static int ixgbe_flow_control = ixgbe_fc_full; -TUNABLE_INT("hw.ixgbe.flow_control", &ixgbe_flow_control); - /* ** Smart speed setting, default to on ** this only works as a compile option @@ -322,7 +320,7 @@ static int fdir_pballoc = 1; * be a reference on how to implement netmap support in a driver. * Additional comments are in ixgbe_netmap.h . * - * contains functions for netmap support + * contains functions for netmap support * that extend the standard driver. */ #include @@ -526,28 +524,25 @@ ixgbe_attach(device_t dev) goto err_late; } - /* Get Hardware Flow Control setting */ - hw->fc.requested_mode = ixgbe_fc_full; - adapter->fc = hw->fc.requested_mode; - hw->fc.pause_time = IXGBE_FC_PAUSE; - hw->fc.low_water = IXGBE_FC_LO; - hw->fc.high_water[0] = IXGBE_FC_HI; - hw->fc.send_xon = TRUE; - error = ixgbe_init_hw(hw); - if (error == IXGBE_ERR_EEPROM_VERSION) { + switch (error) { + case IXGBE_ERR_EEPROM_VERSION: device_printf(dev, "This device is a pre-production adapter/" "LOM. Please be aware there may be issues associated " "with your hardware.\n If you are experiencing problems " "please contact your Intel or hardware representative " "who provided you with this hardware.\n"); - } else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) + break; + case IXGBE_ERR_SFP_NOT_SUPPORTED: device_printf(dev,"Unsupported SFP+ Module\n"); - - if (error) { error = EIO; device_printf(dev,"Hardware Initialization Failure\n"); goto err_late; + case IXGBE_ERR_SFP_NOT_PRESENT: + device_printf(dev,"No SFP+ Module found\n"); + /* falls thru */ + default: + break; } /* Detect and set physical type */ @@ -997,6 +992,8 @@ ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data) ifp->if_capenable ^= IFCAP_HWCSUM; if (mask & IFCAP_TSO4) ifp->if_capenable ^= IFCAP_TSO4; + if (mask & IFCAP_TSO6) + ifp->if_capenable ^= IFCAP_TSO6; if (mask & IFCAP_LRO) ifp->if_capenable ^= IFCAP_LRO; if (mask & IFCAP_VLAN_HWTAGGING) @@ -1061,7 +1058,7 @@ ixgbe_init_locked(struct adapter *adapter) /* Set the various hardware offload abilities */ ifp->if_hwassist = 0; - if (ifp->if_capenable & IFCAP_TSO4) + if (ifp->if_capenable & IFCAP_TSO) ifp->if_hwassist |= CSUM_TSO; if (ifp->if_capenable & IFCAP_TXCSUM) { ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP); @@ -1150,7 +1147,7 @@ ixgbe_init_locked(struct adapter *adapter) * from the Intel linux driver 3.8.21. * Prefetching enables tx line rate even with 1 queue. */ - txdctl |= (16 << 0) | (1 << 8); + txdctl |= (32 << 0) | (1 << 8); IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(i), txdctl); } @@ -1234,7 +1231,7 @@ ixgbe_init_locked(struct adapter *adapter) #ifdef IXGBE_FDIR /* Init Flow director */ if (hw->mac.type != ixgbe_mac_82598EB) { - u32 hdrm = 64 << fdir_pballoc; + u32 hdrm = 32 << fdir_pballoc; hw->mac.ops.setup_rxpba(hw, 0, hdrm, PBA_STRATEGY_EQUAL); ixgbe_init_fdir_signature_82599(&adapter->hw, fdir_pballoc); @@ -1260,6 +1257,35 @@ ixgbe_init_locked(struct adapter *adapter) /* Config/Enable Link */ ixgbe_config_link(adapter); + /* Hardware Packet Buffer & Flow Control setup */ + { + u32 rxpb, frame, size, tmp; + + frame = adapter->max_frame_size; + + /* Calculate High Water */ + if (hw->mac.type == ixgbe_mac_X540) + tmp = IXGBE_DV_X540(frame, frame); + else + tmp = IXGBE_DV(frame, frame); + size = IXGBE_BT2KB(tmp); + rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10; + hw->fc.high_water[0] = rxpb - size; + + /* Now calculate Low Water */ + if (hw->mac.type == ixgbe_mac_X540) + tmp = IXGBE_LOW_DV_X540(frame); + else + tmp = IXGBE_LOW_DV(frame); + hw->fc.low_water[0] = IXGBE_BT2KB(tmp); + + adapter->fc = hw->fc.requested_mode = ixgbe_fc_full; + hw->fc.pause_time = IXGBE_FC_PAUSE; + hw->fc.send_xon = TRUE; + } + /* Initialize the FC settings */ + ixgbe_start_hw(hw); + /* And now turn on interrupts */ ixgbe_enable_intr(adapter); @@ -1366,7 +1392,7 @@ ixgbe_handle_que(void *context, int pending) ixgbe_start_locked(txr, ifp); #endif IXGBE_TX_UNLOCK(txr); - if (more || (ifp->if_drv_flags & IFF_DRV_OACTIVE)) { + if (more) { taskqueue_enqueue(que->tq, &que->que_task); return; } @@ -1549,10 +1575,8 @@ ixgbe_msix_link(void *arg) /* This is probably overkill :) */ if (!atomic_cmpset_int(&adapter->fdir_reinit, 0, 1)) return; - /* Clear the interrupt */ - IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_FLOW_DIR); - /* Turn off the interface */ - adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + /* Disable the interrupt */ + IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EICR_FLOW_DIR); taskqueue_enqueue(adapter->tq, &adapter->fdir_task); } else #endif @@ -1767,9 +1791,8 @@ ixgbe_xmit(struct tx_ring *txr, struct mbuf **m_headp) ** a packet. */ if (m_head->m_pkthdr.csum_flags & CSUM_TSO) { - if (ixgbe_tso_setup(txr, m_head, &paylen)) { + if (ixgbe_tso_setup(txr, m_head, &paylen, &olinfo_status)) { cmd_type_len |= IXGBE_ADVTXD_DCMD_TSE; - olinfo_status |= IXGBE_TXD_POPTS_IXSM << 8; olinfo_status |= IXGBE_TXD_POPTS_TXSM << 8; olinfo_status |= paylen << IXGBE_ADVTXD_PAYLEN_SHIFT; ++adapter->tso_tx; @@ -2055,6 +2078,8 @@ ixgbe_update_link_status(struct adapter *adapter) ((adapter->link_speed == 128)? 10:1), "Full Duplex"); adapter->link_active = TRUE; + /* Update any Flow Control changes */ + ixgbe_fc_enable(&adapter->hw); if_link_state_change(ifp, LINK_STATE_UP); } } else { /* Link down */ @@ -2562,7 +2587,7 @@ ixgbe_setup_interface(device_t dev, struct adapter *adapter) */ ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); - ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_TSO4 | IFCAP_VLAN_HWCSUM; + ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_TSO | IFCAP_VLAN_HWCSUM; ifp->if_capabilities |= IFCAP_JUMBO_MTU; ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWTSO @@ -3062,7 +3087,7 @@ ixgbe_initialize_transmit_units(struct adapter *adapter) txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(i)); break; } - txctrl &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN; + txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN; switch (hw->mac.type) { case ixgbe_mac_82598EB: IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), txctrl); @@ -3234,6 +3259,7 @@ ixgbe_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp) case ETHERTYPE_IPV6: ip6 = (struct ip6_hdr *)(mp->m_data + ehdrlen); ip_hlen = sizeof(struct ip6_hdr); + /* XXX-BZ this will go badly in case of ext hdrs. */ ipproto = ip6->ip6_nxt; type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV6; break; @@ -3292,17 +3318,23 @@ ixgbe_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp) * **********************************************************************/ static bool -ixgbe_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *paylen) +ixgbe_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *paylen, + u32 *olinfo_status) { struct adapter *adapter = txr->adapter; struct ixgbe_adv_tx_context_desc *TXD; struct ixgbe_tx_buf *tx_buffer; u32 vlan_macip_lens = 0, type_tucmd_mlhl = 0; - u32 mss_l4len_idx = 0; - u16 vtag = 0; - int ctxd, ehdrlen, hdrlen, ip_hlen, tcp_hlen; + u32 mss_l4len_idx = 0, len; + u16 vtag = 0, eh_type; + int ctxd, ehdrlen, ip_hlen, tcp_hlen; struct ether_vlan_header *eh; +#ifdef INET6 + struct ip6_hdr *ip6; +#endif +#ifdef INET struct ip *ip; +#endif struct tcphdr *th; @@ -3311,32 +3343,62 @@ ixgbe_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *paylen) * Jump over vlan headers if already present */ eh = mtod(mp, struct ether_vlan_header *); - if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) + if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) { ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; - else + eh_type = eh->evl_proto; + } else { ehdrlen = ETHER_HDR_LEN; + eh_type = eh->evl_encap_proto; + } /* Ensure we have at least the IP+TCP header in the first mbuf. */ - if (mp->m_len < ehdrlen + sizeof(struct ip) + sizeof(struct tcphdr)) - return FALSE; + len = ehdrlen + sizeof(struct tcphdr); + switch (ntohs(eh_type)) { +#ifdef INET6 + case ETHERTYPE_IPV6: + if (mp->m_len < len + sizeof(struct ip6_hdr)) + return FALSE; + ip6 = (struct ip6_hdr *)(mp->m_data + ehdrlen); + /* XXX-BZ For now we do not pretend to support ext. hdrs. */ + if (ip6->ip6_nxt != IPPROTO_TCP) + return FALSE; + ip_hlen = sizeof(struct ip6_hdr); + th = (struct tcphdr *)((caddr_t)ip6 + ip_hlen); + th->th_sum = in6_cksum_pseudo(ip6, 0, IPPROTO_TCP, 0); + type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV6; + break; +#endif +#ifdef INET + case ETHERTYPE_IP: + if (mp->m_len < len + sizeof(struct ip)) + return FALSE; + ip = (struct ip *)(mp->m_data + ehdrlen); + if (ip->ip_p != IPPROTO_TCP) + return FALSE; + ip->ip_sum = 0; + ip_hlen = ip->ip_hl << 2; + th = (struct tcphdr *)((caddr_t)ip + ip_hlen); + th->th_sum = in_pseudo(ip->ip_src.s_addr, + ip->ip_dst.s_addr, htons(IPPROTO_TCP)); + type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4; + /* Tell transmit desc to also do IPv4 checksum. */ + *olinfo_status |= IXGBE_TXD_POPTS_IXSM << 8; + break; +#endif + default: + panic("%s: CSUM_TSO but no supported IP version (0x%04x)", + __func__, ntohs(eh_type)); + break; + } ctxd = txr->next_avail_desc; tx_buffer = &txr->tx_buffers[ctxd]; TXD = (struct ixgbe_adv_tx_context_desc *) &txr->tx_base[ctxd]; - ip = (struct ip *)(mp->m_data + ehdrlen); - if (ip->ip_p != IPPROTO_TCP) - return FALSE; /* 0 */ - ip->ip_sum = 0; - ip_hlen = ip->ip_hl << 2; - th = (struct tcphdr *)((caddr_t)ip + ip_hlen); - th->th_sum = in_pseudo(ip->ip_src.s_addr, - ip->ip_dst.s_addr, htons(IPPROTO_TCP)); tcp_hlen = th->th_off << 2; - hdrlen = ehdrlen + ip_hlen + tcp_hlen; /* This is used in the transmit desc in encap */ - *paylen = mp->m_pkthdr.len - hdrlen; + *paylen = mp->m_pkthdr.len - ehdrlen - ip_hlen - tcp_hlen; /* VLAN MACLEN IPLEN */ if (mp->m_flags & M_VLANTAG) { @@ -3351,10 +3413,8 @@ ixgbe_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *paylen) /* ADV DTYPE TUCMD */ type_tucmd_mlhl |= IXGBE_ADVTXD_DCMD_DEXT | IXGBE_ADVTXD_DTYP_CTXT; type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP; - type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4; TXD->type_tucmd_mlhl |= htole32(type_tucmd_mlhl); - /* MSS L4LEN IDX */ mss_l4len_idx |= (mp->m_pkthdr.tso_segsz << IXGBE_ADVTXD_MSS_SHIFT); mss_l4len_idx |= (tcp_hlen << IXGBE_ADVTXD_L4LEN_SHIFT); @@ -4295,15 +4355,17 @@ ixgbe_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m, u32 ptype { /* - * ATM LRO is only for IPv4/TCP packets and TCP checksum of the packet + * ATM LRO is only for IP/TCP packets and TCP checksum of the packet * should be computed by hardware. Also it should not have VLAN tag in - * ethernet header. + * ethernet header. In case of IPv6 we do not yet support ext. hdrs. */ if (rxr->lro_enabled && (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0 && (ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 && - (ptype & (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP)) == - (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP) && + ((ptype & (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP)) == + (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP) || + (ptype & (IXGBE_RXDADV_PKTTYPE_IPV6 | IXGBE_RXDADV_PKTTYPE_TCP)) == + (IXGBE_RXDADV_PKTTYPE_IPV6 | IXGBE_RXDADV_PKTTYPE_TCP)) && (m->m_pkthdr.csum_flags & (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) == (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) { /* @@ -5057,6 +5119,8 @@ ixgbe_reinit_fdir(void *context, int pending) return; ixgbe_reinit_fdir_tables_82599(&adapter->hw); adapter->fdir_reinit = 0; + /* re-enable flow director interrupts */ + IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_FLOW_DIR); /* Restart the interface */ ifp->if_drv_flags |= IFF_DRV_RUNNING; return; @@ -5614,8 +5678,9 @@ ixgbe_set_flowcntl(SYSCTL_HANDLER_ARGS) default: adapter->hw.fc.requested_mode = ixgbe_fc_none; } - - ixgbe_fc_enable(&adapter->hw, 0); + /* Don't autoneg if forcing a value */ + adapter->hw.fc.disable_fc_autoneg = TRUE; + ixgbe_fc_enable(&adapter->hw); return error; } @@ -5631,9 +5696,9 @@ ixgbe_add_rx_process_limit(struct adapter *adapter, const char *name, /* ** Control link advertise speed: -** 0 - normal ** 1 - advertise only 1G ** 2 - advertise 100Mb +** 3 - advertise normal */ static int ixgbe_set_advertise(SYSCTL_HANDLER_ARGS) @@ -5647,13 +5712,15 @@ ixgbe_set_advertise(SYSCTL_HANDLER_ARGS) adapter = (struct adapter *) arg1; dev = adapter->dev; hw = &adapter->hw; - last = hw->phy.autoneg_advertised; + last = adapter->advertise; error = sysctl_handle_int(oidp, &adapter->advertise, 0, req); - if ((error) || (adapter->advertise == -1)) return (error); + if (adapter->advertise == last) /* no change */ + return (0); + if (!((hw->phy.media_type == ixgbe_media_type_copper) || (hw->phy.multispeed_fiber))) return (error); @@ -5667,11 +5734,10 @@ ixgbe_set_advertise(SYSCTL_HANDLER_ARGS) speed = IXGBE_LINK_SPEED_1GB_FULL; else if (adapter->advertise == 2) speed = IXGBE_LINK_SPEED_100_FULL; - else + else if (adapter->advertise == 3) speed = IXGBE_LINK_SPEED_1GB_FULL | IXGBE_LINK_SPEED_10GB_FULL; - - if (speed == last) /* no change */ + else /* bogus value */ return (error); hw->mac.autotry_restart = TRUE; diff --git a/sys/dev/ixgbe/ixgbe_82598.c b/sys/dev/ixgbe/ixgbe_82598.c index ab41c7b0b22..9d3164cd668 100644 --- a/sys/dev/ixgbe/ixgbe_82598.c +++ b/sys/dev/ixgbe/ixgbe_82598.c @@ -103,31 +103,6 @@ out: IXGBE_WRITE_REG(hw, IXGBE_GCR, gcr); } -/** - * ixgbe_get_pcie_msix_count_82598 - Gets MSI-X vector count - * @hw: pointer to hardware structure - * - * Read PCIe configuration space, and get the MSI-X vector count from - * the capabilities table. - **/ -u32 ixgbe_get_pcie_msix_count_82598(struct ixgbe_hw *hw) -{ - u32 msix_count = 18; - - DEBUGFUNC("ixgbe_get_pcie_msix_count_82598"); - - if (hw->mac.msix_vectors_from_pcie) { - msix_count = IXGBE_READ_PCIE_WORD(hw, - IXGBE_PCIE_MSIX_82598_CAPS); - msix_count &= IXGBE_PCIE_MSIX_TBL_SZ_MASK; - - /* MSI-X count is zero-based in HW, so increment to give - * proper value */ - msix_count++; - } - return msix_count; -} - /** * ixgbe_init_ops_82598 - Inits func ptrs and MAC type * @hw: pointer to hardware structure @@ -176,7 +151,7 @@ s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw) mac->rx_pb_size = 512; mac->max_tx_queues = 32; mac->max_rx_queues = 64; - mac->max_msix_vectors = ixgbe_get_pcie_msix_count_82598(hw); + mac->max_msix_vectors = ixgbe_get_pcie_msix_count_generic(hw); /* SFP+ Module */ phy->ops.read_i2c_eeprom = &ixgbe_read_i2c_eeprom_82598; @@ -280,15 +255,15 @@ s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw) for (i = 0; ((i < hw->mac.max_tx_queues) && (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) { regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i)); - regval &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN; + regval &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN; IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), regval); } for (i = 0; ((i < hw->mac.max_rx_queues) && (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) { regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i)); - regval &= ~(IXGBE_DCA_RXCTRL_DESC_WRO_EN | - IXGBE_DCA_RXCTRL_DESC_HSRO_EN); + regval &= ~(IXGBE_DCA_RXCTRL_DATA_WRO_EN | + IXGBE_DCA_RXCTRL_HEAD_WRO_EN); IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval); } @@ -416,21 +391,41 @@ out: /** * ixgbe_fc_enable_82598 - Enable flow control * @hw: pointer to hardware structure - * @packetbuf_num: packet buffer number (0-7) * * Enable flow control according to the current settings. **/ -s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num) +s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw) { s32 ret_val = IXGBE_SUCCESS; u32 fctrl_reg; u32 rmcs_reg; u32 reg; + u32 fcrtl, fcrth; u32 link_speed = 0; + int i; bool link_up; DEBUGFUNC("ixgbe_fc_enable_82598"); + /* Validate the water mark configuration */ + if (!hw->fc.pause_time) { + ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; + goto out; + } + + /* Low water mark of zero causes XOFF floods */ + for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) { + if ((hw->fc.current_mode & ixgbe_fc_tx_pause) && + hw->fc.high_water[i]) { + if (!hw->fc.low_water[i] || + hw->fc.low_water[i] >= hw->fc.high_water[i]) { + DEBUGOUT("Invalid water mark configuration\n"); + ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; + goto out; + } + } + } + /* * On 82598 having Rx FC on causes resets while doing 1G * so if it's on turn it off once we know link_speed. For @@ -452,9 +447,7 @@ s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num) } /* Negotiate the fc mode to use */ - ret_val = ixgbe_fc_autoneg(hw); - if (ret_val == IXGBE_ERR_FLOW_CONTROL) - goto out; + ixgbe_fc_autoneg(hw); /* Disable any previous flow control settings */ fctrl_reg = IXGBE_READ_REG(hw, IXGBE_FCTRL); @@ -516,28 +509,27 @@ s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num) IXGBE_WRITE_REG(hw, IXGBE_RMCS, rmcs_reg); /* Set up and enable Rx high/low water mark thresholds, enable XON. */ - if (hw->fc.current_mode & ixgbe_fc_tx_pause) { - reg = hw->fc.low_water << 6; - if (hw->fc.send_xon) - reg |= IXGBE_FCRTL_XONE; + for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) { + if ((hw->fc.current_mode & ixgbe_fc_tx_pause) && + hw->fc.high_water[i]) { + fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE; + fcrth = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN; + IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), fcrtl); + IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), fcrth); + } else { + IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), 0); + IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), 0); + } - IXGBE_WRITE_REG(hw, IXGBE_FCRTL(packetbuf_num), reg); - - reg = hw->fc.high_water[packetbuf_num] << 6; - reg |= IXGBE_FCRTH_FCEN; - - IXGBE_WRITE_REG(hw, IXGBE_FCRTH(packetbuf_num), reg); } /* Configure pause time (2 TCs per register) */ - reg = IXGBE_READ_REG(hw, IXGBE_FCTTV(packetbuf_num / 2)); - if ((packetbuf_num & 1) == 0) - reg = (reg & 0xFFFF0000) | hw->fc.pause_time; - else - reg = (reg & 0x0000FFFF) | (hw->fc.pause_time << 16); - IXGBE_WRITE_REG(hw, IXGBE_FCTTV(packetbuf_num / 2), reg); + reg = hw->fc.pause_time * 0x00010001; + for (i = 0; i < (IXGBE_DCB_MAX_TRAFFIC_CLASS / 2); i++) + IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg); - IXGBE_WRITE_REG(hw, IXGBE_FCRTV, (hw->fc.pause_time >> 1)); + /* Configure flow control refresh threshold value */ + IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2); out: return ret_val; @@ -1325,15 +1317,15 @@ void ixgbe_enable_relaxed_ordering_82598(struct ixgbe_hw *hw) for (i = 0; ((i < hw->mac.max_tx_queues) && (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) { regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i)); - regval |= IXGBE_DCA_TXCTRL_TX_WB_RO_EN; + regval |= IXGBE_DCA_TXCTRL_DESC_WRO_EN; IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), regval); } for (i = 0; ((i < hw->mac.max_rx_queues) && (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) { regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i)); - regval |= (IXGBE_DCA_RXCTRL_DESC_WRO_EN | - IXGBE_DCA_RXCTRL_DESC_HSRO_EN); + regval |= IXGBE_DCA_RXCTRL_DATA_WRO_EN | + IXGBE_DCA_RXCTRL_HEAD_WRO_EN; IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval); } diff --git a/sys/dev/ixgbe/ixgbe_82598.h b/sys/dev/ixgbe/ixgbe_82598.h index 01ddef5a06e..a195b1506b0 100755 --- a/sys/dev/ixgbe/ixgbe_82598.h +++ b/sys/dev/ixgbe/ixgbe_82598.h @@ -36,7 +36,7 @@ #define _IXGBE_82598_H_ u32 ixgbe_get_pcie_msix_count_82598(struct ixgbe_hw *hw); -s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num); +s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw); s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw); void ixgbe_enable_relaxed_ordering_82598(struct ixgbe_hw *hw); s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq); diff --git a/sys/dev/ixgbe/ixgbe_82599.c b/sys/dev/ixgbe/ixgbe_82599.c index a5fa15e8890..184ee451b99 100644 --- a/sys/dev/ixgbe/ixgbe_82599.c +++ b/sys/dev/ixgbe/ixgbe_82599.c @@ -243,6 +243,7 @@ s32 ixgbe_init_ops_82599(struct ixgbe_hw *hw) /* RAR, Multicast, VLAN */ mac->ops.set_vmdq = &ixgbe_set_vmdq_generic; + mac->ops.set_vmdq_san_mac = &ixgbe_set_vmdq_san_mac_generic; mac->ops.clear_vmdq = &ixgbe_clear_vmdq_generic; mac->ops.insert_mac_addr = &ixgbe_insert_mac_addr_generic; mac->rar_highwater = 1; @@ -304,7 +305,9 @@ s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw, /* Check if 1G SFP module. */ if (hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 || - hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1) { + hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 || + hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 || + hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1) { *speed = IXGBE_LINK_SPEED_1GB_FULL; *negotiation = TRUE; goto out; @@ -420,6 +423,7 @@ enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw) case IXGBE_DEV_ID_82599_SFP: case IXGBE_DEV_ID_82599_SFP_FCOE: case IXGBE_DEV_ID_82599_SFP_EM: + case IXGBE_DEV_ID_82599_SFP_SF2: case IXGBE_DEV_ID_82599EN_SFP: media_type = ixgbe_media_type_fiber; break; @@ -1088,6 +1092,9 @@ mac_reset_top: hw->mac.ops.set_rar(hw, hw->mac.num_rar_entries - 1, hw->mac.san_addr, 0, IXGBE_RAH_AV); + /* Save the SAN MAC RAR index */ + hw->mac.san_mac_rar_index = hw->mac.num_rar_entries - 1; + /* Reserve the last RAR for the SAN MAC address */ hw->mac.num_rar_entries--; } @@ -2037,6 +2044,8 @@ sfp_check: physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR; else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE) physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_T; + else if (comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) + physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_SX; break; default: break; @@ -2233,3 +2242,4 @@ static s32 ixgbe_read_eeprom_82599(struct ixgbe_hw *hw, return ret_val; } + diff --git a/sys/dev/ixgbe/ixgbe_api.c b/sys/dev/ixgbe/ixgbe_api.c index b8b94b8d924..faee9d38b0f 100644 --- a/sys/dev/ixgbe/ixgbe_api.c +++ b/sys/dev/ixgbe/ixgbe_api.c @@ -118,6 +118,7 @@ s32 ixgbe_set_mac_type(struct ixgbe_hw *hw) case IXGBE_DEV_ID_82599_BACKPLANE_FCOE: case IXGBE_DEV_ID_82599_SFP_FCOE: case IXGBE_DEV_ID_82599_SFP_EM: + case IXGBE_DEV_ID_82599_SFP_SF2: case IXGBE_DEV_ID_82599EN_SFP: case IXGBE_DEV_ID_82599_CX4: case IXGBE_DEV_ID_82599_T3_LOM: @@ -130,6 +131,7 @@ s32 ixgbe_set_mac_type(struct ixgbe_hw *hw) hw->mac.type = ixgbe_mac_X540_vf; break; case IXGBE_DEV_ID_X540T: + case IXGBE_DEV_ID_X540T1: hw->mac.type = ixgbe_mac_X540; break; default: @@ -811,6 +813,18 @@ s32 ixgbe_set_vmdq(struct ixgbe_hw *hw, u32 rar, u32 vmdq) { return ixgbe_call_func(hw, hw->mac.ops.set_vmdq, (hw, rar, vmdq), IXGBE_NOT_IMPLEMENTED); + +} + +/** + * ixgbe_set_vmdq_san_mac - Associate VMDq index 127 with a receive address + * @hw: pointer to hardware structure + * @vmdq: VMDq default pool index + **/ +s32 ixgbe_set_vmdq_san_mac(struct ixgbe_hw *hw, u32 vmdq) +{ + return ixgbe_call_func(hw, hw->mac.ops.set_vmdq_san_mac, + (hw, vmdq), IXGBE_NOT_IMPLEMENTED); } /** @@ -960,13 +974,12 @@ s32 ixgbe_set_vlvf(struct ixgbe_hw *hw, u32 vlan, u32 vind, bool vlan_on, /** * ixgbe_fc_enable - Enable flow control * @hw: pointer to hardware structure - * @packetbuf_num: packet buffer number (0-7) * * Configures the flow control settings based on SW configuration. **/ -s32 ixgbe_fc_enable(struct ixgbe_hw *hw, s32 packetbuf_num) +s32 ixgbe_fc_enable(struct ixgbe_hw *hw) { - return ixgbe_call_func(hw, hw->mac.ops.fc_enable, (hw, packetbuf_num), + return ixgbe_call_func(hw, hw->mac.ops.fc_enable, (hw), IXGBE_NOT_IMPLEMENTED); } @@ -1102,7 +1115,7 @@ u32 ixgbe_get_supported_physical_layer(struct ixgbe_hw *hw) } /** - * ixgbe_enable_rx_dma - Enables Rx DMA unit, dependant on device specifics + * ixgbe_enable_rx_dma - Enables Rx DMA unit, dependent on device specifics * @hw: pointer to hardware structure * @regval: bitfield to write to the Rx DMA register * diff --git a/sys/dev/ixgbe/ixgbe_api.h b/sys/dev/ixgbe/ixgbe_api.h index 7c612e5d4f3..3a9e0cf35e0 100644 --- a/sys/dev/ixgbe/ixgbe_api.h +++ b/sys/dev/ixgbe/ixgbe_api.h @@ -104,6 +104,7 @@ s32 ixgbe_set_rar(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq, u32 enable_addr); s32 ixgbe_clear_rar(struct ixgbe_hw *hw, u32 index); s32 ixgbe_set_vmdq(struct ixgbe_hw *hw, u32 rar, u32 vmdq); +s32 ixgbe_set_vmdq_san_mac(struct ixgbe_hw *hw, u32 vmdq); s32 ixgbe_clear_vmdq(struct ixgbe_hw *hw, u32 rar, u32 vmdq); s32 ixgbe_init_rx_addrs(struct ixgbe_hw *hw); u32 ixgbe_get_num_rx_addrs(struct ixgbe_hw *hw); @@ -120,7 +121,7 @@ s32 ixgbe_set_vfta(struct ixgbe_hw *hw, u32 vlan, u32 vind, bool vlan_on); s32 ixgbe_set_vlvf(struct ixgbe_hw *hw, u32 vlan, u32 vind, bool vlan_on, bool *vfta_changed); -s32 ixgbe_fc_enable(struct ixgbe_hw *hw, s32 packetbuf_num); +s32 ixgbe_fc_enable(struct ixgbe_hw *hw); s32 ixgbe_set_fw_drv_ver(struct ixgbe_hw *hw, u8 maj, u8 min, u8 build, u8 ver); void ixgbe_set_mta(struct ixgbe_hw *hw, u8 *mc_addr); diff --git a/sys/dev/ixgbe/ixgbe_common.c b/sys/dev/ixgbe/ixgbe_common.c index 304b6d1fb50..51806d64b3d 100644 --- a/sys/dev/ixgbe/ixgbe_common.c +++ b/sys/dev/ixgbe/ixgbe_common.c @@ -51,13 +51,6 @@ static void ixgbe_release_eeprom(struct ixgbe_hw *hw); static s32 ixgbe_mta_vector(struct ixgbe_hw *hw, u8 *mc_addr); static s32 ixgbe_get_san_mac_addr_offset(struct ixgbe_hw *hw, u16 *san_mac_offset); -static s32 ixgbe_fc_autoneg_fiber(struct ixgbe_hw *hw); -static s32 ixgbe_fc_autoneg_backplane(struct ixgbe_hw *hw); -static s32 ixgbe_fc_autoneg_copper(struct ixgbe_hw *hw); -static s32 ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw); -static s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg, - u32 adv_sym, u32 adv_asm, u32 lp_sym, u32 lp_asm); -static s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num); static s32 ixgbe_read_eeprom_buffer_bit_bang(struct ixgbe_hw *hw, u16 offset, u16 words, u16 *data); static s32 ixgbe_write_eeprom_buffer_bit_bang(struct ixgbe_hw *hw, u16 offset, @@ -145,6 +138,177 @@ s32 ixgbe_init_ops_generic(struct ixgbe_hw *hw) return IXGBE_SUCCESS; } +/** + * ixgbe_device_supports_autoneg_fc - Check if phy supports autoneg flow + * control + * @hw: pointer to hardware structure + * + * There are several phys that do not support autoneg flow control. This + * function check the device id to see if the associated phy supports + * autoneg flow control. + **/ +static s32 ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw) +{ + + DEBUGFUNC("ixgbe_device_supports_autoneg_fc"); + + switch (hw->device_id) { + case IXGBE_DEV_ID_X540T: + case IXGBE_DEV_ID_X540T1: + return IXGBE_SUCCESS; + case IXGBE_DEV_ID_82599_T3_LOM: + return IXGBE_SUCCESS; + default: + return IXGBE_ERR_FC_NOT_SUPPORTED; + } +} + +/** + * ixgbe_setup_fc - Set up flow control + * @hw: pointer to hardware structure + * + * Called at init time to set up flow control. + **/ +static s32 ixgbe_setup_fc(struct ixgbe_hw *hw) +{ + s32 ret_val = IXGBE_SUCCESS; + u32 reg = 0, reg_bp = 0; + u16 reg_cu = 0; + + DEBUGFUNC("ixgbe_setup_fc"); + + /* + * Validate the requested mode. Strict IEEE mode does not allow + * ixgbe_fc_rx_pause because it will cause us to fail at UNH. + */ + if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) { + DEBUGOUT("ixgbe_fc_rx_pause not valid in strict IEEE mode\n"); + ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; + goto out; + } + + /* + * 10gig parts do not have a word in the EEPROM to determine the + * default flow control setting, so we explicitly set it to full. + */ + if (hw->fc.requested_mode == ixgbe_fc_default) + hw->fc.requested_mode = ixgbe_fc_full; + + /* + * Set up the 1G and 10G flow control advertisement registers so the + * HW will be able to do fc autoneg once the cable is plugged in. If + * we link at 10G, the 1G advertisement is harmless and vice versa. + */ + switch (hw->phy.media_type) { + case ixgbe_media_type_fiber: + case ixgbe_media_type_backplane: + reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA); + reg_bp = IXGBE_READ_REG(hw, IXGBE_AUTOC); + break; + case ixgbe_media_type_copper: + hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_ADVT, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, ®_cu); + break; + default: + break; + } + + /* + * The possible values of fc.requested_mode are: + * 0: Flow control is completely disabled + * 1: Rx flow control is enabled (we can receive pause frames, + * but not send pause frames). + * 2: Tx flow control is enabled (we can send pause frames but + * we do not support receiving pause frames). + * 3: Both Rx and Tx flow control (symmetric) are enabled. + * other: Invalid. + */ + switch (hw->fc.requested_mode) { + case ixgbe_fc_none: + /* Flow control completely disabled by software override. */ + reg &= ~(IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE); + if (hw->phy.media_type == ixgbe_media_type_backplane) + reg_bp &= ~(IXGBE_AUTOC_SYM_PAUSE | + IXGBE_AUTOC_ASM_PAUSE); + else if (hw->phy.media_type == ixgbe_media_type_copper) + reg_cu &= ~(IXGBE_TAF_SYM_PAUSE | IXGBE_TAF_ASM_PAUSE); + break; + case ixgbe_fc_tx_pause: + /* + * Tx Flow control is enabled, and Rx Flow control is + * disabled by software override. + */ + reg |= IXGBE_PCS1GANA_ASM_PAUSE; + reg &= ~IXGBE_PCS1GANA_SYM_PAUSE; + if (hw->phy.media_type == ixgbe_media_type_backplane) { + reg_bp |= IXGBE_AUTOC_ASM_PAUSE; + reg_bp &= ~IXGBE_AUTOC_SYM_PAUSE; + } else if (hw->phy.media_type == ixgbe_media_type_copper) { + reg_cu |= IXGBE_TAF_ASM_PAUSE; + reg_cu &= ~IXGBE_TAF_SYM_PAUSE; + } + break; + case ixgbe_fc_rx_pause: + /* + * Rx Flow control is enabled and Tx Flow control is + * disabled by software override. Since there really + * isn't a way to advertise that we are capable of RX + * Pause ONLY, we will advertise that we support both + * symmetric and asymmetric Rx PAUSE, as such we fall + * through to the fc_full statement. Later, we will + * disable the adapter's ability to send PAUSE frames. + */ + case ixgbe_fc_full: + /* Flow control (both Rx and Tx) is enabled by SW override. */ + reg |= IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE; + if (hw->phy.media_type == ixgbe_media_type_backplane) + reg_bp |= IXGBE_AUTOC_SYM_PAUSE | + IXGBE_AUTOC_ASM_PAUSE; + else if (hw->phy.media_type == ixgbe_media_type_copper) + reg_cu |= IXGBE_TAF_SYM_PAUSE | IXGBE_TAF_ASM_PAUSE; + break; + default: + DEBUGOUT("Flow control param set incorrectly\n"); + ret_val = IXGBE_ERR_CONFIG; + goto out; + break; + } + + if (hw->mac.type != ixgbe_mac_X540) { + /* + * Enable auto-negotiation between the MAC & PHY; + * the MAC will advertise clause 37 flow control. + */ + IXGBE_WRITE_REG(hw, IXGBE_PCS1GANA, reg); + reg = IXGBE_READ_REG(hw, IXGBE_PCS1GLCTL); + + /* Disable AN timeout */ + if (hw->fc.strict_ieee) + reg &= ~IXGBE_PCS1GLCTL_AN_1G_TIMEOUT_EN; + + IXGBE_WRITE_REG(hw, IXGBE_PCS1GLCTL, reg); + DEBUGOUT1("Set up FC; PCS1GLCTL = 0x%08X\n", reg); + } + + /* + * AUTOC restart handles negotiation of 1G and 10G on backplane + * and copper. There is no need to set the PCS1GCTL register. + * + */ + if (hw->phy.media_type == ixgbe_media_type_backplane) { + reg_bp |= IXGBE_AUTOC_AN_RESTART; + IXGBE_WRITE_REG(hw, IXGBE_AUTOC, reg_bp); + } else if ((hw->phy.media_type == ixgbe_media_type_copper) && + (ixgbe_device_supports_autoneg_fc(hw) == IXGBE_SUCCESS)) { + hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_ADVT, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, reg_cu); + } + + DEBUGOUT1("Set up FC; IXGBE_AUTOC = 0x%08X\n", reg); +out: + return ret_val; +} + /** * ixgbe_start_hw_generic - Prepare hardware for Tx/Rx * @hw: pointer to hardware structure @@ -156,6 +320,7 @@ s32 ixgbe_init_ops_generic(struct ixgbe_hw *hw) **/ s32 ixgbe_start_hw_generic(struct ixgbe_hw *hw) { + s32 ret_val; u32 ctrl_ext; DEBUGFUNC("ixgbe_start_hw_generic"); @@ -178,12 +343,15 @@ s32 ixgbe_start_hw_generic(struct ixgbe_hw *hw) IXGBE_WRITE_FLUSH(hw); /* Setup flow control */ - ixgbe_setup_fc(hw, 0); + ret_val = ixgbe_setup_fc(hw); + if (ret_val != IXGBE_SUCCESS) + goto out; /* Clear adapter stopped flag */ hw->adapter_stopped = FALSE; - return IXGBE_SUCCESS; +out: + return ret_val; } /** @@ -211,14 +379,14 @@ s32 ixgbe_start_hw_gen2(struct ixgbe_hw *hw) /* Disable relaxed ordering */ for (i = 0; i < hw->mac.max_tx_queues; i++) { regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(i)); - regval &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN; + regval &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN; IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(i), regval); } for (i = 0; i < hw->mac.max_rx_queues; i++) { regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i)); - regval &= ~(IXGBE_DCA_RXCTRL_DESC_WRO_EN | - IXGBE_DCA_RXCTRL_DESC_HSRO_EN); + regval &= ~(IXGBE_DCA_RXCTRL_DATA_WRO_EN | + IXGBE_DCA_RXCTRL_HEAD_WRO_EN); IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval); } @@ -583,6 +751,9 @@ s32 ixgbe_get_bus_info_generic(struct ixgbe_hw *hw) case IXGBE_PCI_LINK_SPEED_5000: hw->bus.speed = ixgbe_bus_speed_5000; break; + case IXGBE_PCI_LINK_SPEED_8000: + hw->bus.speed = ixgbe_bus_speed_8000; + break; default: hw->bus.speed = ixgbe_bus_speed_unknown; break; @@ -2242,27 +2413,44 @@ s32 ixgbe_disable_mc_generic(struct ixgbe_hw *hw) /** * ixgbe_fc_enable_generic - Enable flow control * @hw: pointer to hardware structure - * @packetbuf_num: packet buffer number (0-7) * * Enable flow control according to the current settings. **/ -s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packetbuf_num) +s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw) { s32 ret_val = IXGBE_SUCCESS; u32 mflcn_reg, fccfg_reg; u32 reg; u32 fcrtl, fcrth; + int i; DEBUGFUNC("ixgbe_fc_enable_generic"); - /* Negotiate the fc mode to use */ - ret_val = ixgbe_fc_autoneg(hw); - if (ret_val == IXGBE_ERR_FLOW_CONTROL) + /* Validate the water mark configuration */ + if (!hw->fc.pause_time) { + ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; goto out; + } + + /* Low water mark of zero causes XOFF floods */ + for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) { + if ((hw->fc.current_mode & ixgbe_fc_tx_pause) && + hw->fc.high_water[i]) { + if (!hw->fc.low_water[i] || + hw->fc.low_water[i] >= hw->fc.high_water[i]) { + DEBUGOUT("Invalid water mark configuration\n"); + ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; + goto out; + } + } + } + + /* Negotiate the fc mode to use */ + ixgbe_fc_autoneg(hw); /* Disable any previous flow control settings */ mflcn_reg = IXGBE_READ_REG(hw, IXGBE_MFLCN); - mflcn_reg &= ~(IXGBE_MFLCN_RFCE | IXGBE_MFLCN_RPFCE); + mflcn_reg &= ~(IXGBE_MFLCN_RPFCE_MASK | IXGBE_MFLCN_RFCE); fccfg_reg = IXGBE_READ_REG(hw, IXGBE_FCCFG); fccfg_reg &= ~(IXGBE_FCCFG_TFCE_802_3X | IXGBE_FCCFG_TFCE_PRIORITY); @@ -2319,206 +2507,40 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packetbuf_num) IXGBE_WRITE_REG(hw, IXGBE_MFLCN, mflcn_reg); IXGBE_WRITE_REG(hw, IXGBE_FCCFG, fccfg_reg); - fcrth = hw->fc.high_water[packetbuf_num] << 10; - fcrtl = hw->fc.low_water << 10; - if (hw->fc.current_mode & ixgbe_fc_tx_pause) { - fcrth |= IXGBE_FCRTH_FCEN; - if (hw->fc.send_xon) - fcrtl |= IXGBE_FCRTL_XONE; + /* Set up and enable Rx high/low water mark thresholds, enable XON. */ + for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) { + if ((hw->fc.current_mode & ixgbe_fc_tx_pause) && + hw->fc.high_water[i]) { + fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE; + IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), fcrtl); + fcrth = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN; + } else { + IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), 0); + /* + * In order to prevent Tx hangs when the internal Tx + * switch is enabled we must set the high water mark + * to the maximum FCRTH value. This allows the Tx + * switch to function even under heavy Rx workloads. + */ + fcrth = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i)) - 32; + } + + IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), fcrth); } - IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(packetbuf_num), fcrth); - IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(packetbuf_num), fcrtl); - /* Configure pause time (2 TCs per register) */ - reg = IXGBE_READ_REG(hw, IXGBE_FCTTV(packetbuf_num / 2)); - if ((packetbuf_num & 1) == 0) - reg = (reg & 0xFFFF0000) | hw->fc.pause_time; - else - reg = (reg & 0x0000FFFF) | (hw->fc.pause_time << 16); - IXGBE_WRITE_REG(hw, IXGBE_FCTTV(packetbuf_num / 2), reg); + reg = hw->fc.pause_time * 0x00010001; + for (i = 0; i < (IXGBE_DCB_MAX_TRAFFIC_CLASS / 2); i++) + IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg); - IXGBE_WRITE_REG(hw, IXGBE_FCRTV, (hw->fc.pause_time >> 1)); + /* Configure flow control refresh threshold value */ + IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2); out: return ret_val; } -/** - * ixgbe_fc_autoneg - Configure flow control - * @hw: pointer to hardware structure - * - * Compares our advertised flow control capabilities to those advertised by - * our link partner, and determines the proper flow control mode to use. - **/ -s32 ixgbe_fc_autoneg(struct ixgbe_hw *hw) -{ - s32 ret_val = IXGBE_ERR_FC_NOT_NEGOTIATED; - ixgbe_link_speed speed; - bool link_up; - - DEBUGFUNC("ixgbe_fc_autoneg"); - - if (hw->fc.disable_fc_autoneg) - goto out; - - /* - * AN should have completed when the cable was plugged in. - * Look for reasons to bail out. Bail out if: - * - FC autoneg is disabled, or if - * - link is not up. - * - * Since we're being called from an LSC, link is already known to be up. - * So use link_up_wait_to_complete=FALSE. - */ - hw->mac.ops.check_link(hw, &speed, &link_up, FALSE); - if (!link_up) { - ret_val = IXGBE_ERR_FLOW_CONTROL; - goto out; - } - - switch (hw->phy.media_type) { - /* Autoneg flow control on fiber adapters */ - case ixgbe_media_type_fiber: - if (speed == IXGBE_LINK_SPEED_1GB_FULL) - ret_val = ixgbe_fc_autoneg_fiber(hw); - break; - - /* Autoneg flow control on backplane adapters */ - case ixgbe_media_type_backplane: - ret_val = ixgbe_fc_autoneg_backplane(hw); - break; - - /* Autoneg flow control on copper adapters */ - case ixgbe_media_type_copper: - if (ixgbe_device_supports_autoneg_fc(hw) == IXGBE_SUCCESS) - ret_val = ixgbe_fc_autoneg_copper(hw); - break; - - default: - break; - } - -out: - if (ret_val == IXGBE_SUCCESS) { - hw->fc.fc_was_autonegged = TRUE; - } else { - hw->fc.fc_was_autonegged = FALSE; - hw->fc.current_mode = hw->fc.requested_mode; - } - return ret_val; -} - -/** - * ixgbe_fc_autoneg_fiber - Enable flow control on 1 gig fiber - * @hw: pointer to hardware structure - * - * Enable flow control according on 1 gig fiber. - **/ -static s32 ixgbe_fc_autoneg_fiber(struct ixgbe_hw *hw) -{ - u32 pcs_anadv_reg, pcs_lpab_reg, linkstat; - s32 ret_val; - - /* - * On multispeed fiber at 1g, bail out if - * - link is up but AN did not complete, or if - * - link is up and AN completed but timed out - */ - - linkstat = IXGBE_READ_REG(hw, IXGBE_PCS1GLSTA); - if ((!!(linkstat & IXGBE_PCS1GLSTA_AN_COMPLETE) == 0) || - (!!(linkstat & IXGBE_PCS1GLSTA_AN_TIMED_OUT) == 1)) { - ret_val = IXGBE_ERR_FC_NOT_NEGOTIATED; - goto out; - } - - pcs_anadv_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA); - pcs_lpab_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANLP); - - ret_val = ixgbe_negotiate_fc(hw, pcs_anadv_reg, - pcs_lpab_reg, IXGBE_PCS1GANA_SYM_PAUSE, - IXGBE_PCS1GANA_ASM_PAUSE, - IXGBE_PCS1GANA_SYM_PAUSE, - IXGBE_PCS1GANA_ASM_PAUSE); - -out: - return ret_val; -} - -/** - * ixgbe_fc_autoneg_backplane - Enable flow control IEEE clause 37 - * @hw: pointer to hardware structure - * - * Enable flow control according to IEEE clause 37. - **/ -static s32 ixgbe_fc_autoneg_backplane(struct ixgbe_hw *hw) -{ - u32 links2, anlp1_reg, autoc_reg, links; - s32 ret_val; - - /* - * On backplane, bail out if - * - backplane autoneg was not completed, or if - * - we are 82599 and link partner is not AN enabled - */ - links = IXGBE_READ_REG(hw, IXGBE_LINKS); - if ((links & IXGBE_LINKS_KX_AN_COMP) == 0) { - hw->fc.fc_was_autonegged = FALSE; - hw->fc.current_mode = hw->fc.requested_mode; - ret_val = IXGBE_ERR_FC_NOT_NEGOTIATED; - goto out; - } - - if (hw->mac.type == ixgbe_mac_82599EB) { - links2 = IXGBE_READ_REG(hw, IXGBE_LINKS2); - if ((links2 & IXGBE_LINKS2_AN_SUPPORTED) == 0) { - hw->fc.fc_was_autonegged = FALSE; - hw->fc.current_mode = hw->fc.requested_mode; - ret_val = IXGBE_ERR_FC_NOT_NEGOTIATED; - goto out; - } - } - /* - * Read the 10g AN autoc and LP ability registers and resolve - * local flow control settings accordingly - */ - autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); - anlp1_reg = IXGBE_READ_REG(hw, IXGBE_ANLP1); - - ret_val = ixgbe_negotiate_fc(hw, autoc_reg, - anlp1_reg, IXGBE_AUTOC_SYM_PAUSE, IXGBE_AUTOC_ASM_PAUSE, - IXGBE_ANLP1_SYM_PAUSE, IXGBE_ANLP1_ASM_PAUSE); - -out: - return ret_val; -} - -/** - * ixgbe_fc_autoneg_copper - Enable flow control IEEE clause 37 - * @hw: pointer to hardware structure - * - * Enable flow control according to IEEE clause 37. - **/ -static s32 ixgbe_fc_autoneg_copper(struct ixgbe_hw *hw) -{ - u16 technology_ability_reg = 0; - u16 lp_technology_ability_reg = 0; - - hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_ADVT, - IXGBE_MDIO_AUTO_NEG_DEV_TYPE, - &technology_ability_reg); - hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_LP, - IXGBE_MDIO_AUTO_NEG_DEV_TYPE, - &lp_technology_ability_reg); - - return ixgbe_negotiate_fc(hw, (u32)technology_ability_reg, - (u32)lp_technology_ability_reg, - IXGBE_TAF_SYM_PAUSE, IXGBE_TAF_ASM_PAUSE, - IXGBE_TAF_SYM_PAUSE, IXGBE_TAF_ASM_PAUSE); -} - /** * ixgbe_negotiate_fc - Negotiate flow control * @hw: pointer to hardware structure @@ -2569,180 +2591,163 @@ static s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg, } /** - * ixgbe_setup_fc - Set up flow control + * ixgbe_fc_autoneg_fiber - Enable flow control on 1 gig fiber * @hw: pointer to hardware structure * - * Called at init time to set up flow control. + * Enable flow control according on 1 gig fiber. **/ -static s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num) +static s32 ixgbe_fc_autoneg_fiber(struct ixgbe_hw *hw) { - s32 ret_val = IXGBE_SUCCESS; - u32 reg = 0, reg_bp = 0; - u16 reg_cu = 0; + u32 pcs_anadv_reg, pcs_lpab_reg, linkstat; + s32 ret_val = IXGBE_ERR_FC_NOT_NEGOTIATED; - DEBUGFUNC("ixgbe_setup_fc"); + /* + * On multispeed fiber at 1g, bail out if + * - link is up but AN did not complete, or if + * - link is up and AN completed but timed out + */ - /* Validate the packetbuf configuration */ - if (packetbuf_num < 0 || packetbuf_num > 7) { - DEBUGOUT1("Invalid packet buffer number [%d], expected range " - "is 0-7\n", packetbuf_num); - ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; + linkstat = IXGBE_READ_REG(hw, IXGBE_PCS1GLSTA); + if ((!!(linkstat & IXGBE_PCS1GLSTA_AN_COMPLETE) == 0) || + (!!(linkstat & IXGBE_PCS1GLSTA_AN_TIMED_OUT) == 1)) goto out; - } - /* - * Validate the water mark configuration. Zero water marks are invalid - * because it causes the controller to just blast out fc packets. - */ - if (!hw->fc.low_water || - !hw->fc.high_water[packetbuf_num] || - !hw->fc.pause_time) { - DEBUGOUT("Invalid water mark configuration\n"); - ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; - goto out; - } + pcs_anadv_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA); + pcs_lpab_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANLP); - /* - * Validate the requested mode. Strict IEEE mode does not allow - * ixgbe_fc_rx_pause because it will cause us to fail at UNH. - */ - if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) { - DEBUGOUT("ixgbe_fc_rx_pause not valid in strict IEEE mode\n"); - ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; - goto out; - } + ret_val = ixgbe_negotiate_fc(hw, pcs_anadv_reg, + pcs_lpab_reg, IXGBE_PCS1GANA_SYM_PAUSE, + IXGBE_PCS1GANA_ASM_PAUSE, + IXGBE_PCS1GANA_SYM_PAUSE, + IXGBE_PCS1GANA_ASM_PAUSE); - /* - * 10gig parts do not have a word in the EEPROM to determine the - * default flow control setting, so we explicitly set it to full. - */ - if (hw->fc.requested_mode == ixgbe_fc_default) - hw->fc.requested_mode = ixgbe_fc_full; - - /* - * Set up the 1G and 10G flow control advertisement registers so the - * HW will be able to do fc autoneg once the cable is plugged in. If - * we link at 10G, the 1G advertisement is harmless and vice versa. - */ - - switch (hw->phy.media_type) { - case ixgbe_media_type_fiber: - case ixgbe_media_type_backplane: - reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA); - reg_bp = IXGBE_READ_REG(hw, IXGBE_AUTOC); - break; - - case ixgbe_media_type_copper: - hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_ADVT, - IXGBE_MDIO_AUTO_NEG_DEV_TYPE, ®_cu); - break; - - default: - ; - } - - /* - * The possible values of fc.requested_mode are: - * 0: Flow control is completely disabled - * 1: Rx flow control is enabled (we can receive pause frames, - * but not send pause frames). - * 2: Tx flow control is enabled (we can send pause frames but - * we do not support receiving pause frames). - * 3: Both Rx and Tx flow control (symmetric) are enabled. - * other: Invalid. - */ - switch (hw->fc.requested_mode) { - case ixgbe_fc_none: - /* Flow control completely disabled by software override. */ - reg &= ~(IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE); - if (hw->phy.media_type == ixgbe_media_type_backplane) - reg_bp &= ~(IXGBE_AUTOC_SYM_PAUSE | - IXGBE_AUTOC_ASM_PAUSE); - else if (hw->phy.media_type == ixgbe_media_type_copper) - reg_cu &= ~(IXGBE_TAF_SYM_PAUSE | IXGBE_TAF_ASM_PAUSE); - break; - case ixgbe_fc_rx_pause: - /* - * Rx Flow control is enabled and Tx Flow control is - * disabled by software override. Since there really - * isn't a way to advertise that we are capable of RX - * Pause ONLY, we will advertise that we support both - * symmetric and asymmetric Rx PAUSE. Later, we will - * disable the adapter's ability to send PAUSE frames. - */ - reg |= (IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE); - if (hw->phy.media_type == ixgbe_media_type_backplane) - reg_bp |= (IXGBE_AUTOC_SYM_PAUSE | - IXGBE_AUTOC_ASM_PAUSE); - else if (hw->phy.media_type == ixgbe_media_type_copper) - reg_cu |= (IXGBE_TAF_SYM_PAUSE | IXGBE_TAF_ASM_PAUSE); - break; - case ixgbe_fc_tx_pause: - /* - * Tx Flow control is enabled, and Rx Flow control is - * disabled by software override. - */ - reg |= (IXGBE_PCS1GANA_ASM_PAUSE); - reg &= ~(IXGBE_PCS1GANA_SYM_PAUSE); - if (hw->phy.media_type == ixgbe_media_type_backplane) { - reg_bp |= (IXGBE_AUTOC_ASM_PAUSE); - reg_bp &= ~(IXGBE_AUTOC_SYM_PAUSE); - } else if (hw->phy.media_type == ixgbe_media_type_copper) { - reg_cu |= (IXGBE_TAF_ASM_PAUSE); - reg_cu &= ~(IXGBE_TAF_SYM_PAUSE); - } - break; - case ixgbe_fc_full: - /* Flow control (both Rx and Tx) is enabled by SW override. */ - reg |= (IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE); - if (hw->phy.media_type == ixgbe_media_type_backplane) - reg_bp |= (IXGBE_AUTOC_SYM_PAUSE | - IXGBE_AUTOC_ASM_PAUSE); - else if (hw->phy.media_type == ixgbe_media_type_copper) - reg_cu |= (IXGBE_TAF_SYM_PAUSE | IXGBE_TAF_ASM_PAUSE); - break; - default: - DEBUGOUT("Flow control param set incorrectly\n"); - ret_val = IXGBE_ERR_CONFIG; - goto out; - break; - } - - if (hw->mac.type != ixgbe_mac_X540) { - /* - * Enable auto-negotiation between the MAC & PHY; - * the MAC will advertise clause 37 flow control. - */ - IXGBE_WRITE_REG(hw, IXGBE_PCS1GANA, reg); - reg = IXGBE_READ_REG(hw, IXGBE_PCS1GLCTL); - - /* Disable AN timeout */ - if (hw->fc.strict_ieee) - reg &= ~IXGBE_PCS1GLCTL_AN_1G_TIMEOUT_EN; - - IXGBE_WRITE_REG(hw, IXGBE_PCS1GLCTL, reg); - DEBUGOUT1("Set up FC; PCS1GLCTL = 0x%08X\n", reg); - } - - /* - * AUTOC restart handles negotiation of 1G and 10G on backplane - * and copper. There is no need to set the PCS1GCTL register. - * - */ - if (hw->phy.media_type == ixgbe_media_type_backplane) { - reg_bp |= IXGBE_AUTOC_AN_RESTART; - IXGBE_WRITE_REG(hw, IXGBE_AUTOC, reg_bp); - } else if ((hw->phy.media_type == ixgbe_media_type_copper) && - (ixgbe_device_supports_autoneg_fc(hw) == IXGBE_SUCCESS)) { - hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_ADVT, - IXGBE_MDIO_AUTO_NEG_DEV_TYPE, reg_cu); - } - - DEBUGOUT1("Set up FC; IXGBE_AUTOC = 0x%08X\n", reg); out: return ret_val; } +/** + * ixgbe_fc_autoneg_backplane - Enable flow control IEEE clause 37 + * @hw: pointer to hardware structure + * + * Enable flow control according to IEEE clause 37. + **/ +static s32 ixgbe_fc_autoneg_backplane(struct ixgbe_hw *hw) +{ + u32 links2, anlp1_reg, autoc_reg, links; + s32 ret_val = IXGBE_ERR_FC_NOT_NEGOTIATED; + + /* + * On backplane, bail out if + * - backplane autoneg was not completed, or if + * - we are 82599 and link partner is not AN enabled + */ + links = IXGBE_READ_REG(hw, IXGBE_LINKS); + if ((links & IXGBE_LINKS_KX_AN_COMP) == 0) + goto out; + + if (hw->mac.type == ixgbe_mac_82599EB) { + links2 = IXGBE_READ_REG(hw, IXGBE_LINKS2); + if ((links2 & IXGBE_LINKS2_AN_SUPPORTED) == 0) + goto out; + } + /* + * Read the 10g AN autoc and LP ability registers and resolve + * local flow control settings accordingly + */ + autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); + anlp1_reg = IXGBE_READ_REG(hw, IXGBE_ANLP1); + + ret_val = ixgbe_negotiate_fc(hw, autoc_reg, + anlp1_reg, IXGBE_AUTOC_SYM_PAUSE, IXGBE_AUTOC_ASM_PAUSE, + IXGBE_ANLP1_SYM_PAUSE, IXGBE_ANLP1_ASM_PAUSE); + +out: + return ret_val; +} + +/** + * ixgbe_fc_autoneg_copper - Enable flow control IEEE clause 37 + * @hw: pointer to hardware structure + * + * Enable flow control according to IEEE clause 37. + **/ +static s32 ixgbe_fc_autoneg_copper(struct ixgbe_hw *hw) +{ + u16 technology_ability_reg = 0; + u16 lp_technology_ability_reg = 0; + + hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_ADVT, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + &technology_ability_reg); + hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_LP, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + &lp_technology_ability_reg); + + return ixgbe_negotiate_fc(hw, (u32)technology_ability_reg, + (u32)lp_technology_ability_reg, + IXGBE_TAF_SYM_PAUSE, IXGBE_TAF_ASM_PAUSE, + IXGBE_TAF_SYM_PAUSE, IXGBE_TAF_ASM_PAUSE); +} + +/** + * ixgbe_fc_autoneg - Configure flow control + * @hw: pointer to hardware structure + * + * Compares our advertised flow control capabilities to those advertised by + * our link partner, and determines the proper flow control mode to use. + **/ +void ixgbe_fc_autoneg(struct ixgbe_hw *hw) +{ + s32 ret_val = IXGBE_ERR_FC_NOT_NEGOTIATED; + ixgbe_link_speed speed; + bool link_up; + + DEBUGFUNC("ixgbe_fc_autoneg"); + + /* + * AN should have completed when the cable was plugged in. + * Look for reasons to bail out. Bail out if: + * - FC autoneg is disabled, or if + * - link is not up. + */ + if (hw->fc.disable_fc_autoneg) + goto out; + + hw->mac.ops.check_link(hw, &speed, &link_up, FALSE); + if (!link_up) + goto out; + + switch (hw->phy.media_type) { + /* Autoneg flow control on fiber adapters */ + case ixgbe_media_type_fiber: + if (speed == IXGBE_LINK_SPEED_1GB_FULL) + ret_val = ixgbe_fc_autoneg_fiber(hw); + break; + + /* Autoneg flow control on backplane adapters */ + case ixgbe_media_type_backplane: + ret_val = ixgbe_fc_autoneg_backplane(hw); + break; + + /* Autoneg flow control on copper adapters */ + case ixgbe_media_type_copper: + if (ixgbe_device_supports_autoneg_fc(hw) == IXGBE_SUCCESS) + ret_val = ixgbe_fc_autoneg_copper(hw); + break; + + default: + break; + } + +out: + if (ret_val == IXGBE_SUCCESS) { + hw->fc.fc_was_autonegged = TRUE; + } else { + hw->fc.fc_was_autonegged = FALSE; + hw->fc.current_mode = hw->fc.requested_mode; + } +} + /** * ixgbe_disable_pcie_master - Disable PCI-express master access * @hw: pointer to hardware structure @@ -3131,20 +3136,35 @@ san_mac_addr_out: * Read PCIe configuration space, and get the MSI-X vector count from * the capabilities table. **/ -u32 ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw) +u16 ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw) { - u32 msix_count = 64; + u16 msix_count = 1; + u16 max_msix_count; + u16 pcie_offset; + + switch (hw->mac.type) { + case ixgbe_mac_82598EB: + pcie_offset = IXGBE_PCIE_MSIX_82598_CAPS; + max_msix_count = IXGBE_MAX_MSIX_VECTORS_82598; + break; + case ixgbe_mac_82599EB: + case ixgbe_mac_X540: + pcie_offset = IXGBE_PCIE_MSIX_82599_CAPS; + max_msix_count = IXGBE_MAX_MSIX_VECTORS_82599; + break; + default: + return msix_count; + } DEBUGFUNC("ixgbe_get_pcie_msix_count_generic"); - if (hw->mac.msix_vectors_from_pcie) { - msix_count = IXGBE_READ_PCIE_WORD(hw, - IXGBE_PCIE_MSIX_82599_CAPS); - msix_count &= IXGBE_PCIE_MSIX_TBL_SZ_MASK; + msix_count = IXGBE_READ_PCIE_WORD(hw, pcie_offset); + msix_count &= IXGBE_PCIE_MSIX_TBL_SZ_MASK; - /* MSI-X count is zero-based in HW, so increment to give - * proper value */ - msix_count++; - } + /* MSI-X count is zero-based in HW */ + msix_count++; + + if (msix_count > max_msix_count) + msix_count = max_msix_count; return msix_count; } @@ -3298,6 +3318,33 @@ s32 ixgbe_set_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq) return IXGBE_SUCCESS; } +/** + * This function should only be involved in the IOV mode. + * In IOV mode, Default pool is next pool after the number of + * VFs advertized and not 0. + * MPSAR table needs to be updated for SAN_MAC RAR [hw->mac.san_mac_rar_index] + * + * ixgbe_set_vmdq_san_mac - Associate default VMDq pool index with a rx address + * @hw: pointer to hardware struct + * @vmdq: VMDq pool index + **/ +s32 ixgbe_set_vmdq_san_mac_generic(struct ixgbe_hw *hw, u32 vmdq) +{ + u32 rar = hw->mac.san_mac_rar_index; + + DEBUGFUNC("ixgbe_set_vmdq_san_mac"); + + if (vmdq < 32) { + IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), 1 << vmdq); + IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), 0); + } else { + IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), 0); + IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), 1 << (vmdq - 32)); + } + + return IXGBE_SUCCESS; +} + /** * ixgbe_init_uta_tables_generic - Initialize the Unicast Table Array * @hw: pointer to hardware structure @@ -3717,30 +3764,6 @@ out: return status; } -/** - * ixgbe_device_supports_autoneg_fc - Check if phy supports autoneg flow - * control - * @hw: pointer to hardware structure - * - * There are several phys that do not support autoneg flow control. This - * function check the device id to see if the associated phy supports - * autoneg flow control. - **/ -static s32 ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw) -{ - - DEBUGFUNC("ixgbe_device_supports_autoneg_fc"); - - switch (hw->device_id) { - case IXGBE_DEV_ID_X540T: - return IXGBE_SUCCESS; - case IXGBE_DEV_ID_82599_T3_LOM: - return IXGBE_SUCCESS; - default: - return IXGBE_ERR_FC_NOT_SUPPORTED; - } -} - /** * ixgbe_set_mac_anti_spoofing - Enable/Disable MAC anti-spoofing * @hw: pointer to hardware structure @@ -3765,20 +3788,22 @@ void ixgbe_set_mac_anti_spoofing(struct ixgbe_hw *hw, bool enable, int pf) * PFVFSPOOF register array is size 8 with 8 bits assigned to * MAC anti-spoof enables in each register array element. */ - for (j = 0; j < IXGBE_PFVFSPOOF_REG_COUNT; j++) + for (j = 0; j < pf_target_reg; j++) IXGBE_WRITE_REG(hw, IXGBE_PFVFSPOOF(j), pfvfspoof); - /* If not enabling anti-spoofing then done */ - if (!enable) - return; - /* * The PF should be allowed to spoof so that it can support - * emulation mode NICs. Reset the bit assigned to the PF + * emulation mode NICs. Do not set the bits assigned to the PF */ - pfvfspoof = IXGBE_READ_REG(hw, IXGBE_PFVFSPOOF(pf_target_reg)); - pfvfspoof ^= (1 << pf_target_shift); - IXGBE_WRITE_REG(hw, IXGBE_PFVFSPOOF(pf_target_reg), pfvfspoof); + pfvfspoof &= (1 << pf_target_shift) - 1; + IXGBE_WRITE_REG(hw, IXGBE_PFVFSPOOF(j), pfvfspoof); + + /* + * Remaining pools belong to the PF so they do not need to have + * anti-spoofing enabled. + */ + for (j++; j < IXGBE_PFVFSPOOF_REG_COUNT; j++) + IXGBE_WRITE_REG(hw, IXGBE_PFVFSPOOF(j), 0); } /** @@ -3837,14 +3862,14 @@ void ixgbe_enable_relaxed_ordering_gen2(struct ixgbe_hw *hw) /* Enable relaxed ordering */ for (i = 0; i < hw->mac.max_tx_queues; i++) { regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(i)); - regval |= IXGBE_DCA_TXCTRL_TX_WB_RO_EN; + regval |= IXGBE_DCA_TXCTRL_DESC_WRO_EN; IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(i), regval); } for (i = 0; i < hw->mac.max_rx_queues; i++) { regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i)); - regval |= (IXGBE_DCA_RXCTRL_DESC_WRO_EN | - IXGBE_DCA_RXCTRL_DESC_HSRO_EN); + regval |= IXGBE_DCA_RXCTRL_DATA_WRO_EN | + IXGBE_DCA_RXCTRL_HEAD_WRO_EN; IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval); } @@ -3878,7 +3903,7 @@ static u8 ixgbe_calculate_checksum(u8 *buffer, u32 length) * @hw: pointer to the HW structure * @buffer: contains the command to write and where the return status will * be placed - * @lenght: lenght of buffer, must be multiple of 4 bytes + * @length: length of buffer, must be multiple of 4 bytes * * Communicates with the manageability block. On success return IXGBE_SUCCESS * else return IXGBE_ERR_HOST_INTERFACE_COMMAND. @@ -4057,17 +4082,17 @@ void ixgbe_set_rxpba_generic(struct ixgbe_hw *hw, int num_pb, u32 headroom, * buffers requested using supplied strategy. */ switch (strategy) { - case (PBA_STRATEGY_WEIGHTED): + case PBA_STRATEGY_WEIGHTED: /* ixgbe_dcb_pba_80_48 strategy weight first half of packet * buffer with 5/8 of the packet buffer space. */ - rxpktsize = (pbsize * 5 * 2) / (num_pb * 8); + rxpktsize = (pbsize * 5) / (num_pb * 4); pbsize -= rxpktsize * (num_pb / 2); rxpktsize <<= IXGBE_RXPBSIZE_SHIFT; for (; i < (num_pb / 2); i++) IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpktsize); /* Fall through to configure remaining packet buffers */ - case (PBA_STRATEGY_EQUAL): + case PBA_STRATEGY_EQUAL: rxpktsize = (pbsize / (num_pb - i)) << IXGBE_RXPBSIZE_SHIFT; for (; i < num_pb; i++) IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpktsize); diff --git a/sys/dev/ixgbe/ixgbe_common.h b/sys/dev/ixgbe/ixgbe_common.h index 4bd4b75e48b..3bbc537eac9 100644 --- a/sys/dev/ixgbe/ixgbe_common.h +++ b/sys/dev/ixgbe/ixgbe_common.h @@ -42,7 +42,7 @@ IXGBE_WRITE_REG(hw, reg + 4, (u32) (value >> 32)); \ } while (0) -u32 ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw); +u16 ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw); s32 ixgbe_init_ops_generic(struct ixgbe_hw *hw); s32 ixgbe_init_hw_generic(struct ixgbe_hw *hw); @@ -95,8 +95,8 @@ s32 ixgbe_enable_rx_dma_generic(struct ixgbe_hw *hw, u32 regval); s32 ixgbe_disable_sec_rx_path_generic(struct ixgbe_hw *hw); s32 ixgbe_enable_sec_rx_path_generic(struct ixgbe_hw *hw); -s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packtetbuf_num); -s32 ixgbe_fc_autoneg(struct ixgbe_hw *hw); +s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw); +void ixgbe_fc_autoneg(struct ixgbe_hw *hw); s32 ixgbe_validate_mac_addr(u8 *mac_addr); s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask); @@ -110,6 +110,7 @@ s32 ixgbe_get_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr); s32 ixgbe_set_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr); s32 ixgbe_set_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq); +s32 ixgbe_set_vmdq_san_mac_generic(struct ixgbe_hw *hw, u32 vmdq); s32 ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq); s32 ixgbe_insert_mac_addr_generic(struct ixgbe_hw *hw, u8 *addr, u32 vmdq); s32 ixgbe_init_uta_tables_generic(struct ixgbe_hw *hw); diff --git a/sys/dev/ixgbe/ixgbe_osdep.h b/sys/dev/ixgbe/ixgbe_osdep.h index 4ba3f10fb3b..0b0c177ca15 100644 --- a/sys/dev/ixgbe/ixgbe_osdep.h +++ b/sys/dev/ixgbe/ixgbe_osdep.h @@ -55,6 +55,7 @@ #include #define ASSERT(x) if(!(x)) panic("IXGBE: x") +#define EWARN(H, W, S) printf(W) /* The happy-fun DELAY macro is defined in /usr/src/sys/i386/include/clock.h */ #define usec_delay(x) DELAY(x) @@ -110,6 +111,14 @@ typedef uint64_t u64; typedef boolean_t bool; #endif +/* shared code requires this */ +#define __le16 u16 +#define __le32 u32 +#define __le64 u64 +#define __be16 u16 +#define __be32 u32 +#define __be64 u64 + #define le16_to_cpu #if __FreeBSD_version < 800000 diff --git a/sys/dev/ixgbe/ixgbe_phy.c b/sys/dev/ixgbe/ixgbe_phy.c index a8693cecb5b..3f262f9b3b2 100644 --- a/sys/dev/ixgbe/ixgbe_phy.c +++ b/sys/dev/ixgbe/ixgbe_phy.c @@ -1020,6 +1020,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) * 8 SFP_act_lmt_DA_CORE1 - 82599-specific * 9 SFP_1g_cu_CORE0 - 82599-specific * 10 SFP_1g_cu_CORE1 - 82599-specific + * 11 SFP_1g_sx_CORE0 - 82599-specific + * 12 SFP_1g_sx_CORE1 - 82599-specific */ if (hw->mac.type == ixgbe_mac_82598EB) { if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) @@ -1070,6 +1072,13 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) else hw->phy.sfp_type = ixgbe_sfp_type_1g_cu_core1; + } else if (comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) { + if (hw->bus.lan_id == 0) + hw->phy.sfp_type = + ixgbe_sfp_type_1g_sx_core0; + else + hw->phy.sfp_type = + ixgbe_sfp_type_1g_sx_core1; } else { hw->phy.sfp_type = ixgbe_sfp_type_unknown; } @@ -1162,7 +1171,9 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) /* Verify supported 1G SFP modules */ if (comp_codes_10g == 0 && !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 || - hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0)) { + hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 || + hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 || + hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) { hw->phy.type = ixgbe_phy_sfp_unsupported; status = IXGBE_ERR_SFP_NOT_SUPPORTED; goto out; @@ -1177,14 +1188,31 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) ixgbe_get_device_caps(hw, &enforce_sfp); if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP) && !((hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0) || - (hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1))) { + (hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1) || + (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0) || + (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1))) { /* Make sure we're a supported PHY type */ if (hw->phy.type == ixgbe_phy_sfp_intel) { status = IXGBE_SUCCESS; } else { - DEBUGOUT("SFP+ module not supported\n"); - hw->phy.type = ixgbe_phy_sfp_unsupported; - status = IXGBE_ERR_SFP_NOT_SUPPORTED; + if (hw->allow_unsupported_sfp == TRUE) { + EWARN(hw, "WARNING: Intel (R) Network " + "Connections are quality tested " + "using Intel (R) Ethernet Optics." + " Using untested modules is not " + "supported and may cause unstable" + " operation or damage to the " + "module or the adapter. Intel " + "Corporation is not responsible " + "for any harm caused by using " + "untested modules.\n", status); + status = IXGBE_SUCCESS; + } else { + DEBUGOUT("SFP+ module not supported\n"); + hw->phy.type = + ixgbe_phy_sfp_unsupported; + status = IXGBE_ERR_SFP_NOT_SUPPORTED; + } } } else { status = IXGBE_SUCCESS; @@ -1238,10 +1266,12 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw, * SR modules */ if (sfp_type == ixgbe_sfp_type_da_act_lmt_core0 || - sfp_type == ixgbe_sfp_type_1g_cu_core0) + sfp_type == ixgbe_sfp_type_1g_cu_core0 || + sfp_type == ixgbe_sfp_type_1g_sx_core0) sfp_type = ixgbe_sfp_type_srlr_core0; else if (sfp_type == ixgbe_sfp_type_da_act_lmt_core1 || - sfp_type == ixgbe_sfp_type_1g_cu_core1) + sfp_type == ixgbe_sfp_type_1g_cu_core1 || + sfp_type == ixgbe_sfp_type_1g_sx_core1) sfp_type = ixgbe_sfp_type_srlr_core1; /* Read offset to PHY init contents */ @@ -1715,15 +1745,24 @@ static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data) **/ static void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl) { + u32 i = 0; + u32 timeout = IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT; + u32 i2cctl_r = 0; + DEBUGFUNC("ixgbe_raise_i2c_clk"); - *i2cctl |= IXGBE_I2C_CLK_OUT; + for (i = 0; i < timeout; i++) { + *i2cctl |= IXGBE_I2C_CLK_OUT; - IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); - IXGBE_WRITE_FLUSH(hw); + IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); + IXGBE_WRITE_FLUSH(hw); + /* SCL rise time (1000ns) */ + usec_delay(IXGBE_I2C_T_RISE); - /* SCL rise time (1000ns) */ - usec_delay(IXGBE_I2C_T_RISE); + i2cctl_r = IXGBE_READ_REG(hw, IXGBE_I2CCTL); + if (i2cctl_r & IXGBE_I2C_CLK_IN) + break; + } } /** @@ -1840,7 +1879,7 @@ void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw) } /** - * ixgbe_tn_check_overtemp - Checks if an overtemp occured. + * ixgbe_tn_check_overtemp - Checks if an overtemp occurred. * @hw: pointer to hardware structure * * Checks if the LASI temp alarm status was triggered due to overtemp diff --git a/sys/dev/ixgbe/ixgbe_type.h b/sys/dev/ixgbe/ixgbe_type.h index f25b2297450..52944fdbce7 100644 --- a/sys/dev/ixgbe/ixgbe_type.h +++ b/sys/dev/ixgbe/ixgbe_type.h @@ -66,12 +66,14 @@ #define IXGBE_DEV_ID_82599_BACKPLANE_FCOE 0x152A #define IXGBE_DEV_ID_82599_SFP_FCOE 0x1529 #define IXGBE_DEV_ID_82599_SFP_EM 0x1507 +#define IXGBE_DEV_ID_82599_SFP_SF2 0x154D #define IXGBE_DEV_ID_82599EN_SFP 0x1557 #define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC #define IXGBE_DEV_ID_82599_T3_LOM 0x151C #define IXGBE_DEV_ID_82599_VF 0x10ED #define IXGBE_DEV_ID_X540_VF 0x1515 #define IXGBE_DEV_ID_X540T 0x1528 +#define IXGBE_DEV_ID_X540T1 0x1560 /* General Registers */ #define IXGBE_CTRL 0x00000 @@ -118,6 +120,8 @@ #define IXGBE_I2C_CLK_OUT 0x00000002 #define IXGBE_I2C_DATA_IN 0x00000004 #define IXGBE_I2C_DATA_OUT 0x00000008 +#define IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT 500 + /* Interrupt Registers */ #define IXGBE_EICR 0x00800 @@ -832,6 +836,7 @@ #define IXGBE_GCR_EXT_VT_MODE_64 0x00000003 #define IXGBE_GCR_EXT_SRIOV (IXGBE_GCR_EXT_MSIX_EN | \ IXGBE_GCR_EXT_VT_MODE_64) +#define IXGBE_GCR_EXT_VT_MODE_MASK 0x00000003 /* Time Sync Registers */ #define IXGBE_TSYNCRXCTL 0x05188 /* Rx Time Sync Control register - RW */ #define IXGBE_TSYNCTXCTL 0x08C00 /* Tx Time Sync Control register - RW */ @@ -852,6 +857,8 @@ #define IXGBE_TRGTTIMH0 0x08C28 /* Target Time Register 0 High - RW */ #define IXGBE_TRGTTIML1 0x08C2C /* Target Time Register 1 Low - RW */ #define IXGBE_TRGTTIMH1 0x08C30 /* Target Time Register 1 High - RW */ +#define IXGBE_CLKTIML 0x08C34 /* Clock Out Time Register Low - RW */ +#define IXGBE_CLKTIMH 0x08C38 /* Clock Out Time Register High - RW */ #define IXGBE_FREQOUT0 0x08C34 /* Frequency Out 0 Control register - RW */ #define IXGBE_FREQOUT1 0x08C38 /* Frequency Out 1 Control register - RW */ #define IXGBE_AUXSTMPL0 0x08C3C /* Auxiliary Time Stamp 0 register Low - RO */ @@ -1071,14 +1078,16 @@ #define IXGBE_DCA_RXCTRL_HEAD_DCA_EN (1 << 6) /* Rx Desc header ena */ #define IXGBE_DCA_RXCTRL_DATA_DCA_EN (1 << 7) /* Rx Desc payload ena */ #define IXGBE_DCA_RXCTRL_DESC_RRO_EN (1 << 9) /* Rx rd Desc Relax Order */ -#define IXGBE_DCA_RXCTRL_DESC_WRO_EN (1 << 13) /* Rx wr Desc Relax Order */ -#define IXGBE_DCA_RXCTRL_DESC_HSRO_EN (1 << 15) /* Rx Split Header RO */ +#define IXGBE_DCA_RXCTRL_DATA_WRO_EN (1 << 13) /* Rx wr data Relax Order */ +#define IXGBE_DCA_RXCTRL_HEAD_WRO_EN (1 << 15) /* Rx wr header RO */ #define IXGBE_DCA_TXCTRL_CPUID_MASK 0x0000001F /* Tx CPUID Mask */ #define IXGBE_DCA_TXCTRL_CPUID_MASK_82599 0xFF000000 /* Tx CPUID Mask */ #define IXGBE_DCA_TXCTRL_CPUID_SHIFT_82599 24 /* Tx CPUID Shift */ #define IXGBE_DCA_TXCTRL_DESC_DCA_EN (1 << 5) /* DCA Tx Desc enable */ -#define IXGBE_DCA_TXCTRL_TX_WB_RO_EN (1 << 11) /* Tx Desc writeback RO bit */ +#define IXGBE_DCA_TXCTRL_DESC_RRO_EN (1 << 9) /* Tx rd Desc Relax Order */ +#define IXGBE_DCA_TXCTRL_DESC_WRO_EN (1 << 11) /* Tx Desc writeback RO bit */ +#define IXGBE_DCA_TXCTRL_DATA_RRO_EN (1 << 13) /* Tx rd data Relax Order */ #define IXGBE_DCA_MAX_QUEUES_82598 16 /* DCA regs only on 16 queues */ /* MSCA Bit Masks */ @@ -1382,6 +1391,7 @@ enum { #define IXGBE_EICR_LINKSEC 0x00200000 /* PN Threshold */ #define IXGBE_EICR_MNG 0x00400000 /* Manageability Event Interrupt */ #define IXGBE_EICR_TS 0x00800000 /* Thermal Sensor Event */ +#define IXGBE_EICR_TIMESYNC 0x01000000 /* Timesync Event */ #define IXGBE_EICR_GPI_SDP0 0x01000000 /* Gen Purpose Interrupt on SDP0 */ #define IXGBE_EICR_GPI_SDP1 0x02000000 /* Gen Purpose Interrupt on SDP1 */ #define IXGBE_EICR_GPI_SDP2 0x04000000 /* Gen Purpose Interrupt on SDP2 */ @@ -1399,6 +1409,7 @@ enum { #define IXGBE_EICS_MAILBOX IXGBE_EICR_MAILBOX /* VF to PF Mailbox Int */ #define IXGBE_EICS_LSC IXGBE_EICR_LSC /* Link Status Change */ #define IXGBE_EICS_MNG IXGBE_EICR_MNG /* MNG Event Interrupt */ +#define IXGBE_EICS_TIMESYNC IXGBE_EICR_TIMESYNC /* Timesync Event */ #define IXGBE_EICS_GPI_SDP0 IXGBE_EICR_GPI_SDP0 /* SDP0 Gen Purpose Int */ #define IXGBE_EICS_GPI_SDP1 IXGBE_EICR_GPI_SDP1 /* SDP1 Gen Purpose Int */ #define IXGBE_EICS_GPI_SDP2 IXGBE_EICR_GPI_SDP2 /* SDP2 Gen Purpose Int */ @@ -1417,6 +1428,7 @@ enum { #define IXGBE_EIMS_LSC IXGBE_EICR_LSC /* Link Status Change */ #define IXGBE_EIMS_MNG IXGBE_EICR_MNG /* MNG Event Interrupt */ #define IXGBE_EIMS_TS IXGBE_EICR_TS /* Thermal Sensor Event */ +#define IXGBE_EIMS_TIMESYNC IXGBE_EICR_TIMESYNC /* Timesync Event */ #define IXGBE_EIMS_GPI_SDP0 IXGBE_EICR_GPI_SDP0 /* SDP0 Gen Purpose Int */ #define IXGBE_EIMS_GPI_SDP1 IXGBE_EICR_GPI_SDP1 /* SDP1 Gen Purpose Int */ #define IXGBE_EIMS_GPI_SDP2 IXGBE_EICR_GPI_SDP2 /* SDP2 Gen Purpose Int */ @@ -1434,6 +1446,7 @@ enum { #define IXGBE_EIMC_MAILBOX IXGBE_EICR_MAILBOX /* VF to PF Mailbox Int */ #define IXGBE_EIMC_LSC IXGBE_EICR_LSC /* Link Status Change */ #define IXGBE_EIMC_MNG IXGBE_EICR_MNG /* MNG Event Interrupt */ +#define IXGBE_EIMC_TIMESYNC IXGBE_EICR_TIMESYNC /* Timesync Event */ #define IXGBE_EIMC_GPI_SDP0 IXGBE_EICR_GPI_SDP0 /* SDP0 Gen Purpose Int */ #define IXGBE_EIMC_GPI_SDP1 IXGBE_EICR_GPI_SDP1 /* SDP1 Gen Purpose Int */ #define IXGBE_EIMC_GPI_SDP2 IXGBE_EICR_GPI_SDP2 /* SDP2 Gen Purpose Int */ @@ -1519,6 +1532,7 @@ enum { #define IXGBE_ETQF_1588 0x40000000 /* bit 30 */ #define IXGBE_ETQF_FILTER_EN 0x80000000 /* bit 31 */ #define IXGBE_ETQF_POOL_ENABLE (1 << 26) /* bit 26 */ +#define IXGBE_ETQF_POOL_SHIFT 20 #define IXGBE_ETQS_RX_QUEUE 0x007F0000 /* bits 22:16 */ #define IXGBE_ETQS_RX_QUEUE_SHIFT 16 @@ -1573,8 +1587,17 @@ enum { #define IXGBE_ESDP_SDP4 0x00000010 /* SDP4 Data Value */ #define IXGBE_ESDP_SDP5 0x00000020 /* SDP5 Data Value */ #define IXGBE_ESDP_SDP6 0x00000040 /* SDP6 Data Value */ -#define IXGBE_ESDP_SDP4_DIR 0x00000004 /* SDP4 IO direction */ +#define IXGBE_ESDP_SDP7 0x00000080 /* SDP7 Data Value */ +#define IXGBE_ESDP_SDP0_DIR 0x00000100 /* SDP0 IO direction */ +#define IXGBE_ESDP_SDP1_DIR 0x00000200 /* SDP1 IO direction */ +#define IXGBE_ESDP_SDP3_DIR 0x00000800 /* SDP3 IO direction */ +#define IXGBE_ESDP_SDP4_DIR 0x00001000 /* SDP4 IO direction */ #define IXGBE_ESDP_SDP5_DIR 0x00002000 /* SDP5 IO direction */ +#define IXGBE_ESDP_SDP6_DIR 0x00004000 /* SDP6 IO direction */ +#define IXGBE_ESDP_SDP7_DIR 0x00008000 /* SDP7 IO direction */ +#define IXGBE_ESDP_SDP0_NATIVE 0x00010000 /* SDP0 IO mode */ +#define IXGBE_ESDP_SDP1_NATIVE 0x00020000 /* SDP1 IO mode */ + /* LEDCTL Bit Masks */ #define IXGBE_LED_IVRT_BASE 0x00000040 @@ -1777,7 +1800,9 @@ enum { #define IXGBE_DEVICE_CAPS 0x2C #define IXGBE_SERIAL_NUMBER_MAC_ADDR 0x11 #define IXGBE_PCIE_MSIX_82599_CAPS 0x72 +#define IXGBE_MAX_MSIX_VECTORS_82599 0x40 #define IXGBE_PCIE_MSIX_82598_CAPS 0x62 +#define IXGBE_MAX_MSIX_VECTORS_82598 0x13 /* MSI-X capability fields masks */ #define IXGBE_PCIE_MSIX_TBL_SZ_MASK 0x7FF @@ -1872,6 +1897,7 @@ enum { #define IXGBE_PCI_LINK_SPEED 0xF #define IXGBE_PCI_LINK_SPEED_2500 0x1 #define IXGBE_PCI_LINK_SPEED_5000 0x2 +#define IXGBE_PCI_LINK_SPEED_8000 0x3 #define IXGBE_PCI_HEADER_TYPE_REGISTER 0x0E #define IXGBE_PCI_HEADER_TYPE_MULTIFUNC 0x80 #define IXGBE_PCI_DEVICE_CONTROL2_16ms 0x0005 @@ -1934,6 +1960,10 @@ enum { #define IXGBE_RXDCTL_RLPML_EN 0x00008000 #define IXGBE_RXDCTL_VME 0x40000000 /* VLAN mode enable */ +#define IXGBE_TSAUXC_EN_CLK 0x00000004 +#define IXGBE_TSAUXC_SYNCLK 0x00000008 +#define IXGBE_TSAUXC_SDP0_INT 0x00000040 + #define IXGBE_TSYNCTXCTL_VALID 0x00000001 /* Tx timestamp valid */ #define IXGBE_TSYNCTXCTL_ENABLED 0x00000010 /* Tx timestamping enabled */ @@ -1977,8 +2007,7 @@ enum { #define IXGBE_MFLCN_DPF 0x00000002 /* Discard Pause Frame */ #define IXGBE_MFLCN_RPFCE 0x00000004 /* Receive Priority FC Enable */ #define IXGBE_MFLCN_RFCE 0x00000008 /* Receive FC Enable */ -#define IXGBE_MFLCN_RPFCM 0x00000004 /* Receive Priority FC Mode */ -#define IXGBE_MFLCN_RPFCE_MASK 0x00000FF0 /* Rx Priority FC bitmap mask */ +#define IXGBE_MFLCN_RPFCE_MASK 0x00000FF4 /* Rx Priority FC bitmap mask */ #define IXGBE_MFLCN_RPFCE_SHIFT 4 /* Rx Priority FC bitmap shift */ /* Multiple Receive Queue Control */ @@ -2513,13 +2542,14 @@ typedef u32 ixgbe_physical_layer; #define IXGBE_PHYSICAL_LAYER_10GBASE_KR 0x0800 #define IXGBE_PHYSICAL_LAYER_10GBASE_XAUI 0x1000 #define IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA 0x2000 +#define IXGBE_PHYSICAL_LAYER_1000BASE_SX 0x4000 /* Flow Control Data Sheet defined values * Calculation and defines taken from 802.1bb Annex O */ /* BitTimes (BT) conversion */ -#define IXGBE_BT2KB(BT) ((BT + 1023) / (8 * 1024)) +#define IXGBE_BT2KB(BT) ((BT + (8 * 1024 - 1)) / (8 * 1024)) #define IXGBE_B2BT(BT) (BT * 8) /* Calculate Delay to respond to PFC */ @@ -2550,24 +2580,31 @@ typedef u32 ixgbe_physical_layer; #define IXGBE_PCI_DELAY 10000 /* Calculate X540 delay value in bit times */ -#define IXGBE_FILL_RATE (36 / 25) - -#define IXGBE_DV_X540(LINK, TC) (IXGBE_FILL_RATE * \ - (IXGBE_B2BT(LINK) + IXGBE_PFC_D + \ - (2 * IXGBE_CABLE_DC) + \ - (2 * IXGBE_ID_X540) + \ - IXGBE_HD + IXGBE_B2BT(TC))) +#define IXGBE_DV_X540(_max_frame_link, _max_frame_tc) \ + ((36 * \ + (IXGBE_B2BT(_max_frame_link) + \ + IXGBE_PFC_D + \ + (2 * IXGBE_CABLE_DC) + \ + (2 * IXGBE_ID_X540) + \ + IXGBE_HD) / 25 + 1) + \ + 2 * IXGBE_B2BT(_max_frame_tc)) /* Calculate 82599, 82598 delay value in bit times */ -#define IXGBE_DV(LINK, TC) (IXGBE_FILL_RATE * \ - (IXGBE_B2BT(LINK) + IXGBE_PFC_D + \ - (2 * IXGBE_CABLE_DC) + (2 * IXGBE_ID) + \ - IXGBE_HD + IXGBE_B2BT(TC))) +#define IXGBE_DV(_max_frame_link, _max_frame_tc) \ + ((36 * \ + (IXGBE_B2BT(_max_frame_link) + \ + IXGBE_PFC_D + \ + (2 * IXGBE_CABLE_DC) + \ + (2 * IXGBE_ID) + \ + IXGBE_HD) / 25 + 1) + \ + 2 * IXGBE_B2BT(_max_frame_tc)) /* Calculate low threshold delay values */ -#define IXGBE_LOW_DV_X540(TC) (2 * IXGBE_B2BT(TC) + \ - (IXGBE_FILL_RATE * IXGBE_PCI_DELAY)) -#define IXGBE_LOW_DV(TC) (2 * IXGBE_LOW_DV_X540(TC)) +#define IXGBE_LOW_DV_X540(_max_frame_tc) \ + (2 * IXGBE_B2BT(_max_frame_tc) + \ + (36 * IXGBE_PCI_DELAY / 25) + 1) +#define IXGBE_LOW_DV(_max_frame_tc) \ + (2 * IXGBE_LOW_DV_X540(_max_frame_tc)) /* Software ATR hash keys */ #define IXGBE_ATR_BUCKET_HASH_KEY 0x3DAD14E2 @@ -2711,6 +2748,8 @@ enum ixgbe_sfp_type { ixgbe_sfp_type_da_act_lmt_core1 = 8, ixgbe_sfp_type_1g_cu_core0 = 9, ixgbe_sfp_type_1g_cu_core1 = 10, + ixgbe_sfp_type_1g_sx_core0 = 11, + ixgbe_sfp_type_1g_sx_core1 = 12, ixgbe_sfp_type_not_present = 0xFFFE, ixgbe_sfp_type_unknown = 0xFFFF }; @@ -2760,6 +2799,7 @@ enum ixgbe_bus_speed { ixgbe_bus_speed_133 = 133, ixgbe_bus_speed_2500 = 2500, ixgbe_bus_speed_5000 = 5000, + ixgbe_bus_speed_8000 = 8000, ixgbe_bus_speed_reserved }; @@ -2796,7 +2836,7 @@ struct ixgbe_bus_info { /* Flow control parameters */ struct ixgbe_fc_info { u32 high_water[IXGBE_DCB_MAX_TRAFFIC_CLASS]; /* Flow Ctrl High-water */ - u32 low_water; /* Flow Control Low-water */ + u32 low_water[IXGBE_DCB_MAX_TRAFFIC_CLASS]; /* Flow Ctrl Low-water */ u16 pause_time; /* Flow Control Pause timer */ bool send_xon; /* Flow control send XON */ bool strict_ieee; /* Strict IEEE mode */ @@ -2955,6 +2995,7 @@ struct ixgbe_mac_operations { s32 (*clear_rar)(struct ixgbe_hw *, u32); s32 (*insert_mac_addr)(struct ixgbe_hw *, u8 *, u32); s32 (*set_vmdq)(struct ixgbe_hw *, u32, u32); + s32 (*set_vmdq_san_mac)(struct ixgbe_hw *, u32); s32 (*clear_vmdq)(struct ixgbe_hw *, u32, u32); s32 (*init_rx_addrs)(struct ixgbe_hw *); s32 (*update_uc_addr_list)(struct ixgbe_hw *, u8 *, u32, @@ -2971,7 +3012,7 @@ struct ixgbe_mac_operations { void (*set_vlan_anti_spoofing)(struct ixgbe_hw *, bool, int); /* Flow Control */ - s32 (*fc_enable)(struct ixgbe_hw *, s32); + s32 (*fc_enable)(struct ixgbe_hw *); /* Manageability interface */ s32 (*set_fw_drv_ver)(struct ixgbe_hw *, u8, u8, u8, u8); @@ -3027,11 +3068,11 @@ struct ixgbe_mac_info { u32 rx_pb_size; u32 max_tx_queues; u32 max_rx_queues; - u32 max_msix_vectors; - bool msix_vectors_from_pcie; u32 orig_autoc; - bool arc_subsystem_valid; + u8 san_mac_rar_index; u32 orig_autoc2; + u16 max_msix_vectors; + bool arc_subsystem_valid; bool orig_link_settings_stored; bool autotry_restart; u8 flags; @@ -3102,6 +3143,7 @@ struct ixgbe_hw { u8 revision_id; bool adapter_stopped; bool force_full_reset; + bool allow_unsupported_sfp; }; #define ixgbe_call_func(hw, func, params, error) \ @@ -3138,7 +3180,6 @@ struct ixgbe_hw { #define IXGBE_ERR_OVERTEMP -26 #define IXGBE_ERR_FC_NOT_NEGOTIATED -27 #define IXGBE_ERR_FC_NOT_SUPPORTED -28 -#define IXGBE_ERR_FLOW_CONTROL -29 #define IXGBE_ERR_SFP_SETUP_NOT_COMPLETE -30 #define IXGBE_ERR_PBA_SECTION -31 #define IXGBE_ERR_INVALID_ARGUMENT -32 diff --git a/sys/dev/ixgbe/ixgbe_vf.c b/sys/dev/ixgbe/ixgbe_vf.c index a3147aa7826..9e3dd7243b7 100644 --- a/sys/dev/ixgbe/ixgbe_vf.c +++ b/sys/dev/ixgbe/ixgbe_vf.c @@ -366,6 +366,7 @@ s32 ixgbe_set_vfta_vf(struct ixgbe_hw *hw, u32 vlan, u32 vind, bool vlan_on) { struct ixgbe_mbx_info *mbx = &hw->mbx; u32 msgbuf[2]; + s32 ret_val; UNREFERENCED_1PARAMETER(vind); msgbuf[0] = IXGBE_VF_SET_VLAN; @@ -373,7 +374,14 @@ s32 ixgbe_set_vfta_vf(struct ixgbe_hw *hw, u32 vlan, u32 vind, bool vlan_on) /* Setting the 8 bit field MSG INFO to TRUE indicates "add" */ msgbuf[0] |= vlan_on << IXGBE_VT_MSGINFO_SHIFT; - return mbx->ops.write_posted(hw, msgbuf, 2, 0); + ret_val = mbx->ops.write_posted(hw, msgbuf, 2, 0); + if (!ret_val) + ret_val = mbx->ops.read_posted(hw, msgbuf, 1, 0); + + if (!ret_val && (msgbuf[0] & IXGBE_VT_MSGTYPE_ACK)) + return IXGBE_SUCCESS; + + return ret_val | (msgbuf[0] & IXGBE_VT_MSGTYPE_NACK); } /** @@ -491,11 +499,17 @@ s32 ixgbe_check_mac_link_vf(struct ixgbe_hw *hw, ixgbe_link_speed *speed, else *link_up = FALSE; - if ((links_reg & IXGBE_LINKS_SPEED_10G_82599) == - IXGBE_LINKS_SPEED_10G_82599) + switch (links_reg & IXGBE_LINKS_SPEED_10G_82599) { + case IXGBE_LINKS_SPEED_10G_82599: *speed = IXGBE_LINK_SPEED_10GB_FULL; - else + break; + case IXGBE_LINKS_SPEED_1G_82599: *speed = IXGBE_LINK_SPEED_1GB_FULL; + break; + case IXGBE_LINKS_SPEED_100_82599: + *speed = IXGBE_LINK_SPEED_100_FULL; + break; + } return IXGBE_SUCCESS; } diff --git a/sys/dev/ixgbe/ixgbe_x540.c b/sys/dev/ixgbe/ixgbe_x540.c index cab014a42c0..0635cda0dfc 100755 --- a/sys/dev/ixgbe/ixgbe_x540.c +++ b/sys/dev/ixgbe/ixgbe_x540.c @@ -98,6 +98,7 @@ s32 ixgbe_init_ops_X540(struct ixgbe_hw *hw) /* RAR, Multicast, VLAN */ mac->ops.set_vmdq = &ixgbe_set_vmdq_generic; + mac->ops.set_vmdq_san_mac = &ixgbe_set_vmdq_san_mac_generic; mac->ops.clear_vmdq = &ixgbe_clear_vmdq_generic; mac->ops.insert_mac_addr = &ixgbe_insert_mac_addr_generic; mac->rar_highwater = 1; @@ -262,6 +263,9 @@ mac_reset_top: hw->mac.ops.set_rar(hw, hw->mac.num_rar_entries - 1, hw->mac.san_addr, 0, IXGBE_RAH_AV); + /* Save the SAN MAC RAR index */ + hw->mac.san_mac_rar_index = hw->mac.num_rar_entries - 1; + /* Reserve the last RAR for the SAN MAC address */ hw->mac.num_rar_entries--; } @@ -798,7 +802,7 @@ out: * @hw: pointer to hardware structure * @mask: Mask to specify which semaphore to release * - * Releases the SWFW semaphore throught the SW_FW_SYNC register + * Releases the SWFW semaphore through the SW_FW_SYNC register * for the specified function (CSR, PHY0, PHY1, EVM, Flash) **/ void ixgbe_release_swfw_sync_X540(struct ixgbe_hw *hw, u16 mask) diff --git a/sys/dev/ixgbe/ixv.c b/sys/dev/ixgbe/ixv.c index e0f91751fda..b429560e640 100644 --- a/sys/dev/ixgbe/ixv.c +++ b/sys/dev/ixgbe/ixv.c @@ -42,7 +42,7 @@ /********************************************************************* * Driver version *********************************************************************/ -char ixv_driver_version[] = "1.1.2"; +char ixv_driver_version[] = "1.1.4"; /********************************************************************* * PCI Device ID Table @@ -386,7 +386,7 @@ ixv_attach(device_t dev) /* Get Hardware Flow Control setting */ hw->fc.requested_mode = ixgbe_fc_full; hw->fc.pause_time = IXV_FC_PAUSE; - hw->fc.low_water = IXV_FC_LO; + hw->fc.low_water[0] = IXV_FC_LO; hw->fc.high_water[0] = IXV_FC_HI; hw->fc.send_xon = TRUE; @@ -2299,7 +2299,7 @@ ixv_initialize_transmit_units(struct adapter *adapter) adapter->num_tx_desc * sizeof(struct ixgbe_legacy_tx_desc)); txctrl = IXGBE_READ_REG(hw, IXGBE_VFDCA_TXCTRL(i)); - txctrl &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN; + txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN; IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(i), txctrl); break; } @@ -4004,7 +4004,7 @@ ixv_set_flowcntl(SYSCTL_HANDLER_ARGS) adapter->hw.fc.requested_mode = ixgbe_fc_none; } - ixgbe_fc_enable(&adapter->hw, 0); + ixgbe_fc_enable(&adapter->hw); return error; } diff --git a/sys/dev/jme/if_jme.c b/sys/dev/jme/if_jme.c index eda18079325..7f0f9174f8a 100644 --- a/sys/dev/jme/if_jme.c +++ b/sys/dev/jme/if_jme.c @@ -1661,7 +1661,7 @@ jme_resume(device_t dev) sc = device_get_softc(dev); JME_LOCK(sc); - if (pci_find_cap(sc->jme_dev, PCIY_PMG, &pmc) != 0) { + if (pci_find_cap(sc->jme_dev, PCIY_PMG, &pmc) == 0) { pmstat = pci_read_config(sc->jme_dev, pmc + PCIR_POWER_STATUS, 2); /* Disable PME clear PME status. */ diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index 8ff52a9c883..4d4c22c9765 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -1080,6 +1080,64 @@ mddestroy(struct md_s *sc, struct thread *td) return (0); } +static int +mdresize(struct md_s *sc, struct md_ioctl *mdio) +{ + int error, res; + vm_pindex_t oldpages, newpages; + + switch (sc->type) { + case MD_VNODE: + break; + case MD_SWAP: + if (mdio->md_mediasize == 0 || + (mdio->md_mediasize % PAGE_SIZE) != 0) + return (EDOM); + oldpages = OFF_TO_IDX(round_page(sc->mediasize)); + newpages = OFF_TO_IDX(round_page(mdio->md_mediasize)); + if (newpages < oldpages) { + VM_OBJECT_LOCK(sc->object); + vm_object_page_remove(sc->object, newpages, 0, 0); + swap_pager_freespace(sc->object, newpages, + oldpages - newpages); + swap_release_by_cred(IDX_TO_OFF(oldpages - + newpages), sc->cred); + sc->object->charge = IDX_TO_OFF(newpages); + sc->object->size = newpages; + VM_OBJECT_UNLOCK(sc->object); + } else if (newpages > oldpages) { + res = swap_reserve_by_cred(IDX_TO_OFF(newpages - + oldpages), sc->cred); + if (!res) + return (ENOMEM); + if ((mdio->md_options & MD_RESERVE) || + (sc->flags & MD_RESERVE)) { + error = swap_pager_reserve(sc->object, + oldpages, newpages - oldpages); + if (error < 0) { + swap_release_by_cred( + IDX_TO_OFF(newpages - oldpages), + sc->cred); + return (EDOM); + } + } + VM_OBJECT_LOCK(sc->object); + sc->object->charge = IDX_TO_OFF(newpages); + sc->object->size = newpages; + VM_OBJECT_UNLOCK(sc->object); + } + break; + default: + return (EOPNOTSUPP); + } + + sc->mediasize = mdio->md_mediasize; + g_topology_lock(); + g_resize_provider(sc->pp, sc->mediasize); + g_topology_unlock(); + return (0); +} + static int mdcreate_swap(struct md_s *sc, struct md_ioctl *mdio, struct thread *td) { @@ -1108,7 +1166,7 @@ mdcreate_swap(struct md_s *sc, struct md_ioctl *mdio, struct thread *td) VM_PROT_DEFAULT, 0, td->td_ucred); if (sc->object == NULL) return (ENOMEM); - sc->flags = mdio->md_options & MD_FORCE; + sc->flags = mdio->md_options & (MD_FORCE | MD_RESERVE); if (mdio->md_options & MD_RESERVE) { if (swap_pager_reserve(sc->object, 0, npage) < 0) { error = EDOM; @@ -1217,6 +1275,18 @@ xmdctlioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread !(mdio->md_options & MD_FORCE)) return (EBUSY); return (mddestroy(sc, td)); + case MDIOCRESIZE: + if ((mdio->md_options & ~(MD_FORCE | MD_RESERVE)) != 0) + return (EINVAL); + + sc = mdfind(mdio->md_unit); + if (sc == NULL) + return (ENOENT); + if (mdio->md_mediasize < sc->mediasize && + !(sc->flags & MD_FORCE) && + !(mdio->md_options & MD_FORCE)) + return (EBUSY); + return (mdresize(sc, mdio)); case MDIOCQUERY: sc = mdfind(mdio->md_unit); if (sc == NULL) diff --git a/sys/dev/mfi/mfi.c b/sys/dev/mfi/mfi.c index 60ec8225e76..2f99bc89a80 100644 --- a/sys/dev/mfi/mfi.c +++ b/sys/dev/mfi/mfi.c @@ -73,6 +73,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -90,8 +91,6 @@ static int mfi_get_controller_info(struct mfi_softc *); static int mfi_get_log_state(struct mfi_softc *, struct mfi_evt_log_state **); static int mfi_parse_entries(struct mfi_softc *, int, int); -static int mfi_dcmd_command(struct mfi_softc *, struct mfi_command **, - uint32_t, void **, size_t); static void mfi_data_cb(void *, bus_dma_segment_t *, int, int); static void mfi_startup(void *arg); static void mfi_intr(void *arg); @@ -377,6 +376,7 @@ mfi_attach(struct mfi_softc *sc) TAILQ_INIT(&sc->mfi_syspd_tqh); TAILQ_INIT(&sc->mfi_evt_queue); TASK_INIT(&sc->mfi_evt_task, 0, mfi_handle_evt, sc); + TASK_INIT(&sc->mfi_map_sync_task, 0, mfi_handle_map_sync, sc); TAILQ_INIT(&sc->mfi_aen_pids); TAILQ_INIT(&sc->mfi_cam_ccbq); @@ -696,7 +696,6 @@ mfi_attach(struct mfi_softc *sc) return (EINVAL); } sc->mfi_enable_intr(sc); - sc->map_id = 0; } else { if ((error = mfi_comms_init(sc)) != 0) return (error); @@ -762,6 +761,10 @@ mfi_attach(struct mfi_softc *sc) callout_reset(&sc->mfi_watchdog_callout, MFI_CMD_TIMEOUT * hz, mfi_timeout, sc); + if (sc->mfi_flags & MFI_FLAGS_TBOLT) { + mfi_tbolt_sync_map_info(sc); + } + return (0); } @@ -845,7 +848,7 @@ mfi_release_command(struct mfi_command *cm) mfi_enqueue_free(cm); } -static int +int mfi_dcmd_command(struct mfi_softc *sc, struct mfi_command **cmp, uint32_t opcode, void **bufp, size_t bufsize) { @@ -1286,8 +1289,8 @@ mfi_shutdown(struct mfi_softc *sc) if (sc->mfi_aen_cm != NULL) mfi_abort(sc, sc->mfi_aen_cm); - if (sc->map_update_cmd != NULL) - mfi_abort(sc, sc->map_update_cmd); + if (sc->mfi_map_sync_cm != NULL) + mfi_abort(sc, sc->mfi_map_sync_cm); dcmd = &cm->cm_frame->dcmd; dcmd->header.flags = MFI_FRAME_DIR_NONE; @@ -1317,7 +1320,7 @@ mfi_syspdprobe(struct mfi_softc *sc) /* Add SYSTEM PD's */ error = mfi_dcmd_command(sc, &cm, MFI_DCMD_PD_LIST_QUERY, (void **)&pdlist, sizeof(*pdlist)); - if (error){ + if (error) { device_printf(sc->mfi_dev, "Error while forming SYSTEM PD list\n"); goto out; @@ -1664,9 +1667,9 @@ mfi_aen_complete(struct mfi_command *cm) if (sc->mfi_aen_cm == NULL) return; - if (sc->mfi_aen_cm->cm_aen_abort || + if (sc->cm_aen_abort || hdr->cmd_status == MFI_STAT_INVALID_STATUS) { - sc->mfi_aen_cm->cm_aen_abort = 0; + sc->cm_aen_abort = 0; aborted = 1; } else { sc->mfi_aen_triggered = 1; @@ -1956,6 +1959,7 @@ mfi_add_sys_pd_complete(struct mfi_command *cm) mtx_unlock(&Giant); mtx_lock(&sc->mfi_io_lock); } + static struct mfi_command * mfi_bio_command(struct mfi_softc *sc) { @@ -1963,7 +1967,7 @@ mfi_bio_command(struct mfi_softc *sc) struct mfi_command *cm = NULL; /*reserving two commands to avoid starvation for IOCTL*/ - if (sc->mfi_qstat[MFIQ_FREE].q_length < 2){ + if (sc->mfi_qstat[MFIQ_FREE].q_length < 2) { return (NULL); } if ((bio = mfi_dequeue_bio(sc)) == NULL) { @@ -2385,7 +2389,9 @@ mfi_abort(struct mfi_softc *sc, struct mfi_command *cm_abort) cm->cm_flags = MFI_CMD_POLLED; if (sc->mfi_aen_cm) - sc->mfi_aen_cm->cm_aen_abort = 1; + sc->cm_aen_abort = 1; + if (sc->mfi_map_sync_cm) + sc->cm_map_abort = 1; mfi_mapcmd(sc, cm); mfi_release_command(cm); @@ -2394,6 +2400,11 @@ mfi_abort(struct mfi_softc *sc, struct mfi_command *cm_abort) 5 * hz); i++; } + while (i < 5 && sc->mfi_map_sync_cm != NULL) { + msleep(&sc->mfi_map_sync_cm, &sc->mfi_io_lock, 0, "mfiabort", + 5 * hz); + i++; + } return (0); } @@ -2685,12 +2696,12 @@ static int mfi_check_for_sscd(struct mfi_softc *sc, struct mfi_command *cm) int error = 0; if ((cm->cm_frame->dcmd.opcode == MFI_DCMD_CFG_ADD) && - (conf_data->ld[0].params.isSSCD == 1)){ + (conf_data->ld[0].params.isSSCD == 1)) { error = 1; } else if (cm->cm_frame->dcmd.opcode == MFI_DCMD_LD_DELETE) { error = mfi_dcmd_command (sc, &ld_cm, MFI_DCMD_LD_GET_INFO, (void **)&ld_info, sizeof(*ld_info)); - if (error){ + if (error) { device_printf(sc->mfi_dev, "Failed to allocate" "MFI_DCMD_LD_GET_INFO %d", error); if (ld_info) @@ -2700,7 +2711,7 @@ static int mfi_check_for_sscd(struct mfi_softc *sc, struct mfi_command *cm) ld_cm->cm_flags = MFI_CMD_DATAIN; ld_cm->cm_frame->dcmd.mbox[0]= cm->cm_frame->dcmd.mbox[0]; ld_cm->cm_frame->header.target_id = cm->cm_frame->dcmd.mbox[0]; - if (mfi_wait_command(sc, ld_cm) != 0){ + if (mfi_wait_command(sc, ld_cm) != 0) { device_printf(sc->mfi_dev, "failed to get log drv\n"); mfi_release_command(ld_cm); free(ld_info, M_MFIBUF); @@ -2822,10 +2833,9 @@ mfi_user_command(struct mfi_softc *sc, struct mfi_ioc_passthru *ioc) if (ioc->buf_size > 0) { - ioc_buf = malloc(ioc->buf_size, M_MFIBUF, M_WAITOK); - if (ioc_buf == NULL) { + if (ioc->buf_size > 1024 * 1024) return (ENOMEM); - } + ioc_buf = malloc(ioc->buf_size, M_MFIBUF, M_WAITOK); error = copyin(ioc->buf, ioc_buf, ioc->buf_size); if (error) { device_printf(sc->mfi_dev, "failed to copyin\n"); @@ -3234,6 +3244,10 @@ out: } #ifdef COMPAT_FREEBSD32 case MFIIO_PASSTHRU32: + if (!SV_CURPROC_FLAG(SV_ILP32)) { + error = ENOTTY; + break; + } iop_swab.ioc_frame = iop32->ioc_frame; iop_swab.buf_size = iop32->buf_size; iop_swab.buf = PTRIN(iop32->buf); @@ -3249,7 +3263,7 @@ out: break; default: device_printf(sc->mfi_dev, "IOCTL 0x%lx not handled\n", cmd); - error = ENOENT; + error = ENOTTY; break; } @@ -3549,9 +3563,9 @@ mfi_timeout(void *data) } mtx_lock(&sc->mfi_io_lock); TAILQ_FOREACH(cm, &sc->mfi_busy, cm_link) { - if (sc->mfi_aen_cm == cm) + if (sc->mfi_aen_cm == cm || sc->mfi_map_sync_cm == cm) continue; - if ((sc->mfi_aen_cm != cm) && (cm->cm_timestamp < deadline)) { + if (cm->cm_timestamp < deadline) { if (sc->adpreset != 0 && sc->issuepend_done == 0) { cm->cm_timestamp = time_uptime; } else { diff --git a/sys/dev/mfi/mfi_cam.c b/sys/dev/mfi/mfi_cam.c index f9bef0c0a22..eec6986085f 100644 --- a/sys/dev/mfi/mfi_cam.c +++ b/sys/dev/mfi/mfi_cam.c @@ -293,8 +293,8 @@ mfip_start(void *data) pt->header.data_len = csio->dxfer_len; pt->header.sense_len = MFI_SENSE_LEN; pt->header.cdb_len = csio->cdb_len; - pt->sense_addr_lo = cm->cm_sense_busaddr; - pt->sense_addr_hi = 0; + pt->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr; + pt->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); if (ccbh->flags & CAM_CDB_POINTER) bcopy(csio->cdb_io.cdb_ptr, &pt->cdb[0], csio->cdb_len); else diff --git a/sys/dev/mfi/mfi_debug.c b/sys/dev/mfi/mfi_debug.c index d6f4c9ad932..2e66e19d1fd 100644 --- a/sys/dev/mfi/mfi_debug.c +++ b/sys/dev/mfi/mfi_debug.c @@ -172,6 +172,9 @@ mfi_print_dcmd(struct mfi_softc *sc, device_t dev, struct mfi_command *cm) case MFI_DCMD_CLUSTER_RESET_LD: opcode = "CLUSTER_RESET_LD"; break; + case MFI_DCMD_LD_MAP_GET_INFO: + opcode = "LD_MAP_GET_INFO"; + break; default: opcode = "UNKNOWN"; break; diff --git a/sys/dev/mfi/mfi_disk.c b/sys/dev/mfi/mfi_disk.c index 15c9d769157..fc43e6721c5 100644 --- a/sys/dev/mfi/mfi_disk.c +++ b/sys/dev/mfi/mfi_disk.c @@ -130,10 +130,17 @@ mfi_disk_attach(device_t dev) state = "unknown"; break; } - device_printf(dev, "%juMB (%ju sectors) RAID volume '%s' is %s\n", - sectors / (1024 * 1024 / secsize), sectors, - ld_info->ld_config.properties.name, - state); + + if ( strlen(ld_info->ld_config.properties.name) == 0 ) { + device_printf(dev, + "%juMB (%ju sectors) RAID volume (no label) is %s\n", + sectors / (1024 * 1024 / secsize), sectors, state); + } else { + device_printf(dev, + "%juMB (%ju sectors) RAID volume '%s' is %s\n", + sectors / (1024 * 1024 / secsize), sectors, + ld_info->ld_config.properties.name, state); + } sc->ld_disk = disk_alloc(); sc->ld_disk->d_drv1 = sc; @@ -256,17 +263,17 @@ mfi_disk_strategy(struct bio *bio) return; } - if (controller->adpreset){ + if (controller->adpreset) { bio->bio_error = EBUSY; return; } - if (controller->hw_crit_error){ + if (controller->hw_crit_error) { bio->bio_error = EBUSY; return; } - if (controller->issuepend_done == 0){ + if (controller->issuepend_done == 0) { bio->bio_error = EBUSY; return; } diff --git a/sys/dev/mfi/mfi_tbolt.c b/sys/dev/mfi/mfi_tbolt.c index d63d0d3a013..2555f13fbe7 100644 --- a/sys/dev/mfi/mfi_tbolt.c +++ b/sys/dev/mfi/mfi_tbolt.c @@ -82,7 +82,8 @@ map_tbolt_cmd_status(struct mfi_command *mfi_cmd, uint8_t status, static void mfi_issue_pending_cmds_again (struct mfi_softc *sc); static void mfi_kill_hba (struct mfi_softc *sc); static void mfi_process_fw_state_chg_isr(void *arg); -uint8_t mfi_tbolt_get_map_info(struct mfi_softc *sc); +static void mfi_sync_map_complete(struct mfi_command *); +static void mfi_queue_map_sync(struct mfi_softc *sc); #define MFI_FUSION_ENABLE_INTERRUPT_MASK (0x00000008) @@ -140,11 +141,12 @@ mfi_tbolt_issue_cmd_ppc(struct mfi_softc *sc, bus_addr_t bus_add, MFI_WRITE4(sc, MFI_IQPH, (uint32_t)((uint64_t)bus_add >> 32)); } -/** +/* * mfi_tbolt_adp_reset - For controller reset * @regs: MFI register set */ -int mfi_tbolt_adp_reset(struct mfi_softc *sc) +int +mfi_tbolt_adp_reset(struct mfi_softc *sc) { int retry = 0, i = 0; int HostDiag; @@ -192,12 +194,10 @@ int mfi_tbolt_adp_reset(struct mfi_softc *sc) } /* - ******************************************************************************************* - * Description: - * This routine initialize Thunderbolt specific device information - ******************************************************************************************* + * This routine initialize Thunderbolt specific device information */ -void mfi_tbolt_init_globals(struct mfi_softc *sc) +void +mfi_tbolt_init_globals(struct mfi_softc *sc) { /* Initialize single reply size and Message size */ sc->reply_size = MEGASAS_THUNDERBOLT_REPLY_SIZE; @@ -239,16 +239,12 @@ void mfi_tbolt_init_globals(struct mfi_softc *sc) } /* - **************************************************************************** - * Description: - * This function calculates the memory requirement for Thunderbolt - * controller - * Return Value: - * Total required memory in bytes - **************************************************************************** + * This function calculates the memory requirement for Thunderbolt + * controller, returns the total required memory in bytes */ -uint32_t mfi_tbolt_get_memory_requirement(struct mfi_softc *sc) +uint32_t +mfi_tbolt_get_memory_requirement(struct mfi_softc *sc) { uint32_t size; size = MEGASAS_THUNDERBOLT_MSG_ALLIGNMENT; /* for Alignment */ @@ -260,7 +256,6 @@ uint32_t mfi_tbolt_get_memory_requirement(struct mfi_softc *sc) } /* - **************************************************************************** * Description: * This function will prepare message pools for the Thunderbolt controller * Arguments: @@ -269,9 +264,9 @@ uint32_t mfi_tbolt_get_memory_requirement(struct mfi_softc *sc) * Return Value: * TRUE if successful * FALSE if failed - **************************************************************************** */ -int mfi_tbolt_init_desc_pool(struct mfi_softc *sc, uint8_t* mem_location, +int +mfi_tbolt_init_desc_pool(struct mfi_softc *sc, uint8_t* mem_location, uint32_t tbolt_contg_length) { uint32_t offset = 0; @@ -328,10 +323,7 @@ int mfi_tbolt_init_desc_pool(struct mfi_softc *sc, uint8_t* mem_location, } /* - **************************************************************************** - * Description: - * This routine prepare and issue INIT2 frame to the Firmware - **************************************************************************** + * This routine prepare and issue INIT2 frame to the Firmware */ int @@ -442,7 +434,8 @@ mfi_tbolt_init_MFI_queue(struct mfi_softc *sc) } -int mfi_tbolt_alloc_cmd(struct mfi_softc *sc) +int +mfi_tbolt_alloc_cmd(struct mfi_softc *sc) { struct mfi_cmd_tbolt *cmd; bus_addr_t io_req_base_phys; @@ -515,7 +508,8 @@ int mfi_tbolt_alloc_cmd(struct mfi_softc *sc) return 0; } -int mfi_tbolt_reset(struct mfi_softc *sc) +int +mfi_tbolt_reset(struct mfi_softc *sc) { uint32_t fw_state; @@ -550,7 +544,8 @@ int mfi_tbolt_reset(struct mfi_softc *sc) /* * mfi_intr_tbolt - isr entry point */ -void mfi_intr_tbolt(void *arg) +void +mfi_intr_tbolt(void *arg) { struct mfi_softc *sc = (struct mfi_softc *)arg; @@ -568,7 +563,7 @@ void mfi_intr_tbolt(void *arg) return; } -/** +/* * map_cmd_status - Maps FW cmd status to OS cmd status * @cmd : Pointer to cmd * @status : status of cmd returned by FW @@ -581,7 +576,6 @@ map_tbolt_cmd_status(struct mfi_command *mfi_cmd, uint8_t status, { switch (status) { - case MFI_STAT_OK: mfi_cmd->cm_frame->header.cmd_status = 0; mfi_cmd->cm_frame->dcmd.header.cmd_status = 0; @@ -614,7 +608,7 @@ map_tbolt_cmd_status(struct mfi_command *mfi_cmd, uint8_t status, } } -/** +/* * mfi_tbolt_return_cmd - Return a cmd to free command pool * @instance: Adapter soft state * @cmd: Command packet to be returned to free command pool @@ -627,10 +621,11 @@ mfi_tbolt_return_cmd(struct mfi_softc *sc, struct mfi_cmd_tbolt *cmd) TAILQ_INSERT_TAIL(&sc->mfi_cmd_tbolt_tqh, cmd, next); } -void mfi_tbolt_complete_cmd(struct mfi_softc *sc) +void +mfi_tbolt_complete_cmd(struct mfi_softc *sc) { struct mfi_mpi2_reply_header *desc, *reply_desc; - struct mfi_command *cmd_mfi; /* For MFA Cmds */ + struct mfi_command *cmd_mfi, *cmd_mfi_check; /* For MFA Cmds */ struct mfi_cmd_tbolt *cmd_tbolt; uint16_t smid; uint8_t reply_descript_type; @@ -657,7 +652,6 @@ void mfi_tbolt_complete_cmd(struct mfi_softc *sc) /* Read Reply descriptor */ while ((val.u.low != 0xFFFFFFFF) && (val.u.high != 0xFFFFFFFF)) { - smid = reply_desc->SMID; if (!smid || smid > sc->mfi_max_fw_cmds + 1) { device_printf(sc->mfi_dev, "smid is %x. Cannot " @@ -669,66 +663,20 @@ void mfi_tbolt_complete_cmd(struct mfi_softc *sc) cmd_mfi = &sc->mfi_commands[cmd_tbolt->sync_cmd_idx]; scsi_io_req = cmd_tbolt->io_request; - /* Check if internal commands */ status = cmd_mfi->cm_frame->dcmd.header.cmd_status; extStatus = cmd_mfi->cm_frame->dcmd.header.scsi_status; + map_tbolt_cmd_status(cmd_mfi, status, extStatus); - switch (scsi_io_req->Function) { - case MPI2_FUNCTION_LD_IO_REQUEST: - /* Regular Path IO. */ - /* Map the Fw Error Status. */ - map_tbolt_cmd_status(cmd_mfi, status, - extStatus); - if ((cmd_mfi->cm_frame->dcmd.opcode - == MFI_DCMD_LD_MAP_GET_INFO) - && (cmd_mfi->cm_frame->dcmd.mbox[1] == 1)) { - if (cmd_mfi->cm_frame->header.cmd_status - != 0) - device_printf(sc->mfi_dev, - "map sync failed\n"); - else { - sc->map_id++; - device_printf(sc->mfi_dev, - "map sync completed\n"); - mfi_release_command(cmd_mfi); - } - } - if ((cmd_mfi->cm_flags & MFI_ON_MFIQ_BUSY) - == MFI_ON_MFIQ_BUSY - && (cmd_mfi->cm_flags & MFI_CMD_POLLED) == 0) { - /* BHARAT poll workaround */ + /* remove command from busy queue if not polled */ + TAILQ_FOREACH(cmd_mfi_check, &sc->mfi_busy, cm_link) { + if (cmd_mfi_check == cmd_mfi) { mfi_remove_busy(cmd_mfi); - cmd_mfi->cm_error = 0; - mfi_complete(sc, cmd_mfi); + break; } - mfi_tbolt_return_cmd(sc, cmd_tbolt); - break; - case MPI2_FUNCTION_PASSTHRU_IO_REQUEST: - map_tbolt_cmd_status(cmd_mfi, status, extStatus); - if ((cmd_mfi->cm_frame->dcmd.opcode - == MFI_DCMD_LD_MAP_GET_INFO) - && (cmd_mfi->cm_frame->dcmd.mbox[1] == 1)) { - if (cmd_mfi->cm_frame->header.cmd_status != 0) - device_printf(sc->mfi_dev, - "map sync failed\n"); - else { - sc->map_id++; - device_printf(sc->mfi_dev, - "map sync completed\n"); - mfi_release_command(cmd_mfi); - } - } - if ((cmd_mfi->cm_flags & MFI_ON_MFIQ_BUSY) - == MFI_ON_MFIQ_BUSY - && (cmd_mfi->cm_flags & MFI_CMD_POLLED) == 0) { - /* BHARAT poll workaround */ - mfi_remove_busy(cmd_mfi); - cmd_mfi->cm_error = 0; - mfi_complete(sc, cmd_mfi); - } - mfi_tbolt_return_cmd(sc, cmd_tbolt); - break; } + cmd_mfi->cm_error = 0; + mfi_complete(sc, cmd_mfi); + mfi_tbolt_return_cmd(sc, cmd_tbolt); sc->last_reply_idx++; if (sc->last_reply_idx >= sc->mfi_max_fw_cmds) { @@ -763,15 +711,15 @@ void mfi_tbolt_complete_cmd(struct mfi_softc *sc) return; } -/** +/* * mfi_get_cmd - Get a command from the free pool * @instance: Adapter soft state * * Returns a free command from the pool */ -struct mfi_cmd_tbolt *mfi_tbolt_get_cmd(struct mfi_softc - *sc) +struct mfi_cmd_tbolt * +mfi_tbolt_get_cmd(struct mfi_softc *sc) { struct mfi_cmd_tbolt *cmd = NULL; @@ -876,7 +824,8 @@ mfi_tbolt_build_ldio(struct mfi_softc *sc, struct mfi_command *mfi_cmd, * MFI_SECTOR_LEN; } -int mfi_tbolt_is_ldio(struct mfi_command *mfi_cmd) +int +mfi_tbolt_is_ldio(struct mfi_command *mfi_cmd) { if (mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_READ || mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_WRITE) @@ -886,7 +835,8 @@ int mfi_tbolt_is_ldio(struct mfi_command *mfi_cmd) } int -mfi_tbolt_build_io(struct mfi_softc *sc, struct mfi_command *mfi_cmd, struct mfi_cmd_tbolt *cmd) +mfi_tbolt_build_io(struct mfi_softc *sc, struct mfi_command *mfi_cmd, + struct mfi_cmd_tbolt *cmd) { uint32_t device_id; uint32_t sge_count; @@ -949,7 +899,7 @@ mfi_tbolt_build_cdb(struct mfi_softc *sc, struct mfi_command *mfi_cmd, lba_lo = mfi_cmd->cm_frame->io.lba_lo; lba_hi = mfi_cmd->cm_frame->io.lba_hi; - if ((num_lba <= 0xFF) && (lba_lo <= 0x1FFFFF)) { + if (lba_hi == 0 && (num_lba <= 0xFF) && (lba_lo <= 0x1FFFFF)) { if (mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_WRITE) /* Read 6 or Write 6 */ cdb[0] = (uint8_t) (0x0A); @@ -962,7 +912,7 @@ mfi_tbolt_build_cdb(struct mfi_softc *sc, struct mfi_command *mfi_cmd, cdb[1] = (uint8_t) ((lba_lo >> 16) & 0x1F); cdb_len = 6; } - else if ((num_lba <= 0xFFFF) && (lba_lo <= 0xFFFFFFFF)) { + else if (lba_hi == 0 && (num_lba <= 0xFFFF) && (lba_lo <= 0xFFFFFFFF)) { if (mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_WRITE) /* Read 10 or Write 10 */ cdb[0] = (uint8_t) (0x2A); @@ -975,8 +925,7 @@ mfi_tbolt_build_cdb(struct mfi_softc *sc, struct mfi_command *mfi_cmd, cdb[3] = (uint8_t) (lba_lo >> 16); cdb[2] = (uint8_t) (lba_lo >> 24); cdb_len = 10; - } - else if ((num_lba > 0xFFFF) && (lba_hi == 0)) { + } else if ((num_lba > 0xFFFF) && (lba_hi == 0)) { if (mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_WRITE) /* Read 12 or Write 12 */ cdb[0] = (uint8_t) (0xAA); @@ -1129,7 +1078,7 @@ mfi_tbolt_build_mpt_cmd(struct mfi_softc *sc, struct mfi_command *cmd) if (!req_desc) return NULL; - bzero(req_desc, sizeof(req_desc)); + bzero(req_desc, sizeof(*req_desc)); req_desc->header.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO << MFI_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); req_desc->header.SMID = index; @@ -1152,8 +1101,8 @@ mfi_tbolt_send_frame(struct mfi_softc *sc, struct mfi_command *cm) cm->cm_timestamp = time_uptime; mfi_enqueue_busy(cm); } - else { - hdr->cmd_status = 0xff; + else { /* still get interrupts for it */ + hdr->cmd_status = MFI_STAT_INVALID_STATUS; hdr->flags |= MFI_FRAME_DONT_POST_IN_REPLY_QUEUE; } @@ -1189,22 +1138,23 @@ mfi_tbolt_send_frame(struct mfi_softc *sc, struct mfi_command *cm) return 0; /* This is a polled command, so busy-wait for it to complete. */ - while (hdr->cmd_status == 0xff) { + while (hdr->cmd_status == MFI_STAT_INVALID_STATUS) { DELAY(1000); tm -= 1; if (tm <= 0) - break; + break; } - if (hdr->cmd_status == 0xff) { + if (hdr->cmd_status == MFI_STAT_INVALID_STATUS) { device_printf(sc->mfi_dev, "Frame %p timed out " - "command 0x%X\n", hdr, cm->cm_frame->dcmd.opcode); + "command 0x%X\n", hdr, cm->cm_frame->dcmd.opcode); return (ETIMEDOUT); } return 0; } -static void mfi_issue_pending_cmds_again (struct mfi_softc *sc) +static void +mfi_issue_pending_cmds_again (struct mfi_softc *sc) { struct mfi_command *cm, *tmp; @@ -1249,7 +1199,8 @@ static void mfi_issue_pending_cmds_again (struct mfi_softc *sc) mfi_startio(sc); } -static void mfi_kill_hba (struct mfi_softc *sc) +static void +mfi_kill_hba (struct mfi_softc *sc) { if (sc->mfi_flags & MFI_FLAGS_TBOLT) MFI_WRITE4 (sc, 0x00,MFI_STOP_ADP); @@ -1257,7 +1208,8 @@ static void mfi_kill_hba (struct mfi_softc *sc) MFI_WRITE4 (sc, MFI_IDB,MFI_STOP_ADP); } -static void mfi_process_fw_state_chg_isr(void *arg) +static void +mfi_process_fw_state_chg_isr(void *arg) { struct mfi_softc *sc= (struct mfi_softc *)arg; struct mfi_cmd_tbolt *cmd; @@ -1308,9 +1260,9 @@ static void mfi_process_fw_state_chg_isr(void *arg) mfi_release_command(sc->mfi_aen_cm); sc->mfi_aen_cm = NULL; } - if (sc->map_update_cmd) { - mfi_release_command(sc->map_update_cmd); - sc->map_update_cmd = NULL; + if (sc->mfi_map_sync_cm) { + mfi_release_command(sc->mfi_map_sync_cm); + sc->mfi_map_sync_cm = NULL; } mfi_issue_pending_cmds_again(sc); @@ -1337,3 +1289,178 @@ static void mfi_process_fw_state_chg_isr(void *arg) } mtx_unlock(&sc->mfi_io_lock); } + +/* + * The ThunderBolt HW has an option for the driver to directly + * access the underlying disks and operate on the RAID. To + * do this there needs to be a capability to keep the RAID controller + * and driver in sync. The FreeBSD driver does not take advantage + * of this feature since it adds a lot of complexity and slows down + * performance. Performance is gained by using the controller's + * cache etc. + * + * Even though this driver doesn't access the disks directly, an + * AEN like command is used to inform the RAID firmware to "sync" + * with all LD's via the MFI_DCMD_LD_MAP_GET_INFO command. This + * command in write mode will return when the RAID firmware has + * detected a change to the RAID state. Examples of this type + * of change are removing a disk. Once the command returns then + * the driver needs to acknowledge this and "sync" all LD's again. + * This repeats until we shutdown. Then we need to cancel this + * pending command. + * + * If this is not done right the RAID firmware will not remove a + * pulled drive and the RAID won't go degraded etc. Effectively, + * stopping any RAID mangement to functions. + * + * Doing another LD sync, requires the use of an event since the + * driver needs to do a mfi_wait_command and can't do that in an + * interrupt thread. + * + * The driver could get the RAID state via the MFI_DCMD_LD_MAP_GET_INFO + * That requires a bunch of structure and it is simplier to just do + * the MFI_DCMD_LD_GET_LIST versus walking the RAID map. + */ + +void +mfi_tbolt_sync_map_info(struct mfi_softc *sc) +{ + int error = 0, i; + struct mfi_command *cmd; + struct mfi_dcmd_frame *dcmd; + uint32_t context = 0; + union mfi_ld_ref *ld_sync; + size_t ld_size; + struct mfi_frame_header *hdr; + struct mfi_command *cm = NULL; + struct mfi_ld_list *list = NULL; + + if (sc->mfi_map_sync_cm != NULL || sc->cm_map_abort) + return; + + mtx_lock(&sc->mfi_io_lock); + error = mfi_dcmd_command(sc, &cm, MFI_DCMD_LD_GET_LIST, + (void **)&list, sizeof(*list)); + if (error) + goto out; + + cm->cm_flags = MFI_CMD_POLLED | MFI_CMD_DATAIN; + if (mfi_wait_command(sc, cm) != 0) { + device_printf(sc->mfi_dev, "Failed to get device listing\n"); + goto out; + } + + hdr = &cm->cm_frame->header; + if (hdr->cmd_status != MFI_STAT_OK) { + device_printf(sc->mfi_dev, "MFI_DCMD_LD_GET_LIST failed %x\n", + hdr->cmd_status); + goto out; + } + + ld_size = sizeof(*ld_sync) * list->ld_count; + mtx_unlock(&sc->mfi_io_lock); + ld_sync = (union mfi_ld_ref *) malloc(ld_size, M_MFIBUF, + M_WAITOK | M_ZERO); + if (ld_sync == NULL) { + device_printf(sc->mfi_dev, "Failed to allocate sync\n"); + goto out; + } + for (i = 0; i < list->ld_count; i++) { + ld_sync[i].ref = list->ld_list[i].ld.ref; + } + + mtx_lock(&sc->mfi_io_lock); + if ((cmd = mfi_dequeue_free(sc)) == NULL) { + device_printf(sc->mfi_dev, "Failed to get command\n"); + free(ld_sync, M_MFIBUF); + goto out; + } + + context = cmd->cm_frame->header.context; + bzero(cmd->cm_frame, sizeof(union mfi_frame)); + cmd->cm_frame->header.context = context; + + dcmd = &cmd->cm_frame->dcmd; + bzero(dcmd->mbox, MFI_MBOX_SIZE); + dcmd->header.cmd = MFI_CMD_DCMD; + dcmd->header.flags = MFI_FRAME_DIR_WRITE; + dcmd->header.timeout = 0; + dcmd->header.data_len = ld_size; + dcmd->header.scsi_status = 0; + dcmd->opcode = MFI_DCMD_LD_MAP_GET_INFO; + cmd->cm_sg = &dcmd->sgl; + cmd->cm_total_frame_size = MFI_DCMD_FRAME_SIZE; + cmd->cm_data = ld_sync; + cmd->cm_private = ld_sync; + + cmd->cm_len = ld_size; + cmd->cm_complete = mfi_sync_map_complete; + sc->mfi_map_sync_cm = cmd; + + cmd->cm_flags = MFI_CMD_DATAOUT; + cmd->cm_frame->dcmd.mbox[0] = list->ld_count; + cmd->cm_frame->dcmd.mbox[1] = MFI_DCMD_MBOX_PEND_FLAG; + + if ((error = mfi_mapcmd(sc, cmd)) != 0) { + device_printf(sc->mfi_dev, "failed to send map sync\n"); + free(ld_sync, M_MFIBUF); + sc->mfi_map_sync_cm = NULL; + mfi_requeue_ready(cmd); + goto out; + } + +out: + if (list) + free(list, M_MFIBUF); + if (cm) + mfi_release_command(cm); + mtx_unlock(&sc->mfi_io_lock); +} + +static void +mfi_sync_map_complete(struct mfi_command *cm) +{ + struct mfi_frame_header *hdr; + struct mfi_softc *sc; + int aborted = 0; + + sc = cm->cm_sc; + mtx_assert(&sc->mfi_io_lock, MA_OWNED); + + hdr = &cm->cm_frame->header; + + if (sc->mfi_map_sync_cm == NULL) + return; + + if (sc->cm_map_abort || + hdr->cmd_status == MFI_STAT_INVALID_STATUS) { + sc->cm_map_abort = 0; + aborted = 1; + } + + free(cm->cm_data, M_MFIBUF); + sc->mfi_map_sync_cm = NULL; + wakeup(&sc->mfi_map_sync_cm); + mfi_release_command(cm); + + /* set it up again so the driver can catch more events */ + if (!aborted) { + mfi_queue_map_sync(sc); + } +} + +static void +mfi_queue_map_sync(struct mfi_softc *sc) +{ + mtx_assert(&sc->mfi_io_lock, MA_OWNED); + taskqueue_enqueue(taskqueue_swi, &sc->mfi_map_sync_task); +} + +void +mfi_handle_map_sync(void *context, int pending) +{ + struct mfi_softc *sc; + + sc = context; + mfi_tbolt_sync_map_info(sc); +} diff --git a/sys/dev/mfi/mfireg.h b/sys/dev/mfi/mfireg.h index 627b7595944..dab9cf7baa1 100644 --- a/sys/dev/mfi/mfireg.h +++ b/sys/dev/mfi/mfireg.h @@ -403,6 +403,7 @@ typedef enum { #define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED 0x0152 #define MR_EVT_PD_REMOVED 0x0070 #define MR_EVT_PD_INSERTED 0x005b +#define MR_EVT_LD_CHANGE 0x0051 typedef enum { MR_LD_CACHE_WRITE_BACK = 0x01, @@ -1376,8 +1377,13 @@ struct mfi_bbu_status { #define MFI_BBU_STATE_PACK_MISSING (1 << 0) #define MFI_BBU_STATE_VOLTAGE_LOW (1 << 1) #define MFI_BBU_STATE_TEMPERATURE_HIGH (1 << 2) -#define MFI_BBU_STATE_CHARGE_ACTIVE (1 << 0) -#define MFI_BBU_STATE_DISCHARGE_ACTIVE (1 << 0) +#define MFI_BBU_STATE_CHARGE_ACTIVE (1 << 3) +#define MFI_BBU_STATE_DISCHARGE_ACTIVE (1 << 4) +#define MFI_BBU_STATE_LEARN_CYC_REQ (1 << 5) +#define MFI_BBU_STATE_LEARN_CYC_ACTIVE (1 << 6) +#define MFI_BBU_STATE_LEARN_CYC_FAIL (1 << 7) +#define MFI_BBU_STATE_LEARN_CYC_TIMEOUT (1 << 8) +#define MFI_BBU_STATE_I2C_ERR_DETECT (1 << 9) uint8_t pad[20]; union mfi_bbu_status_detail detail; } __packed; diff --git a/sys/dev/mfi/mfivar.h b/sys/dev/mfi/mfivar.h index 7afbc889ab6..d38fcc3ee64 100644 --- a/sys/dev/mfi/mfivar.h +++ b/sys/dev/mfi/mfivar.h @@ -105,7 +105,6 @@ struct mfi_command { #define MFI_ON_MFIQ_READY (1<<6) #define MFI_ON_MFIQ_BUSY (1<<7) #define MFI_ON_MFIQ_MASK ((1<<5)|(1<<6)|(1<<7)) - int cm_aen_abort; uint8_t retry_for_fw_reset; void (* cm_complete)(struct mfi_command *cm); void *cm_private; @@ -177,7 +176,7 @@ struct mfi_softc { // Start: LSIP200113393 bus_dma_tag_t verbuf_h_dmat; bus_dmamap_t verbuf_h_dmamap; - uint32_t verbuf_h_busaddr; + bus_addr_t verbuf_h_busaddr; uint32_t *verbuf; void *kbuff_arr[MAX_IOCTL_SGE]; bus_dma_tag_t mfi_kbuff_arr_dmat[2]; @@ -216,9 +215,13 @@ struct mfi_softc { TAILQ_HEAD(,mfi_evt_queue_elm) mfi_evt_queue; struct task mfi_evt_task; + struct task mfi_map_sync_task; TAILQ_HEAD(,mfi_aen) mfi_aen_pids; struct mfi_command *mfi_aen_cm; struct mfi_command *mfi_skinny_cm; + struct mfi_command *mfi_map_sync_cm; + int cm_aen_abort; + int cm_map_abort; uint32_t mfi_aen_triggered; uint32_t mfi_poll_waiting; uint32_t mfi_boot_seq_num; @@ -229,7 +232,7 @@ struct mfi_softc { bus_dma_tag_t mfi_sense_dmat; bus_dmamap_t mfi_sense_dmamap; - uint32_t mfi_sense_busaddr; + bus_addr_t mfi_sense_busaddr; struct mfi_sense *mfi_sense; struct resource *mfi_irq; @@ -303,8 +306,6 @@ struct mfi_softc { /* ThunderBolt */ uint32_t mfi_tbolt; uint32_t MFA_enabled; - uint64_t map_id; - struct mfi_command *map_update_cmd; /* Single Reply structure size */ uint16_t reply_size; /* Singler message size. */ @@ -318,7 +319,6 @@ struct mfi_softc { uint8_t * request_message_pool; uint8_t * request_message_pool_align; uint8_t * request_desc_pool; - //uint32_t request_desc_busaddr; bus_addr_t request_msg_busaddr; bus_addr_t reply_frame_busaddr; bus_addr_t sg_frame_busaddr; @@ -417,7 +417,10 @@ extern int mfi_tbolt_alloc_cmd(struct mfi_softc *sc); extern int mfi_tbolt_send_frame(struct mfi_softc *sc, struct mfi_command *cm); extern int mfi_tbolt_adp_reset(struct mfi_softc *sc); extern int mfi_tbolt_reset(struct mfi_softc *sc); -extern int mfi_tbolt_sync_map_info(struct mfi_softc *sc); +extern void mfi_tbolt_sync_map_info(struct mfi_softc *sc); +extern void mfi_handle_map_sync(void *context, int pending); +extern int mfi_dcmd_command(struct mfi_softc *, struct mfi_command **, + uint32_t, void **, size_t); #define MFIQ_ADD(sc, qname) \ do { \ diff --git a/sys/dev/mii/ciphy.c b/sys/dev/mii/ciphy.c index 87d0d814e91..e830f279e95 100644 --- a/sys/dev/mii/ciphy.c +++ b/sys/dev/mii/ciphy.c @@ -91,8 +91,10 @@ static const struct mii_phydesc ciphys[] = { MII_PHY_DESC(xxCICADA, CS8201B), MII_PHY_DESC(xxCICADA, CS8204), MII_PHY_DESC(xxCICADA, VSC8211), + MII_PHY_DESC(xxCICADA, VSC8221), MII_PHY_DESC(xxCICADA, CS8244), MII_PHY_DESC(xxVITESSE, VSC8601), + MII_PHY_DESC(xxVITESSE, VSC8641), MII_PHY_END }; @@ -368,8 +370,10 @@ ciphy_fixup(struct mii_softc *sc) break; case MII_MODEL_xxCICADA_VSC8211: + case MII_MODEL_xxCICADA_VSC8221: case MII_MODEL_xxCICADA_CS8244: case MII_MODEL_xxVITESSE_VSC8601: + case MII_MODEL_xxVITESSE_VSC8641: break; default: device_printf(sc->mii_dev, "unknown CICADA PHY model %x\n", diff --git a/sys/dev/mii/miidevs b/sys/dev/mii/miidevs index 5629290c961..55446147525 100644 --- a/sys/dev/mii/miidevs +++ b/sys/dev/mii/miidevs @@ -52,7 +52,7 @@ oui AMD 0x00001a Advanced Micro Devices oui BROADCOM 0x001018 Broadcom Corporation oui BROADCOM2 0x000af7 Broadcom Corporation oui BROADCOM3 0x001be9 Broadcom Corporation -oui CICADA 0x0003F1 Cicada Semiconductor +oui CICADA 0x0003f1 Cicada Semiconductor oui DAVICOM 0x00606e Davicom Semiconductor oui ENABLESEMI 0x0010dd Enable Semiconductor oui ICPLUS 0x0090c3 IC Plus Corp. @@ -71,6 +71,7 @@ oui SEEQ 0x00a07d Seeq Technology oui SIS 0x00e006 Silicon Integrated Systems oui TI 0x080028 Texas Instruments oui TSC 0x00c039 TDK Semiconductor +oui VITESSE 0x0001c1 Vitesse Semiconductor oui XAQTI 0x00e0ae XaQti Corp. /* Some Intel 82553's use an alternative OUI. */ @@ -190,6 +191,7 @@ model xxBROADCOM_ALT1 BCM5906 0x0004 BCM5906 10/100baseTX media interface model xxCICADA CS8201 0x0001 Cicada CS8201 10/100/1000TX PHY model xxCICADA CS8204 0x0004 Cicada CS8204 10/100/1000TX PHY model xxCICADA VSC8211 0x000b Cicada VSC8211 10/100/1000TX PHY +model xxCICADA VSC8221 0x0015 Cicada CS8201 10/100/1000TX PHY model xxCICADA CS8201A 0x0020 Cicada CS8201 10/100/1000TX PHY model xxCICADA CS8201B 0x0021 Cicada CS8201 10/100/1000TX PHY model xxCICADA CS8244 0x002c Cicada CS8244 10/100/1000TX PHY @@ -318,5 +320,8 @@ model TI TNETE2101 0x0003 TNETE2101 media interface model xxTSC 78Q2120 0x0014 78Q2120 10/100 media interface model xxTSC 78Q2121 0x0015 78Q2121 100BASE-TX media interface +/* Vitesse Semiconductor */ +model xxVITESSE VSC8641 0x0003 Vitesse VSC8641 10/100/1000TX PHY + /* XaQti Corp. PHYs */ model xxXAQTI XMACII 0x0000 XaQti Corp. XMAC II gigabit interface diff --git a/sys/dev/mmc/mmc.c b/sys/dev/mmc/mmc.c index 5771a182234..77be79ab79b 100644 --- a/sys/dev/mmc/mmc.c +++ b/sys/dev/mmc/mmc.c @@ -112,11 +112,21 @@ static int mmc_debug; SYSCTL_INT(_hw_mmc, OID_AUTO, debug, CTLFLAG_RW, &mmc_debug, 0, "Debug level"); /* bus entry points */ -static int mmc_probe(device_t dev); +static int mmc_acquire_bus(device_t busdev, device_t dev); static int mmc_attach(device_t dev); +static int mmc_child_location_str(device_t dev, device_t child, char *buf, + size_t buflen); static int mmc_detach(device_t dev); -static int mmc_suspend(device_t dev); +static int mmc_probe(device_t dev); +static int mmc_read_ivar(device_t bus, device_t child, int which, + uintptr_t *result); +static int mmc_release_bus(device_t busdev, device_t dev); static int mmc_resume(device_t dev); +static int mmc_suspend(device_t dev); +static int mmc_wait_for_request(device_t brdev, device_t reqdev, + struct mmc_request *req); +static int mmc_write_ivar(device_t bus, device_t child, int which, + uintptr_t value); #define MMC_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) #define MMC_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) @@ -127,25 +137,69 @@ static int mmc_resume(device_t dev); #define MMC_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED); #define MMC_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); +static int mmc_all_send_cid(struct mmc_softc *sc, uint32_t *rawcid); +static void mmc_app_decode_scr(uint32_t *raw_scr, struct mmc_scr *scr); +static void mmc_app_decode_sd_status(uint32_t *raw_sd_status, + struct mmc_sd_status *sd_status); +static int mmc_app_sd_status(struct mmc_softc *sc, uint16_t rca, + uint32_t *rawsdstatus); +static int mmc_app_send_scr(struct mmc_softc *sc, uint16_t rca, + uint32_t *rawscr); static int mmc_calculate_clock(struct mmc_softc *sc); -static void mmc_delayed_attach(void *); +static void mmc_decode_cid_mmc(uint32_t *raw_cid, struct mmc_cid *cid); +static void mmc_decode_cid_sd(uint32_t *raw_cid, struct mmc_cid *cid); +static void mmc_decode_csd_mmc(uint32_t *raw_csd, struct mmc_csd *csd); +static void mmc_decode_csd_sd(uint32_t *raw_csd, struct mmc_csd *csd); +static void mmc_delayed_attach(void *xsc); +static int mmc_delete_cards(struct mmc_softc *sc); +static void mmc_discover_cards(struct mmc_softc *sc); +static void mmc_format_card_id_string(struct mmc_ivars *ivar); +static void mmc_go_discovery(struct mmc_softc *sc); +static uint32_t mmc_get_bits(uint32_t *bits, int bit_len, int start, + int size); +static int mmc_highest_voltage(uint32_t ocr); +static void mmc_idle_cards(struct mmc_softc *sc); +static void mmc_ms_delay(int ms); +static void mmc_log_card(device_t dev, struct mmc_ivars *ivar, int newcard); static void mmc_power_down(struct mmc_softc *sc); +static void mmc_power_up(struct mmc_softc *sc); +static void mmc_rescan_cards(struct mmc_softc *sc); +static void mmc_scan(struct mmc_softc *sc); +static int mmc_sd_switch(struct mmc_softc *sc, uint8_t mode, uint8_t grp, + uint8_t value, uint8_t *res); +static int mmc_select_card(struct mmc_softc *sc, uint16_t rca); +static uint32_t mmc_select_vdd(struct mmc_softc *sc, uint32_t ocr); +static int mmc_send_app_op_cond(struct mmc_softc *sc, uint32_t ocr, + uint32_t *rocr); +static int mmc_send_csd(struct mmc_softc *sc, uint16_t rca, uint32_t *rawcsd); +static int mmc_send_ext_csd(struct mmc_softc *sc, uint8_t *rawextcsd); +static int mmc_send_if_cond(struct mmc_softc *sc, uint8_t vhs); +static int mmc_send_op_cond(struct mmc_softc *sc, uint32_t ocr, + uint32_t *rocr); +static int mmc_send_relative_addr(struct mmc_softc *sc, uint32_t *resp); +static int mmc_send_status(struct mmc_softc *sc, uint16_t rca, + uint32_t *status); +static int mmc_set_blocklen(struct mmc_softc *sc, uint32_t len); +static int mmc_set_card_bus_width(struct mmc_softc *sc, uint16_t rca, + int width); +static int mmc_set_relative_addr(struct mmc_softc *sc, uint16_t resp); +static int mmc_set_timing(struct mmc_softc *sc, int timing); +static int mmc_switch(struct mmc_softc *sc, uint8_t set, uint8_t index, + uint8_t value); +static int mmc_test_bus_width(struct mmc_softc *sc); +static int mmc_wait_for_app_cmd(struct mmc_softc *sc, uint32_t rca, + struct mmc_command *cmd, int retries); static int mmc_wait_for_cmd(struct mmc_softc *sc, struct mmc_command *cmd, int retries); static int mmc_wait_for_command(struct mmc_softc *sc, uint32_t opcode, uint32_t arg, uint32_t flags, uint32_t *resp, int retries); -static int mmc_select_card(struct mmc_softc *sc, uint16_t rca); -static int mmc_set_card_bus_width(struct mmc_softc *sc, uint16_t rca, int width); -static int mmc_app_send_scr(struct mmc_softc *sc, uint16_t rca, uint32_t *rawscr); -static void mmc_app_decode_scr(uint32_t *raw_scr, struct mmc_scr *scr); -static int mmc_send_ext_csd(struct mmc_softc *sc, uint8_t *rawextcsd); -static void mmc_scan(struct mmc_softc *sc); -static int mmc_delete_cards(struct mmc_softc *sc); -static void mmc_format_card_id_string(struct mmc_ivars *ivar); +static int mmc_wait_for_req(struct mmc_softc *sc, struct mmc_request *req); +static void mmc_wakeup(struct mmc_request *req); static void mmc_ms_delay(int ms) { + DELAY(1000 * ms); /* XXX BAD */ } @@ -224,7 +278,7 @@ mmc_acquire_bus(device_t busdev, device_t dev) sc = device_get_softc(busdev); MMC_LOCK(sc); if (sc->owner) - panic("mmc: host bridge didn't seralize us."); + panic("mmc: host bridge didn't serialize us."); sc->owner = dev; MMC_UNLOCK(sc); @@ -859,7 +913,7 @@ mmc_decode_csd_sd(uint32_t *raw_csd, struct mmc_csd *csd) if (v == 0) { m = mmc_get_bits(raw_csd, 128, 115, 4); e = mmc_get_bits(raw_csd, 128, 112, 3); - csd->tacc = exp[e] * mant[m] + 9 / 10; + csd->tacc = (exp[e] * mant[m] + 9) / 10; csd->nsac = mmc_get_bits(raw_csd, 128, 104, 8) * 100; m = mmc_get_bits(raw_csd, 128, 99, 4); e = mmc_get_bits(raw_csd, 128, 96, 3); @@ -887,7 +941,7 @@ mmc_decode_csd_sd(uint32_t *raw_csd, struct mmc_csd *csd) } else if (v == 1) { m = mmc_get_bits(raw_csd, 128, 115, 4); e = mmc_get_bits(raw_csd, 128, 112, 3); - csd->tacc = exp[e] * mant[m] + 9 / 10; + csd->tacc = (exp[e] * mant[m] + 9) / 10; csd->nsac = mmc_get_bits(raw_csd, 128, 104, 8) * 100; m = mmc_get_bits(raw_csd, 128, 99, 4); e = mmc_get_bits(raw_csd, 128, 96, 3); @@ -1002,7 +1056,7 @@ mmc_all_send_cid(struct mmc_softc *sc, uint32_t *rawcid) } static int -mmc_send_csd(struct mmc_softc *sc, uint16_t rca, uint32_t *rawcid) +mmc_send_csd(struct mmc_softc *sc, uint16_t rca, uint32_t *rawcsd) { struct mmc_command cmd; int err; @@ -1012,7 +1066,7 @@ mmc_send_csd(struct mmc_softc *sc, uint16_t rca, uint32_t *rawcid) cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR; cmd.data = NULL; err = mmc_wait_for_cmd(sc, &cmd, 0); - memcpy(rawcid, cmd.resp, 4 * sizeof(uint32_t)); + memcpy(rawcsd, cmd.resp, 4 * sizeof(uint32_t)); return (err); } @@ -1121,6 +1175,35 @@ mmc_send_relative_addr(struct mmc_softc *sc, uint32_t *resp) return (err); } +static int +mmc_send_status(struct mmc_softc *sc, uint16_t rca, uint32_t *status) +{ + struct mmc_command cmd; + int err; + + cmd.opcode = MMC_SEND_STATUS; + cmd.arg = rca << 16; + cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; + cmd.data = NULL; + err = mmc_wait_for_cmd(sc, &cmd, 0); + *status = cmd.resp[0]; + return (err); +} + +static int +mmc_set_blocklen(struct mmc_softc *sc, uint32_t len) +{ + struct mmc_command cmd; + int err; + + cmd.opcode = MMC_SET_BLOCKLEN; + cmd.arg = len; + cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; + cmd.data = NULL; + err = mmc_wait_for_cmd(sc, &cmd, 0); + return (err); +} + static void mmc_log_card(device_t dev, struct mmc_ivars *ivar, int newcard) { @@ -1144,8 +1227,7 @@ mmc_discover_cards(struct mmc_softc *sc) struct mmc_ivars *ivar = NULL; device_t *devlist; int err, i, devcount, newcard; - uint32_t raw_cid[4]; - uint32_t resp, sec_count; + uint32_t raw_cid[4], resp, sec_count, status; device_t child; uint16_t rca = 2; u_char switch_res[64]; @@ -1194,6 +1276,12 @@ mmc_discover_cards(struct mmc_softc *sc) ivar->rca = resp >> 16; /* Get card CSD. */ mmc_send_csd(sc, ivar->rca, ivar->raw_csd); + if (bootverbose || mmc_debug) + device_printf(sc->dev, + "%sard detected (CSD %08x%08x%08x%08x)\n", + newcard ? "New c" : "C", ivar->raw_csd[0], + ivar->raw_csd[1], ivar->raw_csd[2], + ivar->raw_csd[3]); mmc_decode_csd_sd(ivar->raw_csd, &ivar->csd); ivar->sec_count = ivar->csd.capacity / MMC_SECTOR_SIZE; if (ivar->csd.csd_structure > 0) @@ -1201,6 +1289,19 @@ mmc_discover_cards(struct mmc_softc *sc) ivar->tran_speed = ivar->csd.tran_speed; ivar->erase_sector = ivar->csd.erase_sector * ivar->csd.write_bl_len / MMC_SECTOR_SIZE; + + err = mmc_send_status(sc, ivar->rca, &status); + if (err != MMC_ERR_NONE) { + device_printf(sc->dev, + "Error reading card status %d\n", err); + break; + } + if ((status & R1_CARD_IS_LOCKED) != 0) { + device_printf(sc->dev, + "Card is password protected, skipping.\n"); + break; + } + /* Get card SCR. Card must be selected to fetch it. */ mmc_select_card(sc, ivar->rca); mmc_app_send_scr(sc, ivar->rca, ivar->raw_scr); @@ -1228,7 +1329,22 @@ mmc_discover_cards(struct mmc_softc *sc) if ((mmcbr_get_caps(sc->dev) & MMC_CAP_4_BIT_DATA) && (ivar->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) ivar->bus_width = bus_width_4; + + /* + * Some cards that report maximum I/O block sizes + * greater than 512 require the block length to be + * set to 512, even though that is supposed to be + * the default. Example: + * + * Transcend 2GB SDSC card, CID: + * mid=0x1b oid=0x534d pnm="00000" prv=1.0 mdt=00.2000 + */ + if (ivar->csd.read_bl_len != MMC_SECTOR_SIZE || + ivar->csd.write_bl_len != MMC_SECTOR_SIZE) + mmc_set_blocklen(sc, MMC_SECTOR_SIZE); + mmc_format_card_id_string(ivar); + if (bootverbose || mmc_debug) mmc_log_card(sc->dev, ivar, newcard); if (newcard) { @@ -1243,11 +1359,31 @@ mmc_discover_cards(struct mmc_softc *sc) mmc_set_relative_addr(sc, ivar->rca); /* Get card CSD. */ mmc_send_csd(sc, ivar->rca, ivar->raw_csd); + if (bootverbose || mmc_debug) + device_printf(sc->dev, + "%sard detected (CSD %08x%08x%08x%08x)\n", + newcard ? "New c" : "C", ivar->raw_csd[0], + ivar->raw_csd[1], ivar->raw_csd[2], + ivar->raw_csd[3]); + mmc_decode_csd_mmc(ivar->raw_csd, &ivar->csd); ivar->sec_count = ivar->csd.capacity / MMC_SECTOR_SIZE; ivar->tran_speed = ivar->csd.tran_speed; ivar->erase_sector = ivar->csd.erase_sector * ivar->csd.write_bl_len / MMC_SECTOR_SIZE; + + err = mmc_send_status(sc, ivar->rca, &status); + if (err != MMC_ERR_NONE) { + device_printf(sc->dev, + "Error reading card status %d\n", err); + break; + } + if ((status & R1_CARD_IS_LOCKED) != 0) { + device_printf(sc->dev, + "Card is password protected, skipping.\n"); + break; + } + /* Only MMC >= 4.x cards support EXT_CSD. */ if (ivar->csd.spec_vers >= 4) { /* Card must be selected to fetch EXT_CSD. */ @@ -1286,7 +1422,21 @@ mmc_discover_cards(struct mmc_softc *sc) ivar->bus_width = bus_width_1; ivar->timing = bus_timing_normal; } + + /* + * Some cards that report maximum I/O block sizes greater + * than 512 require the block length to be set to 512, even + * though that is supposed to be the default. Example: + * + * Transcend 2GB SDSC card, CID: + * mid=0x1b oid=0x534d pnm="00000" prv=1.0 mdt=00.2000 + */ + if (ivar->csd.read_bl_len != MMC_SECTOR_SIZE || + ivar->csd.write_bl_len != MMC_SECTOR_SIZE) + mmc_set_blocklen(sc, MMC_SECTOR_SIZE); + mmc_format_card_id_string(ivar); + if (bootverbose || mmc_debug) mmc_log_card(sc->dev, ivar, newcard); if (newcard) { @@ -1362,8 +1512,7 @@ mmc_go_discovery(struct mmc_softc *sc) err = mmc_send_if_cond(sc, 1); if ((bootverbose || mmc_debug) && err == 0) device_printf(sc->dev, "SD 2.0 interface conditions: OK\n"); - if (mmc_send_app_op_cond(sc, err ? 0 : MMC_OCR_CCS, &ocr) != - MMC_ERR_NONE) { + if (mmc_send_app_op_cond(sc, 0, &ocr) != MMC_ERR_NONE) { if (bootverbose || mmc_debug) device_printf(sc->dev, "SD probe: failed\n"); /* @@ -1535,7 +1684,6 @@ mmc_write_ivar(device_t bus, device_t child, int which, uintptr_t value) return (EINVAL); } - static void mmc_delayed_attach(void *xsc) { diff --git a/sys/dev/mmc/mmcsd.c b/sys/dev/mmc/mmcsd.c index c3b66db668f..cdba4a9a56a 100644 --- a/sys/dev/mmc/mmcsd.c +++ b/sys/dev/mmc/mmcsd.c @@ -89,19 +89,21 @@ struct mmcsd_softc { }; /* bus entry points */ -static int mmcsd_probe(device_t dev); static int mmcsd_attach(device_t dev); static int mmcsd_detach(device_t dev); +static int mmcsd_probe(device_t dev); /* disk routines */ -static int mmcsd_open(struct disk *dp); static int mmcsd_close(struct disk *dp); -static void mmcsd_strategy(struct bio *bp); static int mmcsd_dump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t length); +static int mmcsd_open(struct disk *dp); +static void mmcsd_strategy(struct bio *bp); static void mmcsd_task(void *arg); static int mmcsd_bus_bit_width(device_t dev); +static daddr_t mmcsd_delete(struct mmcsd_softc *sc, struct bio *bp); +static daddr_t mmcsd_rw(struct mmcsd_softc *sc, struct bio *bp); #define MMCSD_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) #define MMCSD_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) @@ -256,12 +258,14 @@ mmcsd_resume(device_t dev) static int mmcsd_open(struct disk *dp) { + return (0); } static int mmcsd_close(struct disk *dp) { + return (0); } @@ -521,6 +525,7 @@ out: static int mmcsd_bus_bit_width(device_t dev) { + if (mmc_get_bus_width(dev) == bus_width_1) return (1); if (mmc_get_bus_width(dev) == bus_width_4) diff --git a/sys/dev/mps/mpi/mpi2.h b/sys/dev/mps/mpi/mpi2.h index b9e46adea04..45fb7d9b73c 100644 --- a/sys/dev/mps/mpi/mpi2.h +++ b/sys/dev/mps/mpi/mpi2.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ */ /* - * Copyright (c) 2000-2011 LSI Corporation. + * Copyright (c) 2000-2012 LSI Corporation. * * * Name: mpi2.h diff --git a/sys/dev/mps/mpi/mpi2_cnfg.h b/sys/dev/mps/mpi/mpi2_cnfg.h index ef3334f0f50..4db5f099d33 100644 --- a/sys/dev/mps/mpi/mpi2_cnfg.h +++ b/sys/dev/mps/mpi/mpi2_cnfg.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ */ /* - * Copyright (c) 2000-2011 LSI Corporation. + * Copyright (c) 2000-2012 LSI Corporation. * * * Name: mpi2_cnfg.h diff --git a/sys/dev/mps/mpi/mpi2_hbd.h b/sys/dev/mps/mpi/mpi2_hbd.h index e31fc5ec432..d8645e688e1 100644 --- a/sys/dev/mps/mpi/mpi2_hbd.h +++ b/sys/dev/mps/mpi/mpi2_hbd.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ */ /* - * Copyright (c) 2009-2011 LSI Corporation. + * Copyright (c) 2009-2012 LSI Corporation. * * * Name: mpi2_hbd.h diff --git a/sys/dev/mps/mpi/mpi2_history.txt b/sys/dev/mps/mpi/mpi2_history.txt index 01dc3b6ee94..e6bb5b00817 100644 --- a/sys/dev/mps/mpi/mpi2_history.txt +++ b/sys/dev/mps/mpi/mpi2_history.txt @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,7 +32,7 @@ Fusion-MPT MPI 2.0 Header File Change History ============================== - Copyright (c) 2000-2011 LSI Corporation. + Copyright (c) 2000-2012 LSI Corporation. --------------------------------------- Header Set Release Version: 02.00.18 diff --git a/sys/dev/mps/mpi/mpi2_init.h b/sys/dev/mps/mpi/mpi2_init.h index ca4a685d655..0f0a1927eac 100644 --- a/sys/dev/mps/mpi/mpi2_init.h +++ b/sys/dev/mps/mpi/mpi2_init.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ */ /* - * Copyright (c) 2000-2011 LSI Corporation. + * Copyright (c) 2000-2012 LSI Corporation. * * * Name: mpi2_init.h diff --git a/sys/dev/mps/mpi/mpi2_ioc.h b/sys/dev/mps/mpi/mpi2_ioc.h index ca19a5c32f3..fd4df2b271f 100644 --- a/sys/dev/mps/mpi/mpi2_ioc.h +++ b/sys/dev/mps/mpi/mpi2_ioc.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ */ /* - * Copyright (c) 2000-2011 LSI Corporation. + * Copyright (c) 2000-2012 LSI Corporation. * * * Name: mpi2_ioc.h diff --git a/sys/dev/mps/mpi/mpi2_ra.h b/sys/dev/mps/mpi/mpi2_ra.h index 0f012269bc4..2847fa9ddc0 100644 --- a/sys/dev/mps/mpi/mpi2_ra.h +++ b/sys/dev/mps/mpi/mpi2_ra.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ */ /* - * Copyright (c) 2011 LSI Corporation. + * Copyright (c) 2012 LSI Corporation. * * * Name: mpi2_ra.h diff --git a/sys/dev/mps/mpi/mpi2_raid.h b/sys/dev/mps/mpi/mpi2_raid.h index 557468a4b2a..2d497ee5de5 100644 --- a/sys/dev/mps/mpi/mpi2_raid.h +++ b/sys/dev/mps/mpi/mpi2_raid.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ */ /* - * Copyright (c) 2000-2011 LSI Corporation. + * Copyright (c) 2000-2012 LSI Corporation. * * * Name: mpi2_raid.h diff --git a/sys/dev/mps/mpi/mpi2_sas.h b/sys/dev/mps/mpi/mpi2_sas.h index 1f3341f24b6..54a995b7938 100644 --- a/sys/dev/mps/mpi/mpi2_sas.h +++ b/sys/dev/mps/mpi/mpi2_sas.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ */ /* - * Copyright (c) 2000-2011 LSI Corporation. + * Copyright (c) 2000-2012 LSI Corporation. * * * Name: mpi2_sas.h diff --git a/sys/dev/mps/mpi/mpi2_targ.h b/sys/dev/mps/mpi/mpi2_targ.h index fcd694cb0b6..179ca537dc8 100644 --- a/sys/dev/mps/mpi/mpi2_targ.h +++ b/sys/dev/mps/mpi/mpi2_targ.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ */ /* - * Copyright (c) 2000-2011 LSI Corporation. + * Copyright (c) 2000-2012 LSI Corporation. * * * Name: mpi2_targ.h diff --git a/sys/dev/mps/mpi/mpi2_tool.h b/sys/dev/mps/mpi/mpi2_tool.h index 16c0ffc6fb0..73ece21fe1d 100644 --- a/sys/dev/mps/mpi/mpi2_tool.h +++ b/sys/dev/mps/mpi/mpi2_tool.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ */ /* - * Copyright (c) 2000-2011 LSI Corporation. + * Copyright (c) 2000-2012 LSI Corporation. * * * Name: mpi2_tool.h diff --git a/sys/dev/mps/mpi/mpi2_type.h b/sys/dev/mps/mpi/mpi2_type.h index fa4ecd9b7ff..0ea541a48cb 100644 --- a/sys/dev/mps/mpi/mpi2_type.h +++ b/sys/dev/mps/mpi/mpi2_type.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ */ /* - * Copyright (c) 2000-2011 LSI Corporation. + * Copyright (c) 2000-2012 LSI Corporation. * * * Name: mpi2_type.h diff --git a/sys/dev/mps/mps.c b/sys/dev/mps/mps.c index e11e9a62243..1d935be1f0f 100644 --- a/sys/dev/mps/mps.c +++ b/sys/dev/mps/mps.c @@ -1,31 +1,6 @@ /*- * Copyright (c) 2009 Yahoo! Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ -/*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -82,6 +57,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include @@ -98,9 +74,9 @@ __FBSDID("$FreeBSD$"); #include #include -static int mps_diag_reset(struct mps_softc *sc); +static int mps_diag_reset(struct mps_softc *sc, int sleep_flag); static int mps_init_queues(struct mps_softc *sc); -static int mps_message_unit_reset(struct mps_softc *sc); +static int mps_message_unit_reset(struct mps_softc *sc, int sleep_flag); static int mps_transition_operational(struct mps_softc *sc); static void mps_startup(void *arg); static int mps_send_iocinit(struct mps_softc *sc); @@ -112,7 +88,7 @@ static void mps_config_complete(struct mps_softc *sc, struct mps_command *cm); static void mps_periodic(void *); static int mps_reregister_events(struct mps_softc *sc); static void mps_enqueue_request(struct mps_softc *sc, struct mps_command *cm); - +static int mps_wait_db_ack(struct mps_softc *sc, int timeout, int sleep_flag); SYSCTL_NODE(_hw, OID_AUTO, mps, CTLFLAG_RD, 0, "MPS Driver Parameters"); MALLOC_DEFINE(M_MPT2, "mps", "mpt2 driver memory"); @@ -123,8 +99,32 @@ MALLOC_DEFINE(M_MPT2, "mps", "mpt2 driver memory"); */ static char mpt2_reset_magic[] = { 0x00, 0x0f, 0x04, 0x0b, 0x02, 0x07, 0x0d }; +/* Added this union to smoothly convert le64toh cm->cm_desc.Words. + * Compiler only support unint64_t to be passed as argument. + * Otherwise it will through below error + * "aggregate value used where an integer was expected" + */ + +typedef union _reply_descriptor { + u64 word; + struct { + u32 low; + u32 high; + } u; +}reply_descriptor,address_descriptor; + +/* + * sleep_flag can be either CAN_SLEEP or NO_SLEEP. + * If this function is called from process context, it can sleep + * and there is no harm to sleep, in case if this fuction is called + * from Interrupt handler, we can not sleep and need NO_SLEEP flag set. + * based on sleep flags driver will call either msleep, pause or DELAY. + * msleep and pause are of same variant, but pause is used when mps_mtx + * is not hold by driver. + * + */ static int -mps_diag_reset(struct mps_softc *sc) +mps_diag_reset(struct mps_softc *sc,int sleep_flag) { uint32_t reg; int i, error, tries = 0; @@ -134,14 +134,25 @@ mps_diag_reset(struct mps_softc *sc) /* Clear any pending interrupts */ mps_regwrite(sc, MPI2_HOST_INTERRUPT_STATUS_OFFSET, 0x0); + /*Force NO_SLEEP for threads prohibited to sleep + * e.a Thread from interrupt handler are prohibited to sleep. + */ + if(curthread->td_pflags & TDP_NOSLEEPING) + sleep_flag = NO_SLEEP; + /* Push the magic sequence */ error = ETIMEDOUT; while (tries++ < 20) { for (i = 0; i < sizeof(mpt2_reset_magic); i++) mps_regwrite(sc, MPI2_WRITE_SEQUENCE_OFFSET, mpt2_reset_magic[i]); - - DELAY(100 * 1000); + /* wait 100 msec */ + if (mtx_owned(&sc->mps_mtx) && sleep_flag == CAN_SLEEP) + msleep(&sc->msleep_fake_chan, &sc->mps_mtx, 0, "mpsdiag", hz/10); + else if (sleep_flag == CAN_SLEEP) + pause("mpsdiag", hz/10); + else + DELAY(100 * 1000); reg = mps_regread(sc, MPI2_HOST_DIAGNOSTIC_OFFSET); if (reg & MPI2_DIAG_DIAG_WRITE_ENABLE) { @@ -159,7 +170,13 @@ mps_diag_reset(struct mps_softc *sc) /* Wait up to 300 seconds in 50ms intervals */ error = ETIMEDOUT; for (i = 0; i < 60000; i++) { - DELAY(50000); + /* wait 50 msec */ + if (mtx_owned(&sc->mps_mtx) && sleep_flag == CAN_SLEEP) + msleep(&sc->msleep_fake_chan, &sc->mps_mtx, 0, "mpsdiag", hz/20); + else if (sleep_flag == CAN_SLEEP) + pause("mpsdiag", hz/20); + else + DELAY(50 * 1000); reg = mps_regread(sc, MPI2_DOORBELL_OFFSET); if ((reg & MPI2_IOC_STATE_MASK) != MPI2_IOC_STATE_RESET) { error = 0; @@ -175,7 +192,7 @@ mps_diag_reset(struct mps_softc *sc) } static int -mps_message_unit_reset(struct mps_softc *sc) +mps_message_unit_reset(struct mps_softc *sc, int sleep_flag) { mps_dprint(sc, MPS_TRACE, "%s\n", __func__); @@ -183,7 +200,12 @@ mps_message_unit_reset(struct mps_softc *sc) mps_regwrite(sc, MPI2_DOORBELL_OFFSET, MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET << MPI2_DOORBELL_FUNCTION_SHIFT); - DELAY(50000); + + if (mps_wait_db_ack(sc, 5, sleep_flag) != 0) { + mps_dprint(sc, MPS_FAULT, "Doorbell handshake failed : <%s>\n", + __func__); + return (ETIMEDOUT); + } return (0); } @@ -193,9 +215,12 @@ mps_transition_ready(struct mps_softc *sc) { uint32_t reg, state; int error, tries = 0; + int sleep_flags; mps_dprint(sc, MPS_TRACE, "%s\n", __func__); - + /* If we are in attach call, do not sleep */ + sleep_flags = (sc->mps_flags & MPS_FLAGS_ATTACH_DONE) + ? CAN_SLEEP:NO_SLEEP; error = 0; while (tries++ < 5) { reg = mps_regread(sc, MPI2_DOORBELL_OFFSET); @@ -206,7 +231,7 @@ mps_transition_ready(struct mps_softc *sc) * resetting it. */ if (reg & MPI2_DOORBELL_USED) { - mps_diag_reset(sc); + mps_diag_reset(sc, sleep_flags); DELAY(50000); continue; } @@ -227,10 +252,10 @@ mps_transition_ready(struct mps_softc *sc) } else if (state == MPI2_IOC_STATE_FAULT) { mps_dprint(sc, MPS_INFO, "IOC in fault state 0x%x\n", state & MPI2_DOORBELL_FAULT_CODE_MASK); - mps_diag_reset(sc); + mps_diag_reset(sc, sleep_flags); } else if (state == MPI2_IOC_STATE_OPERATIONAL) { /* Need to take ownership */ - mps_message_unit_reset(sc); + mps_message_unit_reset(sc, sleep_flags); } else if (state == MPI2_IOC_STATE_RESET) { /* Wait a bit, IOC might be in transition */ mps_dprint(sc, MPS_FAULT, @@ -310,7 +335,7 @@ mps_reinit(struct mps_softc *sc) mps_printf(sc, "%s mask interrupts\n", __func__); mps_mask_intr(sc); - error = mps_diag_reset(sc); + error = mps_diag_reset(sc, CAN_SLEEP); if (error != 0) { panic("%s hard reset failed with error %d\n", __func__, error); @@ -368,19 +393,56 @@ mps_reinit(struct mps_softc *sc) return 0; } -/* Wait for the chip to ACK a word that we've put into its FIFO */ +/* Wait for the chip to ACK a word that we've put into its FIFO + * Wait for seconds. In single loop wait for busy loop + * for 500 microseconds. + * Total is [ 0.5 * (2000 * ) ] in miliseconds. + * */ static int -mps_wait_db_ack(struct mps_softc *sc) +mps_wait_db_ack(struct mps_softc *sc, int timeout, int sleep_flag) { - int retry; - for (retry = 0; retry < MPS_DB_MAX_WAIT; retry++) { - if ((mps_regread(sc, MPI2_HOST_INTERRUPT_STATUS_OFFSET) & - MPI2_HIS_SYS2IOC_DB_STATUS) == 0) - return (0); - DELAY(2000); - } + u32 cntdn, count; + u32 int_status; + u32 doorbell; + + count = 0; + cntdn = (sleep_flag == CAN_SLEEP) ? 1000*timeout : 2000*timeout; + do { + int_status = mps_regread(sc, MPI2_HOST_INTERRUPT_STATUS_OFFSET); + if (!(int_status & MPI2_HIS_SYS2IOC_DB_STATUS)) { + mps_dprint(sc, MPS_INFO, + "%s: successfull count(%d), timeout(%d)\n", + __func__, count, timeout); + return 0; + } else if (int_status & MPI2_HIS_IOC2SYS_DB_STATUS) { + doorbell = mps_regread(sc, MPI2_DOORBELL_OFFSET); + if ((doorbell & MPI2_IOC_STATE_MASK) == + MPI2_IOC_STATE_FAULT) { + mps_dprint(sc, MPS_FAULT, + "fault_state(0x%04x)!\n", doorbell); + return (EFAULT); + } + } else if (int_status == 0xFFFFFFFF) + goto out; + + /* If it can sleep, sleep for 1 milisecond, else busy loop for + * 0.5 milisecond */ + if (mtx_owned(&sc->mps_mtx) && sleep_flag == CAN_SLEEP) + msleep(&sc->msleep_fake_chan, &sc->mps_mtx, 0, + "mpsdba", hz/1000); + else if (sleep_flag == CAN_SLEEP) + pause("mpsdba", hz/1000); + else + DELAY(500); + count++; + } while (--cntdn); + + out: + mps_dprint(sc, MPS_FAULT, "%s: failed due to timeout count(%d), " + "int_status(%x)!\n", __func__, count, int_status); return (ETIMEDOUT); + } /* Wait for the chip to signal that the next word in its FIFO can be fetched */ @@ -406,6 +468,10 @@ mps_request_sync(struct mps_softc *sc, void *req, MPI2_DEFAULT_REPLY *reply, uint32_t *data32; uint16_t *data16; int i, count, ioc_sz, residual; + int sleep_flags = CAN_SLEEP; + + if(curthread->td_pflags & TDP_NOSLEEPING) + sleep_flags = NO_SLEEP; /* Step 1 */ mps_regwrite(sc, MPI2_HOST_INTERRUPT_STATUS_OFFSET, 0x0); @@ -430,7 +496,7 @@ mps_request_sync(struct mps_softc *sc, void *req, MPI2_DEFAULT_REPLY *reply, return (ENXIO); } mps_regwrite(sc, MPI2_HOST_INTERRUPT_STATUS_OFFSET, 0x0); - if (mps_wait_db_ack(sc) != 0) { + if (mps_wait_db_ack(sc, 5, sleep_flags) != 0) { mps_dprint(sc, MPS_FAULT, "Doorbell handshake failed\n"); return (ENXIO); } @@ -439,8 +505,8 @@ mps_request_sync(struct mps_softc *sc, void *req, MPI2_DEFAULT_REPLY *reply, /* Clock out the message data synchronously in 32-bit dwords*/ data32 = (uint32_t *)req; for (i = 0; i < count; i++) { - mps_regwrite(sc, MPI2_DOORBELL_OFFSET, data32[i]); - if (mps_wait_db_ack(sc) != 0) { + mps_regwrite(sc, MPI2_DOORBELL_OFFSET, htole32(data32[i])); + if (mps_wait_db_ack(sc, 5, sleep_flags) != 0) { mps_dprint(sc, MPS_FAULT, "Timeout while writing doorbell\n"); return (ENXIO); @@ -525,7 +591,7 @@ mps_request_sync(struct mps_softc *sc, void *req, MPI2_DEFAULT_REPLY *reply, static void mps_enqueue_request(struct mps_softc *sc, struct mps_command *cm) { - + reply_descriptor rd; mps_dprint(sc, MPS_TRACE, "%s SMID %u cm %p ccb %p\n", __func__, cm->cm_desc.Default.SMID, cm, cm->cm_ccb); @@ -534,11 +600,14 @@ mps_enqueue_request(struct mps_softc *sc, struct mps_command *cm) if (++sc->io_cmds_active > sc->io_cmds_highwater) sc->io_cmds_highwater++; - + rd.u.low = cm->cm_desc.Words.Low; + rd.u.high = cm->cm_desc.Words.High; + rd.word = htole64(rd.word); + /* TODO-We may need to make below regwrite atomic */ mps_regwrite(sc, MPI2_REQUEST_DESCRIPTOR_POST_LOW_OFFSET, - cm->cm_desc.Words.Low); + rd.u.low); mps_regwrite(sc, MPI2_REQUEST_DESCRIPTOR_POST_HIGH_OFFSET, - cm->cm_desc.Words.High); + rd.u.high); } /* @@ -622,21 +691,21 @@ mps_send_iocinit(struct mps_softc *sc) */ init.Function = MPI2_FUNCTION_IOC_INIT; init.WhoInit = MPI2_WHOINIT_HOST_DRIVER; - init.MsgVersion = MPI2_VERSION; - init.HeaderVersion = MPI2_HEADER_VERSION; - init.SystemRequestFrameSize = sc->facts->IOCRequestFrameSize; - init.ReplyDescriptorPostQueueDepth = sc->pqdepth; - init.ReplyFreeQueueDepth = sc->fqdepth; + init.MsgVersion = htole16(MPI2_VERSION); + init.HeaderVersion = htole16(MPI2_HEADER_VERSION); + init.SystemRequestFrameSize = htole16(sc->facts->IOCRequestFrameSize); + init.ReplyDescriptorPostQueueDepth = htole16(sc->pqdepth); + init.ReplyFreeQueueDepth = htole16(sc->fqdepth); init.SenseBufferAddressHigh = 0; init.SystemReplyAddressHigh = 0; init.SystemRequestFrameBaseAddress.High = 0; - init.SystemRequestFrameBaseAddress.Low = (uint32_t)sc->req_busaddr; + init.SystemRequestFrameBaseAddress.Low = htole32((uint32_t)sc->req_busaddr); init.ReplyDescriptorPostQueueAddress.High = 0; - init.ReplyDescriptorPostQueueAddress.Low = (uint32_t)sc->post_busaddr; + init.ReplyDescriptorPostQueueAddress.Low = htole32((uint32_t)sc->post_busaddr); init.ReplyFreeQueueAddress.High = 0; - init.ReplyFreeQueueAddress.Low = (uint32_t)sc->free_busaddr; + init.ReplyFreeQueueAddress.Low = htole32((uint32_t)sc->free_busaddr); init.TimeStamp.High = 0; - init.TimeStamp.Low = (uint32_t)time_uptime; + init.TimeStamp.Low = htole32((uint32_t)time_uptime); error = mps_request_sync(sc, &init, &reply, req_sz, reply_sz, 5); if ((reply.IOCStatus & MPI2_IOCSTATUS_MASK) != MPI2_IOCSTATUS_SUCCESS) @@ -830,6 +899,12 @@ mps_alloc_requests(struct mps_softc *sc) sc->chains = malloc(sizeof(struct mps_chain) * sc->max_chains, M_MPT2, M_WAITOK | M_ZERO); + if(!sc->chains) { + device_printf(sc->mps_dev, + "Cannot allocate chains memory %s %d\n", + __func__, __LINE__); + return (ENOMEM); + } for (i = 0; i < sc->max_chains; i++) { chain = &sc->chains[i]; chain->chain = (MPI2_SGE_IO_UNION *)(sc->chain_frames + @@ -864,6 +939,11 @@ mps_alloc_requests(struct mps_softc *sc) */ sc->commands = malloc(sizeof(struct mps_command) * sc->num_reqs, M_MPT2, M_WAITOK | M_ZERO); + if(!sc->commands) { + device_printf(sc->mps_dev, "Cannot allocate memory %s %d\n", + __func__, __LINE__); + return (ENOMEM); + } for (i = 1; i < sc->num_reqs; i++) { cm = &sc->commands[i]; cm->cm_req = sc->req_frames + @@ -1056,6 +1136,11 @@ mps_attach(struct mps_softc *sc) sc->facts = malloc(sizeof(MPI2_IOC_FACTS_REPLY), M_MPT2, M_ZERO|M_NOWAIT); + if(!sc->facts) { + device_printf(sc->mps_dev, "Cannot allocate memory %s %d\n", + __func__, __LINE__); + return (ENOMEM); + } if ((error = mps_get_iocfacts(sc, sc->facts)) != 0) return (error); @@ -1083,7 +1168,7 @@ mps_attach(struct mps_softc *sc) */ if ((sc->facts->IOCCapabilities & MPI2_IOCFACTS_CAPABILITY_EVENT_REPLAY) == 0) { - mps_diag_reset(sc); + mps_diag_reset(sc, NO_SLEEP); if ((error = mps_transition_ready(sc)) != 0) return (error); } @@ -1163,6 +1248,11 @@ mps_attach(struct mps_softc *sc) sc->pfacts = malloc(sizeof(MPI2_PORT_FACTS_REPLY) * sc->facts->NumberOfPorts, M_MPT2, M_ZERO|M_WAITOK); + if(!sc->pfacts) { + device_printf(sc->mps_dev, "Cannot allocate memory %s %d\n", + __func__, __LINE__); + return (ENOMEM); + } for (i = 0; i < sc->facts->NumberOfPorts; i++) { if ((error = mps_get_portfacts(sc, &sc->pfacts[i], i)) != 0) { mps_printf(sc, "%s failed to get portfacts for port %d\n", @@ -1293,7 +1383,7 @@ mps_log_evt_handler(struct mps_softc *sc, uintptr_t data, static int mps_attach_log(struct mps_softc *sc) { - uint8_t events[16]; + u32 events[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS]; bzero(events, 16); setbit(events, MPI2_EVENT_LOG_DATA); @@ -1441,6 +1531,64 @@ mps_complete_command(struct mps_command *cm) } } + +static void +mps_sas_log_info(struct mps_softc *sc , u32 log_info) +{ + union loginfo_type { + u32 loginfo; + struct { + u32 subcode:16; + u32 code:8; + u32 originator:4; + u32 bus_type:4; + } dw; + }; + union loginfo_type sas_loginfo; + char *originator_str = NULL; + + sas_loginfo.loginfo = log_info; + if (sas_loginfo.dw.bus_type != 3 /*SAS*/) + return; + + /* each nexus loss loginfo */ + if (log_info == 0x31170000) + return; + + /* eat the loginfos associated with task aborts */ + if ((log_info == 30050000 || log_info == + 0x31140000 || log_info == 0x31130000)) + return; + + switch (sas_loginfo.dw.originator) { + case 0: + originator_str = "IOP"; + break; + case 1: + originator_str = "PL"; + break; + case 2: + originator_str = "IR"; + break; +} + + mps_dprint(sc, MPS_INFO, "log_info(0x%08x): originator(%s), " + "code(0x%02x), sub_code(0x%04x)\n", log_info, + originator_str, sas_loginfo.dw.code, + sas_loginfo.dw.subcode); +} + +static void +mps_display_reply_info(struct mps_softc *sc, uint8_t *reply) +{ + MPI2DefaultReply_t *mpi_reply; + u16 sc_status; + + mpi_reply = (MPI2DefaultReply_t*)reply; + sc_status = le16toh(mpi_reply->IOCStatus); + if (sc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) + mps_sas_log_info(sc, le32toh(mpi_reply->IOCLogInfo)); +} void mps_intr(void *data) { @@ -1508,7 +1656,7 @@ mps_intr_locked(void *data) flags = desc->Default.ReplyFlags & MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK; if ((flags == MPI2_RPY_DESCRIPT_FLAGS_UNUSED) - || (desc->Words.High == 0xffffffff)) + || (le32toh(desc->Words.High) == 0xffffffff)) break; /* increment the replypostindex now, so that event handlers @@ -1523,7 +1671,7 @@ mps_intr_locked(void *data) switch (flags) { case MPI2_RPY_DESCRIPT_FLAGS_SCSI_IO_SUCCESS: - cm = &sc->commands[desc->SCSIIOSuccess.SMID]; + cm = &sc->commands[le16toh(desc->SCSIIOSuccess.SMID)]; cm->cm_reply = NULL; break; case MPI2_RPY_DESCRIPT_FLAGS_ADDRESS_REPLY: @@ -1559,9 +1707,10 @@ mps_intr_locked(void *data) sc->reply_frames, sc->fqdepth, sc->facts->ReplyFrameSize * 4); printf("%s: baddr %#x,\n", __func__, baddr); + /* LSI-TODO. See Linux Code. Need Gracefull exit*/ panic("Reply address out of range"); } - if (desc->AddressReply.SMID == 0) { + if (le16toh(desc->AddressReply.SMID) == 0) { if (((MPI2_DEFAULT_REPLY *)reply)->Function == MPI2_FUNCTION_DIAG_BUFFER_POST) { /* @@ -1573,7 +1722,7 @@ mps_intr_locked(void *data) */ rel_rep = (MPI2_DIAG_RELEASE_REPLY *)reply; - if (rel_rep->IOCStatus == + if (le16toh(rel_rep->IOCStatus) == MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED) { pBuffer = @@ -1589,10 +1738,10 @@ mps_intr_locked(void *data) (MPI2_EVENT_NOTIFICATION_REPLY *) reply); } else { - cm = &sc->commands[desc->AddressReply.SMID]; + cm = &sc->commands[le16toh(desc->AddressReply.SMID)]; cm->cm_reply = reply; cm->cm_reply_data = - desc->AddressReply.ReplyFrameAddress; + le32toh(desc->AddressReply.ReplyFrameAddress); } break; } @@ -1606,9 +1755,14 @@ mps_intr_locked(void *data) cm = NULL; break; } + - if (cm != NULL) + if (cm != NULL) { + // Print Error reply frame + if (cm->cm_reply) + mps_display_reply_info(sc,cm->cm_reply); mps_complete_command(cm); + } desc->Words.Low = 0xffffffff; desc->Words.High = 0xffffffff; @@ -1631,7 +1785,7 @@ mps_dispatch_event(struct mps_softc *sc, uintptr_t data, struct mps_event_handle *eh; int event, handled = 0; - event = reply->Event; + event = le16toh(reply->Event); TAILQ_FOREACH(eh, &sc->event_list, eh_list) { if (isset(eh->mask, event)) { eh->callback(sc, data, reply); @@ -1640,7 +1794,7 @@ mps_dispatch_event(struct mps_softc *sc, uintptr_t data, } if (handled == 0) - device_printf(sc->mps_dev, "Unhandled event 0x%x\n", event); + device_printf(sc->mps_dev, "Unhandled event 0x%x\n", le16toh(event)); /* * This is the only place that the event/reply should be freed. @@ -1671,13 +1825,18 @@ mps_reregister_events_complete(struct mps_softc *sc, struct mps_command *cm) * suitable for the controller. */ int -mps_register_events(struct mps_softc *sc, uint8_t *mask, +mps_register_events(struct mps_softc *sc, u32 *mask, mps_evt_callback_t *cb, void *data, struct mps_event_handle **handle) { struct mps_event_handle *eh; int error = 0; eh = malloc(sizeof(struct mps_event_handle), M_MPT2, M_WAITOK|M_ZERO); + if(!eh) { + device_printf(sc->mps_dev, "Cannot allocate memory %s %d\n", + __func__, __LINE__); + return (ENOMEM); + } eh->callback = cb; eh->data = data; TAILQ_INSERT_TAIL(&sc->event_list, eh, eh_list); @@ -1690,24 +1849,25 @@ mps_register_events(struct mps_softc *sc, uint8_t *mask, int mps_update_events(struct mps_softc *sc, struct mps_event_handle *handle, - uint8_t *mask) + u32 *mask) { MPI2_EVENT_NOTIFICATION_REQUEST *evtreq; MPI2_EVENT_NOTIFICATION_REPLY *reply; struct mps_command *cm; - struct mps_event_handle *eh; int error, i; mps_dprint(sc, MPS_TRACE, "%s\n", __func__); if ((mask != NULL) && (handle != NULL)) - bcopy(mask, &handle->mask[0], 16); - memset(sc->event_mask, 0xff, 16); + bcopy(mask, &handle->mask[0], sizeof(u32) * + MPI2_EVENT_NOTIFY_EVENTMASK_WORDS); + + for (i = 0; i < MPI2_EVENT_NOTIFY_EVENTMASK_WORDS; i++) + sc->event_mask[i] = -1; + + for (i = 0; i < MPI2_EVENT_NOTIFY_EVENTMASK_WORDS; i++) + sc->event_mask[i] &= ~handle->mask[i]; - TAILQ_FOREACH(eh, &sc->event_list, eh_list) { - for (i = 0; i < 16; i++) - sc->event_mask[i] &= ~eh->mask[i]; - } if ((cm = mps_alloc_command(sc)) == NULL) return (EBUSY); @@ -1719,10 +1879,13 @@ mps_update_events(struct mps_softc *sc, struct mps_event_handle *handle, { u_char fullmask[16]; memset(fullmask, 0x00, 16); - bcopy(fullmask, (uint8_t *)&evtreq->EventMasks, 16); + bcopy(fullmask, &evtreq->EventMasks[0], sizeof(u32) * + MPI2_EVENT_NOTIFY_EVENTMASK_WORDS); } #else - bcopy(sc->event_mask, (uint8_t *)&evtreq->EventMasks, 16); + for (i = 0; i < MPI2_EVENT_NOTIFY_EVENTMASK_WORDS; i++) + evtreq->EventMasks[i] = + htole32(sc->event_mask[i]); #endif cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; cm->cm_data = NULL; @@ -1751,10 +1914,11 @@ mps_reregister_events(struct mps_softc *sc) /* first, reregister events */ - memset(sc->event_mask, 0xff, 16); + for (i = 0; i < MPI2_EVENT_NOTIFY_EVENTMASK_WORDS; i++) + sc->event_mask[i] = -1; TAILQ_FOREACH(eh, &sc->event_list, eh_list) { - for (i = 0; i < 16; i++) + for (i = 0; i < MPI2_EVENT_NOTIFY_EVENTMASK_WORDS; i++) sc->event_mask[i] &= ~eh->mask[i]; } @@ -1768,10 +1932,13 @@ mps_reregister_events(struct mps_softc *sc) { u_char fullmask[16]; memset(fullmask, 0x00, 16); - bcopy(fullmask, (uint8_t *)&evtreq->EventMasks, 16); + bcopy(fullmask, &evtreq->EventMasks[0], sizeof(u32) * + MPI2_EVENT_NOTIFY_EVENTMASK_WORDS); } #else - bcopy(sc->event_mask, (uint8_t *)&evtreq->EventMasks, 16); + for (i = 0; i < MPI2_EVENT_NOTIFY_EVENTMASK_WORDS; i++) + evtreq->EventMasks[i] = + htole32(sc->event_mask[i]); #endif cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; cm->cm_data = NULL; @@ -1783,13 +1950,12 @@ mps_reregister_events(struct mps_softc *sc) return (error); } -int +void mps_deregister_events(struct mps_softc *sc, struct mps_event_handle *handle) { TAILQ_REMOVE(&sc->event_list, handle, eh_list); free(handle, M_MPT2); - return (mps_update_events(sc, NULL, NULL)); } /* @@ -1819,10 +1985,16 @@ mps_add_chain(struct mps_command *cm) TAILQ_INSERT_TAIL(&cm->cm_chain_list, chain, chain_link); sgc = (MPI2_SGE_CHAIN32 *)&cm->cm_sge->MpiChain; - sgc->Length = space; + sgc->Length = htole16(space); sgc->NextChainOffset = 0; + /* TODO Looks like bug in Setting sgc->Flags. + * sgc->Flags = ( MPI2_SGE_FLAGS_CHAIN_ELEMENT | MPI2_SGE_FLAGS_64_BIT_ADDRESSING | + * MPI2_SGE_FLAGS_SYSTEM_ADDRESS) << MPI2_SGE_FLAGS_SHIFT + * This is fine.. because we are not using simple element. In case of + * MPI2_SGE_CHAIN32, we have seperate Length and Flags feild. + */ sgc->Flags = MPI2_SGE_FLAGS_CHAIN_ELEMENT; - sgc->Address = chain->chain_busaddr; + sgc->Address = htole32(chain->chain_busaddr); cm->cm_sge = (MPI2_SGE_IO_UNION *)&chain->chain->MpiSimple; cm->cm_sglsize = space; @@ -1842,6 +2014,7 @@ mps_push_sge(struct mps_command *cm, void *sgep, size_t len, int segsleft) MPI2_SGE_SIMPLE64 *sge = sgep; int error, type; uint32_t saved_buf_len, saved_address_low, saved_address_high; + u32 sge_flags; type = (tc->Flags & MPI2_SGE_FLAGS_ELEMENT_MASK); @@ -1910,6 +2083,11 @@ mps_push_sge(struct mps_command *cm, void *sgep, size_t len, int segsleft) * understanding the code. */ cm->cm_sglsize -= len; + /* Endian Safe code */ + sge_flags = sge->FlagsLength; + sge->FlagsLength = htole32(sge_flags); + sge->Address.High = htole32(sge->Address.High); + sge->Address.Low = htole32(sge->Address.Low); bcopy(sgep, cm->cm_sge, len); cm->cm_sge = (MPI2_SGE_IO_UNION *)((uintptr_t)cm->cm_sge + len); return (mps_add_chain(cm)); @@ -1960,6 +2138,11 @@ mps_push_sge(struct mps_command *cm, void *sgep, size_t len, int segsleft) MPI2_SGE_FLAGS_64_BIT_ADDRESSING) << MPI2_SGE_FLAGS_SHIFT); cm->cm_sglsize -= len; + /* Endian Safe code */ + sge_flags = sge->FlagsLength; + sge->FlagsLength = htole32(sge_flags); + sge->Address.High = htole32(sge->Address.High); + sge->Address.Low = htole32(sge->Address.Low); bcopy(sgep, cm->cm_sge, len); cm->cm_sge = (MPI2_SGE_IO_UNION *)((uintptr_t)cm->cm_sge + len); @@ -1985,6 +2168,11 @@ mps_push_sge(struct mps_command *cm, void *sgep, size_t len, int segsleft) } cm->cm_sglsize -= len; + /* Endian Safe code */ + sge_flags = sge->FlagsLength; + sge->FlagsLength = htole32(sge_flags); + sge->Address.High = htole32(sge->Address.High); + sge->Address.Low = htole32(sge->Address.Low); bcopy(sgep, cm->cm_sge, len); cm->cm_sge = (MPI2_SGE_IO_UNION *)((uintptr_t)cm->cm_sge + len); return (0); @@ -2004,6 +2192,7 @@ mps_add_dmaseg(struct mps_command *cm, vm_paddr_t pa, size_t len, u_int flags, */ flags |= MPI2_SGE_FLAGS_SIMPLE_ELEMENT | MPI2_SGE_FLAGS_64_BIT_ADDRESSING; + /* Set Endian safe macro in mps_push_sge */ sge.FlagsLength = len | (flags << MPI2_SGE_FLAGS_SHIFT); mps_from_u64(pa, &sge.Address); @@ -2114,11 +2303,11 @@ mps_map_command(struct mps_softc *sc, struct mps_command *cm) /* Add a zero-length element as needed */ if (cm->cm_sge != NULL) { sge = (MPI2_SGE_SIMPLE32 *)cm->cm_sge; - sge->FlagsLength = (MPI2_SGE_FLAGS_LAST_ELEMENT | + sge->FlagsLength = htole32((MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_END_OF_LIST | MPI2_SGE_FLAGS_SIMPLE_ELEMENT) << - MPI2_SGE_FLAGS_SHIFT; + MPI2_SGE_FLAGS_SHIFT); sge->Address = 0; } mps_enqueue_request(sc, cm); @@ -2135,9 +2324,12 @@ mps_map_command(struct mps_softc *sc, struct mps_command *cm) int mps_wait_command(struct mps_softc *sc, struct mps_command *cm, int timeout) { - int error; + int error, rc; mtx_assert(&sc->mps_mtx, MA_OWNED); + + if(sc->mps_flags & MPS_FLAGS_DIAGRESET) + return EBUSY; cm->cm_complete = NULL; cm->cm_flags |= MPS_CM_FLAGS_WAKEUP; @@ -2145,8 +2337,13 @@ mps_wait_command(struct mps_softc *sc, struct mps_command *cm, int timeout) if ((error != 0) && (error != EINPROGRESS)) return (error); error = msleep(cm, &sc->mps_mtx, 0, "mpswait", timeout*hz); - if (error == EWOULDBLOCK) + if (error == EWOULDBLOCK) { + mps_dprint(sc, MPS_FAULT, "Calling Reinit from %s\n", __func__); + rc = mps_reinit(sc); + mps_dprint(sc, MPS_FAULT, "Reinit %s\n", + (rc == 0) ? "success" : "failed"); error = ETIMEDOUT; + } return (error); } @@ -2157,7 +2354,7 @@ mps_wait_command(struct mps_softc *sc, struct mps_command *cm, int timeout) int mps_request_polled(struct mps_softc *sc, struct mps_command *cm) { - int error, timeout = 0; + int error, timeout = 0, rc; error = 0; @@ -2167,6 +2364,7 @@ mps_request_polled(struct mps_softc *sc, struct mps_command *cm) while ((cm->cm_flags & MPS_CM_FLAGS_COMPLETE) == 0) { mps_intr_locked(sc); + DELAY(50 * 1000); if (timeout++ > 1000) { mps_dprint(sc, MPS_FAULT, "polling failed\n"); @@ -2174,6 +2372,13 @@ mps_request_polled(struct mps_softc *sc, struct mps_command *cm) break; } } + + if (error) { + mps_dprint(sc, MPS_FAULT, "Calling Reinit from %s\n", __func__); + rc = mps_reinit(sc); + mps_dprint(sc, MPS_FAULT, "Reinit %s\n", + (rc == 0) ? "success" : "failed"); + } return (error); } diff --git a/sys/dev/mps/mps_config.c b/sys/dev/mps/mps_config.c index da1f3fd288d..939872e8faa 100644 --- a/sys/dev/mps/mps_config.c +++ b/sys/dev/mps/mps_config.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -680,6 +680,7 @@ int mps_config_set_dpm_pg0(struct mps_softc *sc, Mpi2ConfigReply_t *mpi_reply, request->ExtPageType = MPI2_CONFIG_EXTPAGETYPE_DRIVER_MAPPING; request->Header.PageNumber = 0; request->Header.PageVersion = MPI2_DRIVERMAPPING0_PAGEVERSION; + /* We can remove below two lines ????*/ request->PageAddress = 1 << MPI2_DPM_PGAD_ENTRY_COUNT_SHIFT; request->PageAddress |= htole16(entry_idx); cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; diff --git a/sys/dev/mps/mps_ioctl.h b/sys/dev/mps/mps_ioctl.h index cc283372293..a52f80ed1b5 100644 --- a/sys/dev/mps/mps_ioctl.h +++ b/sys/dev/mps/mps_ioctl.h @@ -32,7 +32,7 @@ * $FreeBSD$ */ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/sys/dev/mps/mps_mapping.c b/sys/dev/mps/mps_mapping.c index e897dd3f260..870535eb6d9 100644 --- a/sys/dev/mps/mps_mapping.c +++ b/sys/dev/mps/mps_mapping.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/sys/dev/mps/mps_mapping.h b/sys/dev/mps/mps_mapping.h index 5e1877b0e30..e188d8f38c9 100644 --- a/sys/dev/mps/mps_mapping.h +++ b/sys/dev/mps/mps_mapping.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/sys/dev/mps/mps_sas.c b/sys/dev/mps/mps_sas.c index 65009bc7fc8..ecdc10e7528 100644 --- a/sys/dev/mps/mps_sas.c +++ b/sys/dev/mps/mps_sas.c @@ -1,30 +1,6 @@ /*- * Copyright (c) 2009 Yahoo! Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -/*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -302,8 +278,11 @@ mpssas_rescan_target(struct mps_softc *sc, struct mpssas_target *targ) return; } - /* XXX Hardwired to scan the bus for now */ - ccb->ccb_h.func_code = XPT_SCAN_BUS; + if (targetid == CAM_TARGET_WILDCARD) + ccb->ccb_h.func_code = XPT_SCAN_BUS; + else + ccb->ccb_h.func_code = XPT_SCAN_TGT; + mps_dprint(sc, MPS_TRACE, "%s targetid %u\n", __func__, targetid); mpssas_rescan(sassc, ccb); } @@ -488,16 +467,7 @@ mpssas_prepare_remove(struct mpssas_softc *sassc, uint16_t handle) mps_dprint(sassc->sc, MPS_INFO, "%s\n", __func__); - /* - * If this is a WD controller, determine if the disk should be exposed - * to the OS or not. If disk should be exposed, return from this - * function without doing anything. - */ sc = sassc->sc; - if ((sc->mps_flags & MPS_FLAGS_WD_AVAILABLE) && (sc->WD_hide_expose == - MPS_WD_EXPOSE_ALWAYS)) { - return; - } targ = mpssas_find_target_by_handle(sassc, 0, handle); if (targ == NULL) { @@ -519,7 +489,7 @@ mpssas_prepare_remove(struct mpssas_softc *sassc, uint16_t handle) req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)cm->cm_req; memset(req, 0, sizeof(*req)); - req->DevHandle = targ->handle; + req->DevHandle = htole16(targ->handle); req->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET; @@ -570,15 +540,15 @@ mpssas_remove_device(struct mps_softc *sc, struct mps_command *tm) return; } - if (reply->IOCStatus != MPI2_IOCSTATUS_SUCCESS) { + if (le16toh(reply->IOCStatus) != MPI2_IOCSTATUS_SUCCESS) { mps_printf(sc, "IOCStatus = 0x%x while resetting device 0x%x\n", - reply->IOCStatus, handle); + le16toh(reply->IOCStatus), handle); mpssas_free_tm(sc, tm); return; } mps_dprint(sc, MPS_INFO, "Reset aborted %u commands\n", - reply->TerminationCount); + le32toh(reply->TerminationCount)); mps_free_reply(sc, tm->cm_reply_data); tm->cm_reply = NULL; /* Ensures the the reply won't get re-freed */ @@ -587,7 +557,7 @@ mpssas_remove_device(struct mps_softc *sc, struct mps_command *tm) memset(req, 0, sizeof(*req)); req->Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL; req->Operation = MPI2_SAS_OP_REMOVE_DEVICE; - req->DevHandle = handle; + req->DevHandle = htole16(handle); tm->cm_data = NULL; tm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; tm->cm_complete = mpssas_remove_complete; @@ -613,6 +583,7 @@ mpssas_remove_complete(struct mps_softc *sc, struct mps_command *tm) MPI2_SAS_IOUNIT_CONTROL_REPLY *reply; uint16_t handle; struct mpssas_target *targ; + struct mpssas_lun *lun; mps_dprint(sc, MPS_INFO, "%s\n", __func__); @@ -641,7 +612,7 @@ mpssas_remove_complete(struct mps_softc *sc, struct mps_command *tm) } mps_printf(sc, "%s on handle 0x%04x, IOCStatus= 0x%x\n", __func__, - handle, reply->IOCStatus); + handle, le16toh(reply->IOCStatus)); /* * Don't clear target if remove fails because things will get confusing. @@ -649,7 +620,7 @@ mpssas_remove_complete(struct mps_softc *sc, struct mps_command *tm) * this target id if possible, and so we can assign the same target id * to this device if it comes back in the future. */ - if (reply->IOCStatus == MPI2_IOCSTATUS_SUCCESS) { + if (le16toh(reply->IOCStatus) == MPI2_IOCSTATUS_SUCCESS) { targ = tm->cm_targ; targ->handle = 0x0; targ->encl_handle = 0x0; @@ -659,7 +630,14 @@ mpssas_remove_complete(struct mps_softc *sc, struct mps_command *tm) targ->linkrate = 0x0; targ->devinfo = 0x0; targ->flags = 0x0; + + while(!SLIST_EMPTY(&targ->luns)) { + lun = SLIST_FIRST(&targ->luns); + SLIST_REMOVE_HEAD(&targ->luns, lun_link); + free(lun, M_MPT2); + } } + mpssas_free_tm(sc, tm); } @@ -667,7 +645,7 @@ mpssas_remove_complete(struct mps_softc *sc, struct mps_command *tm) static int mpssas_register_events(struct mps_softc *sc) { - uint8_t events[16]; + u32 events[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS]; bzero(events, 16); setbit(events, MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE); @@ -701,8 +679,19 @@ mps_attach_sas(struct mps_softc *sc) mps_dprint(sc, MPS_TRACE, "%s\n", __func__); sassc = malloc(sizeof(struct mpssas_softc), M_MPT2, M_WAITOK|M_ZERO); + if(!sassc) { + device_printf(sc->mps_dev, "Cannot allocate memory %s %d\n", + __func__, __LINE__); + return (ENOMEM); + } sassc->targets = malloc(sizeof(struct mpssas_target) * sc->facts->MaxTargets, M_MPT2, M_WAITOK|M_ZERO); + if(!sassc->targets) { + device_printf(sc->mps_dev, "Cannot allocate memory %s %d\n", + __func__, __LINE__); + free(sassc, M_MPT2); + return (ENOMEM); + } sc->sassc = sassc; sassc->sc = sc; @@ -790,6 +779,9 @@ int mps_detach_sas(struct mps_softc *sc) { struct mpssas_softc *sassc; + struct mpssas_lun *lun, *lun_tmp; + struct mpssas_target *targ; + int i; mps_dprint(sc, MPS_INFO, "%s\n", __func__); @@ -838,6 +830,12 @@ mps_detach_sas(struct mps_softc *sc) if (sassc->devq != NULL) cam_simq_free(sassc->devq); + for(i=0; i< sc->facts->MaxTargets ;i++) { + targ = &sassc->targets[i]; + SLIST_FOREACH_SAFE(lun, &targ->luns, lun_link, lun_tmp) { + free(lun, M_MPT2); + } + } free(sassc->targets, M_MPT2); free(sassc, M_MPT2); sc->sassc = NULL; @@ -919,7 +917,7 @@ mpssas_action(struct cam_sim *sim, union ccb *ccb) cpi->hba_misc = PIM_NOBUSRESET; cpi->hba_eng_cnt = 0; cpi->max_target = sassc->sc->facts->MaxTargets - 1; - cpi->max_lun = 8; + cpi->max_lun = 255; cpi->initiator_id = 255; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "LSILogic", HBA_IDLEN); @@ -953,7 +951,7 @@ mpssas_action(struct cam_sim *sim, union ccb *ccb) targ = &sassc->targets[cts->ccb_h.target_id]; if (targ->handle == 0x0) { - cts->ccb_h.status = CAM_TID_INVALID; + cts->ccb_h.status = CAM_SEL_TIMEOUT; break; } @@ -1185,8 +1183,8 @@ mpssas_logical_unit_reset_complete(struct mps_softc *sc, struct mps_command *tm) mpssas_log_command(tm, "logical unit reset status 0x%x code 0x%x count %u\n", - reply->IOCStatus, reply->ResponseCode, - reply->TerminationCount); + le16toh(reply->IOCStatus), le32toh(reply->ResponseCode), + le32toh(reply->TerminationCount)); /* See if there are any outstanding commands for this LUN. * This could be made more efficient by using a per-LU data @@ -1273,8 +1271,8 @@ mpssas_target_reset_complete(struct mps_softc *sc, struct mps_command *tm) mpssas_log_command(tm, "target reset status 0x%x code 0x%x count %u\n", - reply->IOCStatus, reply->ResponseCode, - reply->TerminationCount); + le16toh(reply->IOCStatus), le32toh(reply->ResponseCode), + le32toh(reply->TerminationCount)); targ->flags &= ~MPSSAS_TARGET_INRESET; @@ -1320,7 +1318,7 @@ mpssas_send_reset(struct mps_softc *sc, struct mps_command *tm, uint8_t type) } req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; - req->DevHandle = target->handle; + req->DevHandle = htole16(target->handle); req->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; req->TaskType = type; @@ -1383,7 +1381,7 @@ mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm) if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { mpssas_log_command(tm, "cm_flags = %#x for abort %p TaskMID %u!\n", - tm->cm_flags, tm, req->TaskMID); + tm->cm_flags, tm, le16toh(req->TaskMID)); mpssas_free_tm(sc, tm); return; } @@ -1391,7 +1389,7 @@ mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm) if (reply == NULL) { mpssas_log_command(tm, "NULL abort reply for tm %p TaskMID %u\n", - tm, req->TaskMID); + tm, le16toh(req->TaskMID)); if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) { /* this completion was due to a reset, just cleanup */ targ->tm = NULL; @@ -1406,9 +1404,9 @@ mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm) mpssas_log_command(tm, "abort TaskMID %u status 0x%x code 0x%x count %u\n", - req->TaskMID, - reply->IOCStatus, reply->ResponseCode, - reply->TerminationCount); + le16toh(req->TaskMID), + le16toh(reply->IOCStatus), le32toh(reply->ResponseCode), + le32toh(reply->TerminationCount)); cm = TAILQ_FIRST(&tm->cm_targ->timedout_commands); if (cm == NULL) { @@ -1417,16 +1415,16 @@ mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm) */ mpssas_log_command(tm, "finished recovery after aborting TaskMID %u\n", - req->TaskMID); + le16toh(req->TaskMID)); targ->tm = NULL; mpssas_free_tm(sc, tm); } - else if (req->TaskMID != cm->cm_desc.Default.SMID) { + else if (le16toh(req->TaskMID) != cm->cm_desc.Default.SMID) { /* abort success, but we have more timedout commands to abort */ mpssas_log_command(tm, "continuing recovery after aborting TaskMID %u\n", - req->TaskMID); + le16toh(req->TaskMID)); mpssas_send_abort(sc, tm, cm); } @@ -1436,7 +1434,7 @@ mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm) */ mpssas_log_command(tm, "abort failed for TaskMID %u tm %p\n", - req->TaskMID, tm); + le16toh(req->TaskMID), tm); mpssas_send_reset(sc, tm, MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET); @@ -1460,14 +1458,14 @@ mpssas_send_abort(struct mps_softc *sc, struct mps_command *tm, struct mps_comma } req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; - req->DevHandle = targ->handle; + req->DevHandle = htole16(targ->handle); req->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK; /* XXX Need to handle invalid LUNs */ MPS_SET_LUN(req->LUN, cm->cm_ccb->ccb_h.target_lun); - req->TaskMID = cm->cm_desc.Default.SMID; + req->TaskMID = htole16(cm->cm_desc.Default.SMID); tm->cm_data = NULL; tm->cm_desc.HighPriority.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY; @@ -1575,6 +1573,7 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb) struct mps_command *cm; uint8_t i, lba_byte, *ref_tag_addr; uint16_t eedp_flags; + uint32_t mpi_control; sc = sassc->sc; mtx_assert(&sc->mps_mtx, MA_OWNED); @@ -1585,7 +1584,7 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb) if (targ->handle == 0x0) { mps_dprint(sc, MPS_TRACE, "%s NULL handle for target %u\n", __func__, csio->ccb_h.target_id); - csio->ccb_h.status = CAM_TID_INVALID; + csio->ccb_h.status = CAM_SEL_TIMEOUT; xpt_done(ccb); return; } @@ -1631,10 +1630,10 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb) req = (MPI2_SCSI_IO_REQUEST *)cm->cm_req; bzero(req, sizeof(*req)); - req->DevHandle = targ->handle; + req->DevHandle = htole16(targ->handle); req->Function = MPI2_FUNCTION_SCSI_IO_REQUEST; req->MsgFlags = 0; - req->SenseBufferLowAddress = cm->cm_sense_busaddr; + req->SenseBufferLowAddress = htole32(cm->cm_sense_busaddr); req->SenseBufferLength = MPS_SENSE_LEN; req->SGLFlags = 0; req->ChainOffset = 0; @@ -1643,27 +1642,29 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb) req->SGLOffset2= 0; req->SGLOffset3= 0; req->SkipCount = 0; - req->DataLength = csio->dxfer_len; + req->DataLength = htole32(csio->dxfer_len); req->BidirectionalDataLength = 0; - req->IoFlags = csio->cdb_len; + req->IoFlags = htole16(csio->cdb_len); req->EEDPFlags = 0; /* Note: BiDirectional transfers are not supported */ switch (csio->ccb_h.flags & CAM_DIR_MASK) { case CAM_DIR_IN: - req->Control = MPI2_SCSIIO_CONTROL_READ; + mpi_control = MPI2_SCSIIO_CONTROL_READ; cm->cm_flags |= MPS_CM_FLAGS_DATAIN; break; case CAM_DIR_OUT: - req->Control = MPI2_SCSIIO_CONTROL_WRITE; + mpi_control = MPI2_SCSIIO_CONTROL_WRITE; cm->cm_flags |= MPS_CM_FLAGS_DATAOUT; break; case CAM_DIR_NONE: default: - req->Control = MPI2_SCSIIO_CONTROL_NODATATRANSFER; + mpi_control = MPI2_SCSIIO_CONTROL_NODATATRANSFER; break; } - + + if (csio->cdb_len == 32) + mpi_control |= 4 << MPI2_SCSIIO_CONTROL_ADDCDBLEN_SHIFT; /* * It looks like the hardware doesn't require an explicit tag * number for each transaction. SAM Task Management not supported @@ -1671,22 +1672,22 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb) */ switch (csio->tag_action) { case MSG_HEAD_OF_Q_TAG: - req->Control |= MPI2_SCSIIO_CONTROL_HEADOFQ; + mpi_control |= MPI2_SCSIIO_CONTROL_HEADOFQ; break; case MSG_ORDERED_Q_TAG: - req->Control |= MPI2_SCSIIO_CONTROL_ORDEREDQ; + mpi_control |= MPI2_SCSIIO_CONTROL_ORDEREDQ; break; case MSG_ACA_TASK: - req->Control |= MPI2_SCSIIO_CONTROL_ACAQ; + mpi_control |= MPI2_SCSIIO_CONTROL_ACAQ; break; case CAM_TAG_ACTION_NONE: case MSG_SIMPLE_Q_TAG: default: - req->Control |= MPI2_SCSIIO_CONTROL_SIMPLEQ; + mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ; break; } - req->Control |= sc->mapping_table[csio->ccb_h.target_id].TLR_bits; - + mpi_control |= sc->mapping_table[csio->ccb_h.target_id].TLR_bits; + req->Control = htole32(mpi_control); if (MPS_SET_LUN(req->LUN, csio->ccb_h.target_lun) != 0) { mps_free_command(sc, cm); ccb->ccb_h.status = CAM_LUN_INVALID; @@ -1698,7 +1699,7 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb) bcopy(csio->cdb_io.cdb_ptr, &req->CDB.CDB32[0], csio->cdb_len); else bcopy(csio->cdb_io.cdb_bytes, &req->CDB.CDB32[0],csio->cdb_len); - req->IoFlags = csio->cdb_len; + req->IoFlags = htole16(csio->cdb_len); /* * Check if EEDP is supported and enabled. If it is then check if the @@ -1715,11 +1716,11 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb) } if ((lun != NULL) && (lun->eedp_formatted)) { - req->EEDPBlockSize = lun->eedp_block_size; + req->EEDPBlockSize = htole16(lun->eedp_block_size); eedp_flags |= (MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG | MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG | MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD); - req->EEDPFlags = eedp_flags; + req->EEDPFlags = htole16(eedp_flags); /* * If CDB less than 32, fill in Primary Ref Tag with @@ -1738,6 +1739,8 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb) req->CDB.CDB32[lba_byte + i]; ref_tag_addr++; } + req->CDB.EEDP32.PrimaryReferenceTag = + htole32(req->CDB.EEDP32.PrimaryReferenceTag); req->CDB.EEDP32.PrimaryApplicationTagMask = 0xFFFF; req->CDB.CDB32[1] = (req->CDB.CDB32[1] & 0x1F) | @@ -1745,7 +1748,7 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb) } else { eedp_flags |= MPI2_SCSIIO_EEDPFLAGS_INC_PRI_APPTAG; - req->EEDPFlags = eedp_flags; + req->EEDPFlags = htole16(eedp_flags); req->CDB.CDB32[10] = (req->CDB.CDB32[10] & 0x1F) | 0x20; } @@ -1757,7 +1760,7 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb) cm->cm_sge = &req->SGL; cm->cm_sglsize = (32 - 24) * 4; cm->cm_desc.SCSIIO.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO; - cm->cm_desc.SCSIIO.DevHandle = targ->handle; + cm->cm_desc.SCSIIO.DevHandle = htole16(targ->handle); cm->cm_complete = mpssas_scsiio_complete; cm->cm_complete_data = ccb; cm->cm_targ = targ; @@ -2033,8 +2036,8 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm) "completed timedout cm %p ccb %p during recovery " "ioc %x scsi %x state %x xfer %u\n", cm, cm->cm_ccb, - rep->IOCStatus, rep->SCSIStatus, rep->SCSIState, - rep->TransferCount); + le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState, + le32toh(rep->TransferCount)); else mpssas_log_command(cm, "completed timedout cm %p ccb %p during recovery\n", @@ -2045,8 +2048,8 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm) "completed cm %p ccb %p during recovery " "ioc %x scsi %x state %x xfer %u\n", cm, cm->cm_ccb, - rep->IOCStatus, rep->SCSIStatus, rep->SCSIState, - rep->TransferCount); + le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState, + le32toh(rep->TransferCount)); else mpssas_log_command(cm, "completed cm %p ccb %p during recovery\n", @@ -2126,8 +2129,8 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm) if (sc->mps_debug & MPS_TRACE) mpssas_log_command(cm, "ioc %x scsi %x state %x xfer %u\n", - rep->IOCStatus, rep->SCSIStatus, - rep->SCSIState, rep->TransferCount); + le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState, + le32toh(rep->TransferCount)); /* * If this is a Direct Drive I/O, reissue the I/O to the original IR @@ -2142,14 +2145,14 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm) return; } - switch (rep->IOCStatus & MPI2_IOCSTATUS_MASK) { + switch (le16toh(rep->IOCStatus) & MPI2_IOCSTATUS_MASK) { case MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN: - csio->resid = cm->cm_length - rep->TransferCount; + csio->resid = cm->cm_length - le32toh(rep->TransferCount); /* FALLTHROUGH */ case MPI2_IOCSTATUS_SUCCESS: case MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR: - if ((rep->IOCStatus & MPI2_IOCSTATUS_MASK) == + if ((le16toh(rep->IOCStatus) & MPI2_IOCSTATUS_MASK) == MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR) mpssas_log_command(cm, "recovered error\n"); @@ -2175,7 +2178,7 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm) * TLR_bits for the target. */ if ((rep->SCSIState & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) && - ((rep->ResponseInfo & MPI2_SCSI_RI_MASK_REASONCODE) == + ((le32toh(rep->ResponseInfo) & MPI2_SCSI_RI_MASK_REASONCODE) == MPS_SCSI_RI_INVALID_FRAME)) { sc->mapping_table[csio->ccb_h.target_id].TLR_bits = (u8)MPI2_SCSIIO_CONTROL_NO_TLR; @@ -2203,7 +2206,7 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm) if (rep->SCSIState & MPI2_SCSI_STATE_AUTOSENSE_VALID) { int sense_len, returned_sense_len; - returned_sense_len = min(rep->SenseCount, + returned_sense_len = min(le32toh(rep->SenseCount), sizeof(struct scsi_sense_data)); if (returned_sense_len < ccb->csio.sense_len) ccb->csio.sense_resid = ccb->csio.sense_len - @@ -2214,7 +2217,7 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm) sense_len = min(returned_sense_len, ccb->csio.sense_len - ccb->csio.sense_resid); bzero(&ccb->csio.sense_data, - sizeof(&ccb->csio.sense_data)); + sizeof(ccb->csio.sense_data)); bcopy(cm->cm_sense, &ccb->csio.sense_data, sense_len); ccb->ccb_h.status |= CAM_AUTOSNS_VALID; } @@ -2297,8 +2300,8 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm) ccb->ccb_h.status = CAM_REQUEUE_REQ; mpssas_log_command(cm, "terminated ioc %x scsi %x state %x xfer %u\n", - rep->IOCStatus, rep->SCSIStatus, rep->SCSIState, - rep->TransferCount); + le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState, + le32toh(rep->TransferCount)); break; case MPI2_IOCSTATUS_INVALID_FUNCTION: case MPI2_IOCSTATUS_INTERNAL_ERROR: @@ -2313,8 +2316,8 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm) default: mpssas_log_command(cm, "completed ioc %x scsi %x state %x xfer %u\n", - rep->IOCStatus, rep->SCSIStatus, rep->SCSIState, - rep->TransferCount); + le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState, + le32toh(rep->TransferCount)); csio->resid = cm->cm_length; ccb->ccb_h.status = CAM_REQ_CMP_ERR; break; @@ -2338,6 +2341,7 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm) xpt_done(ccb); } +/* All Request reached here are Endian safe */ static void mpssas_direct_drive_io(struct mpssas_softc *sassc, struct mps_command *cm, union ccb *ccb) { @@ -2396,7 +2400,8 @@ mpssas_direct_drive_io(struct mpssas_softc *sassc, struct mps_command *cm, stripe_unit = physLBA / sc->DD_num_phys_disks; column = physLBA % sc->DD_num_phys_disks; pIO_req->DevHandle = - sc->DD_column_map[column].dev_handle; + htole16(sc->DD_column_map[column].dev_handle); + /* ???? Is this endian safe*/ cm->cm_desc.SCSIIO.DevHandle = pIO_req->DevHandle; @@ -2423,17 +2428,21 @@ mpssas_direct_drive_io(struct mpssas_softc *sassc, struct mps_command *cm, } /* - * Handle 10 or 16 byte CDBs. + * Handle 10, 12 or 16 byte CDBs. */ if ((pIO_req->DevHandle == sc->DD_dev_handle) && ((CDB[0] == READ_10) || (CDB[0] == WRITE_10) || (CDB[0] == READ_16) || - (CDB[0] == WRITE_16))) { + (CDB[0] == WRITE_16) || (CDB[0] == READ_12) || + (CDB[0] == WRITE_12))) { /* * For 16-byte CDB's, verify that the upper 4 bytes of the CDB * are 0. If not, this is accessing beyond 2TB so handle it in - * the else section. 10-byte CDB's are OK. + * the else section. 10-byte and 12-byte CDB's are OK. + * FreeBSD sends very rare 12 byte READ/WRITE, but driver is + * ready to accept 12byte CDB for Direct IOs. */ - if ((CDB[0] < READ_16) || + if ((CDB[0] == READ_10 || CDB[0] == WRITE_10) || + (CDB[0] == READ_12 || CDB[0] == WRITE_12) || !(CDB[2] | CDB[3] | CDB[4] | CDB[5])) { /* * Get the transfer size in blocks. @@ -2444,7 +2453,10 @@ mpssas_direct_drive_io(struct mpssas_softc *sassc, struct mps_command *cm, * Get virtual LBA. Point to correct lower 4 bytes of * LBA in the CDB depending on command. */ - lba_idx = (CDB[0] < READ_16) ? 2 : 6; + lba_idx = ((CDB[0] == READ_12) || + (CDB[0] == WRITE_12) || + (CDB[0] == READ_10) || + (CDB[0] == WRITE_10))? 2 : 6; virtLBA = ((uint64_t)CDB[lba_idx] << 24) | ((uint64_t)CDB[lba_idx + 1] << 16) | ((uint64_t)CDB[lba_idx + 2] << 8) | @@ -2477,8 +2489,8 @@ mpssas_direct_drive_io(struct mpssas_softc *sassc, struct mps_command *cm, column = physLBA % sc->DD_num_phys_disks; pIO_req->DevHandle = - sc->DD_column_map[column]. - dev_handle; + htole16(sc->DD_column_map[column]. + dev_handle); cm->cm_desc.SCSIIO.DevHandle = pIO_req->DevHandle; @@ -2555,8 +2567,8 @@ mpssas_direct_drive_io(struct mpssas_softc *sassc, struct mps_command *cm, column = physLBA % sc->DD_num_phys_disks; pIO_req->DevHandle = - sc->DD_column_map[column]. - dev_handle; + htole16(sc->DD_column_map[column]. + dev_handle); cm->cm_desc.SCSIIO.DevHandle = pIO_req->DevHandle; @@ -2633,10 +2645,10 @@ mpssas_smpio_complete(struct mps_softc *sc, struct mps_command *cm) sasaddr = le32toh(req->SASAddress.Low); sasaddr |= ((uint64_t)(le32toh(req->SASAddress.High))) << 32; - if ((rpl->IOCStatus & MPI2_IOCSTATUS_MASK) != MPI2_IOCSTATUS_SUCCESS || + if ((le16toh(rpl->IOCStatus) & MPI2_IOCSTATUS_MASK) != MPI2_IOCSTATUS_SUCCESS || rpl->SASStatus != MPI2_SASSTATUS_SUCCESS) { mps_dprint(sc, MPS_INFO, "%s: IOCStatus %04x SASStatus %02x\n", - __func__, rpl->IOCStatus, rpl->SASStatus); + __func__, le16toh(rpl->IOCStatus), rpl->SASStatus); ccb->ccb_h.status = CAM_REQ_CMP_ERR; goto bailout; } @@ -2749,7 +2761,7 @@ mpssas_send_smpcmd(struct mpssas_softc *sassc, union ccb *ccb, uint64_t sasaddr) /* Allow the chip to use any route to this SAS address. */ req->PhysicalPort = 0xff; - req->RequestDataLength = ccb->smpio.smp_request_len; + req->RequestDataLength = htole16(ccb->smpio.smp_request_len); req->SGLFlags = MPI2_SGLFLAGS_SYSTEM_ADDRESS_SPACE | MPI2_SGLFLAGS_SGL_TYPE_MPI; @@ -2774,7 +2786,7 @@ mpssas_send_smpcmd(struct mpssas_softc *sassc, union ccb *ccb, uint64_t sasaddr) cm->cm_uio.uio_rw = UIO_WRITE; cm->cm_iovec[0].iov_base = request; - cm->cm_iovec[0].iov_len = req->RequestDataLength; + cm->cm_iovec[0].iov_len = le16toh(req->RequestDataLength); cm->cm_iovec[1].iov_base = response; cm->cm_iovec[1].iov_len = ccb->smpio.smp_response_len; @@ -2980,7 +2992,7 @@ mpssas_action_resetdev(struct mpssas_softc *sassc, union ccb *ccb) targ = &sassc->targets[ccb->ccb_h.target_id]; req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; - req->DevHandle = targ->handle; + req->DevHandle = htole16(targ->handle); req->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET; @@ -3024,9 +3036,9 @@ mpssas_resetdev_complete(struct mps_softc *sc, struct mps_command *tm) } printf("%s: IOCStatus = 0x%x ResponseCode = 0x%x\n", __func__, - resp->IOCStatus, resp->ResponseCode); + le16toh(resp->IOCStatus), le32toh(resp->ResponseCode)); - if (resp->ResponseCode == MPI2_SCSITASKMGMT_RSP_TM_COMPLETE) { + if (le32toh(resp->ResponseCode) == MPI2_SCSITASKMGMT_RSP_TM_COMPLETE) { ccb->ccb_h.status = CAM_REQ_CMP; mpssas_announce_reset(sc, AC_SENT_BDR, tm->cm_targ->tid, CAM_LUN_WILDCARD); @@ -3131,6 +3143,17 @@ next_work: mps_kproc_exit(0); } +/* + * This function will send READ_CAP_16 to find out EEDP protection mode. + * It will check inquiry data before sending READ_CAP_16. + * Callback for READ_CAP_16 is "mpssas_read_cap_done". + * This is insternal scsi command and we need to take care release of devq, if + * CAM_DEV_QFRZN is set. Driver needs to release devq if it has frozen any. + * xpt_release_devq is called from mpssas_read_cap_done. + * + * All other commands will be handled by periph layer and there it will + * check for "CAM_DEV_QFRZN" and release of devq will be done. + */ static void mpssas_rescan(struct mpssas_softc *sassc, union ccb *ccb) { @@ -3264,6 +3287,8 @@ mpssas_check_eedp(struct mpssas_softc *sassc) struct mpssas_target *target; struct mpssas_lun *lun; uint8_t found_lun; + struct ccb_getdev cgd; + char path_str[64]; /* * Issue a READ CAPACITY 16 command to each LUN of each target. This @@ -3277,19 +3302,10 @@ mpssas_check_eedp(struct mpssas_softc *sassc) lunid = 0; do { - rcap_buf = - malloc(sizeof(struct scsi_read_capacity_eedp), - M_MPT2, M_NOWAIT | M_ZERO); - if (rcap_buf == NULL) { - mps_dprint(sc, MPS_FAULT, "Unable to alloc read " - "capacity buffer for EEDP support.\n"); - return; - } ccb = xpt_alloc_ccb_nowait(); if (ccb == NULL) { mps_dprint(sc, MPS_FAULT, "Unable to alloc CCB " "for EEDP support.\n"); - free(rcap_buf, M_MPT2); return; } @@ -3297,7 +3313,6 @@ mpssas_check_eedp(struct mpssas_softc *sassc) pathid, targetid, lunid) != CAM_REQ_CMP) { mps_dprint(sc, MPS_FAULT, "Unable to create " "path for EEDP support\n"); - free(rcap_buf, M_MPT2); xpt_free_ccb(ccb); return; } @@ -3326,7 +3341,6 @@ mpssas_check_eedp(struct mpssas_softc *sassc) mps_dprint(sc, MPS_FAULT, "Unable to alloc LUN for " "EEDP support.\n"); - free(rcap_buf, M_MPT2); xpt_free_path(ccb->ccb_h.path); xpt_free_ccb(ccb); return; @@ -3336,12 +3350,51 @@ mpssas_check_eedp(struct mpssas_softc *sassc) lun_link); } lunid++; + /* Before Issuing READ CAPACITY 16, + * check Device type. + */ + xpt_setup_ccb(&cgd.ccb_h, ccb->ccb_h.path, + CAM_PRIORITY_NORMAL); + cgd.ccb_h.func_code = XPT_GDEV_TYPE; + xpt_action((union ccb *)&cgd); + /* + * If this flag is set in the inquiry data, + * the device supports protection information, + * and must support the 16 byte read + * capacity command, otherwise continue without + * sending read cap 16 + */ + + xpt_path_string(ccb->ccb_h.path, path_str, + sizeof(path_str)); + + if ((cgd.inq_data.spc3_flags & + SPC3_SID_PROTECT) == 0) { + xpt_free_path(ccb->ccb_h.path); + xpt_free_ccb(ccb); + continue; + } + + mps_dprint(sc, MPS_INFO, + "Sending read cap: path %s" + " handle %d\n", path_str, target->handle ); + /* * Issue a READ CAPACITY 16 command for the LUN. * The mpssas_read_cap_done function will load * the read cap info into the LUN struct. */ + rcap_buf = + malloc(sizeof(struct scsi_read_capacity_eedp), + M_MPT2, M_NOWAIT| M_ZERO); + if (rcap_buf == NULL) { + mps_dprint(sc, MPS_FAULT, "Unable to alloc read " + "capacity buffer for EEDP support.\n"); + xpt_free_path(ccb->ccb_h.path); + xpt_free_ccb(ccb); + return; + } csio = &ccb->csio; csio->ccb_h.func_code = XPT_SCSI_IO; csio->ccb_h.flags = CAM_DIR_IN; @@ -3377,7 +3430,6 @@ mpssas_check_eedp(struct mpssas_softc *sassc) ccb->ccb_h.ppriv_ptr1 = sassc; xpt_action(ccb); } else { - free(rcap_buf, M_MPT2); xpt_free_path(ccb->ccb_h.path); xpt_free_ccb(ccb); } @@ -3499,8 +3551,6 @@ mpssas_portenable_complete(struct mps_softc *sc, struct mps_command *cm) { MPI2_PORT_ENABLE_REPLY *reply; struct mpssas_softc *sassc; - struct mpssas_target *target; - int i; mps_dprint(sc, MPS_TRACE, "%s\n", __func__); sassc = sc->sassc; @@ -3518,7 +3568,7 @@ mpssas_portenable_complete(struct mps_softc *sc, struct mps_command *cm) reply = (MPI2_PORT_ENABLE_REPLY *)cm->cm_reply; if (reply == NULL) mps_dprint(sc, MPS_FAULT, "Portenable NULL reply\n"); - else if ((reply->IOCStatus & MPI2_IOCSTATUS_MASK) != + else if (le16toh(reply->IOCStatus & MPI2_IOCSTATUS_MASK) != MPI2_IOCSTATUS_SUCCESS) mps_dprint(sc, MPS_FAULT, "Portenable failed\n"); @@ -3537,23 +3587,6 @@ mpssas_portenable_complete(struct mps_softc *sc, struct mps_command *cm) * some info and a volume's will be 0. Use that to remove disks. */ mps_wd_config_pages(sc); - if (((sc->mps_flags & MPS_FLAGS_WD_AVAILABLE) - && (sc->WD_hide_expose == MPS_WD_HIDE_ALWAYS)) - || (sc->WD_valid_config && (sc->WD_hide_expose == - MPS_WD_HIDE_IF_VOLUME))) { - for (i = 0; i < sassc->sc->facts->MaxTargets; i++) { - target = &sassc->targets[i]; - if (target->devinfo) { - target->devinfo = 0x0; - target->encl_handle = 0x0; - target->encl_slot = 0x0; - target->handle = 0x0; - target->tid = 0x0; - target->linkrate = 0x0; - target->flags = 0x0; - } - } - } /* * Done waiting for port enable to complete. Decrement the refcount. @@ -3564,6 +3597,7 @@ mpssas_portenable_complete(struct mps_softc *sc, struct mps_command *cm) */ sc->wait_for_port_enable = 0; sc->port_enable_complete = 1; + wakeup(&sc->port_enable_complete); mpssas_startup_decrement(sassc); xpt_release_simq(sassc->sim, 1); } diff --git a/sys/dev/mps/mps_sas.h b/sys/dev/mps/mps_sas.h index 6653cc365e4..6857b98f06d 100644 --- a/sys/dev/mps/mps_sas.h +++ b/sys/dev/mps/mps_sas.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/sys/dev/mps/mps_sas_lsi.c b/sys/dev/mps/mps_sas_lsi.c index 41814056fcc..9cedcd3d938 100644 --- a/sys/dev/mps/mps_sas_lsi.c +++ b/sys/dev/mps/mps_sas_lsi.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -210,17 +210,17 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event) switch (phy->PhyStatus & MPI2_EVENT_SAS_TOPO_RC_MASK) { case MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED: if (mpssas_add_device(sc, - phy->AttachedDevHandle, phy->LinkRate)){ + le16toh(phy->AttachedDevHandle), phy->LinkRate)){ printf("%s: failed to add device with " "handle 0x%x\n", __func__, - phy->AttachedDevHandle); - mpssas_prepare_remove(sassc, phy-> - AttachedDevHandle); + le16toh(phy->AttachedDevHandle)); + mpssas_prepare_remove(sassc, le16toh( + phy->AttachedDevHandle)); } break; case MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING: - mpssas_prepare_remove(sassc, phy-> - AttachedDevHandle); + mpssas_prepare_remove(sassc,le16toh( + phy->AttachedDevHandle)); break; case MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED: case MPI2_EVENT_SAS_TOPO_RC_NO_CHANGE: @@ -304,7 +304,7 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event) printf("%s: could not get ID " "for volume with handle " "0x%04x\n", __func__, - element->VolDevHandle); + le16toh(element->VolDevHandle)); break; } @@ -329,8 +329,17 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event) targ = mpssas_find_target_by_handle(sassc, 0, element->PhysDiskDevHandle); if (targ == NULL) break; - - targ->flags |= MPS_TARGET_FLAGS_RAID_COMPONENT; + + /* Set raid component flags only if it is not WD. + * OR WrapDrive with WD_HIDE_ALWAYS/WD_HIDE_IF_VOLUME is set in NVRAM + */ + if((!sc->WD_available) || + ((sc->WD_available && + (sc->WD_hide_expose == MPS_WD_HIDE_ALWAYS)) || + (sc->WD_valid_config && (sc->WD_hide_expose == + MPS_WD_HIDE_IF_VOLUME)))) { + targ->flags |= MPS_TARGET_FLAGS_RAID_COMPONENT; + } mpssas_rescan_target(sc, targ); break; @@ -340,12 +349,12 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event) * Expose it to the OS. */ if (mpssas_add_device(sc, - element->PhysDiskDevHandle, 0)){ + le16toh(element->PhysDiskDevHandle), 0)){ printf("%s: failed to add device with " "handle 0x%x\n", __func__, - element->PhysDiskDevHandle); - mpssas_prepare_remove(sassc, element-> - PhysDiskDevHandle); + le16toh(element->PhysDiskDevHandle)); + mpssas_prepare_remove(sassc, le16toh(element-> + PhysDiskDevHandle)); } break; } @@ -368,25 +377,25 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event) mps_dprint(sc, MPS_INFO, "Received IR Volume event:\n"); switch (event_data->ReasonCode) { case MPI2_EVENT_IR_VOLUME_RC_SETTINGS_CHANGED: - mps_dprint(sc, MPS_INFO, " Volume Settings " - "changed from 0x%x to 0x%x for Volome with " - "handle 0x%x", event_data->PreviousValue, - event_data->NewValue, - event_data->VolDevHandle); + mps_dprint(sc, MPS_INFO, " Volume Settings " + "changed from 0x%x to 0x%x for Volome with " + "handle 0x%x", le32toh(event_data->PreviousValue), + le32toh(event_data->NewValue), + le16toh(event_data->VolDevHandle)); break; case MPI2_EVENT_IR_VOLUME_RC_STATUS_FLAGS_CHANGED: - mps_dprint(sc, MPS_INFO, " Volume Status " - "changed from 0x%x to 0x%x for Volome with " - "handle 0x%x", event_data->PreviousValue, - event_data->NewValue, - event_data->VolDevHandle); + mps_dprint(sc, MPS_INFO, " Volume Status " + "changed from 0x%x to 0x%x for Volome with " + "handle 0x%x", le32toh(event_data->PreviousValue), + le32toh(event_data->NewValue), + le16toh(event_data->VolDevHandle)); break; case MPI2_EVENT_IR_VOLUME_RC_STATE_CHANGED: - mps_dprint(sc, MPS_INFO, " Volume State " - "changed from 0x%x to 0x%x for Volome with " - "handle 0x%x", event_data->PreviousValue, - event_data->NewValue, - event_data->VolDevHandle); + mps_dprint(sc, MPS_INFO, " Volume State " + "changed from 0x%x to 0x%x for Volome with " + "handle 0x%x", le32toh(event_data->PreviousValue), + le32toh(event_data->NewValue), + le16toh(event_data->VolDevHandle)); u32 state; struct mpssas_target *targ; state = le32toh(event_data->NewValue); @@ -434,31 +443,32 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event) mps_dprint(sc, MPS_INFO, "Received IR Phys Disk event:\n"); switch (event_data->ReasonCode) { case MPI2_EVENT_IR_PHYSDISK_RC_SETTINGS_CHANGED: - mps_dprint(sc, MPS_INFO, " Phys Disk Settings " - "changed from 0x%x to 0x%x for Phys Disk Number " - "%d and handle 0x%x at Enclosure handle 0x%x, Slot " - "%d\n", event_data->PreviousValue, - event_data->NewValue, event_data->PhysDiskNum, - event_data->PhysDiskDevHandle, - event_data->EnclosureHandle, event_data->Slot); + mps_dprint(sc, MPS_INFO, " Phys Disk Settings " + "changed from 0x%x to 0x%x for Phys Disk Number " + "%d and handle 0x%x at Enclosure handle 0x%x, Slot " + "%d", le32toh(event_data->PreviousValue), + le32toh(event_data->NewValue), + event_data->PhysDiskNum, + le16toh(event_data->PhysDiskDevHandle), + le16toh(event_data->EnclosureHandle), le16toh(event_data->Slot)); break; case MPI2_EVENT_IR_PHYSDISK_RC_STATUS_FLAGS_CHANGED: - mps_dprint(sc, MPS_INFO, " Phys Disk Status changed " - "from 0x%x to 0x%x for Phys Disk Number %d and " - "handle 0x%x at Enclosure handle 0x%x, Slot %d\n", - event_data->PreviousValue, event_data->NewValue, - event_data->PhysDiskNum, - event_data->PhysDiskDevHandle, - event_data->EnclosureHandle, event_data->Slot); + mps_dprint(sc, MPS_INFO, " Phys Disk Status changed " + "from 0x%x to 0x%x for Phys Disk Number %d and " + "handle 0x%x at Enclosure handle 0x%x, Slot %d", + le32toh(event_data->PreviousValue), + le32toh(event_data->NewValue), event_data->PhysDiskNum, + le16toh(event_data->PhysDiskDevHandle), + le16toh(event_data->EnclosureHandle), le16toh(event_data->Slot)); break; case MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED: - mps_dprint(sc, MPS_INFO, " Phys Disk State changed " - "from 0x%x to 0x%x for Phys Disk Number %d and " - "handle 0x%x at Enclosure handle 0x%x, Slot %d\n", - event_data->PreviousValue, event_data->NewValue, - event_data->PhysDiskNum, - event_data->PhysDiskDevHandle, - event_data->EnclosureHandle, event_data->Slot); + mps_dprint(sc, MPS_INFO, " Phys Disk State changed " + "from 0x%x to 0x%x for Phys Disk Number %d and " + "handle 0x%x at Enclosure handle 0x%x, Slot %d", + le32toh(event_data->PreviousValue), + le32toh(event_data->NewValue), event_data->PhysDiskNum, + le16toh(event_data->PhysDiskDevHandle), + le16toh(event_data->EnclosureHandle), le16toh(event_data->Slot)); switch (event_data->NewValue) { case MPI2_RAID_PD_STATE_ONLINE: case MPI2_RAID_PD_STATE_DEGRADED: @@ -468,10 +478,19 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event) targ = mpssas_find_target_by_handle(sassc, 0, event_data->PhysDiskDevHandle); if (targ) { - targ->flags |= MPS_TARGET_FLAGS_RAID_COMPONENT; - printf("%s %d: Found Target for handle 0x%x. \n", - __func__, __LINE__ , event_data->PhysDiskDevHandle); - } + if(!sc->WD_available) { + targ->flags |= MPS_TARGET_FLAGS_RAID_COMPONENT; + printf("%s %d: Found Target for handle 0x%x. \n", + __func__, __LINE__ , event_data->PhysDiskDevHandle); + } else if ((sc->WD_available && + (sc->WD_hide_expose == MPS_WD_HIDE_ALWAYS)) || + (sc->WD_valid_config && (sc->WD_hide_expose == + MPS_WD_HIDE_IF_VOLUME))) { + targ->flags |= MPS_TARGET_FLAGS_RAID_COMPONENT; + printf("%s %d: WD: Found Target for handle 0x%x. \n", + __func__, __LINE__ , event_data->PhysDiskDevHandle); + } + } break; case MPI2_RAID_PD_STATE_OFFLINE: case MPI2_RAID_PD_STATE_NOT_CONFIGURED: @@ -503,7 +522,7 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event) mps_dprint(sc, MPS_INFO, " RAID Operation of %d is %d " "percent complete for Volume with handle 0x%x", event_data->RAIDOperation, event_data->PercentComplete, - event_data->VolDevHandle); + le16toh(event_data->VolDevHandle)); break; } case MPI2_EVENT_LOG_ENTRY_ADDED: @@ -591,6 +610,7 @@ mpssas_add_device(struct mps_softc *sc, u16 handle, u8 linkrate){ unsigned int id; int ret; int error = 0; + struct mpssas_lun *lun; sassc = sc->sassc; mpssas_startup_increment(sassc); @@ -604,7 +624,7 @@ mpssas_add_device(struct mps_softc *sc, u16 handle, u8 linkrate){ device_info = le32toh(config_page.DeviceInfo); if (((device_info & MPI2_SAS_DEVICE_INFO_SMP_TARGET) == 0) - && (config_page.ParentDevHandle != 0)) { + && (le16toh(config_page.ParentDevHandle) != 0)) { Mpi2ConfigReply_t tmp_mpi_reply; Mpi2SasDevicePage0_t parent_config_page; @@ -668,7 +688,13 @@ mpssas_add_device(struct mps_softc *sc, u16 handle, u8 linkrate){ targ->flags = 0; TAILQ_INIT(&targ->commands); TAILQ_INIT(&targ->timedout_commands); + while(!SLIST_EMPTY(&targ->luns)) { + lun = SLIST_FIRST(&targ->luns); + SLIST_REMOVE_HEAD(&targ->luns, lun_link); + free(lun, M_MPT2); + } SLIST_INIT(&targ->luns); + mps_describe_devinfo(targ->devinfo, devstring, 80); mps_dprint(sc, MPS_INFO, "Found device <%s> <%s> <0x%04x> <%d/%d>\n", devstring, mps_describe_table(mps_linkrate_names, targ->linkrate), @@ -802,7 +828,7 @@ mpssas_get_sata_identify(struct mps_softc *sc, u16 handle, } bcopy(buffer, id_buffer, sz); bcopy(reply, mpi_reply, sizeof(Mpi2SataPassthroughReply_t)); - if ((reply->IOCStatus & MPI2_IOCSTATUS_MASK) != + if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) != MPI2_IOCSTATUS_SUCCESS) { printf("%s: error reading SATA PASSTHRU; iocstatus = 0x%x\n", __func__, reply->IOCStatus); @@ -823,9 +849,11 @@ mpssas_volume_add(struct mps_softc *sc, u16 handle) u64 wwid; unsigned int id; int error = 0; + struct mpssas_lun *lun; sassc = sc->sassc; mpssas_startup_increment(sassc); + /* wwid is endian safe */ mps_config_get_volume_wwid(sc, handle, &wwid); if (!wwid) { printf("%s: invalid WWID; cannot add volume to mapping table\n", @@ -849,6 +877,11 @@ mpssas_volume_add(struct mps_softc *sc, u16 handle) targ->devname = wwid; TAILQ_INIT(&targ->commands); TAILQ_INIT(&targ->timedout_commands); + while(!SLIST_EMPTY(&targ->luns)) { + lun = SLIST_FIRST(&targ->luns); + SLIST_REMOVE_HEAD(&targ->luns, lun_link); + free(lun, M_MPT2); + } SLIST_INIT(&targ->luns); if ((sassc->flags & MPSSAS_IN_STARTUP) == 0) mpssas_rescan_target(sc, targ); diff --git a/sys/dev/mps/mps_user.c b/sys/dev/mps/mps_user.c index f4e5e35b58d..98dc511ad57 100644 --- a/sys/dev/mps/mps_user.c +++ b/sys/dev/mps/mps_user.c @@ -30,7 +30,7 @@ * LSI MPT-Fusion Host Adapter FreeBSD userland interface */ /*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -701,6 +701,11 @@ mps_user_command(struct mps_softc *sc, struct mps_usr_command *cmd) if (cmd->len > 0) { buf = malloc(cmd->len, M_MPSUSER, M_WAITOK|M_ZERO); + if(!buf) { + mps_printf(sc, "Cannot allocate memory %s %d\n", + __func__, __LINE__); + return (ENOMEM); + } cm->cm_data = buf; cm->cm_length = cmd->len; } else { @@ -946,7 +951,7 @@ mps_user_pass_thru(struct mps_softc *sc, mps_pass_thru_t *data) */ scsi_io_req->SenseBufferLength = (uint8_t)(data->RequestSize - 64); - scsi_io_req->SenseBufferLowAddress = cm->cm_sense_busaddr; + scsi_io_req->SenseBufferLowAddress = htole32(cm->cm_sense_busaddr); /* * Set SGLOffset0 value. This is the number of dwords that SGL @@ -1033,7 +1038,7 @@ mps_user_pass_thru(struct mps_softc *sc, mps_pass_thru_t *data) if (((MPI2_SCSI_IO_REPLY *)rpl)->SCSIState & MPI2_SCSI_STATE_AUTOSENSE_VALID) { sense_len = - MIN(((MPI2_SCSI_IO_REPLY *)rpl)->SenseCount, + MIN((le32toh(((MPI2_SCSI_IO_REPLY *)rpl)->SenseCount)), sizeof(struct scsi_sense_data)); mps_unlock(sc); copyout(cm->cm_sense, cm->cm_req + 64, sense_len); @@ -2053,7 +2058,7 @@ mps_ioctl(struct cdev *dev, u_long cmd, void *arg, int flag, struct mps_cfg_page_req *page_req; struct mps_ext_cfg_page_req *ext_page_req; void *mps_page; - int error, reset_loop; + int error, msleep_ret; mps_page = NULL; sc = dev->si_drv1; @@ -2068,6 +2073,11 @@ mps_ioctl(struct cdev *dev, u_long cmd, void *arg, int flag, break; case MPSIO_READ_CFG_PAGE: mps_page = malloc(page_req->len, M_MPSUSER, M_WAITOK | M_ZERO); + if(!mps_page) { + mps_printf(sc, "Cannot allocate memory %s %d\n", + __func__, __LINE__); + return (ENOMEM); + } error = copyin(page_req->buf, mps_page, sizeof(MPI2_CONFIG_PAGE_HEADER)); if (error) @@ -2086,6 +2096,11 @@ mps_ioctl(struct cdev *dev, u_long cmd, void *arg, int flag, break; case MPSIO_READ_EXT_CFG_PAGE: mps_page = malloc(ext_page_req->len, M_MPSUSER, M_WAITOK|M_ZERO); + if(!mps_page) { + mps_printf(sc, "Cannot allocate memory %s %d\n", + __func__, __LINE__); + return (ENOMEM); + } error = copyin(ext_page_req->buf, mps_page, sizeof(MPI2_CONFIG_EXTENDED_PAGE_HEADER)); if (error) @@ -2099,6 +2114,11 @@ mps_ioctl(struct cdev *dev, u_long cmd, void *arg, int flag, break; case MPSIO_WRITE_CFG_PAGE: mps_page = malloc(page_req->len, M_MPSUSER, M_WAITOK|M_ZERO); + if(!mps_page) { + mps_printf(sc, "Cannot allocate memory %s %d\n", + __func__, __LINE__); + return (ENOMEM); + } error = copyin(page_req->buf, mps_page, page_req->len); if (error) break; @@ -2138,19 +2158,19 @@ mps_ioctl(struct cdev *dev, u_long cmd, void *arg, int flag, case MPTIOCTL_RESET_ADAPTER: mps_lock(sc); sc->port_enable_complete = 0; + uint32_t reinit_start = time_uptime; error = mps_reinit(sc); + /* Sleep for 300 second. */ + msleep_ret = msleep(&sc->port_enable_complete, &sc->mps_mtx, PRIBIO, + "mps_porten", 300 * hz); mps_unlock(sc); - /* - * Wait no more than 5 minutes for Port Enable to complete - */ - for (reset_loop = 0; (reset_loop < MPS_DIAG_RESET_TIMEOUT) && - (!sc->port_enable_complete); reset_loop++) { - DELAY(1000); - } - if (reset_loop == MPS_DIAG_RESET_TIMEOUT) { + if (msleep_ret) printf("Port Enable did not complete after Diag " - "Reset.\n"); - } + "Reset msleep error %d.\n", msleep_ret); + else + mps_dprint(sc, MPS_INFO, + "Hard Reset with Port Enable completed in %d seconds.\n", + (uint32_t) (time_uptime - reinit_start)); break; case MPTIOCTL_DIAG_ACTION: /* diff --git a/sys/dev/mps/mpsvar.h b/sys/dev/mps/mpsvar.h index 6246c465195..2acb75b7456 100644 --- a/sys/dev/mps/mpsvar.h +++ b/sys/dev/mps/mpsvar.h @@ -1,32 +1,6 @@ /*- * Copyright (c) 2009 Yahoo! Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ -/*- - * Copyright (c) 2011 LSI Corp. + * Copyright (c) 2011, 2012 LSI Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -58,7 +32,7 @@ #ifndef _MPSVAR_H #define _MPSVAR_H -#define MPS_DRIVER_VERSION "13.00.00.00-fbsd" +#define MPS_DRIVER_VERSION "14.00.00.01-fbsd" #define MPS_DB_MAX_WAIT 2500 @@ -80,6 +54,8 @@ #define MPS_SCSI_RI_INVALID_FRAME (0x00000002) #define MPS_STRING_LENGTH 64 +#include + /* * host mapping related macro definitions */ @@ -276,7 +252,7 @@ struct mps_event_handle { TAILQ_ENTRY(mps_event_handle) eh_list; mps_evt_callback_t *callback; void *data; - uint8_t mask[16]; + u32 mask[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS]; }; struct mps_softc { @@ -333,7 +309,7 @@ struct mps_softc { int fqdepth; /* Free queue */ int pqdepth; /* Post queue */ - uint8_t event_mask[16]; + u32 event_mask[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS]; TAILQ_HEAD(, mps_event_handle) event_list; struct mps_event_handle *mps_log_eh; @@ -422,8 +398,10 @@ struct mps_softc { #define MPS_DIAG_RESET_TIMEOUT 300000 uint8_t wait_for_port_enable; uint8_t port_enable_complete; + uint8_t msleep_fake_chan; /* WD controller */ + uint8_t WD_available; uint8_t WD_valid_config; uint8_t WD_hide_expose; @@ -469,12 +447,15 @@ mps_regwrite(struct mps_softc *sc, uint32_t offset, uint32_t val) bus_space_write_4(sc->mps_btag, sc->mps_bhandle, offset, val); } +/* free_queue must have Little Endian address + * TODO- cm_reply_data is unwanted. We can remove it. + * */ static __inline void mps_free_reply(struct mps_softc *sc, uint32_t busaddr) { if (++sc->replyfreeindex >= sc->fqdepth) sc->replyfreeindex = 0; - sc->free_queue[sc->replyfreeindex] = busaddr; + sc->free_queue[sc->replyfreeindex] = htole32(busaddr); mps_regwrite(sc, MPI2_REPLY_FREE_HOST_INDEX_OFFSET, sc->replyfreeindex); } @@ -640,6 +621,9 @@ do { \ #define MPS_EVENTFIELD(sc, facts, attr, fmt) \ mps_dprint_field((sc), MPS_EVENT, #attr ": " #fmt "\n", (facts)->attr) +#define CAN_SLEEP 1 +#define NO_SLEEP 0 + static __inline void mps_from_u64(uint64_t data, U64 *mps) { @@ -682,11 +666,11 @@ int mps_free(struct mps_softc *sc); void mps_intr(void *); void mps_intr_msi(void *); void mps_intr_locked(void *); -int mps_register_events(struct mps_softc *, uint8_t *, mps_evt_callback_t *, +int mps_register_events(struct mps_softc *, u32 *, mps_evt_callback_t *, void *, struct mps_event_handle **); int mps_restart(struct mps_softc *); -int mps_update_events(struct mps_softc *, struct mps_event_handle *, uint8_t *); -int mps_deregister_events(struct mps_softc *, struct mps_event_handle *); +int mps_update_events(struct mps_softc *, struct mps_event_handle *, u32 *); +void mps_deregister_events(struct mps_softc *, struct mps_event_handle *); int mps_push_sge(struct mps_command *, void *, size_t, int); int mps_add_dmaseg(struct mps_command *, vm_paddr_t, size_t, u_int, int); int mps_attach_sas(struct mps_softc *sc); @@ -778,5 +762,21 @@ SYSCTL_DECL(_hw_mps); #else #define MPS_PRIORITY_XPT 5 #endif + +#if __FreeBSD_version < 800107 +// Prior to FreeBSD-8.0 scp3_flags was not defined. +#define spc3_flags reserved + +#define SPC3_SID_PROTECT 0x01 +#define SPC3_SID_3PC 0x08 +#define SPC3_SID_TPGS_MASK 0x30 +#define SPC3_SID_TPGS_IMPLICIT 0x10 +#define SPC3_SID_TPGS_EXPLICIT 0x20 +#define SPC3_SID_ACC 0x40 +#define SPC3_SID_SCCS 0x80 + +#define CAM_PRIORITY_NORMAL CAM_PRIORITY_NONE +#endif + #endif diff --git a/sys/dev/mpt/mpt_cam.c b/sys/dev/mpt/mpt_cam.c index d312b6742b6..e56bf674c95 100644 --- a/sys/dev/mpt/mpt_cam.c +++ b/sys/dev/mpt/mpt_cam.c @@ -3187,7 +3187,7 @@ mpt_scsi_reply_frame_handler(struct mpt_softc *mpt, request_t *req, else ccb->csio.sense_resid = 0; - bzero(&ccb->csio.sense_data, sizeof(&ccb->csio.sense_data)); + bzero(&ccb->csio.sense_data, sizeof(ccb->csio.sense_data)); bcopy(req->sense_vbuf, &ccb->csio.sense_data, min(ccb->csio.sense_len, sense_returned)); } @@ -3411,7 +3411,7 @@ mpt_action(struct cam_sim *sim, union ccb *ccb) CAMLOCK_2_MPTLOCK(mpt); switch (accb->ccb_h.func_code) { case XPT_ACCEPT_TARGET_IO: - case XPT_IMMED_NOTIFY: + case XPT_IMMEDIATE_NOTIFY: ccb->ccb_h.status = mpt_abort_target_ccb(mpt, ccb); break; case XPT_CONT_TARGET_IO: @@ -3785,8 +3785,8 @@ mpt_action(struct cam_sim *sim, union ccb *ccb) } break; } - case XPT_NOTIFY_ACK: /* recycle notify ack */ - case XPT_IMMED_NOTIFY: /* Add Immediate Notify Resource */ + case XPT_NOTIFY_ACKNOWLEDGE: /* recycle notify ack */ + case XPT_IMMEDIATE_NOTIFY: /* Add Immediate Notify Resource */ case XPT_ACCEPT_TARGET_IO: /* Add Accept Target IO Resource */ { tgt_resource_t *trtp; @@ -3813,7 +3813,7 @@ mpt_action(struct cam_sim *sim, union ccb *ccb) "Put FREE ATIO %p lun %d\n", ccb, lun); STAILQ_INSERT_TAIL(&trtp->atios, &ccb->ccb_h, sim_links.stqe); - } else if (ccb->ccb_h.func_code == XPT_IMMED_NOTIFY) { + } else if (ccb->ccb_h.func_code == XPT_IMMEDIATE_NOTIFY) { mpt_lprt(mpt, MPT_PRT_DEBUG1, "Put FREE INOT lun %d\n", lun); STAILQ_INSERT_TAIL(&trtp->inots, &ccb->ccb_h, @@ -4822,7 +4822,7 @@ mpt_abort_target_ccb(struct mpt_softc *mpt, union ccb *ccb) if (accb->ccb_h.func_code == XPT_ACCEPT_TARGET_IO) { lp = &trtp->atios; - } else if (accb->ccb_h.func_code == XPT_IMMED_NOTIFY) { + } else if (accb->ccb_h.func_code == XPT_IMMEDIATE_NOTIFY) { lp = &trtp->inots; } else { return (CAM_REQ_INVALID); @@ -5043,11 +5043,11 @@ static void mpt_scsi_tgt_tsk_mgmt(struct mpt_softc *mpt, request_t *req, mpt_task_mgmt_t fc, tgt_resource_t *trtp, int init_id) { - struct ccb_immed_notify *inot; + struct ccb_immediate_notify *inot; mpt_tgt_state_t *tgt; tgt = MPT_TGT_STATE(mpt, req); - inot = (struct ccb_immed_notify *) STAILQ_FIRST(&trtp->inots); + inot = (struct ccb_immediate_notify *) STAILQ_FIRST(&trtp->inots); if (inot == NULL) { mpt_lprt(mpt, MPT_PRT_WARN, "no INOTSs- sending back BSY\n"); mpt_scsi_tgt_status(mpt, NULL, req, SCSI_STATUS_BUSY, NULL); @@ -5057,35 +5057,35 @@ mpt_scsi_tgt_tsk_mgmt(struct mpt_softc *mpt, request_t *req, mpt_task_mgmt_t fc, mpt_lprt(mpt, MPT_PRT_DEBUG1, "Get FREE INOT %p lun %d\n", inot, inot->ccb_h.target_lun); - memset(&inot->sense_data, 0, sizeof (inot->sense_data)); - inot->sense_len = 0; - memset(inot->message_args, 0, sizeof (inot->message_args)); inot->initiator_id = init_id; /* XXX */ - /* * This is a somewhat grotesque attempt to map from task management * to old style SCSI messages. God help us all. */ switch (fc) { case MPT_ABORT_TASK_SET: - inot->message_args[0] = MSG_ABORT_TAG; + inot->arg = MSG_ABORT_TAG; break; case MPT_CLEAR_TASK_SET: - inot->message_args[0] = MSG_CLEAR_TASK_SET; + inot->arg = MSG_CLEAR_TASK_SET; break; case MPT_TARGET_RESET: - inot->message_args[0] = MSG_TARGET_RESET; + inot->arg = MSG_TARGET_RESET; break; case MPT_CLEAR_ACA: - inot->message_args[0] = MSG_CLEAR_ACA; + inot->arg = MSG_CLEAR_ACA; break; case MPT_TERMINATE_TASK: - inot->message_args[0] = MSG_ABORT_TAG; + inot->arg = MSG_ABORT_TAG; break; default: - inot->message_args[0] = MSG_NOOP; + inot->arg = MSG_NOOP; break; } + /* + * XXX KDM we need the sequence/tag number for the target of the + * task management operation, especially if it is an abort. + */ tgt->ccb = (union ccb *) inot; inot->ccb_h.status = CAM_MESSAGE_RECV|CAM_DEV_QFRZN; MPTLOCK_2_CAMLOCK(mpt); diff --git a/sys/dev/mvs/mvs.c b/sys/dev/mvs/mvs.c index e128616e703..21c9f9757f4 100644 --- a/sys/dev/mvs/mvs.c +++ b/sys/dev/mvs/mvs.c @@ -654,7 +654,9 @@ mvs_ch_intr_locked(void *data) struct mvs_channel *ch = device_get_softc(dev); mtx_lock(&ch->mtx); + xpt_batch_start(ch->sim); mvs_ch_intr(data); + xpt_batch_done(ch->sim); mtx_unlock(&ch->mtx); } @@ -1046,14 +1048,19 @@ mvs_crbq_intr(device_t dev) * Handle only successfull completions here. * Errors will be handled by main intr handler. */ +#if defined(__i386__) || defined(__amd64__) if (crpb->id == 0xffff && crpb->rspflg == 0xffff) { device_printf(dev, "Unfilled CRPB " "%d (%d->%d) tag %d flags %04x rs %08x\n", cin_idx, fin_idx, in_idx, slot, flags, ch->rslots); - } else if (ch->numtslots != 0 || + } else +#endif + if (ch->numtslots != 0 || (flags & EDMA_IE_EDEVERR) == 0) { +#if defined(__i386__) || defined(__amd64__) crpb->id = 0xffff; crpb->rspflg = 0xffff; +#endif if (ch->slot[slot].state >= MVS_SLOT_RUNNING) { ccb = ch->slot[slot].ccb; ccb->ataio.res.status = @@ -1996,6 +2003,39 @@ mvs_reset_to(void *arg) callout_schedule(&ch->reset_timer, hz / 10); } +static void +mvs_errata(device_t dev) +{ + struct mvs_channel *ch = device_get_softc(dev); + uint32_t val; + + if (ch->quirks & MVS_Q_SOC65) { + val = ATA_INL(ch->r_mem, SATA_PHYM3); + val &= ~(0x3 << 27); /* SELMUPF = 1 */ + val |= (0x1 << 27); + val &= ~(0x3 << 29); /* SELMUPI = 1 */ + val |= (0x1 << 29); + ATA_OUTL(ch->r_mem, SATA_PHYM3, val); + + val = ATA_INL(ch->r_mem, SATA_PHYM4); + val &= ~0x1; /* SATU_OD8 = 0 */ + val |= (0x1 << 16); /* reserved bit 16 = 1 */ + ATA_OUTL(ch->r_mem, SATA_PHYM4, val); + + val = ATA_INL(ch->r_mem, SATA_PHYM9_GEN2); + val &= ~0xf; /* TXAMP[3:0] = 8 */ + val |= 0x8; + val &= ~(0x1 << 14); /* TXAMP[4] = 0 */ + ATA_OUTL(ch->r_mem, SATA_PHYM9_GEN2, val); + + val = ATA_INL(ch->r_mem, SATA_PHYM9_GEN1); + val &= ~0xf; /* TXAMP[3:0] = 8 */ + val |= 0x8; + val &= ~(0x1 << 14); /* TXAMP[4] = 0 */ + ATA_OUTL(ch->r_mem, SATA_PHYM9_GEN1, val); + } +} + static void mvs_reset(device_t dev) { @@ -2042,6 +2082,7 @@ mvs_reset(device_t dev) ATA_OUTL(ch->r_mem, EDMA_CMD, EDMA_CMD_EATARST); DELAY(25); ATA_OUTL(ch->r_mem, EDMA_CMD, 0); + mvs_errata(dev); /* Reset and reconnect PHY, */ if (!mvs_sata_phy_reset(dev)) { if (bootverbose) @@ -2299,7 +2340,7 @@ mvsaction(struct cam_sim *sim, union ccb *ccb) d = &ch->curr[ccb->ccb_h.target_id]; else d = &ch->user[ccb->ccb_h.target_id]; - cts->protocol = PROTO_ATA; + cts->protocol = PROTO_UNSPECIFIED; cts->protocol_version = PROTO_VERSION_UNSPECIFIED; cts->transport = XPORT_SATA; cts->transport_version = XPORT_VERSION_UNSPECIFIED; diff --git a/sys/dev/mvs/mvs.h b/sys/dev/mvs/mvs.h index f4e4a61f33f..4938fb4c6d2 100644 --- a/sys/dev/mvs/mvs.h +++ b/sys/dev/mvs/mvs.h @@ -382,6 +382,10 @@ #define SATA_FISDW5 0x384 /* FIS DW5 */ #define SATA_FISDW6 0x388 /* FIS DW6 */ +#define SATA_PHYM9_GEN2 0x398 +#define SATA_PHYM9_GEN1 0x39c +#define SATA_PHYCFG_OFS 0x3a0 /* 65nm SoCs only */ + #define MVS_MAX_PORTS 8 #define MVS_MAX_SLOTS 32 @@ -537,6 +541,7 @@ struct mvs_channel { #define MVS_Q_GENIIE 4 #define MVS_Q_SOC 8 #define MVS_Q_CT 16 +#define MVS_Q_SOC65 32 int pm_level; /* power management level */ struct mvs_slot slot[MVS_MAX_SLOTS]; diff --git a/sys/dev/mvs/mvs_soc.c b/sys/dev/mvs/mvs_soc.c index 19fe51f2d63..9e9f93ea8f7 100644 --- a/sys/dev/mvs/mvs_soc.c +++ b/sys/dev/mvs/mvs_soc.c @@ -135,6 +135,8 @@ mvs_attach(device_t dev) if (!(ctlr->r_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &ctlr->r_rid, RF_ACTIVE))) return ENXIO; + if (ATA_INL(ctlr->r_mem, PORT_BASE(0) + SATA_PHYCFG_OFS) != 0) + ctlr->quirks |= MVS_Q_SOC65; /* Setup our own memory management for channels. */ ctlr->sc_iomem.rm_start = rman_get_start(ctlr->r_mem); ctlr->sc_iomem.rm_end = rman_get_end(ctlr->r_mem); diff --git a/sys/dev/mxge/eth_z8e.h b/sys/dev/mxge/eth_z8e.h index ecd6bcfab67..b836212266f 100644 --- a/sys/dev/mxge/eth_z8e.h +++ b/sys/dev/mxge/eth_z8e.h @@ -1,6 +1,6 @@ /******************************************************************************* -Copyright (c) 2006-2011, Myricom Inc. +Copyright (c) 2006-2012, Myricom Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -28,7495 +28,7547 @@ POSSIBILITY OF SUCH DAMAGE. $FreeBSD$ ***************************************************************************/ -static unsigned int eth_z8e_uncompressed_length = 375636 ; -static unsigned int eth_z8e_length = 119802 ; -static unsigned char eth_z8e[119802 + 1] = - "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x3f\xbc\x32\x99\xc8\x24\x06" - "\x26\x62\xc4\x29\xc5\x76\xb0\x41\xa3\x05\x89\x16\xdb\xd4\x42\x0d" - "\x02\x1a\x2c\xbf\x14\x6c\xa3\xa2\x09\x1a\xe8\xa0\x11\x22\x44\x18" - "\x20\x64\xc2\x80\x36\x41\x20\xa9\xa0\x46\x09\x09\xbd\xf2\x23\x56" - "\xac\xd8\x02\x62\x45\x19\x24\xf6\x4b\x7b\x93\x0c\xed\x8b\xf7\x9b" - "\xdb\x17\x6f\x47\x6e\x84\x94\x1b\x60\x4a\x06\x32\x26\x33\x67\xbf" - "\x9f\xb5\xf7\x39\xc9\xcc\x30\x41\xb9\xf7\x3e\xcf\xfb\x4f\xf3\x3c" - "\x93\x73\xce\x3e\x7b\xaf\xbd\xf6\xda\x6b\xad\xbd\xf6\xde\x6b\xaf" - "\x43\x74\xe5\x7f\x3e\xb2\xf0\x25\x81\x4c\x07\x8a\x0f\xfd\x37\xca" - "\xff\xf3\xef\x9f\x7f\xff\xfc\xfb\xe7\xdf\x3f\xff\xfe\xf9\xf7\xcf" - "\xbf\xff\x7f\xff\xfc\x09\x34\xe6\xbc\xc9\x4c\x1f\x57\x13\x75\xb9" - "\x2d\xc3\x7c\xa4\x15\xbd\xba\x51\x84\xf0\x2a\x01\xe3\xfc\x30\xbe" - "\xf2\xef\x25\xa4\x99\xaa\xc9\x72\x63\x1a\xa5\x89\x57\x6d\xa6\x09" - "\x5b\x88\x36\x0d\x11\x1d\x1b\x5f\x11\xfe\xc6\x52\xa2\xc3\xdb\xf0" - "\xfc\x8a\x68\xdf\x38\x44\x04\x00\xa7\xc0\x47\xf9\x9b\x18\xce\x6a" - "\x3c\xaf\x46\x3a\xd2\x4a\x7c\x54\xb0\x86\xd3\xaa\x50\xce\x48\xf7" - "\xae\xb9\x48\x8d\xf6\x10\x55\x31\x1c\x7b\x98\x26\x0e\x97\x78\x6c" - "\x45\xde\x54\xce\xbb\x6a\x08\xea\x4d\x27\x72\xbf\x22\x82\x11\x38" - "\x58\xb8\x1e\xae\x5b\xcf\x7f\x34\xa6\x3e\x3f\xd2\xda\x8c\xfa\xfa" - "\x81\x91\xc6\xe5\xb9\x0d\xf6\x6f\x51\xe2\x49\xba\xfa\x3a\x86\xc9" - "\xb8\x09\x37\x59\xbc\xdd\x21\x3a\x49\xc9\x99\x9d\x6e\x4a\x3c\x0c" - "\x6a\x6c\x78\x45\xa6\x27\x7a\x03\x21\xb2\x97\x51\x02\xde\x4d\xc5" - "\xd5\x84\x72\x03\x99\x3e\x33\x6b\x29\x83\xeb\x06\x5c\xb3\x30\x79" - "\x12\xea\x07\x13\x31\x8d\x02\x26\xba\x39\xe0\xa6\x84\x2e\x77\x32" - "\xda\x6f\xc9\x94\xed\x47\xbd\x28\x6b\x3e\x49\x29\xff\x30\x21\x3f" - "\xea\xf4\xdb\x97\x33\x0e\x29\x9f\x08\xb7\xc7\x64\xc0\xd1\xdc\x9e" - "\xab\xeb\x5e\x22\xea\x74\x9b\x26\x07\x4c\x56\xa1\xc3\x39\x60\xc0" - "\xe1\x7c\xa8\x2b\x95\xeb\xea\x74\x9b\x5f\x8a\xc8\xe3\x33\xf2\x00" - "\x6f\xff\xe8\x00\x25\x32\xce\x27\x28\x25\x9b\xeb\xd3\xdb\x62\xe6" - "\x3a\xbc\x4b\x42\xe4\x45\xdf\xa3\xee\x74\xb4\xd5\x7e\x38\x48\x04" - "\x98\xd7\xd4\x97\x11\x31\x7c\xe0\x6f\x57\x30\x53\xc6\x18\x30\x19" - "\x46\x6f\x5b\xdd\x9e\xc1\xf5\x12\x47\x6e\xab\x85\xf4\xbc\x05\x91" - "\x38\x32\x5c\xb4\xe5\x7a\x6e\x4b\x23\x38\x4a\xcf\xb3\xa6\x97\x1e" - "\xbd\xed\xbf\x3a\x27\x06\xb6\x4d\xc1\x4e\x00\xec\x04\x8f\x5e\xae" - "\xb7\xfd\xbe\x98\xfc\x2a\x6f\x5a\x72\xc0\x24\x74\x3a\xa4\xb4\xf7" - "\xe5\x4d\xde\x14\x99\x17\xf8\x98\x14\x6d\xc9\xe4\xa3\x94\x56\xb4" - "\x33\x11\x79\xa6\xa0\x1f\xed\xfa\xfb\xeb\xf4\xf7\x36\xbc\xbb\x5b" - "\xc1\xbb\x3a\x3b\x02\x5e\x1a\xc3\x8b\xe4\x2d\x25\x51\x66\xfc\x92" - "\x60\x20\x5f\x85\xdf\x00\x8b\xc1\x6f\x8b\x6d\x42\x73\x7d\x03\x6d" - "\x5a\xbb\x1d\xb4\x10\xe4\x75\x06\xc9\x3e\x94\x5c\x27\xe8\xea\xdd" - "\x80\x4f\x1b\x96\x93\xc5\x55\x2c\x82\x5e\x67\x07\xb5\xf8\x3b\xc8" - "\xe5\x87\x6c\x84\x2e\x50\xd9\x05\xf0\x62\xe8\x0c\x95\x3d\x4b\xb6" - "\xc6\xd2\x2f\x28\x1e\x2f\x6b\x26\x41\xae\x61\x5c\xb6\x8d\x5a\x6a" - "\xdb\xc8\x55\x1b\x5d\xd6\x75\x03\xd9\x9a\xf1\x8c\x3e\xb7\x32\x1e" - "\x2c\x6f\xa1\x94\xed\xf6\xd2\xd7\xc8\xec\x1a\x4e\xa6\xe6\x42\x8f" - "\x8e\x4b\xaa\x93\x71\x59\x73\x9a\x2c\x6f\xcc\x03\x1f\x9e\x66\x7c" - "\xdf\xb6\xbf\xb3\x3c\x68\x3a\x6c\x9b\x42\x87\x6d\xc7\xa9\xd1\x36" - "\x8e\x1a\x9d\x13\x69\xc3\x69\x4a\x3d\x1c\x1c\x4b\x8d\xe6\x7b\xa9" - "\x31\x63\x22\x79\x3b\x70\x0f\xf9\x3d\x6c\x0b\x90\x7d\x09\xf3\x53" - "\xaa\x63\xd3\x53\x64\xf1\x29\x98\xa0\x5d\x6a\xc9\xa1\x12\x22\xa6" - "\x1d\x3f\xc7\x6b\xc7\xe2\x6f\x90\x0d\xf8\xb5\x03\x97\x1f\x02\x97" - "\xb7\x33\x6c\x94\x05\x9c\x07\x78\x6b\x42\x64\x2e\xa5\xe4\x7e\xe4" - "\x38\x5d\x03\xef\x41\x76\x3b\xea\xa0\x4f\x58\x7e\x3b\x57\xe4\x41" - "\x27\xa4\x42\xfe\x53\xd7\xe8\x32\xd0\xe1\xfa\x15\x99\x3b\x97\xe6" - "\x25\xd4\xbf\x22\xda\xba\xdc\x03\xc9\x78\x07\x59\x6c\xc3\xfb\xf6" - "\xd1\xe9\x94\xe6\x0d\xe5\xd0\xc1\xee\x76\x96\xc7\x8e\x41\x01\x4a" - "\x60\x78\x56\x27\x64\x67\x09\x25\x01\x9f\x3f\xd7\x23\xfd\x3b\xc8" - "\x87\xf2\x39\x3e\x7a\xb9\x83\xcb\x8b\xeb\x1f\x0d\x68\xd7\x3f\x7a" - "\x41\x7b\xf5\xd1\x4e\xf1\xea\xa3\xe7\xc3\xaf\x3e\xfa\x0f\xd7\x32" - "\xb2\x84\xaf\x7f\xd4\xdf\x52\x2c\xfb\x20\xad\xa5\x18\x7d\x10\x26" - "\xcb\xca\x33\x94\xf6\xf8\xb3\xe8\xfb\xd0\x67\xb4\x72\x3e\xd9\xb4" - "\xe4\xb7\x5a\xbd\xa1\x4f\xe9\xf1\x52\x12\xb8\x6f\x8f\xd7\xbe\xce" - "\x94\xb7\x0b\x0c\xd9\x42\xbd\xfb\x7d\xa6\x6d\x36\xae\xd7\x9f\xbc" - "\xb7\x00\xbf\x42\xfc\x1c\xf8\x15\x89\x94\xb7\x8b\x40\x2b\xd7\xa0" - "\x55\x09\x54\xd7\x4d\x34\x5a\xa3\x84\xd3\x34\xf0\x18\xf0\x4f\xeb" - "\x87\x6e\xc3\xb4\xb5\x9e\xea\x9b\xcb\xa9\xac\xab\xcb\x41\xac\x0b" - "\x59\xff\xb1\x3e\xec\x72\x0f\xb2\xa3\x9e\x3c\x29\xbf\xaf\x40\xc7" - "\xa4\x78\xaa\x91\xde\x1e\x58\xe1\x48\xf0\xaf\x70\x98\x3a\x53\x3c" - "\x1b\x91\x67\x22\xf2\x54\xeb\x34\x6c\x67\x58\x90\x2d\xff\xc0\x10" - "\x25\x02\x66\xf1\x7b\x17\x5b\xcd\x5b\x5e\x11\xc7\x91\xaf\xa8\x17" - "\x16\x60\x03\x0e\xe8\x3f\xa8\xdc\x48\x03\xad\xdb\xd6\x23\x1f\x97" - "\xf7\x06\x73\x78\x4c\xf1\x79\x8b\xda\xc9\x1a\xa2\x14\xd1\xa3\xea" - "\x43\x9e\x76\xd6\xe9\x03\x83\x74\x55\x97\x9b\x66\x30\x6c\x2e\xe7" - "\xed\x68\x27\x94\xdb\x28\x5c\x0e\x13\xd2\xa7\x75\x09\x47\xc2\x1a" - "\xa4\x1f\x46\x79\xbd\xee\x76\x03\x47\xae\x83\xfb\x5a\xe2\x09\x7e" - "\x38\x5c\x14\xa4\x81\x35\x94\x88\x72\x33\x19\x1e\xc3\x02\x1f\xf8" - "\xd0\xd6\x8d\x87\x8b\xfc\xa4\x89\x28\x98\x3e\x05\xcf\x9a\x1d\x05" - "\x0f\xe9\x02\xf0\x98\xff\x1a\x51\x66\xe0\x56\x09\xef\xc1\xf7\x34" - "\x86\x17\x24\xb3\x5d\xe2\xfb\x53\x86\xd1\xc5\xfa\x03\x30\x3d\x4b" - "\xee\xa1\x0e\xb2\x6e\xf5\xbb\x1c\x89\x2d\x18\x37\xb9\xfc\x3b\x65" - "\xed\x49\xa2\x33\x2f\x91\x79\x8e\xdf\x7b\x43\xe7\x39\xcf\x2a\xd1" - "\xe9\x48\x1c\xd8\x01\x5d\x84\x3c\x28\xef\x64\x3c\x23\xfb\xf2\xc1" - "\x49\x3f\x1d\x47\x3f\x9d\x38\x79\xe2\x38\x9a\x3a\x7e\xc2\x38\xca" - "\xfa\xe1\xa8\xac\x31\xdf\xfb\xc1\xf7\xe4\xcd\xf7\x7e\x90\xfd\x3d" - "\x9a\xf1\xb3\x07\xc7\xd1\x8c\x69\xe3\x68\x26\x7e\x33\x66\x4e\x7a" - "\x70\xe2\xa4\x99\xe3\x28\xef\xde\xc9\x78\x9a\x30\xee\xf6\xac\xfb" - "\x46\xcd\x98\x30\x79\x12\x3d\x30\xeb\x8e\xac\x3b\xee\xa0\xf1\x93" - "\xa6\xdc\x9e\x95\xa5\x5f\x6f\xcf\xe2\x2c\x8f\x64\x4f\x9a\x39\x6a" - "\xc6\xa2\x85\x25\x0b\x47\x4d\x9b\x3c\x81\x53\xa0\xdd\x22\x78\x28" - "\x33\x7c\x51\x63\x5a\x07\xc4\xb9\x5c\xd2\xa0\x3b\xea\xc0\x03\xf8" - "\x75\x78\xca\x4e\x40\x07\x5c\xf3\x5c\x1d\xf7\x9d\x1c\x03\xac\x07" - "\x20\xf7\xe6\x2e\x77\x5a\x29\x68\x78\x94\x69\x68\xbf\x91\xf5\xc4" - "\xf5\xef\xe3\xdd\x21\x7d\xac\x49\xc2\xfb\xda\xe8\xf7\xd7\x42\x07" - "\x5b\xff\x4f\x8b\x9d\xc8\x8b\x1f\xe8\x1e\x80\x2e\x04\x7d\xfd\xd4" - "\xe9\xca\x4b\x02\x7f\x27\xa0\x8e\x36\xc8\xe6\x51\x94\x6d\x8d\x90" - "\xf9\x36\xf4\xcf\x51\x1e\x57\xce\x52\xda\xbb\x2d\x25\x39\xc4\xfd" - "\xe4\x2d\xd1\x61\x5c\xe8\x85\x91\x22\x61\xa0\xef\x01\xe7\x98\x82" - "\x73\x8d\x3d\x42\x3f\xf8\x18\xce\x06\xbc\xd3\x61\x5d\x68\x81\x9e" - "\x80\x1e\xbf\x55\x73\x65\x92\x48\xd9\x9e\xa9\xf5\x64\xca\xb1\x12" - "\xe5\xf2\x22\xf8\x3a\xd0\xe8\x44\xbe\x37\x72\x13\xc0\x07\x09\x18" - "\x7f\xd1\x96\xb4\x42\xf0\x77\x20\xbc\x76\xef\xb3\xe2\x5c\x1e\xdb" - "\x11\x57\x9d\xa4\xc1\x7f\x46\xfb\x9a\xb4\xb5\x7b\x8b\x45\x97\x4c" - "\x63\xba\xed\x17\xfc\x9c\x82\x7c\x3d\xbd\x69\xef\x73\x1a\xf8\x20" - "\x91\xe5\x55\x08\x99\x8e\x31\x73\xf0\x32\xe8\xb4\x56\xe4\x2d\xe6" - "\xbc\xa3\x43\x34\x00\xba\xc6\x66\x77\x25\xd0\x09\x1a\x4c\x5a\xca" - "\xde\x45\x11\xf5\x01\xce\x60\x1e\xa4\x98\x1f\xcd\x5d\xe7\x00\xa7" - "\x53\xa6\xc3\x8e\x19\xfc\x18\xe0\x2f\x66\x5d\xa9\xf4\xf7\xf5\xff" - "\xce\xf9\xf4\xb1\xb9\xef\x19\xb2\xae\xe0\x5c\xff\xef\x87\x41\x4b" - "\xb6\x17\xd8\xfe\xeb\x72\x0f\x9e\xe5\xa3\x81\x7e\x35\x36\x5e\xdf" - "\xca\x79\x35\xe0\x28\x52\x93\xb8\x2d\x25\x9e\xe5\x1d\x74\xb2\x98" - "\xc7\xda\xc1\x69\x9a\xcb\x41\xd1\x38\x5d\xd3\xc4\xf8\xb3\xfe\x00" - "\x2d\x3e\x05\x1f\x24\x03\xde\xb6\x68\x3e\x18\xec\x01\x9c\x67\x81" - "\x5f\x2b\xda\xf4\xac\x8f\xae\x39\xa2\x75\x3a\x50\x2f\x99\x20\x57" - "\xd0\xe7\x7d\x30\xf4\xf2\x6d\xd1\xe5\xaf\xa9\xe0\x72\xc8\x9f\xd4" - "\xd5\x29\xf3\xaf\x63\x9a\xeb\x7c\x07\xbe\xbc\x36\x3d\x86\x2f\xb7" - "\x00\x97\xff\x88\x78\x3f\x26\xe6\xfd\x2a\xbc\xff\x4f\xfd\x3d\xe4" - "\xfe\xda\x59\x31\x7c\x5b\x8c\xf7\xa7\x80\x6f\x00\x72\x0d\xdb\xe2" - "\x9a\x5c\xf0\x98\x3f\x22\xff\x9a\x98\xfc\x5b\x91\xff\xbf\x98\x6f" - "\x78\xcc\xe1\xfc\xf5\xba\xec\x20\xbf\x05\xf9\xf7\xc4\xd4\x3f\x07" - "\xf9\x03\x11\xf8\x1d\x8b\x7e\x9f\x5e\x8b\xf7\x5f\x32\xaf\xc3\x26" - "\x4a\x42\x9e\x01\xac\x4b\x58\x8f\x1d\x2e\xe2\xfe\x4a\x37\xc7\xe4" - "\xcf\x40\xbe\x54\x9d\x46\x26\x9d\x46\xb9\xdc\x8f\xa8\xe3\xb8\xc2" - "\x21\x3d\x3b\xa6\x4c\x1e\xca\xa4\x83\x8e\xcf\x1a\x7c\x19\xa7\x4c" - "\x51\x4c\x99\x75\xdc\x8f\x42\xd5\x63\xee\xea\xe9\x2b\xa3\xeb\xc8" - "\x48\x18\xdc\xb6\xab\x01\x63\x77\x34\x8c\x21\xed\xa8\x77\xd8\x7a" - "\xa5\x77\xae\x06\x0f\xdd\x81\xb4\x7f\x07\xcc\xe7\x58\x06\x20\xab" - "\x01\xaf\x3f\x48\xc2\x95\x9b\xaa\x78\xf7\xba\x6b\x06\x85\x88\xef" - "\x47\xf1\x3d\xc3\x16\x5d\x53\x74\x99\xbc\xee\x1a\x5c\x91\x9e\xce" - "\xf6\x5b\x02\xeb\x60\xd1\xf5\x13\x4d\xc1\xbc\xee\x4e\x61\x22\x13" - "\x9e\xc3\x7a\x1d\x7f\xc6\x73\x02\xf0\x5f\x84\x31\x87\xc4\x52\xe4" - "\x5b\x4e\x13\x90\x7e\x48\xca\xaa\xca\x27\x9f\x55\x1d\xb9\xcc\xdf" - "\x63\xf0\xfc\xbe\x5e\xfe\x5d\x86\x87\xfb\xdb\xf5\xfb\x84\x30\xc3" - "\x3a\x67\xc8\xe0\x90\x37\x65\x39\xc8\xa1\x84\x8f\xf2\x62\xa9\x7c" - "\xc7\x30\x5f\xc6\x75\x32\xae\xab\x70\x7d\x00\xd7\xc7\x5c\x5f\x92" - "\xcd\x15\x96\xf2\xc8\xcf\x93\x71\x7d\x10\xd7\x3b\x71\x9d\x89\xeb" - "\x70\x5c\xef\x41\x1b\xc2\x2c\x17\x18\x47\x79\x8e\x15\xc0\xb8\xaa" - "\x78\x8b\xe7\x00\x5d\xb9\x4c\x83\x49\xc8\xd3\x2e\xe5\x55\xe9\x17" - "\x8b\xea\xc7\xeb\x3a\x64\x5a\x8a\x4c\x1b\xa0\xf8\x41\xa5\x85\x0d" - "\x3d\x74\xae\x2f\x4d\xd7\x4d\xba\x2c\xea\x69\x0a\xfe\x0c\xc0\xf7" - "\x30\xae\x42\xc1\x4a\x52\x7d\xae\xc3\x57\xe5\xcc\x71\xea\x4c\x88" - "\xac\x13\xd7\x4d\x2e\xa7\x10\xb8\x96\x73\x1f\xf9\x68\xc8\x6e\x21" - "\xf9\x1e\x63\xac\x82\x37\x5b\xcf\x37\x86\x69\x2c\xcb\xcb\xf4\xf4" - "\xa3\x11\xbc\x34\xb8\xcb\x3d\x24\x14\x23\x47\x59\xe0\xa5\xdb\x98" - "\x67\x98\xee\xdc\xb6\x41\xc5\x72\x1c\x97\x6d\x91\xf0\xcf\x29\x9e" - "\xac\xd3\xe7\xad\x4a\x7e\xaf\x9f\x18\xa3\x5f\x24\xcf\xc6\xc8\x7b" - "\x07\xd3\x3c\xb1\x94\xe5\xe0\x7a\xcc\xff\xde\x19\x26\x6d\xc6\xb5" - "\x7b\x97\xf0\xfb\x00\xfa\x98\xeb\x4d\x2c\xe6\x76\x5c\xbf\xc9\x78" - "\x2f\xdf\x25\x1f\x4a\x63\xfe\x4e\x2c\x92\xef\x76\x63\x3c\xda\x6f" - "\xbc\x33\xea\x49\x2c\x91\xef\x9a\xfa\xe0\x6e\xcf\xd5\xe1\x26\xc6" - "\xb3\xf9\x44\xc5\xf6\xec\x51\x44\xa6\x5b\xcb\x29\xc9\x1b\x3a\x46" - "\xd3\x43\x22\x3c\xaa\x9c\x92\xbd\xa1\x5d\x74\x0b\xd1\x35\xde\xd0" - "\x71\xba\x95\x68\xb8\x37\xb4\x09\x36\xc8\x36\x7e\x7f\xf0\x66\x4a" - "\x48\xc0\xd5\x75\x53\xb9\x29\xc1\x1b\x2a\xa1\x8c\x72\x33\xae\x45" - "\x74\x6f\x92\xe8\xf2\x86\xa6\x20\x5f\x21\x4d\x0f\x8b\x73\x13\x93" - "\xc4\xdf\xf2\xc3\x94\x36\xe5\x79\xe1\xf2\x86\x30\x1f\x08\x35\x21" - "\x5d\x13\xd3\xc3\x5f\xe2\xd7\x25\xb4\x8a\xed\xb9\xd3\xc3\xe7\xc4" - "\x84\xe7\x0f\xe2\xf9\x6f\x02\x7d\x24\xbc\xa1\xb1\xd4\x12\x08\x20" - "\x9f\x4b\x88\xca\xed\xd9\x8f\x5f\x30\x51\x0f\x6c\x08\xad\x72\x7b" - "\x2e\xda\x92\xd7\x83\x76\x60\x7c\xfd\x59\xcf\x0a\x5c\xd7\x6e\xff" - "\xa9\x7c\xae\xd8\xee\x10\x96\xed\x79\xb7\x61\x72\xc5\x6d\xf0\x86" - "\xda\x28\x1f\xd3\x83\xe9\xcb\xfc\x82\xf1\x1f\xb4\x8a\xe7\x56\x63" - "\x09\x7d\x60\x9d\xbe\xcc\x25\xf0\xce\x22\x92\xb7\xe7\x79\x43\x1d" - "\x84\x3a\x1c\x80\x37\x57\xc2\xab\xd8\x5e\x81\xbc\x7e\xce\x17\x09" - "\x87\x61\x70\xde\xe9\x61\xb2\x22\x7f\x45\x4f\xf2\x76\x27\x7e\x35" - "\xf8\x1d\x41\xd9\xbf\x0a\x77\xfa\x21\x81\xf1\x1e\xe5\xdb\xf1\x1c" - "\x0c\x42\x86\x25\x2d\xc3\x34\x00\xf9\xdb\xc1\x2f\x13\xc1\x77\xc0" - "\x77\x87\x4d\xe2\xbb\x76\xc7\xf5\x41\xd9\x8e\x1d\x43\x54\x3b\x76" - "\x5c\xc7\xe9\x9d\xb0\x75\x70\x9f\xdd\xa9\xde\xfd\x00\xe5\x66\xc9" - "\x72\x15\x3b\xb2\x85\x65\x47\x6e\x10\xf2\x05\xba\x96\x33\x1d\x41" - "\xd7\x72\xa6\xa5\xa8\xdc\x91\xed\x75\xae\x23\x91\xbc\x23\xb7\x27" - "\x79\x47\x1e\xca\x3f\xd5\x23\x6d\x90\x1d\xce\xa0\x82\xbd\x14\x70" - "\x66\x83\x6f\x13\x01\xc3\x09\x58\x15\x3d\x6e\x3b\x4d\x5f\x26\x82" - "\xd3\x43\xab\x42\xf9\xcb\x28\x71\x24\x95\x03\xdf\x0f\x41\xa3\x42" - "\xb4\xb3\x11\xd7\x89\x78\x4f\xd7\xa2\xae\x83\x80\xeb\xe4\xfa\x50" - "\x4f\x05\x60\x3e\x0f\x58\x85\x8c\xd3\x97\x6e\x4a\xc3\x73\xcd\x97" - "\x0a\xbf\xfd\x5a\xc5\x8e\x56\xcd\xb2\xe3\x88\xc1\x43\xcc\x3f\x8a" - "\x6e\x9b\x68\x5a\x40\x84\xbc\xa1\x2d\x04\x1e\x4b\x6b\x09\x1c\xe7" - "\xf7\x98\xff\xec\x42\x3f\x33\x4f\x95\xe0\xba\x8d\x98\x7f\x5a\x8a" - "\x9f\xe7\xbc\x07\x99\x87\xa6\x15\x07\x56\x8d\xa2\xe2\x04\x3c\xbb" - "\xf2\x43\x16\x7a\xbc\xd8\x5c\x1e\xae\xd8\xd1\xd0\x52\xcc\xfd\x72" - "\x0c\x65\xb8\x5c\x11\x59\x13\x30\x07\x48\x10\x21\xab\xd3\x6f\x1e" - "\xe8\x70\x89\x96\xc0\x14\xe4\x2d\x26\x6e\x0f\xf3\x11\xe7\x9f\xda" - "\x21\x7c\x61\xcb\xce\x3c\x6e\x9b\x18\x54\x4e\xcd\x1d\x77\x12\xcf" - "\xc3\x9a\x3b\xb6\x31\x9f\x6a\xc2\xb2\x33\x13\x3c\xda\x33\xb5\xa3" - "\x3c\xe9\xf1\x0b\x94\x80\xb4\x70\xb3\x63\x17\xde\x37\x22\x5f\x93" - "\xe4\xdb\x69\x17\x42\xd6\x90\x65\x47\x4d\xa8\x62\x67\xf6\xb4\x0b" - "\x3d\xa2\xd9\xb1\x89\x1e\xeb\x28\x07\xad\x76\xd1\xd4\x33\xa1\xc4" - "\x96\xe2\x42\xe4\xe9\x42\xfa\x36\xc9\xff\x53\xcf\x74\x8a\x69\xb0" - "\x66\xa6\x5d\xf8\x9b\x98\xea\x10\x07\xf3\x9d\x34\xe8\xea\x55\x42" - "\x63\xb9\x68\x6a\xdb\x45\x57\x1f\xf7\x11\xcb\xc4\x94\x39\x9a\x98" - "\x7a\xe6\x9c\x78\xfc\x59\xa6\xcd\x58\x6a\x76\x40\x7e\x9c\x9b\x98" - "\xde\xfb\x9b\x1d\x07\x50\xff\x44\xc0\x75\x09\xaf\x73\x0b\xf2\x7a" - "\xac\x8f\x9d\x49\xa3\xa6\xb6\x4d\x14\x4a\xde\x51\x13\xae\xdc\xd1" - "\xa0\x25\xef\x38\xa2\x55\xee\x68\x15\xc9\x3b\x33\x43\x95\x3b\xb3" - "\xc3\xc9\x3b\xc1\x03\x3b\x1b\xd0\x4f\xc9\xdc\xe7\xdd\x6e\xb2\xe3" - "\x79\x47\x37\xf7\x7f\xc5\xce\xfd\x68\x6b\x2b\x6c\x5e\xa1\x78\x7f" - "\xe7\x7e\x5e\x5b\x40\xd9\xd6\x9e\xe4\x9d\x47\x90\xaf\x55\xc9\xd7" - "\xce\x76\xe6\x4b\xe4\x33\x21\xed\x14\xe6\x3d\x89\x78\x1f\xec\x49" - "\x6e\xb0\xe0\x67\x13\x6b\x1b\x1c\x80\x7f\x8d\xe4\xa9\x8a\x06\x87" - "\xf8\x71\x35\x6c\xe8\x0b\x80\xd3\x50\x31\x3d\x7c\xb7\x00\x0d\x21" - "\x27\x0d\x0e\xad\xb2\xc1\x29\x52\x1a\x1a\x82\x92\xf7\x1b\x76\x32" - "\xec\x9e\x15\x99\xbc\xe6\x60\xc6\x7b\xd8\x80\x6f\xde\x1a\x64\x5e" - "\xb5\xbc\x99\xa9\x59\xde\xac\x10\x15\x6f\x66\xff\xe4\x79\xe1\x0f" - "\x57\xbc\x99\xa7\x55\xbc\x99\x1b\xba\x0a\xb6\xb9\xf3\x00\xb1\x7e" - "\x0a\x7d\x24\x40\x83\x4f\x40\x8f\x6d\xb2\xff\xbd\x4e\xc8\xc0\xb2" - "\xa1\xe5\xcd\x1d\xe0\x85\xe2\xb7\xa5\x6e\x6a\x09\x1c\x93\x34\x15" - "\xc9\x6f\x66\x32\x4f\x71\xff\x3e\x5e\x4c\xe5\xa2\xf2\xcd\x6c\xad" - "\xf2\xcd\xdc\x70\x25\xe0\x26\xa3\x9e\x94\xb7\xfe\x14\x94\xf2\xfa" - "\x16\xf8\xf5\x00\xca\x7c\x42\x8a\xc7\xdf\x3a\xd2\x9f\x8e\x64\x5d" - "\xc5\xfa\x69\x7a\x28\xc8\x3c\x73\x8a\xf5\x9a\xd2\x53\x94\x6f\xe8" - "\x29\xd6\x51\x3c\xdf\x61\x3d\xa5\xe9\x7a\x4a\xd3\xf5\x94\x7c\xb6" - "\x40\xd7\x54\x6c\xcf\x63\x7d\x34\xdd\xa9\xf4\xcc\xf4\x70\x96\x00" - "\x6f\xa4\x02\x46\x9e\xea\x0b\xe4\x59\xbb\x7d\xae\xcc\x2f\xe9\xb4" - "\xbd\x42\x83\xbe\xc1\xaf\x46\x53\xfa\xa6\x55\xd7\x37\x26\x43\xdf" - "\x84\x31\xae\x41\xa6\xb4\x78\xfa\x46\xd3\xf5\x4d\x58\x28\x7d\xa3" - "\xe9\xfa\x86\xd3\xc3\xba\xbe\x09\xc7\xd1\x37\x90\x67\x6e\x6f\xa2" - "\xae\x67\xca\x59\xcf\x70\x7b\xc1\x6b\xb9\x9a\xd2\x33\x0e\xcc\x75" - "\x4c\xac\x67\xc2\x28\xa3\x19\x7a\xa6\x4b\x96\xaf\x60\x5d\xd3\xf3" - "\x02\x41\x7f\xda\x89\x75\x8c\xd4\x27\xa1\xe1\x21\xd6\x27\xa0\xdf" - "\xdd\xb1\xfa\x04\xf0\x6a\x70\x9f\xa6\xeb\xa9\x23\x98\xe9\x86\xa0" - "\x4f\x1a\xa6\x3b\x03\xe8\xeb\xcf\x30\xf7\x87\xde\x76\x96\x94\x7b" - "\x9d\x21\x82\x1e\x68\x15\x2d\xe5\x04\x1c\xc1\xbf\x61\xe8\x0a\x22" - "\xc8\x65\x66\x08\x32\x0e\x1e\xcf\x6e\x29\xfe\x94\xc2\x90\xd5\xa9" - "\x1d\x9d\xde\xc7\x03\x99\x69\x53\xcf\x08\x3f\xe8\xe3\x7b\xbc\xb8" - "\x1c\xfa\x25\xd3\xdf\xdc\xf1\x21\x4d\x69\x13\xda\x94\x02\x9f\x1d" - "\x32\x90\x3d\x75\xbe\xc7\xfa\xf8\xb3\x69\x90\x33\xe1\x81\x5e\xfc" - "\x7f\xa6\x9e\x49\xb3\xce\x6e\xa3\x6f\x4d\x99\x23\xb4\x30\xe4\x0c" - "\xed\x6d\x40\xbb\xf7\x03\xf7\x23\x90\xb9\x56\xc8\x59\x66\x28\x46" - "\xce\x20\x33\x3b\x70\x6f\x57\xf4\xdb\xd9\x0a\x39\xdb\xaf\xc9\xf1" - "\xac\x4d\xce\x31\x51\x4f\x2b\xaf\xc5\x41\xd6\xf6\x6b\x95\x4a\xd6" - "\x34\x55\xae\x5d\x63\xfa\x99\x74\x59\x43\x5f\xe0\x7d\x10\xb2\x63" - "\xc1\x2f\xbe\xac\x15\x47\xc8\xda\xb3\xba\xac\x25\x2b\x59\x43\x9f" - "\x26\x86\x57\x28\x79\x63\xf8\x3c\x0f\xed\x95\xb7\x94\x37\x33\x71" - "\x9f\xa0\x78\x47\xca\x1c\xc6\x95\x37\xf3\x20\x6f\xb9\x90\x37\xc0" - "\x13\x7e\xd6\x9b\xe0\xcd\xff\xe0\xb1\x6e\x5a\xb1\xf8\x8f\xfc\xf0" - "\xd0\x72\xc8\x53\x1e\x74\xd9\xdf\xa0\x47\xff\xe3\xf1\x00\x6d\x85" - "\x3c\x65\x42\x8e\xb2\x21\x4f\xb9\x90\x2b\x96\xa7\x23\xe1\x15\x0c" - "\xf3\xad\x23\xbd\x30\xe4\x58\x19\x2d\x4f\xfd\xad\x83\x76\xb9\xed" - "\xa5\x3e\xfa\xa0\x98\xed\x15\xdc\x57\xf8\xe8\xc0\x44\xfd\x1e\xf6" - "\xcf\x56\xb9\xb6\xc5\x32\x58\x5c\x46\xd7\x9d\xa6\xe1\xb9\xe0\x77" - "\xc2\x7d\x2a\xee\xa7\x4c\xbf\xe5\x20\xec\x88\x8e\x76\xd4\xdb\xc5" - "\x72\x28\xdc\x63\xd8\x3e\xcb\x01\x1f\x5a\x44\x57\x66\x2a\xec\x4b" - "\x4d\xf4\xd8\x78\xad\xcd\x8a\xe7\x41\x68\x7f\x06\xae\x83\xb7\x5c" - "\xa4\x74\xfc\x6c\x5b\xdc\x5a\x39\xdb\x4e\xb8\xcf\x12\x4b\x6d\x29" - "\x1b\x96\xd0\x48\x6b\x80\x2c\xf5\x6e\x2d\xcf\xba\x2a\x8d\xd7\x9c" - "\xd2\xf9\x5e\xb8\xb7\x8d\xad\xbf\x48\x66\x5e\x17\xd0\x92\x51\x9f" - "\xd3\x2a\xc4\xe2\x4c\xaa\x5f\x04\xfd\xe0\x26\x5b\xbd\x5b\xec\x0e" - "\x77\x49\x99\xcc\x36\x70\x61\xdc\x80\xe7\x0d\xc0\x73\xf6\x43\xcb" - "\x72\xe8\x13\x27\xc5\x5d\xab\xed\x72\x0f\xef\x6d\x7f\x3f\xef\x6b" - "\x0d\x9a\xf4\xf3\xfe\x80\x41\xa7\x7e\xd6\xf5\xcc\x3c\x46\x87\x97" - "\x08\x7f\xd5\x53\xc4\xb4\xb0\xb9\x42\xe2\x3f\x41\xc7\xf2\xb2\x30" - "\xdd\x30\x7d\xd9\xb7\x85\xb7\x43\x78\xbc\xce\x33\x54\x8f\xf7\x65" - "\xa5\x42\xd3\x92\xf7\xfa\x44\xe5\xde\xe3\x9d\x4b\x44\x88\xd7\x72" - "\xba\xdc\x37\xda\x7d\xf4\x23\x8f\xea\x8b\x1d\xfb\xe5\x1c\xd2\xb2" - "\xf7\x38\x60\x5d\xc3\xb0\x9a\x51\x3e\x5c\xb9\xb7\x0d\xf9\x60\x6f" - "\xfe\x51\xae\x77\x40\x8e\xf7\x17\x2f\xa7\x6f\x9e\xa6\x1b\x25\x8d" - "\x45\xc5\xde\x00\xeb\x03\xa4\xa5\x21\x6d\x1d\xe0\x07\x91\xdf\xe9" - "\xa3\xbd\x9b\x94\x1d\x7b\xe3\x3a\x23\x1f\xee\x0b\xf8\x3e\x8a\x7f" - "\x12\xe4\x62\x3a\x60\xd9\xfb\x36\xab\x12\xf4\xe5\x75\xe3\x2f\x0d" - "\xbf\x9c\xf8\xaf\xfb\xf4\xf9\xce\x6c\xd8\x5a\xe4\x5a\x49\xc3\xd0" - "\x3f\xc0\xef\x3b\x09\x98\x47\x9c\x14\xee\x1b\x6b\xde\x58\x1e\xc4" - "\x3c\xe1\x3b\xa9\x3e\x7a\xb1\xb1\x3f\x7a\x0a\xb6\x75\x2e\x8a\xf6" - "\xaa\x25\xbd\xb4\xfc\x7c\xfa\x32\x4d\xf0\x3d\xeb\xa3\x7a\xa4\x33" - "\xdd\x00\x67\x96\x41\xb3\xfe\xfb\x65\xaf\x5f\xcd\x39\xbf\xb3\x47" - "\xb8\x05\x79\xbe\xc5\x7b\x4c\xdf\xd9\xab\xe8\xb0\xf3\x48\x27\xf4" - "\x08\xaf\x13\x63\x6e\x16\x58\x6c\x13\xa0\xd7\x77\x1a\x7c\x34\x32" - "\x4b\x5f\x87\x0a\x78\x43\x93\x58\xb7\xc4\x1d\xb7\x78\x4f\xac\x0f" - "\x7e\xc6\xb1\x96\x61\xd0\x43\x52\x37\x1d\x9a\x55\xa6\xf0\x0e\x32" - "\x5c\x4f\xd9\x79\x6a\xc3\xfb\xc5\x01\xd1\x2e\x2a\x0e\xe5\xf2\x3c" - "\xc2\xb3\xa4\x9b\xd3\x3e\x05\x6f\x0b\xcf\x22\xc6\x29\xe3\x53\xcf" - "\xb7\xba\xe9\xa4\x93\x12\xeb\x7b\xd7\x7f\x32\x3c\xbc\xde\xa3\xd6" - "\xb9\x32\x72\x7c\x34\x2a\x68\xe0\xc5\x36\x06\xe8\xcb\xb4\xde\xcf" - "\xb6\x06\xef\x3d\x2c\x2e\x15\x41\xb6\x39\x90\xb7\xc8\x68\x03\xb7" - "\x4f\xb5\x2b\xa3\x3c\xb2\x5d\xbc\x47\x65\x2d\x55\x34\x58\xbc\x8c" - "\x2c\x76\x45\x6b\x0b\xb7\x97\xdb\xc2\x6d\x96\x6d\x91\x3a\x16\x63" - "\x44\xe8\x4e\xcc\xc7\x64\x7a\x2b\x60\x61\xfe\x33\x52\xe7\xa9\x8c" - "\x9c\x58\x3e\xea\xed\x47\xcb\x8e\x0a\xcc\x41\xbf\xe5\xd2\xc4\x89" - "\x93\x34\xe2\x61\xb5\x76\x36\xe2\x61\x8d\xed\xec\x20\xf3\xef\x07" - "\xad\x3c\x26\x7b\x4b\x59\xdf\xca\xbc\xd7\x22\x6f\x1b\xf2\x4c\xd6" - "\xf3\x4e\x56\x7b\x76\xf2\x3a\x80\xaf\x18\xc7\x9e\xf7\xd1\x88\x02" - "\xbf\x1c\xef\x0f\xa5\x19\xcf\x98\xbb\x63\xfe\x37\xc2\x26\x2a\x3f" - "\x68\x8d\x8f\xcb\x9b\x15\x3c\x9e\x85\x2f\x8a\x0e\xd4\x73\x3d\xf3" - "\x94\x6b\x19\x7d\x03\x7c\xf9\x79\xd9\x4a\xba\x96\xf9\x49\x24\xef" - "\x0d\x29\xba\x8f\xd8\x25\xdc\xb0\x3d\xa1\x51\x8b\x97\xd0\x37\x21" - "\x47\x81\xd3\x34\xe2\x50\x7e\xa9\x1d\xb8\x12\x55\x9d\x25\x92\x3a" - "\x28\x79\x6f\xd0\x1b\xfa\x82\xea\xcf\xf2\xda\xce\x08\x9f\xc1\x8b" - "\xb8\xef\xb8\x9c\xbe\xc0\x38\x63\x51\x6b\x0f\x37\x3d\xcc\xfb\x0c" - "\x27\xe8\xa6\x89\xdc\x5e\xb5\xc7\x79\xd3\x9d\xe2\xa2\x98\x2d\xd4" - "\x98\x16\xf4\xd1\x4d\xc5\x18\x5b\x2c\xf2\xe7\xa6\x02\xf5\xbc\x33" - "\x88\x7c\x19\xe2\xa2\x46\x9c\x8e\xb4\xb1\xc2\x9d\xc0\x32\x71\xa0" - "\xcb\x7d\x93\xc3\x47\x3f\x6e\x55\x7d\x73\xd3\x18\x86\x15\x1f\x87" - "\x9d\x41\xf4\x2d\x31\x6f\x02\xd6\x9f\xed\x65\xbc\x76\x79\xd3\x76" - "\x29\x17\x80\x55\x6f\x52\x7a\x5b\x03\xae\x75\x6e\xcd\x01\x1d\xed" - "\xd0\xd6\x7e\x94\x23\xef\xf5\x77\x42\x1f\x47\xe3\xc3\x3f\x34\xcb" - "\x33\x94\x79\xfc\xe6\x91\x0a\xce\xa1\x5c\xcf\xd0\xd3\xfc\x3c\x8a" - "\x9f\x03\x96\x83\x39\xde\x9a\x1c\xd4\x7f\x1a\xf5\xde\x3c\x52\xcd" - "\xe7\x6f\x1e\xd5\x89\x3a\xba\xdc\x37\x8f\xf4\xd1\x68\xb3\xda\x73" - "\x39\x98\xd3\xdf\x5e\x32\xcb\x0e\xcb\x9c\x92\xe9\xcc\x33\xcd\x5b" - "\xa5\xfc\xb5\x77\x5a\x1a\x2c\xba\xde\xe0\x75\x9a\xd4\x13\x94\xd9" - "\xd1\x6c\x93\xfc\x6d\x12\xa6\x9b\xd7\xfd\x46\xf3\x9b\x78\x5f\x4c" - "\xa9\xaf\xcc\x8e\x4b\x7f\x37\x7b\xf0\x3b\x8a\xdf\x71\xfd\xb9\x1d" - "\xbf\x10\xee\xa7\xe0\x77\x5c\xd2\x6e\x73\x61\x82\x0f\xef\x3a\x61" - "\xb3\xf3\xb3\x8f\x6e\x3e\x22\x36\x67\x98\x60\x97\xc8\xfb\xfa\x6f" - "\xf0\x3a\xc1\xcd\xd0\xb3\x37\x95\xaa\xbe\xc8\x94\x6b\x2a\x90\x47" - "\xa6\xbb\x70\xd5\x88\x60\x63\x59\x80\xf1\xce\x68\xac\x09\x90\xfd" - "\x26\x6e\x7f\x26\xdb\x0f\x22\x00\xfa\xf3\x75\x71\x8d\xf0\x1f\xae" - "\x0d\x11\xef\xcf\x75\xb9\x33\x21\xff\xf3\xa7\xa8\x35\x87\x43\xc5" - "\x0c\x4f\xe7\x09\x61\xb4\x5f\xe9\xb4\x83\x39\xdc\x97\x78\x7e\x0e" - "\x6d\xb7\x9e\xa5\xcc\xbd\x22\xe5\xa3\x9c\xc3\x0e\xa2\x2d\xd0\x23" - "\x18\x6b\xe4\x5e\x41\xbd\xf4\x0f\xc8\xc4\xf8\x7f\xd3\x71\x63\x3f" - "\x69\x3d\xde\x6f\xc0\x3b\x8c\x3d\xfe\x66\x47\x90\x18\x56\x98\xdb" - "\x87\xf2\x1f\x6a\x7e\x33\xc6\x6a\xf4\xf9\xc1\x9c\xb2\x62\xe8\x99" - "\x5e\xbd\x95\x39\x7b\xe5\x19\x11\x34\xda\x77\x78\x2b\xcb\x42\x26" - "\xf8\xff\x69\x47\xbf\xfc\xdf\x8b\xf3\xad\xc9\x87\x33\x54\x9f\x69" - "\xa0\x4b\x74\x9f\xdd\x6a\x51\xfd\x75\xcb\xd8\xe8\xfe\xba\x15\xb6" - "\xcd\x2d\x6b\xf0\xab\xc5\x6f\x97\x7a\x8e\xfc\xdd\x52\x1c\x71\x7f" - "\x00\x3f\xe8\xce\x5b\x30\xfe\x8f\x08\xaa\x7e\xe0\x74\xb4\x83\x79" - "\xe4\x1f\x64\xd1\x7a\xf2\x88\xf7\x6b\x39\x9d\xf9\x99\xd3\x35\xd8" - "\x33\x3e\xba\xa5\x1a\xef\xd3\x58\x56\xab\x34\x8a\x7a\xef\x45\xed" - "\x9e\xe5\xd0\xd5\x74\xcb\xe7\x0c\xcb\xba\xaa\xa2\x82\xf9\x14\x65" - "\x36\x59\x43\x15\x15\xa8\xaf\xc3\xa0\x2b\xd2\x8e\xf1\x7b\xe6\xc9" - "\x2e\xf7\xad\x66\xd0\xa5\x41\xee\xc7\x62\xbe\x17\xdf\xd6\xb8\x35" - "\xb3\xd7\x26\xb3\x34\x38\x58\x1f\x75\xd0\x77\xc7\x40\x67\xa1\x6f" - "\x3f\xca\x56\x63\xcd\x77\xef\xe4\x67\xe8\xca\xcf\x71\x9f\xd5\x0c" - "\x9d\xd4\xbd\x76\x6f\x41\x8f\x89\x06\x74\x9b\x28\x27\xb4\xf6\x4c" - "\x6a\x28\xe5\xed\x22\x6f\xfb\x1e\x6a\x09\xfd\x96\xec\x4f\x49\x18" - "\xb7\x78\xc1\x03\xae\x65\x22\xfc\x4e\x77\x83\xd9\x1b\x3a\xe7\xc1" - "\xd8\xfc\xed\xd3\xf4\x5d\x49\x8f\x17\x4f\x60\xd4\x7f\x5c\xc2\xd6" - "\xe9\xd3\xd1\xbe\x61\x9e\x08\x6d\x38\x29\x02\xb0\xef\x52\xd6\x77" - "\xd3\xc8\xd7\x97\x53\x56\x6d\x37\x65\xd4\x75\x53\xa6\x38\x95\x69" - "\xaa\x85\xdd\xf6\xf8\x85\x34\x82\x4e\xc8\x1b\x54\x4c\x96\xba\xe5" - "\x24\x79\x24\x5c\x09\xfb\x2d\x04\xfb\xed\x5c\x26\xeb\xc6\x5e\xfb" - "\xad\x47\xda\xc5\xfb\x0a\x15\x1f\xed\x2b\x1c\xe8\xa0\x84\xd4\x02" - "\x4a\x03\x7e\xae\xb3\x74\xeb\xfc\x54\x0c\x88\xdc\x66\x9f\xde\x5e" - "\xd0\xbc\xd4\xea\xa0\x01\xb2\xad\xd0\xd7\xa2\xf2\xa3\xec\x7e\xc7" - "\x61\x13\xf3\x54\x80\xe5\x86\xdb\xb0\x8a\xf7\x8c\xf7\x0c\x0d\x9a" - "\x17\xd7\x8a\x20\xa7\x97\x0c\x17\xd0\x99\xdf\x75\x70\xdd\xbb\x91" - "\xde\xe5\xfe\x6e\xb5\xcf\xf4\xab\x91\xfd\xf1\x28\xe6\x47\xba\x5e" - "\x19\x79\x8d\x30\x95\x83\x47\x1b\x1a\x56\x86\x60\x7b\x9f\x65\x99" - "\x1d\x99\x36\xbd\x48\x84\xec\x0b\x78\xff\x7e\x24\xb1\x6f\x01\xef" - "\x29\xfe\x06\xb6\xcd\x57\xf9\x13\xf0\x78\xc1\x73\x05\x6b\x11\x60" - "\xae\x6d\x68\x10\x98\x9f\x7f\x5d\x7f\x06\xb4\x33\x75\xe3\x10\xf6" - "\xb3\x19\x39\xc5\x47\x53\xb6\x31\xee\xd2\x97\x06\xba\x13\xf6\xd6" - "\xb5\xc0\xab\x22\x00\x3a\xe0\x3d\xc6\xff\xc9\x4e\x7d\xff\xd7\xcf" - "\x7b\xaf\x48\xc3\xf8\x7f\xff\x01\x4e\x2b\x19\x4e\xb6\x12\xbb\x88" - "\xbb\xf7\xcd\x36\x13\xef\x49\x03\xde\xf5\x28\xb3\xc7\x80\x83\x71" - "\xea\xd7\x9d\xa6\x87\x1e\x42\xda\x11\x03\x0e\xf2\x5c\x87\xe7\xd6" - "\xde\x3c\xaa\x4c\x7b\x44\x99\x87\x3a\x4d\xb7\xfe\x1a\x69\xa1\xe8" - "\x32\xa3\x52\xa3\xcb\x8c\x1a\x16\x51\xa6\x5c\xd5\x33\x2a\x2b\xa6" - "\x4c\x4e\x4c\x99\x19\x97\xe2\x36\xaa\x30\xa6\x4c\x49\x4c\x99\x35" - "\x97\xe2\x36\xaa\x26\xa6\x4c\x43\x4c\x99\xfd\x11\xb4\x64\xbf\x9a" - "\x2c\xa4\x35\xc5\x94\x39\x1e\x53\xa6\xc3\x78\xee\x87\xc6\xa9\x8b" - "\xb7\x90\x0d\xbc\xc9\xbe\x5b\xfe\x8d\xe8\x9f\xce\x57\x9f\xee\x52" - "\x65\x6f\xcb\xbc\xb4\x5d\xb7\x8d\x8d\xae\xef\xb6\x29\xd1\xf5\xdd" - "\x36\xfb\xd2\x76\xdd\x56\x1c\x53\xa6\x3c\xa6\x4c\x75\x44\x99\xad" - "\x7a\x3d\xdb\x62\xca\xec\x89\x29\xd3\x78\x29\x5f\xdd\xd6\x1a\x53" - "\xa6\x3d\xa6\x4c\xf0\x2b\x68\xc1\xe3\xb8\xf2\x6b\x1b\xc2\xb6\xf2" - "\x3d\xb0\x11\x46\xcf\x61\xdf\x08\xde\x07\x7d\xa3\x3b\x98\xc4\xfb" - "\x73\x3c\x5e\x1d\x76\x06\x31\xb6\x8c\xc6\xfc\x67\x8c\xc7\x18\xb3" - "\xd8\x6f\x84\x65\x5a\xd9\xd8\xa3\x33\xfb\xb3\x45\xa5\xef\x99\xee" - "\xbf\xc6\x75\x1d\x1e\xc6\xe3\xd4\xe8\x4d\xbd\x36\xb1\xf2\x41\x23" - "\x1d\xce\xdf\x8d\x7d\xd8\x7a\xe5\x8f\x92\xc0\x36\xf9\x61\xa7\x2c" - "\x73\x24\xc2\x8e\xe6\xfa\x03\x7b\x96\x07\xcd\x31\x78\x34\x5c\x06" - "\x8f\x54\xd8\x46\xd9\x2d\x18\xbd\x78\x7f\xbd\xb9\x16\x36\x10\xec" - "\x7e\xc6\xed\x04\x65\x65\x49\x9b\x6c\x41\x37\xf1\xbd\xb7\xf4\x2e" - "\xb9\xff\xae\x6c\xd2\x2c\x47\x23\xea\x67\xdb\xbd\xb1\xf8\x3c\xfb" - "\x48\x61\xfc\x65\xdb\x2d\xeb\xe5\xc3\xa5\x7e\xe0\x95\x55\x60\xf8" - "\xa9\xf8\x28\x6b\x93\xb4\x35\x2a\x0e\x65\xb1\x6f\x00\xfb\xd0\x1c" - "\x0e\x64\x73\x1e\xf0\xff\xe8\x22\xa3\xbd\x18\xeb\xfd\xc8\x3b\xf6" - "\x72\x34\x53\x7d\x98\x75\x20\x9a\x27\x93\xc0\x2b\x59\x47\xa3\xfb" - "\x3d\xcb\x17\xdd\xef\x59\xfe\x68\x9e\x34\x81\x27\x6f\x37\x47\x97" - "\xb9\x3d\x3d\xba\xcc\xed\x19\x11\x65\xaa\x55\x3d\xb7\x67\xc7\x94" - "\xc9\x8d\x29\x93\x17\xf1\x8c\x36\xde\xee\xe8\x9d\xfb\x48\x1f\xa8" - "\xdb\x9d\x11\xcf\xa6\x4d\x52\x7f\xde\xbe\xce\x48\xe3\xb5\xa3\xba" - "\x57\x94\x0f\x8e\x0e\xaf\x21\x46\xde\x39\xff\x81\x18\x1c\x9a\x62" - "\x70\xe8\x95\x7f\x7d\xef\xfe\xe3\x93\x74\xc7\x1e\x7d\xef\xbe\x03" - "\x63\xf6\x74\x7e\x06\xac\x1a\xe4\x07\x1d\xee\x48\x8d\x86\x77\xc7" - "\xb0\x68\x78\x77\x8c\x8c\x78\x4e\xc3\xf3\xd8\x88\x36\xa4\x25\xda" - "\x28\x01\xfc\x02\xfb\xed\x8e\x59\x46\x3a\xcf\x29\x81\x6f\xbb\x4b" - "\x8e\x35\x39\xec\x5b\x36\xf8\x04\xdd\x31\x9e\xe7\x9f\x3a\xcc\x48" - "\xf9\x27\xd5\xae\x3b\x36\xc5\xe0\xb1\x2d\x06\x8f\x3d\x11\xed\x0a" - "\x58\x57\xd1\x03\xd6\xd0\x83\x0f\xb3\xed\xc3\xfe\x94\xd2\xc7\x6b" - "\x25\x6c\xb6\x0b\x94\xc6\xbe\x75\x27\x4b\x28\xd1\xeb\x6c\xc7\x5c" - "\x6e\x5f\x41\xbf\xfc\x94\x72\x28\x47\xf9\x56\x91\xbd\xcb\xfd\xbd" - "\x74\x83\x1f\xb5\xb5\x87\x72\xb4\xca\x0f\x33\x90\x06\xfd\x97\xb5" - "\x55\xd9\xb9\x07\x8a\x85\x2b\xaf\x06\xf4\xc4\xbc\x68\xcc\x75\xfa" - "\x3c\x62\x16\xfb\x88\xb1\x1f\x2b\xc6\xf8\x54\xb5\x0f\xff\xbd\xd9" - "\x11\x7c\x1d\xb0\x2f\xbf\x5b\x9c\xa0\x31\xc3\xd9\x06\x60\x19\x65" - "\x5f\xb3\xc3\x21\x3f\xf1\xdc\xdb\x1b\x3a\x2d\x6d\x37\xbc\xb7\xeb" - "\x65\x6b\x22\xca\xfa\xf5\xb9\x71\x3b\xbf\x1b\x1d\x22\xf3\xe1\x80" - "\x9f\x00\x27\x5d\xd9\x7b\x63\x86\x1f\x86\xbc\xa2\x4c\x93\x51\x86" - "\xe7\xd1\x72\x8f\xb7\x84\xcc\xb7\x95\x92\xd9\xb3\xfc\x84\x84\x6d" - "\xf8\x6d\xc0\x96\xee\xf0\x96\xb6\x93\x37\xd0\xca\x6b\x5d\x66\xe5" - "\xa3\x33\xc6\x9e\x18\x24\x4b\x67\xe5\x21\x8c\x71\x63\xec\xe1\xca" - "\x43\xd9\xc0\x0d\xe3\xd9\xf7\x26\xb2\xbe\x89\xa4\xdd\xa4\x49\x33" - "\x1e\x9c\x3e\x75\xd4\xcf\x1e\x9c\x3c\x6b\xd2\x5d\xf6\x59\xf3\x9f" - "\x99\x5b\x38\x6a\xe1\x73\x25\xf6\xa5\x8b\xe6\x97\xcc\x5f\xf0\x73" - "\x7b\x96\x73\x84\xd3\x3e\xa7\x44\x5d\x33\x8b\xe6\x2c\x2e\x19\xc7" - "\xb7\x23\xed\xc5\x8b\xe6\x2e\x91\xb7\xb7\xa4\x50\x34\x90\xf9\x25" - "\x73\x17\xd9\x47\x14\x8e\xb4\xdf\x3b\x67\x7e\xd1\x73\x8b\xe6\xc6" - "\x85\x75\x97\x7d\xd1\xdc\x45\x73\xe7\x14\xda\xc7\xd9\xb3\x18\x72" - "\x24\xb8\x88\xfe\xcc\x32\xc6\x31\x1e\xbf\xaa\xdc\xe2\xa8\x3e\x9e" - "\xf9\x14\xff\x8c\x09\x5c\x3a\x96\xdd\x69\x89\xe6\xb9\x3b\x6d\xd1" - "\x3c\x77\x67\xe6\xa5\x63\xd9\x9d\x31\xe3\xdf\x9d\x31\xe3\xdf\x9d" - "\xb3\x2f\x1d\xcb\xee\x8c\x19\xff\xee\x8c\x19\xff\xee\xec\x1d\xff" - "\xc0\x4b\xbe\xd5\x52\x2f\xdc\x19\x33\xfe\xdd\x19\x33\xfe\xdd\xd9" - "\x18\xf3\x7c\x2c\xe2\xf9\x5a\x3c\xb7\x45\x8e\x8f\x78\x0e\x18\xf2" - "\xd9\xa7\x5f\xbe\x6f\x31\xf2\xb0\xae\x87\x6e\x6e\x53\x79\xbf\x6f" - "\x8f\xc8\xdb\xae\xe7\x1d\xd3\x2b\x7f\xbc\xaf\x8d\x74\x35\x5f\xff" - "\xfe\x6b\xac\xd3\xd9\x1f\x8f\xc7\x26\xc8\xc7\xb7\xcf\xd2\xf7\xaf" - "\x61\x58\xcc\xc3\xec\x9f\x29\x5e\x7d\xb4\xab\x7e\x30\x59\xb8\x4c" - "\xfd\x4b\xec\xd7\x3b\x66\x24\xfb\xea\x22\x8d\x7d\x97\xa1\x53\xbe" - "\xcf\xf6\x6f\x48\x8d\x17\xdf\xf7\x49\x9b\x1f\x65\x74\xf8\x72\x5e" - "\x03\x38\xec\x0b\x6c\xa9\x52\x63\x71\x1b\xee\x53\x99\xa7\x51\xde" - "\x2c\x4c\x63\x9e\x65\x1f\x68\xa4\xa5\xe1\x97\x0e\x78\x3e\x03\xde" - "\x9a\x21\xf1\x6d\xcb\x58\x3b\xb7\x77\x3e\x68\x22\x6b\x95\x5b\x6b" - "\xf5\x6a\x6c\x5b\xff\x20\x5d\xad\x2d\xec\x2d\x17\xee\x83\x79\xf5" - "\x48\x8f\x3f\x4f\xfa\x01\xe4\xe5\x07\x16\xb5\xde\xf2\x03\xf4\xff" - "\xd4\x31\x6a\xed\x74\x6f\x39\xf4\x6d\x37\xe0\x5c\xc0\xb5\x07\xd7" - "\x7f\x37\xe0\x7b\xe4\x7c\xfb\x07\x25\xc2\x9d\x30\x93\xe1\xc6\xa4" - "\xaf\x83\x7e\xeb\xb6\x86\xca\xf3\xe2\xbc\x6b\x10\xee\xc4\x07\xe3" - "\xa4\x7b\x60\x33\x74\x03\x8f\x00\xe3\x1b\x91\xde\x2a\xdc\x83\x66" - "\x71\x7e\x1f\xd7\x87\x32\xfd\xd9\xda\x86\xff\xad\xf2\xe1\xcf\xce" - "\x88\x69\xc7\x97\x27\x29\xfb\x57\xaa\x1d\xd9\xe1\xe8\xba\xb3\xc7" - "\xc6\x6f\x47\xf6\x2c\xb4\xe3\xcb\xf8\xed\xc8\x2e\x96\xb4\x35\xa1" - "\x2d\xa6\x4b\xde\xad\x43\x5b\xbe\x94\x74\x8f\x4e\xdf\xa6\xdb\x42" - "\x01\xcc\xc3\xd2\xf0\x4e\x96\x9d\x59\xda\xd7\x6f\x7a\xbe\x26\x6b" - "\x0d\xcd\x88\x53\x67\x9b\x70\x0f\x98\xe9\xa3\x1f\xca\x73\x0d\x11" - "\xe9\x21\x85\x0b\xe8\x64\x62\x3a\xa1\x3d\x28\xd7\x5f\x7f\x1b\xf3" - "\x12\xb5\x16\xf2\x43\xc8\x7f\x36\x19\x6b\x99\x8b\x4b\x85\xdf\xa0" - "\x23\xde\x39\x62\xde\x05\x23\xde\xad\x89\x7a\xb7\xb2\x37\xbd\xd6" - "\x48\xff\x7a\xfd\xf4\xc3\xa6\x98\x7e\x42\xff\xdc\xf5\x58\x74\xbb" - "\x7f\x78\x5c\xb5\x0f\x7d\x74\x09\xad\x7f\x18\x44\x1f\xf5\xc4\xef" - "\xa3\xbb\xd2\xe3\xf3\xda\x5d\x72\x1d\x4d\x0c\xa6\x38\xf0\xee\xca" - "\x45\xdf\xf5\x48\x1e\xd4\xfb\xe9\xd2\xfe\xb9\xab\xc8\xe8\x9f\xaf" - "\xd7\xc6\xbb\x76\xc7\xb4\x31\x7c\x92\x7e\x34\x4a\xb5\xf5\x47\x2b" - "\x63\x60\x1f\x89\xcf\x8b\x77\xf9\xd0\xce\x70\x3f\xed\x0c\xf5\xcf" - "\x8b\x3f\xb2\xa1\x3d\xe1\x4b\x79\xf1\x47\x59\xaa\x0c\xc5\x2b\x33" - "\x45\xb8\xe3\xd5\xf3\xa3\x42\x57\x88\xed\xdc\x1f\xd5\xf2\xfa\x52" - "\x44\x7a\x69\x34\xff\xa1\x0d\x5c\x8e\xe9\x17\x52\x7a\x96\xfb\xe1" - "\xa4\x9d\x4c\x5f\xc5\x93\x5d\xee\x1f\x1d\x8f\xa1\xd5\xb9\x93\x34" - "\xf6\xb1\x4e\x53\xc2\x36\x45\xaf\x71\xc3\x63\x70\x0a\xc6\xa7\xd7" - "\xd8\x34\xd0\xeb\x5c\x7c\x7a\x8d\x1d\xd9\x3f\xbd\xc6\x72\xff\x9f" - "\xbb\x94\x5e\x63\x0b\x22\xe9\x05\x5b\x57\xb6\xef\x3b\x36\xf0\x46" - "\x4f\xbe\xa8\xe7\xb6\x86\x29\xcd\x0a\x5e\x51\x65\x3a\xb8\xcc\x26" - "\x6b\x50\xf1\x09\x6c\x48\xcb\x59\x1a\x5b\x6a\xc8\xff\xa0\x1a\x1a" - "\x20\x7a\x1e\x65\x3f\xa2\x04\x2e\xe7\x75\x9e\xf3\x78\x43\x59\xc4" - "\xf3\x8f\x98\x7a\x5b\xe3\xeb\x82\xb1\x7e\xd0\xf4\xa5\x4b\xd3\xc7" - "\x59\x94\x1f\xd9\xb8\x9c\x68\x1d\x31\xce\x1e\xdd\x47\x3f\xe2\xb5" - "\x53\xab\xbe\xed\xf4\x95\xbf\xcb\xf7\xd9\xb8\xea\x4b\xfb\xec\xc7" - "\xb7\xab\xfe\xfa\xf1\x35\x31\xf8\x35\xc4\xef\xaf\x71\x9e\xfe\xfb" - "\x6b\xdc\xf1\xfe\xfb\x6b\x1c\xaf\x9f\x9e\xf3\xd1\x8f\xb3\xa2\xc7" - "\x8d\x1f\xa7\x45\xb7\x17\xf5\xa2\x9c\x30\x5d\x75\x2d\x3f\x7f\xdd" - "\x76\x1b\x3f\xd6\x71\xdc\x57\x7c\xae\x08\xf8\x0f\x67\x1c\xaf\x14" - "\x46\xbf\xb0\x41\xc3\xea\xe5\xf1\xf7\x5b\x79\x8e\xdb\x52\x43\xc4" - "\xfb\xc8\xf6\x6f\xb1\xed\x7e\x77\x92\x66\xa2\x56\xdc\x9b\x4e\x52" - "\xce\x9f\x35\x93\xa9\x94\xf7\x3c\xa5\xdf\xba\x5c\x43\xb8\x7b\x58" - "\x64\x5f\xf0\xde\x27\xcf\x4d\x37\xa8\xb9\xd3\xdf\x50\x7e\xbb\xea" - "\x97\x9c\x77\xa3\xe9\x78\x77\x4e\xfc\x7e\xb9\x3b\x0f\xfd\xf2\xb7" - "\xf8\xfd\x72\x77\x49\xff\xfd\x72\x77\x35\xfa\xe5\x6f\x97\xca\xd1" - "\xdd\x0d\xba\x1c\xad\xe6\x32\xf6\x05\x3c\x1f\xcf\xf9\x06\xe7\xc1" - "\x3d\x64\x24\x47\xd2\x64\x54\x87\x21\x47\xb2\xcc\x71\xc0\x92\xf5" - "\xab\x3c\x77\xb7\xea\x30\x22\xe0\xe6\x90\xb5\x23\x9e\x9c\xe4\xd8" - "\x38\xef\x6d\xc5\x64\x01\x0d\xf3\xb6\x30\x8c\x45\x44\xa8\xe7\x19" - "\xce\xc7\xe9\xb7\x05\x22\xe5\x24\x27\xd7\xc8\xc7\xba\x4e\xcf\x9b" - "\x23\xba\x1c\xc4\xf9\x62\x60\xeb\xed\x1f\x20\xc7\x11\xce\xcf\xf9" - "\x62\xf2\xd4\x28\x79\xcc\x39\x1e\x2d\x8f\x39\xbb\xa3\xf9\x13\xf4" - "\x47\x39\x0d\x7a\x0e\xf7\x66\xe0\xf0\xb5\xf9\xeb\xf2\xb2\x39\x7e" - "\x64\x8c\x6c\x82\x07\xc6\x37\x2b\x1e\x18\xff\x76\x34\xae\xe3\x27" - "\xc6\xe7\x81\xf1\xb3\xfb\xe7\x81\xf1\xce\xfe\x79\x60\xfc\x26\xe6" - "\x01\x1f\x8d\x6f\x8a\x96\xcd\xf1\xbb\xa2\xdb\x8e\x7a\xa5\x6c\xd2" - "\x35\x57\x22\x9b\xb0\x85\xae\xed\x4f\x0e\x59\xa6\xd8\x7f\xa4\xbe" - "\xdb\xd8\xeb\xf8\x5a\x34\xb3\x40\xae\x80\xdf\x3d\x05\xbc\xa6\x04" - "\x1d\x9f\xcd\x34\xac\x93\xe7\x31\xef\x29\x89\xa4\xe3\x06\x75\x06" - "\xd2\x85\xbc\x5f\xf2\xbe\xb2\xa2\xe7\x84\x43\xd1\xed\xbf\x67\x53" - "\x7c\x7a\xde\xb3\x0b\xf4\x74\xc5\xa7\xe7\x3d\x47\xfa\xa7\xe7\x3d" - "\x6d\x7c\x46\xea\x52\x99\xba\x27\x64\x5f\x22\x6d\x14\x59\xe6\x2c" - "\x4d\x78\xe8\xeb\x8d\x4f\x13\xc6\x44\x8f\x4f\x13\x86\x5d\xf9\xf8" - "\x34\xc1\x19\x7f\x7c\x9a\x50\x1d\x7f\x7c\x9a\xd0\xa0\xe4\x61\x82" - "\x2f\x5a\x1e\x26\x78\xa2\x79\x02\xb4\xfb\x5f\x1b\x9f\x26\x66\xc5" - "\xc8\x40\xd5\x49\x9a\xf8\x2e\x6c\x0a\xdd\xde\x9c\xf4\x5c\x34\x8e" - "\x13\xa7\xc4\xef\xb7\x89\x85\xe8\xb7\xaa\xf8\xfd\x36\xb1\xbc\xff" - "\x7e\x9b\x58\x8b\x7e\xab\xba\xb4\xdf\x26\xee\xb9\x72\x9b\x62\x62" - "\x7b\x74\x9f\x4d\x3c\x7a\xe5\x7d\x36\x69\x64\xfc\x3e\x9b\x34\x31" - "\x7e\x9f\x4d\xd2\x7d\xd3\x27\x6d\x8a\xee\xb3\x49\x25\xd1\x7d\x06" - "\xba\xfd\x0f\xfb\x0c\xfd\xb3\x46\xf9\x27\x4c\xba\x80\x79\xfb\x80" - "\x2e\xf7\xa4\x0e\x1f\xdd\xbb\x47\xcd\xad\xef\x55\x63\x87\xea\xc3" - "\x77\x90\xc7\x77\xe9\x38\x70\xaf\x45\x4f\xfb\xd9\xa5\xfd\x70\x6f" - "\x06\x74\x74\x47\x63\xa9\xdc\xdb\x52\x7d\xc8\x34\x47\x3e\xcf\x72" - "\xde\x9f\xba\x77\x22\x97\x45\x1f\x0b\x6f\x30\x44\xac\xd7\x91\x3f" - "\xc0\x70\xf8\x6c\x68\x0c\xac\xe2\x2b\x19\xe3\x2f\xe3\x53\xb3\xc6" - "\x53\x76\x07\xe0\xdd\xf7\xbc\xe2\xd5\x7b\x63\xed\xdf\x7a\xbc\x7b" - "\x58\xf1\xe9\xe4\x11\x31\x38\x04\xe2\xf3\xe9\x7d\xa9\x68\x43\x7d" - "\x7c\x3e\xbd\x2f\xb3\x7f\x3e\xbd\x0f\xfd\x4f\xf5\x11\x73\x9f\xc1" - "\x8f\x87\x7c\x31\x73\x9f\xfb\x1c\xd6\x80\xe2\x1d\x69\x13\x55\xee" - "\x5d\xd3\xe5\xbe\x2f\xd6\xfe\x43\xdf\xe4\x0e\xd4\x71\x4e\x8a\x29" - "\xdf\x8f\xfd\x77\x1f\xdb\x7f\xef\xf4\x83\xf3\x65\xec\xbf\xfb\xd8" - "\xfe\x7b\xe7\x52\xd9\xca\xd5\xed\xbf\x78\x73\xbc\xdc\x91\xf1\xfb" - "\x3f\x37\xa6\xff\x29\xaf\x04\xf3\x61\x59\x3e\x3a\x5f\x51\x64\x3e" - "\xf6\x4d\xe2\xbc\xcc\x23\x71\xf2\xd6\xc4\xc2\xec\x27\x9f\xe7\x12" - "\xde\x63\x5f\xaa\xb8\xbc\x97\xab\x9f\x29\x99\x3c\x31\x5a\x1e\x27" - "\x9b\xa3\xe5\xf1\xbe\x86\xe8\x72\x93\x33\xa2\xdf\xdf\x1b\xf8\xdf" - "\xd3\xb1\x93\x37\xc5\xf0\xc0\xc1\x93\x74\xff\x35\x8a\x07\xee\x9f" - "\x1f\x83\xc7\xae\xf8\x3c\x30\xb9\x11\xed\x3f\x18\x9f\x07\x26\xfb" - "\xfa\xe7\x81\xc9\x21\xd0\xf2\x60\x24\xdf\xce\x2c\xcd\x19\x10\x9d" - "\xe7\x7e\x7b\x7c\x9d\x77\x7f\x76\xfc\x35\x82\xfb\x67\x28\x1a\xdf" - "\x5f\x11\x4d\xe3\xfb\x1d\xd1\x34\x44\x5b\xfe\xe7\x34\xec\x8d\x07" - "\xd1\xe5\xbe\x3f\x56\xfe\xbd\x27\xe9\x27\xba\xfc\x4f\x79\x20\x06" - "\xc7\x80\xc2\x25\xde\xba\xc8\x4f\x78\xfe\xeb\x8d\x4f\xcb\x9f\x8c" - "\x8c\xdf\xe6\x9f\x4c\xc4\x18\xe4\xd5\x2e\x91\xa5\x9f\xcc\x46\xfa" - "\x4c\x5e\x0f\xe5\xf5\x90\x3a\xa4\xcf\x0c\x91\x45\x8e\x57\xbd\xe3" - "\xd2\x4f\xca\xd9\x17\x85\xe9\xcf\xfc\x6b\x1d\x46\x33\x78\x0c\x62" - "\xbc\xf2\x4b\xa5\xdf\x82\x75\x0d\xf3\xfa\x8d\xcc\xeb\x3f\x91\xf6" - "\x1f\xef\xb3\xb0\x1f\xa1\xd5\x49\x33\x38\x2e\x85\xc1\xef\x9c\x3f" - "\x06\xf6\x71\x96\x0b\xce\x6f\xe4\x55\xeb\x66\xe5\x31\xba\x69\x8a" - "\x39\x7e\x1f\x4f\x19\xd6\x3f\xef\x4c\xc9\x56\xfd\x3c\xa5\x28\xba" - "\x9f\xa7\xcc\xd0\xdc\x83\x66\x71\x5b\xc1\x03\x57\x24\x27\x25\x76" - "\xe1\xef\x57\xdf\xaf\x7e\xb4\xb5\xb8\x8c\xbe\x75\x9a\xa6\x1c\x93" - "\xf5\x99\x44\xd0\xba\x2a\x81\x1a\xa5\x0e\x98\x7a\x8b\xc4\x13\x79" - "\xf2\x43\x64\x12\xab\x9f\x6e\xe5\x77\xf5\x6e\x11\x44\xbe\xa3\xbc" - "\x27\xc0\x67\xab\xc1\x0b\xd7\x9e\xa0\x29\x67\xa2\xca\x43\xf2\xbd" - "\x0a\x46\x66\xbd\x94\xc7\xa9\x19\xc6\x9a\xee\x1a\x3c\xc7\x5f\xf7" - "\x9d\x9a\x6b\xf8\x3e\x28\x9f\xb1\xa9\xfd\xee\x5f\x32\x4e\x7c\x56" - "\x86\x71\xba\xbc\x1e\x98\x5a\x6b\xf0\xaf\xf2\xb5\x9c\xba\xab\xcf" - "\x97\x6f\xea\x7e\xbc\x2b\xb8\xcc\xda\x60\x84\x1c\x4c\x6d\x8b\x84" - "\xa3\x62\xa2\x4c\x0d\x1a\xfe\x78\x5d\xee\x69\xe6\xaf\x80\xa5\xe3" - "\x33\x6d\x64\x34\x3e\xd3\xc6\xc2\x4e\x49\xd7\x61\xe4\x5e\x0e\x06" - "\xf7\xb9\xe2\x59\xe6\x87\x69\x05\x97\x5b\xf3\x4b\xb4\xd1\x8c\x8d" - "\x97\xf0\xd6\x34\x69\x2f\x31\x8c\xaf\xc0\xf1\x68\xd4\xdc\x42\xee" - "\xdd\xf3\xde\xd6\xf4\x2d\x4a\xee\xa7\xc7\xac\x11\x4e\xeb\x90\xfe" - "\x54\xba\xdc\x3f\x1e\x8a\x95\x83\xe9\xa9\xc6\x18\x1d\x93\x9e\x61" - "\xc8\x3d\xe6\xb5\x0c\x37\x66\x9d\x75\xfa\x44\x25\x0b\xd3\x6b\xb5" - "\xe4\xc8\xf9\xda\x74\x69\xff\x19\xeb\xa5\x78\x3f\x31\xa6\x5c\xcc" - "\xfa\xdf\xb4\x0e\xd1\xff\x3a\x7d\x2a\xfa\x37\xc0\x7b\x5b\x2a\x56" - "\xc3\xf4\xa6\x98\xf5\x0a\xff\x06\x79\xfe\xfe\xaf\x80\x3b\x43\xd7" - "\x7b\x0f\x8c\x8f\xa9\xaf\xc3\x75\xe6\x72\xed\x9f\xd1\x4f\xfb\x67" - "\xf4\xb5\x7f\x81\x84\x1b\xb3\x96\x38\x43\xb6\x3f\x7c\x89\xfe\x9b" - "\xc1\x3e\xa4\x06\xdd\x60\x73\xcf\xd8\x6b\xd8\xea\xbc\x7e\xd0\xbf" - "\xad\x3e\xa3\x6f\xfd\x4f\x95\xeb\x5b\xff\xf3\xc7\xb3\xd5\x7d\x24" - "\xf7\x56\xa3\xeb\x6e\xb5\xd6\xc6\x6d\x4b\x3f\xeb\x7f\x0f\xe8\xeb" - "\x7f\x0f\x14\x44\xeb\xb3\x07\xec\xd1\x7d\x38\x23\xa6\x0f\x1f\xc8" - "\x89\xee\xc3\xe9\x1d\xff\xdd\x71\x0d\xcf\x94\x98\x98\x68\x4a\x4c" - "\x30\x25\x24\xe2\x35\x9a\x48\x03\x12\xcd\x89\x49\xf8\x5d\xa5\x5f" - "\x07\x98\x12\x4d\x66\xfc\x92\xf4\xeb\x55\x31\xcf\x03\xb8\x2c\x7e" - "\x66\xfd\x9a\x14\xf3\x7c\xd5\x57\xbc\x1f\xa0\xd7\x6b\xd4\x6f\x8e" - "\x79\x4e\xfa\x8a\xf7\x57\xfd\x0f\xcb\xd3\x25\xcf\xd1\x7e\x68\x93" - "\x17\x2c\x99\x53\x34\xbf\x50\xee\x17\xcf\xb5\xcf\x79\xf2\xc9\xb9" - "\x8b\x17\xdb\x4b\x16\xda\xef\x19\xff\xe0\x1d\x77\xd9\xd5\xb6\x73" - "\xd1\xb8\x11\x85\x29\x34\x75\xe9\x22\x7e\x31\x75\xe6\xe4\x3c\xfb" - "\x8c\x7b\xc6\x47\xbf\x34\xc0\xc8\xed\xe5\xcb\x41\x89\x90\xbf\x9c" - "\xca\x21\x44\xeb\x5e\x91\xba\xa7\x8d\xfd\x7c\xd5\x9a\xc7\xcf\x0e" - "\x35\xb1\xff\x68\xb7\x4b\x78\x6e\xe4\x3d\xfd\x99\x73\xb9\x11\xa3" - "\xb6\x96\x53\xf1\x13\x7c\x7e\x65\xe6\x2a\xf1\x91\x9f\xec\xf7\x93" - "\xe9\x04\xcd\xfe\x73\x63\x2e\xf2\xe2\xd9\xeb\x0b\x91\xdd\x45\x16" - "\x94\x7f\x16\xef\x12\xc4\x8f\x35\xa4\x05\x74\x5f\xe8\x9f\xae\x92" - "\x69\x1f\x95\x1b\xf9\xac\x27\x69\xd6\x08\xf1\x91\x90\xcf\x7c\x3e" - "\x48\xe5\x9b\xf9\xa5\x30\x3d\xb8\x9f\x75\x43\xed\x60\x32\xf3\x5e" - "\xe8\x6b\x83\xc9\xf2\xda\x10\x8e\x59\x32\xb3\xc3\xd8\x0b\xad\xc4" - "\xb3\x8f\x66\x1f\xe5\xba\x39\xaf\x66\x7a\xf0\x04\xe7\xaf\x8b\xca" - "\x3f\x6b\x58\xdf\x5e\xec\xcc\x0e\x13\xf2\x4d\xff\x9c\xac\xd6\xb0" - "\xf8\x47\x30\xe5\xed\x82\xdb\x72\x29\xc1\x8b\xae\x68\x0a\x95\x93" - "\xf2\xf9\x99\x35\x77\x59\x58\x84\xd8\x3f\x7d\x6a\x87\x4b\x54\x3d" - "\x43\x66\xc8\x74\x82\x67\x11\xfb\x28\xcc\x9a\x52\x3f\x97\xcc\x68" - "\xff\xb0\xd3\xf4\x50\xa9\x7d\x1a\x91\x6b\x2a\x99\xff\xe4\x64\x7f" - "\xc3\xbd\xda\x86\xbf\x90\xf9\xad\xee\x72\x53\xb7\xb0\x51\x69\x89" - "\x68\x17\x1c\xc7\x28\x20\x82\xec\xe3\xdf\x54\x10\xe6\x3c\x67\xbb" - "\x5c\x36\x6a\x29\x09\xd0\xca\xe3\x22\x58\xf1\x17\x75\x36\xa0\xb9" - "\x23\xc0\xfe\x8b\x96\x95\x53\x29\xf1\x64\x1e\x99\x9a\x1d\x35\xe4" - "\x9d\x1d\xa0\xd2\xe3\xa2\xbd\xa9\xe0\x0b\x6a\x71\xec\xa6\xfc\x56" - "\x32\x35\xb5\x7d\x46\x32\x16\xcf\xda\x33\xec\xf7\x68\x5b\x39\x9f" - "\xd3\x2e\xd0\xf2\x95\x34\x70\xf9\xa7\x64\xf5\xb6\xb7\xa2\x9e\x33" - "\xf4\xc8\x31\x4a\x00\x3c\xd3\x8a\xcf\xc8\xb6\xe2\x61\xf6\xf3\xcd" - "\xa1\xda\x32\xb2\x09\x57\x66\x6a\xb7\x2b\x33\xad\x5b\x64\x0e\xee" - "\x72\x65\xa6\xb7\x14\x23\x7f\xdb\x87\x34\xa8\x95\xd2\x3f\x3a\xdd" - "\x6a\xaa\x39\x4f\xc3\xb8\x4d\x27\xd1\xb6\xda\xf3\xc8\xbf\xf6\xe3" - "\x72\x0d\x65\x23\xcb\x84\x92\x3f\xae\xf1\xe6\x05\x49\x03\xac\x9a" - "\x6e\x1a\x56\xdb\x4d\x36\xad\xf2\xe3\x72\x2e\xd7\x41\x3f\x5d\xe6" - "\x6d\x22\x2a\x5d\x29\xc2\x3d\x6b\xf7\x16\x40\x27\x0e\x78\xe7\x89" - "\xfd\x66\x6f\x53\x07\x35\x07\xba\xa9\x85\xfe\x4a\x5e\xe7\x29\xcf" - "\x5b\x4f\xec\xe7\x35\xeb\x04\xcf\xf2\x36\xd4\xa5\x78\xc7\xd5\xcc" - "\x67\x95\xcb\xa9\xaa\x8c\x52\x8b\x97\xd3\x80\xd3\x48\x57\x73\xfb" - "\x06\x87\x37\x74\xca\xb3\x5c\xfa\xe3\xce\x3e\x5a\xd6\x4c\x89\x2d" - "\x81\x1a\x6e\xbf\x29\x9c\x72\x86\xbc\x81\xa3\xe4\x2d\xfe\x9b\x47" - "\xb3\x74\xb4\xaf\xd3\xc8\xf2\xf6\xc5\xa3\x26\xaf\xf9\x22\x79\xf3" - "\x02\x74\x10\x75\x8b\xb5\x67\x52\xa1\xb7\x72\x5a\x02\x41\x3e\xef" - "\x94\x25\x3a\x6d\x29\x55\x8b\x68\x64\xdd\x79\xca\xd8\x72\x9e\x32" - "\x45\x57\xa6\x89\x7d\x6c\xf9\x6c\xea\x16\x5c\x53\xdb\xc8\x82\xb6" - "\x2b\x7f\xec\x64\xdd\xd7\xb6\x27\x93\xea\xbb\xfb\x7c\x6d\xbb\x3b" - "\xfb\x7c\x6d\xc1\x53\x7e\xf6\xb7\xf5\xd1\x43\x6b\xac\x4d\x34\x00" - "\x72\xd2\xc0\xfc\x5d\x75\x96\xcc\xab\xcf\x12\xdd\x56\x6e\x22\xfb" - "\x3c\x3e\x67\xf1\xb3\xb9\x5e\xf4\x0d\xdf\x9f\xa0\x9f\x0d\xc3\x35" - "\x15\xbf\x04\xa4\xcb\xf8\x0d\x6d\x3a\x1f\x23\xcd\x84\xb4\x24\x5c" - "\x13\x21\x2f\x61\x57\xad\xf0\xa3\xae\xfd\x9d\x26\x4a\x61\x7e\xd6" - "\xfd\x7b\xf7\x77\xb9\x7f\x1a\xf0\xd1\x33\x1d\x06\x5f\x2b\x1d\x3f" - "\xd3\x7f\xf0\xc4\x19\x8e\x97\xe5\x97\x78\xf5\x38\x12\x38\x76\x96" - "\x9e\xce\x38\x3c\xc6\xf5\xa2\xfe\x1c\x5c\xad\xf8\x41\x4e\x7f\x7a" - "\xcc\x28\xdb\xd9\xe3\x40\x9d\x3f\x7b\x08\xe9\xc2\x48\x47\xbb\xcd" - "\xfc\xee\x77\x27\xce\x98\x54\x9e\x4c\x13\x60\x06\x75\xf8\x90\xfd" - "\x99\x9b\x58\xc6\x3b\x4d\x56\x71\xb8\x60\x0c\xd5\xbe\x22\x9a\xb6" - "\xbc\x22\x1a\x95\xec\xfd\xac\xc6\x47\x0b\x8d\xf8\x42\x8d\xeb\xf0" - "\xee\x30\x46\x1d\xa6\x4b\x63\x21\xfb\x93\xfd\x0c\xf6\xdf\xd5\x07" - "\x22\xdb\x20\xdc\x0f\xd4\xf0\x58\xfa\x9b\xb2\x23\x49\xd0\x01\x35" - "\x2d\x6d\x1d\xf4\x56\x77\x7b\x92\xeb\x8f\x64\xf2\x86\x4e\xd0\xe8" - "\x74\xb2\xb1\x3d\x58\xff\x8a\xf0\x6d\xe4\xf8\x7c\xaf\x88\x0e\xf0" - "\xcb\x0d\xa7\x29\x2f\xe9\xbb\xe9\x94\xfe\xaf\x4e\xd2\xf5\x53\xde" - "\x0d\x11\xfa\x69\x7b\xb3\x6f\x7f\x84\x6e\x9a\xfd\xd0\xa5\xba\xe9" - "\xd1\x07\x94\x6e\x82\xec\x4b\x5d\x14\xf6\xe9\xe9\xe3\x62\xd2\x75" - "\x3f\x91\x47\x87\xc7\xa4\x07\xf5\xf4\x81\x31\xe9\x7e\x95\xfe\xc8" - "\x54\x43\xf7\xb5\x30\x1e\x4b\x59\xf7\x3d\x72\x3b\xeb\xbe\x96\x02" - "\x5d\xf7\x49\xfd\xf3\xc8\x75\xe2\x5f\xa0\x8b\x96\xb0\xbe\x79\xf8" - "\x0c\xe3\x2f\x3e\x22\x03\xf7\x64\xa4\xbd\xcd\x69\xd5\x7f\x25\x33" - "\x7e\x86\xde\x13\xac\xf7\x58\xe7\xb1\xee\xdb\x3c\x44\xb4\x6e\x7e" - "\x45\x1c\xab\x95\xb1\x7f\x1e\xee\xd5\x7f\x2f\x22\x6d\x1d\xd2\x5e" - "\xc4\x7b\xd6\x83\x4c\x93\xe6\xbc\xfd\xc4\xfe\x27\xb0\xb5\x42\x9a" - "\x29\x8b\x36\xa0\xbf\xf9\xbc\xe1\x1a\xd0\xd7\x9a\x40\xc5\xde\x12" - "\x3e\xc3\x1a\x66\x9f\xb4\xb6\x96\x92\x36\x96\xbb\x21\xab\x21\x67" - "\x5e\xe7\x17\x54\x16\x10\xa7\xf9\xdc\x1d\xe3\x90\xbf\xec\x7e\x8e" - "\x97\x94\xd0\x88\xd9\x30\xfb\x85\xb3\xce\x06\x2e\xe6\x6a\xe0\xa4" - "\xe2\xb3\x3c\xbc\xcd\x47\xdb\xca\x55\x5f\xcf\x3e\xca\x71\xd9\x4e" - "\x50\x5e\x3b\xe6\x7b\x41\x6e\x9b\x35\x5c\x4e\x7c\x0e\x86\x63\x15" - "\xf2\x75\xb3\x49\x73\x54\x1b\x67\x61\xdc\xd0\x0d\xc8\xe3\x6d\x0d" - "\x12\xe3\xec\xa3\x87\xc7\x34\x97\xee\xe7\xf2\xad\x4c\x1b\xe1\x76" - "\x19\x30\x12\x24\x0c\x93\x9c\x37\x3a\x90\x4f\xad\x9d\xa7\xec\x2d" - "\x68\x9e\xed\x27\xd6\xfb\xde\x76\xc0\x28\x3d\xa1\x60\x00\x96\xc0" - "\x18\x10\xf5\x4e\x87\x3f\x70\xa5\xf8\x07\xe0\x6f\xe3\xfe\xe2\x73" - "\x91\xbc\xdf\x06\xba\xa4\xb2\xaf\xbc\xb2\x45\x1f\x1e\x55\xff\x57" - "\x22\xfd\x6c\x27\xf8\xed\xe1\x91\x7c\x6e\x89\xcf\x73\x5e\xee\x2c" - "\x27\x68\x94\x61\x9c\xe7\xd4\x96\xfe\xef\x9e\xe5\x04\x6c\x5b\x9d" - "\x49\xec\x06\xfe\x23\xf9\x3c\x27\xf0\x5f\xc7\x7c\xa8\xb7\x29\xeb" - "\xe5\x47\x24\xcd\x4b\x38\x0d\x73\xc7\x23\x46\xff\x73\x7b\xb9\x2d" - "\x78\x97\xa7\x6c\x44\x81\xf9\xc7\xa3\x59\xfc\x1e\x69\x13\x39\xff" - "\x68\xe8\x31\x2f\xc6\xb0\x77\x4e\x84\x4d\x55\xcb\xc9\xac\x74\xda" - "\xec\xc9\x5c\x5e\xe9\xb4\xd9\xd4\xa7\xd3\x1e\xbd\xa0\x74\x9a\xa2" - "\xb1\xd2\x69\x8f\xfe\x5d\xe9\xb4\x47\x3f\x97\xfb\x62\xd0\x69\xfc" - "\x8e\xf5\x9a\xa1\xd3\xb6\x0c\x11\x47\x58\x77\x74\xb9\x1f\x3d\x6a" - "\xe8\xb6\xf5\x48\x63\xdd\xc1\x38\x2a\x3d\xf5\x48\xa6\xf8\x7f\x33" - "\x49\xf9\x1d\xf0\xbd\x83\xcf\x2f\xb4\xeb\xf7\x3c\x9e\x8c\x57\x3a" - "\x6e\x76\x46\x9f\x8e\x7b\xb4\xa1\xaf\x2c\xeb\xb8\xd9\x3f\x54\x3a" - "\x4e\xa5\xd7\x3f\xc2\x3a\xee\x91\x4c\xa6\x81\x0e\xdf\xc4\x6b\x78" - "\x7a\x7e\xa6\x63\x56\xa4\x8e\x8b\x96\xaf\xd9\xa5\x86\x8e\x63\xdd" - "\x86\xe7\x75\xd0\x69\x72\x0e\xc9\x72\xb6\x09\x34\x37\xe4\x8e\xfb" - "\x80\xdb\xcc\xf1\xd7\x98\x6e\x13\xce\xd0\x00\xfd\xec\x90\xde\xee" - "\xd9\x47\x0c\xdf\x47\xd0\xff\x68\x3c\x3b\xba\x2f\x46\x22\x7d\x9b" - "\xcf\xce\x7b\xcb\x4f\x90\xb7\x46\x94\xb7\x84\x8e\x53\x7e\x09\x74" - "\x45\xe2\xd3\x9f\x73\xdf\x62\xde\xf1\x23\xbe\xb2\xee\x39\x4d\x8f" - "\x0d\xcc\x0f\xd0\x55\x98\xab\x7f\x5e\x65\xc2\x3b\x67\xd4\x3b\xb9" - "\xc6\x70\xdb\x22\x8e\xaf\x07\x41\xe8\x67\xbe\x7f\x85\xf5\xad\xbc" - "\x4c\x7d\xaf\xc9\xfa\x60\x53\x61\x0e\x74\xcd\x59\x7a\x4c\xce\x4b" - "\x64\x7c\x9b\xd5\x71\x61\xfd\x51\x7f\x9f\xd4\xcf\xfb\xbf\x5f\xbe" - "\xfc\xe3\xc9\x97\x2f\xff\xf8\x2d\xac\x8b\xd0\x3e\x6b\xd8\x1d\x0d" - "\x67\x50\xc8\xc8\x77\x9a\xf3\x3d\xa0\xaf\xc5\x7c\xee\x1a\x2e\xe7" - "\x68\x36\x03\x26\xf3\xdf\x06\xe4\x93\x31\x43\xa0\x2b\x27\x2e\x23" - "\x8e\xd7\x12\x59\x76\x7d\x1f\x8d\x1f\xcf\xb9\xcc\xba\x5f\xaa\xb7" - "\x86\x64\xcc\xd8\xc3\xb0\x49\x39\xa6\xd1\xa6\xde\xf5\x8f\xc7\xdb" - "\xa0\x37\x7d\x11\x7e\xb1\x3c\x1f\xfb\x36\xc7\x35\x60\xfb\xb2\x4a" - "\xcd\x37\xaf\x87\x7e\x1e\xcc\xe7\x61\xf8\x6c\x4c\x7e\x78\x86\xe9" - "\xb0\x8c\x65\x96\x6f\x37\xca\xf6\xb7\xce\xc2\xf5\xea\x75\xb2\x8f" - "\x69\x00\x65\x66\x19\x65\x18\x36\xfb\x29\x62\x5c\xfe\xb6\x3c\x53" - "\x1a\xea\x60\x5d\x78\x3d\x6c\xd1\xc1\xaa\x9e\x02\xd2\xeb\xa9\xf0" - "\xd1\x63\x33\x2e\x77\x36\xa3\xff\xf6\xe5\x37\x5e\x79\xfb\x48\x6f" - "\x5f\x01\x7d\x45\xfb\x2e\x53\x6f\xc1\xd8\x2b\xaf\x37\xcd\xa8\xd7" - "\x79\xe5\x74\x2d\xd8\xf5\xf5\xe9\x9a\xa5\xd3\xb5\xc0\xf7\x15\x74" - "\x8d\x53\xcf\x9c\xf4\xaf\x5f\x8f\x5d\xaf\x67\x4e\x6e\xbc\x7a\x48" - "\xfe\xf5\x7b\x6e\xca\x62\xc4\xda\xec\x84\xec\xa8\x58\x75\x73\xaa" - "\x23\xe3\x17\x77\x4a\xb9\x9a\xb3\xad\x37\x5e\xb2\xda\x2b\x87\xae" - "\x9e\x73\x28\x7f\x2b\x8f\xef\x42\xf3\xd1\x9c\x46\x8e\xe3\x3a\x71" - "\xa5\x3a\x93\xad\x97\x69\xbd\x5c\xdc\x64\x8e\xd1\xc5\x31\xf9\xbc" - "\x36\xb4\xbd\x86\x63\x97\x1c\x2a\x60\xff\x7b\xcc\xa9\xa0\xe3\x9f" - "\xb8\x81\x63\x8e\xe1\x7e\x00\xee\x33\x95\x0e\x78\x22\x13\xf5\xf4" - "\x7f\x76\x72\xed\xa1\xe2\x6d\x65\x59\x49\xfd\xf9\xd7\xa3\x3c\x6c" - "\x8a\x67\xe5\xda\x94\x96\x72\x70\x06\xe6\x12\x7a\xbc\xbf\xc2\x2f" - "\x64\x0c\x38\x57\x1e\x9f\x27\xc1\xb8\x58\x38\x50\x3f\x07\x00\x7a" - "\x94\x83\xae\x4f\x6c\x35\xe8\x61\xa4\x23\x6d\x8f\x41\x0f\xd8\x37" - "\xa9\xde\xad\x21\x3e\xa7\x13\x50\x67\xb2\x9f\xf8\x77\x51\x79\xc8" - "\xa1\x60\x3f\xa9\xf6\x68\xb8\xbe\x9e\x3c\xb3\x9c\x37\x95\xf1\xbc" - "\xe9\xc9\x03\xfe\xe4\x43\x0e\x03\x0f\xb1\xd8\x66\xe2\xb3\xdf\xa3" - "\x31\x96\x6e\x50\x31\xf7\x12\xf8\x9c\x9c\x7c\xbf\x38\xd3\xa4\x68" - "\xf2\xe4\x38\xd1\xc9\xb1\x63\x24\xec\x54\xe0\xd9\xc6\x70\x7d\xb8" - "\xfa\x57\x64\x72\xdc\x0b\xbd\x3d\x4f\x8e\xd0\xd6\x1e\x9c\xa1\x75" - "\xd9\x4c\x06\xbe\x75\xf2\x4c\xeb\x93\x68\x7f\x81\x8a\x13\x2b\xf1" - "\xb1\x99\xd8\x9f\x5f\x4b\x39\x54\x2c\x56\xd8\x68\xcf\xa2\x76\x39" - "\x6f\xe2\x3a\x47\xa3\x7e\xc1\xf3\x24\xd8\x26\x28\xb7\xb5\x97\x6e" - "\x80\x2b\xba\x0c\xba\x3d\x39\x45\x8d\xcb\xaa\x8d\x81\x15\x36\xd3" - "\x61\xbf\x3c\x6f\x47\x19\x76\xd7\x97\x2a\x16\xf6\x93\xc7\x0d\xda" - "\xf5\xe2\x04\x7c\x38\x8f\xf2\x6f\x7a\x32\x64\xe0\x24\x65\x37\x85" - "\xcf\xef\x3e\xe1\xe7\x73\x43\x8a\xfe\x87\x53\xbb\xdc\x85\xf6\x4b" - "\xe9\x5f\x38\x26\x82\xfe\x89\xcc\x7b\x4c\x7f\x5e\xeb\x00\x5d\x1e" - "\x03\x2d\x2d\xea\xbc\x03\xdb\x33\x85\x73\xf1\x9c\xca\x78\x6a\x95" - "\x06\xcd\xf3\xcc\x6a\x9d\xac\xb0\x26\xa2\x1f\xd0\x5e\x1b\xdb\x6a" - "\x09\x46\xfb\xb9\x0c\xd3\x80\xe3\x4a\x72\xdd\xc0\xe7\x6a\xd4\xbd" - "\x3b\xb6\x4d\xab\xd5\x59\x12\x52\xbe\x25\x85\x47\x23\x62\x8b\xfb" - "\x4b\xec\x22\xa8\xce\x25\x17\x3a\xf7\x94\xf9\xcd\xfd\xe9\x00\xe6" - "\x41\x19\xa3\xd2\x24\xd7\x15\x60\x73\xcd\xfb\x44\x00\x37\xd5\xf7" - "\xf3\xb6\xa8\xb4\xb9\x7f\xc7\x15\x3c\x36\x77\xbc\x40\xdd\x7e\x97" - "\x8c\xb1\x82\xb6\xcd\xf3\x31\xcf\x19\x7c\xc6\xeb\x90\xca\x67\x7c" - "\xee\x76\xd6\x29\x06\xcd\x81\x7f\x4a\x97\x7b\x6e\xb1\x81\xbf\x91" - "\x9f\xfb\x8e\xf3\xf0\x9e\x4d\xa3\x3d\x28\x75\xad\x3a\x33\x34\xb7" - "\xd6\x90\x61\xae\x83\xfb\x99\x75\x0d\xd3\x43\xd1\x62\xee\x81\x68" - "\x58\x36\x93\x8a\x9b\xc9\x3c\x0f\x79\x5c\x1e\x4c\x42\x1e\x5f\x1f" - "\x8c\xb9\xb3\xd5\xbb\x5e\x3c\xd9\xcf\x5f\xfa\xe2\xa9\xfe\x98\x37" - "\x99\xdb\xd5\x87\x2f\xcb\xdf\xbc\xde\xfe\xe7\x77\x01\x97\x8d\x63" - "\xf0\x4a\x1d\x53\x32\x9c\xf1\xf5\x73\x6c\x5b\xc9\xeb\x80\x5f\xcd" - "\xb8\x73\x1e\xa3\xcf\xfa\x78\x71\x9e\x23\x12\x8e\x70\x49\x5c\x25" - "\x1c\xa5\x3b\xfc\xbc\xb7\x6d\x57\xfb\x2d\xf3\x36\x45\xb4\x3b\xd5" - "\xc0\xa7\x4f\x27\xcc\xdb\x13\xcb\x93\x5c\x37\xc7\xe2\xd3\x61\xb3" - "\x2e\x49\x3b\x41\xf3\xb6\xea\x78\xd9\xb8\x1f\xfb\x1b\xdf\x38\xce" - "\x25\xc7\x3e\xdd\xa8\x74\x08\xfa\xd9\x31\x7c\xa3\x3a\x47\x14\x50" - "\xf1\x4f\x7f\x3e\x42\x98\x7e\xc5\xb4\xe2\xf5\x74\xbf\x8c\xd7\x21" - "\xcf\x98\xff\x9c\xf7\xf8\xc5\xa0\xe2\x5f\xc9\x58\xb7\xba\x6f\xa0" - "\xbf\xb1\x38\x24\x63\xf9\xb9\x4a\xf8\xcc\x6d\x88\xe7\x7a\xd2\xf7" - "\xed\x70\x49\x88\x66\x06\x59\x26\x7e\x5e\xc2\x67\xe9\x55\x1c\xf1" - "\x9f\x97\x1b\xe7\xe7\x39\x76\x26\xc7\x7d\x85\x1e\x4a\xec\x8b\xdb" - "\xea\xc8\x63\x1b\x4b\xef\x5f\xda\x60\x12\x47\x95\xfc\xff\xfc\x8f" - "\x7c\x5e\x5e\xed\x63\x9d\x80\x4e\x48\x3c\x75\x82\x7e\xfe\xb9\x5a" - "\xf7\x31\x74\x94\xe3\x61\xde\xcb\xf2\xe9\x30\x50\x57\x07\xe4\x7b" - "\xc6\xa5\xba\xe4\xe7\x7f\x34\xe6\x2e\x7c\xfe\x4e\xed\x8b\xf5\xc1" - "\xf3\xd1\xcf\xe5\x5c\xb0\xaf\x0f\x3e\x06\x2c\x47\xf6\xa5\x7a\xc1" - "\x31\xc5\x90\xbd\xe2\x1b\xf9\x0c\xf7\xcf\xd3\xb8\xfe\xfe\xc6\x0b" - "\xe1\x7a\x98\xfb\xc9\x72\xd2\x1e\xbf\x6f\xe2\xef\xb3\x39\x76\x1b" - "\x6d\x30\x68\xa2\xda\x30\x3f\xb9\x33\x65\xef\xba\xbe\xb6\xcf\x97" - "\xb6\x6b\xc4\xfb\xf1\x11\xb4\xe1\xe7\x1c\x35\xae\xcd\x07\x7d\x0a" - "\xf5\x58\xb5\x2a\x0d\xb2\xf3\xb4\x58\x91\x47\x0a\xc7\xf9\x64\xc8" - "\x3a\xf2\x8e\xf4\xd1\x05\x9b\xda\xef\x9a\x8f\xf6\x3b\x2a\x54\x39" - "\xc7\x31\xc6\x25\x6e\x3b\xa3\x71\xdc\xcf\xb6\x86\x8a\xa9\x30\xff" - "\x7d\xc6\xd7\x7e\x13\xf7\xf1\xfc\xe7\xa5\x0e\xe7\xf8\x0a\x3d\x8e" - "\xa4\x40\x4f\x26\x75\xf6\x38\xa0\x17\x32\x4d\xa8\x07\xfa\xbf\x33" - "\xa0\xd7\xb9\xcb\xc0\x95\x71\x93\xf1\x39\xc5\xfc\xf8\xf4\xe5\x7a" - "\x65\xcc\x27\xc7\x00\xfc\x2c\xf8\x5d\xf5\x75\xed\x12\xd8\xe9\xed" - "\xfe\xca\x03\x69\xda\x12\x71\x84\xe3\x8b\x61\x2e\xd2\x5e\x05\xfe" - "\x1d\xb4\xca\x03\xdb\xfc\x31\x53\xfe\x32\xca\xc1\x9c\x99\xc4\x45" - "\x91\x5d\xa7\xe1\xba\x44\x8c\xe1\x38\xe3\x78\xce\xd2\x9f\x47\xf2" - "\x73\xe7\x12\x31\xbb\xcb\xfd\x54\x81\xb1\x47\xa8\x62\xe3\x3c\x55" - "\xdc\x1b\x4f\x28\xf1\x51\x3e\x4f\xc4\x71\xa7\x34\xcc\x85\xda\xb9" - "\xde\x7c\x9e\xcf\xa2\x3e\xe4\xab\x81\xbd\xd1\xc6\xf9\xfc\x89\xb7" - "\x0e\xc6\x2f\xb3\x9f\xbd\xd4\x76\xc6\xab\x33\xf9\x40\x9a\x81\xeb" - "\xa0\x40\x8e\xe9\x6b\xe2\x16\x32\x70\x43\xfa\x91\x2a\x95\x1e\xe2" - "\xf8\x87\xec\xeb\xd8\xe5\x7e\x7a\x98\x81\xab\x81\x03\xd7\xc7\xe7" - "\x37\x45\xca\xde\x1a\x8e\x3d\xc3\xf5\x71\x3c\x55\xe4\xcd\x35\xf0" - "\xfd\xba\xbc\x5c\x56\x2b\x04\x8f\x9f\xac\x7f\xed\x43\x89\x5a\x02" - "\xac\x53\x9e\xae\x3d\x5c\x1b\xe0\xf5\xee\xd7\x51\xc7\x6b\x9d\xc2" - "\x41\x5a\x8f\x23\x6e\x1f\x73\x19\xe4\x6f\x95\xfa\x61\xed\xde\xd7" - "\x34\x91\x0b\x3d\x81\x72\x3d\xb9\xbc\xd6\x04\xb9\x2d\x32\x37\x96" - "\xb6\xf3\x99\x4b\xe8\x9c\x22\x33\xf2\xd4\xb0\x9d\x85\xf9\x56\x50" - "\x7e\xbf\x02\xba\xc9\xb3\x64\x0c\x60\x14\x25\x99\x9d\x64\x6e\x8c" - "\x89\x53\xd5\x1f\x7f\x74\x5a\x0e\x56\x74\xae\x3d\x58\xd0\xe5\x2e" - "\x82\xfd\xff\x4c\xbf\x7b\xbe\xab\x87\x80\x9e\xc8\x57\x3d\x94\xe7" - "\x7b\x45\x8e\xcb\xe5\x35\xf6\xab\x59\x07\x8d\xb6\x51\xaa\x48\x3e" - "\x58\xc1\xfa\xb6\x33\xe5\x60\x01\x8f\x25\x28\xdf\x60\x94\xe7\x71" - "\x9d\xc7\x0e\xf4\x97\xad\xaa\x57\x1f\x16\x1d\x55\xf2\x5c\x74\xd4" - "\x90\xd1\x78\xf5\x94\x6c\x13\x9a\x6b\x04\x99\xbc\x18\xb7\x6e\x0b" - "\x52\x6a\xdd\xeb\x44\xd5\xcb\x45\x70\xe3\x72\xcc\x61\x86\xf2\xf7" - "\x2e\x8a\x72\x59\x46\x99\xbf\x37\x80\x5f\x12\x81\xcb\xc6\x8b\xa8" - "\xb3\x4c\xe5\xd3\xfd\xd6\x6d\xc8\x57\x82\x6b\xba\x30\x99\x68\x53" - "\x19\x59\x36\x69\x64\xae\x2e\xa3\x61\x48\x83\xad\xfb\xcc\x2c\x43" - "\x66\xe3\xe1\x50\x55\x47\xf4\x12\xea\x5d\x55\x26\x42\x1f\x63\x3c" - "\x77\x6b\x22\xf8\x75\xe8\x8e\xf6\xef\x51\x6d\x7c\x66\x8f\x61\x13" - "\xe2\xde\x13\xed\x77\xf0\xcc\x25\x67\xbc\x9f\x58\xb8\xb0\x24\x7f" - "\xd1\x5c\xbe\x64\x8e\x78\xee\x96\x94\xc8\xb5\x10\x1e\xff\x54\x9c" - "\x8a\x67\x5a\x79\xdd\x71\xe3\x60\x63\x1f\x7d\x81\xcd\x58\xfb\xd4" - "\xfd\xf5\xef\xe6\x39\x1d\xcf\x7d\xf0\x6e\xcc\xa1\xd2\x95\x0c\x26" - "\xe1\x73\x0b\x99\x62\xeb\x9b\x37\xa7\x64\x4e\xd1\x5d\xbc\x63\x96" - "\x12\xa7\x9e\x05\xb9\x31\xf5\x94\xf7\xd6\xa3\xc6\x9f\x80\x89\xf3" - "\xad\x4f\xdc\x2a\x92\xdb\x73\xd4\x59\xe9\x05\xdb\x8c\x35\xad\x7e" - "\xfc\x1c\x5b\xc3\x6b\x3f\xf6\xb0\x3c\xb8\x56\x92\xe9\x77\xcb\x5b" - "\x4d\x6c\x47\x96\xe1\x9e\xd7\x16\xe4\x1a\x99\x1e\x2f\xea\xa3\xf3" - "\xad\x18\xdf\x17\x04\x45\xe5\x5e\xcc\x8f\x16\xf4\xbb\x66\x13\xe9" - "\x23\xc2\x3e\x85\x6d\xb4\x30\xed\x72\x3e\x47\x9c\x9f\xdb\xc3\x3c" - "\x1b\x53\xee\x79\xd5\x67\x0b\xc1\xff\x45\xf6\xde\xf3\xbc\x7a\x9e" - "\xaa\x21\x46\x1c\xae\x85\xb3\xfb\xf5\x17\xa9\x38\x58\xad\x78\x7c" - "\xe1\x27\x8d\x98\xaf\xa1\x9d\xbf\x38\x41\x0b\x0f\x99\x6d\xb0\x11" - "\x86\xd2\x4e\xdc\x7f\xc2\x65\xf9\x5d\x14\x1f\xdd\x70\x66\xab\x19" - "\xda\x05\x5a\x26\x41\xa8\x3f\x32\xeb\x37\x89\xf8\x99\x44\x82\xdc" - "\x4d\x4d\x44\x0f\x0e\xb8\xca\x4c\xd6\x41\xa9\x96\x6f\x7f\x6b\x98" - "\xed\xee\x1f\x8f\xcd\x76\x95\x95\x42\x2b\x87\x82\x56\x11\x19\x3f" - "\xed\x54\xfb\x43\xb7\x94\x93\xf4\xa7\xa9\x3c\x15\xf7\x2c\xe5\x7a" - "\xb7\x28\xe6\xb3\xeb\x5a\x8a\x48\x73\x3d\x47\xa6\x77\xba\x7d\x26" - "\x8e\xd1\xcc\xf6\x33\x7f\xeb\xe2\x04\x15\x3f\x70\x10\x69\xa0\x97" - "\x53\x54\x88\x34\x65\x77\x16\xff\x52\x5b\x2b\xd2\xfa\xe0\x9b\x89" - "\xe1\xbb\x5e\x23\xd3\xb6\xb2\x76\x93\xd7\xfc\x63\xf2\xda\x03\x74" - "\x10\xf7\x71\xfb\x0a\x75\xb2\x2d\xcb\x30\xea\xdd\x1a\xc7\xeb\x32" - "\xe9\xe7\x4f\x4d\x67\xa9\xf8\x8f\xbb\xfb\x29\xc7\xe7\xbd\x3b\x53" - "\x3e\xf8\xb7\x2e\xf7\xb3\x66\x1f\xdd\x33\x51\xb7\x65\x30\xe6\x3e" - "\x8b\xf9\xff\x42\x19\xe7\x09\xef\x3f\xe5\xef\xc2\x20\x2d\xd3\xc8" - "\x13\xdf\x9e\xe1\x35\x78\xe1\x61\x3e\x10\x17\xff\xde\xce\x67\x5b" - "\xfa\xf1\x83\x19\xe0\x75\xde\xc1\x7b\x91\x49\x83\xa0\x7f\x5c\x17" - "\x44\x4f\xd8\x4d\xe9\x10\x27\x53\xd8\x44\xdf\x0e\x5d\x14\x79\xcd" - "\x1d\xe7\x65\x4c\x53\xd6\x35\xbf\x99\xf7\xb1\xc9\x1b\x3c\xe7\xf1" - "\xae\xd1\xa8\x05\x76\xa5\xb7\xf6\x9c\x47\xc5\x3e\x0d\x53\x33\xfd" - "\x95\x9a\x9d\xff\xb7\xdc\x5b\xfe\x57\xa4\x0b\x19\x0b\xbb\xe7\xa2" - "\x98\xe5\x35\xff\x1b\xf1\x77\x8a\x78\x8c\x03\xdd\xed\x67\xe9\xd9" - "\x7f\x7c\x04\x38\xef\xfc\x07\x60\xc9\x98\x69\xe3\xe8\x20\xee\xd1" - "\xa6\xde\xf1\x2f\x6e\xac\x99\x04\xcf\x7a\xab\xf3\x31\x93\x86\xb1" - "\x94\x63\xdb\x61\x0c\x1d\xc3\xed\xc2\x73\x16\x3f\xe3\x3a\x92\xaf" - "\xd6\x55\x9e\x2d\xd6\xd0\x63\x3c\xb6\xe6\xf1\xb8\x89\xf4\x59\xf5" - "\x17\xe5\x58\x3b\x43\x7f\x9e\xa2\x3f\xe7\xea\xcf\x13\xf5\xe7\x1c" - "\xfd\x99\xd7\xe5\xf5\x31\x79\x51\x75\xaf\xbd\x60\x1a\x70\x14\xcf" - "\x5b\x8d\xbe\x00\x3e\x03\xad\xce\x95\x72\x6c\xd7\xf1\x18\xa3\xe3" - "\x95\xa5\x3f\x1b\xf8\xdc\x60\x0d\xad\xfc\x5f\xc2\x67\xb1\x3d\x1a" - "\x9f\xc5\x59\x11\xf8\x90\xd5\x99\xf3\x75\xf0\x49\xb3\xf2\x77\x22" - "\xfe\x07\xf8\x30\x2e\x9c\x86\xfa\x77\xc7\xe0\xe3\x31\xf0\x89\xcb" - "\x6f\x4b\x44\x3b\xdb\x35\x8b\xbf\x21\xe3\x3a\x0f\x60\x9b\xa5\xbe" - "\xdb\x88\x53\xb8\x38\x74\xb9\x38\x85\x90\x05\x8c\xdb\x25\x68\xff" - "\xe2\x26\xdd\x7e\x3b\xa0\xec\xfc\x92\x31\x86\xef\x18\xda\xda\x50" - "\xa5\xda\xba\x6b\x0d\xc7\xea\x5b\x46\xdf\x74\x39\x45\x3b\xe6\xdd" - "\xff\xc9\x73\xc3\x48\xb8\x45\x25\x8b\x17\x3f\x73\x97\xbd\x68\xce" - "\x82\xb9\xf6\x11\x85\xf6\xc5\x8e\xf9\xf3\x4a\xe6\x46\xfb\x53\xa4" - "\xe9\xdf\xef\x91\xe7\x44\x78\x2e\x25\xe7\xd2\xe0\x7f\xa9\x27\xa5" - "\x4f\x5e\xc9\x05\xe1\x2e\x29\x60\x9d\x5b\xf7\x92\xfa\xce\x13\xf0" - "\x69\x34\xc6\x10\x63\xfe\xcb\x63\x08\xd2\x8f\x63\x9c\x9c\x1d\x91" - "\xce\x79\xfd\x46\x1a\xc3\xd7\x75\xd3\x80\x13\x54\xf2\x4b\xae\x33" - "\x2e\x0d\x2f\x8a\xad\xb0\x9b\xf8\x1b\x16\x26\xe8\x14\xc1\x71\xb7" - "\xf8\xfc\x25\xca\x89\x93\xf4\x9c\x9c\x57\xcc\xc2\xb3\x9a\xb3\x09" - "\xe0\xf8\xdc\x43\x28\xb3\x0d\x69\x66\xb6\x21\x30\x0f\x6c\xe7\x72" - "\x48\x7f\x86\xe3\x60\x20\xdd\xa2\xc7\x13\xe3\xb4\x55\x1c\xa7\x02" - "\x69\x69\x11\x69\x2f\x23\xcd\x86\x34\xbb\x0e\x6f\x3b\xd3\x19\xcf" - "\x39\xfa\x3a\x19\xe7\x79\x5f\xaf\xb7\x3c\x12\x67\xfe\x86\xcb\x1d" - "\xb7\x65\xd9\x67\xcd\xfc\xfe\xb8\x1f\x3f\xb9\x70\xc1\xbc\x14\x92" - "\x64\xcf\xc4\x70\x9c\x75\x87\xf3\x96\xbb\xec\xc5\x73\xe7\x2e\xb2" - "\x2f\x9d\xbb\xa0\xc4\x3e\x67\xe9\x9c\x65\x29\x34\x6f\xe1\xa2\x27" - "\x39\xca\x02\x77\xcb\xe2\xfc\x27\xe7\xfd\x9c\x9d\x5e\x54\xee\x94" - "\x28\x3b\x61\x16\xeb\x36\x3d\x2e\xc9\x91\x2a\xb6\x21\x93\x3d\x79" - "\xb8\xe7\x78\x5d\x36\x5c\x1b\xf1\x3b\x80\xdf\x7e\xfc\x8e\xe1\x77" - "\xf4\x34\xad\x58\x83\xeb\x9e\x2e\xf7\x92\x42\xc3\x5e\xe9\xe3\xa1" - "\x25\x4e\x83\x87\x60\x5f\xec\x51\xe3\xdb\x92\x86\x96\x90\x94\x9f" - "\x5e\x9e\xaa\xba\xd8\xc7\x53\x1c\x6f\xb4\x85\x7d\xba\x96\xe0\x7d" - "\xb7\x5c\xab\xe4\x35\x93\x64\xa6\xdb\x49\x5a\xb6\xa5\xfe\x15\xd1" - "\xc4\xb1\x72\x70\x6d\x04\xbf\x34\xa9\xf8\x34\x4b\x33\x90\x6f\x38" - "\xea\x38\xa0\xea\xd0\x9f\x87\x88\x23\xfc\x0d\x97\x13\xfa\x33\xc3" - "\x02\x8c\x3b\xf9\x9e\xaf\xfa\xde\xa9\x55\xff\xc6\x9b\xa9\xef\xdd" - "\xd2\x66\xbd\x0e\x0f\x68\x51\x5e\xe7\x96\x73\x29\x39\x77\xe6\x35" - "\x62\x6b\xc2\xdd\x02\xf8\x9c\xd3\x12\x1f\x6d\x95\xf1\x2f\xcb\xbb" - "\xa1\x23\xbe\xf7\x3d\xaf\x53\xe6\x4f\xe0\x35\xe4\x69\xc5\x42\xe3" - "\x38\xe4\x5a\xe2\xd3\xad\x5c\x4e\x58\x3c\x79\xda\x86\x81\x39\xca" - "\x66\xe0\xb8\x83\x4b\x1b\x74\x98\x41\xa6\xed\x69\x5a\xf2\xb0\x9a" - "\x87\xaf\x58\xa3\x6c\x89\xa5\x7b\x0c\x5f\x4b\xc8\x68\x26\x9e\x1b" - "\x0d\x1d\xe0\xa3\xa5\xd5\xba\x5f\x9c\x47\x6f\x7f\x48\x7f\xde\xaf" - "\xe3\x98\xc0\xb1\x50\x80\xff\x51\xee\x3b\xd8\x2b\xfb\x71\x7f\x0c" - "\xf4\x69\x52\xf4\x71\xca\x38\x07\xb0\x9b\xf8\xfd\x31\xfe\xde\x0d" - "\xde\x1d\x53\x71\x46\x96\x8e\xe1\x36\xf7\xf9\xce\xd6\xe6\x00\xd7" - "\x3b\x79\x8f\x19\xb2\xb4\xdf\x7b\x91\xe5\x73\x69\x16\xe0\xed\x36" - "\xf4\x0e\xeb\x99\xfc\x30\xe4\x54\xce\xa7\x9c\x45\x86\xbe\xe9\xe3" - "\x03\x67\x79\x3c\x5d\x12\xaf\xdf\x15\xfd\x9d\x7f\x17\xee\xe7\x1a" - "\x81\xd3\x6e\xd9\x07\x1c\x8f\xf5\x62\xef\xbc\xad\x47\xe9\x48\xe7" - "\xb1\xde\x39\xa6\x8e\x07\xc7\x76\xf7\x31\x6e\xdd\x72\xdf\x5f\xd7" - "\x1b\xce\x90\xa1\x37\x0c\x38\xd6\x04\xa1\x59\x9d\xf8\x57\xb1\xcf" - "\xc9\x7b\x24\x3c\x5e\x4a\x7b\x04\x70\x06\x5d\x50\x67\xe0\xb4\xca" - "\x7d\xe0\x5d\xe7\x1e\xfe\xe6\x9b\xb4\x69\xdd\xcf\xfd\xdf\x3e\x5d" - "\xb4\x6c\x46\x24\x4c\x61\xd9\xe7\x64\xb8\xac\x8f\xd8\x26\xc9\x0f" - "\x9b\x39\x0e\x8d\x53\x1f\x5f\xa0\x83\x97\x95\x1b\xb8\x82\x86\x47" - "\x0c\x7c\xf5\x6f\x8e\x1d\x41\x3d\xbe\xe9\xe1\x1e\xf6\x05\x6f\x54" - "\xfd\xb9\x42\xea\x1b\xbc\xdb\x85\xb2\x07\x7c\xf4\x5c\x9a\x2e\x43" - "\x4d\x28\xbf\xeb\x70\xd9\x44\xe4\x59\xd6\xaa\xfb\x33\x1f\x45\xff" - "\x1e\xeb\xe3\xfd\x25\xcd\x11\xeb\x3c\xc7\x54\x1f\xfe\xb8\xfc\x04" - "\x2d\xb7\x45\xa4\xeb\x7d\x7b\x78\x06\xd2\x9b\xd5\x9a\xc9\x3e\x3d" - "\xbe\xdf\x72\xe5\xbb\xaa\xe3\xc8\xba\x80\xcf\xeb\xb1\x8c\x4b\xda" - "\xcb\x3e\x5e\x3e\xc3\x18\x2f\x00\x6b\x8f\xa4\xf9\x10\x71\x80\xe9" - "\xa4\xe2\x7d\x3c\x77\x51\xd1\x69\xb9\x33\x8a\xf6\x3c\x6e\xa2\x1e" - "\xa6\xd3\xa0\x55\x42\x1b\x14\x48\x10\xf9\xcb\xcc\xc4\xf2\xc2\x32" - "\xce\x7b\x83\xe0\x0f\x69\x57\x29\xba\x2d\xdf\x6f\xd0\xcd\xe8\x3b" - "\xa6\x93\x8f\x96\x67\x32\x6d\xa3\xdb\x38\xe0\xe8\x09\xa3\xed\xa0" - "\x29\xc7\x34\xc5\x73\x93\x2e\x17\x4d\x9e\xa1\xec\x3b\xb2\xe4\xcf" - "\x87\xcd\xdf\xa7\xc3\xce\x31\xa4\x68\xbb\xc2\xe6\xa3\x12\x67\xc4" - "\xbc\xe4\x08\xd3\x97\x65\x05\x78\x96\xe8\xb1\xb7\x8e\x28\x3f\xa6" - "\x25\x4d\xa2\x72\x5f\x89\x94\xe5\x25\x32\x46\x0a\xc7\xed\x3d\xca" - "\x34\x62\xbd\xc8\xb2\xc4\x32\xc0\xf2\xa4\x68\xb4\xa2\x24\x82\x46" - "\x8d\x4c\x1f\x9d\x4e\x7b\x62\x74\xf9\x5c\x7b\xd1\x38\xa5\x8b\xed" - "\x99\x23\x0a\x47\xcb\x40\x37\xf6\x7b\x27\xdc\x65\x9f\x31\x6e\x84" - "\xd3\x31\x72\x9a\xba\x4c\x98\x31\x85\xaf\x29\xd1\xf3\x3a\x3b\xea" - "\x39\x1e\x3d\x37\x5c\xe5\x50\xfa\x63\x45\xc0\x97\x70\xb5\xfc\x86" - "\x08\xc7\x9d\xad\x5a\x40\x14\x06\xde\x1b\x4e\xa3\x4f\x2d\xfb\xd2" - "\x39\xce\xf1\x74\x27\x71\x5c\xf4\x2f\xeb\xf1\xae\x0e\xe9\x83\x8a" - "\xf9\xfb\x08\x7f\x13\x5a\xf2\xbe\x74\x5e\xb3\x11\x95\x3b\x5a\xfd" - "\xc9\xa7\xda\xf1\xdb\xed\x4f\xfe\xa0\x7d\xd2\x2d\x2e\xd1\xe5\x2e" - "\x9d\x62\xb4\x8b\xd7\x76\x40\xa7\xf4\xe9\x4e\x11\x66\x1a\xe5\x3b" - "\x39\x16\x39\x60\x27\xf2\xda\x4e\x29\xda\x5f\xbc\x5b\xcd\x5f\x4b" - "\xc1\xff\x4b\x74\x7b\x86\x66\xe0\x19\xf6\xdf\xf7\xe5\x1a\x97\xe6" - "\xb6\xc9\x18\xe6\xda\xea\x5b\x1f\xc4\x7c\x60\xb7\x01\x13\xb0\xae" - "\xd2\xfd\x1e\x24\xbc\xaf\xeb\x57\xab\xad\x7d\x2f\xc3\x9a\xa0\xe2" - "\x42\x42\xc6\xcb\xeb\x4d\x5a\x5e\xaf\x9f\x0c\xde\x0d\x5a\x95\xc6" - "\x7e\x34\x79\xe0\xbd\x72\xce\x63\xbc\xab\x72\x6b\xbe\x2a\x93\x16" - "\x44\x3f\xa6\x29\xfb\xb9\x83\xf5\x27\xe6\xae\x2b\xc7\x1a\xe3\x9a" - "\x1c\x0f\x4d\x54\xae\xe6\x33\x2b\x1f\xe3\x72\xe7\xdd\x66\x82\xce" - "\x6e\xba\x31\x5d\xce\x51\x82\x9a\x3b\x81\x94\x2f\xf3\xca\xdb\x0d" - "\x1d\xcb\xfb\xa5\xd6\x55\xc2\xcf\x6b\xc4\xd6\x90\xf0\xcb\x58\xfb" - "\x3c\x76\xd0\x69\xf2\x96\x76\x95\x7b\xe5\x37\x38\xf9\xbb\x22\x01" - "\x7d\xdc\x08\xab\x71\x03\xf5\xfb\x13\x6f\x2d\xc0\xf8\x90\x70\x9a" - "\x60\xeb\x02\x7f\xa6\x0d\xef\xb5\x68\xa0\x95\x97\xc7\x49\xa6\x4f" - "\xca\xfe\x6d\xec\x03\xc3\x6d\xb5\x86\xd0\xe6\xc8\x76\x99\x34\xdf" - "\x06\x37\xda\x65\x42\xbb\x9c\x67\x58\x66\x82\xec\x9b\x04\x79\x1b" - "\x22\xe3\x59\xcb\xf9\x79\x99\x3d\xb2\x8d\xac\xff\x55\x1b\xca\xc6" - "\xc7\x6b\xa3\x30\x71\x1b\x99\x06\x65\xd7\xe9\xf2\x26\xf1\x64\xfd" - "\xd1\x41\x2b\x8f\x0d\x5a\xc5\x3e\x41\xfb\xd2\xa1\xdf\x26\x70\x1f" - "\x62\xfc\xac\x66\x3c\xe3\xf5\x17\xc3\xd3\x61\xf9\xac\xab\xca\x0b" - "\x80\xcb\xae\xf8\xf4\x2e\x6b\xbe\x3c\xbd\xcb\x7e\xc5\xe5\x19\x0f" - "\xde\xdf\xb1\x86\x4c\xd0\xc1\xa7\x76\x63\xbe\x56\x11\xaf\xde\x41" - "\xab\xb6\x32\x5e\x71\xdf\x09\x96\x17\x5d\x07\x81\x0f\x05\xe4\x44" - "\xb0\x4e\xea\x72\xbb\x72\x0d\x7d\x64\x4d\xb0\x27\x4a\xfd\x60\x12" - "\xd5\xf1\x60\x58\x57\x55\xf3\x3e\xd7\x04\xd4\x1f\xf7\xbd\xc6\xdf" - "\xee\xa8\xd8\x47\xda\xea\xef\xde\x68\x4d\xa0\xbb\xfd\x89\xdf\x4d" - "\xb1\x3a\x43\x19\x4c\x43\xc0\x74\x42\x8e\x1f\xe2\x79\xaa\x5a\x1b" - "\x71\xc1\xfe\xff\xa5\x8c\xcf\xe4\x4f\xde\xa7\xef\x1b\xb9\x30\xfe" - "\xd5\xd8\x8d\xb5\x79\x3c\xb7\xf9\xe8\xef\x0e\x25\x97\xdf\x7c\x5d" - "\xac\xfd\x60\x8f\xe6\xb6\x0a\xfb\x72\x2b\xec\xc8\xf2\x95\x9a\xe0" - "\xef\x39\x7c\xb0\xa7\x8f\x4f\x94\xbf\x94\xc1\x27\x5d\xee\xf2\x8c" - "\xf8\x3c\x50\x3e\xe9\xf2\x3c\x50\xfe\x0d\x7e\xcf\x74\x57\x73\x95" - "\xf2\x22\xc3\x4e\x11\xab\xbf\xf9\xba\xbd\x4c\xd6\x4f\xaa\x6e\xa6" - "\x49\x0e\xe3\x3f\x05\x74\x29\x47\xde\x1a\x43\x0f\x30\xbf\x58\xc3" - "\xfc\xad\x0b\x92\x3c\x8d\x77\x18\x57\x4a\x2c\x6a\x1d\xfc\x40\xb1" - "\xfc\x7e\xa5\x7b\x45\xb5\xdf\xe5\xd8\xcc\xdf\x69\x0d\x24\xef\x2b" - "\x45\x9e\x56\x1f\x35\xaa\xfd\x56\xcb\xbe\x12\xc0\x70\x6e\x52\xfe" - "\xd0\x16\x19\x2f\x0a\x32\xcd\x31\xa2\x58\xae\x91\x96\x0e\xbc\x39" - "\x5e\x14\xe6\x3b\xab\xd2\x7a\xc7\x25\x77\x0e\x74\x85\x90\xb6\x18" - "\xc6\xa5\x61\x9d\xa0\xdd\xcb\x26\xad\xe1\xe2\x68\x1b\x71\x9b\x2f" - "\xae\x1e\xda\xf0\x8b\xdb\xc8\xfc\x07\xdb\x13\x54\x7c\x07\xa5\xaf" - "\xfa\xbe\x99\xfe\x2b\x9b\x4c\x4c\x07\x1f\xad\xb2\x2b\xda\xad\x2a" - "\x30\xfa\xc7\x47\xae\x23\x52\x77\xae\x7e\xb4\x7d\x7a\x48\x7c\xa9" - "\xd6\xb9\x57\x41\xff\x3d\x53\xa3\xde\xaf\x68\x8f\x5d\x03\x62\x7b" - "\xde\x3e\x7f\xb1\xbd\x70\xe1\xd2\x05\xc3\x87\x47\xcd\x95\xcc\xea" - "\xbb\xb8\xab\x36\xa9\xf1\x74\xd5\x11\x03\x6f\xb6\x4b\xf0\x8c\xf6" - "\xaf\xb8\x24\x96\xfd\x94\x7c\xdd\xcd\x3d\x3f\x8b\xfa\xee\x6f\xa7" - "\x29\xb7\x47\x3c\x7e\x8f\xa6\xdc\xf1\xbd\xfc\x07\xe7\xce\x29\x5c" - "\x16\x91\x7a\x67\xe4\xba\x61\xd5\xeb\xa8\x3b\x71\xe8\x3d\xd0\x15" - "\x09\xd3\x56\xf0\xd8\xe2\xfe\xb0\x2c\x24\x4e\x41\x5f\x67\x43\xc6" - "\xf2\x9b\x4b\x42\xd4\x0c\x5d\x26\xbe\xc9\x3a\x7c\x80\x3a\xdb\x09" - "\x7b\x0a\xbc\x65\x45\xdb\xfd\xb0\xeb\x2e\xf0\xfa\x0c\xca\x7d\xde" - "\x52\xc3\x31\x9d\x3f\xd0\xfd\x1a\xdc\xb5\x48\xbf\x06\xd7\x4f\x70" - "\xbd\x0a\xd7\x3f\xda\x17\x60\xde\xc3\xbe\xf4\x4b\xd8\x97\xde\xfd" - "\xae\xf4\x07\x0a\x94\x13\xfb\x04\xe1\xfd\x2c\xb6\x41\x7c\xb4\xda" - "\xcc\xeb\xe0\x9c\x17\x69\x5b\xec\x4f\x51\x16\x5f\x85\xdc\x1b\x74" - "\xd7\x8a\xca\x0f\xfc\x62\x73\x1e\x7f\x6f\x2d\xe3\x24\xad\x4e\x48" - "\x4c\xf8\x9c\x12\x6d\x96\xd4\x2e\xf7\x6a\x94\x5d\x30\x8b\xe9\xd4" - "\xdf\xb7\x68\xe5\x37\x80\x63\xec\xc3\x3e\xdb\x70\x2d\x49\xfb\x56" - "\xb7\xe7\xea\xe4\xb8\xb0\x7a\x56\x84\x4d\xc7\x7b\xd3\x29\xca\x3e" - "\x11\x61\x65\x9f\xae\x2e\x31\xe4\x00\xf7\xe5\x06\x9f\x46\xc5\xd7" - "\x5b\x50\x32\x77\xd1\xdc\x42\xfb\x88\xc5\x29\x14\x11\x5d\xcf\x31" - "\x77\x81\x7d\xd1\xdc\x67\x9f\x9b\xbb\x58\x46\xc6\xe3\xb7\x51\x63" - "\x3e\xf4\xfd\xef\x33\x8c\x73\x5f\xf6\xa1\x4c\xdf\xd5\x5f\x70\x4c" - "\x36\xb1\xf6\xf7\xdb\xd8\x77\x47\xcd\x37\x44\x66\xf4\x7c\xe3\x79" - "\x15\x77\xa2\xe2\x03\x9f\x9a\xeb\x3c\x2f\xbf\x63\x7d\x82\xd6\x54" - "\xf7\xc5\x7f\x5f\x33\x1e\xb4\x34\xe9\x74\xbb\xd0\xe5\x5e\x93\x6d" - "\xd0\xcd\x47\xcf\x7b\x74\x5b\xaa\x43\xea\x0f\x8c\xb1\xd0\x7f\x51" - "\xe3\xab\xfa\x06\xed\x1a\x8e\xcb\x91\x28\xd7\x93\x93\x3f\x68\xe3" - "\xba\x18\x26\xea\xf3\xa0\x7f\x7c\xd0\x9b\xac\xdf\x2a\x0c\x78\xa8" - "\x33\x93\xeb\xd3\xe7\x41\xd7\x9f\xa6\xe7\xe5\x9a\xb3\x56\xf1\x41" - "\x1b\xeb\x14\x8e\x21\xa2\x55\x02\x8e\xdc\xa3\x7d\xde\x23\xd7\x61" - "\xf9\x1b\x04\x80\xc5\xeb\xc0\xd0\x73\x01\xfe\x5e\x31\xa7\xa9\xd8" - "\x70\xab\xd7\xf1\xda\x33\xea\x3a\x0e\xfc\x83\x7d\x67\x1b\x9e\xf7" - "\xb0\xdd\xc9\x70\x7d\xb4\xe6\x00\xc3\x53\xb1\xef\x9e\x1f\x06\xde" - "\xc9\xe8\xb3\x9f\x9e\x2f\x88\x98\x97\x31\x3e\x12\xcf\x00\x70\x91" - "\x71\x56\x95\xaf\xa9\x6c\x37\xeb\xcf\x4d\x7a\xdb\x8d\xf6\x00\x1e" - "\xf4\xdf\xea\x34\xc3\x6f\xc2\xa7\xb7\x9b\xf1\x63\xdc\x23\x71\xd6" - "\xf1\xad\x61\x7c\x51\x6e\x5b\x84\x6c\xf3\xba\x4c\x12\xd2\xf6\xf7" - "\xf9\xb0\xaf\xa1\x58\xbd\xb1\x70\x81\xbd\x68\xfe\x82\xa7\xf3\x97" - "\xce\x79\x7a\x6e\xfe\x73\xc5\x23\xed\xcf\x2d\x78\xa2\x68\xe1\x93" - "\x4f\x33\xd7\x2c\x2e\x79\xee\xc9\xa7\xed\xac\x59\xf2\x27\x4e\x99" - "\x92\x7f\xcf\x43\x33\x1f\x4e\xa1\x7b\xe6\x20\x0d\x33\xff\x29\x59" - "\x23\xd5\xab\x07\x27\x4d\xf8\x69\xfe\x84\xe9\x0f\x4d\x9b\x25\x0f" - "\xbd\xf4\xbe\x9f\xb8\x20\x7e\x86\x28\x3e\x4c\x03\x2f\x1d\x47\xff" - "\x26\x9d\xa0\xca\xb1\x2a\x5e\xfa\x0b\x45\xd1\xf1\xd2\x5f\x00\xd2" - "\x2f\x6c\xc5\xef\x00\xd1\x2f\xfc\xf8\x41\xbb\x57\x66\x29\xfe\x4a" - "\x7e\xbc\xcb\xfd\x42\x4d\x1f\x7f\x55\xca\xb3\x94\xec\xa7\xa4\xd6" - "\x67\x5f\x80\xfe\x5f\xbd\x3f\xf2\x5d\xdf\x7c\xf2\x85\xa3\xbd\xf3" - "\xc9\x5e\x9d\xf2\x42\xef\xdc\x12\x69\xed\x98\x57\x26\xf3\xbc\x52" - "\xad\x27\x55\x8e\x93\x3c\xd5\xaf\x7c\x5b\xc8\x98\x57\xb2\x6c\xcb" - "\x3d\x29\x39\xff\xf8\x45\x76\xa4\x8c\xcb\x35\x7d\x5d\xc6\xb9\x9c" - "\x5c\xbf\xb3\x88\x74\x5e\xd3\x86\x7d\x7c\x1c\xb6\x02\xc6\xaf\x2e" - "\x21\x92\x45\xba\xc2\xe9\x17\x4e\x5e\xe3\x66\xbb\x59\xe7\xa7\x41" - "\xa7\xe9\x17\x7b\x85\xfb\xf9\x26\x35\xa7\x7c\x3e\xcc\x7a\x5d\xac" - "\x1e\x7a\x0f\xfb\x16\xf1\xdc\x09\x75\xee\xea\xe3\xd9\xca\xb1\xcc" - "\x0b\x7d\x73\xd9\x5f\x44\xe9\xff\x4e\xf9\x5d\xc2\x5f\x1c\x37\xe2" - "\x3d\x94\x0c\x27\x93\x79\x78\x35\x6d\x32\x09\xe8\x9b\x5f\xac\xe3" - "\x3a\x98\x9e\x3e\x7a\xa1\x01\x79\xcd\x7d\xf4\xab\x48\xeb\xa5\x9f" - "\xbe\xce\x62\xac\xb1\x28\xbc\x2b\xc7\xf5\x47\xab\xf8\x74\xaa\x28" - "\xf8\x4a\x3a\xb9\x29\x89\x65\xd2\xa0\xd7\xa5\xb4\xaa\xd8\x76\x29" - "\xad\x2a\x2e\xf4\xd1\xea\x85\x1b\x2e\xa5\x55\x45\x6b\xc4\xbe\x92" - "\xbe\x8e\x52\x39\x8e\x69\xc6\x3c\x86\x76\xaf\x03\x9f\xd5\xf4\xd1" - "\xaf\xd2\x72\x29\xfd\x2a\x87\xc5\xa7\x5f\x05\x9f\xaf\x8a\x84\x53" - "\x17\x6f\xdc\x18\xb4\xca\xa4\x9f\x07\xab\xfc\x25\x7f\xeb\x9e\xf1" - "\xd8\x68\xd2\x1c\x1b\xdd\xf8\xe1\xca\xf3\x88\x3e\x5b\x5c\x04\x75" - "\xfa\x56\x37\x62\xce\xcb\xeb\x4a\x97\x19\x8b\x8e\x1b\x6b\x1e\xb8" - "\x6f\xe5\xb9\x33\x7f\x13\x8a\xd3\x99\x9e\xfc\x8d\x31\xf0\x7b\xab" - "\xb2\x4b\x2b\x7b\xbf\xff\xd1\x79\xd3\x83\x05\x89\xab\xc8\x7e\xb8" - "\xf6\x0e\x4e\x0f\x82\x87\x72\x39\x9d\x7d\xb7\xfa\x83\x99\x1f\xce" - "\xa1\xf8\x70\xd7\xf6\xf2\x7f\x7f\x67\xa2\x63\xf4\x91\x63\xce\x82" - "\xc2\x85\xf3\xe6\x7d\xb5\x2a\x8a\xdc\x57\xab\x76\x6b\x15\x5d\xfc" - "\xdd\xcd\xd5\x4f\x2d\x47\x9d\xb0\xff\x8b\xdb\xd5\xb8\xb9\x16\xfa" - "\x6f\x7e\xa3\xb2\x25\x1f\x6d\x57\xe7\xc0\x5f\x4c\x8f\xd0\xcf\xe0" - "\x91\x17\xed\xc2\xbd\x76\x76\x5f\x1f\xaf\xed\xb8\xb4\x8f\x5f\xa4" - "\xf8\x7d\xfc\x62\x86\xb6\x84\xcf\xe1\xbc\x88\xf9\xcf\x22\x69\x6b" - "\xf2\x33\xfb\x41\x60\xce\xdc\x8e\xf9\x72\xc7\xf4\x65\x9e\xbb\xf3" - "\x97\x25\xc8\xbd\x62\xfe\xf6\x4a\xe8\xa2\x68\x63\x5f\x04\xde\x1f" - "\xe3\x6f\xaf\xf0\x37\x97\xf8\xfb\x9f\x32\x0f\xee\xab\x4e\x92\x9c" - "\x3b\xe2\xbd\xbd\xfe\xa4\xfc\x3e\x36\x6c\x85\x17\xcb\x0d\xdb\xda" - "\x0a\x93\x91\xcf\xa7\x6f\x50\xfd\xd1\xca\x7d\xc1\xf5\xe5\x2f\xf3" - "\xa8\x3a\x2e\xf2\x77\xd5\xc8\xaa\x6c\x88\x17\xf7\x5f\x76\xed\x3e" - "\xf9\xd4\xd1\xfe\xbf\x49\x50\x3e\xa0\x77\xaf\x52\xff\x0e\x31\xcb" - "\x3e\xfb\x8f\x76\xb9\xd7\xa5\xc5\xfa\x9f\x2a\xdf\xa1\x75\x99\x86" - "\x4f\x56\x95\xf4\x81\x22\x2b\xeb\x4f\x9e\xe7\x9c\xa4\x75\x53\xea" - "\xe5\x78\xb9\x6e\x4a\xe4\x1e\xa7\x7d\xf9\xaa\xab\xce\xd2\x8b\x17" - "\x2e\xb3\x6f\x9a\xda\xe7\xfb\x5a\x3e\x00\xe5\xd7\xf5\xfa\x88\xb9" - "\xcb\x07\xd4\x47\xe0\x86\x77\x0d\x11\xbe\x8a\x7e\x1e\x8f\x79\xfe" - "\x58\xaf\xbe\xab\xea\x07\x0e\xcd\x48\xc3\x7c\x62\xbd\x8c\x47\xb8" - "\x34\x44\xc3\x8a\x7f\xcc\xdf\xec\x59\x77\x41\x9f\x87\x76\xd8\xcb" - "\x18\x9f\x75\x2f\x33\x5c\x1f\xf2\x09\xb9\x1f\xb0\x9e\x7a\x71\x8e" - "\xa8\xcf\x80\xad\x68\xb2\x3e\xc3\xc0\xcb\x47\xeb\x64\xfc\x14\xfe" - "\xce\x75\x64\x9b\x9c\xf3\xe6\xe7\x17\x3b\x96\xe5\xcf\x5f\x30\xbf" - "\x24\x85\x9c\x73\x9e\x9b\x3f\x1a\x49\xf6\x27\x1d\xf3\x8b\xf3\xe7" - "\xcb\x68\xc5\x32\x10\x72\xc9\xb2\x62\xde\xfb\xb8\x64\x0f\x3e\x4d" - "\xda\xf2\xa6\xf5\x63\xd5\x78\xbf\x7e\x93\xc1\xa7\xf2\xdb\xdf\x22" - "\x8f\xfa\x7c\xaf\xe4\x37\x83\x13\xd1\xce\x43\xcc\xc3\x2a\xbe\xcf" - "\x86\x56\x65\x5f\xac\x6f\xba\xd4\x27\x6b\xbd\xcf\xf0\xc9\x02\x7f" - "\xa7\xb1\xac\x47\xc0\x02\xff\x6f\xa0\x4b\xcb\x6c\x48\xef\xf5\xef" - "\xd4\xbf\x3b\xce\x7d\x25\xe3\xdd\xbf\xc4\xfa\x76\xfd\xfd\x5e\xe7" - "\x24\x8e\xd9\xab\xcb\xd5\x86\x89\x11\xf8\x4a\x5f\x5e\x86\xc5\xe7" - "\xa4\x46\x07\x23\x7d\xd9\x36\x7c\x82\xb1\xd7\x66\xd4\x63\x5f\x61" - "\x82\xbe\xdb\xf0\x5a\xc0\xe4\x49\x94\xfe\xc7\x28\x07\x58\xd5\x86" - "\x1f\x8d\xaf\xb7\x5d\x1b\xb6\xc5\xe2\x08\xdc\x87\x23\xfd\x40\x9f" - "\x9f\xe0\x86\x72\x86\x81\x34\x8c\xff\x55\x23\x23\xd3\x22\xfb\x69" - "\xfc\xa4\x29\x30\xa0\x17\xcf\x45\x27\x4d\x98\x53\x54\xc4\x3a\x68" - "\xce\xdc\xa2\xe7\x16\x2d\x5c\xac\x77\xdd\xf8\x79\x1c\x86\x5a\x66" - "\xb9\x4b\x7f\x63\x5f\x30\x77\x6e\xa1\x4a\xd2\x3b\x32\x7a\xcf\x4a" - "\xf9\x31\x54\x61\xfe\xbf\xce\xd1\x67\x2b\x56\x6d\x15\xa6\x0d\x6d" - "\xf8\x9d\x93\xfa\x47\xf6\x6b\x55\x51\xf4\x1c\xad\xaa\xd4\x90\x7d" - "\xd9\xcf\x2e\xf6\x39\xdb\xfb\x6c\xa7\x90\x7b\x3c\xe8\xd7\xea\x3f" - "\xa3\x9d\x49\x3e\xaa\xe6\x33\x5f\x09\x11\x70\xf6\xf4\xd2\x7b\xf5" - "\xa3\xad\xab\x95\xcf\x84\x99\xbf\x59\xcb\x31\x25\xf0\x1e\xf3\xff" - "\x17\x8f\x2b\x3d\x59\xe5\xeb\xdd\x7b\x31\x25\x62\xbe\x59\x05\xde" - "\x5f\x98\x75\xa9\x7c\x57\x5b\x2e\x95\x7b\xf6\xb5\xac\xb6\x1b\x34" - "\x8e\xf8\x06\x3d\xf8\xaf\xfa\x43\x63\xcd\xb8\x5e\xff\x26\x02\xdf" - "\x73\x59\x9e\x57\x88\x41\x03\xef\x66\xbf\x86\x13\x54\xbd\x4e\xf1" - "\x54\xb5\x23\xc2\x37\x30\xed\x34\x55\x57\xa8\xbe\xad\x2e\x37\xe4" - "\x0f\xed\x94\xb6\x1c\xc3\x50\xe3\x7a\x55\x92\xe2\xaf\xea\x6d\x06" - "\x6d\x79\x0e\x8f\xe7\x3d\x7d\x76\x50\xd5\x2c\xe9\x2f\xa2\x62\x6a" - "\xf4\x70\xfb\x01\x67\x8c\x01\x07\x79\xd1\x7e\x8b\xdf\xa0\x95\x91" - "\x27\x92\x27\x26\xcc\x29\xc6\x04\x7b\xfe\xbc\x79\x73\x17\x2d\x36" - "\xe2\x8c\x67\x2e\x2c\x2a\x54\x71\xc5\xef\x42\xf7\x2f\x85\x0c\x8f" - "\xe3\xd0\xe4\x48\x55\xb7\x31\xf6\xee\x48\x5e\x13\x91\xfe\xa3\x72" - "\xce\xf5\xf2\x87\x75\xfa\xfc\xeb\x04\xbd\x34\x43\xf9\x5f\xbd\x74" - "\x8d\xb2\x6d\xaf\x7e\xa3\xcb\xfd\xcb\x12\xc3\xb6\xe5\xb5\xd6\x4e" - "\xba\xb1\x86\xcf\xc8\xf1\x59\x82\x2d\xaf\x88\x36\x5e\x5b\x45\x9e" - "\x1a\xe3\x5b\x74\x6c\x37\xad\x7f\x45\xc5\xd0\xf6\x2c\x60\x5f\x91" - "\x97\x3f\xd3\x2a\xf7\xfa\x45\xca\x76\x3b\xec\xb3\x54\x96\x89\x81" - "\x1d\xec\xc3\xcb\xb1\xaf\x7e\xd9\xc6\x76\x1d\xeb\x32\xfe\x5e\x43" - "\x1b\xfd\x72\x0f\x74\x34\x74\xfa\xcb\x3e\x7f\xf2\x5e\xff\x9a\xe5" - "\x64\xe1\x3a\xa0\xaf\x7d\x8d\x5b\x99\xb6\x2f\xd1\x21\xe8\x32\x5d" - "\x67\xfb\xb8\x1e\x1f\xfd\xb2\x49\x5f\xf7\xd7\xbf\xad\xb4\x0f\x34" - "\x7f\x09\xfa\x7f\x60\x8d\xe2\xd5\x1d\xaf\xde\x5c\x4e\x4e\xfe\x36" - "\xa5\x8a\x5b\x75\xb0\x1a\xed\xa8\xe1\x6f\x40\xc2\x16\xc4\x7c\xe7" - "\x97\x25\x68\x43\x8d\xee\x03\x0e\x5e\x79\xa9\x59\xf9\xf6\xff\xb2" - "\x90\x69\x00\xb8\x69\x3a\xdc\x34\xc0\x45\xff\xdf\xa0\xc7\xcb\x7e" - "\x69\x9d\x51\x07\xc6\x3f\x3f\xec\xe6\x56\xb6\x9d\x81\x37\x6c\xe8" - "\xbd\x1d\x55\x72\x2f\xdd\x07\xbd\x6f\x15\xec\xbb\xd6\xf7\xbd\xbd" - "\x97\x1a\x8d\xb1\x90\xeb\xd6\x71\xe7\xb3\xcb\x16\x5e\xe7\xd3\xeb" - "\x4a\xe5\xb5\x00\x03\xa6\xa8\xdc\xdb\xae\x5d\x3c\xb3\x15\x30\x2d" - "\x18\xd7\xfd\xfa\x77\xd6\x3a\xaa\xce\xb3\x9f\xa3\x0f\xe3\xf6\xb7" - "\x45\x7e\x28\x8d\xf7\xa0\x06\x1a\xdf\xb1\xab\x3f\xcf\xf4\xda\x98" - "\xd5\xb7\xb7\x84\xf2\xa0\x3f\xe4\xa1\xbc\x8d\x36\x4e\xe6\x7a\x59" - "\x16\xb8\x2f\xbb\xd1\x37\xe8\x9f\x4c\x71\xf1\xcc\x6e\xfb\x02\x1a" - "\x78\x92\x36\x3e\xc3\x7d\xc4\xfb\xc1\xec\x7f\x88\x34\x2b\xc7\xdd" - "\x3f\x41\x1b\x1f\xe6\xfe\x61\x5c\x44\xc5\xf6\x60\xa8\x2b\xef\x3e" - "\x3e\x73\xcd\x3a\x73\x65\x29\x6c\xee\x79\xac\x4b\x36\x7d\xc6\x73" - "\x78\xfe\x5e\x12\xdf\xbb\x0a\x85\x26\xfb\x77\x39\xf7\xef\xa6\xcf" - "\x56\xb6\x0b\xed\x4b\x37\x89\x23\x01\xa2\x2f\x4d\x14\x0a\x9a\x12" - "\x18\x6f\x93\xeb\x0c\x9f\x0b\xdf\x4a\x5e\x67\x05\xfb\xb2\x59\x36" - "\x2c\xa7\x34\x3e\x53\xcf\xdf\x02\x6a\x09\xd4\x52\x4b\x71\x2d\xfd" - "\x29\xb4\x89\x3c\x4b\x38\x3e\xca\xcb\x6b\xfe\xd5\xb9\x89\xf7\xd8" - "\x92\x71\x3f\xc9\xfe\x53\x59\xd7\xb0\x7f\x3d\xf6\x17\xfa\x57\xcf" - "\x5f\xc8\xfe\x88\x7c\x1e\xd9\x94\xf7\x27\x6a\xca\xf9\x13\xb9\xda" - "\x84\xc6\xf3\xba\xb2\x67\xb8\x8e\x0a\xc0\xda\xca\xe7\xcf\xd3\xb4" - "\x4e\x5b\x0a\xda\x6f\xe6\xfd\x83\x96\x80\x9f\x3c\x0b\x7e\xcf\x38" - "\xbe\x5d\x77\x9e\x2c\x9e\x05\x1f\xcb\x7b\x35\xdf\x3a\xb3\xd5\x5b" - "\xd8\xca\x36\x65\x88\xcf\xde\xf3\x9e\x24\xe6\x18\x5a\x15\xe3\x18" - "\x56\x78\x83\x5e\x66\xa3\x3c\x6c\x4e\xa3\xbc\x8c\x15\xb7\x85\xe9" - "\x01\x9c\x9a\x67\x29\x9a\x34\x61\xa4\xd0\x71\xfe\xcc\x95\x17\x49" - "\x9f\x8d\x4d\x4c\x1f\x8e\xd9\xaa\xa1\xbf\x80\x5b\x0e\x68\xa0\x19" - "\x75\x00\x67\x8b\xbe\x86\x6b\xd9\x70\x9e\x52\x3d\x0b\xf8\x5b\x70" - "\x2f\xdf\x6e\x9d\x61\xb6\x68\x17\xcf\xee\xae\xba\x40\x66\xee\x37" - "\xde\xb7\xa9\x92\xef\x19\xe6\xcb\xe9\xdc\x67\xe0\xc9\x02\xfc\x0a" - "\xf1\x73\x30\xdf\xe1\x5a\x84\xfe\xaa\x00\x0e\xbb\xd0\x57\x5b\xf9" - "\xaa\x78\x71\x47\x0d\xc7\x25\xd1\xe7\x50\x7d\xe9\x90\xa3\x90\x90" - "\xdf\x5b\x86\xcc\x6c\xda\xa5\x41\x8e\x78\x0d\xa7\xee\x25\x4a\xd5" - "\xdc\xd5\xc1\x2d\xd0\x75\xb5\x2f\xc9\x73\xc9\x69\xbc\xae\xf9\xba" - "\xfc\xb6\xc6\xcb\xbb\x0d\xdd\xb7\x76\x08\x9f\xdd\xdc\x74\xdc\xc4" - "\xeb\x3e\x15\xfb\x2c\x3a\x9f\x5b\x90\x07\xfa\xff\x7a\x7d\x0c\x7d" - "\x49\xce\x2f\x58\xf6\xfb\x9b\x4f\xc0\x96\x6d\x12\x9b\xf3\x88\xf7" - "\x7f\x52\x57\x09\x7f\x6a\x9b\x55\xb4\x04\x9a\xe4\x99\xdd\x96\x40" - "\x58\xee\xff\xe0\x7d\xc2\xb4\x80\xdf\x0a\xdb\xf7\x28\xd3\xce\x48" - "\xe7\xbd\x23\x5e\x57\x9b\x16\x10\xfe\xe9\xcb\xac\xfc\x2d\xcc\x61" - "\x72\xef\x40\x4f\x6f\xb1\x61\xde\xb0\xcc\x6f\x45\xdb\x43\xbd\xb0" - "\x3a\xf3\x12\x59\xde\x90\x37\xbd\x37\x6f\x67\x9e\x99\xbf\xed\xcc" - "\x75\x46\xa4\x25\x4d\x77\xa2\x2c\xf7\x95\x9e\xa6\x6c\xe6\x57\xf6" - "\xf4\xce\x29\xf9\xfc\x42\x27\xc6\xcd\xc5\x79\x09\x5a\x67\x9e\x29" - "\x0c\xd8\xe0\xfd\x34\xf9\x4d\xce\x90\x5f\xff\xc6\x55\x3b\xe4\xb7" - "\x95\xc4\xfa\xc4\x2c\xe4\x33\x33\x5c\x8e\x05\xc1\xdf\x06\x11\x03" - "\x93\xf6\xc7\xf7\xb9\xeb\x68\xf7\x94\x3d\x02\x7e\x7a\xf5\x00\xcb" - "\x73\xd8\xf2\x5e\xba\xfd\x29\xb6\x61\x5e\x95\xbe\x01\x61\xc8\x58" - "\x38\xf9\xbd\xf4\xd1\xed\x94\x50\x06\xbe\x55\x6b\x50\xaf\x3e\xe4" - "\x85\x0c\xba\x34\x01\x3b\xf4\xd5\x5c\xe6\x1b\x6b\x07\xfb\xca\xbd" - "\x67\x93\xfe\x69\x29\xed\x3e\x6f\xb0\x9d\x9a\xca\xff\x4a\x4d\x21" - "\x6f\xf9\x81\xf3\x7e\xb3\xf2\x53\x33\x33\xdc\xf9\xfc\xce\x05\x5e" - "\xcd\x0f\x6f\xa5\xfe\xf6\x06\x78\x7e\x8c\x31\xec\x6f\x6a\xae\xf8" - "\xea\x01\x63\x5e\x7c\xf9\x36\xd4\xa4\x73\xfc\x0c\x21\x6c\xa4\xad" - "\xfd\x83\x0f\xb8\xb8\x44\x57\x26\x8d\x5e\xce\x6b\x72\xaf\x76\x60" - "\x8e\x92\xa3\xc3\x3d\xa7\xe0\x22\xff\x65\xe0\x32\xcf\x34\xd5\xc8" - "\x7d\x29\xb4\xe9\x0f\x47\xc3\x80\x1d\x4e\xf9\x3f\x69\xd0\xf1\x2e" - "\xd7\x97\xbc\x66\xfb\xda\xc3\xa8\xe7\x68\x4b\xe8\x28\x71\x1c\x9e" - "\x3a\x0d\xe3\xe3\x39\x1b\xe9\x3e\x79\xae\xb3\x54\x33\x49\x13\x99" - "\x69\x98\xaf\xf3\x7e\x8c\x8b\x75\x1c\xaf\x05\x94\x85\xe9\x2a\x2f" - "\x46\x46\x8e\x1d\x01\x18\x53\x3f\xe1\xbd\x2f\xe8\x89\xb0\xb0\x99" - "\x3e\xbc\x88\x91\x1e\xba\x53\xc6\x92\x58\xfd\xcd\xd7\x07\xad\xa2" - "\xbb\x85\xc9\x2a\x7d\x3a\xb5\xca\x93\xed\xe8\xdb\x6c\xe5\x03\xb8" - "\xcf\x16\xe1\xff\x97\x88\xba\xa4\xff\x9f\xb0\xec\x3d\x5e\x2b\xd7" - "\x1d\xdf\x4b\xef\x72\xd7\x04\x7c\xf4\xaa\x5c\x7f\x5d\xc7\x67\x3c" - "\xa4\x8e\x7d\x6d\x8e\x3f\xf9\xe3\xdd\x0c\x83\xcf\xb2\x6a\x4b\xc2" - "\xbb\xab\xfe\x21\xed\x6b\x7e\x37\xbe\xa5\xa3\xcb\x23\x2a\x3e\xde" - "\xcd\xe7\x18\x75\xd8\xd6\xb3\xf4\xda\x35\xa2\xf2\xe3\xdd\x3e\x7a" - "\xad\x40\xf5\x8d\xbc\x1f\xc9\xef\x43\x3d\x99\xb0\xab\x6b\x1a\x6a" - "\xbb\x79\x2f\xa0\x66\x96\x70\x7f\xdb\xd3\x69\xf9\x78\xf7\x4c\x1b" - "\xdb\x54\xaf\x95\xf8\x12\xd4\x77\x7d\x8d\xb8\x18\xfd\xcd\x91\xc4" - "\x66\x5b\x8a\x17\x40\x30\x9f\x4d\x3f\x4d\x9b\xbf\xe8\x76\x93\xa9" - "\x07\xb6\x60\xb7\x89\xd2\x20\x5f\xa9\x1b\x86\x52\x16\xde\x0d\x3d" - "\x4d\xaf\xfd\x31\x64\xa2\x74\xfc\xd2\xfc\xdf\x74\x24\x03\x6e\x0e" - "\xaf\x91\x36\x9f\xe7\x35\xae\xd7\xe5\x39\xe5\xaa\xd7\x29\x43\x03" - "\x3c\xde\xef\xa9\x1a\x4a\x19\xbc\x4e\x89\xb4\xcc\xfc\xb0\xda\xf7" - "\x34\xd6\x22\x56\x0f\xa5\x91\xd1\xf5\xbe\xb6\x5b\xad\x63\x6e\x6e" - "\x93\x73\x2b\x3f\x7d\x0b\x73\xab\x13\x80\xbb\x4d\xb8\x13\x85\xf8" - "\xa6\xcd\xa4\x7c\x13\x5e\x5f\x6f\xad\x51\x7c\x27\xf7\xf9\xc0\x6f" - "\xbc\x8f\xaa\xef\x29\x25\xc8\x78\x20\x29\x1f\x6c\xe3\xef\x50\x47" - "\xac\x13\xa7\x49\x3c\xf4\x33\xfc\xe1\xd5\xb7\x72\x6c\x30\x79\x76" - "\x3f\x7f\x8e\xda\x8f\xe2\xf3\xfd\x3e\x7a\x5d\xc6\x63\x5c\xf7\x3a" - "\xa5\xbe\xf8\x3a\xa5\x35\xcf\x93\xed\x3a\xa0\x64\xd1\x4c\x8c\xaf" - "\x56\xc1\x72\x06\x9e\x00\xde\x5c\x1f\xf3\x46\x4b\xe8\x9c\xc7\x55" - "\x22\x34\xcf\x53\x6c\x8b\xbe\x1e\xf6\x2c\xda\x45\xd3\xdb\x42\xea" - "\x2c\xea\x6c\xf2\xd7\x03\x5e\xfd\x50\x4a\x3b\x49\x9b\x93\xbd\x45" - "\xc4\xfb\x15\x37\x7a\x16\xed\x01\xec\xcd\x37\xf0\x58\xb0\x1e\xf4" - "\x51\x63\xc2\xe6\xa3\xde\x60\x2b\x35\x43\xbe\xa7\x15\x0b\x09\x07" - "\x79\x1e\x92\xed\xdd\x6c\xb3\xe7\xab\x18\x0c\xb2\xad\xbd\xfb\x7c" - "\x7a\x3b\xbc\xe7\x25\x3c\x87\x17\x5c\x62\xb4\xc9\xa0\xb5\xe2\xaf" - "\xcd\xdb\x3d\x8b\xb6\x11\xf7\x0f\xe7\xc7\xf3\x26\x6f\x07\xf2\x9e" - "\x89\xee\x17\xce\x83\x77\x9f\x00\xee\x0f\xfa\xf6\xaa\x79\x0f\xb5" - "\x2f\x4f\xed\xeb\x7c\x1e\xed\x75\xcb\x66\xd0\x48\xad\xed\x6f\xbe" - "\x9d\x71\x45\xdf\x65\x79\x4b\xfe\x1a\xdf\x27\x15\xb2\x0f\xbe\x5f" - "\xd5\x22\xf7\xec\x6a\x87\x4f\x0b\x69\x42\xe9\xb3\xda\x63\x1a\xf4" - "\x80\x0f\x57\xd6\x05\x52\x9f\xdc\xc6\x7e\x40\xb5\x9f\x5a\x13\x54" - "\xff\x72\x5b\xd8\x5e\x89\xd7\xc7\x11\xfb\x89\xec\x97\xdb\xdb\xc7" - "\xfc\x0d\x47\x8d\xf7\x84\xd9\xdf\xbe\xc7\x46\x8a\xff\x44\x35\xe0" - "\x7e\xa2\xdb\x6e\x79\xfa\x58\x96\xd7\x99\xfc\x9e\x9d\xcf\x47\x1a" - "\xbe\xc1\x90\xdf\x61\xf9\xca\x9f\xdb\xc6\x3a\xaa\xde\x24\x74\xde" - "\xac\x3d\xa6\x97\x9d\xa5\x7c\x32\x6a\x37\xa1\xfc\xac\xb8\xed\x4d" - "\x84\xde\x71\x43\x4d\xa3\x3d\x6c\x47\x0a\xe8\x2a\x8c\x07\x57\x79" - "\x03\xdd\xfa\xf7\x33\xb7\x3c\x00\x9b\xfa\x2a\x3e\x1f\x65\xe0\x76" - "\x65\x7b\x7f\x5b\x86\xa9\xb9\xcd\x96\xd9\xc6\xda\x92\xb0\x80\xc6" - "\x6e\xab\xe0\xb3\x92\x7c\xde\x25\x90\xdc\x01\xfb\x56\xd8\x95\xdc" - "\x6c\x59\x03\x3b\x55\xea\xdb\xfc\x20\x95\x73\xbb\x78\x6f\x17\xf3" - "\xa6\xab\xb8\xcd\x80\x83\xf9\x4f\xf1\x58\x35\x9e\x2b\xd8\xfd\xae" - "\xed\x18\x6d\x43\x9b\x64\xdb\xd0\x46\xd9\x36\xfd\xfb\x52\x27\xa9" - "\x6e\xb8\x5c\x2f\xbf\xb2\xf6\xa8\xf8\x32\x15\x1d\x7e\xfe\x76\xee" - "\x49\xaa\x7f\x5f\x9e\x81\x41\x9f\xa8\x7d\x90\xba\x12\x91\xf2\x62" - "\xca\x95\xc1\xac\xcb\x51\x30\x85\xfd\x65\x8e\x45\xa9\x7f\xa3\x0e" - "\xb0\x7f\x25\x2a\x85\x5d\x9e\x31\x44\x7d\xfc\x8d\xcf\x3e\x3d\x54" - "\x9f\xc1\x7d\x75\xdb\x2e\xca\x51\x7c\x58\xff\x0d\x5e\x6b\x56\xf3" - "\xbc\xba\x23\xd0\xbd\xeb\xd4\x9c\xca\xf0\x23\x4f\x90\x7e\xe4\x91" - "\x3a\xf6\x0a\x71\x94\xfa\x4e\xa4\x9c\xac\xc6\xfd\x7e\x79\x56\x12" - "\xf8\x2e\x0d\x19\xfa\xaf\x6e\x3f\xfb\x24\xf5\xfa\x03\x2c\x03\xaf" - "\x94\xa9\x73\xe4\x5d\xee\xfa\x3c\xc3\x46\x91\xdf\x24\x73\x8b\x23" - "\x9c\x6f\xfa\xb2\x73\xd2\x5f\xa0\x4a\xc6\x3c\x38\xad\x9f\xb3\xab" - "\x7f\x46\x5f\xd7\xc8\x64\x1f\x7e\x94\xdd\xe4\xa3\x43\xf2\x4c\x20" - "\xd3\x80\xeb\x96\xb8\xcb\xef\x82\xd5\xef\xee\xdb\xf7\xa9\x93\xdf" - "\x4d\x57\x7e\xad\xf5\x47\x0c\x1e\x41\x7b\xaf\x52\xb1\x41\xeb\x6e" - "\x3f\x3c\x92\x24\x0f\x74\x0a\x5b\xca\x77\x6a\x99\x27\xeb\xfd\x91" - "\x74\x9a\x1e\xd2\x5c\x4a\x07\xd5\xb5\x0a\x29\xeb\x75\xad\x5f\x6d" - "\x4f\x6c\x9d\x64\xd8\x22\x8a\xce\x69\xd0\x2f\x6f\xa4\x49\x5a\x57" - "\xec\xc8\xe6\x18\x2d\x2b\xca\x38\xe6\xd4\xaf\x92\x38\xb6\x57\xa8" - "\x62\x47\x5e\x98\xcf\x64\x62\x9c\xd5\x2a\x76\x38\x4e\x16\x93\x29" - "\xbf\x98\xf7\xba\x3e\x2e\xe7\xf9\x95\x70\xc1\x16\x48\x81\x7d\x02" - "\x39\x5f\x39\x9f\xac\x8f\x39\x00\xdb\x95\x99\xce\xb1\xb7\x38\xee" - "\x16\xc7\xce\x0b\xbb\x32\x07\xe3\x7e\x08\xec\xb9\x34\x61\xd9\x91" - "\xcb\xfe\x32\x61\xb7\x80\x3e\x3e\xce\xf1\xbf\x4c\x5e\x7f\x90\x56" - "\x9e\x21\x0b\xc7\xf6\x0a\x55\x7e\x5c\xd3\x12\xf8\x4c\xce\x2d\x06" - "\x15\xc3\x9e\xd6\xe4\xb9\x1c\x9b\x96\xfc\x71\x39\xc6\xf8\x35\xaa" - "\xdd\xe7\x84\x6a\xb7\xc2\x9b\xf1\x57\x3a\xae\xc1\x51\x26\x71\xff" - "\x97\x37\x43\x80\xaf\x55\xbc\x5d\x18\xae\x78\xbb\x40\x9d\xe5\x6c" - "\xa2\xb2\x12\xd1\xee\x85\x6d\xcc\xfe\x9b\x7c\x5e\x97\xfd\x71\xb8" - "\x8d\xdc\x3e\xae\xfb\x5f\xcf\x9f\x91\xb1\xca\x42\x78\x76\x15\xe9" - "\x65\x3a\x50\xa6\xa3\x89\xba\x2b\xde\x96\x6d\x6f\x09\xa8\xb2\xf9" - "\xf2\x9e\xcb\x47\xd0\x41\x6f\x73\x2f\x1d\xd0\x76\x6e\x1f\xb7\x3f" - "\xc4\x34\x01\x0d\xf4\xb6\xda\x7a\xf4\x76\x72\x1b\xff\x84\x51\xe7" - "\x75\xb4\x13\x6d\x95\xed\xec\x41\x3b\x8f\x38\x88\x82\x6b\xcf\xd0" - "\x97\x29\x6f\x17\xf0\xfc\xd0\xf5\x67\xd8\xd1\xa5\xd5\x84\x79\xa0" - "\xf9\xed\xb2\x6a\xd3\x5a\xd8\x26\x65\x7e\xcc\x07\xfd\xa2\x9d\xed" - "\x7d\x6f\x31\x7e\xa1\x5a\xf9\xdd\x61\x69\x1f\xf3\x37\x62\x9f\x45" - "\x9b\xb4\x2f\xa8\xac\x5d\xb4\xc3\x36\x0d\x7a\x43\xc8\xe3\x40\xfb" - "\x31\x7f\x3c\xa9\xe3\xcf\x79\x57\xfe\x43\xb5\xcb\x5a\x44\xe9\x07" - "\x1f\xa9\x30\x79\x5b\x2b\xc8\x68\xcb\xe3\xc8\x87\xf6\xd8\x00\x6b" - "\xa0\xfc\x2e\x03\xda\xb9\x19\x78\x06\x23\xda\xd4\xdc\x11\x04\xcc" - "\x4f\x29\x65\x06\x25\xbc\x7e\x16\xed\x38\x4b\xb6\xea\x32\xd8\x5f" - "\x0f\xb2\xbd\xf8\xab\xcf\xaf\xce\xa3\x0c\x1f\x6d\x6d\x57\x7c\x27" - "\xe3\x06\x5d\x77\x9a\xde\x48\xee\x8d\x0d\xc4\xf1\xd6\x92\x3f\xae" - "\x65\x3e\x92\x31\x82\x78\xcc\xe8\x02\xcf\xb0\x2f\xcd\x52\xd4\xd1" - "\x95\x39\x44\xe2\xe3\x1e\x43\x78\x4e\xc5\x33\x7f\x33\x2a\x9d\xd7" - "\x04\x50\xae\x46\x80\x66\x0c\x1f\xf6\xdc\x1a\xbe\x32\x0d\xe3\x9e" - "\x35\xf9\x0d\x65\x8b\x14\xd8\x98\x98\xfb\xee\x2e\xf3\x9b\x9e\xff" - "\x0d\x8d\xbc\x32\x9d\xf2\x46\x76\x7f\xfa\x9b\xf7\x2d\x18\x1e\xda" - "\x36\xf8\x34\x6d\xbb\x21\x5a\xc6\xec\x52\x97\x29\x3d\xf8\x46\x1b" - "\xef\x15\x5c\x61\xbd\x52\xff\xb1\xcf\xd3\x15\x96\x6b\x37\xf0\xc0" - "\xfd\xb6\xfe\x70\xbf\x72\x3a\x6c\xcb\xe9\x0f\xd6\xfa\x57\x64\xbc" - "\x38\xd7\x86\x57\xd8\x1f\xb1\xa3\xfd\xb0\x8d\x63\x78\x63\xec\xdc" - "\x16\xa0\xc5\x5b\xc8\xe2\x3a\xc3\x6b\x32\x53\xe9\x70\x6d\x16\xd5" - "\x61\x4e\x2e\x3a\x33\x07\x6f\x3c\xcf\xbe\x0f\x4a\x87\xb0\x4d\xca" - "\x67\x29\xc5\xe2\xcc\xb4\xaa\x57\x0c\x1b\x7e\x7b\x72\xe9\x05\x32" - "\xa9\x6f\xa4\x6c\xb7\x4c\xb4\x8b\xd0\x26\x93\xe6\xa8\xe5\x98\x57" - "\x29\xa7\xb2\x38\xe6\x95\x11\x47\x4a\xda\x3e\x4e\xc8\x5c\xa7\x2d" - "\x65\xfd\x22\x1a\xc9\xb1\xef\xac\x7e\x65\xcb\xa9\xf1\x9a\x63\x54" - "\x51\x9a\xbe\xdf\x9f\xa6\x62\x4b\xbd\x51\x5e\x7f\x1e\x75\xa9\xf7" - "\xf3\xc3\x98\xc3\x48\xb8\x8b\x28\xa3\xf6\x3c\x65\xb2\x1d\x94\xff" - "\x85\xb2\xd9\x78\x5e\x38\xb5\xc3\x2a\xc2\xff\x95\x49\x5b\x4e\xf7" - "\xc5\xc6\xf3\x2f\xe6\x78\x7a\xc2\xd6\xdf\x5e\x49\xd5\x10\xe9\xf3" - "\x23\xe3\xb1\xa8\x6f\xe8\x11\x6d\x7a\x89\xcc\xfc\xcd\x58\x5e\xcb" - "\xe3\xb5\x61\x3e\xf7\xa3\xc6\x90\xed\xad\x46\xcc\xb0\x7e\xf7\x11" - "\x2b\xd4\x7c\x47\xbb\x0a\xf3\x2f\x7f\x97\xc7\xb3\x84\xc7\x8c\x1d" - "\x76\x3e\x6b\xd4\x37\xc7\xd9\x91\xc0\xef\x38\x8d\x7d\xe1\x73\x24" - "\x2d\x77\xe4\xf2\xbc\x47\x9f\x33\x1e\xb4\xf7\xa6\x29\x1b\x86\xc7" - "\x32\xc6\xa1\x5e\xad\x23\x0f\xea\x72\xef\x28\x34\xc6\x33\x1e\xd7" - "\xd5\xf7\x6a\x77\x38\x7d\x09\x1f\x95\x5e\x06\xbf\x34\xfd\x7b\xcf" - "\x1c\x1b\x21\x07\xf9\x1b\x8c\xf1\x4d\x7e\x8f\x64\xf5\xd0\x7b\x16" - "\x2f\xa3\x61\x33\xbf\x61\x91\xb1\x37\xf8\xbb\xa3\x6a\xdc\xdd\x71" - "\xb4\x6f\x3f\x2d\x47\xd2\x5b\x7e\x6b\x90\xe7\x18\x26\x8c\xc1\x2a" - "\xfe\x5d\x87\x1a\x7f\x8d\x73\xee\x3b\xce\xf4\xd5\xb3\x33\xad\x77" - "\x1c\x45\x1d\xec\xd7\xc1\xf0\x95\x6d\xb2\xa3\x91\xeb\xe0\xb9\x95" - "\x1a\x5f\x77\x34\x5e\xc6\x16\xcb\x64\xfa\x6a\xfa\x7c\xd2\xdb\x71" - "\x4a\xd1\xd7\x49\x89\xa3\x37\x91\xed\x60\x99\xcf\x3c\x48\xc5\x71" - "\xb2\x9e\xa0\x9d\x73\xf8\x3d\xf3\xba\xe7\x36\x5e\x8b\xdb\xf9\xa1" - "\x97\xc7\xed\x9e\xbc\xd4\x69\x3c\xd7\x97\xb6\xf8\xce\x5d\xa3\x50" - "\x0e\x69\x83\x3f\x3a\x1b\x34\x57\x2d\xa7\x91\xfc\x4d\x4f\xa4\xcb" - "\x75\x02\xff\xf5\x4f\x77\x7d\x27\x9d\x6c\xdf\xd9\xc4\xe7\x01\x76" - "\x1e\xc3\xfc\x52\xfa\x47\xc8\xfa\x37\x24\xce\xe0\xd8\x7f\xef\x74" - "\xfb\x92\x54\x5f\x35\x3c\x8b\xe7\xcc\x88\xe7\x81\xc6\x5a\xbe\x8f" - "\x1a\x8a\xe5\xde\x25\xfb\x3c\x2f\xe0\xf1\xfa\xd4\xd1\x3e\x3f\xa1" - "\x86\x67\x15\x2e\x0d\xcf\x1e\x2e\x26\x5e\xab\x3e\x56\x27\xe3\x78" - "\x35\x4c\xf4\xd1\x8e\x35\xfa\x7a\xcc\x51\xc9\x57\x6c\xef\xbe\xc0" - "\x73\xb0\x53\x9e\xf5\xc8\xc7\xe3\x44\xbe\x93\x72\x94\x0d\x7f\xaa" - "\x5d\x03\xff\x44\xb4\xff\x33\x5e\xeb\x8b\xab\x13\x5f\x27\x92\x65" - "\x2a\x4f\xd9\xa5\xcf\xd9\xfa\xa4\xdd\xb8\x5a\x44\x65\xfb\x51\x5c" - "\x53\x91\xee\xc3\x95\xc7\xf0\x56\x5c\xd3\xc5\xfa\xc4\x6a\xe6\x4b" - "\xcc\x61\x6d\x98\x27\xf0\x3e\xa8\xad\xbf\xb3\x8a\x4c\x1b\xef\x9a" - "\x9f\x92\xf2\xa1\x7d\x73\x56\xb3\x1f\xf6\xd9\x16\xa2\xc5\x21\xd1" - "\x6d\xff\x16\x9f\x09\x7a\x73\x96\x6b\x0b\xfb\xae\xbc\x99\x19\xed" - "\xbb\xf2\x66\x2e\x7e\x15\xf8\x1d\x27\xfa\x75\x2a\xae\xb3\xfa\x7e" - "\xbf\xce\xed\x72\xbf\x39\x0b\x74\x94\x36\xd6\x95\xe9\x44\x2e\x8f" - "\x7e\xe0\x79\x51\xf2\x1f\x3c\xb2\xbd\x95\x82\xf0\x6c\x11\x03\x13" - "\x73\xf4\xf6\xfa\xf1\x9c\x66\x77\x61\x5c\x4b\x06\x4d\x86\xa2\xcd" - "\x03\x93\x76\x73\x7b\x19\xdf\xce\xe4\xf6\xa3\x91\xe7\x34\x19\x26" - "\xb7\xdf\x9f\x8c\x72\xa0\xa5\xb8\xe9\xc1\x02\x83\x9e\x3a\x9d\x78" - "\xdf\xc8\xd4\x09\x18\xca\x0e\x42\x7e\xc0\x30\xf2\xf7\xd2\x7e\x28" - "\x7f\x5f\x03\x7d\x8a\x7c\x98\x13\x5b\x8c\x33\xa0\x5d\xee\x5f\xe7" - "\x1c\x2a\x52\xfb\x07\x5c\x36\x10\x51\x96\x63\x5e\xc4\x2b\x8f\x3a" - "\x65\x79\xc6\xf5\x24\xbd\xf9\x90\xaa\xf7\xd7\x63\xfa\x93\xa5\xb2" - "\xe1\xb0\xef\x6a\x7d\x1c\x17\x83\xed\xa1\xb1\xde\x61\x01\xf2\xd6" - "\x6a\x18\xf3\xdb\xa1\x8f\x84\xe7\x24\xfd\xfa\x42\x4b\xb0\xfd\x0a" - "\xc7\xc3\x5f\x4b\x9f\x2c\xd1\x5d\x4e\xde\xd2\x3b\xe4\xb7\xac\xcf" - "\xd2\xae\x11\x5e\xbf\x8c\x09\xcf\xf7\x32\xb6\x28\xfb\x69\xf0\xd8" - "\x80\x39\x76\x6f\x4c\x45\x0d\x79\xeb\x38\x1d\x69\xde\x80\x5f\xc6" - "\x5e\xec\xf3\x23\x3f\xd9\xaa\x64\xea\xad\xcf\x64\xfc\x05\xc6\x37" - "\x74\x9f\x87\x71\xd6\x2a\x4e\xb6\x72\x1b\x5c\x98\xff\x79\x43\x5d" - "\x1e\x96\x09\xfb\x12\x5e\x2b\x7c\xeb\x7d\xf0\x9d\xd0\x2a\x4f\xb6" - "\x5e\x59\x1b\xde\x92\xe7\x81\x5c\x21\x71\xd6\x9f\x7c\xb2\x95\x6d" - "\x92\xaa\xb2\x24\xcb\x84\x5a\xe1\xe9\x4c\x69\x87\x8e\x7d\xeb\xf8" - "\x21\xa7\xea\x9b\x2b\x84\x7b\xdc\x68\x7b\x9d\xde\x76\xa4\xc9\xbd" - "\xb9\xd1\x35\x2a\xd6\xa4\x8f\x76\xa5\xf7\xbb\x66\x85\x7e\x66\x7b" - "\x80\x7d\x5c\x15\x2d\x76\x15\xf6\x8e\x0d\x57\x84\xc7\xae\xc2\xaf" - "\x51\x47\x8f\x5e\xc7\x91\xff\x66\x1d\x47\x2e\x57\x07\x74\xc3\x0d" - "\xa7\xe9\xed\x59\x57\x3e\x77\x7c\xdb\x2e\x79\xa5\xe2\x94\x5f\xe9" - "\xcc\xdf\x7c\x12\xc6\xfc\x2d\x64\x11\x24\xbf\x3b\x65\xa2\x72\x8e" - "\xbb\x19\xaa\xf8\x83\xa7\xd9\xd9\x4d\x9e\x25\x7f\xa1\x36\x7a\x5b" - "\xc6\xba\x6b\x86\x9e\x11\xeb\x12\x73\x7a\xd6\xb6\xcf\xe8\x31\xed" - "\xda\xc6\xf4\xde\x82\x7e\xd8\x1c\xc1\x67\x2d\x81\xbf\x90\xb7\x80" - "\xd7\x57\x8f\xf2\xba\x76\x8e\x48\xc6\x5c\x05\xba\x01\x36\x7a\x58" - "\xd2\x03\xf6\x8b\x9a\x6f\x75\xb4\xcb\xf9\x96\x5f\x9e\x4f\x1c\x28" - "\xe3\x69\xba\x17\x06\x78\xed\x3b\xdc\x93\x67\xef\x72\xd3\x0c\x8e" - "\xb3\xc9\xeb\xce\xc2\xb2\x37\x30\x3d\x94\x28\xe4\x7c\x0a\xb6\x3f" - "\xc7\xd9\xf4\x06\x7c\x14\x86\x1d\x5d\x7b\x91\xd2\x6b\x61\x7b\x42" - "\x67\xa7\xb1\x5e\xaf\xd7\x63\x6d\xae\xbf\xd8\x17\x6b\xb3\x8e\xd7" - "\x7a\x5a\x71\x7f\x91\xcc\xe1\xca\x8e\xf6\xcd\x17\x29\x63\xcb\x12" - "\xca\xdc\xcc\x6b\x79\x7f\x57\xb6\x0f\xdb\x15\x32\xee\xe6\xc2\x4c" - "\x5e\xcf\xef\xb3\x7d\x96\x72\x5c\xe0\x5e\xbd\x65\x96\x6b\x20\x57" - "\x44\xef\xdf\xc8\x71\x30\x54\x71\xca\x1e\x4a\x4d\xda\x0d\xda\x61" - "\x2c\x7b\xbb\x11\xf4\xcb\x89\xd7\xb7\x86\x1f\xd6\xa6\x88\x58\xa9" - "\x87\x32\x94\x7e\xf7\xd1\x3b\x96\xfe\x78\x22\xbc\x39\x8f\x46\x77" - "\x50\x96\xf2\x69\x48\xc6\x98\xf8\x4e\x11\xef\x9f\x97\x3d\x43\xb6" - "\xf0\xe6\xd9\x09\xae\x5f\x51\x22\x7f\xe7\x9c\x7f\x65\xff\x10\xed" - "\xa3\x8b\x28\x8b\xf7\x1f\xd8\xef\xc1\xbe\x42\xe6\x1f\x97\x51\x4a" - "\x59\x91\xb0\x73\x95\x63\xd4\x5d\xf6\xc9\x0b\x9e\x5c\xf8\x4c\xf1" - "\x9c\x92\xf9\x4f\xcc\x2f\x9a\x5f\xb2\x4c\x86\x50\x18\x29\xff\xdd" - "\x3b\xa2\x70\x96\xdc\x74\x8e\xb0\x2f\x32\xfa\xd6\xe3\xde\xb9\x10" - "\xe2\xf5\x83\x2b\xa2\xd7\x3b\x52\xff\xd5\xc2\x96\xaa\x95\xbe\x3b" - "\xbb\x2d\xbe\x84\x0f\xe5\x98\xb5\x0e\x69\xeb\x74\x1f\x9b\x93\x7a" - "\x3e\x6d\x5d\x62\x35\xf8\x78\xec\x09\xfa\x6d\x88\xf7\x43\xd0\x57" - "\x3e\x6f\xe9\x69\x9e\x4b\x8e\xe5\x35\xfe\x66\x5e\xcb\x58\xc4\xf9" - "\x77\xaf\x64\x1f\x06\xf6\x87\x02\x1f\x6e\x3b\xa1\x3f\xeb\xdf\x4c" - "\xdf\x1c\x5a\x68\xdb\x16\x3a\x67\xdb\x21\x44\xde\xeb\x62\xa1\x63" - "\xb3\x38\xe7\x78\x3d\x22\xfe\xdb\x55\x28\xff\x4b\xc8\xc9\x0f\xf0" - "\xbb\x5e\x54\xec\xa8\x80\xfc\x0d\x3b\x4d\xbb\xb7\x33\x0e\x53\x1d" - "\xe2\x5c\x5f\x2c\x84\xdd\xef\xe3\xb9\x07\x3f\x4d\x54\xec\x6c\x88" - "\xd8\x5f\xe3\x77\x9f\x71\xfe\xe2\x79\xec\x13\xb6\xfb\x0c\xe3\x25" - "\xd6\xee\xdc\xe9\x77\x39\x12\x91\x3f\xac\xf0\x7c\x37\xd9\xbb\xa6" - "\x85\xec\x4f\xc8\x7b\x8b\xe7\x29\xb6\xe7\xde\xfd\x95\x30\xb9\x04" - "\xef\xc1\x79\xdb\x43\xa4\xce\xab\xbd\xe3\x64\x1f\x84\x3a\xd8\xdb" - "\xb5\x83\x29\xad\x7a\x30\xa5\x76\xb9\xdf\x1d\xd3\xeb\x7f\x61\x51" - "\xe3\x2d\x8f\x79\x1c\x3b\x1b\xfa\xa8\x8b\xc7\x4f\xc6\x83\x79\x18" - "\x30\x0b\x78\x7f\x4e\x9d\x8f\x7a\xb7\x08\xb6\xa5\xed\xca\xf5\xf1" - "\xbb\xf2\x7b\x2a\xa3\xd7\x51\x01\xaf\x69\xf3\xbe\x33\xc7\x96\x86" - "\xbc\xb6\xab\xf9\xc6\x6f\x3f\x95\xfb\xea\xd0\x29\xbc\x5f\x52\x5f" - "\x06\x3b\xc1\xb2\xb7\x83\xed\x9b\x90\x9b\xca\x79\x6f\x53\xbb\x78" - "\x66\x37\xef\x47\xcb\xb3\x85\x32\x26\xfb\x9f\xa8\xfe\x02\x99\xdb" - "\xe8\x5d\xfe\x56\x77\x5a\x1f\x5d\x7f\xfb\x43\x86\x21\xd6\x6e\xb7" - "\x5b\x4b\x4d\x15\x0c\x43\xbb\x78\x36\xdb\x28\x07\xda\x0d\xe0\x72" - "\xe0\x83\x1b\x64\x39\xce\x2b\x63\xa2\xa4\xcd\x86\xcd\x67\x97\x75" - "\xaa\xe7\x19\x02\x72\x18\xba\x18\xde\x8d\xfb\x59\x4c\x27\x5c\xf3" - "\xe4\xda\x2f\xe6\xeb\x32\x16\x8f\xe5\xe3\xdd\x5e\xdf\x29\x8f\xc4" - "\x87\x7d\x71\x4b\xa0\xb3\xa4\x3d\xf8\xdb\x67\xeb\xbe\x20\x73\xf1" - "\x53\xdc\x7f\xbf\x93\xeb\xfe\xe0\xa7\x06\x85\xdf\xef\x92\x3a\xd7" - "\xbe\x5d\xd0\x69\x39\xe5\x0b\x98\x2c\x74\xd8\x16\x64\x5d\x59\x7d" - "\xd8\xd6\x8d\xf1\xee\xb7\x4d\x3e\xd3\xb6\x6a\x65\x8b\xa8\x72\xbc" - "\x4f\x0c\x3b\xb5\x3d\xd1\x96\xe6\xc2\xfb\x0e\xc3\xef\x02\x36\x69" - "\xfb\x7a\xbc\x03\x6d\x1b\x99\x6e\x3e\xda\x9d\xd3\x52\xa4\xce\x66" - "\xe0\xf9\x2a\x3e\x6f\x2f\x69\xbd\xfa\xe9\x76\xeb\x2a\x0f\x9f\xff" - "\xcc\xb6\x86\x72\x4c\xbc\x0f\xcc\xe7\xfe\x39\x16\x02\x9f\xfd\xe7" - "\xb5\x3c\xfd\x7d\x56\xcc\xfb\x91\xc6\xfb\x2e\xf7\xef\x0a\x8d\x33" - "\xfb\x1c\x53\x89\x7d\x0c\xc2\xba\xaf\xa0\x8c\x35\x74\x5e\xed\xa3" - "\xb2\xaf\x20\xaf\x23\xf2\x99\x47\xde\xeb\x44\xb9\xda\x5e\xdf\x4d" - "\x79\xd6\xe7\x77\xbb\x0c\xdf\x28\xdc\xef\xef\xf5\xeb\x01\x2d\x3a" - "\x2b\x4e\xb5\x06\x52\x13\xab\x03\x15\xa7\x6c\x78\x77\x0c\xfa\xb0" - "\xdf\x58\x44\x72\xee\xc7\x31\x99\x9f\x23\x93\x96\xb2\x8f\xe7\x05" - "\xa6\xc3\x01\xd2\xcf\x39\xef\xb9\x53\x3f\x13\x9f\x78\x96\x7e\xf7" - "\x8f\xbe\x3d\xc7\xb0\xbe\x5e\xb6\x67\xb6\xb2\xd7\xf6\xcc\x96\xeb" - "\x65\x6b\x4f\x79\xde\x58\x1e\x34\xed\x5e\xee\x33\xa9\xb3\x0f\x7b" - "\x66\xf8\xe8\xc0\x1a\xc3\x6f\x05\xf9\xd2\xfa\x8b\xbd\x26\x2a\x3e" - "\xe8\x50\x30\xf7\xca\xf5\xc4\xbe\xf9\xcf\x5e\xe9\x1b\xc4\xfb\x83" - "\x1a\x8f\x95\x29\x7f\x38\x2a\x7d\x30\x8a\xcf\xf3\xba\xd9\x55\x6a" - "\x2e\xb6\x57\xff\x96\x94\xf4\xf5\xbc\xf6\x74\xf4\xf3\x60\x7e\x56" - "\x34\xdb\xe3\x33\xd6\xe0\x37\x98\x34\x8e\xcb\x2d\x5c\x5b\x45\xc0" - "\x5b\x1c\x20\xd8\x61\x7e\x2f\xc6\x5e\xd4\x21\x8a\x17\x71\xdc\xfc" - "\xbd\xd7\x31\xed\x95\x4c\xed\xad\x94\x38\xb9\xef\x16\x2e\xb6\x3f" - "\xfd\xec\x03\x72\x9e\x90\xef\x1a\xe4\x1b\xdf\x58\xda\x01\x1d\xb8" - "\xd7\xc7\x31\x0f\xdb\xf4\xba\xfd\xc9\x1f\x74\x7c\x27\x95\x0a\xba" - "\xdc\x7b\x61\xff\xbf\x90\x73\xe5\x72\xbe\x77\xd6\xe5\x6c\x11\x35" - "\x36\xe6\x50\x7f\xf3\x19\x9e\xaf\xde\x86\xfa\xa7\x0a\xc6\x7f\xdf" - "\xf8\x90\x29\x48\x3d\xa6\x01\xe2\xbb\xe5\x4e\xe8\x81\x01\x22\xbc" - "\x1c\xfd\xd5\x69\x83\xbd\xdb\x44\x2d\xa1\x46\xe9\x23\x02\x19\xb6" - "\x96\x05\xc4\x79\x6f\x68\x8f\xf4\xef\x55\xe7\xe0\xf7\xfd\xd0\x1b" - "\xfa\x90\x5a\x8a\xfd\xe4\x59\xf4\x17\x8c\x59\xfb\x46\x30\x5e\xb7" - "\x15\x97\xd3\xa8\xb3\xfc\x7e\x6f\x9b\x1a\x27\xf7\xe5\xe8\xd7\x34" - "\x8e\x8d\x19\x89\xd3\xbd\xcf\x2d\x78\xb2\x64\xfe\xc2\x05\xa3\xa6" - "\xcc\x5d\x32\xb7\xc8\xfe\xa0\x72\xb9\x8b\x1a\xbf\x2c\x7d\xf1\xbf" - "\xdf\x4b\xe5\x31\x85\x6d\x15\x8e\x03\x7e\xb9\x18\xe0\x46\xfc\x6f" - "\xd8\x0d\x19\xbc\xbe\xf7\xbf\x19\x03\xdc\xb0\x45\x38\xfe\x77\xdf" - "\x5a\xf7\x7b\x4d\xbd\x32\xa0\x1d\xec\xe2\x67\x3e\xfb\xa9\xb9\xf7" - "\x4d\x61\x39\xaa\x93\xfe\x69\xef\x4d\x8c\x8c\x95\xc4\xbe\x78\xbc" - "\x3e\x82\xf4\xd9\xc6\x39\x5b\xf0\x22\xc6\x8d\xf7\x8a\xfa\xce\xfd" - "\xbc\xe7\x44\x7f\xab\x77\x16\x99\xb7\xc2\xd8\x13\xd6\xbf\xbb\x26" - "\xf7\xb0\x35\x77\x4f\x8e\x5a\x87\x79\x6f\x7d\x9d\x36\xc0\xa2\xf6" - "\x00\xde\xdb\x63\x9c\x29\x53\xb2\x79\x50\x97\xcd\xf7\x9a\x2e\xb7" - "\x6f\xdf\x27\x1b\xfb\x2d\x7d\x72\xfd\x37\xbd\xec\x7e\xcb\x57\xed" - "\xf9\xeb\xf6\xf0\x75\xa7\xe9\xf7\x37\xf0\xda\x0c\xee\xbf\x8d\xfb" - "\x24\x39\xd6\x4a\xff\xfa\xf7\x3f\xd7\xef\x51\xc7\xfb\x7f\xd4\xef" - "\xbf\x89\xfb\x77\xf5\xfb\xa1\xb8\x7f\x4d\xbf\x87\xcc\xbe\xbf\x4a" - "\xbf\x4f\xc7\xfd\x7c\xfd\x1e\x3a\xff\xfd\x07\xf4\xfb\x21\xb8\xff" - "\xa1\x7e\xff\x0d\xdc\x0f\xd7\xef\x21\x83\xef\x27\xeb\xfb\xa7\x16" - "\xe0\x7e\xe1\xca\xed\xf3\xfd\x1e\xb5\x47\xf7\x3e\xc1\x16\xda\xa6" - "\xc6\x8c\xde\xb4\x74\xf0\x74\xa1\x41\x5f\xa4\xef\xe7\x7a\x90\x3e" - "\xd2\x47\xdb\xdb\x22\xd2\x1b\xf4\xfc\x13\x31\xde\xf8\x22\xd2\x6b" - "\xf5\xf4\xd9\xb0\x41\x2d\x11\xe9\xd5\x7a\x7a\x09\xf4\xa2\x23\x22" - "\x5d\x8f\xeb\xf0\xfe\x3a\x1f\x6d\xb5\x45\xa4\x3b\xf5\xf4\x6d\x86" - "\xbf\x82\x9e\x5e\xa4\xa7\x1f\x40\xfa\x91\x88\xf4\x02\x3d\x1d\xfa" - "\xff\xbd\xd6\x88\x74\xb5\xae\x20\xcf\xa2\x59\xc5\xe1\x52\x96\xad" - "\xf7\x83\x3e\xda\xb2\x3f\x22\x4f\xae\x2a\xfb\xfb\x34\x1f\xd5\x46" - "\xb6\x65\xac\x9e\x9e\xe9\xa3\xbf\x6f\x8d\x48\xcf\xea\x4f\x57\x25" - "\xd4\x50\x41\x7f\x6b\x98\xfc\x9d\x2a\xe9\x27\x29\x6d\xcb\x0f\xe6" - "\xf2\x39\x35\xeb\x16\x71\xc2\x5e\x26\xc4\x09\xfa\x60\x8a\xf2\x0f" - "\xdc\x7b\x9c\xfd\xb5\xd4\x79\xbf\x0f\xc6\xc8\x33\x60\xec\x73\xce" - "\x67\x00\x97\x73\xda\xef\x65\xec\x93\xd1\xce\x72\x15\x93\x53\xf9" - "\x9f\x76\xc8\xb9\xbc\xbe\xcf\x89\x3c\x9f\xf3\xda\x26\xc3\xe1\xf5" - "\x3e\x6f\x49\xb7\xf4\x89\xe4\xb9\x14\xa7\xf1\x9c\x56\x9e\x0b\x8b" - "\x98\x53\x29\xbd\xff\xc1\x5c\x8d\xcf\xed\xbb\xd5\xbc\x9f\x65\x91" - "\xf3\xb3\x6f\x4e\x64\x5e\x1f\x7d\x20\xe7\xa6\x89\xb6\x6b\xfe\xad" - "\xcb\xfd\xc1\xc4\xbe\xb3\x4a\xbf\xaf\xd5\xd3\x3f\x45\xfa\xec\x88" - "\xf4\x8a\xfe\x75\x3b\xf4\x9d\x65\xbb\xa3\xe7\xa2\x08\x84\x2e\x8a" - "\xe0\x86\xff\x00\xde\xf3\xe4\xb9\x9b\x6f\x85\x2b\xb6\x3b\xf5\x18" - "\x18\x9f\x87\x96\x08\x3f\x74\x36\x7f\x63\xe2\xea\x69\x01\x3f\x4d" - "\x2b\xee\x12\xeb\x9f\x60\x3f\xbb\x0b\x32\x1e\x94\xab\x83\xe3\x6f" - "\xb3\xef\x56\x80\xf7\x87\x52\x5b\x30\xc6\xd5\xcd\xe3\xf7\x9f\xd1" - "\x54\x87\x9f\x9a\x1d\x61\xaa\x03\xec\x2d\x4f\x18\x7e\x93\x1f\xf4" - "\xc6\xff\x61\x1c\xb8\x3e\x97\xfc\x56\xcc\x81\x51\x8c\x2b\x7f\x0b" - "\x4f\xac\x4f\xf2\x88\x8f\xd9\x96\x3d\xe9\xb3\xae\x22\x3b\xc6\xf6" - "\x6c\xdc\x1f\x95\x3f\x7e\x87\xf4\xfe\xda\xa4\x64\xf9\x80\xee\x8f" - "\xb9\xbd\x5d\xe9\x8b\x03\x25\xe2\x5f\xf8\xdc\xd1\x01\x3e\xff\xb4" - "\x1f\x76\x73\x5c\xff\xab\x95\x5b\xc8\xd4\xb3\x16\xb6\xc9\xd9\xfd" - "\x26\xa5\x9f\x3e\x2c\xd4\x4c\x96\x55\xbc\xae\x28\xbf\x13\xb1\x76" - "\x5f\xe6\xae\x05\x41\x53\xf3\xf2\x36\x5a\xf1\x0d\xb2\xcd\x0e\xb2" - "\x2f\xf9\x81\x2f\x06\x95\x70\x2c\xae\x53\x1e\xd8\xa1\xa6\xdf\xe1" - "\xfd\x47\x0b\xf6\x9b\x42\xd2\x5e\xf9\xb0\x50\xae\x45\x55\xec\x65" - "\xbf\x33\xab\xb7\x35\xcc\x67\x8f\xa4\x9d\x0c\xfd\x6f\x09\x2f\x75" - "\x0c\x0e\x2d\x76\x5c\xbd\x65\x11\xa5\x86\x17\x67\xa6\x6f\xbc\x48" - "\xd9\xc6\xf8\x83\x39\x6c\x96\xe8\xb2\xa5\x54\x61\x4c\xe1\x39\xee" - "\xa0\x84\x34\xb9\xe7\xc6\xf7\x9a\xe9\x8d\x8c\xba\x25\x97\xff\xe6" - "\x4d\x18\x73\x5b\x8e\x3d\xcd\xb8\xc4\x6b\xeb\xba\xd7\x31\x5f\xd6" - "\xcf\xc9\x96\x7d\x41\x43\x30\x6f\x31\x0d\xba\x20\x3c\xa7\x8b\xc8" - "\xc4\xdf\x09\x29\x9b\x2b\xd7\x91\x92\x9a\x1d\x21\xf2\x3a\xff\x4a" - "\x65\x8b\xb8\x8f\x3e\x7c\x9f\xed\x34\xf6\x9b\x44\xfe\xb4\xd3\xf4" - "\xe1\x1f\xad\x41\x8c\x19\x41\xd8\xd2\x4f\xf1\x9c\xf0\xc3\xcf\x02" - "\x32\xf6\xed\x47\x76\xf6\x1d\xf7\x2c\xba\x87\xd3\xbe\x74\x7d\x21" - "\xbf\xf9\xeb\x53\xb2\xf5\xe1\x31\x7e\x76\xf1\xb9\xdd\x94\x0f\x32" - "\x7e\xd3\x1d\x4c\x52\x6b\x15\x1f\x7e\xaa\x8f\x0f\xbb\xd5\xfc\xeb" - "\xc3\x63\xfd\xf1\xae\x56\xf1\x66\x85\xf8\xff\xd8\xfb\x1e\xb8\x28" - "\xab\xac\xff\x3b\xc3\xa0\x83\x0e\x30\x1a\xd5\x68\x68\x53\xd9\x36" - "\xb6\x66\xd4\xda\xfe\xd8\x5e\xdb\xa8\x74\x5f\xb7\xb5\x90\x56\x5d" - "\x7a\xb3\xc4\x02\x1b\xcb\x3f\x13\x21\xa2\x21\x20\xba\x38\x20\xff" - "\xdc\xb5\x7d\xb1\x90\xd8\xf7\xd5\xfd\xe1\xae\x6d\xec\xfb\x33\x97" - "\x36\x4c\x2c\xdd\xb0\x80\x41\xc3\xc2\xc2\x9c\x08\x71\x34\xb4\x11" - "\x47\x19\x61\xe6\xb9\xbf\x73\xee\x7d\x1e\x66\x06\x18\x18\x46\xfc" - "\xd3\xbe\xf2\xf9\x3c\x9f\xe1\xb9\xcf\x7d\xee\x73\xef\x39\xdf\x7b" - "\xce\xb9\xff\xce\x41\xdf\xe8\xc5\x0e\xf2\xa4\x8d\x9a\xd9\x7a\x26" - "\xfa\x2b\x48\x79\xb8\x8a\x5e\x28\x24\xfc\x8c\xdd\x07\x9b\x85\xec" - "\xed\x46\xee\xaf\xf2\x83\x8d\x84\xef\x45\x02\x1d\xb9\xbd\x88\xcf" - "\xe5\x6e\x2f\xe3\x73\x9b\xdb\x2b\xd6\x8e\xc5\xbd\xca\x1f\x14\x9d" - "\x0b\xda\x5e\x0d\xbf\x8b\xcf\x8d\xd8\x53\xe4\x5d\x1f\xfd\xa9\x42" - "\x3b\x9e\x84\xe1\x9c\x3a\xee\x3b\x7e\x8b\xef\x37\x86\x6f\xec\x29" - "\xa6\xd9\xec\xd9\xad\xcd\x06\x12\xc0\xc7\x7b\x1f\x9c\xbc\xb7\x98" - "\x68\xa1\xae\xc1\x54\xb9\x5d\xcf\xf6\x78\x19\xb7\xa7\x98\xda\x68" - "\x15\xee\x2d\xe4\x6b\x1f\x7b\xca\x68\xd0\x76\x3d\xcf\xbf\xe7\x67" - "\x75\x6d\xd0\x06\xe5\xf6\x48\x93\xfd\xb4\x68\x13\xee\x01\xec\x6f" - "\x8f\xa4\xc6\xed\x33\xf8\xf9\xf7\x3d\xd9\x92\x5c\xe5\x18\xdd\xb3" - "\x9a\xd3\xed\x4f\x15\x9c\x6e\x7b\xca\x44\x7d\x75\x2b\xfe\x0f\xba" - "\x3b\x82\xaf\xd5\xef\x49\x92\x6c\x64\xb3\x98\x07\xdf\x81\xff\x63" - "\xb9\xac\xdd\xb3\x09\xda\x2e\x9e\x61\xd8\xc3\xd6\x0b\xa1\x7d\xa0" - "\xb3\x3e\xa8\xc7\x76\x79\x93\xad\x8c\x16\xa9\x24\x00\xea\x1c\x8b" - "\x7b\x4a\xd1\x4e\x31\xd9\x1e\xae\xe2\xb1\x2c\xf7\xde\xc7\xce\x01" - "\xc3\x77\x80\x3f\x72\x94\x9b\x78\x6e\x19\xcb\x73\xd5\xbf\xea\x46" - "\xa9\x2e\xf8\x3d\x7c\x06\x6d\xc5\x7d\x75\x48\xab\x19\x98\x07\xf9" - "\xda\x6a\xc0\x39\x8e\xf3\x40\x33\xdc\x2f\xb4\x37\x0a\x69\xc2\x69" - "\xb6\xb7\x3b\xe6\x39\xa7\xd7\xde\x51\x9e\xf4\xe0\xf7\x82\x12\x64" - "\x43\x22\xee\x1b\xd9\x1b\x25\xd2\x4f\x1c\x07\x54\xb1\x38\x9c\xfc" - "\x59\xd5\x36\xb7\x77\xc7\x75\xe7\xe5\x71\x53\xe5\xb8\x06\x8b\x73" - "\xf2\x1c\xaf\x55\xf5\x6e\xef\xd5\xcf\x3f\x8b\x36\xf2\xb6\x48\x8c" - "\x73\x89\x34\xef\xc8\xac\x6a\x71\xd1\x9b\x97\xd3\xc7\x37\xc6\x4b" - "\xdf\x30\x93\xaa\xad\x52\x3d\xe1\x7f\x51\x07\xef\xd5\xb9\x78\x52" - "\x35\x43\x7a\xaf\x84\x9d\x25\xda\x63\xc3\x33\x90\x7d\xca\x41\x5c" - "\xfb\x01\xaa\xd4\x39\x1e\xae\x62\x78\x24\x7b\x4b\x71\x4f\x2c\xd0" - "\x35\x96\x63\x68\xef\x3a\xae\x0b\xf7\x96\x62\x99\xb8\xae\xc2\xfd" - "\x9d\xee\x2d\x82\x72\xc5\x58\xdd\x7b\x77\x88\x75\x80\xf1\xdf\x07" - "\x5b\x7b\x8e\xeb\x1e\x5d\x10\xcf\x0e\xfb\xde\xb3\xdc\xd0\xf3\x5c" - "\x91\xd2\x75\xae\x73\xaf\xc5\x75\x2e\xb6\x52\xcd\xe9\xfd\xe1\x14" - "\x18\xa7\xee\xcc\xe7\x7e\x71\x2b\xf2\x81\x67\xe9\xe7\xc9\x58\x8c" - "\x0f\x93\x66\xa0\xa7\xea\x0c\x30\xb6\x56\xee\x9a\x46\x8d\xbb\x66" - "\xa4\x9d\x27\x23\x70\xcf\x05\xca\x1b\x9c\xef\xa1\x41\x90\x9e\xbd" - "\x6b\x86\xeb\xec\xdd\x3e\x33\x8c\x6d\xcb\xf2\x60\x2c\x9b\x7e\x9a" - "\x8c\xe5\x7b\x28\x3e\x94\xe6\x7d\xde\x10\x8c\xbb\x66\xe2\xb9\xce" - "\x3a\x18\x11\xd2\x74\xfd\x1b\x42\xf6\xae\x99\x50\xee\xbc\xf4\x25" - "\x64\x34\xea\x37\xdc\xab\xcb\x31\xb3\x0f\x74\xca\xae\x79\xe8\x73" - "\x4d\xa0\xb1\x32\xf8\x7e\xa9\xa0\x7c\xdf\x92\x27\x10\xb6\x47\x1c" - "\x70\x26\x6f\x26\x1f\xee\x85\xef\x97\x62\xdc\x4a\x9c\xf3\x31\xd9" - "\xed\xe8\x17\xa2\x14\x9e\x85\xc0\x33\x9c\xef\x11\xd0\xff\x1a\xfa" - "\x73\x87\xf2\x35\x58\x3e\x7c\xab\x94\xd7\x9d\xf9\x45\x29\x6d\x26" - "\x1f\xdd\x86\x79\x24\xbf\x6e\x42\x7a\x6c\x00\x3e\xc7\x73\xc2\x4e" - "\x8c\x8b\x00\xd6\x39\x7f\xa7\xb1\xfb\x1d\xd1\x7e\x86\xbe\xbc\xef" - "\x3d\x9a\xb3\xa7\x1c\xf2\x56\xe0\x9e\x54\x6e\xcb\xee\xdb\x29\xf6" - "\x75\xb0\x8f\xf7\xbd\x2b\xfe\xaf\xea\xce\x9b\x1e\x4b\xd2\x2e\x12" - "\x0d\x5b\x57\x5d\x11\x00\xb2\x77\x9f\x0a\x63\x2c\xb8\x95\xf9\x0d" - "\x96\x97\x8b\xfe\xe2\x12\x88\x0a\xe4\xf2\x48\xa8\x37\xc6\x47\xf9" - "\x06\xe7\x6a\x45\xda\x98\x81\x4f\xe5\x05\xdc\x27\xe0\xce\x3c\xc0" - "\x7e\xda\x6a\xb0\x07\x56\x13\xd5\x6a\x27\x09\xc7\x76\x02\xdf\x2c" - "\xb8\xaf\x1a\xc7\x6e\x48\x1b\x91\x87\x95\xd0\x96\x7d\xab\xf5\xb4" - "\x65\x75\x1b\xb5\xd4\xea\x1b\x09\xe8\x99\xd1\x75\x86\x7a\xf4\x4d" - "\xfe\x0d\xb6\x15\xe7\x28\x81\xa6\x60\x4f\xc2\x37\xb2\x77\xed\xc3" - "\xb3\x32\x6c\x9e\x40\xbe\xb7\x42\x3a\x57\x54\xc2\xce\x1e\xed\x8b" - "\xe8\x9e\xfb\x4a\xa6\xfb\xc4\xba\x54\x0b\xf8\x7f\x32\x3b\x9f\x38" - "\x02\xc7\x3f\x38\xa7\x31\x7f\x65\x69\xf7\x19\x0d\x3e\x37\xb0\x6f" - "\xb1\x9b\x5f\x2e\xf6\x2e\xce\x11\xe0\xbb\xd1\x0e\x7a\xbe\x40\xcc" - "\x8b\xef\x46\xaf\x9c\x4f\xf1\x5d\x78\xa7\xb4\xfb\x1d\x8f\x33\x3e" - "\x1f\x71\xbb\x02\x68\x8b\xff\x5b\x81\x96\xe2\x1e\x2a\x2d\x5f\xff" - "\xde\xd7\x28\xad\x39\x9b\xc9\x87\x85\x88\xa7\xbe\xfd\x89\xef\x27" - "\x9e\x3e\x92\xf6\xd7\xa3\xff\x26\x48\xd7\x48\xbe\x8c\xe0\xff\x09" - "\x50\x16\xb7\xb3\xdd\x7c\x94\xe5\xbb\xf9\x3b\x4c\xb7\xd2\x6f\x11" - "\x27\x20\x57\x02\x4e\x91\xfd\x06\x9a\xfd\xbe\x85\x9f\x93\xda\xbf" - "\x17\xeb\xd9\x4c\xf6\xe3\xfc\x5a\x28\xf7\xa5\xb0\x7f\x8d\x28\x3f" - "\x1a\xa3\x9d\x8e\x50\x33\x7c\x13\xcf\xfc\xb8\xdd\xa3\xef\x31\x35" - "\xe4\xfb\x1b\xf7\x07\xb8\xdf\xd0\x23\x3f\x3e\xcf\xe8\x71\x1f\xd5" - "\xe3\x5e\x6b\x83\x7e\xe3\x6d\x6d\x3d\x6f\x2c\x9b\x3f\x74\x84\xac" - "\x21\x86\xf4\x93\x24\x00\xb0\x72\x1c\xeb\x56\x67\x69\xc3\x36\x85" - "\xd2\xcc\x08\x82\x73\xa0\xcc\xb6\x04\x9d\xde\x3c\x01\xf2\x9c\x24" - "\x37\xe1\xbe\x6f\x8c\x91\x02\xf9\x4f\x71\x3f\xe6\x1f\x3f\x3d\x6f" - "\xf9\x08\x22\xbc\x18\x3b\x92\xca\x63\x8a\x70\x6d\xef\xed\x4e\x73" - "\x20\xae\x73\xa5\x6d\x06\x4c\x3a\xc9\x4d\x80\xb1\x16\x8c\x47\x07" - "\xef\xb4\xfd\x77\xa7\x25\xd0\xe4\xf8\x92\x18\x5e\x22\xf2\x53\xe4" - "\xe3\x99\x8a\x54\xa2\x28\x68\x25\xe8\xbb\xdb\xf1\x91\x23\x92\x48" - "\xbe\x10\x8a\x47\xf3\x73\xdc\xc5\x20\x5f\x5f\xd5\x50\x7b\x47\xe6" - "\x3f\xcb\x60\xec\xb5\x49\x1a\x63\xe7\xf2\x38\x28\x0a\xf8\xfe\x8d" - "\x72\xd1\xef\x03\xa7\xed\x3f\x8f\xf3\x73\x56\x61\x2f\xc2\x3b\x4d" - "\x2e\xfb\xfb\x63\x1e\x6b\xdc\x58\xa9\xe2\xb2\xef\x63\xfd\x47\x60" - "\xc1\xaf\xe3\x7b\x14\xc2\x3a\x32\x3f\x56\x76\xef\x51\x60\xf3\x56" - "\x1f\xeb\x69\x76\xa5\x8a\xdb\xe6\x95\xaa\xf9\x4e\xa5\xd8\x07\x31" - "\x7d\x5b\x24\xbe\x0b\xef\x85\xda\xd8\x1c\xd3\xc7\xd3\x5c\x58\xfb" - "\x98\x9d\x33\x82\x36\xa9\xcc\xe4\x9f\x19\xd8\x2e\xa4\x09\xe4\x53" - "\xc0\xfd\xba\x8f\xb6\x7a\xf1\x0b\xab\xdc\x66\x71\xb0\x39\x90\x13" - "\x15\x80\xa7\xd3\xc0\x83\x1b\xd0\xf7\x93\x09\xbe\x53\x5b\xd2\x49" - "\x6a\x35\xe7\x48\x1d\xfc\x8f\x7b\x91\xab\x5e\xfa\x96\xb4\x68\xfb" - "\xd6\x37\xa0\xb3\xf4\x50\xe7\x14\x2c\x0b\x65\x01\xee\xdf\x32\xa5" - "\x82\xfe\xb1\x42\x59\x2d\x84\x95\x51\x2b\x58\x48\x6d\x0a\x8c\xb3" - "\x72\x03\xab\xea\x4a\xbe\x24\x75\x9a\xcf\xd8\x77\xd0\x26\xac\x4a" - "\x3c\xd7\x5f\xd9\x46\x28\xbb\x48\x2c\xbb\x0d\xca\x0e\xf3\x5a\xb6" - "\xb1\xd5\x3c\xc8\xb2\x7d\xaf\xb7\xb1\xb5\x7e\x30\x65\x83\xbd\xdb" - "\x86\x71\x6e\xf0\x5c\x57\xda\x18\x12\xec\xbc\x80\x7e\x3f\x6f\xa5" - "\x7c\x3f\xec\x81\x87\xd8\xd9\x2f\x5c\xab\xcd\x7e\xd7\xc2\xce\x80" - "\x9d\x21\x6c\x4f\x23\x3f\xf7\x75\x9c\xe0\x7e\x88\x8e\xcc\x03\x3a" - "\xd7\x58\xa9\x7b\x9d\x0a\x6c\xd5\x03\x33\xf9\xbe\xc7\x77\xc5\xb5" - "\x87\x03\xe8\x37\xd2\xcb\x38\xef\xef\x61\x7c\xff\xec\x81\xdf\x4a" - "\xf3\x2f\xe7\x82\xfe\x1e\x26\x96\xa5\xed\x39\xaf\x27\x05\xa4\x4d" - "\x48\x49\x92\x62\xdb\x26\x89\xc7\x4f\x9f\x4a\x78\x21\x61\x51\x72" - "\x42\xbc\x76\xf6\xf2\xc4\xa5\xf7\x2c\x5b\xb8\x50\xfb\x44\xc2\xab" - "\xaf\x2e\x78\x31\x61\x04\x99\x9d\xb8\x60\xe9\xab\x8b\x70\xee\x4d" - "\xab\x9d\xf6\x93\xf9\xfa\x65\x49\xf7\xfc\x7c\x5a\x44\x8f\xb9\x37" - "\x3c\xab\xd8\x84\x36\x38\xe8\x8e\x9b\xd2\x9c\x64\x14\xfa\xf1\x09" - "\x5d\x49\xab\x5e\x83\xf1\x1f\xe0\xef\x14\xea\x29\xd4\x0d\x38\x36" - "\x40\x1f\x82\x20\xbf\x6b\xde\xfc\x03\xad\x6f\x25\x5f\x39\xc1\xae" - "\x6c\x7c\x8b\xfb\xc3\x6b\x82\x31\xb9\x95\xc7\x5b\xfc\xea\x08\xfa" - "\xba\xdb\x00\x69\xd6\xa0\x4a\x55\xc1\xd7\x44\x01\x7a\x0d\xc6\x25" - "\x9f\x14\x51\xf9\x70\x9a\x7b\x13\xdd\x47\xbf\xd5\x10\xd1\x87\xb8" - "\xdc\x64\xb6\xe3\x7a\xbe\x32\xda\x91\x4e\x51\x9e\xf2\xbe\xf5\xc9" - "\x66\x4e\x97\xed\x46\xbe\xaf\xf8\xab\xf7\x70\x0c\xb3\x96\xc5\xc3" - "\xfc\x04\xfa\xff\x6e\x83\x4b\x4e\x7f\xb6\x4f\xb4\x1d\x71\xbd\x7d" - "\x45\x33\xdc\x73\x3f\x23\x9f\x34\x78\xee\xd5\xa8\x01\xbd\xfc\x85" - "\x85\x5f\xf8\x4e\xa3\x92\x5f\xf8\xbf\xfb\xf5\x55\x31\xbf\x7a\xa6" - "\x5f\xea\x25\x7d\xdf\xdf\xf7\x1b\x52\xfb\xbf\x7c\xf9\x3e\xfe\x5e" - "\xcd\xf6\x5f\xca\xfb\x0d\xeb\xfa\xbb\x10\x6f\x80\xad\xa6\x0d\x5f" - "\x13\x25\xe0\x73\x53\xde\xf3\x80\xe9\xa3\x44\x93\xea\xa0\x2d\xe9" - "\xcf\x92\xf0\xb4\x93\x04\xe3\x11\x5a\x92\x52\x68\x4b\xda\x05\xb4" - "\x49\x1b\xe6\x00\x7e\x2b\xf2\x9b\x89\x2a\xaf\x99\xa8\xeb\x92\x30" - "\x56\x31\xfa\xfa\x02\x39\xd3\x06\x17\xdc\xd7\x24\xdb\xc9\xa7\xd6" - "\xb3\xb8\xbf\xa9\xaa\x2e\x0e\xe4\x4e\x13\x21\x88\x5f\x55\x1c\x09" - "\x2b\xbe\x89\x56\xd2\xcc\x65\xa0\xcf\x96\x61\x5c\xc2\x86\x77\x84" - "\xa8\xc0\x77\x56\x55\x07\x6a\x9f\x47\x1d\x5f\xfb\xb4\x88\xcd\xfd" - "\xfc\x4c\xd1\x67\xec\x3c\x03\xf4\x93\x06\x3e\xaf\xde\xf0\x08\xd7" - "\xe7\x0d\xa3\xc4\xf9\x26\xf8\xff\x33\x66\x2b\x42\x3b\x2a\x30\x7e" - "\x2b\x96\xf9\x57\xa1\x82\xc5\x6f\x7d\x67\x55\x54\x60\xea\x02\x22" - "\xaf\x33\x9f\x22\x18\xdb\x09\x63\x81\x42\xbf\xdb\x01\xfd\xac\x7c" - "\xcb\x4d\xb4\x10\xea\x97\x5b\x72\x13\x35\x42\x9d\xca\x3a\x32\x6b" - "\x61\xbc\xfc\x71\xa5\xb8\xee\x52\x05\xfd\x62\x47\x1e\xe4\x89\x5e" - "\x4e\x6e\xcd\x83\x7c\xf9\x90\x0f\xed\x64\x5e\xbf\x83\x79\x40\x83" - "\x9d\xf0\xcd\x7a\xed\x73\x78\x6f\x62\x7b\x6f\xf0\xdb\xd0\x0e\x6d" - "\x33\x31\x69\x40\xb7\x29\xf0\x1b\xd2\x77\x3b\x32\xeb\x40\xfe\x55" - "\x27\xb1\xb5\x33\x48\xe7\xe5\xd4\xcd\xe6\xfd\x75\xd7\xe2\x02\x57" - "\x7c\xdd\xc5\x79\xab\x40\xa7\x77\x32\x1f\x98\x9b\x70\xbe\x05\x6d" - "\x0c\x66\x57\x38\x49\x28\x9f\x1f\x00\xdb\x42\x0f\x72\x00\xec\x09" - "\xb6\x17\x1a\x6c\x09\xa8\xcb\x26\x8c\xf3\x88\xcf\x61\xdc\xb6\x13" - "\xf4\x72\x39\xda\x01\xcf\x9d\x7f\x9c\xe0\x1c\x3b\xc6\x68\x7d\x75" - "\x1e\xb5\xf3\x98\x39\x75\x3b\x25\x5b\x00\x65\x10\xea\x7f\xb0\x85" - "\x15\x5d\xc0\x43\xc0\x40\x35\xd8\x16\xa3\x4e\x31\xcd\xc1\x68\x5f" - "\xcd\x74\x7e\x32\xf3\xd9\x1c\xc0\x65\x74\x9d\x13\xda\xa7\x82\x6f" - "\x00\xcd\x9a\xd8\x5c\x38\x97\x31\x26\x95\xa4\xc7\x71\xcc\x6b\x86" - "\x32\x28\xc8\x32\xf1\x19\xb4\x7f\xbf\x14\xeb\x0e\xec\x8a\xba\x4a" - "\x91\x66\x35\x7c\x0d\xd9\xc4\xc6\xfe\x36\xb0\x15\x44\xda\x54\xa3" - "\x5d\x21\xbe\xdb\xbd\xff\x11\xc7\xe5\x02\xd8\x15\x48\x2f\xa4\x13" - "\x94\x53\x2d\xca\xb1\x06\x6e\xbf\x1c\x5c\x2e\xae\x5b\x16\x02\xaf" - "\xd7\xb9\xe8\x6f\x2a\x73\xa7\x3f\xbc\x2f\x8e\x1b\x0f\xde\xe6\xc6" - "\x3b\x18\x1b\xd5\xdb\x71\x9e\x14\xea\x58\xc9\xe7\x78\x4c\xdf\xa0" - "\xaf\x34\xf4\xcd\x0c\x34\xae\xcc\x45\x3f\xc0\x20\x9b\xd7\x7e\x4d" - "\x70\xed\x1b\xec\xa7\xfa\x6f\xb8\x7d\x5a\x9f\x81\x18\x86\x7b\x36" - "\x0f\xdf\x02\xf5\xc2\xf2\xe0\x3e\x06\x7e\xc1\x8e\xad\xff\xa5\x7b" - "\x3c\x65\x57\x2c\xe5\xfa\x28\xd7\x79\x04\xd3\x62\x3e\x7e\x36\x2d" - "\xc6\x39\x30\x96\xbf\x4b\x8f\x75\x6b\xc2\x7e\x29\xb5\x15\xe3\x2a" - "\x43\x3a\xda\xfe\x4d\xc8\x37\x29\x1d\x7d\x08\x03\x9f\x54\xf0\xad" - "\x23\x62\x9d\x76\xc2\xbd\x12\xee\x27\xb0\xf9\xfd\x2e\x76\xde\xbc" - "\x29\x2f\xcd\xf5\x0e\xf6\x1b\xc0\x70\x28\xe4\x39\x08\xbf\x54\xca" - "\xcb\x63\x2f\xd7\xc7\xfe\xbe\x13\xe7\xc0\xea\x0d\x52\xec\x65\x8c" - "\xbb\x8c\x32\x23\xef\x39\x0f\xda\x23\x6d\x76\x00\xaf\x18\xee\x3e" - "\x72\x54\x00\xbd\x0f\x82\xfd\xff\x8f\x58\xde\xae\xfa\x58\xb1\x7e" - "\x55\xdc\x7f\xca\x81\x42\xe6\xef\x97\x8d\x87\x0e\x46\x75\x8f\x87" - "\xba\x6d\xcb\xfa\x58\xc4\x24\x94\x55\x83\xfc\x47\x3b\x11\xf2\xe9" - "\xbb\xb1\xc5\xce\xfb\xd6\x5b\xd0\xbe\x14\xeb\x8f\x78\x39\x20\xd2" - "\xae\xd0\xbd\xdf\xb9\xf7\x73\x28\x03\xc6\xff\x1f\x77\x63\x40\xea" - "\xd7\x1c\x07\x87\xc4\xd8\x4f\x27\x2a\xd0\x87\x2f\x94\x5b\x85\x36" - "\x38\xd7\xab\x87\x76\x7e\xd4\xe4\xc0\x39\xf4\x06\xb8\x87\xfe\x7d" - "\xa8\xf0\xdc\x88\x3d\x15\xeb\x98\xdc\x38\x04\xf4\xb9\x97\xc5\x2a" - "\x41\xba\x48\xfd\xb5\xe0\x39\x1c\xfb\x45\xf0\x3e\x9b\x02\x68\xb0" - "\xb7\x11\x71\xaf\x3f\xf4\xd9\xe3\xb8\x76\x7a\x0a\x30\xa4\xc4\xfe" - "\x0b\xfc\xdd\x81\xfe\xa6\x81\x8e\xf5\xeb\xfe\xc0\xfa\xad\x0a\xfb" - "\x6d\x17\xfa\x90\x80\xef\xec\x8b\x8b\x22\x1f\xa5\x54\xb1\x7e\x8c" - "\xfe\x43\xde\x04\xda\x61\x9c\x63\xf8\x76\xaa\xb4\x47\x19\x31\x82" - "\xfe\x42\x44\x9c\xec\xc3\xbe\x2c\xd2\x4e\x01\xf9\xb6\x4a\x7d\xcf" - "\x8d\xff\x2c\x4f\x8f\xfe\x16\xca\xfb\xdb\xa1\x06\x89\xd6\x0e\xd6" - "\x8f\xeb\x0d\x0e\xe8\xc7\xee\x34\x45\x7a\x22\x5d\x3b\x32\x3f\x83" - "\xf6\x57\x6b\x24\x9a\xba\xe8\xf9\xd9\x2b\x22\xcf\xeb\xf9\x1c\xd3" - "\x67\x53\xc4\xf9\xa7\x6e\x1a\x8a\xf8\x43\x3d\x50\xb1\x16\xdb\x0e" - "\xba\x01\xbf\x8f\x18\x79\x53\x94\x59\xfb\xac\x88\x91\xcf\xa0\xff" - "\xff\x5a\xe7\x92\x1d\xf5\x49\x6c\xcc\x02\x7c\xe2\xfc\xf9\x6c\x0b" - "\xf3\xb7\xd1\x87\xec\x30\x93\x83\xf3\x5c\xf2\xe9\xb3\x1d\x12\x1d" - "\x24\x4c\x4a\xfd\x1e\xca\xb8\xe8\x29\x7f\x3e\x3b\x0a\x65\x8c\x46" - "\xf9\xe6\xb2\xa1\x3e\x6b\xf3\x94\x6f\x9f\x35\xa0\x7c\x43\x5c\x1b" - "\x92\x71\x8e\x8d\xeb\x2b\x33\xa9\x4d\xf5\x94\x49\xb5\xaf\xf0\xbd" - "\x01\xdc\xe6\x42\x6c\x19\x9e\xe3\xf9\x51\x87\x41\x7e\x36\x16\x17" - "\x75\xde\x3e\xd4\x71\x90\xa6\x17\xe9\xd5\x04\xf9\xf7\xe1\xb9\x49" - "\xf4\x95\x30\xb2\x89\x8f\xf5\x40\x4e\x57\xa2\xff\x6e\xc8\xa7\xab" - "\x83\xaf\x75\x65\x71\xd9\x2d\xc9\x0a\xfa\x42\xec\xc8\x15\x16\x12" - "\x64\xf8\x39\xfd\xb6\x95\x1c\xc6\xf3\xac\x76\xf4\x21\x09\x65\x6b" - "\x5b\xc9\x17\x07\xe1\xbb\x61\xe2\xaf\x06\x7e\xdf\x83\xdf\x31\xf0" - "\xfb\x47\xf8\xbd\x05\x7e\xb3\x21\xbf\x20\xe6\x8f\x80\xfb\x57\x20" - "\xfd\x27\xe2\x2f\xd4\xf1\x30\xda\x9b\xb3\x44\xdb\x11\xd3\xa7\xe3" - "\x3d\xfc\x3e\x20\xf2\xbc\x86\xf3\xfc\xf0\x3d\x50\x4e\x0a\xd4\xbf" - "\xd1\xd4\xc4\xca\x32\xb4\x92\xcf\xcf\x63\xd9\x78\x8e\x19\xfe\xdf" - "\xee\x66\x83\x42\x39\x87\x0f\xc3\xef\x14\xf8\xdd\x0c\xbf\x49\xf0" - "\xbb\x44\xa4\x41\x3d\xca\x86\xf8\x14\x46\x73\xa3\x96\xdb\xbb\xb3" - "\xa4\x3e\x8f\x7a\xd8\x25\x3b\xea\xaa\xe3\xe7\x71\x7e\x9b\xc9\x21" - "\x86\x03\xc8\xfb\x08\xe6\x85\xdf\xc7\xc4\xdf\x28\xf1\x77\xba\xf8" - "\xfb\xef\xe2\xef\x34\xf1\x77\x86\x99\x1c\x36\x88\x36\x06\xd0\xe5" - "\xb0\x01\xdb\x0d\xb2\x7b\x02\xff\xc6\xe7\x85\x38\x46\x06\x39\xfe" - "\x00\x94\x1f\xd0\x91\xf9\xb9\x42\x9a\x1f\xc5\x39\x9f\xae\xcc\x03" - "\x7f\x79\x93\xad\x6b\x7f\x1e\xee\x92\x6d\xef\x37\xa9\x64\x51\x04" - "\x6c\xa0\x1b\x8b\xe5\x54\xdc\x2b\xf4\x79\x92\x5c\x5c\x17\x16\x63" - "\x03\x04\xa0\xbf\x3c\x36\x1e\x0a\xa2\x3a\xec\xab\x6c\xee\x18\x7d" - "\xbb\x05\xbd\x6f\x86\xab\xcd\x1a\xf4\xbe\x55\x92\xdf\x38\xee\xe1" - "\x63\xf5\xe1\x9f\xc1\xb7\x8c\xae\xb1\xfa\xe7\x91\x7c\x0d\xed\xe6" - "\x57\x20\xbd\xd4\x95\x7e\x18\xcf\x03\x3c\x00\xf4\x6c\x84\xf6\x4c" - "\x69\x26\x9f\xa3\x0f\xff\xfb\x5b\x78\x9b\x23\xa4\x36\x8b\xfc\x30" - "\x48\xf4\x6d\x21\x87\x53\x40\x16\x26\x22\x86\x9b\xbb\xe5\xec\x61" - "\x36\xaf\x2b\x62\x04\x78\x79\xf8\x3e\xe4\xa9\x5b\x1f\x74\x97\x41" - "\x61\x1d\x99\x5f\xe8\x3c\x65\x8a\x49\x87\x32\x05\xb1\x01\xf2\x1b" - "\x79\xad\xec\xd1\xff\x1a\xb0\xff\xf1\x7e\xf7\x45\xbc\xe7\xbb\x9f" - "\x35\x38\x78\xbf\x6b\x04\x9c\x01\x3e\x1b\xd8\x3e\x2e\x33\xf9\x62" - "\x9a\xd8\xa7\x1b\xa1\x4f\x3f\x00\xe9\xf5\xbc\xae\x3c\x5d\xfc\x16" - "\xe0\xac\x01\xdb\x7d\x8b\x94\x2e\xb6\x17\xcb\x41\x9f\xff\x63\xa4" - "\x74\xb1\x7c\xc0\x63\x43\x05\xf6\x13\x29\x5d\x6c\x13\xd8\x51\x5f" - "\x38\x24\x79\x92\xcb\xf1\xb6\x4e\x7a\x0f\xf9\x86\xfe\xb1\xf8\x1c" - "\xff\x17\x78\xb6\xa2\x14\xf5\xc3\xda\xe7\x88\x6a\x45\x11\x09\xe6" - "\xfd\xf2\x0b\x8b\xa7\x8c\xfc\xf2\x00\xcd\x0c\x75\x50\xe5\xfb\x8d" - "\xb5\x8e\x29\x92\xbd\x5a\xdc\x91\xd9\x18\x2f\xc5\xf9\x76\xc5\x19" - "\x68\xdc\x5c\x5b\xda\x4d\x5f\xa8\x4b\xa3\x51\xaa\x8b\x9b\x7e\x66" - "\x3c\xc0\xba\x61\x59\x6b\xc1\x5e\xb7\x81\x5c\xe0\x72\xbb\xb1\xc2" - "\x4c\x46\x4a\xf6\x2e\xd3\x5b\xa1\x32\x62\xc8\x4f\x66\xeb\xa3\xa1" - "\xa8\x1b\x71\x8f\x8f\x80\xf3\x58\x29\x4e\x52\x67\x80\xb1\x7c\xca" - "\x71\x32\x7f\xe5\x08\xf4\xbd\x12\x0b\x75\x7d\x1b\xea\xb6\xd5\x89" - "\x73\xff\x4b\x71\x9c\xfa\xe5\x02\x67\x32\xb5\x8b\x34\x83\x7e\xf4" - "\xe5\x74\x91\xb6\x28\xbf\xb6\xa2\x4c\x5f\x9b\xc6\x63\x06\xe1\x5c" - "\x0e\xf6\x8f\xdf\xa3\x1e\xd3\x50\xfb\xbe\x62\xec\x2b\x47\x66\x48" - "\x36\x29\xd4\xb7\x94\xdb\x84\x87\xb6\x31\xdf\x44\xc6\xf7\x1b\xf9" - "\x5c\xe0\x91\xc3\xbc\xed\x47\x2a\xf9\x3a\x37\xf3\x91\x89\xf7\x65" - "\x01\x9a\x9b\xbe\xe0\xfb\xb2\x0e\xfc\x93\xef\x29\x39\x52\xd4\xbd" - "\xa7\xc4\x65\x2b\x56\x71\xbf\x51\x47\x76\xba\xfa\xc4\x91\x75\xf8" - "\x1e\xbc\x7f\x0a\xd2\x6b\x5c\xe9\x87\xb6\x72\x7b\xe0\xfd\xa6\x90" - "\x35\x51\xb8\xb7\xec\x46\xf4\xb5\xcd\xbf\xf7\xe5\x24\xf6\x7d\x36" - "\xe7\x01\x7d\x53\xec\xbf\x48\x67\xd4\xd9\xac\x0f\x43\xff\xc5\x7e" - "\xdc\x95\xfd\xbe\x19\x2e\xde\x6f\xb9\x6e\xae\x62\xfd\x96\xf5\xd9" - "\x2f\xa7\xba\xd5\xc3\xc6\xe6\xbd\x90\x9f\xaf\x69\x54\xf0\x2c\x16" - "\xf4\x6a\xbd\xf8\x8c\xc7\x94\x38\xc5\x7c\xe4\x59\x71\x6d\x1b\xd7" - "\x3a\xf1\x8c\x56\x28\xa0\x1b\x7d\x82\x48\x6b\xd5\x4f\xb4\xa5\x53" - "\x27\xae\x3b\x5d\xa0\xb6\xc2\x6e\x5f\xff\x5f\x6e\x75\xf9\xf7\x39" - "\xa2\x10\xdb\xd5\x08\xdf\x2a\xe6\x7b\xc1\x1a\xcf\x73\x9b\xaa\xd1" - "\x86\x38\x35\x01\xf6\xe0\xb7\x88\xc7\x65\xfe\xd2\x2c\x61\x0f\xfa" - "\x65\x7c\x2b\xf9\xea\x95\x4d\x37\xd1\x22\xe0\x69\x11\xf4\xa5\xc5" - "\x70\xff\x2c\xfc\xc6\xf3\x5f\x99\x1a\x7f\xc5\x3e\x52\xd4\x91\xf9" - "\x55\xb8\x14\x8f\x1e\x69\x63\x0b\x3a\x11\x81\x38\xcb\x07\x3a\x20" - "\xd6\xd8\x3a\x32\xd4\x1b\xf1\x85\x38\x43\x8c\x85\xae\x79\x9c\xe1" - "\x8c\xf9\x1f\x80\x74\xac\x2f\xe2\x0c\xca\xd2\x4b\x7e\x7e\xcd\xe4" - "\x2b\x15\x5f\xcf\xf9\x2a\x55\xda\x73\x8b\x6b\x49\x49\xb7\x91\x1b" - "\xa1\x5c\xed\x3e\x2d\xf3\xa5\x79\xcc\xe4\x98\x4e\x30\x2f\xae\xc3" - "\x71\x39\x79\xf3\x3e\x78\xa7\xdc\x45\x73\x13\x8b\xcd\xfc\xd1\x3c" - "\x36\x17\x79\x03\x3c\xab\x71\x1f\x67\x98\xc9\x27\x45\x38\xd6\xc0" - "\xbd\x7d\x77\x84\x11\x5c\x07\x06\x39\xf6\x95\x55\xb2\x6b\xef\x0d" - "\xc3\xf5\xfc\x4f\xa6\x41\xfd\x70\x0c\x5d\x0f\xff\x47\xc0\x58\xb2" - "\xda\xcb\x9c\xf1\x14\x9c\xeb\x11\xe3\xf3\x34\xe1\x3c\x16\xc6\x33" - "\x68\x25\xc7\x5e\xa9\x45\x5f\x20\xcb\x7a\xfb\x79\x4e\x4b\xa1\xe7" - "\xd1\xd7\xb3\x36\x91\xdc\xd0\x4c\x8e\xcd\xc6\x79\xa3\xf4\xb3\x38" - "\x47\xd3\x94\xe2\x39\x47\xd3\x54\x2d\x5e\x30\xd2\x3e\x1a\xe5\x76" - "\xd5\x8b\xbf\x33\x07\xb8\x2c\x62\x5e\x68\xe9\xd7\xa2\x4e\xd1\x40" - "\x3f\x69\xea\x9e\xff\x45\x5c\x62\xdf\xc6\x7d\x1c\x38\xe7\x24\x73" - "\x10\xf4\x3d\x02\x7c\x82\x7a\xaf\xbd\xfb\xa9\xaa\x55\x88\xa3\xa3" - "\xec\x1c\x14\xfa\x20\x1e\xdc\x5e\xa2\xa3\x8c\x9f\xdc\x1f\x68\x53" - "\x3d\x7c\x3b\xac\xe0\x0c\x51\x18\x12\xc9\x38\x9c\xff\x0e\x75\xd2" - "\x2a\x1c\xe3\x8a\x3e\x05\xeb\x4f\x91\xa3\x07\x93\x56\x13\x39\x3c" - "\xbf\x15\xfe\xaf\x92\xec\x24\x78\x47\x1d\x60\x27\x61\x68\x1f\x3d" - "\xb6\x9a\xdc\xda\x91\x79\xb4\x58\xe2\x15\xda\x10\x38\x0f\x27\xce" - "\x25\x40\x5d\x9b\xd8\x1e\x67\xf4\x53\x6f\x66\x74\x63\x72\x18\xcb" - "\x80\x31\xec\x51\x63\x80\x8d\xa8\xb9\xee\x39\x0a\xf8\x3f\x20\xda" - "\x8c\x47\xb7\x02\xf6\x1b\xdc\xea\xf9\x0b\xb7\xff\xb3\xf0\xfd\x50" - "\x1b\xda\x67\xde\xe8\xf3\xf5\x3d\x12\x7d\x70\xbf\x6a\x28\x8c\x13" - "\x18\xbf\x1d\xb4\x0d\xea\x56\x63\x58\x45\x94\xa7\xc8\xb1\x71\x6f" - "\xfd\x81\x9d\xb3\xab\xe6\xf3\xf3\xc7\x46\x49\xe3\x70\x5e\xef\xaf" - "\x8f\x86\xae\x09\x20\x38\xaf\x8e\xfe\xce\xd8\x5e\xbf\xef\x35\x6c" - "\x2e\xdd\xe4\x98\x4a\xaa\xd2\x1e\xc4\x3c\x92\x5d\xd5\x74\x2e\x5d" - "\x43\x3e\xd2\x4c\x85\x7e\xfc\x75\x19\xf4\x15\xdb\xe0\xf7\x54\x7e" - "\x5d\x26\xd2\xb7\x86\xef\x45\xf8\x7a\x25\xea\x12\x1c\xfb\x83\x1e" - "\xd9\x87\x3a\xba\x23\xf3\x98\x42\xea\x37\xa0\x37\xf6\xc1\x3b\xa2" - "\x3f\x6c\x5c\xff\xfd\x3a\x09\x7d\x40\xb0\x71\x03\xcf\xaf\xe2\x73" - "\xfe\xc7\x22\xbb\x6d\x69\xc8\x87\xef\xf1\x3d\x6a\x5f\xcf\x9c\xef" - "\x94\x01\x4d\xbf\x9e\x89\x6d\x13\xb1\x08\xfa\xea\x98\xde\xd5\x6f" - "\x8f\x32\xd9\xfc\x51\x9b\x7b\xbf\x3c\x66\x74\x8d\x37\x9b\xa6\xde" - "\xb3\x89\x68\xfb\xea\x87\x86\x10\xd4\x55\xc7\x2e\x16\x14\xd0\xd2" - "\x42\xb9\xf0\xe8\xda\x7c\xa2\x92\xe5\x02\xd9\xb0\x9f\x25\xc7\xdd" - "\xd8\x4a\xcc\x41\xa1\xaa\x9b\x67\x3d\x96\x34\x9c\xa6\x69\x88\x3c" - "\xaf\x7d\xb8\xf2\x36\xfb\xcd\xa5\x34\xe0\xee\xa7\x9e\x48\xb2\x13" - "\xed\x4b\x85\xe4\xc4\x62\x12\xf0\x98\x13\xbe\xad\x22\x06\x33\x69" - "\x0e\xc3\x33\xa3\x1f\xa9\xd0\xfe\x68\x0e\xc3\x32\x53\x8b\x89\x32" - "\xb5\x85\x5a\x72\x17\x06\x2a\x41\x1f\xa8\xdf\x04\x8c\x8d\x54\xdd" - "\x5c\xda\x05\x65\xec\x8d\x63\xef\x95\x7b\xaf\x9b\xf9\xf5\xbe\xeb" - "\x66\xb8\x09\xea\xb6\x6d\x70\x75\xfb\x76\xa7\xab\x6e\xdf\xee\xbc" - "\xf4\xba\x7d\x73\x9f\x5b\xdd\xd4\xae\xba\xe9\xa1\x6e\xdf\x3c\x32" - "\xb8\xba\x1d\x9f\xed\xaa\xdb\xf1\xd9\x3e\xd6\x6d\x47\x3f\x75\xab" - "\xed\xbb\x6e\x29\x37\x43\xdd\x8e\x0e\xae\x6e\xad\x36\x57\xdd\x5a" - "\x6d\x97\x52\x37\x1c\xcb\xa7\x85\xd3\xe3\xcc\x9f\x7c\x22\xf7\xd7" - "\xda\x4a\xbe\x7d\x28\xad\x98\xdd\x8f\x6e\x25\xcd\x17\xc5\xfe\x6d" - "\x4d\xb7\xd1\x6f\xb9\x9d\xd3\x9c\x30\xd9\x80\xfb\x5d\x9b\xe7\x01" - "\x96\xc3\x38\xa6\xbf\x65\xfb\x1b\xd2\xad\x54\xdc\x6f\xda\xfc\xdb" - "\x12\xb6\x1f\xa5\x2a\x4e\xbc\xaf\x3e\x37\xa2\x32\x0c\xf7\x82\x08" - "\xd0\x9f\xe9\x88\x4a\x2d\xc6\xef\x7c\x27\xd1\x2a\xa7\x99\xe8\x3b" - "\x0c\xfd\xfd\x29\x08\xcd\xa9\x8c\x78\x27\xd1\xce\x62\x87\xaf\x65" - "\xe7\x7d\x9b\xab\xa4\x33\x6e\xd2\x37\xac\x41\x55\x71\x90\xde\x28" - "\xc5\x81\xa5\x72\xb4\x67\x2a\x35\x58\x3e\xa4\x5b\xa5\xd8\xac\x80" - "\xf7\x75\xa2\x6c\xb0\x85\xda\xfb\x93\x7b\xdf\xde\x29\xc9\xbd\xc7" - "\x92\x48\x28\xc6\xa5\x2c\x48\x1b\x8e\x6b\x8e\x50\x56\xf3\x4e\xa4" - "\x7b\xb4\x6d\x38\x0d\x4d\x25\x01\x78\xb6\x0f\xf7\xe8\x99\x34\x56" - "\x32\x21\x95\x04\x46\xa7\x40\x99\x76\x12\x17\x9a\x02\xe5\x01\xad" - "\xf9\xd8\xe0\x5b\x36\xc7\xb7\x09\xca\xc3\xf5\xef\x80\x24\xa2\x7a" - "\x4c\x93\x4e\xd7\x6e\x26\x0a\x3c\x07\x88\xe7\xf9\xf8\x59\xbe\x61" - "\xca\x8e\xcc\x6f\x4b\xa5\xf6\xf9\xc0\x9f\x10\xce\x9f\x96\xa3\x2e" - "\xfe\xb4\x6c\xee\xcd\x9f\x96\x40\xce\x9f\x6f\x1d\x2e\xfe\x1c\x8f" - "\xf2\xe4\x4f\xcb\x9d\x9e\xfc\x69\xd1\xfb\xc7\x9f\x96\x38\x17\x7f" - "\xf8\x37\x38\x7f\x5a\x52\xfa\xe6\x4f\x4b\xa1\x8b\x3f\x2d\x13\x7c" - "\xe3\x4f\xcb\x7e\xef\xfc\x69\x99\xdd\x0f\x7f\x86\xf5\xcd\x9f\xe3" - "\x37\xfa\xce\x9f\xe3\x51\x83\xe0\x4f\x30\xe7\x4f\xeb\x6a\x17\x7f" - "\x5a\x7f\xd6\x9b\x3f\xc7\xb7\x71\xfe\x1c\x2f\x76\xf1\xa7\xd5\xec" - "\xc9\x9f\xe3\xfb\x3d\xf9\xd3\xaa\xf4\x8f\x3f\xad\xc4\xc5\x1f\xfe" - "\x0d\xce\x9f\x56\x4d\xdf\xfc\x69\x8d\x70\xf1\xe7\xf8\x3e\xdf\xf8" - "\xd3\x9a\xe0\x9d\x3f\xc7\x6d\x83\xe7\x4f\xeb\xbb\x3d\xf8\xa3\xf6" - "\xce\x9f\x56\xf3\x20\xf8\x13\xca\xf9\x63\x19\xe7\xe2\xcf\x89\x23" - "\xbd\xf9\x73\x62\x3a\xe7\xcf\x89\xa9\x2e\xfe\x58\x32\x3c\xf9\x73" - "\x22\xc1\x93\x3f\x27\xca\xfc\xe3\xcf\x89\x52\x17\x7f\xf8\x37\x38" - "\x7f\x4e\x54\xf4\xcd\x9f\x13\xf5\x2e\xfe\x9c\x88\xf7\x8d\x3f\x96" - "\x40\xef\xfc\x39\xb1\xa9\x1f\xfe\x0c\xef\x9b\x3f\x96\x39\xbe\xf3" - "\xc7\x92\xd1\x1f\x7f\x06\x67\xeb\x59\x36\xe1\x77\x87\xa0\x9c\x26" - "\x6f\xe5\x20\xed\x70\xff\xa1\x90\x69\x69\x2a\x11\x86\x29\xf9\x19" - "\x0d\xcb\x26\xed\x2a\xf2\x70\x33\x39\x39\xb1\x44\x08\x54\xd2\xcc" - "\x32\x18\x27\xfd\xb9\x88\xae\x19\xa6\x10\xd6\x0c\x57\xe0\xd9\x6c" - "\xef\xf1\xdb\x4f\x66\x07\x8c\x21\xe3\xf1\x1c\xdd\x5a\xb0\x97\xf1" - "\xff\x8e\xcc\x93\x9b\xc0\x16\x8c\xea\xef\xfc\x16\xee\x75\xfa\x68" - "\x1d\x8e\x6f\x4f\x56\x75\xfb\xc5\xc8\xa4\x29\xe8\x5f\xcc\x70\x3b" - "\x9e\xb3\x38\x69\xd9\xc4\xfc\x55\xed\xda\x1a\x75\x3b\x3d\x86\x63" - "\x8f\x56\x72\xea\x38\xcd\xde\xb5\x15\xf1\x00\xb6\xfa\x0d\xa7\xc8" - "\xa9\x88\xee\xfd\x79\x34\xf6\x0d\x71\x8e\x70\x16\xcf\xdb\x36\x07" - "\xf2\xce\xc2\x38\xa4\xaf\xa6\x61\x7c\xcd\xb6\x87\xc0\xf6\xfd\x11" - "\x7e\x03\x7d\x27\xbd\x05\xbf\xb8\x4f\x86\xef\xcd\x3c\x35\x8b\xd9" - "\xcb\x6b\x6f\x79\x83\xef\x85\x6b\xbb\x53\xc2\x1d\x7c\x67\x04\xdc" - "\x07\x8b\xf6\x3c\xe6\x1f\x79\x8a\x7c\x77\xde\xed\xb9\x0a\xee\x8f" - "\x40\xd9\xa3\xc4\xe7\xc1\x70\xbf\x1b\xed\x6c\xe6\xe7\x23\x3f\x43" - "\xdc\x43\xfc\x5d\x29\xa4\xa9\xc5\x3c\xa3\x20\xcf\x6f\xd1\x76\x17" - "\xcb\x18\x0d\xf7\x8b\x70\x0c\x2c\x3e\x0f\x83\xfb\x27\x70\xed\x40" - "\x7c\x7e\x23\xdc\xdf\x07\xf7\x77\xf1\x33\x2f\x5d\x62\x1f\x3d\xe5" - "\xf0\xef\xcc\xf8\x29\x16\x53\x13\x79\xc0\xc7\x02\xdf\xb9\xed\xff" - "\x39\xd5\xd2\xe3\x59\x9c\xdb\xb3\x06\xe9\x19\xdf\xa3\xf6\x5d\xaa" - "\xdb\xb3\x7d\x3d\x9e\x15\xb9\x3d\xdb\xd9\xa3\xcc\x9d\x6e\xcf\xb6" - "\xf6\x78\xaf\xde\xed\x59\x61\x8f\x67\x6d\x6e\xcf\x32\xc4\x67\x01" - "\x1d\x99\x6d\x0a\xd7\x1a\xde\x29\x83\x98\x2e\x87\xf4\x70\xb7\xf4" - "\x38\x31\x1d\xbe\xdf\x36\xc5\x4c\xde\xb4\x8a\xe9\x8c\xf7\xbc\xfc" - "\xb6\x99\x6e\xe5\x47\xf0\x39\x8e\xb6\xb8\xee\xbd\x73\x23\x2a\x0d" - "\x42\x57\xec\x1b\xf0\x4c\x83\xb8\x72\xc7\xf6\xd2\x64\xed\xf3\xcb" - "\x5f\xd4\x26\x26\x24\xe1\xf6\x95\x25\x8b\x92\xb4\x4b\x96\xc5\x27" - "\x78\xf8\x59\x0f\x43\x9f\x83\x18\x53\x0d\x7d\xb7\xb0\xf8\x05\x7f" - "\xa0\x96\xee\x98\x1f\x20\x57\xe1\x5b\x35\x66\x32\x9d\x7d\x6b\x13" - "\xf7\x47\x5e\x8d\xbe\x5f\xb8\x9f\x17\xf2\x78\x33\x69\x3b\x28\xfa" - "\x79\xa9\x82\xbc\x76\xef\x7e\x5e\xce\x34\x30\xff\x86\x90\x8f\xfb" - "\x79\x39\xd3\x08\xfd\xfc\x31\x3a\x82\xc7\xf0\xe0\xb1\xcd\x4e\x4b" - "\xb6\x89\x75\xfe\x45\xe6\x23\x30\x83\xcf\x65\xf4\xf4\xd7\xba\x6b" - "\x1d\xbe\x27\xae\x97\xae\x73\x7b\x3f\x9e\x3f\x97\xf4\x83\xf8\x4d" - "\xe3\x2e\x5c\x1f\x18\xd1\x0c\xf7\x6c\xfe\x9e\x3d\x3b\xcd\xe7\xf2" - "\xb2\x77\xe5\x62\x9b\xb0\xdd\x9e\x6d\x93\xff\xa6\x99\x9c\x7e\xdb" - "\xd5\xb6\xd3\x0d\x6e\xbe\xe0\xc4\x36\x9c\x76\xf0\x3e\xda\xab\xad" - "\x6c\x7f\x22\x55\xee\xca\xc5\x6f\xa3\x3c\xe3\x67\x19\xe0\x3e\x7b" - "\x97\x51\xaa\x8f\x5b\xfd\x72\x71\x5c\x0f\xf5\x3b\xc2\x69\x02\xf2" - "\x03\x78\x2a\xb6\x61\x33\xcd\x6c\x4b\xe5\xb1\x0c\x40\x9f\x60\x4c" - "\x16\xa6\xab\xce\xc4\x4b\x73\x99\xa8\xa3\xf8\x1c\xe6\x19\x97\xfd" - "\x87\x3e\xba\xb2\x25\xfd\x75\xc6\xcd\xfe\xe3\xdf\x84\xb4\xad\xee" - "\x18\x72\xfb\xde\x41\xfc\x1e\xe4\x9b\xc9\xcf\x03\xec\x32\x62\x7f" - "\x87\x7b\x35\xee\xc5\xc4\x77\xb1\x8e\xde\xe2\xf0\x79\xf3\xa1\xe8" - "\xa2\xe3\xf7\xe1\x12\x1d\x37\xb1\x33\xf2\xdf\x4f\x92\xe6\xeb\xc4" - "\x18\x18\x55\x9b\xba\xe3\x52\x7f\x1f\xcb\x62\xbb\xe5\x06\x14\xdd" - "\xab\x22\x71\x9c\xb6\xdf\x2f\x40\x19\x8f\x7d\x86\xcb\xfa\xef\xab" - "\x44\x9e\x8b\xf1\x54\xbf\xcf\xc6\x74\xd7\xfe\xfb\xef\xcd\x52\x3e" - "\x49\x2e\xf3\xf5\xaa\xef\xdf\x63\xf9\x78\xac\xe0\x28\xce\xf3\xbb" - "\xd4\xcd\xe4\xfb\x1a\x31\xff\x49\x86\x45\xe6\xbf\xe7\x7b\x0b\xcd" - "\xae\x8a\x82\xba\xc2\xf8\xa7\x4d\x8c\x59\xc1\xbf\x0b\xbf\x35\x58" - "\x17\xa4\x11\x9e\x25\xa7\x79\x01\x45\xc0\x9f\xc8\xbe\xcf\x92\x3e" - "\x23\x9e\xd7\x39\xcb\x6d\x08\x39\xb5\xe3\x1c\x2b\x6f\xeb\xd9\x04" - "\xb7\xbd\xcf\x2a\x29\x0f\x97\xdd\xec\x19\xdb\x53\x6e\x48\xc6\xf9" - "\x20\xf1\x59\x32\x9e\xaf\xed\xfe\x7f\x98\xdb\xff\x81\xf8\x3f\xdb" - "\xd7\xbc\x8a\xe9\x56\x85\xeb\x1c\xff\xd9\x78\xb8\x57\xf5\xb8\x0f" - "\xf3\xb8\x5f\xc9\xf7\x3d\x83\x6d\xd6\xc2\xf6\x90\x8b\xe9\x62\xd9" - "\x41\xac\x3e\xc9\x34\x12\xb0\x51\x84\x67\xba\xc5\x7e\x58\x84\x67" - "\xb6\x43\x1d\xcf\xb2\xf3\xda\xf0\x7c\x8a\xf8\x1b\x21\xfe\x4e\xe2" - "\x71\x5a\xcf\x86\xbb\x62\xad\xe3\x1c\xcd\xd9\x49\xde\x62\xbf\xe3" - "\x79\x70\xf1\x37\x42\xfc\x9d\x24\xc6\xaa\x9d\x07\xef\x75\x9f\xff" - "\xee\x7b\x0f\xf2\xd9\x75\xd2\x59\x6e\xa7\x71\xd7\x54\xc1\xb8\x5b" - "\x87\x71\x41\xd1\x4f\x58\x7a\x1b\xfa\x8a\xb1\x11\x13\xe9\x24\xa6" - "\xa4\x8e\x0c\x8c\x0d\x5a\xc7\x63\x82\xe2\x19\x58\x19\xce\x9b\xa3" - "\xed\x58\x67\x38\xcd\xe2\x82\xae\x68\x93\xe2\x9e\x9c\xb5\x38\xb3" - "\x77\x4d\x15\xfb\xcb\x66\xbe\x47\xbf\x9d\xcd\x17\xb3\xb8\xd6\x6d" - "\x6c\xdd\x4b\xd9\x4a\xda\x53\xa4\x3c\x9c\x76\xed\x6c\xee\xeb\xad" - "\x4c\x29\xf6\x63\xbb\x56\x8a\x35\x6d\x26\xed\xa9\xe7\x83\x3e\x2c" - "\x83\xb4\x29\x9e\x7b\xa6\xdb\x9f\xc0\x32\xb1\xee\x66\x72\xd6\x8a" - "\x65\x43\x9e\xd8\xee\x3e\x0b\xe9\x2b\x1c\x64\x2c\xd4\xab\x55\x2a" - "\x1f\x9e\x43\xff\xb7\x32\x5a\x62\x99\xe7\xb3\x2d\x8d\x90\x96\x6b" - "\x96\x67\xef\xe0\x7b\xae\xdb\x41\xff\xfd\xdf\x69\xfd\xd9\x40\xd0" - "\x17\x0c\xd0\x97\x52\x04\x63\x95\x9e\xf9\xf2\x0e\xaa\x32\xf0\x39" - "\xc6\xf6\xe3\xb8\x3b\xbc\xe0\x02\x51\xe0\x1e\x08\x8e\xd9\x73\xdc" - "\x07\x32\xa4\x81\xac\x2e\x83\x3e\xc2\xea\x31\x38\xbd\xdf\x6e\x63" - "\x65\x8c\xe5\xbe\xcd\xf0\xec\x52\x47\xe6\xb9\xa8\xee\xf8\x09\xdd" - "\xfd\xf8\xdc\x22\x5c\x7b\x80\xfe\xc1\xea\xd8\xb3\x0e\x58\x5f\x28" - "\xab\xc5\xab\x8d\xa9\xac\xd2\xb3\xf5\x99\x9c\xca\x28\xbe\x47\xf5" - "\xdc\xdf\x02\x34\xb7\x58\xe0\x5b\x3b\xba\xe3\x46\x40\x9e\x7c\xdc" - "\x7b\x0f\xe5\x77\xb7\x33\x91\x7d\xa3\x81\xf7\xf5\x73\x16\x21\xbb" - "\x4a\x5f\xd0\x49\x14\x62\xba\xa5\xce\x61\xc7\xd8\x03\x7d\xfa\xd9" - "\x62\xb1\xf3\x70\x4f\x78\x4e\x95\x1e\xcf\x0d\xdd\x6b\x97\xea\x6c" - "\xb3\xe0\x79\x15\xac\x33\xa7\xad\xed\xa8\x44\xc7\xbc\x76\x28\x3b" - "\xed\x4b\xd2\x42\x6c\x09\xb8\x6f\x8e\xd1\x64\x95\xb4\x97\xd3\xc6" - "\xc6\x7c\xec\xfb\x3c\x0f\x1b\xfb\xb3\x38\x46\x50\x7e\x09\x8b\xc5" - "\x06\x6d\x00\x5e\x54\xa5\xe1\x99\x7f\x1b\x8b\x0b\xb0\x96\xf9\xea" - "\x80\x76\xb3\x7d\xb2\xe7\xc5\x75\x12\xdb\x56\x49\x57\x98\xc5\xb4" - "\x02\xfc\x76\x72\x27\x39\x43\x6c\xbf\xc5\x18\xeb\x40\x8f\x14\xf4" - "\x4f\x57\x67\x83\x7e\x92\xd2\x89\x58\x48\xc1\xd8\x9d\x66\x62\x5b" - "\xc7\xf5\x1b\xd2\xdc\xa6\xc7\xef\x23\x6d\x61\x6c\x66\x05\x9a\x5e" - "\xe8\xc8\x3c\xdf\x1d\xff\x31\xff\x26\x1c\xef\xd8\xfa\xf5\xaf\xeb" - "\x84\x3a\xd7\x15\x81\xee\x1c\xfb\x25\xd6\xef\x80\x30\xa2\x4a\x8f" - "\x7b\xb2\xe1\xff\x25\xa2\x6c\x67\xbc\xe3\x38\x38\xff\xc7\x00\x4d" - "\xf8\x6d\x75\x1c\x0b\xcc\x87\x1a\xa4\xcd\x10\xe9\xc7\xe2\x49\x14" - "\x26\x73\x3a\x88\xf9\x1d\x7c\xbe\x38\xfc\x2e\xa8\x97\x5b\xfc\xbb" - "\xf3\x4c\x77\xa3\xef\xfb\x12\x36\x26\x3c\xbf\xd3\xad\xce\x36\x76" - "\xfe\xb5\x1d\xe7\xfa\xce\xcf\xc3\x6f\xe5\xa1\xff\x30\xc4\xc5\x29" - "\x77\xfc\x9f\x7f\x08\xeb\x89\x7b\x7e\x9d\x41\x95\x51\xa0\x6f\xa7" - "\x21\x9d\xe1\x9d\x24\xe8\x0b\xfa\x7e\x74\x21\x8b\xbb\xd7\x91\x79" - "\x41\x27\xe9\x42\x18\x5f\x80\x5e\xe8\xb8\x8d\x8d\x3b\xc1\x9e\x36" - "\x09\x68\xcf\x74\x68\x11\x37\xd0\xd7\x33\x44\x19\x9b\x01\xef\xcc" - "\x93\xd6\xbc\x9c\x78\x6e\xe2\x0c\x5b\xef\xb5\x49\xf1\xe4\xb8\xbf" - "\xbe\x0b\x19\xae\x73\x16\x17\x72\x7b\x9d\xb3\xc0\xb3\x3f\x7f\x60" - "\x71\xc7\x76\xa0\x4e\xa9\x6d\x6b\x41\x1d\xc1\xde\xc7\xb3\x17\x69" - "\x30\x26\xe7\xe7\x87\x5a\x70\x7e\x9e\xc5\x3c\xc1\xba\xf0\xd8\x13" - "\xcd\xec\x7f\xc0\xad\x02\x7f\x39\x96\x2e\x58\xbb\x63\xa6\x03\xbf" - "\x71\xad\xed\x23\xc5\x2f\x48\xd5\xed\xa8\xaf\x3b\x6e\xc3\xf8\xdf" - "\x1d\x99\x1d\x61\x52\xec\x6f\x16\xeb\x9b\xb7\x27\xc9\xab\x5f\xc6" - "\xc9\x24\x02\xfd\x05\xe0\xf9\x3a\x46\x03\x55\x40\x24\xfa\x7a\x46" - "\xbf\x95\x55\xab\x30\x26\x4b\xc7\xc1\xdf\xdf\xc4\xce\x28\xdb\xaa" - "\x26\xb7\xe3\x3e\xac\xb6\xd6\x54\xe6\x8f\x49\x19\x9d\xe2\xa0\xf8" - "\x1e\xb3\x27\x82\x03\x22\xf1\x19\x8b\x75\x80\x65\xfa\xed\xb7\xb8" - "\xa3\x58\xb4\x4d\xdb\x60\xec\x73\x33\xf0\x8a\xd9\xee\xf0\xff\x4d" - "\xa7\x88\xfd\x22\x8f\x41\xcb\x7d\xef\x8b\xfb\xb1\x87\x71\x1f\x1b" - "\x40\x33\xe6\xf3\xc0\xbe\x44\x7b\x37\xc6\x6b\xb6\xbf\xc2\xfc\x60" - "\x1b\x77\x15\x8a\x34\x28\x2c\xe0\xf5\x0a\x9d\x9f\x22\x67\x75\xc4" - "\xfa\x0d\xae\x6e\xf6\x48\x71\x1c\x31\xac\x23\xd3\x9e\x2a\xf9\xe6" - "\xe0\xf6\x14\xf7\x8f\xcd\x79\x61\x3f\x29\xda\xcf\x9b\xc4\x6f\x6f" - "\x1a\x82\x6f\xef\x14\xcb\xd4\x73\x1f\xe1\x1d\x71\x50\xae\xbe\x23" - "\xf3\xa2\x42\x1a\xcf\x88\x67\x88\x26\xf1\x71\xd6\xc5\x70\xd7\x78" - "\x86\xd3\xd0\xe3\xdc\xdd\xb2\x65\x49\xda\xf8\x45\xaf\x1a\x16\x24" - "\xbd\xa0\xd7\x26\x24\x26\x2e\x4b\xd4\xa2\x93\x26\xf7\xfe\xc3\xe3" - "\x18\x5d\x8c\x10\xe3\x13\x96\xb9\xe2\x13\x5e\x4c\x71\x8f\xe9\x69" - "\x26\x17\x53\x87\x66\xee\xe2\x62\x91\xb7\x72\x0a\xe5\x42\x39\x5c" - "\x15\x70\x55\xc1\x55\x8d\x73\x19\xf3\xed\x24\x0a\x74\x3d\xdb\x67" - "\xe2\xf2\x39\x71\x71\x16\xee\x31\x6a\x26\x17\xcf\x97\x08\x0a\x1c" - "\x07\x61\xdc\x70\xe6\x2b\xf4\x2d\x78\x1f\xae\x2a\xb8\xaa\xe1\x62" - "\xef\x09\x1f\xb2\xf3\xf2\xe5\xee\xcf\xf8\xfe\x91\x35\x3b\x30\x0f" - "\x5d\x83\x4b\xf6\x90\xef\x77\x3c\x5f\x8f\x3a\xc8\x69\x66\xbb\x94" - "\x8f\xad\xed\x87\xac\x21\xda\x3e\xf2\x05\xd0\xcc\x93\x65\x62\x3e" - "\xb6\xd7\x46\x6a\x0f\xc6\x1a\x80\xfc\x52\x3e\x05\xcd\xec\x98\x22" - "\xe6\x63\xba\x42\xc8\x94\xf7\xf5\xdd\x40\x9a\x59\x11\x2e\xe6\x53" - "\xbb\x97\xe7\x96\x67\x98\x90\x79\x6c\x2b\xe6\x11\xd6\x28\xc2\xb8" - "\xed\x74\xb1\x08\xf2\xf7\xe9\xa3\x75\x70\x7c\xea\x8a\xea\xc9\x27" - "\xc3\x0b\x8b\x12\x1e\x5c\xb4\x34\x19\x23\x4d\x25\x2d\x5b\x9e\x84" - "\xbf\x4b\x17\xbc\xcc\x7e\x96\xcd\x5f\xf8\x02\xff\x27\x69\x71\x04" - "\xfe\xb3\x18\xf0\x86\xbf\xf1\xcb\x0d\xf8\xf3\xc2\x32\xbc\x4d\xd1" - "\x4f\x5a\xfe\x02\xfe\xf4\x3c\x07\xaa\xeb\xc8\xec\xb2\x00\x36\x1a" - "\xb9\x9c\xed\x82\x31\xd2\xc9\x70\x66\xc7\xae\x31\x93\xfd\x3a\x07" - "\x91\xe6\xb5\x3c\x7d\x8e\x38\x64\xe8\x73\x24\x74\x8d\xe1\x85\x50" - "\xc7\xa2\x04\xd0\x19\x49\x1d\x99\x8e\x08\x33\x79\x89\x88\xb2\xb1" - "\x94\xf9\x39\xcd\xec\xca\x10\xf7\x76\x2a\x04\xe3\xae\xd9\xe8\xbf" - "\x1f\xee\x59\x9c\x6d\xb8\xcf\x80\xfb\x62\xb8\xc7\xf8\xda\x61\x70" - "\x3f\x0f\xe7\xa4\xe0\x5e\x03\xf7\xe1\x82\x71\xbb\x1e\xcf\x18\xc3" - "\xbd\x16\xee\x27\x40\xf9\x85\x52\xbf\xe8\xdb\x56\x76\x94\x4b\xb1" - "\xbf\x79\x9c\x6f\x47\x55\x77\x9c\x6f\x8c\xe7\x94\xa6\x9e\xc7\xf4" - "\x2f\xb3\x41\x1c\x2d\x01\x9a\x71\xc9\x90\xa7\x45\xd2\x97\x7c\xbe" - "\xc3\x61\x93\xfc\xa7\xf0\xf9\x0c\xa7\xc2\x2d\x5e\x3a\xde\x87\x49" - "\xf1\xd2\x71\xbe\x8b\xc5\x6b\x84\x5f\x9a\x89\xfe\x64\x69\x59\x9f" - "\x73\x79\x2c\xce\xa7\x73\x25\xfa\xe6\xb5\xa6\xc7\xcb\xee\x28\xc1" - "\x39\x34\xb8\xe7\xbe\x25\xe9\x19\xe2\x64\xf1\xa1\x24\xbf\x73\xee" - "\xbe\x24\xfa\x3c\x0f\x75\x08\x6c\x06\x16\xef\x6a\xf1\xb2\x50\xc7" - "\x82\x04\x6e\x07\x3a\x8f\x70\xf9\x55\x19\xcf\xed\x05\xe7\x3e\xfa" - "\x14\x8f\x89\x62\x26\xc2\x0c\xee\x7b\x6a\xf1\x32\x0a\xef\x86\xa6" - "\x2c\x48\x60\x69\x90\x6f\x2d\xd8\x6a\x62\xfd\xb6\x9b\xc2\xf1\x8c" - "\xab\x20\xfa\xc8\x70\x96\x3d\x37\x2e\x03\xbf\xa3\x64\x76\xc8\x21" - "\xa2\xc2\x78\x9b\x58\xb7\x12\x37\xbf\x78\x05\x90\x86\x7b\x48\xcf" - "\x3d\x45\x54\xe8\x07\x58\xac\x4b\x19\x8f\x1f\x26\x44\x49\xbe\xa6" - "\xcc\x90\xd6\xb3\x3d\x4f\xfd\x9a\xa1\xf2\xce\x17\x26\xcd\x9a\x0e" - "\xff\x4d\x12\x43\x56\xbb\x63\x33\xfc\xdc\x88\x0f\x22\xcf\xfd\xe9" - "\xa9\x17\x79\x5c\x52\x01\xc6\xff\x4e\x36\x16\x12\x70\x0c\xdc\x11" - "\x5b\xc4\xf7\xa0\x0a\x07\xd0\xef\xae\x90\x89\xf6\x24\x9e\x9b\x16" - "\xf0\x1c\x3b\xd8\x39\x95\xfa\xb7\x56\xa3\x8f\x67\x19\xd0\x58\x78" - "\x1b\x9f\x89\x3e\xbc\xe4\xcc\xc7\x95\x93\x68\xd8\x19\x61\xb0\x51" - "\xf0\x0c\x6a\xab\x4c\x56\x8b\x76\x07\xce\x27\x09\x99\xc2\x6c\xc4" - "\x2d\xf0\x18\x7d\x88\xd8\xe8\x88\x5d\x51\x34\x68\xb7\x0a\x71\x8c" - "\xb6\xae\x49\x8d\x34\xa3\xe8\x33\xe0\x31\xb8\x7e\xc3\x63\xcf\x3c" - "\x63\x91\xca\x84\x7b\x15\xd8\x50\x49\xf0\xab\xee\xc8\xa4\x33\xdc" - "\x62\xf2\x89\x67\xa2\xe9\x22\xf4\xfd\x86\x65\x33\xdb\x59\x26\x7b" - "\x8f\xdb\x20\x34\xc9\x4c\xd4\x53\x78\x5f\xc4\x58\xa3\x39\x46\xf1" - "\x7f\xb0\x7f\xee\xb7\xf6\x28\xe3\xb0\x34\x57\xca\x31\x0d\x3a\x4f" - "\x4e\x1e\x83\xeb\x37\x90\xbf\xd2\x4c\x7e\xca\xf2\xaf\x95\xb3\x73" - "\x92\xad\x01\x1a\x3c\xef\x4e\x1b\xa4\xf4\x40\x59\x14\xd0\x14\x63" - "\xba\xf1\xbe\x7f\x6e\x44\xe5\x4c\xb8\xb7\x49\x73\x2c\x6c\xce\x25" - "\x0b\xf7\x75\x75\xdf\xc7\xc2\x7d\x98\x74\x0f\xff\x6b\x25\x59\x81" - "\x73\x12\xe7\xd2\x63\x37\xe3\xb8\xf3\x05\x0d\xd8\x85\x60\xdf\xc0" - "\x73\xe0\x7f\xce\x0c\xfe\x6e\xab\xf5\x5c\x66\x9e\xc1\x36\x82\x46" - "\xd8\x40\xfe\xc1\x33\xb0\xff\x16\x37\x89\xe5\xe8\xcd\xf2\x9c\x7a" - "\xa9\x6d\x42\x66\x40\xa8\x90\xbd\x5b\xc7\xda\x28\x93\x6d\x85\xff" - "\x27\x59\x83\x76\xe1\x3b\xc0\x7f\x47\x31\xcb\x97\x7c\xba\x34\xb7" - "\x53\x3d\xdb\x04\x16\x7c\xd5\xc2\x4e\xa4\x1f\xdb\x93\x9d\xb7\x4a" - "\x3d\x0b\xed\x4e\xf4\x03\xc2\x62\xa2\xa1\x7f\x4b\x07\x19\xc6\x62" - "\x0a\x64\x9f\xb0\x30\x5f\xfa\x2b\x74\x2a\xc9\xb7\x25\x35\xbe\x6b" - "\xa3\xf2\x65\x36\xf4\x77\xc9\x62\x87\x74\xe8\x42\x98\x8f\x4b\xd1" - "\xb7\xe5\x96\x64\x12\x56\x2c\x70\xdf\x96\xcc\x47\xc8\x30\x18\xa7" - "\x24\xf7\xed\xdf\x92\x66\xee\x98\x21\xf9\xb7\xa4\x17\x9c\x76\xf8" - "\x7f\x02\xd0\x03\xe3\xbf\xeb\xd8\xbd\xcb\xdf\x94\xa2\x4f\x7f\x97" - "\x72\x90\x7b\x72\xee\xef\x72\x50\xfa\x42\x26\x63\xf3\xb2\x1d\x59" - "\x32\x90\x7f\xaf\xb1\xb8\x80\x6e\x69\xfb\xa0\x25\xa2\x7f\x03\xaa" - "\x17\xd3\x1a\xcd\x24\xbb\x58\x1c\x97\x5a\x71\x8c\xbf\x89\xcd\x8d" - "\x09\x6d\xb4\x4b\xbf\xb9\x2f\x99\xd3\x1e\x12\x58\xde\x8e\xfe\x29" - "\xb2\xe4\x1a\xb3\x4c\xce\x7c\x73\xb3\xb1\xa4\x4c\xae\xe9\xd9\xaf" - "\x9f\x7f\x61\x59\x7c\xc2\xfc\x97\x96\x18\xb4\x4f\xcd\x7e\x8c\x05" - "\x4a\x9c\xa4\x5d\x94\x94\xc0\x54\x92\xf6\xa9\xe9\x8f\x46\x47\xcf" - "\x9e\xff\xeb\xd9\x8f\xcc\x9e\xf3\xeb\x87\xf8\x89\xc5\xd9\x89\x2b" - "\x31\xd8\x66\xd2\x32\x2d\xbe\xf4\xbc\x18\x4d\x7c\x55\x42\xe2\xb2" - "\x9e\xf2\x20\x8c\xcd\x73\xc9\xd9\x9c\xae\x0d\xff\x67\x73\x69\x32" - "\xf9\x4e\x69\x8e\x8b\xc9\x3e\x99\x7c\x1b\xd2\x96\xc5\x1a\xcf\x92" - "\x4f\x42\xfb\x4a\x8c\xf3\x8e\x7a\x47\x81\x7d\x1a\xf5\x0f\xb4\xc5" - "\xec\xee\x9b\x8b\xbf\x1b\xa0\x90\xe3\x7b\x62\x5f\x16\xd3\xc6\xd0" - "\xb1\x63\xd3\x99\x7f\xad\xac\x80\x30\x69\xde\x1b\xd3\xa4\x3a\x34" - "\x63\x9e\x2c\xf9\xb3\xdd\xf1\x84\xb3\x02\xa6\xba\xe2\x50\xb2\x3f" - "\x0f\x1a\x11\x82\xe6\x4c\x20\xd8\x2a\xc3\xe0\x1a\x8e\xd7\x8c\x6e" - "\xf9\x9e\x4c\x1b\x71\xcc\x16\x2a\x03\x1d\x9c\x12\xc0\xe3\x58\x65" - "\x35\xb0\xd8\x0b\xd1\x4e\x47\xc0\x7c\xa7\x1c\x7e\x03\xe8\x7c\xa7" - "\x82\x8d\x13\x69\x32\x6d\x60\x67\xed\x93\x69\x3d\xc6\x6b\x03\x1c" - "\x1b\xa3\x1d\x69\xc6\x68\x27\x75\xcc\x07\xfb\x1d\x7e\x4f\xe0\x99" - "\xf1\x68\xe7\x09\xca\x62\xd6\xe0\xd9\x7a\xee\x67\xb0\x1a\xf7\x50" - "\x3e\x07\x18\x2e\x69\xe7\x31\x89\xa3\x57\x7e\x7f\x6c\xfe\x4a\x33" - "\x8f\x49\x7c\x86\xc7\xf1\xe6\xb1\xce\x49\x1a\x94\x73\x60\xbe\x33" - "\x40\x1b\xed\xec\xa2\xec\xdc\x6b\x96\x42\xdb\x5f\x9c\xe1\x3e\xe7" - "\x2f\xb2\xbe\x98\x4a\xf3\xb2\xd6\xd1\xac\x2f\x55\x34\x6f\xbd\x82" - "\x1a\x77\xe3\x7c\xa7\x8c\x66\x35\x35\xc1\x3d\xa4\x1f\xdb\x41\xf3" - "\x8c\x0a\x9a\xd5\x9c\x0a\xbf\x70\x7f\x7c\x26\xcd\xcb\x86\xfb\xaa" - "\x30\x78\x2f\x83\x66\xed\xc5\xf7\x08\xcd\xfa\x50\x01\xbf\x70\xff" - "\xa1\x03\xf2\xc1\xfd\x47\x36\xf8\x85\xfb\x7d\x6d\xad\x32\x45\x0b" - "\xbc\x03\x69\x96\x70\xfe\xad\xef\xc2\xd9\xb7\xb2\xce\x84\xf3\x6f" - "\x9c\x0d\xe7\xdf\xb0\x85\xf3\x6f\x74\x84\xf3\x6f\xec\x87\xf7\xb2" - "\x8c\x34\xeb\xe3\xd9\x90\x0f\xea\x5a\xbd\x0f\x7e\xe1\xfe\x93\x29" - "\x90\x0f\xee\x3f\xdd\x0a\xbf\x70\x5f\x0b\x75\xc9\x86\xfb\xba\x75" - "\x90\x3f\x97\x66\x99\xec\x90\x4f\x45\xb3\x0e\x2e\x86\x5f\xb8\x3f" - "\x64\x86\x7c\x70\xdf\x00\xe5\x18\xe1\xfe\x70\x35\xe4\x87\xfb\x4e" - "\xac\x4f\x21\xcd\xea\xc2\x72\x01\x9b\x4e\xcc\x0f\xf7\x14\xca\x33" - "\xaa\x69\x0e\xa9\x84\xdf\x42\x9a\x23\x8f\x87\xfc\x70\xaf\x80\xb6" - "\x66\x6d\xa2\x39\x81\x15\x90\x2f\x8c\xe6\x0c\x87\xf4\xf5\x70\x1f" - "\xa4\x86\x7c\x70\x3f\x02\xf3\xc3\xbd\x4a\x0f\xf9\xe1\x3e\x04\x69" - "\x54\x44\x73\xd4\x49\x90\x4f\x43\x73\x46\x37\xc0\x2f\xdc\xdf\x88" - "\xf5\x87\xfb\x9b\x37\xc1\x2f\xdc\x8f\x01\x5a\x65\xc3\x7d\x38\xd4" - "\x2f\xab\x98\xe6\x8c\xc7\xf2\xc3\x69\xce\x6d\x48\x1f\xb8\xbf\x23" - "\x03\xf2\xc1\xfd\x9d\x40\x0f\x23\xdc\xeb\x66\x40\xfe\xf0\x3e\xf9" - "\x99\xf3\x63\x2d\x5d\x33\x8c\xd0\x9c\x9f\x6c\xa2\x6b\x86\xc3\xef" - "\x03\xd3\xe8\x9a\x40\x1d\xcd\x89\xdc\x0a\xe9\xf0\xfb\xd3\x70\xb8" - "\x9f\x24\xde\xc3\xef\x4f\x6d\x70\x1f\x21\xde\xc3\xef\xff\xa9\x81" - "\xfb\x29\xe2\x3d\xfc\x3e\x38\x1b\xee\x23\x69\xce\xbf\x4d\x82\x7b" - "\xf8\x7d\xb0\x0a\xee\xa7\x8a\xf7\xf0\x3b\xd5\x0a\xbf\x0e\xeb\xb8" - "\x98\x19\xd6\xe0\xb9\xc4\x1a\x9c\x63\x40\x5d\xee\xcc\xcf\xca\x10" - "\x42\xd6\x63\x8c\xca\x61\xe9\xe7\xc9\xf0\x56\xd9\xf0\xcd\x28\x27" - "\x4c\xa9\x66\x16\xdf\x4f\xf4\x5b\x39\xac\x59\x36\x0c\xe3\x45\x62" - "\x8c\x06\x39\xb4\xbd\x92\x66\x06\xb6\x43\x9b\xa7\xd2\xcc\x91\xcd" - "\xf0\x0b\xf7\xa3\x0e\x41\x9b\xe1\xfe\xa7\x39\xf0\x0b\xf7\xcf\x3c" - "\x0a\x6d\x9f\xda\x91\x35\x5c\x65\x96\x29\xd8\xba\x2b\xfd\xd3\x53" - "\x71\xa1\x8e\x74\x1a\xed\x00\x7d\xb0\x79\x63\x44\xa8\x23\x8e\xd0" - "\xbc\x0d\xea\x50\x8c\xc3\xb1\x25\xc6\x48\x43\xe6\xb2\x3a\x61\xac" - "\x1d\xda\x35\x41\xce\xbf\x3d\x92\x36\xcb\x86\xff\x0c\x63\x42\xd0" - "\x90\xa5\xde\x9e\x3f\xcd\x9e\x8f\xdd\x18\xc5\x9f\xab\x89\xeb\xf9" - "\x6f\xf0\xf9\xca\x50\xf4\xad\x3e\xfe\x91\x28\xb3\x6c\x78\x29\xe6" - "\x31\xcb\x86\x41\x1d\x03\x88\xc9\x66\x11\xdb\x38\x1c\xf3\xfd\x11" - "\xdf\xf3\x36\x6f\x23\xe4\x16\xe8\xf3\x40\x6e\xe1\x38\x16\xf4\x97" - "\x5c\x9b\x36\xa1\xa2\x59\x16\x64\xd8\xc2\xe6\x27\x36\x2a\xb9\x3c" - "\x53\x3e\xd0\x95\xb3\x7b\x9e\x76\x55\x28\x94\x17\xf4\x4a\xba\x9d" - "\xda\xaa\xd2\x1e\x05\x59\xc8\xd2\x8b\xd8\x99\x1f\xfe\xff\x3a\xb6" - "\x97\x93\xff\x6f\x60\xf3\xc6\x50\x16\xbe\xeb\x3e\x6e\x70\x66\x45" - "\x38\x84\x90\x8d\x6a\xb6\x16\x2e\x53\xfe\x6c\xb7\x60\x96\x87\x26" - "\x91\x40\xed\xaa\x3d\x50\xbe\x32\xc3\x63\x8c\xd9\x9d\x97\x3d\x4b" - "\xf8\x00\xf2\xbe\x89\xf3\x41\x59\xca\xc2\xee\x98\xc8\xd0\x86\x0d" - "\xa8\xbb\xe4\x24\x0a\xf5\x29\xb3\x59\x65\x41\x6a\x3c\x9d\xe4\x50" - "\xe5\x58\x1d\xb9\x73\xac\xce\xdc\x8d\x4a\x9a\xbf\x51\x1d\xe2\x90" - "\x71\x5f\xbe\xb2\xa0\xe9\xf7\xda\xd1\x46\xfc\x04\xdb\xe7\x14\x86" - "\x3d\x18\x31\x39\x85\xc8\xab\x12\xbf\xc4\x77\x1f\xa2\x59\x0f\x17" - "\x99\xda\x1a\x49\x55\x22\x2b\x6b\x2a\xcd\x7a\xdc\x22\x0c\x9b\x1e" - "\x56\x82\xb6\x76\x0a\xce\x95\x1d\xc2\xf7\xf6\x02\x9d\x41\x0f\x04" - "\x85\x4b\x75\x41\x1d\x90\x07\xb4\x43\x3b\x18\xfd\x57\xcc\x77\x3a" - "\xd1\x1f\x9c\xd1\x0c\x74\xe0\x3a\x32\x08\xfd\x89\x11\xfe\xdd\xa0" - "\x39\xc2\x88\xdd\x33\xea\xe6\xe1\xba\x9f\x1a\xfd\x6b\xd9\xd8\x99" - "\x77\x8c\x56\x2c\xa0\xde\xe6\x79\xdd\x79\xb7\xe4\x05\xc3\xfc\x55" - "\x86\x65\x89\x49\xf3\x97\x1b\x1e\xd4\xc2\xe0\x4f\xbb\x6c\xa1\x76" - "\x49\xc2\x92\x65\x89\x2b\x7b\xf9\xf4\x81\x7a\xed\x04\x6c\x30\x99" - "\x7c\x00\x6c\x70\x36\x07\x2f\x1b\xb9\x0e\x79\xbd\xf9\x0f\x3c\x66" - "\x06\xe4\x01\xfd\xff\x12\x9b\x4b\x17\x8a\x36\xea\x68\x71\x8c\x31" - "\x1b\xfd\x76\x2c\xc7\x98\x0c\x56\x62\x22\xed\x3c\x8e\x2e\x8b\x91" - "\x07\x63\x82\xe4\xd5\xb4\x2a\xb9\x1d\x31\xae\xa4\x79\x39\x1a\xc0" - "\x78\xfd\xc5\xbc\xb9\xfa\x66\xd9\x48\xfd\xc5\xbc\x1c\xa5\x14\xe3" - "\xc8\x99\x9b\xa3\x17\x54\x05\x19\x18\xe3\xa8\x8b\x6a\x48\x2d\xd0" - "\xb2\xd3\xb8\x7b\x0a\xc8\xf8\x88\x2d\x99\xb4\xc2\x09\x63\x24\xe6" - "\x73\xe6\x4f\x4f\x45\x39\xa9\x4e\xe1\xcc\x24\x4a\xf8\x0d\xa1\x21" - "\x85\xe5\x5d\xaa\x0d\x04\x9f\x63\x6c\x23\x67\x97\x8e\xa4\x35\x50" - "\xe1\x3f\xf4\x80\x9b\x4c\x30\xb2\x31\x96\xab\xfe\x34\x81\xf4\x11" - "\x42\x7e\x4e\x61\xeb\x0c\x22\xc7\xbc\x60\x9f\x91\x79\xf0\x7f\xea" - "\x02\x12\x0c\xf9\x42\x53\x0f\x40\x7a\x87\x6e\x84\x23\x5d\xa7\xec" - "\x4c\xd7\x8d\xe8\xa2\x3a\x95\xa9\xc5\x4e\xba\xee\x7c\x6a\xd6\x3d" - "\x56\xa2\xd8\x0c\x76\xdc\x16\x01\xfa\x57\x71\x8c\xc1\xf9\x9a\x6e" - "\x98\xe3\x35\x9d\xa2\xab\x4b\xa7\x74\xac\xd0\x29\x3a\x57\xe8\x86" - "\x75\x75\xe8\x94\xa6\x78\x2b\xf9\xc4\xfa\x67\x52\xd7\x62\x61\xf3" - "\xb4\x5d\xc1\x85\x95\x5d\xc1\x39\xc5\xaa\x16\x12\x36\xd9\x00\x76" - "\x1c\xd8\xb7\x6f\x80\x6d\x0f\x98\x50\x39\xb6\x3d\x15\x45\xf3\x0a" - "\xe3\x80\xbe\x4f\x4c\x9f\x48\xbf\x77\x66\xa9\xc3\xb4\x8f\x83\x2c" - "\x5a\xa3\xd0\x40\x1a\xe0\x27\x1c\x74\x8b\x06\xe4\x9b\x02\x64\x20" - "\xe8\x4a\xce\x07\xd0\x4b\x21\xd5\x38\x4f\x80\x79\x79\xbe\x1b\xc1" - "\xa6\xc2\xdf\x51\x7a\x16\x73\x35\x2b\x28\x75\x0b\xb3\x21\x46\x66" - "\x48\x36\xc4\x3e\x45\xdf\xbe\x41\x20\xcf\xd6\xee\x31\xb7\x00\xf2" - "\x24\x2f\xcb\xe0\xd5\xaf\x2f\x7e\x3b\x3f\xab\xb4\x50\xe8\xf6\xd7" - "\x0c\xf2\x70\x64\x2d\xf4\x9f\x0c\xf6\x2c\x77\x83\x3a\xed\x2c\x09" - "\xc0\x67\xe5\x17\xec\x72\xbc\xd7\x26\xca\xa8\xc9\x66\x27\x85\xb8" - "\x5e\x11\x1e\x63\x2c\xbf\x60\x95\x23\x5e\xea\x20\x0d\xde\x3d\x5e" - "\x78\x41\x2c\xb7\x68\x63\x44\xfa\x2b\x84\xc5\x2d\xc1\xd8\x47\x88" - "\xa3\xc2\x34\x18\x33\x62\x9c\xa6\xc4\x00\xe8\xc7\xaa\xdb\xe0\x7f" - "\x25\xe6\xa3\xaa\x0d\x6a\x01\xca\x00\x2c\xa5\xd0\xe0\x1c\xbb\x90" - "\x97\x93\x01\x98\x8a\xa2\xe3\x62\x2c\xc2\xe6\x8d\x9a\x8e\x2c\x55" - "\x0a\xd0\xa3\x50\x9a\x83\xa8\x2b\x73\x10\xf4\xb7\x45\x1f\x75\x90" - "\xfd\x49\xe7\xd1\x27\x6f\x80\x35\x68\x77\xa4\x35\xb8\x40\x6f\x0d" - "\x2e\x8c\x13\xf2\x0a\xca\xe0\xda\x61\x48\x24\xaa\x53\xb2\xe0\xa9" - "\xdd\xfe\x62\xcf\x5e\x23\xfe\x62\xc1\x2e\x63\xf6\x19\x60\x07\xed" - "\x2d\x68\xaf\x05\xe3\x8f\xa0\x1d\x86\x32\xb7\x23\x2b\x58\x2f\xd9" - "\x51\x28\x47\x9c\xd9\xbb\xa7\xc1\x15\x05\xe9\x19\x66\x99\x76\xab" - "\x24\x63\x40\xaf\x68\x85\x9c\x5f\x64\x74\xe0\x99\xa8\x2e\xfd\xc3" - "\x98\x17\xe8\x36\x0b\xbe\x15\xe0\xec\xd2\x4f\x85\xeb\x21\xb8\x7e" - "\xee\xcc\xcb\xb1\xc2\xa5\x76\xe6\x15\x46\x39\xf3\xe6\x4e\x80\x4b" - "\x07\xd7\x24\xb8\x22\xe0\x9a\x02\x57\x24\xcd\x9b\x3b\x15\x7e\xf1" - "\xf9\x34\xb8\x66\xc0\x35\x13\xae\x59\x70\xcd\x76\x6e\xde\xa8\x15" - "\x00\x9f\x70\xe1\x6f\xb8\x33\xaf\x20\xa5\x6f\x9f\x25\xad\x3c\xce" - "\x42\xe0\x31\x1a\x8a\x71\x78\x53\xcf\xa3\x2f\x48\xcb\x7e\x9d\x6d" - "\x70\xfe\xe6\x65\x21\x5e\xfd\x85\x62\xf9\xd0\xb7\xba\x06\x59\x9e" - "\xf7\xb9\x13\xcd\x46\x9d\x23\x3c\xa6\x1e\x7d\x9f\x43\x7f\x96\xd5" - "\xc5\xb5\x90\x68\x2b\x49\xaf\x69\xe9\x24\xe9\xf1\xd4\xc9\xc6\xd1" - "\xa9\x78\x0e\x65\x99\x0d\x31\xec\xa4\xb1\xda\xae\xdc\x1c\x8d\x53" - "\x55\x10\x45\x55\x05\x29\xcc\xbf\x24\xc8\x1e\x8c\x6b\xd6\x3d\x86" - "\x44\x4c\xc1\x38\xb2\xb6\xed\x3c\x79\x2d\x9e\x0a\xb5\xc0\x4d\xf4" - "\x21\x19\x2a\x23\x7f\x44\x7c\x49\xe3\xc8\x5f\x35\xd1\x0c\xc0\x4a" - "\x90\x13\xe8\x26\xe0\xf8\x11\x70\x85\x63\x49\x09\x5b\xa0\xcb\xd4" - "\x52\x2c\x28\x3a\x2c\x24\x0c\x9e\x29\x30\x56\x54\x31\x8c\x1f\x8b" - "\x93\xc9\x84\x62\x78\xc6\xe2\x7a\x42\xbd\x9f\x34\x84\x52\xe1\x65" - "\x1d\x29\x79\x89\x28\x83\x4f\xf3\x58\xb1\x4e\xa0\x7d\x77\xbc\x84" - "\xdc\xb9\xfa\x27\x4e\x6b\xc9\x7e\xdd\x51\xd0\x49\xe5\x20\xbb\xe7" - "\xea\xbb\x40\x6e\x03\x2d\x9d\x83\xa3\x65\x68\xcd\xe5\xa2\x65\x57" - "\x78\x8c\x81\xd3\x33\x8e\x20\xcd\x7a\xd2\x13\x69\xbc\xaa\x05\xe8" - "\x09\x74\x35\x35\x38\x49\x88\x8c\x2c\x90\xe8\xf9\x26\xd0\x13\x68" - "\xaa\x41\x9a\x02\x3d\x18\x4d\xa9\x48\xd3\x12\x37\x9a\x82\x6c\x62" - "\xbe\x38\x91\xa6\x02\xd0\xb4\xc4\x0b\x4d\xbb\xc7\xe2\x40\xd3\xb7" - "\x7c\xa2\x69\xd9\x25\xd0\x74\x94\xd6\x1b\x4d\x1d\xa8\x2f\xf3\xe7" - "\xc6\x51\x90\x77\x26\xc7\x27\xcc\xaf\x2c\xd8\x3a\x3b\xc0\x66\x2b" - "\x13\x54\x39\x7a\xa0\x89\x0a\xd7\xf4\x31\x36\x19\xf3\x01\x57\x46" - "\x2f\x3a\xf3\x0b\xab\x30\x0d\xe4\x96\xfe\x5e\xf4\xa3\x67\x30\x93" - "\x12\x39\xad\xa8\xbb\x60\x03\xfd\x12\xf6\x74\x27\xda\x92\xf9\x85" - "\x54\x80\xe1\x3f\xca\x90\xe7\x26\x12\x45\x27\xc8\x09\x43\x32\xb9" - "\xb5\x10\x64\x5d\x27\xc8\xce\x53\xb2\x51\xb6\xe9\x06\x81\xc2\x95" - "\x8e\xfe\x51\x85\xe0\x82\x32\x90\xd5\x8c\xbf\xc8\x33\x5c\x2b\xac" - "\x7d\xee\x43\x28\x6f\xf4\xf1\x4f\xe3\x1c\x24\x5d\xdf\x9b\xbf\x42" - "\x7a\xac\xd6\x99\x3b\x70\x3f\xc1\xf8\x88\xa9\x16\xe4\x6b\x39\x31" - "\xb5\xb8\xfa\x89\xb0\x82\xcb\x60\xe4\x05\xf6\x0b\xec\x23\x05\x6e" - "\xb2\x17\xe4\xba\x7a\x8b\x18\x2f\xc4\x09\xb2\x17\xf2\x2a\xd0\xaf" - "\x2a\xc6\x11\xe9\xb3\x7f\xbc\x06\xfd\x63\x15\x8b\xe5\xa4\x01\x7a" - "\x94\x77\x76\x70\x1e\x22\xcf\x4c\x8e\x6a\xc6\xbf\x42\x51\xd6\x73" - "\xba\x17\xbc\x46\x69\x2c\x71\x42\xdd\x85\xfc\xc2\x72\xda\xa1\x1f" - "\x81\xf3\x8a\x30\xd6\x8d\x08\x8d\x07\xbb\xe1\x7b\xd0\x05\x4b\x01" - "\x5f\x67\xc8\x84\xb7\x96\x82\x2d\xd0\x81\x31\xd9\xa0\x3e\x2b\x79" - "\x2c\x5b\x21\x2b\x24\x05\x9e\x31\x7f\xaf\x82\xe4\xef\xf5\x9c\x0e" - "\xc7\xe8\xae\xb9\x9d\x65\x3a\xb9\xeb\x9b\x1f\x66\x38\x95\x6d\x16" - "\x76\x36\x5e\x76\xc3\xdb\x7c\x2d\xba\x4c\x8f\x74\x6d\x93\xdd\x60" - "\xe6\xf3\xb9\x6f\x2f\x36\xa4\x91\xe1\xa7\x64\x37\xbc\x0e\x76\x55" - "\x9c\x01\xe3\x72\x4b\xcf\xd2\x63\x91\x0e\x53\x26\x67\x90\x0c\x67" - "\xf6\x69\xa5\x29\xe5\x34\xfa\x4f\x1c\xa4\xec\xbd\x81\xf9\x8f\x74" - "\x1a\x3f\x5c\x07\x74\x8a\x12\x72\x3e\xcc\x05\x99\x12\x41\x5f\x86" - "\xb6\xbe\x04\x6d\x3d\x05\x74\x3d\x05\x6d\x5d\x21\xb6\x55\x8c\x53" - "\x27\x00\xfd\xe1\x59\xdf\xba\x4f\x6a\xeb\xcb\xe8\x2b\x7d\x5b\xe4" - "\xea\xd3\xe4\x06\x7a\x3b\xae\xcf\xb2\xb3\x8b\x1d\x26\xc7\x51\x82" - "\xdf\x65\xba\x39\x77\x6e\xe4\x1c\xc0\x23\xd2\x1c\xec\x81\x52\x1a" - "\x92\x53\x28\xf1\x01\xeb\x43\xbb\xf4\x23\x4a\x96\x42\x7d\x90\xf6" - "\x67\xc8\x24\xec\xcf\x40\xfb\x09\x25\x48\x7f\xcf\x58\xd1\x61\x8c" - "\x07\xc3\x80\x07\x4b\x45\x1e\x64\x8b\x3c\x00\x3b\x11\xf4\xb4\x12" - "\xf4\xaf\xa6\x24\x93\xf3\x60\x70\x34\x0a\xab\x1f\xe2\xfe\xba\xcf" - "\x7b\x7f\xd5\x04\x77\xf2\xb1\xa1\x0c\xfd\xce\xd2\x90\x8d\x01\x42" - "\x17\xf4\xdb\x7c\xb1\xdf\x52\xfd\xcf\xa5\x3e\xdb\x2a\xbb\x71\xbb" - "\x6f\x7d\xf6\xa6\xcd\xff\x4b\xfb\x6c\xd8\xe5\xed\xb3\x37\x2f\xf0" - "\xec\xb3\x37\x6f\xf2\xec\xb3\x37\xff\xd2\xd5\x67\xc5\x67\x43\xd2" - "\x67\x6f\x8e\xbb\x3a\x7d\xf6\xe6\xb8\x3e\xfa\xec\x56\x1f\xfa\xac" - "\xc6\x4b\x9f\xd5\x5c\xbe\x3e\xab\x59\x77\xe5\x74\xec\x2d\xfb\x3b" - "\xe5\x7d\xe8\xd8\xd7\xdc\x74\x6c\x30\xea\xd8\x31\xb1\x7d\xf5\xd7" - "\xae\x62\xe8\xaf\x2a\xb1\xbf\xfe\xc7\x3f\xa0\xbc\xb1\x31\x9f\x34" - "\x0d\xdc\x5f\x1d\xc5\x2e\xfb\xc9\x6b\x9f\xd5\x63\x9f\x2d\x23\x26" - "\x33\xeb\xb3\x0b\xa4\x3e\x5b\x2c\x8e\x75\xfa\xe9\xb7\x61\xde\xfa" - "\x2d\xc6\xee\xc2\xb8\x5d\xfd\xf6\x5b\xd1\x5e\xea\x1a\x87\xfd\xb6" - "\xea\x1a\xd3\xb5\xb7\x8c\xf1\xec\xb7\xb7\xcc\xf4\xec\xb7\xb7\xc8" - "\x5c\xfd\x56\x7c\x36\x24\xfd\xf6\x16\xcd\xd5\xe9\xb7\xb7\x68\x7e" - "\x38\xba\x36\x7c\xea\x95\xd3\xb5\xb7\xae\x61\xfd\xd6\x9b\xae\x4d" - "\x17\x75\x6d\x30\xea\xda\x71\x37\xfa\xd6\x77\xc7\x07\xff\x2f\xef" - "\xbb\x97\x59\xe7\x8e\x3f\xec\xd9\x77\x6f\x55\x7a\xf6\xdd\xf1\xbb" - "\x5d\x7d\x57\x7c\x36\x24\x7d\x77\x7c\xc3\xd5\xe9\xbb\xe3\x1b\x7e" - "\x38\x3a\xf7\x56\xbb\xb7\xbe\xab\x1d\x4f\x32\x9a\x65\xda\x18\x53" - "\x31\xdb\x43\x97\x61\x72\x3c\x48\xd8\xbe\x13\x99\x76\xa5\x49\x13" - "\x49\x84\x9c\xdd\xe5\x18\x57\x05\xf7\xbf\xfc\xde\x6d\x7f\x09\x5f" - "\x7f\xd5\x6e\x96\xf6\xc7\xbc\x25\xc6\x5e\xe9\x6f\x7f\x0c\x35\xee" - "\x8e\x12\xdf\x6b\xe0\xd8\xd8\x3d\x4d\xba\x67\xbe\x60\x64\xda\x46" - "\x9a\xbd\x7b\xaa\x35\x68\xf7\x54\x6f\x6b\x24\x21\x6b\x28\xc5\x3d" - "\x21\xe7\xc6\xc7\x58\xcf\xe5\x10\x52\xc8\xd6\x1f\x6e\x53\xc3\xbb" - "\x91\x6c\x3f\x43\x48\xa0\xf9\x5c\xe6\x2c\x02\x69\x13\xa4\x34\x16" - "\x2f\x3b\x33\x80\x0a\xf0\x8c\xe6\xcf\xa9\xc1\xd8\x7a\xe8\xa7\x78" - "\xf2\x05\xc4\xe2\x6d\x53\x40\x46\xb0\xfd\x1e\x6c\xcd\xfd\xe6\x5b" - "\x6c\x25\xed\x44\x51\xb7\x8e\xed\x7b\xc3\x7d\x35\xa5\xf9\x88\xff" - "\x80\xbb\x8b\xa8\x5c\x41\x84\x2d\x31\x8d\x34\xb8\xa0\x9c\xed\x03" - "\x06\xac\x48\x7b\x6d\x30\x06\xa1\x30\x2e\x26\x45\xf2\x95\x4b\xa1" - "\x7e\x1f\xa4\xe1\x39\xd1\x00\x5a\x92\x48\xd4\x70\xa9\x68\x5e\x41" - "\x39\xd4\xab\x52\x9a\x3b\xf4\xba\xa7\x1b\x63\xfe\xde\xa2\x51\x88" - "\xfb\x7a\xd0\x67\x00\xdb\x1f\x58\x20\x17\x8c\x4e\x48\xa7\x99\xe9" - "\xd4\x94\xe2\x20\xa1\x40\x0b\x5c\x6f\xc7\x98\x60\x42\x49\x8c\x75" - "\xed\x58\x42\xfe\xba\xca\x22\xc7\xbd\x17\xce\xff\xbc\xc5\x56\x95" - "\x76\x3f\xae\xc7\x33\xff\xff\xad\xb2\xdb\xdf\x8b\x3e\xc9\xe3\xfb" - "\xc2\xff\xfb\x71\xdd\xe1\x09\xb8\xc7\xf5\x6c\xe1\x9c\x46\x81\x79" - "\x21\xfd\x95\xaa\xe4\x2f\x49\xa8\x81\x28\xf3\xa1\x6d\x62\xde\x28" - "\xcc\x6b\x96\xdd\xce\xce\xba\xc1\xfd\x6c\x9c\x2b\x87\xf7\xd8\x3c" - "\x29\x2d\x8e\x69\x64\xf2\x21\xb7\xa0\x1c\xda\xdf\xc8\xf6\x7d\x42" - "\x3b\x0b\xa0\xcd\x90\x47\x85\xfb\x6d\xd8\x6f\x1a\x51\x6f\x82\x34" - "\x2c\x07\x7e\x55\x6c\xcf\xaf\xec\xf6\x08\x2c\xdb\xeb\x59\x01\x55" - "\x41\x39\x05\x6c\xf3\xb3\x33\xb2\x83\xcd\xb2\x3b\xe2\x43\x65\x94" - "\xc2\x37\x53\xd6\xe2\x1c\x36\xee\xcf\xc6\x3d\xe7\xb2\x3b\x1e\x82" - "\xf2\x15\x6f\xb1\x39\xdb\x3b\xc2\xcd\xb2\xdb\xaa\xbb\xf7\x0e\xb0" - "\x75\x96\x3b\x92\xf0\x3b\xf8\x8e\x98\x9f\xed\x31\xc4\x3a\x6b\xd3" - "\x02\x28\xdc\x3f\xcb\xf7\x70\x2b\x17\xc2\xfb\xae\xf8\x3f\xfc\x3d" - "\xc0\xd2\x1d\x06\xe0\x19\xdb\x2f\x85\xf7\x5e\xf7\x14\x8b\x7c\xab" - "\x05\x6b\xa2\x17\xef\x24\x8c\x00\x2e\x24\x8c\x60\x7d\xdf\x49\x33" - "\xcb\x99\x3e\x92\xdd\xe1\xc4\x7c\xf9\xc0\x43\xe7\x9b\x1a\x05\x9b" - "\x97\xee\x42\xbe\x34\xc3\xb3\x09\xef\x22\x5f\x0a\x40\x17\x88\x79" - "\x1b\x5d\xf5\xc7\xfb\x09\x8c\x9f\x02\xf0\x82\xef\x59\x9a\x90\xcd" - "\xe2\x2f\x81\xcc\xc0\xbd\xe6\xfb\x52\x08\xae\x7f\x36\x52\xc0\xc8" - "\x5f\x13\xed\xf2\x92\x64\x9e\xfe\x41\xbb\x5d\x5e\x70\x8a\xb0\x75" - "\xad\xbc\x97\x88\x02\xf4\x90\x02\xcb\xa4\xe1\x31\x29\xf7\x4a\x7c" - "\x5c\x05\xbc\x4b\x06\xec\x02\xcd\x0b\x80\x7e\x25\x9d\x6c\x9d\x26" - "\xa5\x44\x20\x2a\x01\xf2\x99\x65\x13\xf6\x41\x79\xea\x2d\x37\x51" - "\x2b\xee\x89\x06\x1a\xae\xea\xc8\x9a\xd0\xed\xff\x0d\xeb\x84\x7b" - "\x9a\xf3\x70\x9f\xbe\x6c\x42\x38\xc7\xd0\x1d\x6d\x52\x9b\xbd\xd1" - "\x33\xef\xaf\x24\x3c\x6f\x32\x89\x14\x94\xad\x16\x1a\x70\x4b\x29" - "\xce\x37\x3f\xd9\x86\x3e\xa7\x2c\x24\xfa\xb7\xc7\xa8\xc9\xea\x24" - "\x42\x50\xab\x05\xd7\x20\x9c\x6b\xef\x1e\x1d\xbd\x12\xe8\x05\xfa" - "\x3e\xdd\x4e\xd4\xa6\x34\x2b\x8f\x13\x48\xce\x12\xe7\xab\x20\xc3" - "\x41\xae\x83\x4e\x55\xa4\x9f\x25\x63\x90\x5e\x42\x70\x8e\xa6\x55" - "\x76\xe7\xf2\x39\x49\x24\x63\x70\x72\xf4\x4e\xb6\xff\x13\xed\x0b" - "\x90\xf9\x72\xdc\x57\x67\xb2\x82\x7d\x92\x97\xa3\x19\x64\x39\x5e" - "\xe3\x4a\x61\xbb\x05\x9c\x87\x16\xdb\x1c\x8d\x6d\xb6\xd9\x09\xce" - "\xe5\x3f\xf9\x0a\xfa\x3a\x3e\x4f\x84\xec\x56\x0b\xb6\x19\x6c\x9d" - "\xa2\xc1\xcf\xe9\xff\x48\xd1\xdf\xb7\x29\xd0\x5b\x58\x7b\x4b\xa9" - "\xa0\x2a\x28\xc2\x6f\x63\x1d\xf0\x9c\xce\x93\xe7\x09\xa3\x3b\xd2" - "\xdf\x64\x77\x12\x1a\xe4\x5e\x07\xc7\x60\xeb\xe0\xbd\xfd\x93\x49" - "\x78\xee\x5f\x39\xdf\x9d\x6b\x45\x1a\xe8\x71\x0d\xac\xa0\x08\xe3" - "\x63\x3c\x89\x75\xb0\x9e\x26\x4f\x9c\x26\x8c\xff\x26\x5d\x1b\x71" - "\x06\xdc\x3d\x1a\xf7\x12\x20\xff\xd3\x1c\xc0\xff\x0b\x76\xf4\x6f" - "\x64\x35\x65\x5c\x24\x68\xbf\x38\xce\xe9\xe4\xbd\xf9\x7f\xd7\xf2" - "\x39\x29\x83\xe5\xff\x5d\x43\xc4\xff\xbb\xae\x81\xf6\xeb\xfc\x68" - "\xbf\x6e\x88\xda\xaf\xbb\x06\xda\x3f\xd1\x8f\xf6\x4f\x1c\xa2\xf6" - "\x4f\xf4\xda\xfe\xc7\xc6\x08\x94\xed\x31\x09\xc9\xca\x40\x1d\xc0" - "\xf5\xd5\xdd\x4b\x70\x0f\x09\x3b\x97\x25\xde\x13\x7e\x4e\x4b\xd9" - "\xe3\x5e\xd5\xe3\x5e\xdd\xe3\x3e\xac\xc7\xbd\xa6\xc7\x7d\xb8\x74" - "\x0f\x7a\x24\xf0\x8c\x6c\xe2\x51\xb0\x4b\x33\xcc\xb2\xbb\x53\xc4" - "\xe7\x13\xd0\xff\x17\xe8\xf4\x09\xfd\xc4\xaa\xbc\xe5\x94\xec\x6e" - "\x76\x4e\x8e\xae\x1d\xab\xa3\xab\x32\x88\x90\x3b\x77\xda\x93\xab" - "\x41\x76\x01\xff\x68\x97\x66\x18\xd8\x08\x37\xa3\x8f\x39\xdc\x73" - "\xa0\x4d\xc4\xbd\x24\x77\x1f\xc4\xf6\x4d\x36\x54\x11\x21\xe0\x6e" - "\xb6\x96\x2f\xe4\xcd\x9d\x66\x0d\xb8\x7b\x2c\xdd\xbc\x51\x9b\x2f" - "\x17\x94\xf9\x99\x82\x76\xb5\x95\x5a\x67\x9e\x05\x39\x74\x1e\xfd" - "\xbe\x03\x8f\x93\xa8\xb5\x2a\xf1\x34\xd4\xf7\xc7\x3f\xab\x4d\x85" - "\xb2\xe1\x3b\xf0\x2d\x18\xc7\xcd\x9d\xc0\x63\xac\xcf\x9d\x56\x67" - "\xab\x26\x18\x0f\x48\x2c\x33\x8a\x06\xcf\x9d\x80\x65\xf6\x69\x9f" - "\xe6\x66\xed\x84\x6f\x3e\x38\x47\xa7\x20\x74\x8d\x22\x6c\x70\x3c" - "\xfd\xf1\x3c\xaf\x76\x6f\xee\xfa\x29\xbc\x5c\xa5\x3f\xe5\xee\xec" - "\xa7\x5c\xb1\xbe\x6a\x3f\xca\x9d\xa4\xf2\x5e\xae\x51\xac\xaf\xd6" - "\x9f\x72\xe3\xfb\x29\x57\xac\x6f\x94\x3f\xe5\x56\x7a\x2f\x37\x5b" - "\xac\x6f\x86\x1f\xe5\xde\x13\xe6\xbd\xdc\xac\x9d\xfe\x61\xe1\x1e" - "\x7d\x7f\x58\xf0\x0f\x07\xf7\xf4\xd3\xfe\xf5\x3b\xfd\xc3\xc0\x64" - "\x75\x7f\x18\xf0\x8f\xff\x93\xfb\xe5\xbf\x7f\xbc\x9f\x5c\xd1\x1f" - "\xef\xfd\xe3\xfb\xbd\x5e\xf1\x8f\xb6\x3c\xf0\xde\x40\x43\x36\xaa" - "\x85\xfc\xb9\x06\x21\x24\x2b\x71\xad\x10\x45\x1e\x03\x19\x16\x5a" - "\x44\x46\x45\xb1\xf1\xf1\xbd\xa5\xab\x8b\x89\x1c\xc6\xbb\xf2\xb7" - "\x57\x35\xca\x4d\x8e\x48\xd4\x39\xce\xad\xc9\x76\xd9\x1d\x90\xbe" - "\x17\x10\x60\x03\xbb\x93\x97\x33\xd7\x90\x9f\x16\x45\x44\x9f\x17" - "\x36\x3c\x67\x1c\x0d\x72\xcc\x54\x64\xc7\x3d\x2b\xa3\xe0\x3d\x07" - "\xe0\x17\xca\xb0\x93\x77\x04\xab\x2c\x2a\x91\xe5\xb3\xb2\xf3\x75" - "\xf9\x59\x89\x34\x5d\x87\xbe\x0f\xad\xad\xb2\x88\xa0\x00\x2b\x91" - "\xa3\x8f\xa2\x8e\xac\x08\x85\x59\x16\x61\x13\xcf\x93\xb6\x31\x1f" - "\x9d\x50\x5f\x3c\xab\x89\x79\xd1\x57\xe7\x64\x03\x91\xa3\xff\x74" - "\xc8\x1b\x81\x7e\x3b\xfb\x3b\x97\xed\xcc\x2d\x98\x8d\xef\xd3\x5c" - "\xd0\xa1\xa7\x89\x1c\xcf\x62\xc2\x38\xa0\x3e\x1f\xc6\x10\xd3\x27" - "\xe2\x9c\x47\x3b\x49\x5b\x4d\x05\x9c\x7f\xa2\xaa\x1c\x25\xee\x8b" - "\xe3\x7b\xbc\x23\x6a\x4a\xf8\x9e\x6f\x3b\x8b\x15\x0c\xf7\x6c\x1c" - "\x83\xfb\x62\x54\x73\xec\x34\x3f\x38\xaa\xce\xd6\xce\xe2\xfd\x34" - "\xcb\x22\x6a\xd1\x7f\xe2\x39\x55\xc1\x2c\x9b\xaa\x20\x16\xea\x55" - "\x2d\xb5\x01\xbf\x2f\xa5\xe3\xb8\x0d\xf3\xc1\x73\x8b\x74\x4e\xdb" - "\x4b\xec\xec\xd1\xd1\x1a\x6a\xed\xf6\x8b\x21\xbb\xff\x09\xa4\x3d" - "\xd8\x0a\x33\x6c\xe9\xba\xf1\x7c\x1e\xe3\xbe\x24\x1c\x0f\x43\xbd" - "\xa7\xf0\xb1\xe9\xdc\x29\xcc\x87\x2e\xe8\x80\x39\x3a\xf9\x20\xed" - "\xd6\xfb\x98\xfe\xaf\x1a\x8f\x3a\xf2\xfe\x07\xa0\xfc\x7f\x6b\x96" - "\xdd\x57\xc4\xc7\x62\x73\x67\xb0\xf3\x89\xb2\xfb\xa6\xc0\x37\x66" - "\xd0\xdc\x39\x56\xcc\x07\xcf\x2b\xc4\xe7\xb3\xdc\x9e\xcf\xc2\x7d" - "\x92\xe2\x73\x71\x2c\x37\x77\xb6\xdb\xf3\xd9\x86\xf1\x38\x37\x71" - "\x3f\x9b\x8b\x01\x7d\x16\x81\xba\xad\xdb\xcf\x47\xf0\xdc\x08\x31" - "\xdf\xb4\x36\xd9\xfd\x63\xce\x01\xb6\xe0\xf9\x4c\xb7\xf7\x67\x7e" - "\x94\x12\x41\x1e\xdb\x82\x34\xbc\x7f\x92\x59\xbe\x41\xc7\xc7\xb3" - "\xf7\x45\xb2\xb6\xab\xe6\xea\xdc\xcb\x83\x74\x3b\x94\xa9\xb3\x81" - "\x1d\x05\xff\x6b\xf1\x9b\xee\xf4\x96\x4e\x49\x6a\xe3\x97\x2c\xd0" - "\xbe\xb0\x6c\xf9\x52\x3c\xe5\x36\xc2\x63\x7f\xa3\x1a\xcf\x81\x0a" - "\xb9\x1b\x22\x4d\x45\x78\x2e\x4d\xcd\xce\x73\x6f\x02\x3e\x3a\xf2" - "\x0b\x0d\xce\x90\x42\xe2\xcc\xcf\xd1\xa6\x9f\x27\xf2\x34\x0d\xfd" - "\xa6\x6a\xd5\xa3\xe4\x8c\xec\xfe\xfd\x2c\x16\xaa\x96\xf9\x8a\xb6" - "\x55\xad\xfa\x10\xd3\xd8\x39\x75\x53\x1c\x4f\xfb\x7f\x69\xd5\xf2" - "\x3d\x69\x8d\xf2\x9a\xb8\x76\xf2\x91\xc6\x4a\xf6\x69\xdb\x49\x31" - "\xa6\x0b\xf5\x72\xdc\x37\x7a\x46\xf6\x93\x7b\xf0\x5b\x38\xc6\xc7" - "\xff\xf9\x7c\xc5\xfd\x7f\xc3\xef\xa0\x8f\x0d\xa0\xcd\xbb\xf8\x3d" - "\xb3\xec\xfe\x9d\x01\xc5\xb8\x07\x97\xa8\x20\xdf\x2b\x42\xde\x86" - "\x48\xd6\xc7\xb3\xee\x8f\x77\xc8\x55\x7f\x16\xcf\xbd\x31\xdf\xff" - "\x1d\x59\x3f\x99\xe7\x76\xc6\x53\x75\x4e\x4e\x1e\x86\x34\x83\x74" - "\xb6\x00\x63\x8f\x79\x93\x19\x17\x61\x2c\x7b\xb1\x38\x26\x56\x50" - "\x6d\x00\xfa\x6e\x88\xac\xae\x26\x38\x97\x22\xc3\x3d\xb0\x6d\xb2" - "\x07\x66\xd1\xe0\x0d\xba\x34\xec\xa7\x40\x8b\xbf\xe0\x3e\xbe\x90" - "\x42\xc3\x0e\xdc\xb7\x97\x5f\x48\xfe\x9c\x6c\x97\x7f\x52\x53\x41" - "\xb4\x73\xd1\x1e\xfa\xc9\x37\xbf\x8a\xa7\x8e\xbb\x1b\xaa\x48\x4d" - "\xcb\xff\x90\x4f\x9b\xaa\x89\x6a\x1e\x09\x48\x37\x53\x27\x1b\xef" - "\x27\x11\x79\xb4\x99\x04\xa4\x9d\xc7\x7e\xea\x24\xe9\xcb\xe1\xd7" - "\x5e\x0b\x36\xce\x32\xdb\xdb\x69\x96\x40\xed\x53\x84\x40\x7f\x62" - "\xeb\xc6\xec\x9c\x8d\x95\x9d\x5b\x0e\xc6\x39\x6c\xb7\xf3\x35\xf6" - "\xd5\xa7\x89\xb2\x56\x7f\x94\xa4\xc6\x51\xc1\xb9\x42\x37\x3a\x3a" - "\x2e\x80\xb2\x33\x36\x29\x90\xd9\x00\x3c\x5d\xa1\x0b\x79\x23\x99" - "\x84\xd5\x25\x99\x89\xc9\x52\x4d\xde\x4c\x24\x61\xb4\x43\x1f\x54" - "\x53\xf3\x09\xa1\x39\x16\xf3\x3b\x69\x55\x81\xd2\x9e\xa9\xd0\x35" - "\x32\x9c\xb3\x0c\xc9\xc5\xbd\x53\x17\x48\xc4\xfc\xe3\x19\x6c\x9e" - "\x15\xe7\xb4\x1d\x1d\x3a\x6d\x57\x87\xee\xf6\xce\x0e\xdd\x78\x69" - "\x2e\xfc\xd9\x45\x6a\xb2\x05\xcf\xe6\x64\xfd\x68\x26\xee\xd5\x43" - "\xdb\xde\x11\xd4\x66\xc1\x79\x6f\xc4\x25\x7c\x3b\x5c\x78\x41\x47" - "\xee\xb5\xb2\xb3\x3f\x38\x17\xaf\x2e\x79\x1e\xea\xdb\xd6\x4e\xdc" - "\xf7\xff\x5c\x5c\xa1\x93\xe3\xde\x1f\x9a\xf5\x13\x63\xe7\x96\x98" - "\x58\xdc\x03\x04\xba\x60\xca\xe0\xfb\xf6\x03\x6c\x6e\x02\xdb\x0f" - "\xfc\x30\xec\x68\x47\xfe\x00\x9f\xda\xad\x72\xe4\x45\x6d\x3c\xf2" - "\xa1\xde\x83\x0f\x8c\x6f\x89\x76\x39\xf2\x03\x79\x81\x3c\x71\xf1" - "\xe3\x30\xe3\xc7\x0e\x81\xf3\xa3\x13\xf4\x80\xc4\x93\x8b\xe1\x31" - "\xfa\xfe\xf8\x82\xfc\x40\xde\xd4\xb4\x1c\x25\x1e\x3c\xb1\x72\x9e" - "\x00\x3d\x47\x4b\x7c\x41\x9e\x98\xda\xc0\xd6\x05\xbe\x3c\x7e\x98" - "\x90\x5f\x4d\xa4\x42\xed\xcc\x43\xdd\xfc\x71\x78\xe3\xcf\x49\x17" - "\x7f\x80\xf7\xbd\xf9\x73\x5a\x8d\x6b\x33\xc8\x9f\xfa\xc1\xf0\xa7" - "\xa6\x85\xf3\xc7\x21\xf2\x67\xe2\x0c\x22\xb7\x77\xe8\xe4\x9b\x93" - "\x49\xe4\xcc\xe3\x5a\xb2\x3f\xb6\x96\x00\xad\x35\x42\x5e\xc1\x0c" - "\xff\xfa\x51\x64\x91\xef\xfd\xe8\xff\x4c\xbc\xde\x8f\x06\xdb\x8f" - "\x7e\x5a\x7f\x69\xfd\x28\x32\xfe\x7a\x3f\xba\x52\xfd\x28\x32\xae" - "\x67\x3f\xea\xd6\xd5\x89\x09\x4b\x16\x2c\x5a\x8a\xc7\xf7\x9e\x5f" - "\x99\x94\xf0\x2a\xd7\xd8\x1e\x3a\x5b\xe3\x4c\x8b\x92\xa3\x4f\xb6" - "\x9a\xa2\x7a\xf2\xce\xd8\x7a\xb9\xf3\x84\x46\x41\x73\x03\x22\x84" - "\xdc\xc0\x0a\xf4\xad\x89\xfd\x6d\x13\xfa\xbd\x90\xfd\x7c\x5f\x5d" - "\x38\x8f\x63\x89\xff\x33\x7b\x25\x3c\xc6\x82\x6b\x24\x6b\x57\x11" - "\xc5\x5a\x3c\xc3\x6c\xc7\xb9\x08\xf6\xfc\x1e\xf4\x35\x48\xb7\xc4" - "\x58\xd0\x6f\x8d\x4d\x35\xc7\xba\x0e\xca\xb2\x06\x6f\x88\x54\x68" - "\xf1\x8c\xc3\x83\x95\xa0\x8f\x53\xbb\xfd\x10\xc9\x1e\xb2\xd2\x61" - "\x0f\xaa\xb1\x9f\xe3\x79\xb3\x33\xb2\x07\xcf\x5e\xcc\x24\xe8\x6f" - "\xc3\x3a\x67\x22\x7c\x67\x5c\x8c\x9e\xf9\x25\x80\x3e\xcf\x9f\x4f" - "\x7d\x1d\xbf\xdf\xa5\xca\xd1\xa2\x9d\x78\x4e\x55\x68\x38\x97\x5b" - "\x48\x3e\x49\x2d\x27\xda\xa7\xb0\xcf\xff\xdb\xb8\xc7\x8b\xa0\xcf" - "\xcf\xaa\x22\xb5\x9a\x3f\x93\x4f\x63\x01\x6b\xb1\x03\xf5\x79\x37" - "\x8c\x8d\xf7\xad\xcf\x4b\xd8\x42\x4c\x21\xb6\x10\x57\x23\x01\x57" - "\x88\x35\x09\x5b\xbf\xbf\xc0\xb1\x15\xda\x44\xd4\x6f\xb4\x03\xbe" - "\x1c\x1c\x5f\x78\x2e\xb8\x36\xe5\x90\xf7\xbe\x7f\xa1\x07\xb6\xe4" - "\x22\xb6\x56\x00\xb6\x56\xb8\xb0\xf5\xcc\x51\x35\x79\x93\x61\xeb" - "\x4e\x17\xb6\xb2\xdb\x2c\x12\xae\x10\x63\x88\x27\xe1\x45\x1d\xc1" - "\xfe\x2e\x61\xac\x64\x21\x5f\xe3\x64\x7d\x5f\x0e\x7d\xbf\xc3\x4d" - "\x87\x8e\xbb\x94\xbe\x3f\x95\xed\x7f\x42\x9e\x20\x7f\x90\x2f\xc8" - "\x8b\x7f\x45\x3e\xa0\x4f\x58\xda\xd1\x17\x2f\x26\x34\x0e\xc4\x0b" - "\xe4\x03\xf2\x83\xf1\x01\xf8\x21\xad\x37\xe3\xfa\x23\xf2\x04\x79" - "\x31\x39\x95\xc8\x91\x2f\x25\xd0\xdf\xb1\x8f\x03\x6d\xe7\x21\x5f" - "\x98\xdd\x9a\x19\xfc\xe2\x26\x3c\x33\x2b\xc6\xdb\xed\xc8\xfa\xb9" - "\xba\xb7\xcd\xfa\xf3\x09\xdd\x7e\x20\x65\x0f\x56\xf3\x31\x46\x0e" - "\xf7\xc1\x26\x7b\x78\xb9\xd8\x87\xeb\x71\xbc\xc7\xc6\x76\x4e\x18" - "\xdb\xa9\x60\x6c\x97\x0b\x63\xbb\x14\x0b\xf7\x17\x20\xfb\xf9\x2b" - "\x44\x3c\xbf\x4b\x83\x73\x94\x34\x6f\x8e\x1d\x69\xc6\xd6\x49\x83" - "\x0b\x66\xe1\xba\x0e\xcd\x83\x71\xe3\x7f\xc9\x09\xdc\x03\x6e\x9c" - "\x83\xc4\xcb\xcf\x0b\xc5\x75\xe0\xa9\x86\x55\xb8\x47\xe0\x61\xee" - "\x57\x51\xf6\xe0\x4a\x4c\x67\x6b\x68\x72\xa1\xd4\xb9\xd6\x73\x0d" - "\xcd\x7d\x8d\xf5\x9d\x34\xab\xb8\x7e\xf6\xf0\x23\x2c\x0f\x9e\xd3" - "\x00\x39\xf6\x76\x5a\xbd\xdc\xb5\x86\x76\x08\x9f\xff\xd2\x73\x0d" - "\xed\x61\x66\xef\x99\x65\x0f\x27\xe1\xbe\x11\xb8\x8f\xe0\xe9\x0f" - "\xa6\xb8\xa7\xbb\xd6\xa8\x79\xba\x20\x67\x71\x46\x70\x8c\xdd\xc6" - "\xc7\xd6\x0f\xe7\x4a\x63\x58\x2f\xf6\xcc\x20\xe4\xec\xb4\x28\x97" - "\x9c\x9d\xc6\xe7\x9a\x35\x1b\x35\xb5\xbd\xe4\xec\x97\xf0\xfc\xb1" - "\xed\x4f\xa2\x9c\xcd\xcd\xe1\x71\xe1\x65\x51\x63\x80\x26\x01\x18" - "\x2f\x12\xd3\xf1\xbc\x0e\xca\xdc\x2d\x4c\x06\x6f\x54\xae\x63\xeb" - "\xe4\x51\x91\x9e\xb2\xf7\xb1\xc5\x9e\xb2\x37\x6a\x49\xff\xb2\xf7" - "\xd1\x51\xfd\xcb\xde\xa8\xcd\xd7\x65\xaf\xbf\xb2\x17\xec\xae\x4b" - "\x92\xbd\x8f\x34\x5d\x97\xbd\x97\x4b\xf6\x3e\xd2\xe8\x26\x7b\x67" - "\x7b\xca\xde\xc7\x72\x7b\xcb\xde\xc7\x4a\x5d\xb2\x37\x6a\x9a\xa7" - "\xec\x9d\x76\xd6\x37\xd9\xfb\xd8\xe9\xcb\x2b\x7b\xa7\xa9\x3c\x65" - "\xef\xb4\x26\x51\x37\x7c\x33\x78\xd9\x3b\x6d\x77\xff\xb2\x77\xda" - "\x7e\x4f\xd9\x3b\xad\x88\xcb\xd8\x69\x56\x2e\x7b\xa7\xed\x10\x65" - "\xb2\xd9\x3d\xdd\x25\x7b\x79\x7a\x6f\xd9\x3b\x5d\x39\x80\xec\xd5" - "\x39\x05\x49\xf6\x36\x82\xec\x6d\x94\x0b\x2f\x7a\x93\xbd\x8f\x87" - "\xd5\xa2\xec\x4d\x44\xd9\xfb\x78\x58\xff\xb2\xf7\x97\xab\x51\xc6" - "\x32\xbf\x94\x7f\xa0\x2d\xcc\x2f\xe0\x1f\xa8\x05\xf1\xf8\x64\x2a" - "\xa4\x43\x1a\xfa\x4f\xc4\x7c\x22\xef\x45\x19\x3d\x7d\x77\xb7\x8c" - "\x86\x7c\xc2\x18\x97\x8c\x46\xf9\x8c\x72\x7a\xcb\x1f\xa8\xb9\xe4" - "\x0f\xb4\x09\xda\xd6\x22\xc9\xea\x3c\x48\xc3\x38\x3f\xe8\xbb\x07" - "\xf7\x0c\x02\x0d\x5a\xd6\xc2\xf7\x30\x7f\x47\xd6\x2f\x54\x9e\x32" - "\xfd\x97\x51\x9e\x32\xfd\x17\x8f\xf4\x2f\xd3\xff\xfd\x78\xff\x32" - "\xfd\x17\x4b\xae\xcb\xf4\xab\x25\xd3\xff\xbd\xfc\xba\x4c\x1f\x58" - "\xa6\xf7\xc5\x8b\x9e\x32\xfd\x1e\x51\xa6\x6f\xe9\x96\xe9\xff\xbe" - "\xc3\xbb\x4c\xff\x65\x5c\x6f\x99\xfe\xcb\x24\x97\x4c\xff\x85\xc6" - "\x53\xa6\x3f\xbe\xdf\x37\x99\xfe\xcb\xbd\x97\x57\xa6\xff\xd2\xec" - "\x29\xd3\x1f\x17\xf7\x87\x4d\x7f\xd6\x5d\xa6\x0b\x01\xbe\xc8\xf4" - "\xc7\x37\x4a\x32\x1d\x65\xe6\xdb\x42\xa3\x9b\x4c\x47\xd9\xf6\xf8" - "\xe6\xaa\xe4\x66\x37\x99\xfe\x38\x8f\x23\x2d\x7b\x7c\x9f\x93\xc9" - "\xf4\xc7\x33\x78\xfa\xf4\x79\xee\xe9\x2e\x99\xce\xd3\x9d\xee\x32" - "\xdd\x82\x32\xfd\xf1\xa6\x01\x64\x7a\x84\xef\x32\x7d\xd6\x54\x97" - "\x4c\x9f\x35\x55\x92\xe9\x28\xc7\x51\xa6\xa3\x0c\x46\xb9\xce\x7c" - "\x55\xb1\x7d\x0f\xd1\xdb\x42\xad\x44\x89\x3e\x72\x71\x0e\x03\x65" - "\x31\xfa\xe3\x41\xd9\xce\xf2\x2c\xe5\x79\x40\x3e\xb7\x80\x4c\xb6" - "\x80\x4c\xb6\xe4\x9d\x21\x0a\xc8\xd7\x98\x8f\x7b\xe8\xe0\x1e\x65" - "\x77\x68\x1b\xe8\x01\x07\xd3\x03\x8d\xa8\x3f\x38\xbd\xa2\xb7\x79" - "\xea\x82\x5f\x1d\xe8\xcb\x5e\x2f\x74\xd3\x05\x25\x37\xd1\x86\x8e" - "\xac\x5f\xb5\x49\xf2\x3d\x1f\xee\x51\x07\x14\xb6\x33\x1d\x60\x06" - "\x1d\xd0\xc2\x75\xc0\x4c\x75\x77\x1e\xa8\x03\xcb\xc3\xf5\x44\x23" - "\xe4\x69\x12\xf3\x4c\xf1\xd4\x13\xd1\x7a\x4f\x3d\x31\x73\x11\xea" - "\x09\xf4\xdb\xca\xe2\x9d\xe7\x6d\xd0\x39\xb7\xc4\xe8\x51\x67\xf0" - "\xe7\x4f\x06\x77\xeb\x89\x9b\xdc\xf4\x44\x8a\xa4\x27\x66\xbe\x7e" - "\xcd\xeb\x09\xc0\x72\x6d\xea\xbf\xa2\x9e\x78\xa2\xf1\x5a\xd0\x13" - "\xc8\x83\x91\x6e\x73\xab\xde\xf8\x80\xfe\x11\x6a\x17\xff\x50\xf4" - "\xc4\x13\x0d\xde\xf5\x44\xb4\xb1\xb7\x9e\x88\x2e\x76\xe9\x89\x99" - "\x51\x9e\x7a\x62\xd6\x69\xdf\xf4\x44\xf4\xc9\x9e\x7a\x02\x69\x96" - "\xcf\xf7\x04\xb4\xa1\x7e\x70\xe6\x15\xcc\x12\x50\x57\xf8\xa5\x27" - "\x66\x29\x3d\xf5\xc4\xac\x46\x51\x26\xdd\x37\x78\x3d\x31\x8b\xf9" - "\x47\xcc\x97\xf4\xc4\x85\x9e\x7a\x62\xd6\x5e\x4f\x3d\x31\x6b\x13" - "\xd7\x07\xb3\xda\xb8\x9e\x98\x55\xc6\xd3\x7f\x15\xe1\x9e\xee\xd2" - "\x13\x3c\xbd\xb7\x9e\x88\x51\x0c\xa0\x27\x54\x5d\xe1\x31\xfa\xae" - "\xdc\xc2\x59\x8e\xad\x31\xd6\x49\xb1\x0f\x3b\x7b\xf6\x01\x8e\x7d" - "\x27\xc1\xbe\xd0\xbd\xe6\xf3\x1c\x5f\x63\x10\xc4\x73\xb7\x9d\xe1" - "\x31\xb1\xad\x8b\xa1\x1f\xb4\x79\xef\x07\xd0\x07\x94\x52\x1f\xa8" - "\xd5\x1f\x27\xd0\x2f\xe4\xb8\x0e\xf4\x26\xe0\xdf\x64\x6b\x64\x72" - "\x49\xd5\x12\x45\xd0\x5f\x61\x70\x1b\x51\x07\xcb\x64\xc3\x70\x8d" - "\xc1\x09\x7d\x61\xfa\x44\x2a\xfc\xb8\x31\x8a\x04\xeb\x49\x08\xf6" - "\x87\xbf\x8a\x6b\x0d\xe8\x33\x01\xd7\x18\x00\x87\x11\xf3\x0f\xba" - "\xd6\x18\x3a\x7d\x58\x63\x30\xa5\x98\xd9\x1a\x03\x9e\x23\x12\xa0" - "\x0f\xb0\xb3\x2d\xb8\xc6\x60\x67\xeb\x32\x6a\x76\x9e\x84\xad\x31" - "\x34\x13\x5c\x5f\x90\x7c\xa2\xe0\xba\xc2\x8f\x63\x89\x1c\x7d\x2a" - "\xbc\x09\xf8\xdf\xaf\xab\x25\xd8\x07\x06\x2f\x8f\x9e\xf2\xba\xff" - "\x09\xf9\xe2\x00\x9a\x3a\x55\x85\xb3\xe8\x1b\x1b\xa3\xfe\xd2\x6c" - "\x97\xa1\x3f\x48\x27\xf0\x48\x00\xb9\x43\x95\x3d\xe4\x4e\x97\x48" - "\xef\x2e\x4e\x6f\xe0\x95\xf2\x39\x1b\xa1\x90\xce\xfd\x41\xda\xcd" - "\x80\x35\xdd\xe8\x2d\xab\x90\xb6\x11\x64\x8b\xe8\x13\x52\x78\x4d" - "\x1f\x24\x00\x3d\xf1\xfc\xc0\xdb\x17\xec\x81\x4e\x65\xab\x25\xb7" - "\x93\x4c\x02\x19\x13\x8c\x32\x06\xf0\x39\xe2\xad\x4e\xa0\xed\x37" - "\x9c\xb6\xe8\xd3\x0b\x7f\x1d\xaf\xe9\xb4\x50\xf6\xed\x5d\x5d\x40" - "\x5f\x3b\xa7\xef\x73\xaf\xa8\x49\x89\xb4\xc6\x06\xfa\xb9\x0e\x78" - "\x8a\x32\xe6\x49\x5b\x28\xc5\x78\x0f\xce\x2e\x5d\xb8\x70\x02\xe8" - "\x6b\x83\x3e\xd5\xa5\x43\xfe\xab\x4b\x5a\x71\x4d\xf0\x4b\xbe\xc6" - "\x16\x24\xfa\xaa\x78\x0d\xe4\xfd\x22\x2d\x31\x95\x81\xbc\x1d\x16" - "\xa3\xe9\xda\x12\x13\x4b\x65\x20\xef\x53\x07\x4b\xdf\x5f\x57\x5f" - "\x1d\xfa\x6a\x7f\x40\xf4\x7d\xaa\xdc\x7f\xfa\xce\xd1\x5d\x1d\xfa" - "\xaa\x7f\x40\xf4\x9d\xad\xf6\x9f\xbe\x73\xbd\xee\x7f\x46\xfa\xa2" - "\x7d\x2f\xd9\xf6\x92\x5d\x8f\xba\x85\xeb\xc6\xa7\x89\xcb\xa6\x7f" - "\x9a\x48\x6b\x91\x40\x1b\x45\x9e\x38\x47\x63\x58\x48\x6e\x3d\x25" - "\x8b\x5d\x2e\xad\x43\xa2\x4d\xcd\x78\xf5\x06\xf0\x6a\x29\x9e\x13" - "\x11\xf9\x04\x7a\x60\xbe\x0d\x64\xf5\xb8\x18\xbd\x33\x0f\xf4\xc4" - "\xb6\x18\xab\x17\x9e\xc9\x51\xc6\x07\x27\x11\xf5\x73\x06\xce\x3b" - "\xe1\x35\xe0\x59\x27\xd8\x37\x76\x0b\xc1\x73\x9f\xa1\x16\x90\xab" - "\x5d\xfa\xa0\x79\x60\x2f\x4b\x7c\xfb\x6b\xb2\x9d\xd9\x36\x7d\xf2" - "\x6d\xb3\x27\xdf\xce\xf5\xc1\x37\xd7\xda\x3e\xd8\x99\x8c\x6f\x66" - "\xc6\x37\x26\xd7\x5f\x03\xdb\x06\xf8\x27\xf1\x8d\xc9\x75\xe0\x1d" - "\xe3\x5b\x5b\x33\x71\xba\xc9\x75\xb4\x6b\x90\x77\x35\x71\x60\x5f" - "\x66\xcd\x31\x30\xbe\xa1\x9d\x19\x37\x58\xbe\xc5\xf6\xb0\x67\x9e" - "\x7e\xdb\x37\x7b\x26\x76\x37\xda\x2c\xee\xf6\x0c\xde\x9f\x83\x31" - "\xaf\x33\xb8\x60\xb6\xcd\x2f\x1b\x26\xb6\xc6\xd3\x86\x79\xba\x88" - "\xd7\xe9\x37\x81\x83\xb7\x61\x9e\x66\xeb\x4d\x6f\xbf\xc1\xc7\x92" - "\x9e\xf6\xcb\xd3\x6b\x3c\xed\x97\xa7\x67\x73\x3b\xe5\xe9\x1d\xe7" - "\x32\xd1\x7e\x79\x5a\xcf\xd3\x7f\xa3\x70\x4f\x77\xd9\x2f\x3c\xfd" - "\x1c\xfa\x06\xcb\x7a\xba\x62\x70\x36\xcb\xbd\x57\xd9\x66\x89\xe8" - "\xc7\x66\x89\xf8\x17\xb3\x59\x9e\xe9\x2f\x86\xcc\x75\x9d\xca\x64" - "\xfe\xd3\x35\xfe\xcb\xfc\x79\x5e\x63\x65\x5c\xd7\xa9\x12\x7d\x9f" - "\x89\xf7\x9f\xbe\xcf\x7a\x8d\x7f\x3a\xb0\x4e\x8d\x9b\xed\xd2\xa9" - "\x71\xb3\xbd\xeb\xd4\xf9\x07\xae\xeb\xd4\xbe\x74\xea\xbc\x7d\xfe" - "\xeb\xd4\xf9\x9b\x3c\x75\xea\x02\x99\x6f\x3a\x35\x6e\xd4\xd0\xeb" - "\xd4\x38\xad\xa7\x4e\x8d\x6b\xe3\x75\x7a\xee\xe9\xc1\xeb\xd4\xb8" - "\x5a\xef\x3a\x35\xee\xb0\xa7\x4e\x8d\x2b\xe3\xba\x73\x01\xe1\x3a" - "\x35\xae\x92\xa7\x3f\x17\xeb\x9e\xee\xd2\xa9\x3c\x9d\xeb\xd4\x05" - "\xaa\xc1\xe9\xd4\x5b\xaf\xb2\x4e\xd5\xf6\xa3\x53\xb5\xff\x62\x3a" - "\xf5\x79\xc3\x75\x99\x3f\x90\xcc\x5f\xa0\xf5\x5f\xe6\xbf\xe0\xd5" - "\xff\xdd\xc0\x32\x7f\xe1\x0c\x97\xcc\x5f\x38\xc3\xbb\xcc\x4f\xd8" - "\x7d\x5d\xe6\xf7\x25\xf3\x9f\xaf\xf0\x5f\xe6\x27\x18\x3d\x65\xfe" - "\xc2\xf3\xbe\xc9\xfc\x85\x81\x43\x2f\xf3\x17\x86\x79\xca\xfc\x85" - "\x66\x5e\xa7\xf8\x27\x06\x2f\xf3\x17\xee\xf5\x2e\xf3\x17\x1e\xf0" - "\x94\xf9\x0b\x8b\xb9\x6c\x5f\x68\xe3\x32\x7f\x61\x39\x4f\x8f\x9f" - "\xe9\x9e\xee\x92\xf9\x3c\x9d\xcb\xfc\x17\xc9\xe0\x64\x7e\xe8\x55" - "\x96\xf9\xea\x7e\x64\xbe\xfa\x5f\x4c\xe6\xeb\xbd\x9e\xff\x1c\x58" - "\x26\xbd\xd4\xe4\x92\x49\x2f\x35\x79\x97\x49\x2f\xc5\x5c\x97\x49" - "\x7d\xc9\xa4\x17\xc3\xfc\x97\x49\x2f\x85\x7b\xca\xa4\x97\xb3\x7d" - "\x93\x49\x2f\x6d\x1e\x7a\x99\xf4\x52\x99\xa7\x4c\x7a\x39\x89\xd7" - "\x49\xff\xcd\xe0\x65\xd2\xcb\x73\xbc\xcb\xa4\x97\x9f\xf5\x94\x49" - "\x2f\x8b\x6b\x50\x2f\x1b\xb9\x4c\x7a\x79\x1a\x4f\xd7\x9b\xdd\xd3" - "\x5d\x32\x89\xa7\x73\x99\xf4\xf2\xa6\x81\x64\x12\x62\xbf\x56\xd3" - "\x03\xfb\x2f\x4b\xd8\x5f\xd2\xf6\x69\xb1\x84\xfd\x25\x6d\x6c\xbf" - "\x5b\x71\x8c\x65\x43\x32\x51\xe4\x62\x9c\x0b\xe8\xef\x86\xff\x40" - "\xec\x2f\x59\x80\xfb\x16\x54\x4d\x20\xc3\x5a\x44\x99\x96\x02\x32" - "\xad\x05\xee\xd1\x0f\xd4\xb8\x18\x0b\xca\x22\x5c\xff\xc7\x7b\x2e" - "\xdb\xac\x81\x78\x5e\x72\x50\x67\x99\x5a\xc4\xb3\x4c\xf1\xbd\xcf" - "\x32\x15\xbb\x9d\x99\xc1\xbe\x11\xbc\x46\x16\x82\xeb\xba\x20\xdf" - "\x44\x39\x56\x1d\xe8\x50\x8a\x72\xec\x02\xc8\xb1\x0b\xae\x3e\x81" - "\x72\xec\x1c\xc8\x31\xdb\x0a\xdd\x78\x94\x65\xbd\xcf\x31\xf1\x75" - "\x5c\x26\xc7\xb2\x7b\xc8\xb1\x17\x7b\xc8\xb1\x85\x20\xc7\xe2\x40" - "\x8e\x05\xb9\xfa\xc3\x1d\x4d\x44\x3e\x73\x01\xf4\x09\x90\x63\xbf" - "\xbf\x80\x72\x6c\xbf\x9f\x72\x6c\xc9\x24\xcf\xfe\xb0\x74\xb3\x6f" - "\xfd\x61\xc9\x76\x6f\xfd\xa1\x2b\xcf\xdf\xfe\xb0\xa4\xc2\xb3\x3f" - "\x2c\x5d\x27\xf6\xd1\xa3\x83\xef\x0f\x4b\x13\xba\xfb\xc3\xcb\x3d" - "\xfb\xc3\xd2\x25\x9e\xfd\x61\x69\x14\xc7\xfd\xd2\x22\xde\x1f\x96" - "\xce\x16\xfb\x49\x93\x7b\xba\xab\x3f\xf0\x74\xde\x1f\x96\x6e\xbd" - "\xbe\x3e\x7b\xad\xea\x68\x83\xf2\xfa\xfa\xec\x40\xe3\xb2\xa5\x15" - "\xfe\x8f\xcb\x5e\xb9\x4a\xeb\xdf\x3f\xa4\xb9\x64\xc3\x2c\xff\xe9" - "\x9b\x78\x95\xd6\xbf\x7f\x48\xf3\x0a\xaf\x5c\xc2\xfa\x77\x52\xbf" - "\xeb\xdf\xfd\xdb\x31\xc9\x15\x35\xdd\x36\x7c\x72\x85\xb4\xe7\xb2" - "\xb7\x0d\x9f\x7c\x8f\xe7\xf9\xa5\xa4\x23\x3d\xf7\x43\x0e\x64\xdb" - "\x3b\xfe\x57\xd9\xf6\xaf\xaa\xfd\xb7\xed\x97\xdb\x3d\x6d\x99\x15" - "\x09\xbe\xd9\x32\xc9\xcb\xbd\xd9\x32\x0e\xbf\x6d\xfb\xe4\x75\x9e" - "\xb6\xcc\x8a\x59\x22\xff\xb7\x0d\xde\x96\x59\x71\x9f\x77\x5b\x66" - "\xc5\xcf\x3c\x6d\x99\x15\x2a\x6e\xb3\xac\x88\xe7\xb6\xcc\x0a\x2d" - "\x4f\x4f\xda\xea\x9e\xee\xb2\x65\x78\x3a\xb7\x65\x56\x18\xae\xaf" - "\xdb\x5e\xab\xb6\x4c\x4a\xc3\x75\x5d\x3b\x90\x2e\x58\xb1\xce\x7f" - "\x5d\xb0\x6a\xca\x75\x5d\x3b\x10\x7d\x57\x86\xfb\x4f\xdf\xd7\x36" - "\xf9\xaf\x6b\xd3\x26\xb8\x74\x6d\xda\x04\xef\xba\x76\xf5\x66\x4f" - "\x5d\x9b\x3a\xfd\xba\xae\xed\x4f\xd7\xae\x4a\xf5\x5f\xd7\xae\x8e" - "\xf7\xd4\xb5\x69\x07\x7d\xd3\xb5\xab\xbf\x19\x7a\x5d\xbb\xda\xea" - "\xa9\x6b\xd3\x2a\x45\xfe\x8f\x1a\xbc\xae\x4d\xdb\xe2\x5d\xd7\xa6" - "\x6d\xf3\xd4\xb5\x69\xe2\x19\xfa\xb4\x7a\xae\x6b\xd3\x72\x79\x7a" - "\xaa\xda\x3d\xdd\xa5\x6b\x79\x3a\xd7\xb5\x69\x03\x9d\xff\xb9\xbe" - "\x9e\x7b\xd5\x74\x6d\x46\xd4\x75\x5d\x30\x90\x2e\x48\xb3\xfa\xaf" - "\x0b\xd6\x94\xfa\xaf\x0b\xd6\x45\xb8\x74\xc1\xba\x08\xef\xba\x60" - "\xed\x36\x4f\x5d\x90\x19\x73\x5d\x17\xf4\xa7\x0b\x32\x8c\xfe\xeb" - "\x82\xb5\x06\x4f\x5d\xb0\xee\xa8\x6f\xba\x60\xed\xe9\xa1\xd7\x05" - "\x6b\x1d\x9e\xba\x60\x5d\xb5\xc8\xff\x71\x83\xd7\x05\xeb\xb6\x7b" - "\xd7\x05\xeb\xfe\xe6\xa9\x0b\xd6\xad\xe3\x32\x7f\x5d\x13\xd7\x05" - "\xeb\x8a\x78\x7a\x66\xb8\x7b\xba\x4b\x17\xf0\x74\xae\x0b\xd6\x59" - "\xae\xaf\xf3\x5e\xab\xba\x20\x6b\xa6\xff\xb2\xca\xd8\xe4\x92\x55" - "\xc6\x26\xef\xb2\xca\x18\xe3\x29\xab\xb2\x9c\xd7\x65\x55\x7f\xb2" - "\x6a\x9d\xc3\x7f\x59\x65\xec\xb1\xfe\x9b\xed\xe3\xfa\xaf\xd1\xeb" - "\xfa\xaf\xff\xb2\xca\xd8\x63\xfd\x37\x5b\x5c\xff\xcd\x3a\x30\x78" - "\x59\x95\x3d\xc7\xbb\xac\xca\xee\xb1\xfe\x9b\x2d\xae\xff\x66\x8b" - "\xeb\xbf\xd9\xe2\xfa\x6f\x56\xb5\x7b\xba\x4b\x56\xf1\x74\x2e\xab" - "\xb2\x2f\x71\xfd\x37\x57\xe1\x5a\xff\xcd\x65\x67\x06\x84\xa2\x8d" - "\x9a\xde\xeb\xbf\x1b\x56\xe2\xfa\xaf\xab\x4f\xe4\xdc\xc8\xd6\x82" - "\xb1\x5f\xd8\xb8\x5f\x91\x3e\xd7\x85\xc7\x6c\xd4\x5c\x5f\x17\x1e" - "\x8a\x75\xe1\x0d\x3d\xfc\xf9\xe4\xfe\xcd\xb7\x7e\xb2\x61\xef\xd0" - "\xaf\x0b\x6f\xa8\xf7\xec\x27\xb9\xc5\x62\xdf\xf5\x63\x5d\x38\x77" - "\xb5\xf7\x7e\x92\xfb\x5b\xcf\x7e\x92\x2b\xee\xcb\xcd\x2d\xe7\xfd" - "\x24\x77\xb1\xd8\x7f\x9a\xdc\xd3\x5d\xfd\x24\xdb\x6d\x5d\x38\xb7" - "\xd2\x17\x9d\xee\x50\x15\xce\x46\x1d\x3d\xa9\xf1\x61\x67\x37\x9e" - "\x93\x44\x3c\xf7\xa5\xd3\x9f\xe7\xb2\x1f\x71\xdc\xb5\x35\xc6\x36" - "\xa0\x4e\x6f\x11\x75\x7a\x7c\x6f\x9d\x2e\xe9\x73\xc4\xf3\x9b\x3e" - "\xad\x09\xf7\xc0\xf5\xa0\xf4\xf9\x5d\xf5\x97\x82\x6b\xc4\xb4\xa7" - "\x3e\xf7\x17\xd7\xf9\x57\xe9\xfc\xcb\x0f\x69\x4d\x38\xb7\xde\xff" - "\xb1\x5d\xc1\x55\x3a\xff\xf2\x43\x9a\xa7\xce\xbf\x84\xf3\x2f\x85" - "\xfd\x9e\x7f\xb9\x3e\x37\x81\xf4\x2d\xd8\xe7\x3f\x7d\x7f\xe7\x35" - "\xfe\xeb\xc0\xb6\xcd\xa6\x36\x97\xbd\xbf\xa9\x4d\xb2\x6d\x24\x7f" - "\x69\x20\x33\x15\x79\x89\x70\x5d\x20\x64\x43\x22\xf3\xf5\xad\x34" - "\xb5\x1c\x26\x86\x34\xb4\x77\x36\x2d\x88\x4e\x71\xb7\x77\x7e\x2f" - "\x93\x6c\x9d\x68\xb4\x83\xc0\xae\x41\x9b\x46\xb2\xf1\xd1\x37\x4e" - "\xbf\xfb\x41\xef\x8c\xb1\xe1\x98\xa0\x2b\xb8\x70\xf6\xbf\xfe\x78" - "\x60\xe3\x04\xff\xc7\x03\x9b\x7a\xec\x7f\x7b\xdd\xc7\xfd\x6f\x9b" - "\xbc\xee\x7f\xf3\x7f\x3c\xb0\xa9\xc7\xfe\xb7\xd7\xc5\xfd\x6f\xbf" - "\x7b\x6f\xf0\x76\xce\xeb\xfd\xec\x7f\x7b\xbd\xc7\xfe\xb7\xd7\xc5" - "\xfd\x6f\xaf\x8b\xfb\xdf\x5e\x17\xf7\xbf\xfd\xae\xc2\x3d\xdd\x65" - "\xe7\xf0\x74\x6e\xe7\xbc\xee\xd3\xfe\x37\xb0\x73\x62\x2f\xc1\xce" - "\xb1\xff\x70\xec\x1c\xdd\x35\x62\xe7\xfc\xa7\xd7\xf8\x87\x6e\x7a" - "\x62\x76\x0f\x3d\x61\xfb\xdf\xa5\x27\x5e\xbf\x84\xbd\x6f\x45\xfd" - "\xee\xff\x67\xf4\xcd\x75\xa3\x2f\xca\x68\x91\xb6\xce\x09\x31\x36" - "\xbf\xe8\x0b\xb2\x79\x4b\xda\x0f\x85\xb6\xff\x39\xd3\x7f\xda\x6e" - "\xae\xba\x6e\xe3\x0c\x44\xdf\xa2\x1d\xfe\xd3\xf7\x4d\xad\xff\x36" - "\xce\x16\xeb\xa7\xdd\x36\xce\x16\x6b\x4f\x1b\x07\x6d\x9a\x27\xec" - "\xdc\xd6\xd9\x00\x36\x4a\xce\x52\xb0\x77\x92\x09\x31\xb5\xec\x26" - "\xb9\x60\xf3\xe4\x9c\x01\xbb\x67\x31\xd8\x3d\x8e\x6d\xa2\xdd\xb3" - "\x25\xc1\xd3\xee\x79\xf3\x62\x9f\x76\x4f\xb0\xcb\xee\x71\x80\x4d" - "\xd3\xb5\x2d\xc6\x56\x78\xc6\xcd\x06\x7a\xa9\xb7\x0d\xd4\x99\x07" - "\x3a\xe7\xce\x18\x7b\x17\xd8\x41\xfd\xd9\x40\x8c\xf7\x3d\xec\xa0" - "\x1f\x9e\x0d\xf4\x86\xd2\x7f\x1b\x68\x4b\x84\xa7\x0d\x54\xb2\xc5" - "\x37\x1b\x68\xcb\xdb\x5e\xe7\x7a\xfc\xb6\x81\xb6\x54\x7a\xda\x40" - "\x25\x46\x11\x17\x5b\x06\x6f\x03\x95\x2c\xf2\x6e\x03\x95\xbc\xe2" - "\x69\x03\x95\x4c\xe3\xb6\x4e\x49\x31\xb7\x81\x4a\x62\x79\xfa\x9b" - "\xc5\xee\xe9\x2e\x1b\x88\xa7\x73\x1b\xa8\xa4\xcc\xc7\xf5\x9b\xd9" - "\x0e\xd0\xb1\x57\x7f\xdf\x5c\x7f\xeb\x37\x43\xb5\x6f\xee\xae\x6b" - "\x64\xfd\xa6\xb4\xdf\xf8\x87\xd7\xf5\x74\x49\xa5\xff\x7a\xe4\x8f" - "\x57\x69\xff\xff\x0f\x49\x4f\x97\xce\xf6\x9f\xbe\xff\xd5\xef\xfe" - "\xff\xfe\xf5\xf4\xb6\x14\xd7\x5c\xc4\xb6\x94\xc1\xcd\x45\x6c\x3d" - "\xed\xa9\x93\xff\x3b\xef\xfa\x5c\x84\xaf\x7a\xf8\x8f\xe5\xfe\xeb" - "\xe1\xad\x15\x9e\x7a\xf8\x4f\x77\xfa\xa6\x87\xb7\x3d\x30\xf4\x73" - "\x11\xdb\xa6\x79\xea\xe1\x3f\x49\x58\x98\x3e\x78\x3d\xbc\xed\xac" - "\x77\x3d\xbc\xed\xa2\xa7\x1e\xde\x56\xc3\xf5\xed\x9f\x26\x70\x3d" - "\xbc\xcd\xcc\xd3\xff\x7b\x9a\x7b\xba\x4b\x0f\xf3\x74\xae\x87\xff" - "\x14\x31\xb8\x35\x97\x5b\xaf\xd1\x35\x17\xed\xbf\xd8\x9a\xcb\xff" - "\x2d\xbc\xae\x27\x06\xd2\x13\x7f\x9a\xe6\xbf\x9e\x28\xb3\xfa\xaf" - "\x27\xfe\x52\xea\xd2\x13\x7f\x29\x1d\x9c\x9e\xf8\xcb\x8d\x9e\x7a" - "\x62\xfb\xbb\xd7\xf5\x84\xaf\x7a\xe2\xff\x36\xfa\xaf\x27\xfe\x6c" - "\xf6\xd4\x13\x3b\x9e\xf0\x4d\x4f\xfc\xe5\xd9\xa1\xd7\x13\x7f\x59" - "\xec\xa9\x27\x76\x44\x8a\x58\x58\x32\x78\x3d\xb1\x63\x8c\x77\x3d" - "\xb1\xe3\x36\x4f\x3d\xf1\x17\x1b\xd7\x07\x3b\x66\x72\x3d\xb1\x43" - "\x4c\xdf\xbe\xd8\x3d\xdd\xa5\x27\x78\x3a\xd7\x13\x3b\x62\xaf\xef" - "\xb7\xbb\x56\xf7\xdb\xbd\x5d\xe9\xbf\x2c\x2b\x9f\xe9\x92\x65\xe5" - "\x33\xbd\xef\xb7\x7b\x67\xaf\xe7\x7e\xbb\xbf\x2e\xb9\xbe\xdf\xae" - "\x3f\x59\xb5\x63\xb1\xff\xb2\xea\x9d\x5c\x4f\x59\x55\x7e\xd1\x37" - "\x59\x55\x1e\x34\xf4\xb2\xaa\x5c\xe3\x29\xab\xca\x5b\x44\xfe\xff" - "\x6c\xf0\xb2\xaa\x7c\xbf\x77\x59\x55\x5e\xeb\x29\xab\xca\x4b\xb9" - "\x4c\x2a\xb7\x73\x59\x55\xbe\x93\xa7\xff\x35\xd2\x3d\xdd\x25\xab" - "\x78\x3a\x97\x55\x7f\xf3\xc9\xff\xbf\x6b\x7d\xcd\x2f\x9b\xf6\x0a" - "\xac\xaf\x0d\x95\x4d\x7b\xad\xac\xaf\xfd\xcf\xf5\xf5\x9f\x7e\xed" - "\xd9\xbf\x5d\x82\xdf\xff\xff\xd7\xef\xfa\x4f\xff\x3a\x60\x97\xd1" - "\xa5\x03\x76\x19\xbd\xad\x4f\xe4\x00\x86\x72\xc1\x1e\xcd\x3e\x43" - "\x14\x1b\x70\x7d\xa2\xa1\x96\xe4\xe1\xfa\xc4\x52\x69\x7d\x62\x8b" - "\x68\xe3\xbe\xeb\xf4\xb4\x71\x77\x6e\xee\xcb\xc6\x45\xdb\xd6\x09" - "\x76\xab\xa3\xe7\xba\xc4\x7f\xf4\xad\x3b\x3a\x83\x0b\x63\x2f\x6e" - "\x8b\xb1\x0f\x46\x77\xbc\xb9\x8a\xeb\x8e\x37\x7e\x50\xba\xe3\x7f" - "\x76\xf8\xaf\x3b\xde\xed\x11\xcf\xf7\xef\x0f\xf8\xa6\x3b\x76\x4d" - "\x1f\x7a\xdd\xb1\x6b\xb6\xa7\xee\xf8\xbb\x56\xc4\xc3\x43\x83\xd7" - "\x1d\x7f\x97\x79\xd7\x1d\x7f\x0f\xf2\xd4\x1d\xbb\xc4\xbd\xa6\x7f" - "\x9f\xc2\x75\xc7\x2e\x2b\x4f\xdf\x39\xd5\x3d\xdd\xa5\x3b\x78\x3a" - "\xd7\x1d\x7f\x8f\x1a\xdc\x7c\x48\xe8\x35\x3a\x1f\xa2\xfe\x17\x9b" - "\x0f\xa9\xb8\x84\xf3\x6f\xef\xcf\xa8\xe9\xde\x3f\xff\xfe\x8c\x5e" - "\xe3\xf5\x64\xb0\x75\xdb\xf9\x9a\x6b\xf7\x78\xdd\x7c\x54\x94\x65" - "\xff\xd8\xed\x29\xcb\xde\x4b\xf0\x26\xcb\xfa\x5b\x57\xc5\xf1\xb9" - "\x13\xe4\x9c\x63\x8b\x9f\xeb\xaa\xc9\x3f\x24\xf9\xf5\xf7\xd9\xfe" - "\xcb\xaf\x7f\xf4\xf0\x7f\xfa\xbe\x8f\xfe\x4f\xdf\xf7\xea\xff\xd4" - "\xe1\xf7\x1e\xfa\xf7\x7b\xf8\x3f\x7d\x5f\xf4\x7f\xfa\x9e\x1f\xe7" - "\xe2\xde\xdf\xeb\x5d\x7e\xbd\xdf\xc3\xff\xe9\xfb\xe2\xfa\xe9\xfb" - "\xa2\xff\xd3\xf7\x45\xff\xa7\xef\x85\xbb\xa7\xbb\xe4\xd7\x7b\x6e" - "\xe7\xe2\x2a\xfb\xf5\x7f\x4a\x73\xe7\xc6\x16\xca\x85\x72\xb8\x2a" - "\xa0\x8e\x63\x00\x03\x55\xf0\x7f\x35\xf0\x71\x14\xfc\xef\xd5\x67" - "\xb0\x35\x78\x6e\xac\x90\x09\x75\x96\x13\x99\xc9\xfa\x7d\x55\xd5" - "\x58\x07\x7c\xb7\x32\x83\xf3\x6a\x6e\x6c\xa8\x63\xf8\x0c\x81\xea" - "\x09\xf0\x25\x96\xc5\x57\x83\xfc\x21\x80\x19\x6d\x32\x09\x39\x23" - "\xab\x2c\x95\xf2\x41\x7d\x43\x9a\x65\x95\xcf\x62\x19\x50\xd7\x1d" - "\x66\x59\xa5\xca\x6b\x5d\xa1\xac\xe8\xed\xe3\xc9\x6a\x07\x3d\x51" - "\xb5\xb4\x9d\xb4\xc8\x2a\xcf\x87\xb6\x0d\x9f\x41\xd3\x63\x09\xda" - "\x58\xe5\x63\xad\x0a\x2c\x13\x63\x2f\xc2\xb3\x46\x7c\xe6\x84\x3a" - "\xa6\x2d\x21\xf2\xfc\xf6\xe1\x4a\x90\x05\x81\xe9\x36\x6a\x59\xe6" - "\x80\x3a\xa7\x38\xc8\x9e\xf1\x8d\x8a\x77\xde\x80\x34\x27\xd1\x60" - "\x7c\x3b\x2c\x03\x6c\x4c\xac\xcf\xc5\x12\xc8\xdf\x57\x1d\x7e\xfb" - "\x57\x32\x29\x70\x22\x35\x0f\x0e\x37\xbb\xbd\x9e\x7f\x0b\x5d\x33" - "\x9e\x54\xdd\x0d\xb4\xd3\x12\x79\x5f\xcf\x07\xf9\x9d\x9d\xfd\xc8" - "\x44\x25\xc6\xc1\x4c\xdf\x4c\xe4\x05\xc2\x70\xe5\x47\xa9\x2c\x56" - "\xa5\xb5\x23\xeb\x03\xad\x59\x36\xb1\x1a\x69\x8e\x31\xd3\x30\xf6" - "\x2f\xe0\x86\x40\x7a\xe4\xde\x14\x42\x7a\xf2\x22\x31\x7e\xc9\x02" - "\x6d\xd2\xa2\x25\x09\xcb\x96\x27\x69\xef\x8c\x1f\x41\x66\x2f\x5b" - "\xa6\x5d\xb2\x60\xe9\x4a\xad\xfb\x93\x07\xb5\xf1\x8b\x5e\x5d\xf0" - "\xfc\xe2\x84\x7b\x96\xbc\x60\x18\x01\x75\x22\x6e\xf5\x08\xc3\xba" - "\x08\x59\x1f\x4c\x2b\xf9\x1d\x21\xbf\x1f\x4d\x14\x58\x2f\xf8\x5e" - "\x99\x14\x1f\x0f\xe3\xc3\xc9\x21\x4f\x3a\xc8\xc0\x82\xb4\xe1\x90" - "\x77\xf7\xce\xb7\xa0\x5e\x25\x50\x6f\xa8\x23\xd6\xb9\x41\xaa\xb3" - "\x84\x89\x74\xc4\x44\x5a\x3b\x60\xf0\x83\xf3\xa1\xf6\xe1\xff\x4e" - "\x69\x2c\xb6\xcf\x06\xfd\x44\xd6\x2a\xdb\x33\x1d\xf5\x12\xcd\x9b" - "\x1b\xdb\x91\xb5\x47\x2d\x61\x0c\xdf\xa5\xf9\x73\xb5\x1d\xd8\x4f" - "\xa8\xfe\xe7\xbc\x4f\xed\xb1\xcc\xd1\xc9\x08\x8f\xcf\xb7\x67\xaa" - "\x2b\x3e\xdf\x1e\x0b\xd2\x16\xea\xd1\x06\xe9\xb3\xcd\xa4\xab\x1e" - "\xd3\x31\x4e\x24\xc6\xd9\xc3\x3a\x43\xbb\x40\x2f\xd2\x2a\x9a\x29" - "\x62\xdf\xb8\x2d\x52\x30\x7e\x58\x6e\x52\x5c\x20\xd1\x0e\xda\x45" - "\xb3\xb7\x45\xd6\xd9\x6c\x24\x74\x8d\xe1\x05\x3a\xec\x83\x39\xa1" - "\x8e\x45\x09\x18\x1f\x50\xc8\xfe\xb0\x9c\x66\x57\x26\xcd\x99\x48" - "\xd4\x50\x76\xb9\x5b\x9c\x40\xc5\xe0\xf8\xbf\x87\xf1\x1f\xf9\x88" - "\xf1\xff\x38\x1f\xab\xc8\xde\xa4\xde\x7c\xec\xc6\xdf\x76\x81\xec" - "\x07\x2c\x50\x55\x56\x69\xb4\x93\xd3\x11\xfb\xee\xb9\x74\x3d\xb9" - "\x97\xd1\xae\xaa\x42\xc8\xcf\xca\x10\x72\xb3\x2a\x68\x6e\xd6\x56" - "\xa0\x59\x64\x7e\x32\xd1\xce\x77\xaa\x49\xde\x05\x12\x61\xcd\xcb" - "\x2a\x0d\x96\x65\xc8\xc0\xb6\x90\x83\xde\x88\x00\x99\x11\x21\xf6" - "\xf7\x48\xa4\xe3\xc7\x6d\x84\x3c\xf9\x2a\x21\x27\xa6\x92\x80\x12" - "\x78\x6f\x70\xed\xa9\xe2\xfe\x9f\xb2\xaa\xa6\xbe\x05\xef\x62\x9c" - "\xc7\x41\xbe\xbf\xcf\x6b\xbf\xeb\x6e\xf7\x7a\x6d\xdf\xed\xde\x5b" - "\x2e\xe4\xaf\x87\xf1\xe6\xfa\x48\x9a\xbb\x7e\x42\xef\x76\xaf\xd7" - "\xf2\x76\x07\xb6\x0f\x7d\xbb\xf7\xa6\xf2\x76\xef\x9d\xe2\x5f\xbb" - "\xf7\x7a\x9d\xff\x73\x6b\xb7\x17\x7e\x7f\x58\x06\xed\x06\x7e\xaf" - "\x07\x7e\xaf\xef\x83\xdf\xeb\x45\x7e\x8f\x6c\x1e\xfa\x76\x7f\x98" - "\xc4\xdb\xfd\xe1\x24\xff\xda\xfd\xa1\x57\xf9\xe7\x6a\xb7\xd1\x0b" - "\xbf\x3f\x2a\x15\xf2\x8d\xc0\x6f\x23\xf0\xdb\xd8\x07\xbf\x8d\x22" - "\xbf\x47\x1d\x1a\xfa\x76\x7f\xc4\xe7\xff\xb3\x3e\x9a\xe0\x5f\xbb" - "\x3f\xda\xe1\x43\xbb\xbd\xf0\x7b\x5f\x11\xb4\x1b\xf8\x6d\x04\x7e" - "\x1b\xfb\xe0\xb7\x51\xe4\xf7\x4f\x73\x86\xbe\xdd\xfb\xb8\xff\x9b" - "\xac\x7d\xe1\xfe\xb5\x7b\xdf\xd6\x81\xdb\x9d\xed\x85\xdf\xfb\x0b" - "\x85\xfc\x6c\xe0\x77\x36\xf0\x3b\xbb\x0f\x7e\x67\x8b\xfc\x7e\xe6" - "\xd1\xa1\x6f\xf7\xfe\x79\xbc\xdd\xfb\xc3\xfc\x6b\xf7\xfe\xe2\x81" - "\xdb\x9d\x55\x06\x32\xbb\x17\xcf\x4d\x29\x91\x64\xf2\x05\x6c\xff" - "\xc7\x84\x06\x67\x95\x8d\x5c\x93\x21\x73\xa8\xb2\x76\x8c\x6c\x22" - "\x72\x18\xfb\xe9\x43\xcd\x24\x08\xda\xaa\xa7\xf9\x1b\xa2\xf0\x57" - "\x80\x72\x1c\x20\xfb\x9d\xaa\xac\xad\x9d\xb9\x73\x23\x37\x2c\x24" - "\xda\x74\x2b\x51\xd7\xa5\x99\x49\x9a\x81\x5a\xeb\xc8\x37\x24\xd8" - "\x4c\xe4\x38\x8f\xf5\x69\x5b\x05\x59\x9a\x48\x69\xab\xec\x9f\x27" - "\x71\xbc\x98\xdf\x4a\x22\xc0\x26\xce\xa0\xa0\x3f\x0a\x05\xa2\x85" - "\xf2\x23\x90\x96\x50\xf6\xa3\xa1\xb3\x89\xec\x83\xe7\xed\x04\xe9" - "\x89\xb4\x85\xb1\x65\x04\xa3\xab\x8d\x90\x5f\x3d\xc3\xe9\xfa\xe6" - "\xc2\xc1\xd2\xf5\x9f\x3b\xb9\x5d\x99\x55\x65\x32\x77\x12\xb0\x2d" - "\xd5\x78\xae\x19\xd2\x0d\x75\x86\x76\x18\x87\xfc\x33\x8c\xe6\x65" - "\x95\x0b\xa0\xb3\x06\x57\xee\xc7\x5e\xf7\xbf\xb9\xc9\x53\x1d\xc8" - "\xcc\x5e\x58\x73\xd1\xbb\xda\x40\x83\xd7\xeb\x38\xbd\xd7\x4f\x1a" - "\xd9\x14\xd8\xde\x37\xbd\xd7\xeb\x1c\xa0\x73\x9c\xaa\xf5\x13\x7c" - "\xa7\x77\xf5\xd3\x9e\xf4\x5e\x4f\xae\x0c\xbd\xab\xb9\x1f\xb1\xdc" - "\xf5\x51\x9e\xf4\xfe\xd8\xcc\xe9\xfd\xf1\x3a\x9a\xb7\x3e\x42\x00" - "\x5d\x39\xc8\x72\xbd\x9e\x7f\x74\xa3\x37\xe0\xbb\xb7\x0e\x73\xd1" - "\xfb\x80\x19\xe8\x2d\xe2\x7b\x3d\xe0\x7b\x64\xb3\x17\x7a\x03\xbe" - "\xd7\x03\xbe\xd7\x0f\x02\xdf\x07\x0e\xf4\xa0\xf7\x15\xc2\xf7\x01" - "\x31\xfe\xd3\xfa\x1e\xf8\x3e\x30\x8b\xd3\xbb\xda\x06\xf4\x06\x7c" - "\xaf\x1f\x24\xbe\x0f\xb4\xf9\xa0\x3f\x00\xdf\xbd\x75\xa7\x8b\xde" - "\x9f\xce\xa2\xc1\x46\x11\xdf\x46\xc0\xf7\xa8\x43\x7d\xd3\xdb\x08" - "\xf8\x36\x02\xbe\x8d\x83\xc0\xf7\xa7\x3f\xf3\xa4\xb7\xf1\x0a\xe1" - "\xfb\x53\x05\xa7\xb7\xb1\x07\xbe\x3f\xa9\xe2\xf4\xfe\x24\x9e\xe6" - "\x19\x01\xdf\xc6\xc1\x96\x3b\xcf\x07\x7a\x03\xbe\x7b\xeb\x6c\x17" - "\xbd\x6b\xaa\x80\xde\x22\xbe\x8d\x80\xef\x9f\xe6\x78\xa1\x37\xe0" - "\xdb\x08\xf8\x36\x0e\x02\xdf\x35\xdb\x7b\xd0\xfb\x0a\xe1\xbb\x26" - "\x49\xa4\x77\x0f\x7c\xd7\x44\x70\x7a\x7f\xda\x00\xf4\x06\x7c\x1b" - "\x07\x89\xef\x9a\x1a\x1f\xec\x04\xc0\x77\x6f\x5b\xc1\x45\xef\xba" - "\x08\x1a\x9c\x2d\xe2\x3b\x1b\xf0\xfd\xcc\xa3\x7d\xd3\x3b\x1b\xf0" - "\x9d\x0d\xf8\xce\x1e\x04\xbe\xeb\xc6\x78\xd2\x3b\xfb\x0a\xe1\xbb" - "\xb6\x85\xd3\x3b\xbb\x07\xbe\x6b\x4b\x39\xbd\x6b\xa7\xd1\xbc\x6c" - "\xc0\x77\xf6\x20\xcb\xad\xf3\x7a\xfe\xb7\x3f\xfb\xe4\xd5\x2d\x44" - "\xe9\x49\x73\xd3\xd6\xcb\x67\xa3\x98\xf2\xae\x8e\x8d\x62\x8a\xed" - "\xdb\x46\x31\x85\x71\x9a\xd7\x55\xf8\x67\xa3\x98\xca\xfd\xb1\x51" - "\x7a\xd3\xfc\xa0\xe6\xf2\xd9\x29\x07\x65\x57\xc7\x4e\xa9\xaf\xe9" - "\xdb\x4e\xa9\x37\x72\x9a\xd7\x4f\xf2\xcf\x4e\x39\x38\xc1\x1f\x3b" - "\xa5\x37\xcd\x0f\xe5\x5e\x3e\x5b\xe5\xd0\xf2\xab\x63\xab\x1c\x8a" - "\xea\xdb\x56\x39\xe8\xe0\x34\x3f\x58\xea\x9f\xad\x72\xa8\xc8\x1f" - "\x5b\xa5\x37\xcd\x1b\xc8\xe5\xb3\x57\x3e\x3b\x79\x75\xec\x95\xcf" - "\x76\xf6\x6d\xaf\x7c\x26\x8e\x7f\x3e\x0b\xf3\xcf\x5e\x69\xf0\x61" - "\xfc\xd3\xdb\x5e\xe9\x4d\xf3\xc3\x49\x97\xcf\x66\x39\xfc\xec\xd5" - "\xb1\x59\x0e\xeb\xfa\xb6\x59\x1a\x5a\x38\xcd\x1b\x8c\xfe\xd9\x2c" - "\x87\x33\xfc\xb1\x59\x7a\xd3\xfc\x73\xcb\xe5\xb3\x5b\x3e\x3f\x78" - "\x75\xec\x96\xcf\x8b\xfb\xb6\x5b\x3e\x8f\xe5\x34\x3f\xec\xf0\xcf" - "\x6e\xf9\xdc\xe6\x8f\xdd\x82\xb4\x46\x9a\xa3\xad\xc2\x69\x7e\xa4" - "\x82\x86\x64\x65\x74\x81\x3d\x12\x0c\x74\x0f\x6e\x23\xf2\x2d\x48" - "\xf3\x46\x4e\x73\x67\xc8\x86\x28\xa0\x8f\x1e\x69\xc6\xda\xf1\x9d" - "\x26\xc4\x99\x9b\xb5\x83\xca\x09\xb4\x45\x49\x5a\x65\x5f\xec\x77" - "\x64\x92\x10\x6d\xda\x1a\xf8\xff\x08\xf3\x9f\xa9\x4d\xcb\x3a\x0a" - "\x6d\x0c\xc0\x35\x0a\x47\xde\x1c\xb3\x33\x38\x27\x0e\x9e\x05\xd2" - "\x71\x31\xe6\x2e\xb0\x25\xe8\xcb\x9a\x30\x53\x5b\x39\x31\x39\x3e" - "\x21\x75\x8d\xff\x20\x42\xc8\x86\x47\xef\x75\x10\x1d\xfd\x4e\x17" - "\x56\x93\x64\x26\xce\x17\x34\x2a\x53\x4a\x35\xe0\xe2\x7f\x48\xb4" - "\x85\x5e\xa0\xdf\xea\x54\x5d\xc1\x05\xa5\xce\xe0\x0d\x5a\x67\x5e" - "\xa1\xde\x11\x5c\x50\xf8\x76\xb2\x59\xae\xb2\x13\xdd\xe2\x16\x4a" - "\xf3\x9f\x27\x8a\xfc\x66\xa2\x2c\x78\x9e\xa8\x0a\x9a\x89\xba\xa6" - "\xa5\x91\xd4\x9e\xaa\x26\xb5\xed\x47\x48\xed\x05\xb8\x3a\xe1\x12" - "\xe0\xca\x38\x42\x6a\x60\xf4\xf8\xc4\x69\x42\xd2\x5b\xa8\xf5\xc7" - "\x4d\x24\xac\xc6\xd1\x48\x70\x1f\xef\x19\x59\xe3\x66\x55\x1c\x09" - "\xa3\xdf\x6a\x08\x7d\x41\x23\x87\x67\x0a\x4c\x37\x39\xac\xa4\xa6" - "\xc5\x8e\xcf\x53\xe0\xb9\x22\xbd\x05\xca\x17\xaa\xd1\x5f\x9c\xb5" - "\x26\xe3\x00\xb4\x2f\xb0\x1e\xe8\x5c\x21\xd9\x64\xf9\x9d\x24\xa2" - "\x00\xd8\x8c\x98\x89\xa6\x1c\x33\x6f\x75\x0e\x16\x33\x8d\xdc\xff" - "\xd9\xcb\x9a\xd1\x40\xef\xb1\xc2\xcb\xb1\xea\x27\x8f\x1c\xa3\xb8" - "\x4f\x0b\xd7\x67\xea\x6c\x9f\x10\xd3\x3a\x81\x44\xaf\x24\x64\xa6" - "\x93\x10\xa4\x09\xae\x25\x3f\x69\x20\xa1\xb8\x7f\x4c\xf8\x4e\x37" - "\xda\xd4\x62\x25\xab\x1d\x50\xd7\x33\xf6\xee\xba\xd6\xad\xab\x23" - "\xf0\x6c\x6c\x9d\xde\x4c\x54\x06\xa2\x46\x3a\x83\x2d\x5a\xf6\xa4" - "\x85\x04\x2d\xb5\x51\x8a\x34\x46\xda\x22\x9d\xb1\x3c\x89\xf6\xa6" - "\x78\x2b\x49\xb7\x13\xb5\x29\x0d\x7e\x53\xa8\xd5\x44\xce\x12\xa8" - "\xe3\x0e\x1a\x1c\x58\x0f\xf8\x98\x86\x98\x30\xcb\xbe\xa8\x04\x1c" - "\x8c\xa6\x59\x5f\x18\x4a\xa0\xbd\xb8\x86\x3f\xb8\x36\x1f\xf1\x65" - "\xfd\xa3\x97\x4d\xe8\xc2\xf3\x7a\x1d\xc7\x73\x93\x91\x86\xac\x27" - "\x5d\x60\xeb\x71\x3c\x07\xb6\x0f\x8c\xe7\xf5\x93\x5c\x78\xfe\xf2" - "\x75\x17\x9e\x9b\x56\x7a\xc7\xf3\x57\x87\x39\x9e\xd7\x47\x5d\x9b" - "\x78\xfe\x6a\x51\xff\x78\xfe\x6a\x86\x77\x3c\xaf\x8f\x94\xec\xdd" - "\xa1\xc1\xf3\x57\xa5\x57\x0e\xcf\xeb\x75\xfe\xe1\xf9\xab\x54\x4f" - "\x3c\x7f\x99\xcb\xf1\xfc\x65\x94\x7f\x78\x6e\xf2\x1a\xff\xa0\x3f" - "\x7b\xdb\x0d\xcf\xa2\x7c\x3e\x16\x0b\x78\x06\xf9\xbc\x5e\x94\xcf" - "\x23\x9b\x7d\xc0\xb3\x9b\x7c\x3e\x9a\xe0\xc2\xf3\xb1\x5f\x7a\xc7" - "\xf3\xd7\xdb\x44\x3c\x5f\xa3\xf2\xf9\xeb\x9f\xf5\x8f\xe7\xaf\x35" - "\xfd\xe0\xb9\x42\x1a\x4b\x0c\x0d\x9e\xbf\x36\x5c\x41\x3c\xfb\x29" - "\x9f\xbf\x9e\xe9\x89\xe7\xa3\xf3\x38\x9e\x8f\xaa\xfd\xc3\xf3\x31" - "\xaf\xfb\x9f\xfb\x1b\xcb\xb8\xf0\x6c\x14\xe5\x73\xb3\x8e\x86\x18" - "\x41\x3e\x1b\x45\xf9\x3c\xea\xd0\xc0\x78\x36\xba\xc9\x67\xf3\x03" - "\x2e\x3c\x37\x8f\xf1\x8e\xe7\x6f\x96\x73\x3c\x1b\xaf\x51\xf9\xfc" - "\x4d\x50\xff\x78\x36\x5b\xbc\xe3\xd9\x18\x29\x8d\xd3\x86\x06\xcf" - "\xdf\x44\x5d\x39\x3c\x1b\xfd\x94\xcf\xdf\x84\x7b\xe2\xd9\x3c\x89" - "\xe3\xf9\x98\xd9\x3f\x3c\x37\x7b\x8d\xff\xd3\xdf\x38\xd1\x0d\xcf" - "\xa2\x7c\x6e\xb1\x03\x9e\x41\x3e\x1b\x45\xf9\xfc\xd3\x1c\x1f\xf0" - "\xec\x26\x9f\xbf\x0d\x74\xe1\xb9\xe5\xa4\x77\x3c\xb7\x4c\x17\xf1" - "\x7c\x8d\xca\xe7\x6f\x8f\xf4\x8f\xe7\x6f\x2b\xfa\xc1\x73\x85\x34" - "\x06\x1e\x1a\x3c\xb7\xa8\xaf\x20\x9e\xfd\x94\xcf\xdf\xb6\x79\xe2" - "\xb9\xd9\xc1\xf1\xdc\x5c\xee\x1f\x9e\x8f\x7b\xf5\xff\xd6\xdf\x18" - "\xdc\x85\xe7\x6c\x51\x3e\x9f\xa8\xa6\x21\xd9\x20\x9f\xb3\x45\xf9" - "\xfc\xcc\xa3\x03\xe3\x39\xdb\x4d\x3e\x1f\x3f\xec\xc2\xf3\x89\xf7" - "\xbc\xe3\xf9\xc4\x8d\x1c\xcf\xd9\xd7\xa8\x7c\x6e\xdd\xde\x3f\x9e" - "\x5b\x8d\xde\xf1\x9c\x1d\x29\xcd\x2f\x0c\x0d\x9e\x5b\xcd\x57\x0e" - "\xcf\xd9\x7e\xca\xe7\xd6\x4a\x4f\x3c\x1f\xaf\xe1\x78\x3e\x9e\xe1" - "\x1f\x9e\x4f\x78\x8d\x7f\x37\xb8\xf9\x8d\x53\xd5\x38\xbf\xd1\x89" - "\xf3\x1b\xae\xbd\x7f\xfa\xd0\x7a\x8e\xe7\x2e\xc0\xf3\x9b\xee\x78" - "\xfe\xaa\xe7\xfc\x86\x65\x9b\xd0\x8d\xe7\x53\xbd\xf0\x2c\x00\x9e" - "\xbb\x18\x9e\x4f\x1e\x94\xe6\x37\x4c\x6d\xa5\x80\x93\x53\xc4\x34" - "\x0b\xb0\x9c\x2f\x62\xf9\x2b\xc0\x32\xd0\x50\x00\x1a\xd7\x34\x35" - "\x92\x68\x2b\xa7\x65\x27\xd0\x58\x70\xc7\x71\xa7\x45\x8e\xf8\x45" - "\xdc\x4a\x18\xae\x5d\x0a\xd8\x4d\x3c\x48\x6a\x93\xe1\x5a\x05\x57" - "\x1a\x5c\xe4\x20\xa9\xb1\x00\x76\x17\xb9\x63\xb7\x5e\xc4\xee\xc9" - "\x84\xfe\xb1\x7b\x72\xda\x95\x9b\xcb\x38\xc9\xe7\xbf\xbe\x8a\x55" - "\x47\xc7\x1c\xa3\xa6\x94\x46\x11\x9f\xa7\x48\xb4\x83\x84\xd2\x67" - "\x74\xa3\x55\xb1\x44\xfd\x9a\x93\xc8\xf3\x9e\x27\xea\xbc\x2f\xa1" - "\xdd\x52\xff\x6d\x26\xaa\x4f\xec\xff\x20\x35\xed\x8d\xa4\xe6\xc2" - "\x01\x52\x23\xc0\x75\x0a\x2e\xa8\x6b\x74\x82\x7b\xbb\xad\x62\xbb" - "\x4f\x3d\x0b\x65\x4d\xf0\xde\xee\x53\x53\x59\xbb\xe3\xa1\xdd\x9d" - "\xae\x76\x9b\xa0\x1f\x00\x7f\xc6\x0a\xe2\x7c\x48\xb4\x95\x04\x2d" - "\x73\x50\xda\x29\xe2\x1f\xf9\xf3\x49\x83\x9d\x44\x1b\x80\x67\x2f" - "\x00\xfe\x5b\xca\x48\x7a\x2a\xe0\xbf\xd3\x8e\xb8\xb3\x9a\x32\x2e" - "\x02\xfe\x4f\xa6\x50\xa0\x5f\x17\xe2\xff\x2b\xc4\xbf\xa5\x58\x60" - "\xf8\xb7\xcc\xf2\x0f\xff\xa7\x7c\xc0\xbf\x2f\xf3\x21\xa7\xab\x71" - "\x3e\xa4\x13\xe7\x43\x5c\x7b\x40\x07\xc0\xbf\xfb\x7c\xc8\x77\x6e" - "\xf8\x3f\xdd\x0f\xfe\xdb\x0e\x4a\xf3\x21\x57\x1f\xff\x6d\x03\xe0" - "\xbf\xad\x1f\xfc\x0f\xf5\xdc\x47\xdb\x15\xc4\xff\xe9\x01\xf0\x7f" - "\xda\x07\xfc\xaf\xd7\xf9\x87\xff\xb6\x1e\xf8\xff\x4e\xc4\xff\x77" - "\x7e\xe2\xff\xb4\x2f\xf8\xf7\x61\xfe\xc4\x8a\xf8\x07\xf9\xbf\x7e" - "\xab\xdb\x5e\xe0\x81\xf0\xef\x26\xff\xcf\xb8\xe1\xdf\xda\x0f\xfe" - "\xbf\x97\xf0\x7f\x0d\xc8\xff\xef\x07\xc0\xff\xf7\xfd\xe1\x7f\x88" - "\xe7\x4a\xbe\xbf\x82\xf8\xb7\x0e\x80\x7f\xab\x2f\xf8\xf7\x53\xfe" - "\x7f\xdf\x03\xff\x67\x44\xfc\x9f\xf1\x13\xff\x56\x1f\xf0\xef\xcb" - "\x7c\xcb\xb9\x6a\x9c\x6f\xe9\xc4\xf9\x16\xd7\x9e\xf0\x01\xf0\xef" - "\x3e\xdf\x72\xd6\x0d\xff\xe7\xfa\xc1\x7f\xfb\x41\x69\xbe\xe5\xea" - "\xe3\xbf\x7d\x00\xfc\xb7\xf7\x83\xff\xa1\x9e\x5b\x69\xbf\x82\xf8" - "\x3f\x37\x00\xfe\xcf\xf9\x80\x7f\xa3\x9f\xf2\xbf\xbd\x07\xfe\xcf" - "\x8a\xf8\x3f\xeb\x27\xfe\xcf\xf9\x82\x7f\x1f\xe6\x67\x2e\x20\xfe" - "\x41\xfe\x1b\xb7\xba\x9d\x0d\x18\x08\xff\x6e\xf2\xdf\xe6\x86\xff" - "\x0b\xfd\xe0\xff\xbc\x84\xff\x6b\x40\xfe\x9f\x1f\x00\xff\xe7\xfb" - "\xc3\xff\x10\xcf\xc5\x9c\xbf\x82\xf8\xbf\x30\x00\xfe\x2f\xf8\x82" - "\x7f\x3f\xe5\xff\xf9\x1e\xf8\xb7\x89\xf8\xb7\xf9\x89\xff\x0b\x3e" - "\xe0\xdf\x97\xf9\x9c\x8b\x6c\x3e\xa7\x13\xe7\x73\x5c\x67\x44\x06" - "\xc0\xbf\xfb\x7c\x4e\x87\x1b\xfe\x2f\xf6\x83\x7f\xfb\x41\x69\x3e" - "\xe7\xea\xe3\xdf\x3e\x00\xfe\xed\xfd\xe0\x7f\xa8\xe7\x6e\xec\x57" - "\x10\xff\x17\x07\xc0\xff\x45\x1f\xf0\x9f\xed\xa7\xfc\xb7\xf7\xc0" - "\x7f\x87\x88\xff\x0e\x3f\xf1\x7f\x71\x88\xe6\x7f\xba\x0c\x38\xff" - "\x23\xa8\xb2\xb6\x76\x15\xc7\x98\x85\xdc\x82\xd2\x50\x99\x96\x38" - "\x54\x39\x71\xa6\x24\x1b\x79\xf2\x3c\xf0\xc4\x70\x9e\x3c\x77\x5e" - "\x8d\xf1\x02\x0b\x29\x8c\xff\x3d\xce\x88\xc2\xe5\xc8\x0d\xac\x2f" - "\x58\x4a\x14\xce\x90\x0d\xec\x7c\x95\xa9\xd5\x4e\xb0\xcd\xab\x91" - "\x06\xa7\x5c\x34\xc0\x39\x38\xfa\xbd\x4e\x5d\x92\x09\x79\x3a\xcd" - "\xa4\x05\xf0\x52\xd3\x62\x06\xda\xaf\x62\xd8\x42\x5e\x40\x7d\xd4" - "\x6f\x9d\x21\x0a\xc7\xb7\x9a\xb1\xc0\xe3\xb0\xe0\x15\x44\x16\xde" - "\x42\x05\xe4\x25\xf2\x08\xf9\xaa\x5d\x85\xfb\x95\xba\x16\xd5\x01" - "\xbe\x1d\xdf\xea\xc6\x96\x40\xbe\xa1\x9f\x97\xe9\x62\xeb\x1f\xf0" - "\xab\xac\x69\x02\x5a\x66\x75\xfa\xc9\xa7\x2e\x5f\xce\xbf\xf8\x30" - "\x4f\xe1\xd4\xe0\x3c\x85\xa0\x5a\x3f\xc1\x37\x3e\xad\xd7\x79\x9c" - "\x69\x1d\x72\x3e\x39\x2a\x7c\xe3\x93\x73\x94\x27\x9f\x86\x7a\xfe" - "\xc0\x21\xfa\x83\x71\x94\x73\x3e\x75\xd9\xfd\xe3\x93\xd3\xaf\xfd" - "\xbf\xbd\xc7\xd3\x42\x15\x8e\xa7\x81\x4f\x3e\xf6\xa7\xf5\x65\x1e" - "\x67\x70\x87\x9c\x4f\x42\x9c\x6f\x7c\x12\xde\xeb\xc1\xa7\x21\x1e" - "\xe7\x0a\x62\x3c\x68\x21\x96\xf3\xc9\x59\xea\x1f\x9f\x04\x1f\xce" - "\x7f\xf8\x30\xee\x93\x13\x3d\x8e\xfb\x04\x18\xf7\xf9\xc6\x27\xa3" - "\xce\xe3\xcc\xf0\x50\xf3\x49\x4e\x94\x3e\xf1\x49\x4e\x16\x78\xf2" - "\x69\x88\xc7\x63\x72\xc2\xe2\x7f\xc1\x2f\xe1\x7c\xa2\x33\xfc\xe2" - "\x93\x9c\x24\x0d\xc9\xf8\x44\x2e\x57\xe3\xf8\x04\xf8\xe4\x63\x7f" - "\x32\x96\x79\x9c\x71\x1e\x72\x3e\xc9\xca\x7d\xe3\x93\x3c\xa8\x07" - "\x9f\x86\x76\xdc\x20\x97\x35\x70\x3e\xc9\xca\x18\x9f\x72\x88\xd5" - "\x3f\x3e\xc9\xbd\xc6\xff\x1c\x94\x1d\x2d\x0f\xa8\x40\x3b\x5a\x00" - "\x3b\xda\x37\x3e\x65\xeb\x3c\xce\x64\x0f\x39\x9f\x02\x62\x7d\xe3" - "\x53\xc0\xdf\x3c\xf9\x34\xc4\xf6\xad\x3c\x20\x95\xf3\x29\x60\x16" - "\xe7\x93\xbc\xc8\x3f\x3e\x05\xf8\xb0\xff\xb3\xef\x73\x58\xbd\x6c" - "\x3e\x79\x60\xfc\x35\x65\xf3\xc9\x03\x15\xbe\xf1\x2a\xf0\xd9\xcb" - "\x6a\xf3\xc9\x03\x75\x9c\x57\x0a\x07\xe7\x95\x62\x9a\x7f\xbc\x0a" - "\x34\xf8\x7b\x7e\xab\x97\xdd\x27\x1f\xae\xbe\xa6\xec\x3e\xf9\x30" - "\x1f\xe5\xdf\xf0\xa0\xcb\x6a\xf7\xc9\x87\x89\xf2\x6f\x98\x28\xff" - "\x02\xfd\x94\x7f\xc3\x7d\x90\x7f\x7d\x9f\xfb\xea\x65\xfb\xc9\x95" - "\x95\xd7\x94\xed\x27\x57\xce\xf3\x8d\x57\xca\x77\x2f\xab\xed\x27" - "\x57\x66\x70\x5e\x29\x67\x73\x5e\x0d\x2f\xf6\x8f\x57\x4a\xaf\xf1" - "\x5f\x06\x3a\x2f\xd6\xdb\xfe\x1b\x71\x8d\xd9\x7f\x23\x7c\xb4\xff" - "\x46\x5c\x66\xfb\x6f\x84\x68\xff\x8d\xe0\xf6\x5f\x4e\x90\x9f\xf6" - "\xdf\x08\xbf\xec\xbf\x1e\xbc\x12\xfb\x95\x2a\xec\xda\xb2\x01\x47" - "\xee\xf4\x8d\x57\xaa\xe0\xcb\x6b\x03\x8e\x6c\xe4\xbc\x1a\xb9\x83" - "\xf3\x6a\x84\xcd\x3f\x5e\xa9\xb4\xfe\x9e\x4f\xeb\x6d\x07\x06\x57" - "\x5d\x5b\x76\x60\xb0\x6f\xe3\x5f\x79\xf0\x7b\x97\xd7\x0e\x0c\xe6" - "\xe3\x5f\x79\x30\x1f\xff\xe6\xa8\xfc\x1b\xff\xca\x83\x7d\x18\xff" - "\xfa\x30\xef\x27\x57\x6b\xd1\x06\x74\xe6\x66\x6d\x0d\x05\xfa\x87" - "\xa6\x10\x79\x67\x38\xf0\x4b\x05\xfc\x5a\xa3\x25\x5d\xb9\xc0\x2f" - "\xab\x83\x3c\xf9\xca\x31\x5a\xd7\xe6\x24\x9d\xc0\xab\x8b\x60\x07" - "\x9a\xac\x16\x3c\xa3\xf7\x6f\xcd\xf2\xd0\xf7\x9e\x79\x45\x4d\x90" - "\x5f\x48\x7f\xa7\x2a\xb0\x9e\x02\xbf\x18\xff\x54\x85\x7a\x47\xee" - "\x06\xed\x13\xa7\x8f\xd1\x65\x66\x4a\x6b\xf5\x76\xa8\xd3\x1c\x73" - "\xad\xbe\x91\x44\xb7\x90\x20\xed\x53\xc8\x97\xd0\x45\x98\x6e\xb2" - "\x36\x12\xf4\xfb\xc9\xe6\xc0\x8f\xe9\xc2\x1c\x5f\xe8\x54\xe8\xbf" - "\x09\xcf\x15\x4a\x3e\x9a\x4c\xa7\x8a\x18\xff\x7b\xce\xa9\x32\xfe" - "\x7f\xa1\x53\xbf\x89\xe7\x13\x87\xdc\x16\x0c\x65\xf3\x7f\xc2\x31" - "\xcd\x58\xa9\x8e\xcb\x16\x53\x0a\x75\x1c\x5d\x67\xb3\x12\xac\x67" - "\x9d\xad\x8a\xa4\x27\x11\x75\x5d\xa7\x85\xa4\xd9\xa8\xb5\x2e\xe3" - "\x24\x89\x3e\x8f\xeb\x02\x88\xa7\xd0\xbf\x71\x7e\x87\x34\x09\xc7" - "\x74\x63\xa1\xbc\xb2\xba\x7a\x42\x42\xd7\x00\xad\x1d\x44\xce\xce" - "\x6b\xe2\x98\x5f\x2e\xe8\x4d\x19\xcd\x04\x68\x57\x6a\x72\x7c\x89" - "\xf4\xd4\xc3\xf3\xa9\xdd\xeb\x0d\x21\x1b\xfe\x0b\xd3\x90\xb6\xb8" - "\xcf\xd4\x64\xb0\xb2\x3c\xd2\x73\xce\xbb\x0c\x62\x4a\xe9\x24\x75" - "\x0e\x42\xe0\x7b\xc6\x4f\x63\x1b\x01\x5f\x21\x7e\xca\x6d\xf5\xa4" - "\x21\x99\xaf\x94\x8f\xce\x40\xbb\xd5\x99\xbb\x7e\x02\xaf\x63\x60" - "\xfb\xc0\xf8\x5a\xaf\x73\xe1\x6b\xf4\x98\x4b\xc3\xd7\xa8\x03\x43" - "\x8b\xaf\xa1\xb6\x5f\x47\x6d\xba\x34\x7c\x8d\x1e\xc5\xf1\x35\x6a" - "\x2a\xc7\xd7\x68\xa5\x0b\x5f\x81\xed\x97\x0f\x5f\x6a\x0b\xc7\x97" - "\xba\xcc\x3f\x7c\x8d\xce\x1d\x92\x79\x56\x79\x98\x19\x6d\x6d\xc0" - "\x97\x28\xbf\x46\x36\xfb\x80\x2f\x37\xf9\x15\xb6\xf2\xd2\xf0\x15" - "\x36\x71\x88\xf1\x35\xc4\x36\xf7\x0d\xb6\x4b\xc3\x57\xd8\x2b\x1c" - "\x5f\x37\x14\x73\x7c\x85\xe9\x5d\xf8\x1a\xd9\x7c\xf9\xf0\x75\xc3" - "\x0c\x8e\xaf\x1b\x94\xfe\xe1\x2b\xcc\x2f\xff\x57\xbd\xc7\x07\x37" - "\x47\xe1\xf8\xc0\x99\x6b\x14\xe5\xd7\xa8\x43\x03\xe3\xcb\xe8\x26" - "\xbf\x6e\x3a\x72\x69\xf8\xba\x29\x7b\x68\xf1\x35\xd4\xe3\x84\x9b" - "\x66\x5f\x1a\xbe\x6e\x3a\xc8\xf1\x75\xa3\x83\xe3\xeb\xa6\x6a\x17" - "\xbe\x46\x1d\xba\x7c\xf8\xba\xb1\x8c\xe3\xeb\x46\xbd\x7f\xf8\xba" - "\xd9\xbb\xff\xe7\x41\xcd\x6b\x8f\x29\xc5\x31\x0d\xe0\x4b\x94\x5f" - "\x3f\xcd\xf1\x01\x5f\x6e\xf2\x6b\xcc\xcf\x2e\x0d\x5f\x9a\x93\x43" - "\x8c\xaf\x21\x1e\xdb\x68\x76\x5e\x1a\xbe\xc6\xdc\xc7\xf1\xa5\x99" - "\xc7\xf1\x35\x46\xe7\xc2\xd7\x4f\x73\x2e\x1f\xbe\x34\x4a\x8e\xaf" - "\x9b\xab\xfd\xc3\xd7\x18\x1f\xfc\xbf\xfa\x32\x1f\x1f\x4e\x70\x1c" - "\xe6\xcc\xcd\x16\xe5\xd7\x33\x8f\x0e\x8c\xaf\x6c\x37\xf9\x75\xcb" - "\xe6\x4b\xc3\xd7\x2d\xbf\x1c\x5a\x7c\x0d\xf5\x78\xec\x96\xb0\x4b" - "\xc3\xd7\x2d\x1b\x39\xbe\xc6\x56\x72\x7c\xdd\x62\x74\xe1\xeb\x99" - "\x47\x2f\x1f\xbe\xc6\xea\x39\xbe\xc6\xea\xfc\xc3\x57\xb8\x0f\xfe" - "\x7f\x7c\x5d\x47\x18\x1f\x7f\x69\x63\xc8\x71\xce\x4b\xc3\xd8\xb8" - "\xb7\xaf\xed\x31\xe4\xb8\x94\x4b\xc3\xd8\xb8\xf3\x1c\x63\xe3\xb4" - "\x1c\x63\xe3\xda\xae\xcc\x18\x32\xbc\x86\x63\x2c\x3c\xd7\x3f\x8c" - "\x8d\x1f\xc2\xf5\x0f\x6d\xf5\xa5\x8d\x23\xb5\x0b\x2e\x0d\x63\xda" - "\x51\xd7\xf6\x38\xf2\xd6\xa6\x4b\xc3\x98\xf6\x69\x8e\xb1\x5b\xd7" - "\x71\x8c\x69\x67\x5d\x99\x71\xe4\xad\x11\x1c\x63\xe3\xfd\x5c\xb7" - "\xd1\xfa\x75\xfe\xa5\xef\x75\x9b\x3b\x26\x5d\xda\x58\xf2\xf6\xfd" - "\x97\x86\xb1\xdb\x97\x5f\xdb\x63\xc9\xdb\xa3\x2e\x0d\x63\xb7\xef" - "\xe6\x18\xbb\xcd\xc2\x31\x76\xfb\xce\x2b\x33\x96\xbc\x6d\x13\xc7" - "\xd8\x6d\xb3\xfd\xc3\xd8\x1d\x91\x43\xb7\xde\x74\x67\xe1\xa5\x8d" - "\x27\xef\x9c\x78\x69\x18\x9b\x70\xe4\xda\x1e\x4f\x4e\xd8\x7a\x69" - "\x18\xbb\xf3\x36\x8e\xb1\x09\x33\x39\xc6\xee\xd4\x5c\x99\xf1\xe4" - "\x1d\x76\x8e\xb1\x3b\x2a\xfc\xc3\xd8\x9d\x3e\xf8\xff\xf7\x75\x9d" - "\xec\x2e\xdb\xa5\x8d\x29\xef\xca\xbb\x34\x8c\xdd\xf5\xd0\xb5\x3d" - "\xa6\xbc\x4b\x79\x69\x18\xbb\xeb\xb7\x1c\x63\x3f\x2a\xe7\x18\xbb" - "\x2b\xf5\xca\x8c\x29\x7f\x34\x8f\x63\xec\x47\xe1\xfe\x61\x0c\xb7" - "\xb5\x0c\xd5\xfa\xde\xdd\xb1\x97\x36\xae\x9c\x78\xf6\xd2\x30\x36" - "\xf1\x8f\xd7\xf6\xb8\x72\xe2\xe2\x4b\xc3\xd8\xc4\x93\x1c\x63\x13" - "\xc3\x38\xc6\x26\x9a\xaf\xcc\xb8\x52\x57\xc5\x31\xa6\xf3\xcf\x1f" - "\x85\xfc\xee\x5e\xfe\xaf\x16\x2d\x4d\x5e\xb0\x78\x51\xbc\x76\xd1" - "\xd2\xa4\xc4\x57\xb4\xaf\x2e\x5a\x95\xf0\xd0\x9d\xcb\x27\x69\x13" - "\x53\xb4\x89\x8b\x96\xbe\x28\x26\xc4\x8f\x20\x4f\x25\x2c\x5e\x90" - "\x82\x29\x90\xfb\xc5\xa5\x4b\x12\x96\x26\x69\x13\x13\x5e\x59\xbe" - "\x28\x31\x01\xff\x7f\x55\xbb\x70\x59\x22\x24\xbc\x90\xb0\x28\x39" - "\x41\xfb\xfc\xf2\x85\x0b\x13\x12\x5f\x1d\x41\x9e\x58\xbe\x38\x69" - "\x91\x61\x71\x82\x76\xda\x13\x8f\xdc\x33\x7b\xfa\xaf\x67\x3f\xfc" - "\x30\x06\x27\x73\x8b\x4d\x16\x4e\x73\x0b\xe3\x00\x73\x8a\x56\xf9" - "\x4f\xa6\xd7\x69\x08\x8b\x67\x5b\xd0\x4e\xd4\x39\x89\x44\x91\xdd" - "\x4e\x94\x79\xed\x44\xa5\x7d\x89\x44\xd1\xec\x7f\x56\xe5\xb7\x93" - "\x30\x9a\x3f\xc7\x22\x64\x53\x42\xf3\x02\xa2\xac\x41\x27\xac\x90" - "\xa6\x16\xb2\x4f\x68\xe1\x9d\x30\xa0\xad\x82\xe6\x05\x96\x37\xcb" - "\x7f\xa2\xb0\x06\x59\xea\xd3\x4f\x12\x39\x1d\xf1\xe3\x4d\x7f\x15" - "\xac\xf2\xbd\xb8\xd3\x01\xda\x4e\xe4\x93\x76\xc0\x55\x44\xe4\xf7" - "\xcc\x80\x2b\x16\xae\x78\xb8\x72\xe1\xda\x04\x57\x19\x5c\x3b\xe1" - "\xaa\x82\xab\x1a\xae\x7a\xb8\x1a\xe1\x32\x13\xf9\xe4\x79\x70\xa5" - "\xc2\x05\x79\x27\x6f\xe5\xe5\x4c\x2e\x87\xab\x89\xc8\xef\x55\xc0" - "\x15\x0e\x17\xe4\xbf\xd7\x4a\xe4\x11\x06\xb8\x94\x70\x85\xc1\x05" - "\xe9\x11\x51\x70\xe1\xfb\x3b\xf9\xb3\xfb\x34\x70\xcd\x26\x50\xcf" - "\x81\xaf\xfb\x92\xe0\x82\xef\xde\x57\x4a\xe4\xf7\x13\xb8\xa0\xbe" - "\xf7\xef\xf4\x9e\xff\x7e\xc7\x00\x65\x86\x87\xae\xb9\xd5\xcc\x62" - "\xe0\xc9\xef\x09\xa2\x99\x24\x80\x66\x5b\xea\x0d\x77\x13\xd9\x29" - "\xf9\xa4\xc3\xa6\x75\x20\x67\x94\x94\xc7\x74\x84\x7b\xa4\x59\x47" - "\xce\xa4\x06\x33\x31\x68\x30\xa6\xd9\xe0\xf0\x36\xa9\x81\xbf\x7f" - "\x4f\x98\x59\x36\xb2\x82\xc5\x80\xcb\xa9\x34\xd0\xf4\xd8\x37\x59" - "\xec\x37\xa0\x21\x9e\xcb\xa2\xc6\xf7\x2d\x54\xb9\x2b\x15\xfb\x7c" - "\xd5\x2a\xac\xd7\xa4\xb7\x79\xff\x82\xe7\x50\x37\x6b\xf0\x1c\x8c" - "\x73\xa9\xc0\x7b\x9a\x7d\xc2\xda\x19\x5c\x10\x85\xff\x5f\xdc\x12" - "\x63\xa0\xb9\x05\xd8\xa7\xe4\x55\x69\xff\x45\x9a\xe1\xbd\xce\xe0" - "\x8d\x4a\xed\x53\xa1\xb4\x99\x97\x2d\x37\xcb\xef\x89\x92\xca\xea" - "\x0c\x9e\x63\xa5\x45\x1b\x23\x68\x1e\x60\x48\x2c\x0f\xb0\x63\xa5" - "\xb9\x1b\xd4\x90\xaf\x18\xd3\x69\x71\x8c\x51\xfa\x1f\x7e\x8b\x68" - "\x7e\x41\x19\xfe\x86\xae\x21\x36\x76\x9f\x19\x45\xf8\xaf\x9a\xa0" - "\xac\x6b\x93\x4f\x7e\x04\xb8\x2e\xab\x7a\x0a\xeb\x3d\x59\x95\x5e" - "\x4f\x05\x6d\x5a\x00\x7c\x7f\x72\x70\xf7\x77\xc7\x6c\xd4\x61\x8c" - "\x54\x21\xe7\xee\xad\x18\x83\x0f\xdf\xc5\xba\xbd\x31\x9a\x28\xde" - "\xfa\x1d\x51\x62\x1b\x3b\x72\x26\x47\x4a\x71\xe8\xf0\x1d\x39\xe4" - "\x7f\x3c\x26\x9d\xba\x95\x1d\x48\x59\x7b\x26\x95\x71\x9a\x4e\xd6" - "\x9b\x65\x41\xc5\x98\x5f\x7b\x3b\xa3\xe5\xdb\xe2\xf3\x1d\xc8\x4f" - "\x2c\x5f\xc8\x2b\x8c\xc3\x7b\x8c\x73\x17\x0a\xc8\xd4\xa6\x4d\xa8" - "\xe0\x34\x2a\xd0\x63\x39\x98\x5f\xc8\xcf\x81\xff\xef\x99\x29\x40" - "\x7b\x9d\x99\x44\xa7\x5d\x4a\xa2\xa0\xee\x87\x9d\xd9\xbb\x23\xe0" - "\x39\xf4\xbb\xdd\x53\x20\x7f\x06\xa3\x77\xde\x06\x68\xfb\xe4\x6a" - "\x78\x36\xa5\x3b\xf6\x25\xa7\xb3\x4c\xc8\xde\x3d\x0d\xea\xe4\x30" - "\xcb\xb4\x5b\xa5\x36\x30\x19\xe7\xca\x27\xf2\x74\xb2\xd5\x1a\xb4" - "\x7b\x5a\x57\x32\xad\x2f\xf8\x92\x10\xf8\x26\xed\xbc\x40\x6b\x52" - "\x67\x51\x7b\xfe\x5c\x42\x6a\xe2\x9a\x48\xfa\x02\x12\x3e\x72\x0d" - "\xb5\x46\x3b\x49\xe8\xc8\xa6\x50\x5a\x3b\xab\x09\x64\xf4\x79\x92" - "\x5a\x4f\x2d\x75\x86\x4a\x92\x7a\x9c\xa8\x56\x2f\x22\x61\xe9\xb3" - "\xa8\x35\xad\x86\xda\x4d\x29\x4d\xa4\xce\x06\x97\xa1\x16\xf2\x1d" - "\x86\xab\x92\xa4\xaf\x24\x8a\x27\x41\x9e\xa6\x9d\x27\xaa\x3a\xc3" - "\x79\x48\x3b\x4d\x52\xe3\xa8\xa3\xb6\x06\xf3\xed\x27\xd1\x0e\x6b" - "\xe8\xea\xd3\x44\x51\x32\x17\xcf\x96\x1d\x25\x6f\x41\x5d\x3a\x83" - "\x03\x22\x2e\xe6\x05\x56\x9c\x4b\xa6\x8e\x8e\x9c\x7b\xab\xcd\xe4" - "\xdf\xaa\x3c\xda\x82\x75\xc6\xb8\xa1\xd0\x5e\xcc\x23\xe4\xe5\x58" - "\xe6\x3b\x10\xe7\xf7\x56\x82\x2c\x26\xd2\x73\x7c\x66\x0d\xce\x01" - "\xfc\xdc\x6b\x89\x76\xd0\x0e\xcc\x8f\xed\x06\x1a\x45\x89\xed\x8f" - "\x0a\x30\x10\x45\x47\x4e\xc4\x24\xb3\xec\x8e\x0c\x37\x1e\x22\x4f" - "\x86\x49\xdf\x13\xf3\xcc\x32\xcb\x6e\x63\xb1\x17\x05\xf6\xec\x9e" - "\x48\xcc\x0b\xe9\xc0\xff\xdb\xeb\x79\xfd\x22\x22\x30\x4d\x94\xa5" - "\xd8\xaf\xa3\x04\xec\xd7\xc6\x5d\xb3\x9c\xc1\x05\x06\x2a\xa7\x76" - "\x9a\x37\x57\x49\xcf\x69\x54\x4f\x3a\xa8\x1d\xea\x8d\x32\x56\x85" - "\x71\x52\x79\xfe\xfb\x30\x56\xa3\x5a\x9b\x8c\xff\x47\x9c\xc4\xef" - "\x08\x5b\x62\xe2\x50\xb6\x46\xd7\x63\xfe\xb9\x71\xf9\x89\x20\x7b" - "\xf3\x0a\xe2\xb0\x1f\x0a\xc1\x1b\x34\x17\x37\x6f\x54\x63\xff\xa6" - "\x80\x31\x9a\x3b\x57\xdd\x5d\x4e\x26\x09\x84\xfa\xfc\x7f\xf6\xde" - "\x07\x2e\xca\x2a\x5d\x1c\x7f\xe6\x65\xd0\x81\xf8\x33\x1a\x15\x15" - "\xd9\x68\x54\x54\xa8\x58\xd6\x5a\x8b\x39\x25\x1a\xb6\x2a\xa8\x64" - "\x94\xa6\x58\x68\x63\xa2\x4e\x88\x8a\x86\x82\x93\x29\x10\x28\x95" - "\x6b\x98\x08\xb4\xb1\xbf\xeb\xee\xcf\xdd\x75\xf7\xeb\xde\xeb\xde" - "\x8f\x6d\x53\x50\x97\x2d\x65\xd8\xbd\xed\xe7\xeb\xde\x9f\xdd\x46" - "\x42\x62\x5d\xd2\x31\xa6\x98\x60\x66\xce\xef\x79\xce\x79\x5f\xe6" - "\x9d\x97\x19\x15\xb7\xfb\xbd\x77\xfb\x46\xbd\xce\xfb\x9e\xf3\x9c" - "\xe7\x9c\xf3\xfc\x3b\xcf\x73\xde\xf3\x9e\x63\x67\x58\x9e\x55\x55" - "\xca\xf8\x53\x7f\x26\x64\x33\xed\x18\xe9\x1d\xb6\x2b\x07\xd3\x23" - "\x3b\xa4\x49\x99\xf4\x8d\x26\x3e\x57\xf1\xb3\x24\xa5\x49\x73\x84" - "\xcc\xfc\x73\x76\xd0\xb3\x44\xf4\x43\x9d\x44\x3b\x20\xfc\x8b\x49" - "\xab\x03\x7a\x21\xe4\x58\xe8\x77\x25\xb6\x69\xc2\x41\xbf\x2d\xc2" - "\x8f\x70\xba\x0e\x41\x07\xa9\x3f\xea\xed\x29\x7d\x95\x93\x6a\x9d" - "\x3a\xbd\x39\x88\x9f\x95\xbf\xb5\xd2\xb9\x95\xd8\x96\x08\xc4\xf9" - "\x3e\xfe\x8e\xc4\xdf\x3f\x34\xb7\xd3\x58\xcb\xf1\x5e\x45\xf7\x6f" - "\x5c\xcb\x5c\x19\xd8\x92\x5e\x89\xe8\x3e\xc9\xe9\x84\xa5\x7b\x08" - "\x4f\x25\x9d\xdd\x89\x69\x04\x83\xe9\x1e\x27\xe4\x6d\x17\xf8\xc7" - "\xd7\xb9\xc9\x66\x05\xe1\xbf\xfb\x26\x81\x5f\xe0\x25\x7c\x0a\xee" - "\x03\x7b\x59\x8f\xc0\x7d\x77\xba\x82\xbb\x1a\xd3\x14\xfc\x19\xab" - "\x95\x3a\xee\x5e\x8c\x75\xc4\xa8\xfb\xb0\x6f\x2f\x73\x13\x0e\xcc" - "\x2b\x76\x82\x25\x9f\xf2\x2a\x30\x8d\xca\xaa\x64\x2a\xa2\x39\x1b" - "\x71\x1c\xe7\x38\x1a\x9d\xb0\xa2\x47\x6d\x37\x90\x46\xb1\x8a\xad" - "\x95\x71\xb5\x28\xb8\x02\x78\x14\x99\x7a\xd7\x22\xf3\x94\xf0\xc6" - "\x10\x5e\x84\x77\x3b\xe1\xe9\xc9\xea\xbe\xcb\xb6\xb3\x18\x61\x74" - "\x32\xfc\x9f\xc9\x2e\x29\xed\xa6\xb3\x3b\x59\xe5\x9d\xc7\x49\x37" - "\xd0\x06\x02\xca\x24\xd6\x7b\x4f\xba\xc6\x06\xea\x09\xce\x5f\x79" - "\x97\x8e\x9f\x5d\x7a\x2d\xeb\x46\x98\xbc\xa0\xf3\x3a\x25\x78\x10" - "\xd3\x8a\x94\x73\x43\x77\x21\x8c\x53\xba\x2b\xec\xbe\x88\x5b\xc7" - "\x82\xe4\xa8\x73\x92\x4f\x4a\x72\x95\xee\x48\x72\x83\xa3\xce\x0f" - "\xfe\xfa\x79\x35\xe6\xad\xcc\x8e\x7e\xc8\x05\x3a\xef\x79\x78\xe3" - "\xdc\x3d\xfc\xfc\x47\xd6\x8f\xbe\x5a\xc9\xdd\x40\x63\xdb\x39\xe9" - "\xde\xb1\x0e\xd7\x97\x5c\xfe\xf1\x9e\x8f\x05\xaf\xa1\x6f\x47\xfe" - "\x1d\xfa\xd4\x96\x1a\x49\xf8\x78\x7e\x84\xad\xa7\x74\xf2\xff\xd0" - "\xf7\x6c\x50\xe5\xb1\xfa\x79\x99\x82\x76\x93\xff\x42\x74\xe4\xed" - "\xf5\x3e\x62\xa7\x36\xfb\xeb\xe6\x65\x52\x1f\x4a\x8b\x99\xdf\xe1" - "\xed\xb3\xd3\x79\xba\xa6\x0d\xe4\x9b\x4e\xfe\x6d\xd6\x01\x60\xa8" - "\xbf\x99\xc3\xeb\xc3\x64\x5e\x27\xfa\xdf\xe7\x5c\x37\xcd\xcb\xa4" - "\xf3\x93\x77\x6f\x8d\x34\x4c\xaf\x63\xf6\xde\x31\xf3\x6a\xfa\x2a" - "\x27\x9f\x54\xce\xa7\x1d\x26\xde\x93\x4a\xdf\xeb\xe5\xbe\x63\x1a" - "\x9f\xb3\x99\x58\xcb\xcf\xc7\xc6\xe7\x7b\x8d\xe1\xf8\x85\x36\xa4" - "\x98\xca\x62\xdf\xcd\x0d\x0a\x9d\xbc\x2e\x3a\x1b\x7c\xd4\x59\xe9" - "\xde\x9f\x66\x95\xd8\x81\xef\x85\x5f\x5d\x59\x3c\xbc\x76\xdd\xcb" - "\xe7\xbf\xdb\xd0\xf7\xcf\xf2\xbe\xc3\x84\xed\xbb\xf7\xc4\x5c\x19" - "\x1f\xe5\x29\xbc\xaa\x97\x7d\xf2\x2b\xa8\x23\xec\xfc\xa7\xaa\x5f" - "\xc6\xa1\xfd\xba\x6f\xcb\x95\xf7\xeb\xbe\xcc\xa1\xfd\xba\xef\xa7" - "\xdf\x6e\xbf\xee\x0b\xfb\xfe\x53\xd5\x2f\xd3\xd0\x7e\xfd\xe0\xb1" - "\x2b\xef\xd7\x0f\x4c\x43\xfb\xf5\x83\x2d\xdf\x6e\xbf\x7e\xb0\xfd" - "\x32\xfa\x95\x36\xb4\x5f\x53\xc6\xff\x1d\xfd\xf2\x0c\xed\xd7\x94" - "\xc7\xbe\xdd\x7e\x4d\x09\x7b\xfe\x59\x58\x7b\xb8\x6b\xb7\x5d\xd8" - "\xc3\xfb\x75\xc3\xb7\x87\x53\x8e\x0f\xb5\x87\x0f\x4c\x0a\xd8\xc3" - "\x07\x6e\xba\x22\x7b\x88\x0e\xa2\xb0\x87\xf7\xff\x75\x88\x3d\xac" - "\x5a\x08\xa1\xed\xe1\xfd\xef\x73\x7b\x58\xbd\x70\x98\x7d\xb8\xbf" - "\x66\xd0\x1e\xc6\x2e\x84\x20\x7b\x18\xb7\xdb\xde\x57\x79\x7f\xf7" - "\x95\xd9\xc3\xfb\xbb\x87\xda\xc3\xfb\x33\x83\xed\xe1\x03\xa6\x8b" - "\xc8\xa1\x27\x94\x3d\xcc\xf2\x9e\x67\xb2\x6c\x78\x86\xd7\x9e\x07" - "\x8a\x2f\x52\x57\xd9\x25\xea\x2a\x1b\x66\x5d\x9d\x61\xeb\x32\xfc" - "\xb3\x15\xfd\x0c\xe3\x96\x37\x41\xea\xc2\x68\xb7\x2d\xe9\x24\x38" - "\x8a\x3d\x30\xc1\x8a\x32\x61\x83\xf4\xb6\xba\x1e\x68\x4b\xea\x02" - "\x16\xf5\xcf\x56\xf6\xff\xcc\x07\x73\x21\xc9\xe6\x0f\x0f\x38\x8a" - "\x3c\xc3\xe4\xeb\x0f\x2d\x8a\x6c\xb6\x79\x51\x36\x37\x90\x3c\xa6" - "\x9f\x70\xf4\x9c\x95\x65\x33\xfd\x77\x83\xfc\xb1\x09\xf9\x0c\x29" - "\x9b\xa8\x13\xc1\xb2\x59\x69\x15\xb2\x99\xfe\xd2\x50\xd9\xac\xb4" - "\x86\x96\xcd\xf4\x65\x42\x36\x2b\xad\xc3\xeb\x43\x7a\x6a\x40\x36" - "\x2b\xad\x41\xb2\x79\xdb\x7c\xf4\xc7\xd2\xb7\x5f\x99\x6c\xa6\x6f" - "\x57\xfa\x7e\x40\xee\x3b\xd2\xab\x33\x58\x36\xd3\xc3\x9e\x75\x4d" - "\xe7\xaf\xa3\x3d\x8c\x39\x2b\x4d\xad\xf2\xa1\xdf\xea\x2f\xef\xe9" - "\xce\xf2\xb1\x3e\x3a\x87\x9d\x49\x93\x81\x6d\x4c\x89\xe9\xc3\x98" - "\xb2\xaf\xcf\x62\x60\xd1\xbf\xf5\xb3\x81\x44\xd2\xab\x78\xd6\x97" - "\x12\x87\x34\x4b\xc6\xdf\xd1\x07\x36\x40\x02\x5e\x89\x07\x64\xba" - "\xe2\x7d\x1a\xdb\x98\x18\xbd\x6b\x03\xa4\xc6\xbb\xc1\x80\x6d\xc8" - "\x8d\xdf\x66\x04\x8c\xf9\x13\xe8\x9e\xd9\x9a\xd2\x1b\xbe\x06\x3d" - "\xcd\x27\xfa\xa3\xb0\xbe\xe2\x78\xc6\xd6\xa5\x40\x43\x21\xb6\x47" - "\x82\xc4\x06\x89\x1d\xf6\x6d\x4c\x91\x58\xdc\xee\x17\xd8\x0b\xb9" - "\xbc\x4d\xfe\xe4\xf9\x66\x94\x21\x33\x2b\xb5\x50\xbd\x66\x3a\x0f" - "\x98\xdd\x36\x3f\x83\xf5\x25\x46\x57\x7f\x0d\x74\x16\x76\x72\xfd" - "\x06\x48\x61\x03\x29\x12\xd2\x20\x77\xc9\xf3\x46\xe2\x7b\x2e\x93" - "\x9a\xe8\x5c\x74\x3d\xd6\xad\xf3\x55\x60\x5d\x5e\xac\xeb\x3c\xd6" - "\x75\x0e\xeb\xb2\x61\x5d\x36\x51\xd7\xf0\x68\x3e\xd5\x73\xb1\x79" - "\xdf\xac\x2d\x63\x68\x7f\xda\xcf\xe3\x8b\x47\x66\xd2\x1c\x70\xef" - "\x0b\x96\x61\xca\xfb\x83\xb9\xe1\xf0\xef\xfe\x25\x24\x31\x43\x57" - "\xf7\xdc\x97\x3e\x65\x59\x5e\x80\x97\x7e\x09\xa9\xa4\x73\x6d\x9e" - "\x2f\x50\xcf\xba\xba\xdf\x4f\xe9\x19\x6e\x5d\x61\xbf\x7f\xad\xb4" - "\xb1\x76\x7f\x0c\xc6\xa2\x31\xbb\xcb\x77\xdb\x58\xf1\x40\xd2\xbc" - "\xbc\xfe\xa4\x79\x65\x4b\xbd\x46\x94\x2b\x56\x6c\x2a\x04\x53\x97" - "\x34\x23\xea\xc3\x8f\x71\x8c\x78\x12\x0c\x1d\xd2\x0c\x73\xe9\x5f" - "\x68\xfe\x6e\x5a\x4e\xf0\xfc\xdd\xb4\x62\x90\xcc\xdd\x20\x3d\xe4" - "\x01\x69\x7a\x12\x20\x5c\xf0\x95\x31\x45\xe0\x32\xbf\x9f\xf5\xb3" - "\x31\xb0\xd5\xcb\x3e\xc7\xf8\x34\x77\x17\xc6\xc0\x59\x77\xe8\x9c" - "\xf6\x0d\x34\xaf\x65\x7e\x1b\x69\xfa\x37\x1c\x97\xe2\xf1\xbe\x02" - "\x79\x07\xd6\x42\xb8\xfa\xac\x64\x2e\xf7\xe2\x7d\xbc\x7b\x64\xa6" - "\xaf\x34\x17\xbc\x89\xaf\x18\x07\xaa\x76\xe7\xf9\x30\x8e\xf5\x1b" - "\x7a\xba\x4b\xff\x0a\x49\x8e\x1e\x1f\xd4\xa1\xdc\x2d\xf5\x19\x48" - "\x1f\x72\xed\x4f\x7f\x08\x5d\x45\x20\x95\x7e\x05\xb1\xac\x37\x25" - "\x46\x91\xeb\x39\x3d\xf1\x9e\x2d\x3d\xcc\x4f\xf2\x4d\xf3\x0b\x98" - "\x17\xb7\xf5\x2b\x1c\x6b\x5d\xdd\x50\x87\xb1\xb4\x6f\x9d\x65\xb4" - "\xab\xd7\x72\xf5\x7e\x3f\x24\xc4\xb9\xc1\x58\xf7\x25\xca\xe0\x3a" - "\x94\xbf\x2f\x51\xce\x5d\x42\xce\xe9\xfb\x9b\x7a\x92\xf1\x1d\x6f" - "\x67\x34\x7c\x29\x64\x9c\xcb\x1d\xc9\xf8\x5a\x94\xbb\x35\x01\xb9" - "\xf3\xf6\xa2\x8c\x57\x3e\x38\xa5\xce\xc6\x60\xcb\x4a\x90\x1a\xce" - "\x8e\xa4\x3c\x5d\xe4\x1d\x92\xe9\xc3\x6c\x0f\x04\xe2\xb0\x19\x0f" - "\xf5\xdf\x34\xaf\xcc\x34\x9f\x9d\xef\x90\xcc\x47\x30\xdd\x60\x5a" - "\x78\xbb\x11\xe9\xfd\x90\x98\x9f\x99\x61\xa6\xd8\xdd\x89\xb4\x20" - "\xba\x60\x1c\x7d\x7b\x87\x34\xad\x82\xe8\xb8\xf1\x20\x44\x58\x1f" - "\x64\x9d\x48\xb3\x1a\xc6\xe7\x34\xa6\x95\xf3\x79\xea\x6d\x26\xf8" - "\x88\xcf\x27\x8a\x32\x3e\xa4\x9b\x37\x66\xa1\x11\xf9\x5d\x6c\x7f" - "\xae\x9f\xeb\x1c\xd1\xb1\xab\x00\xa4\xa5\x3d\x48\x2b\x1f\xd2\xaa" - "\x8f\xdb\x82\x6c\x6e\x0b\xca\x7f\xeb\x29\x71\x32\x7f\x56\x7e\x04" - "\xdb\xfa\x3c\xbd\xcf\xf0\xc1\x12\x2b\xb0\x2d\x5f\x20\xbd\xdc\x27" - "\xc9\x6e\xc4\xf9\x37\x0a\xdb\x40\xf4\x8a\xed\x01\x23\xab\xec\x76" - "\xfe\x72\x6b\x6b\xa4\x0f\xe5\x97\xec\x43\xfc\x36\x5d\x14\xea\x65" - "\x5c\x15\xe9\x2f\xea\x73\xfc\x36\x6e\xaf\x72\xeb\x50\x6f\xbd\x1b" - "\x53\xc6\x0d\x6c\x4c\x31\xe1\x35\x46\xb1\x21\x74\x8e\xd6\x01\xa2" - "\x6d\xe5\x83\x8d\x64\x3f\x1c\x18\x3d\x7b\x91\xb6\x71\x34\xde\x6c" - "\x4c\x49\xe2\x34\x7e\x36\x05\x26\x7a\x40\x87\x6d\x32\x62\x7b\xa1" - "\x61\x05\x18\x4e\x58\x3a\xc0\x87\xba\xa1\xd0\x7d\xce\x4a\x13\x20" - "\x5e\xe9\xfd\x94\x3f\x83\x4c\x33\x5d\x78\xb9\x9b\x7e\x4d\x40\xee" - "\xa6\x5f\x43\xb4\x13\x72\x37\x3d\xe1\xbb\x28\x77\x1f\xe5\x72\xb9" - "\x8b\x18\xb8\x89\xcb\x53\x8d\xc3\xfb\x1b\xa4\xd1\x74\x4a\x03\x92" - "\x99\x3f\xfc\x9c\x64\x26\x23\xe5\x7f\xaa\xcc\x7c\xd3\x97\x62\xc2" - "\xeb\xbf\x44\x66\x10\x2f\x97\x19\xa2\xd5\x47\xb9\xfd\xa0\xd0\x88" - "\xeb\x6a\x79\x57\xb7\xa9\x14\xa6\xa1\xae\x9a\xe3\xb7\x8d\x81\x13" - "\x9c\x4e\x33\xcc\xa6\x85\xcc\xdf\x21\x65\x2c\x2b\xfd\x23\x18\xfb" - "\x6d\x8c\x39\xbc\xbf\x00\x7f\xcc\xcb\x89\x7c\x3e\xbb\x6a\x61\x1e" - "\xbd\x1b\xa1\xf7\x22\x34\x47\x17\x6f\x05\x3d\xcd\x95\xfb\xaa\x6b" - "\xf2\xe8\xfd\x08\x8b\x8d\x3c\xec\x43\xbd\xf6\x57\x7c\x60\xf7\x47" - "\x31\xf4\x11\x32\x0e\x3a\xe1\x5d\x3e\xaf\xc8\xaa\x76\x93\xef\x82" - "\x36\x33\x83\xaf\xf7\xa6\x77\x27\x98\xdf\xaa\xcc\xf9\x93\x4d\x90" - "\xe7\xe5\xe4\x79\xbb\x19\xd4\xee\x68\x9a\xb7\x13\x36\x25\xe3\x77" - "\xca\xbc\x9d\xf2\x4c\xf9\x4e\x29\xe3\x18\xcd\xf9\xa8\xca\x4d\x91" - "\xe1\xe4\x72\xd3\xa6\x92\xad\x0f\x94\x13\xcf\x68\x57\xa6\x0c\x48" - "\x60\x08\xe9\x63\xc4\xd4\xe4\xa1\xfe\xe8\xbb\xa4\x99\x53\xf1\x57" - "\x42\xba\xfc\x05\x7f\x23\xf0\x97\x9f\xdb\x36\xbc\xf1\x6a\x06\xff" - "\xfe\x15\xfb\x7f\x48\xb6\x8d\xeb\xb9\x4e\xde\x09\xb1\x67\xe5\xfb" - "\xbe\xca\x19\xed\xca\xbb\x8b\x41\xf8\x00\x7f\x0a\xa8\x6e\xe4\x91" - "\x5e\xbc\x4f\x11\xcf\x2a\x7c\xab\xf9\x33\xe8\x93\x30\x76\x31\xd1" - "\x7b\x4f\x94\x5f\x5d\x1f\xb3\x3c\x28\xff\x4e\xe5\xef\x5f\x90\x47" - "\xe4\xaf\xc9\xf6\xb7\x48\xd4\x3b\x33\x13\xe9\xa0\x57\xd7\x1b\x8a" - "\x1e\x4e\x69\x66\xd8\x33\x6d\x86\x47\x8b\x99\x65\xe1\xf0\xcc\x48" - "\xf1\xb1\x61\xe2\x0a\xfb\xfd\x23\x4b\x9a\x67\xce\x3a\xe8\xb3\xfb" - "\x07\x72\xe3\xdf\x2f\xf9\x62\x98\xfe\xc5\x23\x61\xf7\x7f\xf2\xc5" - "\xbc\x9c\xe6\xad\x9b\x47\xb2\x1f\xd3\x76\xd0\x0b\x3f\x3b\xdb\x2d" - "\x65\xdd\x31\x06\x62\x3b\xc1\x48\xfe\xd3\x9c\x9e\x77\x18\xf9\x50" - "\xbb\xce\x42\x72\xff\xf9\xdc\xf8\x01\xf4\x05\x5f\x3e\x0b\xe9\xfe" - "\x67\x13\xa3\xab\x56\x80\xbe\x1f\xfd\xd5\xfe\x67\x2d\xf1\x1f\x9d" - "\xea\x06\xd4\x13\x73\x9b\xdb\x09\xf5\x08\xcb\x3e\xcf\x8d\x9b\x95" - "\xc7\x3c\xc7\xf3\x5e\x85\xac\x14\x9f\x7d\xeb\x69\x88\x45\x5b\x64" - "\x74\x14\xff\x82\xbf\x53\x88\xdc\x24\x99\x1c\xde\x33\x50\xbd\x02" - "\x6d\x18\xda\xac\xd2\x27\xd0\x56\x7b\xbf\x82\xfd\x6a\x5b\xfd\xdc" - "\x4f\x02\xb6\xfa\x3c\xda\xea\x4a\xb4\xd5\xa5\x89\xd0\x66\xb5\x03" - "\xda\x8e\x91\x73\xad\xf1\x9e\xad\x56\xb4\xd9\x9b\xd0\x66\x17\x9f" - "\x01\x6e\xaf\x7b\xba\x01\x6d\x6d\xdc\x81\x35\x90\x30\xb0\x16\x6d" - "\xf6\x79\xcb\xd5\xfb\xb6\x0a\x9b\xfd\xc6\x1a\xb4\xd9\x6b\xd1\x27" - "\x5e\x83\x36\xbb\x27\x84\xcd\x3e\x17\xc6\x1f\x96\xed\x4f\xff\xda" - "\x14\xe9\x0d\x89\xc1\x0b\x4f\x80\xb4\xef\x3f\x46\x0e\x53\x4e\x32" - "\x0f\x86\xe3\x01\xd1\x9b\xe8\xef\x47\x3e\x9c\x40\x1e\x70\xbf\xd5" - "\x33\x32\x73\x00\xc7\x34\x5f\xdc\x8e\xb2\x9f\x9f\x3d\x29\xc5\x15" - "\x81\x71\xae\xf5\x1d\xd6\xbf\x2e\x17\xfd\xfe\xdc\x58\x6f\xd5\xcb" - "\x69\x55\xe8\x53\xfb\xd0\xf7\x1e\xe8\x4b\x34\x20\x0d\x8c\xae\x8d" - "\x96\x78\xa2\xa1\xff\x26\xe4\xe7\x88\xbb\x66\xa3\x0d\x9d\x7c\x60" - "\x05\x4c\x19\xa8\xde\x71\x88\x55\xef\x68\xf4\x55\xef\x68\xc2\xb2" - "\x71\x3f\x72\x12\x5f\xfe\x15\x30\xcd\xce\x76\x55\x94\xf9\x62\x5f" - "\x4e\x73\xc5\xee\x38\x88\xcf\x47\x29\x7f\xeb\x32\x88\xcd\x4a\xf9" - "\xc6\x2e\xf8\xf5\x53\x20\x3e\x09\x7e\x7d\x02\xd5\x18\xf7\xd1\x98" - "\xcb\xc7\x57\x99\x67\x18\x2f\x70\x7f\x3f\xc0\x37\xcd\x18\x2b\xf3" - "\xed\x44\x8f\x1d\x70\x3c\x19\x39\x38\xd6\x72\xbe\x7d\x02\xca\x38" - "\x8b\xf4\x8e\x3b\x80\x63\xed\xc0\xb7\x35\xd6\xca\x71\x0c\x8d\xb5" - "\x34\xce\x12\xdf\xde\x18\x36\xdf\x1e\xcd\xbb\x32\xbe\xed\x84\x2b" - "\xe4\x5b\x53\x80\x6f\x3b\xe9\xbc\x67\x93\xaf\x7a\x67\x72\x30\xdf" - "\x76\x9a\x03\x7c\xdb\x99\x82\xcf\x53\x02\x7c\xfb\x6a\x18\x7c\x8b" - "\xfc\xf2\xbb\xcb\xb7\xd9\x89\x57\xc8\xb7\x2b\xd5\x37\xaf\x8a\x6f" - "\xa8\x6f\x3b\x51\xdf\x76\x6a\xf4\x6d\xa7\x4a\xdf\x76\xa2\xbe\xed" - "\x54\xe9\xdb\x17\xc3\xe0\xdb\x55\x1d\xdf\x5d\xbe\xcd\x69\xbf\x32" - "\xbe\x95\x5f\xa1\xbe\xa5\xe6\x04\xf8\x56\x8e\xfa\x56\x8e\xfa\x56" - "\xae\xd1\xb7\x72\x95\xbe\x95\xa3\xbe\x95\xab\xf4\xed\x93\x61\xf0" - "\x6d\xd4\x9f\xbe\xbb\x7c\xcb\x2a\xbf\x42\xbe\x5d\xa1\xbe\xa5\x1e" - "\x52\xf1\x0d\xf5\xad\x1c\xf5\xad\x5c\xa3\x6f\xe5\x2a\x7d\x2b\x47" - "\x7d\x2b\x57\xe9\xdb\xdb\xc3\xe0\xdb\x7d\x95\xdf\x5d\xbe\xcd\x33" - "\x5f\x19\xdf\x2a\xae\x50\xdf\xc6\xeb\x03\x7c\xab\x40\x7d\xab\x40" - "\x7d\xab\xd0\xe8\x5b\x85\x4a\xdf\x2a\x50\xdf\x2a\x54\xfa\xb6\x65" - "\x18\x7c\x5b\xf4\xf0\x77\x97\x6f\xf3\xc3\xce\x7f\x2a\x7c\x53\x78" - "\x46\xfc\xe3\x7c\x63\xb9\xe0\x45\x7f\xf2\xff\x7d\x5a\xf0\x8d\xf8" - "\xc5\x79\xd7\x9b\x1b\x5f\x2d\xf3\xcc\x2b\xf3\x8c\xe8\x47\x7c\x23" - "\x3f\x92\xf3\x4d\xa7\x4f\x20\x1f\xd2\x8b\xbe\xa4\xe2\x47\x3e\x6a" - "\x61\x9e\x13\x96\x9f\x0c\xfa\x91\x5e\xad\x1f\xb9\x52\xed\x47\xfe" - "\x22\x88\x5f\x55\x5f\x23\xbf\x24\x99\x5f\x4f\x85\xf1\x23\x57\xbc" - "\x17\x86\x5f\xed\x97\xe4\x17\xf2\x26\x61\xa0\x57\xf0\xeb\x0d\xd9" - "\xff\xaf\x2b\xfc\x3b\xf9\xb5\x0e\xf9\x45\xfe\xff\x27\x20\xed\x5f" - "\x32\x5c\x7e\xe5\x5c\xd2\xff\x0f\xcd\xaf\x72\x18\x1e\xbf\x52\x73" - "\x02\xfc\x2a\x37\x79\x71\x4c\x53\xc6\xb3\x00\xbf\xc4\x78\xe6\xd5" - "\x8e\x67\x2b\xd5\xe3\xd9\xe5\xf0\x4b\x33\x9e\x7d\xa7\xf8\xb5\x30" - "\xec\xfc\xbf\x0f\x63\x71\x1f\xda\x39\x9a\xaf\x8c\xeb\xc6\x38\xd9" - "\xcb\x3e\x9f\xeb\xc6\x38\xd9\x3b\x32\x73\xf7\x1a\x48\x1e\xd8\x88" - "\x71\x32\xf2\xae\x6a\x0d\xa4\x57\xae\x01\xbd\x7f\x15\xc6\xca\x67" - "\x31\x56\x46\xfb\xd4\xff\x37\x4b\xfc\xf1\x3c\x17\xf8\x31\x56\xa6" - "\x79\x30\x6c\x6f\x32\xfb\x1b\xc6\xca\x9d\x68\xfb\x3a\xdf\x10\xb1" - "\xf2\x19\x25\x56\xfe\x6d\x50\xac\xfc\xf2\x73\x72\xac\x2c\xd3\xbf" - "\x4e\x4d\xfb\x27\x7f\x1e\x26\x56\x6e\xbd\x64\xac\x4c\x31\xf2\x7e" - "\x8a\x97\xcf\x5b\x46\xef\x93\x6d\xdb\x1b\xe7\xfe\xce\x58\xf9\x3c" - "\xc6\xca\x36\x41\xfb\x37\x86\x4d\xfb\xc7\xc3\xae\xff\x20\xdd\x20" - "\x7d\x19\x1c\x8b\x90\xce\xca\x18\x34\x80\x63\x10\xcd\x67\xf4\x57" - "\xed\xd8\x8e\xf2\xca\xf5\x83\x8f\x49\x1b\x13\x0d\xa4\x1b\xa4\x27" - "\xa4\x1b\x7c\x2c\x42\x3b\x88\x63\xd1\xe2\xfa\xe7\x60\x4a\xc3\x73" - "\x30\xd9\x1b\x1b\x1c\x23\x3f\x9a\x4f\xfc\x08\xd8\x36\xbf\xd6\xb6" - "\x2d\x57\xdb\xb6\xdf\x0e\x1d\x8b\x2e\x65\xdb\x9e\x0b\xa7\x2b\xad" - "\x97\xd4\x15\xd2\x11\x3e\x1e\xa1\xbe\xfc\x57\xe8\xca\x1b\xff\x39" - "\x5c\x7e\x3d\x11\x76\xfd\xc7\xe5\xf1\x6b\xa7\xfe\xd2\xfc\xda\x09" - "\xc8\xaf\xc3\x01\x7e\x05\xc7\xc6\x01\x7e\x89\xd8\xd8\xaf\x8d\x8d" - "\x97\xab\x63\xe3\xcb\xe1\x97\x36\x36\xfe\x2e\xf1\x6b\x51\xd8\x75" - "\x7e\x97\xc9\xaf\xcb\xd0\xaf\x9d\xa8\x5f\x13\xf4\x2a\x7e\x05\xc5" - "\xc4\x2a\x7e\xa9\xf4\x4b\x15\x13\x2f\x57\xc7\xc4\x97\xc3\x2f\x6d" - "\x4c\xfc\x5d\xe2\xd7\xe2\xb0\xeb\x3f\x2e\x8f\x5f\xe5\x97\xa1\x5f" - "\xe5\xa8\x5f\x13\x72\x03\xfc\x0a\x8e\x85\x03\xfc\x2a\x57\xe9\x97" - "\xca\x77\x58\xae\xf6\x1d\x2e\x87\x5f\xda\x58\xf8\xbb\xc4\xaf\x25" - "\x7b\xfe\x4e\x7e\x5d\x86\x7e\x95\x93\x7e\x1d\x52\xf1\x2b\x28\x06" - "\x56\xf1\x4b\xa5\x5f\xaa\x18\x78\xb9\x3a\x06\xbe\x1c\x7e\x69\x63" - "\xe0\xef\x12\xbf\xf2\x32\xfe\x3e\x7e\x55\x5c\x86\x7e\x55\xa0\x7e" - "\x4d\x84\x00\xbf\x82\x63\xdf\x00\xbf\x2a\x54\xfa\xa5\x8a\x7d\x97" - "\xab\x63\xdf\xcb\xe1\x97\x36\xf6\xfd\x2e\xf1\x6b\x99\xfb\x62\xb1" - "\x94\x3a\x86\xf2\x96\x06\xf8\x45\xbc\x19\xc0\xd8\x69\x20\x66\xc7" - "\xf6\xf0\xf1\xd3\xf8\xc5\xe1\xe2\x5d\xda\x0f\xe6\xd1\x6e\xfa\x26" - "\x44\xf8\x84\x4c\xe3\x13\x9e\xb0\xfc\x1c\x82\x63\xde\xb7\x87\xc4" - "\x50\x03\xca\x1c\xc5\xb2\x70\x31\xef\xbf\x5e\x71\x0c\x45\x7c\xa2" - "\x38\xca\xbb\x0e\xf9\x24\xfb\xf1\xfb\xff\xce\x39\x8a\x81\xde\x14" - "\x69\x3f\xfa\xf1\x25\xcb\x30\x86\x7a\x7a\xb8\x7c\x7a\x26\xec\xf7" - "\xdf\x34\x4f\x44\x31\x2f\xc5\x52\xf4\xde\xb1\xad\xb3\x1b\x2a\x37" - "\x80\x91\xbf\x7b\xec\x0e\x7e\xf7\xb8\xbb\x0b\x63\xaa\xb5\xc8\xb7" - "\x81\x5c\xd8\xd5\x05\xe9\x55\xcf\x89\x98\x4a\x89\xa7\xda\xdc\x1e" - "\xfe\xee\xd1\xe1\x75\xc2\x2c\x27\xf3\x34\x20\x3c\xc5\x51\xc7\xf3" - "\xde\x00\xd2\x95\xd2\xd3\x10\x4b\x3c\xc0\x18\x8c\xf3\x43\x1d\x43" - "\xd5\xab\xdf\x37\xae\x08\x17\x43\x5d\xfa\x7d\x63\xdd\x39\x11\x3f" - "\xf1\xf7\x8d\xff\x23\x62\xa8\xe5\x61\xdf\x7f\xcc\xf9\x99\x98\x6f" - "\x20\xda\x3b\x52\xbc\x80\xf2\xf4\x79\x7c\x8f\x98\xd7\xf3\xee\xda" - "\x51\x46\x31\x2d\xc5\xb3\x8e\xe2\x56\xa8\xdc\x0c\xc6\xfe\xbe\xdc" - "\x78\x8c\x51\x63\xbd\x68\xeb\x5e\x3e\x2b\x68\xbf\xe5\x0b\x30\xba" - "\x56\x59\xf8\x5a\x19\x8a\x65\x49\x57\xf8\x3b\xc7\xa7\x61\x72\x5d" - "\x07\x4c\xe1\xfa\x81\x7a\xe1\xad\x7e\x39\xcd\x1f\xbb\xa3\x89\xf4" - "\x64\xd6\x29\xe6\x21\x1e\x90\x7e\x7c\x74\x8a\x78\xf3\x0b\x28\xfd" - "\x44\xf0\x86\xf3\x45\x0a\x7e\x17\x3c\x54\x37\xfe\x14\x86\x3f\x47" - "\x2f\x8f\x3f\x6b\x83\xf9\x73\xe0\x4a\xdf\x07\x2b\xeb\x23\xd7\xa6" - "\x48\x07\xe4\xf7\xc1\x6f\x3c\x39\x5c\xfe\xac\x38\x7a\x65\xfc\xd9" - "\x09\x57\xc6\x9f\x9d\x26\xfe\x6e\x31\x88\x3f\x3b\xa7\x08\xfe\xec" - "\x4c\xa6\x58\x29\xc0\x9f\xaf\x2e\x93\x3f\x9a\x18\xe9\x3b\xc5\x1f" - "\x4b\xd8\xf9\x9f\x4b\xf0\xe7\x0a\xf5\x67\x67\x23\x7f\x87\x18\xcc" - "\x1f\x59\x7f\x76\x36\x51\x6c\x14\xe0\xcf\x17\x97\xc9\x1f\x4d\x4c" - "\xf4\x9d\xe2\xcf\xca\xb0\xf3\xdf\x17\xe7\x4f\xf9\x15\xea\x4f\xb9" - "\x89\xbf\x2b\x0c\xe2\x4f\xb9\xac\x3f\xe5\xc9\x14\x0b\x05\xf8\xf3" - "\xc9\x65\xf2\x47\x3b\x7f\xfa\x5d\xe2\xcf\xaa\xda\x2b\xe4\xcf\x15" - "\xea\x4f\x79\x23\x7f\x27\x18\xcc\x1f\x59\x7f\xca\x9b\x28\xf6\x09" - "\xf0\xe7\xed\xcb\xe4\x8f\x26\xe6\xf9\x4e\xf1\x67\x75\xd8\xfd\x9f" - "\x2e\xce\x9f\x8a\x2b\xd4\x9f\x0a\x13\x7f\xf7\x17\xc4\x9f\x0a\x59" - "\x7f\x2a\x92\x29\xd6\x09\xf0\x67\xcb\x65\xf2\x47\x13\xe3\x7c\xa7" - "\xf8\xb3\xe6\xe4\xa5\xde\x17\x29\xbe\xb3\xfa\xbd\xec\x00\xfa\x6f" - "\xe4\x3f\x93\xef\xdc\xe6\x3e\x0a\xde\xb5\x82\x37\x95\x5f\x83\xb1" - "\x4a\xe6\x0d\x7f\x27\xbb\x4a\xbc\x93\xe5\x7e\xdb\x8e\xbb\x66\xb3" - "\x6d\xfa\x04\xf2\xcb\xf8\x7b\x57\xfe\x6e\xe2\x7d\xca\x3b\x3a\xa0" - "\xf2\xdf\x28\x46\x45\xdf\x1b\x28\x4e\x2d\x3d\x33\x0c\xbf\xed\xe9" - "\x70\x7c\xb9\xf4\xbb\x89\x3a\xd5\x3a\x3e\x25\xf6\xfc\x56\xf9\x32" - "\xec\xf7\xae\xd6\xb0\xfb\x3f\x5e\x9c\x2f\xe5\x30\x3c\xbe\xe0\x78" - "\xb3\x23\x35\x47\xf0\xe5\x13\x0d\x5f\xca\xa7\x0c\xa8\xc6\x9d\xcb" - "\xe7\x8b\x66\xbc\xf9\x4e\xf1\xa5\xd0\x10\x36\xd6\x44\xbb\x44\x3c" - "\xa1\xf5\xdd\xbb\x9f\x86\xe4\xca\x0e\x48\x1f\xf8\x5b\x62\xf4\x5c" - "\xb4\x73\x03\xab\x12\x0d\x6d\x68\xe3\xb6\xba\xd9\xe7\x71\xee\x91" - "\x99\x1f\x7e\xec\x82\xb6\x3c\x27\xf4\x6f\xcc\x85\xea\xb3\xb4\x56" - "\xfd\x28\x54\x14\x52\x2c\xff\x1b\xf8\xe8\xd4\x97\x30\xf7\x20\x1b" - "\x70\xf4\x1c\x05\xfb\xe6\xdf\x00\x5b\x95\x12\xdd\x80\x30\x4b\x91" - "\x86\xe7\xa4\x42\xfb\x37\x18\x8f\x4e\x2c\x06\xe3\xec\x1e\xe6\x69" - "\xeb\xf9\x10\xf6\x63\x5d\xef\x17\x03\x10\x7d\x89\x27\xd5\xcf\x51" - "\xfc\xf9\xb6\xe0\xc9\x3c\xc1\x93\x37\x54\xf1\xa7\x09\xf3\xbb\xac" - "\xc8\x8f\x0b\x1a\x7e\x9c\xea\x06\xa4\xef\xc8\xb9\x6e\xe4\x87\x5b" - "\xe1\xc7\x17\xb0\xf5\x79\xe2\x87\x73\x70\xbd\x6b\xbf\xcc\x8f\x3a" - "\xb2\x5f\x56\x30\xee\x53\xe2\xcf\x73\x2a\x7e\x28\xdf\x64\xa9\xf9" - "\xa1\xc4\xfe\x1b\x91\x1f\x1b\x02\xf1\xe7\x37\x18\x7f\xee\xc3\xf8" - "\xb3\xf4\x8f\x20\xed\xdb\x3a\x5c\x7e\xac\x0b\x3b\xfe\x2b\xbc\xa0" - "\xb1\x65\x20\x6e\x47\x19\xf1\xc1\x51\x7c\x18\x88\x27\x34\x9e\xf8" - "\xfe\x96\x68\x28\x29\x42\xdd\x71\x8e\xcc\xec\x67\x18\xf3\x63\xbc" - "\xef\x58\xfc\x1f\x40\x73\x06\x82\x07\x03\x03\x0e\xd7\x51\x20\xda" - "\xdb\x37\xff\x07\xe7\xc3\x39\xa9\xc8\xbc\xc4\x0d\xd2\x04\x94\x43" - "\x8c\xf7\x8d\x4b\xe9\xbb\x5c\xb4\x6d\xfb\x57\xc0\x94\xd9\x56\xe6" - "\xa1\xd8\x94\x74\x88\xd6\x9e\x90\x5d\x6b\xb3\xbe\x07\x34\xaf\x33" - "\x10\xfb\x72\xda\xfb\x45\x00\x64\xdf\x88\xee\x91\xeb\x03\x7c\xa2" - "\xf5\x24\x9c\x57\x8f\x5d\xc6\x3a\x57\x35\xbf\x16\x3b\x2f\x6b\x7d" - "\x72\xbf\x3c\x5f\x50\xa7\xcc\xa9\x5d\xe9\x7c\x81\x32\xa7\x76\x5e" - "\xac\x27\x29\xfd\x33\xea\xcf\xb0\xf9\xb5\x3e\xf3\xf2\xf8\xb5\x13" - "\x86\xcf\xaf\xbe\x10\xfc\x5a\xef\x1a\xca\xaf\x9d\x26\x15\xbf\x9a" - "\x02\xfc\xda\x39\x45\xf0\x6b\x67\x72\x80\x5f\x3b\x53\x2e\xcd\xaf" - "\x8b\xac\x6f\xfd\x87\xe7\xd7\x86\xb0\xf1\x8f\x86\x5f\x57\xa0\x5f" - "\xe7\x43\xf0\x6b\x63\x63\x08\x7e\xa9\xf5\xcb\xab\xe2\x97\xac\x5f" - "\x3b\x55\xfa\xb5\xf3\x32\xf4\xeb\x22\xeb\x5a\xff\xe1\xf9\x55\x1c" - "\x76\xfd\x4f\x30\xbf\xca\xaf\x40\xbf\x3e\x0d\xc1\xaf\x4d\xd9\x43" - "\xf9\x55\xae\xd2\x2f\xf4\x2d\x06\xf9\x55\x2e\xeb\x57\xb9\x4a\xbf" - "\xca\x2f\x43\xbf\x2e\xb2\x9e\xf5\x1f\x9e\x5f\x9b\x2f\xba\xfe\x47" - "\xc5\xaf\x2b\xd0\xaf\x77\x42\xf0\xeb\x05\x08\xc1\x2f\x95\x7e\xa5" - "\x1e\x52\xf1\x4b\xd6\xaf\x72\x95\x7e\x95\x5f\x86\x7e\x5d\x64\x1d" - "\xeb\x3f\x3c\xbf\x4a\xc2\xfa\x7f\xc1\xfc\xaa\xb8\x02\xfd\x2a\x0d" - "\xc1\xaf\x92\xc3\x43\xf9\x55\xa1\xd2\xaf\xf1\xfa\x00\xbf\x2a\x64" - "\xfd\xaa\x50\xe9\x57\xc5\x65\xe8\xd7\x45\xd6\xaf\xfe\xc3\xf3\x6b" - "\x4b\xd8\xf9\x6f\x35\xbf\xfa\x77\x29\xfe\xe1\xc1\x60\x7e\xa1\xbf" - "\x1e\xdf\x29\x62\x2b\x85\x5f\xe1\x7d\xc3\xad\x8b\x07\x79\x75\x26" - "\xe0\x1b\x72\x3e\xc9\xef\x29\x88\x3f\xe4\x23\x92\x4f\xd8\x5f\x2d" - "\x78\x44\xef\x00\x2f\xea\x17\x5e\xce\xf7\x4f\x57\xc0\x27\x25\xae" - "\xfa\xd6\xf9\xf4\x97\x2b\xe1\x53\x69\xd8\xef\x9f\x82\xf9\xa4\x8c" - "\x5b\x97\xcb\xa7\x50\x63\x56\x99\x7e\x28\x9f\xca\x4d\x01\x3e\x89" - "\x71\x8a\xc6\x2e\x1a\xab\x82\xf9\x74\x91\xf1\xea\x72\xbe\xbf\xf8" - "\x87\xe7\xd3\xb6\xf0\xf6\x4f\xe2\x67\x9b\x1f\xae\x91\xfc\x47\xf1" - "\xb2\xe3\xd5\x8a\x69\x91\x98\xc6\xbf\xb5\xa9\x91\xf3\x7c\x95\x40" - "\xdf\x69\xdb\xe3\x75\x79\xb4\x9f\x2e\xc1\x8c\x50\x60\xe2\xb7\x81" - "\x19\xfb\x23\xe0\x24\x28\xc3\x74\x7b\xec\x36\xf3\x08\x84\x6f\x65" - "\x95\x33\xcb\x30\x6d\x24\xc1\xb2\x6d\x7a\xfe\xde\x31\x5e\xc7\xf7" - "\xbe\x91\xe1\x75\x40\xf0\x04\x8b\x70\x06\x19\x8e\x9f\x4d\xcd\x24" - "\x09\x1a\x86\xb6\x2d\x4a\x86\x31\xf9\x6d\x60\x52\xb7\x31\x56\x67" - "\xe6\xb8\x64\xb8\x68\x9f\xed\xd3\x26\x82\xf5\x6d\xd3\x27\xab\xe1" - "\xd8\xc3\x40\x78\x15\xb8\xab\x64\x7c\x29\x41\xfd\x1d\x07\x10\xbb" - "\xcd\xc4\xf1\xc5\xf6\x48\x20\xb7\x2f\x86\x45\xcf\xc8\xe1\xf0\x3a" - "\x7d\x6a\x10\xfc\x08\x50\xf7\x23\x96\x8d\x48\xcb\x90\xe1\xd2\xfc" - "\x12\xa4\x11\x2c\xa6\xeb\xd5\xb4\x96\x61\xe3\x14\x3a\x22\xaf\xf5" - "\xea\xfe\xfa\xb0\xff\x07\x44\x1b\xe3\x7d\x3b\x26\xe6\xc8\x7d\x99" - "\xa2\xae\x97\xe0\xb0\xdc\x24\x99\x27\x46\xec\x47\xfa\x20\xbe\xaa" - "\x85\xb9\x0a\x5c\xa9\x0f\xae\x47\x1e\xd9\x1d\x16\x00\xb9\xdf\xa3" - "\x58\xe5\x23\x09\x72\xdf\xcd\xc1\x74\xd4\x39\x15\x3a\x22\xff\x08" - "\x76\x34\xc2\x64\x28\x78\x7d\x36\xfe\xcd\xbe\xe8\xb7\xcd\x7b\x35" - "\xc9\xc5\x89\x6e\x20\x59\x26\xd8\xab\x65\x9c\x99\xa2\xcf\x46\x38" - "\x30\xc8\x6b\x3d\xe5\xd9\x65\x38\x5e\xb7\x2f\x7a\x81\xd9\xa7\xd3" - "\xcf\x1e\x0a\x6b\x50\xc3\x5e\x23\x60\x33\x5d\x08\x9b\x3d\x14\xd6" - "\xa8\x86\xbd\x56\xc0\x3e\x7a\x10\x61\x73\x86\xc2\x7a\x47\xab\x60" - "\xaf\x13\xb0\xb3\xf3\x10\x36\x77\x28\xac\x49\x0d\x9b\x28\x60\x73" - "\xa8\x0d\x8b\x87\xc2\x9a\xd5\xb0\xd7\x0b\xd8\xb9\x89\x08\x9b\x37" - "\x14\xb6\x4c\x0d\x7b\x83\x80\xcd\x6a\x47\xd8\x7c\x2d\x6c\x03\x97" - "\x03\x18\x27\xcb\xc1\x8d\x02\x76\x5e\x39\xc2\x5a\x42\xf4\x2d\x82" - "\xe3\x15\xb0\x49\x02\xf6\x91\x02\x84\x2d\x08\xc1\x0b\x35\xec\x4d" - "\x02\xf6\xe9\x74\x84\xb5\x86\xe0\x85\x1a\x76\x8c\x80\xcd\x4d\x42" - "\xd8\xa2\x10\xbc\x50\xc3\xde\x2c\x60\x9f\x38\x8e\xb0\xc5\x21\xe8" - "\x1b\x80\x8d\x5e\x54\x82\x30\x25\x48\x93\xf6\x10\xb4\x55\xe3\x1c" - "\x2b\x70\x3e\x95\x8a\xf0\x65\x21\x68\xab\x86\x1d\x27\x60\x97\x9c" - "\x42\xd8\xed\x43\x61\x41\x77\x40\xd0\xf7\x6e\x99\xbe\xb7\x08\xf8" - "\xbc\x2a\x84\x2f\x0f\x41\x5f\xca\xb7\xcb\xba\x96\x2c\x60\x17\x36" - "\x22\x6c\x55\x08\xfa\xaa\x61\x6f\x15\xb0\x6b\x4d\x08\x5b\x13\x82" - "\xbe\x6a\xd8\xdb\x04\xec\x72\x92\xc9\x3d\x21\xe8\xab\x86\xbd\x5d" - "\xc0\x3e\x0b\x08\x5b\x1b\xa2\xbd\xe3\x54\xb0\x29\x02\xd6\x42\xed" - "\xad\x0b\xc1\x0b\x35\xec\x1d\x02\xd6\x7a\x14\x61\x1b\x43\xf0\x43" - "\x0d\x7b\xa7\x80\x7d\x8e\xf4\xb8\x29\x04\x3f\xd4\xb0\x77\xb1\xe8" - "\x55\x4e\xd9\x2e\x1e\xd4\xc2\x22\xef\x85\x4d\xb4\x41\x2a\x8b\x5e" - "\x5d\x86\xf7\x04\xc7\xf7\x45\x1c\xc4\x67\xf3\xde\x43\xf6\x46\xb6" - "\x61\xe3\x59\xf4\x33\x9d\x32\xbe\xc3\x43\xea\xb6\xe9\xd5\xb0\x13" - "\x58\xf4\x56\x90\x61\x8f\x0c\x85\x35\xa8\x61\x27\xb2\xe8\x75\x4a" - "\x3b\x8f\x0e\x85\x35\x0e\xc2\xb2\xe8\xf5\x35\x08\x73\xac\x5e\xb6" - "\x8d\xaa\x76\xde\xad\xc2\x37\x89\x45\x6f\x34\xcb\xf8\xec\x43\xf1" - "\x99\xd4\xb0\x77\xb3\xe8\xd2\x83\x32\x6c\xcb\x50\x58\xb3\x1a\xf6" - "\x1e\x16\x5d\xec\x92\x61\x5b\x87\xc2\x96\xa9\x61\x27\xb3\xe8\xcd" - "\x8d\x32\xec\xf1\x21\xb4\x27\x3d\xb0\xa1\x2f\x20\x6c\xd2\xbd\x2c" - "\xba\x24\x5b\x86\x0d\xf2\x03\x54\xe3\xf0\x7d\x82\xef\x85\xd9\xc8" - "\x77\xfe\x4d\x06\xda\xfc\x93\xa1\x7c\x0c\xeb\x9d\x70\xd5\x59\xa9" - "\xc2\x2b\xc6\x24\x65\x6f\xfa\x4a\xde\x37\x7f\xdd\xbc\xbc\x2c\x37" - "\xf3\xaa\xd3\x76\x4b\xac\x7d\xa2\x1b\xf4\x7c\xbf\xe3\xd8\xdd\xe5" - "\x4e\x4c\x77\xdd\x34\xaf\xac\xaf\xb2\xd2\xe0\xd4\xdd\xc9\xf7\x03" - "\xc6\xfb\x04\x27\xac\xca\xa1\xfb\xdd\x36\xe6\xa1\x3d\x6f\x7d\xbb" - "\x16\x9a\x1c\xfe\x1e\xda\xfb\xca\x83\x38\x3c\x5d\x56\x88\x30\x15" - "\x02\xbd\x6b\xe9\x77\x14\xf7\x00\xe2\x7f\x82\xad\xb5\xa4\x63\x1b" - "\xcc\x58\x5f\x7e\x07\x3e\xf3\x36\xa0\x0f\x84\x63\x65\xba\xbd\x90" - "\xf6\x13\xaa\xac\x70\xc5\xd6\x98\xd9\x8b\x8b\xba\xad\x5b\xe1\xe6" - "\xb3\x52\x25\xb7\x03\x7c\x6f\x91\xf3\x96\x07\xfd\xb1\x0b\xd3\x69" - "\xcf\x11\x56\xfb\x8a\x49\xec\x47\x52\xf9\x3e\x6f\xb3\x8d\xb5\xb3" - "\xa4\x79\xd9\xfe\xfe\xed\x65\x74\xf6\x81\x7d\xeb\x59\xe8\x50\xe5" - "\xb9\xae\x7f\x85\xef\x55\x82\x7d\xca\x0e\xb9\x87\x87\x0d\xe2\x59" - "\xf5\xc2\x5c\xec\x57\x0f\xfa\x6b\x99\x72\x1f\x3d\x4e\x5d\x44\xbe" - "\xb8\x7f\x59\xef\xd4\x8d\x30\xca\xf7\x46\xa7\xce\xd4\x29\xdf\x27" - "\x29\x7b\xa9\x84\xde\xdb\x65\x61\x2a\xf6\x2d\xc3\xbf\x3f\xd7\x40" - "\xfe\x25\xed\xb3\xc6\x62\x17\xa6\x9a\xc6\xd0\x99\x16\x2f\x1f\xc1" - "\x3a\x33\xc4\xfe\x98\x2f\x6f\xc2\xdf\x78\xf9\xd7\x25\xff\x32\x82" - "\xe1\x7c\x4b\x9a\xd7\xce\xaa\x2a\x13\xa9\x6f\x5b\x7d\xcc\x8f\x78" - "\x2d\xac\xdc\x5e\xe6\x28\xee\x06\xb1\xaf\xf4\xcb\x3f\xe5\xfb\xdc" - "\x10\xed\x90\xbe\x2c\xca\x5e\xc6\xeb\xaa\xae\x31\xab\xdb\x95\x36" - "\xe9\xee\x7b\x26\xdf\x7b\xdf\x0f\xa6\xdc\xbf\xec\xe9\x67\xf2\x97" - "\xaf\x78\xd6\xb2\xf2\xb9\x55\x05\xab\xd7\xac\xb5\x3e\x5f\xb8\xae" - "\x68\xfd\x86\x8d\xc5\x9b\x36\xd3\xa6\x2d\x83\xed\xdf\x9f\xa1\x73" - "\x4b\x80\x75\x3c\x8c\x75\x54\xf1\xfd\x9d\x28\x4d\xd0\xbe\x4a\xaf" - "\x37\x85\xf6\x6b\x1d\xe8\x69\xd2\x1e\xcb\x3d\x52\xd5\x32\xda\xef" - "\x19\x79\xac\x73\xd4\x3d\x62\xa7\x3d\xf8\x3b\xa5\xaa\x9c\x36\xd7" - "\x23\x76\x3a\x03\xa2\x39\xb1\x1b\x92\xc7\xd1\x3e\xfd\x55\x66\xca" - "\x6f\xb8\x0d\xa0\x05\xcb\x86\xc2\x39\xce\x08\x89\xaf\x5d\xcb\x5c" - "\x7b\xae\x65\x3d\x84\x7f\xcf\x5e\xd6\xed\x7a\xc1\x02\xbb\xf0\x19" - "\xe5\xcc\xd8\x25\x55\x5f\xd3\x9c\xc4\xf7\x32\x4f\xaa\xdf\xcb\x3a" - "\xb7\x5f\xcb\x3a\x5f\xdc\xcb\x7a\x1a\xae\x65\xce\xe4\x3d\x10\xd3" - "\x57\x59\xd5\xea\x94\xaa\x4c\x5c\x66\x31\xdf\x1f\xfd\xb2\x7d\x37" - "\xe6\x4d\xf4\x42\x44\x03\x3e\x63\x9a\xbb\xd9\x24\xda\xfd\xab\x2f" - "\x3d\x91\xd8\xbf\x43\x6c\xa0\x40\xb7\x0b\xeb\x11\x3c\xaa\xbe\xbf" - "\x05\x47\x51\xac\xcf\xe5\xf0\x74\x80\x53\xaa\x9e\xd2\xf0\x35\xaf" - "\x2f\xde\x51\xdb\x03\x84\xef\x97\x85\x9e\xc8\x75\x37\x30\x2f\xc2" - "\x26\xfa\x5f\x28\xd0\x61\x7d\x6e\xc4\xed\x56\xf7\x27\x65\xc5\xea" - "\x22\xd3\x9a\xf5\x05\x05\x77\x44\x43\x0a\xff\x0d\x3a\x3f\xa2\x08" - "\xf1\xc1\x6b\x7b\x59\x0b\xf6\xd3\x8e\xfd\x6d\x3d\x81\xde\x33\xca" - "\x0b\x60\x9f\x6a\x10\x6f\x35\xa6\x1f\xc3\xfb\x63\xd8\xf6\x56\x71" - "\xe6\x40\xfd\xef\x58\x65\x75\x06\xb6\xb3\x95\xf6\xa8\xa5\xbd\xa7" - "\x7a\x37\xe6\xe8\xb0\xdf\x7b\x10\xae\xd5\x74\x03\xdc\xda\x25\xed" - "\xba\x06\xdb\xd1\x84\xf7\x04\xff\x2e\xf1\x11\xe1\x5b\x44\xbf\xea" - "\xf9\x3e\x43\x48\x2b\xfb\x81\x6b\x59\x55\x5f\x65\xb5\x8b\xf6\xa6" - "\xe3\x7b\x76\xe3\x33\xd2\xa5\x15\x61\x6b\x7a\x4b\x73\x74\x18\x4b" - "\xe9\x1a\x06\x71\x56\xdb\xa9\x4d\xd4\x0e\x8a\xe7\x3e\x42\xef\xc9" - "\x3f\x90\x0b\xe3\x3d\xa0\xfb\xa8\x13\xa0\x6e\x2f\x6b\xc4\xab\x0e" - "\xaf\xda\x0f\x31\xef\x0f\x78\xb5\x62\xfa\x71\xfc\xfd\x10\x7f\xff" - "\xd0\xc9\xdf\xbf\x25\x52\xbb\xd7\x95\xb0\xee\x89\xb5\x70\x0b\xe1" - "\x47\xd9\x7a\xbc\x43\xaa\x37\x52\xdb\x69\x1f\x48\x16\xbd\x6b\x7b" - "\xf0\x7e\x79\xbb\x3d\x80\xf9\x20\xd5\xc4\x88\x5f\xf5\x55\x93\x83" - "\x57\x91\x7c\x7f\x0c\x61\x3b\xe5\xfb\x76\xbc\x4e\x5d\xfa\xd2\xe2" - "\x0b\x77\xbd\x92\x79\xf9\xb0\x97\x75\x6d\xbf\x3c\xb8\xd7\x00\xa4" - "\x1f\xe7\xe2\x55\x13\x9c\xfe\x63\x8b\x48\x7b\x63\xb2\x78\x7e\xc3" - "\x2c\xff\x16\x80\xb4\x1f\xe9\xb4\x1f\xf1\xef\x3f\x28\xd2\xf6\x1f" - "\xc1\x91\xc6\x8b\xf7\x06\x4d\xfd\x84\xb3\x8e\xf8\x39\x40\xe7\x1f" - "\x20\x2f\x9d\xd2\xae\x1c\xe2\xd1\x6e\x21\x5b\x3a\x3f\xe3\x69\xd9" - "\x28\x5b\x75\x01\xf9\xa9\x99\x11\x2c\x3f\x35\x69\x1a\xf9\xa9\x21" - "\x5b\x84\xfa\x52\xd7\x20\xe4\xe5\x58\xef\x0b\xf9\xf8\x5c\x33\x19" - "\xf1\x1c\x33\x2d\xe1\x38\xb8\x3f\xb2\xfb\x2c\xc6\x7d\x16\xd0\x93" - "\x7d\xe9\x91\x6a\x5e\x22\x99\xa5\xba\xe5\x7a\x45\x5b\xb0\x7d\x98" - "\xd6\x48\xed\x5b\x8b\x78\xf1\xb9\x09\xe1\x1a\x1d\xf0\xa5\xd2\x36" - "\x5e\xa6\xf2\x39\x94\x47\xb9\xbd\x84\x93\xca\xb1\x40\xbf\xb2\xa9" - "\x8c\xa8\xfb\x95\xfb\x31\x9d\xe2\x44\x28\xbd\x00\x11\xb4\x56\x99" - "\x64\x92\x7e\x1d\xde\x34\xd4\xa5\x4c\xf0\xf7\xe5\x02\x86\xfa\x69" - "\xa8\x6f\x51\x1d\xd2\x2b\x49\x13\x4a\x20\x8d\xf0\x91\x4d\xc7\x7e" - "\x38\x1b\x48\x17\x05\x2e\xf9\xfc\xdf\x5d\xd9\x1f\x5a\x81\xd7\x53" - "\x4f\xed\xc1\x7c\x55\xbd\x7b\x28\x0e\xdc\xbd\x59\xf4\x15\xeb\x6a" - "\xc2\xf2\x87\xa9\xef\x44\x4f\xcc\x3f\x8a\x78\x8a\x29\x8f\xef\xa5" - "\x2d\xfa\xd3\x44\xfb\xad\x12\x3d\x08\x9e\xce\x34\x11\xfb\xef\x55" - "\x1f\xe0\x74\xc3\xf2\xc4\x0f\x86\x75\x10\x8e\x52\x2f\xf3\x32\xb4" - "\x47\x6f\x6d\xf6\xe0\xb8\xfe\xea\x85\x60\xfe\xbc\xd2\xae\xe6\x0f" - "\x96\x3b\x8c\xe5\x5b\x18\xf6\x91\xec\x09\xd6\x19\x4f\xe7\x28\x60" - "\x5a\x8d\xbf\x12\x71\x6c\xf0\xf0\xb9\x11\xc4\x73\x1a\xdb\x52\x43" - "\x78\xb0\x3d\x2d\x02\xd7\xab\x49\xef\x96\x04\xf3\x5a\xc6\xd7\x44" - "\x3c\xe7\xfa\xbc\x99\xf7\x09\x6d\xd7\xab\xbf\xae\x17\x79\x47\x11" - "\xe6\x28\x1b\xc8\x04\xda\xbf\x54\x8c\x25\x3c\xef\x48\xe9\x37\x9c" - "\xbf\x2d\xc2\xae\xbd\xfa\xc7\x75\x5b\x58\x77\xa0\xdd\xaf\x96\x2b" - "\x7b\xc0\xca\xed\x3e\x42\xf5\xb1\x8d\x8b\xf9\xb8\x4a\x75\x50\x79" - "\x19\x5f\x3e\xe1\x53\x68\x35\x01\xdb\x21\xe8\xf5\x4a\x2d\xa6\x37" - "\x91\x2c\x72\xba\xa1\x1d\xed\x2d\x25\x59\x7c\xb5\x0a\xcb\x1f\xdb" - "\x45\xcf\x1b\xf9\xb3\x89\xdb\xd8\xc1\xfc\x57\x3e\xa6\x7c\x07\xc6" - "\xd9\xbb\x57\xa1\x2c\xf9\x01\x6e\x49\x80\x34\xb7\x8d\xf7\xed\x90" - "\xfb\x85\x0c\x5d\x33\x7a\x58\xd4\x4e\xa4\xd1\xd1\xbe\xca\xd7\x26" - "\xa3\xed\x2f\xa2\xb6\xa2\xbd\x3e\xc2\xde\xca\x05\x6a\x33\xda\x33" - "\xb9\x7d\xaf\xfd\x54\xe6\xfd\x11\xea\x23\xd1\x73\x82\xb0\x7d\x98" - "\xf7\xe3\x59\xd4\xf6\x40\xbf\x5f\x2b\x53\xd3\x98\xf7\x1b\xf9\x40" - "\xfc\x22\xbe\xa8\x70\x92\xec\xd7\x20\x2e\x79\xaf\x36\x21\x1b\x44" - "\xeb\x9a\x6b\xd9\x71\x82\x0f\xc0\xee\xe1\xfb\xdb\x6d\xc5\xba\x27" - "\x5a\x81\xce\xb8\xd0\xd1\x3e\xbe\x88\xf7\x10\x9d\x57\x83\x38\x8e" - "\x12\x4d\xb1\x2d\xb1\x24\x8f\xf8\x7c\x5c\x2e\x17\x83\xe3\x79\x2a" - "\x5e\xe9\x01\xfd\xdf\xe3\x0b\x96\xaf\x3d\x5a\xfd\x27\x7e\xd7\xf8" - "\x4b\x33\x81\xcb\x43\x21\x98\xce\x49\x7b\xf6\xc9\x63\x87\xcc\xeb" - "\x3d\x5f\x34\xa3\xbe\xa8\x70\x14\x69\x78\x7d\x94\xcb\xe3\xc6\xd9" - "\x74\xde\xaf\x0e\xcb\x1e\x95\xf1\xf0\x3e\x73\x79\xb2\x71\x19\x38" - "\xce\x36\x62\x3f\x07\xe5\xe0\xb5\x76\x99\xcf\xc7\x35\x34\x51\x6c" - "\x57\x12\x9d\xb7\x40\x36\x09\x7d\xcc\x07\xfb\x06\x02\x76\x89\x78" - "\xef\xe7\xbc\xdf\x53\xdc\x20\xc6\x5b\xd9\x6e\xed\x11\xf9\xd7\x06" - "\xc9\x30\xb5\xe5\x17\x5c\x7e\xa9\x2d\xa5\x8b\xa9\x2d\x47\x79\x3b" - "\x4a\x4d\x70\x4e\xfa\x71\x32\xd5\x8f\x65\x0f\xcb\xfa\x2a\xe3\x7a" - "\x6d\x3b\xe1\x7a\x11\x6d\x15\xb5\x09\xeb\x36\x72\xfb\x37\x93\xcb" - "\xc1\x4b\x72\xdb\x5b\x3d\x36\x2a\x5b\x53\xfc\x8d\xc4\xcb\xa2\x1f" - "\xb3\xbb\xc7\x23\xf6\x64\x8e\xc6\xf2\x07\x4d\x4f\x13\xfc\xbe\x4e" - "\xb2\xd1\xa6\x27\xf9\xfd\x09\xd3\x42\x94\xd5\xb3\xa0\x47\x7c\x06" - "\x92\x51\x45\x2e\x7a\xa4\x7d\x6f\x93\xbf\x8e\xb4\x3e\x84\x3e\xd2" - "\x41\xa2\x37\xc9\x32\xfa\x48\x93\xfb\x2a\x7f\xdc\xa3\xc8\x2d\xd6" - "\x53\x47\xb4\x17\xfc\xd9\x3b\x09\xe5\xf8\x68\x40\xb6\xf6\x4e\x92" - "\xe9\x78\x10\xe9\x68\xc0\xfa\x7e\x2d\xf7\xeb\x20\xc2\xa3\x2f\xb6" - "\xef\x4d\xb9\xed\xb5\x32\xfc\x1c\x85\x0f\xb2\xae\x1e\xdf\x45\xf6" - "\x97\xf3\x60\x6f\xa7\x5c\xb6\x49\xae\xeb\x8c\x02\x4b\x3e\xa2\xd8" - "\x6b\x7d\xef\x19\xb2\x83\x13\x91\xf7\xdc\xf6\xf1\xb3\x9c\x44\x1a" - "\xe9\x8e\xa8\x63\x5f\x35\x97\x43\xf4\x7b\x02\x72\xb4\xf7\x98\xc6" - "\x3e\x91\x2d\xae\x69\x43\x1c\x64\x4f\x49\x96\xc8\xa6\x52\xbc\x80" - "\xf8\xf6\xc8\xfa\x23\xb7\xf9\xf5\x3b\x82\x65\x65\xdf\x26\x94\x95" - "\xf1\x01\xdc\xaf\x27\x86\x1a\xe7\x1a\x84\x0d\xac\x13\x65\x5e\x5f" - "\x29\xf7\xed\x90\xe8\x9b\xfc\x4c\x74\xdb\xca\xe9\x36\x5e\x45\x47" - "\xa4\x5b\xed\x3e\x19\xfe\x28\xd9\xf2\x80\xbe\xbe\xfe\x67\x45\x97" - "\x87\xda\x8b\xda\x0a\xd2\x07\x55\xbb\x0e\x6b\xec\xc5\xd1\xd0\xf6" - "\xe2\xf5\x32\xb9\xbf\x8d\x1a\xdd\x68\x92\xfd\xdd\x03\x0a\x1f\xda" - "\xdc\xfd\xf2\xbe\xe2\xd5\x07\xc8\x7e\x52\xdd\xea\x31\xa8\x5e\xd0" - "\x55\xd6\xe5\xda\xf5\x43\xf9\x50\x9b\xa1\xd6\x67\xe2\x35\xd9\x04" - "\xc2\x41\x3c\xe5\x7e\x25\xa6\x09\xbe\xd6\x92\xff\x5e\xa3\xb6\xd1" - "\x08\xbb\xc7\xcf\x48\x5f\x6a\x33\x83\x75\xf1\xf5\x23\xb2\x2e\xca" - "\x75\xef\xbb\x1e\x79\x94\xa6\xaa\xf7\x98\xa6\x5e\xe2\x4d\x0b\xd1" - "\x41\xe6\x69\xa4\x32\xa6\x11\x3c\x96\x2d\xc6\x32\x2e\xcd\xf8\x58" - "\x43\xed\xc3\xba\x2c\xdc\x66\xed\xe5\xb6\xa2\xb8\x4f\xb4\xc7\xdd" - "\x20\x8f\x13\x98\x96\x26\xa7\xd9\xe5\xb1\x44\x91\x9b\xe5\xc1\x6d" - "\xda\x97\x1d\xda\x3f\x7a\xdd\xa2\xf8\x47\x1c\x17\xb7\x45\xfb\x72" - "\xe4\xfe\x51\xda\x78\x91\xf6\x7a\x12\xa5\xed\x12\x74\xd8\xc3\xf8" - "\x78\xb5\xd7\x2e\x8f\x57\xa4\x5f\x12\x3e\xa7\x91\x8e\xd1\x33\xe2" - "\x38\x48\xf8\x1d\x65\xfd\x14\x43\xd4\x3a\xa5\x1f\x1f\x27\x7b\x40" - "\xf6\xc2\xb4\x42\xd8\x0d\xd3\x5c\xfe\xfb\x15\xd9\x1d\xf2\x43\x28" - "\x1f\xe1\x8e\x91\x2d\xea\x92\xde\x88\x32\x3d\x8a\x7e\xc1\xdf\x0c" - "\x88\x77\x5f\x8f\x28\xfb\xc6\x4d\xdc\x57\xf8\x5b\x66\x84\x92\xa6" - "\x94\x43\xbb\x75\x82\xca\x51\x79\xc5\x7e\x91\xed\xf2\x92\x6d\xe2" - "\xf5\xbd\xb1\x4c\x96\x71\x1e\x37\x28\x7e\xd1\x80\xa4\x82\xa5\xbd" - "\x9d\xb9\x4d\x7b\xe3\x90\xb0\x67\x6f\x1c\xa0\xb2\x9c\x7f\x68\x2b" - "\xb7\x7e\xc3\x4e\x37\x14\x82\xbe\xfe\x4b\xb2\x8b\xd5\x75\x72\x3b" - "\x3d\xa2\x1f\x6f\xbc\xcb\xfb\x21\x6c\x6a\x8d\x68\x4b\x75\x5d\x7d" - "\x3f\xcf\xfb\x84\xfa\x42\x79\xbb\x55\x79\x6c\x20\x85\xf2\xbe\xe1" - "\xed\xd2\x94\xf3\x0f\x58\x86\xc0\x37\x88\x33\xb3\x0c\xf5\x7b\x15" - "\xdb\xbb\xbf\x58\xb4\x73\xff\xbd\x8a\xdd\x45\xba\xb4\x90\xed\xe5" - "\x79\x2b\x64\x98\xb9\xf2\x2f\xb7\xef\xfb\x97\x0b\xba\x26\x4a\x32" - "\xbd\x8f\x8b\x7e\xec\xdf\xc4\xe3\xec\xbf\xe5\x22\x6d\xf7\x2f\x56" - "\x68\xab\xbe\x27\xfd\xc1\xfa\x8d\xf4\xcc\xe5\xbe\x84\xc7\xb0\x75" - "\x04\x43\x6d\x12\x63\xc4\x1b\x39\x5a\x9f\xba\x4b\x3a\x70\x81\xc6" - "\x25\xe1\xab\x1e\xf8\xa3\x3c\xff\x02\xf6\xc2\x9f\xe0\xb8\x50\x97" - "\xa4\xd8\x18\xd6\x97\x89\x31\x7f\x07\xc2\xd4\xf1\x73\x2d\x68\x3f" - "\x60\x35\x0c\xd9\xa7\x5f\xf5\x3b\x65\x9c\xfb\x3d\x8a\xdd\x20\x5b" - "\xd2\xe6\xee\x90\x7d\xba\xba\x83\xf5\xb2\x2d\x39\x27\xd5\xfd\x2c" - "\xd8\x0f\xab\xfb\x59\xb0\xcd\x38\xf0\xb6\xd6\x66\xa0\xdf\xbc\xbd" - "\xaf\xb2\xae\x24\xc8\x0f\xc0\xb4\x8b\xdb\x8e\xba\x6c\xd2\x51\x3a" - "\x63\x81\xdb\x27\x3e\xa7\x74\x60\x94\xd2\x66\xb2\x9b\xbd\x2f\x28" - "\xf3\x17\x07\x7e\x41\xbe\x9a\xa6\xbe\x9e\x20\xdb\x49\xf5\x29\xf8" - "\xf4\x40\x7b\xf4\x23\x1d\x68\xbe\xa5\xee\x98\x6c\xe7\x1b\x83\x6c" - "\xa5\x3c\x86\x91\x9d\x0c\x1e\xab\xaa\x0f\x04\x8f\x55\x07\xf6\x0d" - "\xb5\x91\x07\x2c\x97\x3f\x56\x1d\x30\x93\xdd\x52\x6c\x64\xb0\x2d" - "\x38\x50\x50\x1f\xe4\xcb\xd6\xb9\x15\x5f\x36\x60\x47\xeb\xb6\x93" - "\x8d\xc2\xfa\x8f\xca\x75\x77\x3a\xa5\x97\xbb\x95\xba\x31\x3f\xa9" - "\xcd\x84\xb2\x59\x59\x9d\x8d\x32\xd5\x2a\xfb\x80\x5c\x37\xfb\xf9" - "\x3e\xe9\xfb\x8d\x28\x7f\xd1\x24\x67\xf6\x35\x5f\x42\x67\x60\xac" - "\x68\xe9\x5d\xab\xd0\xb7\x7e\xbd\xda\x2f\x3c\xb0\x97\x95\xf7\x55" - "\xd6\xcf\x56\xf7\xb1\x1a\xd3\x76\xcb\x73\x08\x9c\xb6\x1c\x57\xbd" - "\xa9\x61\x6f\x70\xdf\x44\x3f\xea\x73\xa8\x1f\x14\x13\x61\xfd\x09" - "\xe4\xf7\xa0\xcf\x87\xf7\x3f\xae\x6d\x18\x94\xf9\xdd\x3d\xdf\xd8" - "\xd4\xfe\x55\xb5\x9b\x6c\xa5\x1c\x7b\xb6\xa2\xbf\x53\xa3\x9e\x8b" - "\x99\x33\x3d\xdb\x64\x2d\x5c\xb9\xa6\x68\xc5\xdd\xa6\x95\x6b\x56" - "\x16\xad\x5c\x56\xb0\x72\xf3\xb2\xa2\x95\x6b\xd7\xa4\xae\x5e\xf6" - "\xec\xca\x67\x4c\x1b\x97\xad\x33\xa5\x15\xdf\x5a\x1c\x0d\x01\xd0" - "\x07\x4c\xcb\xd6\xad\x5b\xbf\x7a\x79\xbe\x69\xcd\xca\x67\xc6\x17" - "\x2e\x5f\xb7\xbc\xc8\xb4\xac\x70\xed\xfa\x35\xf9\xa6\x5b\xf3\x27" - "\xdc\x9a\x76\x5f\x7e\xb4\x7a\x0e\x6d\x9c\x11\x7a\xfc\x5f\xff\xb5" - "\x7b\xf7\xd7\x60\x88\xd7\x59\x0b\xe3\x8b\x57\xae\x11\x73\x76\x0d" - "\x6f\x4f\xdc\x03\x56\x3a\x47\x91\xce\x0b\x63\x95\xf5\xed\xf8\xab" - "\x27\x38\xec\xa7\x89\xce\x51\xc4\xb6\x27\xf5\x55\x36\x94\x39\xa5" - "\xb7\x2c\xfc\x2c\x30\x4c\xc7\xbe\x25\xb1\xaf\xff\xd0\x8d\x3e\x9b" - "\x95\xd6\x04\x37\x7c\x0d\x09\x35\x1b\x40\x8f\x57\x0c\x5e\x46\x3a" - "\x67\x11\xcb\x1c\x71\x4a\x8d\xf2\x59\x7a\x8d\x39\xae\xa8\xdf\xa7" - "\xb1\xf2\xdf\xa7\x09\xbe\x34\xce\x53\xe6\x79\xb3\x5e\x82\x2c\x92" - "\xcf\x0e\xa9\x91\xbf\xd7\x7b\x11\x65\x99\xe6\x4b\x7b\x7f\xff\xb0" - "\x19\xfd\xc1\x53\xf6\x1b\x78\xde\x3c\xb7\x04\x31\xd8\x2e\x7d\x73" - "\x49\x1a\xbc\x86\x75\xad\x4b\x64\xac\xaf\xb2\x31\x51\x99\x4f\xc3" - "\x3e\x18\xb1\x2f\x27\xe5\x7e\x0c\xf0\x7e\xec\x65\xc9\x7b\x46\x63" - "\xfb\x5e\xa5\xf6\x34\x66\x28\x7d\xc0\x76\x9f\x74\x4a\x0d\x07\xb1" - "\x9d\x46\x6a\x57\xa8\xb9\x3e\x9a\xef\xc2\x76\x56\xfb\x37\x20\xdd" - "\xc6\x88\x33\x22\x76\xd7\x0b\xfd\xc3\xfe\xb4\x34\xe0\xfd\xae\x2f" - "\x21\xa6\x9a\xce\xf0\xb3\xdd\xcc\x4e\xb8\xbd\xe0\xb0\x9c\x84\xf8" - "\x4d\xcc\xc5\xfe\xf9\xaf\xdd\x72\x9f\x8e\x92\x6d\xf8\x5f\xcf\x9d" - "\xd4\x53\x9f\x70\xac\x88\x69\xf8\x32\xec\xdc\xa2\xfe\xb5\x6b\x99" - "\x9b\xed\x57\xfb\x5c\x6f\xf2\xb3\xbd\xc9\xdf\xea\xb5\xd1\x99\x70" - "\x6f\x1a\xb0\xee\x3c\xd9\x37\x76\xb3\x81\xc5\x2a\x5f\xaa\x91\xe4" - "\xcc\x1d\x06\xb7\x41\xc1\x4d\x67\x03\x52\x19\xc1\xff\x37\xab\xb1" - "\x8c\x4b\x85\xdf\xa2\xc5\x4f\x38\xf1\xde\xa5\xd4\x23\xe2\xf0\x37" - "\xc9\x27\x70\xa1\x2c\xbb\xc2\xd4\x97\xfc\xea\x5e\xf6\xb1\x03\xd3" - "\x77\x7f\x03\x7a\x84\xc5\xd8\x95\xe3\x47\xfd\x68\x48\x25\xfc\x2f" - "\x5e\x0b\xb0\x1d\x61\x7a\x2b\x1b\xf3\xdc\xfc\x9c\xbe\x37\x51\xff" - "\xab\x73\xb5\xf3\xd8\xb2\x3c\x3f\xa0\x91\x67\xf3\xab\xe4\x13\xee" - "\x41\xfc\x28\x43\xbb\xbf\xc2\x71\x18\x9f\x27\xec\x81\x14\xaa\x07" - "\xef\xdb\x69\x3e\xa4\xaf\xf2\x27\x53\x94\xfa\x18\xca\xff\x2e\xbf" - "\x98\x83\x91\x65\x2b\x95\xe6\xae\x4b\x8b\x19\x6b\x46\xfb\x4e\x6d" - "\x24\x19\xc3\x32\x05\x8a\x4c\xa1\xac\x7f\xcc\xe5\x2a\x01\x52\x58" - "\xe5\x9b\xae\x86\xd1\x08\x87\x72\x55\x8f\xf2\x44\x72\x85\xb0\xb5" - "\x8a\x4c\xa1\xac\xb5\x13\x1c\xb6\x21\xfa\xf0\x66\xb3\x9e\x6c\x64" - "\xa7\xf4\x56\x2c\xc9\x18\x7b\xfd\x47\x27\xd9\x75\x8b\x4e\x0a\x3e" - "\xbd\x15\xeb\xf0\x08\x1e\x04\xe8\xfe\x13\xa7\x8a\xee\xed\x28\xc7" - "\xd1\x44\x67\x31\x57\xfd\x56\x2c\xb6\xad\x9d\xfb\xe2\x5b\x90\x07" - "\x7c\xac\xfa\xc9\x71\x2a\x2f\xd3\xf0\x78\x80\x86\x6f\xa5\x84\xa2" - "\xa1\x86\x76\x7a\x71\x4e\xe0\x5b\x93\x49\x57\xb0\xcc\x62\xe5\xec" - "\xbf\x50\xbc\xc4\x3a\xf4\xfa\x3d\x60\xa0\x3a\x5a\x12\x38\x7c\x95" - "\x52\xc7\x6e\xa4\xb5\xab\xd4\x72\x51\x79\x6e\x69\x04\xa0\x39\x71" - "\x2a\x9f\x9c\x40\xf4\x7d\xeb\x78\xa0\x3c\x73\x6b\xcb\xdf\xfa\x4c" - "\x50\x5b\xf9\x85\x6d\x75\xbe\x26\xce\x75\xc5\xfa\x9b\x62\x2e\xd6" - "\xde\x64\x93\x18\x27\xed\xe3\x48\xbe\x9b\x66\x38\x6a\x01\x28\x4d" - "\x7e\x9e\xdc\x8b\x63\x8f\x76\x7e\x3f\xfc\xfb\x86\xa6\x97\x82\xdf" - "\x37\x34\x15\x85\x7b\xdf\xa0\xa9\xf7\x5d\xaa\xd7\xdf\x90\xa3\x53" - "\xd5\x7d\xc8\x1f\xa2\x6e\xa5\xfc\x84\x46\x75\x3c\xf3\xd3\x51\xd4" - "\x86\x36\x3a\x9f\xfc\xc6\x1c\x1d\x43\x3c\x2d\x7c\x0c\xff\xa9\x51" - "\xf8\x2f\xe4\x17\x35\xb9\x08\x46\xdb\x8f\xc1\x3f\x43\x02\xcd\xb1" - "\xc3\x37\xfc\x21\x72\x26\xd0\x69\x80\x60\xb2\x28\xd9\x52\x10\x30" - "\xb0\x10\x0f\x31\x00\x63\x39\x3c\xc3\x3f\x91\x24\x3f\xbb\xf8\x83" - "\x7e\x10\x7e\x30\xff\xef\xf8\x8b\x12\xed\xe5\xf8\x3c\xa0\x93\xeb" - "\x2b\x57\x41\x64\x5c\xa4\x34\x03\xa5\x48\xa8\xbf\xe7\xf1\x2a\xcb" - "\x89\x44\x7c\x07\x39\x30\x63\x5e\x19\xbf\xf2\xcc\xd4\xcf\x94\x12" - "\xfc\x8c\x7f\x11\x8b\x55\x15\xdc\x1c\x91\xcf\x97\x1e\x25\x3b\x07" - "\x93\xa4\x46\xa3\xba\x4a\x23\x94\x45\xf2\x9b\x78\xfa\xc7\x83\xf8" - "\x52\x30\x7f\x6c\xeb\x20\xc0\xd5\xee\x6d\x2a\xf0\x8f\x44\xf3\x6f" - "\x49\xbc\x48\x1f\x87\xfb\x37\x46\x75\x7f\xb3\xf8\x19\x77\xf2\x5b" - "\xc4\x7f\xf1\x3f\x53\x7b\x94\x72\x1b\x10\x8f\x5b\xf2\x42\x81\x06" - "\xe8\x7f\x8b\x5d\x49\x52\x4b\x68\x20\xff\xf6\xf4\xe0\xe7\x14\x4f" - "\xf0\xf3\x5d\x99\x7f\x7f\xc3\x51\x07\xe9\x9f\x52\x27\xfa\xec\x77" - "\x26\x0c\x26\xc6\x6b\x54\x26\xbe\x46\xa3\x42\x81\x3f\xb9\x35\x11" - "\xd8\x9e\x3a\x55\xb2\x3e\x34\xf4\x7f\xcd\xdf\x0d\xdb\x64\x85\xb8" - "\xd9\x65\x1c\x92\x39\x4d\x93\x46\xcf\x23\x4c\x72\xda\xa4\x77\x87" - "\xc0\xf3\x34\x93\xea\x59\x67\xc6\x7f\x1a\x01\x6e\x2d\xf8\x36\xda" - "\xfa\xfd\xdf\xff\x85\x7f\x3a\xd2\x8f\xef\xff\xfe\x8b\xfe\x98\x18" - "\xc5\xd1\x12\xf1\x1f\xfa\x8f\x0d\x1a\x4a\x26\x67\x30\x39\x81\xc9" - "\x37\xdf\xca\x38\xfe\xfd\xdf\xf7\x7f\xdf\xff\x7d\xff\xf7\xfd\xdf" - "\xf7\x7f\xdf\xff\x7d\x07\xfe\x74\x3c\x8e\x60\xf2\xdf\xe0\xfd\x60" - "\x3e\x85\x41\x96\x3a\x26\xe9\x80\xa9\x32\xca\xee\x05\x9d\x01\x46" - "\xe8\xbf\x3d\x2f\xcf\x34\xd8\xa0\xcb\x2c\x40\xdf\xdc\xd0\x1a\x81" - "\x7b\xf0\xba\x51\x95\x3e\xee\xdb\x6a\xd1\xdf\xfd\xa7\x43\xe2\x45" - "\x60\x5c\x18\x09\x23\x60\x24\x18\x20\x0a\xa2\xe1\x2a\x88\x81\x58" - "\x88\xc3\x78\xd3\x08\xa3\x60\x34\x5c\x0d\x09\x70\x0d\x5c\x0b\xd7" - "\x41\x22\x5c\x0f\x37\x60\x4f\x92\xe0\x26\x8c\xed\x6f\x46\x82\x8c" - "\x0d\xdd\x97\x32\x30\x27\xe2\x3f\xf8\x7f\x36\x98\xf9\x73\xde\xf7" - "\xe9\xff\x47\xd3\xed\x72\x7a\xbb\x9c\xee\xfc\x3e\xfd\xff\x68\xba" - "\xe9\xbf\xf9\x77\xec\x7f\xeb\xaf\x0e\x4d\xb6\xb0\xda\xba\x90\xb6" - "\x52\x9b\xaa\x93\xff\x06\x9f\xe1\x12\xe5\x87\xe0\x0b\x2e\xaf\xfd" - "\x33\xe3\x35\x59\xdc\x96\x02\x88\x79\x5e\xa6\xfe\xf3\x86\x2b\xa9" - "\xfc\x6d\xeb\xc4\xcb\x85\x17\x42\x6e\xc3\x11\xc6\x76\x15\x5e\xd7" - "\x28\x78\x04\x0c\x7d\xe2\x7a\x0e\xf3\x3f\x6d\x02\x70\x9e\xc2\x0b" - "\xab\x3d\x5d\x0c\xd0\x11\x03\x70\x66\x36\xc0\x67\x87\x00\xba\x7a" - "\x02\x38\x7b\xcb\x02\xad\xbb\x60\x15\xf7\x26\xbc\xbe\x26\x44\xe0" - "\xd4\x0d\x4e\xef\xd9\x67\xe4\x64\x9a\x26\x4d\x98\x3c\xe1\xde\x7b" - "\x96\x99\xc6\x8f\x37\xdd\x9d\x36\x69\xd2\xc4\xb4\xfb\x26\x4e\xfa" - "\x81\xe9\xee\xbb\x1f\x98\x94\xf6\x40\x5a\x9a\x69\xf5\xa6\xc2\x95" - "\x93\xd2\x9e\x5d\x6e\x5a\xb1\xb2\x70\xf5\xc6\x65\x85\xcb\x2f\xd5" - "\xa3\x2b\xfa\xa3\xe6\xdd\xe4\x07\xce\x81\x60\x6a\x4f\x03\xe9\x17" - "\x79\x20\xfd\x7e\x0a\x0c\x65\x4f\x8a\x7c\x05\xff\xe9\x56\x1d\x04" - "\x9d\xe5\x10\xe8\xf2\x13\x41\xb7\x24\x19\x74\x0b\xdb\x41\x57\x81" - "\x69\x3b\xf6\x80\x6e\x5b\x37\xe8\x5e\x38\x05\xba\x22\xeb\xd0\xb4" - "\x57\xb7\x8b\xb4\x5f\xea\x41\xf7\xb3\x29\xa0\x7b\xcb\x08\xba\xfd" - "\x16\x91\x76\x14\x61\x8e\x18\xfe\x4b\xfa\x7e\xe5\x7f\x97\xeb\x2f" - "\x0c\xf9\x73\x72\x99\xa2\x51\x7a\x20\x39\xc4\xa4\xe8\xf7\x7f\xdf" - "\xff\x7d\xff\xf7\xfd\xdf\xf7\x7f\xdf\xff\x7d\xff\xf7\x3f\xfc\xcf" - "\xa5\x83\xc9\x5f\x4a\x7a\x78\xaf\x06\xa0\xcf\x66\x48\x72\xea\xee" - "\x9f\x4c\x6b\x48\x80\xbe\x95\x02\x03\x5f\x53\x2a\x2e\x3d\xfe\x44" - "\xe2\xc0\x3f\x02\xaf\x91\x06\xf5\x5a\x14\x5a\x6b\xd4\x9c\x98\x06" - "\x11\x89\x20\xd6\x45\xd9\x58\xbb\xf8\xd6\xf7\x6e\xe8\x01\x03\xff" - "\x56\x9f\xbe\x0f\x45\xfc\xc5\x4e\xf8\x79\xa3\xb2\x8e\x4a\x81\xa3" - "\x75\x54\xb4\xee\x0a\x61\x57\x13\x6c\x98\x75\x33\x46\xf6\x7a\xa2" - "\x34\xfd\x00\x00\x7d\x67\xfa\xda\x5e\xe6\x6a\x29\x01\x68\x6e\x12" - "\xdf\x9b\xd2\x9a\x1a\xc4\x7f\xd2\x09\xe5\x4d\x62\x1d\x15\x73\xbf" - "\x88\xe9\x98\xd6\xe3\x84\x8a\x3d\x72\x9d\x3d\x4a\xba\x63\xfb\xd7" - "\xd0\x62\xe2\xdf\xd3\xb8\x5a\x4c\x3e\xc8\x18\x4b\xfd\x8f\x4a\x44" - "\xd8\xa4\x70\x6b\x68\x94\xf5\x62\x54\xb7\x0c\x9f\xa9\xa9\x0f\xfb" - "\x18\xb5\x58\xa9\x2f\x0c\x8e\x18\x2a\xab\xe0\xc1\xb6\xf7\x60\x99" - "\x1a\x05\x0f\xb6\x47\x69\xa3\x2b\x63\x0b\xaf\xe3\x50\xa8\x36\x99" - "\xde\x4f\x8f\x5c\x7e\xdf\xc4\xce\xf4\x8f\x57\x24\x9b\xae\x99\x34" - "\x63\x79\xf2\xed\x2c\x2d\x3e\xf5\xe5\xb4\xab\xcc\x51\xe6\xb8\x89" - "\xf3\xd3\x24\xa3\x34\x4e\x4a\x1b\x6d\x94\x6e\x7b\x9a\xfe\x6d\x1f" - "\x93\xc2\x7f\x4d\xfa\xf4\xed\xf9\xf7\x99\x46\x4e\xdb\xb9\x63\x83" - "\xf9\x5f\xfe\x69\xa6\xf9\x91\x85\xeb\xee\x78\x2f\x4d\xba\xfa\x4f" - "\x2f\xbf\x9d\xf2\x25\x41\x8c\x1d\x47\xff\x2e\x6e\x8e\x48\xb8\xc3" - "\x46\x58\xda\xaf\x37\xbd\x47\x29\x77\xea\xd3\x8b\xf2\xef\x9d\xd8" - "\x44\x35\x3e\xf6\xcc\x78\x1b\x95\x99\x39\x47\x94\x11\x10\x13\x8f" - "\xa8\xf3\x26\xfc\x86\x4a\x9b\x78\x1b\x40\x2f\x70\x0d\xe2\xbe\x4e" - "\xb4\x50\xa4\x8e\x3b\x91\x76\x93\x5c\xf7\x4f\xe8\xdf\x27\xdf\x9a" - "\x20\x21\x86\xd1\xe3\x1f\xa6\xdc\x89\x7d\x69\x7d\xa6\x96\x74\xfd" - "\xb3\xc9\x29\x23\x27\xfd\x13\xde\x25\x3f\x9b\x6c\x94\xf0\x7e\xa7" - "\xb8\x27\x1a\xe4\xff\x40\x40\x18\xa5\x5b\x13\xd2\xf3\xf3\xef\xfb" - "\xd4\x9d\x7f\x9f\x51\x32\x37\xe5\xa7\x9b\xaf\xad\x2a\xb8\x2b\x39" - "\x3d\x39\xff\x5e\xa3\xc4\x7f\x1f\x30\xdf\x5a\xf9\xa4\x51\xba\xfd" - "\xdd\xb4\x51\x46\xdd\xbf\x35\xea\xe0\x7d\x69\xc1\xa1\xf7\x23\xfe" - "\xfc\xe7\x0f\xe0\xce\xd5\x1f\xe8\xee\x9c\xfd\x81\xa4\x1b\xf5\x41" - "\xcc\x13\xf0\x6f\xc6\x91\xf0\x6f\x89\x78\x99\x1e\x81\x56\x5d\x69" - "\x76\xab\xb4\x31\xaf\x35\xa2\xb4\xad\x55\xff\x38\xb4\x46\x2e\x1d" - "\xd5\x3a\xe2\x91\x79\xad\x23\x1f\x3f\xdd\x6a\xb8\x1d\x5a\xa3\x00" - "\x5a\xc7\x82\xd4\x3a\x0e\x12\x5a\xef\x1e\xb5\xa3\xf5\x91\x31\x92" - "\xfd\xea\xde\x87\xec\x37\xe8\x67\xda\x93\x8d\x60\xbf\x35\x1a\xec" - "\xb7\xc5\xc4\xd8\x6f\xc7\xeb\x0e\x68\xb4\xa7\xe1\x73\x3a\x24\xd9" - "\x23\x37\x8f\x00\x10\x6d\xf9\xc0\x04\xf0\xc1\x58\x98\xf6\xc1\x38" - "\xfc\xbd\x05\xaf\x64\xbc\x6e\xc5\xeb\x76\xbc\x30\x4e\xf9\x80\xf6" - "\xd5\x81\x94\x11\xe9\xff\xfc\xee\xb2\x65\x93\x97\xdd\x9b\x33\x3d" - "\x22\x62\x79\x32\x5c\x85\x54\xd3\xa7\x27\x8f\x8d\x9c\x12\xb9\x3c" - "\xf9\x53\xb7\x19\xff\x35\x4a\x4f\xfd\x7b\xc4\x88\x89\x7d\x53\xfa" - "\xf2\xfe\xe5\x53\x1f\x44\x23\xfd\x41\x2b\xc3\xbd\x36\xd0\xb9\xb1" - "\x8d\x6e\x5b\xef\x43\x7d\xb6\x18\xa3\x13\xa2\x2c\x8a\x1c\x8b\xbc" - "\xf7\x8c\x6e\x5b\x19\xca\x5f\x4c\x6a\xe8\xbc\x6d\x94\x97\x79\x91" - "\x72\xf9\xa1\xf3\x48\xa6\x63\xca\x94\xbc\x5e\xa9\x39\x1b\x9f\x51" - "\xfe\x0d\x53\x82\x61\xed\x11\x6e\x9b\x6e\x1b\xe6\x1d\x1a\x8a\xc7" - "\x8e\x78\x32\x2a\x31\xaf\x35\x44\xde\xa3\x6e\xdb\x7c\xaa\xa3\x53" - "\x53\x87\x5b\xa9\x83\xbe\xe3\xae\x47\xfd\x22\xbb\xe3\xb7\x45\x1d" - "\xa5\xb2\x0e\x8f\x0b\x9a\xfc\xdd\x3a\x7d\xf1\x71\x20\x3c\x7d\xb6" - "\xd8\x64\xa5\x3c\xc1\xd1\x3e\x04\xf4\xfd\x1d\x5f\xe7\x09\xb1\x8f" - "\xd1\x3a\xcf\x5d\x88\xc3\xb4\x41\x77\x5d\x07\xc4\xf8\xa8\x8c\x13" - "\x62\x2d\x6e\xe9\x43\xac\x3b\x36\x4f\xb1\x73\x98\x46\x6b\x73\x68" - "\x3d\xb9\x1b\xfb\x5e\x86\x79\x25\x43\xdb\xfc\xe1\x68\x41\x97\xd8" - "\x5a\x25\xef\x62\x6b\x07\x45\x19\xc6\xdc\xb6\x0f\xfd\x58\xe6\xf8" - "\x50\x7c\xac\xcc\x6d\x93\x76\x60\x5e\x77\x88\xbc\x6d\xa2\xae\x38" - "\x7d\x88\x3c\x1b\xe6\x49\x98\x67\x0a\x93\x17\x81\x79\xe9\xa1\xf2" - "\x5a\xea\x38\xce\xdc\x41\x9a\xc7\xc5\x9a\xf1\xd9\xa2\xd0\xfc\xd2" - "\xfd\x21\x7e\x4f\x42\xba\xc7\xd5\x69\xf1\x13\x6e\xb7\x74\x82\xf0" - "\x1d\x1d\x5a\xf7\x71\x9d\xdb\x96\x89\xb2\x10\xf7\xf1\xd0\xbc\x8f" - "\x6e\x44\x3a\x50\xbb\x5c\x21\xf2\x92\xb0\x3f\x68\xaf\xe3\x63\x42" - "\xe0\x1c\x81\x79\x4e\xcc\x4b\xb9\x04\x3f\x8c\xdc\x86\xd3\x3e\x07" - "\x63\x20\xb2\x0b\x46\x4f\xa5\xfe\x08\xb9\x80\x11\x5d\x30\xea\x44" - "\xaf\x58\xf3\xee\x32\x6d\x86\x08\x7c\x7e\x93\xd9\xec\xd7\x60\x7e" - "\x0f\xca\x93\xc1\xf1\xb5\x17\xba\x20\xbe\x0a\x61\x22\xe8\x1b\x55" - "\x1a\x9f\x30\x3d\xc2\xe1\xf1\xd2\x77\x1a\x28\x67\xf1\xbf\xc6\x5f" - "\x09\xcb\xf1\x6f\x12\x16\xd4\x41\x32\xb5\x91\xaf\x53\xb5\xd9\x75" - "\xb4\xee\x93\xc6\x43\xb7\x04\xb7\xbb\xb9\xcc\xc6\xe3\xf8\x67\x68" - "\x94\xd7\xe8\x52\x1b\xf4\x58\x76\x8b\x64\xe4\x6b\xbe\x5d\x88\x8b" - "\xda\x30\xcf\x6f\xb3\x4b\x83\x78\x24\xfb\x55\xb4\x7e\xb7\xd7\x26" - "\xcd\x72\x4b\xf1\x4c\xe0\x31\x9a\x14\x3c\x04\x87\x75\xf1\x75\xf0" - "\xbd\x36\xfd\xab\x2a\x98\x0c\x75\x5d\x13\xdd\x10\x41\x6d\xee\x00" - "\x63\x1d\xd5\x27\xf7\x91\xaf\xa9\x75\x6c\xf0\x82\x03\xfd\x8b\x2e" - "\x30\x16\x63\x5f\x4d\xcd\x1e\xfa\x96\xd9\x3e\xaa\x61\x2b\x00\xd7" - "\x0b\x09\x4c\x32\xce\x5a\x05\x27\xe1\x50\xf5\x75\xb4\xa8\x9f\xfa" - "\x6a\x00\x19\xb6\x45\xdd\x46\xc2\x8b\xfd\xba\xae\x1e\xe1\x5a\xd0" - "\x6b\x91\x61\xba\x15\x18\x15\x0f\xc6\xca\xed\x23\xfa\x10\xcf\x16" - "\x2b\xfa\xd9\x67\x1b\x85\xe3\xff\x55\xdd\x42\x6f\x03\xe9\x72\x1b" - "\x12\x45\x1b\x74\xd8\x06\x9d\x5d\xe0\x1f\x95\xa9\xe0\x77\x82\xd1" - "\xa3\x6e\x73\x3d\x87\x35\x46\x09\x3d\xe5\xb0\x45\x01\xd8\xf8\x20" - "\x58\xa4\x85\x24\x78\x00\x92\x13\x46\xe5\x23\x3d\x22\x10\xe6\x30" - "\xf2\xdb\xa4\xc0\xc8\xfd\x4f\xc4\xbc\x69\x32\xbe\x16\x15\xbe\x22" - "\xc2\x47\xeb\x5e\x85\xed\x1d\xe5\x0c\xd8\x3e\x68\xc5\x67\xd7\x50" - "\xfb\x4a\xfa\x3a\xda\x80\x70\xc9\x94\x6e\x1d\x07\xc6\xb3\x30\xea" - "\x4c\xaf\x14\xd1\x2d\x68\x31\x1a\xed\x5f\xec\xa0\x6f\x83\xcf\x93" - "\x9d\x60\xf2\xc8\xf5\xe5\x13\x6d\x02\xf6\x96\xea\x1c\x9d\xa3\xd4" - "\xa9\xe4\xab\x75\xc6\x1c\x35\x11\xfd\x13\xf3\xcf\xcd\x49\xe6\x31" - "\x8a\xef\x32\xb5\x65\x45\xf2\x44\xf7\xd4\x16\xd3\xbd\x69\x3f\x5d" - "\x9e\x9c\xca\xc7\xfe\xdb\x3b\xd2\xc6\xe1\xe8\xfe\x27\xfe\xef\xab" - "\x94\x92\xcc\x53\x30\x9d\xee\xc7\xd1\xbd\xec\x2f\xe0\xdd\x63\x0b" - "\x22\x46\xde\x5a\x48\x77\xc2\x73\x30\x5f\xbb\xe4\x99\x88\x0c\xf9" - "\x3e\x4e\xe4\xdc\xc5\x7d\x8e\x94\x87\xe9\xfe\x36\x8e\x6b\x62\x13" - "\xd5\x3c\xe1\xe5\xb4\x1f\x2e\xfc\x5f\x11\x1f\xec\x58\x65\x8e\xb9" - "\xdd\x46\x30\xa9\x3f\x4a\xdb\x8f\x29\xcd\x94\x32\xee\x27\xbc\x05" - "\xea\x52\x47\xa8\x94\x9c\x9f\x94\x3a\x23\xed\xc7\x8b\x16\xdc\xf2" - "\xa7\xb4\xd1\x57\xbf\xb7\xb8\x99\xca\x5f\x3d\x3a\xa8\xa6\x71\x81" - "\x56\x3d\xbd\xfb\x8e\x97\xee\xf9\xa9\xc0\xb2\x70\x41\xc4\x9f\xcc" - "\x63\xd6\x16\x52\xea\x2d\xdc\x17\x23\x5f\x65\xe2\x57\x69\x91\x3b" - "\x16\x7e\xfa\xaf\x0b\xdf\x6a\x7f\xf2\x0e\xec\xe9\xd5\xaf\xb6\x3f" - "\xb9\xf0\xad\x4f\xff\x35\xe2\x45\x82\xbc\x33\x3f\x2d\xc1\x14\x39" - "\x75\x7d\xcb\xbc\x3b\x78\xab\xae\xab\x4a\xac\xbd\xbe\xe9\x86\xc3" - "\x37\x1e\x4b\x6a\xbd\xe9\xdf\xc7\xfc\xe7\xcd\x7f\x35\xb9\xc7\x32" - "\xf4\x23\x1e\x4a\x1b\x3b\xe8\x47\x00\xfa\x11\x1d\xe8\x47\x94\xa2" - "\x1f\xd1\xa6\xf6\x23\xfe\x10\xfd\x40\x89\xf0\x25\x04\xbc\xf0\x7f" - "\x52\xff\x1d\xfd\x9f\x35\xe8\xff\xa4\x7e\x10\xf9\xd8\xe3\x1f\xc4" - "\xe4\x08\xff\x67\x54\xfc\x08\xee\x03\x5d\x8f\xbf\xe8\x07\xfd\xdb" - "\x58\xfc\x4d\xc1\xe7\x3b\x46\x8f\x0c\xf6\x89\xe6\xc7\xb5\x46\x2e" - "\x46\x9f\x28\x1d\x7d\x22\xf3\xb2\x56\xc3\xac\x77\x5b\xa3\xa6\x98" - "\x5b\xa3\x07\xfd\xa2\x99\xad\x19\x89\x13\x5b\x67\xe9\xa1\xf5\x51" - "\x10\xbe\xd1\x76\x48\xfb\x83\x3e\x41\xf7\x51\x0c\xe8\x3f\x8a\x6b" - "\x8c\xfe\x28\xde\x6e\xff\xc8\x88\xd7\x28\x68\xfc\x68\x34\x8c\x7c" - "\xef\xa1\x46\x78\x6f\x7a\xa9\xf3\x03\x3d\xc4\x7d\x10\x05\x5f\x7d" - "\x30\x0a\x7f\xf3\xf6\xc2\x07\x3b\x41\xff\x41\xb4\xfe\xab\x40\x7f" - "\x13\xce\x7c\x30\xf6\xfd\xa9\x1f\x8c\x4b\xff\xfd\x07\xb7\x64\xcc" - "\xff\x20\xf9\xfd\xf7\x3f\xb8\xd5\x39\x46\xed\x37\x51\x9f\x01\xee" - "\xda\x4e\x1e\x2c\xd2\xfb\xde\x94\x11\x69\x23\x5e\x5a\xce\xfd\xc1" - "\xfb\x64\xbf\xf0\x3e\xf3\x8c\x1d\x0b\x17\x3e\x13\x21\x99\xc7\x70" - "\xef\x52\xf6\x34\x03\xde\x67\xb0\xcf\x39\xb5\x25\xe0\x73\x26\xbb" - "\x03\x3e\xa7\x69\xc4\xd4\x0d\x41\xfe\xd9\x00\xa6\x7d\x9c\x9e\x6c" - "\xba\x35\x8d\x7b\x66\xed\xd7\x6b\xbd\xb5\x09\xd5\x69\x53\x93\x0d" - "\xf7\x9e\x44\x9f\x6d\x64\xf9\xce\x67\xfe\x89\x2e\xf4\xda\xbe\x31" - "\x4a\x3b\x9e\x5b\x36\x25\xf7\xc5\x3b\x91\xe7\x57\x93\x17\x3c\x72" - "\xe7\x4b\x47\x77\xee\xdc\x71\xf4\x83\x27\x17\xdc\xf1\x1b\x4c\x7b" - "\x2f\xb9\x08\xe5\xe7\x7f\xe7\xff\xef\x89\x5f\xa5\x47\xee\x7c\xfc" - "\xe8\x8e\xd7\x9f\x7d\xb6\x85\xe4\x85\x78\xab\x8c\x51\xbd\xb6\xd1" - "\xe8\x93\xe8\xfe\xa5\xcf\x76\x0d\xfa\x3f\xd7\xb7\x6a\xc7\xb2\xef" - "\xf5\xf2\x7b\xbd\xfc\x5e\x2f\xff\x3b\xf4\xf2\x5a\x10\x7a\x79\x7d" - "\x55\x28\xbd\x9c\x35\x77\x66\xd6\x03\xa6\xf5\xcf\x98\xac\x85\x6b" - "\x9f\x2d\x5c\xb6\xda\x54\xb0\x76\x59\xfe\xf2\xfc\x68\x18\xcc\x58" - "\xf6\x4c\xd1\xca\x0d\xcb\x8a\x96\x0f\xf9\xa6\x31\x51\xf1\x49\x87" - "\xfa\xd6\xd7\x7b\xc2\xfb\xd6\x37\x24\x84\x8e\x4b\x74\x38\xb6\xdf" - "\x90\x16\x22\x6f\x9c\x9c\x37\x3b\x44\xde\xc3\x72\x9e\x25\x44\x0c" - "\x18\x2b\x62\x8c\x1b\xb6\x87\xca\xc3\xf4\x3a\xc5\x27\xc1\x38\x4d" - "\x6a\x19\xd7\x03\xe4\x93\x74\xc1\x0d\xef\x63\x9f\xba\x31\xff\x98" - "\xe2\xcb\x38\xe1\x86\xed\x8a\x8f\x26\xc7\x21\x29\x6e\x9b\x19\xfb" - "\x79\x83\x33\x44\x8c\x72\xa7\x5c\xaf\x37\xe0\x1b\xcd\x35\xf5\xd9" - "\x6e\x8c\x19\xea\x1b\xb5\x83\x88\x21\x6f\x4c\xd1\xc0\x4e\x51\x60" - "\xd1\x9f\xa4\xbd\x1e\x7a\xe8\x5b\xb4\x1e\xb8\xf1\x18\xb3\x5d\x5f" - "\x4b\x3e\x25\xc5\x91\x84\x47\xc4\x92\x27\x79\x2c\x89\xb1\x62\x27" - "\x96\x2d\x52\xc5\x93\x9d\xe8\x1b\x8f\xa4\x78\xb2\x0b\x6e\x7c\x93" - "\x62\xca\x5d\x1c\xd7\x59\xc2\x35\x87\x70\x39\xe1\x46\x3b\xf7\xfb" - "\x44\xd9\xc3\xaa\x79\x33\x8c\x6b\x6f\xe4\x7b\xef\x29\x7e\x21\xe6" - "\xb7\x3b\xa5\x4f\xdc\x4a\x1f\xc8\x17\x94\xfb\x51\x26\xf8\x70\x63" - "\x88\xf8\xa7\xfd\x55\x11\x07\x26\x0d\xc6\x3f\x84\xcf\x6f\xbb\xfe" - "\xd7\xf5\x1c\x67\x52\xb2\x82\x53\x2d\x97\xcf\xac\x5d\xb3\x62\xe5" - "\xb3\xeb\x0b\x97\x9b\xd6\xcd\x9e\x6d\x5a\xbd\x36\x7f\xf9\x84\x09" - "\x13\xa2\x83\xe4\x2f\x46\xf8\xb4\x1f\x9a\x49\x0e\xc9\xaf\x95\xe5" - "\xd0\x8c\x3e\xa7\xec\x37\x27\x95\x05\xc7\x17\x1f\x9a\x65\xff\xd6" - "\x88\x30\x69\x32\x4c\x53\x10\x0c\xe2\x93\x7d\x64\xf2\x73\xe3\x64" - "\x98\x56\x2d\x1e\xcc\xe3\x71\x11\x7d\x5f\xd7\x2b\xfa\xd7\xa3\xc1" - "\xf3\x90\x1c\xef\xa0\xdc\x8f\x90\xe3\x84\x9b\x8c\x1a\x3c\x0f\x05" - "\xe2\x0d\x9d\x02\x33\x59\x1d\x9b\xe0\x73\x86\xc2\x93\x80\x1f\xdf" - "\xdc\x2d\x70\xeb\x8c\x01\xbf\xff\xa6\x02\x4d\x2c\x75\x6d\x00\x37" - "\x18\x65\x98\x9a\xe0\x36\x36\x9f\x95\xfb\x6a\x50\xe1\x39\x12\x8c" - "\xa7\xf9\x6f\x32\x9e\x08\x15\xcc\x49\x4d\x1b\xbb\x87\xb6\xd1\x1e" - "\x27\x70\x37\x62\xfd\x4e\xb9\x6f\x63\x34\xfd\x47\x18\x8e\x3b\x01" - "\x61\x92\x14\x98\xc9\xea\x58\x8a\xe2\x39\xfe\xcd\x25\x8c\x99\x4d" - "\xf2\x84\xd7\x08\x6c\xf7\xe7\xaa\x98\x6e\xa4\x5c\x4e\xdb\xff\xd8" - "\x5e\x8c\x17\x1a\x82\xe2\xb4\x31\x9a\xfe\x63\x6c\x38\x5a\xa1\x91" - "\x5e\x81\xd1\xf6\xdf\x29\xda\x38\x6a\x54\xa0\xff\x63\x4e\x6a\xf0" - "\x5c\x4b\x32\x45\xb8\x54\x75\x79\x35\x78\x3a\x64\x3a\xaa\x68\x7d" - "\xb3\x49\xc3\x8f\xcf\xe4\xf6\xa8\x68\x7d\x73\x86\x06\xcf\x79\xca" - "\x0f\xee\xd7\xcd\x16\x0d\x9e\xf3\x81\x7e\xa1\x1c\x0b\x98\x2a\x4d" - "\x1c\x2b\x31\xdb\x7b\xb1\x1a\x3c\x87\x15\x98\xde\x11\x3b\x1a\x05" - "\x6f\x6f\x6e\x51\x6c\x91\xe0\x6b\x52\x1a\xe1\xc6\xf4\x53\x6a\x5b" - "\x80\xed\xea\x1e\x4a\x27\x13\x68\xe9\xa4\x6a\x97\x1c\x8b\x9b\x92" - "\x35\xfd\x3b\x2b\xd3\x29\x5a\x85\x27\x53\xd3\xbf\xbf\xc9\x78\x22" - "\x55\x30\x1a\xfe\x37\xf7\xc8\x78\xf4\x2a\x18\xad\xfc\x7f\x21\xe3" - "\x51\xd7\x75\xe4\xd2\x74\x32\x05\xc9\x3f\xd1\x0a\xd3\x7a\x2e\x31" - "\x07\x65\x10\xef\x0e\xc6\xe2\xf8\xf7\x56\x1d\xff\x26\x3a\xba\x77" - "\x0f\xed\x1d\x85\x36\xda\xcc\xe7\x06\xfb\xc9\x4e\x8f\xa5\xbd\xa6" - "\x5c\xa2\x0f\x90\x26\x6c\xf7\x58\xbe\x5f\x0a\x96\xcd\x76\x42\x5c" - "\x91\xfa\x3d\x80\x13\xc6\x56\xc9\x79\xd8\xff\x6b\x4e\x2a\x79\x94" - "\x2e\xe6\x17\xc7\xe2\xf8\x77\xbd\x55\x8c\x63\x63\x0b\x64\x58\xb4" - "\xfb\x49\x99\xa1\xbe\x53\x0e\xf7\xfe\x65\x5d\x22\xf3\x97\x5e\x4f" - "\xdf\x2d\x9f\x4e\xf4\xdb\x18\x38\x8a\x3d\x60\xba\x01\x4a\x3b\x60" - "\x9c\x81\x62\xfc\x5d\x9b\xc1\x50\x6a\x65\x1e\xda\xe7\xb5\xcd\xd5" - "\x03\xa5\x2e\xd6\x4d\xfb\xfa\x6f\xfd\x0a\x0c\x0e\x2f\x3f\x0f\x2d" - "\xb1\xa5\xe4\x4c\xc8\x6f\x6f\xfd\x12\x83\xd2\x24\x2a\xdb\x09\x6d" - "\x75\x9d\x50\x5a\x17\x5c\xb6\xf4\x26\x48\x3c\x41\x67\x04\xd8\x20" - "\x9e\xda\x41\xef\x53\xbc\xd1\xa7\x13\x4b\xf6\x81\xbe\x14\xbd\xcb" - "\x13\xf9\x76\xa5\x2d\xed\xd4\x96\xed\x67\xc1\xf0\xd6\x0a\xbb\xf4" - "\xe2\x59\x6a\xef\x5f\x13\x7f\xb5\xd9\x23\x35\x27\xce\x86\xe6\xc4" - "\x53\xd0\x92\x38\x15\x5a\x8a\x33\x60\xd7\x59\x88\x69\xf6\xa4\x43" - "\x8b\x7e\x26\xb4\x24\x67\x80\xa3\x07\xef\x4d\x3e\x84\x71\xf3\x7d" - "\x8e\xba\x60\x9c\x7d\xcf\x73\x60\x70\x0a\x9c\x48\xb3\x71\xc7\x95" - "\x3d\x7b\xe8\x39\x54\x3f\xd6\x5d\x0f\x89\xd8\xbe\x6e\x6c\xcb\xfd" - "\x1d\x70\x4b\x64\x72\x22\xd0\x39\xea\x23\x1d\xb5\x5e\xd0\x97\x40" - "\x54\x18\xb9\x48\xe0\xfb\x7d\xa2\x1f\x55\xbf\x17\xc7\x7a\xfc\xed" - "\x45\x99\xe8\xb3\xdd\x92\x8e\x75\x9f\x92\xe7\xbd\x7a\x4a\xdf\x44" - "\x39\xdb\x98\x4b\xfb\x7f\xe0\x38\x7d\x4b\xae\x92\x47\xfb\x98\xd2" - "\xfe\xa4\x13\x13\xc0\xe8\xf0\x9a\xe1\x9d\xfe\x6e\xfa\xc6\xbe\x87" - "\xf6\x3d\x20\x7c\x38\xe6\x47\xd0\xfc\x13\xb6\xe7\x0e\x1c\xe3\x7b" - "\x6e\x41\x38\x2c\x8f\xfc\x6f\xe7\x7b\xf7\xb2\xeb\x16\xb9\xfd\xd7" - "\x2d\xfa\xca\xff\xfa\xa2\x5e\xf6\xfa\xa2\x2f\x7d\xaf\x2f\xba\x50" - "\xba\x09\x0c\xbe\xeb\x16\xb9\xda\xac\x9c\x07\xc6\x36\xeb\x17\xf4" - "\xbd\xbc\x81\xce\x0d\x5d\xf2\x3c\xf2\xde\xfb\x09\x6c\x59\x09\x89" - "\xfe\xa8\xcf\xdb\x1d\xde\x3f\xc3\x92\x12\x60\x78\xef\x0c\xd5\xbf" - "\xde\xe8\xbf\xe6\x2a\xf3\x69\x7d\xb6\x64\xa3\x53\x72\xf2\x3d\x74" - "\x5d\x51\x17\x72\xf1\x5a\x8c\x57\x1e\x5e\xf9\x2c\xfa\xaf\xf9\x48" - "\xab\xd2\xb8\x6d\x3a\xa0\x7d\x7a\x26\xfa\x41\x77\x16\x92\x53\xb1" - "\xfd\xc6\x30\x74\x4b\xf2\x57\x32\xfb\xed\x65\xb0\xb5\xaf\xcf\x42" - "\xfb\xa5\xba\x48\xbf\xc8\x1f\xc5\x7a\x8a\xb1\x9e\x6c\xae\x0b\x7b" - "\x51\x8f\xa2\x99\x9d\x7c\x3a\xf7\x0b\x16\x9d\xeb\x05\x8b\xd4\x1b" - "\xcd\x9a\x11\xa6\x0e\x61\xca\x65\x1a\x76\x13\x2e\xd4\x1b\x57\xac" - "\x17\x22\x10\xa7\xf5\x5f\xbe\x3e\xa9\x3f\xb0\x97\x9d\x42\xb8\x96" - "\x41\x5c\x88\x7b\x0f\xf7\x93\x92\x4f\x2a\x69\xe4\x27\x55\x23\x1c" - "\x95\x77\x78\xcc\xf4\xce\xd0\xe9\x28\xe8\xa6\x7d\x2a\xa2\xd9\x80" - "\xa8\x8f\x7c\x38\xd2\xd5\x58\x0f\x8c\xe8\xb3\x41\x36\xe1\xa6\x72" - "\x74\x5e\x05\x96\x6b\x66\xa5\x16\xf4\x17\x61\x6e\x1f\xb3\xe8\x68" - "\xcf\xda\x66\x2c\x2f\xea\xbe\xd5\xac\xb4\x91\xea\xe0\x7b\xd6\x52" - "\x3b\x51\x1e\x9a\x0b\x3c\x10\x5b\x4b\xf3\xe4\xb0\x80\xf0\x11\x2e" - "\x94\x03\x27\xf6\xb5\xb9\xb9\xc0\x05\x7e\x16\x84\xd3\x29\xe3\xab" - "\x09\xc2\x87\xe9\x0c\xf1\x91\xfc\xb5\x60\x99\xd8\x46\x8e\x6f\xfe" - "\xbf\xf8\x09\x9f\x07\xf4\x26\xde\xde\x85\x84\x83\xef\xbf\x8c\x38" - "\xed\x1b\x1e\x46\xdf\xf1\x56\x8f\xab\xd4\x12\xc1\xbf\x8f\xc7\xf2" - "\xbf\xda\xda\x1d\xc9\x7a\x73\x23\xe2\xf8\xb7\xf1\x0f\x03\xbd\x6b" - "\x45\x98\xbf\xb0\x5e\x4b\x44\x6c\x0f\xfa\x7a\x08\x43\xfb\x65\x51" - "\x3b\xd5\xbc\x9c\x3f\x63\xe1\x54\x58\x98\x31\x2b\x63\x2a\xcc\x79" - "\x68\xfa\x54\x48\xbb\x7f\x7c\xda\xe4\x7b\x7e\x70\x0f\xbf\xb9\xe7" - "\x07\x53\xee\x81\xec\xc7\xe7\x4f\x85\xec\xb9\x53\x61\x01\x5e\xd9" - "\x0b\x66\xcc\xcf\x98\xb1\x60\x2a\xe4\xce\x9c\x85\x4f\xd3\xa7\x4e" - "\x4a\x7b\x64\x7c\xf6\xf4\x59\x33\x60\x5e\xce\xdd\x69\x77\xdf\x0d" - "\x0f\xcd\x98\x3d\x29\x2d\x4d\xfe\x9d\x94\x46\x20\x4f\x4e\x99\xb1" - "\x60\x7c\x76\xe1\xda\xa2\xb5\xe3\xe7\xce\x9a\x4e\x29\x30\x63\xc6" - "\xd4\xec\x20\x3f\x32\xc5\xf7\xb5\x8f\xe8\xed\x66\xe7\x33\x69\x9f" - "\x62\xa8\x47\x39\xc0\xab\x87\xef\x7f\x04\xb7\xff\xb1\x9e\xf8\xc7" - "\xc7\x82\xdb\x12\x68\x3c\xed\xb3\xdd\x46\xfc\xe7\xb1\x14\xed\x15" - "\xdc\x05\x13\xa6\x62\xde\xf5\xb2\x3f\x12\x89\xf9\x9e\xe0\xfc\x3b" - "\x16\x63\xfe\xcd\xb4\x9f\x8e\x03\x2f\xa4\xbd\x1b\xed\x21\xd2\xd8" - "\x05\xbd\xa5\xb9\x91\x7c\x3f\x43\xe4\x3b\xed\x33\xd1\x67\xbb\x7d" - "\xb2\x4a\xef\x3b\x69\x3f\x0a\x9a\x4f\x3e\x07\xb7\xc7\xb6\x15\x99" - "\x69\xcf\x29\x70\x14\xc9\x38\xbe\x1a\xc4\x11\x2d\xef\x89\xe8\xac" - "\xa7\xbd\x3e\x04\x9e\x12\x95\x8d\x70\x12\x9e\x5d\x98\x27\xe3\x9a" - "\xd7\x86\xb6\x02\x6d\xf9\x38\x7f\x69\x0a\xb0\xe8\xd3\x26\xff\x40" - "\x0a\x88\xf9\xd7\xdb\x8f\xa8\x64\xdb\xdd\x52\x8c\x70\x6f\x65\xea" - "\x68\xdf\x05\xbe\x07\x03\xdc\x46\xba\xe4\xf6\x55\x5e\x58\xc9\xce" - "\xf3\x7d\x0f\x47\x60\xff\xc6\x63\xff\x92\xfd\x95\x17\x2c\x7c\x0f" - "\x51\x0e\x97\x92\xc0\xe8\x39\x1a\xe1\x06\x06\xd3\xae\xa1\xb4\x3e" - "\x7a\xbf\x83\x3a\xcb\x18\x4f\x8f\xc0\xf4\x3f\xa3\x5d\x3b\x89\xb0" - "\x16\x82\x9d\xe8\x85\x91\x7c\xbf\x93\x52\x1d\x74\x40\xca\x62\x7f" - "\xf4\x85\xe7\x54\xf5\x11\x9e\xc5\x62\x1c\x43\x5e\x9c\x47\x3c\xbd" - "\x3c\x5d\xc2\xf4\xdf\x21\xfe\x55\x64\x2f\x85\x0d\x9f\xf0\x14\xc0" - "\xe0\x7b\x91\xc0\x33\xed\xe7\xbc\x55\x3c\x37\x23\x2d\xe9\x3d\x01" - "\xbd\xe3\xef\xb3\xa5\xa0\xff\x93\x9c\x29\xc6\xca\x09\xbc\x0e\xda" - "\x3f\x96\xc5\x3c\xec\x42\xbc\x05\xf6\xcd\x3d\xfc\x0c\x50\x27\xa4" - "\x14\xf8\x4b\x2d\xa0\x69\x53\x0a\xb5\x9f\x6c\x08\xd2\x62\x3c\xca" - "\x41\x54\x9f\xed\x0e\xd0\xc8\x41\x12\xe2\x59\x89\xed\x3b\x89\x7d" - "\x5a\x89\x78\x92\xfd\xbd\x16\xac\x17\xe3\x45\x66\x41\x5f\x29\x80" - "\x43\x2e\x6f\x0e\x2e\x7f\x7b\x27\x95\x43\xf8\xc8\xbe\x5e\x82\xbf" - "\xbd\x9b\x68\x2e\xcb\x1d\xca\xe5\x1d\x56\x8d\x5c\x8e\xc5\xb6\xdc" - "\xa7\xca\xaf\xd1\xe4\x47\x62\xfe\x0f\xe5\x7c\xd4\xfd\x3b\x0e\x6b" - "\xda\x7b\x1c\xf3\xa7\x61\x7b\xdd\xa8\xdb\x11\x58\x5f\x53\xbd\xec" - "\x9b\xc8\xf0\x4e\x0d\xbc\x17\xe1\xa7\x93\xdc\xd0\xb8\x43\xf0\x0d" - "\xb2\xee\x20\xbc\xa1\xcf\x76\xa7\x31\x18\x7e\xfc\x19\x84\x9f\x1d" - "\x68\xdf\x9d\x69\xc1\xf9\x77\x7a\x30\x7f\x1e\xc9\x3a\xfe\x3e\x45" - "\xbe\x3e\xd9\x13\xb2\x65\xcd\x05\xc4\xaf\x3b\xf3\x34\xf0\x65\x08" - "\x97\x2f\xd3\x48\x92\x69\xd4\x24\xc7\xee\xa7\xe4\x36\xec\xd1\x94" - "\x39\x82\x65\x0a\x90\x8e\x2b\x15\xb9\x0c\x51\xa6\x55\x53\xa6\x9b" - "\xf8\xc8\x44\x3d\xfa\xbe\x81\x40\x19\xd9\x4e\xaa\x71\x50\xdf\xae" - "\xea\xb3\xdd\x15\xa3\xe9\x7b\x06\xd6\x5b\x54\x2d\xec\xce\x55\x28" - "\x43\x77\x63\xda\xbd\x88\x73\x35\xe9\xc0\x2e\xf2\x07\x5d\x1e\x60" - "\xa5\x99\x31\x42\x76\xef\x5a\x1d\xe7\x05\xba\x1f\x4f\xf7\x84\x9b" - "\xf5\xcd\x96\x75\xf2\xae\xd5\xf8\x4b\xe9\x7c\xbf\x37\xb2\xc3\xac" - "\xef\x47\x7e\x81\xf3\xae\x57\xe8\x0c\x2c\x7c\xf6\xc9\x75\x8c\xa7" - "\x3d\x42\xb1\xfd\xcf\xe1\xb8\x03\x6c\x23\xc2\x6d\x86\xe9\x98\x7e" - "\x13\xd7\x55\x01\xc7\x9f\x45\x1d\x99\x24\xdf\x93\xf1\xf9\x1a\xb9" - "\x7c\x2c\xe1\xc3\xfb\x49\xf2\xbd\xce\x47\xb8\xce\x2b\x3a\x38\x3e" - "\x92\x97\x43\x3d\xe4\xf8\xb1\x3c\xed\xc7\x2a\x70\xa6\x5e\xc0\xdf" - "\x59\xf8\xfb\x09\xfe\xce\xc3\xdf\xdf\xd1\xfe\xa8\xa5\x3e\xae\x8f" - "\xf4\xfc\x53\xfc\x9d\x8f\xbf\xaf\xe0\xef\x02\xfc\xdd\x82\xbf\x0f" - "\xe3\xef\x13\xa4\x17\xb4\xd7\x3b\xed\x59\x83\x63\xab\x90\x2d\x7a" - "\xf7\xd7\x97\x49\x34\x98\x81\x30\x19\x5c\x5f\x85\x7d\x31\x08\x3e" - "\xa6\xf2\x33\x70\x50\x1e\x28\x6d\xa4\x90\x07\x91\xe6\x53\xec\xd0" - "\xf9\x40\x9a\x6c\x9b\x64\x5d\x94\xd3\x04\xfe\x6c\xc4\x9f\x44\x6d" - "\x65\x02\x57\xa4\xe0\xb9\x8c\x5f\x94\xd3\x87\xa8\x53\xa7\xae\xd3" - "\x09\x77\xb9\x68\xbf\x23\xfc\x3d\xc5\xf7\x93\x84\xf1\x31\x8c\xcb" - "\x3d\x8e\xb3\x1c\xdf\x5d\x47\x65\xb8\x1a\xa2\x31\x2f\x2f\xd2\x53" - "\x55\xb2\x34\xba\xcf\x36\x3e\x57\x23\x4b\xe8\xeb\xdf\xb6\x83\x64" - "\x86\xe8\x4e\x7d\x8b\xb3\xf2\xb1\x9c\xf7\x85\xe3\x3f\x2f\x64\xb2" - "\x5e\x5e\x9b\x24\xf4\x77\x7c\xa3\x06\xcf\x31\xc4\x53\xa9\xd1\xf7" - "\x9e\xc0\xb8\x36\xbe\x5d\x63\x8f\x9a\xb0\xbe\x53\x4e\xd4\x07\xd9" - "\xae\xba\x23\x4a\x48\x5f\xc6\x7b\x9c\x70\xd6\xc0\xfd\xcb\xca\x0b" - "\x6b\x08\x8f\xbb\x94\xef\xd3\xef\x8e\xb0\x52\x7f\x27\x24\x2a\xf9" - "\x3c\x2f\x16\xcc\xa4\x07\x11\x05\x3c\x0f\xc7\xbf\x5b\x8c\x4a\x1e" - "\x88\xfd\xdf\xdc\x11\x45\x3c\x2f\x3b\x80\xf7\xb4\x59\xc6\x1b\x11" - "\xf2\xdc\x85\xf2\xd3\x69\xe3\x01\xa4\x3b\xcb\x20\xd2\xe1\xfd\x18" - "\xb2\xbc\xcc\x37\xbe\x0c\xa2\x1c\xde\x43\x70\x07\xc0\x28\x87\xf7" - "\x14\xdc\x09\x30\xd6\xe1\xdd\x83\xfe\x4a\x13\xe5\xbf\x73\x3b\xe8" - "\x74\xf8\x5b\x7a\x5b\x99\xa4\x73\x78\x8b\x20\xb9\x4c\x8f\xbf\x05" - "\x30\x33\x92\xf5\x39\xbc\xb3\x11\x2e\x1f\xb2\x7c\xec\x7c\x46\x24" - "\xfb\x74\xa9\x0f\x8c\xb3\x5f\x62\xa5\x0e\x2f\xc6\x0e\xde\xe3\x98" - "\xee\x67\x59\xbe\x6f\xf0\xea\x63\xfe\xf2\xd3\xe6\x2c\xdf\x79\x36" - "\xfd\xa5\x77\xf0\xf9\x53\x86\xbc\x64\x0e\x6f\x3a\xb4\xb9\xdd\x08" - "\x57\xca\x58\xc5\xe9\xb4\x25\x5f\x49\x30\x40\xe7\x22\x54\x9c\x36" - "\x63\x5f\xb2\x07\xb0\x1f\x38\x0e\x67\x0d\xbc\x80\xbf\x95\xa7\xe7" - "\xf2\xe7\xf2\xd3\x79\xcc\x70\x3a\x7b\x02\x06\x62\xd4\x07\x87\xb7" - "\x13\x96\x62\x28\x91\xb5\xc9\xc5\xa8\xfd\x71\xdb\x28\x0e\x4b\xa7" - "\x3d\x95\xe3\xb3\x36\x95\x32\xcc\x33\xb0\xa8\xd3\xd9\x0e\x6f\x0f" - "\x60\x1d\x79\x88\xef\x29\x8e\xaf\xfc\x74\x19\xc2\xba\x08\x4e\x8d" - "\x87\x70\x10\x6c\x96\x0f\xe2\x11\xbe\x6c\x20\xea\xb4\x15\xaf\x1a" - "\xbc\xec\x58\xf6\x4f\xcc\x96\xf0\x2e\xed\x8b\x89\xe5\xd1\xaf\x3c" - "\xed\xf2\xd0\x19\x0e\x44\x4b\x1f\x8c\x44\x78\x27\xca\x55\x06\xca" - "\x27\xb6\xb7\xc3\xc8\xdb\x5b\xd9\x11\xef\xe1\xfd\xe8\x88\x13\xfd" - "\xe8\x88\xa5\xf4\x5e\x94\x1d\xbc\x4f\xeb\x15\x79\x13\xb1\x5c\x0e" - "\x2f\x57\xde\x91\xc6\x0c\x1d\x66\x0f\xea\x21\xd2\xb5\x8c\xe8\x88" - "\x74\x2d\x23\x5a\xb2\x8a\x8e\x34\x47\x71\x15\xb0\xa8\x0e\xf3\x40" - "\x54\x47\x36\x96\x7f\x7a\x80\xfb\x2a\x1d\x56\x8f\xc0\xbd\x16\xf1" - "\x2c\x46\xf9\x8e\x40\x1c\x56\xc4\x55\x36\x60\x33\x41\xd6\x26\xe6" - "\xc9\xf2\x6e\xf3\x2e\xdd\x04\x11\xa9\x50\xa6\xa3\xb3\xe6\x1c\xc5" - "\xf9\xd8\xcf\x16\xfc\xcd\xc0\x7c\xb8\x1a\xeb\x7a\x07\xf1\x5a\xa9" - "\x3e\xac\xa7\x0c\x71\x6e\x41\x5c\xf9\xd4\xa6\x6f\x6c\x60\xc4\xe7" - "\x9a\x6f\x44\xfb\x0e\xfb\xcb\x3b\xda\xfd\x86\x0e\xbb\x22\x43\x24" - "\x3f\x82\x6e\x7b\x60\xae\x9b\x79\x1d\xde\x03\x38\xea\x60\x8c\xe4" - "\x3e\x45\xf9\x18\x2b\x1d\x42\x3e\x93\x4c\x15\xe1\x6f\x13\x90\xfc" - "\xb4\x59\x5f\x22\xd8\x77\x48\x86\xe6\x5a\xdd\xdb\xc6\x83\x55\x87" - "\xcf\xa5\x4b\xbd\x06\x58\x62\xd5\x97\xf9\xca\x3b\x1a\xdb\xac\xc4" - "\x97\x8f\xb1\x0c\x95\x2b\x80\x78\x1d\xc6\x0b\x3a\xe6\x8d\x2f\x76" - "\xe9\x63\x2d\xa5\xac\xcd\x3d\x1b\x61\xad\xfc\xec\x3c\x92\x23\x82" - "\x9f\xd3\xc3\x9c\x3e\xc3\x67\xd9\xd4\x37\x16\x57\x06\x27\x7a\xee" - "\x05\x8a\xd9\x4e\xf4\x34\x91\x9c\xfa\x99\xe1\x33\x13\xca\xe8\xc0" - "\x9c\x9e\xb2\xc8\x25\x5f\x81\x0e\xd3\x7c\x27\x2c\x87\x30\xbf\x05" - "\xe1\x8e\x73\xb9\x9d\xfb\x95\x37\xde\x6b\xe8\xa8\xf1\x96\x7f\x96" - "\x36\xf7\xab\x01\x76\xc2\xb2\x07\x9e\xea\x29\x43\x5a\x1d\x82\x39" - "\x5f\x78\x23\xda\xac\xf9\x08\xd3\x87\xe9\x4d\x5c\xfe\xe7\x7c\xd1" - "\xcb\xe6\x3e\xcf\xce\xcf\xfd\xea\x53\x36\xc7\xc2\xde\x59\x5a\x0c" - "\x71\x57\x6d\x63\x7e\xd2\x8b\xe3\x9d\x87\xe0\xaa\x53\xb4\x67\x7e" - "\x06\xcc\x5e\xe6\x67\x73\xbe\x38\xcf\x96\x3c\x4f\xb4\x49\x87\x13" - "\x16\xd4\x9f\xe2\x3d\x44\xef\xc3\x27\x2c\xc7\xb0\xfe\x0c\xc4\x5b" - "\xca\x1c\xc5\x07\x10\xd6\x1e\xff\xd4\x17\x46\x38\xde\xb9\x07\xbc" - "\x51\x1d\x35\xbe\x8a\x8e\x46\x7f\x54\x87\xdd\x5f\xd1\xd1\xce\xa2" - "\x3e\x33\x79\x2b\x3e\x4b\xf3\x45\x7d\x86\x32\xf0\x59\x23\xf2\x29" - "\x8a\x78\xde\x6f\x03\x13\x3e\xd7\xf7\x13\xff\xcb\x3f\x3b\x8c\x7d" - "\x6d\x47\xdf\x98\x09\xd9\xff\xec\x30\xcd\x43\x60\xd9\xf6\x81\xa8" - "\xcf\xec\x08\xd7\x2e\xf4\xeb\x33\x27\xc9\x25\xcd\xf7\x63\xda\xa7" - "\x18\x23\x45\x60\xbe\x6b\x20\xaa\x13\xf0\x32\xb2\xca\xce\x3c\xc4" - "\x3f\x8a\xcb\x54\x79\x67\x1e\x7b\xb0\x06\x7d\xed\xaf\x10\x4f\x27" - "\xca\xe4\x34\x86\x34\x44\x3d\xe9\xcc\xf3\x57\x74\x5a\x59\x74\x67" - "\xa3\x87\xcb\x7e\x67\x03\xe1\x1e\x78\x21\x85\xe6\x27\xf4\x98\x7f" - "\x98\x55\x9e\x19\xe7\x21\x59\x35\x9c\x31\xf9\x0d\x67\xca\x58\xf9" - "\x99\xb4\x1f\xbd\xc4\x5c\xbe\xf2\x33\xd9\xfe\xf2\x33\x66\xef\x08" - "\xf4\xe1\x8b\x8f\x01\xd9\x27\xef\xef\x19\xd2\xe0\x7d\xa4\x47\x13" - "\xe7\xbf\xa3\x18\x75\x60\xd3\x0d\x65\x27\x7a\x50\x16\xac\xbf\xe0" - "\xb6\xa9\xcd\xfd\x31\xa7\x29\x8b\x3a\x63\x22\x99\x22\xfe\x2e\xb1" - "\x42\x19\xab\x38\x93\xe6\xaf\x38\x63\xf6\x55\x20\xde\x28\xac\x27" - "\xfa\xf3\xf7\x3c\x5c\x5f\x3f\x47\x79\x3d\x86\x65\xde\x07\x21\xe3" - "\x9f\xdb\xc3\xd9\x48\xb2\x55\x64\x9f\xb2\xbc\x1e\x92\x99\xcf\xc9" - "\xae\x09\x3b\x05\x4b\x15\x3b\x45\x36\x8a\xe2\x22\xb2\x53\x7e\xd9" - "\x4e\xf9\x65\x3b\xc5\x9f\x0d\x68\x6b\xca\x4f\x67\x93\x3d\xca\x2a" - "\x16\x76\x26\xcb\x97\xc6\x50\x36\x62\x10\x47\xb6\xe0\x05\xc2\x54" - "\x9e\x7e\x8a\xc3\x73\x3a\x9d\x2e\xf3\xa3\xbd\xc1\xab\xc6\x2f\xec" - "\x4d\xbb\x6c\x6f\x24\xc5\xde\xf8\x70\xfc\x43\x9d\xf2\x87\xb2\x37" - "\x7e\xd9\xde\xf8\x98\xb0\x37\x7e\xd9\xde\x50\xba\x4f\xb6\x37\xbe" - "\x10\xf6\x06\xf5\x99\xfa\x1b\x21\xdb\x99\x32\xb2\x33\xd4\x5f\x94" - "\x35\xb3\x5f\xd8\x99\x3c\x8c\x89\x24\xb2\x33\x3e\x2c\xe3\x57\xec" - "\x4c\x1f\x2f\x5f\x46\xb6\x66\x60\x07\xa0\xfd\x34\x01\xd9\x18\x6e" - "\x4f\xbc\x63\xbd\x64\x4f\x90\x7e\xd3\xb4\xf6\x04\xf1\xd5\xe0\xbd" - "\x51\xb6\x53\xf6\xf8\x6d\xcc\x8b\xf6\xa4\x31\xab\xd8\x8d\xbc\xfe" - "\x04\xe2\xbd\x68\xb7\x8b\x8b\xca\x1c\xc5\x5e\x40\x3b\xd0\xce\xda" - "\xca\x00\xdb\x88\xf2\xeb\x43\x5b\x01\x80\x7a\x69\xf2\xa2\x8e\xa3" - "\x8c\xa7\xb5\x59\xff\x0c\x3e\xd4\xd5\x39\x3d\xbd\x8e\x25\xee\x14" - "\xe3\x9c\x2f\x98\x0b\xe9\xe3\x5c\x62\x2d\x43\xfb\x92\xe2\x3a\xd1" - "\xf3\x36\xcc\xee\x64\xfe\xd9\x79\x4e\x13\xea\x40\xda\x9c\x95\xf6" - "\xf8\x25\xcf\x1b\x51\xcf\x98\x1d\xed\xe2\xbf\xcf\xf9\xc2\x18\xbf" - "\xb8\x13\xc6\xcc\x5e\xc6\xfc\x3e\xd4\x33\xec\x6f\x23\xf6\xfb\x30" - "\xb6\xdd\x8e\x3a\xd7\x8e\x7a\x66\xf2\x6a\xf4\x0c\x75\xa6\x1e\xef" - "\x4d\x82\x7e\x9f\xb5\xa3\x9e\x1d\xf6\xf3\xf1\xac\x93\xc7\xa2\x58" - "\x4f\x3b\xcd\xdb\xa1\xae\x1d\xf6\x57\x08\x5d\xf3\x8b\x72\x4e\x3f" - "\xd1\x4f\x92\x75\x0d\x79\x81\xf9\x2e\xd4\x1d\xa4\x75\x18\x5d\xb3" - "\xaa\x74\xed\x79\x59\xd7\xa2\x84\xae\x21\x4f\x23\x7c\x2f\x08\x7d" - "\x23\xfc\x14\xaf\x0e\xea\x5b\xf4\x19\x3a\xf3\x46\x27\x64\x87\xeb" - "\x1c\x8e\x2b\x67\xb2\x51\xdf\xcc\xa8\x6f\x88\x8f\xb9\xc8\x6e\xa2" - "\x6c\xfe\x27\x8d\x75\x73\xad\xec\x3f\x97\xfa\x6e\x28\x43\x7d\xca" - "\x46\x5b\xf6\x29\xda\xd1\xff\x5c\xe2\x86\x46\xd4\x27\x13\xea\x51" - "\x1a\xea\x93\x19\xf5\x8a\xf4\xc9\xee\x7b\x81\x70\x7e\x6e\x1f\xc4" - "\xc1\xc7\xca\x60\x7d\xba\xd8\xbc\x69\x9f\xed\x07\x7a\x27\x7c\xc3" - "\xe7\x5f\xf1\xde\xe8\x84\xfe\x0c\xf9\x3e\xc9\x09\xff\x9f\x9e\xfb" - "\x32\xa8\x87\xd6\xad\x70\xcd\x59\xf8\x41\x3b\xca\x3c\xe0\x7d\x0c" - "\xde\x7f\x9c\x75\xc7\x3b\xcc\x5f\x95\x9a\x82\x75\xf7\x91\x2e\x32" - "\xdb\x64\xf2\xe5\xcc\x28\x8b\x06\xd6\x97\x12\xc3\xa2\xdd\x9b\xd9" - "\x40\x22\xcd\xcd\xc5\xe3\x73\x1c\xd2\x20\x19\x7f\x47\x1f\xf8\x1a" - "\x12\xf0\x4a\x3c\x60\xf3\x97\x91\xff\x84\xf7\x69\x6c\x63\x62\xf4" - "\xae\x0d\x90\x1a\xef\x16\x67\x9f\xc6\x6f\x33\xd2\x1c\x55\x02\xdd" - "\x33\xdb\xa7\x29\x0d\x5f\xcb\xe7\x9f\xc6\x62\x7d\xea\xf3\x4f\x6d" - "\x90\xd8\x60\x63\x87\x7d\x7d\x5c\x2f\xd3\x94\xb6\x50\xdb\xb0\x9d" - "\x37\x61\x3b\x3b\x1f\xdb\x64\x86\xf7\x8b\x43\xef\xab\xd8\x67\x9b" - "\x32\xd8\xff\x30\xf9\xc9\x0a\x4d\xc2\xe4\x67\x28\x74\x0a\xb7\xb6" - "\x93\xc6\x69\xdf\x06\xd6\x43\x7b\x74\xd3\xbc\x41\xa9\x97\x7d\x86" - "\x74\x2c\xdb\xea\x03\x43\x56\xb1\x87\x39\x7a\x98\xdd\x51\xfc\x05" - "\x34\xd0\xbe\xe1\x25\xcc\xef\x8f\x72\x2f\x66\x15\xee\xdc\xde\x0d" - "\xcc\x4b\xf3\x3e\x58\xc7\x41\x27\x2c\x6a\x14\xbc\xe8\x38\xcc\xe3" - "\x4d\x83\x3b\x17\x71\x8d\x22\x5c\x27\xb0\xbc\xaf\xc2\x8d\xf2\x3a" - "\xa5\xdd\xa9\x33\xf0\xb3\xbe\x50\x97\x0f\x5b\x37\xc3\x8d\x67\xe1" - "\x7e\x7e\xb6\x2b\x2b\x77\x5b\xc9\x26\x60\x9a\x11\xd3\x12\x10\x7f" - "\x51\x9f\xed\x7e\xf4\xb9\x7b\xf7\x08\x5f\xf6\xfe\x04\x05\xce\x09" - "\x53\xba\xb5\xeb\xd6\xe4\xaf\x24\xcb\x82\xf6\x79\xd3\x41\xf0\xae" - "\x75\xb4\x43\x9c\x39\x74\x76\xc0\xa6\x7f\x96\x46\xe7\x6d\x95\x6e" - "\x81\x24\xe4\x0f\xb5\xaf\x02\x63\x8e\x2e\x66\xbb\xdf\xf4\xd6\x66" - "\x0f\xc6\x14\xf7\xef\x71\xc2\x87\x61\xe9\xe9\xff\x9a\x75\x22\x0d" - "\xda\x77\x6f\x00\x20\xfa\x10\x3d\x51\x6f\xfc\x48\x87\xd3\x64\x93" - "\x1a\x36\x50\xdc\x7d\xff\x49\x85\x5e\xe1\x79\xe2\x2e\x10\xb1\xe9" - "\x03\x53\x98\x8d\x81\x7d\x0c\xbd\xc7\x78\xe0\x7e\x41\x83\xcf\xec" - "\xbd\x68\x47\x68\x4e\x99\xce\xc6\x5a\x97\xc8\x3c\x7d\xb6\x07\x52" - "\x9d\xf0\x70\xab\x3c\x5f\xe5\x76\x78\x67\x90\x6d\x09\x39\x6e\xf1" - "\x3d\x49\x07\xf1\xff\x30\xb7\x2d\x09\xed\x10\xd9\xa6\x18\xd8\xbe" - "\x55\xf0\xdf\x43\x78\xe9\x5b\x8f\x4e\xcc\x5f\xe7\x66\xdd\xac\x0a" - "\x8a\x29\x8e\xa0\xfd\x3d\x31\xed\x09\x94\x6b\x66\x2f\xa4\x36\xfd" - "\xf0\x09\xfb\x98\x7e\xe8\x2a\x86\x88\x86\xc1\x79\xa2\x1f\x66\xd0" - "\xbc\x90\x98\x0f\x7b\xa0\xc5\x09\x33\xf2\x95\x76\x91\x8f\x81\xb4" - "\x25\x3a\x1f\x26\x5f\x83\xde\x53\xac\x2b\x61\x1e\xf2\x39\x10\xd6" - "\xa5\xf4\x81\xfa\x27\xfa\xf5\x43\xbd\xba\x5f\xf4\xee\x3e\xbe\x44" - "\xd0\x60\xdd\x26\x30\xf0\xb3\x7a\x7c\xf4\x9e\x63\x06\xef\x0b\xf5" - "\x99\xf7\x85\xdb\x58\x1c\x23\xbc\xf7\xa2\x0c\xf1\xf4\x76\xc4\x85" - "\xf1\xcf\x74\xb1\xa7\x33\x3c\xd0\x12\xee\x1b\x16\x94\xcd\x32\x8c" - "\x55\xc7\x94\xfa\x59\x07\xe2\xfc\x44\xcc\xb1\xfd\xf0\x13\x3f\xf9" - "\xd9\x1e\x92\xdd\xfe\x02\x1a\x93\x1d\x25\x64\x6f\x39\xec\xd5\x08" - "\xdb\x89\x30\x27\x64\xd8\x13\xfc\x3c\x40\xf1\x3b\x92\x7e\x71\x1c" - "\xdb\x82\xed\xe8\xa4\x79\x5f\xa4\xb3\x59\x79\xc6\x18\x1f\xe3\xc4" - "\x1f\xd6\xb1\x8a\xfe\x82\xd0\x6d\x39\x53\x46\xe3\x99\xef\x6b\xd6" - "\x83\xf5\x5c\x47\x72\x54\xba\x09\xae\x47\x99\x3c\xbd\x75\x0b\x5c" - "\x43\x32\xc6\xa2\xdc\xc5\x82\xee\xe9\x68\xe3\xd0\xf7\x44\x8b\x6a" - "\xdd\x00\x37\xa2\x0e\x59\xcf\x42\xfa\x8c\xa5\x25\x26\x6c\x2b\xc0" - "\xee\x73\x40\x3e\xca\xa7\x08\x5f\xe4\xf0\x9e\x81\x86\x73\x24\x8b" - "\xe9\xf9\x8a\x2c\xe2\xbd\xf5\x62\xb6\x02\xc7\x19\x79\x8e\x22\xfd" - "\x13\x7a\x27\xd1\x01\xe9\xad\xd4\x5f\xb1\x06\x3a\xfd\x77\xec\x6b" - "\x96\xc4\xc4\x98\x86\x7c\x4c\x77\xe3\xd8\x02\xfc\x42\x5b\x22\x9e" - "\x3f\x73\x21\xdc\x41\xf6\xb5\x8f\xa7\x63\x9a\x9d\xd9\x74\xa4\x27" - "\x75\x58\x77\x8f\x13\x96\x1c\x15\xbc\x49\x3f\x4a\xb8\x42\xb7\xe1" - "\x33\x17\xe3\xfb\xdb\x7e\x89\xfd\x9d\xfa\x98\x69\x2b\xcd\x71\x4e" - "\xe5\xe7\x8c\x10\xae\x06\x49\xd8\x6c\x3f\xb6\xb5\xde\xe6\xb7\xa0" - "\x7d\xb6\xf8\x2b\x7d\x26\x7e\x2f\xe7\x31\x79\x1c\x0d\x89\xbf\x0a" - "\xb6\xd3\x9e\xdd\x9d\x30\x95\x9f\x33\xe3\x47\xb9\xb7\xdf\x70\x96" - "\x9e\xf9\xf9\x2c\x6e\x83\xdf\xe4\xa8\x35\x8b\xf3\x11\x11\x46\xc4" - "\xf1\x53\x7f\xdd\x8b\x75\xf4\xd9\xa6\x1e\x76\xc2\xcc\x46\xf1\x7e" - "\xc6\x6f\x0a\xfb\x7d\x14\xea\x00\xe9\x9c\xd0\xe9\x69\x2f\x9d\x68" - "\xe4\xfa\xe7\xec\x35\x74\x2a\xf6\x97\xe6\x73\x62\x3a\x60\xda\xf6" - "\x13\x89\x5c\xbe\x25\x26\x3d\x68\x0c\x3a\xc3\x0d\xf3\x86\x5e\x0f" - "\x66\xe0\x95\x83\x57\x9e\xfc\x5c\x80\x17\xf6\xf9\xc1\x76\x7c\x2e" - "\xe2\xb4\xdb\x9f\xaf\x73\x62\x5e\x2f\xfa\xec\xf4\xec\x84\x07\x67" - "\xb3\xfd\xc9\x92\x72\xdf\xb0\x8f\xe6\x09\x1e\x2c\x76\xc2\x54\x10" - "\xbc\x98\xc6\xd7\xee\xa0\x3e\x12\xdd\x59\x69\x2d\xf3\xb4\x6c\x75" - "\x63\xbb\x1f\x3c\xd8\x52\xeb\x06\xd3\x6d\xd4\xff\x07\x0f\x51\x9f" - "\x68\x0d\x0b\xfd\xae\xab\x65\xae\xe6\x3a\x2f\xd0\xbb\x3c\xc4\x85" - "\xfa\xdf\xc0\xd7\x09\xb1\x5d\x70\x98\xf0\xc9\x32\xc1\x94\xfe\x0b" - "\x7e\xf9\x4d\xa6\x0d\x3a\x7a\x1e\x55\xbf\x97\xcf\xc3\x9c\x62\xa5" - "\xb9\xf2\xda\x85\x69\x51\xa8\xe7\xd3\xe8\x7c\xc7\x73\x30\x6d\x0e" - "\x43\x5a\x37\x5b\xf8\x59\x51\x2e\x1c\x7f\x7a\xea\xf9\x7a\xa3\x69" - "\x68\xff\xa6\xf2\x3d\xa8\xab\x31\x9d\xdb\x1a\xc4\xb9\x0b\xf3\x70" - "\x3c\xea\x39\x61\xf1\x80\x8f\xfa\x8c\x65\xdf\xfe\xda\xa3\x8f\x2f" - "\x02\xdd\x56\x3a\x7b\x1d\xdb\xc1\x90\x57\xc2\x96\x3d\xe8\xdc\xf2" - "\x05\xf3\x28\x7d\x6e\x6e\x24\xfd\x98\xb6\xdd\x09\x3f\xfb\x38\xac" - "\x4e\x0c\xf6\xc3\xfc\x66\x73\xb2\xe0\xa3\x1f\x69\x15\xcc\x47\x73" - "\xa3\xe0\xe1\xb4\x8f\x83\x79\x68\xc6\x1a\xcc\x28\x09\xe6\xc9\x78" - "\x65\xc8\xcf\xea\xcb\xa0\xba\x47\xbe\x9a\xab\xfa\x6c\xe6\x04\xd4" - "\x8f\x12\xc1\x1b\x4a\x47\x79\x26\xb9\xb9\x80\x63\xcf\x40\x2e\xd0" - "\xfb\x5e\x4a\x27\x19\xa7\x74\x3f\xfa\x37\xf8\x4c\xe7\xc7\x1b\x49" - "\x7f\xe9\xdc\x2d\x75\xfe\xe0\xf9\x0a\x60\xe6\x67\x66\xc4\x6f\x2b" - "\x2f\x27\xd9\x45\x98\xd4\x78\x6f\x79\x39\xd6\xb7\x5d\xa1\x2b\xa6" - "\x15\x50\x3e\xc9\x29\xa6\xd7\x39\xe1\xe7\x09\xfc\x7d\x2e\xc6\x80" - "\xa1\x7d\x0f\xb3\x7d\xd0\x47\x33\x74\xe6\x11\x2f\x7b\xe0\xa1\xe3" - "\x68\xc7\xd0\x7e\xfb\xc4\xbe\xef\xf0\xd0\x09\x7a\x46\xfb\x79\x1a" - "\xef\x5b\x4f\xa0\x9d\xea\xaf\xbc\x90\x3b\x20\xc1\xc8\x7e\x09\xcc" - "\xde\x5d\xa9\xb3\xbd\xd1\x7f\xcd\x77\x74\x1f\x81\x36\xef\x6f\xc0" - "\xf4\x1c\xc7\xf1\x2e\x9d\xff\x56\xba\x89\xf9\x7e\xd5\x7f\x50\xef" - "\xf0\x9e\xb7\xf3\xb3\x4e\xe1\x21\x4e\x8f\x97\x3b\xd0\x0b\x58\xc2" - "\x71\x0b\xfa\xc4\xa4\xa6\xec\x5a\xc1\xbc\xbb\xba\x68\x4f\xf8\xc4" - "\xe8\xea\x7e\x48\x7d\x63\x33\xa4\xd5\xf5\x43\x72\x7d\x3f\xa4\xb0" - "\xcf\xe9\x6c\xfa\xc0\x79\xf6\x71\x56\x30\xd4\x6f\x46\x7f\xce\x0b" - "\x3a\x5f\x35\xfa\x73\x5e\xf4\xe7\xce\xa7\x90\xbd\x1c\xf4\xe7\x06" - "\xb8\xaf\xec\xee\xe4\x67\x84\x56\xb8\x3b\x63\x2d\xa0\x8b\xc9\x03" - "\x23\xb6\xaf\xf4\x1c\x3c\xa4\x8b\xe9\x44\x5f\x12\xfb\xec\x94\xfb" - "\x8b\xbf\x09\xf1\x16\x18\xc9\xfb\x8a\x36\x9c\x55\xf8\x12\xc3\x8e" - "\xcd\x12\xc9\x94\x9b\x74\x04\xfb\xf0\xf0\xf5\xf4\xce\xf9\xc8\x0d" - "\x1e\xfd\xba\x3a\xe6\xa1\xf4\xa2\xb1\xcc\x83\xe9\x7c\x2f\xff\xc3" - "\x98\xde\x67\x7b\x38\xc5\x29\x7d\x92\x1c\x4e\x46\x31\x66\x92\x6d" - "\xcd\xc3\x3f\x63\x52\x19\xca\x68\x67\xe3\x16\x2f\xfa\xe3\xe7\x48" - "\x8f\x1f\x3e\x98\x55\xc0\xbc\xa6\x35\xf4\xfe\xff\xe1\x5a\x5a\x9b" - "\x40\xef\x24\x7f\x89\xbe\xce\xa5\xd6\x23\xd0\x18\x42\xf1\x43\x7c" - "\x01\xe2\xac\xec\x6c\x64\x18\xb3\x5f\xae\x5f\x4f\xeb\xcf\xc4\xb7" - "\xa6\x0f\x77\x3a\x61\x0d\x5f\xf7\xc1\xbf\xcf\xe1\xf6\x74\x7a\x8b" - "\x1b\x69\x10\x6c\x03\xa6\xd7\xd2\xfe\xe4\xbd\xe5\x17\x3a\xed\x63" - "\xc8\xf6\x4f\x7f\x45\xf8\x42\x17\x9c\x62\x2c\x98\xfe\xbc\x78\x7f" - "\x30\x7d\xb2\x13\xe6\xf3\x31\xde\x3a\x8e\x64\x62\x7a\x01\x8b\xbe" - "\xf0\x19\xc1\x4d\x28\x83\xb2\xb5\x5e\xc8\x63\x15\x17\x9c\x8c\xeb" - "\xca\x39\x60\xaf\xaf\xea\xa3\x6f\x6e\xdc\xd7\x2d\xea\x43\xdf\xa0" - "\x05\xf3\x3a\xa9\x0e\x17\xc2\x20\xdd\xa3\xc4\xda\x85\xe9\xe5\x4e" - "\x98\x27\xdb\xc3\xe9\x8b\xc5\x1c\xf3\xf4\xc5\xbd\x58\x16\x7d\xc5" - "\xab\x31\x1f\xfd\xdf\x55\x31\xf2\x3b\x6e\xd7\x8b\xfc\x5b\xd1\xe9" - "\xc7\x9c\x50\xc0\xdf\x03\x16\x8d\x85\xc4\x22\x13\xeb\x0e\xeb\xeb" - "\x05\xf5\x73\xc6\x43\x7c\x1d\x9e\x04\xd7\xf5\xd9\x32\x40\xc1\x8b" - "\xe3\xed\xcf\x7b\xa5\xc7\x1e\xc3\xb4\x04\x05\x2f\xc2\x5c\x83\xcf" - "\xc9\x83\x30\xa2\xcc\x64\x55\x99\xc7\x7a\xa5\x3b\x7f\x8e\x69\x99" - "\x9a\x32\xb9\x9a\x32\x16\x55\x99\x32\xb9\x9e\x12\x4d\x99\x2a\x4d" - "\x99\xba\x10\x6d\x3b\xac\x29\x63\xd7\x94\x69\x0f\xd1\xb6\x4e\x4d" - "\x19\x77\x70\x99\x19\x7a\x15\x6d\x69\x3d\x51\x1a\xa6\x25\x06\x97" - "\x99\x91\xa2\x29\x33\x45\x79\x46\xdf\x33\x57\xf8\x06\x28\x4f\xc8" - "\x53\xe4\x6b\x27\xe6\x63\xff\x1f\x2b\xb8\x88\xff\x8d\xb1\xe1\x85" - "\x53\xa5\x07\xc4\x79\xb9\x64\x57\x69\xfd\x01\xd9\x73\x7a\x67\x42" - "\x32\x41\x7e\x27\xd5\xd5\x05\x33\x5f\x22\x19\x42\x9c\x87\x86\xd2" - "\x63\x86\x5d\xd3\xce\x76\x4d\x3b\x9d\x43\xe9\x31\xc3\x1d\x5c\x66" - "\xa6\x3e\xb8\xcc\xcc\x04\x55\x99\x46\x51\xcf\xcc\x14\x4d\x99\x29" - "\x9a\x32\x99\x43\xe5\x73\xe6\x62\x4d\x99\x02\x4d\x99\x92\x00\x0d" - "\x67\xf2\x6f\xc3\x49\x1f\x30\x1d\xe3\x9f\x05\xc7\x2e\x42\x3b\xa3" - "\x22\xcf\xca\xb7\xd3\x42\xae\x1f\xb9\x7e\x8f\xf8\x6e\x8e\x9f\x4d" - "\xd0\x09\x8f\x8c\x57\xde\x2d\xbf\xd5\xef\x89\xa4\x77\x9e\x48\xdb" - "\xee\xe6\x62\x0f\x8e\x2d\x33\x71\x0c\x9e\x93\xa6\xac\x2d\xa1\xf5" - "\x38\xfc\x6c\x1b\x1e\x8f\xcc\x3c\x29\xf4\xef\x11\xe5\x9d\x0e\xf5" - "\x07\xe3\x8c\x47\x52\xaf\xb0\x5d\x27\xa8\x5d\x74\xc6\x03\xe2\xb0" - "\x0e\xc6\x1a\x83\x6d\xa5\x3a\x1f\xf9\x8b\xd2\xd6\x06\xb1\x26\x88" - "\xd6\x0a\xbb\xe8\xdc\x0d\x2c\xd3\xa4\x8a\x4f\xa8\xad\xee\x23\x9b" - "\x3d\xfa\xe0\x36\x3f\xb2\x5d\x6e\xf3\x49\x61\xa3\x1e\x39\xa9\xd8" - "\x93\xb0\xf2\x57\x05\x96\xb6\x3a\x00\x5a\xf3\x70\xa2\x0e\xfd\x4d" - "\x8c\xb1\xa8\xdd\x1d\x90\x69\xe2\xfe\xef\x9a\x7e\xa0\x7b\x47\xc9" - "\x03\x7c\x4d\x84\xe8\x4b\x66\x2e\x9d\xaf\x4c\xbe\x4f\x8b\xf5\x4b" - "\x5a\x97\xc7\xf8\x59\x4b\x90\xf9\x52\x73\x89\x0b\xdb\x9a\x99\xad" - "\xac\x1f\x72\x42\xa6\xf0\xeb\xaa\x20\x8f\xd6\x6b\xd0\xda\xa6\x66" - "\xf7\x14\x82\x29\xc2\x76\x2a\x6b\xa7\x7b\xe8\xac\x66\x84\x4d\x0d" - "\x17\x2b\xa9\xe9\x2a\xda\xf0\xe8\x05\x21\x3f\x99\xc7\x82\xf5\x21" - "\x12\xe5\x34\xb3\x3d\x58\xe6\x32\x9d\xc1\x32\x97\xe9\x0a\xd6\x07" - "\x09\xf5\x61\x96\x3e\xb8\xcc\xac\x84\xe0\x32\xb3\x92\x55\x65\x6a" - "\x44\x3d\xb3\xa6\x68\xca\x64\x6a\xca\xa8\xed\x1f\xf6\x79\x96\x65" - "\x30\xee\xe4\xf6\x7e\x56\xb1\xea\x59\xda\xc3\xc7\xa9\x59\x55\x4a" - "\x9a\xfc\x5d\x32\x5f\x2b\x25\xe3\x3b\xa8\xb1\x51\x04\x7f\x4c\xd3" - "\x86\xe3\x9a\x36\x9c\x52\x9e\xe5\xf5\x15\xef\x21\xed\xc6\xca\x72" - "\xe6\x8e\xdf\x06\xf3\xe2\xbd\xf3\x9f\x20\xdf\x8c\xc6\x27\xbe\x86" - "\x6d\x0b\xfa\x94\x5f\x81\x91\xd6\x0e\x76\x15\x41\x04\x9d\xff\xe2" - "\x84\x1f\xe5\x60\x3c\xe7\xa4\x35\xee\xe8\x4f\x65\x75\xc1\xac\x1e" - "\xac\xbf\x16\xeb\x40\xda\x3d\x6a\x0e\x6e\xc3\xa3\xd9\xc1\x6d\x78" - "\x34\x4f\xf5\x6c\xc4\x67\xab\xaa\xdf\x46\xda\x27\xe2\x35\xee\x5b" - "\x3f\x5a\xae\xa4\xd3\x1c\x00\xf6\xb1\xbb\x94\xfb\x01\x66\x5a\x37" - "\x38\xba\x03\x1e\x5d\x4f\xf3\x05\x32\xce\x23\x6a\xda\x0a\x5a\x3c" - "\xda\xaa\x69\xc7\x49\x4d\x3b\xba\x03\xb6\x66\x56\x8f\xd0\x91\x47" - "\xf1\x7e\x61\x0a\xa5\x21\x2d\x4c\xf1\x5e\xd3\xd5\xf6\x71\xe4\xa7" - "\xfe\x68\x96\x1b\xfb\xcb\x76\x48\xa3\xe5\xe7\x39\x6c\x1c\xf9\xdd" - "\x6e\x27\xda\x67\xfa\x76\xf6\x66\x4c\xcb\x11\x7c\xfd\x11\xf6\x7f" - "\x81\x59\xe0\xfd\x11\x7f\xb7\x4f\xb0\x78\x6f\x62\xb1\x50\x1c\x4e" - "\x9e\x7b\xe3\xc0\xaa\xac\xb1\x45\x1c\xdb\x15\x7d\xf0\xef\x02\xab" - "\xbf\x62\xe0\x24\xa6\xd5\xa2\x4e\xd4\x88\xf7\xa8\x03\xc9\x28\xfb" - "\xb5\xc8\x3f\x8c\x81\x67\xbf\x24\xc7\x8c\xdb\x69\xed\x20\xed\x5f" - "\x81\x36\x33\x46\xac\xcd\xf8\xd1\x71\x95\x5e\xb9\x4d\x9b\xa7\xb1" - "\x0e\x98\xfd\x0a\xf9\x76\x64\x37\x68\x0d\x62\xb3\xd7\x05\x34\xcf" - "\xe2\xf0\x9e\xe5\x3e\x39\xe6\xd7\x88\xb2\xb3\x0d\xaa\xb2\x2e\x79" - "\x1e\xa4\x9b\xf2\x26\x7a\x41\xdf\xec\x76\xd1\x59\xba\x09\xc2\x8f" - "\x9f\xfd\x4a\x33\xda\x0b\x2c\x93\xae\x94\xa1\x39\x13\xfe\xde\xbf" - "\x08\xf4\x13\x4a\x40\x6f\xdf\xdc\xc1\x71\xcb\xef\x9c\x79\x7c\xe4" - "\x28\xe9\x06\x87\xfb\x24\xf9\x94\x7a\xb1\x6e\x6b\x76\x4d\x84\x07" - "\x0c\xbd\xd5\x80\x32\x32\xbb\xc6\x57\x0d\x16\x6c\x1b\xc6\xf1\x3f" - "\x3a\x42\x36\x50\x4d\xbb\x19\x33\xb2\xe7\x67\xcd\x19\xff\xf8\xfc" - "\x59\x39\x33\x1e\x30\xe5\xac\x5c\xbd\x3c\x7f\xfc\xda\xf5\x45\xa6" - "\x8d\x85\x2b\x8b\x56\xae\x79\x96\x1f\xff\x65\x5a\x56\x24\x7e\x53" - "\x0a\x96\xad\x2b\x9a\x4a\xb7\xa9\x26\x6b\xe1\xf2\x0d\xfc\xf6\x8e" - "\x68\x08\x46\xb2\xb2\x68\x79\xa1\xe9\xd6\xfc\x54\xd3\xcc\x65\x2b" - "\x0b\xe8\x2b\x86\x50\xb8\x1e\x30\x15\x2e\x2f\x5c\xbe\x2c\xdf\x34" - "\xd5\x94\x46\x98\xd5\xe8\x54\xfc\x4c\x53\xec\xd3\x3a\x1c\xcf\xd1" - "\x87\xee\x26\x3b\x45\xe3\x7a\x17\x64\xad\x27\x1f\x8e\x9f\xd7\x85" - "\x72\x88\x63\x82\xb3\xcf\x36\xa7\x68\xe8\x38\x3e\xa7\x3c\x58\x7e" - "\xe7\xd4\x06\xcb\xef\x9c\x83\x43\xc7\xf1\x39\x1a\xfd\x9f\xa3\xd1" - "\xff\x39\xa7\x86\x8e\xe3\x73\x5c\xc1\x65\xe6\x42\x70\x99\xb9\xc6" - "\x41\x3b\x83\x6d\x7d\x91\xdb\xa5\xb9\xc9\x9a\x32\x93\x35\x65\x32" - "\x34\xcf\x39\xaa\x67\xf4\x5d\xe7\xe6\xab\x7d\x03\x7c\x2e\x52\x74" - "\x3d\x60\xdf\xe6\x96\x2b\x30\x34\xf6\xd0\xb7\x2e\x32\x6c\xa3\x0a" - "\xb6\x5b\x86\x1d\xd4\x7f\xb2\x49\xb4\x76\x53\xf8\xe7\x59\xb7\xca" - "\xb6\xad\x73\x77\x60\x0c\xed\x44\x5e\xdc\x7c\x0e\xe6\xbe\xd2\x20" - "\x60\x5d\xb4\x9e\x97\xbd\xbe\xa8\xaf\x61\x34\x18\xa8\x2c\x9d\x57" - "\xc5\x6c\xb3\xeb\x68\xfd\x38\xa6\xc5\xe0\x85\x76\x2a\x2b\x51\x59" - "\x3b\xbf\x1d\x61\x9c\x90\xc5\x65\x99\xca\x6d\xe7\xeb\x0e\x79\x7d" - "\xaf\xd0\x37\x56\x74\x06\xdc\x6e\xb1\x87\x44\x27\x9d\xa3\x46\x75" - "\x23\x0e\x3d\x93\x66\x9f\x96\xcf\xc3\x32\xe2\x95\x80\x38\x0b\x14" - "\x9c\x88\x2f\x11\xc4\xb9\x7b\xb4\x8e\x4c\xf6\x7b\xb2\xaa\x14\xff" - "\x82\x62\x85\x50\xb6\x23\xf4\xda\x6c\x88\xdf\x6d\xf3\x9f\xb4\x6f" - "\xed\xa4\x36\x1d\x23\x3f\xd4\x91\xe8\x85\xb6\x3a\x2f\xc6\xaf\x60" - "\xe4\xf1\x54\xf1\x17\xe0\x68\xf4\x02\xcd\x0f\x2f\x2d\x86\xb2\x06" - "\xc9\x7f\x92\x0d\x96\xa3\x18\x2d\xcb\x4d\xed\xd9\x4e\xe9\x58\x1e" - "\x63\x09\x17\xad\xe1\x0e\x33\x1f\x11\x4f\x70\xf6\x71\x14\xef\x65" - "\xa7\xca\xbe\x6f\x79\x03\xe2\x0a\xb9\xbe\x58\x02\x47\x9f\x2d\x1b" - "\xc7\xbf\x8d\xed\x8a\xcd\x6e\xae\xe5\xb6\x4f\xc2\x74\xd4\xf7\xac" - "\xc3\xe1\xfc\x14\xd9\xbe\x5b\x69\x5d\x19\xc2\x1e\xba\x18\x2c\xb5" - "\xbb\x19\xfb\x8d\xba\xd8\xfd\xd6\xd6\xb4\x48\xd9\xbe\x1a\xb0\x5c" - "\xa7\x52\xee\x72\xfa\x47\xbe\x11\x8d\xc7\xa8\xab\x6e\x11\x2b\xce" - "\x7f\xe2\x35\xbe\x66\x79\x1e\xfa\x7f\xd9\x8a\x1e\x5c\x85\xcf\x68" - "\xff\xb2\xf9\x7c\x22\x5f\xd7\x83\xf1\xe4\x3a\x2b\xfa\x6c\x89\x6e" - "\xb4\x8d\xf3\x72\x95\x3c\x3e\x4f\x44\x79\x25\xcc\xd3\x9c\x48\xf3" - "\x1a\xf3\x8a\x06\xf3\xc4\x37\x04\xac\xb9\xd8\x4b\xe9\x55\x4a\xba" - "\x18\x5b\xe6\xd5\x69\x9e\x0f\x29\xcf\x78\x7f\x14\xef\x4d\x32\x7e" - "\x17\xda\x5c\x9d\xd8\x73\x61\xfe\xf5\xf5\x5c\x6f\xe6\x9d\x54\xf2" - "\xf9\x9c\xda\x9b\xf4\x6e\xcc\x0d\xfe\xe8\x0b\xdc\xd7\x25\x7b\xfd" - "\xab\x2f\x3d\x91\x18\x63\xe8\x18\x9d\x9d\x8a\x69\x84\x87\x74\x86" - "\x9f\x61\x8f\xcf\x1d\x30\x8f\xce\xa0\x75\x91\x8c\x6c\xf4\x42\x92" - "\xf5\x41\x9a\x7f\x9e\xcf\xe5\x96\xd2\x08\x2f\xe1\xa3\x31\x91\x70" - "\x13\xbe\x5d\xe4\xd3\xf2\xf5\x92\xf3\xa9\xff\x55\xe1\x78\x85\xf9" - "\xc5\x2a\x5a\x46\xe2\x73\x79\x70\x5f\xe7\xd7\x6a\x9e\x0f\x2a\xcf" - "\x34\xd7\x2b\x64\x6f\x7e\x9d\x9c\xd7\x72\xb1\xba\xc6\xf1\x6f\x64" - "\xe6\x77\x6b\xea\xf3\x04\xe3\x5f\x60\xd0\x3c\x27\x2a\xcf\x7b\xf8" - "\x3b\x86\x05\x29\x4a\x1d\xbb\xc5\x1a\xae\xee\xa6\xad\xae\xc8\x8b" - "\xed\x65\x82\x65\x16\xab\xea\x1c\x81\xcf\x05\x01\xfe\x2d\x28\x56" - "\xf0\xe1\xfd\x76\x15\x1c\xfa\x25\x0b\xf6\x28\x70\xe2\xfd\xc6\x82" - "\x26\x55\xb9\xc3\x97\xe8\xab\x46\x76\x73\x7c\x42\x76\x17\x74\x6b" - "\xda\xe2\x09\xe0\xcc\xd1\x07\xda\x92\x63\x54\xc1\xa1\x7e\xe6\x98" - "\xb4\xb2\xba\xae\x98\x64\x9c\xe4\x35\x27\x3d\x44\x9e\x47\xce\xcb" - "\x0d\x2d\xe3\x39\x56\x55\xba\x1c\x1f\xe5\xfc\x59\xf6\x13\xc8\x3e" - "\xbb\x7b\x4b\x73\x94\x73\x54\xb9\x4c\xd2\x3e\x62\x13\xc5\x99\xdd" - "\x28\xd7\x39\x87\xb5\x78\xc5\xf7\x37\x32\x8e\x00\xce\x32\xe1\xe3" - "\xe5\x38\x55\x7d\xeb\x71\xc2\x7c\xe5\x3d\x91\x4b\xcc\x0d\x2e\x38" - "\x15\x2e\xee\xe8\xb3\x3d\x96\x14\x4c\xb3\xc7\x52\x03\x34\x7b\x6c" - "\x4a\x00\xef\x63\x19\x2a\xb8\x7f\xc3\xe7\x1c\x15\x5c\xde\xa5\x64" - "\x53\xc8\xca\x63\xe5\x9a\xba\x6a\x55\x38\x9a\x54\x75\x1d\x56\xc1" - "\xa1\x9f\xf8\x98\x3d\x3c\x7f\x1e\x3b\x15\x9e\x3f\x8f\x79\x42\xf3" - "\x67\xa1\x31\x50\xef\xc2\xa4\x4b\xeb\xd5\x42\xb3\xaa\x3d\x0d\xf8" - "\x9c\x1d\xac\x47\x0b\xf3\x34\xcf\x83\xfc\x67\x68\x3b\x9a\x36\x9b" - "\x23\x29\xbd\x68\x2c\x18\x85\x9e\x2d\xac\x51\xe7\xff\xaa\x5f\xe4" - "\x53\x1b\xf9\x3b\x38\x7a\xbf\x29\xe0\x8e\x6a\xe1\x08\x46\x95\x7f" - "\x52\x69\x3b\x8e\xd7\x21\xcf\xfc\x54\xc6\x3f\x87\x9f\xc6\xbf\x85" - "\x6e\xf1\xde\xa6\x37\x89\xd9\xde\xc9\x0d\x37\x96\xf5\xd9\x1e\x4f" - "\xc3\x98\xa1\x5b\xd0\xe7\x71\x94\xff\x35\xdc\x37\x61\xe5\xbd\x49" - "\x28\x4f\xfd\x5d\xf0\xf8\x9f\xf1\x77\x00\x7f\x7f\x17\x3c\xbe\x3e" - "\x9e\xc3\x6c\xba\x05\x0d\x36\xed\xb8\xfb\x78\x01\xc6\x1e\xfd\xf1" - "\xde\xb2\xdc\x10\x79\xe5\xcc\x16\x31\x3f\x44\x7a\x23\xf2\xab\xdf" - "\x09\x8f\x7f\x4c\xed\x55\xa5\x1f\x65\xb6\xb8\x1c\x82\x77\x52\x7d" - "\x58\x26\x1c\xdf\x94\xef\xa0\x84\xec\xe5\xea\x35\xfd\xf8\xa6\x0b" - "\x72\xb7\x89\x7e\xe4\x7e\x12\x5c\x77\x6e\x52\xe8\x7e\xe4\x4e\xc6" - "\x7e\x7c\x13\xba\x1f\xb9\xfc\xdc\x5a\x26\x61\x5f\x86\xf8\x1d\xb9" - "\x05\xd8\x97\x6f\x38\xdd\x83\xd3\xb7\x2b\x71\x6a\xe9\x37\x18\xff" - "\x4b\xc0\xcb\x2e\x28\x09\xf0\x4d\x86\x3b\x14\x5f\x0b\xd9\x21\xea" - "\x6c\x61\xb6\x91\x0b\x9c\x90\xeb\x55\xc6\x2b\x39\xfd\x94\x68\x0b" - "\xd2\x49\x22\x3a\xe5\xf2\x7a\xc3\xf1\x5b\xd1\x4f\xf1\x9e\xe9\x09" - "\xd4\xff\xc7\x9d\xca\x98\x8e\xe3\xb9\x4b\xa1\x23\xe6\x65\x6a\xf2" - "\x3c\xaa\xbc\xfc\xa0\xbc\x2d\x83\xe9\x25\x4a\xfa\xe5\xf1\xe9\x89" - "\x43\x1a\x3e\x21\x7f\x9e\x9c\x1a\xdc\xef\x27\x8e\x89\xfe\x21\x8f" - "\x86\xd0\xfa\x89\x93\xc8\xa3\x81\xd0\x3c\x7a\xc2\x1d\x5a\xd6\x9e" - "\x8c\xe1\xf8\x46\x43\x08\x7c\x4f\xa6\x20\xef\x06\xb8\x0c\xca\x7c" - "\x1a\xca\x9f\x27\x67\x2b\xfc\xb9\xbc\x3e\x3e\x59\xa3\xe9\xa3\xaf" - "\x0b\x16\xc5\x8a\xbe\x2e\x7a\x4a\x83\xfb\x60\x68\x59\x7c\xd2\x8e" - "\xfd\xf4\x85\xee\xe7\x93\xa7\xc2\xcb\xe2\x93\xf4\xae\xce\x37\x54" - "\x16\x17\x19\x45\x19\x08\x51\x66\x51\x2a\xb3\x85\xaa\x67\x51\x06" - "\xf9\x45\x4e\x58\x54\x42\xef\xe9\x54\xe9\x8b\x83\xe5\x0f\xfb\x40" - "\xe5\x88\x7e\x5e\x11\xc7\x10\x1f\xba\x4c\x20\x5d\x4a\x26\xfb\x6c" - "\x8b\x8e\x69\x68\x75\xbe\x0b\x16\x4f\xed\x95\xa4\x99\x82\x5e\x4f" - "\xe9\x34\x6d\x3a\x19\x9a\x5e\x8b\x5c\x48\xaf\xf3\xa1\xe9\xb5\x38" - "\x26\x3c\xbd\x16\x13\xff\xcf\x0f\xa5\xd7\x62\xb3\x9a\x5e\x7e\x9b" - "\xe8\xdf\x2d\x89\x28\x1b\x03\x4b\x59\x83\xb0\xe5\xc6\x78\x94\x15" - "\x51\xa6\x87\xca\x14\xc5\x7b\x84\x9c\x98\x6e\x00\xc3\x39\x58\xbc" - "\x58\xd1\xff\xb8\x5a\x18\xc9\x06\x16\xd1\x1a\x6d\x3a\xcb\xd9\xe8" - "\x28\x3e\x6f\x77\x78\xd3\x80\xe6\x1b\x35\xf5\x1e\x0d\x6d\x0b\x16" - "\xb7\x23\x4d\x5f\x0d\x91\xde\x2d\xe6\x4c\x9f\x32\x05\xdb\x88\xa7" - "\x20\x98\x47\x8b\x78\x39\x18\xdc\xff\xf4\xe2\xd7\xc5\x79\xf6\x94" - "\x75\x28\xcf\x96\x8c\x92\xf9\x75\x21\xb8\x7d\x4f\x95\x87\xe6\xd7" - "\x53\x8d\xe1\xf9\xf5\xd4\xb1\xf0\xfc\x7a\x8a\x62\x9f\xf3\x4e\x58" - "\x62\x0c\x1e\x37\x9e\x72\x05\xf7\x17\xeb\xc5\x72\x4c\x1a\x71\x35" - "\x3d\x5f\x6e\xbf\x95\x8b\x6c\x1c\xf1\x8a\xbe\xff\xc7\xf6\x8f\xa5" - "\x36\x0e\x17\x47\x58\xdc\x48\xc3\x9a\xcd\x61\xcf\x07\x8f\x69\xc3" - "\xb8\x92\xd6\xe7\x99\xc6\xd0\x5c\xd9\x92\x33\x7e\x49\xf7\x00\xde" - "\x4b\x5d\x90\xf7\x6b\xbf\x14\x51\x46\x6b\xc9\xf8\xb7\x83\xfc\xfd" - "\xc4\x12\xaf\x9a\x17\xb4\xa6\x6c\x97\xd8\xcb\x91\xe6\x39\x3f\xed" - "\x82\xa5\x2f\x09\xbe\xe4\xbd\x12\x4c\xc7\xa5\xa6\xd0\x7c\x59\x3a" - "\x05\xf9\xf2\x69\x68\xbe\x2c\xcd\x09\xcf\x97\xa5\x56\xe4\xcb\xa7" - "\x43\xf5\x68\x69\xb9\xac\x47\x2f\x52\x19\xd3\x1a\xf2\x57\x97\x7e" - "\x43\x30\x78\x8f\x3a\xb2\xf4\x34\xe5\x8f\xef\x51\xf4\x88\x97\xa1" - "\xf8\x9f\xd7\x2f\xc3\x1c\x95\x71\xa8\xf1\x3a\xe3\x7b\x42\xe9\xc9" - "\x52\x7a\x9f\xaa\x9b\x60\x05\x03\xd2\x30\xf7\x00\xe1\x28\x04\x38" - "\x07\x79\x73\x08\x8e\xd2\xe9\x6c\xe5\x00\x7c\x5e\x8a\x02\xc7\xe7" - "\x45\x05\xac\x89\xf5\x59\x80\xe0\x82\x71\xe7\xc9\xfd\x1f\xc9\xc7" - "\x11\x82\x27\x38\x0d\x4c\xb1\xd0\xc7\xbc\x63\xc1\xfa\x98\x57\x13" - "\x2c\x9f\x4b\xe9\xfd\x44\xbc\x1f\xed\x1c\xca\x72\xa7\xcf\xa6\x7b" - "\xe0\xdb\xd1\xcd\x65\x31\x1a\xdd\x44\x19\x58\xf6\x0b\x21\x03\xcb" - "\xaa\x83\xdb\xba\x2c\x39\xb4\x0c\x2c\x4b\x0f\x2f\x03\xcb\x72\xc3" - "\xcb\xc0\xb2\x22\x92\x01\x27\x2c\x3b\x14\xac\x9b\xcb\xaa\x82\xfb" - "\x8e\xf5\x72\xdd\x84\x51\xc3\xd1\x4d\xf4\x85\xae\x0e\xa7\x87\xb2" - "\xff\xaf\x6b\xe8\x07\x18\x06\xcd\x0c\xa8\x57\xd8\xbe\xa7\xcd\xf4" - "\x0e\x09\x6d\xbc\x85\x68\x58\xcf\x63\xb4\xa7\x73\xd4\x74\xdc\x25" - "\x62\xad\x52\x84\xfd\x0b\xad\xd9\x13\xf4\x7c\xe6\xcd\xe0\xfe\x3f" - "\x5d\x14\x9a\x9e\x4f\x57\x21\x3d\x4b\x43\xd3\xf3\xe9\x83\xe1\xe9" - "\xf9\x74\x0b\x7d\xab\x3e\x54\xa7\x9e\x3e\x65\xda\xc0\x7d\x14\x5e" - "\xe6\x1c\x3c\x73\xef\xe5\x8d\x4f\xcf\x24\x04\x8f\x4f\x4f\x7b\x87" - "\x3f\x3e\x3d\x93\x1b\x7a\x7c\x7a\xc6\x1a\x7a\x7c\x7a\xa6\x5c\xe8" - "\xc3\x33\xf6\x60\x7d\x78\xa6\x31\x58\x26\x90\x76\xdf\xda\xf8\x94" - "\x6f\xd4\xe8\xc0\xee\x2e\xc8\x7f\x05\x7d\x0a\xd9\x16\x2e\x7f\x2c" - "\xb8\x8d\xf9\xa9\xa1\xf9\x96\x9f\x81\x7c\xdb\x1d\x9a\x6f\xf9\x79" - "\xe1\xf9\x96\x5f\x82\x7c\xdb\x3d\x94\x6f\xf9\x7b\x86\xef\x53\xe4" - "\xb7\x06\xf3\x2c\xff\xf0\xf0\x79\xb6\x3c\x26\x34\xcf\x96\x27\x87" - "\xe6\xd9\xf2\x74\xc1\xb3\xe5\x45\xc1\x3c\x5b\x9e\x13\xcc\x33\xa4" - "\xdb\xb7\xc6\xb3\xe5\x2d\x1a\x9e\xad\xed\x82\x15\x33\x90\x67\xed" - "\x82\x67\xcf\x46\x69\xda\xe8\x0c\xcd\xb3\xe5\x1e\xe4\xd9\xda\xd0" - "\x3c\x5b\x91\x10\x9e\x67\x2b\x68\x0f\x8d\xb5\x43\x79\xb6\x22\x73" - "\xf8\x3c\x5b\x51\x12\xcc\xb3\x15\xf9\xc3\xe7\xd9\x0a\x7b\x68\x9e" - "\xad\x38\x19\x9a\x67\x2b\x5c\x82\x67\xcf\xa6\x04\xf3\xec\x59\x43" - "\x30\xcf\x90\x6e\x7f\x27\xcf\x90\x3f\x26\xb1\x5e\xf7\xd9\x8a\x5e" - "\x3e\xa7\xfd\x6c\x99\x13\x2c\xf2\xf7\xec\x16\x2e\x3b\x32\x0f\x7f" - "\x85\x30\x45\x43\xc7\xee\x67\xeb\xe4\xb4\xc7\x87\xf2\xe1\xd9\xa3" - "\x38\xae\xf6\xb4\x94\xf0\x75\x5d\x82\x87\x44\x73\x84\x13\x73\x64" - "\xcf\x72\xfb\x8f\x3c\x66\xb4\xaf\x30\x8d\xc5\x08\xef\x26\x3c\xb4" - "\xaf\x4a\x30\x2e\x8b\x7e\x38\x7e\x59\xf8\x35\xe6\xbd\x26\xda\xfb" - "\xbf\x0b\x56\x5e\x2f\x64\xd5\xa2\xf5\x7f\x1b\xb0\xae\x2f\x84\x9c" - "\x3e\xa7\x99\x33\xb1\x84\xf1\x7f\x2d\xe4\xff\x36\x84\x96\x53\xcb" - "\x45\xfc\x5f\x0b\xd1\xa3\x41\x15\xaf\x8e\x46\x0f\x50\x13\xaf\x5a" - "\xbc\xf1\x6e\x21\x3b\xdc\x8f\xad\xe8\x35\xf5\xd9\x56\x26\x6b\xda" - "\x8c\xbc\x59\xf9\xa6\xdc\xe6\x7d\xc1\xe5\x57\xa6\x87\x6e\xf3\xca" - "\x1c\x6c\xf3\xaf\x42\xb7\x79\xa5\x35\x7c\x9b\x57\x56\x61\x9b\x7f" - "\x35\x54\xb7\x56\x36\xc9\x72\x10\x22\x2e\x5f\x69\x0f\xcd\xff\x95" - "\x1a\xfe\x43\x6e\x51\x09\x73\xf1\xf2\x41\x70\xcf\x81\x1a\x8e\xd6" - "\xea\x13\x2c\xc9\x48\x08\xd8\x54\x2d\xce\x30\x70\x39\x43\x64\x8f" - "\xbe\x2d\x08\x29\x7b\xcf\x95\x09\x7d\x7c\xee\x64\xb0\x3e\x3e\x57" - "\x1b\xac\x8f\x48\xeb\xe0\x72\x47\x83\xf3\x2d\xe5\xdf\x9e\x8d\x5d" - "\x95\xa2\x91\x81\x77\xba\x60\xd5\x4f\x85\x0c\xac\xf2\x05\xb7\x63" - "\x95\x39\xb4\x0c\xac\xca\xc5\xfe\xbf\x13\x5a\x06\x56\x15\x85\x97" - "\x81\x55\x35\x48\xcb\x77\xd4\x72\xbb\xa0\xc4\x3c\x52\x03\x73\x24" - "\xb4\xcd\x5b\x75\x3c\xf4\xbc\xce\xaa\x4e\x41\xe3\x82\xa4\x60\x1a" - "\xaf\xf2\x06\xd3\x70\x95\xf9\x5b\xa0\xe1\xe0\x59\x19\x7d\xb6\x02" - "\xad\xfe\x3b\xba\xa0\x40\xd6\xff\xd5\x67\x82\xdb\x58\x20\xc7\x3f" - "\xa1\xe6\xb2\x0a\x9a\x90\x96\x8e\xd0\xb4\x2c\xb0\x87\xee\x73\x01" - "\x8d\x41\x0e\xff\x10\x5d\x2a\x70\x61\xfa\x02\x7a\x77\x40\x73\x58" - "\xf5\x98\xbe\xc0\x0b\x06\x3e\x5e\x0d\x8e\x4b\xab\x13\x68\x8e\x9c" - "\xcf\x31\xa3\xfc\xc6\x27\x41\x36\x8d\x41\xd4\xae\xa5\x25\xda\x77" - "\xa2\xab\xcd\xd4\x6e\x5a\xc7\x42\xdf\xd5\xc4\x17\x43\xb6\xc3\xed" - "\x05\x45\xde\x09\x5e\x83\xdb\x4a\x7a\x41\xf0\x0a\xac\x98\xeb\x2c" - "\xd3\xd8\xa6\xd5\xb5\xa1\x79\xbc\xfa\x70\x78\xd9\x59\x7d\x5c\xf0" - "\x79\x0d\x04\xf3\x79\x75\xa7\xdf\x16\x97\x43\x7d\x45\x19\x18\x96" - "\x9e\xd0\xbb\xd3\xb0\xf6\xfe\xc5\x45\x27\xad\x5b\x61\xcc\x59\x58" - "\x63\xe1\xf5\x49\x0c\x7d\x0a\x1d\xb4\x70\x1b\xb0\xe6\x6d\xde\x4e" - "\x84\x59\xea\x05\x89\xbd\xb8\xea\x24\xe5\x35\xd8\x98\x87\xce\x8d" - "\x51\xce\x80\x41\x59\xb8\xba\x03\xd6\x6c\x0b\x2a\x8f\xa3\x91\x43" - "\xe0\x38\x26\xe6\xf7\xd7\x1c\x55\xe6\xe1\xc3\xcd\xef\x23\xcc\x29" - "\x65\xdd\xaf\x78\x17\xb6\xa6\x3d\xec\xb8\x8c\x6d\xa2\x6f\xc7\xa9" - "\x4d\x17\xb7\x03\x6b\xd3\x14\xf9\x15\xef\xe6\xd6\x9a\x03\xdf\xb6" - "\xac\x9d\x8d\x79\x43\xf6\xc9\x0c\xad\x07\x6b\x8b\xd5\x78\xc4\x79" - "\x31\x6b\xab\x94\xef\x53\xf0\xbe\xf6\x12\xb8\x94\xf6\xd8\x35\xed" - "\x69\xc7\x78\xc1\x2d\xe3\x38\x75\x09\x1c\x09\x8e\xa6\x07\x60\x82" - "\x1f\x22\xce\x42\xe1\x1d\x74\xfe\x8c\xa3\xae\x1b\x62\xbc\xa0\x17" - "\xb1\x9d\x75\x12\x7d\x1b\x42\xb1\xa1\xc3\x3b\xcd\x4e\xef\xe0\xf8" - "\x1a\x82\xc4\x69\xf6\x13\xc5\x3e\x79\x0f\x36\xeb\x43\x44\xd3\x13" - "\x96\xf3\xf6\xba\xbd\xac\xfb\x00\xdf\x7b\xcb\x1a\x14\xff\x55\xd1" - "\xfa\x1f\x5a\x87\xb1\x15\xa6\x21\xfc\x5f\x84\xae\x17\x6a\x7c\x52" - "\x6b\x98\xf8\xcf\x4a\xf1\xdf\xb4\xd0\x7a\x6e\xbd\x48\xfc\x67\xa5" - "\xf8\x6f\x9a\x7a\xdc\x14\xef\x79\xac\xa7\xd4\x3e\x29\xed\x8f\x65" - "\x5a\x41\x7e\xe6\xf3\xf3\xee\xda\x03\x46\x2f\xbd\xd3\x46\xdd\x74" - "\x74\xb7\x90\xbe\x1a\x4f\xb8\x8e\xd2\x3e\x0c\x86\x38\x2b\xc9\x22" - "\x8d\x65\xa4\xaf\xcf\x9b\xf8\x58\xe6\x15\xba\x58\x5a\xcc\x5c\xa9" - "\x9d\x28\x43\x6b\x2d\x0a\xae\x98\x2d\x16\xf1\xdd\x47\x5c\x27\x8c" - "\x74\x74\xf3\x71\x51\x47\xfe\x2a\xf7\x5b\xbd\x5f\x01\xe1\x6d\x2e" - "\x39\x01\x84\xd7\x3f\x38\x4e\x72\xdc\x25\xa4\xe3\x84\x93\x70\xb7" - "\x21\x1c\xe1\x25\x38\xa5\x1f\xe2\xdb\x98\xe7\x9b\xd4\x7d\xe7\xf3" - "\x2f\x58\x37\xa6\x9f\xa6\x79\x15\x07\x95\x2b\x5d\xc4\x26\x74\xd2" - "\x3b\xb3\xf3\x76\x56\xba\x8a\x4d\x28\xa4\x39\xb1\x42\x3a\xef\x59" - "\xf7\xab\xff\x74\x46\x16\x8d\x05\x83\x48\x7b\xbe\xa7\xc5\xe4\x01" - "\x27\x14\xa6\x05\xdb\x88\x42\x8d\xff\x6b\xe5\x71\x26\xfe\xea\x69" - "\x7d\xa2\xbc\x7e\x95\xec\x01\x73\x78\xfb\xb8\x7c\x5c\x6c\x4d\x05" - "\xbd\x93\xa6\x35\x51\x62\xff\xb7\xc2\x62\xcd\xdc\x9b\x6b\x17\x5f" - "\x57\xf3\x1f\x58\xef\xba\x48\x21\x23\x45\x91\xc1\x3c\x2d\xac\x2d" - "\xfd\x82\xde\x05\x89\xf1\x60\x89\x57\x6b\x1f\x0b\x8f\x2a\xbe\x9b" - "\x26\xbd\x5d\x19\x0f\x4c\x6b\x08\xef\x3a\xcd\x38\x53\xc8\xfd\x7f" - "\xdf\x90\x71\x61\x1d\xd9\xf5\x20\x99\x6c\xe3\x32\xb4\xce\x74\xc2" - "\x8d\x72\x53\x48\xf2\xbf\x6e\x1f\xc2\x6c\xa3\x6f\x0e\xf1\x79\xe4" - "\x39\x58\x97\xed\xb3\x81\xe1\x84\x8b\x7f\x53\x65\x44\x19\xe1\x72" - "\x4b\xe3\xc6\x44\xb1\x1e\xc9\xad\xa9\xa3\x40\xa1\x39\xc1\xb4\x15" - "\xfe\x07\x88\xf5\x14\x24\x0b\xeb\xcc\xb4\x36\x23\xae\x87\xef\xb5" - "\x65\x54\x64\xc8\xe1\x3d\x09\x6d\x5e\x6d\xcc\xb3\xee\x48\xe8\xbe" - "\xaf\xa3\xf1\xff\x55\x27\x14\x25\x07\xf3\x76\x1d\x1f\xff\x95\xf7" - "\x3a\xc8\x7b\x57\x70\xb9\x22\x7d\x30\xef\x0b\x6b\x29\x3f\xec\x1a" - "\x9f\xf2\xde\x64\x8c\x67\x96\xba\xf9\x7a\xaf\x22\xd4\xff\xc2\x9c" - "\x8b\xd9\x41\x66\xe8\x4d\xf6\x23\xac\xbc\x2e\x18\xed\x56\x51\x79" - "\xd0\x9c\xd1\xb5\x7c\xce\x68\x69\x17\xac\x97\xdf\xfd\xac\x3f\xa1" - "\x69\x5f\x53\x78\xdf\xa0\x88\xde\xff\x2c\x0d\x6d\x33\x8a\x4e\x85" - "\xf6\x0d\x8a\xdc\xb2\x5d\x58\xca\xa2\xb4\x72\xb0\x9e\xbe\xa7\xe3" - "\x65\x94\x18\x96\xe6\x42\xc3\xc7\xb0\xeb\xcd\x83\x31\x6c\x21\xd9" - "\x83\xf5\x29\x83\x31\xac\x2b\x54\x0c\xeb\x0c\xc1\xcf\xf5\xdb\x43" - "\xf3\x73\x7d\x5d\xe8\x18\x76\xfd\x11\x31\xce\xaf\xef\x0e\xe6\xf3" - "\xfa\xe3\x81\x77\xc2\x45\x4d\xdf\x9e\x3f\xbc\x61\xca\x50\x7f\x78" - "\xc3\x6f\x05\xaf\x36\x7c\x15\xdc\xb6\x0d\xd9\xa1\x6d\xfb\x06\x4b" - "\x78\x7f\x78\xc3\xf6\xf0\xb6\x7d\x43\xe3\x50\x7f\xd8\x34\x42\x03" - "\xd3\x32\xe8\x2b\x05\xf9\x66\x1b\x4e\x09\x3a\x6d\x24\x7f\x2e\x42" - "\x05\xef\x0e\x96\x77\x6c\x33\xe2\x43\xdb\x76\x96\x6c\x9a\x22\x33" - "\xe1\x68\x42\x7b\x2f\xdd\xb2\x07\xa2\x50\x07\xde\xe9\xb3\x6d\x1c" - "\x94\x7f\x5a\xc7\x47\xf5\x90\x8d\x0c\xbb\x9e\x4e\x52\xda\x47\xed" - "\xd8\x58\x72\xb1\xf7\xa5\x11\x89\x90\xfd\xda\x10\x7a\x6c\xe4\xfe" - "\x1f\xe1\xb8\x38\xcf\x36\xf6\x68\x74\xcc\x2d\xd6\xe1\x16\xff\x4e" - "\xf0\xad\x58\x13\xcb\x16\x1b\xf8\x37\x7d\x61\xed\x6d\x71\x4a\x68" - "\x19\x2d\x36\x0f\xda\xdb\x42\x8e\x77\x93\x26\x3f\x4f\xf0\xa0\xf8" - "\xa8\x3f\x4a\x3d\xd7\x5d\x5c\x1c\x6c\x93\x8a\xf3\x34\xe5\x34\xf1" - "\x5f\x31\x6f\xcf\xe5\x8d\x37\xc5\xdd\xe1\xc7\x9b\x4d\xeb\x45\xff" - "\x37\x6b\xde\x2f\x6f\x32\x5c\x7c\xbc\xd9\x14\xa6\xff\x9b\xcc\xc1" - "\xe3\xcd\x66\xcd\x3b\xfa\x4d\x79\xa1\xc7\x9b\x4d\xc5\x8a\x9d\x11" - "\x76\x63\xd3\x1f\x2f\xcf\xde\x6c\x3a\x1c\x6c\x6f\x36\xd5\x5e\xca" - "\xde\x34\x0f\xb1\x37\x9b\xdc\xf1\x75\xa1\xfa\xb2\x39\x26\xb4\xbd" - "\xd9\x9c\x2c\x78\xb8\xb9\x24\xd8\xde\x6c\x4e\x0f\xe6\xe1\x26\x0d" - "\x0f\x37\x6b\xde\x7f\x6f\x32\x5c\xa9\x4d\x8a\x88\x88\x90\x22\x74" - "\x92\x2e\x02\xb3\xb0\x7b\x30\x32\x42\x1f\x11\x89\xd7\x08\xf9\x77" - "\xa4\x14\x21\xe9\xf1\x8a\x94\x7f\x47\x68\x9e\x47\x52\x59\xbc\xf4" - "\xf2\x6f\xa4\xe6\x79\xc4\x25\xf2\x47\xca\xf5\x2a\xf5\xeb\x35\xcf" - "\x91\x97\xc8\x1f\xf1\x77\x96\x87\x21\xcf\xc1\xdf\x41\xce\x5a\xb3" - "\x61\x59\xc1\xca\x7c\xbe\xae\x7d\xb9\x69\xd9\x33\xcf\x2c\x5f\xb7" - "\xce\x54\xb4\xd6\xf4\xf0\x43\xf3\xef\x7e\xc0\x24\x96\xc7\x17\x4c" - "\xbd\x35\x3f\x1a\xe6\x6c\x2c\xa4\x8c\x39\x0b\x66\xe5\x9a\xb2\x1f" - "\x7e\x28\x38\x53\x41\xc3\x97\xc1\x5f\x0c\x8b\x4a\xf7\xcc\x15\xd7" - "\x02\x54\xed\xe5\x76\xa7\x93\xbe\x3d\x17\xf1\x44\xd9\x5f\x8e\xd3" - "\xf7\xcb\xfd\xa5\x8c\xbe\xab\xe8\x80\x92\x2d\xd4\x89\xf1\x8d\x65" - "\x60\x7d\x9a\xf6\x53\x29\xd9\xc7\x7e\xef\x02\xd3\xa3\x20\x75\xc0" - "\x4b\x7f\x6d\xc9\x44\x58\x7c\x76\x38\xbd\x60\x2a\x25\xdf\xb6\xac" - "\x02\xf3\x74\xec\x41\x3f\xa6\xb9\xe5\xef\xf3\x4b\xf7\xf1\xb4\xdf" - "\x97\x29\x70\xf1\x5d\xb0\x65\x2a\xfb\x3d\xe3\xcf\xb4\x67\x8d\x80" - "\xdb\x32\x8a\x49\x2f\xb4\x93\x5d\xa8\x1b\x0d\x7a\x5a\x97\xbd\x6f" - "\x34\x18\xf6\x5d\x4b\x7b\xee\x6e\xd1\x2b\xeb\xb2\x2b\xf0\xd9\x09" - "\x2f\x75\x53\xdd\x04\xeb\x97\x5e\xe8\x27\xf8\xfa\x60\xf8\xc9\x81" - "\x75\xdc\x5b\xf4\x12\xc2\x65\x9d\x86\xf8\x78\x1f\xbb\xe0\x89\xfe" - "\x6b\xee\x84\x4c\xf4\xd3\x90\x15\xc7\xbd\x65\x20\xbe\x8d\xda\xb2" - "\x65\x93\xef\xff\x27\xee\x7d\xe0\xa2\xae\xd2\xfd\xf1\xf3\x19\x46" - "\x1c\x08\x98\xd1\xc8\x26\xd3\x1c\x0b\x75\x2a\x4c\x2a\xfb\x7d\xdd" - "\xfd\x59\x91\xd9\xbd\x76\x5f\x96\xec\x5e\xbb\x5f\x76\xaf\x05\x16" - "\xb4\x58\xa6\xb3\x48\x8a\x86\x80\xa3\xb9\x68\xfc\xab\xa8\x48\x11" - "\xa8\xdc\x5d\xdd\xb5\xb2\x8d\x76\x69\xaf\xd5\x94\xd4\xa5\x42\x86" - "\x5a\xdb\xa5\xae\xd5\x48\x48\xc8\xa2\x4e\x32\xc0\x08\x33\x9f\xf3" - "\x7b\xde\xe7\x7c\x3e\x33\x03\x81\xad\xf7\xde\xd7\xeb\xe7\xeb\x85" - "\xf3\xf9\x9c\xcf\xf9\xfb\x9c\xe7\x3c\xe7\x79\x9e\xf3\x9c\xe7\xe1" - "\x01\xf8\x4c\xb8\xab\xb7\x88\x57\x3c\xc2\x8c\xb4\x9e\x15\x57\x2e" - "\xee\x52\x6c\xce\xaa\xcb\x66\x46\x1a\xff\xb4\x1e\x56\x58\x65\xbb" - "\x9b\xf8\xc6\xbb\x98\xf1\xa3\x7c\xdc\x77\xf5\x6d\x2a\xff\x94\x19" - "\x7f\x3f\x54\x6c\x18\xe2\x56\x56\x90\xc7\xbb\x39\xfc\x70\xfb\xb8" - "\x1f\xf6\xb6\x2d\x99\x41\xe4\x79\x68\xb0\xc8\xca\x5a\x89\x7d\xd9" - "\x7c\x8c\xfb\x4b\x3e\x95\xfe\x2a\x8e\xf4\xfa\x70\x7f\xd6\xb4\xf9" - "\x2e\x16\xd5\x95\xce\x0c\x47\x72\xaa\x99\x7b\x85\x8f\x15\x1c\xe3" - "\xdd\x2d\x99\x27\x58\x6b\xce\x41\x96\xd1\xce\x0c\x2d\x9d\x5f\x32" - "\xe1\x4b\xba\x3c\x39\xb5\xb0\x9f\x59\x37\xaf\x42\x5a\x3f\xdb\xb4" - "\x99\xc5\x6f\xfa\x0c\x72\x50\x3b\xb5\x73\x8a\xfd\xfc\x28\x53\xa8" - "\x3e\xc3\x63\x5f\x32\xeb\x63\x3f\xc3\x3d\xf3\x54\x56\x53\xc8\xac" - "\xbc\xc8\x1e\x37\x54\x64\xb7\x0c\x71\xfb\xe4\xc1\x22\x7b\x62\xab" - "\x83\xf2\x77\xbe\xc5\x12\xda\x59\xe2\xdb\x3d\xed\x86\xea\xb3\x6c" - "\x1a\xc6\xd4\x45\x63\xab\x39\x4b\xf9\xcb\x15\x97\x4a\x65\x23\xcb" - "\x04\xe2\x95\x76\x77\xba\x9f\xa9\x54\x57\xf5\x10\x9b\x56\x33\xc4" - "\xac\x6a\x99\xe2\x42\xb9\x5e\x56\xf4\xa4\xbb\x85\x11\xa6\xf0\xe0" - "\xf0\xce\xef\xd2\x89\x1e\x4e\x7c\xf5\xfe\x46\xa3\xbb\xa5\x97\x1d" - "\xf1\x0d\xb1\x56\xf6\x05\x73\xe7\x7f\xeb\xfa\xfd\xfd\x8d\x13\x88" - "\x9f\x54\x5c\x9b\x60\x03\x2f\x71\xa7\xe8\x08\xfc\xe7\x15\xb3\x8a" - "\x42\x16\xe7\xd8\xc4\x26\xf6\x50\xba\xa0\x3d\x25\x9d\x99\xee\xc0" - "\xb7\xae\x4d\xe2\x3e\xf8\xe3\xdd\x85\x47\x58\x54\xab\xaf\x1a\xf7" - "\x8e\x0d\xc1\x84\xe4\x54\xb7\xaf\x8d\xb9\x1d\x5f\xbb\xd4\xb8\x64" - "\x7b\xa9\xca\x4c\x2f\x0f\xb4\x19\xdc\xc6\x01\xe6\x4e\xf7\xb1\x77" - "\xa8\x6d\x5e\x9e\xbc\x94\x68\x56\x6a\xab\xcf\x0f\xff\x3b\x29\xbc" - "\xcf\x1a\x5b\x91\xcb\x92\x6b\xcf\xb2\xa4\x3d\x67\x99\x9d\x0f\xda" - "\x0d\xb8\xe3\x0d\x7f\x69\x7b\xe8\x37\x8e\x64\x30\x1a\xbb\xb8\xeb" - "\xcd\xe3\xb5\xbb\xde\xc3\x76\x56\x37\x14\xbe\xeb\x3d\xd4\x17\xbe" - "\xeb\x4d\x38\x65\xc2\x7d\x6f\x0f\x2b\xac\x31\xb7\xb0\x89\xb4\x4e" - "\x5c\xc0\xef\x8a\xd3\xcc\xb8\xf5\x34\x63\xd7\x15\x1b\x20\x67\x1a" - "\x69\x3d\x6c\x76\xd3\xdc\xe0\xb9\x83\x15\xcf\xa7\xdf\x38\xfa\x23" - "\x79\xae\x58\xf8\xaa\xe8\xd4\xf0\x98\xd2\x0c\x94\x36\x9d\x7e\xa3" - "\xe8\xf7\x92\xa2\x1a\xee\xe5\x25\xfd\x0b\x88\x57\x89\x05\x3e\xcb" - "\xfb\xe5\xfd\x0b\x06\x9d\xc5\x71\x1e\x76\x60\xb5\x8e\xd7\x92\xbe" - "\x6f\x36\xbd\xd3\x71\x0a\xfe\xde\xbd\xa2\x5f\xc3\x39\x0a\x7c\xbf" - "\x6b\xe9\xe8\xc3\xa3\x68\x97\xda\x4f\xa7\x5f\xb3\x94\x41\x8b\x7a" - "\xf5\xb2\x7d\xc3\x39\x68\xf3\x11\x4a\xe7\x7a\x3a\x8d\xdb\x88\x6f" - "\xaf\x77\x9c\x32\xc8\x3c\x76\x03\xd5\xe9\xd7\xea\xa7\xb5\x5f\x70" - "\x00\x6b\xbc\xcf\x60\xe6\x87\x33\xe7\xb3\x9a\x67\x79\xcb\x9e\x67" - "\x79\x93\x5c\x7b\xc5\x07\x3d\xec\x15\x71\xbf\x90\xf6\xf0\xa6\x52" - "\xfa\x76\x98\xa4\x71\xc0\xa5\x29\x0b\xf6\xa5\xc5\x6d\x1e\x76\x65" - "\x62\xe4\x18\xb8\x73\xd3\x41\xec\xa3\xaf\x14\x36\x93\x3c\xf9\xd8" - "\xc1\xd6\xce\x5e\xf6\xfb\xa1\xee\x09\x45\x1f\x32\x83\x3b\xd0\xc1" - "\xe6\x25\xca\x38\x39\x75\xcf\x72\xcf\xd3\x88\x1f\xfc\x2c\xef\x25" - "\x7c\x99\xde\xc3\xb6\x4c\xbf\x36\x91\x25\x7e\x4c\x5c\x89\xa4\x4f" - "\x5b\x6e\x8a\xa0\x4f\x6f\x1d\xf1\x34\x46\xd0\xa6\xc7\x1f\xf9\x3e" - "\x6d\xda\xb6\x4a\xd2\x26\x5a\xfb\x82\x16\x05\xb5\x7b\xe4\xdb\xee" - "\x19\x95\xae\xdd\x5f\xd9\xf6\xa3\x51\xe9\x7e\x2d\x7d\xd6\xa8\x74" - "\xaf\x4c\xdf\x9a\xad\xd3\xbe\x56\xf4\x63\x03\x68\xdf\xd6\x3b\x41" - "\xfb\x5a\x33\x35\xda\x27\xe8\xcf\xd6\xb9\xfc\x45\xa2\x45\xeb\x41" - "\x6f\xb6\x4e\x40\xff\xf9\xdb\x4c\xef\x7b\x4c\x17\x73\xbe\x8f\xb4" - "\xca\x2f\x98\x91\xfe\x34\xba\x57\x70\x29\xe8\x1e\x68\x1e\x68\xdf" - "\xee\x29\xbc\x7d\xf7\xb3\xfc\x68\x8d\xf0\x5b\xed\x0c\xd1\xbf\x27" - "\x28\xad\x94\xd2\x9e\xa0\xef\xa0\x83\x80\xc9\x91\xf4\x46\x26\xe2" - "\xda\x94\xf8\xf2\x55\x43\x0a\x2b\xa7\xf9\x86\xff\xab\x6d\x04\x5f" - "\xb3\xc2\x1c\xee\x3c\x9f\xb8\x87\x02\x5f\xe9\xad\x79\x9d\x58\x77" - "\x53\xb6\xaa\xd0\x53\x9c\x60\x85\x3e\xde\x83\xbb\x2a\xe8\x43\xc6" - "\xc6\x7f\x81\xaf\x6f\xa5\x29\x87\x31\xf8\x25\x00\xcd\xa6\xbe\x18" - "\x2b\xa9\x4f\xd2\xb7\xb0\xf3\x90\x87\x7d\xad\xe1\xeb\xe3\xb8\xab" - "\x46\x7b\x0a\x09\xe2\x4e\xa2\x8f\x34\x36\x73\xb0\x98\xc1\x37\x0b" - "\xe2\x6b\xe2\x77\xb7\x41\xcd\xa9\xd4\xfd\xb3\x38\x89\x36\x50\x1e" - "\x77\xbb\x9f\xa1\xcf\x1e\xe6\x5c\x7a\xa4\xa0\x91\xca\x6f\xf1\x02" - "\x36\xdc\x59\xa4\xd7\xa1\x88\x3a\x0c\x42\x77\x9b\x43\xf9\x3c\xa2" - "\x7c\xec\x77\xe9\x47\x56\x78\x19\xe8\xbe\xbb\x9b\xea\x28\xe8\x90" - "\x75\x50\x5d\x9c\xf6\x80\x11\xdf\xb4\xfa\xe3\x37\xf3\xef\xa8\xfe" - "\x43\x98\x2f\xf8\xe9\x82\x9d\x12\xc1\x25\x0e\xbe\x1a\x24\x1f\xea" - "\xbc\xa3\xee\x0b\xc6\x34\x5f\x63\x84\x6f\xce\xc5\xf0\xe5\x05\xff" - "\x62\xe7\xf3\x2d\x46\x30\x4a\xd2\xfd\x8b\xa9\x1b\xfe\x77\x7d\x8b" - "\x51\xdd\xd6\x5a\x03\xa7\x35\xe7\x5c\x0c\xff\x62\xd4\xff\xbd\xc0" - "\x43\x6d\x4c\x4b\x9e\xf9\x39\x60\xbe\xa5\x14\x69\x15\x4e\xde\xac" - "\xcf\x3f\xc6\x8b\xb1\xd0\x37\x87\xe4\x0f\x39\xad\xcb\x6d\x4b\xf0" - "\x9d\xd2\x56\x20\xff\x3c\xa2\x63\x6e\xda\xc3\x5e\xed\x08\x1a\x2a" - "\x36\x31\xa3\xa4\x69\x8f\xaf\x44\x79\x49\xd3\x1e\xb7\x86\x69\xda" - "\xe3\xf1\x92\xa6\x49\x18\x4b\x9a\xf6\xb8\x22\x69\xda\xb6\x73\xc2" - "\x9e\x88\x68\x1a\xbe\x81\xae\xe9\x34\x6d\xcf\x14\xde\x0c\xda\x31" - "\xe8\xdc\xd6\xad\xd3\xb6\x32\x4a\x03\xed\x40\x1f\x25\x9d\xda\x9a" - "\xca\xff\xcb\xce\xa4\xbd\x26\x9e\x73\xe0\x3f\xa3\x5b\x7b\xc6\x7e" - "\xf2\x33\x49\xe3\x1e\x5f\x18\xa6\x71\xdb\x5c\xe1\xb2\xa0\x71\x8f" - "\xff\x44\xd2\x38\x99\x5e\xf7\x73\xd0\xb8\xad\xa9\x80\x81\x56\xbf" - "\x01\xe7\x68\x5a\x7e\xc0\x71\x49\x24\x8d\x1b\xb9\xbe\x1e\xaf\xd2" - "\x69\x1c\x68\x1b\xbd\xef\xf5\xb0\x99\x42\x2f\x8c\x75\x56\x45\x30" - "\xd7\xd7\x1d\xe6\x00\x63\x46\xfc\x00\xc0\xed\xf6\x53\x6c\xa2\xe6" - "\xb7\x46\x1b\xf7\xe3\x1e\xfd\x8e\x26\xc1\xff\xfb\x3e\xcd\x58\xd8" - "\x2f\x19\xcd\xf5\x0c\xf8\x73\x74\x17\x77\x30\x77\x35\x2f\x6e\x0d" - "\x1c\x63\xea\xd6\x87\x8f\x63\x5e\x49\xde\xf8\x7f\xf1\x0b\xba\xd3" - "\xc3\xb6\xcf\xcc\xf0\x09\xfd\xfd\xf1\x0a\x03\x7d\xcb\x1f\xf1\xed" - "\x66\xb4\x01\xbd\x22\x3d\x9b\xc6\xd3\x23\x5c\x40\x5b\x65\xe7\x69" - "\x6b\xbf\x68\x8b\x78\x29\x92\x7b\x26\x9d\x66\xdb\xc5\x19\x9a\xf0" - "\xc9\x3c\x76\x5d\x9f\x6b\xdf\xa3\xc6\xf9\x7e\xee\xfc\xe5\x7f\x75" - "\xd9\xf9\xcb\xff\xea\x47\xa0\x41\xb8\x8f\x17\x74\x8e\xac\x27\x21" - "\xa0\xe7\xeb\x41\xbe\x95\xda\x39\xc8\xf1\xa2\x99\x42\x2e\xb3\xea" - "\x75\x02\xef\xca\x29\x9f\xf0\x5f\x4b\x34\x72\xf1\x46\x06\xdf\xc1" - "\x91\x65\xf7\x84\xe1\xfb\xab\xb4\xf3\xe8\x69\xe2\xdc\x24\x05\x22" - "\xbe\xfc\x61\xda\x05\x71\x97\xa6\x2a\x74\xf6\xf0\x2b\x1f\xd1\x4b" - "\x11\xbf\x55\xbb\xb7\xdb\x4b\xf4\x6d\x06\x7c\x6c\x82\xaf\xd4\xee" - "\x5a\x5c\x4a\x74\x79\x32\xfc\xb0\x40\x5f\x9d\x11\x4c\x33\x1c\x16" - "\xfe\xf7\x4b\x52\xf4\xb2\xe3\xe9\xf6\xd0\xae\xd6\xa6\xb8\x87\x44" - "\x65\xb2\xf4\x32\xa8\x1b\x77\x6f\x68\x3f\x9e\x21\xfc\x9b\x05\x7a" - "\x41\x03\x2f\x25\x1e\x74\xb2\x6c\x27\x93\x69\xed\x54\x7b\xd8\xf6" - "\xac\xf3\xdd\x73\x1a\x7f\x7c\x25\x47\x2f\x7c\x7c\x4c\x1b\xdf\x0e" - "\xcb\x0f\x8c\xef\x3c\xed\xee\x58\x7a\xe1\xed\x5a\xf4\x76\x4b\x2e" - "\x1c\xae\x3b\x0e\xfd\xe3\x70\x4d\xd1\xe0\xba\xc3\xfb\x03\x70\x1d" - "\xa3\x9d\x9d\x49\xff\x78\x3b\x36\xad\x9d\x9d\xe9\x63\xb5\xc3\xc4" - "\xbf\x71\xfd\xf5\x98\xf4\x18\x31\x5a\x5c\xe2\x18\xaa\xa7\xde\xc3" - "\x4a\x42\xb1\x87\x65\xbc\xa4\x9d\x0d\x1e\xb6\xa3\x6a\xe4\x3d\xae" - "\x9d\x9f\x64\xd4\x63\x5f\xe7\xaa\x87\xed\x3c\x0a\x5d\xdb\xe2\xcd" - "\xd2\x3f\xa0\x56\x86\xe8\xf9\x8e\x69\xe7\x3b\x4f\x13\xb1\x30\x34" - "\xdf\x1d\xb8\x9f\xca\xcb\x59\x7d\x5f\x51\x0e\x93\xb1\xa2\x9f\xb8" - "\x1e\xf7\x90\xe8\x79\x22\x3d\x4b\x3d\x14\xe2\x0b\x48\x9f\x14\xd1" - "\x94\xb6\x05\xf1\x27\xe4\xfd\xbd\x27\x96\x53\x1f\xf2\x85\xae\x49" - "\xf8\xd8\x17\xbe\x5d\x7c\x94\xcf\x80\xb2\xd2\xa7\xc7\x13\xf9\x7a" - "\x1e\x8f\x5e\x5f\xc8\xbf\xc5\x13\x77\xca\xbd\xe5\x89\x25\x7d\xe3" - "\xc4\x31\x82\x9f\xb3\xbd\x85\x29\x23\xee\x1f\xde\x91\x9b\xbb\x36" - "\xf7\xc7\xb6\x75\x8f\xdc\x3f\x77\x5d\xde\xca\xbc\x47\xd7\x89\x8b" - "\xea\xb1\x8c\x12\x6c\x79\xab\x1e\xc9\x5e\xfb\x68\x9e\x7d\xc3\xca" - "\x55\xf2\x62\xfb\xd5\x94\x31\x32\x13\x1b\x19\x37\x92\x68\x10\xfc" - "\x1b\xc2\x07\x85\x88\x1d\x09\x5f\x24\xfa\xbd\xdd\x26\xab\x88\xb1" - "\x45\x34\xab\x74\xa1\x87\xad\xed\xd6\xe7\x01\xfe\x11\x89\x6f\xb1" - "\xf6\xb0\xd2\x9f\x01\x77\x96\x11\x0b\x5a\x27\xfd\x4a\x08\xdf\x00" - "\xee\x3c\x4a\x68\x65\x26\xd7\x7a\xe8\x61\x4b\xdb\x54\xe7\x13\x2e" - "\xe1\xef\x71\x53\x0f\xde\xfb\x75\x3e\x01\xe7\x4a\xf2\x1c\x78\xc6" - "\xad\x1d\xac\x74\x16\xda\xc5\xba\xab\x7d\x4a\xc6\xea\xe6\xce\x27" - "\xda\x71\x57\x9b\xde\x4d\xd4\x07\x97\xce\x8b\x52\x7f\xe3\x78\x3c" - "\xdb\xe7\x61\xa5\xbe\xf7\x2c\x5e\xa6\xdd\xf5\x36\xd5\xca\x7b\xdd" - "\x46\xca\xdb\x1b\xca\xeb\xa4\xbc\x65\x6c\x1f\xed\x9b\x63\x9e\x65" - "\xf3\x58\x35\x55\x1d\x4e\x9f\x10\x39\x66\x92\xab\x69\xfe\xca\x7e" - "\x4d\x63\x4f\xd4\x71\x45\xce\x7d\x59\x99\xf4\xbd\xac\xa6\x52\x5a" - "\x34\xfd\xa6\xf7\xd1\x37\xf8\x40\xa0\x6f\x99\x38\x23\x6b\x2d\x38" - "\xe3\x3a\x6c\xed\xa0\x79\x2f\x73\x78\xd8\xfa\x69\xf2\xde\x1a\xe5" - "\xa7\x36\xdc\xc5\x43\xac\xc9\xc6\x5d\xd0\xd1\x79\x58\xd9\xa1\x26" - "\x9b\x8f\xf1\xa8\x7f\x3f\x8e\x72\xb4\xae\xac\x45\xf9\xe0\x45\x28" - "\x5d\xdc\xcf\x2b\x3b\xa8\xc3\x3c\xcf\xc6\x4f\x21\xcf\x78\x7a\x65" - "\xec\x97\x15\x62\x2f\x39\xcb\x60\x83\xd5\xc9\xca\x8e\x8e\xde\x2f" - "\x66\x65\xfd\xd8\x96\xb5\x32\xcf\xb6\x7a\xd5\x9a\x6c\x5b\xd6\xaa" - "\x2c\xdb\x9a\xb5\x79\xb6\x5f\xac\x85\x82\x07\x2a\x9d\x11\x38\xa1" - "\x62\x7c\x1b\xd2\x27\xe8\x67\xd8\x7d\x1b\x72\xa2\x25\x4e\x57\xcc" - "\xed\x1b\xcc\x99\x38\x12\x26\x15\x93\xe4\x5e\x59\x9e\x49\x7d\x37" - "\xca\xfb\x7f\x51\xdd\xf4\x4e\xe3\x2f\x6b\x1e\xb9\x76\x2b\xee\xd5" - "\xf2\x96\xea\x79\x05\x5e\x5c\xd9\x13\xfa\x56\xa1\xe1\x63\x9d\xbc" - "\xa7\x2c\xfc\xde\xd4\x09\x1b\xfe\x72\xd7\xb8\x65\xe0\xeb\x6b\x13" - "\x7b\xe0\x34\x2b\xdf\xcf\x9d\x65\x3e\x0d\x87\x4c\x6a\x89\x9a\xa6" - "\xe1\x0f\xe1\x44\x05\xfb\x3e\xfe\x54\xac\x00\xfe\xf0\xc1\x74\x93" - "\xb0\xf7\x08\xf8\x89\xce\xd1\x3b\xed\xcf\x1e\x56\x9e\x85\x71\xf8" - "\x36\xa4\x9b\x8a\x9e\x17\xfe\xf7\x4e\xe2\xec\x14\xf1\x69\x08\x57" - "\x62\x64\x1c\xcd\x8a\xe5\xfa\x1c\xe9\xf9\xc7\xc4\x31\x89\x2f\x23" - "\x71\x4c\xc2\xf3\x65\x81\x63\xc4\x1f\x50\x9f\x0c\xba\x9f\x3f\xec" - "\x21\xd4\xb7\xa6\xbc\xcd\x9c\x53\x1b\x8d\x11\x78\x70\x7a\x2c\x3c" - "\xa0\xb9\x7d\x60\xf5\xda\x07\x1e\xa6\x85\x9e\x9b\x9d\xf7\x40\x0e" - "\x7c\x5b\x80\x0e\x08\xc7\x19\xb3\xb2\x6c\x8f\xae\xcb\x7e\x20\x96" - "\x8d\x95\x2b\xf4\x31\x72\xfe\x2d\x2a\xe1\x6b\x5f\x5f\xfa\x04\xdc" - "\xb1\x90\x77\x2a\x9e\xdc\xdc\xb7\x8e\x64\x91\x11\xf3\xfe\xe4\x2f" - "\xdd\xd6\x14\xe2\xe9\x52\x84\xef\x38\xc0\x4c\xda\x09\x3c\xf9\x06" - "\xe0\xd0\x67\x50\x68\x3f\xa9\xcc\xd3\x71\x80\x9e\x8b\x69\x4c\x39" - "\x61\x1b\x8d\x27\x1b\xfa\x0c\x13\x8e\x81\xfe\x48\x7b\x90\x1e\xa2" - "\x03\xe6\xba\x0e\x56\x29\x6c\xc1\x6a\xc5\x7e\x54\xd9\xa0\x97\x29" - "\x0f\xdd\x73\x7e\x72\x9a\x8e\x27\x11\x65\x7e\x8d\x34\xe1\xeb\xc8" - "\x59\xd1\x86\x39\xe7\x72\xee\x8d\x7a\x3e\x82\x2b\xaf\x13\x74\xe4" - "\x49\xd3\x68\xda\xf0\x9e\x05\x67\xe2\xb2\x3f\x02\xff\x4c\xaa\x5d" - "\xf8\x4d\x21\x5e\xaf\x83\x3d\x79\x89\x66\x9f\x22\x74\x8a\xee\x7c" - "\xaa\xcb\x2f\xeb\xa2\xb6\x06\xf4\xb6\x78\x8c\x6a\xaf\x13\x78\xf6" - "\x64\x4e\x58\x67\xf8\x64\x22\x64\x65\xde\x97\x1e\xed\x61\x95\xcb" - "\x05\x6e\xd1\x73\xde\x65\xd2\x87\x1b\xf0\x0d\xe3\x04\x5e\x85\x71" - "\xea\xc9\x7d\xfa\x7c\x63\xcc\x54\x6e\x85\x4d\xf8\xf9\x7d\xd2\xa5" - "\xc3\x72\x3c\x5f\x33\x62\xdd\x9a\xa8\x2f\x83\x72\xed\x0a\x39\x4f" - "\xfa\x17\xc2\x3d\x97\x28\xea\x63\x5a\x17\x7b\xea\x13\xd8\xee\x9b" - "\xfd\x90\x9b\xd4\x34\xf8\x4e\x90\x7b\xd9\x53\x36\xc2\xe1\xc4\xf0" - "\xdd\xf4\xa7\x88\xff\xab\x4c\x94\x73\xf7\xd4\xc2\x88\xb5\xe7\xd5" - "\xec\x01\x26\x02\x46\xa0\x67\xee\xfc\x3b\xc4\x7a\x95\xf7\x7e\x9f" - "\xca\xd1\xcb\x09\x3f\x03\x84\x1b\xb0\x83\x3d\xcd\x9e\x2a\xc1\x1e" - "\x81\xfe\x79\xd8\x53\x26\xb4\x8f\xf1\x61\xcf\x16\x78\x63\x45\x0c" - "\x94\xa7\xf6\x8e\xea\x43\x83\x5e\x97\x56\x77\x93\xfe\x0e\xbf\x63" - "\x1e\x56\x95\x86\x38\x90\x87\x7d\x62\x0c\x17\x35\x91\x54\xd0\xe4" - "\x13\xf9\x7a\x75\x18\x52\x7a\x31\xbd\xd3\x5c\x94\x0a\x1f\x59\xbc" - "\x94\xed\x93\xb4\xa8\x0a\x31\x4c\x79\x91\x0d\x7e\x09\x17\x4a\x7a" - "\x23\x7c\xe9\x88\x6f\x31\xda\x9a\x8d\xc1\x1d\x21\x61\x17\xe3\x0b" - "\x08\xda\x20\x7d\x2f\xd0\x77\x5a\x23\x83\x88\xe9\x32\x9c\x13\x23" - "\xfb\xf6\x74\x66\xa8\x0d\xc4\xa7\x14\x67\x90\x4f\xa7\x49\x5f\x26" - "\x13\x49\xd6\x7b\xba\x58\x9f\xbf\x6d\xcf\x52\x1a\xe2\xa7\x1a\x98" - "\xa9\x49\xf8\x0a\x7b\xba\x46\xef\xaf\xf6\xcd\x20\xf0\x41\xc0\xe0" - "\xe9\xd0\xfa\xef\x13\xb1\x3e\x9f\x6e\xd6\xdb\x11\x79\x29\x1f\xf2" - "\x37\x25\x89\x6f\x9d\xa1\x7a\xa4\x0f\x15\x93\x88\xf7\x5c\x8f\x6f" - "\x55\x2c\x4c\xab\x9e\x12\xfe\x8a\x85\xdd\x1a\x8d\xc3\xfb\x58\x4e" - "\x8c\x98\x03\x1b\x43\x7c\x10\xc4\x11\x36\x48\x5c\xac\x9a\xaf\x97" - "\x89\x52\x00\xc7\xaa\xc5\x7a\xdb\x7a\x1d\xe8\xff\x79\x69\x9e\x1c" - "\x8b\x11\x6b\x44\x8b\xd9\x29\xe8\x85\xe4\xb5\xaa\x8e\x08\x1c\x14" - "\xe3\xac\xaa\x8f\x9c\x6b\xc9\xcb\x55\x35\x44\xe0\x03\xfa\x13\x9a" - "\x7f\x9a\x7b\x9f\xdc\x4b\xaa\xda\x23\xfa\x48\x73\x52\xd5\x1d\x9a" - "\x87\x9d\x62\x8e\x10\x03\x6a\xcc\x78\x8f\x62\xad\x50\x1e\x95\x8b" - "\x7e\x62\x3e\x48\x16\x5b\xc0\x9a\xc0\x13\xd2\x5a\x21\x98\x50\x1f" - "\x9f\x79\x04\x78\x35\xe8\x7c\x26\x75\x24\x6e\x3e\x93\x16\xd1\x5f" - "\x05\x74\x9d\xd2\xb2\xf4\x3c\x1e\xf6\x8c\xb8\xcb\xa4\xc3\x93\xbe" - "\x15\x87\xe6\xf1\x06\x91\xb7\x52\xef\xe7\x0f\xec\x19\x1a\xac\x9e" - "\xf9\x50\x6b\xa3\x59\x6f\x83\x9e\x49\xfe\xa9\x5a\x31\xba\x8e\xfb" - "\x37\xe6\x65\x4b\xe7\x46\xd8\xe4\x57\x3e\xf0\x70\x76\x56\xb2\x6d" - "\xe5\x83\x70\x83\xb4\x6e\x75\x76\xb6\x43\x1c\xe2\x8c\xe4\x03\x13" - "\x45\x7b\x04\x07\xe9\x73\xfa\xb9\x9f\x3c\x2d\xed\x57\xb0\x2e\xb0" - "\xde\xbd\x58\xef\x87\x0b\xce\x0a\xd9\xc6\x5d\x7c\x03\x73\xfb\x79" - "\x31\xf8\x7f\x41\xfb\x30\x7e\xab\x4f\xee\x03\x34\x9f\xd8\x23\x07" - "\x9d\xcf\x3a\x46\xc2\xeb\xd9\xe2\x91\x6b\xf9\xd9\xca\xb1\xe9\xc4" - "\xb3\xd7\x0b\x3a\x51\x22\xf1\x02\xf4\x09\xb6\xff\xa8\x97\xca\x34" - "\x8d\xaa\xf3\x68\x98\x46\x3d\xeb\xd1\x69\x94\xdc\x27\x9e\x33\xd2" - "\x1e\x54\xa9\xb5\x15\x08\xe3\xcd\x73\x05\x12\x6f\x9e\x23\xf9\xef" - "\xe5\x6d\xba\xac\x23\xf7\x8e\x67\x3c\xe0\x1f\x65\x7c\xed\xe7\x52" - "\xf4\xfa\xaa\x26\x63\xdf\x78\x2e\xf5\xfb\xfc\xc3\xb3\xbd\xe0\x1f" - "\x60\x97\x08\x58\x88\x78\xc2\x62\xdd\x3c\xb7\x3a\x82\xfe\x58\xe8" - "\xbd\x60\xac\xb9\xbe\x1f\xdb\xf1\x5c\x1c\xb7\xcd\x7d\x60\x4d\xde" - "\xcd\x70\x51\x95\x9d\xef\xc8\x7e\x20\x2f\x3b\x6b\xf4\x39\x9b\x5d" - "\xe7\xc5\x70\xc6\x5d\x45\xeb\xde\x1b\x03\x78\x3c\x47\xe3\x7f\x3e" - "\xa0\x8f\x41\xd0\x29\xe2\x1d\x35\x1a\x17\xd7\xc5\x9e\xff\x50\xc6" - "\x12\x7f\x2e\xa0\xe3\x09\xf2\xdd\x9e\xcf\xd5\x41\x67\x35\x8d\xff" - "\x59\x93\x26\x6f\x91\x4c\x5b\x6d\xd3\xdf\xc3\xe5\xab\xb3\xc5\xde" - "\xf7\xac\xb0\xe9\x23\x98\x56\x77\x46\xf0\x5b\x78\x3f\xa4\xbd\x0b" - "\x3f\x4c\x32\x2e\x7a\xf5\x46\x09\xdf\x6a\x9a\xff\x67\x34\x5a\xf1" - "\x7c\xb3\xac\x87\xb1\x97\x0a\xbd\x13\xea\x84\x7e\xbf\xba\x52\x6f" - "\x8f\xca\x1f\x8b\x6c\x13\xfb\xd6\xe8\xfa\x3c\xac\x5a\xdc\x0f\xd9" - "\x2a\x7c\xc8\x55\xb7\x8c\xd1\xd7\xb4\xc8\x7c\x94\x87\xe4\xdf\x67" - "\x6a\xf4\x31\xff\x6b\x3e\xd2\x9e\x37\x9e\x67\x8c\xbd\x72\x8c\xcf" - "\x17\x03\xb7\xd0\x3e\xf0\x5f\xeb\x43\x96\xe6\x97\x04\xbe\xf1\x3c" - "\xe8\xbf\xf0\x8f\x66\xc5\xba\x7e\x9e\xe4\xdf\x27\x5b\xf4\x71\x60" - "\x8c\x0d\x85\x5e\xa3\xee\x97\x4a\x96\x7f\xfe\xe6\x91\x7d\x7b\xbe" - "\x34\xa2\x4c\xb7\xeb\x4a\xe8\xee\x9f\x9f\xc5\x9d\xcf\x95\x00\x0f" - "\xe1\xaf\xaa\x2a\x84\x87\xcf\x37\x7e\x1f\xef\x9e\x4f\x02\xde\x45" - "\xe2\xd2\xaa\x1b\x1e\x20\x4c\x5a\x97\x9d\xf7\x63\xc1\xdd\x13\x63" - "\x07\xb7\x67\x2b\xf3\x56\xad\x5d\xb3\x2e\xd9\xb6\x2e\x6b\xa5\xb6" - "\xe8\x47\xac\x79\xa7\x90\xfd\x7d\xfa\x3a\x1b\x74\xee\x4a\x0a\xd3" - "\x96\x5d\x61\xfc\x87\x8d\xd6\x95\xd0\xcd\xee\xda\x28\xd7\xd3\xae" - "\xa5\x11\x6b\x57\x94\xc7\x1a\xad\x13\x3c\xdb\xae\xc8\xfd\xdf\x47" - "\x30\x8d\x39\xcd\x76\x5d\xa2\xc1\xd4\x27\x61\xbc\xeb\x5d\x31\x4e" - "\xe1\x8f\xeb\xf9\xa3\x18\xa7\xf0\xff\x22\xf8\xb3\x5d\xfb\xf4\xf1" - "\x86\xe5\x86\x5d\x2e\xc1\x47\x69\xfc\xda\x0f\xc9\xf5\x92\x3f\xdd" - "\xbd\x42\xd3\xbd\xb5\xeb\x32\x9e\xce\x5f\x53\x5f\xb2\x24\xaf\xba" - "\xfb\x92\x65\x05\x7c\x38\x23\x1f\x7e\xea\x30\x07\xbb\x6f\xd3\x79" - "\x4b\x61\xbf\xb7\x43\x4d\x19\x74\xee\x5e\x10\x49\x27\x78\xd4\xc3" - "\xed\x1a\x8f\x98\x22\x65\xd7\x8b\xfe\xd4\x41\x6d\xe1\xec\xe1\x3c" - "\x7d\xa3\x71\xed\x26\xfa\xf7\x6a\x03\xea\x01\x7f\xcd\xfb\xac\x5a" - "\xac\xca\x1a\x71\x86\x57\x4b\x75\x7b\x69\x6e\x29\x1f\xcd\xef\x2e" - "\x81\x1b\x2a\xe1\x28\x6c\x77\x7c\x3a\x8f\xc4\x76\x7f\x86\xbd\x88" - "\x9e\x09\x6f\x6b\xec\x12\xa7\x6a\xec\xde\x75\x76\xd6\xd7\x67\x35" - "\xf4\xad\x4b\x37\x42\x5f\x00\x58\xb8\x6b\xfc\x4c\xe2\xcf\x6e\x3f" - "\xd1\xbc\x7d\x91\xf5\x69\x75\x01\xa6\x46\xf4\x83\xaf\xb3\x1a\x80" - "\xdf\xc0\x57\xde\x67\x27\x3e\x61\xb7\x8b\xaf\xb3\x1b\xc6\xf1\xbd" - "\x75\xbe\x71\xc6\x21\xde\x23\x62\x80\x82\x5e\x49\xff\xfe\x7b\x1e" - "\x7f\x5a\xea\x06\xb4\x76\x6b\x76\x70\xc3\x0b\x62\x5f\x29\x17\xfb" - "\x0a\x67\xd2\x5f\x7a\xcd\x3e\x61\x47\xeb\x78\x41\xc4\x7c\xd5\xee" - "\x67\x7b\x9b\x1c\x01\x11\xab\xae\x28\x0f\x7c\x5a\x00\xe7\x46\xe2" - "\xfe\xf1\xe1\xbc\x00\xfb\x57\x3f\x70\xb2\xa6\x1d\xbe\xe2\x65\x2c" - "\xf0\x9a\x4e\xdd\x3f\x3c\x62\x48\x22\xfe\x29\x8d\x2b\x2a\x1c\xbf" - "\x74\xcf\x21\xe8\x6d\xa5\x3c\x6e\x65\xe5\xc4\xd3\xcb\x39\xd8\x33" - "\x17\xb1\xf8\xa4\xac\xd0\x41\xf3\x12\xf5\x2d\xe5\xbd\x43\xe0\x4f" - "\x88\x4e\xec\x79\x0b\xb6\xe9\x1e\xad\x8e\x41\xe7\x1e\xda\xff\x77" - "\xe7\xc8\xb6\xa8\xbe\x41\x7d\x3e\xf7\xcc\xfd\xbe\x7e\x23\x5c\x1f" - "\x95\x4f\xd6\xf8\x02\x26\x75\x5f\xef\xa1\xae\x1a\x5d\xf7\x15\xe6" - "\x7d\xf6\x1c\xd4\x75\x5f\xd2\xf7\x74\x4d\x1e\xda\x1f\x4f\x47\xc4" - "\x8b\x7e\x06\xbc\x37\x81\x87\x1b\x97\x9f\xa0\xfd\x1d\x7d\xd7\xf9" - "\x42\x39\x3f\xb5\x77\x82\x3f\x44\xcc\x55\x9d\x97\x94\x3c\x40\xed" - "\x72\xb9\x97\xd5\x2e\xd0\xf7\x32\x2a\xdb\xa0\xd1\x0a\x6d\x9f\xab" - "\x0d\xc9\xbf\x63\xdb\xe5\xd7\xe6\xe9\x30\xd2\x61\x2e\x61\x54\x7b" - "\xa4\x2f\xb6\xaf\x3a\x0c\xdb\xda\x23\x02\xd6\xa1\xef\x75\x13\x22" - "\x60\x8f\x77\xa3\xa4\x9b\xb5\xb4\xff\xd7\xcc\x97\x7b\x8a\x4c\xe3" - "\x09\xec\xf7\x22\x6e\xbb\x80\xc1\x2a\xa1\x9b\xf1\x16\xd9\xd1\x37" - "\xaf\x47\x49\xb1\x49\x5a\x56\x4b\xf9\xf7\xf4\xca\x72\xb5\xd5\xe8" - "\x4b\x64\x7f\xef\x59\xf3\xf0\x9a\xb5\x1b\xd6\x40\xa1\xf6\xe8\x3a" - "\xdb\x03\x6b\xb3\xb2\x63\xc7\xd0\x87\x58\x11\xd7\xda\x57\x15\xf2" - "\x3b\xf5\xa2\x09\x76\xf4\x32\x66\xc1\x8b\x31\xb6\xd9\xc0\xaf\xba" - "\x47\xa0\x2b\x10\xb1\x23\xe0\x63\x55\xea\x0d\xba\x51\x5e\xc2\xfa" - "\x85\xfe\xbe\x0d\x39\x1a\x8f\xf5\xc2\x6b\x80\xa3\x26\x73\x70\x1a" - "\xe3\x49\x7d\x1f\x42\xff\x04\x6f\x3e\x6c\x17\x74\x51\x1d\xce\x31" - "\x0a\x78\x0d\xdb\x69\xbf\xa9\x6b\xf6\x28\xd7\x05\xe4\xb8\xea\x8e" - "\xea\xf0\xc0\xf8\x07\x11\x6b\x93\xaf\x22\x1c\x7d\xd1\xa4\xd5\x05" - "\xfa\x89\xba\x6b\x74\x3b\x6e\xf8\x12\x75\xad\x87\x1f\xe1\xfa\xcf" - "\xd4\x32\xd0\x9b\x7a\xab\x4e\x97\xb0\x17\xa9\x54\xcf\xab\x03\xde" - "\x09\xb4\x6e\x6e\xa3\xb2\x53\x3a\xd8\x0b\x59\x32\xde\x40\xfd\xe2" - "\x91\xf1\x06\x5e\xb0\xd1\x5f\x96\xf6\xb7\x2d\xe2\xf9\x7c\x7f\x7a" - "\x99\xb4\x70\x5a\x7d\xfd\xa8\x3c\xdb\xa8\x4f\x07\x42\xfc\x8a\xf4" - "\x67\xaa\xf9\x3f\x46\xec\x8c\xfa\x93\xf0\x19\x1a\xc6\x8d\xfa\x78" - "\x8d\x07\xe9\x06\xec\xb0\xdf\x76\xb2\x17\xa4\x2f\x93\x72\xc2\x0d" - "\x9e\xce\x30\x26\x3e\xb8\x8a\x70\xe2\x05\x63\x18\x0f\x24\x8c\x28" - "\xcd\x1a\xe6\x53\xea\x7b\x51\x26\x12\x0e\xd4\xc6\x6d\x52\x36\x7d" - "\x21\x55\xdf\xb3\xe1\x2f\x55\xc6\x9f\xa8\x3f\xd0\x50\xd8\x4d\x32" - "\xff\x0b\x2b\x22\xea\x38\xa0\xe9\x22\x8c\xdc\x50\x67\xa9\x13\x32" - "\xdb\x0b\x05\x61\x9d\x40\xfd\x01\xd0\x5d\x51\x47\x02\x3b\xe8\xf6" - "\x89\x98\xd1\x8a\x1e\x23\x9e\xf2\xee\xd3\x79\x14\xbd\xae\x26\xa9" - "\x73\x12\x3e\x2e\x69\x0d\x56\x52\x9e\x96\x90\x3e\x96\xd2\x42\x32" - "\x60\x3e\xad\x63\xc1\x7b\xbf\xd0\x1b\x96\xf5\xea\x84\x5f\x01\x21" - "\x07\xca\x7a\x4c\x1e\xf6\x82\x67\xb4\xdc\x46\xfc\x83\x6d\xd5\x9a" - "\x55\xc4\x3e\xfc\xc2\xb1\xf6\x66\x12\x1d\x7e\xe1\x58\x75\x33\x4c" - "\xbe\xee\x5a\x7c\xa7\xf8\xa5\xc5\x71\xf3\x18\xfa\x63\xe8\xbd\x45" - "\x5c\x66\xe8\x8c\x48\xce\x85\xee\x74\x50\xc6\x4a\x9d\xa8\xfd\x9a" - "\xb4\xdf\x68\xda\xf7\xd2\x69\xad\x94\x21\xf6\x0d\xc1\xbf\x5e\x75" - "\xca\x38\xaf\xda\x9e\x4d\xb4\xfc\xc5\xc7\xf5\xf3\x32\x61\x03\x0f" - "\x3f\x86\x7d\x39\x42\x1f\x37\xe8\x7c\x31\xa4\xff\x90\xfa\x45\x79" - "\xe6\x46\xe9\xed\x7a\xba\xae\x8f\xa5\xb4\x5e\x5d\xf7\x2a\xf3\xbe" - "\x18\x08\x97\x1d\xa1\xdb\x4e\xd4\xcf\xe3\x06\x9d\x2f\xd9\x74\x98" - "\xe9\xf5\x14\xd9\xf8\x69\x8d\x4f\x8a\x12\x7c\xb5\xf3\xc5\x44\xe1" - "\x3b\x14\xbc\xb8\xd0\x33\xbf\xb4\x5c\x6f\x07\x32\x02\xfa\xad\x9d" - "\xfd\x88\x75\x0f\x1f\xa1\xd2\xc7\xe8\x4b\xa1\xf9\x1f\x05\x73\xfb" - "\x8d\x57\x0b\xbd\xbc\x7d\x1d\xf1\x67\x57\x8f\xd2\xc3\x01\x87\xe6" - "\x55\xb1\x18\xa1\x63\x92\x72\xfa\x04\xf0\x08\x34\x86\x17\x68\x3e" - "\xa3\x40\xcb\xe5\xbe\xf7\xd2\xb1\xd0\x1e\x1f\xc7\xf6\xf1\xd8\xbe" - "\x2a\xf8\x99\x97\xf7\x16\x5e\x3a\x07\x7c\xf3\x5e\xfa\xf0\x20\x87" - "\x8d\xf2\x73\xff\x3e\x28\xf5\xf0\x7b\x6f\x0a\xeb\xcc\x5e\x2a\xd1" - "\x7c\xa2\xc2\xfe\x8d\xe6\x6b\x6f\x72\x88\xe7\xa4\xfc\x82\xf7\xa2" - "\x3a\x71\x47\x01\xed\x5f\xc0\x39\x8f\x91\x97\xce\x5e\x22\xd7\xe9" - "\x5e\x97\xa8\x83\x68\xb5\xbc\x07\xb0\x97\xf8\xff\x97\x6a\xe4\xde" - "\x80\xba\xd3\x59\x5f\xc2\xec\x94\x3e\xe7\x47\xc9\x80\xa1\x2f\xe1" - "\x16\x87\xf4\x41\xbc\xf7\x5d\x9f\xd3\x48\x73\xba\x97\xe6\xff\xf7" - "\xdf\x93\x75\xf5\xb6\x86\xd7\xf3\xa6\xc0\x00\x6f\x2c\xff\x82\xe8" - "\xdc\x83\x8c\x05\xd6\xf3\x83\xc3\x03\xbc\x41\xc4\x20\xbf\x9f\xb1" - "\xb2\xaf\x18\x0b\x46\xfd\xfb\xc9\x21\xc2\xd5\xbb\xfb\xd5\xd3\x88" - "\x17\x58\x47\xf9\xee\xf6\x9d\xe1\xb5\x54\xe6\x6e\x07\x3f\x5d\x4b" - "\xf9\xee\x3a\x75\x9a\xef\xa1\xbc\x77\xe5\x10\xae\xac\xe7\x81\x60" - "\xd4\xc3\x27\x6d\xff\x06\xda\xfd\xeb\xc5\xde\x1d\x43\x7b\xb9\xd3" - "\x50\xc1\xb7\x5e\x7b\xcd\xa0\xf3\xd7\x69\xa1\x38\x65\x54\x2f\xf0" - "\x6a\x59\x3e\x9e\x1f\x3e\x49\x78\x70\x32\x83\xf8\x0e\xc2\xdb\x93" - "\x94\x0f\xe7\x3f\x02\x96\xde\xa8\x6b\x26\xd3\x9f\x7d\xcc\xfe\x0f" - "\xf0\xa6\xe0\x7a\xde\x58\x71\x1f\xf5\xbf\x87\xfa\x3f\xc0\x0f\xd2" - "\x18\x1a\xca\xbb\x18\x43\xff\x83\xa8\x33\xc8\xa2\x32\x36\x2a\x93" - "\xea\xe8\x7b\x46\xbe\x85\xd5\x51\xde\xfb\x7c\x6c\x52\x2d\xe5\xb9" - "\xef\x97\x93\x98\xe8\x7f\x2f\xf5\x3b\x66\x68\x6f\x90\xda\x46\xff" - "\xa9\x7d\xbf\xde\x4f\xbd\x7d\xf4\x57\x5f\xb7\x19\xd0\x11\xc6\xf6" - "\x1d\x43\xbf\xe5\xb9\xc7\x6f\x56\x7a\xd7\xd1\x3c\x47\x5d\x7b\x8d" - "\x94\xb1\x7f\xb3\x40\xef\xff\xc8\x73\xb0\xdf\x14\x4b\xfa\xf9\x1b" - "\x92\x7f\xf6\x6a\x31\x5d\x64\x1a\xc6\xef\xa5\x75\xab\xdd\xfd\x3b" - "\xa9\xc3\x8c\xbe\x27\x8f\x3e\xe7\x4a\x5b\x9b\x2b\x74\xd4\x2b\x1f" - "\xc8\x5b\xb5\x7e\x25\x49\xbe\xb1\xcc\x81\x24\x21\x1b\x67\x67\xd9" - "\xd6\xae\xb1\x3d\xb8\x72\xd5\xea\xb5\xeb\xb3\x73\x93\x85\x3a\x63" - "\x5d\xf6\x9a\x2c\xa8\xae\x73\x57\xe6\x3a\x62\x47\xc9\x33\x25\x43" - "\x7b\x5b\x11\x83\xa6\x10\xf8\xbd\xff\x43\x4d\x6f\xeb\xe7\xce\x54" - "\x21\x17\x4b\x1a\xf3\xdb\x9b\x6c\x9b\x52\xf1\xfd\x2d\xb9\x8f\xef" - "\x6f\xe6\x3b\xfb\xbe\xe4\x5c\xc4\xd6\x56\x4e\xb3\xfd\x6f\x08\x78" - "\xf4\x2d\xd1\xeb\x11\xb2\x2b\x70\xd6\xb1\x09\x7c\xd8\x6f\x57\x70" - "\x7c\x1f\x01\x8b\xfd\x65\xd2\x56\x88\xd2\x87\x97\xb0\xb0\xbd\xfd" - "\xfe\x0f\xb9\x81\xc6\x4e\xb0\xd4\x64\x86\x4c\xed\xde\xe3\x7f\x76" - "\xb0\xfd\x90\xa5\x70\x6e\xd3\x26\x78\x72\x71\x3f\x6b\xff\x2a\x92" - "\x39\x32\xb9\x33\x3a\x0e\xf0\x2a\x97\x32\xbd\xc1\xac\x20\x76\x6e" - "\x07\xee\x8a\xa6\xe0\x7c\xb7\xce\xa9\xa6\x84\xed\x9b\x7e\x53\x0a" - "\xf9\x42\x9c\x73\x08\x9a\xf4\xdb\x6e\x7d\xed\x1a\x70\xff\x66\xeb" - "\xd4\x1f\xcb\xf5\xf7\xdb\x53\xc8\x4f\xf3\xff\x63\x39\x3e\x11\x07" - "\x9c\x78\x83\xfd\x13\x68\xfc\x5f\xf1\xa2\x25\xda\x99\xe4\xfe\x09" - "\x6a\xc2\x22\x47\x70\x1d\xc9\x05\x71\x8b\xbc\xf4\x6d\x40\xdd\xd9" - "\xd7\x15\x24\x9e\x4a\x25\x39\x81\x97\x2f\xea\x0b\xee\xec\xf3\xa8" - "\x1b\xec\x06\xec\xad\x45\xf9\x04\xdf\xb5\x39\xb1\xfc\x4c\xce\x45" - "\xc1\x0d\x76\xe2\xbf\xfa\xba\x39\xa7\xb2\xb1\x7d\x7e\x11\xaf\x78" - "\x67\x5f\x8f\xf6\x3e\x84\x77\x95\xf8\x64\xbe\xd3\x47\xef\x3e\x83" - "\xca\x23\xf2\x8f\xc8\xeb\x33\xe2\xdd\xac\x08\xbb\xca\x14\x92\x4b" - "\x16\x62\xec\xfa\x98\x85\x7c\x06\x1d\x51\x68\x6c\xfb\x99\x9e\x0e" - "\xb9\x41\xf2\xf0\xec\x01\x82\xb1\xf4\x65\x11\xca\xb7\xef\x73\x1d" - "\x06\x32\x3e\x77\x1f\xd1\xcd\xfd\xcd\x2a\x62\xa3\x6f\xbd\xfc\x1a" - "\x6e\xf8\x4d\x1d\x68\xd6\xb2\xa0\xa0\x85\x4c\x9e\x3b\xed\x5f\xa0" - "\xc3\x13\xf7\x08\x40\x4b\x69\xde\xec\x19\x5e\x16\x2b\xe9\xc0\xfe" - "\xf4\x08\xf9\xb0\x17\x73\xed\x61\xfb\x34\x3f\x5b\xa6\xad\xf2\xfd" - "\xb7\xfb\xe4\x5a\xd9\xbf\x4d\xcf\x4b\x69\xd2\xdf\x4f\x89\xef\xd0" - "\x86\x00\x9b\xea\xb8\x85\x77\xd1\x1c\xa5\x6b\xf9\x0e\x84\xd7\x94" - "\xc4\x37\xfa\x5d\x00\xf9\x1a\xe7\x8f\x78\xae\x1d\xe7\x2e\x6c\x61" - "\x0d\xe7\xd8\xaf\xb0\x7f\xda\xa6\x32\xd6\xea\x83\x6c\xf5\x3b\xd3" - "\xe1\x1a\x1f\x13\xf3\x1c\xdb\xf7\x65\x1f\xcf\x61\xc4\x53\x8e\x29" - "\x4b\xa0\x0c\xe5\x5f\x2c\xe4\x24\x5a\x17\x2a\xad\x0b\x2a\xf3\x15" - "\xf0\xba\xb0\x1f\xf2\xcb\xef\xb6\x35\x15\x74\xc3\x57\x3f\xe1\xeb" - "\xef\xb6\x01\x86\x58\x07\xe5\x4e\x71\x0f\x52\xec\x93\xae\xf5\xf3" - "\x51\xc7\x2f\x13\xfc\xcc\xd8\x4a\x3b\x04\xcd\x8b\xdf\x51\xc8\x26" - "\xf5\x50\x7e\x63\x1e\x33\x41\x86\x1d\xb9\x87\x8c\xbd\x7f\xf4\x99" - "\xd4\xca\xbe\x9d\x6a\xce\xa0\xf3\x77\x87\x88\xf6\x8f\xeb\x3f\x71" - "\xeb\x14\xe2\x6b\x28\x5f\xe5\x54\x9c\x55\xff\xae\xfb\x7c\x79\xf5" - "\xbb\xb9\xc0\x95\x79\x56\xda\xd7\x62\xd4\x4a\x71\xe6\x1d\xab\xe6" - "\x48\xbd\xe5\xef\xed\x7a\x79\xe8\x3d\x61\x57\x50\x31\xc4\xac\x15" - "\x21\x59\xf1\xf7\x69\x72\x8e\x7e\x9f\xa6\xcb\x17\x63\xb5\x93\xb7" - "\x97\xab\x45\xb3\x98\xc1\x6d\xf3\xb2\xeb\xfc\x2c\xae\x76\x17\x63" - "\x95\x9b\xb8\xff\xe9\x4d\x84\x47\x04\x63\x6e\xf8\x5d\x33\xec\x2f" - "\xea\x68\x8f\x2e\x57\x19\x8b\xa2\xbe\x3c\x3d\x40\x6d\x16\xca\x7c" - "\x5c\xfa\x55\xb3\x52\x3e\x1f\xfd\x26\x12\x1d\x61\x55\x85\xcc\x54" - "\xa5\x32\x63\x65\x21\x9b\x46\x69\xc4\x57\xfc\xfe\xa8\x2e\x0b\x8c" - "\x79\x2e\x5c\x4b\xf4\x91\xda\xdd\x52\xc8\x03\xef\x91\x7c\xe7\x54" - "\xb9\xff\x1f\x81\xbb\x87\x1d\x98\x2f\xc7\x78\x60\xbe\x2e\x1b\xd0" - "\x73\xea\xc8\x3b\xd6\x07\xec\xa3\xcf\x98\xef\x5f\xbb\x36\x2f\x23" - "\x37\x1b\x3f\xf6\x59\x8f\x5e\x3d\x9a\x57\x8c\x93\xf1\xa8\x0e\xa4" - "\x63\x6d\x81\x7f\x92\x77\x95\x0e\x54\x47\xe8\x7b\xa0\x73\xbe\x15" - "\x7c\x1f\x6c\x4d\xe8\x5b\xc3\xbb\xe2\xea\x00\x53\x8e\x9b\x98\x61" - "\x74\x7b\x0f\xae\xcc\x5b\xb9\xfa\xc7\xd2\xac\x61\x8c\x76\x9a\x47" - "\xb6\xf3\x72\xe8\xfc\x57\x93\xcd\x7d\x82\x3e\x96\x2d\xf2\xf0\xf8" - "\x39\xc5\x72\xaf\x7b\x39\x49\xb7\x1d\x1c\xdb\xa7\x8b\x6f\x79\xb0" - "\xdc\x00\xdc\x47\x4c\x4f\xc3\xeb\x9b\xda\x0d\x90\x4b\x0a\xe9\x19" - "\xb6\x5c\x42\xff\xad\xc5\x8a\x7c\xfb\x6c\x3b\xed\xa5\x2f\xe7\xf3" - "\x1d\x3e\xe2\x11\x5f\x76\x8c\x67\xbf\x15\x79\x1f\x5e\x9e\xdd\xbf" - "\x5c\x79\x1e\x5b\x2f\x91\x5f\xb7\xd3\x18\x59\xee\x95\x09\x72\xce" - "\x5e\x26\xfc\xff\x5d\xbd\x8e\xbf\x7a\x9e\x8a\x29\x7a\x0c\xce\x97" - "\xc7\xf5\x83\xcc\x4b\xd4\x6a\x89\xe3\xaf\xdc\x21\xce\xa8\xa7\xb2" - "\x5f\x75\xb0\x57\x6e\x33\x5a\x99\x95\x9e\x7f\x4b\xcf\x42\x87\x81" - "\x6f\x23\xf0\x68\x7a\x6f\xbd\x91\x28\x0e\x51\x1e\x85\xcb\x7f\xc4" - "\xf8\xc9\x7f\x51\xf4\x67\xe0\x8a\xb8\xb5\x12\x45\x33\x38\x31\xda" - "\xc8\xcc\x09\x71\xa6\x19\x57\x4c\xb3\xde\x7a\xcb\xc2\x05\x45\x85" - "\x05\xf9\x5c\x0d\xf8\xcd\x3c\x22\x6e\x6a\xe9\x1c\xfb\x3d\x57\x17" - "\x4b\xfe\xa1\x6c\xce\x98\xfc\x52\x99\x93\x3b\x20\xd3\xaa\x09\xb7" - "\xa4\x15\x3d\xca\x0c\xaf\x0e\x79\x0c\x90\xa1\xc0\xc3\xb8\x03\x5f" - "\x92\x2c\xfe\xca\x27\xef\x50\x1a\xc1\x2b\x9f\x97\xde\x92\x26\xef" - "\x24\xbd\x3a\x49\x2d\xbf\x25\x2d\x5c\xbf\x91\xa1\x7e\x92\xd3\x0d" - "\x7b\x0b\xbb\x0d\x6e\xe3\x2d\xcc\x6d\xf3\xb1\x77\xe8\x79\xcc\xb9" - "\xa2\x36\xa1\x13\x46\x1d\xb4\x07\x97\x14\x9d\xa3\xbd\x39\x5f\x9c" - "\xcf\x18\x4e\xb3\x57\xef\x3c\x38\x4e\x39\x71\xc6\x1a\x3b\xf4\x6f" - "\x83\xce\x57\x89\xfe\xdf\x9f\xa4\xc9\x21\x24\x27\xbd\x5a\xa5\xef" - "\x07\xf4\xfd\x1e\x79\x4e\xf4\xea\x3e\x3d\xcf\xd8\x7a\x1c\xd8\x3a" - "\x73\x17\xf0\x80\x0f\x74\x77\xc3\xf7\xe2\x38\xb8\xb2\x98\x78\x94" - "\x47\x40\x9b\xe3\xb7\x58\xa2\x13\xb6\xa4\x3c\xd2\x42\xbc\x51\x7c" - "\xef\x25\x2c\xc1\x77\x2f\xfa\x0c\x7b\xfb\xb6\x3d\x24\x73\xe2\x7c" - "\xd8\xac\xa4\xac\x32\x6f\x49\x59\x19\x74\x2e\xbc\x11\x3c\x94\x39" - "\xff\x4e\xc5\x1c\xb8\x4d\x09\x38\xe7\xdf\x58\x27\x63\x15\xf9\x2a" - "\xa7\xf0\x76\x2a\x73\x8c\xca\x78\xe8\xaf\x93\xca\xb5\x74\xb1\x83" - "\xab\xe8\xb7\xd9\xac\xf0\x3a\x33\xcd\xe4\xbc\x62\x11\xbb\x15\xfb" - "\x73\x0b\x8f\x25\xd9\x6e\x58\xe8\xe0\x26\x84\x75\x70\x07\x4b\x69" - "\xde\xa2\x97\x3e\xce\xdf\xa1\xba\x9a\x83\x03\x6a\x73\xed\x69\xd0" - "\x43\x21\x57\x1d\x25\x1a\x70\x34\xb9\x8a\x59\x35\x9b\x69\x43\x4b" - "\xa0\x19\xfb\x30\x7c\x0e\x34\x51\x9b\x87\xe8\xaf\xd1\xb6\x86\x45" - "\x9d\x66\x07\xbf\xd4\x6d\xae\x24\x5f\xf7\x87\x7b\x34\x3d\x80\xeb" - "\x3a\x2a\xbf\xf9\x11\xe0\x44\xb7\x21\x40\xf5\x93\xac\xdd\xec\xce" - "\x69\x16\x36\x6c\xb8\x93\x80\x3c\xd4\x86\xdd\xed\x6f\x66\x2a\xb7" - "\x1a\xe8\xbd\x11\xf7\x0b\x38\xe5\x6d\xcd\x6f\x67\xad\x0e\x3f\xed" - "\x9b\x2d\x24\x7b\xda\x93\xa8\x3f\xa2\x3e\xfa\x7e\xf4\x55\x9a\x5f" - "\x1b\xc9\x0c\x54\x5f\x1b\x6c\xe2\x70\x77\x9f\xaf\xb3\xcf\xa6\xf2" - "\x4d\x7c\xd8\x6a\x40\xfd\xa7\xd9\x6b\x27\x78\x9f\xdd\x3e\xaf\x57" - "\xc6\x32\xed\x60\xaf\x1d\xa2\x7e\xae\x89\xe8\xe7\x1d\xd4\x7f\x23" - "\xed\x95\x2e\xaa\xf3\x10\x5f\x4f\x6d\x76\x52\x9b\x3e\x2f\xec\x3f" - "\x93\xf8\x06\xab\x11\x7d\x6e\x45\x7f\xf3\x83\x8c\x6f\xb0\x1b\x2b" - "\xce\x32\x23\xad\x05\x57\x1d\xfd\xd2\xf8\x1b\x88\xaf\x9f\x36\xe8" - "\x7c\x2d\xe4\xff\x01\x7c\x24\xbd\x7b\x74\x5c\x2a\xa3\x3c\xd4\xc7" - "\x46\xea\xd7\xa1\xf8\x5e\x06\xdd\xc2\x04\xc2\xd3\x09\xd4\xee\x44" - "\x9a\xab\x46\x82\xdd\xbb\x04\xeb\x43\x18\x93\x3a\xa0\x76\xab\x54" - "\x5f\xc5\x00\xf5\x69\x9d\xd5\x18\xd7\x89\x38\xef\x83\x9c\xe0\x7d" - "\x74\x59\xfe\x20\x87\xbd\x38\x6c\xaf\xa9\xcc\x1e\x1a\xab\xd1\xc3" - "\xfe\x50\x00\x39\xbf\x8b\xbd\xb6\x4d\xc6\x62\x7d\xad\x44\x3b\x4b" - "\x3e\x2a\xf5\xbb\x07\xbf\x04\xec\x31\xae\xb8\x2d\x96\xed\xee\x6e" - "\x2f\x8b\xeb\xbc\x84\x78\x96\xd7\x58\x8d\x0a\xfe\xf4\x0f\x25\x7a" - "\x3f\xc7\x59\x63\x7e\x37\xd1\x17\x75\x80\x77\x43\x7e\x91\x76\x66" - "\x7f\x38\x94\x91\x1f\x95\x4a\xb2\x8a\x81\xfa\x89\x7b\x4c\x53\x88" - "\x47\xbb\x15\x76\x88\xd4\x3f\xda\xb3\xff\x70\xec\x7c\x31\x90\x09" - "\x3e\xc4\x17\xbc\x4e\x7d\xf8\x83\xd0\xa7\x22\x46\xac\xd4\xb1\xbe" - "\x9e\xa8\xfb\xe1\xe0\x03\xbc\x00\x7b\x2f\xb5\x5b\xbc\x6d\xbd\x68" - "\x03\x71\x71\xbb\xf3\x6c\xfc\x78\x93\xcd\x3b\xae\xaf\x83\x08\xfb" - "\x39\xaf\x16\x6b\x4f\xd8\x12\x8c\xb4\x9f\x7b\xbd\x20\x42\x5f\x03" - "\x7b\x82\x62\xd8\x4c\x48\x7f\x49\xaf\x0b\x9b\xc0\x65\xf9\xd2\x2f" - "\x8c\xdb\xdf\xab\xc9\x1d\xaf\x7f\x28\xe2\x6f\x81\xa7\x15\x36\x77" - "\x3d\x9a\x9d\xdc\xeb\x2b\xd1\x46\xd3\xa8\x18\xdf\xd9\x6b\x56\xde" - "\xbf\x3a\x5b\xaa\x30\xe7\x3e\x94\xb7\xf2\x17\x23\x65\x23\xa3\x90" - "\xc5\x9d\xaf\x1f\x95\x67\x02\x0d\x71\x11\x32\x82\x31\xa4\xd3\x35" - "\xb0\x06\xa9\xd7\x6d\x48\x1e\x4b\xaf\x7b\xe7\x2f\xd6\xac\xcd\x15" - "\x6d\x08\x93\xc2\x6c\x79\x2b\x30\x96\xdd\xb3\xf8\xce\xc5\x73\xd7" - "\x65\xe7\x89\xa0\x3a\x52\x89\xba\x32\x2b\x2b\x57\x33\x38\x5c\x85" - "\x52\xf8\xf2\xe0\x06\x51\xd4\xf1\x70\x9e\x34\x55\x5c\xb7\x7a\xe5" - "\xfa\x6c\xad\x8a\xc8\xbe\x4e\x03\xbd\x6c\xaa\x11\xba\xaa\x58\x69" - "\x1f\xd1\x70\x28\xe2\x3c\x35\x52\x7f\x73\x19\x7d\x0b\x9d\xff\x3b" - "\xae\x04\xae\xbc\xb1\xaa\xb5\x5e\xf8\x32\x31\x1e\x7e\x11\xf0\x7d" - "\xe3\x0e\xc4\x81\xa0\xbd\xad\x11\x71\x8b\x35\xdb\x03\xa2\xd7\x6f" - "\xcc\x24\x59\xab\x91\xe0\x9b\xbf\x2c\xa8\x72\xa2\xa9\x24\xa7\xbf" - "\x99\xa8\xe9\x44\x4c\xaa\xa1\x61\x01\xec\xc6\x6a\x85\xfe\xee\x8d" - "\x85\x61\xfd\xdd\x9b\xb0\xe9\x31\xd1\x7c\x77\xa2\x6f\xe8\x27\x7d" - "\x5f\x11\x61\xb3\xd3\xe9\x21\x30\xa2\x1e\xd8\x96\x88\x18\x2d\xc4" - "\x13\x6b\xfe\x20\x0c\xad\x2f\x62\x1f\xfa\x13\x62\x3a\xf5\xaa\x25" - "\xea\x41\xb9\x66\xfe\xb8\x87\xef\x1c\xfa\xbf\xf3\x7c\x2c\x51\xd2" - "\x8c\x37\x20\x8b\x5f\x4c\x7d\x6c\xa2\xf4\x74\xa2\x3b\x13\xc0\x1b" - "\xc9\x33\xaa\x37\x4e\x6a\xfa\x3c\xc0\x67\x42\x44\x1f\x3c\x61\x9d" - "\xdf\x9b\x89\xde\x18\xf5\xe0\x36\x69\x93\x23\xec\x0f\xa4\x0d\xc8" - "\x1f\x8d\x21\x1d\x17\xb5\xad\x9d\xb9\x27\x76\x51\x7e\x82\xc5\x41" - "\xed\x1c\x1c\x63\x4f\xc3\xb8\xa5\x2d\xe5\x1f\x47\xc8\x3f\x32\x26" - "\xc6\xd0\xff\x55\xa5\xbd\x2c\xfa\x9e\x2d\xf8\x28\xe8\x17\x87\x00" - "\xef\x3f\x6e\xa4\xef\xb4\xd7\xfd\xd1\xe1\x61\xaf\x87\xfa\x83\x3e" - "\xe7\xe5\x13\x33\x40\xe5\xb0\xf7\x51\x9f\x26\x52\x9e\xaa\x70\x9f" - "\xff\x28\xce\x46\x21\x53\x4a\x1e\xe4\x4f\x26\xa1\xe7\x2d\x51\x5d" - "\x11\xf3\x66\x3c\xcd\xfe\x78\x92\xfa\xea\xda\x2a\x6d\x5f\x26\xe8" - "\x36\x25\x54\xd7\x88\xf1\x87\x75\xb0\x0d\x6b\xa4\x0e\xf6\x4f\x2c" - "\x3c\x87\x7f\x6c\x02\xde\xc3\x6e\x48\xb7\x19\xc2\x7c\xca\x78\x21" - "\x7f\xb2\xeb\xf5\xa8\xb1\x6a\x3d\xe4\xe4\x72\x79\xfe\x4d\xf3\xf2" - "\xa7\x55\x51\xca\x71\xc1\x4b\xcd\xf3\xb3\x7a\x4a\x8b\xa6\xb4\x7b" - "\x91\x0f\x6d\x0a\x5d\x25\xc1\x06\x63\x51\x49\xc6\x8a\xb2\x46\x2f" - "\xa3\xfa\x08\xaf\x0e\x1c\x0d\xe3\xc6\x9f\x52\x05\xbd\xd4\x60\xcd" - "\x9d\x0d\x5b\xc3\xb2\xfb\x9f\xf6\x86\xf4\x6e\x54\x4f\x78\xcf\xf8" - "\xd3\x87\x80\x71\x45\x48\x07\xd1\x18\x10\xfd\x90\xe7\xa9\xef\x75" - "\xb1\xc6\x53\x9c\xf8\x0b\xec\xb5\x90\x0f\x31\xf7\x82\xdf\x13\xfa" - "\xb3\xc6\x5f\xd7\xca\x33\x8b\x67\xe9\x79\xbf\x6a\x18\x0b\x77\x1a" - "\xa7\x45\xda\xf7\x4a\xf8\x37\x66\xa9\xa8\x93\xc6\x8f\xba\x68\xff" - "\x51\x74\xbd\xa6\x56\xef\x3d\x54\xe7\x73\x5d\x1a\xac\xc5\x59\xde" - "\x4e\x0d\x0e\x98\x63\x01\xf3\xc6\x3c\xc2\x01\x11\x33\xad\xa8\x9e" - "\x9f\x5a\x4b\x75\xc8\xd8\xba\x8d\x55\x1c\xb0\xd5\xf2\x7b\x21\x7f" - "\x53\xdf\xe5\x9d\x48\xc2\x45\x92\x4d\xd1\x4f\x75\xa7\xba\x0f\x7d" - "\xc7\x39\x5e\x58\xa7\xd2\xf8\x21\xca\x7a\x1f\x93\x65\x2a\xe4\x39" - "\x23\xcd\x4d\xa3\xc2\x37\xe4\x30\xed\x7c\x8b\xf0\xfc\x8f\x6d\xc0" - "\x7b\xd4\xe3\x13\x32\x73\xa3\x47\x25\xb8\xd0\x9c\x4c\x1e\x74\xbe" - "\x19\xa7\xcf\x09\xcd\x47\xf3\x79\xf8\x6d\x9a\x93\x37\x17\xe8\xbe" - "\x95\xb0\x37\xd1\x1a\x2e\x96\xbc\xe4\x9b\xe7\xcc\x5b\x6e\xe5\xe6" - "\xc0\x8d\x37\x82\x37\xaa\x33\x08\x5d\xa8\x6e\xbf\x3a\x83\xe0\x74" - "\x46\xbf\x0b\xa0\x6e\xfd\xf7\x76\xd8\xfe\xba\xfd\xd2\xf6\x17\xe9" - "\x77\xfb\xb8\xda\xea\x0b\xe2\x2e\x4c\x3b\xb5\x51\xa3\xcb\x59\xa0" - "\x6f\x51\x5b\x14\x82\xdd\x9b\xb8\xff\x78\x48\xa3\x6b\x13\x7b\xd8" - "\x9b\x9f\x6b\xf5\x47\xf6\x61\xb9\x3c\x53\x7c\xd3\x2f\x79\xff\x37" - "\x41\x7b\xaa\xa4\xbc\xf6\xa6\x57\xef\x37\x7d\x3f\x34\x7a\x8c\x69" - "\xb7\xdf\x99\x6d\x5b\x0d\x12\x9d\x72\x43\xbe\xcd\x3e\x2b\x6b\x9e" - "\x30\x16\xb7\xfd\xd3\xed\x3f\xb6\xa5\xdd\x3c\x2b\x3f\x27\xf9\x6e" - "\xf9\x73\x7b\xda\x52\xfc\x8e\xb2\x1d\xb0\x0d\x3a\xff\x9c\x36\x52" - "\x1e\x7c\x47\xeb\xc3\x9f\x73\x3c\xca\x3f\xa5\x0b\x1c\x36\xf9\x2a" - "\x79\x49\x47\x1b\xed\xa9\xbd\xe0\x93\x97\x05\xbf\xe6\x7c\x47\x47" - "\x1b\x8f\xf1\x55\x7a\xe3\xe7\xd8\xbd\xf1\xb3\xbd\xde\x98\xa1\x82" - "\x0a\xa2\x81\xe6\x2d\xdc\x6f\x0e\x4c\x94\xb4\x92\xde\x89\x27\xe9" - "\x26\xbe\x07\x73\xc9\xee\xb8\xba\x88\x2f\x0b\x72\x37\xf1\x3f\x04" - "\x97\x3f\x37\xeb\xfb\xb8\xd0\x63\x96\xf8\x2a\x97\xe5\xf3\x61\xe0" - "\x0e\xf1\x07\xb8\x4f\x5b\x09\x5d\x26\xe5\xa3\xf1\xbf\x9a\x22\x61" - "\xf1\x67\xc0\xc0\xa6\xc1\x37\x6d\xd0\xf9\x1f\x34\xff\xcb\x84\xee" - "\x59\x75\x5a\xc5\x5e\xa1\x6e\xbd\xe6\xa7\xbc\x6c\xb6\x57\xaf\x93" - "\xea\x8a\xd3\xe2\x31\x8b\xfa\x58\x84\x6f\x82\xf3\xfd\xa9\x3b\xfb" - "\xf7\x42\x6f\x85\x7b\xc1\xe6\x7c\x05\xf1\xb7\xd2\x43\xba\x3a\xfa" - "\x96\xb0\xc5\x02\xfd\x5d\x7a\x82\x4f\x29\x46\x9e\xb0\x4e\x4b\xf5" - "\x54\x18\x54\x3f\xf1\x13\x16\xe0\x87\xe0\x55\x85\x3d\xc5\x7f\x34" - "\x86\xce\xe7\x46\xcc\xfd\x7f\x08\x7c\x38\xeb\x34\x12\x6e\xff\x39" - "\xf5\xca\x44\xc9\x3b\xa9\x4e\x85\x49\x5f\x11\xff\xf1\xb2\x58\x97" - "\x1a\x3e\x12\x7c\xbd\x38\x3b\x37\x07\xb8\x17\xf7\x54\xd4\x28\xc2" - "\x49\xd6\xc3\xdc\x05\x83\xc5\xb8\xaf\x1e\xc2\x4b\x07\xe1\xa5\x83" - "\xf0\x12\x76\x0e\xd4\xbe\x37\xea\x9a\x4c\x5a\xb3\x4a\x0f\xfb\x8f" - "\x02\xf4\x1f\xb0\x21\xfe\x3d\x4e\x25\x58\x09\x7b\x56\xc0\x27\x76" - "\x30\x09\xf7\x0c\x31\x56\x73\x80\xc6\x1c\x39\x2e\x83\xea\x29\x77" - "\xd2\xb8\x0c\x34\xae\xfc\x53\x42\x17\x84\xfb\x9f\x44\x4b\xa6\x84" - "\x63\xb8\x1c\xaa\x89\x1c\xa3\x8a\xb8\x4f\x62\x0c\x87\xde\x1a\x6b" - "\x8c\xdc\x80\x31\x02\x06\x87\x9e\xd4\xce\x39\x45\x3f\x41\xb7\x7a" - "\xd9\xa1\xb4\x84\x2d\xb8\x77\xe9\xab\x24\xbe\xf7\x76\xcc\x61\xad" - "\x93\x57\xa2\x9f\x63\xcd\x17\xea\x93\x75\xbd\xb5\xc2\xbc\xa5\x38" - "\x73\xd0\xf9\x96\x7d\x6c\x78\xbf\x75\xe7\xf9\xe1\xfd\xd6\x74\x94" - "\x47\x3f\x70\x87\xd4\x0c\x07\x63\x84\xdf\xc4\x57\x94\x8c\xd5\x6e" - "\xc2\x96\x7a\xf4\x6b\xcc\x6f\x84\xfb\xbd\x15\xb9\x23\xd7\x84\x5a" - "\xeb\x67\x80\x1f\xf4\x45\x52\xaf\xff\x56\x5b\xe8\xfc\xa1\xc4\xd7" - "\x68\x56\x6c\x51\x58\x63\x82\x27\xa6\xf1\x8e\x55\xaf\x59\xa9\x84" - "\x8f\xc2\xdb\x89\x56\x8d\xf9\x9d\xd6\x81\x8d\x6f\xbd\xf6\x4a\xaa" - "\xaf\x20\x61\x8b\xc2\xbd\x51\xd7\xc6\x26\xf8\x02\x49\x80\x2b\xf5" - "\x35\x9f\xd6\xf8\x09\xb1\x77\x0b\x5d\xc9\xdb\xb4\xfe\x3f\x16\x71" - "\x77\xbc\x31\xbe\x02\x69\x17\xf4\x76\x96\x87\xfd\x25\x22\x16\xea" - "\xdb\x79\x1e\x65\x4e\x89\x5c\xab\x97\xef\xa2\x3d\x6d\xbe\xea\x34" - "\x73\xdb\x26\x33\xa7\xba\xe2\x55\x6e\x37\xd0\xbe\x35\x3f\x8c\x3b" - "\xf2\x9e\xaa\x8e\x3b\x54\xbe\x61\x6c\xbc\x78\xfb\xb3\xf3\xe3\xc5" - "\xdb\xfb\x35\x3d\x6f\xa6\xb4\xbd\x7d\x3b\xa0\xcb\x1c\x7c\xeb\xe5" - "\xbb\x6c\x85\x68\xff\xed\x4a\xd9\x36\xc1\x24\x90\x0a\x3a\xb3\x94" - "\xe0\x56\x3c\xe8\x7c\xc7\xae\xd3\x06\xe0\x90\x39\x08\x79\x88\x09" - "\x3c\xa7\x6f\x8b\x89\xf6\x68\x67\x84\xc3\x49\xe0\x55\x55\xe7\x9f" - "\x8d\xb4\x7f\xed\xc6\xdd\x13\x5f\x8c\x8f\xe6\xe5\x1d\xa2\x7f\xc6" - "\x25\x1a\xfd\xf3\x51\x1d\xfe\x2a\xe9\x87\xc2\x24\x62\x06\xd2\x3a" - "\x47\x9c\x40\xac\x75\x4a\x4b\xa4\x7e\x23\x66\x20\xc9\x08\xef\xd4" - "\xeb\x7b\xbf\xea\x4c\x05\xbc\x85\xce\xd8\x00\x7e\x98\x60\xf7\x8c" - "\x41\xdd\x37\x30\xcf\xca\x30\xe6\x81\xad\x53\xf7\xfd\xea\x3a\x66" - "\xfc\xc0\x7a\x3f\x73\xdc\xc0\x12\xb7\xfc\x3f\x46\xf6\xf7\x05\xcc" - "\x00\x38\x78\xd8\x3b\x07\x25\xec\xde\xf1\xea\xf3\xe3\x61\x6f\xa7" - "\x63\x3e\x70\x2e\xb3\x2c\xc0\xfb\xe4\xb9\x94\xcb\x42\x7b\xa0\x55" - "\x7e\xff\xf3\x8a\x31\xf6\x87\x3b\x6c\xab\xd6\xd9\xb2\xd6\x6e\x58" - "\x33\x73\x66\xec\x18\xb2\x84\x2b\x49\xca\x12\xae\xf4\x48\x59\x82" - "\xde\x73\xa8\xbe\x05\xa3\x65\x87\xa5\x19\x9a\x7b\x91\x8c\x14\x16" - "\x7e\xbe\x9e\x2d\xbd\x3e\xe2\xf5\x46\xb6\xf4\x86\x1b\x33\x7e\x9a" - "\xbd\x32\x6b\x63\x44\xea\x4d\x91\x7a\xc4\x8a\x5d\xd4\x76\xd4\xd4" - "\x45\x44\x3f\x94\xbb\x1f\xc3\xbe\xf3\xee\x5d\x85\x01\xfe\x2d\xe1" - "\xee\x02\xf8\xf4\x3a\x92\x17\x60\x47\x88\xbe\xf1\xcb\x41\xd7\x27" - "\x4a\xbf\xb6\x41\x06\x3d\x9d\x99\xc6\xee\x25\x99\xae\x5f\xde\xbd" - "\x78\xf7\x97\xad\xd5\x7e\xa2\x13\x43\xdb\x24\xbf\xf3\x6e\x32\xa5" - "\x4f\xa2\xdf\x7b\xe4\x99\xce\xbb\x3f\x23\x79\x39\x55\xf8\x30\x59" - "\x0f\x1f\x26\xef\x0a\xdb\xb0\xeb\x7c\xc5\x4c\xfa\xd2\x73\x75\xc2" - "\xc7\xbd\x87\xbd\x5b\x05\xfe\x02\x79\xa9\xcc\x5c\xdb\x43\x2c\x05" - "\xbf\xe0\x87\xe9\x5b\x32\xdf\x31\xb4\x8d\xef\x4e\x87\x4d\x4d\x12" - "\xa5\x3f\x09\xbe\x2d\xca\x6a\x8a\x1b\x74\xbe\x5b\xa9\xf3\x20\xbe" - "\x71\xee\x7e\x01\xce\xfa\x3e\x98\x40\xf4\x3b\xc1\x67\xe6\x19\xf0" - "\x09\xa4\xb0\x24\xec\x0f\xe6\xfc\x34\x71\xb7\x10\xfb\x22\x68\x42" - "\xad\xa0\xa5\xef\x76\xeb\x74\xa1\x5c\xca\xa3\xb1\x28\x4f\xfb\xe7" - "\x19\xb9\x7f\xbe\x67\xd2\xd7\x02\x3d\x27\xea\xb8\x3a\xe2\x7e\xd9" - "\x9a\xbc\xec\xdc\xec\x2c\xdb\xac\x75\xb1\x2c\x22\x02\x6b\x4e\xf6" - "\x1a\x5b\x6e\xf6\x2f\x1f\xcd\x5e\x27\x04\x3d\x7c\x1d\x79\xfe\x46" - "\x34\x28\x1c\x0f\x7b\x2a\x60\xfc\xde\x46\xc8\xc2\xe6\x2d\x33\xc5" - "\x59\x8a\xe0\x8d\xe2\x6e\xc9\x51\xcb\xe3\x53\xa5\xde\xb2\x87\xe0" - "\x7a\x58\xfa\xe3\x2a\x19\xca\x03\x1f\xd7\xc5\x0e\x97\x49\x5b\x99" - "\xf7\xde\xd7\x60\x55\x45\xfd\x3c\x14\xe6\xd7\x9a\x84\xdf\x21\x69" - "\xb3\xfa\xde\x51\x0f\x73\x35\x84\x79\x90\xa6\x9b\x41\x07\x05\x3d" - "\xfc\x01\x5a\xa8\xf1\xce\xd4\xce\xe1\x2d\x7c\x3d\xef\xac\x18\x62" - "\x42\x1f\x88\xd8\x08\x92\xbe\x1e\x4e\xd1\xe1\x48\xfc\x4b\x27\xf4" - "\x0e\xba\x7c\xb4\x2c\x70\x8e\x17\x6e\x64\x06\xe8\x1e\x88\x86\x94" - "\xbc\x92\xeb\x35\x70\xe7\x7b\x36\xe2\x65\xf2\x90\xa7\x56\xb3\xdd" - "\xe4\x31\x43\x0e\xaa\x27\x3f\x2c\x77\x34\x2d\x14\x7c\xfc\x10\xf0" - "\xe6\xf0\xb4\x0c\xec\x11\x92\x76\x5f\xf4\x43\xfd\xe5\xb1\xf2\x1c" - "\x45\xd2\xb7\xc3\x8d\xda\x18\x7a\x41\xb3\x34\xdb\x5f\x83\xc4\xeb" - "\xa6\x85\x84\x73\x79\x98\x0b\xa2\xf3\x25\x3a\xbc\x30\x5e\xf4\x1d" - "\x7a\x6b\xa2\xc3\x25\xaf\x6e\xf2\x1b\x64\xec\xd2\xf7\x92\xa5\x7c" - "\xd4\x64\x8b\x3c\x37\x94\xb2\x50\xd3\xfc\xb0\x9f\x90\xf7\xaa\x46" - "\xd3\x88\xb5\x6b\x70\x9d\xec\xe1\x8c\x0d\x2b\x1f\xce\xce\x78\xd4" - "\x91\x6c\x7b\x74\x8d\x38\xb6\x15\x6a\x80\xbc\x47\x1f\x78\xd8\x06" - "\x2a\x92\xb1\x78\xe9\xd2\x8c\x45\xf7\xfc\xeb\xcf\x62\xd9\xa2\x95" - "\x94\x96\xb7\xd6\xb6\x34\x25\x59\x7e\xfa\xe9\x1d\xb7\xff\x5b\xc6" - "\xed\xcb\xee\xb9\x7b\xf9\x18\x36\xe9\x71\x84\x13\x0e\x9a\xa3\x09" - "\x1d\xec\x83\x52\x69\x83\xd4\xd4\x3c\xd2\x06\xa9\xc9\x43\x7f\x44" - "\x9d\xdf\xb7\x32\xf6\x01\xa5\x7e\x50\x4a\x7f\xc5\x12\x6f\x62\x2c" - "\xd4\x7f\x5f\x18\x6f\x3e\x10\xe7\x6d\xd0\x1d\x48\xdd\xeb\xfb\x44" - "\xff\xde\x5b\x1a\xf9\x2d\x4c\x0b\xde\x0f\x0a\x7a\xa9\xe1\x05\xf0" - "\x21\x23\x60\x12\xb8\x21\xf9\x95\xf7\x97\xea\xb8\x51\x21\xcf\x87" - "\x18\x74\x66\xf8\x4e\xf8\xbd\x1c\xfa\x65\xc2\x05\x07\xce\xd6\x91" - "\xce\xe3\x6f\x59\xae\xd5\xbb\x0d\xfa\x66\xf0\xb3\xda\x99\x58\x42" - "\x0f\x7b\xff\x5d\xee\x6c\x5a\x22\x65\xc1\xa6\x8d\x02\x6f\xb6\x4e" - "\x5d\x24\xce\x20\xc5\x7d\xa2\xf7\x1b\xc3\xf8\xf3\x41\x29\xe6\x06" - "\x74\x41\xd2\xde\xf7\x8f\x8e\xd2\xe3\x44\x51\x5a\xb7\xee\x67\x3e" - "\x6f\x26\x33\x18\x67\x56\xb2\x2a\x03\x2f\xf6\xb0\xf7\xab\xa5\x1d" - "\xea\x07\x26\x9d\x7f\xa6\xe7\x44\x0f\xe3\xed\xa3\xf5\x5f\xe5\x11" - "\xfa\xaf\x42\x07\x3f\xde\xea\xf0\x82\x47\x76\xb9\xbd\xc2\xbf\xe9" - "\xad\xad\x0e\x1f\x6c\x4b\x62\xbb\xd8\x07\xf7\x16\x05\xf9\x10\x3d" - "\x4f\xa5\xb1\x89\x3d\x64\x9e\xd4\x29\x90\x3c\xf6\x41\x99\x94\x4d" - "\x64\x3a\xe0\x4e\xcf\xe8\xa3\x11\xf3\x43\x78\xd9\x4d\x73\xb4\x6c" - "\x2c\xba\x97\xb0\xc5\xa0\xf9\x91\xfa\xe0\x38\x64\x54\xc0\xea\x69" - "\x83\x9a\xf3\xb4\x93\xfe\xe8\x17\xb4\x2f\xcc\x5f\x72\xbf\x84\xed" - "\x07\x9e\xa6\xfc\x5e\xec\x9b\xfe\xf1\x68\x29\xcd\xe7\x31\x7d\x3e" - "\x97\x05\xbd\xb7\x62\xbe\x06\x9d\xff\x69\xd5\xe7\xb2\x6f\x76\x45" - "\x65\xd4\x16\x66\x3b\x5c\x73\x03\xd2\x69\xfd\x7f\x50\x2d\x6c\x7b" - "\xb0\xbe\x46\x95\x25\x3a\x9c\xaa\x95\x4f\xd7\xcb\x8f\xf6\x4f\x2c" - "\x2e\xe8\x42\xc9\xf5\x63\x69\xe3\xa3\x85\x93\x1e\x61\xe3\x83\x33" - "\xc0\x26\x89\x93\xba\x0e\xce\x22\xc7\xd3\xfc\x13\x75\x27\xc9\xdf" - "\x3b\xbf\x7b\x48\xd3\x03\xd0\xda\xfe\xcf\xfe\xeb\x18\x5b\xed\xdb" - "\x90\x1e\xd2\xa1\x40\xf7\x01\x9f\x83\xd4\x0f\x4f\x84\x8e\x2c\x64" - "\xa3\xe9\x61\xcd\x69\xb0\x19\xc3\x9d\x65\xd4\x83\x75\x25\xf5\x36" - "\xcd\x16\x37\x51\x5e\xaa\x6f\x8d\x38\xff\x76\xfe\x67\x8e\xc0\x3d" - "\x92\xb5\x85\x9c\x5f\xc0\xbf\xd5\x6c\x98\x04\xef\x22\xef\xe3\x35" - "\x2f\x0e\xe9\x82\xc4\xdd\xb4\xff\x14\x76\xd9\x94\xbe\x62\x2c\x7d" - "\x21\xd1\x87\x9c\x95\x6b\xb2\xd6\x3e\xf8\xe0\x0f\x93\x86\xc8\x33" - "\xae\x4a\xa7\x5a\x42\x75\x92\xfc\xfb\x6a\x8e\xc4\xd3\x66\xa2\xff" - "\x2f\xa6\x4a\xfe\xed\xdf\x4f\xd2\xba\x99\xde\xc3\x3e\xb4\xea\xfc" - "\xbb\x5c\x47\x1f\x26\x71\x67\x73\x4e\x78\x6d\x34\x7b\xbf\xbf\x36" - "\x3e\x34\x8e\xbd\x36\x3e\xb4\xd3\x3e\x7b\x8c\xbe\x27\x51\x9b\xc7" - "\x04\xcd\xc7\x7c\x4b\x1e\xdc\x65\x0e\xdc\x2a\x78\xf0\x8c\x8d\x4c" - "\x01\xff\x0d\xdd\x34\xf6\x83\x20\xc9\xb5\x41\xa2\x11\x19\x01\x66" - "\xc1\x5e\x50\xb1\x06\x7a\xc7\x19\x3c\x30\xc0\x3d\x19\x1b\x89\x5e" - "\xd0\x7b\x79\x8f\x3c\x83\xbf\xaf\x9f\xe4\x10\x7a\xae\xe8\x02\xad" - "\x50\x11\x0c\x81\xc9\xfd\xfa\xc3\x6a\x9d\xc7\x35\x6f\xb1\x09\x1f" - "\xd9\xd8\xb7\x83\xd2\x9e\xe9\x20\xf6\x6e\x6a\xa7\x41\xd0\xa0\xa0" - "\x19\x67\x00\xac\xe2\x21\xaa\x17\x76\x41\x6b\xd0\xbf\xa8\x1b\xcd" - "\x81\x14\x71\x56\x50\xf7\x90\xb0\x07\xba\x51\xda\x03\xdd\xc8\x6a" - "\xd7\x00\x0e\x1f\xfa\xcf\xab\x1b\x8f\x9f\x63\x89\x4c\xcf\x7f\x70" - "\x55\x86\x23\x67\x63\x06\x6c\x01\x47\xed\xef\x72\x0d\x39\x3f\x9a" - "\x26\xe1\xfb\x51\x5a\x58\x57\x25\x6d\xf8\x40\x33\xe7\xf9\x85\x0f" - "\x5b\xed\xac\xe7\xe3\xf9\x80\x7d\xd1\x39\xbc\x9b\x08\xe7\x3e\x9e" - "\x8b\xb3\x9f\x3e\xd8\xce\xd4\xa5\xb3\x4a\x27\x77\x41\x87\x46\xe9" - "\x97\xe8\x77\xea\xfb\x28\x9d\xd6\x3e\xd2\x62\xc4\x59\x63\x9e\xd0" - "\xcd\x11\x9c\x3e\x72\x79\x98\x79\xbe\xd6\xde\xc3\xb0\xcf\x13\x36" - "\xe5\x82\xcf\xf8\xe8\x94\xbc\xa3\xf5\x51\xa7\x0e\x4b\xe2\x7d\x17" - "\xe0\x5e\x3f\xec\x74\xfa\x38\x6c\x02\x3f\x66\x7a\x79\x0f\xfb\x48" - "\xdc\x31\xbd\xdb\x27\x9e\x0f\xdc\xe7\x8b\xbc\x93\xff\x51\xb5\xa4" - "\x5b\x1f\xd5\x50\x3a\xd1\xca\x8f\x8a\xa9\xcf\x09\xd2\x47\x80\xa8" - "\x67\x89\x6e\x0f\x15\x09\xb7\xdb\x57\x3a\x88\x59\x5e\xf5\xe0\x83" - "\xd9\xb9\xeb\xf4\x98\xf2\xf6\xb5\xab\xb3\x6e\xd6\xee\xe0\xaf\xc9" - "\xde\x90\xb1\x2a\x4b\xdc\xf1\xa1\x54\xf9\x38\x0a\xbe\xc9\x90\x6f" - "\x84\xdd\xbc\x18\x53\xdb\xac\x5a\x8d\x8f\xea\x60\x2d\x0d\xd2\xde" - "\xa2\xe5\x11\xb9\xb7\x5d\xf4\x12\xf5\xa3\x4d\xdf\xdb\xa0\x63\xe9" - "\x63\x3f\xb2\xe1\xcc\x0c\x7e\x19\x70\x36\x07\x3d\x0b\xe5\xa1\x35" - "\xfa\x51\xe8\xce\x74\x19\xa5\xe3\x4c\xd8\xb5\x06\xe7\xc0\x6d\x77" - "\xa8\x3b\x7c\xab\x79\xec\x71\x2b\xd1\xb5\x38\xcc\x1d\xce\x8a\x64" - "\x0c\x8f\x96\x54\xd0\x6b\xe8\x02\x5d\x6b\x60\x4f\xdb\x62\x21\xfe" - "\x84\xf6\xcb\xb6\x25\x24\xeb\xad\xde\xb6\x89\x99\xd0\x06\xed\x85" - "\x1e\xa9\x57\x6e\x59\xf1\x6e\x01\x63\xda\x7e\xe8\x29\x13\x7a\xce" - "\x16\xbb\xdc\x53\x7d\xc5\x9a\x1e\x85\x64\xab\x96\x6d\x1e\x76\x95" - "\x57\xf6\xf9\x78\xaa\xc0\x13\x41\xeb\x5a\xf6\xf1\x9d\xc7\xdb\x84" - "\xcd\xf3\xce\xe3\xa9\x2a\xcf\x89\xc2\x3b\xed\x35\xb1\x34\x8f\x6d" - "\xbc\xc8\xce\x34\x3b\xe9\xa8\x2e\x76\xe4\x7a\xe8\x81\x09\x3f\x5c" - "\x80\x05\xd5\x5f\xaa\xd5\x5f\x4a\xf5\x53\xbb\x37\x6a\xf1\x73\x5b" - "\xbc\x7a\x5b\xb4\x5e\xa1\x67\x5a\x8d\x3d\x99\xfa\x9f\x45\x7f\x39" - "\x52\xe7\xe4\x27\xd9\x6f\x46\x48\xe7\x24\xf9\xbe\x23\x76\x7d\xbd" - "\xa0\x6d\x6d\x0c\x25\xaa\x53\xf8\x6f\x55\xb4\xb6\x4a\xa0\xff\xd0" - "\xeb\xe4\x54\x27\x1f\xe8\xad\xa7\xfd\xd3\x44\x74\xc3\x9b\xb0\x85" - "\xf6\x49\xb4\x01\xbe\xdd\x37\x83\xd3\x3e\x1a\xcc\x08\x1a\xa5\x0f" - "\x8d\x8d\x2c\x3e\x92\x67\xa7\xf6\xaa\xc3\x7c\x26\xd5\x31\x40\xf4" - "\xb9\x90\x15\x77\xb2\x23\xaf\xa1\x6d\xd8\x39\x61\x5e\x87\x68\x9e" - "\x68\xae\x6c\xd4\xce\x41\x92\x35\xe2\x09\x0e\x9f\x61\xbe\x60\x3b" - "\x52\x3b\x24\xe4\x0f\x33\xf5\xcd\xd8\xc1\x8e\xbc\x8b\xb9\x42\x5d" - "\x04\x63\x6f\x60\x30\xfd\x9f\xe1\xc3\x0e\xb0\xde\x5c\xc0\xbb\x71" - "\x7e\xd9\xc5\xdc\x77\x80\x2f\x27\x59\x45\x3c\x17\x65\x71\x55\xcc" - "\xb5\xb0\x9d\x76\xdf\xb1\xb9\x9b\xab\xe7\x9c\x8c\x37\xd3\xfe\x70" - "\xce\xc0\x02\x7e\x92\xab\xa9\xdf\x86\xa2\x53\xf0\xb3\x57\x4f\xb4" - "\xa6\x04\x36\x2b\xa6\xf2\x4d\xcc\x02\x1f\x85\x45\x0e\xee\x6f\xf5" - "\xd5\xb0\x56\x47\x0d\xfb\x28\x50\xc5\x5c\xeb\xa1\xa7\x75\xf7\x7e" - "\x9c\x5f\x85\xbb\x2a\x31\xf4\xfc\xb2\xed\xdf\xd0\x56\xeb\xb6\x8f" - "\x8f\x7e\x4a\x33\xf7\x29\xb3\xfd\x5c\xbc\x57\xb5\xa4\x7f\x44\xd8" - "\xf6\x11\x2b\xea\xe4\x2a\x78\xbc\xc2\x47\xd0\x46\x09\xd5\x55\x0f" - "\x7f\x7e\x16\xb5\xcf\x1a\x4b\xe3\x37\x2e\xcb\x67\xe2\x8c\xd4\xb5" - "\xe6\xcf\xe8\xe3\x25\xb5\x67\x99\xc9\xb5\xe6\x3d\xf1\x2c\x74\x26" - "\x34\x5e\x77\x56\xbb\xb0\xc1\x84\x2f\x43\x77\x7e\x37\xee\x7c\xab" - "\x15\xe8\x63\x50\xf6\x9b\xe0\x65\xd4\xcb\xd7\x15\xea\xe5\x5b\x05" - "\x2d\xd8\x03\x78\x50\x9f\x8e\x2c\x97\x30\x69\xa1\x54\xd9\x67\x82" - "\x4f\x7a\x24\x7c\x5a\xe7\x03\x3e\xb0\x49\x57\xd7\xf7\xd6\x53\xdf" - "\x52\x09\x06\xaa\xde\x06\x70\x00\x67\x79\xa8\xbf\xfc\x2c\x8b\x73" - "\xad\x81\xcd\xba\xfb\x79\x73\x9a\xd1\xa4\x0e\x9c\x3a\x58\xd1\xcf" - "\x8c\x98\x37\xf0\x0e\x15\xe2\xbb\x80\x79\x01\xe6\xcc\x1b\xf3\x5d" - "\x3a\xfd\xad\xa0\xbf\x4c\xe0\x1e\xfd\x66\xd1\x7c\x95\x50\x1f\x12" - "\x69\xae\xea\xf1\x2b\xf1\xb1\xa3\x12\x3e\x5e\xb1\x3f\x13\xae\x84" - "\xd3\x77\x76\x54\x04\x68\xed\xa8\x42\xf6\x74\x27\xaa\x3b\xd4\x6a" - "\x69\xbf\xfc\xf1\xf2\x3d\xc4\xeb\xd7\x3c\x25\x7c\x64\xc4\x91\x7c" - "\x02\x9d\x03\xdb\x25\xee\xd2\xb5\x59\x75\x3a\xbe\x73\x0a\xfc\x4f" - "\xb8\x17\x1b\x84\x2d\xa5\x6f\x9b\x86\xeb\xdb\x28\xcf\x42\x0f\xbb" - "\x2e\x47\xae\x89\x16\x71\x07\x10\x74\x60\x3c\x3e\x8b\xf6\xae\x16" - "\xd8\xb0\xf2\xcb\xd3\x59\x9c\xc2\xbd\x71\x99\x66\xee\x0e\x34\x01" - "\x87\xe2\x04\xee\xcb\x6f\xc4\x1b\x7b\xcd\xb4\xb7\xb5\x51\xba\x51" - "\x4f\xc7\x1e\xaa\x92\xbc\x0c\x59\x7d\xd9\x46\x33\x2f\xec\x67\xd3" - "\x84\xde\x4b\x4f\xdf\xe8\x35\xb7\xd2\xce\x5f\x48\xb4\x1b\xbe\x75" - "\x50\x86\xd2\xa3\x68\xaf\x3c\x44\xed\xba\x28\x7f\xa2\x9e\x9f\xf7" - "\xa5\x1b\xdd\xf9\x4d\x62\x9d\xc1\xff\x9a\xd8\x23\x65\xfa\x84\x65" - "\xf9\x5e\xb3\x98\x33\x3d\x6d\x5d\xba\xd8\x9b\xe1\x87\x83\x78\x6f" - "\x2e\xfa\xd3\x25\xd2\x15\x92\x9d\x91\x6e\x89\x48\x33\xc0\xe7\x09" - "\xfc\x69\x46\xa4\x45\x51\x9f\x59\xe8\x9d\xda\xc6\x3e\x8d\x75\xb7" - "\x6c\x23\xce\x00\xe5\xfe\x2c\xda\xde\xc8\x99\xf4\xd1\x2b\xd3\x24" - "\x1f\xf0\x49\x7d\xa4\xdc\x8e\x73\x17\xb4\xad\xf6\xa5\x1b\x82\x7d" - "\xe9\x51\x68\x1f\x75\x41\xe7\x4a\x63\xa4\x76\xbb\x19\xfc\xc3\xf3" - "\xb2\x45\x0e\x8e\x7b\x5f\x54\xaf\xe8\x4f\xbe\x9f\xf1\xf8\x45\x63" - "\xfb\x3a\x29\x4d\xb6\xbb\x0a\x7f\x4e\x38\xfd\xe9\x3e\xd0\x94\xa0" - "\xa9\xbf\xca\xf6\x10\xf6\xe9\x4f\x67\x62\x4e\x83\xb4\xce\x83\x31" - "\xfd\x55\xf3\xba\x99\x52\x48\x6b\x47\x9e\x4d\x7e\x7a\x1b\xf8\xc4" - "\x22\x95\x73\x7a\x9e\x0f\xdc\x35\xf7\x92\x2c\xb6\xa3\xbf\x5a\xd8" - "\xc2\x24\xd8\x6d\x6e\x7f\x37\x6b\x29\xfe\x82\xb5\x04\xdc\xc5\x87" - "\xce\x7a\x8d\xd2\x26\xc6\x88\x7a\xef\xc1\xb7\x22\x5a\x2f\x19\xc1" - "\xfa\xf1\x65\x5b\x92\x97\x08\x76\x5f\xcb\xbd\xe0\xd3\x7d\xba\x8c" - "\x74\xfe\x31\xfc\x45\xf8\x44\x85\xbd\xa8\x5a\x1e\x8d\x38\x91\x45" - "\x7c\xd0\xce\xe6\x6d\x82\xae\xfa\xd3\xf6\x04\x1f\x4b\xd5\xea\x3d" - "\x23\xeb\xfd\x0b\x3b\x5f\xbd\xc0\xdb\x96\x6a\x69\x87\xa2\x26\x44" - "\x5b\x82\x54\x77\x30\x21\x3a\x8d\xf6\x9a\x22\xe2\x5f\x88\x1f\x39" - "\x7a\x07\xb5\x63\x69\x0d\xb4\x31\xf8\x55\xae\x55\x69\xbf\x3e\x63" - "\x65\x9a\xfd\x4f\xd1\x69\xf6\x97\xeb\x55\x6e\xb7\x90\xec\x06\xfd" - "\x6f\x11\xe8\x2c\xf4\xe9\x85\x41\x16\xed\xce\x23\x29\x2b\x3e\xd9" - "\x4e\x75\xfc\xe8\x7d\xe8\xda\x89\x56\x05\xb9\xd5\xf0\xd6\x80\x87" - "\x55\x10\xfd\x16\xfe\x41\xb7\x5e\xbe\x2b\x61\x0b\xbb\x95\x1b\xcc" - "\xc2\x7e\x8c\xf6\x17\x3b\xcd\x6d\xbe\xe8\xcf\x4e\x5f\x55\x84\xad" - "\x51\x14\xb5\xf5\x06\x6c\x8d\xb8\xc9\x97\x5e\x83\x3d\x93\xe6\x6c" - "\xd0\xf9\x17\xe2\xff\x3f\x11\xfb\x5d\x29\xf8\x22\x41\xe7\x8f\xde" - "\xe5\x8d\x57\xe0\xef\x1f\xb1\x52\x15\x75\x7d\xe0\x60\xc5\x77\xcc" - "\x28\xe1\x71\x74\x6e\x6b\xef\xa0\x8b\x97\x2a\x5e\xac\x23\xad\x6e" - "\x33\xd5\x1d\xe4\x65\x0a\xed\x9d\x47\x97\xca\xb9\x11\xcf\x56\x7c" - "\x0f\x0c\xe3\x6e\xe0\x5f\xaa\x6a\x86\xc0\x17\xfd\x25\x95\x78\x5d" - "\x57\x5f\x9c\xe2\xfd\x57\x6b\x31\xf1\x00\x47\x33\x3d\xca\xa0\xb0" - "\x59\xd5\x7d\x9d\x8e\x77\xae\xc6\x77\x5b\x63\xdd\x54\x09\xf1\xed" - "\x89\x3d\xec\xaf\x9f\x0c\x39\x99\x61\x98\xf6\xd6\x21\x92\x7d\xf8" - "\xee\xf4\xb8\xf2\xa9\x0c\x7e\x11\xa7\xf6\xb0\xa3\x6f\x04\x0c\x2c" - "\x91\xfe\x2c\xde\xcb\x73\x62\xa8\xde\x54\xe8\x74\x8f\x9c\xc5\x39" - "\xf3\x67\xd2\x2f\xc7\x2e\x96\xa4\x52\x7d\xd0\x25\x57\x4c\x65\x49" - "\xd0\x23\x53\x9a\x3d\x23\x28\xcf\x59\x74\x39\x71\xeb\x54\x96\x3c" - "\xb2\xdd\xa3\x35\x92\xcf\xfb\xab\xd8\xe3\x37\x78\xd9\x15\x8e\x5b" - "\x78\x07\xd5\x5b\xc9\x9d\x51\x9c\x5f\x6e\x35\x48\x7e\xf0\xb3\x8d" - "\xe6\x6a\x89\x77\xe2\x5c\x81\xf0\x0d\xe7\x36\x9a\xbe\x5a\x11\x3e" - "\x5e\x63\x87\x92\x70\x37\x4b\xa4\x29\x16\xc0\xd2\x22\xfa\xa1\xf9" - "\x65\x0c\x6e\xbd\x26\x13\x75\xa0\x3f\x19\x2b\xa5\xae\x1b\x3e\x1b" - "\x09\xae\xc2\x4e\xb8\x74\x17\x8b\x7b\x62\x17\xb3\x1c\x79\x50\x8c" - "\x6b\x9f\x5c\x8b\x46\x86\xfe\xaa\x25\x58\x67\x84\x13\xd4\x6f\xb4" - "\x07\xdc\x68\x0d\x9c\x71\x15\xe5\x71\xd5\xf5\x10\xfc\x93\x7c\x76" - "\xd2\x95\x7b\x80\x2d\xeb\x0c\x48\x3f\x63\x2b\x98\xb7\x8e\xea\xab" - "\x9b\xca\x2c\x54\x57\xbf\x7b\x35\x68\xad\xf5\x4a\x57\x6e\x03\xd5" - "\xfd\xd7\x18\xec\x47\x65\x04\x1f\xb9\x2f\xfd\xf5\x90\xdb\xdf\xce" - "\x10\xe3\xe2\x6e\x07\x0f\xa2\x1e\xca\x73\x9b\x18\xef\x6e\xab\x2d" - "\x43\xfa\xd5\x14\x63\x0d\x9d\x21\x68\xe3\x70\x9f\x15\xf5\x2d\x77" - "\x67\x12\xcf\xa9\x8d\x49\x87\xb5\xc4\xaf\xbf\x3e\xe9\xca\xdd\xcb" - "\x30\x3f\xc8\x4f\xef\xc5\xee\x5e\xca\x7b\x6a\xe4\xbc\x20\x0f\x7d" - "\x7b\x8d\xea\xfd\x3f\xe1\xb3\x31\x9c\xd9\x84\xf3\xd4\xd0\x78\x08" - "\x56\xbe\xdd\x04\x23\xa9\x33\xfc\xeb\x74\xf4\x95\xe6\x6e\x9a\x3b" - "\xef\x8b\xb1\xef\x44\xd2\xda\x27\xbc\xdf\xd2\x2a\xf4\x65\x7f\x8b" - "\xbf\x3b\xa0\x72\x49\xcf\xfe\xe6\x52\x89\x0e\x78\xe8\x17\xb4\x40" - "\xd0\x93\xeb\x70\x9e\xfd\xb7\x77\xcd\x8a\x9c\x5f\x8c\x05\x3c\xd3" - "\x58\x73\x1c\x71\x56\x61\x41\x5f\xf5\x39\xe6\x71\xc9\x76\x15\x67" - "\x50\xb0\xed\x1d\xb6\x32\x89\x7f\xbc\x92\xea\x7d\x4d\xe3\x21\xdb" - "\xb5\xfd\xb4\xbd\x2f\xa6\xbf\x9e\x3f\x66\x65\xba\x1d\x22\xad\xdf" - "\x9a\x0c\x69\x3b\x6a\x05\x8d\xaa\x33\xc8\xb5\x83\x3e\x6a\x65\x8f" - "\xca\xb3\xf1\xbf\x15\x53\xf9\xa3\x63\x8e\x37\x6a\x2a\xfc\x4f\x15" - "\xc1\x87\xa8\xb8\xab\x44\xb4\x8a\xf6\x83\x68\xb7\x6f\x88\xc9\xf3" - "\xfa\xf6\x9b\x89\xc7\x8f\xc6\x3d\x55\xbd\x6f\x17\x76\xae\xd0\xae" - "\xdd\x97\x6b\x5f\xa2\xcb\xd0\x3c\x8e\x60\xec\x34\x8b\x78\x07\xc4" - "\x77\xa9\xbe\xf8\xe4\x14\x6f\xfc\x2d\x99\x72\xdd\xb4\x3b\x78\xbc" - "\xa4\xb7\x19\x7e\x56\x8c\x71\x69\x7a\x89\x68\x8c\x99\xea\xa9\xd4" - "\xcf\xb7\xf5\xba\xc7\x8d\x21\xa2\x8f\x8d\xc6\x24\xfd\x1b\x24\xdb" - "\xc5\xd8\xe0\xa3\x47\x8c\xed\x73\x71\x07\xf0\x02\xc7\xd3\x2e\xe9" - "\x5b\x72\x8a\x6b\x2a\xea\xf8\xe2\xd7\xe8\x1f\xe6\x84\xe8\xc3\xa5" - "\x3d\xec\xf3\x4c\x1e\xfb\x44\xec\x85\xd5\xf9\x79\xb2\xac\xf3\x96" - "\xcc\x67\x88\x06\xcb\x3b\x8b\xb0\xd9\xf9\xa2\x8c\x97\xdd\x92\x09" - "\x19\xa6\x8f\xda\x23\xfc\x88\xa0\x43\x5f\x58\x30\x57\xd7\x1d\x60" - "\xa9\x12\x0f\xbf\x98\x00\x79\x57\xc6\x78\xfa\xbc\x81\xf0\x5e\xfa" - "\x97\x0b\xd9\xac\x2a\x62\x1f\x8b\xa4\xb1\x17\xd8\x47\x29\xd3\x24" - "\xcc\x22\xf9\xf1\xf3\xbd\xc2\x2e\x89\xfa\xbb\x21\xa0\xd3\xbf\xcf" - "\xf7\x72\xe8\xbb\x0b\x35\xbd\x27\x68\x59\xa1\xf4\x11\x38\xe8\xfc" - "\x62\x71\x48\xef\x89\x3b\xdd\x4e\xde\x8c\x7c\x34\xf7\x67\x90\x47" - "\xfa\x20\xeb\xd1\xee\x3b\x7f\xf1\x33\xed\x2e\xb3\x1d\xb6\x5a\x54" - "\x96\xe8\x1d\x17\xfa\x56\xc0\x00\x6d\x8b\xbe\x1b\xa0\xe3\xfc\xa2" - "\x26\xac\x67\xfe\x5c\xc4\x86\x90\xfe\x08\xbe\x68\xd0\x71\x84\xc6" - "\x1b\x2d\xe3\x7a\x7c\x3e\xfd\x30\x41\x19\x38\xd0\xc7\xad\xb1\x57" - "\xd5\x00\x27\xbf\x38\x16\x09\xa7\x65\x01\xb5\x48\xd2\xa0\xcf\x9b" - "\xb8\x58\xeb\x9f\x37\xfd\x30\x3f\xf1\x5f\xd7\xeb\xbc\x88\x84\xb3" - "\x85\xe8\xcb\x97\x01\x01\xeb\x92\x8e\x14\xf8\xdd\x7d\xac\x10\x7e" - "\xc4\xff\xeb\x3b\xf8\x6b\x0f\x94\x74\xa4\x05\x8b\xac\xf0\x4f\xcb" - "\xd4\x92\x8e\xcc\x2e\x07\x33\x64\xd0\x1f\xfc\x9e\x43\xc6\x23\x99" - "\xd5\xc2\x63\x89\x3f\xa1\x75\xbe\x79\x15\x33\xdf\x9b\x03\x1d\x83" - "\x3d\x11\xfe\xd4\xe1\x4b\x1d\xb1\x10\x82\x45\xf6\xc9\xf4\x3c\x85" - "\xf8\x39\x0b\x37\x75\xa4\xe2\x7c\x3e\xe8\xe4\x44\x8f\x8f\xc1\xa7" - "\xbb\xc1\xed\xf5\xb3\xcd\xa7\x98\x09\xfe\xda\x03\x65\x4a\x7b\xab" - "\xef\x4b\x21\xdf\x24\x38\x58\x22\xf1\x1f\xb8\x03\x60\x55\xe3\x15" - "\x17\xed\xf1\x4d\x72\xdc\x67\xb8\x1c\xb7\xec\x37\xfa\x2f\x68\x5c" - "\x49\x67\x66\xa1\xe8\xfb\x97\xcf\x04\xa8\x7e\xb5\xe4\xe4\x8a\x60" - "\xc9\xc9\x74\x79\xa7\xbe\x85\x15\xe6\xf1\x6e\xb7\xaf\x85\x64\xae" - "\x7e\x11\xbb\x0e\xe7\xff\x18\x23\xc6\x87\xb6\x3f\x3e\x7b\x4a\xf0" - "\x5a\x01\x7a\x2f\x5a\xad\x95\xe9\xa5\x32\xbd\x2d\x6c\xa8\xe4\xa4" - "\x18\x7b\xab\x4f\x96\xcd\x10\xcf\x54\x3e\x12\x0e\xda\x98\x43\x70" - "\xa0\xb1\x63\x7c\x18\x7f\x00\x30\x21\x18\x68\x63\xb5\x0e\x6b\xe3" - "\xc4\x18\x3f\xa2\x5d\x67\x17\x8d\x93\xc6\x2a\xc6\x39\x4c\xe3\x6c" - "\xce\x61\xcc\x5f\x9e\x9c\x7a\x2e\xf6\x64\x3a\x64\xd4\xa2\x4f\x88" - "\x87\x2f\xa8\x64\x24\x8b\x1a\x5f\x2e\xac\x34\xec\x24\xde\xa4\xd0" - "\x4b\x32\xa9\x97\x77\xc3\x86\xd7\xed\xa0\xbf\x40\x0d\x03\x8f\xa3" - "\xf3\xeb\xd4\xb6\xf5\x63\xf5\x04\x2b\xec\xe6\xdd\xc4\x9b\xfa\xdd" - "\x01\xca\x93\x43\xe3\x27\x19\xb6\x4b\xeb\x3f\xf2\x6e\xfe\x4e\x8e" - "\xcb\xbc\x9a\x25\xbe\xf3\xf3\x12\x83\xbb\xbd\x84\xe9\x63\xb9\x8f" - "\xf2\xd1\x78\xac\x54\x57\x3c\xc6\xa3\xd2\x38\x77\x53\x3f\xfd\x11" - "\x63\x3a\xd2\x0b\x3b\xe2\xcf\x58\x6c\x1a\x53\x76\x9d\xa6\x71\x9c" - "\x66\xd6\xca\x42\xe2\xbf\x7e\x0a\x7e\xf1\xd8\x91\x8b\xd2\x59\x92" - "\x87\xfd\xd7\x51\x49\xe3\x85\x2f\xe8\x4b\x7a\xd8\x97\xfd\x21\x7f" - "\xcf\xf0\xa1\x1f\xaf\x1c\x03\x1e\x09\xbf\xcf\xd8\x33\x06\x09\x67" - "\x70\x4e\xbf\x81\xda\x18\xb4\x4f\x11\xfd\x71\xce\x87\x9d\x70\x1c" - "\xbd\x23\x76\x14\xee\xab\x2a\x54\xae\x9d\x13\xcc\x50\x3f\xf1\x73" - "\x4d\xf8\x05\x0c\xc7\xb4\xb9\x7d\x85\x2d\xa0\x36\xaa\x20\x7f\x1f" - "\x2c\xf4\x1a\x1e\x7f\x85\x25\x5f\x18\x4d\xf9\x2a\x69\x3c\xfa\x0d" - "\xfd\x2c\xea\xa3\xb1\x4d\xee\x61\x5f\xc7\x8c\x5c\x63\x36\x41\xcb" - "\x24\x1d\xfc\xaa\x0d\xfa\xcf\x0b\x6c\x57\xf0\x70\xb0\xb1\xb8\xc0" - "\x72\x47\xf5\x7e\xd0\xf3\xb8\xf7\x2d\x2e\x1c\x0e\x5f\x27\x8f\x57" - "\x57\xd9\xb3\xc2\x46\xb2\xa8\xfc\x59\xa2\x17\xc4\x2b\x1c\xb6\xe2" - "\x2c\x85\xf6\xce\xbd\x3e\xb6\x6e\x0f\x43\xfc\x99\x78\x77\xe0\x2e" - "\x76\xb8\x26\x85\xd5\x9e\x85\xcf\x38\xfb\xe4\xa7\xcf\xd2\x5c\x6a" - "\x34\x04\x3c\x29\xf4\xc8\x7c\x9d\xdd\x52\xf1\xac\xce\xc3\x7f\xdd" - "\x5f\xd0\xcf\x0c\xb6\x35\xe2\xd9\xb7\xd8\xc6\x03\x55\x06\x35\xa7" - "\x06\x7e\xcc\x13\x66\x3b\xe0\xc7\x5c\xf7\x0d\x2e\x78\x9f\x7c\x5a" - "\x73\x7d\xd6\xd8\xb2\x5c\x96\x8c\x78\x06\x66\xaf\xe4\xe5\xe4\x7e" - "\xed\x49\xa2\xfe\x59\x34\x7f\xe1\x16\xe9\x2f\xfc\xab\xd5\xb0\x39" - "\xd7\xbe\xdf\x13\x24\x19\x46\xd4\x9b\xcb\x92\x6a\xce\x32\x3b\xf8" - "\xa0\x8c\x13\x92\x67\x83\x5c\x78\x57\xaf\x99\x07\xff\x6e\x67\x7b" - "\x7a\xc2\xf1\x0e\xbc\xeb\x10\x23\x81\x5b\xc7\xb3\x9f\xae\x98\x22" - "\xec\x09\x84\xaf\x5d\x9c\x33\xd0\x3b\xab\x7a\x8a\x19\x0f\xc3\x36" - "\xb1\x5e\xde\xc3\x3b\x1c\x90\xf6\xbe\x83\x4e\x4f\x93\xee\x07\x7e" - "\xdc\xf3\xf2\x52\x29\xef\xa8\xd1\x24\x7f\x79\x07\x5d\xd2\x07\xe9" - "\xf1\x38\xf7\x36\x35\x42\xc6\xf1\x9c\xc2\x37\xa4\xc1\xaf\x5b\xaa" - "\x80\xe5\xf1\xf9\x90\x7b\x34\x99\xf1\x1d\x5b\x28\x4d\xf2\x30\xc2" - "\xe6\xda\x2a\xcf\xff\x68\x6f\x4a\x18\x74\x1e\x4f\xd3\xf7\x33\xec" - "\xeb\xd2\xd7\xeb\xf1\x2c\x8f\x72\xae\xfa\x3c\xfd\xb3\x68\x36\xe2" - "\x38\xbb\x49\xa5\xfc\x55\xfa\xfe\x26\xce\x70\xb7\x4e\x5d\xb4\x6e" - "\x23\x9b\xf6\xaf\x97\x99\x18\xce\xff\x28\x6f\xb7\xdc\x77\x8f\x1f" - "\x0a\x9f\x11\xa4\x0a\x78\xc3\x47\x81\x90\x31\xe0\xfb\x53\xc6\x34" - "\xe8\xd5\x7d\x80\xca\xfd\xf7\xf8\xe7\x11\xed\x04\x42\xfb\x28\xb5" - "\x01\x1b\x74\xd4\x2f\x79\x93\xe3\x07\xc5\x5d\x4a\xca\x27\xf7\xd7" - "\xe3\xe3\xca\x6d\xf0\x43\x05\xf8\xaa\x9a\x3c\xe9\xee\xfd\x56\xc2" - "\x37\x9f\x45\xcd\xab\x62\xd6\x77\x0a\x3d\xc6\x04\xe9\xa3\xdb\xdc" - "\xc1\x3a\xee\xc2\x77\xe0\xba\xeb\x3a\xe8\x03\x3b\xf6\xbb\xb1\x6f" - "\x0f\xa7\xc7\xdd\x0d\x59\x5f\xf0\xe2\x1d\xd5\x73\xa9\x1c\xa5\x4d" - "\x7e\xfb\xb4\xdf\x58\xb1\x89\x25\x4b\x5f\xaa\x1d\xc2\x47\x17\xee" - "\xac\x5f\x95\xc8\xac\x57\x55\x31\xfb\xa0\xb3\xc3\x45\xf2\xa5\xd0" - "\x77\x8b\xf6\xcb\x17\x55\x22\x9e\xc3\xab\x43\x9e\x09\x72\xae\xbe" - "\xb9\x97\xde\xed\xe1\xf7\x8e\x73\xda\xf9\x10\xf1\x39\xdf\xac\xa8" - "\x3b\x2d\x6d\xe9\x85\x7e\xa9\x74\x8e\x25\x6c\x7f\xf0\xcd\xbd\xb2" - "\x2f\xdf\xdc\x7b\xd8\xc1\xa0\x3b\x3f\x5a\x2b\x7c\xb3\x7f\x43\x3c" - "\xca\x71\x87\xa6\x8f\x69\x13\x78\x05\x7e\x77\x3b\x64\xb0\x6f\x5d" - "\x65\x94\x0f\xfb\x04\xf1\x47\xa9\x82\x87\x27\x5e\x57\x25\xfc\x89" - "\x18\xff\x87\xd0\x37\x8e\x49\x13\x77\x31\x26\xca\x94\xcd\xce\x14" - "\xf6\x2c\x65\x8b\xba\xe9\xd7\xc4\xcb\x68\x6d\xef\x82\x8f\xa3\x39" - "\x36\xfa\xb5\xd0\xaf\x95\x7e\x13\xe9\x7b\x1b\xf0\x92\x64\x58\x2b" - "\x62\x54\xf6\xc5\xcf\x4e\x1f\xef\x5e\x14\x60\xe3\xde\xf6\x6f\x4c" - "\xda\xec\x75\xa6\x22\x3e\xe1\xb2\x3d\x8c\xad\x0b\xf0\x21\xdb\x15" - "\x88\x31\xd2\x99\x5a\xb4\x07\x67\xe9\x9d\x89\x23\xcf\xd2\x3b\xe7" - "\xd3\x1f\xbd\x75\x36\xd3\x9f\x9f\xfe\x52\xc3\x7f\x27\xe6\x0f\x3a" - "\x3b\x53\x09\x8e\x82\xc7\xba\x30\x9a\x88\xf2\x34\x0f\x90\x8b\xe2" - "\xa3\x99\x1c\xef\x2d\xa9\xf4\x6e\xe2\xf1\x8b\x8a\xb5\xf1\xa6\xd0" - "\xbb\xc5\x56\x44\xfb\x5a\x3c\xc1\x64\x2a\x8d\x39\x7e\x51\x37\xc6" - "\x8b\xfe\xf6\xc5\xd3\xbe\x16\x71\x27\x0c\x75\x62\xfc\xde\x78\x2a" - "\x47\xb0\xe4\xb3\x2b\x2a\x75\x78\x6a\x70\xc2\x7d\x19\x43\x1f\xd5" - "\x21\xf9\x20\xca\x4f\x75\xe8\xf9\x43\xb0\x9f\x0a\xff\x04\x34\xa7" - "\x94\x8f\x64\x62\x93\x7e\xdf\x6c\xd0\x79\x22\xf9\xdd\xd5\x4c\xf3" - "\xe7\xd1\x99\xea\x8b\x28\x0b\x9f\x0a\x63\x95\xa7\x36\x4d\xb2\x4d" - "\x3b\xc9\xdd\x9d\xb7\xc9\x76\x4f\xd8\xc6\x5b\x4b\x85\x33\x89\xbf" - "\x23\xae\x77\x9e\x94\xfb\x16\xba\xa7\xf9\x98\xbb\x46\xa5\x3d\x7f" - "\x4e\x6a\x6a\x21\x77\x75\xb1\x13\xc7\x5b\xfd\xdd\x17\xb8\x1f\x9e" - "\x10\xfe\x42\xf8\x50\x31\x73\x17\xdc\x20\xce\xb3\x4e\xb3\x6f\x27" - "\xb9\xbd\xe2\xce\x39\x3d\x77\x05\xf1\x1d\x67\xe8\xd8\x1b\x48\xc6" - "\x0e\xc5\xc9\x50\x29\x6f\x2d\xd2\x29\x0d\x3e\x49\xea\x22\xbe\xf1" - "\xf2\xd9\xda\x39\x4d\xd7\x87\xe0\x2d\x44\x7f\x03\xff\xec\x42\x9f" - "\xd5\xd2\xd9\x56\x8c\xa1\x88\xe4\x3f\xc4\x06\xc5\x9a\xb0\xad\x87" - "\xae\xb0\xeb\xd7\x84\x77\x5c\x2d\x9b\x6d\xbd\xb0\x31\x74\x89\xbb" - "\x92\x45\x01\x7e\xda\x1b\x3f\xdb\x0a\x9e\xa4\xa2\x70\x82\xe9\xf6" - "\x1a\xee\xea\x4b\x98\x43\xb4\xac\xab\xf9\xdd\x7c\x39\x37\x17\x58" - "\x6f\xb3\x3e\xf6\x5a\x6d\xec\x94\x26\xce\xa8\xe6\x55\xcb\xf8\x21" - "\x1e\xf6\x2d\x1b\x57\x67\x45\xf3\x0c\x7e\x80\xf6\x86\x73\x12\x16" - "\xdf\xa6\x85\xf6\x86\x0b\xea\xc7\xb7\xe3\xfa\xf2\x8f\x68\x63\x58" - "\x6b\xa3\xe1\xbf\xd9\x46\xc3\xf9\xda\x90\xe7\xe7\xdd\xa9\x17\x2e" - "\x3b\x76\x0b\xbf\x3a\x44\x3f\x53\x24\xcd\x3c\xf9\x5a\x90\xe4\xb7" - "\x40\xdc\x2d\xa9\xe0\x6d\x60\x2b\x8b\x58\x2a\x81\xd2\x68\x76\x24" - "\x7f\x88\xb9\xd6\x7f\xca\x3a\x59\xb7\xf0\xdf\x77\x24\x0f\x32\xdb" - "\xa2\xe2\xe1\xf2\x39\x95\xc3\x86\x6f\x2b\x01\xef\x3d\x34\x0f\xbb" - "\x23\xf0\xac\xd5\xf7\x29\x73\x67\x42\xbf\xda\x06\xbd\x76\x31\x8f" - "\xbf\x25\x55\x25\xda\x40\x3c\x7a\x50\xc0\x83\xf8\x17\x21\x6f\x91" - "\xcc\x26\xe4\x2d\xaf\xf0\x99\x1c\x2f\x62\xa4\x38\x5f\xc9\x83\xee" - "\x3b\x38\x9c\x6e\x1b\x74\xb2\x34\xc4\x4e\x81\xde\x99\x9b\x7c\x8e" - "\x65\x81\x28\x2e\xe4\x29\xe2\xfd\x11\x3b\xc5\xed\xf3\xb0\x20\xf1" - "\xd1\x35\x03\x2c\xb1\x86\x78\x4f\xa2\xd9\x16\xd0\xf5\x3a\x2d\x7e" - "\x4a\xd9\x40\x38\x7e\x4a\x2d\x74\x3d\xed\xf4\x3c\xc0\x8c\xc1\xb2" - "\x64\xfb\xee\x01\x96\xb4\x67\x3d\xb3\xef\x86\x2e\xef\xa4\xe4\x7d" - "\x84\x6d\x3b\x62\xa9\xac\xb5\xe3\x2c\x21\xcc\xfb\xc0\x47\x42\x98" - "\x6e\x19\x85\x0e\xe4\x82\xe0\x7d\x52\xec\x83\x81\xd2\xd9\x99\x81" - "\xb8\x45\xdd\xc3\xe5\x76\x0b\xcd\xc1\x41\x82\x5f\xf2\x58\x73\xab" - "\xdb\xc8\x54\x45\xc4\xbf\x79\x37\x49\xd2\x77\xaa\xcb\x37\x1e\x4e" - "\x04\x77\xa7\xb3\x79\xbd\x2c\x45\x9e\xdb\xc7\xd0\x9e\xd8\x93\x0e" - "\x9b\xc6\xc2\x47\x98\x35\xb8\x7b\x85\x52\xf4\x02\x8b\x72\x07\x52" - "\x19\xfe\x0a\xbf\xe3\xdd\xf3\x56\xb3\x14\x9c\x3f\xe0\xac\xc4\xf6" - "\x98\xc8\x7f\x75\x52\x01\x4b\x89\xac\xfb\x91\x8d\xb9\xab\xae\x4f" - "\xf9\x45\xb6\xed\xc1\x55\xb9\x8f\x6c\x58\x99\x9b\xcd\x96\x48\x53" - "\x10\xe1\x8e\x7e\x23\xec\x40\x36\xac\xca\xcb\xb1\x3d\xf0\x68\x6e" - "\x6e\xf6\x9a\x3c\xdb\x5d\xb7\xa7\x7d\xdf\x27\xe9\x6e\xeb\x5e\x9c" - "\xf5\x48\xbb\xc0\xde\x18\xfe\xdc\xb5\x03\xe5\x88\xaf\xb5\xe5\x8e" - "\xe5\xe6\xc0\x12\x9b\x8c\x73\xd4\xbb\x02\xb6\xb8\xbc\x28\xbd\x5a" - "\xf2\xa9\xbd\xf7\x4a\x79\x6a\xd8\x2e\xef\xd1\xf5\x4a\x3f\x80\x7d" - "\x4b\xa6\xc9\x35\xf5\xf7\x9b\xa3\x1c\x0c\xcf\x8f\xe0\xd9\xec\x60" - "\x25\xae\xa9\x38\x0f\xff\xbb\xf0\xd1\xc8\x77\x2f\x55\xf4\x7c\x7a" - "\x1e\xed\xbb\xf0\x3b\x5d\x0b\xbf\xba\xce\x9e\x2c\x82\xcf\xe4\x41" - "\xe7\xdf\x97\x7b\x0c\x9e\x66\x8d\x47\xe8\x96\x36\x88\xbd\x2b\xe0" - "\xa3\x93\x3f\x77\xf9\x80\x56\x4f\x29\xb5\x77\x11\xe5\x2d\xf6\xb0" - "\x1e\x93\x66\xab\x38\xa3\x43\xeb\x97\xb4\xa9\xe8\x59\x2f\x6d\x2a" - "\xfe\xbe\x37\xe2\x2e\xbc\xf0\x35\x81\xbd\x51\xe3\x49\x07\xb5\xfa" - "\x9a\x75\x9a\x40\xf9\x8f\x12\x5f\x57\x7d\xe1\xb4\xf0\xef\x52\xfe" - "\x19\xe1\x7b\xa9\xf7\x8e\x91\x3e\x4d\x74\xb8\x59\x7f\x23\x75\xf1" - "\x12\xae\x34\x86\x43\x12\x4e\x22\x7d\x5a\x0f\xbd\xa3\x9c\x87\xf5" - "\x4e\x1b\x8d\x5f\xa1\x19\xbf\x73\xcd\x03\x6b\x1f\x71\xac\xcc\x5b" - "\x75\xff\xaa\xd5\xab\xf2\x36\x8a\x2b\xfb\xc9\xe2\xbf\x7f\x9a\x95" - "\xb5\x7c\xb4\xff\x79\x3b\x74\x32\x9a\xdf\x6a\x1f\x6c\x20\xa4\x5e" - "\xac\xf7\xbb\x80\x93\xdd\x7a\x61\xe3\xec\x15\x7d\xad\x11\x7e\x3c" - "\x4e\x31\x8f\xe2\xdf\xa7\x9d\x8f\xf4\x6a\x73\x25\xbe\xf7\xc5\x2d" - "\x6a\xb3\x4d\x65\x0b\x3b\x98\xb7\x01\xe7\x62\x04\x6f\x1b\xf6\xcf" - "\xb2\x4d\xd8\xe7\xda\xd8\x91\x00\xed\xa5\xe2\xac\xfc\x74\x3c\x60" - "\x06\x1e\x92\x60\xb4\xb7\x83\x9d\x7a\x54\xc0\xe2\x8c\x75\xaf\xf0" - "\xcd\x71\xc6\xfa\x1b\xe0\x22\xfa\xac\xf2\xf4\xdd\x9c\xa7\xef\x52" - "\xcf\xe4\xec\xe6\x67\x72\x76\x85\x7d\x5f\x9e\xf2\x50\xd9\x03\x54" - "\xf6\x04\x62\x5b\x95\x9f\x66\x07\x40\x27\xf1\x6e\xce\xb3\x90\x6c" - "\x38\xc7\x8a\xfe\xb8\xbd\x29\x4c\xde\xd7\x3f\xe5\x71\xfb\x6e\x60" - "\xc4\x7b\xda\xc4\xfd\x50\x71\xbe\x47\xfc\x21\x95\x73\x53\xbf\xdc" - "\xde\x21\xc8\xd0\x56\x95\x78\x44\x0f\x3b\x65\xa1\xfd\x36\x1d\xf5" - "\x62\xcc\x7b\x08\x27\x61\xa7\x41\x63\x27\x3e\xa6\xa7\x46\xbb\x1b" - "\xdc\x59\x46\xe9\x80\xc1\xc8\xf9\x3f\x3d\x13\xf3\x48\x30\xfe\x3f" - "\x61\x1c\x38\x2d\x7c\x44\x2d\xed\xe4\x5f\xf3\x92\x8e\x62\x39\xdf" - "\xa7\xef\xd4\xd2\xce\x84\xfd\x05\x9c\xbe\x97\xde\x87\xe9\x4f\xe5" - "\x25\xdf\xd4\x47\x9c\x4d\xe3\x9b\xf0\xe9\x05\xbb\x13\xc7\x26\x76" - "\x05\x95\x7f\x52\xe2\xde\x37\x75\xde\xa2\x9c\x28\x2a\x13\xc4\xfd" - "\x56\x0d\xbe\xaf\xb9\xb7\x9d\xd6\x6d\x3d\xa8\x4f\x67\x7e\xe2\x7a" - "\x30\xc0\x44\xfc\xfa\xce\x80\xb0\x87\xd4\x7c\x44\x28\xaa\xb3\x17" - "\xf6\x6a\xf0\xaf\x16\xb7\x67\xb2\x8c\xfd\x30\xe8\x3c\xdd\x19\xb2" - "\x49\x8a\x93\x3c\x23\xf8\x36\xc4\xf4\xc3\xfa\x01\x0f\x88\x3e\x61" - "\xfd\x50\xdd\x16\x9c\x73\xcb\x75\x74\x66\xda\x7f\x6f\x1d\x9d\x11" - "\x38\x4f\xfd\x3e\xc8\x0d\x45\x7c\x5e\x29\xcb\x14\x76\x08\x01\x1f" - "\xee\x25\x1b\x69\xef\xc9\x92\x34\xc9\x5b\x26\x6c\x55\xd6\xf7\x22" - "\x9e\x71\x71\xdd\x10\x8b\x53\x4b\x7c\x39\xe0\xd5\x8f\x14\x08\xfb" - "\x0d\x13\x95\x3b\x08\xfb\x0e\xd8\x18\x26\x88\x98\x91\x9f\xb2\xba" - "\x7e\x66\xec\x64\x67\x6a\x70\x9e\x14\x86\xf5\x99\xef\x70\x7e\xc8" - "\x77\x1e\xb7\x9a\x0b\x0c\x25\xa8\x43\x1d\x38\xb5\x40\x2f\x87\xd8" - "\xe4\x28\xd7\xc1\xce\x7c\x26\xca\x21\xaf\xf0\x25\x62\x59\x41\xbc" - "\x5a\x26\xf2\x07\xe8\xbd\x56\xb5\xa4\x71\xda\x53\x82\xeb\x03\x07" - "\xe9\xdb\x72\xb5\xd4\x6e\xa1\xb4\x74\x71\x8e\x31\x6c\xc5\xf9\x26" - "\xe1\x9c\xe2\x75\x7b\xbe\x75\x89\xfe\xe0\xae\x72\x1e\xed\xbf\x42" - "\xb6\xf1\x5e\x5d\x7b\x92\x19\x1d\x0f\x62\x3e\xbd\xd2\x07\xf0\x69" - "\xdd\x1f\x9f\xf7\xad\xbe\x9d\x27\xd3\xfb\x08\x5f\x7d\x06\x13\x3b" - "\x6c\xf5\x63\xdf\x6f\x3b\x6c\x1d\xa2\xf9\xf1\x6e\x23\x7a\x59\x22" - "\xf9\x6a\x6f\x68\x6d\x02\x47\xa3\xac\x96\x22\xfa\xbe\x57\xb7\x69" - "\x02\x9e\x96\x0a\x1f\xef\x67\x0a\x00\x37\xc2\xed\xf9\x47\x56\x87" - "\x7d\x2c\xf7\xc9\x7b\x7d\x16\x2a\x13\xba\xff\x1b\x1c\x50\x5b\xa8" - "\x1f\xf0\x45\x93\x1f\x5c\xaf\x1e\xc3\xf9\xfb\xdd\xfd\x2a\xc7\x9d" - "\x07\xdc\x5f\x81\xec\xb4\x2c\x9f\xf7\x41\x16\xc4\x5d\x31\x9c\xbd" - "\xe3\x2e\x7d\x78\x9d\x7c\x97\xa4\xdf\xa9\xc7\x1a\x41\x1f\x70\x1f" - "\xac\xfc\x21\xb1\x4e\x61\x03\x1b\x27\xce\x1f\xa2\x1e\x3e\x79\xb7" - "\x8f\xea\x3c\x2d\xce\xcd\xfa\x6a\xb5\x7a\xe0\x33\x8b\xea\xc8\xd1" - "\xeb\x50\x61\x3f\x9c\x2b\xec\xf7\x3c\xb2\xbc\xb4\x35\xba\xdb\xa7" - "\x8a\x7b\x3c\x28\x2f\x6d\x80\xbe\xab\x09\xd9\xa0\x8a\xbb\x35\xdf" - "\x1d\xd0\x6d\xcc\xe8\x39\x74\xff\x0b\x30\xed\x2b\x9d\x63\xf5\x11" - "\x7d\xf0\x95\xce\x4e\xa7\x6f\x44\xff\x4f\xb6\x9d\x57\x1f\x02\x3f" - "\x0a\x8f\x32\x83\x1a\xeb\xab\x82\x8f\x0c\x58\xdb\x4b\xbb\xf7\xb3" - "\x37\x69\xfe\x32\xa2\x4e\xb3\xef\xbe\x0b\x9f\xc3\x07\x35\x1d\xf2" - "\xd9\x15\x52\x86\x39\xbb\x42\xe8\x90\xcb\xe7\xb0\x97\x36\xf9\x0d" - "\x07\x37\x79\x0c\xd2\x1e\xef\x6c\x9a\x87\x0d\x6d\x0b\xdb\x82\x9e" - "\xb5\xa0\xae\xb1\xfd\x8a\x0c\x15\xcb\x3a\xfb\x84\xff\x90\xb0\x4e" - "\xa0\x4f\xdc\x7f\xc2\x99\xb9\x0a\xfe\x31\x21\xda\x02\x1b\x29\xb7" - "\xe3\x2c\x74\xc9\xd1\x52\x3f\x21\xf3\x68\x76\x9e\x17\xf7\x8c\x7c" - "\x9f\x8c\x77\x09\xb3\xb3\x1e\xfd\x5c\xaa\xdc\xa0\x22\xfe\x20\x2f" - "\xaa\x27\x7a\xe9\xf0\x09\x3f\x0d\x6e\xe2\x47\xa9\x0d\xee\xc8\xc5" - "\x5d\xca\xbe\x4b\xe0\xbf\x41\xae\xcd\xbe\x1d\xa2\x4f\xce\x5b\x79" - "\x11\x64\x32\x2f\x62\x1d\x9d\x65\x94\x6f\x12\xe5\xbb\xad\xa9\xa0" - "\x17\x36\x66\x2b\x10\xc7\xb6\x53\x6b\xdb\x1b\x33\x54\x7c\x55\x1c" - "\xcb\x1c\x74\xf6\x2d\xf7\xb0\xa6\x9a\x0b\xa7\x1b\x7d\xcb\xcf\xc7" - "\x9f\x4b\x7e\x31\x95\x8d\x27\xe3\x43\x87\x73\x1d\xb5\x7f\x17\x47" - "\xff\x7d\xb7\x05\x0c\x7e\x36\x6c\x98\xc8\xaf\x2d\xce\x67\x01\xe7" - "\x44\x1e\xdc\x44\xf3\xd5\x67\x25\x19\xb0\x85\xb5\x4a\xbb\x1b\xd8" - "\x0e\x98\x0b\x7d\xfc\xac\x3b\xd0\x80\x33\x04\x2f\xcd\x15\xd1\x2d" - "\xdf\x8f\xdc\x81\xb7\x18\xec\xbb\x41\x6f\x3a\x98\x6f\x16\xfa\x75" - "\x9d\xa3\x98\xcd\x3d\x8d\xef\x7d\x9d\x72\xcf\xf7\xa5\x6a\xbf\x16" - "\xf8\x07\x8e\xec\xd3\x3f\x3d\xba\xe6\x01\x38\x99\x9e\xbb\x34\x7b" - "\x7d\xf6\x6a\xdb\x4f\xe1\x82\x7a\xb4\xdd\x68\x38\xce\x61\x7f\x1c" - "\xf6\x57\xf0\xef\x88\x77\x78\xbe\x58\x87\x7a\x9c\x43\x5a\x73\x49" - "\xd0\x79\xff\x6f\xc6\x3a\xd4\xf9\x73\xc4\x39\x0c\x9f\xff\xf4\xb7" - "\x84\xd6\x80\xfa\xce\x20\xde\xc5\x9e\xee\xf4\x2d\xc5\x3a\x92\xfb" - "\x4b\xff\xe2\x48\x5f\x45\x92\x3f\x53\xbc\x94\xbe\x42\xbf\xf3\x4a" - "\xb8\x18\x47\xef\xab\xc3\x77\x6c\xfa\xf3\x69\xbe\x1b\xe5\xfa\x15" - "\x79\x4b\x74\x3b\x09\x2d\xa6\xbd\xb0\xeb\x50\xb7\xdf\x54\x20\x75" - "\x93\xfd\x65\xb5\xea\x44\x93\x3c\x17\xeb\x6f\xd0\xef\x70\xc9\xb5" - "\xf9\x8e\xb6\x36\xfb\x5b\xce\x67\xcb\x12\x5e\x1b\x03\xa6\xf0\xba" - "\xfe\x5a\x2b\x3b\x60\xfa\x21\x3b\x18\x4d\x46\xbc\xa4\x87\xf9\xa7" - "\x43\x5f\x29\xef\x6c\xfb\x85\x7f\x21\xe9\x8f\x63\xf0\xb8\xf6\x4c" - "\x6d\x0c\x7e\xa8\x3d\x5f\x4e\xcf\xaf\x69\xcf\xc4\x2f\x0e\x3e\xaf" - "\x3d\xd3\x9a\x1d\xdc\xa2\x3d\x27\xd2\xf3\x2a\xed\x99\xf6\x8e\xc1" - "\x9f\x68\xcf\x53\xe8\xf9\x47\xda\xf3\x65\xf4\x3c\x53\x7b\xa6\x35" - "\x38\x28\xce\x0c\xa8\xef\x26\xea\x7b\xff\x85\xcb\xac\x03\x2e\x79" - "\x6e\x3d\xc8\x88\x1f\xac\x92\x7b\x4f\x28\x2d\x91\x70\x3a\x4b\x87" - "\x2f\xa5\x37\xa2\x1d\x4a\x4f\xf6\x30\x4f\x5b\x44\xba\xe6\xbf\x6d" - "\x70\xb1\x87\x7d\xe7\x89\x48\xaf\xd1\xd2\x57\x90\xcc\xed\x8b\x48" - "\xaf\xd4\xd2\xf3\x88\x2e\xe6\x44\xa4\x6f\xd3\xd2\x4b\x3d\xec\xbf" - "\x8c\x11\xe9\xf9\x5a\xfa\x5e\xdd\x86\x47\x4b\x5f\xad\xa5\x1f\xf2" - "\xb0\x4f\x1b\x22\xd2\x33\xb5\x74\xa2\xff\xfd\xed\x11\xe9\x82\xae" - "\x48\x9f\xec\x66\x7e\xb8\x00\x6b\x6b\xd0\xef\x61\xed\x7b\x23\xf2" - "\x2c\x91\x65\xfd\x24\x4b\xfe\xad\x25\x22\x7d\xa1\x96\x6e\xf7\x28" - "\x73\x22\xeb\x4c\x19\x8f\x56\x29\xd5\x2c\x73\x3c\xbd\x3e\x64\x20" - "\x61\xcb\x2c\xf8\xec\x73\xd9\xb8\x13\x66\xde\xc3\x3b\x6c\x85\x9c" - "\x77\xb0\x73\x4b\x35\xdb\xdd\x74\xd8\x51\xca\xfb\x75\xe7\xe6\x6b" - "\xbe\x15\xbc\xe2\xce\xdd\x26\xa4\xf9\xdf\x14\xfa\x99\xfc\x62\xe9" - "\x2f\x5c\x8f\x3d\x03\xfd\x96\x76\xf6\x4f\x79\xe0\x2b\x16\xb6\xe0" - "\xbd\xd0\x81\xbb\xf3\x86\xa4\x2f\x79\x92\x83\x91\x06\x3d\x0f\xe0" - "\x11\xa9\xcf\x92\x74\xff\x5c\xb6\x3a\x84\x7b\xad\x52\x17\x86\xb5" - "\x88\xfc\xb0\x57\x8b\xcc\xeb\x61\xe7\x84\x5f\x8a\x28\xeb\xa4\xbf" - "\x0e\x3a\xcf\x2d\x0e\xdf\x27\xf2\xd7\x68\xe9\x9f\x51\xfa\x8a\x88" - "\xf4\x92\x71\x69\x3b\xd1\x41\x6e\x3a\x9e\x39\x3c\xc0\x7d\x81\x01" - "\xee\x2f\xff\x8a\xfa\xfd\xa0\xb0\x11\xbc\x22\x58\x72\xdc\x81\xfb" - "\x36\x88\x11\x1b\x58\xcf\xbd\xb0\x89\xa4\xf4\x8b\xee\xf6\x79\x89" - "\xc7\x18\xe4\x65\xf7\xc3\xfe\xb5\x9f\xe1\x6c\xb6\xa8\x17\xf1\x06" - "\xcd\x1c\xf7\xb8\x37\x9f\x62\x71\xb8\x8f\x53\xfb\x20\xbe\x7f\xc9" - "\xee\xca\xf1\xb2\x23\x39\x41\x56\x4b\x75\xef\xb9\x5f\xe7\x2f\xce" - "\x05\xc2\x77\x85\x8f\x43\xce\xbf\xa2\x48\xc4\xc4\x1e\x12\xbe\xca" - "\xcd\x5b\x60\x53\xb0\xc8\xcf\xdf\x03\x6f\x3c\xdb\x66\xde\xc2\x6c" - "\xb4\xb7\x2f\xa0\x67\x8b\xfc\xa3\x6f\x94\x3e\xde\x98\xe4\x5a\x1e" - "\xca\x93\x72\xf7\x71\x8f\xa4\x17\x43\x79\xfc\x45\xdc\x3f\x19\xca" - "\xa7\xb2\x7e\x6f\xfc\xec\x31\xef\xe5\x6c\xde\xc3\x0c\xc3\x3b\x89" - "\x37\x39\xdd\x68\x90\xf4\x69\x38\x4b\x35\x98\xb6\x40\xd7\x2e\xe2" - "\xe1\xee\xf4\xed\x3d\xb0\xc6\x6f\x38\xb2\xa9\x93\x3d\x76\x19\xb3" - "\xae\xf0\x1b\x28\xcf\xd0\x89\x84\x3c\xf8\x3d\x9f\x03\x3f\x11\x86" - "\xd7\xe9\xfb\xdb\x6b\x1a\x0d\x01\xc1\xaf\x0c\x67\x09\xfd\x6c\x89" - "\x2f\x1f\x7b\x88\xbb\x3d\x08\x5e\x3c\x8e\x78\xf1\x1c\xa2\xff\xa6" - "\xe0\x86\x9c\xc9\x81\x75\x39\x17\xed\xc9\x65\x71\xc1\x75\xf6\xc4" - "\xa7\x07\xd8\x02\x7d\xff\xd9\xb3\x9e\xf6\x94\x41\x6b\x6c\x05\xed" - "\x29\xd0\xfb\x24\x28\x16\x71\x0e\x8d\x67\xd5\xf0\x95\xa5\x76\xfd" - "\xf9\x63\x7b\x07\x37\xd8\x85\xbf\x09\xf4\x65\xac\xb1\x96\xee\x62" - "\xc6\xa0\x76\x2f\xb5\xf0\x04\x9b\x42\xfc\xb3\x21\xa1\x9f\xbb\x7a" - "\x56\x33\x03\xe2\x21\x17\x66\x0b\xdd\xea\x84\x23\x39\x01\xe6\xce" - "\xff\x82\x15\xe6\x62\x8e\x86\xdf\x04\x9f\x06\x7b\x66\xca\x6f\xe9" - "\x61\xc3\x1f\x9a\xfd\xb4\x67\xf8\x89\x27\x7f\x08\x72\xf1\xf0\x97" - "\xd2\xbf\x45\xc0\x86\x7b\xa4\xae\xdc\x45\x48\x3b\x57\x74\x42\xd8" - "\x0d\xad\x90\x6b\x6b\xf8\x28\xde\x8b\x70\x4f\x36\xf6\xdc\xde\x57" - "\x86\xfc\x13\xa4\xfe\x6e\xf8\x33\xb9\x3f\xcc\xf6\x4a\xd9\x6e\xf8" - "\xe8\x78\xb8\xab\x96\x9c\x28\xe6\x88\x05\x59\x03\xfe\x95\x7b\xc4" - "\x19\x3f\x7c\x06\xe4\xdf\xea\xe2\x44\xee\xa4\x2f\xa3\xc0\xf3\xea" - "\x8e\x13\xc5\xd2\x87\x64\x40\xde\xcd\x87\xbe\x7f\xc7\x89\x4a\x71" - "\xbe\xb1\xe3\x44\xbd\xd0\xf7\xef\x38\x71\x70\xeb\x54\xdc\x27\x08" - "\x54\xf7\xc5\x9c\x70\xd1\xef\xea\xbe\x58\xb5\x79\xdc\xfd\xa8\xa4" - "\xe3\xa0\xed\x0a\x96\x88\x73\xa6\x8c\xa0\xf4\xc5\x2a\xd7\x70\xb0" - "\x86\xef\x10\xdf\x66\x74\x38\x58\x94\xf4\x77\x1c\x38\x39\xaf\x86" - "\xd9\xa8\xaf\xf1\xdc\x74\x22\x53\xd8\x3d\x96\x9c\x70\xb8\x7b\x11" - "\xa7\x2a\xc8\xe4\x79\x60\x70\x1f\x8f\x39\x91\x29\xf3\x07\x7f\xd4" - "\xda\x4b\x63\x30\x9d\x48\x71\xfb\x4f\x69\x3c\x61\x70\x01\xf5\x31" - "\x85\x97\x9c\x48\x95\xf7\xcd\x83\x3b\x74\xba\x2a\x71\x34\xb8\x59" - "\xe2\x7a\xc7\x41\x09\xb7\xe0\x3e\x6d\xbf\x9a\x81\x67\xda\xbb\x53" - "\xa4\xfd\x4a\x30\x4f\xe7\x91\x3d\x5a\x1e\x94\xa1\x67\xcd\xcf\x67" - "\xb0\x8a\xc6\x9e\xac\x7d\x5f\x80\x34\x1a\x1f\xed\x59\x81\x36\x8c" - "\x6b\x3c\xda\x2a\x60\x51\xc0\xa2\xa8\xcf\x69\xb0\xf5\x06\x9f\xe2" - "\xf6\xdd\xea\x72\x8b\x39\xe0\xd7\xc3\xb6\x1f\xed\xc0\xdf\x10\xe8" - "\x26\xd5\x69\x44\x7d\xe1\xfe\xab\x97\xe8\x7d\x41\x7b\xf8\x46\x63" - "\x4d\x11\x72\x35\x8d\x19\x79\x30\xaf\x5d\x0e\xe8\xfd\xfa\x09\x66" - "\xb0\xa1\xe3\xa9\x80\x89\x84\x19\x9f\xa6\xc9\xf4\xda\x3c\xf0\x49" - "\x23\xe1\x21\xdf\x55\x13\xd1\x86\x5c\xd8\x52\xf1\x54\x0d\x7e\x5a" - "\x8c\x15\x55\xf8\xa2\x95\xdf\xd4\x5f\x47\x94\x9d\x1e\xca\x4b\xfd" - "\x06\x6f\x04\xbb\x04\x9c\x53\x49\x7c\x55\xdb\x22\xca\xb5\x65\x7c" - "\x47\x3c\x32\xf1\x90\x5b\x9f\x15\x31\x2b\x53\x06\x9d\x6a\x67\x18" - "\xde\xb2\x9e\x31\xda\xb8\x42\x6f\xc3\xc3\xd4\xbd\x7a\x3f\xe9\x59" - "\xdb\x83\xb9\x3d\x3c\x27\xea\x12\xbd\x1c\x74\x3a\x34\x47\x3e\xc4" - "\x8f\x1d\x27\x2e\x86\xe2\x26\xa8\xb4\x06\x6e\x75\x09\x7c\x64\xbc" - "\x1e\xba\x4b\x82\x6b\x9a\xc4\x21\xbe\x4d\xee\x85\xbc\x1e\x75\xe2" - "\xac\x51\xfa\x1b\xe5\xd5\x54\xaf\x76\x67\x89\x1f\xd0\xfa\x40\xf2" - "\x5f\x60\xef\x68\xb9\x6e\xd1\xca\x2c\x5b\xda\xf5\xe2\xce\xed\xdc" - "\x47\x1d\xb8\x4e\x9b\x15\x7e\x19\xc9\x73\x5b\xc2\x3e\xce\x10\x8b" - "\x5a\xf3\x71\x56\x32\xb4\x57\xc0\x5f\x61\x8b\xf9\x00\xaf\xc2\xdd" - "\x11\xbe\x9e\x57\x97\xd3\x1c\x16\xf5\xb3\x4b\x11\x17\xbb\xd0\xc1" - "\xbf\x85\xff\x3b\xa2\x97\x4d\x44\x3f\x9a\x0b\xfb\xd9\x44\xd8\x25" - "\x81\xfe\xc0\xee\x99\xc7\x50\xfa\x0e\x5f\x73\xe8\x1e\x9e\x62\x5c" - "\x88\xbb\xa3\xbc\x28\xdd\x40\xf9\x8f\x01\x1f\x60\xa3\xde\xa5\x18" - "\xa7\x51\xbe\x63\xf4\x2d\xaf\x0c\xed\x98\xfa\x6d\x41\xd3\x50\x41" - "\xd1\x29\x16\x2d\x62\x1c\xe6\xfb\xa1\x53\x33\x74\x28\xec\xd7\x3c" - "\xa6\xdf\x46\xe9\x09\x22\xdd\x4f\x6d\xef\xe8\xb7\xd1\xb7\x04\xfa" - "\x76\x9c\x7e\x55\xaa\x23\xbf\x9c\xfa\x5d\x78\x8a\x5d\x41\x7d\xe9" - "\xe6\x25\xfd\x36\xea\x67\x57\xd1\x23\x6c\x4a\xab\xa3\x1b\xf2\x1d" - "\xd5\xe7\x91\xb1\x1b\xa9\x6c\x87\xa2\xdc\x44\xe3\xca\x87\x4e\x84" - "\x7e\x0b\xca\xe8\xb7\x30\xc8\x12\x0a\x37\xd3\xbe\xb7\x99\xda\xc7" - "\xbd\x56\xaa\x07\x3e\x48\x64\x5f\x68\x6c\xd0\xab\x51\xbd\x9b\x7b" - "\x79\x17\xd5\xdd\x7d\xa4\x97\xea\xcb\x6f\x0f\xd5\xa9\xf1\xd4\x33" - "\x68\xbc\x97\xf0\x9d\xaa\x87\xfa\x54\x0d\xdb\x6d\x4a\xb3\x50\x9a" - "\x25\xc4\x0f\x2b\xc6\x49\xda\x73\x4c\x28\x6f\x51\x3a\x2b\x3c\xc7" - "\x84\x0d\xb5\x6d\x43\x14\xeb\x50\xa2\xea\xe1\x07\x2b\x5c\xa7\x61" - "\x3a\xea\x2b\xa5\xfa\x8a\xb2\x59\x0c\xd1\x6a\x13\xf5\x11\x31\xa2" - "\x8f\x0b\x38\x61\x8d\x29\x86\x69\x34\x96\x4a\x8c\x49\xa5\xb9\x2b" - "\xa3\xf5\x40\xe3\x51\x68\x3c\x31\x9b\x83\xa1\xbb\xba\x18\xd3\x24" - "\xc8\x73\x18\x97\x9c\xc7\xfe\x85\x34\xae\xc5\x9b\x73\xf8\x71\x1a" - "\x5b\xf7\x91\x9c\x76\x46\x7b\x8f\xb9\xd5\xd1\x86\x3b\x14\xc7\x25" - "\xdc\xba\x61\x83\xba\x90\xc6\xb9\x38\xe4\xab\x57\x89\x7a\x9e\xfa" - "\xde\x4d\xfd\x2a\xd5\xc6\x89\xb4\xaa\x10\x4f\xaf\x44\x3d\xa3\x3d" - "\xc7\x86\xf2\x7e\x7f\x9c\xa6\x88\x71\x52\x79\xe3\xcd\xa8\x4f\x1b" - "\x67\x2c\x8d\x33\xe6\xfb\xe3\x24\x7c\x5a\xcf\xb7\x69\xe3\x2c\xd1" - "\xc6\x69\xa0\x71\xc6\xd2\x38\xa7\x46\x8c\x73\xf2\xa8\x71\xa6\xd2" - "\x38\x97\xd0\x38\x3b\x22\xc6\x69\x19\x63\x9c\xa9\x1e\xb4\xb1\xa3" - "\x7f\x89\xf4\x0f\xc6\x1b\xc5\xfd\xf7\xed\x51\xa1\xfb\xef\x2a\xee" - "\x5d\x0e\x08\x1f\x44\x0d\xd0\xdf\x40\x6f\x04\x59\x0f\x77\x3c\x33" - "\x36\x96\x14\x0b\xdd\xcd\x14\xa9\x9b\x16\xfc\xd5\xf6\xa8\x15\xa1" - "\xbb\x1b\xcf\x8a\xd8\x35\x3e\xa4\x0b\x9f\x01\xb9\x4c\xe8\x1e\x97" - "\x6d\xdc\x50\x84\xf2\x28\x4b\xf9\x4b\x43\x77\xcc\x14\x83\x43\xea" - "\x43\xd5\x6e\x3c\xc3\x17\x96\x3c\x13\xe0\xcd\xe2\x4c\x60\x7b\x54" - "\x38\xfe\xd3\x7a\xde\x04\xb8\x88\xfb\xac\xe2\x3e\x28\x2b\xc9\x08" - "\x94\xe8\xf7\xd2\x7b\x29\x6f\x67\xc4\xbd\xf4\x5e\xd1\x87\x21\xe1" - "\xfb\x61\xc3\xb2\xc0\x06\x71\x3f\x7d\x70\xbb\xd1\x14\x6e\x5b\x29" - "\xd1\xda\xf6\xe0\xd9\x2b\x7d\xb3\x41\xc7\x66\x13\xf6\x36\xdb\x8d" - "\xf3\x75\x1b\x17\x8f\xc2\x1c\x58\xcb\x63\xc6\x79\xd9\x6e\x5c\x31" - "\xc2\x17\x94\x32\x01\x7e\xde\x91\x9e\x17\xba\x6b\xbe\xdd\x58\xfc" - "\x43\x77\xcd\x8b\xbc\x34\x4f\xb4\xde\x1c\x88\x79\xae\x18\x5b\xf8" - "\x8e\xa1\x02\x11\x2b\x45\x99\x30\x1d\xfd\xec\x50\x8c\xd8\x3f\xcc" - "\xe2\x3c\x48\x31\x7e\xa9\xd1\xe6\xb6\x65\xc1\x80\xd9\x43\x6d\x0a" - "\xdf\x52\xa1\x77\xe3\x51\xf8\xca\xa0\xb2\xf1\xc2\xcf\x39\xd5\x37" - "\x32\xbf\xf8\x5e\x3c\xea\x3d\x75\xd4\xbb\xcd\x47\x34\x6b\x3c\x5b" - "\x9e\xb2\xa9\x42\xc7\x9b\x9f\xb0\x85\x39\x8a\x4e\xb2\x28\xc2\xc5" - "\x13\xe8\x5b\x6b\xb7\xb8\xe7\x67\xe6\xce\x14\xe6\xee\x0e\x48\xbe" - "\x9d\xf8\xa5\x8e\x24\xca\x73\x92\x4d\xc1\x3d\x13\xc4\x92\xa1\xfc" - "\x3d\x22\x7e\x8c\x12\xfd\xc6\x8a\x47\x63\x99\xfa\x8b\xf4\x8b\xb8" - "\x61\x13\x78\x23\xd3\xcb\x43\x1e\xc4\x60\x51\x0a\x9f\x67\xd3\x40" - "\xa7\x08\x87\x3b\xb9\xe1\xb1\x83\x54\xa6\xf7\xa5\xa1\xee\x09\xee" - "\xc0\x17\xcc\x41\xf4\xb3\x47\x89\xde\x67\x2c\x60\xc6\x8a\x2e\x66" - "\x21\x3c\x0b\x1c\x0e\x2c\x60\xba\xaf\x87\x9a\xc9\xd2\x87\x40\x0d" - "\xe1\xe4\x3a\x2b\xf7\x0f\x6e\x8f\x36\x92\x5c\x5b\xac\xeb\x2f\x4a" - "\xa5\xaf\x37\x23\xb5\xff\x4b\xe1\x97\x42\xf2\x07\x04\xdb\xe8\xdb" - "\xe4\x3d\xd3\xc4\x5f\x50\x99\x05\x21\xd9\x46\x89\x6e\x92\x30\x1c" - "\xaa\x97\xfb\x48\x74\xd3\x61\x92\x8e\xb6\x49\x9b\xa8\x44\xca\x9b" - "\x15\xb2\x89\x82\x4e\x90\xbe\xd3\x1c\xd6\x4b\xb9\x67\xa8\x3e\x23" - "\x68\xd2\xd6\x38\xd2\x8f\xa7\xa0\x2c\x95\x33\x8b\x38\x97\xdb\xa3" - "\xeb\xc3\xb8\x16\x9d\x83\xfd\x94\xc6\x14\x47\xf3\x7a\x0c\xe3\x02" - "\x4c\x7c\xf0\xeb\xa6\x4c\xf0\x1c\xde\x3b\x4e\x1c\x24\xd3\x71\x4f" - "\x40\xe8\x97\x66\xfb\x09\x9f\x4e\xd1\x1c\x5c\x0c\xdf\x56\x6e\x6a" - "\xe7\x48\xed\x10\x3b\x62\xed\x63\xad\xf4\x8c\xbb\x0f\xae\x87\xbe" - "\x61\x9d\xb6\xb1\xf7\x72\xe2\x07\x32\xa9\xcf\x0e\xd4\x05\x5a\x03" - "\x7b\x51\xf8\x20\x6c\xf5\x52\x5d\x9d\x4c\xd4\x71\x44\xed\x66\x47" - "\xf2\x8f\x43\xb7\xed\x6f\xad\xfd\x82\xb5\x5a\xff\x22\xda\x01\xbf" - "\xed\xca\xed\x3b\x5f\xdd\x84\x73\xc7\x2b\xb5\xba\x7b\xa9\xee\xc4" - "\xf1\xeb\x9e\x6d\xbb\xc0\xba\x2f\xa0\xdf\xb3\x2d\x17\x52\x77\x51" - "\x35\x0f\x12\x1d\x8e\xa7\x3d\x3e\x07\xfe\x59\x71\xc7\x35\x38\x00" - "\x9f\x34\x33\x84\xac\xde\xa5\x98\xf6\x80\xde\x08\xfb\x90\x1d\xbe" - "\x2c\x71\xff\x15\x7a\x76\xed\xde\xab\x3b\x70\x82\x41\xef\x3e\xb8" - "\xdd\x54\x12\x92\x45\xc3\x67\xe3\x16\x8f\x62\x3a\x20\x6d\xad\x7d" - "\x59\x12\xb7\x4c\x2b\x51\xd7\xd8\x32\x67\x7f\x95\xb0\xd9\x57\x4c" - "\x27\x74\xfd\x56\x5f\x4c\x7f\x95\x56\x97\x6d\xb4\xde\x54\x73\x24" - "\x64\xcb\xce\xcf\xb3\x6d\xc8\x5d\x95\x97\xad\x5f\xd0\x8e\x65\x3f" - "\xcd\x7e\x20\x7b\xd5\xfa\xec\x2c\xdb\xf2\x47\x73\xd7\xcc\x5d\xfb" - "\xe0\x83\xb6\xbb\xb2\xd7\xad\x5b\xf9\x8b\xec\x58\xb6\x3c\x77\xe5" - "\x9a\x75\xab\xa0\xdb\xb4\xd9\x16\xdf\x98\x91\xb3\x36\x6f\xee\x2d" - "\x8b\x53\x46\xe9\x36\x71\x5f\xfb\x18\x64\x1c\xda\x9f\xa6\x10\x8f" - "\x31\x09\x7e\x89\xcc\x1b\xb9\xeb\x31\x92\xaf\x09\x07\x7b\xb0\x17" - "\x62\xff\x81\xec\x05\xff\xc6\xf0\x99\xbc\xfb\x59\xde\xd6\xa5\x5c" - "\xbe\x87\xf8\xf6\x76\x4a\x83\x7f\xe2\x63\x7c\xa8\xc8\x2b\xce\xb3" - "\x95\xcb\x37\x52\x9e\xa6\x27\x28\xcd\x1b\x33\x54\x5f\xf1\x15\x33" - "\x4a\x1e\x23\xc6\xcf\x0d\x13\x79\x29\x7c\x0d\x7f\x63\x65\x9a\x8f" - "\x74\x83\xdb\xe3\x87\x0d\x91\x69\x59\xa0\x88\x83\xa6\xca\xf5\x15" - "\x73\x4e\xae\xd3\x13\xc5\xe2\x2e\x83\x72\xf9\xcf\x20\x23\x6e\x45" - "\xdc\xc5\xed\xb1\x44\xff\x87\x1d\x61\x5a\x7d\xb1\xce\x9b\xb7\x13" - "\xdc\x37\x74\xd0\xbb\xf0\xb5\x12\x1d\x3b\x7f\x84\x7d\x98\x12\x97" - "\xc8\x94\x4b\x0b\xe4\x1f\x95\x51\x2e\x2d\x91\x7f\x78\x8e\xfc\xbb" - "\x7c\xa1\xfc\x1b\x9d\xfe\x3f\xfd\xd3\xdb\xff\x6f\xd7\xe1\xff\x81" - "\xbf\x7f\xa0\x7d\x31\xee\xff\x1f\xc7\xff\x3f\x29\x4f\x8b\xe1\x3c" - "\x7f\xc0\x37\xc2\xad\x63\x4f\x7c\xc5\x4c\x84\x9f\x55\x65\xf7\x13" - "\x4e\x7f\xc9\xac\x05\x01\xde\x59\x74\x2f\x9b\x56\x78\x92\x78\x30" - "\xe2\xb5\xf2\xf2\x79\x67\xe1\x00\x3f\x4e\x78\xf3\x09\xe1\x6f\x63" - "\x79\x07\x8b\x2b\xeb\x20\x3e\x2b\x4f\xc6\x9e\xc1\x79\x13\xee\x79" - "\xb9\xe9\xbd\x65\xbd\x9f\x7d\xec\xfd\x0e\x36\x95\xae\xd6\x4c\xa2" - "\x3d\xc7\x18\x03\xfe\xc6\x65\xb2\xc4\x9a\x29\xfc\x10\x77\xbe\x92" - "\xc5\x0d\xaf\x2c\xa7\xb4\xa3\xaf\xaa\xa9\x13\x5e\xdd\xd4\x3c\xc1" - "\x76\x3f\xf6\xf9\xb8\x37\x35\xdc\xbc\x4d\xdc\x63\xa4\x5f\xe0\xa0" - "\xe6\x63\x9a\xf6\xa7\x8b\xdf\x92\x7b\xfa\xc5\x65\x9a\x3e\x0f\xcf" - "\xe2\xfe\x06\x8d\xa3\x91\x3b\x37\x1d\x44\x9d\xaf\xa8\x8d\x13\xb0" - "\x67\xbe\xba\x29\x75\x42\xc1\x4a\x66\x68\xf5\xf4\xb0\xc3\x44\x0b" - "\x71\x3e\x4e\xeb\xee\x00\xad\xb3\x83\x7b\xa6\xf0\x4a\xea\x5f\x29" - "\xf1\x73\x25\xd4\xa7\x7d\x83\xdb\xe3\xed\x1e\x65\xa2\x55\xe3\xe5" - "\x5c\xb4\x2e\x0e\x94\x51\x9e\x65\x8f\xb2\x19\x65\x94\x8f\x78\xbb" - "\x12\xc8\x28\xb2\x7f\x93\x66\x12\x0c\x1a\xa8\xcd\x36\xdb\x7d\x78" - "\x4f\x10\x3c\x06\xda\xa6\x71\x90\x1c\x92\x20\x64\x7e\xb4\xa1\xb7" - "\x4b\xf5\x97\x50\xfd\x6d\xda\x19\x63\xa5\xac\x27\xbe\x41\xae\x57" - "\x1f\xfc\xeb\x1e\xd3\xee\x89\xf5\x96\x6d\xa2\x7d\x7d\x88\xc1\x0f" - "\x6e\x15\xb5\xe1\x32\x6f\x61\xdc\x8c\x3b\xc6\xc7\x02\x24\xd7\xa8" - "\xd2\x7e\x57\x49\x78\x5e\x2b\x2b\xf8\x10\xc1\x7b\x04\x89\xbf\x17" - "\xfa\x19\xe2\x3f\x72\x88\x4e\x10\xcf\x21\xee\x67\x10\xbf\x81\x74" - "\x6a\xa3\x8a\xc6\xd5\x46\x72\x73\x03\xed\xdd\x88\x17\x69\xba\xaf" - "\xff\x5f\x18\xce\x38\xc0\x2f\xac\xcb\xe7\x7e\x11\x57\x6a\x7b\xc2" - "\x7c\x9d\x5f\x00\x7e\x80\x47\x28\xbb\x8f\x19\x87\x69\x8e\x09\x47" - "\x9a\x89\xff\x20\x9e\x3e\xc1\xa1\xcd\x4d\xb3\xe0\x0b\xb4\x38\xd2" - "\x92\x86\x27\x6c\xa6\xfd\x3d\x8e\xda\x68\xf6\x28\x97\x0b\x58\x48" - "\x1a\x94\x50\xaa\xef\xf5\xd0\x39\x78\xa8\x0e\x4e\xb4\x8e\xe0\xd6" - "\x90\x9c\xa9\x30\x8f\x12\x7f\x94\xe6\xa2\x01\x79\xa9\xbc\x91\xf2" - "\x1f\xa2\x7d\x7f\xa1\x36\x27\xc7\x48\x26\x20\x3e\x20\x61\x31\xfa" - "\x41\x65\x5a\x08\xd6\xd4\x96\xc5\xa7\xd1\xb1\xa3\x92\x87\xb1\x7c" - "\xa9\xc3\x9e\xe6\x7a\x5b\x18\xfe\x66\x53\x24\xfc\x09\x16\x52\x2e" - "\x57\x2c\x3b\x22\xe6\x8e\xe4\x52\x4b\x26\xf4\xd0\xd4\xde\x21\xa1" - "\x43\x53\xcc\xb7\xc1\xf7\x1b\xe1\xcc\x21\x82\xc5\x21\xca\xd7\x08" - "\xda\xbc\xf5\x2b\xa2\xb9\xf7\x83\x87\xb2\xdc\x29\x79\x54\x73\x37" - "\x70\xb8\x4b\x31\x7f\x82\xf7\x4e\x25\x61\x09\xea\xa3\xf7\x37\xe9" - "\x97\x78\x59\xf3\x6b\x45\x35\x88\x6f\xdc\xbf\x00\xbe\xd9\xe4\x5c" - "\xf7\x2f\xa0\x7e\xd5\xeb\x77\xa0\x80\x03\x98\x7b\x1a\xa3\xd0\x3f" - "\x78\x14\x73\x3d\x74\x8d\xa2\xdc\x70\x0e\xfa\x78\x0c\xeb\x53\xff" - "\x4e\xe9\xdd\xf0\x99\x1b\x01\x9b\x25\xda\x9c\x34\x8a\x58\xa1\x8a" - "\xe5\x36\xd9\x37\xcb\x34\x7a\x37\x51\x1f\xc4\x39\x44\xdf\x70\x4e" - "\x54\x05\xca\x14\x86\xcb\x60\xfd\x10\x2e\x9b\xa9\xcc\x8f\xe8\x97" - "\xeb\x79\xe1\x37\x9f\xfa\xe1\x7a\x1a\xbe\xcb\x14\x73\x7b\xdf\xb0" - "\xdd\x40\xed\xfa\xa9\x5d\x03\x70\x03\x78\xa1\xd7\x51\x21\x61\x74" - "\x80\xe6\x4f\xe0\xd7\xe1\x40\x23\xc1\xdd\x42\xfc\xbf\x3f\x5d\xf2" - "\x77\x66\x97\xd6\x3f\x97\x38\x1f\x8c\x36\x79\x6b\xa5\x9f\x21\xe4" - "\x0b\xc5\x7f\x0d\xf3\x99\x66\xf8\x19\x32\x51\x5d\x2d\x1a\x4e\x98" - "\x29\x5f\x5b\x08\x87\xe0\xef\x40\xb1\xa4\x81\xd7\xd4\xfa\x0f\xdc" - "\xbb\x53\xc2\x2e\xc1\x0b\x1c\x20\x3e\xbe\x5e\xce\x73\xc2\x12\xf0" - "\xaa\x12\x0f\x27\x25\xea\x75\x08\x9f\x09\x04\x67\x95\xea\xd0\x71" - "\x25\x92\x36\x50\x5e\x92\x1b\xa3\x43\x78\xa3\xd3\x02\x59\xe7\xe4" - "\x8d\x9a\x1e\xd5\x4f\x73\x03\x3f\x26\x2e\xe1\x07\x4b\xe0\xe5\xe4" - "\xa5\x87\x7d\x01\xd0\xd7\xa3\xd4\x2f\xa2\x09\x93\xf6\xf7\xc5\xaa" - "\xde\x30\x6e\x4f\xaa\xd6\x71\x3b\x62\x5e\x05\x6e\x6f\x13\xf4\x68" - "\x52\xa3\x87\xfd\x73\xa7\x8e\xfb\x58\xe7\x2a\xad\xeb\x8a\xf5\xe2" - "\x7c\xc0\x0c\x7d\xa0\x58\xf7\xfe\x5e\x21\x63\x60\x3e\x5b\xf3\x3b" - "\x85\x8f\xfc\xad\x2a\x33\xb5\xfa\x4e\x40\x3f\xd2\x83\xf5\xaf\xaf" - "\x71\xcc\x0d\xb5\xe5\x42\x1c\x83\x6d\x44\x03\xb1\x06\x7d\xd4\x27" - "\xfa\x66\x82\x4f\xb8\xa6\x15\xa9\x6c\x1d\xcd\xed\xe1\x4c\xcc\xdb" - "\xe4\x05\xfa\x9d\x8b\x0a\x49\x03\xe2\x34\x7c\x11\x7d\x1c\x05\x57" - "\xb3\x84\xeb\xe4\xd5\x23\xd7\xb7\x25\x0e\xeb\x3b\x12\xae\x80\x29" - "\x60\x4b\x79\x69\xfc\x13\xf3\x74\xb8\x86\x61\x7a\x71\x8c\x86\x8f" - "\x1a\x6d\x9d\x3c\x26\x6d\xad\x90\x31\x23\x1a\xb7\x62\x2c\xb4\xa7" - "\xa0\x7d\x11\x0f\x4b\x93\x7d\x9a\xbc\xc0\xa9\xc9\x01\x0f\x2b\x48" - "\xd5\xe9\x18\xf5\x67\x39\xf0\x09\x73\xa5\xd3\x0e\xe8\xca\x64\xdf" - "\x2f\xb6\xeb\xf3\x81\x7e\x47\xd2\x04\xea\x93\xb0\xf7\x0a\x8f\xf9" - "\xe2\x9f\x51\xb9\xc9\xa0\x6d\x61\xfe\xea\xe2\x9c\x91\x63\xbf\x38" - "\x0d\x63\x07\x4e\x38\xd6\x43\x5f\x26\xf7\x32\x8f\x12\x77\x6c\x24" - "\xbd\x8a\xfb\x44\xd8\x65\x68\xfc\x18\xe8\xbd\xe3\x3e\x99\x1f\xfb" - "\x1b\xe5\x17\xba\x79\x6d\x3f\x84\x8e\x16\x69\xcd\x1a\x0c\x8e\x51" - "\xfe\x26\xdc\xe3\x86\x2f\x9f\x8b\x8e\x49\x59\x90\x68\xf4\x21\xc4" - "\xce\xa0\x7c\x25\xad\x24\x07\x04\xa2\x19\xab\xd1\xf8\x4d\xd0\x09" - "\xbe\x21\xfd\xa2\x0d\xdd\x2c\xc6\x71\x0b\xff\xa6\x4b\x49\x7c\x9c" - "\xd6\x91\x1f\xfe\x32\xa9\x6e\x5b\x97\x72\x69\x36\xb5\x9b\xa8\xfd" - "\x5a\xe9\xf7\x2e\xfa\xbd\x8c\x7e\x6f\xa2\xdf\xcb\xe9\x77\x3a\xe5" - "\x57\xb5\xfc\x29\xf4\x3e\x81\xd2\x6f\xd4\x7e\xa9\x8f\x89\x38\xcf" - "\x4e\x7b\x02\x7c\xe5\x7d\x48\x9f\xf2\x39\xde\xe9\xf7\x43\x6d\xdc" - "\x2d\x72\x6d\x27\xee\xa7\x7a\xf2\x91\x0f\xfb\x1a\xa5\x39\x28\x4f" - "\x19\xea\x86\x5f\x05\x7a\xbe\x2d\x82\x3f\xa5\x7a\x2e\x79\x84\x7e" - "\xe7\xd3\xef\xf5\xf4\x9b\x47\xe5\xe1\xcf\x33\x8d\x60\xd0\x16\xa6" - "\x17\x09\x4b\xb2\xf2\xe5\x7c\xd2\x1c\x36\x61\xbd\xeb\xf4\x00\xf8" - "\x34\x22\xdf\x0a\x99\x4f\xca\xaf\x97\x24\xe9\x73\x17\x10\x73\x67" - "\x6e\x0f\xd0\xdc\x51\xfd\xb7\xa1\x3c\xfd\xde\xae\xfd\xa6\x6a\xbf" - "\x77\x68\xbf\xff\xac\xfd\x2e\xd6\x7e\x97\x78\x94\x44\x9f\xc6\x9b" - "\x10\xcc\x12\x85\x9e\x9c\xd6\xae\xd6\xee\x14\x3b\xe4\x6b\xa2\xff" - "\x37\x21\x8e\x23\xb5\x5b\xa3\xeb\xad\xa1\xfb\x19\xde\x1e\x73\xd1" - "\x6e\xa1\xfb\xb9\xa4\x21\x82\x16\x3a\xe2\x94\x54\x46\xbc\x53\x74" - "\x8d\x81\xf8\x06\x59\x4f\x9c\x41\x3b\xaf\x47\x3c\x18\xc4\xd5\x84" - "\x9f\x42\x21\x47\xc5\xdf\x82\x73\xcf\x63\x42\xa7\xbf\x03\x3e\x8a" - "\x86\xf2\xe8\xaf\x98\x64\x8a\x6d\x3a\xbd\x87\xbc\x24\xe5\xfc\x89" - "\x7f\x19\xdc\x3e\xc5\x16\x96\xf3\x2f\x69\x93\x67\x9b\x97\xfe\x92" - "\xd2\x23\xe4\xff\x4b\x4a\xd1\x67\x82\x75\x3b\x8d\x67\x7e\x87\x32" - "\x05\x77\xbd\x6f\xe8\x94\x63\x4e\xd1\xc7\xac\xcd\x95\x43\x87\x79" - "\xa7\x92\x18\x20\x7a\x98\x0b\xfc\xee\x08\xd1\xe5\xc4\x00\x7e\x35" - "\xfc\xa1\x79\x4e\x7c\x19\xf3\x1d\x41\x4f\x52\xc3\x74\x7a\xca\xa1" - "\x91\xf3\x92\x70\x28\x20\xf9\x85\x76\x5a\x97\xc0\x81\x6d\xa3\xd6" - "\x65\x1a\xd6\xa5\x56\xd6\x3f\x92\xc6\x5f\x9c\x06\x1a\xaf\xf5\x91" - "\xf0\x36\x51\xd8\xe8\x79\x94\x29\xed\xda\x9e\xd4\x4e\x7b\xe4\x4d" - "\x94\xbe\x54\xf6\x53\xa6\x6b\x6d\x11\xfe\x25\x2e\x06\xfe\xeb\xe9" - "\x1a\x7e\xa3\x9e\x85\x98\x6b\x3d\x5d\xab\x9f\xf0\x34\x71\x3e\xd6" - "\x8f\x9e\x2e\x71\x72\x52\x29\xe8\x0d\xca\x06\x84\x2d\x23\xc9\xdf" - "\xf7\x35\x51\xbf\x2f\x6d\x24\xfe\xa2\x1e\xeb\x79\xeb\x26\x16\xb7" - "\xa1\x9a\xc5\xcb\xb5\x79\xe9\xe7\x7a\x59\xa1\xd3\xdf\x7e\x69\x8b" - "\x4e\xa3\x2a\x04\x3d\x9b\x9c\x3a\x92\x56\x4e\x5d\xc5\x9d\xe6\x40" - "\xc0\x34\xb4\xfa\x48\x60\xbe\xa0\xb9\xb4\xee\x6b\x06\xb7\x5b\x8d" - "\x1e\xf6\x8a\x45\xdb\x4b\x5a\x04\xaf\xa6\x58\x7f\x74\xa4\x5e\xd2" - "\x2e\x59\xb7\x35\x44\xff\x22\xf8\x10\x41\xeb\xd1\x16\xea\xa2\x7d" - "\xc5\xe2\x2b\x4a\xbf\x48\xd2\x6f\x6b\xba\x87\x5d\x99\xa8\xd3\x56" - "\xec\x4f\x66\x85\x39\xca\xef\x93\xfb\x93\x0a\x1d\x98\xc3\x27\xfc" - "\xd3\xb5\x3a\x7a\x19\xf6\x4d\xf8\xff\xce\xd8\x18\x0b\x9f\x55\xe9" - "\xd4\xd7\xbb\x88\x3f\xdb\xab\x9d\xcd\x90\x9c\x7b\x59\x10\xb2\xac" - "\x06\x57\x5a\x4f\x97\x1d\xd7\xe6\xe5\x18\xf5\x67\x2f\x68\xfb\xd6" - "\xf5\x32\xa6\x12\xf4\x41\x22\xc6\x17\x78\x56\x2b\xf7\x8b\x58\x06" - "\xdb\xad\xdd\x11\x3a\x2e\x6d\xbd\x5d\x7a\x44\xc4\xa8\x28\x19\x5a" - "\x2d\xf5\x89\x97\x3d\x2a\xd3\x2f\x4b\x97\x76\x08\xc2\xcf\x28\xde" - "\x17\x47\x59\xa7\xfc\x4d\xe8\x5f\xa3\x63\x66\x4b\x7e\xe4\xb2\x05" - "\x11\x36\x3f\x02\xd6\xc2\xcf\xf1\xf6\xcb\xd2\xc2\xeb\xe2\x32\xf8" - "\x82\x36\x52\xd9\x1e\x4a\xcf\xd1\xd3\xe5\x5e\x93\xb0\x50\xd3\x99" - "\x39\x2e\xda\x92\xca\x88\x36\x47\xef\x76\xea\xeb\xf7\xb2\x66\xd1" - "\xbe\xb6\x7e\x31\x46\xe0\x03\xd6\x70\x00\x7e\xc5\x68\x0d\x63\x2d" - "\xd3\x73\x5e\x40\x5f\xbb\x92\xbf\x13\x77\xce\xe4\xba\xbd\xac\x3d" - "\xa2\x1f\x95\x1a\xae\x1e\xeb\x7b\xc0\x1a\x47\xdf\x7c\x1e\xc5\x24" - "\xcf\xb2\x14\xab\x94\x31\x76\x74\x1c\x54\x07\xb8\x1f\xba\x69\xe8" - "\x13\xa0\xb3\xd1\xec\x55\x71\x56\xe2\x83\xaf\xb4\x4a\x5a\x0f\x61" - "\xff\x68\x16\xa6\xfb\x47\x1b\xdc\x3e\x75\x71\x58\x77\x6c\xdd\xab" - "\x8d\x6b\x35\xb5\x57\xe3\x2a\x7c\x0f\xb8\xf4\x8c\x5c\x63\xd6\x2a" - "\xe0\xb1\x9b\x70\x8f\xf6\x9f\xea\xc3\x05\xa2\x6c\xb1\x8e\x7b\xb4" - "\x46\xb3\xba\x94\xcb\x27\x55\x4d\xe1\xd5\x34\xa7\xb0\xdb\x5f\x4d" - "\x78\x10\xa4\xdf\x2c\xf9\xab\x58\xf0\xab\xe1\x7c\x35\x95\xa5\xf5" - "\x3f\xb3\x51\x9f\x03\x5f\xfc\x6c\x87\xc0\xb1\x42\xd8\x37\xa6\x88" - "\xb3\x7e\xe0\x18\xf0\x4b\x9c\xf9\x13\xae\x99\xb7\xfc\x0b\x03\x9e" - "\x09\x9f\x29\xf4\x8e\xfe\x02\xcf\x06\xb7\x5f\x6e\xd2\x7d\x1e\x7b" - "\x94\xa9\xf2\xbc\x6d\xfb\xe5\xd3\x74\xdb\x70\xe0\x61\xde\x4c\x76" - "\x09\xd5\x6f\x6b\xb2\xf9\xa0\x3b\xff\xda\x1d\xb8\x83\x21\x2f\x60" - "\x27\xe9\xe5\xa5\x4d\x54\x26\x62\xfe\x13\x84\x2d\xeb\xe1\x15\x42" - "\x9f\x79\x31\x7d\x5b\x3d\x92\xe6\xc4\xf8\x05\x5f\x49\xd4\xf1\xaa" - "\x44\x86\x73\x7a\xda\x6b\x2e\xaf\xd4\xf9\xe1\x79\x94\x46\x79\xd0" - "\x3f\xc8\xe0\x6d\xf4\x5c\x89\x7d\x7a\x1c\xbd\xf3\x7c\xe8\x8a\x40" - "\x33\xa0\x7b\x82\x1e\x8c\x60\x7d\xb4\x4b\x99\x31\xe9\x08\xfc\x17" - "\xad\xfd\xbe\xdf\xeb\xc2\x7c\xde\x0f\x7f\x5a\xb6\x5c\x76\x71\x87" - "\x72\x85\x0f\x7a\xa7\xa2\xef\xa0\xe3\x99\x66\x1d\xa9\xe3\x99\x96" - "\xa3\xfd\x15\xd0\x9f\x27\xfc\x37\xdd\xa1\x3d\xf7\x9e\xff\x6f\x7a" - "\x89\xcc\x3b\xbd\x8a\xfe\xea\x25\xac\xac\xb4\x56\xa6\x15\xe8\xb0" - "\x02\x4d\x01\x8d\x85\x9d\x0d\xd6\xb9\x12\x60\xf0\x97\x44\xf3\x44" - "\xfd\xde\x7a\xcd\x4f\x5d\x9b\x20\xd3\x4e\x13\xb1\x0b\xe0\xbf\xf8" - "\x82\x6c\xbd\x94\x69\x62\x3e\x85\x7f\x59\x65\x9a\x83\xda\x4e\xac" - "\x38\xcd\x8c\x8e\x5c\x36\x1d\x3a\x74\x73\x90\xbb\x20\x03\x03\x27" - "\x08\x06\x6d\x3d\xca\xf4\x5f\xe6\x6d\x66\x06\xfa\x3e\x83\x9e\x33" - "\x75\x5e\x8a\xca\x58\xa2\xfc\x2c\x11\x3c\xd4\xed\x9b\xd9\x8c\xc1" - "\xed\xd3\x17\xea\x73\x05\x3e\x03\x7a\xbc\x50\xbc\x2b\x65\x9a\xb0" - "\x05\x80\x2f\x7f\x0f\xe0\xa6\xd3\xaa\xd3\xd0\x5d\x4f\xb7\x47\xf9" - "\x98\x45\xee\x43\xd3\x8b\x69\x5e\x53\x25\xbe\x4c\x5f\x4c\xb8\x7f" - "\x34\xa2\x9f\xff\x14\xf1\xbc\x1d\xe5\xcd\x3e\xf0\x70\xe3\xc1\x67" - "\xfa\x11\x1d\x3e\x15\xc2\x07\x28\x73\x88\xf9\x0e\xf0\x5e\xea\x5b" - "\x8b\x63\x13\x33\xf5\x28\x57\xbc\x45\x63\xc4\xdd\xe0\x66\xa9\xe3" - "\xbf\xe2\x35\x5d\x4e\x97\xfd\xbe\x62\xb3\x79\x4b\x14\x83\x6e\x1e" - "\x3e\x23\x85\x2d\xe6\x19\xab\xd0\xc7\xbb\x03\x0b\x99\xab\xf0\xc7" - "\xc8\x73\xa7\xb6\x97\x1d\xeb\x2b\xb2\xb2\xc3\xd6\x85\xb4\x8e\xaf" - "\x20\xde\xe6\x9c\xe5\x82\x6d\x5e\x95\x2b\x96\x68\xf0\x6d\x11\xb6" - "\x22\xca\x15\x97\x61\x2f\x81\x6e\x80\xf6\x11\xf0\x68\x93\xa9\xee" - "\xbd\xfa\xba\xa1\x7d\xa2\x89\xca\x58\x25\x8d\x39\x4e\xbc\xc5\x15" - "\x89\xf0\x5b\x23\xe4\x07\x99\x3f\x4e\x9e\x1b\x5c\xd1\x1e\xe2\xb7" - "\x29\x1f\xca\x09\x1b\x42\x65\x7a\x6f\x46\x10\xba\x84\xe9\xbd\x18" - "\x9b\x86\x8b\xb4\x5f\xcd\x30\x85\xd7\xed\xf4\xc5\x62\xdd\xf6\x46" - "\xae\xcb\x19\xf6\xb0\x9c\x7a\xf9\xb1\xb9\x55\x6c\x4c\xbb\x27\x47" - "\x02\xf6\xaa\x19\xcf\x57\x54\xf0\xfa\x4a\x83\xba\x68\x6b\x39\x8b" - "\x53\x4a\x09\x6c\x58\x67\xeb\x33\x2f\xa1\xf5\xb8\xdf\x1c\x77\x69" - "\xda\xed\x79\x13\x79\xa1\x95\x19\xca\xce\x4e\x34\xcd\xf4\x5f\x5a" - "\xcf\xa3\xae\xf9\xe9\x5d\x79\x38\xfb\xae\x64\xdf\xae\x66\x51\xb7" - "\x13\x95\xbb\x2a\x8e\x39\x3c\xca\xcc\x06\xdc\x73\x3f\x1c\x07\x5e" - "\x64\x66\x03\xea\x2c\xa8\x61\xa6\x82\x4e\xde\x5d\xfa\xe0\x04\x13" - "\xed\xbf\x16\xda\x37\x4a\x2e\x8a\xbb\xb4\x7e\x98\xea\x78\x37\x53" - "\x94\x1b\xd3\x46\x44\xf6\xcd\x76\xd3\xd8\x7d\x73\x4c\xe9\x52\x6c" - "\x77\x5c\x58\xdf\xae\xf4\x85\xfb\x76\xa5\xef\x7f\xa1\x6f\x9f\x44" - "\xf4\xcd\x12\xee\x5b\x0e\xfa\x76\xfc\xc2\xfa\x96\x34\x3f\xdc\xb7" - "\xa4\xf9\xff\x60\xdf\x0e\x8c\xdf\xb7\x99\x8f\x8c\xdd\xb7\xfc\x4b" - "\xbb\x94\x99\x9b\x2f\xac\x6f\xb3\xf2\xc2\x7d\x9b\x95\xf7\x3f\xe9" - "\x5b\x61\x0d\x3f\xd1\x3a\x8d\xc1\x9f\x66\x1c\xe8\x7c\x97\x72\xe5" - "\x96\xcd\xd3\x84\x1d\xf7\x64\x7a\xbe\xa9\xa8\x86\x7f\x23\x79\x9b" - "\x99\xe7\xe4\x9e\x36\xd3\x4b\xf8\x2b\xed\x4a\x94\x2b\x3d\xc2\xce" - "\x25\x6a\xea\x3e\xee\xe4\x81\xeb\x7c\xb0\x19\x0c\xc0\xb7\x0b\x7c" - "\xc1\xef\x7b\x75\xc0\x8f\x38\x1c\x8d\x75\x67\x8d\xec\xd5\x01\xaf" - "\x61\x70\xfb\x95\xc9\xba\x3f\x57\xbd\xac\xb9\xfa\x7c\xf4\xe8\xca" - "\x95\xb7\xe7\x30\x33\xe8\x11\x7e\x11\x4f\xb3\xa2\x70\xa2\xe9\xf6" - "\xef\xb0\xef\x5f\x99\xaf\xdf\xd7\xd5\xeb\x5a\xd6\x3d\x91\x9b\x0b" - "\x58\x14\xee\x0c\x0b\xdf\x8f\x56\x2f\x4b\x2a\x60\x13\x96\xe5\x53" - "\xfd\x7e\x96\x69\xce\xa7\xba\x09\x1e\x92\x97\xbf\xf2\xad\xa8\xd5" - "\x2c\xae\x8a\xea\xc6\xef\xed\xd6\x22\xbe\xf5\x79\x66\xc4\xdd\x62" - "\xdc\x11\x96\xf7\x83\xa3\x4d\xd4\x8e\x47\x6f\xe7\x07\xe0\x97\x20" - "\xe1\x77\xd5\xbb\x61\xf8\x5d\xf5\x68\x18\x7e\x57\xfd\x48\xc2\xef" - "\xaa\x94\x30\xfc\x92\x6c\x17\x06\xbf\xab\x56\x87\xe1\x27\xcb\x9e" - "\x1f\x7e\x57\xbd\x30\x3e\xfc\xae\x6a\x0c\xc3\x4f\xd6\x35\x0e\xfc" - "\xa2\xc7\x86\xdf\x55\xc1\x7f\x0c\x7e\x49\xb6\x7f\x10\x7e\xf1\x12" - "\x7e\xb3\x94\x30\xfc\x92\xde\x08\xc3\x2f\x69\xa3\x84\x5f\x92\x23" - "\x0c\xbf\x59\x99\x17\x06\xbf\xa4\x03\x61\xf8\xc9\xb2\xe7\x87\x5f" - "\xd2\xf1\xf1\xe1\x97\xe4\x0f\xc3\x4f\xd6\x75\x61\xf0\x9b\x75\x33" - "\xc1\xcd\xa2\xc1\xcf\x32\x3e\xfc\x66\x65\xfe\x83\xf0\x33\x4b\xf8" - "\xcd\xbe\x2d\x0c\xbf\x59\xfd\x61\xf8\xcd\x7a\x53\xc2\x6f\xd6\xc1" - "\x30\xfc\x66\xd7\x5f\x18\xfc\x66\xf5\x86\xe1\x27\xcb\x9e\x1f\x7e" - "\xb3\x67\x8e\x0f\xbf\xd9\x0b\xc2\xf0\x93\x75\x8d\x03\xbf\x89\x63" - "\xc3\x6f\xf6\xe6\x7f\x0c\x7e\xb3\xeb\xcf\x07\xbf\x0b\xe3\x35\x66" - "\x8f\x7b\xff\xfd\x02\xeb\x09\x8c\x57\x0f\x60\x08\xfb\x44\x75\xfb" - "\xec\x40\xad\x1a\x6d\x92\x77\x38\x66\x37\x90\x0c\x73\x6b\x87\x32" - "\xe7\xce\x5a\x75\x82\x89\x3b\xbf\x39\xa6\x3a\x4f\x6c\xe3\x5b\xa2" - "\x8d\xea\x96\x89\x46\xf8\x33\x18\x37\xe6\xba\x32\x67\x7f\xd4\x65" - "\xec\x0a\xdc\xd7\xdb\x4a\xfc\x1a\x9e\x07\xb7\xcf\x69\x20\x5e\x24" - "\x75\x34\x4c\xb2\x56\xad\x13\xc1\x3e\x73\xb3\xb3\x1e\x5d\x93\xb5" - "\x72\x4d\x9e\x6d\xe5\x03\x0f\xaf\x1b\xe9\x43\x5f\xc4\xc9\xdc\x86" - "\xf9\x9b\xe3\x0f\xf9\x98\x71\xf2\x7c\xf8\xea\x73\x5c\x09\xdb\x34" - "\xfb\x02\x11\xd7\x20\x76\x38\x89\x0f\xa7\xef\x4a\xbd\x8a\xbf\x23" - "\x7c\x10\x0e\xe7\xec\x22\x79\xaa\x05\x7e\x65\xb4\x73\xa8\x96\x2e" - "\xe5\x9a\x9f\xf0\x18\x5e\x09\x9b\x0e\x71\xb7\x43\xb1\xeb\x77\xb0" - "\x9a\xb9\xa9\x3f\x49\x2d\x41\x7c\x2d\x5e\x02\x18\xb4\xc2\xff\xdb" - "\xfa\xa8\x19\x1d\x4a\x72\x22\x8f\xe9\x4f\xe2\x25\xfd\x76\xed\x8c" - "\xc3\x0e\x7b\xd1\xd4\x4d\xfc\x6b\xd4\xa7\xf1\x82\x88\x5b\xe2\x92" - "\xfc\xa0\xfd\x88\x79\x8b\x2d\x0a\x79\xe1\x87\x11\xfe\x09\xf5\x58" - "\x55\xe8\x37\xf2\x12\x3f\x7e\x2b\x95\xbf\x15\xb1\x3a\x43\x75\xc8" - "\x3e\x5d\xdc\xa3\x5c\x6d\x14\x63\x29\xf1\xb5\xf5\x3d\x96\xbe\x4b" - "\xc4\x8b\x14\x70\xbd\xf6\x1c\x8d\xa1\x4d\xc4\xf9\x0c\x9c\x11\x71" - "\x3e\xb5\x32\xd3\xa9\x8c\xa0\xa7\xf0\xbd\x2a\xeb\xb8\xf6\xb8\xde" - "\x2f\xe2\xa1\x63\xe9\xfd\xc3\x88\x36\x2e\xa2\xf7\xd7\x22\xbe\xc7" - "\xd1\xfb\x33\xc4\x87\x4e\xd2\xbe\xc7\xd3\xfb\x46\xf0\xa5\x62\x5c" - "\xe5\xc5\xd2\x26\x5a\xb9\x76\x05\xa5\x59\xb4\x3c\x93\x28\xcf\x6d" - "\xe0\x75\xb5\x3a\x26\xd3\xfb\x2c\xc8\x8c\xda\xf7\x44\x7a\x8f\xc1" - "\xb9\x80\xf6\xfd\x92\x1e\xe5\x9a\x53\xf4\x3e\x47\xfb\x4e\x7c\xfd" - "\x35\xc2\xd7\x16\xc1\x7d\x1a\xc6\x44\xb0\x77\x00\xee\x04\xeb\x69" - "\xdc\xe4\x6b\x21\x79\xb5\x08\xf3\x88\x71\xba\x36\xf5\xb0\x0e\xe5" - "\x9a\xcb\x70\x2f\x4f\xce\x15\xaf\x94\xfe\x81\x0c\xe9\x94\x6e\x45" - "\x3a\x6c\xcb\xd5\x1d\xdc\x81\x67\x82\xe9\x6b\x80\xa1\xd6\x16\xc9" - "\x44\xd7\xa4\x6a\xf3\x4c\xb0\x83\x0f\x5f\x56\x5c\xa7\xcd\x05\xf5" - "\x6d\x22\x7d\xdf\x23\xcf\x3d\x70\xbf\x68\x58\xde\x2f\x52\xae\xc9" - "\xf9\x6f\xf9\xac\xa0\x72\x92\xee\x5d\xb3\x4f\x8f\x61\x48\x69\xc2" - "\x57\x06\xf0\x13\xfa\x15\x6f\x8c\xaf\x51\xf8\x68\x21\x1c\xd5\x71" - "\x05\x78\xc2\xa3\xe7\xb8\xa4\xae\xe6\x9a\xd0\xfd\x5f\x2a\x6b\xd3" - "\xe2\x3e\x30\x29\x27\x5c\xcb\xc2\xf6\x45\x57\x0b\xfa\x10\xf1\x6d" - "\x5a\xc4\x37\xdd\x2f\xa1\xf4\x39\xb5\xfd\xda\x05\x11\xdf\xaa\x46" - "\x7d\x5b\x1e\xf1\x6d\xdb\xa8\x3a\x1d\x11\xdf\xf2\x46\x95\x2b\x8d" - "\xf8\x96\x39\xea\xdb\xbe\x88\x6f\x69\xda\xb7\x28\x4a\x77\x85\x7c" - "\x24\x2a\x57\xa7\x6a\xe9\x44\xeb\xaf\x6d\x8f\x48\x4f\xd1\xd2\xd1" - "\xbe\xd7\xc3\xfe\x7a\x4c\x4b\x17\x78\x4e\x78\x34\x5b\xb6\x91\x1c" - "\x17\xd1\x06\x93\x32\x96\xaf\x51\xce\x9f\x3d\xdf\xac\xd8\x26\x02" - "\xa7\xcc\x5b\x8a\x11\x43\xa8\x52\xfa\x03\x93\xeb\x50\xc4\xa1\x46" - "\xac\x5c\xca\x37\x1e\x6d\x1c\xdb\x46\x30\xb9\x58\xbf\xc7\x1a\x2c" - "\xf1\x1d\x52\x4b\x86\xa1\x9b\x9e\x01\xbf\x61\x45\xbd\xf0\x1d\xa3" - "\xc7\x24\x1c\x62\xee\xbc\xc1\xe2\x56\xbf\xb8\x6f\x8b\xfb\x10\x09" - "\xf0\x7b\xd6\x2a\xf4\x3b\xa7\x64\x5c\x42\xdc\xef\xdd\xe1\x3b\xb4" - "\xa1\x97\x4d\x73\xdc\xc2\x3b\x21\xe7\x49\x9a\x90\x0c\x7a\x62\xd6" - "\x68\xda\xf3\xc2\xd6\x5b\x99\x9b\x82\x34\x77\xaf\xd0\x33\x9b\xba" - "\x94\xb9\xc5\xfa\x77\x39\xde\xb9\xc5\x42\x96\xd6\xee\x15\x0e\x6e" - "\x9f\x6b\x0f\xc5\xcd\x54\xe6\x6e\xeb\x8f\x57\xba\x29\x6d\xe1\x48" - "\xfb\xc6\xb9\xf7\xa0\x4e\x8c\xc3\xa3\x24\xfb\x51\x37\xe5\xc9\x0c" - "\xd9\x37\x52\xfa\x86\x00\x9b\x4a\x7d\xeb\xd2\xeb\xa7\xef\x24\xff" - "\x27\x0b\xb9\x12\x75\xf6\x97\xd9\xad\x94\x56\xe5\x31\xbc\x5f\x2c" - "\xed\x23\xe7\xd6\x7b\x58\x47\xca\x78\xfb\x9f\xd0\x49\x9a\xf8\x3e" - "\x5e\xc2\x0f\xd2\x9a\xaf\x17\xf6\xca\x31\x7c\x9f\x94\xe5\xe7\x9e" - "\x42\x2c\x32\xc4\xf0\xc6\xb9\xa3\xa4\x3b\xd7\x09\x7b\x08\xa4\x11" - "\x6c\xf6\x11\x7d\xbe\x70\x5f\xa1\xca\x5c\xb1\xff\xc1\x77\x13\xee" - "\x5c\xe0\x0e\xc7\xe0\xf6\xeb\x96\x84\x62\x3d\xe8\xf7\x09\x94\xeb" - "\x7e\x09\x1d\x5f\x85\x2a\xfb\x38\xba\x0f\xe8\x2f\xd5\xd5\x3b\xee" - "\x5e\x6a\xe2\x42\x57\x44\xbc\x4c\xb3\xb4\x25\xbb\xee\xcd\x28\xeb" - "\xe5\x04\xf7\xeb\x1a\x42\x31\x2e\x28\x4f\x39\x6c\x82\xa9\xfe\xd0" - "\x38\x73\x45\x1b\xc7\xa4\x9e\xfe\x3a\x2f\xd1\xb1\xfa\x8a\x21\x66" - "\xd4\xd2\xbd\xad\x01\x3f\xee\xd6\x8f\xe9\x83\x0b\x7b\xa4\xf0\xdf" - "\xb4\x93\xd7\xe3\xfe\xc4\x3c\xbf\xde\xe7\x79\x5e\xd8\xed\xa3\xcf" - "\x12\xb6\xf3\x4e\xe8\x70\x2c\x3b\x4b\x75\x17\x7e\xc1\x3a\x95\x79" - "\x8f\xc0\xbe\x45\xc0\x64\x93\x6e\x73\x35\xef\x11\x91\x6f\x28\x94" - "\x47\xe8\x3b\x60\xef\x0b\x38\xd5\xc2\xef\x00\xd5\x59\x4e\x73\x21" - "\xe2\xd8\x2a\xf3\xde\x10\xfa\x4d\xfa\x2e\xc6\x2d\xec\xd9\x52\x12" - "\x25\xae\xcc\x3b\xe0\x51\x52\x6c\x12\x07\x65\x1a\x62\xc0\xc3\x0e" - "\xe1\xb4\x32\xaf\x0c\xb1\x64\x09\x1e\x07\xe1\xbb\xae\xd5\x47\xeb" - "\x25\x7f\x08\xb8\x70\x10\x31\x03\x3d\xca\x3c\x19\xcb\xca\x04\x98" - "\xcf\x83\xaf\x3e\x71\xc6\x83\x38\xba\x04\xd3\x81\xc1\xed\x29\x21" - "\xfd\x07\x62\xf6\x52\x9e\x71\x7d\x37\x02\x46\x41\xea\x73\x2b\xf1" - "\xab\xae\xa9\x5f\xa0\x7f\x9f\xa8\xb1\xbc\x1e\xf6\x93\xf4\x2c\x7d" - "\x5f\x94\xc8\xb9\x93\x78\x90\xb2\x3f\xca\x3a\x6d\x66\xab\xc4\x05" - "\x19\xc7\x5c\x49\x49\xd3\xe0\x27\x62\x5e\x54\xae\x97\x70\x90\xf9" - "\xaf\x37\x4a\xbd\xcc\xb4\x39\xd4\xaf\xfa\xb0\x5e\xe6\x7a\xa3\xd0" - "\xa9\x69\x36\xd6\xf4\xed\x50\x44\x9f\x7d\xe2\x1e\xe0\x59\xc8\xd4" - "\x29\x59\x68\xab\x0c\xbe\xc5\x80\x17\x3d\x91\xf8\x9f\x72\x07\xfa" - "\x09\xdb\xbc\x60\xcc\x50\x33\xdf\x31\xd4\x02\x38\x53\x99\x02\x5a" - "\x0b\xf5\xe3\xc4\x89\x17\x71\xaa\x06\xb7\x5f\x9f\x1c\x11\x7b\x97" - "\xf6\xc1\xeb\xef\xd5\xf7\x39\xec\xd1\xf0\xf3\x10\x4a\x2b\x5b\xd4" - "\x4e\x3c\x0e\xd3\x78\x9c\x71\xe3\xc4\x57\x5c\xc7\x52\x70\xd7\x18" - "\x76\xda\xc0\x37\x1e\xb7\x28\x1f\xbe\x93\xe1\x07\xd2\xb5\xe9\x06" - "\xea\xef\x0d\xf1\x4f\x4f\x11\xf7\x1b\x7d\xae\xeb\xce\xc2\x46\xa7" - "\xb7\xab\x40\xf8\x37\x32\x2d\xcb\x0f\xf0\x3a\x19\x7b\xdb\xcb\xe3" - "\x17\x61\xff\xed\x15\xb1\x03\x50\xe7\x7f\xd7\x0f\xb0\x72\x7d\xbb" - "\xc6\xcb\xf4\xd2\x5e\x7e\x29\x8d\x47\xdc\x67\xa4\xe7\x29\x3d\xca" - "\x8d\x37\xc9\x78\x91\xd2\x97\xbd\x66\x6b\x18\x2d\xef\xe7\x7b\x99" - "\xb8\x2f\xad\xdc\xb0\xdf\x76\x0d\x63\xbd\xca\x0d\x2f\x0b\xbf\xd2" - "\x25\xfd\x16\x0d\x06\x96\x0a\xd9\x2f\x73\x46\xbe\x41\xf4\x11\xfd" - "\xbb\xb0\xbe\xdd\xa0\xef\x97\xd1\x83\xdb\x6f\x68\xd4\xef\xf5\x8b" - "\xf1\x6b\xfe\xa6\x5d\x57\x42\x6e\xb9\x71\x96\xc4\xc1\xfe\x44\xad" - "\xed\xc4\xff\x85\xb6\xbd\xda\x7e\xd8\x2d\x7c\x6e\x13\x5c\x88\x7f" - "\x24\x5a\x74\x63\xaa\xbe\x9f\x6a\x36\xf2\xc9\x72\x9f\xbf\x31\x3d" - "\xbc\x97\x4a\x18\x8e\xb8\xb3\xb3\x76\x6d\x9e\x8d\x18\x76\xc7\xca" - "\xbc\x07\x72\x6c\xd9\xb9\xff\x1f\x7b\x5f\x03\x17\x55\x99\xef\xff" - "\xcc\x01\x15\x6d\x06\x26\xd7\x6d\xa9\x45\x9b\x5a\xaa\xb1\xb5\xa2" - "\xcd\x8a\xca\x8a\x34\x77\xa9\x55\xb1\x56\x77\x29\x4d\x51\x51\xc7" - "\x44\x1d\x11\x11\x15\x79\x4b\x59\x22\x66\x60\xc3\xed\xa2\x02\x5a" - "\xd7\xfa\xdb\x6e\x2f\xd4\xb5\x7b\x69\xaf\x6d\xd3\x65\x06\x46\x1b" - "\x18\xb6\x3f\xdd\x8b\xbb\xfa\x6f\x72\xc9\xc8\xd0\x26\x45\x19\x99" - "\x99\xf3\xfc\x7f\xbf\xf3\x9c\x61\xce\x00\x03\x33\x03\xbe\xe4\x95" - "\xcf\xe7\x7c\x0e\xe7\x39\xcf\x3c\xe7\x79\x7e\xbf\xef\xef\xed\x79" - "\x4d\x5f\x93\xae\xc2\x0d\x6f\x7a\x9d\xab\x14\x41\x0b\xef\x49\x13" - "\xcf\x7e\xdb\xd7\x73\xf6\x5b\xe1\x3d\xfb\xa5\x67\xf2\xd9\x64\xf7" - "\xd4\x0e\x4f\x5c\x73\x8f\xdf\x75\x7e\x65\x1c\x5f\x03\x57\x2d\x5c" - "\x06\xb8\xcc\x18\xe7\x2c\x74\x90\x04\xb0\x8f\xc2\x98\xb0\x77\xbd" - "\xfa\x3d\x25\x38\x0e\x7e\x4c\x36\xf9\xee\x6a\x3e\x9c\x08\xfb\x9a" - "\x14\xf0\x38\x97\x04\xf7\x47\xaf\x85\xcb\x00\x97\x19\x2e\xe1\x77" - "\xfc\x7f\x09\x6b\x6d\x6b\xa4\xef\x70\x6c\x9a\x16\x18\xa6\x60\x1e" - "\x9a\x1f\x2e\xf8\x21\xfc\xcb\x2c\x5f\xaf\x3a\x70\xb4\xf0\x8e\xfd" - "\x62\x3e\x41\x37\x44\xe6\x13\x55\x3f\xf9\xc2\x68\xe1\x6d\x36\x31" - "\x9f\xb0\xf6\xdd\xd3\x1e\xdc\xbb\x1f\xf2\x7b\xf2\x85\xd3\xc2\xbb" - "\xb5\x62\x3e\xb6\xa7\x59\x01\xd7\xdf\x77\x47\xd0\x82\x73\x31\x62" - "\x3e\xa5\xb4\x3c\x49\x9e\x91\x7c\xe1\x8d\x8f\x63\x1e\x3e\x3f\x9c" - "\x9d\xc3\x52\x78\x4f\x0b\xe4\xef\x37\xd6\x0b\x8e\x4f\xf7\x66\xf7" - "\xe6\x93\x76\xc9\x8a\xa5\x0f\xae\x58\x9d\x89\x27\x49\x65\xac\x59" - "\x9f\x81\xf7\xd5\x8b\x56\x0a\xb7\x35\x0b\x97\x2d\x61\xff\x64\xa4" - "\xc5\xe1\x3f\x69\x80\x37\xbc\xa7\xae\xd7\xe2\x6d\xc9\x1a\x7c\xcc" - "\xd2\x4c\x5a\xbf\xc4\x73\xa4\xb7\xcf\xbe\x4b\x5d\x85\xf7\xc5\xda" - "\x64\x93\xc7\x31\x7f\xe4\xbe\x38\x9b\xec\x36\x61\x1c\x38\x2a\xdf" - "\x46\x4c\x6a\xe1\xec\x3f\xd2\x67\xbf\x02\xd9\x7d\x0f\xe3\x7e\x05" - "\x51\xf9\xda\x25\x51\xae\x15\x4b\xe9\x8b\x4e\x2c\x27\xcd\x46\xf6" - "\xb2\xb5\xe5\x45\x67\x55\xc2\xbe\xa1\x85\xf7\x1e\xf0\xcc\x2f\xe4" - "\x8b\x3a\x5b\x70\x3f\x7c\x61\xbe\xd1\xcb\xb8\x17\xce\x59\x5c\x7b" - "\x15\x53\xfd\xb2\x70\x2e\xcd\x38\x78\x7f\x04\x9e\x63\xe1\x39\x1a" - "\x9e\x63\xf8\xa2\xaf\x52\x70\x7d\x22\x3c\xab\xe0\x39\x16\xca\xb7" - "\x78\xe4\x42\x4a\x1b\xf1\xb0\xb9\x07\xfb\x8d\x8f\x7d\xf7\x98\x02" - "\xd9\xba\x5f\xe9\x39\xcb\x57\x38\xb7\xb7\xf0\x7e\x55\xcf\xb9\xbd" - "\xc2\x59\x4e\xca\xf9\x82\x5d\x13\x6c\xfb\xfd\x55\x61\xd1\xe3\x33" - "\x99\x1f\x7e\x7f\xa2\x67\x4f\x06\xe6\x67\xdf\x9f\x2c\x39\xf3\x18" - "\x9f\x35\x3d\x67\x1e\xb3\x7d\xc9\x76\x0a\xfb\x1e\xc9\xee\xaf\xa1" - "\x85\xf7\xb5\xf6\x9c\x4f\x57\x78\x7f\x99\xf4\x7c\x3a\x1b\xbc\xc7" - "\xf8\x06\xd2\xf7\x79\xed\xe0\xfd\x53\xf0\x9b\xfd\x9d\xef\x0c\xf1" - "\x79\xd6\xc2\x8d\xe0\x8b\xc3\x5d\xf0\xcb\x45\x1f\x18\xd3\x69\x41" - "\x02\xee\x6f\xa3\xc2\x77\xe8\xfb\xf5\xdb\xe7\x80\xe7\x2b\xca\xe2" - "\x1f\xc3\x7d\x77\xed\xb9\xa9\xb2\x9f\x55\xe3\x1c\x24\x78\x66\xfb" - "\x46\xd2\x53\xb2\x78\x61\x1d\x9b\x67\x4f\x39\xe9\x9a\xf8\x7e\xd7" - "\x1e\x7c\xe6\x19\x33\x4e\x5b\x13\xe5\x5a\xb4\x94\xf9\x71\xf1\xaf" - "\x32\x5d\xda\xcd\xd6\x7d\xca\xe2\x4b\xe8\xd3\xec\xbc\x13\x9b\xec" - "\x01\x25\xae\x47\x8a\x92\xa5\xad\xa1\xf0\xdb\xa8\xac\x45\x4b\x85" - "\x34\xc8\xf7\x02\xf8\x5a\x62\xfd\xd6\x5a\x63\xda\x09\x3d\xe7\x66" - "\x6b\xfd\x65\xf1\xda\x05\xe3\xf3\xf0\x3b\x11\x82\x1f\xf1\x19\x91" - "\xe3\x59\x81\x58\xb7\x6a\xc9\x9e\x77\xa5\x90\x86\xf3\xb1\xce\x3c" - "\x4d\x84\x7d\x7f\xc5\xba\x68\x85\xb3\xca\x0a\x1f\x88\xf0\xec\x99" - "\x63\x83\xb4\xde\xed\x79\xfa\x37\x82\x84\xdc\xb2\x64\xd2\xec\xe9" - "\xf0\xdf\x24\xf1\x98\x5b\x29\x76\x62\xce\x8c\x71\x47\x9f\x79\xa3" - "\xf4\x5f\x84\x73\x22\x0b\x1f\x48\x06\x3e\xb9\x04\x7e\xbf\x30\xef" - "\x1b\xd4\x2d\xc2\xf9\x89\xb8\xae\x90\xef\x84\xef\x4e\x79\x42\xd8" - "\x5f\x97\x63\xfe\xa2\xb0\xaf\x5d\xe1\x03\x31\x74\x4c\xa7\x81\x9d" - "\x11\xeb\x34\x00\xff\x04\xbb\x8f\xb2\x21\xac\x9f\x54\x62\xdb\x1f" - "\xa8\x01\x9d\x3a\x0d\xae\xdf\xb1\xf3\x61\xe6\x7d\xe3\x29\x17\xf7" - "\x8f\x02\x6c\xa9\xe1\xae\x84\xef\xb7\xf6\xcc\x11\xea\x59\x93\xf9" - "\xc0\x79\xdc\xdb\xaa\x67\x7d\xae\x6c\xca\xbd\xcc\xaf\x7c\x30\xdc" - "\x46\x6e\x2d\x63\xf2\xfd\x20\xe0\xdf\x2c\xae\xcd\x7a\x10\xe2\xdf" - "\x5f\xa7\xf8\x96\xf1\xe0\x52\x4f\xdf\x07\xe3\xdd\x83\x09\x80\xc5" - "\x69\x70\xfd\x0e\xf2\xcf\xf0\x9c\x91\xfd\x02\x27\xac\x2d\x3a\x1e" - "\x16\x4d\xe2\x20\x3d\xd5\x93\x3e\x42\x96\x00\xb4\x79\x30\xc3\xa3" - "\x4f\xce\x8c\xe9\x6e\x81\xe7\xad\xe0\xa7\xbb\xc4\x67\x1b\x3c\x6f" - "\xf7\x3c\xc3\xff\x7b\x3c\xfa\x06\xe3\xb3\x33\x9b\x93\x77\x60\xfc" - "\xb7\x24\x1a\x7c\xb2\x68\x8c\xaf\x1e\x84\xf8\xb7\x41\x88\x95\xce" - "\x44\xde\x1a\x77\xa6\xe0\xd0\xa4\xce\xc8\x47\xb4\x9d\xa0\x43\xe1" - "\xdd\x11\x1b\xf9\xf3\x7c\xb1\x9c\x76\x1b\x57\x6f\xf6\xf2\x23\x2c" - "\x0a\x68\x7c\x84\xb5\x69\x8a\x0a\xfe\xb7\xe1\x79\xe5\x5d\x85\x0f" - "\x29\x6d\xb2\xfb\x1c\x42\xbe\xcc\x8e\x3d\x25\xdd\xca\x39\x56\x88" - "\xe0\x0d\xcb\x10\x2b\x0f\x09\xeb\x93\x75\x9b\x94\xb3\xd1\xe7\xc3" - "\x7d\x08\x84\xfd\xc9\x70\xcf\x49\x17\x19\x29\xec\xf3\xaf\xbb\x4d" - "\x2d\xec\x6f\xbf\x41\x2d\xf7\xec\x37\x09\x72\xaa\xa5\xdc\x3b\x19" - "\xb8\x07\xa5\xd0\x97\xd6\xa5\x8e\x14\xf6\x9d\x14\xf7\x9b\xac\xca" - "\x24\xe3\x2a\x79\xb6\xdf\xa4\xb0\x47\xc1\x00\x7b\x4e\xd2\x82\xaf" - "\x27\x7b\xf6\x9c\x04\x3a\xe0\xda\x43\x35\x3d\xe7\x72\xc0\x3d\x56" - "\xb2\xd7\x4d\x78\xbf\xfb\x4f\x72\xa0\x37\x39\xb6\xff\x64\x70\xf6" - "\xe6\xa1\x0e\x86\x93\x29\x93\x3c\x67\x78\x4b\xd2\x12\x40\x5e\x44" - "\x3f\xe7\x01\x87\x98\x36\xc7\x46\xea\x3b\x7a\x7c\x33\xd0\x77\xd8" - "\xa7\x08\xef\xb3\x69\xae\x66\x87\x54\xae\x88\xf0\x87\xa6\x7b\x04" - "\xd8\xe5\x91\x70\x8d\xc2\x2b\xb1\x47\x7f\x9c\xa3\xad\x18\x23\x44" - "\xc9\xc0\xde\x64\x85\xd1\x24\x97\x2b\x6c\xa1\x4b\xd6\x82\xbe\x27" - "\xae\xb9\x4e\x72\xbb\x70\xed\x7f\x78\x92\xfb\x0c\x9e\xaf\xd9\x82" - "\x6b\xc9\x4a\x97\xe1\xda\xc6\x1b\x29\x9e\x53\x93\xe4\xfe\x8e\xee" - "\x66\x6b\x36\x9b\xc5\x33\x33\x2d\xee\x4c\x6a\x06\x3e\xc8\x31\xee" - "\xc0\xfd\xb7\x22\x65\x0e\x12\xa9\x0d\xfb\x78\xd6\xd9\x8f\x29\xee" - "\xbd\x85\x67\x94\xf1\x85\x0e\xd0\x95\x2a\xd9\x42\x57\x58\x9e\xd5" - "\xd5\x26\x9c\x13\x90\xe4\x1e\x45\x93\xb2\x1e\xa6\xc2\xd9\x62\x99" - "\xd4\x08\x7a\x36\x4c\x38\x43\x7b\x23\x3d\x03\xff\x47\x24\x6d\x3c" - "\x43\xf1\x7c\x4f\x28\xdb\x9c\xe4\xe2\xbb\x93\xb2\xf8\xdc\x85\x59" - "\x32\xf8\xdd\x3f\xe1\x77\xff\x84\xfa\xc4\x41\x99\x4a\x78\x7e\x94" - "\xee\x5e\x86\x6b\xa0\xf2\x84\xd8\x07\xda\x68\x10\xd7\x95\xd6\xe2" - "\x99\x9e\xb8\xcf\xf8\x42\x97\x21\x6f\xb7\xb8\x4e\x54\x38\x5b\x36" - "\xcb\x49\xc5\xef\xc4\x27\x6d\x24\x8f\x2e\xdc\x78\xa3\xb0\xde\x14" - "\xd7\x52\x25\xb9\x54\xf0\xcd\x3c\xa4\x87\x5c\x38\xcf\x5b\x58\x4f" - "\xf5\x70\xeb\x40\xe7\x7b\xf6\x1b\x6f\x17\x8f\x4d\xa6\xba\xba\xfd" - "\xb4\xf8\xc7\x6a\xaa\x33\x4e\xa6\x45\x4e\xd4\xcf\x32\x5a\xfc\x13" - "\x07\x3c\x43\xfa\x0d\x66\xaa\x33\x4d\xa6\xc5\xe3\x2b\xe0\x0e\xcf" - "\x2a\x0d\xd5\xd5\x4f\xa6\x85\xce\x38\xf8\x1d\xd8\x31\x17\xfe\x2e" - "\x8e\x16\xba\x55\x70\x87\x67\x3e\x1a\xf2\xc1\x33\x55\xc2\xbd\x86" - "\x16\x63\x3f\xcb\x23\x95\xf0\x9b\x38\x5a\xfc\xb3\x78\xf6\xad\x5b" - "\xe3\x85\x6f\x15\x4f\x8c\x67\xdf\x98\x14\xcf\xbe\x71\x57\x3c\xfb" - "\xc6\x2f\xe2\x85\x6f\x14\xe3\x5e\x24\x75\xb5\xb4\x98\xd3\x42\xbe" - "\x78\x5a\x1c\x66\x83\x3b\x3c\x8f\x98\x0d\xf9\xe0\x79\xa4\x01\xee" - "\xf0\x1c\x01\x75\xa9\x87\xe7\xd1\x7b\x20\xff\x01\x5a\x7c\xcd\x38" - "\xc8\x37\x85\x16\xcb\x8b\xe0\x0e\xcf\x0a\x17\xe4\x83\xe7\x28\x28" - "\xc7\x04\xcf\xca\x36\xc8\x0f\xcf\xf7\x62\x7d\x0c\xb4\xf8\x3e\x2c" - "\x37\x81\x16\xc7\x63\x7e\x78\x7e\x10\xca\x33\xc1\xf3\x43\xad\x70" - "\x87\xe7\x87\xf3\x20\x3f\x3c\x3f\x0a\x6d\xad\x33\xd2\xe2\x84\x16" - "\xc8\xf7\x38\x2d\x9e\x0a\xe9\x46\x78\x7e\x7c\x12\xe4\x83\xe7\xe9" - "\x98\x1f\x9e\x7f\xb5\x15\xf2\xc3\xf3\x13\x48\x23\x33\x2d\xfe\x75" - "\x19\xe4\x4b\xa4\xc5\x33\xed\x70\x87\xe7\xd9\x58\x7f\x78\x7e\xba" - "\x06\xee\xf0\x3c\x17\x68\x55\x0f\xcf\xbf\x83\xfa\xd5\x41\x6c\xfa" - "\x0c\x96\x3f\x83\x16\xcf\x47\xfa\xc0\xf3\x02\xa0\x9f\x09\x9e\x17" - "\x01\x3d\x4c\xf0\xbc\x24\x15\xf2\xcf\xe8\x9f\x9f\xcb\xa6\xd0\xfc" - "\x91\x84\x16\xaf\x99\x4f\xf3\x47\xc1\x7d\xad\x9c\xe6\x8f\x50\xd3" - "\xe2\x8c\x34\x48\x87\xfb\xda\x36\x78\x9e\x24\x3e\xc3\x3d\xfd\x00" - "\x3c\xc7\x89\xcf\x70\x5f\xb7\x1d\x9e\x27\x8b\xcf\x70\xcf\x8c\x81" - "\x67\xa0\x6d\x66\x27\x3c\xe3\xbd\x08\x9e\xa7\x88\xcf\x70\xcf\xaa" - "\x85\xbb\xcb\x3e\x5e\x9f\x65\x57\x94\xc7\xd9\x15\x0d\x7b\x70\x3e" - "\x92\x5b\x5f\x57\xc3\x47\x1a\x71\x6f\xe0\x91\xb9\x67\xc9\xa8\xe3" - "\xb2\xc7\x9e\x42\xbb\x67\xcd\xb6\x09\x67\xd5\x89\xfb\xcd\x8d\x3c" - "\x26\x4b\x58\x0a\x76\x3e\x1e\xcf\x2c\x87\xb6\x77\xd0\x82\x11\xa7" - "\xa1\xcd\x69\xb4\xe0\x9a\x63\x70\x87\xe7\x6b\x3f\x83\x36\xc3\xf3" - "\x7d\xc5\x70\x87\xe7\x79\x53\xa1\xed\x69\x5d\x85\x09\x46\x9b\xec" - "\x61\xa6\xb3\xdf\x28\x2d\x8b\x72\xe5\x82\x9e\x00\x3d\xba\xa3\x29" - "\x25\xca\x95\x02\x74\x32\x27\x44\xe1\x99\x12\x55\xfa\x5a\x1a\x59" - "\x2e\xd4\x09\xcf\x8d\xa1\xce\x58\x8e\x7d\xfb\x1a\x0a\xdf\xfe\x1e" - "\xfb\x33\x69\xe4\x9f\xfd\xbc\x7f\xec\x5a\xe1\xfd\x0d\x4d\x5a\xf6" - "\x5e\x49\xbc\xef\x7f\x87\xef\xef\x8e\xc2\x3e\xe8\x09\x39\x5a\x9b" - "\xec\xb1\x64\xcc\x63\x93\x25\x64\xd0\x82\x30\x62\xed\x6c\x17\xdb" - "\x38\x0a\xf3\x3d\x83\xbf\xf3\xd7\xaf\xc2\x97\x58\x2a\x74\x05\xb4" - "\x19\x63\x48\xd0\xfb\x9c\x2a\x27\xb6\xf6\x98\x6c\x9a\xba\x4a\xe8" - "\x1b\x68\x8a\xc7\xb5\x3d\x50\xc6\x49\x67\xb1\x4b\xa9\xda\x14\x05" - "\xe5\x4d\x9b\x98\xeb\xa0\x9d\x86\x9c\xa9\x60\x9f\x84\xf4\x19\x6c" - "\xbe\xb8\xf0\x7f\x3c\x9b\xe3\x23\xfc\x1f\xcb\xfa\x39\xa7\xa9\xf1" - "\xb7\x52\x9f\xdd\x5d\x98\x16\xcd\x47\x36\x25\xb0\x31\xaa\xc7\xbe" - "\xff\x88\xb7\x71\x51\x19\x64\x84\x6a\xd3\xc7\x50\xfe\xd4\x78\xdf" - "\xf8\xce\x93\x57\x78\x37\xfe\xaf\x90\x77\x97\xd0\x17\x33\x35\xd1" - "\xd3\x8f\x4b\xa1\x0d\x2f\x31\xdf\x26\x01\x6d\x11\xf3\xd1\xa6\x9a" - "\x71\x4f\x4b\x97\xdc\xac\x72\x95\x94\xab\xdc\x25\x4d\xf1\x54\xdf" - "\x94\x10\xe9\x92\x11\x36\xd7\x7e\xaa\xfb\x2e\x07\xf6\x91\x1d\xc2" - "\xbc\x1f\xf0\x23\xd7\xcf\xb8\x33\x8b\x70\x86\xf4\xbf\xe3\xf3\x59" - "\x5a\xb8\x69\xbf\xb5\xa3\x95\x18\xd2\x85\xb2\x3a\x69\x61\x61\x38" - "\x3f\x32\x2f\xae\x1a\x7d\xcb\x2c\xec\xdb\xf9\x0c\xd3\x37\x02\x9d" - "\xc1\x87\x9f\xda\xe2\xa9\x0b\xee\xed\xaf\x03\xda\xa1\xdf\x87\x6b" - "\xa3\x17\xba\xdd\xb8\x8f\x53\x91\x0d\xe8\xc0\xfa\x07\xa7\xd6\xa2" - "\x9e\x65\xdf\x9d\xa6\xe0\xc7\x38\x5d\x4d\xf3\x71\x1c\x54\x89\xfb" - "\xe2\x74\x0a\x6b\x29\x5d\x78\x1e\x1f\xda\x37\x96\xd7\x67\x3f\xe3" - "\x25\xda\x85\x9b\xb4\x6b\xd2\x33\x16\xae\xd7\x3e\xa8\x82\xc0\x4b" - "\xb5\x66\x99\x6a\xd5\xd2\x55\x6b\xd2\x37\xf6\xf6\x0f\x23\xba\x0a" - "\xa7\xa5\x01\x36\x84\xbd\xf2\x0f\x82\xcf\xc9\xfa\x8c\xa7\x4f\x41" - "\x5e\xef\x78\x85\x9d\xff\x00\x79\xca\x6c\xe4\x75\x21\x8e\xe0\x2b" - "\x9a\x92\x69\xa5\xbe\xf6\x45\x5c\x13\xbe\x1e\x7d\x7c\x3b\xb1\x92" - "\xd3\x50\x37\x76\x16\x60\x13\xee\x5b\x90\x99\x4d\x0d\x99\xa7\x11" - "\xe3\xa0\x1f\x1a\x12\x69\x55\x29\x39\xaf\x2b\xaf\x38\x26\x9b\xae" - "\x3a\xaf\x6b\x88\xf7\x9c\xd7\xe3\x2e\x69\xa8\xe0\xe5\x96\x1a\x3c" - "\xaf\xc7\x49\xa3\x49\x23\xd0\xb2\xbb\xc8\xd9\x0e\x3a\xbe\xad\xaa" - "\x00\xec\x0e\xc4\x06\xc2\x7e\x09\x6f\x94\x6a\xdd\x54\x1d\xee\x2e" - "\x20\x11\x70\x8f\xa4\x91\x8d\x36\xa7\xdc\x1c\x87\xef\xf1\x9c\x1e" - "\xb7\x53\x4d\x72\x5a\x28\xff\xac\x06\x70\x53\x40\xa8\x70\x36\xaa" - "\xe6\x24\x81\xf4\x31\xbc\xbe\xc1\x70\x3c\x91\x70\x98\x17\xfc\x1a" - "\x32\x1f\xfe\xcf\x5e\x44\x14\x90\x2f\x2a\xfb\x20\xa4\x77\xa9\xc7" - "\xb8\x72\xd5\x11\xdd\xb9\xea\x31\x4e\xaa\x96\x5b\xdb\x1c\xc4\x79" - "\x4b\x69\xde\x1d\x76\x12\xbe\x03\xfc\x9f\x2a\x1e\xe4\xab\x52\xbf" - "\xc7\xbd\x59\x3d\xd2\xb5\x59\x1d\xee\x74\xaa\x23\x5c\x1b\xd4\xe1" - "\xdd\x1b\xd4\x23\x9d\x5d\xea\x08\x6b\xaa\x9d\x1c\xb2\xff\x89\x34" - "\xb5\xb5\x0b\xfd\x8a\x4e\x45\x63\x87\x53\xd1\x60\x91\xb7\x91\x71" - "\x77\x6a\x09\xfa\x43\xb2\x9d\xe0\x03\x03\x26\xe4\xae\xd7\x4b\x41" - "\x7f\x36\x96\x01\x7d\x47\x4c\x9f\x48\xbf\x73\x17\x3e\xd9\xa2\x7a" - "\x12\x74\x51\x7e\x78\xcc\x71\xd9\xe3\x80\x9f\xdf\x3d\x4e\x0b\x7f" - "\x53\x02\xf1\xb8\x0a\x2e\x88\x6f\x05\x3e\x80\xef\xf5\x04\xe8\xb4" - "\xf0\x18\xcc\xcb\xf2\x25\xb5\xda\x84\xfb\x0c\xb5\x70\x86\x69\xe1" - "\xb4\xc9\x55\x42\x9c\x36\xbd\x67\xfe\xaf\x31\xbc\xff\x75\xe7\x90" - "\x67\x7e\x4f\xbc\xcb\x83\x3e\xd1\xd5\xf5\xdb\xbf\x48\x8b\xcf\x1c" - "\xc1\x31\x49\x1e\xe8\x06\xf5\x6d\xc4\xbd\xa2\x68\x6e\xa2\x18\x63" - "\x4e\x17\xc6\xd6\x71\xad\x36\xf6\x43\x88\x69\xc2\x38\x15\xcf\x25" - "\xe0\xde\xfc\xb5\xb8\x3f\x17\xf6\x3b\x00\xae\xcd\xd0\x0e\x1b\xd0" - "\x61\x04\xc4\x67\x35\x70\xd5\xc2\x65\x28\xc7\xfe\x88\x02\x32\xdd" - "\xd3\x57\xd3\x7f\x5d\x7f\x09\xf1\xcf\x1b\x16\x6f\xbc\xfa\xcb\x68" - "\x28\x4b\x1b\xfc\x7c\xbe\x5f\x46\x0f\xd0\x6f\x1c\x8e\xfb\xcc\x52" - "\x7d\x5d\x73\x19\xdf\xb3\x2f\x2d\xe8\xfd\x5f\xae\x02\x3d\x91\x27" - "\xbc\x2b\x31\x27\xe4\x7c\x4f\xc2\xf0\x5d\x0d\xce\x5f\x80\x67\x55" - "\xba\x8c\x5a\x3b\x1d\xa4\x0c\xc7\x11\x62\xf4\xb5\x35\xe7\xec\x1c" - "\xca\x45\x13\xa4\xc1\x6f\xb7\x95\x9d\x13\xcb\xad\x68\x4a\xc9\x5d" - "\x4b\x84\xb3\x46\xf0\xbc\x22\x94\x97\xb2\x1c\x88\x05\xf1\x6c\xa5" - "\xf4\x30\xd0\x57\xbf\xfc\x04\xfe\x8f\xc0\x7c\x54\x6e\x4e\xe0\xa1" - "\x0c\x90\x99\x7d\x54\x61\x56\xf3\xba\x86\x1a\xb0\x0f\x5a\x3a\xbe" - "\x34\x9a\xdf\xd1\x94\xd8\x55\xf8\x2b\x6c\xbf\x10\xf7\xe3\x3e\x40" - "\xd8\xd7\xe1\x86\x98\xbb\x69\x9f\x8b\xd0\xa9\x2e\x62\xca\x38\x4b" - "\xec\xa3\x9d\x1d\x76\x85\xa5\xc2\xae\x68\x2c\x73\x2b\x2c\xad\x70" - "\x1d\xd1\xa6\xe3\xf8\xef\xaf\x8e\xf4\xec\x67\xf9\xfd\xc0\xfb\x59" - "\x42\x99\xb1\x9e\x3d\x2d\xdd\x1b\x82\xdf\xcf\xd2\xcd\x7d\xa1\xae" - "\xca\x1c\x7c\x3f\x4b\xf0\x31\x9b\xc1\xbf\x34\x78\xf6\x1e\x71\x0b" - "\xf3\xc9\x89\xdc\xad\x30\x47\x0b\xfb\x97\x64\x19\x84\x3d\x48\xd0" - "\xd7\x44\x5b\xd3\x55\x98\x18\xed\xf1\x1f\x51\x7f\xba\x5f\x74\x3a" - "\xe0\xc2\xf4\x38\x9b\x6c\x5e\xaa\x47\xb7\x82\x3d\x9d\xed\x1e\x53" - "\x90\xd8\x85\x6b\x04\x9c\x9a\x47\x31\x2f\xd0\x11\xf7\x04\x0b\x73" - "\x3b\x35\x53\xe0\x7a\x18\xae\x47\xdc\xba\x86\x04\xb7\xae\x51\xeb" - "\xd6\x95\xcf\x81\x2b\x19\xae\xf9\x70\xa5\xc0\x95\x0a\x17\xf8\x91" - "\xe5\x69\x70\xc7\xf7\x19\x70\x65\xc1\x95\x0d\x57\x1e\x5c\x5b\xdd" - "\x3b\x9a\x66\xbb\x65\xe1\x31\x70\xc5\xc2\xa5\x72\xeb\x2c\xfb\xdc" - "\x3a\xb3\x8a\xad\xdb\x4c\x34\x78\x70\xda\xff\xbe\xa9\xb7\xb2\xb3" - "\x13\x46\x7c\x41\xa3\xf0\x5c\xdf\xec\xb3\xb8\x97\x9d\xda\xa4\xee" - "\x0c\xee\x0c\x0d\x59\xa2\xdd\x1f\xae\xb1\x7c\xd0\x31\xce\xe0\xca" - "\x7b\x22\xc1\x6f\x9f\x49\x74\x53\xb2\x2b\xa6\x94\xb8\x0a\x48\x1e" - "\xe8\x35\x59\x53\x4a\x1b\x49\xb2\x93\x5c\x4b\x5b\x37\xc9\x4d\xa5" - "\x6e\x41\x07\x64\xe3\x59\x2d\xef\x64\x20\xc6\xdd\x34\x59\xe5\x2c" - "\x69\x48\x74\xcb\x2d\x5a\x2a\xb7\xec\x13\xf6\xc7\x03\x5d\x82\x67" - "\x95\xf5\xc4\xa0\x88\x39\x88\x43\x1b\x3b\xce\x92\xcd\xa9\x94\x6f" - "\xd4\x80\xef\xd5\x0a\xc0\x93\x91\x57\x05\xec\x89\x71\xe8\xaf\x8f" - "\xd0\x3c\xc0\xd2\x68\x37\xd0\x8d\xc7\xf8\x13\x70\xb7\x3b\x93\xc4" - "\x79\xb0\x07\x36\x5d\xe9\x39\xdf\x89\x8e\x4c\x6c\x81\x77\xe1\x78" - "\xfe\x53\x25\xc4\xa1\x95\x99\x24\xb6\x12\xde\x09\x67\x75\x42\xbd" - "\x67\x69\xa3\x28\xbf\x52\x4d\xaa\x9f\x27\x11\x8a\x93\xec\xfc\x57" - "\x37\xd0\xde\x7b\x06\x42\x79\xc5\xcc\x93\x2a\x62\x52\x1f\x05\xdb" - "\x5c\x03\x7c\x29\xaf\x70\x82\xfd\x02\x5a\xba\x83\xa3\xe5\x93\x25" - "\x17\x8a\x96\xce\x18\xfd\x1e\x46\xcf\x14\x82\x34\xeb\x4d\x4f\xa4" - "\xf1\xa6\x36\xa0\x27\xd0\xd5\xda\xe2\x86\x58\x92\x2c\xf2\xd0\x73" - "\x17\xd0\x13\x68\x1a\x8d\x34\x05\x7a\x08\x34\xa5\x22\x4d\xab\x25" - "\x34\x05\xdd\x25\xec\x25\x88\x34\xe5\x81\xa6\xd5\x7e\x68\xda\x13" - "\xcf\x03\x4d\x77\x07\x44\xd3\x7d\x43\xa0\xe9\xaf\x6d\xfe\x68\xea" - "\x42\xbf\x41\x5f\x5e\x46\x41\x2f\x5a\x5d\x87\x84\x7d\x31\xc1\xe7" - "\x3b\x02\xbe\x6b\x2b\x2f\x6f\xa8\xc0\xf3\xbc\x71\x6c\x1e\xcf\x1b" - "\x13\xf6\x71\xda\x47\xcf\xbb\xf5\x8d\x76\x4c\x03\xbd\xa6\xb9\x0b" - "\xe7\x03\x69\x6d\x60\xbb\x68\x6d\xd3\x39\xec\x0b\x4b\xba\xbe\x1b" - "\x7d\x6a\x7d\xd3\x5d\x3c\xd5\x10\xd4\x29\x0b\x26\x92\xf0\x6e\xd0" - "\x1b\xda\x4c\x72\x63\x19\xe8\xc2\x6e\x9d\xe5\xc8\x09\xd9\x8c\xfd" - "\xd3\xb5\x3c\x85\x2b\x17\xf7\x77\xe4\x41\xe7\x82\x2e\x17\xf8\x8b" - "\x3c\xc3\x31\xbe\xc6\x05\xb8\xde\x64\xe6\xeb\x9f\xa6\xb8\x48\xae" - "\xa6\x2f\x7f\xf9\xdc\x64\xf0\x3d\x07\x97\x13\x3c\xf3\x30\xbb\x1d" - "\xf9\x5a\x43\xac\x6d\x5e\x39\xe1\x45\x1d\x8d\xbc\x40\xb9\x40\x19" - "\x29\x95\xe8\x66\xd0\xfb\xca\x2a\xf1\x0c\x10\x77\x01\xe8\x66\xdc" - "\xef\x1d\x78\x89\x67\x83\xf4\x2b\x1f\x9b\x41\x3e\x36\x09\xe7\x33" - "\x45\x03\x3d\x6a\xba\xbb\x18\x0f\x91\x67\x56\x97\x59\xe0\x5f\x99" - "\x68\x0b\x18\xdd\x2d\x7f\xa6\x34\x19\xfc\xb9\x49\x6a\x5e\xdf\x68" - "\xa3\x5d\x9a\x31\x78\x46\x17\xc4\xfc\x71\x51\xa9\xe0\x3f\x7d\x07" - "\xb6\x62\x35\xe0\xeb\x14\x89\xdd\xbd\x1a\x7c\xa2\x2e\x3c\x67\x0d" - "\xea\xb3\x91\x9d\x4f\xcb\x17\x3e\x11\x0f\xef\x84\xfd\x2a\x79\xcf" - "\x7e\x95\x67\xd4\xd8\x0f\xe1\xed\x1f\x5a\xa3\xe6\x7a\xbe\x59\x22" - "\x33\xb8\xe5\x93\xd4\x6c\x7d\xe9\xac\x55\x6c\x0c\xb9\x4d\x38\xcb" - "\xb5\x43\x36\x6b\x0f\xeb\xc7\xfd\x26\x55\x9b\x83\xf3\x7e\x66\xcd" - "\xa5\xc5\xdf\x27\x6b\xf1\xac\x6d\xcf\xbb\xdc\x64\xa4\x83\xea\xce" - "\x3c\x02\xba\x7c\x52\x22\x9e\xc1\x8e\x7b\x7f\x05\x87\xc5\x59\xc2" - "\x7e\xb7\xee\x12\x99\x11\xe8\x94\xc0\xeb\x65\x16\xd0\x29\x71\x74" - "\x25\xb4\xf5\x79\x68\xeb\x09\xa0\xeb\x09\x68\xeb\x06\xb1\xad\xe2" - "\xd9\x73\x3c\xd0\x1f\xde\xf5\x6f\x1b\x3d\x6d\x5d\x09\xf4\x2e\xfa" - "\x32\x6e\xcb\x49\xf2\x23\x0a\xfe\x78\x63\x87\xb0\xb6\xa7\xcb\xea" - "\x3a\x4a\xf0\xbb\x82\xed\x2e\x29\xd7\xcc\x05\x3c\x22\xcd\xc1\x5f" - "\x00\x9b\xd7\x60\xf0\xf0\x01\xeb\x43\x9d\x9a\x31\xd5\xab\x49\x9c" - "\x40\xfb\x53\x64\x12\xca\x33\xd0\x3e\xb6\x1a\xe9\xef\x7b\xfe\xf3" - "\x38\x81\x07\x23\x81\x07\xab\x45\x1e\xe8\x44\x1e\x80\xbf\x0c\x76" - "\x38\x02\xe2\xc6\xe8\xea\x02\xc6\x83\xe0\x68\x94\xe4\xf7\xbc\xc2" - "\x10\xe5\xb5\xd3\xbf\xbc\x3e\xdd\xd8\xcd\x62\x64\x19\xee\x9b\x49" - "\x23\x9b\xee\xe1\x9d\x20\xb7\x7a\x51\x6e\xa9\xe6\x11\x8f\xcc\x1e" - "\x97\xcd\x5e\x11\x98\xcc\x3e\xf5\xcc\xff\x52\x99\x1d\x77\x61\x65" - "\xf6\xe9\x9b\x7c\x65\xf6\xe9\x39\xbe\x32\xfb\xf4\x68\xaf\xcc\x8a" - "\xef\x86\x45\x66\x9f\x56\x5d\x1a\x99\x7d\x5a\xd5\x8f\xcc\xb6\x04" - "\x20\xb3\xd1\x7e\x64\x36\xfa\xc2\xc9\xec\x6f\x1e\xbf\x78\x36\xf6" - "\xb7\xdb\xba\xb9\x7e\x6c\xec\x66\x89\x8d\x55\xa0\x8d\x9d\x13\xdd" - "\x9f\xbc\x3a\x2b\x41\x5e\xe5\xa2\xbc\x3e\xfb\x17\x28\x6f\xee\xb5" - "\x87\x8e\x0c\x2e\xaf\xae\x4a\xaf\xff\xe4\x57\x66\x35\x28\xb3\xfb" - "\x88\xd5\x26\xc8\xec\x22\x8f\xcc\x56\x8a\xb1\xd0\x00\x72\x3b\xce" - "\x9f\xdc\xe2\x79\x5c\x78\x16\xd7\x80\x72\x2b\xfa\x4b\xce\xf1\x28" - "\xb7\x86\xcb\xcc\xd6\xce\x3d\xec\x2b\xb7\xbf\x95\xfb\xca\xed\xdc" - "\x4f\xbc\x72\x2b\xbe\x1b\x16\xb9\x9d\xdb\x7a\x69\xe4\x76\x6e\xeb" - "\x0f\xc7\xd6\xfe\xd6\xef\xfc\xff\xe1\xb7\xb5\xcf\x3e\x26\xc8\xad" - "\x3f\x5b\x9b\x2b\xda\x5a\x05\xda\xda\xdf\x7d\x1e\x98\xec\x26\x37" - "\xfe\x2f\x97\xdd\x0b\x6c\x73\x9f\xf9\xa3\xaf\xec\x3e\x63\xf6\x95" - "\xdd\x67\xb6\x78\x65\x57\x7c\x37\x2c\xb2\xfb\xcc\xf6\x4b\x23\xbb" - "\xcf\x6c\xff\xe1\xd8\xdc\x67\xfd\xce\x95\x53\x4d\x20\x79\xc7\x64" - "\xf3\xae\xb5\x56\x0a\xf3\xf8\xf2\xac\xae\x07\x09\x9b\x6f\x32\xef" - "\x01\x6b\x74\x3c\xe1\x8b\x5d\x29\x78\x2e\x04\xce\x7b\x29\x97\xcc" - "\x2b\x61\xf3\x20\xe6\x3d\xe3\x99\x17\xb3\x5b\x3c\x3b\x62\xa0\x79" - "\x31\xb4\xc8\x29\xce\x9f\x98\xb7\x9d\x61\xc3\xe9\xf0\x3c\xb3\x7d" - "\xab\xe6\x55\xd0\x17\x9d\x76\xfb\x68\xa7\xdd\xdf\x58\x51\x64\x3e" - "\xa5\x78\xe6\xd2\x99\x09\xa5\xaa\x33\xc5\x84\x94\x09\xe3\x30\xf3" - "\x9a\xa1\x8d\x0e\x36\x1f\x62\x9a\xf2\x4c\xc1\x6c\x02\x69\x6d\x9e" - "\x34\xe1\x0c\xec\x82\x30\xca\xc3\x3b\xaa\x7f\xd9\xb5\x3b\x87\x44" - "\xe0\x5e\xa0\x77\x9e\x43\x2c\xce\xeb\x04\x1d\x31\x0e\xcf\x6d\xc2" - "\xb3\x32\xe8\x4f\x7e\xda\x59\x7d\x9a\x84\x37\x6d\x15\xfa\x9e\x71" - "\x3e\xcd\x1e\x3d\xe2\x3f\xec\xf6\x0a\xca\x85\x13\xbe\xaa\x34\x82" - "\x2a\x2c\x36\x61\xfe\x2e\x60\xc5\x33\xc7\x06\xcf\x3c\xe3\xc7\xeb" - "\xf7\x79\xf6\xa2\xa4\x50\xbf\xbf\xe6\xd8\x39\x3c\xab\xbc\x3a\x9d" - "\x28\xe1\x92\x53\x9d\xc5\xd6\x55\x38\x3f\xdb\xd3\x97\xe8\x77\x2e" - "\x36\x9e\xe3\xfb\xd3\xe8\x70\x71\x3e\x0f\xae\xa9\xad\x10\xbe\xc3" - "\xf1\x45\x6e\x48\xa7\x05\xb9\xc2\xd9\x59\x51\x40\x0b\x9c\x3f\x8b" - "\x67\x1a\xf1\xd5\xa5\xaa\x17\x6e\x20\xe4\x9d\x4d\xed\x1c\xce\xdd" - "\x70\xff\xcb\x4f\x3b\x0d\x39\xbf\xc0\x3d\x27\x84\xfd\xca\x8f\xcb" - "\x9e\xdb\x98\xf4\x0d\x3b\xb3\x17\xfe\xdf\x86\xe3\x2f\x33\xe1\x19" - "\xc7\xf2\xf9\x33\xd1\xe1\x98\x17\xd2\xef\x36\x64\xfe\x9d\x44\x69" - "\x49\x84\x1e\xda\x26\xe6\x15\xd6\x70\xd8\x64\xcf\x09\x6b\x3a\xe0" - "\x79\x1c\x8e\x19\xc0\xef\x22\x70\xce\x12\xad\x2c\x8d\x10\xf4\x43" - "\x89\xc5\xc6\x8f\x2f\x8d\x10\xe6\x9e\x42\x3b\x4b\xa1\xcd\x90\x47" - "\x8e\xf3\x73\x84\x7b\x0e\x51\x6e\x4f\xc7\xbd\x4d\x9f\xdb\x0a\x77" - "\xb9\x61\x35\xce\x2d\x99\x6f\xc7\xb2\xfd\xce\xf1\x97\x5b\x6c\xb4" - "\x20\x9c\xb0\x75\x3a\xb2\xbf\x1d\x93\x2d\x88\x8d\x92\x51\x4a\x2b" - "\xf5\xfb\x5e\xc0\x3e\x6e\x9c\x57\x2d\xcc\x15\x7f\xce\x0d\xe5\x87" - "\xef\x16\xfa\x70\x9f\x3b\x62\x93\xcd\x2f\xea\x99\x93\x2f\x8c\x37" - "\x2d\x98\x8c\xdf\xc1\xdf\x88\xf9\xc5\xf3\x8d\x2c\x36\x55\x4e\x18" - "\x85\xf7\xe3\xd9\xdc\xeb\x88\x65\x5d\x85\x0b\x62\xbc\x73\xce\x84" - "\xdf\x01\x96\x16\x60\xff\xaf\xb0\x07\x3d\x3e\xfb\x9d\xd7\x2c\xf2" - "\xad\x31\x1a\xb0\xd1\x9b\x77\x1e\x8c\x00\x2e\x3c\x18\xc1\xfa\xbe" - "\x9b\x63\xe3\xd8\xf8\xc6\x82\x8f\x30\x9f\x1e\x78\xe8\xde\x15\x1d" - "\x2e\xec\xf9\xed\x44\xbe\xe0\xfc\xf8\x85\xeb\x91\x2f\xa5\x60\x0b" - "\xc4\xbc\x15\xde\xfa\xe3\xf3\x42\x81\x9f\x3c\xf0\x82\xcd\xd3\x5f" - "\xf8\x84\x70\x7e\x0c\xe8\x0c\x9c\x23\x6e\xcc\x82\x7a\x21\x6e\x01" - "\x23\xef\xa4\x3b\xb8\xea\x4c\x96\xfe\xd7\xd3\x0e\x0e\xe7\x7d\x60" - "\x5f\xb8\xee\x79\x12\x8e\x7d\xea\x58\x26\x8d\xd1\x0b\xeb\x16\x04" - "\x3e\x6e\x02\xde\x65\x02\x76\x81\xe6\xa5\x40\xbf\xea\x6e\x61\xbc" - "\x6a\x5f\x35\x4f\xe4\x3c\xe4\xb3\xc9\x16\x6e\x85\xf2\x94\x55\xd7" - "\x51\x3b\xce\xcb\x06\x1a\x6e\xea\x2a\x5c\x98\xe2\xa1\x21\xd6\x09" - "\xe7\x55\xeb\x84\xf9\xf5\x0b\x8e\x30\x0c\x2d\x78\xcb\xd3\x66\x7f" - "\xf4\xd4\xbd\x43\x62\x74\x77\x92\x78\x5e\x7e\xab\x9a\x86\xfd\x74" - "\x0f\xf6\x37\xcf\xea\x20\x04\xf7\xb8\x4f\xda\xf6\x05\xb5\xda\xdd" - "\x84\x57\xdc\xaa\xc6\xb1\x09\xf7\x0b\xb7\x8f\x4d\xda\x08\xf4\x02" - "\x7b\x9f\xeb\x20\x4a\x6b\x8e\x9d\x9d\x73\x46\xbe\x27\xee\x75\xa0" - "\xc3\x41\xaf\x83\x4d\x0d\xcf\xfd\x9e\x5c\x8f\xf4\xe2\x15\x0d\x89" - "\xc7\x65\x29\xf7\xce\xcd\x20\x79\xc1\xe9\xd1\x14\x61\x5e\x2e\xfa" - "\x17\xa0\xf3\x39\x9c\x4f\x67\xb5\x83\x7f\xa2\x6b\x48\x0c\xb2\x9c" - "\x44\x7f\x3a\x12\xdb\xcd\x63\x3f\xb4\xd8\xe6\x24\x6c\x73\xa7\x83" - "\x60\x5f\xfe\xac\xb5\xb8\x97\xe8\x59\xc2\xeb\x6e\x55\x63\x9b\xc1" - "\xd7\x31\x07\xdf\xa7\x9f\x62\x1c\xe8\xdb\x14\xe8\xcd\xbf\xf0\xd3" - "\x3d\xbc\xdc\x62\xc6\x6f\x63\x1d\x70\x7d\xcd\xac\xb3\x44\xa0\x3b" - "\xd2\xdf\xea\x70\x13\xaa\x90\xd6\xc1\x15\x64\x1d\x16\xf9\x6f\xff" - "\x9d\x24\xa6\xe4\x1d\xc6\x77\xf7\x0b\x22\x0d\x34\x38\x46\x66\x31" - "\xe3\x1e\xf7\xb3\xb0\x0e\xf6\x93\x64\xe6\x49\x22\xf0\xdf\xaa\xee" - "\x20\xee\xb0\xdb\xc7\xe2\x9c\x0a\xe4\x7f\x8e\x0b\xf8\x7f\xce\x81" - "\xfb\x7f\xd8\xad\x79\xe7\x09\xfa\x2f\xae\x33\x6a\xae\x2f\xff\x17" - "\xdf\x3b\x37\x2b\x58\xfe\x2f\x1e\x26\xfe\x2f\xbe\x0c\xda\xbf\x24" - "\x84\xf6\x2f\x19\xa6\xf6\x2f\xb9\x0c\xda\x9f\x1a\x42\xfb\x53\x87" - "\xa9\xfd\xa9\x7e\xdb\x3f\xed\x7a\x9e\x0a\x73\x6d\x22\xeb\x6a\xd0" - "\x06\x30\x7b\xb5\xf4\x0e\x9c\x4b\x23\xac\xa7\x12\x9f\x09\x5b\x5f" - "\x15\xd1\xeb\x59\xde\xeb\x59\xd9\xeb\x79\x5c\xaf\xe7\xe8\x5e\xcf" - "\x31\x9e\x67\xb0\x23\x23\x4e\xc9\x52\xab\xc0\x2f\xcd\xb3\xc9\x96" - "\xc6\x8b\xef\x63\x71\x7f\x1c\xb0\xe9\xb1\xfe\xce\xda\x53\xc8\x08" - "\x75\x72\x94\x08\x67\xe0\xc9\x96\xbe\xd5\x5d\x40\x28\x0d\xbb\x41" - "\x8d\xe7\x94\xf1\x25\xe5\x19\xb3\x40\x4f\x5b\xed\x0e\xf0\xf3\xa3" - "\x47\x42\xd9\x3f\xc1\xf3\x17\x91\xaf\xaa\x74\x9c\x5b\xb3\x74\x07" - "\xb6\xf3\x4e\xad\x81\xf0\x61\xb7\x0b\x73\x1b\x78\x5d\x79\x86\x3d" - "\xec\xf6\x1b\xe8\x8e\xa6\xd9\xba\x02\x3e\xc2\xda\xd1\x42\xf4\x1c" - "\xaf\xca\xce\x06\xfe\x76\xec\x27\x9b\x3b\x68\x7b\xb6\x8b\x3a\xac" - "\xf3\x0d\x24\xd7\x8e\xe7\x97\x98\x49\x93\xbd\x45\x38\xc3\x44\x38" - "\xab\xc5\xbe\x9f\xa0\xff\x93\x8b\x79\x20\xad\xc9\xfe\x16\x69\x84" - "\x67\xc3\xea\xaf\xa0\x9d\xcb\x9e\xb0\x76\xbc\x05\xf1\x52\xb9\x96" - "\x97\x97\xcf\xa1\xf2\xf2\xe4\xc6\x0e\x3c\xa3\xb5\x7c\x3e\xd6\xb5" - "\x09\xea\x61\x75\xd5\x62\x9c\x35\x5f\x28\xb7\xb3\x59\x88\x49\x71" - "\xcc\x96\x57\x40\x7e\x45\x79\x32\xd6\x0f\xeb\xd6\xff\x38\x6c\x5d" - "\x1b\xd4\xfd\xc1\xb9\xea\x70\x82\x6b\x20\x82\xc3\xc8\xb2\x34\xbf" - "\x7e\x74\x89\x31\x95\x95\x1b\x11\x4a\xb9\x7e\xf5\x3f\x94\x2b\xd6" - "\x57\x19\x42\xb9\xcb\xfb\x9c\x79\xed\x2d\xd7\x24\xd6\x57\x15\x4a" - "\xb9\x19\x03\x94\x2b\xd6\x37\x21\x94\x72\x2d\xfe\xcb\xad\x17\xeb" - "\x9b\x17\x42\xb9\x1a\xbf\x6b\x08\x11\x0f\xa1\x61\x41\xe3\x77\x7d" - "\x31\x62\x21\x34\x1c\x68\x06\x68\xbf\xb1\x2d\x34\x0c\xac\x50\x0d" - "\x84\x81\xd0\xf8\xbf\x62\x40\xfe\x87\xc6\xfb\x15\xe6\x81\x78\x1f" - "\x1a\xdf\x9f\xf7\x8b\x7f\x8c\x0d\x80\xf7\x7b\x68\x64\x53\x02\xaf" - "\x2f\xdf\xc3\x47\xd6\xbd\xf6\x02\x9f\x40\xa6\x6d\x21\x24\xaa\x82" - "\x5c\x3b\xad\xea\x0b\x9a\x20\xc4\xdc\xcf\xef\xdf\x52\x49\x38\x88" - "\xa1\xb9\xb7\x37\xb5\x72\x56\x57\x3c\xea\x2d\xf7\xde\x4c\x87\xec" - "\x67\x90\xfe\x09\xd8\xc1\x4e\xf0\x65\x59\x59\xe5\x7b\xf4\x39\x09" - "\x44\x58\x1f\x07\x71\xc4\xac\xb5\x5f\x50\x5c\x77\x9c\xf4\x3d\xe8" - "\xd7\x0a\xdc\xab\x90\x5c\x0b\xbf\x75\x01\x8e\xa1\x1c\x07\x79\x97" - "\xb7\xcb\x66\xd9\x85\xbc\x76\x61\x7e\xba\xbe\xee\x35\x8c\x15\x68" - "\xae\x1a\xf7\x1d\xb3\x1f\x97\xad\xbc\x25\xcc\x4e\xb8\x6a\xe1\xec" - "\x9c\x95\x2a\x9b\x2c\x4d\x29\xae\x31\xed\x10\xf6\xc7\x83\xba\xe3" - "\xfe\x78\x2f\x40\xdc\x80\xf9\xef\xd4\x12\xae\x4e\xd8\x4f\x78\xe5" - "\x0c\xdc\x33\x6f\xa0\xb5\xda\xee\x12\xcb\x56\xfc\x3d\x2d\x01\xfb" - "\x7c\x92\x70\x4d\x9d\x76\x42\x63\x4a\x89\x1e\xe2\x93\xe9\x13\xb1" - "\x3f\xe5\x34\xc9\xd9\x42\x79\xec\xdb\xa2\xf2\x86\x78\x9c\x7b\xc8" - "\xf6\x73\x5f\xd9\x8e\xb1\xbe\x78\x66\xd2\x0d\x27\xe0\x59\x88\x91" - "\x70\x0e\x8e\xbc\x5c\x4d\xf5\x8a\x84\xa6\xce\xd3\x84\xed\x49\xbe" - "\xf2\x1b\xdc\xbb\xec\x8c\xdc\x92\xd7\x29\xb7\x14\x41\xbd\xda\x3c" - "\x6d\xc0\xef\x7b\xd2\x31\x26\xc4\x7c\x5d\x85\x69\xe1\x9e\xb5\xdb" - "\x7e\xce\x15\x1e\x9b\x14\x4d\xed\x48\x5f\x56\x97\x55\x2b\x90\x07" - "\xe0\x87\x64\x75\xe6\xaa\x27\xb0\x3e\x92\xb4\x32\x8c\xb5\xa1\xde" - "\xa9\x2c\xee\x2d\x4f\x15\xd6\xe9\x83\x3d\x98\xab\xe6\x82\xf4\x89" - "\xd3\xe6\x63\xdb\x0c\x13\xd0\xfe\xae\x7a\x0a\xca\x7f\xe8\x98\x2c" - "\x8d\xed\x53\x59\x52\x9e\xc5\xd6\x5f\xa6\xcd\x86\x6f\x64\xc1\xb3" - "\x0a\xf3\xc1\xfb\x16\xf1\x7d\x9e\xe4\x7d\x1e\xce\x45\x15\xdf\x77" - "\x8a\xef\xb7\x4a\xde\x6f\xd5\x4e\xc0\x7e\x8f\x55\x31\xd8\x06\xa0" - "\x63\x0a\xbc\xcf\x10\xf6\x38\x10\xce\x73\x2c\x4f\x11\xf3\x65\x74" - "\xc8\x56\xdd\x7b\x06\x30\x06\xef\xb3\x25\xbf\xcf\xae\xcb\x8a\x23" - "\xd3\xaa\x90\x86\xab\x12\x6d\x5c\x83\xb8\x36\x3b\x6d\x8e\xd0\x76" - "\xb0\xa1\xd2\xf2\x6c\xb2\x55\xe3\xd0\x4e\x76\x82\x8f\x06\x79\xa6" - "\xe0\x37\xa5\xf4\xf6\xac\x02\x55\xa5\xae\x5a\xa4\x5a\xb2\x66\xfd" - "\x6a\x5c\xc5\xe7\xbb\x3e\x4d\x89\xeb\x5c\xf9\x12\xb3\xc6\x5a\x81" - "\xeb\xee\x94\xc2\x1a\xef\xed\xc0\x47\x97\xbe\x71\x8f\x3b\xb2\x31" - "\xce\xad\x6f\x98\x9d\x7b\x96\x70\x39\xd1\xf4\x4b\xc3\xa6\xa9\xe4" - "\x94\x6c\xd5\x97\xc2\x39\x91\x2a\x61\x4f\xfc\x4e\xc3\xa6\xff\xc2" - "\x34\x61\x2f\x30\x6b\x0a\x4b\xfb\xb7\x1c\x33\xf7\x71\x4e\x2b\x67" - "\x49\x39\x4d\xea\xa2\xed\xc4\xa8\x3a\x8d\xfb\xc2\x76\xfe\x1b\xdf" - "\xcc\xe1\xdc\xdc\x53\xb2\xd5\x4f\xe0\xb7\xb0\xff\x00\xff\x67\x7d" - "\x21\xab\x1a\xf1\x3b\x38\x6f\x11\x68\xf3\x37\xfc\x1e\xb4\xaf\x39" - "\xac\x12\xe7\x39\x13\x39\xe4\xd3\xf1\x3a\xb3\x46\x90\xf7\xc2\x55" - "\x79\x2e\x4e\xfe\x27\x71\x5d\x1f\xa9\x1c\x8b\x73\x74\x57\x67\x49" - "\xd6\xb9\xc9\xcf\x70\xe4\x51\x48\x2b\xf1\xec\x59\x81\x67\x07\xf9" - "\xd3\x1f\xe7\x21\x4e\x3e\x5f\xa9\x2f\xe2\xe5\x66\xa0\xaf\x59\x63" - "\x06\x0d\x16\x25\x9c\x45\xdf\x0d\x75\xd1\xa6\x51\x85\x39\x39\x07" - "\xe5\x14\x68\xf1\x67\x9c\x43\x18\xd9\xb8\xe7\x2d\x9c\x33\xa8\x6f" - "\x8c\xfb\x53\xa6\x83\x3b\x64\xa9\x25\xaa\xdf\xa2\x8f\xb5\xda\xfd" - "\xeb\x54\xea\xba\xbd\xc5\x40\x2c\x6d\xef\x93\x4f\x8f\x98\x89\x7c" - "\x3e\x09\xcb\xb5\x51\xb7\xd0\x97\x90\x41\xb8\x24\x1b\x09\xc3\xfd" - "\x94\x70\x0f\x75\x3c\x2f\xbd\xc9\xd1\x08\x7e\xcf\x3b\x19\x6f\xe7" - "\xb4\x8f\x50\x3d\x4d\xc0\x5f\x62\x63\xd2\xc2\x1a\x20\xbb\xb0\x2e" - "\x5b\x81\xfd\xe3\x92\xb5\x3f\x19\x5b\x4e\x92\x88\x46\xcd\x51\x92" - "\x9d\x42\x79\x9c\xe3\x97\x94\x12\x46\x85\xf5\x3f\x59\x90\x59\x0b" - "\x3c\xdd\xa0\x8e\xdc\x99\x49\xc6\x35\x65\xd8\x88\xb5\xdd\x4c\x76" - "\xa5\x93\x71\xb4\x4b\x33\xda\x62\x39\x44\xa8\x5e\xad\x7a\x37\xc7" - "\x30\xc2\x33\x1f\x2b\x2a\x5f\x86\xfd\xa1\x91\x25\x38\x2f\xeb\x1c" - "\x89\x5b\xf8\x55\x9e\xd0\x87\x8b\xfd\xe5\xae\x2e\xb5\xca\xd9\xa5" - "\xbe\xb9\xbb\x4b\x3d\xc1\xd3\xcf\xfe\xdc\x0a\x25\xa9\xc2\x75\x43" - "\x85\x8b\xe4\xb8\x6e\x08\xfd\x4b\x97\x62\x92\x1a\xfb\xd4\x85\xfd" - "\x61\x36\xa8\x63\xf8\x25\x6a\x72\x97\x5d\x58\x97\x84\xfd\xfc\xca" - "\xea\xc5\x50\xdf\x8e\xd3\x44\x3a\xb7\xe8\xfc\x06\x35\x87\xf3\x8a" - "\x68\xe1\xea\xbd\xdd\x55\xfa\x22\x9c\x5f\x04\x76\x21\x3e\x78\xd9" - "\xd6\x0a\xfe\x33\xb6\x1f\xf8\xb1\xe7\xad\xd3\xc8\x1f\xe0\xd3\x69" - "\x3b\x87\xbc\x68\x4c\x45\x3e\x34\xfb\xf0\x41\xe0\x5b\xba\x83\x43" - "\x7e\x20\x2f\x90\x27\x5e\x7e\x7c\x2e\xf0\xe3\x2d\x9e\xf1\xa3\x1b" - "\xec\x81\x87\x27\xe7\x63\xf4\x15\x03\xf1\x05\xf9\x81\xbc\xb1\xb4" - "\x1d\x25\x3e\x3c\xb1\x33\x9e\x00\x3d\xc7\x7a\xf8\x82\x3c\xb1\x76" - "\x80\xcf\x0b\x7c\x79\xf2\x73\x42\x7e\x3d\x91\xf2\x8d\x33\x3e\xeb" - "\xe1\x8f\xcb\x1f\x7f\xbe\xf1\xf2\x07\x78\xdf\x97\x3f\x27\x95\x38" - "\xee\x83\xfc\x29\x0b\x86\x3f\x96\x36\xc6\x1f\x97\xc8\x9f\x89\x89" - "\x84\x73\x74\xa9\xb9\x1d\x99\x24\x7e\xc6\x57\x2a\x62\x4a\x6e\x24" - "\x40\xeb\xc9\xbc\xce\x92\x15\x9a\x1c\xad\xdb\x1f\xb8\x1c\xa5\x4f" - "\xbf\x2a\x47\xc1\xca\xd1\xda\x8e\xa1\xc9\xd1\xba\xbc\xab\x72\x74" - "\xb1\xe4\x68\x5d\x76\x6f\x39\xea\xb1\xd5\xe9\x4b\x57\x2d\x5a\xb1" - "\x7a\xc5\xea\xe5\xaa\xc5\x1b\x33\x96\xae\x63\x16\xdb\xc7\x66\x47" - "\xbb\x73\x12\x38\x3c\xf3\xdc\x52\xd1\x4c\xde\xbd\xa1\x99\x73\x7f" - "\x1d\x1d\x4e\x4b\xa6\x6a\xf9\x92\xa9\x76\x3c\xff\x1c\xe5\x0d\xcf" - "\x45\x3f\x2e\xdb\x68\xc3\xbd\x00\xd9\x3e\x2a\x1b\x85\xf9\x97\xe0" - "\x1b\x46\xe3\xf8\xcb\x0b\x9b\x48\xf8\x0b\xb8\x2e\xda\x81\xfd\x1c" - "\xc2\xfb\x27\x70\xdf\x32\x5a\x55\x1a\x8d\x7b\xd9\x74\xca\xcb\x55" - "\x5b\xa1\x2c\xbb\xc2\xac\x09\x57\xe1\x3a\x92\xf5\xad\x60\x8f\x2b" - "\xbc\x7b\x13\x6d\x94\xd3\x91\xeb\x27\xa1\x9c\xe3\x9a\xbe\x53\xb2" - "\x4c\xc5\x79\xdc\xbb\x1d\xfc\xd7\xb9\x13\xe1\x3b\xe3\xf5\x15\xc2" - "\xbe\x0b\x20\xf3\xec\xfd\x06\x61\x4f\x33\xa7\xbc\x61\xb6\x70\x6e" - "\xbc\xbc\x71\xcf\x99\x92\xc6\xb8\x43\xd9\x35\x44\xf5\x34\xca\x7c" - "\xe6\x03\x4f\x56\x80\xcc\xcf\x36\x90\xc6\xe8\x3f\x91\x4f\x93\x01" - "\x6b\xc9\x83\xc9\xbc\x04\x63\x13\x02\x93\x79\x0f\xb6\x10\x53\x88" - "\x2d\xc4\xd5\x35\x80\x2b\xc4\x9a\x07\x5b\xe5\xe7\x18\xb6\xa2\x8e" - "\x10\xe5\xce\xd3\x80\x2f\x17\xc3\x17\xae\x73\x6e\xcc\xfa\xcc\xbf" - "\xec\x9f\xeb\x85\x2d\x4e\xc4\xd6\x06\xc0\xd6\x06\x2f\xb6\xe6\x1d" - "\x55\x92\x5d\x02\xb6\x52\xbc\xd8\xd2\x4d\x52\x7b\x70\x85\x18\x43" - "\x3c\xf1\xcb\xd5\x04\xe5\xdd\x83\xb1\xea\x65\x6c\xfc\x54\x90\x7d" - "\x0e\x64\xbf\x4b\x62\x43\xc7\x0f\x45\xf6\x37\x08\xfb\x3f\x20\x4f" - "\x90\x3f\xc8\x17\xe4\xc5\x95\xc8\x07\x3c\x1b\x9a\x76\xf5\xc7\x8b" - "\x85\x15\x83\xf1\x02\xf9\x80\xfc\x10\xf8\x00\xfc\xf0\x8c\x65\xe3" - "\xd8\x26\xf2\x04\x79\x71\x67\x36\xe1\x90\x2f\xd5\x20\xef\x28\xe3" - "\x40\xdb\x2c\xe4\x8b\xe0\xb7\x16\x28\x96\x6f\x1f\xeb\x3d\x33\xa6" - "\xab\x70\xe3\xa4\xbe\x3e\xeb\xc6\x04\xef\x3e\x6b\xeb\xdb\x58\x8c" - "\x61\x8e\x66\x63\x51\x9b\xfe\x20\xca\x30\xc1\x78\x4f\x88\xed\xdc" - "\x10\xdb\xc9\x21\xb6\x2b\x81\xd8\x0e\xfb\xde\x84\x3d\x08\x36\xea" - "\xd8\xb8\x18\xc4\x72\x8a\x86\x78\x88\x2b\x84\x3d\x11\x85\x31\x58" - "\x85\x25\x0f\xc7\x8c\xa8\x0e\xe2\xc6\xd7\x38\x02\xcf\x80\x1b\x77" - "\x90\x78\xd9\xf8\x96\x38\xc6\x6c\x67\xfb\xf3\x6d\xca\x66\xf5\x5b" - "\x2f\xcc\x53\x10\xc6\xe7\x38\x7e\x8f\xfb\x05\xdf\xf1\x39\xe9\xf8" - "\xed\xbb\x39\x76\x71\x6c\x6e\x93\xb0\xbf\x11\xea\x04\xd4\x63\x6f" - "\xe7\x34\x73\xde\xf1\xb9\xcf\xf0\xfd\x52\xdf\xf1\xb9\x4d\x82\xbf" - "\x67\x93\x6d\x2a\xc3\x39\x29\xf0\x3c\x83\xa5\xaf\xdf\x2e\x4d\xf7" - "\x8e\x7f\xb3\x74\x5c\x03\x25\xc6\xd7\x1d\x2c\xb6\xde\xb4\xcf\x13" - "\xc3\xfa\xf1\x67\x82\xd0\xb3\xb9\xf3\xbd\x7a\x36\x57\x88\x35\x69" - "\x74\x53\x62\x63\x1f\x3d\x8b\x7b\x5b\xe5\x98\x66\xa1\x9e\x2d\x69" - "\x48\x60\xf5\xdb\x7c\x2f\xd0\x24\x0c\xcf\x7a\xc3\x74\x5c\x2b\x84" - "\x3a\xb7\x4a\xd0\xc1\x4d\xf1\x5b\x85\x31\xf8\xcd\x73\x7c\x75\x6f" - "\x4e\x91\xaf\xee\xdd\xfc\xe2\xc0\xba\x77\xcb\x1d\x03\xeb\xde\xcd" - "\x1f\x5c\xd5\xbd\xa1\xea\x5e\xf0\xbb\x86\xa4\x7b\xb3\x1d\x57\x75" - "\xef\x85\xd2\xbd\xd9\x9d\x12\xdd\x3b\xc7\x57\xf7\xe6\xec\xeb\xab" - "\x7b\x73\x0e\x78\x75\xef\xe6\x14\x5f\xdd\x9b\xa7\x08\x4c\xf7\xe6" - "\x8e\xbe\xb0\xba\x37\x57\xed\xab\x7b\x73\x45\x3d\xb7\xc9\x1d\xbc" - "\xee\xcd\x3d\x3c\xb0\xee\xcd\xfd\xd2\x57\xf7\xe6\xee\x67\x3a\x36" - "\x4f\xce\x74\x6f\xae\x59\xd4\xc9\x2e\x69\xba\x57\xf7\xb2\xf4\xbe" - "\xba\x37\x2f\x76\x10\xdd\xab\x76\xf3\x1e\xdd\xdb\x0a\xba\xb7\x95" - "\xe3\x97\xfb\xd3\xbd\xdb\xe2\x1a\x51\xf7\xa6\xa3\xee\xdd\x16\x37" - "\xb0\xee\xdd\xba\x03\x75\xac\xb0\x57\xe5\x2b\xb4\x4d\xd8\x2b\xf0" - "\x15\xda\x8e\x78\x9c\x95\x0d\xe9\x90\x86\x7b\x2a\x62\x3e\xc6\x7b" - "\x8f\x8e\xce\x3b\xdc\xa3\xa3\x21\x1f\x7f\xbd\x57\x47\xa3\x7e\x46" - "\x3d\x5d\xf5\x0a\xb5\x55\xbf\x82\xe7\x6f\xe4\x13\x8f\xae\xd6\x41" - "\x1a\x9e\xb1\x81\xfb\x01\xe1\x7c\x44\xa0\x41\xdb\x0b\xf0\x3d\xcc" - "\x0f\xf9\xd4\xbe\x3a\x7d\xeb\x7c\x5f\x9d\x9e\xff\xdc\xc0\x3a\xfd" - "\x05\xd9\xc0\x3a\x3d\xff\xc5\xab\x3a\xfd\x52\xe9\xf4\x02\xcb\x55" - "\x9d\x3e\xb8\x4e\xef\x8f\x17\xbd\x75\xfa\x1d\xa2\x4e\xaf\xea\xd1" - "\xe9\x05\x66\xff\x3a\x7d\x6b\x76\x5f\x9d\xbe\xb5\xcc\xab\xd3\xf3" - "\x27\xfb\xea\xf4\x6d\x5f\x06\xa6\xd3\xb7\x1e\xbd\xb0\x3a\x7d\xab" - "\xcb\x57\xa7\x6f\x13\xcf\x2c\xcc\xdb\x28\xd5\xe9\x7c\x58\x20\x3a" - "\x7d\xdb\xdb\x1e\x9d\x8e\x3a\xf3\x6d\xbe\x55\xa2\xd3\x51\xb7\x6d" - "\xfb\xc0\x90\x79\x4c\xa2\xd3\xb7\x15\x31\xdd\xbd\xcd\xe6\x16\x74" - "\xfa\xb6\x4a\x96\x9e\x97\x25\x4d\xf7\xea\x74\x96\xee\x96\xea\xf4" - "\x76\xd4\xe9\xdb\x1c\x83\xe8\xf4\xb8\xc0\x75\xfa\x4b\xc9\x5e\x9d" - "\xfe\x52\xb2\x47\xa7\xa3\x1e\x47\x9d\x8e\x3a\x18\xf5\xba\xb0\x8f" - "\x96\x30\xa7\xa2\xf8\x93\x28\x3b\x89\xc0\x7d\x73\xb1\x0f\x03\x75" - "\xb1\xfe\x34\xd3\xed\x42\x9e\xd5\x2c\x0f\xe8\xe7\x36\xd0\xc9\xed" - "\xa0\x93\xdb\x75\xa7\x48\x38\xe4\x6b\xd5\xe3\xfc\x3c\x78\x46\xdd" - "\x1d\xd5\x01\x76\xc0\x25\xd8\x81\x56\xb4\x1f\x8c\x5e\xc5\x9f\xf8" - "\xda\x82\xc2\xaf\xfa\xf3\xd7\xcb\x24\xb6\xa0\xfa\x3a\xda\xd2\x55" - "\xf8\xfb\x08\x8f\x7e\xd7\xc3\x33\xda\x80\xb2\xd3\x82\x0d\xb0\x81" - "\x0d\x68\x63\x36\xe0\xf7\x93\x7a\xf2\x40\x1d\x84\x3c\xcc\x4e\xb4" - "\xbe\x80\xe7\x8f\xb1\x3c\xb3\x7d\xed\x44\xf1\x56\x5f\x3b\xf1\xfb" - "\x6d\x68\x27\xa0\x0d\x78\x56\x97\x8c\xd7\x99\x93\xdd\x55\xfa\x0a" - "\xb4\x19\xec\xfd\x8b\x13\x7b\xec\xc4\x75\x12\x3b\x91\xe5\xb1\x13" - "\xbf\x7f\xef\xb2\xb7\x13\x80\xe5\xc6\xec\x2b\xd1\x4e\x14\x75\x5e" - "\x0e\x76\x02\x79\x70\x8d\xa4\x6f\xd5\x1f\x1f\x70\x2f\x86\xc6\xb4" - "\x1f\x8a\x9d\x28\xb2\xfb\xb7\x13\xc5\x7b\xfb\xda\x89\xe2\x5a\xaf" - "\x9d\xf8\xfd\x7c\x5f\x3b\x51\x32\x3a\x30\x3b\xf1\xd2\x88\xde\x76" - "\x02\x69\xa6\x67\xf3\x02\x3a\xd0\x3e\xb8\x75\x96\x3c\x1e\x6d\x45" - "\x48\x76\xe2\xa5\x58\x5f\x3b\xf1\x92\x38\xe7\xbf\x70\x66\xf0\x76" - "\xe2\xa5\xcf\x85\xf1\x7e\x8f\x9d\x38\xd7\xdb\x4e\xbc\x74\xd4\xd7" - "\x4e\xbc\x54\xc3\xec\x41\x49\x04\xb3\x13\x2f\x19\x59\x7a\xe1\x0c" - "\x69\xba\xd7\x4e\xb0\xf4\xbe\x76\xa2\x44\x35\x88\x9d\x90\x3b\x63" - "\xf4\x15\xce\x92\xc6\x3c\xd7\xde\x52\xd5\xa4\xe4\x47\xdd\xbd\x65" - "\x80\x61\xdf\xcd\xce\xa5\xf1\x8c\xf9\x2c\x60\x63\x0c\xbc\xb8\xa6" - "\xb7\x3b\x46\x5f\x74\x3c\x0d\xe4\xa0\xc3\xbf\x1c\x80\x0c\x44\x78" - "\x64\xa0\x51\xf3\x15\x01\xb9\xe0\x70\x1c\x68\x17\xe0\xdf\xda\xd9" - "\x2a\xe8\x25\x79\x5b\x02\xc1\xbd\x14\x15\x1d\x44\xa9\x90\xc9\x46" - "\xe2\x18\x83\x1b\x64\x61\xfa\x44\xca\xff\xbc\x35\x81\x28\x34\x24" - "\x12\xe5\xe1\x1d\x71\xac\x01\xf7\x63\xc0\x31\x06\xc0\x61\xdc\xc2" - "\xbf\x79\xc7\x18\xba\x03\x18\x63\xb0\x66\xd9\x84\x31\x06\x5c\xa3" - "\xc4\x83\x0c\x08\xeb\x66\x70\x8c\xc1\x21\x8c\xcb\x28\x85\xb5\x2a" - "\xc2\x18\xc3\x31\x82\xe3\x0b\x9e\xfd\x58\x70\x5c\xe1\xe7\xc9\x84" - "\xc3\xfd\x1a\x76\x01\xfe\x4d\xea\x46\x82\x32\x10\xbc\x3e\xd2\x6d" - "\x1d\x68\x9e\x8d\x0b\x68\xea\x96\x37\xe6\xd1\x9d\x4d\xda\x3f\x1f" - "\x73\xc8\x70\xaf\x4a\x37\xf0\x88\x07\xbd\x43\xe5\xbd\xf4\x8e\x53" - "\xa4\xb7\x93\xd1\x1b\x78\x15\xb1\xa0\x93\x50\x48\x67\x7b\x55\x3a" - "\x6c\x80\x35\xf5\xd8\xaa\x4d\x48\xdb\x38\x52\x25\xee\x57\xc9\x6f" - "\xd6\x8c\xe6\x81\x9e\xb8\x36\xe1\xed\x73\x8e\x11\x6e\xf9\xad\xea" - "\x92\x6e\x32\x09\x74\x8c\x02\x75\x0c\xe0\x73\xcc\xee\x6e\xa0\xed" - "\x97\x8c\xb6\xb8\x6f\x1a\xde\x5d\x9b\xe1\x37\x4e\xf5\xcd\x4e\x27" - "\xd0\xd7\xc1\xe8\xbb\x60\xad\x92\x54\x7b\xc6\xd8\xc0\x3e\x37\x01" - "\x4f\x51\xc7\xcc\xea\x8c\xa2\x78\x1e\x84\xdb\xa9\x8e\xe1\xbf\x06" - "\xfa\x76\xe2\xd9\x1f\x6a\xe4\xbf\xb2\xfa\x38\x8e\x09\xfe\x9d\x8d" - "\xb1\x29\xc4\x7d\x30\x36\x83\xbe\x5f\xa1\x22\xd6\x7d\xa0\x6f\x47" - "\x96\x4c\x76\x56\xe9\x8b\xa8\x0c\xf4\x7d\x76\xb0\xf4\xd5\xb7\x5d" - "\x1a\xfa\xaa\x7e\x40\xf4\xd5\x59\x42\xa7\x6f\x99\xdf\xf5\xcf\x17" - "\x96\xbe\xca\x1f\x10\x7d\x4b\x27\x85\x4e\xdf\x3f\xec\x1d\x88\xbe" - "\xe8\xdf\x7b\x7c\x7b\x8f\x5f\x8f\xb6\x85\xd9\xc6\xed\x31\x5e\x9f" - "\x7e\x7b\x8c\x67\x2c\x12\x68\x13\xae\x13\xfb\x68\xb4\xcb\xf0\x0c" - "\x84\xf2\x3f\x78\xc6\x21\xd1\xa7\x16\x78\xb5\x13\x78\xb5\x1a\xd7" - "\xa0\x88\x7c\x02\x3b\xb0\xb0\x13\x74\xf5\x78\x7d\x85\x5b\x07\x76" - "\xe2\xf5\x52\x95\x1f\x9e\x71\xa8\xe3\x15\x19\x44\xb9\x40\xcb\x78" - "\xc7\x6f\x06\x9e\x75\x83\x7f\xe3\x68\x27\xb8\xa6\x34\xaa\x1d\xf4" - "\xaa\x53\x33\x7a\x3e\xf8\xcb\x1e\xbe\xbd\x93\xe9\x10\x7c\x9b\x7e" - "\xf9\xb6\xc3\x97\x6f\x67\xfa\xe1\x9b\x77\x6c\x1f\xfc\x4c\x81\x6f" - "\x36\x81\x6f\x82\x5e\xdf\x0c\xbe\x0d\xf0\xcf\xc3\x37\x41\xaf\x03" - "\xef\x04\xbe\x75\x1c\x23\x6e\x89\x5e\x47\xbf\x06\x79\x67\x49\x01" - "\xff\xb2\xb0\xac\x44\xe0\x1b\xfa\x99\x29\xc1\xf2\xad\xbc\x97\x3f" - "\xb3\xfd\x60\x60\xfe\x4c\xf9\x61\xf4\x59\xa4\xfe\x0c\x3e\x9f\x81" - "\x98\xd7\xad\xb0\x6c\xed\x0c\xc9\x87\x29\x6f\xf7\xf5\x61\xb6\xef" - "\x67\x75\x7a\xf9\xa6\xe0\x7d\x98\xed\xc2\x78\xd3\xdb\x3b\x59\x2c" - "\xe9\xeb\xbf\x6c\xaf\xf2\xf5\x5f\xb6\x6b\x99\x9f\xb2\xdd\x7c\xa6" - "\x00\xfd\x97\xed\x5b\x59\xfa\xcb\x2a\x69\xba\xd7\x7f\x61\xe9\xec" - "\xac\xf2\xed\x2d\xc1\xf9\x2c\x77\x5d\x62\x9f\x25\x6e\x00\x9f\x25" - "\xee\x0a\xf3\x59\x5e\x89\xbf\x6a\x53\x07\xd3\xf9\xdb\xdb\x43\xd7" - "\xf9\xff\x52\x71\xd5\xa6\x0e\x46\xdf\x57\xf2\x42\xa7\x6f\x85\x23" - "\x74\x9b\xba\x4b\xeb\xb5\xa9\xbb\xb4\xfe\x6d\xea\xce\xaf\xae\xda" - "\xd4\xfe\x6c\xea\xbf\xd8\x42\xb7\xa9\x3b\x6b\x7c\x6d\x6a\xe5\xf8" - "\xc0\x6c\xea\xae\x3b\x86\xdf\xa6\xee\x9a\xe2\x6b\x53\x2b\x23\x58" - "\x9d\x76\xac\x0f\xde\xa6\xee\xfa\xc6\xbf\x4d\xdd\xf5\xbd\xaf\x4d" - "\xdd\x65\x64\xb6\xb3\x32\x86\xd9\xd4\x5d\xad\x2c\x7d\x47\x86\x34" - "\xdd\x6b\x53\x59\x3a\xb3\xa9\x95\xea\xe0\x6c\xea\x8d\x97\xd8\xa6" - "\xaa\x06\xb0\xa9\xaa\x2b\xcc\xa6\x56\xf9\xdd\xff\xf2\xaa\xce\xf7" - "\xe8\xfc\xca\x29\xa1\xeb\xfc\x6a\xbf\x67\x14\x0e\xae\xf3\x5f\x4d" - "\xf5\xea\xfc\x57\x53\xfd\xeb\xfc\x3d\x87\xaf\xea\xfc\xfe\x74\x7e" - "\x55\x4b\xe8\x3a\x7f\xcf\x5e\x5f\x9d\xff\xda\xb5\x81\xe9\xfc\x57" - "\x6f\x1a\x7e\x9d\xff\x6a\x9c\xaf\xce\x7f\xd5\xc5\xea\xb4\x7b\x45" - "\xf0\x3a\xff\xd5\xa3\xfe\x75\xfe\xab\x5f\xf9\xea\xfc\x57\x6b\x99" - "\x6e\x7f\x4d\xc9\x74\xfe\xab\x16\x96\xbe\x5b\x23\x4d\xf7\xea\x7c" - "\x96\xce\x74\xfe\x6b\x31\xc1\xe9\xfc\xa8\x4b\xac\xf3\x95\x03\xe8" - "\x7c\xe5\x15\xa6\xf3\xff\x35\x2f\x74\x9d\xf4\xba\xc3\xab\x93\x5e" - "\x77\xf8\xd7\x49\xaf\xaf\xba\xaa\x93\xfa\xd3\x49\xaf\xc5\x85\xae" - "\x93\x5e\x8f\xf7\xd5\x49\x6f\xbc\x1e\x98\x4e\x7a\xfd\x83\xe1\xd7" - "\x49\xaf\x1b\x7d\x75\xd2\x1b\x65\xac\x4e\xff\xea\x0e\x5e\x27\xbd" - "\xb1\xd6\xbf\x4e\x7a\x63\xa3\xaf\x4e\x7a\x43\x1c\x83\x7a\x63\x2f" - "\xd3\x49\x6f\xa4\xb0\xf4\x7f\x75\x49\xd3\xbd\x3a\x89\xa5\x33\x9d" - "\xf4\x46\xcd\x60\x3a\x09\xb1\xdf\x18\xdd\x0b\xfb\x2b\x3d\xd8\x7f" - "\x33\xe2\xd3\x4a\x0f\xf6\xdf\x14\xf6\xac\xe2\x2b\x4b\xa3\x5f\xca" - "\x24\xe1\x25\x78\x96\x08\xc8\xbb\xf6\x59\xc4\xfe\xbe\x2d\x38\x6f" - "\x41\x7e\x04\x74\x58\x9b\xa8\xd3\xb2\x40\xa7\xb5\xc1\x33\xee\x31" - "\x35\xbe\x34\x1a\x75\x11\x8e\xff\xe3\x33\xd3\x6d\xf6\x11\xb8\x5e" - "\x32\xa8\xb5\x4c\x6d\xe2\x5a\xa6\xd4\xbe\x6b\x99\x2a\x25\x6b\x66" - "\x50\x36\x14\xf9\xb2\x48\x1c\xd7\x05\xfd\x26\xea\x31\xf3\x08\x97" - "\x5c\xd4\x63\xe7\x40\x8f\x9d\xf3\xca\x04\xea\xb1\x33\xa0\xc7\x3a" - "\x37\xa8\x27\xa0\x2e\xeb\xbb\x8e\x89\x8d\xe3\x0a\x7a\x4c\xd7\x4b" - "\x8f\x2d\xef\xa5\xc7\x96\x81\x1e\x4b\x01\x3d\xa6\xf0\xca\xc3\xcf" - "\x8e\x10\x6e\xc6\x22\x90\x09\xd0\x63\xe5\xe7\x50\x8f\x99\x42\xd4" - "\x63\xfb\x12\x7d\xe5\xe1\xcd\x0f\x02\x93\x87\x7d\x26\x7f\xf2\xe0" - "\xd4\x85\x2a\x0f\xfb\x5a\x7c\xe5\xe1\x4d\xf1\x3c\xe2\x37\xce\x07" - "\x2f\x0f\x6f\xe6\xf7\xc8\xc3\xca\xde\xf2\xf0\xe6\x8b\xbe\xf2\xf0" - "\xe6\x7c\x86\xfb\x37\xf7\x33\x79\x78\x53\x2b\xca\x89\x43\x9a\xee" - "\x95\x07\x96\xce\xe4\xe1\x4d\xc3\xd5\xf1\xd9\xcb\xd5\x46\xff\x79" - "\xa0\x33\xb4\xaf\x8e\xcf\x0a\x71\xd9\x9b\x2d\xa1\xc7\x65\x6f\x5d" - "\xa2\xf1\xef\x1f\x52\x5f\xf2\x9f\xd3\x42\xa7\xef\xdb\x97\x68\xfc" - "\xfb\x87\xd4\xaf\xf0\xd6\x10\xc6\xbf\xdf\x1d\x70\xfc\x7b\x60\x3f" - "\xe6\xbd\x16\x4b\x8f\x0f\xff\x5e\x8b\x67\xce\x65\x5f\x1f\xfe\xbd" - "\x27\x7c\xd7\x2f\xbd\x7b\xb6\xf7\x7c\xc8\xc1\x7c\x7b\xd7\xff\x2a" - "\xdf\xfe\x9d\x49\xa1\xfb\xf6\xef\x8d\xf3\xf5\x65\xde\xcf\x0f\xcc" - "\x97\x79\xef\x0f\xfe\x7c\x19\x57\xc8\xbe\xfd\x7b\x7b\x7c\x7d\x99" - "\xf7\xd3\x44\xfe\x7f\x12\xbc\x2f\xf3\xfe\x4c\xff\xbe\xcc\xfb\x73" - "\x7d\x7d\x99\xf7\xc5\x73\xf5\xde\xcf\x63\xbe\xcc\xfb\x53\x58\xfa" - "\xbb\x06\x69\xba\xd7\x97\x61\xe9\xcc\x97\x79\xbf\xe4\xea\xb8\xed" - "\xe5\xea\xcb\xfc\x9b\xdf\xf3\xaf\xae\xda\x5a\x8f\x2d\x78\x7f\x4f" - "\xe8\xb6\xe0\x83\xd9\x57\x6d\xed\x60\xf4\xdd\x1f\x1f\x3a\x7d\xff" - "\xbd\x26\x74\x5b\xfb\x61\x82\xd7\xd6\x7e\x98\xe0\xdf\xd6\xd6\x7e" - "\xe0\x6b\x6b\xff\x63\xd1\x55\x5b\x3b\x90\xad\xfd\xa0\x22\x74\x5b" - "\x5b\x9b\xe7\x6b\x6b\x3f\x3c\x19\x98\xad\xad\x75\x0f\xbf\xad\xfd" - "\x50\xee\x6b\x6b\x3f\x6c\x15\xf9\x7f\x47\xf0\xb6\xf6\xc3\x0f\xfd" - "\xdb\xda\x0f\x3f\xf1\xb5\xb5\x1f\x8a\x6b\xe8\x3f\xec\x60\xb6\xf6" - "\xc3\x7d\x2c\xfd\x3f\x26\x49\xd3\xbd\xb6\x96\xa5\x33\x5b\xfb\xe1" - "\x60\xeb\x7f\xae\x8e\xe7\x5e\x32\x5b\xfb\x9f\xf3\xaf\xda\x82\xc1" - "\x6c\xc1\x5f\xe4\xa1\xdb\x82\x03\x07\x42\xb7\x05\x1f\xcf\xf0\xda" - "\x82\x8f\x67\xf8\xb7\x05\x7f\xfd\xc4\xd7\x16\x7c\xb4\xea\xaa\x2d" - "\x18\xc8\x16\xfc\xe7\xde\xd0\x6d\xc1\x5f\x4b\x7c\x6d\xc1\xc7\xe7" - "\x03\xb3\x05\x1f\x8f\x1e\x7e\x5b\xf0\x71\xb4\xaf\x2d\xf8\xb8\x4d" - "\xe4\xff\x03\xc1\xdb\x82\x8f\x4d\xfe\x6d\xc1\xc7\x8d\xbe\xb6\xe0" - "\xe3\x3d\x4c\xe7\x7f\xec\x60\xb6\xe0\xe3\xfd\x2c\xfd\xa3\x78\x69" - "\xba\xd7\x16\xb0\x74\x66\x0b\x0c\xe1\x57\xc7\x79\x2f\x57\x5b\xf0" - "\x89\x26\x74\x5d\x55\xe7\xf0\xea\xaa\x3a\x87\x7f\x5d\x55\xb7\xca" - "\x57\x57\xfd\xd7\xf5\x57\x75\xd5\x40\xba\xca\x10\x1d\xba\xae\xaa" - "\xeb\x35\xfe\x6b\x0c\x70\xfc\xb7\xce\xef\xf8\x6f\xe8\xba\xaa\xae" - "\xd7\xf8\xaf\x51\x1c\xff\xfd\xe4\xab\xe0\x75\x95\x71\xad\x7f\x5d" - "\x65\xec\x35\xfe\x6b\x14\xc7\x7f\x8d\xe2\xf8\xaf\x51\x1c\xff\xfd" - "\xa4\x4d\x9a\xee\xd5\x55\x2c\x9d\xe9\x2a\xe3\x10\xc7\x7f\x1b\x54" - "\xde\xf1\xdf\x06\x61\xcd\x00\x5f\xd1\x94\xd8\x77\xfc\xb7\xfe\x8f" - "\x38\xfe\xeb\x95\x09\xd3\xdd\xc2\x58\x30\xca\x45\x27\xdb\x57\xa4" - "\xdf\x71\xe1\xeb\x9b\x12\xaf\x8e\x0b\x0f\xc7\xb8\x70\x7d\x8a\xaf" - "\x9c\x34\x34\x06\x26\x27\xf5\x47\x87\x7f\x5c\xb8\xbe\xc3\x57\x4e" - "\x1a\x6a\x45\xd9\x0d\x61\x5c\xb8\x61\x87\x7f\x39\x69\x78\xd5\x57" - "\x4e\x1a\xc4\x79\xb9\x0d\x16\x26\x27\x0d\x45\xa2\xfc\x38\xa4\xe9" - "\x5e\x39\x31\x4a\xc6\x85\x1b\x5a\x03\xb1\xe9\x2e\x79\xe3\x56\xb4" - "\xd1\x93\x5a\x1f\x75\xf7\xe0\x39\x43\xc4\x73\x7f\x36\x7d\x31\xd3" - "\xfd\x88\x63\xe7\xde\xd2\xd8\x41\x6d\x7a\x9b\x68\xd3\x53\xfb\xda" - "\x74\x8f\x3d\x47\x3c\xef\x0a\x68\x4c\xb8\x17\xae\x83\xb2\xe7\x8b" - "\xcb\x86\x82\x6b\xc4\xb4\xaf\x3d\x0f\x15\xd7\x07\x2f\xd1\xfa\x97" - "\x1f\xd2\x98\x70\x43\x47\xe8\xb1\xdd\xa1\x4b\xb4\xfe\xe5\x87\xd4" - "\x4f\x7d\x70\x08\xeb\x5f\x3e\x1d\x70\xfd\xcb\xd5\xbe\x09\xa4\xef" - "\x21\x5b\xe8\xf4\x6d\x4c\x0e\xdd\xdf\x6f\x8e\xf0\xfa\xfb\xcd\x11" - "\x1e\xdf\xc6\xb3\x5f\x1a\xe8\xcc\x70\x5d\x3a\x5c\xe7\x08\x79\x29" - "\x5d\xd8\xeb\x3b\xc2\xda\xf6\x39\x9e\x4f\x04\xfe\x8e\x75\x4b\x52" - "\x96\xd4\xdf\x69\x1a\xef\xf1\x75\x92\xd0\x0f\x02\xbf\x06\x7d\x1a" - "\x8f\x8f\x8f\x7b\xe3\x0c\x38\x1f\xf4\x96\xd2\x58\x8c\x09\x9c\x8a" - "\xc6\xad\x57\x7e\x3c\x60\x49\x08\x3d\x1e\xb0\xf6\x9a\xff\xd6\x1c" - "\xe0\xfc\x37\xab\xdf\xf9\x6f\xa1\xc7\x03\xd6\x5e\xf3\xdf\x9a\xc5" - "\xf9\x6f\x8d\x9f\x07\xef\xe7\x34\x0f\x30\xff\xad\xb9\xd7\xfc\xb7" - "\x66\x71\xfe\x5b\xb3\x38\xff\xad\x59\x9c\xff\xd6\xd8\x22\x4d\xf7" - "\xfa\x39\x2c\x9d\xf9\x39\xcd\x01\xcd\x7f\x03\x3f\xa7\x68\x08\x7e" - "\xce\xe0\x7d\x17\x97\x8d\x9f\xb3\xe4\x32\xf1\x73\x3e\x53\x05\x60" - "\x27\xb6\xf6\xb2\x13\xb1\xff\xbb\xec\x44\xf3\x10\xe6\xbe\xfd\xdf" - "\x01\xe7\xff\x0b\xf4\x2d\x91\xd0\x17\x75\xb4\x48\x5b\x77\x6c\x69" - "\x6c\x48\xf4\x05\xdd\x5c\x95\xf3\x43\xa1\xed\x67\x9a\xd0\x69\xdb" - "\x72\xe4\xaa\x8f\x33\x18\x7d\xff\xaf\x39\x74\xfa\xfe\xf7\x94\xd0" - "\x7d\x9c\xc3\xf2\x4f\x7b\x7c\x9c\xc3\xf2\xde\x3e\x0e\xfa\x34\x33" - "\x1d\xcc\xd7\x79\x09\x7c\x94\xe2\xd5\xe0\xef\x64\x12\x62\x6d\xfb" - "\x88\x94\x80\xcf\x53\x7c\x0a\xfc\x9e\x34\xf0\x7b\x5c\xaf\x8b\x7e" - "\x4f\x6b\xbe\xaf\xdf\xf3\x3f\x3f\xee\xd7\xef\x51\x78\xfd\x1e\x17" - "\xf8\x34\xce\xd7\x4b\x63\xcb\x4e\x49\x7c\xa0\xe7\xfb\xfa\x40\xdd" - "\x3a\xb0\x39\xb7\x94\xaa\x9d\xe0\x07\x0d\xe4\x03\x09\xbc\xef\xe5" - "\x07\xfd\xf0\x7c\xa0\xcf\x63\x43\xf7\x81\x5a\x67\xf8\xfa\x40\x87" - "\x3f\x0c\xcc\x07\x6a\x3d\xe8\xb7\xaf\x27\x64\x1f\xa8\xb5\xd5\xd7" - "\x07\x3a\xbc\x97\xd5\xe9\xbf\x3f\x0c\xde\x07\x3a\xbc\xcd\xbf\x0f" - "\x74\x58\xe7\xeb\x03\x1d\x4e\x61\xbe\xce\xe1\x5a\xe6\x03\x1d\xce" - "\x60\xe9\xff\x5d\x2b\x4d\xf7\xfa\x40\x2c\x9d\xf9\x40\x87\x8d\x01" - "\x8e\xdf\x6c\x75\x81\x8d\xbd\xf4\xf3\xe6\x06\x1a\xbf\x19\xae\x79" - "\x73\x8b\x2f\x93\xf1\x9b\x7f\xa8\xaf\xda\xe9\x81\xec\xc8\xe1\xd6" - "\xd0\xed\xc8\x91\x4b\x34\xff\xff\x87\x64\xa7\xff\xa1\x0d\x9d\xbe" - "\x47\x07\x9c\xff\x3f\xb0\x9d\xb6\x6d\xf7\xf6\x45\xd8\xb6\x07\xd7" - "\x17\x61\x1b\xed\x6b\x93\xff\xdf\x9b\x57\xfb\x22\x02\xb5\xc3\x47" - "\x2c\xa1\xdb\xe1\x2f\x5a\x7c\xed\xf0\x97\x8f\x05\x66\x87\x6d\x4f" - "\x0d\x7f\x5f\x84\x2d\xc5\xd7\x0e\x7f\x39\x49\xc4\xc2\xa2\xe0\xed" - "\xf0\x97\x0a\xff\x76\xf8\xcb\x1f\xfb\xda\x61\x5b\x3b\xb3\xb7\x5f" - "\x26\x30\x3b\x6c\x73\xb1\xf4\xff\x97\x22\x4d\xf7\xda\x61\x96\xce" - "\xec\xf0\x97\x33\x82\x1b\x73\xb9\xf1\x32\x1d\x73\x51\x5d\x61\x63" - "\x2e\xc7\xde\xba\x6a\x27\x06\xb3\x13\x5f\xa6\x84\x6e\x27\xda\xe4" - "\xa1\xdb\x89\xe3\x07\xbc\x76\xe2\xf8\x81\xe0\xec\xc4\xf1\xbb\x7d" - "\xed\x44\xdb\xdf\xae\xda\x89\x40\xed\xc4\xb1\xce\xd0\xed\xc4\x57" - "\x2e\x5f\x3b\xf1\xf5\x8a\xc0\xec\xc4\xf1\x8d\xc3\x6f\x27\x8e\x17" - "\xf9\xda\x89\xaf\xe7\x88\x58\x78\x31\x78\x3b\xf1\xf5\xbd\xfe\xed" - "\xc4\xd7\x0f\xfb\xda\x89\xaf\x95\xcc\x1e\x7c\xad\x61\x76\xe2\xeb" - "\x58\x96\xde\x56\x24\x4d\xf7\xda\x09\x96\xce\xec\xc4\xd7\x19\x57" - "\xe7\xdb\x5d\xae\xf3\xed\xda\x5b\x43\xd7\x65\xdf\x6a\xbc\xba\xec" - "\x5b\x8d\xff\xf9\x76\x27\x8e\xfa\xce\xb7\xfb\xe6\xc5\xab\xf3\xed" - "\x06\xd2\x55\x5f\x17\x85\xae\xab\x4e\xec\xf3\xd5\x55\x1d\x3f\x0e" - "\x4c\x57\x7d\x7b\xcb\xf0\xeb\xaa\x6f\x27\xfb\xea\xaa\x0e\x22\xf2" - "\x7f\x6e\xf0\xba\xea\xdb\x2f\xfd\xeb\xaa\x6f\xbf\xf1\xd5\x55\xdf" - "\x1e\x60\x3a\xa9\x63\x1c\xd3\x55\xdf\x36\xb3\xf4\x6f\xe6\x48\xd3" - "\xbd\xba\x8a\xa5\x33\x5d\xd5\x11\xd0\xfe\xff\xde\xf1\xb5\x90\x7c" - "\xda\x8b\x30\xbe\x36\x5c\x3e\xed\xe5\x32\xbe\x76\xf2\xea\xf8\xcf" - "\x80\xfe\x6c\xc7\x10\xf6\xfd\x3f\x35\xe0\xf8\xcf\xc0\x36\xe0\xfb" - "\xbd\x5e\x1b\xf0\xfd\x5e\x7f\xe3\x13\xc5\x80\xa1\x12\xf0\x47\x5f" - "\x3c\x45\xc2\x5f\xc2\xf1\x89\x96\x46\xa2\xc3\xf1\x89\xd5\x9e\xf1" - "\x89\x2a\xd1\xc7\xfd\xfe\x7a\x5f\x1f\xf7\xbb\x0f\xfa\xf3\x71\xd1" - "\xb7\x75\x83\xdf\xea\xea\x3d\x2e\xf1\x6c\xff\xb6\xa3\x5b\xd1\x58" - "\x74\xfe\xf5\x52\x75\x30\xb6\x63\xd7\x26\x66\x3b\x76\xfe\xa0\x6c" - "\xc7\x49\x73\xe8\xb6\xc3\xde\xeb\x3c\xdf\xd3\x4f\x05\x66\x3b\xbe" - "\x5f\x34\xfc\xb6\xe3\x7b\xad\xaf\xed\x38\x3d\x45\xc4\xc3\x33\xc1" - "\xdb\x8e\xd3\xe3\xfd\xdb\x8e\xd3\xb7\xf8\xda\x8e\xef\xc5\xb9\xa6" - "\xa7\x67\x33\xdb\x71\x5a\xce\xd2\xbf\x4b\x96\xa6\x7b\x6d\x07\x4b" - "\x67\xb6\xe3\xf4\xfc\xe0\xfa\x43\xa2\x2e\xd3\xfe\x10\xe5\x15\xd6" - "\x1f\x72\x66\x08\xeb\xdf\xce\xa5\x5a\x7a\xe6\xcf\x9f\x4b\xed\x13" - "\xaf\x67\x82\xaf\x7b\x9a\x8d\xb9\xf6\xc4\xeb\xb6\xa3\xa2\x2e\x3b" - "\x7b\xd8\x57\x97\x75\xe6\xfb\xd3\x65\x03\x8d\xab\x62\x7c\xee\x06" - "\x3d\xe7\xaa\x0a\x71\x5c\x35\xf3\x87\xa4\xbf\x4e\x6b\x43\xd7\x5f" - "\x67\x7b\xed\x7f\xda\x15\xe0\xfe\xa7\xe7\xfc\xee\x7f\xea\x0a\x79" - "\x0e\xfd\xb9\x5e\xfb\x9f\x9e\x13\xf7\x3f\xed\x0c\x61\x5d\xdc\xb9" - "\xa3\xfe\xf5\xd7\xb9\x5e\xfb\x9f\x9e\x13\xc7\x4f\xbb\xc4\xfd\x4f" - "\xcf\x89\xfb\x9f\x76\xc6\x4b\xd3\xbd\xfa\xab\x53\xb2\x2e\xae\x6b" - "\xc0\xfd\x4f\x69\x49\x79\x51\x19\xc7\xd7\xc0\x55\x0b\x75\xbc\x1e" - "\x30\x60\x80\xff\xcd\xc0\xc7\xb1\xf0\x7f\xb3\x3f\x19\xb3\x2b\xca" - "\x8b\xf8\x02\xa8\x33\x47\x64\x56\xfb\x77\x06\xc3\x0d\x2e\xe4\x4d" - "\x25\xe3\x55\x79\x51\x94\x6b\x54\x22\x4f\x35\x04\xf8\x52\x24\x9c" - "\xaf\x06\xf9\x23\x01\x33\xaa\x4c\x12\x79\x4a\xd6\x75\xc0\x93\x0f" - "\xea\x1b\x79\x4c\xd6\xb5\x11\xcb\x80\xba\x9a\xa1\x2d\x6a\xbf\x75" - "\x85\xb2\x92\xde\x9c\x40\xb6\xb8\xe8\xd7\x86\xd5\xa7\x49\x9b\xcc" - "\x71\x6d\x54\xc7\xa8\x44\x9a\x9b\x4c\xd0\xc7\xaa\xb9\xc1\x1e\x8e" - "\x65\xe2\xd9\x8b\x6d\xb2\xae\x4e\x7c\xe7\x86\x3a\xe6\xac\x22\x9c" - "\xfe\xf4\xa8\x08\xd0\x05\x23\x72\x3b\x69\xfb\x1a\x17\xd4\x39\xcb" - "\x45\x3e\x9e\xd0\x1a\xfe\xee\x4e\x48\x73\x93\x68\x3c\xdf\x0e\xcb" - "\x00\x1f\x13\xea\xe3\xf8\x71\x35\xe4\xef\xaf\x0e\xdb\xde\x21\x93" - "\x46\x4c\xa4\xb6\xe0\x70\xe3\xf0\xbb\xfe\x2d\x2a\x7f\x02\x31\xdc" - "\x0e\xb4\x53\x11\xae\xbf\xf7\x41\x7e\xc7\x2f\xbf\x40\x27\x46\xe0" - "\x39\x98\xb9\x3b\x08\x57\xca\x8f\x8a\xa8\xcb\x16\xce\xaa\xb4\x77" - "\x15\x9e\x9f\x62\x93\xa5\x16\x21\xcd\xf1\xcc\x34\x3c\xfb\x17\x70" - "\x43\x20\x7d\xce\x27\x59\x84\xf4\xe6\x45\x7a\xea\xaa\x45\xaa\x8c" - "\x15\xab\x96\xae\x59\x9f\xa1\xba\x25\x75\x0c\x99\xb3\x66\x8d\x6a" - "\xd5\xa2\xd5\x1b\x55\xd2\x37\x0f\xaa\x52\x57\xac\x5b\xb4\x38\x6d" - "\xe9\x1d\xab\x96\x68\xc7\x40\x9d\x88\xa4\x1e\xe3\xb0\x2e\x7c\xe1" - "\xf9\x94\xea\x97\x09\x29\x1f\x4b\xc2\xb1\x5e\xf0\x3d\xa3\xe7\x7c" - "\x3c\x3c\x1f\x8e\x83\x3c\xb9\xa0\x03\x4b\x73\x46\x41\x5e\x47\xf3" - "\x6e\xa8\x57\x35\xd4\x1b\xea\x88\x75\xb6\x7b\xea\xec\xc1\x44\x2e" - "\x62\x22\xe7\x34\x60\xb0\xfb\xda\x28\xc7\xa8\x5f\x51\x9a\x8c\xed" - "\xeb\x04\x39\x91\x41\xda\x22\xb4\x4b\xa0\x03\x8a\xba\x0a\xbb\x27" - "\x79\x30\x86\xbf\xa5\xfa\xf2\xd9\x5d\x28\x27\x54\xf3\x08\x93\x29" - "\x67\xf8\x5c\xb5\x8c\xb0\xf3\xf9\xba\x93\xbd\xe7\xf3\x39\xc3\x91" - "\xb6\x50\x8f\x0e\x48\xd7\xda\x64\xf7\xc9\x31\x1d\xcf\x89\xc4\x73" - "\xf6\xb0\xce\xd0\x2e\xb0\x8b\xd4\x40\x0b\x44\xec\x17\x7d\x19\xc7" - "\x97\xc8\xec\xd6\xf0\x73\x24\xc9\x45\x9d\xf4\xc5\x2f\xe3\x9a\x3a" - "\x3b\x49\x54\xbe\x76\x09\x1d\x79\x7e\x6d\x94\x6b\xc5\x52\x3c\x1f" - "\x90\xd7\xc9\xec\xf4\x45\xa7\x7a\xee\x44\xa2\x84\xb2\x2d\x92\x73" - "\x02\xc3\x83\xe3\x7f\xb7\xc0\x7f\xe4\x23\x9e\xff\xc7\xf8\xe8\x8c" - "\xf9\x24\xa3\x2f\x1f\x7b\xf0\xf7\x26\x4f\x4c\x80\x05\x2a\xaf\x6b" - "\x4e\x72\x33\x3a\xa2\xec\x9e\xc9\xd5\x90\xbb\x04\xda\x39\x5b\x78" - "\x7d\x5d\x0d\x5f\x52\xd7\x4e\x4b\xea\x5a\x80\x66\x1a\x7d\x26\x51" - "\x2d\x74\x2b\x89\xee\x1c\x89\xb3\xeb\xea\x9a\x15\xb2\x3c\x19\xf8" - "\x16\x1c\xd8\x8d\x38\xd0\x19\x71\xa2\xbc\x6b\x90\x8e\x0d\x1d\x84" - "\xcc\x5a\x47\xc8\xd7\x53\x48\x58\x35\xfc\x2e\xb8\xf6\x38\xf7\x08" - "\x7a\xa2\xd0\x99\xbc\x1b\x7e\x8b\xe7\x3c\x06\xf9\x7b\x9b\x5f\xb9" - "\xeb\x69\xb7\x71\x76\xff\xed\x76\x59\x78\xbd\x11\xf8\x67\xd4\xd0" - "\x12\xe3\x9c\xbe\xed\x36\xce\x66\xed\x1e\x71\x7a\xf8\xdb\xed\xaa" - "\x60\xed\x76\xcd\x0e\xad\xdd\x2e\xbf\xfd\x7f\x92\x76\xfb\xe1\xb7" - "\xdb\x08\xed\x06\x7e\x1b\x81\xdf\xc6\x7e\xf8\x6d\x14\xf9\x7d\xcd" - "\xb1\xe1\x6f\xb7\xbb\x8c\xb5\xdb\x9d\x18\x5a\xbb\xdd\x7e\xf5\x9f" - "\xb7\xdd\x26\x3f\xfc\xe6\x0f\xf0\x7a\x13\xf0\xdb\x04\xfc\x36\xf5" - "\xc3\x6f\x93\xc8\xef\x6b\x3f\x1b\xfe\x76\xf3\xac\xff\xbf\x90\x4f" - "\x08\xad\xdd\xbc\x39\x80\x76\xfb\xe1\x37\xdd\x0f\xed\x06\x7e\x9b" - "\x80\xdf\xa6\x7e\xf8\x6d\x12\xf9\x7d\x5f\xf1\xf0\xb7\x9b\xe6\xb1" - "\x76\xd3\xf8\xd0\xda\x4d\x0d\x83\xb7\xbb\xbe\x7f\x7e\x73\xe4\x2d" - "\x5e\x5f\x0f\xfc\xae\x07\x7e\xd7\xf7\xc3\xef\x7a\x91\xdf\xf3\xa6" - "\x0e\x7b\xbb\x39\x22\x9c\x67\x4d\x8b\x49\x5c\x48\xed\xe6\x48\xed" - "\xe0\xed\xae\x6b\x05\x9d\xdd\x87\xe7\xd6\xac\x78\x72\xe7\x39\x6c" - "\x3f\x17\x43\x15\x75\xad\xd7\xe4\xe7\xc9\x5c\xf2\xba\x23\xd7\x1c" - "\x21\x1c\xc4\x7e\x9a\x28\x1b\x19\x0d\x6d\xd5\x50\xbd\x59\x8b\x77" - "\x1e\xca\x71\x81\xee\x77\xcb\xeb\x5a\xba\x4b\xca\x35\x2f\x2d\x23" - "\xaa\x5c\x3b\x51\x36\xe5\xd8\x48\x8e\x96\xda\x9b\xc8\x97\x44\x61" - "\x23\x1c\xf6\x63\x7d\xda\x51\x4b\x56\xa7\x53\x0a\x65\x8f\xc0\x78" - "\x51\x7f\x9c\xc4\x81\x4f\x9c\x47\xc1\x7e\x94\xf1\x44\x05\xe5\xc7" - "\x21\x2d\xa1\xec\xf4\xa8\x39\x44\xf6\xd7\xc5\x0e\x82\xf4\x44\xda" - "\x42\x6c\x19\x27\xd0\xb5\x93\x90\x5f\xcf\x63\x74\xdd\xb5\x2c\x58" - "\xba\xca\x9a\x99\x5f\x59\x67\xb7\xda\xba\xb1\x5f\x5a\x89\xeb\x9a" - "\x21\xbd\xa4\x49\x7b\x9a\xd0\x62\x59\x1c\xd5\xd5\xd9\x78\xb0\x59" - "\xc1\x95\xcb\xf9\x9d\xff\x26\xd1\xa7\xc9\xa0\x33\xfb\x60\xcd\x4b" - "\xef\xb0\x12\xaa\x30\x26\x33\x7a\x1b\xe7\x5f\x73\x64\xc4\xe9\xfe" - "\xe9\x6d\x4c\x76\x81\xcd\x71\xcb\x8d\x73\x02\xa7\x77\xd8\x7a\x5f" - "\x7a\x1b\xe3\x2e\x0e\xbd\xc3\x12\x18\xbd\x8d\x5a\x5f\x7a\x73\x2e" - "\x46\x6f\x6e\x0f\xd5\x19\x53\x78\xb0\x95\x41\x96\xeb\x77\xfd\xa3" - "\x84\xde\x80\xef\xbe\x36\xcc\x4b\xef\x70\x17\xd0\x5b\xc4\xb7\x11" - "\xf0\x7d\xcd\x31\x3f\xf4\x06\x7c\x1b\x01\xdf\xc6\x20\xf0\x1d\xfe" - "\x55\x2f\x7a\x5f\x24\x7c\x87\x8b\xe7\x3f\x19\x7b\xe1\x3b\x3c\x8d" - "\xd1\x3b\x5c\x09\xf4\x06\x7c\x1b\x83\xc4\xf7\x88\x88\x00\xec\x07" - "\xe0\xbb\xaf\xed\xf4\xd2\x7b\x64\x1a\x55\x98\x44\x7c\x9b\x00\xdf" - "\xd7\x7e\xd6\x3f\xbd\x4d\x80\x6f\x13\xe0\xdb\x14\x04\xbe\x47\xce" - "\xf5\xa5\xb7\xe9\x22\xe1\x7b\xa4\x8a\xd1\xdb\xd4\x0b\xdf\x23\x8e" - "\x30\x7a\x8f\xc8\xa3\x3a\x13\xe0\xdb\x14\x24\xbe\x47\x66\x05\x40" - "\x6f\xc0\x77\x5f\x9b\xed\xa5\xf7\xa8\x23\x40\x6f\x11\xdf\x26\xc0" - "\xf7\x7d\xc5\x7e\xe8\x0d\xf8\x36\x01\xbe\x4d\x41\xe0\x7b\x94\xa9" - "\x17\xbd\x2f\x12\xbe\x47\x95\x89\xf4\xee\x85\xef\x51\x33\x18\xbd" - "\x47\xda\x81\xde\x80\x6f\x53\x90\xf8\x1e\xd5\x1e\x80\x9f\x00\xf8" - "\xee\xeb\x2b\x78\xe9\x3d\x7a\x06\x55\xd4\x8b\xf8\xae\x07\x7c\xcf" - "\x9b\xda\x3f\xbd\xeb\x01\xdf\xf5\x80\xef\xfa\x20\xf0\x3d\xfa\x5e" - "\x5f\x7a\xd7\x5f\x24\x7c\xe3\x11\xf3\x48\xef\xfa\x5e\xf8\x8e\x38" - "\xc0\xe8\x1d\x91\x42\x75\xf5\x80\xef\xfa\x20\xf1\x3d\xda\xef\xfa" - "\xdf\x81\xfc\x93\x75\x55\x24\xc2\x97\xe6\x63\x0c\x17\xce\x47\x19" - "\xf3\xe6\xa5\xf1\x51\xc6\x64\xf4\xef\xa3\x8c\x89\x63\x34\x1f\xdd" - "\x12\x9a\x8f\x32\xc6\x12\x8a\x8f\xd2\x97\xe6\xf2\xc9\x17\xce\x4f" - "\x91\x8f\xbf\x34\x7e\xca\x35\xed\xfd\xfb\x29\xd7\xec\x65\x34\xbf" - "\x26\x31\x34\x3f\x45\x9e\x10\x8a\x9f\xd2\x97\xe6\x8a\x7d\x17\xce" - "\x57\x51\xfc\xe1\xd2\xf8\x2a\x8a\xf9\xfd\xfb\x2a\x8a\x68\x46\x73" - "\xf9\x81\xd0\x7c\x15\xc5\xfe\x50\x7c\x95\xbe\x34\x8f\x8a\xb9\x70" - "\xfe\x4a\xd4\x88\x4b\xe3\xaf\x44\x36\xf7\xef\xaf\x44\x8a\xf1\x4f" - "\x64\x5c\x68\xfe\x4a\x54\x00\xf1\x4f\x5f\x7f\xa5\x2f\xcd\x95\x65" - "\x17\xce\x67\x51\x6e\xbc\x34\x3e\x8b\xf2\xf1\xfe\x7d\x16\x25\x61" - "\x34\x8f\xda\x1b\x9a\xcf\xa2\xac\x0c\xc5\x67\xe9\x4b\xf3\xb1\xe1" - "\x17\xce\x6f\xb9\xf6\xe4\xa5\xf1\x5b\xae\xad\xed\xdf\x6f\xb9\x36" - "\x83\xd1\xfc\xda\xe8\xd0\xfc\x96\xb1\xca\x50\xfc\x16\xa4\x35\xd2" - "\x1c\x7d\x15\x46\xf3\x71\x2d\x34\xb2\xae\xc6\x09\xfe\x88\x02\xe8" - "\xae\xe8\x20\x5c\x15\xd2\xbc\x95\xd1\xdc\x1d\x69\xd6\x02\x7d\x34" - "\x48\x33\xa1\x1d\xdf\x46\x47\xba\x4b\xea\x8e\x50\x8e\x40\x5b\x22" - "\x08\xf0\xec\x4b\x57\x01\x89\x54\xe5\xe4\xc3\xff\xe3\x84\xfd\x33" - "\x55\x39\x85\x47\xa1\x8d\x61\x38\x46\xe1\xd2\x95\x2b\xdd\x8a\x86" - "\x32\x78\x77\x13\x1d\x5f\xaa\x74\x82\x2f\x41\x57\x46\x8f\xb3\x76" - "\xd4\x10\xab\xeb\x10\x69\x6a\xfd\x0b\xe1\x23\xcd\xe9\x77\xb9\x88" - "\x9a\x7e\xab\x1e\x67\xc9\xb0\x11\xf7\x92\x68\xb9\x35\xcb\x0c\xb8" - "\x78\x9f\x24\xb5\xd3\x73\xf4\x9f\x6a\xb9\x53\x61\x69\x76\x2b\xcc" - "\xb3\xdd\xba\xc6\x0a\x97\xc2\x62\x78\x3b\x13\x2c\x9a\x83\xa8\xd3" - "\xda\x28\xd5\x2f\x26\xe1\xfa\x63\x24\xa2\x74\x31\x91\x97\x1e\x23" - "\x4a\x4b\x5b\x2b\x69\x3c\x61\x26\x8d\xa7\x0f\x93\xc6\x73\x70\x75" - "\xc3\xc5\xc3\x95\x77\x98\x58\x3a\x08\x99\x79\x92\x90\xdc\x36\x6a" - "\xff\xf9\x11\x32\xce\xe2\x6a\x25\x38\x8f\xf7\x14\xf7\xa3\x0f\xe4" - "\x29\x64\x1c\xfd\x67\x34\xa1\x4b\xa2\x39\x78\x17\x8e\xe9\x56\x97" - "\x9d\x58\xda\x1c\xf8\x7e\x3b\xbc\x0f\xcf\x6d\x83\xf2\x79\x33\xee" - "\x17\x67\xb7\xe4\x1d\x84\xf6\x4d\x43\x3a\xb7\x7b\x7c\x32\x7d\x37" - "\x89\x2b\x05\x36\x23\x66\x92\x28\xc3\xcc\xee\xee\x60\x31\xf3\x23" - "\xb6\xff\xd9\xca\xe8\xb1\x40\xef\x1b\xf8\x95\xc9\xca\x59\x87\xbf" - "\xa0\x38\x4f\x0b\xc7\x67\x9a\x3a\x0f\x11\xeb\x56\x9e\x24\x6d\x24" - "\x64\x86\x9b\x10\xa4\x09\x8e\x25\xcf\xd2\x92\x28\x9c\x3f\xc6\x7f" - "\xab\x1e\x6b\x6d\xb3\x93\x2d\x2e\xa8\xeb\x29\x47\x4f\x5d\x9b\xb6" - "\x36\x11\x78\x77\x43\x93\xc6\x46\xe4\x5a\xa2\x44\x3a\x83\x2f\xda" - "\x3a\xab\x9d\x8c\x5e\xdd\x49\x29\xd2\x18\x69\x8b\x74\xc6\xf2\x3c" - "\xb4\xb7\xa6\xda\x49\xae\x83\x28\xad\x39\x70\xcf\xa2\x76\x2b\xf9" - "\x9e\x40\x1d\xcd\x54\x31\x8d\x00\x3e\x32\x10\x13\x80\xc7\x56\xc0" - "\xc1\x58\x5a\x3c\xb6\xa4\x1a\xda\x8b\x63\xf8\xc1\xb5\x79\x5c\x20" - "\xe3\x1f\x7d\x7c\x42\x2f\x9e\x8d\xc9\x0c\xcf\x3f\xd9\x4b\x23\x8d" - "\x71\x4e\xf0\xf5\x18\x9e\x47\x9c\x1e\x1c\xcf\xc6\xf9\x5e\x3c\xff" - "\xf8\x3d\x2f\x9e\x7f\xf2\x47\xff\x78\xbe\xee\x7b\x86\x67\xa3\xf6" - "\xf2\xc4\xf3\x75\xdb\x06\xc6\xf3\x75\xa9\xfe\xf1\x6c\xd4\x78\xfc" - "\xdd\xe1\xc1\xf3\x75\x07\x2e\x1e\x9e\x8d\xc9\xa1\xe1\xf9\xba\x0a" - "\x5f\x3c\xff\x78\x1f\xc3\xf3\x8f\xe7\x87\x86\xe7\x9f\xf8\x3d\xff" - "\x60\x20\x7f\x5b\x82\x67\x51\x3f\xdf\x90\x01\x78\x06\xfd\x6c\x14" - "\xf5\xf3\x35\xc7\x02\xc0\xb3\x44\x3f\x47\xe7\x7b\xf1\x7c\xc3\x52" - "\xff\x78\xbe\xfe\x13\x11\xcf\x97\xa9\x7e\xbe\x7e\xee\xc0\x78\xbe" - "\x7e\xf2\x00\x78\x6e\xf7\xc4\x12\xc3\x83\xe7\xeb\x4b\x2e\x22\x9e" - "\x43\xd4\xcf\xd7\x6b\x7c\xf1\x1c\x9d\xc5\xf0\x1c\x3d\x29\x34\x3c" - "\xdf\xe0\x77\xfe\xf3\x40\xb1\x8c\x17\xcf\x26\x51\x3f\x8f\x7f\x9c" - "\x46\x9a\x40\x3f\x9b\x44\xfd\x7c\xed\x67\x83\xe3\xd9\x24\xd1\xcf" - "\x3f\x7d\xca\x8b\xe7\xf1\xf7\xfa\xc7\x73\xcc\x1f\x18\x9e\x4d\x97" - "\xa9\x7e\x8e\xb9\x65\x60\x3c\xc7\x84\xfb\xc7\xb3\x49\xe3\x89\xd3" - "\x86\x07\xcf\x31\xf3\x2f\x1e\x9e\x4d\x21\xea\xe7\x98\x78\x5f\x3c" - "\xff\x34\x91\xe1\xf9\x06\x57\x68\x78\x1e\xef\xf7\xfc\x9f\x81\xe2" - "\x44\x09\x9e\x45\xfd\xac\x1a\x07\x78\x06\xfd\x6c\x12\xf5\xf3\x7d" - "\xc5\x01\xe0\x59\xa2\x9f\x27\xdc\xe4\xc5\xb3\x6a\x84\x7f\x3c\xdf" - "\xb8\x48\xc4\xf3\x65\xaa\x9f\x27\x9c\x1d\x18\xcf\x13\x5a\x06\xc0" - "\x73\xbb\x27\x06\x1e\x1e\x3c\xdf\x38\xe9\x22\xe2\x39\x44\xfd\x7c" - "\x63\x84\x2f\x9e\x27\x44\x33\x3c\x8f\xb7\x84\x86\x67\x95\x2a\x94" - "\x18\xdc\x8b\xe7\x7a\x51\x3f\xdf\xdc\x46\x23\xeb\x41\x3f\xd7\x8b" - "\xfa\x79\xde\xd4\xc1\xf1\x5c\x2f\xd1\xcf\xaa\xef\xbd\x78\xbe\xf9" - "\x73\xff\x78\xbe\xf9\x6e\x86\xe7\xfa\xcb\x54\x3f\xdf\x64\x1a\x18" - "\xcf\x37\xed\xf5\x8f\xe7\x7a\x8d\xa7\x7f\x61\x78\xf0\x7c\x93\xeb" - "\xe2\xe1\xb9\x3e\x44\xfd\x7c\x53\xab\x2f\x9e\x55\xed\x0c\xcf\xaa" - "\xca\xd0\xf0\x7c\xb3\xdf\xf3\xef\x82\xeb\xdf\xb8\xa5\x0d\xfb\x37" - "\xba\xb1\x7f\xc3\x3b\xf7\x4f\x13\xd5\xcc\xf0\xec\x04\x3c\xef\x92" - "\xe2\xf9\x1f\xbd\xfb\x37\x7e\xf6\x09\xdf\x83\xe7\x5b\xfa\xe0\x99" - "\x07\x3c\x3b\x05\x3c\xc7\x9e\xf4\xf4\x6f\x58\x3b\xf6\x00\x4e\x4e" - "\x10\xeb\x6c\xc0\xb2\x5e\xc4\xf2\x3f\x00\xcb\x40\x43\x1e\x68\x6c" - "\x39\xd2\x4a\x92\xec\x8c\x96\xdd\x40\x63\x5e\x8a\xe3\xee\x76\x0e" - "\xf1\x8b\xb8\xf5\x60\xb8\x71\x35\x60\x37\xfd\x6f\xa4\x31\x13\xae" - "\x4d\x70\xe5\xc0\x45\xfe\x46\x2c\xed\x80\xdd\x15\x52\xec\x36\x8b" - "\xd8\x8d\xcd\x1f\x18\xbb\xb1\x29\x17\xaf\x2f\x23\x96\xf5\x7f\xfd" - "\x23\x59\x99\xf4\xd4\x17\xd4\x9a\xd5\x2a\xe2\xf3\x04\x49\x72\x91" - "\x28\x3a\x4f\x3d\x56\x9e\x4c\x94\x9b\xdd\x84\xd3\x2d\x26\x4a\xdd" - "\xdf\xa1\xdd\x1e\xf9\x3d\x46\xe4\x87\x1c\x7f\x21\x96\xd3\xad\xc4" - "\x72\xee\x20\xb1\xf0\x70\x9d\x80\x0b\xea\x9a\xb4\x54\xda\x6e\xbb" - "\xd8\xee\x5b\x36\x42\x59\xb1\xfe\xdb\x7d\x4b\xb2\xd0\xee\x54\x68" - "\x77\xb7\xb7\xdd\x56\x90\x03\xe0\xcf\x0d\xbc\xd8\x1f\x92\x64\x27" - "\xa3\xd7\xb8\x28\xed\x16\xf1\x8f\xfc\x39\xd4\xe2\x20\x49\x5a\xe0" - "\xd9\x12\xc0\x7f\xdb\x3e\x92\x9b\x0d\xf8\xef\x76\x20\xee\xec\xd6" - "\xbc\xf3\x80\xff\xd8\xed\x14\xe8\xe7\x44\xfc\xff\x03\xf1\xff\xb3" - "\x5a\x5e\xc0\xff\xcf\xd2\x42\xc3\xff\x2d\x01\xe0\x3f\x90\xfe\x10" - "\x75\x1b\xf6\x87\x74\x63\x7f\x88\x77\x0e\xe8\x20\xf8\x97\xf6\x87" - "\xdc\x2a\xc1\xbf\x7a\x00\xfc\xdf\x76\xd2\xd3\x1f\x72\xe9\xf1\x7f" - "\xdb\x20\xf8\xbf\x6d\x00\xfc\x0f\x77\xdf\xc7\x6d\x17\x11\xff\xea" - "\x41\xf0\xaf\x0e\x00\xff\xc6\xe4\xd0\xf0\x7f\x5b\x2f\xfc\xdf\x2a" - "\xe2\xff\xd6\x10\xf1\xaf\x0e\x04\xff\x01\xf4\x9f\xfc\x1c\xf1\x0f" - "\xfa\xdf\xd8\x22\x99\x0b\x3c\x18\xfe\x25\xfa\x7f\xa2\x04\xff\x3f" - "\x1f\x00\xff\xb7\x7b\xf0\x7f\x19\xe8\xff\xdb\x07\xc1\xff\xed\x03" - "\xe1\x7f\x98\xfb\x4a\x6e\xbf\x88\xf8\xff\xf9\x20\xf8\xff\x79\x20" - "\xf8\x0f\x51\xff\xdf\xde\x0b\xff\x13\x45\xfc\x4f\x0c\x11\xff\x3f" - "\x0f\x00\xff\x81\xf4\xb7\xdc\xd9\x86\xfd\x2d\xdd\xd8\xdf\xe2\x9d" - "\x13\x3e\x08\xfe\xa5\xfd\x2d\x93\x24\xf8\xbf\x73\x00\xfc\xdf\x71" - "\xd2\xd3\xdf\x72\xe9\xf1\x7f\xc7\x20\xf8\xbf\x63\x00\xfc\x0f\x77" - "\xdf\xca\x1d\x17\x11\xff\x77\x0e\x82\xff\x3b\x03\xc0\xbf\x29\x44" - "\xfd\x7f\x47\x2f\xfc\x4f\x12\xf1\x3f\x29\x44\xfc\xdf\x19\x08\xfe" - "\x03\xe8\x9f\xb9\x1b\xf1\x0f\xfa\xdf\xd4\x22\x59\x1b\x30\x18\xfe" - "\x25\xfa\xff\x2e\x09\xfe\xef\x1e\x00\xff\x71\x1e\xfc\x5f\x06\xfa" - "\x3f\x6e\x10\xfc\xc7\x0d\x84\xff\x61\xee\x8b\x89\xbb\x88\xf8\xbf" - "\x7b\x10\xfc\xdf\x1d\x08\xfe\x43\xd4\xff\x71\xbd\xf0\x7f\x97\x88" - "\xff\xbb\x42\xc4\xff\xdd\x01\xe0\x3f\x90\xfe\x9c\xc9\x42\x7f\x4e" - "\x37\xf6\xe7\x78\xd7\x88\x0c\x82\x7f\x69\x7f\xce\x2f\x24\xf8\x9f" - "\x3c\x00\xfe\xef\x39\xe9\xe9\xcf\xb9\xf4\xf8\xbf\x67\x10\xfc\xdf" - "\x33\x00\xfe\x87\xbb\xef\xe6\x9e\x8b\x88\xff\xc9\x83\xe0\x7f\x72" - "\x00\xf8\xaf\x0f\x51\xff\xdf\xd3\x0b\xff\xbf\x10\xf1\xff\x8b\x10" - "\xf1\x3f\x79\x98\xfa\x7f\xee\x2b\xc1\xfe\x1f\x5e\x5e\xd7\xe2\xac" - "\x2c\x55\xf2\x25\x96\xe6\x28\x99\x8a\xb8\xe4\x0d\x65\xd6\x8c\x4e" - "\x32\xeb\x2c\xf0\x44\x7b\x96\x2c\x38\xab\xc4\xf3\x02\x0d\x14\xe2" - "\x7f\x9f\x35\xa2\x70\xb9\x4a\xa6\x91\xd2\xd5\x24\xdc\x1d\x69\x4e" - "\xc7\x34\xeb\x71\x07\xc1\x36\x6f\x41\x1a\x9c\xf0\xd2\x00\xfb\xe0" - "\xe8\x77\x6a\x65\x75\x01\xe4\xe9\xb6\x91\x36\xc0\x8b\xa5\xcd\x06" - "\xb4\xdf\x24\x60\x0b\x79\x01\xf5\x99\xb4\xfb\x14\x09\x77\xfd\x33" - "\xfa\x06\xe0\xf1\x38\xc5\x06\x22\x8b\x69\xa3\x3c\xf2\x12\x79\x84" - "\x7c\x55\x6d\xc2\xf9\x4a\xf7\x6d\x6b\x02\x7c\xbb\xfe\xa9\xbe\xa1" - "\x1a\xf2\x0d\x7f\xbf\xcc\x7d\xc2\xf8\x07\xdc\x63\x2d\x47\x80\x96" - "\xc5\xf7\x86\xc8\xa7\xfb\x02\x59\xff\x12\x40\x3f\x45\xfc\x64\xec" - "\xa7\xe0\xe5\xc6\x39\x81\xf1\xc9\x98\xec\xb3\xa6\x75\xd8\xf9\x74" - "\x7f\x4b\x60\x7c\x8a\xbf\xc3\x97\x4f\xc3\xdd\x7f\x70\x3f\xdb\x0f" - "\x86\xbb\xdf\xc2\xf8\x74\xff\xb8\xd0\xf8\x14\x1f\xd2\xfc\xdf\xbe" - "\xf1\xf4\x03\x47\x30\x9e\x06\x3e\x05\x28\x4f\xc6\x56\x9f\x35\xb8" - "\xc3\xce\xa7\x07\xb2\x03\xe3\xd3\x03\x9f\xf7\xe2\xd3\x30\xc7\xb9" - "\x0f\xec\x61\x7c\x7a\x20\x83\xf1\x29\xfe\x40\x68\x7c\x7a\x20\x80" - "\xf5\x1f\x81\xc4\x7d\x0f\x6d\xc5\xb8\x8f\x87\xb8\x2f\x30\x3e\x99" - "\x92\x7d\xd6\x0c\x0f\x3b\x9f\x1e\x8a\x0d\x8c\x4f\x0f\x6d\xf1\xe5" - "\xd3\x70\xc7\x63\x0f\x25\x32\x3e\x3d\x14\xc3\xf8\xf4\x60\x6a\x68" - "\x7c\x7a\xa8\x6c\x78\xe2\x93\x87\x27\x61\x7c\x02\x7c\x0a\x50\x9e" - "\x4c\xad\x3e\x6b\x9c\x87\x9d\x4f\x53\x2c\x81\xf1\xe9\xe1\x5b\x7a" - "\xf1\x69\x98\xe3\x86\x29\x76\xc6\xa7\x29\x46\xc6\xa7\x29\xf2\xd0" - "\xf8\xf4\xb0\xdf\xf3\x3f\x83\xf3\xa3\x1f\x69\x41\x3f\x9a\x07\x3f" - "\x3a\x30\x3e\xd5\x27\xfb\xac\xc9\x1e\x76\x3e\x3d\x92\x11\x18\x9f" - "\x1e\x69\xf4\xe5\xd3\x70\xfb\xb7\x8f\x54\x30\x3e\x3d\x92\xc6\xf8" - "\xf4\xf0\xfe\xd0\xf8\xf4\x48\x00\xf3\x3f\xfb\x5f\x87\xd5\xd7\xe7" - "\x4b\xc8\xbb\xbc\x7c\xbe\x04\x55\x60\xbc\x4a\xd8\x78\x61\x7d\xbe" - "\x84\xc7\x19\xaf\x12\xa2\x19\xaf\x1e\x4d\x09\x8d\x57\x09\x25\xa1" - "\xae\xdf\xea\xeb\xf7\x4d\x9d\x74\x79\xf9\x7d\x8f\x05\xa8\xff\xa6" - "\xde\x72\x61\xfd\xbe\xc7\x44\xfd\xf7\x98\xa8\xff\x1e\x0b\x51\xff" - "\x4d\x0d\x40\xff\xf5\xbf\xee\xab\xaf\xef\x37\xad\xf5\xf2\xf2\xfd" - "\xa6\x65\x05\xc6\xab\x69\x7f\xbb\xb0\xbe\xdf\xb4\x4a\xc6\xab\x69" - "\x5a\xc6\xab\xa9\xb5\xa1\xf1\x6a\x9a\xdf\xf3\x5f\x06\x5b\x2f\xd6" - "\xd7\xff\x9b\x7e\x99\xf9\x7f\xd3\x03\xf4\xff\xa6\x5f\x60\xff\x6f" - "\xba\xe8\xff\x4d\x17\xfd\xbf\xc7\x43\xf4\xff\xa6\x87\xe4\xff\xf5" - "\xe2\x95\x28\x57\xbf\x8a\xbb\xbc\x7c\xc0\x5f\x36\x07\xc6\xab\x5f" - "\x4d\xbc\xb0\x3e\xe0\x2f\x3b\x19\xaf\x7e\x69\x66\xbc\xfa\xa5\x32" - "\x34\x5e\xfd\xca\xef\xf9\x87\x83\xad\x4f\xeb\xeb\x07\x26\x1e\xb9" - "\xbc\xfc\xc0\xc4\x00\xe3\xdf\xc4\xcf\x2f\xac\x1f\x98\x28\xc6\xbf" - "\x89\x62\xfc\xfb\xab\x10\xe3\xdf\xc4\x00\xe2\xdf\x40\xfa\xfd\x7e" - "\x3d\x05\x7d\x40\x77\x49\x5d\x4b\x14\xd0\x3f\x2a\x8b\x70\xdd\x31" - "\xc0\x2f\x39\xf0\x2b\x5f\x45\x9c\x25\xc0\x2f\xbb\x8b\xcc\x5a\xfb" - "\x05\x6d\xea\x70\x93\x6e\xe0\xd5\x79\xf0\x03\xad\xf6\x76\x5c\xa3" - "\xf7\xd0\x31\xee\xc9\xcf\xe7\xad\x55\x12\xe4\x17\xd2\xdf\x2d\x9f" - "\x46\x28\xf0\x4b\xe0\x9f\xbc\xb1\xc2\x55\x62\x9e\x3d\xf3\xe4\x17" - "\x74\x8d\x8d\xd2\x46\x8d\x03\xf7\x8e\x54\x36\x6a\x5a\x49\x52\x1b" - "\x19\xad\x7a\x1a\xf9\xf2\xe4\x36\x4c\xb7\xda\x5b\x09\xee\xfb\x29" - "\xf4\x81\x7f\xa1\x1e\xe7\xfa\x1f\xb5\x1c\xf7\x6f\xc2\x75\x85\x9e" - "\x3d\x9a\xac\x27\x2a\x04\xfe\xf7\xee\x53\x15\xf8\xff\x3f\x6a\xe5" - "\x2e\x5c\x9f\x38\xec\xbe\xe0\x93\x42\xff\x1f\xff\x45\xf4\x0d\x9e" - "\x3a\xae\x49\xa3\x14\xea\x38\xb6\xa9\xd3\x4e\xb0\x9e\x4d\x9d\x06" - "\x92\x9b\x41\x94\x4d\xdd\xed\x24\xa7\x93\xda\x9b\xf2\xbe\x21\x49" - "\x67\x71\x5c\x00\xf1\xf4\x64\x23\xe3\xf7\x13\x0e\xfe\x0b\xf5\x0d" - "\x50\x9e\xb1\xa9\x99\x90\xa8\x7c\xa0\xb5\x8b\x70\xc2\x7a\x4d\x8e" - "\x44\x00\xbd\x34\xd6\xbc\x63\x48\xbb\x66\xab\xeb\xef\x48\x4f\x0d" - "\xbc\x9f\xd2\x33\xde\x10\x69\xfe\x0c\xd3\x90\xb6\x38\xcf\xd4\xaa" - "\xb5\x0b\x79\x3c\xef\x19\xef\xf2\x88\x35\xab\x9b\x34\xb9\x08\x81" - "\xef\xed\xfd\x34\xb9\x15\xf0\xf5\x44\x88\x7a\xfb\xd7\x89\xc3\xd3" - "\x5f\x39\xb3\x12\xfd\x56\x77\x89\x71\x0e\xab\xe3\x88\xd3\x83\xe3" - "\xcb\x98\xec\xc5\xd7\xcc\x7b\x87\x86\xaf\x19\x5f\x0d\x2f\xbe\x86" - "\xdb\x7f\x9d\x51\x33\x34\x7c\xcd\xbc\x83\xe1\x6b\x46\x32\xc3\xd7" - "\xcc\x58\x2f\xbe\x46\x9c\xbe\x70\xf8\x9a\x11\xce\xf0\xf5\x6b\x63" - "\x68\xf8\x9a\xb9\x6f\x78\xfa\x59\x93\x5c\xe8\x6b\x03\xbe\x44\xfd" - "\x75\xcd\xb1\x00\xf0\x25\xd1\x5f\x49\x7f\x1c\x1a\xbe\x92\xa6\x0f" - "\x33\xbe\x86\xd9\xe7\x4e\x52\x0e\x0d\x5f\x49\x3a\x86\xaf\x59\xb5" - "\x0c\x5f\x49\x5b\xbd\xf8\xba\xe6\xd8\x85\xc3\xd7\xac\x54\x86\xaf" - "\x59\xb1\xa1\xe1\x6b\x76\x48\xfb\x5f\xf5\x8d\x0f\x9e\x9e\x8f\xf1" - "\x81\xbb\xc4\x24\xea\xaf\x6b\x3f\x1b\x1c\x5f\x26\x89\xfe\x7a\xea" - "\xec\xd0\xf0\xf5\xd4\xeb\xc3\x8b\xaf\xe1\x8e\x13\x9e\xd2\x0e\x0d" - "\x5f\x4f\x9d\x64\xf8\x7a\x2a\x9a\xe1\xeb\xa9\x36\x2f\xbe\xae\xfd" - "\xec\xc2\xe1\x6b\xb6\x91\xe1\x6b\xf6\xd6\xd0\xf0\xf5\xb4\xff\xfd" - "\x9f\x83\xea\xd7\x9e\x73\x00\x63\x1a\xc0\x97\xa8\xbf\xee\x2b\x0e" - "\x00\x5f\x12\xfd\x35\x67\xee\xd0\xf0\x35\x67\xc4\x30\xe3\x6b\x98" - "\x63\x9b\xdf\x34\x0f\x0d\x5f\x73\x66\x32\x7c\xfd\x26\x8b\xe1\x6b" - "\xce\xe3\x5e\x7c\xdd\x57\x7c\xe1\xf0\xf5\x9b\x58\x86\xaf\xa7\xdb" - "\x42\xc3\xd7\x9c\x00\xf6\x7f\x0d\xa4\x3f\xfe\x77\x31\x18\x87\xb9" - "\x4b\xea\x45\xfd\x35\x6f\xea\xe0\xf8\xaa\x97\xe8\xaf\xdf\x7e\x30" - "\x34\x7c\xfd\x76\xe9\xf0\xe2\x6b\xb8\xe3\xb1\xdf\xc6\x0d\x0d\x5f" - "\xbf\x7d\x9b\xe1\x6b\x6e\x2b\xc3\xd7\x6f\xf7\x7a\xf1\x35\x6f\xea" - "\x85\xc3\xd7\xdc\xad\x0c\x5f\x73\x1f\x0f\x0d\x5f\xbf\x0b\x60\xff" - "\x9f\x40\xc7\x11\x9e\xc9\x1b\x5a\x0c\xf9\xcc\xf5\x43\xc3\x58\xf2" - "\xc1\xcb\x3b\x86\x4c\xde\x3e\x34\x8c\x3d\x73\x2d\xc3\x58\xf2\x14" - "\x86\xb1\x67\x22\x2e\x4e\x0c\xf9\xbb\x76\x86\xb1\xdf\xed\x0b\x0d" - "\x63\xcf\x0c\xe3\xf8\xc7\xbc\xb6\xa1\xc5\x91\xf3\xb6\x0c\x0d\x63" - "\xf3\xee\xb8\xbc\xe3\xc8\x67\x1d\x43\xc3\xd8\xbc\xf5\x0c\x63\xcf" - "\xee\x61\x18\x9b\x97\x76\x71\xe2\xc8\x67\x67\x30\x8c\x3d\x1b\xe2" - "\xb8\xcd\xbc\x90\xd6\xbf\xf4\x3f\x6e\xb3\x20\x71\x68\xb1\xe4\x73" - "\x5f\x0e\x0d\x63\xcf\xfd\xe1\xf2\x8e\x25\x9f\x9b\x3f\x34\x8c\x3d" - "\x77\x98\x61\xec\xb9\x70\x86\xb1\xe7\x9a\x2f\x4e\x2c\x39\xbf\x86" - "\x61\x6c\xbe\x36\x34\x8c\x2d\x98\x33\x7c\xe3\x4d\x29\x6f\x0d\x2d" - "\x9e\x4c\x99\x3e\x34\x8c\x2d\x3c\x7b\x79\xc7\x93\x0b\x0d\x43\xc3" - "\x58\xca\xc3\x0c\x63\x0b\x35\x0c\x63\x29\x93\x2f\x4e\x3c\xb9\x70" - "\x1c\xc3\xd8\x82\x96\xd0\x30\x96\x12\xc0\xfe\xff\x81\x8e\x93\x2d" - "\x51\x0e\x2d\xa6\x5c\xfc\xe6\xd0\x30\xb6\xf8\x99\xcb\x3b\xa6\x5c" - "\x1c\x3b\x34\x8c\x2d\x7e\x95\x61\x6c\x91\x85\x61\x6c\x71\xc5\xc5" - "\x89\x29\x17\x65\x31\x8c\x2d\x8a\x0f\x0d\x63\x4b\x62\x86\x6f\x7c" - "\x6f\x69\xc6\xd0\xe2\xca\xa5\x8a\xa1\x61\x2c\xf5\xa3\xcb\x3b\xae" - "\x4c\x2d\x1a\x1a\xc6\x96\x8e\x60\x18\x4b\x8d\x63\x18\x4b\x75\x5d" - "\x9c\xb8\x72\xc9\x11\x86\xb1\x25\x21\xee\x47\xb1\x34\xaf\x37\xc6" - "\x56\xac\xce\x5c\x94\xb6\x22\x55\xb5\x62\x75\x46\xfa\x5a\xd5\xba" - "\x15\x9b\x96\x3e\x7c\xcb\xfa\x49\xaa\xf4\x2c\x55\xfa\x8a\xd5\xcb" - "\xc5\x84\xd4\x31\xe4\xe9\xa5\x69\x8b\xb2\x30\x05\x72\x2f\x5f\xbd" - "\x6a\xe9\xea\x0c\x55\xfa\xd2\xb5\xeb\x57\xa4\x2f\xc5\xff\xd7\xa9" - "\x96\xad\x49\x87\x84\x25\x4b\x57\x64\x2e\x55\x2d\x5e\xbf\x6c\xd9" - "\xd2\xf4\x75\x63\xc8\xcc\xf5\x69\x19\x2b\xb4\x69\x4b\x55\x8f\xcf" - "\x7c\xec\x8e\x39\xd3\x7f\x33\xe7\xd1\x47\xf1\x70\x32\xc9\xd9\x64" - "\x31\xb4\xa4\xb1\x0c\x30\x17\x7e\x9c\x5b\xa3\x68\x8a\x26\xc2\x79" - "\xb6\xa5\xa7\x89\xf2\xc5\x74\x12\x5e\x74\x9a\x44\xe8\x4e\x13\xb9" - "\xea\x79\x92\x40\x75\x23\x31\x7d\x1c\xd5\x3d\x92\x40\xf5\xe5\xd1" - "\x54\x37\x35\xcf\xae\xb8\x2d\x0e\xf3\x52\xdd\xad\x29\xf8\x0e\x68" - "\x1b\x0e\xe9\xed\xc7\xb8\xd5\x16\xbb\x42\xad\xcc\xfd\x86\x70\x74" - "\xcc\xb2\x9a\x77\x78\x3b\xf7\x09\xee\x02\x0e\x6d\x27\xdc\x72\x33" - "\x5c\xfb\x09\xa7\x49\x85\x2b\x03\xae\x3c\xb8\xf6\xc1\x55\x03\x97" - "\x11\xae\x66\xb8\x8e\xc0\xd5\x06\x57\x07\x5c\x9d\x70\x41\x24\xb7" - "\x02\x22\xe7\x15\x15\x70\x41\xde\x15\x06\x56\xce\x0a\x0b\x5c\x0e" - "\xc2\x3d\x9f\x00\x17\x94\xb5\x52\x0b\x57\x25\xe1\xd2\xa6\xc0\xfd" - "\x00\x5c\xad\x70\xd9\xe0\x39\x1c\x2e\x35\xe4\x6d\x66\xef\xd2\x20" - "\x6d\x55\x0c\x81\x7a\x0e\x7e\xad\x82\xfc\xab\x1e\x87\x4b\x03\x17" - "\x7c\x73\xf5\x24\xb8\xb2\x07\xf8\x8d\x71\x90\x32\xdb\xa2\xf2\x6f" - "\xb4\x09\x67\xe0\x71\x9a\x5b\xdc\x05\x24\xcc\xad\x53\x2b\xb5\xb7" - "\x13\xd9\x09\x6e\xf9\xf7\xd6\xad\xa8\x67\x1e\x49\x10\xce\x74\x84" - "\x67\xa4\x59\x57\xf1\x72\xbb\x8d\xbc\x53\x81\x67\x9a\x05\x87\xb7" - "\xe5\x76\xf6\x7b\x4d\x9c\x4d\xf6\xcb\x64\xe1\x0c\xb8\x62\x67\x2c" - "\xcd\x4d\xde\x25\x9c\xfd\x86\x34\x44\x39\x28\xea\xce\xa6\x11\x9d" - "\x2e\x94\x79\xc3\x26\xac\xd7\xf2\x83\xb4\x80\x44\xc2\xef\xcd\x14" - "\xea\x66\x57\x94\x47\x43\x3d\xc3\xf1\xd9\xad\xbb\x2d\xee\xbc\xc2" - "\xa2\xc5\xff\x1d\x55\xfa\x3d\xb4\xc4\x52\x81\x71\xb6\x21\xe7\x65" - "\x72\x0c\x7e\x77\x5e\xd1\x14\xaf\x7a\x32\x8a\x1e\xc3\xdf\x16\xe0" - "\x1e\xb5\x9a\xf9\x4c\x56\x97\x9b\xcf\x2b\xca\x55\xee\x8a\xa6\x14" - "\x48\x0f\x77\xeb\xca\xa3\x59\xf9\xb7\x81\x9e\x34\x27\x40\xbe\x5a" - "\x21\xbd\x52\x5f\xeb\xf9\x1f\xee\xfb\xdd\x7a\x4b\x2b\xde\x15\xf9" - "\xa4\x53\x78\x2e\x48\x20\xec\xae\x24\xaa\x27\x09\xe9\xe0\x56\x3c" - "\x77\x97\x99\xc8\x0c\x4f\x62\xbd\x57\xa8\x73\xcd\x94\x57\xe5\x84" - "\xc1\xf7\x57\x4c\xec\xf9\xee\xf5\x4d\xc9\x78\x46\x2a\x2d\x5e\x6a" - "\xd8\xfd\x32\x21\xf8\x5b\xac\xdb\x8e\xb1\x24\xbc\xea\x65\x12\x81" - "\x6d\xec\x2a\x5e\x31\xc7\x73\x0e\x1d\xfe\x86\x83\xfc\x4f\x3c\x91" - "\x4b\x25\x65\xdf\xe4\x16\xda\xb3\xdc\xc8\x68\xba\x62\xab\x4d\x36" - "\x6d\x0e\xe6\x57\xdd\x2c\xd0\xf2\xa0\xf8\xde\x8c\xfc\xc4\xf2\xa9" - "\xae\xb1\x0c\x9f\xf1\x9c\xbb\x28\x40\x8e\x2a\x27\xb6\x96\xd1\xc8" - "\x52\x81\xe5\x60\x7e\xaa\x6f\x80\xff\x35\x1a\xaa\x13\x68\xac\x56" - "\xad\x26\x09\x50\xf7\xef\xdd\x2f\x3a\xdb\xa0\x8c\x04\xfa\xa2\xb3" - "\x1d\xf2\xd7\x08\xf4\xd6\x99\xe3\x6c\xdc\x8a\x36\x78\xd7\xde\x73" - "\xf6\x25\xa3\xb3\x0c\xf2\x39\xba\x8a\x9f\x8f\xb6\xc9\xe6\xa5\x0a" - "\x7c\xce\xa4\x2d\x78\xc6\xe6\x99\x4c\xea\x4a\x72\x7d\xc1\x83\xae" - "\x22\xf0\x3e\xde\x46\xe6\xed\xf1\xb4\x91\xf1\xbe\xa7\x9c\x83\xf8" - "\x6c\x1f\x2d\x94\x93\xd2\x5f\x39\x36\xee\x79\xf5\x42\x97\x4a\xd6" - "\x7d\x8e\x36\x97\xfe\x16\xe9\x48\x68\x77\x26\xb5\x6c\x49\xa4\x0e" - "\xfd\x67\x84\x34\x82\xd8\x82\xcc\xc7\x44\xca\xa8\x3d\x69\x23\x89" - "\x8a\xd4\x46\xd1\x83\xe6\x23\x64\x73\x22\x6d\xc7\x33\x7c\x9b\x3a" - "\xdb\x48\xf6\x61\x22\xcf\x6d\x24\xe3\xb2\x13\xa9\xdd\x92\x72\x84" - "\xb0\xf4\x46\x92\xfb\x25\x09\xdf\x6c\xa4\x8e\x59\xa0\xff\x3f\x3d" - "\x82\xe9\x6d\x04\xcf\xa8\xcc\x6d\xa7\xae\x9c\xe7\x88\x1c\xff\x6f" - "\x34\x62\xfa\x57\x24\xf7\x24\x09\x4f\xca\xb2\x47\x55\xc3\x37\xf1" - "\xf7\xbb\xa1\x2e\xfc\x39\x7a\xa0\xf4\x1c\x21\x9b\x9f\x21\xd1\xd9" - "\x8b\x88\x32\xc9\x4d\xa8\xd5\xf5\x01\x49\x72\x53\xb0\x2f\x26\xb2" - "\x65\x05\x89\x48\x72\xe1\x3a\xb6\xcf\x09\x9e\xd3\xbd\x1b\xf2\x42" - "\xdb\x0c\xd8\xb6\xcd\x47\x49\x34\x9e\x4f\xce\x7e\xf3\x91\xf8\x9b" - "\xa3\x04\x69\x76\x5e\x31\x55\xeb\xd0\x4d\xb5\x43\xdb\x27\x21\x0d" - "\xe0\x3b\xcd\x3c\xfe\x0e\x7e\x5f\x9a\x2e\xd0\x40\xb6\xd0\x45\xe4" - "\x6e\x9d\x39\x7a\x61\x96\x41\x28\xd7\xc6\xad\xd4\xec\x4e\x17\xea" - "\xe4\x93\x37\xc9\x45\xcf\xd8\x15\x66\xc0\xfd\xca\xb2\xa4\xac\x47" - "\x29\xfe\x16\x78\xd9\xd9\x55\xbc\xb2\xd9\x43\x6f\x0f\x5f\x20\x8f" - "\x11\x78\xd1\x19\xa6\x25\xe1\xf0\xde\x6e\x93\x2d\x48\xf0\x62\x4d" - "\x33\x1f\x78\x3e\xd2\x93\x97\xe5\x49\x1b\x67\x93\xcd\x2f\x92\xe0" - "\x11\xf1\xd5\x93\x07\xde\x4f\xb6\xc9\x9e\x2b\x63\xdf\x58\xd9\x89" - "\x79\x44\xdd\xef\xc9\x1b\x46\x8b\x3a\x9b\xdd\x0a\xcb\x1e\xca\x51" - "\x07\xe0\x31\x9e\x9e\x89\x96\xcf\x72\x51\x07\xaf\x6b\x40\x3d\x2f" - "\xc7\x73\x5d\x59\xfe\x34\x13\xbc\x4f\x50\x65\x0a\xff\xb7\xe2\x77" - "\x68\x49\x79\x42\xcf\xbb\x02\x32\x82\x56\xe9\xcb\xc0\x76\x28\x93" - "\xcc\xd4\x01\xb2\x5e\xa6\x4f\x47\xdb\x61\x29\x43\xb9\xe6\x15\xe6" - "\x44\xc7\x8e\xa6\x04\xd4\x4f\x28\x23\xb4\xa4\x21\x8e\xfd\x56\xf3" - "\x1c\xca\x0d\xd3\x35\x69\x95\x6e\x28\x03\xea\xd4\x02\xef\x46\x1c" - "\xe3\x56\x29\x71\x3d\x29\x2d\x3a\x2b\x17\xce\xbd\xe4\x56\xfd\x98" - "\xe1\xb7\xb3\xd9\xe7\x99\x43\xda\x81\x3c\x81\xce\x42\xfd\x00\xe9" - "\xf7\x7a\x65\x58\xa0\x1b\xc7\x74\x51\x43\x02\xd3\x23\x61\x3c\xe4" - "\x93\x1d\x13\xe5\xf1\xfc\x68\x67\x47\x57\xf1\x2a\xc0\xff\xc3\x0e" - "\x1f\x39\x29\xfe\x5e\x83\x67\x6c\x42\x5d\xc2\xa0\x4c\x1d\xdc\x47" - "\xc1\xfd\x0f\x75\x66\xe4\xb7\x50\xee\x35\xf8\xff\x8e\xeb\xa8\xfd" - "\xf1\xe9\x04\xcf\xd3\x04\x79\x5b\xb5\xcf\x46\x8a\xf6\x62\x39\x2f" - "\xe2\x39\xa3\x90\x86\x79\x20\xdd\x60\x23\x2f\x6e\x67\xe5\x6b\x34" - "\x9d\x50\xd7\x5e\xe5\x7f\xc5\xca\x67\xe5\x62\x79\x9e\xb2\xab\x5e" - "\xa1\x1d\xac\xec\xd5\xe1\x9e\xb2\x75\x90\xe6\x29\xff\xf1\x55\x9e" - "\x6f\xac\x8e\x85\x6f\xc4\x48\xdb\x50\xf1\x0a\xed\xc4\x32\xe0\x5d" - "\x82\x8d\x54\x99\xf1\x5d\x11\xa4\xe1\x6f\x25\xb8\x0a\xab\x4b\x84" - "\x32\x8c\x42\x19\x1a\x1b\xa9\x9c\xdd\x4b\xc7\x29\x3c\x3a\x4e\x2c" - "\xab\xc4\x53\x96\xb7\x1c\x11\x4f\x25\x64\x9f\xc8\x57\x2c\x57\x8e" - "\xe5\x42\xfe\x03\x36\xf2\xd2\x5e\x69\xdb\x41\xa7\x19\xa9\xde\xb2" - "\x0f\xf5\x98\x88\xc7\xef\x51\x27\x7b\xea\x8d\xe7\x8c\x82\xee\x6e" - "\x47\x79\x11\xf4\xb7\xce\xac\xea\x2a\x5e\x13\xde\x4b\x5f\x87\x63" - "\x3e\x77\xf1\xb2\xf1\x55\x78\xce\xea\x75\xb4\x1d\xf2\xa8\x7d\xce" - "\x16\xe5\xc8\x23\x90\x36\xc5\x73\xc6\xa9\x1e\xf2\xd8\xb8\x65\x7e" - "\xf7\x70\xcc\xb9\x89\x70\xd6\x4a\x1b\xfa\xcf\x88\xab\x29\xd6\x98" - "\x4e\x62\xad\xe4\x09\x5f\xad\x37\x24\xe4\x50\x03\xf8\x4c\x1f\xe2" - "\xd9\xd4\xc1\xd9\xe4\x35\x5b\x05\x3c\x75\x83\x5f\x99\xfd\x0b\x82" - "\x76\xf8\x14\xa7\xfd\xc6\x6a\x3f\x2d\xc8\x16\xfc\x2f\xac\x8f\x2e" - "\x07\x3f\x14\x7d\x51\xf0\xff\x35\x65\x1c\xf3\x47\x79\xc8\x5b\x8d" - "\xe9\xe8\xab\x82\x9e\xdc\x2d\x79\x47\xab\xf5\x59\x8c\x76\xda\x57" - "\x05\x7b\x80\xf5\x75\xfd\xca\x80\x75\xe6\x2b\xf5\x59\xd8\x86\xdc" - "\x2c\xca\x5b\x5d\x5d\x06\xd4\xa5\xaa\x4c\xf4\xa3\xb5\x5b\x92\xaa" - "\x08\xe5\xab\xf4\x59\xc1\xb5\x41\x2b\xcc\x7f\x82\x58\xe1\x94\x7d" - "\xbc\x3e\x0b\xcf\x7a\x2e\xcd\x19\x11\x31\xad\x92\x1a\xce\x4c\xd0" - "\x1b\xba\x8a\xb5\x7b\x3c\x67\xe9\x06\x59\xee\x1e\x4f\xdb\xab\xc5" - "\xb6\x43\x9a\xe0\x37\xde\x55\x21\x9c\xe5\x8d\xcf\x7e\xcf\xfa\x04" - "\x3d\xb2\x0f\x7f\x0b\x6d\x4f\xd8\xed\xa1\x93\xcb\x8e\xe7\x98\x5f" - "\x7b\x82\x5b\xbb\x2a\x29\xdb\x40\x84\x7d\xfb\x75\x0d\xfb\x82\xab" - "\xd7\x5a\x61\xfe\x7b\x13\xc4\x29\x49\xae\x8f\x29\xd3\x7b\x6b\xff" - "\x38\x4b\x2c\x0f\xdf\x79\x78\x55\x2d\xc6\x0f\x21\x7c\xc3\xef\xf9" - "\x07\x92\x76\x29\xfb\xb6\x2b\x7d\x7a\xe8\xed\x4a\x57\xf6\x6d\x57" - "\xfa\xaa\xe1\x6d\x57\x7a\x46\x00\xed\x52\xf5\x6d\xd7\xba\xf1\x43" - "\x68\x57\x7b\xdf\x76\xad\x9b\x3e\xbc\xed\x5a\x37\x23\x80\x76\xc5" - "\xf5\xd3\xae\xb3\xa1\xb7\x6b\x9d\xa1\x6f\xbb\x32\xc6\x0f\x6f\xbb" - "\x32\x62\x83\xd6\x87\x7a\x8b\x9d\xe9\xc3\x8c\x83\xc1\xeb\xc3\x8c" - "\xed\x7d\xf5\xe1\xfa\xf3\x5e\x7d\xb8\xfe\xab\x90\xf4\xa1\xbe\x5c" - "\xf4\x29\xd6\xbf\xd7\x47\x1f\x96\x94\xc7\xf5\xaf\x0f\xd7\xeb\x04" - "\x7d\xa8\x2b\x0f\x32\xae\x5f\x9f\xdc\xa3\x0f\x15\xe5\x71\x3e\xfa" - "\x30\xd2\x02\x36\x72\x7d\x4d\x68\xfa\x70\x7d\x4d\x5f\x7d\xb8\x5e" - "\xe9\xab\x0f\xd7\xfb\x9d\xeb\x4c\x4b\xcc\xea\xfe\xf4\x61\x92\xeb" - "\x3b\xca\xb0\x61\x56\x07\x57\x9f\xcc\x84\x01\x30\x5f\x33\xf0\xb7" - "\x1a\x6a\x82\xfc\xd6\x5b\x7e\xbf\x15\xd1\x89\x7e\x86\x72\xcb\xab" - "\x84\x3b\x0e\x91\x78\x53\x4c\x2b\xc4\x01\x0e\x72\xa7\x16\x30\x51" - "\x40\xa6\x34\x55\x76\x90\xa6\x98\xe3\x84\x8e\xee\xb4\xd3\x37\x4a" - "\xe3\x12\xd2\x11\x9b\x1b\x96\x5a\x33\x1c\x41\x62\x73\x43\x9c\x07" - "\x9b\x4d\x2e\xc0\x66\x26\xe2\x31\xeb\x8f\xd6\x8e\x13\x22\x36\xb3" - "\xf2\x7b\xf8\x53\xc0\xf0\xd9\x2f\x36\x41\x26\x7c\xb1\xd9\xb0\x87" - "\x61\x33\x6b\x66\x5f\x6c\x36\xec\xe9\x1f\x9b\x59\x13\x19\x36\x1b" - "\xf6\x04\xd9\x86\x4e\x2f\x36\x1b\xf6\xf8\x60\xf3\xd6\xd2\xb8\xae" - "\xe2\xac\x19\xa1\x61\x33\x6b\x86\xa7\xed\x55\x62\xdb\xe1\x5b\x6f" - "\xf9\x62\x33\x6b\xab\x5f\x1e\x16\x7d\x19\x07\xfa\x50\x7e\x82\xdb" - "\x38\xc7\x0d\x7e\x2b\x5f\x32\x49\x0d\x71\x57\x17\x9e\x19\x4f\xb9" - "\xc9\x84\x6e\x50\xcb\xbb\x20\xfe\xed\xea\xd2\x44\xd0\x31\x9d\x9b" - "\xa8\x33\x9a\x40\xdd\xa3\x68\x97\x3a\x12\x68\x16\x0b\xf7\xb1\x55" - "\x99\x64\x1c\x5c\xd1\x55\x22\x5d\xe1\xff\x38\xba\x21\x7a\x8c\x3e" - "\x93\x4c\x8a\xea\x24\x11\x50\x87\xe4\xa8\x7c\x25\x89\x72\x91\x71" - "\xf8\x3f\x2d\xf8\x42\x0d\xf1\x59\x38\xf6\x7d\xf2\x0a\xf8\x5e\x56" - "\x14\xa5\xeb\xd4\x04\x62\xb5\x08\xe0\x41\xf4\x6e\x8e\xd6\xb8\x37" - "\xa8\x39\x1a\x69\xf9\x33\xdd\x9c\x2c\xd4\x89\x8f\x2d\xd5\x02\x86" - "\xb4\x34\x57\x83\xdf\x4d\xc0\xb3\x8b\xe9\xad\xa5\x19\xb4\x2b\x7a" - "\x8c\xee\x1c\x99\xb4\x3b\x93\xc4\x56\x67\x12\x35\x75\xaa\x39\xa0" - "\x41\xf2\x82\xb5\x4a\xe4\x7b\x32\xe5\xe0\x5b\x99\xf0\x2d\xe0\xa5" - "\x5b\x07\xdf\x72\xc1\xb7\xbe\x83\x6f\x9d\x82\x6f\x15\xc0\xb7\x0a" - "\xd8\xb7\x82\xa3\xf9\x46\xc3\x40\x7d\xd4\x49\x5b\x26\xe0\x5e\xba" - "\x5f\x47\x65\x8d\x4a\xc4\xfe\xea\x33\x9b\x35\x41\xe2\x7d\x93\xca" - "\x5f\xf9\xa5\xef\x90\x18\x2a\xbf\x55\x3d\x6b\xdb\x17\x14\xe3\xe8" - "\x6d\xef\x90\x49\x28\x73\x4d\x8e\x93\x84\x2a\x6e\x55\x9b\xd4\x1d" - "\xc1\x7e\xcb\xef\xfc\x87\xe2\x02\x88\x9b\xe5\x10\x87\xca\x2d\xb5" - "\xa5\x05\x34\xcb\x19\xa3\x2f\xeb\x8e\xd1\xd7\x2c\x74\x29\x01\x57" - "\x34\x4b\x95\x4e\x54\xc7\xb9\xbc\xbf\x1d\x6a\x01\x1b\xf1\x2c\x89" - "\x38\xc6\xe5\x47\xe4\x1e\xc6\xbe\xc6\xcd\x31\xbe\x7d\x8d\x9b\x13" - "\x08\x97\x5d\x43\xb8\x2d\x06\xc2\xe5\xb4\x11\xc8\xe7\x7b\xe5\x11" - "\x56\x56\xb6\x2e\xe9\xcd\x09\x24\xc7\x45\xbf\x86\x38\xb6\x48\x0f" - "\xf1\x6f\xd2\x44\x99\xcd\x90\x89\x7d\x70\xd9\xdb\x80\xa6\xdf\x82" - "\x5d\x8a\x82\xff\x9f\x02\xde\x11\x6d\x3a\xf9\xd1\x09\x2e\x7b\xb6" - "\x0b\xfe\x8f\xea\x1c\x95\xe8\xce\x4d\x26\xae\xe8\xa6\x04\x67\x89" - "\xa5\xcc\x0d\xb1\x2c\x2f\x9f\xa4\xc6\x7e\x10\x6b\x87\x9b\x54\x02" - "\xee\x16\xba\x23\x50\x1e\x92\x0d\x8b\x0f\x91\xe3\x19\x84\xcb\x3d" - "\x4b\x14\xf4\x8c\x5a\xee\xc1\xf5\xcc\x8e\x28\xc7\x96\x0e\xca\x23" - "\xbe\xb1\xdf\x01\xde\x45\xe6\x9c\x05\x5b\x6b\x6f\x27\x95\x10\x37" - "\xbb\xd7\x69\xc6\xda\xcf\x68\x7e\xb4\x8b\x27\xe3\x22\x3b\x89\xb2" - "\xf2\x34\x60\x70\x1d\xe0\xef\x34\xe0\xdc\xce\x70\x8e\x6b\x85\xaa" - "\x11\xe3\x85\x8e\x94\xdd\xa7\x19\xc6\x05\xdc\x21\xc6\xd7\x00\xee" - "\x56\x7b\x71\xe7\x3a\x03\x18\x2f\xde\x04\x75\xa3\xd8\x2f\xc2\xed" - "\x3e\x31\x0a\xdf\xc9\x46\x4c\xe4\x54\x87\x66\x3b\x88\x37\x0e\xcb" - "\x1f\xdd\x3d\x5e\x5f\xa3\x7a\x9a\x7e\x77\x8c\xcb\xce\x86\xf4\x08" - "\xd5\x6f\x6f\x53\x02\xbd\x47\xb3\x3e\x8a\xfc\x08\x8c\xf3\x6d\x40" - "\x0b\xa4\x8b\xea\x69\x72\xdb\x31\x6e\xf3\x53\x48\xc7\x0d\xfb\x48" - "\x98\xf6\x11\xda\x06\x34\x4b\xc6\xf2\x6c\xdc\x66\x21\xce\xc2\xf1" - "\x8f\x4f\x85\xbe\x4f\xf6\x1b\x37\xd0\xcd\x25\x2f\x4f\x00\x7e\xef" - "\x33\x3c\xdf\x2d\xc8\x1c\xd2\xf1\x78\x1a\xe1\x16\x76\x00\xad\xdc" - "\x40\xab\x2e\x41\x17\xcc\x16\x74\x41\x51\x67\x46\xb6\x8d\xf2\x49" - "\xa9\x61\x34\x67\x2d\x8e\xbd\xb8\xc9\x02\x2d\xa1\x5b\x4e\x02\xbd" - "\x3a\x5b\x51\x6f\x44\xf2\x1b\x98\x6e\x40\x7a\x29\x3a\x88\x92\xea" - "\xd5\xaa\x77\x72\xcc\x23\xdc\x80\x5f\xd4\x0f\x51\xf9\xb2\xd1\x20" - "\x97\x91\x25\x28\xbf\x20\xcf\x51\xf9\x82\xbe\x4a\xae\x04\xb9\x75" - "\x6d\x50\xdf\xec\xdc\xa0\x56\xc1\x35\xc1\xa3\x43\xf0\xcc\xaf\x2a" - "\xa4\x6d\xf1\x26\x0d\xea\x0f\x6b\x96\x8d\xb8\x80\xb6\x91\x68\x6f" - "\x36\xa8\x63\x04\x1a\x2f\x57\x93\xbb\x1c\x44\x06\x75\x52\x42\x7d" - "\xc9\xee\x65\x24\xa2\x51\x73\x8c\xb8\x41\x36\x3c\x74\x9f\xb9\x42" - "\x45\xa0\x5c\xce\xa4\xfe\x9c\x88\x34\x93\xf9\xc7\x5d\xce\x51\x2f" - "\xee\x72\x8e\x22\xed\x18\xee\x72\x8e\x5c\x89\xb8\xfb\x34\x59\xc0" - "\x5d\x98\x73\xbc\x80\xa7\x64\xab\xeb\x7d\xa0\x51\x0e\xf6\x6d\x12" - "\xc4\xcc\xc1\x3f\x21\x66\x72\xed\x97\x2b\x66\xce\x77\xa9\x55\x70" - "\x5d\x10\xcc\x40\xb9\x02\x66\x90\x56\x9f\x26\x77\x13\x0f\x8d\x04" - "\x59\x2d\xb9\x55\xad\xca\x25\x8f\x82\xac\x46\x44\xe5\x4f\x20\x8d" - "\x02\x9d\xf2\x41\x4e\x29\x7f\x8c\xcb\x9b\x98\xfb\x37\xa2\xec\x2e" - "\xa0\xd4\xea\x7a\x9b\xf0\x72\x73\x22\xf6\x33\x83\xff\x5b\xe6\x19" - "\xc3\xc1\xfe\xb8\x28\x2d\x8e\xdb\xdc\x16\xe7\xd6\x35\x96\xf1\xba" - "\x5b\x53\xa8\x62\x6a\x3b\xf6\xbd\xf1\xba\x91\x84\x57\x3c\x92\xd0" - "\x55\x9c\xa7\xb5\x11\xda\x2a\xf4\x07\x97\x58\xd0\x77\x41\xfd\xbb" - "\x43\xe8\x2f\x56\x60\xdf\x79\x5e\x99\x67\x7c\x02\x75\x82\xd8\x2f" - "\x27\xf6\xdb\xe5\x21\x0f\xc7\x60\xbf\x1d\xd3\x29\x79\xf9\x9e\x7e" - "\x3b\xcf\x33\xbe\xb7\x71\x79\x5b\xb1\xcf\xc7\xfb\xbb\x7c\xc2\xf2" - "\x79\x7e\xb7\x79\x04\xea\x7a\xef\xef\xd8\x33\xe8\x15\xe2\xe4\x48" - "\x44\xbf\x3e\x86\xbc\xb1\x0c\xe4\x27\xfc\x38\x57\x30\x02\xee\x1c" - "\xd0\xe5\x55\xb8\x87\xc1\x7d\x2d\x96\x1d\x9c\xbd\xca\x17\xd6\x7f" - "\x42\xfb\x8f\x88\xba\x51\x98\x4b\xa1\xbd\x9d\x28\x4e\x88\xff\x77" - "\x15\xe7\x57\x78\xc6\x59\xbc\xf9\x7b\xf8\x33\x19\xbf\x0d\x3c\x0a" - "\x67\x63\x3f\xec\x59\x52\xde\xbd\xc2\x33\x09\x57\x01\x6f\x66\xe3" - "\x18\x2d\xe0\x57\xd6\x45\x35\x8f\x88\xf7\x87\x51\x3e\xb0\xbf\x14" - "\xfd\x35\x51\xff\x4e\x61\xdf\x2d\x50\x82\x3d\xb5\x48\xbf\xdb\x1f" - "\x3d\x6c\x5c\xc1\x24\x7f\xef\x82\xa3\x45\x81\xdf\xf5\x6f\xd3\xd5" - "\x6e\x1a\x64\x59\xdb\xfd\xfa\x88\x31\x7a\x6d\xd2\x3e\xb7\x81\x77" - "\x26\x47\x99\xb2\x4f\x06\xe9\x5f\x14\x74\xf8\x2b\xd7\x2d\x37\xa7" - "\xb8\x2a\xf5\x5a\xec\x93\x6c\xda\xe7\x22\x6f\x9e\x68\xe7\x92\x26" - "\x4e\x20\x8a\x36\xa2\x44\xff\x69\x66\xc7\xc7\x14\x7d\x28\xfd\x09" - "\x12\xdb\xfd\x5d\x72\x94\x13\x7c\xc1\x97\x4e\x90\x29\xfc\xf2\xe8" - "\x31\x25\xcb\x48\x78\x37\xf8\xab\xdd\xcb\x35\x51\x9f\x1e\x69\x27" - "\x20\x27\xda\xa6\x4e\x1b\xa9\x86\xbc\xf4\xeb\xe4\xc8\x27\x52\xa8" - "\xc3\x92\xf2\x32\x49\x52\xbb\x0d\x39\x5f\x12\x05\xe8\x22\xa5\x35" - "\xeb\x6d\x62\x75\x9d\x24\x23\x36\x72\x2a\xab\xeb\x2b\xa2\x5b\x06" - "\x3a\x0c\x74\x56\xee\x33\xa0\xab\x5d\x67\xc9\x2e\xa9\xae\x7e\xfe" - "\x35\xaf\xae\xfe\x0e\x74\x75\x31\xe8\xea\xdc\x68\xd2\xa4\x35\x10" - "\xd0\x1d\xa3\x66\x69\xa3\x1c\x39\x5a\xd0\xd9\x1b\x41\x67\x67\x7d" - "\x45\x04\x7d\xdd\xd1\x4e\x40\xd7\x46\x56\xad\x26\xe3\x9c\x6b\x40" - "\x67\x7f\xa7\xf9\xd1\x8e\x1c\xa6\xb3\x77\xae\x06\x9d\xbd\x06\x7c" - "\xe2\xd5\xa0\xb3\x3b\xfa\xd1\xd9\xa7\xfc\xf8\xc3\xa2\xfe\xe9\x5e" - "\xa3\xe6\x76\x72\x14\xc7\x55\xb8\x1d\x7f\x1f\x15\x24\x4e\xb6\x6a" - "\xfd\xf1\x00\xe9\x8d\xf4\xe7\x81\x0f\x8d\xc0\x03\xc1\x6f\x75\x8c" - "\x4a\x74\x82\x4d\x73\x47\xd6\xd5\xfc\xe9\x44\x2b\x17\x99\x41\x94" - "\xb3\xb4\x1f\xd3\xee\x75\xc9\xe0\xf7\x27\x2b\x5c\x25\xe6\x94\x12" - "\xf0\xa9\xdd\xe0\x7b\x3b\xbb\xa2\x23\x80\x06\x4a\xfb\x06\x4d\x14" - "\xd2\x90\x1f\x0f\xfc\x1c\xb9\x6c\x3e\xe8\xd0\xc9\x55\xcb\x48\xbc" - "\x53\x57\x77\x84\xea\xea\x9a\xdd\xba\xba\x16\xf8\x6d\xe4\xaf\x6d" - "\xc8\x97\xbf\x10\x48\xb3\x53\x7d\x7d\x8d\x5b\x61\x4e\xb1\x2b\xea" - "\x5a\xe1\xb9\x1d\xdf\xe7\x2c\x22\x8a\x24\xf5\x79\x03\xe3\xd7\xeb" - "\x04\xf9\xc4\xf8\x75\x94\xe8\x20\xee\x43\x9b\x2b\xd8\x57\x91\x67" - "\x10\x2f\x08\xfe\xbe\x97\x6f\xbd\x6c\xac\xc8\xb7\xc6\x0e\x03\x01" - "\x7b\x32\xaa\xc7\xd6\x0a\x7c\x3b\x4a\x3c\x76\x16\xe8\x1d\x59\x05" - "\xb6\xd6\x39\x5c\xb6\x56\x8c\x63\xd0\xd6\xa2\x9d\x45\xbe\xed\x0c" - "\x9a\x6f\x85\x7e\xe7\xbf\x0f\xcc\x37\x63\x5c\x88\x7c\xdb\xef\xe5" - "\x9b\x71\x3e\xd5\x19\x67\xbb\x75\xc6\x39\xbe\x7c\x33\x6a\xbd\x7c" - "\x33\x26\xc3\xb3\xc6\xcb\xb7\xb3\x41\xf0\x6d\xc4\xe9\x2b\x97\x6f" - "\xbf\xb7\x85\xc8\xb7\x10\xe5\x6d\xb9\x5c\xc2\x37\x90\x37\x23\xc8" - "\x9b\xb1\x97\xbc\x19\x25\xf2\x66\x04\x79\x33\x4a\xe4\xed\x64\x10" - "\x7c\xbb\xe6\xd8\x95\xcb\xb7\x17\xfd\xee\x7f\x39\x30\xdf\x4c\x21" - "\xca\xdb\xf2\x54\x2f\xdf\x4c\x20\x6f\x26\x90\x37\x53\x2f\x79\x33" - "\x49\xe4\xcd\x04\xf2\x66\x92\xc8\xdb\xd1\x20\xf8\x76\xed\x67\x57" - "\x2e\xdf\x5e\xf2\x3b\x76\x38\x08\xdf\x42\x95\xb7\x03\x12\xbe\x81" - "\xbc\x99\x40\xde\x4c\xbd\xe4\xcd\x24\x91\x37\x13\xc8\x9b\x49\x22" - "\x6f\x1f\x05\xc1\xb7\xfb\x8a\xaf\x5c\xbe\xe9\xfc\xae\x7f\x1e\x98" - "\x6f\xf5\x21\xca\x9b\x66\x9c\x97\x6f\xf5\x20\x6f\xf5\x20\x6f\xf5" - "\xbd\xe4\xad\x5e\x22\x6f\xf5\x20\x6f\xf5\x12\x79\xdb\x12\x04\xdf" - "\xe6\x4d\xbd\x72\xf9\xa6\xf7\xdb\xff\xe9\xe1\x9b\x87\x67\xc8\x3f" - "\x81\x6f\x34\x99\xb8\xc0\x9f\xfc\xf3\x62\xc6\x37\xe4\x97\xc0\xbb" - "\x33\xc9\x51\x3a\x91\x67\x2e\x91\x67\x48\x3f\xe4\x1b\xfa\x91\x02" - "\xdf\x64\xe1\xd1\xe8\x43\xba\xc0\x97\xf4\xf8\x91\x4f\x6a\xa8\xa3" - "\x51\xf3\x5a\x8f\x1f\xe9\xea\xed\x47\xae\x90\xfa\x91\x6f\xfb\xf0" - "\xab\xe4\x1c\xf0\x8b\x13\xf9\xf5\x9c\x1f\x3f\x72\xd9\x7f\xf9\xe1" - "\x57\xf3\xa0\xfc\x02\xde\x8c\x73\x9e\x61\xfc\xda\x29\xfa\xff\x95" - "\xe9\x43\xe4\xd7\x3a\xe0\x17\xfa\xff\x47\x09\xb7\x6b\x41\xb0\xfc" - "\x2a\x1b\xd4\xff\xef\x9f\x5f\xa6\xb8\xe0\xf8\xb5\x3c\xd5\xcb\x2f" - "\xd3\x6c\x17\xd8\x34\x8f\x3d\xf3\xf2\x8b\xd9\x33\x57\x6f\x7b\xb6" - "\x42\x6a\xcf\x02\xe1\x57\x2f\x7b\x76\x45\xf1\xeb\x65\xbf\xfd\xff" - "\x6e\x88\xc5\xdd\xa0\xe7\xb0\xbf\x32\xb2\x1d\xe2\x64\x17\xfd\x7a" - "\x56\x27\xc4\xc9\xae\x51\x89\xa5\xab\x49\xac\x73\x03\xc4\xc9\xc0" - "\xbb\x92\xd5\x64\x4a\xf1\x6a\x12\xce\xaf\x84\x58\xf9\x04\xc4\xca" - "\xa0\x9f\xba\xbf\xd5\x44\x59\x52\xec\x84\x87\x58\x19\xfb\xc1\xa0" - "\xbe\xb1\xf4\x5b\x88\x95\xdb\x40\xf7\xb5\xed\x64\xb1\xf2\x57\x9e" - "\x58\xf9\x03\x9f\x58\xf9\xa5\xe7\xc5\x58\x59\xa4\x7f\xa5\x94\xf6" - "\xcf\xfe\xc9\x4f\xac\x6c\x1e\x34\x56\xc6\x18\x79\x17\xc6\xcb\xdf" - "\x69\xc6\xee\x10\x75\xdb\xce\x53\x43\x8c\x95\xbf\x83\x58\xb9\x80" - "\xd1\x7e\x67\xd0\xb4\x2f\xf7\x3b\xff\x03\x65\x03\xe5\xa5\xc7\x16" - "\x01\x9d\x3d\x36\xc8\x09\x36\x08\xfb\x33\xba\x4b\xea\xf6\x03\x5e" - "\x05\xf9\x10\x6c\xd2\x86\xe8\x08\x94\x0d\x94\x13\x94\x0d\xc1\x16" - "\x81\x1e\x04\x5b\x94\x56\xfd\x3c\x89\xdf\xfd\x3c\x99\xec\x52\xf8" - "\xc6\xc8\x4f\xa6\x22\x3f\xbc\xba\x8d\xef\xad\xdb\x96\x4a\x75\xdb" - "\x07\x7d\x6d\xd1\x60\xba\xed\x79\x7f\xb2\x62\x1e\x54\x56\x50\x46" - "\x04\x7b\x04\xf2\x72\x21\x64\x65\xe7\xff\x0b\x96\x5f\x7f\xf4\x3b" - "\xff\x23\x30\x7e\x19\x27\x0f\xce\x2f\x63\x1c\xf0\xcb\xe0\xe5\x97" - "\x6f\x6c\xec\xe5\x17\x8b\x8d\xf9\xde\xb1\xf1\x52\x69\x6c\x1c\x08" - "\xbf\x7a\xc7\xc6\x57\x12\xbf\x5e\x71\x0d\x91\x5f\x01\xc8\x97\x11" - "\xe4\x6b\xc5\x38\x09\xbf\x7c\x62\x62\x09\xbf\x24\xf2\x25\x89\x89" - "\x97\x4a\x63\xe2\x40\xf8\xd5\x3b\x26\xbe\x92\xf8\x55\xe1\x77\xfe" - "\x47\x60\xfc\x32\x05\x20\x5f\x26\x90\xaf\x15\x1a\x2f\xbf\x7c\x63" - "\x61\x2f\xbf\x4c\x12\xf9\x92\xf8\x0e\x4b\xa5\xbe\x43\x20\xfc\xea" - "\x1d\x0b\x5f\x49\xfc\xda\x39\x7f\x88\xfc\x0a\x40\xbe\x4c\x28\x5f" - "\x07\x24\xfc\xf2\x89\x81\x25\xfc\x92\xc8\x97\x24\x06\x5e\x2a\x8d" - "\x81\x03\xe1\x57\xef\x18\xf8\x4a\xe2\x57\xa5\x7c\x68\xfc\xaa\x0f" - "\x40\xbe\xea\x41\xbe\x9e\x57\x7a\xf9\xe5\x1b\xfb\x7a\xf9\x55\x2f" - "\x91\x2f\x49\xec\xbb\x54\x1a\xfb\x06\xc2\xaf\xde\xb1\xef\x95\xc4" - "\xaf\xaa\x03\x03\xc5\x52\xd2\x18\xca\x95\xeb\xe5\x17\xf2\xc6\x09" - "\xb1\x93\x53\x5e\xb7\xdf\x7f\xfc\xa4\x49\xf3\x17\xef\xe2\xde\x35" - "\x4f\xb6\xe3\x7a\x10\xe6\x13\xd2\x5e\x3e\x61\xa3\xe6\x4f\xc4\x37" - "\xe6\xfd\xa8\x4f\x0c\xe5\xf4\xf4\x51\x2c\xf2\x17\xf3\xfe\x25\xe4" - "\x18\x0a\xf9\x84\x71\x94\x6b\x1d\xf0\x49\xf4\xe3\x77\x0d\xb1\x8f" - "\xc2\x79\x46\xcd\xed\x02\x3f\x3e\x7b\x11\xc4\x50\x8b\x83\xe5\xd3" - "\xee\x54\x7f\x7c\xc2\x7e\x22\x8c\x79\x31\x96\xc2\x71\xc7\xa6\xb6" - "\x76\x52\x9c\x49\x94\xc2\xd8\x63\xbb\xef\xd8\x63\xe9\x71\x88\xa9" - "\xd6\x00\xdf\x9c\xc9\x44\x7f\x9c\x4c\x29\x79\x9e\xc5\x54\x9e\x78" - "\xaa\xa9\xd3\x21\x8c\x3d\x5a\x5d\x36\xf2\x84\x8d\x3a\x76\x43\x7e" - "\x8c\xa3\x2c\x29\x3b\x09\xca\x4a\xee\x97\x44\x81\x3c\x80\x18\x4c" - "\xe0\x87\x34\x86\xaa\x96\x8e\x37\x2e\xf3\x17\x43\x0d\x3e\xde\x58" - "\x79\x8a\xc5\x4f\xc2\x78\xe3\x65\x11\x43\xed\xf1\x3b\xfe\x31\xf3" - "\x4d\xd6\xdf\x80\xb4\xb7\xaa\x5d\x04\xf0\xf4\x75\x54\x07\xeb\xd7" - "\x73\xe9\xeb\x6a\x30\xa6\xc5\x78\xd6\x9a\x65\x26\xc5\x9b\x88\xb2" - "\xbb\x2b\x39\x0a\x62\x54\x85\x0b\x74\xdd\x4b\x27\x18\xed\x71\x8d" - "\x98\x7d\xa5\x46\x98\x2b\x83\xb1\x2c\xca\x8a\x30\xe6\xb8\x98\x4c" - "\xae\x3c\x46\xe2\x05\xf9\x00\xb9\x70\xe9\xcc\x29\xbc\xa2\xae\x05" - "\xe5\xe4\x89\x23\xd4\x81\x3c\x40\xf9\xf8\xf4\x08\xf2\xe6\x6d\x92" - "\x7b\x94\xf1\x46\xe0\x0b\xe7\x3b\x16\xdc\x57\x36\x3e\xf3\xc3\x9f" - "\xda\xc0\xf8\xb3\xc6\x97\x3f\x55\xa1\x8e\x07\x7b\xe6\x47\xae\x51" - "\x73\x55\xe2\x78\xf0\xce\x67\x83\xe5\xcf\x6b\x79\xa1\xf1\xc7\x18" - "\x17\x1a\x7f\x8c\xb3\x85\xb1\x45\x1f\xfe\x18\x35\x8c\x3f\xc6\x39" - "\x18\x2b\x79\xf9\x73\x36\x40\xfe\xf4\x8a\x91\xae\x28\xfe\xec\xf5" - "\xdb\xff\x33\x08\x7f\x42\x94\x1f\x63\xb3\x30\x86\xe8\xcb\x1f\x51" - "\x7e\x8c\x2d\x18\x1b\x79\xf9\x73\x32\x40\xfe\xf4\x8a\x89\xae\x28" - "\xfe\xbc\xee\xb7\xff\x7b\x60\xfe\x98\x42\x94\x1f\xd3\x6c\x61\xac" - "\xd0\x87\x3f\x26\x51\x7e\x4c\x73\x30\x16\xf2\xf2\xe7\x68\x80\xfc" - "\xe9\xdd\x7f\x7a\x25\xf1\xe7\xff\xa4\x84\xc8\x9f\x10\xe5\xc7\xd4" - "\x2c\x8c\x09\xfa\xf2\x47\x94\x1f\x53\x0b\xc6\x3e\x5e\xfe\x7c\x14" - "\x20\x7f\x7a\xc5\x3c\x57\x14\x7f\xde\x24\xa1\xf1\xa7\x3e\x44\xf9" - "\xa9\x9f\x2d\x8c\xfd\xf9\xf0\xa7\x5e\x94\x9f\xfa\x39\x18\xeb\x78" - "\xf9\xb3\x25\x40\xfe\xf4\x8a\x71\xae\x28\xfe\xfc\x69\xcf\x60\xe3" - "\x45\x1e\xdf\x59\x3a\x2e\xeb\x04\xff\x0d\xfd\x67\xf4\x9d\x9b\x3a" - "\x6b\x89\x6b\x0d\xe3\x4d\xf1\x39\xa2\x2c\x11\x79\x23\x8c\xc9\xae" - "\x64\x63\xb2\x82\xdf\x56\xb8\x6c\x3e\xcd\x0f\x8f\x46\xbf\x4c\x18" - "\x77\x15\xc6\x26\x4c\xf8\xae\xdd\x29\xf1\xdf\x30\x46\x05\xdf\x9b" - "\x60\x9c\x9a\xfb\x55\x10\x7e\xdb\x62\x7f\x7c\x19\x7c\x6c\xa2\x52" - "\x32\x8f\xcf\x13\x7b\x0e\x2b\x5f\x82\x1e\x77\x7d\xcb\xef\xf9\x4f" - "\x03\xf3\xc5\x14\x17\x1c\x5f\xc0\xde\x14\x2e\x4f\x65\x7c\x39\xda" - "\x8b\x2f\x26\x8d\x53\x62\x77\x02\xe7\x4b\x2f\x7b\x73\x45\xf1\xe5" - "\xed\x66\xbf\xb1\x26\xe8\x25\xe4\x09\xce\xef\x2e\x5d\x4c\x62\x8b" - "\x8f\x91\x29\xce\x6f\xa3\xc7\xcc\x02\x3d\xe7\x5c\x19\x1d\xd1\x04" - "\x3a\x2e\xa7\x93\x7e\x1d\xd9\x39\x2a\xf1\x50\x8b\x9d\x34\xa5\xd8" - "\x48\xf7\x86\x64\xa2\x3b\x81\x73\xd5\x6b\xc9\x8b\xe9\x18\xcb\xbf" - "\x4f\x3e\x3d\x72\x9a\xcc\xda\x47\x9d\xd6\x8e\x5a\x62\xd8\xf4\x3e" - "\xa1\x2b\xd5\x63\x76\x43\x9e\x85\x40\xc3\x53\xdc\x3b\x45\xe7\x21" - "\x1e\xbd\x2b\x8b\x28\x67\x74\x50\x47\x53\xc7\x21\xb2\x0b\xbe\x65" - "\xca\x22\x04\xe9\x8b\x3c\xd1\x3d\x8f\xf1\xe7\x47\x8c\x27\x4f\x31" - "\x9e\xec\x94\xc4\x9f\x2a\x78\x7f\x5c\x0b\xfc\xf8\xbe\x17\x3f\x8e" - "\xb4\x13\xa0\xef\xa8\x59\x9d\xc0\x8f\x4e\x0f\x3f\x4e\x92\x9c\xb5" - "\xc8\x0f\x5b\xcf\x7c\xd7\x6e\x91\x1f\x95\xa8\xbf\xb4\x44\xb9\xc3" - "\x13\x7f\x9e\x92\xf0\xc3\xb3\x26\x4b\xca\x0f\x4f\xec\xbf\x01\xf8" - "\x91\xe9\x8d\x3f\xcf\x43\xfc\xb9\x03\xe2\xcf\xdc\xbf\x11\x6e\x47" - "\x4e\xb0\xfc\x78\xd7\xaf\xfd\xf7\xf0\x02\x6d\x8b\x33\xb2\xae\x06" - "\xf9\x60\xcd\xaa\x21\xc8\x13\xb4\x27\xee\x6f\xa3\x23\xb2\x33\x40" - "\x76\x6c\xa3\x12\xbb\x29\xc4\xfc\x10\xef\x5b\xe7\xff\x9d\x60\x9f" - "\x01\xe3\x81\xd3\x69\xb5\xd7\x12\xa4\xbd\x61\xd3\xdf\x05\x3e\x9c" - "\xe2\x6a\x22\x16\x74\x12\xee\x4e\xc0\x21\xc4\xfb\xca\x85\xb8\x2e" - "\x17\x74\xdb\xae\x65\x24\x7e\x86\x96\x3a\x30\x36\x45\x19\xc2\xb9" - "\x27\xa8\xd7\x9a\xb4\xff\x45\xb0\x5f\xc7\xa9\x30\xa7\x98\x32\x08" - "\x41\xfd\x86\x74\x1f\xb1\xde\xcb\x27\x9c\x4f\x22\xf0\x6a\x6e\x00" - "\xf3\x5c\xa5\xfc\x9a\x6f\x0b\x68\x7e\x72\xb7\xd8\x5f\x50\xe9\xe9" - "\x53\x0b\xb5\xbf\xc0\xd3\xa7\xf6\x1d\x9b\x4f\x92\xfb\x39\xc8\x4f" - "\xd0\xfc\x7a\x4f\x19\x18\xbf\x8c\x71\xc1\xf3\xab\xab\x1f\x7e\xbd" - "\x57\xdb\x97\x5f\xc6\xd9\x12\x7e\xed\xf7\xf2\xcb\xa8\x61\xfc\x32" - "\xce\xf1\xf2\xcb\x98\x3c\x38\xbf\x06\x98\xdf\xfa\x83\xe7\xd7\xfb" - "\x7e\xe3\x9f\x5e\xfc\x0a\x41\xbe\xbe\xeb\x87\x5f\xff\xa6\xe9\x87" - "\x5f\x12\xf9\x5a\x2e\x97\xf0\x4b\x94\x2f\xa3\x44\xbe\x8c\x01\xc8" - "\xd7\x00\xf3\x5a\x7f\xf0\xfc\xda\xef\x77\xfe\x8f\x2f\xbf\x4c\x21" - "\xc8\xd7\x17\xfd\xf0\xeb\x83\xe8\xbe\xfc\x32\x49\xe4\x0b\x7c\x8b" - "\x1e\x7e\x99\x44\xf9\x32\x49\xe4\xcb\x14\x80\x7c\x0d\x30\x9f\xf5" - "\x07\xcf\xaf\x7f\x1f\x70\xfe\x8f\x84\x5f\x21\xc8\xd7\xc7\xfd\xf0" - "\xeb\xdf\xcd\xfd\xf0\x4b\x2a\x5f\x07\x24\xfc\x12\xe5\xcb\x24\x91" - "\x2f\x53\x00\xf2\x35\xc0\x3c\xd6\x1f\x3c\xbf\xfe\xc3\xaf\xff\xe7" - "\xcb\xaf\xfa\x10\xe4\x2b\xb7\x1f\x7e\xd5\x66\xf5\xe5\x57\xbd\x44" - "\xbe\x34\xe3\xbc\xfc\xaa\x17\xe5\xab\x5e\x22\x5f\xf5\x01\xc8\xd7" - "\x00\xf3\x57\x7f\xf0\xfc\xfa\xd0\x6f\xff\xb7\x94\x5f\xdd\x7a\x8f" - "\x7f\xb8\xcf\x97\x5f\xe0\xaf\x47\xb5\xb1\xd8\xca\xc3\x2f\xff\xbe" - "\xe1\x5f\x62\x7b\x78\xf5\x95\xd7\x37\x14\xf8\x24\x8e\x53\x20\x7f" - "\xd0\x47\x44\x9f\xb0\x5b\xc7\x78\x84\x63\x80\x03\xfa\x85\x81\xac" - "\x7f\x0a\x81\x4f\x9e\xb8\x6a\xd8\xf9\x74\x38\x14\x3e\xfd\xa7\xdf" - "\xf5\x4f\xbe\x7c\xf2\xd8\xad\x40\xf9\xd4\x9f\xcd\xfa\x4f\x4b\x5f" - "\x3e\x99\x66\x7b\xf9\xc4\xec\x14\xda\x2e\xb4\x55\xbe\x7c\x1a\xc0" - "\x5e\x05\xb2\xfe\xe2\x07\xcf\xa7\x03\x7e\xf5\x5f\x19\xc7\xd7\xc0" - "\x55\x0b\x97\x01\x2e\xb3\x9b\x23\xd3\xab\x38\x5e\xc8\x8f\xfb\xfc" - "\x55\x15\xf4\x79\x3f\x92\x8e\x9c\xee\xc2\x3c\x40\xdb\x71\x98\xcf" - "\x53\x06\x2d\x26\x48\x3b\x83\x42\x96\x42\xaa\x58\xde\x51\x9e\xb2" - "\x14\xf9\x24\xc1\x53\x16\xb4\x29\x0f\x68\x6d\x88\xca\x4f\x18\x09" - "\xf9\xcd\xb4\xb8\x20\x11\xf2\x46\x08\x65\xe6\x87\x0b\xfb\x4b\x7b" - "\xf2\xba\x0b\x64\xb8\x3e\xdc\x10\x25\x83\xbc\xac\xcc\xd1\x62\x3e" - "\x15\x5f\x40\x04\x3b\xec\xe6\x38\xfc\x5e\xef\x7a\x8e\x11\xf3\xc5" - "\x4a\xeb\xa8\xc8\x4f\x10\xca\x13\xf3\x5c\x43\x47\xde\xf8\xb8\xd8" - "\x16\xb5\x34\x9f\x7b\x2a\xc1\x32\x3d\xf9\xe4\x62\x59\x93\x7c\xf2" - "\xbc\x46\x08\x9e\x47\x2b\xd4\x2f\x8b\x23\x62\xfd\x14\x98\xd7\x3d" - "\x26\x3f\xc6\x2d\x0b\x8f\xe3\x39\x12\xe7\xf3\x9b\x42\x22\xe4\x17" - "\xf3\x46\x0a\x79\x47\xae\x4c\x81\xbc\x93\x45\x9a\x87\x4b\x69\x2e" - "\xe6\x8b\xf2\xd0\x51\xfa\xce\x5d\xc0\x61\x59\xf8\x5e\x49\x47\x3e" - "\x9f\x0a\x6d\x98\xe2\xc9\xe7\xf9\x9e\x55\x43\x88\x90\x97\x23\x77" - "\x8b\x3c\xb9\x16\xda\x91\xe0\xc9\x87\xfb\x29\x78\xf2\xe6\xba\xc9" - "\xf5\xbb\xbd\xb4\x19\xeb\x2e\x2e\x38\xe2\xce\x0f\x7f\xbc\x77\x99" - "\x51\xf9\x32\x1b\xe6\x6b\x6c\x17\xca\x46\xfe\x95\x41\xfe\x1f\x89" - "\x34\x4a\x64\x3c\x51\xf6\xf0\xc4\xcd\xb9\xf0\x9d\xa1\x9a\xd5\x75" - "\x9c\x98\x6f\x46\xdf\x7c\xe1\xd2\x7c\x3f\x66\x74\x2c\x8d\x00\xda" - "\xcc\xee\x9b\x37\x42\x9a\xf7\x3a\x96\x77\x6b\x2d\xe4\x9d\xd3\x37" - "\xaf\x52\x9a\xf7\x27\x2c\x6f\xa1\x16\xf2\x26\xf7\x53\xd7\xb1\x92" - "\xbc\xd1\x2c\x6f\x91\x1a\xf2\xce\xef\x9b\x57\x25\xcd\x7b\x3d\xcb" - "\x5b\x86\x75\x48\xe9\x9b\x37\x41\x9a\xf7\x06\x96\xf7\x45\x1b\xe4" - "\x4d\xed\x9b\x37\x4f\x9a\xf7\xa7\x2c\xef\x4b\x15\x90\x57\xd3\x3b" - "\xef\x6e\xc6\xdb\x9b\x45\xde\xc6\xb0\xbc\xba\xd9\x90\x37\xad\x9f" - "\xb6\x85\x09\xe5\xb2\xbc\xe3\x59\xde\x17\x26\x43\x5e\x6d\x3f\xbc" - "\x90\xe6\x9d\xc0\xf2\x56\x87\x43\xde\x8c\x7e\x78\x21\xcd\x7b\x23" - "\xcb\x5b\xde\x06\x79\xb3\xfa\xe1\x85\x37\xef\x98\x3f\x6e\x87\x3c" - "\xd9\xd0\xce\xe6\x7e\x68\x2b\x2d\xf3\x26\x56\xe6\xbf\x3c\x0e\xf9" - "\xf3\xfa\xa1\xad\x34\xef\xcd\x2c\x6f\x45\x27\xe4\xdd\xda\x0f\x6d" - "\xa5\x79\x7f\xc6\xf2\xee\xdc\x0b\x79\x8b\xfa\xe6\x05\x79\x63\xf4" - "\xfd\x85\x48\xdf\x58\x96\xbf\x72\x0e\xe4\x2f\xe9\x87\xbe\x58\x9e" - "\x47\x66\x6f\x61\x79\x5f\xd6\x40\xde\xb2\x7e\xe8\x2b\xcd\x7b\x2b" - "\xcb\xfb\xa7\x76\xc8\xbb\xbd\x1f\xfa\x4a\xf3\xde\xc6\xf2\xbe\x8a" - "\x98\xac\xe8\x87\xbe\xd2\xbc\x6a\x96\xf7\x35\x33\xe4\xad\xec\xa7" - "\xbe\x37\x4b\xf2\x4e\x64\x79\xf7\x62\x7d\xf7\xf4\xc3\x0f\x69\xde" - "\xdb\x59\xde\xb7\xf2\x20\xef\xde\x7e\xf8\x21\xcd\xfb\x73\x96\xf7" - "\x0d\x94\xe3\x7d\xfd\xf0\xa3\x27\x2f\xd8\x85\x49\xee\x31\xff\x67" - "\xdf\x6e\xcc\x2f\x0b\x17\xe6\xb5\x52\x4e\xd8\xdf\x5f\xc8\x0b\x38" - "\x31\x88\xfa\xee\x0e\x56\xe6\x9b\x89\x90\x4f\xd8\xfb\x0d\xf3\x34" - "\x3a\x04\x7d\x04\xf6\xc5\x75\xcf\x6e\xaf\xee\xbe\x93\xe5\xdd\xfd" - "\x16\xe4\xdd\x2f\xd5\xa1\x94\x0b\x97\xe6\xbb\x8b\xe5\xfb\x10\x69" - "\x55\xeb\x9b\x2f\xc2\x9b\x6f\xcc\xbb\xfb\xe0\xfd\x81\xea\x5e\xfa" - "\x18\xea\x29\x2d\xeb\x6e\x56\xd6\x7b\xc9\x90\xd7\xe0\x9b\xcf\xf5" - "\x0b\x49\xbe\x5f\xb0\x7c\xff\x86\xb4\x31\xfa\xe6\x53\x49\xf3\xdd" - "\xc3\xf2\xfd\x27\xea\x2c\xb3\x6f\xbe\x04\x69\xbe\xc9\xee\xe2\xfd" - "\xb5\x42\xde\xfc\x70\x4b\x6f\xfa\x01\xad\x7f\x21\xb1\x69\xf7\xba" - "\x8b\xff\x5d\x23\xe6\x6d\xf6\xd0\x50\xa0\x33\xc3\x3c\x27\x62\xfe" - "\x3e\x77\x71\x6d\xb4\x98\xaf\x45\x6a\x07\x24\xb6\xf6\x7e\x3a\xe6" - "\x9d\x68\xd1\x8e\x0a\xfb\x8e\x82\x7e\x3f\xd2\x9f\xbf\xa1\xbd\x9d" - "\x5c\x73\x82\x33\x89\xb6\xc7\xb3\xa7\x7e\xbd\x30\x67\x8f\xaf\xd4" - "\x97\x25\x75\x52\x97\x34\xad\x94\xa3\xcd\x77\x75\x92\x70\xdc\x3f" - "\x89\x2a\x2c\xb5\x36\x48\xb7\x8f\xd7\xd7\x74\x15\x9b\x8e\xd8\x64" - "\x4b\x1f\xc7\xbd\x3c\xe0\xff\x76\x1b\x79\x43\xd8\xd7\xa3\xb4\x00" - "\xfc\x41\x2e\x41\x86\x7b\x30\xef\x86\xff\xf5\x70\x09\xfb\x1e\x6b" - "\x09\x47\x0b\x49\x82\x21\xd3\x45\x8e\x67\x11\x8e\xd7\x97\xcf\x56" - "\xa5\xe3\x7e\x22\xf5\xf7\xd2\x0d\x9a\x29\x50\x17\x2d\x7c\x37\xf5" - "\x18\x3c\x0b\x75\x81\xf6\x83\x6d\x4c\x33\xa4\xe3\x1e\x43\xf5\x2b" - "\xec\x8a\x46\x2d\x7d\x61\xde\x37\xda\x1c\x72\xe3\x09\xae\x5e\x73" - "\x06\x74\xc3\x99\x0d\x9a\x47\xb0\x0c\x5e\x51\x9e\x06\x79\xf6\xe1" - "\x5e\x24\xb4\xa2\x69\x36\xdb\xa7\xa4\xfe\x23\xa1\xfe\x05\xb4\x99" - "\xc6\xe8\xf3\xf8\xee\xad\x79\x78\x7e\x83\x21\xe7\x04\x39\x26\x79" - "\x67\xbf\xbe\x49\xd8\xc3\x04\xdb\x05\x6d\xcc\xeb\x2a\xae\xdf\x6f" - "\x93\x4d\xd7\xb2\x3d\x4a\xea\xfd\x9e\x0f\x0a\xbe\x75\x14\xd5\x95" - "\x17\x41\xfe\x36\x1b\xf7\x91\x92\xd1\xa1\xde\x6e\x93\x4d\x29\x11" - "\xff\x77\xd9\x64\x8f\x9a\xd9\xff\x0d\x11\x36\xd9\xbc\xbd\xe2\xff" - "\xe3\x3c\x7b\xaf\xf4\xbf\x17\x4c\xf9\x7c\x68\x77\x06\xbf\x2b\x39" - "\x02\xfd\x51\xdc\x97\x8d\x2a\xca\xe7\xab\x26\xe0\x79\x1d\x0d\x6f" - "\xc1\x37\x33\xd8\x7e\x9a\x0d\x6b\xe1\x1e\x25\xde\xed\xe2\x9d\x62" - "\x1e\x81\xb7\x31\xa5\x84\x96\x34\x24\x62\x9b\x73\xdc\x94\x87\x72" - "\x2b\x68\x11\xad\xb5\x66\xb5\x13\xb6\x0f\x75\x43\x15\x11\xf6\xc5" - "\x01\xba\x02\xed\xe9\x68\x5a\x2b\x7c\x4b\xd7\xa8\x95\xd6\x2b\xee" - "\xee\x5f\xdc\x33\xf9\xde\xfb\xee\x8f\x7f\x60\xd1\xe2\x25\xa9\x4b" - "\x97\x2d\xd7\xac\x78\x7e\x65\xda\xaa\xd5\x6b\xb4\x6b\xd3\xd7\x65" - "\xac\xcf\xdc\x90\xb5\x71\x13\x0e\x56\xf7\xd4\x7f\xd7\xe3\xb2\x4e" - "\x8e\xc0\x37\xa6\xc2\x37\xcc\x0a\xa1\x2e\x90\xc6\x78\xd2\xe0\x0a" - "\x57\xf5\x4f\x4f\x6b\x34\x21\xb8\x27\x73\x07\x67\x7e\x06\xf7\x87" - "\x06\xfe\xcb\xac\x95\xbf\x32\xe0\xf9\x02\x6d\x9c\x79\x46\x93\xfd" - "\x57\x06\x3c\xdf\xa2\x2e\xba\x9d\xc4\xde\x8c\x67\x10\x98\xe3\xf1" - "\xfd\xee\x5b\x09\x31\xc2\x6f\xfb\x2b\xf3\x66\x25\x89\x2e\xbf\x8e" - "\xda\xb7\x5f\x47\x3b\xb0\xfc\xed\xaf\xd0\x76\xfb\x66\x0d\xd1\xc3" - "\x33\xe0\x46\x79\x9c\x3b\xa8\xa8\x03\x6f\x17\xfc\xd8\x98\xea\x57" - "\x68\xdb\xd6\xeb\x68\xdb\x0b\xaf\xd0\x8e\xdd\xd7\x51\x5b\xec\x76" - "\x22\xef\x2a\x36\x1b\x6c\x9c\x39\x5a\xc0\x35\xbc\xe7\xc7\x34\xd4" - "\x96\xc2\xbb\xbb\x5c\x24\x6c\x37\x3c\x43\x5a\x67\x9d\x8a\xd5\xfb" - "\xdd\xd3\x8e\x11\xd0\xde\xbd\xd4\x99\x26\xd3\xc3\x77\x18\x8f\x0e" - "\xde\x6d\x04\x0b\x0c\xdf\xb3\x5b\x1d\xc7\x00\x63\x07\xe3\x70\xdf" - "\x75\xf8\x5e\x94\xb5\xa2\x83\x60\x79\xef\xa4\x3b\x46\xac\xbb\x81" - "\xba\x20\xaf\x92\xdf\x9c\x26\x83\xef\x75\x40\xd9\x9d\xd2\xf6\xa8" - "\x97\xad\xca\x50\xad\x5e\x9f\x96\x36\x71\x0c\x51\x0b\x77\x9f\xb3" - "\x31\x32\xa0\x3c\x52\xfe\x0a\x35\x42\x3b\x0d\xd0\x5e\x73\x23\x78" - "\xdc\x80\x17\x02\x6d\x2a\x83\x72\xb7\x41\xfa\x01\xf8\xff\x00\xd4" - "\xdd\xcc\xce\x53\xf8\xfb\x7b\xb4\xf8\xe0\x14\xa8\x27\xea\x7c\x15" - "\xee\x55\x75\x66\xc3\x1c\x19\xb4\x7b\x3b\xe4\x33\xab\x6e\x20\xb7" - "\x1c\xe7\x0e\x29\xa0\x1e\x7b\xe1\x7f\xcc\xff\x21\xf2\x11\xf2\x1b" - "\x59\xbb\xfe\x2e\x9c\x9d\x03\xb4\x32\x54\x5d\x47\x4b\xba\x8a\x0f" - "\xb6\xe3\x5e\x76\xc2\x1e\xdf\xf0\x0c\x74\x31\x43\xde\xb2\x33\xb9" - "\x73\x64\x10\x7b\xc9\x76\xf7\x94\x79\xb0\x16\xeb\x84\xf5\xc0\xf8" - "\xef\x53\xf0\xbc\x78\x67\x32\xb9\xc3\x41\x64\x9f\xb6\x11\x52\xf9" - "\x0a\xdd\x03\x57\x25\x5c\x15\x87\xe0\xdd\x41\xb8\xcc\x90\x6e\x81" - "\xfb\x21\xb8\x1f\x6c\x13\xc6\xeb\xa2\xb1\xde\xeb\xb2\x69\xfb\x5d" - "\x15\xe4\x67\x58\x3e\x60\xeb\x77\xc7\xb8\xbf\x47\x60\xdd\x71\xdf" - "\x48\x3a\xe6\x50\xb6\xef\xfe\x7a\x9f\xda\x09\xbc\xff\xff\xed\x1d" - "\x0f\x5c\x55\xd5\xf9\xbb\xd7\x87\x01\x51\xa0\xbd\x8c\xcc\xf4\x6a" - "\xb8\xd1\x86\xf8\x30\x33\x35\x4d\x2c\x6b\xb4\xa8\xdc\xe6\x9a\x95" - "\x35\x48\x34\x29\x45\x42\x53\x52\x14\x44\xdd\x1c\x33\x79\x2a\x92" - "\x2d\xe3\xbd\x12\x9b\x6d\x6c\xd9\xc2\x46\x9b\x35\xcc\xd7\x02\xe5" - "\xaf\xfc\x7b\xe8\x43\x9e\x8e\x1a\xa6\x19\x09\x09\x0a\x72\xf7\x7d" - "\xe7\x9c\xcb\xbb\xef\x81\x86\x96\xf5\xfb\xed\xc7\xd1\xcb\xbd\xe7" - "\x3b\xe7\x7c\xff\xcf\x77\xbe\x7b\xe0\x77\x0f\xc8\x45\x06\x7e\xd7" - "\x5f\x45\x91\x78\xcd\x17\xcf\xb9\xd8\xd7\x21\x9e\x0b\xf0\xaa\xfc" - "\xfa\xcb\x13\xdf\x85\xae\xe2\xf0\xde\xf7\xed\xd5\x95\xd4\xbb\x7e" - "\x25\x6d\x20\x97\x4f\xc7\x6b\x9d\x3b\xbc\x3c\x8a\xc3\xaa\x43\x78" - "\xbd\x7a\xbc\xb8\xc7\x80\x5c\x83\x7a\xaa\x41\xfc\x35\x56\x0e\xab" - "\xc9\x01\xb9\x16\xdf\xfe\x0f\x81\x07\x7d\xc2\x99\x41\xf6\x6c\x4f" - "\xc5\x98\x8d\xb6\x74\xca\xfb\x23\xc9\x46\xe9\xdc\xb7\xa4\x4e\x95" - "\xc1\x22\xd0\xb7\xb6\xb9\xfc\xa7\x68\xb2\xbb\xff\x14\x05\x7b\xf8" - "\x8f\x99\x62\x11\xce\x97\x0c\x0b\xf7\x97\x3d\xcd\xcb\x63\xb0\x5e" - "\x14\x82\x78\xf6\x28\x4f\x32\x1c\x2c\x47\x4a\xff\x0c\xe0\x9a\x79" - "\x60\xa0\xf8\x72\x52\x2e\x5a\x41\x3e\x4b\xb4\x05\x5d\xce\x0b\xf2" - "\x87\x30\x2b\xf1\xb7\x10\xf1\x62\x3d\x1b\xfb\x59\x4b\xe1\xb4\xc6" - "\x1b\x1b\x93\xf6\x0c\xfa\xa3\xe0\x97\x70\xd2\x38\xd5\x25\x57\x04" - "\x8d\xe1\xb4\x8b\xc3\x10\x4e\xef\x96\x90\xfc\x25\xf4\xa3\xbf\x6d" - "\x26\x9f\xa4\x7b\x69\x87\x09\xe7\x52\x04\x74\xb6\xce\x84\xd1\x81" - "\x60\xc2\xf9\xe6\x73\x4c\x2e\x36\x86\x26\x81\x89\xf0\x51\x4c\x47" - "\x39\xec\x16\x9a\x8b\x1c\x97\x38\xff\x63\x7f\xc4\xfe\x78\x60\x74" - "\xb2\x88\x1f\x6c\xd7\xd1\xcd\xa0\xf7\xc8\xf4\x65\x5c\x56\xa4\x95" - "\x8d\xe3\x77\x91\xec\xa4\x4f\x6c\xcf\x43\x3c\xf1\xd4\xc6\xbe\xbd" - "\xcd\xe5\xc9\xa6\xef\xb3\x92\x3e\xa8\x3f\x9d\xd7\xc2\xbf\xd7\x57" - "\xb8\x85\xe9\x0d\xc7\x93\x3d\x54\xa4\x41\x38\x92\x3b\xd4\x0e\x15" - "\xe3\xd1\xf6\x65\x6d\xb8\xf6\x97\x1c\x77\xb7\x4f\x71\x81\xde\x3e" - "\x38\x6e\x17\x8e\xb7\xa9\x28\x23\xc5\x13\xa4\xe9\x4f\xeb\x3d\xc2" - "\xcc\x9d\x69\x88\x63\x49\x1b\xdb\x4b\x41\x3c\xb5\xc8\x8b\x99\xf0" - "\x20\x3f\x36\x8e\xab\xc4\xb8\x37\xc9\xdd\xd6\x02\x5f\x36\xd9\x9c" - "\xcd\xe7\x65\x4c\x26\x8c\x5d\x25\x6f\x66\xf1\xb6\x3c\xec\x93\xa7" - "\xb6\x47\x00\x7d\xef\x94\xaf\x25\xac\x2d\x37\xf9\x2c\xb3\xaf\x8d" - "\xc7\xb5\x92\xc2\x45\x2b\xd4\x46\x17\xdf\x25\x29\xda\x37\x63\x05" - "\xdf\xb9\x44\x4f\x5d\x3a\x8b\xad\xab\x44\x83\xc6\x0b\x7c\xb3\x08" - "\x9f\xa6\xab\x50\xe4\x83\xeb\xab\xd8\x8c\xf0\x6c\xf2\x45\xa6\x37" - "\x8c\xa3\xcd\xc9\xe4\x8b\x25\x6b\x70\xfc\x9e\x0d\x54\x5f\xca\xea" - "\x81\x2c\xc6\x76\xb5\x17\x17\x51\x7b\x29\xbe\xa3\xa7\x3f\x8b\xbe" - "\xd4\x09\x70\x8b\x11\x4c\x2d\xa9\x4c\xb6\x9c\x96\xe5\xd3\xa4\x7d" - "\x1d\x00\xc4\x27\xea\x28\xaf\x35\xad\x34\x04\x63\x3f\xfb\xde\x3f" - "\xc6\xeb\x5c\x75\xfb\x4c\x20\x9e\x31\x9e\x09\xfe\x4a\x5f\x15\xb6" - "\xcf\x25\x19\x49\x9f\xa1\x3c\xf6\x61\x5b\xf9\x54\xe2\xdd\x25\x77" - "\x69\xa2\x5e\xc7\x4c\x6e\xb4\x03\xd9\x8b\xec\xa2\xc3\x49\xbe\x6f" - "\x46\x5c\x39\xbc\xce\x7d\x83\x74\x6d\x1e\xa4\x16\x51\x7f\x57\xdf" - "\xb2\xb7\xa9\x6d\x25\xd2\x1e\x1d\x8f\x6b\x3a\xce\x0b\xfa\xee\x2f" - "\xe2\xcd\xa1\xb3\x78\x10\x07\xcb\x1f\x90\x17\x2f\xf2\x47\xac\x17" - "\x89\x71\x74\x9e\x41\x08\x5e\x93\x5c\xf3\xbf\xec\x2b\x77\xff\x2a" - "\xf3\x9c\xff\x64\x6f\x73\x67\x72\x04\x30\x7f\x48\x00\xe5\x94\x5c" - "\xb6\x51\xac\x1d\xc2\xd6\x65\x9f\xec\xc3\xf9\xa2\xc3\x31\xdf\xc3" - "\xd6\x79\xcc\x1f\x97\x46\xd2\x59\xc6\x12\x8e\xcd\x13\x78\x98\xcc" - "\xcc\x9f\x52\x99\x0f\x14\xa9\x4b\x51\xce\x2e\x3f\x28\x2d\x10\x76" - "\x2e\xf2\xd0\x89\x16\xbb\x8c\x74\x3e\x03\xc5\xa4\xd6\x54\xb8\xab" - "\xb5\xdd\x15\x97\xc8\xf6\x9d\xcc\xf6\x65\xf1\x16\xbe\xde\x8a\xb8" - "\x55\xc6\xdb\x07\xb9\xf9\x30\xf1\xb2\x83\xf9\x2f\xf1\x92\x3c\x8b" - "\x78\xc9\x63\x7c\x24\x2b\x70\x4a\x2e\x1f\x42\xf4\x71\xec\x4e\x31" - "\x5f\x05\xae\xd2\x24\xc2\xb5\x1a\x63\x15\xf1\x84\xb4\xbd\x59\xfc" - "\xbb\x8f\xf9\xc1\x0a\xc1\x7b\x41\x5b\x2a\x8d\x2d\x8a\x3f\x2b\xb3" - "\xb1\x05\x4e\xf9\x40\x43\x1b\xff\x86\xb3\x2f\x8e\xdf\xa9\x3c\x45" - "\xfd\xab\x1c\x14\xa3\x95\xc7\xd8\xf3\x47\xca\x23\xe8\xab\x9f\x81" - "\x01\xf1\x79\x93\x8f\x6a\x7e\x71\x52\xae\xda\x8d\x39\x06\xd9\x2b" - "\x07\x73\xa4\x9d\xa4\x6f\xf2\x65\xcc\x91\xc6\xb6\xa6\x95\x37\x68" - "\x7e\x8b\x74\xb6\x91\xee\xb9\x7d\x0e\xde\x8a\x7e\x9c\xe7\xf2\xad" - "\x83\xb7\x0a\x3d\xee\x44\x3d\x7a\x23\xbd\x37\x85\x5c\x3b\xb1\x3f" - "\xe6\x62\x55\x2f\x0b\xde\xb7\x8a\xfe\xf7\x6a\x76\x10\x73\xb5\x68" - "\x03\xc5\x5f\x66\x83\x83\x0e\x31\x36\x5b\xd0\xaa\xd3\xfa\x52\x8e" - "\xc8\xbf\xcd\x7e\xb0\x8e\xe2\xe0\x68\xb4\x3d\x8b\x7d\xec\x9c\x2a" - "\x0e\xa3\xb9\xc3\x69\x54\xad\x65\x7e\x88\x79\x8f\xcb\x8f\x0e\xe6" - "\x7a\xc4\x27\x8a\xc5\xe6\x12\xc4\x41\xf1\x94\x7c\x89\x62\x2a\xbd" - "\x47\x20\xbe\xf5\x62\xfe\x08\x9e\x2b\x86\xbb\xfb\x4a\xd5\x73\xe8" - "\x2b\xa3\x5c\xb8\x2b\x02\x7a\x5a\xe7\x2c\x3c\x06\x6e\xe3\x63\x2a" - "\xa2\x85\x6c\x39\x5c\x36\x51\x27\xbd\xad\x64\x7a\x1b\xa9\xd3\x23" - "\xea\xad\x72\xa3\xe8\x9f\x47\xb1\xdc\x35\x5f\x2b\x8a\xb5\xb9\xdc" - "\x3d\x5e\x54\xae\xa2\xf9\xa0\xe3\x6b\xa7\x47\xbc\xc8\xeb\x39\x5e" - "\x54\x24\x0a\x79\xad\x1e\x73\x23\x5b\xe4\xbb\x5b\x34\x3b\x94\xb4" - "\x9c\x13\xdf\x21\x2f\xdc\x42\xf1\x93\x68\xeb\xd7\xa0\x2c\xae\x57" - "\x31\x97\x2b\x17\x74\xb7\x43\xe5\x24\xfd\x7c\x26\x5b\x53\x4c\x20" - "\x1c\x64\x53\x96\x57\x22\x8c\xdb\xb5\xd2\x48\xb1\x41\x1f\xa3\xb1" - "\x6f\x46\xa7\x4a\xf3\xa5\x32\xdc\x7d\x2e\x56\xe4\x88\xb9\x28\x68" - "\x57\x0d\x40\x1b\x99\x74\x74\x73\x3d\xe8\x92\x6d\x6c\xa4\x07\x2e" - "\x63\xe5\x79\x6d\x4d\xa3\xfe\x38\x36\x11\xc7\x34\x7a\xac\x8f\x66" - "\xe2\x0f\x69\x45\xb1\x98\x95\xc9\x62\x45\x62\x2b\xe7\xe7\xa4\x45" - "\xac\x13\x08\x33\x09\x58\x9e\x58\x4b\x34\xbf\x79\xc2\x9d\xa7\xaa" - "\x88\x9e\xf3\xa3\x8a\x28\x2d\x3f\x62\xb8\x58\x2c\xaa\x8a\x14\xf2" - "\x11\x6c\x14\x87\x55\x18\x09\xb6\x81\xeb\x21\x43\x65\xeb\xd5\xc1" - "\x3c\xb1\x5e\xd1\xfc\x92\xb1\x1e\x4c\x73\x8c\xea\x88\xc3\x4a\xf8" - "\x4b\x53\xce\xd1\x3b\xc4\x56\xa7\x5c\x6e\xa3\x78\x40\xf1\x42\x99" - "\xcb\xe3\x86\xf2\x10\xbb\x7f\x4e\x71\x87\xf2\x10\x6a\xc7\x7e\xb9" - "\x14\x8b\x3e\x95\xab\x25\x3a\xd3\x48\x3d\xe1\x8d\x78\xab\x1a\xf8" - "\xd8\xea\xeb\x59\xae\x70\x22\xa2\x9f\x06\xd3\xc6\x61\xdc\xfa\x88" - "\xc6\xd1\x78\x2d\x7e\x51\xec\xea\xa0\xd8\xc4\xe8\x55\x3f\x2a\x7c" - "\x9c\xbd\x37\x68\x79\x51\xbb\xac\xeb\x4b\xdf\x82\x66\x31\xad\x3a" - "\x9b\xc7\xb3\xea\x2d\x34\x96\xd9\x0f\x63\xe5\xca\xb3\xea\x51\x4b" - "\x02\x18\xb2\x4e\x53\x5c\x2c\xcc\x10\x7c\x36\x71\x39\xaa\xdf\x63" - "\x72\xf0\x98\x6a\xe6\xbc\x14\x66\x64\x9d\x63\x6d\x55\x24\x0b\xb5" - "\xa5\xeb\xda\xd4\xf6\x60\x6a\x63\xe7\xde\x79\x8e\xeb\x6c\x9f\xd7" - "\xad\x3f\x9d\xd1\x85\x31\x94\xde\x51\x44\xec\xad\x89\xe7\x7c\xd6" - "\x8c\xd2\xe2\x2e\xea\x65\x0f\xc5\x5e\xd6\x36\x57\xf4\x79\x48\xdc" - "\x59\x7c\xaf\x79\x82\xeb\x35\x50\x16\xfa\xb6\x71\x39\x6a\xd8\x77" - "\x62\xd5\x13\x33\x51\xb7\x35\x33\x34\xdd\xea\x9f\x69\xfe\x20\xfd" - "\x00\xaa\x33\xbf\x4f\x62\xef\xb0\xdb\xa8\x0f\xf1\xc4\xd7\x88\xea" - "\x48\xcf\x9c\xfa\x53\xb9\xf6\x38\xad\x4b\x3c\x57\xad\x2d\x14\x7b" - "\x33\x90\x9f\xf0\x3a\xae\x0b\x76\xa3\x16\x63\xd4\xd6\x08\x7c\xe7" - "\x3f\x86\x7d\xec\xec\x7c\x2b\xfa\x7e\xb0\xbe\x0f\xc5\xa7\xb7\xce" - "\x39\x05\xce\x9a\x26\x2d\x6e\x50\x2c\x29\x69\x39\x26\x72\x3a\xbb" - "\x35\x4b\xc4\x92\x53\xb2\xfd\x35\xf7\x3c\xcc\xfe\x9a\x7b\xcc\xa8" - "\xdd\xed\x19\x33\x30\x6f\x5e\xd3\x9a\x66\x5f\xec\x96\x07\x20\xec" - "\xe2\xb1\xc3\x1e\x41\x73\x94\xce\x64\x60\xf1\x89\xed\x37\xd5\xfa" - "\x68\x3c\x53\xdc\x6c\x5e\xae\xed\x5f\xd4\xee\xa0\x5c\xcd\x83\x5e" - "\x83\x5b\xec\x24\x7a\x1a\x3e\x03\xd0\x37\xfd\x51\x0f\xb4\xdf\x62" - "\xcf\x15\x71\xde\xea\x16\x2b\xc5\x1a\x46\x71\xd2\x7d\xad\x2a\xdc" - "\xe2\xbe\x56\xd5\x6e\xec\x1e\x23\x6b\xa3\x7a\xbf\x56\xd5\x8e\xa7" - "\xb8\xa5\xc5\x48\xf7\x58\x50\x1b\x93\xe5\x96\xcb\xda\x4f\x6a\xb9" - "\xac\x2b\x8e\xda\x93\x28\x46\x21\xfd\x3c\x41\xdb\xe1\x94\x3f\x76" - "\x6a\xb4\xb1\xdd\x58\xa2\xa0\x6f\xa6\x15\x46\xa0\x4f\xe5\x8b\x1c" - "\x90\xcd\xcd\x73\xec\xbb\xea\x35\xde\xe8\x7f\xbe\xe4\x67\xf9\x71" - "\xa7\xa1\xc1\xb5\x56\xd8\x9a\x17\x6a\xfa\x3d\xb4\x40\x9f\x17\xbe" - "\x9a\xa9\xae\x6b\x4d\x3b\x34\x4d\x2f\xe3\x8b\x08\x4b\x17\x7b\x08" - "\x4c\xb7\x0c\xd7\xa1\x40\x4b\xa6\xbb\x6c\x5c\x8e\x43\x91\x24\x07" - "\xbd\x13\x21\x7d\x3f\xca\x7b\x30\xe7\xc3\xe7\x72\xb3\xa5\xcb\xe7" - "\x0f\x34\x9c\x4d\xd5\xe7\x57\x85\xb4\xff\xb3\x47\xbc\x7b\x16\x60" - "\xbe\x63\xd6\xef\xc5\x3c\x78\xcf\x74\x25\x3e\x21\x36\x6e\xf1\xdc" - "\x31\x4a\x6c\x5c\xec\xe2\xd8\xe8\xf9\xb1\xcb\xa2\x17\xc7\x2e\x8c" - "\x0b\x59\x10\xfd\x74\xec\x6c\x65\x69\xf4\x22\xc5\x94\x38\x32\xd1" - "\x17\x5c\x5d\x27\x2a\xd1\x8b\x16\x3d\xbf\x60\x4e\x8c\x12\x17\x3b" - "\x7b\x54\xc2\x9c\x45\x73\x16\x2b\xd1\x09\x0b\x9f\x8f\x8b\x51\x46" - "\xc6\x84\x8e\x34\x8d\x8b\xf1\xd5\xef\xa1\x8d\x08\x80\x93\x9d\x67" - "\x1a\x1b\xd3\xcf\x80\xb7\xbf\x14\x9f\xe0\x9f\x18\x1b\xc7\xf7\xec" - "\x0e\xef\x1e\x9d\x01\xf1\x74\x46\x24\x9d\x2f\xa6\xa6\x1d\x2a\xc0" - "\xbb\x81\xfa\xa1\x9c\x0a\x3e\x7b\x23\xef\x43\x5a\xd3\x0e\x27\x3a" - "\xe5\xfa\x28\x76\x76\x18\xc2\x51\xb6\x21\xea\x99\x82\x46\xcc\xd9" - "\xe2\xe9\x6f\x88\x2d\x67\xc0\x68\x5e\x02\x06\xbc\xfc\xf0\x0a\xa0" - "\x33\x24\x71\x0c\xc6\x13\x47\x01\xdf\xf7\x74\x44\x36\xf9\x9c\x37" - "\xaa\xeb\xce\x1b\xb9\x5d\x1c\xf7\x6b\x7b\xc1\x0f\xaf\x85\x87\xc9" - "\x3f\x8f\xc9\x0e\xf6\x7b\xc6\xd5\xe8\xcb\xb4\x8f\xda\xfc\xc1\xdd" - "\xe1\x98\x0f\x3a\xf2\x07\xb3\xb6\xfb\x5b\x64\xf0\x43\xbe\x0c\xfb" - "\x92\x4c\xb0\x19\x69\x2d\x0a\x54\xd5\xd6\x34\x47\x80\xb6\x9f\x86" - "\x32\x04\xa0\x2c\x76\x21\x47\x33\x93\x23\x53\x0d\xca\x18\x88\xfc" - "\x6d\x22\x7e\x1c\x93\x34\x19\x90\x6f\xbb\x53\x3e\x6c\x45\x3e\x03" - "\x88\xaf\x9e\xf6\xfa\x68\xbf\x0b\xf9\x5c\xdb\xb9\x04\xf5\x36\x94" - "\x9f\x29\x91\x9e\xc5\xe7\x1f\xca\xb3\xc7\x82\xcf\x1b\x4e\x83\xdf" - "\x8b\x74\xbe\x5f\xea\x30\xb5\xb8\xa5\x03\x4a\xe7\xd9\xc1\xff\x05" - "\xb5\x49\x7d\xb7\xb1\x51\xc8\xb4\x8b\x62\xc3\x3b\xcf\xd8\x0d\x24" - "\x13\xae\x15\x7e\x96\xd3\x17\xdc\x5b\x34\x6c\x1e\xa4\xb6\xa8\xaf" - "\xe8\x73\xae\xba\x1b\x49\x27\x94\x6f\x35\xa7\xd2\x19\x72\x75\x18" - "\x83\x1d\x33\x45\x6e\xdc\xa2\xb6\xcf\xd2\xe5\x52\x0e\xf2\xb3\x96" - "\x0b\xe0\xf6\xd6\x70\xd3\x59\x82\x34\x86\xdb\xbf\x6e\x2d\x8e\x69" - "\xd2\xe1\x8f\xf2\xc4\x4f\x38\xf1\xb9\x49\xa3\xc3\xdf\xc3\xeb\x28" - "\x27\x68\x42\x5f\x6e\xba\x00\xbd\xa0\x4d\x99\x6a\x65\x29\xc2\xd3" - "\xcf\x82\x01\xfb\x56\x5a\x32\x19\xfe\x7c\xd4\x7b\x10\xe1\x5f\x3d" - "\x08\x60\x0d\xf6\x69\x4e\x73\xcc\x6c\x61\xe7\xfa\xd5\xe1\xfc\x2f" - "\x9c\xee\xb9\x8f\x2d\xfc\x79\xa2\x87\x3f\x87\x6f\xa2\x9c\x10\x67" - "\x27\xf9\x50\xfa\x57\xb8\x0e\x63\x3d\x34\x03\x82\x89\x0e\x3e\x97" - "\xd1\x7e\x48\x6b\xda\x11\x93\x46\x4f\x45\xff\xdf\xd0\xc9\xf7\x60" - "\x84\x6f\x85\xd0\xde\x75\x72\xa2\xaa\xee\xc3\xf8\x4e\x3c\x92\x8f" - "\xe1\x98\x18\xcd\xa7\xd0\xd7\x2b\x99\x5f\x19\x21\x58\x4d\xab\x6b" - "\xb4\x0c\xc4\x7e\xe8\x57\x59\xe8\x4f\xe4\x57\xd8\xd7\xac\xf9\x14" - "\xfa\x5a\x19\xf5\x43\x1e\x7c\x77\x2d\x0b\x37\x50\x8c\x6c\x90\xeb" - "\xbd\xc8\xc7\xd4\x97\x1e\xb0\xab\x37\x3c\x6e\xe7\x76\xaa\xf7\x2a" - "\x6d\xe3\x36\x70\xe9\xfd\x88\x5d\xa7\xf7\x32\xf4\x63\x5f\xd2\x33" - "\xdf\xab\xae\xf7\x42\xde\xca\x58\x2e\xbe\x02\x6d\xc0\xd6\xaa\x23" - "\x36\x1a\x2f\x74\x58\xe4\xd2\x61\xbd\xd2\x93\x0e\x3d\x74\x67\xe0" - "\xe7\x0a\xd6\x87\xd0\x5c\xc1\x31\x5d\xe7\xbf\xf6\x64\x4b\xa4\x61" - "\x30\x64\x80\x37\xd1\xb0\x19\x59\xff\x35\x1a\x8d\x74\xd4\x75\x53" - "\xf2\xbc\x8b\xfa\xb3\xcd\x0a\x40\x7b\xe2\x34\x3e\xc8\x48\xfa\xad" - "\xb7\xb9\xc6\xab\x2d\x9e\xe3\x47\xce\x76\xe3\x95\x5d\xc8\xab\x7d" - "\xf3\x40\xf4\x23\xc6\xaf\xd3\x70\x31\x7e\x83\x14\xbe\x4e\xe6\x8f" - "\x20\xff\x76\x4e\x2e\xdd\x0a\x40\x30\x51\x0f\x69\xc6\xb5\xc7\x73" - "\x7f\xff\xc2\xbf\x6f\x70\xae\x70\xff\x7d\x83\x73\xfe\x85\x7e\xdf" - "\xe0\x41\xf7\x3d\xa2\xdb\x69\x99\x21\xe9\x68\x67\x77\xf6\x40\x5b" - "\x1b\x1f\x6a\xd5\xbf\xcf\x1c\xf5\x21\x1e\x4a\xe8\xec\xf5\x9b\x66" - "\x48\x2a\xe2\xb1\xb1\x35\xfc\xa8\x37\xcf\x5f\x28\x2f\x72\x36\x52" - "\x1f\x4f\x39\xba\x8a\xb7\x71\x2f\xdd\xce\xb2\x8a\xd7\x7d\x40\x7f" - "\xf1\x0f\xe3\x9a\xb4\x66\xd9\xad\x33\xa8\x3d\x54\xfc\x00\xee\x60" - "\xfd\x55\x2c\x1c\x24\xea\x1c\x8b\xa1\xab\x7f\x57\xfb\x37\x28\x3e" - "\x9c\x5f\x86\xaf\x0d\x24\xfe\x34\x3e\x40\xd7\x63\xda\x45\x46\xab" - "\xa0\x0d\xe9\xa9\x50\x36\x9b\x32\xc3\x0b\xf1\x99\x58\x67\x55\xed" - "\x10\xf8\xb5\xba\xaa\xaf\x13\xc4\xbd\x8e\xa5\xdf\x2c\x1d\x81\x61" - "\xfd\x62\xd8\x9f\x2a\xdd\x19\xd3\x05\x92\xad\x7a\x5e\x51\xdd\x29" - "\x5e\xec\xc1\x9f\x7e\xb4\x21\xbe\x60\x6c\x1f\x3f\xbd\xab\xc3\x75" - "\x2d\xab\x74\xdd\x0f\x70\xf6\x27\x58\x2f\x22\xe3\xa5\x96\xa1\xba" - "\xe7\x61\xfc\x36\x21\xea\x5b\xc4\x7f\xf1\xa2\x94\xf9\x68\x8f\x2e" - "\xf7\x98\xd0\xd0\x53\x57\x97\xfe\x27\x6a\x36\x56\xf5\x1e\xea\x6a" - "\x9f\x9c\xef\x5e\x9f\x62\x76\xaf\x4f\x75\x7e\x0b\x9c\x03\x23\x92" - "\xec\x1c\x00\x10\x9e\xd3\x05\xf4\xf7\x98\x32\xfe\x66\x8f\x29\xe4" - "\x2a\x82\x9b\x7e\x00\x77\x8f\xd5\x81\x0d\x3d\xf7\xbe\x32\x65\xf0" - "\x2a\x31\x21\x86\x35\x05\x74\x6b\x9c\xe2\x01\xa3\x7a\x7f\x45\xc0" - "\xc2\xf6\x76\xeb\xcf\x60\x8a\xae\x2e\x85\xe3\x0f\x2b\xfa\x7f\x53" - "\xf7\xbe\x7d\xa5\xaf\xf4\xa2\x48\x34\x3f\xfa\xca\x15\x2a\x2a\x5f" - "\xc5\x31\x12\xb1\x1b\xfd\x53\xbb\x02\xa5\x2a\x1a\x54\x01\x50\xc5" - "\xc3\xb7\xb2\x8e\xf7\x95\xbe\xd2\x57\xfa\x4a\x5f\xe9\x2b\x7d\xe5" - "\xff\xa0\x48\xfa\x17\x6b\x3a\x3f\xe4\x2a\x71\xd7\xbf\xff\x48\xe2" - "\xd2\xc3\xe4\x6f\x32\x4e\x15\x05\x52\xc2\xf3\x15\x6b\x94\x33\xc0" - "\x3c\xbd\xcc\xb4\x2b\xbe\xc9\x7b\x5d\x44\x41\xf0\xce\x79\x8d\x81" - "\x5b\x67\xda\xc7\xe7\x25\xb6\x19\xd6\x4c\xb3\x05\x65\xc7\x34\x18" - "\x33\x66\x54\x8e\xcd\x5d\xdc\xe2\xb7\x3e\xb2\x28\x24\x67\xfe\xc9" - "\x21\xdb\x66\x39\x26\xed\x49\xea\x90\x53\xef\xfe\x70\xc4\xeb\x4f" - "\x1d\x1b\xb8\xe9\xe7\x07\xc7\xfc\x2d\xe1\xb4\x6f\xda\x4f\xf7\xff" - "\xe8\x4f\xcf\x7c\x36\xf8\x0f\x8f\x1d\x9a\xf8\x8f\x65\xe7\xfa\xff" - "\xe6\xbe\x7f\xff\xe0\x8d\xb9\x9f\x0e\xca\x7c\xa4\x7a\xdc\xbb\x4b" - "\xce\x5c\xbb\xe1\xa1\x92\xd0\xbf\xc6\x9d\x1a\x9a\xf5\xe4\x91\xbb" - "\x3e\x58\xd9\x29\xad\x9a\xba\x77\xf8\x6b\xd1\x47\x07\x6c\xfc\x59" - "\x79\xd8\xdb\xcf\x7d\xe9\xf3\xbb\xfb\x0b\x6f\x7d\x33\xf6\xf8\x8d" - "\x2f\x3f\x5a\x3b\xe1\xbd\x17\xce\x7a\xad\xbd\xf7\xa3\x91\x3b\xe6" - "\x7c\x72\xfd\x96\x5f\x56\xdd\xbe\xfb\xf9\xaf\xae\x79\xf1\xc1\xe2" - "\x51\x7f\x59\xf0\xf9\xcd\xaf\x3e\x51\x37\xf9\xfd\x15\xe7\xfb\xad" - "\xbe\x67\xdf\x2d\xdb\x67\xff\xe7\xba\xcd\xbf\xa8\xb8\xed\x9d\x45" - "\xcd\x57\xff\xfe\x81\x03\x3f\xfe\xf3\xb3\x27\x6e\x7a\xe5\xf1\xc3" - "\x77\xfe\x73\x79\xfb\x55\xbf\xfd\xc9\xc7\x3f\xfc\xe3\xd3\xff\xbd" - "\xe1\xa5\x5f\xd5\xdc\xf1\xf7\xa5\xad\xfe\xe9\x0f\x97\x8e\x7e\x6b" - "\xe1\x17\xc3\x2c\xbf\xae\x9f\xf2\xaf\x64\xf5\x9b\xe8\x0f\x33\xec" - "\xcd\xdf\xa5\xdd\x5c\xc9\x23\x81\xb3\xa2\x2e\x1b\x8f\x2c\x09\xfb" - "\x73\x40\xca\xed\x20\x79\x43\x7f\xc3\x65\xbc\x31\x5c\xae\xdc\x17" - "\x28\x8a\x7e\x7c\x6f\x0a\xed\x1f\x85\xe1\x75\x1b\x5e\x37\x31\x88" - "\x6b\x17\x60\x44\x2f\x71\x5c\xf9\x22\xa1\xec\xfd\x90\x33\x2f\xe8" - "\x8f\xda\xf2\x06\x1f\xf0\x85\xab\xc1\x0f\xae\x81\x6b\xc1\x1f\x02" - "\x60\x00\x0c\x84\xeb\xc0\x08\xd7\xc3\x20\xb8\x01\x02\xe1\x46\x18" - "\x8c\xd2\x0c\x81\x9b\x61\x28\x0c\x43\xa5\x0c\xef\x59\x96\x14\x08" - "\x0f\xc4\x1f\xf8\x7f\x3a\x84\xb3\x7a\x54\x1f\xfc\x3b\x85\xe7\x0b" - "\x78\x99\x80\x3b\xfb\xe0\xdf\x29\x5c\xf9\x9e\xef\xc3\xbf\xd7\xbb" - "\x84\xa9\x03\xcf\x1e\xdc\x72\x88\xae\xe2\x09\x95\x44\xe9\xaa\xc3" - "\xd7\x8c\xef\x86\xcf\x7d\xbc\x67\x09\xc7\x4b\x6c\xc8\x26\x03\xf0" - "\xdf\x37\xa8\xfa\xd2\x91\x29\x7d\x68\x18\x90\x42\xbf\x3a\xf1\x06" - "\x23\xfb\xf9\xf5\x25\x7f\x31\x5e\x29\x78\xad\xc7\x2b\x1d\xaf\x57" - "\xf0\xda\xa1\xe1\x06\x69\xd8\x34\x90\x94\x24\xbc\x3b\x41\x1a\x1e" - "\x88\x57\x0e\x48\x41\x21\x20\x8d\x38\x09\xd2\xc8\xf9\x2e\xe6\x43" - "\xd7\x75\x71\x29\x85\x08\xb8\x82\xcf\x61\xfa\xbd\xda\x4b\x5d\xcf" - "\xf2\xef\x9d\x11\xa1\x84\x85\x8e\x0d\xbd\xfd\xb6\x68\x65\xd4\x28" - "\x65\x8c\x29\x2c\x6c\xb4\x69\xdc\xe8\xb0\x3b\x94\x31\x63\x26\x86" - "\x99\x26\x9a\x4c\xca\x82\x17\x12\x62\xc3\x4c\x4f\xcf\x51\xe6\xc6" - "\x26\x2c\x58\x1a\x9d\x30\xa7\x17\x42\x5f\x7a\x41\x51\xe0\xe6\xf3" - "\x9c\x4d\xbd\x85\x24\x98\x02\xf2\xf1\x99\x20\x9f\x0f\x84\xee\x26" - "\x0d\x16\x97\x7b\x91\xde\xb0\x81\xb4\xbd\x00\x24\xcb\x58\x90\x5e" - "\x0e\x07\x69\x23\xea\xd2\x86\xb0\xbd\xbb\x40\x7a\xdf\x00\xd2\xbb" - "\x6d\x20\xbd\xb5\xbe\x3b\xac\xd8\xca\x61\xc7\x15\x90\x1a\x66\x80" - "\x74\x04\xed\x50\xbd\x86\xc3\x5a\xb0\xcf\x17\x41\x57\x44\xf6\xcb" - "\x2f\x97\x6a\x6f\xe9\x7f\xa8\x4a\x69\x9a" +static unsigned int eth_z8e_uncompressed_length = 377284 ; +static unsigned int eth_z8e_length = 120629 ; +static unsigned char eth_z8e[120629 + 1] = + "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x3f\xbc\x32\x19\x60\x12\x03" + "\x13\x31\xe2\x94\x62\x1d\x2d\xd8\x68\x51\x82\x62\x4d\x2d\x68\x14" + "\xd0\xa8\xfc\x88\x8a\x6d\x54\x34\xa0\x01\x83\x46\x88\x10\x61\x80" + "\x90\x09\x03\xea\x04\x81\x44\x45\x1a\x21\x90\x78\x8b\x6d\x40\xd4" + "\xd8\xd2\x36\x58\x84\xd1\xc4\xf7\x62\x6f\x92\xa1\x7d\xe9\xf7\xcd" + "\xed\x4b\xdb\x91\x1b\x69\x4c\x03\x4c\xc9\x40\xc6\x64\xe6\xec\xf7" + "\xb3\xf6\x3e\x27\x99\x19\x26\x28\xf7\xde\xe7\x79\xff\x69\x9e\x67" + "\x72\xce\xd9\x67\xef\xb5\xd7\x5e\x7b\xad\xb5\xd7\xde\x7b\xed\x75" + "\x88\x2e\xfe\xcf\x47\x16\xbe\x24\x90\xe9\x50\xc1\xc7\xff\x8d\xf2" + "\xff\xfa\xfb\xd7\xdf\xbf\xfe\xfe\xf5\xf7\xaf\xbf\x7f\xfd\xfd\xeb" + "\xef\xff\xdf\x3f\x7f\x02\x4d\x3a\x63\x32\xd3\x27\x95\x44\x3d\x2e" + "\xcb\x18\x5f\x42\xc2\x8c\x9f\xbe\x2e\x42\x78\x95\x80\x71\x7e\x0c" + "\x5f\xf9\xf7\x1a\xd2\x4c\x95\x64\xb9\x26\x95\x52\xc5\x4f\x6d\xa6" + "\xa9\x3b\x88\xb6\x8c\x12\x5d\xaf\x6f\x15\xfe\xa6\x12\xa2\xc6\x5d" + "\x78\xde\x2a\x3a\x5e\x1f\x25\x02\x80\x33\xcf\x47\xf3\xcc\x0c\x67" + "\x1d\x9e\xd7\x21\x1d\x69\xc5\x48\x0b\x70\x5a\x05\xca\x19\xe9\xde" + "\xf5\xe7\xa8\xc9\x1e\xa2\x0a\x86\x63\x0f\xd3\xb4\xab\x25\x1e\xb5" + "\xc8\x5b\xc2\x79\xd7\x8e\x42\xbd\x69\x44\xae\xad\x22\x18\x81\x83" + "\x85\xeb\xe1\xba\xf5\xfc\x47\x62\xea\xf3\x23\xad\xdd\xa8\x6f\x10" + "\x18\xa9\x5c\x9e\xdb\x60\xff\x0e\x25\x9e\xa0\x4b\x2e\x67\x98\x8c" + "\x9b\x70\x91\xc5\xdb\x1b\xa2\x13\x94\x94\xde\xed\xa2\xc4\x46\x50" + "\x63\xf3\x56\x99\x9e\xe8\x0d\x84\xc8\x5e\x4a\x09\x78\x37\x13\x57" + "\x13\xca\x0d\x67\xfa\x3c\x54\x4d\x63\xb9\x6e\xc0\x35\x0b\x93\x27" + "\xa1\x66\x24\x11\xd3\x28\x60\xa2\xef\x05\x5c\x94\xd0\xe3\x4a\x42" + "\xfb\x2d\xe9\xb2\xfd\xa8\x17\x65\xcd\x27\x28\xf9\x9f\x26\xe4\x47" + "\x9d\x7e\xfb\x2a\xc6\x21\xf9\x53\xe1\xf2\x98\x0c\x38\x9a\xcb\x73" + "\xc9\xce\xd7\x88\xba\x5d\xa6\x7b\x03\x26\xab\xd0\xe1\x1c\x30\xe0" + "\x70\x3e\xd4\x95\xc2\x75\x75\xbb\xcc\xaf\x45\xe4\xf1\x19\x79\x80" + "\xb7\x7f\x42\x80\x12\x19\xe7\xe3\x94\x9c\xc9\xf5\xe9\x6d\x31\x73" + "\x1d\xde\xe5\x21\xf2\xa2\xef\x51\x77\x1a\xda\x6a\x6f\x0c\x12\x01" + "\xe6\xa5\x35\xa5\x44\x0c\x1f\xf8\xdb\x15\xcc\xe4\x49\x06\x4c\x86" + "\xd1\xdf\x56\x97\x67\x64\x8d\xc4\x91\xdb\x6a\x21\x3d\xef\xbc\x48" + "\x1c\x19\x2e\xda\x72\x05\xb7\xa5\x09\x1c\xa5\xe7\x59\xdf\x4f\x8f" + "\xfe\xf6\x5f\x92\x15\x03\xdb\xa6\x60\x27\x00\x76\x82\x47\x2f\xd7" + "\xdf\x7e\x5f\x4c\x7e\x95\x37\x35\x29\x60\x12\x3a\x1d\x92\x3b\x06" + "\xf2\x26\x6d\x89\xcc\x0b\x7c\x4c\x8a\xb6\x64\xf2\x51\x72\x1b\xda" + "\x99\x88\x3c\x33\xd0\x8f\x76\xfd\xfd\xe5\xfa\x7b\x1b\xde\xdd\xa1" + "\xe0\x5d\x92\x19\x01\x2f\x95\xe1\x45\xf2\x96\x92\x28\x33\x7e\x43" + "\x60\x20\x0f\xc5\x6f\x98\xc5\xe0\xb7\x65\x36\xa1\x39\xbf\x85\x36" + "\x6d\xa8\x23\xcd\x25\xc8\xeb\x08\x92\x7d\x34\x39\x8f\xd3\x25\xf5" + "\x80\x4f\x9b\x57\x91\xc5\x59\x24\x82\x5e\x47\x17\xb5\xfa\xbb\xc8" + "\xe9\x87\x6c\x84\xce\x52\xe9\x59\xf0\x62\xe8\x24\x95\x3e\x4f\xb6" + "\xa6\x92\x2f\x28\x1e\x2f\x6b\x26\x41\xce\x31\x5c\xb6\x9d\x5a\xab" + "\xdb\xc9\x59\x1d\x5d\xd6\x79\x25\xd9\x5a\xf0\x8c\x3e\xb7\x32\x1e" + "\x2c\x6f\xa1\xe4\x3a\x2a\x79\x93\xcc\xce\xab\xc9\xd4\x92\xef\xd1" + "\x71\x49\x71\x30\x2e\xeb\x3b\xc9\xf2\xb3\x85\xe0\xc3\x4e\xc6\xb7" + "\x9e\xde\x5f\x15\x34\x35\xda\x66\x50\xa3\xed\x18\x35\xd9\xa6\x50" + "\x93\x63\x1a\x6d\xee\xa4\x94\xc6\xe0\x64\x6a\x32\xdf\x4d\x4d\x63" + "\xa7\x91\xb7\x0b\xf7\x90\xdf\x46\x5b\x80\xec\xcb\x99\x9f\x52\x0a" + "\xb6\x3c\x43\x16\x9f\x82\x09\xda\xa5\x14\x7f\x5c\x4c\xc4\xb4\xe3" + "\xe7\x78\xed\x58\xf6\x2d\xb2\x01\xbf\x0e\xe0\xf2\x43\xe0\xf2\xee" + "\x58\x1b\x65\x00\xe7\x61\xde\xaa\x10\x99\x4b\x28\x69\x10\x39\x4e" + "\xd3\xc0\x7b\x90\xdd\xae\x9d\xd0\x27\x2c\xbf\xdd\xab\x73\xa1\x13" + "\x52\x20\xff\x29\xeb\x75\x19\xe8\x72\xbe\x45\xe6\xee\x15\xb9\x09" + "\x35\x5b\x45\x7b\x8f\x6b\x38\x19\xef\x20\x8b\xed\x78\xdf\x31\x21" + "\x8d\x52\xbd\xa1\x2c\x3a\xd4\xdb\xc1\xf2\xd8\x35\x22\x40\x09\x0c" + "\xcf\xea\x80\xec\x2c\xa7\x21\xc0\xe7\x0f\x35\x48\xff\x2e\xf2\xa1" + "\x7c\x96\x8f\xb6\xd6\x73\x79\x71\xc5\x63\x01\xed\x8a\xc7\xce\x6a" + "\x3f\x7d\xac\x5b\xfc\xf4\xb1\x33\xe1\x9f\x3e\xf6\x4f\xe7\x4a\xb2" + "\x84\xaf\x78\xcc\xdf\x5a\x24\xfb\x20\xb5\xb5\x08\x7d\x10\x26\xcb" + "\x9a\x93\x94\xfa\xc4\xf3\xe8\xfb\xd0\x5f\x68\xcd\x22\xb2\x69\x49" + "\xef\x35\x78\x43\x7f\xa2\x27\x4a\x48\xe0\xfe\x70\xbc\xf6\x75\x27" + "\xd7\x67\x19\xb2\x85\x7a\x1b\x7c\xa6\x9f\x07\xb9\x5e\x7f\x52\x43" + "\x16\x7e\xd3\xf0\xcb\xc6\x6f\x86\x48\xae\x9f\x01\x5a\x39\x47\xac" + "\x4d\xa0\x9d\xbd\x44\x13\x34\x4a\xe8\xa4\xe1\x47\x81\x7f\xea\x20" + "\x74\x1b\xa3\x6d\x68\x2c\xfb\x5e\x19\x95\xf6\xf4\x14\x10\xeb\x42" + "\xd6\x7f\xac\x0f\x7b\x5c\x23\xec\x3e\xd3\x2f\x32\xa5\xfc\x6e\x85" + "\x8e\x49\x6e\x2c\x43\x7a\x47\x60\x75\x41\x82\x7f\x75\x81\xa9\x3b" + "\xb9\x71\x1d\xf2\x4c\x43\x9e\x22\x9d\x86\x1d\x0c\x0b\xb2\xe5\x1f" + "\x1e\xa2\x44\xc0\x2c\xfa\xed\xb9\x36\xf3\x8e\xad\xe2\x18\xf2\x15" + "\xf6\xc3\x02\x6c\xc0\x01\xfd\x47\x94\x19\x69\xa0\x75\xfb\x26\xe4" + "\xe3\xf2\xde\x60\x16\x8f\x29\x3e\x6f\x61\x07\x59\x43\x94\x2c\xfa" + "\x54\x7d\xc8\xd3\xc1\x3a\x7d\x78\x90\x86\xf6\xb8\x28\x87\x61\x73" + "\x39\x6f\x57\x07\xa1\xdc\x3a\xe1\x2c\x30\x21\x7d\x56\x8f\x28\x48" + "\x58\x8f\xf4\x46\x94\xd7\xeb\xee\x30\x70\xe4\x3a\xb8\xaf\x25\x9e" + "\xe0\x87\xc6\xc2\x20\x0d\xaf\xa2\x44\x94\x7b\x88\xe1\x31\x2c\xf0" + "\x81\x0f\x6d\x5d\xd7\x58\xe8\x27\x4d\x44\xc1\xf4\x29\x78\xd6\xcc" + "\x28\x78\x48\x17\x80\xc7\xfc\xd7\x84\x32\xc3\x6b\x25\xbc\x07\x7f" + "\xab\x31\xbc\x20\x99\xed\x12\xdf\x1f\x33\x8c\x1e\xd6\x1f\x80\xe9" + "\x59\x7e\x17\x75\x91\xb5\xd6\xef\x2c\x48\x6c\xc5\xb8\xc9\xe5\xdf" + "\x2f\xed\x18\x22\xba\x73\x13\x99\xe7\xf8\xbd\x37\x74\x86\xf3\xac" + "\x15\xdd\x05\x89\xc3\xbb\xa0\x8b\x90\x07\xe5\x1d\x8c\x67\x64\x5f" + "\x3e\x38\xfd\xc7\x53\xe8\xc7\xd3\xee\x9d\x36\x85\x66\xde\x39\x75" + "\x0a\x65\xfc\xf0\x86\x8c\x49\x37\xdf\x7a\xb3\xbc\xb9\xf9\xd6\xcc" + "\x9b\x29\xe7\x27\x0f\x4e\xa1\x9c\x59\x53\xe8\x21\xfc\x72\x1e\x9a" + "\xfe\xe0\xb4\xe9\x0f\x4d\xa1\xdc\xbb\xef\xc5\xd3\xd4\x29\x13\x33" + "\xee\xb9\x21\x67\xea\xbd\xd3\xe9\x81\x39\x37\x65\xdc\x74\x13\xdd" + "\x39\x7d\xc6\xc4\x8c\x0c\xfd\x3a\x31\x83\xb3\x3c\x9a\x39\xfd\xa1" + "\x1b\x72\x96\x2e\x29\x5e\x72\xc3\xac\x7b\xa7\x72\x0a\xb4\x5b\x04" + "\x0f\xa5\x87\xcf\x69\x4c\xeb\x80\x38\x9d\x4d\x1a\x74\xc7\x4e\xf0" + "\x00\x7e\x5d\x9e\xd2\xe3\xd0\x01\x97\xbe\xb0\x93\xfb\x4e\x8e\x01" + "\xd6\x03\x90\x7b\x73\x8f\x2b\xb5\x04\x34\x94\xb2\x63\xbf\x86\xf5" + "\x84\x6d\x08\xde\x7d\xac\x8f\x35\x43\xf0\xbe\x3a\xfa\xfd\x65\xd0" + "\xc1\xd6\x7f\x6f\xb5\x13\x79\xf1\x03\xdd\x03\xd0\x85\xa0\xaf\x9f" + "\xba\x9d\xb9\x43\xc0\xdf\x09\xa8\xa3\x1d\xb2\x79\x04\x65\xdb\x22" + "\x64\xbe\x1d\xfd\x73\x84\xc7\x95\x53\x94\xfa\x41\x6b\x71\x16\x71" + "\x3f\x79\x8b\x75\x18\x67\xfb\x61\x24\x4b\x18\xe8\x7b\xc0\x39\xaa" + "\xe0\x5c\x6a\x8f\xd0\x0f\x3e\x86\xb3\x19\xef\x74\x58\x67\x5b\xa1" + "\x27\xa0\xc7\x93\x35\x67\x3a\x89\xe4\x3a\x8b\xd6\x97\x2e\xc7\x4a" + "\x94\xcb\x8d\xe0\xeb\x40\x93\x03\xf9\x7e\x96\x9d\x00\x3e\x48\xc0" + "\xf8\x8b\xb6\xa4\xe6\x83\xbf\x03\xe1\x0d\x0d\x0f\x88\xd3\xb9\x6c" + "\x47\x0c\x3d\x41\x23\xff\x80\xf6\x35\x6b\x1b\x1a\x72\x44\x8f\x4c" + "\x63\xba\x35\x08\x7e\x4e\x46\xbe\xbe\xfe\xb4\xfd\x9c\x06\x3e\x48" + "\x64\x79\x15\x42\xa6\x63\xcc\x1c\xb9\x12\x3a\xad\x0d\x79\x73\x38" + "\xef\x84\x10\x0d\x83\xae\xb1\xd9\x9d\x09\x74\x9c\x46\x92\x96\xdc" + "\xf0\x60\x44\x7d\x80\x33\x92\x07\x29\xe6\x47\x73\xcf\x69\xc0\xe9" + "\x96\xe9\xb0\x63\x46\x3e\x0e\xf8\x0f\xb1\xae\x54\xfa\xdb\x36\x8e" + "\xf3\xe9\x63\xf3\xc0\x33\x64\x5d\xc1\xb1\x8d\x6b\x04\x2d\xd9\x5e" + "\x60\xfb\xaf\xc7\x35\x72\x8e\x8f\x86\xfb\xd5\xd8\x68\x1b\xcb\x79" + "\x35\xe0\x28\x52\x2c\x75\x80\x3b\xc7\xb3\xaa\x8b\x4e\x14\xf1\x58" + "\x3b\x32\x55\x73\x16\x50\x34\x4e\x97\x36\x33\xfe\xac\x3f\x40\x8b" + "\x3f\x81\x0f\x92\x00\x6f\x57\x34\x1f\x8c\xf4\x00\xce\x03\xc0\xaf" + "\x0d\x6d\x7a\xc0\x47\x97\x1e\xd6\xba\x0b\x50\x2f\x99\x20\x57\xd0" + "\xe7\x03\x30\xf4\xf2\xed\xd1\xe5\x2f\x75\x73\x39\xe4\x1f\xd2\xd3" + "\x2d\xf3\x6f\x64\x9a\xeb\x7c\x07\xbe\xbc\x2c\x2d\x3a\xff\x15\x5f" + "\x02\x97\xbf\x46\xbc\x9f\x14\xf3\xbe\x05\xef\xff\x4b\x7f\x0f\xb9" + "\xbf\x6c\x4e\x0c\xdf\x16\xe1\xfd\xdf\x81\x6f\x00\x72\x0d\xdb\xe2" + "\xd2\x6c\xf0\x98\x3f\x22\xff\xfa\x98\xfc\xb5\xc8\xff\x0f\xe6\x1b" + "\x1e\x73\x38\x7f\x8d\x2e\x3b\xc8\x6f\x41\xfe\x7d\x31\xf5\xbf\x8b" + "\xfc\x81\x08\xfc\x8e\x46\xbf\x4f\xab\xc6\xfb\xaf\x98\xd7\x61\x13" + "\x0d\x41\x9e\x61\xac\x4b\x58\x8f\x35\x16\x72\x7f\xa5\x99\x63\xf2" + "\x8f\x45\xbe\x14\x9d\x46\x26\x9d\x46\xd9\xdc\x8f\xa8\xe3\x98\xc2" + "\x21\x2d\x33\xa6\x4c\x2e\xca\xa4\x81\x8e\x0f\x18\x7c\x19\xa7\x4c" + "\x61\x4c\x99\x8d\xdc\x8f\x42\xd5\x63\xee\xe9\x1b\x28\xa3\xeb\xc8" + "\x48\x18\xdc\xb6\x4b\x00\xa3\x3e\xa6\xed\x93\x50\xef\x98\x4d\x4a" + "\xef\x5c\x02\x1e\xba\x09\x69\xe3\x00\xf3\x61\x96\x01\xc8\x6a\xc0" + "\xeb\x0f\x92\x70\x66\xa7\x28\xde\xbd\xfc\xd2\x11\x21\xe2\xfb\x1b" + "\xf8\x9e\x61\x8b\x9e\x19\xba\x4c\x5e\x7e\x29\xae\x48\x4f\x63\xfb" + "\x2d\x81\x75\xb0\xe8\xb9\x5f\x53\x30\x2f\xbf\x45\x98\xc8\x84\xe7" + "\xb0\x5e\xc7\x95\x78\x4e\x00\xfe\x0f\x62\xcc\x21\xb1\x02\xf9\x56" + "\xd1\x54\xa4\x73\xda\x8f\xf5\x7c\x03\xcf\x2b\xee\x0f\xa9\xf7\xa3" + "\xfe\xa0\xea\xcc\x66\x7e\x9f\x84\xe7\xcf\x14\xbc\x51\x1f\x33\x7c" + "\xdc\x4f\xd4\xef\x13\xc2\x0c\xfb\xb4\x21\x93\xa3\xf6\xcb\x72\x90" + "\x4b\x59\x1f\xca\x8b\x15\xf2\x1d\xc3\x7c\x1b\xd7\x7b\x71\x7d\x15" + "\xd7\x07\x70\x7d\xce\xf9\x15\xd9\x9c\x61\x29\x9f\xfc\xfc\x08\xae" + "\x0f\xe2\x3a\x1d\xd7\x87\x70\x9d\x88\xeb\x5d\xb8\x0e\x67\x39\xc1" + "\xb8\xca\x73\xae\x00\xc6\x59\xc5\x6b\x3c\x27\xe8\xc9\x66\x9a\x4c" + "\x47\xbb\x25\x2d\x34\xa5\x6f\x2c\xaa\x5f\x2f\x97\x73\x42\xf0\x07" + "\xa7\x0d\x53\xfc\xa1\xd2\xc2\x86\x5e\x3a\x3d\x90\xa6\xeb\x2a\x5d" + "\x36\xf5\x34\x05\x3f\x07\xf0\x8f\x30\xae\x42\xc1\x1a\xa2\x78\x40" + "\x87\xaf\xca\x99\xe3\xd4\x99\x10\x59\x27\xae\xbb\x9c\x0e\x21\x70" + "\xad\xe4\x3e\xf3\xd1\x28\x0f\xe8\x67\xd6\xb8\x4f\x96\xd2\x0c\xd4" + "\x51\xc8\x7d\x60\xf0\x94\x50\x3c\x3a\x94\xef\xb5\x15\xcf\x42\x47" + "\xe1\xfd\x8a\x67\x35\x9d\x0f\x65\x1e\xf9\x5e\xe1\x32\x57\xaf\x63" + "\x12\xf7\x8f\x7c\x2f\xd3\xd3\x8e\x44\xf0\xe5\xc8\x1e\xd7\x15\xd9" + "\x31\x7c\x59\x02\xbe\xbc\x91\xf9\x8f\xfb\x8c\xe9\x32\xa2\x48\xda" + "\x04\xa6\x7e\xf8\xa7\x15\x7f\xef\xd4\xe7\xc0\x4a\x17\x5c\x51\x19" + "\xa3\xab\x24\xff\xc7\xe8\x8e\x2e\xee\xaf\xc4\x12\x96\xa9\x2b\x3c" + "\x3e\x7a\xdf\x27\xed\xcf\x0d\x0d\x3f\xe1\xf7\x01\xf0\x07\xd7\x9b" + "\x58\xc4\xba\xe0\x0a\x9f\xf1\x5e\xbe\x4b\x6a\x92\x63\x5e\x62\xa1" + "\x7c\x87\xb4\x94\x06\xe3\x9d\x51\x4f\x62\x31\xbf\xb3\xd9\x06\xe0" + "\xd6\xa5\xeb\x70\x13\xe3\xd9\x8f\xc2\x5d\x67\xbb\x81\xc8\x74\x7d" + "\x19\x0d\xf1\x86\x8e\xd2\xec\x90\x08\x7f\xbf\x8c\x92\xbc\xa1\xbd" + "\x74\x1d\xd1\xa5\xde\xd0\x01\x4a\x27\xba\xda\x1b\xda\x02\x7b\x66" + "\x3d\xbf\x3f\x74\x5d\x59\x42\x02\xae\xce\xef\x91\x29\xc1\x1b\xaa" + "\xa6\x6b\xc9\x8c\x6b\x31\xdd\xfd\xa2\xe8\xf1\x86\xf2\x91\xaf\x90" + "\x66\x87\xc5\xe9\x69\x43\xc4\xdf\xf2\xc2\x94\x3a\xe3\x45\xe1\xf4" + "\x86\x30\xb7\x08\x35\x23\x5d\x13\xb3\xc3\x5f\xe1\xd7\x23\x34\x77" + "\x5d\xfa\xec\xf0\x69\x31\xf5\xc5\x43\x78\xfe\x9b\x98\x3a\xc4\x29" + "\xd0\x4f\xc2\x1b\x9a\x4c\xad\x81\x00\xf2\x4f\x22\x51\x5e\x67\x7b" + "\xe2\xac\x89\xfa\x60\x93\x68\xe5\x75\xe9\x68\x4f\x66\x1f\xda\x82" + "\xf1\xfa\xd6\xbe\xd5\xb8\x6e\xa8\xfb\x81\x7c\xb6\xd4\x65\xa3\x2d" + "\x99\x37\x94\x61\x9e\xe1\x40\x3b\xc2\x7e\x01\x3b\xc6\xec\x75\x1c" + "\xa3\x11\x6b\xd9\x56\x9f\x8c\xb9\xda\x17\x84\x7e\xb0\xea\x70\x33" + "\x79\x8e\x26\x92\x50\x6e\x43\xdd\x74\x09\xc3\x5d\x57\x60\x4d\x10" + "\x7e\xe8\x6d\x2b\xd3\xc2\x1b\x3a\x86\xdf\x17\xc4\x34\xf0\x86\x02" + "\x80\x49\x56\x94\x2b\xe8\x4b\xaa\xcb\xc5\xcf\x81\x5f\x1d\xf0\xf8" + "\x50\xb8\xd2\x3e\x16\xb0\x1d\x50\xfe\x30\x9e\xdb\x78\x8e\x29\x69" + "\x19\xa6\x61\xc8\x7f\x18\xfc\x32\x0d\x7c\xc7\xb8\x06\x65\x3d\x1b" + "\xea\x7a\x02\x42\xb6\xe1\x9c\xde\x86\xb3\xaa\x4d\xbb\x6d\xba\x1c" + "\x21\x6d\xf7\x15\xb8\x9f\xd3\xc3\xf9\xdc\xbb\x6d\xc2\xb2\x3b\x3d" + "\x08\xd9\x04\x5d\xcb\x98\x8e\xa0\x6b\x19\xd3\x52\x94\xef\xb6\x79" + "\x1d\x1b\xd1\x8e\xdd\xe9\x7d\x49\xbb\x33\x51\xee\xbe\x3e\x69\xcf" + "\xec\xce\x0d\x28\x38\x3f\x01\x9c\xb9\x12\x8e\x65\x77\x2e\x60\x15" + "\x84\x5d\x76\x9a\xbd\x52\x04\x67\x87\xd6\x86\xf2\x56\x52\xe2\x78" + "\x2a\x4b\xe0\xb9\x8c\xd7\x51\x88\x76\x36\xe1\x3a\x0d\xef\xe9\x32" + "\xd4\x75\x08\x70\x73\xb9\x3e\xd4\x53\x00\x98\x0b\x00\x2b\x9f\xf1" + "\xeb\x35\x51\x2a\x9e\x1d\xbd\xab\x25\x7e\x55\x80\xdd\xa0\x59\x76" + "\xd7\x19\x3c\xc4\xfc\xa3\xe8\xc6\x7c\xf3\x36\x81\xbf\x52\x67\x3b" + "\x44\x08\xef\x52\xbd\x0e\x4e\xaf\xa6\xd6\x22\xe4\x71\xf0\xfb\x62" + "\xdc\xcf\xc4\xfd\x7a\x62\xfe\x99\x55\x14\x58\x7b\x63\x59\x51\x02" + "\xf2\x1f\xca\x0b\x59\xe8\x89\x22\x73\x59\x6b\x51\x17\xde\x75\x11" + "\xd2\x9c\x5e\x47\xb5\x9c\x7b\xa1\x5f\x43\x61\xcb\x9e\xcc\xb0\x7b" + "\xb7\x7b\x44\xc0\x29\xbc\x8e\x62\xe4\x2d\xa2\xeb\xca\x2c\x09\x32" + "\xbf\x23\x5f\xb6\x47\xdb\x5c\x46\x5c\xa6\xa5\x60\x2f\xf1\x1c\x0e" + "\x6d\xf7\xb7\x74\xad\x67\x1e\xd5\x34\xf7\x1e\x0b\xf8\xb3\xaf\xa5" + "\x60\x0b\xcd\xec\x2a\x1b\x06\x7a\x24\x20\x3d\xdc\xd2\xd5\x84\xbc" + "\xcd\x8a\x67\x57\x86\xac\x2d\x05\xeb\x29\x64\xd9\xed\x08\xb9\xf7" + "\xd8\x66\xaf\xec\x13\x33\x0b\xc4\xa1\xc7\xbb\xca\xc0\xa7\x7b\x69" + "\xe6\xc9\x50\x62\x6b\x11\x78\x7e\x65\x0f\xd2\x43\x92\xff\x67\x9e" + "\xec\x16\xb3\x9e\x17\xa7\x67\xaf\xfc\x9b\x68\x29\xc8\xa7\x27\x02" + "\x34\xe2\x92\xb5\x42\x63\xb9\x68\x6e\xdf\x4b\x97\x1c\xeb\x20\x96" + "\x89\x19\xf3\x35\x31\xf3\xe4\x69\xf1\xc4\xf3\x98\xb7\x3a\x26\x03" + "\x47\xd0\x25\xb0\x85\xe9\x5d\xd5\x52\x70\x00\x38\x40\x6e\x1c\x93" + "\x90\xf6\x36\xf2\x7a\xac\x8f\x9f\x4c\xa5\xe6\xf6\x2d\x14\x4a\xda" + "\xed\x08\x97\xef\x76\x6b\x49\xbb\xeb\xd0\x47\x0d\x5a\xf9\x1e\x4b" + "\x38\x69\x4f\x66\xa8\x7c\x8f\x4d\x6c\xd8\xe3\x46\x3f\x25\x71\x9f" + "\xf7\xba\xc8\x8e\xe7\x97\x7a\x25\x1f\xed\x41\x3f\xed\x69\x80\xfd" + "\x2c\x98\x96\xa2\x7c\x4f\x95\x92\x81\x3d\x0d\x7d\x49\x7b\x60\xdf" + "\xe1\x2a\xf9\x70\xcf\x61\xe6\xcb\x30\xf4\x1d\xd2\xfe\x3d\x8c\xb2" + "\x78\xdf\x86\x5f\x07\x7e\x41\xb1\xe1\x9d\x6c\xc0\xbf\x94\xe1\x6b" + "\xee\x77\x72\x85\xe5\x9d\x82\x1b\x89\x2c\xad\x81\x76\xe2\xb5\x0b" + "\x39\xd7\x77\xfc\x05\x38\x33\x4f\x85\x70\x0d\x41\x36\xde\xc9\xd6" + "\x6e\xaf\x94\x32\x28\x92\xde\x29\x98\x1d\xbe\x43\x3c\x71\x96\xe5" + "\x09\xe9\xe5\x80\x91\xfc\x8e\x3b\x28\xf9\xf5\x9d\x97\x19\x87\xbe" + "\xd5\xe9\x0c\xc7\x8c\xf7\x55\x62\xc3\xde\xe4\x80\x48\x27\xcd\xbd" + "\xd7\xa2\x59\xf6\x16\x08\xf7\x5e\xc8\xc3\xde\xf4\xb0\x7b\x6f\xe6" + "\xfd\x43\x84\x9f\xf5\x57\xdf\x4b\x84\x7a\xf6\x51\xe8\x76\x21\x5a" + "\x8b\xd6\xe3\xfe\x23\x92\x32\xec\x38\x2a\xf9\xaa\xa5\xeb\x28\x68" + "\xf9\x2e\xd2\x9b\xa4\x1e\x63\xda\x8b\xa4\xbd\xe9\x4f\x9c\x1d\x5d" + "\xc6\xbc\xf0\x44\x11\x95\x89\xf2\xbd\x36\xad\x7c\xaf\x25\x5c\xbe" + "\x37\x53\x4b\x42\x3d\xc9\xef\xed\x09\x4a\xb9\x7e\x0f\x7c\xbd\x0f" + "\x65\x3e\x92\xfc\x24\xca\xdf\xab\x1b\x4c\x97\xb2\x4e\x63\x1d\x36" + "\x3b\x14\x64\xfe\xfa\x3b\xeb\x3f\xd6\x65\xd0\x05\x79\x86\x2e\x63" + "\x3d\xc6\x73\x2c\xd6\x65\x9a\xae\xcb\x34\x5d\x97\x69\x11\xba\x0c" + "\xf4\x37\x83\xdf\x83\x52\x7f\x81\x9e\xac\xbb\x66\x87\x33\x44\xac" + "\xee\xe2\x32\x61\xe8\x25\x0d\x7a\x09\x3f\x87\xa6\xf4\x52\x83\xae" + "\x97\x4c\x86\x5e\x02\x3c\xd6\xdb\x5a\x3c\xbd\xa4\xe9\x7a\x29\xac" + "\xeb\x25\x1d\x9f\xb3\xda\x85\xf4\x92\x65\x37\xda\xbb\x3b\x9d\xd7" + "\x53\x21\x37\x65\xdc\xcf\xb3\x57\x6a\x65\xe0\x47\xd0\x71\x77\xba" + "\xa6\xf4\x51\x36\xe6\x57\x26\xd6\x47\x61\x94\xd7\x0c\x7d\xd4\x23" + "\xf5\x46\x01\xeb\x24\xee\xbb\xbc\x90\x9d\x58\x17\x49\xbd\x13\xba" + "\x3a\xc4\x7a\x07\xf4\xbb\x23\x56\xef\x00\x9e\x03\xf7\xa9\x7a\xfd" + "\x75\x98\x5d\x87\xac\x21\xa7\x98\xed\x08\x48\x1a\xe5\x39\x8a\xcb" + "\x98\xe7\xa0\x13\x1a\x44\x6b\x19\x41\x27\xb9\x81\x23\xf8\x3c\x4c" + "\x90\x5d\x4b\x08\xfa\x02\x72\x60\x0b\x43\x96\x67\x76\x75\x7b\x67" + "\x15\xd1\xb0\x27\x02\xe9\xa9\x33\x4f\x0a\x3f\x68\xe3\x7b\xa2\xa8" + "\x8c\x66\x05\xd2\xa1\x1f\x3e\xa2\x19\xed\x42\x9b\x31\xcf\x67\x87" + "\x9c\xd8\x66\x2e\xf2\x58\x9f\x78\x3e\x95\x66\x9d\x15\x1e\xe8\x8f" + "\xff\x7b\xe6\xc9\x54\xeb\xdc\x76\xfa\xce\x8c\xf9\x42\x0b\x43\x16" + "\xd1\x56\x37\xda\x5c\x05\xbc\xeb\x20\x97\x0d\x90\x43\x4b\x08\xf2" + "\x18\x29\x8b\x90\xab\x97\x70\x6f\x97\xed\x70\xef\x69\x80\x2c\x56" + "\x69\x72\xbc\x6b\x97\x73\x5a\xd4\xd3\x20\xe5\x27\x09\xe9\xe5\x4a" + "\x1e\x35\x55\xee\xb0\xc6\xb4\x33\x29\x79\xe4\x3e\xc1\xfb\x36\xfc" + "\x3a\xf0\x8b\x92\x47\x96\x33\xc1\x72\x56\x74\x76\x40\xce\x9e\xd7" + "\xe5\x2c\x49\xc9\x59\x18\xb6\x4a\x78\xb5\x92\x35\x86\xcf\xf3\xde" + "\x7e\x59\x4b\xde\x6b\xc1\x7d\x82\xe2\x1b\x29\x6f\x2c\x6b\xd0\xb1" + "\x7b\xd3\x21\x7f\x80\x27\xfc\x2c\x07\xe0\xcb\xbf\xf2\x78\x38\xab" + "\x48\xfc\x35\x2f\x3c\x1a\x7d\xbe\x37\x13\xfa\xee\x6f\x33\xbb\xc4" + "\x5f\xa1\xeb\x6a\x21\x4b\x16\xc8\x90\x0d\xb2\x94\x0e\x99\x62\x59" + "\xaa\x0b\xaf\x66\x98\xef\xd5\xf5\xc3\x90\xe3\x69\xb4\x2c\x0d\xb6" + "\xee\xda\xe3\xb2\x77\xf9\xe8\xa3\x66\xb6\x69\x70\x1f\xf4\xd1\xc1" + "\x5a\x75\x7f\xb5\xd9\x47\xb5\xc7\xa4\xad\x03\xf9\x2b\x2a\xa5\xcb" + "\x3b\xe9\xea\x06\xf0\x3a\xe1\x3e\x05\xf7\x07\x66\x5f\x77\x08\xb6" + "\xc6\xe9\x36\xd4\xdb\xc3\x32\x28\x5c\x93\xd8\x86\xcb\x02\x0f\x5a" + "\x44\x4f\x7a\x0a\x6c\xc7\xbf\x8a\x3e\x1b\xaf\xed\x59\xf1\x3c\x02" + "\xed\x1f\x8b\xeb\xc8\x1d\xe7\x28\x0d\x3f\xdb\x0e\x97\x56\xc6\xf6" + "\x15\xee\x33\xc4\x0a\x5b\xf2\xe6\xe5\x34\xde\x1a\x20\x4b\x8d\x4b" + "\xcb\xb5\xae\x4d\xe5\x35\xae\x34\xbe\x17\xae\xb7\xa9\xe6\x1c\x99" + "\x79\x1d\x42\x4b\x42\x7d\x0e\xab\x10\xcb\xd2\xa9\x66\x29\x31\x4d" + "\x6d\x35\x2e\x51\x1f\xee\x91\xf2\x68\x33\x70\x61\xdc\x80\xe7\x95" + "\xc0\xb3\xf9\xe1\x95\x59\xf4\xa9\x83\xe2\xae\x0d\xa3\x9d\xfd\xed" + "\x8f\xff\xfe\x9a\x14\x83\x26\x83\xbc\x1f\x6f\xd0\x69\x90\x75\x44" + "\x33\x8f\xe3\xe1\xe5\xc2\x5f\xf1\x0c\x31\x2d\x6c\xce\x90\xf8\x2f" + "\xd0\xb1\xac\x34\x4c\x57\xce\x5e\x79\x95\xf0\x76\x09\x8f\xd7\x71" + "\x92\x6a\xf0\xbe\xb4\x04\x63\x67\x52\x83\x47\x94\x37\x1c\xe8\x5e" + "\x2e\x42\xbc\x76\x84\x3a\x2a\x7d\x34\x39\x43\xf5\xc5\xee\x2a\x39" + "\x67\xb5\x34\x1c\x00\xac\x4b\x19\x56\x0b\xca\x87\xcb\x1b\x9a\x90" + "\xaf\xc1\x47\xff\xb1\x4f\xe6\xb3\xec\xae\x2a\x5a\x45\xdf\xee\xa4" + "\x6b\xfc\x72\x6e\xe1\x6e\x38\xca\xba\x00\x69\xa9\x48\x0b\x01\x7e" + "\x1b\xf2\x77\xf8\xe8\xb7\xfa\x9a\xc4\x35\x21\x23\x1f\xee\xa5\x1d" + "\x1f\xc5\x3f\x09\x72\xf1\x1e\xfd\x65\x1f\xd8\x1c\x4b\xd0\x97\xf3" + "\x8d\xbf\x54\xfc\xb2\xe2\xbf\x1e\xd0\xe5\x7b\x6c\xdd\xd0\xd1\xce" + "\x35\x34\x06\xfd\x03\xfc\xbe\xfb\x3c\xe6\x29\x27\x84\xeb\xbb\x96" + "\x9f\xad\x0a\x62\x2e\xf1\xdd\x12\x1f\x6d\x9c\x3c\x18\x3d\xd1\xfe" + "\x06\xed\x9c\xe8\xa8\x58\xde\x4f\xcb\xcf\xa1\x1b\x05\xdf\xb3\x2e" + "\xaa\x41\x3a\xd3\x0d\x70\x9a\x0c\x9a\x0d\xde\x2f\x0d\x47\xd4\x1c" + "\x77\xec\x58\xe1\x12\xe4\xf9\x0e\xef\x69\x8d\x1d\xa7\xe8\xb0\xa7" + "\xae\x1b\x7a\x84\xd7\xa5\x31\xf7\x0b\x2c\xb3\x89\x60\x8f\x6b\x2c" + "\xec\xff\xf1\xb5\xfa\xba\x57\xc0\x1b\x9a\xce\xba\x25\xee\x98\xc5" + "\x7b\x70\x03\xf0\xc7\x4d\x6b\x1d\x03\x3d\x24\x75\x53\xd3\xb4\x52" + "\x85\x77\x90\xe1\x7a\x4a\xcf\x50\x3b\xde\x2f\x0b\x88\x0e\xe1\x6e" + "\xca\xe4\xb9\x86\x67\x79\x2f\xa7\x4d\x07\x6f\x0b\xcf\x52\xc6\x69" + "\xdc\x74\xcf\x77\x7a\xe9\x84\x83\x12\x6b\xfa\xd7\x9b\xc6\x65\xf0" + "\xfa\x92\x5a\x57\x1b\x5b\xef\xa3\x1b\x0b\x0c\xbc\xd8\x0e\x01\x7d" + "\x99\xd6\x55\x6c\x8f\xf0\x5e\xc7\xb2\x12\x11\x64\xbb\x04\x79\x8f" + "\x19\x6d\xe0\xf6\xe9\xed\xf2\x47\xb6\x8b\xf7\xc4\xac\x25\x8a\x06" + "\xcb\x56\x92\xc5\xae\x68\x6d\xe1\xf6\x72\x5b\xb8\xcd\xb2\x2d\x52" + "\xc7\xf2\x7c\xe2\x16\xcc\xd9\x64\x7a\x43\x8f\x6b\xdc\x64\x1f\xdd" + "\x60\x56\x3c\x35\xb6\x3e\x96\x8f\xfa\xfb\xd1\xb2\xbb\x00\x73\xdc" + "\xef\x38\x35\x71\x1c\x30\x3f\x53\x6b\x75\xe3\x3e\xd3\xd8\x16\x0f" + "\x32\xff\x1e\x3c\xca\x63\xb1\xb7\x84\xf5\xad\xcc\x7b\x19\xf2\xb6" + "\x23\xcf\x7e\x3d\xef\x7e\xb5\x47\x28\xaf\xc3\xf8\x8a\x31\x6c\x01" + "\xf0\x38\xe2\x97\x63\x3d\xec\x09\xfd\x59\xe0\x19\x57\xb7\x28\x3f" + "\x78\x34\x3e\x2e\x7b\x0b\x78\x2c\x0b\x9f\x13\x5d\xa8\xe7\x0a\xe6" + "\x29\xe7\x4a\xfa\x16\xf8\xf2\xf3\xd2\x35\x74\x19\xf3\x93\x48\x6a" + "\x38\xa6\xe8\x7e\xed\x18\xe1\x82\xdd\x0b\x8d\x5a\xb4\x9c\xbe\x0d" + "\x39\x3a\xda\x49\xd7\x4e\xcc\x2b\xb1\x03\x57\xa2\x8a\x53\x44\x52" + "\x07\x25\x35\xb4\xf1\x1c\xa7\xe6\x14\xaf\x25\x5d\x9b\x63\xf0\x22" + "\xee\xe7\x5e\x48\x5f\x80\xae\x1d\x6a\x6d\xe3\xda\xcf\x78\x5f\xe3" + "\x38\x5d\xbb\x8f\xdb\xab\xf6\x54\xaf\x7d\x5b\x9c\x13\x73\x85\x1a" + "\xd3\xda\x7c\x74\xad\x0f\xd7\x0e\xf9\x73\xd1\x3c\xfd\xb9\x0d\xf9" + "\xb6\x88\x73\x1a\xe7\x81\x7c\x5f\xbb\x57\xb8\x12\x58\x26\x0e\xa0" + "\x6e\x94\xb9\x23\x5b\xf5\xcd\xb5\xbb\x18\xd6\x20\x38\xb4\xa1\x6f" + "\x89\x79\xf3\x04\x7d\xef\x4e\x7b\x29\xaf\x95\x7e\xef\x72\x29\x17" + "\x80\x55\x63\x52\x7a\x1b\x36\x7e\xc7\x4e\x97\x56\x00\x1d\x5d\xa0" + "\x6d\xf8\x38\x53\xde\xeb\xef\x84\x3e\x8e\xc6\x87\xdf\x34\xcd\x33" + "\x9a\x79\xfc\x7b\xd5\x0a\x4e\x53\xa6\x67\x74\x27\x3f\xef\xe0\xe7" + "\x80\xe5\x93\x4c\x6f\x55\x16\xea\xef\xe4\x7a\xab\xd5\x9c\xff\x7b" + "\x3b\xba\x51\x47\x8f\xeb\x7b\xd5\x3e\x9a\x50\xac\xf6\x78\x3e\xc9" + "\x1c\x6c\xef\x9a\x65\x87\x65\x4e\xc9\xf4\x75\x8f\xb7\xd4\x4a\xf9" + "\x3b\x0c\x9e\xef\xd0\xf5\x06\xd3\x39\xe5\x38\x5d\x37\xb7\xc5\x26" + "\xf9\xdb\x24\x4c\xdf\x0b\xbd\xa7\xf9\x4d\xbc\x0f\xa7\xd4\xd7\x75" + "\x73\xcf\xff\xa5\x67\xe0\x07\x2d\x97\x3e\x43\x7f\xce\xc5\xaf\x10" + "\xbf\x03\x78\x9e\x21\x69\xb7\x3d\x3f\xc1\x87\x77\xdd\xb0\xeb\xf9" + "\xd9\x47\xe9\x99\x62\xfb\x58\x13\xec\x12\x79\x5f\xf3\x2d\x5e\x4b" + "\x48\xcf\x47\x1f\x74\xa9\xbe\xb8\x4e\xae\xa7\x00\x37\xa6\xbb\x70" + "\x56\x89\x60\x53\x69\x00\x78\xa7\x6f\x69\xaa\x0a\x90\xfd\x5a\x6e" + "\x7f\x7a\x15\xb7\x29\x00\xfa\xf3\x75\x59\x95\xf0\x37\x56\x87\x88" + "\xf7\x03\x01\x0b\xf2\xbf\xa8\x49\xad\x4b\x34\xcd\x63\x78\x3a\x4f" + "\x08\xa3\xfd\x4a\xa7\x7d\x92\xc9\x7d\x09\x58\x5f\xa0\xed\xd6\x53" + "\x74\xdd\x38\x91\xfc\x71\x66\x63\x01\xd1\x0e\xe8\x11\x8c\x35\x72" + "\x6f\xa2\x46\xfa\x23\x5c\x87\xf1\xff\x7b\x33\x8c\xfd\xab\x4d\x78" + "\xbf\x19\xef\x30\xf6\xf8\x5b\x0a\x82\xc4\xb0\xc2\xdc\x3e\x94\xff" + "\x48\xf3\x9b\x31\x56\xa3\xcf\x3f\xc9\x2c\x2d\x82\x9e\xe9\xd7\x5b" + "\xe9\xcd\x6b\x4e\x8a\xa0\xd1\xbe\xc6\x5a\x96\x85\xeb\xc0\xff\xcf" + "\xfa\x06\xe5\xff\x7e\x9c\xaf\x5f\xd9\x38\x56\xf5\x99\x06\xba\x44" + "\xf7\xd9\xf5\x0e\xd5\x5f\xd7\xed\x8d\xee\xaf\xeb\x31\xca\x5f\x17" + "\xc0\x35\x05\xbf\x31\xea\x39\xf2\x77\x9d\x2f\xe2\x79\x3c\x7e\xf9" + "\xc0\x07\xe3\xff\xb5\x05\xaa\x1f\x38\x1d\xed\x60\x1e\xf9\x27\x59" + "\xb4\xbe\x5c\xe2\xfd\x61\x4e\x67\x7e\xe6\x74\x0d\xf6\x0c\x9e\x09" + "\xef\x53\x59\x56\x2b\x34\x8a\x7a\xef\x5d\x0f\x9e\x5b\xd5\xcb\xf8" + "\x3f\xc0\xb0\xac\x6b\xdd\x6e\xe6\x53\xe4\x01\x8d\xdc\xb0\x59\xaf" + "\x9f\x6b\xd0\x15\x69\xd3\xf8\x3d\xf3\x24\xd2\x8b\x7d\x54\x68\x97" + "\xfb\xbf\x98\x13\xc6\xb7\x35\xae\xaf\xea\xb7\xc9\x2c\xef\x64\xb3" + "\x3e\xea\xa2\xef\xef\x82\xce\x42\xdf\x7e\x9c\xa1\xc6\x9a\xef\xbf" + "\xcd\xcf\xd0\x95\x9f\xe3\xbe\xb6\x05\x3a\xa9\x77\x43\x43\x56\x9f" + "\x89\x86\xf5\x9a\x28\x2b\xb4\xe1\x74\x28\x94\x5c\x3f\xc3\xdb\xb1" + "\x8f\x5a\x43\xbf\x24\xfb\x33\x12\xc6\x9b\x5e\xf0\x80\x73\xa5\x08" + "\xbf\xdf\x5b\x67\xf6\x86\x4e\x7b\x30\x36\x5f\xd5\x49\xdf\x97\xf4" + "\x78\xe5\x38\x46\xfd\x27\x24\x6c\x9d\x3e\xa7\xdb\x36\x2f\x14\xa1" + "\xcd\x27\x44\x00\xf6\x5d\xf2\xa6\x5e\x1a\xbf\x6d\x15\x65\x54\xf7" + "\xd2\xd8\x9d\xbd\x94\x2e\xfe\x9e\x6e\xaa\x86\xdd\xf6\xc4\xd9\x54" + "\x82\x4e\xc8\x1d\x51\x44\x96\x9d\xab\x48\xf2\x48\xb8\x1c\xf6\x5b" + "\x08\xf6\xdb\xe9\x74\xd6\x8d\xfd\xf6\x5b\x9f\xb4\x8b\xf7\x4f\x53" + "\x7c\xb4\x7f\xda\xf0\x02\x4a\x48\x99\x47\xa9\xc0\xcf\x79\x8a\xae" + "\xff\xcf\x94\x76\xd8\x8e\x68\xb3\x4f\x6f\x2f\x68\xd7\x65\x2d\xa0" + "\x61\xb2\xad\xd0\xd7\xa2\xfc\xe3\x8c\x41\xc7\x61\x13\xf3\x54\x80" + "\xe5\x86\xdb\xf0\x4f\xde\xa3\xde\x37\x3a\x68\x5e\x56\x2d\x82\x9c" + "\x5e\x7c\xb5\x08\x22\xbd\x8d\xeb\xae\x47\x7a\x8f\x6b\x3c\xf9\x4c" + "\xbb\x52\x06\xe3\x51\xcc\x8d\x74\xbd\x32\x7e\xad\x30\x95\xf1\x1c" + "\xdc\xbd\x26\x04\xdb\xfb\x14\xcb\xec\xf8\xb2\xd9\x85\x22\x64\x5f" + "\xcc\xfe\x02\xe3\x8b\xd8\x97\x81\xf7\x30\xdf\x83\x6d\xf3\x75\xfe" + "\x0b\x3c\x5e\xf0\x5c\xc1\x5a\x08\x98\x1b\xde\x71\x0b\x67\x3a\x7d" + "\x53\xff\x09\xb4\x33\xe5\xf5\x51\xec\xd7\x33\xfe\x80\x8f\x66\xa6" + "\x31\xee\xd2\x77\x07\xba\x13\xf6\xd6\x65\xc0\x2b\x18\x00\x1d\xf0" + "\x1e\xe3\xff\xbd\x1d\xfa\x7e\xb3\x9f\xf7\x7a\x91\x86\xf1\xff\xfe" + "\xf1\x9c\x56\x7c\x35\xd9\x8a\xed\x22\xae\xde\x66\x9b\x89\xf7\xc0" + "\x01\x0f\x73\xd5\x1b\xc6\x1a\x70\x30\x4e\xed\xe9\x36\x3d\xfc\x30" + "\xd2\x32\x0d\x38\xc8\x73\x39\x9e\xb3\xfb\xf3\xa8\x32\xb9\x11\x65" + "\x1e\xee\x36\x5d\xbf\x07\x69\x85\x31\x65\x4a\x62\xca\x6c\x8c\x28" + "\x53\xa6\xd7\x53\x1b\x53\xa6\x3e\xa6\x8c\x27\x0e\x6e\x47\x63\xca" + "\xb4\xc7\x94\x09\x9c\x8f\xdb\x8d\x96\xe8\x32\x37\xda\xa2\xcb\xdc" + "\x98\x1e\x41\x4b\xf6\xe3\xc9\x40\xda\xe4\x98\x32\x33\x62\xca\xcc" + "\x35\x9e\x07\xa1\x71\xca\xb2\x1d\x64\x03\x6f\xb2\xaf\x98\xff\x75" + "\xf4\x4f\xf7\x4f\x9f\xed\xd1\xcb\x56\x9d\xdf\xae\x1b\xf7\xc6\xd4" + "\x77\x20\xa6\xbe\xe6\x38\xed\xf2\xc5\x94\xf1\x47\x97\x99\x40\x11" + "\x65\x6a\x55\x3d\x13\xd2\xa2\xcb\x4c\x18\x1b\x53\x66\xd2\xf9\x7c" + "\x35\x21\x3b\xa6\x4c\x6e\x4c\x99\x82\xaf\xa1\x05\x8f\xe3\xca\x8f" + "\x6e\x14\xdb\xca\x77\xc1\x46\x98\xf0\x07\xf6\xc5\xe0\x7d\xd7\x9f" + "\xf5\x06\x87\xf0\x7e\x20\x8f\x57\x8d\x8e\x20\xc6\x96\x09\x98\xff" + "\xdc\x92\x61\x8c\x59\xec\xa7\xc2\x32\xad\x6c\xec\x09\x55\x83\xd9" + "\xa2\xd2\xd7\x4d\xf7\x97\xe3\xba\x1a\xc7\xf0\x38\x95\x61\xee\xb7" + "\x89\x95\xcf\x1b\x29\x38\x19\x8f\x18\xfb\xbe\x35\xca\xff\x25\x81" + "\x6d\xf2\x46\x87\x2c\x93\x19\x61\x47\x73\xfd\x81\x7d\xab\x82\xe6" + "\x68\x3c\x32\x6c\x17\xc0\x23\x05\xb6\x51\x7a\x2b\xac\x22\xde\xcf" + "\x6f\xa9\x86\x0d\x04\xbb\x9f\x71\x3b\x4e\x19\xb5\xd2\x26\x5b\xdc" + "\x4b\x7c\xef\x2d\xb9\x4d\xee\xf7\x2b\x9b\x34\xa3\xad\x09\xf5\xb3" + "\xed\xde\x54\x74\x86\x7d\xb2\x30\xfe\xb2\xed\x36\x71\x48\x63\x89" + "\x9f\xf1\x3a\x62\xf8\xc5\xf8\x68\xa2\x59\xda\x1a\xee\x26\x3b\xfb" + "\x22\xb0\xcf\x4e\x63\x20\x93\xf3\x80\xff\x27\x1c\x33\xda\x8b\xb1" + "\x1e\x3c\x91\xb1\xf7\x42\x34\x53\x7d\x38\x71\x7c\x34\x4f\x0e\x01" + "\xaf\x4c\xcc\x8a\xee\xf7\x89\x39\xd1\xfd\x3e\x71\x5e\x34\x4f\x9a" + "\xc0\x93\x13\x8b\x63\xca\xac\x8f\x29\xb3\x25\xa2\x4c\xa5\x5e\x4f" + "\x5d\x4c\x99\x86\x98\x32\x87\x23\x9e\xd1\xc6\x89\x6d\xfd\x73\x1f" + "\xe9\x73\x35\xb1\x23\xe2\xd9\xb4\x45\xea\xcf\x89\x21\x23\x8d\xd7" + "\x8e\x76\x6e\x55\x3e\x3f\x0a\xde\x4d\xb6\x18\x79\x47\xfe\x9b\xc6" + "\x47\xe3\x70\xd3\xe4\x68\x1c\x6e\xea\x97\x7f\xdd\x57\xe0\x93\x13" + "\x74\xf3\x58\xdd\x57\xa0\x0b\x63\xf6\x6c\x7e\x06\xac\x2a\xe4\x07" + "\x1d\x6e\x2a\x89\x81\xb7\x31\x06\x5e\x75\xc4\x73\x2a\x9e\xf7\x46" + "\xb4\x21\x35\xd1\x46\x09\xe0\x17\xd8\x13\x37\x35\x19\xe9\x3c\xa7" + "\x04\xbe\x1d\x4e\x39\xd6\x64\xb1\x2f\xdb\xc8\xe3\x74\xd3\x07\x3c" + "\xff\xd4\x61\x46\xca\x3f\xa9\x76\xdd\x6c\x8e\xc6\xe3\xe6\xb4\x68" + "\x3c\x6e\x1e\x1b\xd1\xae\x80\x75\x2d\x3d\x60\x0d\x3d\xf8\x08\xdb" + "\x3e\xec\xbf\x29\x7d\xca\xd6\xc0\x66\x3b\xcb\xeb\xef\x41\x3a\x51" + "\x4c\x89\x5e\x47\x07\xe6\x72\xfb\xb3\x06\xe5\xa7\xe4\xa6\x0c\xe5" + "\xcb\x45\x76\xc0\x5f\x6f\xf0\xa3\xb6\xa1\x29\x43\x2b\xf7\x8c\x41" + "\x1a\xf4\xdf\xc4\x54\x65\xe7\x1e\x2a\x10\xce\xdc\x2a\xd0\x13\xf3" + "\xa2\x49\x2f\xea\xf3\x88\x69\xec\x93\xc6\x7e\xb3\x18\xe3\x53\xd4" + "\xbe\xff\xcd\xcd\x11\x7c\x1d\xb0\xaf\xba\x43\x1c\xa7\x49\xaf\xb2" + "\x0d\xc0\x32\xca\xbe\x6d\x8d\x21\x3f\xf1\xdc\xdb\x1b\xea\x94\xb6" + "\x1b\xde\x57\xaa\xb2\x93\x2c\x11\x65\xfd\xfa\xdc\xb8\x83\xdf\x4d" + "\x08\x91\xb9\x31\xe0\x27\xc0\x49\x53\xf6\xde\xa4\x57\x1b\x21\xaf" + "\x28\x33\xd9\x28\xc3\xf3\x68\xb9\x87\x5c\x4c\xe6\x1b\x4b\xc8\xec" + "\x59\x75\x5c\xc2\x36\xfc\x44\x60\x4b\x77\x79\x4b\x3a\xc8\x1b\x68" + "\xe3\xb5\x2e\xb3\xf2\x09\x9a\x54\x99\x18\x24\x4b\x77\x79\x93\xdd" + "\x87\xfb\x70\x79\x53\x3a\x70\x83\x3c\xdd\xbc\x8f\xf5\x4d\x24\xed" + "\xa6\x4f\xcf\x79\x70\xf6\xcc\x1b\x7e\xf2\xe0\xbd\x73\xa6\xdf\x66" + "\x9f\xb3\xe8\xb9\x05\xf9\x37\x2c\x79\xa1\xd8\xbe\x62\xe9\xa2\xe2" + "\x45\x8b\x9f\xb6\x67\x38\xc6\x39\xec\xf3\x8b\xd5\x35\xbd\x70\xfe" + "\xb2\xe2\x29\x7c\x3b\xde\x5e\xb4\x74\xc1\x72\x79\x7b\x5d\x32\x45" + "\x03\x59\x54\xbc\x60\xa9\x7d\x5c\xfe\x78\xfb\xdd\xf3\x17\x15\xbe" + "\xb0\x74\x41\x5c\x58\xb7\xd9\x97\x2e\x58\xba\x60\x7e\xbe\x7d\x8a" + "\x3d\x83\x21\x47\x82\x8b\xe8\xcf\x0c\x63\x1c\xe3\xf1\xab\xc2\x25" + "\x8e\xe8\xe3\x99\x4f\xf1\xcf\x2d\xf9\xe7\x8f\x65\xb7\x38\xa2\x79" + "\xee\x16\x77\x34\xcf\xdd\x52\x75\xfe\x58\x76\x4b\xcc\xf8\x77\x4b" + "\xcc\xf8\x77\x4b\xf3\xf9\x63\xd9\x2d\x31\xe3\xdf\x2d\x31\xe3\xdf" + "\x0f\xfa\xc7\x3f\xf0\x92\x6f\x9d\xd4\x0b\x3f\x88\x19\xff\x7e\x10" + "\x33\xfe\xfd\x60\x52\xcc\xf3\xb4\x88\xe7\xcb\xf0\x3c\x27\x72\x7c" + "\xc4\x73\xbe\x21\x9f\x03\xfa\xe5\x07\x0e\x23\x0f\xeb\x7a\xe8\xe6" + "\x76\x3d\x6f\x65\x44\xde\x0e\x3d\xef\xae\x7e\xf9\xe3\xbd\x6f\xa4" + "\xab\xf9\xfa\xad\x49\xac\xd3\xd9\xff\x8f\xc7\x26\xc8\xc7\x55\xa7" + "\xe8\x07\x6b\x19\x16\xf3\x30\xfb\x83\x8a\x9f\x3e\xd6\x53\x33\x92" + "\x2c\x5c\xa6\xe6\x35\xf6\x23\x9e\x54\xcd\xbe\xc1\x48\x63\x5f\x69" + "\xe8\x94\x5b\xd9\xfe\x3d\xa6\xc6\x8b\x5b\x73\xa4\xcd\x8f\x32\x3a" + "\x7c\x39\xaf\x01\x1c\xf6\x3d\xb6\x54\xa8\xb1\xb8\x1d\xf7\x29\xcc" + "\xd3\x28\x6f\x16\xa6\x49\x9f\xb3\xcf\x35\xd2\x52\xf1\x4b\x03\xbc" + "\x1c\x03\xde\xfa\x51\xf1\x6d\xcb\x58\x3b\xb7\x7f\x3e\x68\x22\x6b" + "\x85\x4b\x6b\xf3\x6a\x6c\x5b\xdf\xba\x5e\xad\x2d\x34\xcc\x13\xae" + "\x43\xb9\x35\x48\x8f\x3f\x4f\xba\x15\xf6\xdf\xad\x0e\xb5\xde\x72" + "\x2b\xfa\x7f\xe6\x2e\xb5\x76\xda\x30\x0f\xfa\xb6\xf7\x04\x65\x2e" + "\xc0\xb5\x0f\xd7\x7b\x0d\xf8\x1e\x39\xdf\xbe\xb5\x5d\xb8\x12\x1e" + "\x62\xb8\x31\xe9\x21\xe8\xb7\x5e\x6b\xa8\x2c\xf7\xfc\x77\x99\x36" + "\xe1\x4a\x7c\x30\x4e\x3a\xfb\xe6\xf6\xfa\x28\x33\x9f\xf1\x8d\x48" + "\xcf\x16\xae\x11\x73\x38\xbf\x8f\xeb\x43\x99\xc1\x6c\x6d\xc3\xdf" + "\x57\x9d\x19\xc8\xdc\x12\xd3\x8e\xaf\x4e\xd0\x0f\x2f\x55\xed\xf8" + "\xe1\x73\x31\x75\xef\x8d\xdf\x8e\xcc\x26\xb4\xe3\xab\x41\xda\xe1" + "\x93\xb4\x35\xa1\x2d\xa6\xf3\xde\x85\xd0\x96\xaf\x24\xdd\xa3\xd2" + "\x7f\x98\xa6\xdb\x42\x01\xcc\xc3\x52\xf1\x4e\x96\x7d\xa8\x64\xa0" + "\xdf\xf4\x7c\x93\xad\x55\x94\x73\x7e\x9d\x3f\x9c\x23\x5c\xc3\x1e" + "\xf2\xd1\x0f\x37\x4a\x38\x03\xe9\x85\x0a\x17\xd0\xc9\xc4\x74\x42" + "\x7b\x50\x6e\xb0\xfe\x36\xe6\x25\x6a\x2d\xe4\x87\x90\xff\x4c\xc3" + "\xef\x36\xb0\xac\x44\xf8\x0d\x3a\xe2\x5d\x5b\xcc\xbb\x60\xc4\xbb" + "\x40\xd4\xbb\x35\x46\xfa\x6d\x29\x46\xfa\x37\xeb\xa7\xdb\x26\xc7" + "\xf4\x13\xfa\xe7\xb6\x96\xe8\x76\xdf\x36\x43\xb5\x0f\x7d\x74\x1e" + "\xad\x6f\x2b\x40\x1f\xf5\xc5\xef\xa3\xdb\xd6\xc7\xe7\xb5\xdb\xe4" + "\x3a\x9a\x18\x49\xf1\xe0\x35\xa0\xef\xfa\x24\x0f\xea\xfd\x74\x7e" + "\xff\xdc\x76\xcc\xe8\x9f\x6f\xd6\xc6\x1f\xd9\x63\xda\x18\x3e\x41" + "\x3f\xda\xa1\xda\xfa\xa3\x93\xd1\xb0\x7f\x94\x19\x9f\x17\x7f\x94" + "\x83\x76\x86\xe3\xb7\xf3\x47\x85\x83\xf3\xe2\x8f\xdc\x68\x4f\xf8" + "\x7c\x5e\xfc\x51\xad\x2a\x43\xf1\xca\x1c\x10\xae\xb8\xf5\x1c\x75" + "\x86\xd8\xce\x9d\x9c\xc2\xeb\x4b\x11\xe9\x5d\xd1\xfc\x87\x36\x70" + "\x39\xa6\x5f\x48\xe9\x59\xee\x87\x13\x76\x32\x7d\x1d\x4f\xf6\xb8" + "\x26\xcf\x88\xa1\xd5\xe9\x13\x34\xb9\xa5\xdb\x94\xb0\x4b\xd1\x6b" + "\xca\xab\xd1\x38\x4d\x2e\x88\x4f\xaf\xc9\x65\xa0\xd7\xe9\xf8\xf4" + "\x9a\x5c\x3d\x38\xbd\x26\x73\xff\x9f\x3e\x9f\x5e\x93\x8f\x44\xd2" + "\x0b\xb6\xae\x6c\xdf\x77\x6d\xe0\x8d\xbe\x3c\x51\xc3\x6d\x0d\x53" + "\xaa\x15\xbc\xa2\xca\x74\xa1\xcc\x14\xb3\x35\xa8\xf8\x04\x36\xa4" + "\xe5\x14\x4d\xee\x32\xe4\x7f\x44\x15\x0d\x13\x7d\x8f\xb1\x9f\x51" + "\x02\x97\xf3\x3a\x4e\x7b\xbc\xa1\x0c\xe2\xf9\x47\x74\xbd\x53\xb2" + "\xe3\xeb\x82\x29\xd0\xe9\x89\xaf\xc5\x49\x77\x28\x5f\xb3\x29\xf5" + "\xd1\x3a\x62\x4a\x65\x74\x1f\x81\x6e\x28\xa7\x6f\x3b\x7d\xed\xef" + "\xc2\x7d\x76\x3b\x9d\xdf\x67\xb7\xbf\xa5\xfa\xeb\xf6\xb5\xd1\xf8" + "\xdd\x6e\x8b\xdf\x5f\xb7\x67\x0c\xde\x5f\xb7\xcf\x18\xbc\xbf\x6e" + "\x2f\xe0\xfe\xf2\xd1\xed\xb5\xd1\xe3\xc6\xed\x65\xd1\xed\x45\xbd" + "\x28\x27\x4c\x43\x2f\xe3\xe7\x6f\xda\x6e\xe3\xc7\x3a\x8e\xfb\x8a" + "\xcf\x31\x01\xff\xab\x19\xc7\x8b\x85\x31\x28\x6c\xd0\xb0\x72\x55" + "\xfc\xfd\x56\x9e\xe3\xb6\x62\x26\xce\xfb\xc8\xf6\xef\xb0\xed\x7e" + "\xc7\x0b\x9a\x89\xda\x70\x6f\x3a\x41\x77\xde\xa9\x99\x4c\x25\xbc" + "\xe7\x29\xfd\xe4\xe5\x1a\xc2\x1d\x1b\x23\xfb\x82\xf7\x3e\x79\x6e" + "\xba\x59\xcd\x9d\xfe\x76\x82\xb2\x2e\x57\xfd\x72\xe7\xd5\xd1\x74" + "\xbc\xa3\x3e\x7e\xbf\xdc\x71\x18\xfd\xf2\xb7\xf8\xfd\x72\x47\xfb" + "\xe0\xfd\x92\xc5\xeb\x87\x7f\x3b\x5f\x8e\xb2\x6c\xba\x1c\xad\xe3" + "\x32\xf6\xc5\x3c\x1f\xcf\x2a\xe7\x3c\xb8\x87\x8c\x64\x3d\xcf\xef" + "\x6f\xe8\x32\xe4\x48\x96\xe1\xb3\x28\xb2\x7e\x3d\x4f\xb6\x0e\x23" + "\x12\x6e\x91\xb5\x2b\x9e\x9c\x64\xb9\x39\xef\x8d\x45\x64\x01\x0d" + "\x73\x77\x30\x8c\xa5\x44\x80\xf1\x17\xce\xc7\xe9\x37\x06\x22\xe5" + "\x24\xab\xc1\xc8\xc7\xba\x4e\xcf\x5b\x2f\x7a\x0a\x88\xf3\xc5\xc0" + "\xd6\xdb\x3f\x4c\x8e\x23\x9c\x9f\xf3\x45\xe7\xb9\xd3\xa2\xe4\xf1" + "\xce\x19\xd1\xf2\x78\xa7\x3d\x9a\x3f\x41\x7f\x94\xd3\xa0\xe7\x70" + "\x5f\x0c\x1c\xbe\x31\x7f\x5d\x58\x36\xef\xac\x8e\x91\x4d\xf0\xc0" + "\x5d\x53\x14\x0f\xdc\x75\x65\x0c\xae\xfb\xe2\xf3\xc0\x9d\xcd\x83" + "\xf3\xc0\x9d\x1d\x83\xf3\xc0\x5d\x66\xe6\x01\x1f\xdd\x35\x39\x5a" + "\x36\xef\x1a\x13\xdd\x76\xd4\x2b\x65\x93\x2e\xbd\x18\xd9\x84\x2d" + "\x74\xd9\x60\x72\xc8\x32\xc5\xfe\x23\x35\xbd\xc6\x5e\xc7\x37\xa2" + "\x99\x05\x72\xc5\xf8\x1d\xe1\x35\x25\xe8\xf8\x4c\xa6\xe1\x4e\x79" + "\xfe\xf3\xae\xf6\x48\x3a\x6e\x56\x67\x2e\x9d\x27\x68\xea\x22\xde" + "\x57\x56\xf4\x9c\x36\x31\xba\xfd\x53\xcd\xf1\xe9\x39\x75\x0c\xe8" + "\xe9\x8c\x4f\xcf\xa9\x99\x83\xd3\x73\xea\x1c\x3e\x93\x75\xbe\x4c" + "\x4d\x2d\xb4\x2f\x97\x36\x8a\x2c\x73\x8a\xa6\x7e\xfa\xcd\xc6\xa7" + "\xa9\xbb\xa2\xc7\xa7\xa9\x1b\x2f\x7e\x7c\x9a\xda\x11\x7f\x7c\x9a" + "\x46\xf1\xc7\xa7\x69\x36\x25\x0f\xd3\x72\xa2\xe5\x61\x5a\x46\x34" + "\x4f\x80\x76\xff\x6b\xe3\xd3\xb4\xda\x18\x19\xa8\x38\x41\xd3\xaf" + "\x86\x4d\x51\xa6\xfa\x6d\xfa\x17\x31\x38\x1e\x88\xdf\x6f\xd3\x8e" + "\xa2\xdf\x2a\xe2\xf7\xdb\x34\xff\xe0\xfd\x36\x3d\x05\xfd\x56\x71" + "\x7e\xbf\x4d\x1f\x7b\xf1\x36\xc5\xf4\xdc\xe8\x3e\x9b\x9e\x75\xf1" + "\x7d\x36\xbd\x3a\x7e\x9f\x4d\xdf\x17\xbf\xcf\xa6\x37\xab\x3e\xbb" + "\xdb\x1c\xdd\x67\xd3\xdb\xa3\xfb\x0c\x74\xfb\x1f\xf6\x19\xfa\x27" + "\x5f\xf9\x27\xdc\xbd\x00\xf3\xf6\x61\x3d\xae\xbb\xe7\xfa\xe8\x9e" + "\xb1\x6a\x6e\x7d\x8f\x1a\x3b\x54\x1f\xbe\x8f\x3c\x39\xe7\x8f\x03" + "\x77\x3b\xf4\xb4\x9f\x9c\xdf\x0f\x77\x6f\x81\x8e\xee\x6a\x2a\x91" + "\x7b\x5b\xaa\x0f\x99\xe6\xc8\xe7\x59\xc5\xfb\x53\x77\xef\xe3\xb2" + "\xe8\x63\xe1\x0d\x86\x88\xf5\x3a\xf2\x07\x18\x0e\x9f\x45\x8d\x81" + "\xe5\xbb\x98\x31\xfe\x02\x3e\x35\xf9\x9e\xd2\x9b\x00\xef\x9e\xb3" + "\x8a\x57\xef\x89\xb5\x7f\x6b\xf0\xee\x33\xc5\xa7\xf7\xbe\x11\x8d" + "\xc3\x3d\xf9\xf1\xf9\xf4\x9e\x12\xb4\xa1\x26\x3e\x9f\xde\x53\x35" + "\x38\x9f\xde\x83\xfe\xa7\x9a\x88\xb9\xcf\xc8\x27\x42\xbe\x98\xb9" + "\xcf\x3d\x6d\xd6\x80\xe2\x1d\x69\x13\x95\x37\xe4\xf7\xb8\xb2\x63" + "\xed\x3f\xf4\x4d\xf6\x1a\x1d\xe7\x17\xa2\xcb\x67\x0f\x62\xff\x65" + "\xb3\xfd\xf7\x7e\x7c\x9c\xb3\x2f\x60\xff\x65\xb3\xfd\xf7\xfe\xf9" + "\xb2\x95\xad\xdb\x7f\xf1\xe6\x78\xd9\xd5\xf1\xfb\x3f\x3b\xa6\xff" + "\x29\xb7\x18\xf3\x61\x59\x3e\x3a\xdf\xb1\xc8\x7c\xec\x9b\xc4\x79" + "\x99\x47\xce\xcf\x7b\xaf\x25\x16\xe6\x20\xf9\x32\xce\xe3\x3d\xf6" + "\xa5\x8a\xcb\x7b\xf7\xea\xe7\x49\xee\xdd\x17\x2d\x8f\xf7\x16\x47" + "\xcb\x63\xb6\x2d\xa6\xdc\x96\xe8\xf7\xe0\x9f\xff\x35\x1d\x7b\x9f" + "\x39\x86\x07\x0e\x9d\xa0\xfb\xd6\x2a\x1e\xb8\xef\x3f\xa3\xf1\xb8" + "\x6f\x4c\x7c\x1e\xb8\x6f\x12\xda\x7f\x28\x3e\x0f\xdc\x97\x33\x38" + "\x0f\xdc\x57\x08\x5a\x1e\x8a\xe4\xdb\x87\x4a\xb2\x86\xc5\xe4\xa9" + "\x8c\xaf\xf3\xee\xab\x8b\xbf\x46\x70\x9f\x47\xd1\xf8\xbe\x60\x34" + "\x8d\xef\x6b\x8b\xa6\x21\xda\xf2\x3f\xa7\x61\x7f\xfc\x89\x1e\xd7" + "\xfd\xb1\xf2\xef\x3d\x41\xf7\xeb\xf2\x3f\xe3\xe3\x68\x1c\xef\xcf" + "\x57\xb8\xc4\x5b\x17\xb9\x9f\xe7\xbf\xde\xf8\xb4\xbc\xbf\x3a\x7e" + "\x9b\xef\xdf\x87\x31\xc8\xab\x9d\x27\x4b\xf7\x37\x23\xfd\x21\x5e" + "\x0f\xe5\xf5\x90\x9d\x48\x7f\x28\x44\x16\x39\x5e\xf5\x8f\x4b\xf7" + "\xfb\xd9\x17\x85\xe9\xcf\xfc\x6b\x1d\x43\x39\x3c\x06\x31\x5e\x79" + "\x25\xd2\x6f\xc1\xba\x9e\x79\xfd\x1a\xe6\xf5\x19\xd2\xfe\xe3\x7d" + "\x16\xf6\x23\xb4\x3a\x28\x87\xe3\x60\x18\xfc\xce\xf9\xa3\x61\xcf" + "\x98\xc1\x72\xc1\xf9\x8d\xbc\x6a\xdd\xac\x2c\x46\x37\xcd\x28\x8e" + "\xdf\xc7\x33\x36\x0e\xce\x3b\x33\xea\x54\x3f\xcf\x38\x16\xdd\xcf" + "\x33\x3c\x9a\x6b\xc4\x1c\x6e\xab\x0f\x74\xbe\x98\x3e\x2e\xb6\x0b" + "\xff\xa0\xfa\x7e\xdd\x63\x6d\x45\xa5\xf4\x9d\x4e\x9a\x39\x4d\xd6" + "\x67\x12\x41\xeb\xda\x04\x6a\x92\x3a\x60\xe6\x9b\x12\x4f\xe4\xc9" + "\x0b\x91\x49\xac\x7b\xb6\x8d\xdf\xd5\xb8\x44\x10\xf9\x8e\xf0\x9e" + "\x00\x9f\xe5\x06\x2f\x5c\x76\x9c\x66\x3e\x1e\x55\x1e\x23\xb3\x57" + "\xc1\xa8\xaa\x91\xf2\x38\x73\x8b\xb1\xa6\xbb\x1e\xcf\xf1\xd7\x7d" + "\x67\x36\x18\xbe\x0f\xca\x67\x6c\xe6\xa0\xfb\x97\x8c\x13\x9f\xa7" + "\x61\x9c\x2e\xac\x07\x66\xa5\x18\xfc\xab\x7c\x2d\x67\x8d\x19\xf0" + "\xe5\x9b\x95\x8e\x77\x47\x2e\xb0\x36\x18\x21\x07\xb3\xe6\x44\xc2" + "\x51\x31\x58\x66\x15\x18\xfe\x78\xb8\x2f\xfe\x1a\x58\x06\x3e\xd5" + "\x31\xf8\xec\x85\x9d\xb2\x5e\x87\xd1\x70\x21\x18\xdc\xe7\x8a\x67" + "\x99\x1f\x66\x1d\xb9\xd0\x9a\x5f\xa2\x8d\x72\x5e\x3f\x8f\xb7\x66" + "\x4b\x7b\x89\x61\x5c\x18\xc7\xd9\x59\x51\x73\x0b\xb9\x77\xcf\x7b" + "\x5b\x39\xc3\x95\xdc\xcf\x8e\x59\x23\x9c\x3d\x57\xfa\x53\xe9\x72" + "\xff\x44\x28\x56\x0e\x66\x97\x18\x63\x74\x4c\xfa\x16\x43\xee\x31" + "\xaf\x65\xb8\x31\xeb\xac\xb3\xf7\x29\x59\xc8\x49\xd1\x92\x22\xe7" + "\x6b\xb3\xa5\xfd\x67\xac\x97\xfa\x90\x2f\xa6\x5c\xcc\xfa\xdf\xec" + "\xb9\x62\xf0\x75\xfa\x14\xf4\x6f\x80\xf7\xb6\x54\x6c\x88\x9c\xc9" + "\x31\xeb\x15\xfe\xcd\xf2\xbc\xff\x9f\xb9\xfd\xba\xde\x7b\xe0\x83" + "\xe8\xfa\x72\xe6\x3a\x4f\x5e\xa8\xfd\x39\x83\xb4\x3f\x67\xa0\xfd" + "\x8b\x25\xdc\x98\xb5\xc4\x1c\xd9\xfe\xf0\x79\xfa\x2f\xa7\x19\xfa" + "\xcb\xa0\x1b\x6c\xee\x07\xc6\x19\xb6\x3a\xaf\x1f\x0c\x6e\xab\x3f" + "\x30\xb0\xfe\x27\xcb\xe5\x0c\xac\xff\xf9\xe3\xd9\xea\x3e\x92\x7b" + "\xab\x51\x75\x3f\x90\x6d\xad\x8e\xd7\x96\x07\x06\x59\xff\x7b\x40" + "\x5f\xff\x7b\xe0\x48\xb4\x3e\x7b\xa0\x32\xba\x0f\x73\x62\xfa\xf0" + "\x81\xfa\xe8\x3e\xcc\x99\xfb\xdf\x1d\xd7\xf0\x4c\x89\x89\x89\xa6" + "\xc4\x04\x53\x42\x22\x5e\xa3\x89\x34\x2c\xd1\x9c\x38\x04\xbf\xa1" + "\xfa\x75\x98\x29\xd1\x64\xc6\x6f\x88\x7e\x1d\x1a\xf3\x3c\x8c\xcb" + "\xe2\x67\xd6\xaf\x43\x62\x9e\x87\x7e\xcd\xfb\x61\x7a\xbd\x46\xfd" + "\xe6\x98\xe7\x21\x5f\xf3\x7e\xe8\xff\xb0\x3c\x9d\xf7\x1c\xed\x87" + "\x76\xef\xe2\xe5\xf3\x0b\x17\xe5\xcb\xfd\xe2\x05\xf6\xf9\x4f\x3d" + "\xb5\x60\xd9\x32\x7b\xf1\x12\xfb\x5d\x77\x3e\x78\xd3\x6d\x76\xb5" + "\xed\x5c\x38\x65\x5c\x7e\x32\xcd\x5c\xb1\x94\x5f\xcc\x7c\xe8\xde" + "\x5c\x7b\xce\x5d\x77\x46\xbf\x34\xc0\xc8\xed\xe5\x0b\x41\x89\x90" + "\xbf\xac\xf2\x51\x44\x1b\xb7\x4a\xdd\xd3\xce\x7e\xbe\x6a\xcd\x23" + "\x77\x62\x33\xfb\x8f\xf6\x3a\x85\xe7\x1a\xde\xd3\x7f\xe8\x4f\xdc" + "\x88\x1b\x6a\xcb\xa8\xe8\x49\x3e\xbf\xf2\xd0\x3f\xc5\x41\x3f\xd9" + "\xef\x23\xd3\x71\x7a\xfc\xce\xa6\x6c\xe4\xc5\xb3\xd7\x17\x22\xbb" + "\x93\x2c\x27\xe8\x27\x9f\xe3\x5d\x82\xb8\x5d\x43\x5a\x40\xf7\x85" + "\xfe\xf1\x3f\x65\xda\xc1\x32\x23\x9f\xf5\x04\xcd\x79\x43\x1c\x14" + "\xf2\x99\xcf\x07\xa9\x7c\x73\x16\x09\xd3\x43\xe9\xac\x1b\xaa\x47" + "\x92\x99\xf7\x42\xdf\x1c\x49\x96\x37\x47\x71\x8c\x94\x39\x73\x8d" + "\xbd\xd0\x72\x3c\xfb\xe8\xf1\x2c\xae\x9b\xf3\x6a\xa6\x87\x1e\xe4" + "\xfc\x3b\xa3\xf3\x6f\x1c\xd8\x8b\x9d\x33\xd7\x84\x7c\xb3\x3f\x27" + "\xab\x35\x2c\xfe\x19\x4c\xae\xcf\xba\x31\x9b\x12\xbc\xe8\x8a\xe6" + "\x50\x19\x29\x9f\x9f\x39\x7f\x5a\x19\x16\x21\xf6\x4f\x9f\xd9\xe5" + "\x14\x15\xcf\x91\x19\x32\x9d\xe0\x59\xca\x3e\x0a\x73\x0e\xd4\x2c" + "\x20\x33\xda\x3f\xa6\x93\x1e\xee\xb2\xcf\x22\x72\xce\x24\xf3\xef" + "\x1d\xec\x6f\xd8\xf0\xd7\xcd\x7f\x24\xf3\x3b\xbd\x65\xa6\x5e\x61" + "\xa3\x92\x62\xd1\x21\x38\x6e\x52\x40\x04\xd9\xc7\xbf\x79\x5e\x98" + "\xf3\xb4\xf6\x38\x6d\xd4\x5a\x1c\xa0\x35\xc7\x44\xd0\xfd\x47\x75" + "\x36\xa0\xa5\x2b\xc0\xfe\x8b\x96\x35\x33\x29\xf1\x44\x2e\x99\x5a" + "\x0a\xaa\xc8\x3b\x37\x40\x25\xc7\x44\x47\xf3\xbc\x2f\xa8\xb5\xa0" + "\x9e\xf2\xda\xc8\xd4\xdc\xfe\x17\x92\xb1\x7f\x36\x9c\xf6\x97\x9e" + "\x25\xdb\x9a\x45\x9c\x76\x96\x56\xad\xa1\xe1\xab\xfe\x44\x56\x6f" + "\x47\x1b\xea\x39\x49\x8f\x1e\xa5\x04\xc0\x33\xad\xfe\x0b\xd9\x56" + "\x3f\xc2\x7e\xbe\x59\x54\x5d\x4a\x36\xe1\x4c\x4f\xe9\x75\xa6\xa7" + "\xf6\x8a\xf4\x91\x3d\xce\xf4\xb4\xd6\x22\xe4\x6f\xff\x88\x46\xb4" + "\x51\xda\xc1\xce\x36\x53\xd5\x19\x1a\xc3\x6d\x3a\x81\xb6\x55\x9f" + "\x41\xfe\x0d\x9f\x16\x69\x28\x1b\x59\x26\x94\xf4\xa9\xdb\x9b\x1b" + "\x24\x0d\xb0\xaa\x7a\x69\x4c\x75\x2f\xd9\xb4\xf2\x4f\x8b\xb8\x5c" + "\x17\xfd\xf8\x4b\x2f\x46\x86\x92\x35\x22\xdc\xb7\xa1\x21\x0b\x3a" + "\x71\xd8\xfb\x4f\x36\x98\xbd\xcd\x5d\xd4\x12\xe8\xa5\x56\xfa\x33" + "\x79\x1d\x7f\xf7\xbc\xf3\x64\xc3\x10\x0d\x42\xe0\x59\xd5\x8e\xba" + "\x14\xef\x38\x5b\xc8\xec\x45\x1f\x54\x94\x52\x4a\xd1\x2a\x1a\xd6" + "\x89\x74\x35\xb7\x7f\x27\xdb\x1b\xfa\xbb\x67\x95\xf4\xc7\x7d\x3c" + "\xab\xb4\x85\x12\x5b\x03\x55\xec\xf7\x69\x0a\x27\x9f\xf6\x7b\x03" + "\x47\xc8\x5b\xf4\x37\x8f\x66\x39\xdd\xb6\x51\x23\xcb\xbb\xe7\x8e" + "\x98\xbc\xe6\x73\xe4\xcd\x0d\xd0\x21\xd4\x2d\x36\x9c\x66\x5f\x80" + "\xac\xd6\x40\x90\xcf\x3b\x65\x88\x6e\x5b\x72\xc5\x52\x1a\xbf\xf3" + "\x0c\x8d\xdd\x71\x86\xd2\x45\x4f\xba\x89\x7d\x6c\xf9\xfc\xea\x0e" + "\x5c\x53\xda\xc9\x82\xb6\x2b\x7f\xec\x24\xdd\xd7\xb6\x2f\x9d\x6a" + "\x7a\x07\x7c\x6d\x7b\xbb\x07\x7c\x6d\xc1\x53\xf3\xd8\xdf\xd6\x47" + "\x0f\x07\xac\xcd\x34\xec\x38\xcd\xb1\x31\x7f\x57\x9c\x22\xf3\xba" + "\x53\x44\x37\x96\x99\xc8\xbe\x90\xcf\x59\xfc\xe4\x4f\x5e\xf4\x0d" + "\xdf\x1f\xa7\x9f\x6c\xc4\x35\x05\xbf\x04\xa4\xaf\xe5\x76\xb6\xeb" + "\x7c\x8c\x34\x13\xd2\x5e\xc0\x35\x11\xd7\xe7\x9c\xd5\xc2\x8f\xba" + "\xd8\xb7\x29\x99\xf9\x59\xf7\xef\xad\xea\x71\xfd\x24\xdf\x47\x8b" + "\xf3\x0d\xbe\x56\x3a\x7e\xce\xbc\x43\xc7\x4f\x72\x7c\x2e\xbf\xc4" + "\xab\xaf\x20\x81\x63\x75\xe9\xe9\x8c\x43\x0b\xd7\x8b\xfa\xeb\x71" + "\xb5\xe2\xc7\x72\x3a\xcd\x28\xdb\xdd\x57\xc0\x75\x7e\x8a\x74\x61" + "\xa4\xa3\xdd\x66\x7e\xf7\xab\xe3\x27\x4d\x2a\x4f\xba\x09\x30\x83" + "\x3a\x7c\xc8\xfe\x1c\x33\xcb\x78\xb7\xc9\x2a\x1a\xe7\x4d\xa2\xea" + "\xad\xa2\x79\xc7\x56\xd1\xa4\x64\x2f\xd7\xe2\xa3\x22\x0b\xe3\x88" + "\x71\xbc\x69\x23\xde\x35\xda\x89\x98\x2e\x4d\xf9\xec\x4f\x96\x0b" + "\xfb\xef\x92\x03\x91\x6d\x10\xae\x07\xa5\xad\xff\x5e\xe9\xe1\x21" + "\xd0\x01\x96\xd6\xf6\x2e\x7a\xa7\xb7\x63\x88\xf3\x33\x32\x79\x43" + "\xc7\x69\x42\x1a\xd9\xd8\x1e\xac\xd9\x2a\x7c\xaf\x73\x3c\xc0\xad" + "\xa2\x0b\xfc\x72\x65\x27\xe5\xbe\xf0\xfd\x34\x4a\xfb\x0f\x8c\x76" + "\x4a\x3f\xe5\x6e\x8a\xd0\x4f\x97\xb7\xf8\x1a\x22\x74\xd3\xdc\x4f" + "\xcf\xd7\x4d\x8f\x7d\xac\x74\x13\x64\x5f\xea\xa2\xb0\x4f\x4f\x7f" + "\x37\x26\x5d\xf7\x13\x79\xec\xd5\x98\xf4\xa0\x9e\xbe\x26\x26\xdd" + "\xaf\xd2\x1f\xfd\xc8\xd0\x7d\xad\x8c\xc7\x0a\xd6\x7d\x8f\xbe\xc5" + "\xba\xaf\x75\x9e\xae\xfb\xa4\xfe\x79\xf4\x45\xf1\x6f\xd0\x45\xcb" + "\x59\xdf\x3c\xfa\x38\xe3\x2f\x0e\x92\x81\x7b\x12\xd2\xae\xe4\xb4" + "\xca\x3f\x93\x19\x3f\x43\xef\x2d\x61\xbd\xc7\x3a\x8f\x75\xdf\xf6" + "\x51\xa2\x6d\xfb\x56\x71\xb4\x5a\xc6\x1a\x7a\xa4\x5f\xff\xbd\x82" + "\xb4\x8d\x48\x7b\x05\xef\x59\x0f\x32\x4d\x5a\x72\x1b\x88\xfd\x4f" + "\x60\x6b\x1d\xd3\x4c\x19\xb4\x19\xfd\xcd\xe7\x0d\xd7\x83\xbe\xd6" + "\x04\x2a\xf2\x16\xf3\xf9\xd5\x30\xfb\xa4\xb5\xb7\x16\xb7\xb3\xdc" + "\x8d\x5a\x07\x39\xe3\xf3\xd2\xa5\x01\xd1\xc9\xe7\xee\x18\x87\xbc" + "\x95\xf7\x71\x7c\xa6\x84\xa6\x02\x22\xf6\x0b\x67\x9d\x0d\x5c\xcc" + "\x95\xc0\x49\xc5\x83\x79\x34\xcd\x47\x6f\x4f\x53\x7d\xfd\x78\x16" + "\xc7\x81\x3b\x4e\x8f\xe4\x62\xbe\x17\xe4\xb6\x59\xc3\x65\xc4\xe7" + "\x60\x38\x36\x22\x5f\xb7\x9b\xb4\x82\x4a\xe3\x2c\x8c\x0b\xba\x01" + "\x79\xbc\x6d\x41\x62\x9c\x7d\xf4\xc8\xae\x96\x92\x06\x2e\x9f\xcd" + "\xb4\x11\x2e\xa7\x01\x23\x41\xc2\x30\xc9\x79\x23\xe6\x06\x8f\xaa" + "\xb5\xf3\xe4\x86\xac\x96\xb9\x7e\x62\xbd\xef\xed\x00\x8c\x92\xe3" + "\x0a\x06\x60\x09\x8c\x01\x51\xef\x74\xf8\xc3\xd7\x88\x7f\x02\x7e" + "\x1a\xf7\x17\x9f\x8b\xe4\xfd\x36\xd0\x25\x85\x7d\xe5\x95\x2d\xfa" + "\xc8\x8e\x9a\x3f\x13\xe9\x67\x3b\xc1\x6f\x8f\x54\xf3\xb9\x25\x3e" + "\xcf\x79\xa1\xb3\x9c\xa0\xd1\x58\xe3\x3c\xa7\xb6\xe2\x7f\xf7\x2c" + "\x27\x60\xdb\x76\x9a\x44\x3d\xf0\xaf\xe6\xf3\x9c\xc7\x29\x37\xc4" + "\x7c\xa8\xb7\xa9\xf6\x8d\x47\x99\xe6\xb9\xed\x9c\x86\xb9\xe3\x61" + "\xa3\xff\xb9\xbd\xdc\x16\xbc\x3b\xac\x6c\x44\x71\xc4\x47\x8f\xd5" + "\xf2\x7b\xa4\xed\xe3\xfc\x13\xa0\xc7\xbc\x18\xc3\xde\x3f\x1e\x36" + "\x55\xac\x22\xb3\xd2\x69\x73\xf7\x73\x79\xa5\xd3\xe6\x16\x0d\xe8" + "\xb4\xb9\x0b\x94\x4e\x53\x34\x56\x3a\x6d\xee\x23\x4a\xa7\xcd\x7d" + "\x40\xee\x8b\x41\xa7\xf1\x3b\xd6\x6b\x86\x4e\xdb\x31\x4a\x1c\x66" + "\xdd\xd1\xe3\x9a\x9b\x65\xe8\xb6\x4d\x48\x63\xdd\xc1\x38\x2a\x3d" + "\xf5\x68\x95\xf8\x7f\xd3\x49\xf9\x1d\xf0\x7d\x01\x9f\x5f\xe8\xd0" + "\xef\xd1\x2f\x73\x3f\x50\x3a\x6e\xee\x96\x01\x1d\x37\xd7\x36\x50" + "\x96\x75\xdc\xdc\xdd\x4a\xc7\xa9\xf4\x9a\x47\x59\xc7\x3d\x5a\xc5" + "\x34\xd0\xe1\x9b\x78\x0d\x4f\xcf\xcf\x74\xac\x8d\xd4\x71\xd1\xf2" + "\x35\xb7\xcb\xd0\x71\xac\xdb\xf0\xcc\x71\x23\xe7\x49\x79\x43\xbe" + "\x2d\xa0\xb9\x21\x77\xdc\x07\xdc\x66\x8e\xf7\xc6\x74\x9b\x7a\x92" + "\x86\xe9\x67\x87\xf4\x76\x3f\x9e\x69\xf8\x3e\xfa\x68\x6e\x56\x3c" + "\x3b\x7a\x20\x26\x23\x5d\xc5\xe7\xe6\xbd\x65\xc7\xc9\x5b\x25\xca" + "\x5a\x43\xc7\x28\xaf\x18\xba\x22\xf1\xd9\xcf\xb9\x6f\x31\xef\xf8" + "\x11\x5f\x59\xf7\x60\x2c\x5d\x93\x17\xa0\xa1\x98\xab\x7f\x5e\x61" + "\xc2\x3b\x47\xd4\x3b\xb9\xc6\x70\xe3\x52\x8e\xe7\xf7\xf8\xbc\xc1" + "\xe6\xfb\x17\x59\xdf\xc9\xc1\xeb\x7b\x22\x49\xd6\x07\x9b\x0a\x73" + "\xa0\x4b\x4f\xd1\xe3\x72\x5e\x22\x63\xe0\xac\x8b\x07\xeb\x89\x1f" + "\xea\xef\x87\x0c\xf2\xfe\x91\xaf\x29\xbf\xf2\x6b\xca\xbf\xc9\xba" + "\x08\xed\xb3\x86\x5d\xd1\x70\x46\x84\x8c\x7c\x9d\x9c\xef\x63\x7d" + "\x2d\xe6\x73\xe7\xd5\x72\x8e\x66\x33\x60\x32\xff\x6d\x46\x3e\x19" + "\x97\x05\xba\x72\x1a\x6a\x1c\x11\x88\x2a\x1b\x1e\xa0\xf1\x13\x83" + "\x9e\xe9\x64\x3d\xea\xad\x22\x19\xa3\xb6\x11\x36\x29\xc7\x4c\xda" + "\xd2\xbf\xfe\x91\x37\x07\x7a\x33\x27\xc2\x2f\xb6\x0b\x7a\xee\x2a" + "\x15\x8f\x26\x40\x15\x6a\xbe\x79\x05\xf4\xf3\x48\x3e\x0f\xc3\x67" + "\x63\xf2\xc2\x39\xa6\x46\x19\x3b\x2d\xaf\xd2\x28\x3b\xd8\x3a\x0b" + "\xd7\xab\xd7\xc9\x3e\xa6\x01\x94\x69\x32\xca\x30\x6c\xf6\x53\xc4" + "\xb8\x7c\x95\x3c\x53\x1a\xea\x62\x5d\x78\x05\x6c\xd1\x91\xaa\x9e" + "\x79\xa4\xd7\x03\x99\x79\xdc\x73\xa1\xb3\x19\x83\xb7\x6f\xde\xa4" + "\x8b\x6f\x1f\xe9\xed\x9b\x57\xf4\x35\xed\xbb\x50\xbd\x7b\x2f\xbe" + "\xde\x54\xa3\xde\x8e\x8b\xa7\xeb\xfc\x31\xdf\x9c\xae\x19\x3a\x5d" + "\xe7\xe7\x7c\x0d\x5d\xe3\xd5\xb3\xfe\x9b\xd7\x63\x37\xea\x69\x88" + "\x57\x0f\xc9\xbf\x41\xcf\x4d\x59\x8c\xd8\x9e\xdd\x90\x1d\x15\x1b" + "\xef\x49\x8a\x8c\x97\xdc\x2d\xe5\xea\xc9\xb4\xfe\xf8\xcc\x6a\xaf" + "\x1c\xba\xfa\xc9\x89\x79\xb5\x3c\xbe\x0b\xcd\x47\x4f\x4e\xe2\xb8" + "\xb1\xd3\xd6\xa8\x33\xd9\x7a\x99\xec\x0b\xc5\x69\xe6\x18\x60\x1c" + "\x03\xd0\x0b\x2d\xde\x58\xc5\x71\x4b\x9a\x72\xd8\xff\x1e\x73\x2a" + "\xe8\xf8\x27\xdf\xe0\x98\x66\xb8\x1f\xc6\xf7\xbc\x1f\x8e\x6b\xad" + "\xd2\x05\x4f\xd6\xfa\x68\x7e\xdb\xe0\x70\x9b\xe6\xed\x2a\xcd\x18" + "\x32\x98\x9f\x3d\xca\xfb\x7c\xf4\xfc\x5e\xe9\x5b\x9f\xfc\x49\x36" + "\xe6\x14\x7a\x9c\xc1\x05\x8f\xcb\xd8\x73\xce\x5c\x3e\x57\x82\xf1" + "\x31\xff\x45\xfd\x3c\x00\xe8\x52\x06\xfa\x3e\x65\x33\xe8\x62\xa4" + "\x23\x6d\xbc\x41\x17\xd8\x39\x29\xde\xda\x10\x9f\xd7\x09\xa8\xb3" + "\xd9\x4f\x3d\x20\xca\x9b\x72\x15\xec\xa7\x94\x8f\x1a\xd7\xd7\x97" + "\x6b\x96\xf3\xa7\x52\x9e\x3f\xe5\x4f\xf2\x27\x35\xe5\x1a\x78\x88" + "\x65\x36\x13\x9f\x01\x9f\x80\x31\x75\xb3\x8a\xf5\x97\xc0\xe7\xe5" + "\xe4\xfb\x65\xe9\x26\x45\x9b\xa7\x7e\x2d\xba\x39\x7e\x8c\x84\x9d" + "\x02\xbc\xe7\x32\x5c\x1f\xae\xfe\xd5\xe9\x1c\xff\x42\x6f\xcf\x53" + "\x3b\xb4\x0d\x9f\x64\x6b\x3d\x36\x93\x81\xef\x4e\x79\xb6\xf5\x29" + "\xb4\x7f\xfe\x5c\x89\xb3\xc4\xc7\x66\x62\xbf\x7e\x2d\xb9\x69\x9e" + "\x58\x6d\xa3\x7d\x4b\x3b\xe4\xfc\x89\xeb\x9c\x80\xfa\x05\xcf\x97" + "\x60\xa3\xf4\xb8\xf2\x6d\xfd\x74\x03\x5c\xd1\x63\xd0\xed\xa9\x26" + "\x35\x3e\xab\x36\x06\x56\xdb\x4c\x8d\x7e\x79\xee\x8e\xc6\xda\x9d" + "\x5f\xa9\x18\xdc\xf9\x73\x0c\xda\xf5\xe3\x04\x7c\x38\x8f\xf2\x73" + "\xca\x2f\x36\x70\x92\x32\x9c\xcc\xe7\x78\x9f\x2a\xe0\xf3\x43\x8a" + "\xfe\x8d\x29\xc8\x53\x75\x3e\xfd\xf3\xf7\x46\xd0\x3f\x91\x79\x90" + "\xe9\xcf\x6b\x1e\xa0\xed\x9f\x40\x4b\x8b\x3a\xf7\xc0\x76\x4d\xfe" + "\x5f\xf0\x9c\xc2\x78\x6a\xe5\x06\xcd\x73\xcd\x6a\xbd\x6c\x41\x6a" + "\x44\x3f\xa0\xbd\x36\xb6\xd9\x12\x8c\xf6\x73\x19\xa6\x01\xc7\xb3" + "\xe4\xba\x81\xcf\x25\x3d\xae\x05\xe9\xb1\x6d\x5a\xa7\xce\x94\x90" + "\xf2\x31\x59\x90\x1d\x11\xd3\xdc\x5f\x6c\x17\x41\x75\x3e\x39\xdf" + "\xbf\xaf\xd4\x6f\x1e\x4c\x17\x30\x0f\xca\xd8\x98\x26\xb9\xbe\x00" + "\xdb\xeb\xe9\x29\x02\xb8\xa9\xbe\x7f\xfa\x72\x95\xb6\x70\x3e\xae" + "\xe0\xb1\x05\xfb\x05\xea\xf6\x3b\x65\xac\x15\xb4\xed\xe9\x5c\xe6" + "\x39\x83\xcf\x78\x3d\x52\xf9\x8e\x2f\xbc\x92\x75\x8b\x41\x73\xe0" + "\x9f\x0c\xfc\x3a\x0c\xfc\x8d\xfc\xdc\x77\x9c\x87\xf7\x6e\x9a\xec" + "\x41\xa9\x73\xd5\xd9\xa1\x85\x69\x86\x2c\x73\x1d\xdc\xcf\xac\x73" + "\x98\x1e\x8a\x16\x0b\x27\x45\xc3\xb2\x99\x54\xbc\x4e\xe6\x79\xc8" + "\xe3\xaa\xe0\x10\xe4\xc9\x1d\x80\xb1\xe0\xa8\x7a\xd7\x8f\x27\xfb" + "\xfb\x4b\x9f\x3c\xd5\x1f\x0b\x3f\xe6\x76\x0d\xe0\xcb\xf2\xb7\xb0" + "\xbf\xff\xf9\x5d\xc0\x69\xe3\xd8\xbf\x52\xd7\x14\x5f\xcd\xf8\xfa" + "\x39\xa6\xae\xe4\x75\x1f\x2d\xb4\x30\xee\x9c\xc7\xe8\xb3\x01\x5e" + "\x5c\xe8\x8b\x84\x23\x9c\x12\x57\x09\x47\xe9\x0e\x3f\xe6\xae\x64" + "\x57\xfb\x2e\x4f\xa7\x0c\xe0\xbc\x70\xbd\x81\xcf\x80\x4e\x78\x7a" + "\x7c\x2c\x4f\x72\xdd\x1c\xb7\x4f\x87\xcd\xba\x24\xf5\x38\x3d\x6d" + "\x53\x78\x2d\xa8\xe4\x7e\x1c\x6c\x9c\xe3\xf8\x9a\x1c\x73\xf5\x75" + "\xa5\x43\xd0\xcf\x05\x6f\xbe\xae\xce\x13\x05\x54\xdc\xd5\xa7\x77" + "\x08\xd3\x5b\x4c\x2b\x5e\x57\xf7\xcb\xb8\x1d\xf2\xac\xf9\xd3\x07" + "\x78\xbf\x6e\x44\xd1\x5b\x32\xc6\xae\xee\x23\xe8\x6f\x2a\x0a\xc9" + "\xb8\x7f\xce\x62\x3e\x7b\x1b\xe2\x39\x9f\xf4\x81\x6b\x2c\x0e\xd1" + "\x43\x41\x96\x89\xa7\xbb\xf8\x4c\xbd\x8a\x5f\xfe\x74\xd0\x38\x47" + "\xcf\x31\x3b\x39\xde\x2c\xf4\x50\xe2\x40\xbc\xd8\x82\x23\x6c\x6b" + "\xe9\xfd\x4b\x9b\x4d\x42\x8f\xef\x51\x70\x27\x9f\x9b\x57\xfb\x59" + "\xc7\xa1\x13\x12\xff\x8e\xbc\x8f\xa8\xf5\x1f\x43\x47\x15\xfc\x81" + "\xf7\xb4\x7c\x3a\x8c\x1e\x57\x41\x3e\xc6\x8c\xc3\xe7\xeb\x92\x82" + "\x3b\x8d\x39\x0c\x9f\xc3\x53\xfb\x63\x03\xf0\x50\x5e\xda\xd5\x03" + "\x7d\xf0\x09\xc3\xaa\x3f\x5f\x2f\x14\x34\x19\xb2\x57\x74\x0d\x9f" + "\xe5\x7e\xda\xcd\xf5\x0f\x36\x5e\x08\xe7\x23\xdc\x4f\x96\x13\xf6" + "\xf8\x7d\x13\x7f\xbf\x6d\x51\xba\xd1\x06\x83\x26\xaa\x0d\x8b\xd6" + "\x76\x27\x37\x14\x0e\xb4\x7d\x91\x5c\x23\x8a\x78\xbf\x3f\x82\x36" + "\xfc\xdc\xa0\xc6\xb5\x45\x0e\xf0\x87\x7e\x16\x5f\xa5\x41\x76\x1e" + "\x13\xab\x73\x49\xe1\xb8\x88\x0c\x59\x47\xde\x5d\x3e\xea\x09\xaa" + "\x7d\xaf\x45\x1c\xff\x80\xf4\x72\x33\x18\x97\xb8\xed\x8c\xc2\xf1" + "\x99\x0c\xb6\x39\x54\x6c\x85\x67\x26\x32\xbe\xf6\x6b\xb9\x8f\x17" + "\x49\x5b\x57\xc6\x59\xe8\x2b\x18\x12\xe8\x4b\xa7\xee\xbe\x02\xe8" + "\x85\x74\x53\x8f\xeb\x19\xe8\xff\x73\x47\x55\x9d\xcf\x8c\x35\x70" + "\x65\xdc\x64\x1c\x50\xb1\x28\x3e\x7d\xb9\x5e\x19\xfb\xa9\x60\x18" + "\x7e\x16\xfc\x86\x7e\x53\xfb\x04\xf6\x7a\x87\xbf\xfc\x50\x8a\xb6" + "\x5c\x1c\xe6\x18\x63\x98\x93\x74\x54\x80\x7f\x47\xac\xf5\xc0\x46" + "\x7f\xdc\x94\xb7\x92\xb2\x30\x77\x26\x71\x4e\x64\xee\xd4\x70\x5d" + "\x2e\x26\x71\x7c\x73\x3c\x67\xe8\xcf\xe3\xf9\xb9\x7b\xb9\x98\x0b" + "\x9c\xdb\x8c\xbd\x42\x15\x23\xe7\x99\x8e\xfe\xb8\x42\x89\x8f\xf1" + "\xb9\x22\x8e\x3f\xa5\x61\x4e\xd4\xc1\xf5\xe6\xf1\xbc\x16\xf5\xf5" + "\xb8\x9e\x4d\x45\x3f\xcf\xe1\x7c\xfe\xc4\xeb\x47\xe2\x97\x3e\xc8" + "\x9e\x6a\x07\xe3\xd5\x9d\x74\x28\xc5\xc0\x75\x44\x20\xcb\xf4\xcd" + "\x70\x7b\xb6\xd8\xc0\x0d\xe9\x87\x2b\x54\x7a\x88\x63\x25\xb2\xcf" + "\x23\xde\x6f\x31\x70\x35\x70\xe0\xfa\xf8\x1c\xa7\x48\x6e\x70\x70" + "\x0c\x1a\xae\x8f\xe3\xb6\x22\xaf\xc7\xc0\xf7\x9b\xf2\x72\x69\xb5" + "\x10\x3c\x7e\xb2\xfe\xb5\x8f\x26\x19\x5b\xef\x04\x15\xa6\x35\x56" + "\x07\x78\xdd\x7b\x15\xea\x58\xd9\xcd\xb1\x51\xfb\x0a\xe2\xf6\x31" + "\x97\x41\xfe\x1c\xa9\x1f\x36\x34\xac\xd4\x44\x36\xf4\x04\xca\xf5" + "\x65\xf3\x9a\x13\xe4\xb6\xb0\xa4\xa9\xa4\x83\xcf\x5e\x42\xe7\x14" + "\x96\x20\x8f\x83\xed\x2c\xcc\xbb\x82\xf2\xbb\x19\xd0\x4d\x9e\xe5" + "\x93\x18\xc6\x1a\xb3\x83\xcc\x4d\x31\xf1\xaa\x06\xe3\x8f\x6e\xcb" + "\x27\x65\xdd\x1b\x3e\xc9\xed\x71\x15\xee\xf3\xd1\x73\x83\xda\x84" + "\xeb\x46\x81\x9e\xc8\x57\x39\x9a\xe7\x7d\x85\xbe\x0b\xe5\x35\xf6" + "\xad\x59\x07\x4d\xb0\x51\x8a\x48\xfa\xa4\x8c\xf5\x6d\x77\xf2\x27" + "\xb9\x3c\x96\xf4\xb8\x9e\xb3\x1b\xe5\x79\x5c\xe7\xb1\x03\xfd\x65" + "\xab\xe8\xd7\x87\xcf\xe9\xf1\x8a\x9f\xcb\x36\x64\x34\x5e\x3d\xc5" + "\xbb\x84\xe6\x1c\x47\x26\x2f\xc6\xad\x1b\x83\x94\xb2\x73\x1b\x51" + "\xe5\x2a\x11\x7c\x7d\x15\xe6\x32\xa3\xf9\x3b\x1b\x85\x1e\x96\x51" + "\xe6\xef\xcd\xe0\x97\x44\xe0\xf2\xfa\x39\xd4\x59\xaa\xf2\xe9\xfe" + "\xeb\x36\xe4\xeb\xc2\x35\x4d\x98\x4c\xb4\xa5\x94\x2c\x5b\x34\x32" + "\x57\x96\xd2\x18\xa4\xc1\xd6\x7d\xae\xd9\x90\xd9\x78\x38\x54\xec" + "\x24\x7a\x0d\xf5\xae\x2d\x15\xa1\x4f\x30\x9e\xbb\x34\x11\xfc\x26" + "\x74\xf7\xd1\xe2\xf1\xaa\x8d\x8b\xc7\x1b\x36\x21\xee\x33\xa3\xfd" + "\x0f\x16\xdb\x63\xe7\xca\x4f\x2e\x59\x52\x9c\xb7\x74\x01\x5f\xd2" + "\xc7\xbd\x70\x5d\x72\xe4\x9a\x08\x8f\x7f\x2a\x5e\xc5\xe2\x1c\x5e" + "\x7f\x7c\x7d\xa4\xb1\x9f\xbe\xb8\xd2\x58\x03\xd5\xfd\xf6\xef\xe0" + "\xb9\x1d\xcf\x81\xf0\x6e\xef\xc7\x25\x6b\x18\x4c\xc2\xe7\x16\x32" + "\xc5\xd6\xb7\x70\x7e\xf1\xfc\xc2\xdb\x78\xe7\x2c\x39\x5e\x3d\x9e" + "\x98\x7a\x82\xfd\xf5\xa8\xf1\x27\x60\xe2\x7c\x9b\x86\x56\x8a\xa4" + "\x7f\x64\xa8\x33\xd3\x4b\xc6\x18\x6b\x5b\x83\xf8\x3b\x36\x84\x37" + "\x7c\x5a\xcf\xf2\xe0\x5c\x43\xa6\x5f\xad\x6a\x33\xb1\x1d\x59\x8a" + "\x7b\x5e\x63\x90\x6b\x65\x7a\xdc\xa8\x83\x67\xda\x30\xbe\x2f\x29" + "\x12\xe5\x0d\x98\xb7\x2d\x29\x18\x6c\x5d\x21\xd2\x57\x84\x7d\x0b" + "\xdb\x69\x89\xfb\x42\xbe\x47\x9c\x9f\xdb\xc3\x3c\x1b\x53\x2e\xac" + "\xfa\x6c\x09\xf8\xbf\xb0\xaa\xff\x5c\xaf\x9e\xa7\x62\x94\x11\x8f" + "\x6b\xc9\xd1\x41\xfd\x46\xdc\x9f\xb8\x15\x8f\x17\x4d\x69\xc2\xbc" + "\x0d\xed\x7c\xf9\x38\x15\xfd\xd0\x6c\x83\x8d\x30\x9a\x7e\x81\x7b" + "\xfe\x04\x40\x02\xbf\x8b\xe2\xa3\x2b\x4f\xd6\x9a\xa1\x5d\xa0\x65" + "\x12\x84\xfa\x23\xb3\x7e\x93\x88\x9f\x49\x24\xc8\x5d\xd5\x44\xf4" + "\xe0\xb0\xa1\x66\xb2\x8e\x48\xb1\x5c\xf5\x9d\x31\xb6\x3b\x6e\x9f" + "\x9c\xe9\x2c\x2d\x81\x56\x0e\x05\xad\x22\x32\x8e\x5a\x67\xdb\xc3" + "\xd7\x95\x91\xf4\xab\x29\xef\x8c\xeb\x8f\xb1\xc9\x25\x8a\xf8\x0c" + "\xbb\x36\xc2\x44\xce\x17\xc8\xf4\x7e\xaf\xcf\xc4\xb1\xa0\xd9\x7e" + "\xe6\x38\xaf\xc0\xf5\xb3\x43\x48\x03\xbd\x1c\x62\xa3\x89\x94\xdd" + "\xf9\x7c\x92\xb6\x19\x1d\xd4\x0f\xdf\x4c\x0c\xdf\xf9\x26\x99\x76" + "\x95\x76\x98\xbc\xe6\xdb\xc9\x6b\x0f\xd0\x21\xdc\xc7\xed\x2b\xd4" + "\xc9\xb6\x2c\xc3\xa8\x71\x69\x6e\xe7\x57\x64\xd2\xcf\xa1\x9a\x4e" + "\xd1\xf3\x77\xd6\x0f\x52\x8e\xcf\x7d\x77\x27\x1f\x6c\xec\x71\x3d" + "\x5f\xe2\xa3\xbb\xf6\xe9\xb6\x0c\xc6\xdc\xe7\x37\x82\x37\xa4\xfd" + "\x89\xf7\x9f\xf0\xf7\x68\x90\x56\x6b\xe4\x89\x6f\xcf\xf0\x5a\xbc" + "\xf0\x30\x1f\x88\x73\x5f\x76\xf0\x19\x97\x41\xfc\x61\x86\x79\x1d" + "\x37\xf1\x9e\xe4\x90\x11\xd0\x3f\xce\xb3\xa2\x2f\xec\xa2\x34\x88" + "\x93\x29\x6c\xa2\xab\x42\xe7\x44\x6e\x4b\xd7\x19\x8c\x05\x47\x79" + "\x2e\x92\xf0\xde\xc2\x4f\x4c\xde\xe0\x69\x8f\x77\xbd\x46\xad\xb0" + "\x2b\xbd\xd5\xa7\x3d\x2a\xfe\x69\x98\x5a\xe8\xcf\xd4\xe2\xf8\x7f" + "\xca\xbc\x65\x7f\x46\xba\x28\x63\x3a\xf7\x9d\x13\x73\xbc\xe6\xff" + "\x43\xfc\x7d\x24\x1e\xe3\x40\x77\xfb\x29\x5a\xba\xe8\x20\xe0\xbc" + "\xff\x57\xc0\x92\xb1\xd3\xa6\xd0\x21\xdc\xf7\xb8\x96\xf6\x8f\x7f" + "\x71\x63\xce\x24\x78\x36\x59\x1d\x8f\x9b\x34\x8c\xa5\x1c\xe3\x0e" + "\x63\xe8\x24\x6e\x17\x9e\x33\xf8\x19\xd7\xf1\x7c\xb5\xae\xf5\xec" + "\xb0\x86\x1e\xe7\xb1\x35\x97\xc7\x4d\xa4\xcf\xa9\x39\x27\xc7\xda" + "\x1c\xfd\x79\x86\xfe\x9c\xad\x3f\x4f\xd3\x9f\xb3\xf4\xe7\xc9\xfc" + "\xac\xc6\xe4\x65\x96\x7e\x7b\xc1\x34\xec\x08\x9e\x6d\x46\x5f\x00" + "\x9f\xe1\x56\xc7\x1a\x39\xb6\xeb\x78\x4c\xd2\xf1\xca\xd0\x9f\x0d" + "\x7c\xae\xb4\x86\xd6\xfc\x6f\xe1\x53\x15\x83\x4f\x5d\x04\x3e\x64" + "\x75\x64\x7d\x13\x7c\x52\xad\xfc\x7d\x8a\xff\x01\x3e\x8c\x0b\xa7" + "\xf5\xb8\x8a\xd3\xa3\xf1\x29\xce\x34\xf0\x89\xcb\x6f\xcb\x45\x07" + "\xdb\x35\xcb\xbe\x25\x63\x40\x0f\x63\x9b\xa5\xa6\xd7\x88\x57\x58" + "\x5c\x7c\xa1\x78\x85\x90\x05\x8c\xdb\xc5\x68\x7f\xf1\x34\xdd\x7e" + "\x3b\xa0\xec\xfc\xe2\xbd\x86\x0f\x19\xda\x5a\x57\xa1\xda\xba\x77" + "\x3d\xc7\xec\x5b\x49\xdf\x76\x3a\x44\x07\xe6\xdd\xff\xc5\x73\xc3" + "\x48\xb8\x85\xc5\xcb\x96\x3d\x77\x9b\xbd\x70\xfe\xe2\x05\xf6\x71" + "\xf9\xf6\x65\x05\x8b\x16\x16\x2f\x88\xf6\xab\x48\xd5\xbf\x1b\x24" + "\xcf\x8b\xf0\x5c\x4a\xce\xa5\xc1\xff\x52\x4f\x4a\xdf\xbc\x17\x9e" + "\x13\xae\xe2\x36\xd6\xb9\x3b\x5f\x53\xdf\x97\xea\x71\xbd\x30\xd9" + "\x18\x43\x8c\xf9\x2f\x8f\x21\x48\x9f\x83\x71\xf2\x68\x44\x3a\xe7" + "\x2d\x30\xd2\x18\xbe\xae\x9b\x86\x1d\xa7\x17\x92\xb8\xce\xb8\x34" + "\x3c\x27\x6a\x61\x37\xf1\xb7\x33\x4c\xd0\x29\x82\xe3\x6f\xf1\x39" + "\x4c\x94\x13\xc0\x47\xce\x2b\xe6\xe0\x59\xcd\xd9\x04\xe3\xd8\x82" + "\x32\xbb\x90\x66\x66\x1b\x02\xf3\xc0\x0e\x2e\x87\xf4\x2f\x38\x1e" + "\x06\xd2\x2d\x7a\x5c\x31\x4e\xfb\x8a\xe3\x55\x20\x2d\x75\x20\x6d" + "\xf9\x70\xa4\xd9\x90\x66\x57\xf0\x96\x5f\xc9\x74\xc6\x73\x96\xbe" + "\x4e\xc6\x79\x26\xea\xf5\x96\x45\xe2\xcc\xdf\x8e\xb9\xe9\xc6\x0c" + "\xfb\x9c\x87\x7e\x30\xe5\xf6\xa7\x96\x2c\x5e\x98\x4c\x92\xec\xe9" + "\x18\x8e\x33\x6e\x72\x5c\x77\x9b\xbd\x68\xc1\x82\xa5\xf6\x15\x0b" + "\x16\x17\xdb\xe7\xaf\x98\xbf\x32\x99\x16\x2e\x59\xfa\x14\x47\x5b" + "\xe0\x6e\x59\x96\xf7\xd4\xc2\xa7\xd9\xf9\x45\xe5\x4e\x8e\xb2\x13" + "\xe6\xb0\x6e\xd3\xe3\x93\x1c\xae\x60\x1b\x32\xa9\x31\x07\xf7\x1c" + "\xb7\xcb\x86\x6b\x13\x7e\x07\xf0\x6b\xc0\xef\x28\x7e\x47\x3a\x69" + "\x75\x08\xd7\x7d\x3d\xae\xe5\xc7\x0c\x7b\x65\x80\x87\x96\xfb\x0d" + "\x1e\x82\x7d\xb1\x4f\x8d\x6f\x2b\xec\xad\x21\x29\x3f\xfd\x3c\x55" + "\x71\x6e\x80\xa7\x38\xee\x68\x2b\xfb\x76\x2d\xc7\xfb\x5e\xb9\x66" + "\xc9\x6b\x26\x49\x4c\xb7\x13\xb4\xea\xf2\x9a\xad\x82\x7d\xcc\x78" + "\x3d\xb7\x09\xfc\xd2\xac\xe2\xd4\xac\xa8\x46\xbe\xab\x51\xc7\x01" + "\xbd\x0e\xf5\x3c\x4a\x1c\xe6\x6f\xc7\x1c\xd7\x9f\x19\xd6\x09\x5a" + "\xf9\x2e\xdf\xf3\x55\xdf\x43\xb5\xea\xdf\x96\x33\x0d\xbc\x73\x4c" + "\xd7\xeb\xf0\x80\x16\x65\x3b\x5d\x22\x68\xcc\x9d\x79\xad\xd8\x9a" + "\x70\x87\x00\x3e\xa7\xb5\xc4\xc7\xda\x64\x1c\xcc\xb2\x5e\xe8\x88" + "\x9b\x6f\xf6\x3a\x64\xfe\x04\x5e\x4b\x9e\x55\x24\x34\xfe\x0e\x95" + "\x96\xf8\x6c\x1b\x97\x13\x96\xc6\x1c\x6d\xf3\xf0\x2c\x65\x33\x70" + "\xfc\x41\x87\x5d\x87\x19\x64\xda\x76\xd2\xf2\x3f\xa8\x79\xf8\xea" + "\x90\xb2\x25\x1c\xe3\x0d\x9f\x4b\xc8\x68\x3a\x9e\x27\x1b\x3a\xc0" + "\x47\x0e\x8b\xee\x1f\xe7\x51\xed\x77\x14\xeb\xcf\x0d\x3a\x8e\x09" + "\x1c\x13\x05\xf8\x1f\xe1\xbe\x83\xbd\xd2\x80\xfb\xa3\xa0\x4f\xb3" + "\xa2\x8f\x43\xfa\xf9\xc2\x6e\xe2\xf7\x47\xf9\x3b\x3b\x78\x77\x54" + "\xc5\x1b\x59\xb1\x97\xdb\x3c\xe0\x43\x5b\x9d\x05\xfa\xbd\xcb\x7b" + "\xcd\x90\xa5\x06\xef\x39\x96\xcf\x15\x75\x80\x57\x6f\xe8\x1d\xd6" + "\x33\x79\x61\xc8\xa9\x9c\x4f\x39\xda\x0d\x7d\x33\xc0\x07\x8e\x60" + "\x3c\x5d\x12\xaf\xdf\xf5\xbe\x99\x2f\x5c\xcb\x27\x03\xa7\x7a\xd9" + "\x07\x1c\x97\xf5\x5c\xff\xbc\xad\x4f\xe9\xc8\x95\x33\xfa\xe7\x98" + "\x3a\x1e\x1c\x07\xde\xc7\xb8\xf5\xca\xfd\x7f\x5d\x6f\xac\x2c\x36" + "\xf4\x86\x01\xc7\x9a\x20\x34\xab\x03\xff\xdc\xfb\x73\x79\xaf\x84" + "\xc7\x4b\x69\x8f\x00\xce\x88\xb3\xea\x2c\x9c\x56\xbe\x3f\xd7\x47" + "\x2b\xc7\xf3\xb7\xe6\xa4\x4d\xeb\x5a\x3e\x7b\x40\x17\xad\x3c\x1c" + "\x09\x53\x58\xf6\xe7\x32\x5c\xd6\x47\x6c\x93\xe4\x85\xcd\x1c\x8f" + "\x26\x57\x1f\x5f\xa0\x83\x57\x06\x0d\x5c\x41\xc3\xc3\x06\xbe\xfa" + "\xb7\xce\x0e\xa3\x9e\xdc\xd9\xe1\x3e\xf6\x09\x6f\x52\xfd\xb9\x5a" + "\xea\x1b\xbc\xdb\xdb\xe3\x5a\x35\xc9\x47\x2f\xb8\x75\x19\x6a\x46" + "\xf9\xbd\x8d\xa5\xd3\x90\x67\x55\x8e\xee\xd7\x7c\x04\xfd\x7b\x34" + "\x82\xf7\xa7\x47\xac\xf3\x1c\x55\x7d\x78\x7b\xd9\x71\x5a\x55\x19" + "\x91\xae\xf7\x6d\x63\xce\x71\x5a\x3d\x5d\xad\x99\xec\xb7\xa9\xf2" + "\xab\xa4\x8d\x6a\xe0\xc8\xba\x80\xcf\xed\xb1\x8c\x4b\xda\xcb\x3e" + "\x5e\x75\xd8\x18\x2f\x00\x6b\x9f\xa4\xf9\x28\x71\x80\xe9\xa4\xe2" + "\x7e\x2c\x5f\xac\xe8\xb4\xca\x1f\x45\x7b\x1e\x37\x51\x0f\xd3\x69" + "\xc4\x5a\xa1\x8d\x08\x24\x88\xbc\x95\x66\x62\x79\x61\x19\xe7\x3d" + "\x42\xf0\x87\xb4\xab\x14\xdd\x56\x67\x18\x74\x33\xfa\x8e\xe9\xe4" + "\xa3\x55\xb5\x4c\xdb\xe8\x36\x0e\x3b\x72\xdc\x68\x3b\x68\xca\xb1" + "\x4d\xf1\x3c\x4d\x97\x8b\x66\xcf\x68\xf6\x21\x59\x71\x6f\xa3\xf9" + "\x07\xd4\xe8\x98\x44\x8a\xb6\xab\x2b\xd1\x0e\x7f\xc4\xbc\xe4\x30" + "\xd3\x97\x65\x05\x78\xce\xd1\x63\x70\x1d\x56\xfe\x4c\x2b\xa6\x89" + "\xf2\xfd\x73\xa4\x2c\x2f\x97\xb1\x52\x38\x7e\xef\x11\xa6\x11\xeb" + "\x45\x96\x25\x96\x01\x96\x27\x45\xa3\xd5\x5d\x11\x34\x6a\x62\xfa" + "\xe8\x74\xda\x17\xa3\xcb\x17\xd8\x0b\xa7\x28\x5d\x6c\x4f\x1f\x97" + "\x3f\x41\x06\xbc\xb1\xdf\x3d\xf5\x36\x7b\xce\x94\x71\x8e\x82\xf1" + "\xb3\xd4\x65\x6a\xce\x0c\xbe\x26\x47\xcf\xeb\xec\x3d\xae\x92\x39" + "\xd1\x73\xc3\xb5\x3e\xa5\x3f\x4a\x0a\x7d\x09\x23\xe4\x5c\x84\xe3" + "\xcf\x56\x2c\x26\x0a\x03\xef\xcd\x9d\xe8\x53\x4b\x43\x80\xe3\x1d" + "\xcf\x76\x10\xc7\x47\xff\xaa\x06\xef\x76\x22\x7d\x44\x11\x7f\x4b" + "\xe1\x6f\x42\x4b\x6a\x90\x6b\xed\xa2\x7c\x77\x83\x3f\xa9\xb3\x0d" + "\xbf\x5a\x7f\xd2\xc1\xf6\xe9\xd7\x39\x05\xe0\x36\x19\xed\xe2\xb5" + "\x1d\xcc\xcb\x02\xb3\x1d\x22\xcc\x34\xca\x73\x70\x4c\x72\xc0\x4e" + "\xe4\xb5\x9d\x12\xb4\xff\xf9\x74\x35\x7f\x2d\x01\xff\x2f\xdf\xa8" + "\xeb\xb2\x9c\x1e\xd7\x1a\xd8\x7f\xb7\x4a\x5f\x00\xcd\x65\x93\xb1" + "\xcc\xb5\x75\xd7\x3f\x88\xf9\x40\xad\x01\x13\xb0\x86\x2a\xff\x07" + "\x05\xef\x9b\xfa\xd7\x6a\x1b\x3e\x4c\xb5\x26\xa8\xf8\x90\x90\xf1" + "\xb2\x1a\x93\x96\xdb\xef\x2f\x83\x77\x23\xd6\xa6\xf2\xfc\x21\x17" + "\xbc\x57\xc6\x79\x8c\x77\x15\x2e\xcd\x57\x61\xd2\x82\xe8\xc7\x54" + "\x65\x3f\x77\xb1\xfe\xc4\xdc\x75\xcd\x3e\x63\x5c\x93\xe3\xa1\x89" + "\xca\xd4\x7c\x66\x8d\xf4\xfb\x3c\xe3\x32\x93\x8f\x4a\xa6\x5d\x93" + "\x26\xe7\x28\x41\xcd\x95\x40\xca\xa7\x79\xcd\x6e\x43\xc7\xf2\xbe" + "\xa9\x75\xad\xf0\xf3\x1a\xb1\x35\x24\xfc\xbc\x87\x2a\xc7\x0e\xea" + "\x24\x6f\x49\x4f\x99\x57\x7e\xfb\x93\xbf\x41\x12\xd0\xc7\x8d\xb0" + "\x1a\x37\x50\xbf\x3f\xf1\xfa\x79\x18\x1f\x12\x3a\x69\x8d\x83\xf1" + "\x67\xda\xf0\x5e\x8b\x06\x5a\x79\x79\x9c\x64\xfa\x24\xff\xae\x92" + "\x7d\x61\xb8\xad\xd6\x10\xda\x1c\xd9\x2e\x93\xe6\xdb\xec\x42\xbb" + "\x4c\xfc\x1d\x8f\x93\x2c\x33\x41\xf6\x51\x82\xbc\x8d\x92\x71\xad" + "\xe5\xfc\xbc\xb4\x2a\xb2\x8d\xac\xff\x55\x1b\x4a\xf7\xc7\x6b\xa3" + "\x30\x25\xe8\x73\xba\xd2\x4d\xba\xbc\x49\x3c\x59\x7f\x74\x51\xe9" + "\x8c\x11\x6b\xd9\x37\xa8\x81\xbf\xa1\x33\x95\xfb\x10\xe3\x67\x25" + "\xe3\x19\xaf\xbf\x18\x9e\x82\xe5\xcc\xb5\xae\x2d\x9b\xd7\xe3\x72" + "\x8e\x8d\x4f\x6f\xe7\xf4\x0b\xd3\xdb\xf9\x2d\x2e\xcf\x78\xf0\xfe" + "\x8e\x35\x84\xb9\x26\xf8\x16\xf3\x35\x77\xbc\x7a\x47\xac\xad\x65" + "\xbc\xe2\xbe\x13\x2c\x2f\xba\x0e\x02\x1f\x0a\xc8\x89\x60\x9d\x04" + "\xdc\x3c\x86\x3e\xb2\x26\xd8\x13\xa5\x7e\x30\x89\xca\x78\x30\xac" + "\x6b\x2b\x79\x9f\x6b\x2a\xea\x8f\xfb\x5e\xe3\xef\x7c\xb8\x1b\x7c" + "\xda\xba\xef\x5f\x63\x4d\xa0\x3b\xfc\x89\xdf\x4f\xb6\x3a\x42\x63" + "\x99\x86\x80\xe9\x80\x1c\xb7\xf0\x3c\x55\xad\x8d\x94\xc1\xfe\x7f" + "\xb5\x4e\xae\x51\x26\x35\xf8\xd4\xbe\x51\x19\xc6\xbf\xaa\x76\x63" + "\x6d\x1e\xcf\x73\x7d\xf4\x0f\x15\xab\x37\xf1\xdb\xdb\xc4\x86\x83" + "\xb5\x9a\xcb\x2a\xec\xab\xac\xb0\x23\xcb\xce\x6a\x82\xbf\xe9\x70" + "\xb0\x76\x80\x4f\x94\xdf\x94\xc1\x27\x28\x5f\x1d\x9f\x07\xca\x3e" + "\xba\x30\x0f\x94\xbd\xca\xef\x99\xee\x6a\xae\x52\xd6\x6e\xd8\x29" + "\x62\xdd\xb7\xb7\xd9\x4b\x65\xfd\x0e\x55\x37\xd3\x24\x8b\xf7\x8c" + "\x66\x80\x2e\x65\x3d\xae\xb5\xa9\x86\x1e\x60\x7e\xb1\x86\xf9\x7b" + "\x17\x24\x79\x1a\xef\x60\xff\x14\x97\xa9\x75\xf0\x43\x05\xf2\xbb" + "\x99\xae\x12\x8b\xdf\x59\xb0\x9d\xbf\x0f\x1b\x48\xda\x8f\x79\xdb" + "\xda\x1c\x1f\xfd\xbb\xb2\x2b\x2c\xfb\xe7\x40\x67\xe7\x6e\x51\x7e" + "\xd1\x16\x19\x37\x0a\x32\xcd\xb1\xa2\x58\xae\x91\x96\x06\xbc\x39" + "\x6e\x14\xe6\x3b\x6b\xdd\xfd\xe3\x92\x2b\x0b\xba\x42\xc8\xb3\x4d" + "\x18\x97\xc6\x74\x83\x76\x6f\x98\xb4\xba\x73\x13\x6c\xc4\x6d\x3e" + "\xb7\x6e\x74\xdd\xcb\x37\x92\xf9\xff\xb2\x3d\x49\x45\x37\x51\xda" + "\xda\x1f\x98\xe9\x1f\x99\x64\x62\x3a\xf8\x68\x6d\x95\xa2\xdd\xda" + "\x36\xa3\x7f\x7c\x54\x96\x25\x75\xe7\xba\xc7\x3a\x66\x87\xc4\x57" + "\x6a\x9d\x7b\x2d\xf4\xdf\xe2\x54\xf5\xbe\x64\x5e\xec\x1a\x10\xdb" + "\xf3\xf6\x45\xcb\xec\xf9\x4b\x56\x2c\xbe\xfa\xea\xa8\xb9\x92\x59" + "\x7d\x8f\xd7\x95\xa2\xc6\x53\x57\x96\x81\x37\xdb\x25\x78\x46\xfb" + "\x4b\xce\x8b\x69\x3f\x23\x4f\x77\x77\xcf\xcb\xa0\x81\xfb\x89\x34" + "\x63\x62\xc4\xe3\xcd\x34\xe3\xa6\x9b\xf3\x1e\x5c\x30\x3f\x7f\x65" + "\x44\xea\x2d\x91\xeb\x86\x15\xdb\x50\x77\xe2\xe8\xbb\xa0\x2b\x12" + "\x66\xad\xe6\xb1\x65\xdd\x2d\xa5\x21\xf1\x77\xe8\x6b\x8e\x5b\x93" + "\xd7\x52\x1c\xa2\x16\xe8\x32\xf1\x6d\xd6\xe1\xc3\xd4\x19\x4f\xd8" + "\x53\xe0\x2d\x2b\xda\xee\x87\x5d\x77\x96\xd7\x67\x50\xee\x91\xd6" + "\x2a\x8e\xed\x7c\xb0\x4b\xd9\x18\xeb\xd2\x90\x7e\x29\xae\x53\x70" + "\x1d\x8a\xeb\x9d\xf6\xc5\x98\xf7\xb0\x4f\xfd\x72\xf6\xa9\x5f\x77" + "\x9d\xf4\x0b\x0a\x94\x11\xfb\x06\x9d\x20\x57\x33\xdb\x20\x3e\x5a" + "\x57\xc2\xeb\xe0\x9c\x17\x65\x2e\xb7\x3f\x43\x19\x7c\x15\x72\x6f" + "\x70\x5d\x9a\x28\x3f\xd8\x25\xb6\xe7\xf2\x77\xdd\xc6\x22\x7d\x65" + "\x62\xc2\xe7\x94\x68\xb3\x24\xf5\xb8\xd6\x39\x40\x7f\xf9\x2d\x86" + "\xc1\xbe\x81\x2b\xbf\x3d\x1c\x63\x1f\x0e\xd8\x86\x1b\x48\xda\xb7" + "\xba\x3d\xb7\x53\x8e\x0b\xeb\x9a\x23\x6c\x3a\x1e\x2f\x93\x95\x7d" + "\x22\xc2\xca\x3e\x5d\xd7\x65\xc8\x01\xee\x83\x06\x9f\x46\xc5\xd9" + "\x5b\x5c\xbc\x60\xe9\x82\x7c\xfb\xb8\x65\xc9\x14\x11\x65\xaf\x60" + "\xc1\x62\xfb\xd2\x05\xcf\xbf\xb0\x60\x99\x8c\x90\xc7\x6f\xa3\xc6" + "\xfc\x34\x91\xfc\x51\x7f\x5c\x51\xfb\x68\xa6\xef\xfa\xc7\x39\x36" + "\x9b\xd8\xf0\x51\x25\xfb\xf0\x48\x1b\x25\xc5\x64\x8b\x9e\x6f\xbc" + "\xa8\x7f\xaf\xe1\xe0\x31\x35\xd7\x79\x51\xc6\x36\x44\xba\x65\x20" + "\x0e\xfc\xfa\xfd\xa0\xa5\x49\xa7\xdb\x99\x1e\xd7\xfa\x7a\x83\x6e" + "\x3e\x7a\x29\x53\xb7\xa5\xba\xa4\xfe\xc0\x18\x0b\xfd\x17\x35\xbe" + "\xaa\x6f\xdf\xae\xe7\xf8\xfd\x89\x72\x3d\x39\xe9\xa0\x8f\xeb\x62" + "\x98\x27\x50\x1e\xfd\x73\x0c\x7a\x93\xf5\x9b\xdb\x80\x87\x3a\x6b" + "\xb9\x3e\x7d\x1e\x74\x45\x27\xbd\x28\xcf\xe5\x68\xee\x83\x3e\xd6" + "\x29\x1c\x4b\x44\x2b\x07\x1c\xb9\x47\xfb\x52\xa6\x5c\x87\xe5\x6f" + "\x11\x00\x16\xaf\x03\x43\xcf\xf9\xf9\x3b\xc9\x9c\xa6\x62\xc4\xad" + "\x97\xe7\x22\x50\x57\x5b\x8f\xeb\xc5\xa2\x81\x33\x0e\x2f\xf1\x37" + "\xb8\x2d\x0c\xd7\x47\x2f\x4e\x62\x78\x2a\x06\xde\x8b\x5b\x7c\xe4" + "\xaa\x1e\xb0\x9f\x5e\x6c\x8b\x98\x97\x01\x1f\x85\x67\x00\xb8\xc8" + "\x78\xab\xca\xe7\x54\xb6\x9b\xf5\xe7\x16\xbd\xed\x46\x7b\x00\x0f" + "\xfa\x6f\x9d\xdb\xf0\x9b\xf0\xe9\xed\x66\xfc\x18\xf7\x48\x9c\x75" + "\x7c\x53\x19\xdf\x1e\xd7\x4b\x63\x22\x64\x9b\xd7\x65\x86\x20\x2d" + "\x63\xc0\x97\x7d\xbd\x23\x56\x6f\x2c\x59\x6c\x2f\x5c\xb4\xf8\xd9" + "\xbc\x15\xf3\x9f\x5d\x90\xf7\x42\xd1\x78\xfb\x0b\x8b\x9f\x2c\x5c" + "\xf2\xd4\xb3\xcc\x35\xcb\x8a\x5f\x78\xea\x59\x3b\x6b\x96\xbc\x69" + "\x33\x66\xe4\xdd\xf5\xf0\x43\x8f\x24\xd3\x5d\xf3\x91\x86\x99\xff" + "\x8c\x8c\xf1\xea\xd5\x83\xd3\xa7\xfe\x38\x6f\xea\xec\x87\x67\xcd" + "\x91\x87\x5f\xfa\xdf\x4f\x5b\x1c\x3f\x43\x14\x1f\xc2\x16\x39\xd8" + "\x86\xfe\x1d\x72\x9c\xca\xf7\xa9\xb8\xe9\x2f\xb5\x47\xc7\x4d\x7f" + "\x09\xda\xfc\x65\x1b\x7e\x93\x88\xdc\x05\xf8\xe1\x4d\x79\x9d\xe2" + "\xaf\xa4\xc7\x7a\x5c\x2f\xa7\x0e\xf0\x57\xb9\x3c\x53\xc6\xfe\x4a" + "\x6a\x7d\xf6\x65\xe8\xff\xf5\x19\x91\xef\x06\xe6\x93\x2f\x67\xf7" + "\xcf\x27\xfb\x75\xca\xcb\xc5\xc6\xdc\x12\x69\xed\x98\x57\x26\xf1" + "\xbc\x52\xad\x27\x95\xff\x5a\xf2\xd4\xa0\xf2\x6d\x21\x63\x5e\xc9" + "\xb2\x2d\xf7\xa4\xe4\xfc\xe3\xe5\xfa\x48\x19\x97\x6b\xfa\xba\x8c" + "\x73\x39\xb9\x7e\x97\x62\x32\xf3\x9a\x36\xec\xe3\x36\xd8\x0a\x18" + "\xbf\x7a\x84\x18\x6e\x32\xeb\x38\xf9\x79\x8d\x9b\xed\x66\x9d\x9f" + "\x46\x74\x92\xfb\x06\xe1\x7a\x69\x9a\x9a\x53\xbe\xf4\x02\xeb\x75" + "\xb1\x6e\xf4\x5d\xec\x5b\xc4\x73\xa7\x1e\x97\x7b\xec\x00\xcf\x96" + "\xef\x63\x5e\x18\x98\xcb\xba\xa3\xf4\x7f\xb7\xfc\x86\xa1\x7b\x8e" + "\x11\xf7\xa1\xf8\x6a\x32\x99\xaf\xae\xa4\x2d\x26\x51\xe6\x23\xb7" + "\x9c\xb7\x32\x3d\x7d\xf4\xb2\x1d\x79\xcd\x03\xf4\x73\xbb\xfb\xe9" + "\xa7\xaf\xb3\x18\x6b\x2c\x0a\xef\xf2\x5f\x0f\x46\xab\xf8\x74\x72" + "\xb7\x7d\x2d\x9d\x5c\x34\x84\x65\xd2\xa0\xd7\xf9\xb4\x2a\x1f\x73" + "\x3e\xad\xca\x9f\x8b\xa0\xd5\x1b\xe7\xd3\xaa\x3c\x27\x62\x5f\x49" + "\x5f\x47\x29\xff\x35\xd3\x8c\x79\x0c\xed\x36\x83\xcf\xde\x18\xa0" + "\x5f\x79\xd9\xf9\xf4\x2b\xdf\x12\x9f\x7e\xe5\x19\xd7\x44\xc3\xd9" + "\x1e\x6f\xdc\x18\xb1\xd6\xa4\x9f\x0b\xdb\x90\xd4\x34\x46\xce\x49" + "\x83\xaf\x9b\xb4\x82\xd7\x5d\xf8\xe1\xca\xf3\x88\x01\x5b\x5c\x04" + "\x55\x5b\x37\x58\x9a\x30\xe7\xe5\x75\xa5\x0b\x8c\x45\xc7\x8c\x35" + "\x0f\xdc\xb7\xf1\xdc\x99\xbf\x0d\xc5\xe9\x4c\x4f\xcc\xb9\xfc\xe0" + "\xf7\x36\x65\x97\x6e\xc8\xed\x5f\x73\xb9\xf6\xe1\x9c\xc4\xb5\x64" + "\x6f\xac\xbe\x89\xd3\x8b\xd0\x0e\xe9\xb7\xc8\xbe\x5b\x83\xc1\xcc" + "\x0b\x67\xd1\x20\x70\xfb\xf9\x7f\xb0\xb3\xd1\x31\xfa\xa8\x60\xfe" + "\xe2\xfc\x25\x0b\x17\x7e\xbd\x2a\x8a\xdc\x57\xab\x74\x69\xfc\xcd" + "\xad\xa1\x3d\xeb\x9e\x59\xd5\xe3\x7a\x85\xed\xff\x79\x6a\xdc\x7c" + "\x05\xfa\xef\x99\xc9\xca\x96\x7c\xac\x43\x9d\x07\x7f\x65\x63\x84" + "\x7e\x06\x8f\xbc\x52\x25\x5c\x1b\x8e\x0e\xf4\xf1\x2b\xf9\xe7\xf7" + "\xf1\x2b\x8e\xf8\x7d\xfc\x4a\xb5\xb6\x9c\xcf\xe3\xbc\x82\xf9\xcf" + "\x52\x69\x6b\xf2\x33\xfb\x41\x60\xce\xdc\x81\xf9\x72\xd7\xec\x95" + "\x9e\x3b\xf2\x56\x26\xc8\xbd\x62\xfe\x06\x4b\xe8\x9c\x68\x67\x5f" + "\x04\xde\x1f\xe3\x6f\xb0\xf0\xb7\x97\xf8\x5b\xa1\x32\x0f\xee\x2b" + "\x4e\x90\x9c\x3b\xe2\xbd\xbd\xe6\x84\xfc\x2e\x37\x6c\x85\x57\x82" + "\x86\x6d\x6d\x5d\x6b\x97\xe7\xd4\x37\xab\xfe\x68\xe3\xbe\xe0\xfa" + "\xf2\x56\x7a\x54\x1d\xe7\xf8\xdb\x6a\x64\x55\x36\xc4\xc6\x8c\x0b" + "\xae\xdd\x27\x75\x7a\x06\xff\x36\x41\xd9\xb0\xfe\xbd\x4a\xfd\xfb" + "\xc7\x2c\xfb\xec\x47\x0a\xb8\xee\x58\x3f\x54\xe5\x3b\xb4\xb1\xd6" + "\xf0\xc9\xaa\x90\x3e\x50\x64\x65\xfd\xc9\xf3\x9c\x13\xb4\x91\xd7" + "\x30\x30\x5e\x6e\x6c\x8a\xdc\xe3\xb4\xaf\x5a\x3b\xf4\x14\x6d\x7c" + "\xee\x02\xfb\xa6\x29\x03\x3e\xb0\x65\xc3\x7a\x5c\x9b\xcc\xfd\x3e" + "\x62\xae\xb2\x61\x35\x11\xb8\xe1\x9d\x3d\xc2\x57\xd1\xcf\xe3\x31" + "\xcf\x1f\x6b\xd4\x37\x58\xfd\x27\x68\xd3\x74\xa4\x61\x3e\xb1\x49" + "\x9e\x79\x58\x11\xa2\x31\x45\xb7\xf3\xb7\x7b\x36\x3d\xa7\xcf\x43" + "\x31\x16\x30\x3e\x9b\x86\x33\x5c\x1f\xf2\x09\xb9\x1f\xb0\xc9\xd1" + "\x8f\x73\x44\x7d\x06\x6c\x45\x93\x4d\xd5\x06\x5e\x28\x37\x47\xee" + "\xb5\x96\x44\xef\xef\x39\x16\x2e\xca\x2b\x2a\x58\x99\xb7\x68\xf1" + "\xa2\xe2\x64\x72\xcc\x7f\x61\xd1\x04\x24\xd9\x9f\x2a\x58\x54\x94" + "\xb7\x48\x46\x2d\x96\x01\x91\x8b\x57\x16\xf1\xde\xc7\x79\x7b\xf0" + "\xa9\xd2\x96\x37\x6d\xda\xa7\xc6\xfb\xcd\x29\x06\x9f\xca\x6f\x8e" + "\x8b\x5c\x1a\xf0\xbd\x92\xdf\x26\x4e\x3c\x41\x9b\x7f\xc8\x3c\xac" + "\xe2\xfc\x54\xe4\x28\xfb\x62\xf3\xb4\xf3\x7d\xb2\x36\xe7\x1a\x3e" + "\x59\xe0\xef\x54\x96\xf5\x08\x58\xe0\xff\xcd\x8e\x38\x65\x36\xf6" + "\xfb\x77\xea\xdf\x3b\xe7\xbe\x92\x71\xef\x5f\x63\x7d\xbb\xe9\x13" + "\xaf\x63\x3a\xc7\xee\xd5\xe5\x6a\xf3\x81\x08\x7c\xa5\x2f\x2f\xc3" + "\xe2\xf3\x52\x13\x82\x91\xbe\x6c\x15\x53\x30\xf6\xda\x8c\x7a\xec" + "\xab\x4d\xd0\x77\x15\x97\x06\x4c\x9e\x44\xe9\x87\x8c\x72\x3d\xae" + "\x0a\x8b\xe1\x47\xe3\xeb\x6f\x57\xc5\x98\x58\x1c\x81\xfb\xd5\x48" + "\x9f\x34\xe0\x27\xb8\x99\xfd\x3c\x73\x90\x86\xf1\xbf\x62\x57\x64" + "\x5a\x64\x3f\xdd\x39\x7d\x06\x0c\xe8\x65\x0b\xd0\x49\x53\xe7\x17" + "\x16\xb2\x0e\x9a\xbf\xa0\xf0\x85\xa5\x4b\x96\xe9\x5d\x77\xe7\x42" + "\x0e\x47\x2d\xb3\xdc\xa6\xbf\xb1\x2f\x5e\xb0\x20\x5f\x25\xe9\x1d" + "\x19\xbd\x67\xa5\xfc\x18\x2a\x30\xff\xdf\xe8\x1b\xb0\x15\x2b\x6d" + "\xc2\x54\x31\x17\xbf\xa7\xa5\xfe\x91\xfd\x5a\xd1\x1e\x3d\x47\xab" + "\x08\x18\xb2\x2f\xfb\xd9\x99\x2b\xbf\x89\xdc\x2d\xe4\x1e\x0f\xfa" + "\xf5\xd5\x7b\xd1\xce\x21\x98\x3f\x66\xf3\xdc\x64\x00\x4e\xe5\xf8" + "\x7e\x7a\xaf\x7b\xac\x6d\x9d\xf2\x99\x30\x43\x37\x98\x39\xb6\x04" + "\xde\x63\xfe\xbf\x71\x8e\xd2\x93\x95\xb9\xfd\x7b\x2f\xa6\x44\xcc" + "\x37\x2b\x0b\x30\xf7\xa8\x3b\x5f\xbe\x2b\xcb\xce\x97\x7b\xf6\xb5" + "\xac\xac\x32\x68\x6c\xf0\x82\xe2\xbf\x57\x6f\x31\xd6\x8c\x6b\xf4" + "\x6f\x23\xf0\x3d\x97\xe5\x79\x85\x18\x31\xfc\x0e\xf6\x6b\x38\x4e" + "\xaf\x9a\x15\x4f\x55\xfa\x22\x7c\x03\x53\x3b\xe9\x55\x52\x7d\x5b" + "\x19\x34\xe4\xcf\x47\x95\xd2\x96\x63\x18\x6a\x5c\xaf\x58\xa3\xf8" + "\xeb\xd5\x31\x06\x6d\x79\x0e\x8f\xe7\xf1\x03\x76\x50\x45\xb3\xf4" + "\x17\x51\xb1\x35\xfa\xb8\xfd\x80\xb3\xd7\x80\x83\xbc\x68\xbf\xc5" + "\x6f\xd0\xca\xc8\x13\xc9\x13\x53\xe7\x17\x61\x82\xbd\x68\xe1\xc2" + "\x05\x4b\x97\x19\xf1\xc6\xd3\x97\x14\xe6\xab\xf8\xe2\xb7\xa1\xfb" + "\x57\x40\x86\xa7\x70\x88\x72\xa4\xaa\xdb\x18\x7b\x77\x3c\xaf\x89" + "\x48\xff\x51\x39\xe7\xda\xba\x76\xa7\x3e\xff\x3a\x4e\xaf\xa7\x29" + "\xff\xab\xd7\xca\x95\x6d\x7b\xc9\xcf\x81\x53\x97\x61\xdb\xf2\x5a" + "\x6b\x37\x7d\x97\xe3\x2a\xca\x33\x05\x3b\xb6\x8a\x76\x5e\x5b\xed" + "\x71\xbd\x96\x6a\x7c\x93\x8e\xed\xa6\x4d\x5b\x55\x2c\x6d\xcf\x62" + "\xf6\x15\xd9\xfa\x96\x56\xde\x70\x44\x24\xd7\x11\xec\xb3\x14\x96" + "\x89\xe1\x5d\xec\xc3\xcb\x31\xb0\x5e\x9b\xcb\x76\x1d\xeb\x32\xfe" + "\x6e\x43\x3b\xbd\x36\x1e\x3a\x1a\xb0\xb6\xee\xf2\x27\x35\x1c\x59" + "\xbf\x8a\x2c\x5c\x07\xf4\xb5\xaf\xa9\x96\x69\xfb\x9a\xe3\x63\xe8" + "\x32\x5d\x67\xfb\xb8\x1e\x1f\xbd\x36\x4d\xcd\x07\x1b\xda\x85\xc5" + "\x63\x63\x5d\xa8\xce\x8b\xbe\xb6\x57\x94\x23\xcd\x5d\x97\x0d\x3a" + "\xf2\x37\x0f\xb3\xd5\xf7\xfe\x5e\x6b\x52\xf9\x77\xbb\x67\x73\x1c" + "\xa7\xf2\xdd\x6e\xa4\x8f\x41\xba\x4f\xa5\xbf\x93\x3d\x3b\x1c\xe4" + "\x79\xf2\x55\xfc\xed\x4a\xd4\x89\xf6\x0f\xaf\x52\x7c\xbf\x7b\xc5" + "\xf7\xca\xc8\xc1\xdf\xbb\x54\xb1\xb0\x3e\x71\x03\x8e\x83\xbf\x2b" + "\x89\xfc\x98\x3b\xbd\xda\x05\x78\x0e\xdd\x9f\x1c\x7c\xf7\xfa\xab" + "\xea\x9c\xc0\xab\xc7\x98\x9e\xc0\xd1\xaf\xaf\x05\x63\xfc\x79\x1d" + "\xfa\xef\x4a\x7d\x5e\xfd\x7a\x8e\x51\x07\xc6\x52\x3f\x6c\xf0\xa3" + "\x6c\x87\x83\x06\x87\xf1\x6b\xae\x90\xfb\xf2\x3e\x8c\x21\x56\xc1" + "\x7e\x70\x03\xdf\xf0\x7b\xdd\x6d\x8c\xab\x5c\xb7\x4e\x07\x3e\xdf" + "\x62\xe1\x35\x43\xbd\x2e\xfe\x36\x47\x82\x01\x13\xcf\x87\xb5\x73" + "\x27\x6b\x01\xd3\x02\x1b\xc1\xaf\x7f\xbb\xad\xb9\xe2\x0c\xfb\x4c" + "\xfa\x60\x03\x5c\x25\xf2\x42\xa9\xbc\x9f\x35\xdc\xf8\x36\x5e\xcd" + "\x19\xa6\xfd\xeb\x81\x81\x7d\x2a\x94\x47\x5f\x42\xb6\xca\xda\x69" + "\xcb\x70\xae\x97\xe5\x8a\xf9\xa2\x17\xfd\x8c\xbe\xb6\x88\x73\x27" + "\xeb\xed\x8b\x69\xf8\x09\xda\x32\x91\xfb\x9b\xf7\x96\xd9\x97\x11" + "\x69\x56\x8e\xe5\x7f\x9c\xb6\x5c\xc9\x7d\xcd\xb8\xa0\x8f\xda\x42" + "\x3d\xb9\xf7\xf0\x39\x6e\xd6\xbf\x6b\x4a\x60\xbf\x2f\x64\xbd\xf4" + "\xc6\x5b\xbc\x1e\xc0\xdf\x60\xe2\x7b\x67\xbe\xd0\x24\xaf\xac\x62" + "\x5e\x79\xe3\xad\x35\x1d\x42\xfb\xca\x45\xe2\x70\x80\xe8\x2b\x13" + "\x85\x82\xa6\x04\xc6\xdb\xe4\x3c\xc9\x67\xcd\x6b\xc9\xeb\x70\xb3" + "\x5f\x9c\x65\xf3\x2a\x4a\xe5\x73\xfa\xfc\x7d\xa1\xd6\x00\x7f\xff" + "\xb9\x9a\x7e\x1f\xda\x42\x9e\xe5\x1c\x73\x65\x6b\xf6\x7f\x38\xb6" + "\xf0\x7e\x5d\x12\xee\x93\xec\x3f\xe6\xba\xb6\xf8\xfe\xe3\xe8\x1f" + "\xe9\x3f\x3c\x7f\x24\xfb\xa3\xf2\xd9\xdf\x9c\xfb\x7b\x6a\xce\xfa" + "\x3d\x39\xdb\x85\xc6\x73\xc4\xd2\xe7\xb8\x0e\x37\x60\xd5\xf2\x99" + "\xf6\x54\xad\xdb\x96\xac\xbe\x9b\xcb\xbe\x91\x7e\xf2\x2c\xfe\x90" + "\x71\x7c\x7e\xe7\x19\xb2\x78\x16\x7f\x22\xef\xd5\xdc\xed\x64\xad" + "\x37\xbf\x8d\xed\xd3\x10\x9f\xe7\xe7\xfd\x4d\xcc\x57\xb4\x0a\xc6" + "\x31\xac\xf0\x06\xbd\xcc\x46\x79\xd8\xaf\x46\xf9\x49\x5c\x7e\x07" + "\xd3\x03\x38\xb5\xcc\x51\x34\x69\xc6\x2c\x5f\xe1\x0c\xfa\xe4\x46" + "\xd2\x67\x4b\x25\xd3\x87\xe3\xc0\x6a\xe8\x2f\xe0\x96\x05\x1a\x68" + "\x46\x1d\xc0\xd9\xa2\xaf\x07\x5b\x36\x9f\xa1\x14\xcf\x62\xfe\xbe" + "\xdc\x1b\x67\xad\x39\x66\x8b\x76\xee\x54\x7d\xc5\x59\x32\x73\xbf" + "\xf1\x1e\x50\x85\x7c\x2f\x69\xde\xc6\x7d\x06\x9e\xcc\xc2\x6f\x1a" + "\x7e\xd9\xcc\x77\xb8\xce\x40\x7f\xb9\x81\x43\x11\xfa\xaa\x96\xaf" + "\xba\x8c\xf1\x77\xc8\x0c\x5f\x81\x81\x74\xc8\x51\x88\xbf\xff\x2a" + "\xd7\xbb\xde\x28\xd2\x20\x47\xbc\x1e\xb4\xf3\x35\x4a\xd1\x5c\xaf" + "\x16\xed\x80\xde\xac\x7e\x4d\x9e\x75\x4e\xe5\x35\xd2\x6d\xf2\x7b" + "\x1d\x5b\xfb\xf7\x3f\x37\x8c\xe2\xf3\xa0\x6f\xd4\x9a\x78\x0d\xc9" + "\xdd\xd0\xa1\xf3\x39\xe7\x81\xfe\xb7\xe9\xf2\xf0\xba\xd4\x0b\xac" + "\x47\x06\x9b\x9b\xc0\x2e\x6e\x16\xdb\x73\x89\xf7\x92\x52\xd6\x0a" + "\x7f\x4a\xbb\x55\xb4\x06\x9a\xe5\x39\xe0\xd6\x40\x58\xee\x25\xe1" + "\x7d\xc2\xac\x80\xdf\x0a\x3b\xfa\x08\xd3\xce\x48\xe7\x7d\x28\x5e" + "\xa3\x9b\x15\x10\xfe\xd9\x2b\xad\xfc\x7d\xcd\x31\x72\x1f\x42\x4f" + "\x6f\xb5\x61\x0e\xb2\xd2\x6f\x45\xdb\x43\xfd\xb0\xba\x73\x13\x59" + "\xde\x90\x37\xad\x3f\x6f\x77\xae\xd9\xeb\x50\x75\x46\xa4\x0d\x99" + "\xed\x40\x59\xee\x2b\x3d\x4d\xd9\xdf\x3f\x75\xf4\xcf\x4f\xf9\x2c" + "\x44\x37\xc6\xe0\x65\xb9\x09\x5a\x77\xae\x29\x0c\xd8\xe0\xfd\x54" + "\xf9\x9d\xcf\x90\x5f\xff\x6e\x16\x7f\xeb\xbb\x8d\xc4\xa6\xa1\x76" + "\xe4\x33\x33\x5c\x8e\x2f\xc1\xdf\x1b\x11\xc3\x2d\x83\x7c\x4b\xfa" + "\x74\x9b\xa7\xf4\x51\xf0\x53\x55\x19\xcb\x73\xd8\xf2\x21\xd9\x9f" + "\x61\x7b\xe8\xa7\x5f\x31\x3d\xc3\x90\xb1\x70\xd2\x87\x34\xa1\x83" + "\x12\x4a\xc1\xb7\x6a\x3d\xab\xea\x5b\x5e\xc8\xa0\x53\x13\xb0\x69" + "\xab\x52\x98\x6f\xac\x5d\xec\x77\xf7\xa1\x3c\xb7\xa1\x25\xff\xe3" + "\x88\x37\xd8\x41\xcd\x65\x7f\xa6\xe6\x90\xb7\xec\xc0\x19\xbf\x59" + "\xf9\xbc\x99\x01\xb7\xea\x06\x7e\xe7\x04\xaf\xe6\x85\x6b\x69\xb0" + "\x7d\x06\x9e\x6b\x43\x5f\xff\x4d\xcd\x3b\xab\xca\x8c\x39\xf6\xd7" + "\xb4\xa1\x8d\x63\x72\x08\x61\x23\x6d\xc3\x67\xbc\x7f\xe5\x14\x3d" + "\xe9\x34\x61\x15\xaf\xef\x55\xd5\x63\xbe\x93\xa5\xc3\x3d\xad\xc3" + "\x6d\xbb\x10\x5c\xe6\x99\xe6\x2a\xb9\xc7\x85\x36\x7d\xe6\x09\x03" + "\x76\x38\xf9\xf7\x6c\xff\x38\x9d\x5f\xf1\xfa\xef\xb6\x2b\x51\x8f" + "\xa7\x35\x74\x84\x38\xb6\xcf\x4e\x0d\x63\xed\x69\x1b\xe9\xfe\x7d" + "\xce\x53\xf4\x66\x92\x26\xd2\x53\x31\xf7\xe7\xbd\x1d\x27\xeb\x38" + "\x5e\x57\x28\x0d\xd3\x50\x6f\xb1\x8f\x38\x1e\x05\x60\x5c\xfa\x29" + "\xef\xa3\x41\x4f\x84\x85\xcd\xf4\xd1\x39\x58\x0d\xd0\x9d\x32\x3e" + "\xc5\xba\x6f\x6f\x1b\xb1\x96\xee\x10\x26\xab\xf4\x0f\xd5\xca\xbf" + "\x6c\x43\xdf\xa6\x4b\x7c\x36\x34\x04\x23\x7c\x09\x13\x51\xd7\x26" + "\xf6\x25\x14\x96\x86\x03\xd5\x72\x0d\xf3\x43\xe8\xf0\x37\x1b\x7c" + "\xf4\x53\x79\x1e\x61\x23\x9f\x17\x91\x3a\x76\xdb\x38\x7f\xd2\xa7" + "\xf2\xdb\x49\x7c\x3e\x56\x5b\x1e\xae\xaf\xf8\x27\xe9\x6b\x19\xdb" + "\x86\xb4\x76\xf5\x78\x84\xfb\xd3\x5a\x3e\x1b\xa9\xc3\xb6\x02\xf6" + "\x9f\x44\xf9\xa7\x98\x63\x6d\x53\xf1\x4c\xdd\x7c\xff\xa6\x9f\xdf" + "\x87\xfa\xd2\x09\xf7\x85\xd5\xbd\xbc\xaf\xf0\xa6\x4d\xb8\xae\xf2" + "\x74\x5b\x3e\xad\x7d\xc8\xc6\xf6\xd9\xb6\x4c\x5f\xc2\xa1\xb1\xfa" + "\x9a\xa2\x8c\xb5\x31\xd8\x7c\x4b\x6c\xb7\x25\x7b\x01\x04\x73\xe3" + "\xb4\x4e\xaa\xde\xdd\xeb\x22\x53\x1f\xec\xca\x5e\x13\xa5\x42\xbe" + "\x52\x36\x8f\xa6\x0c\xbc\x1b\xdd\x49\xdb\x36\x85\x4c\x94\x86\x5f" + "\xaa\xff\xdb\x05\x49\x80\x9b\xc5\xeb\xad\x2d\x67\x78\xbd\x6c\xdb" + "\x49\x69\xf7\x6d\xa3\xb1\x1a\xe0\xf1\xde\x51\xc5\x68\x1a\xcb\x6b" + "\x9e\x48\x4b\xcf\x0b\xab\x3d\x54\x63\x5d\x63\xdd\x68\x1a\x1f\x5d" + "\xef\xb6\x62\xb5\x26\x5a\x2d\xf7\x55\x56\xf8\xe9\x3b\x98\xa7\x1d" + "\x3f\x41\xdb\x0b\x84\x2b\x51\x88\x6f\xdb\x4c\xca\xcf\x61\xfb\x03" + "\xd6\x2a\xc5\x77\x72\xcf\x10\xfc\xc6\x7b\xb2\xfa\xfe\x54\x82\x8c" + "\x31\x92\x7c\xb0\x92\xbf\x6d\x1d\xb1\xe6\x9c\x2a\xf1\xd0\xe3\x02" + "\x84\xd7\x5d\x3f\x8f\x61\x30\x3e\x79\xf3\xd5\xde\x16\xc7\x0c\x00" + "\x8d\xe5\x99\xfd\x8d\xdb\x28\xe5\x95\x6d\x94\xda\xb2\x90\xdb\xb5" + "\x5d\x95\x31\x99\x89\xf1\xd5\xdc\x2c\x67\xe0\x09\xe0\xcd\xf5\x31" + "\x6f\xb4\x86\x4e\x7b\x9c\xc5\x42\xf3\x3c\xc3\x76\xed\xf6\x8f\x3d" + "\x4b\xf7\xd2\xec\xf6\x90\x3a\xdf\x3a\x97\xfc\x35\x80\x57\x33\x9a" + "\x52\x01\xab\xc5\x5b\x48\xbc\xf7\x71\x8d\x67\xe9\x3e\x86\xfd\x39" + "\x8f\x05\x9b\x40\x1f\x35\x26\x54\x6f\xf1\x06\xdb\xa8\x05\xf2\x3d" + "\xab\x48\x84\x19\xce\x09\xaa\xfe\x96\x6c\xef\x76\x9b\x3d\x4f\xc5" + "\x75\x90\x6d\xed\xdf\x33\xd4\xdb\xe1\x3d\xc3\xf0\xaa\xc7\x7b\xe7" + "\xc1\x5e\xd4\xdb\x64\xd0\x5a\xf1\x57\xf5\x22\xcf\xd2\x5d\xc4\xfd" + "\xc3\xf9\xf1\x9c\xeb\x85\x15\x93\x77\x32\xba\x5f\x38\x0f\xde\x95" + "\x03\xee\xad\x03\xfb\xde\xbc\x1f\x3b\x90\xa7\x7a\x1b\x9f\x6d\xdb" + "\xd6\xbc\x1d\x34\x52\xfb\x04\xdb\xcf\x32\xae\x3e\xda\x1e\xf0\x16" + "\xff\x39\xbe\x7f\x2b\x64\x1f\x7c\xbf\xb6\x55\xee\xff\x55\x7f\x31" + "\x2b\xa4\x09\xa5\xcf\x76\x54\x69\xd0\x03\x3e\x5c\x59\x17\x48\x7d" + "\x72\x23\xfb\x14\xed\x78\xd3\x9a\xa0\xfa\x97\xdb\xc2\xf6\x4a\xbc" + "\x3e\x8e\xd8\x9b\x4c\x65\x5c\x8d\x3e\xe6\xef\x42\x6a\xbc\xbf\xcc" + "\xbe\xfb\x7d\x36\x52\xfc\x27\x2a\x01\xb7\x5c\xc9\xd1\xfe\x4c\x3d" + "\x56\x42\x66\x77\xd2\x87\x29\x7c\xd6\xd2\xf0\x33\x86\xfc\x5a\xf2" + "\x94\x6f\xb8\x8d\x75\x54\x8d\x49\xc9\x0e\xe3\xa8\x97\x9d\xa4\xfc" + "\x3b\x76\xe4\xa2\xfc\xa4\xb8\xed\x4d\x84\xde\x71\x41\x4d\xa3\x3d" + "\x6c\x47\x0a\xe8\x2a\x8c\x07\x43\xbd\x81\x5e\xfd\x9b\x9c\x3b\x2f" + "\x87\x7d\x3e\x94\xcf\x5a\x19\xb8\x5d\xdc\x3e\xe2\x0e\x9f\x9a\x27" + "\xed\xb4\x1b\xeb\x54\xc2\x02\x1a\xbb\xac\x82\xcf\x5d\xf2\xd9\x99" + "\x40\xd2\x69\x9f\x7f\xb8\x29\x55\xc9\xcd\xce\x6c\xd8\xa9\x52\xdf" + "\xe6\x05\x49\xea\x74\xde\x27\xc6\x1c\x6c\x28\xb7\x19\x70\x30\xff" + "\x2b\xda\xa7\xc6\x73\x05\x7b\xd0\x75\x22\xa3\x6d\x68\x93\x6c\x1b" + "\xda\x28\xdb\xa6\x7f\xb3\x0a\x75\x7d\x21\xd7\xde\x2f\xaa\x3d\x3b" + "\x55\x8c\x34\xf7\x69\x1f\x7f\x8f\xf7\x04\xd5\xae\x91\xe7\x69\xd0" + "\x27\x6a\x4f\xa5\x26\x53\x24\xbf\x92\x7c\x71\x30\x6b\x64\x8c\x40" + "\xb1\xd1\x94\xfa\x06\xc7\xb7\xd4\xbf\x7b\x07\xd8\x0b\xc4\x26\x53" + "\xaa\x3c\xaf\x88\xfa\xf8\xbb\xa1\x03\x7a\xa8\xa6\x83\xfb\xea\xc6" + "\xbd\x94\xa5\xf8\xb0\xe6\x2f\xbc\x6e\xad\xe6\x8c\x35\x1b\xc1\xf7" + "\x39\x6a\x7e\x66\xf8\xa4\x27\x48\x9f\xf4\x48\x1d\x7b\x91\x38\x4a" + "\x7d\x27\x92\xbf\x84\xfe\xa9\x29\x91\xe7\x2e\x81\xef\x8a\x90\xa1" + "\xff\x6a\x4a\xd8\xbf\xa9\xdf\xb7\x60\x25\x78\xa5\x54\x9d\x4d\xef" + "\x71\xd5\xf6\xc7\x7f\x94\xdf\x39\x73\x89\xc3\x9c\x6f\xf6\xca\xd3" + "\xd2\xf7\xa0\x42\xc6\x51\xe8\xd4\xcf\xec\xd5\x4e\xd4\xd7\x48\xd2" + "\xf9\x3c\x00\xca\x62\xfe\xdb\x28\xe7\xfb\x4c\x03\xae\x5b\xe2\x2e" + "\xbf\x35\x56\x5b\x3c\xb0\x87\x54\x23\xd7\x5a\x94\x8f\x6c\xed\x46" + "\x83\x47\xd0\xde\xa1\x2a\xde\xe8\xce\xb3\x8d\xe3\x49\xf2\x40\xb7" + "\xb0\x25\x7f\xb7\x9a\x79\xb2\x76\x5f\x24\x9d\x66\x87\x34\xa7\xd2" + "\x41\x35\xd5\x42\xca\x7a\x4d\xf5\xd7\xdb\x13\x6f\x25\x19\xb6\x88" + "\xa2\x73\x2a\xf4\xcb\xcf\x8e\x4a\x5a\xbb\x77\xdb\x38\xee\xcb\xea" + "\x52\x8e\x63\xf5\xd6\x67\x1c\x2f\x2c\xe4\xde\x9d\x19\xe6\xf3\x9d" + "\x18\x67\x35\xf7\xee\xec\x13\x45\x64\xca\x2b\xe2\x7d\xb3\x4f\x8b" + "\x78\x7e\x25\x9c\xb0\x05\x92\x61\x9f\x40\xce\xd7\x2c\x22\xeb\xe3" + "\x05\x80\xed\x4c\x4f\xe3\x78\x5e\x1c\xcb\x8b\xe3\xf1\x85\x9d\xe9" + "\x23\x71\x3f\x0a\xf6\x5c\xaa\xb0\xec\x4e\x67\xdf\x9b\xb0\x4b\x40" + "\x1f\x1f\xe3\x98\x62\x26\xaf\x3f\x48\x6b\x4e\x92\x85\xe3\x85\x85" + "\xca\x3f\x75\xb7\x06\xfe\x22\xe7\x16\x23\x8a\x60\x4f\x6b\xf2\x8c" + "\x8f\x4d\x4b\xfa\xb4\x08\x63\x7c\xb1\x6a\xf7\x69\xa1\xda\xad\xf0" + "\x66\xfc\x95\x8e\x7b\x27\xbb\x54\xe2\xfe\xb3\xe7\x42\x80\xaf\xb9" + "\xeb\xa7\x85\xdd\xf5\x59\xea\x5c\x68\x33\x95\x16\x8b\x0e\x2f\x6c" + "\x63\xf6\x05\xe5\xb3\xbf\xec\xdb\xc3\x6d\xe4\xf6\x71\xdd\xff\x71" + "\xe6\xa4\x8c\x7f\x16\xc2\xb3\xb3\x50\x2f\xd3\x85\x32\x5d\xcd\xd4" + "\xeb\xae\x97\x6d\x6f\x0d\xa8\xb2\x79\xf2\x9e\xcb\x47\xd0\x41\x6f" + "\x73\x3f\x1d\xd0\x76\x6e\x1f\xb7\x3f\xc4\x34\x01\x0d\xf4\xb6\xda" + "\xfa\xf4\x76\x72\x1b\x7f\x8f\x51\x67\x1b\xda\x89\xb6\xca\x76\xf6" + "\xa1\x9d\x87\x0b\x88\x82\x1b\x4e\xfb\xbf\x4a\xae\xcf\xe2\xf9\xa1" + "\xf3\x0f\xb0\xa3\x4b\x2a\x09\xf3\x40\xf3\xbb\xa5\x95\xa6\x0d\xb0" + "\x4d\x4a\xfd\x98\x0f\xfa\x45\x07\xdb\xfb\xde\x22\xfc\x42\xd5\xf2" + "\x5b\xc6\xd2\x3e\xe6\xef\xce\x3e\x8f\x36\x69\x5f\x50\x69\x87\xe8" + "\x80\x6d\x1a\xf4\x86\x90\xa7\x00\xed\xc7\xfc\xf1\x84\x8e\x3f\xe7" + "\x5d\xf3\x4f\xd5\x2e\x6b\x21\xa5\x1d\x7a\xd4\x6d\xf2\xb6\xb9\xc9" + "\x68\xcb\x13\xc8\x87\xf6\xd8\x00\x6b\xb8\xfc\xd6\x03\xda\xb9\x1d" + "\x78\x06\x23\xda\xd4\xd2\x15\x04\xcc\x3f\x51\x72\x0e\x25\x6c\x3b" + "\x85\x76\x9c\x22\x5b\x65\x29\xec\xaf\x07\xd9\x5e\xfc\xb7\xb7\x2f" + "\xc9\xa5\xb1\x3e\x7a\x6b\xaf\xe2\x3b\x19\x8b\xe8\xf2\x4e\xfa\x59" + "\x4b\x7f\xbc\x21\x8e\xe1\x96\xf4\xe9\x46\xe6\x23\x19\x77\x88\xc7" + "\x8c\x1e\xf0\x0c\xfb\xe5\xac\x40\x1d\x3d\xe9\xa3\x24\x3e\xae\x49" + "\x84\xe7\x14\x3c\xf3\x77\xa8\xd2\x78\x4d\x00\xe5\xdc\x02\x34\x63" + "\xf8\xb0\xe7\x8a\xf9\xca\x34\x8c\x7b\x6e\xe5\x3d\x82\xae\x83\x8d" + "\x89\xb9\x6f\x7d\xa9\xdf\xf4\xe2\x7b\x34\xfe\xe2\x74\xca\xcf\x42" + "\x83\xe9\x6f\xde\x03\x61\x78\x68\xdb\xc8\x4e\xda\xf5\x79\xb4\x8c" + "\xd9\xa5\x2e\x53\x7a\x70\x57\x1d\xef\x3b\x5c\x5c\xbd\xbb\xa4\x0d" + "\xc7\xfe\x53\x17\x59\x6e\xaf\x81\x07\xee\x07\x3d\x7b\x75\xf1\x74" + "\x78\xdb\x3c\x18\xac\x4d\x5b\x65\x0c\x3a\xe7\xe6\xad\xec\xdb\x78" + "\xba\xad\xd1\xc6\x71\xc1\x31\x76\xee\x0a\xd0\xb2\x1d\x64\x71\x9e" + "\xe4\x35\x99\x99\xd4\x58\x9d\x41\x3b\x31\x27\x17\xdd\xe9\x23\x5f" + "\x3f\xc3\x7e\x14\x4a\x87\xb0\x4d\xca\xe7\x32\xc5\xb2\xf4\xd4\x8a" + "\xad\x86\x0d\xff\x76\x4b\xc9\x59\x32\xa9\xef\xae\xbc\xdd\x3c\xcd" + "\x2e\x42\x5b\x4c\x5a\x41\x35\xc7\xd1\x4a\xee\xb4\x73\x1c\x2d\x23" + "\x36\x95\xb4\x7d\x1c\x90\xb9\x6e\x5b\xf2\xa6\xa5\x34\x9e\xe3\xe9" + "\x59\xfd\xca\x96\x53\xe3\xf5\xdb\xac\x63\x53\x75\xdf\x81\x54\x15" + "\xaf\x6a\xd7\xb4\x9a\x33\xa8\x4b\xbe\xff\xf9\x0d\x61\xcc\x61\x24" + "\xdc\xa5\x34\xb6\xfa\x0c\xa5\xb3\x1d\x94\xf7\x85\xb2\xd9\x78\x5e" + "\x38\xb3\xcb\x2a\xc2\xff\x48\xa7\x1d\x9d\x03\xf1\xf6\xfc\xcb\x38" + "\x46\x9f\xb0\x0d\xb6\xef\x52\x31\x4a\xfa\x0f\xc9\x18\x2f\xea\xbb" + "\x7c\x44\x5b\x5e\x23\x33\x7f\x87\x96\xd7\x05\x79\x9d\x99\xcf\x10" + "\xa9\x31\xe4\xe7\xd5\x46\x1c\xb2\x41\xf7\x24\xdd\x6a\xbe\xa3\x0d" + "\xc5\xfc\xcb\xdf\xe3\xf1\x2c\xe7\x31\xe3\xe7\xed\x7c\x6e\x69\x60" + "\x8e\xf3\xf3\x4f\xf9\x1d\xa7\xb1\x5f\x7d\x96\xa4\xe5\x2f\x52\x78" + "\xde\xa3\xcf\x19\x0f\xd9\xfb\xd3\x94\x0d\xc3\x63\x19\xe3\x50\xa3" + "\xd6\xa4\x47\xf4\xb8\x7e\x91\x6e\x8c\x67\x3c\xae\xab\x6f\xe0\xfe" + "\x62\xb2\x2f\xe1\xe3\xb9\x17\xc0\x2f\x55\xff\x86\x34\xc7\x59\xc8" + "\x42\xfe\x42\x63\x7c\x93\xdf\x38\x59\x37\xfa\xae\x65\x2b\x69\xcc" + "\x43\xdf\xb2\xc8\x38\x1e\xfc\x2d\x53\x35\xee\xfe\x62\xcb\xc0\xde" + "\x5c\x96\xa4\xb7\xfc\x7e\x21\xcf\x31\x4c\x18\x83\x55\x4c\xbd\x2e" + "\x35\xfe\x1a\x67\xe6\x7f\xf1\x41\x44\x3d\x47\xfb\xc7\x51\xd4\xc1" + "\x3e\x22\x0c\x5f\xd9\x26\xbf\x70\x73\x1d\x3c\xb7\x52\xe3\xeb\x2f" + "\x2e\x74\xbe\x30\x9d\xe9\xab\xe9\xf3\x49\x6f\xd7\xdf\x15\x7d\x1d" + "\x94\x38\x61\x0b\xd9\x0e\x95\xfa\xcc\x23\x54\x6c\x28\xeb\x71\xaa" + "\x1b\xc7\xef\x99\xd7\x3d\x37\xf2\x5a\x5c\xdd\x5a\x2f\x8f\xdb\x7d" + "\xb9\x29\xb3\x78\xae\x2f\x6d\xf1\xba\xa2\x1b\x50\x0e\x69\x23\x0f" + "\x9e\x0a\x9a\x2b\x56\xd1\x78\xfe\x4e\x28\xd2\xe5\xde\x96\xff\x8a" + "\x67\x7b\xbe\x9b\x46\xb6\xef\x6e\xe1\xb3\x05\x75\x55\x98\x5f\xaa" + "\x75\x54\xae\x7f\xf3\xd0\x2c\x8e\x27\xf8\x7e\xaf\x6f\x88\xea\xab" + "\xdd\xb7\xe0\x39\x7d\xe0\xb9\xee\x0f\xc6\xbe\x80\x8f\x76\x4f\x92" + "\xfb\xa0\xec\x3f\xbd\x98\xc7\xeb\x4e\xcf\x80\xcf\xd1\xee\x5b\x14" + "\x2e\xbb\x6f\x69\x2c\x22\x5e\xf7\x3e\xba\x53\xc6\x06\xdb\x0d\x79" + "\xfe\x45\xb6\xbe\x1e\x73\x44\xf2\x15\xdb\xbb\x2f\xf1\x1c\xec\xef" + "\x9e\x4d\xc8\xc7\xe3\x44\x9e\x83\xb2\x94\x0d\xdf\xd9\xa6\x81\x7f" + "\x22\xda\xff\x16\xaf\xf5\xc5\xd5\x89\xdb\x88\x64\x99\xf2\xce\x54" + "\xe9\xbf\xb6\xc9\x52\x8b\xab\x45\x94\xff\xc3\x83\x2b\xf3\xdc\x11" + "\x5c\x53\x71\x3d\x8c\x6b\x9a\xd8\x34\xb4\x8c\xf9\x12\x73\x58\x1b" + "\xe6\x09\xbc\xa7\x6a\x19\xec\xdc\x23\xd3\xc6\xbb\xfe\xc7\xa4\xfc" + "\x71\xf7\xd8\x5a\xfc\xb0\xcf\x76\x10\x2d\x0b\x89\x5e\xfb\x77\xf8" + "\x7c\xd1\x1e\x9b\x73\x07\xfb\xc1\xec\xee\x8a\xf6\x83\xd9\x93\x82" + "\xdf\x0c\xfc\x20\x75\x7b\x8e\xe0\x67\x1b\xf8\xbd\x93\xd2\xe3\xda" + "\x63\x03\x1d\xa5\x8d\x75\x71\x3a\x71\x8f\x8c\xd3\x56\xc1\xf3\xa2" + "\xa4\xcf\xea\x55\x7b\x13\xfc\x78\xb6\x88\xe1\x43\x33\xf4\xf6\xfa" + "\xf0\x9c\x6a\x77\x62\x5c\x4b\x02\x4d\x46\xa3\xcd\xc3\x2d\xb5\xdc" + "\x5e\xc6\xb7\x3b\xe9\x1f\x9e\xc8\x33\x9f\x0c\x93\xdb\xef\x4f\x42" + "\x39\xd0\x52\x5c\xfb\x70\x8e\x41\x4f\x9d\x4e\xbc\x07\x65\xea\x06" + "\x0c\x65\x07\x21\x3f\x60\x18\xf9\xfb\x69\x3f\x9a\xa4\x9f\x07\xd7" + "\x85\x39\xb1\xc5\x38\x4f\xda\xe3\x7a\xc7\xfc\x71\x21\xe9\x31\x15" + "\xf6\xd8\x02\x11\x65\x39\x7e\x46\xbc\xf2\xa8\x53\x96\x67\x5c\x4f" + "\xd0\x9e\x6f\xe9\xf5\x06\x07\x93\xa5\xd2\xab\x61\xdf\x41\x9b\x4d" + "\x50\xf3\xbe\xc9\xde\x31\x01\xf2\x56\x6b\x18\xf3\x3b\xfd\x59\xa5" + "\x02\x30\xde\xd9\xdf\x1a\xec\xb8\xc8\xf1\xf0\x1d\xf5\x8d\xd0\xde" + "\x32\xf2\x96\xdc\x24\xbf\x8f\x7d\x8a\xf6\x7e\xe9\xf5\xcb\x38\xf3" + "\x7c\x2f\xfd\xc1\xd9\xe7\x83\xc7\x06\xcc\xb1\xfb\xe3\x34\x6a\xc8" + "\xbb\x93\xd3\x91\xe6\x0d\xf8\x65\x3c\xc7\x01\x9f\xf4\x2f\x0f\x2b" + "\x99\xda\xfb\x96\x8c\xe5\xc0\xf8\x86\xee\xf1\x30\xce\x9a\xfb\xcb" + "\xc3\xdc\x06\x27\xe6\x7f\xde\x50\x8f\x87\x65\xc2\xbe\x9c\xd7\x0a" + "\xf7\xae\x01\xdf\x09\xad\xfc\xcb\xc3\x17\xd7\x86\xbd\xf2\xfc\xbc" + "\x33\x24\x4e\xf9\x93\xbe\x3c\xcc\x36\x49\x45\xe9\x10\xcb\xd4\x6a" + "\xe1\xe9\x4e\xee\x84\x2e\xdc\x5b\xfb\xb1\x43\xf5\xcd\x45\xc2\xad" + "\x35\xda\xbe\x53\x6f\x3b\xd2\x24\xef\x4f\xa8\x52\xf1\x2b\xf1\xdc" + "\x36\xe8\x9a\x15\xfa\x99\xed\x01\xf6\x97\x55\xb4\x78\x37\xbd\x7f" + "\x6c\xb8\x28\x3c\xde\x4d\xff\x06\x75\xf4\xe9\x75\x6c\xfc\x6f\xd6" + "\xb1\xf1\x42\x75\x40\x37\x5c\xd9\x49\xef\xd9\x2e\x7e\xee\xf8\xae" + "\xfc\x46\x10\xf4\xa7\xee\xeb\xf8\x7e\x79\x18\xf3\xb7\x50\x4a\x82" + "\x5f\x7e\xcb\xca\x44\x65\x1c\xcb\x33\xe4\xfe\xac\xbe\xc5\xd1\x4b" + "\x9e\xe5\x7f\xa4\x76\x7a\x4f\x7e\x33\xb7\x05\x7a\x46\x6c\x1c\x9a" + "\xd1\xb7\xe1\x1f\x59\x7d\xa6\x77\x25\x9f\xed\x40\x3f\x6c\x8f\xe0" + "\xb3\xd6\xc0\x1f\xc9\x3b\x8f\xd7\x57\x8f\xf0\xba\x76\x86\x18\x9e" + "\xe0\xd7\xa0\x1b\x60\xa3\x87\x25\x3d\x60\xbf\xa8\xf9\xd6\xe9\x36" + "\x39\xdf\xf2\xcb\xb3\x8e\xc3\x65\x8c\x4e\x57\x51\x21\xaf\x7d\x87" + "\xfb\x72\xed\x3d\x2e\xca\xe1\xd8\x9d\xbc\xee\x2c\x2c\x0d\x47\x67" + "\x87\x12\x85\x9c\x4f\xc1\xf6\xe7\xd8\x9d\xde\x80\x8f\xc2\xb0\xa3" + "\xab\xcf\x51\x5a\x35\x6c\x4f\xe8\xec\x54\xd6\xeb\x35\x7a\xfc\xce" + "\x4d\xe7\x06\xe2\x77\xee\xe4\xb5\x9e\x36\xdc\x9f\x23\x73\xb8\xfc" + "\x74\xdb\xf6\x73\x34\x76\xc7\x72\x4a\xdf\xce\x6b\x79\x5f\x2a\xdb" + "\x87\xed\x0a\x19\xcb\x73\x49\x3a\xaf\xe7\x0f\xd8\x3e\x2b\x38\xd6" + "\x70\xbf\xde\x32\xcb\x35\x90\x8b\xa2\xf7\xfb\x72\x1c\x0c\xb9\x3b" + "\x53\x43\x29\x96\x5a\xd0\xce\xe3\xa3\xf7\xdc\xa0\x5f\xdc\x71\xc5" + "\xf0\xe9\xda\x12\x11\x7f\xf5\xe3\xb1\x4a\xbf\x03\x56\xf3\x60\x3c" + "\x11\xde\x9e\x4b\x13\xba\x28\x43\xf9\x47\x24\x61\x4c\xac\xcf\xe0" + "\xbd\xf8\xd2\xe7\xc8\x16\xde\x3e\x37\xc1\xf9\x16\x25\xf2\xb7\xd3" + "\xf9\x57\xfa\x4f\xd1\x31\xa1\x90\x32\x78\xff\x81\x7d\x28\xec\xab" + "\x65\xfe\x84\xb1\x25\x94\x11\x09\x3b\x5b\x39\x59\xdd\x66\x5f\x56" + "\x3c\x7f\x25\x7b\x37\xac\x58\x54\x5c\x60\x7f\xea\x85\xa5\x4b\xf9" + "\xc4\xe7\xcc\xa9\x39\xd1\x67\x3a\xcd\x9b\x31\x2e\x58\xd7\x4e\x9f" + "\x63\x0d\x65\xdb\x55\xfc\xdc\x0f\xaa\x22\xbe\x73\xce\xcf\xea\x7b" + "\x1a\xee\x43\x85\x3c\x6e\xf3\x7b\xf5\xec\xb1\x29\x9f\xab\x7a\x39" + "\xde\x6b\xdb\x6d\xbb\xd4\x19\xca\x0f\xee\x65\x5f\x06\xc5\xa7\xaa" + "\xac\xf2\x53\xaf\x9f\xac\xf6\xf2\xeb\x3b\xfa\x7d\x17\xdc\x6a\x2c" + "\x61\xdf\x05\xde\x4f\x56\xb2\xf7\x81\xc5\x90\xbd\x1e\xd7\x07\x69" + "\xb0\x9f\x2a\x2f\x5e\xe7\x7c\x90\x26\x71\x54\x67\x65\x19\xa7\xb5" + "\x11\x31\xe6\x86\xf6\xb7\x61\xbb\xed\xe7\x6a\xbd\xfb\x83\x37\x19" + "\x5f\x1f\xd5\x1f\x8e\x48\x1f\x83\xb6\x1d\x56\xe9\x1f\xe4\x72\xf9" + "\xb8\x74\xbe\x77\xf1\x53\x4b\x9e\x2b\x9a\x5f\xbc\xe8\xc9\x45\x85" + "\x8b\x8a\x57\xca\xb0\x17\xe3\xe5\xbf\xbb\xc7\xe5\xcf\x91\x8e\x02" + "\x91\x76\x1c\xaf\x7b\x18\x71\xb7\xd4\xba\xd3\x2f\xaf\x93\xbe\x92" + "\x17\xd7\xbe\x80\x5a\x13\xfc\xe5\x24\x5f\x82\xa7\x70\xc0\xe7\x44" + "\xa5\x77\xa7\x0c\x2d\xb3\x8f\xa6\xc9\xc7\xe9\xd7\xb9\xbc\xdf\x04" + "\x3a\x1f\xe1\x71\x69\x73\x2f\x8f\x1f\x1d\xd4\x12\xba\x89\x54\xff" + "\xfc\xf2\x6d\x8e\x33\xcc\xbe\x6b\xa0\xfd\xae\xe3\x78\x96\xed\x3f" + "\x6d\xdb\xc5\xe7\x9b\xc4\x12\xdb\xcf\x99\x17\x18\x3f\xd0\x6e\xbb" + "\x10\xb9\xdb\xc4\x92\x82\xed\xe2\x74\xc1\x36\xd8\x6b\x1d\x3b\xb7" + "\x8a\x76\xe0\xd0\x00\xba\xcd\x8b\xf4\xfd\xd9\xa4\xbe\x71\xdf\xae" + "\x68\xfd\xcb\xff\x84\xae\xba\x15\xbf\x2b\x84\x7b\x77\x81\xa2\xeb" + "\x2f\xe5\x1e\xc2\xcc\x02\x71\x7a\x20\xb6\xc5\xaf\xf8\xb9\x0f\x3f" + "\x4d\xb8\xf7\xb8\x23\xf6\x38\xf9\xdd\x0d\x62\xc3\x9e\x97\xd9\xde" + "\x56\x3c\xf7\xab\x5b\xd4\xf8\xb8\xe7\x65\xbf\xb3\x20\x11\x65\xc2" + "\xd2\xdf\x4c\xb6\xe9\x57\xf3\xbd\xeb\xcf\xb1\xff\x43\x40\x2f\x3b" + "\x8f\x9f\x3d\xcf\xb0\x8d\xfd\xab\xb0\x30\x39\x05\xef\x8b\x7a\x3b" + "\x42\xa4\xfb\x33\x81\x37\x3f\xd8\xc5\xdf\x20\x67\xfe\xdc\xf9\x1a" + "\x59\x2a\x47\x12\xec\xae\x5f\xf5\xc7\x3f\x11\x16\x65\x07\x31\xaf" + "\x72\x9c\x74\xe9\xfb\x00\x7b\x83\xe1\x33\xaf\x02\xee\x01\xde\x37" + "\x55\x3c\xfb\xab\xc3\xff\x3d\x9e\xfd\x95\xe4\xbd\x09\x1b\x69\x1e" + "\xef\x35\xb0\x3f\x00\xc7\x11\x87\x1e\x3d\xac\xe4\xf0\xd7\x13\xa5" + "\xbf\x03\x74\x3d\xef\x63\xd5\x94\xc2\x7e\xb3\x34\x34\xb3\xdd\x19" + "\x72\x51\x19\xef\x39\x6b\xe7\x4e\xd6\xb3\x9f\x80\x3c\x3f\x2a\xe3" + "\xef\xff\x9e\x6a\xce\x92\xb9\x9d\xf6\x65\xf1\xde\xc8\x00\xad\xf7" + "\xbd\xc1\x30\xc4\x86\x3a\xb2\x96\x98\xdc\x0c\x43\x3b\x77\x2a\xd3" + "\x28\x07\x5b\x6b\x18\x97\x3b\x4e\xfb\x56\xca\x72\x9c\x57\xc6\xbd" + "\x49\x9d\x0b\x5b\x3c\x55\xd6\xa9\x9e\x73\x04\xf4\x63\xe8\x5c\xb8" + "\x1e\xf7\x73\x98\x4e\xb8\xe6\xca\x35\xf9\x3e\x1b\xc9\x78\x4b\x96" + "\x4f\x6b\xbd\xbe\xbf\x7b\x24\x3e\xec\x6f\x5d\x8c\xb1\x44\xda\xe9" + "\xfb\x5a\x76\x7e\x41\xe6\xa2\x67\xb8\x3f\x7f\x3d\x4f\xda\xaa\xa7" + "\xa8\x4e\xe1\xf7\xeb\xf9\xdd\x1b\xea\xb3\xba\x2d\x9d\x47\x02\x26" + "\x0b\x35\xda\x82\x3c\x86\x95\x35\xda\x7a\xa1\x3f\x7e\x9d\xee\x33" + "\xfd\xa2\x48\xd9\x88\xaa\x1c\xef\xdf\x33\x3f\x26\xda\x52\x9d\x78" + "\x9f\x6d\xf8\xd6\x30\x1f\x6e\xc2\x3b\x1f\xed\xb3\x33\xdd\x7c\xf4" + "\xcb\xfc\xd6\x2e\x75\xfe\x06\xcf\x43\x39\xa6\x82\xa4\xf5\xba\x67" + "\x3b\xac\x6b\x3d\x7c\xc6\x37\xd3\x1a\xca\x32\xf1\xfe\x3c\xc7\x76" + "\xe0\x78\x17\x1c\xdf\x81\xd7\x58\xf5\xf7\x19\x31\xef\xc7\x1b\xef" + "\x51\xaf\xc7\x88\xcb\xc0\x71\xb3\xd8\xf7\x23\xac\xfb\x83\xca\x78" + "\x52\x67\xd4\xfe\x36\xfb\x83\xf2\xfa\x2e\x9f\x6b\xe5\x3d\x68\x94" + "\xeb\x3f\xff\xab\xce\x73\xfd\xa6\xdf\xff\x0d\xf7\x69\xfd\xbe\x5b" + "\xa0\x45\xb7\xbb\xf3\x70\x00\xb2\x1d\x70\x77\x5a\xf0\x2e\x03\x63" + "\x4b\xdd\x05\xe7\xe4\x1c\x7f\xfb\x05\x32\x69\xc9\x0d\x41\x8e\xc3" + "\xd2\x18\x20\xfd\x2c\xfb\x6f\x5e\xd5\xe3\x1e\x24\x9e\xa2\xdf\xcc" + "\x1c\xd8\x0b\x0e\xeb\xeb\x98\xbf\x69\x50\x76\xf4\x6f\x1a\xe4\x3a" + "\xe6\x86\xce\xfa\x9f\xad\x0a\x9a\xea\x57\xf9\x4c\xea\x7c\xcb\x6f" + "\xf6\xfa\xe8\xa0\xcf\xf0\x4d\x42\xbe\xc2\xc1\xe2\xeb\x09\xf7\x41" + "\x5d\x86\x7f\xfb\x96\x1c\x27\xfa\xe7\xa5\xbf\x55\xdf\x3d\x5c\x37" + "\x7a\x9e\xc6\x36\x4c\xf2\x67\x1e\xe9\x1b\x53\x74\x86\xd7\x33\x87" + "\xaa\x39\xb2\xca\xa3\xfb\xf3\x5e\xd6\x19\xfd\x3c\x92\x9f\x15\xcd" + "\x7e\x3b\xd9\xd8\x1b\xd9\x6c\xd2\x38\x06\xbb\x70\xd6\x8a\x80\xb7" + "\x28\x40\xb0\x8f\xfd\x5e\xd8\x44\xa8\x43\x14\x2d\xe5\x6f\x24\xfc" + "\xf6\x79\xa6\xbd\x92\xa9\xdf\xca\xfd\x0b\xcd\x75\x87\x70\xf2\xbc" + "\xc0\xcf\xbe\x39\x67\x08\xf9\x2e\x45\xbe\x1d\x4d\x25\x5d\xec\x5f" + "\xe4\xe1\xb8\x96\xed\x7a\xdd\xfe\xa4\x83\x1d\xdf\x4d\xa1\x79\xa8" + "\xb3\xde\x47\x2f\x35\x5c\xbc\x9c\xff\x76\xf0\xfd\xd9\x7e\x9b\x25" + "\x8b\x06\x9b\x67\xf2\x3a\xc2\x8d\xa8\x7f\xa6\x60\xfc\x1b\x76\x84" + "\x4c\x41\xea\x33\x0d\x13\xdf\x2f\x73\x40\x0f\x0c\x13\xe1\x55\xe8" + "\xaf\x6e\x1b\xe6\x21\xcd\xd4\x1a\x6a\x92\xbe\x3b\x90\x61\x6b\x69" + "\x40\x9c\xf1\x86\xf6\x49\x1f\x6e\x35\x4e\x37\xbc\xe1\x0d\x7d\x44" + "\xad\x45\x7e\xf2\x2c\xfd\x23\x6c\x89\x06\x19\x2f\xef\xc6\xa2\x32" + "\xba\xe1\x94\x7c\x9f\xa5\xec\x97\x86\x6a\xfd\x5a\xc8\xf1\x4f\x23" + "\x71\xba\xfb\x85\xc5\x4f\x15\x2f\x5a\xb2\xf8\x86\x19\x0b\x96\x2f" + "\x28\xb4\x3f\xa8\xdc\x2a\xa3\xc6\x3b\xcb\x40\xac\xf7\xfd\x05\x3c" + "\x16\xb1\x0d\xc9\x31\xdf\x2f\x14\xef\xdd\x88\xf5\x0e\x7b\x6e\x2c" + "\xaf\xbb\xfe\x6f\xc6\x7b\x37\x6c\x44\x8e\xf5\x3e\xb0\x07\xf1\x61" + "\x7a\xbf\x0c\x68\x87\x7a\xf8\x99\xc7\x3f\xcd\xd5\x50\xc7\x72\xb4" + "\x53\xda\x2d\xfb\x6b\x23\xe3\x61\xb1\xcd\xc2\xeb\x56\x48\x6f\x30" + "\xce\x52\x83\x17\x31\x6e\xec\x3f\x3c\x70\xb6\x6b\xff\x51\xd0\x2d" + "\x4d\xc9\xaf\xcc\xdb\x6e\xec\xd5\xeb\xdf\xd8\x93\xbe\x05\x9a\x4b" + "\xb3\xab\xf5\xb1\xfd\x5f\xee\xd4\x86\x59\xd4\xde\xcc\x87\xa9\xc6" + "\xb9\x41\x25\x9b\x87\x74\xd9\xfc\x30\xfd\x42\xfe\x14\x03\xb2\xf1" + "\x61\xfe\x80\x5c\xff\xcd\x28\x9b\xff\x75\xbe\x18\xfa\x3c\xe5\xf2" + "\x4e\x3a\xb0\x92\xd7\xcc\x70\x7f\x15\xee\xe7\x33\x2c\x75\x86\xe2" + "\xc0\x14\xfd\x1e\x75\x1c\x18\xa7\xdf\x7f\x1b\xf7\xc3\xf5\x7b\xd8" + "\x53\xbf\x3b\xab\xdf\x43\x66\x7f\xf7\x17\xfd\x3e\x0d\xf7\x9f\xea" + "\xf7\xd0\xf9\xbf\x7b\x57\xbf\x1f\x85\xfb\x37\xf4\xfb\x6f\xe1\x7e" + "\x8d\x7e\x0f\x19\xfc\xdd\x02\x7d\x5f\xdb\x72\x82\x7e\xf7\xc0\xc5" + "\xcf\x9b\x7e\x37\x46\xd9\x49\xbf\x9b\x0b\x9b\xe9\x88\x1a\x33\xfa" + "\xd3\x8a\xd0\x37\x1e\x83\xbe\x48\x4f\xe3\x7a\x90\xee\xf6\xd1\xcf" + "\xeb\x22\xd2\xcd\x7a\xfe\x5a\xe8\xb9\xc9\x03\xe9\x1f\x06\xf5\x74" + "\xd8\x3f\xef\x36\x47\xa4\x77\xe9\xe9\x47\x90\xbf\x29\x22\x5d\xdf" + "\xc7\xfd\x5d\x87\x8f\x6a\x8f\x45\xa4\x1f\x55\xe9\x07\xc8\xf0\x23" + "\xd1\xd3\x0f\xeb\xe9\x36\x1f\x55\x6d\x8c\x48\x3f\xa0\xa7\x43\xff" + "\x7f\x38\x29\x22\x5d\x7d\xab\x5e\x9e\x37\xb4\x8a\xc6\x12\x96\xad" + "\x03\x73\x7c\xb4\xb3\x24\x22\xcf\x2e\xbd\x6c\xa1\x8f\x76\xec\x8a" + "\x48\xd7\xcf\xaa\x1e\x58\xef\xa3\x7f\x84\x22\xd2\x07\x9d\xcf\x26" + "\x54\xd1\xbc\xc1\xd6\x96\xf9\x9b\x64\xd2\x17\x56\xda\xa4\x1f\x7d" + "\xcc\x67\x11\xad\x3b\xc4\x71\x7b\xa9\x10\xc7\xe9\xa3\x3a\xdd\x6f" + "\xf3\x00\xfb\xd1\xa9\x33\x9d\x1f\x55\xca\x73\x7e\x6c\x67\xf2\x39" + "\xcf\x55\x32\xed\x72\x69\x0f\x39\xca\x54\xdc\x55\xe5\x63\xdc\x25" + "\xd7\x58\xf4\xfd\x67\xe4\x99\xc2\xb6\x34\xc3\xe1\x75\x58\x6f\x71" + "\xaf\xf4\x7b\xe5\x39\x2e\xa7\xf1\x5a\x83\x3c\xfb\x17\x31\xd7\x55" + "\x7a\xff\xa3\x8f\x35\x8e\xcd\xe0\x52\xeb\x31\x2c\x8b\x9c\x9f\x7d" + "\xa6\x22\xf3\xfa\xe8\x23\x0f\x5f\x13\x6d\x97\xfe\x9f\x1e\xd7\x47" + "\xb5\x03\xe7\xd1\x0e\x04\xf5\xf4\x3f\x21\xbd\x21\x22\xbd\x7d\x70" + "\xdd\x0e\x7d\x67\xa9\xcb\xee\x3b\x27\x02\xa1\x73\x22\xb8\xf9\xaf" + "\xc0\x7b\xa1\x3c\x5b\xf5\x9d\xb0\xbb\x2e\x57\x8f\x73\xf2\x79\x68" + "\xb9\xf0\x43\x67\xf3\xf7\x44\x2e\x99\x15\xf0\xd3\xac\xa2\x1e\xb1" + "\xe9\x49\xf6\x7f\x3c\x2b\x63\x7e\x39\xbb\x38\xd6\x3a\xfb\xd4\x05" + "\x78\xdf\x2e\xa5\x15\x63\xdc\xce\x85\xfc\xfe\x2f\x34\xb3\xc0\x4f" + "\x2d\x05\x61\xda\x09\xd8\x3b\x9e\x34\xfc\x59\x0f\xf6\x9f\xff\x61" + "\x1c\xb8\x3e\xa7\xfc\x2e\xd0\x41\xe9\x1f\xc1\xdf\x3d\x14\x9b\x2c" + "\xf5\xe2\x13\xb6\x65\xbf\x3c\x62\x5d\x4b\x76\x8c\xed\x5b\x70\xef" + "\x91\x3f\x7e\x87\xf4\xc1\xda\xa4\x64\xf9\xe0\x11\x7d\x2f\xed\xb0" + "\xd2\x17\x07\x8f\x88\x7f\xe3\x79\xd3\x41\xde\x0f\xfd\xff\xd8\x7b" + "\x1f\xb8\xa8\xab\x74\x7f\xfc\xcc\x30\xea\xa0\x03\x8c\x2e\xd9\x68" + "\x68\x53\x69\x4d\x85\x45\xbb\xd4\xd7\x76\x75\xa3\xb2\x8d\xf6\x6a" + "\x58\xe1\xbd\x78\x73\x13\x53\x0b\x37\xff\x8c\x84\x84\x86\xfc\xd3" + "\x88\x3f\x33\xc8\x2a\xbb\x8b\x85\x64\xf7\xda\x7e\xe9\x5e\x2b\xdb" + "\xec\xf7\xd5\xae\xe9\x98\xba\x61\x01\x83\xa6\x45\x46\x39\x12\x12" + "\x12\xda\x08\x83\x8c\x30\xf3\x39\xbf\xe7\x39\xe7\xf3\x61\x66\x80" + "\x81\x61\xc0\x3f\xed\x95\xd7\xeb\xf3\xfa\xf0\x39\x9f\x33\xe7\x73" + "\xce\xf3\xbc\xcf\xf3\x3c\xe7\xdf\xf3\x94\x81\xdd\xdc\xeb\xbe\xb8" + "\xb5\x5b\x88\xbc\x33\x0f\x6c\x93\x73\xbb\xe4\x5c\x3e\xed\x33\x09" + "\x72\x65\x26\xce\xf7\xb2\x98\x20\x79\xbb\x95\xdb\x97\xdb\xe5\x95" + "\x6b\xea\xc9\xcb\xe3\x88\x66\x9e\x1d\xcf\x0b\xec\x7b\x30\x38\x09" + "\xfd\xad\x35\xed\x00\x3b\x54\xfe\x01\xbc\xdf\xbb\x7c\x97\xdc\xc1" + "\xec\x95\x7d\x26\x36\x47\x98\xb3\xab\x16\x75\x88\xb9\xc6\x89\x7a" + "\x80\xd9\xc9\x20\xff\x95\xce\x97\x12\xc6\x38\x5e\x4c\x18\xb5\x25" + "\x91\xa8\x9c\x2f\xea\x42\x37\x5d\x20\x53\x25\xfd\xb3\x25\x19\x74" + "\x4a\xbb\x66\xe4\x06\xd0\x29\x38\xf7\x10\x2c\x53\xb3\xb5\x50\xfc" + "\x5f\x90\xff\x67\x63\x69\x72\xdf\xf1\x8d\x9c\x2f\xe9\xe4\xe8\x5f" + "\x1c\xeb\xd2\x5b\x5b\x0d\x30\xce\x76\x8a\x67\xa1\xd3\x4e\x93\xb1" + "\xfa\xe7\x88\x3c\xb8\x8d\x9a\x9a\x96\x12\x39\xc6\x84\x49\x5b\xcc" + "\xe6\xf7\x86\x55\x26\x38\x88\x39\xe5\x04\x49\x4b\x44\x1e\x99\xae" + "\x43\x3b\x0d\xf7\xb3\x42\x7e\x35\xa0\x7e\x72\x88\x1d\x74\x86\x1d" + "\x6c\xe9\x3f\xe2\xd8\xd1\x74\xbf\x8d\xf9\x37\x36\xe1\xd9\x67\xb0" + "\xf7\x1f\xc2\xb4\x39\xe9\xa7\xd9\x9e\x65\x13\xef\x5b\xa6\x08\x7c" + "\x4e\xc7\xb3\xd9\x23\xf7\xaa\xdf\xed\xb0\x0f\xe3\xe3\x24\xd3\x3d" + "\xa2\x7e\xd8\xca\xc7\x64\xa6\x08\x6f\xd8\x15\x72\xb6\x63\x8c\x99" + "\x1b\xcd\x25\x0e\xf2\xb8\x8d\x5a\xd8\x3a\x33\xfa\xa4\x48\x79\xc0" + "\x44\x2f\x14\x12\x7e\x8e\xd2\xd4\x26\xe4\x6e\x4f\xe0\x3e\x49\x4d" + "\xd2\x1e\x31\xd0\x91\xdb\x53\xf8\x1c\xfb\xf6\x1c\x3e\xe7\xbc\xbd" + "\x78\xdd\x78\xdc\x8f\x6e\xb2\xb5\x06\x6e\x2f\x83\x7b\x79\xeb\xc8" + "\x4f\x0a\xbd\xeb\xa3\xb7\x8b\xb5\x13\x49\x28\xae\x75\xe0\x7e\xf0" + "\x37\xf8\x3e\x70\xf8\xc6\x7e\xdc\x67\x8e\xef\x6e\xac\xd3\x93\x00" + "\x9c\x1f\x86\xb4\x47\xee\x2e\x21\x5a\xa8\x6b\x10\x55\x6e\x8f\x66" + "\x7b\xef\x72\xb6\xc7\x99\x9b\xa9\x09\xf7\x7c\xf2\x35\xa9\x4f\x14" + "\x34\x70\x7b\xb4\x98\xff\xcf\x55\xcd\xd0\x06\xe5\x76\x8d\xd9\x7e" + "\x56\xb4\x09\xf7\x03\xf6\xb7\x6b\x68\xce\x76\x1d\xf7\x71\xb0\xff" + "\xb4\x24\x57\x39\x46\xf7\x7f\xcd\xe9\xf6\x76\x31\xa7\xdb\x27\x0a" + "\x51\x5f\xdd\x88\xff\x83\xee\x8e\xe0\x7b\x28\xf6\x57\x4b\x36\xb2" + "\x45\xcc\x83\xbf\xb1\x90\xfd\x3b\xb9\xac\xdd\x6f\x85\xb6\xe7\xf0" + "\xf7\xfb\x8b\x30\x0d\xda\x07\x3a\x6b\x7f\x38\xb6\xcb\x9b\x6c\x65" + "\xb4\x48\x25\x01\x50\xe7\xa9\xb8\xd7\x17\xed\x14\xb3\xed\x01\x13" + "\x8f\x5b\x7a\xc0\xc8\xce\x7a\xc3\x77\x80\x3f\x72\x94\x9b\x78\x36" + "\x1d\xcb\x73\xd5\xff\x93\x95\x52\x5d\xf0\x7b\xf8\x0e\xda\x8a\x31" + "\x8e\x91\x56\x3a\xcc\x83\x7c\x6d\xd0\xe3\xdc\x53\x1b\xd0\x0c\xf7" + "\x71\x1d\x28\x41\x9a\x70\x9a\x1d\x60\x67\x8d\x37\x74\xf1\xe1\xc0" + "\x32\x4f\x7a\xf0\x67\x41\x09\xb2\x21\x11\xf7\xf3\x1c\x28\x11\xe9" + "\x27\x9e\xc5\x3d\xf0\x18\xa3\x17\x7f\x27\x73\xfb\xed\x84\xae\xbc" + "\x3c\x46\xae\x1c\xd7\xc6\x71\xad\x84\xe3\xf5\x40\xb8\xdb\xef\xc2" + "\xe7\x9f\x47\x1b\xb9\x4c\x83\x31\x4d\x91\xe6\xed\x59\x07\xa2\x5c" + "\xf4\xe6\xe5\xf4\xf2\x8d\x89\xd2\x37\x20\x0f\x91\xea\x09\xfc\x11" + "\x75\xf0\x81\xf5\x2e\x9e\x7c\xb2\x4d\xfa\x5d\x29\x3b\x2f\xf6\xc9" + "\x6c\x3c\xe7\xda\xab\x1c\xc4\x35\x39\xb0\x2a\xaa\x1c\x0f\x98\x18" + "\x1e\xc9\x01\x07\xee\x55\x06\xba\x4e\xe5\x18\x3a\x60\xe1\xba\xf0" + "\x00\x5b\xaf\xc7\xf5\x2e\xee\xd3\xf6\x00\x8c\x9d\x3e\x11\x7d\x3f" + "\x1c\x54\xf2\x3a\x1c\x44\x0c\x90\xee\xe3\xba\x87\x16\x2c\x62\x07" + "\xba\xa7\xac\xd2\x77\x3f\x3b\xa6\x74\x9d\xdd\x3d\x38\xc3\x75\xf6" + "\x79\x9f\x8a\xd3\xfb\x60\x21\x8c\x53\x77\x16\x70\xdf\xc7\xbb\x0a" + "\x80\x67\xe9\x6d\x64\x3c\xc6\x02\x4a\xd3\xd3\xa6\x2a\x3d\x8c\xad" + "\x95\xbb\x27\xd1\x9c\xdd\xba\xb4\x36\x32\x12\xf7\xc2\xa0\xbc\xc1" + "\xbd\xb6\x34\x10\xd2\x73\x77\xeb\x5c\xe7\x2b\x3f\x9d\x06\x63\xdb" + "\x32\x23\x8c\x65\xd3\xcf\x92\xf1\x7c\x6f\xcb\xc1\x4a\x71\xbe\xf0" + "\x35\x21\x67\x77\x38\x9e\xdd\xad\x82\x56\xd1\xf4\x84\xd7\x84\xdc" + "\xdd\xe1\x50\xee\xb4\xf4\x65\x64\x0c\xea\x37\xdc\x43\xcd\x31\xf3" + "\x69\x18\x94\x3b\x0d\xfd\xea\x09\x34\x4e\x06\xdf\xcf\x10\x94\x7b" + "\xeb\x8d\x02\x61\x7b\xf7\x01\x67\xf2\x3a\x72\x68\x02\x7c\x3f\x03" + "\x63\x94\xe2\x3c\x90\xd9\x0e\xf5\xcc\xdd\x9d\x01\xef\x82\xe1\xdd" + "\x63\x70\x17\xd0\xc7\x1e\xfa\xec\x87\xf2\x35\x58\x3e\x7c\x2b\x83" + "\xd7\xdd\xca\xf2\x42\xbe\xb5\x98\x47\xf2\xdd\x27\xa4\xc7\x05\xe0" + "\x7b\x3c\x0b\xee\xc4\x18\x18\x29\x16\xc2\x7f\x53\xd3\xf5\x1b\xd1" + "\x7e\x86\xbe\xfc\xe9\x75\x34\xef\x93\x32\xc8\xbb\x0b\xf7\x0a\x73" + "\x5b\xf6\x53\xb5\xd8\xd7\xc1\x3e\xfe\x74\xb4\xf8\xbf\xaa\x2b\x6f" + "\x7a\x1c\x49\xbb\x48\x34\x6c\xbd\xfb\xa5\x00\x90\xbd\xff\x48\xc0" + "\x78\x1a\x6e\x65\x4e\xc7\xf2\x0c\xe8\x13\x70\x31\x51\x81\x5c\x1e" + "\x05\xf5\xc6\x58\x38\xa7\x70\x0e\x5d\xa4\xcd\x34\xe0\xd3\x8e\x0d" + "\xdc\xef\xe3\x4e\x23\x60\x3f\x6d\x2d\xd8\x03\x6b\x89\x6a\xad\x93" + "\x84\x61\x3b\x81\x6f\x8d\xb8\xdf\x1d\xc7\x6e\x48\x1b\x91\x87\x25" + "\xd0\x96\x6d\x6b\x13\x68\xfd\xda\x66\xda\x58\x99\x50\x43\x40\xcf" + "\x8c\xa9\xd2\x57\xa3\xff\xf9\x53\xd8\x56\x9c\xfb\x03\x9a\x96\x58" + "\xf0\x1b\xb9\xbb\xb7\xe1\x79\x28\x36\x4f\x20\x3f\x18\x2a\x9d\x1d" + "\x2b\x65\xe7\xcb\xfe\xd1\x15\xff\x0c\xea\x72\x50\xac\x4b\xb9\x80" + "\xff\x27\xb3\x33\xa8\x23\x71\xfc\x83\x73\x1a\xf3\x57\x6f\xed\x3a" + "\x3b\xc3\xe7\x06\xfe\x51\xee\xe6\x7b\x8d\xfd\x16\xe7\x08\xf0\xb7" + "\x31\x0e\xda\xb6\x41\xcc\x8b\xbf\x8d\x59\x3d\x9f\xe2\x6f\xe1\x37" + "\x8e\xae\xdf\x78\x9c\xe3\x3a\xc4\xed\x0a\xa0\x2d\xfe\x6f\x05\x5a" + "\x8a\x7b\xdb\xb4\x7c\x5f\xc2\xa7\x91\xd2\x5e\x00\xe8\x3f\xcd\x88" + "\xa7\xde\x7d\xc6\x7f\x3a\xcf\xd3\x0f\x56\x79\x38\xfa\xe8\x82\xf4" + "\x24\xc9\x5f\x15\xfc\x9f\x01\x65\xf0\xfd\x95\x6e\x7e\xe8\x0a\xdc" + "\x7c\x5a\xa6\x5b\xe9\xf7\x88\x13\x90\x2b\x01\xc0\xcb\x0a\x9a\xbb" + "\xb7\x9e\x9f\x85\x2b\x9f\x80\xf5\xac\x23\x9f\xa2\x8c\x0b\xe1\xfe" + "\x32\x3e\xfd\x56\x94\x1f\xbb\x62\x9c\x8e\x10\x0b\x7c\x13\xcf\x75" + "\xb9\x9e\x3f\x3d\x06\xf2\x44\x0d\xbf\x0d\xe2\x3e\x1f\x3f\xad\xf0" + "\xcc\xcf\xde\x67\x74\x7b\x8e\xea\xf6\xac\xb5\x41\xbf\xf1\xb6\xe7" + "\xc1\x38\x9e\xcd\x1f\xd6\x06\x67\x12\x7d\xfa\x19\x12\x00\x58\x39" + "\x8d\x75\xab\x6a\x6c\xc6\x36\x85\xd0\xac\x08\x82\xf3\xa0\xcc\xb6" + "\x04\x9d\x5e\x37\x09\xf2\x9c\x21\x63\x71\x3f\x3e\xc6\xc3\x81\xfc" + "\x4d\xdc\x57\xfd\xe1\x0f\xe7\xad\x1a\x49\x84\xe7\xe3\x46\x51\xf9" + "\x93\x4a\x5c\x73\x7d\xa7\xc3\x32\x0c\xd7\x1f\xd3\x36\x03\x26\x9d" + "\x64\x2c\x60\xac\x1e\x63\x0f\xc2\x6f\x9a\xff\xb3\xa3\x71\x98\xd9" + "\x71\x82\xe8\xff\x48\xe4\x4d\xe4\x70\x99\x22\x95\x28\x36\x34\x10" + "\x35\xf0\xd5\x71\xc0\x31\x95\x48\xfe\x2e\x4a\xc6\xf0\xb3\xfa\x25" + "\x20\x5f\x5f\xd4\x50\x7b\x7b\xd6\x61\x05\x8c\xbd\xe2\xa4\x31\xb6" + "\x81\xc7\xbc\x51\xc0\xf7\x57\xca\x45\xdf\x1e\x9c\xb6\x87\x1f\xe4" + "\x67\xe9\x42\x9f\x87\xdf\x4c\x75\xd9\xdf\x87\xc5\x73\x68\xfb\x94" + "\x5c\xf6\x1d\x3e\x78\x00\x46\xc1\xeb\xf9\xde\x91\x50\xc8\xbb\xa8" + "\x6b\xef\x08\x9b\xb7\x3a\x7c\x90\xe6\xee\x13\x6d\xf3\x7d\xca\xf9" + "\x4e\xa5\xd8\x07\x31\xbd\x4c\x83\xbf\x85\xdf\x85\xd8\xd8\x1c\xd3" + "\xe1\xad\x2e\xac\x1d\x46\x7b\x48\x06\x6d\x52\x01\x5f\x6b\xb1\x5d" + "\x48\x13\xc8\x07\xf5\x2f\xb7\x1c\xd8\xe6\xc5\xf7\xaf\xb2\xac\xdc" + "\xc1\xe6\x40\x9a\xca\x00\x4f\x67\x81\x07\xbf\x40\xff\x5e\x66\xf8" + "\x4e\x65\x69\x07\xa9\xd4\xb4\x92\x2a\xf8\x1f\xf7\x88\x9b\xfe\xf8" + "\x3d\xa9\xd7\xf6\xae\x6f\x40\x67\x45\x43\x9d\xe3\xb0\x2c\x94\x05" + "\xb8\xaf\xce\x9c\x0a\xfa\xc7\x0a\x65\xc1\x08\x04\xcb\xa8\x14\x1a" + "\x49\x65\x0a\x8c\xb3\x0c\xca\x1d\x55\xa5\x27\x48\x95\xe6\x0b\xf6" + "\x1d\xb4\x09\x4d\x89\xad\x7d\x95\x9d\x00\x65\xa7\x88\x65\x37\x43" + "\xd9\xa1\x5e\xcb\xce\x39\x53\x3d\xc0\xb2\x7d\xaf\x77\xce\x19\xd3" + "\x40\xca\x06\x7b\xb7\x02\x63\x1a\xe1\x79\xbb\xb4\x71\x24\xc8\x79" + "\x01\x7d\xbb\xde\x48\xf9\x3e\xe5\xcf\x37\xb3\x33\x79\x59\xec\x4c" + "\x53\x39\x3b\x9b\x77\x8e\xb0\xbd\xa6\xfc\x3c\xde\x69\x82\xfb\x54" + "\xda\xb3\x3e\x5f\xef\x1a\x2b\x75\xad\x1f\x82\xad\xfa\x79\x19\xdf" + "\x8f\xba\x4b\x5c\x8f\xff\xfc\x0f\x58\x56\xef\xf5\xf8\x88\xf0\x7d" + "\xcd\x9f\x77\xed\xb9\x6b\x0d\xfc\x88\x88\x65\x69\xbb\xcf\xeb\x49" + "\xc1\x87\x17\xa7\x24\x49\x71\x8c\x93\xc4\x23\xc6\x4f\x2e\x5e\xb8" + "\x78\x49\xf2\xe2\x45\xda\xd8\x55\x89\xcb\xa7\xac\x78\xee\x39\xed" + "\xac\xc5\x2f\xbe\xb8\xe0\xf9\xc5\x23\x49\x6c\xe2\x82\xe5\x2f\x2e" + "\xc1\xb9\x37\xad\x76\xc6\xaf\xe6\x27\xac\x48\x9a\xf2\xdb\x19\x11" + "\xdd\xe6\xde\xf0\x3c\x6a\x2d\xda\xe0\xa0\x3b\xc6\xa6\x39\xc9\x68" + "\xf4\xd5\x14\xb2\x9a\x9a\x5e\x86\xf1\x1f\xe0\xaf\x09\xf5\x14\xea" + "\x06\x1c\x1b\xa0\x9f\x48\x90\xdf\x15\xaf\xff\x85\x56\x37\x90\xef" + "\xe6\x82\x5d\x59\xf3\x06\xf7\x79\x58\x0b\x63\x72\x2b\x5f\x1b\xfc" + "\xee\x5e\xf4\x67\x98\x0f\x69\xd6\xc0\x7d\xca\x0d\xdf\x11\x05\xe8" + "\x35\x18\x97\x54\xd8\xa8\x7c\x04\x35\x8c\xa5\x07\xe9\xf7\x1a\x22" + "\xfa\x89\x97\x9b\x2d\x76\xdc\x67\xa1\x8c\x71\xa4\x53\x94\xa7\xbc" + "\x6f\x55\xb4\x71\xba\x6c\x4f\xe0\xfb\xbd\xbf\xbb\x0e\xc7\x30\xeb" + "\x58\xec\xd3\x4a\xe8\x3f\xfb\x2a\x5c\x72\xfa\x4b\xad\x68\x3b\xa2" + "\x2f\x99\x97\xea\xe0\x99\xfb\x92\xa9\x8c\xf0\xdc\x43\x63\x06\xbd" + "\x7c\x62\x06\xbf\xf0\x37\x27\x16\xf1\x0b\xff\x77\xbf\xbe\xb5\xf3" + "\xab\x7b\xfa\x60\x2f\xe9\xfb\x7e\x97\x51\xd3\xcf\xe5\xc3\xf7\x59" + "\xbb\xaf\x60\xfb\x07\x55\x86\xa5\xaf\x0b\xf1\x06\xd8\xaa\xcd\xff" + "\x8e\x28\x01\x9f\x45\xc6\x67\x01\xd3\xdf\x12\x4d\xaa\x83\xd6\xa7" + "\xff\x81\x84\xa5\x9d\x21\x18\x7b\xb2\x31\x29\x85\xd6\xa7\x5d\x40" + "\x9b\xf4\xcb\xf7\x01\xbf\xbb\x0a\xea\x88\xca\x58\x47\xd4\x55\x49" + "\x18\x97\x1a\xfd\xb9\x41\x4d\x9b\xe1\x82\xe7\x8a\x64\x3b\xf9\xdc" + "\x7a\x1e\xf7\x9d\x99\xaa\xe2\x41\xee\xd4\x12\x82\xf8\x55\xc5\x93" + "\xd0\x92\xb1\x74\x0f\xcd\xd2\xcf\xa3\x72\xfd\x4c\x48\x3b\xf6\x9e" + "\x10\x35\xec\xbd\x35\xe5\xc3\xb4\xcf\xa2\x8e\x37\x7f\x28\x62\xf3" + "\x26\x7e\xd6\xeb\xcb\x9b\x10\x83\xd0\x4f\x8e\xf1\x79\xf5\x2f\xb7" + "\x70\x7d\xfe\x25\x1b\x07\x71\x5f\xcd\x5f\x32\x5b\x11\xda\xb1\x0b" + "\x63\xf5\x62\x99\xef\x0a\xbb\x58\xac\xde\xf7\xd6\x44\x0d\x4b\x5d" + "\x40\xe4\x55\x16\x18\x99\x80\x1c\xc4\xf5\x58\xe8\x77\xdb\xa1\x9f" + "\xed\xd8\x32\x96\x16\x42\xfd\x0c\xa5\x63\x69\x0e\xd4\xa9\xac\x3d" + "\xab\x7a\x92\x85\x7c\xa6\x11\xd7\x5d\x4c\xd0\x2f\xb6\x1b\x21\x4f" + "\xcc\x2a\x72\xa3\x11\xf2\x15\x40\x3e\xb4\x93\x79\xfd\xbe\x38\x03" + "\x34\xd8\x09\xdf\xac\xd6\x3e\x83\xcf\x47\xd8\x19\x40\xfc\x36\xb4" + "\x43\x5b\x47\x8e\x24\x81\x6e\x53\xe0\x37\xa4\xef\x42\xf9\x20\xff" + "\x3e\x63\xf3\xa4\x58\x2e\x2f\xa7\x5a\x3c\xaf\xb1\x7b\xe6\x06\x57" + "\x2c\xe5\x99\xc6\x35\xa0\xd3\x3b\x98\x9f\xd3\x22\x9c\x6f\x41\x1b" + "\x83\xd9\x15\x4e\x12\xc2\xe7\x07\xc0\xb6\x48\x00\x39\x00\xf6\x04" + "\xdb\xa3\x0e\xb6\x04\xd4\xa5\x08\x63\x7a\xe2\x7b\x18\xb7\xed\x04" + "\xbd\xbc\x03\xed\x80\x67\xda\x7e\x8f\xeb\xae\x04\xe3\xf1\xbe\x38" + "\x8f\xda\x79\x5c\xa4\x23\x6a\xc9\x16\x40\x19\x84\xfa\x1f\x6c\x61" + "\x45\x27\xf0\x10\x30\x50\x0e\xb6\xc5\xe8\x26\x72\x64\xa6\x48\xfb" + "\x72\xa6\xf3\x93\x99\x5f\xee\x00\x2e\xa3\x8f\xcc\x85\xf6\xa9\xe0" + "\x1b\x60\x8f\x7e\xc7\xe6\xc2\xb9\x8c\x39\x92\x20\xe9\x71\x1c\xf3" + "\x5a\xa0\x0c\x0a\xb2\x4c\x7c\x07\xed\x2f\x97\xce\xdc\xd7\xc2\x3b" + "\x8d\x48\xb3\x0a\xa0\x19\x96\xc9\xc6\xfe\x36\xb0\x15\x38\x6d\x8e" + "\x4c\x42\xbb\x42\xfc\xad\x49\x2a\x17\xc7\xe5\x02\xd8\x15\x48\x2f" + "\xa4\x13\x94\x33\x49\x94\x63\xc7\xb8\xfd\xf2\x05\xdb\x33\x81\xb4" + "\x07\x5e\xaf\x77\xd1\xff\xa8\xc2\x9d\xfe\xf0\xfb\xf5\x22\x2f\xd7" + "\xba\xf1\x0e\xc6\x46\x5f\xc4\xe2\x3c\x29\xd4\x71\x0f\x9f\xe3\x39" + "\x3a\x1d\xfd\xe1\xa1\xff\x6d\xa0\xf1\x1e\x03\xfa\x7a\x06\xd9\xbc" + "\xee\x3b\x90\xb9\xcf\xa2\xfd\xf4\xc5\x74\x6e\x9f\x1e\xad\x45\x0c" + "\x37\x90\xa3\x6c\x1e\xbe\x1e\xea\x85\xe5\xc1\xf3\x3b\x70\x07\x3b" + "\xf6\xe8\x5b\xee\xb1\xb3\x5d\x71\xb3\x8f\x96\xb8\xce\x89\x1c\x61" + "\xf3\xd2\x78\xc7\x39\x30\x96\xbf\x33\x01\xeb\x56\x8b\xfd\x52\x6a" + "\x2b\xc6\xd0\x86\x74\xb4\xfd\x6b\x91\x6f\x52\x3a\xfa\x89\x06\x3e" + "\xa9\xa0\x4e\xf7\xf2\x3a\x7d\xa1\xe6\x71\x06\x8f\x66\xe0\x33\xc6" + "\xd3\xde\x80\xbf\x49\x73\xfd\x06\xfb\x0d\x60\x38\x04\x7e\x33\x05" + "\xee\x54\xca\xcb\xe3\x6c\x1f\xdd\xb9\xa9\x03\xe7\xc0\x8e\x56\x48" + "\x71\xb6\x31\xc6\x36\xca\x0c\xe3\x33\x1e\xb4\x47\xda\x6c\x07\x5e" + "\x31\xdc\x1d\x70\xec\x02\x7a\x7f\x01\xf6\xff\x1e\xf1\x2c\xd4\xd1" + "\x9d\x62\xfd\x4c\xdc\x47\xce\xe7\xcd\xcc\xa7\x33\x1b\x0f\x7d\x51" + "\xe2\xda\xb3\x22\xd9\x96\x47\x99\xff\x2d\x28\xab\x02\xf9\x8f\x76" + "\x22\xe4\x3b\xd8\x85\x2d\x76\x0e\xfb\x8b\x19\x68\x5f\x8a\xf5\x47" + "\xbc\x4c\x16\x69\xd7\xec\xde\xef\xdc\xfb\x79\x7b\xd6\x31\x18\xff" + "\x1f\xee\xc2\x80\xd4\xaf\x39\x0e\x8e\x4f\xe7\x7d\xb1\xa9\x0c\xfd" + "\x34\x43\xb9\x26\xb4\xc1\xb9\x5e\x3d\xae\x3e\x50\xcb\xf6\x34\x1c" + "\x83\x67\xe8\xdf\xc7\x9a\x5b\x47\x7e\xb2\x63\x3d\x93\x1b\xc7\x60" + "\xfc\x13\xc1\xf8\x87\x74\x91\xfa\xeb\x86\x67\x70\xec\x17\xc1\xfb" + "\x6c\x4a\x3d\xa9\xb2\x37\x13\xf1\x0c\x06\xf4\xd9\xd3\xb8\x76\xda" + "\x04\x18\x52\x62\xff\x05\xfe\x6e\x47\x9f\xe2\x40\xc7\xea\xf5\x7f" + "\x61\xfd\x56\x85\xfd\xb6\x13\xfd\x84\xc0\x77\x0e\xc6\x47\x91\x03" + "\x29\x26\xd6\x8f\xd1\x47\xcc\xeb\x40\x3b\x8c\x69\x0d\xdf\xae\x91" + "\xf6\x8e\x23\x46\xd0\x27\x8c\x88\x13\x2d\xf6\x65\x91\x76\x8a\xf6" + "\xac\xe3\x44\xea\x7b\x6e\xfc\x67\x79\xba\xf5\xb7\x10\xde\xdf\x8e" + "\x47\x48\xb4\x76\xb0\x7e\x7c\xb4\xc2\x01\xfd\xd8\x9d\xa6\x48\x4f" + "\xa4\x2b\xe4\x85\xf6\x7f\x96\x24\xd1\xd4\x8d\x9e\x95\x22\xcf\xab" + "\xf9\x1c\xd3\x71\xee\x07\xdb\x8d\x86\x22\xfe\x30\x16\xf1\xae\x75" + "\xd8\x76\xd0\x0d\xf8\x7d\xc4\xc8\xeb\xa2\xcc\x3a\x68\x45\x8c\x1c" + "\x87\xfe\xff\x54\xb1\x4b\x76\x1c\xad\x66\x63\x16\xe0\x93\xc8\x9f" + "\x8b\xcc\xa7\x4a\x2f\xb2\x03\x70\xb2\xcb\x25\x9f\xbe\x54\x4a\x74" + "\x90\x30\x29\xf5\x7b\xd0\x23\x73\x3c\xe5\xcf\x97\xf7\x43\x19\x63" + "\x50\xbe\xb9\x6c\xa8\x2f\xa3\x3d\xe5\xdb\x97\x11\x28\xdf\x10\xd7" + "\xfa\x64\x9c\x63\xe3\xfa\xca\x42\xcc\x35\x9e\x32\xc9\x5c\xc9\xf7" + "\x06\x70\x9b\x0b\xb1\xa5\x7f\x86\xe7\x47\x1d\x06\xf9\xd9\x58\x5c" + "\xd4\x79\x5a\xd4\x71\x90\x76\x50\xa4\x57\x2d\xe4\x3f\x88\xe7\x59" + "\xd1\x87\xc5\xa8\x5a\x3e\xd6\x03\x39\xbd\x07\x7d\xb4\x43\xbe\xf5" + "\x55\x60\xe7\x77\x66\x73\xd9\x2d\xc9\x0a\xba\x30\x6e\xd4\x4b\x8d" + "\x24\x50\xff\x5b\xfa\x7d\x03\xf9\x6a\x31\xf4\x19\x3b\xfa\x09\x85" + "\xb2\xb5\x0d\xe4\xc4\x14\xf8\x6e\xa8\x78\xd7\xc0\xfd\x3a\xb8\x8f" + "\x6b\x20\x5f\x3b\xe1\x7e\x03\xdc\x4f\x43\x7e\x41\xcc\x1f\x01\xcf" + "\x95\x90\xfe\x2b\xf1\x0e\x75\xfc\x6a\x1e\xdc\x67\x8b\xb6\x23\xa6" + "\xbf\x89\xcf\x70\xff\x93\xc8\xf3\x0a\xce\xf3\xaf\x72\xa1\x9c\x14" + "\xa8\x7f\x8d\xb9\x96\x95\xa5\x87\x3c\x4f\x60\xd9\x78\xbe\x1c\xfe" + "\x1f\x46\x5c\x36\x28\x94\x53\x73\x0f\xdc\x23\xe1\x77\x6d\x70\x4f" + "\x82\xfb\x61\x91\x06\xd5\x28\x1b\x16\xa5\x20\x6d\x8f\xe3\xbc\x00" + "\xe1\xdf\xe3\x7d\x1e\xf5\xb0\x4b\x76\x1c\x99\xb4\x68\x1e\xe7\x37" + "\xe4\x65\x38\x80\xbc\x0f\x62\x5e\xb8\x3f\x2c\xde\xa3\xc4\xfb\x23" + "\xe2\xfd\x51\xf1\x3e\x43\xbc\x03\x9f\xbf\xaa\x10\x6d\x0c\xa0\xcb" + "\x57\x2c\xde\x01\xc8\x6e\xf1\x8c\x4a\x4d\x33\x8e\x91\x41\x8e\xdf" + "\x0b\xe5\x07\xb4\x67\xd5\xc4\x4b\xf3\xa3\x38\xe7\xd3\x99\x55\x31" + "\xe2\x75\xb6\xae\x5d\x93\xe2\x92\x6d\x7b\x6b\x54\xb2\x28\x02\x36" + "\xd0\x75\x25\x72\xd0\xff\xbc\x9c\x6a\xb9\xb8\x2e\x2c\xc6\x7f\x08" + "\x40\x9f\x88\x6c\x3c\x14\x24\xd7\x60\x5f\x65\x73\xc7\xe8\xbf\x2f" + "\x70\x6f\x2d\x5c\x8d\xd6\xc0\xbd\xcd\x92\xfc\xc6\x71\x0f\x1f\xab" + "\xa3\xff\xdf\x9a\x7a\xd7\x58\xbd\x86\xcd\x79\x07\x68\xae\x5f\x09" + "\xe9\x0e\xb7\x74\x8c\x47\x7b\x2f\xd0\xb3\x06\xda\x13\x59\x47\xbe" + "\x9e\x04\xf7\x5f\xd6\xf3\x36\x47\x48\x6d\x16\xf9\xa1\x97\xe8\x5b" + "\x4f\xbe\x3a\x06\xb2\x30\x11\x31\x5c\xd7\x25\x67\xbf\x62\xf3\xba" + "\x22\x46\x80\x97\x5f\x19\x91\xa7\x6e\x7d\xd0\x5d\x06\x85\xb6\x67" + "\x7d\xbd\xde\x53\xa6\x1c\x59\x8f\x32\x05\xb1\x01\xf2\x1b\x79\xbd" + "\xa8\x5b\xff\xc3\xb9\xfe\x31\xbc\xdf\x7d\x6d\xf2\xfc\xed\x97\x11" + "\x0e\xde\xef\x6a\x00\x67\x80\xcf\xaf\x66\x20\x7f\x2c\xe4\xeb\xad" + "\x62\x9f\xae\x81\x3e\x7d\x2f\xa4\x87\xf3\xba\xf2\x74\xf1\x5b\x80" + "\xb3\xaf\xb0\xdd\x37\x48\xe9\x62\x7b\xb1\x9c\x30\xe4\xb7\x94\x2e" + "\x96\x8f\x78\x44\x0c\x69\xa4\x74\xb1\x4d\x60\x47\x9d\x88\x93\xe4" + "\x89\x81\xe1\xed\x98\x45\xfa\x1d\xf2\x0d\x7d\xa0\xf1\x39\xfe\x13" + "\x33\xa0\xaf\x6e\x45\xfd\xb0\xee\x19\xa2\x7a\xa9\x98\x04\xf1\x7e" + "\x79\x62\x86\xa7\x8c\xfc\x76\x32\xcd\x0a\x71\x50\xe5\xde\x63\x95" + "\x8e\x48\xc9\x5e\x2d\x81\xef\x98\xa4\x98\xee\xae\x58\x12\x27\xda" + "\x2a\xb7\x76\xd1\x17\xeb\x52\x2f\xd5\xc5\x4d\x3f\x33\x1e\x60\xdd" + "\xb0\xac\x75\x60\xaf\xdb\x40\x2e\x70\xb9\xfd\x4d\xa8\x85\x8c\xda" + "\x23\xc9\x54\xd4\x5b\x21\x32\xa2\x2f\x48\x66\xeb\xa3\x21\xa8\x1b" + "\x71\x8f\x8f\x80\xf3\x58\x29\x4e\x52\xa5\x87\xb1\x7c\xca\x69\x32" + "\x7f\xf5\x48\xf4\x89\x13\x07\x75\x0d\x84\xba\x6d\x73\xe2\xdc\xff" + "\x72\x1c\xa7\xd6\x7e\xec\x4c\xa6\x76\x91\x66\xd0\x8f\x6a\xdf\x14" + "\x69\x8b\xf2\x6b\x1b\xca\xf4\x75\x69\x3c\x2e\x14\xce\xe5\x60\xff" + "\xd8\x84\x7a\x4c\x43\xed\x07\x4b\xb0\xaf\x7c\xb3\x4d\xb2\x49\xa1" + "\xbe\x5b\xb9\x4d\x78\x9c\xc5\x9a\x81\xbe\x73\x8c\xcf\x05\xd6\xde" + "\xc3\xdb\x5e\xab\xe1\xeb\xdc\xcc\x0f\x2a\x3e\x2b\x02\x34\x63\xbf" + "\xe2\xfb\xb2\x2a\x6e\xe6\x7b\x4a\xbe\xb1\x75\xed\x29\x71\xd9\x8a" + "\x61\xdc\x37\x58\xad\x9b\xff\xd3\x6f\x2c\xf8\x3b\xf8\x7d\x13\xa4" + "\xeb\x5c\xe9\x78\xac\x80\xf9\xed\xad\x09\xce\x8c\xc2\xbd\x65\xd7" + "\xa1\x3f\x75\xf1\x7b\x39\xec\xfb\x6c\xce\x03\xfa\xa6\xd8\x7f\x91" + "\xce\xa8\xb3\x59\x1f\x86\xfe\x8b\xfd\xb8\x33\x77\x6f\x2d\x5c\xbc" + "\xdf\x72\xdd\x1c\xc6\xfa\x2d\xeb\xb3\xb5\xc5\xae\xef\xd5\xce\x66" + "\xf3\x5e\xc8\xcf\x97\x35\x2a\x78\xb7\xd3\x42\x3e\x0f\x17\xeb\xc8" + "\xfc\xd0\xa0\xdf\x17\xc7\x05\x6a\xc5\xb5\x6d\x5c\xeb\xc4\xb3\x73" + "\x21\x80\x6e\xf4\xd5\x22\xad\x55\xcf\x6a\x4e\xa7\x4e\x5c\x77\xba" + "\x40\x6d\x85\x5d\xf1\x1c\xbe\x25\x2e\xbf\x4b\xdf\xc4\x8b\xed\xc2" + "\xf8\x23\x25\x7c\x2f\xd8\x37\x4f\x70\x9b\xea\x9b\xd9\x88\x53\x33" + "\x60\x0f\xee\xc5\x3c\x06\xf7\xb7\xd3\x24\xec\x41\xbf\x5c\x04\x7c" + "\xaf\x2c\x1a\x4b\x8b\x81\xa7\xc5\xd0\x97\x96\xc2\xf3\x6e\xb8\x2f" + "\xe2\x77\x99\x1a\xef\x62\x1f\x01\xdb\xf6\xdb\x14\xc0\x58\xbc\xd4" + "\x3f\x6c\x81\x4d\xe8\x7b\xbd\xb6\x00\xe8\x80\x58\x63\xeb\xc8\x50" + "\x6f\xc4\x17\xe2\x0c\x31\x16\x92\xf9\x7b\x86\x33\xe6\x17\x02\xd2" + "\xb1\xbe\x88\x33\x28\xeb\xa0\xe4\xcb\xd9\x42\xbe\x65\xe7\x1b\x21" + "\xad\x46\xda\xa3\x8b\x6b\x49\x49\x37\x91\xeb\xa0\x5c\xed\x41\x2d" + "\xf3\x97\x7a\xd2\xec\x78\x84\x60\x5e\x5c\x87\xe3\x72\xf2\xfa\x83" + "\xed\x59\xdf\xa9\x5c\x34\x3f\xc2\xce\x96\x1c\x98\xc7\xe6\x22\x7f" + "\x01\xef\x74\xee\xe3\x0c\x0b\xa9\xb0\xe1\x58\x03\xf7\xf6\xdd\x12" + "\x4a\xb4\x80\x5b\x90\x63\xdf\xcd\x94\xec\xda\xbb\x43\x71\x3d\xbf" + "\x62\x2b\xd4\x0f\xc7\xd0\xd5\xf0\xbf\x01\xc6\x92\xe5\x5e\xe6\x8c" + "\x23\x71\xae\x47\x8c\xc1\x54\x8b\xf3\x58\x18\xb3\xa2\x81\x9c\xaa" + "\xac\x44\x1f\x2d\x2b\x7a\xfa\xf2\x4e\x4b\xa1\x6d\xe8\xcf\x5b\x9b" + "\x48\x7e\x51\x47\x4e\x61\x4c\x96\x9a\xf4\xf3\x38\x47\xf3\xdd\x31" + "\xcf\x39\x9a\x93\x93\xc4\x6b\x2a\x5c\x25\xae\xcb\x12\x2e\xfe\x5f" + "\xd6\xf7\x65\x99\xc1\xf3\x5a\x66\xc3\x35\x8f\xd3\x4a\x03\xfd\xe4" + "\x64\xd7\xfc\x2f\xe2\x12\xfb\x36\xee\xe3\xc0\x39\x27\x99\x83\xa0" + "\x4f\x18\xe0\x13\xd4\x7b\xdd\x1d\x4f\x9a\xd6\x20\x8e\x4e\x2e\x61" + "\x63\x07\xf9\x40\xcf\xae\x9e\x64\xfc\xe4\x3e\x5f\x4f\x86\xc3\xb7" + "\x43\x37\x9c\x23\x0a\x7d\x22\x99\x80\xf3\xdf\x21\x4e\x6a\xc2\x31" + "\xae\xe8\x37\xb2\xba\x89\x58\xa6\x24\xad\x25\x72\x78\x7f\x23\xfc" + "\x1f\x26\xd9\x49\xf0\x1b\x75\x80\x9d\x84\xa2\x7d\xf4\xf0\x5a\x72" + "\x23\xd4\xdf\x2e\xf1\x0a\x6d\x08\x9c\x87\x13\xe7\x12\xb0\xae\xf7" + "\xe3\xef\x30\x16\x81\x85\xd1\x8d\xc9\x61\x2c\x03\xf0\x71\xb2\x3e" + "\xc0\x46\xd4\x5c\xf7\x58\x00\xff\x15\xa2\xcd\x68\xc1\x58\xdc\xc7" + "\xdc\xea\xf9\x3b\xb7\xff\xb3\xf1\xf7\x21\x36\xb4\xcf\xbc\xd1\xc7" + "\x92\x2b\xd1\x07\xf7\xab\x86\xc0\x38\x81\xf1\xdb\x41\x9b\xa1\x6e" + "\x15\xfa\x35\x44\xd9\x44\x4e\xad\x7e\xe3\x2f\xec\xfc\x63\x39\x9f" + "\x9f\x3f\xb5\x4c\x1a\x87\xf3\x7a\x9f\xba\x3f\x24\x33\x80\xe0\xbc" + "\x3a\xfa\xb4\x63\x7b\xfd\x7e\xd2\xb0\xb9\x74\xb3\x63\x1a\x31\xa5" + "\xfd\x1a\xf3\x48\x76\x55\x6d\x6b\xba\x86\x1c\xd0\x4c\x83\x7e\x7c" + "\x4a\x01\x7d\xe5\xd8\xc0\xf7\x54\x9e\x52\x88\xf4\xad\xe0\x7b\x11" + "\x2c\xc7\x51\x97\xe0\xd8\x1f\xf4\xc8\x41\xd4\xd1\x50\x76\xbc\xd4" + "\x6f\x40\x6f\x40\x3f\xb5\xf0\x58\x36\x39\xb8\xfe\x6b\xa9\x46\xdf" + "\x1c\x6c\xdc\xc0\xf3\xab\xf8\x9c\xff\xa9\xa2\x2e\x5b\x1a\xf2\xe1" + "\xef\xf8\x1e\x35\x4b\xd9\x7c\xa7\x0c\x68\x6a\x29\xc3\xb6\x89\x58" + "\x04\x7d\x75\xea\xa0\xab\xdf\x5a\x18\xee\x0f\x34\xbb\xf7\xcb\x53" + "\xf5\xae\xf1\xe6\x77\xc5\x53\x8a\x88\xb6\xb7\x7e\xa8\x0f\x46\x5d" + "\x55\x37\x67\xc3\x06\xba\xb5\x50\x2e\x3c\xb4\xae\x80\xa8\x64\x06" + "\x20\x1b\xf6\xb3\xe4\xf8\xeb\x1a\x48\xdd\xe2\x10\xd5\xf5\xb3\x1f" + "\x4e\x1a\x41\xd3\x34\x44\x6e\x6c\x19\xa1\xbc\xc9\x7e\xfd\x56\x1a" + "\x70\xc7\x93\xb3\x92\xec\x44\xfb\xc7\x42\xf2\xc3\x52\x12\xf0\xb0" + "\x13\xbe\xad\x22\x7a\x0b\xa9\xd7\xe3\xca\xf3\x01\x15\xda\x1f\xf5" + "\x7a\x2c\x33\xb5\x84\x28\x53\xeb\x69\xa3\xe1\xb9\x61\x4a\xd0\x07" + "\xea\xd7\x01\x63\xa3\x54\xd7\x6f\xed\x84\x32\xf6\xc7\xb3\xdf\xed" + "\xe8\xa3\x6e\xe7\x7b\xaf\x9b\x7e\x6c\x03\xf9\x5e\x36\xb0\xba\x35" + "\xa8\x5d\x75\x6b\x50\x0f\xbe\x6e\xdf\x1b\xdd\xea\xa6\x76\xd5\x2d" + "\x01\xeb\xb6\x65\x60\x75\xfb\x61\x87\xab\x6e\x3f\xec\xf0\xb1\x6e" + "\xdb\xbd\xd7\xad\xfe\xf6\xde\xeb\x96\x72\x7d\x03\xa9\xbf\x7f\x60" + "\x75\x3b\x33\xdb\x55\xb7\x33\xb3\x07\x53\x37\x1c\xcb\xa7\x85\xd1" + "\xd3\x2c\x66\x40\x22\xf7\xc9\xdb\x40\x4e\x6f\x4e\x2b\x61\xcf\x63" + "\xe0\xff\x39\x62\xff\xb6\xa6\xdb\xe8\xf7\xdc\xce\xa9\xdf\x7f\x97" + "\x1e\xf7\xbb\xd6\xef\x02\x2c\x8b\xfb\xf1\x4f\xb3\xfd\x0d\xe9\x56" + "\x2a\xee\x37\xad\x3f\x55\xca\xf6\xa3\x1c\x10\x63\x6e\x9f\x9e\xd4" + "\x3a\x72\x9f\x1a\xf7\x82\x08\xd0\x9f\xe9\xc8\x7d\x61\x18\xa3\xf5" + "\xbd\x44\xab\x9c\x66\xa1\x4f\x37\xf4\xc3\xa8\x20\x34\x6f\x5f\xf8" + "\x7b\x89\x76\x16\x1f\x7e\x1d\x3b\x87\x7d\x3a\x4c\x3a\x7b\x28\x7d" + "\xc3\x1a\x78\x20\x0e\xd2\x23\xa5\x58\xbf\x54\x0e\xf6\x4c\xe0\xbe" + "\x50\x2c\x1f\xd2\x67\x4a\xf1\x77\x01\xef\x16\x51\x36\xd8\x42\xec" + "\x7d\xc9\xbd\xd3\x99\x92\xdc\x7b\x38\x89\x84\x60\xec\xd1\x0d\x69" + "\x23\x70\xcd\xd1\x0a\xdf\x54\x23\xdd\x63\x6c\x23\x68\x48\x2a\x09" + "\xc0\x33\x97\xb8\x47\xcf\xac\xb1\x92\x49\xa9\x64\x58\x4c\x0a\x94" + "\x69\x27\xf1\x21\x29\x50\x1e\xd0\x9a\x8f\x0d\x4e\xb3\x39\xbe\x22" + "\x28\x0f\xd7\xbf\x03\x92\x88\xea\x61\x4d\x3a\x5d\xb7\x99\x28\xf0" + "\x7c\x26\x9e\xb3\xe4\x67\x2c\x87\x2b\xa1\xbe\x0e\xa9\x7d\x3e\xf0" + "\x27\x98\xf3\xe7\x87\xfb\x5d\xfc\x69\x68\xeb\xc9\x9f\x86\x05\x9c" + "\x3f\x0d\x71\x2e\xfe\xfc\x50\xe2\xc9\x9f\x86\x4c\x4f\xfe\x34\x1c" + "\xf4\x8f\x3f\x0d\x7b\x5c\xfc\xe1\xdf\xe0\xfc\x69\x38\xd6\x3b\x7f" + "\x1a\x9a\x5d\xfc\x69\xc8\xf0\x8d\x3f\x3f\xdc\xe4\x9d\x3f\x0d\x3b" + "\xfa\xe0\xcf\xf0\xde\xf9\xf3\xc3\x4a\xdf\xf9\xf3\x43\xc9\x00\xf8" + "\x13\xc4\xf9\xd3\xf8\xb5\x8b\x3f\x8d\x7f\xee\xc9\x9f\x46\x19\xe7" + "\xcf\x0f\x76\x17\x7f\xce\x4c\xf3\xe4\x4f\xe3\x4d\x9e\xfc\x69\x5c" + "\xe4\x1f\x7f\x1a\xe7\xb9\xf8\xc3\xbf\xc1\xf9\xd3\x98\xd4\x3b\x7f" + "\x1a\x0d\x2e\xfe\x34\x6a\x7d\xe3\x4f\xe3\x7e\xef\xfc\x69\x9c\x3d" + "\x70\xfe\x9c\x19\xdd\x8d\x3f\x6a\xef\xfc\x39\x33\x6d\x00\xfc\x09" + "\xe1\xfc\x69\x5a\xed\xe2\x4f\xd3\xbd\x3d\xf9\x73\xe6\x4d\xce\x9f" + "\x33\xc5\x2e\xfe\x34\xd5\x7a\xf2\xe7\xcc\x7e\x4f\xfe\x34\x29\xfc" + "\xe3\xcf\x19\x87\x8b\x3f\xfc\x1b\x9c\x3f\x4d\xa1\xbd\xf3\xa7\x29" + "\xdc\xc5\x9f\x33\x26\xdf\xf8\xd3\xb4\xc0\x3b\x7f\xce\x58\xfb\xe0" + "\xcf\x88\xde\xf9\xd3\xf4\xbe\xef\xfc\x69\xaa\xed\x8b\x3f\x03\xb3" + "\xf5\x9a\x58\xac\x9a\xc1\x97\xf3\xe3\x54\x6f\xe5\x20\xed\x70\xff" + "\xa1\x90\xf5\xe3\xd4\x52\x61\xb8\x92\x9f\xd1\x68\xb2\x6a\xd7\x90" + "\x07\xea\xc8\x8f\xaf\x94\x0a\xc3\x94\x34\xeb\xed\x9d\x42\xd6\x7f" + "\xcf\xa3\x99\xc3\x15\x42\xe6\x08\x05\x9e\x99\xef\xad\x2c\xbe\x1f" + "\xf6\xc7\xd3\x01\xe3\xc8\x44\x3c\x47\xb7\x0e\xec\x65\xfc\xbf\x3d" + "\xeb\x47\xa0\xfb\x9e\x92\xbe\xce\x6f\xe1\x5e\xa7\x03\xeb\x71\x7c" + "\xdb\x1c\xd6\xe5\xaf\x24\x8b\xa6\xa0\xdf\x37\xfd\xcd\x78\xce\xa2" + "\x79\x06\xfa\x73\xa7\x39\xbb\xd7\x47\xdd\x4c\x4f\xe2\xd8\xa3\x81" + "\x9c\x7d\x90\xe6\xee\x5e\x8f\x78\x00\x5b\xfd\x17\x90\xc7\xd0\xb5" + "\x3f\x8f\xc6\xbd\x26\xce\x11\x46\xf0\xbc\xe7\xde\x87\xbc\x11\x18" + "\x6b\xf6\xc5\x34\x8c\xa1\x7a\x6e\x33\xd8\xbe\xb7\xe2\x37\xd0\xa7" + "\xd5\x1b\x70\xc7\x7d\x32\x7c\x6f\x66\x33\xf7\xdd\xb3\xee\x86\xd7" + "\xf8\x5e\xb8\x73\x99\x12\xee\xe0\x3b\x23\xe1\x79\x89\x68\xcf\x63" + "\xfe\x51\xf0\xfc\x84\xdb\x7b\x15\x3c\xe3\x3c\xe4\x68\xf1\x7d\x10" + "\x3c\x8f\x43\x3b\x9b\xf9\x5f\x29\xc8\x10\xf7\x10\x9f\x75\x40\x9a" + "\x5a\xcc\x33\xba\x89\x9c\x3d\x85\xb6\xbb\x58\xc6\x18\x78\x3e\x84" + "\x63\x60\xf1\x7d\x28\x3c\xbf\x8d\x6b\x07\xe2\xfb\xeb\xe0\xd9\x08" + "\xcf\xb7\xf1\x33\x2f\x9d\x62\x1f\x3d\x1b\xe7\xdf\x59\xfe\xb3\xcc" + "\xf7\x22\xf2\x80\x8f\x05\xce\xba\xed\xff\x39\x1b\xd5\xed\xdd\x1e" + "\xb7\x77\x11\xd2\x3b\xbe\x47\xed\x6c\x8d\xdb\x3b\x6d\xb7\x77\x36" + "\xb7\x77\x6a\xcf\x32\xcf\xa9\xdd\xde\x11\xcf\xdf\x9d\x0b\x77\xbd" + "\x6b\x6e\xee\xf6\x2e\xda\xed\x5d\xad\xf8\x2e\x00\xd2\xe3\x5d\x6b" + "\x78\xcd\x15\x62\xba\x1c\xd2\x53\xdc\xd2\xf7\x88\xe9\xf8\xfd\x42" + "\x0b\x29\x11\xc7\x2a\x9c\xf7\x62\xf9\x65\x6e\xe5\x1b\xf8\x1c\xc7" + "\xb9\x3d\x5d\x7b\xe7\x46\xee\x4b\x10\x3a\xe3\x5e\x83\x77\x49\x88" + "\x2b\x77\x6c\x2f\x4f\xd6\x3e\xbb\xea\x79\x6d\xe2\xe2\x24\xdc\xbe" + "\xb2\x6c\x49\x92\x76\xd9\x8a\x45\x8b\x3d\x7c\xe9\x87\xa2\x2f\x48" + "\x8c\x9b\x87\x3e\x75\x58\x8c\x8a\xbf\xd0\xc6\xae\xb8\x2e\x20\x57" + "\xdb\xb3\x7e\xd2\x59\xc8\xef\xa6\xe2\xb7\x8a\xb8\xcf\xf9\x72\xf4" + "\xc9\xc3\xfd\xef\x90\xdf\xd7\x91\x9f\xa6\x88\xfe\x77\x4c\x90\x37" + "\xd6\xbb\xff\x9d\xf3\x11\xcc\xef\x24\xe4\xe3\xfe\x77\xce\x47\x42" + "\x3f\x7f\x98\x8e\xe4\x71\x5a\x78\xfc\xba\x9f\x24\xdb\xc4\x3a\xff" + "\x22\xf3\xdd\x98\xc1\xe7\x32\xba\xfb\xd1\xdd\xbd\x08\x7f\x27\xae" + "\x97\x2e\x72\xfb\xbd\x89\xbf\x97\xf4\x83\xf8\xcd\x9c\xdd\x09\xf0" + "\x3c\xb2\x0e\x9e\xd9\xfc\x3d\x7b\x67\xe5\x73\x79\xb9\xbb\x97\x62" + "\x9b\xb0\xdd\x9e\x6d\x93\xff\x5b\x1d\xb1\x06\xba\xda\x66\x8d\x70" + "\xf3\xd1\x27\xb6\xc1\x1a\xc7\xfb\x68\x8f\xb6\xb2\xfd\x89\x54\xb9" + "\x7b\x29\x7e\x1b\xe5\x19\x3f\xcb\x00\xcf\xb9\xbb\x13\xa4\xfa\xb8" + "\xd5\x6f\x29\x8e\xeb\xa1\x7e\xf7\x72\x9a\x80\xfc\x00\x9e\x8a\xf5" + "\x6c\xa3\x59\xe7\x6a\x78\xbc\x0a\xd0\x27\x18\x77\x87\xe9\x2a\xab" + "\x49\x9a\xcb\x44\x1d\xc5\xe7\x30\xad\x2e\xfb\x0f\x7d\xa7\xe5\x4a" + "\xfa\xcb\xea\x66\xff\xf1\x6f\xb6\x67\x9d\x27\xee\x18\x72\x7d\xef" + "\xfc\x14\xfc\x9e\x85\x58\xcb\xf8\x79\x80\xdd\xec\xbc\x0e\x3c\x2f" + "\xc5\xbd\x98\xf8\x5b\xac\xa3\xb7\x58\x8b\xde\x7c\x5b\xba\xe8\x78" + "\x3e\x45\xa2\x63\x11\x8b\x61\x72\x3e\x47\x9a\xaf\x13\xe3\x9c\x98" + "\x8a\xba\x62\x8f\x9f\xdf\xc9\xe2\xf7\x19\x86\xe7\xdc\xad\x22\xf1" + "\x22\x6d\x3f\x46\x19\x8f\x7d\x86\xcb\xfa\x96\x30\x91\xe7\x11\x62" + "\xfd\x4f\x63\xba\x6b\xff\x7d\xcb\x34\x29\x9f\x24\x97\xf9\x7a\x55" + "\xcb\x75\x2c\x1f\x8f\x07\x3d\x95\xf3\xfc\x36\x75\x1d\x69\xd1\x89" + "\xf9\xbb\x62\xf7\x5a\x48\xcb\x0c\x9a\x7b\x60\x6a\x7b\x56\x0b\x8c" + "\x7f\xce\x59\x39\x1d\xf9\x77\xe1\xae\xc3\xba\x20\x8d\xf0\x2c\x39" + "\x35\x0e\xcf\x01\xfe\x44\xf4\xaa\xe7\xf8\xbe\xee\x1b\x9b\x48\x2b" + "\xb7\x21\xe4\xd4\x8e\x73\xac\xbc\xad\xad\xfb\xdd\xf6\x3e\xab\xa4" + "\x3c\x5c\x76\xb3\x77\x6c\x4f\xb9\x3e\x19\xe7\x83\xc4\x77\xc9\x78" + "\xbe\xb6\xeb\xff\xe1\x6e\xff\x0f\xc3\xff\xd9\xbe\xe6\x35\x4c\xb7" + "\x2a\x5c\x67\xfb\x5b\x4d\xf0\xac\xea\xf6\x1c\xea\xf1\xbc\x9a\xef" + "\x7b\x06\xdb\xac\x9e\xed\x21\x17\xd3\xc5\xb2\x03\x59\x7d\x92\xe9" + "\x54\xc0\x46\x0a\x9e\xe9\x16\xfb\x61\x0a\x9e\xd9\x0e\x71\xfc\x81" + "\x9d\xd7\x86\xf7\x91\xe2\x3d\x42\xbc\x87\xf3\x58\xbc\xad\x29\xd2" + "\xb9\xed\x56\x36\x47\xd3\x9a\x23\x9d\xdf\xc4\x33\xde\x78\xbe\x1b" + "\xda\x3a\x15\xcf\x78\xe3\x79\x70\xf1\x1e\x21\xde\xc3\xc5\x78\xc4" + "\xf3\xe0\x77\x5d\xe7\xbf\xbd\xe9\x73\xc8\x53\x2f\x9d\xe7\x76\xe6" + "\xec\x0e\x13\x72\x4c\x78\x2e\xfd\x46\xf4\xe1\x96\xde\x4c\x05\x1e" + "\x33\xdc\x46\xcc\xa4\x83\x98\x93\xda\x33\x80\x17\xc1\x55\x7a\x07" + "\x9b\xc3\xaf\xb2\x3b\x48\x95\xfe\x2c\x8b\xfd\xfa\x52\xb3\x14\xdb" + "\xc6\x36\xc3\x99\xbb\x3b\x4c\xec\x2f\x9b\xf9\x1e\x7d\x1b\xf7\x45" + "\x84\x73\x6d\xcd\x6c\xdd\x4b\xd9\x40\xda\xe2\xa4\x3c\x9c\x76\x6d" + "\x4c\x4e\xbc\x91\x25\xc5\xf7\xb4\xa5\x4a\xf1\xc4\x2d\xa4\x6d\x5e" + "\x5b\xe0\xa1\x62\x48\x2b\xf4\xdc\x33\x6d\x7b\x1b\xcb\xc4\x7a\x5b" + "\x88\x6d\x26\x96\x0d\x79\x76\x76\xf5\x59\x25\xd4\x23\x8b\x3c\xc0" + "\xcf\xa1\xb4\xc5\xf1\xd8\xb1\x36\xe8\xff\x2d\xf1\xe2\x5e\xf0\x1d" + "\x14\xf7\x53\xe3\x7e\x70\xa4\xdd\xc8\xbd\x3b\xd3\xcf\x93\xd0\xd6" + "\xce\x38\xdc\x9f\x5e\xcf\xce\x23\xac\x44\x5f\xf0\x76\xf2\xb8\x9e" + "\x88\x71\xb3\xda\xee\xc7\xb3\x04\xeb\x58\x4c\xbf\xdd\x3b\x5a\x47" + "\xee\xfd\xa4\x3d\xab\x0d\xe4\xff\x43\x2e\xdf\x6d\x79\x7b\xa1\x0e" + "\xd0\xbe\xf4\x04\x8c\xcb\xbd\x1d\xf2\x54\x43\x9e\x99\x52\x1e\x7c" + "\xdf\x8e\x6b\x4f\x34\x81\x60\xbb\xda\x72\x7f\x2c\x87\xf7\x4b\x2d" + "\x72\x83\x81\xef\xfb\x6e\x03\xfe\x97\x29\xfb\xe2\x1b\xf4\x47\x90" + "\x91\x07\xf4\x42\xce\x81\x78\xe6\xe7\x3d\xf0\x40\x02\x9f\xe7\x6c" + "\x3b\x84\xb1\x27\x37\x5c\x20\x0a\xdc\x87\xc1\xfb\xcd\x05\xe6\xcf" + "\x14\xd3\x40\x5f\x94\x41\x3f\x65\xeb\x22\x03\xb3\x3d\xda\xd8\xdc" + "\x24\xfa\xee\x42\x3a\xe2\xf9\xa9\xf6\xac\x0b\xda\xae\x38\x1d\x5d" + "\xb2\xe4\xc2\x63\xb8\xfe\x01\x7d\x94\xd5\xb1\x7b\x1d\xb0\xbe\x50" + "\xd6\x41\xaf\x76\xae\xf2\x40\x3c\x5b\x23\xca\xdb\x37\x8d\xef\x93" + "\xbd\xf0\xa7\x00\xcd\x0d\x17\xe0\x5b\x86\xae\xf8\x24\x90\x07\x79" + "\x26\x40\xf9\x5d\xed\x4c\x64\xdf\xd8\xc9\xe5\xcd\x85\x72\x21\xf7" + "\x40\xfc\x86\x0e\xa2\x10\xd3\xcb\xab\x1c\x76\x8c\x4b\xd1\xab\xaf" + "\x1c\x16\xa3\x11\xf7\xa5\xe7\x1d\x88\xc7\xb3\x4b\x77\xdb\xa5\x3a" + "\xb7\x97\xe3\x99\x19\xac\x33\xa7\x6d\xfb\xc7\x12\x1d\x8d\x2d\x50" + "\x76\xda\x09\x52\x4f\xda\x1f\xc1\xbd\x7b\x8c\x26\x6b\xa4\xfd\xa4" + "\xed\x5c\x2e\x76\x74\xe5\x61\x36\x16\x8b\x97\x05\xe5\x97\xb2\x98" + "\x7f\xd0\x06\xe0\x85\x29\x0d\xfd\x0e\xb4\xb3\xb8\xc4\xeb\xe0\x3d" + "\x6b\x37\xdb\xab\xdb\x2e\x9e\xd9\x6d\x5f\x2f\xe9\x2b\x8b\x98\xb6" + "\x01\xbf\x9d\xdc\x41\xce\x91\xf6\xc5\xe6\x8c\x0e\x02\xf4\xd0\xa3" + "\xef\xc2\x2a\x1b\xf4\xd1\x94\x0e\xc4\x82\x1e\x63\xc4\x42\x7e\x7e" + "\xde\x5a\x89\x34\x6f\x8f\xc6\xef\x23\x6d\x61\x7c\x68\x0d\xd0\x84" + "\x41\xdf\x6f\xb7\x48\x34\x2d\x18\x8b\x63\xae\x0b\x5e\x7d\x77\x22" + "\x8d\x9c\x50\xe7\xaa\x62\xd0\xdf\xe3\x4f\x40\xfd\xec\x6f\x0b\x23" + "\x0f\xc4\xe3\xbe\x70\xf8\x5f\xf4\xd7\xc0\x79\xc7\x71\x60\xcf\x84" + "\x6f\xdc\x5d\xc5\xb1\x40\xb8\x9f\x1e\xbb\x4e\xa4\x1f\x8b\x35\x52" + "\x98\xcc\xe9\x20\xe6\xaf\xe5\x73\xd6\x61\xf7\xb6\x67\xd9\x53\x5c" + "\x73\xd6\x76\x66\x2f\x62\x5c\x84\x52\x36\x2e\xb5\x17\xb9\xd5\xd9" + "\xc6\xce\xe0\xb6\xe0\x7c\xa3\x7d\x1a\x7e\xcb\x88\xbe\xe5\x10\x17" + "\x4d\xee\xf8\xb7\x4f\xc0\x7a\xe2\xbe\x63\x67\xe0\xbe\x69\xa0\xf3" + "\xa3\x90\xce\xf0\x9b\x58\xe8\x0b\xde\xce\x0c\xa3\x3e\x66\xf1\x1d" + "\xdb\xb3\x2e\x2a\x25\x7d\x0c\x63\x1c\xd0\x4d\x1d\x32\x36\xf6\x05" + "\x9b\xde\x2c\xa0\x4d\xd5\xc1\x62\x6f\x83\xac\x8f\x17\xe5\x7c\x3c" + "\xfc\x66\x9a\xb4\xee\xe6\xc4\xb3\x1b\xe7\xd8\x9a\xb3\x4d\x8a\x5b" + "\xc8\x7d\x39\x5e\x8c\x77\x9d\xf5\xb8\xb8\xb4\xc7\x59\x0f\x3c\x7f" + "\xf4\x17\x16\xdf\x6e\x3b\xea\xb5\xca\xe6\x7a\xd4\x53\xec\xf7\x78" + "\xfe\x03\x64\xd4\xf7\xfc\x0c\x53\x3d\xae\x11\xb0\xd8\x3a\x58\x17" + "\x1e\x97\xa4\x8e\xfd\x0f\xb8\x55\xe0\x9d\x63\xe9\x22\xe8\xe9\x55" + "\x39\x92\x1d\x81\xeb\x7d\x07\x14\xbf\x23\xa6\x9b\xd1\x66\xe8\x90" + "\x61\x9c\x79\xc8\x63\x93\x62\xcc\xb3\x98\xf2\xbc\x3d\xb1\x5e\x7d" + "\x76\xde\x45\x22\xd0\x67\x01\x9e\xf1\x63\x34\x50\x0d\xd7\xa1\x1f" + "\x70\xf4\x69\x6a\x5a\x83\xb1\x7f\x3a\xde\xdf\x34\x96\x9d\x93\xb6" + "\x99\xee\x6a\xc1\xbd\x60\xcd\x0d\xa9\xcc\x57\x97\x32\x26\xc5\x41" + "\xf1\x77\xcc\xa6\x09\x1a\xae\xc3\x77\x2c\x0e\x06\x96\xe9\xb7\x4f" + "\xeb\x8e\x54\xd1\x3e\x6e\x86\xf1\xd7\xf5\xc0\x2b\x36\x2e\x82\xff" + "\xc7\x36\x91\xce\xaf\x79\xac\x63\x1e\x97\x41\xdc\x13\x3e\x9c\xfb" + "\xf9\x00\x9a\x31\xbf\x0b\x9d\xb3\xb4\x77\x60\x5c\xf0\xce\x27\x98" + "\x8f\xf4\x9c\xdd\x7a\x91\x06\xfa\x0d\xbc\x5e\x21\xf3\x53\xe4\xac" + "\x8e\x58\xbf\x81\xd5\xad\x53\x23\x8e\x65\x86\xb7\x67\x75\xce\x93" + "\xfc\x83\x70\x9b\x8e\xfb\x4e\xe7\xbc\xe8\x3c\x2c\xda\xf0\x49\xe2" + "\xb7\x93\x86\xe0\xdb\x45\x62\x99\xd1\xdc\x7f\x7c\x47\x14\x94\x1b" + "\x0d\xf5\xa8\x97\xc6\x54\xe2\x39\xa6\x70\x3e\xd6\xeb\x74\xb8\xc6" + "\x54\x9c\x86\x1e\x67\xff\x56\xac\x48\xd2\x2e\x5a\xf2\xa2\x7e\x41" + "\xd2\xc2\x04\xed\xe2\xc4\xc4\x15\x89\x5a\x74\x2c\xe5\xde\x7f\x78" + "\xbc\x2c\x87\x5a\x8c\x83\x59\xe6\x8a\x83\xe9\x88\x73\x8f\x1d\x6b" + "\x21\x8e\x79\x43\x33\x7f\xe2\xe8\x11\x73\x56\x2a\xa7\x50\x2e\xe0" + "\x5a\xc9\x2e\xb8\x4c\x70\x95\xe3\x7c\xca\x7c\x3b\x89\x02\x7b\x83" + "\xed\x21\x73\xf9\xbd\x70\x44\xe0\x3e\xa7\x3a\xe2\x38\x5e\x2a\x28" + "\xd0\xce\xc1\xf8\xf4\x3b\x98\x7f\x2c\xf8\x3d\x5c\x26\xb8\xca\xe1" + "\x62\xbf\x13\x3e\x61\x67\xf6\x77\xb8\xbf\xe3\x7b\x58\xb2\x30\xfe" + "\x44\x35\xcd\x54\xb0\xbe\x27\x6c\xe4\xf9\xba\xd5\x41\x4e\xb3\xda" + "\x0c\x62\x3e\xb6\x5e\x18\x9c\x49\xb4\xbd\xe4\x0b\xa0\x59\xcd\x0a" + "\x31\x1f\x3b\x93\x29\xb5\x07\xe3\x50\x40\x7e\x29\x9f\x82\x66\x75" + "\x84\x8a\xf9\x54\xec\xbb\x59\xf2\xde\xbe\x3b\x8c\x66\x7d\x94\x22" + "\xe6\x53\xbb\x97\xe7\x96\x67\xb8\x90\x55\x87\x6d\xae\x16\x32\x15" + "\xdc\x77\x59\x96\x23\x05\xf2\xf7\xea\xbf\x77\x60\x7c\x12\xb4\xdd" + "\xf9\xa4\x5f\xb8\x64\xf1\xaf\x97\x2c\x4f\xc6\x88\x66\x49\x2b\x56" + "\x25\xe1\x7d\xf9\x82\x17\xd8\x6d\xc5\xfc\xe7\x16\xf2\x7f\x92\x96" + "\x46\xe0\x3f\x4b\x01\x6f\x78\x5f\xb4\x4a\x8f\xb7\x85\x2b\xf0\x31" + "\x25\x21\x7c\xd5\x42\xbc\x75\x3f\x8b\xaa\x6b\xcf\x12\xca\x01\x1b" + "\xbb\xb8\x9c\x15\xc0\xfe\xfb\x31\x85\xd9\xd2\x99\x16\x72\x48\xe7" + "\x20\xd2\xdc\x9a\xa7\xdf\x13\xe1\x14\xfa\x3d\x09\xc9\xd4\x2f\x0c" + "\x71\x2c\x59\x0c\x3a\x63\x69\x7b\x16\x55\x5b\xc8\x1f\x53\x44\xd9" + "\x98\xc1\x7c\xe0\x66\x09\xf1\xe2\xfe\x52\x85\x90\xb3\x3b\x12\x63" + "\x3b\xa0\xbf\x2e\x8c\xe7\x0e\xcf\xf1\xf0\x9c\x0a\xcf\xd8\x07\x42" + "\xe1\x79\x1a\xce\x8b\xc1\xb3\x06\x9e\xc1\xd6\xde\x1e\x8d\xe7\x9c" + "\xe1\x59\x0b\xcf\x93\xa0\xfc\xae\xf8\xcf\xbd\x9f\x19\xa4\x85\x52" + "\x8c\x79\x1e\x4f\x9e\x6e\xed\x8a\x27\x8f\xb1\xbe\xd2\xd4\x6c\x0f" + "\x02\xb7\x41\xe8\xc1\x00\xcd\x84\xf5\x90\xa7\x6b\xfd\x97\xcf\xb9" + "\xd0\x63\x92\x0f\x17\x3e\xa7\x82\xb1\xd5\x8a\xeb\xdd\x9e\x41\xfe" + "\xff\x78\x50\x9a\xd7\x63\x71\x41\xe1\x4e\xb3\xd0\xd7\x30\xed\xd5" + "\x67\x02\xb3\x8b\x65\x64\x2e\xfa\x6d\xb6\xa6\x2f\x92\xdd\x52\x4a" + "\x64\xec\x99\xfb\x1d\xa5\xe7\x64\x84\xc5\x47\x97\x7c\x12\xba\xfb" + "\xb3\xe8\xf5\x4c\xd6\x51\xb0\x19\x58\x2c\xb4\xa5\x2b\x42\x1c\x0b" + "\x16\x33\x3b\x50\x46\x76\x73\xf9\xb5\x8f\xdb\x0b\x32\xb2\x8d\x3e" + "\xc9\xe3\xe5\x58\x64\x32\x1d\xf7\x7f\xb5\x74\x05\x85\xdf\x86\xa4" + "\x2c\x58\xcc\xd2\x20\xdf\x3a\xb0\xd5\xc4\xfa\xe5\x9a\xc3\xf0\x9c" + "\xad\xc0\xfd\x74\xc8\x48\xce\x33\x13\x32\xf0\x3b\x4a\x66\x87\x1c" + "\x25\x2a\x8c\xeb\x8a\x75\x2b\x75\xf3\x99\xb8\x01\xd2\x70\x1f\x6b" + "\xeb\x93\x44\x85\x3e\xa2\xc5\xba\xe4\xb0\x38\x75\xd9\x32\xad\xe4" + "\xef\xca\x02\x69\xdd\xdb\xf3\xe4\x53\x0c\x95\x93\x17\x86\xcf\x7e" + "\x04\xfe\x0b\x17\x43\xa3\xbb\x63\x33\xac\x75\xe4\xfe\x88\xd6\xbf" + "\xcd\xf9\x37\x16\xff\x36\x5b\xa6\x87\x72\xd8\xf8\x46\xc0\x71\x78" + "\x7b\x5c\x31\xdb\x07\x2b\x93\xe1\x38\x27\x4a\xc8\x42\x7b\xb2\x19" + "\xbe\x2f\xc3\xb3\xf4\x60\xe7\xec\x5b\xf4\xc6\x5a\xf4\xff\x2d\x03" + "\x1a\xcb\x8c\xf8\x4e\xf4\x23\x26\x67\x7e\xb6\x9c\x44\xc3\xce\x29" + "\x83\x8d\x82\xe7\x60\x1b\x64\x8a\x77\xd0\xee\xc0\x39\x2d\x21\x5b" + "\x16\x89\xb8\x05\x1e\xa3\x1f\x13\x1b\x1d\xb9\x5b\x4b\x03\x4d\x18" + "\x3b\x53\x81\xb6\x2e\x9e\x9e\x69\x90\xc9\x51\xfe\x3d\x0c\xd7\xbf" + "\xf1\xb8\x44\x4f\x37\x4a\x65\xc2\xb3\x0a\x6c\xa8\xa5\x70\x57\xb7" + "\x67\xcb\x75\x6e\xb1\x1f\xf9\xb9\x6c\x99\xfc\x31\xf4\x3f\x87\x65" + "\x33\xdb\x59\xa6\x60\x7e\x17\x21\x6f\xac\x85\xa8\x99\x8f\x18\xf8" + "\x1f\xec\x9f\x7c\x22\xfe\x0f\xf6\xcf\xaf\xe2\xbb\x95\xf1\xa1\x34" + "\x5f\xcb\x30\x2d\x93\x17\x02\x46\x1f\x86\xeb\xdf\x20\x7f\x89\x85" + "\xfc\x1f\x96\x7f\x9d\x9c\x9d\xd5\x6c\x08\xd0\x90\x08\x48\xdf\x29" + "\xa5\x0f\x93\x45\x01\x4d\xe5\x07\xa5\xbe\xdf\x3a\x72\x5f\x34\x3c" + "\x1f\x93\xe6\x79\xd8\xbc\x4f\xb6\xbc\xde\xed\x39\x16\x9e\x6d\xd2" + "\x73\x7b\x76\x00\x91\x64\x05\xce\x8b\xb4\xa6\xc7\x6d\xc6\x71\xef" + "\x42\x0d\xd8\x85\x60\xdf\xc0\x7b\xe0\x7f\x9e\x89\xff\xf6\x8c\xa5" + "\x35\xcb\xd8\x68\x0b\x96\x6b\x6d\x20\xff\xe0\x1d\xd8\x7f\xcb\x62" + "\xc5\x72\xa2\x2d\x72\xe3\x0e\xa9\x6d\x42\x56\x40\x88\x90\x6b\xd2" + "\xf2\x36\x2a\xd6\xc3\xff\x93\xac\x81\xbb\x2c\x90\x4f\x6f\x21\x94" + "\xfb\xc6\x49\x3e\xbb\xd5\xd0\xa1\x8e\x35\xc3\xc8\xd9\xf4\x1c\x62" + "\x4e\xc1\xe6\xae\x8d\x6b\xd4\xb3\xd1\xee\x44\x5f\x24\x2c\x5e\x1e" + "\xfa\x3e\x75\x90\xe1\x2c\xde\x44\x6e\x53\x0d\x8b\xb3\xf0\x92\x4e" + "\x25\xf9\x3d\xa5\x39\xbb\x8e\x51\xb9\x7e\x29\xfa\x42\x65\x71\x65" + "\xda\x75\xc1\xcc\xff\xa9\xe8\xf7\x74\x4b\x32\x09\x2d\x11\xb8\xdf" + "\x53\xe6\xa7\x64\x38\x8c\x53\x92\x7b\xf7\x7d\x4a\xb3\xde\x51\x49" + "\xbe\x4f\xe9\x05\xa7\x1d\xfe\x9f\x04\xf4\x50\xc0\x5d\xc7\x9e\x5d" + "\x3e\xaf\x14\xbd\xfa\x42\x95\x83\xdc\x93\x73\x5f\xa8\x03\xd2\x17" + "\x32\x05\x8f\xb9\x9a\xad\x00\xf9\x97\xca\xf7\x14\xb9\xd2\xb6\x41" + "\x9f\xe1\x73\xc5\x32\x79\xb4\x98\xb6\x0b\xf8\x12\x2a\x8e\x4b\xad" + "\x38\xcf\x80\xf3\x65\x20\x13\x2a\x68\x67\xc2\xe6\xde\x64\x4e\x4b" + "\xb0\x72\x6b\x0b\xfa\xc8\xc8\x56\xd8\x2d\xb2\x61\xcc\x6f\x3b\x1b" + "\x4b\xca\x14\x3d\xfc\x36\x3f\xbb\x70\xc5\xa2\xc5\xf3\xff\xb8\x4c" + "\xaf\x7d\x32\xf6\x61\x16\x90\x33\x5c\xbb\x24\x69\x31\x53\x49\xda" + "\x27\x1f\x79\x28\x26\x26\x76\xfe\x53\xb1\x0f\xc6\xce\x79\x6a\x3a" + "\x3f\x35\x19\x9b\xc8\xdc\x9e\x26\xad\xd0\xe2\x8f\x9e\x15\xa3\xd6" + "\xaf\x59\x9c\xb8\xa2\xbb\x3c\x08\x65\x73\x6d\x72\x36\xaf\x6c\xc3" + "\xff\xd9\x7c\x9e\x6c\x58\x91\x34\xcf\xc6\x65\xdf\xb0\x57\x90\xb6" + "\x2c\xa6\x7d\xf6\x30\x15\xda\x57\xcc\xa7\xd0\x18\xa6\x77\x14\xd8" + "\xa7\x51\xff\xb4\x67\x0f\x33\xb9\xfb\x07\x13\x7f\x5b\x2f\xc7\xdf" + "\x89\x7d\x59\x4c\xbb\x48\xc7\x8f\x4f\x67\x3e\xbe\xb2\x87\xd9\xa4" + "\xb9\x77\x4c\x93\xea\x50\x87\x79\xb2\x87\x4d\xef\x8a\x5b\x9d\x3d" + "\x3c\xcc\x15\xef\x94\xfd\x79\xd0\x88\x10\x34\x67\x86\x81\xad\x32" + "\x1c\xae\x11\x78\x45\x77\xc9\xf7\x64\x5a\x83\x63\xb6\x10\x19\xe8" + "\xe0\x94\x00\x1e\xe3\x2c\xfb\x18\x8b\xcb\x11\xe3\x74\x04\xcc\x77" + "\xca\xe1\x1e\x40\xe7\x3b\x15\x6c\x9c\x48\x93\xe9\x31\x76\xde\x3f" + "\x99\x56\x63\x2c\x3f\xc0\x71\x4e\x8c\x23\x2d\x27\xc6\x49\x1d\xf3" + "\xc1\x7e\x87\xfb\x0f\x78\x6e\x3d\xc6\xf9\x03\x65\xf1\x8c\x70\x3e" + "\x87\xfb\x3a\x2c\xc7\x7d\x9c\xcf\x00\x86\x4b\x5b\x78\xec\xeb\x98" + "\xd5\x3f\x9d\x9c\xbf\xda\xc2\x63\x5f\x9f\xe3\xf1\xe2\xf1\xfb\x50" + "\x66\x1a\x94\x73\x78\xbe\x33\x40\x1b\xe3\xec\xa4\xec\xec\x6d\xf6" + "\x08\xd2\x57\x3c\xeb\x5e\xe7\x2f\xb2\x4f\x84\x51\x63\x6e\x12\xcd" + "\xae\x6d\x86\x3b\x8c\x09\x4d\x38\xe7\x2a\xa3\xd9\x27\xf7\x50\x63" + "\x1e\xa4\xd7\x19\xe0\x6e\xa3\xd9\xa7\xe7\x51\x63\x3e\x3c\x37\x86" + "\xc3\x1d\x9e\x3f\xb1\x41\x7e\x3d\xcd\x3e\x80\xbf\xb3\xd2\xec\x83" + "\xf5\x90\x0f\x9e\x0f\xd5\xc2\x1d\x9e\xff\x71\x0c\xf2\xc1\xf3\xa7" + "\x15\x0d\xb2\x11\x07\xe1\x7f\x48\x6b\x72\xf0\x6f\x9d\x75\xb0\x6f" + "\x65\x5b\x1d\xfc\x1b\xad\x0e\xfe\x8d\x0b\x0e\xfe\x8d\x8b\x0e\xfe" + "\x8d\x72\xf8\x5d\x6e\x0a\xcd\xfe\x2c\x12\xee\x76\x9a\xfd\xf9\x36" + "\xc8\x07\xcf\x95\xa1\x70\x87\xe7\xaa\xf5\x90\x0f\x9e\xcd\x50\x97" + "\x7c\x78\x3e\xb2\x08\xf2\xa5\xd2\xec\xa3\x35\x70\x77\xd0\xec\x63" + "\x33\x21\x1f\x3c\x1f\x37\xc1\x1d\x9e\xbf\x82\x72\xf2\xe1\xb9\xa6" + "\x0c\xee\xf0\xec\xc0\x7a\x64\xd0\x6c\x01\xcb\x25\x34\x8f\x60\xfe" + "\x0c\x9a\x27\xc3\xf2\xe0\x39\xa0\x04\xee\xf0\x3c\x6c\x06\x35\x1a" + "\xe0\x79\x38\xb6\x75\x3d\xcd\x53\x16\x43\x3e\x05\xcd\x1b\x09\xe9" + "\x79\xf0\x3c\xca\x0a\xf9\xe0\x39\x08\xf3\xc3\x73\x48\x34\xe4\x87" + "\x67\x35\xd2\x28\x87\xe6\xfd\x22\x16\xf2\x29\x69\xde\x75\x3b\xe1" + "\x0e\xcf\x1a\xa8\x7f\x3e\x3c\x8f\x4f\x82\x3b\x3c\x87\x01\xad\x0c" + "\xf0\x7c\x23\xb6\xd3\x40\xf3\x6e\xc2\xf2\x41\x5f\xdd\x82\x74\x81" + "\xe7\x5b\xe3\x21\x1f\x3c\xeb\x90\x8e\xf0\x7c\xa7\x0e\xf2\xab\x7a" + "\xe5\x67\xde\x5d\x84\x66\x0e\x87\xba\xde\x97\x44\x33\x47\xc0\x7d" + "\xea\x24\x9a\x39\x4c\x47\xf3\x7e\xb3\x1e\xd2\xe1\x3e\xd5\x01\xcf" + "\xe1\xe2\x33\xdc\xef\x3f\x06\xcf\x11\xe2\x33\xdc\x7f\xbd\x1d\x9e" + "\x23\xc5\x67\xb8\x4f\x8f\x84\xe7\xa9\x34\xef\xb7\x2a\x78\x86\xfb" + "\xf4\xad\xf0\x3c\x4d\x7c\x86\xfb\x03\x60\x93\x0f\x77\x58\x27\xc4" + "\x4e\xb5\x06\xc5\x59\xad\x41\x46\xf4\x45\x49\x9c\x05\xb9\x7a\x21" + "\x38\x17\xfd\x24\x0e\x4f\x6f\x23\x23\x1a\x64\x23\x57\xa3\x9c\x30" + "\xa7\x5a\x58\xec\x47\xd1\x77\xe6\xf0\x3a\x59\xa0\x11\xec\x9e\xa9" + "\x20\x97\xe5\xd0\xf6\xed\x34\x6b\x58\x0b\xb4\x39\x9c\x66\x8d\xaa" + "\x83\x3b\x3c\x8f\x3e\x0a\x6d\x86\xe7\xfb\xf2\xe0\x0e\xcf\x4f\x3f" + "\x04\x6d\x0f\x6f\xcf\x0e\x6c\xb6\xc8\x46\x68\x59\xbf\xff\xdb\x9c" + "\xd9\x21\x8e\x74\x1a\xe3\x00\x7d\xb0\xb9\x48\x1b\xe2\x88\x27\xd4" + "\x58\x00\x72\x5d\x4b\xe8\x96\xd8\x14\x1a\x3c\x97\xd5\x09\xe3\x30" + "\xd1\xce\x49\x72\xfe\xed\x51\xb4\x4e\x36\x72\x1c\xc6\x0b\xa1\xc1" + "\x2b\xbd\xbd\xbf\x9f\xbd\x1f\x5f\x14\xc1\xdf\xab\x89\xeb\xfd\xbf" + "\xe1\xfb\xb9\x21\xe8\x77\x7f\xe2\x8c\x08\x8b\x6c\x64\x06\xe6\xb1" + "\xc8\x02\x4b\x68\x56\x00\x31\xdb\x1a\xc5\x36\x8e\xc0\x7c\x99\xf8" + "\x3b\x6f\xf3\x36\x82\x61\x63\x9c\x11\xe4\x16\x8e\x63\x41\x7f\xc9" + "\xb5\x69\x93\x76\xd5\xc9\x54\xb3\xb7\xb0\xf9\x89\x4d\x76\x2e\xcf" + "\x46\x5d\xd7\x99\x67\x8a\xd5\xae\x09\x81\xf2\x54\x4f\xa4\xdb\xa9" + "\xcd\x94\xf6\x10\xc8\x42\x96\x5e\xc8\xce\x1d\xf1\xff\x53\xd9\x7e" + "\x52\xfe\x7f\x02\x9b\xbb\x86\xb2\xf0\xb7\xee\xe3\x06\x67\xf6\xaf" + "\x6a\x85\xe0\x22\xc2\xd6\xe3\x65\xa3\xc6\x7d\x2c\x58\xe4\x21\x49" + "\x64\x98\x76\xcd\x3e\x28\x7f\x54\xbc\xc7\x18\xb3\x2b\x2f\x7b\xf7" + "\xc8\x5e\xc8\xfb\x3a\xce\x07\x65\x8f\xd2\x77\xc5\xde\x86\x36\xe4" + "\xa3\xee\x92\x93\x28\xd4\xa7\xdc\x66\x1d\x65\xad\x4c\x25\xc4\xa1" + "\x32\x5a\x1c\x86\x38\x8b\xd3\xb0\xc9\x4e\x0b\x8a\x48\xb0\x43\x46" + "\xd8\xbe\x7f\x99\x6a\xf2\xdd\x76\xb4\x11\x3f\xc3\xbc\xdf\x0a\xc3" + "\xa7\xab\xef\x4a\x21\x72\x53\xe2\x09\x78\x56\x4d\xa0\xd9\x0f\xa5" + "\x98\x9b\x6b\x88\x29\x11\xcb\x52\x85\xd1\xec\x59\xe5\xc2\xf0\x47" + "\x6d\xa5\x68\x6b\xa7\xe0\x5c\xd9\x51\xfc\xdd\x9b\x40\x67\xd0\x03" + "\xa3\x1c\x52\x5d\x50\x07\x18\x81\x76\x68\x07\xa3\x0f\x8d\xf9\x4e" + "\x27\xfa\xa4\xcb\xb1\x00\x1d\xb8\x8e\x1c\x65\x01\x1b\x80\xf0\xef" + "\xaa\xee\x15\x46\x9a\xa2\xaa\xe6\xe1\xda\xa3\x1a\x7d\x7c\xd9\xd8" + "\xb9\x7b\x8c\x8a\x2d\xa0\x8e\xe6\x79\xdd\x79\xb7\x6c\xa1\x7e\xfe" + "\x1a\xfd\x8a\xc4\xa4\xf9\xab\xf4\xbf\xd6\xc2\xe0\x4f\xbb\xe2\x39" + "\xed\xb2\xc5\xcb\x56\x24\xae\xee\xe1\x57\xa8\x3d\x5b\x55\x04\xd8" + "\xd8\x8a\xf5\x3a\x0c\x36\x38\x5b\x07\x90\x05\xe3\x59\x33\xd9\xe6" + "\xbf\xf0\x78\x2a\x90\x07\xf4\xff\x0b\x6c\x6e\x45\x28\x2e\xd2\xd0" + "\x92\xd8\x94\x5c\xf4\x1d\xb2\x0a\xe3\x75\x58\x89\x99\xb4\xf0\x18" + "\xcb\x2c\x7e\x22\x8c\x09\x92\xd7\x52\x53\x72\x0b\x60\xdc\x68\x87" + "\x4b\x09\x18\x37\x5d\x34\xce\x8d\xab\x93\x05\x47\x5f\x34\x1a\xec" + "\x52\xfc\x2b\xa7\xc1\x18\x27\xa8\x36\xea\x31\xfe\x55\x27\xd5\x90" + "\x4a\xa0\x65\x47\x8e\x29\x1c\x64\xbc\x6e\x4b\x16\xdd\xe5\x84\x31" + "\x12\xf3\x7b\xf3\xb7\x39\x11\x4e\xaa\x53\x38\xb3\x88\x12\xee\xc1" + "\x34\x78\xd3\xd6\x4e\x95\xd1\x8a\xef\x31\xee\x95\xb3\x53\x47\xd2" + "\x8e\x51\xe1\xdf\x13\x00\x37\x59\x84\xb2\x38\xbf\x09\x67\x09\xa4" + "\x8f\x14\x0a\x8c\x19\x0d\xd1\x44\x8e\x79\xc1\x3e\x23\xf3\xe0\xff" + "\xd4\x05\x24\x08\xf2\x85\xa4\x1e\x86\xf4\x76\xdd\x48\x47\xba\x4e" + "\xd9\x91\xae\x1b\xd9\x49\x75\x2a\x73\xbd\x9d\x74\x4e\x9e\x13\x35" + "\xc5\x4a\x14\x9b\xc1\x8e\xdb\x22\x40\xff\x2a\x89\x8d\x77\xbe\xac" + "\x1b\xee\x78\x59\xa7\xe8\xec\xd4\x29\x1d\x2f\xe9\x14\x1d\x2f\xe9" + "\x86\x77\xb6\xeb\x94\xe6\x45\x56\xf2\x99\xf5\xbf\x48\x55\x7d\x23" + "\x9b\xa7\xed\x0c\xda\xb4\xbd\x33\x08\x84\x5f\x3d\x09\xbd\x4b\x0f" + "\x76\x1c\xd8\xb7\xaf\x81\x6d\x0f\x98\x50\x39\xde\x9a\x13\x41\x8d" + "\x9b\x66\x03\x7d\xa7\x3c\x72\x3b\xfd\xc9\x99\x3d\xc6\xa6\xfd\x3d" + "\xc8\xa2\x4c\x85\x06\xd2\x00\x3f\x37\x2e\xa2\xd9\x37\x80\x7c\x53" + "\x84\xc1\xa5\xb5\x70\x3e\x10\x9a\x3d\xba\x0c\xe7\x09\x30\x2f\xcf" + "\x77\x3d\xd8\x54\x78\x0f\x8d\x66\xf1\x78\xb3\x55\xf3\xb6\x30\x1b" + "\x22\x38\x5e\xb2\x21\x0e\x2a\x7a\xf7\x4f\x02\x79\xd6\x77\x8d\xb9" + "\x05\x90\x27\xc6\x5c\x6f\xf3\xb5\x0a\xf4\x01\x4d\x0b\x72\x0b\x0b" + "\x85\x2e\x9f\xd1\x20\x0f\x83\xdf\x81\xfe\x93\xc1\xde\x19\x0a\x48" + "\xda\x79\x12\x80\xef\x76\x5c\xb0\xcb\xf1\x59\x9b\x28\xa3\x66\x9b" + "\x9d\x14\xe2\x7a\x45\x58\x6c\xca\x8e\x0b\x56\x39\xe2\x05\xd7\x7c" + "\xe0\xb7\x87\x0a\x2f\x88\xe5\x16\x17\x69\xd3\x57\x12\x16\xd3\x06" + "\xe3\x62\x21\x8e\x0a\xd3\x60\xcc\x88\x31\xbc\x12\x03\xa0\x1f\x87" + "\xc8\xe0\x7f\x25\xe6\xa3\xaa\x02\x22\x40\x19\x80\xa5\x04\x1a\x64" + "\x6c\x14\x8c\x46\x3d\x60\x2a\x82\x4e\x88\xad\x11\x36\x17\x41\x9b" + "\x42\xe2\x80\x1e\x7a\x69\x0e\xa2\xaa\xcc\x41\xd0\xe7\x17\x7d\xc8" + "\x41\x0e\x25\xb5\xa1\x5f\xe0\x00\x6b\xa0\x29\xc2\x1a\xb4\x31\xce" + "\x1a\xb4\x69\xb6\x60\xdc\x58\x0c\x57\x89\x3e\x91\xa8\x9a\x64\xea" + "\xb0\x2e\x9f\xb5\xe7\xaf\x12\x9f\xb5\x60\x97\x31\xfb\x0c\xb0\x83" + "\xf6\x16\xb4\xb7\x06\x63\xd3\xa0\x1d\x86\x32\xb7\x3d\x5b\x1d\x2d" + "\xd9\x51\x28\x47\x9c\xb9\xa6\x69\x70\x4d\x85\xf4\x78\x8b\xec\x96" + "\xf5\x92\x8c\x01\xbd\xa2\x16\xf2\x1e\x8b\x67\x6b\x63\x9d\x09\x0f" + "\x60\x5e\xa0\x5b\x14\x7c\x2b\xc0\xd9\x99\x30\x0d\xae\xe9\x70\xfd" + "\xd6\x69\x34\x5a\xe0\x22\x4e\xe3\xa6\x08\xa7\x71\x6e\x28\x5c\x1a" + "\xb8\xc2\xe0\xd2\xc2\x35\x09\x2e\xd0\xe7\x73\xc3\xe1\x8e\xef\x23" + "\xe1\x9a\x0a\xd7\x34\xb8\xa2\xe0\x9a\xe1\xdc\x5c\xa4\x16\x00\x9f" + "\x70\x69\xe1\x82\xdf\x6d\x4c\xe8\xdd\x6f\xca\x19\x1e\x83\x63\xd8" + "\x49\x1a\x82\x31\x9a\x53\xdb\xd0\x1f\x65\xcd\x21\x9d\x6d\x60\xb1" + "\x58\x64\xa3\xd5\xde\xe6\x3a\xb0\x7c\xe8\x5b\x9d\x03\x2c\x2f\xde" + "\xeb\xdc\x89\xa6\x48\xe3\x08\x8b\x35\xa1\xff\x75\xe8\xcf\xb2\xaa" + "\xf8\x7a\x12\x63\x25\xe9\x15\xf5\x1d\x24\x7d\x11\x75\xb2\x71\x74" + "\x2a\x9e\x85\xd1\xb3\xbd\x0a\x4e\x1a\xa7\xed\x34\x18\x95\x4e\xd5" + "\xc6\x08\xaa\xda\x98\xc0\x7c\x5c\x82\xec\xc1\x98\x77\x5d\x63\x48" + "\xc4\x14\x8c\x23\x2b\x9b\xdb\xc8\xcb\x8b\xa8\x50\x99\x80\x27\x75" + "\x01\x5c\x32\xf2\x26\xe2\x4b\x1a\x47\xfe\x4b\x2d\xcd\x00\xac\x04" + "\x3a\x81\x6e\x02\x8e\x1f\x01\x57\x38\x96\x94\xb0\x05\xba\x4c\x2d" + "\xc5\x09\xa3\xc3\xd5\x36\x78\xa7\xc0\x38\x62\x25\x30\x7e\x2c\x49" + "\x26\x93\x4a\xe0\x1d\x8b\xf9\x0a\xf5\x7e\x5c\x1f\x42\x85\x17\x74" + "\xa4\xf4\x8f\x44\x19\x74\x96\xc7\x11\x76\x02\xed\xbb\x62\x69\x18" + "\xe6\xc6\xcd\x3a\xab\x25\x87\x74\xdf\x82\x4e\xda\x01\xb2\x7b\x6e" + "\x5c\x27\xc8\x6d\xa0\xa5\x73\x60\xb4\x1c\xb3\xfd\x52\xd1\xb2\x33" + "\x2c\x36\x9e\xd3\x33\x9e\x20\xcd\xba\xd3\x13\x69\xbc\xa6\x1e\xe8" + "\x09\x74\x35\x1f\x73\x92\x60\x19\x59\x20\xd1\xf3\x75\xa0\x27\xd0" + "\x54\x83\x34\x05\x7a\x30\x9a\x52\x91\xa6\xa5\x6e\x34\x05\xd9\xc4" + "\xfc\x81\x22\x4d\x05\xa0\x69\xa9\x17\x9a\x76\x8d\xc5\x81\xa6\x6f" + "\xf8\x44\xd3\xb2\x41\xd0\x34\xb4\xc7\x78\x50\xa2\xa9\x03\xf5\x65" + "\xc1\xdc\xd9\x14\xe4\x9d\xd9\xf1\x19\xf3\x6d\x0b\xb6\x4e\x09\xd8" + "\x6c\xc5\x82\xca\x18\x07\x34\x51\xe1\x9e\x54\x8c\x5b\xc7\xfc\xd0" + "\x95\xd1\x8b\xce\x82\x4d\x3b\x30\x0d\xe4\x56\xc2\xdd\xe8\xcb\x0f" + "\xac\xa4\x52\x39\xdd\x55\x75\xc1\x06\xfa\xe5\xfa\xfb\x3b\xd0\x96" + "\x2c\xd8\xf4\x93\x40\x13\x08\xca\x90\x67\x6e\x27\x8a\x0e\x90\x13" + "\xfa\x64\x72\x63\x21\xc8\xba\x0e\x90\x9d\x4d\xb2\xd0\x63\x8f\xe8" + "\x05\x0a\x57\x3a\xfa\x68\x15\x82\x36\x16\x83\xac\x66\xfc\x45\x9e" + "\xe1\x5a\x61\xe5\x33\x9f\x40\x79\xd7\x1d\xfa\x3c\xde\x41\xd2\x13" + "\x7a\xf2\x57\x48\x8f\xd3\x3a\x0d\xfd\xf7\x13\x8c\x9d\x99\xda\x88" + "\x7c\xdd\x41\xcc\xf5\xae\x7e\x22\xbc\xc4\x65\x30\xf2\x02\xfb\x05" + "\xf6\x91\x0d\x6e\xb2\x17\xe4\xba\x7a\x8b\x18\x4b\xc6\x09\xb2\x17" + "\xf2\x2a\xd0\xb7\x2b\xc6\x98\xe9\xb5\x7f\xbc\x0c\xfd\x63\x0d\x8b" + "\xf3\xa5\x01\x7a\xec\xe8\x68\xe7\x3c\x44\x9e\x99\x1d\xe5\x8c\x7f" + "\x85\xa2\xac\xe7\x74\xdf\xf8\x02\xa5\x71\xc4\x09\x75\x17\x0a\x36" + "\x6d\xa5\xed\x09\x23\x71\x5e\x11\xc6\xba\x11\x21\x8b\xc0\x6e\xf8" + "\x09\x74\xc1\x72\xc0\xd7\x39\x32\xe9\x8d\xe5\x60\x0b\xb4\x63\xbc" + "\x3e\xa8\xcf\x6a\x1e\xe7\x58\xc8\x1e\x1d\x07\xef\x98\xcf\x59\x41" + "\xf2\x39\xdb\xaa\xc3\x31\xba\x6b\x6e\x67\x85\x4e\xee\xfa\xe6\x21" + "\xbd\x53\xf9\x53\x0d\x3b\x9f\x2f\x1b\x6b\xe4\x6b\xd1\xff\x1d\x8d" + "\x74\x6d\x96\x8d\x35\xf1\xf9\xdc\x1d\x33\xf5\x69\x64\x44\x93\x6c" + "\xec\x2a\xb0\xab\xa2\xf4\x18\xb3\x5d\x7a\x97\x0e\x75\xcd\xda\x66" + "\xbf\x2b\x83\x64\x38\x73\x7f\xb2\x9b\x53\xce\xa2\x0f\xc7\x01\xca" + "\xde\xb1\x6c\x3f\xa0\x33\xe7\x50\x12\xd0\x29\x4a\xc8\x3b\x94\x0a" + "\x32\x25\x82\xbe\x00\x6d\xfd\x23\xb4\xb5\x09\xe8\xda\x04\x6d\x7d" + "\x49\x6c\xab\x18\xc3\x50\x00\xfa\xc3\xbb\xde\x75\x9f\xd4\xd6\x17" + "\xd0\x5f\x7b\x99\x66\xed\x59\xf2\x0b\x7a\x33\xae\xcf\xb2\xf3\x93" + "\xed\x66\xc7\xb7\x04\xbf\xcb\x74\xb3\x61\xae\x6e\x0e\xe0\x11\x69" + "\x0e\xf6\x40\x21\x0d\x36\x66\x48\x7c\xc0\xfa\xd0\xce\x84\x91\xa5" + "\xcb\xa1\x3e\x48\xfb\x73\x24\x1c\xfb\x33\xd0\x7e\x52\x29\xd2\xdf" + "\x33\x8e\x78\x28\xe3\xc1\x70\xe0\xc1\x72\x91\x07\xb9\x22\x0f\xc0" + "\x4e\x04\x3d\xad\x04\xfd\xab\x29\xcd\xe2\x3c\x18\x18\x8d\xae\xf7" + "\xea\xff\xdf\xcf\xfe\xba\xd3\x7b\x7f\x1d\x7f\xb6\x83\x8f\x0d\x65" + "\xe8\xfb\x16\x6c\xe3\x56\xa1\x13\xfa\x6d\x81\xd8\x6f\x69\xc2\x6f" + "\xa5\x3e\xdb\x20\xd3\xe4\xfa\xd6\x67\xc7\xad\xfe\x5f\xda\x67\x43" + "\x2f\x6d\x9f\x1d\xff\xa0\x67\x9f\x1d\x9f\xe4\xd9\x67\xc7\xdf\xee" + "\xea\xb3\xe2\xbb\x21\xe9\xb3\xe3\xa3\xae\x4c\x9f\x1d\x1f\xd5\x4b" + "\x9f\x2d\xf2\xa1\xcf\x6a\xbc\xf4\x59\xcd\xa5\xeb\xb3\x37\x2c\xba" + "\x7c\x3a\x76\xe2\x5b\x1d\xf2\x5e\x74\xec\xcb\x6e\x3a\x36\x08\x75" + "\x6c\xd8\xd4\xde\xfa\x6b\x67\x09\xf4\x57\x95\xd8\x5f\xff\xfd\x23" + "\x28\x6f\xc2\x3d\x9f\xd5\xf6\xdf\x5f\x1d\x25\x2e\xfb\xc9\x6b\x9f" + "\x4d\xc0\x3e\x5b\x46\xcc\x16\xd6\x67\x17\x48\x7d\xb6\x44\x1c\xeb" + "\xf4\xd1\x6f\x43\xbd\xf5\x5b\x8c\xeb\x86\x31\xdd\xfa\xec\xb7\xa2" + "\xbd\xd4\x39\x01\xfb\xad\xe9\x2a\xd3\xb5\x13\x2e\x7a\xf6\xdb\x89" + "\xe1\x9e\xfd\x76\xc2\x29\x57\xbf\x15\xdf\x0d\x49\xbf\x9d\x60\xbf" + "\x32\xfd\x76\x82\xfd\xe7\xa3\x6b\x6f\x0c\xbb\x7c\xba\xf6\xe6\x05" + "\xac\xdf\x7a\xd3\xb5\xe9\xa2\xae\x0d\x42\x5d\x7b\x63\x9b\x6f\x7d" + "\x57\x7b\xf6\x7f\x79\xdf\xbd\xc4\x3a\xf7\xa6\x0f\x3d\xfb\xee\x4d" + "\x8d\x9e\x7d\xf7\xa6\x2d\xae\xbe\x2b\xbe\x1b\x92\xbe\x7b\xd3\xce" + "\x2b\xd3\x77\x6f\xda\xf9\xf3\xd1\xb9\x37\x7b\x8d\x09\xab\x9d\x48" + "\x32\xea\x64\xb7\xdc\x63\x2e\x61\x7b\xe8\x32\xcc\x8e\x5f\xf3\xfd" + "\xe2\xb2\x5b\xe6\x9a\x35\x53\x89\x90\x67\x2a\xc3\xd8\x2e\xb8\xff" + "\x65\x93\xdb\xfe\x12\xbe\xfe\x7a\xcb\x6a\x69\x7f\xcc\x1b\x62\xfc" + "\x97\xbe\xf6\xc7\xd0\x1c\xd3\x54\xf1\x77\x3b\x39\x36\x4c\xd3\xa4" + "\x67\xe6\x8f\x46\x76\xcb\x2e\x9a\x6b\x8a\xb4\x06\x9a\x22\xbd\xad" + "\x91\x04\x67\x52\x8a\x7b\x42\x5a\x27\xc6\x5a\x5a\xf3\x08\x29\x64" + "\xeb\x0f\xb7\x58\xe1\xb7\xcc\x97\x67\x6b\xb0\xb2\xba\x35\x6b\x36" + "\x69\xcf\x9e\xa4\x90\xd2\x58\x2c\xf5\xac\x00\x2a\xc0\x3b\x5a\x10" + "\xb7\x07\xe3\xfb\xa1\xaf\xe4\xbb\x2e\x20\x16\x27\x85\x82\x8c\x60" + "\xfb\x3d\xd8\x9a\xfb\xf5\x37\xd8\x4a\x5b\x88\xa2\x6a\x3d\xdb\xf7" + "\x86\xfb\x6a\xb6\x16\x20\xfe\x03\xee\x28\xa6\x72\x05\x11\xb6\xc4" + "\x96\xd3\xa0\x8d\x5b\xd9\x3e\x60\xc0\x8a\xb4\xd7\x06\x63\x21\x0a" + "\x13\x62\x13\x24\x7f\xbd\x14\xea\xb7\x37\x0d\xcf\xaa\x06\xd0\xd2" + "\x44\xa2\x86\x4b\x45\x8d\x1b\xb7\x42\xbd\x4a\xa4\xb9\x43\xaf\x7b" + "\xba\x31\x1e\xf4\x0d\x1a\x85\xb8\xaf\x07\xfd\x16\xb0\x98\x42\x1b" + "\xe4\x42\x8e\x13\xd2\x69\x56\x3a\x35\xa7\x38\x48\x08\xd0\x02\xd7" + "\xdb\x31\x2e\x99\x50\x1a\x6b\x59\x37\x9e\x90\x77\xd7\x34\xca\x71" + "\xef\x85\xf3\xaf\x37\xd8\x4c\x69\xbf\xc4\xf5\x78\x16\x83\xa0\x41" + "\x36\x79\x73\xcc\x19\x1e\xfb\x19\xfe\x7f\x0b\xd7\x1d\x66\xc1\x33" + "\xae\x67\x0b\xad\x1a\x05\xe6\x85\xf4\x27\x4c\xc9\x27\x48\x88\x9e" + "\x28\x0b\xa0\x6d\x62\x5e\xf4\xb7\x01\xbc\x99\xcc\x62\x38\xc0\x73" + "\x24\xce\x95\xc3\xef\xd8\x3c\x29\x2d\x89\x2d\x67\xf2\xc1\xb0\x71" + "\x2b\xb4\xbf\x9c\xed\xfb\x84\x76\x6e\x80\x36\x43\x1e\x15\xee\xb7" + "\x61\xf7\x34\xa2\x2e\x82\x34\x2c\x07\xee\x2a\xb6\xe7\x57\x36\x59" + "\x8d\x65\x7b\x3d\x2b\xa0\xda\xb8\x95\x02\xb6\xf9\xf9\x1d\xd9\x91" + "\x3a\xd9\xad\x33\x42\x64\x94\xc2\x37\x13\xd6\xe1\x1c\x36\xee\xcf" + "\xc6\x3d\xe7\xb2\x5b\x27\x40\xf9\x8a\x37\xd8\x9c\xed\x64\x87\x45" + "\x36\xa9\xcb\x2f\x39\x5f\x67\xb9\x35\x16\xbf\x83\xbf\xe1\xf9\x27" + "\xb3\xfd\xe8\x58\x67\x6d\x5a\x00\x85\xf7\xd3\xf9\x1e\x6e\xe5\xdf" + "\xdb\xb3\x6f\x9d\xd6\xb5\x87\x9b\xff\x0e\xb0\x74\xeb\x6c\xe0\x19" + "\xdb\x5b\x86\xcf\x5e\xf7\x14\x8b\x7c\xab\xd4\x00\x36\xba\xf3\x4e" + "\xc2\x08\xe0\x42\xc2\x08\xd6\xf7\xbd\x34\x8b\x9c\xef\x11\xba\x95" + "\xf9\xb8\x2f\x00\x1e\x3a\x5f\xd7\x28\xd8\xbc\x74\x27\xf2\xa5\x0e" + "\xde\xdd\xf6\x67\xe4\xcb\x06\xd0\x05\x62\xde\x5d\xae\xfa\xe3\xf3" + "\x6d\x8c\x9f\x02\xf0\x82\xef\x59\xba\x6d\x09\x8b\x01\x05\x32\x03" + "\xf7\x9a\x1f\x4c\x21\xb8\xfe\x59\x4e\x01\x23\xef\x26\xda\xe5\xa5" + "\xc9\x3c\x7d\x6f\x8b\x5d\xbe\xa1\x89\xa0\x6c\x21\xc6\x3f\x12\x05" + "\xe8\x21\x05\x96\x49\xc3\x62\xd9\xf9\x07\xc6\xc7\x35\xc0\xbb\x64" + "\xc0\x2e\xd0\x7c\x03\xd0\xaf\xb4\x83\xad\xd3\x24\x94\x0a\x44\x25" + "\x40\x3e\x8b\xec\xb6\x6d\x50\x9e\x7a\xcb\x58\x6a\xc5\x3d\xd1\x40" + "\xc3\x7f\xb4\x67\xdf\x96\x21\xd1\x10\xeb\x84\x7b\x9a\x8d\xb8\x4f" + "\x5f\x76\xab\x83\x63\xe8\xd6\x0a\xa9\xcd\xde\xe8\x69\x7c\x97\x84" + "\x19\xef\x22\x53\x05\xe5\x99\x1a\x1a\x70\xc3\x56\x9c\x6f\x7e\xbc" + "\x19\xfd\x5e\x35\x92\x98\x57\x4e\x52\xb3\xd5\x49\x84\xc0\x33\x35" + "\xb8\x06\xe1\x5c\x77\xc7\x98\x18\x90\x44\x60\x6b\x28\xd3\xed\x44" + "\x6d\x4e\xb3\xf2\x58\x85\xe4\x3c\x71\xbe\x08\x32\x1c\xe4\x3a\xe8" + "\x54\x45\xfa\x79\x32\x0e\xe9\x25\x04\x19\x95\x0d\x32\xdd\x9c\x39" + "\x49\x24\x63\x60\x72\x54\xc7\xf6\x7f\xa2\x7d\x01\x32\x5f\x8e\xfb" + "\xea\xcc\x56\x07\xae\xbf\x0d\x6c\x1f\xa9\x4c\x97\xe0\x4d\x46\x62" + "\xbb\x05\x9c\x87\x16\xdb\x1c\x83\x6d\xb6\xd9\x09\xce\xe5\x3f\xbe" + "\x12\xfd\x2d\xb7\x11\x21\xf7\x4c\x0d\xb6\x19\x6c\x9d\x9c\x81\xcf" + "\xe9\xeb\xbc\xc6\xd5\xc2\x6f\x53\xa0\xb7\xb0\xee\x86\xad\x82\x6a" + "\x63\x0e\x7e\x1b\xeb\x80\xe7\x74\x1e\x6f\x23\x8c\xee\x48\x7f\xb3" + "\xdd\x49\x68\xa0\x7b\x1d\x1c\x03\xac\xc3\xed\xde\xdb\x7f\x17\x09" + "\x33\xbc\xcb\xf9\xee\x5c\x27\xd2\x20\x01\xd7\xc0\x36\xe6\x60\x8c" + "\x8e\xc7\xb1\x0e\xd6\xb3\x64\xd6\x59\xc2\xf8\x6f\xd6\x35\x13\x67" + "\xc0\x1d\x63\x70\x2f\x01\xf2\x3f\xcd\x01\xfc\xbf\x60\x47\x1f\x4b" + "\x56\x73\xc6\x45\x82\xf6\x8b\xa3\x55\x27\xef\xc9\xff\x3b\xe6\xcc" + "\x49\x19\x28\xff\xef\x18\x22\xfe\xdf\x71\x15\xb4\xff\x4e\x3f\xda" + "\x7f\xe7\x10\xb5\xff\xce\xab\xa0\xfd\xe1\x7e\xb4\x3f\x7c\x88\xda" + "\x1f\xee\xb5\xfd\x0f\x8f\x13\x28\xdb\x63\x12\x9c\xab\x47\x1d\xc0" + "\xf5\xd5\x94\x59\xb8\x87\x84\x9d\xcb\x12\x9f\x09\x3f\xa7\xa5\xec" + "\xf6\xac\xea\xf6\xac\xee\xf6\x1c\xda\xed\x59\xd3\xed\x39\x4c\x7a" + "\x06\x3d\x32\xec\x9c\x2c\xfc\x63\xb0\x4b\x33\x2c\xb2\x29\x71\xe2" + "\xfb\x49\xe8\x83\x0c\x74\xfa\xa4\x3e\xe2\x65\xde\xd0\x24\x9b\xc2" + "\x63\x87\xac\x1b\xaf\xa3\x6b\x32\x88\x60\x98\x1b\xf9\xf8\x5a\x90" + "\x5d\xc0\x3f\xda\xa9\x19\x0e\x36\xc2\xf5\xe8\xe7\x0e\xf7\x1c\x68" + "\x13\x71\x2f\xc9\x94\xf7\xb1\x7d\x77\xe9\x4d\x44\x08\xb8\x83\xad" + "\xe5\x0b\xc6\xb9\x91\xd6\x80\x3b\xc6\xd3\xcd\x45\xea\x02\xb9\xa0" + "\x2c\xc8\x12\xb4\x6b\xad\xd4\x3a\xf3\x3c\xc8\xa1\x36\xf4\x3d\x0f" + "\x3c\x4e\xa2\x56\x53\xe2\x59\xa8\xef\x5d\xe3\x2a\x53\xa1\x6c\xf8" + "\x0e\x7c\x0b\xc6\x71\x73\x43\xcd\x8e\x6a\x1c\x1f\x45\x56\xd9\xca" + "\x09\xc6\x24\x12\xcb\x8c\xa0\x41\x73\x43\xb1\xcc\x5e\xed\x53\x43" + "\xee\x36\xf8\xe6\xaf\xe7\xe8\x14\x84\x66\x2a\x42\x07\xc6\xd3\xbb" + "\xa6\x79\xb5\x7b\x0d\x79\x93\x78\xb9\x4a\x7f\xca\x2d\xea\xa3\x5c" + "\xb1\xbe\x6a\x7f\xca\x6d\xf6\x5e\x6e\xbe\x58\x5f\xad\x1f\xe5\xde" + "\x3d\xa3\x8f\x72\xc5\xfa\x46\xf9\x53\x6e\x89\xf7\x72\x0d\x62\x7d" + "\x33\xfc\x29\xd7\xe6\xbd\xdc\xdc\x6d\xfe\x61\x21\x22\xba\x2f\x2c" + "\xf8\x87\x83\x88\x3e\xda\x9f\xb7\xcd\x3f\x0c\x44\x78\xf5\xff\x82" + "\x18\xf0\x8f\xff\xf7\xf4\xc9\x7f\xff\x78\x7f\x4f\x71\x5f\xbc\xf7" + "\x8f\xef\xf7\x78\xc5\x3f\xda\xf2\xc0\xfb\x78\x1a\x5c\x44\x84\x82" + "\xb9\xf1\x42\x70\xee\xb3\xeb\x84\x28\xf2\x30\xc8\xb0\x90\x62\x32" + "\x3a\x8a\x8d\x8f\x7f\x99\xb1\xb6\x84\xc8\x61\xbc\x2b\x7f\x67\x4d" + "\x8d\xdc\xec\x98\x8a\x3a\xc7\xb9\x2d\xd9\x2e\xbb\x05\xd2\xf7\x83" + "\x84\xb7\x81\xdd\xc9\xcb\x99\x1b\x5f\x90\x16\x45\x44\xbf\x1b\x36" + "\x3c\x67\x1c\x03\x72\xcc\x5c\x6c\xc7\x3d\x2b\xa3\xe1\x77\x0e\xc0" + "\x2f\x94\x61\x27\xef\x09\x56\x59\x54\x22\xcb\x67\x65\xe7\xeb\x0a" + "\x72\x9f\xa5\xe9\x3a\xf4\xbf\x68\x85\x6f\x9e\x09\xb0\x12\x39\xfa" + "\x49\x6a\xcf\xfe\x65\xbd\x45\xf6\xab\x63\xe2\x79\xd2\x66\xe6\x27" + "\x14\xea\x8b\x67\x35\x31\x2f\xfa\x0b\xbd\x4b\x4f\xe4\xe8\xc3\xbd" + "\x3d\xfb\x57\x6a\xf4\x1d\xda\xd7\xb9\x6c\xa7\x61\xe3\x0c\xfc\x3d" + "\x35\x80\x0e\x3d\x4b\xe4\x78\x16\x13\xc6\x01\xa6\x02\x18\x43\x3c" + "\x72\x3b\xce\x79\xb4\x90\xb4\xb5\x54\xc0\xf9\x27\xaa\x32\xd8\x71" + "\x5f\x1c\xdf\xe3\xfd\x2b\x8c\xaf\x61\x13\x65\xff\xf8\x26\x78\x66" + "\xe3\x18\xdc\x17\xa3\x8a\x6b\xa4\x05\x41\x51\x55\xb6\x16\x16\x73" + "\xa8\x4e\xf6\xab\x77\xd0\x87\x63\xab\x6a\x63\x94\x4d\xb5\x31\x1a" + "\xea\x55\x26\xb5\x01\xbf\x2f\xa5\xe3\xb8\x0d\xf3\xc1\xfb\x72\xe9" + "\x9c\xb6\x97\xf8\xdd\x63\x62\x34\xd4\xda\xe5\x9b\x43\x76\xef\x14" + "\xa4\x3d\xd8\x0a\x53\x6d\xe9\xba\x89\x7c\x1e\x23\x92\x9d\x45\x80" + "\x7a\x4f\xe2\x63\xd3\xb9\x93\x98\x1f\x5f\xd0\x01\x73\x74\xf2\x01" + "\xda\xad\x91\x4c\xff\x9b\x26\xa2\x8e\xbc\xf7\x3a\x28\xff\x37\x75" + "\xb2\xc8\x14\x3e\x16\x9b\x3b\x95\x9d\x4f\x94\x45\x86\xc2\x37\xa6" + "\x52\x43\x9c\x05\xf3\xc1\xfb\x62\xf1\x7d\x94\xdb\xfb\x28\xdc\x27" + "\x29\xbe\x17\xc7\x72\x73\x67\xb8\xbd\x9f\xa1\x9f\x88\x73\x13\x91" + "\x16\x6c\x03\xe8\x33\x2d\xea\xb6\x2e\x5f\x23\x41\x73\xb5\x62\xbe" + "\xc8\x66\x59\xe4\xc5\x56\xc0\x16\xbc\x9f\xe6\xf6\xfb\x69\x07\x52" + "\x22\xc8\xc3\x5b\x90\x86\xf7\xaa\x2c\xf2\x02\x25\x1f\xcf\x46\x6a" + "\x58\xdb\x55\x73\x35\xee\xe5\x41\x7a\x0d\x94\xa9\xb1\x81\x1d\x05" + "\xff\xb3\xf9\x1f\x77\x7a\x4b\xa7\x24\xb5\x8b\x96\x2d\xd0\x2e\x5c" + "\xb1\x6a\x39\x9e\x72\x1b\xe9\xb1\xbf\x51\x8d\xe7\x40\x05\x43\x81" + "\xce\x5c\x8c\xe7\xd2\xd4\xec\x3c\x77\x11\xf0\xd1\x51\xb0\x29\xde" + "\x19\xbc\xd1\xea\x2c\x30\xaa\xd3\xdb\x88\x3c\x4d\x43\x4f\x99\xd6" + "\x3c\x44\xce\xc9\xee\x7d\x8b\xc5\x63\xd5\x32\x7f\xd5\x36\xd3\x9a" + "\x4f\x30\x8d\x9d\x53\x37\xc7\xf3\xb4\x0f\xd2\xca\xe5\xfb\xd2\x6a" + "\xe4\x15\xf1\x2d\xe4\x80\xc6\x4a\x0e\x6a\x5b\x48\x09\xa6\x0b\xd5" + "\x72\xdc\x37\x7a\x4e\x76\x5f\x10\x7e\x0b\xc7\xf8\xf8\x3f\x9f\xaf" + "\xb8\xf7\x4f\xf8\x1d\xf4\xf3\xd1\x2c\xbb\xf7\xcf\xf8\x3d\x8b\xec" + "\xde\xa2\x80\x12\xb6\xcf\x58\x05\xf9\x9e\x10\x8c\x05\x3a\xd6\xc7" + "\xb3\xef\x9d\xe1\x90\xab\x3a\xc5\x73\x6f\x2c\xfe\x40\x7b\xf6\x7d" + "\xd3\xdc\xce\x78\xaa\x5a\xe5\xe4\x01\x48\x9b\x2d\x9d\x2d\xc0\xf8" + "\x67\xde\x64\xc6\x45\x18\xcb\x5e\x2c\x89\x8d\x16\x54\x05\x40\xdf" + "\x02\x5d\x79\x39\xc1\xb9\x14\x19\xee\x81\x6d\x96\x4d\x05\xdb\xa3" + "\x40\x93\x86\xfd\x14\x68\xf1\xdf\xb8\x8f\x2f\x78\x53\xfc\x76\xdc" + "\xb7\x57\xb0\xd1\xfa\x5f\xc9\x76\xf9\x67\x15\xbb\x88\xf6\x5f\xd1" + "\x1e\xba\x6f\xff\xbf\x2c\xa2\x8e\x3b\x8e\x99\x48\x45\xfd\xdf\xc9" + "\xe7\xb5\xe5\x44\x35\x8f\x04\xa4\x5b\xa8\x93\x8d\xf7\x93\x88\x3c" + "\xc6\x42\x02\xd2\xda\xb0\x9f\x3a\x49\xfa\x2a\xb8\xdb\x2b\xc1\xc6" + "\xd1\x2f\x7d\x27\xad\x71\x98\xf6\x49\x42\xa0\x3f\xb1\x75\x63\x76" + "\xce\xc6\xca\xce\x2d\x07\xe1\x1c\xb6\xdb\xf9\x9a\x9a\xb5\x67\x89" + "\xb2\x32\xe1\x5b\x92\x1a\x4f\x05\xe7\x4b\xba\x31\x31\xf1\x01\x94" + "\x9d\xb1\x49\x81\xcc\x7a\xe0\xe9\x4b\xba\xe0\xd7\x92\x49\x68\x55" + "\x92\x85\x98\x1b\xcb\xc9\xeb\x89\x24\x94\xb6\x27\x04\x56\x54\x7c" + "\x46\x68\xde\x8f\xd5\xef\xa5\x99\x86\x49\x7b\xa6\x42\x32\x65\x38" + "\x67\x19\x6c\xc0\xbd\x53\x17\x48\xc4\xfc\xd3\x19\x6c\x9e\x15\xe7" + "\xb4\x1d\xed\x3a\x6d\x67\xbb\xee\xe6\x8e\x76\xdd\x44\x69\x2e\xfc" + "\x0f\x4b\xd4\x64\x0b\x9e\xcd\xc9\xbe\x1d\xf3\x2b\xd0\xb6\x77\x04" + "\xfe\x54\x83\xf3\xde\x88\x4b\xf8\x76\x98\xb0\x50\x47\xee\xb6\xb2" + "\xb3\x3f\x38\x17\xaf\x2e\x7d\x16\xea\xdb\xdc\x42\xdc\xf7\xff\x5c" + "\x7c\x49\x27\xc7\xbd\x3f\x34\xfb\xbe\x84\x8e\x2d\xb1\xd1\xb8\x07" + "\x08\x74\x41\xe4\xc0\xfb\xf6\xff\x61\x73\x13\xd8\x7e\x0a\x98\xdd" + "\xde\x82\xfc\x01\x3e\xb5\x58\xe5\xc8\x8b\xca\x45\xc8\x87\x6a\x0f" + "\x3e\x30\xbe\x25\xda\xe5\xc8\x0f\xe4\x05\xf2\xc4\xc5\x8f\xe3\x8c" + "\x1f\xdb\x05\xce\x8f\x0e\xd0\x03\x12\x4f\x2e\x86\xc5\xc6\xf5\xc5" + "\x17\xe4\x07\xf2\xa6\xa2\xfe\x5b\xe2\xc1\x13\x2b\xe7\x09\xd0\x73" + "\x8c\xc4\x17\xe4\x89\xb9\x19\x6c\x5d\xe0\xcb\xef\x8f\x13\xf2\x2f" + "\xb7\x53\xa1\x72\xe6\xd1\x2e\xfe\x38\xbc\xf1\xe7\x8c\x8b\x3f\xc0" + "\xfb\x9e\xfc\x39\xab\xc6\xb5\x19\xe4\xcf\x8e\x81\xf0\xa7\xa2\x9e" + "\xf3\xc7\x21\xf2\xe7\xf6\x68\x22\xb7\xb7\xeb\xe4\x9b\x93\xc9\xd4" + "\x99\xa7\xb5\xe4\x50\x5c\x25\x01\x5a\xdb\x05\xe3\xc6\xa9\xfe\xf5" + "\xa3\xdf\xa4\xf8\xde\x8f\x7e\x1d\x78\xad\x1f\x0d\xb4\x1f\xdd\xbf" + "\x63\x70\xfd\xe8\x37\x33\xae\xf5\xa3\xcb\xd5\x8f\x7e\x13\xd5\xbd" + "\x1f\x75\xe9\xea\xc4\xc5\xcb\x16\x2c\x59\x8e\xc7\xf7\x9e\x5d\x9d" + "\xb4\xf8\x45\xae\xb1\x3d\x74\xb6\xc6\x99\x16\x25\x47\xbf\x70\x15" + "\xc5\xd5\xe4\xbd\xf1\xd5\x72\xe7\x0f\x1a\x05\x35\x0c\xd7\x0a\x06" + "\x65\x19\xfa\xf7\xc4\xfe\x56\x84\x7e\x2f\x64\x0f\x6e\xab\x0a\xe3" + "\xb1\x34\xf1\x7f\x66\xaf\x84\xc5\xd6\xe0\x1a\xc9\xba\x35\x44\xb1" + "\x0e\xcf\x30\xdb\x71\x2e\x82\xbd\x0f\x42\x7f\x87\x74\x4b\x6c\x0d" + "\xfa\xad\xb1\xa9\xe2\x2c\xeb\xa1\x2c\x6b\x50\x81\x4e\xa1\xc5\x33" + "\x0e\xd3\x4b\x40\x1f\xcf\xeb\xf2\x85\x24\x8b\xaa\xa6\xc3\xa7\x59" + "\xb1\x9f\xe3\x79\xb3\x73\xb2\xe9\x47\x2e\x66\x11\xf4\xb7\x61\x9d" + "\x73\x3b\x7c\x67\x42\x6c\x1c\xf3\x4b\x00\x7d\x9e\xbf\x7f\x60\x15" + "\x7e\xbf\x53\x65\x64\xbe\x0d\x5b\x55\x9b\xe2\x5b\x0d\x1b\xad\x9f" + "\xa5\xee\x20\xda\x27\xb1\xcf\x4f\x77\xfe\xbe\x18\xfa\xfc\x6c\x13" + "\xa9\xd4\xfc\x17\xf9\x3c\x0e\xb0\x16\xd7\x5f\x9f\x77\xc3\xd8\x44" + "\xdf\xfa\xbc\x84\x2d\xc4\x14\x62\x0b\x71\x35\x0a\x70\x85\x58\x93" + "\xb0\xb5\xe9\x02\xc7\x56\x48\x2d\x51\xbf\xd6\x42\xf8\x9c\x04\xe0" + "\x0b\xcf\x05\x57\xa6\x1c\xf5\xde\xf7\x2f\x74\xc3\x96\x5c\xc4\xd6" + "\x4b\x80\xad\x97\x5c\xd8\x7a\xfa\x5b\x35\x79\x9d\x61\x4b\xe7\xc2" + "\x56\xee\x4f\x35\x12\xae\x10\x63\x88\x27\xe1\x79\x1d\xc1\xfe\x2e" + "\x61\xac\xf4\x39\xbe\xc6\xc9\xfa\xbe\x1c\xfa\x7e\xbb\x9b\x0e\x9d" + "\x30\x98\xbe\xff\x00\xdb\xff\x84\x3c\x41\xfe\x20\x5f\x90\x17\xff" + "\x8c\x7c\x40\xbf\xb4\xb4\xbd\x37\x5e\xdc\xb6\xab\x3f\x5e\x20\x1f" + "\x90\x1f\x8c\x0f\xc0\x0f\x69\xbd\x19\xd7\x1f\x91\x27\xc8\x8b\xbb" + "\x52\x89\x1c\xf9\x52\x0a\xfd\x1d\xfb\x38\xd0\x76\x1a\xf2\x85\xd9" + "\xad\x59\x41\xbb\x8a\xf0\xcc\xac\x18\xf3\xb7\x3d\x3b\xca\xda\xd3" + "\x66\x7d\x50\xd1\xe5\x8b\x52\x36\xbd\x8c\x8f\x31\x8c\x3c\x7e\x8a" + "\xec\xa1\x39\x62\x1f\x36\xe1\x78\x8f\x8d\xed\x9c\x30\xb6\x53\xc1" + "\xd8\xce\x00\x63\xbb\x94\x46\xd1\x5f\xc0\x83\xdc\xef\x28\x8e\xe5" + "\x82\x0c\x76\x6a\x8c\x6b\x44\x9a\xb1\x75\xd2\xa0\x8d\x51\xb8\xae" + "\x43\x8d\x30\x6e\xfc\x0f\x39\x81\x67\xc0\x8d\x73\x80\x78\x79\x50" + "\x2f\xae\x03\x47\xea\xd7\xe0\x1e\x81\x87\xa2\x78\xfd\xa6\xcf\xc5" + "\x74\xb6\x86\x26\x17\xb6\x3a\xd7\x79\xae\xa1\xb9\xaf\xb1\xbe\x97" + "\x66\x15\xd7\xcf\x1e\x62\x3e\xad\x51\x26\xa0\x1c\x7b\x27\xad\x5a" + "\xee\x5a\x43\x3b\x8a\xef\x6f\xf7\x5c\x43\x7b\x50\x3c\x27\xfd\x50" + "\x2c\xee\x1b\x81\xf7\x6a\x9e\x3e\x3d\xce\x3d\xdd\xb5\x46\xcd\xd3" + "\x05\x39\x8b\x75\x82\x63\xec\x66\x3e\xb6\x7e\x68\xa9\x34\x86\xf5" + "\x62\xcf\x0c\x40\xce\x3e\xaa\x75\xc9\xd9\x47\xf9\x5c\xb3\xa6\x48" + "\x59\xd9\x43\xce\x9e\x80\xf7\xbf\xcb\x7d\x1c\xe5\xac\xc1\x48\x44" + "\x9e\x5e\x04\x9a\x04\x60\xcc\x4a\x4c\xc7\xf3\x3a\x28\x73\xb7\x30" + "\x19\xbc\xc9\xbe\x9e\xad\x93\x3f\xac\xf1\x94\xbd\xbf\x9b\xe9\x29" + "\x7b\x1f\x9e\xd5\xb7\xec\x9d\x71\xbe\x6f\xd9\xfb\xf0\xea\x6b\xb2" + "\xd7\x5f\xd9\x0b\x76\xd7\xa0\x64\xef\x8c\x3d\xd7\x64\xef\xa5\x92" + "\xbd\x33\x76\xb9\xc9\xde\xb7\x3c\x65\xef\xef\x96\xf6\x94\xbd\xbf" + "\xcb\x70\xc9\xde\x87\x27\x79\xca\xde\x47\x8f\xf8\x26\x7b\x7f\x57" + "\x79\x69\x65\xef\xef\x9a\x3d\x65\xef\xa3\x7b\x44\x39\xb2\x7f\xe0" + "\xb2\xf7\xd1\x2d\x7d\xcb\xde\x47\xdf\xf2\x94\xbd\x8f\xa6\x70\x19" + "\xfb\x68\x35\x97\xbd\x8f\x1a\x44\x19\x6e\x72\x4f\x77\xc9\x5e\x9e" + "\xde\x53\xf6\x3e\xda\xd8\x8f\xec\xd5\x39\x05\x49\xf6\xd6\x80\xec" + "\xad\x91\x0b\xcf\x7b\x93\xbd\x33\x6d\x95\x28\x7b\x13\x51\xf6\xce" + "\xb4\xf5\x2d\x7b\x67\xfe\x01\x65\x2c\xf3\x4b\xf9\x17\x5a\xcf\xfc" + "\x02\xfe\x85\x36\x22\x1e\x1f\x4f\x85\x74\x48\x43\xff\x89\x98\x4f" + "\xe4\xbd\x28\xa3\xa3\xb7\x74\xc9\x68\xc8\x27\x8c\x73\xc9\x68\x94" + "\xcf\x28\xa7\xb7\xfc\x85\x5a\x4a\xff\x42\x6b\xdb\xb3\xa3\x0f\x4a" + "\xb2\xda\x08\x69\x18\x6b\x08\x7d\xf7\xe0\x9e\x41\xa0\x41\xfd\x3a" + "\xf8\x1e\xe6\x87\x7c\xcd\x9e\x32\x7d\xa6\xd6\x53\xa6\x3f\x76\x53" + "\xdf\x32\xfd\xf7\x87\xfa\x96\xe9\x8f\xcd\xba\x26\xd3\xaf\x94\x4c" + "\xff\x7d\xe1\x35\x99\xde\xbf\x4c\xef\x8d\x17\xdd\x65\xfa\x14\x51" + "\xa6\x6f\xe9\x92\xe9\xbf\x37\x78\x97\xe9\x33\xa3\x7a\xca\xf4\x99" + "\xb1\x2e\x99\x1e\x6d\xf7\x94\xe9\xb3\xde\xf2\x4d\xa6\xcf\x7c\xf3" + "\xd2\xca\xf4\x99\x26\x4f\x99\x3e\xab\x50\x94\x3b\xd3\xdd\x65\xba" + "\x10\xe0\x8b\x4c\x9f\xb5\x52\x92\xe9\x28\x33\xdf\x11\x6a\xdc\x64" + "\x3a\xca\xb6\x59\xab\x4d\xc9\x75\x6e\x32\x7d\xd6\x4c\x2e\xbb\x67" + "\x6d\x73\x32\x99\x3e\x2b\x9e\xa7\x47\x4f\x73\x4f\x77\xc9\x74\x9e" + "\xee\x74\x97\xe9\x8d\x28\xd3\x67\xed\xe9\x47\xa6\x47\xf8\x2e\xd3" + "\x9f\x0a\x73\xc9\xf4\xa7\xc2\x24\x99\x8e\x72\x1c\x65\x3a\xca\x60" + "\x94\xeb\xcc\x57\x15\xdb\xf7\xf0\xe4\x2b\x21\x56\xa2\x44\x1f\xb9" + "\x38\x87\x81\xb2\x18\xfd\xf1\xa0\x6c\x67\x79\x96\xf3\x3c\x20\x9f" + "\xd1\xbf\x69\x23\xc8\xe4\x46\xe3\x39\xa2\x80\x7c\x35\x05\xb8\x87" + "\x0e\x9e\x51\x76\x87\x34\x83\x1e\x70\x30\x3d\x50\x83\xfa\x83\xd3" + "\xeb\xc9\x57\x3c\x75\xc1\xe3\x6f\xf7\x66\xaf\x17\xba\xe9\x82\xd2" + "\xb1\xf4\x58\x7b\xf6\xe3\x15\x92\x7c\x2f\x80\x67\xd4\x01\x85\x2d" + "\x4c\x07\x58\x40\x07\xd4\x73\x1d\xf0\xb8\xb5\x2b\x0f\xd4\x81\xe5" + "\xe1\x7a\xa2\x06\xf2\xd4\xf2\x3c\x31\xa1\x9e\x7a\xe2\xc9\x68\x4f" + "\x3d\x11\xf3\x18\xea\x09\xf4\xdb\xca\x62\xae\x1b\x0b\x34\xce\x2d" + "\xb1\x71\xa8\x33\xf8\xfb\xd9\x67\xbb\xf4\xc4\x58\x37\x3d\x91\x22" + "\xe9\x89\x98\x55\x57\xbd\x9e\x00\x2c\x57\xa6\xfe\x33\xea\x89\xd9" + "\xbb\xae\x06\x3d\x81\x3c\x18\xe5\x36\xb7\xea\x8d\x0f\xe8\x1f\xa1" + "\x72\xe9\xcf\x45\x4f\xcc\xde\xe9\x5d\x4f\x3c\x99\xd0\x53\x4f\x3c" + "\x99\xea\xd2\x13\x31\x5a\x4f\x3d\xf1\x54\xa5\x6f\x7a\xe2\xc9\xc3" + "\xdd\xf5\x04\xd2\xac\x80\xef\x09\x68\x46\xfd\xe0\x34\x6e\xc4\xb9" + "\xdf\x19\xfe\xe9\x89\x27\x1b\x3d\xf5\xc4\x53\xbb\x44\x99\x34\x7a" + "\xe0\x7a\xe2\x29\xe6\x1f\xb1\x40\xd2\x13\x17\xba\xeb\x89\xa7\xde" + "\xf4\xd4\x13\x4f\x25\x71\x7d\xf0\x54\x05\xd7\x13\x4f\xe5\xf0\xf4" + "\xc7\xd5\xee\xe9\x2e\x3d\xc1\xd3\x7b\xea\x89\xa7\xea\xfb\xd1\x13" + "\xaa\xce\xb0\xd8\xb8\x4e\xc3\xa6\x28\xc7\xb6\x58\x4b\x78\xdc\x03" + "\xce\xee\x7d\x80\x63\xdf\x49\xb0\x2f\x74\xad\xf9\x3c\xc3\xd7\x18" + "\x04\xf1\xdc\x6d\x47\x58\x6c\x74\xc3\x52\xe8\x07\xcd\xde\xfb\x01" + "\xf4\x01\xa5\xd4\x07\x2a\x13\x4e\x13\xe8\x17\x72\x5c\x07\x7a\x1d" + "\xf0\x6f\xb6\xd5\x30\xb9\xa4\xaa\x8f\x22\xe8\xaf\x30\xa8\x99\xa8" + "\x83\x64\xb2\xe1\xb8\xc6\xe0\x84\xbe\xf0\xc8\xed\x54\xb8\xb3\x26" + "\x8a\x04\x25\x90\x60\xec\x0f\xef\x8a\x6b\x0d\xe8\x33\x01\xd7\x18" + "\x00\x87\x11\xf3\x8f\xb8\xd6\x18\x3a\x7c\x58\x63\x30\xa7\x58\xd8" + "\x1a\x03\x9e\x23\x12\xa0\x0f\xb0\xb3\x2d\xb8\xc6\x60\x67\xeb\x32" + "\x6a\x76\x9e\x84\xad\x31\xd4\x11\x5c\x5f\x90\x7c\xa2\xe0\xba\xc2" + "\x9d\x71\x44\x8e\x3e\x15\x5e\x07\xfc\x1f\xd2\x55\x12\xec\x03\x03" + "\x97\x47\x73\xbc\xee\x7f\x42\xbe\x38\x80\xa6\x4e\xd5\xa6\x28\xfa" + "\x5a\x51\xc4\x7f\xd7\xd9\x65\xe8\x0f\xd2\x09\x3c\x12\x40\xee\x50" + "\x65\x37\xb9\xd3\x29\xd2\xbb\x93\xd3\x1b\x78\xa5\x7c\xc6\x46\x28" + "\xa4\x73\x7f\x90\x76\x0b\x60\x4d\x37\x66\xcb\x1a\xa4\x6d\x04\xd9" + "\x22\xfa\x84\x14\x5e\x4e\x08\x14\x80\x9e\x78\x7e\xe0\x9d\x0b\xf6" + "\x61\x4e\xe5\x99\x1a\x43\x07\x09\x07\x19\x13\x84\x32\x06\xf0\x39" + "\xf2\x8d\x0e\xa0\xed\x29\x4e\x5b\xf4\xe9\x85\x77\xc7\xcb\x3a\x2d" + "\x94\x7d\x73\x67\x27\xd0\xd7\xce\xe9\xfb\xcc\x4a\x35\x29\x95\xd6" + "\xd8\x3a\x30\xae\x42\x0d\x93\x31\x8f\xdb\x42\x28\xc6\x9b\x70\x76" + "\xea\xc2\x84\x1f\x80\xbe\x36\xe8\x53\x9d\x3a\xe4\xbf\xba\xb4\x01" + "\xd7\x04\x4f\xf0\x35\xb6\x40\xd1\x57\xc5\xcb\x20\xef\x97\x68\x89" + "\xb9\x0c\xe4\xed\xf0\xa7\xec\x9d\x5b\x62\xa3\xa9\x0c\xe4\x7d\xea" + "\x40\xe9\xfb\xaf\x65\x57\x86\xbe\xda\x9f\x11\x7d\xe7\x14\xfa\x4f" + "\xdf\x38\xe5\x95\xa1\xaf\xfa\x67\x44\xdf\x7f\xb5\xfa\x4f\xdf\xb9" + "\x5e\xf7\x3f\x23\x7d\xd1\xbe\x97\x6c\x7b\xc9\xae\x47\xdd\xc2\x75" + "\xe3\xd3\x16\x97\x4d\xff\xb4\x45\x5a\x8b\x04\xda\x28\x8c\xe2\x1c" + "\x8d\xfe\x39\x72\x63\x93\xec\xe9\x39\xd2\x3a\x24\xda\xd4\x8c\x57" + "\xaf\x01\xaf\x96\xe3\x39\x11\x91\x4f\xa0\x07\xe6\xdb\x40\x56\x4f" + "\x88\x8d\x73\x1a\x41\x4f\xbc\x15\x6b\xf1\xc2\x33\x39\xca\xf8\xa0" + "\x24\xa2\x7e\x46\xcf\x79\x27\xbc\x0c\x3c\xeb\x00\xfb\xc6\xde\x48" + "\xf0\xdc\x67\x48\x23\xc8\xd5\xce\x84\xc0\x79\x60\x2f\x4b\x7c\x7b" + "\x37\xd9\xce\x6c\x9b\x5e\xf9\xb6\xd9\x93\x6f\xad\xbd\xf0\xcd\xb5" + "\xb6\x0f\x76\x26\xe3\x9b\x85\xf1\x8d\xc9\xf5\x97\xc1\xb6\x01\xfe" + "\x49\x7c\x63\x72\x1d\x78\xc7\xf8\xd6\x5c\x47\x9c\x6e\x72\x1d\xed" + "\x1a\xe4\x5d\x45\x3c\xd8\x97\xd9\x71\xb3\x19\xdf\xd0\xce\x8c\x1f" + "\x28\xdf\x9e\xee\x66\xcf\xcc\x33\xfa\x66\xcf\x3c\xbd\x05\x6d\x16" + "\x77\x7b\x06\x9f\x5b\x61\xcc\xeb\x0c\xda\x38\xc3\xe6\x97\x0d\xf3" + "\xf4\x76\x4f\x1b\x66\x5e\x0a\xaf\xd3\xdc\xd3\x03\xb7\x61\xe6\xb1" + "\xf5\xa6\x77\x5e\xe3\x63\x49\x4f\xfb\x65\xde\x02\x4f\xfb\x65\x5e" + "\x24\xb7\x53\xe6\x19\x5a\xb3\xd0\x7e\x99\x17\xcd\xd3\xe7\xd6\xbb" + "\xa7\xbb\xec\x17\x9e\xde\x8a\xbe\xc1\xb2\xe7\x15\x0f\xcc\x66\xb9" + "\xfb\x0a\xdb\x2c\x11\x7d\xd8\x2c\x11\xff\x64\x36\xcb\x1f\xfa\x8a" + "\x21\x73\x4d\xa7\x32\x99\x3f\x6f\xbb\xff\x32\x7f\xbe\xd7\x58\x19" + "\xd7\x74\xaa\x44\xdf\x67\x66\xf8\x4f\xdf\xf8\x3d\xfe\xeb\xd4\x85" + "\x91\x2e\x9d\xba\x30\xd2\xbb\x4e\x7d\xf6\xed\x6b\x3a\xb5\x37\x9d" + "\x3a\x7f\x9b\xff\x3a\xf5\xd9\x24\x4f\x9d\xba\xf0\x94\x6f\x3a\xf5" + "\xd9\xf3\x43\xaf\x53\x17\x12\x4f\x9d\xba\xb0\x82\xd7\x69\xc1\xfd" + "\x03\xd7\xa9\x0b\xdf\xf1\xae\x53\x17\x7e\xe8\xa9\x53\x17\xe6\x70" + "\xdd\xb9\xd0\xc2\x75\xea\xc2\x12\x9e\xbe\x60\xaa\x7b\xba\x4b\xa7" + "\xf2\x74\xae\x53\x17\x36\x0f\x4c\xa7\xde\x78\x85\x75\xaa\xb6\x0f" + "\x9d\xaa\xfd\x27\xd3\xa9\x8b\x67\x5f\x93\xf9\xfd\xc9\xfc\x45\xc4" + "\x7f\x99\xff\x9c\x57\xff\x77\xfd\xcb\xfc\x25\x3a\x97\xcc\x5f\xa2" + "\xf3\x2e\xf3\x13\xb6\x5c\x93\xf9\xbd\xc9\xfc\xc5\xc5\xfe\xcb\xfc" + "\x84\x04\x4f\x99\xbf\xe4\xb8\x6f\x32\x3f\xe1\xf4\xd0\xcb\xfc\x04" + "\x9b\xa7\xcc\x5f\x62\xe2\x75\x7a\x7e\xca\xc0\x65\xfe\x92\x37\xbd" + "\xcb\xfc\x25\x6f\x7b\xca\xfc\x25\xa9\x5c\xb6\x2f\x39\xc6\x65\xfe" + "\x92\x42\x9e\xfe\x7c\xb8\x7b\xba\x4b\xe6\xf3\x74\x2e\xf3\x97\x58" + "\x06\x26\xf3\x43\xae\xb0\xcc\x57\xf7\x21\xf3\xd5\xff\x64\x32\xff" + "\x05\xaf\xe7\x3f\xfb\x97\x49\xcb\xf6\xb8\x64\xd2\xb2\x3d\xde\x65" + "\xd2\xb2\x7b\xae\xc9\xa4\xde\x64\xd2\x12\x9b\xff\x32\x69\xa9\xc3" + "\x53\x26\x2d\x5f\xe2\x9b\x4c\x5a\xb6\x7a\xe8\x65\xd2\xb2\x1c\x4f" + "\x99\xb4\x3c\x96\xd7\xe9\x85\xfd\x03\x97\x49\xcb\xef\xf5\x2e\x93" + "\x96\x4f\xf7\x94\x49\xcb\xc5\x35\xa8\xe5\x09\x5c\x26\x2d\x9f\xc4" + "\xd3\x5f\x30\xb9\xa7\xbb\x64\x12\x4f\xe7\x32\x69\x79\x52\x7f\x32" + "\x09\xb1\x5f\xa9\xe9\x86\xfd\x17\x24\xec\xeb\x2b\x3e\x2f\x91\xb0" + "\xaf\xaf\x60\xfb\xdd\x4a\x62\x6b\xf2\x93\x89\xc2\x80\x71\x2e\xa0" + "\xbf\xeb\xff\x1d\xb1\xaf\x7f\x10\xf7\x2d\xa8\x6a\x41\x86\xd5\x8b" + "\x32\x2d\x05\x64\x5a\x3d\x3c\xa3\x1f\xa8\x09\xb1\x35\x28\x8b\x70" + "\xfd\x1f\x9f\xb9\x6c\xb3\x0e\xc3\xf3\x92\x03\x3a\xcb\x54\x2f\x9e" + "\x65\x5a\xd4\xf3\x2c\x53\x89\xdb\x99\x19\xec\x1b\x41\x99\xb2\x60" + "\x5c\xd7\x05\xf9\x26\xca\xb1\xf2\x61\x0e\xa5\x28\xc7\x2e\x80\x1c" + "\xbb\xe0\xea\x13\x28\xc7\x5a\x41\x8e\xd9\x5e\xd2\x4d\x44\x59\xd6" + "\xf3\x1c\x13\x5f\xc7\x65\x72\x2c\xb7\x9b\x1c\x7b\xbe\x9b\x1c\x7b" + "\x0e\xe4\x58\x3c\xc8\xb1\x40\x57\x7f\xb8\xa5\x96\xc8\x67\x2e\x80" + "\x3e\x01\x72\x6c\xd3\x05\x94\x63\x87\xfc\x94\x63\x7a\x95\x67\x7f" + "\x58\xb9\xda\xb7\xfe\xa0\xcf\xf5\xd6\x1f\x3a\x8d\xfe\xf6\x07\x7d" + "\xb1\x67\x7f\x58\xb9\x48\xec\xa3\x1f\x0f\xbc\x3f\xac\x7c\xa4\xab" + "\x3f\xbc\xd0\xbd\x3f\xac\x9c\xe5\xd9\x1f\x56\x6a\x39\xee\x57\xa6" + "\xf0\xfe\xb0\x32\x52\xec\x27\x7b\xdc\xd3\x5d\xfd\x81\xa7\xf3\xfe" + "\xb0\x72\xfd\xb5\xf5\xd9\xab\x55\x47\x27\x36\x5e\x5b\x9f\xed\x6f" + "\x5c\xb6\xb2\xd8\xff\x71\x59\xd2\x15\x5a\xff\xfe\x39\xcd\x25\xbf" + "\x18\xe1\x3f\x7d\x57\x5d\xa1\xf5\xef\x9f\xd3\xbc\x42\xd2\x20\xd6" + "\xbf\x5f\xea\x73\xfd\xbb\x6f\x3b\x66\x75\x71\x45\x97\x0d\xbf\xba" + "\x58\xda\x73\xd9\xd3\x86\x5f\x1d\xe4\x79\x7e\xe9\xa5\xdd\xdd\xf7" + "\x43\xf6\x67\xdb\x3b\xfe\x57\xd9\xf6\xab\xac\xfe\xdb\xf6\x29\x35" + "\x9e\xb6\xcc\x9a\x47\x7c\xb3\x65\x56\xcf\xf1\x66\xcb\x38\xfc\xb6" + "\xed\x57\x2f\xf2\xb4\x65\xd6\x44\x88\xfc\x7f\x65\xe0\xb6\xcc\x9a" + "\xd1\xde\x6d\x99\x35\xe3\x3c\x6d\x99\xd5\xcd\xdc\x66\x59\x33\x83" + "\xdb\x32\x6b\x78\xbc\x69\xd9\x4b\xeb\xdd\xd3\x5d\xb6\x0c\x4f\xe7" + "\xb6\xcc\x9a\xd9\xd7\xd6\x6d\xaf\x56\x5b\xe6\xe5\x9d\xd7\x74\x6d" + "\x7f\xba\x60\xcd\x22\xff\x75\xc1\xda\xd0\x6b\xba\xb6\x3f\xfa\xbe" + "\xec\xf0\x9f\xbe\x69\x49\xfe\xeb\xda\x4c\x85\x4b\xd7\x66\x2a\xbc" + "\xeb\xda\x8c\xd5\x9e\xba\x36\x7d\xf2\x35\x5d\xdb\x97\xae\x5d\x3b" + "\xcf\x7f\x5d\x9b\x31\xc3\x53\xd7\x66\xbe\xef\x9b\xae\xcd\xd8\x3f" + "\xf4\xba\x36\xa3\xda\x53\xd7\x66\x96\xf0\x3a\xa5\x9d\x1f\xb8\xae" + "\xcd\x5c\xeb\x5d\xd7\x66\xbe\xe2\xa9\x6b\x33\xc5\x33\xf4\x99\x3b" + "\xb8\xae\xcd\x5c\xca\xd3\xd3\xac\xee\xe9\x2e\x5d\xcb\xd3\xb9\xae" + "\xcd\xec\xef\xfc\xcf\xb5\xf5\xdc\x2b\xa6\x6b\xd7\x69\xaf\xe9\x82" + "\xfe\x74\x41\x66\xb5\xff\xba\x60\x7d\x86\xff\xba\xe0\x55\xb5\x4b" + "\x17\xbc\xaa\xf6\xae\x0b\xb2\x5f\xf1\xd4\x05\xaf\xdc\x73\x4d\x17" + "\xf4\xa5\x0b\xd6\x25\xf8\xaf\x0b\xb2\x67\x7b\xea\x82\x57\x3f\xf6" + "\x4d\x17\x64\x57\x0e\xbd\x2e\xc8\xae\xf5\xd4\x05\xaf\x96\xf1\x3a" + "\xad\x77\x0e\x5c\x17\xbc\x9a\xeb\x5d\x17\xbc\xfa\x27\x4f\x5d\xf0" + "\xea\x22\x2e\xf3\x5f\xdd\xc3\x75\xc1\xab\x29\x3c\x7d\xbd\xc3\x3d" + "\xdd\xa5\x0b\x78\x3a\xd7\x05\xaf\x96\x5f\x5b\xe7\xbd\x5a\x75\x41" + "\x6e\xb8\xff\xb2\x2a\x7f\x8f\x4b\x56\xe5\xef\xf1\x2e\xab\xf2\xef" + "\xf1\x94\x55\xb9\xdf\x5e\x93\x55\x7d\xc9\xaa\x57\x6b\xfd\x97\x55" + "\x79\xdd\xd6\x7f\x0d\x3e\xae\xff\xe6\x7b\x5d\xff\xf5\x5f\x56\xe5" + "\x77\x5b\xff\x35\x88\xeb\xbf\xb9\x6f\x0f\x5c\x56\x19\xee\xf5\x2e" + "\xab\x0c\xdd\xd6\x7f\x0d\xe2\xfa\xaf\x41\x5c\xff\x35\x88\xeb\xbf" + "\xb9\x65\xee\xe9\x2e\x59\xc5\xd3\xb9\xac\x32\x0c\x72\xfd\xb7\xa0" + "\xde\xb5\xfe\x5b\xc0\xce\x0c\x08\xc5\x45\xca\x9e\xeb\xbf\x05\x73" + "\x71\xfd\xd7\xd5\x27\x0c\x6d\x6c\x2d\x18\xfb\x85\x8d\xfb\x15\xe9" + "\x75\x5d\x78\x5c\x91\xf2\xda\xba\xf0\x50\xac\x0b\x17\x74\xf3\xe7" + "\xb3\xe1\x4f\xbe\xf5\x93\x82\x37\x87\x7e\x5d\xb8\x60\x87\x67\x3f" + "\xd9\x90\x2a\x62\xc2\x8f\x75\xe1\x0d\x7f\xf0\xde\x4f\x36\x2c\xf6" + "\xec\x27\x1b\xc4\x7d\xb9\x1b\x0a\x79\x3f\xd9\x30\x53\xec\x3f\x7b" + "\xdc\xd3\x5d\xfd\xc4\xe0\xb6\x2e\xbc\xa1\xc4\x17\x9d\xee\x50\x6d" + "\x9a\x81\x3a\x3a\xbc\xe6\x01\x67\x17\x9e\x93\x44\x3c\xf7\xa6\xd3" + "\x9f\xe5\xb2\x1f\x71\xdc\xb9\x2d\xb6\xbe\x5f\x9d\x5e\x2f\xea\xf4" + "\x45\x3d\x75\xba\xa4\xcf\x11\xcf\xaf\xfb\xb4\x26\xdc\x0d\xd7\x03" + "\xd2\xe7\x77\xec\x18\x0c\xae\x11\xd3\x9e\xfa\xdc\x5f\x5c\x17\x5e" + "\xa1\xf3\x2f\x3f\xa7\x35\xe1\x0d\x3b\xfc\x1f\xdb\x6d\xbc\x42\xe7" + "\x5f\x7e\x4e\xf3\xd4\x7f\x1a\xc4\xf9\x97\x4d\x7d\x9e\x7f\xb9\x36" + "\x37\x81\xf4\xdd\xb8\xcd\x7f\xfa\xfe\xd9\x6b\xfc\xd7\xfe\x6d\x9b" + "\xbf\x56\xb8\xec\xfd\xbf\x56\x48\xb6\x8d\xe4\x2f\x0d\x64\xa6\xc2" + "\x98\x08\xd7\x05\x42\xf2\x13\x99\xaf\x6f\xa5\xb9\xfe\x38\xd1\xa7" + "\xa1\xbd\xf3\xd7\x07\x63\x52\xdc\xed\x9d\x3f\x9f\x92\x6c\x9d\x18" + "\xb4\x83\xc0\xae\x41\x9b\x46\xb2\xf1\xd1\x37\x4e\x9f\xfb\x41\x27" + "\xc7\xd6\xe3\x98\xa0\x33\x68\xd3\x8c\x7f\xfe\xf1\x40\x91\xc2\xff" + "\xf1\xc0\x5f\xbb\xed\x7f\x2b\xf6\x71\xff\xdb\x5f\xbd\xee\x7f\xf3" + "\x7f\x3c\xf0\xd7\x6e\xfb\xdf\x8a\xc5\xfd\x6f\x7f\xde\x3c\x70\x3b" + "\xa7\xb8\x8f\xfd\x6f\xc5\xdd\xf6\xbf\x15\x8b\xfb\xdf\x8a\xc5\xfd" + "\x6f\xc5\xe2\xfe\xb7\x3f\x17\xbb\xa7\xbb\xec\x1c\x9e\xce\xed\x9c" + "\x62\x9f\xf6\xbf\x81\x9d\x13\x3d\x08\x3b\xa7\xf1\xe7\x63\xe7\xdc" + "\x79\x95\xd8\x39\x9b\xbd\xc6\x3f\x74\xd3\x13\x33\xba\xe9\x89\xfa" + "\xff\x5d\x7a\xa2\x78\x10\x7b\xdf\x5e\xef\x73\xff\x3f\xa3\xaf\xc1" + "\x8d\xbe\x28\xa3\x45\xda\x3a\x27\xc5\xd6\xfb\x45\x5f\x90\xcd\x5b" + "\xd2\x7e\x2e\xb4\x7d\x2d\xdc\x7f\xda\x96\x6c\xbd\x66\xe3\xf4\x47" + "\xdf\xd7\x0d\xfe\xd3\xb7\x94\xf8\x6f\xe3\x6c\xad\xfe\xbc\xcb\xc6" + "\xd9\x5a\xdd\xdd\xc6\x41\x9b\x66\x96\x9d\xdb\x3a\xf9\x60\xa3\xe4" + "\x2d\x07\x7b\x27\x99\x10\x73\xfd\xc7\xc4\x00\x36\x4f\xde\x39\xb0" + "\x7b\x96\x82\xdd\xe3\x78\x4b\xb4\x7b\xb6\x3e\xe2\x69\xf7\x94\x7e" + "\xdd\xab\xdd\x13\xe4\xb2\x7b\x1c\x60\xd3\x74\xbe\x15\x5b\x5f\x78" + "\xce\xcd\x06\xfa\x63\x4f\x1b\xa8\xc3\x08\x3a\x67\x72\x6c\x63\x27" + "\xd8\x41\x7d\xd9\x40\x8c\xf7\xdd\xec\xa0\x9f\x9f\x0d\x54\xd2\xe8" + "\xbf\x0d\xb4\x55\xed\x69\x03\xbd\xb9\xd6\x37\x1b\x68\xab\xd1\xeb" + "\x5c\x8f\xdf\x36\xd0\xd6\x12\x4f\x1b\xe8\xcd\x04\x11\x17\x6b\x07" + "\x6e\x03\xbd\xf9\x98\x77\x1b\xe8\xcd\x27\x3c\x6d\xa0\x37\x27\x71" + "\x5b\xe7\xcd\x54\x6e\x03\xbd\x39\x95\xa7\x97\xa6\xba\xa7\xbb\x6c" + "\x20\x9e\xce\x6d\xa0\x37\x73\x7c\x5c\xbf\x99\xe1\x00\x1d\x7b\xe5" + "\xf7\xcd\xf5\xb5\x7e\x33\x54\xfb\xe6\xee\xb8\x4a\xd6\x6f\xfe\xa3" + "\xcf\xf8\x87\xd7\xf4\xf4\x9b\x25\xfe\xeb\x91\x6d\x57\x68\xff\xff" + "\xcf\x49\x4f\xff\x67\xa4\xff\xf4\x7d\xab\xcf\xfd\xff\x7d\xeb\xe9" + "\xb2\x38\xd7\x5c\x44\x59\xdc\xc0\xe6\x22\xfe\x6f\xa5\xa7\x4e\xfe" + "\xdb\xb2\x6b\x73\x11\xbe\xea\xe1\x6d\x85\xfe\xeb\xe1\xff\x5b\xec" + "\xa9\x87\xdf\x1e\xe6\x9b\x1e\x2e\xbb\x6e\xe8\xe7\x22\xca\x26\x79" + "\xea\xe1\x32\xab\x88\x85\xc9\x03\xd7\xc3\x65\x47\xbc\xeb\xe1\xb2" + "\xaf\x3d\xf5\x70\xd9\x76\xae\x6f\xdf\x56\x70\x3d\x5c\x66\xe2\xe9" + "\x7f\x9b\xe4\x9e\xee\xd2\xc3\x3c\x9d\xeb\xe1\xb7\xd5\x03\x5b\x73" + "\xb9\xf1\x2a\x5d\x73\xd1\xfe\x93\xad\xb9\xfc\x97\xfe\x9a\x9e\xe8" + "\x4f\x4f\xbc\x3d\xc9\x7f\x3d\xf1\xdf\xd5\xfe\xeb\x89\x77\x33\x5c" + "\x7a\xe2\xdd\x8c\x81\xe9\x89\x77\xda\x3c\xf5\xc4\xf6\x3f\x5f\xd3" + "\x13\xbe\xea\x89\xff\xda\xe5\xbf\x9e\x78\xc7\xe4\xa9\x27\xde\x9b" + "\xe2\x9b\x9e\x78\x77\xfa\xd0\xeb\x89\x77\x67\x7a\xea\x89\xf7\x34" + "\x22\x16\x66\x0d\x5c\x4f\xbc\x7b\xd1\xbb\x9e\x78\x4f\xe6\xa9\x27" + "\xde\x3d\xc6\xf5\xc1\x7b\xe1\x5c\x4f\xbc\xdb\xc8\xd3\xb7\xcf\x74" + "\x4f\x77\xe9\x09\x9e\xce\xf5\xc4\x7b\x53\xaf\xed\xb7\xbb\x5a\xf7" + "\xdb\xed\x28\xf1\x5f\x96\x7d\x10\xee\x92\x65\x1f\x84\x7b\xdf\x6f" + "\xf7\xf7\x37\x3d\xf7\xdb\xbd\x3f\xeb\xda\x7e\xbb\xbe\x64\xd5\x7b" + "\x33\xfd\x97\x55\x7f\x5f\xea\x29\xab\x3e\xf8\xda\x37\x59\xf5\xf7" + "\x33\x43\x2f\xab\xfe\x6e\xf7\x94\x55\x1f\x1c\x14\xf9\x3f\x6e\xe0" + "\xb2\xea\x83\xb7\xbc\xcb\xaa\x0f\xde\xf1\x94\x55\x1f\x64\x70\x99" + "\xf4\x41\x0d\x97\x55\x1f\x14\xf1\xf4\xf7\x35\xee\xe9\x2e\x59\xc5" + "\xd3\xb9\xac\xfa\xc0\x27\xff\xff\xae\xf5\x35\xbf\x6c\xda\xcb\xb0" + "\xbe\x36\x54\x36\xed\xd5\xb2\xbe\xf6\xe1\xb5\xf5\x9f\x3e\xed\xd9" + "\x0f\x06\xe1\xf7\xff\xff\xeb\x73\xfd\xa7\x6f\x1d\xb0\x3b\xc1\xa5" + "\x03\x76\x27\x78\x5b\x9f\xc8\x03\x0c\x19\xc0\x1e\xcd\x3d\x47\x14" + "\xf9\xb8\x3e\x71\xac\x92\x18\x71\x7d\x62\xb9\xb4\x3e\xb1\x45\xb4" + "\x71\x77\x7d\xeb\x69\xe3\xfe\xbf\xd5\xbd\xd9\xb8\x68\xdb\x3a\xc1" + "\x6e\x75\x74\x5f\x97\xf8\xf7\xde\x75\x47\x47\xd0\xa6\xe8\x8b\x6f" + "\xc5\x36\x0e\x44\x77\xbc\xbe\x86\xeb\x8e\xd7\x7e\x56\xba\xe3\x43" + "\x83\xff\xba\x63\x57\xb7\x78\xbe\x1f\x5d\xe7\x9b\xee\xd8\x3d\x79" + "\xe8\x75\xc7\xee\x48\x4f\xdd\xf1\x91\x84\x87\x09\x03\xd7\x1d\xbb" + "\x4f\x79\xd7\x1d\xbb\xcf\x78\xea\x8e\xdd\xe2\x5e\xd3\x8f\x42\xb9" + "\xee\xd8\x5d\xcd\xd3\xff\x5f\x98\x7b\xba\x4b\x77\xf0\x74\xae\x3b" + "\x3e\xd2\x0e\x6c\x3e\x24\xe4\x2a\x9d\x0f\x51\xff\x93\xcd\x87\xfc" + "\xcf\x20\xce\xbf\xed\xd5\x55\x74\xed\x9f\xdf\xab\xeb\x31\x5e\x4f" + "\x06\x5b\xb7\x85\xaf\xb9\x76\x8d\xd7\x2d\xdf\x8a\xb2\xec\xe3\x2d" + "\x9e\xb2\x6c\xcf\x23\xde\x64\x59\x5f\xeb\xaa\x38\x3e\x77\x82\x9c" + "\x73\x6c\xf1\x73\x5d\x35\xf9\xe7\x24\xbf\x3e\x8a\xf4\x5f\x7e\x7d" + "\xdc\xcd\xff\xe9\x5e\x1f\xfd\x9f\x7e\xec\xd5\xff\xa9\xc3\xef\x3d" + "\xf4\x1f\x77\xf3\x7f\xba\x57\xf4\x7f\xfa\x3f\x7e\x9c\x8b\xdb\xfb" + "\xa6\x77\xf9\xb5\xb7\x9b\xff\xd3\xbd\xe2\xfa\xe9\x5e\xd1\xff\xe9" + "\x5e\xd1\xff\xe9\xff\x38\xdc\xd3\x5d\xf2\xeb\x7f\xdc\xce\xc5\xed" + "\xed\xd3\xff\x29\x35\xcc\x8d\x2e\x94\x0b\x3b\xe0\xda\x05\x75\x1c" + "\x07\x18\x30\xc1\xff\xe5\xc0\xc7\xd1\xf0\xbf\xd7\x39\x31\x6b\xd0" + "\xdc\x68\x21\x0b\xea\x2c\x27\x32\xb3\xf5\x27\x93\x69\xbc\x03\xbe" + "\xbb\x2f\x9e\xf3\x6a\x6e\x74\x88\x63\x44\xb4\x40\x13\x08\xf0\x25" + "\x9a\xc5\x57\x83\xfc\xc1\x80\x19\x6d\x32\x09\x3e\x27\xdb\x97\x21" + "\xe5\x83\xfa\x06\xd7\xc9\xf6\x4d\xc7\x32\xda\xb3\xf7\x19\xa0\x2d" + "\xcd\x5e\xeb\x0a\x65\xc5\xbc\x3d\x91\xac\x75\xd0\x1f\x4c\xcb\x5b" + "\x48\xbd\x6c\xdf\xf1\x90\xe6\x11\xd1\x34\x3d\x8e\xa0\x8d\xb5\x63" + "\xbc\x55\x81\x65\x62\xec\x45\x78\xb7\x0b\xdf\x39\xa1\x8e\x69\xcb" + "\x88\xbc\xa0\x65\x84\x12\x64\xc1\xb0\x74\x1b\x6d\x5c\xe1\x80\x3a" + "\xa7\x38\xc8\xbe\x89\x35\x8a\xf7\x5e\x83\x34\x27\xd1\x60\x7c\x3b" + "\x2c\x03\x6c\x4c\xac\xcf\xd7\xa5\x90\xbf\xb7\x3a\xbc\xf2\x2e\x09" + "\x1f\x76\x3b\xb5\x0c\x0c\x37\x26\xaf\xe7\xdf\x42\x32\x27\x12\xd3" + "\x1d\x40\x3b\x2d\x91\xf7\xf6\x7e\x80\xdf\x29\xea\x43\x26\x2a\x31" + "\x0e\x66\xfa\x66\x22\xdf\x20\x8c\x50\x1e\x48\x65\xb1\x2a\xad\xed" + "\xd9\xfb\x89\x45\x16\x5e\x86\x34\xc7\x98\x69\x18\xfb\x17\x70\x43" + "\x20\x5d\xb3\x3f\x85\x90\xee\xbc\x48\x5c\xb4\x6c\x81\x36\x69\xc9" + "\xb2\xc5\x2b\x56\x25\x69\x27\x2f\x1a\x49\x62\x57\xac\xd0\x2e\x5b" + "\xb0\x7c\xb5\xd6\xfd\xcd\xaf\xb5\x8b\x96\xbc\xb8\xe0\xd9\xa5\x8b" + "\xa7\x2c\x5b\xa8\x1f\x89\x1b\x65\xdc\xea\x11\x8a\x75\x11\xb2\xf7" + "\x4f\x2a\xdd\x48\xc8\xa6\x31\x44\x81\xf5\x82\xef\xe5\x48\xf1\xf1" + "\x30\x3e\x9c\x1c\xf2\xa4\x83\x0c\xdc\x90\x36\x02\xf2\x9a\x8a\xde" + "\x80\x7a\x95\x42\xbd\xa1\x8e\x58\xe7\x9d\x52\x9d\x25\x4c\xa4\x23" + "\x26\xd2\x5a\x00\x83\xfb\x8f\x87\xd8\x47\x3c\x4a\x69\x1c\xb6\xcf" + "\x06\xfd\x44\xd6\x20\xfb\x64\x32\xea\x25\x6a\x9c\x1b\x0d\xbf\xb5" + "\x4a\x18\xc3\xdf\xd2\x82\xb9\xea\x76\xec\x27\x34\xe1\xb7\xbc\x4f" + "\x7d\x52\x3e\x47\x27\x23\x3c\x3e\xdf\x27\x61\xae\xf8\x7c\x9f\x94" + "\x23\x6d\xa1\x1e\xcd\x90\x1e\x09\xa3\x89\x1d\x98\x8e\x71\x22\x31" + "\xce\x1e\xd6\x19\xda\x05\x7a\x91\x9a\x68\x96\x88\xfd\x9c\x32\x8d" + "\x90\x73\x68\xab\x59\x71\x81\xc4\x38\x68\x27\xcd\x2d\x03\x9c\xd9" + "\x48\x48\xa6\x7e\x21\x1d\xbe\xff\xde\x10\xc7\x92\xc5\x18\x1f\x50" + "\xc8\x3d\xb4\x95\xe6\xee\x5b\x3a\xe7\x76\xa2\x86\xb2\x0b\xdd\xe2" + "\x04\x2a\x06\xc6\xff\x4f\x18\xff\x91\x8f\x18\xff\x8f\xf3\xf1\x13" + "\xcb\xfe\xa4\x9e\x7c\xec\xc2\xdf\xdb\x02\x39\x04\x58\xa0\xaa\xdc" + "\xc2\x18\x27\xa7\x23\xf6\xdd\xd6\xf4\x04\x72\x37\xa3\xdd\x81\x62" + "\xa1\x20\x57\x2f\x18\x72\xcb\xa8\x21\xb7\x08\x68\xa6\x2b\x48\x26" + "\xda\xf9\x4e\x35\x31\x5e\x20\x11\x56\x63\x6e\x61\x90\x2c\x43\x06" + "\xb6\x85\x1c\xf4\x46\x04\xc8\x8c\x08\xb1\xbf\xeb\x90\x8e\x9f\x36" + "\x13\xf2\xf8\x8b\x84\xfc\x30\x8d\x04\x94\xc2\xef\x06\xd6\x9e\x03" + "\xdc\xff\x53\xf6\x81\xb0\x37\xe0\xb7\x18\xe7\x71\x80\xbf\xdf\xe6" + "\xb5\xdf\x75\xb5\x3b\x4f\xdd\x7b\xbb\x0f\x16\x42\xbb\xad\x82\x21" + "\x4f\x47\x0d\x79\xa1\x3d\xdb\x9d\xa7\xe6\xed\x1e\xd6\x32\xf4\xed" + "\x3e\x38\x8f\xb7\xfb\x60\xa8\x7f\xed\x3e\xe8\x75\xfe\xcf\xad\xdd" + "\x5e\xf8\x7d\x28\x47\x28\xc8\x03\x7e\xe7\x01\xbf\xf3\x7a\xe1\x77" + "\x9e\xc8\xef\x51\x75\x43\xdf\xee\x43\xb1\xbc\xdd\x87\x54\xfe\xb5" + "\xfb\x90\x57\xf9\xe7\x6a\x77\xbe\x17\x7e\xff\x23\x03\xda\x0d\xfc" + "\xce\x07\x7e\xe7\xf7\xc2\xef\x7c\x91\xdf\xa3\x8f\x0e\x7d\xbb\xff" + "\xc1\xe7\xff\xb3\xff\xa1\xf0\xaf\xdd\xff\x30\xf8\xd0\x6e\x2f\xfc" + "\xfe\x34\x45\x28\xc8\x07\x7e\xe7\x03\xbf\xf3\x7b\xe1\x77\xbe\xc8" + "\xef\xfb\xf2\x86\xbe\xdd\x9f\xce\x10\xdb\xed\xf0\xaf\xdd\x9f\xae" + "\xef\xbf\xdd\x06\x2f\xfc\x2e\xd7\x43\xbb\x81\xdf\x06\xe0\xb7\xa1" + "\x17\x7e\x1b\x44\x7e\x3f\xfd\xd0\xd0\xb7\xbb\x7c\x1a\x6f\xf7\xa7" + "\x36\xff\xda\x5d\x9e\xda\x7f\xbb\x73\x8b\x41\x66\xf7\xe0\xb9\x39" + "\x65\x2a\xb9\xeb\x02\xb6\xff\xb0\x85\x06\xe5\x16\x8f\xca\xcc\x90" + "\x39\x54\xb9\x25\xa3\x6a\x89\x1c\xc6\x7e\x09\x21\x16\x12\x08\x6d" + "\x4d\xa0\x05\x05\xd8\xe6\x04\x01\xca\x71\x80\xec\x77\xaa\x72\x8b" + "\x3a\x0c\x73\x75\xf9\xcf\x11\x6d\xba\x95\xa8\xab\xd2\x2c\x24\x4d" + "\x4f\xad\x55\xe4\x14\x09\xb2\x10\x39\xce\x63\x7d\xde\xbc\x8b\x2c" + "\x4f\xa4\x14\xca\x3e\x8c\xe3\xc5\x82\x06\x12\x01\x36\x71\x06\x05" + "\xfd\x51\x28\x10\x2d\x94\x1f\x81\xb4\x84\xb2\x7f\x19\x12\x4b\x64" + "\x7b\x9f\xb5\x13\xa4\x27\xd2\x16\xc6\x96\x11\x8c\xae\x60\x61\xff" + "\xcb\xd3\x9c\xae\xaf\x3f\x37\x50\xba\x1e\x2e\xe2\x76\x65\xee\x0e" + "\xb3\xa5\x03\xc7\x67\x6a\x3c\xd7\x0c\xe9\xb3\xab\xf4\x2d\x30\x0e" + "\x29\xb7\x51\x63\xee\x56\x01\x74\xd6\x00\xcb\xf5\xba\xff\xcd\x4d" + "\x9e\x6a\x40\x66\xf6\xc0\x9a\x8b\xde\x9f\xcf\xa6\x41\x79\x1a\x4e" + "\xef\xbc\xb0\x51\xb5\xc3\x5a\x7a\xa7\x77\x9e\xc6\x01\x3a\xc7\xa9" + "\xca\x0b\xf5\x9d\xde\x9f\xdf\xdf\x8d\xde\xd6\xcb\x43\xef\xcf\xb9" + "\x1f\x31\x43\x5e\x84\x27\xbd\x3f\x33\x71\x7a\x7f\xb6\x88\x1a\xf3" + "\xb4\x02\xe8\xca\x01\x96\xeb\xf5\xfc\xa3\x1b\xbd\x01\xdf\x3d\x75" + "\x98\x8b\xde\x15\x26\xa0\xb7\x88\xef\x3c\xc0\xf7\xa8\x3a\x2f\xf4" + "\x06\x7c\xe7\x01\xbe\xf3\x06\x80\xef\x8a\xb7\x3d\xe9\x9d\x77\x99" + "\xf0\x5d\x21\xc6\x7f\xca\xeb\x86\xef\x8a\x08\x4e\xef\xcf\x8f\x01" + "\xbd\x01\xdf\x79\x03\xc4\x77\x45\x85\x0f\xfa\x03\xf0\xdd\x53\x77" + "\xba\xe8\x5d\x15\x41\x83\xf2\x45\x7c\xe7\x03\xbe\x47\x1f\xed\x9d" + "\xde\xf9\x80\xef\x7c\xc0\x77\xfe\x00\xf0\x5d\x35\xae\x1b\xbd\x2f" + "\x13\xbe\x2b\xeb\x39\xbd\xf3\xbb\xe1\xbb\x72\x2b\xa7\x77\xe5\x0c" + "\x6a\xcc\x07\x7c\xe7\x0f\x10\xdf\x55\xd3\x7c\xa0\x37\xe0\xbb\xa7" + "\xce\x76\xd1\xdb\xbc\x15\xe8\x2d\xe2\x3b\x1f\xf0\x7d\x5f\x9e\x17" + "\x7a\x03\xbe\xf3\x01\xdf\xf9\x03\xc0\xb7\x39\xd7\x93\xde\xf9\x97" + "\x09\xdf\xe6\x58\x91\xde\xdd\xf0\x6d\x56\x73\x7a\x57\xed\x04\x7a" + "\x03\xbe\xf3\x07\x88\x6f\xf3\x76\x1f\xec\x04\xc0\x77\x4f\x5b\xc1" + "\x45\xef\x23\x6a\x1a\x64\x10\xf1\x6d\x00\x7c\x3f\xfd\x50\xef\xf4" + "\x36\x00\xbe\x0d\x80\x6f\xc3\x00\xf0\x5d\x7d\xb1\x1b\xbd\x2f\x13" + "\xbe\xab\x0f\x72\x7a\x1b\xba\xe1\xbb\x3a\x83\xd3\xbb\x7a\x12\x35" + "\x1a\x00\xdf\x86\x01\xe2\xfb\x88\xd7\xf3\xbf\x7d\xd9\x27\x2f\x6e" + "\x21\x4a\x4f\x9a\x1f\x5d\x7f\xe9\x6c\x94\xa3\xcb\xae\x8c\x8d\x72" + "\x74\x6a\xef\x36\xca\x11\x1b\xa7\xf9\x91\x62\xff\x6c\x94\xa3\x85" + "\xfe\xd8\x28\x3d\x69\xfe\x85\xfd\xd2\xd9\x29\x5f\x9c\xba\x32\x76" + "\xca\x17\xdb\x7b\xb7\x53\xbe\x48\xe0\x34\xff\x42\xe5\x9f\x9d\x72" + "\x4c\xe1\x8f\x9d\xd2\x93\xe6\xc7\x97\x5e\x3a\x5b\xe5\xf8\x9c\x2b" + "\x63\xab\x1c\xd7\xf6\x6e\xab\x1c\xab\xe5\x34\x3f\x96\xe1\x9f\xad" + "\x72\x3c\xc5\x1f\x5b\xa5\x27\xcd\xbf\xb4\x5c\x3a\x7b\xe5\xcb\xc3" + "\x57\xc6\x5e\xf9\xb2\xa8\x77\x7b\xe5\x4b\x71\xfc\x73\xdc\xe6\x9f" + "\xbd\xf2\xa5\x0f\xe3\x9f\x9e\xf6\x4a\x4f\x9a\xd7\xc4\x5e\x3a\x9b" + "\xa5\x66\xfa\x95\xb1\x59\x6a\x94\xbd\xdb\x2c\x5f\x1d\xe4\x34\xff" + "\x2a\xc1\x3f\x9b\xa5\x26\xde\x1f\x9b\xa5\x27\xcd\xbf\x2e\xbf\x74" + "\x76\xcb\xd7\xef\x5f\x19\xbb\xe5\xeb\xd4\xde\xed\x96\xaf\xa7\x72" + "\x9a\xd7\xd4\xfa\x67\xb7\x7c\x7d\xcc\x1f\xbb\x05\x69\x8d\x34\x47" + "\x5b\x85\xd3\xbc\xb6\x98\x06\xe7\xea\x3b\xc1\x1e\x09\x02\xba\x07" + "\x35\x13\xf9\x16\xa4\x79\x0d\xa7\xb9\x33\xb8\x00\xe9\x93\x80\x34" + "\x63\xed\xf8\x51\x13\xec\x34\xe4\x96\x50\x39\x81\xb6\x28\x49\x83" + "\xec\xc4\x5b\x8e\x2c\x12\xac\x4d\xcb\x84\xff\x6b\x99\xff\x4c\x6d" + "\x5a\xf6\xb7\xd0\xc6\x00\x5c\xa3\x70\x18\xe3\xaa\x9d\x41\xc6\xd9" + "\x0d\xb2\x6f\x4e\xd3\x09\xb1\xd5\x9d\x60\x4b\xd0\x17\x34\xa1\xe6" + "\xe6\x1d\xc4\xec\xf8\x8c\x54\xd5\x7c\x44\x84\xe0\x82\x5f\xde\xed" + "\x20\x3a\xfa\xa3\x2e\xb4\x22\xc9\x42\x9c\x0b\x35\x2a\x73\x4a\x39" + "\xe0\xe2\xef\x24\xa6\x91\x5e\xa0\xdf\xeb\x54\x9d\x41\x1b\x0b\x9d" + "\x41\x05\x6a\xa7\x71\x53\x9c\x23\x68\x63\xc6\x3b\xc9\x16\xb9\xca" + "\x4e\x74\x4b\xeb\x29\x2d\x78\x96\x28\x0a\xea\x88\x72\xc3\xb3\x44" + "\xb5\xa1\x8e\xa8\x2b\xea\x6b\x48\x65\x53\x39\xa9\x6c\xf9\x9a\x54" + "\x5e\x80\xab\x03\x2e\x01\xae\x8c\xaf\x49\x05\x48\x87\x59\x67\x09" + "\x49\xaf\xa7\xd6\x3b\x6b\x49\x68\x85\xa3\x86\xe0\x3e\xde\x73\xb2" + "\x6f\x56\xab\xe2\x49\x28\xfd\x5e\x43\xe8\x42\x8d\x1c\xde\x29\x30" + "\xdd\xec\xb0\x92\x8a\x7a\x3b\xbe\x8f\x83\xf7\x8a\xf4\x7a\x28\x5f" + "\x28\x47\x7f\x71\xd6\x8a\x8c\xc3\xd0\x3e\xa5\x09\xe8\x5c\x26\xd9" + "\x64\x05\x1d\x24\x62\x03\xb0\x19\x31\x13\x43\x39\x66\xde\xe8\x18" + "\x28\x66\xbe\xe1\xfe\xcf\x5e\xd0\x8c\x01\x7a\x8f\x17\x5e\x88\x53" + "\x3f\xfe\xf5\x49\x8a\xfb\xb4\x70\x7d\xa6\xca\xf6\x19\x31\xaf\x17" + "\x48\xcc\x6a\x42\x66\x3a\x09\x41\x9a\xe0\x5a\xf2\xe3\x7a\x12\x82" + "\xfb\xc7\x84\x1f\x75\x63\xcc\xf5\x56\xb2\xd6\x01\x75\x3d\x67\xef" + "\xaa\x6b\xd5\xfa\x2a\x02\xef\xc6\x57\x25\x58\x88\x4a\x4f\xd4\x48" + "\x67\xb0\x45\x8b\x1f\x6f\x24\x81\xcb\x6d\x94\x22\x8d\x91\xb6\x48" + "\x67\x2c\x4f\xa2\xbd\x79\x91\x95\xa4\xdb\x89\xda\x9c\x06\xf7\x14" + "\x6a\x35\x93\xf3\x04\xea\x68\xa0\x41\x4a\x13\xe0\x23\x12\x31\x61" + "\x91\x9d\x28\x01\x1c\x8c\xa1\xd9\x27\x66\x97\x42\x7b\x71\x0d\x7f" + "\x60\x6d\xae\xf5\x65\xfd\xa3\x87\x4d\xe8\xc2\x73\x9e\x86\xe3\xf9" + "\x64\x02\xe0\xd9\xda\x09\xb6\x1e\xc7\xf3\xb0\x96\xfe\xf1\x9c\x17" + "\xe6\xc2\xf3\xb7\xab\x5c\x78\x3e\x39\xd7\x3b\x9e\xbf\xfb\x90\xe3" + "\x39\x2f\xe2\xea\xc4\xf3\x77\x8f\xf5\x8d\xe7\xef\x74\xde\xf1\x9c" + "\xa7\x93\xec\xdd\xa1\xc1\xf3\x77\x19\x97\x0f\xcf\x79\x1a\xff\xf0" + "\xfc\xdd\x3c\x4f\x3c\x7f\xbb\x94\xe3\xf9\x5b\xad\x7f\x78\x3e\xe9" + "\x35\xfe\x41\x5f\xf6\xb6\x1b\x9e\x45\xf9\x5c\x37\x95\x06\xe7\x81" + "\x7c\xce\x13\xe5\xf3\xa8\x3a\x1f\xf0\xec\x26\x9f\x2d\x8f\xb8\xf0" + "\x5c\x77\xbb\x77\x3c\x9f\x7a\x45\xc4\xf3\x55\x2a\x9f\x4f\x8d\xeb" + "\x1b\xcf\x16\x7b\x1f\x78\x2e\x93\xc6\x12\x43\x83\xe7\x53\xb3\x2f" + "\x23\x9e\xfd\x94\xcf\xa7\xc2\x3d\xf1\x6c\x99\xc6\xf1\x7c\xd2\xea" + "\x1f\x9e\xeb\xbc\xee\x7f\xee\x6b\x2c\xe3\xc2\x73\xbe\x28\x9f\x4f" + "\x2b\x01\xcf\x20\x9f\xf3\x45\xf9\x3c\xfa\x68\xff\x78\xce\x77\x93" + "\xcf\xdf\x5f\xe7\xc2\x73\xfd\x45\xef\x78\xae\x9f\xc3\xf1\x9c\x7f" + "\x95\xca\xe7\xef\xcf\xf4\x8d\xe7\xef\xcb\xbd\xe3\x39\x5f\x27\x8d" + "\xd3\x86\x06\xcf\xf5\xda\xcb\x87\xe7\x7c\x3f\xe5\xf3\xf7\x0e\x4f" + "\x3c\x7f\xaf\xe2\x78\xae\x33\xf9\x87\xe7\xd3\x5e\xe3\xff\xf4\x35" + "\x4e\x74\xc3\xb3\x28\x9f\x7f\xa8\xa1\xc1\xf9\x20\x9f\xf3\x45\xf9" + "\x7c\x5f\x9e\x0f\x78\x76\x93\xcf\xa7\x4f\xbb\xf0\xfc\xc3\x61\xef" + "\x78\xfe\x61\xb2\x88\xe7\xab\x54\x3e\x37\xec\xee\x1b\xcf\x0d\xc5" + "\x7d\xe0\xb9\x4c\x1a\x03\x0f\x0d\x9e\x1b\xac\x97\x11\xcf\x7e\xca" + "\xe7\x86\x0a\x4f\x3c\x9f\xae\xe5\x78\x3e\x5d\xe8\x1f\x9e\x7f\xf0" + "\xea\xff\xad\xaf\x31\xb8\x0b\xcf\x06\x51\x3e\x37\x95\x01\x9e\x41" + "\x3e\x1b\x44\xf9\xfc\xf4\x43\xfd\xe3\xd9\xe0\x26\x9f\x1b\x3f\x74" + "\xe1\xb9\x69\xb3\x77\x3c\x9f\x69\xe3\x78\x36\x5c\xa5\xf2\xf9\x4c" + "\x6e\xdf\x78\x3e\x93\xe0\x1d\xcf\x06\x9d\x34\xbf\x30\x34\x78\x3e" + "\x63\xba\x7c\x78\x36\xf8\x29\x9f\xcf\x94\x78\xe2\xb9\x71\x3b\xc7" + "\x73\x63\xbc\x7f\x78\x6e\xf2\x1a\xff\x6e\x60\xf3\x1b\x67\xcb\x70" + "\x7e\xa3\x03\xe7\x37\x5c\x7b\xff\x12\x42\xaa\x39\x9e\x3b\x01\xcf" + "\xaf\xbb\xe3\xf9\x9b\xee\xf3\x1b\x3f\xbe\x22\x74\xe1\xf9\x6c\x0f" + "\x3c\x0b\x80\xe7\x4e\x86\xe7\xe6\xf7\xa5\xf9\x0d\x73\xf3\x56\xc0" + "\x49\x13\x31\xcf\x06\x2c\x17\x88\x58\xfe\x06\xb0\x0c\x34\x14\x80" + "\xc6\x15\xb5\x35\x24\xc6\xca\x69\xd9\x01\x34\x16\xdc\x71\xdc\xd1" + "\x28\x47\xfc\x22\x6e\x25\x0c\x57\x2e\x07\xec\x26\x1e\x21\x95\xc9" + "\x70\xad\x81\x2b\x0d\x2e\x72\x84\x54\x34\x02\x76\x97\xb8\x63\xb7" + "\x5a\xc4\x6e\xf3\x23\x7d\x63\xb7\x79\xd2\xe5\x9b\xcb\x68\xe6\xf3" + "\x5f\xdf\xc4\xa9\x63\x9e\x38\x49\xcd\x29\x35\x22\x3e\x9b\x48\x8c" + "\x83\x84\xd0\xa7\x75\x63\x54\x71\x44\xfd\xb2\x93\xc8\x8d\xcf\x12" + "\xb5\xf1\x04\xb4\x5b\xea\xbf\x75\x44\xf5\x99\xfd\x23\x52\xd1\x52" + "\x43\x2a\x2e\x1c\x26\x15\x02\x5c\x4d\x70\x41\x5d\x63\x16\xbb\xb7" + "\xdb\x2a\xb6\xfb\xec\x74\x28\x6b\x92\xf7\x76\x9f\x0d\x63\xed\x5e" + "\x04\xed\xee\x70\xb5\xdb\x0c\xfd\x00\xf8\x33\x5e\x10\xe7\x43\x62" + "\xac\x24\x70\x85\x83\xd2\x0e\x11\xff\xc8\x9f\xcf\x8e\xd9\x49\x8c" + "\x1e\x78\xb6\x10\xf0\x5f\x5f\x46\xd2\x53\x01\xff\x1d\x76\xc4\x9d" + "\xd5\x9c\x71\x11\xf0\xdf\x1c\x47\x81\x7e\x9d\x88\xff\x6f\x10\xff" + "\x3f\xa6\x0a\x0c\xff\x3f\x46\xf8\x87\xff\xb3\x3e\xe0\xdf\x97\xf9" + "\x10\x2b\xe2\xdf\xda\x81\xf3\x21\xae\x3d\xa0\xfd\xe0\xdf\x7d\x3e" + "\xe4\x9c\x1b\xfe\xad\x7d\xe0\xff\xa7\xf7\xa5\xf9\x90\x2b\x8f\xff" + "\x9f\xfa\xc1\xff\x4f\x7d\xe0\x7f\xa8\xe7\x3e\x7e\xba\x8c\xf8\xb7" + "\xf6\x83\x7f\xab\x0f\xf8\xcf\xd3\xf8\x87\xff\x9f\xba\xe1\xff\x9c" + "\x88\xff\x73\x7e\xe2\xdf\xea\x0b\xfe\x7d\x98\x3f\x69\x2d\xc3\xf9" + "\x93\x0e\x9c\x3f\x71\xed\x05\xee\x0f\xff\x6e\xf2\xff\xbc\x1b\xfe" + "\x5b\xfb\xc0\x7f\x8b\x84\xff\xab\x40\xfe\xb7\xf4\x83\xff\x96\xbe" + "\xf0\x3f\xc4\x73\x25\x2d\x97\x11\xff\xad\xfd\xe0\xbf\xd5\x17\xfc" + "\xfb\x29\xff\x5b\xba\xe1\xff\xbc\x88\xff\xf3\x7e\xe2\xbf\xd5\x07" + "\xfc\xfb\x32\xdf\x72\x01\xf1\x0f\xf2\x3f\x3f\xd4\x6d\x4f\x78\x3f" + "\xf8\x77\x9f\x6f\xb1\xb9\xe1\xff\x42\x1f\xf8\x6f\x7b\x5f\x9a\x6f" + "\xb9\xf2\xf8\x6f\xeb\x07\xff\x6d\x7d\xe0\x7f\xa8\xe7\x56\xda\x2e" + "\x23\xfe\x2f\xf4\x83\xff\x0b\x3e\xe0\x3f\xdf\x4f\xf9\xdf\xd6\x0d" + "\xff\x36\x11\xff\x36\x3f\xf1\x7f\xc1\x17\xfc\xfb\x30\x3f\x73\x11" + "\xc7\xb3\x20\xff\xf3\x8b\xdc\xce\x06\xf4\x87\x7f\x37\xf9\xdf\xee" + "\x86\xff\x8b\x7d\xe0\xdf\x2e\xe1\xff\x2a\x90\xff\xf6\x7e\xf0\x6f" + "\xef\x0b\xff\x43\x3c\x17\x63\xbf\x8c\xf8\xbf\xd8\x0f\xfe\x2f\xfa" + "\x82\x7f\x3f\xe5\xbf\xbd\x1b\xfe\xdb\x45\xfc\xb7\xfb\x89\xff\x8b" + "\x3e\xe0\xdf\x97\xf9\x1c\x07\x9b\xcf\xe9\xc0\xf9\x1c\xd7\x19\x91" + "\x7e\xf0\xef\x3e\x9f\xd3\xe1\x86\x7f\x47\x1f\xf8\xef\x7c\x5f\x9a" + "\xcf\xb9\xf2\xf8\xef\xec\x07\xff\x9d\x7d\xe0\x7f\xa8\xe7\x6e\x3a" + "\x2f\x23\xfe\x1d\xfd\xe0\xdf\xe1\x03\xfe\x0d\x7e\xca\xff\xce\x6e" + "\xf8\xef\x10\xf1\xdf\xe1\x27\xfe\x1d\x43\x34\xff\x23\xcc\xc6\xf9" + "\x1f\x41\x95\x5b\xd4\x59\x12\x5b\x2d\x18\x36\x16\x86\xc8\xb4\xc4" + "\xa1\x32\xce\x36\x27\xd9\xc8\xe3\x6d\xc0\x13\x7d\x1b\x79\xa6\x4d" + "\x8d\xf1\x02\x33\x28\x8c\xff\x3d\xce\x88\xc2\xe5\x30\x28\x4d\x1b" + "\x96\x13\x85\x33\xb8\xe0\x97\x98\x66\x6e\xb0\x13\x6c\xf3\x5a\xa4" + "\x41\x93\x8b\x06\x38\x07\x47\x7f\xd2\xa9\x4b\xb3\x20\x4f\x87\x85" + "\xd4\x03\x5e\x2a\xea\x2d\x40\xfb\x35\x0c\x5b\xc8\x8b\x06\x99\xd3" + "\xfa\xc6\x39\xa2\x70\x7c\xaf\x19\x0f\x3c\x0e\x0d\x7a\x89\xc8\xc2" + "\xea\xa9\x80\xbc\x44\x1e\x21\x5f\xb5\x6b\x70\xbf\x92\xf0\x58\x15" + "\xe0\xdb\xf1\xbd\x6e\x7c\x29\xe4\x1b\xfa\x79\x19\x81\xad\x7f\x58" + "\x64\xce\xc6\x8a\x5a\xa0\x65\xb6\xd3\x4f\x3e\x09\xbe\x9c\x7f\xf1" + "\x61\x9e\x82\xda\x71\x9e\x42\x50\xe5\x85\xfa\xc6\xa7\x3c\x8d\xc7" + "\x99\xd6\x21\xe7\x13\x2d\xf6\x8d\x4f\xf4\xbc\x27\x9f\x86\x7a\xfe" + "\x80\x8a\xfe\x60\x68\x21\xe7\x93\x50\xe3\x17\x9f\xe4\xc4\xaf\xfd" + "\xbf\x3d\xc6\xd3\x72\xd9\x56\x1c\x4f\x03\x9f\x7c\xec\x4f\x79\xc5" + "\x1e\x67\x70\x87\x9a\x4f\x72\x59\x94\x4f\x7c\x92\xcb\x36\x77\xe3" + "\xd3\xd0\x8e\x73\xe5\x32\x1e\x0f\x5a\x2e\x9b\xca\xf8\x94\x47\x32" + "\xfc\xe3\x93\xcc\x87\xf3\x1f\x3e\x8c\xfb\xe4\x01\xd1\x38\xee\x13" + "\x60\xdc\xe7\x1b\x9f\xf2\x35\x1e\x67\x86\x87\x9c\x4f\xf2\x46\xdf" + "\xf8\x14\xf0\xa0\x27\x9f\x86\x78\x3c\x26\x0f\x50\x71\x3e\xc9\x2d" + "\x9c\x4f\x72\x9d\x7f\x7c\x0a\x88\x1d\x92\xf1\x89\x5c\x61\xc5\xf1" + "\x09\xf0\xc9\xc7\xfe\x94\x5f\xec\x71\xc6\x79\xc8\xf9\xa4\x28\xf4" + "\x8d\x4f\x8a\x33\xdd\xf8\x34\xb4\xe3\x06\xb9\x62\x27\xe7\x93\x22" + "\x87\xf3\x29\xa0\xda\x3f\x3e\x29\xbc\xc6\xff\x1c\x90\x1d\x2d\x1f" + "\x5e\x8c\x76\xb4\x00\x76\xb4\x6f\x7c\x32\x68\x3c\xce\x64\x0f\x39" + "\x9f\x86\x4f\xf5\x8d\x4f\xc3\xff\xe4\xc9\xa7\x21\xb6\x6f\xe5\xc3" + "\xe7\x71\x3e\x0d\x8f\xe0\x7c\x1a\x96\xe2\x1f\x9f\x86\xfb\xb0\xff" + "\xb3\xf7\x73\x58\x3d\x6c\x3e\xb9\x72\xc6\x55\x65\xf3\xc9\x47\xd4" + "\xfb\xc6\x2b\xe5\xf4\x4b\x6a\xf3\xc9\x95\x4a\xce\xab\x11\xb5\x9c" + "\x57\x23\x26\xf9\xc7\x2b\xe5\x6c\x7f\xcf\x6f\xf5\xb0\xfb\xe4\x81" + "\xd6\xab\xca\xee\x93\x07\xfa\x28\xff\x02\xcf\x5c\x52\xbb\x4f\x1e" + "\x28\xca\xbf\x40\x51\xfe\x29\xfd\x94\x7f\x81\x3e\xc8\xbf\xde\xcf" + "\x7d\xf5\xb4\xfd\x46\x95\x5c\x5d\xb6\xdf\xa8\x69\xbe\xf1\x6a\xd4" + "\x9f\x2f\xad\xed\x37\x2a\x9e\xf3\x6a\x54\x24\xe7\xd5\xc8\x54\xff" + "\x78\x35\xca\x6b\xfc\x97\xfe\xce\x8b\xf5\xb4\xff\x82\xae\x32\xfb" + "\x4f\xe5\xa3\xfd\x17\x74\x89\xed\xbf\x20\xd1\xfe\x53\x89\xf6\x9f" + "\xca\x4f\xfb\x2f\xc8\x2f\xfb\xaf\x1b\xaf\xc4\x7e\x15\x6c\xbb\xba" + "\x6c\xc0\xe0\x22\xdf\x78\x15\x7c\xf6\xd2\xda\x80\xc1\xbb\x38\xaf" + "\x82\x0d\x9c\x57\x41\xc7\xfc\xe3\x55\x08\xf1\xf7\x7c\x5a\x4f\x3b" + "\x50\xbd\xf5\xea\xb2\x03\xd5\x3e\x8e\x7f\xd5\x9b\x2f\xad\x1d\xa8" + "\x16\xc7\xbf\x6a\x71\xfc\x1b\xe2\xe7\xf8\x57\xed\xc3\xf8\xd7\x87" + "\x79\x3f\xf9\x2f\x08\xda\x80\x4e\x43\x6e\x51\x08\xd0\x3f\x24\x85" + "\xc8\x3b\xc2\x80\x5f\x2a\xe0\x57\xa6\x96\x74\x1a\x80\x5f\x56\x07" + "\x79\x7c\xe5\x49\x5a\xd5\xec\x24\x1d\xc0\xab\x8b\x60\x07\x9a\xad" + "\x8d\x78\x46\xef\x37\x75\xf2\x31\x9b\x9f\x5e\xa9\x26\xc8\x2f\xa4" + "\xbf\x53\xa5\x34\x51\xe0\x17\xe3\x9f\x6a\x53\x9c\xc3\x50\xa0\x9e" + "\x75\xf6\x24\x5d\x61\xa1\xb4\x32\xc1\x0e\x75\x8a\xab\xae\x4c\xa8" + "\x21\x31\xf5\x24\x50\xfb\x24\xf2\x65\xcc\x63\x98\x6e\xb6\xd6\x10" + "\xf4\xfb\xc9\xe6\xc0\x4f\xea\x42\x1d\x5f\xe9\x54\xe8\xbf\x09\xcf" + "\x15\x4a\x3e\x9a\xcc\x4d\xc5\x8c\xff\xdd\xe7\x54\x19\xff\xbf\xd2" + "\xa9\x5f\xc7\xf3\x89\x43\x6e\x0b\x8e\x61\xf3\x7f\xc2\x49\xcd\x78" + "\xa9\x8e\x2b\x96\x52\x0a\x75\x1c\x53\x65\xb3\x12\xac\x67\x95\xcd" + "\x44\xd2\x93\x88\xba\xaa\xa3\x91\xa4\xd9\xa8\xb5\x2a\xe3\x0c\x89" + "\x69\xc3\x75\x01\xc4\xd3\x98\x3f\x71\x7e\x8f\xde\x23\x9c\xd4\x8d" + "\x87\xf2\x72\xaa\xaa\x09\x09\xc9\x04\x5a\x3b\x88\x9c\x9d\xd7\x94" + "\x13\x25\xd0\x2b\xc1\x9c\x51\x07\xbc\x28\x28\x34\x3b\x4e\x20\x3d" + "\x13\xe0\xfd\xb4\xae\xf5\x86\xe0\x82\x8d\x98\x86\xb4\xc5\x7d\xa6" + "\x66\xbd\x95\xe5\x91\xde\x73\xde\x65\x10\x73\x4a\x07\xa9\x02\x4b" + "\x06\xbe\x97\xf0\x79\x5c\x0d\xe0\x6b\xb4\x9f\x72\xfb\x17\xaa\x21" + "\x99\xaf\x94\x5f\x17\x8f\x76\xab\xd3\x90\x17\xca\xeb\x38\xac\xa5" + "\x7f\x7c\xe5\x69\x5c\xf8\x0a\xbd\x38\x38\x7c\x85\xbe\x3d\xb4\xf8" + "\x1a\x6a\xfb\x35\x34\x69\x70\xf8\x0a\x3d\xcf\xf1\x15\x1a\xc6\xf1" + "\x15\xda\xe8\xc2\xd7\xb0\x96\x4b\x87\xaf\x5f\x94\x73\x7c\xfd\x22" + "\xc7\x3f\x7c\x5d\xb7\x74\x68\xe6\x59\xaf\x37\xa1\xad\x0d\xf8\x12" + "\xe5\xd7\xa8\x3a\x1f\xf0\xe5\x26\xbf\xae\x9f\x3b\x38\x7c\x5d\x1f" + "\x38\xc4\xf8\x1a\x62\x9b\x7b\xec\xb1\xc1\xe1\xeb\xfa\x27\x38\xbe" + "\xc6\xa6\x72\x7c\x5d\x1f\xed\xc2\xd7\xa8\xba\x4b\x87\xaf\xb1\x3a" + "\x8e\xaf\xeb\x1a\xfd\xc3\xd7\xf5\x7e\xf9\xbf\xea\x39\x3e\x18\xaf" + "\xc5\xf1\x81\xd3\x90\x2f\xca\xaf\xd1\x47\xfb\xc7\x57\xbe\x9b\xfc" + "\x1a\xb7\x7b\x70\xf8\x1a\xb7\x64\x68\xf1\x35\xd4\xe3\x84\x71\x91" + "\x83\xc3\xd7\xb8\xf7\x39\xbe\x34\xb5\x1c\x5f\xe3\xca\x5c\xf8\x1a" + "\x7d\xf4\xd2\xe1\x4b\x93\xc3\xf1\xa5\x89\xf6\x0f\x5f\xe3\xbd\xfb" + "\x7f\x1e\xd0\xbc\x76\x58\x06\x8e\x69\x00\x5f\xa2\xfc\xba\x2f\xcf" + "\x07\x7c\xb9\xc9\xaf\xb0\x71\x83\xc3\xd7\x0d\x87\x87\x18\x5f\x43" + "\x3c\xb6\xb9\xa1\x68\x70\xf8\x0a\x1b\xcd\xf1\x75\xc3\x34\x8e\xaf" + "\x30\xa5\x0b\x5f\xf7\xe5\x5d\x3a\x7c\x8d\x6f\xe4\xf8\x1a\x5f\xe6" + "\x1f\xbe\xc2\x7c\xf0\xff\xea\xcb\x7c\xfc\x44\x0b\x8e\xc3\x9c\x06" + "\x83\x28\xbf\x9e\x7e\xa8\x7f\x7c\x19\xdc\xe4\xd7\xc4\xd5\x83\xc3" + "\xd7\xc4\xdb\x87\x16\x5f\x43\x3d\x1e\x9b\x60\x1b\x1c\xbe\x26\xae" + "\xe4\xf8\x9a\x50\xc2\xf1\x35\x31\xc1\x85\xaf\xa7\x1f\xba\x74\xf8" + "\x9a\x10\xcd\xf1\x35\x41\xe9\x1f\xbe\x26\xfa\xe0\xff\xc7\xd7\x75" + "\x84\x9b\x66\x0c\x6e\x0c\xa9\xfd\x76\x70\x18\xd3\x1a\xaf\xee\x31" + "\xa4\x36\x6e\x70\x18\xd3\x1e\xe7\x18\xd3\x12\x8e\x31\x6d\xc5\xe5" + "\x19\x43\xde\xb8\x9d\x63\xec\xc6\xa5\xfe\x61\xec\xa6\x21\x5c\xff" + "\xb8\xa5\x6c\x70\xe3\xc8\x5b\x1e\x1c\x1c\xc6\x6e\x3e\x7f\x75\x8f" + "\x23\x6f\xde\x33\x38\x8c\xdd\x72\x3f\xc7\xd8\xcd\x8b\x38\xc6\x6e" + "\x89\xb8\x3c\xe3\xc8\x9b\xd5\x1c\x63\x37\xf9\xb9\x6e\x73\x8b\x5f" + "\xe7\x5f\x7a\x5f\xb7\xb9\x55\x35\xb8\xb1\xe4\xe4\xb7\x06\x87\xb1" + "\xc9\x73\xae\xee\xb1\xe4\x64\xed\xe0\x30\x36\x79\x0b\xc7\xd8\xa4" + "\x72\x8e\xb1\xc9\x45\x97\x67\x2c\x39\x29\x89\x63\x6c\x52\xa4\x7f" + "\x18\xbb\x55\x33\x74\xeb\x4d\x3a\xfd\xe0\xc6\x93\xba\xc0\xc1\x61" + "\xec\xb6\xdd\x57\xf7\x78\xf2\xb6\xf5\x83\xc3\x18\x34\x80\x61\xec" + "\xb6\x70\x8e\xb1\xdb\xec\x97\x67\x3c\x79\x6b\x0d\xc7\xd8\xad\xc5" + "\xfe\x61\x4c\xe7\x83\xff\x7f\x5f\xd7\xc9\xee\x38\x36\xb8\x31\xe5" + "\x1d\xcb\x06\x87\xb1\x3b\x26\x5c\xdd\x63\xca\xdb\x1b\x07\x87\xb1" + "\x3b\x16\x73\x8c\xdd\x5e\xc8\x31\x76\xc7\xbc\xcb\x33\xa6\xbc\x7d" + "\x1a\xc7\x98\xce\xe1\x1f\xc6\xee\xb0\x0c\xdd\xfa\xde\x94\xa9\x83" + "\x1b\x57\x86\x1f\x19\x1c\xc6\xc2\x33\xaf\xee\x71\x65\xf8\xcc\xc1" + "\x61\x2c\xfc\x30\xc7\xd8\x9d\x36\x8e\xb1\x70\xd3\xe5\x19\x57\xde" + "\xb9\x95\x63\xec\x4e\xff\xfc\x51\xc8\xa7\xf4\xf0\x7f\xb5\x64\x79" + "\xf2\x82\xa5\x4b\x16\x69\x97\x2c\x4f\x4a\x5c\xa9\x7d\x71\xc9\x9a" + "\xc5\xd3\x27\xaf\x0a\xd7\x26\xa6\x68\x13\x97\x2c\x7f\x5e\x4c\x58" + "\x34\x92\x3c\xb9\x78\xe9\x82\x14\x4c\x81\xdc\xcf\x2f\x5f\xb6\x78" + "\x79\x92\x36\x71\xf1\xca\x55\x4b\x12\x17\xe3\xff\x2f\x6a\x9f\x5b" + "\x91\x08\x09\x0b\x17\x2f\x49\x5e\xac\x7d\x76\xd5\x73\xcf\x2d\x4e" + "\x7c\x71\x24\x99\xb5\x6a\x69\xd2\x12\xfd\xd2\xc5\xda\x19\xb3\x1e" + "\x9c\x12\xfb\xc8\x53\xb1\x0f\x3c\x80\xc1\xc9\xdc\x62\x93\x85\x51" + "\xc3\xa6\xd9\x80\x39\x45\x83\xfc\xbe\xc9\x55\xa0\xc9\x31\x9e\xed" + "\x86\x16\xa2\xce\x4b\x24\x8a\xdc\x16\xa2\x34\xb6\x10\x95\xf6\x8f" + "\x24\x8a\xe6\x1e\xde\x51\xd0\x42\x42\x69\x41\x5c\x8d\x60\x94\x59" + "\xa9\x71\x78\x84\x35\xb0\xc9\x02\x69\x6a\x21\xb7\x49\x0d\xbf\x09" + "\x05\xda\x2a\xa8\x51\xb9\xb5\x4e\x7e\x6f\xbd\x35\xf0\x47\x53\xfa" + "\x19\x22\xa7\x23\xef\x4a\x7a\x57\xb0\xca\xf7\xe3\x4a\x0e\xb4\x9d" + "\xc8\xef\x36\xc0\x05\xa3\xe0\x08\x1d\x5c\x40\x99\x88\x19\x70\x2d" + "\x85\x2b\x09\xae\x1c\xb8\x8a\xe0\xda\x0a\x57\x19\x5c\x3b\xe0\xda" + "\x05\x97\x89\xc8\xef\x99\x06\xd7\x3c\xb8\x20\xef\x3d\xeb\x79\x39" + "\xf7\x14\xc2\xb5\x07\xae\x7a\xb8\x60\xb4\xf7\x4b\xc8\xff\xcb\x6a" + "\x22\xff\xd5\x6c\xb8\x37\xc2\x65\x83\x0b\xd2\x7f\xa5\x85\x0b\x7f" + "\x5f\xc4\xdf\xfd\xca\x4e\xe4\x91\x91\x04\xea\xd9\xff\x15\x19\x0b" + "\x17\x7c\x37\x32\x03\x2e\x0b\xa4\x41\x7d\xef\x2d\xea\xe3\x37\xb5" + "\xfd\x94\xe9\x08\xc9\xbc\xd1\xc2\x62\xe0\xc9\xef\x3e\x43\xb3\x48" + "\x00\xcd\xfd\xd1\xa4\xbf\x83\xc8\x9a\xe4\x77\x7f\x68\x5e\x8f\x72" + "\x46\x66\x65\x31\x1d\xe1\x19\x69\xd6\x9e\x77\xf7\x4e\x0b\xd1\x17" + "\x62\x4c\xb3\x81\xe1\xed\xee\x9d\xe2\xef\x6d\x16\x59\x70\x31\x8b" + "\x01\x97\xb7\x2f\x81\xa6\xc7\xbd\xce\x62\xbf\x01\x0d\xf1\x5c\x16" + "\xcd\xd9\x5b\x4f\x95\xbb\xe7\x61\x9f\x37\xad\x61\xf5\x32\xf2\xfe" + "\x05\xef\xa1\x6e\xd6\xa0\x38\x8c\x73\xa9\xc0\x67\x9a\xdb\x64\xe9" + "\x08\xda\x18\x81\xff\x5f\xdc\x12\x1b\x4f\x0d\x1b\xe3\x70\x9c\x6d" + "\x4a\xfb\x0f\x52\x07\xbf\xeb\x08\xda\x64\xd7\x3e\x19\x42\xeb\x78" + "\xd9\x72\x8b\x3c\x42\x2b\x95\xd5\x11\x14\x67\xa1\xc5\x45\x5a\x6a" + "\x04\x0c\x89\xe5\x01\x76\x2c\xd4\x50\x00\x7d\x2b\x22\x15\xd3\x69" + "\x49\x6c\x8a\xf4\x3f\xdc\x53\x68\xc1\xc6\x62\xbc\x87\x64\x12\x1b" + "\x7b\xce\x8a\x22\xfc\xae\x26\x28\xeb\x9a\xe5\xf7\xdc\x74\x77\x35" + "\x91\x99\x9e\xc4\x7a\x47\x34\xa7\x57\x53\x41\x9b\x16\x00\xdf\x8f" + "\x38\xdb\xf5\xdd\x71\x45\x1a\x8c\x91\x2a\xe4\x4d\x59\x8f\x31\xf8" + "\xf0\xb7\x58\xb7\xd7\xc6\x10\xc5\x1b\x1b\x89\x12\xdb\xd8\x9e\x77" + "\x8f\x46\x8a\x43\x87\xbf\x91\x43\xfe\xdf\x3f\x91\x4e\xdd\xca\x3e" + "\x4d\x59\x7b\xee\xce\xe1\x34\xbd\x27\xda\x22\x53\xa5\x62\x7e\xed" + "\xcd\x8c\x96\x46\xf1\xbd\x01\xf9\x89\xe5\x0b\xc6\x4d\xb3\xf1\x19" + "\xe3\xdc\x85\x00\x2a\xb5\x69\x93\x76\x71\x1a\x6d\x8c\xc3\x72\x30" + "\xbf\x50\x60\x84\xff\x23\xc2\x05\x68\xaf\x33\x8b\xe8\xb4\xcb\x49" + "\x54\x9d\xfc\x9e\x0f\x9d\xb9\x26\x1d\xbc\x87\x7e\x67\x0a\x87\xfc" + "\x7a\x46\x6f\xa3\xd1\x6a\x91\xdf\x53\x06\xef\xc2\xbb\x62\x5f\x72" + "\x3a\xcb\x84\x5c\xd3\x34\xa8\x53\xad\x45\x76\xcb\x7a\xa9\x0d\x4c" + "\xc6\xb9\xf2\x89\x3c\xbd\xa7\xda\x1a\x68\x9a\xd6\x99\x4c\xab\x37" + "\x9c\x20\x04\xbe\x49\x3b\x2e\xd0\x8a\xd4\xd9\xd4\x5e\xf0\xaf\x84" + "\x54\xc4\xd7\x92\xff\x9f\xbd\xf7\x81\x6f\xaa\xca\x16\x85\x57\x4e" + "\x53\x48\x6b\xff\x04\xac\x5a\xb5\x62\xc0\xaa\x41\xf9\x13\xb4\x6a" + "\xd5\x22\x55\x40\x8a\x02\xad\x50\xb0\x08\x42\x91\x02\x45\xfe\xc5" + "\x52\x21\x60\xa1\x25\xa2\x53\x4a\x5b\x3a\xd8\xc1\xaa\xa5\xad\x23" + "\xce\x30\xf3\x98\x3b\xcc\x3c\xe6\x5d\xe6\x7e\xfa\x8c\xb6\x32\x55" + "\xa1\x61\xe6\x3a\xbf\xd7\x7b\x3f\x66\x8c\xdc\x52\x2a\x16\xc8\xd8" + "\x40\x62\x9b\x64\x7f\x6b\xed\x7d\x4e\x73\x92\x26\x40\x19\xef\xbb" + "\x77\xfc\xac\x1e\x72\xce\xde\x6b\xaf\xbd\xf7\xfa\xb7\xd7\xda\x67" + "\x9f\xbd\x4b\x97\x40\xca\x35\xdb\x98\x33\xdb\x07\x89\xd7\x9c\x48" + "\x64\xc7\x72\x4e\xa0\x8d\xbe\x00\x25\xc7\x59\x57\x9b\xf9\x3d\x28" + "\x39\x05\x71\x5b\x56\x42\x52\x69\x0e\x73\x6e\x3d\xca\x3c\x76\xcb" + "\x09\x68\x73\xe1\x65\x3e\x86\x70\x7f\xc6\xeb\x3d\x28\xdd\x04\xda" + "\x59\x68\x4f\xb7\x5e\x80\xb8\x36\xf3\x05\x4c\x3b\x0b\x25\xf9\xcc" + "\x7b\xec\x28\xc1\x7d\x0c\xd9\x5e\x67\xe2\x96\xb3\xa0\x6d\x98\x47" + "\xdf\x96\xfd\x05\x1a\xb1\x2d\xbd\xf1\x43\x0c\xdf\x56\xe9\xf6\xf7" + "\x6c\x60\x5e\x77\xc5\x3d\xfb\x1d\x90\x61\x0a\xea\x0b\xb5\x99\xce" + "\x0d\xc5\xfe\x12\x8c\xbf\xaa\xaa\x7d\xb1\x97\xe4\xfc\x9e\x7a\xb4" + "\xc5\xa0\xe4\x53\x9e\x33\xbe\x0a\xe5\xe7\x9e\xd6\x6c\x2f\x73\x13" + "\x3c\xf5\x1b\x69\x94\x2e\xf7\x3f\x3d\xca\x0c\x5a\x77\xc5\xbd\x71" + "\x0e\xcd\x1d\xf9\x2a\x1e\x12\x4f\x86\x28\xf5\xc9\x30\x26\x87\x26" + "\x95\x9f\xbd\xe8\xe7\x79\xa6\x64\x82\xc5\x74\xe4\xff\xed\x07\x45" + "\xfb\xee\xd5\x53\x9a\x6c\x4b\x49\x56\x0c\x7e\xd2\xeb\xf2\xdf\x9b" + "\x7c\xf1\xbb\xf3\x99\xc4\xe8\x3c\x56\x0f\xeb\x49\x8e\x9b\xe5\x65" + "\x1e\x7f\x55\xa5\x13\xed\x65\x1c\x9d\x93\x2a\xe0\xef\xfd\x92\x55" + "\xcd\x07\xc3\x06\x7e\xff\x09\xd5\xe3\xdf\x9b\x9b\x43\xb6\x35\xfb" + "\x38\xc1\xcf\xcf\xa9\x2e\x42\xdb\x5b\xb5\x3b\x87\xf4\xd0\x1f\x5f" + "\xad\xfb\xf6\x8d\x5a\x20\xfd\x66\x28\x63\xac\x72\x7e\x00\x8f\x15" + "\xa2\xb1\x3d\x4d\x0c\xcb\xb3\xca\x4a\xa7\xcc\xfb\x1d\x42\x36\xef" + "\xad\x27\xbd\xc3\x76\xa5\x61\x7a\xf4\x49\x29\xcd\x48\xdf\x68\xe2" + "\xf3\x6a\x7e\x96\xa4\x94\x36\x56\xc8\xcc\xef\x4d\x41\xcf\x12\xd1" + "\x0f\x75\x12\xed\x80\xf0\x2f\xd2\x66\x06\xf4\x42\xc8\xb1\xd0\xef" + "\x2a\x6c\xd3\x84\x72\xbf\x35\xca\x8f\x70\x9a\x93\x82\x0e\x52\x6f" + "\x8c\xcd\xe4\xae\x48\xb3\x38\x34\x43\x0d\x41\xfc\xac\x38\x9c\x43" + "\xe7\x56\x62\x5b\xa2\x10\xe7\xbb\xf8\x3b\x14\x7f\x7f\xd1\x7c\x9c" + "\xc6\x5a\x8e\xf7\x1a\xba\x7f\xf3\x7a\xe6\x9c\x32\x13\xe8\x8c\x4a" + "\xa4\x7b\x9a\xcd\x01\xf9\x5a\xc2\x53\x41\x67\x77\x62\x1a\xc1\x60" + "\x7a\x3b\xa6\xbb\x04\x7e\x53\x89\x8b\x6c\x56\x30\x7e\x9f\xc0\x2f" + "\xf0\x12\x3e\x05\xf7\xde\x3d\xac\x5b\xe0\xbe\x2f\x45\xc1\x5d\x85" + "\x69\x0a\xfe\x29\x6b\x94\x3a\xee\xcb\xc0\xfc\x12\x75\x1f\xde\xd8" + "\xc3\x5c\x84\x03\xf3\xf2\x1c\x50\xc8\xed\xc7\x0e\x4c\xa3\xb2\x2a" + "\x99\x8a\x6a\xce\x41\x1c\x47\x39\x8e\x32\x07\xac\x28\x50\xdb\x0d" + "\xa4\x51\xbc\x62\x6b\x65\x5c\xfb\x14\x5c\x01\x3c\x8a\x4c\xb5\xe4" + "\xc9\x3c\x25\xbc\x71\x84\x17\xe1\x3f\x77\xc0\x73\x07\xd4\x7d\x97" + "\x6d\x67\x21\xc2\x68\x64\xf8\xdf\x91\x5d\x52\xda\x4d\x67\x77\xb2" + "\x8a\xb1\x07\x48\x37\xd0\x06\x02\xea\x92\xc3\x5d\x71\x7f\x4a\x88" + "\x0d\xd4\x12\x1c\xda\xcd\x2f\xf9\xd9\xa5\xd7\xb3\x2e\x84\xc9\x0c" + "\x3a\xaf\x53\x82\x47\x30\x2d\x57\x39\x37\xb4\x1a\x61\x1c\xd2\xb8" + "\x88\xfb\x22\x6e\x1d\x09\x92\xbd\xde\x41\x3e\x29\xc9\x55\x86\x3d" + "\xc5\x05\xf6\x7a\x3f\xf8\x1b\x72\xcb\x32\xb7\x32\x1b\xfa\x21\x7f" + "\xa4\xf3\x9e\x07\x37\xce\xdd\xcf\xcf\x7f\x64\xbd\xe8\xab\x95\xdc" + "\x03\x34\xb6\x9d\x93\xd2\x35\x76\xe7\x37\x5c\x2f\xce\x49\x0f\xf0" + "\xb1\xe0\x35\xf4\xed\xc8\xbf\x43\x9f\xba\xb0\x46\x12\x3e\x9e\x1f" + "\x61\x1b\x28\x9d\xfc\x3f\xf4\x3d\x1b\x55\x79\xac\x21\x37\x5d\xd0" + "\xee\x81\xdf\x13\x1d\x79\x7b\xbd\xd3\x6c\xd4\x66\x7f\x7d\x6e\x3a" + "\xf5\xa1\xd4\xc2\xfc\x76\xaf\xdb\x46\xe7\xe9\x1a\x36\x90\x6f\xfa" + "\xc0\x4f\xb2\xf7\x02\x43\xfd\x4d\x1f\x5c\x1f\x1e\xc8\xa7\x3a\xd1" + "\xff\x3e\xe7\xbc\x25\x37\x9d\xce\x4f\xde\xb5\x35\x5a\x37\xb9\x9e" + "\xd9\x7a\x46\xe4\x96\xb9\x2b\x1e\x38\xac\x9c\x4f\x3b\x48\xbc\x87" + "\x95\xbe\x37\xc8\x7d\xc7\x34\x3e\x67\x33\xbe\x8e\x9f\x8f\x4d\xcf" + "\xce\x48\xfc\x62\x95\x55\x85\x54\x16\xfb\x9e\xd9\xa8\xd0\xc9\xeb" + "\xa4\xb3\xc1\x87\x9d\x91\xd2\x5f\xc9\x2e\xb1\x01\xdf\x0b\xbf\xaa" + "\xaa\x70\x70\xed\x4a\xe7\xf3\xdf\x6d\xe8\xfb\x67\x7b\x3f\x60\xc2" + "\xf6\xa5\xff\x6a\x96\x8c\x8f\xf2\x14\x5e\x35\xc8\x3e\xf9\x55\xd4" + "\x11\x71\xfe\x53\xd5\x2f\xfd\xc0\x7e\x3d\xf8\xec\xd5\xf7\xeb\x41" + "\xe3\xc0\x7e\x3d\xf8\xca\x77\xdb\xaf\x07\x23\xbe\xff\x54\xf5\xcb" + "\x30\xb0\x5f\x0f\xdd\x77\xf5\xfd\x7a\x08\x06\xf6\xeb\xa1\x67\xbf" + "\xdb\x7e\x3d\x54\x70\x05\xfd\x32\x0d\xec\xd7\xc3\xf1\x7f\x47\xbf" + "\xda\x07\xf6\xeb\xe1\xfb\xbe\xdb\x7e\x3d\x1c\xf1\xfc\xb3\x88\xf6" + "\xb0\x7a\xf7\x41\x61\x0f\x1f\xfe\x72\xf0\xf6\xf0\xe1\x03\x03\xed" + "\xe1\xc4\x61\x01\x7b\x98\xe1\xbb\x2a\x7b\x58\x9d\x27\xfb\x13\x19" + "\x9f\x0c\xb0\x87\x95\x79\xce\xf0\xf6\x30\xe3\x5d\x6e\x0f\xab\xf2" + "\x9c\x83\xeb\x43\x86\xb9\xdf\x1e\xc6\xe7\x39\x83\xec\x61\xc2\xee" + "\x83\xee\x8a\x8c\xd6\xab\xb3\x87\x19\xad\x03\xed\x61\x86\x31\xd8" + "\x1e\x4e\x84\x4b\xc8\x61\x57\x38\x7b\x98\xed\x3d\xcf\x64\xd9\xe8" + "\x1a\x5c\x7b\x26\xe6\x5d\xa2\x2e\xf3\x65\xea\x32\x0f\xb2\xae\x96" + "\x88\x75\xe9\x7e\x9f\x83\x7e\x86\x7e\xcb\xdb\x20\x75\x96\x80\xd4" + "\x96\xd2\x0e\x76\x8b\x07\xc6\x99\x51\x26\xac\x90\xd1\x56\xdf\x0d" + "\x6d\x29\x9d\xc0\x62\x7e\x9f\xc3\x7e\x96\xeb\xcc\x2c\x22\xd9\x7c" + "\x64\x8b\xbd\xd8\x33\x48\xd9\x7c\x24\x4b\x91\xcd\x36\xef\x3d\xdc" + "\xe7\x3d\x27\x4d\xfa\x95\xbd\xfb\x8c\x2c\x9b\x93\xde\xe8\xe7\x8f" + "\x55\xc8\x67\x58\xd9\x44\x9d\x08\x96\xcd\xaa\x7c\x21\x9b\x93\x96" + "\x0d\x94\xcd\xaa\xfc\xf0\xb2\x39\xe9\x51\x21\x9b\x55\xf9\x83\xeb" + "\xc3\xa4\xb8\x80\x6c\x56\xe5\x07\xc9\xe6\x1d\xb9\xe8\xbf\x4d\x2a" + "\xb8\x3a\xd9\x9c\x54\xa0\xf4\x7d\xaf\xdc\x77\xa4\x57\x4b\xb0\x6c" + "\x4e\x8a\x78\xd6\x35\x9d\xbf\x8e\xf6\x30\xee\x8c\x94\xb9\xda\x87" + "\x7e\xab\xbf\xfc\x7c\x7b\xb6\x8f\xb9\xe9\x1c\x76\x26\xa5\x01\xdb" + "\x68\x8c\x73\x63\x4c\xe9\x76\x17\xea\x58\xec\xe1\xbf\xb2\xbe\x64" + "\xc0\xb6\x27\x32\xb7\x31\x01\x69\x96\x8a\xbf\xc3\xf7\x6e\x80\x24" + "\xbc\x92\xf7\xca\x74\xc5\x7b\x13\xdb\x98\x1c\x5b\xbd\x01\xc6\x24" + "\xba\x40\x87\x6d\xc8\x4b\xdc\xa6\x07\x8c\xf9\x93\xe8\x9e\x59\xdf" + "\x85\xc6\x8b\xa0\xa5\xf9\x44\x7f\x0c\xd6\x67\x49\x64\x6c\xbd\x11" + "\x1a\x8b\xb0\x3d\x12\x24\x37\x4a\xec\xa0\x6f\xa3\x51\x62\x09\xbb" + "\x57\xb1\x97\xf2\x78\x9b\xfc\xa9\x73\x4d\xec\x67\x78\x95\x16\x52" + "\xbd\x99\x74\x1e\x30\xbb\x63\x6e\x1a\x73\x27\xc7\x56\x5d\x84\x31" + "\x8d\x1b\x20\xb5\x61\x03\x18\x59\x9f\x51\x42\x1a\xe4\x2d\x7a\x41" + "\x4f\x7c\xcf\x63\x12\xd6\xb5\x01\xeb\x42\x5e\xfa\x76\x60\x5d\x5e" + "\xac\xeb\x3c\xd6\x75\x0e\xeb\xb2\x62\x5d\x56\x51\xd7\xe0\x68\x9e" + "\xd9\x7e\xa9\x79\xdf\xec\x2d\x23\x68\x7f\xda\xd3\x89\x96\xa1\x59" + "\x34\x07\xdc\xf3\x52\xe1\x20\xe5\xfd\xd1\xf4\x48\xf8\x77\xfd\x13" + "\xa4\x30\xdd\x57\xed\xb3\x5e\xf9\x82\x65\x7b\x01\x5e\xf9\x27\x18" + "\x43\x3a\xd7\xe6\x39\x8b\x7a\xf6\x55\xfb\xc7\xc6\xee\xc1\xd6\x15" + "\xf1\xfb\xd7\x0a\x2b\xa3\xf9\xe7\x7c\x16\xb7\xdb\xb2\xcb\xca\x2c" + "\x7d\x29\xb9\x39\xbd\x29\xb9\xe6\xc5\x5e\x3d\xca\x15\xb3\x18\x8a" + "\xc0\xd0\x29\x4d\xfb\xea\xd3\xcf\x71\x8c\x78\x06\x74\x27\xa5\x2c" + "\x43\xe9\xbf\xd1\xfc\xdd\x63\x69\xc1\xf3\x77\x8f\xe5\x81\x34\xb9" + "\x15\xa4\x29\xed\x20\x4d\xf5\x02\xc2\x05\x5f\xd3\x92\x05\xae\xc9" + "\xef\x66\xff\x62\x04\x6c\xf5\xb2\xd3\x18\x9f\x66\x55\x63\x0c\x9c" + "\x3d\x5a\xe3\xb0\x6d\xa0\x79\xad\xc9\x7b\x91\xa6\x5f\xe3\xb8\x94" + "\x88\xf7\x2b\x91\x77\x60\x2e\x82\x6b\xcf\x48\x93\x0b\xbd\x78\x9f" + "\xe8\x1a\x9a\xe5\x2b\xcd\x03\x6f\x72\x2d\xf4\x55\xee\xce\xf1\x61" + "\x1c\xeb\xd7\x9d\x6f\x2f\xfd\x0a\x52\xec\xdd\x3e\xa8\x47\xb9\x5b" + "\xec\xd3\x91\x3e\xe4\xd9\x9e\xfb\x14\x3a\x8b\x41\x2a\xbd\x00\xf1" + "\xac\xc7\x18\xa7\xc8\xf5\xcc\xee\x44\xcf\x96\x6e\xe6\x27\xf9\xa6" + "\xf9\x05\xcc\x4b\xd8\x7a\x01\xc7\x5a\x67\x17\xd4\x63\x2c\xed\x5b" + "\x5f\x38\xdc\xd9\x53\x78\xed\x5b\x7e\x48\x4a\x70\x81\xbe\xfe\x1b" + "\x94\xc1\xf5\x28\x7f\xdf\xa0\x9c\x3b\x85\x9c\xd3\xf7\x37\x0d\x24" + "\xe3\xaf\xda\x52\x1b\xbf\x11\x32\xce\xe5\x8e\x64\x7c\x1d\xca\xdd" + "\xda\x80\xdc\x79\x7b\x50\xc6\x2b\x1e\x4d\xae\xb7\x32\xd8\xb2\x12" + "\xa4\xc6\x33\x43\x29\x4f\x13\x3d\x5a\x32\x7c\x9a\xe3\x81\x40\x1c" + "\x96\x35\xb2\xf7\x96\x5c\xb3\x61\x36\x3b\x7f\x52\x9a\x5c\x8b\xe9" + "\x3a\xc3\xbc\x3b\xf5\x48\xef\x91\x62\x7e\x26\xcb\x40\xb1\xbb\x03" + "\x69\x41\x74\xc1\x38\xfa\xce\x93\xd2\x63\x2b\x89\x8e\x1b\xf7\x43" + "\x94\xf9\x11\xd6\x81\x34\x33\x33\x3e\xa7\xf1\x58\x21\x9f\xa7\xde" + "\x66\x80\xcf\xf8\x7c\xa2\x28\xe3\x43\xba\x79\xe3\xe6\x03\xf2\xbb" + "\xd0\xf6\x7c\x2f\xd7\x39\xa2\x63\xe7\x6a\x90\x16\x77\x23\xad\x7c" + "\x48\x2b\x37\xb7\x05\x39\xdc\x16\x94\x1f\x6e\x2f\x71\x30\x7f\x76" + "\x41\x14\xdb\xfa\x02\xbd\xcf\xf0\xc1\x22\x33\xb0\x2d\x67\x91\x5e" + "\xae\x76\xb2\x1b\x09\xfe\x8d\xc2\x36\x10\xbd\xe2\xbb\x41\xcf\x2a" + "\xbe\x3e\xfe\x4f\x5b\x5b\xa3\x7d\x28\xbf\x64\x1f\x12\xb7\x69\x62" + "\x50\x2f\x13\x2a\x49\x7f\x51\x9f\x13\xb7\x71\x7b\x95\x57\x8f\x7a" + "\xeb\xdd\x68\x1c\xd5\xb7\xd1\x68\xc0\x6b\x84\x62\x43\xe8\x1c\xad" + "\xbd\x44\xdb\x8a\x47\xcb\xc8\x7e\xd8\x2d\x0e\xf0\x22\x6d\x13\x68" + "\xbc\xd9\x68\x4c\xe1\x34\x5e\x61\x84\xf1\x1e\xd0\x60\x9b\xf4\xd8" + "\x5e\x68\x5c\x0e\xba\x63\x85\x27\xc1\x87\xba\xa1\xd0\x7d\xe6\x4a" + "\x03\x20\x5e\xe9\x63\xe3\x9f\x41\xa6\x99\x26\xb2\xdc\x4d\xbd\x10" + "\x90\xbb\xa9\x17\x88\x76\x42\xee\xa6\xba\xbe\x8f\x72\xf7\x59\x1e" + "\x97\xbb\xa8\xbe\x5b\xb8\x3c\x99\xed\xde\xdf\x22\x8d\xa6\x3a\x48" + "\x46\x48\x66\x3e\xf9\x25\xc9\xcc\x34\xdd\x7f\x57\x99\xf9\xd6\x6d" + "\x34\xe0\xf5\x9f\x22\x33\x88\x97\xcb\x0c\xd1\xea\xb3\xbc\x5e\x50" + "\x68\xc4\x75\xb5\xfc\xab\x76\x43\x29\x4c\x42\x5d\x35\x24\x6e\x1b" + "\x01\xc7\x38\x9d\xb2\x0c\x86\x79\xcc\x7f\x52\x9a\xf6\x68\xe9\x1f" + "\x41\xdf\x6b\x65\xcc\xee\xfd\x15\xd2\xab\x5a\xc7\xe7\xb3\x2b\xe7" + "\xe7\xd0\xbb\x11\x7a\x2f\x42\x73\x74\x89\x66\xd0\xd2\x5c\xb9\xaf" + "\xea\xb5\x1c\x7a\x3f\xc2\xe2\x75\x4d\x3e\xd4\x6b\xff\x8e\x4f\x0e" + "\xfa\xe3\x35\xe8\x23\x4c\x2b\x77\x40\x4b\x2a\x9f\x93\xaf\xdc\x4d" + "\xbe\x0b\xd9\x5f\xbe\xde\x9b\xde\x9d\x60\xfe\x7e\x65\xce\x9f\x6c" + "\x82\x3c\x2f\x27\xcf\xdb\x4d\x23\x1e\xc6\xd2\xbc\x9d\xb0\x29\xd3" + "\xde\x50\xe6\xed\x94\x67\xca\x77\x48\xd3\xea\x69\xce\x27\x50\x2e" + "\x2b\x59\x86\x93\xcb\x3d\x76\x0b\xd9\xfa\x40\x39\xf1\x8c\x76\x25" + "\xb9\x4f\x02\x5d\x58\x1f\x23\xee\xb5\x1c\xd4\x1f\x6d\xa7\x34\xfd" + "\x16\xfc\x95\x90\x2e\xbf\xc7\xdf\x28\xfc\xe5\xe7\xb6\x0d\x6e\xbc" + "\xca\xe2\xdf\xbf\x62\xff\xeb\x65\xdb\x38\x97\xeb\xe4\x5d\x10\x7f" + "\x46\xbe\x77\x57\x64\x1d\x54\xde\x5d\xf4\xc3\x07\xf8\x33\x83\xea" + "\x46\x1e\x69\xc5\xfb\x14\xf1\xac\xc2\x37\x93\x3f\x83\x36\x85\x55" + "\xcf\xd7\xd3\x7b\x4f\x94\x5f\x8d\x9b\x15\x3e\x22\xff\x4e\xe4\xef" + "\x5f\x90\x47\xe4\xaf\xc9\xf6\x37\x57\xd4\x3b\xdd\x88\xe3\x69\x87" + "\xba\xde\x70\xf4\x70\x48\xd3\x23\x9e\x69\x33\x38\x5a\x4c\xcf\x8f" + "\x84\x67\xaa\xd1\xc7\x06\x89\x2b\xe2\xf7\x8f\x2c\x25\xd7\x94\xbd" + "\xdf\x67\xf3\xf7\xe5\x25\x7e\x5c\x72\x76\x90\xfe\xc5\x13\x11\xf7" + "\x7f\xf2\xc5\x55\x1b\xbc\xf5\xb9\x24\xfb\x71\x6d\xfb\xbd\xf0\x8b" + "\x33\x5d\x52\xf6\xe8\x11\x10\xdf\x01\x7a\xf2\x9f\x66\x76\x7f\xc0" + "\xc8\x87\xaa\x3e\x03\xa9\xbd\xe7\xf3\x12\xfb\xd0\x17\xdc\x79\x06" + "\x32\xfc\x2b\x92\x63\x2b\x97\x83\xb6\x17\xfd\xd5\xde\x15\x85\x89" + "\x9f\x9d\xe8\x02\xd4\x13\x53\x9b\xcb\x01\x0d\x08\xcb\x4e\xe7\x25" + "\x4c\xcf\x67\x9e\xa3\xf9\xbb\x21\xdb\xe8\xb3\x6d\xfd\x12\xe2\xd1" + "\x16\xe9\xed\x96\x5f\xf1\x77\x0a\xd1\x9b\x24\x83\xdd\x7b\x0a\xaa" + "\x96\xa3\x0d\x43\x9b\x55\x3a\x1f\x6d\xb5\xf7\x02\xbc\xa5\xb6\xd5" + "\xcf\xff\x34\x60\xab\xcf\xa3\xad\xae\x40\x5b\x5d\x9a\x0c\x6d\x66" + "\x1b\xa0\xed\x18\x3a\xcb\x9c\xe8\xd9\x6a\x46\x9b\xbd\x09\x6d\xb6" + "\xe5\x14\x70\x7b\xdd\xdd\x05\x68\x6b\x13\xf6\xae\x85\xa4\xbe\x75" + "\x68\xb3\xcf\x17\x5e\xfb\xc6\x56\x61\xb3\xdf\x5c\x8b\x36\x7b\x1d" + "\xfa\xc4\x6b\xd1\x66\x77\x87\xb1\xd9\xe7\x22\xf8\xc3\xb2\xfd\xe9" + "\x5d\x67\x94\xde\x94\x18\xbc\x34\x1f\xa4\x37\xfe\x7d\xe8\x20\xe5" + "\xe4\xc9\xf2\x48\x3c\x20\x7a\x13\xfd\xfd\xc8\x87\x63\xc8\x03\xee" + "\xb7\x7a\x86\x66\xf5\xe1\x98\xe6\x4b\xd8\x61\xfe\xe5\x99\x76\x29" + "\xa1\x18\xf4\xb3\xcc\x1f\xb0\xde\xf5\x79\xe8\xf7\xe7\xc5\x7b\x2b" + "\xab\x0d\x95\xe8\x53\xfb\xd0\xf7\xee\x73\x27\xeb\x90\x06\x7a\xe7" + "\xc6\xc2\x44\xa2\xa1\xff\x16\xe4\xe7\x90\x71\x63\xd0\x86\xa6\xed" + "\x5d\x0e\xe9\x7d\x55\x3b\xea\x59\xd5\x8e\x1a\x5f\xd5\x8e\x5a\x2c" + "\x9b\xf0\xa4\x83\xf8\xf2\x2f\x80\x69\x07\x59\x75\xa5\xd9\x17\x5f" + "\x6d\x70\xc6\xef\xa0\xf3\x9c\xf7\x53\xfe\xd6\x25\x10\x9f\x6d\xfc" + "\xd6\x26\xf8\xf5\x2e\x10\x9f\x04\xbf\xfe\x02\x55\x18\xf7\xd1\x98" + "\xcb\xc7\x57\x99\x67\x18\x2f\x70\x7f\x3f\xc0\xb7\x90\x31\x56\xe6" + "\xdb\xb1\x6e\x1b\xe0\x78\x32\xb4\x7f\xac\xe5\x7c\xfb\x0b\x28\xe3" + "\x2c\xd2\x3b\x61\x2f\x8e\xb5\x7d\xdf\xd5\x58\x2b\xc7\x31\x34\xd6" + "\xd2\x38\x4b\x7c\x7b\x73\xd0\x7c\x9b\x99\x79\x95\x7c\x73\x5e\x25" + "\xdf\xb6\x07\xf8\x56\x91\xc2\xaa\x2a\xf4\xbe\xaa\x8a\xa4\x60\xbe" + "\x55\x98\x02\x7c\xab\x48\xc6\x67\x63\x80\x6f\x17\x06\xc1\xb7\xe8" + "\x6f\xbe\xbf\x7c\x9b\xe5\xb9\x3a\xbe\x55\x5c\xad\xbe\x9d\x50\xf1" + "\x0d\xf5\xad\x02\xf5\xad\x22\x44\xdf\x2a\x54\xfa\x56\x81\xfa\x56" + "\xa1\xd2\xb7\xb3\x83\xe0\xdb\x35\x27\xbf\xbf\x7c\xcb\x39\x78\x95" + "\x7c\xbb\x4a\x7d\x1b\x9f\x16\xe0\xdb\x4e\xd4\xb7\x9d\xa8\x6f\x3b" + "\x43\xf4\x6d\xa7\x4a\xdf\x76\xa2\xbe\xed\x54\xe9\xdb\x5f\x06\xc1" + "\xb7\x61\x7f\xfa\xfe\xf2\x6d\x76\xe1\xd5\xf1\x6d\xe7\x55\xea\xdb" + "\xf8\x4a\x15\xdf\x50\xdf\x76\xa2\xbe\xed\x0c\xd1\xb7\x9d\x2a\x7d" + "\xdb\x89\xfa\xb6\x53\xa5\x6f\xef\x0f\x82\x6f\xf7\x57\x7c\x7f\xf9" + "\x96\x6b\xb8\x4a\xbe\x5d\xad\xbe\x75\x04\xf8\x56\x89\xfa\x56\x89" + "\xfa\x56\x19\xa2\x6f\x95\x2a\x7d\xab\x44\x7d\xab\x54\xe9\xdb\x96" + "\x41\xf0\x6d\xc1\x63\xdf\x5f\xbe\xcd\x8d\x38\xff\xa9\xf0\x4d\xe1" + "\x19\xf1\x8f\xf3\x8d\xe5\x81\x17\xfd\xc9\xff\xf1\x9c\xe0\x1b\xf1" + "\x8b\xf3\xae\x27\x2f\xb1\x4a\xe6\x99\x57\xe6\x19\xd1\x8f\xf8\x46" + "\x7e\x24\xe7\x9b\x46\x9b\x44\x3e\xa4\x17\x7d\x49\xc5\x8f\x7c\xa2" + "\x90\x79\x8e\x15\xfe\xb4\xdf\x8f\xf4\x86\xfa\x91\x2b\xd5\x7e\xe4" + "\xaf\x82\xf8\x55\x79\x11\xf9\x25\xc9\xfc\x7a\x36\x82\x1f\xb9\xfc" + "\xa3\x08\xfc\x3a\x7e\x59\x7e\x21\x6f\x92\xfa\x7a\x04\xbf\xde\x94" + "\xfd\xff\xfa\xa2\xbf\x93\x5f\xeb\x91\x5f\xe4\xff\xff\x05\xa4\xb7" + "\x16\x0d\x96\x5f\x4f\x5f\xd6\xff\x0f\xcf\xaf\x0a\xe7\xe0\xf8\x35" + "\x3e\x2d\xc0\xaf\x9d\x7a\x2f\x8e\x69\xca\x78\x16\xe0\x97\x18\xcf" + "\xbc\xa1\xe3\xd9\x4a\xf5\x78\x76\x25\xfc\x0a\x19\xcf\xbe\x57\xfc" + "\x9a\x1f\x71\xfe\xdf\x87\xb1\xb8\x0f\xed\x1c\xcd\x57\x26\x74\x61" + "\x9c\xec\x65\xa7\x67\xb9\x30\x4e\xf6\x0e\xcd\xda\xb5\x16\x52\xfb" + "\x36\x62\x9c\x8c\xbc\xab\x5c\x0b\x19\x15\x6b\x41\xeb\x5f\x85\xb1" + "\xf2\x19\x8c\x95\xd1\x3e\xf5\x7e\x5d\x98\x78\x34\xdf\x09\x7e\x8c" + "\x95\x69\x1e\x0c\xdb\x9b\xca\xbe\xc6\x58\xb9\x03\x6d\x5f\xc7\x9b" + "\x22\x56\x3e\xa5\xc4\xca\xbf\x0b\x8a\x95\x77\x3e\x2f\xc7\xca\x32" + "\xfd\xeb\xd5\xb4\x7f\xe6\x97\x11\x62\xe5\xd6\xcb\xc6\xca\x14\x23" + "\xbf\x45\xf1\xf2\xf9\xc2\xe1\x6f\xc8\xb6\xed\xcd\x73\x7f\x67\xac" + "\x7c\x1e\x63\x65\xab\xa0\xfd\x9b\x83\xa6\xfd\x33\x11\xd7\x7f\x90" + "\x6e\x90\xbe\xf4\x8f\x45\x48\x67\x65\x0c\xea\xc3\x31\x88\xe6\x33" + "\x7a\x2b\x77\x14\xa3\xbc\x72\xfd\xe0\x63\xd2\xc6\x64\x1d\xe9\x06" + "\xe9\x09\xe9\x06\x1f\x8b\xd0\x0e\xb2\x21\xa6\x8c\x86\xe7\x21\xbd" + "\xf1\x79\x48\xf3\xc6\x07\xc7\xc8\x4f\x14\x10\x3f\x02\xb6\xcd\x1f" + "\x6a\xdb\x96\xa9\x6d\xdb\xef\x06\x8e\x45\x97\xb3\x6d\xcf\x47\xd2" + "\x95\xd6\xcb\xea\x0a\xe9\x08\x1f\x8f\x50\x5f\xfe\x33\x74\xe5\xcd" + "\xbf\x0e\x96\x5f\x0b\x23\xae\xff\xb8\x42\x7e\xb9\xae\x80\x5f\x4e" + "\xe4\x57\x4d\x80\x5f\xc1\xb1\x71\x80\x5f\x22\x36\xf6\x87\xc6\xc6" + "\xcb\xd4\xb1\xf1\x95\xf0\x2b\x34\x36\xfe\x3e\xf1\x6b\x51\xc4\x75" + "\x7e\x57\xc6\xaf\x8a\x2b\xd0\xaf\x0a\xd2\xaf\x0e\x15\xbf\x82\x62" + "\x62\x15\xbf\x54\xfa\xa5\x8a\x89\x97\xa9\x63\xe2\x2b\xe1\x57\x68" + "\x4c\xfc\x7d\xe2\xd7\xe2\x88\xeb\x3f\xae\x90\x5f\x57\xa0\x5f\x15" + "\xa8\x5f\x13\xd2\x03\xfc\x0a\x8e\x85\x03\xfc\xda\xa9\xd2\x2f\x95" + "\xef\xb0\x4c\xed\x3b\x5c\x09\xbf\x42\x63\xe1\xef\x13\xbf\x96\x14" + "\xff\x7d\xfc\xda\x79\x05\xfa\xb5\x13\xf5\x6b\x42\xa5\x8a\x5f\x41" + "\x31\xb0\x8a\x5f\x2a\xfd\x52\xc5\xc0\xcb\xd4\x31\xf0\x95\xf0\x2b" + "\x34\x06\xfe\x3e\xf1\x6b\x69\xea\xdf\xc9\xaf\x2b\xd0\xaf\x9d\xa4" + "\x5f\x8e\x00\xbf\x82\x63\xdf\x00\xbf\x2a\x55\xfa\xa5\x8a\x7d\x97" + "\xa9\x63\xdf\x2b\xe1\x57\x68\xec\xfb\x7d\xe2\x57\xc1\xe7\x97\x8a" + "\xa5\xd4\x31\x94\xb7\x34\xc0\x2f\xe2\x4d\x1f\xc6\x4e\x7d\x71\x3b" + "\x8a\x23\xc7\x4f\xa6\x8c\x48\xf1\x2e\xed\x07\xf3\x44\x17\x7d\x13" + "\x22\x7c\x42\x16\xe2\x13\x1e\x2b\xfc\x25\x04\xc7\xbc\xef\x0f\x88" + "\xa1\xfa\x94\x39\x8a\x25\x91\x62\xde\x7f\xb9\xea\x18\x8a\xf8\x44" + "\x71\x94\x77\x3d\xf2\x49\xf6\xe3\xdf\xfa\x3b\xe7\x28\xfa\x7a\x8c" + "\xd2\x5b\xe8\xc7\x97\x2c\xc1\x18\xea\xb9\xc1\xf2\x69\x79\xc4\xef" + "\xbf\x69\x9e\x88\x62\x5e\x8a\xa5\xe8\xbd\x63\x5b\x47\x17\x54\x6c" + "\x00\x3d\x7f\xf7\xd8\x15\xfc\xee\x71\x57\x27\xc6\x54\xeb\x90\x6f" + "\x7d\x79\x50\xdd\x09\x19\x95\xcf\x8b\x98\x4a\x89\xa7\xda\x5c\x1e" + "\xfe\xee\xd1\xee\x75\xc0\x74\x07\xf3\x34\x22\x3c\xc5\x51\x47\xf3" + "\xdf\x04\xd2\x95\xd2\x2f\x21\x9e\x78\x80\x31\x18\xe7\x87\x3a\x86" + "\x6a\x50\xbf\x6f\x5c\x1e\x29\x86\xba\xfc\xfb\xc6\xfa\x73\x22\x7e" + "\xe2\xef\x1b\xff\x5b\xc4\x50\x2b\x22\xbe\xff\x98\xf9\x0b\x31\xdf" + "\x40\xb4\xb7\x1b\xbd\x80\xf2\x74\x3a\xb1\x5b\xcc\xeb\x79\xab\x77" + "\x98\x29\xa6\xa5\x78\xd6\x6e\x69\x85\x8a\xcd\xa0\xef\x75\xe7\x25" + "\x62\x8c\x1a\xef\x45\x5b\xb7\xf3\x8c\xa0\xfd\x96\xb3\xa0\x77\xae" + "\x2a\xe4\x6b\x65\x28\x96\x25\x5d\xe1\xef\x1c\x9f\x83\xb4\xfa\x93" + "\x90\xce\xf5\x03\xf5\xc2\x5b\x55\x6d\xf0\xc7\xef\xa8\x25\x3d\x99" + "\x7e\x82\x79\x88\x07\xa4\x1f\x9f\x9d\x20\xde\xfc\x0a\x4a\xff\x22" + "\x78\xc3\xf9\x22\x05\xbf\x0b\x1e\xa8\x1b\x7f\x8a\xc0\x9f\xc3\x57" + "\xc6\x9f\x75\xc1\xfc\xd9\x7b\xb5\xef\x83\x95\xf5\x91\xeb\x8c\xd2" + "\x5e\xf9\x7d\xf0\x9b\xcf\x0c\x96\x3f\x2b\xeb\xae\x92\x3f\xce\xab" + "\xe3\x4f\x85\x9e\xbf\x5b\x0c\xe2\x4f\x85\x51\xf0\xa7\x22\x89\x62" + "\xa5\x00\x7f\x2e\x5c\x21\x7f\x42\x62\xa4\xef\x15\x7f\x56\x45\x9c" + "\xff\xb9\x34\x7f\x2a\xae\x52\x7f\x2a\x6a\xf8\x3b\xc4\x60\xfe\xc8" + "\xfa\x53\x51\x4b\xb1\x51\x80\x3f\x67\xaf\x90\x3f\x21\x31\xd1\xf7" + "\x8a\x3f\xab\x23\xce\x7f\x5f\x86\x3f\x57\xa9\x3f\x3b\xf5\xfc\x5d" + "\x61\x10\x7f\x76\xca\xfa\xb3\x33\x89\x62\xa1\x00\x7f\xfe\x72\x85" + "\xfc\x09\x9d\x3f\xfd\x3e\xf1\x67\xad\xe5\xea\xf8\xb3\xf3\x2a\xf5" + "\x67\x67\x0d\x7f\x27\x18\xcc\x1f\x59\x7f\x76\xd6\x52\xec\x13\xe0" + "\xcf\xfb\x57\xc8\x9f\x90\x98\xe7\x7b\xc5\x1f\x73\xc4\xfd\x9f\x2e" + "\xc3\x9f\xab\xd4\x9f\x4a\x3d\x7f\xf7\x17\xc4\x9f\x4a\x59\x7f\x2a" + "\x93\x28\xd6\x09\xf0\x67\xcb\x15\xf2\x27\x24\xc6\xf9\x5e\xf1\xe7" + "\x85\xc3\x97\x7b\x5f\xa4\xf8\xce\xea\xf7\xb2\x7d\xe8\xbf\x91\xff" + "\x4c\xbe\x73\x9b\xeb\x30\x78\xd7\x09\xde\x54\x5c\x04\x7d\xa5\xcc" + "\x1b\xfe\x4e\x76\x95\x78\x27\xcb\xfd\xb6\x57\xc7\x8d\x61\xdb\xb4" + "\x49\xe4\x97\xf1\xf7\xae\xfc\xdd\xc4\xc7\x94\xb7\xbf\x4f\xe5\xbf" + "\x51\x8c\x8a\xbe\x37\x50\x9c\x5a\x7a\x6a\x10\x7e\xdb\x73\x91\xf8" + "\x72\xf9\x77\x13\xf5\xaa\x75\x7c\x4a\xec\xf9\x9d\xf2\x65\xd0\xef" + "\x5d\xd7\x47\xdc\xff\xf1\xd2\x7c\xa9\x70\x0e\x8e\x2f\x38\xde\xbc" + "\x3a\x3e\x4d\xf0\xe5\x2f\x21\x7c\xd9\x69\xec\x53\x8d\x3b\x57\xce" + "\x97\x90\xf1\xe6\x7b\xc5\x97\xe2\xae\x88\xb1\x26\xda\x25\xe2\x09" + "\xad\xef\xde\xf5\x1c\xa4\x56\x9c\x84\x8c\xbe\xaf\x93\x63\x67\xa1" + "\x9d\xeb\x5b\x95\xac\x6b\x43\x1b\xb7\xd5\xc5\x4e\x27\xb8\x86\x66" + "\x7d\xfa\xb9\x13\xda\xf2\x1d\xd0\xbb\x31\x0f\xaa\xce\xd0\x5a\xf5" + "\xc3\xb0\xa3\x88\x62\xf9\xdf\xc2\x67\x27\xbe\x81\x59\xfb\x59\x9f" + "\xbd\xfb\x30\xd8\x36\xff\x16\xd8\x2a\x63\x6c\x23\xc2\x2c\x46\x1a" + "\x9e\x93\x5e\x6c\xfa\x16\xe3\xd1\xf1\x16\xd0\xcf\xe8\x66\x9e\xb6" + "\xee\x4f\xe1\x2d\xac\xeb\x63\x1c\x05\x89\xbe\xc4\x93\xaa\xe7\x29" + "\xfe\x7c\x5f\xf0\xe4\x29\xc1\x93\x37\x55\xf1\xa7\x01\xf3\x3b\xcd" + "\xc8\x8f\xbf\x85\xf0\xe3\x44\x17\x20\x7d\x87\xce\x72\x21\x3f\x5c" + "\x0a\x3f\xce\xc2\xd6\x17\x88\x1f\x8e\xfe\xf5\xae\xbd\x32\x3f\xea" + "\xc9\x7e\x99\x41\xff\x86\x12\x7f\x9e\x53\xf1\x43\xf9\x26\x4b\xcd" + "\x0f\x25\xf6\xdf\x68\xa4\xef\xb4\xfa\xe3\xcf\x6f\x31\xfe\x7c\x03" + "\xe3\xcf\xd2\x3f\x82\xf4\xc6\xd6\xc1\xf2\x63\x43\xc4\xf1\x5f\xe1" + "\x05\x8d\x2d\x7d\x09\x3b\xcc\xc4\x07\xbb\xe5\x20\x10\x4f\x68\x3c" + "\xf1\x7d\x9d\xac\x2b\x29\x46\xdd\x71\x0c\xcd\xea\x65\x18\xf3\x63" + "\xbc\x6f\x5f\xf8\xef\x40\x73\x06\x82\x07\x7d\x7d\x76\xe7\x61\x20" + "\xda\xdb\x36\xff\x3b\xe7\xc3\x39\x69\xa3\x61\x91\x0b\xa4\x71\x28" + "\x87\x18\xef\xeb\x17\xd3\x77\xb9\x68\xdb\xde\x5a\x0e\xe9\x33\xcc" + "\xcc\x43\xb1\x29\xe9\x10\xad\x3d\x21\xbb\xd6\x66\xfe\x08\x68\x5e" + "\xa7\x2f\xbe\xda\xf0\x71\x31\x00\xd9\x37\xa2\x7b\xf4\x8b\x01\x3e" + "\xd1\x7a\x12\xce\xab\xb9\x57\xb0\xce\x55\xcd\xaf\x85\x8e\x2b\x5a" + "\x9f\xdc\x2b\xcf\x17\xd4\x2b\x73\x6a\x57\x3b\x5f\xa0\xcc\xa9\x9d" + "\x17\xeb\x49\x4a\xff\x8c\xfa\x33\x68\x7e\x59\x8c\x57\xc8\x2f\xe7" + "\xe0\xf9\xe5\x0e\xc3\x2f\xcb\xf1\x81\xfc\xaa\xd0\xab\xf8\xb5\x3d" + "\xc0\xaf\x0a\xa3\xe0\x57\x45\x52\x80\x5f\x15\xc9\x97\xe7\xd7\x25" + "\xd6\xb7\xfe\xc3\xf3\x6b\x53\xc4\xf8\x27\x98\x5f\x15\x57\xa1\x5f" + "\xe7\xc3\xf0\x6b\x73\x59\x18\x7e\xa9\xf5\xeb\x84\x8a\x5f\xb2\x7e" + "\x55\xa8\xf4\xab\xe2\x0a\xf4\xeb\x12\xeb\x5a\xff\xe1\xf9\xf5\x52" + "\xc4\xf5\x3f\x21\xfc\xba\x0a\xfd\xfa\x22\x0c\xbf\x4a\x4c\x03\xf9" + "\xb5\x53\xa5\x5f\xe8\x5b\xf4\xf3\x6b\xa7\xac\x5f\x3b\x55\xfa\xb5" + "\xf3\x0a\xf4\xeb\x12\xeb\x59\xff\xe1\xf9\xb5\xe5\x92\xeb\x7f\x02" + "\xfc\xda\x79\x15\xfa\xf5\x41\x18\x7e\x6d\x71\x84\xe1\x97\x4a\xbf" + "\xc6\x57\xaa\xf8\x25\xeb\xd7\x4e\x95\x7e\xed\xbc\x02\xfd\xba\xc4" + "\x3a\xd6\x7f\x78\x7e\x6d\x8d\xe8\xff\x85\xf0\xeb\x2a\xf4\xab\x34" + "\x0c\xbf\x4a\x6b\x06\xf2\xab\x52\xad\x5f\x1d\x01\x7e\x55\xca\xfa" + "\x55\xa9\xd2\xaf\xca\x2b\xd0\xaf\x4b\xac\x5f\xfd\x87\xe7\x57\x59" + "\xc4\xf9\x6f\x35\xbf\x7a\xab\x15\xff\x70\x7f\x30\xbf\xd0\x5f\x4f" + "\xec\x10\xb1\x95\xc2\xaf\xc8\xbe\xe1\xb6\x8c\x7e\x5e\x9d\x0a\xf8" + "\x86\x9c\x4f\xf2\x7b\x0a\xe2\x0f\xf9\x88\xe4\x13\xf6\x56\x09\x1e" + "\xd1\x3b\xc0\x4b\xfa\x85\x57\xf2\xfd\xd3\x55\xf0\x49\x89\xab\xbe" + "\x73\x3e\xfd\xdb\xd5\xf0\xc9\x1a\xf1\xfb\xa7\x60\x3e\x29\xe3\xd6" + "\x95\xf2\x29\xdc\x98\x65\xed\x18\xc8\xa7\x9d\xfa\x00\x9f\xc4\x38" + "\x45\x63\x17\x8d\x55\xc1\x7c\xba\xc4\x78\x75\x25\xdf\x5f\xfc\xc3" + "\xf3\xe9\xe5\xc8\xf6\x4f\xe2\x67\x9b\x1f\xac\x91\xfc\x87\xf1\xb2" + "\xe1\xd5\x8a\x69\xd1\x98\x76\x9c\xca\xd4\xc8\x79\xbe\x0a\xa0\xef" + "\xb4\x6d\x89\x9a\x7c\xda\x4f\x97\x60\x86\x28\x30\x89\xdb\x20\x13" + "\xfb\x23\xe0\x24\x28\xc3\x74\x5b\xfc\xb6\xcc\x21\x08\xdf\xca\x2a" + "\xa6\xe7\x63\xda\x50\x82\x65\xdb\xb4\x7c\x5e\x31\x51\xc3\xf7\xbe" + "\x91\xe1\x35\x40\xf0\x04\x8b\x70\x3a\x19\x2e\x85\x7f\x13\x2c\x49" + "\xd0\x38\xb0\x6d\x31\x32\x0c\xed\x9d\x67\x50\xb7\x31\x5e\x93\xc9" + "\x71\xc9\x70\xb1\x3e\xeb\x49\x7a\x3e\xee\xdb\xa6\x4d\x55\xc3\xb1" + "\xc7\x80\xf0\x2a\x70\xd7\xc8\xf8\x8c\x41\xfd\x1d\x05\x10\xbf\xcd" + "\xc0\xf1\xc5\x77\x4b\x20\xb7\x2f\x8e\xc5\x66\xa5\x71\x78\x8d\x76" + "\x4c\x10\xfc\x10\x50\xf7\x23\x9e\x0d\xb9\x37\x55\x86\x33\xf9\x25" + "\x30\x11\x2c\xa6\x6b\xd5\xb4\x96\x61\x13\x14\x3a\x22\xaf\xb5\xea" + "\xfe\xfa\xb0\xff\x7b\x45\x1b\x13\x7d\xaf\xde\x93\x26\xf7\x25\x5d" + "\x5d\x2f\xc1\x61\xb9\x09\x32\x4f\xf4\xd8\x8f\x8c\x7e\x7c\x95\xf3" + "\xb3\x14\xb8\x52\x1f\xdc\x88\x3c\xb2\xd9\x0b\x01\xe4\x7e\x0f\x43" + "\xde\xb8\xe4\xbe\x67\x06\xd3\x51\xe3\x50\xe8\x88\x30\xfb\x11\x76" + "\x38\xc2\x4c\x51\xf0\xfa\xac\xfc\x9b\x7d\xd1\x6f\xab\xf7\x5a\x92" + "\x8b\x63\x28\x61\x0d\xa2\x3f\xd7\xca\x38\xb3\x44\x9f\xf5\xb0\xb7" + "\x9f\xd7\x5a\xca\xb3\xc9\x70\x49\xbc\x3f\xb1\xf3\x0c\x3e\x8d\x76" + "\xc6\x40\x58\x9d\x1a\xf6\x3a\x01\xfb\xe4\x71\x84\xcd\x19\x08\xab" + "\x57\xc3\x5e\x2f\x60\x67\x96\x23\x6c\xee\x40\x58\xef\x70\x15\xec" + "\x0d\x02\x36\x3b\x13\x61\xf3\x06\xc2\x1a\xd4\xb0\xc9\x02\xf6\x69" + "\x6a\xc3\xc2\x81\xb0\x99\x6a\xd8\x1b\x05\x6c\x8e\x07\x61\xf3\x07" + "\xc2\x96\xa9\x61\x6f\x12\xb0\xb3\x0f\x22\x6c\x41\x28\x6c\x23\x97" + "\x03\x18\x25\xcb\xc1\xcd\x02\x36\xb7\x10\x61\x0b\xc3\xf4\x2d\x8a" + "\xe3\x15\xb0\x29\x02\xf6\x89\x19\x08\xbb\x3a\x0c\x2f\xd4\xb0\xb7" + "\x08\xd8\x65\x29\x08\x6b\x0e\xc3\x0b\x35\xec\x08\x01\xfb\x8c\x17" + "\x61\x8b\xc3\xf0\x42\x0d\x7b\xab\x80\x5d\x78\x00\x61\x2d\x61\xe8" + "\x1b\x80\x8d\x5d\xb4\x10\x61\x4a\x90\x26\xc7\xc3\xd0\x56\x8d\x73" + "\xa4\xc0\x99\x1f\x87\xf0\x65\x61\x68\xab\x86\x1d\x25\x60\x97\xbc" + "\x87\xb0\xdb\x07\xc2\x82\x66\xaf\xa0\xef\x3d\x32\x7d\x6f\x13\xf0" + "\x4b\x57\x23\x7c\x79\x18\xfa\x52\xbe\x4d\xd6\xb5\x54\x01\x3b\xbf" + "\x0c\x61\x2b\xc3\xd0\x57\x0d\x7b\xbb\x80\x2d\x02\x84\xad\x09\x43" + "\x5f\x35\xec\x1d\x02\xb6\x90\x64\xb2\x36\x0c\x7d\xd5\xb0\x77\x0a" + "\xd8\x95\x0e\x84\xad\x0b\xd3\xde\x51\x2a\x58\xa3\x80\x5d\x45\xed" + "\xad\x0f\xc3\x0b\x35\xec\x68\x01\xbb\xbe\x0e\x61\x9b\xc2\xf0\x43" + "\x0d\x7b\x97\x80\x5d\x43\x7a\xbc\x2f\x0c\x3f\xd4\xb0\x77\xb3\xd8" + "\xb5\x36\xd9\x2e\xee\x0f\x85\x45\xde\x0b\x9b\x68\x85\x31\x2c\xd6" + "\x9c\x8f\xf7\x04\xc7\xf7\x3d\xe8\xc7\x67\xf5\xde\x4b\xf6\x46\xb6" + "\x61\x63\x59\xec\xf2\x16\x19\xdf\xc1\x01\x75\x5b\xb5\x6a\xd8\x71" + "\x2c\xb6\xcc\x21\xc3\x1e\x1a\x08\xab\x53\xc3\x8e\x67\xb1\x1b\x94" + "\x76\x1e\x1e\x08\xab\xef\x87\x65\xb1\x16\x33\xc2\xbc\xd7\x20\xdb" + "\x46\x55\x3b\xef\x51\xe1\x9b\xc0\x62\x37\x1b\x64\x7c\xb6\x81\xf8" + "\x0c\x6a\xd8\x7b\x58\xac\xb5\x5c\x86\x6d\x19\x08\x9b\xa9\x86\xbd" + "\x97\xc5\xbe\x74\x5c\x86\x6d\x1d\x08\x5b\xa6\x86\x4d\x63\xb1\x5b" + "\xca\x64\xd8\xa3\x03\x68\x4f\x7a\x60\x45\x5f\x40\xd8\xa4\xfb\x58" + "\x6c\xa9\x49\x86\x0d\xf2\x03\x54\xe3\xf0\xfd\x82\xef\x2f\x9a\x90" + "\xef\x7c\xcd\x1d\xda\xfc\xf6\x70\x3e\x86\xf9\x2e\xb8\xe6\x8c\x54" + "\x79\x42\x8c\x49\xca\xde\xf4\x55\x5c\x56\xfc\xf5\xb9\x39\xd9\x2e" + "\xe6\x55\xa7\xed\x92\xd8\xf1\xf1\x2e\xd0\xf2\xfd\x8e\xe3\x77\x5b" + "\x1c\x98\xee\xbc\x25\xd7\xec\xae\xa8\xec\x72\x68\xc6\xf2\x3d\x69" + "\xf1\xde\xe5\x80\x55\x47\xe9\x7e\x97\x95\x79\x68\xcf\x5b\x5f\xf5" + "\x7c\xbd\xdd\xdf\x4d\x7b\x5f\x79\x10\x87\xa7\xd3\x0c\x51\x86\x22" + "\xa0\x77\x2d\xbd\x76\x4b\x37\x20\xfe\x07\xd9\xba\xc2\x0c\x6c\x03" + "\xed\x8d\x52\x70\x12\x9f\x79\x1b\xd0\x07\xc2\xb1\x72\x8c\xad\x88" + "\xf6\x13\xaa\x5a\xe9\x8c\x7f\xcd\xc4\x5e\x5e\xd0\x65\xde\x0a\xb7" + "\x9e\x91\xaa\xb8\x9d\xe5\x7b\x8b\x9c\x2f\x7c\xc4\x1f\x3f\x7f\x0c" + "\xed\x39\xc2\xea\x6a\xf5\x62\x3f\x92\xaa\x77\x79\x9b\xad\xec\x38" + "\x4b\xc9\xcd\xf4\xf7\x6e\x2f\xa3\xb3\x0f\x6c\x5b\xcf\xc0\x49\x55" + "\x9e\xf3\xc6\x5a\xbe\x57\x09\xf6\x29\x33\xec\x1e\x1e\x56\x48\x64" + "\x55\xf3\xb3\xdc\x15\x55\x47\x1d\xd2\x76\xa3\xe8\x63\x55\xbb\x43" + "\x33\x64\x8a\x7c\xdf\xe1\xd0\xe8\x9c\xf2\xbd\xd3\xa1\xb9\xad\x45" + "\xbe\xf7\x2a\x7b\xa9\x84\xdf\xdb\x65\x7e\x0a\xf6\x2d\xcd\xff\x56" + "\x9e\x8e\xfc\x4b\xda\x67\x8d\xc5\xcf\x4f\x31\x8c\xa0\x33\x2d\xaa" + "\x6b\xb1\xce\x34\xb1\x3f\x66\xf5\x7c\xfc\x4d\x94\x7f\x9d\xf2\x2f" + "\x23\x18\xce\xb7\x94\x5c\x1b\xab\xac\xd2\x51\xdf\xb6\xfa\x98\x1f" + "\xf1\xe6\xb1\xf2\x66\x8b\xdd\xd2\x05\x62\x5f\xe9\xea\x57\xf8\x3e" + "\x37\x44\x3b\xa4\x2f\x8b\x69\xb6\xf0\xba\xaa\x5e\x33\xa9\xdb\x65" + "\x9a\x70\xcf\xbd\x69\xf7\xdd\xff\x40\xfa\x83\x4b\x9e\x5b\x5a\xb0" + "\x6c\xf9\x8a\xc2\x95\xcf\xaf\x5a\xbd\x66\xed\x3a\xf3\x0b\x45\xeb" + "\x8b\x5f\xdc\xb0\xd1\xb2\x69\x33\x6d\xda\xd2\xdf\xfe\xb7\xa6\x68" + "\x5c\x12\x60\x1d\x8f\x51\x1d\x7c\x7f\x27\x4a\x13\xb4\xaf\xee\xd0" + "\x1a\xc2\xfb\xb5\x76\xf4\x34\x69\x8f\xe5\x6e\x69\xd7\xa3\xb4\xdf" + "\x33\xf2\x58\x63\xaf\x9f\x66\xa3\x3d\xf8\x3b\xa4\x5d\x69\x6d\xce" + "\x69\x36\x3a\x03\xa2\x39\xb9\x0b\x52\x47\xd1\x3e\xfd\xbb\x0c\x94" + "\xdf\x78\x07\x40\x0b\x96\x0d\x87\x73\x94\x1e\x92\x5f\xbb\x9e\x39" + "\x6b\xaf\x67\xdd\x84\xbf\x76\x0f\xeb\x72\xbe\x54\x08\xd5\xf8\x8c" + "\x72\xa6\xef\x94\x76\x5d\x68\x4e\xe1\x7b\x99\xa7\x34\xec\x61\x1d" + "\xdb\xaf\x67\x1d\x2f\xef\x61\xdd\x8d\xd7\x33\x47\x6a\x2d\xc4\xb9" + "\x2b\x76\xed\x77\x48\xbb\xf8\x1e\x82\xbb\x30\xdf\x1f\x5b\xdd\xb4" + "\x0b\xf3\xc6\x7b\x21\xaa\x11\x9f\x31\xcd\xd5\x6c\x10\xed\xfe\xf5" + "\x37\x9e\x68\xc4\x57\xc9\xfa\x56\x6b\xaa\xb1\x1e\xc1\xa3\x9a\x1b" + "\x5b\x70\x14\xc5\xfa\x9c\x76\xcf\x49\x70\x48\x35\xc9\x8d\x17\x79" + "\x7d\x89\xf6\xba\x6e\x20\x7c\xff\x54\xe4\x89\x5e\x7f\x13\xf3\x62" + "\x59\x8f\xff\xa5\xd5\x1a\xac\xef\x73\xc4\xed\x52\xf7\xc7\xb8\x7c" + "\x4d\xb1\x61\xed\x8b\xab\x57\x8f\x8e\x05\x23\xff\x0d\x3a\x3f\xa2" + "\x18\xf1\xc1\x6b\x7b\x58\x0b\xf6\xd3\x86\xfd\x6d\x3d\x86\xde\x33" + "\xca\x0b\x60\x9f\x6a\xb0\x0d\x6b\x30\xfd\x3d\xbc\x7f\x0f\xdb\xde" + "\x2a\xce\x1c\x78\xfb\x0d\x56\x51\x93\x8a\xed\x6c\xa5\x3d\x6a\x69" + "\xef\xa9\x9e\x8d\xb9\x1a\xec\x77\x2d\xc2\xb5\x1a\x6e\x82\xdb\xb1" + "\xdc\x05\x6c\xc7\x3e\xbc\x27\xf8\xb7\x89\x8f\x08\xdf\x22\xfa\xf5" + "\x36\xdf\x67\x08\x69\x65\xdb\x7b\x3d\xab\x74\x57\xd4\x1c\xa7\xbd" + "\xe9\xf8\x9e\xdd\xf8\x8c\x74\x69\x45\xd8\x9a\x9e\xd2\x5c\x0d\xc6" + "\x52\x9a\xc6\x00\xce\x26\x6a\x13\xb5\x83\xe2\xb9\xcf\xd0\x7b\xf2" + "\xf7\xe5\xc1\x58\x0f\x68\x3e\xeb\x00\xa8\xdf\xc3\x9a\xf0\xaa\xc7" + "\xab\xee\x53\xcc\xfb\x04\xaf\x56\x4c\x3f\x8a\xbf\x9f\xe2\xef\x27" + "\x1d\xfc\xfd\x5b\x32\xb5\x7b\x7d\x09\xeb\x1a\x5f\x07\xb7\x11\x7e" + "\x94\xad\xa7\x4f\x4a\x4d\x4e\x6a\x3b\xed\x03\xc9\x62\x7f\x5c\x10" + "\xbc\x5f\xde\xee\x76\xc0\x7c\xfc\xed\x16\xbf\xea\xeb\xb5\x34\xbc" + "\x72\xe5\xfb\x7a\x84\x69\x91\xef\x0f\xe2\xf5\xde\xe5\xaf\x50\x7c" + "\x91\xae\x5a\xe3\x95\xc3\x5e\xc9\xf5\x76\xc1\x95\xc1\xfd\xc4\x01" + "\x52\x1d\x46\x96\x75\xe6\xe0\xf4\xba\x2c\x91\xb6\x37\x49\x3c\xef" + "\x35\xc8\xbf\x33\xf0\x42\x3a\x35\x20\xfe\x86\x72\x91\xd6\x50\x8b" + "\xbf\x27\xf0\xea\x0a\xae\xff\x6d\x2c\xff\x76\x09\xf1\xb3\x8f\xce" + "\x3f\x40\x5e\x3a\xa4\x1f\xa7\x11\x8f\x76\x09\xd9\xd2\xf8\x19\x4f" + "\x33\xa1\x6c\xd5\x07\xe4\xe7\xb5\xdb\x83\xe5\xe7\x35\x7d\x88\xfc" + "\xd4\x90\x2d\x42\x7d\x29\x69\x14\xf2\xf2\x5e\xcf\x4b\x05\xf8\xfc" + "\x5a\x12\xe2\x79\xcf\xb0\x88\xe3\xe0\xfe\xde\xae\x33\x18\xf7\x15" + "\x82\x96\xec\x4b\xb7\xf4\xda\x32\x92\x59\xaa\x5b\xae\x57\xb4\x05" + "\xdb\x87\x69\x4d\xd4\xbe\x75\x88\x17\x9f\xf7\x21\x5c\x93\x1d\xbe" + "\x51\xda\xc6\xcb\x54\x3c\x8f\xf2\x28\xb7\x97\x70\x52\x39\x16\xe8" + "\x97\x89\xca\x88\xba\x6b\x6f\xc4\x74\x8a\x13\xa1\xf4\x6f\x10\x45" + "\x6b\x95\x49\x26\xe9\xd7\xee\x35\xa1\x2e\x65\x81\xdf\x9d\x07\x18" + "\xea\x9b\x50\xdf\x62\x4e\x4a\xaf\x79\xc7\x95\x80\x89\xf0\x91\x4d" + "\xc7\x7e\xd8\x1a\x49\x17\x05\x2e\xf9\xfc\xdf\x1f\x9b\x3e\x35\x03" + "\xaf\xa7\x81\xda\x83\xf9\xaa\x7a\x6b\x29\x0e\xdc\xb5\x59\xf4\x15" + "\xeb\xda\x87\xe5\x0f\x52\xdf\x89\x9e\x98\x7f\x18\xf1\xe4\x51\x1e" + "\xdf\x4b\x5b\xf4\x67\x1f\xed\xb7\x4a\xf4\x20\x78\x3a\xd3\x44\xec" + "\xbf\x57\xb3\x85\xd3\x0d\xcb\x13\x3f\x18\xd6\x41\x38\x4a\xbd\xcc" + "\xcb\xd0\x1e\xbd\xb3\xd9\x83\xe3\xfa\x4f\xfe\x18\xcc\x9f\xda\x83" + "\x6a\xfe\x60\xb9\x83\x58\xbe\x85\x61\x1f\xc9\x9e\x60\x9d\x89\x74" + "\x8e\x02\xa6\xd5\xf8\x2b\x10\xc7\x06\x0f\x9f\x1b\x41\x3c\x1f\x62" + "\x5b\x6a\x08\x0f\xb6\xa7\x45\xc6\xe5\xfd\xb0\x24\x98\xd7\x32\xbe" + "\x7d\xc4\x73\xae\xcf\x9b\x79\x9f\xd0\x76\xfd\xe4\xc7\x0d\x22\xef" + "\x30\xc2\x1c\x66\x7d\x59\x40\xfb\x97\x8a\xb1\x84\xe7\x1d\x2a\xfd" + "\x96\xf3\xb7\x45\xd8\xb5\x9f\xfc\x66\xfd\x16\xd6\x15\x68\xf7\x4f" + "\x0a\x95\x3d\x60\xe5\x76\x1f\xa2\xfa\xd8\xc6\x85\x7c\x5c\xa5\x3a" + "\xa8\xbc\x8c\x6f\x0a\xe1\x53\x68\x35\x0e\xdb\x21\xe8\x55\x6b\xc1" + "\xf4\x7d\x24\x8b\x9c\x6e\x68\x47\x7b\x4a\x49\x16\x7f\xb2\x1a\xcb" + "\xbf\x57\x4d\xcf\x1b\xf9\x33\x70\x1b\xdb\x9f\x5f\x7b\x88\xf2\xed" + "\x18\x67\xef\x5a\x85\xb2\xe4\x07\xb8\x2d\x09\x4c\x2e\x2b\xef\xdb" + "\x01\xd7\x4b\x53\x34\xcd\x5e\x00\x6a\x27\xd2\xe8\xb0\xbb\x62\x4f" + "\x12\xda\xfe\x5c\x6a\x2b\xda\xeb\x43\xec\x9d\x3c\xa0\x36\xa3\x3d" + "\x93\xdb\xb7\xe7\x15\x99\xf7\x87\xa8\x8f\x44\xcf\x71\xc2\xf6\x61" + "\x5e\xdd\x68\x6a\x7b\xa0\xdf\x7b\xf2\xd5\x34\xe6\xfd\x46\x3e\x10" + "\xbf\x88\x2f\x2a\x9c\x24\xfb\x35\x88\xeb\x80\x78\x16\xb2\x41\xb4" + "\xae\xb9\x9e\x1d\x25\xf8\x00\xec\xeb\x7c\x7f\xbb\xad\x58\xf7\x78" + "\x33\x8e\xe9\xa8\x17\xb4\x8f\x2f\xe2\x3d\x40\xe7\xd5\x20\x8e\xc3" + "\x44\x53\x84\x3b\x4b\xf2\x88\xcf\x47\xe5\x3a\xe8\x5c\x87\x31\x78" + "\x65\x04\xf4\xff\xf5\xbf\x04\xcb\xd7\xeb\xa1\xfa\x4f\xfc\xae\xf1" + "\x97\x66\x01\x97\x87\x22\x30\x9c\x93\x5e\xdf\x24\x8f\x1d\x32\xaf" + "\x5f\x3f\xd6\x8c\xfa\xa2\xc2\x91\x1b\xc2\xeb\xc3\x5c\x1e\x37\xce" + "\xa0\xf3\x7e\x35\x58\xf6\xb0\x8c\x87\xf7\x99\xcb\x93\x95\xcb\xc0" + "\x51\xb6\x11\xfb\xd9\x2f\x07\x7b\x0e\xca\x7c\x3e\x1a\x42\x13\xb9" + "\xed\xbb\xbd\x74\xde\x02\xd9\x24\xf4\x31\x1f\x71\xf7\x05\xec\x12" + "\xf1\xde\xcf\x79\xff\x7a\x5e\xa3\x18\x6f\x65\xbb\xf5\xba\xc8\xbf" + "\x3e\x48\x86\xa9\x2d\x55\x5c\x7e\xa9\x2d\xa5\x0b\xa9\x2d\x87\x79" + "\x3b\x4a\x0d\x70\x4e\xaa\xe3\x36\x0d\xcb\xd6\xc8\xfa\x2a\xe3\xda" + "\x53\x40\xb8\x5e\x46\x5b\x45\x6d\x72\x48\xbb\x9d\xdc\xfe\x3d\xce" + "\xe5\x60\x99\xdc\xf6\x56\x8f\x95\xca\xbe\x96\xf7\xad\xc4\xcb\xb6" + "\x22\xdc\x51\x8f\xd8\x93\x39\x16\xcb\xef\x37\x3c\x47\xf0\xf5\x2d" + "\x64\xa3\x0d\xcf\xf0\xfb\x5f\x19\xe6\xa1\xac\x9e\x01\x2d\xe2\xd3" + "\x91\x8c\x2a\x72\xd1\x2d\xd5\xef\x25\x7f\x1d\x69\x7d\x00\x7d\xa4" + "\xfd\x44\x6f\x92\x65\xf4\x91\xd2\xdc\x15\x75\x47\x15\xb9\xc5\x7a" + "\xea\x89\xf6\x82\x3f\x6f\x0c\x43\x39\x3e\x1c\x90\xad\x37\x86\xc9" + "\x74\xdc\x8f\x74\xd4\x61\x7d\x3f\x96\xfb\xb5\x1f\xe1\xd1\x17\xab" + "\xdf\x26\xb7\xbd\x4e\x86\x1f\xab\xf0\x41\xd6\xd5\xa3\xd5\x64\x7f" + "\x39\x0f\xde\x68\x91\xcb\xee\x93\xeb\xfa\x58\x81\x25\x1f\x51\xec" + "\xb5\xfe\xc6\xc7\x64\x07\xc7\x23\xef\xb9\xed\xe3\x67\x39\x89\x34" + "\xd2\x1d\x51\x47\xfd\x1a\x2e\x87\xe8\xf7\x04\xe4\xe8\x8d\xfa\x10" + "\xfb\x44\xb6\xb8\xa6\x0d\x71\x90\x3d\x25\x59\x22\x9b\x4a\xf1\x02" + "\xe2\x2b\x96\xf5\x47\x6e\xf3\x9b\x31\xc1\xb2\x52\x3f\x1f\x65\x65" + "\xac\x0a\xb7\x27\xdc\x38\xd7\x28\x6c\x60\xbd\x28\xf3\xe6\x74\xb9" + "\x6f\x07\x44\xdf\xe4\x67\xa2\xdb\x56\x4e\xb7\x78\x15\x1d\x91\x6e" + "\x6f\x6d\x92\xe1\x0f\x93\x2d\x0f\xe8\xeb\x9b\xbf\x53\x74\x79\xa0" + "\xbd\x78\x6b\x25\xe9\x43\xa0\x5d\x6f\xd6\x84\xd8\x8b\xc3\xe1\xed" + "\xc5\x9b\xf9\x72\x7f\x9b\x42\x74\x63\x9f\xec\xef\x6e\x51\xf8\xd0" + "\xe6\xea\x95\xf7\x15\xaf\xd9\x42\xf6\x93\xea\x56\x8f\x41\x0d\x82" + "\xae\xb2\x2e\xbf\x35\x77\x20\x1f\xde\x4a\x55\xeb\x33\xf1\x9a\x6c" + "\x02\xe1\x20\x9e\x72\xbf\x12\xd3\x04\x5f\xdf\xf4\x92\x6d\x50\xdb" + "\x68\x84\xad\xf5\x33\xd2\x97\xb7\x8c\xc1\xba\xf8\x66\xad\xac\x8b" + "\x4a\xdd\xdf\x22\x8f\x4c\xaa\x7a\xeb\x43\xea\x25\xde\xb4\x10\x1d" + "\x44\x1f\xdf\x3a\xa5\x8c\x69\x04\x8f\x65\x2d\x58\xe6\x78\xc8\xf8" + "\x58\x43\xed\xc3\xba\xb2\xb8\xcd\xda\xc3\x6d\x85\xc5\x2d\xda\xf3" + "\x79\xa3\x3c\x4e\x60\x9a\x49\x4e\x6b\x92\xc7\x12\x45\x6e\xa6\x06" + "\xb7\xa9\xde\x14\xde\x3f\x7a\x33\x4b\xf1\x8f\x38\x2e\x6e\x8b\xea" + "\xd3\xe4\xfe\x51\xda\x58\x91\xf6\x86\x97\xd2\xaa\x05\x1d\x6a\x19" + "\x1f\xaf\xde\x68\x92\xc7\x2b\xd2\x2f\x09\x9f\xf5\xa4\x63\xf4\x8c" + "\x38\xca\x09\xbf\xbd\xac\x97\xc6\xb4\x3a\x87\x54\x77\x80\xec\x01" + "\xd9\x0b\xc3\x72\x61\x37\x0c\xb3\xf8\xef\x9f\xc9\xee\x90\x1f\x42" + "\xf9\x08\x57\x4f\xb6\x08\xd3\xbf\x32\x3c\x81\x7e\xc1\xd7\x3a\xc4" + "\x5b\x7f\x54\x2e\xeb\xe3\xbe\xc2\xd7\x59\x51\x4a\x9a\x52\x0e\xed" + "\xd6\xaf\xa8\x1c\x95\x57\xec\x17\xd9\x2e\x2f\xd9\x26\x5e\xdf\xde" + "\x47\x65\x19\xe7\x71\x83\xe2\x17\xf5\x49\x2a\x58\xda\xdb\x99\xdb" + "\xb4\xbd\x95\xc2\x9e\xed\xdd\x42\x65\x39\xff\xd0\x56\x6e\xfd\x96" + "\x7d\xd9\x58\x04\xda\x86\x6f\xc8\x2e\xd6\x94\x88\x76\xee\x6d\x17" + "\xfd\xd8\xfb\x36\xef\x87\xb0\xa9\x35\xa2\x2d\x35\x25\x0d\xbd\x3c" + "\xef\x7d\xea\x0b\xe5\xed\x52\xe5\xb1\x3e\x23\xe5\xfd\x1b\x6f\x57" + "\x48\x39\x7f\x5f\xe1\x00\xf8\x46\x71\x66\x96\xae\x61\x8f\x62\x7b" + "\x1b\xf2\x44\x3b\x1b\xae\x53\xec\x2e\xd2\x65\x1f\xd9\x5e\x9e\xb7" + "\x5c\x86\x99\x25\xff\x72\xfb\xde\x30\x55\xd0\x35\x59\x92\xe9\x7d" + "\x40\xf4\xa3\x61\x3e\x8f\xb3\xbf\xce\x43\xda\x36\x64\x28\xb4\x55" + "\xdf\x93\xfe\x60\xfd\xc4\x63\x61\x57\x4a\x78\x0c\x5b\x4f\x30\xd4" + "\x26\x31\x46\xec\x4d\x0b\xf5\xa9\x3b\xa5\xa6\x3f\xd2\xb8\x24\x7c" + "\xd5\xa6\xdf\xc8\xf3\x2f\x60\x2b\xfa\x29\x8e\x0b\x0d\x5e\xc5\xc6" + "\x30\x77\x16\xc6\xfc\x27\xa9\x8d\xfc\x5c\x0b\xda\x0f\x58\x0d\x43" + "\xf6\xe9\xd7\xbd\x0e\x19\x67\x43\xbb\x62\x37\xc8\x96\xb4\xb9\x4e" + "\xca\x3e\x5d\x63\x79\x83\x6c\x4b\xce\x49\x8d\x3b\x82\xfd\xb0\xc6" + "\x1d\xc1\x36\xa3\x69\x6f\xa8\xcd\x40\xbf\x79\xbb\xbb\xa2\x71\x61" + "\x90\x1f\x80\x69\x97\xb6\x1d\x8d\x26\xd2\x51\x3a\x63\x81\xdb\x27" + "\x3e\xa7\xd4\xf8\x37\xa5\xcd\x64\x37\x7b\x5e\x52\xe6\x2f\x9a\xaa" + "\xc8\x57\x0b\xa9\xef\x68\x90\xed\xa4\xfa\x14\x7c\x5a\xa0\x3d\xfa" + "\x91\x0e\x34\xdf\xd2\x58\x2f\xdb\xf9\xa6\x20\x5b\x29\x8f\x61\x64" + "\x27\x83\xc7\xaa\x9a\x2d\xc1\x63\x55\xd3\xa6\x81\x36\xb2\x29\xeb" + "\xca\xc7\xaa\x26\x03\xd9\x2d\xc5\x46\x06\xdb\x82\xa6\x19\x0d\x41" + "\xbe\x6c\xe3\xe7\x8a\x2f\x1b\xb0\xa3\x8d\x05\x64\xa3\xb0\xfe\xc3" + "\x72\xdd\xe8\x7b\x54\xb7\x2a\x75\xa3\x1c\x79\xdb\x0c\x28\x9b\x15" + "\x35\x26\xbc\xdf\x2f\xfb\x80\x5c\x37\x7b\xf9\x3e\xe9\x7b\x9d\x28" + "\x7f\xb1\x24\x67\xb6\xb5\xdf\x40\x47\x60\xac\x68\xe9\x59\xa7\xd0" + "\xf7\xed\xb9\x6a\xbf\x70\xef\x1e\x56\xee\xae\x78\x7b\x8c\xba\x8f" + "\x55\x98\xb6\x4b\x9e\x43\xe0\xb4\xe5\xb8\xde\xe6\xf1\x82\xba\x6f" + "\xa2\x1f\x6f\xa7\x51\x3f\x28\x26\xc2\xfa\x5d\xe4\xf7\xa0\xcf\x87" + "\xf7\x75\x96\xc6\x7e\x99\xdf\x7d\xf4\x5b\xab\xda\xbf\xaa\xf9\x9c" + "\x6c\xa5\x1c\x7b\xb6\xa2\xbf\x53\xa3\x9e\x8b\x99\x39\x39\xc7\x60" + "\x2e\x5a\xb9\xb6\x78\xf9\x3d\x86\x95\x6b\x57\x16\xaf\x5c\xb2\x7a" + "\xe5\xe6\x25\xc5\x2b\xd7\xad\x1d\xb3\x66\xc9\x8a\x95\x4b\x0d\x1b" + "\x97\xac\x37\x98\x2c\xb7\x5b\x62\x21\x00\xfa\x90\x61\xc9\xfa\xf5" + "\x2f\xae\x59\x56\x60\x58\xbb\x72\xe9\xd8\xa2\x65\xeb\x97\x15\x1b" + "\x96\x14\xad\x7b\x71\x6d\x81\xe1\xf6\x82\x71\xb7\x9b\xee\x2f\x88" + "\x55\xcf\xa1\x8d\xd2\x43\xb7\xff\xe2\x57\x5d\xbb\x2e\x82\x2e\x51" + "\x63\x2e\x4a\xb4\xac\x5c\x2b\xe6\xec\x7e\xba\x77\x7c\x2d\x98\xe9" + "\x1c\x45\x3a\x2f\x8c\x55\xbc\x7d\x10\x7f\xb5\x04\x87\xfd\x34\xd0" + "\x39\x8a\xd8\xf6\x14\x77\xc5\x4f\xf3\x1d\xd2\xcf\xb2\xf8\x59\x60" + "\x98\x8e\x7d\x4b\x61\x17\x3f\xe9\x42\x9f\xcd\x4c\x6b\x82\x1b\x2f" + "\x42\x52\xcd\x06\xd0\xe2\x15\x87\x97\x9e\xce\x59\xc4\x32\xb5\x0e" + "\xe9\x1d\xf9\x2c\xbd\x77\xd2\x9c\x31\x1f\x1a\x59\xf9\x87\x46\xc1" + "\x97\x77\x26\x28\xf3\xbc\xd9\xaf\x40\x36\xc9\xe7\x49\xe9\x1d\xfe" + "\x8e\xf4\x65\x94\x65\x9a\x2f\xed\xf9\xdf\x8f\x65\xa2\x3f\x78\xc2" + "\x76\x13\xcf\x9b\xe0\x92\x20\x0e\xdb\xa5\x6d\x2e\x31\xc1\x6b\x58" + "\xd7\xfa\x64\xc6\xb0\x0e\x8f\x32\x9f\x86\x7d\xd0\x63\x5f\xda\xe5" + "\x7e\xfc\xbf\xbc\x1f\x7b\x58\x6a\xed\x70\x6c\xdf\x6e\x6a\xcf\x3b" + "\xa9\x4a\x1f\xb0\xdd\xed\x0e\xe9\xa7\xe5\xd8\x4e\x3d\xb5\x2b\xdc" + "\x5c\x1f\xcd\x77\x61\x3b\xd7\xf8\x37\x20\xdd\x46\x88\x33\x22\x76" + "\x35\x08\xfd\xc3\xfe\xec\x6b\xc4\xfb\xea\x6f\x20\xae\x8a\xce\xf0" + "\xb3\xde\xca\x8e\xb9\xbc\x60\x2f\x6c\x87\xc4\x4d\xcc\xc9\xfe\xd7" + "\x57\x5d\x72\x9f\xea\xc8\x36\xfc\xcf\xe7\xdb\xb5\xd4\x27\x1c\x2b" + "\xe2\x1a\xbf\x89\x38\xb7\xa8\x7d\xed\x7a\xe6\x62\x6f\xa9\x7d\xae" + "\x7d\xfc\x6c\x6f\xf2\xb7\x7a\xac\x74\x26\xdc\x3b\x5d\x58\x77\xa6" + "\xec\x1b\xbb\x58\xdf\x42\x95\x2f\xf5\x0e\xc9\x99\x2b\x02\x6e\x9d" + "\x82\x9b\xce\x06\xa4\x32\x82\xff\xfb\xd6\x60\x19\x67\x00\xff\xbe" + "\xac\x50\xfc\x84\x13\xef\x9d\x4a\x3d\x22\x0e\xdf\x47\x3e\x81\x13" + "\x65\xd9\x19\xa1\xbe\xd4\xdd\x7b\xd8\xe7\x76\x4c\xdf\xf5\x2d\x68" + "\x11\x16\x7d\x14\x8e\x7f\x3f\xd2\x3d\x8e\xf0\xbf\x7c\x3d\xc0\x76" + "\x84\xe9\xa9\x78\x27\xd3\xc5\xcf\xe9\xdb\x87\xfa\x5f\x93\x1e\x3a" + "\x8f\x2d\xcb\xf3\x43\x21\xf2\x9c\xb9\x9b\x7c\xc2\x5a\xc4\x8f\x32" + "\xb4\xeb\x02\x8e\xc3\xf8\x3c\xae\x16\x8c\x54\x0f\xde\x1f\xa7\xf9" + "\x10\x77\xc5\xbb\xc9\x4a\x7d\x0c\xe5\xbf\xda\x2f\xe6\x60\x64\xd9" + "\x1a\x43\x73\xd7\xa5\x16\xc6\x9a\xd1\xbe\x53\x1b\x49\xc6\xb0\xcc" + "\x0c\x45\xa6\x50\xd6\x3f\xe7\x72\x95\x04\x46\x56\xb1\xef\x78\xe3" + "\x70\x84\x43\xb9\x6a\x40\x79\x22\xb9\x42\x58\x8b\x22\x53\x28\x6b" + "\xc7\x09\x0e\xdb\x10\x7b\x70\x73\xa6\x96\x6c\x64\x87\xf4\xee\x59" + "\x92\x31\xf6\xfa\x93\xed\xec\x86\x05\xed\x82\x4f\xef\x9e\xb5\x7b" + "\x04\x0f\x02\x74\x7f\xd7\xa6\xa2\xfb\x71\x94\xe3\x58\xa2\xb3\x98" + "\xab\x7e\xf7\x2c\xb6\xed\x38\xf7\xc5\xb7\x20\x0f\xf8\x58\xf5\xee" + "\x01\x2a\x2f\xd3\xf0\x68\x80\x86\x3f\xd3\x85\xa3\x61\x08\xed\xb4" + "\xe2\x9c\xc0\x9f\x25\x91\xae\x60\x99\x0c\xe5\xec\xbf\x70\xbc\xc4" + "\x3a\xb4\xda\x5a\xd0\x51\x1d\x2d\x49\x1c\x7e\xb5\x52\xc7\x2e\xa4" + "\xb5\xb3\xb4\xf0\x92\xf2\xdc\xd2\x04\x40\x73\xe2\x54\x3e\x35\x89" + "\xe8\xfb\xb3\x03\x81\xf2\xcc\x15\x5a\xfe\xf6\xa5\x41\x6d\xe5\x17" + "\xb6\xd5\xf6\x9a\x38\xd7\x95\xea\xef\xbe\x54\x7b\x53\x0d\x62\x9c" + "\xb4\x8d\x22\xf9\xfe\xf9\xed\xf6\x3a\x00\x4a\x93\x9f\x93\x7a\x70" + "\xec\x09\x9d\xdf\x8f\xfc\xbe\xe1\xe7\xcb\x82\xdf\x37\xfc\x3c\x37" + "\xd2\xfb\x86\x90\x7a\xdf\xa6\x7a\xfd\x8d\xb9\x1a\x55\xdd\x95\xfe" + "\x30\x75\x2b\xe5\xc7\x35\xa9\xe3\x99\x9f\xff\x8d\xda\xd0\x46\xe7" + "\x93\xdf\x9c\xab\x61\x88\xa7\x85\x8f\xe1\x3f\x77\x0a\xff\x85\xfc" + "\xa2\x9f\x1f\x27\x98\xd0\x7e\xf4\xff\xe9\x92\x3e\xa4\x9f\x6f\xf9" + "\x43\xf4\xe3\xa0\xa7\x5f\x43\xbb\x92\x2d\x05\x01\x03\x0b\xf3\x10" + "\x07\x30\x92\xc3\x33\xfc\x13\x49\xf2\xb3\x93\x3f\x68\xfb\xe1\xfb" + "\xf3\xff\x8e\xbf\x18\xd1\x5e\x8e\xcf\x03\x1a\xb9\x3e\x75\x9f\xa6" + "\x5c\xa2\x34\x03\xa5\x48\xb8\xbf\x17\xf0\x2a\xcb\x8d\x06\x18\x95" + "\xcc\x81\x19\xf3\x8a\x8c\xfe\x67\xa6\x7e\xa6\x94\xe0\x67\xfc\x8b" + "\x5a\xa8\xaa\xe0\xd6\xa8\x02\xbe\xf4\xe8\xf6\x9c\xfe\x24\xa9\x49" + "\xaf\xae\x52\x0f\x65\xd1\xfc\x26\x91\xfe\xf1\x20\x3e\x23\xe6\x8f" + "\x4a\xef\x07\xb8\xd6\xb5\x4d\x05\xfe\x99\x68\xfe\x6d\xe5\x97\xe8" + "\xe3\x60\xff\x46\xa8\xee\x6f\x15\x3f\xb7\x65\x7d\x87\xf8\x2f\xfd" + "\x67\x38\x1e\xa3\xdc\x06\xc4\xe3\xb6\xe3\xe1\x40\x03\xf4\x4f\x35" + "\x29\x49\x6a\x09\x0d\xe4\xdf\x79\x20\xf8\x79\x74\x61\xf0\xf3\xdd" + "\x87\xbf\x8b\xa6\xdb\xe8\x9f\x52\xc7\x30\x80\xbb\xb6\xf7\x27\x26" + "\x86\xa8\x4c\x62\x4d\x88\x0a\x05\xfe\xe4\xd6\x44\x01\x8c\x89\x53" + "\x25\x6b\xc3\x43\xff\xe7\xfc\xdd\xb4\x4d\x56\x88\x5b\x9d\xfa\x01" + "\x99\x93\x42\xd2\xe8\x79\x88\x41\x4e\x9b\xf0\xe1\x00\x78\x9e\x66" + "\x50\x3d\x6b\x32\xf1\x9f\x26\x94\xff\x13\xdf\x45\x5b\x7f\xf8\xfb" + "\xff\xe1\x9f\x86\xf4\xe3\x87\xbf\xff\xa4\x3f\x26\x46\x71\xb4\x44" + "\xfc\x87\xfe\x63\xfd\x86\x92\xc9\x19\x4c\x4e\x60\xf2\xcd\x77\x32" + "\x8e\xff\xf0\xf7\xc3\xdf\x0f\x7f\x3f\xfc\xfd\xf0\xf7\xc3\xdf\x0f" + "\x7f\xdf\x83\x3f\x0d\x8f\x23\x98\xfc\xd7\x7f\xdf\x9f\x4f\x61\xd0" + "\xca\x24\x26\x69\x80\xa9\x32\xca\xee\x03\x8d\x0e\x86\x68\xbf\x3b" + "\x2f\xcf\xd0\xdf\xa0\x2b\x2c\x40\xb1\x24\xcd\x33\xdf\x8b\xd7\xcd" + "\xaa\xf4\xd4\xef\xaa\x45\xdf\xd9\x9f\x06\x89\x18\x85\xf1\x61\x34" + "\x0c\x81\xa1\xa0\x83\x18\x88\x85\x6b\x20\x0e\xe2\x21\x01\xe3\x4e" + "\x3d\x0c\x83\xe1\x70\x2d\x24\xc1\x75\x70\x3d\xdc\x00\xc9\x70\x23" + "\xdc\x84\x3d\x4a\x81\x5b\x30\xc6\xbf\x15\x09\x33\x12\x46\xc1\x6d" + "\xe1\xfb\x55\x06\x99\xc9\xf8\x0f\xfe\x9f\x03\x99\xfc\x39\xff\x87" + "\xf4\xff\xab\xe9\x36\x39\xfd\xb8\x9c\xee\xf8\x21\xfd\xff\x6a\xba" + "\xe1\xbf\xf8\x77\xe4\x7f\xe9\xaf\x06\xcd\xb7\xb0\xe0\x9a\xb0\x76" + "\x33\x34\x55\x23\xff\xf5\x3f\xc3\x65\xca\x0f\xc0\x17\x5c\x3e\xf4" + "\x2f\x13\xaf\x34\x71\x5b\x0a\x20\xcf\xf9\x32\xf5\x9f\xf7\x5c\xd0" + "\x5f\x24\x44\xfd\x7f\xd6\x85\x78\x15\xe2\x55\x8c\xd7\x46\xbc\x5e" + "\xc6\xab\x4a\x41\x2b\x60\x74\x78\xfd\x2d\x0f\xe0\x24\xfe\xfe\x47" + "\x3a\xfe\xd6\xe3\xef\xe7\x00\x1d\x58\xee\xf4\x7e\x80\x4e\x04\xf8" + "\x4a\x35\x37\x7a\x31\x3f\xd0\xda\x9e\xa3\xe2\xde\x80\x97\x87\xbe" + "\xa3\x05\x87\x46\xeb\xc0\x1f\xdb\xd4\xdc\x2c\xc3\x84\x71\x69\xe3" + "\xee\xbb\xcf\x30\x76\xac\xe1\x1e\xd3\x84\x7b\xc6\x9b\xd2\xc6\xdf" + "\x33\xc1\x60\x9a\xf0\x50\x5a\xfa\x43\xf7\xa6\x19\xd6\x6c\x2a\x5a" + "\x39\xc1\xb4\x62\x99\x61\xf9\xca\xa2\x35\x1b\x97\x14\x2d\xbb\x6c" + "\x6f\xae\xea\x8f\x9a\x76\x8b\x1f\x38\x37\x82\x29\x3f\x09\xa4\x83" + "\x99\x20\x7d\x68\x82\x81\xac\x32\xca\x57\xf0\x9f\x66\x6d\x39\x68" + "\x56\x55\x82\x66\xb9\x07\x34\x4b\xb4\xa0\x99\x7f\x10\x34\x95\x98" + "\xb6\xa3\x18\x34\xdb\x5b\x41\xb3\xf5\x3d\xd0\x6c\xcc\x19\x98\xf6" + "\x93\x02\x91\x76\xb0\x03\x34\x07\x92\x41\xf3\xae\x13\x34\x0d\x59" + "\x22\xed\xff\x41\x98\xff\xd5\xf5\x9f\xd3\xf9\xab\xfe\xbb\x52\x3f" + "\x62\xc0\x9f\x83\xcb\x13\x8d\xda\xfe\xfa\x30\x93\xa5\x3f\xfc\xfd" + "\xf0\xf7\xc3\xdf\x0f\x7f\x3f\xfc\xfd\xf0\xf7\xc3\xdf\x7f\xf3\x3f" + "\xa7\x06\xd2\xbe\x91\xb4\xf0\x51\x0d\x80\xdb\xaa\x4b\x71\x68\x32" + "\x2a\x69\x6d\x09\xd0\x37\x54\xa0\xe3\xfb\x90\x88\x4b\x8b\x3f\xd1" + "\x38\xf0\x0f\xc1\x6b\xa8\x4e\xbd\x46\x85\xd6\x20\x35\x27\x9b\x20" + "\x2a\x19\xc4\x7a\x29\x2b\x3b\x2e\xbe\x01\xbe\x07\xba\x41\xc7\xbf" + "\x9f\xa5\xef\x46\x11\xbf\xc5\x01\xff\x23\x59\x59\x5f\xa5\xc0\xd1" + "\xfa\x2a\x5a\x8f\x85\xb0\xfc\xfb\x81\x08\xeb\x69\xf4\xec\xf5\x64" + "\x69\xf2\x5e\x00\xfa\xfe\xf4\xb5\x3d\xcc\xd9\x52\x02\xd0\xbc\x4f" + "\x7c\x87\x4a\x6b\x6d\x10\x7f\xbb\x03\x76\x24\x89\xf5\x55\xcc\xf5" + "\x32\xa6\x63\x5a\xb7\x03\x2a\xb4\x72\x9d\xdd\x4a\xba\x7d\xfb\x45" + "\x68\x31\xf0\xef\x6c\x9c\x2d\x06\x1f\x4c\x19\x49\xfd\x8f\x49\xc6" + "\xf2\x95\x91\xd6\xd6\x28\xeb\xc8\xa8\x6e\x19\x3e\x2b\xa4\x3e\xec" + "\x63\xcc\x42\xa5\xbe\x08\x38\xe2\xa8\xac\x82\x07\xdb\xde\x8d\x65" + "\x6a\x14\x3c\xd8\x1e\xa5\x8d\xce\x29\x5b\x78\x1d\x07\xc2\xb5\xc9" + "\xf0\x71\x46\xf4\xb2\xfb\xc7\x77\x64\x7c\xbe\x3c\xd5\x70\xdd\x84" + "\xa9\xcb\x52\xef\x64\xa6\xc4\x31\x3b\x4d\xd7\x64\xc6\x64\x26\x8c" + "\x9f\x6d\x92\xf4\xd2\x28\xc9\x34\x5c\x2f\xdd\xf1\x1c\xfd\x7b\x7c" + "\x84\x91\xff\x1a\xb4\x19\xdb\x0b\xee\x37\x0c\x9d\xf4\xa3\x57\x37" + "\x64\xfe\xf3\xcf\x1f\xcf\x9c\x36\x6f\xfd\xe8\x8f\x4c\xd2\xb5\x7f" + "\xda\xf9\xbe\xf1\x1b\x82\x18\x39\x8a\xfe\x5d\xd8\x1c\x95\x34\xda" + "\x4a\x58\x8e\xdf\x68\xf8\x88\x52\xee\xd2\x66\x14\x17\xdc\x37\x7e" + "\x1f\xd5\x38\x77\xe9\x58\x2b\x95\x79\x7c\xa6\x28\x23\x20\xc6\x1f" + "\x52\xe7\x8d\xfb\x2d\x95\x36\xf0\x36\x80\x56\xe0\xea\xc7\x7d\x83" + "\x68\xa1\x48\x1d\x75\xcc\x74\x8b\x5c\xf7\x4f\xe9\xdf\x67\xde\x19" + "\x27\x21\x86\xe1\x63\x1f\xa3\xdc\xf1\x6e\x93\xdb\xd0\x92\xa1\x5d" + "\x91\x6a\x1c\x3a\xe1\xe7\x78\x97\xba\x22\x55\x2f\xe1\xfd\x8f\xc4" + "\x3d\xd1\xa0\xe0\x01\x01\xa1\x97\x6e\x4f\xca\x28\x28\xb8\xff\x0b" + "\x57\xc1\xfd\x7a\x29\x73\x5f\x41\x46\xe6\xf5\x95\xab\xef\x4e\xcd" + "\x48\x2d\xb8\x4f\x2f\xf1\xdf\x87\x32\x6f\xaf\x78\x46\x2f\xdd\xf9" + "\xa1\x69\x98\x5e\xf3\x87\x26\x0d\x7c\x2c\xcd\x39\xf0\x71\xd4\x9f" + "\xff\x7c\x04\xee\x5a\x73\x44\x73\xd7\x8c\x23\x92\x66\xd8\x91\xb8" + "\xf9\xf0\x07\xfd\x50\xf8\x43\x32\x5e\x86\x69\xd0\xaa\x29\xcd\x69" + "\x95\x36\xe6\xb7\x46\x95\xb6\xb5\x6a\x9f\x86\xd6\xe8\xc5\xc3\x5a" + "\x87\x4c\x7b\xaa\x75\xe8\xd3\x5f\xb6\xea\xee\x84\xd6\x18\x80\xd6" + "\x91\x20\xb5\x8e\x82\xa4\xd6\x7b\x86\xbd\xda\x3a\x6d\x84\x64\xbb" + "\xb6\xe7\x51\xdb\x4d\xda\xc7\x6d\xa9\x7a\xb0\xdd\x1e\x0b\xb6\x3b" + "\xe2\xe2\x6c\x77\xe2\x35\x1a\x9a\x6c\x26\x7c\xce\x80\x14\x5b\xf4" + "\xe6\x21\x00\xa2\x2d\x47\x0c\x00\x47\x46\xc2\xa4\x23\xa3\xf0\xf7" + "\x36\xbc\x52\xf1\xba\x1d\xaf\x3b\xf1\xc2\x38\xe5\x08\xed\xb7\x03" + "\xc6\x21\x19\xff\xeb\xc3\x25\x4b\xd2\x96\xdc\x97\x3b\x39\x2a\x6a" + "\x59\x2a\x5c\x83\x54\xd3\x66\xa4\x8e\x8c\x4e\x8f\x5e\x96\xfa\x85" + "\x2b\x13\xff\xd5\x4b\xcf\xfe\x6b\xd4\x90\xf1\xee\x74\x77\xfe\x3f" + "\x7f\xe1\x83\x58\xa4\x3f\x84\xca\x70\x8f\x15\x34\x2e\x6c\xa3\xcb" + "\xda\xf3\xa8\xdb\x1a\xa7\x77\x40\x4c\xa1\x22\xc7\x22\xef\x23\xbd" + "\xcb\x5a\x86\xf2\x17\x37\x26\x7c\xde\x36\xca\xcb\xba\x44\xb9\x82" + "\xf0\x79\x24\xd3\x71\x65\x4a\x5e\x8f\xd4\x9c\x83\xcf\x28\xff\xba" + "\xf4\x60\x58\x5b\x94\xcb\xaa\xd9\x86\x79\x07\x06\xe2\xb1\x21\x9e" + "\x29\x15\x98\xd7\x1a\x26\xef\x09\x97\x75\x36\xd5\xd1\x11\x52\x87" + "\x4b\xa9\x83\xbe\xef\x6e\x40\xfd\x22\xbb\xe3\xb7\xc6\x1c\xa6\xb2" + "\x76\x8f\x13\xf6\xf9\xbb\x34\x5a\xcb\x51\x20\x3c\x6e\x6b\x7c\xaa" + "\x52\x9e\xe0\x68\x7f\x02\xfa\x2e\x8f\xaf\xff\x84\xf8\xb9\xb4\xfe" + "\xb3\x1a\x71\x18\x36\x68\x6e\x38\x09\x71\x3e\x2a\xe3\x80\xf8\x42" + "\x97\xf4\x29\xd6\x1d\x9f\xaf\xd8\x39\x4c\xcb\x00\xb1\xce\xdc\x85" + "\x7d\x2f\xc3\xbc\x92\x81\x6d\xfe\x74\xb8\xa0\x4b\x7c\x9d\x92\x77" + "\xa9\x35\x85\xa2\x0c\x63\x2e\xeb\xa7\x7e\x2c\x73\x74\x20\x3e\x56" + "\xe6\xb2\x4a\xaf\x62\x5e\x57\x98\xbc\x6d\xa2\xae\x04\x6d\x98\x3c" + "\x2b\xe6\x49\x98\x67\x88\x90\x17\x85\x79\x19\xe1\xf2\x5a\xea\x39" + "\xce\xbc\x7e\x9a\x27\xc4\x67\xe2\x73\xa1\x42\xf3\xcb\xf7\x87\xf8" + "\x3d\x01\xe9\x9e\x50\x1f\x8a\x9f\x70\xbb\xa4\x63\x84\xef\xf0\xc0" + "\xba\x8f\x6a\x5c\xd6\x2c\x94\x85\x84\xcf\x07\xe6\x7d\x76\x33\xd2" + "\x81\xda\xe5\x0c\x93\x97\x82\xfd\x41\x7b\x9d\x18\x17\x06\xe7\x10" + "\xcc\x73\x60\x9e\xf1\x32\xfc\xd0\x73\x1b\x4e\xfb\x1f\x8c\x80\xe8" + "\x4e\x18\x3e\x91\xfa\x23\xe4\x02\x86\x74\xc2\xb0\x63\x3d\x62\x2d" + "\xbc\xd3\xb0\x19\xa2\xf0\xf9\x6d\x66\xb5\x5d\x87\xf9\xdd\x28\x4f" + "\x3a\xfb\x45\x2f\x74\x42\x62\x25\xc2\x44\xd1\xb7\xab\x34\x3e\x61" + "\x7a\x94\xdd\xe3\xa5\xef\x37\x50\xce\x12\x7f\x83\xbf\x12\x96\xe3" + "\xdf\x8a\xce\xa9\x87\x54\x6a\x23\x5f\xbf\x6a\xb5\x69\x68\x3d\x28" + "\x8d\x87\x2e\x09\xee\x74\x71\x99\x4d\xc4\xf1\x4f\xd7\x24\xaf\xdd" + "\xa5\x36\x68\xb1\xec\x16\x49\xcf\xd7\x82\x3b\x11\x17\xb5\xe1\x29" + "\xbf\xd5\x26\xf5\xe3\x91\x6c\xd7\xd0\xba\xde\x1e\xab\x34\xdd\x25" + "\x25\x32\x81\x47\x6f\x50\xf0\x10\x1c\xd6\xc5\xd7\xc7\xf7\x58\xb5" + "\xbb\x55\x30\x53\xd4\x75\x8d\x77\x41\x14\xb5\xf9\x24\xe8\xeb\xa9" + "\x3e\xb9\x8f\x7c\xad\xad\x7d\x83\x17\xec\xe8\x5f\x74\x82\xde\x82" + "\x7d\x35\x34\x7b\xe8\x1b\x67\xdb\xb0\xc6\xad\x00\x5c\x2f\x24\x30" + "\xc8\x38\xeb\x14\x9c\x84\x43\xd5\xd7\xe1\xa2\x7e\xea\xab\x0e\x64" + "\xd8\x16\x75\x1b\x09\x2f\xf6\xeb\x86\x06\x84\x6b\x41\xaf\x45\x86" + "\xe9\x52\x60\x54\x3c\x18\x29\xb7\x8f\xe8\x43\x3c\x5b\xa8\xe8\xa7" + "\xdb\x3a\x0c\xc7\xff\x6b\xba\x84\xde\x06\xd2\xe5\x36\x24\x8b\x36" + "\x68\xb0\x0d\x1a\x9b\xc0\x3f\x2c\x4b\xc1\xef\x00\xbd\x47\xdd\xe6" + "\x06\x0e\xab\x8f\x11\x7a\xca\x61\x8b\x03\xb0\x89\x41\xb0\x48\x0b" + "\x49\xf0\x00\x24\x07\x0c\x2b\x40\x7a\x44\x21\xcc\x41\xe4\xb7\x41" + "\x81\x91\xfb\x9f\x8c\x79\x93\x64\x7c\x2d\x2a\x7c\xc5\x84\x8f\xd6" + "\xc3\x0a\xdb\x3b\xcc\x11\xb0\x7d\xd0\x8a\xcf\xce\x81\xf6\x95\xf4" + "\x75\xb8\x0e\xe1\x52\x29\xdd\x3c\x0a\xf4\x67\x60\xd8\xa9\x1e\x29" + "\xaa\x4b\xd0\x62\x38\xda\xbf\xf8\x7d\x4a\x19\x7c\x4e\x73\x80\xc1" + "\x23\xd7\x57\x40\xb4\x09\xd8\x5b\xaa\x73\x78\xae\x52\xa7\x92\xaf" + "\xd6\x99\xcc\x98\xf1\xe8\x9f\x64\xfe\x32\x33\x25\x73\x84\xe2\xbb" + "\x4c\x6c\x59\x9e\x3a\xde\x35\xb1\xc5\x70\x9f\xe9\xdd\x65\xa9\x63" + "\xf8\xd8\x7f\xe7\x49\xd3\x28\x1c\xdd\xff\xc4\xff\xdd\x4d\x29\xa9" + "\x3c\x05\xd3\xe9\x7e\x14\xdd\xcb\xfe\x02\xde\xcd\x9d\x13\x35\xf4" + "\xf6\x22\xba\x13\x9e\x43\xe6\xf5\x8b\x96\x46\x4d\x91\xef\x13\x44" + "\xce\xdd\xdc\xe7\x30\x3e\x46\xf7\x77\x70\x5c\xe3\xf7\x51\xcd\xe3" + "\x76\x9a\x1e\x9e\xf7\x3f\xa3\x8e\xbc\xba\x2a\x33\xee\x4e\x2b\xc1" + "\x8c\x79\xd2\xf4\x16\xa6\x34\x53\xca\xa8\x9f\xf2\x16\xa8\x4b\x1d" + "\xa2\x52\x72\x7e\xca\x98\xa9\xa6\x9f\x2c\x98\x73\xdb\x9f\x4c\xc3" + "\xaf\xfd\x68\x61\x33\x95\xbf\x76\x78\x50\x4d\xa3\x02\xad\x7a\x6e" + "\xd7\xe8\x57\xee\x7d\x57\x60\x99\x37\x27\xea\x4f\x99\x23\xd6\x15" + "\x51\xea\x6d\xdc\x17\x23\x5f\x65\xfc\x05\x53\xf4\xab\xf3\xbe\xf8" + "\x97\x79\xef\x1c\x7f\x66\x34\xf6\xf4\xda\xdd\xc7\x9f\x99\xf7\xce" + "\x17\xff\x12\xf5\x32\x41\xde\x55\x60\x4a\x32\x44\x4f\x7c\xb1\xe5" + "\xa9\xd1\xbc\x55\x37\x54\x26\xd7\xdd\xb8\xef\xa6\x83\x37\xbf\x97" + "\xd2\x7a\xcb\xbf\x8e\xf8\xeb\xad\x5f\x19\x5c\x23\x19\xfa\x11\x8f" + "\x9a\x46\xf6\xfb\x11\x80\x7e\xc4\x49\xf4\x23\x4a\xd1\x8f\x68\x53" + "\xfb\x11\x9f\xc4\x3e\x54\x22\x7c\x09\x01\x2f\xfc\x9f\x31\xff\x8a" + "\xfe\xcf\x5a\xf4\x7f\xc6\x1c\x89\x9e\xfb\xf4\x91\xb8\x5c\xe1\xff" + "\x0c\x4b\x1c\xc2\x7d\xa0\x1b\xf1\x17\xfd\xa0\x3f\x8c\xc4\x5f\x23" + "\x3e\x8f\x1e\x3e\x34\xd8\x27\x9a\x9d\xd0\x1a\xbd\x10\x7d\xa2\x0c" + "\xf4\x89\x32\x97\xb4\xea\xa6\x7f\xd8\x1a\x93\x9e\xd9\x1a\xdb\xef" + "\x17\x3d\xde\x3a\x25\x79\x7c\xeb\x74\x2d\xb4\x3e\x01\xc2\x37\xda" + "\x0e\xa6\x4f\xb4\x49\x9a\xcf\xe2\x40\xfb\x59\x42\x53\xec\x67\x89" + "\x36\xdb\x67\x7a\xbc\x86\x41\xd3\x67\xc3\x61\xe8\x47\x8f\x36\xc1" + "\x47\x93\x4b\x1d\x47\xb4\x90\x70\x24\x06\x2e\x1c\x19\x86\xbf\xf9" + "\x7b\xe0\xc8\x8f\x40\x7b\x24\x56\x7b\x21\xd0\xdf\xa4\x53\x47\x46" + "\x7e\x3c\xf1\xc8\xa8\x8c\xff\x7d\xe4\xb6\x29\xb3\x8f\xa4\x7e\xfc" + "\xf1\x91\xdb\x1d\x23\xd4\x7e\x13\xf5\x19\xe0\xee\xed\xe4\xc1\x22" + "\xbd\xef\x33\x0e\x31\x0d\x79\x65\x19\xf7\x07\xef\x97\xfd\xc2\xfb" + "\x33\xa7\xbe\x3a\x6f\xde\xd2\x28\x29\x73\x04\xf7\x2e\x65\x4f\x33" + "\xe0\x7d\x06\xfb\x9c\x13\x5b\x02\x3e\x67\xaa\x2b\xe0\x73\x1a\x86" + "\x4c\xdc\x10\xe4\x9f\xf5\x61\xda\xe7\x19\xa9\x86\xdb\x4d\xdc\x33" + "\x3b\x7e\x63\xa8\xb7\x36\xae\xca\x34\x31\x55\x77\x5f\x3b\xfa\x6c" + "\x43\xcb\x7f\xb4\xf4\xe7\x74\xa1\xd7\xf6\xad\x5e\x7a\xf5\xf9\x25" + "\xe9\x79\x2f\xdf\x85\x3c\xbf\x96\xbc\xe0\xa1\x3f\x7a\xe5\xf0\x8f" + "\x7e\xf4\xea\xe1\x23\xcf\xcc\x19\xfd\x5b\x4c\xfb\x28\xb5\x18\xe5" + "\xe7\xff\x14\xfc\x9f\xf1\x17\x32\xa2\x7f\xf4\xf4\xe1\x57\x5f\x5f" + "\xb1\xa2\x85\xe4\x85\x78\xab\x8c\x51\x3d\xd6\xe1\xe8\x93\x68\xfe" + "\xd9\x6d\xbd\x0e\xfd\x9f\x1b\x5b\x43\xc7\xb2\x1f\xf4\xf2\x07\xbd" + "\xfc\x41\x2f\xff\x2b\xf4\xf2\x7a\x10\x7a\x79\x63\x65\x38\xbd\x9c" + "\x3e\xeb\xf1\xec\x87\x0c\x2f\x2e\x35\x98\x8b\xd6\xad\x28\x5a\xb2" + "\xc6\xb0\x7a\xdd\x92\x82\x65\x05\xb1\xd0\x9f\xb1\x64\x69\xf1\xca" + "\x0d\x4b\x8a\x97\x0d\xf8\xd6\x31\x59\xf1\x49\x07\xfa\xd6\x37\x7a" + "\x22\xfb\xd6\x37\x25\x85\x8f\x4b\x34\x38\xb6\xdf\x64\x0a\x93\x37" + "\x4a\xce\x9b\x11\x26\xef\x31\x39\xaf\x30\x4c\x0c\x18\x2f\x62\x8c" + "\x9b\xb6\x87\xcb\xc3\xf4\x7a\xc5\x27\xc1\x38\x4d\x6a\x19\xd5\x0d" + "\xe4\x93\x74\xc2\x4d\x1f\x63\x9f\xba\x30\xff\x3d\xc5\x97\x71\xc0" + "\x4d\xdb\x15\x1f\x4d\x8e\x43\x8c\x2e\x6b\x26\xf6\xf3\x26\x47\x98" + "\x18\xe5\x2e\xb9\x5e\x6f\xc0\x37\x9a\x65\x70\x5b\x6f\x8e\x1b\xe8" + "\x1b\x1d\x07\x11\x43\xde\x6c\x0c\x81\x4d\x57\x60\xd1\x9f\xa4\x3d" + "\x20\xba\xe9\x1b\xb5\x6e\xb8\xf9\x3d\x66\xbd\xb1\x8e\x7c\x4a\x8a" + "\x23\x09\x8f\x88\x25\xdb\x79\x2c\x89\xb1\x62\x07\x96\x2d\x56\xc5" + "\x93\x1d\xe8\x1b\x0f\xa5\x78\xb2\x13\x6e\x7e\x9b\x62\xca\x6a\x8e" + "\xeb\x0c\xe1\x9a\x49\xb8\x1c\x70\xb3\x8d\xfb\x7d\xa2\xec\x41\xd5" + "\xbc\x19\xc6\xb5\x37\xf3\xbd\x9a\x14\xbf\x10\xf3\x8f\x3b\xa4\x2f" + "\x67\x28\x7d\x20\x5f\x50\xee\x47\x99\xe0\xc3\xcd\x61\xe2\x9f\xe3" + "\xbb\x45\x1c\x98\xd2\x1f\xff\x10\x3e\xbf\xf5\xc6\xdf\x34\x70\x9c" + "\x29\xa9\x0a\x4e\xb5\x5c\x2e\x5d\xb7\x76\xf9\xca\x15\x2f\x16\x2d" + "\x33\xac\x9f\x31\xc3\xb0\x66\x5d\xc1\xb2\x71\xe3\xc6\xc5\x06\xc9" + "\x5f\x9c\xf0\x69\x3f\xcd\x24\x39\x24\xbf\x56\x96\x43\xfa\x46\x4f" + "\xf6\x9b\x53\xca\x82\xe3\x8b\x4f\x33\x65\xff\x56\x8f\x30\x26\x19" + "\x66\x5f\x10\x0c\xe2\x93\x7d\x64\xf2\x73\x13\x64\x98\xd6\x50\x3c" + "\x98\xc7\xe3\x22\xfa\xee\xae\x47\xf4\xaf\x3b\x04\xcf\xa3\x72\xbc" + "\x83\x72\x3f\x44\x8e\x13\x6e\xd1\x87\xe0\x79\x34\x10\x6f\x68\x14" + "\x98\x34\x75\x6c\x82\xcf\x53\x14\x9e\x04\xfc\xf8\xe6\x2e\x81\x5b" + "\xa3\x0f\xf8\xfd\xb7\xac\x0e\x89\xa5\xae\x0f\xe0\x06\xbd\x0c\x53" + "\x13\xdc\xc6\xe6\x33\x72\x5f\x75\x2a\x3c\x87\x82\xf1\x34\x7f\x2d" + "\xe3\x89\x52\xc1\xb4\x87\xb4\xb1\x6b\x60\x1b\x6d\x09\x02\x77\x13" + "\xd6\xef\x90\xfb\x36\x22\xa4\xff\x08\xc3\x71\x27\x21\x4c\x8a\x02" + "\x93\xa6\x8e\xa5\x28\x9e\xe3\xdf\x62\xc2\x88\x19\x24\x4f\x78\x0d" + "\xc1\x76\x9f\x56\xc5\x74\x43\xe5\x72\xa1\xfd\x8f\xef\xc1\x78\xa1" + "\x31\x28\x4e\x1b\x11\xd2\x7f\x8c\x0d\x87\x2b\x34\xd2\x2a\x30\xa1" + "\xfd\x77\x88\x36\x0e\x1b\x16\xe8\xff\x88\xf6\x10\x3c\xd7\x93\x4c" + "\x11\x2e\x55\x5d\xde\x10\x3c\x27\x65\x3a\xaa\x68\x7d\xab\x21\x84" + "\x1f\xff\x21\xb7\x47\x45\xeb\x5b\xa7\x84\xe0\x39\x4f\xf9\xc1\xfd" + "\xba\xb5\x30\x04\xcf\xf9\x40\xbf\x50\x8e\x05\x4c\x65\x48\x1c\x2b" + "\x31\xeb\x47\xf1\x21\x78\x0e\x2a\x30\x3d\x43\x5e\x6d\x12\xbc\xbd" + "\xb5\x45\xb1\x45\x82\xaf\x29\x26\xc2\x8d\xe9\x27\xd4\xb6\x00\xdb" + "\xd5\x35\x90\x4e\x06\x08\xa5\x93\xaa\x5d\x72\x2c\x6e\x48\x0d\xe9" + "\xdf\x19\x99\x4e\xb1\x2a\x3c\x59\x21\xfd\xfb\x5a\xc6\x13\xad\x82" + "\x09\xe1\x7f\x73\xb7\x8c\x47\xab\x82\x09\x95\xff\xb3\x32\x1e\x75" + "\x5d\x87\x2e\x4f\x27\x43\x90\xfc\x13\xad\x30\xad\xfb\x32\x73\x50" + "\x3a\xf1\xee\x60\x24\x8e\x7f\xfb\xf8\x1c\x3c\x8b\xbd\xd8\x4d\x7b" + "\x4a\xa1\x8d\xce\xe4\x73\x83\xbd\x64\xa7\x47\xd2\x1e\x07\x4e\xd1" + "\x07\x30\x09\xdb\x3d\x72\x09\xf0\xbd\x51\x47\xe6\x38\x20\xa1\x58" + "\xfd\x1e\xc0\x01\x23\x2b\xe5\x3c\xec\xff\x75\xed\x4a\x1e\xa5\x8b" + "\xf9\xc5\x91\x38\xfe\xdd\x68\x16\xe3\xd8\xc8\xd5\x32\x2c\xda\xfd" + "\x94\xac\x70\xdf\x2f\x47\x7a\xff\xb2\x3e\x99\xf9\x4b\x6f\xa4\xef" + "\x99\x3b\xcc\x7e\x2b\x03\xbb\xc5\x03\x86\x9b\xa0\xf4\x24\x8c\xd2" + "\x51\x8c\x5f\xbd\x19\x74\xa5\x66\xe6\xa1\xfd\x5f\xdb\x9c\xdd\x50" + "\xea\x64\x5d\xb4\xdf\xff\xd6\x0b\xa0\xb3\x7b\xf9\x39\x69\xc9\x2d" + "\x25\xa7\xc2\x7e\x93\xeb\x97\x18\x94\xa6\x50\xd9\x0e\x68\xab\xef" + "\x80\xd2\xfa\xe0\xb2\xa5\xb7\x40\xf2\x31\x3a\x3b\xc0\x0a\x89\xd4" + "\x0e\x7a\x9f\xe2\x8d\xed\x30\x97\xbc\x01\xda\x52\xf4\x2e\x8f\x15" + "\xd8\x94\xb6\xf0\x6f\x75\xb7\x9f\x01\xdd\x3b\xcb\x6d\xd2\xcb\x67" + "\xa8\xbd\xdd\xe6\x5f\x6f\xf6\x48\xcd\xc9\x33\xa0\x39\xf9\x04\xb4" + "\x24\x4f\x84\x16\xcb\x14\xa8\x3e\x03\x71\xcd\x9e\x0c\x68\xd1\x3e" + "\x0e\x2d\xa9\x53\xc0\xde\x8d\xf7\x06\x1f\xc2\xb8\xf8\xfe\x47\x9d" + "\x30\xca\x56\xfb\x3c\xe8\x1c\x02\x27\xd2\x6c\xd4\x51\x65\x2f\x1f" + "\x7a\x0e\xd7\x8f\xf5\x37\x42\x32\xb6\xaf\x0b\xdb\xf2\xe0\x49\xb8" + "\x2d\x3a\x35\x19\xe8\x6c\x86\xa1\xf6\x3a\x2f\x68\x4b\x20\x26\x82" + "\x5c\x24\xf1\x7d\x40\xd1\x8f\x6a\xd8\x83\x63\x3d\xfe\xf6\xa0\x4c" + "\xb8\xad\xb7\x65\x60\xdd\x27\xe4\x79\xaf\xee\xd2\xb7\x51\xce\x36" + "\xe6\xd1\xbe\x20\x38\x4e\xdf\x96\xa7\xe4\xd1\xfe\xa6\xb4\x6f\xe9" + "\xf8\x24\xd0\xdb\xbd\x99\xf0\x41\x6f\x17\x7d\x7b\xdf\x4d\xfb\x21" + "\x10\x3e\x1c\xf3\xa3\x68\xfe\x09\xdb\x33\x1a\xc7\xf8\xee\xdb\x10" + "\x0e\xcb\x23\xff\xff\x95\xcf\xb9\xb0\x1b\x16\xb8\xfc\x37\x2c\xb8" + "\xe0\x7f\x7d\x41\x0f\x7b\x7d\xc1\x37\xbe\xd7\x17\xfc\xad\x74\x13" + "\xe8\x7c\x37\x2c\x70\xb6\x99\x39\x0f\xf4\x6d\xe6\xb3\xf4\x1d\xbd" + "\x8e\xce\x13\x5d\xf4\x02\xf2\xde\xfb\x17\xd8\xb2\x12\x92\xfd\x31" + "\x5f\x1b\xed\xde\x3f\xc3\xa2\x12\x60\x78\x9f\x1e\xae\x7f\x3d\xb1" + "\xdd\x07\x95\xf9\x34\xb7\x35\x55\xef\x90\xfe\x83\xfb\x00\xce\x18" + "\xd7\x41\xbc\x0e\xe1\x75\x18\xaf\xf7\x58\x6c\x37\xfa\x36\x50\x9a" + "\xb0\x4d\x03\xb4\x7f\xcf\x78\x3f\x68\xce\x40\xea\x18\x6c\xbf\x3e" + "\x02\xdd\x52\xfc\xd5\x51\x99\x77\x96\xc1\x56\xb7\xbb\x90\xf6\x51" + "\x75\x92\x7e\x91\x3f\x8a\xf5\x58\xb0\x9e\xfd\x5c\x17\xf6\xa0\x1e" + "\x25\x44\x65\x92\x4f\xe7\x7a\xa9\x50\xe3\x7c\xa9\x50\xea\x49\x88" + "\x9a\x8c\x30\xf5\x08\xe3\x90\x69\xd8\x45\xb8\x50\x6f\x9c\xf1\x5e" + "\x88\x42\x9c\xe6\x7f\xbe\xd8\xae\xdd\xbb\x87\x9d\x40\xb8\x96\x7e" + "\x5c\x88\xbb\x96\xfb\x49\xa9\xed\x4a\x1a\xf9\x49\x55\x08\x47\xe5" + "\xed\x9e\x4c\x7a\x67\xe8\xb0\xaf\xee\xa2\xfd\x2b\x62\x59\x9f\xa8" + "\x8f\x7c\x38\xd2\xd5\x78\x0f\x0c\x71\x5b\x21\x87\x70\x53\x39\x3a" + "\xc7\x02\xcb\x4d\x66\xa5\x85\xe8\x2f\xc2\x2c\x37\x2b\xd4\xd0\x5e" + "\xb6\xcd\x58\x5e\xd4\x7d\x7b\xa6\xd2\x46\xaa\x83\xef\x65\x4b\xed" + "\x44\x79\x68\x5e\xed\x81\xf8\x3a\x9a\x27\x87\x39\x84\x8f\x70\xa1" + "\x1c\x38\xb0\xaf\x93\x9b\x57\x3b\xc1\xcf\x82\x70\x3a\x64\x7c\x35" + "\x41\xf8\x30\x9d\x21\x3e\x92\xbf\x16\x2c\x13\xdf\xc4\xf1\xcd\xfe" + "\x67\x3f\xe1\xf3\x80\xd6\xc0\xdb\x3b\x8f\x70\xf0\x7d\x99\x11\xa7" + "\x6d\xc3\x63\xe8\x3b\xde\xee\x71\x96\x16\x46\xf1\xef\xe6\xb1\xfc" + "\xaf\xb7\x76\x45\xb3\x9e\xbc\xa8\x04\xfe\xcd\xfc\x63\x40\xef\x5a" + "\x11\xe6\xdf\x58\x4f\x61\x54\x7c\x37\xfa\x7a\x08\x43\xfb\x68\x51" + "\x3b\xd5\xbc\x9c\x3d\x75\xde\x44\x98\x37\x65\xfa\x94\x89\x30\xf3" + "\xd1\xc9\x13\xc1\xf4\xe0\x58\x53\xda\xbd\x0f\xdc\xcb\x6f\xee\x7d" + "\x20\xfd\x5e\xc8\x79\x7a\xf6\x44\xc8\x99\x35\x11\xe6\xe0\x95\x33" + "\x67\xea\xec\x29\x53\xe7\x4c\x84\xbc\xc7\xa7\xe3\xd3\xe4\x89\x13" + "\x4c\xd3\xc6\xe6\x4c\x9e\x3e\x15\x9e\xca\xbd\xc7\x74\xcf\x3d\xf0" + "\xe8\xd4\x19\x13\x4c\x26\xf9\x77\x82\x89\x40\x9e\x49\x9f\x3a\x67" + "\x6c\x4e\xd1\xba\xe2\x75\x63\x67\x4d\x9f\x4c\x29\x30\x75\xea\xc4" + "\x9c\x20\x3f\xd2\xe8\xbb\xe8\x23\x7a\xbb\xd8\xf9\x2c\xda\xbf\x18" + "\x1a\x50\x0e\xf0\xea\xe6\xfb\x22\xc1\x9d\x7f\x6c\x20\xfe\xf1\xb1" + "\xe0\x8e\x24\x1a\x4f\xdd\xd6\x3b\x90\xff\x1d\x06\xa2\x23\xed\x21" + "\xdc\x09\xe3\x76\x60\xde\x8d\xb2\x3f\x12\x8d\xf9\x9e\xe0\xfc\xd1" + "\x0b\x31\xff\x56\xda\x67\xc7\x8e\x17\xd2\xde\x85\xf6\x10\x69\xec" + "\x84\x9e\xd2\xbc\x68\xbe\xcf\x21\xf2\x9d\xf6\x9f\x70\x5b\xef\x4c" + "\x53\xe9\x7d\x07\xed\x53\x41\xf3\xc9\xe7\xe0\xce\xf8\xb6\xe2\x4c" + "\xda\x8b\x0a\xec\xc5\x32\x8e\x0b\xfd\x38\x62\xe5\xbd\x12\x1d\x0d" + "\xb4\x07\x88\xc0\x53\xa2\xb2\x11\x0e\xc2\x53\x8d\x79\x32\xae\xa7" + "\xda\xd0\x56\xa0\x2d\xdf\xec\x2f\x35\x02\x8b\xed\xb0\xf8\xfb\x8c" + "\x20\xe6\x5f\xef\x3c\xa4\x92\x6d\x57\x8b\x05\xe1\xde\xc9\xd2\xd0" + "\x7e\x0c\x7c\x6f\x06\xb8\xc3\x86\x32\xee\xf2\x55\xb8\x3e\x64\xe7" + "\xf9\x7e\x88\x43\xb0\x7f\x63\xb1\x7f\xa9\xfe\x0a\x97\x8d\xef\x2d" + "\xca\xe1\x8c\x49\x8c\x9e\x63\x11\xae\xaf\x3f\xed\x3a\x4a\x73\xd3" + "\xfb\x1d\xd4\x59\xc6\x78\x7a\x14\xa6\xff\x19\xed\x5a\x3b\xc2\xda" + "\x08\x76\xbc\x17\x86\xf2\x7d\x50\x4a\x35\x70\x12\x8c\x0b\xfd\xb1" + "\xae\x8f\x54\xf5\x11\x9e\x85\x62\x1c\x43\x5e\x9c\x47\x3c\x3d\x3c" + "\x5d\xc2\xf4\xdf\x23\xfe\x66\xb2\x97\xc2\x86\x8f\xfb\x05\x40\xff" + "\x7b\x91\xc0\x33\xed\xf3\xbc\x55\x3c\x37\x23\x2d\xe9\x3d\x01\xbd" + "\xe3\x77\x5b\x8d\xe8\xff\xa4\x66\x89\xb1\x72\x1c\xdf\x37\x9f\xf6" + "\x95\x65\x71\x8f\x9b\x11\x6f\x8b\x6d\x73\x37\x3f\x1b\xd4\x01\xc6" + "\xd5\xfe\xd2\x42\x08\x69\x93\x91\xda\x4f\x36\x04\x69\x31\x16\xe5" + "\x20\xc6\x6d\x1d\x0d\x21\x72\x90\x82\x78\x3e\xc4\xf6\xb5\x63\x9f" + "\x3e\x44\x3c\xa9\xfe\x9e\x42\xac\x17\xe3\x45\x56\x88\xbe\x52\x00" + "\x87\x5c\x3e\x33\xb8\xfc\x9d\x1d\x54\x0e\xe1\xa3\xdd\x3d\x04\x7f" + "\x67\x17\xd1\x5c\x96\x3b\x94\xcb\xd1\xe6\x10\xb9\x5c\x83\x6d\xb9" + "\x5f\x95\x5f\x13\x92\xff\x14\xe6\x3f\x2c\xe7\xa3\xee\x8f\x3e\x18" + "\xd2\xde\xa3\x98\x3f\x09\xdb\xeb\x42\xdd\x8e\xc2\xfa\xf6\x35\xc8" + "\xbe\x89\x0c\xef\x08\x81\xf7\x22\xfc\x64\x92\x1b\x1a\x77\x08\xbe" + "\x51\xd6\x1d\x84\xd7\xb9\xad\x77\xe9\x43\xea\x9f\x80\xf0\x33\x02" + "\xed\xbb\xcb\x14\x9c\x7f\x97\x07\xf3\x9f\x22\x59\xc7\xdf\x67\xc9" + "\xd7\x27\x7b\x42\xb6\xac\x79\x35\xf1\xeb\xae\xfc\x10\xf8\x32\x84" + "\x2b\x90\x69\x24\xc9\x34\xda\x27\xc7\xee\x27\xe4\x36\xd4\x86\x94" + "\x39\x84\x65\x56\x23\x1d\x3f\x54\xe4\x32\x4c\x99\xd6\x90\x32\x5d" + "\xc4\x47\x26\xea\xd1\xba\xfb\x02\x65\x64\x3b\xa9\xc6\x41\x7d\xbb" + "\xc6\x6d\xbd\x3b\x2e\x18\xc7\xd8\x1a\xac\xb7\xb8\x4a\xd8\x9d\x6b" + "\x50\x86\xee\xc1\xb4\x6d\x88\xf3\x63\xd2\x81\x6a\xf2\x07\x9d\x1e" + "\x60\xa5\x59\x71\x42\x76\xef\x5e\x93\xe0\x05\xba\x1f\x4b\xf7\x84" + "\x9b\xb9\x67\xc8\x3a\x79\xf7\x1a\xfc\xa5\x74\x7e\x0e\x0b\xd9\x61" + "\xe6\x7e\xd2\x2f\x70\xde\xfd\x63\x3a\x1b\x0b\x9f\x7d\x72\x1d\x9b" + "\x68\xef\x50\x6c\xff\x47\x38\xee\x00\xdb\x88\x70\x9b\x61\x32\xa6" + "\x3f\x8b\x69\x47\x64\xb8\xc0\xf3\xc6\x27\xbd\x72\xfe\x58\x51\x67" + "\x16\xc9\x7b\x1a\x3e\xdf\x2e\xe3\xbb\x85\xf0\xe3\xfd\x04\xf9\x5e" + "\xe3\x23\xdc\xe7\x15\x9d\x1c\x7b\x1d\x2f\x87\x7a\xc9\xeb\xc3\xf2" + "\xb4\x6f\xab\x5c\x07\xb5\x7f\x7a\x27\x8c\x39\x8b\xbf\x4f\xe1\xef" + "\x27\xb4\x8f\x6a\xa9\x8f\xeb\x27\x3d\xff\x0e\x7f\x67\xe3\xef\xdb" + "\xf8\x3b\x07\x7f\xab\xf0\xf7\x31\xfc\x5d\x49\x7a\x42\x7b\xc2\xd3" + "\xde\x36\x38\xd6\x0a\x59\xa3\x77\x81\xee\x2c\xc2\x39\x15\x61\x38" + "\x2d\xfc\xc2\xde\xe8\x04\x5f\xc7\xf0\xb3\x67\x50\x3e\x28\x6d\xa8" + "\x90\x0f\x91\xe6\x53\xec\xd2\xf9\x40\x9a\x6c\xab\x64\xdd\x94\xd3" + "\x04\xfe\x1c\xc4\x3f\x86\xda\xca\x04\xae\x68\x21\x03\x32\x7e\x51" + "\x4e\x1b\xa6\x4e\x8d\xba\x4e\xfc\xe5\xfb\x22\x39\xe0\x6e\xee\xaf" + "\x39\x60\x6c\x0a\x9d\x4d\xe4\x27\x9e\x14\xc1\x0c\xe4\x5d\x2b\xf1" + "\x40\x91\x29\x26\x64\x74\x08\xdd\xfb\x37\xae\x42\x1b\x85\xf9\x1b" + "\x57\xf9\x65\x39\xe4\x30\x3c\x9f\xb7\x85\xef\xd1\x81\x38\xef\xae" + "\x21\xfe\xf0\x7c\x91\x3e\x46\x25\x97\xc3\xdd\xd6\xb1\xfb\x42\xe4" + "\xb2\x1d\xe5\xf2\x55\x92\x3f\xe2\x19\xd1\x25\xc1\xcc\xfd\x02\xa9" + "\x1f\xff\x79\x21\xdf\x0d\xf2\x3a\x27\x61\x0b\xc6\x76\x87\xe8\xb6" + "\x0e\xf1\x54\x84\xd8\x8e\xee\xc0\x18\x39\x2e\x25\xc4\xb6\xed\x63" + "\x15\x17\x70\xec\xbb\xab\x4b\xb6\xd1\xae\xa8\x12\xd2\xbd\x71\x18" + "\xff\x9e\xcd\xe3\xbe\x6a\x85\xeb\x0f\x84\xc7\x55\xca\xcf\x02\x70" + "\x45\x99\xc9\x66\x8c\x2b\x50\xf2\x79\x5e\x7c\x94\x8d\x74\x2a\x6a" + "\x35\xcf\x2b\x73\xc0\x6d\x7a\x25\x0f\xc4\x1e\x73\xae\xa8\x62\x9e" + "\x57\x1f\xc0\xdb\x51\x27\xe3\x8d\x0a\x7b\xb6\x43\x79\x47\x39\x0a" + "\xbf\x74\x57\x19\x44\xdb\xbd\x9f\x43\xb6\x97\xf9\xee\x2e\x83\x18" + "\xbb\xf7\x00\x8c\x06\x18\x66\xf7\xbe\x47\x0b\xfc\x47\xda\xbd\xb5" + "\xe8\xfb\x6c\xa7\xfc\x0f\x46\x97\x69\x34\xf8\x5b\x7a\x27\x48\x1a" + "\xbb\xb7\x1e\xee\x00\x2d\xfe\x16\xc3\xe3\xaf\x30\xb7\xdd\x5b\x80" + "\x70\xab\x21\xdb\xc7\xce\x4f\x89\x66\x5f\x2c\xf6\x81\x7e\xc6\x2b" + "\xac\xd4\xee\xc5\x38\xc4\x7b\x14\xd3\xfd\x2c\xdb\xf7\x2d\x5e\x6e" + "\xe6\x2f\xef\xa8\xcb\xf6\x9d\x67\x93\x5f\xf9\x00\x9f\xbf\x60\x93" + "\xa3\x4b\x19\xf2\x93\xd9\xbd\x19\xd0\xe6\x72\x21\x7c\x1a\xb0\x1d" + "\x1d\xe5\x8b\x2e\x48\xd0\x47\xe7\x2f\xec\xe8\xa8\xc3\xfe\xec\xef" + "\xc3\xbe\xe0\xb8\xfe\xf3\xbe\x97\xf0\xb7\xa2\xe3\x67\xfc\x59\xd7" + "\x71\x18\xfb\xb2\x7f\x6c\x19\xc6\x24\x16\xec\x87\xcf\xc9\xd0\xdf" + "\xd1\xda\x2d\x27\x20\x61\x1b\xf9\xf5\x19\x40\x67\xac\x21\xbf\x12" + "\x65\xbc\xfb\x29\x9e\x63\x31\x58\xae\xa2\xe3\x77\x1c\x47\x79\x47" + "\x7b\xa2\x86\x39\xd1\xbe\x27\x12\x2d\xec\xde\x13\x40\xe7\x9c\x13" + "\x0d\x68\x2f\xf1\x6c\x1f\x24\x62\xb9\xf6\xbe\x98\x8e\x56\xbc\xba" + "\xfa\x62\x4e\xa1\x8e\x9c\xba\x8b\x59\x93\x3e\xa4\xbd\x37\x59\xf9" + "\xa9\x74\x7c\xce\x72\xf1\x7d\xa8\xa9\x0d\x30\x94\xed\x38\x95\x8e" + "\x72\x35\x05\xe5\x13\xdb\x7a\xaa\x90\xd7\x53\x71\x6a\x85\x8b\x51" + "\x1f\x4e\x2d\x17\x7d\x38\xb5\x4c\xf4\xe9\x54\xb9\xac\x6f\x94\xf6" + "\x23\xbc\xcf\x75\x13\x5c\xf9\xa9\x72\xa6\x3b\x55\xe7\x41\x1d\x46" + "\xba\x96\x11\x1d\x91\xae\x65\x44\x4b\xc4\x5f\x6e\xb7\x54\x62\x3f" + "\x4e\xd5\x61\x7b\xf6\x63\xb9\x7f\xe9\xe3\x7e\xcf\xa9\x56\x97\xc0" + "\xf3\x07\xc4\xb3\x90\xe3\xd1\x9d\x6a\x45\x5c\xed\x3e\xab\x01\xb2" + "\x37\x31\x4f\xb6\x77\x9b\x77\xf1\x26\x88\x1a\x03\x65\x1a\x8a\x7b" + "\xec\x96\xd5\xd8\xcf\x16\xfc\x9d\x82\xf9\x70\x2d\xd6\xf5\x01\xe2" + "\x6d\xa5\xfa\xb0\x1e\xf4\x61\x4e\xfd\x19\x71\x15\x50\xfb\x7a\xe9" + "\x9c\xb0\xd8\x53\x5d\xbd\xd4\xfe\xf2\x4e\x1d\xd3\x75\x1a\xfd\xba" + "\xce\x64\x45\x86\x48\x7e\x04\xdd\x48\x6e\xde\xc5\xd1\x0b\xf4\xd9" + "\x16\xe6\xc5\x3c\xbd\xdd\x42\xe9\xf5\xd0\x66\x46\x18\x0b\xe5\x17" + "\xe3\xfd\x4c\xbc\xdf\x0e\x24\x3f\xb3\xcc\xae\x6d\xe3\xca\xcc\x1a" + "\x84\xff\x60\xb1\x57\x07\x8b\xcc\xda\xb2\x36\x73\x37\xe6\x75\x03" + "\xa6\x95\xda\x2d\xf5\x3c\x4e\x43\xbe\x7a\x7d\xba\xce\xfd\xbe\xf2" + "\x53\x9e\x04\x57\x29\xb3\x5b\x8a\x11\xd6\x0c\xa3\xcb\x74\x1a\x0e" + "\x6f\x29\xe0\xfd\xf1\x57\x97\x01\x95\x39\x56\x78\x00\x28\xde\xc3" + "\xbe\x3b\x8f\x75\x6f\x27\x19\xf5\xfb\xcb\x3b\x2d\x28\x9f\x7d\xc7" + "\x0a\x6b\x61\x66\x77\xd9\x50\xa4\x87\x06\xd3\x7d\xc7\xba\x5b\x10" + "\xf6\xa8\x90\xd9\x4d\xde\xc4\x63\x85\xdb\xc1\xab\x3b\xd5\xe5\x2d" + "\xef\x2c\xcf\xde\xd4\xc7\x66\x16\xb2\x0f\x9e\xed\x2e\x43\x39\x3d" + "\x00\x33\xcf\x7a\xa3\xda\xcc\x28\xf3\x9b\xdc\x98\xee\xe5\xf2\x3f" + "\xf3\x6c\x0f\x9b\xf5\x02\x3b\x9f\xbd\xe9\x0b\x76\xac\xb0\x00\x16" + "\xb9\x20\xe1\x9a\x6d\xcc\x4f\x7a\x71\xb4\xe3\x00\x5c\x73\xa2\x0b" + "\x48\x27\x66\x2c\xf1\xb3\x99\x67\xcf\xb3\x45\x2f\xd0\x19\xf0\x19" + "\xd8\x46\xa4\x8b\xab\x16\xe9\xdd\xa9\x3b\x56\xf8\x1e\xb6\x01\xf5" + "\xc6\x92\x86\x69\xef\x22\xac\x2d\xf1\xd9\xb3\x7a\x38\xda\x51\x0b" + "\xde\x98\x53\x5d\xbe\x1d\xa7\x3c\xfe\x98\xce\x64\x16\x83\xb4\xdf" + "\xd1\x69\xf1\xc5\x74\xee\xf7\xee\xe8\x2c\x67\x15\x9d\x1e\xe4\x53" + "\x0c\xf1\xbc\xd7\x0a\x06\x7c\xbe\xd8\xcb\xe5\xe8\x34\xf2\xe9\xb4" + "\x11\xfd\x6c\x46\xb4\x64\x3b\x4e\xeb\x84\x0e\x9c\x36\xf6\xc5\x9c" + "\x4e\x66\x15\xf8\xcb\xe5\xf0\x74\x3a\xc9\x25\x9d\xe5\x83\x69\x0f" + "\xf8\xb0\x2c\xe6\x67\xe1\x95\x87\x57\x21\xa6\x1d\x46\xfc\xc3\x08" + "\xbf\xbf\xfc\x74\x2b\xe2\x6c\x1f\x07\xa0\x6b\x73\x75\x00\xcd\x73" + "\xf0\x79\x01\xcb\x5f\xb0\xcd\x24\x53\x5e\xfc\xf5\xa2\x6e\x9c\x3e" + "\xec\x7f\xa4\x86\xeb\x20\xd6\xd7\x9e\xed\x9b\xc4\x16\x5d\x20\x7d" + "\xc2\xf4\x1d\x88\x23\xf6\xb4\xc7\xc3\xe5\xf5\xb4\x9b\xda\xd0\xf7" + "\x92\x91\xf0\x68\xd9\x8e\x2e\x1d\xab\xe8\xda\xec\x62\x46\xf0\x97" + "\x77\x59\xfc\xba\xae\x76\x56\xde\x85\xfa\xd0\x55\xe7\x2b\xef\xda" + "\xff\x64\x34\x73\x92\xfd\xea\x7b\x15\xb0\x9e\x43\xe0\x7d\x84\xb1" + "\x36\xf3\x76\xbc\x7f\x1f\xb8\x0e\x5b\x3e\xe7\x72\x75\xac\xfb\x73" + "\xa4\xe5\xaf\x30\xbd\x85\xdb\x31\xa2\x3d\x8b\xe9\xaa\x5b\x74\xe1" + "\xa6\x32\x92\x85\x45\x66\x28\xc3\xba\xca\xfd\x3b\xba\x2c\xbe\x1d" + "\x5d\xfb\xfd\x31\x58\x4f\xec\xd7\x37\x79\xb8\x5e\x7f\x8d\x72\x7d" + "\x88\x9f\xf9\x48\xf2\xc4\x76\x7c\x9d\x1c\xc9\x96\x92\x4d\x23\x1b" + "\x96\xed\xf5\x90\x7c\x9d\x26\xfb\x47\xb6\x0c\x6d\xc1\x62\xc5\x96" + "\x91\x1d\xa3\x58\x8c\x6c\x99\x5f\xb6\x65\x7e\xd9\x96\xf9\x55\xb6" + "\x0c\xe9\xaf\x45\x79\xf7\x70\xfb\x85\xf4\x24\xdb\x95\xed\x33\xb1" + "\x50\xdb\x45\x65\x7c\x68\x97\xfc\x68\x97\xf0\xea\xf2\x0b\xbb\x64" + "\x94\xed\x92\xa4\xd8\x25\xc4\x47\x76\xdb\x1f\xce\x2e\xf9\x65\xbb" + "\xe4\x93\xed\x92\x5f\xb6\x4b\xfe\x4b\xd9\x25\xdd\x29\xec\xef\xa9" + "\x3a\x5a\x6f\x85\x7a\x53\x46\x7c\xce\xde\xe4\x2f\x43\x9b\x81\x74" + "\x3c\x55\xe7\x17\xf6\xe8\x30\xc6\x61\x12\xd9\x23\x1f\x96\xf7\x2b" + "\xf6\xc8\xcd\xed\x5a\x3b\xd9\x24\xe2\xdd\x62\xaf\x01\xc8\x16\x71" + "\xbb\xe3\x1d\xe9\x25\xbb\x83\xf4\x9b\x14\x6a\x77\x10\x5f\x17\xde" + "\xeb\x45\xfd\x9d\xc9\x89\x68\x03\x12\xbd\xa5\x2c\xdb\xe2\xe2\x34" + "\x5a\x6c\x29\x2e\x23\x99\xf3\x95\x77\x1a\x59\x5b\x19\xf8\x75\xa8" + "\x23\x68\x9f\xec\x16\x1f\xa0\xee\x5a\xbc\x68\x2f\xd0\x5e\x95\xfb" + "\x50\x97\x67\x76\xf7\xd8\x67\x99\x61\xe8\x22\x97\x51\x3f\xf3\x2c" + "\x73\x22\x6d\x1c\x8b\xcc\x65\x30\xcb\x65\x44\xfb\xf0\x3e\xcc\xe8" + "\x60\xfe\x19\xf9\x0e\x03\xea\x62\xf9\xcc\x95\xb6\xc4\x45\x2f\xe8" + "\x61\xd6\x05\x66\x43\xfb\xf1\xaf\x33\xcf\xea\x13\x17\x76\xc0\x88" + "\x19\x4b\x98\xdf\x87\xba\x88\x7d\xf5\xa0\x0e\xea\x50\x17\x93\x7d" + "\x3b\x3a\x8d\xa8\x87\x16\x2f\xea\xa3\x5a\x17\x59\x6c\xe7\x45\xbc" + "\x37\xf0\x7e\x94\x9f\x36\xa2\xde\xe8\xfc\x7c\xbc\xeb\xe0\xb1\x2f" + "\xea\x82\x91\xeb\x4f\x0c\xa6\xef\x10\xfa\xe8\x67\x42\x1f\xfd\x44" + "\x3b\x49\xe8\x23\xf1\x04\xf3\xb3\xf0\xca\xc3\x2b\x48\x1f\x49\xcf" + "\x18\xe9\x99\xf9\x42\x40\xcf\x5e\x90\xf5\x2c\x46\xe8\x99\x0f\x7d" + "\x1a\xdf\x4b\x42\xd7\x08\x3f\xc5\xc7\xfd\xba\x16\xdb\x65\xa1\x33" + "\x08\x84\xdc\x70\x7d\x23\x5d\x43\x1b\xdb\x55\x87\xfa\x87\xf8\x98" + "\x93\xf4\x00\xe5\xf2\xaf\x34\x1e\xce\x32\xb3\xbf\x2e\xf6\xdd\x84" + "\x3c\xef\xda\x8f\xf6\xee\x8b\x99\xdd\xec\xaf\x68\xeb\x9a\x10\x97" + "\x05\x75\xa8\x1c\x75\xa9\x0e\x75\x8a\x74\x29\xd9\xf7\x12\xe1\xfc" + "\x3a\xb9\x1f\x07\x1f\x4f\x83\x75\xe9\x52\xf3\xb4\x6e\xeb\x03\xc5" + "\x0e\xf0\x8a\xb3\xac\xac\x0f\xa0\xff\xe3\x4b\x96\xef\x2b\x1d\xf0" + "\x57\xbe\xdf\x3f\xe9\xa0\x79\x2b\x5c\x77\x06\xd2\x33\x51\xde\x01" + "\xef\xe3\xf0\x7e\x4a\xf6\xe8\x0f\x98\xbf\x72\xfc\x7e\xac\xdb\x4d" + "\x7a\xc8\xac\x69\xe4\xef\x65\xa2\x1c\xea\x98\xdb\x18\xc7\x62\xdd" + "\x7f\x62\x7d\xc9\x34\x17\x98\x88\xcf\x09\x48\x83\x54\xfc\x1d\xbe" + "\xf7\x22\x24\xe1\x95\xbc\xd7\xea\x2f\x23\x1f\x0b\xef\x4d\x6c\x63" + "\x72\x6c\xf5\x06\x18\x93\xe8\x12\x67\xb0\x26\x6e\xd3\xd3\x9c\x58" + "\x12\xdd\x33\xeb\x49\x4b\xe3\x45\xf9\x1c\xd6\x78\xac\x4f\x7d\x0e" + "\xab\x15\x92\x1b\xad\xec\xa0\xcf\x4d\x74\xe8\x28\x57\xda\x42\x6d" + "\xc3\x76\xde\x82\xed\xcc\x9d\xbb\x29\x13\x3e\xb6\x84\xdf\xdf\xd1" + "\x6d\x4d\xef\xef\x7f\x84\xfc\x5a\x85\x26\x11\xf2\x0f\x29\x74\x8a" + "\xb4\x96\x94\xc6\x72\xdf\x06\xd6\x4d\x7b\x85\xd3\x3c\x45\xa9\x97" + "\xfd\x07\xd2\xb1\x6c\xab\x0f\x74\xd9\x16\x0f\xb3\x77\x33\x9b\xdd" + "\x72\x16\x1a\x69\xff\xf2\x12\x1c\x3f\x63\xdc\x87\xd8\x0e\xf7\xc1" + "\x9e\x0d\xcc\x4b\xf3\x4c\x6e\xeb\x83\xc9\x0e\x58\xa8\x17\xbc\xe8" + "\xd4\xf1\xf8\x56\xe7\x3e\x88\xb8\x86\x11\xae\x63\x58\xde\xb7\xc3" + "\x8d\xf2\xfa\x60\xa6\x43\x73\x0d\x5f\x93\x8f\x7a\xac\x33\x6f\x86" + "\x9b\xcf\xc0\x83\xfc\x7c\x47\x56\xee\x6e\x25\x7b\x80\x69\x7a\x4c" + "\xdb\x8e\xf8\x8f\x22\xbc\xd9\x01\x17\xe5\xb5\x71\x0f\x6e\x57\xe0" + "\xf0\x3e\x2f\x74\x9d\x9c\xfc\x55\x66\x59\xd0\x7e\x73\x1a\x08\xde" + "\x3d\x8f\x76\xaa\xcb\x0c\x9f\x1d\xb0\xe7\x9d\xe5\x74\xee\x57\xe9" + "\x16\x48\x41\xfe\x50\xfb\xbe\xc5\x98\xa6\x93\x59\x1f\xac\x79\x67" + "\xb3\x07\xe3\x8e\x87\xb4\x0e\x38\xa6\x8b\x44\x4f\xff\x45\xd6\x81" + "\x38\x8c\xbb\x36\x00\x10\x7d\x88\x9e\xa8\x37\x7e\xa4\xc3\x97\x64" + "\x8f\x1a\x37\x50\x9c\xff\x50\x96\x42\xaf\xc8\x3c\x71\x8b\xfd\xb6" + "\xe1\xa1\xfd\xcc\xca\xc0\x36\x82\xde\x9b\x3c\xf4\x0b\x41\x83\xd3" + "\xc9\x3d\x68\x47\x68\x0e\x9b\xce\xe8\x5a\x9f\xcc\xd0\xde\x3c\x84" + "\xfe\xff\xe4\xfe\xfd\x51\xed\xde\xa9\x64\x5b\xc2\x8e\x59\x7c\x6f" + "\xd4\x7e\xfc\x0f\xb7\xb6\xa5\x00\x70\xdb\x14\xa7\xd5\x6e\x15\xfc" + "\xf7\x10\x5e\xfa\xb6\xa4\x03\xf3\xd7\xbb\x58\x17\xab\x8c\xf2\x50" + "\xac\x41\xfb\x8c\x62\xda\x27\x28\xd7\xcc\x56\x44\x6d\x7a\xf8\x13" + "\xdb\x88\x5e\xe8\xb4\x40\x54\x63\xff\xbc\xd4\xc3\x87\x68\x1e\x4a" + "\xcc\xbf\x3d\x8c\x31\xd0\xd4\xcf\x95\x76\x91\x1f\x82\xb4\xd5\x91" + "\x5f\x42\xfe\x08\xbd\x17\x59\x5f\xc2\x3c\xe4\x97\x20\x6c\xbe\xd2" + "\x07\xea\x9f\xe8\xd7\xc3\xc5\xea\x7e\xd1\x5a\x81\xc4\x12\x41\x83" + "\xf5\x9b\x40\xc7\xcf\x0c\xf2\xd1\x7b\x95\xa9\xbc\x2f\xd4\x67\xde" + "\x17\x6e\x63\x29\x9e\xb8\x0f\x63\x3b\x9e\x6e\x44\x5c\x36\x07\x4c" + "\xc9\x14\xf2\xf4\x70\x5a\xa4\x6f\x66\x70\x7c\x6a\xc7\x58\x78\x44" + "\xa9\x9f\x9d\xec\x84\x8c\x99\x62\x4e\x2f\x63\xa6\x9f\x7c\x71\x0f" + "\xc9\xae\xcf\x41\x63\xb1\xbd\x84\xec\x2d\x87\xbd\x16\x61\x3b\x10" + "\x66\xa2\x0c\x3b\x91\x9f\x4b\x28\x7e\x87\xd2\x2f\x8e\x61\x7f\x76" + "\x40\x46\x2e\xcd\x33\xb3\xb8\x28\x9b\xf2\xcc\xf0\x19\x7f\xe3\xd8" + "\x0e\x9f\x23\x7c\x5b\xba\xda\x69\x2c\xf3\x5d\x64\xdd\x58\xcf\x0d" + "\x24\x47\xa5\x9b\xe0\x46\x94\xc9\x2f\xb7\x6e\x81\xeb\x48\xc6\x58" + "\x8c\xfb\xb8\xa0\x7b\x46\x13\xb3\xa2\xdf\x8b\x16\xd5\xbc\x01\x6e" + "\x46\x1d\x6a\x3d\x03\x19\xbf\x5b\x5c\x62\xc0\xb6\x02\xec\x3a\x07" + "\xe4\x9f\x7c\x81\xf0\x47\x29\xc6\x69\x3c\x47\xb2\x98\xf1\xb9\x22" + "\x8b\x78\xef\xb8\x94\xad\x40\xba\xe6\x89\x39\x90\x89\x33\xe9\x1d" + "\xc8\x49\x98\x98\x4e\xfd\x15\x6b\xae\x27\x8e\x66\x17\x59\x0a\x13" + "\x63\x1a\xca\xf7\xc4\x02\xfc\xcd\xe3\x17\xda\x12\xf9\x39\x0b\xe1" + "\x92\xd9\x45\x1f\xc1\xe4\x61\x9a\x89\x59\x35\xa4\x27\xf5\x6e\xeb" + "\xc4\x85\x0e\x58\x6c\x14\xbc\x99\x68\x24\x5c\x11\xda\x90\xc5\xf8" + "\x3e\xbb\xdf\x60\x7f\x27\x7e\x6c\xd8\x4a\x73\xaa\x13\xf9\x3a\x6f" + "\xc2\xd5\x28\x09\x9b\x8d\x3e\x6a\x5e\x83\xd5\x5f\x88\xf6\xb9\xd0" + "\x5f\x0d\x75\xfc\x5e\xce\x63\xf2\x38\x1a\x16\x7f\xa5\x56\x4b\x7b" + "\x87\x77\xc0\x23\x06\x8e\x07\xe5\xde\x76\xd3\x19\x7a\xa6\x8d\x11" + "\x34\xae\x38\x4d\x9d\xbd\x2e\x53\x9c\xd3\x88\x30\x22\xd6\x7f\x64" + "\x64\x0f\xd6\xe1\xb6\x3e\x62\x70\xc0\x34\x4e\x4b\x67\xbc\xa6\x2e" + "\xe2\xf7\x58\xa8\x03\xa4\x73\x42\xa7\x27\x5d\x38\xd6\xc4\xf5\x2f" + "\x1d\x65\x3e\x4f\xb6\xbf\x34\x5f\x14\x77\x12\x26\xb9\x8e\x25\x73" + "\xf9\x96\x98\xf4\x48\x59\xd0\x59\x72\x98\x37\xf0\x7a\xe4\x10\x5e" + "\x2d\x78\x1d\x97\x9f\x4f\xe0\xe5\xc4\x7b\xb4\x7a\x93\x3a\x38\xed" + "\xde\x2a\xd0\x38\x30\xaf\x07\xfd\x7a\x7a\x76\xc0\x23\xef\xb1\xb7" + "\x52\x25\xe5\xbe\xf1\x0d\x9a\x4b\x78\xa4\x0b\x79\x20\xbf\x63\x25" + "\x3c\xa0\xc1\xb6\x11\xdd\x59\x69\x1d\xf3\xb4\x6c\x75\x51\xbb\x93" + "\x5b\xea\x5c\x60\xb8\x83\xfa\x3f\x89\xf8\xce\x68\xcd\x0c\xfd\xae" + "\xaf\x63\xce\xe6\x7a\x2f\xd0\xbb\x43\xb7\x75\x12\xea\x7f\x63\x3d" + "\xb7\xf9\xd5\x5a\x13\xe1\x93\x65\x82\x29\xfd\x17\x74\xd6\xd4\x19" + "\x36\x68\xe8\x79\x5b\x03\xcd\x21\x56\x5c\x48\x63\xa5\x79\xf2\x5a" + "\x89\x49\x9b\x50\xcf\x27\xd1\x39\x93\xe7\x60\xd2\xfb\x0c\x69\xdd" + "\x5c\xc8\xcf\xac\x72\xe2\xf8\xd3\xdd\xc0\xd7\x37\x4d\x42\xfb\x37" + "\xf1\x38\x7f\x17\x84\xe9\xdc\xd6\x20\xce\x6a\xcc\xc3\xf1\xa8\xfb" + "\x58\xa1\x07\x7c\xd4\x67\x2c\xfb\xfe\x45\x8f\x36\xb1\x18\x34\x5b" + "\xe9\x0c\x78\x6c\x07\x43\x5e\x09\x5b\x36\x29\x67\xcb\x59\xe6\x51" + "\xfa\xdc\xdc\x44\xfa\x31\xc9\xe5\x80\x5f\x0e\x58\xcf\xa3\x3a\x7f" + "\x53\xee\xc7\xa3\xc3\x9a\x53\x05\x1f\xfd\x48\xab\x60\x3e\x3e\xaa" + "\x17\x3c\xcc\x9c\x12\xcc\xc3\x47\x71\x44\xca\xac\xc4\x6b\x1f\x5e" + "\x87\xc4\xb3\xfa\xca\xb4\xa8\xee\x91\xaf\x99\xa8\xa3\x99\xdb\xd1" + "\x5e\x74\x0b\xde\x50\x3a\xca\x33\xc9\xcd\xdf\x70\xec\xe9\xcb\x03" + "\x7a\xbf\x4c\xe9\x24\xe3\x94\xee\x47\xff\xc6\x01\x99\x75\x98\xaf" + "\x27\xfd\xa5\xf3\xbf\xd4\xf9\xfd\xe7\x3c\x40\xe6\x57\x84\x2b\x71" + "\x5b\x79\x39\xc9\x2e\x96\xa9\x4f\xf4\x96\x63\x0c\x90\xe9\x52\xe8" + "\x8a\x69\x27\x28\x9f\xe4\xd4\x6d\x7d\x34\x0e\xe9\xc2\xc7\x72\x17" + "\xc6\x89\xe1\x7d\x8f\x47\x4d\xfd\x3e\x9a\xee\xf4\x61\xe2\x65\x37" + "\x3c\x96\x81\x76\x4c\xc3\x2a\xa1\x46\x8c\x3f\x8f\x4d\xa4\x67\xb4" + "\x9f\x5f\xe2\x7d\xfa\x31\xb4\x53\xbd\x15\xae\x83\x7d\x12\x0c\xed" + "\x95\xb0\xc3\xd5\xe3\x8f\x7a\x63\xbb\xdf\xb3\x77\x1d\x82\x36\xef" + "\x6f\xc1\xf0\x3c\xc7\x31\x81\xce\xa1\x2b\xdd\xc4\x7c\xbf\xee\xdd" + "\xaf\xb5\x7b\xcf\xdb\xf8\x99\xab\xf0\x18\xa7\xc7\xce\x93\xe8\x05" + "\x2c\xe2\xb8\x05\x7d\xe2\xc6\xef\xaf\x5e\xce\xbc\xd5\x9d\xb4\x37" + "\x7d\x72\x6c\x55\x2f\x8c\x79\x73\x33\x98\xea\x7b\x21\xb5\xa1\x17" + "\x8c\xec\xb4\x51\xaa\x47\x3f\x6e\xd1\x05\x3d\x9d\x45\x9e\x97\x60" + "\x06\x5d\xc3\x66\xf4\xe7\xbc\xa0\xf1\x55\xa1\x3f\xe7\x45\x7f\xee" + "\xbc\x91\xec\x65\xbf\x3f\xd7\xc7\x7d\x65\x4f\x06\x3f\xab\x74\x87" + "\x27\x23\xbe\x10\x34\x71\xf9\xa0\xc7\xf6\x95\x9e\x83\x47\x5f\x88" + "\xeb\x40\x5f\x12\xfb\xec\x90\xfb\x8b\x34\xdf\x9e\x58\x08\x43\x79" + "\x5f\xd1\x86\xb3\x2a\xa8\x89\x38\x36\x4b\x24\x53\x2e\xd2\x25\xea" + "\xc3\x0e\x7a\xc7\x7d\xe8\x26\x8f\x76\x7d\x3d\xf3\x50\x7a\xf1\x48" + "\xe6\xc1\x74\x33\xd5\x7d\x10\xd3\xdd\xd6\xc7\xea\x1c\x92\xa3\x24" + "\x92\x8c\x62\xbc\x24\xdb\x9a\xc9\x37\x32\xa9\x8c\x64\xd4\xb3\xc5" + "\x8b\xfe\xf8\x39\xd2\xe3\xc9\xc9\xd9\xab\x99\xd7\xb0\x96\xd6\x1b" + "\x4c\xd6\xd1\x5a\x08\x7a\x07\xfa\x4f\xe8\xeb\x5c\x6e\xfd\x03\x8d" + "\x21\x14\x3f\x24\xae\x46\x9c\x15\xa7\x3d\xac\xd4\x18\x66\x5f\xf1" + "\x88\xdf\xbf\xc6\x89\x6f\x5b\x27\xe7\x3a\x60\x2d\x7f\x3f\xc7\xbf" + "\x07\xe2\xf6\x74\x4a\x9a\x0b\x69\x10\x6c\x03\xa6\xe8\x68\x9f\xf4" + "\x9e\xf2\x0b\x19\xb6\x11\x64\xfb\xa7\x68\x84\x2f\x74\x21\x5d\x8c" + "\x05\x93\xbf\x14\xef\x2b\x26\xef\x73\xc0\x1c\x3e\xc6\x9b\x47\x91" + "\x4c\x4c\x3e\xc1\x62\x2f\x3c\x4c\x70\xe3\xca\xa0\x6c\x9d\x17\xf2" + "\xd9\x8e\x0b\xe9\x8c\xeb\xca\x39\x60\xaf\xaf\x72\xd3\x37\x3e\xae" + "\x1b\x16\xb8\xd1\x37\x48\xc3\xbc\x0c\xaa\xc3\x89\x30\x48\xf7\x18" + "\xb1\x56\x62\x32\xda\x84\xa7\x64\x7b\x38\xf9\xa8\x98\x87\x9e\x7c" + "\xb4\x07\xcb\xa2\xaf\x78\xad\xdb\x3a\x05\xfd\xdf\x55\x25\xf2\x3b" + "\x75\xe7\xcb\xfc\xdb\xd4\x29\x63\x1c\xb0\xda\x46\x69\xc5\x23\x21" + "\xb9\xd8\xc0\xba\x22\xfa\x7a\x41\xfd\x9c\xfa\x1b\xbe\xee\x4f\x82" + "\x1b\x10\x87\x59\xc1\x8b\xe3\xed\x2f\x7b\xa4\xb9\x73\x31\x6d\xbb" + "\x82\x17\x61\xae\xc3\xe7\xda\x7e\x18\x51\x66\x9f\xaa\xcc\xdc\x1e" + "\xe9\xae\x5f\x62\xda\xe1\x90\x32\xad\x21\x65\xda\x55\x65\xca\xe4" + "\x7a\xba\x43\xca\x78\x83\xcb\x4c\x8d\x1b\xd8\xb6\xa9\x86\xe0\x32" + "\x53\x4d\x21\x65\x32\x07\xb6\x6d\x6a\x6e\x48\x99\x82\x90\x32\xc5" + "\x2a\xda\xd2\xfa\x25\x13\xa6\x95\x87\x94\xa9\x0b\x29\xb3\x5f\x79" + "\x46\xdf\xb3\x55\xf8\x06\x28\x4f\xc8\x53\xe4\x6b\x06\xe6\x63\xff" + "\xe7\x46\x3c\x0b\x80\x64\x13\x65\x26\xad\x74\xaf\x38\xb7\x97\xec" + "\x2a\xad\x77\x20\x7b\x4e\xef\x64\x48\x26\xc8\xef\xa4\xba\x3a\xe1" + "\xf1\x0b\x24\x43\x6e\xeb\xe3\x29\x03\xe9\xf1\xb8\x29\xb8\x9d\x8f" + "\x67\x06\xb7\xf3\xf1\x9c\x81\xf4\x78\xbc\x20\xa4\x4c\x71\x48\x99" + "\xed\xaa\x32\x4d\x72\x3d\x75\x21\x65\xf6\x87\x94\x39\x3c\x50\x3e" + "\x1f\x3f\x1a\x52\xe6\x44\x48\x99\xee\x00\x0d\xa7\x91\x12\x6b\x48" + "\x1f\xdc\xd6\x69\x18\xff\xe4\x8e\xb9\x04\xed\xf4\x8a\x3c\x2b\xdf" + "\x6a\x0b\xb9\x9e\xb6\xa3\x56\x7c\xa7\xc7\xcf\x48\xe8\x80\x69\x7b" + "\x95\x77\xd9\xef\xf4\x7a\xa2\xe9\x1d\x2b\xd2\xb6\xab\xd9\xe2\xc1" + "\x31\x77\x5a\xa1\x03\x66\x36\x29\x6b\x59\x68\xfd\x0f\x3f\x63\x87" + "\xc7\x23\xd3\xb2\x84\xfe\x4d\xab\x97\xdf\xfb\x50\x7f\x30\xce\x98" + "\x56\x7f\x75\xed\xca\x9a\x48\xed\xa2\xb3\x26\x10\x87\xa3\x3f\xd6" + "\xe8\x6f\x2b\xd5\x99\xa5\x9c\x85\xe7\x6c\x14\x6b\x90\x68\x6d\xb2" + "\x93\xce\xff\x70\x5b\xb3\x92\x54\xf1\x09\xb5\xd5\x75\x68\xb3\x47" + "\x1b\xd2\x66\x97\x68\x73\x56\x96\xb0\x51\x59\x59\x8a\x3d\x89\x28" + "\x7f\x95\x51\x5d\x6d\xd8\x43\x5a\x63\x71\xac\x1e\xfd\x4d\x8c\xb1" + "\xa8\xdd\x27\x21\xab\x86\xfb\xbf\x6b\x7b\x81\xee\xed\x25\x0f\xf1" + "\x35\x18\x72\x5f\x5a\xe9\x9c\x67\xf2\x7d\x5a\xcc\xdf\xd0\x3a\x40" + "\xc6\xcf\x7c\x82\xac\x0b\xcd\x25\x4e\x6a\xab\x4d\x59\xaf\x84\x6d" + "\x11\x7e\x5d\x65\x14\xad\xb1\x70\xd2\x5a\xaa\x66\x57\x3a\xc1\x74" + "\x20\x6d\x95\xf5\x12\xdd\x74\x66\x34\xc2\xd6\x47\x8a\x95\xd4\x74" + "\x15\x6d\x78\x72\x89\x90\x9f\xe9\x63\x82\xf5\x21\x1a\xe5\x74\x7a" + "\x66\xb0\xcc\x4d\xcf\x09\x96\xb9\xe9\xf9\xc1\xfa\x20\xa1\x3e\x4c" + "\x2f\x0e\x29\xb3\x3d\xa4\x4c\xad\xaa\x4c\x8d\x5c\xcf\xfe\x90\x32" + "\x87\x43\xca\xa8\xed\x1f\xf6\x79\x7a\x7b\x7f\xdc\xc9\xed\xfd\xf4" + "\x2e\xd5\xb3\x54\xcb\xc7\xa9\xe9\x5e\x25\x4d\xfe\x0e\x9a\xaf\xcd" + "\x12\xf8\x9e\x48\x0e\xb1\x51\x08\xff\xc4\x98\xe0\x36\x3c\x91\x11" + "\xdc\x86\x27\x66\x28\xcf\xf2\x7a\x8e\x8f\x3a\xe1\x09\xe5\x2c\x4a" + "\x57\xe2\x36\x78\x2a\xd1\x3b\x7b\x3e\xf9\x66\x34\x3e\xf1\x35\x73" + "\x5b\xd0\xa7\xbc\x40\xef\x0c\x3c\xd0\x59\x0c\x51\x74\x0e\x8d\x03" + "\x9e\x6c\x61\x31\x9e\x74\x5a\x53\x8f\xfe\x54\x36\xe2\x58\x88\xf5" + "\xd7\x61\x1d\x48\xbb\x27\x0e\x86\xb4\xc1\x16\xd2\x86\xe3\xaa\x67" + "\x3d\x3e\x3b\x54\xfd\xd6\xd3\xbe\x14\xaf\x71\xdf\xfa\x09\x8f\x92" + "\x4e\x73\x00\xd8\xc7\xae\x52\xee\x07\x64\xd2\x3a\xc5\xe1\x27\xe1" + "\x89\x53\x34\x5f\x20\x70\x3e\x99\xaa\xa6\xad\xa0\xc5\x93\xe9\xc1" + "\xed\x78\x32\x2b\xb8\x1d\x4f\xe6\x05\x6c\xcd\x13\xf2\x5a\x98\x27" + "\x57\x3b\x60\x1e\x3f\x9f\x1e\x69\x61\x48\xf4\x1a\xae\xb5\x8d\x22" + "\x3f\xf5\xc9\xdf\xbb\xb0\xbf\xec\x55\x69\xb8\xfc\xfc\x3e\x1b\x45" + "\x7e\xb7\x27\x1d\xed\x33\x7d\xab\x7b\x2b\xa6\xb5\x08\xbe\x3e\x89" + "\xfd\x9f\x23\xce\x92\xc2\x34\x3e\x0e\x8c\x22\xff\xf7\xc9\x1a\x16" + "\x1f\xe5\x89\x24\xcf\x3d\x09\x51\x4e\x65\x4d\x2f\xe2\x70\x29\xfa" + "\xe0\xaf\x8e\x72\xfa\x77\xb0\x1c\xb7\x75\x86\xce\x01\xd3\x41\xbc" + "\x6b\xf5\xd7\xa3\xec\xd7\x21\xff\x30\x06\x9e\x21\xc7\x32\x5a\x3a" + "\x57\x88\xd6\xc8\xd1\x59\x57\x71\x62\x2d\xc8\x8c\x0c\x95\x5e\xb9" + "\x0c\x9b\x27\xb1\x93\x30\x93\x6c\xaa\x9e\xec\x06\xad\x79\x6c\xf6" + "\x3a\x81\xe6\x59\xec\xde\x33\xdc\x27\xc7\x7c\x90\xcb\x5a\x54\x65" + "\x9d\xf2\x3c\x48\x17\xe5\x8d\xf7\x82\xb6\xd9\xe5\xa4\x33\x7d\x93" + "\x84\x1f\x3f\x53\xd3\x8c\xf6\x02\xcb\x1c\x50\xca\xd0\x9c\x09\x5f" + "\x57\x50\x0c\xda\x71\x25\xa0\xb5\x6d\x3e\xc9\x71\x2b\x6b\x87\x28" + "\x3e\xb2\x97\x74\x81\xdd\xd5\x4e\x73\x9a\x5a\xb1\x4e\x6c\x26\x44" + "\x79\x40\xd7\x53\x15\x85\x32\x31\x13\x7c\x55\x51\x5d\x18\x1b\x23" + "\xed\x66\xa4\x92\x0d\x54\xd3\x6e\xea\xd4\x9c\xd9\xd9\x33\xc7\x3e" + "\x3d\x7b\x7a\xee\xd4\x87\x0c\xb9\x2b\xd7\x2c\x2b\x18\xbb\xee\xc5" + "\x62\xc3\xc6\xa2\x95\xc5\x2b\xd7\xae\xe0\xc7\x90\x19\x96\x14\x8b" + "\x5f\xe3\xea\x25\xeb\x8b\x27\xd2\xed\x18\x83\xb9\x68\xd9\x06\x7e" + "\x3b\x3a\x16\x82\x91\xac\x2c\x5e\x56\x64\xb8\xbd\x60\x8c\xe1\xf1" + "\x25\x2b\x57\xd3\x57\x13\xe1\x70\x3d\x64\x28\x5a\x56\xb4\x6c\x49" + "\x81\x61\xa2\xc1\x44\x98\xd5\xe8\x54\xfc\x34\x29\xf6\x69\x3d\x8e" + "\xe7\xe8\x43\x77\x91\x9d\xa2\x71\xbd\x13\xb2\x4f\x91\x0f\xc7\xcf" + "\x0d\x43\x39\xc4\x31\xc1\xe1\xb6\xce\xec\x18\x38\x8e\xcf\xf4\x04" + "\xcb\xef\x2c\x5d\xb0\xfc\xce\x4a\x1e\x38\x8e\xcf\x0a\xd1\xff\x59" + "\x21\xfa\x3f\x6b\xc6\xc0\x71\x7c\x56\x7e\x48\x19\x73\x48\x99\xb2" + "\x7e\x3b\x83\x6d\x7d\x99\xdb\xa5\x59\xb5\x21\x65\xf6\x85\x94\x39" + "\x14\xf2\xdc\xa2\x7a\x46\xdf\x75\xd6\xe7\x6a\xdf\x00\x9f\x3b\x14" + "\x5d\x0f\xd8\xb7\x59\x1e\x05\x86\xc6\x1e\xfa\xb6\x46\xc0\x66\xeb" + "\x55\xb0\x5d\x02\x36\xbb\x5f\xff\xc9\x26\xd1\x5a\x51\xe1\x9f\x67" + "\xff\x44\xb6\x6d\x1d\xbb\x02\x63\x68\x07\xf2\xe2\xd6\x73\x90\x4d" + "\xeb\x80\x09\xd6\x49\xeb\x87\xd9\xeb\x0b\xdc\x8d\xc3\x41\x47\x65" + "\xe9\xdc\x2c\x66\x9d\xc9\xbf\xa3\xc7\xb4\x38\xbc\xd0\x4e\x65\x97" + "\x2b\x6b\xf5\xb7\x23\x8c\x03\xf8\x71\x3a\x1a\x2a\xb7\x9d\xaf\x73" + "\xa4\xfa\x72\xe8\x3b\x1f\xfa\xf6\x5c\xb7\x4b\xec\x59\xd1\x41\xe7" + "\xb9\x51\xdd\x88\x43\xcb\xa4\x99\x4f\xc9\xe7\x72\xe9\xf1\x4a\x42" + "\x9c\xfd\xeb\xff\x1d\x90\xcd\xbf\x13\x22\x9f\x8f\x7c\x3d\xe1\xf7" + "\x64\x7b\x15\xff\x82\x62\x85\x70\xb6\x23\xfc\x5a\x70\x48\xdc\x65" + "\xf5\xb7\xdb\xb6\x76\x50\x9b\xc6\x90\x1f\x6a\x4f\xf6\x42\x5b\xbd" + "\x17\xe3\x57\xd0\xf3\x78\xca\x72\x16\xec\x4d\x5e\xa0\xf9\xe1\xc5" + "\x16\x28\x6b\x94\xfc\xed\xac\xbf\x1c\xc5\x68\x39\xfc\xbb\xf0\xed" + "\x94\x8e\xe5\x31\x96\x70\xd2\x9a\xf1\x08\xf3\x11\x89\x04\x67\x1b" + "\x45\xf1\x5e\x4e\xbd\xec\xfb\x96\x37\x22\xae\xb0\xeb\x99\x25\xb0" + "\xbb\xad\x39\x38\xfe\x59\x32\x15\x9b\xdd\x5c\xc7\x6d\x9f\x84\xe9" + "\x38\xf6\xe7\x18\x22\xf9\x29\xb2\x7d\x37\xd3\x3a\x36\xb7\xf5\xa9" + "\x94\x4b\xc1\x52\xbb\x9b\xb1\xdf\xa8\x8b\x99\xef\x6c\x35\x45\xcb" + "\xf6\x55\x87\xe5\x72\x95\x72\x57\xd2\x3f\xf2\x8d\x68\x3c\x46\x5d" + "\x75\x89\x58\x71\xf6\x27\xaf\xf1\x35\xd2\x4f\xa1\xff\x97\xa3\xe8" + "\xc1\x35\xf8\x8c\xf6\xef\x29\x3e\x9f\xc8\xd7\xfe\x60\x3c\xb9\xde" + "\x8c\x3e\x5b\xb2\x0b\x6d\xe3\x53\xad\x4a\x1e\x9f\x27\xa2\xbc\x12" + "\xe6\x69\x4e\xee\xa0\xbc\x8e\xfe\x3c\xf1\xcd\x02\x6b\xb6\x78\x29" + "\xdd\xab\xa4\x8b\xb1\x65\x76\x5c\xc8\x73\x8a\xf2\x8c\xf7\x46\x6c" + "\x4b\x8d\x8c\xdf\x89\x36\x57\x23\xf6\x78\x98\xbd\xa3\x81\xeb\xcd" + "\xec\x2c\x25\x9f\xcf\xa9\xbd\x4d\xef\xc6\x5c\xe0\x8f\xbd\x90\xc9" + "\x7d\x2e\x2c\xf3\xeb\x6f\x3c\xd1\x18\x63\x68\x18\x9d\xe1\x8a\x69" + "\x84\x87\x74\x86\xce\xd3\x24\x5f\x0d\x71\xd1\x99\xaa\x4e\x92\x91" + "\x8d\x5e\x48\x31\x3f\x42\xf3\xcf\xb3\xb9\xdc\x52\x1a\xe1\x25\x7c" + "\x34\x26\x12\x6e\xc2\x57\x4d\x3e\x2d\x5f\x9f\x39\x1b\xfb\x9f\xe3" + "\x8d\xc4\x2b\xcc\xef\x52\xd1\x32\x1a\x9f\x3d\xc1\x7d\x9d\xa3\x0b" + "\x79\x4e\x56\x9e\x69\xae\x57\xc8\xde\x9c\x38\x39\x2f\xed\x52\x75" + "\x8d\xe2\xdf\xe4\xcc\xc9\x0b\xae\x6f\x4e\x61\x08\x7e\x4b\xc8\x73" + "\xb9\xf2\x5c\xcb\xdf\x31\xcc\xa9\x53\xea\xe0\x3c\x43\x19\xdb\xb7" + "\xd5\x19\x7d\xa9\xbd\x53\xb0\xcc\x51\x55\x9d\x43\xf0\xf9\x44\x80" + "\x7f\x73\xba\x14\x7c\x78\xef\x52\xc1\xa1\x5f\x92\xab\x55\xe0\xc4" + "\xfb\x8d\xdc\xa4\x40\xb9\x5c\xc3\x65\xfa\x1a\x22\xbb\x73\xd7\x08" + "\xd9\xcd\xcd\x0b\x6e\x4b\x6e\xa1\x0a\x67\x71\xa0\x2d\xb9\x65\x2a" + "\x38\xd4\xcf\xdc\x9a\x50\x59\x5d\x6f\x21\x19\x27\x79\xcd\x3d\x10" + "\x26\xcf\x23\xe7\xb5\x86\x97\xf1\x5c\x87\x2a\x5d\x8e\x8f\xe6\x4e" + "\x95\xfd\x04\xb2\xcf\xae\x9e\xd2\x5c\xe5\x3c\x57\x2e\x93\xb4\x6f" + "\xd9\x78\x71\x76\x38\xca\xf5\x5c\x43\x28\x5e\xf1\xbd\x8f\x8c\xa3" + "\x1f\x67\xae\x53\xf8\x78\x73\x73\x02\x7d\x9b\xbb\xd0\x01\xb3\x95" + "\xf7\x44\x4e\x31\x37\x98\x3b\x23\x52\xdc\x81\xf0\x95\xc1\x34\x9b" + "\x5b\x1f\xa0\xd9\xdc\xfd\x2a\xbc\x87\x54\x70\x7f\xc0\xe7\x16\x15" + "\xdc\xf1\xcb\xc9\xa6\x90\x95\xb9\x9e\xe0\xba\xe6\xe9\x02\x38\xe6" + "\x25\x05\xea\x9a\x67\x50\xc1\xb5\xe3\xb3\x29\x32\x7f\xe6\xcd\x88" + "\xcc\x9f\x79\x85\xe1\xf9\x33\xaf\x4c\x55\x6f\xe5\xe5\xf5\x6a\xde" + "\x41\x55\x7b\x1a\xf1\xd9\x16\xac\x47\xf3\x8e\x87\x3c\xf7\xf3\x9f" + "\xa1\xed\xd8\xb7\x39\x33\x9a\xd2\x8b\x47\x82\x5e\xe8\xd9\xd3\xa0" + "\xce\xff\x75\xaf\xc8\xa7\x36\xf2\x77\x70\xf4\x7e\x53\xc0\x19\x43" + "\xe1\x08\x46\x95\x9f\xa5\xb4\x1d\xc7\xeb\xb0\x67\x8f\x2a\xe3\x9f" + "\xdd\x4f\xe3\xdf\xd3\x05\xe2\xbd\xcd\xc5\x62\x66\xfd\x20\x2f\xd2" + "\x58\x86\x78\x9b\x1c\xf0\x74\x9e\xa0\xcf\xd3\x28\xff\xeb\xb8\x6f" + "\xc2\xca\x2f\x16\xa3\x3c\xf5\x76\x42\xde\x54\xfc\xed\xc3\xdf\xd1" + "\xc1\xe3\xeb\xd3\x2d\xcc\xaa\x99\xd3\x68\x0d\x1d\x77\x9f\x3e\x81" + "\xb1\x47\x6f\xa2\xb7\x2c\x2f\x4c\x9e\x87\x59\xa3\x66\x0f\x4c\xcf" + "\xa3\xf7\x3b\xbd\x0e\xc8\x9b\x42\xed\x55\xa5\x1b\x99\x35\x21\x97" + "\xe0\x1d\x54\x1f\x96\x89\xc4\x37\xe5\xbb\x2b\x21\x7b\x79\xc5\x21" + "\xfd\xf8\x16\x71\xfd\x4d\xf4\x63\xfe\xcc\x90\xba\x2b\xc3\xf7\x23" + "\x6f\x1f\xf6\xe3\xdb\xf0\xfd\xc8\xb3\x71\xda\x4a\xd8\x97\x01\x7e" + "\x47\xde\x09\xec\xcb\xb7\x9c\xee\xc1\xe9\x2e\x25\x4e\x2d\xfd\x16" + "\xe3\x7f\x09\x78\xd9\x39\x25\x01\xbe\x09\xb8\xf9\x29\x89\x75\x90" + "\x33\xb0\xce\xf9\x69\xcc\x3a\x74\x8e\x03\xe6\xaf\x56\xc6\x2b\x39" + "\x7d\x86\x68\x0b\xd2\x49\x22\x3a\x61\x7f\xb0\x5c\x24\x7e\x2b\xfa" + "\x29\xde\x33\xcd\x47\xfd\xcf\xcb\x51\xc6\x74\x1c\xcf\x9d\x0a\x1d" + "\x31\xef\x70\x48\x9e\x47\x95\xf7\x79\x50\xde\x96\xfe\xf4\x6e\x25" + "\xfd\xca\xf8\xf4\x4c\x4a\x08\x9f\x90\x3f\xcf\xfc\x2a\xb8\xdf\xcf" + "\x8c\x11\xfd\x43\x1e\x0d\xa0\xf5\x33\x59\xc8\xa3\xbe\xf0\x3c\x7a" + "\xa6\x20\xbc\xac\x3d\xc3\xcf\x99\x66\xc3\x21\x1c\x3e\x5a\xa3\xd5" + "\xc7\x65\x50\xe6\xd3\x40\xfe\x3c\xf3\x9e\xc2\x9f\x2b\xeb\xe3\x02" + "\x08\xe9\xa3\xaf\x13\x16\x6c\x11\x7d\x5d\x70\x2c\x18\xf7\x82\xe4" + "\xf0\xb2\xb8\xc0\x84\xfd\xf4\x85\xef\xe7\x82\x19\x91\x65\x71\x41" + "\x21\xf6\xc7\x37\x50\x16\x17\x88\x77\xba\xb2\x0c\x86\xe4\xd5\x33" + "\x6b\xd8\x7a\x0e\x91\x5f\xe4\x80\x05\xdd\xf4\x9e\x4e\x95\x7e\x34" + "\x58\xfe\xb0\x0f\x54\x8e\xe8\xe7\x15\x71\x0c\xf1\xa1\xd3\x00\xd2" + "\xe5\x64\xd2\x6d\x5d\x38\x26\x84\x56\xe7\x3b\x61\xe1\xaf\x7a\x24" + "\xe9\x71\x41\xaf\x67\x5f\x08\x6e\xd3\xc2\xac\xf0\xf4\x5a\x98\x8f" + "\xf4\x3a\x1f\x9e\x5e\x0b\x4b\x22\xd3\x6b\x21\xf1\xff\xfc\x40\x7a" + "\x2d\x3c\xa8\xa6\x97\xdf\x2a\xfa\x77\x5b\x32\xca\x46\xdf\x62\xd6" + "\x28\x6c\xb9\x3e\x11\x65\x45\x94\xe9\xa6\x32\x1d\x89\x1e\x21\x27" + "\x86\x9b\x40\x77\x0e\x16\x1e\x55\xf4\x3f\xa1\x0e\x86\xb2\xbe\x05" + "\xb4\x86\x9b\xce\x94\xd6\xdb\x2d\xe7\x6d\x76\xaf\x09\x68\xbe\x31" + "\xb8\xde\x67\x8d\xe1\x6d\xc1\xb3\x99\x48\xd3\xdd\x61\xd2\xe5\x6f" + "\x0a\x9e\xad\x09\xb6\x11\xcf\x9a\x83\x79\xb4\x90\xde\x4b\x27\x42" + "\xff\x7e\xab\x97\xbe\x2e\xcd\xb3\x67\x1d\x03\x79\xb6\x68\x9b\xe0" + "\xd7\xa2\x25\x21\xed\xf3\x84\xe7\xd7\x22\x7d\x64\x7e\x2d\x1a\x13" + "\x99\x5f\x8b\xb2\x88\x5f\x0e\x58\x54\x16\x3c\x6e\x2c\xca\x0f\xee" + "\x2f\xd6\x8b\xe5\x98\x34\xe4\x5a\x7a\xbe\xd2\x7e\x2b\x17\xd9\x38" + "\xe2\x15\xed\x37\x80\xed\x1f\x49\x6d\x1c\x2c\x8e\x88\xb8\x91\x86" + "\x35\x9b\x23\x9e\x53\x1e\xd7\x86\x71\x25\xad\xcf\x33\x8c\xa0\xb9" + "\xb2\xc5\x73\xfd\x92\xe6\x21\xbc\x97\x3a\x61\xc9\x48\xbf\x14\x55" + "\x46\x6b\xc9\xf8\xb7\x8a\xfc\xfd\xc4\xe2\xd5\x6a\x5e\xd0\x9a\xb2" + "\x6a\xb1\x77\x24\xcd\x73\x7e\x81\xe5\x2f\x08\xbe\x2c\xd1\x04\xd3" + "\x71\x71\x4d\x78\xbe\x2c\xde\x8f\x7c\xf9\x22\x3c\x5f\x16\xb7\x44" + "\xe6\xcb\x62\x07\xf2\xe5\x8b\x81\x7a\xb4\xd8\x23\xeb\xd1\xcb\x54" + "\xc6\xb0\x96\xfc\xd5\xfc\x95\x04\x83\xf7\xa8\x23\xf9\x4f\x51\xfe" + "\xd8\x6e\x45\x8f\xa8\x4c\x3e\xc5\xff\xbc\x7e\x19\xc6\x28\xe3\x50" + "\xe1\xcd\xcf\x49\xec\x0e\xa7\x27\xf9\x74\x66\xad\x66\x9c\x19\x74" + "\x48\xc3\xbc\xbd\x84\xa3\x08\x00\x71\xbc\x4f\x70\x94\x4e\x67\x3c" + "\xab\xe0\xeb\x14\x38\x3e\x2f\x2a\x60\x6b\x98\xbb\x10\x08\x2e\x04" + "\xb7\xdc\xff\xa1\x7c\x1c\x21\x78\x82\x0b\x81\xe9\x12\xfa\xb8\x64" + "\x4c\xb0\x3e\x2e\x81\x60\xf9\x5c\x4c\xef\x27\x12\xfd\x68\xe7\xf0" + "\x3e\xd7\x67\xd5\x3c\xf4\xdd\xe8\xe6\x92\x92\x10\xdd\x44\x19\x78" + "\xee\x16\x59\x06\x7c\xc1\x6d\x5d\x52\x1b\x5e\x06\x96\x1c\x88\x2c" + "\x03\x4b\x5a\x23\xcb\xc0\x12\xda\x77\xe6\x0b\x07\x3c\x97\x12\xac" + "\x9b\x4b\xbc\xc1\x7d\xc7\x7a\xb9\x6e\xc2\xb0\xc1\xe8\x26\xfa\x42" + "\xd7\x46\xd2\x43\xd9\xff\xd7\x34\xf6\x02\x0c\x82\x66\x3a\xd4\x2b" + "\x6c\xdf\x73\x07\xe9\x1d\x12\xda\xf8\x42\xa2\x61\x03\x8f\xd1\x9e" + "\x6b\x51\xd3\xb1\x5a\xc4\x5a\xa5\x9d\xb0\x74\x3a\xad\xd9\x13\xf4" + "\x2c\x18\x16\xdc\xff\xe7\x3a\xc2\xd3\xf3\x39\x9a\x9b\x2f\x0d\x4f" + "\xcf\xa5\xc9\x91\xe9\xb9\x34\x8d\xbe\x8d\x1f\xa8\x53\x4b\x67\x18" + "\x36\x70\x1f\x85\x97\x39\x07\x4b\xdf\xbd\xb2\xf1\x69\xe9\xf6\xe0" + "\xf1\x69\xe9\xea\xc1\x8f\x4f\x4b\x5b\xc3\x8f\x4f\x4b\x1d\xe1\xc7" + "\xa7\xa5\x1e\xa1\x0f\x05\xa6\x60\x7d\x28\xd0\x07\xcb\x04\xd2\xee" + "\x3b\x1b\x9f\x0a\xca\x42\x74\x60\x57\x27\x2c\xd3\xa0\x4f\xf1\x8a" + "\xe0\xdb\xb2\x8f\x83\xdb\x58\x50\x1f\x9e\x6f\x05\x87\x90\x6f\xbb" + "\xc2\xf3\xad\xe0\x78\x64\xbe\x15\xd0\x3b\xd1\x5d\x03\xf9\xb6\x4c" + "\x3b\x78\x9f\x62\x59\x7a\x30\xcf\x96\x19\x06\xcf\xb3\x65\x25\xe1" + "\x79\xb6\xac\x36\x3c\xcf\x96\x1d\x10\x3c\x5b\xd6\x11\xcc\xb3\x65" + "\x2d\xc1\x3c\x43\xba\x7d\x67\x3c\x5b\x9e\x16\xc2\xb3\x75\x9d\xb0" + "\xfc\x77\xc8\xb3\xe3\x82\x67\x2b\x36\x05\xb7\x71\x79\x4e\x78\x9e" + "\x2d\x2f\x44\x9e\xad\x0b\xcf\xb3\xe5\xdb\x23\xf3\x6c\x79\x13\xf2" + "\x6c\xdd\x40\x9e\x2d\x3f\x3c\x78\x9e\x2d\xef\x0e\xe6\xd9\xf2\xcf" + "\x07\xcf\xb3\x15\xa6\xf0\x3c\x5b\x91\x15\x9e\x67\x2b\xf2\x05\xcf" + "\x56\xd4\x05\xf3\x6c\x85\x25\x98\x67\x48\xb7\xbf\x93\x67\xc8\x1f" + "\x8b\x58\xaf\xbb\xe2\xdb\x1e\x3e\xa7\xbd\x02\x63\x84\xc2\xc3\xe2" + "\x9d\x40\x21\x97\x1d\x99\x87\xbf\x46\x98\x8e\x81\x63\x77\x61\x9c" + "\x9c\xf6\xf4\x40\x3e\x14\x1a\x71\x5c\xed\x6e\x29\xe1\xeb\xba\x04" + "\x0f\x89\xe6\x08\x27\xe6\xc8\x0a\xf9\xda\x00\xe4\x31\xa3\x7d\x8c" + "\x69\x2c\x46\x78\x17\xe1\xa1\x7d\x5c\x42\x70\x15\x0f\xc6\x2f\x8b" + "\xbc\xc6\xfc\xa2\x85\xce\x1a\xe8\x84\x95\x3b\x84\xac\x16\x86\xfa" + "\xbf\x8d\x98\xf7\xac\x90\xd3\x55\x21\x73\x26\x85\x11\xfc\xdf\x95" + "\xe4\xff\x36\x86\x97\xd3\x95\x97\xf0\x7f\x57\x92\xff\xdb\xa8\x8a" + "\x57\x87\x2f\xf2\x3a\x42\xe2\xd5\x95\xab\x13\x5d\x42\x76\xb8\x1f" + "\xbb\xe3\xa2\xc5\x6d\x5d\x59\x1b\xd2\x66\xe4\xcd\xf3\xc3\xe4\x36" + "\xc7\x84\x94\x3f\x10\xa1\xcd\x2d\xd8\xe6\x5f\x47\x68\xb3\xe3\x12" + "\x6d\xa6\xf9\xee\x5f\x0f\xd4\xad\xe7\x93\x64\x39\x08\x13\x97\x3f" + "\x6f\x0a\xcf\xff\xe7\x43\xf8\x0f\x79\xc5\x25\xcc\xc9\xcb\x07\xc3" + "\x99\xd5\x70\xb4\x56\x9f\x60\x49\x46\xc2\xc0\xd6\x87\xe2\x8c\x00" + "\xd7\x32\x40\xf6\xe8\xdb\x82\xb0\xb2\xf7\xbc\x53\xe8\xe3\xaa\xac" + "\x60\x7d\x5c\xa5\x0b\xd6\x47\xa4\x75\x50\xb9\x55\xc6\xe0\xfc\x42" + "\xcf\x77\x67\x63\x57\xd5\x85\xc8\xc0\x07\x9d\xb0\xfa\x3a\x21\x03" + "\xab\xd7\x84\xb4\xe3\x60\x78\x19\x58\xd5\x8a\xfd\xff\x20\xbc\x0c" + "\xac\xea\x88\x2c\x03\xab\x49\x9f\x3f\x50\xcb\xed\x9c\x92\xcc\xa1" + "\x21\x30\xa9\xe1\x6d\xde\xea\x8c\xf0\xf3\x3a\xab\x73\x05\x8d\x57" + "\x57\x06\xd3\x78\xf5\xea\x60\x1a\x62\x5f\xfe\x7e\x1a\xf6\x9f\xcd" + "\xe1\xb6\xae\x0e\xd5\x7f\x7b\x27\xac\x91\xf5\x7f\xed\xdc\x90\x36" + "\xca\xf1\x4f\xb8\xb9\xac\x35\x49\x48\x4b\x7b\x78\x5a\xae\x31\x85" + "\xef\xf3\x9a\x2c\x1c\x83\xec\xfe\x01\xba\xb4\x26\x1f\xd3\xe7\xd0" + "\xbb\x03\x9a\xc3\x6a\xc0\xf4\x39\x5e\xd0\xf1\xf1\xaa\x7f\x5c\x5a" + "\xb3\x9d\xe6\xc8\xf9\x1c\x33\xca\x6f\x62\x0a\xe4\xd0\x18\x44\xed" + "\x5a\x5c\x12\xfa\x4e\x74\x0d\x9f\xff\xa0\x75\x2c\xf4\x5d\x4d\xa2" + "\x05\x72\xec\x2e\x2f\x28\xf2\x4e\xf0\x21\xb8\x1d\xa4\x17\x04\xaf" + "\xc0\x8a\xb9\xce\xb2\x10\xdb\xb4\x56\x17\x9e\xc7\x6b\x0d\x91\x65" + "\x67\x6d\x86\xe0\xf3\x5a\x73\x30\x9f\xd7\xe6\xfa\xad\x09\xb9\xd4" + "\x57\x94\x81\x41\xe9\x09\xbd\x3b\x8d\x68\xef\x5f\x5e\xd0\x6e\xde" + "\x0a\x23\xce\xc0\x5a\x1e\x6b\xec\x92\x98\x27\x71\x9b\x06\x5a\xb8" + "\x0d\x58\x27\xf6\xc3\x40\x98\xc5\x5e\x90\xd8\xcb\xab\xda\x29\xaf" + "\xd1\xca\x3c\x74\x4e\x8d\x72\xe6\x0c\xca\xc2\xb5\x27\x61\xed\xdf" + "\x82\xca\xa3\xf7\x67\x17\x38\xc6\x88\xf9\xfd\x75\x46\x65\x1e\x3e" + "\xd2\xfc\x3e\xc2\xcc\x50\xd6\xfd\x8a\x77\x61\xeb\x32\x23\x8e\xcb" + "\xd8\x26\xfa\xbe\x9c\xda\x74\x69\x3b\xb0\xae\x49\x91\x5f\xf1\x6e" + "\x6e\xdd\xc1\xc0\xb7\x2d\xeb\xde\xc3\xbc\x82\x4b\xcc\xe7\xaa\xf4" + "\x60\x5d\x97\x1a\x8f\x38\x9f\x66\x9d\x57\xf9\x3e\xc5\x6d\x35\xeb" + "\x2e\x83\x4b\x6e\x8f\xd9\x14\xdc\x1e\x73\x26\xfa\x96\x05\x32\x8e" + "\x19\x97\xc1\x91\x64\xdf\xf7\x10\x8c\xf3\x43\xd4\x19\x28\x7a\x83" + "\xce\xbb\xb1\xd7\x77\x41\x9c\x17\xb4\x22\xb6\x33\xbf\x4d\xdf\x86" + "\x30\xbe\xef\xc0\x24\x1b\xbd\x83\xe3\x6b\x08\x92\x27\xd9\x8e\x59" + "\x7c\xf2\x9e\x6f\xe6\xdf\x10\x4d\x8f\x15\x9e\xb7\xd5\xef\x61\x5d" + "\x7b\xf9\x5e\x5f\xe6\xa0\xf8\xaf\x92\xd6\xff\xd0\x3a\x8c\xad\x30" + "\xa9\x13\x5e\x98\x2e\x74\xbd\x28\xc4\x27\x35\x47\x88\xff\xcc\x14" + "\xff\x4d\x0a\xaf\xe7\x2f\x5c\x22\xfe\x7b\x81\xe2\xbf\x49\xea\x71" + "\x53\xbc\xe7\x79\x61\x86\xda\x27\xa5\xfd\xb8\x0c\xcb\xc9\xcf\x7c" + "\xe1\xc3\xbb\x6b\x41\xef\xa5\x77\xda\xa8\x9b\xf6\xae\x16\xd2\x57" + "\xfd\x31\xe7\x61\x40\x59\xd5\x25\x98\x49\x16\x69\x2c\x23\x7d\x7d" + "\x81\xcf\x17\x26\x7a\x85\x2e\x96\x5a\x98\x73\x4c\x07\xca\xd0\xba" + "\x42\x05\x57\xc9\x96\x42\xf1\xdd\x47\x42\x07\x0c\xb5\x77\xf1\x71" + "\x51\x43\xfe\x2a\xf7\x5b\xbd\x17\x80\xf0\x36\x97\x1c\x03\xc2\xeb" + "\xef\x1f\x27\x39\xee\x6e\xd2\x71\xc2\x49\xb8\xdb\x10\x8e\xf0\x12" + "\x9c\xd2\x0f\xf1\x6d\x4c\x51\x92\xba\xef\x7c\xfe\x05\xeb\xc6\xf4" + "\xa7\x68\x5e\xc5\x4e\xe5\x4a\x17\xb0\x71\x1d\xf4\xce\xec\xbc\x8d" + "\x95\xae\x62\xe3\x8a\x68\x4e\xac\xe8\x6d\x2a\xf7\xeb\xbf\x3a\xa2" + "\x8b\x47\x82\x4e\x4e\x5b\xd8\x62\xf0\x80\x03\x8a\x9a\x82\x6d\x44" + "\x51\x88\xff\x6b\xe6\x71\x26\xfe\x16\xd3\xfa\x44\x79\xfd\x2a\xd9" + "\x03\x66\xf7\xba\xb9\x7c\x5c\x6a\x4d\x05\xbd\x93\xa6\x35\x51\x62" + "\xbf\xb9\xa2\xae\x90\xb9\x37\x67\x35\x5f\x57\xf3\xef\x58\xef\xfa" + "\x17\x85\x8c\x14\xbf\x18\xcc\xd3\xf5\xba\xd2\xb3\xf4\x2e\x48\x8c" + "\x07\x8b\xbc\xa1\xf6\x71\xbd\x51\xf1\xdd\x42\xd2\x33\x95\xf1\xc0" + "\xb0\x96\xe3\x0d\x19\x67\xd6\x73\xff\xdf\x37\x60\x5c\x58\x4f\xdf" + "\x2c\x07\xc9\x64\x1b\x97\xa1\xf5\x35\xc7\x5c\x28\x37\x45\x24\xff" + "\xc5\x31\x08\xb3\x8d\xbe\x39\xc4\xe7\xa1\xe7\x60\xbd\xcd\x67\x05" + "\xdd\x31\x27\xff\xa6\x4a\x8f\x32\xc2\xe5\x96\xc6\x8d\xf1\x62\x3d" + "\x92\x2b\xa4\x8e\x13\x0a\xcd\x09\xa6\xad\xe8\xdf\x41\xac\xa7\x20" + "\x59\x58\x7f\x90\xd6\x66\x24\x74\xf3\xbd\xbd\xf4\x8a\x0c\xd9\xbd" + "\xed\xd0\xe6\x0d\x8d\x79\x8a\x53\xc3\xf7\xbd\x98\xc6\xff\xdd\x0e" + "\x28\xae\x0d\xe6\x6d\x31\x1f\xff\x95\xf7\x3a\x0e\xa4\x41\x48\xb9" + "\xe2\x60\xde\xaf\xe7\xb4\x8e\xb8\xc6\xa7\xfc\x62\x09\xc6\x33\x8b" + "\x5d\x7c\xbd\x57\x31\xea\x7f\x51\xcb\xa5\xec\x20\xd3\x5d\x2c\xf1" + "\x23\xac\xbc\x2e\x18\xed\x56\xb1\x27\x68\xce\xe8\x7a\x3e\x67\xb4" + "\xb8\x13\x5e\x94\xdf\xfd\x6c\x98\x18\xdc\xbe\x17\x93\x22\xfb\x06" + "\x2f\xd2\xfb\x9f\xc5\xe1\x6d\xc6\x8b\x33\xc2\xfb\x06\x2f\x16\xc8" + "\x76\x61\x31\x8b\x09\x95\x83\x17\xcb\x90\xc7\xbc\x8c\x12\xc3\xd2" + "\x5c\x68\xe4\x18\xf6\xc5\x83\xfd\x31\x6c\x11\xd9\x83\x17\xeb\xfa" + "\x63\x58\x67\xb8\x18\xd6\x11\x86\x9f\x2f\xba\xc2\xf3\x73\x43\x5c" + "\xf8\x18\x76\x43\xaa\x18\xe7\x37\xe4\x05\xf3\x79\x43\x46\xe0\x9d" + "\xf0\x8b\x49\xdf\x9d\x3f\xbc\x61\xff\x40\x7f\x78\xe3\xed\x82\x57" + "\x1b\x97\x85\xb4\xcd\x16\xde\xb6\x6f\x68\x8f\xec\x0f\x6f\x70\x45" + "\xb6\xed\x1b\xf5\x03\xfd\x61\xc3\x90\x10\x98\xb4\x7e\x5f\x29\xc8" + "\x37\xdb\x38\x43\xd0\x69\x23\xf9\x73\x51\x2a\xf8\x82\x60\x79\xc7" + "\x36\x23\x3e\xb4\x6d\x67\xc8\xa6\x29\x32\x13\x89\x26\xb4\x3f\xd3" + "\x6d\xb5\x10\x83\x3a\xf0\x81\xdb\xba\xb1\x5f\xfe\x69\x1d\x1f\xd5" + "\x43\x36\x32\xe2\x7a\x3a\x49\x69\x1f\x6f\x47\xf7\xa5\xde\x97\x46" + "\x25\x43\xce\x6b\x03\xe8\x61\xe1\xfe\x1f\xe1\xb8\x34\xcf\x2c\x0b" + "\x43\x74\xcc\x25\xd6\xe1\x6e\x1a\x2d\xf8\xb6\x29\x24\x96\xb5\x58" + "\xf8\x37\x7d\x11\xed\xad\xa5\x2e\xbc\x8c\x5a\x0e\xf6\xdb\xdb\x22" + "\xc2\x6b\xf9\xea\xff\x23\xee\x7b\xa0\xa3\xaa\xae\xbd\xcf\x9d\x4c" + "\x60\x12\x92\x4c\xc0\x08\x23\xa2\x0c\x36\xd8\x80\x20\xa9\xd2\xf7" + "\x51\x3f\x5a\x83\xa2\x0f\xdf\x02\xa1\x2d\x7d\x2b\x6d\xa9\x21\x9a" + "\xd8\x50\x11\xa6\x24\xc0\x80\xf9\xc7\x00\x69\xc0\xfc\xb3\x46\x8c" + "\x10\x42\xb4\xd8\x87\x2d\x6a\xda\x62\x1b\x5b\xd4\x51\x62\x8d\x35" + "\xc9\x44\x4b\xdb\xd4\x42\x3b\xa4\x21\x0c\x69\x80\x81\x0c\x99\x31" + "\xcc\xdc\xf3\xed\xdf\x39\xf7\xce\x4c\x62\x82\xf2\xde\x5b\xeb\x63" + "\xad\x30\xf7\x9e\x7b\xfe\xee\xb3\xcf\x3e\x7b\xef\xb3\xcf\xde\x23" + "\xbe\x77\xca\x39\xd8\x92\xa6\xc6\x45\xeb\xba\xed\x9e\xe1\x34\xc9" + "\xde\x39\xbc\xdc\x96\x11\xf2\x9f\xdd\x8e\xef\x9f\x6f\xbf\xd9\x92" + "\x39\xf6\x7e\xb3\xe5\xb4\x1c\xff\xd6\x11\xe7\xcb\x5b\xec\x57\xdf" + "\x6f\xb6\x8c\x31\xfe\x2d\x4d\xc3\xf7\x9b\xad\x23\xce\xe8\xb7\x74" + "\x8e\xbe\xdf\x6c\xf1\xe8\x74\x46\xd2\x8d\xad\x8b\x3e\x1f\xbd\xd9" + "\x6a\x1d\x4e\x6f\xb6\x9a\x3e\x8b\xde\x1c\xfb\x14\xbd\xd9\x9a\x63" + "\xae\x1f\x6d\x2c\x5b\x0b\x47\xa7\x37\x5b\x6b\xe5\x1c\x12\xd3\x32" + "\x8c\xde\x6c\x3d\x3c\x7c\x0e\xb7\x8c\x98\xc3\xad\x23\xce\xbf\xb7" + "\xd8\xff\xbb\x34\x29\x26\x26\xc6\x10\xa3\x18\x94\x18\xfa\x44\xc3" + "\x63\xe3\x63\x8c\x31\xb1\xf4\x37\x4e\xfb\x1d\x6f\x88\x31\x18\xe9" + "\x2f\x56\xfb\x1d\x37\xe2\x7d\x3c\xca\xd2\x9f\x51\xfb\x8d\x1d\xf1" + "\x3e\xee\x33\xbe\x8f\xd7\xda\xd5\xdb\x37\x8e\x78\x8f\xfd\x8c\xef" + "\xe3\xfe\x87\xe5\xd9\xa7\xde\x87\xdf\x83\x7c\x60\xdd\xa6\xec\xb5" + "\x6b\x72\x84\x5d\x7b\xae\x35\xfb\x91\x47\x72\xf3\xf3\xad\x05\xeb" + "\xad\xf7\x2c\xfa\xc6\x1d\x77\x59\xa5\x79\xfc\xda\xaf\xce\xcc\x89" + "\x67\xcb\x36\x6f\xc0\x87\x65\xdf\x7c\x20\xd3\xba\xe2\x9e\x45\xc3" + "\x3f\xea\xd5\x08\x33\xf8\xab\xd5\x12\xb5\xf6\x32\x76\x4d\x66\xac" + "\x62\x8f\xa0\x3b\x3d\xb8\x7b\x2e\xe5\x89\x6d\x0f\xb4\xe1\xfe\xf2" + "\x50\x09\xc7\xbd\x8a\x6e\x56\x78\x0e\x83\x98\xdb\x58\xca\x6c\x0f" + "\xc3\x9f\x4a\x51\x1c\x7f\xd3\xcb\xac\xff\xc1\x0c\xdd\xac\xec\xdb" + "\x2d\x4b\x28\x2f\xbd\xbb\xdc\x41\x66\x2d\x01\x6f\x5b\xfa\x09\x7d" + "\x53\xf8\xd7\x54\x4a\xf3\x69\xf7\xf3\x4b\xe3\x44\xda\x9b\xa5\x7a" + "\x3e\x73\x2f\x2b\x7a\x99\xbf\xc9\xc5\x3b\x7c\xd6\xc8\x7c\x45\xdb" + "\xb8\xa1\x30\x03\x74\xa1\x7e\x12\x33\xc2\x2e\xfb\xb9\x49\xcc\xf4" + "\xdc\x64\xf8\xf8\x2d\x2a\xd0\xed\xb2\x77\xd1\xbb\x9b\x95\x65\xa2" + "\x6d\xe4\x55\x0d\x85\x3f\x40\xfe\x86\xe1\xf9\x0f\x46\xec\xb8\x8b" + "\x10\xdf\x2b\x61\xf9\x29\x66\x36\x87\xf8\xc5\x40\x7c\x7f\xd3\xed" + "\x4b\x88\x4f\xa3\xa9\x68\x0b\x96\x32\x79\x37\xaa\xe8\xdc\x96\x10" + "\x0f\xc2\x67\xc2\xb2\xfe\x12\x5e\xfd\x38\x33\xd2\x7a\x56\x9c\x1b" + "\x70\x97\xa2\xe8\xf8\x81\x5c\x66\xa4\xf1\x4f\xeb\x63\x25\x46\xeb" + "\x83\xc4\x37\x2e\x63\xc6\x3f\xd8\x71\xdf\xd5\xff\x51\xd5\x47\xcc" + "\xf8\xf3\xa1\x52\xc3\x10\xb7\xb0\xc2\x02\xee\xe1\xf0\xfb\xed\xe3" + "\x01\xd8\xdb\xb6\xad\x0e\x21\xcf\x3b\xfe\x12\x0b\xeb\x28\xf0\xb1" + "\xa2\x13\x3c\x50\xfe\x91\xf4\x57\xd1\xde\xef\xc3\xfd\x59\x53\xd1" + "\x32\x16\xd3\x9b\xc9\x0c\xed\x79\x75\xcc\xb5\xca\xc7\x0a\x4f\x70" + "\x4f\xdb\xea\xd3\xac\x23\xaf\x89\x65\x75\x31\x43\x5b\xcf\x49\x26" + "\x7c\x57\x57\xcd\x73\x16\x5f\x66\x96\xa2\x35\x48\xbb\xcc\xb6\x16" + "\xb1\xc4\xad\x7f\x82\x1c\xd4\x45\xed\x9c\x63\xdf\x39\xce\x14\xaa" + "\xcf\xf0\xc4\x49\x66\x79\xe2\xdb\xe2\x9e\x39\xab\x2f\x66\x16\x5e" + "\x92\x96\x30\x54\x92\x96\x3c\xc4\xd3\x26\xf9\x4b\xd2\x52\x3a\x6c" + "\x94\xbf\xe7\x0d\x96\xd4\xc5\x52\xde\xec\xeb\x32\xd4\x5d\x62\xd3" + "\x30\xa6\x5e\x1a\x5b\xfd\x25\xca\x5f\x15\x9b\xa1\x52\xd9\xe8\x32" + "\xc1\xc4\xd8\x4c\x57\x66\x80\xa9\x54\x57\xdd\x10\x9b\x56\x3f\xc4" + "\x2c\x6a\x65\x6c\x06\xca\xf5\xc3\x87\x1c\x51\x8c\xc2\x22\x1e\xba" + "\xb2\xdb\xd7\x44\xf4\x70\xfc\xab\x0f\x37\x1b\x5d\x6d\xfd\xac\xdd" + "\x37\xc4\x3a\xd8\xc7\xcc\x65\x3f\xe3\xfc\xf9\xc3\xcd\xb1\xc4\x4f" + "\x2a\xce\xad\xb0\x81\x97\xb8\x53\xd2\xce\x8c\x2e\x9a\x83\xea\x62" + "\x96\x60\xdb\xca\xc6\xf7\x51\xba\xa0\x3d\xe5\x67\x9a\x5d\xc1\x33" + "\xce\xad\xe2\x3e\x78\x59\x66\x71\x3b\x8b\xe9\xf0\xd5\xe1\xde\xb1" + "\x21\x94\x34\xcf\xe9\xf2\x75\x32\x97\xed\x1f\x4e\x35\x61\xde\xa1" + "\x0a\x95\x99\x5e\x1e\xec\x34\xb8\x8c\x83\xcc\x95\xe9\x63\x6f\x51" + "\xdb\xbc\x6a\x5e\x1b\xd1\xac\x8c\x0e\x5f\x00\xfe\x77\xd2\xf9\x80" + "\x25\xbe\x7a\x03\x9b\xd3\x70\x89\xa5\xee\xbf\xc4\xd2\xb8\x3f\xcd" + "\x80\x3b\xde\xf0\xa9\xb6\x9f\x7e\x13\x48\x06\xa3\xb1\x8b\xbb\xde" + "\x3c\x51\xbb\xeb\x7d\x25\x8d\x1d\x18\x8a\xdc\xf5\x1e\x1a\x88\xdc" + "\xf5\x26\x9c\xb2\xe3\xbe\xb7\x9b\x95\x24\x98\xdb\xd8\xf8\x6e\x56" + "\x94\x0e\xfc\xae\x3e\xcf\x8c\xdb\xcf\x33\x76\x7b\xa9\x01\x72\xa6" + "\x91\x70\xff\x9c\x8b\xe6\x06\xcf\xdd\xac\xf4\x20\xfd\x26\xd0\x1f" + "\xc9\x73\xa5\xc2\x57\x45\x8f\x86\xc7\x94\x66\xa0\xb4\x4a\xfa\x8d" + "\xa1\xdf\x9d\x25\xf5\xdc\x4b\x6d\xd5\x10\xaf\x12\x0f\x7c\xd6\xee" + "\x97\xd7\xf8\x1d\xa5\x85\x6e\x76\xb8\x47\xc7\x6b\x49\xdf\x8b\xec" + "\x6f\x75\x9f\x83\x7f\x79\xaf\xe8\xd7\x95\x3c\x05\xbe\xe6\xb5\x74" + "\xf4\xe1\x34\xda\xa5\xf6\x5b\xe9\xd7\x2c\x65\xd0\xd2\x55\x7a\xd9" + "\x81\x2b\x79\x68\xf3\x24\xa5\x73\x3d\x9d\xc6\x6d\xc4\xb7\x5f\x75" + "\x9f\x33\xc8\x3c\x69\x06\xaa\x33\xa0\xd5\x4f\x6b\xbf\x68\x1a\xd6" + "\xf8\x80\xc1\xcc\x8f\xad\x9e\xcf\xea\xf7\xf0\xb6\xfd\x7b\x78\x8b" + "\x5c\x7b\xdb\xac\x6e\xf6\x4a\x39\xfa\x48\x7b\x78\x4b\x05\x7d\x3b" + "\x46\xdc\x0f\xe0\xd2\x92\x03\xfb\xd2\x6d\x19\x6e\x76\x4b\x4a\xf4" + "\x18\xb8\xe3\x09\x2b\xf6\xd1\x57\x8a\x5b\x63\x89\x06\x58\x3b\x7a" + "\xfa\xd9\xcf\x87\x3c\xb1\x25\xef\x33\x83\x2b\xd8\xcd\xe6\xa5\xc8" + "\xb8\x3c\x07\xf6\x70\xf7\xd3\x88\x57\xbc\x87\xf7\x13\xbe\xdc\xd4" + "\xc7\xb6\x55\xde\x96\xc2\x52\x3e\x20\x29\x58\xd2\xa7\x6d\x2f\x46" + "\xd1\xa7\xb9\xed\xee\xe6\x28\xda\xb4\xf3\xe4\xa7\x69\xd3\x8e\xbf" + "\x4a\xda\x44\x6b\x5f\xd0\xa2\x90\x5b\x4b\x7f\x77\x44\xba\x76\x7f" + "\x65\xc7\x4b\x23\xd2\x03\x5a\xfa\x33\x23\xd2\xbd\x32\x7d\xfb\x9f" + "\x74\xda\xd7\x81\x7e\x6c\x06\xed\xdb\xfe\x3a\x68\x5f\xc7\x6a\x8d" + "\xf6\x09\xfa\xb3\x7d\x3f\x7f\x81\x68\xd1\x26\xd0\x9b\xed\x1b\xd1" + "\x7f\xfe\x26\xd3\xfb\x1e\x47\x69\x5f\x46\x5a\xcd\xc7\xcc\x48\x7f" + "\x3a\xdd\xfb\x11\xe8\x1e\x68\x1e\x68\xdf\xbe\xc9\xbc\x6b\xdf\x1e" + "\x7e\xbc\x5e\xf8\xc9\x76\x84\xe9\xdf\x93\x94\x56\x41\x69\x4f\xd2" + "\x77\xd0\x41\xc0\xa4\x3d\xb3\x99\x89\x38\x3a\xe5\xfe\x4e\xd5\x90" + "\xce\xaa\x68\xbe\xe1\xff\x6a\x07\xc1\xd7\xac\x30\x9b\xab\xc0\x27" + "\xee\xa1\xc0\x37\x7b\x47\x41\x0f\xd6\xdd\xe4\xed\x2a\xf4\x14\xa7" + "\x59\xb1\x8f\xf7\xe1\xae\x0a\xfa\x90\xb5\xe5\x3f\xe0\x5b\x5c\x69" + "\xc9\x63\x0c\x7e\x09\x40\xb3\xa9\x2f\xc6\x1a\xea\x93\xf4\x65\xbc" + "\x7d\x8e\x9b\x75\x1f\x95\x73\x5d\x96\x89\x38\x06\xdd\xcc\x61\xe3" + "\x0e\xa2\x8f\x34\x36\x73\xa8\x94\xc1\x37\x0b\xe2\x79\xe2\x77\x9f" + "\x41\xcd\xab\xd1\xfd\xb3\x38\x88\x36\x50\x1e\x57\x57\x80\xa1\xcf" + "\x6e\xe6\x38\xda\x5e\xd8\x8c\xf2\xab\x01\x1b\xee\x28\xd1\xeb\x50" + "\x44\x1d\x06\xa1\xbb\xcd\x73\xb3\xed\x2b\x44\xf9\x78\x5f\x53\xfb" + "\x2a\x2f\x03\xdd\x77\x79\xa8\x8e\xc2\x6e\x59\x07\xd5\xc5\x69\x0f" + "\x18\xf6\x4d\xab\x3f\xb1\x88\x5f\xa4\xfa\xe7\x60\xbe\xe0\xa7\x0b" + "\x76\x4a\x04\x97\x04\xf8\x6a\x90\x7c\xa8\xe3\xb5\x03\x1f\x33\xa6" + "\xf9\x1a\x23\x7c\x73\x1c\x81\x2f\x2f\xf8\x17\xbb\x9a\x6f\x31\x82" + "\x51\xaa\xee\x5f\x4c\xdd\xfc\xbf\xeb\x5b\x8c\xea\xb6\x34\x18\x78" + "\x13\xf5\xff\x08\xfc\x8b\x51\xff\x53\x80\x87\xda\x98\x9a\x9f\xf9" + "\x0e\x60\xbe\x2d\x88\xb4\x6a\x07\x6f\xd5\xe7\x1f\xe3\xc5\x58\xe8" + "\x9b\x5b\xf2\x87\xbc\xd3\xcd\x76\x34\xe3\x3b\xa5\xb5\x21\xff\x3c" + "\xa2\x63\x2e\xda\xc3\x5e\xed\x0e\x19\xaa\xb7\x32\xa3\xa4\x69\x3b" + "\x3f\x44\x79\x49\xd3\x76\x96\x47\x68\xda\xce\x22\x49\xd3\x24\x8c" + "\x25\x4d\xdb\xf9\x43\x49\xd3\x76\xae\x11\xf6\x44\x44\xd3\xf0\x0d" + "\x74\x4d\xa7\x69\xfb\x27\xf3\x56\xd0\x0e\xbf\x63\x67\xa6\x4e\xdb" + "\x2a\x29\x0d\xb4\x03\x7d\x94\x74\x6a\x7b\x13\xff\x5b\x1a\x93\xf6" + "\x9a\x78\xce\x83\xff\x0c\x8f\xf6\x4c\xf3\xb2\xf3\x7d\x49\xe3\x76" + "\x1e\x8e\xd0\xb8\x9d\xe9\x91\xb2\xa0\x71\x3b\xdf\x96\x34\x4e\xa6" + "\x1f\xf8\x0e\x68\xdc\xf6\x26\xc0\x40\xab\xdf\x80\x73\x34\x2d\x3f" + "\xc1\x71\x5b\x73\x34\x8d\x1b\xbe\xbe\xca\x8c\x3a\x8d\x03\x6d\xa3" + "\xf7\x14\x37\x9b\x21\xce\x88\xb1\xce\x6a\x09\xe6\xfa\xba\xc3\x1c" + "\x60\xcc\x88\x57\x00\xb8\xdd\x7b\x8e\x8d\xd7\xfc\xd6\x68\xe3\x2e" + "\x5b\xa1\xdf\xd1\x74\xb3\x9d\x9f\xf6\x69\xc6\x22\x7e\xc9\x68\xae" + "\xa7\xc3\x97\xa3\xab\xb4\x9b\xb9\xea\x78\x69\x47\xf0\x04\x53\xb7" + "\x3f\x76\x0a\xf3\x4a\xf2\xc6\xff\xc5\x2f\xe8\x0e\xed\xa3\x4f\x65" + "\xf9\x84\xfe\xfe\x54\xb5\x81\xbe\xd9\x87\x7d\x7b\x19\x6d\x40\xaf" + "\x48\xcf\xf6\xb1\xf4\x08\xd7\xd0\x56\x68\xec\xb6\x7e\x74\x83\x68" + "\x8b\x78\x29\x92\x7b\x26\x9e\x67\x65\xe2\x0c\x4d\xf8\x6d\x1e\xb5" + "\xae\x1f\x3d\xa0\x7d\x8f\x19\xe3\xfb\x9a\xcf\x28\xbf\xeb\x33\xca" + "\xbf\x04\x1a\x84\xfb\x78\x21\xc7\xf0\x7a\x92\x82\x7a\xbe\x3e\xe4" + "\xfb\x50\x3b\x07\x39\x55\x32\x43\xc8\x65\x16\xbd\x4e\xe0\x5d\x15" + "\xe5\x13\x3e\x82\x89\x46\x2e\xde\xc2\xe0\x9f\x33\xaa\x6c\x79\x62" + "\x04\xbe\x3f\x72\x5e\x45\x4f\x93\xe0\xaa\x63\x0c\xf1\xec\x8f\x11" + "\x2f\x8a\xbb\x34\xb5\xe1\xb3\x87\xf2\x1c\xa2\x97\xe2\x8e\xbe\x76" + "\x6f\xb7\x9f\xe8\xdb\x74\xe9\x1b\xd9\xa7\xdf\xb5\x98\x42\x74\x79" + "\x12\xfc\xb0\x40\x5f\x9d\x15\x5a\x61\x38\x26\xfc\xfd\x97\x37\xea" + "\x65\xc7\xd2\xed\xa1\x5d\xad\x4d\x71\x0f\x89\xca\x1c\xd7\xcb\xa0" + "\x6e\xdc\xbd\xa1\xfd\x78\xba\xf0\x6f\x16\xec\x07\x0d\x9c\x42\x3c" + "\xe8\x24\xd9\xce\x6a\x26\xdb\xd9\x65\xa2\x32\xc7\xaf\x76\xcf\x69" + "\xec\xf1\xed\x5a\x7c\xed\xe3\x63\xda\xf8\x76\x95\x7e\xc6\xf8\xae" + "\xd6\xee\xd1\x6b\x6f\x37\x59\x6f\x37\x70\xed\x70\xdd\x3d\xe7\xf3" + "\xc3\x35\x5d\x83\xeb\xee\xd5\x9f\x01\xd7\xd1\xda\xa9\xfd\xfc\xed" + "\x58\xf5\x76\x5a\x47\x6b\x87\x89\x7f\x63\xfa\xeb\x31\xe9\x31\x69" + "\xb4\x38\xc8\x71\x7e\xc7\x93\xc9\x6e\xb6\x2b\x45\x3f\xdf\x92\xf1" + "\x99\x9e\x4c\x75\xb3\xdd\xc6\xe1\xf7\xb8\x9e\x5c\x94\xd5\x88\x7d" + "\x9d\xab\x6e\xf6\xe4\x62\xe8\xda\x16\x17\x49\xff\x80\x5a\x19\xa2" + "\xff\xbb\x2a\xae\x76\x9e\x26\x62\x6f\x68\xbe\x3b\x70\x3f\x95\x57" + "\x19\xad\x03\x25\x79\x4c\xc6\xa6\x7e\xf2\x25\xdc\x43\xa2\xe7\xf1" + "\x78\xa6\x5f\xda\x03\x2a\xa4\x1d\x1e\xe2\x1a\x48\xdf\x14\xe3\xe8" + "\xdb\x27\x88\x7b\x21\xef\xf1\x3d\xd9\x46\xfd\x14\x31\xab\xa5\x2f" + "\x7f\xe1\xe3\xc5\x47\xf9\x0c\x28\x2b\x7d\x7b\x3c\xe9\xd5\xf3\xb8" + "\xf5\xfa\xc2\x7e\x2e\x9e\x7c\x5b\xee\x31\x4f\x3a\x07\xc6\x88\x9f" + "\x04\x7f\x67\x07\x8b\xd3\x87\xdd\x43\xbc\x6f\xc3\x86\xf5\x1b\xee" + "\xb2\xe6\x3f\xfe\xf0\xdc\xfc\x82\xec\x82\x8d\xf9\xe2\xc2\x7a\x3c" + "\xa3\x04\x6b\xc1\x9a\xc7\x73\xd7\x6f\x2c\x48\xdb\x9c\xbd\x46\x5e" + "\x70\x9f\x45\x19\xa3\x33\xb1\xe1\xf1\x2a\x89\x16\x41\x7f\x03\x5f" + "\x14\x22\x66\x25\x7c\x92\xe8\xf7\x77\x5b\x2c\x22\xb6\x17\xd1\xae" + "\x8a\x23\x6e\x66\xcb\xd4\xe7\x03\x7e\x12\x89\x7f\xb1\xf4\xb1\x8a" + "\x0f\x81\x43\xcb\x89\x15\x3d\x20\xfd\x4b\x08\x1f\x01\xae\x02\x4a" + "\xe8\x60\x26\xe7\x26\xe8\x63\x2b\x97\xa8\x8e\x8a\x05\xc2\xef\xe3" + "\xd6\x3e\xbc\x3f\xae\xf3\x0b\x38\x5f\x92\xe7\xc1\xd3\xef\xee\x66" + "\x15\xfb\xd1\x2e\xd6\x5f\xc3\x8f\x65\x8c\x70\xee\xa8\x58\x81\x3b" + "\xdb\xf4\x6e\xf2\x3b\x2a\x17\xe8\x3c\x29\xf5\x37\x81\x27\x1a\xd3" + "\xdc\xac\x72\xed\x3b\xc9\x5e\xa6\xdd\xf9\x36\x35\xc8\xfb\xdd\x46" + "\xca\x9b\x13\xce\xeb\xa0\xbc\x95\xc6\x34\xda\x3f\x47\x3d\xd3\xe6" + "\x49\x4a\xb3\x7a\x25\x33\x36\x7a\xcc\x24\x5f\xd3\xfc\x55\xdd\x44" + "\x63\x4f\xd1\x71\x46\xce\x7d\x55\xac\xf0\xbf\x5c\xa5\x34\x53\xda" + "\x38\xfa\xed\x1c\xa0\x6f\xf0\x85\x40\xe3\x82\x1e\x5a\xe9\x28\xbc" + "\xe0\x3c\x66\xe9\xa6\x79\xaf\x24\xfe\x62\x93\xf4\x53\x4a\x6d\x70" + "\x6a\xc3\x55\x3a\xc4\x5a\xac\x1c\x7a\x67\x9a\xf3\xaa\xf9\x2d\x56" + "\x1f\xe3\x31\xdf\x3d\x85\x72\xb4\xbe\x2c\x25\x76\xf0\x24\x94\x2e" + "\xee\xe9\x55\xa5\xe9\x30\x2f\xb0\xf2\x73\xc8\x33\x96\x7e\x19\xfb" + "\x66\xb5\xd8\x53\x2e\x31\xd8\x62\xf5\xb0\xaa\x4f\xdd\x79\x9c\x99" + "\x73\x97\x35\x27\xbb\xc0\xba\x76\xcd\xba\x5c\x6b\xce\x9a\x1c\xeb" + "\xba\xf5\x05\xd6\xef\xaf\x87\xa2\x07\xaa\x9d\x61\x38\xa1\x62\x7c" + "\x9b\x33\x63\xf5\xb3\xec\x81\xcd\x79\xe3\x24\x4e\x57\xbf\x38\xe0" + "\xcf\x1b\x3f\x1c\x26\xd5\xda\x9e\x59\xd5\x45\xf3\xa1\xf9\x04\x88" + "\xf1\xd0\x3b\xc6\x92\x31\x7c\x0d\x57\xff\x49\xe6\xad\x36\xea\x79" + "\x05\x5e\xdc\xd2\x17\xfe\x56\xad\xe1\xe3\x01\x79\x5f\x59\xf8\xbf" + "\x39\x20\x6c\xf9\xab\x17\x8c\x59\x06\x3e\xbf\xb6\xb2\x47\xce\xb3" + "\xea\x19\xdc\x51\xb5\x56\xc3\x21\x93\x5a\xa1\xb4\x6a\xf8\x43\x38" + "\x51\x6d\xff\x34\xfe\x54\x1f\x07\xfe\x70\x7f\xa6\x49\xd8\x7d\x04" + "\x03\x44\xef\xe8\x9d\xf6\x69\xea\xfb\x09\x8c\xc3\xb7\x39\xd3\x54" + "\xf2\x9c\xf0\xc3\x77\x16\x67\xa8\x88\x8b\x43\xb8\x12\x27\xe3\x77" + "\x56\xb7\xe9\x73\xa4\xe7\x1f\x7d\x0d\x0b\x7c\x19\x8e\x63\x02\x9e" + "\x35\x33\x05\x8e\x11\x9f\x40\x7d\x32\xe8\xfe\xfe\xb0\x97\xb8\x59" + "\xcd\xc2\x82\x22\xce\xfd\x8e\x9a\xf4\x28\x3c\x38\x3f\x1a\x1e\xd0" + "\xdc\x3e\xb2\x76\xfd\x23\x8f\xd1\x42\xdf\x90\x5b\xf0\x48\x1e\x7c" + "\x5c\x80\x0e\x08\x07\x1a\x33\x73\xac\x1b\xf3\x73\x1f\x89\x67\xa3" + "\xe5\x0a\x7f\x8c\x9e\xff\x64\x95\xf0\x75\x60\x20\x33\x16\x77\x2d" + "\xe4\xdd\x8a\xa7\x2e\x0f\xe4\x93\x4c\x32\x6c\xde\x9f\x3a\xeb\xb2" + "\xa4\x13\x6f\x97\xce\x04\x2f\x4e\x30\x93\xf6\x02\x3f\x9e\x0b\x38" + "\x0c\x18\x14\xda\x57\x6a\xfa\x75\x1c\xa0\x67\xda\xff\xaa\xdd\x11" + "\x5b\x8d\x1f\xcf\x19\x30\xc4\x9e\x00\xfd\x91\x76\x21\x7d\x44\x07" + "\xcc\x07\xba\xd9\x53\x42\xfe\x6a\x10\xfb\xd2\x53\x73\xf4\x32\x55" + "\xe1\xfb\xce\x4f\xd5\xea\x78\x12\x55\xe6\x26\xa4\x09\x9f\x47\x8e" + "\x9a\x25\x98\x73\x2e\xe7\xde\xa8\xe7\x23\xb8\xf2\x03\x82\x8e\x3c" + "\x55\x3a\x92\x36\xbc\x93\x8c\xb3\x71\xd9\x1f\x81\x7f\x09\x4a\xa3" + "\xf0\x9f\x42\x3c\x1f\xd5\x5d\xa9\xd9\xa9\x74\x0a\xde\xc0\x4e\x75" + "\x05\x64\x5d\xd4\xd6\x3a\xbd\x2d\x9e\xa8\x34\x1e\x10\x78\xf6\x94" + "\x3b\xa2\x3b\x7c\xaa\x02\x32\x33\x1f\xc8\x1c\x47\xf3\xd9\x26\x70" + "\x8b\x9e\x0b\x6e\x90\xbe\xdc\x80\x6f\x18\x27\xf0\x2a\x82\x53\x3f" + "\xb6\xea\xf3\x8d\x31\x53\xb9\xe3\x56\xe1\xef\xf7\xc7\x0b\x74\x58" + "\x8e\xe5\x73\x46\xac\xdb\x04\xea\x8b\x5f\xae\x5d\x21\xef\x49\x3f" + "\x43\xb8\xef\x12\x43\x7d\x6c\xed\x65\x4f\x3f\x00\x1b\x7e\x73\x80" + "\xe6\xac\x52\x69\x85\x0f\x05\xb9\x97\xfd\xb8\x8e\xea\xaf\x88\xdc" + "\x51\xff\xf1\x21\x6a\xbb\x42\xce\xdd\x8f\x8f\x44\xad\x3d\xaf\x66" + "\x17\x30\x1e\x30\x02\x3d\x73\xd9\xef\x13\xeb\x55\xde\xff\xfd\xb1" + "\x5b\x2f\x27\xfc\x0d\x10\x6e\xc0\x1e\xf6\x3c\x7b\x5a\xf0\x1b\xe8" + "\x1f\xc1\xba\x14\xed\x63\x7c\xd8\xbb\x05\xde\x58\x10\x2f\xe5\xe9" + "\x69\xc3\xfb\xf0\xf4\x1c\xbd\x2e\x59\xf7\xd3\x0b\xf5\x77\xf8\x1f" + "\x73\xb3\xda\x56\xc4\x9f\x3c\xe6\x13\x63\x98\xd0\x52\x40\x6b\xcb" + "\x27\xf2\xe5\xe8\x30\xa4\xf4\x52\x7a\x2f\xa0\xbd\xd7\x2e\xe6\xbc" + "\xc2\x98\x26\x69\x51\x6d\x0b\x7c\x5b\x95\x58\xe1\x9f\x70\xa1\xa4" + "\x37\xc2\xa7\x8e\xf8\xb6\x4d\x5b\xb3\x71\xb8\x2b\x24\xec\x63\x7c" + "\x41\x41\x1b\xa4\x0f\x06\xfa\x4e\x6b\xc4\x8f\xf8\x2f\x57\xf2\xe2" + "\xb4\xbe\x75\x85\xdb\x40\x5c\x4c\x71\x16\xf9\x74\xab\xf4\x69\x32" + "\x9e\x64\xbe\xa7\x03\xfa\xfc\xed\xd8\x43\x69\x88\xdb\x6a\x60\xa6" + "\x16\xe1\x33\xac\x36\x45\xef\xaf\xf6\xcd\x20\xf0\x41\xc0\xa0\x36" + "\xbc\xfe\x07\x44\x8c\xd1\xda\x0c\xbd\x1d\x91\x97\xf2\x21\x7f\x4b" + "\xaa\xf8\xb6\x2a\x5c\x8f\xf4\xa5\x62\x12\x71\xa6\x1b\xc5\x37\x7b" + "\x84\x56\x3d\x2d\x6c\xc6\x84\xfd\x1a\x8d\xc3\xfb\x44\x5e\x9c\x98" + "\x03\x2b\x8b\xa1\x32\x88\x5f\x6c\x90\xb8\x58\x7b\x58\x2f\x13\xa3" + "\x00\x8e\xb5\x47\xf5\xb6\xf5\x3a\xd0\xff\xab\xd2\x3c\x39\x16\x23" + "\xd6\x88\x16\x2b\x54\xd0\x0b\xc9\x73\x3d\x73\x9f\xc0\x41\x31\xce" + "\x67\x2c\xd1\x73\x2d\x79\xba\x67\xe6\x44\xe1\x03\xf5\xe7\x99\xf0" + "\xfc\xbb\xd9\x33\x5a\xdc\xce\x67\x56\x44\xf5\x31\x83\xde\x57\x87" + "\xe7\xa1\x4a\xcc\x11\x62\x00\x8d\x1a\x67\x52\xac\x15\xca\xa3\x72" + "\xd1\x4f\xcc\x07\xc9\x64\x0b\x58\x0b\x78\x43\x5a\x2b\x04\x13\xf4" + "\xf1\x34\xf0\x8a\xea\x6d\x1e\x8e\x9b\xcf\xb4\x46\xf5\x57\x01\x5d" + "\xa7\xb4\x13\x7a\x1e\x37\xdb\x23\xce\xe8\x74\x78\xd2\xb7\x40\x78" + "\x1e\xef\x40\xde\x3d\x26\xbd\x9f\x9f\xb1\x67\x68\xb0\xda\xb3\x48" + "\xb6\xb1\x27\x43\x6f\x83\x9e\x97\xd2\x1a\xf8\x14\x0f\xfe\xf0\x96" + "\x82\x5c\xe9\xe4\x08\x9b\x7c\xf6\x23\x8f\xe5\xe6\xcc\xb1\x66\x3f" + "\x0a\x77\x48\xf9\x6b\x73\x73\x6d\xe2\x30\x67\x38\x1f\x98\x22\xda" + "\x23\x38\x48\xdf\xd3\xcf\xc2\x1f\x8a\x4f\xdb\x87\xb1\xde\xbd\x58" + "\xef\xc7\x0a\x2f\x09\x19\xc7\x55\x7a\x07\x73\x05\x78\x29\xe4\x00" + "\x41\xfb\x30\x7e\x8b\x4f\xee\x03\x34\x9f\xd8\x23\xa9\x6f\x9e\xe1" + "\xf0\xda\x13\x18\xbe\x96\x9f\x35\x8d\x4e\x27\xf6\xbc\x24\xe8\x44" + "\x85\xc4\x0b\xd0\x27\xdc\x01\x40\xbd\x54\x66\xe1\xf0\x3a\x9f\x5d" + "\x1a\xa1\x51\xcf\x66\xea\x34\x4a\xee\x13\xcf\x16\xd2\x1e\x54\xa3" + "\xb5\x55\x10\xc1\x9b\x67\x7d\x12\x6f\x9e\x2d\x77\xb3\x97\xc3\xfe" + "\x3e\xe4\xde\xb1\x27\x13\xfc\xa3\x8c\xeb\xfd\xec\x21\xbd\xbe\xda" + "\x49\xd8\x37\x9e\x6d\xfe\x34\xff\xf0\x6c\x0e\xf8\x07\xd8\x27\x02" + "\x16\x22\x8e\xb1\x58\x37\xcf\xf6\x44\xd1\x9f\x64\x7a\xf7\x8d\x36" + "\xd7\x0f\x63\x3b\x9e\x8b\x63\xb7\xb9\x8f\xac\x2b\xf8\x2a\x5c\x55" + "\xe5\xda\x6d\xb9\x8f\x14\xe4\xe6\x8c\x3c\x6f\x4b\xd3\x79\x31\x9c" + "\x75\xd7\xd2\xba\xf7\x26\x02\x1e\x75\x34\xfe\xbd\x05\xfa\x18\x04" + "\x9d\x22\xde\x51\xa3\x71\x09\xbd\x6c\xef\x22\x19\xc3\xbc\xae\x40" + "\xc7\x13\xe4\xbb\xd7\xce\x55\x4a\xa3\xf1\xef\x29\xd5\xe4\x2e\x92" + "\x6d\xeb\xea\xf4\xf7\x48\xf9\xba\x93\x62\xef\xdb\x23\x6c\xfb\x08" + "\xa6\xcf\xad\x8a\xe2\xb7\xf0\x3e\x5f\x7b\x17\xfe\x98\x64\x3c\xf6" + "\xba\x8b\x12\xbe\x75\x34\xff\xcf\x68\xb4\x62\x6f\x86\xac\x87\xb1" + "\x9f\x14\x7b\x63\x0f\x08\x3d\xff\x73\x26\xbd\x3d\x2a\x7f\x22\xba" + "\x4d\xec\x5b\x23\xeb\x73\xb3\x3a\x61\x47\xb5\x5d\xf8\x92\x7b\x6e" + "\xf1\x28\x7d\x6d\x8d\xce\x47\x79\xf2\x28\x4f\x8a\x3e\xe6\x6f\xda" + "\x45\x5a\xe1\x55\xc6\xd8\xaf\x8d\x31\x00\xdc\x42\xfb\xc0\x7f\xad" + "\x0f\x27\x34\xff\x24\x6e\xc4\x8d\x44\xff\x85\x9f\x34\x0b\xd6\xf5" + "\x73\x9d\xb4\x9f\x2d\xd6\xc7\x81\x31\x1e\x29\xf6\x1a\x75\xff\x54" + "\xb2\xfc\x73\xaf\x0d\xef\xdb\x5e\x63\x54\x19\x8f\xf3\x16\xe8\xf0" + "\x9f\xdb\xcf\x1d\x75\x42\xfe\x81\xdf\xaa\xda\x30\x1e\xee\x4d\xff" + "\x34\xde\x3d\x57\x0f\xbc\x8b\xc6\xa5\x35\x77\x3c\x42\x98\x94\x9f" + "\x5b\x70\x97\xe0\xee\x89\xb1\x83\xfb\xb3\xec\x82\x35\xeb\xd7\xe5" + "\xcf\xb1\xe6\xe7\x64\x6b\x8b\x7e\xd8\x9a\x77\x08\x1d\x80\x4f\x5f" + "\x67\xd4\x56\x7d\x84\xb6\xec\x8d\xe0\x3f\x6c\xb5\x6e\x81\x8e\x76" + "\xef\x45\xb9\x9e\xf6\xb6\x44\xad\x5d\x51\x1e\x6b\xf4\x80\xe0\xd9" + "\xf6\x46\xef\xff\x3e\x82\x69\xdc\x79\xb6\xb7\x52\x83\xa9\x4f\xc2" + "\x78\xdf\x57\xc4\x38\x85\x5f\xae\xbd\x4b\x31\x4e\xe1\x07\x46\xf0" + "\x67\xfb\xac\xfa\x78\x23\x72\xc3\xbe\x05\x82\x8f\xd2\xf8\xb5\xcf" + "\x92\xef\x25\x7f\xba\xef\xb8\xa6\x83\xeb\xd2\x65\x3c\x9d\xbf\xa6" + "\xbe\xe4\x48\x5e\x75\x5f\xe5\xf2\x42\x7e\x25\xcb\x0e\x7f\x75\x98" + "\x83\x7d\xaf\xeb\xbc\xa5\xb0\xe3\xab\x54\x0e\x51\x7f\x9a\xa2\xe9" + "\x04\x8f\x79\xac\x4b\xe3\x11\x0f\x49\xd9\x75\xc2\x6f\xba\xa9\x2d" + "\x9c\x41\x5c\xa5\x6f\x18\x17\xd1\xbf\x26\xe1\xfb\x0b\xfc\x35\x1f" + "\xb0\x68\x31\x32\xeb\x85\xbd\x66\x03\xd5\xed\xa5\xb9\xf5\x3b\xea" + "\x89\xff\xdb\x27\x70\x43\x25\x1c\x85\x0d\x8f\x4f\xe7\x91\x58\xfd" + "\x32\xec\x45\xf4\x4c\x78\x5b\xdf\x28\x71\xaa\xbe\xd1\x9b\x9f\xc6" + "\x06\x06\x2c\x86\x81\xfc\x4c\x23\xf4\x05\x80\x85\xab\x3e\xc0\x24" + "\xfe\xd4\xdb\x08\xef\xac\xd1\xf5\x69\x75\x01\xa6\x46\xf4\x83\xe7" + "\x5b\x0c\xc0\x6f\xe0\x2b\x1f\x48\x23\x5e\xb8\x7e\x01\xcf\x4f\x33" + "\x8c\xe1\x83\xeb\x6a\xe3\x4c\x40\x9c\x49\xc4\x1e\x05\xbd\x92\x7e" + "\xfe\xf7\x87\x9e\x96\xba\x01\xad\xdd\xfd\x0a\x37\x3c\x2f\xf6\x95" + "\x2a\xb1\xaf\x70\x26\xfd\xa6\xef\xb7\x0a\x7b\x5a\xdb\xf3\x22\xd6" + "\xac\x76\x4f\xdb\xdb\x62\x0b\x8a\xb8\x76\x25\x05\xe0\xd3\x82\x38" + "\x3f\x12\xf7\x90\x8f\x15\x04\xd9\x37\x03\xc0\xc9\xfd\x2b\xe0\x33" + "\x5e\xc6\x20\xdf\xbf\x4a\xf7\x13\x8f\xd8\x95\x88\xbb\x4a\xe3\x8a" + "\x89\xc4\x4d\x6d\x80\x4f\x68\x26\xe5\x71\x0b\xab\x22\x9e\x5e\xce" + "\xc1\xfe\x17\x11\xb7\x4f\xca\x0a\xdd\x34\x2f\x31\x67\xba\xd9\xfe" + "\x37\x04\xfe\x84\xe9\x44\xc3\x97\x61\xa3\xee\xd6\xea\xa0\xb6\x68" + "\xff\xdf\x27\x64\x13\xc1\x77\xfb\xf5\xf9\xdc\xff\xe2\xa7\xf5\x1b" + "\x91\xfa\xdc\x6c\xff\x41\x8d\x2f\x60\x52\x07\xf6\x0e\xd5\xd5\x90" + "\xa2\xeb\xc0\x22\xbc\x4f\x43\x9a\xae\x03\x93\x3e\xa8\xeb\xfb\xd1" + "\xfe\x58\x3a\x22\x5e\xf2\x6d\x26\x74\x56\xc4\xc3\x8d\xc9\x4f\xd0" + "\xfe\x8e\xbe\xeb\x7c\xa1\x9c\x9f\x86\xb7\xc1\x1f\x22\xd6\xab\xce" + "\x4b\x4a\x1e\xa0\xa1\x4d\xee\x65\x0d\x4d\xfa\x5e\x46\x65\x8f\x68" + "\xb4\x42\xdb\xe7\x1a\xc2\xf2\xef\xe8\xf6\xf9\x0d\xfd\x3a\x8c\x74" + "\x98\x4b\x18\x1d\xb8\x6f\x20\x7e\xd0\x1b\x81\xed\x01\xe1\xdb\x29" + "\xea\x7b\x51\x14\xec\xf1\x5e\x28\xe9\xe6\x01\xda\xff\xeb\x0f\xcb" + "\x3d\x45\xa6\xf1\x24\xe3\x6d\x22\x5e\xbc\x80\xc1\x1a\xa1\x9b\xf1" + "\x96\xa4\x51\xdf\x0e\xe4\xb9\x95\x3b\xed\x92\x96\x1d\xa0\xfd\xaf" + "\x21\x47\x2b\x97\x8c\xbe\x44\xf7\xf7\x5b\xeb\x1e\x5b\xb7\x7e\xf3" + "\x3a\x28\xd4\x36\xe6\x5b\x1f\x59\x9f\x93\x1b\x3f\x8a\x3e\xc4\x82" + "\x78\xda\xbe\xda\xb0\xff\xa9\x17\x4a\x61\x4f\x2f\x63\x17\xbc\xb0" + "\xcd\x7a\x2b\xf0\xeb\xc0\x69\xe8\x0a\x44\x0c\x09\xf8\x5a\x95\x7a" + "\x03\x0f\xca\x4b\x58\xbf\xf0\xf8\xc0\xe6\x3c\x8d\xc7\x7a\x61\x16" + "\xe0\xa8\xc9\x1c\xbc\x97\x35\x66\xeb\xfb\x10\xfa\x27\x78\xf3\x2b" + "\x69\x82\x2e\xaa\x57\xf2\x8c\x02\x5e\x57\xd2\x68\xbf\x69\xcc\x70" + "\x2b\x77\xac\x94\xe3\x6a\x5c\xaa\xc3\x03\xe3\xf7\x23\xa6\x27\x5f" + "\x43\x38\xfa\x42\xa9\x56\x17\xe8\x27\xea\x4e\xd1\xed\xb9\xe1\x53" + "\xd4\xb9\x09\xfe\x84\x9f\x5f\xa6\x56\x82\xde\x34\xd6\xe8\x74\x09" + "\x7b\x91\x4a\xf5\xbc\x3a\xe8\x8d\xa5\x75\xb3\x88\xca\x4e\xee\x66" + "\xcf\x9f\x90\x71\x07\x1a\x8f\x0e\x8f\x3b\xf0\x3c\x71\xa3\xcf\x9f" + "\xd0\xfe\x82\x51\xcf\x57\xfb\xd3\xcb\xb4\x46\xa5\x59\x46\xe4\xa1" + "\x71\x3d\x9f\x1a\xe6\x57\xa4\x5f\x53\xcd\x0f\x32\x62\x68\x3c\x9f" + "\x0d\xdf\xa1\x11\xdc\x68\xdc\xa9\xf1\x20\x1e\xc0\x0e\xfb\x2d\xe5" + "\x91\x77\x59\xab\x08\x37\x78\x26\xc3\x98\xb8\x7f\x0d\xe1\xc4\xf3" + "\x85\x11\x3c\x90\x30\xa2\xb4\x9a\x08\x9f\xf2\x7c\x0e\xca\x44\xc3" + "\x81\xda\x58\x24\x65\xd3\xe7\x9b\xf5\x3d\x1b\x7e\x53\x65\x1c\x8a" + "\xe7\x53\x8f\x14\x7b\x48\xe6\x7f\xfe\x78\x54\x1d\xa9\x9a\x2e\xc2" + "\xc8\x0d\x07\xca\x0f\x08\x99\xed\x79\x5f\x44\x27\xf0\x7c\x2a\xe8" + "\xae\xa8\x23\xc9\x98\xee\xf2\x89\x58\xd5\x8a\x1e\x9b\xde\xef\x78" + "\xc1\xaa\xf3\x28\x7a\x5d\x2d\x52\xe7\x24\x7c\x5d\xd2\x1a\xac\xa1" + "\x3c\x8b\xc3\xfa\x58\x4a\x0b\xcb\x80\x76\x5a\xc7\x82\xf7\x7e\x21" + "\x27\x22\xeb\x35\x8a\x7b\xd5\x42\x0e\x94\xf5\x10\xdf\xf5\x42\xe6" + "\x48\xb9\x8d\xf8\x07\xeb\x9a\x75\x6b\x88\x7d\xf8\xbe\x6d\xfd\x57" + "\x49\x74\xf8\xbe\x6d\xcd\x57\x61\xfa\xb5\x6c\xf1\x03\xe2\x97\x16" + "\xc7\x57\x47\xd1\x1f\x43\xef\x2d\xe2\x41\x43\x67\x44\x72\x2e\x74" + "\xa7\x7e\x19\x57\x75\xbc\xf6\x6b\xd2\x7e\xc7\xd1\xbe\xd7\xd9\xcb" + "\x7e\x12\x8b\x18\x38\x6e\xf6\x13\x8b\xea\x90\xf1\x64\xb5\x3d\x9b" + "\x68\xf9\x0b\x21\xfd\xdc\x4c\xd8\xc2\xc3\x9f\xe1\x40\x9e\xd0\xc7" + "\xf9\x1d\x3f\x09\xeb\x3f\xa4\x7e\x51\x9e\xbd\x51\xfa\x0a\x3d\x5d" + "\xd7\xc7\x52\x5a\x8e\xae\x7b\x95\x79\x7f\x52\x10\x29\x3b\x4c\xb7" + "\x9d\xa2\x9f\xcb\x51\x9e\x3a\x1d\x66\x7a\x3d\x25\x56\x7e\x5e\xe3" + "\x93\x62\x04\x5f\xed\x78\xa1\x42\xf8\x10\x05\x2f\x2e\xf4\xcc\x3f" + "\x69\xd3\xdb\x81\x8c\x80\x7e\x6b\x67\x40\x62\xdd\xc3\x57\xa8\xf4" + "\x35\xfa\x93\xf0\xfc\x8f\x80\x79\xda\x9d\xb3\x84\x5e\x3e\x2d\x9f" + "\xf8\xb3\x59\x23\xf4\x70\xc0\xa1\x79\xb5\x2c\x4e\xe8\x98\xa4\x9c" + "\x1e\x0b\x1e\x81\xc6\xf0\x3c\xcd\x67\x0c\x68\xb9\xdc\xf7\x0e\xae" + "\x0c\xef\xf1\x09\xc6\x34\x1e\x3f\xd8\x0f\x7f\xf3\xf2\xfe\xc2\xc1" + "\x1f\x02\xdf\xbc\x53\x1e\xf3\x73\xd8\x2a\x3f\xfb\x5d\xbf\xd4\xc3" + "\x1f\x7c\x39\xa2\x33\x3b\xc8\x34\xdf\xa8\xb0\x83\xa3\xf9\x3a\x18" + "\xb6\xff\x40\x7e\xc1\x7b\x51\x9d\xb8\xab\x80\xf6\xaf\xe1\xbc\x87" + "\xe4\xfe\x59\xad\x72\x9d\xbe\xb8\x40\xd4\x41\xb4\x5a\xde\x07\x78" + "\x91\xf0\xf0\xa0\xd8\xf3\x64\xdd\x99\x6c\x20\x69\x56\xd3\x80\xa3" + "\x3d\x1d\x30\xf4\x25\x2d\xf2\x4a\x5f\xc4\x2f\x7e\xc5\xe7\x30\xd2" + "\x9c\xbe\x48\xf3\xff\xf3\x31\xcf\xb5\xae\x6c\xe2\x2d\xc1\x41\xde" + "\x5c\xf5\x31\xd1\xb9\x47\x19\x0b\x6e\xe2\x4d\x57\x06\xf9\x11\x11" + "\xfb\xfc\x61\xc6\x2a\xff\xce\x58\x28\xe6\xbb\x67\x87\x08\x57\x1f" + "\xbc\xac\x9e\x47\xcc\xc0\x03\x94\xef\x41\xdf\x05\xde\x40\x65\x1e" + "\xb4\xf1\xf3\x0d\x94\x6f\xd9\xb9\xf3\x7c\x3f\xe5\x5d\x96\x47\xb8" + "\xb2\x89\x07\x43\x31\x8f\x9d\xb5\xfe\x27\x68\xf7\x8b\x47\xbd\xbb" + "\x54\xa2\xed\x86\x6a\xbe\xfd\xb6\xd9\xd4\x9f\xd6\x70\xbc\x32\xaa" + "\x17\x78\x85\x38\xa5\xc4\x1f\x9e\x25\x3c\x38\x9b\x45\x7c\x07\xe1" + "\xed\x59\xca\xe7\x75\xb3\x27\x05\xcd\xf1\xc6\xcc\x9e\x44\x7f\xa3" + "\xf2\x4e\xd4\xd7\x96\xd0\x26\xde\x5c\xfd\x10\xf5\xbf\x8f\xfa\x3f" + "\xc8\x9b\x68\x0c\x47\xaa\x7a\x19\x43\xff\x43\xa8\x33\x84\x78\x89" + "\xca\xc4\x03\xf4\x3d\xcb\x9e\xcc\x0e\x50\xde\x87\x7c\x6c\x62\x03" + "\xe5\x79\xe8\x87\x13\x99\xe8\x7f\x3f\xf5\x3b\x4e\xb5\x84\xa8\x6d" + "\xf4\xdf\xef\xf8\xa9\x4d\xef\xa7\xde\x3e\xfa\xab\xaf\xdb\x2c\xe8" + "\x08\xe3\xfd\xf3\xd1\x6f\x79\xee\xf1\xd3\xbf\x7a\xf3\x69\x9e\x63" + "\x6e\x9b\x2d\x65\xec\x9f\x36\xe9\xfd\x1f\x7e\x0e\xf6\xd3\x80\xa4" + "\x9f\x3f\x25\xf9\xe7\x60\x97\xa4\x35\x32\x0d\xe3\xf7\xd2\xba\xd5" + "\xee\x00\x9e\xd5\x61\x46\xdf\x0f\x8e\x3c\xe7\x5a\xb1\x7e\x83\xd0" + "\x51\x67\x3f\x52\xb0\x66\x53\x36\x49\xbe\xf1\xcc\x86\x24\x21\x1b" + "\xe7\xe6\x58\xd7\xaf\xb3\x3e\x9a\xbd\x66\xed\xfa\x4d\xb9\x1b\xe6" + "\x08\x75\x46\x7e\xee\xba\x1c\xa8\xae\x37\x64\x6f\xb0\xc5\x8f\x90" + "\x67\xca\x55\x4b\x07\x62\xd1\x14\x03\xbf\x7f\xb6\x48\xd3\xdb\x06" + "\xb8\x23\x43\xc8\xc5\x92\xc6\xfc\xd7\xcb\xd6\xad\x19\xf8\xfe\x65" + "\xb9\x8f\xff\x2c\x83\xef\xf6\x7f\x99\x73\x11\xc3\x5b\x39\xcf\x7e" + "\x36\x57\xc0\x63\x60\x89\x5e\x8f\x90\x5d\x81\xb3\xb6\xad\xe0\xc3" + "\xfe\xeb\x38\xc7\xf7\x61\xb0\xf8\x59\xac\xb4\x19\xa2\xf4\x2b\x4b" + "\x58\xc4\xee\xfe\x67\x8b\xb8\x81\xc6\x4e\xb0\xd4\x64\x86\x2e\xed" + "\xfe\xe3\x7b\xdd\xec\x25\xc8\x52\x38\xb7\xe9\x14\x3c\xb9\xb8\xa7" + "\xf5\xd2\x29\x92\x39\xba\xb8\x63\x5c\x02\xe0\x55\x25\x65\x7a\x83" + "\x59\x41\x9c\xdd\x6e\xdc\x19\x4d\xc7\x39\xef\x01\x87\x9a\x1e\xb1" + "\x73\xfa\x2f\x23\xe4\x0b\x71\xce\x21\x68\xd2\xa1\xd5\xfa\xda\x35" + "\xe0\x1e\xce\xf6\xa9\x77\xc9\xf5\x77\x28\x17\xf9\x69\xfe\xef\x92" + "\xe3\x13\xf1\xc6\x89\x37\x78\xa9\x88\xc6\xff\x6f\xbc\x64\x89\x76" + "\x26\xf9\x52\x91\x9a\x74\x9f\x37\x94\x4f\x72\x41\xc2\xfd\x36\xfa" + "\xf6\xa0\xba\xdb\xff\xb5\x10\xf1\x54\x2a\xc9\x09\xbc\xea\xfe\xfc" + "\xd0\x6e\xff\x02\x75\x73\x9a\x01\x7b\x6b\x89\x9d\xe0\xbb\x3e\x2f" + "\x9e\x5f\xc8\x9b\x10\xda\x9c\x06\x7b\xd5\x0c\xce\xa9\x6c\xbc\x7f" + "\x85\x88\x6d\xbc\xdb\x7f\x8f\xf6\xfe\x0d\xbc\xab\xc4\x27\x53\x5a" + "\x26\xbd\x7f\x47\xe5\x51\xf9\x87\xe7\x5d\x85\x77\xb3\x22\xec\x2b" + "\xd3\x49\x2e\x59\x88\xb1\xeb\x63\x16\xf2\x19\x74\x44\xe1\xb1\xbd" + "\x64\xd7\xd3\x21\x37\x48\x1e\x9e\x3d\x42\x30\xae\x90\xf8\x18\xce" + "\xf7\x75\x1d\x06\x32\x96\xb7\x7f\xbe\x9b\xe6\x57\x45\x0c\xf6\xed" + "\x37\xce\xe6\x86\xff\x9a\x02\x9a\xb5\x3c\x24\x68\x21\x93\xe7\x4e" + "\x2f\x35\xe9\xf0\xc4\x7d\x02\xd0\x52\x9a\xb7\xb4\x2c\x2f\x8b\x97" + "\x74\xe0\xa5\xce\x28\xf9\xb0\x1f\x73\xed\x66\x2f\x09\x3f\x4b\xdc" + "\x60\xda\x2e\xdf\x0f\x59\xe5\x5a\x79\x29\xa8\xe7\xa5\x34\xe9\xef" + "\xa4\x3c\x90\xb2\x39\xc8\xa6\xda\xbe\xc6\x7b\x09\x37\x3b\x65\xbe" + "\x9f\xa5\x46\xd6\x94\xc4\x37\xfa\x6d\x82\x7c\x8d\xf3\x47\x3c\x37" + "\x8c\x71\x27\xb6\xb8\x9e\x73\xec\x57\xd8\x3f\xad\x53\x99\x88\xa1" + "\x4b\x78\x58\x7a\xac\xde\xc7\xc4\x3c\xc7\xfb\xbf\x3c\x80\x58\xe9" + "\x44\xcb\x47\x2b\x8f\x32\x94\xff\xa8\x90\x93\x68\x5d\xa8\xb4\x2e" + "\xa8\xcc\xbf\x01\xaf\x8b\x2f\x43\x7e\xf9\x59\xb0\xa5\xd0\x03\x9f" + "\xfd\x84\xaf\x3f\x0b\x02\x86\x58\x07\x55\x0e\x71\x1f\x52\xec\x93" + "\xce\x4d\xf3\x51\xc7\xd9\xa4\x00\x33\x76\x10\x45\xa0\x79\x09\xd8" + "\x8a\xd9\xc4\x3e\xca\x6f\x2c\x60\x26\xc8\xb0\xc3\xf7\x90\xd1\xf7" + "\x8f\x81\x04\x83\x69\xa0\x4a\x71\xfb\x1d\x3f\xa7\xf1\x1f\x1e\x53" + "\xce\xd8\x3e\x99\xf8\x1a\xca\x57\x33\x15\x67\xd5\x3f\x5f\x7d\xb5" + "\xbc\xfa\x1d\x5d\xe0\xca\x3c\x0b\xf4\x29\x06\x93\x38\xf3\x4e\x52" + "\xdc\x52\x6f\xf9\xf3\x46\xbd\x3c\xf4\x9e\xb0\x2f\xa8\x1e\x62\x96" + "\xea\xb0\xac\xf8\xf3\x56\x39\x47\x3f\x6f\xd5\xe5\x8b\xd1\xda\x29" + "\x38\xc8\xd5\x92\x99\xcc\xe0\xb2\x7a\xd9\xed\x01\x96\xd0\xb0\x97" + "\xb1\x9a\xad\x3c\xf0\xf4\x56\xc2\x23\x82\x31\x37\xfc\x3c\x03\x76" + "\x18\x07\x68\x8f\xae\x52\x19\x8b\xa1\xbe\x3c\x3d\x48\x6d\x16\xcb" + "\x7c\x5c\xfa\x57\xb3\x50\xbe\xb5\xf4\x9b\x42\x74\x84\xd5\x16\x33" + "\x53\xad\xca\x8c\x35\xc5\x6c\x1a\xa5\x11\x5f\x71\x78\xa9\x2e\x0b" + "\x8c\x7a\x2e\xdc\x40\xf4\x91\xda\xdd\x56\xcc\x83\xef\x90\xb4\xe4" + "\x50\x79\xe0\xf3\xc0\x9d\xc6\x7f\x58\x8e\xf1\xf0\x61\x5d\x36\xa0" + "\xe7\xe6\xe1\x77\xad\x0f\x37\x8e\x3c\x63\x7e\x78\xfd\xfa\x82\xac" + "\x0d\xb9\xf8\x49\x9b\xb9\x71\xd6\x48\x5e\x31\x41\xc6\xa5\x3a\xdc" + "\x89\xb5\x05\xfe\x49\xde\x59\x7a\x39\x39\x4a\xdf\x03\x9d\xf3\xdd" + "\xe0\xfb\x60\x73\x42\xdf\xe6\xbc\x5d\x58\x24\xe4\x8d\x53\x26\x66" + "\x18\xd9\xde\xa3\xd9\x05\xd9\x6b\xef\x92\x66\x0d\x9f\x6e\xe7\xe5" + "\x8c\x11\xed\x84\xcf\x7f\x35\xd9\xdc\x27\xe8\x63\xe5\xfd\xab\x79" + "\xe2\x6d\xda\x19\xd8\xcb\xf5\xba\x0d\xe1\xe8\xbe\x5d\xfc\x87\x43" + "\x55\xb1\xa5\x58\x23\x25\x45\xcc\xf0\xab\xad\x5d\x06\xc8\x25\xc5" + "\xf4\x0c\x9b\x2e\xa1\xff\xd6\x62\x46\xbe\x79\xa9\x8b\xf6\xd2\x97" + "\xbd\x7c\x97\x9f\x60\xf8\xb2\x67\x2c\x3b\xae\xe8\x7b\xf1\xf2\xec" + "\xfe\x15\xd3\x55\x6c\xbe\x44\x7e\xdd\x4e\x63\x44\xb9\x22\x39\x67" + "\xaf\x10\xfe\xff\xdc\xa2\xe3\xaf\x9e\xa7\x7a\xb2\x1e\x8b\xf3\x95" + "\x95\x63\xd5\xcf\x2b\x0c\xc9\x12\xc7\x5f\x79\x43\x9c\x51\x4f\x65" + "\x3f\xea\x66\xaf\xbc\x6e\xb4\x30\x0b\x3d\xff\x17\x3d\x0b\x1d\x06" + "\xbe\x0d\xc3\xa3\x9b\xfa\x1b\x8d\x44\x71\x88\xf2\x28\x5c\xfe\x23" + "\xc6\x4f\xfe\x8b\xa1\x3f\x03\x57\xc4\xed\x95\x18\x9a\xc1\xf1\xe3" + "\x8c\xcc\x9c\x94\x60\x9a\x7e\xf3\x34\xcb\xdd\x5f\x5b\xb8\xa0\xa4" + "\xb8\xd0\xce\xd5\x60\xc0\xcc\xa3\xe2\xa7\x56\xcc\x3e\xf4\xad\x59" + "\xa5\x92\x7f\xa8\x9c\x7d\x68\xb4\xbe\x56\x3a\xb8\x0d\x32\xad\x9a" + "\xb4\xa8\xb3\x64\x23\x33\xbc\x3a\xe4\x36\x40\x86\x02\x0f\x83\x18" + "\xef\xdd\xec\xd5\x07\xde\xa2\x34\x82\x97\x9d\x57\x2c\xea\x94\x77" + "\x93\x5e\xdd\xa5\x56\x2d\xea\x8c\xd4\x6f\x64\xa8\x9f\xe4\x74\xc3" + "\xc1\x62\x8f\xc1\x65\xfc\x1a\x73\x59\x7d\xec\x2d\x7a\x1e\x75\xae" + "\xa8\x4d\xe8\x84\x51\x07\xed\xc1\xe5\x25\x9f\xd0\xde\x6c\x17\xe7" + "\x33\x86\xf3\xec\xd5\xb7\x9b\xc6\x28\x27\xce\x58\xe3\x43\xbf\xf3" + "\x3b\x5e\x25\x7a\xfe\x70\xad\x26\x87\x90\x9c\xd4\x94\xa0\xef\x07" + "\xf4\xfd\xb7\xf2\x9c\xa8\xc9\xaa\xe7\x19\x75\x8e\x76\xc3\xe6\x99" + "\x3b\x81\x07\x7c\xd0\xe3\x81\x0f\xc6\xb1\x74\x71\xb0\xb9\xcf\xb7" + "\x70\x95\x3f\xfb\x98\xaf\xb8\x8e\x07\x8a\xa7\x71\x4f\xc9\x34\x61" + "\x2b\x03\xb9\x22\x79\x60\xca\x63\x17\x07\x9e\x7d\x6c\x40\x7d\xf6" + "\xb1\x4b\x7c\xca\x63\x97\xd5\x29\x8f\x0d\x4a\x9d\x21\x33\xfb\x9f" + "\x7d\x0c\xf1\x4b\xee\xa5\x7e\x9e\xc7\x39\x24\xc9\x19\x24\xcf\x35" + "\x1d\xd5\xe5\x8c\x61\x72\x4c\x4e\x41\x16\x8c\x0a\xb2\x1f\xff\x6e" + "\xfa\xf7\xb4\xb0\x1c\x3f\xdc\x98\xfd\x58\x6e\x16\x49\x38\x59\x9a" + "\xf5\x11\xd4\xcf\xc4\xcc\x21\x2f\x4e\x3c\xee\xb2\x6e\xce\xdd\xb0" + "\x61\xee\xfa\x75\x77\x59\x11\xcc\x43\xa4\xcb\x7b\x4c\x79\xd9\x39" + "\x82\xe5\xcb\xfd\x94\xbe\x1a\x63\x41\xec\x48\x1a\xcf\xa5\xe8\x31" + "\x68\x7d\x9e\x2e\xfa\x4c\xfd\x45\xbf\xb5\x3e\x93\xdc\xfe\x8b\xb0" + "\xfe\x33\xa2\x33\xf8\x45\x00\xfb\xb8\x5e\x07\xca\x53\xb9\x0b\x51" + "\xe5\x68\xac\xbf\x38\x14\xad\x37\x95\xba\xcb\x5f\xae\x10\x3a\xd3" + "\x67\xbf\xeb\x45\x1c\x1d\xe2\x07\x95\x3e\xf6\x4b\xc1\x37\x41\xe6" + "\x13\x30\x0f\xea\xf1\x26\x9a\x5a\x61\x83\x22\xfb\xf6\x0b\x5f\x14" + "\x4f\x46\x73\xfe\xcb\x55\xd0\xe5\xf5\xb3\x5f\x7e\x99\xf2\x5d\xa4" + "\xfa\x7c\xea\xb3\xdf\x1d\x20\xf9\x8c\xe6\xe0\xbb\x83\xf0\x23\x82" + "\xbb\x27\x88\xed\xd0\xe1\xf3\x8a\x38\x79\xa2\x0c\x49\xb1\xe8\xb3" + "\xac\xf3\x97\x4b\x22\x3a\x85\x5f\x9a\xf4\x7e\xb9\xd9\x2f\x3a\xd1" + "\x97\xe8\xf9\x79\x60\xf1\xca\xb9\xeb\xd6\xcf\x7d\x64\x63\xc1\xdc" + "\x82\xbc\x0d\xeb\x37\x7e\x3f\x6f\x18\xbd\x5c\x12\xdc\xed\x7b\x97" + "\x9f\xc9\x64\x49\xdb\x92\xc7\x99\x95\xf4\xc7\xdb\x77\xc0\x26\xf5" + "\x7a\x66\xb6\x7f\x0f\x3a\x42\xb6\x7f\x0f\xef\x84\x6e\x02\x67\xe4" + "\xe6\x6d\xe9\x6b\x12\xb6\xa5\x67\xab\x8e\x85\x77\xe2\x0e\x94\x39" + "\xf8\x80\x92\xd0\xb3\x48\x09\x39\xe6\xdf\x09\x9e\xac\x9e\x68\x78" + "\xcd\x64\xde\x45\x65\x4e\x50\x19\x37\xfd\xf5\x50\xb9\xb6\x5e\xf6" + "\xab\x38\xfa\x6d\x35\x6f\xe3\x07\xcc\x41\xae\xce\x29\x25\xf9\x8b" + "\xea\xc5\xdd\x0f\x1e\xef\x73\x42\xfe\x9b\x17\x64\xb1\x11\x5d\xed" + "\xaf\xe6\xd0\x5a\x1b\xb7\x6c\x27\x7f\x8b\xea\x6a\x55\x07\xd5\x56" + "\xc4\x3d\xd6\xce\x2c\x8e\x57\xd0\xdf\xed\xb5\xcc\x02\x1b\xfb\xc2" + "\xd3\xcc\xd0\xd1\xe3\xc1\x3d\x12\x27\xb5\xd7\x42\xf9\x8f\xd2\x5f" + "\xb3\x75\x1d\x8b\x39\xcf\x7e\x55\xa4\xdb\xe6\x49\xfe\xff\x35\xc1" + "\x07\x53\x79\x27\xee\x85\x14\x3d\x4e\xb4\xa3\xd7\x6b\x40\xfd\x94" + "\xd6\xea\xca\xf3\x30\x57\xb0\x0d\x77\x77\xa0\xa3\x41\x9e\xb4\x20" + "\x7d\x83\x9e\x46\xe5\x16\x03\xd1\xd1\x36\xda\xa7\x9a\x61\xf3\xd9" + "\x51\xd8\xc5\x3a\x6c\xad\x4c\x1d\x48\x4b\x15\xf5\x51\x7f\xa8\xcc" + "\xf1\x57\x1f\x0d\x18\x80\x2f\x94\xaf\x13\xfc\x10\x7c\x3d\xf0\xfc" + "\xb4\x5b\x29\x4f\x0b\x7d\xef\xe4\x67\x2c\x06\xd8\x55\x9e\x67\x47" + "\x76\xf2\x81\xb4\xb4\x79\xfd\x32\xfe\x6d\x37\x3b\xb2\x8a\xfa\xfa" + "\x5e\x54\x5f\xbf\x45\x63\x20\x5c\x62\x4e\x6a\xf7\x28\xfa\xd1\x91" + "\xd7\xca\x3a\x02\xd4\xae\xaf\x15\x76\xc3\xa9\x7c\xb3\xc5\x08\x3b" + "\x62\xbe\x39\xcd\x58\x7d\x89\x19\x89\x66\x3a\x0f\xd0\x2f\x8d\xff" + "\x08\xc9\x7f\xd3\xfc\x8e\x23\x36\xdd\x5f\x08\xe4\x0d\x7a\x2f\xd5" + "\x69\x4e\x25\xe5\xa1\xfe\x34\xa3\xee\xc4\x7e\x06\x1d\x54\x2c\xd1" + "\xb3\x58\x6a\x73\x3c\xc1\xb1\x99\x60\x97\x4d\x73\x76\x14\xb0\x26" + "\xf8\x78\x54\xaa\xaf\x7a\x90\xfa\x93\x6f\x31\x26\xf4\x30\x65\x79" + "\xd0\xcf\x09\xe6\xc7\x97\xdb\xfd\x1c\xf7\x0b\x60\xab\x4f\x65\xbe" + "\x4a\x63\x35\x4a\x9b\x87\x23\xfd\x7a\x5b\x21\xe0\xd8\x85\x4c\x4d" + "\xbf\xfb\x5a\x25\x6c\x28\x23\x76\x90\xaf\x55\xd0\xfb\xef\xa3\xdf" + "\x81\xe7\xaa\xe3\x97\x79\x0d\x02\xd7\x5f\x9b\xef\x36\xb8\xfb\xb5" + "\xf5\x43\x75\x1b\x8d\x03\x8e\xd5\x48\x5f\x4a\xfc\xc9\x4a\xb9\x06" + "\x5e\x13\xbc\x7e\x2f\x3b\x92\x26\x63\x05\x1f\x99\xa3\xe9\x05\x8f" + "\xcb\x3a\x7f\x55\x84\xb9\x06\x0c\x09\xcf\xcb\x5c\x9e\x56\x81\xe3" + "\x6e\xf6\xab\xc6\x06\xe2\xa9\xc6\xa0\xf7\x01\x17\xed\x75\xea\x20" + "\xf7\x40\x96\x96\x36\x8f\xaf\x39\xb3\xec\x31\x19\x24\x37\x1b\x08" + "\x16\x58\xa3\x93\x49\x5e\xb8\x1b\xb6\xb1\x04\x03\xf4\xc9\x7d\xb5" + "\xb8\xdc\x34\x07\xc4\xa3\xfe\xda\x48\xfd\x15\x71\xa9\x10\xb7\x58" + "\xea\xfb\x7f\x6d\xd1\x7d\xc3\xf0\x41\x5e\x08\x3e\x90\xda\x2d\xdd" + "\xb1\x49\xb4\x81\x58\xcd\x9e\x02\x2b\x3f\xd5\x62\xf5\x8e\x49\xef" + "\xa3\x6c\x39\xbd\x5a\xfc\x47\x61\xd7\x32\xdc\x96\xf3\xd7\xa5\x51" + "\xba\x43\xd8\xb6\x94\xc2\x7e\x47\xfa\xf0\xfa\xb5\xf0\xf5\xb5\xdc" + "\x2e\x7d\x15\xb9\x02\xfd\x9a\x0c\xfc\xeb\x76\x11\x13\x0e\xf2\x95" + "\xb0\xff\xec\xd3\x6c\x36\x7f\x9d\x8b\x36\x5a\x46\xc4\x9d\xcf\x5d" + "\x97\xfd\xf0\xda\x5c\xa9\x4e\x9f\xfb\x83\x82\xec\xef\x0f\x97\xd3" + "\x05\xdd\xe5\x8e\x5f\x77\x49\x3a\xf6\x9b\xe4\x28\xda\x68\x0c\x9f" + "\x2f\x18\xd8\x11\x79\xc6\xf0\x9b\xf4\xd1\xce\x18\x1e\xf8\xfe\xba" + "\xf5\x1b\x44\x1b\xc2\xbc\x35\x57\xde\x54\x8d\x67\xdf\x5a\xfc\xc0" + "\xe2\xb9\xf9\xb9\x05\x22\xd0\x93\x54\xe8\x67\xe7\xe4\x6c\xd0\x8c" + "\x5f\xd7\xa0\x14\xbe\x3c\xba\x59\x14\xb5\x3d\x56\x20\xcd\x66\xf3" + "\xd7\x66\x6f\xca\xd5\xaa\x88\xee\xeb\x34\xec\xdd\x2d\xf5\x62\x7f" + "\x88\x97\xb6\x3a\xbf\x71\x46\x9d\xed\x47\xeb\x12\x6f\xa0\x6f\x27" + "\xf4\x6f\xb6\x5b\x80\x2b\xcd\x8f\x77\x34\x0a\x9a\x65\x3c\xf6\x02" + "\xe0\xdb\xfc\x00\x62\x93\x10\x9f\x95\x8e\x58\xda\x9a\x1d\x0c\xf1" + "\x0e\xcd\x33\x79\xa5\x21\x9d\xe0\x6b\x5f\x1e\x52\x39\xed\xef\x76" + "\x37\x3b\x6a\xd1\xf4\x73\x26\xd5\xf0\x9b\x85\xb0\x61\x6c\x10\xba" + "\xe4\xe6\x8c\x08\xdd\x3f\x6a\x01\x0f\x0b\x1a\x8b\xbe\xa1\x9f\xf4" + "\x7d\x75\x94\xfd\x58\x8f\x9b\xfd\x46\xe8\x64\x60\xe7\x24\xe2\x06" + "\x11\x3d\xd2\x7c\x94\x18\x3a\x5e\x00\x4f\xf4\xdb\x72\xd8\x87\xa9" + "\x15\x06\x6d\x8f\x7b\xfd\x79\xbe\x3b\xf4\x87\x79\x3e\x96\x22\x69" + "\x52\xf3\x39\x4a\xbf\x8e\xfa\xd8\x4a\xe9\x1f\xbc\x5a\xec\x89\x05" + "\x9f\x2e\xcf\x4b\x9b\xcf\x69\xba\x65\xc0\x27\x36\xaa\x0f\x3d\x11" + "\xfd\xf3\x51\x8b\x37\xd1\x00\xfb\xdb\x7e\xdd\x16\x46\xda\x23\xbd" + "\x6e\x0a\xeb\x5b\xa9\x6d\xcd\xfe\x23\xa5\x97\xf2\x13\x2c\xd2\x34" + "\x9b\x0c\x8c\x7d\x25\xc6\x2d\xed\x7a\x5f\x5f\x18\x2d\x8b\xcb\x38" + "\x2d\xa1\x3f\xa8\xd2\x86\x1b\x7d\x5f\x23\x78\x7a\xe8\xba\x87\x00" + "\xef\xd7\x89\xf6\x87\xde\xa7\x72\xb4\x73\xfe\xba\x5f\xef\x0f\xfa" + "\x5c\x60\x27\xc6\x94\xca\x81\x0f\x1b\x10\xfb\xfd\xeb\x75\x91\x3e" + "\xbf\x2e\xe5\x77\xae\xd3\xab\xdf\x26\xc8\x33\x07\xc3\x82\xa8\x79" + "\x33\x9e\x67\xaf\x9f\xa3\xbe\x2e\xd8\x2e\xed\xb0\x62\x75\xfb\x26" + "\xaa\x6b\xd8\xf8\x23\xe7\x01\xbf\xd9\x20\xcf\x03\x7e\x6b\x8c\xcc" + "\xe1\xeb\xad\xc0\x7b\xd8\xb0\xe9\xf6\x6b\x98\x4f\x19\xc3\xe6\xb7" + "\x73\xf4\x7a\xd4\x24\x83\x05\x3a\x9b\x2a\x69\x8b\x41\xf3\xf2\xdb" + "\xc7\x63\x94\x53\x82\xaf\x9f\x17\x60\x8d\x94\x36\x8e\xd2\xb2\x91" + "\x0f\x6d\x0a\xbd\x39\xc1\x06\x63\x51\x49\xde\x8f\xb1\x8c\x5b\x4a" + "\xf5\x15\x12\x3d\x5e\x1a\xc1\x8d\xdf\x2e\x16\x76\x60\x1a\xac\xb9" + "\xe3\x37\x3f\x8a\xe8\x91\x7e\x7b\x28\xac\x03\xa6\x7a\x22\x7b\xd2" + "\x6f\xdb\x01\xe3\xea\xb0\x3e\xec\x28\x13\xfd\x90\x67\xfb\xef\xf4" + "\xb2\xdf\x5d\xe4\xf1\xa1\xf7\xb1\x9f\x43\x57\x81\xb9\x17\xb2\x87" + "\xd0\xe5\xfe\xee\xa5\x06\x79\x7e\xb6\x87\x9e\x5f\x56\x0d\xa3\xe1" + "\xce\xef\xac\xd1\xb6\xe6\x12\xfe\xbf\xcb\x53\x51\x27\x8d\x1f\x75" + "\xd1\x1e\xa7\xe8\x3a\x76\xad\xde\x6f\x53\x9d\xcf\xf6\x6a\xb0\x16" + "\xe7\xca\x55\x1a\x1c\x30\xc7\x02\xe6\xbf\xa3\x35\xf5\x6b\x71\x7e" + "\x53\xd2\xc8\xcf\xad\xa7\x3a\x64\xbc\xe7\xdf\xd5\x71\xc0\x56\xcb" + "\xef\x85\x2e\x88\xfa\x2e\xef\xe9\x12\x2e\x5e\xc9\x13\x77\x14\xd5" + "\x2a\x83\x15\x7d\xc7\x99\x72\x44\xbf\xf7\xbb\x76\x94\xf5\x3e\x21" + "\xcb\x54\xcb\x33\x6f\x9a\x9b\xdf\xc5\xf2\xcd\x79\x4c\x3b\x6b\x25" + "\x5a\xff\xfa\x71\xe0\x3d\xea\xf1\x09\xfd\xcd\xef\x7a\x54\x82\x0b" + "\xcd\x89\xd9\xef\x38\x9a\xac\xcf\x09\xcd\x47\xdb\x55\x64\x3f\x9a" + "\x93\xa3\x0b\x75\x7f\x5f\xd8\x9b\x68\x0d\x97\x4a\xb9\xe6\x68\xc8" + "\xbc\xed\x6e\x6e\x0e\xde\x09\x1e\xcc\x77\xc0\x20\xf4\xf2\xba\x2d" + "\xf5\x74\x82\xd3\x05\xfd\x7e\x8a\xba\xfd\xbb\x5d\xb0\x43\x77\x05" + "\xa4\x1d\x3a\xd2\x1f\xf4\x71\xb5\xc3\x17\xc2\xfd\xac\x2e\x6a\xa3" + "\x51\x97\xf9\x41\xdf\x62\xb6\x29\x04\xbb\xa3\x47\xdc\xec\xd5\xf9" + "\x1a\x5d\x1b\x4f\x73\x7e\x52\xab\x3f\xba\x0f\x9a\xaf\xfd\xa3\x41" + "\x29\x87\x1e\xf5\x10\xed\xa9\x93\xba\x83\xa3\x3e\xbd\xdf\xf4\xdd" + "\x39\x72\x8c\x2b\xee\x7d\x20\xd7\xba\x16\x24\x3a\xfd\x0e\xbb\x35" + "\x6d\x66\xce\x3c\x71\x71\xc1\x7a\xff\xbd\x77\x59\x57\x7c\x75\xa6" + "\x3d\x6f\xce\x83\xf2\xe7\xde\x15\x4b\xf1\x3b\x42\x2e\xb0\xfa\x1d" + "\x6f\xac\x1c\xae\x9b\x78\x47\xeb\xc3\x1b\x6b\xdd\xca\x03\x22\x76" + "\x23\x37\xf9\x3d\xbc\xbc\x37\x8d\xf6\xd4\x7e\xc8\x6c\xcb\x43\xff" + "\xe0\x7c\x57\x6f\x1a\x8f\xf3\x7b\xbc\x89\xb3\x0f\xd1\x9f\xcd\x1b" + "\x17\xf2\x56\x13\x0d\x24\x1e\x35\x60\x0e\x8e\x97\xb4\x92\xde\x89" + "\xef\xf1\x10\x6f\x85\xb9\x64\xf7\xcd\x2a\xe1\xcb\x43\xdc\x45\x3c" + "\x16\xc1\xe5\x8d\x36\x7d\x1f\x17\x3a\xf5\x72\xbf\x67\xb9\x9d\x5f" + "\x01\xee\x10\x7f\x60\x22\xd9\xdf\x03\xbd\x3a\xe5\xa3\xf1\xbf\x7a" + "\x48\xc2\xe2\x4d\x9a\xff\xa3\xa9\x1a\x7c\x57\xd0\x3b\xcd\xff\x8a" + "\x04\xb1\xc6\x1d\x16\xb1\x57\xa8\xdb\x67\x7f\x83\xe4\x52\x9b\x5e" + "\x27\xd5\x95\x20\xef\x3b\xca\xfa\xe4\xf9\xeb\x67\xff\xa9\xbb\x3f" + "\x31\x41\x87\x8a\xbb\xea\x66\xbb\x82\x98\x70\x99\x61\xbd\x31\x7d" + "\x23\x3e\x08\xba\xe4\xcc\x24\x9f\x52\x8a\x3c\x11\xfd\xaa\xea\xae" + "\x36\xa8\x01\xe2\x27\x92\x81\x1f\xe0\x55\xa5\x6d\xcf\x9b\x47\xc3" + "\x67\xc5\xc3\xe6\xfe\x4d\x81\x0f\x97\x1c\x88\xed\xf8\xc6\xe2\x5b" + "\x52\x24\xef\xa4\x3a\x14\x26\xfd\x97\xbc\x29\x7c\xc8\x69\xfc\xc9" + "\x74\x82\xaf\x17\x76\x1c\x24\x07\x78\xc1\x47\xab\x31\x84\x93\xac" + "\x8f\xb9\x0a\xfd\xa5\xf0\xa1\x10\xc6\x4b\x1b\xe1\xa5\x8d\xf0\x12" + "\x36\x37\xd4\xbe\x37\x66\xf6\x6a\x5a\xb3\x24\x73\xbd\x59\x8a\xfe" + "\x03\x36\xaa\x83\x25\xa8\x04\x2b\x61\x5b\x0d\xf8\xc4\x0f\x95\xe3" + "\xee\x2b\xc6\x6a\x0e\xd2\x98\xa3\xc7\x65\x50\xdd\x55\x0e\x1a\x97" + "\x81\xc6\x65\x3f\x27\xf4\x92\xb8\x93\x4c\xb4\x64\x72\x24\xae\xd0" + "\x5b\x8d\xd1\x63\x54\x11\x8b\x4c\x8c\xe1\xad\xb7\x47\x1b\x23\x37" + "\x60\x8c\x80\xc1\x5b\xcf\x68\x67\xee\xa2\x9f\xa0\x5b\xfd\xec\xad" + "\x95\x49\xdb\x70\x17\xd8\xef\x21\xde\xfa\x5e\xcc\x61\x83\x83\xd7" + "\xa0\x9f\xa3\xcd\x17\xea\x93\x75\x39\x57\x9b\xb7\x95\xae\xf6\x3b" + "\x9c\x73\x46\x87\xb7\x73\xd9\xd5\xe1\xed\x9c\x81\xf2\xe8\x07\xee" + "\x35\x9b\xe1\xf4\x8e\xf0\x9b\xf8\x8a\xf2\xd1\xda\x4d\xda\xd6\x88" + "\x7e\x8d\xfa\x8d\x70\xbf\xbf\x7a\xc3\xf0\x35\xa1\x36\x04\x18\xe0" + "\x07\xdd\xa5\x3c\x63\x72\x1e\x0f\x9f\x85\x95\x07\x92\xcd\x8a\x35" + "\x06\x6b\x4c\xf0\xc4\x34\xde\xd1\xea\x35\x2b\x35\xf0\x9b\x79\x2f" + "\xd1\xaa\x51\xbf\xd3\x3a\xb0\xf2\xed\xb7\xdd\x42\xb0\x3b\x9e\xb4" + "\x4d\xe1\xde\x98\xdb\xe2\x93\x7c\xc1\x54\xc0\x95\xfa\x6a\xa7\x35" + "\x7e\x56\xec\xdd\x42\x6f\xf7\x36\xad\xff\x0e\x11\x0b\xcf\x1b\xe7" + "\x3f\x2e\x6d\xd4\xde\xce\x73\xb3\x3f\xaf\xd2\xe9\x18\xbd\xdb\xdd" + "\xca\xec\x55\x72\xad\xde\xb8\x97\xf6\xb4\x3a\xd5\x61\xe6\xd6\xad" + "\x66\x4e\x75\x4d\x54\x79\x9a\x81\xf6\xad\xba\x08\xee\xc8\xbb\xd3" + "\x3a\xee\x50\xf9\xe6\xd1\xf1\xe2\xed\xbf\x5e\x1d\x2f\xde\x7e\x59" + "\x3b\x73\x58\x2d\x65\xa2\x77\x98\x2e\x13\xf1\xed\x37\xee\xb5\x16" + "\xa3\xfd\xb7\x6b\x65\xdb\x04\x93\x60\x06\xe8\xcc\x52\x82\x5b\x29" + "\xe5\x9d\xa3\xd3\x06\xe0\x90\x39\x04\x99\x8b\x09\x3c\xa7\x6f\x4b" + "\x88\xf6\xf4\xcb\xfd\x59\xad\x07\xaf\xaa\x3a\xde\x30\xd1\xfe\xb5" + "\x0f\x32\x93\x2f\x2e\xb0\x92\xf2\x10\xfd\x1b\x3f\x4d\xd2\xbf\xc0" + "\x52\x9a\x9b\x15\xb5\xd2\x37\x8a\x49\xc4\xb1\xa4\x75\x8e\xd8\x95" + "\x58\xeb\x94\x96\x42\xfd\x86\x2e\x84\x64\x84\x77\xc2\xe7\xbf\xaa" + "\x23\x03\xf0\x3e\x84\x31\x18\xc0\x0f\x13\xec\x9e\x31\xa8\x87\x06" + "\xe7\x59\x18\xc6\x3c\xb8\x7d\xea\xa1\x1f\xdd\xce\x8c\xbf\xb7\x3c" + "\xcc\x6c\x77\xb0\x94\x6d\xff\x66\x64\xff\x5a\xc0\x0c\x80\x83\x9b" + "\xbd\x73\x44\xc2\xee\x1d\x9f\x3e\x3f\x6e\xf6\xf6\x2a\xcc\x07\xce" + "\x08\x97\x07\xf9\x80\x3c\x23\x3d\x96\xe2\x66\x87\xb5\xef\x6f\xac" + "\x1e\x65\x7f\xb8\xcf\xba\x26\xdf\x9a\xb3\x7e\xf3\xba\x19\x33\xe2" + "\x47\x91\x25\x8e\xa5\x49\x59\xe2\xd8\xaa\x68\x59\x82\xde\xd7\x52" + "\x7d\x0b\x47\xca\x0e\x4b\xb3\x34\x97\x37\x59\xe9\x2c\xf2\xfc\x25" + "\xb6\xf4\x4b\x51\xaf\x77\xb2\xa5\x77\xdc\x99\xf5\x8d\xdc\xec\x9c" + "\x2d\x51\xa9\x5f\x8e\xd6\x69\x57\xef\xa5\xb6\x63\xa6\xde\x43\xf4" + "\x43\x79\xf0\x09\xec\x3b\x2d\x5f\x2f\x0e\xf2\x33\x84\xbb\x0b\xe0" + "\x67\xae\xbd\x20\xc8\xda\x89\xbe\xf1\x1b\x41\xd7\xc7\x4b\x5f\xcb" + "\x21\x06\x9d\xb1\x99\xc6\xee\x25\x99\xee\xb2\xbc\x07\xd4\xb2\xb1" + "\xa3\x2e\x40\x74\x22\x14\x90\xfc\x4e\x4b\x3a\xa5\x4f\xa4\xdf\x6f" + "\xcb\xf3\xc5\x96\xef\x91\x4c\x9e\x21\xfc\xea\x6c\x82\x5f\x9d\x16" + "\x61\x2f\x75\xbb\xaf\x94\x49\xff\x8e\xc7\x3c\x88\xbb\xe0\x66\x2d" + "\x75\xe0\x2f\x90\x97\xca\x7c\xc9\xfa\x03\x96\x8e\x5f\xf0\xc3\xf4" + "\x2d\x9d\xef\x0a\x05\xf8\xbe\x4c\xd8\x77\xa5\x52\xfa\x33\xe0\xdb" + "\x62\x2c\xa6\x38\xbf\xa3\xa5\x56\xe7\x41\x7c\x63\xdc\x43\x14\xf2" + "\xb8\xb6\x0f\x26\x11\xfd\x4e\xf2\x99\x79\x16\xfc\x54\x29\x2c\x15" + "\xfb\x83\xd9\xbe\x42\xdc\x77\xc5\xbe\x08\x9a\xd0\x20\x68\x69\x4b" + "\xbf\x4e\x17\xaa\xa4\x3c\x1a\x8f\xf2\xb4\x7f\x5e\x90\xfb\xe7\xbb" + "\x61\xfd\x27\x3d\x5b\x74\x5c\x1d\x76\xd7\x71\x5d\x41\xee\x86\xdc" + "\x1c\xeb\xcc\xfc\x78\x16\x15\x15\x38\x2f\x77\x9d\x75\x43\xee\x0f" + "\x37\xe6\xe6\x0b\x41\x0f\x5f\x87\xeb\x0a\x89\x06\x45\x62\xb4\x4f" + "\x05\x8c\xdf\x2d\x92\xfa\xab\x19\xe2\x5c\x4f\x9e\xc7\x2e\xf2\xa8" + "\x55\x89\x19\x52\x87\xde\x47\x70\xfd\xbd\x3c\xbf\x2e\x0f\x79\xc0" + "\xc7\xf5\xb2\xdf\x3f\x25\xed\xb6\xde\x7d\x5f\x83\xd5\x53\xd4\x4f" + "\x67\x84\x5f\x7b\x4f\x9c\x0d\x4b\xfb\xe9\x77\xbb\xdc\xec\x58\x73" + "\x84\x07\x79\x6f\x11\xe8\xa0\xa0\x87\x9f\x41\x0b\x35\xde\x99\xda" + "\xf9\xfd\x4e\xbe\x89\xf7\x54\x0f\x31\xa1\x9b\x46\xbc\x0e\x49\x5f" + "\x7f\x3f\x5f\x87\x23\xf1\x2f\x3d\xd0\x3b\xe8\xf2\xd1\xf2\xe0\x27" + "\xbc\x78\x0b\x33\x40\xf7\x40\x34\x24\xf8\xca\x06\xaf\x81\x3b\xde" + "\x4d\x25\x5e\x46\xc4\x91\x6f\xd0\xec\x88\x79\x5c\xa8\x87\xea\x29" + "\x8c\xc8\x1d\xef\x65\x08\x3e\x7e\x08\x78\xf3\x7b\x6b\x16\xf6\x08" + "\x49\xbb\x27\x7c\x56\x7f\x79\xbc\x3c\xd3\x93\xf4\xed\xf7\x47\xb5" + "\x31\xf4\x83\x66\x69\x76\xe8\x06\x89\xd7\xef\x65\x10\xce\x79\x30" + "\x17\x44\xe7\xcb\x75\x78\x61\xbc\xe8\x3b\xce\x50\x88\x0e\x07\x5f" + "\xdd\x1a\x30\xc8\x78\xba\xef\xa6\x4b\xf9\xe8\xbd\xd4\xe8\x33\x6c" + "\x29\x0b\xbd\xb7\x20\xe2\xbb\xe6\xdd\xba\x91\x34\x62\xfd\x3a\x5c" + "\x6d\x7c\x2c\x6b\x33\xd4\xce\x1b\x6d\x73\xac\x1b\xd7\x09\x13\x02" + "\xa1\x06\x28\xd8\xf8\xc8\x63\x56\x50\x91\xac\xc5\x4b\x97\x66\xdd" + "\xf3\xad\x6f\x7e\x3b\x9e\xdd\x93\x4d\x69\x05\xeb\xad\x4b\xd3\xe7" + "\xc8\x4f\xdf\xb8\xef\xde\xff\xcc\xba\x77\xf9\xb7\x1e\x5c\x39\xca" + "\xfd\x88\x04\xc2\x09\xc8\x5d\xb1\xdd\xec\xfd\x1a\x69\x0f\xf7\x5e" + "\xdb\x70\x7b\xb8\xf7\x7a\x18\xc3\xd1\x60\x2b\x49\x32\xef\xdb\xe9" + "\x8f\x60\xf7\xfe\x0e\x89\x37\x71\x89\xd4\xff\x40\x04\x6f\xde\x17" + "\x70\x85\xee\x40\x9e\x03\xb4\x12\xfd\x7b\x77\x45\xf4\xb7\x08\x2d" + "\x78\x5f\xd8\x8a\xea\x78\x01\x7c\xc8\x0a\x9a\x04\x6e\x48\x7e\xa5" + "\x75\x85\x8e\x1b\xd5\xf2\xac\x92\x41\x2f\x87\xef\x84\xdf\xc7\x71" + "\xd6\x41\xb8\xd0\x03\x3b\x0f\xa4\xf3\xc4\x45\xc7\x65\xbd\xad\xe5" + "\x38\xfb\x00\x3f\xab\x9d\xcf\x26\xf5\xb1\xd6\x77\xb9\xe3\xbd\xa5" + "\x52\x16\x7c\xaf\x48\xe0\xcd\xf6\xa9\xf7\x88\xf3\x70\x71\xb7\xad" + "\xf5\x68\x04\x7f\xde\xaf\xc1\xdc\x44\xf4\xd1\xad\x5d\x23\xf4\x38" + "\x31\x94\xd6\xaf\xc7\x3e\x28\x98\xc1\x0c\xc6\x19\x35\xac\xd6\xc0" + "\x4b\xdd\xac\xb5\x5e\xda\x44\xbf\x9f\xa0\xf3\xcf\xf4\x4c\xeb\xdf" + "\x70\x78\xa4\xfe\xab\x2a\x4a\xff\x55\x6c\xe3\xa7\x3a\x6c\x5e\xf0" + "\xc8\x4e\x97\x57\xf8\xdc\xbd\xbb\xc3\xe6\x83\x9d\x53\x3c\xc1\x29" + "\xbb\x24\xc4\x87\xe8\x79\x2a\x8d\x4d\xec\x21\xf3\xa4\x4e\x81\xe4" + "\xb1\xf7\x9f\x92\xb2\x89\x4c\x07\xdc\xe9\x19\x78\x65\xc4\xfc\x10" + "\x5e\xf6\xd3\x1c\x2d\x1d\x8d\xee\x25\x6d\x33\x68\xbe\xcd\xde\x3f" + "\x0d\x19\x15\xb0\x7a\xda\xa0\xe6\x3d\xed\xa0\x3f\xfa\x05\xed\x8b" + "\xf0\x97\x5c\x9f\xb3\x9e\x16\x7b\x3f\xf6\xcd\xb1\xe2\xc3\x1b\x69" + "\x3e\x4f\xe8\xf3\xb9\x3c\xe4\xbd\x1b\xf3\xe5\x77\xfc\x61\x9a\x3e" + "\x97\x03\xb7\x3e\x9d\x1c\xb3\x8d\x59\x8f\xd5\xdf\x81\x74\x5a\xff" + "\xef\x0b\xbb\x66\xf8\x22\x18\x59\x96\xe8\x70\x86\x56\x7e\x95\x5e" + "\x7e\xa4\xcf\x6c\x71\x59\x1c\x4a\xae\xbb\xa4\xbd\x99\x16\xe2\x7c" + "\x98\xbd\x19\xce\xa3\x5b\x24\x4e\xea\x3a\x38\xed\x3c\xf0\x83\x6f" + "\xa9\xbb\x49\xfe\xde\xed\x7b\x47\xd3\x03\xd0\xda\xfe\xc3\x27\xb7" + "\x33\xb6\xd6\xb7\x39\x33\xac\x43\x81\xee\x03\x7e\x30\xa9\x1f\xd1" + "\xf7\x5f\xc2\xf6\xc2\x6e\xf6\xc1\x4a\xd8\x2f\xea\xba\x5f\xac\x2b" + "\xa9\xb7\xf9\x20\xc5\xe5\x63\x8c\xea\x5b\x27\x6c\x31\x1c\x7f\x58" + "\x2b\x70\x8f\x64\x6d\x21\xe7\x17\xf2\x33\xfa\xb9\x0a\x78\x17\x79" + "\x37\xf4\x83\xf0\xf9\x87\xbc\x27\xf9\x87\x16\x9c\xad\x50\xfa\xea" + "\xd1\xf4\x85\x44\x1f\xf2\xb2\xd7\xe5\xac\x7f\xf4\xd1\xcf\x26\x0d" + "\xd1\xe7\xad\x35\x0e\xb5\x9c\xea\x84\xfc\xeb\x96\x78\xfa\x01\xd1" + "\xff\x17\x9a\x25\xff\xf6\xdd\xb3\xb4\x6e\x6e\xea\x63\x6d\xd3\x74" + "\xfe\x5d\xae\xa3\xb6\x34\xee\xf8\x60\x6d\x64\x6d\x7c\xe0\xfb\xf4" + "\xda\x68\x33\x8d\xbe\x36\xda\xe6\xd0\x3e\x7b\x82\xbe\xa7\xb9\xd9" + "\x2f\xc5\xfd\x0b\xbc\x6b\x3c\xb8\xd3\x1c\xbc\x5b\xf0\xe0\x59\x5b" + "\x98\x02\xfe\x1b\xba\x69\xec\x07\x21\x92\x6b\x43\x44\x23\xb2\x82" + "\x2c\x19\x7b\x41\xf5\x3a\xe8\x1d\xa7\xf3\xe0\x20\x77\x67\x6d\x21" + "\x7a\x41\xef\x55\x7d\xd2\x1e\xe4\xa1\xcb\x24\x87\xd0\x73\x75\x2f" + "\x68\x85\x8a\x00\x1d\x4c\xee\xd7\x6d\xf5\x3a\x8f\x6b\xde\x66\x15" + "\x7e\xdb\xb1\x6f\x87\xa4\x6d\x5d\x13\xf6\x6e\x6a\xe7\x88\xa0\x41" + "\x21\x33\xce\x19\x58\xf5\x0f\xa8\x5e\xd8\xa8\xad\x43\xff\x62\xee" + "\x34\x07\xd3\x85\x5f\x93\x03\x3f\x10\xb6\x69\x77\x4a\xdb\xb4\x3b" + "\x59\xc3\x3a\xc0\xa1\x2d\x78\x55\xdd\x78\xe2\xec\x9a\xe8\x74\xfb" + "\xa3\x6b\xb2\x6c\x79\x5b\xb2\x60\x97\x3a\x62\x7f\x97\x6b\xc8\xd1" + "\x6e\x95\xf0\x6d\x5f\x19\xd1\x55\x49\x7b\x52\xd0\xcc\x79\x01\xe1" + "\x57\x59\x3b\x4f\xea\x10\xf7\x1d\x4a\x3e\xc1\xbb\x89\x70\xae\xe3" + "\x4b\xc4\xc3\x8f\x1b\x80\x1d\xd7\x81\x4c\x56\xe3\xe0\x4e\xe8\xd0" + "\x28\xfd\x06\xdd\xbf\xc3\x00\xa5\xd3\xda\x47\x9a\xf0\xc9\x02\xfd" + "\x9c\xc4\xbd\xf6\x16\x37\x33\xcf\xd7\xda\x3b\x06\x5b\x51\x71\xbf" + "\x41\xf0\x19\xed\x17\xe5\x7d\xc1\x76\x8f\x0e\x4b\xe2\x7d\x17\xc2" + "\xd7\x04\x6c\xc6\x06\x38\xec\x53\x3b\x8c\x7a\x79\x37\x6b\x17\x77" + "\x82\x1e\xf4\x89\xe7\xa6\x87\x7c\xd1\xfe\x21\xda\xeb\x25\xdd\x6a" + "\x6f\xa4\x74\xc2\x97\xf6\x1d\xd4\xe7\x24\xe9\xb7\x42\xd4\xb3\x54" + "\xb7\xcd\x8b\x86\xdb\xbd\xd9\x36\x62\x96\xd7\x3c\xfa\x68\xee\x86" + "\x7c\x6b\xb6\x74\x03\x91\xb6\x7e\x6d\xce\x57\x35\x7f\x10\xeb\x72" + "\x37\x67\xad\xc9\x11\xf7\xcd\x28\x55\x3e\x8e\x80\xef\x1c\xc8\x37" + "\xe2\x0e\x87\x18\xd3\x1f\x37\x36\x68\x7c\x54\x37\xeb\x34\x4a\xdb" + "\x1f\xd7\x0f\xe5\xde\x36\xe1\xa7\xd4\x8f\xe3\xfa\xde\x06\x1d\xcb" + "\x00\xfb\x4a\x0d\xce\xe5\xe0\x2b\x64\xff\x1e\xde\x03\x3d\x0b\xe5" + "\xa1\xfd\xaf\xdd\xa4\xaf\xd7\x4a\x4a\x87\x7d\x82\x73\x1d\x6c\x12" + "\xfe\xf8\x8c\xba\xcb\xdf\xc2\xe3\x7b\x6c\x44\xd7\x44\xcc\x6f\x9c" + "\x47\xc9\xb8\x32\xae\xc5\xa0\xd7\xd0\x05\x3a\xd7\xc1\xb6\xdb\x95" + "\x42\xfc\x49\xb2\x9b\xfd\xb1\x8e\x64\xbd\x96\x1d\x5b\x99\x69\xbf" + "\x3c\x63\x74\x4b\xbd\xb2\x6b\xf5\xdb\x85\x8c\x69\xfb\xa1\xbb\x52" + "\xe8\x39\x5d\x32\x66\x4c\xb9\xbf\x8b\x9b\xf8\x52\xc8\xe1\xd2\xff" + "\x9b\xab\x96\x64\xa9\x2e\x5e\xde\xd3\x4c\xfc\xb8\x9f\xef\xea\x69" + "\xa6\xf4\x1b\x29\x5d\x8b\xd3\x73\x3a\xb0\x1c\xb1\x51\x76\x9d\x0e" + "\x50\xfa\x34\x4a\x97\xf1\xdd\xca\xcf\x34\x2f\x0f\x05\xe0\x53\x66" + "\x3a\xdf\x75\xa6\x99\xda\xa4\xf1\x7f\xc1\x2b\xc7\xdf\x53\x27\x70" + "\x4e\xd0\x4d\x57\x80\xef\x3e\x9d\x26\x6c\xf9\x77\xf7\xd4\xa9\x3c" + "\x2f\x06\xef\xb4\x6f\xc5\x13\x4e\x1c\xe7\x25\x69\x4c\xb3\xff\x8f" + "\xe9\x65\x9d\xdb\xa0\x53\x26\x5c\x6b\x01\x5c\xa9\xaf\x3d\x9a\xce" + "\x87\xf8\xb6\x4e\xa2\xff\xf3\x99\xa4\x3f\x9d\x19\x7a\x5b\xb4\xf6" + "\xbd\xb4\xb7\xbb\xb1\xbf\x13\x2c\x8e\xd2\x9f\x53\xea\xaf\x02\x24" + "\x47\x4e\x0f\xeb\xaf\x24\x0f\xd9\x69\xd7\xd7\x1e\xda\xd6\xe0\xe1" + "\x56\x1d\xc2\x3f\xb1\xa2\xb5\xe5\x86\x2e\x45\xaf\x93\x53\x9d\x7c" + "\xb0\xbf\x91\xf6\x62\x13\xd1\x20\x6f\xd2\x36\xda\x73\xd1\x06\x64" + "\x00\xdf\x74\x4e\x7b\x72\x28\x2b\x64\x94\x3e\x62\xb6\xb0\xc4\x68" + "\xfe\x9f\xda\xf3\x44\x78\x56\xaa\x63\x90\x68\x7d\x31\x2b\xed\x61" + "\x1f\x0a\x1e\x12\x67\xc5\xc0\x91\x21\x9a\x73\x9a\x77\x3b\xb5\xd3" + "\x44\x72\x4b\x62\x2f\xfb\x70\x26\xe6\x1e\x36\x51\x0d\x43\x42\x96" + "\x31\x53\xdf\x8c\xdd\xec\xc3\x89\x98\x77\xd4\x45\xf3\xb2\x24\xe8" + "\xcf\xfc\x77\xf8\x68\x04\xac\x8b\x0a\xb9\xc7\xfa\x28\xe0\xfd\xd1" + "\x33\xe0\xf1\x49\xee\x11\xcf\x25\x39\x5c\x15\x78\x23\xee\x04\x7c" + "\xf4\x4c\x91\x87\xab\x9f\x38\x18\x6f\xa5\xbd\xe6\x13\x03\x0b\x06" + "\x48\x46\xa7\x7e\x1b\x4a\xce\xc1\x8f\x64\x23\xd1\xad\x72\xd8\x62" + "\x99\xaa\xb6\xb2\x64\xf8\xe0\x2c\xb1\xf1\x40\x87\xaf\x9e\x75\xd8" + "\xea\xd9\x1f\x82\xb5\xcc\xb9\x09\x3a\xdf\x3f\x2e\xfc\xc0\x5e\x8b" + "\x3b\x58\x71\xd4\x46\xc8\xfa\x9f\x68\xeb\xc3\xe3\x1f\x1c\xff\x88" + "\x7d\xe0\xfc\x88\x59\xbf\x23\xde\x7b\xda\x32\xff\xc0\xda\x32\xfe" + "\xc0\x4a\x7a\xb8\x0a\x7e\xb1\xf8\x71\xb4\x51\x4e\x75\x35\xc2\x5f" + "\x65\xb2\x3a\x60\x89\xa7\xf1\x1b\x97\xdb\x41\x93\xbd\xcc\xb9\xee" + "\xb7\xe8\x63\x6e\xc3\x25\x66\x72\xae\x7b\x47\x3c\x0b\xfd\x0b\x8d" + "\xd7\x95\xd3\x25\x6c\x8b\xe1\xab\xd3\x65\xf7\xc0\x97\x81\x5a\x8d" + "\x3e\x86\x64\xbf\x09\x5e\x46\xbd\xfc\x81\xe2\x70\x79\x11\x2b\x67" + "\x3f\xe0\x41\x7d\x6a\x5f\x29\x61\xd2\xd6\x45\x30\xfd\x4f\x0d\x3e" + "\x99\xd1\xf0\xf9\x70\x07\xe0\x83\xbb\x16\xea\xa6\xfe\x46\xea\x5b" + "\x06\xc1\x40\xd5\xdb\x00\x0e\xe0\x5c\x10\xf5\x57\x5d\x62\x09\xce" + "\x75\xb8\x8b\xf1\xd1\x59\xf3\x0a\xa3\x49\x1d\x3c\xd7\x54\x7d\x99" + "\x19\x31\x6f\xe0\x43\xaa\xc5\x77\x01\xf3\x36\xcc\x99\x37\xce\xd7" + "\x44\x7f\x47\xe8\xaf\x19\xb8\x47\xbf\x47\x69\xbe\xca\xa9\x0f\x39" + "\x34\x57\x8d\xf8\xd5\xd6\x9b\x07\x3e\x8c\xb1\xd7\x13\xae\x44\xd2" + "\x77\x9f\x3e\x13\xa4\xb5\xa3\x0a\x39\xf6\xa3\x1c\xb5\xd2\x90\x2c" + "\xed\xf2\x3b\x32\xf7\x93\xdc\x50\xff\x63\xe1\xfb\x25\x81\x64\x1d" + "\x61\xcb\xb1\x57\xdc\x11\xfd\x63\x9e\xbe\x27\xec\x9e\x0c\xbf\x2a" + "\x1f\xd5\x1a\x84\x8d\xb0\x5f\xf3\x87\xe9\xa7\x3d\xf6\x8f\x15\x6e" + "\x76\xfb\x11\xb9\x26\x3a\xc5\x5d\x56\xd0\x94\xb1\x78\x36\xda\x07" + "\xdb\x60\x9b\xcd\x6f\xcc\x64\x09\x0a\xf7\x26\xac\x36\x73\x57\xb0" + "\x05\x38\x94\x20\x70\x5f\x7e\x23\x3e\xdb\x6b\xa6\x7d\xb2\x93\xd2" + "\x8d\x7a\x3a\xf6\x63\x95\x64\x6f\xc8\xfd\xcb\xb7\x98\x79\xf1\x65" + "\x36\x4d\xe8\xd0\xf4\xf4\x2d\x5e\x73\x87\x85\xe1\x7e\x5b\x10\xbe" + "\xa3\x50\x86\xd2\x63\x68\xdf\x3d\x4a\xed\xc2\x77\x6b\x8a\x9e\x9f" + "\x0f\x64\x1a\x5d\xf6\x16\xb1\xce\xe0\x5f\x50\xec\xb7\x32\x3d\x76" + "\xb9\xdd\x6b\x16\x73\xa6\xa7\xe5\x67\x8a\x7d\x1e\xfe\x65\x88\x8f" + "\xe7\xa2\x3f\xbd\x22\x5d\x21\x39\x5c\xd8\x98\x44\xa5\x19\xe0\xcb" + "\x07\xfe\x62\xa3\xd2\x62\xa8\xcf\x2c\xfc\x4e\x6d\x63\xcf\xc7\xba" + "\x5b\xbe\x05\xe7\x89\x72\xaf\x17\x6d\x6f\xe1\x4c\xfa\xa0\x96\x69" + "\x92\xa7\x38\xee\x8d\xd6\x01\xe0\x0c\x07\x6d\xab\x03\x99\x86\xd0" + "\x40\x66\x0c\xda\x47\x5d\xd0\xdf\xd2\x18\xa9\x5d\xd8\x5f\x74\x31" + "\x5e\x79\x9f\x97\xe3\x3e\x23\xd5\x2b\xfa\x63\x0f\x30\x9e\x78\xbf" + "\x6d\x74\xbb\xb5\x79\x87\x9c\xc5\xdf\x21\x9c\xfe\x53\x00\x34\x25" + "\x64\x0a\x04\xac\x3f\xc0\x9e\xff\xa7\x1f\x62\x4e\x43\xb4\xce\x43" + "\x71\x81\xc0\x3c\x0f\x53\x8a\x69\xed\xc8\x73\xce\x3f\x3d\x05\x9e" + "\xb3\x44\xe5\x9c\x9e\x77\x00\x77\xcd\xfd\x24\xd7\xed\x0a\x04\x85" + "\x8d\x57\xd2\x6d\x8d\xae\x80\x87\xb5\x95\x7e\xcc\xda\x82\xae\xd2" + "\xa3\x97\xbc\x46\x69\xeb\x65\x44\xbd\x2f\xe2\x5b\x09\xad\x97\xac" + "\x50\xe3\xd8\x72\x32\xc9\x5e\x04\xbb\x7f\xc8\xbd\xe0\x4f\x01\x5d" + "\xde\xba\xfa\x18\xfe\xbc\x02\x3e\x7f\x61\x07\xad\x56\xc5\x35\x52" + "\x5f\x4a\xb8\x3f\x8d\xcd\x13\xb6\x46\x7f\x4e\x4b\xf2\xb1\x0c\xad" + "\xde\x0b\xb2\x5e\xca\x7f\x95\x7a\x81\xb7\x6d\x75\x42\xa7\x4e\x63" + "\x8a\xab\x09\x51\xdd\xa1\xa4\xb8\x4e\xda\x6b\x4a\x88\x17\x22\xde" + "\xe6\x2f\xcf\x50\x3b\x35\x1d\xc1\x4e\x06\xbf\xe1\x0d\x2a\xed\xfd" + "\x17\x2c\x4c\xb3\x6b\x2b\x39\xcf\xfe\xbc\x4d\xe5\x69\xc9\x24\x07" + "\x42\x97\x5c\x02\x3a\x0b\xdd\x7c\x71\x88\x8d\x73\x15\xb8\x19\xfc" + "\xdd\x52\x1d\xbb\xde\x85\xde\x9e\x68\x55\x88\x5b\x0c\x6f\x0c\xba" + "\x59\x35\xd1\x6f\xe1\xff\x76\xfb\x8d\x7b\x93\xb6\xb1\xbb\xb9\xc1" + "\x2c\xec\x22\xd5\xca\x59\x87\x68\x6e\x03\xa2\x3f\xbb\xfd\xfd\x51" + "\x36\x74\x31\xe7\xd9\x5f\x62\x61\x43\xc7\x4d\xfe\x26\xd8\x11\x71" + "\x9a\x33\xbf\xe3\x2f\xe9\x6e\xf6\x27\x71\x77\xa7\x02\x3c\x96\xa0" + "\xf3\x7f\xd9\xef\x4d\x8c\x15\xb6\x78\xf0\xc3\xa7\x6e\x0a\x36\x55" + "\x5f\x64\x46\x09\x8f\xbf\x14\x75\xf4\xfb\x9d\xbc\x22\xd6\x86\x75" + "\xa4\xd5\x6d\xa6\xba\x97\xf1\xca\x58\x9b\x9b\xfd\xa5\x5e\xce\x8d" + "\x78\xce\xc3\xf7\xe0\x15\xdc\x79\xfd\x73\x4f\xfd\x10\x78\xac\x3f" + "\xd7\x10\xdf\xec\x1c\x48\x88\xb5\x7d\xd3\x52\x4a\xfc\xc4\x5f\x9a" + "\xdc\xca\x90\xe4\xf7\x35\x5f\xbe\x23\x75\x0f\xe1\x39\xdc\x67\x89" + "\x77\x51\x25\x24\x03\xa4\xf4\xb1\x8f\x67\x0c\x39\x98\xe1\x0a\xed" + "\xad\x43\x24\x47\xf1\x7d\x99\x09\x55\x53\x59\x3a\x7d\x9b\xda\xc7" + "\xba\x62\x83\x06\x96\x42\x7f\xc9\xde\x1b\xf3\x10\x5f\x24\x03\xfa" + "\xe1\xf6\x4b\x38\xb3\xee\x12\x74\xbf\x7a\x2f\x4b\x55\xa9\x3e\xe8" + "\xa5\xab\xa7\xb2\x54\xe8\xa4\x29\x2d\x2d\x2b\x24\xcf\x6c\x74\x99" + "\x73\xfb\x54\x36\x67\x78\xbb\x7f\xe9\x97\x3c\xe3\xc7\x56\xfc\x6e" + "\xf6\xb2\x9b\x6d\x5f\xe3\xdd\x54\x2f\x62\x90\x72\x7e\xa3\xc5\x20" + "\x79\xcb\xae\xf7\xcd\x75\x12\xef\xc4\x19\x05\xe1\x1b\xce\x80\x34" + "\xdd\xb7\x22\x7c\x18\xc7\x87\xca\x71\xe7\x50\xa4\x29\xc9\x80\x65" + "\xb2\xe8\x87\xe6\x77\x34\xb4\x7d\xf6\x6a\xd4\x81\xfe\x64\x65\x4b" + "\xbd\x39\x7c\x92\xba\x59\x97\xd0\xf3\x54\xec\x65\x09\x4f\xee\x65" + "\xc9\xed\x8f\x8a\x71\x05\xe4\x5a\x34\x32\xf4\x57\x2d\xc7\x3a\x23" + "\x9c\xa0\x7e\xa3\x3d\xe0\x46\x47\xf0\x82\xb3\xa4\x80\xab\xce\x1f" + "\xc0\xef\xce\x5f\xbf\xe2\xdc\x70\x98\x2d\xef\x09\x4a\x3f\x7a\xab" + "\x98\xf7\x00\xd5\x77\x60\x2a\x4b\xee\x65\x7f\xbd\xcf\xb5\x16\xb4" + "\xd6\x72\x8b\x73\xc3\x11\xaa\xfb\xaf\xdf\xc6\x7e\x54\x49\xf0\x91" + "\xfb\xd2\xc7\x09\xae\x40\x17\x43\x0c\x97\x07\x6d\x3c\x84\x7a\x28" + "\xcf\x53\x62\xbc\xfb\x2c\xd6\x2c\xe9\x37\x56\x8c\x35\x7c\x1e\xa1" + "\x8d\xc3\x75\x49\xd4\x77\xd0\xb5\x9a\xf8\x57\x6d\x4c\x3a\xac\x25" + "\x7e\xfd\xf5\x94\x73\xc3\x41\x86\xf9\x41\x7e\x7a\xef\x74\x11\xc4" + "\xb3\xce\x0d\x9f\x17\xe4\xe9\x65\x1f\xa3\xde\xff\x13\x39\x67\xc3" + "\xf9\x4f\x24\x4f\xfd\x5e\xd8\x02\x76\x2d\xde\x47\x30\x92\xfa\xc7" + "\xbf\x3e\x8e\xbe\xba\xd9\x5f\xd7\xba\x0a\x3e\x1e\xfd\xae\x2f\xad" + "\x7d\xc2\xfb\x6d\x1d\x42\xf7\xf6\xf1\xf7\x1e\x0c\xaa\x5c\xd2\xb3" + "\xbf\x25\x13\xef\x76\xc8\x4d\xbf\xa0\x05\x82\x9e\xdc\x8e\xb3\xf1" + "\xbf\x4d\x34\x2b\x72\x7e\x31\x16\xf0\x4c\xa3\xcd\x71\xd4\xb9\x47" + "\x32\xfa\xaa\xcf\x31\x4f\x98\x77\x48\xc5\x79\x16\x6c\xd6\xaf\x58" + "\x98\xc4\x3f\x5e\x43\xf5\x4a\x1a\x57\x1e\x48\xd7\x7c\xb1\xa6\x0f" + "\xc4\x7d\x62\xe4\x4f\x58\x98\x6e\x5f\xcb\xe3\x3e\x81\x0d\x2f\x6c" + "\xa2\x2d\xa0\x51\x07\x0c\x72\xed\xa0\x8f\x5a\xd9\x39\xf2\x9c\xfd" + "\xe3\x4e\x2a\x3f\x67\xd4\xf1\xc6\x10\xdd\x71\x10\x99\xa6\xf1\x88" + "\x3b\x78\x44\xab\x68\x3f\x18\xe7\xf2\x0d\x31\x79\xf6\xff\x37\xf8" + "\x16\x18\x87\xfb\xd7\x7a\xdf\xae\xed\x8c\xe2\x6f\x99\xf2\x8c\xe2" + "\x6f\x75\xba\x3c\xce\x13\x08\xc6\x0e\xb3\x88\xe7\x41\x7c\x97\xea" + "\x4b\x9c\xd7\xe4\x4d\x5c\xe4\x96\xeb\xe6\x6f\x4e\x9e\x28\xe9\x6d" + "\x56\x80\x95\x62\x5c\x9a\x8e\x63\x1c\xc6\x4c\xf5\xb8\xf5\xb3\x72" + "\xbd\xee\x31\x63\xe4\xe8\x63\xa3\x31\x49\xbf\x1d\xf3\x0e\x89\xb1" + "\xc1\xf7\x94\x18\xdb\x89\xef\xa1\xfc\xb5\x8d\xe7\x84\x8c\x91\x58" + "\x31\xaf\xc9\x39\x15\x75\x9c\xbc\x8c\xfe\x61\x4e\x88\x3e\x4c\xe9" + "\x63\x27\x9a\x78\xfc\x93\xf1\xd7\x58\xa7\xbc\x6b\x5d\xb1\xc8\xfd" + "\x0c\xd1\x60\x79\x17\x17\xf6\x3f\x27\x4f\xf2\xca\x45\x6e\xc8\x30" + "\x03\xd4\x1e\xe1\x47\x14\x1d\x3a\xb9\x1a\x73\x75\xfb\x61\x96\x21" + "\xf1\xf0\xe4\xb7\x20\x3b\xcb\x18\x66\x27\x49\xfe\xfd\x4b\xab\xb4" + "\xfd\xd1\x6d\xb1\x15\x61\x8b\x1d\x4d\x63\xaf\xad\x8f\x27\x05\xbd" + "\xe3\x49\xb3\x56\x50\x7f\x7d\xc2\xc6\x89\xfa\xbb\x39\xa8\xd3\xbf" + "\x13\x3e\x0e\xdd\x79\xb1\xa6\x43\x05\x2d\x2b\x96\x3e\x30\xa9\x3f" + "\xb5\x61\x1d\x2a\x7c\x15\x38\x78\x2b\xf2\xd1\xdc\x5f\x40\x1e\xe9" + "\x5b\xaf\x4f\xbb\xc7\x7f\xf2\x25\xed\x8e\x7e\x1a\xec\xbe\xa8\x6c" + "\xa7\x5b\x31\x08\x3b\x61\xc0\x00\x6d\x8b\xbe\x1b\xa0\x2f\x3d\xd9" + "\x1f\xd1\x59\x9f\x10\xb2\xa3\xf4\xb3\xf1\x77\xa3\x8e\x23\x34\xde" + "\x71\x32\x6e\xcd\x89\xc7\x8f\xcd\x61\x02\x07\x06\xb8\x25\xfe\x0b" + "\xf5\xc0\xc9\xbf\xcf\x89\x86\xd3\xf2\xa0\x5a\x22\x69\xd0\xc9\x14" + "\x2e\xd6\xfa\xc9\x94\xcf\xe6\x27\xfe\xbe\x4d\xe7\x45\x24\x9c\x93" + "\x89\xbe\x9c\x5a\x2a\x60\x5d\x7e\xba\x1c\x7e\xa5\x9f\x28\x86\x9f" + "\xfc\x7f\x2c\x42\x3c\x82\x60\xf9\xe9\x43\xa1\x12\x0b\xfc\x2f\x33" + "\xb5\xfc\x74\x73\xaf\x8d\x19\xb2\xe8\x0f\x7e\xfd\x21\xe3\x91\xcc" + "\x9a\xcc\xe3\x89\x3f\xa1\x75\x5e\xb4\x86\x99\xbf\x97\x07\x7d\x45" + "\x5a\x0a\xe2\x05\x20\x56\x00\x62\x7d\x84\x4a\xd2\x26\xd1\xf3\x64" + "\xe2\xe7\x92\xb9\xe9\x74\x1d\xce\xfa\x43\x0e\x4e\xf4\xf8\x04\x6c" + "\x99\x0d\x2e\x6f\x80\x15\x9d\x63\x26\xc4\x23\x08\x56\xc6\x66\x76" + "\xf8\x4e\x0a\xf9\x26\xc9\xc6\x52\x88\xff\xc0\xdd\x16\x8b\x9a\x18" + "\x9b\x41\x7b\xfc\x62\x39\xee\x0b\x5c\x8e\x5b\xf6\x1b\xfd\x17\x34" + "\x8e\xe4\xf0\x62\xd1\x77\xf7\xe9\x20\xd5\xaf\x96\xf7\x1f\x09\x95" + "\xf7\x37\x49\x5f\x11\x6d\xac\xb8\x80\x7b\x5c\xbe\x36\x92\xb9\x2e" + "\x8b\xd8\x8c\xb0\x25\xc0\x18\x31\x3e\xb4\xfd\xc1\xa5\x73\x22\xbe" + "\x42\x90\xde\x4b\xd6\x6a\x65\xfa\xa9\x4c\x7f\x1b\x1b\x2a\xef\x17" + "\x63\xef\xf0\xc9\xb2\x59\xe2\x99\xca\x47\xc3\x41\x1b\x73\x18\x0e" + "\x34\x76\x8c\x0f\xe3\x0f\x02\x26\x04\x03\x6d\xac\x96\x2b\xda\x38" + "\x31\xc6\x3f\x10\x55\xd8\x4b\xe3\xa4\xb1\x8a\x71\x5e\xa1\x71\xb6" + "\xe6\x31\x16\xa8\x9a\xe7\xfc\x24\xbe\xbf\x09\x32\x6a\xc9\x87\xc4" + "\xc3\x17\xd6\x30\x92\x45\x8d\x2f\x17\xd7\x18\x76\x13\x6f\x52\xec" + "\x25\x99\xd4\xcb\x3d\x1d\x34\x26\x97\x8d\xfe\x82\xf5\x0c\x3c\x8e" + "\xce\xaf\xc3\x4e\xfc\x03\xf5\x34\x2b\xf6\x70\x0f\xf1\xa6\x01\xd8" + "\x31\xbb\xf2\x68\xfc\x24\xc3\xf6\x6a\xfd\x47\xde\xa2\x8b\x72\x5c" + "\xe6\xb5\x2c\xe5\xad\xef\x94\x1b\x5c\x5d\xe5\x4c\x1f\xcb\x43\x94" + "\x8f\xc6\x63\xa1\xba\x12\x31\x1e\x95\xc6\xb9\x8f\xfa\x19\x88\x1a" + "\x53\x7b\x7f\x80\xea\xfc\x13\x8b\x5f\xc1\x94\xbd\xe7\x69\x1c\xe7" + "\x99\xa5\xa6\x98\xf8\xaf\x6f\x80\x5f\x74\xdf\x34\x21\x93\xa5\xba" + "\xd9\x3f\x52\x25\x8d\x17\xbe\xce\xaf\xef\x63\xa7\xee\x0b\xfb\x33" + "\x47\x8c\x88\xc4\xd8\x55\xc0\x23\xe1\xd7\x1c\x7b\x86\x9f\x70\x06" + "\x67\xfe\x9b\xa9\x0d\x7f\xda\x64\xd1\x1f\xc7\x7c\xd8\x35\x27\xd0" + "\x3b\x62\xa3\xe1\x1e\xb6\x42\xe5\x32\x39\xc1\x0c\xf5\x13\x3f\xb7" + "\x18\xbf\x80\xe1\xa8\xf6\xbb\xaf\xb0\x05\xd4\x46\x3f\xe4\xef\xa6" + "\x62\xaf\x61\xe7\x2b\x6c\xce\xb5\xd1\x94\x53\x05\x63\xd1\x6f\xe8" + "\x7a\x51\x1f\x8d\x6d\x12\xed\xdc\xdf\x1e\xbe\xc6\xac\x82\x96\x49" + "\x3a\xd8\x6d\x85\x2e\xf5\x1a\xdb\x15\x3c\x1c\xec\x35\xae\xad\x5c" + "\x77\xaa\xde\x0f\xaa\xc3\x3d\x56\xdf\xaf\x1d\x0e\xdd\x85\x63\xd5" + "\x55\xb9\x47\xd8\x5b\x96\x54\xed\x21\x7a\x41\xbc\xc2\x31\x0b\xce" + "\x65\x68\xef\x3c\xe8\x63\xf9\xfb\x19\xe2\xf9\x25\xba\x82\xcb\xd8" + "\xb1\xfa\x74\xd6\x70\x09\xbe\x10\xd3\x26\x3d\x7d\x89\xe6\x52\xa3" + "\x21\xe0\x49\xa1\x93\xe6\xf9\x69\xc9\xd5\x7b\x74\x1e\xfe\x9f\xf7" + "\x15\x5e\x66\x06\xeb\x3a\xf1\xbc\x78\xb1\x95\x07\x6b\x0d\x6a\x5e" + "\x3d\xfc\xf4\x27\xcd\x42\x3c\xe3\x3c\xdd\xf7\xbd\xe0\x7d\xec\xb4" + "\xe6\x06\x2c\xf1\x95\x1b\xd8\x1c\xc4\xeb\x30\x7b\x25\x2f\x27\xf7" + "\xeb\x7f\x16\x50\xff\x92\x35\x7f\xf8\xc9\xd2\x1f\xfe\xa9\xa3\xb0" + "\x91\xd7\xbe\xbf\x18\x22\x19\x46\xd4\xbb\x81\xa5\xd6\x5f\x62\x69" + "\xe0\x83\xb2\x4e\x4b\x9e\x0d\x72\xe1\xb2\x7e\x33\x0f\xfd\x2b\x8d" + "\xed\xef\x8b\xc4\xf3\xf0\xe6\x23\x06\x08\xb7\x8c\x65\x8b\x5d\x3d" + "\x59\xd8\x26\x08\x5f\xd2\x38\xb3\xa0\x77\x56\xfb\x63\x66\x3c\x06" + "\x3b\xc7\x46\x79\xbf\xf4\x58\x50\xda\x0e\xfb\x1d\x3d\x29\x7a\x9c" + "\x83\x31\xcf\xde\x2b\xa4\xbc\xa3\x8e\x23\xf9\xcb\xeb\x77\x4a\xdf" + "\xba\x3d\xab\x5c\x3b\xd4\x28\x19\xa7\xe7\xab\xf8\x86\x34\xf8\x2b" + "\xcc\x10\xb0\xec\xd9\x01\xb9\x47\x93\x19\xdf\xb2\x86\xd3\x24\x0f" + "\x23\xec\xb7\x2d\xf2\x2c\x91\xf6\xa6\x24\xea\x4b\xa3\xbe\x9f\x61" + "\x5f\x97\x3e\x8c\x7b\x8e\xb8\x95\xa0\xf7\x2a\xfd\x4b\xd6\xec\xcd" + "\x71\x0e\x94\x41\xf9\x7b\xf4\xfd\x4d\x9c\x07\x6f\x9f\x7a\x4f\xfe" + "\x16\x36\xed\x9b\x37\x98\x18\xce\x12\x29\xaf\x47\xee\xbb\xa7\x13" + "\x22\xe7\x0d\x19\x02\xde\xf0\xbd\x21\x64\x0c\xf8\xb4\x95\x31\x3b" + "\xfa\x75\xdf\xb6\x72\xff\x3d\x3d\x2b\xd2\xce\xe9\xa5\xe1\x7d\x94" + "\xda\x80\x3d\x3b\xea\x97\xbc\xc9\x69\xe9\x6f\x92\xf2\xc9\xfd\xf5" + "\x34\xbb\x0a\x2f\x96\x06\xf8\xaa\x9a\x3c\xe9\xea\x3f\x23\xe1\x6b" + "\x67\x31\xb8\xd3\xf1\x56\xb1\xdb\x98\x24\x7d\xd0\x9b\xa9\xfd\xfd" + "\xf8\x0e\x5c\x77\xde\x0e\x7d\xe0\xe9\x4f\xa0\x5d\xe6\x57\x32\x13" + "\x1e\x84\xac\x2f\x78\xf1\xd3\x9e\xb9\x54\x8e\xd2\x26\xbd\x79\x3e" + "\x60\xac\xde\xca\xe6\x48\x1f\xc1\xa7\x85\x7d\x27\x7c\x31\x7c\x21" + "\x85\x59\xbe\x50\xcb\xd2\xfc\x8e\xde\x64\xb7\x72\x45\xfa\x85\x42" + "\xfb\x55\xf7\x27\xe3\x5e\xca\xab\x43\xee\x58\x39\x57\xbd\x2f\xe3" + "\x0e\x4a\xd4\xfb\x03\xda\x59\x53\xa7\x9b\xf5\x1e\x3e\x70\x5e\xda" + "\xe5\x0b\xfd\x52\xc5\xec\x9a\x88\x2d\x43\xef\xcb\xb2\x2f\xbd\x2f" + "\x1f\xb3\x89\x3b\x3c\xc7\x1b\x44\xec\x81\x5e\x92\xcf\x7a\x9c\x9a" + "\x3e\xa6\x53\xe0\x15\xf8\xdd\x32\xc8\x60\x67\x9c\x95\x94\x0f\xfb" + "\x04\xf1\x47\x19\x82\x87\x27\x5e\x57\x25\xfc\x89\x8c\xbf\xf7\x06" + "\xe8\x1b\x47\xa5\x89\x7b\x19\x13\x65\x2a\x67\xb9\x85\x6d\x4c\xe5" + "\xfd\x79\xf4\x6b\xe2\x95\xb7\xd5\xd0\x6f\x02\xe1\x5c\x23\xfd\x26" + "\xd3\x6f\x1d\xfd\x12\x0f\x73\xff\x0a\xe0\x25\xc9\xb0\x16\xc4\x60" + "\x1d\x48\x9c\xd5\x35\xd6\x7d\x3f\xc0\xc6\xb5\xe3\x3f\x99\xb4\xff" + "\x3b\x53\x83\xf8\x9b\xcb\xf7\x33\x96\x1f\xe4\x43\xd6\x9b\x11\x43" + "\xe7\x4c\x4d\xc9\x7e\x9c\xcb\x9f\xc9\x19\x7e\x2e\x7f\x66\x07\xfd" + "\xb5\x30\xe6\x21\x2c\xf7\x2c\xa1\xe7\x9a\xc8\x9f\x67\x87\xdf\x71" + "\xa6\x86\xe0\x28\x78\xac\x6b\xa3\x89\x67\x84\xce\xa7\x1a\x72\x51" + "\x62\x5c\xa9\x1c\xef\x22\x27\xbd\x9b\x78\xe2\xfd\x4c\x1b\x6f\x13" + "\xbd\x27\x5b\x4b\x68\x5f\x4b\x24\x98\x4c\xa5\x31\x27\xde\x9f\x87" + "\xf1\xa2\xbf\x03\x89\xb7\xd5\x44\xdf\x75\x44\x9d\x18\xbf\x37\x91" + "\xca\x11\x2c\xf9\xad\x4f\x27\xeb\xf0\xd4\xe0\x84\xfb\x3d\x86\x01" + "\xaa\x43\xf2\x41\x94\x9f\xea\xd0\xf3\x87\x61\x3f\x15\x7e\x37\x68" + "\x4e\x29\x1f\xc9\xc4\x26\xfd\x1e\xa5\xdf\xe1\x29\x7c\x7b\xad\x3c" + "\x1b\x41\x59\x5f\x54\x59\xf8\x0a\x19\xad\x3c\xb5\x69\x92\x6d\xde" + "\x46\x32\xdf\x99\xa7\x64\xbb\x1e\xdb\x58\x6b\xa9\x78\x06\xf1\x77" + "\xf5\x6e\xdc\xe5\x02\x3f\xb4\xd0\x35\xcd\xc7\x5c\xf5\x2a\xed\xf9" + "\xb3\x9d\x19\xc5\xdc\xd9\xcb\xce\x7e\xa9\x23\xe0\xb9\xc6\xfd\xd0" + "\x23\xec\x79\xf9\x50\x29\x73\x15\xde\x21\xce\xc6\xce\xb3\xbe\x6c" + "\x97\x57\xf8\x52\xc0\xb3\xb0\x87\xc4\x79\x3c\xf6\x06\x92\xb1\xc3" + "\x71\x60\x54\xca\xdb\x80\x74\x4a\xc3\x1d\xae\x03\x51\xdf\x78\xd5" + "\xac\x3a\xb9\xa6\xfa\x6e\x00\x6f\x21\xfa\x1b\xfc\x77\x27\xfa\xac" + "\x56\xcc\xaa\xc3\x18\x4a\x48\xfe\x43\xec\x5b\xac\x09\xeb\x26\xe8" + "\x0a\xcf\x5e\x26\xbc\xe3\x6a\xe5\xac\xba\x6b\x1b\xc3\x59\x27\xda" + "\x2c\x09\xf2\xf3\xde\xc4\x59\x38\x23\x32\x54\x17\xc7\x9a\xee\xad" + "\xe7\xce\x81\xa4\xd9\x4e\xbf\xa3\xcf\xf2\xb6\x5d\xce\xcd\xb5\xd5" + "\xdb\x67\xd1\xc7\xde\xa0\x8d\x9d\xda\x12\xfe\x10\xe6\xd5\xc9\xf8" + "\x38\x94\x67\xc5\x98\x3a\x2b\x9a\x67\xf0\x03\xb4\x37\x7c\xa2\xc1" + "\xa2\x31\xbc\x37\x5c\x5b\x3f\x1a\x3f\x47\x1b\x57\x64\x1b\xff\x32" + "\xfe\xf7\xda\xf8\x97\xf1\x6a\x6d\xc8\xb3\xf8\x7f\xd5\x5c\xbb\xec" + "\xf8\x2f\xe1\xd7\x92\xe8\x67\x93\xa4\x99\xe7\x94\x10\xc9\x6f\xc1" + "\x84\x45\x4e\xf0\x36\xb0\xbb\x45\xac\xa0\x60\x45\x5c\x69\xbb\x7d" + "\x88\x39\x37\x7d\xc4\x7a\xd8\xbf\xde\x47\x99\xf6\x02\xc8\x6c\xf7" + "\xb3\x2b\x55\xb7\x25\x5f\x31\xf4\xb9\x01\xef\xfd\x34\x0f\xfb\xa2" + "\xf0\xac\xc3\xf7\x11\x73\xad\x86\x7e\xb5\x93\xd6\xd7\xfd\x44\x2f" + "\x16\x39\x55\xa2\x0d\xc4\xa3\x87\x04\x3c\x88\x7f\x11\xf2\x16\xc9" + "\x6c\x42\xde\xf2\x0a\x5f\xe0\x89\x22\x06\x90\xe3\x95\x7e\xe8\xbe" + "\x43\x57\x32\xad\x7e\x07\x5b\x81\xd8\x40\xd0\x3b\x73\x93\xbf\x75" + "\x79\x30\x86\x0b\x79\x8a\x78\x7f\xc4\x06\x72\xf9\xdc\x2c\x44\x7c" + "\x74\xfd\x20\x4b\xa9\x27\xde\x93\x68\x76\x32\xe8\xfa\x01\x2d\x3e" + "\x50\xe5\x60\x24\x3e\x50\x03\x74\x3d\x5d\xf4\x3c\xc8\x8c\xa1\xca" + "\x79\x87\xf6\x0d\xb2\xd4\xfd\x9b\x58\xda\x3e\xe8\xf2\xce\x4a\xde" + "\x47\xd8\xc9\x23\x56\xd0\xfa\x34\x9c\x25\x44\x78\x1f\xf8\xfe\x88" + "\xd0\x2d\x31\x97\xd7\x06\xef\x7e\xb1\x0f\x06\x2b\x66\xb9\x83\x09" + "\xf7\xe7\x11\xec\x88\x06\xf7\x33\x82\x5f\xe1\x68\x73\xab\xdb\xdb" + "\xd4\x46\xc5\x77\x7a\x3b\x55\xd2\x77\x37\x3b\xb7\x78\x2c\x9c\x08" + "\xed\xcb\x64\xf3\xfa\x59\xba\xb4\x01\x88\xa3\x3d\xf1\xdc\x21\xd8" + "\x47\x16\x3f\xce\x2c\xa1\x7d\xab\x94\x92\xe7\x59\x8c\x2b\x98\xc1" + "\xf0\x57\x7c\x91\x7b\xe6\xad\x65\xe9\x38\x7f\xc0\x59\x89\xf5\x09" + "\x91\x7f\x4b\x6a\x21\x4b\x8f\xae\x7b\x89\x34\x22\x11\x41\x15\xb6" + "\xc0\x82\x64\xf3\x9a\x82\x3c\xeb\x23\x1b\x37\x6c\xc8\x5d\x57\x60" + "\x5d\x76\xef\x8a\x11\x77\xdd\xaa\x68\x5f\x30\x6f\xbb\x6f\xa5\x39" + "\xb8\xc4\x2a\xe3\x73\x5d\x48\x87\xbd\x2e\x2f\xc9\xac\x93\xfc\xe7" + "\x85\x2f\x49\x39\x49\x6d\x94\x77\xed\x2e\xa4\xcb\x77\xbe\x94\xf0" + "\xf9\xe6\x3e\x76\x5e\xec\xf7\xea\x3e\xcb\x41\xc2\x4d\xa5\x97\x9d" + "\x3f\x05\x1b\x07\x89\xa7\xe7\xdf\x86\xdf\x08\x69\x0b\x71\xee\x88" + "\xb4\x85\x38\x1f\xf6\xff\x22\x6c\xbf\x88\xbe\xc3\xee\x01\xe7\xdb" + "\x72\xed\x9d\x2f\xd5\xd7\x1e\xe5\xad\x20\xfe\x29\xf9\xda\x69\xce" + "\xf9\x0a\xa9\x33\x3b\xdf\x46\xf0\xcf\xd4\x6c\x1e\xa7\x77\x53\xdf" + "\xd1\x17\xfa\xbe\x02\xfd\x89\xdc\x19\xba\x70\xc3\x70\x7f\x39\xda" + "\x18\xf7\x59\x7e\x2a\xf5\xe1\x17\xbe\x84\xf1\x50\xb9\x8c\xa8\xf4" + "\x69\x34\xf6\x0c\x2d\xdd\x8b\xf2\xa3\xce\xc3\x03\xeb\x1e\x59\xff" + "\xb8\x2d\xbb\x60\xcd\xc3\x6b\xd6\xae\x29\xd8\x22\xdc\x41\xcc\x11" + "\xff\xdd\x3f\x33\x67\xe5\xc8\xd8\x06\x69\xd0\x8b\x68\x3e\xd1\x7d" + "\xb0\x69\x90\xba\xa9\x0b\xef\x06\x1d\xec\xee\x6b\x83\xc1\x05\x41" + "\x67\xea\x85\x8f\x98\x0b\xc7\x89\x3f\x66\xda\x19\x45\xbf\xb4\xff" + "\x94\xdf\x07\x12\xee\x5f\x61\x9d\xca\x16\x76\xb3\x01\x11\x0f\x8c" + "\xe6\xa4\x11\x7b\x58\xe5\x56\xec\x35\x9d\xac\x3d\x48\xfb\x99\x38" + "\xaf\xf6\xbe\x8e\x98\x67\xe0\xe3\x08\x46\x07\xbb\x99\x57\xcc\x3b" + "\xbf\x60\x39\x28\xfc\xbe\x5c\xb0\xfc\x14\x78\x83\x3e\xab\x3c\x73" + "\x1f\xe7\x99\x7b\xd5\x0b\x79\xfb\xf8\x85\xbc\xbd\x11\xbf\xaa\xde" + "\x23\x54\xf6\x70\xb7\x56\x57\xd5\x79\x76\x18\xb4\x0a\xef\xe6\x82" + "\x64\x92\xcf\x66\xd7\xa1\x3f\x2e\x6f\x3a\x93\xbe\x20\xbc\x47\x5c" + "\xbe\x3b\x18\xf1\x7f\x8d\xe2\xbe\xa7\x38\x63\x23\x1e\x8d\xca\xb9" + "\xa8\x5f\x2e\xef\x10\xe4\xd8\x3a\x95\xf8\x34\x1a\x6f\x0f\xed\x79" + "\x5d\xa8\x17\x63\xde\x4f\x7c\x3a\xec\x2e\xfc\x0e\x2f\xf1\xa1\xe7" + "\xba\xa2\x6d\x6f\x00\x83\x4a\xfa\x0e\xdb\x0b\x39\xff\xde\xcb\x98" + "\x3f\x82\xf1\xff\x89\xe0\xc0\xc5\x38\x8c\x6f\x69\x0f\xff\x07\x2f" + "\x3f\xdd\x25\xe7\xfb\xe2\x4d\x5a\xda\x85\x88\x2f\x8a\x8b\x5f\xa2" + "\xf7\x2b\xf4\xa7\xf2\xf2\xde\x40\xd4\xf9\x30\xbe\x09\xb9\x1b\x76" + "\x24\xb6\xad\x58\x2b\x17\x73\xe5\x79\x71\xaf\xdf\x5b\x92\x17\x43" + "\x65\x42\xb8\xaf\x2a\xe1\x7b\x71\xa7\x6b\xc7\x79\xdd\xde\x82\xfa" + "\x74\x69\xa6\xf3\xd1\x20\x6c\xd0\x52\x5c\x3d\x41\x61\xdf\xa8\xf9" + "\x1f\x51\x54\xc7\x85\x85\xb0\x8b\x27\x19\x2d\x61\xff\x24\x19\x57" + "\xc4\xef\xb8\x18\xf1\xff\x9c\x20\xf9\x36\xac\x2d\xc4\x8d\x14\xb6" + "\x23\xc4\x1f\xa1\x4f\x58\x5b\xd4\x56\x0f\xce\x9a\xe5\x1a\xbb\xe8" + "\xfd\xef\xad\xb1\x8b\x5e\x8c\x85\xea\xda\xc1\x0d\x25\x7c\x5e\x05" + "\x5b\x2d\x6c\x01\x82\x3e\xdc\x33\x36\x12\xfd\x3f\x2a\xe9\xc7\x40" + "\xb6\xb0\x17\xd9\xd4\xdf\x88\xbb\xbc\x07\x86\x58\x82\x5a\xee\x77" + "\x82\x5f\x6e\x2f\x14\x36\x14\x26\x2a\xd7\x04\x1b\x0b\xd8\x0c\x26" + "\x89\xb8\xa4\x1f\xb1\x03\x97\x99\xb1\x87\x5d\xb2\xe1\x4c\x27\x02" + "\xeb\x4b\xef\xe2\x0c\x8f\xef\xee\xb1\x99\x0b\x0d\xe5\xa8\x43\x1d" + "\x3c\xb7\x40\x2f\x47\x3c\xe2\x78\x94\xeb\x66\x97\x5e\x12\xe5\x90" + "\x57\xf8\xa9\x49\x5e\x45\xfc\x92\x1b\xf9\x83\xf4\xde\xa0\x26\xaf" + "\xe0\x44\xd7\x43\x9b\x82\x4d\xf4\x6d\xa5\x5a\x71\x5b\x0d\xa5\x65" + "\x8a\xb3\x84\x2b\x16\x9c\x31\x12\xce\xc5\xda\x5c\xee\x33\x4e\xd1" + "\x1f\xdc\x3d\x2e\xa0\x3d\x50\xc8\x17\x97\x42\x0d\x67\x99\xd1\xf6" + "\x28\xe6\x73\x40\xf2\xd8\xe7\xd9\x21\xd9\xbf\x81\xa7\x06\x76\xf7" + "\x37\x0d\x10\xbe\xfa\x0c\x26\x76\xcc\x12\xc0\xde\xbb\xe2\x98\x65" + "\x88\xe6\x67\x20\xd3\x6d\xf8\xa7\x5b\xf2\xb6\x03\xe1\xb5\x09\x1c" + "\x8d\xb1\x24\x97\xd0\x77\xbb\x6e\xa3\x04\xbc\xac\x10\xf1\x03\x2e" + "\xad\x00\xdc\xdc\xcc\x6b\x6a\x5f\x1b\xf1\xdf\x3d\x20\xef\xe9\x25" + "\x53\x99\xb0\xff\xfb\xd0\xa0\xda\x46\xfd\x80\x9f\x23\x7b\x68\x93" + "\x7a\x02\x67\xe0\x0f\x5e\x56\x39\xee\x30\xe0\x3e\x0a\xe4\x97\xe5" + "\x76\x3e\x00\x79\x0c\x77\xbf\x70\xfe\x8d\xfb\xf7\x91\x75\x32\x10" + "\xd0\xef\xe1\xeb\x6b\x03\xf7\xbb\xaa\x7e\x20\xd6\x29\x6c\x5a\x13" + "\xc4\x19\x40\xcc\x63\x67\x1f\xf4\x51\x9d\xe7\xc5\xd9\xd5\x40\x83" + "\x56\x0f\xfc\xb1\xf9\x1d\xbe\x85\x7a\x1d\x2a\xec\x81\x37\x08\x7b" + "\x3c\xb7\x2c\x2f\xed\x7d\x1e\xf4\xa9\xe2\x5e\x0e\xca\x4b\x3b\x1c" + "\x5f\xd8\xff\x9b\xbc\x2b\xe3\x2b\xd5\x6d\xc6\xe8\xb9\x22\x7c\xd7" + "\x8f\x60\x3a\x50\x31\xbb\xce\x47\xf4\xc1\x57\x31\xab\x8b\xbe\x11" + "\x9f\x7f\xee\x53\xbe\x3e\x86\xe9\x24\x10\xdf\x70\x23\x33\xa8\xf1" + "\xfe\x7e\xf8\x5f\xc1\x1d\x56\x69\xc7\x7e\x39\x4e\xf3\xc5\x12\x73" + "\x9e\xf9\xde\x8d\x9c\x85\x87\x34\x3d\xee\xe5\x74\x29\x47\x5c\x4e" + "\x17\x7a\xdc\xaa\xd9\xa5\x3f\xd9\x1a\x30\x34\x6d\x75\x1b\xa4\x7d" + "\xdd\xe5\x54\xe2\x64\xa2\x62\x60\xf8\x7a\x50\xd7\xe8\x3e\x79\x42" + "\x1a\xed\x1b\x14\xb1\xe2\x22\x72\xf9\xa0\xe0\xe9\x70\x6e\xad\x82" + "\x87\x4b\x8a\xab\x81\x9d\x92\xcb\x76\x09\xfa\xdc\x71\x52\x47\x20" + "\xf3\x68\x76\x9b\xd7\xf5\x0d\x7f\x9f\x84\x77\x09\xb3\xcb\x47\xf4" + "\xb3\xa1\x2a\x83\x8a\x18\x97\xbc\xa4\x91\xe8\xa5\xcd\x27\x7c\x3b" + "\xb8\x88\x27\xa4\x36\xb8\x6d\x03\xee\x46\x5e\x3e\x8b\xb8\x59\x72" + "\x6d\x0e\x8a\xf3\x1b\xd5\x71\x37\x2f\x81\x5c\xe4\x45\x3c\xad\x4b" + "\x8c\xf2\x4d\xa4\xba\xaf\x6f\x29\xec\x87\x9d\xd7\x11\xc4\x4a\xee" + "\xd1\xda\xf6\xc6\x85\x7c\x5f\x48\x60\xab\xfd\x8e\xc1\x34\x37\x7b" + "\xaf\xf1\xda\xe9\xc6\x60\xda\xd5\x78\x64\xc9\xb3\x65\xb0\xb1\xe4" + "\x6c\xe8\x51\x6e\xa7\xf6\x97\x71\xf4\xdf\x7f\x7d\xd0\x10\x20\xbe" + "\x6c\x3c\xbf\xad\xd4\xce\x82\x8e\xf1\x3c\xb4\x95\xe6\x6b\xc0\x42" + "\x72\x58\x1b\xeb\x90\xb6\x2f\x38\xbf\x37\x17\xfb\xf8\x25\x57\xf0" + "\x08\xf4\xf8\x5e\xc9\xa7\xf8\x13\x5d\xc1\x37\x18\xec\xb5\x41\x6f" + "\xba\xd9\xe0\x27\xe8\xd7\xed\xb6\x52\x36\xf7\x3c\xbe\x0f\x36\x4b" + "\xfe\xcd\x9f\x22\x7f\x07\x7b\xe0\x7b\x3a\xba\x4f\xf7\x6f\x5c\xf7" + "\x08\x1c\x98\xcf\x5d\x9a\xbb\x29\x77\xad\xf5\x1b\x70\x6f\x3e\xd2" + "\x0e\x34\x12\x4b\xd3\xef\xc6\xfe\x0a\x1e\x1a\x31\x35\xaf\x16\x4f" + "\x53\x8f\xa5\x49\x6b\x2e\x15\x7a\xe7\xff\xcd\x78\x9a\x3a\x8f\x8c" + "\x58\x9a\x91\x33\x98\x40\x63\x78\x0d\xa8\x6f\xf9\xf1\x2e\xf6\x74" + "\x87\xdf\x8a\x75\x24\xf7\x97\x80\x25\xda\x0f\x96\xf0\xe7\x52\x19" + "\x6b\xa3\xf4\x74\xfd\x0e\x2b\xe1\x62\x02\xbd\x67\x44\xee\xcc\x04" + "\x96\x12\xdc\xa4\x9f\xd3\x04\x91\x77\x95\x6e\xab\x20\xfc\x90\x6a" + "\xb6\x15\x6a\xd9\x82\xe3\x52\x3f\x18\xc8\x6e\x50\xc7\x9b\xe4\xd9" + "\x54\xa0\x5c\xbf\x93\x25\xd7\xe6\x5b\xda\xda\x0c\x34\x5e\xcd\x9e" + "\x24\xb2\x36\x02\x27\x22\xeb\xfa\x1f\x7a\xd9\x13\x9f\x65\x8b\xa2" + "\xc9\x69\xd7\xf7\xb1\xa1\x8b\xd0\x19\xca\x3b\xd8\x43\xe2\x0e\x9d" + "\xf4\xaf\x31\xf4\x9a\xf6\x4c\x6d\x0c\xed\xd7\x9e\x6f\xa4\xe7\x9d" + "\xda\x33\xf1\x8b\x43\x8f\x6b\xcf\xb4\x66\x87\xbe\xa5\x3d\xa7\xd0" + "\xf3\x57\xb5\x67\xda\x3b\x86\x66\x6a\xcf\x93\xe9\x39\x51\x7b\xbe" + "\xa1\x8f\x7d\x72\x59\x7b\xa6\x35\xf8\xc9\x49\xed\x5c\xdf\xd4\xcb" + "\x3e\x79\xff\xda\xe5\xc6\x4f\x6a\x25\x1f\xfc\xc9\x71\xe2\x8f\xf2" + "\xe4\xde\x13\x4e\xf3\x10\x6e\x2f\xd0\xe1\x4b\xe9\x15\x68\xc7\xef" + "\x18\x22\x7e\xb6\xc7\x1a\x95\xae\xf9\xb6\x1e\xb2\x10\x9d\x3b\x12" + "\x95\x6e\xd3\xd2\xd3\x49\x3e\x5d\x1c\x95\x9e\xa3\xa5\x2f\x21\xfa" + "\xb9\x30\x2a\x5d\x3b\xc7\x1e\x5a\xed\x66\x7f\x5f\x19\x95\xbe\x54" + "\x4b\xb7\xeb\x76\x34\x5a\x7a\x86\x96\x4e\xb2\xd7\x9f\x8d\x51\xe9" + "\xf3\xb5\x74\x7a\x0e\x1c\x8e\x4a\x17\x74\x45\xfa\xfb\x37\xf3\x63" + "\x85\x58\x5b\x43\xc4\xff\xff\xcd\x17\x95\x67\x9a\x56\xb6\x87\xd2" + "\xa7\x45\xa5\x27\x6b\xe9\x41\xb7\x32\x3b\xba\xce\x31\xe5\x79\xa5" + "\x8e\xad\x1e\x4b\xb7\x8e\x18\x18\xc2\x36\x59\xf0\xd9\xc1\xaf\xe0" + "\x8e\x97\x79\x3f\xef\xb6\x16\x73\xde\xcd\x82\x56\xcd\x7e\xb6\x09" + "\xb6\x8c\xf2\xbe\x5c\xd0\xa4\xf9\x4a\xf0\x8a\x3b\x74\x5b\x91\x76" + "\x45\xc4\x75\x9a\x67\x2f\x95\xbe\xe8\xf5\xb8\x46\xd0\x31\x69\xe7" + "\xef\x94\xe7\x35\xe8\xdc\x51\x0f\xf4\xd0\xae\x82\x21\x19\xa7\x80" + "\x64\x51\xa4\x41\xd7\x02\x78\x44\xeb\x94\x24\xdd\x0f\x7e\x45\x1d" + "\xc2\x3d\x55\xa9\x8f\xc2\x5a\x44\x7e\xd8\x8c\x45\xe7\x75\xb3\xe0" + "\x02\xfc\xc6\x58\x26\xfe\xd9\xef\x08\x5a\x22\xf7\x83\xae\xd8\xb4" + "\xf4\x3f\x51\x7a\x7a\x54\xfa\xaa\x31\x69\x3b\xd1\x41\x6e\xea\x69" + "\xbe\x32\xc8\x7d\xc1\x41\x1e\xa8\xfa\x3b\xf5\xfb\x51\x61\xa7\x77" + "\x73\xa8\xbc\xa7\x15\xf7\x67\x10\x87\x38\xb8\x89\x7b\x61\x97\x48" + "\xe9\x13\x1e\xf4\x79\x89\xc7\xf0\xf3\xca\x87\x61\x83\x7a\x99\xe1" + "\x7c\xb4\xa4\x1f\x31\x2d\xcd\x1c\xf7\xb2\x8b\xce\xb1\x04\xdc\xaf" + "\x69\x78\x14\xdf\x4f\xb2\x65\x79\x5e\xd6\x9e\x17\x62\x0d\x54\xf7" + "\xfe\x87\x75\xfe\x22\xd8\x19\xb9\xfb\xdb\x83\xf3\xe4\x9b\x4b\x44" + "\xdc\xf5\x90\xb4\xab\xd9\x86\x73\xfd\xfb\xed\xfc\x1d\xf0\xc6\xb3" + "\x1a\xcd\xdb\x98\x95\xf6\xf6\x04\x7a\xae\x91\x7f\xf4\x8d\xd2\xc7" + "\x1a\x93\x5c\xcb\xa1\x25\x52\x26\x3e\xbd\x40\xd2\x8b\xd0\x12\xfe" + "\x02\xe4\xc2\x10\xce\x83\xed\xc4\x87\xdb\x47\x2b\x5f\xb4\x9f\x19" + "\xae\xec\x26\xde\xe4\x7c\xb3\x41\xd2\x27\x75\x81\x6a\x30\x6d\x83" + "\xbe\x5b\xc4\x5c\xde\xed\x0f\x1e\x5e\x17\x30\xb4\x6f\xed\x61\x4f" + "\xdc\xc0\x2c\xab\x02\x06\xca\x13\x7a\x3d\xa9\x00\xfe\xf2\x67\x97" + "\x12\x3f\x6b\xf8\x15\x7d\x7f\x73\x5d\xb3\x21\x28\xf8\x15\x75\x81" + "\xd0\x91\x96\xfb\xe1\x63\xcb\xec\xea\x0a\x81\x17\x4f\x20\x5e\xdc" + "\x49\xf4\xdf\x14\xda\x9c\x37\x29\x98\x9f\x37\x61\xff\x06\x96\x10" + "\xca\x4f\x4b\x79\x7a\x90\x2d\xd0\xf7\x9f\xfd\x9b\x68\x4f\xf1\x5b" + "\xe2\xab\x69\x4f\x81\xee\x25\x49\x49\x16\x67\xc1\x78\x56\x0d\xa7" + "\x56\x37\x6c\xba\x7a\xfc\xf8\xd0\xe6\x34\xe1\x3f\x02\x7d\x19\x6d" + "\xac\x15\x7b\x99\x31\xa4\xdd\x33\x2d\x3e\xcd\x26\x13\xff\x6c\x48" + "\xba\xcc\x9d\x7d\x6b\x99\x01\x31\xb7\x8b\x73\x85\x7e\x33\xb6\x3d" + "\x2f\xc8\x5c\xf6\x8f\x59\xf1\x06\xcc\x91\x5a\x09\x3e\x0d\x36\xc5" + "\x94\x3f\xb9\x8f\xa9\xfb\xcd\x01\xda\x33\x02\xc4\x93\xff\x00\x72" + "\xb1\xfa\x0b\xe9\xaf\x42\xf5\xe1\x5e\xa8\x73\xc3\x3d\x48\x6b\x2f" + "\x39\x2d\x6c\xc7\x8f\xc8\xb5\xa5\x1e\xc2\x7b\x09\xee\xbd\xc6\x87" + "\x4c\xaf\x0c\x05\x62\xa5\x6e\x42\x7d\x49\xdb\x1f\x6c\x52\xb6\x53" + "\x0f\x8d\x85\xbb\x6a\xb9\x07\xb1\x13\xa7\xbb\xea\xc1\xbf\x72\xb7" + "\x38\x67\x87\x0f\x00\xfb\xdd\x4e\x3e\x58\xa3\xf9\x26\xe2\x8f\xab" + "\xbb\x3c\x5d\xd2\x3f\x29\xd7\x6d\xe4\x8c\x7c\x97\xc7\x23\xce\x18" + "\x76\x79\x02\x42\xe7\xbe\xeb\xac\x69\xfb\x54\xdc\x0f\xe0\x6b\x07" + "\xe2\xce\xd2\x9a\xe2\x19\x03\x49\x86\x51\xcf\x87\xc5\x7e\x54\xde" + "\x6b\xb2\xde\xcc\x52\x70\xd6\x93\x15\x92\x7e\x7e\xc5\x1a\x56\x98" + "\x8d\xef\x12\xdf\xa6\x77\xdb\x58\x8c\xf4\xa5\xcd\xdf\x98\x57\xcf" + "\x10\xa7\x22\x91\x9b\x3c\xcd\xc2\xf6\xb0\xdc\xd3\xea\xea\x47\x0c" + "\xb4\x10\x13\x67\x46\x0a\x2b\xe4\x71\x9e\x66\x91\x5f\x61\x89\x1d" + "\xfd\x34\x06\x93\xa7\xdc\x15\x38\xc7\xb4\x7a\xa9\x8f\x9e\x72\x5e" + "\xee\xa9\x13\xf7\xc7\x15\xf6\x3d\x9d\xae\x0a\x1c\x55\xd8\xd7\x25" + "\xae\xf7\x9a\x04\xdc\xa8\x3e\x6d\xbf\x9a\x8e\x67\xda\xbb\xd3\x85" + "\x0d\x49\x19\x5b\xa2\xf3\xc8\x6e\x2d\x0f\xca\xd0\xb3\xb8\xeb\x40" + "\xdf\xf3\x68\xec\x4c\xfb\x9e\x80\x34\x1a\x1f\xed\x59\xfc\x20\xc6" + "\x35\x16\x6d\x15\xb0\x28\x64\x31\xd4\x67\xe8\x49\x60\xa7\xef\x73" + "\xf9\xee\x76\xba\x30\x07\x8a\x01\xb1\x7b\xfa\xd1\x0e\xfc\x07\x81" + "\x6e\x52\x9d\x46\xd4\x17\xd5\xff\xb3\x7a\x5f\xd0\x1e\xbe\xd1\x58" + "\xcb\x85\x5c\x4d\x63\x46\x1e\xcc\x6b\xaf\x0d\xba\xb7\xcb\x04\x33" + "\x1f\xea\x4d\x01\x4c\x24\xcc\x14\xaf\x26\xd3\x6b\xf3\xa0\x9c\x1e" + "\x0e\x0f\xf9\xae\x9a\x88\x36\x6c\x60\x53\xfa\x14\x43\x8a\x06\x3f" + "\x19\xbf\x47\x51\x84\x9f\x06\xf9\x4d\xd9\x12\x55\xf6\xa6\x70\x5e" + "\xea\x37\x78\x23\xd8\x06\xe0\xac\x48\xe0\xab\xa2\x1c\x8c\x2a\x77" + "\x30\xeb\x22\xf1\xc8\xc4\x43\x6e\xdf\x23\xe2\xa1\xa6\xfb\xcb\x94" + "\xe6\x08\xbc\x65\x3d\xa3\xb4\x71\xb3\xde\x86\x5b\x51\xec\x7a\x3f" + "\xe9\x59\xee\xc1\x65\x4a\x30\x32\x27\xca\x34\xbd\x1c\x74\x3a\x34" + "\x47\xad\x88\x51\x3c\x46\xcc\x15\xc5\x45\xb9\x3b\x82\x77\x3b\x05" + "\x3e\x2a\x86\x02\xd8\x8a\x13\x5c\x0f\x49\x1c\x32\x64\x8a\xbd\x90" + "\xd2\x51\x27\xce\xfb\x84\x2f\xdb\x32\xc3\x5a\xaa\xb7\x5c\xeb\x73" + "\xa9\xec\x83\x81\xe4\x3f\xfe\x29\xbf\xb5\xf7\x64\xe7\x58\x57\x7c" + "\x49\xdc\xa1\x9d\xbb\xd1\x86\xeb\xb1\x39\x91\x97\xe1\x3c\x77\x72" + "\xd8\x67\x59\x99\xa1\x2d\xec\xb3\xac\x5c\x95\x77\x5e\x68\xd7\xe2" + "\x83\xbc\x16\xf7\x37\xf8\x26\x5e\x57\x05\xdf\x88\x97\xd9\x14\xc4" + "\x5e\x2f\xb6\xf1\x33\x1d\x36\x92\xd9\x4d\x81\x69\xbc\x3c\x60\x2d" + "\xbe\xcc\xc6\xc3\x36\x08\xf4\x07\xb6\xc7\x3c\x8e\xd2\x77\x05\xac" + "\xe1\x7b\x75\xca\xf8\x64\xdc\x05\xe5\x25\x99\x06\xca\x3f\x1f\xf8" + "\x00\x3b\xf1\x5e\x65\x9c\x97\xf2\xcd\xa7\x6f\x05\x95\x68\xc7\x14" + "\xb0\x87\x4c\x21\x6f\xc9\x39\x36\x4e\xc4\xcf\xb4\x07\xa0\x53\x33" + "\x74\x2b\x31\x5b\xa8\x4e\x3b\xa5\x27\x89\xf4\x00\xb5\xbd\x2b\x60" + "\xa7\x6f\x49\xf4\xed\x35\xfa\x55\xa9\x0e\x7b\x15\xf5\xbb\xf8\x1c" + "\xbb\x99\xfa\xe2\xa1\x76\xec\xd4\xcf\xde\x92\xc7\xd9\xe4\x0e\x9b" + "\x07\xf2\x1d\xd5\xe7\x96\x71\x41\xa9\x6c\xb7\x62\x8c\xa3\x71\x09" + "\x5d\x0a\xfd\x16\x56\xd2\x6f\x71\x88\x25\x15\x17\xd1\xbe\x57\x44" + "\xed\xe3\x9e\x2a\xd5\x03\x9f\x22\xb2\x2f\x34\x36\xe8\xd5\xa8\xde" + "\xa2\x7e\xde\x4b\x75\x7b\xda\xfb\xa9\x3e\x7b\x57\xb8\x4e\x8d\xa7" + "\xa6\xf5\x3d\xee\x2c\xaf\x32\x64\x52\x9f\xea\x60\x3f\x4d\x69\xc9" + "\x94\xd6\x13\xe6\x87\x95\x71\xa7\xb5\xe7\xb8\x70\xde\x92\x4c\x56" + "\xfc\x09\xb3\x08\x1b\x80\xcd\x31\xac\x5b\x19\x57\x00\xbf\x56\x91" + "\x3a\x8d\x17\x51\x5f\x05\xd5\x57\x92\xcb\xe2\x88\x56\x9b\xa8\x8f" + "\x88\x43\x7e\x4a\xc0\x49\xac\x31\xa3\x97\xc6\x52\x83\x31\xa9\x34" + "\x77\x95\xb4\x1e\x68\x3c\x0a\x8d\x27\xae\x28\x14\xbe\x7b\x8b\x31" + "\x4d\x84\x3c\x87\x71\x69\xf3\x58\x4b\xe3\xaa\x2f\xca\xe3\xa7\x68" + "\x6c\x9e\xf6\xbc\x2e\x46\x7b\x8f\xb9\xc3\xd6\x89\x7b\x0c\xa7\x24" + "\xdc\x3c\x98\xd7\x5a\x1a\x67\x7d\xd8\x0f\xb4\x32\xee\x71\xea\xfb" + "\x6a\xea\x57\x85\x36\x4e\xa4\xe5\x85\x79\x7a\x65\xdc\x1a\xed\x39" + "\x3e\x9c\xf7\x53\xe3\x8c\x3d\x11\x35\x4e\x2a\x3f\x7e\x22\xea\xd3" + "\xc6\x19\x4f\xe3\x8c\xfb\xf4\x38\x09\x9f\x36\xf1\x1d\xda\x38\xcb" + "\xb5\x71\x1a\x68\x9c\xf1\x34\xce\xa9\x51\xe3\x9c\x34\x62\x9c\x75" + "\x34\xce\x46\x1a\x67\x77\xd4\x38\x93\x47\x19\x67\x9d\x1b\x6d\xec" + "\x0a\x34\x8a\xbd\x65\x9c\xa1\x42\xdc\x67\x2f\x8b\x0d\xdf\xff\x54" + "\x71\x8f\x72\x50\xf8\x14\x3a\x02\xfd\x0d\xf4\x46\x90\xf5\x70\x67" + "\x33\x6b\x4b\x79\xa9\xd0\xdd\x4c\x96\xba\x69\xc1\x5f\x95\x8d\x4b" + "\x0f\xdf\x9f\xd8\x23\xe2\x22\xf9\x90\x2e\x7c\x00\x6c\x60\x42\xf7" + "\xb8\x7c\xcb\xe6\x12\x94\x47\x59\xca\xbf\x3a\x7c\xcf\x4b\x89\x15" + "\x67\x23\x80\x1f\x9e\xe1\xdb\x4a\xf4\xab\xcc\x50\x2f\xce\x0a\xca" + "\xc6\x55\x84\x75\x9a\x9b\x78\x0b\xe0\x22\xee\xa7\x8a\xfb\x9d\xac" + "\x3c\x2b\x58\xae\xdf\x33\xef\xa7\xbc\xcd\x51\xf7\xcc\xfb\x45\x1f" + "\x86\x84\x2f\x87\xcd\xcb\x83\x9b\xc5\x7d\x73\xca\x73\x22\xd2\xb6" + "\x71\x95\xd6\x76\x26\x9e\xbd\xd2\xd7\x1a\x74\x6c\x56\x61\xf3\x52" + "\x36\xde\xa4\xdb\x99\xb8\x95\x98\xc5\x58\xcb\xa3\xc6\x10\x2a\x1b" + "\x9f\x3e\xcc\xb7\x93\x62\x12\x31\x4c\x28\x7d\x49\xf8\xee\x78\xd9" + "\xf8\x95\x9f\x75\x77\xbc\xc4\x4b\xf3\x44\xeb\x8d\x68\xb6\x42\xb8" + "\xd2\xc8\x77\x85\xbc\x22\x0e\x8f\x32\x5e\xc4\x97\xeb\x56\xc6\xe3" + "\xfe\xa7\x59\xf8\x7d\x50\xc6\xff\x42\xa3\xcd\x69\xcb\x43\x41\xb3" + "\x9b\xda\x14\xbe\xa2\xc2\xef\xe3\x0f\xc1\xf7\x05\xe5\x3b\x25\x7c" + "\xe8\x53\x7d\xc3\xf3\x8b\xef\xa5\x23\xde\x33\x46\xbc\x5b\x7d\x44" + "\xb3\xc6\xb2\xa7\xa9\x9c\x2a\x74\xbc\x9d\x49\xdb\x98\xad\xe4\x2c" + "\x8b\x21\x5c\x3c\x8d\xbe\x75\x78\xc4\x5d\x3b\x33\x77\xa4\x33\x97" + "\x27\x28\xf9\x76\xe2\x97\xba\x53\x29\xcf\x59\x36\x19\x77\x3d\x10" + "\xa7\x88\xf2\xf7\x89\xd8\x44\x4a\xdc\xae\x55\x1b\xe3\x99\xfa\xfd" + "\xcc\x09\xdc\xf0\x84\x15\xe7\xf9\x2f\x0f\xb9\x11\xdf\x47\x29\x7e" + "\x8e\x4d\x03\x9d\x22\x1c\xee\xe1\x86\x42\x2b\x95\xe9\xff\xc9\x90" + "\x27\xd6\x15\xfc\x98\xd9\x88\x7e\xf6\x29\x71\x85\xc6\x42\x66\xac" + "\xee\x65\xc9\x84\x67\xc1\x63\x24\xae\xe8\xbe\x1b\xea\x27\x49\x9f" + "\x00\xf5\x84\x93\xf9\x16\x1e\xf0\x97\x99\xba\xdc\xec\x9f\x9d\xba" + "\xfe\xa2\x42\xfa\x6e\x33\x52\xfb\xf7\x09\x3f\x13\x92\x3f\x20\xd8" + "\xc6\x5d\x2f\xef\x8d\xa6\x7c\xdf\x5f\x16\x97\x10\x96\x6d\x94\xb8" + "\x3a\xed\x1c\x2c\x45\xee\x23\x71\x75\xc7\x48\xd2\xdd\x21\xed\x92" + "\x52\x28\xef\x82\xb0\x5d\x12\x74\x82\xf4\x9d\xef\x52\x53\xa4\xdc" + "\xa3\xa6\x64\x85\x4c\xda\x1a\x47\x7a\x4f\x39\xca\x52\x39\xb3\x88" + "\xa1\x5a\x16\x57\x10\xc1\xb5\xb8\x85\xd8\x4f\x69\x4c\x09\x34\xaf" + "\x4d\x18\x17\x60\xe2\x83\x9f\x36\xc5\x74\xe4\xd8\xc1\x31\x62\x6c" + "\x99\x4e\x2f\x08\x0a\xfd\xd2\x6c\x3b\xe1\xd3\x39\x9a\x83\xeb\xe0" + "\xab\xca\x45\xed\xb4\x37\x0c\xb1\x76\xcb\x00\xeb\xa0\x67\xdc\x3f" + "\x70\xfe\xe0\x9f\x24\xe1\x8f\xbe\x97\x13\x3f\xd0\x4c\x7d\x6e\x45" + "\x5d\xa0\x35\xb0\xd9\x84\x4f\xc1\x0e\xe2\x7a\x5c\x44\xe9\x51\x47" + "\xbb\xea\x61\xed\xf6\x53\xd0\x6d\xdb\x3b\x1a\x3e\x66\x1d\x96\x3f" + "\x8a\x76\xc0\x6f\x3b\x37\x0c\x5c\xad\x6e\xdc\x65\xf5\x68\x75\xf7" + "\x53\xdd\x29\x63\xd7\x3d\xab\xf1\x1a\xeb\xbe\x86\x7e\xcf\xaa\xb9" + "\x96\xba\x4b\xea\x78\x88\xe8\x70\x22\xc9\x14\x4e\xf8\x5b\xc5\x3d" + "\xd3\xd0\x20\x7c\xcc\x4c\x17\xb2\x7a\xaf\x32\xe1\x87\xa0\x37\xc2" + "\x46\x63\x97\xff\xa8\xb8\x83\x0a\x3d\xbb\x76\xf7\xd4\x15\x3c\xcd" + "\xa0\x77\xf7\x97\x4d\x08\xfb\x3f\x88\x3a\x9f\x4e\x76\x2b\x13\x4a" + "\xa5\xbd\xb3\xff\xa8\xc4\xad\x09\x5f\x46\x5d\xa3\xcb\x9c\x81\x80" + "\xb0\x9b\x57\x26\xbc\xae\xeb\xb7\x06\xe2\x02\x01\xad\x2e\xeb\x48" + "\xbd\xa9\xe6\x18\xc8\x9a\x6b\x2f\xb0\x4a\xff\xd5\xda\x85\xeb\x78" + "\xf6\x8d\xdc\x47\x72\xd7\x6c\xca\xcd\xb1\xae\xdc\xb8\x61\xdd\xdc" + "\xf5\x8f\x3e\x6a\x5d\x96\x9b\x9f\x9f\xfd\xfd\xdc\x78\xb6\x72\x43" + "\xf6\xba\xfc\x35\xd0\x6d\x5a\xad\x8b\xef\xcc\xca\x5b\x5f\x30\xf7" + "\x6b\x8b\xd3\x47\xe8\x36\x71\xff\xfa\x04\x64\x1c\xda\x9f\x26\x13" + "\x8f\x31\x11\x7e\x86\xcc\x5b\xb8\xf3\x09\x92\xaf\x09\x07\xfb\xb0" + "\x17\x62\xff\x81\xec\x45\x34\xfa\x38\xed\x19\x6d\xfb\xf6\xf0\xce" + "\x5e\xe5\xe6\x1f\x12\xdf\xde\x05\x7f\xcb\xb4\x67\x9c\xe0\x43\x25" + "\x5e\x71\xf6\xac\xdc\xbc\x0c\xfe\x91\x9f\xa4\x34\x6f\x9c\x9a\x52" + "\xfd\x77\x66\x94\x3c\x46\x42\x1b\x37\x8c\xe7\x15\x93\x79\x0b\xff" + "\xa7\x85\x69\xfe\xf7\x0d\x2e\x77\x00\x76\x3c\xa6\xe5\xc1\x12\x0e" + "\x9a\x2a\xd7\x57\x42\xbb\x5c\xa7\x9e\x2e\x71\x9f\x40\xb9\x79\x2e" + "\x64\xc4\xed\x88\xe9\x59\x96\x40\xf4\x5f\x5d\x1c\xa1\xd5\x93\x75" + "\xde\xbc\x8b\xe0\xbe\xb9\x9b\xde\x85\xef\x94\x71\x89\xa6\x61\x36" + "\x5a\x4a\x92\x87\x29\x53\x57\xc8\x3f\x2a\xa3\x4c\x5d\x25\xff\xf0" + "\x1c\xfd\x77\x73\xb2\xfc\x1b\x99\xfe\x3f\xfd\xd3\xdb\xff\x6f\xd7" + "\xd1\xf6\x19\x7f\x9f\xa3\x7d\x31\xee\xff\x8f\xe3\xff\x1f\xd5\x71" + "\xfc\x6a\x7f\xc0\x37\xc2\xad\x13\x4f\xfe\x9d\x99\x08\x3f\x6b\x2b" + "\x1f\x26\x9c\x3e\xc9\x2c\x85\x41\xde\x53\xf2\x3d\x36\xad\xf8\x2c" + "\xf1\x60\xc4\x6b\x15\xd8\x79\x4f\xf1\x20\x3f\x45\x78\xf3\x22\xe1" + "\x6f\x73\x55\x37\x4b\xa8\xec\x26\x3e\xab\x40\xc6\x35\xc2\x79\x13" + "\xee\x5a\xb9\xe8\xbd\x6d\x53\x80\x7d\xe0\xbd\x08\xbb\x46\x67\xc7" + "\x6a\x26\xbc\x28\x00\x7f\x13\x56\xb3\x94\xfa\xc9\xfc\x28\x77\xbc" + "\x72\x82\x1b\x5e\x69\xa3\xb4\xe3\xaf\xaa\x19\xb1\xaf\x6e\x6d\x8d" + "\xb5\x3e\x8c\x7d\xde\x5c\xa9\xe1\xe6\xf5\xe2\x2e\x21\xfd\x02\x07" + "\xe1\xb7\x5b\x9c\x5b\x28\x93\x9f\x92\x7b\xfa\xe4\x6c\x4d\x9f\x87" + "\x67\x11\xdf\x87\xc6\xd1\xcc\x1d\x4f\x58\x51\xe7\x2b\x6a\x73\x2c" + "\xf6\xcc\x57\xb7\x66\xc4\x16\x66\x33\x43\x87\xbb\x8f\x1d\x23\x5a" + "\x88\xf3\x71\x5a\x77\x87\x69\x9d\x35\xed\x9f\xcc\x6b\xa8\x7f\x15" + "\xc4\xcf\x95\x53\x9f\x0e\xf9\xcb\xcc\xd8\x7f\xfa\x35\x5e\xce\x49" + "\xeb\xe2\x70\x25\xe5\x59\xbe\x91\x4d\xaf\xa4\x7c\xc4\xdb\x95\x43" + "\x46\x91\xfd\xbb\xee\x32\xc1\xe0\x08\xb5\xd9\x69\x7d\x08\xef\x13" + "\x05\x8f\x81\xb6\x69\x1c\xd6\x6e\x65\xa2\x90\xf9\xd1\x86\xde\xae" + "\xbf\x2c\x79\x95\x5b\x89\x3f\xa8\x9d\x31\xd6\xc8\x7a\x92\xcb\xe5" + "\x7a\x0d\x2c\x46\x7c\x5a\xed\xae\xd6\xe2\xca\xad\xb4\xaf\x0f\x31" + "\x13\xb5\x51\x4b\x6d\x38\xcd\xdb\x18\x37\xe3\x9e\xef\x89\x20\xc9" + "\x35\xaa\xb4\xa1\x55\x26\x3e\x2e\xcb\x4a\x3e\x44\xf0\x1e\x21\xe2" + "\xef\x85\x7e\x86\xf8\x8f\x3c\xa2\x13\xc4\x73\x88\x3b\x12\xc4\x6f" + "\x20\x9d\xda\xa8\x85\xdf\x73\x92\x9b\x8f\xd0\xde\xdd\x04\x5e\xe1" + "\xa1\xcb\xff\xc1\x70\xc6\x01\x7e\x21\xdf\xce\x03\x22\x66\x59\xd9" + "\x44\x93\xce\x2f\x00\x3f\xc0\x23\x54\x3e\xc4\x8c\x57\x68\x8e\x09" + "\x47\x5a\x89\xff\x20\x9e\x7e\xe2\x62\x6d\x6e\x5a\x05\x5f\xa0\xc5" + "\x28\x97\x34\x7c\xe2\xd7\x69\x7f\x4f\xa0\x36\x5a\xdd\xca\xcd\x02" + "\x16\x92\x06\x4d\x5c\xad\xef\xf5\xd0\x39\xb8\xa9\x0e\x4e\xb4\x8e" + "\xe0\x76\x64\xce\x6a\x85\xb9\x95\xe4\x43\x34\x17\x47\x90\x97\xca" + "\x1b\x29\x7f\x0d\xed\xfb\x3a\x7f\x7d\x82\x64\x02\xe2\x03\x26\x5a" + "\xd0\x0f\x2a\xd3\x46\xb0\xc6\x5c\xb4\x6a\x74\xec\xb8\xe4\x61\xae" + "\xfb\x85\x0e\x7b\x9a\xeb\x1d\x11\xf8\x4f\x3c\x11\x0d\x7f\x82\xc5" + "\x0e\x6d\x2e\xbf\x17\x35\x77\x24\x97\x5e\x37\x1f\x7a\x68\x6a\xef" + "\xa8\xd0\xa1\x29\x93\xae\x87\x2f\x37\xc2\x99\xa3\x04\x8b\xa3\x94" + "\xaf\x19\xb4\x79\xfb\xdf\x89\xe6\x3e\x0c\x1e\xea\xba\x9b\x24\x8f" + "\x3a\xe9\x28\x70\xb8\x57\x99\x24\x62\x8c\xf6\x28\x13\xa7\xa1\x3e" + "\x7a\xaf\xa4\x5f\xe2\x65\x27\xed\x2c\xa9\xe7\x5e\x9a\x6b\xc4\xbd" + "\x8e\xd7\xe6\xba\xc6\x5f\x36\xa9\x40\xbf\x87\x04\x1c\xc0\xdc\xd3" + "\x18\xa7\x49\x3d\xc5\xa4\x02\xe8\x1a\x45\xb9\x2b\x79\xe8\xe3\x09" + "\xac\x4f\xfd\x3b\xa5\x7b\xe0\x03\x37\x0a\x36\xd3\xb4\x39\x69\x16" + "\x71\x68\x95\xeb\xae\xd7\xfa\x86\x73\x3f\x13\xf5\x41\x9c\x43\x0c" + "\x5c\xc9\x8b\xa9\x46\x99\xe2\x48\x19\xac\x1f\xc2\x65\x33\x95\x49" + "\xa4\x5f\xae\xe7\x85\xaf\x7d\xea\x47\xed\xd3\xf0\x45\xa6\x4c\x3a" + "\x3c\x70\x25\xcd\x80\xd8\x15\xd4\xae\x01\xb8\x01\xbc\xd0\xeb\xa8" + "\x96\x30\x3a\x4c\xf3\x27\xf0\xeb\x58\xb0\x99\xe0\x7e\xdd\x4a\x37" + "\x93\x36\xd4\xa8\x47\xeb\x9f\x53\x9c\x0f\x8e\x9b\xd0\xd2\x20\xfd" + "\x06\x21\x5f\xd8\xff\x59\x84\xcf\x9c\x04\xbf\x00\x26\xaa\xab\x4d" + "\xc3\x09\x33\xe5\x3b\x18\xc6\x21\xf8\x1c\x50\xae\x4b\x05\xaf\xa9" + "\xf5\x1f\xb8\x77\x93\x84\xdd\xc4\x16\xe0\x80\x8f\xf8\x4f\x39\xcf" + "\x13\xe1\x2f\x3c\x45\xe2\xe1\x75\x1e\xbd\x0e\xe1\xb7\x80\xe0\xac" + "\x52\x1d\x3a\xae\x44\xd3\x06\x7f\x59\x4a\x0a\xd1\x85\x30\xde\xe8" + "\xb4\x40\xd6\x79\xfd\x32\x8d\x0f\xb1\xd3\xdc\x74\x8a\x98\x04\xf0" + "\x6b\x25\xf0\xf2\x7a\xeb\x31\x5f\x90\x3d\x09\xbc\x7c\x08\x34\x21" + "\xa5\x68\x20\xc9\x90\x17\xc1\xed\x94\xb5\x3a\x6e\x47\xcd\xab\xc0" + "\xed\x1d\x82\x1e\xa5\x54\xb8\xd9\x92\x95\x3a\xee\x63\x9d\xab\xb4" + "\xae\xab\x37\x89\xf3\x01\x33\xf4\x81\x62\xdd\x07\xfa\x85\x8c\x81" + "\xf9\xec\xb0\xf7\x08\x9f\xf7\xdb\x55\xc4\xa8\x38\x0d\xfd\x48\x1f" + "\xd6\xbf\xbe\xc6\x31\x37\xd4\x96\x13\x71\x0e\x76\x10\x0d\xc4\x1a" + "\xf4\x51\x9f\x44\x2c\x8c\x49\xcc\xd8\xb2\x2a\x83\xe5\xd3\xdc\x1e" + "\x5b\x8d\x79\xbb\x3e\x41\xbf\xf7\x50\x2d\x69\x40\x82\x86\x2f\xa2" + "\x8f\x23\xe0\x6a\x96\x70\xbd\x3e\x63\xf8\xfa\x9e\xe4\xc6\xfa\x8e" + "\x86\x2b\x60\x0a\xd8\x52\x5e\x1a\x7f\xfc\x12\x1d\xae\x51\x30\x3d" + "\xa9\xe1\xa3\x46\x5b\xaf\x1f\x95\xb6\x22\x76\x00\x62\x3d\x6c\xc7" + "\x58\x68\x4f\x41\xfb\x22\xd6\x9a\x26\xfb\xb4\x78\x81\x53\xd7\x77" + "\xba\x59\x61\x93\x4e\xc7\x08\x57\xd2\x80\x4f\x98\x2b\x9d\x76\x40" + "\x57\xa6\xf5\x3d\xa8\xcf\x07\xfa\x1d\x4d\x13\x68\x8f\x11\xf6\x5e" + "\x91\x31\x4f\x9e\x4b\xe5\x26\x81\xb6\x45\xf8\xab\xc9\x0b\x87\x8f" + "\x7d\x72\x2a\xc6\x0e\x9c\xb0\x6d\x82\xbe\x4c\xee\x65\x6e\xc5\xdc" + "\x34\x9c\x5e\x99\x5f\x14\x76\x19\x1a\x3f\x06\x7a\x6f\x7b\x48\xe6" + "\xc7\xfe\x46\xf9\x85\x6e\x5e\xdb\x0f\xb1\x2e\x90\x56\xaf\xc1\xe0" + "\x04\xe5\x6f\xc1\x5d\x6a\xf8\xe6\x99\x70\x42\xca\x82\x44\xa3\x8f" + "\xd2\xde\xe1\xa4\x7c\xab\x3a\x08\x5a\xc1\x71\x8c\xd5\x6b\xfc\x26" + "\xe8\x04\xdf\x9c\x39\x61\xb3\x87\xc5\xd9\xbe\xc6\xff\xd9\xab\x4c" + "\xf9\x36\xad\xa3\x00\xfc\x5f\x52\xdd\xd6\x5e\x65\xea\x57\xa8\xdd" + "\x14\xed\xd7\x42\xbf\x33\xe8\xf7\x06\xfa\x8d\xa3\xdf\x1b\x7b\x95" + "\x1b\x2e\x52\x7e\x55\xcb\x9f\x4e\xef\x7f\xa5\xf4\x3b\xb5\x5f\xea" + "\xe3\x94\x15\xf4\xbb\xe2\x49\xf0\x95\x0f\x89\xf4\x97\xf1\x4e\xbf" + "\xfb\xb5\x71\xb7\xc9\xb5\x3d\xa5\x88\xea\xb1\x23\x1f\xf6\x35\x4a" + "\xb3\x51\x9e\x6c\xd4\x0d\xdf\x06\xf4\x7c\x7d\x14\x7f\x4a\xf5\x58" + "\x10\xf3\x76\x3e\xfd\xe2\xae\x45\x01\x95\x7f\x1f\xf5\x12\x0c\x3a" + "\x23\xf4\x62\xe2\xb4\x1c\xbb\x9c\x4f\x9a\xeb\x3a\xac\x77\x9d\x1e" + "\x00\x9f\x86\xe5\x5b\x25\xf3\x49\xf9\x75\x4a\x40\x9f\xbb\xa0\xc4" + "\xdb\xc3\x41\x9a\x3b\xaa\x7f\x11\xca\xd3\xef\xbd\xda\x6f\x86\xf6" + "\x7b\x9f\xf6\xfb\xef\xda\xef\x62\xed\x77\x89\x5b\x99\xd2\xaa\xf1" + "\x26\x04\xb3\x29\xad\x80\x09\xad\x5d\xe9\x7b\x4e\xb1\x04\x21\x5f" + "\x13\xfd\xff\x32\x62\x84\xfa\xcb\x2c\x36\x5d\x6f\x0d\xdd\xcf\x95" + "\xb2\x09\xff\xd8\x27\x74\x3f\x96\xf2\x08\x2d\x0c\xf5\x24\x28\x19" + "\x8c\x78\xa7\x71\xf5\x06\x5e\xa3\xd5\xe3\x36\x68\xe7\xf5\x88\x35" + "\x84\x98\xad\xf0\x3b\x28\xe4\xa8\xc4\x45\x88\xb5\x7b\x42\xe8\xf4" + "\x77\xc1\x4f\x50\xc8\x43\x7f\x3e\x6f\x5c\x28\xa0\xd3\x7b\xc8\x4b" + "\x52\xce\x1f\xdf\x49\x6d\xf9\x22\x72\xbe\xe5\xa0\x3c\xdb\x9c\xf2" + "\x43\x7f\xd9\x0d\x51\xf2\xbf\x65\x35\xfa\x4c\xb0\xee\xa2\xf1\xcc" + "\xef\x56\x6e\x80\xbe\xf7\x8e\x1e\x39\xe6\x74\x7d\xcc\xda\x5c\xd9" + "\x74\x98\xf7\x28\x53\x3a\x89\x1e\x6e\x00\x7e\x77\x87\xe9\xf2\x14" + "\x11\x47\x4f\xc3\x1f\x9a\xe7\x29\xf0\xad\x54\x12\x45\x4f\x52\x22" + "\x74\xfa\x86\x9a\xe1\xf3\x32\xb1\x26\x28\xf9\x85\x2e\x5a\x97\xc0" + "\x81\xcc\x11\xeb\x32\x15\xeb\x52\x2b\xdb\x36\x9c\xc6\x4f\x4e\x05" + "\x8d\xd7\xfa\x48\x78\x3b\x65\x01\xe6\xc6\xad\xdc\x70\x58\xdb\x93" + "\xba\x68\x8f\xfc\x32\xa5\x5b\x65\x3f\x65\xba\xd6\x16\xe1\xdf\x14" + "\x0b\xf0\x5f\x4f\xd7\xf0\x1b\xf5\x24\x63\xae\xf5\x74\xad\x7e\xc2" + "\xd3\x29\x26\xac\x1f\x3d\x5d\xe2\x64\xca\x6a\xd0\x1b\x94\x0d\x0a" + "\x5b\x46\x92\xbf\x1f\x6a\xa1\x7e\x4f\xad\x20\xfe\xa2\x11\xeb\x79" + "\xfb\x56\x96\xb0\xb9\x8e\x25\xca\xb5\x39\xf5\x65\xbd\xac\xd4\xe9" + "\x4f\x6d\xd4\x69\x54\xb5\xa0\x67\xd7\xa7\x0c\xa7\x95\x37\x7d\x95" + "\x3b\xcc\xc1\xa0\x29\xe4\x6e\x0f\xce\x17\x34\x97\xd6\x7d\x3d\x95" + "\xeb\x72\xb3\x57\xca\xb5\xbd\xa4\x4d\x9e\xa9\xdc\x98\xd8\xde\x28" + "\x69\x97\x56\x77\x98\xfe\x45\xf1\x21\x82\xd6\xa3\x2d\xd4\x45\xfb" + "\x4a\xb2\xaf\x24\x73\x82\xa4\xdf\x37\xce\x71\xb3\x5b\x52\x74\xda" + "\x8a\xfd\xc9\xac\x30\x5b\xd5\x43\x72\x7f\x52\xa1\x03\xb3\xf9\x84" + "\xbf\xb9\x0e\x5b\x3f\xc3\xbe\x09\x7f\xde\x59\x5b\xe2\xe1\x37\x2a" + "\x93\xfa\x3a\x83\xf8\xb3\x83\xda\xd9\x0c\xc9\xb9\xd3\x3e\x84\x2c" + "\xab\xc1\x95\xd6\xd3\xb4\xd7\xb4\x79\x39\x41\xfd\x39\x08\xda\xbe" + "\x7d\x93\x8c\xd7\x05\x7d\x90\x88\x1f\x07\x9e\xd5\xc2\x03\x22\x36" + "\x41\xd9\x8d\x47\xa3\x74\x5c\x8d\x72\x9d\x4c\x7d\x5e\xc4\x9c\x28" + "\x0f\xb9\xa5\x3e\x71\xda\x03\x32\x7d\xda\x1c\x69\x87\x20\xfc\x86" + "\xe2\xdd\x12\x63\x99\xfc\x17\xa9\x17\x9e\x30\x24\xf9\x91\x69\x09" + "\x51\x36\x3f\x02\xd6\xc2\x6f\x71\xd9\xb4\xd4\xc8\xba\xb8\x31\x80" + "\x32\x54\xb6\x8f\xd2\x17\xea\xe9\x72\xaf\x99\xa8\xf9\x51\x08\xf5" + "\x4c\xd8\x96\xc1\x88\x36\x8f\xdb\xe7\xd0\xd7\xef\xb4\x7a\xd1\xbe" + "\xb6\x7e\x31\x46\xe0\x03\xd6\x70\x10\xbe\xbd\x68\x0d\x63\x2d\xd3" + "\xb3\x27\xa8\xaf\x5d\xc9\xdf\xa5\x88\xb5\x2b\xd6\xed\xb4\xc3\x91" + "\x7e\x4c\xcb\xd1\x70\xf5\xc4\xc0\x23\x96\x04\xfa\x46\x7c\xf7\x04" + "\xed\x2c\xeb\x46\x29\x63\xec\xea\x35\xa9\x83\x3c\x00\xdd\x34\xf4" + "\x09\xd0\xd9\x68\xf6\xaa\x38\x2b\xf1\xc1\x5f\x59\x0d\xad\x87\x88" + "\x8f\xb2\x64\xa6\xfb\x28\xf3\x97\xdd\x64\x89\xe8\x8e\x6f\xb4\x6b" + "\xe3\x72\x53\x7b\xf5\xce\xe2\x77\x80\x4b\x6b\xe4\x1a\xbb\x31\x0f" + "\x78\xec\x22\xdc\xa3\xfd\xa7\xee\x58\xa1\x28\xbb\x52\xc7\x3d\x5a" + "\xa3\x39\x34\xef\xa7\x6b\x27\xf3\x3a\x9a\x53\xd8\xd8\xaf\xa5\xf7" + "\x0f\xe9\x37\x47\xfe\x2a\xc9\xf8\xd5\x70\xbe\x8e\xca\xd6\xb8\xd9" + "\x8c\x66\x7d\x0e\x7c\x89\xb3\xbc\x02\xc7\x8a\x61\xdf\x98\x2e\xce" + "\xfa\x81\x63\xc0\x2f\x71\xe6\x4f\xb8\x66\xde\xf6\x1f\x0c\x78\x26" + "\xfc\x96\xd0\x3b\xfa\x0b\x3c\xa3\xba\x4e\xe8\x3e\x8c\xdd\xca\x4d" + "\xda\x79\xdb\x4d\x5e\xdd\x36\x1c\x78\x58\x30\x83\x5d\x4f\xf5\x5b" + "\x5b\xac\x3e\xe8\xce\xff\xe1\x0a\xde\xc7\x90\x17\xb0\x93\xf4\x72" + "\x4a\x8b\xbf\xec\xe6\xa8\xf9\x9f\x28\x7d\xc5\xae\x12\xfa\xcc\xeb" + "\xe8\x5b\xc6\x70\x9a\x93\xd0\x26\xf8\x4a\xda\x9f\xbf\x90\xc2\xac" + "\x84\xb7\xb4\xd7\xdc\x9c\xa3\xf3\xc3\xf3\x28\x8d\xf2\xa0\x7f\x90" + "\xc1\x3b\xe9\x39\x07\xfb\xf4\x18\x7a\x67\xc8\x25\x5e\xd0\x0c\xe8" + "\x9e\xa0\x07\x23\x58\x1f\xef\x55\x66\x9c\x6e\x87\x0f\xa1\xf5\x9f" + "\xf6\x63\x5d\x6c\xe7\x97\xe1\xd3\xca\xba\x81\x5d\xd7\xad\xcc\x68" + "\x85\xde\xa9\xe4\x22\x74\x3c\x37\xf7\x0f\xd7\xf1\x4c\x5f\xa8\xfd" + "\xad\xa0\xbf\x23\x91\x3f\xeb\x62\xed\xd9\x79\xf5\x3f\xeb\x2a\x99" + "\xd7\x9a\x47\x7f\x05\x12\x56\x16\x5a\x2b\xd3\x57\xe8\xb0\x02\x4d" + "\x01\x8d\x85\x9d\x0d\xd6\x39\x81\x1d\x3e\x8b\x68\x9e\xa8\xdf\xdb" + "\x67\x7f\xc3\xb9\x15\x32\xed\x74\xe1\x0f\x01\xfe\x88\xaf\xc9\xd6" + "\x4b\x99\x2e\xe6\x53\xf8\x8b\x55\xa6\x2f\xa6\xb6\x53\xaa\xcf\x33" + "\xa3\x6d\x03\xbb\x09\x3a\x74\x73\x88\x3b\x21\x03\x03\x27\x10\xd7" + "\xac\x4f\xb1\xde\x57\x50\xc4\x0c\xf4\x7d\x3a\x3d\xcf\xd7\x79\x29" + "\x2a\x93\x1c\x13\x60\x29\xe0\xa1\xee\x2d\x62\xd3\xfd\x65\xd6\x64" + "\x7d\xae\xc0\x67\x40\x8f\xa7\xe9\x22\xd0\x57\x61\x0b\x00\xdf\xfc" + "\x6e\xc0\x4d\xa7\x55\xe7\xa1\xbb\x9e\x1e\x8c\xf1\xb1\x64\xb9\x0f" + "\x59\x57\xd2\xbc\xa6\x48\x7c\xb1\x5a\x08\xf7\x8f\x47\xf5\xf3\xfe" + "\xa8\xe7\x32\x94\x37\xfb\xc0\xc3\x8d\x05\x1f\xeb\xf3\x3a\x7c\xaa" + "\x85\x4f\x4f\x66\x13\xf3\x1d\xe4\xfd\x88\xe3\x66\xdb\xca\x4c\x7d" + "\xca\x8c\xa7\x68\x8c\xb8\x9f\xdb\x2a\x75\xfc\x33\x76\xea\x72\xba" + "\xec\xf7\x8c\xaf\x9b\xb7\xc5\x30\xe8\xe6\xe1\x03\x52\xd8\x62\x5e" + "\xb0\x08\x7d\xbc\x2b\xb8\x90\x39\x8b\xef\x42\x9e\x9b\xb4\xbd\xec" + "\xc4\x40\x89\x85\x1d\xb3\x2c\xa4\x75\x3c\x63\x1a\xad\x95\xbc\x6b" + "\xb6\x79\x55\x66\x4c\xd3\xe0\xdb\x26\x6c\x45\x14\xeb\x39\xec\x25" + "\xd0\x0d\xd0\x3e\xd2\x82\xfd\x9a\xea\xb6\xeb\xeb\x86\xf6\x89\x16" + "\x82\x53\xbf\xa4\x31\x38\x9f\xb7\x7a\xe0\x3b\x46\xc8\x0f\x32\x7f" + "\x82\x3c\x37\x98\x71\x38\xcc\x6f\x53\x3e\x94\x13\x36\x84\x8a\xd5" + "\x99\x15\x82\x2e\xc1\xea\xc4\xd8\x34\x5c\xa4\xfd\x6a\xc6\x89\xc8" + "\xba\xb5\x8a\x7b\x79\xc7\xfa\xa3\xd7\xe5\x8c\x60\x44\x4e\xbd\xb9" + "\x69\x6e\x2d\xb3\x8e\xb6\x0e\x6d\x49\xd8\xab\x6e\x79\xbc\xba\x9a" + "\x37\xd6\x18\xd4\x7b\xb6\x57\xb1\x04\xa5\x82\xc0\x86\x75\xb6\x69" + "\xf5\xf5\xbd\xca\x2d\x45\xe6\x84\x29\x2b\xee\x2d\x18\xcf\x8b\x2d" + "\xcc\x50\x79\x69\xbc\x69\x46\x60\x4a\x23\x8f\x99\xfd\x8d\x65\x05" + "\x38\xfb\xae\x61\x67\xd6\xb2\x98\x7b\x43\xd4\x76\x02\xb3\xb9\x95" + "\xd4\x72\xdc\x35\x3f\x96\x00\x5e\x24\xb5\x1c\x75\x16\xd6\x33\x53" + "\x61\x0f\xf7\x54\x3c\x1a\x6b\xa2\xfd\x37\x99\xf6\x8d\xf2\x09\x09" + "\x53\x1a\xaf\x50\x1d\x6f\xaf\x16\xe5\x9a\xc6\xee\xdb\x17\xe2\x46" + "\xef\x9b\x6d\x72\xaf\xf2\x85\x1b\xae\xad\x6f\x33\x5b\x23\x7d\x9b" + "\xd9\xfa\xbf\xd0\xb7\x17\xa3\xfa\x96\x1c\xe9\x5b\x1e\xfa\xf6\xda" + "\xb5\xf5\xed\x8b\xa6\x48\xdf\xbe\x68\xfa\x9c\x7d\x3b\x3c\x76\xdf" + "\x52\x17\x8d\xde\x37\xfb\x94\x5e\x25\xf5\xeb\xd7\xd6\xb7\xb4\x25" + "\x91\xbe\xa5\x2d\xf9\x9f\xf4\xad\xb8\x9e\x9f\xee\xa0\x15\x04\x7d" + "\x0e\xe8\x7c\xaf\x32\xf3\x5b\x45\xd3\x84\x1d\xf7\x24\x7a\x8e\x2b" + "\xa9\xe7\xff\x94\xbc\x4d\x6a\xbb\xdc\xd3\x52\x69\xfd\xdc\xac\xd9" + "\x95\xcc\x14\x31\x1e\xd4\x98\xa9\x87\xb8\x83\x07\x6f\xf7\xc1\x66" + "\x30\x08\xff\x2a\x06\xbe\x5b\x9d\xf6\xea\x60\xc0\xc0\xe3\xd5\x39" + "\x07\x2e\x19\xd9\xab\x83\x5e\x83\xbf\x6c\x26\xd3\xfd\xb3\xea\x65" + "\xcd\x75\x57\xa3\x47\x33\xbf\x7c\x6f\x1e\x33\x83\x1e\xe1\x17\xb1" + "\x5a\xab\x8b\xc7\x9b\xee\xbd\x88\x7d\x7f\xe6\x52\xfd\xce\xac\x5e" + "\xd7\x72\xcf\x78\x6e\x2e\x64\x31\xb8\xb7\x2b\xfc\x2f\x5a\xbc\x2c" + "\xb5\x90\xc5\x2e\xb7\x53\xfd\x01\xb6\xda\x6c\xa7\xba\x09\x1e\x92" + "\x97\x9f\xf9\x54\xcc\x5a\x96\x50\x4b\x75\xe3\xf7\x5e\x4b\x09\xdf" + "\xfe\x1c\x33\xe2\x7e\x2f\xee\xe9\xca\x3b\xba\xe3\x4c\xd4\xce\x11" + "\xbd\x9d\xcf\x80\x5f\x92\x84\xdf\xad\xcf\x44\xe0\x77\xeb\x03\x11" + "\xf8\xdd\x9a\x28\xe1\x77\xab\x31\x02\xbf\x5b\x7d\xd7\x06\xbf\x5b" + "\x33\x22\xf0\x93\x65\xaf\x0e\xbf\x5b\x37\x8e\x0d\xbf\x5b\x2b\x22" + "\xf0\x93\x75\x8d\x01\xbf\x71\xa3\xc3\xef\xd6\x0f\x3f\x1f\xfc\x6e" + "\xf5\x7d\x4e\xf8\x25\x4a\xf8\x7d\xf1\x4f\x11\xf8\x7d\x71\x57\x04" + "\x7e\x5f\x5c\x26\xe1\xf7\xc5\xc5\x11\xf8\xa5\xcd\xbf\x36\xf8\x7d" + "\xb1\x34\x02\x3f\x59\xf6\xea\xf0\xfb\xe2\x6b\x63\xc3\xef\x8b\x6d" + "\x11\xf8\xc9\xba\xae\x0d\x7e\x69\x13\x09\x6e\xc9\x1a\xfc\x92\xc7" + "\x86\x5f\xda\xfc\xcf\x09\x3f\xb3\x84\xdf\xac\xeb\x23\xf0\x4b\x7b" + "\x3f\x02\xbf\xb4\x4a\x09\xbf\xb4\x1d\x11\xf8\xcd\x2a\xb8\x36\xf8" + "\xa5\x39\x23\xf0\x93\x65\xaf\x0e\xbf\xb4\xcb\x63\xc3\x6f\x56\x42" + "\x04\x7e\xb2\xae\x31\xe0\x37\x7e\x74\xf8\xcd\xfa\xfa\xe7\x83\xdf" + "\xac\x82\xab\xc1\xef\xda\x78\x8d\x59\x42\xd6\xf9\x5f\xa8\xa7\x73" + "\xac\x7a\x00\x43\xd8\x27\xaa\x65\xb3\x3a\x1b\xd4\x71\x26\x79\x87" + "\x63\x56\x39\xc9\x30\x77\x77\x2b\xb3\x6f\x6a\x50\x63\x4d\xdc\x71" + "\x66\x8e\xea\xf0\x1c\xe7\xdb\xc6\x19\xd5\x6d\xe3\x8d\xf0\x29\x30" + "\x5a\x5d\xc2\x5e\x56\x99\x5d\x14\x73\x03\xbb\x19\xf7\xf5\xb6\x13" + "\xbf\x86\x67\x7f\xd9\xec\x72\xe2\x45\x52\x46\xc2\x24\x67\x4d\xbe" + "\x08\xde\xb9\x21\x37\x67\xe3\xba\x9c\xec\x75\x05\xd6\xec\x47\x1e" + "\xcb\x1f\xee\x13\x5f\xc4\xbd\xdc\x81\xf9\x9b\xdd\x16\xf6\xf3\xe2" + "\xe0\x76\xf8\xcb\xb3\xdd\x02\xdb\xb4\xdb\x12\x44\x9c\x82\x78\xb5" + "\x9e\x5f\xc9\xdc\x9b\xf1\x05\xfe\x96\xf0\x03\x78\x25\x6f\x2f\x2f" + "\x0f\xa4\xc2\xb7\x8b\x76\x36\x91\xda\xab\xcc\x9d\xc9\x13\x63\x84" + "\x7d\x88\xb8\xdb\xa1\xdc\xa6\xdf\xc1\x6a\xe5\xa6\x40\xa1\x5a\x11" + "\x63\xe2\x95\x31\xc2\xc7\x4d\x07\x7c\xb0\x6d\x8a\x99\xde\xad\xdc" + "\xee\xe1\x71\x81\x42\xaa\xab\x54\xab\x47\xc4\x1d\xc9\xd8\xca\xff" + "\x81\xfa\x34\x5e\x10\x71\x48\x9c\x92\x1f\xbc\xed\x79\xf3\x36\x6b" + "\x0c\xf2\xc2\x17\x22\x7c\x04\xea\xb1\xa7\xd0\x6f\xe4\x25\x7e\xfc" + "\x6e\x2a\x7f\x37\x62\x6f\x86\xeb\x90\x7d\xba\x8e\xfa\xd4\x25\xc6" + "\x52\x1e\x48\x1b\x78\x22\x73\xaf\x88\xff\x28\xe0\x7a\x7b\x3b\xb5" + "\x9d\x26\xe2\x76\x06\x2f\x88\xb8\x9d\x5a\x99\x9b\xa8\x8c\xa0\xa7" + "\xf0\x7f\x2a\xeb\xb8\xfd\x35\xbd\x5f\xc4\x43\xc7\xd3\xfb\xfe\xa8" + "\x36\x26\xd0\xfb\xce\xa8\xef\x09\xf4\xbe\x86\xf8\xd0\x89\xda\xf7" + "\x44\x7a\x5f\x06\xbe\x54\x8c\xab\xaa\x54\xda\x44\x2b\xb7\xc3\x16" + "\x38\x59\xcb\x33\x91\xf2\x5c\x0f\x5e\x57\xab\x63\x52\x9f\x32\xf7" + "\x13\xc8\x8c\xda\xf7\x14\x7a\x3f\x89\x73\x01\xed\xfb\xf5\xf4\xfe" + "\x36\xbd\x7f\x51\xfb\x4e\x7c\xfd\x1c\x19\xff\xc6\x14\x28\xc0\x98" + "\xd4\x0a\x83\x07\x70\x27\x58\x17\x50\x5a\x2a\xc9\xab\x25\x98\x47" + "\x8c\xd3\xb9\xb5\x8f\x75\x2b\x73\x10\x1b\x34\x46\xcc\x55\x42\x8c" + "\x49\xfa\xe8\x31\x64\x52\x7a\x3f\xd2\x61\x5b\xae\x56\x1a\x3c\x78" + "\x26\x98\xee\x04\x0c\xb5\xb6\x48\x26\x9a\x9b\xa2\xcd\x33\xc1\x0e" + "\x7e\x74\x59\xe9\x01\x6d\x2e\xa8\x6f\xe3\xe9\xfb\x0f\xb5\x73\x8f" + "\x43\xcb\x83\x57\xe4\xfd\x22\x65\xee\xc2\xff\x96\xdf\x08\x2a\x27" + "\xe9\xde\xdc\x42\x3d\x26\x21\xa5\x49\x5f\x59\x84\x9f\xd0\xaf\x78" + "\xe3\x02\xc9\xc2\x4f\x0a\xe1\xa8\x8e\x2b\xc0\x13\x3e\x6e\x76\xad" + "\xd4\xd5\xcc\x0d\xdf\xff\x75\x2b\x73\x7c\x5a\x1c\x07\x26\xe5\x84" + "\xb9\xc7\x23\xf6\x45\x73\x04\x7d\x88\xfa\xe6\x8d\xfa\x66\xd7\xbf" + "\x49\x1b\xb8\xdb\x13\xa2\xbe\xe5\x8d\xf8\x96\x16\xf5\x2d\x73\x78" + "\x9d\xb7\x2f\x8e\xfa\xb6\x64\x44\xb9\xd5\x51\xdf\xe6\x8f\xf8\x56" + "\x18\xf5\x2d\x55\xfb\x16\x43\xe9\xb5\x61\x3f\x85\xca\x9c\x14\x2d" + "\x9d\x68\xfd\xed\x87\xa3\xd2\x8d\x5a\x3a\xda\x6f\x71\xb3\x8f\x35" + "\x39\x46\xe2\x39\xe1\xd1\xad\x5a\x1b\xee\x48\x1b\xb7\x69\x7e\xe6" + "\x03\xf2\x7e\xb1\x72\xdb\x52\xb3\x62\x1d\x0f\x9c\x32\x6f\x2b\x45" + "\x4c\xa0\x1a\xe9\x93\x4b\xae\x43\x11\xbb\x1a\xb1\x6f\x29\xdf\x58" + "\xb4\x71\xcc\xd8\x98\x65\xf3\x32\xf5\xbb\xac\xa1\xf2\x40\x8a\x5a" + "\xce\x57\xfe\x3f\xf6\xde\x07\x2e\xaa\x2a\xef\x1f\x3f\x73\x19\x15" + "\x6d\x06\x26\x97\x6d\xa7\xc2\x9a\x5a\xdb\x1d\xcd\x92\xca\x5a\x2b" + "\x2d\xfa\xa3\x8b\x65\x62\xad\xee\x52\x99\xa2\xa2\x8d\x89\x3a\x12" + "\x22\x2a\x02\xa2\xf1\x20\x31\x48\xd4\x22\x1a\xa0\xbb\x5f\xdb\xc5" + "\x5d\x2b\x76\xd7\x9e\x87\xdd\xc7\x76\x67\x37\x7d\x18\xe4\xcf\x0c" + "\xad\xfd\x1e\xea\xc1\xa7\xc9\xc8\xc8\x45\x9d\x14\x65\x84\x99\x7b" + "\x7e\x9f\xcf\x3d\xf7\x32\x77\x06\x06\x66\x06\xfc\x93\x8f\xbc\x5e" + "\xf7\x75\xb9\xe7\x9e\x39\xf7\x9c\xcf\xe7\xfd\xf9\x77\xfe\xe2\x59" + "\x83\xb8\x7f\x57\x56\x3b\xe5\x85\x33\x06\xf1\x2c\x43\xd2\x45\xac" + "\xa9\x9d\xd9\xa0\x1b\x22\xd0\xce\xe1\xf8\x5e\x23\xc4\xb7\x8d\xc6" + "\x93\xec\x9c\x41\x5c\xdf\xbb\xd5\x19\xb5\xb6\x9d\x44\x1b\x1f\xa1" + "\xad\x18\xe7\x31\x9d\x30\xd1\x02\x79\x23\x45\x9d\xb6\x83\xcd\xf5" + "\x8e\xc1\xb3\xb9\x23\xad\xed\x42\x3f\x73\xf8\x71\x45\x4c\xb3\xf4" + "\x9e\xb5\x37\xa6\x59\x88\xa5\xc5\x75\x85\x50\x47\x57\xcf\x39\x98" + "\x8a\x98\x96\x73\xea\x61\x86\xce\xdc\x18\x8d\xf7\xfc\xc6\x98\x71" + "\x58\x26\xb6\xc1\xae\x98\x58\x8f\x65\x43\x9e\x49\x3d\xf3\x1b\xc3" + "\x9d\xb8\x0f\xde\xa3\x6c\x3e\x7e\x4c\xb3\x70\x06\x50\x6e\x0c\xc4" + "\xff\x13\x27\x88\xf3\x38\xb7\x50\x9c\xfb\xd8\x45\x08\xce\x6b\xa6" + "\xa3\xdc\xfb\xb2\xbe\x25\xa3\xcf\x76\x27\xe0\x5c\xd5\x63\xc2\x3c" + "\xec\xd5\xb8\xff\x9f\x93\xcc\x32\x12\x76\xb6\x8d\x22\xe6\xcf\x8d" + "\x1d\x76\xb2\x19\xd7\x24\x6e\x75\x56\x9e\x1d\xe5\xfe\x0b\x94\x59" + "\x69\x27\x8b\xde\x12\xfb\x25\xf0\x9c\x5d\x88\x85\xa1\x7d\x59\x06" + "\x02\x79\xf6\x40\x1e\x0b\xe4\xa9\x97\xf2\xe0\xfb\x4e\xec\xe3\xa5" + "\x06\x82\xed\x3a\x67\xba\xb3\x14\xde\xb7\xdb\x39\x4b\x33\x9b\xa3" + "\x19\xe3\xb4\x93\xaf\xb2\xfd\xd9\x60\xa1\x5f\x54\x15\xa6\xa3\x05" + "\x61\x7a\xd0\xf9\x5a\xb6\x17\x41\x98\x8e\xf5\x27\xdc\x33\x0d\xcf" + "\x37\xc3\xb3\xc7\x71\xec\x93\xe9\xbe\x7b\xb6\x0a\xfa\x03\xd2\x80" + "\x3f\x95\x60\x23\x84\xf5\x69\xc1\xe9\x85\x7b\xe6\x08\x65\xdc\xc4" + "\xf6\x3f\xc3\x75\x24\x9d\xb9\xf7\xec\xee\x39\x3f\xa2\x67\x4d\xc3" + "\x3d\xb5\xd8\xcf\xb8\x8d\x67\x75\xf4\xad\x03\xd6\x17\xca\xf2\xbb" + "\x0f\x09\xfc\x46\x2b\xf4\xc5\xe6\xf3\x53\xd8\x7c\xb6\x7b\xaf\x0f" + "\xd3\xde\x7c\xbe\x33\xf7\xde\x9e\xf1\x0f\xcc\x83\x3c\xe3\xa1\xfc" + "\x9e\x76\xa6\xe0\x37\xee\x9d\xc4\xc6\x0a\xee\x8d\xe3\x4d\x61\xda" + "\x6d\x5d\x44\x29\xa6\xc7\x35\xba\x9c\xb8\xbe\xbf\xcf\xbd\xb8\xd0" + "\x4e\x0b\xfb\x38\x15\x86\x69\x71\x0d\xc7\x44\xa7\x54\xe7\xfb\xe2" + "\x70\xed\x00\xd6\x99\xd1\xf6\xbe\xa9\x12\x1d\x4d\x67\xa0\xec\xcc" + "\xcf\x48\xab\xe2\xde\x43\x38\xc7\x46\xa0\xc9\x7a\x69\xde\xd7\xbd" + "\xc2\x3a\x6e\xe1\xfb\x2c\x8f\x30\x66\x8a\x73\x8e\x91\x4e\x15\x88" + "\x35\x28\xb3\x10\x78\x21\x9c\x8d\xab\xb8\x4f\x88\x75\x36\xc3\x7b" + "\xa1\xdd\xc2\x9c\xba\xfb\x92\x99\x1c\xdc\x07\xf1\xcf\x7d\xe9\x4c" + "\x0e\x58\x1a\x9e\x5d\x8f\x73\x21\x4e\x29\xee\xfd\x0a\xcf\xa7\x05" + "\x7a\xe8\x71\x0f\xbb\xc6\x0e\x90\xd7\xf4\x2e\xc4\x82\x1e\xcf\x21" + "\x04\x3a\x08\xf3\xe1\x91\x5e\xf0\xbf\x05\xbf\x8f\xb4\xc5\xb3\x79" + "\xc3\xb4\xd1\xa0\x07\xee\x4b\xec\x39\xe3\xf8\x06\x5c\x57\x71\xaf" + "\xdf\xbd\x0b\x91\x46\x6e\xa8\x73\x23\xf8\xcc\xe6\x9b\x3e\x83\xfa" + "\x4d\x1a\xc7\x47\x84\x69\x71\x0e\x27\xd4\x95\xcd\x73\x2b\x60\xbc" + "\x63\x38\x98\xa4\x80\x6f\x4c\x6c\x64\x58\x60\x67\xa3\x2b\xee\xab" + "\x14\xe9\x27\x9c\x7d\x51\x94\xc6\xe8\x20\xe6\x9f\xc7\xfa\x86\xa2" + "\xef\x87\x7a\x79\xce\xff\x82\x74\xa1\x5f\x4f\x9c\xe7\xdd\x99\x3b" + "\x29\x4a\x56\xe7\x0e\x61\x2d\xe2\x19\x8c\xeb\xef\x3b\x80\xdf\x32" + "\xe1\x1e\x63\x88\x8b\x13\x72\xfc\xdf\x57\x8e\xf5\xc4\xf9\x81\xee" + "\x91\xfc\x14\xba\x95\x8f\x45\x3a\xc3\x6f\x8e\x80\x2c\xf4\xb9\x2f" + "\x21\xea\x6e\x3c\x4b\x05\xbe\xb7\x45\x76\x9e\x2f\xd8\xe2\x49\x1f" + "\x48\xb6\x16\xfd\x04\xdc\x6b\xa2\x27\xcd\x34\x3d\x01\xf4\x77\x82" + "\xe8\x67\x25\xf8\xdd\xef\xf0\x6e\x12\x83\xeb\x9d\x71\xae\x38\xe2" + "\x8d\xaa\xa6\x39\x71\x0f\x65\xdc\x0f\xd2\xbc\xfe\x5e\xa8\xef\xfd" + "\x4b\xde\xbc\x41\x58\x63\xd9\x61\xbe\xfb\x0c\xce\x13\x6a\x3f\x9e" + "\x21\xec\x73\x14\x1e\x9f\xee\xa2\xbb\xd8\x79\xde\x0e\xaa\x9e\xe6" + "\xc4\x77\xc2\x19\x02\x58\x66\xa8\xfb\x01\x2b\xee\x8f\x11\xfd\xa9" + "\x76\xf0\x27\x7e\x00\xed\x11\xec\x14\xfc\x7f\xc3\x09\xc5\x03\x26" + "\x76\x06\x25\xdb\xd3\x5e\x9c\xef\x38\x9c\xed\x11\xe0\x20\xc2\x9a" + "\x6d\xc5\x03\x0a\xdd\x78\x42\xda\x15\x0f\x0c\x13\xf6\x97\xce\x73" + "\x1a\x44\x1a\x18\xb6\xb1\x7a\x45\x2e\x48\xe7\x84\x3a\x62\xfd\x82" + "\xac\x5b\xbd\x68\x4b\x87\x77\xe6\x3e\xa0\x91\xf6\x16\x10\xda\x2f" + "\xee\x3b\x6d\xbe\x1d\x63\xa7\x07\x36\x8a\xf6\x33\x59\xfc\x76\xf2" + "\xe0\xbf\xfd\x80\xb8\x96\xd2\x19\x2b\xec\xbd\x0d\x74\x81\x72\x63" + "\xa1\x1e\xa5\x92\x4d\x17\xe7\xe9\x4f\x60\xbe\xc6\x03\x55\x1e\x7b" + "\xce\x68\xe8\xb5\x6e\x68\xd5\xaa\x54\x1d\x04\x0d\xc6\x85\xa9\x8b" + "\x0d\xba\x25\x29\x29\xab\x52\x74\xb8\xe9\x8e\xcf\x59\x4d\xe1\x34" + "\xf7\x81\x83\xe2\x79\x72\x95\x3d\xe7\xc9\xe5\xfe\xa4\x67\xfc\x0b" + "\xc7\xd0\xec\x8a\x9f\x68\x86\x26\xb6\xfa\xc9\x04\x7f\xe5\x14\x71" + "\x7c\x15\x5c\xd5\x70\x99\xe1\xb2\x60\xac\xb5\xc0\x49\x62\xc1\x46" + "\x0b\xf1\x98\x67\xcd\xfc\x03\xb8\x77\x4d\xec\x31\xc5\x4f\xb6\x56" + "\xf0\x4a\x22\xec\xad\x92\xc3\xe3\x7c\x16\xdc\x27\xbd\x1a\x2e\x33" + "\x5c\x16\xb8\x84\xdf\xf1\xff\x10\xd6\xfb\x56\xc9\xdf\xe1\xf8\x38" + "\xcd\xf9\x08\xf7\x5b\xb7\xd1\x4d\x4a\x61\x1c\x84\x2f\x66\xf9\x7c" + "\xea\xc0\xd1\xdc\x7b\x54\x62\x3e\xc1\xcf\x8a\xd8\x44\x74\x7d\xe4" + "\x0b\xa3\xb9\xe3\xf7\x8b\xf9\xc2\x31\x9f\xd4\x1e\xdc\xc3\x1f\xf2" + "\x4b\xf9\x94\x34\x77\x92\x45\xcc\x27\xac\xfd\xe3\x73\xb8\xbe\xbe" + "\x3b\x8c\xe6\x38\x1d\x62\x3e\x8d\xbc\x3c\x59\x9e\xe1\x7c\xee\xed" + "\x5a\xcc\xc3\x6f\x52\x0a\xbe\x21\xcd\xfd\xc9\x04\xc8\xdf\xb7\x8e" + "\x09\x8a\x4f\x93\x8f\xf8\xf2\xc9\xb8\x78\xd9\x92\x87\x96\xad\x4c" + "\xc3\xd3\xa9\x52\x57\xad\x49\xc5\xfb\xca\x85\xcb\x85\xdb\xaa\x05" + "\x4b\x17\xb3\x7f\x52\x93\x63\xf0\x9f\x64\xc0\x1b\xde\x93\xd6\x18" + "\xf1\xb6\x78\x15\x3e\xa6\x1b\x26\xac\x59\x2c\x1d\x13\xee\xb5\xf7" + "\x53\x67\xee\x83\xe0\xff\xfe\x24\x99\xf9\x23\x0f\xe6\xd9\x15\xe3" + "\x85\xf1\xc6\xc8\x4d\x76\x72\x48\x2f\x9c\x27\x48\x7a\xed\x99\xa0" + "\x78\xf0\x97\xb8\x67\x42\xe4\x26\xe3\xe2\x48\xd7\xb2\x25\xa0\x67" + "\x77\xc3\x6f\xc1\xff\x7d\x87\xad\xc9\xcf\x73\xa6\x0b\xfb\x87\xe6" + "\x3e\x18\x25\xcd\x71\xe4\xf3\x9c\x13\x70\x5f\x7c\x61\xce\x53\x31" + "\xee\xc7\xe3\x44\x1d\x9a\x5a\x51\x2c\x9c\x4f\x03\xbe\xa9\x73\x12" + "\x3c\x67\xc0\xb3\x16\x9e\xa3\xf9\xbc\xb6\x6a\x5c\x23\x09\xcf\x78" + "\x9e\xd9\xd8\xce\xdc\x87\x7a\xce\xbf\x94\xd3\x46\x3c\xc0\xee\xa1" + "\x3e\x63\x74\x9f\x7d\xc7\xa0\x0c\x83\x74\x3e\xb0\x70\x16\x70\xee" + "\x43\xe9\x3d\x67\x01\x0b\x67\x3a\x69\x04\xdb\xc4\x6c\xfb\x43\xe7" + "\xc2\xb4\x63\xb6\xb0\x58\xe0\xa1\xdd\xd2\xbe\x10\xcc\xd7\x7f\xa8" + "\x4a\x76\x8e\x32\x3e\x9b\x7b\xce\x51\x66\xfb\x98\xed\x14\xf6\x5e" + "\x52\x3c\x0c\x32\xfe\x50\x4c\xcf\x99\x77\xb9\x0f\xb5\xc9\xcf\xbc" + "\xb3\xc3\x7b\x8c\xb1\x3a\x73\x1f\x26\x1e\x3b\xf8\xd0\x5b\xf8\xcd" + "\xbe\xce\x8c\xde\xc6\x41\x3c\xb0\x0e\xe2\x01\xb8\x0b\xb1\x81\xe8" + "\x87\x63\x3a\xcd\x89\xc5\x3d\x76\x74\xf8\x0e\x7d\xbf\x3e\xfb\x3d" + "\x04\xbf\xf6\xe1\x1d\xb8\xff\xae\x23\x2b\x49\xf1\xc3\x0a\x9c\x07" + "\x05\xcf\x6c\xff\x48\x7a\x4a\xf1\xb0\xb0\xc6\x4c\xda\x5b\x4e\xbe" + "\x2e\xbf\xcf\xf5\x0f\x1f\x4b\xe3\xd6\xc9\xab\x22\x5d\x0b\x97\x30" + "\x3f\xee\xe1\x0b\x4c\x97\xf2\x89\xcc\xde\x3f\xdc\x4a\x9f\x63\xe7" + "\x9e\xd8\x15\x53\x0c\xb8\x26\x2a\x52\x91\xbc\x8a\xc2\x6f\x23\xd3" + "\x17\x2e\x11\xd2\x20\xdf\x66\xf0\xb5\xc4\xfa\xd5\x5a\xa3\xdb\x08" + "\x3d\xef\x66\xfb\x0d\x28\x1e\xb6\xcc\x1f\x93\x8d\xdf\x09\x17\xfc" + "\x88\x8f\x89\x0a\xcf\x1f\xc4\xba\x55\xc8\xf6\xbe\xdb\x06\x69\x38" + "\x27\xec\xec\x73\x44\x85\x7b\xfd\x8a\x75\xb1\x08\xe7\x9f\xe5\x4e" + "\x49\x94\xf6\xed\x01\x9a\x5b\x7c\xdb\xf3\xdc\xcf\x04\x09\xb9\x63" + "\xf1\x84\xd9\xd3\xe0\xbf\x09\xe2\xd1\xb9\x72\xec\x44\x9f\x8d\x20" + "\x45\x67\x7f\xf3\xe6\x0f\x84\xb3\x27\x73\xa7\x80\xfe\x7f\x98\xed" + "\x27\xb1\xf9\xc5\x6f\x50\xb7\x08\x67\x32\xe2\xda\x46\x1e\xd7\xee" + "\x3e\xfa\x2b\x61\x9f\x5d\x8e\xf9\x8b\xc2\xb9\x4c\xb9\x53\x52\xe9" + "\x28\xa7\x96\x9d\x3b\x4b\x27\x03\xff\x04\xbb\x8f\xb2\x21\xac\xe1" + "\xd4\x60\xdb\xa7\xe2\xba\xd6\x27\xe0\xfa\x05\x3b\x27\xe6\xc5\x6f" + "\xa4\x72\x71\x0f\x2b\xc0\xd6\x6e\xb8\x03\x5e\xa6\xc6\xf4\xcc\x53" + "\xea\x59\x17\x3a\xf5\x59\xdc\x5f\xcb\xb3\x46\xf8\x51\xb1\x5f\x73" + "\xea\x3c\x3b\xf9\x51\x11\x93\xef\xa9\x80\xff\x3a\x71\x7d\xd8\xd4" + "\x54\x3b\x79\xda\xe6\x53\xc6\x87\x52\xff\x0b\xe3\xdd\xd4\x52\xc0" + "\xe2\x13\x70\xfd\x02\xf2\xef\x91\xce\xdd\xde\xcc\x09\xeb\x9b\x8e" + "\x87\x69\x71\x0d\xf0\xd4\x03\x52\xfa\x30\x45\x2c\xd0\x66\x6a\xbd" + "\xa4\x4f\xce\x8e\xe2\xe3\xe0\xb9\x05\xfc\xcd\x39\xe2\x33\xc8\xdc" + "\xd4\x76\xe9\x19\xfe\x77\x4a\xfa\x06\x63\xc4\xb3\x1b\x12\x76\x60" + "\xec\xb9\x58\x0b\x3e\x99\x16\x63\xbc\x47\xb4\x76\x72\x78\x8b\xf0" + "\xdb\x88\x71\x55\x67\x73\x1a\x62\x3a\x22\x1e\x73\x74\x80\x0e\x85" + "\x77\x93\xec\xe4\xf7\x47\x58\x39\x8f\xc4\xda\xb9\xc3\x3a\x0f\x3f" + "\xc2\x22\x81\xc6\x73\x58\x9b\x1e\x4d\x87\xff\x13\xf0\x0c\x74\xc8" + "\x67\x00\xf9\x9a\xcd\x62\xc2\xf6\xdd\x05\x5d\x9a\x39\xd6\x2d\xe0" + "\xb3\x2e\x45\xac\x3c\x2a\x9c\x1f\x6d\x5a\xaf\x11\xf6\xdf\xc5\xbd" + "\x10\x84\x3d\xd2\x70\xef\x49\x17\x19\x2e\xec\xf7\x6f\x1a\x5f\x29" + "\xec\x73\xbf\x56\xaf\x92\xf6\x9d\xa4\x79\x9d\x60\x0f\xde\x6b\xc7" + "\xbd\x28\x85\xfe\xbc\x4e\x7d\x84\xb0\xff\xa4\xb8\xef\x64\x79\x1a" + "\x89\x2a\xe3\xd9\xbe\x93\xc2\x3e\x09\xfd\xec\x3d\x49\x73\x4e\x6c" + "\x91\xf6\x9e\x04\x3a\xe0\xfa\x47\x3d\x3d\xef\x72\xc2\x7d\xac\x6c" + "\xbf\x1d\x65\x9f\xfb\x50\x72\xa0\x37\x39\xb6\x0f\x65\x70\xf6\xe6" + "\xd1\x27\x19\x4e\x1e\xdd\x22\x9d\x0b\x2e\x4b\x2b\x05\x9c\xef\x61" + "\x69\x53\x67\x8b\x69\xfb\xec\xa4\xd6\xd1\xe3\x9b\x81\xbe\xc3\x7e" + "\x4d\x90\xe3\x23\x10\x07\xef\x90\xcb\x15\x11\xfe\xd0\x74\x0f\x03" + "\xbb\x3c\x1c\xae\x11\x78\xc5\xf5\xe8\x8f\xf3\xb4\x19\x63\x84\x48" + "\x05\xd8\x9b\xf4\x30\x1a\xef\x72\x85\x2d\x70\x29\x8e\xa0\xef\x89" + "\xeb\xbe\xe3\xdd\x2e\xdc\x7f\x40\x19\xef\x3e\x8b\x67\x76\x1e\xc1" + "\xf5\x6c\xdb\x96\xe2\xfa\xca\x5b\x29\x9e\x57\x13\xef\x3e\x4d\x77" + "\xb1\x75\xa3\x36\xf1\x1c\xce\x7a\x77\x1a\xb5\x00\x1f\x54\x18\x77" + "\xe0\x1e\x60\x11\x0a\x27\x89\x30\x86\xfd\x6d\xd6\xb9\xbf\x51\xdc" + "\xff\x0b\xcf\x2a\xe3\x73\x9d\xa0\x2b\x75\x8a\x05\xae\xb0\x6c\xab" + "\xab\x55\x38\x2f\x20\xde\x3d\x82\xc6\xa7\x4f\xa5\xc2\x19\x63\x69" + "\xf4\x20\xe8\xd9\x30\xe1\x5c\xee\x75\xf4\x2c\xfc\x1f\x1e\xbf\xee" + "\x2c\xc5\x33\x43\xa1\x6c\x4b\xbc\x8b\xef\x8a\x4f\xe7\xb3\x16\xa4" + "\x2b\xe0\x77\x5f\xc2\xef\xbe\x84\xfa\xc4\x40\x99\x1a\x78\x7e\x94" + "\xee\x5a\x8a\xeb\xb0\xb2\x85\xd8\x07\xda\x68\x16\xd7\xb6\x56\xe3" + "\x39\xa1\xb8\xdf\xf8\x02\x97\x39\x7b\x97\xb8\x56\x55\x38\xaf\x36" + "\xbd\x9b\x8a\xdf\x99\x1c\xbf\x8e\x3c\xba\x60\xdd\xad\xc2\x9a\x57" + "\x5c\xcf\x15\xef\xd2\xc1\x37\xb3\x91\x1e\x2a\xe1\x8c\x70\x61\x4d" + "\xd7\x63\x31\xfd\x9d\x19\xda\x67\xbc\x9d\xff\xfd\x2a\x6a\xaa\x99" + "\x44\xf3\xb5\xd9\x70\xdf\x4f\xf3\x68\x12\xce\x83\xa5\xf9\x37\xcf" + "\xa6\x26\x0b\xa4\xdf\xa2\x83\xfb\x7e\x9a\xaf\x73\x50\x53\x2d\x3c" + "\xff\xd0\x0c\xf7\xfd\x34\x97\xcf\x83\xfc\x31\x34\x97\xe2\xef\xaa" + "\x68\x3e\x49\x87\x7c\x31\x34\x5f\x61\x84\x3b\x3c\x73\x06\xc8\x07" + "\xcf\x61\x89\xc7\x15\x8f\x75\xc0\xff\x90\xf6\xa3\x22\xf6\x2d\xdc" + "\xcb\x04\xbe\x95\x3f\xa1\x88\x7d\x63\x62\x11\xfb\xc6\xbd\x45\xec" + "\x1b\xf7\x17\x09\xdf\xc8\x57\x26\x40\xbe\xc9\x34\x7f\x98\x05\xee" + "\xd5\x34\x7f\xc4\x64\xc8\x07\xcf\xe1\x95\x70\x87\xe7\x51\x5a\xc8" + "\x07\xcf\xd7\x41\x5d\x6a\xe1\x59\xe5\x84\x7c\x53\x68\x7e\x44\x32" + "\xdc\x0f\xd0\xfc\x48\x3b\xe4\x83\xe7\xeb\xe7\xc0\x1d\x9e\x47\x43" + "\x39\xb5\xf0\x1c\x35\x05\xee\xf0\x3c\x19\xeb\x01\xb1\xe0\x43\x50" + "\x6e\x8d\x99\xe6\x3f\x8c\xf9\xe1\x79\x2a\x94\x67\x81\xe7\x47\x63" + "\x20\x1f\x3c\xc7\x36\xc3\x1d\x9e\x1f\xc7\xb6\x3e\x49\xf3\x9f\x9c" + "\x00\xf7\x83\x34\x7f\x1a\xa4\x5b\xe0\xf9\xa7\x5b\xe0\x0e\xcf\x33" + "\x30\x3f\x3c\x3f\xd5\x02\x77\x78\x9e\x89\x34\x8a\xa3\xf9\xb3\xda" + "\xe0\x6e\xa1\xf9\xcf\xc6\x41\x3e\x78\xfe\x19\xd6\x1f\x9e\x7f\x1e" + "\x0e\xf9\xe0\x39\x01\x69\x05\xcf\x2f\x60\x3b\x67\xd2\xfc\x97\xb0" + "\xfc\x7a\x9a\xbf\x00\xe9\x02\xcf\x0b\x81\x7e\x16\x78\x4e\x02\x7a" + "\xd4\xc2\xf3\xd2\x03\x70\xaf\xef\x9b\x9f\xcb\xde\xa2\x9b\x86\x13" + "\x9a\x9f\xb2\x9f\x6e\x1a\x01\xf7\xd4\x24\xba\x69\x98\x9e\xe6\xaf" + "\x3d\x08\xe9\x70\x5f\x33\x05\x9e\x27\x88\xcf\x70\x4f\x8b\x82\xe7" + "\x18\xf1\x19\xee\x69\xed\xf0\x3c\x49\x7c\x86\xfb\xba\x54\x78\x06" + "\x1a\xaf\x9f\x09\xcf\x70\x5f\x67\x87\xe7\x29\xe2\x33\xdc\x33\x34" + "\x70\x77\x39\xc6\xbc\xe1\x74\xa8\x4b\xaa\x1c\xea\x3a\x1d\xce\x89" + "\x72\x17\xd6\xc4\xf0\x11\x35\xb8\x47\xf0\xf0\xac\x73\x64\xc4\x71" + "\xc5\x93\x7b\xd1\xee\x59\x33\xec\xc2\x99\x75\xe2\x9e\x77\xc3\x8f" + "\x29\x9e\xf8\x10\xec\xfc\x64\x3c\x07\x1d\xda\x9c\x4c\x73\x86\x9d" + "\x81\x7b\x3b\xcd\xb9\xee\x18\xb4\x19\x9e\xaf\xff\x18\xee\xf0\xfc" + "\x40\x3e\xb4\x19\x9e\x5f\x7c\x1c\xee\xed\x9d\xb9\x4f\x46\xdb\x15" + "\x8f\x31\x9d\xfd\x9b\x37\x35\x91\xae\x2c\xd0\x13\xa0\x47\x77\x34" + "\xd9\x23\x5d\x89\x84\x9a\xea\xcc\x91\x78\xb6\x44\x79\xf1\x64\x1a" + "\xb1\x5d\xa8\x13\x9e\x1f\x43\xbb\xc7\x72\xec\xdb\xd7\xd1\x63\x8a" + "\x27\x67\x60\x9f\x2a\x8d\x78\xdf\xdf\xfb\x65\xc2\xfb\x9b\x9a\x1c" + "\xec\xbd\x86\x78\xde\xff\x02\xdf\x6f\x8d\xc4\x7e\xf0\x5b\x36\x39" + "\xec\x8a\x27\xab\x30\x8f\x5d\xf1\x44\x3d\xcd\x09\x23\xd6\x8e\x36" + "\xb1\x8d\x23\x30\xdf\x1f\xf0\x77\xfe\xfa\x55\xf8\x02\x9b\xd6\x94" + "\x43\x6d\x18\x43\x82\xde\xe7\x74\x99\x63\xab\x8f\x29\xa6\x67\x97" + "\x0b\x7d\x03\x4d\xd5\xb8\xbe\xe8\x98\x62\xda\xb4\xee\x7c\x9a\xa7" + "\x5b\x1f\x09\xe5\x4d\xdf\x94\xe5\xa4\x1d\xe6\xcc\xc7\xc1\x3e\x09" + "\xe9\x07\xd9\x9c\x75\xe1\xff\x2a\x36\xcf\x48\xf8\xbf\x8c\xf5\xb5" + "\x4e\xcf\xc6\xdf\xca\x7d\x76\x77\xee\x2a\x23\x1f\xd1\x64\x66\xe3" + "\x64\xd3\x66\x7c\xc8\xdb\xb9\xc8\x54\x32\x4c\xb7\xfe\x6f\x50\xfe" + "\xb4\x22\xef\xf8\x4e\xca\x2b\xbc\x5b\xf3\x57\xc8\xfb\xb6\xd0\x17" + "\x33\x6d\xb7\xd4\x8f\x4c\xa1\x0d\xaf\x33\xdf\x06\x63\x65\x25\xf3" + "\xd1\xa6\xeb\x70\x5f\x4d\x97\xaa\x6e\xb7\xab\xa0\x64\xb7\xbb\xa0" + "\xa9\x9a\x16\x36\x99\x23\x5c\x0a\xc2\xe6\xfb\x4f\x9f\x3b\xd1\x89" + "\x7d\x64\x87\x31\xaf\x9a\x1f\x9e\xbe\xe7\xee\x74\xc2\x99\x53\x3e" + "\xc3\xe7\x67\x68\x6e\xa6\xca\xda\xde\x4c\xcc\x29\x42\x59\x33\x69" + "\xee\xd6\x79\xfc\xf0\xcd\x79\x15\xe8\x5b\xa6\x63\xdf\xce\xc7\x48" + "\x97\x26\xa0\x33\xf8\xf0\xd3\x27\x48\x75\xc1\x3d\xfe\x4d\x40\x3b" + "\xf4\xfb\x70\x7d\xf6\x02\xb7\x1b\xf7\x92\x82\x18\x66\x7a\x36\xeb" + "\x1f\x9c\x2e\x9c\xfb\x2c\x7e\x77\x09\x3f\x8a\xa6\x36\xce\xc3\xb1" + "\x58\x0d\xee\xcd\xd3\x21\xac\xe7\x74\xe1\xb9\x7c\x68\xdf\x58\x5e" + "\x39\xef\x56\x2c\x36\x2e\x58\x6f\x5c\x95\x92\xba\x60\x8d\xf1\x21" + "\x1d\x04\x5e\xba\x55\x4b\x75\x2b\x96\xac\x58\x95\xb2\xce\xd7\x3f" + "\x0c\x87\x7a\x1d\x04\x6c\x08\xfe\x54\x2d\xf8\x9c\xac\xdf\x3a\xee" + "\x2d\xe4\xf5\x8e\x12\x76\x0e\x04\xe4\x69\xb3\x93\xdf\x08\xfb\x8a" + "\xf1\xa5\x4d\xcd\xb4\xac\x78\xf2\x56\x5c\x97\xbe\x06\x7d\x7c\x07" + "\xb1\x92\x33\x50\x37\x76\x26\x60\x23\xee\x9d\x90\x96\x41\xcd\x69" + "\x67\x10\xe3\xd5\xd4\x74\xd8\x02\x18\xcf\xbe\x60\xda\xae\x3d\xa6" + "\x88\x4b\xbf\x60\x3a\x5c\x2d\x9d\xdb\xe3\x2e\xa8\xd3\xf2\x2a\x5b" + "\x0c\x9e\xdb\xd3\x4d\xb5\xa4\x01\x68\xd9\x95\x47\x13\x01\x09\xf3" + "\xca\x73\xc0\xee\x40\x6c\x20\xec\xd9\xf0\x9b\x62\x87\x9b\xea\x95" + "\xee\x1c\x12\x0e\xf7\x08\x1a\xd1\x94\xd8\xad\xaa\xab\xc2\xf7\x78" + "\x5e\x8f\xbb\x5b\x4f\x32\x8f\x50\xfe\x05\x03\xe0\x26\x87\x50\xe1" + "\x8c\x54\xc3\x49\x02\xe9\xa3\xf8\xc2\xba\xd8\xe3\x71\x84\xc3\xbc" + "\xe0\xd7\x90\x79\xf0\x7f\xc6\x42\xa2\x86\x7c\x91\x19\xb5\x90\xde" + "\xa9\x1f\xe5\xca\xd2\x87\x77\x65\xe9\x47\x75\x53\xbd\xca\xda\xea" + "\x24\xdd\x77\xbc\x49\xee\x72\x10\xe5\x0e\xf0\x7f\xca\x79\x90\xaf" + "\xb2\x62\x9d\x7b\x83\x7e\xb8\x6b\x83\x5e\xd9\xdd\xad\x0f\x77\xad" + "\xd5\x2b\xbb\xd6\xea\x87\x77\x77\xea\xc3\xad\x49\x0e\x72\xd8\xf1" + "\x3b\xd2\xd8\xda\x26\xf4\x2b\x76\xab\x9b\x92\xbb\xd5\x75\x33\x55" + "\xad\x24\xea\x6e\x23\xf8\x41\xe0\x17\xee\x04\x1f\x18\x30\xa1\x72" + "\xbd\x53\x0c\x36\xaa\x49\x03\xf4\x7d\x69\xda\x38\x7a\xda\x9d\x3b" + "\x6b\x82\xee\x29\xd0\x45\x9b\x94\xd1\x90\x06\xf8\x79\xa1\x8c\xe6" + "\xfe\xbc\x15\xe2\x71\x1d\x5c\x63\xed\x8c\x0f\xe0\x7b\xcd\x04\x9d" + "\xa6\x8c\xc6\xbc\x2c\xdf\xcf\x62\xec\xc2\x3d\x3e\x5b\x38\xcb\x34" + "\x77\x7a\x41\xb9\x10\xa7\xc5\x15\x49\xfe\xf5\x41\x65\xdf\x6b\xdf" + "\x21\xcf\xfe\x9e\x78\x97\x07\x7d\x62\xaa\xe9\x73\xde\x1a\xf0\x64" + "\x12\x8e\x8b\xf2\x40\xb7\xe3\x8a\x19\x77\xe0\x7e\x55\x34\x2b\x4e" + "\x8c\x31\xe3\x84\xb1\x45\x5c\x2f\x8e\xfd\x10\x2c\x6d\x06\xeb\x9b" + "\xe0\x62\x71\x8f\xfe\x6a\xdc\x23\x0c\xfb\x1d\x00\xd7\x16\xbb\x62" + "\x06\xea\xcf\x61\x10\x9f\x55\xc1\x55\x0d\x97\xf9\x4d\xec\x8f\xc8" + "\x21\xd3\xa4\xbe\x9a\xbe\xeb\x3a\x03\xe2\x9f\xdf\x3e\xe9\x89\x57" + "\x67\x18\xa1\xdd\xc1\x9f\xef\xa0\x98\xe1\xf7\x8c\x03\x61\xef\x53" + "\xa4\x71\x61\xcd\xec\x22\xbe\x67\x6f\x5c\xd0\xfb\x33\x0e\x81\x9e" + "\xc8\x16\xde\x15\xd4\x99\x33\xbf\x25\x61\xf8\xae\x0a\xe7\x50\xc0" + "\xb3\x2e\x45\x41\xad\x1d\x4e\x52\x84\xe3\x08\xd1\xc5\x93\xab\xce" + "\x3b\x38\x94\x0b\x1c\x8b\x81\xdf\x1e\x2d\x3a\x2f\x96\x5b\xda\x64" + "\xcf\x5a\x4d\x84\x33\x47\xf0\xdc\x22\x94\x97\xa2\x4c\x88\x05\xf1" + "\x8c\xa5\x94\x30\xd0\x57\x4f\xdd\x08\xff\x87\x63\x3e\xaa\xaa\x33" + "\xf3\x50\x06\xc8\x8d\x9e\xaa\xeb\x2a\x79\x53\x5d\x0c\x2d\x7f\xc3" + "\x41\xc7\x14\x97\xf2\x3b\x9a\x2c\x9d\xb9\x4f\x61\xfb\x85\x7d\x44" + "\x71\x2f\x22\xec\xeb\x70\x43\xcc\xdd\x58\xe9\x22\xf4\x71\x17\x39" + "\x94\x7a\x8e\x38\x46\xd2\x24\x87\xda\xa6\x75\xa8\x9b\x34\x6e\xb5" + "\x2d\x01\xae\x79\xc6\x14\x1c\x83\x7e\x7a\x52\xcf\x9e\x9a\xdf\xf6" + "\xbf\xa7\x26\x94\x39\x56\xda\x57\xd3\xbd\x36\xf8\x3d\x35\xdd\xdc" + "\xb1\xf4\xf2\xb4\x81\xf7\xd4\x04\x1f\xd3\x06\xfe\xa5\x59\xda\xff" + "\xc4\x2d\xcc\x69\x27\x2a\xb7\xba\xae\x54\xd8\x43\x25\xdd\x2c\xec" + "\x83\x82\xbe\x26\xda\x9a\xce\xdc\xa7\x7b\xf6\xbf\x45\xfd\xe9\xde" + "\x4a\x8d\x70\x25\x43\x3a\xe8\xce\xf9\x07\x24\xdd\x4a\x23\x4a\x6c" + "\xee\x51\xaf\xed\x16\xc6\xb0\xba\x0d\x8f\x62\x5e\xd0\x41\x68\x3f" + "\xc3\xdc\xdd\x86\x29\x70\x4d\x85\xeb\x11\xb7\xe9\xb0\xd9\x6d\xb2" + "\x39\xdc\xa6\x92\x23\x70\x35\xc3\xd5\x02\x97\x1d\xae\x56\xb8\xc0" + "\x27\x2a\x69\x87\x3b\xbe\xef\x80\xcb\x09\x97\xcb\x6d\xda\x4e\xe0" + "\x52\xba\x77\x34\xd9\xdc\x0a\x65\x34\x5c\x63\xe1\xd2\x41\x39\x7a" + "\xb7\xa9\x6e\x37\x5b\x3b\x3a\x53\x2b\xe1\xb4\xef\xbd\x5b\xc7\xb1" + "\x33\x14\x86\x7d\x4e\x23\xf1\x7c\xdf\x8c\x73\xb8\x9f\x5e\xe5\x21" + "\x7d\x47\x70\x67\x69\x28\x66\xc6\xf9\xc3\x35\x96\x0f\x3a\xa6\x3b" + "\xc8\xf2\x4a\xfd\xf6\x99\x68\x9b\x9a\x5d\xd1\xc5\xd9\xae\x1c\x92" + "\x0d\x7a\x4d\xd1\x98\xd8\x4a\xe2\x1d\x24\xab\xbe\xb5\x8b\x64\x25" + "\x51\xb7\xa0\x03\x32\xf0\xcc\x96\xf7\xda\x11\xe3\x6e\x9a\xa0\xeb" + "\x2e\x38\x6c\x71\xab\xac\x0e\xaa\xb2\xe9\x85\x3d\xfa\x40\x97\xe0" + "\x99\x65\x3d\x31\x28\x62\x0e\xe2\xd0\x86\xf6\x73\x64\x43\x12\xe5" + "\x1b\x20\xca\xc7\x7d\xf8\x22\x15\xe4\x57\x02\xf6\xc4\x38\xf4\xe9" + "\x16\x9a\x0d\x58\x1a\xe9\x06\xba\xf1\x18\x7f\x02\xee\x76\xa5\x91" + "\x18\x09\x7b\x60\xd3\x35\xd2\x39\x4f\x74\xf8\x4c\x7c\xa7\xc4\x73" + "\xa0\xca\x20\x0e\x2d\x4b\x23\x63\xcb\xe0\x9d\x70\x66\x27\xd4\x7b" + "\x96\x31\x92\xf2\xcb\xf5\xa4\xe2\x15\x12\xae\x3e\xc9\xce\x81\x75" + "\x03\xed\x3d\x67\x21\x6c\xd7\x3e\x73\x52\x47\x0e\xe9\x8f\x82\x6d" + "\xae\x02\xbe\x6c\xd7\x76\x83\xfd\x02\x5a\xba\x83\xa3\xe5\x33\xad" + "\x17\x8b\x96\xdd\xd1\xc5\x3a\x46\xcf\x44\x82\x34\xf3\xa5\x27\xd2" + "\x78\x7d\x2b\xd0\x13\xe8\x6a\x3d\xe2\x86\x58\x92\x2c\x94\xe8\xf9" + "\x36\xd0\x13\x68\xaa\x45\x9a\x02\x3d\x04\x9a\x52\x91\xa6\x15\x32" + "\x9a\x82\xee\x12\xf6\x33\x44\x9a\xf2\x40\xd3\x0a\x3f\x34\xed\x89" + "\xe7\x81\xa6\xbb\x02\xa2\x69\xe5\x20\x68\x1a\x3f\xd9\x1f\x4d\x5d" + "\xe8\x37\x14\x6e\xd7\x50\xd0\x8b\x56\xd7\x61\x61\x6f\x4e\xf0\xf9" + "\xe6\x81\xef\x9a\xc0\xab\xea\xb4\x78\xae\x37\x9e\x4d\x86\xe7\x8e" + "\x09\x7b\x49\x55\xd2\x0b\xee\xc2\x26\x23\xa6\x81\x5e\x33\x4c\xc4" + "\x39\x49\xa0\x5d\x2a\x38\x5a\xdd\x78\x1e\xfb\xc2\x9e\x5b\xdd\x85" + "\x3e\x75\x61\xd3\xfb\x3c\x35\x10\xd4\x29\xf3\xc7\x11\x65\x17\xe8" + "\x0d\x63\x1a\xb9\xb5\x08\x74\x61\x97\xc9\x36\xef\x84\x62\xb6\x6a" + "\x9a\x91\xa7\x70\x65\xe1\x1e\x93\x3c\xe8\x5c\xd0\xe5\x02\x7f\x91" + "\x67\x38\xc6\xd7\x30\x1f\xd7\xbc\xcc\x76\xd7\x25\xba\x48\x96\xa1" + "\x37\x7f\xf9\xac\x04\x9d\xbb\x60\x60\x39\xc1\xb3\x0f\x33\xda\x90" + "\xaf\x55\xc4\xda\xea\x91\x13\x5e\xd4\xd1\xc8\x0b\x94\x0b\x94\x91" + "\x6d\x32\xdd\x0c\x7a\x5f\x53\x2e\x9e\x05\xe2\xce\x01\xdd\x8c\x7b" + "\xce\x03\x2f\xf1\x8c\x90\x3e\xe5\x63\x03\xc8\xc7\x7a\xe1\x9c\x26" + "\x2d\xd0\xa3\xaa\xab\x93\xf1\x10\x79\x66\x75\x59\x04\xfe\x15\x89" + "\xb6\x80\xd1\xdd\x76\x27\xa5\x09\xe0\xcf\x4d\xac\xe4\x0b\x9b\x12" + "\x69\xa7\x61\x14\x9e\xd5\x05\x31\x7f\x4c\x64\x12\xf8\x4f\xa7\xc1" + "\x56\xac\x04\x7c\x9d\x22\x63\x77\xad\x04\x9f\xa8\x13\xcf\x5b\x83" + "\xfa\xac\x63\xe7\xd4\xf2\xb9\x33\x8b\xe0\x9d\xb0\x67\x26\x2f\xed" + "\x99\x79\x56\x8f\xfd\x10\x9e\xfe\xa1\x55\x7a\xae\xe7\x9b\x05\xc3" + "\x62\xdd\xaa\x89\x95\x6c\x8d\xeb\xb3\x6c\x4f\xf2\xf0\xaf\xab\x91" + "\xae\xed\x8a\x67\xd9\xbc\xa7\xbc\xf6\x03\xc6\x4c\x9c\x7b\xf4\xec" + "\xbb\x34\xbf\xa3\xca\x88\x67\x6e\x4b\xef\xb2\x12\x90\x0e\xc6\xbb" + "\xb3\x49\xb6\xdb\x34\xd1\x82\x67\xb1\xe3\x5c\x88\xe0\xb0\xf8\xec" + "\x41\x2c\xcb\x5d\x30\xec\x49\xa0\x53\x2c\x5f\x38\x6c\x26\xe8\x94" + "\x18\xba\x1c\xda\xfa\x0a\xb4\xf5\x04\xd0\xf5\x04\xb4\x75\xad\xd8" + "\x56\xf1\x0c\x3a\x1e\xe8\x0f\xef\xfa\xb6\x8d\x52\x5b\x97\x03\xbd" + "\xf3\x5a\xf3\x36\x9e\x24\xdf\xa3\xe0\x8f\x37\xb4\x0b\xeb\x8b\x3a" + "\xad\xae\xa3\x04\xbf\x2b\xd8\xee\x82\x92\xb6\xb9\x80\x47\xa4\x39" + "\xf8\x0b\xb3\x69\x44\x5d\xac\xc4\x07\xac\x0f\xed\x36\x8c\xaa\x58" + "\x09\xf5\x41\xda\x9f\x22\x13\x50\x9e\x81\xf6\x63\x2b\x90\xfe\xde" + "\xe7\x40\x47\x09\x3c\x18\x0e\x3c\x58\x29\xf2\xc0\x24\xf2\x00\xfc" + "\x65\xb0\xc3\xe1\x10\x37\x6a\x2b\x72\x18\x0f\x82\xa3\xd1\x73\x6d" + "\x43\x2c\xaf\xa9\xfe\xe5\xf5\xe7\x77\x74\xb1\x18\x59\x81\x7b\x77" + "\x42\x8c\xf0\x27\xbe\x1b\xe4\xb6\x50\x94\x5b\x6a\x78\x44\x92\xd9" + "\xe3\x8a\x9f\xfd\x3d\x30\x99\x9d\xf3\x87\xff\xa3\x32\x1b\x75\x71" + "\x65\x76\xee\x3a\x6f\x99\x9d\xbb\xcf\x5b\x66\xe7\x2e\xf4\xc8\xac" + "\xf8\x6e\x48\x64\x76\x6e\xfa\xe5\x91\xd9\xb9\xe9\x7d\xc8\xec\x9c" + "\x00\x64\x56\xeb\x47\x66\xb5\x17\x4f\x66\x7f\x5e\x76\xe9\x6c\xec" + "\xf3\x47\xbb\xb8\x3e\x6c\xec\x06\x99\x8d\x55\xa3\x8d\xfd\x85\xb1" + "\x2f\x79\xed\x2e\x03\x79\x55\x89\xf2\xfa\xc2\x5f\xa0\xbc\x84\x65" + "\x87\x5b\x06\x96\x57\x57\x99\xc7\x7f\xf2\x2b\xb3\x06\x94\xd9\x4a" + "\x62\xb5\x0b\x32\xbb\x50\x92\xd9\x32\x31\x16\xea\x47\x6e\xa3\xfc" + "\xc9\x2d\x9e\xcb\x85\x67\x72\xf5\x2b\xb7\xa2\xbf\xd4\x3d\x06\xe5" + "\xd6\x7c\x85\xd9\xda\xe7\xef\xf1\x96\xdb\xe7\x93\xbc\xe5\xf6\xf9" + "\x1b\x3d\x72\x2b\xbe\x1b\x12\xb9\x7d\x3e\xe6\xf2\xc8\xed\xf3\x31" + "\xdf\x1d\x5b\xfb\xc2\x9c\x4b\x67\x6b\x5f\xda\x21\xc8\xad\x3f\x5b" + "\x9b\x25\xda\x5a\x35\xda\xda\x17\xef\x0a\x4c\x76\xe7\xdd\xf1\x7f" + "\x5c\x76\x2f\xb2\xcd\x9d\x77\xd2\x5b\x76\x5f\xd2\x79\xcb\xee\xbc" + "\x4f\x3c\xb2\x2b\xbe\x1b\x12\xd9\x9d\xd7\x7e\x79\x64\x77\x5e\xfb" + "\x77\xc7\xe6\xce\xf7\x3b\x57\x4e\x77\x0b\xc9\x3e\xa6\x98\xbf\xcc" + "\x5a\x26\xcc\xe3\x03\x5c\x3d\x24\xce\xf3\x9e\xff\x86\x55\x3b\x99" + "\xf0\xf9\xb4\x19\xcf\xa6\xc0\x79\x2f\x6f\xca\xe6\x95\xb0\x79\x10" + "\xf3\xff\x20\xcd\x8b\xd9\x25\x9e\x5f\xd1\xdf\xbc\x18\x9a\x47\x93" + "\xc5\xdf\x89\xeb\xa9\xa9\x51\x7a\x66\x7b\x67\xcd\x77\xd0\xad\xd4" + "\xe0\x18\x49\x0d\xfe\xc6\x8a\x22\x36\x51\x8a\xe7\x3e\x9d\xbd\xa5" + "\x78\xf7\xd9\x7c\x42\x8a\x84\x71\x98\x05\x7a\xf8\xed\x6c\x36\x1f" + "\x62\x7a\xd1\xd9\x9c\xd9\x04\xd2\xa6\x48\x69\xc2\x59\xd8\x39\x61" + "\x94\x87\x77\xa0\x43\x32\x76\x65\x92\x70\xdc\x8f\xf4\xee\xf3\x88" + "\xc5\x05\x33\x41\x47\xe0\xbe\x48\x1d\x78\x5e\x07\xfd\xc1\xcd\x1d" + "\x15\x67\x88\xb2\x71\x8b\xd0\xf7\x8c\xf3\x69\x76\x17\x22\xfe\xc3" + "\xc6\x97\x52\x4e\x49\xf8\xf2\xe2\x3c\xaa\xb6\x25\x0a\xf3\x77\x01" + "\x2b\xd2\x1c\x1b\x3c\x77\x8d\x1f\x53\xac\x97\xf6\xc3\xa4\x50\xbf" + "\xbf\x66\x3a\x38\x3c\xb3\xbc\x22\x85\x68\xe0\x52\x51\x93\x2d\x11" + "\xea\x75\x44\xea\x4b\xf4\x3b\x17\x1b\xcf\xf3\xbd\x59\xab\x14\xe7" + "\xf3\xe0\xba\x5e\xa1\xdf\x6c\x1b\xc7\xe7\xb9\x21\x9d\xe6\x64\x09" + "\xe7\x77\x45\x02\x2d\x70\xfe\x2c\x9e\xab\xc4\x57\x14\xef\xde\x7c" + "\x13\x21\xef\xad\x6f\xe3\x70\xee\x86\x7b\xfb\xcd\x1d\xe6\xcc\x7b" + "\x85\x73\xad\x71\x5f\xf1\xe3\x8a\xc4\xa6\xf8\x6f\xd8\xd9\xbd\xf0" + "\xff\x51\x1c\x7f\x79\x06\x9e\x71\x2c\x9f\x3f\xab\x55\x62\x5e\x48" + "\xdf\x6a\x4e\xfb\x8c\x44\x1a\x49\x78\x21\xb4\x4d\xcc\x9b\xd0\x21" + "\xec\x75\x93\x28\x9c\xe1\x03\xcf\xc9\x38\x66\x00\xbf\x0b\xc7\x39" + "\x4b\xb4\xac\x38\x4f\xd0\x0f\x05\xb6\x44\x68\x7f\x9e\x30\xf7\x14" + "\xda\xb9\x0d\xda\x0c\x79\x54\x38\x3f\x47\xb8\x67\x12\xcd\x5b\x29" + "\xb8\xbf\x6a\x62\x0b\xdc\x55\xe6\x95\x38\xb7\x24\x31\x0e\xcb\xf6" + "\x3f\xc7\xdf\x96\x48\x73\x94\x84\xad\x15\x52\x34\x1d\x53\x2c\xcc" + "\x88\x54\x50\x0a\xdf\xd4\x6f\xc6\x3e\x6e\x9c\x57\x2d\xcc\x15\x5f" + "\x38\x17\xca\x57\xee\x12\xfa\x70\x17\x4e\xb2\x2b\x16\xd8\x7b\xe6" + "\xe4\x0b\xe3\x4d\x0b\x0b\xf0\x3b\xf8\x1b\x31\x3f\x5b\xcf\x03\x75" + "\xd6\x65\x86\x51\x78\x5e\xc3\xe6\x5e\x87\xff\x11\x7e\x9f\xea\x99" + "\x73\x26\xfc\x0e\xb0\xb4\x10\xfb\x7f\x85\x73\x94\xf0\xd9\xef\xbc" + "\x66\x91\x6f\x0d\x5a\xc0\x86\x2f\xef\x24\x8c\x00\x2e\x24\x8c\x60" + "\x7d\xdf\xcf\xb4\x73\x6c\x7c\x63\x11\xdb\x5b\x12\x78\xe8\x7e\x5b" + "\xab\x14\xf6\x1d\xef\x46\xbe\xe0\xfc\xf8\x45\x0d\xc8\x97\x6d\x60" + "\x0b\x58\xde\x85\x0e\x4f\xfd\x85\xdf\x0a\xfc\xe4\x81\x17\x6c\x9e" + "\xfe\xa2\x5f\x09\x67\xd8\x80\xce\xc0\x39\xe2\x07\x21\x2a\xa1\x88" + "\x5b\xc0\xc8\x7b\x29\x4e\xae\x22\x8d\xa5\xff\xf5\x8c\x93\xc3\x79" + "\x1f\xd8\x17\x6e\x7a\x85\x28\xb1\x4f\x1d\xcb\xa4\xd1\xc5\xfa\x89" + "\x12\x1f\xd7\x03\xef\xd2\x00\xbb\x40\xf3\x6d\x40\xbf\x8a\x2e\x61" + "\xbc\x4a\x5f\xc1\x13\x15\x0f\xf9\xec\x8a\x45\x2d\x50\x9e\xa6\xfc" + "\x06\xea\xc0\x79\xd9\x40\xc3\xff\xea\xcc\x5d\x54\x2d\xd1\x10\xeb" + "\x84\xf3\xaa\x4d\xc2\xfc\xfa\x45\x93\x18\x86\x16\x29\xa5\x36\xfb" + "\xa3\xa7\xe9\x3d\x12\x6d\xba\x9b\x4c\xe6\x55\xe3\x2a\x69\xd8\xcd" + "\xbb\xb1\xbf\x79\x16\x68\x0d\xdc\x67\x3f\xfe\xb5\xcf\xa9\xd5\xe1" + "\x26\xbc\x7a\x5c\x25\x8e\x4d\xb8\x37\x8f\x1f\x1d\xbf\x0e\xd7\x43" + "\x1c\xb6\x64\x39\x89\xc6\x9a\xe9\x60\x67\xad\x91\x6f\x89\xfb\x55" + "\xd0\xe1\xa0\xd7\xc1\xa6\x2a\xb3\xbe\x25\x37\x22\xbd\x78\xf5\x61" + "\xcb\x71\xc5\x62\xd3\xdc\x54\x92\x1d\x9c\x1e\x5d\x2c\xac\xad\x42" + "\xff\x02\x74\x3e\x87\xf3\xe9\xac\x0e\xf0\x4f\x4c\x87\x2d\x41\x96" + "\xb3\xdb\x9f\x8e\xc4\x76\xf3\xd8\x0f\x2d\xb6\x39\x1e\xdb\xdc\xe1" + "\x24\xd8\x97\x3f\x6b\x35\xee\x67\x7a\x8e\xf0\xa6\x71\x95\xd8\x66" + "\xf0\x75\xe2\x82\xef\xd3\x4f\x8a\xee\xef\xdb\x14\xe8\xcd\x6f\xbe" + "\x79\x37\xaf\xb2\xc5\xe1\xb7\xb1\x0e\xb8\xbe\x66\xd6\x39\x22\xd0" + "\x1d\xe9\x6f\x75\xba\x09\x55\xcb\xeb\xe0\x0a\xb6\x0e\xfe\xdb\x7f" + "\x37\x89\x2e\x78\x8f\xf1\xdd\xbd\x59\xa4\x81\x01\xc7\xc8\x6c\x71" + "\xb8\xcf\xfe\x2c\xac\x83\xe3\x24\x79\xe6\x24\x11\xf8\x6f\xd5\xb7" + "\x13\x77\xd8\xf8\xd1\x38\xa7\x02\xf9\x9f\xe9\x02\xfe\x9f\x77\xe2" + "\x1e\x24\x0e\x6b\xf6\x05\x82\xfe\x8b\xeb\xac\x9e\xeb\xcd\xff\x25" + "\x26\x88\xd6\x83\xe4\xff\x92\x21\xe2\xff\x92\x2b\xa0\xfd\x4b\x43" + "\x68\xff\xd2\x21\x6a\xff\xd2\x2b\xa0\xfd\x2f\x87\xd0\xfe\x97\x87" + "\xa8\xfd\x2f\xfb\x6d\xff\x13\x37\xf2\x54\x98\x6b\x13\x51\x13\x83" + "\x36\x80\xd9\x2b\xc3\x6b\x38\x97\x46\x58\x4f\x25\x3e\x13\xb6\xbe" + "\x2a\xdc\xe7\x59\xe5\xf3\xac\xf1\x79\x8e\xf2\x79\xd6\xfa\x3c\x47" + "\x4b\xcf\x60\x47\x86\x9d\x52\xbc\x7c\x0e\xfc\xd2\x6c\xbb\xc2\x50" + "\x24\xbe\x1f\x8b\x7b\xf4\x80\x4d\x1f\xeb\xef\xbc\x3f\xb5\x82\xd0" + "\x6e\x8e\x12\xe1\x1c\x3e\xc5\x32\x65\x57\x0e\xa1\x34\xec\x26\x3d" + "\x9e\x95\xc6\x17\x94\x74\xcc\x02\x3d\x6d\x75\x38\xc1\xcf\xd7\x0e" + "\x87\xb2\x7f\x80\x67\x40\x22\x5f\x75\x29\x38\xb7\xc6\xf0\x2d\xb6" + "\xf3\x6e\xa3\x99\xf0\x61\xe3\x85\xb9\x0d\xbc\xa9\xa4\xc3\x11\x36" + "\xfe\x26\xba\xa3\xc9\x66\xca\xe1\xc3\xad\xed\x47\x48\x21\xc7\xeb" + "\x32\x32\x80\xbf\xed\xfb\xc9\x86\x76\xda\x96\xe1\xa2\x4e\xeb\x3c" + "\x33\xc9\x72\xe0\x19\x2a\x16\xd2\xe8\x38\x22\x9c\xa3\x22\x9c\x17" + "\xe3\xd8\x4f\xd0\xff\xc9\xc2\x3c\x90\xd6\xe8\xd8\x47\x1a\xe0\xd9" + "\xbc\xf2\x2b\x68\xe7\xb2\x5f\x59\xdb\xf7\x41\xbc\x54\xe2\xe0\x55" + "\x25\x47\xa8\xaa\xa4\xb9\xa1\x1d\xcf\x89\x2d\x69\xc1\xba\x36\x42" + "\x3d\xac\xae\x6a\xe0\x6f\x49\x8b\x50\x6e\x87\x4d\x88\x49\x71\xcc" + "\x96\x57\x43\x7e\x75\x49\x33\xd6\x0f\xeb\xd6\xf7\x38\x6c\x4d\x12" + "\xd4\xfd\xa1\xb9\x7a\x25\xc1\x35\x10\xc1\x61\x64\xd9\x41\xbf\x7e" + "\x74\x41\x4d\x2b\x2b\x37\x3c\x84\x72\x5f\xf1\xab\xff\x69\x81\x45" + "\xac\xaf\x26\x94\x72\x53\xfb\x29\x57\xac\xaf\x2e\x94\x72\xeb\xfd" + "\x97\x5b\x2b\xd6\x37\x36\x84\x72\x97\x8f\xed\xa7\x5c\xb1\xbe\xd9" + "\xa1\x94\xeb\x77\x0d\x21\xe2\x21\x34\x2c\x2c\xf7\xbf\xff\x03\x60" + "\x21\x34\x1c\x24\xf7\xd3\x7e\x4b\x52\x68\x18\x48\x4e\xef\x0f\x03" + "\xa1\xf1\x3f\xb9\x5f\xfe\x87\xc6\xfb\x15\xba\xfe\x78\x1f\x1a\xdf" + "\x57\xf8\xc5\x3f\xc6\x06\xc0\x27\x1d\x8d\x68\x32\xf3\x85\xdb\x75" + "\x7c\x44\xcd\xed\x9b\xf9\x58\xf2\xc4\x46\x42\x22\x4b\xc9\xf5\x4f" + "\x94\x7f\x4e\x63\x85\x98\x7b\xa5\x6a\x63\x19\xe1\x20\x86\xe6\xde" + "\x5d\xdf\xcc\x59\x5d\x93\x51\x6f\xb9\xf7\xa4\x39\x15\x3f\x84\xf4" + "\xbf\x83\x1d\xec\x00\x5f\x96\x95\xb5\x5d\x57\x98\x19\x4b\x84\xf5" + "\x71\x10\x47\xcc\x5a\xfd\x39\xc5\x75\xc7\xf1\xdf\x82\x7e\x2d\xc5" + "\xfd\x12\xc9\xf5\xf0\x5b\x17\xe0\x18\xca\x71\x92\xf7\x79\x87\x62" + "\x96\x43\xc8\xeb\x10\xe6\xa7\x17\xd6\xdc\x8e\xb1\x02\xcd\xd2\xe3" + "\xde\x67\x0e\xf8\xf6\xc6\x30\x07\xe1\x2a\x84\xf3\x7b\x56\xa6\xdb" + "\x15\xab\x0c\xe2\x1a\xd3\x76\x61\x8f\x3e\xa8\x3b\xee\xd1\xb7\x19" + "\xe2\x06\xcc\x7f\xb7\x91\x70\x1f\x09\x7b\x1a\xaf\xdc\x83\xfb\xf6" + "\xf5\xb7\x56\xdb\x5d\x60\x53\xe2\xef\x69\x01\xd8\xe7\x93\xb8\x9e" + "\xdc\x41\x20\xc6\xc8\x2e\x84\xf8\x64\xda\x38\xec\x4f\x39\x43\x32" + "\x37\x52\x1e\xfb\xb6\xa8\xea\x70\x35\xce\x3d\x64\x7b\xca\xaf\x8a" + "\xc5\x58\x5f\x3c\xb7\xe9\xa6\x13\xf0\x2c\xc4\x48\x38\x07\x47\x55" + "\x52\x49\x0b\xd5\xb1\x8d\x1d\x67\x08\xdb\x17\x7d\xd5\x63\xb8\x7f" + "\xda\x59\x95\x8d\x74\xa8\x6c\xe1\x9d\xb9\xab\xa6\x48\x6d\xc0\xef" + "\x4b\xe9\x18\x13\x62\x3e\x78\x3f\x4f\x5a\xbb\xed\xe7\x6c\xe3\xd1" + "\xf1\x5a\xea\x40\xfa\xb2\xba\x18\xff\x8e\x3c\xa0\x05\x56\x67\x47" + "\x96\xfe\x16\xd6\x47\xb2\xaa\x0d\x63\x6d\xb0\x17\xad\x2c\xee\x2d" + "\x69\x15\xce\x1d\x01\x7b\x30\x57\xcf\x05\xe9\x13\xaf\x12\xf6\xa4" + "\x32\xdf\x82\xf6\xd7\xb8\x17\xca\x7f\xf8\x98\xc2\xa8\x62\x71\x5e" + "\x89\x93\xad\xbf\x5c\x55\x09\xdf\x70\xc2\xf3\x6e\xcc\x07\xef\x27" + "\xb0\xf7\xdb\x89\xe7\xfd\x76\xf4\x95\xb4\xe2\xfb\x99\xe2\x7b\xa5" + "\xec\xbd\xd2\x78\x0b\xf6\x7b\x18\x53\xb1\x0d\x40\x47\x3b\x94\xd7" + "\x21\xec\xb3\x20\x9c\x29\x59\x62\x17\xbf\xd3\xd1\xae\x30\x9a\xce" + "\x02\xc6\xe0\xbd\x4b\xf6\x7d\xd7\x47\xe9\x31\xe4\x89\x72\xa4\xa1" + "\x71\xb7\x9d\x3b\x2c\xae\xcd\x5e\xb5\x4f\x68\x3b\xd8\x50\x79\x79" + "\x76\x85\x31\x19\xed\x64\x07\xf8\x68\x90\xe7\x2d\xfc\xa6\x9c\xde" + "\xd2\x2a\x50\x5d\xd2\x8a\x85\xba\xc5\xab\xd6\xac\xc4\x55\x7c\xde" + "\xeb\xd3\x34\xb8\xce\x95\x2f\xa8\x6b\xb3\x96\xe2\xba\x3b\x8d\xb0" + "\xc6\xfb\x2d\xe0\xa3\xab\xb0\x49\xe7\x8e\xb0\x55\xb9\x0b\x0f\xdb" + "\xb2\xce\x11\x2e\x53\x4b\xbf\x30\xaf\x7f\x9c\x9c\x52\xac\x7e\x50" + "\x38\xab\x52\x27\xec\xcb\xdf\x61\x5e\xff\x0f\x4c\x13\xf6\x47\xb4" + "\x26\xb2\xb4\x3f\x65\x5a\xb8\xbf\x65\x36\x73\xf5\x89\x67\xc8\x47" + "\x5a\x07\x39\xa8\x3b\x83\x7b\xd3\x76\xfc\x89\xb7\x71\x38\x37\x17" + "\xf2\xff\x0a\xbf\x85\xfd\x07\xf8\x3f\xeb\x0b\x59\x7d\x07\x7e\x07" + "\xe7\x2d\xb6\x2b\x56\x8f\xc3\xef\xd9\x15\xab\xf5\x61\x65\xc2\x5c" + "\x6e\x15\xe4\xfb\x8a\x37\xd5\xb5\x09\xf2\x9e\x6b\x6c\x76\x71\xaa" + "\x6e\x71\x5d\x1f\x29\x1b\x8d\x73\x74\x57\xdb\x64\xeb\xdc\x54\x67" + "\x39\xf2\x28\xa4\xb5\x4a\xfb\x66\xe0\xf9\x45\xfe\xf4\xc7\x05\x88" + "\x93\x2f\x94\x15\x87\xf3\xaa\x3a\xa0\x6f\x5d\x9b\xc5\x42\xb0\x9f" + "\x46\x81\xf3\x8c\xdb\x15\xaf\x1e\xa4\xea\xba\xe6\x4c\x94\x53\xa0" + "\xc5\xef\x71\x0e\x61\x44\x93\x6e\x1f\xce\x19\x2c\xb4\x55\xfd\x2e" + "\xcd\xc9\x1d\xae\xaf\x26\xba\x9f\xa3\x8f\x95\x32\xf7\xe9\x24\xea" + "\x1a\x7f\xc4\x4c\xea\x5b\xff\x48\xea\x5a\x2c\x44\x35\x8f\x84\x65" + "\xd9\xa9\x5b\xe8\x4b\x48\x25\x5c\xbc\x9d\x84\xe1\x9e\x4e\xb8\x8f" + "\x3b\x9e\xd9\xde\xe8\x6c\x00\xbf\xe7\xbd\xf6\x77\x33\xdb\x86\xe9" + "\x9e\x23\xe0\x2f\xb1\x31\x69\x61\x0d\x90\x43\x58\x97\xad\xc6\xfe" + "\x71\xd9\xda\x9f\xfa\x8d\x27\x49\x78\x83\xe1\x28\xc9\x48\xa4\x3c" + "\xce\xf1\x8b\x4f\x0c\xa3\xc2\xfa\x9f\x74\xc8\x6c\x04\x9e\xae\xd5" + "\x47\xec\x4c\x23\x51\x8d\xa9\x76\x62\x6d\xb3\x90\xb7\x53\x48\x14" + "\xed\x34\x8c\xac\xaf\x3f\x4c\x68\xe1\x9d\xbb\xdf\xcf\x34\x0f\x93" + "\xe6\x63\x45\x6e\x52\x20\x7e\x23\x0a\x70\x5e\xd6\x79\x12\xb3\xe0" + "\xab\x6c\xa1\x0f\x17\xfb\xcb\x5d\x9d\x7a\x5d\x77\xa7\xfe\xf6\xae" + "\x4e\xfd\x2d\x52\x3f\xfb\x4b\xcb\x34\xa4\x1c\xd7\x0d\xe5\x26\x25" + "\xe1\xba\x21\xf4\x2f\x5d\xea\x89\x95\xd8\xa7\x2e\xec\x51\xb3\x56" + "\x1f\xcd\x2f\xd6\x93\x89\x0e\x61\x5d\x12\xf6\xf3\x6b\x2a\x16\x41" + "\x7d\xdb\xcf\x10\xf9\xdc\xa2\x0b\x6b\xf5\x1c\xce\x2b\xa2\xb9\xab" + "\x5d\x5d\xe5\xc5\xe1\x38\xbf\x08\xec\xc2\xe4\xe0\x65\xfb\x55\xc1" + "\x7f\xc6\xf6\x53\xc0\xec\xbe\x33\xc8\x1f\xe0\xd3\x19\x07\x87\xbc" + "\x68\x48\x42\x3e\xd8\xbc\xf8\x20\xf0\x2d\xc5\xc9\x21\x3f\x90\x17" + "\xc8\x13\x0f\x3f\x3e\x11\xf8\xb1\x8f\x67\xfc\xe8\x02\x7b\x20\xf1" + "\xe4\x42\x74\xb1\xb6\x3f\xbe\x20\x3f\x90\x37\xf5\xad\x47\x89\x17" + "\x4f\x1c\x8c\x27\x40\xcf\xd1\x12\x5f\x90\x27\xd6\x76\xf0\x79\x81" + "\x2f\x4f\x7d\x42\xc8\xd3\xe3\x28\xdf\x30\xf3\xe3\x1e\xfe\xb8\xfc" + "\xf1\xe7\x1b\x0f\x7f\x80\xf7\xbd\xf9\x73\x52\x83\xe3\x3e\xc8\x9f" + "\xb6\x60\xf8\x53\xdf\xca\xf8\xe3\x12\xf9\x33\x2e\x8e\x70\xce\x4e" + "\x3d\xb7\x23\x8d\x4c\x9e\xf9\x95\x8e\x1c\x4a\x68\x20\x40\xeb\x02" + "\xde\x64\x75\x86\x26\x47\x6b\x55\x81\xcb\xd1\x9a\xf2\x6b\x72\x14" + "\xac\x1c\xad\x79\x72\x70\x72\x94\xd6\x7c\x4d\x8e\x2e\x95\x1c\xa5" + "\x1d\xf1\x95\xa3\x1e\x5b\x9d\xb2\x64\xc5\xc2\x65\x2b\x97\xad\x7c" + "\x59\xb7\x68\x5d\xea\x92\x57\x99\xc5\xf6\xb2\xd9\x5a\x77\x66\x2c" + "\x87\xe7\xae\xd7\x97\xda\xc8\xfb\x37\xd9\x38\xf7\xd7\x5a\x25\x2d" + "\x98\xe6\xe0\x0b\xa6\x1b\xf1\x0c\x76\x94\x37\x3c\x9b\xfd\xb8\x62" + "\xe3\x64\xdc\x8f\x90\xed\xa3\xb2\x51\x98\x7f\x09\xbe\x61\x29\x8e" + "\xbf\x6c\x5e\x4f\x94\x9b\x71\x5d\xb4\x13\xfb\x39\xf0\x7d\xc6\xaf" + "\x70\xef\x34\x5a\x5e\x5c\x8a\x7b\xd9\x74\xa8\x4a\x76\x6f\x81\xb2" + "\x1c\xea\xba\x36\xa5\x0e\xd7\x91\xac\x8b\x01\x7f\xc3\xe1\xd9\x1f" + "\x29\x23\x89\x0e\x4f\xdf\x82\x72\x8e\x6b\xfa\x4e\x29\xd6\x2d\xb9" + "\x80\xfb\xc7\x83\xff\x3a\x77\x1c\x7c\x67\x4c\xb1\x56\xd8\x77\x01" + "\x64\x9e\xbd\xdf\x30\x12\xbf\xdf\xad\x3a\x6c\x13\xce\xae\x57\x35" + "\xe9\xce\x16\xd8\xaa\x0e\x67\x54\x11\xdd\x73\x28\xf3\xeb\xde\x78" + "\xaa\x14\x64\x7e\xb6\x99\x34\x68\x7f\x47\xea\x12\x00\x6b\x09\x03" + "\xc9\xbc\x0c\x63\xb7\x04\x26\xf3\x12\xb6\x10\x53\x88\x2d\xc4\xd5" + "\x75\x80\x2b\xc4\x9a\x84\xad\x37\xcf\x33\x6c\x45\xb6\x10\xcd\xce" + "\x33\x80\x2f\x17\xc3\x17\xae\x73\x6e\x48\xff\xd8\xbf\xec\x9f\xf7" + "\xc1\x16\x27\x62\x6b\x2d\x60\x6b\xad\x07\x5b\x2f\x1e\xd5\x90\xb7" + "\x05\x6c\x2d\xf6\x60\xcb\x34\xb1\x52\xc2\x15\x62\x0c\xf1\xc4\xbf" + "\xac\x27\x28\xef\x12\xc6\x2a\x96\xb2\xf1\x53\x41\xf6\x39\x90\xfd" + "\x4e\x99\x0d\x1d\x33\x18\xd9\x5f\x2f\xec\xff\x80\x3c\x41\xfe\x20" + "\x5f\x90\x17\x57\x23\x1f\xf0\x7c\x6a\xda\xd9\x17\x2f\x16\x39\x06" + "\xe2\x05\xf2\x01\xf9\x21\xf0\x01\xf8\x21\x8d\x65\xe3\xd8\x26\xf2" + "\x04\x79\x71\x77\x06\xe1\x90\x2f\x15\x20\xef\x28\xe3\x40\x5b\x1b" + "\xf2\x45\xf0\x5b\x73\xd4\xd5\x6f\x8d\xf6\x9c\x5b\xd3\x99\x9b\xb1" + "\xa5\xb7\xcf\x9a\x51\xea\xd9\xeb\x6d\xdd\x14\x16\x63\xd4\x95\xb2" + "\xb1\xa8\x8d\xdf\x88\x32\x9c\x8d\xf1\x9e\x10\xdb\xb9\x21\xb6\x53" + "\x41\x6c\x57\x00\xb1\x1d\xf6\xbd\x09\x7b\x10\x64\x7c\xc5\xc6\xc5" + "\x20\x96\x53\x1f\xae\x86\xb8\xa2\x12\x69\x26\x8c\xc1\xaa\x6d\xc2" + "\x9e\x3f\xd4\x04\x71\xe3\xaf\x39\x02\xcf\x80\x1b\x77\x90\x78\xd9" + "\xa8\x14\xc7\x98\x0d\x6c\x8f\xc0\x8d\x47\x58\xfd\xd2\x85\x79\x0a" + "\xc2\xf8\x1c\xc7\xef\x76\x6f\xf6\x1e\x9f\x93\x8f\xdf\xbe\x9f\xe9" + "\x10\xc7\xe6\x36\xb2\xfd\x18\x71\x4d\x08\xe8\xb1\x77\x33\x6d\x9c" + "\x67\x7c\xee\x63\x7c\xff\xa1\xf7\xf8\xdc\x46\xc1\xdf\x83\x3a\xb4" + "\xe1\x9c\x14\x78\xde\xc3\xd2\xd3\xdb\xe5\xe9\x9e\xf1\x6f\x96\x8e" + "\x6b\xa0\xc4\xf8\xba\x9d\xc5\xd6\x99\x44\x8a\x61\xfd\xf8\x33\x41" + "\xe8\xd9\x9c\xfd\x1e\x3d\x9b\x23\xc4\x9a\x54\xdb\x64\x69\xe8\xa5" + "\x67\x71\x6f\xab\x9c\x31\xb3\x50\xcf\x16\x1c\x36\xb3\xfa\x65\x9a" + "\x80\x26\x61\x78\xde\x1c\xa6\xe3\x5a\x21\xd4\xb9\xe5\x82\x0e\x6e" + "\xaa\xde\x22\x8c\xc1\x67\xee\xf3\xd6\xbd\x9b\xec\xde\xba\x37\xf3" + "\x8b\xfe\x75\x6f\xf6\x6b\xfd\xeb\xde\x2c\xf5\x35\xdd\x1b\xaa\xee" + "\x05\xbf\x6b\x50\xba\x37\x7b\xf6\x35\xdd\x7b\xb1\x74\x6f\xf6\x4c" + "\x99\xee\x7d\xc7\x5b\xf7\xe6\x90\xde\xba\x37\x27\xca\xa3\x7b\x33" + "\xab\xbd\x75\xef\xe6\x25\x81\xe9\xde\x9c\x85\x17\x57\xf7\xe6\x64" + "\x7b\xeb\xde\xcd\xb3\x45\x3d\x32\x37\x78\xdd\xbb\xf9\x9e\xfe\x75" + "\xef\xe6\x07\xbd\x75\xef\x66\x15\xd3\xb1\x9b\x93\x98\xee\xdd\xac" + "\x63\xe9\x99\x73\xe4\xe9\x1e\xdd\xcb\xd2\x7b\xeb\xde\xcd\x19\x03" + "\xe8\x5e\xbd\x9b\x97\x74\x6f\x33\xe8\xde\x66\x8e\x7f\xd9\x9f\xee" + "\xcd\xcb\x6b\x40\xdd\x9b\x82\xba\x37\x2f\xaf\x7f\xdd\xfb\x6f\xdf" + "\xa2\x8e\x15\xf6\xaa\x2c\xa1\xad\xc2\x5e\x81\x25\xb4\x0d\xf1\x38" + "\x2b\x03\xd2\x21\x0d\xf7\x54\xc4\x7c\x8c\xf7\x92\x8e\xde\x72\x4f" + "\x8f\x8e\x86\x7c\xfc\x8d\x1e\x1d\x8d\xfa\x19\xf5\x74\x79\x09\xb5" + "\x57\x94\xe0\x19\x20\x5b\x12\x24\x5d\x6d\x82\x34\x3c\xe7\x03\xf7" + "\x03\xc2\xf9\x88\x40\x83\xd6\xcd\xf0\x3d\xcc\x0f\xf9\xb2\xbd\x75" + "\xfa\xbf\xed\xf7\xd6\xe9\x5b\x3e\xe8\x5f\xa7\xe7\x3e\xdf\xbf\x4e" + "\xdf\xf2\xc5\x35\x9d\x7e\xb9\x74\x7a\xee\xd8\x6b\x3a\x7d\x60\x9d" + "\xde\x17\x2f\x7c\x75\xfa\x5d\xa2\x4e\x2f\xef\xd1\xe9\xb9\x3a\xff" + "\x3a\xfd\xdf\x8e\xf4\xd6\xe9\xff\xd6\xe6\xd1\xe9\x5b\x0a\xbc\x75" + "\xfa\xd6\x07\x03\xd3\xe9\x79\xf7\x5f\x5c\x9d\x9e\x37\xc7\x5b\xa7" + "\x6f\x1d\x2b\xda\x9c\x26\xb9\x4e\xe7\xc3\x02\xd1\xe9\x5b\x87\x49" + "\x3a\x1d\x75\xe6\xbb\x7c\xb3\x4c\xa7\xa3\x6e\xdb\xaa\x36\xa7\x1d" + "\x93\xe9\xf4\x3c\x3b\xd3\xdd\x5b\x27\xbb\x05\x9d\x9e\x27\xee\xe5" + "\xb5\xd9\x26\x4f\xf7\xe8\x74\x96\xee\x96\xeb\xf4\x36\xd4\xe9\x5b" + "\x67\x0f\xa0\xd3\x63\x02\xd7\xe9\x85\x55\x1e\x9d\x5e\x58\x25\xe9" + "\x74\xd4\xe3\xa8\xd3\x51\x07\xa3\x5e\x17\xf6\xd1\x12\xe6\x54\x14" + "\xde\x18\xe9\x20\xe1\xb8\x6f\x2e\xf6\x61\xa0\x2e\x2e\x3c\xc3\x74" + "\xbb\x90\x67\x25\xcb\x03\xfa\xb9\x15\x74\x72\x1b\xe8\xe4\x36\xd3" + "\x29\xa2\x84\x7c\xcd\x85\x38\x3f\x0f\x9e\x51\x77\x47\xb6\x83\x1d" + "\x70\x09\x76\xa0\x19\xed\x07\xa3\x57\xe1\x8d\xde\xb6\x20\x7f\x6a" + "\x5f\xfe\x7a\x91\xcc\x16\x54\xdc\x40\x8f\x74\xe6\xe6\x27\x4a\xfa" + "\xbd\x10\x9e\xd1\x06\x14\x9d\x11\x6c\x80\x1d\x6c\x40\x2b\xb3\x01" + "\xf9\x5b\x7a\xf2\x40\x1d\x84\x3c\xcc\x4e\x34\x6f\xc6\x33\xd0\x58" + "\x9e\x4a\x6f\x3b\x61\x6a\xf1\xb6\x13\xf9\x47\xd1\x4e\x40\x1b\x70" + "\x1f\x19\x05\x6f\xaa\x6b\x76\x97\x17\x6b\xd1\x66\xb0\xf7\x05\x9b" + "\x7a\xec\xc4\x0d\x32\x3b\x91\x2e\xd9\x89\xd7\x47\x5e\xf1\x76\x02" + "\xb0\xdc\x90\x71\x35\xda\x89\x82\x99\x57\x82\x9d\x40\x1e\x5c\x27" + "\xeb\x5b\xf5\xc7\x07\xdc\x8b\xa1\x21\xf9\xbb\x62\x27\x0a\xe2\xfc" + "\xdb\x09\x93\xab\xb7\x9d\x28\xd4\x78\xec\x44\xfe\x7e\x6f\x3b\xb1" + "\x6d\x61\x60\x76\xa2\xf0\x25\x5f\x3b\x81\x34\x2b\x64\xf3\x02\xda" + "\xd1\x3e\xb8\x4d\x36\xc2\xa3\xad\x08\xc9\x4e\x14\x66\x78\xdb\x89" + "\x6d\x33\x45\x3b\xf6\x4e\xf0\x76\x62\xdb\x5d\xc2\x78\xbf\x64\x27" + "\xce\xfb\xda\x89\x6d\xf7\x7b\xdb\x89\x6d\xe1\xcc\x1e\x6c\x4b\x64" + "\x76\x62\x5b\xb4\x68\x6f\xf6\xc8\xd3\x3d\x76\x82\xa5\xf7\xb6\x13" + "\xdb\xd2\x07\xb0\x13\xaa\xee\xe8\x62\x6d\x77\x41\x13\x71\xed\x29" + "\xde\x3d\x21\xe1\x51\xb7\xaf\x0c\x30\xec\xbb\xd9\xd9\x38\xd2\x98" + "\xcf\x7c\x36\xc6\xc0\x8b\x6b\x7a\xbb\xa2\x8b\xc3\x8f\x27\x83\x1c" + "\xb4\xfb\x97\x03\x90\x81\x70\x49\x06\x1a\x0c\x5f\x11\x90\x0b\x0e" + "\xc7\x81\xde\x06\xfc\x5b\x3b\x9a\x05\xbd\xa4\x6a\x8d\x25\xb8\x97" + "\xa2\xba\x9d\x68\xd4\x0a\xc5\x70\x1c\x63\x70\x83\x2c\x4c\x1b\x47" + "\xf9\x3b\x9b\x63\x89\xda\x40\x22\x50\x1e\xde\x13\xc7\x1a\x70\x3f" + "\x06\x1c\x63\x00\x1c\xc6\x2c\x68\xf2\x8c\x31\x74\x05\x30\xc6\x60" + "\x4d\xb7\x0b\x63\x0c\xb8\x46\x89\x07\x19\x10\xd6\xcd\xe0\x18\x83" + "\x53\x18\x97\xd1\x08\x6b\x55\x84\x31\x86\x63\x04\xc7\x17\xa4\xfd" + "\x58\x70\x5c\xe1\xce\x04\xc2\xe1\x7e\x0d\x6f\x03\xfe\x0f\xe9\x1b" + "\x08\xca\x40\xf0\xfa\xa8\xa8\xa5\xbf\x79\x36\x2e\xa0\xa9\x5b\xd5" + "\x44\xe8\xce\x26\xc7\xef\x8f\x39\x15\xb8\x57\xa5\x1b\x78\xc4\x83" + "\xde\xa1\x2a\x1f\xbd\xd3\x2d\xd2\xbb\x9b\xd1\x1b\x78\x15\x3e\xbf" + "\x83\x50\x48\x67\x7b\x55\x3a\xed\x80\x35\xfd\xe8\xf2\xf5\x48\xdb" + "\x18\x52\x2e\xee\x57\xc9\x6f\x30\x8c\xe4\x81\x9e\xb8\x36\xe1\xdd" + "\xf3\xce\x61\x6e\xd5\xb8\xca\x82\x2e\x32\x01\x74\x8c\x1a\x75\x0c" + "\xe0\x73\xd4\xae\x2e\xa0\xed\x17\x8c\xb6\xb8\x6f\x1a\xde\x5d\x1b" + "\xf4\x3a\x28\xfb\xf6\xee\x6e\xa0\xaf\x93\xd1\x77\xfe\x6a\x0d\xa9" + "\x90\xc6\xd8\xc0\x3e\x37\x02\x4f\x51\xc7\xcc\xea\x88\xa4\x78\x1e" + "\x85\xbb\x5b\x1f\xcd\x7f\x0d\xf4\xed\xc0\xf3\x47\xf4\xc8\x7f\x4d" + "\xc5\x71\x1c\x13\xfc\x8c\x8d\xb1\xa9\xc5\x7d\x30\x36\x80\xbe\x5f" + "\xa6\x23\xd6\x4a\xd0\xb7\xc3\xb7\x15\x74\x97\x17\x87\x53\x05\xe8" + "\xfb\x8c\x60\xe9\x5b\x3c\xe5\xf2\xd0\x57\xf7\x1d\xa2\xef\x1b\x63" + "\x43\xa7\xef\x9b\x7e\xd7\x3f\x5f\x5c\xfa\x6a\xbe\x43\xf4\x2d\xde" + "\x12\x3a\x7d\xdf\x72\xf5\x47\x5f\xf4\xef\x25\xdf\x5e\xf2\xeb\xd1" + "\xb6\x30\xdb\xb8\x3d\xd5\xe3\xd3\x6f\x4f\x95\xc6\x22\x81\x36\x4a" + "\x93\xd8\x47\x63\x5c\x8a\x67\x20\x94\x7c\x23\x8d\x43\xa2\x4f\x2d" + "\xf0\x6a\x27\xf0\x6a\x25\xae\x41\x11\xf9\x04\x76\x60\x41\x07\xe8" + "\xea\x31\xc5\xe0\x93\x81\x9d\x78\xa7\x78\xb7\x1f\x9e\x71\xa8\xe3" + "\xd5\xa9\x44\x33\xdf\xc8\x78\xc7\x6f\x00\x9e\x75\x81\x7f\xe3\x6c" + "\x23\xb8\xa6\x34\xb2\x0d\xf4\x6a\xb7\x61\xe4\x3c\xf0\x97\x25\xbe" + "\xbd\x97\xe6\x14\x7c\x9b\x3e\xf9\xb6\xc3\x9b\x6f\x67\xfb\xe0\x9b" + "\x67\x6c\x7f\x71\x1b\xe3\x9b\x5d\xe0\x9b\xa0\xd7\x37\x80\x6f\x03" + "\xfc\x93\xf8\x26\xe8\x75\xe0\x9d\xc0\xb7\xf6\x63\xc4\x2d\xd3\xeb" + "\xe8\xd7\x20\xef\xea\x13\xc1\xbf\xcc\x7d\xb3\x55\xe0\x1b\xfa\x99" + "\x89\xc1\xf2\xad\xc4\xc7\x9f\x29\xbd\x2d\x30\x7f\x66\xfb\x3d\xe8" + "\xb3\xc8\xfd\x19\x7c\x3e\x0b\x31\xaf\x5b\x6d\x53\x76\x84\xe4\xc3" + "\x6c\x8f\xf5\xf6\x61\x4a\x55\xac\x4e\xbf\x5c\x17\xbc\x0f\xb3\x5d" + "\x18\x6f\x7a\x77\x27\x8b\x25\xbd\xfd\x97\xed\xe7\xbc\xfd\x97\xed" + "\x16\xe6\xa7\x94\xea\xce\xe6\xa0\xff\xb2\xbd\x85\xa5\xff\x32\x5d" + "\x9e\xee\xf1\x5f\x58\x3a\x3b\x2f\xbd\x74\x42\x70\x3e\xcb\xc4\xcb" + "\xec\xb3\xc4\xf4\xe3\xb3\xc4\x5c\x65\x3e\xcb\x8e\xa2\x6b\x36\x75" + "\x20\x9d\x5f\x1a\x1b\xba\xce\xdf\xe9\xb8\x66\x53\x07\xa2\xef\x8e" + "\xe6\xd0\xe9\x5b\x36\x3b\x74\x9b\x5a\x61\xf1\xd8\xd4\x0a\x8b\x7f" + "\x9b\x5a\x31\xf5\x9a\x4d\xed\xcb\xa6\xbe\x3d\x39\x74\x9b\x5a\x11" + "\xee\x6d\x53\x77\xad\x09\xcc\xa6\x56\xbc\x36\xf4\x36\xb5\xe2\x2d" + "\x6f\x9b\xba\x4b\x5c\xbb\x5c\xd6\x10\xbc\x4d\xdd\xf5\x98\x7f\x9b" + "\xba\x6b\x86\xb7\x4d\xdd\x15\xcd\x6c\xe7\xae\x54\x66\x53\x77\xc5" + "\xb0\xf4\xb2\x7a\x79\xba\xc7\xa6\xb2\x74\x66\x53\x77\x65\x07\x67" + "\x53\x6f\xbd\xcc\x36\x55\xd7\x8f\x4d\xd5\x5d\x65\x36\x75\xb7\xdf" + "\xfd\x2f\xaf\xe9\x7c\x49\xe7\xef\x7a\x2b\x74\x9d\xff\x6b\xbf\x67" + "\x14\x0e\xac\xf3\xf7\x1c\xf0\xe8\xfc\x3d\x07\xfc\xeb\xfc\x3d\xf7" + "\x5c\xd3\xf9\x7d\xe9\xfc\x5f\x4d\x08\x5d\xe7\xff\x3f\x97\xb7\xce" + "\x7f\x67\x59\x60\x3a\x7f\xcf\xba\xa1\xd7\xf9\x7b\xf2\xbc\x75\xfe" + "\x3b\x73\x58\x9d\x7e\xfd\xf7\xe0\x75\xfe\x3b\xf7\xfb\xd7\xf9\xef" + "\x4c\xf5\xd6\xf9\xef\x68\x98\x6e\x7f\xc7\xc0\x74\xfe\x3b\x63\x59" + "\xfa\xaf\xcd\xf2\x74\x8f\xce\x67\xe9\x4c\xe7\xbf\x93\x1a\x9c\xce" + "\x8f\xbc\xcc\x3a\x5f\xd3\x8f\xce\xd7\x5c\x65\x3a\xff\x37\xcd\xa1" + "\xeb\xa4\xbd\xb3\x3d\x3a\x69\xef\x6c\xff\x3a\xa9\xf2\xd0\x35\x9d" + "\xd4\x97\x4e\x7a\x27\x2f\x74\x9d\x54\x59\xe4\xad\x93\xf6\xba\x03" + "\xd3\x49\x7b\xd5\x43\xaf\x93\xf6\x46\x7b\xeb\xa4\xbd\x6d\xac\x4e" + "\xbf\x9d\x1b\xbc\x4e\xda\x5b\xeb\x5f\x27\xed\x6d\xf2\xd6\x49\x7b" + "\xc5\x31\xa8\xbd\x2e\xa6\x93\xf6\x56\xb3\xf4\xdf\xce\x91\xa7\x7b" + "\x74\x12\x4b\x67\x3a\xe9\x77\xe1\x03\xe9\x24\xc4\x7e\x83\xd6\x07" + "\xfb\xcb\x25\xec\xef\x4b\xac\x2b\x93\xb0\xbf\x2f\x51\x98\xef\x56" + "\x56\x5c\xfa\x7a\x1a\x51\x16\xe0\x59\x22\x20\xef\xc6\x17\x10\xfb" + "\xbf\xff\x04\xe7\x2d\xa8\x5a\x40\x87\xb5\x8a\x3a\x2d\x1d\x74\x5a" + "\x2b\x3c\xe3\x1e\x53\x63\x8a\x4b\x51\x17\xe1\xf8\x3f\x3e\x33\xdd" + "\xe6\x18\x86\xeb\x25\x83\x5a\xcb\xd4\x2a\xae\x65\x4a\xea\xbd\x96" + "\xa9\x4c\xb6\x66\x06\x65\x43\xbd\x49\x11\x81\xe3\xba\xa0\xdf\x44" + "\x3d\x66\x19\xe6\x52\x89\x7a\xec\x3c\xe8\xb1\xf3\x1e\x99\x40\x3d" + "\x76\x16\xf4\x58\xc7\x5a\xfd\x2d\xa8\xcb\x7a\xaf\x63\x62\xe3\xb8" + "\x82\x1e\x33\xf9\xe8\xb1\x97\x7d\xf4\xd8\x52\xd0\x63\x89\xa0\xc7" + "\xd4\x1e\x79\xf8\x61\x0b\xe1\x66\x2e\x04\x99\x00\x3d\xf6\xe6\x79" + "\xd4\x63\x87\x42\xd4\x63\xbf\xdf\xed\x2d\x0f\xef\xaa\x03\x93\x87" + "\x7d\x63\xfc\xc9\x43\xb7\x29\x54\x79\xd8\x37\xc1\x5b\x1e\xf6\x39" + "\x59\x9d\x7e\xf7\x6c\xf0\xf2\xb0\xef\xd3\x1e\x79\x58\xee\x2b\x0f" + "\xfb\xbe\xf0\x96\x87\x7d\xfb\x19\xee\xdf\x55\x31\x79\xd8\x67\x61" + "\xe9\xbf\x9b\x2d\x4f\xf7\xc8\x03\x4b\x67\xf2\xf0\xae\xf6\xda\xf8" + "\xec\x95\x6a\xa3\xdf\xeb\xef\x0c\xed\x6b\xe3\xb3\x42\x5c\xf6\xee" + "\x84\xd0\xe3\xb2\xf7\x2f\xd3\xf8\xf7\x77\xa9\x2f\xf9\xbd\x83\xa1" + "\xd3\xf7\x0f\x97\x69\xfc\xfb\xbb\xd4\xaf\x50\x35\x88\xf1\xef\x3f" + "\xf6\x3b\xfe\xdd\xbf\x1f\xf3\xc1\x84\xfa\x1e\x1f\xfe\x83\x09\xd2" + "\x9c\xcb\xde\x3e\xfc\xfe\x5f\x79\xaf\x5f\xfa\xd3\x33\xbe\xf3\x21" + "\x07\xf2\xed\x5d\xff\xa7\x7c\xfb\x3f\x6c\x09\xdd\xb7\xdf\x9f\xec" + "\xed\xcb\x7c\xf0\x69\x60\xbe\xcc\xfe\x6f\xfc\xf9\x32\xae\x90\x7d" + "\xfb\xfd\x4e\x6f\x5f\xe6\x83\x83\x22\xff\x6f\x0c\xde\x97\xf9\xe0" + "\x1d\xff\xbe\xcc\x07\xef\x7a\xfb\x32\x1f\x64\x33\x9f\xe5\x83\x66" + "\xe6\xcb\x7c\xf0\x16\x4b\xff\x93\x56\x9e\xee\xf1\x65\x58\x3a\xf3" + "\x65\x3e\x68\xbd\x36\x6e\x7b\xa5\xfa\x32\xff\xe1\xf7\xfc\xab\x6b" + "\xb6\x56\xb2\x05\x1f\x38\x43\xb7\x05\xd5\x95\xd7\x6c\xed\x40\xf4" + "\xfd\x8f\xa2\xd0\xe9\xfb\x97\xf0\xd0\x6d\xed\x81\x52\x8f\xad\x3d" + "\x50\xea\xdf\xd6\x1e\x50\x7b\xdb\xda\xbf\xfc\xf9\x9a\xad\xed\xcf" + "\xd6\x56\x3b\x42\xb7\xb5\xff\xd9\xec\x6d\x6b\x3f\x9c\x16\x98\xad" + "\x3d\x30\x77\xe8\x6d\xed\x81\x24\x6f\x5b\xfb\x61\x8c\xc8\xff\xd7" + "\x82\xb7\xb5\x1f\x5e\xef\xdf\xd6\x7e\x78\xa3\xb7\xad\x3d\x20\xae" + "\xa1\xff\xf0\x49\x66\x6b\x3f\x14\xcf\x0c\xfd\xcb\x16\x79\xba\xc7" + "\xd6\xb2\x74\x66\x6b\x3f\x1c\x68\xfd\xcf\xb5\xf1\xdc\xcb\x66\x6b" + "\xff\xba\xff\x9a\x2d\x18\xc8\x16\x7c\x98\x14\xba\x2d\x30\x47\x85" + "\x6e\x0b\xfe\xb1\xc7\x63\x0b\xfe\xb1\xc7\xbf\x2d\xf8\xc7\x8d\xde" + "\xb6\xc0\x7c\xe8\x9a\x2d\xe8\xcf\x16\xfc\xd5\x15\xba\x2d\xf8\x7b" + "\xab\xb7\x2d\xf8\xe8\xd9\xc0\x6c\xc1\x3f\x16\x0e\xbd\x2d\xf8\x87" + "\xd1\xdb\x16\x7c\x34\x45\xe4\xff\x1b\xc1\xdb\x82\x8f\xc6\xf8\xb7" + "\x05\x1f\xdd\xe1\x6d\x0b\xfe\xe1\x64\x3a\xff\xa3\xd9\xcc\x16\x7c" + "\xa4\x62\xe9\xe6\x22\x79\xba\xc7\x16\xb0\x74\x66\x0b\x3e\x9a\x77" + "\x6d\x9c\xf7\x4a\xb5\x05\x07\xcd\xa1\xeb\xaa\x9a\xd9\x1e\x5d\x55" + "\x33\xdb\xbf\xae\xfa\xaf\x43\xde\xba\xea\xd0\xea\x6b\xba\xaa\x3f" + "\x5d\xf5\x91\x31\x74\x5d\xf5\x5f\x3e\xe3\xbf\x35\x01\x8e\xff\xd6" + "\xf8\x1d\xff\x0d\x5d\x57\xd5\xf8\x8c\xff\xd6\x88\xe3\xbf\x87\xa6" + "\x06\xaf\xab\x6a\x6a\xfd\xeb\xaa\x1a\x9f\xf1\xdf\x1a\x71\xfc\xb7" + "\x46\x1c\xff\xad\x11\xc7\x7f\x0f\x4d\x91\xa7\x7b\x74\x15\x4b\x67" + "\xba\xca\x32\xc8\xf1\xdf\xc3\xe9\x9e\xf1\xdf\xc3\xc2\x9a\x01\xbe" + "\xb4\xc9\xd2\x7b\xfc\xb7\xf6\x24\x8e\xff\x7a\x64\xc2\xb2\x55\x18" + "\x0b\x46\xb9\xe8\x60\xfb\x8a\xf4\x39\x2e\x7c\x63\x93\xe5\xda\xb8" + "\xf0\x50\x8c\x0b\xd7\xfa\xec\xe7\x53\x77\x47\x60\x72\x72\xf8\xfe" + "\xa1\x1f\x17\x3e\xfc\xa4\xb7\x9c\xd4\x69\x44\x4c\x84\x30\x2e\x7c" + "\xf8\x5b\xff\x72\x72\xf8\x82\xb7\x9c\x1c\x16\xe7\xe5\xd6\x8d\x65" + "\x72\x72\xd8\xce\xd2\x2d\xb3\xe5\xe9\x1e\x39\xb1\xc8\xc6\x85\xeb" + "\x62\x02\xb1\xe9\x2e\x55\x93\x12\x6d\xf4\x84\xe6\x47\xdd\x3d\x78" + "\x4e\x15\xf1\xdc\x97\x4d\x5f\xc4\x74\x3f\xe2\xb8\x7b\x4f\xf1\x9e" + "\x01\x6d\x7a\xab\x68\xd3\x93\x7a\xdb\x74\xc9\x9e\x23\x9e\xdf\x0e" + "\x68\x4c\xd8\x07\xd7\x41\xd9\xf3\x25\x6d\x83\xc1\x35\x62\xda\xdb" + "\x9e\x87\x8a\xeb\xfa\xcb\xb4\xfe\xe5\xbb\x34\x26\x5c\xf7\x64\xe8" + "\xb1\x5d\xc3\x65\x5a\xff\xf2\x5d\xea\xa7\xae\x1f\xc4\xfa\x17\x6b" + "\xbf\xeb\x5f\xae\xf5\x4d\x20\x7d\x1b\x27\x87\x4e\x5f\x5b\x55\xe8" + "\xfe\xfe\x3f\x13\x3d\xfe\xfe\x3f\x13\x25\xdf\x46\xda\x2f\x0d\x74" + "\xa6\xd2\x94\x02\xd7\x79\x42\x5e\x4f\x11\xf6\xfa\x0e\xb7\xb6\x7e" + "\x82\xe7\x13\x81\xbf\xf3\xf1\x27\xf1\xe9\x72\x7f\xa7\x69\x8d\xe4" + "\xeb\xc4\xa3\x1f\x04\x7e\x0d\xfa\x34\x92\x8f\x8f\x7b\xe3\xf4\x3b" + "\x1f\xf4\x8e\xe2\x3d\x18\x13\x74\xab\x9b\x94\x57\x7f\x3c\x60\x2d" + "\x0d\x3d\x1e\xf8\xd8\x67\xfe\xdb\x91\x00\xe7\xbf\xfd\xd3\xef\xfc" + "\xb7\xd0\xe3\x81\x7f\xfa\xcc\x7f\xfb\xa7\x38\xff\xad\xe9\xae\xe0" + "\xfd\x9c\x7f\xf6\x33\xff\xed\x9f\x3e\xf3\xdf\xfe\x29\xce\x7f\x3b" + "\x22\xce\x7f\xfb\xa7\x38\xff\xad\x69\x82\x3c\xdd\xe3\xe7\xb0\x74" + "\xe6\xe7\x1c\x09\x68\xfe\x1b\xf8\x39\xe1\x83\xf0\x73\x06\xee\xbb" + "\xb8\x62\xfc\x9c\xa5\x57\x88\x9f\xf3\x89\xdf\xf3\x8f\x64\x76\x42" + "\xe9\x63\x27\xf6\xfc\xdf\xb2\x13\x47\x06\x31\xf7\xed\xff\xeb\x77" + "\xfe\xbf\x40\xdf\x02\x19\x7d\x51\x47\x8b\xb4\x75\x8f\x2d\xde\x13" + "\x12\x7d\x41\x37\x97\x67\x7e\x57\x68\xfb\x89\x39\x74\xda\x36\x4f" + "\xba\xe6\xe3\x0c\x44\xdf\xff\xd6\x85\x4e\xdf\x4f\xdf\x0a\xdd\xc7" + "\x69\x49\xaa\xeb\xf1\x71\x5a\x92\x7c\x7d\x1c\xf4\x69\x9e\x71\x32" + "\x5f\xe7\x75\xf0\x51\xf2\x57\x82\xbf\x93\x46\x88\xb5\xf5\x43\x52" + "\x00\x3e\x4f\xfe\x29\xf0\x7b\x92\xc1\xef\x71\xbd\x23\xfa\x3d\xff" + "\xf3\xa9\xb7\xdf\xf3\xd9\x8a\x3e\xfd\x1e\xb5\xc7\xef\x71\x81\x4f" + "\xd3\xfd\x4e\xf1\x9e\xa2\x53\x32\x1f\xe8\x95\xde\x3e\x50\x97\x09" + "\x6c\xce\x1d\xc5\x95\xdd\xe0\x07\xf5\xe7\x03\x09\xbc\xf7\xf1\x83" + "\xbe\x7b\x3e\x50\x73\x46\xe8\x3e\xd0\xff\xec\xf1\xf6\x81\x8e\x5e" + "\x1f\x98\x0f\xd4\x72\x9b\xdf\xbe\x9e\x90\x7d\xa0\x96\x18\x6f\x1f" + "\xa8\xc5\x25\xe2\xe2\xfa\xe0\x7d\xa0\x96\xa3\xfe\x7d\xa0\x96\xaf" + "\xbc\x7d\xa0\x96\x6a\xe6\xeb\x1c\xd5\x30\x1f\xa8\xa5\x9e\xa5\x7f" + "\xa6\x91\xa7\x7b\x7c\x20\x96\xce\x7c\xa0\xa3\xd1\x01\x8e\xdf\x28" + "\x5d\x60\x63\x2f\xff\xbc\xb9\xfe\xc6\x6f\x86\x6a\xde\xdc\x92\x2b" + "\x64\xfc\xe6\x7f\xb3\xaf\xd9\xe9\xfe\xec\xc8\xd1\x98\xd0\xed\xc8" + "\xe7\x97\x69\xfe\xff\x77\xc9\x4e\xff\xaf\x25\x74\xfa\x7e\xd1\xef" + "\xfc\xff\xfe\xed\xf4\x97\xed\x9e\xbe\x88\x2f\xdb\x83\xeb\x8b\xf8" + "\x72\xa1\xb7\x4d\x3e\xa6\xb8\xd6\x17\x11\xa8\x1d\xb6\x8f\x0d\xdd" + "\x0e\x7f\x39\xc1\xdb\x0e\xb7\xee\x08\xcc\x0e\x7f\xb9\x77\xe8\xfb" + "\x22\xbe\xac\xf6\xb6\xc3\xad\x5b\x58\x9d\xbe\xf8\x73\xf0\x76\xb8" + "\x75\x89\x7f\x3b\xdc\xba\xc2\xdb\x0e\xb7\xc6\x32\x7b\xdb\x5a\xca" + "\xec\x70\xeb\x1c\x96\xfe\x45\xb5\x3c\xdd\x63\x87\x59\x3a\xb3\xc3" + "\xad\x7b\x82\x1b\x73\xb9\xf5\x0a\x1d\x73\xd1\x5d\x65\x63\x2e\xc7" + "\x95\xd7\xec\xc4\x40\x76\xa2\xb5\x3a\x74\x3b\xf1\x75\x52\xe8\x76" + "\xe2\x44\x94\xc7\x4e\x9c\x88\x0a\xce\x4e\x7c\xb3\xd5\xdb\x4e\xb4" + "\x8d\xbb\x66\x27\x02\xb5\x13\xc7\x67\x86\x6e\x27\xbe\x99\xe3\x6d" + "\x27\x4e\xfc\x3d\x30\x3b\xf1\x4d\xd3\xd0\xdb\x89\x6f\xec\xde\x76" + "\xe2\xc4\x3e\x56\xa7\xaf\xbf\x08\xde\x4e\x9c\x30\xf9\xb7\x13\x27" + "\x7e\xe9\x6d\x27\x4e\x18\x98\x3d\x38\x61\x66\x76\xe2\x44\x06\x4b" + "\xff\xda\x2e\x4f\xf7\xd8\x09\x96\xce\xec\xc4\x89\xfa\x6b\xf3\xed" + "\xae\xd4\xf9\x76\xed\x31\xa1\xeb\xb2\x53\x66\x8f\x2e\x3b\x65\xf6" + "\x3f\xdf\xee\xd4\xfd\xde\xf3\xed\xda\xbf\xb8\x36\xdf\xae\x3f\x5d" + "\x75\xc2\x1e\xba\xae\x3a\x45\xbc\x75\xd5\xe9\x15\x81\xe9\xaa\x53" + "\x1b\x87\x5e\x57\x9d\x2a\xf0\xd6\x55\xa7\x13\x44\xfe\xbf\x1b\xbc" + "\xae\x3a\xfd\xa0\x7f\x5d\x75\xfa\x31\x6f\x5d\x75\x3a\x8a\xe9\xa4" + "\xd3\xc9\x4c\x57\x9d\xd6\xb3\xf4\xf6\x7d\xf2\x74\x8f\xae\x62\xe9" + "\x4c\x57\x9d\x0e\x68\xff\x7f\xcf\xf8\x5a\x48\x3e\xed\x25\x18\x5f" + "\x1b\x2a\x9f\xf6\x4a\x19\x5f\x73\x5c\x1b\xff\xe9\xd7\x9f\x3d\x3d" + "\x88\x7d\xff\xcf\xf4\x3b\xfe\xd3\xbf\x0d\xe8\x70\x79\x6c\x40\x87" + "\xcb\xdf\xf8\x44\x3e\x60\xa8\x00\xfc\xd1\xad\xa7\x88\xf2\x75\x1c" + "\x9f\x38\xd2\x40\x4c\x38\x3e\xb1\x52\x1a\x9f\x28\x17\x7d\xdc\x8e" + "\xd5\xde\x3e\xee\x59\x75\x5f\x3e\x2e\xfa\xb6\x6e\xf0\x5b\x5d\xbe" + "\xe3\x12\x2f\xf4\x6d\x3b\xba\xd4\x4d\xe1\x17\xde\x29\xae\x0c\xc6" + "\x76\xbc\xbd\x9e\xd9\x8e\x9d\xdf\x29\xdb\xf1\xad\x2e\x74\xdb\xd1" + "\xe1\x73\x9e\xef\xb9\xbd\x81\xd9\x8e\x8e\x3f\x0f\xbd\xed\xe8\xb0" + "\x78\xdb\x8e\x73\x6f\xb1\x3a\x9d\xf9\x43\xf0\xb6\xe3\xdc\x1a\xff" + "\xb6\xe3\xdc\x46\x6f\xdb\x71\x4e\x9c\x6b\x7a\xae\x92\xd9\x8e\x73" + "\x49\x2c\xfd\x4c\x95\x3c\xdd\x63\x3b\x58\x3a\xb3\x1d\xe7\xf6\x07" + "\xd7\x1f\x12\x79\x85\xf6\x87\x68\xae\xb2\xfe\x90\xce\x41\xac\x7f" + "\xbb\x70\xa0\xbe\x67\xfe\xfc\x85\x03\xbd\xe2\xf5\x34\xf0\x75\xcf" + "\xb0\x31\xd7\x9e\x78\xdd\x7e\x54\xd4\x65\x17\xee\xf1\xd6\x65\x9d" + "\x9f\xfa\xd3\x65\xfd\x8d\xab\x62\x7c\xee\x06\x3d\xe7\x2a\x0f\x71" + "\x5c\x35\xed\xbb\xa4\xbf\xce\x59\x42\xd7\x5f\x4e\x9f\xfd\x4f\xbb" + "\x02\xdc\xff\xf4\x82\xdf\xfd\x4f\x5d\x21\xcf\xa1\xbf\xe0\xb3\xff" + "\x69\x97\xb8\xff\x69\x67\x08\xeb\xe2\xba\xee\xf7\xaf\xbf\xba\x7c" + "\xf6\x3f\xed\x12\xc7\x4f\xbb\xc4\xfd\x4f\xbb\xc4\xfd\x4f\x3b\x8b" + "\xe4\xe9\x1e\xfd\xd5\x29\x5b\x17\xd7\xd5\xef\xfe\xa7\xb4\x60\x7b" + "\x78\x11\xc7\x57\xc1\x55\x0d\x75\xbc\x11\x30\x60\x86\xff\x2d\xc0" + "\xc7\xd1\xf0\xbf\xcd\x9f\x8c\x39\xd4\xdb\xc3\xf9\x1c\xa8\x33\x47" + "\x14\x56\xc7\x69\xb3\xf9\x26\x17\xd6\xb3\x83\xf1\x6a\x7b\x78\xa4" + "\x6b\x44\x1c\x4f\x0d\x04\xf8\x12\x2e\x9c\xaf\x06\xf9\x23\x00\x33" + "\xba\x34\x12\x71\x4a\xd1\x1d\x25\xe5\x83\xfa\x46\x1c\x53\x74\x35" + "\x61\x19\x9d\xb9\xdd\x3a\x68\x4b\xb6\xdf\xba\x42\x59\xf1\x7b\x6f" + "\x21\x1b\x5d\xf4\x6b\xf3\xca\x33\xa4\x55\xd1\xbd\x2c\xb2\x7d\x44" + "\x1c\xcd\x4a\x20\xe8\x63\x55\xdd\xe4\x50\x62\x99\x78\xf6\x22\xbc" + "\x9b\x89\xef\xdc\x50\xc7\xcc\x15\x84\x2b\x3c\x33\x22\x1c\x74\xc1" + "\xb0\xac\x0e\xda\xb6\xca\x05\x75\x4e\x77\x91\xbf\xdd\xd2\xac\x7c" + "\x7f\x27\xa4\xb9\x89\x16\xcf\xb7\xc3\x32\xc0\xc7\x84\xfa\x74\xaf" + "\xa8\x80\xfc\x7d\xd5\xe1\xb5\xf7\xc8\x84\x61\xe3\xa8\x3d\x38\xdc" + "\x74\x9b\xfd\xd1\x31\x72\xd3\x2d\xc4\x3c\x1e\x68\xa7\x23\x5c\x5f" + "\xef\x83\xfb\x8e\x4b\xdf\x8f\x4e\x0c\xc7\x73\x30\xb3\x76\x10\x6e" + "\x1b\x3f\x22\xfc\xa3\x0c\xe1\xac\x4a\x47\x67\xae\xeb\x2d\xbb\xe2" + "\x65\x3b\xd2\x1c\xcf\x4c\xc3\xb3\x7f\x01\x37\x04\xd2\xf7\xfd\x3d" + "\x9d\x10\x5f\x5e\xa4\x24\xad\x58\xa8\x4b\x5d\xb6\x62\xc9\xaa\x35" + "\xa9\xba\x3b\x92\x46\x91\x39\xab\x56\xe9\x56\x2c\x5c\xb9\x4e\x27" + "\x7f\xf3\x90\x2e\x69\xd9\xab\x0b\x17\x25\x2f\xb9\x6b\xc5\x62\xe3" + "\x28\x0c\x5e\x65\xf5\x88\xc2\xba\xf0\xb9\xae\xea\x8a\x62\x42\xde" + "\x1c\x4d\x94\x58\xaf\xce\x5c\x77\xb4\x74\x3e\x1e\x9e\x0f\xc7\x41" + "\x9e\x2c\xd0\x81\xdb\x32\x47\x60\x5e\xfd\x2e\xa8\x57\x05\xd4\x1b" + "\xea\x08\x75\x76\xc7\x49\x75\x96\x30\x91\x85\x98\xc8\x3c\x03\x18" + "\x74\x2f\x8b\x74\x8e\xf8\x29\xa5\x09\xd8\x3e\x3c\x57\x54\x01\x69" + "\x7f\x46\xbb\x44\x4d\xdb\xc3\xe1\xb7\x5b\x24\x8c\xe1\x6f\x69\x61" + "\x89\xad\x13\xe5\x84\x1a\x1e\x61\x32\xc5\xcf\x9b\xab\x57\x10\x76" + "\x3e\x9f\xbb\xca\x73\x3e\x1f\x3f\x0f\x69\x0b\xf5\x68\x87\x74\x8b" + "\x5d\xf1\x60\x12\xa6\xe3\x39\x91\x78\xce\x1e\xd6\x19\xda\x05\x76" + "\x91\x9a\x69\x8e\x88\xfd\xbc\xd6\x3c\xbe\x60\x98\xd1\xaa\x3c\x4f" + "\xe2\x5d\xb4\x9b\x6e\x6d\xcd\x6b\xec\xe8\x20\x91\x9b\x8c\x8b\xe9" + "\x70\x57\x6d\xa4\x6b\xd9\x12\x3c\x1f\x90\x37\x0d\x33\xd2\xad\xfc" + "\xee\xb9\xe3\x88\xa6\x33\x97\x1f\x2b\x3b\x27\x50\x19\x1c\xff\x79" + "\x81\xff\xc8\x47\x3c\xff\x8f\xf1\x91\x4f\xfd\x7b\x6a\x6f\x3e\xf6" + "\xe0\x6f\x2f\x4f\x0e\x01\x16\xa8\xaa\x66\x76\xbc\x9b\xd1\x11\x65" + "\xf7\x6c\x96\x81\x4c\x14\x68\x47\x27\xf0\x85\x35\x31\x7c\x41\x8d" + "\x81\x16\xd4\xcc\xa1\xaa\x92\xb6\xc2\x34\xa2\x5b\xe0\xd6\x10\xd3" + "\x79\x12\xe3\x30\xd5\xcc\x56\x2b\xb2\x15\xe0\x5b\x70\x60\x37\x62" + "\x40\x67\xc4\x30\x79\x2f\x69\x43\x3a\xd6\xb4\x13\x32\xeb\x55\x42" + "\xbe\x9e\x42\xc2\x2a\xe0\x77\x41\xb6\x87\xed\xff\x94\xcb\x57\xed" + "\x82\xdf\xe2\x39\x8f\xc1\xfd\x9e\x4e\xf6\x2b\x77\x9e\x76\xdb\xfa" + "\x6c\x37\x47\xc6\x42\xbb\xab\xa0\xdd\x6d\xd0\xee\x23\x7d\xb4\xdb" + "\xc6\xda\x3d\xec\xcc\xd0\xb7\x9b\x3a\x58\xbb\x69\x65\x48\xed\xe6" + "\x88\xdf\xfe\x3f\x4f\xbb\x2d\x7d\xf3\x9b\x53\x44\xf3\x85\x16\xe0" + "\xb7\x05\xf8\x6d\xe9\x83\xdf\x16\x91\xdf\xd7\x1d\x1b\xf2\x76\x73" + "\xa4\x4d\x68\x77\x3e\xd9\x1d\x5a\xbb\x15\x7e\xf5\x9f\xac\xdd\x7e" + "\xf8\xcd\x45\x41\xbb\x81\xdf\x16\xe0\xb7\xa5\x0f\x7e\x5b\x44\x7e" + "\x5f\xff\xf1\xd0\xb7\x5b\xc1\xfa\xff\xf3\x15\xa5\xa1\xb5\x9b\xd3" + "\x0d\xdc\xee\x5a\x3f\xfc\x0e\x53\xf1\x85\xb5\xc0\xef\x5a\xe0\x77" + "\x6d\x1f\xfc\xae\x15\xf9\xfd\x40\xfe\xd0\xb7\x9b\x63\xfb\xdf\xe4" + "\x73\x45\xa1\xb5\x3b\x4c\x1b\x40\xbb\xfd\xf0\x5b\xa9\x84\x76\x03" + "\xbf\x6b\x81\xdf\xb5\x7d\xf0\xbb\x56\xe4\xf7\x8b\x8f\x0f\x7d\xbb" + "\xc3\x6c\xac\xdd\x61\x79\xa1\xb5\x5b\xa9\x09\x40\xaf\x25\x80\xee" + "\xea\xc5\x73\x6b\xfa\x64\x72\xf7\x79\x6c\xff\xb0\x54\xaa\xae\x49" + "\xb8\x6e\x53\xb6\xc2\xa5\xaa\x99\x77\x5d\x0b\xe1\x20\xf6\x33\x44" + "\xda\xc9\x48\x68\xab\x81\x16\xd6\x39\xf0\xce\x43\x39\x2e\xd0\xfd" + "\x6e\x55\xcd\x9c\xae\x82\x92\xb6\xd7\x97\x12\x5d\x96\x83\x68\x1a" + "\x33\xed\x24\xd3\x48\x1d\x8d\xe4\x0b\xa2\xb6\x13\x0e\xfb\xb1\xea" + "\xda\xab\xc9\xca\x14\x4a\xa1\xec\x97\x30\x5e\x2c\x3c\x4e\x62\xc0" + "\x27\xce\xa6\x60\x3f\x8a\x78\xa2\x83\xf2\x63\x90\x96\x50\xf6\x99" + "\xc8\x39\x44\xf1\xd7\x45\x4e\x82\xf4\x44\xda\x42\x6c\x19\x23\xd0" + "\x15\x3c\xc8\xa7\x5f\x64\x74\x7d\x7b\x69\xb0\x74\x1d\xa6\x67\x7e" + "\x65\x8d\xd1\x6a\xef\x22\xe0\x5b\x6a\x70\x5d\x33\xd0\xab\xb5\xd1" + "\x78\x86\xd0\x7c\x65\x1e\x35\xd5\x24\xf2\x60\xb3\x82\x2c\xd7\xef" + "\xfc\x37\x19\xbd\x9b\x81\xde\xbd\xb0\xe6\xa1\xf7\xf0\x56\xa0\x77" + "\xb3\x48\xef\x96\xeb\x5a\x86\x9d\xf1\x43\xef\x66\xa0\x77\x1b\xd0" + "\xfb\x48\xe0\xf4\x1e\xde\xe0\x43\xef\xaa\x4b\x43\xef\xe1\xa5\x22" + "\xbd\x1d\xde\xf4\x1e\x3e\x87\xd1\x7b\x98\x13\xe8\x6d\x07\x7a\xdb" + "\x82\x2c\xd7\xef\xfa\x47\x99\x1e\x07\x7c\xf7\xb6\x61\x1e\x7a\x87" + "\xcf\xa1\x6a\x8b\x88\x6f\x0b\xe0\xfb\xba\x63\x7d\xd3\xdb\x02\xf8" + "\xb6\x00\xbe\x2d\x41\xe0\x3b\x7c\xaa\x37\xbd\x2d\x97\x08\xdf\xe1" + "\xe2\xf9\x4f\x16\x1f\x7c\x8f\x38\xc8\xe8\x3d\xc2\x40\x4d\x16\xc0" + "\xb7\x25\x48\x7c\x87\x27\x06\x40\x6f\xc0\x77\x6f\xdb\xe9\xa1\xf7" + "\xc8\x83\x40\x6f\x11\xdf\x16\xc0\xf7\xf5\x1f\xfb\xa1\x37\xe0\xdb" + "\x02\xf8\xb6\x04\x81\xef\x91\xef\xfa\xd0\xfb\x12\xe1\x7b\x64\xba" + "\x48\x6f\x1f\x7c\x8f\x9c\xc4\xe8\x1d\xde\x0c\xf4\x06\x7c\x5b\x82" + "\xc4\xf7\x48\xbf\x71\xb5\xcc\x6e\x01\xbe\x7b\xdb\x6c\x0f\xbd\xaf" + "\x9b\x44\xd5\xb5\x22\xbe\x6b\x01\xdf\x0f\xe4\xf7\x4d\xef\x5a\xc0" + "\x77\x2d\xe0\xbb\x36\x08\x7c\x5f\x37\xc6\x9b\xde\xb5\x97\x08\xdf" + "\xa3\x98\xff\x57\x50\xeb\x83\xef\x51\x7b\x18\xbd\x47\xc5\x51\x53" + "\x2d\xe0\xbb\x36\x48\x7c\x5f\x17\x1b\x00\xbd\x01\xdf\xbd\x7d\x05" + "\x0f\xbd\x55\x7b\x80\xde\x22\xbe\x6b\x01\xdf\x2f\x3e\xee\x87\xde" + "\x80\xef\x5a\xc0\x77\x6d\x10\xf8\x56\x99\x7c\xe8\x7d\x89\xf0\xad" + "\x4a\x10\xe9\xed\x83\x6f\x55\x14\xa3\xf7\x75\xd5\x40\x6f\xc0\x77" + "\x6d\x90\xf8\x56\xf9\x5d\xff\xdb\x9f\x7f\xf2\x6a\x39\x09\xf7\xa6" + "\x79\x84\xf6\xe2\xf9\x28\x11\x8a\xcb\xe3\xa3\xa8\xeb\xfb\xf6\x51" + "\xd4\x79\x8c\xe6\xea\x09\xa1\xf9\x28\x11\x63\x43\xf1\x51\x7a\xd3" + "\x3c\xb2\xe0\xe2\xf9\x29\x91\x6b\x2e\x8f\x9f\x12\x19\xdb\xb7\x9f" + "\x12\xe1\x62\x34\x8f\xd8\x1d\x9a\x9f\x12\x59\x1a\x8a\x9f\xd2\x9b" + "\xe6\xd7\x93\x8b\xe7\xab\x68\xbe\xb9\x3c\xbe\x8a\x66\x7f\xdf\xbe" + "\x8a\xc6\xc8\x68\xae\x89\x0a\xcd\x57\xb9\x5e\x15\x8a\xaf\xd2\x9b" + "\xe6\xa3\x53\x2f\x9e\xbf\x32\xfa\xa5\xcb\xe3\xaf\x8c\xd6\xf7\xed" + "\xaf\x5c\x2f\xc6\x3f\xd7\xe7\x85\xe6\xaf\x8c\x0e\x20\xfe\xe9\xed" + "\xaf\xf4\xa6\xf9\xf7\xda\x2e\x9e\xcf\xf2\xbd\xa6\xcb\xe3\xb3\x7c" + "\xaf\xac\x6f\x9f\xe5\x7b\x09\x8c\xe6\xa3\x5d\xa1\xf9\x2c\xdf\xeb" + "\x08\xc5\x67\xe9\x4d\xf3\xef\xcf\xbb\x78\x7e\xcb\xf7\xa7\x5d\x1e" + "\xbf\xe5\xfb\x9a\xbe\xfd\x96\xa8\x7a\x46\xf3\x28\x63\x68\x7e\xcb" + "\xf7\x0d\xa1\xf8\x2d\x48\x6b\xa4\x39\xfa\x2a\x8c\xe6\xda\x09\x34" + "\xa2\x26\xa6\x1b\xfc\x11\x35\xd0\x5d\xdd\x4e\xb8\x72\xa4\x79\x33" + "\xa3\xb9\x3b\xa2\xce\x01\xf4\x31\x20\xcd\x84\x76\xfc\x4b\x1b\xe1" + "\x2e\xa8\x99\x47\x39\x02\x6d\x09\x27\xc7\xb9\x1b\x1e\x74\xe5\x90" + "\x08\x5d\xe6\x26\xf8\x5f\x2b\xec\x9f\xa9\xcb\xcc\x3d\x0a\x6d\x0c" + "\xc3\x31\x0a\x97\xa9\xa4\xc8\xad\xae\xd3\x1c\xe7\x7e\xb0\x8e\x8e" + "\x29\x2e\xea\x06\x5f\x82\x2e\xd7\x46\x59\xdb\xab\x88\xd5\x75\x98" + "\x34\x36\xff\x85\xf0\x11\x75\x67\x26\xba\x88\x9e\xfe\x4b\x1f\x55" + "\x9f\x6a\x27\xee\xc5\x5a\x95\x35\xdd\x02\xb8\xf8\x23\x89\x6f\xa3" + "\xe7\xe9\x97\x7a\x55\xb7\xda\x36\x1b\xca\xb1\xb9\x4d\x4d\x5a\x97" + "\xda\x16\xfb\x6e\x1a\x78\x6e\x4e\xa2\x4f\x6e\xa5\xb4\x70\x11\x51" + "\x16\x1e\x23\xe1\xdb\x16\x11\xd5\xb6\x63\x44\x53\xdf\xda\x4c\x1a" + "\x4e\x58\x48\xc3\x99\x4f\x49\xc3\x79\xb8\xba\xe0\xe2\xe1\xca\xfe" + "\x94\xd4\xb7\x13\xf2\xcc\x49\x42\xb2\x5a\xa9\xe3\xce\x16\x12\x55" + "\xef\x6a\x26\x38\x8f\xf7\x14\xf7\x03\xb5\x2a\x91\x44\xd1\x2f\xb5" + "\x84\x2e\xd6\x72\xf0\x4e\x89\xe9\x56\x97\x83\xd4\xb7\x3a\xe1\xfd" + "\x0d\xed\xf0\x5e\x99\xd5\x0a\xe5\xf3\x16\xdc\x2f\xce\x51\x9f\x5d" + "\x0b\xed\x9b\x9e\x0d\x74\x36\x48\x3e\x59\x61\x17\x89\xd9\x06\x6c" + "\x46\xcc\xc4\x53\x86\x99\x5d\x5d\xc1\x62\xe6\x07\x6c\xff\xb3\xe5" + "\xda\xd1\x40\xef\x9b\xf8\xe5\x09\x9a\x59\x9f\x7e\x4e\x71\x9e\x16" + "\x8e\xcf\x34\x76\x1c\x26\xd6\x2d\x3c\x89\x5f\x47\xc8\x4c\x37\x21" + "\x48\x13\x1c\x4b\x9e\x65\x24\x91\x38\x7f\x8c\xff\x97\x7e\xb4\xb5" + "\xd5\x41\x36\xba\xa0\xae\xa7\x9c\x3d\x75\x6d\xdc\xd2\x48\xe0\xdd" + "\x4d\x8d\x06\x3b\x51\x19\x89\x06\xe9\x0c\x7e\x51\xc2\xac\x36\x32" + "\x72\x65\x07\xa5\x48\x63\xa4\x2d\xd2\x19\xcb\x93\x68\x6f\x4d\x72" + "\x90\x2c\x27\xd1\x58\x33\xe1\x9e\x4e\x1d\x56\xf2\x2d\x81\x3a\xea" + "\xa8\x7a\x7a\x36\xe0\xa3\x03\x31\x61\xe7\x6e\x88\x01\x1c\x8c\xa6" + "\xf9\xdf\x6f\xad\x80\xf6\xe2\x18\x7e\x70\x6d\xd6\x06\x32\xfe\xd1" + "\xcb\x27\x94\xe1\xb9\x99\xe1\xf9\x26\x17\xe0\xb9\x0a\xf0\x7c\x84" + "\xe1\x79\xd8\x99\x00\xf0\xdc\xe2\xc1\xf3\x8d\x23\x3d\x78\xbe\xe9" + "\xa4\x7f\x3c\xdf\x34\x43\xc4\xb3\xe3\xca\xc4\xf3\x8d\x47\xfb\xc7" + "\xf3\x8d\x07\xfa\xc1\x73\x9b\xe4\xef\x0e\x0d\x9e\x6f\x8a\xba\x84" + "\x78\x6e\x0e\x0d\xcf\x37\x3a\xbc\xf1\x7c\x23\x61\x78\xd6\xee\x0f" + "\x0d\xcf\x37\xfb\x3d\xff\xa0\x3f\x7f\xdb\x83\x67\x8b\xa8\x9f\xc7" + "\xd4\xd3\x08\x0b\xe8\x67\x8b\xa8\x9f\xaf\x3b\x36\x30\x9e\x2d\x32" + "\xfd\x7c\xf3\xa7\x1e\x3c\x8f\xf9\xd0\x3f\x9e\xc7\xdc\xc8\xf0\x6c" + "\xb9\x42\xf5\x73\xf4\xbb\xfd\xe3\x39\xba\xc0\x3f\x9e\x2d\x06\x29" + "\x96\x18\x1a\x3c\x47\xb7\x5e\x3a\x3c\x5b\x42\xd4\xcf\xd1\x66\x6f" + "\x3c\xdf\x6c\x63\x78\xbe\x79\x4b\x68\x78\x1e\xe3\x77\xfe\x73\x7f" + "\xb1\x8c\x0c\xcf\xa2\x7e\xd6\x95\x01\x9e\x41\x3f\x5b\x44\xfd\x7c" + "\xfd\xc7\x01\xe0\x59\xa6\x9f\x6f\xd9\xeb\xc1\xb3\xce\xe4\x1f\xcf" + "\xb7\x7e\x23\xe2\xf9\x0a\xd5\xcf\xb7\x6e\xec\x1f\xcf\xb7\xce\xeb" + "\x07\xcf\x6d\x52\x9c\x36\x34\x78\xbe\x75\xff\x25\xc4\x73\x88\xfa" + "\xf9\xd6\x22\x6f\x3c\xdf\xb2\x9b\xe1\xf9\x96\x39\xa1\xe1\x59\xe7" + "\xf7\xfc\x9f\xfe\xe2\x44\x0f\x9e\x6b\x45\xfd\xfc\xc3\x64\x1a\x51" + "\x0b\xfa\xb9\x56\xd4\xcf\x0f\xe4\x0f\x8c\xe7\x5a\x99\x7e\xbe\x6d" + "\x9d\x07\xcf\x3f\x7c\xc9\x3f\x9e\x6f\xff\x33\xc3\x73\xed\x15\xaa" + "\x9f\x6f\x7f\xa6\x7f\x3c\xdf\x3e\xc1\x3f\x9e\x6b\x0d\x52\x0c\x3c" + "\x34\x78\xbe\x7d\xcb\xa5\xc3\x73\x6d\x88\xfa\xf9\xf6\x44\x6f\x3c" + "\xdf\x66\x64\x78\xbe\x6d\x6c\x68\x78\xfe\xa1\xdf\xfd\xdf\xfa\x8b" + "\xc1\x65\x78\x16\xf5\xf3\x8f\xa6\x00\x9e\x41\x3f\xd7\x8a\xfa\xf9" + "\xc5\xc7\x03\xc0\xb3\x4c\x3f\x8f\x9d\xe1\xc1\xf3\x8f\xee\xf2\x8f" + "\xe7\x3b\xb6\x8a\x78\xbe\x42\xf5\xf3\x1d\x63\xfa\xc7\xf3\x58\x57" + "\x3f\x78\x6e\x93\xfa\x17\x86\x06\xcf\x77\xcc\xb9\x84\x78\x0e\x51" + "\x3f\xdf\x11\xe3\x8d\xe7\xb1\xb1\x0c\xcf\x3f\xec\x08\x0d\xcf\x3f" + "\xf2\x7b\xfe\x5d\x70\xfd\x1b\xe3\xa6\x60\xff\x46\x17\xf6\x6f\x78" + "\xe6\xfe\x19\x22\x6d\x0c\xcf\xdd\x80\xe7\xb7\xe5\x78\xfe\x1f\xdf" + "\xfe\x8d\x1f\xdf\xc8\xf7\xe0\x79\x5c\x2f\x3c\xf3\x80\xe7\x6e\x01" + "\xcf\xfa\x69\x52\xff\x86\xb5\x7d\x37\xe0\xe4\x04\xb1\xce\x06\x2c" + "\x17\x8a\x58\xfe\x1f\xc0\x32\xd0\x90\x07\x1a\xd7\xb7\x34\x93\x78" + "\x07\xa3\x65\x17\xd0\x98\x97\xe3\xb8\xab\x8d\x43\xfc\x22\x6e\x25" + "\x0c\x37\xac\x04\xec\xa6\x34\x91\x86\x34\xb8\xd6\xc3\x95\x09\x17" + "\x69\x22\xf5\x6d\x80\xdd\x65\x72\xec\xda\x44\xec\xfe\xf8\xd3\xfe" + "\xb1\xfb\xe3\xea\x4b\xd7\x97\xa1\x67\xfd\x5f\xff\x93\xa0\x89\x7f" + "\xf6\x73\x6a\x4d\x6f\x16\xf1\x79\x82\xc4\xbb\x48\x24\x7d\x51\x3f" + "\x5a\x95\x40\x34\x1b\xdc\x84\x33\x2d\x22\x1a\xd3\x67\xd0\x6e\x49" + "\x7e\x8f\x11\xd5\x61\xe7\x5f\x48\xfd\x99\x66\x52\x7f\xbe\x96\xd4" + "\xf3\x70\x9d\x80\x0b\xea\x1a\xbf\x44\xde\x6e\x87\xd8\x6e\x7d\x13" + "\x94\x35\xd6\x7f\xbb\xf5\x55\x42\xbb\x93\xa0\xdd\x5d\x9e\x76\x5b" + "\x41\x0e\x80\x3f\x37\xf1\x62\x7f\x48\xbc\x83\x8c\x5c\xe5\xa2\xb4" + "\x4b\xc4\x3f\xf2\xe7\xf0\x11\x27\x89\x37\x02\xcf\x16\x03\xfe\x5b" + "\x2b\x49\x56\x06\xe0\xbf\xcb\x89\xb8\x73\x58\xb3\x2f\x00\xfe\x7f" + "\xdc\x4e\x81\x7e\xdd\x88\xff\xff\x41\xfc\xff\x58\xc3\x0b\xf8\xff" + "\xd1\xc1\xd0\xf0\x3f\x2e\x10\xfc\x07\xd0\x1f\x32\x01\xf1\x5f\xd5" + "\x85\xfd\x21\x9e\x39\xa0\x03\xe1\x5f\xa6\xcf\xc7\xcb\xf0\x3f\xa1" + "\x1f\xfc\xdf\x29\xe1\xdf\x71\xf9\xf1\x3f\x7e\x00\xfc\x8f\xef\x0f" + "\xff\x43\xdc\xf7\x71\xe7\x25\xc4\xff\x9d\x03\xe0\xff\xce\x40\xf0" + "\xdf\x1c\x1a\xfe\xc7\xfb\xe0\x7f\xbc\x88\xff\x71\x21\xe2\x7f\x42" + "\x00\xf8\x0f\xa4\xff\x64\xe2\x14\xec\x3f\xe9\xc2\xfe\x13\xcf\x5c" + "\xe0\x01\xf0\x2f\xef\x3f\xb9\x4b\x86\xff\x89\xfd\xe0\xff\xee\x69" + "\x52\xff\xc9\xe5\xc7\xff\x5d\x03\xe0\xff\xae\x7e\xf0\x3f\xd4\x7d" + "\x25\x77\x5f\x42\xfc\xdf\x3d\x00\xfe\xef\x0e\x00\xff\x96\x10\xf5" + "\xff\x5d\x3e\xf8\xbf\x4b\xc4\xff\x84\x10\xf1\x3f\x31\x10\xfc\x07" + "\xd0\xdf\x72\x2f\xe2\x1f\xf4\xbf\xe5\x88\x6c\x4e\xf8\x40\xf8\x97" + "\xe9\xff\x18\x19\xfe\xef\xed\x07\xff\xf7\x48\xf8\xbf\x02\xf4\x7f" + "\xcc\x00\xf8\x8f\xe9\x0f\xff\x43\xdc\xb7\x72\xcf\x25\xc4\xff\x3d" + "\x03\xe0\xff\x9e\x40\xf0\x1f\xa2\xfe\x8f\xf1\xc1\x7f\x8c\x88\xff" + "\x89\x21\xe2\xff\xde\x00\xf0\x1f\x48\xff\xcc\xfd\x18\xcf\x82\xfe" + "\xaf\x9d\x23\x5b\x1b\x30\x00\xfe\xe5\xfd\x33\xf7\xc9\xf0\x7f\x7f" + "\x3f\xf8\x9f\x34\x4d\xea\x9f\xb9\xfc\xf8\xbf\x6f\x00\xfc\xdf\xd7" + "\x0f\xfe\x87\xba\x2f\x66\xd2\x25\xc4\xff\xa4\x01\xf0\x3f\x29\x00" + "\xfc\xd7\x86\xa8\xff\xef\xf3\xc1\xff\x7d\x22\xfe\xef\x0d\x11\xff" + "\xf7\x07\x82\xff\x00\xfa\x73\x26\x0b\xfd\x39\x5d\xd8\x9f\xe3\x59" + "\x23\x32\x10\xfe\x65\xfa\xff\x01\x19\xfe\x27\xf7\x83\xff\x9f\x48" + "\xf8\xbf\x02\xf4\xff\x03\x03\xe0\xff\x81\xfe\xf0\x3f\xc4\x7d\x37" + "\x3f\xb9\x84\xf8\xff\xc9\x00\xf8\xff\x49\x20\xf8\x0f\x51\xff\x3f" + "\xe0\x83\xff\x07\x44\xfc\xdf\x1f\x22\xfe\x27\x0f\x51\xff\xcf\x83" + "\xad\xd8\xff\xc3\xab\x6a\xe6\x74\x97\x15\x17\xf1\x05\xb6\xd9\x91" + "\x0a\x1d\x71\xa9\xea\x34\xd6\xd4\x0e\x32\xeb\x1c\xf0\xc4\x78\x8e" + "\xcc\x3f\xa7\xc1\xf3\x02\x63\x29\xc4\xff\x5e\x6b\x44\xe1\x72\x15" + "\x4c\xcf\xde\xb6\x92\x28\xdd\x11\x75\xc2\xfa\x49\xeb\x71\x27\xc1" + "\x36\x6f\x44\x1a\x9c\xf0\xd0\x00\xfb\xe0\xe8\x69\xbd\xa6\x22\x07" + "\xf2\x74\xd9\x49\x2b\xe0\xa5\xbe\xd5\x0e\xb4\x5f\x2f\x60\x0b\x79" + "\x01\xf5\xd9\xb2\xeb\x14\x51\xba\xbe\xd4\xde\x04\x3c\x8e\x52\xaf" + "\x25\x8a\xe8\x56\xca\x23\x2f\x91\x47\xc8\x57\xdd\x7a\x9c\xaf\xf4" + "\xe0\xd1\x46\xc0\xb7\xeb\x4b\xfd\x4d\x15\x90\x6f\xe8\xfb\x65\x1e" + "\x14\xc6\x3f\xe0\x9e\x51\xdf\x02\xb4\xcc\x9f\x1c\x22\x9f\x1e\x0c" + "\x60\xfd\x4b\x20\xfd\x14\x0f\x17\x60\x3f\x05\xf0\xe9\x48\x80\x7c" + "\x6a\xf6\x5a\xd3\x3a\xe4\x7c\x7a\x78\x42\x60\x7c\x7a\xf8\x35\x1f" + "\x3e\x0d\x71\xff\xc1\xc3\x6c\x3f\x18\xee\xe1\xb1\x8c\x4f\x0f\x25" + "\x87\xc6\xa7\x87\x43\x9a\xff\xdb\x3b\x9e\x9e\x3a\x09\xe3\x69\x1e" + "\xe2\xe9\xc0\xf8\x64\x49\xf0\x5a\x83\x3b\xe4\x7c\x9a\x72\x24\x30" + "\x3e\x4d\xbd\xcb\x9b\x4f\x43\x1d\xe7\x4e\x61\xe7\x41\x73\x53\xea" + "\x19\x9f\xa6\x44\x85\xc6\xa7\xa9\x01\xac\xff\x08\x24\xee\x7b\xa4" + "\x05\xe3\x3e\xe0\x53\x80\xf2\x64\x69\xf6\x5a\x33\x3c\xe4\x7c\x7a" + "\x24\x23\x30\x3e\x3d\xf2\x89\x0f\x9f\x86\x38\x1e\x7b\x64\x37\xe3" + "\xd3\x23\xa9\x8c\x4f\x53\x0f\x84\xc6\xa7\x47\xda\x86\x26\x3e\x89" + "\xdd\x82\xf1\x09\x0f\xf1\x49\x60\x7c\xaa\x4d\xf0\x5a\xe3\x3c\xe4" + "\x7c\x8a\x1d\x1b\x18\x9f\x62\x37\x7a\xf3\x69\xa8\xe3\x86\xd8\x38" + "\xc6\xa7\xd8\x68\xc6\xa7\x47\x93\x42\xe3\x53\xac\xdf\xf3\x3f\x83" + "\xf3\xa3\x1f\x9f\x80\x7e\x34\xf0\x29\x40\x79\xaa\x6d\xf6\x5a\x93" + "\x3d\xe4\x7c\x7a\xac\x3e\x30\x3e\x3d\x7e\x87\x0f\x9f\x86\xd8\xbf" + "\x7d\xcc\xc1\xf8\xf4\xd8\x41\xc6\xa7\xc7\x54\xa1\xf1\xe9\xf1\x40" + "\xe6\x7f\xf6\xb9\x0e\xab\xb7\xcf\xf7\x44\xf3\x95\xe5\xf3\x3d\x91" + "\x1e\x18\xaf\x9e\x68\xba\xb8\x3e\xdf\x13\x65\x8c\x57\x4f\x18\x19" + "\xaf\x1e\xaf\x0e\x8d\x57\x4f\xb4\x86\xba\x7e\xab\xb7\xdf\x37\x6d" + "\xcb\x95\xe5\xf7\x4d\x0b\x50\xff\x4d\xdb\x78\x71\xfd\xbe\x69\xa2" + "\xfe\x9b\x26\xea\xbf\x27\x43\xd4\x7f\xd3\x02\xd0\x7f\x7d\xaf\xfb" + "\xea\xed\xfb\xfd\x34\xe6\xca\xf2\xfd\xa6\xdb\x02\xe3\xd5\x4f\xc7" + "\x5d\x5c\xdf\x6f\x7a\x07\xe3\xd5\x74\x0b\xe3\xd5\x74\x4d\x68\xbc" + "\xfa\xa9\xdf\xf3\x5f\x06\x5a\x2f\xd6\xdb\xff\x8b\xbb\xc2\xfc\xbf" + "\xb8\x00\xfd\xbf\xb8\x8b\xec\xff\xc5\x89\xfe\x5f\x9c\xe8\xff\xfd" + "\x34\x44\xff\x2f\x2e\x24\xff\xcf\x9b\x57\x92\x0f\xf8\x54\xde\x95" + "\xe5\x03\x3e\xa5\x0f\x8c\x57\x4f\x6d\xba\xb8\x3e\xe0\x53\x33\x19" + "\xaf\x9e\xd2\x31\x5e\xcd\x30\x84\xc6\xab\xa7\xfc\x9e\x7f\x38\xd0" + "\xfa\xb4\xde\x7e\xe0\xcc\x49\x57\x96\x1f\xf8\x74\x80\xf1\xef\xcc" + "\xbb\x2e\xae\x1f\xf8\xb4\x18\xff\x3e\x2d\xc6\xbf\x4f\x87\x18\xff" + "\xce\x0c\x20\xfe\x0d\xa4\xdf\x6f\xd6\x5b\xe8\x03\xba\x0b\x6a\xe6" + "\x44\x02\xfd\x23\xd3\x09\xd7\x15\x0d\xfc\x52\x01\xbf\x36\xe9\x48" + "\x77\x01\xf0\xcb\xe1\x22\xb3\x56\x7f\x4e\x1b\xdb\xdd\xa4\x0b\x78" + "\x75\x01\xfc\x40\xab\xa3\x0d\xd7\xe8\x3d\x7c\x8c\x9b\x75\xd7\x8b" + "\xab\x35\x04\xf9\x85\xf4\x77\xab\xa6\x67\x53\xe0\x97\xc0\x3f\x55" + "\x93\xd6\x55\x50\x67\x7b\xe6\xe4\xe7\x74\x95\x9d\xd2\x06\x83\x13" + "\xea\x54\x52\xd4\x60\x68\x26\xf1\xad\x64\xa4\xee\x39\xe4\xcb\x33" + "\x47\x31\xdd\xea\x68\x26\xb8\xef\xa7\xd0\x07\xfe\xb9\x3e\xca\xf5" + "\xdf\x7a\x15\xee\xdf\x84\xeb\x0a\xa5\x3d\x9a\xac\x27\x4a\x05\xfe" + "\xfb\xf6\xa9\x0a\xfc\xff\x6f\xbd\xe6\x6d\x5c\x9f\x38\xe4\xbe\xe0" + "\x33\x42\xff\x1f\xff\xb9\xf6\x26\xa9\x8e\xab\x92\x29\x85\x3a\x8e" + "\x6e\xec\x70\x10\xac\x67\x63\x87\x99\x64\xa5\x12\x4d\x63\x57\x1b" + "\xc9\xec\xa0\x8e\xc6\xec\x6f\x48\xfc\x39\x1c\x17\x40\x3c\xcd\xba" + "\x83\xf1\xfb\x99\xd9\xfc\xe7\xfa\x9b\xec\xdc\xac\xe8\x46\x1b\x21" + "\x91\x9b\x80\xd6\x2e\xc2\x09\xeb\x35\x39\x12\x0e\xf4\x32\x58\xb3" + "\x8f\x11\x1a\x51\x3f\xdb\xea\xfa\x0c\xe9\x69\x80\xf7\x53\x7a\xc6" + "\x1b\x22\xea\x9f\xc3\x34\xa4\x2d\xce\x33\xb5\x1a\x1d\x42\x1e\xe9" + "\x3d\xe3\x5d\x36\xb1\xa6\x77\x91\x46\x17\x21\x80\x0f\x57\x5d\x42" + "\x33\xe0\x6b\x66\x88\x7a\x7b\xd6\xee\xa1\xe9\xaf\x9c\xdd\x81\x7e" + "\x2b\xe0\xeb\x08\xab\xe3\xb0\x33\x01\xe0\xab\xd9\x83\xaf\xd9\xa6" + "\xc1\xe1\x6b\xf6\xd4\x21\xc6\xd7\x10\xfb\xaf\xb3\xc3\x07\x87\xaf" + "\xd9\xaf\x31\x7c\xc5\x57\x31\x7c\xcd\xce\xf0\xe0\x6b\xd8\x99\x8b" + "\x87\xaf\xf8\x79\x0c\x5f\xf1\xd1\xa1\xe1\xeb\x59\x32\x34\xfd\xac" + "\x3f\x9b\x83\xbe\xb6\xbb\xc0\x22\xea\xaf\xeb\x8e\x0d\x8c\x2f\x8b" + "\x4c\x7f\x3d\x77\x72\x70\xf8\x7a\xae\x7c\x68\xf1\x35\xd4\x3e\xf7" + "\x73\x86\xc1\xe1\xeb\xb9\xaf\x18\xbe\x9e\xd3\x30\x7c\x3d\xd7\xe2" + "\xc1\xd7\x75\xc7\x2e\x1e\xbe\x9e\x3d\xc0\xf0\xf5\x6c\x46\x68\xf8" + "\xfa\x59\xe2\xd0\xf4\x0f\xcf\xdd\x8f\xf1\x01\xe0\x4b\xd4\x5f\xd7" + "\x7f\x1c\x00\xbe\x64\xfa\x6b\xee\x33\x83\xc3\xd7\x1c\xf7\x10\xe3" + "\x6b\x88\xe3\x84\x39\x96\xc1\xe1\x6b\xee\x34\x86\xaf\x39\x46\x86" + "\xaf\xb9\x53\x3c\xf8\xba\xfe\xe3\x8b\x87\xaf\x39\xd1\x0c\x5f\x3f" + "\x6b\x09\x0d\x5f\x73\xcd\x43\xd3\xaf\x9d\x10\x85\x31\x8d\xbb\xa0" + "\x56\xd4\x5f\x0f\xe4\x0f\x8c\xaf\x5a\x99\xfe\xfa\xc5\xbb\x83\xc3" + "\xd7\x2f\x5e\x1a\x5a\x7c\x0d\x75\x6c\xf3\x0b\xfd\xe0\xf0\xf5\x8b" + "\x77\x18\xbe\x7e\x6e\x63\xf8\xfa\x45\x99\x07\x5f\x0f\xe4\x5f\x3c" + "\x7c\xfd\x3c\x83\xe1\xeb\xe7\x53\x42\xc3\x57\x82\x6e\x68\xfa\xe3" + "\x5f\x48\xc5\x38\x0c\xf0\x25\xea\xaf\x17\x1f\x0f\x00\x5f\x32\xfd" + "\xf5\x82\x7a\x70\xf8\x7a\xfe\xc3\x21\xc6\xd7\x10\xc7\x63\xcf\xe7" + "\x0d\x0e\x5f\x2f\x0c\x63\xf8\x7a\x3e\x86\xe1\xeb\x79\x97\x07\x5f" + "\x2f\x3e\x7e\xf1\xf0\x95\xd0\xc2\xf0\x95\x50\x16\x1a\xbe\x5e\xc8" + "\x1e\xba\x71\x84\x79\xcd\x83\x8b\x21\xe7\xad\x1e\x1c\xc6\xe6\xdd" + "\x76\x65\xc7\x90\x2f\xb6\x0f\x0e\x63\xf3\x96\x31\x8c\xbd\xf8\x16" + "\xc3\xd8\xbc\xc4\x4b\x13\x43\xbe\x18\xcb\x30\xf6\x22\x09\x0d\x63" + "\xf3\x86\x70\xfc\x63\xc1\x94\xc1\xc5\x91\xf3\x3f\x19\x1c\xc6\xe6" + "\xbf\x76\x65\xc7\x91\xf3\x67\x0f\x0e\x63\xf3\x1b\x18\xc6\x5e\x72" + "\x32\x8c\xcd\x3f\x78\x69\xe2\xc8\x97\xf6\x30\x8c\xbd\x14\xe2\xb8" + "\xcd\x82\x90\xd6\xbf\xf4\x3d\x6e\xb3\x70\xf7\xe0\x62\xc9\x85\x0f" + "\x0e\x0e\x63\x89\xdf\x5c\xd9\xb1\x64\xe2\xfe\xc1\x61\x6c\xe1\x3d" + "\x0c\x63\x89\xf3\x18\xc6\x16\xea\x2f\x4d\x2c\x99\x18\xce\x30\xb6" + "\xc0\x12\x1a\xc6\x16\xee\x1b\xba\xf1\xa6\x24\xe5\xe0\xe2\xc9\xc5" + "\xe5\x83\xc3\xd8\xe2\x67\xae\xec\x78\x72\xb1\x76\x70\x18\x5b\xfc" + "\x4b\x86\xb1\x45\x66\x86\xb1\xc5\x05\x97\x26\x9e\x5c\x94\xcc\x30" + "\xb6\x68\x42\x68\x18\x4b\x0a\x60\xff\xff\x40\xc7\xc9\x96\x1a\x06" + "\x17\x53\x2e\x55\x0c\x0e\x63\x4b\xfe\x70\x65\xc7\x94\x4b\x32\x06" + "\x87\xb1\x25\x17\x18\xc6\x96\x8c\x65\x18\x5b\xe2\xb8\x34\x31\x65" + "\x92\x8d\x61\x2c\xa9\x28\x34\x8c\x2d\x4d\x1d\xba\xf1\x3d\x43\xfd" + "\xe0\xe2\x4a\xc3\x92\xc1\x61\xcc\xf0\xfd\x2b\x3b\xae\x7c\xd9\x3e" + "\x38\x8c\x19\x5e\x62\x18\x7b\x39\x8f\x61\xcc\x30\xe7\xd2\xc4\x95" + "\x2f\x4f\x62\x18\x5b\x1a\xe2\x7e\x14\x86\x5e\xfb\x5f\x2d\x5b\x99" + "\xb6\x30\x79\x59\x92\x6e\xd9\xca\xd4\x94\xd5\xba\x57\x97\xad\x5f" + "\x32\xf5\x8e\x35\x13\x74\x29\xe9\xba\x94\x65\x2b\x5f\x16\x13\x92" + "\x46\x91\xe7\x96\x24\x2f\x4c\xc7\x14\xc8\xfd\xf2\xca\x15\x4b\x56" + "\xa6\xea\x52\x96\xac\x5e\xb3\x2c\x65\x09\xfe\xff\xaa\x6e\xe9\xaa" + "\x14\x48\x58\xbc\x64\x59\xda\x12\xdd\xa2\x35\x4b\x97\x2e\x49\x79" + "\x75\x14\x79\x66\x4d\x72\xea\x32\x63\xf2\x12\xdd\x93\xcf\x3c\x76" + "\xd7\x9c\x69\x3f\x9b\xf3\xe8\xa3\x78\x38\x99\xec\x6c\xb2\x68\x5a" + "\xd0\xa4\x01\xcc\x29\x8f\x73\x29\x4b\x1a\xc1\xba\xe0\x79\xb6\xdb" + "\xce\x10\xcd\xd6\x14\xa2\xcc\x3b\x43\xc2\x4d\x67\x88\x4a\xf7\x0a" + "\x89\xa5\xa6\x91\xd9\x90\x1e\x45\x4d\x8f\x99\x69\x61\x49\x29\x35" + "\x4d\x27\x0e\xf5\xf8\x2a\xcc\x4b\x4d\xe3\xec\xf8\x0e\x68\xab\x84" + "\x74\xc3\x31\x2e\x65\xac\x43\x7d\x67\x51\xd6\x37\x84\xa3\xa3\x5e" + "\x09\x7f\x8f\x77\x70\x7f\x47\xe9\x82\xb6\x13\x6e\xb9\x0e\x2e\x15" + "\x5c\x07\xe0\xaa\x87\xab\x99\x70\xc9\x04\xae\x70\xb8\xa2\xe1\xd2" + "\xc3\x35\x09\xae\x29\x70\x3d\x09\xd7\x4c\xb8\xe6\xc0\x65\x83\xcb" + "\x41\xb8\x15\x90\x77\x85\x96\x95\xb3\x62\x2c\x5c\xb3\xe1\x2a\x85" + "\x0b\xca\x5a\x69\x81\xab\x83\x70\xab\xde\x82\x2b\x0a\xae\x18\xb8" + "\x80\xfa\xab\xe6\xc1\x95\x0d\x79\xf4\xec\x9d\x11\xd2\x8c\xa9\x04" + "\xea\x39\xf0\x65\xc4\xfc\x65\x70\x99\x09\xb7\x1a\xbe\xb9\x7a\x0b" + "\x5c\x47\xfa\xf9\x4d\xf4\x00\x65\x4e\x89\xdc\x74\xab\x5d\x38\x03" + "\x8f\x5b\xbe\xd1\x9d\x43\xc2\xdc\xa6\x3b\x8b\x8c\xe3\x89\xe2\x04" + "\xb7\x7c\x86\x75\x0b\xea\x99\xc7\xcc\xc2\x99\x8e\xf0\x8c\x34\xeb" + "\xcc\x5f\x1e\x67\x27\xef\x6b\xf0\x4c\xb3\xe0\xf0\xb6\x3c\x4e\xfc" + "\x7d\x9e\x5d\x31\xa3\x4a\x38\x03\x2e\x9f\x2f\xa3\x59\x09\x6f\x0b" + "\x67\xbf\x21\x0d\x51\x0e\xf2\xdc\x0e\x1a\xee\x9c\x83\x32\x6f\x5e" + "\x2f\xd4\xeb\x36\x9a\x43\x22\xe0\xf7\x3a\x0a\x75\x73\xa8\x4b\x4a" + "\xa1\x9e\x4a\x7c\x76\x9b\xc6\x57\x5d\x50\x5b\x1d\xf8\xbf\xb3\xbc" + "\x58\x47\x0b\x6c\x5a\x8c\xb3\xcd\x99\xc5\xe4\x18\xfc\xee\x82\xba" + "\xa9\x5a\xf7\x54\x24\x3d\x86\xbf\xcd\xc1\x3d\x6a\x97\xef\x67\xb2" + "\xba\x5c\x77\x41\x5d\xb2\xdb\x5d\xda\x64\x87\x74\xa5\xdb\x54\x52" + "\xca\xca\x1f\x0f\x7a\xb2\xce\x6c\xe7\x92\x35\x42\x7a\x59\xf1\x64" + "\xe9\x7f\xb8\xab\xdc\x85\xb6\x04\xbc\xab\x37\x91\x0e\xe1\x39\x27" + "\x96\xb0\xbb\x86\xe8\x9e\x22\xa4\x9d\x4b\xfe\x60\xa2\x85\x28\xcc" + "\x4f\x61\xbd\x93\xb3\xb3\x2c\x94\xd7\x65\x86\xc1\xf7\x93\x37\xf5" + "\x7c\xf7\xc6\xa6\x66\x3c\x23\x95\xe6\x2f\xd3\xee\x2a\x26\x04\x7f" + "\x8b\x75\xdb\x31\x9a\x28\xcb\x8b\x49\x38\xb6\xb1\x33\x3f\x79\x9f" + "\x74\x0e\x1d\xfe\x86\x83\xfc\x33\x66\x64\x51\x59\xd9\xeb\xdc\xac" + "\x3d\xd1\x8c\xa6\xc9\x2d\x76\xc5\xf4\x7d\x98\x5f\x77\xbb\x40\xcb" + "\xdb\xc4\xf7\x3a\xe4\x27\x96\x4f\x4d\x4d\x1a\x7c\xc6\x73\xee\x22" + "\x01\x99\xba\xcc\xb1\xd5\x8c\x46\x36\x2d\x96\x83\xf9\x69\x61\x1d" + "\xfe\x6f\xa6\x26\x81\xc6\x7a\xdd\x4a\x12\x7b\x8c\x5b\x31\xc3\xbd" + "\x95\xce\x83\x32\x62\xe9\x56\x9a\x08\xf9\x63\x04\x7a\x9b\xea\xaa" + "\xec\xdc\x8a\x29\xf0\x2e\xb1\xe7\xec\x4b\x46\x67\x05\xe4\x33\x76" + "\xe6\xaf\x30\xda\x15\xf3\x0f\x08\x7c\x4e\xa3\x47\xf0\x8c\xcd\xb3" + "\x69\xd4\x15\xef\xfa\x9c\x07\x5d\x45\xe0\x7d\x91\x9d\xcc\xd3\x48" + "\x6d\x64\xbc\xef\x29\xe7\x36\x7c\x76\x8c\x14\xca\xa9\xee\xab\x1c" + "\xf8\x76\xf6\x02\x97\x4e\xd1\x75\x9e\xda\xb6\xfd\x1c\xe9\x48\x68" + "\x57\x1a\xad\xdf\x18\x47\x9d\x85\x1f\x13\xd2\x60\x68\x21\x20\xf3" + "\xd1\x11\x0a\xea\x88\x5f\x47\x22\x23\x8c\x91\xb4\xd6\xd2\x42\x36" + "\xc4\xd1\x36\x3c\xc3\xb7\xb1\xa3\x95\x64\x7c\x4a\x54\x59\x0d\x24" + "\x2a\x23\x8e\x3a\xea\x13\x5b\x08\x4b\x6f\x20\x59\x5f\x10\xe5\x86" + "\x83\xd4\x39\x0b\xf4\x7f\x5d\x0b\xa6\xb7\x12\x3c\xa3\x32\xab\x8d" + "\xba\x32\x5f\x22\x2a\xfc\xbf\xe1\x20\xa6\x7f\x45\xb2\x4e\x12\x65" + "\x7c\xba\x23\xb2\x02\xbe\x89\xbf\xdf\x05\x75\xe1\xcf\xd3\x03\xdb" + "\xce\x13\xb2\xe1\x79\xa2\xcd\x58\x48\x34\xf1\x6e\x42\xad\xae\x0f" + "\x48\xbc\x9b\x82\x7d\x39\x44\x36\x2e\x23\xe1\xf1\x2e\x5c\xc7\xf6" + "\x09\xc1\x73\xba\x77\x41\x5e\x68\x9b\x19\xdb\xb6\xe1\x28\xd1\xe2" + "\xf9\xe4\xec\x37\x1f\x8a\xbf\x39\x4a\x90\x66\x17\xd4\xd3\x1c\x4e" + "\xd3\x74\x23\xb4\x7d\x0b\xd2\x00\xbe\x63\xe3\xf1\x77\xf0\xfb\x6d" + "\x29\x02\x0d\x14\x0b\x5c\x44\xe5\x36\xd5\x95\x2e\x48\x37\x0b\xe5" + "\xda\xb9\x95\xe6\x5d\x29\x42\x9d\xbc\xf2\xc6\xbb\xe8\x59\x87\xba" + "\x0e\x70\xbf\xb2\x2d\x3e\xfd\x51\x8a\xbf\x05\x5e\x26\x77\xe6\xaf" + "\xd2\x4b\xf4\x96\xf8\x62\xe7\x56\x45\x03\x2f\x92\xc3\x8c\x44\x09" + "\xef\xe3\xec\x8a\x85\xa5\x32\xac\xed\x07\x9e\x0f\x97\xf2\x8a\x79" + "\x92\xed\x8a\x05\x76\x59\x1e\xc4\x57\x4f\x1e\x78\x5f\x60\x57\x24" + "\xb6\xb1\x6f\xac\x9a\x89\x79\x44\xdd\x2f\xe5\x0d\xa3\x79\x4e\xbd" + "\x5b\x6d\xd3\x51\x8e\x3a\x01\x8f\xd5\xf4\xac\x56\x35\xcb\x45\x9d" + "\xbc\xe9\x30\xea\x79\x15\x9e\xeb\xca\xf2\x1b\xc7\xc0\x7b\xb3\x2e" + "\x4d\xf8\x3f\x06\xbf\x43\x0b\x4a\xcc\x3d\xef\x72\xc8\x30\x5a\x5e" + "\xac\x01\xdb\xa1\x89\xb7\x50\xa7\xdb\xb4\x5d\x53\x98\x82\xb6\xc3" + "\x26\xc8\x35\xaf\xae\xb3\x38\x77\x34\x99\x51\x3f\xa1\x8c\xd0\x82" + "\xc3\x55\x62\x3d\x3e\x40\xb9\x61\xba\x66\x55\x87\x1b\xca\x80\x3a" + "\x4d\x80\x77\xc3\x8e\x71\x46\xb4\xe9\x04\x9e\x93\x84\x73\x2f\x39" + "\xe3\x0a\x86\x5f\xa7\xde\xeb\x99\x13\x64\xde\x0c\xbe\x4d\x29\xea" + "\x07\x48\x37\x79\x64\x58\xa0\x1b\xc7\x74\xd1\x61\x33\xd3\x23\x61" + "\x3c\xe4\x53\x1c\x13\xe5\xf1\xc2\x48\x9a\xd4\x99\x6f\x04\xfc\x3f" + "\x36\xdb\x4b\x4e\xf2\x3b\xcc\x78\xc6\x26\xd4\x25\x0c\xca\xfc\x0a" + "\xee\x23\xe0\xfe\xcd\x47\x16\xe4\xb7\x50\xee\x75\xf8\xff\x8e\x1b" + "\xa8\xe3\xc9\x69\x04\xcf\xd3\x04\x79\x5b\x4d\xec\x64\x6b\x14\x96" + "\xb3\x15\xcf\x19\x85\x34\xcc\x03\xe9\x5a\x3b\xc9\x57\x8a\xe5\x9b" + "\x3b\xa0\xae\xde\xe5\xaf\x9e\xca\xca\x67\xe5\x62\x79\x52\xd9\xe5" + "\x25\xb4\x5d\x2c\x7b\x9e\x54\xb6\x09\xd2\xa4\xf2\x9f\x5c\xd1\xf3" + "\x8d\x0c\x78\x5f\x20\x6f\x43\x69\x09\xed\xc0\x32\xe0\x5d\xa9\x9d" + "\x54\xc4\xe2\xbb\x3c\x48\xc3\xdf\xca\x70\x15\xf6\x11\x58\x8d\x8f" + "\x0e\x0a\x65\x98\xed\xa4\xcc\xe2\xa3\xe3\xd4\x92\x8e\x13\xcb\x6a" + "\x95\xca\x92\x95\xc3\xf0\x54\xa0\xd4\x8b\x7c\xc5\x72\x55\x58\x6e" + "\x67\x7e\x4a\x94\x9d\x14\x44\xcb\xdb\x0e\xb2\x15\x4d\x0b\x6d\x7a" + "\xd4\x63\x62\xfe\x19\xa8\x93\xa5\x7a\xe3\x39\xa3\xa0\xbb\x63\x51" + "\x5e\x04\xfd\x6d\xaa\xdb\x0d\xe5\xcc\xf3\xd1\xd7\x4a\xcc\xe7\xce" + "\x5f\xb6\xa6\x1c\xcf\x59\xbd\x81\xb6\x41\x9e\x6c\xaf\xb3\x45\x39" + "\xf2\x08\xa4\xbd\x25\x9d\x71\x5a\x08\x79\xec\xdc\x32\xbf\x7b\x38" + "\x66\xde\x46\x38\x6b\x99\x1d\xfd\x67\xc4\xd5\x14\x6b\x74\x07\xb1" + "\x96\xf1\x84\xaf\x28\x8e\x8d\xcd\xa4\xe6\xe3\xdc\xab\xd7\xe3\xd9" + "\xd4\xc1\xd9\xe4\x94\x16\x01\x4f\x5d\xe0\x57\x66\xdc\x4b\xd0\x0e" + "\x9f\xe2\x52\x1f\xb3\x3a\xce\x08\xb2\x05\xff\x0b\xeb\xa3\xdf\x04" + "\x3f\x14\x7d\x51\xf0\xff\x0d\x45\x1c\xf3\x47\x79\xc8\x5b\x81\xe9" + "\xe8\xab\x82\x9e\xdc\x25\x7b\x47\x2b\xde\x70\x32\xda\xbd\x7a\x41" + "\xb0\x07\x58\x5f\xd7\x4f\xcd\x58\x67\xbe\xec\x0d\x27\xb6\x21\x2b" + "\x9d\xf2\x56\x57\xa7\x19\x75\xa9\x2e\x0d\xfd\xe8\x57\x3f\x89\x2f" + "\x27\x94\x2f\x7f\xc3\x19\x5c\x1b\x5e\xdd\x8d\xdf\x84\x58\xe1\x94" + "\x63\xcc\x1b\x4e\x3c\xeb\x79\x5b\xe6\xb0\xf0\x27\xca\xa8\xf9\xec" + "\x2d\xc5\xb1\x9d\xf9\xaf\x3a\xa5\xb3\x74\x83\x2c\xd7\x29\xb5\xbd" + "\x42\x6c\x3b\xa4\x09\x67\xf6\x4c\x2c\x15\xce\xf2\x86\xe7\x54\xbf" + "\x67\x7d\xd2\x82\x3a\x3d\xfe\x16\xda\x1e\xbb\x4b\xa2\x93\xcb\x81" + "\xe7\x98\x5f\x7f\x82\x4b\x3d\x14\x9f\x61\x26\xc2\xbe\xfd\xa6\x3a" + "\x7d\x70\xf5\x4a\x15\xe6\xbf\x37\x42\x9c\x12\xef\xfa\x1b\x65\x7a" + "\x2f\xf5\xe4\x2c\xb1\x3c\x7c\x27\xf1\xaa\x42\x8c\x1f\x42\xf8\x86" + "\xdf\xf3\x0f\x64\xed\xd2\xf4\x6e\xd7\x9a\xf2\xd0\xdb\xb5\xc6\xd0" + "\xbb\x5d\x6b\x0e\x0d\x6d\xbb\xd6\xd4\x07\xd0\x2e\x5d\xef\x76\xa5" + "\xad\x09\xbd\x5d\x69\xb1\xbd\xdb\x95\x56\x3e\xb4\xed\x4a\xdb\x13" + "\x40\xbb\x62\x7a\xb7\x6b\xed\x33\xa1\xb7\x6b\xad\xb6\x77\xbb\xd6" + "\xae\x19\xda\x76\xad\xcd\x08\x5a\x1f\x16\xda\x8c\x4c\x1f\xa6\xdf" + "\x16\xbc\x3e\x5c\xdb\xde\x5b\x1f\xae\x7b\xd6\xa3\x0f\xd7\x4d\x0d" + "\x49\x1f\x16\x96\x88\x3e\xc5\xba\x91\xbd\xf4\x61\x41\x49\x55\xdf" + "\xfa\x30\xfd\x2b\x41\x1f\x9a\x4a\xaa\x82\x6b\x43\x7a\x55\x8f\x3e" + "\x54\x97\x54\x79\xe9\xc3\x08\x1b\xf8\xd3\xeb\xc2\x43\xd3\x87\xeb" + "\xc2\x7b\xeb\xc3\x74\x83\xb7\x3e\x5c\x17\xdb\x0f\x0e\x2b\xfb\xd2" + "\x87\xf1\xae\xd3\x54\xc4\x46\x65\x90\xf5\xf1\xbb\xfe\x1b\xbe\x15" + "\x33\xc0\xb7\x82\xec\x2b\x59\xaf\xf4\xfb\xad\x70\x67\x1c\xf8\x19" + "\x9a\x8d\xbf\x22\xdc\xf1\x0c\xc2\x35\x46\x37\x43\x1c\xe0\x24\x77" + "\x1b\x01\x13\x39\x64\x4a\x63\x59\x3b\x69\x8c\x3e\x4e\xe8\x48\x67" + "\x1c\xfd\x4d\x71\x55\x6c\x0a\x62\x73\xfd\x87\xd6\x54\x67\x90\xd8" + "\x5c\x9f\x27\x61\xb3\xd1\x05\xd8\x4c\x43\x3c\x6e\x38\x69\x6d\x3f" + "\x21\x62\x73\xc3\xa7\x3d\xfc\xc9\x61\xf8\xec\x13\x9b\x20\x13\xde" + "\xd8\xac\xd3\x31\x6c\x6e\x78\xa7\x37\x36\xeb\x74\x7d\x63\x73\xc3" + "\x26\x86\xcd\xba\x20\xfb\xda\x36\xcc\xf4\x60\xb3\x4e\xe7\x85\xcd" + "\x1f\x15\x57\x75\xe6\x6f\xd8\x13\x1a\x36\x37\xec\x91\xda\x5e\x2e" + "\xb6\x1d\xd2\x94\xde\xd8\xdc\xd0\xe2\x97\x87\x79\xad\x79\xa0\x0f" + "\x55\x27\xb8\x8c\x7d\x6e\xf0\x5b\xf9\x82\x89\x95\x10\x77\x75\xe2" + "\x99\xf1\x94\x9b\x44\xe8\x5a\xbd\xaa\x13\xe2\xdf\xce\x4e\x43\x38" + "\x1d\xd5\xf9\x31\xed\xd6\x12\xa8\x7b\x24\xed\xd4\x47\x00\xcd\xc6" + "\xc2\x7d\x74\x79\x1a\x89\x82\x4b\x5b\x2e\xd2\x15\xfe\x8f\xa1\x6b" + "\xb5\xa3\x0a\xd3\xc8\x84\xc8\x0e\x12\x0e\x75\x48\x88\xdc\xa4\x21" + "\x91\x2e\x12\x85\xff\xd3\x9c\x63\xe9\x10\x9f\x29\xb1\xef\x93\x57" + "\xc3\xf7\xd2\x23\x29\x7d\x55\x4f\x20\x56\x0b\x07\x1e\x68\x77\x71" + "\xb4\xca\xbd\x56\xcf\xd1\x08\xdb\x9d\x74\x43\x82\x50\x27\x7e\x6c" + "\xb1\x03\x30\xe4\xa0\x59\x06\xfc\x6e\x2c\x9e\x5d\x4c\x7f\x54\xdc" + "\x41\x3b\xb5\xa3\x4c\xe7\xc9\x84\x5d\x69\x64\x6c\x45\x1a\xd1\xd3" + "\x6e\x3d\x07\x34\x48\x98\xbf\x5a\x83\x7c\x4f\xa0\x1c\x7c\x2b\x0d" + "\xbe\x05\xbc\x74\x9b\xe0\x5b\x2e\xf8\xd6\x69\xf8\xd6\x29\xf8\x56" + "\x0e\x7c\x2b\x87\x7d\x2b\x38\x9a\x6f\xec\xf7\xfc\xe7\xf8\x8d\xb7" + "\xe0\x5e\xba\x5f\x47\xa6\x8f\x88\xc3\xfe\xea\xb3\x1b\x0c\x41\xe2" + "\x7d\xa3\xdf\xfd\x9f\xb7\xbd\x47\xa2\xa9\x6a\x5c\xe5\xac\xd7\x3e" + "\xa7\x18\x47\xbf\xf6\x1e\x99\x80\x32\xd7\xe8\x3c\x49\xa8\x7a\x5c" + "\xe5\x21\x7d\x7b\xb0\xdf\xf2\x3b\xff\x21\x3f\x07\xe2\x66\x15\xc4" + "\xa1\x2a\xdb\xe4\x6d\x39\x34\xbd\x3b\xba\x58\xd3\x15\x5d\x1c\xb3" + "\xc0\xa5\x01\x5c\xd1\x74\x5d\x0a\xd1\x1d\xe7\xb6\x8c\x3b\x7c\x04" + "\x6c\xc4\x0b\x24\xfc\x18\xb7\x25\x31\xeb\x53\xec\x6b\xcc\x4c\xf5" + "\xee\x6b\xcc\x2c\x25\x5c\x76\x38\xe1\x36\x69\x09\x97\x33\x85\x40" + "\x3e\xef\x6b\x73\x02\x2b\x2b\xeb\xab\xf8\xbd\xb7\x90\x4c\x17\xfd" + "\x9a\x16\x6c\x0f\x2f\x84\xf8\x37\x7e\x9c\xc2\x6e\x4e\xc3\x3e\xb8" + "\xac\xa3\x40\xd3\x7f\x81\x5d\x8a\x84\xff\xf7\x02\xef\x88\x31\x85" + "\x7c\xef\x04\x97\x55\xe9\x82\xff\x23\x3b\x46\xc4\xb9\xb3\x12\x88" + "\x4b\xdb\x64\xee\x2e\xb0\x69\xdc\x10\xcb\xf2\xaa\x89\x95\xd8\x0f" + "\x62\x6d\x77\x93\x32\xc0\xdd\x02\x77\x38\xca\x43\x82\x79\xd1\x61" + "\x72\x3c\x95\x70\x59\xe7\x88\x9a\x9e\xd5\xab\x24\x5c\x3f\xd3\x1e" + "\xe9\xdc\xd8\x4e\x79\xc4\x37\xf6\x3b\xc0\xbb\x88\xcc\x73\x60\x6b" + "\x1d\x6d\xa4\x0c\xe2\x66\xf7\xab\x86\xd1\x8e\xb3\x86\xef\xbd\xcd" + "\x93\xa8\x88\x0e\xa2\x29\x3b\x03\x18\x7c\x15\xf0\x77\x06\x70\xee" + "\x60\x38\xc7\xb5\x42\x15\x88\xf1\xdc\xee\xea\x5d\x67\x18\xc6\x05" + "\xdc\x21\xc6\x57\x01\xee\x56\x7a\x70\xe7\x3a\x0b\x18\xcf\xdf\x98" + "\x50\x96\x43\xb1\x5f\x84\xdb\x75\x62\x04\xbe\x53\x0c\x1b\xc7\xe9" + "\x0e\xcf\x76\x12\x4f\x1c\xb6\x65\x61\xd7\x98\xe2\x18\xdd\x73\xf4" + "\xf4\x31\x2e\xeb\x08\xa4\x87\xeb\x7e\xfe\x63\x0d\xd0\x7b\x21\xeb" + "\xa3\xd8\x92\x88\x71\xbe\x1d\x68\x81\x74\xd1\x3d\x47\x7e\x7c\x8c" + "\xcb\xdc\x8b\x74\x5c\x5b\x49\xc2\x8c\x8f\xd0\x56\xa0\x59\x15\x96" + "\x67\xe7\x32\x85\x38\x0b\xc7\x3f\xea\x84\xbe\x4f\xf6\x1b\x37\xd0" + "\xcd\xa5\x2a\x31\x03\xbf\xf5\xe6\x57\xba\x04\x99\x43\x3a\x1e\x4f" + "\x26\xdc\x82\x76\xa0\x95\x1b\x68\xd5\x29\xe8\x82\xd9\x82\x2e\xc8" + "\xeb\xac\xcf\xb0\x53\x3e\x3e\x29\x8c\x66\xae\xc6\xb1\x17\x37\x99" + "\x6f\x24\x74\xe3\x49\xa0\x57\x47\x33\xea\x8d\x08\x7e\x2d\xd3\x0d" + "\x48\x2f\x75\x3b\xd1\xd0\xc2\x3b\x77\xbf\x97\x69\x19\xe6\x06\xfc" + "\xa2\x7e\x88\xdc\xa4\x18\x09\x72\x19\x51\x80\xf2\x0b\xf2\x1c\xb9" + "\x49\xd0\x57\x09\x65\x20\xb7\xae\xb5\xfa\xdb\xbb\xd7\xea\x75\x70" + "\xdd\x22\xe9\x10\x3c\xf3\xab\x1c\x69\x9b\xbf\xd1\x8c\xfa\xc3\x9a" + "\x6e\x27\x2e\xa0\x6d\x04\xda\x9b\xb5\xfa\x68\x81\xc6\x2f\xeb\xc9" + "\x44\x27\x51\x40\x9d\x34\x50\x5f\xb2\x6b\x29\x09\x6f\x30\x1c\x23" + "\x6e\x90\x0d\x89\xee\xcf\x2c\xd3\x11\x28\x97\x3b\xa4\xff\x84\x88" + "\x34\x53\xf8\xc7\x5d\xce\xfd\x1e\xdc\xe5\xdc\x8f\xb4\x63\xb8\xcb" + "\x99\x74\x35\xe2\xae\x2e\x41\xc0\x5d\x58\xf7\x18\x01\x4f\x55\x56" + "\xd7\x1f\x81\x46\x39\xd8\xb7\x49\x10\x33\xb5\xbf\x43\xcc\x6c\x8e" + "\xbb\x52\x31\x73\xa1\x53\xaf\x83\xeb\xa2\x60\x06\xca\x15\x30\x83" + "\xb4\xaa\x4b\xe8\x22\x12\x8d\x04\x59\x2d\x18\x57\xa9\xcb\x22\x8f" + "\x82\xac\x26\x46\x6e\xba\x85\x34\x08\x74\xda\x92\xa8\xfb\x39\xe5" + "\x8f\x71\x9b\x37\x65\x35\x11\x4d\x57\x0e\xa5\x56\xd7\xbb\x84\x57" + "\xd5\x59\xb0\x9f\x99\x2f\xd8\xae\x91\xc6\x70\xb0\x3f\x2e\xd2\x88" + "\xe3\x36\xe3\xab\xdc\xa6\x26\x0d\x6f\x1a\x67\xa7\xea\xe9\x06\xec" + "\x7b\xe3\x4d\x23\xb3\x79\xf5\x63\xe6\xce\xfc\xcd\x16\xbb\x82\x13" + "\xfa\xba\x69\x81\x0d\x7d\x17\xd0\x99\x9b\xbf\x15\xfa\x8b\xd5\xd8" + "\x77\xbe\xb9\x4d\x1a\x9f\x40\x9d\x20\xf6\xcb\x89\xfd\x76\x5b\x90" + "\x87\xa3\xb0\xdf\x8e\xe9\x94\xcd\x9f\x4a\xfd\x76\xd2\x33\xbe\xb7" + "\x73\x9b\x5b\xb0\xcf\x47\xf6\xbb\x04\x31\x9f\xf8\xbb\xcc\x97\x50" + "\xd7\x7b\x7e\xc7\x9e\x41\xaf\x24\x74\x73\x24\xbc\x4f\x1f\x43\xd5" + "\xa4\x01\xf9\x51\x1e\xe7\x5e\x7b\x09\xee\x1c\xd0\xe5\x02\xdc\xc3" + "\xe0\x5e\x8b\x65\x07\x67\xaf\xb6\x08\xeb\x3f\xa1\xfd\xf3\x44\xdd" + "\x28\xcc\xa5\x30\x8e\x27\xea\x13\xe2\xff\x9d\xf9\x5b\x1c\xd2\x38" + "\x8b\x27\x7f\x0f\x7f\x0a\xf0\xdb\xc0\x23\x25\x1b\xfb\x61\xcf\xb2" + "\xf2\x4c\xc2\x33\x51\xea\x80\x37\x36\x1c\xa3\x05\xfc\x2a\x3a\xa9" + "\xe1\x11\xf1\x3e\x15\xe5\x03\xfb\x4b\xd1\x5f\x13\xf5\xef\x5b\xec" + "\xbb\xaf\x81\xaf\x95\x39\x56\xfe\xdd\xbe\xe8\x61\xe7\x5e\xdb\xe2" + "\xef\x5d\x70\xb4\x78\x6d\xb7\xbf\x72\xa6\xe9\xdd\x34\xc8\xb2\xda" + "\xfd\xfa\x88\xd1\x6f\x38\xe2\x2b\xdd\x66\xbe\x3b\x21\xf2\x50\xc6" + "\xc9\x20\xfd\x8b\xdc\x27\xfd\x95\xeb\x56\xd5\xd9\x5d\x65\x6f\x38" + "\xb0\x4f\xb2\xb1\xd2\x45\xf6\x9e\x68\xe3\xe2\xc7\xdd\x42\xd4\xad" + "\x44\x83\xfe\xd3\x33\xed\x7f\xa3\xe8\x43\x15\x9e\x20\x63\xbb\x4e" + "\x27\x44\x76\x83\x2f\xf8\xfa\x09\x32\x85\x7f\x59\x3b\xaa\x60\x29" + "\x51\x76\x81\xbf\xda\xf5\xb2\x21\xb2\xae\xa5\x8d\xb8\xcb\xdf\x70" + "\x34\x76\xd8\x49\x05\xe4\xa5\x5f\x27\x44\xcc\x48\xa4\xce\xfa\xc4" + "\x62\x12\xaf\x77\x9b\x33\xbf\x20\x6a\xd0\x45\x1a\x6b\xfa\xbb\xc4" + "\xea\x3a\x49\x86\xad\xe3\x74\x56\xd7\x57\xc4\xb4\x14\x74\x18\xe8" + "\xac\xac\xe7\x41\x57\xbb\xce\x91\xb7\xe5\xba\xfa\x95\x5f\x7b\x74" + "\xf5\x69\xd0\xd5\xf9\xa0\xab\xb3\xb4\xa4\xd1\x68\x26\xa0\x3b\x46" + "\xcc\x32\x46\x3a\x33\x8d\xa0\xb3\xd7\x81\xce\x4e\xff\x8a\x08\xfa" + "\xba\xbd\x8d\x80\xae\x8d\x28\x5f\x49\xa2\xba\x57\x81\xce\x3e\x6d" + "\xf8\xde\x8e\x4c\xa6\xb3\x77\xae\x04\x9d\xbd\x0a\x7c\xe2\x95\xa0" + "\xb3\xdb\xfb\xd0\xd9\xa7\xfc\xf8\xc3\xa2\xfe\xe9\x5a\xa5\xe7\x76" + "\x72\x14\xc7\x55\xb8\x1d\x9f\x8d\x08\x12\x27\xff\x66\xf1\xc7\x03" + "\xa4\x37\xd2\x9f\x07\x3e\x34\x00\x0f\x04\xbf\xd5\x39\x22\xae\x1b" + "\x6c\x9a\x3b\xa2\x26\xe6\x77\x27\x9a\xb9\x88\x54\xa2\x99\x65\xfc" + "\x1b\xed\x7a\x35\x01\xfc\xfe\x04\xb5\xab\xa0\xce\x5e\x00\x3e\xb5" + "\x1b\x7c\xef\xee\x4e\x6d\x38\xd0\x40\xe3\x58\x6b\x88\x44\x1a\xf2" + "\x63\x80\x9f\xc3\x97\xed\x07\x1d\x3a\xa9\x7c\x29\x99\xdc\x6d\xaa" + "\x99\x47\x4d\x35\xb3\xdd\xa6\x9a\x39\xf0\xdb\x88\xa7\xed\xc8\x97" + "\xbf\x10\x48\x33\xd2\xc2\xc3\x31\x6e\x75\x9d\xdd\xa1\xae\x49\x80" + "\x67\x03\xbe\xcf\x5c\x48\xd4\xf1\xfa\x0b\x66\xc6\xaf\x77\x08\xf2" + "\x89\xf1\xeb\x28\x31\x41\xdc\x87\x36\x57\xb0\xaf\x22\xcf\x20\x5e" + "\x10\xfc\x7d\x0f\xdf\x7c\x6c\xac\xc8\xb7\x86\x76\x33\x01\x7b\x32" + "\xa2\xc7\xd6\x0a\x7c\x3b\x4a\x24\x3b\x0b\xf4\x8e\x28\x07\x5b\xdb" + "\x3d\x54\xb6\x56\x8c\x63\xd0\xd6\xa2\x9d\x45\xbe\xed\x0c\x9a\x6f" + "\x5b\xb3\x43\xe4\x5b\x55\x68\x7c\x7b\x45\x25\xe3\x1b\xd8\x81\x1a" + "\x1b\xf0\xed\x88\x0f\xdf\x1c\x32\xbe\x35\xc3\x73\x9b\x87\x6f\xe7" + "\x82\xe0\xdb\xb0\x33\x57\x2f\xdf\x5e\xf7\xbb\xff\x51\xff\x7c\xb3" + "\x84\x28\x6f\xaf\x24\x79\xf8\x66\x01\x79\xb3\x80\xbc\x59\x7c\xe4" + "\xcd\x22\x93\x37\x0b\xc8\x9b\x45\x26\x6f\x27\x83\xe0\xdb\x75\xc7" + "\xae\x5e\xbe\x15\xf8\xdd\xff\x72\x00\xbe\x85\x2a\x6f\x07\x64\x7c" + "\x03\x79\xb3\x80\xbc\x59\x7c\xe4\xcd\x22\x93\x37\x0b\xc8\x9b\x45" + "\x26\x6f\x47\x83\xe0\xdb\xf5\x1f\x5f\xbd\x7c\x2b\xf4\x3b\x76\xd8" + "\x3f\xdf\x6a\x43\x94\xb7\xe5\x51\x1e\xbe\xd5\x82\xbc\xd5\x82\xbc" + "\xd5\xfa\xc8\x5b\xad\x4c\xde\x6a\x41\xde\x6a\x65\xf2\xf6\x61\x10" + "\x7c\x7b\x20\xff\xea\xe5\x5b\x51\x62\x88\x7c\x0b\x51\xde\x96\x27" + "\xcb\xf8\x06\xf2\x56\x0b\xf2\x56\xeb\x23\x6f\xb5\x32\x79\xab\x05" + "\x79\xab\x95\xc9\xdb\xc6\x20\xf8\xf6\xe2\xe3\x57\x2f\xdf\x8a\xfd" + "\xf6\x7f\x4a\x7c\x93\x78\x86\xfc\x13\xf8\x46\x13\x88\x0b\xfc\xc9" + "\xdf\x2f\x62\x7c\x43\x7e\x09\xbc\x3b\x9b\x10\x69\x12\x79\xe6\x12" + "\x79\x86\xf4\x43\xbe\xa1\x1f\x29\xf0\x4d\xa1\xd4\xa2\x0f\xe9\x02" + "\x5f\x52\xf2\x23\x9f\x32\x50\x67\x83\xe1\xd7\x3d\x7e\xa4\xcb\xd7" + "\x8f\x5c\x26\xf7\x23\xdf\xf5\xe2\x57\xc1\x79\xe0\x17\x27\xf2\xeb" + "\x25\x3f\x7e\xe4\xd2\x7f\xf8\xe1\x97\x6d\x40\x7e\x01\x6f\xa2\xba" + "\xcf\x32\x7e\xed\x14\xfd\xff\xb2\x94\x41\xf2\xeb\x55\xe0\x17\xfa" + "\xff\x47\x09\xf7\xf6\xfc\x60\xf9\xf5\xe6\x80\xfe\x7f\xdf\xfc\xb2" + "\x54\x05\xc7\xaf\x57\x0e\x78\xf8\x65\xb1\xb9\xc0\xa6\x49\xf6\xcc" + "\xc3\x2f\x66\xcf\x5c\xbe\xf6\x6c\x99\xdc\x9e\x05\xc2\x2f\x1f\x7b" + "\x76\x55\xf1\xeb\x97\x7e\xfb\xff\xdd\x10\x8b\xbb\x41\xcf\x61\x7f" + "\x65\x44\x1b\xc4\xc9\x2e\xfa\xf5\xac\x0e\x88\x93\x5d\x23\xe2\xb6" + "\xad\x24\x63\xbb\xd7\x42\x9c\x0c\xbc\x2b\x58\x49\xa6\xe4\xaf\x24" + "\x4a\x7e\x39\xc4\xca\x27\x20\x56\x06\xfd\xd4\xf5\x2f\x43\x64\x7d" + "\xa2\x83\xf0\x10\x2b\x63\x3f\x18\xd4\x77\x2c\xfd\x17\xc4\xca\xad" + "\xa0\xfb\x5a\x77\xb2\x58\xf9\x2b\x29\x56\xfe\xc0\x2b\x56\x7e\xfd" + "\x15\x31\x56\x16\xe9\x5f\x26\xa7\xfd\x0b\xbf\xf3\x13\x2b\x5b\x06" + "\x8c\x95\x31\x46\x7e\x1b\xe3\xe5\xd3\x86\xd1\x3b\x44\xdd\xb6\xf3" + "\xd4\x20\x63\xe5\xd3\x10\x2b\xe7\x30\xda\xef\x0c\x9a\xf6\x25\x7e" + "\xe7\x7f\xa0\x6c\xa0\xbc\xf4\xd8\x22\xa0\xb3\x64\x83\xba\xc1\x06" + "\x61\x7f\x46\x57\x41\xcd\x24\xc0\xab\x20\x1f\x82\x4d\x5a\xab\x0d" + "\x47\xd9\x40\x39\x41\xd9\x10\x6c\x11\xe8\x41\xb0\x45\x07\x2b\x5e" + "\x21\x93\x77\xbd\x42\x26\xb9\xd4\xde\x31\xf2\x53\x49\xc8\x0f\x8f" + "\x6e\xe3\x7d\x75\xdb\x12\xb9\x6e\xfb\xa0\xb7\x2d\x1a\x48\xb7\xbd" + "\xe2\x4f\x56\x2c\x03\xca\x0a\xca\x88\x60\x8f\x40\x5e\x2e\x86\xac" + "\xec\xfc\xdf\x60\xf9\x55\xea\x77\xfe\x47\x80\xfc\xda\x1f\x00\xbf" + "\xaa\xe8\xf0\x64\xad\x8c\x5f\x5e\xb1\xb1\x8c\x5f\x0e\x19\xbf\x3c" + "\xb1\xf1\x12\x79\x6c\x1c\x08\xbf\x7c\x63\xe3\xab\x89\x5f\x3b\xe7" + "\x0c\x8e\x5f\x96\x00\xe4\xcb\x02\xf2\x95\x9c\xec\xe1\x97\x77\x4c" + "\xec\xe1\x97\x45\x26\x5f\xb2\x98\x78\x89\x3c\x26\x0e\x84\x5f\xbe" + "\x31\xf1\xd5\xc4\xaf\x32\xbf\xf3\x3f\x02\xe4\x57\x00\xf2\x65\x41" + "\xf9\x32\xcb\xf8\xe5\x15\x0b\xcb\xf8\x25\x93\x2f\x99\xef\xb0\x44" + "\xee\x3b\x04\xc2\x2f\xdf\x58\xf8\x6a\xe2\x57\xf9\xfe\xc1\xf1\xab" + "\x36\x00\xf9\xaa\x05\xf9\x5a\x11\xe5\xe1\x97\x77\x0c\xec\xe1\x57" + "\xad\x4c\xbe\x64\x31\xf0\x12\x79\x0c\x1c\x08\xbf\x7c\x63\xe0\xab" + "\x89\x5f\xbb\x92\x06\xc9\xaf\x00\xe4\xab\x16\xe4\x6b\x85\x41\xc6" + "\x2f\xaf\xd8\x57\xc6\x2f\x99\x7c\xc9\x62\xdf\x25\xf2\xd8\x37\x10" + "\x7e\xf9\xc6\xbe\x57\x13\xbf\x7e\x15\xd5\x5f\x2c\x25\x8f\xa1\x5c" + "\x59\x1e\x7e\x21\x6f\xba\x21\x76\xea\x56\xd5\x4c\xf2\x1f\x3f\x2d" + "\x3f\xe8\x2f\xde\xc5\xbd\x6b\x9e\x6a\xc3\xf5\x20\xcc\x27\xa4\x3e" + "\x3e\x61\x83\xe1\x77\xc4\x3b\xe6\xfd\xb0\x57\x0c\xd5\x2d\xf5\x51" + "\x2c\xf4\x17\xf3\xfe\x25\xe4\x18\x0a\xf9\x84\x71\x94\xeb\x55\xe0" + "\x93\xe8\xc7\xbf\x3d\xc8\x3e\x8a\xee\xb3\x7a\xee\x6d\xf0\xe3\x33" + "\x16\x42\x0c\xb5\x28\x58\x3e\xfd\xfa\x80\x3f\x3e\x61\x3f\x11\xc6" + "\xbc\x18\x4b\xe1\xb8\x63\x63\x6b\x1b\xc9\x4f\x23\x1a\x61\xec\xb1" + "\xcd\x7b\xec\x71\xdb\x71\x88\xa9\x56\x01\xdf\xba\x13\x48\xe1\x71" + "\x32\xa5\xe0\x15\x16\x53\x49\xf1\x54\x63\x87\x53\x18\x7b\xb4\xba" + "\xec\x64\x86\x9d\x3a\x77\x41\x7e\x8c\xa3\xea\x13\x77\x12\x94\x95" + "\xac\x2f\x88\x1a\x79\x00\x31\x98\xc0\x0f\x79\x0c\x55\x21\x1f\x6f" + "\x5c\xea\x2f\x86\x1a\x78\xbc\xb1\xec\x14\x8b\x9f\x84\xf1\xc6\x2b" + "\x22\x86\xda\xe3\x77\xfc\xe3\x99\xbd\xac\xbf\x01\x69\x6f\xd5\xbb" + "\x08\xe0\xe9\xeb\xc8\x76\xd6\xaf\xe7\x2a\xac\x89\xc1\x98\x16\xe3" + "\x59\x6b\xba\x85\xe4\xaf\x27\x9a\xae\xce\x84\x48\x88\x51\xd5\x2e" + "\xd0\x75\xaf\x9f\x60\xb4\xc7\x35\x62\x8e\xe5\x06\x61\xae\x0c\xc6" + "\xb2\x28\x2b\xc2\x98\xe3\x22\x32\xa9\xec\x18\x99\x2c\xc8\x07\xc8" + "\x85\xcb\x54\x67\xe7\xd5\x35\x73\x50\x4e\x66\xb4\x50\x27\xf2\x00" + "\xe5\xa3\xae\x05\x79\xf3\x2e\xc9\x3a\xca\x78\x23\xf0\x85\xf3\x1e" + "\x0b\xee\x2d\x1b\x1f\xfb\xe1\x4f\x75\x60\xfc\x59\xe5\xcd\x9f\xf2" + "\x50\xc7\x83\xa5\xf9\x91\xab\xf4\x5c\xb9\x38\x1e\xbc\xf3\x85\x60" + "\xf9\xf3\x4e\xaf\xf5\xcf\x01\xf2\xa7\x2a\x44\xfe\xd8\x84\xb1\x45" + "\x6f\xfe\xb4\x89\xfc\x39\x82\xb1\x92\x87\x3f\xe7\x02\xe4\x8f\x4f" + "\x8c\x74\x55\xf1\xe7\xb7\x7e\xfb\x7f\xfa\xe7\x8f\x25\x44\xf9\xb1" + "\xcc\x16\xc6\x10\xbd\xf8\x63\x11\xe5\xc7\x32\x07\x63\x23\x0f\x7f" + "\x4e\x06\xc8\x1f\x9f\x98\xe8\xaa\xe2\xcf\x5e\xbf\xfd\xdf\x03\xf0" + "\x27\x44\xf9\xb1\xd8\x84\xb1\x42\x6f\xfe\x88\xf2\x63\x39\x82\xb1" + "\x90\x87\x3f\x47\x03\xe4\x8f\x6f\xff\xe9\xd5\xc4\x9f\xdf\x55\x87" + "\xc6\x9f\xda\x10\xe5\xa7\x76\xb6\x30\x26\xe8\xc5\x9f\x5a\x51\x7e" + "\x6a\xe7\x60\xec\xe3\xe1\xcf\x87\x01\xf2\xc7\x27\xe6\xb9\xaa\xf8" + "\xb3\x2f\x21\x44\xfe\x84\x28\x3f\xb5\x36\x61\xec\xcf\x9b\x3f\xa2" + "\xfc\xd4\x1e\xc1\x58\xc7\xc3\x9f\x8d\x01\xf2\xc7\x27\xc6\xb9\xaa" + "\xf8\xf3\xae\x73\xa0\xf1\x22\xc9\x77\x96\x8f\xcb\x76\x83\xff\x86" + "\xfe\x33\xfa\xce\x8d\x1d\xd5\xc4\xb5\x8a\xf1\x26\xff\x3c\xd1\x14" + "\x88\xbc\x11\xc6\x64\x97\xb3\x31\x59\xc1\x6f\xcb\x5d\xb6\x9f\x6e" + "\x52\x6a\xd1\x2f\x13\xc6\x5d\x85\xb1\x89\x43\xf8\xce\xd0\x2d\xf3" + "\xdf\x30\x46\x05\xdf\x9b\x60\x9c\x9a\xf5\x55\x10\x7e\xdb\x22\x7f" + "\x7c\x19\x78\x6c\xa2\x4c\x36\x8f\x4f\x8a\x3d\x87\x94\x2f\x41\x8f" + "\xbb\xbe\xef\xf7\xfc\xa7\xfe\xf9\x62\xa9\x0a\x8e\x2f\x60\x6f\x72" + "\x5f\x39\xc0\xf8\x72\xd4\x87\x2f\x96\xb6\x6e\x99\xdd\x09\x9c\x2f" + "\x3e\xf6\xe6\xaa\xe2\xcb\x1f\xf4\x7e\x63\x4d\xd0\x4b\xc8\x13\x9c" + "\xdf\xbd\x6d\x11\x19\x9b\x7f\x8c\x4c\xe9\xfe\x97\x76\xd4\x2c\xd0" + "\x73\xdd\xcb\xb5\xe1\x8d\xa0\xe3\x32\x3b\xe8\xd7\x11\x1d\x23\xe2" + "\x0e\x1f\x71\x90\xc6\x44\x3b\xe9\x5a\x9b\x40\x4c\x27\x70\xae\x7a" + "\x35\xd9\x9a\x82\xb1\xfc\x1f\x49\x5d\xcb\x19\x32\xab\x92\x76\x5b" + "\xdb\xab\x89\x79\xfd\x1f\x09\x5d\xae\x1f\xb5\x0b\xf2\x2c\x00\x1a" + "\x9e\xe2\xfe\x60\xbf\x00\xf1\xe8\xc4\x74\xa2\x99\xd9\x4e\x9d\x8d" + "\xed\x87\xc9\xdb\xf0\xad\x43\xe0\x45\x22\x7d\x91\x27\xa6\x57\x30" + "\xfe\xfc\x90\xf1\xe4\x59\xc6\x93\x9d\xb2\xf8\x53\x07\xef\x8f\x1b" + "\x81\x1f\xdf\xfa\xf0\xa3\xa5\x8d\x00\x7d\x47\xcc\xea\x00\x7e\x74" + "\x48\xfc\x38\x49\x32\x57\x23\x3f\xec\x3d\xf3\x5d\xbb\x44\x7e\x94" + "\xa1\xfe\x32\x12\xcd\x0e\x29\xfe\x3c\x25\xe3\x87\xb4\x26\x4b\xce" + "\x0f\x29\xf6\x5f\x0b\xfc\x48\xf3\xc4\x9f\x17\x20\xfe\xdc\x01\xf1" + "\x67\x56\x13\xe1\x76\x64\x06\xcb\x8f\x3f\xfa\xb5\xff\x12\x2f\xd0" + "\xb6\x74\x47\xd4\xc4\x20\x1f\xac\xe9\x55\x04\x79\x82\xf6\xc4\xfd" + "\x2f\x6d\x78\x46\x2a\xc8\x8e\x7d\x44\x5c\x17\x85\x98\x1f\xe2\x7d" + "\xeb\xbc\xcf\x08\xf6\x19\x30\x1e\x74\x77\x5b\x1d\xd5\x04\x69\x6f" + "\x5e\xff\x99\xc0\x87\x53\xdc\x9f\x12\xe7\x77\x10\xee\x6e\xc0\x21" + "\xc4\xfb\x9a\x05\xb8\x2e\x17\x74\xdb\xdb\x4b\xc9\xe4\x99\x46\xea" + "\xc4\xd8\x14\x65\x08\xe7\x9e\xa0\x5e\x6b\x34\xfe\x83\x60\xbf\x4e" + "\xb7\xba\xce\x7e\x28\x95\x10\xd4\x6f\x48\xf7\x61\x6b\x3c\x7c\xc2" + "\xf9\x24\x02\xaf\xe6\x06\x30\xcf\x55\xce\xaf\x79\xf6\x80\xe6\x27" + "\x77\x89\xfd\x05\x65\x52\x9f\x5a\xa8\xfd\x05\x52\x9f\xda\x69\x36" + "\x9f\x24\xeb\x13\x90\x9f\xa0\xf9\xb5\xdf\x10\x20\xbf\xaa\x82\xe7" + "\x57\x67\x1f\xfc\xfa\x40\xd3\x07\xbf\x6c\x1e\x7e\xbd\xa2\x92\xf1" + "\xab\x4d\xe4\xd7\x11\x19\xbf\x9a\x07\xe6\x57\x3f\xf3\x5b\xbf\xf3" + "\xfc\xfa\x77\xbf\xf1\x8f\x37\xbf\x2c\x21\xc8\xd7\xe9\x3e\xf8\xf5" + "\xef\xe6\xde\xfc\xb2\xc8\xe4\xeb\x95\x24\x0f\xbf\x2c\xa2\x7c\x59" + "\x64\xf2\x65\x09\x40\xbe\xfa\x99\xd7\xfa\x9d\xe7\xd7\x7f\xf8\x9d" + "\xff\xe3\xc3\xaf\x10\xe4\xeb\xf3\x3e\xf8\x55\x6d\xec\x83\x5f\x72" + "\xf9\x3a\x20\xe3\x97\x28\x5f\x16\x99\x7c\x59\x02\x90\xaf\x7e\xe6" + "\xb3\x7e\xe7\xf9\xf5\xe7\x7e\xe7\xff\x78\xf8\x55\x1b\x82\x7c\xfd" + "\xad\x0f\x7e\xfd\x45\xd7\x9b\x5f\xb5\x32\xf9\x5a\x1e\xe5\xe1\x57" + "\xad\x28\x5f\xb5\x32\xf9\xaa\x0d\x40\xbe\xfa\x99\xc7\xfa\x9d\xe7" + "\xd7\x7f\xfa\xf5\xff\x7c\xf8\x15\x82\x7c\x65\xf5\xc1\xaf\xff\xb4" + "\xf5\xc1\x2f\x99\x7c\x2d\x4f\x96\xf1\x4b\x94\xaf\x5a\x99\x7c\xd5" + "\x06\x20\x5f\xfd\xcc\x5f\xfd\xce\xf3\xeb\x80\xdf\xfe\x6f\x39\xbf" + "\xba\x0a\x25\xff\xb0\xd2\x9b\x5f\xe0\xaf\x47\xb6\xb2\xd8\x4a\xe2" + "\x97\x7f\xdf\xf0\xc3\x8c\x1e\x5e\x7d\xe5\xf1\x0d\x05\x3e\x89\xe3" + "\x14\xc8\x1f\xf4\x11\xd1\x27\xec\x32\x31\x1e\xe1\x18\x60\xbf\x7e" + "\x61\x20\xeb\x9f\x42\xe0\x93\x14\x57\x0d\x39\x9f\x3e\x0d\x85\x4f" + "\x7f\xf5\xbb\xfe\xc9\x9b\x4f\x92\xdd\x0a\x94\x4f\x7d\xd9\xac\xbf" + "\x8d\xed\xcd\x27\x8b\xcd\xc3\x27\x66\xa7\xd0\x76\xa1\xad\xf2\xe6" + "\x53\x3f\xf6\x2a\x90\xf5\x17\xdf\x79\x3e\x99\xfd\xea\xbf\x22\x8e" + "\xaf\x82\xab\x1a\x2e\x33\x5c\x16\x37\x47\xa6\x95\x73\xbc\x0d\xf3" + "\xe3\x3e\x7f\xe5\x39\xbd\xde\x0f\xa7\xc3\x67\xcc\xc1\x3c\x40\x5b" + "\x61\xac\x5d\x2a\x83\xe6\x13\xa4\x9d\x59\xad\x48\x24\xe5\x2c\xef" + "\x08\xa9\x2c\xf5\x26\x12\x2b\x95\x05\x6d\xca\x06\x5a\x9b\x23\x37" + "\xc5\x0e\x87\xfc\x16\x9a\xff\xda\x6e\xc8\x1b\x2e\x94\xb9\x49\x29" + "\xec\x1b\x2a\xe5\x75\xe7\x28\x70\x7d\xb8\x39\x52\x01\x79\x59\x99" + "\x23\xc5\x7c\x3a\x3e\x87\xe8\x84\x7a\x72\x1c\x7e\xcf\xb7\x9e\xa3" + "\xc4\x7c\x63\xe5\x75\x54\x6f\x8a\x15\xca\x13\xf3\x5c\x47\x87\xdf" + "\xae\x15\xdb\xa2\x97\xe7\x73\x3f\x4e\xb0\x4c\x29\x9f\x4a\x2c\x6b" + "\x82\x57\x9e\x5f\x13\x82\xe7\xd1\x0a\xf5\x4b\xe7\x88\x58\x3f\x35" + "\xe6\x75\x8f\xda\x92\xea\x56\x28\x63\x78\x8e\xc4\x78\xfd\x26\x97" + "\x08\xf9\xc5\xbc\x11\x42\xde\xe1\x2b\xab\x21\xef\x24\x91\xe6\x4a" + "\x39\xcd\xc5\x7c\x91\x12\x1d\xe5\xef\xdc\x39\x1c\x96\x85\xef\x35" + "\x74\xf8\x8a\x03\xd0\x86\x29\x52\x3e\xe9\x7b\x56\x88\xdc\x84\xbc" + "\x1c\xb9\x47\xe4\xc9\xf5\xd0\x8e\x58\x29\x1f\xee\xa7\x20\xe5\xcd" + "\x72\x93\x1b\x77\x79\x68\x33\xda\x9d\x9f\x3b\xc9\xbd\x49\xf9\xa4" + "\x6f\x99\x91\x9b\x14\x76\xcc\xd7\xd0\x26\x94\x8d\xfc\x6b\x83\xfc" + "\xdf\x13\x69\x14\xc7\x78\xa2\xe9\xe1\x89\x9b\x73\xe1\x3b\x73\x05" + "\xab\x6b\x94\x98\x6f\x66\xef\x7c\x4a\x79\xbe\xef\x33\x3a\x16\x27" + "\x02\x6d\x66\xf7\xce\x1b\x2e\xcf\x7b\x03\xcb\x9b\xa7\x81\xbc\x73" + "\x7a\xe7\xd5\xc8\xf3\xfe\x80\xe5\xdd\x6a\x81\xbc\x09\x7d\xd4\x75" + "\xb4\x2c\xaf\x96\xe5\x7d\x3d\x1b\xf2\xce\xeb\x9d\x57\x27\xcf\x7b" + "\x23\xcb\xfb\x16\xd6\x21\xb1\x77\xde\x58\x79\xde\x9b\x58\x5e\xd3" + "\x64\xc8\x9b\xd4\x3b\x6f\xb6\x3c\xef\xcd\x2c\x6f\xa1\x03\xf2\x1a" + "\x7c\xf3\xee\x62\xbc\xbd\x5d\xe4\x6d\x34\xcb\x5b\x54\x09\x79\x93" + "\xfb\x68\x5b\x98\x50\x2e\xcb\x3b\x86\xe5\xcd\x2d\x80\xbc\xc6\x3e" + "\x78\x21\xcf\x7b\x0b\xcb\xfb\xab\x79\x90\x37\xb5\x0f\x5e\xc8\xf3" + "\xde\xca\xf2\x6e\x9f\x02\x79\xd3\xfb\xe0\x85\x27\xef\xa8\xd2\x76" + "\xc8\x93\x01\xed\xb4\xf5\x41\x5b\x79\x99\xb7\xb1\x32\x77\x96\x41" + "\xfe\xec\x3e\x68\x2b\xcf\x7b\x3b\xcb\x5b\x36\x13\xf2\x6e\xe9\x83" + "\xb6\xf2\xbc\x3f\x64\x79\xcb\x5d\x90\x37\xaf\x77\x5e\x90\x37\x46" + "\xdf\x7b\x45\xfa\x8e\x65\xf9\x77\xed\x83\xfc\x05\x7d\xd0\x17\xcb" + "\x93\x64\xf6\x0e\x96\xf7\x97\x66\xc8\x5b\xd4\x07\x7d\xe5\x79\x7f" + "\xc4\xf2\xbe\x17\x0b\x79\xdf\xea\x83\xbe\xf2\xbc\x3f\x66\x79\xf7" + "\x20\x26\x4b\xfb\xa0\xaf\x3c\xaf\x9e\xe5\xfd\x8d\x0e\xf2\x96\xf5" + "\x51\xdf\xdb\x65\x79\xc7\xb1\xbc\xbf\xc5\xfa\xee\xee\x83\x1f\xf2" + "\xbc\xe3\x59\xde\xf7\x9b\x21\xef\x9e\x3e\xf8\x21\xcf\x7b\x27\xcb" + "\xbb\x17\xe5\xb8\xb2\x0f\x7e\xf4\xe4\x05\xbb\x30\xc1\x3d\xea\xf7" + "\xa8\x47\x6d\x90\x57\x38\x2f\x85\x72\xc2\xfe\xfe\x42\x5e\xc0\x89" + "\x59\xd4\x77\x77\xb1\x32\xf7\xed\x86\x7c\xc2\x9e\x72\x98\xa7\xc1" + "\x29\xe8\x23\xb0\x2f\xae\xfb\x76\x79\x74\xf7\xdd\x2c\xef\xff\x53" + "\x42\xde\xfd\x72\x1d\x4a\x39\xa5\x3c\xdf\x44\x96\xef\x43\xa4\x55" + "\xb5\x77\xbe\x70\x4f\xbe\x51\x7f\x22\xf0\xfe\x40\x85\x8f\x3e\x86" + "\x7a\xca\xcb\xba\x87\x95\xb5\xbf\x0a\xf2\x9a\xbd\xf3\xb9\xee\x95" + "\xe5\xbb\x97\xe5\xfb\x77\xa4\xcd\x41\xef\x7c\x3a\x79\xbe\xfb\x58" + "\xbe\xbf\xa2\xce\xb2\x78\xe7\x8b\x95\xe7\x9b\xe4\xce\xaf\xd6\x08" + "\x79\x37\x29\xeb\x7d\xe9\x07\xb4\xbe\x57\x66\xd3\xee\x77\xe7\xff" + "\xd9\x2c\xe6\xb5\x49\x34\x14\xe8\xcc\x30\xcf\x89\x98\x7f\xc0\x9d" + "\xff\x9f\x46\x31\xdf\x11\xb9\x1d\x90\xd9\xda\x9f\xd0\x51\x7f\x30" + "\x8a\x76\x54\xf0\xdd\x41\xbf\xb7\xf4\xe5\x6f\x18\xc7\x93\xeb\x4e" + "\x70\xb5\x7a\x66\x7b\xa4\x3d\xf5\x0f\x0b\x7e\x04\x5f\x56\xac\x89" + "\xef\xa0\x2e\x79\xda\x36\x8e\xda\x26\x76\x10\x25\xee\x9f\x44\xd5" + "\xb6\xc9\x76\x48\x77\x8c\x29\x8e\xe9\xcc\xaf\x9d\x64\x57\x18\xca" + "\x70\x2f\x0f\xf8\x3f\xd6\x4e\x7e\xfb\x24\xfe\xbf\x2d\x07\xfc\x41" + "\x2e\x56\x81\x7b\x30\xef\x82\xff\x0b\xe1\x12\xf6\x3d\x36\x12\x8e" + "\xe6\x92\x58\x73\x9a\x8b\x1c\x4f\x27\x1c\x5f\x58\x62\xd3\xa5\xe0" + "\x7e\x22\xb5\x26\xba\xd6\x30\x85\x16\xd8\x1c\xf0\xdd\xa4\x63\xf0" + "\x2c\xd4\x05\xda\x4f\x0b\x4a\xfe\xff\xf6\x9e\x06\x2c\xaa\xeb\xca" + "\xf3\x86\x31\x45\x0a\x05\x0d\x21\xc4\xa0\x3e\x15\x5b\xba\xab\x30" + "\x18\x4c\x8c\xb5\x09\x49\x48\xc2\x6e\xfe\xdc\x5d\xda\xda\x06\xb3" + "\x10\xc5\x40\x82\x48\x00\x05\x7f\x22\x88\x64\x37\x61\x55\x66\x95" + "\x10\xba\x21\x0c\x49\xd8\xad\xed\xba\x8d\x69\x4d\x77\xd2\x75\xbb" + "\x58\xc9\x2e\xc2\xe8\x8c\x8a\x80\xfc\xe8\x88\x6c\x8a\x09\xba\x13" + "\x21\x82\x82\x73\xf7\x9c\x7b\xef\x63\xde\x0c\x68\xcd\x6f\xbf\xaf" + "\xe5\x26\x8f\xf7\xde\xb9\xe7\x9e\xbf\x7b\xee\xb9\xe7\xdd\xf1\xbb" + "\xb7\xaf\x2e\x87\xf6\x18\x3a\x74\xc0\x15\xe4\x70\xb1\xad\x4f\x9e" + "\xcb\xde\x0c\x33\x51\xfe\xba\x7e\x8c\x0d\xfd\xf9\xe9\xf7\x10\x0d" + "\x77\x50\x45\x1f\xca\x0b\xb4\x17\x09\xab\x3c\xea\x10\xfb\x94\x34" + "\xde\xc2\xe5\x2f\x66\x0e\x16\xb1\x13\xdc\x57\x4a\x8a\xe8\xfc\x86" + "\xba\xcd\x1f\x42\xb7\xae\xce\x75\xdb\x51\xbe\x87\x09\xe9\x85\x3a" + "\xc2\x60\x69\x63\xa0\x53\x49\x6c\x10\x7b\x94\x1c\xaa\xbb\xe6\x9e" + "\x1f\xc5\x10\xcc\xb6\xbf\xea\x8f\xf8\x4b\x30\xbf\x4b\x17\x76\x68" + "\x4c\x74\x2a\xf7\xf6\xc8\xe7\x24\xa7\xf2\x80\x2a\x9f\x53\x9c\xca" + "\x53\x23\xf2\x39\x53\xdb\x7b\x65\xfc\xbd\x60\x2a\x3a\x51\xef\x01" + "\xf7\x6b\xcb\xfc\x29\x1f\xa5\x7d\xd9\x58\x50\x45\xa7\x3a\x83\xce" + "\xeb\x68\x32\xb2\xed\x15\x03\x62\x3f\xcd\xc6\x43\x78\x0f\x96\x77" + "\x97\xbc\x33\xc2\xe1\x7d\x1b\xb1\xb3\x88\x6d\x6b\x6c\x20\x9d\x37" + "\x5f\x65\x6e\x16\xf8\x6a\x38\xdb\xe6\x67\xb2\x17\xf4\x82\xd8\x87" + "\xba\xf1\x13\xb1\x2f\x0e\xda\x15\x6d\xcf\x82\xfc\x4c\x9c\xd7\x76" + "\x87\x4b\x2f\x97\x29\x76\xc1\x1d\x71\x0b\xef\xbc\x6b\xd1\xdd\xa9" + "\x4f\xaf\x58\x99\xb6\xea\x99\xf4\x8c\x67\x9f\xcb\x5c\x9d\xb5\x26" + "\xfb\xf9\x9c\xdc\xbc\xb5\xeb\xf2\x0b\xd6\x6f\xa0\x4d\x5e\x46\xe5" + "\x7f\x2d\x41\x19\x30\x00\xf2\xb8\x1f\x79\x34\xa5\x71\x59\x10\x26" + "\xfa\xa4\x29\xc9\xa8\x8e\x6f\x4f\x7b\x38\x00\xed\xc9\xdc\x67\x68" + "\x7a\x87\xf6\x87\xc6\xfe\x57\xec\x55\x0f\xf3\xf3\x05\x7a\x0c\x4d" + "\xb5\x47\x5c\x0f\xd7\xd1\xf9\x16\x07\xc3\x7b\x21\x72\x36\x9d\x41" + "\xd0\x64\xa6\x7a\xcb\x37\x01\xea\xb1\xed\x78\x34\x67\x87\x40\xf8" + "\xae\x30\xe6\x2a\x0f\x63\x7d\x44\xbf\xbc\x82\xf5\xba\x36\xa6\xc3" + "\x0e\x7c\x47\xbf\x09\xf9\xc0\x60\x4b\x3b\x88\xd9\x2e\xe6\xb1\x11" + "\xd5\x15\xac\xa7\x24\x8c\xf5\x6c\xad\x60\x7d\x96\x30\xe6\x8c\x2c" + "\x87\xc0\xc1\x52\x5b\xb8\xd3\xd0\x94\xcd\xfd\x1a\xeb\xdd\x01\x4d" + "\x21\x65\x58\x17\x33\x02\x7e\x16\x7c\x47\xd8\xc0\x41\x55\xc8\xfd" + "\xf6\xc5\xa1\x49\xa8\xdf\x08\x1b\xce\x54\x76\x20\x1f\xd1\x47\xb6" + "\x97\xeb\x71\x06\x46\x7e\x2e\xfb\x50\x37\xfa\x98\xed\x25\xda\x77" + "\x1d\xf9\x05\xdb\x2b\xfb\x80\xe8\xfd\x3c\x67\x68\x52\xee\x34\x36" + "\x82\xb8\xe9\xee\x8d\x99\x0a\xe2\x24\x20\xed\x01\xbd\x3e\x51\xab" + "\x56\xe7\xa9\x59\x6b\x33\x33\xbf\x1d\x00\x51\xfc\xee\x75\x36\x46" + "\x1e\xd2\x83\x5d\x15\xac\x1e\xf5\xac\x43\x7d\x1b\x0e\x63\xc6\x8d" + "\xfe\x02\xa8\x93\x19\xe9\x76\x21\x7c\x3f\x3e\xef\x47\xd9\x1b\xc4" + "\x79\x0a\xa7\x26\xb3\x52\x5b\x39\xca\x49\x31\x9f\xef\x5d\xd5\x9f" + "\x9f\xa4\xa0\xde\xe5\x88\xd7\xa0\x4e\x83\xb9\x1f\x18\x0e\xa7\xa1" + "\x1c\xb5\xf8\x4c\xf8\x53\xa8\x1f\x11\xbf\x5e\xe8\xd5\xc5\xcf\xce" + "\x41\x5b\xd5\xbd\x1e\xc6\xb6\x0d\x96\x1e\x8e\xa7\xbd\xec\xf8\x1e" + "\xdf\xf8\x8e\x76\x69\x40\x5c\x73\x7f\x61\x92\x82\xdf\x5e\x8a\xc5" + "\x43\x33\x84\x64\x22\x39\xe8\xfb\xaf\x09\x33\x2f\xf7\xf0\x32\x98" + "\x3f\x04\x4a\x53\x0f\x40\x55\x05\xab\xc1\xab\x0a\xaf\xca\x46\xac" + "\x3b\x84\x57\x03\xc2\x6d\x78\x6f\xc4\xfb\xa1\x1e\xfe\x7b\x5d\x38" + "\xc9\x9d\xbb\x89\xf5\xc6\x54\xc2\x1c\xa2\x8f\xbe\xf5\x83\x6e\x43" + "\x57\x0a\xc9\x4e\xfb\x46\xb2\x80\xc3\xcd\xde\xfb\xeb\xd9\x13\x01" + "\xeb\xf1\x9e\x2c\xee\xfa\xcb\x5e\x8b\x57\xbd\x78\x76\x04\xe2\x73" + "\x9c\x7c\x56\xf1\x9a\xf7\xfb\x2f\x5f\x7a\xd7\xba\x1c\x95\x37\x8e" + "\x7b\x43\x57\xf3\x8d\xe1\x1d\x5b\x0a\x86\xe6\xdd\x78\x39\xbd\xe1" + "\xcd\x56\x01\x3b\x59\x22\xde\x4f\x9a\xe5\x7d\x3f\x18\xda\xd1\x4e" + "\xed\x48\xbf\x7d\x48\xc0\x3a\x8c\x78\x7f\x14\xaf\x65\x3e\xfc\x89" + "\x66\x1f\xf5\xe7\x70\x31\xc6\x6c\xec\x4b\xa7\xe1\x70\x2d\xf5\x51" + "\x99\xf0\x2d\xc5\xcd\x38\xac\x06\x7d\xab\xca\xe3\x3f\xf6\x57\xbc" + "\xfd\xc7\x5e\xe4\xe3\x3f\x66\x8a\x45\x38\x16\xfa\x2c\xc2\x5f\xf6" + "\xf7\x6f\x5c\x89\xef\xf6\x12\xa4\xb3\x5f\x7d\x8a\xd3\xe0\xff\x06" + "\xa3\xec\x43\x80\xa0\x74\x30\x52\x7c\xe9\x33\xd8\x4f\x90\xcf\x12" + "\x6f\xc9\x57\xc8\x82\xf2\x21\xac\x86\xe4\x5b\x83\x74\xf1\xbd\x16" + "\xf1\x6a\xec\x70\x51\x93\x8d\xb7\x29\x7d\x16\xfd\x51\xca\x4b\x34" + "\xa9\x1d\xf3\xe8\x55\x43\x6d\x04\x6f\xc7\xcb\x08\xa7\x6f\x4b\x28" + "\xfc\x18\xfc\xe8\xdf\x36\x93\x4f\xd2\xdd\x3e\x62\xc2\xb1\x94\x08" + "\xee\xc1\x65\x10\x13\x0e\x26\x1c\x6f\x93\xbb\x0d\x8e\xcc\xe8\x4d" + "\x60\x22\x7a\x14\xd3\x9d\x06\x87\xc9\x42\x63\x51\xd0\x92\xe7\x7f" + "\x1c\xae\x69\xcc\x06\xce\xa7\x9a\xe4\xc1\x7a\x1d\xdf\x72\xfa\x8e" + "\x2c\xdb\x20\x74\x45\x5e\xb5\xd8\x7e\x2f\xe9\x4e\xf6\xc4\x7a\x2b" + "\xd2\x69\xa0\x3a\xbe\xf7\xb6\xd0\xa7\x96\xf6\x67\x25\x7b\x10\x3e" + "\x9d\xd7\x22\xf6\xeb\xb3\x9d\xe7\x76\xc3\xf6\xd4\x1f\x0c\x79\x10" + "\x8d\xc2\x11\x36\xc2\x30\x1e\xbd\xb5\x61\x08\xe7\xfe\x63\xf7\x79" + "\xf7\xcf\x51\x55\xdf\x3f\xd8\x6e\x2f\xb6\xaf\x67\xa8\x23\xc5\x13" + "\xe4\x19\x4c\xf3\x3d\xc2\xcc\xee\x52\xa4\xb1\x6e\x88\xaf\xa5\x20" + "\x9d\x58\x94\xc5\x4c\x74\x50\x9e\x7a\x49\x2b\xf3\xc0\x26\xef\xbe" + "\x96\xf4\x6a\xa9\xcf\xf9\x78\xde\xc0\x75\xc2\xd8\x75\x4c\xa9\x16" + "\x75\x56\xc4\xb1\xb2\xe1\x44\xa0\xfd\x4e\xc5\x5c\xc2\xeb\xf6\x15" + "\x5e\xe6\xfd\x5b\x2f\xe2\xda\xb1\x59\xb9\x2f\xb0\x5e\x9d\xdc\x6d" + "\xda\x9e\xb1\x52\xee\x7d\xc4\x8f\xe5\x27\xf3\x79\x95\x78\x50\x7b" + "\x41\xef\xe8\x3e\xa2\xa7\xd9\x2a\x1a\xe5\x10\xf6\x72\xf4\x22\xbc" + "\x96\x7c\x91\xdb\x0d\xe3\x68\x7f\x21\xf9\xe2\xd1\x4e\x6c\xbf\x7f" + "\x07\xbd\xe7\xf3\xf7\x6c\x1e\x63\x3d\xf5\x91\x54\x6f\xc7\x6f\xf4" + "\xb2\xe7\xd0\x97\xdc\x00\x73\x42\xc1\x34\x50\xcc\x75\xdb\x33\xb0" + "\x31\x41\x39\x38\x02\x40\x72\xa2\x8d\xac\x83\xa5\xc7\x4a\x70\xae" + "\xa9\x27\x59\x31\x5e\xef\x63\x6f\x2d\x03\x92\x19\xe3\x99\x94\xef" + "\xd8\x27\xb2\xef\xf7\x91\x8e\x64\xcf\x68\x11\xfb\xb0\xae\xf9\xc7" + "\x24\xbb\x47\xef\x63\x0e\xbd\x8d\xb9\xde\xd8\x0f\xd4\x5f\xd4\x2f" + "\x3a\x9a\xe4\xfb\x66\xa4\xb5\x47\xbc\x0b\xdf\x20\x5b\x9b\xc3\x98" + "\x8d\xf0\x3d\xb8\xcd\x93\xa9\x6e\x33\xf2\x8e\xc9\xc6\x39\x1d\xc7" + "\x05\xed\xfb\x8b\x74\xf7\xd0\x59\x3c\x48\xc3\x4a\x36\x45\xbc\xe5" + "\xe4\x8f\xf8\x6e\x13\xed\x8e\x27\xe3\x7c\x3e\x0f\xaf\x25\x9e\xf1" + "\xdf\xfc\x98\xb7\x7f\x1d\xf7\x1d\xff\xd4\xdf\x66\x77\x61\x22\x70" + "\x7f\xc8\x01\xf5\x82\xe1\xf8\x39\x39\x77\xc8\xbe\x6e\xfe\xee\x41" + "\x1c\x2f\x3a\x1a\xf5\x3e\x7d\x6d\xe5\xfe\x98\xff\x28\x9d\x65\x4c" + "\xbe\x62\x95\x74\xb8\xce\xdc\x9f\x8a\xb9\x0f\xd8\x58\x3e\xea\x39" + "\xea\x07\xc7\x55\xd9\xcf\x36\x1f\x9b\x68\xb1\x2b\x93\xce\x67\xa0" + "\x98\x34\x58\x0c\xf7\x0c\x0e\x7b\xe2\x12\xf5\xbd\x9b\xf7\xfd\xf1" + "\x06\x8b\x98\x6f\x65\xdc\x3a\x2e\xea\xc3\xbc\x7c\x98\x64\xb9\xca" + "\xfd\x97\x64\x29\x4c\x26\x59\xac\x5c\x8e\x42\x15\x2e\x18\x9a\xf3" + "\x88\xbf\xd3\xd0\x0c\x72\xbc\x4a\x5a\xc7\x9a\x89\xd6\x56\x8c\x55" + "\x24\x13\xf2\x4e\xe1\xf1\xef\x21\x6e\x93\x13\x52\xf6\x86\xa1\x62" + "\x6a\x6b\x6f\xb8\x6c\xe0\x6d\x1b\xf0\x79\xc9\x90\xd8\xc3\x39\x00" + "\xdb\xef\x56\x9f\x26\xfc\x93\x71\x14\xa3\xd5\x1f\xf1\xe7\xe9\xea" + "\xf7\xd1\x57\x3f\x04\x23\xd2\xf3\x27\x1f\xd5\xfc\xa2\xcf\x70\x32" + "\x08\x73\x0c\xea\xaf\x3d\x98\x23\xed\x26\x7b\x93\x2f\x63\x8e\x14" + "\x37\x58\x7a\x62\x89\xe6\xb7\xc8\xa7\x8a\x6c\x2f\xfa\xe7\xc4\x16" + "\xf4\x63\xab\xc7\xb7\x4e\x6c\x91\x76\xdc\x8d\x76\xf4\x47\x7e\x8a" + "\xd4\x6b\x37\xe2\x63\x2e\xd6\xf6\xb1\x94\xbd\x52\xe2\xbf\xae\xf5" + "\x83\x1c\xab\xb6\x1d\x14\x7f\x79\x1f\xb4\xc4\xc9\xb6\xb5\x82\x57" + "\xcb\x42\x0d\x97\x72\x44\xb1\x37\x7b\xcb\x42\x8a\x83\x31\xd8\xf7" + "\x3c\xf6\xf1\x73\xaa\x04\x8c\xc6\x8e\xe0\xd1\xd6\xc5\xfd\x10\xf3" + "\x1e\x8f\x1f\xb5\x04\xfa\xc4\x27\x8a\xc5\xe6\x23\x48\x83\xe2\x29" + "\xf9\x12\xc5\x54\xfa\x8e\x40\x19\x7b\xe4\xf8\x91\x32\xb7\xac\xf7" + "\xf6\x95\xb6\x43\xe8\x2b\xf3\x75\xb4\xd3\xc7\x9b\xe7\x2c\x22\x06" + "\x56\x49\xdd\xde\x93\xba\xed\x91\xba\xbd\x27\x75\xdb\x8d\x3c\xd0" + "\x6e\x6d\x2f\xe8\xec\x88\x76\x6b\x3d\x27\xf1\xad\x14\xcb\x3d\xe3" + "\xb5\x75\xae\x36\x96\xc7\xc6\x8b\xd6\x93\x34\x1e\x3c\x72\xb5\x82" + "\x4f\xbc\xb0\x8e\x1f\x2f\x5a\x1c\x52\xdf\x1a\x9f\xb1\x51\x2b\xf3" + "\xdd\xf3\x5a\x3f\x1c\x19\xb8\x22\xf7\x21\xb7\x9d\xa7\xf8\x49\xbc" + "\xf5\x73\x50\xb5\xb0\xab\x1c\xcb\xad\xef\x8f\xed\x87\xd6\x72\xfd" + "\x78\xa6\xbe\xa6\x98\x40\x34\xa8\x4f\x79\x5e\x89\x30\xd1\xaf\xad" + "\x99\x14\x1b\xf4\x31\x1a\x71\xcb\xdd\x8c\xc6\x4b\x6b\xa5\xf7\x58" + "\x6c\x35\xca\xb1\x28\x79\xb7\x65\x60\x1f\x99\x3c\x7c\xdb\x02\x7d" + "\xf8\x52\xdf\xd4\x93\x1d\x64\x9f\x7e\x4f\x9b\xd3\x08\x1f\xdb\x16" + "\x60\x9b\x78\x9f\xf9\xd1\x4c\xf2\x39\x0d\x2d\x56\x1e\xb3\x2a\x78" + "\xac\x28\x18\xe4\xf2\xb4\x25\x58\xe4\x3c\x81\x30\x93\x84\x85\xc8" + "\xb9\x44\xf3\x9b\x77\x7d\x64\xaa\x19\x3f\x3f\x6a\xb1\x6a\xf9\x11" + "\xa7\xc5\x63\x51\x5b\xad\xd4\x8f\x60\xf3\x05\xac\x25\x93\x60\x3b" + "\x84\x1d\xca\x19\x9f\xaf\x5a\x42\xe4\x7c\x45\xe3\xcb\xe0\x34\x9c" + "\x28\xa2\x31\x46\xef\x48\x63\x88\xe8\xdb\x8b\xae\xd0\x37\x44\x25" + "\xd6\x45\x50\x3c\xa0\x78\xa1\xae\x12\x71\x43\x7d\x9c\xdf\x1f\xa4" + "\xb8\x43\x79\x08\xd5\x23\x5e\x20\xc5\x22\x84\xff\x90\xce\x34\x62" + "\x1f\xf9\x23\xdd\x93\x4b\x64\xdb\xd5\x3c\x57\xf8\x28\xd1\x4f\x83" + "\x69\xed\x70\x1c\x4d\xa7\x76\xd4\x5e\x8b\x5f\x14\xbb\x46\x28\x36" + "\x09\x7e\xef\x48\x1f\xe7\xdf\x0d\x5a\x5e\x34\x6c\xd0\xe1\xd2\x5e" + "\xd0\x22\xa6\x8d\xc8\x78\x76\x9e\xda\xf2\xfe\xc3\x58\xb9\xf9\x32" + "\x3b\x63\xc9\x01\x63\xf5\x45\x8a\x8b\xb6\x3e\x21\x67\x7b\xa2\xd0" + "\xa3\x7d\x0a\xd7\x43\xc4\x54\xb3\x90\xc5\xd6\x57\x7d\x85\xd7\xcd" + "\x27\x5d\xa8\xae\x4c\x57\xc7\x86\xa3\xa8\x8e\x9f\x7b\xe7\xdb\xce" + "\x3d\x9c\x3e\x06\x9f\xce\xe8\xc2\x18\xea\x5f\x5d\xa1\xc5\xde\xf6" + "\x06\x21\x67\xfb\x8b\x5a\xdc\x45\xbb\x84\x52\xec\xe5\x75\xab\x24" + "\xce\xe3\xf2\xce\xe3\x7b\xfb\xbb\xc2\xae\xe1\x06\x69\xef\x08\xa9" + "\x07\xdf\x27\x96\x7d\xb4\x0c\x6d\xdb\xbe\x47\xb3\xad\xfe\x99\xc6" + "\x0f\xf2\x27\x3f\x13\x71\x65\x13\xff\x86\xad\x22\x1c\x92\x49\xcc" + "\x11\x27\x6b\x7d\x73\x6a\xfc\xd6\xbb\x8f\xe6\x25\x91\xab\x76\xcd" + "\x92\x6b\x33\x50\x97\xf3\x26\xce\x0b\x1d\x99\x5a\x8c\x61\x83\x89" + "\xf8\xcd\xdf\x8d\x38\x1d\xfc\x7c\x2b\xda\x3f\x58\x8f\x43\xf1\xe9" + "\xed\x2b\x4e\x49\xb3\x23\x51\x8b\x1b\x14\x4b\x8e\x0c\x74\xcb\x9c" + "\xae\x63\xa8\x5a\xc6\x92\x0b\x86\x8e\xcb\xde\x79\x58\xc7\x65\xef" + "\x98\xd1\x15\xe4\x1b\x33\x30\x6f\x2e\x19\x2c\xed\xb0\x79\xe5\x01" + "\x08\xbb\x7e\xec\xe8\xa8\xa1\x31\x4a\x67\x32\xf0\xf8\xc4\xd7\x9b" + "\x3a\x53\x35\x99\x29\x6e\xf6\x6f\xd4\xd6\x2f\x3a\xaf\x52\xae\xe6" + "\xcd\xaf\x73\x89\x57\xec\x24\x7e\x1a\x3d\x23\xd0\x9e\xfe\x68\x07" + "\x5a\x6f\xe9\x0c\x94\x71\xbe\xc6\x2b\x56\xca\x39\x8c\xe2\xa4\xf7" + "\x5c\x65\x3b\xef\x3d\x57\x75\x9e\x1b\x1b\x23\x3b\xad\x37\x3e\x57" + "\x75\x9a\x29\x6e\x69\x31\xd2\x3b\x16\x74\xf2\xf5\x01\x4f\x2e\xdb" + "\x99\xa0\xe5\xb2\x9e\x38\xda\xd1\x4c\x31\x0a\xf9\x5b\x05\xef\xae" + "\x38\x9c\xf7\x17\x69\xbc\xb1\x3e\xf3\x08\x66\x4e\xac\xd4\x56\x83" + "\xcf\xe1\x32\x07\xe4\x63\xf3\x0a\xdf\x57\xbd\x3d\x05\xfd\x2f\x80" + "\xfc\xac\x2e\xeb\x22\xf4\x78\xe6\x8a\xfa\xfe\x35\x9a\x7d\xbb\xde" + "\xd7\xe7\x85\xaf\x57\xb0\x97\x90\x4f\x95\x5e\xc7\xed\x08\x2b\x93" + "\x6b\x08\xdc\xb6\x9c\x56\x57\xb6\xa5\xc2\x5b\x37\xa1\x47\x57\x2d" + "\xe9\x41\xdf\x44\xc8\x7f\x25\xe5\x3d\x98\xf3\xe1\x73\x73\xaf\x65" + "\xd4\xe7\xed\x4b\x2e\x17\xeb\xf3\xab\xc3\x09\x14\x2b\xe5\xb7\x67" + "\x03\xe6\x3b\x66\xfd\x5a\xcc\x63\x0f\x2c\x55\xb3\x73\x32\xb2\xf2" + "\x56\x2d\x50\x33\xb2\x32\xf2\x32\x52\x33\x33\x36\xa4\xe6\x65\xac" + "\xc9\x9a\xb7\x3a\xf5\x99\x8c\x15\x6a\x7e\x6a\xae\x6a\x2a\x98\x5b" + "\x10\x00\x1e\xd4\xc5\x6a\x6a\x6e\xee\xda\xd5\x69\x2b\xd5\xac\x8c" + "\x15\xf3\x73\xd2\x72\xd3\xf2\xd4\xd4\x9c\x35\x6b\xb3\x56\xaa\x73" + "\x57\x46\xcf\x35\xdd\xb9\x32\x40\xbf\x86\x36\x3b\x04\xfa\xdc\x97" + "\x7a\x7b\xcb\x2e\x81\x7f\xb0\x92\x9d\x13\x5c\x90\x91\x25\xd6\xec" + "\x4e\x07\xc5\x94\x43\x36\x9d\x11\x49\xe7\x8b\xb1\xd2\x53\x2a\xde" + "\x8d\x84\x87\x7a\xd2\xb3\x3f\xca\x1e\x31\x58\x7a\xca\xe1\x34\x74" + "\x5b\xf9\xd9\x61\x08\x47\xdd\x22\xd8\xa5\x86\x5e\xcc\xd9\xb2\xe9" + "\xdf\x10\x5b\x2e\x41\xa8\x79\x1d\x18\xf1\x0a\xc4\x2b\x84\xce\x90" + "\x1c\x2c\x3d\x8d\xf1\xc7\xa9\x8a\x75\xcf\xd3\xb5\xae\x20\xd8\xc6" + "\xb6\xc1\x36\xd1\x2f\xa7\xdf\xd0\xd6\x82\x9f\x78\x11\x9e\x20\xff" + "\xec\x36\x9c\xe6\xbf\x51\x6c\x45\x5f\xa6\x75\xd4\xfe\xdf\xdc\x1f" + "\x8f\xf9\x60\x67\xdd\x34\x5e\xf7\xc6\x80\x01\x02\x51\x2e\xe3\xc1" + "\x4d\x26\xd8\x85\xbc\x72\xc3\x19\x43\x1e\xe9\xda\x7a\x1a\xea\x10" + "\x82\xba\xb4\x49\x3d\x1e\xe1\x7a\x54\xb0\xc8\xf2\xa9\x28\xdf\x4e" + "\x2e\x4f\xb9\xa6\x03\xca\xdd\xe6\x34\x9c\x1a\x42\x39\x43\x48\xae" + "\xf1\xd6\xfa\x68\xbd\x0b\xe5\xec\x72\xaf\x43\xbb\xcd\x10\x67\x4a" + "\x94\x55\x8b\xf1\x87\x7a\x85\x5a\xf0\x79\xc7\x45\x08\xdc\x4e\xe7" + "\xfb\x15\xcf\x64\x87\x07\x46\xc0\x9e\xde\x06\xc1\xeb\x99\x8b\xfd" + "\xaa\xb7\x57\xe8\xe4\xf4\xa7\xd8\xf0\xcb\x67\xdb\x8c\xa4\x13\xce" + "\x15\x81\x96\x8b\xd7\x5c\x5b\x34\xee\x0a\x63\x03\xec\x35\x7d\xce" + "\xe5\x7c\x9e\x6c\x42\xf9\x56\x7f\x31\x9d\x21\xe7\x5c\x86\xb6\xdc" + "\x2b\x73\xe3\x01\x36\x9c\xac\xcb\xa5\x9c\xe4\x67\x03\xd7\xa0\xed" + "\xaf\xd1\xa6\xb3\x04\xa9\x8d\xe8\x7f\x67\x17\xb6\x71\xe9\xe8\x5b" + "\x7d\xe9\x13\x4d\x7c\x76\x69\x7c\xc4\x77\xb8\x93\x72\x02\x17\xfa" + "\xb2\xeb\x1a\xfc\x22\x77\x56\xb0\x66\x3b\xc2\xcb\x2e\x03\xe5\x47" + "\x38\xd6\x89\xfe\x99\x70\xb4\xfb\x26\xa2\xbf\x35\x0c\xa0\x04\x71" + "\xfa\x4b\x4f\xef\x1d\xe0\xe7\xfa\x9d\xc1\xf1\x6f\xdb\xed\xbb\x8e" + "\x2d\xfd\x79\xb1\x8f\x3f\xc7\xef\xa4\x9c\xb0\x1c\xe9\xa3\x0f\x95" + "\x7d\x82\xf3\x30\xbe\x47\x97\x43\x14\xf1\xc1\x67\xca\x2b\x1b\x90" + "\xe6\x4b\x1a\x3f\x86\xfe\xbf\xc3\x2d\xd6\x60\xa4\x6f\xcd\xa3\xb5" + "\xeb\xc2\x02\xc6\x0e\x62\x7c\x27\x19\xc9\xc7\xb0\xcd\x7e\xcd\xa7" + "\xd0\xd7\x9b\xb9\x5f\x85\x42\x14\x2b\x3d\x13\x6f\x99\x8a\x78\xe8" + "\x57\xd5\xe8\x4f\xe4\x57\x88\xdb\xab\xf9\x14\xfa\x9a\x83\xf0\x50" + "\x86\x80\xbd\x1b\xe2\x8d\x14\x23\x7b\x0c\xdd\xcb\xc9\xc7\xd8\xab" + "\x8f\xb4\xb1\x5b\x9f\x6c\x13\xfd\xd4\xbd\x9c\x56\x9a\xc8\x9e\x1e" + "\xbb\x77\x9b\x74\x76\x77\xa0\x1f\x07\x90\x9d\xc5\x5a\x75\xf7\x72" + "\x94\xcd\xc1\x73\xf1\x17\xb0\x0f\xf8\x5c\xd5\x1d\x41\xed\xa5\x0d" + "\x6d\x1e\x1b\x76\x17\x8c\x67\x43\x1f\xdb\x19\xc5\xb9\x82\xdd\x25" + "\x34\x56\xb0\xcd\xe8\xf9\xaf\xe3\xf5\x25\xf2\x30\x1a\xcb\xc1\x9f" + "\x78\xd4\x87\x72\xfc\x4e\x8d\x47\x19\xda\xda\x55\x98\x7e\x5d\x7f" + "\xae\xc7\x51\x4d\x6b\xe2\xd4\x3e\x32\x94\xec\x7b\x36\xc2\xd3\x9e" + "\x0d\xf8\xb6\x9f\xbb\xc2\x4b\x56\x7e\xb1\xd2\xb3\xa6\x5d\x53\xd1" + "\x8f\xb8\xbc\x67\x93\xaf\x27\x6f\xa4\x2a\xe6\xc9\xba\xd9\xe4\xdf" + "\x67\x5f\xb1\x57\x02\x10\x4c\xbe\x97\xf4\xe3\xdc\xe3\xbb\xbe\x7f" + "\xed\xdf\x1b\xce\x9e\xf0\xfe\xbd\xe1\x6c\xfd\xb5\x7e\x6f\xf0\xe6" + "\xdb\x33\x85\xf8\xba\x2d\x49\x8a\x8e\xf7\x88\x7b\x1c\xde\x5a\xfb" + "\xe8\x1a\xfd\xf7\x4c\x4f\x2a\xc9\x70\x84\xce\x5e\xbf\x3d\x49\x61" + "\x48\xa7\x9e\xcf\xe1\x3d\x29\x22\x7f\xa1\xbc\xa8\x27\x9e\x70\x7c" + "\xf5\x18\x2d\xfe\xa1\x07\xe8\x76\x99\xbf\x4c\x7a\x08\x42\xe8\x7e" + "\x57\x8a\x56\x6d\xf0\x42\x06\x36\xce\x0b\xe6\xce\x8b\x38\x3e\xc3" + "\x22\x40\xf2\xdd\xc5\x5f\x8c\xa3\xf8\xa3\xf5\x9f\xa3\x4c\x16\xf2" + "\x72\x7a\x43\xa0\x48\x7e\x45\x3a\x8c\x84\xeb\xb4\x66\xa0\x35\x19" + "\xaf\x50\x14\x2d\x4a\x9a\x84\xf4\x6a\x38\x32\x63\x23\x92\xbe\xf6" + "\xce\xf4\xef\x04\xf1\x7e\xc7\xe2\x97\xac\x63\x30\xd3\x6f\x25\xff" + "\xa7\x4a\xdf\x69\x1e\x05\x19\x6a\x42\xf4\x2c\x43\xa0\x68\x12\x7f" + "\x08\xa6\x3f\x43\x48\x2f\x0a\xeb\x17\xd5\x8d\x22\xdc\x3c\xb0\x45" + "\x87\xde\x24\xc4\x5f\xec\x45\xe3\x73\x96\x19\xba\xe7\x99\xe2\x76" + "\xb7\xe3\x0b\xa4\x7f\xfd\xa2\x3a\x26\x6b\x8f\x1e\xf7\x58\x9c\x34" + "\x1e\xaa\xc7\xfe\x8b\xf7\x69\x20\xbd\x87\x7a\xea\xef\x31\x79\xbf" + "\xc7\xfb\xd4\xdf\xbf\xf4\x0b\x90\x1c\xea\xe8\x4f\xa1\x73\x0a\xc0" + "\x7d\x11\xa3\xc0\x60\x9f\x21\x13\x6c\xf6\x19\x42\x9e\x22\xa5\xf1" + "\x43\x79\x6a\x75\x60\xe3\xf8\xd8\x5f\x4e\x99\xb6\x45\x0e\x88\x99" + "\xae\xb1\x3e\x75\xaf\x0f\x8c\xde\x6f\x52\x25\x2c\xf6\xc0\x18\x7c" + "\x0e\x53\x75\xef\x4a\x3c\xfe\xa9\x01\x58\x92\xf2\x05\x88\x3a\x51" + "\xfe\x14\x8b\x42\xe3\x63\xa2\x7c\x49\x85\x89\x59\x1c\x23\x11\xbf" + "\xd1\x7f\x6c\x34\x50\x32\x59\xc1\x24\x80\xc9\x87\x2f\x64\x1e\x9f" + "\x28\x13\x65\xa2\x4c\x94\x89\x32\x51\x26\xca\x1f\x41\x51\xf4\x1f" + "\xd6\x74\x2e\xf7\xd7\xe4\x5d\xff\xfd\xa3\xc8\x4b\x0f\x33\x7c\x9e" + "\x76\x4c\x16\x28\x8a\xaf\x53\x6b\x52\x9c\x21\xe6\xa5\x0e\xd3\xde" + "\x6c\x97\xff\x4b\x89\x0d\x51\xbb\xd3\x7b\xc3\x2b\x97\xb5\x2d\xb2" + "\x16\x0c\x19\x4b\x12\xea\x23\x6b\x57\xf6\x84\x96\x27\x35\xc7\xed" + "\xcb\x1b\x08\xdc\xf6\xa8\x6d\xde\x9e\xcc\xbe\x88\xaa\xe4\xce\x25" + "\xfb\x37\x8d\x18\x8a\xef\xff\xed\xec\x37\x9f\xee\x9e\xba\xf3\xaf" + "\x8f\x2d\xf8\x45\xce\xc5\x80\xd2\xbf\x6c\xfc\xb3\x9f\x3d\xfb\xe1" + "\xb4\x7f\xfa\x51\xfb\xe2\x5f\x6f\xb8\x72\xd3\xdf\x3d\xf4\xdf\xdf" + "\xfc\x97\x55\x1f\x84\x55\x7c\xbf\xe5\xce\x5f\xad\xbb\xf4\x8d\x1d" + "\x8f\x1f\x89\xfe\x79\xd6\x85\x19\xd5\x4f\x9d\xba\xe7\x37\x9b\xdd" + "\xca\x96\xfb\x0e\xcc\x7a\x23\xf5\xcc\x94\x7f\xfc\xab\xa3\xb1\xef" + "\x3c\xff\xf1\xe4\x97\xff\xe2\xd0\xb7\x7f\x9a\x71\xee\xb6\x1f\xff" + "\xf0\xe4\xdd\xef\xad\xbf\x3c\xe9\xc5\x07\xdf\x9f\xfb\xcf\x69\xff" + "\x7b\xcb\x2b\xdf\x3b\xb1\xf0\xdd\xb5\x9f\x04\x6d\x7f\xec\xf0\xfc" + "\x7f\x5b\x7d\x7e\xfa\xeb\xcb\xbb\xbe\xfb\x9f\x2f\x5c\xf5\xdb\xfa" + "\xc0\xc1\x39\x6f\xad\x38\x7b\xf3\xae\xbf\x39\x7e\xc7\x2f\x73\xfb" + "\xbf\xfe\x0f\x8f\x34\xfd\xf9\xbf\x3e\xf7\xd1\xed\xaf\x3d\xd9\xf1" + "\x9d\xff\xd8\x38\xfc\xb5\xbf\x7f\xf8\x7f\xbe\xf5\x93\x67\x7e\x77" + "\xeb\xab\x3f\x68\xbd\xeb\xdf\xf3\x07\x83\xcb\x9e\xb0\xc7\xbc\xbd" + "\xe6\xff\x66\x5a\xfe\xf6\xf4\xbd\xff\x55\xc8\x3e\x8f\xfd\xc0\xcf" + "\x78\xf3\x57\xd9\x6f\x9e\xe4\x91\xc0\xd5\x6d\x9f\x99\x8e\x41\x91" + "\xfd\x2f\x00\x45\x0b\x41\xf1\x87\x9b\x8c\x9f\xe1\x8b\xe1\xb3\xea" + "\x7d\x8d\xa2\xea\xdb\xdf\x48\xa1\xf5\x8a\x58\xbc\xee\xc0\xeb\x76" + "\x0e\xf1\xac\x02\x44\xde\x20\x8d\xaf\xae\x28\x68\x03\x3f\x94\x70" + "\x12\xdc\x84\x56\xf3\x87\xc9\x10\x00\x5f\x87\x40\x08\x82\x6f\x40" + "\x30\x84\xc0\x14\x98\x0a\x37\x43\x28\xdc\x02\x61\x70\x2b\x84\xc3" + "\x6d\x30\x0d\xb5\x8a\x80\xe9\x30\x03\x66\xa2\x71\x66\xc1\x6c\x98" + "\x33\xbe\x5e\x45\x10\x1f\x8e\x7f\xf0\xff\xa5\x7c\xd5\xa6\x08\x52" + "\x26\xe0\x5f\x29\xbc\x4e\xc2\x1d\x12\xee\x9c\x80\x7f\xa5\x70\xf5" + "\x0f\x7c\x9f\xf5\x07\xbd\x2b\x98\x46\x88\x4c\xc2\x2b\x9f\x18\x2d" + "\xbe\x50\x45\x96\xd1\x77\xf8\x3d\xed\xc7\xd0\xf3\x6e\xef\x5b\xe2" + "\xf1\x8a\x13\x8f\x85\x00\xf2\xb7\x07\xa6\x2f\x23\x17\xbc\x4a\x85" + "\xf2\x5b\xe3\x94\x22\xfa\x55\xc5\x1f\x42\xf9\xdf\x1b\x28\xf4\xcb" + "\xe2\xc1\x12\xbc\xcc\x78\xed\xc2\xcb\x82\xd7\x4f\x35\x56\xa0\xcc" + "\x0e\x07\x65\xce\x52\xbc\xef\xc3\x7b\x1f\x28\x91\x45\xa0\x7c\x0b" + "\x85\x9f\x5b\x07\x4a\x54\xbc\x47\x99\x58\xe7\xa8\xd4\x4a\x8c\x84" + "\xab\xf8\x1c\x97\xee\xc3\xf0\xd3\xce\x77\x75\x0f\x26\x25\xaa\xb1" + "\xd1\x71\xd1\x0b\x17\xaa\xf3\xe7\xab\x0b\x4c\xb1\x0b\x62\x4c\x71" + "\x31\x0b\x62\x55\x53\xec\xe2\xb8\x45\x8b\xef\x88\x53\x57\xaf\xcf" + "\xc9\x88\x35\x3d\x93\xa6\xae\xca\xc8\x59\x9d\x9f\x9a\x93\x76\x23" + "\x8a\x7f\xfa\x82\xea\xc0\xf4\xab\x42\x4c\x7d\xaf\x29\x70\x2f\x18" + "\xfa\xf6\xe2\xbc\x64\x86\xb1\xdd\x1c\x25\x2f\xef\xa2\xfc\x2c\x02" + "\x94\x9f\xa8\xa0\xbc\xb9\x0d\x94\xaa\x4a\x50\x5e\x49\x00\xa5\x01" + "\x61\xef\xfb\x83\x52\x97\x0c\xca\xaf\xd1\xe6\xbf\xe8\x19\x0b\x73" + "\x0c\x09\x58\x5f\x01\x28\xbf\xdb\x03\xca\x99\x12\x50\x4e\x76\x0a" + "\xd8\x20\xe2\x5c\xdc\xf4\xe5\x28\xff\x99\xcb\xa7\xed\x6f\xe5\xff" + "\x01\x88\x8f\x0c\x51" ; diff --git a/sys/dev/mxge/ethp_z8e.h b/sys/dev/mxge/ethp_z8e.h index de63bbea08d..3da83416c60 100644 --- a/sys/dev/mxge/ethp_z8e.h +++ b/sys/dev/mxge/ethp_z8e.h @@ -1,6 +1,6 @@ /******************************************************************************* -Copyright (c) 2006-2011, Myricom Inc. +Copyright (c) 2006-2012, Myricom Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -28,7535 +28,7590 @@ POSSIBILITY OF SUCH DAMAGE. $FreeBSD$ ***************************************************************************/ -static unsigned int ethp_z8e_uncompressed_length = 385956 ; -static unsigned int ethp_z8e_length = 120433 ; -static unsigned char ethp_z8e[120433 + 1] = - "\x78\x9c\xec\xbd\x7f\x7c\x94\xc5\xb5\x3f\x7e\x76\xb3\xc0\x26\x06" - "\x36\x42\x84\x95\xa2\x5d\x2c\x68\xb4\x20\xd1\x62\x4b\x2d\xd4\x20" - "\x41\xc1\xf2\x4b\xc1\x36\x2a\x1a\x50\xa0\x8b\x46\x88\x10\x61\x81" - "\x90\x5d\x16\xb4\x09\x02\x89\x1a\x35\x4a\x48\xe8\x15\x2d\x6d\x69" - "\xc5\x16\x2b\x3f\x42\x59\x9a\x78\x2f\xd0\x24\x9b\x56\xf0\x93\xdb" - "\x8b\xb7\x2b\x37\xd2\x94\x1b\x60\x4b\x16\xb2\x26\xbb\x3b\xdf\xf7" - "\x99\x79\x9e\x64\x77\xd9\xa0\xdc\x7b\x5f\xaf\xef\x3f\xcd\xeb\xb5" - "\x79\x9e\x67\x9e\x99\x33\x33\x67\xce\x39\x73\xce\xcc\x99\xf3\x10" - "\x5d\xfd\x9f\x8f\xcc\x7c\x31\x90\xb1\xa9\xec\xf0\xff\xa0\xfc\x3f" - "\xff\xfe\xf9\xf7\xcf\xbf\x7f\xfe\xfd\xf3\xef\x9f\x7f\xff\xfc\xfb" - "\xff\xf7\xcf\x6f\xa0\xb1\x17\x8c\x26\xfa\x43\x19\x51\x87\xdb\x3c" - "\xcc\x47\x91\xbc\x37\x5e\x15\x21\xbc\x32\x60\x9e\x1f\xc6\x57\xfe" - "\xbd\x82\x34\x63\x19\x99\x6f\x4a\xa3\x34\xf1\x86\xd5\x38\x69\x1b" - "\x51\xf9\x60\xd1\xf6\xea\xeb\xc2\x5f\x57\x48\x54\xbb\x03\xcf\xaf" - "\x8b\xd6\x57\x07\x8b\x00\xe0\xcc\xf3\x51\x6e\x39\xc3\x59\x8f\xe7" - "\xf5\x48\x47\x5a\x81\x8f\xe6\x6d\xe0\xb4\x52\x94\xd3\xd3\xbd\x1b" - "\x2e\x51\x9d\x2d\x44\xa5\x0c\xc7\x16\xa6\xec\xe1\xb2\x1d\xdb\x91" - "\x37\x95\xf3\xae\x1b\x8c\x7a\xd3\x89\xdc\xaf\x8b\x60\x54\x1b\xcc" - "\x5c\x0f\xd7\xad\xe5\x6f\x8a\xab\xcf\x8f\xb4\x16\xbd\xbe\x5e\x60" - "\xa4\x71\x79\xee\x83\xed\x46\x4a\x3a\x4d\xd7\x5c\xc7\x30\xb9\x6d" - "\xc2\x4d\x66\x6f\x67\x88\x4e\x53\x72\x46\xbb\x9b\x92\x6a\x81\x8d" - "\x2d\xaf\xcb\xf4\x24\x6f\x20\x44\xb6\x22\x32\xe0\xdd\x74\x5c\x8d" - "\x28\xd7\x9f\xf1\x33\xbb\x92\x46\x70\xdd\x80\x6b\x12\x46\x8f\xa1" - "\x7a\x20\x11\xe3\x28\x60\xa4\x5b\x02\x6e\x32\x74\xb8\x93\xd1\x7f" - "\x73\x86\xec\x3f\xea\x45\x59\xd3\x69\x4a\xf9\x87\x11\xf9\x51\xa7" - "\xdf\xb6\x9a\xdb\x90\xf2\x91\x70\x7b\x8c\x3a\x9c\x88\xdb\x73\x4d" - "\xd5\x2b\x44\xed\x6e\xe3\xd4\x80\xd1\x22\x34\x38\x35\x3a\x1c\xce" - "\x87\xba\x52\xb9\xae\x76\xb7\xe9\x95\xa8\x3c\x3e\x3d\x0f\xda\xed" - "\x1f\x13\xa0\x24\x6e\xf3\x29\x4a\x19\xc7\xf5\x69\x7d\x31\x71\x1d" - "\xde\x15\x21\xf2\x62\xec\x51\x77\x3a\xfa\x6a\xab\x0d\x12\x01\xe6" - "\xb5\xd5\x45\x44\x0c\x1f\xed\xb7\x29\x98\x29\x63\x75\x98\x0c\xa3" - "\xbb\xaf\x6e\xcf\xc0\x6a\xd9\x46\xee\xab\x99\xb4\xbc\xf3\xa2\xdb" - "\xc8\x70\xd1\x97\x21\xdc\x97\x3a\x50\x94\x96\x67\x43\x37\x3e\xba" - "\xfb\x7f\x4d\x56\x1c\x6c\xab\x82\x6d\x00\x6c\x83\x47\x2b\xd7\xdd" - "\x7f\x5f\x5c\x7e\x95\x37\x2d\x39\x60\x14\x1a\x1e\x52\x5a\x7b\xf2" - "\x26\x97\x47\xe7\x45\x7b\x8c\x0a\xb7\x64\xf4\x51\x4a\x33\xfa\x99" - "\x84\x3c\xd3\x30\x8e\x36\xed\xfd\x75\xda\x7b\x2b\xde\xdd\xa3\xe0" - "\x5d\x33\x2e\x0a\x5e\x1a\xc3\x8b\xa6\x2d\xc5\x51\x26\xfc\xfa\x40" - "\x41\xee\x8b\x5f\x3f\xb3\x4e\x6f\xcb\xad\x22\xe2\xbc\x1e\x7d\xda" - "\xb8\x2f\x2b\xe2\x16\xe4\x75\x04\xc9\x36\x94\x9c\xa7\xe8\x9a\xdd" - "\x80\x4f\x5b\x56\x93\xd9\x99\x2f\x82\x5e\x47\x1b\x35\xfa\xdb\xc8" - "\xe9\x07\x6f\x84\x2e\x52\xd1\x45\xd0\x62\xe8\x2c\x15\x3d\x47\xd6" - "\xba\xc2\xcf\x29\x11\x2d\x47\x8c\x82\x9c\xc3\xb8\x6c\x0b\x35\x56" - "\xb6\x90\xb3\x32\xb6\xac\xf3\x06\xb2\x36\xe0\x19\x63\x6e\xe1\x76" - "\x30\xbf\x85\x52\xf6\x65\x15\xbe\x49\x26\xe7\x70\x32\x36\x2c\xf0" - "\x68\x6d\x49\x75\x70\x5b\x36\x9c\x21\xf3\xdb\x8b\x40\x87\x67\xb8" - "\xbd\x87\xb3\xde\x5b\x1d\x34\xd6\x5a\xa7\x51\xad\xf5\x24\xd5\x59" - "\x27\x50\x9d\x23\x9b\xb6\x9c\xa1\xd4\xda\xe0\x78\xaa\x33\xdd\x47" - "\x75\x23\xb2\xc9\xdb\x86\x7b\xf0\x6f\xad\x35\x40\xb6\x15\x4c\x4f" - "\xa9\xf6\xf2\xa7\xc9\xec\x53\x30\x81\xbb\xd4\x82\xc3\x05\x44\x8c" - "\x3b\x7e\x4e\xd4\x8f\xe5\xd7\x93\x15\xed\x6b\x45\x5b\xbe\x8b\xb6" - "\xfc\x6a\x84\x95\x32\xd1\xe6\x7e\xde\x8a\x10\x99\x0a\x29\xb9\x17" - "\x3e\x4e\x8f\x80\xf6\xc0\xbb\x6d\x55\x90\x27\xcc\xbf\xed\x6b\x72" - "\x20\x13\x52\xc1\xff\xa9\x1b\x34\x1e\x68\x73\xfe\x94\x4c\xed\x2b" - "\x73\x0c\xd5\xaf\x8b\x96\x0e\x77\x7f\xd2\xdf\x81\x17\x5b\xf0\xbe" - "\x75\x4c\x3a\xa5\x79\x43\x59\x74\xa8\xb3\x95\xf9\xb1\x6d\x40\x80" - "\x0c\x0c\xcf\xe2\x00\xef\xac\xa0\x3e\x68\xcf\x9f\xaa\x91\xfe\x0d" - "\xe4\x43\xf9\x2c\x1f\xbd\xd6\xc6\xe5\xc5\x90\xc7\x02\x91\x21\x8f" - "\x5d\x8c\xbc\xf1\x58\xbb\x78\xe3\xb1\x0b\xe1\x37\x1e\xfb\x87\x73" - "\x15\x99\xc3\x43\x1e\xf3\x37\xe6\xcb\x31\x48\x6b\xcc\xc7\x18\x84" - "\xc9\xbc\xf6\x2c\xa5\x3d\xf1\x1c\xc6\x3e\xf4\x29\xad\x5d\x4c\xd6" - "\x48\xf2\xa1\xa0\x37\x74\x82\x9e\x28\x24\x11\x49\xf6\x98\x13\xf5" - "\xaf\x3d\xe5\xb0\x4b\xe7\x2d\xd4\xbb\xd7\x67\xdc\x3b\x8e\xeb\xf5" - "\x27\x1f\x75\xe1\xb7\x01\xbf\x62\xfc\x36\x89\x94\xc3\x9b\x80\x2b" - "\xe7\x80\x75\x06\xaa\xea\x24\x1a\x13\x21\xc3\x19\xea\x7f\x1c\xed" - "\x4f\xeb\x05\x6f\xc3\x22\x1b\x8f\x7b\x6e\x71\x51\x51\x47\x87\x9d" - "\x58\x16\xb2\xfc\x63\x79\xd8\xe1\x1e\x60\x43\x3d\x0e\xc9\xbf\xaf" - "\x43\xc6\xa4\x1c\xf7\x20\xbd\x35\xb0\xc6\x6e\xf0\xaf\xb1\x1b\xdb" - "\x53\x8e\xd7\x22\x4f\x36\xf2\xec\xd6\x70\xd8\xca\xb0\xc0\x5b\xfe" - "\xfe\x21\x4a\x02\xcc\xfc\x0f\x2f\x35\x9b\xb6\xbd\x2e\x4e\x22\x5f" - "\x5e\x37\x2c\xc0\x06\x1c\xe0\x7f\x80\x4b\x4f\x03\xae\x5b\x36\x23" - "\x1f\x97\xf7\x06\xb3\x78\x4e\xf1\x79\xf3\x5a\xc9\x12\xa2\x14\xd1" - "\xa5\xea\x43\x9e\x56\x96\xe9\xfd\x83\xd4\xb7\xc3\x4d\xb3\x18\x36" - "\x97\xf3\xb6\xb5\x12\xca\xd5\x0a\xa7\xdd\x88\xf4\x19\x1d\xc2\x6e" - "\xd8\x80\xf4\x5a\x94\xd7\xea\x6e\xd5\xdb\xc8\x75\xf0\x58\xcb\x76" - "\x82\x1e\x6a\xf3\x82\xd4\xbf\x82\x92\x50\x6e\x36\xc3\x63\x58\xa0" - "\x03\x1f\xfa\x5a\x5b\x9b\xe7\xa7\x88\x88\x81\xe9\x53\xf0\x2c\xe3" - "\x62\xe0\x21\x5d\x00\x1e\xd3\x5f\x1d\xca\xf4\xdf\x2e\xe1\x3d\xf4" - "\x61\x84\xe1\x05\xc9\x64\x93\xed\xfd\x21\xc3\xe8\x60\xf9\x01\x98" - "\x9e\x15\xf7\x52\x1b\x59\xb6\xfb\x9d\xf6\xa4\x46\xcc\x9b\x5c\xfe" - "\xbd\xa2\xd6\x3e\xa2\x3d\x27\x89\x69\x8e\xdf\x7b\x43\x17\x38\xcf" - "\x3a\xd1\x6e\x4f\xea\xdf\x06\x59\x84\x3c\x28\xef\xe0\x76\x46\x8f" - "\xe5\x43\x93\x7f\x38\x81\x7e\x98\x3d\x35\x7b\x02\x4d\x9f\x38\x69" - "\x02\x65\x7e\x77\x74\xe6\xd8\x6f\x7d\xe7\x5b\xf2\xe6\x5b\xdf\x19" - "\xf7\x2d\x9a\xf5\xa3\x87\x26\xd0\xac\x19\x13\x68\x36\x7e\xb3\x66" - "\x4f\x7e\x28\x7b\xf2\xec\x09\x94\x73\xdf\x54\x3c\x4d\x9a\x70\x47" - "\xe6\xfd\xa3\x67\x4d\x9a\x3a\x99\x1e\x9c\x73\x67\xe6\x9d\x77\xd2" - "\xc4\xc9\xd3\xee\xc8\xcc\xd4\xae\x77\x64\x72\x96\x47\xc7\x4d\x9e" - "\x3d\x7a\xd6\xb2\xa5\x05\x4b\x47\xcf\x98\x3a\x89\x53\x20\xdd\xa2" - "\x68\x28\x23\x7c\x29\xc2\xb8\x0e\x88\xf3\x53\x28\x02\xd9\x51\x05" - "\x1a\xc0\xaf\xcd\x53\x74\x0a\x32\xe0\xda\xe7\xab\x78\xec\xe4\x1c" - "\x60\xa9\x01\xdf\x9b\x3a\xdc\x69\x85\xc0\xa1\x9f\x71\x68\xbb\x89" - "\xe5\xc4\x90\x7d\x78\x77\x58\x9b\x6b\xfa\xe0\x7d\x65\xec\xfb\x41" - "\x90\xc1\x96\x7f\x6b\xb4\x11\x79\xf1\x03\xde\x03\x90\x85\xc0\xaf" - "\x9f\xda\x9d\x39\x7d\x40\xdf\x06\xd4\xd1\x02\xde\x6c\x42\xd9\xe6" - "\x28\x9e\x6f\xc1\xf8\x34\xf1\xbc\x72\x8e\xd2\xde\x6f\x2c\xc8\x22" - "\x1e\x27\x6f\x81\x06\xe3\x62\x37\x8c\x14\x09\x03\x63\x0f\x38\xc7" - "\x15\x9c\x6b\x6d\x51\xf2\xc1\xc7\x70\xb6\xe0\x9d\x06\xeb\x62\x23" - "\xe4\x04\xe4\xf8\x03\x11\x67\x06\x89\x94\x7d\x53\x22\x5d\x19\x72" - "\xae\x44\xb9\x9c\x28\xba\x0e\xd4\x39\x90\xef\xed\x29\x06\xd0\x81" - "\x01\xf3\x2f\xfa\x92\xb6\x00\xf4\x1d\x08\x6f\x3c\xfa\xb2\x38\x9f" - "\xc3\x7a\x44\xdf\xd3\x34\xf0\x4f\xe8\x5f\x7d\x64\xe3\xd1\x32\xd1" - "\x21\xd3\x18\x6f\x7b\x05\x3f\xa7\x20\x5f\x57\x77\xda\x3e\x4e\x03" - "\x1d\x24\x31\xbf\x0a\x21\xd3\x31\x67\x0e\x5c\x05\x99\xd6\x8c\xbc" - "\x65\x9c\x77\x4c\x88\xfa\x41\xd6\x58\x6d\x4e\x03\x9d\xa2\x81\x14" - "\x49\x39\xfa\x4a\x54\x7d\x80\x33\x90\x27\x29\xa6\x47\x53\xc7\x79" - "\xc0\x69\x97\xe9\xd0\x63\x06\x3e\x0e\xf8\xaf\xb2\xac\x54\xf2\x7b" - "\xc8\xbf\x73\x3e\x6d\x6e\xee\x79\x06\xaf\x2b\x38\x43\xfe\xbd\x16" - "\xb8\x64\x7d\x81\xf5\xbf\x0e\xf7\xc0\x39\x3e\xea\xef\x57\x73\xe3" - "\x90\x66\xce\x1b\x41\x1b\x45\xea\xf5\xad\x80\x5b\xee\x59\xdd\x46" - "\xa7\xf3\x79\xae\x1d\x98\x16\x71\xda\x29\xb6\x4d\xd7\xd6\x73\xfb" - "\x59\x7e\x00\x17\x27\x40\x07\xc9\x80\xb7\x23\x96\x0e\x06\x7a\x00" - "\xe7\x65\xb4\xaf\x19\x7d\x7a\xd9\x47\xd7\x1e\x89\xb4\xdb\x51\x2f" - "\x19\xc1\x57\x90\xe7\x3d\x30\xb4\xf2\x2d\xb1\xe5\xaf\x2d\xe6\x72" - "\xc8\xdf\xa7\xa3\x5d\xe6\xdf\xc4\x38\xd7\xe8\x0e\x74\x39\x28\x3d" - "\x8e\x2e\xb7\xa1\x2d\xff\x19\xf5\x7e\x6c\xdc\xfb\x75\x78\xff\x5f" - "\xda\x7b\xf0\xfd\xa0\x39\x71\x74\x9b\x8f\xf7\x7f\x43\x7b\x03\xe0" - "\x6b\xe8\x16\xd7\x4e\x01\x8d\xf9\xa3\xf2\x6f\x88\xcb\xbf\x1d\xf9" - "\xff\x9b\xe9\x86\xe7\x1c\xce\x5f\xad\xf1\x0e\xf2\x9b\x91\x7f\x4f" - "\x5c\xfd\xf3\x91\x3f\x10\xd5\xbe\xe3\xb1\xef\xd3\x2b\xf1\xfe\x0b" - "\xa6\x75\xe8\x44\x7d\x90\xa7\x1f\xcb\x12\x96\x63\xb5\x79\x3c\x5e" - "\xe9\xa6\xb8\xfc\x23\x90\x2f\x55\xc3\x91\x51\xc3\xd1\x14\x1e\x47" - "\xd4\x71\x52\xb5\x21\x7d\x5c\x5c\x99\x1c\x94\x49\x07\x1e\x5f\xd6" - "\xe9\x32\x41\x99\xbc\xb8\x32\x9b\x78\x1c\x85\xaa\xc7\xd4\xd1\xd5" - "\x53\x46\x93\x91\xd1\x30\xb8\x6f\xd7\x00\xc6\xee\x58\x18\x83\x5b" - "\x51\xef\xb0\xcd\x4a\xee\x5c\x03\x1a\xba\x13\x69\xff\x0e\x98\xaf" - "\x31\x0f\x80\x57\x03\x5e\x7f\x90\x84\x73\x4a\xaa\xa2\xdd\xeb\xae" - "\x1d\x10\x22\xbe\x1f\xcd\xf7\x0c\x5b\x74\x4c\xd3\x78\xf2\xba\x6b" - "\x71\x45\x7a\x3a\xeb\x6f\x06\x96\xc1\xa2\xe3\x07\x11\x05\xf3\xba" - "\xbb\x84\x91\x8c\x78\x0e\x6b\x75\xfc\x09\xcf\x06\xb4\xff\x15\xcc" - "\x39\x24\x56\x22\xdf\x6a\x9a\x84\xf4\xc3\x92\x57\x55\x3e\xf9\xac" - "\xea\x98\xc2\xf4\x3d\x16\xcf\xfb\xb4\xf2\xef\x33\x3c\xdc\xdf\xa1" - "\xdd\x1b\xc2\x0c\xeb\xbc\xce\x83\x83\x7f\x2e\xcb\x81\x0f\x25\x7c" - "\x94\x17\x2b\xe5\x3b\x86\xf9\x1a\xae\x53\x71\x5d\x87\xeb\x83\xb8" - "\x3e\xee\xfc\x82\xac\xce\xb0\xe4\x47\x7e\x9e\x8a\xeb\x43\xb8\xde" - "\x85\xeb\x6c\x5c\x87\xe3\x7a\x2f\xfa\x10\x66\xbe\xc0\x3c\xca\x36" - "\x56\x00\xf3\xaa\xa2\x2d\xb6\x01\x3a\xa6\x30\x0e\x26\x23\x4f\xab" - "\xe4\x57\x25\x5f\xcc\x6a\x1c\xaf\x6b\x93\x69\x29\x32\xad\x9f\xa2" - "\x07\x95\x16\xd6\xe5\xd0\xf9\x9e\x34\x4d\x36\x69\xbc\xa8\xa5\x29" - "\xf8\xb3\x00\xdf\xc3\x6d\x15\x0a\x56\x1f\x35\xe6\x1a\x7c\x55\xce" - "\x94\xa0\x4e\x43\x74\x9d\xb8\x96\x3b\x1d\x42\xe0\xea\xe2\x31\xf2" - "\xd1\xe0\xdd\x42\xd2\x3d\xe6\x58\x05\x6f\xae\x96\x6f\x2c\xe3\x58" - "\x96\x97\xe9\xe9\x4d\x51\xb4\x34\xb0\xc3\x3d\x38\x14\xc7\x47\x99" - "\xa0\xa5\xdb\x99\x66\x18\xef\xdc\xb7\x01\xf9\x72\x1e\x97\x7d\x91" - "\xf0\xcf\x2b\x9a\xac\xd2\xec\x56\xc5\xbf\x43\xb2\xe3\xe4\x8b\xa4" - "\xd9\x38\x7e\x6f\x63\x9c\x27\x15\x32\x1f\x0c\x81\xfd\xf7\xde\x30" - "\xa9\x33\x6e\x3c\xfa\x3a\xbf\x0f\x60\x8c\xb9\xde\xa4\x7c\xee\xc7" - "\x90\x72\xfd\xbd\x7c\x97\x7c\x22\x8b\xe9\x3b\x29\x4f\xbe\xdb\x8d" - "\xf9\x68\xaf\xfe\x4e\xaf\x27\xa9\x40\xbe\xab\xef\x81\xbb\xcf\xae" - "\xc1\x4d\x4a\xa4\xf3\x89\xe2\x7d\x39\xa3\x89\x8c\xb7\xb9\xa8\x8f" - "\x37\x74\x9c\x66\x86\x44\x78\xb4\x8b\x92\xbd\xa1\x5d\x74\x2b\xd1" - "\xb5\xde\xd0\x49\xba\x8d\x68\xb8\x37\x54\x0e\x1d\x64\x07\xbf\x3f" - "\x74\x0b\x19\x0c\xb8\x3a\x6f\x76\x19\x0d\xde\x50\x01\x8d\x70\x99" - "\x70\xcd\xa3\xfb\xfa\x88\x0e\x6f\x68\x1a\xf2\x2d\xa0\x99\x61\x71" - "\x3e\xbb\x8f\xf8\x6b\x6e\x98\xd2\xa6\xbd\x20\x9c\xde\x10\xec\x81" - "\x50\x3d\xd2\x23\x62\x66\xf8\x0b\xfc\x3a\x44\xa4\x78\x9f\x7d\x66" - "\xf8\xbc\x98\xf4\xc2\x21\x3c\xff\x55\x60\x8c\x84\x37\x34\x9e\x1a" - "\x03\x01\xe4\x73\x0a\x51\xb2\x2f\xe7\x89\x8b\x46\xea\x82\x0e\x11" - "\x29\xd9\x67\x47\x5f\x1c\x5d\xe8\x07\xe6\xd7\x95\x5d\x6b\x70\xdd" - "\xb8\x6f\x85\x7c\x2e\xde\x57\x2c\xcc\xfb\x1c\xb7\xc3\xb8\xe2\x3e" - "\x78\x43\x2d\x94\x0b\xf3\x60\xe6\x2a\xbf\xe0\xf6\x0f\x58\xc7\xb6" - "\xd5\x78\xc2\x18\x58\x66\xae\x72\x0a\xbc\x33\x8b\xe4\x7d\x0e\x6f" - "\xa8\x8d\x50\x47\x31\xe0\xbd\x20\xe1\x15\xef\xdb\x89\xbc\x7e\xce" - "\x17\x0d\x87\x61\x70\xde\x99\x61\xb2\x20\xff\xce\xae\xe4\x7d\x15" - "\xf8\xed\xc5\xaf\x15\x65\x3b\x85\x3b\xfd\xb0\xc0\x7c\x2f\x8a\xf7" - "\x9b\x45\xca\x7e\x6b\x10\x3c\x2c\x71\x19\xa6\x7e\xa2\x64\x3f\xc6" - "\x99\xb2\x41\x77\x68\xef\xfe\x71\xb2\xbd\x1b\xf7\x7f\x27\x28\xfb" - "\xb1\xff\xdb\xaa\x1f\xfb\xef\xe2\xf4\x76\xe8\x3a\xb8\xcf\x69\x57" - "\xef\x7e\x84\x72\x73\x64\xb9\xe2\xfd\x39\xc2\xbc\xdf\x1e\x04\x7f" - "\x01\xaf\x2e\xc6\x23\xf0\xea\x62\x5c\x02\x7e\x8e\xd7\xb1\x89\x44" - "\xf2\x7e\x7b\x57\xf2\x7e\x07\xca\x6f\xec\x92\x3a\xc8\xfe\x8a\xa0" - "\x82\xfd\x06\xe0\xcc\x05\xdd\x26\x01\x46\x05\x60\xed\xec\x72\xdb" - "\x68\xe6\x2a\x11\x9c\x19\x5a\x17\xca\x5d\x45\x49\xa3\xc8\x85\xf6" - "\x1e\x04\x8e\x16\xa0\x9f\x75\xb8\x66\xe3\x3d\x0d\x42\x5d\x87\x00" - "\xb7\x82\xeb\x43\x3d\x3b\x01\xf3\x1d\xc0\x5a\xc0\x6d\xfa\xc2\x4d" - "\x69\x78\xde\xfb\x85\x6a\x5f\x73\xa4\x78\x7f\x30\x62\xde\xdf\xaa" - "\xd3\x10\xd3\x8f\xc2\x5b\x39\xcd\x08\x88\x90\x37\xb4\x8d\x40\x63" - "\x69\x8d\x81\x93\xfc\x1e\xf6\xcf\x2e\x8c\x33\xd3\x54\x01\xae\x3b" - "\x88\xe9\xa7\x31\xff\x05\xce\x7b\x88\x69\x68\x46\x7e\x60\xdd\x68" - "\xca\x37\xe0\xd9\x99\x1b\x32\xd3\x13\xf9\x26\x57\xb8\x78\xff\x91" - "\xc6\x7c\x1e\x97\xe3\x28\xc3\xe5\xf2\xc8\x62\x80\x0d\x60\x10\x21" - "\x8b\xc3\x6f\xea\x6f\x77\x8a\xc6\xc0\x34\xe4\xcd\x27\xee\x0f\xd3" - "\x11\xe7\x9f\xde\x26\x7c\x61\xf3\x01\x07\xf7\x4d\x0c\x70\x51\x43" - "\xdb\x5d\xc4\x76\x58\x43\xdb\x0e\xa6\xd3\x88\x30\x1f\x98\x02\x1a" - "\xed\x9a\xde\xe6\xea\xf3\xc4\x45\x32\x20\x2d\xdc\x60\xdf\x85\xf7" - "\x75\xc8\x57\x2f\xe9\x76\xc6\xc5\x90\x25\x64\xde\xbf\x37\x54\x7c" - "\x20\x67\xc6\xc5\x2e\xd1\x60\x2f\xa7\xc7\xdb\x5c\xc0\xd5\x2e\x9a" - "\x7e\x36\x94\xd4\x98\xbf\x00\x79\x3a\x90\xbe\x43\xd2\xff\xf4\xb3" - "\xed\x62\xc6\x73\xe2\xfc\x8c\x8b\x7f\x15\xd3\xed\xe2\x50\xae\x83" - "\x06\x5c\xb3\x4e\x44\x98\x2f\xea\x5b\x76\xd1\x35\x27\x7d\xc4\x3c" - "\x31\x6d\x7e\x44\x4c\x3f\x7b\x5e\x3c\xf1\x1c\xe3\x66\x3c\x35\xd8" - "\xc1\x3f\x8e\x72\xc6\x77\x73\x83\xbd\x06\xf5\x67\x03\xae\x53\x78" - "\x1d\xdb\x90\xd7\x63\x79\xfc\x6c\x1a\xd5\xb7\x94\x53\x28\x79\xff" - "\xde\x70\xc9\xfe\x23\x91\xe4\xfd\xad\x91\x92\xfd\x41\x91\x7c\x60" - "\x4a\xa8\xe4\x40\x4e\x38\xf9\x00\x68\xe0\xc0\x11\x8c\x53\x32\x8f" - "\x79\xa7\x9b\x6c\x78\xfe\xd7\x4e\x1e\xff\xe2\x03\xcd\xe8\x6b\x10" - "\x3a\xaf\x50\xb4\x7f\xa0\x99\xd7\x16\x50\x36\xd8\x95\x7c\x00\x3a" - "\x19\xae\x92\xf6\x6a\xcc\x4c\x97\xc8\x67\x14\x1b\x6b\xfa\xc1\xee" - "\x49\xea\x4a\xae\xb1\xe2\x97\x81\xdf\x38\xa4\x15\x03\xfe\xb5\x92" - "\xa6\x8a\x6b\x8a\xc5\xf7\xcb\xa0\x43\x5f\x04\x9c\x9a\x9d\x33\xc3" - "\xf7\x08\xe0\x10\x7c\x52\x53\x1c\x29\xa9\xa9\x00\xac\x23\x41\x49" - "\xfb\x35\xff\xc6\xb0\xbb\xd6\x64\xf0\x9a\x83\x09\xef\x9b\xc5\xc6" - "\x83\x0f\x04\x99\x56\xcd\x07\xa7\x44\xcc\x07\x77\x8a\xe2\x83\x39" - "\x3f\x78\x41\xf8\xc3\xc5\x07\x1d\x91\xe2\x83\xf6\x50\x5f\xe8\xe6" - "\x8e\x1a\x62\xf9\x14\xfa\xbd\x00\x0e\x3e\x02\x3e\x76\xc8\xf1\xf7" - "\x3a\xc0\x03\xab\x86\xba\x1a\xda\x40\x0b\xf9\xbf\x92\xb2\xa9\x31" - "\x70\x5c\xe2\x54\x24\x1f\x9c\xc2\x34\xc5\xe3\xfb\x44\x3e\xb9\x44" - "\xc9\xc1\x9c\x48\xc9\x41\x7b\xb8\x04\x70\x93\x51\x4f\xca\xa1\x33" - "\x41\xc9\xaf\x87\x40\xaf\x35\x28\xf3\x11\x29\x1a\x3f\xd4\xda\x9b" - "\x8c\x64\x59\xc5\xf2\x69\x66\x28\xc8\x34\xf3\x37\x96\x6b\x4a\x4e" - "\x51\xae\x2e\xa7\x58\x46\xb1\xbd\xc3\x72\x2a\xa2\xc9\xa9\x88\x26" - "\xa7\xe4\xb3\x19\xb2\xa6\x78\x9f\x83\xe5\xd1\x4c\x87\x92\x33\x33" - "\xc3\x99\x02\xb4\x91\x0a\x18\x0e\x35\x16\xc8\xb3\x71\xdf\x0b\x32" - "\xbf\xc4\xd3\xbe\x9d\x11\xc8\x1b\xfc\xf6\x46\x94\xbc\x09\x6a\xf2" - "\xc6\xa8\xcb\x9b\x30\xe6\x35\xf0\x54\x24\x91\xbc\x89\x68\xf2\x26" - "\x2c\x94\xbc\x89\x68\xf2\x86\xd3\xc3\x9a\xbc\x09\x27\x90\x37\xe0" - "\x67\xee\x6f\x92\x26\x67\x5c\x2c\x67\xb8\xbf\xa0\x35\x7b\x44\xc9" - "\x99\x62\xd8\x3a\x46\x96\x33\x61\x94\x89\xe8\x72\xa6\x43\x96\xdf" - "\xc9\xb2\xa6\xeb\x45\x82\xfc\xb4\x11\xcb\x18\x29\x4f\x42\xc3\x43" - "\x2c\x4f\x80\xbf\x7b\xe2\xe5\x09\xe0\xed\xc5\x7d\x9a\x26\xa7\x5a" - "\x61\xe9\x86\x20\x4f\x8e\xcc\x74\x04\x30\xd6\x9f\xc2\xf6\x87\xdc" - "\x76\x14\xb8\xbc\x8e\x10\x41\x0e\x04\x45\xa3\x8b\xd0\x46\xd0\x6f" - "\x18\xb2\x82\x08\x7c\x39\x25\x04\x1e\x07\x8d\xe7\x34\xe6\x9f\xa0" - "\x30\x78\x75\x7a\x5b\xbb\xf7\x89\x40\x46\xda\xf4\xb3\xc2\x0f\xfc" - "\xf8\x9e\xc8\x77\x41\xbe\x64\xf8\x1b\xda\x0e\xd2\xb4\x16\x11\x99" - "\x36\xcf\x67\x03\x0f\xe4\x4c\x5f\xec\xb1\x3c\xf1\x5c\x1a\xf8\x4c" - "\x78\x20\x17\x3f\x9e\x7e\x36\xcd\x32\xb7\x85\x6e\x9c\x36\x5f\x44" - "\xc2\xe0\x33\xf4\xf7\x08\xfa\xdd\x8c\xb6\xb7\x82\xe7\x82\xe0\xb3" - "\x29\xa1\x38\x3e\x13\x29\x07\xfe\x15\xf7\x36\x85\xbf\x03\x41\xf0" - "\x59\x73\x44\xce\x67\x2d\xd2\xc6\x44\x3d\x72\x2d\x0e\xbc\xd6\x1c" - "\x29\x51\xbc\x16\x11\x8a\xd7\x22\x8c\x3f\xa3\xc6\x6b\x18\x0b\xf0" - "\x8d\x15\xbf\x0c\xfc\x12\xf3\x5a\x7e\x14\xaf\x3d\xa7\xf1\x5a\xb2" - "\xe2\x35\x8c\x69\x52\x78\x8d\xe2\x37\x86\xcf\x76\x68\x37\xbf\xa5" - "\x1c\x9c\x82\x7b\x83\xa2\x1d\xc9\x73\x98\x57\x0e\x3a\xc0\x6f\x76" - "\xf0\x1b\xe0\x09\x3f\xcb\x4d\xd0\xe6\x7f\xf2\x5c\x37\x23\x5f\xfc" - "\x67\x6e\x78\xa8\x0b\xfc\xe4\x80\x2c\xfb\x2b\xe4\xe8\x7f\x3e\x11" - "\xa0\xed\xe0\xa7\x29\xe0\xa3\x1c\xf0\x93\x1d\x7c\xc5\xfc\xd4\x1a" - "\x5e\xc3\x30\x0f\xb5\x76\xc3\x90\x73\x65\x2c\x3f\xf5\xb6\x0e\xda" - "\xe1\xb6\x15\xfa\xe8\x40\x3e\xeb\x2b\xb8\x2f\xf6\x51\x4d\xb6\x76" - "\x0f\xfd\x67\xbb\x55\xea\x31\xe0\xc1\xfc\x22\xba\xee\x0c\x0d\x9f" - "\x02\x7a\x27\xdc\xa7\xe2\x7e\xda\xcc\x5b\x0f\x89\xc8\x26\x83\x15" - "\xf5\x76\x30\x1f\x0a\xf7\x58\xd6\xcf\xb2\x40\x87\x66\xd1\x91\x91" - "\x2a\x52\x8e\xdd\x28\xba\xac\xbc\xd6\x66\xc1\xf3\x00\xf4\x7f\x04" - "\xae\x03\xb7\x5d\xa2\x74\xfc\xac\xdb\xdc\x11\x17\xeb\x4e\xb8\xcf" - "\x14\x2b\xad\x29\x5b\x56\xd0\x28\x4b\x80\xcc\xd5\xee\x48\x8e\x65" - "\x5d\x1a\xaf\x39\xa5\xf3\xbd\x70\xef\x18\x5f\x7d\x89\x4c\xbc\x2e" - "\x10\xe9\x8f\xfa\x1c\x16\x21\x96\x67\x50\xf5\x32\xc8\x07\x37\x59" - "\xab\xdd\x62\x77\xb8\x83\x71\xb0\x2f\x47\x6f\x0b\xb7\x0d\xed\xbc" - "\x01\xed\x9c\xfb\xf0\xaa\x2c\xfa\xc8\x41\x09\xd7\x6a\x3b\xdc\xc3" - "\xbb\xfb\xdf\xcb\xfb\x4a\x1d\x27\xbd\xbc\xaf\xd1\xf1\xd4\xcb\xba" - "\x9e\x89\xe7\xe8\xf0\x0a\xe1\x2f\x7d\x9a\x18\x17\x56\x67\x48\xfc" - "\x17\xf0\xe8\x2a\x0a\xd3\x0d\x33\x57\x7d\x5d\x78\xdb\x84\xc7\xeb" - "\x38\x4b\xd5\x78\x5f\x54\x28\x22\x91\xe4\x63\xa0\xd9\xa3\xa1\xf6" - "\x15\x22\xc4\x6b\x39\x1d\xee\x9b\x6c\x3e\xfa\x9e\x47\x8d\xc5\xfe" - "\x66\x69\x43\x9a\x8f\x86\x00\xeb\x5a\x86\xd5\x80\xf2\xe1\x92\x63" - "\xd0\x3d\x6f\x9a\xe2\xa3\xa3\x39\x32\x9f\x79\x7f\x73\xfe\x6a\xfa" - "\xda\x19\xba\x49\xe2\x58\x14\x1f\x4b\x67\x79\x80\xb4\x34\xa4\x6d" - "\x12\x25\xc7\xac\xc8\xef\xf0\xd1\x07\xe5\x4a\x8f\xbd\x69\x93\x9e" - "\x0f\xf7\xf3\xf8\x3e\x86\x7e\x0c\x72\x31\x1d\xb0\x6c\x3d\x9b\x55" - "\x06\x6d\x79\x5d\xff\x4b\xc3\x2f\x2b\xf1\xeb\x1e\x79\x7e\x20\x07" - "\xba\x16\x39\xd7\xd2\x30\x8c\x0f\xda\xf7\x0d\x03\xec\x88\xd3\xc2" - "\x7d\x53\xc5\xdb\xab\x83\xb0\x13\xbe\x91\xea\xa3\x97\xea\x7a\xc3" - "\xa7\x60\x5d\xe7\x92\x68\x2d\x5d\xd1\x8d\xcb\xcf\x66\xae\x8a\x08" - "\xbe\x67\x79\x54\x8d\x74\xc6\x1b\xe0\xcc\xd1\x71\xd6\xfb\xb8\x1c" - "\x4b\x53\x36\xe7\x37\xf6\x08\xb7\x20\xcf\x8d\xbc\xc7\xf4\x8d\x0f" - "\x14\x1e\x0e\xb4\xb6\x43\x8e\xf0\x3a\x31\x6c\xb3\xc0\x72\xab\x08" - "\x02\xe6\x4e\x1f\x8d\xca\xd4\xd6\xa1\x02\xde\xd0\x64\x96\x2d\x09" - "\xe7\x2d\xde\x13\xeb\x81\x3f\xe2\x78\xe3\x30\xc8\x21\x29\x9b\x4e" - "\x6c\x28\x52\xed\x0e\x32\x5c\x4f\xd1\x05\x6a\xc1\xfb\xe5\x01\xd1" - "\x2a\x8a\x4f\x38\xd8\x8e\xf0\xac\xe8\xe4\xb4\x13\xa0\x6d\xe1\x59" - "\xc6\x6d\x1a\x71\xc2\x73\x63\x27\x9d\x76\x50\x52\x75\xf7\xfa\xcf" - "\x08\x0f\xaf\xf7\xa8\x75\xae\x11\x59\x3e\x1a\x1d\xd4\xdb\xc5\x3a" - "\x06\xf0\xcb\xb8\x6e\x66\x5d\x83\xf7\x1e\x96\x17\x8a\x20\xeb\x1c" - "\xc8\x9b\xa7\xf7\x81\xfb\xa7\xfa\x35\xc2\x15\xdd\x2f\xde\xa3\xb2" - "\x14\x2a\x1c\x2c\x5f\x45\x66\x9b\xc2\xb5\x99\xfb\xcb\x7d\xe1\x3e" - "\xcb\xbe\x48\x19\x8b\x39\x22\x74\x17\xec\x31\x99\xce\xb0\x60\xff" - "\x8c\xd2\x68\x6a\x44\x56\x3c\x1d\x75\x8f\xa3\x79\xff\x4e\xd8\xa0" - "\x37\x3a\x23\xe2\xd4\x69\x1a\xf9\x88\x5a\x3b\x1b\xf9\x48\x84\xf5" - "\xec\x20\xd3\xaf\x57\xee\xbd\x78\x0b\x59\xde\xca\xbc\x83\x90\xb7" - "\x05\x79\xa6\x6a\x79\xa7\xaa\x3d\x3b\x79\xed\xc7\x57\xcc\x63\xef" - "\xf8\x68\xe4\x3c\xbf\x9c\xef\x4f\x64\xe9\xcf\xb0\xdd\x61\xff\x8d" - "\xb4\x8a\x12\x6f\x30\x71\x5b\x0e\xee\xe4\xf9\x2c\x7c\x49\xb4\xa1" - "\x9e\x21\x4c\x53\xce\x55\x74\x3d\xe8\xf2\xb3\xa2\xb5\x34\x88\xe9" - "\x49\x24\x1f\x1b\xa6\xf0\x3e\x72\x97\x70\x43\xf7\x84\x44\xcd\x5f" - "\x41\x5f\x03\x1f\xa5\x9f\xa1\x91\x87\x73\x0b\x6d\x68\x2b\x51\xe9" - "\x39\x22\x29\x83\x92\x8f\x59\xbd\xa1\xcf\xa9\xfa\x1c\xaf\xed\x8c" - "\xf4\xe9\xb4\x88\xfb\xb6\x2b\xc9\x0b\xcc\x33\x19\x6a\xed\xe1\xe6" - "\x47\x78\x9f\xe1\x14\xdd\x9c\xcd\xfd\x55\x7b\x9c\x37\xdf\x25\x2e" - "\x89\xb9\x42\xce\x69\x35\x56\x1f\xdd\x9c\x8f\x6b\x86\xfc\xb9\x69" - "\x9e\xf6\x6c\x45\xbe\x11\xe2\x52\x84\xf3\x64\x20\x6d\xbc\x70\x1b" - "\x98\x27\x6a\x3a\xdc\x37\xc3\x1e\xfd\x7e\xb3\x1a\x9b\x9b\xc7\x32" - "\xac\x5e\xda\x60\xc5\xd8\x12\xd3\x26\x60\xfd\xc9\x56\xc4\x6b\x97" - "\x37\xbf\x23\xf9\x02\xb0\xaa\x8d\x4a\x6e\x47\xd0\xd6\x2a\x77\xc4" - "\x0e\x19\x6d\x8f\x6c\xfc\xb3\x5d\xde\x6b\xef\x84\x36\x8f\x26\x86" - "\x7f\x62\x83\x67\x28\xd3\xf8\x2d\xa3\x14\x9c\x13\x0e\xcf\xd0\x33" - "\xfc\x3c\x9a\x9f\x03\xe6\x8f\xed\xde\x8a\x2c\xd4\x7f\x06\xf5\xde" - "\x32\x4a\xd9\xf3\xb7\x8c\x6e\x47\x1d\x1d\xee\x5b\x46\xf9\x68\x8c" - "\x49\xed\xb9\x7c\x6c\xef\x6d\x2f\x99\x79\x87\x79\x4e\xf1\x74\xc6" - "\xd9\x86\xed\xcc\x7f\x35\xe6\x76\x73\x4d\x86\x26\x37\x78\x9d\x26" - "\xf5\x14\x65\xb4\x35\x58\x25\x7d\x1b\x85\xf1\x96\x4d\xbf\x8e\xf8" - "\x8d\xbc\x2f\xa6\xc4\x57\x46\xdb\xe5\xbf\x5b\x3c\xf8\x35\xe1\x77" - "\x52\x7b\x6e\xc5\x2f\x84\xfb\x69\xf8\x9d\x94\xb8\xdb\xba\xc0\xe0" - "\xc3\xbb\x76\xe8\xec\xfc\xec\xa3\x5b\x8e\x88\xad\x23\x8c\xc2\xac" - "\xee\xab\xaf\xe7\x75\x82\x5b\x02\x18\x83\x42\x35\x16\x19\x72\x4d" - "\x05\x6d\x63\xbc\x0b\x67\x85\x08\xd6\x15\x05\xb8\xdd\x23\xea\x2a" - "\x02\x64\xbb\x99\xfb\x9f\xc1\x63\x2c\x02\xc0\x3f\x5f\x97\x57\x08" - "\x7f\x6d\x65\x88\x78\x7f\xae\xc3\x9d\x01\xfe\x5f\x3c\x4d\xad\x39" - "\x9c\xd8\xce\xf0\x34\x9a\x10\x7a\xff\x95\x4c\xfb\xd8\xce\x63\x89" - "\xe7\xe7\xd1\x77\xcb\x39\xca\xf8\x40\xa4\xfc\xd9\x5e\x6b\x27\xda" - "\x06\x39\x82\xb9\x46\xee\x15\x54\x4b\xff\x80\x0c\xcc\xff\x37\x9f" - "\xd4\xf7\x93\x36\xe3\xfd\x16\xbc\xc3\xdc\xe3\x6f\xb0\x07\x89\x61" - "\x85\xb9\x7f\x28\x7f\x30\xe2\x37\x61\xae\xc6\x98\x7f\x6c\x2f\xca" - "\x87\x9c\xe9\x96\x5b\x19\x73\xd7\x9e\x15\x41\xbd\x7f\xb5\xdb\x99" - "\x17\x32\x40\xff\xcf\xd8\x7b\xa5\xff\xee\x36\xdf\x96\x5c\x3b\x42" - "\x8d\x59\x04\x78\x89\x1d\xb3\xdb\xcc\x6a\xbc\x6e\x1d\x1f\x3b\x5e" - "\xb7\x41\xb7\xb9\x75\x03\x7e\x95\xf8\xed\x52\xcf\xd1\xbf\x5b\xf3" - "\xa3\xee\x6b\xf0\x83\xec\xbc\x15\xf3\xff\xc8\xa0\x1a\x07\x4e\x47" - "\x3f\x98\x46\xfe\x41\xd0\x0d\x73\x88\xf7\x6b\x39\x9d\xe9\x99\xd3" - "\x23\xd0\x67\x7c\x74\x6b\x19\xde\xa7\x31\xaf\x96\x46\x28\xe6\xbd" - "\x17\xb5\x7b\x56\x43\x56\xd3\xad\x9f\x31\x2c\xcb\xba\xe2\x62\xa6" - "\x53\x94\x29\xb7\x84\x8a\xa1\x4f\xde\xda\xa6\xe3\x15\x69\xc7\xf9" - "\x3d\xd3\x64\x87\xfb\x36\x13\xf0\xb2\x53\xee\xc7\xc2\xde\x4b\xac" - "\x6b\xdc\x96\xd1\xad\x93\x99\x6b\x8a\x59\x1e\xb5\xd1\x37\xc7\x42" - "\x66\x61\x6c\xff\x3c\x4f\xcd\x35\xdf\xbc\x8b\x9f\x21\x2b\x3f\xc3" - "\x7d\x66\x03\x64\x52\xe7\xc6\xa3\xae\x2e\x23\xf5\xeb\x34\x52\x56" - "\x68\x8b\x61\x7c\x28\xe5\xf0\x26\x6f\xeb\x1e\x6a\x0c\xfd\x86\x6c" - "\x4f\x4b\x18\xb7\x7a\x41\x03\xce\x55\x22\xfc\x5e\xe7\x4e\x93\x37" - "\x74\xde\x83\xb9\xf9\xeb\x67\xe8\x9b\x12\x1f\x2f\x9d\xc2\xac\xff" - "\x84\x84\xad\xf0\x93\x6a\xb0\x6e\x59\x24\x42\x5b\x4e\x8b\x00\xf4" - "\xbb\x94\xcd\x9d\x34\xea\xad\xd5\x94\x59\xd9\x49\x23\xaa\x3a\x29" - "\x43\xfc\x2d\xc3\x58\x09\xbd\xed\x89\x8b\x69\x04\x99\x90\x33\x20" - "\x9f\xcc\x55\xab\x49\xd2\x48\x78\x33\xf4\xb7\x10\xf4\xb7\xf3\x19" - "\x2c\x1b\xbb\xf5\xb7\x2e\xa9\x17\x1f\xdb\xa0\xe8\xe8\xd8\x86\xfe" - "\x76\x32\xa4\xce\xa3\x34\xb4\xcf\x79\x8e\x6e\x5b\x9c\x8a\x09\x91" - "\xfb\xec\xd3\xfa\x0b\x9c\x17\x5a\xec\xd4\x4f\xf6\x15\xf2\x5a\x94" - "\xfc\x79\x5e\xaf\xf3\xb0\x91\x69\x2a\xc0\x7c\xc3\x7d\x58\xc7\x7b" - "\xc6\x7b\x86\x06\x4d\xcb\x2b\x45\x90\xd3\x0b\x86\x8b\x20\xd2\xed" - "\x5c\xf7\x6e\xa4\x77\xb8\xbf\x59\xe6\x33\x7e\x30\xad\x37\x1a\x85" - "\x7d\xa4\xc9\x95\x51\xd7\x0a\xa3\x8b\x69\xf4\xc8\xda\x10\x74\xef" - "\x73\xcc\xb3\xa3\xd2\x66\xe6\x89\x90\x6d\x09\xef\xdf\x8f\x22\xf6" - "\x2d\xe0\x3d\xc5\x5f\x43\xb7\xf9\x32\x7f\x02\x9e\x2f\xd8\x56\xb0" - "\xe4\x01\xe6\xc6\x9a\x23\x02\xf6\xf9\x57\xf5\x67\x40\x3f\x53\x5f" - "\x1d\xcc\x7e\x36\xa3\xa6\xf9\x68\xda\x0e\x6e\xbb\xf4\xa5\x81\xec" - "\x84\xbe\x35\x08\xed\x2a\x0e\x00\x0f\x78\x8f\xf9\x7f\xaa\xbe\xff" - "\xeb\xe7\xbd\x57\xa4\x61\xfe\x7f\xa0\x86\xd3\x0a\x86\x93\xb5\xc0" - "\x26\x7a\xd3\x69\x4c\xbc\x27\x0d\x78\x43\x50\x66\x8f\x0e\x07\xf3" - "\xd4\x2f\xda\x8d\x0f\x3f\x8c\xb4\x23\x3a\x1c\xe4\xb9\x0e\xcf\xcd" - "\xdd\x79\x54\x99\xd6\xa8\x32\x0f\xb7\x1b\x6f\xfb\x05\xd2\x42\xb1" - "\x65\x46\xa7\xc6\x96\x19\x3d\x2c\xaa\x8c\x4b\xd5\x33\x3a\x33\xae" - "\x4c\x56\x5c\x99\x59\x97\xb7\x6d\xf4\x82\xb8\x32\x05\x71\x65\x36" - "\x5c\xde\xb6\xd1\x15\x71\x65\x76\xc6\x95\xd9\x1b\x85\x4b\xf6\xab" - "\xc9\x44\x5a\x7d\x5c\x99\x93\x71\x65\xda\xf4\xe7\x5e\x70\x9c\xba" - "\x7c\x1b\x59\x41\x9b\xec\xbb\xe5\x7f\x15\xe3\xd3\xfe\xc6\x33\x1d" - "\xaa\xec\xed\x19\x97\xf7\xeb\xf6\xf1\xb1\xf5\xdd\x3e\x2d\xb6\xbe" - "\xdb\xe7\x5e\xde\xaf\xdb\xf3\xe3\xca\xb8\xe2\xca\x94\x45\x95\xd9" - "\xae\xd5\xb3\x23\xae\xcc\x9e\xb8\x32\x75\x97\xd3\xd5\xed\xcd\x71" - "\x65\x5a\xe3\xca\x04\xbf\x04\x17\x3c\x8f\x2b\xbf\xb6\xc1\xac\x2b" - "\xdf\x0b\x1d\x61\xcc\x7c\xf6\x8d\xe0\x7d\xd0\xb7\x3b\x83\x7d\x78" - "\x7f\x8e\xe7\xab\x5a\x47\x10\x73\xcb\x18\xd8\x3f\x63\x3d\xfa\x9c" - "\xc5\x7e\x23\xcc\xd3\x4a\xc7\x1e\x93\xd1\x9b\x2e\x2a\x7d\xcf\x34" - "\xff\x35\xae\xab\x76\x18\xcf\x53\x63\xca\xbb\x75\x62\xe5\x83\x46" - "\x1a\x9c\xbf\xeb\xfb\xb0\xd5\xca\x1f\xc5\xc0\x3a\x79\xad\x43\x96" - "\x39\x12\xa5\x47\x73\xfd\x81\x3d\xab\x83\xa6\xb8\x76\xec\xbc\x42" - "\x3b\x52\xa1\x1b\xd9\x1b\x31\x7b\xf1\xfe\x7a\x43\x25\x74\x20\xe8" - "\xfd\xdc\xb6\x53\x94\x99\x29\x75\xb2\x25\x9d\xc4\xf7\xde\xc2\xbb" - "\xe5\xfe\xbb\xd2\x49\x33\xed\x75\xa8\x9f\x75\xf7\xba\xfc\x0b\xec" - "\x23\x85\xf9\x97\x75\xb7\xcc\xd7\x6a\x0b\xfd\x68\x57\xe6\x3c\xdd" - "\x4f\xc5\x47\x99\xe5\x52\xd7\x28\x3e\x31\x8f\x7d\x03\xd8\x87\xa6" - "\x36\x30\x8e\xf3\x80\xfe\xc7\xe4\xe9\xfd\xc5\x5c\xef\x47\xde\xf1" - "\x57\xc2\x99\x1a\xc3\xcc\x9a\x58\x9a\xec\x03\x5a\xc9\x6c\x8a\x1d" - "\xf7\x4c\x5f\xec\xb8\x67\xfa\x63\x69\xd2\x08\x9a\xbc\xc3\x14\x5b" - "\xe6\x8e\xf4\xd8\x32\x77\x8c\x88\x2a\x53\xa6\xea\xb9\x63\x5c\x5c" - "\x99\x29\x71\x65\x72\xa2\x9e\xd1\xc7\x3b\xec\xdd\xb6\x8f\xf4\x81" - "\xba\xc3\x11\xf5\x6c\x2c\x97\xf2\xf3\x8e\x4d\x7a\x1a\xaf\x1d\x55" - "\xbd\xae\x7c\x70\x34\x78\x3b\xe3\xf8\x9d\xf3\xd7\xc4\xb5\xa1\x3e" - "\xae\x0d\xdd\xfc\xaf\xed\xdd\xff\xe1\x34\xdd\xb9\x47\xdb\xbb\x6f" - "\xc3\x9c\x3d\x93\x9f\x01\xab\x02\xf9\x81\x87\x3b\x53\x63\xe1\xdd" - "\x39\x2c\x16\xde\x9d\xa3\xa2\x9e\xd3\xf0\x3c\x3e\xaa\x0f\x69\x49" - "\x56\x32\x80\x5e\xa0\xbf\xdd\x39\x47\x4f\x67\x9b\x12\xed\x6d\x75" - "\xca\xb9\x26\x8b\x7d\xcb\x06\x9e\xa2\x3b\x27\xb2\xfd\xa9\xc1\x8c" - "\xe6\x7f\x52\xfd\xba\xb3\x3c\xae\x1d\x3b\xe2\xda\xb1\x27\xaa\x5f" - "\x01\xcb\x3a\x7a\xd0\x12\x7a\xe8\x11\xd6\x7d\xd8\x9f\x52\xfa\x78" - "\xad\x85\xce\x76\x91\xd2\xd8\xb7\xee\x74\x01\x25\x79\x1d\xad\xb0" - "\xe5\x8e\xb9\x7a\xa5\xa7\x94\x13\xf9\xca\xb7\x8a\x6c\x1d\xee\x6f" - "\xa5\xeb\xf4\x18\xd9\x78\x22\x3f\x52\xf2\xa7\x6c\xa4\x41\xfe\x65" - "\x6e\x57\x7a\x6e\x53\x99\x70\xe6\x54\x00\x9f\xb0\x8b\xc6\x5e\xa7" - "\xd9\x11\x1b\xd8\x47\x8c\xfd\x58\x31\xc7\xa7\xaa\x7d\xf8\x6f\xcd" - "\x8d\xa2\xeb\x80\x6d\xf5\x3d\xe2\x14\x8d\x1d\xce\x3a\x00\xf3\x28" - "\xfb\x9a\xd5\x86\xfc\xc4\xb6\xb7\x37\x74\x46\xea\x6e\x78\x6f\xd3" - "\xca\x56\x44\x95\xf5\x6b\xb6\x71\x2b\xbf\x1b\x13\x22\x53\x6d\xc0" - "\x4f\x80\x93\xae\xf4\xbd\xb1\xc3\x6b\xc1\xaf\x28\x53\xaf\x97\x61" - "\x3b\x5a\xee\xf1\x16\x90\xe9\xf6\x42\x32\x79\x56\x9f\x92\xb0\x75" - "\xbf\x0d\xe8\xd2\x6d\xde\xc2\x56\xf2\x06\x9a\x79\xad\xcb\xa4\x7c" - "\x74\xc6\xda\x92\x82\x64\x6e\x2f\x39\x01\x7b\x6e\xac\x2d\x5c\x72" - "\xc2\x8e\xb6\x61\x7c\xbe\x95\xcd\xf2\x26\x1a\x77\x93\x27\xcf\x7a" - "\x68\xe6\xf4\xd1\x3f\x7a\x68\xea\x9c\xc9\x77\xdb\xe6\x2c\x7e\x76" - "\xe1\x82\xd1\x4b\x9f\x2f\xb0\xad\x5c\xb6\xb8\x60\xf1\x92\x1f\xdb" - "\x32\x1d\x23\x1d\xb6\xf9\x05\xea\x9a\x91\x37\x7f\x79\xc1\x04\xbe" - "\x1d\x65\xcb\x5f\xb6\x70\x85\xbc\xbd\x35\x85\x62\x81\x2c\x2e\x58" - "\xb8\xcc\x36\x72\xc1\x28\xdb\x7d\xf3\x17\xe7\x3d\xbf\x6c\x61\x42" - "\x58\x77\xdb\x96\x2d\x5c\xb6\x70\xfe\x02\xdb\x04\x5b\x26\x43\x8e" - "\x06\x17\x35\x9e\x99\xfa\x3c\xc6\xf3\x57\xa9\x5b\x34\x69\xf3\x99" - "\x4f\xd1\xcf\xd8\xc0\xe5\x73\xd9\x5d\xe6\x58\x9a\xbb\xcb\x1a\x4b" - "\x73\x77\x65\x5c\x3e\x97\xdd\x15\x37\xff\xdd\x15\x37\xff\xdd\x35" - "\xf7\xf2\xb9\xec\xae\xb8\xf9\xef\xae\xb8\xf9\xef\xae\xee\xf9\x0f" - "\xb4\xe4\x5b\x2f\xe5\xc2\x5d\x71\xf3\xdf\x5d\x71\xf3\xdf\x5d\x75" - "\x71\xcf\xc7\xa3\x9e\x07\xe1\xb9\x25\x7a\x7e\xc4\x73\x40\xe7\xcf" - "\x1e\xf9\xf2\x6d\xb3\x9e\x87\x65\x3d\x64\x73\x8b\xca\xfb\x6d\x5b" - "\x54\xde\x56\x2d\xef\xd8\x6e\xfe\xe3\x7d\x6d\xa4\x2b\x7b\xfd\xdb" - "\x6f\xb2\x4c\x67\x7f\x3c\x9e\x9b\xc0\x1f\x5f\x3f\x47\xdf\xbe\x96" - "\x61\x31\x0d\xb3\x7f\xa6\x78\xe3\xb1\x8e\xea\x81\x64\xe6\x32\xd5" - "\xaf\xb0\x5f\xef\xd8\x51\xec\xab\x8b\x34\xf6\x5d\x86\x4c\xf9\x36" - "\xf4\xdf\xdf\x69\x7b\xdf\xdf\xf6\x49\x9d\x1f\x65\x34\xf8\xd2\xae" - "\x01\x1c\xf6\x05\x36\x97\xaa\xb9\xb8\x05\xf7\xa9\x4c\xd3\x28\x6f" - "\x12\xc6\xb1\xcf\xb1\x0f\x34\xd2\xd2\xf0\x4b\x07\x3c\x9f\x0e\x6f" - "\xc3\xe0\xc4\xba\x65\xbc\x9e\xdb\x6d\x0f\x1a\xc9\x52\xea\x8e\x34" - "\x7b\x23\xac\x5b\x7f\x27\x5d\xad\x2d\x1c\xdd\x2e\xdc\x87\x72\xaa" - "\x91\x9e\xd8\x4e\xfa\x0e\xf4\xbf\xef\x98\xd5\x7a\xcb\x77\x30\xfe" - "\xd3\xc7\xaa\xb5\xd3\xa3\xdb\x21\x6f\x3b\x01\xe7\x22\xae\x5d\xb8" - "\xfe\xbb\x0e\xdf\x23\xed\xed\xef\x14\x08\xb7\x61\x36\xc3\x8d\x4b" - "\xdf\x04\xf9\xd6\x69\x09\xb9\x72\x12\xbc\xdb\x29\xdc\x49\x0f\x25" - "\x48\xf7\x40\x67\xe8\x44\x3b\x02\xdc\xde\xa8\xf4\x66\xe1\x1e\x30" - "\x87\xf3\xfb\xb8\x3e\x94\xe9\x4d\xd7\xd6\xfd\x6f\x95\x0f\xff\xb8" - "\x11\x71\xfd\xf8\xe2\x34\x8d\xfb\xa9\xea\xc7\xb8\x70\x6c\xdd\xe3" - "\xc6\x27\xee\xc7\xb8\x39\xe8\xc7\x17\x89\xfb\x31\x2e\x5f\xe2\xd6" - "\x88\xbe\x18\x2f\x7b\xc7\xbe\xac\x5f\x48\xbc\xc7\xa6\xef\xd0\x74" - "\xa1\x00\xec\xb0\x34\xbc\x93\x65\x67\x17\xf6\x8c\x9b\x96\xaf\xde" - "\x52\x41\xb3\x12\xd4\xd9\x22\xdc\xfd\x66\xfb\xe8\xbb\xf2\x5c\x43" - "\x54\x7a\x48\xb5\x05\x78\x32\x32\x9e\xd0\x1f\x94\xeb\x6d\xbc\x75" - "\xbb\x44\xad\x85\x7c\x17\xfc\x3f\x8e\xf4\xb5\xcc\xe5\x85\xc2\xaf" - "\xe3\x11\xef\xec\x71\xef\x82\x51\xef\x36\xc4\xbc\x5b\xdb\x9d\x5e" - "\xa9\xa7\x7f\xb5\x71\xfa\x6e\x7d\xdc\x38\x61\x7c\xee\x7e\x3c\xb6" - "\xdf\xdf\x3d\xa9\xfa\x87\x31\xba\x0c\xd7\xdf\x0d\x62\x8c\xba\x12" - "\x8f\xd1\xdd\xe9\x89\x69\xed\x6e\xb9\x8e\x26\x06\x52\x02\x78\x77" - "\xf3\xbe\x53\x97\xa4\x41\x6d\x9c\x2e\x1f\x9f\xbb\xf3\xf4\xf1\xf9" - "\x6a\x7d\xbc\x7b\x77\x5c\x1f\xc3\xa7\xe9\x7b\xa3\x55\x5f\xbf\xb7" - "\x36\x0e\xf6\x91\xc4\xb4\x78\xb7\x0f\xfd\x0c\xf7\xd2\xcf\x50\xef" - "\xb4\xf8\x3d\x2b\xfa\x13\xbe\x9c\x16\xbf\x97\xa9\xca\x50\xa2\x32" - "\xd3\x84\x3b\x51\x3d\xdf\x5b\xe0\x0c\xb1\x9e\xfb\xbd\x4a\x5e\x5f" - "\x8a\x4a\x2f\x8c\xa5\x3f\xf4\x81\xcb\x31\xfe\x42\x4a\xce\xf2\x38" - "\x9c\xb6\x91\xf1\xcb\x68\xb2\xc3\xfd\xbd\x93\x71\xb8\x3a\x7f\x9a" - "\xc6\x3f\xde\x6e\x34\xec\x50\xf8\x9a\x30\x3c\xae\x4d\xc1\xc4\xf8" - "\x1a\x9f\x06\x7c\x9d\x4f\x8c\xaf\xf1\xa3\x7a\xc7\xd7\x78\x1e\xff" - "\xf3\x97\xe3\x6b\xfc\xbc\x68\x7c\x41\xd7\x95\xfd\xfb\x86\x15\xb4" - "\xd1\x95\x2b\xaa\xb9\xaf\x61\x4a\xb3\x80\x56\x54\x99\x36\x2e\x53" - "\x6e\x09\x2a\x3a\x81\x0e\x69\x3e\x47\xe3\x0b\x75\xfe\x1f\x50\x41" - "\xfd\x44\xd7\x63\xec\x47\x64\xe0\x72\x5e\xc7\x79\x8f\x37\x94\x49" - "\x6c\x7f\xc4\xd5\xdb\x9c\x58\x16\x8c\xf7\x03\xa7\xaf\x5c\x9e\x3e" - "\xc1\xac\xfc\xc8\x26\x64\xc5\xca\x88\x09\xb6\xd8\x31\xfa\x1e\xef" - "\x47\x58\xb4\x6d\xa7\x2f\xfd\x5d\x79\xcc\x26\x94\x5d\x3e\x66\xdf" - "\xbf\x43\x8d\xd7\xf7\xaf\x8d\x6b\xdf\xce\xc4\xe3\x35\xc1\xd3\xfb" - "\x78\x4d\x38\xd9\xfb\x78\x4d\xe0\xf5\xd3\xf3\x3e\xfa\x7e\x66\xec" - "\xbc\xf1\xfd\xb4\xd8\xfe\xa2\x5e\x94\x13\xc6\xbe\x83\xf8\xf9\xab" - "\xf6\x5b\xff\xb1\x8c\xe3\xb1\xe2\x73\x45\x68\xff\x70\x6e\xe3\xd5" - "\xc2\xe8\x15\x36\x70\x58\xb6\x3a\xf1\x7e\x2b\xdb\xb8\x8d\x15\x44" - "\xbc\x8f\x6c\xbb\x91\x75\xf7\x7b\xfa\x44\x8c\xd4\x8c\x7b\xe3\x69" - "\xca\xfa\x53\xc4\x68\x2c\xe4\x3d\x4f\xe9\xb7\x2e\xd7\x10\xee\x19" - "\x16\x3d\x16\xbc\xf7\xc9\xb6\xe9\x16\x65\x3b\xfd\x15\xe5\xdf\x51" - "\xe3\x92\xf5\x7e\x2c\x1e\xef\xc9\x4a\x3c\x2e\xf7\xe4\x60\x5c\xfe" - "\x9a\x78\x5c\xee\x29\xe8\x7d\x5c\xee\x29\xc3\xb8\xfc\xf5\x72\x3e" - "\xba\x67\xa7\xc6\x47\xeb\xb9\x8c\x6d\x09\xdb\xe3\x59\xd7\x73\x1e" - "\xdc\x83\x47\xb2\x24\x4e\x46\xb7\xe9\x7c\x24\xcb\x9c\x04\x2c\x59" - "\xbf\xca\x73\x4f\xb3\x06\x23\x0a\x6e\x16\x59\xda\x12\xf1\x49\x96" - "\x95\xf3\xde\x9e\x4f\x66\xe0\x30\x67\x1b\xc3\x58\x46\x84\x7a\x9e" - "\xe5\x7c\x9c\x7e\x7b\x20\x9a\x4f\xb2\xa6\xe8\xf9\x58\xd6\x69\x79" - "\xb3\x44\x87\x9d\x38\x5f\x1c\x6c\xad\xff\xfd\xe4\x3c\xc2\xf9\x39" - "\x5f\x5c\x9e\x0a\xc5\x8f\x59\x27\x63\xf9\x31\x6b\x77\x2c\x7d\x02" - "\xff\x28\x17\x81\x9c\xc3\xbd\x09\x6d\xf8\xca\xf4\x75\x65\xde\x9c" - "\x38\x2a\x8e\x37\x41\x03\x13\x1b\x14\x0d\x4c\xfc\x55\x6c\x5b\x27" - "\x66\x27\xa6\x81\x89\x73\x7b\xa7\x81\x89\x8e\xde\x69\x60\x62\x39" - "\xd3\x80\x8f\x26\xd6\xc7\xf2\xe6\xc4\x5d\xb1\x7d\x47\xbd\x92\x37" - "\xe9\xda\xab\xe1\x4d\xe8\x42\x83\x7a\xe3\x43\xe6\x29\xf6\x1f\xa9" - "\xee\xd4\xf7\x3a\xbe\x12\xce\xcc\xe0\x2b\xb4\xef\xde\x79\xbc\xa6" - "\x04\x19\x3f\x8e\x71\x58\x25\xcf\x63\xde\x5b\x10\x8d\xc7\x2d\xea" - "\x0c\xa4\x13\x79\xbf\xe0\x7d\x65\x85\xcf\x49\x87\x63\xfb\x7f\x6f" - "\x79\x62\x7c\xde\xbb\x0b\xf8\x74\x26\xc6\xe7\xbd\x47\x7a\xc7\xe7" - "\xbd\x2d\x7c\x46\xea\x72\x9e\xba\x37\x64\x5b\x21\x75\x14\x59\xe6" - "\x1c\x4d\x7a\xf8\xab\xcd\x4f\x93\xc6\xc6\xce\x4f\x93\x86\x5d\xfd" - "\xfc\x34\xc9\x91\x78\x7e\x9a\x54\x96\x78\x7e\x9a\xb4\x53\xf1\xc3" - "\x24\x5f\x2c\x3f\x4c\xf2\xc4\xd2\x04\x70\xf7\x7f\x36\x3f\x65\x67" - "\xc6\xf1\x40\xe9\x69\xca\x7e\x1f\x3a\x85\x4b\x8d\xdb\xe4\xe7\x63" - "\xdb\x98\x3d\x2d\xf1\xb8\x65\x2f\xc0\xb8\x95\x26\x1e\xb7\x6c\x57" - "\xef\xe3\x96\x5d\x89\x71\x2b\xbd\x7c\xdc\xb2\xf7\x5c\xbd\x4e\x91" - "\xdd\x1a\x3b\x66\xd9\x4d\x57\x3f\x66\x93\x47\x25\x1e\xb3\xc9\xd9" - "\x89\xc7\x6c\xb2\xe6\x9b\x3e\xb9\x3c\x76\xcc\x26\x17\xc4\x8e\x19" - "\xf0\xf6\xbf\x1c\x33\x8c\xcf\x0e\xe5\x9f\x30\xf9\x22\xec\xf6\x7e" - "\x1d\xee\xc9\x6d\x3e\xba\x6f\x8f\xb2\xad\xef\x53\x73\x87\x1a\xc3" - "\xf7\x90\xc7\x77\xf9\x3c\x70\x9f\x59\x4b\xfb\xd1\xe5\xe3\x70\xdf" - "\x08\xc8\xe8\xb6\xba\x42\xb9\xb7\xa5\xc6\x90\x71\x8e\x7c\x9e\xd5" - "\xbc\x3f\x75\x5f\x36\x97\xc5\x18\x0b\x6f\x30\x44\x2c\xd7\x91\x3f" - "\xc0\x70\xf8\x6c\x68\x1c\xac\xfc\xab\x99\xe3\x7b\xf7\xa9\x39\xba" - "\xc3\x53\x74\x27\xe0\xdd\xff\x82\xa2\xd5\xfb\xe2\xf5\xdf\x6a\xbc" - "\x7b\x44\xd1\xe9\xd4\x91\x71\x6d\x08\x24\xa6\xd3\xfb\x53\xd1\x87" - "\xea\xc4\x74\x7a\x7f\x46\xef\x74\x7a\x3f\xc6\x9f\xaa\xa3\x6c\x9f" - "\x81\x4f\x84\x7c\x71\xb6\xcf\xfd\x76\x4b\x40\xd1\x8e\xd4\x89\x4a" - "\x8e\xee\xe8\x70\xdf\x1f\xaf\xff\x61\x6c\xa6\xf4\xd7\xda\xdc\x27" - "\xae\x7c\x2f\xfa\xdf\xfd\xac\xff\xbd\xd7\x4b\x9b\xaf\xa0\xff\xdd" - "\xcf\xfa\xdf\x7b\x97\xf3\xd6\x14\x4d\xff\x4b\x64\xe3\x4d\x19\x95" - "\x78\xfc\xa7\xc4\x8d\x3f\xe5\x14\xc0\x1e\x96\xe5\x63\xf3\xe5\x45" - "\xe7\x63\xdf\x24\xce\xcb\x34\x92\x20\x6f\x45\x3c\xcc\x5e\xf2\x79" - "\x2e\xa3\x3d\xf6\xa5\x4a\x48\x7b\x53\xb4\x33\x25\x53\xb3\x63\xf9" - "\x71\xaa\x29\x96\x1f\xef\xdf\x19\x5b\x6e\xea\x88\xd8\xf7\xf7\x05" - "\xfe\xef\x64\xec\xd4\xf2\x38\x1a\x38\x74\x9a\x1e\xb8\x56\xd1\xc0" - "\x03\x8b\xe3\xda\xb1\x2b\x31\x0d\x4c\xad\x43\xff\x0f\x25\xa6\x81" - "\xa9\xbe\xde\x69\x60\x6a\x08\xb8\x3c\x14\x4d\xb7\xb3\x0b\xb3\xfa" - "\xc5\xe6\x79\xc0\x96\x58\xe6\x3d\x30\x2e\xf1\x1a\xc1\x03\xb3\x14" - "\x8e\x1f\x28\x8e\xc5\xf1\x03\xf6\x58\x1c\xa2\x2f\xff\x7b\x1c\x76" - "\xc7\x83\xe8\x70\x3f\x10\xcf\xff\xde\xd3\xf4\x03\x8d\xff\xa7\x3d" - "\x18\xd7\xc6\x80\x6a\x4b\xa2\x75\x91\x1f\xb0\xfd\xeb\x4d\x8c\xcb" - "\x1f\x8c\x4a\xdc\xe7\x1f\x64\x63\x0e\xf2\x46\x2e\xe3\xa5\x1f\xcc" - "\x45\xfa\x6c\x5e\x0f\xe5\xf5\x90\x2a\xa4\xcf\x0e\x91\x59\xce\x57" - "\xdd\xf3\xd2\x0f\x5c\xec\x8b\xc2\xf8\x67\xfa\xb5\x0c\xa3\x59\x3c" - "\x07\x71\xbb\x72\x0b\xa5\xdf\x82\x65\x03\xd3\xfa\x4d\x4c\xeb\x3f" - "\x90\xfa\x1f\xef\xb3\xb0\x1f\xa1\xc5\x41\xb3\x38\x2e\x85\x4e\xef" - "\x9c\x3f\x0e\xf6\x49\xe6\x0b\xce\xaf\xe7\x55\xeb\x66\xae\x38\xd9" - "\x34\xcd\x94\x78\x8c\xa7\x0d\xeb\x9d\x76\xa6\x8d\x53\xe3\x3c\x2d" - "\x2f\x76\x9c\xa7\xcd\x8a\xb8\x07\xcc\xe1\xbe\x82\x06\xae\x8a\x4f" - "\x0a\x6c\xc2\xdf\xab\xbc\x5f\xff\x58\x73\x7e\x11\xdd\x78\x86\xa6" - "\x1d\x97\xf5\x19\x45\xd0\xb2\xce\x40\x75\x52\x06\x4c\xbf\x55\xb6" - "\x13\x79\x72\x43\x64\x14\xeb\x9f\x69\xe6\x77\xd5\x6e\x11\x44\xbe" - "\x26\xde\x13\xe0\xb3\xd5\xa0\x85\x41\xa7\x68\xda\xd9\x98\xf2\xe0" - "\x7c\xaf\x82\x91\x51\x2d\xf9\x71\xfa\x08\x7d\x4d\x77\x03\x9e\x13" - "\xaf\xfb\x4e\x9f\xa2\xfb\x3e\x28\x9f\xb1\xe9\xbd\xee\x5f\x72\x9b" - "\xf8\xac\x0c\xb7\xe9\xca\x72\x60\x7a\xa5\x4e\xbf\xca\xd7\x72\xfa" - "\xae\x1e\x5f\xbe\xe9\x7b\xf1\x6e\xde\x15\xd6\x06\xa3\xf8\x60\x7a" - "\x4b\x34\x1c\x15\x13\x65\x7a\x50\xf7\xc7\xeb\x70\xcf\x30\x7d\x09" - "\x2c\xad\x3d\x33\x46\xc5\xb6\x67\xc6\x78\xe8\x29\xe9\x1a\x8c\x29" - "\x57\x82\xc1\x63\xae\x68\x96\xe9\x61\xc6\xbc\x2b\xad\xf9\x25\x59" - "\x69\xd6\xab\x97\xd1\xd6\x0c\xa9\x2f\x31\x8c\x2f\x69\x63\x53\x8c" - "\x6d\x21\xf7\xee\x79\x6f\x6b\xe6\x36\xc5\xf7\x33\xe3\xd6\x08\x67" - "\xb4\x49\x7f\x2a\x8d\xef\x9f\x08\xc5\xf3\xc1\xcc\x54\x7d\x8e\x8e" - "\x4b\x1f\xa1\xf3\x3d\xec\x5a\x86\x1b\xb7\xce\x3a\x33\x5b\xf1\xc2" - "\xcc\xca\x48\x72\xb4\xbd\x36\x53\xea\x7f\xfa\x7a\x29\xde\x67\xc7" - "\x95\x8b\x5b\xff\x9b\xd1\x26\x7a\x5f\xa7\x4f\xc5\xf8\x06\x78\x6f" - "\x4b\xc5\x6a\x98\x59\x1f\xb7\x5e\xe1\xdf\x22\xcf\xdf\xff\x05\x70" - "\x67\x69\x72\xef\xc1\x89\x71\xf5\xb5\x39\xcf\x5e\xa9\xff\xb3\x7a" - "\xe9\xff\xac\x9e\xfe\x2f\x91\x70\xe3\xd6\x12\x67\xc9\xfe\x87\x2f" - "\x93\x7f\xb3\xd8\x87\x54\xc7\x1b\x74\xee\x59\x1f\xe8\xba\x3a\xaf" - "\x1f\xf4\xae\xab\xcf\xea\x59\xff\x53\xe5\x7a\xd6\xff\xfc\x89\x74" - "\x75\x1f\xc9\xbd\xd5\xd8\xba\x9b\x2d\x95\x09\xfb\xd2\xcb\xfa\xdf" - "\x83\xda\xfa\xdf\x83\xf3\x62\xe5\xd9\x83\xb6\xd8\x31\x9c\x15\x37" - "\x86\x0f\x66\xc5\x8e\xe1\xcc\xb6\xff\xe9\xbc\x86\x67\x4a\x4a\x4a" - "\x32\x26\x19\x8c\x86\x24\xbc\x46\x17\xa9\x5f\x92\x29\xa9\x0f\x7e" - "\x7d\xb5\x6b\x3f\x63\x92\xd1\x84\x5f\x1f\xed\xda\x37\xee\xb9\x1f" - "\x97\xc5\xcf\xa4\x5d\xfb\xc4\x3d\xf7\xfd\x92\xf7\xfd\xb4\x7a\xf5" - "\xfa\x4d\x71\xcf\x7d\xbe\xe4\x7d\xdf\xff\x65\x79\xba\xec\x39\xd6" - "\x0f\x6d\xea\x92\x15\xf3\xf3\x16\x2f\x90\xfb\xc5\x0b\x6d\xf3\x9f" - "\x7a\x6a\xe1\xf2\xe5\xb6\x82\xa5\xb6\x7b\x27\x3e\x74\xe7\xdd\x36" - "\xb5\xed\x9c\x37\x61\xe4\x82\x14\x9a\xbe\x72\x19\xbf\x98\x3e\x7b" - "\x6a\x8e\x6d\xd6\xbd\x13\x63\x5f\xea\x60\xe4\xf6\xf2\x95\xa0\x44" - "\xf1\x5f\x56\xc9\x60\xa2\x4d\xaf\x4b\xd9\xd3\xc2\x7e\xbe\x6a\xcd" - "\xe3\x47\x87\xeb\xd9\x7f\xb4\xd3\x29\x3c\x37\xf1\x9e\xfe\xec\x85" - "\xdc\x89\xd1\xdb\x5d\x94\xff\x24\x9f\x5f\x99\xbd\x4e\xfc\xde\x4f" - "\xb6\x07\xc8\x78\x8a\xe6\xfe\xa9\x6e\x0a\xf2\xe2\xd9\xeb\x0b\x91" - "\xcd\x49\x66\x94\x7f\x0e\xef\x0c\xe2\xfb\x11\xa4\x05\x34\x5f\xe8" - "\x1f\xae\x93\x69\xbf\x77\xe9\xf9\x2c\xa7\x69\xce\x48\xf1\x7b\x21" - "\x9f\xf9\x7c\x90\xca\x37\xfb\x0b\x61\x7c\x68\x2f\xcb\x86\xca\x81" - "\x64\xe2\xbd\xd0\x37\x07\x92\xf9\xcd\xc1\x1c\xb3\x64\x76\x9b\xbe" - "\x17\x5a\x82\x67\x1f\xcd\x6d\xe2\xba\x39\x6f\xc4\xf8\xd0\x29\xce" - "\x5f\x15\x93\x7f\xce\xb0\x9e\xbd\xd8\xd9\x6d\x46\xe4\x9b\xf9\x19" - "\x59\x2c\x61\xf1\x8f\x60\xca\x61\xd7\xed\x53\xc8\xe0\xc5\x50\xd4" - "\x87\x5c\xa4\x7c\x7e\xe6\x2c\x5c\x15\x16\x21\xf6\x4f\x9f\xde\xe6" - "\x14\xa5\xcf\x92\x09\x3c\x6d\xf0\x2c\x63\x1f\x85\x39\xd3\xaa\x17" - "\x92\x09\xfd\x1f\x76\x86\x1e\x2e\xb4\xcd\x20\x72\x4e\x27\xd3\x31" - "\x07\xfb\x1b\x1e\xbb\x71\xcb\x9f\xc9\xf4\xcb\x4e\x97\xb1\x53\x58" - "\xa9\xb0\x40\xb4\x0a\x8e\x63\x14\x10\x41\xf6\xf1\xaf\x9f\x17\xe6" - "\x3c\x03\x3a\x9c\x56\x6a\x2c\x08\xd0\xda\x93\x22\x58\xfc\x67\x75" - "\x36\xa0\xa1\x2d\xc0\xfe\x8b\xe6\xb5\xd3\x29\xe9\x74\x0e\x19\x1b" - "\xec\x15\xe4\x9d\x1b\xa0\xc2\x93\xa2\xb5\x7e\xde\xe7\xd4\x68\xdf" - "\x4d\xb9\xcd\x64\xac\x6f\xf9\x94\x64\x2c\x9e\x2d\x86\xcc\xa2\x8b" - "\x64\x5d\xbb\x98\xd3\x2e\xd2\xea\xb5\xd4\x7f\xf5\x09\xb2\x78\x5b" - "\x9b\x51\xcf\x59\x7a\xf4\x38\x19\x00\xcf\xb8\xe6\x53\xb2\xae\x79" - "\x84\xfd\x7c\xb3\xa8\xb2\x88\xac\xc2\x99\x91\xda\xe9\xcc\x48\xeb" - "\x14\x19\x03\x3b\x9c\x19\xe9\x8d\xf9\xc8\xdf\x72\x90\x06\x34\x53" - "\xfa\xef\xcf\x34\x1b\x2b\x2e\xd0\x30\xee\xd3\x69\xf4\xad\xf2\x02" - "\xf2\x6f\xfc\x64\x77\x04\x65\xa3\xcb\x84\x92\x3f\x39\xe2\xcd\x09" - "\x52\x04\xb0\x2a\x3a\x69\x58\x65\x27\x59\x23\x25\x9f\xec\xe6\x72" - "\x6d\xf4\xc3\x55\xde\x7a\xa2\xc2\xb5\x22\xdc\xb5\xf1\xa8\x0b\x32" - "\xb1\xdf\x7b\x4f\xee\x35\x79\xeb\xdb\xa8\x21\xd0\x49\x8d\xf4\x17" - "\xf2\x3a\xfe\xe6\xf9\xe5\x93\x7b\x79\xcd\xda\xe0\x59\xdd\x82\xba" - "\x14\xed\x38\x1b\xf8\xac\xb2\x8b\x4a\x8b\x28\x35\x7f\x35\xf5\x3b" - "\x83\x74\x65\xdb\xd7\x14\x7b\x43\x7f\xf3\xac\x96\xfe\xb8\x73\x9b" - "\x8a\x1a\x28\xa9\x31\x50\xc1\x7e\x9f\xc6\xf0\x00\x43\xa6\x37\xd0" - "\x44\xde\xfc\xbf\x7a\x22\xa9\x06\xeb\xa6\x08\x99\x7f\x75\xa9\xc9" - "\xe8\x35\x5d\x22\x6f\x4e\x80\x0e\xa1\x6e\xb1\xc5\xc0\x7b\x9f\x59" - "\x8d\x81\x20\x9f\x77\xca\x14\xed\xd6\x94\xd2\x65\x34\xaa\xea\x02" - "\x8d\xd8\x76\x81\x32\x44\x47\x86\x91\x7d\x6c\xf9\x6c\xea\x36\x5c" - "\x53\x5b\xc8\x8c\xbe\x2b\x7f\xec\xfe\x9a\xaf\x6d\x57\x06\x55\x77" - "\xf6\xf8\xda\x76\xb6\xf7\xf8\xda\x82\xa6\xfc\xec\x6f\xeb\xa3\x87" - "\x37\x58\xea\xa9\x1f\xf8\x64\x27\xd3\x77\xe9\x39\x32\xad\x3f\x47" - "\x74\xbb\xcb\x48\xb6\x45\x7c\xce\xe2\x47\x0b\xbd\x18\x1b\xbe\x3f" - "\x45\x3f\x1a\x86\x6b\x2a\x7e\x06\xa4\xcb\xf8\x0d\x2d\x1a\x1d\x23" - "\xcd\x88\xb4\x3e\xb8\x26\x81\x5f\xc2\xce\x4a\xe1\x47\x5d\xcd\xed" - "\x46\x4a\x61\x7a\xd6\xfc\x7b\x9b\x3b\xdc\x3f\x0c\xf8\xe8\xd9\x36" - "\x9d\xae\x95\x8c\x9f\xed\x3f\x74\xea\x2c\xc7\xcb\xf2\xcb\x76\x75" - "\xd9\x0d\x1c\x3b\x4b\x4b\xe7\x36\x3c\xce\xf5\xa2\xfe\x2c\x5c\x2d" - "\xf8\x81\x4f\x7f\x78\x5c\x2f\xdb\xde\x65\x47\x9d\x3f\x7a\x18\xe9" - "\x42\x4f\x47\xbf\x4d\xfc\xee\xb7\xa7\xce\x1a\x55\x9e\x0c\x23\x60" - "\x06\x35\xf8\xe0\xfd\xd9\xe5\xcc\xe3\xed\x46\x8b\xa8\x9d\x37\x96" - "\x2a\x5f\x17\xf5\xdb\x5e\x17\x75\x8a\xf7\x7e\x54\xe1\xa3\xa5\x65" - "\xdc\x46\xcc\xe3\x75\x9b\xf0\xae\x16\xb3\x0e\xe3\xa5\x6e\x01\xfb" - "\x93\xfd\x08\xfa\xdf\x35\x35\xd1\x7d\x10\xee\x07\x2b\x78\x2e\xfd" - "\x75\xd1\x91\x3e\x90\x01\x15\x8d\x2d\x6d\xf4\xcb\xce\xd6\x3e\xce" - "\xa3\x64\xf4\x86\x4e\xd1\x98\x74\xb2\xb2\x3e\x58\xfd\xba\xf0\xbd" - "\xca\xf1\xf9\x5e\x17\x6d\xa0\x97\x1b\xce\x50\x4e\x9f\x6f\xa6\x53" - "\xfa\x1f\x1d\xa4\xc9\xa7\x9c\x1b\xa2\xe4\xd3\x3b\x0d\xbe\xbd\x51" - "\xb2\x69\xee\xc3\x97\xcb\xa6\xc7\x1e\x54\xb2\x09\xbc\x2f\x65\x51" - "\xd8\xa7\xa5\x4f\x88\x4b\xd7\xfc\x44\x1e\x1b\x1e\x97\x1e\xd4\xd2" - "\xfb\xc7\xa5\xfb\x55\xfa\xa3\xd3\x75\xd9\xd7\xc8\xed\x58\xc9\xb2" - "\xef\xd1\x3b\x58\xf6\x35\xce\xd3\x64\x9f\x94\x3f\x8f\x5e\x27\xfe" - "\x05\xb2\x68\x05\xcb\x9b\x47\xce\x72\xfb\xc5\xef\x49\x6f\x7b\x32" - "\xd2\x7e\xc5\x69\x65\x7f\x21\x13\x7e\xba\xdc\x13\x2c\xf7\x58\xe6" - "\xb1\xec\xdb\x3a\x58\x34\x6f\x7d\x5d\x1c\xaf\x94\xb1\x7f\x1e\xe9" - "\x96\x7f\x2f\x21\x6d\x13\xd2\x5e\xc2\x7b\x96\x83\x8c\x93\x86\x9c" - "\xbd\xc4\xfe\x27\xa0\xb1\x61\x11\x63\x26\x6d\xc1\x78\xf3\x79\xc3" - "\x0d\xc0\xaf\xc5\x40\xf9\xde\x02\x3e\xc3\x1a\x66\x9f\xb4\x96\xc6" - "\x82\x16\xe6\xbb\xc1\xeb\xc1\x67\x5e\xc7\xe7\x54\x14\x10\x67\xf8" - "\xdc\x1d\xb7\x21\x77\xd5\x03\x1c\x2f\xc9\x50\x07\x6b\x98\xfd\xc2" - "\x59\x66\xa3\x2d\xa6\x32\xb4\x49\xc5\x67\x79\x64\x87\x8f\x76\xb8" - "\xd4\x58\xcf\x6d\xe2\xb8\x6c\xa7\x28\xa7\x15\xf6\x5e\x90\xfb\x66" - "\x09\xbb\x88\xcf\xc1\x70\xac\x42\xbe\x6e\x35\x46\xec\x65\xfa\x59" - "\x18\x37\x64\x03\xf2\x78\x9b\x83\xc4\x6d\xf6\xd1\x23\x63\x1b\x0a" - "\xf7\x72\xf9\x66\xc6\x8d\x70\x3b\x75\x18\x06\x09\xc3\x28\xed\x46" - "\x3b\xf2\xa9\xb5\xf3\x94\xa3\xae\x86\xb9\x7e\x62\xb9\xef\x6d\x05" - "\x8c\xc2\x53\x0a\x06\x60\x09\xcc\x01\x31\xef\x34\xf8\xfd\xd7\x8a" - "\x7f\x00\xfe\x0e\x1e\x2f\x3e\x17\xc9\xfb\x6d\xc0\x4b\x2a\xfb\xca" - "\x2b\x5d\xf4\x91\xd1\xd5\x7f\x21\xd2\xce\x76\x82\xde\x1e\x19\xc5" - "\xe7\x96\xf8\x3c\xe7\x95\xce\x72\x02\x47\x23\xf4\xf3\x9c\x91\x95" - "\xff\xb7\x67\x39\x01\xdb\x5a\x65\x14\xbb\xd1\xfe\x51\x7c\x9e\x13" - "\xed\xdf\xc4\x74\xa8\xf5\x29\xf3\xb5\x47\x25\xce\x0b\x38\x0d\xb6" - "\xe3\x11\x7d\xfc\xb9\xbf\xdc\x17\xbc\xcb\x51\x3a\xa2\x80\xfd\xf1" - "\x58\x26\xbf\x47\x5a\x36\xe7\x1f\x03\x39\xe6\xc5\x1c\xf6\xde\xa9" - "\xb0\xb1\x74\x35\x99\x94\x4c\x9b\x3b\x95\xcb\x2b\x99\x36\x97\x7a" - "\x64\xda\x63\x17\x95\x4c\x53\x38\x56\x32\xed\xb1\xbf\x2b\x99\xf6" - "\xd8\x67\x72\x5f\x0c\x32\x8d\xdf\xb1\x5c\xd3\x65\xda\xb6\xc1\xe2" - "\x08\xcb\x8e\x0e\xf7\x63\x4d\xba\x6c\xdb\x8c\x34\x96\x1d\xdc\x46" - "\x25\xa7\x1e\xcd\x10\xff\x91\x41\xca\xef\x80\xef\xed\x7c\x7e\xa1" - "\x55\xbb\xe7\xf9\x64\xa2\x92\x71\x73\x47\xf4\xc8\xb8\xc7\x76\xf6" - "\x94\x65\x19\x37\xf7\xbb\x4a\xc6\xa9\xf4\xea\x47\x59\xc6\x3d\x9a" - "\xc1\x38\xd0\xe0\x1b\x79\x0d\x4f\xcb\xcf\x78\xcc\x8c\x96\x71\xb1" - "\xfc\x35\xb7\x50\x97\x71\x2c\xdb\xf0\xbc\x09\x32\x4d\xda\x90\xcc" - "\x67\xe5\xc0\xb9\xce\x77\x3c\x06\xdc\x67\x8e\xbf\xc6\x78\x9b\x74" - "\x96\xfa\x69\x67\x87\xb4\x7e\xcf\x3d\xa2\xfb\x3e\x02\xff\x4d\x89" - "\xf4\xe8\x9e\x18\x89\xf4\x75\x3e\x3b\xef\x75\x9d\x22\x6f\x85\x70" - "\x35\x86\x4e\x52\x6e\x01\x64\x45\xd2\x33\x9f\xf1\xd8\xc2\xee\xf8" - "\x1e\x5f\x59\xf6\x9c\xa1\xc7\xfb\xe7\x06\xa8\x2f\x6c\xf5\xcf\x4a" - "\x8d\x78\xe7\x88\x79\x27\xd7\x18\x6e\x5f\xc6\xf1\xf5\xc0\x08\xbd" - "\xd8\xfb\x57\x59\xdf\xda\x2b\xd4\xf7\xa6\xac\x0f\x3a\x15\x6c\xa0" - "\x6b\xcf\xd1\xe3\xd2\x2e\x91\xf1\x6d\xd6\x27\x84\x75\x54\x7b\xdf" - "\xa7\x97\xf7\x7f\xbf\x72\xf9\x27\x92\xaf\x5c\xfe\x89\x5b\x59\x16" - "\xa1\x7f\x96\xb0\x3b\x16\xce\x80\x90\x9e\xef\x0c\xe7\x7b\x50\x5b" - "\x8b\xf9\xcc\x39\x5c\xda\x68\x56\x1d\x26\xd3\xdf\x16\xe4\x93\x31" - "\x43\x20\x2b\xb3\x57\x11\xc7\x6b\x89\x2e\xbb\xb9\x07\xc7\x4f\x64" - "\x5d\x61\xdd\x2f\xd5\x5b\x41\x32\x66\x6c\x2d\x74\x52\x8e\x69\x54" - "\xde\xbd\xfe\xf1\x44\x0b\xe4\xa6\x2f\xca\x2f\x96\xed\xb1\xaf\x73" - "\x5c\x03\xd6\x2f\x4b\x95\xbd\x39\x04\xf2\x79\x20\x9f\x87\xe1\xb3" - "\x31\xb9\xe1\x59\xc6\x5a\x19\xcb\x2c\xd7\xa6\x97\xed\x6d\x9d\x85" - "\xeb\xd5\xea\x64\x1f\xd3\x00\xca\xcc\xd1\xcb\x30\x6c\xf6\x53\xc4" - "\xbc\xfc\x75\x79\xa6\x34\xd4\xc6\xb2\x70\x08\x74\xd1\x81\xaa\x9e" - "\x79\xa4\xd5\x53\xec\xa3\xc7\x67\x5d\xe9\x6c\x46\xef\xfd\xcb\xad" - "\xbb\xfa\xfe\x91\xd6\xbf\x79\xf4\x25\xfd\xbb\x42\xbd\xf3\xc6\x5f" - "\x7d\xbd\x69\x7a\xbd\x8e\xab\xc7\xeb\xbc\x5d\x5f\x1d\xaf\x99\x1a" - "\x5e\xe7\xf9\xbe\x04\xaf\x09\xea\x99\x9f\xfe\xd5\xeb\xb1\x69\xf5" - "\xcc\x9f\x92\xa8\x1e\x92\x7f\xbd\x9e\x9b\x32\xeb\xb1\x36\xdb\xc1" - "\x3b\x2a\x56\xdd\xfc\xb2\xe8\xf8\xc5\xed\x92\xaf\xe6\xef\xe8\x8e" - "\x97\xac\xf6\xca\x21\xab\xe7\x1f\xce\xdd\xce\xf3\xbb\x88\xf8\x68" - "\x7e\x1d\xc7\x71\xcd\x5e\xab\xce\x64\x6b\x65\x9a\xaf\x14\x37\x99" - "\x63\x74\x71\x4c\x3e\xaf\x15\x7d\xaf\xe0\xd8\x25\x27\xca\xd8\xff" - "\x1e\x36\x15\x64\xfc\x93\x37\x70\xcc\x31\xdc\xf7\xc3\x7d\x86\x92" - "\x01\x4f\x66\xa0\x9e\xde\xcf\x4e\x6e\x3c\xb1\x7d\x47\x51\x66\x9f" - "\xde\xfc\xeb\x51\x1e\x3a\xc5\x73\x72\x6d\x2a\x92\xf2\xb1\x03\xb6" - "\x84\x16\xef\x6f\xc1\xe7\x32\x06\x9c\x33\x87\xcf\x93\x60\x5e\x5c" - "\xd0\x5f\x3b\x07\x00\x7c\xb8\x80\xd7\x27\xb7\xeb\xf8\xd0\xd3\x91" - "\xb6\x47\xc7\x07\xf4\x9b\x54\xef\xf6\x10\x9f\xd3\x09\xa8\x33\xd9" - "\x4f\xfe\xbb\x28\x39\x51\xa1\x60\x3f\xa5\xf6\x68\xb8\xbe\xae\x1c" - "\x93\xb4\x9b\x8a\xd8\x6e\x7a\xaa\xc6\x9f\x7c\xa2\x42\x6f\x87\x58" - "\x6e\x35\xf2\xd9\xef\x31\x98\x4b\xb7\xa8\x98\x7b\x06\x3e\x27\x27" - "\xdf\x2f\xcf\x30\x2a\x9c\x3c\x35\x41\xb4\x73\xec\x18\x09\x3b\x15" - "\xed\x6c\x61\xb8\x3e\x5c\xfd\x6b\x32\x38\xee\x85\xd6\x9f\xa7\x46" - "\x46\x36\x7e\xec\x88\x74\x58\x8d\x7a\x7b\xab\xe4\x99\xd6\xa7\xd0" - "\xff\x79\x2a\x4e\xac\x6c\x8f\xd5\xc8\xfe\xfc\x91\x94\x13\xdb\xc5" - "\x1a\x2b\xed\x59\xd6\x2a\xed\x26\xae\x73\x0c\xea\x17\x6c\x27\x41" - "\x37\x41\xb9\xed\xdd\x78\x03\x5c\xd1\xa1\xe3\xed\xa9\x69\x6a\x5e" - "\x56\x7d\x0c\xac\xb1\x1a\x6b\xfd\xf2\xbc\x1d\x8d\xb0\x39\xbf\x50" - "\xb1\xb0\x9f\x3a\xa9\xe3\xae\xbb\x4d\x68\x0f\xe7\x51\xfe\x4d\x4f" - "\x85\xf4\x36\x49\xde\x4d\xe1\xf3\xbb\x4f\xfa\xf9\xdc\x90\xc2\x7f" - "\x6d\x6a\x87\x7b\x81\xed\x72\xfc\x2f\x18\x1b\x85\xff\x24\xa6\x3d" - "\xc6\x3f\xaf\x75\x00\x2f\x8f\x03\x97\x66\x75\xde\x81\xf5\x99\x05" - "\x0b\xf1\x9c\xca\xed\x8c\x94\xe8\x38\xcf\x31\xa9\x75\xb2\x05\x15" - "\x51\xe3\x80\xfe\x5a\x59\x57\x33\xe8\xfd\xe7\x32\x8c\x03\x8e\x2b" - "\xc9\x75\xa3\x3d\xd7\xa0\xee\xdd\xf1\x7d\x5a\xaf\xce\x92\x90\xf2" - "\x2d\x59\xd0\x14\x15\x5b\xdc\x5f\x60\x13\x41\x75\x2e\x79\x81\x63" - "\x4f\x91\xdf\xd4\x9b\x0c\x60\x1a\x94\x31\x2a\x8d\x72\x5d\x01\x3a" - "\xd7\xa2\x8f\x04\xda\xa6\xc6\x7e\xd1\x36\x95\xb6\xf0\xef\xb8\x82" - "\xc6\x16\x4e\x14\xa8\xdb\xef\x94\x31\x56\xd0\xb7\x45\x3e\xa6\x39" - "\x9d\xce\x78\x1d\x52\xf9\x8c\x2f\x7c\x87\x65\x8a\x8e\x73\xb4\x3f" - "\xa5\xc3\xbd\x30\x5f\x6f\xbf\x9e\x9f\xc7\x8e\xf3\xf0\x9e\x4d\x9d" - "\x2d\x28\x65\xad\x3a\x33\xb4\xb0\x52\xe7\x61\xae\x83\xc7\x99\x65" - "\x0d\xe3\x43\xe1\x62\x61\x4d\x2c\x2c\xab\x51\xc5\xcd\x64\x9a\x07" - "\x3f\xae\x0e\xf6\x41\x1e\x5f\x0f\x8c\x85\x73\xd5\xbb\xee\x76\xb2" - "\x9f\xbf\xf4\xc5\x53\xe3\xb1\x68\x2a\xf7\xab\xa7\xbd\xcc\x7f\x8b" - "\xba\xc7\x9f\xdf\x05\x9c\x56\x8e\xc1\x2b\x65\x4c\xc1\x70\x6e\xaf" - "\x9f\x63\xdb\x4a\x5a\x07\xfc\x32\x6e\x3b\xe7\xd1\xc7\xac\x87\x16" - "\x17\xd9\xa3\xe1\x08\xa7\x6c\xab\x84\xa3\x64\x87\x9f\xf7\xb6\x6d" - "\x6a\xbf\x65\x51\x79\x54\xbf\x53\xf5\xf6\xf4\xc8\x84\x45\x7b\xe2" - "\x69\x92\xeb\xe6\x58\x7c\x1a\x6c\x96\x25\x69\xa7\x68\xd1\x76\xad" - "\x5d\x56\x1e\xc7\xde\xe6\x37\x8e\x73\xc9\xb1\x4f\x5f\x55\x32\x04" - "\xe3\x6c\x1f\xfe\xaa\x3a\x47\x14\x50\xf1\x4f\x7f\x3c\x52\x18\x7f" - "\xca\xb8\xe2\xf5\x74\xbf\x8c\xd7\x21\xcf\x98\xff\x98\xf7\xf8\xc5" - "\x80\xfc\x9f\xca\x58\xb7\x9a\x6f\xa0\xbf\x2e\x3f\x24\x63\xf9\x39" - "\x0b\xf8\xcc\x6d\x88\x6d\x3d\xe9\xfb\x56\x5b\x10\xa2\xd9\x41\xe6" - "\x89\x1f\x17\xf0\x59\x7a\x15\x47\xfc\xc7\x2e\xfd\xfc\x3c\xc7\xce" - "\xe4\xb8\xaf\x90\x43\x49\x3d\x71\x5b\xed\x39\xac\x63\x69\xe3\x4b" - "\x5b\x8c\xa2\x49\xf1\xff\x8f\x8f\xf2\x79\x79\xb5\x8f\x75\x0a\x32" - "\x21\xe9\x6f\xa7\xe8\xc7\x9f\xa9\x75\x1f\x5d\x46\xd9\x1f\xe1\xbd" - "\x2c\x9f\x06\x03\x75\xb5\x81\xbf\x67\x5d\x2e\x4b\x7e\x7c\x54\xb7" - "\x5d\xf8\xfc\x9d\xda\x17\xeb\x81\xe7\xa3\x1f\x4b\x5b\xb0\x67\x0c" - "\xfe\x00\x58\xf6\x71\x97\xcb\x05\xfb\x34\x9d\xf7\xf2\x6f\xe2\x33" - "\xdc\x3f\x4e\xe3\xfa\x7b\x9b\x2f\x84\xf3\x11\x1e\x27\xf3\x69\x5b" - "\xe2\xb1\x49\xbc\xcf\x66\xdf\xad\xf7\x41\xc7\x89\xea\xc3\xe2\xe4" - "\xf6\x94\xa3\xbb\x7a\xfa\xbe\x58\xea\xae\x51\xef\x27\x46\xe1\x86" - "\x9f\xb3\xd4\xbc\xb6\x18\xf8\x59\xa0\xc5\xaa\x55\x69\xe0\x9d\xad" - "\x62\x4d\x0e\xa9\x36\x2e\x26\x9d\xd7\x91\x77\x94\x8f\x2e\x5a\xd5" - "\x7e\xd7\x62\xf4\xdf\x5e\xac\xca\xd9\x8f\x73\x5b\x12\xf6\x33\xb6" - "\x8d\x7b\x59\xd7\x50\x31\x15\x16\xef\xe3\xf6\xda\x6e\xe6\x31\x5e" - "\xfc\x82\x94\xe1\x1c\x5f\xa1\xcb\xde\x27\xd0\x95\x41\xed\x5d\x76" - "\xc8\x85\x0c\x23\xea\x81\xec\x6a\x0f\x68\x75\xee\xd2\xdb\xca\x6d" - "\x93\xf1\x39\xc5\xe2\xc4\xf8\xe5\x7a\x65\xcc\x27\x7b\x3f\xfc\xcc" - "\xf8\xf5\xfd\xaa\x7a\x09\xf4\xf4\x56\x7f\x49\x53\x66\x64\x85\x38" - "\xc2\xf1\xc5\x60\x8b\xb4\x96\x82\x7e\x07\xac\xf3\x40\x37\x7f\xdc" - "\x98\xbb\x8a\xb2\x60\x33\x93\xb8\x24\xc6\x55\x45\x70\x5d\x21\xc6" - "\x72\x9c\x71\x3c\x67\x6a\xcf\xa3\xf8\xb9\x7d\x85\x98\xdb\xe1\x7e" - "\x7a\x9e\xbe\x47\xa8\x62\xe3\x3c\x9d\xdf\x1d\x4f\x28\xe9\x31\x3e" - "\x4f\xc4\x71\xa7\x22\xb0\x85\x5a\xb9\xde\x5c\xb6\x67\x51\x1f\xf2" - "\x55\x40\xdf\x68\xe1\x7c\xfe\xa4\xdb\x06\xe2\x97\x38\x9e\x07\xca" - "\x70\xbb\xda\x93\x9b\x32\xf5\xb6\x0e\x08\x64\x19\xbf\x62\xdb\x42" - "\x7a\xdb\x90\x7e\xa4\x54\xa5\x87\x38\xfe\x21\xfb\x3a\x76\xb8\x9f" - "\x19\xa6\xb7\x55\x6f\x03\xd7\xc7\xe7\x37\x45\xca\xd1\xbd\x1c\x7b" - "\x86\xeb\xe3\x78\xaa\xc8\x3b\x45\x6f\xef\x57\xa5\xe5\xa2\x4a\x21" - "\x78\xfe\x64\xf9\x6b\x1b\x4a\xd4\x18\x60\x99\xf2\x4c\x65\x6d\x65" - "\x00\x34\x77\x74\x3f\xea\xd8\xd7\x2e\xec\x14\xe9\xb2\x27\x1c\x63" - "\x2e\x83\xfc\xcd\x52\x3e\x6c\x3c\xba\x2f\x22\xa6\x40\x4e\xa0\x5c" - "\xd7\x14\x5e\x6b\x02\xdf\xe6\x99\xea\x0a\x5b\xf9\xcc\x25\x64\x4e" - "\x9e\x09\x79\xf6\xb2\x9e\x05\x7b\x2b\x28\xbf\x5f\x01\xd9\xe4\x59" - "\x31\x16\x30\xf2\xfa\x98\x1c\x64\xaa\x8b\x8b\x53\xd5\x1b\x7d\xb4" - "\x9b\x3f\xde\xdd\xbe\xf1\xe3\xe2\x0e\x77\x1e\xf4\xff\x67\x7b\xdd" - "\xf3\x5d\x3f\x18\xf8\x44\xbe\xb2\xa1\x6c\xef\xe5\xd9\xaf\x94\x57" - "\xdf\xaf\x66\x19\x34\xc6\x4a\xa9\x22\xf9\xe3\xdd\x2c\x6f\xdb\x53" - "\x3e\x2e\xe6\xb9\x04\xe5\x77\xea\xe5\x79\x5e\xe7\xb9\x03\xe3\x65" - "\x2d\xed\x96\x87\x79\x4d\x8a\x9f\xf3\x9a\x74\x1e\x4d\x54\x4f\xc1" - "\x0e\x11\x71\x8e\x24\xa3\x17\xf3\xd6\xed\x41\x4a\xad\x7a\x8b\xa8" - "\x6c\xb5\x08\xbe\xba\x1a\x36\xcc\x50\xfe\xde\x45\xde\x14\xe6\x51" - "\xa6\xef\x2d\xa0\x97\x24\xb4\xe5\xd5\x4b\xa8\xb3\x48\xe5\xd3\xfc" - "\xd6\xad\xc8\x57\x80\x6b\xba\x30\x1a\xa9\xbc\x88\xcc\xe5\x11\x32" - "\x95\x15\xd1\x30\xa4\x41\xd7\x7d\x76\x8e\xce\xb3\x89\xda\x50\x5a" - "\x45\xf4\x0a\xea\x5d\x57\x24\x42\x7f\xc0\x7c\xee\x8e\x88\xe0\x57" - "\xc1\x3b\xfa\xbf\x47\xf5\xf1\xd9\x3d\xba\x4e\x88\x7b\x4f\xac\xdf" - "\xc1\xb3\x97\x9d\xf1\x7e\x72\xe9\xd2\x82\xdc\x65\x0b\xf9\x92\x31" - "\xf2\xf9\x5b\x53\xa2\xd7\x42\x78\xfe\x53\x71\x2a\x9e\x6d\xe6\x75" - "\xc7\x57\x07\xea\xfb\xe8\x4b\xac\xfa\xda\xa7\xe6\xaf\x7f\x0f\xdb" - "\x74\x6c\xfb\xe0\xdd\xd8\xc3\x85\x6b\x19\x8c\xe1\x33\x33\x19\xe3" - "\xeb\x5b\x34\xbf\x60\x7e\xde\xdd\xbc\x63\x96\x92\xa0\x9e\x25\x53" - "\xe2\xea\x71\x75\xd7\xa3\xe6\x9f\x80\x91\xf3\x6d\x1e\xd2\x24\x92" - "\x43\xf9\xea\xac\xf4\x92\x1d\xfa\x9a\x56\x2f\x7e\x8e\xc1\xf0\xc6" - "\x4f\xfc\xcc\x0f\xce\xb5\x64\xfc\xed\xea\x66\x23\xeb\x91\x45\xb8" - "\xe7\xb5\x05\xb9\x46\xa6\xc5\x8b\xfa\xfd\x85\x66\xcc\xef\x4b\x82" - "\xa2\xe4\x68\xd0\x47\x4b\x7a\x5d\xb3\x89\xf6\x11\x61\x9f\xc2\x16" - "\x5a\x9a\x76\x25\x9f\x23\xce\xcf\xfd\x61\x9a\x8d\x2b\xf7\x82\x1a" - "\xb3\xa5\xa0\xff\x3c\x5b\xf7\x79\x5e\x2d\x4f\xe9\x60\x3d\x0e\xd7" - "\xd2\xb9\xbd\xfa\x8b\x14\x7f\xbc\x57\xd1\xf8\xd2\x8f\xea\x60\xaf" - "\xa1\x9f\x3f\x39\x45\x4b\x0f\x9b\xac\xd0\x11\x86\xd2\xcf\x70\xff" - "\x11\x97\xe5\x77\x31\x74\x74\xc3\xd9\xed\x26\x48\x17\x48\x19\x83" - "\x50\x7f\x64\xd2\x6e\x92\xf0\x33\x0a\x83\xdc\x4d\x4d\xc2\x08\xf6" - "\xeb\x6b\x22\xcb\x80\x54\xf3\xd7\x6f\x1c\x66\xbd\xe7\xfb\xe3\xc7" - "\x39\x8b\x0a\x21\x95\x43\x41\x8b\x88\x8e\x9f\x16\xb2\x3e\x7c\xab" - "\x8b\xa4\x3f\x4d\x49\x28\x61\x9c\x98\xcd\x6e\x91\xcf\x67\xd7\x23" - "\x03\x06\x65\x39\x9f\x27\xe3\x7b\x9d\x3e\x23\xc7\x68\x66\xfd\x99" - "\xbf\x75\x71\x8a\xf2\x1f\x3c\x84\x34\xe0\xcb\x21\x36\x0d\xca\x52" - "\x7a\x67\xfe\xcb\x91\x2d\x83\xb2\x7a\xe0\x9b\x88\xe1\x3b\xdf\x24" - "\xe3\x8e\xa2\x56\xa3\xd7\xf4\x7d\xf2\xda\x02\x74\x08\xf7\x09\xc7" - "\x0a\x75\xb2\x2e\xcb\x30\xaa\xdd\x91\x62\xe7\x17\x64\xd4\xce\x9f" - "\x1a\xcf\x51\xfe\xd1\xdd\xbd\x94\xe3\xf3\xde\xed\x29\xde\x4b\x1d" - "\xee\xe7\x4c\x3e\xba\x37\x5b\xd3\x65\x30\xe7\x3e\x07\xfb\x7f\xa9" - "\x8c\xf3\x84\xf7\x17\xf9\xbb\x30\x48\xcb\xd0\xf3\x24\xd6\x67\x78" - "\x0d\x5e\x78\x98\x0e\xc4\xa5\xbf\xb7\xf2\xd9\x96\x5e\xfc\x60\xfa" - "\x79\x1d\x77\xf2\x5e\x64\x9f\x01\x90\x3f\xce\x8b\xa2\x2b\xec\xa6" - "\x74\xb0\x93\x31\x6c\xa4\xaf\x87\x2e\x89\x9c\x86\xb6\x0b\x32\xa6" - "\x29\xcb\x9a\x5f\x2f\xfa\x83\xd1\x1b\x3c\xef\xf1\x6e\x88\x50\x23" - "\xf4\x4a\x6f\xe5\x79\x8f\x8a\x7d\x1a\xa6\x06\xfa\x0b\x35\x38\xfe" - "\x9f\xcb\xeb\xfa\x0b\xd2\x85\x8c\x85\xdd\x75\x49\xcc\xf1\x9a\x3e" - "\x21\xfe\x4e\x11\xcf\x71\xc0\xbb\xed\x1c\x3d\xf7\x8f\xdf\x03\xce" - "\x7b\xff\x09\x58\x32\x66\xda\x04\x3a\x84\x7b\xf4\xa9\x7b\xfe\x4b" - "\x18\x6b\xc6\xe0\xd9\x6c\x71\x3c\x6e\x8c\x60\x2e\xe5\xd8\x76\x98" - "\x43\xc7\x72\xbf\xf0\x9c\xc9\xcf\xb8\x8e\xe2\xab\x65\x9d\x67\x9b" - "\x25\xf4\x38\xcf\xad\x39\x3c\x6f\x22\x7d\x4e\xf5\x25\x39\xd7\xce" - "\xd2\x9e\xa7\x69\xcf\x53\xb4\xe7\x6c\xed\x39\x4b\x7b\xe6\x75\x79" - "\x6d\x4e\x5e\x56\xd6\xad\x2f\x18\xfb\x35\xe1\x79\xbb\x3e\x16\x68" - "\x4f\x7f\x8b\x63\xad\x9c\xdb\xb5\x76\x8c\xd5\xda\x95\xa9\x3d\xeb" - "\xed\xb9\xc1\x12\x5a\xfb\x7f\xd4\x9e\xe5\xb6\xd8\xf6\x2c\xcf\x8c" - "\x6a\x0f\x59\x1c\x59\x5f\xa5\x3d\x69\x16\xfe\x4e\xc4\xff\xa2\x3d" - "\xdc\x16\x4e\x43\xfd\xbb\xe3\xda\xe3\xd1\xdb\x93\x90\xde\x56\x88" - "\x56\xd6\x6b\x96\x5f\x2f\xe3\x3a\xf7\x63\x9d\xa5\xba\x53\x8f\x53" - "\xb8\x3c\x74\xa5\x38\x85\xe0\x05\xcc\xdb\x05\xe8\xff\xf2\x7a\x4d" - "\x7f\xab\x51\x7a\x7e\xc1\x58\xdd\x77\x0c\x7d\xdd\x59\xaa\xfa\xba" - "\x6b\x03\xc7\xea\x5b\x45\x5f\x73\x3a\x44\x2b\xec\xee\xff\x62\xdb" - "\x30\x1a\x6e\x5e\xc1\xf2\xe5\xcf\xde\x6d\xcb\x9b\xbf\x64\xa1\x6d" - "\xe4\x02\xdb\x72\xfb\xe2\x45\x05\x0b\x63\xfd\x29\xd2\xb4\xef\xf7" - "\xc8\x73\x22\x6c\x4b\x49\x5b\x1a\xf4\x2f\xe5\xa4\xf4\xc9\x2b\xb8" - "\x28\xdc\x05\xf3\x58\xe6\x56\xbd\xa2\xbe\xf3\x84\xf6\xd4\xe9\x73" - "\x88\x6e\xff\xf2\x1c\x82\xf4\x93\x98\x27\xe7\x46\xa5\x73\x5e\xbf" - "\x9e\xc6\xf0\x35\xd9\xd4\xef\x14\x15\xbc\xcc\x75\x26\xc4\xe1\x25" - "\x01\x3b\x20\x87\xbf\x61\x61\x84\x4c\x11\x1c\x77\x8b\xcf\x5f\xa2" - "\x9c\x38\x4d\xcf\x4b\xbb\x62\x0e\x9e\x95\xcd\x26\xd0\xc6\xe7\x1f" - "\x46\x99\x1d\x48\x33\xb1\x0e\x01\x3b\xb0\x95\xcb\x21\xfd\x59\x8e" - "\x83\x81\x74\xb3\x16\x4f\x8c\xd3\xd6\x71\x9c\x0a\xa4\xa5\x45\xa5" - "\xbd\x86\x34\x2b\xd2\x6c\x1a\xbc\x77\x18\xcf\x78\xce\xd2\xd6\xc9" - "\x38\xcf\x3e\xad\xde\x98\x98\x16\xfc\x0d\x97\x3b\x6f\xcf\xb4\xcd" - "\x99\xfd\xed\x09\xdf\x7f\x6a\xe9\x92\x45\x29\x24\xd1\x9e\x81\xe9" - "\x38\xf3\x4e\xc7\xad\x77\xdb\xf2\x17\x2e\x5c\x66\x5b\xb9\x70\x49" - "\x81\x6d\xfe\xca\xf9\xab\x52\x68\xd1\xd2\x65\x4f\x71\x94\x05\x1e" - "\x96\xe5\xb9\x4f\x2d\xfa\x31\x3b\xbd\xa8\xdc\x29\x31\x7a\xc2\x1c" - "\x96\x6d\x5a\x5c\x92\x23\xa5\xac\x43\x26\x1f\x77\xe1\x9e\xe3\x75" - "\x59\x71\xad\xc3\xaf\x06\xbf\xbd\xf8\x1d\xc7\xaf\xe9\x0c\xad\xe1" - "\x98\x18\x7b\x3a\xdc\x2b\x16\xe8\xfa\x4a\x0f\x0d\xad\x70\xe8\x34" - "\x04\xfd\x62\x8f\x9a\xdf\x56\xec\x6c\x0c\x49\xfe\xe9\xa6\xa9\xd2" - "\x4b\x3d\x34\xc5\xf1\x46\x1b\xd9\xa7\x6b\x05\xde\x77\xca\xb5\x4a" - "\x5e\x33\x49\x66\xbc\x9d\xa6\x55\xdb\xaa\x5f\x17\xf5\x1c\x2b\x07" - "\xd7\x3a\xd0\x4b\xbd\x8a\x4f\xb3\x72\x04\xf2\x0d\x47\x1d\x35\xaa" - "\x0e\xed\x79\xb0\x38\xc2\xdf\x70\x39\xa5\x3d\x33\x2c\xc0\xb8\x8b" - "\xef\xf9\xaa\xed\x9d\x5a\xb4\x6f\xbc\x19\x7b\xde\xad\x6c\xd0\xea" - "\xe0\x6f\xfd\xb8\xaa\xdc\xd2\x96\x92\xb6\x33\xaf\x11\x5b\x0c\xf7" - "\x08\xb4\xe7\x7c\x24\xe9\x31\x15\xff\xd2\xd5\x09\x19\xf1\xad\x6f" - "\x79\x1d\x32\xbf\x81\xd7\x90\x67\xe4\x8b\x08\xc7\x21\x8f\x24\x3d" - "\xd3\xcc\xe5\x84\xf9\xb8\x2b\xb2\xa5\x7f\x96\xd2\x19\x38\xee\xe0" - "\xca\x9d\x1a\xcc\x20\xe3\xf6\x0c\xad\x78\x44\xd9\xe1\x6b\x36\x28" - "\x5d\x62\xe5\x1e\xdd\xd7\x12\x3c\x9a\x81\xe7\x3a\x5d\x06\xf8\x68" - "\x65\x99\xe6\x17\xe7\xd1\xfa\x1f\xd2\x9e\xf7\x6a\x6d\x34\x70\x2c" - "\x14\xb4\xbf\x89\xc7\x0e\xfa\xca\x5e\xdc\x1f\x07\x7e\xea\x15\x7e" - "\x1c\x32\xce\x01\xf4\x26\x7e\x7f\x9c\xbf\x77\x83\x77\xc7\x55\x9c" - "\x91\x95\x63\xb9\xcf\x3d\xbe\xb3\x95\x59\x68\xeb\x5d\xbc\xc7\x0c" - "\x5e\xda\xeb\xbd\xc4\xfc\xb9\x32\x13\xf0\x76\xeb\x72\x87\xe5\x4c" - "\x6e\x18\x7c\x2a\xed\x29\x47\x9e\x2e\x6f\x7a\xe8\xc0\xe1\x4a\x24" - "\x4b\x12\x8d\xbb\xc2\xbf\xe3\xef\xc2\xfd\x7c\x1d\xda\xb4\x5b\x8e" - "\x01\xc7\x63\xbd\xd4\x6d\xb7\x75\x29\x19\xe9\x38\xde\x6d\x63\x6a" - "\xed\xe0\xd8\xee\x3e\x6e\x5b\xa7\xdc\xf7\xd7\xe4\x86\x23\xa4\xcb" - "\x0d\x1d\x8e\xc5\x20\x22\x16\x07\xfe\x15\x1f\xab\xe0\x3d\x12\x9e" - "\x2f\xa5\x3e\x02\x38\x03\x2e\xaa\x33\x70\x91\x92\x63\xb0\x4d\x1d" - "\x7b\xf8\x9b\x6f\x52\xa7\x75\x3f\xff\xff\x7a\x64\xd1\xaa\x59\xd1" - "\x30\x85\xf9\x58\x05\xc3\x65\x79\xc4\x3a\x49\x6e\xd8\xc4\x71\x68" - "\x2a\xb4\xf9\x05\x32\x78\x95\x4b\x6f\x2b\x70\x78\x44\x6f\xaf\xf6" - "\xcd\xb1\x23\xa8\xc7\x37\x33\xdc\xc5\xbe\xe0\x75\x6a\x3c\xd7\x48" - "\x79\x83\x77\xbb\x50\xb6\xc6\x47\xcf\xa7\x69\x3c\x54\x8f\xf2\xbb" - "\x6a\x8b\xb2\x91\x67\x55\xb3\xe6\xcf\xdc\x84\xf1\x3d\xde\x43\xfb" - "\x2b\x1a\xa2\xd6\x79\x8e\xab\x31\xfc\xbe\xeb\x14\xad\xb6\x46\xa5" - "\x6b\x63\x5b\x3b\x0b\xe9\x0d\x6a\xcd\xe4\x58\x8e\x2a\xbf\x5a\xf9" - "\xae\x6a\x6d\x64\x59\xc0\xe7\xf5\x98\xc7\x25\xee\xe5\x18\xaf\x9e" - "\xa5\xcf\x17\x80\xb5\x47\xe2\x7c\xb0\xa8\x61\x3c\xa9\x78\x1f\xcf" - "\x5f\x52\x78\x5a\xed\x88\xc1\x3d\xcf\x9b\xa8\x87\xf1\x34\x60\x9d" - "\x88\x0c\x08\x18\x44\xee\x2a\x13\x31\xbf\x30\x8f\xf3\xde\x20\xe8" - "\x43\xea\x55\x0a\x6f\xab\xf7\xea\x78\xd3\xc7\x8e\xf1\xe4\xa3\xd5" - "\x19\x8c\xdb\xd8\x3e\xf6\x6b\x3a\xa5\xf7\x1d\x38\xe5\x98\xa6\x78" - "\xae\xd7\xf8\xa2\xde\x33\x94\x7d\x47\x56\xfc\xa9\xd6\xf4\x6d\xaa" - "\x75\x8c\x25\x85\xdb\x35\x56\x1f\x15\x38\xa2\xec\x92\x23\x8c\x5f" - "\xe6\x15\xb4\xb3\x5c\x8b\xbd\x75\x44\xf9\x31\xad\xa8\x17\x25\xc7" - "\xca\x25\x2f\xaf\x90\x31\x52\x38\x6e\x6f\x13\xe3\x88\xe5\x22\xf3" - "\x12\xf3\x00\xf3\x93\xc2\xd1\x9a\x82\x28\x1c\xd5\x31\x7e\x34\x3c" - "\xed\x89\x93\xe5\x0b\x6d\x79\x13\x94\x2c\xb6\x65\x8c\x5c\x30\x46" - "\x06\xba\xb1\xdd\x37\xe9\x6e\xdb\xac\x09\x23\x1d\xf6\x51\x33\xd4" - "\x65\xd2\xac\x69\x7c\x4d\x89\xb5\xeb\x6c\xa8\xe7\x64\xac\x6d\xb8" - "\xce\xae\xe4\xc7\x9a\x80\xcf\x90\x2a\xfd\xd9\x39\xee\x6c\xe9\x12" - "\xa2\x30\xda\xbd\xe5\x0c\xc6\xd4\x7c\x6c\x2c\xc7\x39\x9e\xe9\x20" - "\x8e\x8b\xfe\x45\x35\xde\x55\x21\x7d\x40\x3e\x7f\x1f\xe1\xaf\x22" - "\x92\x7c\x6c\x2c\xaf\xd9\x88\x92\xfd\x41\x7f\x72\xc8\xea\x4f\xee" - "\xf2\xf9\x93\x9b\xcc\x93\x6f\x75\x8a\x0e\x77\xe1\x34\xbd\x5f\xbc" - "\xb6\x03\x3c\x8d\x9d\xe9\x10\x61\xc6\x51\xae\x83\x63\x91\x03\x76" - "\x12\xaf\xed\x14\xa2\xff\xf9\xbb\x95\xfd\x5a\x08\xfa\x5f\xa1\xe9" - "\x33\x34\x0b\xcf\xd0\xff\xbe\x2d\xd7\xb8\x22\x6e\xab\x8c\x61\x1e" - "\x59\x7f\xdb\x43\xa2\xa4\xcb\xa7\xc3\x04\xac\xbe\x9a\xdf\x83\x84" - "\xf7\x55\xfd\x6a\x23\x1b\xff\x98\x6d\x31\xa8\xb8\x90\xe0\x71\x57" - "\xb5\x31\x92\xd3\xed\x27\x83\x77\x03\xd6\xa5\xb1\x1f\x4d\x0e\x68" - "\xcf\xc5\x79\xf4\x77\xa5\xee\x88\xaf\xd4\x18\x09\x62\x1c\xd3\x94" - "\xfe\xdc\xc6\xf2\x13\xb6\xeb\xda\xf1\xfa\xbc\x26\xe7\x43\x23\xb9" - "\x94\x3d\xb3\xf6\x71\x2e\x77\xc1\x6d\x22\xc8\xec\xfa\x9b\xd2\xa5" - "\x8d\x12\x8c\xb8\x0d\xa4\x7c\x99\xd7\xde\xa1\xcb\x58\xde\x2f\xb5" - "\xac\x13\x7e\x5e\x23\xb6\x84\x84\x5f\xc6\xda\xe7\xb9\x83\xce\x90" - "\xb7\xb0\xc3\xe5\x95\xdf\xe0\xe4\xef\x8a\x04\xb4\x79\x23\xac\xe6" - "\x0d\xd4\xef\x4f\xba\x6d\x1e\xe6\x07\xc3\x19\x82\xae\x8b\xf6\x33" - "\x6e\x78\xaf\x25\x02\x5c\x79\x79\x9e\x64\xfc\xa4\xd4\xd7\xb1\x0f" - "\x0c\xf7\xd5\x12\x42\x9f\xa3\xfb\x65\x8c\xf8\xb6\xb8\xd1\x2f\x23" - "\xfa\xe5\x38\xcb\x3c\x13\x64\xdf\x24\xf0\xdb\x60\x19\xcf\x5a\xda" - "\xe7\x45\xb6\xe8\x3e\xb2\xfc\x57\x7d\x28\x9a\x98\xa8\x8f\xc2\xc8" - "\x7d\x64\x1c\x14\x5d\xa7\xf1\x9b\x6c\x27\xcb\x8f\x36\x5a\x7b\x7c" - "\xc0\x3a\xf6\x09\x3a\x36\x16\xf2\x6d\x12\x8f\x21\xe6\xcf\x32\x6e" - "\x67\xa2\xf1\x62\x78\x1a\x2c\x9f\x65\x9d\x6b\x1e\xda\xb2\x2b\x31" - "\xbe\x8b\x1a\xae\x8c\xef\xa2\x9f\x72\x79\x6e\x07\xef\xef\x58\x42" - "\x46\xc8\xe0\x2e\x1f\xec\xb5\xe2\x44\xf5\x0e\x58\xb7\x9d\xdb\x95" - "\xf0\x9d\x60\x7e\xd1\x64\x10\xe8\x50\x80\x4f\x04\xcb\xa4\x0e\xb7" - "\x73\x8a\x2e\x8f\x2c\x06\x5b\x92\x94\x0f\x46\x51\x96\x08\x86\x65" - "\x5d\x19\xef\x73\x4d\x42\xfd\x09\xdf\x47\xf8\xdb\x1d\xc5\xc7\x6c" - "\x91\xf5\xdf\xbc\xc9\x62\xa0\x7b\xfc\x49\xdf\x4c\xb1\x38\x42\x23" - "\x18\x87\x80\xe9\x00\x1f\x3f\xcc\x76\xaa\x5a\x1b\x71\x42\xff\x7f" - "\x59\xc6\x67\xf2\x27\x1f\xb3\xa9\x7d\x23\x27\xe6\xbf\x0a\x9b\xbe" - "\x36\x8f\xe7\x16\x1f\xfd\xdd\xae\xf8\xf2\x6b\x6f\x89\x8d\xde\xe3" - "\x11\xb7\x45\xd8\x56\x5b\xa0\x47\xba\xd6\x46\x04\x7f\xcf\xc1\x7b" - "\xbc\x87\x4e\x94\xbf\x94\x4e\x27\x1d\x6e\xd7\x88\xc4\x34\xe0\x9a" - "\x7c\x65\x1a\x70\x5d\xcf\xef\x19\xef\xca\x56\x71\xe5\xe9\x7a\x8a" - "\x58\xff\xb5\xb7\x6c\x45\xb2\x7e\x52\x75\x33\x4e\xb2\x78\xcf\x68" - "\x1a\xf0\xe2\x42\xde\x0a\x5d\x0e\x30\xbd\x58\xc2\xfc\xad\x0b\x92" - "\x34\x8d\x77\x98\x57\x0a\xcc\x6a\x1d\xbc\xa9\x4c\x7e\xbf\xd2\xbd" - "\xa6\xcc\xef\xb4\x6f\xe5\xef\xb4\x06\x92\x8f\x55\x22\x4f\xb3\x8f" - "\xea\xd4\x7e\xab\xf9\x58\x39\x60\x54\x94\x2b\x7f\x68\xb3\x8c\x17" - "\x05\x9e\xe6\x18\x51\xcc\xd7\x48\x4b\x47\xbb\x39\x5e\x14\xec\x9d" - "\x75\x69\xdd\xf3\x92\x3b\x0b\xb2\x42\x48\x5d\x0c\xf3\xd2\xb0\x76" - "\xe0\xee\x35\x63\x64\xe7\xa5\x31\x56\xe2\x3e\x5f\x5a\x3f\x74\xe7" - "\x4f\x6e\x27\xd3\xbf\x5a\x9f\xa4\xfc\x3b\x29\x7d\xdd\xb7\x4d\xf4" - "\xdf\xe3\xc8\xc8\x78\xf0\xd1\x3a\x9b\xc2\xdd\xba\x79\xfa\xf8\xf8" - "\xc8\x79\x44\xca\xce\xf5\x8f\xb5\xce\x0c\x89\x2f\xd4\x3a\xf7\x3a" - "\xc8\xbf\x67\x2b\xd4\xfb\x35\xad\xf1\x6b\x40\xac\xcf\xdb\x16\x2f" - "\xb7\x2d\x58\xba\x72\xc9\xf0\xe1\x31\xb6\x92\x49\x7d\x17\x77\x5d" - "\xb9\x9a\x4f\xd7\x1d\xd1\xdb\xcd\x7a\x09\x9e\xd1\xff\x35\x97\xc5" - "\xb2\x9f\x96\xab\xb9\xb9\xe7\x66\x52\xcf\xfd\x1d\x34\xed\x8e\xa8" - "\xc7\x6f\xd1\xb4\x3b\xbf\x95\xfb\xd0\xc2\xf9\x0b\x56\x45\xa5\xde" - "\x15\xbd\x6e\x58\xfa\x16\xea\x4e\x1a\x7a\x2f\x64\x85\x61\xc6\x1a" - "\x9e\x5b\xdc\x07\x8b\x42\xe2\x6f\x90\xd7\xe3\xc0\x63\xb9\x0d\x05" - "\x21\x6a\x80\x2c\x13\x5f\x63\x19\xde\x4f\x9d\xed\x84\x3e\x05\xda" - "\xb2\xa0\xef\x7e\xe8\x75\x17\x79\x7d\x06\xe5\x3e\x6b\xac\xe0\x98" - "\xce\x4d\x5a\xbc\x7a\x77\x25\xd2\xaf\xc5\xf5\x23\x5c\xfb\xe2\x7a" - "\xd4\xb6\x04\x76\x0f\xfb\xd2\xaf\x60\x5f\x7a\xf7\xfb\xd2\x1f\x28" - "\xe0\x22\xf6\x09\xc2\xfb\x39\xac\x83\xf8\x68\xbd\x89\xd7\xc1\x39" - "\x2f\xd2\xb6\xd9\x9e\xa6\x4c\xbe\x0a\xb9\x37\xe8\xae\x14\x25\x4d" - "\x69\x62\x6b\x0e\x7f\x6f\x6d\xc4\x69\x5a\x6f\x48\x32\x7c\x46\x49" - "\x56\x73\x6a\x87\x7b\x3d\xca\x2e\x99\xc3\x78\xea\xed\x5b\xb4\xf2" - "\x1b\xc0\x71\xfa\x61\x8f\x6e\xb8\x91\xa4\x7e\xab\xe9\x73\x55\x72" - "\x5e\x58\x3f\x27\x4a\xa7\xe3\xbd\xe9\x14\xa5\x9f\x88\xb0\xd2\x4f" - "\xd7\x17\xe8\x7c\x80\x7b\x97\x4e\xa7\x31\xf1\xf5\x96\x14\x2c\x5c" - "\xb6\x70\x81\x6d\xe4\xf2\x14\x8a\x8a\xae\x67\x5f\xb8\xc4\xb6\x6c" - "\xe1\x73\xcf\x2f\x5c\x2e\x23\xe3\xf1\xdb\x98\x39\x3f\x5d\xa4\x34" - "\x66\xeb\xe7\xbe\x6c\x43\x19\xbf\xeb\x3f\xe7\x98\x6c\x62\x63\x63" - "\x1d\xfb\xee\x48\x1d\x25\x75\x50\x4e\xac\xbd\xf1\x82\x8a\x3b\x51" - "\xdc\xa4\xd9\x3a\x2f\xc8\xef\x58\x9f\xa2\x0d\x65\x3d\xf1\xdf\x37" - "\x4c\x04\x2e\x8d\x1a\xde\x2e\x76\xb8\x37\x8c\xd3\xf1\xe6\xa3\x17" - "\x3c\x9a\x2e\xd5\x26\xe5\x07\xe6\x58\xc8\xbf\x98\xf9\x55\x7d\x83" - "\x76\x03\xc7\xe5\x48\x92\xeb\xc9\xc9\x4d\x26\xae\x8b\x61\xa2\x3e" - "\x0f\xc6\x07\xb8\xb5\xb1\x7c\x2b\xd6\xe1\xa1\xce\x0c\xae\x4f\xb3" - "\x83\x86\x9c\xa1\x17\xe4\x9a\x73\xa4\xb8\xc9\xc4\x32\x85\x63\x88" - "\x44\x4a\x00\x47\xee\xd1\xbe\xe0\x91\xeb\xb0\xfc\x0d\x02\xc0\xe2" - "\x75\x60\xc8\x86\x74\xfe\x5e\x31\xa7\xa9\xd8\x70\xeb\x37\xf1\xda" - "\xb3\x28\xf1\x02\xef\x1b\x82\x3d\x67\x1b\x5e\xf0\xb0\xde\xc9\x70" - "\x7d\xb4\xa1\x86\xe1\xa9\xd8\x77\x2f\x0c\x03\xed\x8c\xe8\xd1\x9f" - "\x5e\x98\x17\x65\x97\x71\x7b\x64\x3b\x03\x68\x8b\x8c\xb3\xaa\x7c" - "\x4d\x65\xbf\x59\x7e\x96\x6b\x7d\xd7\xfb\x03\x78\x90\x7f\xeb\xd3" - "\x74\xbf\x09\x9f\xd6\x6f\x6e\x1f\xb7\x3d\xba\xcd\x5a\x7b\x2b\xb8" - "\xbd\x28\xb7\x23\x8a\xb7\x79\x5d\xa6\x0f\xd2\xf6\xf6\xf8\xb0\x6f" - "\xa0\x78\xb9\xb1\x74\x89\x2d\x6f\xf1\x92\x67\x72\x57\xce\x7f\x66" - "\x61\xee\xf3\xf9\xa3\x6c\xcf\x2f\x79\x32\x6f\xe9\x53\xcf\x30\xd5" - "\x2c\x2f\x78\xfe\xa9\x67\x6c\x2c\x59\x72\xb3\xa7\x4d\xcb\xbd\xf7" - "\xe1\xd9\x8f\xa4\xd0\xbd\xf3\x91\x06\xcb\x7f\x5a\xe6\x28\xf5\xea" - "\xa1\xc9\x93\x7e\x98\x3b\x69\xe6\xc3\x33\xe6\xc8\x43\x2f\xdd\xef" - "\xb3\x97\x24\xce\x10\x43\x87\x69\xa2\xd8\x1b\xc2\xf8\xf6\x39\x45" - "\x25\xe3\x55\xbc\xf4\x17\xf3\x62\xe3\xa5\xbf\x88\x46\xbf\xb8\x1d" - "\xbf\x1a\xa2\x9f\xf8\xf1\x83\x74\x2f\xc9\x54\xf4\x95\xfc\x44\x87" - "\xfb\xc5\x8a\x1e\xfa\x2a\x91\x67\x29\xd9\x4f\x49\xad\xcf\xbe\x08" - "\xf9\xbf\x7e\x6f\xf4\xbb\x1e\x7b\xf2\xc5\xa6\x6e\x7b\xb2\x5b\xa6" - "\xbc\xd8\x6d\x5b\x22\xcd\x0c\xbb\x32\x99\xed\x4a\xb5\x9e\x54\x32" - "\x41\xd2\x54\xaf\xfc\x6d\x26\xdd\xae\x64\xde\x96\x7b\x52\xd2\xfe" - "\xf8\xc9\xb8\x68\x1e\x97\x6b\xfa\x1a\x8f\x73\x39\xb9\x7e\x97\x3a" - "\x28\x9b\xd7\xb4\xfd\xc9\x5e\xd6\x15\x30\x7f\x75\x08\xd1\x7f\x50" - "\xb6\x6a\xd3\x4f\x1c\xbc\xc6\xcd\x7a\xb3\x46\x4f\x03\xce\xd0\x4f" - "\x3e\x10\xee\x17\xea\x95\x4d\xf9\x42\x98\xe5\xba\x58\x3f\xf4\x5e" - "\xf6\x2d\x62\xdb\x09\x75\xee\xea\xa1\xd9\x92\xf1\x4c\x0b\x3d\xb6" - "\xec\x4f\x62\xe4\x7f\xbb\xfc\x2e\xe1\x4f\x4e\xea\xf1\x1e\x0a\x86" - "\x93\xd1\x34\xbc\x8c\xca\x8d\x02\xf2\xe6\x27\x9b\xb8\x0e\xc6\xa7" - "\x8f\x5e\xdc\x89\xbc\xa6\x1e\xfc\x15\xa7\x75\xe3\x4f\x5b\x67\xd1" - "\xd7\x58\x54\xbb\x4b\x26\xf4\x86\xab\xc4\x78\x2a\x9e\xf7\xa5\x78" - "\x72\x53\x1f\xe6\x49\x1d\x5f\x97\xe3\xaa\x78\xc7\xe5\xb8\x2a\xbe" - "\xd8\x83\xab\x17\x6f\xb8\x1c\x57\xc5\xcd\x51\xfb\x4a\xda\x3a\x4a" - "\xc9\x04\xc6\x19\xd3\x18\xfa\xbd\x09\x74\x56\xd1\x83\xbf\x12\xf3" - "\xe5\xf8\x2b\x19\x96\x18\x7f\xc5\x7c\xbe\x2a\x1a\x4e\x55\xa2\x79" - "\x63\xc0\x3a\xa3\x76\x1e\xac\xe4\x65\xfe\xd6\x3d\xb7\xe3\x55\x63" - "\xc4\xfe\xaa\x1b\x3f\x5c\xd9\x8e\xe8\xd1\xc5\x45\x50\xc3\x6f\x59" - "\x1d\x6c\x5e\x5e\x57\xba\xc2\x5c\x74\x52\x5f\xf3\xc0\x7d\x33\xdb" - "\xce\xfc\x4d\x28\x4e\x67\x7c\xf2\x37\xc6\x40\xef\xcd\x4a\x2f\x2d" - "\xe9\xfe\xfe\x47\xfb\xcd\x2b\xb6\x27\xad\x23\x5b\x6d\xe5\x9d\x9c" - "\x1e\x04\x0d\x4d\xe1\x74\xf6\xdd\xea\x0d\x66\x6e\x38\x8b\x12\xc3" - "\xdd\xd8\x4d\xff\xbd\x9d\x89\x8e\x93\x47\xf6\xf9\x4b\x16\x2c\x5d" - "\xb4\xe8\xcb\x45\x51\xf4\xbe\x5a\x99\x3b\xc2\xdf\xc1\xea\xdb\xb1" - "\xfe\xe9\xd5\xa8\x13\xfa\x7f\x7e\xab\x9a\x37\x37\x42\xfe\x2d\xae" - "\x53\xba\xe4\x63\xad\xea\x1c\xf8\x4b\xe9\x51\xf2\x19\x34\xf2\x92" - "\x4d\xb8\x37\xce\xed\x19\xe3\x8d\x6d\x97\x8f\xf1\x4b\x94\x78\x8c" - "\x5f\x1a\x11\x59\xc1\xe7\x70\x5e\x82\xfd\xb3\x4c\xea\x9a\xfc\xcc" - "\x7e\x10\xb0\x99\x5b\x61\x2f\xb7\xcd\x5c\xe5\xb9\x27\x77\x95\x41" - "\xee\x15\xf3\xb7\x57\x42\x97\x44\x0b\xfb\x22\xf0\xfe\x18\x7f\x7b" - "\x85\xbf\xb9\xc4\xdf\xff\x94\x79\x70\x5f\x7a\x9a\xa4\xed\x88\xf7" - "\xb6\xea\xd3\xf2\xfb\xd8\xd0\x15\x5e\x72\xe9\xba\xb5\x05\x2a\x23" - "\x9f\x4f\xdf\xa2\xc6\xa3\x99\xc7\x82\xeb\xcb\x5d\xe5\x51\x75\x5c" - "\xe2\xef\xaa\x91\x45\xe9\x10\x2f\xed\xbd\xe2\xda\x7d\x72\xa8\xb7" - "\x18\x68\x66\x61\x74\xf5\xeb\xde\xab\xd4\xbe\x43\xcc\xbc\xcf\xfe" - "\xa3\x1d\xee\x4d\x69\xf1\xfe\xa7\xca\x77\x68\x53\x86\xee\x93\x55" - "\x2a\x7d\xa0\xc8\xc2\xf2\x93\xed\x9c\xd3\xb4\x69\x5a\xb5\x9c\x2f" - "\x37\x4d\x8b\xde\xe3\xb4\xad\x5e\xd7\xf7\x1c\xbd\x74\xf1\x0a\xfb" - "\xa6\xa9\x3d\xbe\xaf\xae\x7e\x28\xbf\xa9\xdb\x47\xcc\xed\xea\x57" - "\x1d\xd5\x36\xbc\xdb\x19\xe5\xab\xe8\xe7\xf9\x98\xed\xc7\x6a\xf5" - "\x5d\x55\x3f\xda\xd0\x80\x34\xd8\x13\x9b\x65\x3c\xc2\x95\x21\x1a" - "\x96\xff\x7d\xfe\x66\xcf\xa6\x8b\x9a\x1d\xda\x66\x2b\xe2\xf6\x6c" - "\x7a\x8d\xe1\xfa\x90\x4f\xc8\xfd\x80\xcd\xd4\xdd\xe6\xa8\xfa\x74" - "\xd8\x0a\x27\x9b\x47\xe8\xed\xf2\xd1\x26\x19\x3f\x85\xbf\x73\x1d" - "\xdd\x27\xc7\xa2\xc5\xb9\xf9\xf6\x55\xb9\x8b\x97\x2c\x2e\x48\x21" - "\xc7\xfc\xe7\x17\x8f\x41\x92\xed\x29\xfb\xe2\xfc\xdc\xc5\x32\x5a" - "\xb1\x0c\x84\x5c\xb0\x2a\x9f\xf7\x3e\x2e\xdb\x83\x4f\x93\xba\xbc" - "\x71\xf3\x78\x35\xdf\x6f\x2e\xd7\xe9\x54\x7e\xfb\x5b\xe4\x50\x8f" - "\xef\x95\xfc\x66\x70\x12\xfa\x79\x98\x69\x58\xc5\xf7\xd9\xd2\xac" - "\xf4\x8b\xcd\xf5\x97\xfb\x64\x6d\xf6\xe9\x3e\x59\xa0\xef\x34\xe6" - "\xf5\x28\x58\xa0\xff\x2d\x74\x79\x99\x2d\xe9\xdd\xfe\x9d\xda\x77" - "\xc7\x79\xac\x64\xbc\xfb\x57\x58\xde\x6e\x7e\xc0\xeb\x98\xcc\x31" - "\x7b\x35\xbe\xda\x92\x1d\xd5\x5e\xe9\xcb\xcb\xb0\xf8\x9c\xd4\x98" - "\x60\xb4\x2f\xdb\x96\x8f\x30\xf7\x5a\xf5\x7a\x6c\x6b\x8c\x90\x77" - "\x5b\xde\x0c\x18\x3d\x49\xd2\xff\x18\xe5\x00\xab\x4c\xf7\xa3\xf1" - "\x75\xf7\x6b\xcb\x8e\xf8\x36\xa2\xed\xc3\x91\x5e\xd3\xe3\x27\xb8" - "\xc5\xc5\x30\x90\x86\xf9\xbf\x74\x54\x74\x5a\xf4\x38\x4d\x9c\x3c" - "\x0d\x0a\xf4\xf2\x85\x18\xa4\x49\xf3\xf3\xf2\x58\x06\xcd\x5f\x98" - "\xf7\xfc\xb2\xa5\xcb\xb5\xa1\x9b\xb8\x88\xc3\x50\xcb\x2c\x77\x6b" - "\x6f\x6c\x4b\x16\x2e\x5c\xa0\x92\xb4\x81\x8c\xdd\xb3\x52\x7e\x0c" - "\xa5\xb0\xff\x37\xd9\x7b\x74\xc5\xd2\xed\xc2\xb8\xa5\x05\xbf\xf3" - "\x52\xfe\xc8\x71\x2d\xcd\x8b\xb5\xd1\x4a\x0b\x75\xde\x97\xe3\xec" - "\x64\x9f\xb3\xa3\x2f\xb7\x0b\xb9\xc7\x83\x71\x2d\xfb\x13\xfa\xd9" - "\xc7\x47\x65\x7c\xe6\xcb\x10\x05\x67\x4f\x37\xbe\xd7\x3f\xd6\xbc" - "\x5e\xf9\x4c\x98\xf8\x9b\xb5\x1c\x53\x02\xef\x61\xff\xbf\x74\x52" - "\xc9\xc9\x52\x5f\xf7\xde\x8b\x31\x09\xf6\x66\x29\x68\x7f\x69\xe6" - "\xe5\xfc\x5d\x66\xbe\x9c\xef\xd9\xd7\xb2\xcc\xa6\xe3\x38\xea\x1b" - "\xf4\xa0\xbf\xb2\x83\xfa\x9a\x71\xb5\xf6\x4d\x04\xbe\xe7\xb2\x6c" - "\x57\x88\x01\xfd\xef\x61\xbf\x86\x53\x54\xb6\x49\xd1\x54\x99\x3d" - "\xca\x37\x30\xed\x0c\x95\x15\xab\xb1\x2d\x73\xe9\xfc\x87\x7e\x4a" - "\x5d\x8e\x61\xa8\x79\xbd\xb4\x8f\xa2\xaf\xb2\x1d\x3a\x6e\xd9\x86" - "\xc7\xf3\x9e\x1e\x3d\xa8\x74\x8e\xf4\x17\x51\x31\x35\xba\xb8\xff" - "\x80\x33\x56\x87\x83\xbc\xe8\xbf\xd9\xaf\xe3\x4a\xcf\x13\x4d\x13" - "\x93\xe6\xe7\xc3\xc0\x5e\xbc\x68\xd1\xc2\x65\xcb\xf5\x38\xe3\x19" - "\x4b\xf3\x16\xa8\xb8\xe2\x77\x63\xf8\x57\x82\x87\x27\x70\x68\x72" - "\xa4\xaa\xdb\x38\x7d\x77\x14\xaf\x89\x48\xff\x51\x69\x73\xbd\x76" - "\xb0\x4a\xb3\xbf\x4e\xd1\x2b\xb3\x94\xff\xd5\x2b\xd7\x2a\xdd\xf6" - "\x9a\xb7\x3b\xdc\x2f\x17\xe8\xba\x2d\xaf\xb5\xb6\xd3\x4d\x15\x7c" - "\x46\x8e\xcf\x12\x6c\x7b\x5d\xb4\xf0\xda\x2a\xf2\x54\xe8\xdf\xa2" - "\x63\xbd\x69\xf3\xeb\x2a\x86\xb6\x67\x09\xfb\x8a\xbc\xf6\x69\xa4" - "\xe4\x58\x9a\x48\xd9\x97\x05\xfd\x2c\x95\x79\xa2\x7f\x1b\xfb\xf0" - "\x72\xec\xab\x97\x5b\x58\xaf\x63\x59\xc6\xdf\x6b\x68\xa1\x97\xf7" - "\x40\x46\x43\xa6\xbf\xe6\xf3\x27\x1f\x4b\xdb\xb0\x9a\xcc\x5c\x07" - "\xe4\xb5\xaf\x6e\x3b\xe3\xf6\x15\x3a\x0c\x59\xa6\xc9\x6c\x1f\xd7" - "\xe3\xa3\x97\xeb\xb5\x75\xff\x11\xda\x3a\xeb\x08\xe4\x83\xfc\xef" - "\x5f\xa1\x68\x75\xff\x87\xb7\xb8\xc8\xc1\xdf\xa6\x54\x71\xab\x3e" - "\xde\x8b\x7e\xec\xe5\x6f\x40\x42\x17\x84\xbd\xf3\x72\x01\xfa\xb0" - "\x57\xf3\x01\x07\xad\xbc\xd2\xa0\x7c\xfb\x5f\x5e\xc0\x38\x00\xdc" - "\x4c\x0d\x6e\x26\xe0\x62\xfc\x6f\xd0\xe2\x65\xbf\xb2\x49\xaf\x03" - "\xf3\x9f\x1f\x7a\x73\x90\x75\x67\xb4\xdb\x8c\x5f\x6a\xa9\xdc\x4b" - "\xf7\x41\xee\x5b\x04\xfb\xae\xf5\x7c\x6f\xef\x95\x3a\x7d\x2e\xe4" - "\xba\xb5\xb6\x8f\xe2\xb5\x3e\x5e\xe7\xd3\xea\x62\x79\x6f\xd0\x61" - "\xe2\xd9\x1c\xb9\x74\x76\x3b\x60\x9a\x31\xaf\xfb\xb5\xef\xac\xa5" - "\x96\x5e\x60\x3f\x47\x1f\xe6\xed\xaf\x8b\xdc\x50\x1a\xef\x41\xf5" - "\xd7\xbf\x63\x57\x7d\x81\xf1\xf5\x6a\x66\xcf\xde\x12\xca\x03\xff" - "\xe0\x07\x57\x0b\xbd\x3a\x95\xeb\x65\x5e\xe0\xb1\xec\xc4\xd8\x60" - "\x7c\xa6\x88\x4b\x67\x77\xdb\x96\x50\xff\xd3\xf4\xea\xb3\x3c\x46" - "\xbc\x1f\xcc\xfe\x87\x48\xb3\x70\xdc\xfd\x53\xf4\xea\x23\x3c\x3e" - "\xdc\x16\xe0\xd0\x1a\xea\xc8\xb9\x9f\xcf\x5c\xb3\xcc\x5c\x5b\x08" - "\x9d\x7b\x11\xcb\x92\xf2\x4f\xd9\x86\xe7\xef\x25\xf1\xbd\x73\x81" - "\x88\xc8\xf1\x5d\xcd\xe3\x5b\xfe\xe9\xda\x56\x11\xf9\xc2\x4d\xe2" - "\x48\x80\xe8\x0b\x23\x85\x82\x46\x03\xb7\xdb\xe8\x3c\xcb\xe7\xc2" - "\xb7\x93\xd7\x51\xcc\xbe\x6c\xe6\x2d\xab\x29\x8d\xcf\xd4\xf3\xb7" - "\x80\x1a\x03\x95\xd4\x98\x5f\x49\xc7\x42\xe5\xe4\x59\xc1\xf1\x51" - "\x5e\xdb\xf0\x47\x47\x39\xef\xb1\x25\xe3\x7e\xb2\xed\x87\xb2\xae" - "\x61\x7f\x3c\xfe\x67\xfa\xa3\xe7\xcf\x64\x7b\x54\x3e\x8f\xaa\xcf" - "\x39\x46\xf5\x59\xc7\xc8\xd9\x22\x22\x6c\xd7\x15\x3d\xcb\x75\x14" - "\x03\xd6\x76\x3e\x7f\x9e\x16\x69\xb7\xa6\xa0\xff\x26\xde\x3f\x68" - "\x0c\xf8\xc9\xb3\x64\x3f\xb7\xf1\x57\x55\x17\xc8\xec\x59\xf2\x07" - "\x79\xaf\xec\xad\xb3\xdb\xbd\x0b\x9a\x59\xa7\x0c\xf1\xd9\x7b\xde" - "\x93\x84\x8d\x11\x29\xe5\x36\x86\x55\xbb\x81\x2f\x93\x5e\x1e\x3a" - "\xa7\x5e\x5e\xc6\x8a\xdb\xc6\xf8\x40\x9b\x1a\xe6\x28\x9c\xd4\x63" - "\xa6\xd0\xda\xfc\xa9\x33\x27\x1a\x3f\xaf\xd6\x33\x7e\x38\x66\x6b" - "\x04\xe3\x85\xb6\x65\x01\x07\x11\xbd\x0e\xb4\xd9\xac\xad\xe1\x9a" - "\xb7\x5c\xa0\x54\xcf\x12\xfe\x16\xdc\x6b\x77\x58\x66\x99\x40\x1f" - "\xe7\x76\x97\x5e\x24\x13\x8f\x1b\xef\xdb\x94\xca\xf7\x0c\xf3\xb5" - "\x74\x1e\x33\x7f\xf2\x51\x17\x7e\x1b\xf0\x2b\x66\xba\xc3\x75\x13" - "\xc6\xab\x18\x6d\xd8\x85\xb1\xda\xce\x57\x45\x8b\xfb\xf7\x72\x5c" - "\x12\xcd\x86\xea\x49\x07\x1f\x85\x84\xfc\xde\x32\x78\xa6\x7c\x57" - "\x04\x7c\xc4\x6b\x38\x55\xaf\x50\x6a\xc4\x5d\x16\xdc\x06\x59\x57" - "\xf9\x8a\x3c\x97\x9c\xc6\xeb\x9a\x6f\xc9\x6f\x6b\xbc\xb6\x5b\x97" - "\x7d\x1b\x07\xf3\xd9\xcd\xf2\x93\x46\x5e\xf7\x29\x3e\x96\xa1\xd1" - "\x79\x06\xf2\x40\xfe\x0f\xd1\xe6\xd0\x57\xa4\x7d\xc1\xbc\xdf\x9b" - "\x3d\x01\x5d\xb6\x5e\x6c\xcd\x21\xde\xff\x49\x5d\x27\xfc\xa9\x2d" - "\x16\xd1\x18\xa8\x97\x67\x76\x1b\x03\x61\xb9\xff\x83\xf7\x86\x19" - "\x01\xbf\x05\xba\x6f\x13\xe3\x4e\x4f\xe7\xbd\x23\x5e\x57\x9b\x11" - "\x10\xfe\x99\xab\x2c\xfc\x2d\xcc\x61\x72\xef\x40\x4b\x6f\xb4\xc2" - "\x6e\x58\xe5\xb7\xa0\xef\xa1\x6e\x58\xed\x39\x49\xcc\x6f\xc8\x9b" - "\xde\x9d\xb7\x3d\xc7\xc4\xdf\x76\xe6\x3a\xa3\xd2\xfa\xcc\x74\xa0" - "\x2c\x8f\x95\x96\xa6\x74\xe6\xd7\xf7\x74\xdb\x94\x7c\x7e\xa1\x1d" - "\xf3\xe6\xf2\x1c\x43\xa4\x3d\xc7\x18\x06\x6c\xd0\x7e\x9a\xfc\x26" - "\x67\xc8\xaf\x7d\xe3\xaa\x15\xfc\xdb\x4c\x62\xf3\x90\x79\xc8\x67" - "\x62\xb8\x1c\x0b\x82\xbf\x0d\x22\xfa\x5f\x9f\xf8\xdb\xcf\x9b\x0c" - "\x56\x4f\xd1\xa3\xa0\xa7\x37\x6a\x98\x9f\xc3\xe6\x3f\x8e\xb5\x3d" - "\xcd\x3a\xcc\x1b\xd2\x37\x20\x0c\x1e\x0b\x27\xff\x71\xec\x98\x56" - "\x32\x14\x81\x6e\xd5\x1a\xd4\x1b\x0f\x7b\xc1\x83\xce\x88\x80\x1e" - "\xfa\xc6\x14\xa6\x1b\x4b\x1b\xfb\xca\xfd\x71\x9c\xf4\x4f\x4b\x09" - "\xa7\x79\x83\xad\x54\xef\xfa\x0b\xd5\x87\xbc\xae\x9a\x0b\x7e\x93" - "\xf2\x53\x33\x31\xdc\xc5\xfc\xce\x09\x5a\xcd\x0d\x6f\xa7\xde\xf6" - "\x06\xd8\x3e\xc6\x1c\xf6\x57\x65\x2b\xbe\x51\xa3\xdb\xc5\x57\xee" - "\x43\x45\x3a\xc7\xcf\x10\xc2\x4a\x91\x8d\xff\xc1\xb1\xf2\x9d\xa2" - "\x23\x83\xc6\xac\xe6\x35\xb9\x37\xda\x60\xa3\x64\x69\x70\xcf\x2b" - "\xb8\xc8\x7f\x05\xb8\x4c\x33\xf5\x15\x72\x5f\x0a\x7d\xfa\x0f\x0a" - "\x03\x76\x38\xe5\x3f\xb2\x20\xe3\x9d\xce\x2f\x78\xcd\xf6\xcd\x47" - "\x50\x0f\x35\x86\x9a\x88\xe3\xf0\x54\x45\x30\x3f\x9e\xb7\x92\xe6" - "\x93\xe7\x3c\x47\x15\x93\x23\x22\x23\x0d\xf6\x3a\xef\xc7\x38\x59" - "\xc6\xf1\x5a\x40\x51\x98\xfa\x7a\x31\x33\x72\xec\x08\xc0\x98\xfe" - "\x11\xef\x7d\x41\x4e\x84\x85\xd5\x78\xf0\x12\x66\x7a\xc8\x4e\x19" - "\x4b\x62\xfd\xd7\xde\x1a\xb0\x8e\xee\x11\x46\x8b\xf4\xe9\x8c\x94" - "\x74\x59\x31\xb6\x76\xd9\x9e\x8d\xc7\xc6\x45\xf9\xff\x25\xa1\x2e" - "\xe9\xff\x27\xcc\x47\x43\x95\x72\xdd\xf1\x8f\x63\x3b\xdc\x15\x01" - "\x1f\xbd\x21\xd7\x5f\x37\xf1\x19\x0f\x29\x63\xdf\x9c\xef\x4f\xfe" - "\xc4\xc7\x30\xf8\x2c\x6b\x64\x45\x78\x77\xe9\x3f\xa4\x7e\xcd\xef" - "\x26\x36\xb6\x75\x78\x44\xf1\x27\x3e\x3e\xc7\xa8\xc1\xb6\x9c\xa3" - "\x37\xaf\x15\x25\x9f\x40\xbf\x78\x73\x9e\x1a\x1b\x79\x3f\x8a\xdf" - "\x87\xba\x32\xa0\x57\x57\xec\xac\xec\xe4\xbd\x80\x8a\x39\xc2\xfd" - "\x75\x4f\xbb\xf9\x13\xdf\x6c\x2b\xeb\x54\x6f\x16\xf8\x0c\xb5\xc5" - "\xda\x3a\xa0\x8c\x8b\xd1\x9b\x8d\x24\xb6\x5a\x53\xbc\x00\x02\x7b" - "\x36\xfd\x0c\x6d\xfd\xbc\xd3\x4d\xc6\x2e\xe8\x82\x9d\x46\xe2\xf5" - "\xec\xd4\x2d\x43\x29\x13\xef\x86\x9e\xa1\x37\x8f\x86\x8c\x94\x8e" - "\x5f\x9a\xff\x6b\xf6\x64\xc0\xcd\xe2\x35\xd2\x86\x0b\xbc\xc6\xf5" - "\x96\x3c\xa7\x5c\xfa\x16\x8d\x88\x00\x1e\xef\xf7\x94\x0e\xa5\x11" - "\xbc\x4e\x89\xb4\x8c\xdc\xb0\xda\xf7\xd4\xd7\x22\xd6\x0f\xa5\x51" - "\xb1\xf5\xbe\xb9\x5b\xad\x63\x6e\x6d\x91\xb6\x95\x9f\x6e\x84\x6d" - "\x75\x0a\x70\x77\x08\x77\x92\x10\x5f\xb3\x1a\x95\x6f\xc2\x5b\x9b" - "\x2d\x15\x8a\xee\xe4\x3e\x1f\xe8\x8d\xf7\x51\xb5\x3d\x25\x83\x8c" - "\x07\x92\xe2\xad\xe3\xef\x50\x47\xad\x13\xa7\xc9\x76\x68\x67\xf8" - "\xc3\xeb\x6f\xe3\xd8\x60\xf2\xec\x7e\xee\x7c\xb5\x1f\xc5\xe7\xfb" - "\x7d\xf4\x96\x8c\xc7\xb8\xe9\x2d\x4a\x7d\xe9\x2d\x4a\x6b\x58\x24" - "\xfb\x55\xa3\x78\xd1\x44\xdc\xde\x48\x31\xf3\x19\x68\x02\xed\xe6" - "\xfa\x98\x36\x1a\x43\xe7\x3d\xce\x02\x11\xf1\x3c\xcd\xba\xe8\x5b" - "\x61\xcf\xb2\x5d\x34\xb3\x25\xa4\xce\xa2\xce\x25\x7f\x35\xe0\x55" - "\x0f\xa5\xb4\xd3\xb4\x35\xd9\x9b\x47\xbc\x5f\x71\x93\x67\xd9\x1e" - "\xc0\xde\x7a\x03\xcf\x05\x9b\x81\x1f\x35\x27\x6c\x6d\xf2\x06\x9b" - "\xa9\x01\xfc\x3d\x23\x5f\x48\x38\xc8\xf3\xb0\xec\xef\x56\xab\x2d" - "\x57\xc5\x60\x90\x7d\xed\xde\xe7\xd3\xfa\xe1\xbd\x20\xe1\xd9\xbd" - "\xa0\x12\xbd\x4f\x3a\xae\x15\x7d\x6d\x7d\xc7\xb3\x6c\x07\xf1\xf8" - "\x70\x7e\x3c\x97\x7b\xdb\x90\xf7\x6c\xec\xb8\x70\x1e\xbc\xfb\x08" - "\x70\xbf\xd3\xb3\x57\xcd\x7b\xa8\x3d\x79\x2a\xdf\xe2\xf3\x68\x6f" - "\x99\xb7\x02\x47\x6a\x6d\x7f\xeb\x1d\xdc\x56\x8c\x5d\xa6\xb7\xe0" - "\x2f\x89\x7d\x52\xc1\xfb\xa0\xfb\x75\x8d\x72\xcf\xae\x72\xf8\x8c" - "\x50\x44\x28\x79\x56\x79\x3c\x02\x39\xe0\xc3\x95\x65\x81\x94\x27" - "\xb7\xb3\x1f\x50\xe5\x09\x8b\x41\x8d\x2f\xf7\x85\xf5\x95\x44\x63" - "\x1c\xb5\x9f\x98\xc6\x6d\xd5\xc7\x98\xbf\xe1\x18\xe1\x3d\x61\xf6" - "\xb7\xef\xb2\x92\xa2\x3f\x51\x06\xb8\x1f\x69\xba\x9b\x43\x9b\xcb" - "\x1c\xed\xc9\x7f\xcc\xe2\xf3\x91\xba\x6f\x30\xf8\x77\x7c\xae\xf2" - "\xe7\xb6\xb2\x8c\xaa\x36\x0a\x8d\x36\x2b\x8f\x6b\x65\x0b\x94\x4f" - "\x46\x65\x39\xca\x17\x24\xec\x6f\x12\xe4\x8e\x1b\x62\x1a\xfd\x61" - "\x3d\x52\x40\x56\x61\x3e\xe8\xeb\x0d\x74\x6a\xdf\xcf\xdc\xf6\x20" - "\x74\xea\xbe\x7c\x3e\x4a\x6f\xdb\xd5\xed\xfd\x6d\x1b\xa6\x6c\x9b" - "\x6d\x73\xf5\xb5\x25\x61\x06\x8e\xdd\x16\xc1\x67\x25\xf9\xbc\x4b" - "\xa0\xbf\xc1\xe6\xef\x3f\x68\x96\xe2\x9b\x6d\x1b\x44\xb2\x92\xb7" - "\xb9\x41\x72\x71\xbf\x78\x6f\x17\x76\x53\x5f\xee\x33\xe0\xc0\xfe" - "\xc9\x1f\xaf\xe6\x73\x05\xbb\xd7\xb5\x1d\xbd\x6f\xe8\x93\xec\x1b" - "\xfa\x28\xfb\xa6\x7d\x5f\xea\x34\x55\x0d\x97\xeb\xe5\x57\xd7\x1f" - "\x15\x5f\x66\x93\xc1\xc6\xdf\xce\x3d\x4d\xd5\xfb\xe4\x19\x18\x8c" - "\x89\xda\x07\xa9\x2a\x10\x29\x2f\xa5\x5c\x1d\xcc\xaa\x2c\x05\x73" - "\xd0\xac\xd7\x38\x16\xa5\xf6\x8d\x3a\xc0\xfe\xa9\xd8\x3c\x68\x96" - "\x3c\x63\x88\xfa\xf8\x1b\x9f\x3d\x72\xa8\x7a\x04\x8f\xd5\xed\xbb" - "\x28\x4b\xd1\x61\xf5\xf5\xbc\xd6\xac\xec\xbc\xaa\x23\x90\xbd\x9b" - "\x94\x4d\xa5\xfb\x91\x1b\xa4\x1f\x79\xb4\x8c\xbd\xca\x36\x4a\x79" - "\x27\x52\x3a\x3d\xb8\xdf\x2b\xcf\x4a\xa2\xbd\x2b\x43\xba\xfc\xab" - "\xda\xcb\x3e\x49\xdd\xfe\x00\xab\x40\x2b\x45\xea\x1c\x79\x87\xbb" - "\x3a\x47\xd7\x51\xe4\x37\xc9\xdc\xe2\x08\xe7\x9b\xb9\xea\xbc\xf4" - "\x17\x28\x95\x31\x0f\xce\x68\xe7\xec\xaa\x9f\xd5\xd6\x35\x32\xd8" - "\x87\x1f\x65\xcb\x7d\x74\x58\x9e\x09\x64\x1c\x70\xdd\xb2\xed\xf2" - "\xbb\x60\xd5\xbb\x7b\xf6\x7d\xaa\xe4\x77\xd3\x95\x5f\x6b\xf5\x11" - "\x9d\x46\xd0\xdf\xbe\x2a\x36\x68\xd5\x1d\xb5\xa3\x48\xd2\x40\xbb" - "\xb0\xa6\x7c\xa3\x92\x69\xb2\xda\x1f\x8d\xa7\x99\xa1\x88\x53\xc9" - "\xa0\xaa\x66\x21\x79\xbd\xaa\xf9\xcb\xf5\x89\xed\x93\x75\x5d\x44" - "\xe1\x39\x0d\xf2\xe5\xed\x34\x89\xeb\xe2\xfd\x39\x1c\xa3\x65\x4d" - "\x11\xc7\x9c\xfa\x69\x1f\x8e\xed\x15\x2a\xde\xef\x08\xf3\x99\x4c" - "\xcc\xb3\x91\xe2\xfd\xc5\xa7\xf3\xc9\x98\x9b\xcf\x7b\x5d\x9f\xec" - "\x66\xfb\x4a\x38\xa1\x0b\xa4\x40\x3f\x01\x9f\xaf\x5d\x4c\x96\xc7" - "\xed\x80\xed\xcc\x48\xe7\xd8\x5b\x1c\x77\x8b\x63\xe7\x85\x9d\x19" - "\x03\x71\x3f\x18\xfa\x5c\x9a\x30\xef\xb7\xb3\xbf\x4c\xd8\x2d\x20" - "\x8f\x4f\x72\xfc\x2f\xa3\xd7\x1f\xa4\xb5\x67\xc9\xcc\xb1\xbd\x42" - "\x25\x9f\x1c\x69\x0c\x7c\x2a\x6d\x8b\x01\xf9\xd0\xa7\x23\xf2\x5c" - "\x8e\x35\x92\xfc\xc9\x6e\xcc\xf1\x7b\x54\xbf\xcf\x0b\xd5\x6f\xd5" - "\x6e\x6e\xbf\x94\x71\xc5\x35\xc5\x45\xb2\xed\xff\xf2\xf3\x10\xe0" - "\x47\x8a\x0f\x6f\x08\x17\x1f\x76\xa9\xb3\x9c\xf5\x54\x54\x20\x5a" - "\xbd\xd0\x8d\xd9\x7f\x93\xcf\xeb\xb2\x3f\x0e\xf7\x91\xfb\xc7\x75" - "\xff\xf1\xc2\x59\x19\xab\x2c\x84\x67\x67\x9e\x56\xa6\x0d\x65\xda" - "\xea\xa9\xb3\xf8\xb0\xec\x7b\x63\x40\x95\xcd\x95\xf7\x5c\x3e\x0a" - "\x0f\x5a\x9f\xbb\xf1\x80\xbe\x73\xff\xb8\xff\x21\xc6\x09\x70\xa0" - "\xf5\xd5\xda\xa5\xf5\x93\xfb\x78\x0c\xb3\xce\x5b\xe8\x27\xfa\x2a" - "\xfb\xd9\x85\x7e\x1e\xb1\x13\x05\xb7\x18\x32\xbf\x48\x39\xec\x62" - "\xfb\xd0\xf9\x27\xe8\xd1\x85\x65\x04\x3b\xd0\xf4\xab\xa2\x32\xe3" - "\x46\xe8\x26\x45\x7e\xd8\x83\x7e\xd1\xca\xfa\xbe\x37\x1f\xbf\x50" - "\xa5\xfc\xee\xb0\xd4\x8f\xf9\x1b\xb1\xcf\xa1\x4f\x91\xcf\xa9\xa8" - "\x55\xb4\x42\x37\x0d\x7a\x43\xc8\x63\x47\xff\x61\x3f\x9e\xd6\xda" - "\xcf\x79\xd7\xfe\x43\xf5\xcb\x92\x47\xe9\x87\x1e\x2d\x36\x7a\x9b" - "\x8b\x49\xef\xcb\x13\xc8\x87\xfe\x58\x01\xab\xbf\xfc\x2e\x03\xfa" - "\xb9\x15\xed\x0c\x46\xf5\xa9\xa1\x2d\x08\x98\x27\x28\x65\x16\x19" - "\xde\x3a\x87\x7e\x9c\x23\x6b\x59\x11\xf4\xaf\x87\x58\x5f\xfc\xe9" - "\x67\xd7\xe4\xd0\x08\x1f\x6d\x6f\x55\x74\x27\xe3\x06\x5d\x77\x86" - "\xde\x4e\xee\x8e\x0d\xc4\xf1\xd6\x92\x3f\xa9\x67\x3a\x92\x31\x82" - "\x78\xce\xe8\x00\xcd\xb0\x2f\xcd\x4a\xd4\xd1\x91\x31\x58\xb6\xc7" - "\x3d\x96\xf0\x9c\x8a\x67\xd6\x83\xd3\x79\x4d\x00\xe5\x8e\x08\xe0" - "\x8c\xe1\x43\x9f\xdb\xc3\x57\xc6\x61\xc2\xb3\x26\xbf\xa6\x71\xa8" - "\x63\x1c\xdb\xbe\xbb\x8b\xfc\xc6\x17\x7e\x4d\xa3\xae\x4e\xa6\xbc" - "\x3d\xae\x37\xf9\xcd\xfb\x16\x0c\x0f\x7d\x1b\x78\x86\x76\xdc\x10" - "\xcb\x63\x36\x29\xcb\x94\x1c\x7c\xbb\x85\xf7\x0a\xae\xb2\x5e\x29" - "\xff\xd8\xe7\xe9\x2a\xcb\xb5\xea\xed\xc0\xfd\x8e\xde\xda\x7e\xf5" - "\x78\xd8\x91\xd5\x1b\xac\xcd\xaf\xcb\x78\x71\xce\x2d\xaf\x43\x5e" - "\x40\x57\xa8\xb5\x72\x0c\x6f\xcc\x9d\x3b\x02\xb4\x7c\x1b\x99\x9d" - "\x67\x79\x4d\x66\x3a\xd5\x56\x66\x52\x15\x6c\x72\xd1\x9e\x31\xf0" - "\xd5\x0b\xec\xfb\xa0\x64\x08\xeb\xa4\x7c\x96\x52\x2c\xcf\x48\x2b" - "\x7d\x5d\xd7\xe1\xdf\x49\x2e\xbc\x48\x46\xf5\x8d\x94\x77\xcc\xd9" - "\x36\x11\x2a\x37\x46\xec\x95\x1c\xf3\x2a\xa5\x6b\x1e\xc7\xbc\xd2" - "\xe3\x48\x49\xdd\xc7\x01\x9e\x6b\xb7\xa6\x6c\x5e\x46\xa3\x38\xf6" - "\x9d\xc5\xaf\x74\x39\x35\x5f\xbf\x33\x0e\xed\x4b\xd3\xf6\xfb\xd3" - "\x54\x6c\xa9\xb7\x5d\xd5\x17\x50\x97\x7a\xbf\x38\x0c\x1b\x46\xc2" - "\x5d\x46\x23\x2a\x2f\x50\x06\xeb\x41\xb9\x9f\x2b\x9d\x8d\xed\xc2" - "\xe9\x6d\x16\x11\xfe\xef\x0c\xda\x76\xa6\x27\x36\x9e\x7f\x39\xc7" - "\xd3\x13\x09\xcf\x55\xa9\xf5\x77\xe9\xf3\x23\xe3\xb1\xa8\x6f\xe8" - "\x11\x95\xbf\x42\x26\xfe\x66\x2c\xaf\xe5\xf1\xda\x30\x9f\xfb\x51" - "\x73\xc8\x3b\xcd\x7a\xcc\xb0\x5e\xf7\x11\x8b\x95\xbd\x13\xe9\x0b" - "\xfb\xcb\xdf\xe1\xf1\xac\xe0\x39\xe3\x5d\x1b\x9f\x35\xea\xb1\x71" - "\xde\x35\xf0\x3b\x4e\x63\x5f\xf8\x2c\x89\xcb\x77\xa7\xb0\xdd\xa3" - "\xd9\x8c\x87\x6c\xdd\x69\x4a\x87\xe1\xb9\x8c\xdb\x50\xad\xd6\x91" - "\x07\x74\xb8\xdf\x5d\xa0\xcf\x67\x3c\xaf\xab\xef\xd5\xbe\xeb\xf0" - "\x19\x3e\xea\x75\xff\x4a\x5f\x57\x97\x7e\x6e\x1c\x0b\xcc\xfd\xee" - "\x4e\x7d\x7e\x93\xdf\x23\x59\x3f\xf4\xde\xe5\xab\x68\xd8\xec\xeb" - "\xcd\x32\xf6\x06\x7f\x77\x54\xcd\xbb\xef\x36\xf5\xec\xa7\x65\x49" - "\x7c\xcb\x6f\x0d\xb2\x8d\x61\xc4\x1c\xac\xe2\xdf\xb5\xa9\xf9\x57" - "\x3f\xe7\xfe\xee\xd9\x9e\x7a\x7e\x96\xd6\x3d\x8f\xa2\x0e\xf6\xeb" - "\x60\xf8\x4a\x37\x79\x97\x7d\x68\x78\xef\x2b\x4b\xcd\xaf\xef\xd6" - "\x5d\x41\x17\xcb\x60\xfc\x46\x34\x7b\xd2\xdb\xf6\x37\x85\x5f\x07" - "\x25\x8d\x29\x27\xeb\xa1\x22\x9f\x69\x80\x8a\xe3\x64\x39\x45\x3f" - "\x9b\xcf\xef\x99\xd6\x3d\xb7\xf3\x5a\xdc\xcf\x0e\x7a\x79\xde\xee" - "\xca\x49\x9d\xc1\xb6\xbe\xd4\xc5\x7f\xb6\x6b\x34\xca\x21\x6d\xe0" - "\xef\xcf\x05\x4d\xa5\xab\x69\x14\x7f\xd3\x13\xe9\x72\x9d\xc0\x3f" - "\xe4\x99\x8e\x6f\xa4\x93\xf5\x1b\xe5\x7c\x1e\xe0\x67\xc7\x61\x5f" - "\x86\xe4\x3a\x2a\xd7\xbf\x65\x88\x8b\x63\xff\xbd\xd7\xe9\xeb\xa3" - "\xc6\x6a\xe7\x73\x78\xce\x88\x7a\xee\xaf\xaf\xe5\xfb\x68\x67\xbe" - "\xdc\xbb\x64\x9f\xe7\x25\x3c\x5f\xb3\xad\xa4\xfb\x09\xed\x7c\x4e" - "\xb5\x65\xe7\x73\xb5\xf9\xc4\x6b\xd5\xc7\xab\x64\x1c\xaf\x9d\xd9" - "\x3e\x7a\x77\x83\xb6\x1e\xd3\x24\xe9\x8a\xf5\xdd\x17\xd9\x06\xfb" - "\x9b\x67\x33\xf2\xf1\x3c\x91\xeb\xa0\x2c\xa5\xc3\x87\x38\xee\xa5" - "\x2f\xaa\xff\x9f\xf2\x5a\x5f\x42\x99\xf8\x16\x91\x2c\x53\xd2\x35" - "\x4b\xfa\x9c\x6d\xbe\xde\x87\xab\x59\x94\x84\xd9\x5e\x4a\x05\xcd" - "\xa5\xe1\xca\x73\x38\xe7\x4d\x17\x9b\x87\x78\x98\x2e\x61\xc3\x5a" - "\x61\x27\x98\xdb\x93\xbb\xa6\xf4\x76\x56\x91\x71\xe3\xdd\xf0\x43" - "\x52\x3e\xb4\x3f\x9f\xd3\xe0\x87\x7e\xb6\x8d\x68\x79\x48\x74\xda" - "\x6e\xe4\x33\x41\x3f\x9f\xe3\xdc\xc6\xbe\x2b\x3f\xcf\x88\xf5\x5d" - "\xf9\xf9\x14\xfc\x8a\xf1\x3b\x49\xf4\x8b\x54\x5c\xe7\xf4\xfc\x7e" - "\x31\xa5\xc3\xfd\xf3\x39\xc0\xa3\xd4\xb1\xae\x4e\x26\x72\x79\x8c" - "\x03\xdb\x45\xc9\x7f\xf1\xab\xfe\x0e\xca\xc4\xb3\x59\xf4\x1f\x92" - "\xaf\xf5\xd7\x86\xe7\x34\x9b\x13\xf3\x5a\x32\x70\x32\x14\x7d\xee" - "\x7f\xbd\x8f\xfb\xcb\xed\x6d\x4f\x0e\x53\xf4\x39\x4d\x86\xc9\xfd" - "\xf7\x27\xa3\x1c\x70\x29\x6e\x5e\xb1\x5d\xc7\xa7\x86\x27\xde\x37" - "\x32\xb6\x03\x86\xd2\x83\x90\x1f\x30\xf4\xfc\xdd\xb8\x1f\xca\xdf" - "\xd7\xc0\x98\x22\x1f\x6c\x62\xb3\x7e\x06\xb4\xc3\xfd\x8b\xac\xc3" - "\x79\x6a\xff\x80\xcb\x06\xa2\xca\x72\xcc\x8b\x44\xe5\x51\xa7\x2c" - "\xcf\x6d\x3d\x4d\x3f\x7f\x58\xd5\xfb\x8b\xb1\xbd\xf1\x52\xd1\x70" - "\xe8\x77\x95\x3e\x8e\x8b\xc1\xfa\xd0\x78\xef\xb0\x00\x79\x2b\x23" - "\x98\xf3\x43\x99\x59\x45\xc2\x73\x9a\x7e\x71\xb1\x31\xd8\x7a\x95" - "\xf3\xe1\x2f\xa4\x4f\x96\xe8\x74\x91\xb7\xf0\x4e\xf9\x2d\xeb\x73" - "\xb4\x6b\xa4\xd7\x2f\x63\xc2\xf3\xbd\x8c\x2d\xca\x7e\x1a\x3c\x37" - "\xc0\xc6\xee\x8e\xa9\x18\x41\xde\x2a\x4e\x47\x9a\x37\xe0\x97\xb1" - "\x17\x7b\xfc\xc8\xbb\xcc\x8a\xa7\x7e\xf9\xa9\x8c\xbf\xc0\xed\x0d" - "\xdd\xef\xe1\x36\x47\x8a\xbb\xcc\xdc\x07\x27\xec\x3f\x6f\xa8\xc3" - "\xc3\x3c\x61\x5b\xc1\x6b\x85\xbf\xdc\x07\xba\x13\x91\x92\x2e\xf3" - "\xd5\xf5\xe1\x97\xf2\x3c\x90\x33\x24\xce\xf9\x93\xbb\xcc\xac\x93" - "\x94\x16\xf5\x31\x4f\xaa\x14\x9e\xf6\x94\x50\x66\x87\xfb\x97\x27" - "\x0f\x3b\xd4\xd8\x5c\x25\xdc\x93\x7a\xdf\xab\xb4\xbe\x23\x4d\xee" - "\xcd\x8d\xa9\x50\xb1\x26\x7d\xb4\x2b\xbd\xd7\x35\x2b\x8c\x33\xeb" - "\x03\xec\xe3\xaa\x70\xb1\x6b\x41\xf7\xdc\x70\x55\xed\xd8\xb5\xe0" - "\x2b\xd4\xd1\xa5\xd5\x71\xe4\x7f\x58\xc7\x91\x2b\xd5\x01\xd9\x70" - "\xc3\x19\xfa\xd5\x9c\xab\xb7\x1d\x7f\x65\x93\xb4\x52\x1c\xb2\x29" - "\x99\xf9\xeb\x8f\xc2\xb0\xdf\x42\xa9\x83\x32\xe5\x77\xa7\x8c\xe4" - "\xe2\xb8\x9b\xa1\xe2\xbf\xf8\x1b\x1c\x9d\xe4\x59\xf1\x67\x6a\xa1" - "\x5f\xc9\x58\x77\x0d\x05\x6c\xb3\x0d\xc9\xef\xda\x18\x72\x75\x19" - "\x77\xed\x60\x7c\x6f\xc3\x38\x6c\x8d\xa2\xb3\xc6\xc0\x9f\xc9\x3b" - "\x8f\xd7\x57\x9b\x78\x5d\x3b\x5f\xf4\x1f\x94\x19\x81\x6c\x80\x8e" - "\x1e\x96\xf8\x80\xfe\x22\xed\x2d\xd8\x6c\xd2\xde\xf2\xcb\xf3\x89" - "\xfd\x65\x3c\x4d\xf7\xd2\x00\xaf\x7d\x87\xbb\x72\x6c\x1d\x6e\x9a" - "\xc5\x71\x36\x79\xdd\x59\x98\x8f\xa5\xcf\x0c\x25\x09\x69\x4f\x41" - "\xf7\xe7\x38\x9b\xde\x80\x8f\xc2\xd0\xa3\x2b\x2f\x51\x7a\x25\x74" - "\x4f\xc8\xec\x34\x96\xeb\xd5\x5a\xac\xcd\xcd\x97\x7a\x62\x6d\x56" - "\xf1\x5a\x4f\x33\xee\x2f\x91\x29\xbc\xd9\x60\xdd\x7a\x89\x46\x6c" - "\x5b\x41\x19\x5b\x79\x2d\xef\xef\x4a\xf7\x61\xbd\x42\xc6\xdd\x5c" - "\x9a\xc1\xeb\xf9\x3d\xba\xcf\x4a\x8e\x0b\xdc\x2d\xb7\x4c\x72\x0d" - "\xe4\xaa\xf0\xfd\x6b\x39\x0f\x86\x8a\xbb\x66\x85\x52\xaf\xf7\x75" - "\x6d\x0c\xc3\x26\xfd\x55\x1d\xf0\x97\x95\x68\x6c\x75\x3f\xac\xf2" - "\xa8\x58\xa9\x87\x47\x28\xf9\xee\xa3\xf7\xcc\xbd\xd1\x44\x78\x6b" - "\x0e\x8d\x69\xa3\x4c\xe5\xd3\x90\x8c\x39\xf1\xbd\x3c\xde\x3f\x2f" - "\x7a\x96\xac\xe1\xad\x73\x0d\xce\x9f\x52\x12\x7f\xe7\x9c\x7f\x45" - "\xff\x10\xad\x63\xf2\x28\x93\xf7\x1f\xd8\xef\xc1\xb6\x46\xe6\x9f" - "\x30\xa2\x90\x32\xa3\x61\x4f\x51\x8e\x51\x77\xdb\xa6\x2e\x79\x6a" - "\xe9\xb3\xf9\xf3\x0b\x16\x3f\xb9\x38\x6f\x71\xc1\x2a\x19\x42\x61" - "\x94\xfc\x77\xdf\xc8\x05\x73\xe4\xa6\x73\x94\x7e\x31\xa2\x67\x3d" - "\xee\xbd\x8b\x21\x5e\x3f\xb8\x2a\x7c\xbd\x27\xe5\x5f\x25\x74\xa9" - "\x4a\xe9\xbb\xb3\xdb\xec\x33\xd4\x35\xc9\x35\x71\xa4\x6d\xd2\x7c" - "\x6c\x4e\x6b\xf9\x22\x9b\x86\x78\x40\xc7\xe3\x4f\xd1\x6f\x42\xbc" - "\x1f\x82\xb1\x4a\xf3\x16\x9e\x61\x5b\x72\x3c\xaf\xf1\x37\xf0\x5a" - "\xc6\x32\xce\xbf\x7b\x2d\xfb\x30\xb0\x3f\x14\xe8\x70\xc7\x29\xed" - "\x59\xfb\x66\xfa\xd6\xd0\x52\xeb\x8e\xd0\x79\xeb\xbb\x42\xe4\xbc" - "\x25\x96\xda\xb7\x8a\xf3\xf6\xb7\xa2\xe2\xbf\xf5\x45\xf9\x97\xc1" - "\x27\xdf\xc1\x6f\x88\x28\xde\xbf\x13\xfc\x37\xec\x0c\xed\x7e\x87" - "\xdb\x30\xdd\x2e\xce\xf7\xc4\x42\xd8\xbd\x0f\xcf\x5d\xf8\x45\x44" - "\xf1\x81\x23\x51\xfb\x6b\xfc\xee\x53\xce\x9f\xbf\x88\x7d\xc2\x76" - "\x9f\xe5\x76\x89\x8d\x07\xfe\xcd\xef\xb4\x27\x21\x7f\x58\xb5\xf3" - "\xfd\x64\xef\x86\x46\xb2\x3d\x29\xef\xcd\x9e\xa7\x59\x9f\x7b\xff" - "\xa7\xc2\xe8\x14\xbc\x07\xe7\x6d\x0d\x91\x3a\xaf\xf6\x9e\x83\x7d" - "\x10\xaa\xa0\x6f\x57\x0e\xa4\xb4\xb2\x81\x94\xda\xe1\x7e\x7f\x6c" - "\xb7\xff\x85\x59\xcd\xb7\x3c\xe7\x71\xec\x6c\xc8\xa3\x0e\x9e\x3f" - "\xb9\x1d\x4c\xc3\x80\x39\x8f\xf7\xe7\xd4\xf9\xa8\xf7\xf3\xa0\x5b" - "\x5a\xaf\x5e\x1e\xbf\x2f\xbf\xa7\x32\x66\x13\xcd\xe3\x35\x6d\xde" - "\x77\xe6\xd8\xd2\xe0\x57\xb3\xb2\x37\x7e\x73\x42\xee\xab\x43\xa6" - "\xf0\x7e\x49\x75\x11\xf4\x04\xf3\xb1\x54\xd6\x6f\x42\x6e\x72\xf1" - "\xde\x66\xe4\xd2\xd9\xdd\xbc\x1f\x2d\xcf\x16\xca\x98\xec\xc7\xa8" - "\xfa\x22\x99\x5a\xe8\x7d\xfe\x56\x77\x5a\x0f\x5e\x7f\xf3\x5d\x86" - "\x21\x36\xee\xcb\xb2\x14\x1a\x8b\x19\x46\xe4\xd2\xb9\x71\x7a\x39" - "\xe0\xae\x1f\x97\x03\x1d\xdc\x20\xcb\x71\x5e\x19\x13\x25\x6d\xae" - "\x30\x77\xcd\x92\x75\xaa\xe7\x59\x02\x7c\x18\xba\x14\xde\x8d\xfb" - "\x39\x8c\x27\x5c\x73\xe4\xda\x2f\xec\x75\x19\x8b\xc7\xfc\x89\xcf" - "\xeb\xfb\x9b\x47\xb6\x87\x7d\x71\x0b\x20\xb3\xa4\x3e\xf8\x9b\xe7" - "\xaa\x3e\x27\x53\xfe\xd3\x3c\x7e\xbf\x95\xeb\xfe\xa0\xa7\x9d\xaa" - "\x7d\xbf\xed\xd3\xbe\xf1\xb0\xab\xdd\x1c\x4a\x0b\x18\xcd\x54\x6b" - "\x0d\xb2\xac\xf4\xd4\x5a\x3b\x61\x53\xfc\xa6\xde\x67\xdc\xbb\x5b" - "\xe9\x22\xaa\x1c\xef\x13\x43\x4f\x6d\x4d\xb2\xa6\x39\xf1\xbe\x4d" - "\xf7\xbb\x80\x4e\xda\xba\x19\xef\x80\xdb\x3a\xc6\x9b\x8f\x76\x67" - "\x35\xe6\xa9\xb3\x19\x78\xee\xcb\xe7\xed\x25\xae\xd7\x3f\xd3\x6a" - "\x59\xe7\xe1\xf3\x9f\xe3\x2c\xa1\x2c\x23\xef\x03\xf3\xb9\x7f\x8e" - "\x85\xc0\x67\xff\x79\x2d\x4f\x7b\x9f\x19\xf7\x7e\x94\xfe\xbe\xc3" - "\xfd\xdb\x05\xfa\x99\x7d\x8e\xa9\xc4\x3e\x06\x61\xcd\x57\x50\xc6" - "\x1a\xba\xa0\xf6\x51\xd9\x57\x90\xd7\x11\xf9\xcc\x23\xef\x75\xa2" - "\x5c\x65\xb7\xef\xa6\x3c\xeb\xf3\xdb\x5d\xba\x6f\x14\xee\xf7\x76" - "\xfb\xf5\x00\x17\xed\xc5\x21\x73\x20\x75\x88\x27\x50\xdc\x05\xfd" - "\xf3\xb7\xc7\x21\x0f\x7b\x8d\x45\x24\x6d\x3f\x8e\xc9\xfc\x3c\x19" - "\x23\x29\xc7\xc6\x71\x8c\x8e\xda\x00\x69\xbe\xff\x7b\xee\xd2\xce" - "\xc4\x27\x9d\xa3\xdf\xfe\xa3\x67\xcf\x31\xac\xad\x97\xed\x99\xab" - "\xf4\xb5\x3d\x73\xe5\x7a\xd9\xc6\x2e\xff\xdb\xab\x83\xc6\xdd\xab" - "\x7d\x46\x75\xf6\x61\xcf\x2c\x1f\xd5\x6c\xd0\xfd\x56\x90\x2f\xad" - "\xb7\xd8\x6b\xa2\xb8\x29\x55\xc1\xfc\x40\xae\x27\xf6\xd8\x3f\x1f" - "\x48\xdf\x20\xde\x1f\x8c\xf0\x5c\x99\xf2\x1f\xd2\x6f\xd2\x9b\x7f" - "\x81\xd7\xcd\xfa\x2a\x5b\xec\x03\xed\x5b\x52\xd2\xd7\x73\xd0\x99" - "\xd8\xe7\x81\xfc\xac\x70\xb6\xc7\xa7\xaf\xc1\x6f\x31\x46\x38\x2e" - "\xb7\x70\x6e\x17\x01\x6f\x7e\x80\xa0\x87\xf9\xbd\x98\x7b\x51\x87" - "\xc8\x5f\xc6\x71\xf3\x3f\xb8\x8e\x71\xaf\x78\xea\x83\x12\xd9\x26" - "\xf7\x3d\xc2\xc9\xfa\xa7\xbf\x4d\xda\x41\xc8\x77\x2d\xf2\x4d\xac" - "\x2b\x6c\x63\x3f\x16\xe2\x98\x87\x2d\x5a\xdd\xfe\xe4\xa6\xd4\x6f" - "\xa4\xd2\xbc\x0e\xf7\x07\xd0\xff\x5f\xcc\xba\x7a\x3e\xff\x60\xce" - "\x95\x74\x11\x35\x37\x66\x51\x6f\xf6\x0c\xdb\xab\xb7\xa3\xfe\xe9" - "\x82\xdb\xff\xbb\x89\x21\x63\x90\xba\x8c\xfd\xc4\x37\x5d\x0e\xc8" - "\x81\x7e\x22\xbc\x1a\xe3\xd5\x6e\x85\xbe\x5b\x4f\x8d\xa1\x3a\xe9" - "\x23\x02\x1e\xb6\x14\x05\xc4\x05\x6f\x68\x8f\xf4\xef\x55\xe7\xe0" - "\x7f\xf7\x5d\x6f\xe8\x20\x35\xe6\xfb\xc9\xb3\xec\xcf\x98\xb3\x7e" - "\x37\x92\xdb\x75\x7b\xbe\x8b\x46\x9f\xe3\xf7\x1f\xb4\xa8\x79\xf2" - "\x77\x59\xda\x35\x8d\x63\x63\x46\xb7\xe9\xbe\xe7\x97\x3c\x55\xb0" - "\x78\xe9\x92\xd1\xd3\x16\xae\x58\x98\x67\x7b\x48\xb9\xdc\xc5\xcc" - "\x5f\xe6\x9e\xf8\xdf\x1f\xa6\xf2\x9c\xc2\xba\x0a\xc7\x01\xbf\x52" - "\x0c\x70\x3d\xfe\x37\xf4\x86\x11\xbc\xbe\xf7\x7f\x19\x03\x5c\xd7" - "\x45\x38\xfe\x77\xcf\x5a\xf7\x87\xf5\xdd\x3c\x10\x39\xd4\xc1\xcf" - "\x7c\xf6\x33\xe2\xfe\xdd\x34\xe6\xa3\x2a\xe9\x9f\xf6\x61\x76\x74" - "\xac\x24\xf6\xc5\xe3\xf5\x11\xa4\xcf\xd5\xcf\xd9\x82\x16\x31\x6f" - "\x7c\x98\xd7\x73\xee\xe7\x43\x07\xc6\x7b\xaf\xe2\x5f\x99\xb7\x58" - "\xdf\x13\xd6\xbe\xbb\x26\xf7\xb0\x23\xee\xae\x2c\xb5\x0e\xf3\xe1" - "\xe6\xaa\x48\x3f\xb3\xda\x03\xf8\x70\x8f\x7e\xa6\x4c\xf1\xe6\x21" - "\x8d\x37\x3f\xac\xbf\xd2\xbe\x7d\x0f\x6f\xec\x35\xf7\xf0\xf5\x5f" - "\xb5\xb2\x7b\xcd\x5f\xb6\xe7\xaf\xe9\xc3\xd7\x9d\xa1\xfd\x37\xf0" - "\xda\x0c\xee\xbf\x8e\xfb\x3e\x72\xae\x95\xfe\xf5\xfb\x3e\xd3\xee" - "\x51\xc7\xbe\xa3\xda\xfd\xd7\x70\xff\xbe\x76\x3f\x14\xf7\x6f\x6a" - "\xf7\xe0\xd9\x7d\xeb\xb4\xfb\x74\xdc\x2f\xd6\xee\x21\xf3\xf7\x3d" - "\xa8\xdd\x0f\xc6\xfd\x77\xb5\xfb\xeb\x71\x3f\x5c\xbb\x07\x0f\xee" - "\x4b\xd6\xf6\x4f\xcd\x68\xfb\xc5\xab\xd7\xcf\xf7\x7a\xd4\x1e\xdd" - "\x3e\xe8\x89\xef\xed\x50\x73\x46\x77\x5a\x3a\x68\x7a\x81\x8e\x5f" - "\xa4\xf3\xdc\x68\x46\xfa\x28\x1f\xbd\xd3\x12\x95\xbe\x53\xcb\x9f" - "\x8d\xf9\xc6\x17\x95\x5e\xa9\xa5\xcf\x85\x0e\x6a\x8e\x4a\x2f\xd3" - "\xd2\x0b\x20\x17\xed\x51\xe9\x5a\x5c\x87\x7d\x9b\x7c\xb4\xdd\x1a" - "\x95\xee\xd0\xd2\x77\xe8\xfe\x0a\x5a\x7a\x9e\x96\x5e\x83\xf4\x23" - "\x51\xe9\xf3\xb4\x74\xc8\xff\x0f\x9b\xa3\xd2\xd5\xba\x82\x3c\x8b" - "\x66\x11\xb5\x85\xcc\x5b\xfb\x82\x3e\xda\xb6\x37\x2a\xcf\x14\x55" - "\x76\x7f\x9a\x8f\x2a\xa3\xfb\x32\x5e\x4b\xcf\xf0\xd1\xdf\xb7\x47" - "\xa5\x67\xf6\x26\xab\x0c\x15\x34\xaf\xb7\x35\x4c\xfe\x4e\x95\xf4" - "\x93\x94\xba\xe5\x81\x85\x7c\x4e\xcd\xb2\x4d\x9c\xb2\x15\x09\x71" - "\x8a\x0e\x4c\x53\xfe\x81\x47\x79\xee\x68\x53\xe7\xfd\x0e\x8c\x95" - "\x67\xc0\xd8\xe7\x9c\xcf\x00\xae\xe6\xb4\xfd\x32\xf6\xc9\x18\x87" - "\x4b\xc5\xe4\x54\xfe\xa7\x6d\xd2\x96\xd7\xf6\x39\x91\xe7\x33\x5e" - "\xdb\x64\x38\xbc\xde\xe7\x2d\xe8\x94\x3e\x91\x6c\x4b\x71\x1a\xdb" - "\xb4\xf2\x5c\x58\x94\x4d\xa5\xe4\xfe\x81\x85\x11\x3e\xb7\xef\x56" - "\x76\x3f\xf3\x22\xe7\x67\xdf\x9c\xe8\xbc\x3e\x3a\x20\x6d\xd3\x24" - "\xeb\xb5\x9f\x74\xb8\x0f\x64\xf7\x9c\x55\xda\x5f\xa9\xa5\x9f\x40" - "\xfa\xdc\xa8\xf4\xe2\xde\x65\x3b\xe4\x9d\x79\x5f\x71\xd7\x25\x11" - "\x08\x5d\x12\xc1\x2d\xff\x89\x76\x2f\x92\xe7\x6e\x6e\x0c\x17\xef" - "\xab\xd0\x62\x60\x7c\x16\x5a\x21\xfc\x90\xd9\xfc\x8d\x89\x6b\x66" - "\x04\xfc\x34\x23\xbf\x43\x6c\x7e\x92\xfd\xec\x2e\xca\x78\x50\xce" - "\x36\x8e\xbf\xcd\xbe\x5b\x01\xde\x1f\x4a\x6d\xc4\x1c\x57\xb5\x88" - "\xdf\x7f\x4a\xd3\xed\x7e\x6a\xb0\x87\xa9\x0a\xb0\xb7\x3d\xa9\xfb" - "\x4d\x1e\xe8\x8e\xff\xc3\x6d\xe0\xfa\x9c\xf2\x5b\x31\x35\xa3\xb9" - "\xad\xfc\x2d\x3c\xb1\xf9\x7a\xbf\xf8\x03\xeb\xb2\x5d\xfc\x0d\x44" - "\x1b\xe6\xf6\x71\xb8\x27\xf9\xe3\x77\x48\xef\xad\x4f\x8a\x97\x6b" - "\x34\x7f\xcc\xfd\x66\x25\x2f\x6a\x0a\xc4\xbf\xf0\xb9\xa3\x1a\x07" - "\xca\xb6\xfa\x93\xbb\x12\xfa\x5f\xad\xdd\x46\xc6\xae\x8d\xd0\x4d" - "\xce\xed\x35\x2a\xf9\x74\x70\x41\xc4\x68\x5e\xc7\xeb\x8a\xf2\x3b" - "\x11\x1b\x8f\x4d\xd9\xb5\x24\x68\x6c\x58\xdd\x42\x6b\xae\x27\xeb" - "\xdc\x20\xfb\x92\xd7\x7c\x3e\xa0\x80\x63\x71\x75\xf9\xa1\x87\x1a" - "\x7f\x8b\xf7\xbf\x5f\xb2\xd7\x18\x92\xfa\xca\xc1\x05\x72\x2d\xaa" - "\xf8\xd8\x30\x9e\x43\xbc\xcd\x61\x3e\x7b\x24\xf5\x64\xc8\x7f\x73" - "\x78\xa5\x7d\x60\x68\xb9\xfd\x9a\x6d\xcb\x28\x35\xbc\x3c\x23\xfd" - "\xd5\x4b\x34\x4e\x9f\x7f\x60\xc3\x66\x8a\x0e\x6b\x4a\x29\xe6\x14" - "\xb6\x71\x07\x18\xd2\xe4\x9e\x1b\xdf\x47\x8c\x6f\x8f\xa8\x5a\x71" - "\xe5\x6f\xde\x84\x61\xdb\x72\xec\x69\x6e\x4b\xa2\xbe\x6e\x7a\x0b" - "\xf6\xb2\x76\x4e\xb6\xe8\x73\x1a\x0c\xbb\xc5\x38\xe0\xa2\xf0\x9c" - "\xc9\x23\x23\x7f\x27\xa4\x68\xa1\x5c\x47\xea\xd3\x60\x0f\x91\xd7" - "\xf1\x17\x2a\x5a\xc6\x63\x74\x70\x1f\xeb\x69\xec\x37\x89\xfc\x69" - "\x67\xe8\xe0\x51\x4b\x10\x73\x46\x10\xba\xf4\xd3\x6c\x13\x1e\xfc" - "\x34\x20\x63\xdf\xfe\xde\xc6\xbe\xe3\xff\x1f\x7b\xdf\x03\x17\x65" - "\x95\xee\x7f\x66\x18\x75\xd0\xe1\x8f\x46\x39\x1a\xda\x54\xba\x4d" - "\x2d\x16\xb6\xd6\xb5\x5d\xdb\xa8\x74\xd7\x6d\x35\xac\x6b\xbf\xcb" - "\xae\x96\x98\x60\x68\xa8\x23\x12\x91\x21\x20\x12\x3f\x30\x06\xe9" - "\xae\xdb\x45\x18\xfe\x74\xc5\x7b\x69\xd7\x36\xb7\x9f\x7b\xd7\xf6" - "\x97\x85\x89\x1b\x12\x30\x68\x58\x68\x98\x13\x21\xa1\x8b\x36\xc2" - "\x20\x23\xcc\xbc\xe7\xf7\x3c\xe7\xbc\x2f\x33\x03\x0c\x0c\x03\x9a" - "\xfd\x56\x3e\x9f\xf7\x33\xbc\xe7\x3d\xef\x79\xcf\x79\x9e\xef\x79" - "\x9e\xe7\xfc\x7b\x9e\xf2\xb8\xc7\x30\xed\x4a\xca\x59\xb6\x47\x82" - "\xf0\xbe\x75\xb0\x1e\xef\x53\xf0\xdc\xee\x78\xe3\xfc\x3f\x75\x5b" - "\xc7\xf0\xb9\x8a\x83\x27\x38\xcf\x7a\x4c\x7c\xfc\x75\xb0\xde\x1d" - "\x76\x85\xcc\x83\x65\x14\x7d\xa3\x1b\x6c\xe4\x49\x0b\x35\xb1\xf5" - "\x4c\xf4\x57\x90\xf8\x48\x39\xbd\x9c\x4b\xf8\x19\xbb\x0f\x77\x09" - "\x59\x07\xcb\xb8\xbf\xca\x0f\xdf\x20\x7c\x2f\x12\xe8\xc8\x83\x07" - "\xf8\x5c\xee\xc1\x4a\x3e\xb7\x79\xb0\x61\xdb\x54\xdc\xab\xfc\x61" - "\x5e\x87\xef\xc1\x56\xf8\x8d\xed\x18\xff\x59\xb9\x7b\x7d\xf4\xb7" - "\x06\xcd\x74\x12\x84\x73\xea\xb8\xef\xb8\x98\xef\x37\x86\x6f\x7c" - "\x64\xa0\x59\xec\xd9\x6d\x4d\x3a\xe2\xc3\xc7\x7b\x1f\x9e\xbb\xcf" - "\x40\x34\x50\x57\x3f\xaa\x3c\x98\xc9\xf6\x78\x65\x1e\xcc\x33\xb6" - "\xd1\x72\xdc\x5b\xc8\xd7\x3e\x3e\x2a\xa3\xbe\x07\x33\x79\xfe\x8f" - "\x1e\xaa\x6d\x83\x36\x28\x0f\x46\x18\xad\x17\x44\x9b\xf0\x23\xc0" - "\xfe\xc1\x08\x9a\x79\x30\x86\x9f\x7f\xff\x28\x4b\x92\xab\x1c\xa3" - "\x1f\x6d\x11\xb1\xde\xc0\xe9\xf6\x51\x99\xa8\xaf\x6e\xc3\xff\x41" - "\x77\x87\xf2\xb5\xfa\x8f\xe2\x25\x1b\xd9\x24\xe6\xc1\x77\xe0\xff" - "\x08\x2e\x6b\x3f\xda\x09\x6d\x17\xcf\x30\x7c\xc4\xd6\x0b\xa1\x7d" - "\xa0\xb3\x3e\xac\xc3\x76\xb9\x93\xad\x8c\x16\x49\xc4\x07\xea\x9c" - "\x88\x7b\x4a\xd1\x4e\x31\x5a\x1e\x29\xe7\xb1\x2c\x0f\xcd\x66\xe7" - "\x80\xe1\x3b\xc0\x1f\x39\xca\x4d\x3c\xb7\x8c\xe5\x39\xea\x5f\x7e" - "\xb3\x54\x17\xfc\x1e\x3e\x83\xb6\xe2\xfe\x1e\xa4\x55\x0c\xe6\x41" - "\xbe\xb6\xe8\x70\x8e\xa3\x13\x68\x86\xfb\x85\x0e\x85\x21\x4d\x38" - "\xcd\x0e\xf5\xc6\x3c\xe7\xf4\x3a\x34\xd1\x95\x1e\xfc\x5e\x50\x82" - "\x6c\x88\xc3\x7d\x23\x87\xc2\x44\xfa\xb5\x89\xdf\x67\x71\x38\xf9" - "\xb3\xf2\x3d\x4e\xef\x4e\xeb\xcd\xcb\xe3\xa6\xca\x71\x0d\x16\xe7" - "\xe4\x39\x5e\xcb\xeb\x9c\xde\xab\x5b\x71\x09\x6d\xe4\xf7\x23\x30" - "\xce\x25\xd2\xbc\x2b\xad\xbc\xd9\x41\x6f\x5e\xce\x00\xdf\x98\x2e" - "\x7d\xc3\x44\xca\x4b\xa5\x7a\xc2\xff\xa2\x0e\x3e\xa4\x75\xf0\xa4" - "\x7c\xa1\xf4\x5e\x11\x3b\x4b\xf4\x91\x05\xcf\x40\x0e\x28\x07\x71" - "\xed\x07\xa8\x52\x6b\x7b\xa4\x9c\xe1\x91\x1c\x2a\xc1\x3d\xb1\x40" - "\xd7\x44\x8e\xa1\x43\xe9\x5c\x17\x1e\x2a\xc1\x32\x71\x5d\x85\xfb" - "\x3b\x3d\x94\x07\xe5\x8a\xb1\xba\x0f\xed\x15\xeb\x00\xe3\xbf\x0f" - "\x4b\xfb\x8e\xeb\x1e\x5b\x19\xc5\x0e\xfb\xce\x7a\x49\xd7\xf7\x5c" - "\x91\xd2\x71\xae\xf3\x50\xab\xd3\xb9\xd8\x50\x4e\xef\x8f\xe7\xc0" - "\x38\x75\x7f\x0e\xf7\x8b\x7b\x20\x07\x78\x96\xd2\x49\xa6\x62\x7c" - "\x98\x64\x1d\x3d\x5f\xab\x83\xb1\xb5\xb2\x2a\x0a\xe4\x45\x4c\x72" - "\x27\x19\x8f\x7b\x2e\x50\xde\xe0\x7c\x0f\xf5\x85\xf4\xac\xaa\x18" - "\xc7\xd9\xbb\x0a\x13\x8c\x6d\xcb\xf4\x30\x96\x4d\xb9\x40\xa6\xf2" - "\x3d\x14\x1f\x6f\x14\xe7\x7d\xf2\x85\xcc\xaa\x58\x3c\xd7\x59\x0b" - "\x23\x42\x9a\x12\x93\x2f\x64\x55\xc5\x42\xb9\x49\x29\xeb\xc8\x24" - "\xd4\x6f\xb8\x57\x97\x63\xa6\xa2\x1c\xca\x4d\x42\x9f\x6b\x02\x8d" - "\x90\xc1\xf7\xcb\x05\x65\x9d\x52\x2f\x10\xb6\x47\x1c\x70\x26\x6f" - "\x22\x1f\x1f\x82\xef\x97\x63\xdc\x4a\x9c\xf3\x31\x5a\xad\xe8\x17" - "\xa2\x1c\x9e\xf9\xc3\x33\x9c\xef\x11\xd0\xff\x1a\xfa\x73\x87\xf2" - "\xd5\x58\x3e\x7c\xab\x9c\xd7\x9d\xf9\x45\x29\x6f\x22\x87\x6f\xc7" - "\x3c\x92\x5f\x37\x21\x25\xc2\x07\x9f\xe3\x39\x61\x3b\xc6\x45\x00" - "\xeb\x9c\xbf\xd3\xd0\xfb\x8e\x68\x3f\x43\x5f\xae\x78\x9f\x6e\xff" - "\xac\x01\xf2\x1e\xc0\x3d\xa9\xdc\x96\xad\xd8\x2f\xf6\x75\xb0\x8f" - "\x2b\xfe\x22\xfe\xaf\xea\xcd\x9b\x12\x41\x92\xaf\x10\x35\x5b\x57" - "\x7d\xd9\x07\x64\x6f\x85\x0a\x63\x2c\x38\x95\xf9\x35\x96\x97\x8d" - "\xfe\xe2\xa2\x89\x0a\xe4\xf2\x04\xa8\x37\xc6\x47\xf9\x1a\xe7\x6a" - "\x45\xda\x98\x80\x4f\xfb\x76\x70\x9f\x80\xfb\xf5\x80\xfd\xe4\x2d" - "\x60\x0f\x6c\x21\xaa\x2d\x76\x12\x8c\xed\x04\xbe\xb5\xe2\xbe\x6a" - "\x1c\xbb\x21\x6d\x44\x1e\x36\x42\x5b\x9a\xb7\xc4\xd0\xe6\x2d\x6d" - "\xb4\xb5\x26\xa6\x81\x80\x9e\x99\x54\xab\xab\x43\xdf\xe4\x5f\x63" - "\x5b\x71\x8e\x12\x68\xda\x68\xc2\x6f\x64\x55\x35\xe3\x59\x19\x36" - "\x4f\x20\x3f\x74\x40\x3a\x57\x54\xc4\xce\x1e\x55\x84\xf6\xce\x7d" - "\x25\xd0\x0a\xb1\x2e\x95\x02\xfe\x9f\xc0\xce\x27\x8e\xc7\xf1\x0f" - "\xce\x69\xac\x78\xa5\xa4\xf7\x8c\x06\x9f\x1b\xa8\x88\x75\xf2\xcb" - "\xc5\xde\xc5\x39\x02\x7c\x37\xdc\x46\x3b\x77\x88\x79\xf1\xdd\xf0" - "\x57\x56\x50\x7c\x17\xde\x29\xe9\x7d\xc7\xe5\x8c\xcf\x61\x6e\x57" - "\x00\x6d\xf1\x7f\x33\xd0\x52\xdc\x43\xa5\xe1\xeb\xdf\x15\x0d\xd2" - "\x9a\xb3\x89\x7c\x9c\x8b\x78\x1a\xd8\x9f\xf8\x11\xe2\xea\x23\xe9" - "\x48\x1d\xfa\x6f\x82\x74\xb5\xe4\xcb\x08\xfe\x9f\x01\x65\x71\x3b" - "\xdb\xc9\x47\x59\x8e\x93\xbf\xc3\x14\x33\xfd\x06\x71\x02\x72\xc5" - "\xe7\x3c\x39\xa2\xa3\x59\x75\x4a\x7e\x4e\xea\xc8\x21\xac\x67\x13" - "\x39\x82\xbe\x14\x02\xb8\x2f\x85\x23\x5b\x45\xf9\x61\x0d\xb7\xdb" - "\x02\x4c\xf0\x4d\x3c\xf3\xe3\x74\x9f\x08\xf2\x24\x10\xf2\xfd\x99" - "\xfb\x03\x3c\xa2\xeb\x93\x1f\x9f\xa7\xf6\xb9\x0f\xeb\x73\xaf\xb1" - "\x40\xbf\x71\xb7\xb6\xae\x9f\xca\xe6\x0f\x83\xfd\xb7\x12\x5d\xca" - "\x39\xe2\x03\x58\x39\x8b\x75\xab\x6d\x6d\xc3\x36\x05\xd0\xb4\x50" - "\x82\x73\xa0\xcc\xb6\x04\x9d\xde\x34\x03\xf2\x9c\x23\xb7\xe0\xbe" - "\x6f\x8c\x91\x02\xf9\xcf\x73\x3f\xe6\x9f\xfc\x66\xf9\x4b\xe3\x89" - "\xf0\x42\xc4\x04\x2a\x7f\x2a\x0f\xd7\xf6\xde\xe9\x36\x8d\xc1\x75" - "\xae\xe4\x5d\x04\x6d\xad\x5b\x00\x63\xcd\x18\x8f\x0e\xde\x69\xdb" - "\xdd\xdd\x3a\xc6\x68\x3b\x45\x74\x6b\x89\xfc\x3c\xf9\x64\x91\x22" - "\x89\x28\x76\xb4\x90\x40\xe0\xab\xed\xb0\x6d\x6e\xaf\x2f\x04\xc3" - "\x24\x7e\x8e\xdb\x00\xf2\x75\x93\x9a\x5a\xbb\xd2\xfe\x5e\x06\x63" - "\xaf\x9d\xd2\x18\x3b\x9b\xc7\x41\x51\xc0\xf7\x6f\x96\x8b\x7e\x1f" - "\x38\x6d\xff\x7e\x96\x9f\xb3\x0a\x7a\x01\xde\x69\x74\xd8\xdf\x9f" - "\xf0\x58\xe3\x99\x75\x21\x5c\xf6\x7d\x12\x73\x18\x2c\xf8\x74\xbe" - "\x47\x21\xa8\x2b\xed\x13\x65\xef\x1e\x05\x36\x6f\xf5\x49\x0c\xf0" - "\x30\x84\xdb\xe6\x75\x21\x2b\xec\x4a\xb1\x0f\x62\xfa\xfb\x11\xf8" - "\x2e\xbc\x17\x60\x61\x73\x4c\x9f\xcc\x77\x60\xed\x13\x15\xca\x7c" - "\x68\x93\xca\x44\xfe\x9e\x8a\xed\x42\x9a\x40\x3e\x05\xdc\xa7\x1f" - "\x2e\x75\xe3\x17\x56\xf9\x37\xa5\x0d\xe7\x40\x32\x7b\x5a\x01\x4f" - "\x17\x80\x07\x37\xa1\xef\x27\x23\x7c\xa7\xa6\xa8\x9b\xd4\xa8\x3b" - "\x48\x2d\xfc\x8f\x7b\x91\xcb\xd7\x7e\x43\x9a\x35\x03\xeb\x1b\xd0" - "\x59\x99\x50\xe7\x3c\x2c\x0b\x65\x01\xee\xdf\x32\x26\x81\xfe\x31" - "\x43\x59\xcd\x84\x95\x51\x23\xb4\x92\x9a\x44\x18\x67\x65\x4f\x31" - "\xd7\x16\x9d\x22\xb5\xea\xcf\xd8\x77\xd0\x26\x2c\x8f\xeb\x18\xac" - "\xec\x32\x28\xfb\x80\x58\x76\x1b\x94\x1d\xe4\xb6\xec\xcc\x9e\xc0" - "\x61\x96\xed\x79\xbd\x33\x7b\xc8\x70\xca\x06\xd9\xa7\xc2\x38\x37" - "\x78\xae\x2b\x79\x0a\xf1\xb3\x5f\x46\xbf\x9f\xb7\x51\xbe\x1f\xf6" - "\xe8\xc3\xec\xec\x57\x1a\xdb\x6f\xac\x64\x67\xc0\x2e\x12\xb6\xa7" - "\x91\x9f\xfb\x3a\x4b\x70\x3f\x44\x57\xda\x51\xad\x63\xac\xd4\xbb" - "\x4e\x05\xb6\xea\xd1\x45\x7c\xdf\x63\x95\xb8\xee\x7b\x14\xfd\x46" - "\xba\x19\xe7\x7d\x3a\x87\xef\x9f\x3d\xfa\x9a\x34\xff\xd2\xe1\xfb" - "\xe9\x1c\xb1\x2c\x4d\xdf\x79\x3d\x29\x20\x6d\x74\x62\xbc\x14\xdb" - "\x36\x5e\x3c\x7e\xfa\x74\xf4\xaa\xe8\x35\x09\xd1\x51\x9a\xa5\x2f" - "\xc5\xad\x9f\xb5\x61\xf5\x6a\xcd\xe2\xe8\x4d\x9b\x56\xbe\x10\x3d" - "\x9e\x2c\x8d\x5b\xb9\x7e\xd3\x1a\x9c\x7b\xd3\x68\xe6\xff\x64\x45" - "\xcc\x86\xf8\x59\x3f\x9f\x1f\xda\x67\xee\x0d\xcf\x2a\x36\xa2\x0d" - "\x0e\xba\xe3\x96\x64\x3b\x99\x88\x7e\x7c\x02\x5e\xa1\xe5\xaf\xc2" - "\xf8\x0f\xf0\x77\x1e\xf5\x14\xea\x06\x1c\x1b\xa0\x0f\x41\x90\xdf" - "\xd5\x05\x6f\xd2\xba\x16\xf2\xa5\x1d\xec\xca\x86\x62\xee\x0f\xaf" - "\x11\xc6\xe4\x66\x1e\x6f\xf1\xcb\x93\xe8\xeb\xee\x75\x48\x33\xfb" - "\xd6\x85\xec\xf8\x8a\x28\x40\xaf\xc1\xb8\xa4\x2a\x8f\xca\xc7\xd1" - "\xec\x5b\x68\x05\xfd\x46\x4d\x44\x1f\xe2\x72\xa3\xc9\x8a\xeb\xf9" - "\xca\x70\x5b\x0a\x45\x79\xca\xfb\x56\xd5\x2e\x4e\x97\x83\x65\x7c" - "\x5f\xf1\x97\xef\xe3\x18\x66\x1b\x8b\x87\x59\x05\xfd\xff\xa0\xce" - "\x21\xa7\x3f\xab\x10\x6d\xc7\x06\xa0\xfb\xcb\x4d\x70\xcf\xfd\x8c" - "\x54\xd5\xbb\xee\xd5\xa8\x06\xbd\xfc\x45\x2b\xbf\xf0\x9d\x06\x25" - "\xbf\xf0\x7f\xe7\xeb\x4b\x03\xbf\xfa\xa6\x8f\xf4\x92\xbe\xef\xed" - "\xfb\xf5\x49\x83\x5f\x9e\x7c\x1f\x7f\xbf\xcf\xf6\x8f\xe4\xfd\xfa" - "\xf4\xc1\x2e\xc4\x1b\x60\xab\xf1\xf5\xaf\x88\x12\xf0\xb9\x53\xff" - "\x3c\x60\xfa\x34\x51\x27\xd9\x68\x73\xca\xb3\x24\x38\xf9\x1c\xc1" - "\x78\x84\xad\xf1\x89\xb4\x39\xf9\x32\xda\xa4\xf5\xcf\x00\x7e\x0f" - "\xe4\x34\x11\x95\xbe\x89\x04\xd6\xc6\x63\xac\x62\xf4\xf5\x05\x72" - "\xa6\x0d\x2e\xb8\xaf\x4e\xb0\x92\x4f\xcd\x97\x70\x7f\x53\x79\x6d" - "\x24\xc8\x9d\x46\x42\x10\xbf\xaa\x48\x12\x64\xb8\x85\x7e\x40\xd3" - "\x36\x80\x3e\xdb\x80\x71\x09\xeb\xdf\x15\xc2\xc6\xbc\xbb\xb9\x72" - "\x8c\xe6\x79\xd4\xf1\x35\xbf\x11\xb1\x79\x84\x9f\x29\xfa\x8c\x9d" - "\x67\x80\x7e\x52\xcf\xe7\xd5\xeb\x1f\xe5\xfa\xbc\x7e\xa2\x38\xdf" - "\x04\xff\x7f\xc6\x6c\x45\x68\xc7\x01\x8c\xdf\x8a\x65\xfe\x49\x38" - "\xc0\xe2\xb7\xbe\xbb\x39\x6c\x4c\xd2\x4a\x22\xaf\x35\x9d\x27\x18" - "\xdb\x09\x63\x81\x42\xbf\xdb\x0b\xfd\x6c\x5f\xe1\x2d\x34\x17\xea" - "\x97\x5d\x74\x0b\xcd\x84\x3a\x95\x75\xa5\xd5\x54\x82\xee\xf9\x40" - "\x5c\x77\x29\x87\x7e\xb1\x57\x0f\x79\xc2\x5f\x22\xb7\xe9\x21\x5f" - "\x0e\xe4\x43\x3b\x99\xd7\xef\x98\x1e\x68\xb0\x1f\xbe\x59\xa7\x79" - "\x0e\xef\x8d\x6c\xef\x0d\x7e\x1b\xda\xa1\x69\x22\x46\x35\xe8\x36" - "\x05\x7e\x43\xfa\x6e\x57\x5a\x2d\xc8\xbf\xca\x78\xb6\x76\x06\xe9" - "\xbc\x9c\xda\xa5\xbc\xbf\x56\x65\xef\x70\xc4\xd7\xcd\xd6\x6f\x06" - "\x9d\xde\xcd\x7c\x60\xa2\xdf\x35\x66\x63\x30\xbb\xc2\x4e\x02\xf8" - "\xfc\x00\xd8\x16\x31\x20\x07\xc0\x9e\x60\x7b\xa1\xc1\x96\x80\xba" - "\xec\xc4\x38\x8f\xf8\x1c\xc6\x6d\xfb\x41\x2f\xef\x43\x3b\xe0\xb9" - "\xce\x27\x08\xce\xb1\x63\x8c\xd6\x4d\xcb\xa9\x95\xc7\xcc\xa9\xdd" - "\x2f\xd9\x02\x28\x83\x50\xff\x83\x2d\xac\xe8\x01\x1e\x02\x06\x2a" - "\xc1\xb6\x98\x78\x9e\x69\x0e\x46\xfb\x4a\xa6\xf3\x13\x98\xcf\x66" - "\x1f\x2e\xa3\x6b\xed\xd0\x3e\x15\x7c\x03\x68\xd6\xc8\xe6\xc2\xb9" - "\x8c\x31\xaa\x24\x3d\x8e\x63\x5e\x13\x94\x41\x41\x96\x89\xcf\xa0" - "\xfd\x47\xa4\x58\x77\x60\x57\xd4\x7e\x20\xd2\xac\x9a\xaf\x21\x1b" - "\xd9\xd8\x1f\x6c\xae\x10\x91\x36\x95\x68\x57\x88\xef\xf6\xee\x7f" - "\xc4\x71\xb9\x00\x76\x05\xd2\x0b\xe9\x04\xe5\x54\x8a\x72\xac\x9e" - "\xdb\x2f\xc7\x5e\x12\xd7\x2d\x73\x81\xd7\xe9\x0e\xfa\x1b\xcb\x9c" - "\xe9\x0f\xef\x8b\xe3\xc6\x63\xb7\x3b\xf1\x0e\xc6\x46\x75\x56\x9c" - "\x27\x85\x3a\x7e\xc0\xe7\x78\x8c\x5f\xa3\xaf\x34\xf4\xcd\x0c\x34" - "\xfe\x20\x1b\xfd\x00\x83\x6c\xde\xf6\x15\xc1\xb5\x6f\xb0\x9f\xea" - "\xbe\xe6\xf6\x69\x5d\x2a\x62\x18\xee\xd9\x3c\x7c\x33\xd4\x0b\xcb" - "\x83\xfb\xa7\xe0\x17\xec\xd8\xba\x5f\x39\xc7\x53\x76\xc4\x52\xae" - "\x0b\x73\x9c\x47\x30\xc6\xf2\xf1\xb3\x31\x16\xe7\xc0\x58\xfe\x9e" - "\x18\xac\x5b\x23\xf6\x4b\xa9\xad\x18\x57\x19\xd2\xd1\xf6\x6f\x44" - "\xbe\x49\xe9\xe8\x43\x18\xf8\xa4\x82\x6f\x9d\x14\xeb\xb4\x1f\xee" - "\x95\x70\x3f\x83\xcd\xef\xf7\xb0\xf3\xe6\x8d\xfa\x64\xc7\x3b\xd8" - "\x6f\x00\xc3\x01\x90\xe7\x18\xfc\x52\x29\x2f\x8f\xbd\x5c\x17\xf1" - "\xbb\x6e\x9c\x03\xab\xd3\x49\xb1\x97\x31\xee\x32\xca\x0c\xfd\x73" - "\x2e\xb4\x47\xda\xec\x05\x5e\x31\xdc\x1d\xb6\x1d\x00\x7a\x1f\x03" - "\xfb\xff\x6f\x11\xbc\x5d\x75\x11\x62\xfd\xca\xb9\xff\x94\xa3\xb9" - "\xcc\xdf\x2f\x1b\x0f\x1d\x0b\xeb\x1d\x0f\xf5\xda\x96\x75\xcc\x8f" - "\x2d\x94\x55\x8d\xfc\x47\x3b\x11\xf2\xc5\xf4\x62\x8b\x9d\xf7\xad" - "\x6b\x45\xfb\x52\xac\x3f\xe2\xe5\xa8\x48\xbb\x5c\xe7\x7e\xe7\xdc" - "\xcf\xa1\x0c\x18\xff\x7f\xd2\x8b\x01\xa9\x5f\x73\x1c\x1c\x17\x63" - "\x3f\xf5\xb4\xa2\x0f\x5f\x28\xb7\x1c\x6d\x70\xae\x57\x8f\xef\x3f" - "\xdc\x68\xc3\x39\xf4\x7a\xb8\x87\xfe\x7d\x3c\xb7\x63\xfc\x67\xa6" - "\x74\x26\x37\x8e\x03\x7d\xee\x63\xb1\x4a\x90\x2e\x52\x7f\xdd\xf1" - "\x1c\x8e\xfd\x42\x79\x9f\x4d\x04\x34\x58\xdb\x88\xb8\xd7\x1f\xfa" - "\xec\x59\x5c\x3b\x3d\x0f\x18\x52\x62\xff\x05\xfe\xee\x45\x7f\xd3" - "\x40\xc7\xba\xf4\x37\x59\xbf\x55\x61\xbf\xed\x41\x1f\x12\xf0\x9d" - "\x8a\xc8\x30\x72\x38\xb1\x9c\xf5\x63\xf4\x1f\x52\x00\xb4\xc3\x38" - "\xc7\xf0\xed\x24\x69\x8f\x32\x62\x04\xfd\x85\x88\x38\xa9\xc0\xbe" - "\x2c\xd2\x4e\x01\xf9\x4a\xa5\xbe\xe7\xc4\x7f\x96\xa7\x4f\x7f\x0b" - "\xe0\xfd\xed\x78\xbd\x44\x6b\x1b\xeb\xc7\x75\x3a\x1b\xf4\x63\x67" - "\x9a\x22\x3d\x91\xae\x5d\x69\x9f\x41\xfb\x2b\xd5\x12\x4d\x1d\xf4" - "\xfc\x6c\xa3\xc8\xf3\x3a\x3e\xc7\xf4\xd9\x1c\x71\xfe\xa9\x97\x86" - "\x22\xfe\x50\x0f\x1c\xd8\x86\x6d\x07\xdd\x80\xdf\x47\x8c\x14\x88" - "\x32\xab\xc2\x8c\x18\xf9\x0c\xfa\xff\xbf\x6a\x1d\xb2\xa3\x2e\x9e" - "\x8d\x59\x80\x4f\x9c\x3f\x9f\x15\x32\x7f\x1b\x03\xc8\x0e\x13\x39" - "\xb6\xdc\x21\x9f\x3e\xdb\x2b\xd1\x41\xc2\xa4\xd4\xef\xa1\x8c\x2b" - "\xae\xf2\xe7\xb3\xd3\x50\xc6\x24\x94\x6f\x0e\x1b\xea\xb3\x36\x57" - "\xf9\xf6\x59\x3d\xca\x37\xc4\xb5\x2e\x01\xe7\xd8\xb8\xbe\x32\x91" - "\x9a\x24\x57\x99\x54\xb3\x91\xef\x0d\xe0\x36\x17\x62\x4b\xf7\x1c" - "\xcf\x8f\x3a\x0c\xf2\xb3\xb1\xb8\xa8\xf3\x2a\x50\xc7\x41\x5a\x8c" - "\x48\xaf\x46\xc8\x5f\x81\xe7\x26\xd1\x57\xc2\x84\x46\x3e\xd6\x03" - "\x39\xfd\x01\xfa\xef\x86\x7c\xda\x5a\xf8\x5a\x4f\x06\x97\xdd\x92" - "\xac\xa0\xab\x22\x26\xbc\xdc\x4a\x7c\x75\x3f\xa7\xdf\xb4\x90\x13" - "\x78\x9e\xd5\x8a\x3e\x24\xa1\x6c\x4d\x0b\xf9\xe2\x18\x7c\x37\x48" - "\xfc\x55\xc3\xef\xfb\xf0\x3b\x05\x7e\xdf\x82\xdf\x5b\xe1\x37\x0b" - "\xf2\x0b\x62\xfe\x50\xb8\xdf\x08\xe9\x3f\x11\x7f\xa1\x8e\x27\xd0" - "\xde\x5c\x22\xda\x8e\x98\xbe\x00\xef\xe1\xf7\x01\x91\xe7\xd5\x9c" - "\xe7\x27\x66\x41\x39\x89\x50\xff\x06\x63\x23\x2b\x4b\xd7\x42\x3e" - "\xef\xc4\xb2\xf1\x1c\x33\xfc\xff\xb6\x93\x0d\x0a\xe5\x9c\x38\x01" - "\xbf\x73\xe0\x77\x17\xfc\xc6\xc3\xef\x3a\x91\x06\x75\x28\x1b\xa2" - "\x12\x19\xcd\x33\x35\xdc\xde\x5d\x22\xf5\x79\xd4\xc3\x0e\xd9\x51" - "\x5b\x19\xb5\x9c\xf3\xdb\x44\x8e\x33\x1c\x40\xde\x47\x31\x2f\xfc" - "\x3e\x2e\xfe\x86\x89\xbf\x0b\xc4\xdf\x5f\x8a\xbf\xf3\xc5\xdf\x85" - "\x26\x72\x42\x27\xda\x18\x40\x97\x13\x3a\x6c\x37\xf4\x6d\xd1\x9f" - "\xda\xe7\xb9\x38\x46\x06\x39\xfe\x00\x94\xef\xd3\x95\xf6\xb9\x42" - "\x9a\x1f\xc5\x39\x9f\x9e\xb4\xa3\x7f\x2c\x60\xeb\xda\x9f\x07\x3b" - "\x64\x9b\xd1\xa6\x92\x85\x11\xb0\x81\x6e\x36\xc8\x69\xae\x58\x4e" - "\xbc\x5c\x5c\x17\x16\x63\x03\xf8\xa0\xbf\x3c\x36\x1e\xf2\xbb\x29" - "\x02\xfb\x2a\x9b\x3b\x46\xdf\x6e\xbe\x75\x04\x2e\x15\x8c\x0d\x02" - "\x25\xf9\x8d\xe3\x1e\x3e\x56\x1f\xf7\x19\x7c\x2b\xd3\x31\x56\xff" - "\x7c\x2e\x5f\x43\x9b\xbc\x11\xd2\x4b\x1c\xe9\x27\xf0\x3c\xc0\x03" - "\x40\xcf\x06\x68\xcf\x9c\x26\xf2\x39\xfa\xf0\xbf\xbf\x99\xb7\x39" - "\x54\x6a\xb3\xc8\x0f\x9d\x44\xdf\x66\x72\x22\x11\x64\x61\x1c\x62" - "\xb8\xa9\x57\xce\x9e\x60\xf3\xba\x22\x46\x80\x97\x27\x66\x23\x4f" - "\x9d\xfa\xa0\xb3\x0c\x0a\xea\x4a\xfb\x42\xeb\x2a\x53\x8c\x5a\x94" - "\x29\x88\x0d\x90\xdf\xc8\x6b\x65\x9f\xfe\x57\x8f\xfd\x8f\xf7\xbb" - "\x2f\xa2\x5c\xdf\xfd\xac\xde\xc6\xfb\x5d\x03\xe0\x0c\xf0\x59\x8f" - "\xf1\x21\x40\x0e\x7d\x31\x5f\xec\xd3\x0d\xd0\xa7\x1f\x80\xf4\x3a" - "\x5e\x57\x9e\x2e\x7e\x0b\x70\x56\x8f\xed\xbe\x55\x4a\x17\xdb\x8b" - "\xe5\xa0\xcf\xff\x29\x52\xba\x58\x3e\xe0\xb1\xfe\x00\xf6\x13\x29" - "\x5d\x6c\x13\xd8\x51\x5f\xd8\x24\x79\x92\xcd\xf1\x96\x2e\xbd\x87" - "\x7c\x43\xff\x58\x7c\x8e\xff\x0b\x3c\x5b\x51\x82\xfa\x61\xdb\x73" - "\x44\xf5\x72\x1e\xf1\xe3\xfd\xf2\x8b\x56\x57\x19\x79\xea\x28\x4d" - "\x0b\xb0\x51\xa5\xd1\x5a\x63\x9b\x23\xd9\xab\x86\xae\xb4\x86\x28" - "\x29\xce\xb7\x23\xce\x40\xc3\xae\x9a\x92\x5e\xfa\x42\x5d\x1a\x32" - "\xa5\xba\x38\xe9\x67\xc6\x03\xac\x1b\x96\xb5\x0d\xec\x75\x0b\xc8" - "\x05\x2e\xb7\x1b\x0e\x98\xc8\x04\xc9\xde\x65\x7a\x2b\x40\x46\x74" - "\x39\x09\x6c\x7d\x34\x00\x75\x23\xee\xf1\x11\x70\x1e\x2b\xd1\x4e" - "\x6a\x75\x30\x96\x4f\x3c\x4b\x56\xbc\x32\x1e\x7d\xaf\x44\x40\x5d" - "\xdf\x81\xba\x95\xda\x71\xee\x7f\x3d\x8e\x53\x4f\xad\xb4\x27\x50" - "\xab\x48\x33\xe8\x47\xa7\x16\x88\xb4\x45\xf9\x55\x8a\x32\x7d\x5b" - "\x32\x8f\x19\x84\x73\x39\xd8\x3f\x7e\x87\x7a\x4c\x4d\xad\x15\x06" - "\xec\x2b\x27\x17\x4a\x36\x29\xd4\xb7\x84\xdb\x84\xc7\xf7\x30\xdf" - "\x44\x60\x79\xf3\xb9\xc0\x93\x27\x78\xdb\x4f\x7e\xc0\xd7\xb9\x99" - "\x8f\x4c\xbc\x2f\xf3\x51\xdf\xf2\x05\xdf\x97\x75\xf4\xef\x7c\x4f" - "\xc9\xc9\xbc\xde\x3d\x25\x0e\x5b\xb1\x9c\xfb\x8d\x3a\xb9\xdf\xd1" - "\x27\x4e\xa6\xe3\x7b\xf0\xfe\x79\x48\xaf\x76\xa4\x1f\x2f\xe5\xf6" - "\x80\xd1\xe6\xbf\x35\x0c\xf7\x96\xdd\x8c\xbe\xb6\xf9\xf7\x4e\x85" - "\xb0\xef\xb3\x39\x0f\xa3\x4d\xea\xbf\x48\x67\xd4\xd9\xac\x0f\x43" - "\xff\xc5\x7e\xdc\x93\x55\x47\xe0\xe2\xfd\x96\xeb\xe6\x72\xd6\x6f" - "\x59\x9f\x3d\x35\xcf\xa9\x1e\x16\x36\xef\x85\xfc\x7c\x55\xad\x82" - "\x67\x11\xa0\x57\xeb\xc4\x67\x3c\xa6\xc4\x79\xe6\x23\xcf\x8c\x6b" - "\xdb\xb8\xd6\x89\x67\xb4\x02\x00\xdd\xe8\x13\x44\x5a\xab\x5e\xdc" - "\x96\x42\xed\xb8\xee\x74\x99\x5a\x72\x7b\x7d\xfd\x9f\x2a\x75\xf8" - "\xf7\x39\xa9\x10\xdb\x65\x85\x6f\x19\xf8\x5e\xb0\x86\x4e\x6e\x53" - "\x35\x58\x10\xa7\x46\xc0\x1e\xfc\xe6\xf1\xb8\xcc\xa7\x4c\x12\xf6" - "\xa0\x5f\x46\xb5\x90\x2f\x37\xee\xbc\x85\xe6\x01\x4f\xf3\xa0\x2f" - "\xc5\xc2\xfd\xb3\xf0\x1b\xc5\x7f\x65\x81\xf8\x2b\xf6\x91\xbc\xae" - "\xb4\x2f\x83\xa5\x78\xf4\x48\x1b\x8b\x6f\x4f\x24\xe2\x2c\x07\xe8" - "\x80\x58\x63\xeb\xc8\x50\x6f\xc4\x17\xe2\x0c\x31\x16\xb0\xf5\x09" - "\x86\x33\xe6\x7f\x20\x11\xf7\x20\x9f\x54\x20\xce\xa0\xac\x18\xc9" - "\xcf\xaf\x89\x7c\xa9\xe2\xeb\x39\x5f\x26\x49\x7b\x6e\x71\x2d\x29" - "\xfe\x76\x72\x33\x94\xab\xa9\xd0\x30\x5f\x9a\x67\x8c\xb6\x05\x04" - "\xf3\xe2\x3a\x1c\x97\x93\x93\x2b\xe0\x9d\x7d\x0e\x9a\x1b\x59\x6c" - "\xe6\xc3\xcb\xd9\x5c\xe4\x4d\xf0\xac\xda\x79\x9c\x61\x22\x55\x79" - "\x38\xd6\xc0\xbd\x7d\x77\x06\x11\x5c\x07\x06\x39\xf6\xa5\x59\xb2" - "\x6b\xef\x0b\xc2\xf5\xfc\xaa\xf9\x50\x3f\x1c\x43\xd7\xc1\xff\xa1" - "\x30\x96\xac\x74\x33\x67\x3c\x07\xe7\x7a\xc4\xf8\x3c\x8d\x38\x8f" - "\x85\xf1\x0c\x5a\xc8\x99\x8d\x35\xe8\x0b\x64\x43\x7f\x3f\xcf\xc9" - "\x89\xb4\x13\x7d\x3d\x6b\xe2\xc8\x4d\x4d\xe4\xcc\x52\x9c\x37\x4a" - "\xb9\x84\x73\x34\x8d\x89\xae\x73\x34\x8d\x95\xe2\x05\x23\xed\xd3" - "\x61\x4e\x57\x9d\xf8\xbb\x68\x88\xab\x55\xcc\x0b\x2d\xfd\x4a\xd4" - "\x29\x6a\xe8\x27\x8d\xbd\xf3\xbf\x88\x4b\xec\xdb\xb8\x8f\x03\xe7" - "\x9c\x64\x36\x82\xbe\x47\x80\x4f\x50\xef\x6d\xf7\x3c\x5d\xbe\x19" - "\x71\x74\x9a\x9d\x83\x42\x1f\xc4\xc3\xdb\x4b\x74\x9a\xf1\x93\xfb" - "\x03\x6d\xac\x83\x6f\x07\xed\xb8\x48\x14\xba\x38\x32\x0d\xe7\xbf" - "\x03\xec\xb4\x1c\xc7\xb8\xa2\x4f\xc1\xba\xf3\xe4\xf4\xb1\xf8\x2d" - "\x44\x0e\xcf\x6f\x83\xff\xcb\x25\x3b\x09\xde\x09\xf4\xb1\x92\x20" - "\xb4\x8f\x1e\xdf\x42\x6e\xeb\x4a\x3b\x6d\x90\x78\x85\x36\x04\xce" - "\xc3\x89\x73\x09\x50\xd7\x46\xb6\xc7\x19\xfd\xd4\x9b\x18\xdd\x98" - "\x1c\xc6\x32\x60\x0c\x7b\x3a\xd3\xc7\x42\x02\xb9\xee\x39\x0d\xf8" - "\x3f\x2a\xda\x8c\xa7\x4b\x01\xfb\xf5\x4e\xf5\xfc\x85\xd3\xff\x19" - "\xf8\x7e\x80\x05\xed\x33\x77\xf4\xf9\x6a\x96\x44\x1f\xdc\xaf\x1a" - "\x00\xe3\x04\xc6\x6f\x1b\x6d\x83\xba\x55\xeb\x36\x13\xe5\x79\x72" - "\x66\x5a\xf1\x9b\xec\x9c\x5d\x25\x9f\x9f\x3f\x33\x51\x1a\x87\xf3" - "\x7a\x7f\x75\x3a\x60\xab\x0f\xc1\x79\x75\xf4\x77\xc6\xf6\xfa\x7d" - "\xa7\x66\x73\xe9\x46\xdb\x3c\x52\x9e\xfc\x53\xcc\x23\xd9\x55\x8d" - "\x1d\x29\x6a\x72\x58\x3d\x0f\xfa\xf1\x57\x65\x26\xd9\x91\xb9\xc3" - "\xdf\x53\xf9\x55\x99\x48\xdf\x6a\xbe\x17\xe1\xab\x57\x50\x97\xe0" - "\xd8\x1f\xf4\x48\x05\xea\xe8\xae\xb4\x33\x0a\xa9\xdf\x80\xde\xa8" - "\x80\x77\x44\x7f\xd8\xb8\xfe\xfb\x55\x3c\xfa\x80\x60\xe3\x06\x9e" - "\x5f\xc5\xe7\xfc\xcf\xcc\xed\xb5\xa5\x21\x1f\xbe\xc7\xf7\xa8\x7d" - "\xb5\x68\x85\x5d\x06\x34\xfd\x6a\x11\xb6\x4d\xc4\x22\xe8\xab\x33" - "\x31\x8e\x7e\x7b\x9a\xc9\xe6\xc3\x6d\xce\xfd\xf2\x4c\xa6\x63\xbc" - "\xd9\x38\x6f\xd6\x4e\xa2\x19\xa8\x1f\xea\xfc\x51\x57\x9d\xb9\xb2" - "\x63\x07\x2d\xc9\x95\x0b\x8f\x6d\xcb\x21\x2a\x59\x36\x90\x0d\xfb" - "\x59\x42\xe4\xcd\x2d\xc4\xe4\x1b\xa0\x9a\xbc\xe4\xf1\xf8\x71\x34" - "\x59\x4d\xe4\xfa\xf6\x71\xca\xdb\xad\x93\x4b\xa8\xcf\x3d\x4f\x2f" - "\x8e\xb7\x12\xcd\xda\x5c\xf2\x6d\x2c\xf1\x79\xdc\x0e\xdf\x56\x11" - "\x9d\x89\x34\x05\xe1\x99\xd1\xc3\x2a\xb4\x3f\x9a\x82\xb0\xcc\x24" - "\x03\x51\x26\x35\xd3\xd6\xec\xd5\x63\x94\xa0\x0f\x02\x0b\x00\x63" - "\x13\x54\x93\x4b\x7a\xa0\x8c\x43\x91\xec\xbd\x01\xcf\x46\xf3\xba" - "\x99\x7e\x3f\x70\xdd\x74\xb7\x40\xdd\xf6\x0c\xaf\x6e\xdf\xec\x77" - "\xd4\xed\x9b\xfd\x23\xaf\xdb\xd7\xb3\x9d\xea\x16\xe8\xa8\x5b\x0c" - "\xd4\xed\xeb\x47\x87\x57\xb7\xb3\x4b\x1d\x75\x3b\xbb\xd4\xc3\xba" - "\xed\x1d\xa4\x6e\x35\x03\xd7\x2d\x71\x32\xd4\xed\xf4\xf0\xea\xd6" - "\x62\x71\xd4\xad\xc5\x32\x92\xba\xe1\x58\x3e\x39\x98\x9e\x65\xfe" - "\xe4\xe3\xb8\xbf\xd6\x16\xf2\xcd\xc3\xc9\x06\x76\x3f\xa9\x85\x34" - "\x5d\x11\xfb\xb7\x39\xc5\x42\xbf\xe1\x76\x4e\x53\xf4\xbd\x3a\xdc" - "\xef\xda\xb4\x1c\xb0\x1c\xc4\x31\xfd\x0d\xdb\xdf\x90\x62\xa6\xe2" - "\x7e\xd3\xa6\xd7\x8a\xd8\x7e\x94\xfa\x4c\xf1\xbe\xb2\x63\x7c\xdd" - "\x1c\xdc\x0b\x22\x40\x7f\xa6\xe3\xeb\xc2\x30\x7e\xe7\xbb\x71\x66" - "\x39\x4d\x43\xdf\x61\xe8\xef\x4f\x41\xe8\xf6\xba\x25\xef\xc6\x59" - "\x59\xec\xf0\x6d\xec\xbc\x6f\x53\xb9\x74\xc6\x4d\xfa\x86\xd9\xb7" - "\x3e\x13\xd2\x1b\xa4\x38\xb0\x54\xae\xc4\xb1\xc7\x5c\x2c\x1f\xd2" - "\xcd\x52\x6c\x56\xc0\x7b\xba\x28\x1b\x2c\x01\xd6\xc1\xe4\xde\x37" - "\x33\x25\xb9\xf7\x78\x3c\x09\xc0\xb8\x94\x3b\x92\xc7\xe1\x9a\x23" - "\x94\xd5\xb4\x1f\xe9\x1e\x6e\x19\x47\x03\x92\x88\x0f\x9e\xed\xc3" - "\x3d\x7a\x46\xb5\x99\xcc\x48\x22\x63\xc2\x13\xa1\x4c\x2b\x89\x0c" - "\x48\x84\xf2\x80\xd6\x7c\x6c\xf0\x0d\x9b\xe3\xdb\x09\xe5\xe1\xfa" - "\xb7\x4f\x3c\x51\x3d\xae\x4e\xa1\xdb\x76\x11\x05\x9e\x03\xc4\xf3" - "\x7c\xfc\x2c\xdf\x58\x65\x57\xda\x37\x25\x52\xfb\x3c\xe0\x8f\x3f" - "\xe7\x4f\xf3\x69\x07\x7f\x9a\x77\xf5\xe7\x4f\xf3\x18\xce\x9f\x6f" - "\x6c\x0e\xfe\x9c\x0d\x73\xe5\x4f\xf3\x4c\x57\xfe\x34\xc7\x78\xc7" - "\x9f\xe6\x48\x07\x7f\xf8\x37\x38\x7f\x9a\x13\x07\xe6\x4f\x73\xae" - "\x83\x3f\xcd\x33\x3c\xe3\x4f\xf3\x11\xf7\xfc\x69\x5e\x3a\x08\x7f" - "\xc6\x0e\xcc\x9f\xb3\x37\x7b\xce\x9f\xb3\x61\xc3\xe0\x8f\x1f\xe7" - "\x4f\xcb\x16\x07\x7f\x5a\x1e\xea\xcf\x9f\xb3\x7b\x38\x7f\xce\x1a" - "\x1c\xfc\x69\x31\xb9\xf2\xe7\xec\x11\x57\xfe\xb4\x28\xbd\xe3\x4f" - "\x0b\x71\xf0\x87\x7f\x83\xf3\xa7\x45\x3d\x30\x7f\x5a\x42\x1d\xfc" - "\x39\x5b\xe1\x19\x7f\x5a\xa2\xdd\xf3\xe7\xac\x65\xf8\xfc\x69\xf9" - "\x4b\x1f\xfe\x04\xba\xe7\x4f\x8b\x69\x18\xfc\x09\xe0\xfc\x69\x9d" - "\xe6\xe0\xcf\xb7\x27\xfb\xf3\xe7\xdb\x05\x9c\x3f\xdf\xce\x73\xf0" - "\xa7\x35\xd5\x95\x3f\xdf\x46\xbb\xf2\xe7\xdb\x32\xef\xf8\xf3\x6d" - "\x89\x83\x3f\xfc\x1b\x9c\x3f\xdf\x1e\x18\x98\x3f\xdf\xd6\x39\xf8" - "\xf3\x6d\x94\x67\xfc\x69\x1d\xe3\x9e\x3f\xdf\xee\x1c\x84\x3f\xe3" - "\x06\xe6\x4f\xeb\x33\x9e\xf3\xa7\x35\x75\x30\xfe\x0c\xcf\xd6\x6b" - "\xdd\x89\xdf\x1d\x85\x72\x1a\xdd\x95\x83\xb4\xc3\xfd\x87\x42\x5a" - "\x6b\x63\x91\x30\x56\xc9\xcf\x68\xb4\xee\xd4\x6c\x26\x8f\x34\x91" - "\x73\x77\x17\x09\x63\x94\x34\xad\x0c\xc6\x49\x7f\xc8\xa3\x5b\xc7" - "\x2a\x84\xad\xe3\x14\x78\x36\xdb\x7d\xfc\xf6\x73\x59\x3e\x53\xc8" - "\x74\x3c\x47\xb7\x0d\xec\x65\xfc\xbf\x2b\xed\xdc\x4e\xb0\x05\xc3" - "\x06\x3b\xbf\x85\x7b\x9d\x0e\xa7\xe3\xf8\xf6\x5c\x79\xaf\x5f\x8c" - "\x34\x9a\x88\xfe\xc5\x74\x77\xe0\x39\x8b\x73\xad\xe8\xeb\x1b\xc6" - "\xab\x15\x61\x77\xd0\x33\x38\xf6\x68\x21\xe7\xcf\xd2\xac\x2a\x8c" - "\x8d\x69\x01\x5b\xfd\xa6\xf3\xe4\x7c\x68\xef\xfe\x3c\x1a\x91\x2f" - "\xce\x11\xea\x78\xde\xb6\x67\x20\xaf\x0e\xe3\x90\x6e\x4a\xc6\xf8" - "\x9a\x6d\x0f\x83\xed\xfb\x23\xfc\x06\xfa\x4e\x2a\x86\x5f\xdc\x27" - "\xc3\xf7\x66\x9e\x5f\xc2\xec\xe5\x6d\xb7\xe6\xf3\xbd\x70\x6d\x33" - "\x25\xdc\xc1\x77\xc6\xc3\xbd\x9f\x68\xcf\x63\xfe\x09\xe7\xc9\x3f" - "\x3a\x9d\x9e\xab\xe0\xfe\x24\x94\x3d\x51\x7c\xee\x07\xf7\x07\xd1" - "\xce\x66\x7e\x3e\x72\x52\xc5\x3d\xc4\xff\x28\x81\xb4\x40\x31\xcf" - "\x44\xc8\xf3\x1a\xda\xee\x62\x19\x93\xe0\x7e\x0d\x8e\x81\xc5\xe7" - "\x41\x70\xbf\x18\xd7\x0e\xc4\xe7\x37\xc3\xfd\x6c\xb8\xbf\x8b\x9f" - "\x79\xe9\x11\xfb\xe8\x79\x9b\x77\x67\xc6\xcf\xb3\x98\x9a\xc8\x03" - "\x3e\x16\xf8\x87\xd3\xfe\x9f\xf3\xcd\x7d\x9e\x45\x3a\x3d\xab\x97" - "\x9e\xf1\x3d\x6a\xff\x48\x72\x7a\x56\xd1\xe7\x59\x9e\xd3\xb3\xfd" - "\x7d\xca\xdc\xef\xf4\xac\xb4\xcf\x7b\x75\x4e\xcf\x72\xfb\x3c\x6b" - "\x73\x7a\x96\x2a\x3e\xf3\xe9\x4a\x6b\x53\x38\xd6\xf0\xce\xeb\xc4" - "\x74\x39\xa4\x07\x3b\xa5\x47\x8a\xe9\xf0\xfd\xb6\x39\x26\x52\x60" - "\x16\xd3\x19\xef\x79\xf9\x6d\x8b\x9c\xca\x0f\xe5\x73\x1c\x6d\x91" - "\xbd\x7b\xe7\xc6\xd7\xe5\x0a\x3d\x11\xf9\xf0\x4c\x8d\xb8\x72\xc6" - "\xf6\xfa\x04\xcd\xf3\x2f\xbd\xa0\x89\x8b\x8e\xc7\xed\x2b\xeb\xd6" - "\xc4\x6b\xd6\x6d\x88\x8a\x76\xf1\xb3\x1e\x84\x3e\x07\x31\xa6\x1a" - "\xfa\x6e\x61\xf1\x0b\xde\xa4\xad\xbd\x31\x3f\x40\xae\xc2\xb7\xaa" - "\x4d\x64\x01\xfb\xd6\x4e\xee\x8f\xbc\x12\x7d\xbf\x70\x3f\x2f\xe4" - "\x89\x26\xd2\x76\x4c\xf4\xf3\x52\x0e\x79\xad\xee\xfd\xbc\x5c\xac" - "\x67\xfe\x0d\x21\x1f\xf7\xf3\x72\xb1\x01\xfa\xf9\xe3\x74\x3c\x8f" - "\xe1\xc1\x63\x9b\x5d\x90\x6c\x13\xf3\x8a\x2b\xcc\x47\x60\x2a\x9f" - "\xcb\xe8\xeb\xaf\xb5\xaa\x14\xdf\x13\xd7\x4b\x4b\x9d\xde\x8f\xe2" - "\xcf\x25\xfd\x20\x7e\x33\xb3\x0a\xcf\xb9\x8e\x6f\x82\x7b\x36\x7f" - "\xcf\x9e\x5d\xe0\x73\x79\x59\x55\x7b\xb1\x4d\xd8\x6e\xd7\xb6\xc9" - "\xff\xad\x89\x5c\x78\xc7\xd1\xb6\x0b\xf5\x4e\xbe\xe0\xc4\x36\x5c" - "\xb0\xf1\x3e\xda\xaf\xad\x6c\x7f\x22\x55\x56\xed\xc5\x6f\xa3\x3c" - "\x63\x75\xf5\x85\xfb\xac\xaa\x32\xa9\x3e\x4e\xf5\xdb\x8b\xe3\x7a" - "\xa8\xdf\x49\x4e\x13\x90\x1f\xc0\x53\xb1\x0d\xbb\x68\x5a\x5b\x12" - "\x8f\x65\x00\xfa\x04\x63\xb2\x30\x5d\x75\x31\x4a\x9a\xcb\x44\x1d" - "\xc5\xe7\x30\x2f\x3a\xec\x3f\xf4\xd1\x95\x25\xe9\xaf\x8b\x4e\xf6" - "\x1f\xff\x26\xa4\x95\x3a\x63\xc8\xe9\x7b\xc7\xf0\x7b\x90\x6f\x11" - "\x3f\x0f\x50\x55\x86\xfd\x1d\xee\x03\x71\x2f\x26\xbe\x8b\x75\x74" - "\x17\x87\xcf\x9d\x0f\x45\x07\x1d\xbf\x0b\x96\xe8\xb8\x93\x9d\x91" - "\xff\x2e\x44\x9a\xaf\x13\x63\x60\x94\xef\xec\x8d\x4b\xfd\x5d\x04" - "\x8b\xed\x96\x3d\xb9\xf2\x3e\x15\x89\xe4\xb4\xfd\x6e\x25\xca\x78" - "\xec\x33\x5c\xd6\x7f\x57\x2e\xf2\x3c\x92\xd7\xff\xbb\x2c\x4c\x77" - "\xec\xbf\xff\xce\x24\xe5\x93\xe4\x32\x5f\xaf\xfa\xee\x7d\x96\x8f" - "\xc7\x0a\x8e\xe1\x3c\xbf\x2b\xb0\x89\x7c\x57\x2d\xe6\x3f\xc7\xb0" - "\xc8\xfc\xf7\x7c\xd7\x4a\xb3\xea\x63\xa0\xae\x30\xfe\x69\x13\x63" - "\x56\xf0\xef\xc2\x6f\x35\xd6\x05\x69\x84\x67\xc9\xa9\x7e\x72\x25" - "\xf0\x67\xc0\xb3\x5a\xe2\xbe\xee\xdb\xce\x93\x4b\xdc\x86\x90\x53" - "\x2b\xce\xb1\xf2\xb6\x5e\x8a\x76\xda\xfb\xac\x92\xf2\x70\xd9\xcd" - "\x9e\xb1\x3d\xe5\xba\x04\x9c\x0f\x12\x9f\x25\xe0\xf9\xda\xde\xff" - "\xc7\x3a\xfd\x3f\x06\xff\x67\xfb\x9a\x37\x33\xdd\xaa\x70\x9c\xe3" - "\xbf\x14\x05\xf7\xaa\x3e\xf7\x41\x2e\xf7\xaf\xf0\x7d\xcf\x60\x9b" - "\x35\xb3\x3d\xe4\x62\xba\x58\xb6\x2f\xab\x4f\x02\x9d\x0b\xd8\x38" - "\x80\x67\xba\xc5\x7e\x78\x00\xcf\x6c\x07\xd8\x9e\x65\xe7\xb5\xe1" - "\xf9\x1c\xf1\x37\x54\xfc\x0d\xe1\x71\x5a\x2f\x05\x3b\x62\xad\xe3" - "\x1c\xcd\xa5\x10\x77\xb1\xdf\xf1\x3c\xb8\xf8\x1b\x2a\xfe\x86\x88" - "\xb1\x6a\x97\xc3\x7b\xbd\xe7\xbf\x07\xde\x83\x7c\x29\x5d\x3a\xcb" - "\x6d\xcf\xac\x5a\x2e\x64\x1e\x5b\x88\x71\x41\xd1\x4f\x58\x4a\x1b" - "\xfa\x8a\xb1\x10\x23\xe9\x26\xc6\xf8\xae\x54\x8c\x0d\x5a\xcb\x63" - "\x82\xe2\x19\x58\x19\xce\x9b\xa3\xed\x58\xab\xbb\xc0\xe2\x82\xbe" - "\xdc\x26\xc5\x3d\xb9\xd4\x6a\xcf\xaa\x5a\x2e\xf6\x97\x5d\x7c\x8f" - "\x7e\x3b\x9b\x2f\x66\x71\xad\xdb\xd8\xba\x97\xb2\x85\xb4\x27\x4a" - "\x79\x38\xed\xda\xd9\xdc\x57\x71\x9a\x14\xfb\xb1\x5d\x23\xc5\x9a" - "\x36\x91\xf6\xa4\x4e\xdf\xcf\x1b\x20\x6d\x8e\xeb\x9e\xe9\xf6\xc5" - "\x58\x26\xd6\xdd\x44\x2e\x99\xb1\x6c\xc8\x13\xd1\xdb\x67\x21\xfd" - "\x65\x1b\x99\x0a\xf5\x6a\x91\xca\x87\xe7\xd0\xff\xcd\x8c\x96\x58" - "\x66\x67\x96\x1d\xe8\xd0\x9e\x6d\x92\x17\x2e\xe2\x7b\xae\xdb\x41" - "\xff\xfd\xf7\xfc\xc1\x6c\x20\xe8\x0b\x79\xd0\x97\x4a\x84\xcc\xfa" - "\x5c\xe6\xcb\xdb\xb7\x3e\x8f\xcf\x31\xb6\x9f\xc5\xdd\xe1\x3b\x2e" - "\x13\x05\xee\x81\xe0\x98\xed\xe0\x3e\x90\x21\x0d\x64\x75\x19\xf4" - "\x11\x36\x57\x30\x3c\xbd\xdf\x6e\x61\x65\x4c\xe5\xbe\xcd\xf0\xec" - "\x52\x57\x5a\x47\x58\x6f\xfc\x84\xde\x7e\xdc\xb1\x06\xd7\x1e\xa0" - "\x7f\xb0\x3a\xf6\xad\x03\xd6\x17\xca\x6a\x76\x6b\x63\x2a\xeb\xd9" - "\xfa\x2c\xc8\x80\x48\xbe\x47\xb5\xe3\xcf\x3e\xea\x5b\x5b\xe1\x5b" - "\x7b\x7b\xe3\x46\x40\x9e\x1c\xdc\x7b\x0f\xe5\xf7\xb6\x33\x8e\x7d" - "\xa3\x9e\xf7\xf5\x8e\x56\x21\xab\x3e\x77\x47\x37\x51\x88\xe9\xad" - "\xb5\x36\x2b\xc6\x1e\x18\xd0\xcf\x16\x8b\x9d\x87\x7b\xc2\xb7\xd7" - "\xe7\xe2\xb9\xa1\xfb\xac\x52\x9d\x2d\xad\x78\x5e\x05\xeb\xcc\x69" - "\x6b\x39\x2d\xd1\x51\xdf\x0e\x65\x27\x9f\x22\xcd\xc4\x12\x8d\xfb" - "\xe6\x18\x4d\x36\x4b\x7b\x39\x2d\x6c\xcc\xc7\xbe\xcf\xf3\xb0\xb1" - "\x3f\x8b\x63\x04\xe5\x17\xb1\x58\x6c\xd0\x06\xe0\x45\x79\x32\x9e" - "\xf9\xb7\xb0\xb8\x00\xdb\x98\xaf\x0e\x68\x37\xdb\x27\xdb\x29\xae" - "\x93\x58\x4a\x25\x5d\x61\x12\xd3\x76\xe0\xb7\x13\xba\xc9\x45\x62" - "\x79\x0d\x63\xac\x03\x3d\x4a\xd0\x3f\x5d\xad\x05\xfa\x49\x62\x37" - "\x62\xa1\x04\x63\x77\x9a\x88\x25\x9d\xeb\x37\xa4\xb9\x25\x06\xbf" - "\x8f\xb4\x85\xb1\x99\x19\x68\x7a\xb9\x2b\xad\xb3\x37\xfe\x63\xce" - "\x2d\x38\xde\xb1\x0c\xea\x5f\xd7\x0e\x75\xae\xcd\x03\xdd\x39\xf5" - "\x14\xd6\xef\xa8\x30\xbe\x3e\x17\xf7\x64\xc3\xff\xeb\x44\xd9\xce" - "\x78\xc7\x71\xd0\xf9\x96\x8f\x3a\xf8\xf6\x5a\x8e\x05\xe6\x43\x0d" - "\xd2\x16\x8a\xf4\x63\xf1\x24\x72\x13\x38\x1d\xc4\xfc\x36\x3e\x5f" - "\x1c\x7c\x17\xd4\xcb\x29\xfe\x5d\x27\xd3\xdd\xe8\xfb\xbe\x88\x8d" - "\x09\x3b\xf7\x3b\xd5\xd9\xc2\xce\xbf\xb6\xe3\x5c\x5f\xe7\x72\xfc" - "\x96\x1e\xfd\x87\x21\x2e\xce\x3b\xe3\xbf\xf3\x61\xac\x27\xee\xf9" - "\xb5\xfb\xd6\x45\x82\xbe\x8d\x42\x3a\xc3\x3b\xf1\xd0\x17\x72\x07" - "\xd1\x85\x2c\xee\x5e\x57\xda\x65\xad\xa4\x0b\x61\x7c\x01\x7a\xa1" - "\xeb\x76\x36\xee\x04\x7b\xda\x28\xa0\x3d\xd3\xa5\x41\xdc\x40\x5f" - "\x2f\x11\x65\x6c\x09\xbc\xb3\x5c\x5a\xf3\xb2\xe3\xb9\x89\x8b\x6c" - "\xbd\xd7\x22\xc5\x93\xe3\xfe\xfa\x2e\xa7\x3a\xce\x59\x5c\xce\xee" - "\x77\xce\x02\xcf\xfe\xbc\xc9\xe2\x8e\xed\x45\x9d\x52\xd3\xd6\x8c" - "\x3a\x82\xbd\x8f\x67\x2f\x92\x61\x4c\xce\xcf\x0f\x35\xe3\xfc\x3c" - "\x8b\x79\x82\x75\xe1\xb1\x27\x9a\xd8\xff\x80\x5b\x05\xfe\x72\x2c" - "\x5d\x36\xf7\xc6\x4c\x07\x7e\xe3\x5a\xdb\x61\xc5\x2f\x48\xf9\x1d" - "\xa8\xaf\xbb\x6e\xc7\xf8\xdf\x5d\x69\x5d\x41\x52\xec\x6f\x16\xeb" - "\x9b\xb7\x67\xa7\x5b\xbf\x8c\xf7\x92\x50\xf4\x17\x80\xe7\xeb\x18" - "\x0d\x54\x93\x63\xd0\xd7\x33\xfa\xad\x2c\xdf\x8c\x31\x59\xba\x8e" - "\xfd\xee\x16\x76\x46\xd9\x52\x7e\x6f\x3b\xee\xc3\x6a\x6b\x49\x62" - "\xfe\x98\x94\xe1\x89\x36\x8a\xef\x31\x7b\xc2\x6f\x32\x9e\x37\x6e" - "\x63\xb1\x0e\xb0\x4c\xaf\xfd\x16\x77\x19\x44\xdb\xb4\x0d\xc6\x3e" - "\x93\x81\x57\xcc\x76\x87\xff\x6f\x39\x4f\xac\x57\x78\x0c\x5a\xee" - "\x7b\x5f\xdc\x8f\x3d\x96\xfb\xd8\x00\x9a\x31\x9f\x07\xd6\x75\x9a" - "\x7b\x30\x5e\xb3\x75\x23\xf3\x83\x9d\x59\xb5\x4f\xa4\xc1\xbe\x1d" - "\xbc\x5e\x01\x2b\x12\xe5\xac\x8e\x58\xbf\xe1\xd5\xcd\x3a\x57\x1c" - "\x47\x8c\xed\x4a\xb3\x26\x49\xbe\x39\xb8\x3d\xc5\xfd\x63\x73\x5e" - "\x58\xcf\x89\xf6\xf3\x7e\xf1\xdb\xfb\x47\xe1\xdb\xfb\xc5\x32\x33" - "\xb9\x8f\xf0\x2e\xe8\x07\x55\x60\x9f\x5e\x51\x48\xe3\x19\xf1\x0c" - "\x51\x08\x1f\x67\x5d\x09\x76\x8c\x67\x38\x0d\x5d\xce\xdd\x6d\xd8" - "\x10\xaf\x89\x5a\xb3\x49\xb7\x32\x7e\x55\x8c\x26\x3a\x2e\x6e\x43" - "\x9c\x06\x9d\x34\x39\xf7\x1f\x1e\xc7\xe8\x4a\xa8\x18\x9f\xb0\xcc" - "\x11\x9f\xf0\x4a\xa2\x73\x4c\x4f\x13\xb9\x92\x34\x3a\x73\x17\x57" - "\xf2\xdc\x95\x93\x2b\x17\xf6\xc1\x75\x00\xae\x72\xb8\x2a\x71\x2e" - "\x63\x85\x95\x84\x81\xae\x67\xfb\x4c\x1c\x3e\x27\xae\xa0\x5f\xf2" - "\xb0\x26\x72\xa5\xb3\x48\x50\xe0\x38\x08\xe3\x86\xef\xc3\xfc\xc5" - "\xf0\x3e\x5c\xe5\x70\x55\xc2\xc5\xde\x13\x3e\x66\xe7\xe5\xf7\x39" - "\x3f\xe3\xfb\x47\xb6\xee\xc5\x3c\x74\x2b\x2e\xd9\x43\xbe\x7f\xe7" - "\xf9\xfa\xd4\x41\x4e\xd3\xda\xa5\x7c\x6c\x6d\xdf\x7f\x2b\xd1\x0c" - "\x90\xcf\x87\xa6\x9d\x2b\x13\xf3\xb1\xbd\x36\x52\x7b\x30\xd6\x00" - "\xe4\x97\xf2\x29\x68\x5a\xd7\x1c\x31\x1f\xd3\x15\x42\x9a\x7c\xa0" - "\xef\x8e\xa1\x69\x07\x82\xc5\x7c\x81\xce\xe5\x39\xe5\x19\x2b\xa4" - "\x9d\x29\xc5\x3c\xc2\x56\x45\x10\xb7\x9d\xae\xe4\x41\xfe\x01\xfd" - "\xaf\x0c\x8f\x4f\x3d\x61\x7d\xf9\xa4\x5b\xb5\x26\xfa\xa7\x6b\xd6" - "\x27\x60\xa4\xa9\xf8\x0d\x2f\xc5\xe3\xef\xfa\x95\x2f\xb2\x9f\x0d" - "\x2b\x56\xaf\xe2\xff\xc4\xc7\x86\xe2\x3f\xb1\x80\x37\xfc\x8d\x7a" - "\x49\x87\x3f\xab\x36\xe0\x6d\x62\x4c\xc8\x4b\xab\xf0\xa7\xef\x39" - "\x50\x6d\x57\x5a\x4f\x2b\x60\xa3\x81\xcb\xd9\x1e\x18\x23\x9d\x63" - "\xd8\xc3\x78\x4a\x47\xb4\x36\x22\xcd\x6b\xb9\xfa\x1c\xb1\xc9\xd0" - "\xe7\x48\xc0\x56\xdd\xaa\x00\xdb\x9a\x68\xd0\x19\x3b\xbb\xd2\x6c" - "\xa1\x26\xb2\x96\x88\xb2\xb1\x9c\xf9\x39\x4d\xeb\x49\x15\xf7\x76" - "\x2a\x84\xcc\xaa\x78\xf4\xdf\x0f\xf7\x2c\xce\x36\xdc\x97\xc0\xfd" - "\x07\x70\x8f\xf1\xb5\x83\xe0\x3e\x09\xe7\xa4\xe0\x5e\x0d\xf7\xc1" - "\x42\xe6\xc1\x4c\x3c\x63\x0c\xf7\x1a\xb8\x9f\x01\xe5\xe7\x4a\xfd" - "\x62\x60\x5b\xd9\xb6\x4f\x8a\xfd\xcd\xe3\x7c\xdb\xca\x7b\xe3\x7c" - "\x63\x3c\xa7\xe4\xc0\xe5\x4c\xff\x32\x1b\xc4\xd6\xec\xa3\x9e\x96" - "\x00\x79\x9a\x25\x7d\xc9\xe7\x3b\x6c\x16\xc9\x7f\x0a\x9f\xcf\xb0" - "\x2b\x9c\xe2\xa5\xe3\x7d\x90\x14\x2f\x1d\xe7\xbb\x58\xbc\x46\xf8" - "\xa5\x69\xe8\x4f\x96\x96\x0d\x38\x97\xc7\xe2\x7c\xda\x5f\x41\xdf" - "\xbc\xe6\x94\x28\xd9\x9d\x45\x38\x87\x06\xf7\xdc\xb7\x24\xbd\x48" - "\xec\x2c\x3e\x94\xe4\x77\xce\xd9\x97\xc4\x80\xe7\xa1\x8e\x83\xcd" - "\xc0\xe2\x5d\xc5\x6e\x08\xb0\xad\x8c\xe6\x76\xa0\xfd\x24\x97\x5f" - "\x75\xe9\xdc\x5e\xb0\x57\xd0\xa7\x79\x4c\x14\x13\x11\x16\x72\xdf" - "\x53\xb1\x1b\x28\xbc\x1b\x90\xb8\x32\x9a\xa5\x41\xbe\x6d\x60\xab" - "\x89\xf5\x7b\xdb\x18\x8c\x67\x5c\x05\xd1\x47\x86\xbd\xec\xb9\x69" - "\xa9\xf8\x1d\x25\xb3\x43\x8e\x13\x15\xc6\xdb\xc4\xba\x15\x39\xf9" - "\xc5\xdb\x01\x69\xb8\x87\xb4\xe3\x69\xa2\x42\x3f\xc0\x62\x5d\xca" - "\x78\xfc\x30\x21\x4c\xf2\x35\x65\x82\xb4\xbe\xed\x79\xfa\x5f\x19" - "\x2a\x67\xae\x0a\x59\xb2\x00\xfe\x0b\x11\x43\x56\x3b\x63\x33\xb8" - "\x63\xfc\xf1\xc8\x8e\xff\x4a\xf8\x6f\x1e\x97\x54\x00\x3b\xcd\xce" - "\xc6\x42\x02\x8e\x81\xbb\x22\xf2\xf8\x1e\x54\xe1\x28\xfa\xdd\x15" - "\xd2\xd0\x9e\xc4\x73\xd3\xc2\x01\xc4\x2c\x55\xd6\x65\x16\x6f\x41" - "\x1f\xcf\x32\xa0\xb1\xf0\x0e\x3e\x13\x7d\x78\xc9\x99\x8f\x2b\x3b" - "\x51\xb3\x33\xc2\x60\xa3\xe0\x19\xd4\x16\x99\xac\x06\xed\x0e\x9c" - "\x4f\x12\xd2\x84\xa5\x88\x5b\xe0\x31\xfa\x10\xb1\xd0\xf1\x55\x91" - "\xd4\xf7\x58\x08\xe2\x18\x6d\x5d\x63\x20\xd2\x8c\xa2\xcf\x80\xc7" - "\xe1\xfa\x37\x1e\x7b\x66\x59\xab\x54\x26\xdc\xab\xc0\x86\xda\x09" - "\xbf\x81\x5d\x69\x74\xa1\x53\x4c\x3e\xf1\x4c\x34\x5d\x83\xbe\xdf" - "\xb0\x6c\x66\x3b\xcb\x64\xef\x73\x1b\x84\xc6\x9b\x48\xe0\x1c\xde" - "\x17\x31\xd6\xe8\xf6\x4c\xf1\x7f\xb0\x7f\xee\x37\xf7\x29\xe3\x84" - "\x34\x57\xca\x31\x0d\x3a\x4f\x4e\x1e\x87\xeb\xdf\x20\xff\x07\x26" - "\xf2\x20\xcb\xbf\x4d\xce\xce\x49\xb6\xf8\xa8\xf1\xbc\x3b\xad\x97" - "\xd2\xc7\xc8\xc2\x80\xa6\x18\xd3\x8d\xf7\xfd\x8e\xf1\x75\xb1\x70" - "\x6f\x91\xe6\x58\xd8\x9c\x4b\x06\xee\xeb\xea\xbd\x4f\x84\xfb\x20" - "\xe9\x1e\xfe\xd7\x48\xb2\x02\xe7\x24\x3a\x52\x22\x76\xe1\xb8\x73" - "\x95\x1a\xec\x42\xb0\x6f\xe0\x39\xf0\x7f\xfb\x42\xfe\x6e\x8f\xa6" - "\x23\x4d\xaf\xb3\xf8\xdf\x14\x69\x01\xf9\x07\xcf\xc0\xfe\x8b\x6d" - "\x14\xcb\x89\x31\xc9\x8b\x7a\xdb\x26\xa4\xf9\x04\x08\x59\xc7\x16" - "\xb2\x36\xca\x64\xa5\xf0\xff\x22\xb3\x6f\x95\x06\xf2\x01\xff\x6d" - "\x06\x96\x2f\xe1\x42\x49\x76\x77\xe0\x52\x23\x58\xf0\xe5\xab\xbb" - "\x91\x7e\x6c\x4f\xb6\x7e\x73\x20\xf3\x5d\x8b\x7e\x40\x58\x4c\x34" - "\xf4\x6f\x69\x23\x63\x59\x4c\x81\x2c\x9b\x9a\xf9\xd2\x7f\x59\xab" - "\x92\x7c\x5b\x82\xbc\x09\xa2\xf2\x0d\x16\xf4\x77\xc9\x62\x87\x74" - "\x69\xfd\x99\x8f\x4b\xd1\xb7\x65\x61\x02\x09\x32\x08\xdc\xb7\x25" - "\xf3\x11\x32\x16\xc6\x29\x09\x03\xfb\xb7\xa4\x69\x7b\x17\x4a\xfe" - "\x2d\xe9\x65\xbb\x15\xfe\x9f\x01\xf4\xc0\xf8\xef\x5a\x76\xef\xf0" - "\x37\xa5\x18\xd0\xdf\xa5\x9c\xb0\x98\x25\xe8\xef\x72\x58\xfa\x42" - "\x26\x63\xf3\xb2\x5d\x19\x32\x90\x7f\xaf\xb2\xb8\x80\x4e\x69\x15" - "\xd0\x12\xd1\xbf\x01\x8d\x11\xd3\x1a\x4c\x24\xcb\x20\x8e\x4b\xcd" - "\x38\xc6\xdf\xc9\xe6\xc6\x84\x36\xda\x13\xb3\x6b\x20\x99\xd3\xee" - "\x3f\xc5\xd4\x8e\xfe\x29\x32\xe4\x6a\x93\x4c\x9e\x84\xef\xb2\xb1" - "\xa4\x4c\xae\xee\xdb\xaf\x9f\x5f\xb5\x21\x2a\x7a\xc5\xda\x75\x3a" - "\xcd\xd3\x4b\x1f\x67\x81\x12\x43\x34\x6b\xe2\xa3\x99\x4a\xd2\x3c" - "\xbd\xe0\xb1\xf0\xf0\xa5\x2b\xfe\x75\xe9\xa3\x4b\x9f\xf9\xd7\x87" - "\xf9\x89\xc5\xa5\x71\xaf\x60\xb0\xcd\xf8\x0d\x1a\x7c\xe9\x79\x31" - "\x9a\xf8\xe6\xe8\xb8\x0d\x7d\xe5\x41\x10\x9b\xe7\x92\xb3\x39\x5d" - "\x0b\xfe\xcf\xe6\xd2\x64\xf2\xfd\xd2\x1c\x17\x93\x7d\x32\xf9\x1e" - "\xa4\x2d\x8b\x35\x9e\x21\xc7\x3e\x4b\xc4\x38\xef\xa8\x77\x14\xd8" - "\xa7\x51\xff\x40\x5b\x4c\xce\xbe\xb9\xf8\xbb\x3e\x0a\x39\xbe\x27" - "\xf6\x65\x31\x6d\x0a\x9d\x3a\x35\x85\xf9\xd7\xca\xf0\x09\x92\xe6" - "\xbd\x31\x4d\xaa\x43\x13\xe6\xc9\x90\x3f\xdb\x1b\x4f\x38\xc3\x67" - "\x9e\x23\x0e\x25\xfb\x73\xa1\x11\x21\x68\xce\x8c\x01\x5b\x65\x2c" - "\x5c\xe3\xf0\x5a\xd8\x2b\xdf\x13\x68\x03\x8e\xd9\x02\x64\xa0\x83" - "\x13\x7d\x78\x1c\xab\x8c\x7a\x16\x7b\x21\xdc\x6e\xf3\x59\x61\x97" - "\xc3\xaf\x0f\x5d\x61\x57\xb0\x71\x22\x4d\xa0\xf5\xec\xac\x7d\x02" - "\xad\xc3\x78\x6d\x80\xe3\xcc\x70\x5b\x72\x66\xb8\x9d\xda\x56\x80" - "\xfd\x0e\xbf\xdf\xe2\x99\xf1\x70\xfb\xb7\x94\xc5\xac\xc1\xb3\xf5" - "\xdc\xcf\x60\x25\xee\xa1\x7c\x0e\x30\x5c\xd4\xce\x63\x12\x87\xbf" - "\xf2\xdd\x99\x15\xaf\x98\x78\x4c\xe2\x8b\x3c\x8e\x37\x8f\x75\x4e" - "\x92\xa1\x9c\xa3\x2b\xec\x3e\x9a\x70\x7b\x0f\x65\xe7\x5e\x33\x14" - "\x9a\xc1\xe2\x0c\xa3\x8c\xdd\x34\x85\xc8\xf1\x1c\x9d\xbd\x68\xb5" - "\x06\x7d\x0a\xa6\x98\xa9\x15\x7d\xd3\x7c\xd4\xdd\x20\xd7\x24\x28" - "\x80\x6e\x8a\x05\xb5\xba\xd0\x81\xcf\x3d\x67\x7c\x95\x4a\xf5\xf9" - "\xfb\x69\xc6\xd7\x4b\xa8\xbe\x60\x0e\xcd\x3c\x86\x73\xa3\x32\x9a" - "\xd1\xac\x81\x7b\x48\x6f\x31\x53\xbd\x61\x0e\xcd\x38\x57\x0e\xbf" - "\x70\xdf\x96\x4b\xf5\x85\x70\xff\x49\x04\xbc\xb7\x8f\x66\x54\xe2" - "\x7b\xa1\x34\xe3\xe8\x42\xf8\x85\xfb\xaa\x30\xc8\x07\xf7\x9f\xce" - "\x85\x5f\xb8\xaf\x0e\x6d\x91\x8d\x09\x84\x77\x20\xed\xbb\x48\xfe" - "\xad\xf6\x48\xf6\xad\x8c\xce\x48\xfe\x0d\x6b\x24\xff\x46\x4f\x24" - "\xff\x86\x10\xc9\xbf\x51\xa3\x85\xfc\x07\x68\x46\x6d\x1e\xe4\x9b" - "\x4b\x33\xea\x94\xf0\x0b\xf7\xc7\x12\x21\x1f\xdc\x1f\x6f\x85\x5f" - "\xb8\xaf\x87\xba\x14\xc2\xfd\x89\x4a\xc8\xff\x01\xcd\xf8\x62\x1e" - "\xe4\x9b\x47\x33\x1a\xf6\xc1\x2f\xdc\x9f\x9a\x01\xf9\xe0\xfe\x4b" - "\x28\xc7\x00\xf7\xa7\x55\x90\x7f\x1e\xdd\x2e\xc3\xfa\x94\xd3\xed" - "\x3e\x58\x6e\x18\xdd\xae\xc0\xfc\x70\x3f\x16\xca\x33\xc0\x3d\x8c" - "\xaf\xf5\x06\xb8\xf7\x2d\x83\xfc\x70\x3f\x01\xda\x9a\x5f\x41\xb7" - "\xab\x6c\x90\x6f\x3e\xdd\xee\x0f\xe9\x05\x70\x1f\xb8\x14\xf2\xc1" - "\xfd\x24\xcc\x0f\xf7\x37\xed\x85\xfc\x70\x7f\x33\xd2\xa8\x92\x6e" - "\x9f\x7c\x00\xf2\x2d\xa4\xdb\xa7\xaa\xe1\x17\xee\x83\xb1\xfe\x70" - "\x3f\xbd\x01\x7e\xe1\xfe\x76\xa0\x55\x21\xdc\xdf\x09\xf5\xcb\xaf" - "\xa6\xdb\x67\x62\xf9\x8b\xe8\x76\x2d\xd2\x07\xee\xef\xa9\x80\x7c" - "\x70\x3f\x0b\xe8\x61\x80\xfb\xfb\xb2\x21\xff\xa2\x01\xf9\xb9\xfd" - "\xfe\x28\xba\x75\x2c\xa1\xdb\x7f\x6a\xa1\x5b\xc7\xc1\xef\xbc\x52" - "\xba\x75\x8c\x96\x6e\x0f\x53\x40\x3a\xfc\x3e\x9c\x04\xf7\x21\xe2" - "\x3d\xfc\xfe\x7c\x29\xdc\x87\x8a\xf7\xf0\xfb\x48\x08\xdc\xcf\x11" - "\xef\xe1\xf7\xd1\xfd\x70\x3f\x97\x6e\x7f\x2c\x1b\xee\xf1\x57\x03" - "\xf7\xf3\xc4\x7b\xf8\x9d\xbf\x04\x7e\x6d\xe6\x69\xd1\x89\x66\xbf" - "\xb5\xa1\x66\xbf\xa2\x12\xc4\xa4\x3d\x27\x7f\x9f\xe0\x5f\x10\x0a" - "\x7a\x77\x6c\x4a\x27\x19\xd7\x22\x1b\x77\x1a\x65\x8a\x31\xc9\xc4" - "\x62\x01\x8a\x3e\x2e\xc7\x36\xc9\xc6\x9e\x04\x1b\x09\xe3\x39\xc8" - "\xa1\xed\x6d\x34\x6d\x4c\x3b\xb4\x39\x96\xa6\x4d\x68\x82\x5f\xb8" - "\x9f\x78\x1c\xda\x0c\xf7\x0f\x6e\x87\x5f\xb8\x5f\xf6\x18\xb4\x3d" - "\xb6\x2b\x63\xdc\x5c\x93\x4c\x11\xcb\x64\xc4\x7f\x25\x94\x04\xd8" - "\x52\x68\xb8\x0d\x74\xc7\xae\x3d\x91\x01\xb6\x48\xe0\x43\x71\x58" - "\x00\xc6\xec\x28\x8c\x3e\x40\xfd\xd7\xb2\x3a\x61\x5c\x1e\xda\x33" - "\x43\xce\xbf\x3d\x81\x36\xc9\xc6\x45\x63\xfc\x08\xea\x9f\xe6\xee" - "\xf9\x6b\xec\xf9\xd4\x3d\x3a\xfe\x1c\xf0\xd0\xfb\x7c\x19\x3e\xdf" - "\x13\x80\x7e\xd8\xa7\x3f\xcb\x9e\x1b\x2d\xad\x62\xbb\x7c\xf0\xd9" - "\x21\xcc\x6b\x92\x8d\x6b\xe6\x32\x7c\x6c\x2b\x4d\xf3\x21\x1d\xca" - "\x63\x4b\xa0\xee\x16\xa8\x7b\x88\x68\xc3\xc7\x53\x65\x55\x22\xf7" - "\x71\x52\x7f\xc0\xdd\x3c\x90\x90\xbd\x3b\x4f\x0f\x72\x10\xc7\xc5" - "\xa0\x0f\xe5\x9a\xe4\x19\x07\x9a\x64\xbe\xe5\x85\x6c\xbe\x63\xcf" - "\x5c\x2e\x1f\x95\xaf\xf5\x6c\x3f\x96\xae\xd9\x1c\x00\xdf\xf7\x3d" - "\x94\x62\xa5\x9d\xe5\xc9\x8f\x81\x6c\x65\xe9\xe5\xec\x0c\x11\xff" - "\x9f\xad\x21\x89\xff\xe7\xb1\x79\x68\x28\x0b\xdf\x75\x1e\x87\xd8" - "\x33\x66\x2f\x11\xfc\xf7\x84\xb1\xb5\x75\x99\x32\xeb\xa0\x60\x92" - "\x07\xc4\x93\x31\x9a\xcd\x1f\x41\xf9\x4a\xd7\x31\x6b\x6f\x5e\xf6" - "\xec\x2f\x1f\x42\xde\x02\x9c\x5f\xca\x50\xf6\xc6\x3f\xa6\xd0\x86" - "\xd7\x51\x17\xca\x49\x18\xea\x67\x66\x03\xcb\x7c\x23\xf1\xb4\x93" - "\x4d\x55\xac\xb1\x65\xaf\xd5\xd8\xb3\xf7\xcc\xa5\x39\x7b\xc2\xfc" - "\x6d\x32\xee\x1b\x58\xe6\xfb\xfb\xfb\xac\x68\x73\x56\x61\xde\xc5" - "\xc2\xd8\x9f\x05\xde\x9b\x48\xe4\xe5\x71\xa7\xf0\x5e\x4f\x33\xc2" - "\xca\x8c\x6d\x0d\xa4\x3c\x8e\x95\x95\x4d\x33\x16\x45\x08\x63\x7f" - "\xb1\xb4\x08\x6d\xf7\x44\x9c\x7b\x3b\x8e\xe9\x13\x81\x2f\xa0\x57" - "\x7c\x63\xa5\xba\xa0\x4e\xd1\x03\xed\xd0\xae\x46\x7f\x18\x2b\xec" - "\x76\xf4\x2f\x97\x69\x02\x3a\x70\x7e\xf9\x2e\xc1\x38\xef\xe2\x77" - "\xf7\x08\xe3\x8f\xe9\x6a\x97\xe3\x3a\xa2\x12\xfd\x75\x75\xb2\x33" - "\xf4\x18\xfd\x58\x40\x3b\x80\xe7\x75\xe6\xdd\xba\x55\xba\x15\x9b" - "\x75\x1b\xe2\xe2\x57\xbc\xa4\xfb\xa9\x06\x06\x93\x9a\x0d\xab\x35" - "\xeb\xa2\xd7\x6d\x88\x7b\xa5\x9f\x8f\xa0\xae\x8c\xf1\x0a\x93\x4c" - "\xc9\xe6\xc4\x8e\x82\x4d\xcf\xe6\xf4\x65\x13\xea\x91\xd7\xbb\xde" - "\xe4\x31\x38\x20\x8f\x16\xc6\x7d\x7b\x99\x5d\x9e\xb7\x27\x82\x1a" - "\xa2\x0f\x64\xa1\x1f\x90\x97\x30\xc6\x83\x99\x18\x49\x3b\x8f\xcb" - "\xcb\x62\xee\xc1\x18\x23\x61\x0b\x2d\x4f\x68\xc7\x7e\x00\xb2\xa5" - "\x68\x21\x2d\x5c\x4d\xae\xe8\xd7\xe6\x35\xc9\x26\x1c\xb8\xa2\x2f" - "\x9a\x2b\xc5\x4c\xb2\x67\x17\xe5\x09\xaa\xdd\xfb\x30\x66\x52\x0f" - "\x55\x93\x1a\xa0\x65\x77\xe6\xb1\xe5\xa0\x07\x22\x0a\xd3\xe8\x01" - "\x3b\x8c\xb9\x98\x0f\x9b\xff\x4a\x48\xb5\x53\xad\xc2\x9e\x46\x94" - "\xf0\xeb\x4f\xfd\x4b\x4d\x3d\xaa\xe2\x50\x7c\x8e\xb1\x92\xec\x3d" - "\x5a\x92\x5c\x4f\x85\xdf\xc6\x00\x6e\xd2\xc0\x68\xc7\xd8\xb0\x31" - "\x17\x08\xa4\x8f\x17\x72\x8a\xca\x5b\x16\x12\x39\xe6\x05\x7b\x8f" - "\x2c\x87\xff\x93\x56\x12\x3f\xc8\x17\x90\x74\x14\xd2\xbb\xb4\xe3" - "\x6d\x29\x5a\x65\x77\x8a\x76\x7c\x0f\xd5\xaa\x8c\xcd\x56\xd2\x33" - "\x33\x21\x77\x96\x99\x28\x76\x81\x5d\x58\x28\x40\x1f\x34\x44\x97" - "\xd8\x5f\xd5\x8e\xb5\xbd\xaa\x55\xf4\xf4\x68\x95\xb6\x97\xb5\x8a" - "\xee\x97\xb5\x63\x7b\xba\xb4\x4a\x63\x94\x99\x54\x99\xff\x40\x6a" - "\x9b\x5b\xd9\xbc\x6f\x8f\x5f\x69\x5b\x8f\x5f\x51\xb5\xaa\x99\x04" - "\xdd\xab\x03\xbb\x10\xec\xe5\x7c\x18\x2b\x00\x26\x54\xb6\x3d\x09" - "\xa0\xef\x4a\x73\x81\xbe\x85\x0b\xee\xa6\xdf\xd9\x33\x02\x63\x34" - "\x4f\x80\xbc\xda\xaa\x50\x43\x1a\xe0\x27\xb8\x81\x66\x4c\x01\x19" - "\xa7\x08\x86\x4b\x63\xe2\x7c\x20\x34\x23\x00\xef\xd5\x98\x97\xe7" - "\xbb\x39\xd6\xc4\x7e\x27\x7e\xc0\x62\xb8\x66\xf8\x56\x17\x32\x9b" - "\x64\x42\x9d\x64\x93\x54\x28\x06\xf6\x35\x02\x79\x2c\xbd\x63\x78" - "\x01\x64\x8e\x3e\x7f\x40\xdf\x38\xdc\xff\x0f\x7c\x3b\x27\xbf\x2e" - "\x57\xe8\xf5\xff\x0c\x32\x53\x35\x0d\xfa\x4f\x2a\x7b\x96\x5d\x1c" - "\x96\x7c\x89\xf8\xe0\xb3\x7d\x97\xad\x72\xbc\xd7\xc4\xc9\xa8\xd1" - "\x62\x25\xb9\xb8\xfe\x11\x1c\x7d\x60\xdf\x65\xb3\x1c\xf1\x52\x0b" - "\x69\xf0\xee\x03\xb9\x97\xc5\x72\xf3\xf6\x44\xa6\x6c\x24\x2c\x0e" - "\x0a\xc6\x52\x42\x1c\xe5\x26\xc3\x18\x14\xe3\x3e\xc5\xa1\x0c\x53" - "\x6d\x84\xff\x95\x98\x8f\xaa\x8a\xc3\x04\x28\x03\xb0\x54\x46\xfd" - "\x8a\xb5\x82\xbe\x68\x1f\xc8\x56\x1d\x9d\xb6\x5a\x2d\xec\xda\xb3" - "\xb0\x2b\x43\x55\x09\xf4\x30\x49\x73\x1a\xb5\x65\x36\x82\xfe\xbb" - "\xe8\x63\x36\x72\x24\xbe\x13\x7d\xfc\xfa\x98\x7d\x8f\x45\x9a\xfd" - "\x76\xe7\x99\xfd\x4a\x73\x05\xfd\x6e\x13\x5c\xcd\xba\x38\xa2\x3a" - "\x2f\xf3\xcb\xee\xf5\x3f\x7b\xe9\x3a\xf1\x3f\x0b\x76\x1e\xb3\xf7" - "\x00\x3b\x68\xbf\x09\xfa\x62\x16\xcf\x04\xed\x3a\x94\xb9\x5d\x19" - "\x7e\x07\x24\xbb\x0c\xe5\x88\x3d\xeb\x58\x2c\x5c\x31\x90\x5e\x67" - "\x92\x69\xac\x92\x8c\x01\xdd\xb3\x44\xd8\xfe\xa4\xba\x0b\xcf\x58" - "\xf5\xc4\x3c\x82\x79\x81\x6e\xa9\xf0\x2d\x1f\x7b\x4f\xcc\x3c\xb8" - "\x1e\x86\xeb\xe7\x76\x7d\xb1\xc6\xae\x2f\x0a\xb3\xeb\x4b\x75\x76" - "\xfd\xda\xa5\x70\x45\xc0\xb5\x1c\xae\x48\xb8\xa2\xe0\x8a\xa1\xfa" - "\xb5\xb1\xf0\x8b\xcf\xe3\xe1\x4a\x84\x2b\x09\xae\x54\xb8\xd2\xed" - "\xbb\xf6\x2c\x11\x00\x9f\x70\x69\xe0\x0a\xb6\xeb\x77\x37\xc0\x35" - "\xe0\x5c\x09\xcd\xec\xe1\xb1\x1b\xc6\x9c\xa1\x01\x18\xdb\x37\xa9" - "\x13\xfd\x49\xaa\x8f\x68\x2d\xc3\xf3\x61\x2f\xf3\x4f\x77\x37\x7f" - "\x82\xe5\x43\xff\xea\x19\x66\x79\xee\xfd\x1c\xaa\xf7\x44\xd8\x82" - "\x57\x33\x7f\xea\xd0\xa7\x65\xb5\x91\xcd\x24\xdc\x4c\x52\xaa\x9b" - "\xbb\x49\x4a\x14\xb5\xb3\xb1\x79\x12\x9e\x6d\xd9\x60\x41\x1c\xdb" - "\x69\x84\xa6\x27\xbb\x68\xa1\x5d\xb5\x5b\x47\x55\xbb\xcb\x98\xcf" - "\x4a\x90\x3f\x18\x2b\xad\x77\x5c\x8a\xb8\x82\xb1\x69\x4d\x5b\x27" - "\x79\x35\x8a\x0a\x35\x31\x60\x9b\x34\x00\xc0\x64\xe4\x2d\xc4\x98" - "\x34\x36\xfd\x75\x23\x4d\x05\xbc\xf8\xda\x81\x6e\x02\x8e\x49\x01" - "\x5b\x38\x3e\x95\xf0\x05\xfa\x2c\x50\x8a\x2f\x45\xc7\xfa\xc7\xc0" - "\x33\x05\xc6\x9f\x32\xc0\x98\xd4\x90\x40\x66\x18\xe0\x19\x8b\x15" - "\x0a\xf5\x7e\x52\x17\x40\x85\x17\xb5\xa4\x68\x2d\x51\xfa\x5d\xe0" - "\xf1\x67\xed\x40\xfb\xde\x18\x0c\xd9\x6b\xf3\x16\x5f\xd0\x90\x23" - "\xda\xd3\xa0\x97\xf6\x81\xfc\x5e\x9b\xd7\x03\xb2\x1b\x68\x69\x1f" - "\x1e\x2d\x03\x35\x57\x8b\x96\x3d\xc1\xd1\x25\x9c\x9e\x91\x04\x69" - "\xd6\x97\x9e\x48\xe3\xcd\xcd\x40\x4f\xa0\xab\xb1\xde\x4e\xfc\x65" - "\x64\xa5\x44\xcf\x02\xa0\x27\xd0\x54\x8d\x34\x05\x7a\x30\x9a\x52" - "\x91\xa6\x45\x4e\x34\x05\xf9\xc4\xfc\x7b\x22\x4d\x05\xa0\x69\x91" - "\x1b\x9a\xf6\x8e\xef\x81\xa6\xc5\x1e\xd1\xb4\x6c\x04\x34\x9d\x18" - "\xef\x8e\xa6\x36\xd4\x99\x39\x6b\x73\x29\xc8\x3c\xa3\xad\x8a\xf9" - "\xaa\x05\x7b\xa7\x19\xec\x36\x93\xa0\x2a\xca\x03\x9a\xa8\x70\x9f" - "\x00\xc6\x3b\x63\x7e\xe5\xca\xe8\x15\x7b\x4e\xa9\x19\xd3\x40\x76" - "\xc5\xdc\x87\xbe\xf9\x74\x26\x52\x24\xa7\x07\x6a\x2f\x5b\x40\xc7" - "\x04\xbd\xd3\x8d\x36\x67\xce\x9e\xfb\x04\x1a\x43\x50\x8e\x3c\x77" - "\x37\x51\x74\x83\xac\xd0\x25\x90\xdb\x72\x41\xde\x75\x83\xfc\x3c" - "\x2f\x9b\xb4\x70\x81\x4e\xa0\x70\xa5\xa0\xcf\x55\xc1\x6f\xb7\x09" - "\xe4\x35\xe3\x2f\xf2\x0c\xd7\x1f\x6b\x9e\xfb\x18\xca\xbb\xe9\xa1" - "\x4f\x23\x6d\x24\x25\xa6\x3f\x7f\x85\x94\x08\xb0\xbb\x86\xee\x27" - "\x18\x73\x31\xa9\x15\xf9\xba\x8f\x18\x9b\x1d\xfd\x44\x78\x99\xcb" - "\x61\xe4\x05\xf6\x0b\xec\x23\x3b\x9c\xe4\x2f\xc8\xf6\xc0\x42\x31" - "\x06\x89\x1d\xe4\x2f\xe4\x55\xa0\xaf\x56\x8c\x4d\x32\x60\xff\x78" - "\x15\xfa\xc7\x66\x16\x1f\x4a\x0d\xf4\xd8\xd7\xdd\xc5\x79\x88\x3c" - "\x33\xda\x2a\x19\xff\x72\x45\x79\xcf\xe9\xbe\xfb\x8f\x94\x46\x80" - "\x2d\x23\x53\x0b\x39\xa5\x26\xda\x15\x33\x1e\xe7\x2a\x61\xfc\x1c" - "\x1a\x10\x05\xb6\xc3\x77\xa0\x0f\xd6\x03\xbe\x2e\x92\x19\xc5\xeb" - "\xc1\x1e\xe8\xc2\x38\x6f\x50\x9f\x57\x78\x7c\x5c\x21\xc3\xbf\x1a" - "\x9e\x31\x1f\xb2\x82\xe4\x43\xb6\x43\x8b\xe3\x7e\xc7\x7c\xd1\x06" - "\xad\xdc\xf1\xcd\xcf\xf7\xd9\x55\x32\x35\x3b\x6f\x2f\x0b\xe2\xfb" - "\xcc\x94\x1f\x64\x22\x5d\xdb\x64\x41\x73\xf8\x1c\xf1\xa1\x6c\x5d" - "\x32\x19\x77\x5e\x76\xd3\x39\xba\xfd\x68\xaa\x0e\x63\x7d\x4b\xcf" - "\x52\x22\x90\x0e\x73\xee\x4d\x25\x20\xbb\x65\x73\x8d\x89\x17\xd0" - "\x27\xe3\x30\x65\x6f\x10\x9b\xef\xb0\x67\x7e\xbe\x1f\xe8\x14\x26" - "\x6c\xff\xfc\x03\x90\x29\xa1\xf4\x45\x68\xeb\x5a\x68\xeb\x79\xa0" - "\xeb\x79\x68\xeb\xcb\x62\x5b\xc5\xd8\x77\x02\xd0\x1f\x9e\x0d\xac" - "\xff\xa4\xb6\xbe\x88\xb1\x60\xde\x8f\xd8\x72\x81\xdc\x44\xef\xc0" - "\x35\x5f\x76\x1e\xb2\xcb\x68\x3b\x4d\xf0\xbb\x4c\x3f\x67\xaf\x8d" - "\x79\x06\xf0\x88\x34\x07\x9b\x00\xf4\x5c\x51\xb9\xc4\x07\xac\x0f" - "\xed\x89\x19\x5f\xb4\x1e\xea\x83\xb4\xbf\x48\x42\xb0\x3f\x03\xed" - "\x67\x14\x21\xfd\x5d\xe3\x4f\x07\x31\x1e\x8c\x05\x1e\xac\x17\x79" - "\xa0\x17\x79\x00\xb6\x22\xe8\x6a\x9c\xe3\x50\x17\xa5\x71\x1e\x0c" - "\x8f\x46\x37\xcf\x18\xe5\xfe\x6a\x71\xdf\x5f\xd5\x2b\xbb\xf9\x18" - "\x52\x86\xbe\x6c\xa9\xff\x9e\x9f\x08\x3d\xd0\x6f\x73\xc4\x7e\x4b" - "\x63\x7e\x2e\xf5\xd9\x16\xd9\xcd\x76\xcf\xfa\xec\x2d\x17\xfe\x49" - "\xfb\x6c\xd0\xd5\xed\xb3\x93\xff\xe2\xda\x67\x27\xb7\xba\xf6\xd9" - "\xc9\x85\x8e\x3e\x2b\x3e\x1b\x95\x3e\x3b\x79\xff\xf7\xd3\x67\x27" - "\xef\x1f\xa0\xcf\xd6\x7b\xd0\x67\xd5\x6e\xfa\xac\xfa\xea\xf5\x59" - "\x75\xc3\xb5\xd3\xb1\xc1\x53\xba\xe5\x03\xe8\xd8\x57\x9d\x74\xac" - "\x1f\xea\xd8\x29\x7b\x07\xea\xaf\x3d\x06\xe8\xaf\x2a\xb1\xbf\xfe" - "\xf6\x6f\x50\xde\xd4\x3d\x55\x8d\x43\xf7\x57\x9b\xc1\x61\x3f\xb9" - "\xed\xb3\x31\xd8\x67\xcb\x88\xd1\xc4\xfa\xec\x4a\xa9\xcf\x1a\xc4" - "\xf1\xce\x20\xfd\x36\xc8\x5d\xbf\xc5\x78\x60\x18\x0b\x6c\xd0\x7e" - "\x2b\xda\x4b\x3d\xd3\xb0\xdf\x96\x5f\x67\xba\xf6\xd6\x75\xae\xfd" - "\xf6\xd6\x12\xd7\x7e\x7b\xeb\x33\x8e\x7e\x2b\x3e\x1b\x95\x7e\x7b" - "\x6b\xec\xf7\xd3\x6f\x6f\x8d\xfd\xe1\xe8\xda\xe0\xdc\x6b\xa7\x6b" - "\x6f\x3b\xc1\xfa\xad\x3b\x5d\x9b\x22\xea\x5a\x3f\xd4\xb5\xd3\xd6" - "\x78\xd6\x77\xa7\xaf\xfc\x27\xef\xbb\x57\x59\xe7\xde\x76\xb7\x6b" - "\xdf\xbd\x6d\xb9\x6b\xdf\xbd\x6d\xa2\xa3\xef\x8a\xcf\x46\xa5\xef" - "\xde\xa6\xfd\x7e\xfa\xee\x6d\xda\x1f\x8e\xce\xd5\x2c\x72\xd7\x77" - "\x35\xd3\x49\x6a\x93\x4c\xb3\xc7\x68\x60\xfb\xf2\x52\x8d\xb6\x9f" - "\x12\xb6\x97\x45\xa6\xa9\x31\xaa\xe7\x12\x61\xfb\xb1\x06\x8c\xd5" - "\x82\x7b\x6a\x7e\xe7\xb4\x67\x85\xaf\xe9\x6a\x2e\x48\x7b\x6e\x8a" - "\xc5\x78\x2e\x83\xed\xb9\xa1\x99\xc7\x62\xf8\x7b\xb7\xf3\x7d\xf2" - "\x99\xc7\x62\xa5\x7b\xe6\x5f\x46\x76\x7b\x08\xcd\x3a\x16\x65\xf6" - "\x3d\x16\xe5\x6e\x9d\xc4\x7f\x2b\xa5\xb8\xcf\xa4\x63\x7a\x42\x68" - "\xc7\x76\x42\x72\xd9\x1a\xc4\xed\x51\xd0\x46\x1e\x0f\xd8\x7f\x6a" - "\x60\x47\xda\x12\x02\x69\x89\x52\x1a\x8b\xc1\x9d\xe6\x43\x05\x78" - "\x46\x73\xd6\xd8\x30\x5e\x1f\xfa\x3e\xbe\xf7\x32\x62\xf1\xf6\x4c" - "\x90\x11\x6c\x0f\x09\x5b\xc7\x9f\x7c\xab\xa5\xa8\x9d\x28\x6a\xd3" - "\xd9\x5e\x3a\xdc\xab\x53\x92\x83\xf8\xf7\xb9\x27\x8f\xca\x15\x44" - "\x28\x5c\xad\xa4\x7e\xbb\x5b\xd9\xde\x62\xc0\x8a\xb4\x7f\x07\xe3" - "\x1a\x0a\xd3\xa2\xcb\x24\xff\xbb\x14\xea\xf7\x61\x32\x9e\x3d\xf5" - "\xa1\x45\x71\x24\x10\x2e\x15\xd5\xef\x6e\xed\xca\xb8\x23\x50\x9a" - "\x3f\x74\xbb\x4f\x1c\xe3\x08\xdf\xaa\x56\x88\x7b\x85\xd0\x0f\x01" - "\xdb\x73\xb8\x43\x2e\x64\xda\x21\x9d\xa6\xa5\x50\x63\xa2\x8d\x04" - "\x00\x2d\x70\x0d\x1f\xe3\x8c\x09\x45\x09\xa1\xdb\xa6\x12\xf2\xa7" - "\xcd\xad\x72\xdc\xcf\x61\xff\x8f\x5b\x2d\xe5\xc9\xf7\xe3\x1a\x3f" - "\x8b\x29\xd0\x22\xbb\xd3\x2f\xfc\x1c\x8f\x19\x0c\xff\x4f\xc1\xb5" - "\x87\xc5\x70\x8f\x6b\xe4\x42\x87\x5a\x81\x79\x5b\x64\x77\x1c\x29" - "\x4f\x38\x45\x02\x74\x44\x99\x03\x6d\xe3\x79\xef\xd8\x89\x79\x4d" - "\xb2\x3b\xd9\x1e\x05\xb8\x2f\xc3\xf9\x72\x78\x8f\xcd\x95\x52\xc3" - "\x6a\x25\x93\x0f\xd9\xbb\x5b\x85\x69\xab\x95\x6c\x2f\x29\xb4\x73" - "\x07\xb4\x19\xf2\xa8\x70\x0f\x0f\xfb\x4d\x26\x81\x3b\x21\x0d\xcb" - "\x81\x5f\x15\xdb\x47\x2c\xbb\x23\x1d\xcb\x76\x7b\xfe\x40\xb5\xbb" - "\x95\x02\xb6\xf9\x79\x1c\xd9\xb1\x26\xd9\x9d\x07\x02\x64\x94\x52" - "\x43\x74\xd9\x36\x9c\xc7\xc6\x3d\xdf\xb8\x8f\x5d\x76\xe7\x1b\x50" - "\xbe\xa2\x98\xcd\xdb\xde\xa9\x33\xc9\xee\x70\xec\x47\x60\x6b\x2d" - "\x77\x56\xe2\x77\xf0\x1d\x31\x3f\xdb\x6b\x8a\x75\xd6\x24\xfb\x50" - "\xb8\xff\x33\xdf\x17\xae\x5c\x0d\xef\x3b\xfc\xff\xf0\xf7\x00\x4b" - "\x77\x56\x00\x36\x99\x6f\x14\xbc\x77\xbb\x4f\x59\xe4\x5b\x0d\x50" - "\xaa\x1f\xef\x24\x8c\x00\x2e\x24\x8c\x60\x7d\xdf\x4d\x36\xc9\x99" - "\x3e\x92\xcd\x60\x31\xb9\x72\x80\x87\xf6\x02\xb5\x82\xcd\x4d\xf7" - "\x20\x5f\x9a\xe0\xd9\x4c\x5f\xe4\xcb\x0e\xd0\x05\x62\xde\x10\x47" - "\xfd\xf1\x7e\x26\xe3\xa7\x00\xbc\xe0\xfb\xa0\x66\x9c\x66\x31\x9d" - "\x40\x66\xe0\xfe\xf5\x8a\x44\xa8\x17\xe2\x16\x30\xf2\xa7\x38\xab" - "\xbc\x28\x81\xa7\x7f\xd8\x6e\x95\xef\x38\x4f\x50\xb6\x10\xfd\x5a" - "\xa2\x00\x3d\xa4\xc0\x32\x69\x70\x74\xd9\x7d\x12\x1f\x37\x03\xef" - "\x12\x00\xbb\x40\xf3\x1d\x40\xbf\xa2\x6e\xb6\x56\x53\x56\x24\x10" - "\x95\x00\xf9\x4c\xb2\x99\x6a\x28\x2f\xb0\xf0\x16\x6a\xc6\x7d\xd6" - "\x40\xc3\xcd\x5d\x19\x33\x2c\x12\x0d\xb1\x4e\xb8\x4f\x5a\x8f\x7b" - "\xff\x65\x33\x74\x1c\x43\x33\xc2\xa4\x36\xbb\xa3\xa7\xfe\x4f\x24" - "\x58\x7f\x2f\x99\x2b\x28\x7b\xd4\xd4\xe7\xd6\x12\x9c\x6f\x7e\xb2" - "\x0d\xfd\x58\xb5\x92\xf0\xd7\xce\x50\xa3\xd9\x4e\x04\xdf\x1e\x35" - "\xae\x43\xd8\xb7\xdd\x33\x29\xfc\x15\xa0\x17\xe8\xfb\x14\x2b\x09" - "\x34\x26\x9b\x79\xec\x41\x72\x89\xd8\x37\x81\x0c\x07\xb9\x0e\x3a" - "\x55\x91\x72\x89\x4c\x41\x7a\x09\x7e\x45\x0b\x81\x66\x47\x9f\x89" - "\x27\xa9\xc3\x93\xa3\x33\xd9\xf9\x67\xb4\x2f\x40\xe6\xcb\x71\xaf" - "\x9e\xd1\x0c\xf6\x89\xbe\x68\xe1\x30\xcb\x71\x7b\xfe\x19\xdb\x2d" - "\xe0\x3c\xb4\xd8\xe6\x70\x6c\xb3\xc5\x4a\x70\x2e\xff\xc9\x8d\xe8" - "\x3f\xb9\x93\x08\x59\x3d\x6a\x6c\x33\xd8\x3a\x95\xc3\x9f\xd3\xff" - "\x51\xc4\x60\xdf\xa6\x40\x6f\x61\xdb\xad\x25\x82\x6a\x77\x25\x7e" - "\x1b\xeb\x80\x67\x7f\x9e\xec\x24\x8c\xee\x48\x7f\xa3\xd5\x4e\xa8" - "\xaf\x73\x1d\x6c\xc3\xad\x83\xfb\xf6\xdf\x4b\x82\xb3\xff\xc4\xf9" - "\x6e\xdf\x26\xd2\x20\x06\xd7\xc1\x76\x57\x62\xcc\x8d\x27\xb1\x0e" - "\xe6\x0b\x64\x31\x68\x1e\xe4\xbf\x51\xdb\x46\xec\x3e\xf7\x4c\xc2" - "\x3d\x07\xc8\xff\x64\x1b\xf0\xff\xb2\x15\x7d\x26\x99\x8d\xa9\x57" - "\x08\xda\x2f\xb6\x0e\xad\xbc\x3f\xff\xef\x3a\xfa\x4c\xe2\x70\xf9" - "\x7f\xd7\x28\xf1\xff\xae\xeb\xa0\xfd\x5a\x2f\xda\xaf\x1d\xa5\xf6" - "\x6b\xaf\x83\xf6\xdf\xed\x45\xfb\xef\x1e\xa5\xf6\xdf\xed\xb6\xfd" - "\x8f\x4f\x11\x28\xdb\x8b\xe2\x9f\xcf\xe2\xd0\x70\x7d\x75\xcf\x21" - "\xdc\x77\xc2\xce\x7a\x89\xf7\x84\x9f\xfd\x52\xf6\xb9\x57\xf5\xb9" - "\x0f\xec\x73\x1f\xd4\xe7\x5e\xdd\xe7\x3e\x58\xba\x07\x3d\x32\xe6" - "\xa2\xec\x9e\xd9\x60\x97\xa6\x9a\x64\xf7\x54\x8b\xcf\x67\xa0\x4f" - "\x31\xd0\xe9\x33\x06\x89\x7f\x79\xeb\x79\xd9\x8f\xd9\x19\x14\xba" - "\x6d\xaa\x96\x6e\x4e\x25\x42\xf6\xda\xf8\x27\xb7\x80\xec\x02\xfe" - "\xd1\x1e\xf5\x58\xb0\x11\x26\xa3\xdf\x3a\xdc\x77\xa0\x89\xc3\xfd" - "\x24\x3f\x9e\x89\xed\xbb\x57\x57\x4e\x04\x9f\x7b\x98\x2d\x28\xe8" - "\xd7\xc6\x9b\x7d\xee\x99\x4a\x77\xed\x59\x92\x23\x17\x94\x39\x69" - "\x82\x66\x8b\x99\x9a\x17\x5d\x02\x39\xd4\x89\xbe\xe4\x81\xc7\xf1" - "\xd4\x5c\x1e\x77\x01\xea\xfb\x63\x7d\x4d\x12\x94\x0d\xdf\x81\x6f" - "\xc1\x38\x6e\xed\x52\x1e\xb7\x7d\x6d\x7c\xad\xa5\x92\x60\x8c\x21" - "\xb1\x4c\x1d\xf5\x5b\xbb\x14\xcb\x1c\xd0\x3e\xcd\xce\x6f\x86\x6f" - "\xfe\xf4\x19\xad\x82\xd0\xad\x8a\xa0\xe1\xf1\xf4\xc7\xfb\xdc\xda" - "\xbd\xd9\x05\x51\xbc\x5c\xa5\x17\xe5\x86\xb8\x8d\x95\x0e\xe5\x8a" - "\xf5\x0d\xf4\xa6\xdc\x48\xf7\xe5\x1a\xc4\xfa\x6a\xbc\x29\xf7\xc0" - "\x20\xe5\x8a\xf5\x0d\xf3\xa2\xdc\x59\x81\xee\xcb\x2d\x14\xeb\x9b" - "\xea\x4d\xb9\x31\xee\xcb\xcd\x6f\xf6\x0e\x0b\xb3\x3e\x18\x0c\x0b" - "\xde\xe1\xe0\xde\x41\xda\x5f\xd0\xec\x1d\x06\xee\x8d\x1a\x0c\x03" - "\xde\xf1\xff\xde\x41\xf9\xef\x1d\xef\xef\x53\x0d\xc6\x7b\xef\xf8" - "\x7e\x9f\x5b\xfc\xa3\x2d\x0f\xbc\x2f\xa1\xfe\x7b\xc2\x84\x9c\xb5" - "\x25\x82\x7f\xfe\x7f\x6e\x13\xc2\xc8\xe3\x20\xc3\x02\xf2\xc8\xc4" - "\x30\x36\x3e\xbe\xcf\xb2\xc5\x40\xe4\x30\xde\x95\xbf\xb3\xb9\x41" - "\x6e\xb4\xcd\x45\x9d\x63\x2f\x4d\xb0\xca\xee\x84\xf4\x43\x80\x2a" - "\x0b\xd8\x9d\xbc\x9c\xb5\x25\x39\xc9\x61\x44\xf4\xa3\x61\xc1\xb3" - "\xcb\xe1\x20\xc7\x8c\x79\x56\xdc\xb7\x32\x11\xde\xb3\x01\x7e\xa1" - "\x0c\x2b\x79\x57\x30\xcb\xc2\xe2\x58\x3e\x33\x3b\xb3\x97\x93\xff" - "\x9f\x34\x45\x8b\xfe\x14\xcd\x2d\xb2\xd0\x67\x7d\xcc\x44\x8e\x7e" - "\x8f\xba\x32\x42\x23\x4c\xb2\xd9\x0b\xc5\x33\xaa\x6d\xcc\xef\x27" - "\xd4\x17\xcf\x7f\x62\x5e\xf4\xff\x79\xaf\x8e\xc8\xd1\x27\x3b\xe4" - "\x4d\x47\x5f\xa0\x83\x9d\xf5\xb6\x67\xef\x4e\xc7\xf7\x69\x36\xe8" - "\xd0\x0b\x44\x8e\xe7\x3b\x69\xf0\x6a\x92\x03\x63\x88\x05\x77\xe3" - "\x9c\x47\x3b\x49\xde\x42\x05\x9c\x7f\xa2\xaa\xa2\xb9\xb8\x37\x8e" - "\xef\x1b\x9f\xad\x29\xe2\xfb\xc8\xad\x2c\xfe\x30\xdc\xb3\x71\x0c" - "\xee\x8d\x51\xad\xd5\xd2\x1c\xbf\xb0\x5a\x4b\x3b\x8f\x87\x29\x9b" - "\x7d\x3b\xfa\x64\xec\x50\xed\x4e\xb5\xa8\x76\x67\x76\x65\xcc\x0e" - "\x96\xda\x80\xdf\x97\xd2\x71\xdc\x86\xf9\xe0\xf9\x3c\xe9\xec\xb7" - "\x9b\x78\xdc\x93\xc2\xd5\xd4\xdc\xeb\x6b\x43\x76\xff\x5b\x48\x7b" - "\xb0\x15\x12\x2d\x29\xda\xe9\x7c\x1e\x63\x76\x25\x8e\x87\xa1\xde" - "\x51\x7c\x6c\xba\x36\x8a\xf9\xe5\x05\x1d\xf0\x8c\x56\x3e\x4c\xbb" - "\x75\x36\xd3\xff\xe5\xd3\x51\x47\xde\x9f\x05\xe5\xff\x0c\xda\xd4" - "\xc6\xc7\x62\x6b\x13\xd9\x99\x47\xd9\xec\x4c\xf8\x46\x22\xdc\x6b" - "\x30\x5f\x93\xec\x7e\x95\xf8\x3c\xd5\xe9\x79\x2a\xee\x95\x14\x9f" - "\x8b\x63\xb9\xb5\xe9\x4e\xcf\xd3\x75\xd3\x71\x6e\xe2\xfe\xa5\xd8" - "\x06\xa0\x63\x24\xea\xb6\x5e\xdf\x21\x7e\x6b\x23\xc5\x7c\xf1\x6d" - "\xb2\xfb\xd7\x75\x00\xb6\xe0\x79\x92\xd3\xfb\x49\x87\x13\x43\xc9" - "\xe3\x85\x48\xc3\xfb\x53\x4d\xf2\xe2\x85\x7c\x3c\x3b\x3b\x9b\xb5" - "\x5d\xb5\x36\xc2\xb9\x3c\x93\xec\xfe\x45\x50\x66\x84\x05\xec\x28" - "\xc8\x13\x8f\xdf\x74\xa6\xb7\x74\xf2\x52\x13\xb5\x6e\xa5\x66\xd5" - "\x86\x97\xd6\xe3\xc9\xb9\xf1\x2e\x7b\x1c\x03\xf1\x6c\xa9\x90\x5d" - "\x1c\x63\xcc\xc3\xb3\x6e\x81\xec\x8c\xf8\x4e\xdc\x37\xe5\x5f\x5a" - "\x62\xcf\x29\x0d\x15\xfc\x8b\x96\x94\x6f\x7e\x8c\x5c\x94\xfd\x84" - "\xf9\x2b\x35\x02\x4a\xb2\xdf\x44\xdf\x1e\x55\x98\xc6\xfc\x19\x61" - "\xac\x29\x36\x66\xdf\xac\x24\x15\x9a\x76\x36\xee\x87\x67\xcf\xb2" - "\x39\x8e\x4e\x22\xb7\xa5\x29\xc9\xff\x49\xae\x93\x7f\x20\x98\xe4" - "\xff\x47\x68\x60\xfb\x74\x0f\xab\x2b\xc9\x7d\x89\x4a\x8c\xab\x28" - "\xff\x08\xc6\xd2\xf8\x1c\x9f\x49\x67\x11\xe0\xfd\x77\xd8\x9e\xdd" - "\x3b\xf8\xff\x29\x79\xf4\xeb\xc3\x6a\xd1\x8f\x85\xec\x27\x32\xac" - "\x2b\xfa\xf8\x68\x93\xfd\x64\x0c\xd6\xcf\x24\xfb\x89\xc2\xc7\x80" - "\x7b\x7c\x89\x0a\xf2\x5f\x12\xf4\xc5\x31\x28\x0f\x6c\x19\xf7\x1f" - "\xa0\x69\xaa\x3f\xe0\xb9\x3b\x83\x78\x16\xaf\x2b\xe3\x27\x8d\x4e" - "\x67\x4c\x55\x1d\x72\xf2\x08\xa4\x99\xa5\xb3\x0d\x18\xfb\xcc\x9d" - "\x7c\xb1\x82\x8d\x77\x25\x38\x3a\x53\x50\x15\x03\x2f\x8a\x63\x2a" - "\xe7\x13\x9c\x77\x91\xe1\x9e\xd9\x36\xd9\x03\xad\xd4\xaf\x38\x22" - "\x19\xfb\x74\x4e\xd1\x92\x3f\xe0\xbe\x3f\xa0\xe3\x5e\xdc\xe7\x07" - "\xb4\x7c\x1b\xee\xab\x16\x96\x11\xcd\xd3\x68\x3b\xcd\x59\xf9\xeb" - "\x28\x6a\xbb\x67\x49\x39\xa9\x6e\x7e\x8f\x7c\x5a\x5f\x49\x54\xcb" - "\x89\x4f\x8a\x89\xda\x59\x1b\xe3\x89\x3c\xdc\x44\x7c\x92\x3b\xb1" - "\x4f\xdb\x09\x9e\x1f\xa8\xb5\xd6\x80\x3d\xb4\xc1\xf2\x4e\x72\xeb" - "\x18\xcd\x93\x84\x40\xdf\x63\x6b\xcc\xec\x9c\x8f\x99\x9d\x9b\xf6" - "\xc3\xf9\x6e\xa7\xf3\x3d\xea\xa4\x48\x2a\x6c\xb9\x40\x94\x35\x31" - "\xa7\x49\x78\xa4\x0f\x65\xe7\x7b\x12\x21\xa3\x19\x78\xff\xb2\xd6" - "\xdf\xfe\xb2\x76\xd2\xae\xcb\x24\xa8\x36\xde\x04\xb6\x59\x25\x29" - "\x88\x23\x41\xb4\x2b\xc6\xb7\xba\xb2\x8a\xd0\xed\xf6\xc0\x77\x93" - "\xcb\xc7\xd8\x95\x7c\x7f\x55\xc0\x56\x19\xce\x6f\xfa\x67\xe3\x3e" - "\xab\xcb\x24\x74\xc5\xd9\x54\x36\x27\x8b\xf3\xdf\xb6\x2e\xad\xa6" - "\xa7\x4b\x7b\x47\xf7\xcb\xda\xe9\xd2\xbc\xf9\xb3\x17\x02\x71\x9d" - "\x20\x82\x66\xfc\xa8\x04\xf7\xf6\xe1\x38\xc0\xe6\x27\x53\xe3\x1c" - "\x39\x62\x18\xbe\x1f\x2c\xac\xd2\x92\xfb\xcc\xec\xec\x11\xce\xdb" - "\x07\x16\x3d\x8f\x75\x6d\x27\x6c\xaf\x90\x2f\xdf\x2b\x64\xc5\x35" - "\x6b\xd5\xee\x86\xc5\x6b\x34\xa4\x7b\x5a\x74\xa6\x31\xf1\x0f\x24" - "\xe5\x0a\xfd\x9a\xd9\xf1\x89\x80\xdb\x8c\x39\x38\xb7\xd7\x70\x44" - "\x7b\x02\xf5\xc9\x9c\xe1\xcb\x87\x07\xd8\xfa\x2f\xd2\x06\xf8\x54" - "\xb2\xb7\x1d\xf9\x56\xb4\xe4\x8f\x71\x66\xf9\x13\xcd\xd4\x56\x13" - "\xf5\x07\xf2\x69\x43\x9d\x0b\x7f\x18\x3f\x21\x1f\xf2\x09\x79\x84" - "\xbc\x72\xf0\xe9\x04\xe3\xd3\x5e\x81\xf3\xa9\x5b\x95\x5f\x22\xf1" - "\xca\x6a\x88\xce\xf3\x84\x5f\xd5\xcd\x03\xf3\x0b\xe8\xdc\xcb\xaf" - "\xfc\x76\x12\x64\x6c\x03\x7b\x19\xf8\xf5\xc4\x53\x84\x3c\xf1\x36" - "\x15\x6a\x16\x1e\xef\xe5\x9b\x2d\xd3\x0d\xdf\xce\x39\xf8\x06\xfc" - "\x1f\x84\x6f\x77\xcd\x18\x0e\xdf\xaa\x9b\x39\xdf\x6c\xe2\x1e\x2f" - "\x6d\x05\x91\x5b\x5f\xd6\xca\xf3\x2e\x93\xb9\xc8\xbf\x45\x67\x35" - "\xe4\xc8\xd2\x1a\xe0\xd9\x7b\x2e\xfc\x13\xf4\xbb\x13\x81\x07\xfb" - "\x90\x87\xde\xf5\xbb\x87\x22\x3d\xef\x77\xff\x72\xf2\x46\xbf\x1b" - "\xad\x7e\xf7\x2f\xa9\x23\xeb\x77\x0f\x85\xdc\xe8\x77\xdf\x77\xbf" - "\x7b\x48\xdb\xb7\xdf\xf5\xda\x0d\x71\xd1\xeb\x56\xae\x59\x8f\xc7" - "\x13\x9f\x7f\x25\x3e\x7a\x13\xb7\x1e\x5c\xec\x07\xb5\x3d\x39\x4c" - "\x8e\x3e\xe7\xaa\xf3\xea\xc8\xbb\x53\xeb\xe4\xf6\x6f\xd5\x0a\x9a" - "\x3d\x39\x52\xc8\x9e\xd2\x8a\xbe\x43\xb1\x7f\xee\x44\xbf\x1e\xb2" - "\x47\xea\x6b\x83\x79\x9c\x4e\xfc\x9f\xd9\x4e\xc1\xab\xd5\xb8\x5e" - "\xb3\x6d\x33\x51\x6c\xc3\x33\xda\x56\x9c\x17\x61\xcf\x1f\x46\x5f" - "\x8a\xb4\x70\xb5\x1a\xfd\xf2\x58\x54\x6b\x35\xe9\x50\x96\xd9\xaf" - "\x38\x46\xa1\xc1\x33\x17\x3f\x33\x80\xed\x53\xd7\xeb\x67\x49\xf6" - "\x08\xa1\x63\x7f\x6a\x46\xb9\x80\x67\xe4\x2e\xca\x7e\x76\xec\x0a" - "\xae\x75\x80\x3d\xfd\xcc\xdd\xf0\x9d\x69\xd1\x79\xcc\xef\x02\xc8" - "\x08\xfe\xfc\x61\x3d\x7e\xff\x4a\x76\x11\xc6\xba\xb1\x74\xa8\x4a" - "\x4b\x3a\xb2\x4b\x43\xab\x92\xf2\x44\x19\xf1\x33\xfb\x13\x79\x5c" - "\x46\xd4\xa8\x01\x83\x8b\x00\x83\x11\x43\xc9\x08\x27\xec\x4d\x1f" - "\x9e\x8c\x40\xac\x21\xe6\x10\x6f\x13\x00\x6f\x88\x41\x09\x73\xbf" - "\x13\x31\x17\xd0\x48\x02\x19\xee\x6c\x1c\x77\x78\xee\xb9\x26\xd1" - "\x81\x39\x7b\x5f\xcc\x5d\xee\x83\x39\xb9\x88\xb9\x97\x5d\x31\xb7" - "\xec\x74\x20\x29\xe0\xb2\xc2\x81\x39\xbd\x4c\x2d\xe1\x0d\xb1\x87" - "\x38\x13\x5e\xd0\x92\x9a\xb6\xf6\x5e\xec\x15\xad\xe6\xeb\xad\x6c" - "\x3f\xaf\x9c\xee\xbb\xf2\xb2\x28\x2b\x2e\x48\xb2\x22\xdf\x8d\x8e" - "\x3e\xed\xa5\xac\x78\x98\xcd\x7f\x23\xaf\xba\x81\x6f\xc8\xaf\x27" - "\xd4\x20\x23\xd4\xff\x49\x3e\x5d\x7a\x9d\xf0\x27\x6e\x74\xf8\x83" - "\xbe\x70\xa1\x2e\x03\xf0\x68\x66\xc8\x50\x3c\x42\xfe\x20\x9f\x18" - "\x7f\x80\x4f\xd2\x9a\x38\xae\x91\x22\xaf\x90\x3f\xf7\x26\x11\x39" - "\xf2\xab\x28\x81\xcb\x07\x94\x03\x6c\x0f\x76\x1f\xf9\x0e\x34\x5f" - "\x8a\x3c\x63\xe3\xea\x34\xbf\x17\x76\xe2\x19\xe2\x49\x92\x0d\xfd" - "\x88\xa6\xbf\x0d\xfd\xc8\x9c\x5e\xbf\x98\xb2\x9f\x95\xf1\xf1\x51" - "\xb1\x78\x8e\x38\xec\x35\xb1\xcf\x13\x1c\xab\xb2\x71\xa9\x1d\xc6" - "\xa5\x2a\x18\x97\x66\xc3\xb8\x34\xb1\x95\xfb\x4f\x90\x3d\xb2\x95" - "\x88\xe7\x99\xa9\x5f\xd1\x5c\x18\x13\x69\x91\x96\x6c\x8d\xd7\x6f" - "\x77\x2a\xae\x49\x51\x3d\x8c\x79\xff\x53\x4e\xe0\x3e\xf3\x88\xd6" - "\x3e\x4c\x1c\x3d\x22\xee\x4d\x3a\x16\xa5\xdb\x8c\xfb\x1b\xc2\x74" - "\xbc\x7e\x3f\xfb\x0d\xa6\xb3\xf5\x3f\xb9\x50\x62\xdf\xe6\xba\xfe" - "\xe7\xbc\x3e\xfc\x6e\xb2\x59\x5c\xfb\x0b\x63\x6b\x7f\x28\x43\x50" - "\xee\xbd\x03\x63\x18\xc7\xfa\xdf\x71\x7c\xfe\x1b\xd7\xf5\xbf\x30" - "\xa6\xef\x4c\xb2\xb0\x74\xdc\xf3\x02\xf7\xe2\x7a\xda\xcf\x22\x9c" - "\xd3\x1d\xeb\xeb\x3c\x5d\x90\xb3\xb8\x2b\x38\x3f\xd0\xc6\xe7\x05" - "\xc2\x0c\xd2\xf8\xdb\x8d\xbd\x34\x0c\xb9\xbc\x20\xd5\x21\x97\x17" - "\xb0\x3d\x00\x54\xbd\x67\x61\x4d\x3f\xb9\x7c\x0a\x9e\xcf\x3f\xf7" - "\x24\xca\xe5\xec\xa2\x30\x5e\xbf\x47\xef\x06\x9a\xf8\x60\xfc\x4c" - "\x4c\xc7\xf3\x46\x28\xa3\x0b\x99\xcc\xde\x33\x37\x9d\xad\xf1\x3f" - "\xba\xd0\x55\x56\xcf\xdf\xeb\x2a\xab\x1f\xdd\x32\xb8\xac\x7e\xfc" - "\xa1\xc1\x65\xf5\xa3\x6f\xdf\x90\xd5\xa3\x2d\xab\x25\xbb\xce\x5b" - "\x59\xfd\xb8\xe2\x86\xac\xbe\xd6\xb2\xfa\x71\xe2\x24\xab\x97\xba" - "\xca\xea\xf9\xd5\xfd\x65\xf5\x7c\x93\x43\x56\x3f\xba\xd4\x55\x56" - "\xff\x62\xb6\x67\xb2\x7a\xc1\xac\xab\x2b\xab\x17\x2c\x72\x95\xd5" - "\xbf\x08\x16\x75\xc9\xa5\xe1\xcb\xea\x05\xf6\xc1\x65\xf5\x2f\xc6" - "\xb8\xca\xea\x05\x0d\x5c\x26\xff\x22\x94\xcb\xea\x05\x6d\xa2\x0c" - "\x37\x3b\xa7\x3b\x64\x35\x4f\xef\x2f\xab\x7f\xb1\x70\x08\x59\xad" - "\xb5\x0b\x92\xac\x6e\x00\x59\xdd\x20\x17\x5e\x70\x27\xab\x7f\x9d" - "\x5e\x83\xb2\x3a\x0e\x65\xf5\xaf\xd3\x07\x97\xd5\x4f\x5c\x40\x99" - "\xcc\xfc\x7a\xbe\x49\x9b\x99\x5f\xc5\x37\x69\x2b\xe2\xf4\xc9\x24" - "\x48\x87\x34\xf4\x3f\x89\xf9\x38\xef\x25\x99\xfe\x0b\x7b\xaf\x4c" - "\x87\x7c\xc2\x14\x87\x4c\x47\x79\x8e\x72\xbd\xf0\x4d\x6a\x2a\x7a" - "\x93\x36\x76\x65\xfc\x72\x86\x24\xdb\xf5\x90\x86\x71\x92\xd0\xf7" - "\x11\xee\x8f\x04\x1a\x34\x6f\x83\xef\x61\x7e\xc8\xb7\xc8\x55\x07" - "\x3c\xb1\xcf\x55\x07\xfc\x72\xeb\xe0\x3a\xe0\x57\x0f\x0f\xae\x03" - "\x7e\xf9\xce\x0d\x1d\x70\xbd\xe9\x80\x5f\x29\x6f\xe8\x80\xa1\x75" - "\xc0\x40\x3c\xea\xab\x03\x66\x89\x3a\xa0\x70\x48\x1d\xf0\x2b\x85" - "\x7b\x1d\xf0\x44\x5d\x7f\x1d\xf0\x44\xb3\x43\x07\xfc\x32\xc2\x55" - "\x07\x2c\x7a\xc0\x33\x1d\xf0\xeb\xd9\x57\x57\x07\xfc\x7a\x89\xab" - "\x0e\x58\xa4\x11\xe5\x54\xa1\xb3\x0e\x10\x7c\x3c\xd1\x01\x8b\x64" - "\x92\x0e\x40\x19\xfb\x0e\xae\x37\xf4\xea\x00\x94\x85\x8b\x7c\xcb" - "\x13\x9a\x9c\x74\xc0\xaf\x1b\xb9\xac\x5f\x34\xc7\xce\x74\xc0\xaf" - "\xcd\x3c\xfd\x17\x06\xe7\x74\x87\x0e\xe0\xe9\x76\x67\x1d\xd0\x8a" - "\x3a\x60\xd1\xa2\x21\x74\x40\xa8\xe7\x3a\xe0\xa9\x46\x87\x0e\x78" - "\xaa\x51\xd2\x01\x28\xf7\x51\x07\xa0\xcc\x46\x3d\xc0\x7c\x83\xb1" - "\x3d\x21\x4f\x2d\x08\x30\x13\x25\xfa\x24\xc6\x39\x15\x94\xdd\xe8" - "\xff\x08\x75\x01\xcb\xb3\x9e\xe7\x01\x79\xde\x0c\x32\xbc\x15\x64" - "\x78\xab\xfe\x22\x51\x40\xbe\x86\x1c\xdc\x5f\x08\xf7\x28\xeb\x03" - "\xda\x40\x6f\xd8\x98\xde\x68\x40\x7d\xc3\xe9\xf5\xd4\x02\x57\xdd" - "\xb1\xf8\xa1\x81\xc6\x03\xb9\x4e\xba\xa3\xe8\x16\x5a\xdf\x95\xb1" - "\x78\xb9\xa4\x0f\x72\xe0\x1e\x75\x46\x6e\x3b\xd3\x19\x26\xd0\x19" - "\xcd\x5c\x67\x2c\x4e\xed\xcd\x03\x75\x60\x79\xb8\x5e\x69\x80\x3c" - "\x8d\x62\x9e\x52\x57\xbd\xf2\x94\xd2\x55\xaf\x2c\x3e\x89\x7a\x05" - "\xfd\xe4\xb2\xf8\xf2\xfa\xe2\x08\x7b\x61\x74\x1e\xea\x18\xfe\x3c" - "\xfc\xf7\xbd\x7a\xe5\x16\x27\xbd\x92\x28\xe9\x95\x27\xc7\x5c\xf7" - "\x7a\x05\xb0\x5c\x93\xf4\xcf\xa4\x57\xc2\x23\xaf\x07\xbd\x82\xbc" - "\x99\xe0\x34\x37\xec\x4e\xaf\xa0\x5f\x89\x9a\xd8\x1f\xba\x5e\x09" - "\x5f\xee\x5e\xaf\x3c\xa5\xed\xaf\x57\x9e\x9a\xe7\xd0\x2b\x8b\xf7" - "\xb9\xea\x95\xa7\xf5\x9e\xe9\x95\xa7\xb2\xfa\xea\x15\xa4\x65\x0e" - "\xdf\x5f\xd1\x86\xfa\xc4\xae\xdf\x9d\x2a\xa0\x6e\xf1\x4a\xaf\x3c" - "\x55\xe6\xaa\x57\x9e\x4e\x14\xf5\xde\x5b\xc3\xd7\x2b\x4f\xb3\xb9" - "\xa3\x1c\x49\xaf\x5c\xee\xab\x57\x9e\x5e\xe9\xaa\x57\x9e\x9e\xc3" - "\xf5\xc7\xd3\xd9\x5c\xaf\x3c\xbd\x50\xd4\x4f\x25\xce\xe9\x0e\xbd" - "\xc2\xd3\xfb\xeb\x95\xa7\x4b\x87\xd0\x2b\xaa\x1e\x43\x74\x5e\x77" - "\x76\x69\xaa\xad\x34\x21\x34\x64\xf9\x6d\xf6\xbe\x7d\x83\xf7\x09" - "\x3b\xc1\x3e\xd2\xbb\xc6\xf5\xbf\x08\xe9\x51\xe5\xe3\x5e\x62\xd6" - "\x37\xba\x83\xa3\x33\x5b\x62\xa1\x7f\xb4\xb9\xef\x1f\xd0\x37\x94" - "\x52\xdf\xa8\x89\x39\x4b\xa0\xbf\xc8\x71\x8d\x2b\x1f\xfa\x85\xd1" - "\xd2\xc0\xe4\x98\xaa\x59\x43\xd0\x9f\xa4\x5f\x1b\x09\xf4\x93\xc9" - "\xc6\xfe\x1a\xa8\x66\x87\x3e\xb2\xe0\x6e\x2a\xdc\xd3\xa8\x21\x7e" - "\x31\xc4\x1f\xfb\xc9\x9f\xc4\x35\x14\xf4\x3f\x81\x6b\x27\x80\xcf" - "\xd0\x15\xc7\x78\xff\xc8\x87\xab\x9b\xf7\x8f\xe9\xdd\x5d\xda\x3b" - "\xdc\xad\x9d\x18\x13\x4d\x6c\xed\x04\xcf\x07\xe1\xb9\x2c\x01\xfa" - "\x07\xc5\xb5\x13\x2b\xef\x13\x50\xdf\xc0\x62\xb6\x76\xd2\xe4\xb2" - "\x76\xf2\xe3\x46\x22\x47\xdf\x14\x05\xce\x6b\x27\xda\x9a\x7e\x7d" - "\x02\xfb\x0a\xf6\x89\xe1\xcb\xaf\xa5\x9a\xc1\xf6\x2f\xd9\x80\xd6" - "\x76\x55\x69\x2a\xcd\xdf\xa3\xfb\x63\x93\x55\x86\x7e\x3c\xed\xc0" - "\x3b\x01\xe4\x14\x55\xf5\x91\x53\x3d\x22\x1f\x7a\x38\x1f\x80\x87" - "\xca\xe7\x2c\x84\xae\xb0\x81\xad\xd5\x23\xfa\xf2\xb4\x9a\x00\x87" - "\xda\x49\x85\x9b\x91\xee\x6a\x52\x28\xfa\xf3\x14\x5e\x8d\xf1\x15" - "\x80\xd6\x34\x4d\x4e\xde\xb9\x6c\x65\x6b\x8d\xd9\xdd\x24\x04\xe4" - "\x92\x1f\xca\x25\xc0\xee\xf8\xe2\x6e\xa0\xfb\xd7\x9c\xee\xe8\x63" - "\x0d\x7f\x6d\xaf\x6a\x35\x50\xf6\x1d\x3d\x3d\x20\x97\xac\x9c\xf6" - "\xcf\x6d\x0c\x24\xcc\x07\x28\xae\x37\x82\xae\xaf\x05\x7e\xa3\x5c" - "\x7a\xd2\x12\x40\x31\x56\x87\xf0\xad\x16\xfd\x4d\x05\xdf\x67\x01" - "\xda\xf7\x68\x11\x1b\x81\x45\x2d\xb8\xde\x78\xca\x65\xbd\xd1\xfc" - "\xaa\x63\xbd\xb1\xb6\xec\x04\xdf\x1f\xe2\xa2\x3b\x9e\x3e\xd0\x53" - "\x18\x9d\x89\x74\x67\xba\x23\x7e\xb8\xb4\x7f\xc6\xf0\xfd\xd1\x3e" - "\xf0\x07\x4e\xfb\xa5\x31\x23\xa3\xfd\xbf\xf5\xf3\x95\x7a\xed\x68" - "\xaf\xfc\x81\xd3\xfe\x99\xe6\x91\xd1\x3e\xc2\x6d\xfc\x3f\xa4\x3d" - "\x8e\x3d\xa4\x71\x87\x34\xe6\x40\x3d\xc6\xf5\xf0\x32\xad\x63\xbc" - "\xb1\x4c\x2b\xad\xdb\x02\xcd\x14\x7a\x71\xbe\x49\xb7\x9a\xdc\x76" - "\x5e\xf6\xdb\x42\x69\xcd\x16\xed\x7d\xc6\xc7\x7c\xe0\xe3\x7a\x3c" - "\xdf\x23\xf2\x10\x74\xce\x0a\x0b\xe8\x85\x69\xd1\x79\x76\x3d\xe8" - "\xa4\x3d\x09\xa1\x6e\xf8\x29\x47\x7d\xe2\x17\x4f\x02\x9f\xd3\x39" - "\xf8\x2a\xbc\x0a\xfc\xec\x06\x3b\xcb\xda\x4a\xf0\xcc\x6e\x40\x2b" - "\xd8\x5f\x3d\x31\xbe\xcb\xc1\x9e\x97\x78\xfa\xa7\x04\x2b\xb3\xb1" - "\x06\xe4\xe9\x2e\x57\x9e\x76\x0c\xc0\xd3\x67\xd7\x40\x3f\x95\x8b" - "\x76\x30\xe3\xa9\xa9\x97\xa7\x4c\x8f\xbc\xaa\x0d\x46\xbe\x4a\x3c" - "\x45\x3d\xc2\x78\xda\xc6\xf5\x48\xaf\x7f\xa3\x57\x1d\x76\x70\x75" - "\xe4\xe9\x01\x78\xfa\x6f\x91\x2e\x3c\x8d\x1c\x2e\x4f\x7f\x1b\xe3" - "\x6a\x57\x2d\x3b\xe1\x99\x5d\xf5\xdb\xb3\x68\x3b\x39\xdb\x55\x78" - "\xdf\x01\x63\x75\xbb\xdf\xee\x74\x8b\x57\xb6\xd4\x6f\x2d\xae\xb6" - "\xd4\xb2\x72\x5e\xa7\xdf\x4c\x1c\xbe\x2d\xb5\x8c\xd9\x5f\xef\xe4" - "\xf3\x31\xb0\xab\x1d\xb5\xec\x6d\x57\x3b\x6a\x59\x12\xb7\x97\x96" - "\xd5\x77\xa4\xa1\x1d\xb5\x2c\x97\xa7\xff\x26\xd0\x39\xdd\x61\x47" - "\xf1\xf4\x0e\xf4\xf9\x96\xb1\xcc\x34\x3c\xdb\x69\xf2\xf7\x6c\x3b" - "\xa9\x07\xb1\x9d\xd4\xff\x24\xb6\xd3\xb3\xcb\x6f\xe8\x6f\x6f\x75" - "\xc8\x32\xcb\xc8\x74\xc8\x73\x6e\xfd\xbf\xdc\xd0\xdf\x43\xd1\xfe" - "\xd9\xd2\x91\xd1\x3e\x72\xa9\xf7\xfa\xfb\xf9\x56\x87\xfe\x7e\xbe" - "\xd5\xbd\xfe\x7e\xfe\xd9\x1b\xfa\x7b\x38\xfa\x7b\x85\x66\x64\xfa" - "\xfb\x79\xad\xab\xfe\x5e\xf5\x7b\xcf\xf4\xf7\xf3\x7b\x46\x5f\x7f" - "\x3f\xbf\xdf\x55\x7f\xaf\x4a\xe5\x75\x8a\x3c\x36\x7c\xfd\xbd\x6a" - "\xa5\x7b\xfd\xbd\x6a\x8d\xab\xfe\x5e\x35\x8f\xeb\xe9\x55\x3b\xb9" - "\xfe\x5e\xb5\x84\xa7\x47\xd6\x39\xa7\x3b\xf4\x37\x4f\xe7\xfa\x7b" - "\x55\xc9\xf0\xf4\x77\xc0\xf7\xac\xbf\x03\x07\xd1\xdf\x81\xff\x24" - "\xfa\x3b\x7a\xb0\x18\x82\x37\x74\xc8\xa0\x3a\x64\xd5\xfe\x91\xe9" - "\x90\xd5\x6e\xe3\x9f\x0d\xad\x43\xd6\x84\x38\x74\xc8\x9a\x10\xf7" - "\x3a\x24\xe6\xad\x1b\x3a\x64\x38\x3a\x24\x3a\x6a\x64\x3a\x24\x26" - "\xd6\x55\x87\xac\x39\xe9\x99\x0e\x89\x39\x37\xfa\x3a\x24\xc6\xea" - "\xaa\x43\xd6\x54\xf0\x3a\xbd\x70\xf3\xf0\x75\xc8\x9a\x3d\xee\x75" - "\xc8\x9a\x77\x5c\x75\xc8\x9a\x54\xae\x2b\xd6\x34\x70\x1d\xb2\x66" - "\x27\x4f\x7f\x21\xc8\x39\xdd\xa1\x43\x78\x3a\xd7\x21\x6b\x9a\x87" - "\xa7\x43\xc6\x7d\xcf\x3a\x44\x39\x88\x0e\x51\xfe\x93\xe8\x90\x17" - "\x07\x3d\xff\x3b\xb8\x1c\x5b\x67\x71\xc8\xb1\x75\x16\xf7\x72\x6c" - "\xdd\x9a\x1b\x72\x6c\x38\x72\x6c\x8d\x75\x64\x72\x6c\xdd\x1c\x57" - "\x39\xb6\xfe\x2d\xcf\xe4\xd8\xba\x3f\x8f\xbe\x1c\x5b\x57\xee\x2a" - "\xc7\xd6\x67\xf3\x3a\xbd\x78\x7a\xf8\x72\x6c\xfd\x3a\xf7\x72\x6c" - "\xfd\x4b\xae\x72\x6c\xfd\x42\x2e\xaf\xd6\x97\x70\x39\xb6\x7e\x39" - "\x4f\x7f\xb1\xd1\x39\xdd\x21\xc7\x78\x3a\x97\x63\xeb\xf7\x0e\x25" - "\xc7\xb0\x5f\xd4\xa8\xfb\xf4\x8b\x17\xa5\x7e\xb1\x31\xf8\x53\x83" - "\xd4\x2f\x36\x32\x1b\x4d\x30\xac\x56\xbf\x9e\x40\x14\xd9\x18\xaf" - "\x05\x64\x84\xee\xb7\xd8\x2f\x74\x6f\xe0\xfe\x12\x55\x23\xc8\xbd" - "\x66\x51\x0e\x26\x82\x1c\x6c\x86\x7b\xf4\x65\x36\x6d\xb5\x1a\xe5" - "\x17\xee\xd3\xc0\x7b\x2e\x0f\xcd\x63\x30\x5e\x0c\x5b\x67\x77\xea" - "\x37\xac\xaf\x74\x88\x7d\xa5\x83\xf7\x15\xe9\xbc\x5c\x52\x33\x15" - "\xec\x9b\xb4\x93\xc2\xa3\x7c\x28\xf6\x1f\x76\x0e\x0b\xfa\x0f\xdd" - "\xa4\xf5\x37\xc4\x41\x9f\x31\xb7\x12\xf4\x57\x8f\x7d\xc6\x6f\xab" - "\xcc\x9f\x76\xc4\xf8\x82\x4c\xe4\xb2\x4f\xa8\x1c\x63\x43\xdf\x53" - "\x9b\x40\xf6\xb5\x83\xec\x6b\x77\xf4\x15\x5c\x3b\xef\xd8\xa4\xd5" - "\x58\x36\x69\xa7\xf7\x74\x80\xec\x33\xf7\xed\x27\x33\x43\x8a\xdb" - "\x51\xf6\xb5\xb2\x7e\xc2\x64\x1f\xf4\x0d\xa1\x03\x64\xdf\x0b\xa2" - "\xec\xeb\xd0\xa2\xac\x0f\x2c\x5e\x0d\xb2\x2f\xf2\x3c\x97\x7d\xa2" - "\x0d\x77\x27\xca\xbe\x4d\x5a\xf9\xef\xda\x45\xd9\xb7\x12\x65\xdf" - "\x11\xe8\x23\x7f\x73\x95\x7d\x7e\xde\xca\x3e\xdd\x72\xd7\x7e\xb2" - "\xf1\xa8\x67\xfd\x44\x77\xd2\x5d\x3f\xe9\xd1\x7b\xdb\x4f\x74\xad" - "\xae\xfd\x64\xe3\x7e\xb1\xef\x76\x0e\xbf\x9f\x6c\xfc\x7d\x6f\x3f" - "\x79\xb1\x6f\x3f\xd9\x58\xe8\xda\x4f\x36\xea\x78\x7f\xd8\x58\xc9" - "\xfb\xc9\xc6\x74\xb1\xff\x58\x9c\xd3\x1d\xfd\x84\xa7\xf3\x7e\xb2" - "\xb1\xfe\xc6\x7a\xf9\x0f\x4d\xdf\x6f\x5a\x72\x63\xbd\xdc\xdb\x31" - "\xe3\xc6\xd6\x91\x8d\x19\xe3\xab\x6f\xcc\xb7\x7b\x4b\xfb\x4d\x79" - "\x23\xa3\x7d\xc2\xc2\x1b\x73\x25\xde\xd2\xfe\xa5\xa0\x91\xd1\xfe" - "\xe5\x8a\xa1\xc6\x18\xee\x6d\xa9\xcd\xba\xea\xde\x31\xc6\x66\x9d" - "\xb4\x3f\xb7\xff\x18\xe3\x95\xb3\xae\x67\xe9\x12\x5f\xea\xbb\x77" - "\x76\xa8\xb1\x87\xed\xc6\xd8\x03\x78\x9d\x90\x3b\xb2\xb1\xc7\x2b" - "\x7d\xf6\x27\xbe\x3a\xcd\x33\x9b\x6a\xf3\x2c\x77\x36\x95\xcd\xeb" - "\xb1\xc7\xe6\x79\xae\x36\xd5\xab\x4a\x11\x1b\x8f\x0e\xdf\xa6\xda" - "\x7c\xce\xbd\x4d\xb5\xf9\x92\xab\x4d\xb5\xb9\x82\xdb\x4e\xaf\x06" - "\x73\x9b\x6a\x73\x03\x4f\x4f\x0c\x73\x4e\x77\xd8\x54\x3c\x9d\xdb" - "\x54\xaf\x6a\x6f\xac\xa3\xff\xd0\x6c\xaa\xa4\xd2\x1b\x7a\xdd\x5b" - "\xdd\xf2\xea\xbc\x91\xe9\x96\xe4\xef\x71\xff\xe7\x0f\x5d\xaf\x27" - "\xb5\x8d\x8c\xf6\x29\x83\xee\xff\x1c\x5c\xaf\xa7\x2d\x74\xe8\xf5" - "\xb4\x85\xee\xf5\xfa\xd6\x83\xae\x7a\x3d\x75\xf1\x0d\xbd\xee\x8d" - "\x5e\x4f\x8e\x19\x99\x5e\xdf\x9a\xe9\xaa\xd7\xd3\x3a\x3d\xd3\xeb" - "\x69\x63\x46\x5f\xaf\xa7\x05\xb9\xea\xf5\x34\x93\x88\x8d\x29\xc3" - "\xd7\xeb\x69\x87\xdc\xeb\xf5\xb4\xa3\xae\x7a\x3d\x4d\x3c\xa7\x96" - "\x66\xe1\x7a\x3d\x6d\x1f\x4f\x4f\x55\x3b\xa7\x3b\xf4\x3a\x4f\xe7" - "\x7a\x7d\x1b\xb9\xb1\xbe\xfe\x43\xd3\xeb\xe9\x49\x37\x74\x8b\xb7" - "\xba\x65\xdb\x08\xc7\x8c\xaf\x59\xbd\xd7\x2d\x99\xa5\x0e\xdd\x92" - "\x59\xea\x5e\xb7\x64\x4e\x71\xd5\x2d\x19\x6f\xdf\xd0\x2d\xde\xe8" - "\x96\xf4\x8a\x91\xe9\x96\xff\xdd\xec\xaa\x5b\xb2\x9e\xf2\x4c\xb7" - "\x64\xae\x1c\x7d\xdd\x92\xa9\x73\xd5\x2d\x59\xf3\x44\x6c\xbc\x34" - "\x7c\xdd\x92\x35\xcd\xbd\x6e\xc9\x9a\xe9\xaa\x5b\x32\xad\x5c\x87" - "\x64\x2d\xe1\xba\x25\x4b\xc5\xd3\x33\xe2\x9d\xd3\x1d\xba\x85\xa7" - "\x73\xdd\x92\xb5\xfc\xc6\xba\xfb\x0f\x4d\xb7\x6c\x1f\x74\xff\xef" - "\xe0\xf2\x4d\x9f\xee\x90\x6f\xfa\x74\xf7\xf2\x2d\xfb\x8a\xab\x7c" - "\x7b\x3d\xeb\x86\x7c\xf3\x46\xbe\x65\xe9\x46\x26\xdf\xb2\x2b\x5c" - "\xe5\x5b\x8e\x87\xfe\x80\xf4\x8f\x8e\xbe\x7c\xd3\xf7\xf1\xff\x90" - "\x23\xfa\x00\x7a\xfd\x99\xe1\xcb\x37\xbd\xdd\xbd\x7c\xcb\x19\xe3" - "\x2a\xdf\xf4\xa2\xff\x9f\x9c\x50\x2e\xdf\xf4\xa2\xff\x9f\xd7\x97" - "\x3a\xa7\x3b\xe4\x1b\x4f\xe7\xf2\x2d\x67\xde\xc8\xd6\xe3\x73\x2b" - "\x1c\xeb\xf1\xb9\x8c\x17\x42\xde\x9e\x85\xfd\xd7\xe3\x73\x1f\xc2" - "\xf5\x78\x47\x7f\xc9\x39\xc8\xd6\xe6\xb1\xcf\x58\xb8\xff\x9e\x01" - "\xd7\xe9\xa7\xec\x59\x78\x63\x9d\xfe\x6a\xae\xd3\xe7\x2a\x5c\xfb" - "\xcf\x1b\x1b\x3d\xeb\x3f\xb9\x5b\x47\x7f\x9d\x3e\x37\xd7\xb5\xff" - "\xbc\xb1\x5c\xc4\xca\x6b\xc3\xef\x3f\x6f\x3c\xec\xbe\xff\xbc\xb1" - "\xc0\xb5\xff\xbc\x21\x8e\x31\xdf\xd0\xf1\xfe\xf3\x46\x08\x4f\xcf" - "\x49\x77\x4e\x77\xf4\x1f\x9e\xce\xfb\xcf\x1b\x49\x9e\xd8\x07\x36" - "\x55\x69\x3a\xea\xfb\x90\xc6\xdb\xec\xbd\x38\x8f\x17\x71\x3e\x90" - "\x7d\xf0\x3c\xd7\x17\xcc\x36\x28\x4d\x98\x33\xa4\x7d\xd0\x2c\xda" - "\x07\x51\xfd\xed\x03\xc9\x36\x30\x00\xbe\xf3\x3d\x5a\xa3\x17\xf1" - "\x8e\xb6\xc1\xe5\xe1\xda\x06\x5a\x87\x6d\xa0\xef\x63\x1b\xbc\xd0" - "\xc7\x36\x60\x78\x6f\x72\xc1\x7b\x3f\xdb\xa0\x17\xef\xa3\x65\x1b" - "\xfc\xbb\xe5\xc6\x1a\xbd\xb7\xe3\xce\x37\x72\x47\x36\xee\xdc\xa9" - "\xbb\x31\x97\xef\x2d\xed\x7f\x37\xc2\xb9\xfc\xdf\xb7\xdd\x98\x6f" - "\xf1\x96\xf6\x3b\x47\xe8\xcb\xe1\x3f\xdc\xc6\x7f\x1a\xda\xbe\xca" - "\x9f\xe3\x18\x8f\xe4\xcf\x91\xec\x2b\xc9\x37\x22\xc8\x67\x85\x3e" - "\x0e\xae\xcb\x84\xbc\x1e\xc7\xe2\x0c\x28\x8d\xcd\x27\x88\x2e\x19" - "\x6d\xae\x5d\x6f\x87\x27\x3a\xdb\x5c\x79\xb3\x24\x7b\x2b\x1c\x6d" - "\x31\xb0\xad\xd0\xae\x92\xc6\x20\xe8\xd7\x6a\xd0\xfd\xc3\x33\x13" - "\xe6\xe0\x98\xa5\xc7\xaf\x34\xfd\x9f\x77\xbc\xf2\xe6\x9c\x91\x8d" - "\x57\x76\xc5\xbb\xda\x5b\xf9\x5f\x7b\x66\x6f\xed\xba\x34\xfa\xe3" - "\x95\x7c\xe2\x6a\x6f\xe5\x57\xf3\x3a\xfd\xc7\xd9\xe1\xdb\x5b\xf9" - "\xef\xb8\xb7\xb7\xf2\xff\xe2\x6a\x6f\xe5\x67\x72\xbb\x2a\xdf\xc4" - "\xed\xad\x7c\x03\x4f\xff\x8f\x66\xe7\x74\x87\xbd\xc5\xd3\xb9\xbd" - "\x95\xdf\xe6\xa1\xbd\x95\x39\x02\x7b\x6b\xee\x0f\xc7\xde\xba\xfb" - "\x3a\xb7\xb7\x0c\x6e\xe3\xbf\x39\xe9\x9d\xf4\x3e\x7a\x67\xce\x0d" - "\xbd\x83\xb2\xa6\x80\x8c\x4c\xef\x14\x9a\x86\xa4\x7d\xb6\x13\xed" - "\x51\xe6\x8b\x74\xb7\xcf\x48\x98\xe3\x35\xed\x41\xd6\x17\x26\xff" - "\x90\xe9\x6e\xd8\x3b\x32\xba\x17\xbb\x8d\x7f\x7c\xc3\xd6\x1a\x8a" - "\xf6\x45\xda\x91\xd1\xbe\xa4\xde\x7b\x5b\x6b\x77\xf9\xa7\xbd\xb6" - "\xd6\xee\xf2\xbe\xb6\x16\xda\x56\x8b\xad\xdc\xe6\x7a\x1d\x6c\xa5" - "\xed\xeb\xc1\xee\x4a\x20\xc4\xd8\x7c\x90\x64\x83\xed\xb5\xfd\x22" - "\xd8\x5f\xb1\x60\x7f\xd9\xf6\x88\xf6\xd7\xee\x07\x5c\xed\xaf\xb7" - "\xde\x19\xd0\xfe\xf2\x73\xd8\x5f\x36\xb0\xad\x7a\xf6\x24\xcc\xc9" - "\xbd\xe8\x64\x8b\xad\xed\x6f\x8b\x75\xeb\x4b\x33\xbb\x67\x26\xcc" - "\xed\x01\x7b\x6c\x30\x5b\x8c\x61\x62\x00\x7b\xec\xff\x0f\x5b\xac" - "\xb8\x64\x64\xb6\xd8\x6e\xe2\x6a\x8b\x95\xae\xf3\xcc\x16\xdb\xbd" - "\xc5\xed\xdc\x97\xd7\xb6\xd8\xee\x6c\x57\x5b\xac\x34\x42\xc4\xcc" - "\x53\xc3\xb7\xc5\x4a\x1f\x72\x6f\x8b\x95\x3e\xea\x6a\x8b\x95\x8a" - "\x67\x4f\x4b\x63\xb9\x2d\x56\xaa\xe5\xe9\x6f\x2d\x71\x4e\x77\xd8" - "\x62\x3c\x9d\xdb\x62\xa5\x89\x1e\xae\x8d\xa5\xdb\x40\xa7\x7f\xff" - "\xfb\x29\x07\x5b\x1b\x1b\xad\xfd\x94\xda\xeb\x7c\x6d\x6c\xcf\xd0" - "\xf3\x5f\x37\x6c\x82\x01\x64\x4d\x69\xf6\xc8\xf4\xd2\x7f\xc7\xde" - "\xb0\x09\xbc\xa5\xfd\x7f\x8d\x70\xee\xab\xac\xd5\x7b\x9b\xe0\x8f" - "\xfb\x1d\xf3\x2f\x7f\xdc\x3f\xbc\xf9\x97\x3f\xde\xed\xaa\xff\xdf" - "\x1e\x58\xff\xdf\x98\x7f\x19\x86\xce\xff\xef\xfd\x23\xd3\xf9\x7f" - "\xb0\xb8\xea\xfc\xbd\x2b\x3d\xd3\xf9\x7f\xdc\x38\xfa\xf3\x2f\x7f" - "\x4c\x75\xd5\xf9\x7b\x17\x89\x38\x89\x1e\xbe\xce\xdf\x3b\xcb\xbd" - "\xce\xdf\xfb\x80\xab\xce\xdf\xab\xe4\xba\x7d\x6f\x24\xd7\xf9\x7b" - "\x83\x79\xfa\xdb\x51\xce\xe9\x0e\x9d\xcf\xd3\xb9\xce\xdf\x1b\x3b" - "\xbc\xf5\xae\x80\xeb\x74\xbd\x2b\xf0\x9f\x64\xbd\xeb\x9d\xe6\x1b" - "\x7a\xc7\x5b\xbd\xb3\x37\x75\x64\x7a\xe7\xdd\x48\xef\xf5\xce\x7b" - "\x21\x0e\xbd\xf3\x5e\xc8\xf0\xf4\xce\x9f\xdf\x72\xd5\x3b\xfb\x66" - "\xde\xd0\x3b\x23\xd5\x3b\x7f\x0a\x19\x99\xde\xf9\x73\x1f\xff\x47" - "\xef\x79\xe8\xff\xe8\xcf\x6e\xfd\x1f\x79\xaf\x77\xfe\xdc\xc7\xff" - "\xd1\x7b\xa2\xff\xa3\x77\xbd\xf0\x1b\xf2\xde\x1e\xf7\x7a\xe7\xbd" - "\x3e\xfe\x8f\xde\x4b\xe5\xfa\xe5\x3d\xd1\xff\xd1\x7b\xa2\xff\xa3" - "\x77\x1b\x9d\xd3\x1d\x7a\xe7\x5d\x27\xbf\x21\xef\xdd\xf0\x7f\xf4" - "\x83\xdb\x87\xb9\x7f\x04\xf2\xef\xaf\x2a\x87\xfc\xfb\xab\xca\xfd" - "\x3e\xcc\xff\xd9\xea\xba\x0f\xf3\x2f\x13\x6f\xec\xc3\xf4\x46\xbe" - "\xbd\x37\x42\xbf\x48\xff\xb3\xc8\x55\xbe\xfd\xf5\x7d\xcf\xe4\xdb" - "\xff\x1c\x1d\x7d\xf9\xf6\x3f\x0d\xae\xf2\xed\xaf\xa5\xbc\x4e\xfb" - "\xbd\x90\x6f\x7f\x7d\xcd\xbd\x7c\xfb\xab\xde\x55\xbe\xfd\x35\x92" - "\xcb\xb1\xbf\x1e\xe0\xf2\xed\xaf\xf1\x3c\x7d\x7f\xa3\x73\xba\x43" - "\xbe\xed\x77\x92\x6f\x7f\xad\x18\xde\xba\xa6\x57\x76\xf5\x35\x58" - "\xd7\x1c\x2d\xbb\xfa\x7a\x5f\xd7\x7c\x7f\xde\x8d\x79\x34\x6f\x6c" - "\xea\xbf\x36\x8c\xcc\xa6\xfe\xdb\x7e\xef\x75\xca\xc1\x3c\x87\x4e" - "\x39\x98\xe7\x6e\x7d\x67\x3b\xe0\x2e\x1b\x6c\xe2\xac\x8b\x44\xf1" - "\x3a\xae\xef\xd4\xd7\x10\x3d\xae\xef\xac\x97\xd6\x77\x0a\x45\x3b" - "\xfb\xa0\x9f\xab\x9d\xfd\x7f\xf5\x03\xd9\xd9\x68\x5f\xdb\xc1\x76" - "\xb6\xf5\x5d\xd7\xf9\xed\xc0\xba\xa8\xdb\xaf\x34\xf3\xca\x9e\x84" - "\xb9\xc3\xd5\x45\x05\x9b\xb9\x2e\xca\xff\xc1\xeb\xa2\xf7\xd3\x47" - "\xa6\x8b\x3e\x68\x70\xd5\x45\x1f\x2e\xf0\x4c\x17\x1d\x7c\x66\xf4" - "\x75\xd1\xc1\x28\x57\x5d\xf4\x61\xa8\x88\x95\xd9\xc3\xd7\x45\x1f" - "\x4e\x74\xaf\x8b\x3e\x9c\xe2\xaa\x8b\x0e\xb6\x71\x9d\xf3\xe1\x7c" - "\xae\x8b\x3e\x24\x3c\xfd\xff\x86\x3a\xa7\x3b\x74\x11\x4f\xe7\xba" - "\xe8\xc3\x25\xc3\x9b\xe3\x19\x77\x9d\xce\xf1\x28\xff\x49\xe6\x78" - "\x3e\xaa\xf4\x5e\x26\x7e\x9c\x5d\xdd\x7b\x7e\xe3\xe3\xec\x7e\xf3" - "\x0c\x09\x60\x6f\xb7\xf3\x75\xee\xde\x79\x06\xd3\x69\x51\xfe\x7d" - "\x2c\x73\x95\x7f\xe5\x6e\xe5\xdf\x60\x6b\xd9\x38\xaf\x60\x07\xd9" - "\x68\x2b\x1c\xc1\x5a\x76\xc2\x0f\x5d\xe6\x7d\x38\x42\xff\xca\x87" - "\xaa\x5d\x65\xde\xe1\x87\x3c\x93\x79\x1f\xff\xca\xad\xcc\xf3\xfa" - "\x1c\xc7\xc7\x11\xae\x32\xef\xf0\x0c\x11\x1f\x0b\x86\x2f\xf3\x0e" - "\x8f\x71\x2f\xf3\x0e\xfb\xb9\xca\xbc\x8f\x4d\x5c\xb6\x1d\x9e\xcb" - "\x65\xde\xc7\x16\x9e\x5e\x3e\xdf\x39\xdd\x21\xf3\x78\x3a\x97\x79" - "\x87\xe7\x0f\x26\xf3\x68\xf6\xda\xcc\x5c\xb9\xb0\x0f\xae\x03\x50" - "\xc7\x29\x80\x8d\x72\xf8\xbf\x12\x78\x3c\x11\xfe\xaf\x73\xd7\xff" - "\xcc\x7e\x6b\x33\x85\x34\xa8\xb3\x9c\xc8\x8c\xe6\xef\xca\xcb\xa7" - "\xda\xb0\xde\xe2\x99\xb5\xb5\x99\x01\xb6\x71\x0b\x05\x1a\x43\x80" - "\x2f\x99\x2c\x36\x26\xe4\xc7\xf3\x41\x9a\x04\xe2\x7f\x51\x76\xb8" - "\x59\xca\x07\xf5\xf5\x6f\x92\x1d\x7e\x0b\xcb\x80\xba\x9a\xa1\x2d" - "\x4b\xdc\xd6\x15\xca\x0a\x7f\x7b\x3a\xd9\x62\xa3\xdf\x96\xaf\x6f" - "\x27\xcd\xb2\x8a\x87\x02\xda\xc6\x2d\xa4\x29\x11\x04\x6d\xb9\x7d" - "\x53\xcd\x0a\x2c\x13\xe3\xe9\xc2\xb3\x60\x7c\x66\x87\x3a\x26\xaf" - "\x23\xf2\x9c\xf6\x71\x4a\x90\x13\x63\x52\x2c\xb4\x75\x83\x0d\xea" - "\x0c\xd8\xfc\x68\x7a\x83\xe2\xdd\x7c\x48\xb3\x13\x35\xc6\x26\xc5" - "\x32\xc0\x9e\x85\xfa\x54\x3c\x5c\x04\xf9\x07\xaa\xc3\x6b\x7f\x22" - "\x21\x63\xee\xa6\xa6\xe1\xe1\xa6\x22\xd7\x1d\x1d\x03\xb6\x4e\x27" - "\xe5\xf7\x00\xed\x34\x44\x3e\xd0\xf3\x61\x7e\x67\xb0\xf3\xef\x4a" - "\x8c\x6d\x9c\xb2\x8b\xc8\x77\x08\xe3\x94\x87\x93\x58\xfc\x61\x73" - "\x57\xc6\x91\x28\x93\xec\x1e\x16\x3b\x14\xe3\x5a\x62\xfc\x77\xc0" - "\x0d\x81\xf4\xa4\x43\x89\x84\xf4\xe5\x45\x5c\xd4\xba\x95\x9a\xf8" - "\x35\xeb\xa2\x37\xbc\x14\xaf\x99\x19\x35\x9e\x2c\xdd\xb0\x41\xb3" - "\x6e\xe5\xfa\x57\x34\xce\x4f\x7e\xaa\x89\x5a\xb3\x69\xe5\xf3\xb1" - "\xd1\xb3\xd6\xad\xd2\x8d\xc7\xcd\x28\x4e\xf5\x08\xc2\xba\x08\x19" - "\x47\x32\x8b\xfe\x9d\x90\xdf\x4d\x22\x0a\xac\x17\x7c\xaf\x4d\x8a" - "\x61\x8a\x31\x3c\xe5\x90\x27\x05\xe4\xe3\x8e\xe4\x71\x90\xb7\xc2" - "\x5a\x0c\xf5\x2a\x82\x7a\x43\x1d\xa1\xce\x7f\x57\x4b\x75\x96\x30" - "\x91\x82\x98\x48\x6e\x07\x0c\xfe\xfd\xa1\x00\xeb\xb8\x5f\x52\x1a" - "\x81\xed\xc3\x7e\x22\x83\xb4\x2c\xa6\xcb\xf4\x6b\x33\xe1\xdd\xa5" - "\x12\xc6\xf0\x5d\x9a\xb3\x76\x49\x17\xf6\x13\x1a\xf3\x73\xde\xa7" - "\x3e\x09\x79\x46\x2b\x23\x3c\x86\xea\xdf\x53\x1d\x31\x54\x3f\x61" - "\x73\xd5\x50\x8f\x36\x48\xcf\x33\x91\x1e\x16\xf3\x18\x63\xff\x62" - "\x2c\x54\xac\x33\xb4\x0b\x74\x29\x2d\xa7\x69\x22\xf6\x33\xdf\x8f" - "\x10\x32\x3f\x37\x19\x15\x97\x49\xb8\x8d\xf6\xd0\xac\xf7\x23\x6a" - "\x2d\x16\x12\xb0\x55\xb7\x8a\x8e\x3d\xb2\x2b\xc0\xb6\x26\x1a\x63" - "\xb8\x0a\x59\x9f\x9b\x68\x56\xdd\xce\x67\xee\x26\x81\x50\xb6\xc5" - "\x29\x96\xab\x62\x78\xfc\xff\x3b\xe3\x3f\xf2\x11\x63\xb4\x72\x3e" - "\x7e\x32\xff\x50\x7c\x7f\x3e\xf6\xe2\xef\x6d\x81\x1c\x01\x2c\x50" - "\x55\x7e\x5d\xb8\x9d\xd3\x11\xfb\x6e\x47\x4a\x0c\xb9\x8f\xd1\xee" - "\x13\x9b\x90\x93\xbf\x4f\xc8\xce\x6f\xa5\xd9\xf9\xf5\x40\xb3\x98" - "\x9c\x04\xa2\x59\x61\x0f\x24\xfa\xcb\x24\xd4\xac\xcf\xaf\xf3\x93" - "\xa5\xca\xc0\x1e\x91\x83\x3e\x09\x05\x99\x11\x2a\xf6\xf7\x18\xa4" - "\xe3\x27\x60\xad\x3d\xb9\x89\x90\x6f\xe7\x11\x9f\x22\x78\x6f\x78" - "\xed\xf9\x84\xe9\x7f\x9a\xf1\x49\x6a\x31\xbc\x8b\x31\x7a\x87\xf7" - "\x7e\xa5\xd2\x6d\xbf\xeb\x6d\x77\xc1\x92\x81\xdb\x5d\x69\x11\x72" - "\x0a\x42\x85\xec\x82\x18\x9a\x5d\xb0\xb4\x7f\xbb\x0b\x96\xf0\x76" - "\x8f\x69\x1f\xfd\x76\x57\x96\xf3\x76\x57\x26\x7a\xd7\xee\xa3\xc4" - "\x83\x76\xbb\xe1\xf7\xd1\x36\x68\x37\xf0\xbb\x00\xf8\x5d\x30\x00" - "\xbf\x0b\x44\x7e\x4f\x68\x1a\xfd\x76\x1f\x3d\xc0\xdb\x7d\x54\xe7" - "\x65\xbb\xdd\xca\x3f\x47\xbb\x0d\x6e\xf8\x5d\xd5\x2c\xe4\x18\x80" - "\xdf\x06\xe0\xb7\x61\x00\x7e\x1b\x44\x7e\x4f\x3c\x3e\xfa\xed\xae" - "\xe2\xfe\x0f\x33\xaa\x62\xbc\x6b\x77\x95\xd9\x83\x76\xbb\xe1\xf7" - "\xa7\x8d\xd0\x6e\xe0\xb7\x01\xf8\x6d\x18\x80\xdf\x06\x91\xdf\x0f" - "\x6e\x1f\xfd\x76\x7f\xca\xe3\x3f\x67\x7c\x1a\xe9\x5d\xbb\x3f\x75" - "\xbb\xff\xc5\xd1\xee\x42\x37\xfc\xae\xae\x17\x72\x0a\x81\xdf\x85" - "\xc0\xef\xc2\x01\xf8\x5d\x28\xf2\x7b\xd9\x63\xa3\xdf\xee\xea\x12" - "\xde\xee\xea\x08\xef\xda\x5d\xed\x76\xff\xbb\x93\x3c\x6f\x00\x99" - "\xdd\x8f\xe7\xc6\xc4\xb9\xe4\xde\xcb\xd8\xfe\xda\xf9\xd4\x2f\xbf" - "\x61\xc2\xd6\x54\x99\x4d\x95\xdf\x38\x01\xc6\x72\x05\x69\x42\x4c" - "\x80\x89\xf8\x42\x5b\x63\x68\x4e\xb1\x0e\x7f\x05\x28\xc7\x06\xb2" - "\xdf\xae\xca\xaf\xef\xce\x5e\x1b\xf3\xfa\x6a\xa2\x49\x31\x93\xc0" - "\xda\x64\x13\x49\xd6\x51\x73\x2d\xf9\x9a\xf8\x99\x88\x1c\xe7\xcb" - "\x3e\x6d\x3b\x40\xd6\xc7\x51\x0a\x65\xcf\xc2\x31\x66\x4e\x0b\x09" - "\x05\x9b\x38\x95\x82\xfe\xc8\x15\x88\x06\xca\x0f\x45\x5a\x42\xd9" - "\x71\x01\x4b\x89\xec\xc3\xe7\xad\x04\xe9\x89\xb4\x85\xf1\x68\x28" - "\xa3\xab\x85\x90\x5f\x2f\xe3\x74\x2d\x58\x3d\x5c\xba\xd6\xf0\xf5" - "\xbf\xec\x7c\xb3\xd1\xd4\x4d\xc0\xb6\x0c\xc4\x33\xf7\x90\xbe\xbf" - "\x56\xd7\x0e\x63\x91\x9a\x08\xaa\xcf\x37\x09\xa0\xb3\x86\x57\x6e" - "\xad\x5b\xff\xd7\x4e\xf2\x34\x02\x64\x66\x3f\xac\x39\xe8\x6d\xdc" - "\x4f\xfd\x0a\x22\x38\xbd\x0b\x96\x4f\x68\x1c\xd3\x3e\x30\xbd\x0b" - "\x22\x6c\xa0\x73\xec\xaa\x82\xa5\x9e\xd3\xdb\x58\xe8\x4a\xef\x82" - "\xd0\x6b\x43\x6f\xa3\x18\xff\xb4\x40\xe7\x4a\x6f\xe3\x0c\x4e\xef" - "\xda\x4a\xaa\x2f\x88\x14\x40\x57\x0e\xb3\xdc\x72\x0f\xe8\x0d\xf8" - "\xee\xaf\xc3\x1c\xf4\x3e\x36\x03\xe8\x2d\xe2\xbb\x00\xf0\x3d\xa1" - "\xc9\x0d\xbd\x01\xdf\x05\x80\xef\x82\x61\xe0\xfb\x98\x5f\x1f\x7a" - "\x5f\x23\x7c\xd7\x89\xf3\x7f\x05\x7d\xf0\x5d\xb7\x93\xd3\xbb\x0e" - "\xc6\xb9\x05\x80\xef\x82\x61\xe2\xfb\x58\xa8\x07\xfa\x03\xf0\xdd" - "\x5f\x77\x3a\xe8\x7d\x7c\x27\xf5\x33\x88\xf8\x36\x00\xbe\x27\x1e" - "\x1f\x98\xde\x06\xc0\xb7\x01\xf0\x6d\x18\x06\xbe\x8f\x6f\x71\xa5" - "\xb7\xe1\x1a\xe1\xfb\x38\xf7\x31\x99\x6d\xe8\x83\xef\xe3\x0a\x4e" - "\xef\x63\x65\x54\x6f\x00\x7c\x1b\x86\x89\xef\xe3\x25\x1e\xd0\x1b" - "\xf0\xdd\x5f\x67\x3b\xe8\x5d\xaf\x00\x7a\x8b\xf8\x36\x00\xbe\x1f" - "\xdc\xee\x86\xde\x80\x6f\x03\xe0\xdb\x30\x0c\x7c\x7f\x76\xa1\x0f" - "\xbd\xaf\x11\xbe\x3f\x3b\x20\xd2\xbb\x0f\xbe\x3f\x8b\xe7\xf4\xfe" - "\x4c\x0d\xf4\x06\x7c\x1b\x86\x89\xef\xfa\x40\x0f\xec\x04\xc0\x77" - "\x7f\x5b\xc1\x41\xef\x13\xf1\xd4\xaf\x50\xc4\x77\x21\xe0\x7b\xd9" - "\x63\x03\xd3\xbb\x10\xf0\x5d\x08\xf8\x2e\x1c\x06\xbe\x4f\x3c\xeb" - "\x4a\xef\xc2\x6b\x84\xef\x13\x62\xfc\xcb\xc2\x3e\xf8\xae\x6f\xe6" - "\xf4\xae\xcf\xa4\xfa\x42\xc0\x77\xe1\x30\xf1\x7d\x22\xd5\x1b\xfb" - "\x64\x53\x21\x51\xba\xd2\xfc\xf3\xd6\xab\x67\xa3\x7c\x7e\xec\xfb" - "\xb1\x51\x3e\x37\x0c\x6c\xa3\x7c\x1e\xc1\x69\x7e\xc2\xe6\x9d\x8d" - "\xf2\xb9\xdb\xf3\x0f\x83\xd9\x28\xfd\x69\xde\xb0\xfc\xea\xd9\x29" - "\x0d\x0b\xbe\x1f\x3b\xa5\x21\x70\x60\x3b\xe5\x8b\x6a\x4e\xf3\x2f" - "\x74\xde\xd9\x29\x0d\x6e\xfd\x1f\x0c\x66\xa7\xf4\xa7\xf9\xc9\xba" - "\xab\x67\xab\x9c\x7c\xff\xfb\xb1\x55\x4e\xa6\x0f\x6c\xab\x9c\x0c" - "\xe3\x34\x6f\x68\xf6\xce\x56\x39\xd9\xe8\x8d\xad\xd2\x9f\xe6\x5f" - "\xce\xbf\x7a\xf6\xca\x97\xb3\xbe\x1f\x7b\xe5\x94\x75\x60\x7b\xe5" - "\x94\x38\xfe\x39\x15\xe1\x9d\xbd\xf2\xa5\x07\xe3\x9f\xfe\xf6\x4a" - "\x7f\x9a\x37\x1e\xb8\x7a\x36\x4b\xe3\x5b\xdf\x8f\xcd\xd2\x18\x3b" - "\xb0\xcd\xd2\xa8\xe5\x34\xff\xb2\xda\x3b\x9b\xa5\xd1\x6d\xfc\x93" - "\xc1\x6c\x96\xfe\x34\xff\x2a\xe4\xea\xd9\x2d\x5f\xdd\xfc\xfd\xd8" - "\x2d\xa7\x4d\x03\xdb\x2d\xa7\x0d\x9c\xe6\xa7\xc3\xbc\xb3\x5b\xbe" - "\x9a\xeb\x8d\xdd\x82\xb4\x46\x9a\xa3\xad\xc2\x69\x6e\xb2\x51\xff" - "\xfc\x7d\x3d\x60\x8f\xf8\x01\xdd\xfd\xda\x88\xbc\x10\x69\xde\xc0" - "\x69\x6e\xf7\x2f\xd6\x01\x7d\x62\x90\x66\xac\x1d\xff\x50\xfb\xdb" - "\xb3\xf3\x1b\xa9\x9c\x40\x5b\x94\xa4\x45\x76\xc6\xd7\x96\x46\xfc" - "\x35\xc9\x5b\xe1\x7f\xd3\x05\xcc\xa3\x49\xce\x38\x0d\x6d\xf4\xc1" - "\x35\x0a\x9b\x7e\x6d\xa0\xdd\xaf\x28\x17\x9e\xfd\x8a\x4e\x5b\x1d" - "\xd8\x03\xb6\x04\x7d\x51\x1d\x64\x6c\xdb\x47\x8c\xb6\x2a\x52\xdb" - "\xf0\x37\x22\xf8\x17\xc7\xdd\x67\x23\x5a\xfa\x0f\x6d\x50\x75\xbc" - "\x89\xd8\x57\xa9\x55\xc6\xc4\x4a\xc0\xc5\x7b\x24\xbc\x95\x5e\xa6" - "\xdf\x68\x55\x3d\x7e\xbb\xeb\xec\x7e\xc5\x4b\xec\xfa\xd2\x3c\x9b" - "\xdf\xee\xf2\x77\x12\x4c\x72\x95\x95\x68\x63\x9b\x29\xcd\x79\x9e" - "\x28\x72\x9a\x88\x72\xc7\xf3\x44\xb5\xa3\x89\x04\x56\x37\x37\x90" - "\x9a\xf3\x95\xa4\xa6\xfd\x24\xa9\xb9\x0c\x57\x37\x5c\x02\x5c\xa9" - "\x27\x49\x75\x1b\x21\x8b\xa1\x96\x29\xcd\xd4\xfc\xe3\x46\x12\x54" - "\x6d\x6b\x20\x9a\xe7\x08\xb9\x28\x3b\x73\x5a\x15\x49\x82\xe8\x37" - "\x6a\x42\x57\xa9\xe5\xf0\x4c\x81\xe9\x46\x9b\x99\x54\x37\x5b\xf1" - "\xf9\x07\xf0\x5c\x91\xd2\x0c\xe5\x0b\x95\xe8\xcb\xd0\x5c\x9d\x7a" - "\x14\xda\x37\x15\xe9\xdc\x2a\xd9\x64\x39\xdd\x24\x74\x07\xb0\x19" - "\x31\x13\x4e\x39\x66\x8a\xbb\x87\x8b\x19\x13\xf7\xff\xfe\xa2\x7a" - "\x12\xd0\x7b\xaa\xf0\x62\x44\xe0\x93\x27\xcf\x50\xdc\x0f\x86\xeb" - "\x33\xb5\x96\x2a\x82\x6b\xd6\xe1\xaf\x10\xb2\xc8\x4e\x08\xd2\x04" - "\xd7\x92\x9f\xd4\x91\x00\xdc\xa7\x26\xfc\x43\x3b\xc9\xd8\x6c\x26" - "\x5b\x6c\x50\xd7\x8b\xd6\xde\xba\xd6\xa6\xd7\x12\x78\x36\xb5\x36" - "\xc6\x44\x54\x3a\x12\x88\x74\x06\x5b\xb4\xe1\xc9\x56\xe2\xbb\xde" - "\x42\x29\xd2\x18\x69\x8b\x74\xc6\xf2\x24\xda\x1b\xa3\xcc\x24\xc5" - "\x4a\x02\x8d\xc9\xf0\x9b\x48\xcd\x46\x72\x89\x98\x64\x67\xcc\xd4" - "\x6f\x2a\x01\x7c\xc4\x23\x26\xe0\x9e\x00\x0e\x26\xd1\x8c\xaf\xf6" - "\x17\x41\x7b\x71\x6d\x7f\x78\x6d\xfe\xda\x93\xf5\x8f\x7e\x36\xa1" - "\x03\xcf\x05\x11\x1c\xcf\xdf\x54\x53\xff\x82\xd0\x1e\xb0\xf5\x38" - "\x9e\xc7\xb4\x0f\x8d\xe7\x82\xe5\x0e\x3c\x7f\x7d\xd2\x81\xe7\x6f" - "\x0e\xba\xc7\xf3\x37\x53\x38\x9e\x0b\x74\xd7\x27\x9e\x9b\xde\x19" - "\x1c\xcf\x4d\xd9\xee\xf1\x5c\x10\x23\xd9\xbb\xa3\x83\xe7\xa6\xe6" - "\x6b\x87\xe7\x82\x08\xef\xf0\xdc\x54\xee\x8a\xe7\xaf\xeb\x38\x9e" - "\xbf\x4e\xf7\x0e\xcf\xdf\xb8\xf5\x7f\x3c\x98\xbd\xed\x84\x67\x51" - "\x3e\xb7\x18\x00\xcf\x20\x9f\x0b\x44\xf9\x3c\xa1\xc9\x03\x3c\x3b" - "\xc9\xe7\xe6\xb7\x1d\x78\x6e\xd1\xbb\xc7\xf3\xd9\x73\x22\x9e\xaf" - "\x53\xf9\x7c\x76\xcb\xe0\x78\x3e\xbb\x7c\x10\x3c\xb7\x4a\x63\x89" - "\xd1\xc1\xf3\xd9\xfd\xd7\x10\xcf\x5e\xca\xe7\xb3\xb9\xae\x78\x6e" - "\x2e\xe1\x78\x6e\x5e\xea\x1d\x9e\x5b\xca\xbc\x19\xcb\x38\xf0\x6c" - "\x10\xe5\xf3\xb9\x58\xea\x6f\x00\xf9\x6c\x10\xe5\xf3\xc4\xe3\x43" - "\xe3\xd9\xe0\x24\x9f\xbf\x7d\xc5\x81\xe7\x73\xcf\xba\xc7\x73\xeb" - "\xfb\x1c\xcf\x86\xeb\x54\x3e\xb7\x2e\x1e\x1c\xcf\xad\x21\xee\xf1" - "\x6c\x88\x91\xc6\x69\xa3\x83\xe7\xd6\xf4\x6b\x87\x67\x83\x97\xf2" - "\xb9\x35\xd2\x15\xcf\xdf\xea\x38\x9e\xbf\x9d\xe1\x1d\x9e\xcf\x25" - "\x7a\x33\x4e\x74\xc2\xb3\x28\x9f\xdb\xe6\x01\x9e\x41\x3e\x1b\x44" - "\xf9\xfc\xe0\x76\x0f\xf0\xec\x24\x9f\xcf\xff\xca\x81\xe7\xb6\x59" - "\xee\xf1\xfc\x8f\x2c\x11\xcf\xd7\xa9\x7c\xfe\xc7\xb4\xc1\xf1\x7c" - "\xde\x36\x08\x9e\x5b\xa5\x31\xf0\xe8\xe0\xf9\x1f\x4b\xaf\x21\x9e" - "\xbd\x94\xcf\xff\x08\x75\xc5\xf3\xf9\x30\x8e\xe7\x73\x16\xef\xf0" - "\xdc\xe6\x36\xfe\xeb\x60\x63\x70\x07\x9e\x0b\x45\xf9\xfc\x9d\x8a" - "\xfa\x17\x82\x7c\x2e\x14\xe5\xf3\xb2\xc7\x86\xc6\x73\xa1\x93\x7c" - "\xbe\x30\xc5\x81\xe7\x8b\x76\xf7\x78\xbe\xf8\x1b\x8e\xe7\xc2\xeb" - "\x54\x3e\x5f\xb8\x30\x38\x9e\x2f\x54\xbb\xc7\x73\x61\x8c\x34\xbf" - "\x30\x3a\x78\xbe\x38\xe3\xda\xe1\xb9\xd0\x4b\xf9\x7c\x91\xb8\xe2" - "\xf9\x42\x20\xc7\x73\x5b\x85\x77\x78\xfe\x4e\x3d\x3a\xf3\x1b\xed" - "\x2a\x9c\xdf\xe8\xc6\xf9\x0d\xc7\xde\xbf\x98\x80\x3a\x8e\xe7\x1e" - "\xc0\x73\x81\x33\x9e\xbf\xec\x3b\xbf\xf1\xdd\x39\xa1\x17\xcf\x97" - "\xfa\xe1\x59\x00\x3c\xf7\x30\x3c\x5f\xba\x59\x9a\xdf\x30\xb6\x95" - "\x00\x4e\xce\x13\xe3\x12\xc0\x72\x8e\x88\xe5\x2f\x01\xcb\x40\x43" - "\x01\x68\x5c\xdd\xd8\x40\xc2\xcd\x9c\x96\xdd\x40\x63\xc1\x19\xc7" - "\xdd\xad\x72\xc4\x2f\xe2\x56\xc2\x70\xcd\x7a\xc0\x6e\xdc\x31\x52" - "\x93\x00\xd7\x66\xb8\x92\xe1\x22\xc7\x48\x75\x2b\x60\x77\x8d\x33" - "\x76\xeb\x44\xec\x9a\xdf\x1e\x1c\xbb\xe6\xcc\x6b\x37\x97\x61\xe6" - "\xf3\x5f\x5f\x46\x04\x86\x3f\x75\x86\x1a\x13\x1b\x44\x7c\x9e\x27" - "\xe1\x36\x12\x40\x97\x69\x27\xa9\x22\x48\xe0\xab\x76\x22\xd7\x3f" - "\x4f\x02\xf5\xa7\xa0\xdd\x52\xff\x6d\x22\xaa\x2a\xeb\xdf\x48\x75" - "\x7b\x03\xa9\xbe\x7c\x94\x54\x0b\x70\x9d\x87\x0b\xea\x1a\x1e\xed" - "\xdc\x6e\xb3\xd8\xee\x4b\x6f\x41\x59\x33\xdc\xb7\xfb\x52\x2a\x6b" - "\x77\x14\xb4\xbb\xdb\xd1\x6e\x23\xf4\x03\xe0\xcf\x54\x41\x9c\x0f" - "\x09\x37\x13\xdf\x0d\x36\x4a\xbb\x45\xfc\x23\x7f\xaa\xea\xad\x24" - "\x5c\x07\x3c\x5b\x05\xf8\x6f\x2e\x23\x29\x49\x80\xff\x6e\x2b\xe2" - "\xce\x6c\x4c\xbd\x02\xf8\x37\x7f\x40\x81\x7e\x3d\x88\xff\x2f\x11" - "\xff\xdf\x99\x04\x86\xff\xef\x76\x7a\x87\xff\x76\x0f\xf0\xef\xc9" - "\x7c\x48\xa7\x0a\xe7\x43\xba\x71\x3e\xc4\xb1\x07\x74\x08\xfc\x3b" - "\xcf\x87\xb4\x3b\xe1\xdf\x32\x08\xfe\x2d\x37\x4b\xf3\x21\xdf\x3f" - "\xfe\x3b\x86\xc0\x7f\xc7\x20\xf8\x1f\xed\xb9\x8f\x8e\x6b\x88\x7f" - "\xcb\x10\xf8\xb7\x78\x80\xff\x82\x08\xef\xf0\xdf\xd1\x07\xff\xed" - "\x22\xfe\xdb\xbd\xc4\x7f\xa7\x27\xf8\xf7\x60\xfe\xc4\x8a\xf8\x07" - "\xf9\x5f\x50\xef\xb4\x17\x78\x28\xfc\x3b\xc9\xff\x4e\x27\xfc\x77" - "\x0d\x82\xff\x2e\x09\xff\xd7\x81\xfc\xbf\x3c\x04\xfe\x2f\x0f\x86" - "\xff\x51\x9e\x2b\xb9\x7c\x0d\xf1\xdf\x35\x04\xfe\xbb\x3c\xc1\xbf" - "\x97\xf2\xff\x72\x1f\xfc\x77\x8a\xf8\xef\xf4\x12\xff\x56\x0f\xf0" - "\xef\xc9\x7c\x4b\x8f\x0a\xe7\x5b\xba\x71\xbe\xc5\xb1\x27\x7c\x08" - "\xfc\x3b\xcf\xb7\x58\x9d\xf0\xdf\x3d\x08\xfe\xbb\x6f\x96\xe6\x5b" - "\xbe\x7f\xfc\x5f\x19\x02\xff\x57\x06\xc1\xff\x68\xcf\xad\x5c\xb9" - "\x86\xf8\xef\x1e\x02\xff\xdd\x1e\xe0\xdf\xe0\xa5\xfc\xbf\xd2\x07" - "\xff\x56\x11\xff\x56\x2f\xf1\xdf\xe3\x09\xfe\x3d\x98\x9f\x11\x10" - "\xff\x20\xff\x0d\xf5\x4e\x67\x03\x86\xc2\xbf\x93\xfc\xef\x71\xc2" - "\xbf\x7d\x10\xfc\xdb\x25\xfc\x5f\x07\xf2\xdf\x36\x04\xfe\x6d\x83" - "\xe1\x7f\x94\xe7\x62\x6c\xd7\x10\xff\xf6\x21\xf0\x6f\xf7\x04\xff" - "\x5e\xca\x7f\x5b\x1f\xfc\xf7\x88\xf8\xef\xf1\x12\xff\x82\x07\xf8" - "\xf7\x60\x3e\x47\x2e\x63\xf3\x39\xdd\x38\x9f\xe3\x38\x23\x32\x04" - "\xfe\x9d\xe7\x73\x04\x07\xfe\xe5\xc4\x3d\xfe\xe5\xe4\x66\x69\x3e" - "\xe7\xfb\xc7\x3f\x1d\x02\xff\x74\x10\xfc\x8f\xf6\xdc\x0d\xbd\x76" - "\xf8\x97\x93\xc1\xf1\x2f\x27\x1e\xe0\xbf\xd0\x4b\xf9\x4f\xfb\xe0" - "\x5f\x10\xf1\x2f\x78\x87\x7f\xb9\x6c\x74\xe6\x7f\xe4\xf2\xfd\x38" - "\xff\x23\xa8\xf2\xeb\x7b\x0c\xab\x03\x85\xec\xdd\x75\x01\x32\x0d" - "\xb1\xa9\x8a\x72\x8d\xf1\x16\xf2\x64\x27\xf0\x44\xd7\x49\x9e\xeb" - "\x0c\xc4\x58\x96\xe5\x14\xc6\xff\x2e\x67\x44\xe1\xb2\x65\x4f\x25" - "\x3b\xd6\x13\x85\xdd\xbf\x38\x0e\xd3\x8c\x2d\x56\x82\x6d\xde\x82" - "\x34\x38\xef\xa0\x01\xce\xc1\xd1\xef\xb4\x81\x45\x69\x90\xa7\xdb" - "\x44\x9a\x01\x2f\xd5\xcd\x26\xa0\xfd\x66\x86\x2d\xe4\x05\xd4\x67" - "\x69\xf1\x45\xa2\xb0\x7d\xa3\x9e\x0a\x3c\x0e\xf2\x7b\x99\xc8\x82" - "\x9b\xa9\x80\xbc\x44\x1e\x21\x5f\x35\x9b\x29\x85\x7c\xef\xd4\x02" - "\xbe\x6d\xdf\x68\xa7\x16\x41\xbe\x51\x9f\x97\x91\xcb\xd9\xfa\x07" - "\xfc\x2e\xaa\x6e\x04\x5a\x6e\x97\x79\xc9\x27\xb9\x27\xe7\x5f\x86" - "\x9e\xa7\x90\x2b\x96\xe3\x3c\x85\xa0\x2a\x58\xea\x19\x9f\x0a\x22" - "\x5c\xce\xb4\x8e\x3a\x9f\x7c\x6c\x9e\xf1\x49\xf1\x8c\x2b\x9f\x46" - "\x79\xfe\x40\xae\xd0\x70\x3e\xf9\x58\x38\x9f\x7c\xe6\x79\xc7\x27" - "\x85\x57\xfb\x7f\xfb\x8d\xa7\xe5\x63\x15\x38\x9e\x06\x3e\x79\xd8" - "\x9f\x0a\x1a\x5c\xce\xe0\x8e\x3a\x9f\xc6\x94\x7a\xc6\xa7\x31\xf6" - "\x3e\x7c\x1a\xdd\x71\xae\x7c\x4c\x25\xe7\xd3\x18\x03\xe7\x93\xa2" - "\xd9\x3b\x3e\x8d\xf5\xe0\xfc\x87\x07\xe3\x3e\xf9\xb8\xbd\x38\xee" - "\x13\x60\xdc\xe7\x19\x9f\x0c\x11\x2e\x67\x86\x47\x9d\x4f\xe3\x16" - "\x79\xc6\xa7\x71\x7b\x5c\xf9\x34\xca\xe3\x31\xf9\x38\x1d\xe7\xd3" - "\xb8\xf9\x9c\x4f\x63\xb3\xbd\xe3\xd3\xb8\x03\xa3\x32\x3e\x91\xfb" - "\x2e\xc5\xf1\x09\xf0\xc9\xc3\xfe\x64\x68\x70\x39\xe3\x3c\xea\x7c" - "\x52\x5a\x3c\xe3\x93\xef\xe2\x3e\x7c\x1a\xdd\x71\x83\xdc\x97\xc7" - "\x03\x96\x2b\xdb\x38\x9f\x94\x73\xbc\xe3\x93\x6f\xe4\xe8\xd8\xd1" - "\xe3\x6d\x68\x47\x0b\x60\x47\x7b\xc6\xa7\xc2\x08\x97\x33\xd9\xa3" - "\xce\xa7\xf1\x06\xcf\xf8\x34\xbe\xd3\x95\x4f\xa3\x6c\xdf\xca\xc7" - "\x97\x73\x3e\x8d\xdf\xc9\xf9\xe4\xdb\xe8\x1d\x9f\x26\x78\xb0\xff" - "\x73\xe0\x73\x58\xfd\x6d\x3e\x55\xd9\xf5\x65\xf3\xa9\x16\x7a\xc6" - "\x2b\xd5\x5b\x57\xd7\xe6\x53\xc5\x72\x5e\xa9\xc2\x38\xaf\x26\x64" - "\x7a\xc7\x2b\x95\x5b\xff\x8f\x43\x9d\xdf\xea\x6f\xf7\xf9\x2f\xbd" - "\xbe\xec\x3e\x3f\x0f\xe5\x9f\xff\xe2\xab\x6b\xf7\xf9\x8b\xf2\xcf" - "\x4f\x94\x7f\x7e\x5e\xca\x3f\x7f\x0f\xe4\xdf\xc0\xe7\xbe\xfa\xdb" - "\x7e\x81\xe4\xfa\xb2\xfd\x02\x4a\x3c\xe3\x55\xc0\x95\xab\x6b\xfb" - "\x05\x54\x70\x5e\x05\xe4\x71\x5e\xf9\x9b\xbc\xe3\x55\xa0\xca\xdb" - "\xf3\x62\xfd\xed\xbf\x89\xd7\x99\xfd\x37\xd1\x43\xfb\x6f\xe2\x55" - "\xb6\xff\x26\x8a\xf6\xdf\x44\xd1\xfe\x0b\xf4\xd2\xfe\x9b\xe8\x95" - "\xfd\xd7\x87\x57\x62\xbf\xba\x29\xe2\xfa\xb2\x01\x27\x59\x3d\xe3" - "\xd5\x4d\x4f\x5d\x5d\x1b\xf0\xa6\x60\xce\xab\x49\x66\xce\xab\x49" - "\x73\xbd\xe3\xd5\x4d\x6e\xe3\xdf\x0e\x75\x3e\xad\xbf\x1d\x78\xb3" - "\xe2\xfa\xb2\x03\x83\x3c\x1c\xff\x06\xd9\xaf\xae\x1d\x18\x24\x8e" - "\x7f\x83\xc4\xf1\xef\x4d\x5e\x8e\x7f\x6f\xf6\x60\xfc\xeb\xc9\xbc" - "\xdf\xe4\x28\xb4\x01\xed\xd9\xf9\xf5\x01\x40\xff\x80\x44\x22\xef" - "\x0e\x06\x7e\xa9\x80\x5f\x5b\x35\xa4\x27\x1b\xf8\x65\xb6\x91\x27" - "\x37\x9e\xa1\xb5\x6d\x76\xd2\x0d\xbc\xba\x02\x76\xa0\xd1\xdc\x8a" - "\x67\xf4\x7e\xd6\x24\xbf\xc5\xbe\x6c\x63\x20\x41\x7e\x21\xfd\xed" - "\xaa\xa9\xa0\xfb\x8a\xe3\x18\xff\x54\xa5\x79\xb6\xec\xe2\x25\x8b" - "\x2f\x9c\xa1\x1b\x4c\x94\xd6\xc4\x58\xd1\x77\x64\x60\x4d\x4c\x03" - "\x09\x6f\x26\xbe\x9a\xa7\x91\x2f\xb7\xbc\x83\xe9\x46\x73\x03\x41" - "\xbf\x9f\x6c\x0e\xfc\x8c\x36\xc8\xf6\x85\x56\x85\xfe\x9b\xf0\x5c" - "\xa1\xe4\xa3\xc9\x78\x3e\x8f\xf1\xbf\xef\x9c\x2a\xe3\xff\x17\xda" - "\xc0\x02\x3c\x9f\x38\xea\xb6\xe0\x2d\x6c\xfe\x4f\x38\xa3\x9e\x2a" - "\xd5\x71\x43\x2c\xa5\x50\xc7\x49\xb5\x16\x33\xc1\x7a\xd6\x5a\xca" - "\x49\x4a\x3c\x09\xac\xed\x6e\x25\xc9\x16\x6a\xae\x4d\x3d\x47\xc2" - "\x3b\x71\x5d\x00\xf1\x74\x4b\x27\xe7\xf7\x2d\x1a\xe1\x8c\x76\x2a" - "\xfc\xb6\xd5\xd6\x11\x12\xb0\x15\x68\x6d\x23\x72\x76\x5e\x53\x4e" - "\x94\x40\xaf\x18\x63\x6a\x13\xd2\xae\xce\x68\x3b\x85\xf4\x8c\x81" - "\xe7\xf3\x7a\xd7\x1b\xfc\x8b\x8f\x63\x1a\xd2\x16\xf7\x99\x1a\x75" - "\x66\x96\x47\x7a\xce\x79\x97\x4a\x8c\x89\xdd\xa4\xd6\x46\x08\xe0" - "\xa3\xfa\xd3\x88\x06\xc0\xd7\xcd\x5e\xca\xed\xc9\xba\xd1\x99\xaf" - "\x9c\x52\x81\x76\xab\x3d\xbb\x60\x29\xaf\xe3\x98\xf6\xa1\xf1\x55" - "\x10\xe1\xc0\xd7\x94\x67\x47\x86\xaf\x29\x7e\xa3\x8b\xaf\xd1\xb6" - "\x5f\xd5\x0d\x23\xc3\xd7\x94\x67\x38\xbe\xd4\xa9\x1c\x5f\x53\x16" - "\x39\xf0\x35\xa6\xfd\xea\xe1\x4b\x1d\xc2\xf1\x35\xb9\xcd\x3b\x7c" - "\x4d\x71\xeb\x87\x76\x78\xf3\xac\xc1\x33\xd0\xd6\x06\x7c\x89\xf2" - "\x6b\x42\x93\x07\xf8\x72\x92\x5f\xb7\x1e\x1c\x19\xbe\x6e\x5d\x37" - "\xca\xf8\x1a\x65\x9b\xfb\xd6\xb9\x23\xc3\xd7\xad\x7f\xe1\xf8\x9a" - "\x6a\xe2\xf8\xba\x75\xaf\x03\x5f\x13\x9a\xae\x1e\xbe\xa6\x66\x73" - "\x7c\x4d\x5d\xe4\x1d\xbe\x82\xbd\xf2\x7f\xd5\x7f\x7c\x30\x3d\x1d" - "\xc7\x07\xf6\x6c\x83\x28\xbf\x26\x1e\x1f\x1a\x5f\x06\x27\xf9\x35" - "\x7d\xda\xc8\xf0\x35\xad\x66\x74\xf1\x35\xda\xe3\x84\x69\x79\x23" - "\xc3\xd7\xf4\x9b\x39\xbe\xa6\x85\x71\x7c\x4d\x57\x39\xf0\x35\xf1" - "\xf8\xd5\xc3\x57\x70\x1b\xc7\x57\xf0\x5e\xef\xf0\x35\xdd\xbd\xff" - "\xe7\x61\xcd\x6b\x6b\x9a\x71\x4c\x03\xf8\x12\xe5\xd7\x83\xdb\x3d" - "\xc0\x97\x93\xfc\xd2\x6c\x19\x19\xbe\x34\xb3\x46\x19\x5f\xa3\x3c" - "\xb6\xb9\xcd\x3a\x32\x7c\x69\x5e\xe2\xf8\xba\xad\x84\xe3\x4b\x13" - "\xeb\xc0\xd7\x83\xdb\xaf\x1e\xbe\x6e\x5b\xc4\xf1\x75\x9b\xca\x3b" - "\x7c\x69\x3c\xf0\xff\xea\xc9\x7c\xfc\x9d\xf3\x71\x1c\x66\xcf\x2e" - "\x14\xe5\xd7\xb2\xc7\x86\xc6\x57\xa1\x93\xfc\xba\xe3\xf4\xc8\xf0" - "\x75\x87\x7e\x74\xf1\x35\xda\xe3\xb1\x3b\x22\x46\x86\xaf\x3b\x4e" - "\x70\x7c\xdd\x41\x38\xbe\xee\xa8\x76\xe0\x6b\xd9\x63\x57\x0f\x5f" - "\xb7\xef\xe5\xf8\xba\x3d\xd6\x3b\x7c\xdd\xe9\x81\xff\x1f\x4f\xd7" - "\x11\x66\x96\x8d\x6c\x0c\x39\xf3\xd1\x91\x61\x6c\xc6\xa5\xeb\x7b" - "\x0c\x39\xe3\x83\x91\x61\x6c\xe6\x43\x1c\x63\x33\xa2\x38\xc6\x66" - "\x86\x5e\x9b\x31\xe4\x8c\x40\x8e\xb1\x3b\xeb\xbc\xc3\xd8\xcc\x51" - "\x5c\xff\xd0\xaa\x46\x36\x8e\xbc\x6b\xcf\xc8\x30\x76\xd7\x33\xd7" - "\xf7\x38\xf2\x2e\xcd\xc8\x30\x76\x57\x21\xc7\xd8\x8f\x2a\x39\xc6" - "\xee\xda\x79\x6d\xc6\x91\x3f\x8a\xe7\x18\xfb\x91\x97\xeb\x36\x5a" - "\xaf\xce\xbf\x0c\xbc\x6e\x73\x8f\x6e\x64\x63\xc9\x7b\x7c\x47\x86" - "\xb1\xbb\xdf\xbf\xbe\xc7\x92\x77\xa7\x8f\x0c\x63\xf7\xc8\x38\xc6" - "\xee\x0e\xe1\x18\xbb\xdb\x7a\x6d\xc6\x92\xda\x06\x8e\x31\x6d\x9e" - "\x77\x18\xbb\x27\x69\xf4\xd6\x9b\x42\xea\x47\x36\x9e\x0c\x59\x37" - "\x32\x8c\x85\x4c\xbb\xbe\xc7\x93\x3f\x6e\x1d\x19\xc6\x42\xa2\x39" - "\xc6\x7e\x9c\xcb\x31\x16\xb2\xfc\xda\x8c\x27\x7f\x3c\x8f\x63\xec" - "\x1e\x9b\x77\x18\x0b\x31\x8d\xde\x3a\xd9\x7d\x73\x47\x36\xa6\xbc" - "\xf7\xd8\xc8\x30\x76\xef\xd6\xeb\x7b\x4c\x79\xef\xa2\x91\x61\xec" - "\xde\xa3\x1c\x63\xb3\x2c\x1c\x63\xf7\x96\x5f\x9b\x31\xe5\xac\x12" - "\x8e\xb1\x59\x91\xde\x61\xec\xbe\xf9\xa3\xb7\xbe\x37\xdb\x30\xb2" - "\x71\xe5\xec\x07\x46\x86\xb1\xd0\xb3\xd7\xf7\xb8\x32\x74\xdf\xc8" - "\x30\x36\x7b\x16\xc7\x58\x68\x04\xc7\xd8\xec\x19\xd7\x66\x5c\x19" - "\xaa\xe0\x18\xbb\xcf\x3b\x7f\x14\xf2\xd9\xfd\xfc\x5f\xad\x59\x9f" - "\xb0\x32\x76\x4d\x94\x66\xcd\xfa\xf8\xb8\x8d\x9a\x4d\x6b\x36\x47" - "\x3f\x3c\xf3\xa5\x10\x4d\x5c\xa2\x26\x6e\xcd\xfa\x17\xc4\x84\xa8" - "\xf1\xe4\xe9\xe8\xd8\x95\x89\x98\x02\xb9\x5f\x58\xbf\x2e\x7a\x7d" - "\xbc\x26\x2e\x7a\xe3\x4b\x6b\xe2\xa2\xf1\xff\x4d\x9a\xd5\x1b\xe2" - "\x20\x61\x55\xf4\x9a\x84\x68\xcd\xf3\x2f\xad\x5e\x1d\x1d\xb7\x69" - "\x3c\x59\xfc\x52\x6c\xfc\x1a\x5d\x6c\xb4\x66\xfe\xe2\x47\x67\x2d" - "\x5d\xf0\xaf\x4b\x1f\x79\x04\x83\x93\x39\xc5\x26\x0b\xa6\xd9\xa5" - "\xb9\x80\x39\x45\x8b\xfc\xa7\x7b\x6a\xc1\x5a\xc4\xf8\xb8\x3b\xda" - "\x49\xe0\xf6\x38\xa2\xc8\x6a\x27\x4a\x7d\x3b\x51\x69\xd6\x92\x30" - "\x9a\x75\xca\x9c\xd3\x4e\x82\x68\xce\x5a\xb5\xa0\xbf\x29\x94\xea" - "\x27\xeb\xcc\xbe\x36\x0d\xa4\x05\x0a\x59\x3d\x4b\xe0\x9d\x20\xa0" - "\xad\x82\xea\xa7\x98\x9a\xe4\x3f\x8d\x32\xfb\xda\x49\xca\x39\x22" - "\xa7\xe3\xef\x6f\xf8\x93\x60\x96\x1f\x8a\x27\xf8\x27\x23\xf2\x9f" - "\x98\xe1\x6a\x24\xf2\x39\xd9\x70\x19\xe0\x2a\x83\xab\x0e\xae\x06" - "\xb8\xda\xe0\xb2\x12\xf9\x03\x0a\xb8\x54\x70\x05\xc1\x15\x0c\xd7" - "\x0c\xb8\x4a\xe0\x2a\x87\x0b\xf2\x3e\xd0\xca\xcb\x79\xc0\x42\xe4" - "\x0f\x6a\xe0\x5a\x08\x57\x24\x91\xff\x0b\xe4\xff\x97\x39\x70\xed" - "\x87\x6b\x11\x5c\x11\x70\x61\x7a\x3a\x5c\xf8\xbe\x95\x3f\x9b\xbb" - "\x1c\xae\x3c\x02\xf5\x1c\xfa\x9a\x7b\x00\x2e\xf8\xee\xdc\x66\x22" - "\x7f\x68\x3e\x5c\x50\xdf\x87\xac\x7d\xf2\x85\x39\xfd\xbf\x7c\x88" - "\x32\x93\x02\xb6\xde\x66\x62\x31\xf0\xe4\x73\x16\xd3\x34\xe2\x43" - "\xb3\xec\x44\x77\x0f\x91\x9d\x97\xcf\x99\x62\x4c\x47\x39\x73\x53" - "\x28\x8b\xe9\x08\xf7\x48\xb3\xae\xed\x73\xd4\x26\xa2\x53\x63\x4c" - "\xb3\xe1\xe1\x6d\x8e\x5a\x7c\x3f\xc2\x24\x53\x29\x59\x0c\xb8\xed" - "\x75\xb9\x34\x25\xa2\x80\xc5\x7e\x03\x1a\xe2\xb9\x2c\x9a\x59\xa7" - "\xa4\xca\x2a\x03\xf6\xf9\xf2\xcd\x58\xaf\x9f\x5c\xe2\xfd\x0b\x9e" - "\x43\xdd\xcc\x7e\x6b\xd5\x50\x4f\x05\xde\xd3\x2c\x9b\xa6\xdb\x6f" - "\xb7\x0e\xff\xbf\x52\x18\x5d\x42\xb3\x77\xe7\xe1\x38\xbb\x3c\xf9" - "\x3f\x49\x13\xbc\xd7\xed\xb7\x67\xae\xe6\xe9\x00\xda\xc4\xcb\x96" - "\x43\x1d\xd2\xa5\xb2\xba\xfd\xd6\x6a\x68\xde\x9e\x48\xaa\x07\x0c" - "\x89\xe5\x09\x50\x1e\xcd\x2e\x0e\x83\x7c\x26\x4c\xa7\x86\xe8\x03" - "\xd2\xff\xf0\xdb\x48\x73\x76\x9b\xf0\x37\x60\x2b\xb1\xb0\xfb\xb4" - "\x30\xc2\x7f\x03\x09\xca\xba\x36\xf9\x03\xaf\xdd\x57\x47\x64\xe5" - "\x4f\x63\xbd\x1f\x58\x92\x52\x47\x05\x4d\xb2\x0f\x7c\xff\x81\xa7" - "\x7a\xbf\x3b\x65\x4f\x04\xc6\x4f\x15\xb6\xcf\x6e\xc5\x18\x7c\xf8" - "\x2e\xd6\x2d\x7f\x12\x51\x14\xff\x3b\x51\x62\x1b\xbb\xb6\x3f\x90" - "\x24\xc5\xa1\xc3\x77\xe4\x90\xff\x89\xa7\x52\xa8\x53\xd9\xbf\xa2" - "\xac\x3d\x3f\x69\xe3\x34\x7d\x60\xaf\x49\xe6\xcb\x62\xe5\x69\xee" - "\x60\xb4\xbc\x24\x3e\x37\x23\x3f\xb1\x7c\x41\x5f\x9a\x8b\xf7\x18" - "\xe7\x2e\x00\x50\xab\x49\x9e\x71\x80\xd3\x68\x77\x1e\x96\x83\xf9" - "\x85\x9c\x22\xf8\x7f\x4e\xae\x00\xed\xb5\xa7\x11\xad\x66\x3d\x09" - "\x6b\x92\x3f\x38\xc5\x9e\x75\x2c\x02\x9e\x43\xbf\x3b\xb6\x1c\xf2" - "\xef\x63\xf4\xd6\x17\x87\x9a\xe4\x0f\xaa\xe0\xd9\xf2\xde\xd8\x97" - "\x9c\xce\x32\x21\xeb\x58\x6c\xd7\xf6\x07\xc3\x4c\x32\x8d\x55\x6a" - "\x03\x93\x71\x8e\x7c\x22\x4f\x1f\x9c\x63\xf6\x3d\x16\xdb\x93\x40" - "\xeb\x76\x9c\x22\x04\xbe\x49\xbb\x2f\xd3\xea\xa4\x25\xd4\x9a\xf3" - "\xbf\x08\xa9\x8e\x6c\x24\x29\x2b\x49\xf0\x84\xad\xd4\x1c\x6e\x27" - "\x01\x13\x1a\x03\x68\xcd\x92\x46\x90\xd1\x9d\x24\xa9\x8e\xb6\xd6" - "\xea\x3e\x20\x49\x67\x89\x6a\xcb\x1a\x12\x94\xb2\x84\x9a\x93\xab" - "\xa9\xd5\x98\xd8\x48\x6a\x2d\x70\xe9\x6a\x20\xdf\x09\xb8\x3e\x20" - "\x29\xaf\x90\xff\xc7\xde\xfb\xc0\x37\x55\x64\x8b\xe3\x27\xb7\x29" - "\xa4\xb5\x7f\x02\x56\x2d\x5a\x31\x60\xd5\xa2\x2d\x54\x17\x5d\x74" - "\x8b\x44\x28\x58\x14\x68\x85\x8a\x55\x10\x8a\xb6\x58\xb0\x40\x2c" - "\x05\x02\x16\x5a\x22\xba\xa5\x16\xa8\x2b\xcf\xad\xd2\x7f\x2e\x75" - "\xb7\x2a\x2e\xd5\x65\x9f\xf5\x7d\xf0\x99\x5d\xaa\xaf\x8b\x40\xba" - "\xfb\xf0\xf3\xed\xbe\x1f\xae\x91\x57\xd9\x3e\xb6\x40\xb4\x81\x84" - "\x36\xc9\xfc\xce\x99\xb9\xb7\xbd\x49\x13\xa4\xca\xba\xff\xac\x5e" - "\x72\xef\xcc\x99\x33\x67\xce\xbf\x39\x33\x77\xee\x8c\x76\x0e\xfa" - "\xd3\x4d\x67\x21\xea\x88\xe9\x2c\xa6\x9d\x82\x92\x5c\xe6\x39\x7c" - "\x88\xe0\x3e\x84\x4c\x8f\x23\x76\xe3\x29\xd0\xd6\xcd\xa7\x6f\xcb" - "\x3e\x85\x7a\xa4\xa5\x37\xfa\xaa\xdc\xf3\xdb\x46\x75\xf5\xac\x65" - "\x1e\x57\xc5\x0f\xa3\xec\xf0\x23\xab\x5f\x5b\x88\x66\x3a\x37\x14" - "\xdb\x4b\x30\xbe\x6d\xf5\xf1\x8b\x3d\xa4\xe7\x3f\x04\xf4\xc5\xa0" - "\xe4\x53\x9e\x23\xba\x1e\xf5\xe7\x87\xc9\x99\x1e\xe6\x22\x78\x6a" - "\x37\xf2\xa8\x40\x6e\x7f\x41\x98\x09\xb4\x58\x87\xc9\xae\xb9\xfe" - "\xa8\x4a\x86\x24\x93\x61\x4a\x7d\x32\xcc\x4e\xbb\x66\x2c\xd7\x0b" - "\x1f\xcf\x9b\x58\x42\xb0\x98\x8e\xf2\xbf\x3e\x51\xd0\xf7\xc3\x62" - "\x4a\x93\x7d\x29\xd9\xed\x16\x1f\xd9\x75\xf9\x41\x93\x37\x7a\x77" - "\x03\x93\x98\x1b\xf5\x79\x12\xeb\x89\x8f\x9a\xe3\x61\x6e\xdf\xb6" - "\xba\x54\xf4\x97\x51\x74\x4e\xaa\x80\x9f\x34\x1d\xf3\x8d\x86\xb5" - "\xfc\x3e\x85\xea\xf1\xd5\xe6\x57\x91\x6f\xcd\x6c\x27\xf8\xe5\x55" - "\xdb\x8b\xd0\xf7\x6e\xdb\x5d\x45\x76\xe8\x8b\xae\xcf\x38\xff\xf2" - "\x6b\x64\x33\xf1\x0c\x75\x8c\x55\x2e\x37\xf6\xe3\xb1\x40\xb8\x5d" - "\x9a\xa4\x65\x58\x9e\x55\xd6\xa5\xca\xb2\x3f\x25\x74\x73\x12\xf1" - "\x4e\x8b\x74\x15\x63\x7a\xf8\x71\x69\x52\x25\x7d\xa3\x89\xcf\x7b" - "\xf8\x59\x92\xd2\xa4\x17\x84\xce\x1c\x34\xf9\x3d\x4b\xc4\x3f\xb4" - "\x49\xf4\x03\x22\xbe\x98\xf4\xf6\x80\x5d\x08\x3d\x16\xf6\x5d\x87" - "\x34\xdd\xde\xed\xb3\x84\xf9\x10\x4e\x73\x5c\xf0\x41\xea\x8d\xf8" - "\x7d\xae\xab\x62\xd2\x31\xbb\x46\x5b\xe8\x27\xcf\x8a\xdf\x55\xd1" - "\xb9\x95\x48\x4b\xd8\x09\xe9\xce\x08\xfc\x1d\x8e\xbf\xd1\x07\xda" - "\xa9\xaf\xe5\x78\x2f\xa3\xfb\x57\xae\x64\x8e\xf4\xd9\x40\x67\x54" - "\x22\xdf\xef\x4c\xb4\xc3\xe2\x9d\x84\xa7\x82\xce\xee\xc4\x34\x82" - "\xc1\xf4\x34\x3b\xe4\x6e\x11\xf8\x27\xda\x9d\xe4\xb3\xfc\xf1\x2f" - "\x11\xf8\x05\x5e\xc2\xa7\xe0\xae\x7d\x89\x75\xcb\xb8\xcb\x14\xdc" - "\xdb\x30\x4d\xc1\x9f\xbe\xa2\xbf\x8e\x06\xac\x23\x4a\xdd\x86\x97" - "\x5f\x62\x4e\xc2\x81\x79\xfb\xed\x50\x90\x47\x79\x5b\x31\x8d\xca" - "\xaa\x74\x2a\xec\x40\x16\xe2\x38\xc4\x71\x74\xda\x61\xa9\x9f\xdf" - "\x40\x1e\x45\x2b\xbe\x56\xe0\xba\x4b\xa7\xe0\x1a\xc0\xa3\xe8\xd4" - "\x27\xd5\xb2\x4c\x09\x6f\x14\xe1\x45\xf8\x49\x76\x78\x6c\xa2\xba" - "\xed\xc8\xf3\x2c\x39\x2f\x1b\xf9\x9e\xac\xa6\x59\xf6\xab\x4d\x58" - "\x5e\x23\xeb\xeb\x28\xf2\x59\x4a\x3e\x9d\xeb\xc9\x2a\x6e\xd3\x93" - "\xdd\xa0\x7f\x04\xb4\x33\x03\xe2\xa9\x09\xf0\x8f\x5a\x82\xf3\x55" - "\xdc\x36\x9d\x9f\x6b\x7a\x25\xeb\x42\x18\xab\xdf\x59\x9e\x12\xdc" - "\x8d\x69\x47\x95\x33\x45\xb7\x23\x8c\x5d\xba\x2d\xe4\x9e\x89\x9b" - "\xc6\x80\x64\xab\xb1\x53\xbc\x4a\x3a\x97\x66\x4b\x70\x82\xad\xc6" - "\x07\xbe\xba\x7c\xab\x71\x13\xb3\x9e\x90\x7e\xf4\x00\x9d\x11\x3d" - "\xb4\x3e\xf0\x47\x7c\xfd\x1f\xeb\xc5\x38\xae\xe4\x36\x7e\x76\xfa" - "\x69\x29\x6d\xb3\xcd\xf1\x15\xb7\x3d\xbc\x5f\x41\xf9\x2f\x62\xdc" - "\x47\xb1\x1f\xc6\xdb\x05\x55\x92\x88\xff\x7c\x08\x5b\x47\xe9\x14" - "\x1b\x62\x5c\x5a\xaf\xca\x63\x75\xf9\x66\xc1\xbb\xb4\x3b\x89\x8f" - "\x9c\x5e\xcf\xbd\x56\xa2\xd9\x57\x93\x6f\xa6\x36\x94\x9a\x99\xcf" - "\xe6\x71\x59\xe9\xac\x5d\xc3\x5a\x8a\x5b\xd3\xae\xc8\xac\x05\x86" - "\xb6\x6d\x1e\x62\x1b\xf8\xf8\x17\x63\xf3\xd3\x8e\x6b\xf3\xcd\x74" - "\xb6\xf2\x8e\x4d\xe1\xba\x69\x35\xcc\xda\x33\x3a\xdf\xea\xaa\x48" - "\x9b\xa4\x9c\x5d\x3b\x34\xbc\x69\x93\x94\xb6\xd7\xc9\x6d\xc7\xba" - "\xf8\x3b\xeb\x09\xd5\xfc\x4c\x6d\x7c\x4e\x0b\xb9\xd6\x09\xfd\x4b" - "\x13\x95\xc5\xb6\x1b\xeb\x15\x3e\x79\x1c\x74\xa6\xf8\x88\x93\xd2" - "\xe4\xf0\xcc\x12\x2b\xf0\x7d\xf2\xb7\xd5\x35\x0d\x91\x2e\xbe\xfe" - "\xe5\x08\x8e\x0b\x32\x3d\x1f\x30\xe1\x17\x27\xa7\xcc\x91\xf1\x51" - "\x9e\x22\xab\x3a\x39\x5e\x1f\x7a\x1d\x93\x27\x5e\x44\xbb\xf4\x41" - "\xda\xf5\xe9\x37\x6f\xd7\xe4\xa6\xc1\xed\xba\x3b\xfc\xd2\xb6\xeb" - "\xee\x90\xeb\xbf\x55\xed\x32\x0c\x6e\xd7\xdd\xbf\xfe\xe6\xed\xba" - "\xbb\x2c\x48\xbb\x3e\xbd\xc4\xed\xea\xbc\x88\x76\xa5\x0e\x6e\xd7" - "\x94\x6d\xdf\xbc\x5d\x53\x72\x06\xb7\x6b\xca\xaf\x2f\x6d\xbb\xa6" - "\xec\x1f\xb2\x3f\xdc\xbe\xdb\x21\xfc\xa1\x71\xc9\xd0\xfd\xa1\x31" - "\x79\xb0\x3f\xbc\xe7\x85\x01\x7f\x78\xcf\xc6\x6f\xe4\x0f\xb7\x2f" - "\x97\x63\x8d\x7b\x66\x0e\xf2\x87\x95\xcb\x53\x83\xfb\xc3\x7b\x6e" - "\xe0\xfe\x70\xdb\xf2\x21\x8e\xa3\x8d\x8e\x7e\x7f\x18\xbd\x3c\xd5" - "\xcf\x1f\xc6\xec\xc6\xfe\xf3\x9e\x8c\x6f\xe6\x0f\xef\xc9\x18\xec" - "\x0f\x8d\x4d\xfe\xfe\xf0\x9e\xb2\xd0\x7a\x58\x9f\x14\xcc\x1f\x66" - "\x7a\xce\x30\xa1\x1b\xf5\x49\x43\xa4\x27\xe4\xfe\xef\xa8\xf3\xcd" - "\x17\xae\xab\xae\x79\x68\x75\x4d\x0d\x39\xff\x85\x63\xc3\x2a\x8c" - "\x41\xf4\x1b\x5f\x05\xe9\x44\x09\x48\x47\x12\x3a\xc0\x66\x76\xc3" - "\x78\x13\xea\x84\x05\xd2\x8e\xd4\x74\xc3\x91\x84\x13\xc0\x22\x0e" - "\x56\xb1\x9f\xaf\x35\x1a\x8b\x48\x37\xa7\x7a\x6d\xc5\xee\x21\xea" - "\xe6\xd4\x36\x45\x37\x8f\x78\x50\x37\xd7\x92\x3e\xa6\xa7\xd8\xba" - "\x4f\xca\xba\x99\x3e\xaa\x5f\x3e\x16\xa1\x9f\x41\x75\x13\x6d\xc2" - "\x5f\x37\xeb\x1a\x84\x6e\x4e\xfb\x62\xb0\x6e\xd6\x35\x04\xd7\xcd" - "\x69\xbf\x11\xba\x59\xd7\x30\xb4\x36\x4c\xab\x1c\xd0\xcd\xba\x06" - "\x3f\xdd\xbc\x71\xad\xd1\x55\x31\xad\xf3\x9b\xe9\xe6\xb4\x4e\xa5" - "\xed\xb5\x72\xdb\x31\x2d\xdd\x5f\x37\xd3\x13\x42\xca\xb0\xfc\xbd" - "\x1c\xf4\x87\x51\x27\xa5\xf4\x6e\x2f\xc6\xb4\xbe\x4a\x4d\x7c\xa6" - "\x97\xb9\xe8\x8c\x76\x26\x4d\x04\xb6\x2e\x29\xca\x85\xe3\x4d\x97" - "\xab\x40\xc7\x22\x0f\x8e\x66\x7d\xf1\x80\xb4\xc7\x32\x57\x52\x0c" - "\xf2\x2c\x11\x7f\x47\xd6\xae\x85\x38\xbc\xe2\x6b\x65\xbe\xe2\x7d" - "\x2a\x5b\x17\x1f\xb9\x7d\x2d\x24\xc7\x3a\x41\x87\x34\xe4\xc4\x6e" - "\xd6\x43\xac\x07\xe2\xe8\x9e\x59\x1a\xd3\xea\xcf\x81\x96\xe6\x1a" - "\x7d\xd1\x58\x9f\x39\x96\xb1\xd5\x49\x50\x5f\x84\xf4\x48\x10\x5f" - "\x2f\xb1\x66\xef\xba\x24\x89\xc5\xec\x7e\x93\x3d\x9d\xc3\x69\xf2" - "\x25\xae\x2d\x43\x1d\x2a\x63\xa5\x05\x54\xaf\x91\xce\x0a\x66\x37" - "\xae\xdd\xc2\x5c\xf1\x91\xdb\xce\x41\x72\xfd\x5a\x48\xac\x5b\x0b" - "\x49\xac\x2f\x49\x42\x1e\xe4\x2c\x7a\x4a\x4f\x72\xc7\x36\x60\x5d" - "\x6b\xb1\x2e\x94\xa5\x77\x1b\xd6\xe5\xc1\xba\xce\x60\x5d\xa7\xb1" - "\x2e\x0b\xd6\x65\x11\x75\x0d\x8d\xe7\xd3\x73\x2e\x34\x27\x9c\xb9" - "\x71\x34\xed\x5d\xfb\xe7\x58\xf3\xf0\x0c\x9a\x1f\xee\x79\xba\x60" - "\x88\xfa\x3e\x3d\xe4\xf7\x3f\x3b\x7e\x09\x09\x4c\xd7\x17\x3f\xe7" - "\xd9\xcf\x58\xa6\x07\xe0\xd9\x5f\x42\x32\xd9\xdc\x11\xf7\x29\xb4" - "\xb3\xbe\xf8\x0f\x93\xba\x87\x58\xd7\x8c\xc4\x50\x75\x55\x58\x58" - "\x7b\x5f\x02\x8d\x17\x77\xb7\xec\x90\x98\xb9\x37\x21\xbf\xf9\xe0" - "\xd1\x5e\x58\x6c\xa6\x39\x68\x66\x36\x3c\x02\xba\xe3\xd2\xac\x8e" - "\xd2\x3f\xd2\x7c\xde\x8c\x26\xff\xf9\xbc\x19\x87\x40\xca\x30\x81" - "\x34\xb3\x01\xa4\xfb\x93\x00\xe1\x02\xae\xdc\xcc\xd7\x47\xc3\x26" - "\x0f\xfb\x33\x8e\x53\xcb\xb7\xe3\x58\x38\x73\x9c\xc6\x6e\x5d\x4b" - "\xf3\x5b\x19\xcb\x90\x7f\x7f\xc1\x3e\x28\x96\xee\x09\x9f\xa9\x08" - "\x2e\x3f\x29\x65\x14\xc4\x3a\x87\x67\x78\xa2\x76\x77\x78\x70\xfc" - "\xd6\x17\xff\x9a\xf1\x7c\xe5\xee\xaa\x3e\x1a\xcf\x3e\x46\x7e\xe0" - "\xde\x25\xb1\x9a\x32\x1c\x6f\x6b\xe2\x19\x8b\xa7\x39\xdb\x9c\x1a" - "\xbc\x48\xf6\x5c\xee\x91\xb6\x56\xd2\x0f\xd2\xc5\x7a\x91\xae\x27" - "\x7d\xdc\x21\xf7\xd9\x8e\xb0\x9b\x73\xc9\x06\xbc\x58\xbe\xf4\x0b" - "\x48\xb0\x1d\xf3\x02\xea\x74\xce\x62\xaf\x8e\xec\x28\xc7\xfa\xc8" - "\x1f\xe0\x04\xb6\xa8\xf4\x4b\x88\x46\x1d\x8a\x22\x7b\xf0\xa1\x3d" - "\x64\x1e\x8b\x75\xa3\x5d\xfb\x36\x9d\x85\x58\xf2\x13\xb4\x2f\xb2" - "\xad\xdb\x0e\xbe\x33\x49\x31\xbb\x56\x42\x9c\xe7\x4c\xc1\x48\xc7" - "\x99\x82\xcb\x5f\xf6\x41\x5c\x8c\x09\xf4\xb5\x2b\x51\x77\x57\xa1" - "\x7d\x9c\x46\xfb\xe8\x16\xf6\xd1\xaf\xaf\xcf\xb5\x96\xd3\x37\x37" - "\xdc\x36\xb6\xc9\xb6\xb1\x0e\xf5\x75\xed\x80\x6d\x78\x56\x25\x49" - "\xb5\x12\x03\xa4\x11\xf9\x3e\xbd\xba\x7e\xd3\x70\xf2\xfb\xa9\x6c" - "\xf4\x52\x03\x8d\xcd\x32\x3d\xcc\xb3\x17\x65\x11\x3e\x4e\x32\xb0" - "\x6d\xbb\x3b\x0e\x66\x75\xc1\xc0\x98\x6e\xd6\x1f\x7b\xaf\xcd\x6f" - "\x36\xcc\x65\x67\x8e\x4b\x19\xb9\x98\xae\x33\xcc\xbf\x49\x8f\x72" - "\xfc\xa3\x18\x03\xce\xea\xa0\x39\x02\xbb\x94\x31\x11\x71\x01\xbd" - "\x97\xf8\x98\xcf\x49\xce\xac\x46\x58\xf0\x22\xcf\x3d\x51\xcb\x8d" - "\xbe\xa8\xdd\x4d\xd6\xe5\xbd\xdc\x36\xfb\x50\x06\x27\x0a\x41\x5a" - "\xdc\x8d\xbc\xf1\x22\x6f\x5c\xdc\x67\x64\x71\x9f\x51\x7e\x30\xbe" - "\xc4\xce\x7c\x99\x79\x61\x0c\xf9\xa2\xb3\x99\xbd\xb0\xc8\x04\x6c" - "\xe3\x29\xe4\x91\xb3\x83\xfc\x4b\x8c\x6f\x9d\xf0\x21\xbb\x90\x3f" - "\xd1\xdd\xa0\x67\x15\x5e\xfd\x2f\x37\xb5\x85\x7b\x51\xcf\xc9\x8f" - "\xc4\x6e\xd6\x44\xa0\xac\x62\x2a\xc9\xce\xd1\xee\x63\x37\x73\xbf" - "\xc6\x65\xeb\x59\x97\x34\xb6\x6f\x5d\x92\x01\xaf\xd1\x8a\xaf\xa1" - "\xb3\xb8\x6a\xc9\xcf\x54\xcc\x00\xf2\x33\x36\xb3\x1d\x3c\xc8\xcb" - "\x18\xea\x97\xd6\x25\x25\x70\x9e\x3e\x81\x3c\x5d\x0a\xba\x09\x6e" - "\xd0\x20\x5d\x7a\xa4\x19\x0e\x17\x1c\x07\xe2\xb1\x17\xed\x88\xf8" - "\xdc\x47\x3e\x08\x75\x0d\xe3\x14\xe3\xec\x65\x06\xf8\x30\xe9\x13" - "\xa0\xbd\x95\x4a\xcf\xb3\xcf\x69\x4e\xd4\x66\xf6\x00\x8b\xde\xdd" - "\xc1\xf8\x3c\x52\xc6\xa4\x83\x59\x6e\x08\xad\xd3\xf7\x8f\x19\xd0" - "\xe9\xfb\xc7\x0c\xe8\xf4\xfd\x06\xfe\x4e\x41\xa5\xd7\xe7\xab\x51" - "\xaf\xa3\xd4\x7a\x7d\xdf\x9d\x7f\x55\xbd\x9e\x33\x74\xbd\x7e\xf9" - "\xb4\x4a\xaf\x37\xfd\x6d\xf4\xfa\xe3\x1c\xae\xd7\x61\x7d\xd7\x72" - "\x7d\xc5\xbe\xfb\x1d\xb0\x4b\xf7\x47\x29\x7a\xfb\xbb\x37\x48\x6f" - "\x67\x65\xfd\xbd\xea\xed\x79\x57\x92\x01\xaf\x4b\xae\xb7\x88\xf3" - "\xa2\xf5\xf6\xe3\x9c\x5e\x50\xf8\x47\xfa\xcb\xca\xfb\xe2\x0d\xa5" - "\x30\x05\xf9\xd6\x11\xbb\x79\x34\x1c\x16\x3c\xec\x30\xcc\x67\x3e" - "\xf4\x11\x5b\x49\x9f\x7a\x2d\x8c\xf9\xa2\xea\x33\x4a\x7f\x0f\x7a" - "\xac\xa3\xca\xe6\x79\x0b\x62\x4d\xf4\x8e\x67\x79\x3c\x8b\x1e\x65" - "\xa7\x77\x41\x48\x8f\x96\xde\xff\x78\xb7\x7a\xc1\x8b\xfe\xc4\xbb" - "\xad\xb1\xca\xb7\xf5\x7f\x1c\xbe\x68\xf1\x8e\x88\x45\x78\x0c\xae" - "\x8a\x59\x1d\xca\xfb\x8b\xa0\xb1\x49\x54\x63\x15\xda\x8b\xf6\x84" - "\x34\xfb\x13\xfc\x95\xf0\xf7\x29\xfc\x0d\xc3\xdf\x7b\x88\x8e\xa1" - "\xf5\x73\xb3\xf9\xf8\x17\xfb\xb2\x4e\xe1\x07\x67\x47\x73\x1b\xbc" - "\x19\xa2\x4f\xca\xf7\xae\x8a\xd9\x05\xca\xfb\x90\x7e\xf8\x7e\x7e" - "\xcc\xd6\x52\xdd\xc8\x13\xad\x78\x47\x23\x9e\x55\xf8\xc2\xf9\x33" - "\x68\x13\xb0\xfd\x59\xf4\x2e\x15\x75\x49\xe3\x62\x05\x77\xcb\xbf" - "\x93\xf9\x3b\x1d\xe4\x03\xc5\x79\xc2\xd7\x8a\x3a\xb0\x5e\x3b\xf6" - "\xc3\x79\xea\x7a\x83\xf1\x03\xf3\x3c\xa1\xf2\x86\xc6\x8b\x39\x21" - "\xd7\x7f\x4d\x4f\xf2\xb2\x21\xe2\x0a\xf9\xfd\x2b\x4b\xc8\x37\x65" - "\x36\x79\xad\xbe\xbe\x9c\xd8\x0f\x4b\x4e\x0d\x31\x2e\x99\x13\x72" - "\xfc\xeb\x8d\xaa\xcf\xcd\x1c\x37\x1a\xbc\x35\xf9\x26\x9a\xeb\xa4" - "\x58\xeb\x48\x92\x07\x28\xde\x7a\x7d\xb9\x5d\xea\xc3\x98\x31\x06" - "\xed\x71\x8e\xf3\x03\xb6\xe3\x24\xc6\xa8\xeb\x72\x62\xb7\x2f\x87" - "\x34\xcf\x99\xf8\xc8\xe7\xd1\x07\xf5\xa2\x3f\xe8\x3d\x53\x10\x7b" - "\xc4\xe4\x06\x5f\x6d\xbe\xc9\xe6\x69\x83\x7a\x84\x23\xff\x4b\xf4" - "\x9e\x3f\x93\x13\x53\xb1\x12\xf8\xbb\x0d\xeb\x63\x6f\xa0\xff\xcd" - "\x7c\x3f\x7c\x23\xfa\x1c\xf4\x19\xdc\x0f\x7f\x03\x1f\xdc\xfb\xcc" - "\xcd\xb9\xb3\x17\x32\xf7\x91\x63\x7f\x80\xd2\xc3\xa0\x2f\x5d\x03" - "\xd1\x84\xdf\xe6\x39\x2c\xfc\xf2\xc3\xe8\x97\xf1\xb9\x4e\xe5\x97" - "\xf9\x9c\x7a\x80\x5f\xa6\xf8\xfb\x48\x67\x17\xc4\x38\x61\xf8\x1c" - "\x67\xac\x7b\x93\x93\xf9\x28\x1e\xa7\xf7\x28\x08\x13\xa3\xf8\xe8" - "\x57\x30\xee\xe8\x5b\x25\xfc\x73\xad\xec\x9f\x5f\x39\xfd\xed\xfd" - "\xf3\x2b\x16\xf4\xcf\x18\xef\xbd\x4c\xbe\x19\xfd\xf2\x9e\x13\x0e" - "\xc9\x83\xbe\x78\x68\xb2\xcd\xaa\x0e\x25\xdb\x39\xd8\x7f\x92\x4c" - "\x49\x77\x0e\x37\x79\xe8\x1d\xff\x9f\xbd\x31\xaf\x34\x53\xff\xd8" - "\x8b\x7d\xe3\xeb\xcb\x3b\xa4\x18\x33\xca\xd6\xf4\x01\xf3\xac\xce" - "\x89\x65\x7d\x39\xd1\xde\xca\xfa\x5c\x4f\x5f\xbc\xae\xaf\x0f\xe5" - "\x8b\xfe\x02\xfb\x2b\xbd\xe3\xe9\x02\xce\x13\xdf\xb5\xf9\x26\xdf" - "\x73\xb7\x34\x60\xdf\x34\xa9\xee\x34\x4c\x64\xdb\x5e\x69\xf7\x6c" - "\x7b\xe5\x58\xdf\xb6\x57\x8e\xa2\x5e\xc6\x60\xfc\x88\x32\x3f\x6f" - "\xf5\x6d\x7b\xc5\xe1\xdb\x5e\xdb\xec\x8d\xae\xcf\x75\x44\xbf\xd2" - "\x81\xcf\x5d\xbe\xa7\x51\x0f\x36\x90\x1e\x7c\x08\x86\x39\xd4\x0f" - "\x3f\xf0\x61\x30\x3d\x78\xd9\x32\xb4\xbe\x78\x76\x0e\xea\x41\x07" - "\xea\xc1\x97\x6a\x3d\x78\x9f\xce\x38\x14\xba\xf0\xa0\xd0\x05\xe4" - "\x3b\x1f\xcb\xf4\xf7\xd3\x73\x0f\x06\xd7\x87\x63\x17\xa7\x0f\xbd" - "\x67\xfc\xf5\xa1\xe6\x1b\xea\x03\xf6\xaf\xf1\x75\x38\x6e\x3a\x7f" - "\x26\x49\xaa\x21\x7d\xf8\x64\x40\x1f\xde\xfc\x93\x43\xea\x1b\xb2" - "\x3e\xcc\x0d\x79\xfe\x57\x70\x7d\xd8\x95\xfa\x2d\xf5\xc1\x3d\xa0" - "\x0f\xbb\xb2\x3c\xdb\x76\x2d\xec\xdb\xb6\x2b\x7b\x40\x1f\xce\xa2" - "\x3e\xec\x32\x0d\xe8\xc3\xae\x1c\x7c\x2e\x18\xac\x0f\xf3\x3e\xf9" - "\x6e\xf5\x21\xfc\xab\x7f\x0d\x7d\xc8\x0e\x39\xfe\x0d\xa1\x0f\xdf" - "\xd2\x3f\x24\x67\xa9\xf4\x01\xfd\xc3\x2e\xf4\x0f\xbb\x54\xfe\xe1" - "\x14\xe9\x83\xca\x3f\xec\x42\xff\xb0\x2b\x88\x7f\x78\xf0\x8b\xef" - "\x56\x1f\x2e\x3b\xfe\xaf\xa1\x0f\xf3\xdb\x86\xa6\x0f\x35\xdf\xd2" - "\x3f\x24\x37\x0d\xe8\x43\x0d\xfa\x87\x1a\xf4\x0f\x35\x2a\xff\xf0" - "\x29\xea\x43\x8d\xca\x3f\xd4\xa0\x7f\xa8\x09\xe2\x1f\x1e\x3a\xfb" - "\xdd\xea\xc3\x88\x3f\xfc\x6b\xe8\x43\x4e\xc8\xf9\xef\x10\xfa\xf0" - "\x2d\xfd\x43\x0a\xa8\xf4\x01\xfd\x43\x0d\xfa\x87\x1a\x95\x7f\x78" - "\x9f\xf4\x41\xe5\x1f\x6a\xd0\x3f\xd4\x04\xf1\x0f\x8f\x84\x7f\xb7" - "\xfa\x70\x47\xc5\xbf\x86\x3e\x3c\xd2\x35\x34\x7d\xa8\xfd\x96\xfe" - "\x21\x25\x67\x40\x1f\x6a\xd1\x3f\xd4\xa2\x7f\xa8\x55\xf9\x87\x8d" - "\xa8\x0f\xb5\x2a\xff\x50\x8b\xfe\xa1\x36\x88\x7f\x58\x78\xc5\x77" - "\xab\x0f\x0b\xa6\xfe\x6b\xe8\xc3\x42\xf7\xd7\xe9\x83\xa2\x0b\xa4" - "\x17\xa4\x0b\x7d\xa5\x39\x40\xe3\x8c\xd7\x4f\x0a\x7d\x20\x3d\xe0" - "\x3a\xd1\x93\x13\xeb\x45\x5d\xf0\x3c\x8d\xba\xd0\x2b\x74\x81\x78" - "\x41\xfa\x40\xe3\x0a\x1a\x4f\x90\x4e\x78\x71\x4c\xe1\x89\xc6\x31" - "\xc5\x66\x6d\x1c\xe9\x41\x6f\xd4\xd7\x8c\x2b\x7a\x81\x8f\xfd\x68" - "\x8c\x77\x5a\x5a\x74\x6d\x30\x3d\x78\x65\x88\x73\x7c\xfd\xe3\x4b" - "\x3f\x3d\xf8\x70\x40\x0f\x1e\x0e\x31\xae\x98\x1f\x42\x0f\xec\x17" - "\xa1\x07\xa7\x07\x8f\x33\xbf\xad\x1e\xf4\xae\x92\xf5\x80\xc6\x99" - "\x3e\x79\x9c\xf9\x18\x8e\x33\xa3\x87\xaa\x07\x8b\xe1\x9b\xe9\x41" - "\x4d\xea\xd0\xf4\x20\xb9\x89\xe2\x04\xa1\x07\x35\x0b\x3d\xd1\x18" - "\x2b\xf8\xe9\xc1\x05\xe2\x05\x3f\x3d\xc8\xbd\xe1\xbb\xd5\x83\x80" - "\x78\xe1\x9f\x56\x0f\x96\x84\xdc\xff\xd5\x87\x72\x27\x7f\x4f\xf3" - "\xf6\xf4\xed\x46\x8c\x43\xcc\x1b\xd1\x37\x1c\x3b\x56\x42\x22\xf5" - "\x11\xde\x75\x39\xb1\x95\xa7\x21\x6d\xeb\x4a\xd0\x7a\x56\xa3\xfc" - "\x8b\x40\xdb\x2b\x01\xf4\xae\x2e\x88\x3d\xd4\xe9\x10\x73\x48\x66" - "\x2b\xd4\x23\x7c\x5f\xa5\x98\x43\xf2\xf6\xe4\xc4\x6c\xfd\x0a\xf8" - "\xba\x57\xeb\xa2\x9f\xa1\x6c\x1f\xd3\x04\x93\xed\xae\x21\xf8\xfa" - "\x5e\xb5\xaf\x3f\xe5\x2f\x5b\xb5\x9f\xaf\xb1\xa8\xe6\x90\xe6\x84" - "\x98\x43\xba\x08\x99\xf2\xb9\xfd\xd3\xc2\xcf\xf7\xcf\x21\x7d\xcb" - "\x39\xfe\x3e\xf4\xf1\xaf\x48\xfe\x3e\xfe\x9b\xc9\xf4\xb1\x63\x17" - "\x9a\x77\x24\xfb\x26\xbb\x56\x6c\xba\xbf\x8f\x27\x3b\x46\x79\x9f" - "\xaf\x7c\x65\x1f\xef\xeb\x9f\x1e\xb0\x69\xb2\x65\xb2\x6b\xb2\x63" - "\xde\xd7\xd3\x3e\xbf\xcf\xa5\x34\xd7\xa9\xe6\x8e\xbc\xd1\xb2\x9f" - "\x0f\xe2\xe3\x7d\x17\xf4\xf1\x79\x41\xe5\xff\x8f\xe0\xe3\x49\x0f" - "\x14\xfb\xfe\xfb\xb3\xed\xbc\xd0\xeb\xbf\x2e\x4a\x0f\x76\x4d\xfc" - "\x7a\x3d\xd8\x95\xea\x7b\x6e\xbc\xb6\x4e\x35\x67\xe4\x8d\xde\x85" - "\x7e\x5e\xcc\x19\x09\x3d\x18\x98\x33\xf2\x05\xce\x19\xf9\xe9\xc1" - "\xd2\x88\xef\x56\x0f\x02\xe6\x8c\xfe\x69\xf5\x60\x69\xf7\xb7\xd4" - "\x83\x8b\xf0\x07\xbb\xd0\x1f\x8c\xcf\x51\xe9\x01\xfa\x83\x5d\xe8" - "\x0f\x76\xa9\xfc\xc1\xc0\x5c\x91\x2f\x70\xae\xc8\x4f\x0f\x0a\x46" - "\x7c\xb7\x7a\x10\x30\x57\xf4\x4f\xab\x07\x05\xce\x6f\xa7\x07\x35" - "\x17\xe1\x0f\x6a\xc8\x1f\xec\xa9\x53\xcd\x11\x79\xa3\xe5\xb8\x2f" - "\x48\xcc\xe7\xbb\x60\xcc\xb7\x7c\xd4\x3f\x6a\xcc\xf7\xf7\xad\x07" - "\xcb\x43\xbe\x2b\xbd\x48\x3d\xb8\x08\x7f\x50\x83\xfe\x60\x02\xa8" - "\xf4\x00\xfd\x41\x0d\xfa\x83\x1a\x95\x3f\x18\x98\x1b\xf2\x05\xce" - "\x0d\xf9\xe9\x41\xe1\x98\xef\x56\x0f\x02\xe6\x86\xfe\x69\xf5\x60" - "\x85\xf6\xdb\xe9\x41\xed\x45\xf8\x83\x5a\xf4\x07\x13\xb2\xeb\x54" - "\x73\x42\xde\xe8\x5a\xf4\x07\xb5\x2a\x7f\x30\x30\x27\xe4\x0b\x9c" - "\x13\xf2\xd3\x83\x95\xe3\xbe\x5b\x3d\x08\x98\x13\xfa\xa7\xd5\x83" - "\x55\x21\xd7\x55\x28\x3a\xd0\x3f\x07\xc0\x06\xf4\x80\xcb\x7e\x75" - "\x4e\x6c\x6f\xd4\x2b\xfb\x94\xf1\x7f\xe5\xa0\xf1\x7f\x4a\x73\xc8" - "\x79\xa0\x80\xf7\xcb\x7c\x6c\xb0\xfd\x95\x66\x31\x4e\xa8\xcf\x25" - "\xf9\x3f\xbf\x41\x8c\x13\x0d\xf3\x49\xfe\xa6\xe0\xf2\x1f\xea\x9c" - "\x60\x1e\xca\xbf\xf3\x02\xf2\x7f\x34\xc4\x38\xe1\x91\x6f\x27\x7f" - "\x5a\xef\xd8\x77\xe6\x12\xca\x5f\x99\x13\xfc\x14\xa4\x57\xbe\xd5" - "\x78\xf1\xa9\x90\xf2\x0f\xba\x9e\xa4\x49\xac\x27\xa1\xb5\x24\x47" - "\xba\xba\x60\xeb\x39\xd0\xc7\x14\x0a\x9d\xe0\x6b\x4a\x50\x27\x2a" - "\x4f\x42\x9a\x47\xb4\xad\x7f\x4d\x09\xed\x8b\x2e\xfc\x82\x95\xaf" - "\x29\x51\xe6\x03\xfa\xd7\x93\x2c\xa2\xf5\x24\x45\xd1\xdf\x7a\x2e" - "\x80\xd6\x93\x14\xa3\x8c\x9d\x28\xe3\xb3\x24\xdf\x0f\xfd\xec\xda" - "\x6f\x0e\x20\xd4\x3a\x92\x8b\x99\xd7\xf9\x2b\xac\x23\xe1\x73\x00" - "\x97\xc4\xa6\x8b\xec\x21\x7d\x3b\xca\x91\xe4\x69\x4b\xf2\xf0\x79" - "\x5d\xc5\xc6\x6d\xe6\x76\xd8\xda\x0b\x7a\x65\xfe\x5f\x91\x29\xf9" - "\x7b\x86\x7a\xc0\xce\xe4\x44\x93\x4c\x9f\x5f\x89\x7e\x7e\xd5\x80" - "\x9f\xf7\x0d\xbb\xa5\xa1\x76\x03\xfa\xf7\x0d\x30\x91\xf3\x28\xa6" - "\xb6\x59\xcc\x07\xd4\xe7\x92\xbd\x93\x3d\xb3\xe8\x57\xba\xfa\x64" - "\x7b\x17\xf2\x3e\x0c\x24\x67\x71\x7e\x66\xb1\x86\x6c\x8f\x64\x1e" - "\x23\xcb\xbc\x2e\x84\xcc\xb9\xbc\x35\x7a\xda\x8b\x83\xbe\x33\xeb" - "\x97\xb9\xe7\x19\xd5\xfc\x8f\x5a\xe6\xf2\xbc\x8f\x0f\x6d\xf9\xa2" - "\xd6\x0f\x5d\xa4\xdc\x2f\xd9\xfc\x3e\xca\xbd\x4e\x96\x7b\xff\xfc" - "\xfe\xb7\x92\x7b\x71\xe8\xef\x5f\xfc\xe4\xbe\x2b\xf5\x12\xc8\xdd" - "\x3d\x58\xee\x34\xfe\x27\xb9\xef\xca\xa6\x71\x3e\x8b\xde\x55\xd0" - "\x27\xaf\x1b\x19\x2c\xf7\x35\xe7\xff\xfa\x72\x0f\xff\xea\x5f\x43" - "\xee\x6b\x43\xee\x7f\x1e\x20\xf7\x4b\x60\xef\xc9\x59\x41\xe4\x2e" - "\xdb\xfb\xae\xa3\x34\xae\x47\xb9\xcb\xf6\x7e\x2a\x88\xdc\xd7\x7d" - "\xf9\xd7\x97\xfb\x65\xc7\xff\x35\xe4\x6e\x0e\xb9\xfe\xc3\x5f\xee" - "\x35\x97\xc0\xde\x93\x9b\x06\xcb\xbd\x46\xb6\xf7\x9a\x6c\x1a\xc7" - "\xb3\xe8\x1a\xd9\xde\x3f\x0d\x22\xf7\xf5\xff\xf7\xd7\x97\xfb\x88" - "\x3f\xfc\x6b\xc8\x7d\x83\xf5\x22\xe5\x7e\x09\xec\x3d\x05\x82\xc8" - "\x5d\xb6\xf7\x9a\xa3\x34\x6e\x47\xb9\xcb\xf6\xfe\x7e\x10\xb9\x3f" - "\xfd\xf9\x5f\x5f\xee\x77\x54\xfc\x6b\xc8\xbd\x24\xe4\xfa\x3f\x7f" - "\xb9\xd7\x5e\x02\x7b\x4f\xc9\x19\x2c\xf7\x5a\xd9\xde\x6b\xb3\x69" - "\x9c\xce\xa2\x6b\x65\x7b\xdf\x18\x44\xee\x1b\xff\xf8\xd7\x97\xfb" - "\x82\xa9\xff\x1a\x72\xdf\xd4\xfc\x75\xef\xeb\x15\xd9\x2b\x73\x36" - "\xfc\xfd\x2c\xc6\xf7\x8a\xbc\x49\x0f\x48\xe6\xa4\x0b\x6a\x99\xf3" - "\x35\x3c\xab\xc4\x1a\x1e\x8a\xdb\x19\x8e\xc5\xd9\x30\xbe\x7e\xa3" - "\x8b\x8f\xdb\xe5\x38\x9e\x69\xb4\x71\x14\xcb\x87\x8e\xe3\x4b\x7f" - "\xa7\xc8\xfb\x9b\x8e\xdd\xbe\x4e\xde\x81\x63\xf2\xbf\x17\x79\xab" - "\xc7\x6f\x97\x46\xde\x65\x0d\xdf\x4c\xde\x35\xa9\x43\x93\x77\x4d" - "\x96\x90\x37\x5f\xa7\x51\x30\x20\xef\x9a\x6c\x21\xef\x9a\x9c\xd0" - "\xfd\xf9\xe6\xf7\xfe\xfa\xf2\xf6\x9f\x93\xff\xe7\x95\xb7\x25\xe4" - "\xf9\x1f\x34\x07\x43\xb2\x26\xb9\xef\x58\x0e\x89\xcf\x2f\x17\x73" - "\x2b\x9e\x33\xf1\xe4\xf3\xb5\x24\x7f\xfa\xc6\x27\x06\x75\xe0\xe3" - "\x1c\x07\xf4\xba\x72\x80\xbe\xe5\xa1\x75\x17\x47\x0a\xec\x60\x33" - "\x1f\x84\xad\x45\xa0\x3f\x94\xfb\x15\xcc\x69\x62\x7d\xb6\x63\x56" - "\xfa\xc6\x5b\x6b\xdd\x70\x10\xd8\xaa\xa4\xc8\x45\x4e\x90\x4e\x4b" - "\xcf\x64\xd0\xba\x8d\xf1\x4e\xe4\x09\x7d\xef\x83\x32\xdf\x7a\x1a" - "\xe0\xc3\x62\x00\xc3\x52\x92\xf5\x33\xaf\x85\xaf\x09\xf2\x9d\xcf" - "\x50\xe6\x65\xd4\x73\xaf\x41\x64\xbd\x4b\xba\x34\x6b\x33\x94\x75" - "\x19\x7e\xf3\x32\xdf\xf6\xfb\xcb\x4b\xb6\x36\x63\x4b\xc8\xbd\x9c" - "\x68\xbd\x0d\xc9\x93\x6c\xda\xb3\x5d\xcc\xcb\xd8\x30\xbc\xa7\x75" - "\x35\x64\xc3\xde\x9e\x78\xdd\xd3\xc5\x68\xeb\x1d\xc2\xd6\x9f\xff" - "\x0a\x61\x73\xff\x07\x48\x3f\x84\x6c\xfb\x84\x6c\xbf\x22\xd9\xfe" - "\x0f\xb0\xd5\x49\x91\xa7\xa5\x67\x0d\x24\x5f\x92\x6b\xe9\x1f\x41" - "\xbf\x98\xf6\x45\x21\x1f\x8f\xfe\x1d\xe5\x3c\xa9\x7e\x39\x4c\x24" - "\xfb\xf7\x6e\x7b\xe5\xa8\x67\x9b\x58\xa3\x41\x7e\xbf\x2f\x6a\x77" - "\x47\x45\x91\x2c\xff\x47\x48\xfe\xcf\x06\x95\xff\xae\x6f\x3a\xf7" - "\x2e\xcb\xff\x1b\x7f\xd7\xf3\xb7\xb2\xf7\x55\x97\xca\xde\x9f\x2b" - "\xbb\x38\x3d\x10\xf3\x34\x43\xd3\x03\x57\x10\x3d\xf8\x71\xd2\x60" - "\x3d\xd8\x95\x85\x7a\xe0\xf6\xd7\x83\x5d\xd9\x42\x0f\x76\xe5\x60" - "\x7e\xc1\x60\x3d\xf8\xf1\x5b\xdf\x8d\x1e\x5c\xe4\xf7\x3c\xff\xf0" - "\x7a\x50\x5e\x7e\x91\x7a\xf0\x0d\xfc\xc1\x99\x20\x7a\xb0\x35\x35" - "\x88\x1e\xa0\x3f\x48\xce\x0a\xd0\x03\xd9\x1f\xec\x42\x7f\xb0\x2b" - "\x88\x3f\xd8\xfa\xeb\xef\x46\x0f\x2e\xf2\x3b\x9e\x7f\x78\x3d\xa8" - "\x08\xd9\xff\xfb\xeb\x41\xcd\x37\xf0\x07\x9f\x05\xd1\x83\xe7\x27" - "\x0d\xd6\x03\x8c\x05\x31\x0e\xf4\xd7\x83\x1a\xd9\x1f\xd4\xe4\x50" - "\x7c\x38\x58\x0f\x9e\x7f\xff\xbb\xd1\x83\x8b\xfc\x7e\xe7\x1f\x5e" - "\x0f\x2a\x43\x7e\xff\x1b\xa0\x07\xdf\xc0\x1f\x7c\x10\x44\x0f\xb6" - "\x19\x83\xe8\x01\xfa\x83\x14\x08\xd0\x03\xd9\x1f\xd4\xa0\x3f\xa8" - "\x09\xe2\x0f\xb6\x7d\xf8\xdd\xe8\xc1\x45\x7e\xb7\xf3\x0f\xaf\x07" - "\xdb\x43\x8e\xff\xfc\xf5\xa0\xf6\x1b\xf8\x83\xd2\x20\x7a\xb0\x23" - "\x63\xb0\x1e\xd4\xa2\x3f\x48\xc9\xf1\xd7\x83\x5a\xd9\x1f\xd4\xa2" - "\x3f\xa8\x0d\xe2\x0f\x76\x1c\xfe\x6e\xf4\xe0\x22\xbf\xd7\xf9\x87" - "\xd7\x83\xaa\x90\xdf\x7f\xab\xf5\xa0\xaf\x7f\xbc\xd0\xc2\xf5\xa0" - "\x62\x83\xd0\x83\x8d\xa4\x07\x5d\x62\xfd\x4e\xa5\xac\x07\xfd\x63" - "\x85\xce\x40\x1d\x78\x61\x56\xbf\x0e\xfc\xdf\xc0\x58\xa1\x0f\xe5" - "\xcd\xe7\x83\xe4\x71\x82\x32\x0f\xc4\xc7\x09\x38\x4e\xac\xf8\x4a" - "\x96\x3f\x9f\x13\x78\x21\xb8\xfc\x87\x30\x4e\xf4\x5b\xa3\x11\x28" - "\xff\xbf\xf3\xef\x74\x06\xcd\x0b\xfc\xf1\xdb\xae\xcd\xf8\xc9\x45" - "\xca\x5f\x89\x0b\x2e\x56\xfe\x9f\x05\x91\xff\x8b\x41\xe4\x5f\x93" - "\x25\xe4\x9f\xdc\xa4\xc4\x03\xca\xbc\x10\x8f\x07\x06\xc9\xff\xc5" - "\xef\x48\xfe\x7f\x9f\xdf\xe7\x5c\x7a\xf9\xef\x0c\x29\x7f\x2f\xda" - "\x40\xad\xe4\x6b\xae\x92\x7c\x2d\x78\x59\xf1\x6a\xc3\xb4\x70\x4c" - "\xe3\xef\x82\xab\xe4\x3c\x6f\x05\xd0\xde\x49\xd6\x58\x4d\x2e\xf1" - "\x9b\x60\x86\x29\x30\xb1\x9b\xc1\x88\x6d\x13\x70\x12\x94\x61\xba" - "\x35\x7a\xb3\x71\x18\xc2\xb7\xb1\x8a\x39\xf1\x98\x36\x9c\x60\xd9" - "\x66\x2d\xdf\x17\x27\x56\xc3\xf7\xce\x94\xe1\x35\xb4\x57\x96\x95" - "\x60\x11\x4e\x27\xc3\x89\xbd\xa3\x25\x09\xea\x07\xd3\x16\x21\xc3" - "\xd0\x9e\x55\x06\x35\x8d\xd1\x1a\x23\xc7\x25\xc3\x45\x7a\x2d\x9f" - "\x35\x12\xac\x77\xb3\x36\x51\x0d\xc7\xa6\x02\xe1\x55\xe0\x2e\x93" - "\xf1\x25\xf9\xb5\x77\x2c\x40\xf4\x66\x03\xc7\x17\xdd\x2d\x81\x4c" - "\x1f\xea\xc4\xac\x6e\x0e\xaf\xd1\x26\xfb\xc1\x0f\x03\x75\x3b\xa2" - "\xd9\xb0\xd4\x6a\x19\x2e\xd5\x27\x01\x3f\xf7\x19\xd3\xb5\x6a\x5e" - "\xcb\xb0\x31\x0a\x1f\x69\x4f\x27\x75\x7b\xbd\xd8\xfe\x5a\x41\x63" - "\xac\xf7\xb9\x09\x4d\x72\x5b\x26\xa9\xeb\x25\x38\x2c\x77\xab\x2c" - "\x13\x3d\xb6\x23\xad\x1f\x5f\xe5\xf2\x72\x05\x0e\x75\x76\x14\xca" - "\xc8\x6a\x2b\x00\x90\xdb\x3d\x02\x65\xb3\x47\x6e\xbb\xd1\x9f\x8f" - "\x1a\xbb\xc2\x47\x84\xa1\xbd\xcd\x46\x22\x4c\xba\x82\xd7\x6b\xe1" - "\xfb\x68\x89\x76\x5b\x3c\x97\x93\x5e\x1c\xee\x02\xa8\x13\xed\xb9" - "\x5c\xc6\x99\x21\xda\xac\x87\xda\x7e\x59\x6b\x29\xcf\x2a\xc3\xc5" - "\xf1\xf6\x44\x3e\x6a\xf4\x6a\xb4\xb3\x06\xc3\xea\xd4\xb0\x57\x08" - "\xd8\x2c\x3b\xc2\x66\x0d\x86\xd5\xab\x61\xaf\x14\xb0\x73\x1d\x08" - "\x9b\x3d\x18\xd6\x33\x52\x05\x7b\x95\x80\x7d\x10\x10\x36\x67\x30" - "\xac\x41\x0d\x1b\x2f\x60\x17\x67\x20\xec\xc2\xc1\xb0\x46\x35\xec" - "\x28\x01\xfb\x90\x1e\x61\x73\x07\xc3\x96\xa9\x61\xaf\x16\xb0\x0f" - "\x1b\x10\x36\x2f\x10\xb6\x9e\xeb\x01\x8c\x95\xf5\xe0\x1a\x01\xbb" - "\x20\x15\x61\x0b\x82\xb4\x2d\x8c\xe3\x15\xb0\x09\x02\x36\x53\x8b" - "\xb0\x85\x41\x64\xa1\x86\xbd\x56\xc0\xae\xca\x46\x58\x53\x10\x59" - "\xa8\x61\x47\x0b\xd8\xc7\x13\x11\xb6\x38\x88\x2c\xd4\xb0\xd7\x09" - "\xd8\xfc\x64\x84\x35\x07\xe1\xef\x00\x6c\xe4\x13\x13\x11\xa6\x04" - "\x79\xd2\x1e\x84\xb7\x6a\x9c\x63\x04\xce\x65\x69\x08\x5f\x16\x84" - "\xb7\x6a\xd8\xb1\x02\xf6\xc9\x74\x84\xdd\x32\x18\x16\x34\xb5\x82" - "\xbf\xb7\xc9\xfc\xbd\x5e\xc0\xaf\x98\x85\xf0\xe5\x41\xf8\x4b\xf9" - "\x56\xd9\xd6\x12\x05\xec\x92\x2c\x84\xad\x0c\xc2\x5f\x35\xec\x0d" - "\x02\x76\x93\x1b\x61\xab\x82\xf0\x57\x0d\x7b\xa3\x80\x5d\x9d\x84" - "\xb0\x3b\x83\xf0\x57\x0d\x7b\x93\x80\x5d\x43\xba\x53\x1d\x84\xde" - "\xb1\x2a\xd8\x24\x01\xbb\x2e\x1e\x61\x6b\x82\xc8\x42\x0d\x3b\x4e" - "\xc0\x96\x75\x21\x6c\x43\x10\x79\xa8\x61\x6f\x16\xb0\xeb\x49\xd7" - "\x1b\x83\xc8\x43\x0d\x7b\x0b\x8b\x7c\x5a\x27\xfb\xc5\xa6\x40\x58" - "\x94\xbd\xf0\x89\x16\x48\x66\x91\x1b\xc9\xc7\x10\xdc\x1e\x82\xeb" - "\xc7\x67\xf1\xfc\x80\xfc\x8d\xec\xc3\x52\x58\xe4\x53\xd9\x32\xbe" - "\xe6\x41\x75\x5b\xb4\x6a\xd8\xf1\x2c\xb2\xca\x21\xc3\xee\x1b\x0c" - "\xab\x53\xc3\x4e\x60\x91\x5b\xac\x32\x6c\xcb\x60\x58\x7d\x3f\x2c" - "\x8b\x7c\xae\x0d\x61\xf6\xd7\xc9\xbe\x51\x45\xe7\x6d\x2a\x7c\xb7" - "\xb2\xc8\xf2\x76\x19\x9f\x75\x30\x3e\x83\x1a\xf6\x36\x16\xf9\x13" - "\x85\xce\xd6\xc1\xb0\x46\x35\xec\x0f\x58\x64\x45\x87\x0c\xdb\x36" - "\x18\xb6\x4c\x0d\x3b\x91\x45\x56\xda\x65\xd8\x43\x83\x78\x4f\x76" - "\x60\xc1\x58\x40\xf8\xa4\xdb\x59\xe4\xf6\x2e\x19\xd6\x2f\x0e\x50" - "\xf5\xc3\x77\x08\xb9\x5b\x3a\x50\xee\x47\x79\x7f\xb3\x59\xdb\x11" - "\x2c\xc6\x30\xdd\x0c\x97\x9d\x94\x6a\x6b\x44\x9f\xa4\x9c\x7b\x55" - "\xc7\xbf\x2b\xf4\xd5\xe4\x57\x65\x3a\x99\x47\x9d\xb6\x43\x62\xed" - "\x13\x9c\x20\xce\x52\x89\xde\xdd\x62\xc7\x74\xc7\xb5\xf9\xcd\xae" - "\x8a\xda\x26\xbb\xe6\xe6\x0e\xda\xc7\x0f\xef\xf7\xd9\xe1\xc9\x6c" - "\xba\xdf\x61\x61\x6e\xda\xbf\xd2\xbb\x7d\x79\x96\xcd\xd7\x8d\xb1" - "\x1c\x73\x23\x0e\x37\xc6\x72\x61\x06\x1c\x57\x96\x9a\x59\xaf\xcd" - "\xdc\x0d\x27\xa4\xda\xf3\x6c\x55\x41\x1a\xd2\x60\xc2\xfa\xf2\x8e" - "\xe3\x33\xa7\x01\x63\x20\xec\x2b\x0b\xad\x45\xb4\x8f\x68\xdd\x38" - "\x47\x74\xa3\x89\x3d\xb3\xa0\xcb\xb4\x09\xae\x3b\x29\xd5\xf1\xb8" - "\x80\xef\x31\x78\xa6\xe0\x6e\x5f\xf4\xf2\x42\xda\x7b\x90\x55\xbf" - "\x96\x25\xf6\x25\xac\xe3\x67\x3b\x22\x0d\xed\x2c\x21\xbf\xcc\xd7" - "\xbb\xa5\x8c\xce\x55\xb3\x6e\x3a\x09\xc7\x55\x79\x8e\x51\xaf\xf1" - "\x3d\x0b\xb1\x4d\x65\xde\xf2\x83\x66\x9f\xee\x60\x31\x2b\x3f\xda" - "\x62\x2b\xb4\x83\x38\xf3\xa5\xee\x0b\x16\xf3\xb0\xcd\x57\x7e\x70" - "\x21\xa6\x37\xd9\x9c\xbd\x3c\x1d\x71\x34\x53\x7c\xd9\xa3\xfb\x7d" - "\x16\x2b\xff\x7d\xb6\xf5\xea\x5e\xe8\x94\xea\xf8\xde\x7d\x94\xce" - "\xb6\x1e\xe5\xfc\xf1\x6d\x3d\xda\x14\x16\x0f\xda\x9e\x88\xdf\x67" - "\xb9\x2a\xea\xda\x95\xb3\x47\x94\xba\x08\xaf\x5d\xc6\x15\x62\xdd" - "\x47\x2c\xdb\xb6\xbc\xdc\x55\x51\x1f\x85\xf1\x62\x97\xe0\x71\x7d" - "\xbc\x5d\x13\x96\x27\xdf\x27\xda\x35\xc3\xd2\xe4\xfb\x54\xbb\x66" - "\xcc\x24\xf9\x3e\x4d\xd9\xd3\x31\xf8\x1e\x93\xcb\x17\x22\x6f\x8b" - "\x7d\xbb\x72\x74\x14\xeb\x52\xfc\xce\xa2\x97\x2f\x34\x8c\xa6\xf3" - "\xfa\xea\x8f\x62\x9d\xc5\x62\x7f\xff\xfa\x97\xf1\x37\x56\xfe\x75" - "\xc8\xbf\x8c\x60\xb8\xde\x24\x2c\x05\x56\x59\x97\x41\xbc\xdd\xe4" - "\x65\x3e\xc4\x5b\x8d\x7c\x6a\xb6\x99\xbb\x64\xfe\xd5\x7f\xc8\xe3" - "\x7e\x92\x1d\xca\x97\x45\x1c\x6d\xe6\x75\x6d\x6b\x34\xa9\xe9\x4a" - "\xbd\xf5\xb6\x1f\x4c\xbc\xfd\x8e\x1f\x4e\xba\x73\xc9\x63\x8f\xe7" - "\xe5\x2f\x7d\xa2\x60\xd9\xf2\x27\x0b\x57\xac\x5c\x65\x7a\xaa\x68" - "\x75\xf1\x9a\xb5\xeb\xcc\xeb\x37\x20\x9e\xfe\xb3\xda\xd8\xae\x74" - "\x8d\x53\x02\xac\x63\x2a\xd6\xd1\x70\x3b\xa7\x05\xd3\x84\xec\x1b" - "\x12\xb5\x86\xe0\x71\xb5\x0d\x23\x5d\x3a\x3f\xa6\x5b\x6a\xd8\x4c" - "\x67\xd9\xa0\x8e\x69\x6c\x35\xf7\x5a\xe9\x7c\xb1\x4e\xa9\xa1\xf8" - "\x88\xe3\x5e\x2b\x9d\x6f\x77\x20\xbe\x0b\x12\xc7\xd2\x19\x64\x0d" - "\xb9\x94\x5f\x7f\x23\x40\x2b\x96\x0d\x86\x73\xac\x1e\xe2\x5f\xbc" - "\x92\x39\x76\x5e\xc9\xba\x09\xff\xce\x97\x58\x97\xe3\xe9\x02\xd8" - "\x8e\xcf\xa8\xe7\xfa\x13\xd2\xab\xb7\x1f\x48\xe0\xe7\x34\x25\xd4" - "\xbd\xc4\x3a\xb7\x5c\xc9\x3a\x9f\x79\x89\x75\xd7\x5f\xc9\xec\x89" - "\x3b\x21\xca\x55\xd1\xd0\x65\x97\x1a\x8c\xdc\x66\x30\xdf\x17\x59" - "\x6f\xdf\x81\x79\x13\x3c\x10\x56\x8f\xcf\x98\xe6\x3c\x60\x10\x74" - "\xef\xfd\xca\x1d\x8e\xed\x3b\xc4\xfa\x0a\x35\xdb\xb1\x1e\x21\xa3" - "\x57\x1f\x6e\xc5\x5e\x1c\xeb\x73\xd8\xdc\xc7\xc1\x2e\xbd\x9a\x53" - "\x7f\x8e\xd7\x17\x6b\xab\xee\x06\xc2\xf7\xcb\x22\x77\xf8\xea\xab" - "\x99\x07\x61\x27\xf9\x9e\x2e\xd4\x20\x4c\x1c\xe2\x76\xaa\xdb\x93" - "\xb4\x74\x45\xb1\x61\xe5\x9a\xc2\xc2\x71\x91\x90\xc4\x7f\xfd\xce" - "\xc6\x2b\xa6\xfd\x65\x5f\x7c\x89\xb5\x62\x3b\xad\xd8\xde\xb6\xc3" - "\x18\xbd\xa3\xbe\x00\xb6\xa9\x0a\xf1\xbe\x85\xe9\xfb\xf1\x7e\x3f" - "\xd2\xde\x26\xce\x53\x7b\xe7\x8f\xac\xe2\xd5\x3c\xa4\xb3\x8d\xce" - "\xd8\xa0\xfd\x68\x7b\xd6\x65\x6b\xb0\xdd\x3b\x11\xae\xcd\x70\x35" - "\xdc\x70\x42\xfa\xd9\xed\x48\x47\x23\xde\x13\xfc\xe7\x24\x47\x84" - "\x6f\x15\xed\x7a\x87\x9f\x9d\x89\xbc\xb2\xd6\x5e\xc9\x2a\x5d\x15" - "\x3f\xd3\xd3\x3e\xdb\xfc\x3c\x22\x7c\x46\xbe\xb4\x21\x6c\x55\x4f" - "\x69\xb6\x06\xc7\x81\x9a\xfa\x7e\x9c\xaf\xda\x89\x26\xa2\x83\xc6" - "\x96\x1f\x63\xf4\xe6\xeb\xcb\x81\x14\x37\x68\x3e\x46\x4f\x56\xf3" - "\x12\x6b\xc0\xab\x06\xaf\xea\x83\x98\xf7\x3b\xbc\xda\x30\xfd\x10" - "\xfe\x1e\xc4\xdf\xdf\xe1\x85\x63\xd3\x78\xa2\x7b\x75\x09\xeb\x9a" - "\x50\x0d\xd7\x13\x7e\xd4\xad\x87\x8e\x4b\xef\xa4\x12\xed\xb4\x8f" - "\x3d\x8b\xfc\x59\xa3\xff\xde\xdf\x8d\xf1\x80\xf9\xf8\x9b\x2c\x7e" - "\xd5\x57\x63\x31\x5e\x3b\xe5\xfb\x63\x78\x69\xe5\x7b\x07\x5e\x9e" - "\xaf\xbf\x02\xf1\x85\xba\x5e\x2b\xb8\x78\xd8\x8b\xba\x1a\x2f\x0e" - "\xee\x17\x06\x90\x5e\x37\xe3\xd5\xec\x9f\xfe\x7a\xb9\x48\xfb\x65" - "\xb6\x78\xfe\x65\xae\xfc\x5b\x09\xd2\x5e\xe4\xd3\x5e\xc4\xbf\xb7" - "\x4d\xa4\xed\x3d\x8a\xbf\x09\x78\x25\x05\xd4\x4f\x38\xb9\x5e\xf5" - "\xd1\xd9\x6e\x28\x4b\xbb\xf4\xb3\x62\x92\xd1\x0e\xa1\x5b\x1a\x1f" - "\xe3\x69\x26\xd4\xad\x9a\x01\xfd\x69\xcc\xf7\xd7\x9f\xc6\xac\x00" - "\xfd\xa9\x22\x5f\x84\xb6\xb0\xbf\x5e\xe8\xcb\xfe\x9e\xa7\xf3\xf0" - "\xb9\x31\x1b\xf1\xec\xa7\x39\x0f\xc4\xc1\xfb\xef\x1d\x27\x71\xdc" - "\x59\x00\x5a\xf2\x2f\xdd\x52\xe3\x6b\xa4\xb3\x54\xb7\x5c\xaf\xa0" - "\x05\xe9\xc3\xb4\x06\xa2\x6f\x15\xe2\xc5\xe7\x46\x84\x6b\xb0\xc1" - "\x57\x0a\x6d\xbc\x4c\xc5\x72\xd4\x47\x99\x5e\xc2\x49\xe5\xd8\x40" - "\xbb\x4c\x54\x46\xd4\xfd\xda\xc3\x98\x4e\xe3\x54\xfa\x9e\x29\xcc" - "\xe6\xb1\x03\xe9\x24\xfd\xda\x3c\xa9\x68\x4b\x19\xe0\x73\xe5\xc0" - "\x84\x78\x48\x45\x7b\x8b\x38\x2e\xbd\x96\x36\xbe\x04\x52\x09\x1f" - "\xf9\x74\xbb\xf4\x1a\xd4\x93\x2d\x0a\x5c\xf2\xf9\x7f\x3f\x33\x1d" - "\x34\x01\xaf\xa7\x8e\xe8\xc1\x7c\x55\xbd\x3b\x69\x1c\xba\x63\x83" - "\x68\x2b\xd6\xd5\x88\xe5\x9b\xa9\xed\xc4\x4f\xcc\x6f\x41\x3c\xd5" - "\x94\xc7\xcf\x02\x12\xed\x69\xa4\xf3\x22\x88\x1f\x04\x4f\xe7\x35" - "\x8a\x7d\xbf\x5f\x7d\x9f\xf3\x0d\xcb\x93\x3c\x18\xd6\x41\x38\x4a" - "\x3d\xcc\xc3\xd0\x1f\xed\xde\xe0\xc6\xb8\xe2\x17\x23\xfc\xe5\xf3" - "\x9a\x43\x2d\x1f\x2c\xd7\x8c\xe5\x5b\x19\xb6\x91\xfc\x09\xd6\x19" - "\x4b\x67\xc4\x61\x5a\x95\xaf\x02\x71\xac\x75\xf3\x79\x1a\xc4\x43" - "\x3e\xa5\x8a\xf0\x20\x3d\xad\x02\xd7\xcf\xd3\x7e\x53\xe2\x2f\x6b" - "\x19\x5f\x23\xc9\x9c\xdb\xf3\x06\xde\x26\xf4\x5d\x3f\xff\x7d\x9d" - "\xc8\x6b\x41\x98\x16\xd6\x97\x01\x74\xfe\x82\xe8\x4b\x78\xde\xbe" - "\xd2\xf3\x5c\xbe\xad\xc2\xaf\xfd\xfc\xcb\xd5\x1b\x59\xd7\x00\xdd" - "\x3f\x6f\x52\xce\xb0\x90\xe9\xde\x47\xf5\xb1\x75\x0b\x79\xbf\x4a" - "\x75\x50\x79\x19\xdf\x16\xc2\xa7\xf0\x6a\x3c\xd2\x21\xf8\xf5\x5a" - "\x0b\xa6\x37\x92\x2e\x72\xbe\xa1\x1f\xed\x29\x25\x5d\xfc\xf9\x1e" - "\x2c\xbf\x7f\x3b\x3d\xaf\xe3\xcf\x46\xee\x63\xfb\xf3\x5f\x73\x52" - "\xbe\x0d\xc7\xf9\x3b\x9e\x44\x5d\xf2\x01\x5c\x1f\x07\xa9\x4e\x0b" - "\x6f\xdb\x1e\xe7\xd3\xe9\x9a\x03\x1e\x00\xa2\x13\x79\xd4\xe2\xaa" - "\xf8\x45\x36\xf6\x35\xfc\x4c\x37\xf4\xd7\xfb\xd8\xee\x1c\x20\x9a" - "\xd1\x9f\xc9\xf4\xfd\xe2\x43\x59\xf6\xfb\xa8\x8d\xc4\xcf\xf1\xc2" - "\xf7\x61\xde\xeb\xcb\x88\xf6\x81\x76\xff\xa2\x41\xcd\x63\xde\x6e" - "\x94\x03\xc9\x8b\xe4\xa2\xc2\x49\xba\x5f\x85\xb8\xf6\x88\x67\xa1" - "\x1b\xc4\xeb\xaa\x2b\xd9\x21\x82\x1f\x80\x6d\xe2\xfb\xf1\x6f\xc2" - "\xba\x27\x98\xb0\x4f\x47\xbb\xa0\x73\x48\x10\xef\x1e\x3a\x8b\x13" - "\x71\xb4\x10\x4f\x91\x96\x14\xd2\x47\x7c\x3e\x24\x97\x4b\xc6\xfe" - "\x9c\xae\xb4\x01\xfb\x7f\xfd\x5a\x7f\xfd\x6a\x0a\xb4\x7f\x92\x77" - "\x95\xaf\x34\x03\xb8\x3e\x14\x81\xe1\xb4\xd4\xf4\x9e\xdc\x77\xc8" - "\xb2\x7e\x3d\xfa\x00\xda\x8b\x0a\xc7\xce\x00\x59\xb7\x70\x7d\x5c" - "\x37\x4b\x43\x6d\xc6\xb2\x2d\x32\x1e\xde\x66\xae\x4f\x16\xae\x03" - "\x87\xd8\x3a\x6c\x67\xbf\x1e\xfc\xc2\x21\xcb\xf9\x50\x00\x4f\x14" - "\xdf\x95\x46\xe7\xc5\x91\x4f\xc2\x18\xf7\x6e\x57\xdf\x80\x5f\x22" - "\xd9\xfb\xb8\xec\x9b\xaa\xeb\x45\x7f\x2b\xfb\xad\x26\x91\x7f\xa5" - "\x9f\x0e\x13\x2d\x87\xb9\xfe\x12\x2d\xa5\x0b\x89\x96\x16\x4e\x47" - "\xa9\x01\x4e\x4b\xaf\xa7\x53\xfd\x58\xb6\x5d\xb6\x57\x19\xd7\x2f" - "\xc8\xf6\xf7\x3f\x83\xbe\x8a\x68\xc2\xba\x53\xb9\xff\x9b\xc1\x79" - "\xf2\x9a\x4c\x7b\x9b\xdb\x42\x65\x1b\xab\xcf\x4b\xbc\x6c\x1b\xde" - "\x47\xb9\xc5\x99\x32\x91\x58\xbe\x89\xf6\xf1\x3f\x21\xfd\x92\xfc" - "\x85\x86\xde\x21\x9d\x90\xde\x3a\x45\xdf\x7b\xa2\x4f\xd1\x22\x3e" - "\x1d\xe9\xa8\xa2\x17\xdd\xd2\x5b\x9f\xd2\x78\x01\x79\xbd\x07\x63" - "\xa4\x26\xe2\x37\xe9\x32\xc6\x48\x13\x5d\x15\x6f\x44\x29\x7a\x8b" - "\xf5\xd4\x10\xef\x85\x7c\xde\x78\x00\xf5\xb8\x65\x40\xb7\xde\x78" - "\x40\xe6\x63\x13\xf2\x51\x87\xf5\xfd\x5e\x6e\x57\x13\xc2\x63\x2c" - "\xf6\xd6\x6f\x64\xda\xe5\x73\x03\xdf\x58\xa1\xc8\x41\xb6\xd5\x43" - "\xdb\xc9\xff\x72\x19\xbc\xa9\x95\xcb\x36\x8a\xba\xde\x0c\x57\x60" - "\x29\x46\x14\x67\x45\xbd\x19\x4e\x7e\x70\x02\xca\x9e\xfb\x3e\x7e" - "\x4e\xad\x48\x23\xdb\x11\x75\xbc\xf5\x16\xd7\x43\x8c\x7b\x06\xf4" - "\xe8\x8d\x63\x01\xfe\x89\x7c\x71\xd5\x11\xc4\x41\xfe\x94\x74\x89" - "\x7c\x2a\x8d\x57\x90\xc6\x7d\xb2\xfd\xc8\x34\xbf\x39\xd3\x5f\x57" - "\xde\x7a\x19\x75\x25\x65\x00\xf7\x9b\x93\x82\xf5\x73\xf5\xc2\x07" - "\xd6\xc8\x6d\xdb\x2a\xb7\x6d\x8f\xdc\xb6\xad\x72\xdb\x9a\xb0\x0e" - "\xe2\xdb\x6c\x15\x1f\x91\x6f\x7b\xde\x93\xe1\x5b\xc8\x97\x0f\xd8" - "\xeb\x9b\x67\x15\x5b\x1e\xec\x2f\xf6\xbc\x4e\xf6\xa0\xa2\xab\x3d" - "\xc0\x5f\xb4\x04\xf7\x17\x6f\x36\xc8\xed\x6d\x08\xb0\x8d\x46\x39" - "\xde\x7d\x5f\x91\xc3\x11\x1c\x8f\x89\x73\x91\x5e\x7d\x9f\xfc\x27" - "\xd5\xad\xee\x83\xea\x04\x5f\x65\x5b\xde\xf3\x6f\x83\xe5\xb0\x27" - "\x4f\x6d\xcf\x24\x6b\xf2\x09\x84\x83\x64\xca\xe3\x4a\x4c\x13\x72" - "\xdd\x93\x46\xbe\x41\xed\xa3\x11\x76\xa7\x8f\x91\xbd\xec\x29\xf0" - "\xb7\xc5\x37\x8f\xca\xb6\x28\xd7\xfd\xd6\x9d\x28\xa3\x54\x55\xbd" - "\xc7\x02\xea\x25\xd9\xb4\x12\x1f\x64\x99\xde\xa0\xf4\x69\x04\x8f" - "\x65\xcd\xae\x8a\xb7\xf4\x01\xfd\x63\x15\xd1\x87\x75\x95\x73\x9f" - "\xf5\x12\xf7\x15\x66\x17\xa7\xe7\xad\xb8\x7a\xb9\x9f\xc0\xb4\x54" - "\x91\xb6\xc7\x2e\xf7\x25\x8a\xde\x3c\xeb\x4f\xd3\x5b\xa6\xe0\xf1" - "\xd1\x9b\xe5\x4a\x7c\xc4\x71\x71\x5f\xf4\x56\xb1\xdc\x3e\x4a\x4b" - "\x11\x69\x6f\xa6\x51\xda\x76\xc1\x87\x9d\x8c\xf7\x57\x6f\xd8\xe5" - "\xfe\x8a\xec\x4b\xc2\xe7\x2c\xb2\x31\x7a\x46\x1c\x6d\x84\xdf\x56" - "\xd6\x4b\x63\x88\x6a\xbb\xf4\x7a\x37\xf9\x03\xf2\x17\xb4\x2e\x95" - "\xff\xce\xe1\xbf\x57\x90\xdf\xa1\x38\x84\xf2\x11\xee\x18\xf9\x22" - "\x4c\x1f\x67\xb8\x0f\xe3\x82\xbf\xe8\x10\xef\x2f\xa3\xe4\xb2\x93" - "\x79\xac\xf0\x97\x8c\x30\x25\x4d\x29\x87\x7e\xeb\x14\x95\xa3\xf2" - "\x8a\xff\x22\xdf\xe5\x21\xdf\x24\xea\xdb\x2c\xeb\x38\x1f\x37\x28" - "\x71\x51\x9f\xa4\x82\xa5\xf3\x64\x84\x4f\x3b\x24\xfc\xd9\x2f\xdf" - "\xa7\xb2\x5c\x7e\xe8\x2b\x37\x9d\x67\x9f\xd7\x17\x81\xb6\xee\x2b" - "\xf2\x8b\xaf\xee\x17\x74\xee\x8d\x97\xdb\xf1\x39\x6f\x87\xf0\xa9" - "\x55\x82\x96\x57\xf7\xd7\xf5\xf2\x3c\x2f\xb5\x85\xf2\x76\xa8\xf2" - "\x58\x5f\x12\xe6\xed\xe5\xe7\x7c\x05\x96\xf3\xf5\x15\x0c\x82\xaf" - "\x17\xe7\x01\xeb\xea\x5e\x52\x7c\xef\xde\x6a\x41\xe7\xde\x07\x15" - "\xbf\x8b\x7c\xef\x24\xdf\xcb\xf3\x96\xca\x30\x73\xe4\x5f\xee\xdf" - "\xf7\x3e\x2b\xf8\x1a\x2f\xc9\xfc\xee\x96\xdb\xf1\x32\x1f\x67\xff" - "\x25\x07\x79\xbb\xb7\x44\xe1\xad\xfa\x9e\xec\x07\xeb\xd7\xd3\x33" - "\xd7\xfb\x12\x3e\x86\xad\x21\x18\xa2\x49\xf4\x11\xbf\x2c\x0e\x8c" - "\xa9\x71\xac\x37\x82\xfa\x25\x11\xab\xbe\xfd\xa5\x3c\xff\x03\xd6" - "\xa2\x9f\x61\xbf\xd0\x9c\xa6\xf8\x18\xe6\xca\xc0\x31\xff\x71\x84" - "\x69\x9e\x4c\x69\x74\x46\x88\x1a\x86\xfc\xd3\xde\x5e\xbb\x8c\xb3" - "\x39\x5e\xf1\x1b\xe4\x4b\x8e\x38\x8f\xcb\x31\x5d\x73\x5b\x9d\xec" - "\x4b\x4e\x4b\xcd\xbf\xf3\x8f\xc3\x9a\x7f\xe7\xef\x33\xde\xfe\x34" - "\xd0\x67\x60\xdc\xbc\xc5\x55\xd1\x5c\xe3\x17\x07\x60\xda\x85\x7d" - "\x47\xb3\x89\x6c\x94\xce\x88\xe3\xfe\x89\xcf\x69\xbd\x7d\xab\x42" - "\x33\xf9\xcd\x9e\xa7\x95\xf9\x8b\xb7\x0f\x53\xac\xe6\x5f\xdf\xdb" - "\x51\x7e\xbe\x93\xea\x53\xf0\x61\x2f\x45\x76\x64\x2d\xa2\xf9\x96" - "\xe6\x63\xb2\x9f\x6f\xf0\xf3\x95\x72\x1f\x46\x7e\xd2\xbf\xaf\x7a" - "\xf5\x7d\xff\xbe\xea\xed\xf7\x06\xfb\xc8\xb7\xcb\x2f\xbe\xaf\x7a" - "\x3b\x97\xfc\x96\xe2\x23\xfd\x7d\xc1\xdb\x95\x75\x7e\xb1\xec\xdb" - "\x71\x4a\x2c\x3b\xe0\x47\x9b\x69\xcc\xb4\x1f\xeb\x6f\x11\x75\xbf" - "\x83\xfa\xda\xa0\x53\xea\xc6\xfc\xb4\x23\x06\xd4\xcd\x8a\x57\x4d" - "\xa8\x53\x5d\x72\x0c\xc8\x6d\xb3\x97\x9f\x47\xb4\x37\x15\xf5\x2f" - "\x92\xf4\xcc\xba\xf2\x2b\xe8\x1c\xe8\x2b\x5a\x7b\x56\x29\xfc\x7d" - "\xe7\xdf\xd4\x71\x61\xed\x4b\xac\x1c\xeb\x29\x54\xb7\x71\x1b\xa6" - "\xed\x90\xe7\x10\x38\x6f\x39\xae\x77\x8c\xf5\x2f\xf9\xb7\x4d\xb4" - "\xe3\x9d\x62\x6a\x07\x8d\x89\xb0\xfe\x89\x14\xf7\x60\xcc\x87\xf7" - "\xaf\xb7\xd4\xf7\xeb\x7c\x63\xd4\x79\x8b\x3a\xbe\xfa\x59\x1c\xf9" - "\x4a\x79\xec\xd9\x86\xf1\x4e\x95\x7a\x2e\x66\xf6\xb4\x2c\x83\xa9" - "\x68\xd9\xca\xe2\xa5\xb7\x19\x96\xad\x5c\x56\xbc\x6c\x49\xe1\xb2" - "\x0d\x4b\x8a\x97\xad\x5a\x99\xbc\x62\xc9\x13\xcb\x1e\x37\xac\x5b" - "\xb2\xda\x90\x6a\xbe\xc1\x1c\x09\x03\xa0\x77\x19\x96\xac\x5e\xbd" - "\x66\x45\x7e\x9e\x61\xe5\xb2\xc7\x53\x8a\xf2\x57\xe7\x17\x1b\x96" - "\x14\xad\x5a\xb3\x32\xcf\x70\x43\xde\xf8\x1b\x52\xef\xc8\x8b\x54" - "\xcf\xa1\x8d\xd5\x43\xb7\xef\xdc\xff\x75\xed\x38\x07\xba\x58\x8d" - "\xa9\x28\xd6\xbc\x6c\xa5\x98\xb3\xfb\xd5\xa7\x13\x76\x82\x89\xce" - "\x88\xa7\xf3\x8e\x59\xc5\x3b\x0e\xfc\xd5\x12\x1c\xb6\xd3\x40\x67" - "\xc4\x23\xed\x09\xae\x8a\x5f\x35\xd8\xa5\x77\xcb\xf9\x59\xc6\x98" - "\x8e\x6d\x4b\x60\xe7\x7e\xd7\x85\x31\x9b\x89\xde\x97\xd7\x9f\x83" - "\xb8\xaa\xb5\xa0\xc5\x2b\x0a\x2f\x3d\x9d\x21\x8f\x65\x8e\xda\xa5" - "\x7d\x0e\x71\xe6\xcb\xbe\x62\x47\xc4\x1f\x72\x58\xf9\x1f\x72\x84" - "\x5c\xf6\x3d\xa5\xcc\x33\x67\x3e\x0b\x99\xa4\x9f\xc7\xa5\x7d\xfc" - "\xbd\xd7\x33\xa8\xcb\x34\x5f\xdb\xf3\x9f\x53\x8d\x18\x0f\x1e\xa3" - "\xf9\x56\xcc\x7b\xca\x29\x41\x14\xd2\xa5\x3d\x50\x92\x0a\x2f\x62" - "\x5d\xab\xe3\x19\x73\x55\xec\x9b\xa4\xcc\xa7\x61\x1b\xf4\xd8\x96" - "\x0e\xd1\x8e\x5f\x5d\xc3\xdb\xf1\x12\x4b\xdc\x39\x12\xe9\xfb\x09" - "\xd1\xb3\x2f\x4f\x69\x03\xd2\xdd\x61\x97\x7e\xd5\x86\x74\xea\x89" - "\xae\x60\x73\x7d\x34\xdf\x85\x74\xbe\xe5\x5b\x8b\x7c\x1b\x2d\xce" - "\xb8\xdb\x51\x27\xec\x0f\xdb\xd3\x59\x8f\xf7\xdb\xbf\x82\xa8\x6d" - "\x74\x3e\xb9\xe5\x3a\x76\xd8\xe9\x01\x5b\x41\x07\xc4\xae\x67\x0e" - "\xf6\xef\xff\xd7\x25\xb7\xa9\x83\x7c\xc3\xaf\x96\x77\x68\xa9\x4d" - "\xd8\x57\x44\xd5\x7f\x15\x72\x6e\x51\xfb\xe2\x95\xcc\xc9\x76\xa9" - "\x63\xae\x5f\xf3\x73\x80\x28\xde\xea\xb1\xd0\x99\xd6\xbf\x4e\xc2" - "\xba\xcb\xe4\xd8\xd8\xc9\xfa\x16\xaa\x62\xa9\x5f\x93\x9e\x39\x43" - "\xe0\xd6\x29\xb8\xe9\xdc\x73\x2a\x23\xe4\xff\xeb\xb7\xb0\x8c\x43" - "\x85\xbf\x3c\x10\x3f\xe1\xc4\x7b\x87\x52\x8f\x18\x87\xff\x9a\x62" - "\x02\x07\xea\xb2\x23\x44\x7d\x89\x3f\x79\x89\x1d\xb5\x61\xfa\x8e" - "\xf3\xa0\x45\xd8\xa3\xf5\x2f\x71\xfc\x5d\xc8\xf7\x59\x84\xff\x99" - "\x2b\x01\xb6\x20\x4c\x4f\xc5\xbe\x32\x27\x3f\x83\xfc\xdf\xa9\x5f" - "\x33\x07\xce\x63\xcb\xfa\x7c\x57\x80\x3e\x1b\x7f\x42\x31\xe1\x4e" - "\xc4\x8f\x3a\xb4\xe3\x2c\xf6\xc3\xf8\x3c\x7e\x27\x24\x51\x3d\x78" - "\xdf\x4e\xf3\x21\x88\x33\x47\xa9\x8f\xa1\xfe\x6f\xf7\x89\x39\x18" - "\x59\xb7\x92\x69\xee\xba\xd4\xcc\xd8\x01\xf4\xef\x44\x23\xe9\x18" - "\x96\xa9\x54\x74\x0a\x75\xfd\x28\xd7\xab\x38\x48\x62\x15\xff\xae" - "\xaf\x1f\x89\x70\xa8\x57\x75\xa8\x4f\xa4\x57\x08\xdb\xa2\xe8\x14" - "\xea\x5a\x3b\xc1\x21\x0d\x91\xcd\x1b\x8c\x5a\xf2\x91\x9d\xd2\xbb" - "\x29\xa4\x63\xec\xa7\xf7\x77\xb0\xab\x16\x74\x08\x39\xbd\x9b\x62" - "\x73\x0b\x19\x0c\xf0\xfd\x5d\x50\xf1\xbd\x1d\xf5\x38\x92\xf8\x2c" - "\xe6\xaa\xdf\x4d\x41\xda\xda\x79\x2c\xbe\x11\x65\xc0\xfb\xaa\x7f" - "\xef\xa6\xf2\x32\x0f\x0f\x0d\xf0\xf0\xdd\x8c\x60\x3c\x0c\xe0\x9d" - "\x56\x9c\x73\xfe\x6e\x36\xd9\x0a\x96\x29\x51\xce\x2e\x0f\x26\x4b" - "\xac\x43\xab\xdd\x09\x3a\xaa\xa3\x35\x8e\xc3\xef\x51\xea\xd8\x81" - "\xbc\x76\x94\x16\x5c\x50\x9f\x5b\x1b\x00\x68\x4e\x9c\xca\x27\xc6" - "\x11\x7f\xdf\xed\x1e\x28\xcf\x9c\x81\xe5\x6f\x78\xdc\x8f\x56\x7e" - "\xb1\x8a\x16\x78\x71\x24\xea\x11\xa7\xb7\x25\xf9\x42\xf4\x26\x1a" - "\x44\x3f\x69\x1d\x4b\xfa\xdd\x92\x6f\xab\x06\xa0\x34\xf9\x39\xbb" - "\x07\xfb\x9e\xc0\xf9\xfd\xd0\xef\x1b\x5a\x5e\xf3\x7f\xdf\xd0\xb2" - "\x33\xd4\xfb\x86\x80\x7a\x3f\xa7\x7a\x7d\xf5\xd9\x1a\x55\xdd\x87" - "\x7c\x41\xea\x56\xca\x8f\x6f\x50\x8f\x67\xde\xbb\x95\x68\x38\x82" - "\xfd\x14\xbb\x26\x5b\xc3\x10\x4f\x2b\xef\xc3\xdf\x4b\x15\xf1\x0b" - "\xc5\x45\xef\xe9\x09\x26\xb0\x1d\xfd\x7f\xba\x38\x1a\xff\xc2\x79" - "\xfe\x10\x3e\x03\xf4\xf4\x6b\x28\x50\xb2\x25\x3f\x60\x60\x41\x1e" - "\xa2\x00\xc6\x70\x78\x86\x7f\x22\x49\x7e\x76\xf0\x07\x6d\x3f\x7c" - "\x7f\xfe\xb7\xf8\x8b\x10\xf4\x72\x7c\x6e\xd0\xc8\xf5\x95\xab\x20" - "\xd2\x2f\x50\x9a\x81\x52\x24\xd8\x1f\xf5\x36\x65\xd9\x38\xa6\x1f" - "\xd3\xc4\x81\x19\xf3\xc8\xf8\x95\x67\xa6\x7e\xa6\x14\xff\x67\xfc" - "\x0b\x5b\xa8\xaa\xe0\xba\xb0\x3c\xbe\xf4\x29\xd1\xde\x9f\x24\x35" - "\xe8\xd5\x55\xea\xa1\x2c\x9c\xdf\xc4\xd2\x3f\x6e\xc4\x97\x84\xf9" - "\x63\xda\xfa\x01\x2e\x77\x6e\x56\x81\x7f\x2c\xc8\xbf\x3e\xfe\x02" - "\x6d\x1c\xea\xdf\x68\xd5\xfd\x75\xe2\x67\x6c\xc7\x25\xc4\x7f\xe1" - "\x3f\x43\x7b\x84\x72\x3b\xa0\x1e\xd7\xe7\x06\x03\x1d\xe0\xff\xf5" - "\x56\x25\x49\xad\xa1\x03\xf9\x37\xa5\xf9\x3f\x27\xb9\xfd\x9f\x6f" - "\xc9\xf8\xf6\x84\xa3\x0d\xd2\x3f\xa5\xf6\x11\x00\x37\xc7\xf5\x27" - "\xc6\x06\x98\x4c\x6c\x55\x80\x09\x0d\xfc\xc9\xd4\x84\x21\x3d\x35" - "\xaa\x64\x6d\x70\xe8\xbf\xce\xdf\xd5\x9b\x65\x83\xb8\xce\xa1\x1f" - "\x94\x39\x25\x20\x8d\x9e\x87\x19\xe4\xb4\x5b\x7f\x33\x08\x9e\xa7" - "\x19\x54\xcf\x1a\x23\xfe\xd3\x00\x70\x43\xe1\xa5\xa0\xf5\xfb\xbf" - "\x7f\xc1\x3f\x0d\xd9\xc7\xf7\x7f\x7f\xa5\x3f\x26\x7a\x71\xf4\x44" - "\xfc\x87\xfe\x63\xfd\x8e\x92\xc9\x19\x4c\x4e\x60\xf2\xcd\x25\xe9" - "\xc7\xbf\xff\xfb\xfe\xef\xfb\xbf\xef\xff\xbe\xff\xfb\xfe\xef\xfb" - "\xbf\x7f\x82\x3f\x0d\x1f\x47\x30\xf9\xaf\xff\xbe\x3f\x9f\x86\x41" - "\x05\x35\x4c\xd2\x00\x53\x65\x94\xdd\x0e\x1a\x1d\x0c\xd3\x5e\xba" - "\x28\xcf\xd0\x4f\xd0\x45\x16\xa0\x6f\x7e\xe8\xbd\xcb\x0f\xf0\xba" - "\x46\x95\x3e\xf6\x52\x51\xf4\xad\xff\x34\xc8\xbc\x30\x1c\x17\x86" - "\xc3\x30\x18\x0e\x3a\x88\x80\x48\xb8\x0c\xa2\x20\x1a\x62\x70\xbc" - "\xa9\x87\x11\x30\x12\x2e\x87\x38\xb8\x02\xae\x84\xab\x20\x1e\x46" - "\xc1\xd5\xd8\x92\x04\xb8\x16\xc7\xf6\xd7\x21\x43\xc6\x04\x6f\x4b" - "\x19\x18\xe3\xf1\x1f\xfc\x3f\x0b\x8c\xfc\x39\xf7\xfb\xf4\xef\x34" - "\xdd\x2a\xa7\xb7\xcb\xe9\xf6\xef\xd3\xbf\xd3\x74\xc3\xdf\xf8\x77" - "\xcc\xdf\xf4\x57\x83\x2e\x5b\x78\x6d\x4d\x50\x5f\x19\x98\xaa\x91" - "\xff\xfa\x9f\xe1\x6b\xca\x0f\xc2\xe7\x5f\x3e\xf0\xcf\x88\xd7\x44" - "\x71\x5b\x0a\x20\xe6\x79\x99\xfa\xcf\x13\xaa\xa4\xf2\xb7\xb9\x13" - "\x2f\x07\x5e\x08\xb9\x19\x7b\x18\xcb\x65\x78\x5d\xa1\xe0\x11\x30" - "\x74\x04\xde\x69\xcc\xff\xac\x11\xc0\x7e\x0c\x2f\xac\xf6\x73\x33" - "\xc0\xf1\x28\x80\x2f\x66\x01\xfc\xef\x1e\x80\x13\xdd\x03\x38\x7b" - "\xca\x06\xa8\xfb\xd2\x24\xee\x0d\x78\x9d\x23\x44\x60\xd7\xf4\x4f" - "\xef\x59\xa7\x67\x67\x18\x6e\x1d\x3f\x71\xfc\xed\x3f\x58\x62\x48" - "\xc9\x4a\x31\xdc\x96\x7a\xeb\xad\x13\x52\xef\x98\x70\xeb\x0f\x0d" - "\xb7\xdd\x76\xd7\xad\xa9\x77\xa5\xa6\x1a\x56\xac\x2f\x5a\x76\x6b" - "\xea\x13\xf9\x86\xa5\xcb\x8a\x56\xac\x5b\x52\x94\xff\x75\x4d\xfa" - "\x26\x7f\x44\xde\xb5\x3e\xe0\x12\xf0\xe7\xf6\x14\x90\x7e\x53\x06" - "\xd2\x1f\x72\x61\x90\x78\x34\x55\xf2\x5c\x6a\x92\x7c\x05\x64\xaf" - "\xb4\x82\xe6\xc9\x26\xd0\x2c\xb5\x83\x26\xb7\x06\x34\x39\xc7\x40" - "\xb3\x3d\x0b\x34\xcf\x1b\x40\xf3\x9c\x11\x34\xa5\x9d\xa0\x31\x47" - "\x0d\x4e\xfb\x69\xb3\x48\xdb\x87\x65\xf7\xe2\xf5\x7a\x2a\x68\x5e" - "\x4d\x10\x69\x56\x3d\x68\xfe\xe3\x6b\xa5\xfa\x1d\xff\x5d\x6c\xdc" - "\x30\xe8\xcf\xce\x75\x8b\x66\xac\x62\xd3\x83\x4c\x8e\x7e\xff\xf7" - "\xfd\xdf\xf7\x7f\xdf\xff\x7d\xff\xf7\xfd\xdf\xf7\x7f\x7f\xe7\x7f" - "\x0e\x0d\x4c\xfc\x4a\xd2\xc2\x6f\x31\x2a\x72\x59\x74\x09\x76\xcd" - "\x9d\x13\x69\x2d\x09\xd0\x37\x53\xa0\xe3\xfb\x9e\x88\x4b\x8b\x3f" - "\xe1\xd8\xf1\x0f\xc3\x6b\xb8\x4e\xbd\x26\x85\xd6\x1c\x1d\x88\x4f" - "\x85\xb0\x78\x10\xeb\xa3\x2c\xac\x5d\x7c\x73\x7c\x1b\x74\x83\x8e" - "\xef\x19\x40\xdf\x89\x22\x7e\xb3\x1d\xde\x68\x50\xd6\x53\x29\x70" - "\xb4\x9e\x8a\xd6\x5f\x21\x2c\xff\x26\x21\xc4\xfa\x19\x3d\xfb\x69" - "\xbc\x34\xad\x16\x80\xbe\x37\x7d\xf1\x25\xe6\x68\x2d\x01\x38\xd0" - "\x28\xbe\x3b\xa5\xb5\x35\x88\xbf\xc3\x0e\xe5\x8d\x62\x3d\x15\x73" - "\x3e\x83\xe9\x98\xd6\x6d\x87\xad\xca\xf7\x13\xdd\x4a\xba\x6d\xcb" - "\x39\x68\x35\xf0\xef\x6a\x1c\xad\x06\x2f\xa4\x8f\xa1\xf6\x47\xc4" - "\x23\x6c\xc8\xb5\x34\xca\xba\x31\xaa\x5b\x86\xcf\x08\xa8\x0f\xdb" - "\x18\xb1\x50\xa9\x2f\x04\x8e\x28\x2a\xab\xe0\x41\xda\xbb\xb1\x4c" - "\x95\x82\x07\xe9\x51\x68\x74\xa4\x6f\xe4\x75\xec\x09\x46\x93\xe1" - "\xc3\xb4\xf0\xfc\x3b\x26\x74\xa6\x1d\x5d\x9a\x68\xb8\xe2\xd6\xe9" - "\xf9\x89\x37\xb1\xd4\xd8\xe4\xe7\x53\x2f\x33\x46\x18\x63\x26\xcc" - "\x4d\x95\xf4\xd2\x58\x29\x75\xa4\x5e\xba\xf1\x31\xfa\xb7\x7d\x74" - "\x12\xff\x35\x68\xd3\xb6\xe4\xdd\x61\x18\x3e\xe5\xc7\xcf\xad\x35" - "\xbe\xfb\x8b\x19\xc6\x7b\xe7\xaf\x1e\xf7\xdb\x54\xe9\xf2\x3f\x3c" - "\xff\x7e\xd2\x57\x04\x31\x66\x2c\xfd\xbb\xf0\x40\x58\xdc\x38\x0b" - "\x61\x69\x1f\x65\xf8\x2d\xa5\xdc\xac\x4d\x2b\xce\xbb\x7d\x42\x23" - "\xd5\xf8\xe0\xe3\x29\x16\x2a\x33\x63\xb6\x28\x23\x20\x26\xec\x53" - "\xe7\x8d\x7f\x87\x4a\x1b\x38\x0d\xa0\x15\xb8\xfa\x71\x5f\x25\x28" - "\x14\xa9\x63\x0f\xa7\x5e\x2b\xd7\xfd\x33\xfa\xf7\x91\xdd\xe3\x25" - "\xc4\x30\x32\x65\x2a\xe5\x4e\x70\xa5\xba\x0c\xad\x69\xda\x27\x12" - "\x93\x86\xdf\xfa\x0b\xbc\x4b\x7c\x22\x51\x2f\xe1\xfd\x8f\xc5\x3d" - "\xf1\x20\xef\x87\x02\x42\x2f\xdd\x10\x97\x96\x97\x77\xc7\x67\xce" - "\xbc\x3b\xf4\x92\xb1\x31\x2f\xcd\x78\x65\x65\xe1\x2d\x89\x69\x89" - "\x79\xb7\xeb\x25\xfe\x7b\x97\xf1\x86\x8a\x47\xf4\xd2\x4d\xbf\x49" - "\x1d\xa1\xd7\xfc\x57\x83\x06\x3e\x94\xe6\xed\xf9\x30\xec\x93\x4f" - "\x3e\x82\x9b\x57\x7c\xa4\xb9\x79\xd6\x47\x92\x66\xc4\x47\x51\x0f" - "\xc3\x7f\xe9\x87\xc3\x7f\xc5\xe3\x65\xb8\x17\xda\x34\xa5\x59\x6d" - "\xd2\xba\xdc\xb6\xb0\xd2\x23\x6d\xda\x87\xa0\x2d\x7c\xf1\x88\xb6" - "\x61\xf7\x3e\xd0\x36\xfc\xa1\xcf\xdb\x74\x37\x41\x5b\x04\x40\xdb" - "\x18\x90\xda\xc6\x42\x5c\xdb\x6d\x23\x9e\x6b\xbb\x77\xb4\x64\xbd" - "\xbc\xe7\x1e\xeb\xd5\xda\x19\xd6\x44\x3d\x58\x6f\x88\x04\xeb\x8d" - "\x51\x51\xd6\x9b\xf0\x1a\x07\x0d\xd6\x54\x7c\x4e\x83\x04\x6b\xf8" - "\x86\x61\x00\x82\x96\x8f\x0c\x00\x1f\x8d\x81\x29\x1f\x8d\xc5\xdf" - "\xeb\xf1\x4a\xc4\xeb\x06\xbc\x6e\xc2\x0b\xc7\x29\x1f\xd1\xfe\x3e" - "\x90\x34\x2c\xed\xdf\x7f\xb3\x64\xc9\xc4\x25\xb7\x67\x4f\x0b\x0b" - "\xcb\x4f\x84\xcb\x90\x6b\xda\xb4\xc4\x31\xe1\x93\xc2\xf3\x13\x3f" - "\x73\x1a\xf1\x5f\xbd\xf4\xe8\x7f\x87\x0d\x9b\xe0\x9a\xe4\xca\x7d" - "\xf7\x33\x2f\x44\x22\xff\x21\x50\x87\x7b\x2c\xa0\x71\x22\x8d\x4e" - "\x4b\xcf\x3d\x2e\x4b\x94\xde\x0e\x11\x05\x8a\x1e\x8b\xbc\xdf\xea" - "\x9d\x96\x32\xd4\xbf\xa8\xe4\xe0\x79\x9b\x29\x2f\xe3\x02\xe5\xf2" - "\x82\xe7\x91\x4e\x47\x95\x29\x79\x3d\xd2\x81\x2c\x7c\x46\xfd\xd7" - "\x4d\xf2\x87\xb5\x86\x39\x2d\x9a\xcd\x98\xb7\x67\x30\x1e\x2b\xe2" - "\x49\xaf\xc0\xbc\xb6\x20\x79\xf7\x39\x2d\x73\xa9\x8e\xce\x80\x3a" - "\x9c\x4a\x1d\xf4\x3d\x77\x1d\xda\x17\xf9\x1d\x9f\x25\xa2\x85\xca" - "\xda\xdc\x0e\x68\xf4\x75\x69\xb4\xe6\x43\x40\x78\x5c\x96\xe8\x44" - "\xa5\x3c\xc1\xd1\x7e\x04\xf4\x1d\x1e\x5f\xef\x09\xd1\x0f\xd2\x7a" - "\xcf\xed\x88\xc3\xb0\x56\x73\xd5\x71\x88\xf2\x52\x19\x3b\x44\x17" - "\x38\xa5\x83\x58\x77\x74\xae\xe2\xe7\x30\x8d\xaf\xcf\xa7\x3a\xb0" - "\xed\x65\x98\x57\x32\x98\xe6\x83\x23\x05\x5f\xa2\xab\x95\xbc\x0b" - "\xad\x21\x14\x65\x18\x73\x5a\x0e\xfa\xb0\xcc\xa1\xc1\xf8\x58\x99" - "\xd3\x22\x3d\x87\x79\x5d\x41\xf2\x36\x8b\xba\x62\xb4\x41\xf2\x2c" - "\x98\x27\x61\x9e\x21\x44\x5e\x18\xe6\xa5\x05\xcb\x6b\xad\xe1\x38" - "\x73\xfa\x79\x1e\x13\x6d\xc4\xe7\x02\x85\xe7\x5f\xdf\x1e\x92\xf7" - "\xad\xc8\xf7\x98\x9a\x40\xfc\x84\xdb\x29\x1d\x26\x7c\x2d\x83\xeb" - "\x3e\xa4\x71\x5a\x32\x50\x17\x62\x8e\x0e\xce\xfb\xf8\x1a\xe4\x03" - "\xd1\xe5\x08\x92\x97\x80\xed\x41\x7f\x1d\x1b\x15\x04\xe7\x30\xcc" - "\xb3\x63\x5e\xd2\xd7\xc8\x43\xcf\x7d\x38\xed\x77\x30\x1a\xc2\x4f" - "\xc0\xc8\xc9\xd4\x1e\xa1\x17\x30\xec\x04\x8c\x38\xdc\x23\xd6\xbe" - "\x3b\x0c\x1b\x20\x0c\x9f\x5f\x65\x16\xeb\x15\x98\xdf\x8d\xfa\xa4" - "\xb3\x9d\xf3\xc0\x09\x88\xad\x44\x98\x30\xfa\x56\x95\xfa\x27\x4c" - "\x0f\xb3\xb9\x3d\xf4\xbd\x06\xea\x59\xec\xdb\xf8\x2b\x61\x39\xfe" - "\xfd\xc9\xbc\x1a\x48\x24\x1a\xf9\x7a\x55\x8b\x55\x43\xeb\x3f\xa9" - "\x3f\x74\x4a\x70\x93\x93\xeb\x6c\x2c\xf6\x7f\xba\x06\x79\xad\x2e" - "\xd1\xa0\xc5\xb2\x1b\x25\x3d\x5f\xfb\xed\x40\x5c\x44\xc3\x03\x3e" - "\x8b\x55\xea\xc7\x23\x59\x2f\xa3\x75\xbc\x3d\x16\x69\xa6\x53\x8a" - "\x65\x02\x8f\xde\xa0\xe0\x21\x38\xac\x8b\xaf\x87\xef\xb1\x68\x7f" - "\xa2\x82\x49\x57\xd7\x35\xc1\x09\x61\x44\xf3\x71\xd0\xd7\x50\x7d" - "\x72\x1b\xf9\xda\x5a\xdb\x5a\x0f\xd8\x30\xbe\x38\x01\x7a\x33\xb6" - "\xd5\x70\xc0\x4d\xdf\x34\x5b\x47\xd4\x6f\x02\xe0\x76\x21\x81\x41" - "\xc6\x59\xad\xe0\x24\x1c\xaa\xb6\x8e\x14\xf5\x53\x5b\x75\x20\xc3" - "\xb6\xaa\x69\x24\xbc\xd8\xae\xab\xea\x10\xae\x15\xa3\x16\x19\xa6" - "\x4b\x81\x51\xc9\x60\x8c\x4c\x1f\xf1\x87\x64\xb6\x50\xb1\x4f\x97" - "\x65\x04\xf6\xff\x97\x75\x09\xbb\x1d\x48\x97\x69\x88\x17\x34\x68" - "\x90\x06\x8d\x55\xe0\x1f\x91\xa1\xe0\xb7\x83\xde\xad\xa6\xb9\x8e" - "\xc3\xea\x23\x84\x9d\x72\xd8\xe2\x01\xd8\x58\x3f\x58\xe4\x85\x24" - "\x64\x00\x92\x1d\x46\xe4\x21\x3f\xc2\x10\xa6\x19\xe5\x6d\x50\x60" - "\xe4\xf6\xc7\x63\xde\x14\x19\x5f\xab\x0a\x5f\x31\xe1\xa3\xf5\xaf" - "\xc2\xf7\x8e\xb0\x0f\xf8\x3e\x68\xc3\x67\xc7\x60\xff\x4a\xf6\x3a" - "\x52\x87\x70\x89\x94\x6e\x1a\x0b\xfa\x93\x30\xe2\x8b\x1e\x29\xac" - "\x4b\xf0\x62\x24\xfa\xbf\xe8\xfe\xd8\x06\x9f\x27\xda\xc1\xe0\x96" - "\xeb\xcb\x23\xde\x0c\xf8\x5b\xaa\x73\x64\xb6\x52\xa7\x92\xaf\xb6" - "\x19\x63\xc4\x04\x8c\x4f\x8c\x6f\x18\x13\x8c\xa3\x95\xd8\x65\x72" - "\xeb\xd2\xc4\x09\xce\xc9\xad\x86\xdb\x53\x5f\xcb\x4f\x4c\xe6\x7d" - "\xff\x4d\xc7\x53\xc7\x62\xef\xfe\x07\xfe\xef\x4f\x28\x25\x91\xa7" - "\x60\x3a\xdd\x8f\xa5\x7b\x39\x5e\xc0\xbb\x07\xe7\x85\x0d\xbf\xa1" - "\x88\xee\x44\xe4\x60\xbc\x72\xd1\xe3\x61\xe9\xf2\x7d\x8c\xc8\xb9" - "\x85\xc7\x1c\x49\x53\xe9\xfe\x46\x8e\x6b\x42\x23\xd5\x3c\xfe\xf9" - "\xd4\x1f\xcd\xff\x55\xd8\x47\xcf\x3d\x69\x8c\xba\xc9\x42\x30\xc9" - "\xf7\xa7\xee\xc2\x94\x03\x94\x32\xf6\x67\x9c\x02\x75\xa9\x7d\x54" - "\x4a\xce\x4f\x48\x9e\x9e\xfa\x6f\x0b\xe6\x5d\xff\x87\xd4\x91\x97" - "\xff\x76\xe1\x01\x2a\x7f\xf9\x48\xbf\x9a\xc6\x0e\x50\xf5\xd8\x8e" - "\x71\xcf\xfe\xe0\x35\x81\x65\xfe\xbc\xb0\x3f\x18\x47\xaf\x2a\xa2" - "\xd4\xeb\x79\x2c\x46\xb1\xca\x84\xb3\xa9\xe1\xcf\xcd\xff\xec\x3f" - "\xe6\xef\x6e\x7f\x64\x1c\xb6\xf4\xf2\x9f\xb4\x3f\x32\x7f\xf7\x67" - "\xff\x11\xf6\x0c\x41\xde\x9c\x97\x1a\x67\x08\x9f\xbc\xa6\xf5\x81" - "\x71\x9c\xaa\xab\x2a\xe3\xab\x47\x35\x5e\xdd\x7c\xcd\xfe\x84\xb6" - "\x6b\xff\x7b\xf4\x9f\xae\xfb\x3f\x83\x73\x0c\xc3\x38\xe2\x9e\xd4" - "\x31\xfd\x71\x04\x60\x1c\x71\x1c\xe3\x88\x52\x8c\x23\x8e\xa8\xe3" - "\x88\xdf\x45\xde\x55\x22\x62\x09\x01\x2f\xe2\x9f\xe4\xff\xc6\xf8" - "\x67\x25\xc6\x3f\xc9\x1f\x85\x3f\xf8\xd0\x47\x51\xd9\x22\xfe\x19" - "\x11\x3b\x8c\xc7\x40\xa3\xf0\x17\xe3\xa0\xff\x1a\x83\xbf\x49\xf8" - "\x3c\x6e\xe4\x70\xff\x98\x68\x6e\x4c\x5b\xf8\x42\x8c\x89\xd2\x30" - "\x26\x32\x2e\x69\xd3\xcd\xfc\x4d\x5b\xc4\x24\x63\x5b\x64\x7f\x5c" - "\x34\xa3\x2d\x3d\x7e\x42\xdb\x4c\x2d\xb4\xdd\x07\x22\x36\xda\x02" - "\xa9\xbf\xd3\xc6\x69\x3e\x8e\x02\xed\xc7\x31\x0d\x91\x1f\xc7\x5a" - "\xad\x1f\xeb\xf1\x1a\x01\x0d\x1f\x8f\x84\xe1\xbf\xbd\xa7\x01\x7e" - "\x3b\xad\xd4\xfe\x91\x16\x62\x3e\x8a\x80\xb3\x1f\x8d\xc0\xdf\xdc" - "\x97\xe0\xa3\x1f\x83\xf6\xa3\x48\xed\xd9\x81\xf6\xc6\x7d\xf1\xd1" - "\x98\x0f\x27\x7f\x34\x36\xed\x3f\x3f\xba\x3e\x7d\xee\x47\x89\x1f" - "\x7e\xf8\xd1\x0d\xf6\xd1\xea\xb8\x89\xda\x0c\x70\xcb\x16\x8a\x60" - "\x91\xdf\xb7\x27\x0d\x4b\x1d\xf6\x6c\x3e\x8f\x07\xef\x90\xe3\xc2" - "\x3b\x8c\xd3\x9f\x9b\x3f\xff\xf1\x30\xc9\x38\x9a\x47\x97\x72\xa4" - "\x39\x10\x7d\xfa\xc7\x9c\x93\x5b\x07\x62\xce\x44\xe7\x40\xcc\x69" - "\x18\x36\x79\xad\x5f\x7c\xd6\x87\x69\x47\xd3\x12\x0d\x37\xa4\xf2" - "\xc8\xac\x7d\x54\x60\xb4\x36\x7e\x5b\xea\xe4\x44\xdd\xed\x1d\x18" - "\xb3\x0d\x2f\xff\xf1\xe3\xbf\xa0\x0b\xa3\xb6\xf3\x7a\xe9\xb9\xe5" - "\x4b\x26\xe5\x3c\x73\x33\xca\xfc\x72\x8a\x82\x87\xff\xf8\xd9\x96" - "\x1f\xff\xf8\xb9\x96\x8f\x1e\x99\x37\xee\x1d\x4c\xfb\x6d\x62\x31" - "\xea\xcf\xff\xcb\xfb\x7f\x13\xce\xa6\x85\xff\xf8\xa1\x96\xe7\x7e" - "\xfa\xc4\x13\xad\xa4\x2f\x24\x5b\xa5\x8f\xea\xb1\x8c\xc4\x98\x44" - "\xf3\xae\xcb\x72\x05\xc6\x3f\xa3\xda\x02\xfb\xb2\xef\xed\xf2\x7b" - "\xbb\xfc\xde\x2e\xff\x16\x76\x79\x25\x08\xbb\x1c\x55\x19\xcc\x2e" - "\x67\xce\x99\x91\x79\x97\x61\xcd\xe3\x06\x53\xd1\xaa\x27\x8a\x96" - "\xac\x30\x14\xae\x5a\x92\x97\x9f\x17\x09\xfd\x19\x4b\x1e\x2f\x5e" - "\xb6\x76\x49\x71\xfe\xa0\x6f\x1b\xe3\x95\x98\x74\x70\x6c\x3d\xca" - "\x1d\x3a\xb6\xbe\x3a\x2e\xf8\xb8\x44\x83\x7d\xfb\xd5\xa9\x41\xf2" - "\xc6\xca\x79\xb3\x82\xe4\x4d\x95\xf3\x0a\x82\x8c\x01\xa3\xc5\x18" - "\xe3\xea\x2d\xc1\xf2\x30\xbd\x46\x89\x49\x70\x9c\x26\xb5\x8e\xed" - "\x06\x8a\x49\x4e\xc0\xd5\x1f\x62\x9b\xba\x30\x7f\xbf\x12\xcb\xd8" - "\xe1\xea\x2d\x4a\x8c\x26\x8f\x43\x92\x9c\x16\x23\xb6\xf3\x6a\x7b" - "\x90\x31\xca\xcd\x72\xbd\x9e\x81\xd8\x68\x8e\xc1\x65\xb9\x26\x6a" - "\x70\x6c\xd4\x0e\x62\x0c\x79\x4d\x52\x00\xec\x24\x05\x16\xe3\x49" - "\xda\xf3\xa1\x9b\xbe\x49\xeb\x86\x6b\xf6\x33\xcb\xa8\x6a\x8a\x29" - "\x69\x1c\x49\x78\xc4\x58\xb2\x83\x8f\x25\x71\xac\xd8\x89\x65\x8b" - "\x55\xe3\xc9\x4e\x8c\x8d\x87\xd3\x78\xf2\x04\x5c\xf3\x2a\x8d\x29" - "\xb7\x73\x5c\x27\x09\xd7\x6c\xc2\x65\x87\x6b\xac\x3c\xee\x13\x65" - "\x9b\x55\xf3\x66\x38\xae\xbd\x86\xef\x05\xaa\xc4\x85\x98\xdf\x6e" - "\x97\xbe\x8a\x53\xda\x40\xb1\xa0\xdc\x8e\x32\x21\x87\x6b\x82\x8c" - "\x7f\xda\x7f\x22\xc6\x81\x09\xfd\xe3\x1f\xc2\xe7\xb3\x8c\x7a\xbb" - "\x8e\xe3\x4c\x48\x54\x70\xaa\xf5\xf2\xf1\x55\x2b\x97\x2e\x7b\x62" - "\x4d\x51\xbe\x61\xf5\xac\x59\x86\x15\xab\xf2\xf2\xc7\x8f\x1f\x1f" - "\xe9\xa7\x7f\x51\x22\xa6\x3d\x68\x24\x3d\xa4\xb8\x56\xd6\x43\x23" - "\xc6\x9c\x72\xdc\x9c\x50\xe6\x3f\xbe\x38\x68\x94\xe3\x5b\xfa\x86" - "\x2b\x55\x86\x69\xf4\x83\x41\x7c\x72\x8c\x4c\x71\x6e\x8c\x0c\xd3" - "\x16\x88\x07\xf3\xf8\xb8\x88\xbe\xb3\xeb\x11\xed\xeb\x0e\xc0\x73" - "\x8f\x3c\xde\x41\xbd\x1f\x26\x8f\x13\xae\xd5\x07\xe0\xb9\x67\x60" - "\xbc\xa1\x51\x60\x26\xaa\xc7\x26\xf8\x9c\xae\xc8\x64\x20\x8e\x3f" - "\xd0\x25\x70\x6b\xf4\x03\x71\xff\xb5\x85\x01\x63\xa9\x2b\x07\x70" - "\x83\x5e\x86\xa9\xf2\xa7\xf1\xc0\x49\xb9\xad\x3a\x15\x9e\x7d\xfe" - "\x78\x0e\xfc\x45\xc6\x13\xa6\x82\xe9\x08\xa0\xb1\x6b\x30\x8d\xd6" - "\x18\x81\xbb\x01\xeb\xb7\xcb\x6d\x1b\x1d\xd0\x7e\x84\xe1\xb8\xe3" - "\x10\x26\x41\x81\x99\xa8\x1e\x4b\xd1\x78\x8e\x7f\x7b\x09\xa3\x67" - "\x91\x3e\xe1\x35\x0c\xe9\xfe\xb3\x6a\x4c\x37\x5c\x2e\x17\xd8\xfe" - "\xe8\x1e\x1c\x2f\xd4\xfb\x8d\xd3\x46\x07\xb4\x1f\xc7\x86\x23\x15" - "\x1e\x69\x15\x98\xc0\xf6\xdb\x05\x8d\x23\x46\x0c\xb4\x7f\x74\x47" - "\x00\x9e\x2b\x49\xa7\x08\x97\xaa\x2e\x4f\x00\x9e\xe3\x32\x1f\x55" - "\xbc\xbe\xce\x10\x20\x8f\xff\x95\xe9\x51\xf1\xfa\xba\xf4\x00\x3c" - "\x67\x28\xdf\xbf\x5d\xd7\x15\x04\xe0\x39\x33\xd0\x2e\xd4\x63\x01" - "\x53\x19\x30\x8e\x95\x98\xe5\xb7\xd1\x01\x78\x9a\x15\x98\x9e\x61" - "\xcf\x35\x08\xd9\x5e\xd7\xaa\xf8\x22\x21\xd7\x84\x54\xc2\x8d\xe9" - "\xc7\xd4\xbe\x00\xe9\xea\x1a\xcc\x27\x03\x04\xf2\x49\x45\x97\x3c" - "\x16\x37\x24\x06\xb4\xef\xa4\xcc\xa7\x48\x15\x9e\x8c\x80\xf6\xfd" - "\x45\xc6\x13\xae\x82\x09\x90\xff\x81\x6e\x19\x8f\x56\x05\x13\xa8" - "\xff\xa7\x64\x3c\xea\xba\xf6\x7d\x3d\x9f\x0c\x7e\xfa\x4f\xbc\xc2" - "\xb4\xee\xaf\x99\x83\xd2\x89\x77\x07\x63\xb0\xff\xdb\x5d\xc3\xbf" - "\x8d\x8e\x19\xbe\x8f\xf6\x90\x42\x1f\x6d\xe4\x73\x83\xbd\xe4\xa7" - "\xc7\x98\xeb\xd1\x9f\x89\x36\x40\xaa\xf0\xdd\x63\x96\x00\xdf\x8b" - "\x75\x4c\x96\x1d\x62\x8a\xd5\xef\x01\xec\x30\xa6\x52\xce\xc3\xf6" - "\x5f\xd1\xa1\xe4\x51\xba\x98\x5f\x1c\x83\xfd\xdf\x28\x93\xe8\xc7" - "\xc6\x14\xca\xb0\xe8\xf7\x13\x32\x82\x7d\xaf\x1c\xea\xfd\xcb\xea" - "\x78\xe6\x2b\x1d\x45\xdf\x2f\x9f\x9d\xe4\xb3\x30\xb0\x99\xdd\x60" - "\xb8\x1a\x4a\x8f\xc3\x58\x1d\x8d\xf1\xb7\x6f\x00\x5d\xa9\x89\xb9" - "\x69\xbf\xd9\x23\x8e\x6e\x28\x75\xb0\x2e\x3a\x6b\x60\xd3\x59\xd0" - "\xd1\x99\x01\x9b\x9e\x82\xf8\xd6\x92\x2f\x82\x7e\x83\xeb\xa3\xb3" - "\x01\x13\xa8\x6c\x27\x1c\xa9\xe9\x84\xd2\x1a\xff\xb2\xa5\xd7\x42" - "\xfc\x61\x3a\xb7\xc0\x02\xb1\x44\x07\xbd\x4f\xf1\x44\x9e\x9d\x54" - "\xf2\x32\x68\x4b\x31\xba\x3c\x9c\x67\x55\x68\x69\x27\x5a\xb6\x9c" - "\x04\xdd\xee\xa5\x56\xe9\x99\x93\x44\xaf\x77\xd2\xde\x0d\x6e\xe9" - "\x40\xfc\x2c\x38\x10\x7f\x0c\x5a\xe3\x27\x43\xab\x39\x1d\xb6\x9f" - "\x84\xa8\x03\xee\x34\x68\xd5\xce\x80\xd6\xc4\x74\xb0\x75\xe3\xbd" - "\xc1\x8b\x30\x4e\xbe\xdf\xd1\x09\x18\x6b\xdd\xb9\x1c\x74\x76\x81" - "\x13\x79\x36\xf6\x90\xb2\x77\x0f\x3d\x07\x6b\xc7\xea\x51\x10\x8f" - "\xf4\x75\x21\x2d\x77\x1e\x87\xeb\xc3\x13\xe3\x21\x95\xfa\x5f\x5b" - "\xb5\x07\xb4\x25\x10\x11\x42\x2f\xe2\xf8\xbe\x9f\x18\x47\xd5\xbd" - "\x84\x7d\x3d\xfe\xf6\xa0\x4e\xb8\x2c\xd7\xa7\x61\xdd\xc7\xe4\x79" - "\xaf\xee\xd2\x57\x51\xcf\xd6\xe5\xd0\x3e\x20\xd8\x4f\x5f\x9f\xa3" - "\xe4\xd1\x7e\xa6\xb4\x4f\xe9\x84\x38\xd0\xdb\x3c\x46\xf8\xa0\xb7" - "\x8b\xbe\xb5\xef\xa6\xfd\x0f\x08\x1f\xf6\xf9\x61\x34\xff\x84\xf4" - "\x8c\xc3\x3e\xbe\xfb\x7a\x84\xc3\xf2\x28\xff\x76\xbe\x87\x30\xbb" - "\x6a\x81\xd3\x77\xd5\x82\xb3\xbe\x9f\x2e\xe8\x61\x3f\x5d\xf0\x95" - "\xf7\xa7\x0b\xbe\x2c\x5d\x0f\x3a\xef\x55\x0b\x1c\x47\x4c\x5c\x06" - "\xfa\x23\xa6\x53\xf4\xdd\xbc\x6e\xe3\x29\xd0\x2f\x7a\x0a\x65\xef" - "\xf9\x14\x36\x2e\x83\x78\x5f\x44\x9f\xc3\xe6\xf9\x04\x16\x95\x00" - "\xf3\x45\x78\x82\xca\xb6\x27\xd2\x6b\x56\xe6\xd3\x5c\x96\x44\xbd" - "\x5d\x72\xa6\x52\xbd\x8e\xe8\x70\x33\x5e\x25\x78\x95\xe1\xb5\x85" - "\x45\x7a\xb7\x20\xaf\x4a\x63\x36\x6b\x80\xf6\xeb\x99\xe0\x03\xcd" - "\x49\x48\x4c\xa6\x33\x8d\x43\xf0\x2d\xc1\xb7\x3d\x0e\x6e\x2a\x83" - "\x4d\x2e\x57\x01\xed\x9b\xea\x20\xfb\xa2\x78\x14\xeb\x31\x63\x3d" - "\x5c\xe7\xd1\x46\x9c\x2c\x26\x8e\xde\xe5\x75\x39\x9f\x2e\xd0\x38" - "\x9e\x2e\x90\x7a\x62\xe2\xc2\x10\xa6\x06\x61\x9a\x64\x1e\x76\x11" - "\x2e\xb4\x1b\x47\xb4\x07\xc2\x10\xa7\xe9\xdd\x73\x1d\xda\xda\x97" - "\xd8\x31\x84\x6b\xed\xc7\x85\xb8\x77\xf2\x38\x29\xb1\x43\x49\xa3" - "\x38\x69\x1b\xc2\x51\x79\x9b\xdb\x48\xf5\xd8\x6d\x85\x5d\xb4\x5f" - "\x45\x24\xeb\x13\xf5\x51\x0c\x47\xb6\x1a\xed\x86\x61\x2e\x0b\x64" - "\x11\x6e\x2a\x67\xeb\xee\x02\x2c\x17\xc6\x4a\x0b\x30\x5e\x84\x39" - "\x2e\x56\xa0\xa1\xbd\x6b\x0f\x60\x79\x51\xf7\x0d\x46\x85\x46\xaa" - "\x83\xef\x5d\x4b\x74\xa2\x3e\x1c\x28\x74\x43\x74\x35\xcd\x93\xc3" - "\x3c\xc2\x47\xb8\x50\x0f\xec\xd8\xd6\xb0\x03\x85\x0e\xf0\x31\x3f" - "\x9c\x76\x19\x5f\x95\x1f\x3e\x4c\x67\x88\x8f\xf4\xaf\x15\xcb\x44" - "\x37\x70\x7c\x73\xdf\xf5\x11\x3e\x37\x68\x0d\x9c\xde\xf9\x84\x83" - "\xef\x03\x8d\x38\xad\x6b\xa7\x62\xec\x78\x83\xdb\x51\x5a\x10\xc6" - "\xbf\x93\xc7\xf2\x7b\x37\x75\x85\xb3\x9e\x9c\xb0\x18\xfe\x8d\xfc" - "\x54\xa0\x77\xad\x08\xf3\x47\xd6\x53\x10\x16\xdd\x8d\xb1\x1e\xc2" - "\xd0\xbe\x59\x44\xa7\x5a\x96\x73\xa7\xcf\x9f\x0c\xf3\xd3\x67\xa6" - "\x4f\x86\xd9\xf7\x4c\x9b\x0c\xa9\x77\xa6\xa4\x4e\xfc\xc1\x0f\x7f" - "\xc0\x6f\x7e\xf0\xc3\x49\x3f\x80\xac\x87\xe6\x4e\x86\xac\x39\x93" - "\x61\x1e\x5e\x59\xf3\xa6\xcf\x4d\x9f\x3e\x6f\x32\xe4\xcc\x98\x89" - "\x4f\xd3\x26\xdf\x9a\x7a\x6f\x4a\xd6\xb4\x99\xd3\xe1\x81\xec\xdb" - "\x52\x6f\xbb\x0d\xee\x99\x3e\xeb\xd6\xd4\x54\xf9\xf7\xd6\x54\x02" - "\x79\x64\xd2\xf4\x79\x29\x59\x45\xab\x8a\x57\xa5\xcc\x99\x39\x8d" - "\x52\x60\xfa\xf4\xc9\x59\x7e\x71\x64\x92\xf7\x9c\x97\xf8\xed\x64" - "\x67\x32\x68\xbf\x62\xa8\x43\x3d\xc0\xab\x9b\xef\x83\x04\x37\xfd" - "\xbe\x8e\xe4\xc7\xfb\x82\x1b\xe3\xa8\x3f\x75\x59\x6e\x24\xf9\xf3" - "\xf9\x5b\xda\x33\xf8\x04\x8c\x9f\x8c\x79\xa3\xe4\x78\x24\x1c\xf3" - "\xdd\xfe\xf9\xe3\x16\x62\xfe\x75\xb4\xaf\x8e\x0d\x2f\xe4\xbd\x13" - "\xfd\x21\xf2\xd8\x01\x3d\xa5\x39\xe1\x7c\x5f\x43\x94\x3b\xed\x37" - "\xe1\xb2\xdc\x34\x51\x65\xf7\x9d\xb4\x2f\x05\xcd\x27\x9f\x86\x9b" - "\xa2\x8f\x14\x1b\xb9\xac\x6c\xc5\x32\x8e\xb3\xfd\x38\x22\xe5\xbd" - "\x11\xed\x75\xb4\xe7\x87\xc0\x53\xa2\xf2\x11\xb4\xdf\x71\xfb\x76" - "\xcc\x93\x71\x3d\x70\x04\x7d\x05\xfa\xf2\xa9\xbe\xd2\x24\x60\x91" - "\x67\x8d\xbe\xbe\x24\x10\xf3\xaf\x37\xed\x53\xe9\xb6\xb3\xd5\x8c" - "\x70\xbb\x33\x34\xb4\xff\x02\xdf\x8b\x01\x6e\xb4\xa2\x8e\x3b\xbd" - "\xdb\xc3\xb7\xb2\x33\x7c\xff\xc3\x61\xd8\xbe\x14\x6c\x5f\xa2\x6f" - "\x7b\x78\x39\xdf\x4b\x94\xc3\x25\xc5\x31\x7a\x8e\x41\xb8\xbe\xfe" - "\xb4\x2b\x28\xcd\x45\xef\x77\xd0\x66\x19\xe3\xe9\x61\x98\xfe\x09" - "\xfa\xb5\x0e\x84\x2d\x27\xd8\x09\x1e\x18\xce\xf7\x3d\x29\xd5\xc0" - "\x71\x48\x5a\xe8\x8b\x09\xaf\x50\xd5\x47\x78\x16\x8a\x7e\x0c\x65" - "\x71\x06\xf1\xf4\xf0\x74\x09\xd3\xdf\x43\xfc\xcf\x93\xbf\x14\x3e" - "\x7c\xfc\xa3\x00\xfd\xef\x45\x06\x9e\x69\x5f\xe7\x4d\xe2\xf9\x00" - "\xf2\x92\xde\x13\xd0\x3b\x7e\x97\x25\x09\xe3\x9f\xc4\x0c\xd1\x57" - "\x8e\xe7\x75\xd0\x3e\xb2\x2c\xea\xa1\x54\xc4\x5b\x69\xdd\xd0\xcd" - "\xcf\xc9\xb1\x43\x52\xa1\xaf\xb4\x00\x02\x68\x4a\x22\xfa\xc9\x87" - "\x20\x2f\x52\x50\x0f\x22\x5c\x96\x71\x10\xa0\x07\x09\x88\x67\x2b" - "\xd2\xd7\x81\x6d\xda\x8a\x78\x12\x7d\x3d\x05\x64\x1b\x12\xda\x16" - "\xc6\x4a\x03\x38\xe4\xf2\x46\xff\xf2\x37\x75\x52\x39\x84\x0f\x77" - "\xf5\x10\xfc\x4d\x5d\xc4\x73\x59\xef\x50\x2f\xc7\x99\x02\xf4\x72" - "\x0c\xd2\x72\x87\x2a\xbf\x2a\x20\x3f\x1c\xf3\x7f\x24\xe7\xa3\xed" - "\x8f\x6b\x0e\xa0\xf7\x10\xe6\x4f\x41\x7a\x9d\x68\xdb\x61\x58\x5f" - "\x63\x9d\x1c\x9b\xc8\xf0\xf6\x00\x78\x0f\xc2\x4f\x23\xbd\xa1\x7e" - "\x87\xe0\xeb\x65\xdb\x41\x78\x9d\xcb\x72\xb3\xde\x1f\x3e\xe5\x0b" - "\x84\x9f\x35\x40\xdf\xcd\xa9\xfe\xf9\x37\xbb\x31\xff\x01\xd2\x75" - "\xfc\x7d\x94\x62\x7d\xf2\x27\xe4\xcb\x0e\x14\x92\xbc\x6e\xce\x0d" - "\x80\x2f\x43\xb8\x3c\x99\x47\x92\xcc\xa3\x46\x79\xec\x7e\x4c\xa6" - "\x61\x67\x40\x99\x7d\x58\xa6\x10\xf9\xb8\x55\xd1\xcb\x20\x65\xda" - "\x02\xca\x74\x91\x1c\x99\xa8\x47\xeb\xea\x1b\x28\x23\xfb\x49\x35" - "\x0e\x6a\xdb\x65\x2e\xcb\x2d\x51\x01\x6d\x4f\xc7\x7a\x8b\xb7\x09" - "\xbf\x73\x19\xea\xd0\x6d\x98\x76\x3b\xe2\xdc\x46\x36\xb0\x9d\xe2" - "\x41\x87\x1b\x58\x69\x46\x94\xd0\xdd\x5b\x56\xc4\x78\x80\xee\x53" - "\xe8\x9e\x70\x33\xd7\x2c\xd9\x26\x6f\x59\x81\xbf\x94\xce\xcf\x7d" - "\x21\x3f\xcc\x5c\xf7\xfb\x04\xce\x5b\x5e\xa0\xf3\xbe\xf0\xd9\x2b" - "\xd7\x91\x42\x7b\x85\x22\xfd\x15\xd8\xef\x00\x5b\x87\x70\x1b\x60" - "\x1a\xa6\x5f\xcb\x6d\x55\xc0\xf1\x67\x51\x47\x06\xe9\xf7\x44\x7c" - "\xbe\x42\x2e\x1f\x4d\xf8\xf0\xfe\x56\xf9\x5e\xe3\x25\x5c\x67\x14" - "\x1b\x4c\xe1\x7b\x78\x92\x1d\x72\xfc\x58\x9e\xf6\x65\x15\x38\x93" - "\xbf\xc4\xdf\x99\xf8\xfb\x29\xfe\x3e\x80\xbf\xef\xd1\x3e\xa9\xa5" - "\x5e\x6e\x8f\xf4\xfc\x1a\xfe\xce\xc5\xdf\x17\xf0\x77\x1e\xfe\x6e" - "\xc4\xdf\xa9\xf8\xfb\x30\xd9\x05\xed\xf9\x4e\x7b\xd7\x60\xdf\x2a" - "\x74\x8b\xde\xfd\xb9\x32\x88\x07\xd3\x11\x26\x9d\xdb\xab\xf0\x2f" - "\x3a\x21\xc7\x64\x7e\x16\x0f\xea\x03\xa5\x0d\x17\xfa\x20\xd2\xbc" - "\x8a\x1f\x3a\x33\x90\x26\xfb\x26\xd9\x16\xe5\x34\x81\x3f\x0b\xf1" - "\x27\x10\xad\x4c\xe0\x0a\x17\x32\x97\xf1\x8b\x72\xda\x20\x75\x6a" - "\xd4\x75\xda\xe1\x16\x07\xed\x7b\x84\xbf\xc7\xf8\xbe\x92\x90\x12" - "\xc5\xb8\xde\x63\x3f\xcb\xf1\xdd\xd2\x22\xc3\x55\x11\x8f\x79\x79" - "\x91\x9e\xac\xd2\xa5\x91\x2e\x4b\x4a\x4e\x80\x2e\x61\xac\x7f\xe3" - "\x73\xa4\x33\xc4\x77\x6a\x5b\x8c\x89\xf7\xe5\xbc\x2d\x1c\xff\x19" - "\xa1\x93\x75\xf2\xda\x24\x61\xbf\x29\x0d\x01\x78\xf6\x23\x9e\x8a" - "\x00\x7b\xef\x1e\xe8\xd7\x52\xda\x03\xfc\x51\x23\xd6\x87\xbe\xf2" - "\xe6\x2e\xd9\xaf\x3a\xc3\x4a\xc8\x5e\x52\xdc\x76\x38\xc9\xf7\x94" - "\xc3\xfc\xed\x84\xc7\x59\xca\xf7\xeb\x77\x86\x99\xa8\xbd\xe3\xe3" - "\x95\x7c\x9e\x17\x1d\x57\x46\x76\x10\x56\xc8\xf3\xb0\xff\xbb\x5e" - "\xaf\xe4\x81\xd8\x07\xce\x19\x56\xcc\xf3\xb2\xfa\xf1\x56\x9c\xcd" - "\x95\xf1\x86\x05\x3d\x7f\xa1\xfc\x6c\x56\x0a\x80\x74\x73\x19\x84" - "\xdb\x3c\x47\x21\xd3\xc3\xbc\x29\x65\x10\x61\xf3\xec\x81\x71\x00" - "\x23\x6c\x9e\x63\x70\x33\xc0\x18\x9b\x67\x27\xc6\x2b\x8d\x94\xff" - "\xc1\x4d\xa0\xd1\xe0\x6f\xe9\x8d\x65\x92\xc6\xe6\x29\x86\xc4\x32" - "\x2d\xfe\x16\xc2\x8c\x70\xe6\xb2\x79\x66\x21\x5c\x1e\x64\x7a\xd9" - "\x99\xf4\x70\xf6\xd9\x62\x2f\xe8\x67\x3d\xcb\x4a\x6d\x1e\x1c\x3b" - "\x78\x0e\x61\xba\x8f\x65\x7a\xcf\xe3\xe5\x62\xbe\xf2\xb3\xb9\x99" - "\xde\x33\x6c\xda\xb3\x1f\xe0\xf3\x67\x0c\x65\xc9\x6c\x9e\x34\x38" - "\xe2\x74\x22\x5c\x29\x63\x5b\xcf\x66\x2d\x3a\x2b\x41\x1f\x9d\x8f" - "\xb0\xf5\x6c\x2e\xb6\xc5\xd4\x87\xed\xc0\x7e\x78\x55\xdf\xd3\xf8" - "\x5b\x71\x76\x25\x7f\x2e\x3f\x5b\xc6\x74\x67\x4d\xe3\x71\x20\x46" - "\x6d\xb0\x79\x3a\x61\x31\x0e\x25\x32\xd7\x3b\x18\xd1\x1f\xb3\x99" - "\xc6\x61\x69\xb4\xb7\x72\x6c\xe6\xfa\x52\x86\x79\x3a\x16\x71\xd6" - "\x64\xf3\x74\x03\xd6\x51\x86\xf8\x36\x72\x7c\xe5\x67\x1b\x10\xd6" - "\x41\x70\x6a\x3c\x84\x83\x60\x33\xbd\x10\x8b\xf0\x0d\x7d\x11\x67" - "\xab\xf0\x6a\xc6\xcb\x8e\x65\xbf\x62\x96\xb8\xdf\xd0\xfe\x98\xac" - "\xfc\x1c\xc6\x08\xe7\xf4\x6e\x3a\xcb\x81\x78\xe9\x85\xe1\x6c\xeb" - "\x39\xd2\xab\x74\xd4\x4f\xa4\xf7\x5c\x2a\xa7\xb7\xe2\xdc\x04\x37" - "\x6f\xc7\xb9\xf1\xa2\x1d\xe7\x52\x28\xbd\x07\x75\x07\xef\xb3\x7a" - "\x44\x5e\x26\x96\xcb\xe6\xe5\xca\xcf\x65\x31\xdd\xb9\x5c\x37\xda" - "\x21\xf2\xb5\x8c\xf8\x88\x7c\x2d\x23\x5e\x22\xfe\x2c\x9b\xb9\x12" - "\x58\xc4\xb9\xdc\xbe\x88\x73\x26\x2c\x6f\xe9\xe3\xb1\xca\xb9\x2a" - "\xb7\xc0\xbd\x03\xf1\x2c\x44\xfd\x0e\x43\x1c\x55\x88\xab\xa1\xcf" - "\x62\x80\xcc\xf5\xcc\x9d\xe9\xd9\xec\x59\xbc\x1e\xc2\x92\xa1\x0c" - "\xe9\x7d\x1f\x79\x94\x87\xed\x6c\xc5\xdf\x74\xcc\x87\xcb\xb1\xae" - "\x0f\x10\x6f\x15\xd5\x87\xf5\x34\x20\xce\x5a\xc4\x95\x47\x34\x9d" - "\xb7\x80\x1e\x9f\x9b\xcf\x0b\xfa\xda\x7d\xe5\xe7\x1c\x3e\xdd\x39" - "\xbb\xa2\x43\xa4\x3f\x82\x6f\x3b\x61\x8e\x93\x79\x6c\x9e\x5a\xec" - "\x75\x70\x8c\xe4\x3c\x46\xf9\x38\x56\xda\x83\x72\x26\x9d\x2a\xc6" - "\xdf\x46\x20\xfd\x39\x62\x7a\x96\x60\x3f\x20\x1d\x9a\x63\x72\x6e" - "\x4e\x01\x93\x06\x9f\x4b\x17\x7b\x74\xb0\xc8\xa4\x2d\xf3\x96\x9f" - "\xb3\x1e\x31\x91\x5c\x8e\x62\x19\x2a\x57\x08\xb1\x1a\x1c\x2f\x68" - "\x98\x27\xd6\xec\xd0\x46\x17\x94\xb2\x23\xce\x59\x08\x6b\x02\x6a" - "\x0f\xe9\x11\xc1\xcf\xee\x66\x76\xaf\xce\x65\xa2\xb6\xb1\x98\x32" - "\x38\xdc\x7d\x3b\xd0\x98\xed\x70\x77\x23\xe9\xa9\x8f\xe9\x5c\x46" - "\xd4\xd1\xbe\xd9\xdd\x65\xe1\x8b\xce\x82\x06\xd3\xbc\x87\x0b\xf6" - "\x60\x7e\x2b\xc2\x1d\xe2\x7a\x3b\xe7\xac\x27\xd6\xa3\x3b\xd7\xec" - "\x29\x77\x65\xcd\x39\xdb\xc7\x0e\x17\xec\x84\x47\xbb\xcb\x90\x57" - "\x7b\x60\xf6\x29\x4f\xd8\x11\x53\x1e\xc2\xb8\x30\xbd\x91\xeb\xff" - "\xec\x53\x3d\x6c\xce\x53\xec\xcc\x9c\xb3\x9f\xb1\xd9\x05\xec\x83" - "\xc5\x66\x88\xb9\x6c\x33\xf3\x91\x5d\x1c\xea\xdc\x03\x97\x1d\xa3" - "\xbd\xf3\xd3\x61\xd6\x12\x1f\x9b\x7d\xea\x0c\x5b\xf4\x14\xf1\x26" - "\x0d\x0e\x17\xa0\xfd\x98\x77\x12\xbf\xdb\x0f\x17\xec\xc7\xfa\xd3" - "\x11\x6f\x29\xb3\x99\x6b\x11\xd6\x1a\xfb\xe8\x29\x3d\x1c\xea\xdc" - "\x09\x9e\x88\x73\xcd\xde\xad\xe7\xac\xbe\x88\x73\x76\xdf\xd6\x73" - "\x0e\x16\xe1\x32\x7a\xb6\xba\xb2\xbc\x11\x2e\xd4\x01\x97\x15\xe5" - "\x14\x41\x32\xef\xb5\x80\x01\x9f\xff\xb3\x97\xe4\x5f\xee\x6a\xc7" - "\xb6\x3a\x30\x36\x66\x42\xf7\x5d\xed\x34\x0f\x81\x65\x1d\x7d\x11" - "\x2e\x3b\xc2\x39\x84\x7d\xb9\x81\xf4\x92\xe6\xfb\x31\x0d\x19\x54" - "\x10\xd6\x17\xe1\xd6\xe3\x65\xc0\x2b\x95\x55\xb8\xcb\x10\xff\x08" - "\xae\x53\xe5\xee\x32\x76\x77\x15\xc6\xda\x67\x11\x8f\xbb\x21\xd3" - "\x3b\x85\x21\x0f\xd1\x4e\xdc\x65\xbe\xad\xee\x2a\xc4\x65\x75\x73" - "\xdd\x77\x7f\x40\xb8\xfb\x9e\x4e\xa2\xf9\x09\x2d\xe6\xb7\xb3\x8a" - "\xf3\x53\xdd\xa4\xab\xba\xf3\x46\x9f\xee\x7c\x03\x2b\x3f\x9f\x75" - "\xff\xb3\xcc\xe1\x2d\x3f\x6f\xf2\x95\x9f\xcf\xf5\x0c\xc3\x18\xde" - "\xbc\x1f\xc8\x3f\x79\xfe\x93\x21\x0f\x3e\x44\x7e\x34\x72\xf9\xdb" - "\xcc\x68\x03\xeb\xaf\x2e\x3b\xdc\x8d\xba\x60\x7a\x8b\xfb\xa6\x23" - "\xce\xa3\x9c\xa7\x2c\xe2\xbc\x91\x74\x8a\xe4\xbb\xc8\x04\x65\x6c" - "\xeb\xf9\x2c\xdf\xd6\xf3\xb9\xde\xad\x88\x37\x02\xeb\x89\xec\x3b" - "\xee\xe6\xf6\xda\x87\xfa\xba\x1f\xe8\xec\x47\xa1\xe3\x7d\xf6\x50" - "\x3e\x92\x7c\x15\xf9\xa7\x4c\x8f\x9b\x74\xe6\xcf\xe4\xd7\x84\x9f" - "\x82\xc5\x8a\x9f\x22\x1f\x45\xe3\x22\xf2\x53\x3e\xd9\x4f\xf9\x64" - "\x3f\xc5\x9f\x75\xe8\x6b\xca\xcf\x9a\xc8\x1f\x65\x9a\x85\x9f\xc9" - "\xf4\xa6\x32\xd4\x8d\x28\xc4\x61\x12\xb2\x40\x98\x8a\xb3\x1b\x39" - "\x3c\xe7\xd3\xd9\x06\x1f\xfa\x1b\xbc\x9a\x7d\xc2\xdf\x38\x64\x7f" - "\x23\x29\xfe\xc6\x6b\xa1\x33\x2f\x49\xb7\x06\xfb\x1b\x9f\xec\x6f" - "\xbc\x4c\xf8\x1b\x9f\xec\x6f\x28\xdd\x2b\xfb\x1b\x6f\x10\x7f\x83" - "\xf6\x4c\xed\x0d\x93\xfd\x4c\x19\xf9\x19\x6a\x2f\xea\x5a\xae\x4f" - "\xf8\x99\x32\x1c\x13\x49\xe4\x67\xbc\x58\xc6\xa7\xf8\x19\x17\x2f" - "\xdf\x40\xbe\xa6\xef\x39\x40\xff\x69\x00\xf2\x31\xdc\x9f\x78\xc6" - "\x78\xc8\x9f\x20\xff\xa6\x04\xfa\x13\xc4\xd7\x8c\xf7\x7a\xd9\x4f" - "\xd9\x63\x37\x33\x0f\xfa\x13\x6b\xa6\xd9\x89\xb2\xfe\x14\x62\x3d" - "\xe8\xb7\xcd\xc5\x65\x36\xb3\x07\xd0\x0f\x38\xd8\x91\x32\x40\x1a" - "\x51\x7f\xbd\xe8\x2b\x00\xd0\x2e\x8d\x1e\xb4\x71\xd4\xf1\xac\x23" - "\xa6\x4f\xc0\x8b\xb6\x3a\xbb\xbb\xc7\xb6\xc8\x99\xa4\x9f\x7d\x8a" - "\x39\x90\x3f\xf6\x45\xa6\x32\xf4\x2f\x49\x8e\xc3\xdd\xef\xc3\xac" - "\x4e\xe6\x9b\x95\x6b\x37\xa0\x0d\x64\xcd\x5e\x66\x8d\xa5\x73\x37" - "\xe7\x9c\x65\x56\xf4\x8b\xff\x3d\xfb\x94\x3e\x76\x61\x27\x8c\x9e" - "\xb5\x84\xf9\xbc\x68\x67\xd8\x5e\x2b\xb6\xbb\x1d\x69\xb7\xa3\xcd" - "\x39\xd0\xce\x8c\x9e\x00\x3b\x63\x91\xae\xff\xc4\x7b\x83\xe0\x9f" - "\xcb\x81\x76\xd6\xee\xe3\xfd\x59\x27\x1f\x8b\x62\x3d\x0e\x9a\xb7" - "\x43\x5b\x6b\xf7\x6d\x15\xb6\xe6\x63\xc2\xd6\x7c\xc4\x3f\x49\xb6" - "\x35\x94\x05\xda\x8d\x1e\x2f\x03\x5e\xc1\x6d\xcd\xa4\xb2\xb5\xa7" - "\x64\x5b\x8b\x10\xb6\x86\x32\x0d\xf3\x3e\x2d\xec\x8d\xf0\xd3\x78" - "\xb5\xdf\xde\x22\xcf\x1b\xe9\x0c\x00\xa1\x3b\xdc\xe6\xb0\x5f\x39" - "\x6f\x42\x7b\xcb\x45\x7b\x43\x7c\xcc\x41\x7e\x13\x75\xf3\x4f\xd4" - "\xd7\xcd\x31\xb1\x3f\x2d\xf6\x5e\x5d\x86\xf6\x64\x42\x5f\xf6\x19" - "\xfa\xd1\x3f\x2d\x72\x42\x03\xda\x93\x11\xed\x28\x0b\xed\x29\x17" - "\xed\x8a\xec\xc9\xee\x7d\x9a\x70\xf6\xd9\xfb\x71\xf0\xbe\xd2\xdf" - "\x9e\x2e\x34\x6f\xea\xb2\xfc\x50\x6b\x87\xf3\x7c\x3c\x8d\xf7\x7a" - "\x3b\xf4\xa6\xcb\xf7\x09\x76\xf8\xff\xb4\x3c\x96\x41\x3b\x34\x6d" - "\x82\x2b\x4e\xc2\x0f\xdb\x51\xe7\x01\xef\xa3\xf0\xfe\x68\xe6\xb8" - "\x0f\x98\xaf\xd2\x58\x80\x75\xbb\xc8\x16\x99\x65\x22\xd9\x80\x11" - "\x75\x51\xc7\x5c\x49\x51\x2c\x46\xf7\x0a\x9d\xd3\x4a\xe7\xb2\xe2" - "\x73\x0c\xf2\x20\x11\x7f\x47\xd6\x9e\x83\x38\xbc\xe2\x6b\xe5\x33" - "\x61\xf1\x3e\x95\xad\x8b\x8f\xdc\xbe\x16\x92\x63\x9d\xe2\x3c\x56" - "\x3a\x3f\x16\xe3\xe8\x38\xba\x67\x96\xcf\x92\xea\xcf\xc9\x67\xb2" - "\x46\x63\x7d\x74\x26\xeb\xea\x24\xa8\x2f\xe2\xe7\x63\xc5\xd7\x5b" - "\x58\xb3\xd7\x45\x7c\x38\x9b\xa5\xd0\x42\xb4\x21\x9d\xd7\x22\x9d" - "\x9d\x0f\xae\x37\xc2\x87\xe6\xe0\xfb\x2b\xba\x2c\x93\xfa\xdb\x1f" - "\x22\x3f\x51\xe1\x49\x88\xfc\x74\x85\x4f\xa1\xd6\x76\x52\x3f\xed" - "\x5d\xcb\xba\x69\xaf\x6e\x9a\x37\x28\xf5\xb0\xff\x45\x3e\x96\x6d" - "\xf2\x82\x2e\xd3\xec\x66\xb6\x6e\x66\xb5\x99\x4f\x41\x3d\xed\x1f" - "\x5e\xc2\x7c\xbe\x68\x5d\x09\xdb\xa6\x33\xf7\xac\x65\x1e\x9a\xf7" - "\xc1\x3a\x9a\xec\xb0\xa0\x41\xc8\xe2\x5c\x3b\x1f\x6f\x46\xe9\xcc" - "\x88\x6b\x04\xe1\x3a\x8c\xe5\xbd\xdb\x74\xa8\xaf\x93\xda\xed\x1a" - "\x5d\x0b\x87\xd3\x9d\x6b\x37\x6d\x80\x6b\x4e\xc2\x9d\x3a\x3e\x4e" - "\xa8\xd4\x55\x91\x4f\xc0\x34\x3d\xa6\xc5\x21\xfe\x9d\x2e\xcb\x9d" - "\x18\x73\xf7\xec\x14\xb1\xec\x9d\x71\x0a\x9c\x1d\x26\x75\x05\xae" - "\x5b\x93\xbf\x92\x2c\xf3\xdb\xef\x4d\x03\xfe\xbb\xd7\xd1\x4e\x71" - "\xc6\xe0\xd9\x03\x3e\xdd\x95\x45\xe7\x6e\x95\x6e\x84\x04\x94\x0f" - "\xd1\xb7\x15\xc7\x1c\x27\x98\xe5\x4e\xc3\xee\x0d\x6e\x1c\x53\xdc" - "\xb9\xd3\x0e\x07\x43\xf2\xd3\x77\x8e\x75\x22\x0f\x1c\x3b\xd6\x02" - "\x10\x7f\x88\x9f\x68\x37\x3e\xe4\xc3\xe7\xe4\x93\xea\xd7\xd2\xb8" - "\xfb\xce\x0e\x85\x5f\x21\x65\x52\xa9\xab\x14\x63\xd3\xbb\x26\x31" - "\x0b\x03\xeb\x68\x7a\x8f\x71\xd7\x9d\x9c\x07\xe5\x2e\x7b\x0f\xfa" - "\x11\x9a\x53\xa6\x33\xb2\x56\xc7\x33\xb7\xcb\x72\x57\xb2\x1d\xa6" - "\xb6\xc9\xf3\x55\x4e\x9b\x67\x3a\xf9\x96\xa0\xfd\x16\xdf\x9b\xb4" - "\x1f\xff\x8f\x72\x8e\x24\xa0\x1f\x22\xdf\x14\x15\xd7\xba\x49\xc8" - "\xdf\x4d\x78\xe9\x5b\x8f\x4e\xcc\x5f\xed\x64\x5d\xac\x32\x8e\xce" - "\x22\x71\xd2\x3e\x9f\x98\x46\xe7\xfe\x30\x6b\x11\xd1\xf4\xa3\x87" - "\xad\xa3\x7b\xe1\x84\x19\xc2\xea\xfb\xe7\x89\x7e\x94\x4e\xf3\x42" - "\x62\x3e\xec\xae\x56\x3b\x4c\xcf\x53\xe8\xa2\x18\x03\x79\x4b\x7c" - "\x6e\xa7\x58\x83\xde\x53\xac\x2e\x61\x6e\x8a\x39\x10\xd6\xa1\xb4" - "\x81\xda\x27\xda\xf5\x23\xad\xba\x5d\xf4\xee\x3e\xb6\x44\xf0\x60" - "\xf5\x7a\xd0\xf1\x33\x7b\xbc\xf4\x9e\x63\x3a\x6f\x0b\xb5\x99\xb7" - "\x85\xfb\x58\xec\x23\x3c\xb7\xa3\x0e\xf1\x74\x07\xe2\xc2\xf1\xcf" - "\xb4\x76\xa1\x4f\x77\xb5\x86\xfa\x86\x05\x75\xb3\x01\xc7\xaa\xa3" - "\x4b\x7d\xec\x38\xe2\xfc\x54\xcc\xb1\xfd\x88\xce\xfe\x08\xcb\x74" - "\xa3\xee\x46\xc5\x54\x52\x9f\x6c\x2b\x21\x7f\xcb\x61\x2f\x47\xd8" - "\x4e\x84\x39\x2c\xc3\x1e\xe6\xe7\x12\x8a\xdf\xe1\xf4\x8b\xfd\x58" - "\x2d\xd2\xd1\x49\xf3\xbe\xc8\xe7\x32\xe5\x19\xc7\xf8\x38\x4e\xfc" - "\x51\x0d\xdb\x16\x53\x19\x9c\x96\xf3\x0d\xd4\x9f\x79\xcf\xb1\x6e" - "\xac\xe7\x2a\xd2\xa3\xd2\xf5\x30\x0a\x75\xf2\xf3\x4d\x1b\xe1\x0a" - "\xd2\x31\x16\xad\xab\x16\x7c\x4f\x4b\x65\x16\x8c\x3d\xd1\xa3\x9a" - "\xd6\xc2\x35\x68\x43\x55\x27\x21\x6d\xfa\xe2\x12\x03\xd2\x0a\xb0" - "\xe3\x34\x50\x8c\xf2\x19\xc2\xef\xb4\x79\xbe\x80\xfa\xd3\xa4\x8b" - "\x69\x79\x8a\x2e\xe2\xbd\xe9\x42\xbe\x02\xfb\x19\x83\x98\xa3\x48" - "\xfb\x94\xde\x49\x1c\x87\xb4\x36\x6a\xaf\x58\x03\x9d\xf6\x1e\x3b" - "\xc7\x12\x18\xef\xd3\xdc\xe8\xa7\xd3\x9c\xf8\x6b\xe0\x17\xfa\x12" - "\xf9\x59\x8f\x70\x4d\xec\x9c\x97\x60\x0c\x98\x66\x65\x16\x0d\xd9" - "\x49\x0d\xd6\xdd\x6d\x87\x45\x2d\x42\x36\x69\x2d\x84\x2b\x04\x0d" - "\x7a\xc6\xf7\xb9\xfd\x0a\xdb\x3b\xf9\x41\xc3\x26\x9a\xe3\x9c\x3c" - "\x8e\xdb\x05\xe2\xaa\x97\x84\xcf\xf6\x21\xad\x75\x16\x5f\x01\xfa" - "\xe7\x02\xdf\xf6\x11\x19\xfc\x5e\xce\x63\x72\x3f\x1a\x14\x7f\x65" - "\x5c\x2b\x3f\x2b\x11\x26\xf3\x73\x41\x7d\xa8\xf7\xd6\xab\x4f\xd2" - "\xf3\xdb\xf4\xec\x8c\x1a\x99\x61\xab\x36\x8a\x73\x1a\x11\x46\x8c" - "\xe3\x27\xbf\xdd\x83\x75\xb8\x2c\x93\x9b\xed\x30\xa3\x41\xbc\x9f" - "\x19\x99\x11\xf2\xfb\x28\xb4\x01\xb2\x39\x61\xd3\x53\x9e\x3d\xdc" - "\x40\xf6\xe7\x86\x1e\x9d\xdb\x20\xfb\x5f\x9a\xcf\x89\x3a\x0e\x53" - "\xb6\x1c\x8e\xe7\xfa\x2d\x31\xe9\x6e\xbd\xdf\x59\x6e\x98\x37\xf8" - "\xba\x3b\x1d\xaf\x6c\xbc\x72\xe5\xe7\x42\xbc\xb0\xcd\x77\xb7\xe3" - "\x73\x31\xe7\xdd\xae\x3c\x8d\x1d\xf3\x7a\x30\x66\xa7\x67\x3b\xdc" - "\x3d\x8b\xed\x4a\x94\x94\xfb\xfa\x97\x69\x9e\xe0\x6e\xb3\x1d\x26" - "\x83\x90\xc5\x14\xbe\x76\x07\x69\x23\xbe\xb3\xd2\x6a\xe6\x6e\xdd" - "\xe4\x44\xba\xef\x6e\x6a\xad\x76\x82\xe1\x46\x6a\xff\xdd\x7b\xa8" - "\x4d\xb4\x86\x85\x7e\x57\x57\x33\xc7\x81\x1a\x0f\xd0\xbb\x3c\xc4" - "\x85\xf6\x5f\x9f\x28\xe6\x32\xe2\x1c\x84\x4f\xd6\x09\xa6\xb4\x5f" - "\xf0\x79\x64\x86\x61\xad\x86\x9e\x47\xd4\xbd\xc4\xe7\x61\x3c\xac" - "\x34\x47\x5e\xbb\x30\x25\x02\xed\x7c\x0a\x9d\xf3\x78\x1a\xa6\xcc" - "\x66\xc8\xeb\x03\x05\xfc\xcc\x28\x07\xf6\x3f\xdd\x75\x7c\xbd\xd1" - "\x14\xf4\x7f\x93\x73\xf9\xbb\x19\x4c\xe7\xbe\x06\x71\x6e\xc7\x3c" - "\xec\x8f\xba\x0f\x17\xb8\xc1\x4b\x6d\xc6\xb2\xef\x9f\x73\x6b\x63" - "\x8b\x41\xb3\xc9\x84\x7e\x07\xe9\x60\x28\x2b\xe1\xcb\xee\xb6\x6f" - "\x3c\xc5\xdc\x4a\x9b\x0f\x34\x90\x7d\x4c\xd9\x62\x87\xd7\x8f\x86" - "\xb4\x89\xfe\x76\x18\x5f\x3d\x90\x28\xe4\xe8\x43\x5e\xf9\xcb\xd1" - "\xd8\x20\x64\x38\xe5\xa8\xbf\x0c\x8d\x58\x83\x11\x35\xc1\x38\x11" - "\xaf\x74\xf9\x59\x7d\xe9\x54\xf7\x28\x57\x63\xa5\xcb\x62\x8c\x43" - "\xfb\x28\x11\xb2\xa1\x74\xd4\x67\xd2\x9b\x2f\xb1\xef\xe9\xcb\x01" - "\x7a\xdf\x4b\xe9\xa4\xe3\x94\xee\xc3\xf8\x06\x9f\x93\x30\x5f\x4f" - "\xf6\x4b\xe7\x6f\xa9\xf3\xfb\xcf\x59\x00\xe3\x7a\xc2\x15\xbb\xb9" - "\xbc\x9c\x74\x17\x61\x92\x63\x3d\xe5\xe5\x58\xdf\x16\x85\xaf\x98" - "\x56\x48\xf9\xa4\xa7\x98\x5e\x63\x87\x37\xf8\xfa\x05\x27\x8e\x01" - "\x83\xc7\x1e\x46\x6b\x7f\x8c\xa6\x73\x97\x91\x2c\xbb\xe1\x9e\x43" - "\xe8\xc7\xb0\x1f\x1f\x61\x14\xfd\xcf\x3d\x74\xf6\x93\x06\xfd\xe7" - "\xe7\x78\xdf\x76\x18\xfd\x54\xef\xf6\x70\x73\x9f\x04\xc3\x7b\x25" - "\x30\x7a\xb6\x1b\x2b\x3d\x91\xde\x2d\xb6\xae\x7d\x70\xc4\xf3\x0e" - "\x18\x96\x73\x1c\xbf\xa1\x73\xe0\x4a\xd7\x33\xef\xde\xde\x26\xad" - "\xcd\x73\xc6\xca\xcf\x5c\x85\x7b\x38\x3f\x9e\x3f\x8e\x51\xc0\x22" - "\x8e\x5b\xf0\x27\xca\x58\xb0\x7d\x29\xf3\x6c\x3f\x41\x7b\xc3\xc7" - "\x47\x6e\xeb\x85\xe4\x57\x36\x40\x6a\x4d\x2f\x24\xd6\xf5\x42\x12" - "\xfb\x73\x92\x54\x83\x71\xdc\xa2\xb3\x7a\x3a\x8b\x3c\x27\xc6\x04" - "\xba\xba\x0d\x18\xcf\x79\x40\xe3\xdd\x86\xf1\x9c\x07\xe3\xb9\x33" - "\x49\xe4\x2f\xfb\xe3\xb9\x3e\x8a\x95\x2b\x23\xb4\xe2\xac\xd0\x08" - "\x3a\x2b\x4a\x13\x95\x0b\x7a\xa4\xaf\xf4\x34\xdc\xa3\x89\xea\xc4" - "\x58\x12\xdb\x6c\x97\xdb\x8b\xbf\x71\xb1\x05\x30\x9c\xb7\x15\x7d" - "\x38\xdb\x36\xc2\x18\xb2\x6f\x96\x48\xa7\x9c\x64\x4b\xd8\x86\xa9" - "\xa3\xe8\x9d\xf3\xbe\xab\xdd\xda\xd5\x35\xcc\x4d\xe9\xc5\x63\x98" - "\x1b\xd3\xf9\x9e\xfe\xcd\x98\xee\xb2\x4c\x4d\xb2\x4b\x5f\x86\x8c" - "\x01\x71\xcc\x24\xfb\x9a\xa9\xaf\x33\xa9\x8c\x74\xd4\xba\xd1\x83" - "\xf1\xf8\x69\xb2\xe3\xa9\x4d\x99\x85\xcc\x63\x58\x49\xef\xff\xa7" - "\x56\xd3\xda\x04\x7a\x27\xf9\x4b\x8c\x75\xbe\x6e\x3d\x02\xf5\x21" - "\x34\x7e\x88\x2d\x44\x9c\x15\x6e\x2b\xc3\x31\xfb\xc5\xc6\xf5\xb4" - "\xfe\x4c\x7c\x6b\x3a\xb5\xd3\x0e\x2b\xf9\xba\x0f\xfe\x7d\x0e\xf7" - "\xa7\xd3\x5a\x9d\xc8\x03\x7f\x1f\x30\xad\x9a\xf6\x29\xef\xa9\x1c" - "\xa6\xb5\x8e\x26\xdf\x3f\xed\x05\x11\x0f\x0e\x93\xfb\x82\x69\x4f" - "\x89\xf7\x07\xd3\x26\xda\x61\x2e\xef\xe3\x4d\x63\x49\x27\xa6\x15" - "\xb2\x98\x61\x61\x04\x37\xbe\x0c\xca\x56\x79\x20\x97\x6d\x1b\x06" - "\x8c\xdb\xca\x69\x60\x3f\x7d\xd2\x45\xdf\xdc\x38\xaf\x5a\xe0\xc2" - "\xd8\xa0\x15\xf3\xb4\x54\x87\x03\x61\x90\xef\x11\x62\xed\xc2\xb4" - "\x72\x3b\x3c\x20\xfb\xc3\x69\x0b\xc5\x1c\xf3\xb4\x85\x3d\x58\x16" - "\x63\xc5\xcb\x31\x1f\xe3\xdf\x27\xa3\xe4\x77\xdc\x8e\x67\xf8\xb7" - "\xa2\xd3\xf6\xdb\xa1\x30\x8b\xd2\x8a\xc7\x40\x7c\xb1\x81\x75\x85" - "\x8c\xf5\xfc\xda\x39\xfd\x1e\xbe\x0e\x4f\x82\xab\x5c\x96\x74\x50" - "\xf0\x62\x7f\xfb\x46\x8f\xf4\xe0\x83\x98\x16\xa7\xe0\x45\x98\x2b" - "\xf0\x39\xb1\x1f\x46\x94\x99\xa8\x2a\xf3\x60\x8f\x74\xf3\x1b\x98" - "\x96\x11\x50\x26\x27\xa0\x4c\x81\xaa\x4c\x99\x5c\x4f\x49\x40\x99" - "\xca\x80\x32\x35\x41\x68\x6b\x0e\x28\x63\x0d\x28\xd3\x1e\x84\xb6" - "\xce\x80\x32\x4e\xff\x32\xd3\xb5\x2a\xde\xd2\x7a\xa2\x54\x4c\x8b" - "\xf7\x2f\x33\x3d\x29\xa0\xcc\x24\xe5\x19\x63\xcf\x1c\x11\x1b\xa0" - "\x3e\xa1\x4c\x51\xae\x68\x2f\xd3\xb1\xfd\x0f\x16\x5e\x20\xfe\xc6" - "\xb1\x61\xb8\xa7\xb4\x56\x9c\x9b\x4b\x7e\x95\xd6\x1f\x90\x3f\xa7" - "\x77\x26\xa4\x13\x14\x77\x52\x5d\x27\x60\xc6\xb3\xa4\x43\x88\x73" - "\xcf\x60\x7e\x4c\xb7\x06\xd0\xd9\x1e\x40\xa7\x7d\x30\x3f\xa6\x3b" - "\xfd\xcb\xcc\xd0\xfa\x97\x99\x11\xa7\x2a\xd3\x20\xea\x99\x91\x14" - "\x50\x66\x52\x40\x99\x8c\xc1\xfa\x39\x63\x61\x40\x99\xc2\x80\x32" - "\x25\x03\x3c\x9c\xc1\xbf\x0d\x27\x7b\xc0\x74\x1c\xff\xcc\xdb\x7f" - "\x01\xde\xe9\x15\x7d\x56\xbe\x9d\x16\x7a\x7d\xef\xa8\x9d\xe2\xbb" - "\x39\x7e\x46\x41\x27\xdc\x9b\xa2\xbc\x5b\xde\xdd\xeb\x0e\xa7\x77" - "\x9e\xc8\xdb\xae\x03\x66\x37\xf6\xb9\x33\xb0\x0f\x9e\x9d\xaa\xac" - "\x2d\xa1\xf5\x38\xfc\x8c\x1b\x3e\x1e\x99\xd1\x21\xec\xef\x5e\xe5" - "\x9d\x0e\xb5\x07\xc7\x19\xf7\x26\x7f\x43\xba\x0e\x13\x5d\x74\xd6" - "\x03\xe2\x30\xf5\x8f\x35\xfa\x69\xa5\x3a\xef\xfd\xa3\x42\x6b\xbd" - "\x58\x13\x44\x6b\x85\x1d\x74\xfe\x06\x96\x69\x54\x8d\x4f\x88\x56" - "\xe7\xbe\x0d\x6e\xad\x3f\xcd\xf7\x6e\x91\x69\xee\x10\x3e\xea\xde" - "\x0e\xc5\x9f\x84\xd4\xbf\xca\xb8\xa6\x23\x35\x00\xb4\xe6\xe1\x70" - "\x0d\xc6\x9b\x38\xc6\x22\xba\x8f\x43\x86\x81\xc7\xbf\x2b\x7b\x81" - "\xee\x6d\x25\x77\xf1\x35\x11\xa2\x2d\x19\x39\x74\xce\x32\xc5\x3e" - "\xad\xa6\xaf\x68\x5d\x1e\xe3\x67\x2e\x41\xc6\xb3\x07\x4a\x1c\x48" - "\x6b\x46\x96\xb2\x7e\xc8\x0e\x19\x22\xae\xab\x8c\x6b\xa0\xf5\x1a" - "\xb4\xb6\xe9\x80\x73\x12\xc1\x14\x23\x9d\xca\xda\xe9\x6e\x3a\xb3" - "\x19\x61\x93\x43\x8d\x95\xd4\x7c\x15\x34\xdc\xf7\xa5\xd0\x9f\x8c" - "\xfd\xfe\xf6\x10\x8e\x7a\x9a\xd1\xee\xaf\x73\x19\x76\x7f\x9d\xcb" - "\x70\xf8\xdb\x83\x84\xf6\x30\x53\xeb\x5f\x66\x66\x9c\x7f\x99\x99" - "\x89\xaa\x32\x55\xa2\x9e\x99\x93\x02\xca\x64\x04\x94\x51\xfb\x3f" - "\x6c\xf3\xcc\x82\xfe\x71\x27\xf7\xf7\x33\xcd\xaa\x67\x69\x27\xef" - "\xa7\x66\x56\x2a\x69\xf2\x77\xc9\x7c\xad\x94\x8c\xaf\x29\xc0\x47" - "\x11\xfc\xfe\x00\x1a\x0e\x05\xd0\x70\x4c\x79\x96\xd7\x57\xfc\x16" - "\x79\x37\x46\xd6\x33\x67\xec\x66\x78\x20\xd6\x33\xf7\x61\x8a\xcd" - "\xa8\x7f\xe2\x6b\xd8\x36\x62\x4c\x79\x16\xf4\xb4\x76\xf0\x44\x31" - "\x84\xd1\x39\x30\x76\xb8\x3f\x9b\x45\x47\x10\x4c\x37\xc6\x53\x99" - "\x27\x60\x66\x37\xd6\x5f\x8d\x75\x20\xef\xee\x33\xfa\xd3\x70\x5f" - "\x96\x3f\x0d\xf7\xe5\xaa\x9e\xf5\xf8\x6c\x52\xb5\x5b\x4f\xfb\x44" - "\xbc\xc8\x63\xeb\xfb\xca\x95\x74\x9a\x03\xc0\x36\x76\x95\xf2\x38" - "\xc0\x48\xeb\x06\x47\x1e\x87\xfb\xd6\xd0\x7c\x81\x8c\x73\x9f\x9a" - "\xb7\x82\x17\xf7\xb5\x05\xd0\xd1\x11\x40\x47\xd7\x80\xaf\x99\xd9" - "\x2d\x6c\xe4\x3e\xbc\x9f\x9f\x44\x69\xc8\x0b\x43\xac\xc7\x70\xb9" - "\x75\x2c\xc5\xa9\xf7\xcf\x74\x62\x7b\xd9\x73\xd2\x48\xf9\x79\x36" - "\xc3\x98\x01\x63\x31\x3a\xbb\x97\xbe\x9d\xbd\x0e\xd3\xb2\x85\x5c" - "\xef\xc7\xf6\xcf\x33\x0a\xbc\xf7\xf3\x77\xfb\x04\x8b\xf7\x06\x16" - "\x1d\xd7\x12\x4a\x9f\x7b\x62\xe2\x9a\x95\x35\xb6\x88\x63\x8b\x62" - "\x0f\xbe\xed\x71\xcd\xbe\x6d\xb1\x6e\x4c\xab\x46\x9b\xa8\x12\x63" - "\x9a\xd8\x74\xd4\x7d\x1a\x7f\xe3\x18\x78\x96\x3c\x96\x89\x6b\xa5" - "\xb5\x83\xb4\x7f\x05\xfa\xcc\x28\xb1\x36\xe3\xfe\x43\x2a\xbb\x72" - "\x1a\x36\x4c\x61\xc7\x61\xd6\x0b\x14\xdb\x91\xdf\xa0\x35\x88\x07" - "\x3c\x0e\xa0\x79\x16\x9b\xe7\x24\x8f\xc9\x31\xbf\x4a\x94\x9d\xa5" - "\x53\x95\x75\xc8\xf3\x20\x5d\x94\x37\xc1\x03\xda\x03\x4e\x07\xc5" - "\x2a\x71\x22\x8e\x9f\xf5\xc2\x01\xf4\x17\x58\x26\x4d\x29\x43\x73" - "\x26\xfc\xbd\x7f\x31\x68\xc7\x97\x80\xd6\xba\xe1\x38\xc7\x2d\xbf" - "\x73\xe6\xe3\x23\x5b\x49\x17\xd8\x9c\x1d\x14\x53\x6a\xc5\xba\xad" - "\x59\x55\x61\x6e\xd0\xf5\x6c\x8b\x6b\xb0\xe3\xbd\x77\x5b\x5c\x13" - "\xd2\x86\xfd\xd9\xfd\xfb\xc8\x07\xaa\x79\x37\x7d\x7a\xd6\xdc\xcc" - "\xd9\x29\x0f\xcd\x9d\x99\x3d\xfd\x2e\x43\xf6\xb2\x15\xf9\x79\x29" - "\xab\xd6\x14\x1b\xd6\x15\x2d\x2b\x5e\xb6\xf2\x09\x7e\x0c\x98\x61" - "\x49\xb1\xf8\x4d\x2a\x5c\xb2\xba\x78\x32\xdd\x26\x1b\x4c\x45\xf9" - "\x6b\xf9\xed\xb8\x48\xf0\x47\xb2\xac\x38\xbf\xc8\x70\x43\x5e\xb2" - "\x61\xc6\x92\x65\x85\xf4\x15\x43\x30\x5c\x77\x19\x8a\xf2\x8b\xf2" - "\x97\xe4\x19\x26\x1b\x52\x09\xb3\x1a\x9d\x4a\x9e\xa9\x8a\x7f\x5a" - "\x8d\xfd\x39\xc6\xd0\x5d\xe4\xa7\xa8\x5f\x3f\x01\x99\x6b\x28\x86" - "\xe3\xe7\x76\xa1\x1e\x62\x9f\x60\x77\x59\x66\x17\x0f\xee\xc7\x67" - "\x97\xfb\xeb\xef\xec\x6a\x7f\xfd\x9d\xdd\x34\xb8\x1f\x9f\x1d\x60" - "\xff\xb3\x03\xec\x7f\xf6\xb1\xc1\xfd\xf8\x6c\x87\x7f\x99\x39\xe0" - "\x5f\x66\x8e\xbe\xdf\xcf\x20\xad\xcf\x70\xbf\x34\x27\x31\xa0\xcc" - "\xc4\x80\x32\xe9\x01\xcf\xd9\xaa\x67\x8c\x5d\xe7\xe4\xa9\x63\x03" - "\x7c\x2e\x56\x6c\x7d\xc0\xbf\xcd\x29\x57\x60\xa8\xef\xa1\x6f\x5d" - "\x64\xd8\x06\x15\x6c\x97\x0c\xdb\x6f\xff\xe4\x93\x68\xed\xa6\x88" - "\xcf\x33\x6f\x90\x7d\x5b\xe7\x8e\x81\x3e\xb4\x13\x65\x71\xdd\x69" - "\x98\xf3\x42\xbd\x80\x75\xd0\x7a\x5e\xf6\xd3\x05\xae\xfa\x91\xa0" - "\xa3\xb2\x74\x6e\x15\xb3\xcc\xaa\xa1\xf5\xe3\x98\x16\x85\x17\xfa" - "\xa9\xcc\x78\x65\xed\xfc\x16\x84\xb1\x43\x26\xd7\x65\x2a\xb7\x85" - "\xaf\x3b\xe4\xf5\xbd\x40\xdf\x58\xd1\x59\x70\x3b\xc4\x1e\x12\x9d" - "\x74\x9e\x1a\xd5\x8d\x38\xb4\x4c\x9a\xf5\xb9\x7c\x2e\x96\x1e\xaf" - "\x38\xc4\x59\xa8\xe0\x44\x7c\xfc\x5c\x46\x8a\xf9\x28\xd6\x13\x71" - "\x4f\x66\xa5\x12\x5f\xd0\x58\x21\x98\xef\x08\xbe\x36\x1b\x62\x77" - "\x58\x7c\x1d\xd6\x4d\x9d\x44\xd3\x7e\x8a\x43\x6d\xf1\x1e\x38\x52" - "\xe3\xc1\xf1\x2b\xe8\xf9\x78\xca\x7c\x0a\x6c\x0d\x1e\xa0\xf9\xe1" - "\xc5\x66\x28\xab\x97\x7c\x1d\xac\xbf\x1c\x8d\xd1\x32\x9d\x44\xcf" - "\x16\x4a\xc7\xf2\x38\x96\x70\xd0\x1a\xee\x10\xf3\x11\xb1\x04\x67" - "\x1d\x4b\xe3\xbd\xac\x64\x39\xf6\x2d\xaf\x47\x5c\x41\xd7\x17\x4b" - "\x60\x73\x59\xb2\xb0\xff\x5b\xd7\xae\xf8\xec\x03\xd5\xdc\xf7\x49" - "\x98\x8e\xe3\xd7\xcc\xe6\x50\x71\x8a\xec\xdf\x4d\xb4\xae\x0c\x61" - "\xf7\x5c\x08\x96\xe8\x3e\x80\xed\x66\xdb\x87\xe9\x76\x6f\x4a\x0d" - "\x97\xfd\xab\x0e\xcb\x75\x2a\xe5\x2e\xa6\x7d\x14\x1b\x51\x7f\x8c" - "\xb6\xea\x14\x63\xc5\xb9\x0f\xbf\xc8\xd7\x2c\x3f\x80\xf1\x5f\x96" - "\x62\x07\x97\xe1\x33\xfa\xbf\x2c\x3e\x9f\xc8\xd7\xf5\xe0\x78\x72" - "\xb5\x09\x63\xb6\x78\x27\xfa\xc6\x07\x72\x94\x3c\x3e\x4f\x44\x79" - "\x25\xcc\x7d\x20\xbe\x93\xf2\x8a\xfb\xf3\xc4\x37\x04\xec\x80\xd9" - "\x43\xe9\x95\x4a\xba\xe8\x5b\x1e\xa8\x09\x78\xde\xa3\x3c\xe3\x7d" - "\x0b\xde\x1b\x64\xfc\x0e\xf4\xb9\x1a\xb1\xe7\xc2\xdc\x51\x75\xdc" - "\x6e\x1e\xe8\x50\xf2\xf9\x9c\xda\xab\xf4\x6e\xcc\x09\xbe\x98\x61" - "\x3a\x1e\x73\x61\x99\xbd\x5f\xb9\xc3\x71\x8c\xa1\x61\x74\x86\x2a" - "\xa6\x11\x1e\xb2\x19\x7e\x96\x3d\x3e\x1f\x87\x07\x0e\xd1\x77\x0e" - "\xa4\x23\xeb\x3c\x90\x60\xba\x9b\xe6\x9f\xe7\x72\xbd\xa5\x34\xc2" - "\x4b\xf8\xa8\x4f\x24\xdc\x84\x6f\x3b\xc5\xb4\x7c\xbd\xe4\x5c\x6a" - "\x7f\x65\x28\x59\x61\xbe\x59\xc5\xcb\x70\x7c\x2e\xf7\x6f\xeb\xdc" - "\xea\x80\xe7\x26\xe5\x99\xe6\x7a\x85\xee\xcd\xad\x91\xf3\x5a\x2f" - "\x54\xd7\x58\xfe\x8d\xcc\xdc\xae\x80\xfa\xdc\xfe\xf8\xe7\xe9\x02" - "\x9e\xe3\x95\xe7\x9d\xfc\x1d\xc3\xbc\x24\xa5\x0e\x2e\x33\xd4\xb1" - "\xc6\x4d\x8e\xf0\x0b\xed\x65\x82\x65\x16\xaa\xea\x1c\x86\xcf\x85" - "\x03\xf2\x9b\x67\x56\xf0\xe1\xfd\x16\x15\x1c\xc6\x25\xf3\x76\x2a" - "\x70\xe2\xfd\xc6\xbc\x46\x55\xb9\xe6\xaf\x69\x6b\x80\xee\x66\x7b" - "\x85\xee\xce\xeb\x0a\xa0\xc5\x3d\x80\x33\x5b\x3b\x40\x4b\xb6\x5e" - "\x05\x87\xf6\x99\x6d\x08\xd4\xd5\xd5\x66\xd2\x71\xd2\xd7\xec\xb4" - "\x20\x79\x6e\x39\x2f\x27\xb8\x8e\x67\x9b\x54\xe9\xf2\xf8\x28\xfb" - "\x13\x39\x4e\x20\xff\xec\xec\x29\xcd\x56\xce\x53\xe5\x3a\x49\xfb" - "\x88\x4d\x10\x67\x77\xa3\x5e\x67\x37\x07\xe2\x15\xdf\xdf\xc8\x38" - "\x06\x70\x96\x89\x18\x2f\xdb\xae\x6a\x5b\xb7\x1d\xe6\x2a\xef\x89" - "\x1c\x62\x6e\x70\xde\xb1\x50\xe3\x0e\x97\xe5\xc1\x04\x7f\x9e\x3d" - "\x98\x3c\xc0\xb3\x07\x27\x0d\xe0\x7d\x30\x5d\x05\xf7\x5f\xf8\x9c" - "\xad\x82\xcb\xfd\x3a\xdd\x14\xba\xf2\x60\x79\x40\x5d\xd5\x2a\x1c" - "\x8d\xaa\xba\x9a\x55\x70\x1d\xf8\x6c\x0d\x2d\x9f\x07\x8f\x85\x96" - "\xcf\x83\xee\xe0\xf2\x99\xaf\x1f\xa8\x77\x7e\xc2\xd7\xdb\xd5\x7c" - "\xa3\x8a\x9e\x7a\x7c\xce\xf2\xb7\xa3\xf9\xb9\x01\xcf\xfd\xf2\x67" - "\xe8\x3b\x1a\x37\x18\xc3\x29\xbd\x78\x0c\xe8\x85\x9d\xcd\xaf\x52" - "\xe7\xef\xed\x15\xf9\x44\x23\x7f\x07\x47\xef\x37\x05\x5c\x4b\x20" - "\x1c\xc1\xa8\xf2\x3b\x14\xda\xb1\xbf\x0e\x7a\xf6\xa7\xd2\xff\xd9" - "\x7c\xd4\xff\xcd\xe7\xfd\x1f\xdb\x36\x3c\x8d\x59\x3e\xc8\x09\xd5" - "\x97\xb9\x2c\x0f\xa5\xe2\x98\xa1\x4b\xf0\xe7\x21\xd4\xff\x95\x3c" - "\x36\x61\x95\xc3\xd3\x50\x9f\x7a\x4f\xc0\x43\x9f\xe0\x6f\x1f\xfe" - "\xbe\xe7\xdf\xbf\x3e\x94\xcd\x2c\x9a\x79\xf5\x96\xc0\x7e\xf7\xa1" - "\x42\x1c\x7b\xf4\xc6\x7a\xca\x72\x82\xe4\x95\x33\x4b\xd8\xdc\x20" - "\xe9\x0d\x28\xaf\x5e\x3b\x3c\x74\x94\xe8\x55\xa5\xb7\x30\x4b\x4c" - "\x36\xc1\xdb\xa9\x3e\x2c\x13\x4a\x6e\xca\x77\x50\x42\xf7\x72\xb4" - "\x01\xed\x38\x7f\x02\x72\x36\x8b\x76\xe4\x7c\xea\x5f\x77\x4e\x42" - "\xf0\x76\xe4\x4c\xc4\x76\x9c\x0f\xde\x8e\x9c\x2c\xce\x5b\x09\xdb" - "\x32\x28\xee\xc8\x29\xc4\xb6\x9c\xe7\x7c\xf7\x4f\xdf\xa2\x8c\x53" - "\x4b\xcf\x03\xbd\x17\xe2\x65\xe7\x95\x0c\xc8\x4d\x86\xdb\x13\x5b" - "\x0d\x59\x41\xea\x6c\x65\x96\xe1\xf3\xec\x90\xe3\x51\xfa\x2b\x39" - "\xfd\x98\xa0\x05\xf9\x24\x11\x9f\xb0\x3d\x58\x2e\x94\xbc\x15\xfb" - "\x14\xef\x99\x1e\x46\xfb\x7f\xc8\xae\xf4\xe9\xd8\x9f\x3b\x14\x3e" - "\x62\x5e\x46\x40\x9e\x5b\x95\x97\xe7\x97\xb7\xb1\x3f\xbd\x44\x49" - "\xbf\x38\x39\x3d\xbc\x27\x40\x4e\x28\x9f\x47\x26\xfb\xb7\xfb\xe1" - "\xfd\xa2\x7d\x28\xa3\x41\xbc\x7e\xb8\x03\x65\xd4\x17\x5c\x46\x0f" - "\x3b\x83\xeb\xda\x23\x51\x1c\xdf\x48\x08\x82\xef\x91\x24\x94\x5d" - "\x1f\xd7\x41\x59\x4e\x83\xe5\xf3\xc8\x2c\x45\x3e\x17\xd7\xc6\x47" - "\xaa\x02\xda\xe8\x3d\x01\x0b\xa2\x45\x5b\x17\x3c\x1a\x80\xbb\x29" - "\xb8\x2e\x3e\x62\xc5\x76\x7a\x83\xb7\xf3\x91\x63\xa1\x75\xf1\x11" - "\x7a\x57\xe7\x1d\xac\x8b\x0b\xf4\xa2\x0c\x04\x29\xb3\x20\x99\x59" - "\x82\xd5\xb3\x20\x9d\xe2\x22\x3b\x2c\x28\xa1\xf7\x74\xaa\xf4\x85" - "\xfe\xfa\x87\x6d\xa0\x72\xc4\x3f\x8f\x18\xc7\x90\x1c\x4e\x18\x40" - "\xfa\x3a\x9d\x74\x59\x16\xec\x0f\xe0\xd5\x99\x13\xb0\x70\x72\x8f" - "\x24\xcd\x10\xfc\x7a\x54\x13\x40\x53\x47\x70\x7e\x2d\x70\x20\xbf" - "\xce\x04\xe7\xd7\xc2\xa8\xd0\xfc\x5a\x48\xf2\x3f\x33\x98\x5f\x0b" - "\x8d\x6a\x7e\xf9\x2c\xa2\x7d\xd7\xc7\xa3\x6e\xf4\x2d\x66\xf5\xc2" - "\x97\xeb\x63\x51\x57\x44\x99\x6e\x2a\x53\x1c\xeb\x16\x7a\x62\xb8" - "\x1a\x74\xa7\x61\xe1\x42\xc5\xfe\x63\xaa\x61\x38\xeb\x5b\x40\x6b" - "\xb4\xe9\x4c\x67\xbd\xcd\x7c\xc6\x6a\xf3\xa4\x02\xcd\x37\x06\xd4" - "\xdb\x12\xdc\x17\x2c\x6c\x47\x9e\xfe\x24\x48\x7a\x97\x98\x33\x7d" - "\xd4\xe0\xef\x23\x1e\x05\x7f\x19\x2d\xe0\xe5\xa0\x7f\xff\xd3\x0b" - "\x5f\x17\x96\xd9\xa3\xa6\xc1\x32\x5b\x34\x42\x96\xd7\x97\xfe\xf4" - "\x3d\x5a\x1e\x5c\x5e\x8f\x36\x84\x96\xd7\xa3\xfb\x43\xcb\xeb\x51" - "\x1a\xfb\x9c\xb1\xc3\x22\xbd\x7f\xbf\xf1\xa8\xc3\xbf\xbd\x58\x2f" - "\x96\x63\xd2\xb0\xcb\xe9\xf9\x62\xdb\xad\x5c\xe4\xe3\x48\x56\xf4" - "\xfd\x3f\xd2\x3f\x86\x68\x1c\x2a\x8e\x90\xb8\x91\x87\x55\x1b\x42" - "\x9e\x13\x1e\x75\x04\xc7\x95\xb4\x3e\xcf\x30\x9a\xe6\xca\x16\x7d" - "\xe1\x93\x34\x77\xe1\xbd\x74\x02\x72\xdf\xf6\x49\x61\x65\xb4\x96" - "\x8c\x7f\x3b\xc8\xdf\x4f\x2c\xf2\xa8\x65\x41\x6b\xca\xb6\x8b\xbd" - "\x1c\x69\x9e\xf3\xb3\x13\xb0\xf8\x59\x21\x97\xdc\x17\xfc\xf9\xb8" - "\xd8\x10\x5c\x2e\x8b\x27\xa1\x5c\x3e\x0b\x2e\x97\xc5\xd9\xa1\xe5" - "\xb2\xd8\x84\x72\xf9\x6c\xb0\x1d\x2d\x2e\x97\xed\xe8\x19\x2a\x63" - "\x58\x49\xf1\xea\xe2\xf3\x04\x83\xf7\x68\x23\x8b\x3f\xa7\xfc\x94" - "\x6e\xc5\x8e\x78\x19\x1a\xff\xf3\xfa\x65\x98\x16\x19\x87\x1a\xaf" - "\x3d\xb6\x3b\x98\x9d\x2c\xa6\xf7\xa9\x9a\xf1\x26\xd0\x21\x0f\x73" - "\x6a\x09\x47\x11\xc0\x69\xc8\x9d\x4d\x70\x94\x4e\x67\x2c\x0f\xc0" - "\xe7\x26\x29\x70\x7c\x5e\x54\xc0\x1a\x98\xab\x00\x08\xce\x1f\x77" - "\xae\xdc\xfe\xe1\xbc\x1f\x21\x78\x82\x0b\x80\x31\x0b\x7b\xcc\xdd" - "\xef\x6f\x8f\xb9\x55\xfe\xfa\xb9\x98\xde\x4f\xc4\xfa\xd0\xcf\xa1" - "\x2e\x77\x7a\x2d\x9a\xbb\x2e\x8d\x6d\x2e\x89\x0a\xb0\x4d\xd4\x81" - "\x25\x6f\x09\x1d\x58\xb2\xcd\x9f\xd6\x25\x89\xc1\x75\x60\x49\x5a" - "\x68\x1d\x58\x92\x13\x5a\x07\x96\x14\x93\x0e\xd8\x61\xc9\x1e\x7f" - "\xdb\x5c\x52\xe9\xdf\x76\xac\x97\xdb\x26\x8c\x18\x8a\x6d\x62\x2c" - "\x74\x79\x28\x3b\x94\xe3\x7f\x4d\x7d\x2f\xc0\x10\x78\xa6\x43\xbb" - "\x42\xfa\x1e\x33\xd2\x3b\x24\xf4\xf1\x05\xc4\xc3\x3a\x3e\x46\x7b" - "\x2c\x5b\xcd\xc7\xed\x62\xac\x55\x8a\xb0\x7f\xa4\x35\x7b\x82\x9f" - "\x8f\xbf\xea\xdf\xfe\xc7\x8a\x83\xf3\xf3\xb1\x4a\xe4\x67\x69\x70" - "\x7e\x3e\xd6\x14\x9a\x9f\x8f\xb5\xd2\xb7\xea\x83\x6d\xea\xb1\x63" - "\x86\xb5\x3c\x46\xe1\x65\x4e\xc3\xe3\xb7\x5f\x5c\xff\xf4\x78\x9c" - "\x7f\xff\xf4\x98\x67\xe8\xfd\xd3\xe3\x39\xc1\xfb\xa7\xc7\x4d\xc1" - "\xfb\xa7\xc7\xcb\x85\x3d\x3c\x6e\xf5\xb7\x87\xc7\x1b\xfc\x75\x02" - "\x79\x77\xc9\xfa\xa7\x3c\x7d\x80\x0d\xec\x38\x01\x79\x2f\x60\x4c" - "\x21\xfb\xc2\xfc\x07\xfd\x69\xcc\x4b\x0e\x2e\xb7\xbc\x74\x94\xdb" - "\x8e\xe0\x72\xcb\xcb\x0d\x2d\xb7\xbc\x12\x94\xdb\x8e\xc1\x72\xcb" - "\xdb\x39\xf4\x98\x22\xaf\xcd\x5f\x66\x79\xcd\x43\x97\x59\x7e\x54" - "\x70\x99\xe5\x27\x06\x97\x59\x7e\x9a\x90\x59\x7e\xb1\xbf\xcc\xf2" - "\xb3\xfd\x65\x86\x7c\xbb\x64\x32\xcb\x6f\x0d\x90\xd9\xaa\x13\xb0" - "\x74\x3a\xca\xac\x5d\xc8\xec\x89\x88\x00\x1a\xed\xc1\x65\x96\xef" - "\x46\x99\xad\x0a\x2e\xb3\xa5\x71\xa1\x65\xb6\x94\xf6\xd0\x58\x35" - "\x58\x66\x4b\x33\x86\x2e\xb3\xa5\x25\xfe\x32\x5b\x9a\x37\x74\x99" - "\x2d\xb5\x06\x97\xd9\xd2\x8e\xe0\x32\x5b\xea\x10\x32\x7b\x22\xc9" - "\x5f\x66\x4f\xe8\xfc\x65\x86\x7c\xfb\x96\x32\x43\xf9\x18\xc5\x7a" - "\xdd\x27\xb6\xf6\xf0\x39\xed\x27\xca\xec\x50\x20\x7f\xcf\x5e\xc0" - "\x75\x47\x96\xe1\x5e\x84\x29\x1e\xdc\x77\x3f\x51\x23\xa7\x3d\x34" - "\x58\x0e\x4f\xb4\x60\xbf\xda\xdd\x5a\xc2\xd7\x75\x09\x19\x12\xcf" - "\x11\x4e\xcc\x91\x3d\xc1\xfd\x3f\xca\x98\xd1\xbe\xc2\xd4\x17\x23" - "\xbc\x93\xf0\xd0\xbe\x2a\xfe\xb8\x0a\xb4\x43\x89\xcb\x42\xaf\x31" - "\x1f\x6e\xa4\xbd\xff\x4f\xc0\xb2\x51\x42\x57\x0b\x02\xe3\xdf\x7a" - "\xac\xeb\x94\xd0\xd3\xe5\x01\x73\x26\x05\x21\xe2\xdf\x02\x8a\x7f" - "\xeb\x83\xeb\x69\xc1\x05\xe2\xdf\x02\xe2\x47\xbd\x6a\xbc\x3a\x12" - "\x23\xc0\x80\xf1\x6a\x81\x27\xd6\x29\x74\x87\xc7\xb1\xdb\x86\x1b" - "\x5d\x96\x65\x89\x01\x34\xa3\x6c\x96\xbd\x2a\xd3\xfc\xb2\x7f\xf9" - "\x65\x69\xc1\x69\x5e\x96\x8d\x34\xef\x0d\x4e\xf3\x32\x53\x68\x9a" - "\x97\x55\x22\xcd\x7b\x07\xdb\xd6\xb2\x46\x59\x0f\x82\x8c\xcb\x97" - "\x59\x83\xcb\x7f\x59\x80\xfc\x21\xa7\xb8\x84\x39\x78\x79\x3f\xb8" - "\xe5\xa0\x86\xa3\xb5\xfa\x04\x4b\x3a\x12\x04\x36\x39\x10\x67\x08" - "\xb8\xec\x41\xba\x47\xdf\x16\x04\xd5\xbd\xe5\x65\xc2\x1e\x97\x77" - "\xf8\xdb\xe3\xf2\x6a\x7f\x7b\x5c\x16\xc0\x93\xe5\x2d\xfe\xf9\x05" - "\xe5\x97\xce\xc7\x3e\x99\x14\xa0\x03\x1f\x9c\x80\x27\x5f\x13\x3a" - "\xf0\xa4\xd7\x9f\x8e\x27\x8d\xc1\x75\xe0\xc9\x1c\x6c\xff\x07\xc1" - "\x75\xe0\xc9\xe2\xd0\x3a\xf0\x64\x15\xf2\xf2\x03\xb5\xde\xce\x2b" - "\x31\x0e\x0f\x80\xd9\x17\xdc\xe7\x3d\x79\x28\xf8\xbc\xce\x93\x9d" - "\x82\xc7\x85\x09\xfe\x3c\x7e\xd2\xe3\xcf\x43\x6c\xcb\xb7\xe7\x61" - "\xff\x59\x19\x2e\x4b\x61\xa0\xfd\xdb\x4e\x40\xa1\x6c\xff\x2b\xbe" - "\xf0\xa7\xb1\x50\x1e\xff\x04\x9b\xcb\x2a\x6c\x44\x5e\xda\x82\xf3" - "\xb2\xd0\x1a\xbc\xcd\x85\xd4\x07\xd9\x7c\x83\x6c\xa9\x90\xbe\x4b" - "\x9d\x47\xef\x0e\x68\x0e\xab\x0e\xd3\xe7\x79\x40\xc7\xfb\xab\xfe" - "\x7e\x69\x45\x1c\xcd\x91\xf3\x39\x66\xd4\xdf\xd8\x04\xc8\xa2\x3e" - "\x88\xe8\x5a\x5c\x12\xf8\x4e\x74\x85\x91\xe8\xa6\x75\x2c\xf4\x5d" - "\x4d\xac\x19\xb2\x6c\x4e\x0f\x28\xfa\x4e\xf0\x01\xb8\x4d\x64\x17" - "\x04\xaf\xc0\x8a\xb9\xce\xb2\x00\xdf\xb4\xa2\x3a\xb8\x8c\x57\x34" - "\x87\xd6\x9d\x15\x87\x84\x9c\x57\x82\xbf\x9c\x57\x74\xfa\x2c\x31" - "\xd9\xd4\x56\xd4\x81\x21\xd9\x09\xbd\x3b\x0d\xe9\xef\x9f\x59\xd0" - "\x61\xda\x04\xa3\x4f\xc2\xca\x02\x5e\x9f\xc4\x30\xa6\xd0\x40\x2b" - "\xf7\x01\x2b\xdf\xe7\x74\x22\xcc\x62\x0f\x48\xec\x99\x27\x3b\x28" - "\xaf\xde\xc2\xdc\x74\x6e\x8c\x72\x06\x0c\xea\xc2\xe5\xc7\x61\xe5" - "\x66\xbf\xf2\xd8\x1b\xd9\x04\x8e\xfd\x62\x7e\x7f\x65\x8b\x32\x0f" - "\x1f\x6a\x7e\x1f\x61\x8e\x29\xeb\x7e\xc5\xbb\xb0\x95\xed\x21\xfb" - "\x65\xa4\x89\xbe\x1d\x27\x9a\x2e\xec\x07\x56\xa5\x2a\xfa\x2b\xde" - "\xcd\xad\x32\x0e\x7c\xdb\xb2\x6a\x16\xe6\x39\x2f\x30\x9f\xab\xb2" - "\x83\x55\x66\x35\x1e\x71\x5e\xcc\xaa\x4a\xe5\xfb\x14\xbc\xaf\xfe" - "\x1a\x5c\x0a\x3d\xd6\x00\x7a\xda\x71\xbc\xe0\x94\x71\x1c\xfb\x1a" - "\x1c\x71\xb6\xc6\xbb\x60\xbc\x0f\xc2\x4e\x42\xd1\x38\x3a\x7f\xc6" - "\x56\xd3\x05\x51\x1e\xd0\x8a\xb1\x9d\xe9\x56\xfa\x36\x84\xc6\x86" - "\x36\xcf\x14\x2b\xbd\x83\xe3\x6b\x08\xe2\xa7\x58\x0f\x9b\xbd\xf2" - "\x1e\x6c\xa6\x7b\x88\xa7\x87\x0b\xce\x58\x6b\x5e\x62\x5d\xb5\x7c" - "\xef\x2d\x93\xdf\xf8\xaf\x92\xd6\xff\xd0\x3a\x8c\x4d\x30\x05\xe1" - "\xff\x28\x6c\xbd\x28\x20\x26\x35\x85\x18\xff\x99\x68\xfc\x37\x25" - "\xb8\x9d\x9b\x2e\x30\xfe\x33\xd1\xf8\x6f\x8a\xba\xdf\x14\xef\x79" - "\x4c\xc7\xd4\x31\x29\xed\x8f\x65\x58\x4a\x71\xe6\x53\x0f\xdc\xb2" - "\x13\xf4\x1e\x7a\xa7\x8d\xb6\x69\xeb\x6a\x25\x7b\xd5\x1f\x76\xb4" - "\xd0\x3e\x0c\xba\x18\x13\xe9\x22\xf5\x65\x64\xaf\x4f\x19\x78\x5f" - "\xe6\x11\xb6\x58\x6a\x66\x8e\xe4\x4e\xd4\xa1\x55\x05\x0a\xae\xa8" - "\x8d\x05\xe2\xbb\x8f\x98\x4e\x18\x6e\xeb\xe2\xfd\xa2\x86\xe2\x55" - "\x1e\xb7\x7a\xce\x02\xe1\x3d\x50\x72\x18\x08\xaf\xaf\xbf\x9f\xe4" - "\xb8\x4b\xc8\xc6\x09\x27\xe1\x3e\x82\x70\x84\x97\xe0\x94\x76\x88" - "\x6f\x63\x9e\x6a\x54\xb7\x9d\xcf\xbf\x60\xdd\x98\xfe\x39\xcd\xab" - "\xd8\xa8\x5c\xe9\x02\x36\xbe\x93\xde\x99\x9d\xb1\xb2\xd2\x27\xd9" - "\xf8\x22\x9a\x13\x2b\xa2\x73\x9f\x35\x7b\xff\x64\x0f\x2f\x1e\x03" - "\x3a\x91\xf6\x54\x77\xab\xc1\x0d\x76\x28\x4a\xf5\xf7\x11\x45\x01" - "\xf1\xaf\x89\x8f\x33\xf1\x57\x4b\xeb\x13\xe5\xf5\xab\xe4\x0f\x98" - "\xcd\xe3\xe2\xfa\x71\xa1\x35\x15\xf4\x4e\x9a\xd6\x44\x89\xfd\xdf" - "\x8a\xcc\x01\x73\x6f\x8e\xed\x7c\x5d\xcd\xff\x60\xbd\xab\xc3\x85" - "\x8e\x14\x87\xfb\xcb\xb4\xa8\xba\xf4\x14\xbd\x0b\x12\xfd\xc1\x22" - "\x4f\xa0\x7f\x2c\x6a\x51\x62\xb7\x80\xf4\x76\xa5\x3f\x30\xac\x24" - "\xbc\xab\x03\xfa\x99\x22\x1e\xff\x7b\x07\xf5\x0b\xab\xc9\xaf\xfb" - "\xe9\xe4\x11\xae\x43\xab\x0d\x87\x9d\xa8\x37\x45\xa4\xff\xab\x5f" - "\x46\x98\xcd\xf4\xcd\x21\x3e\x0f\x3f\x0d\xab\xb3\xbc\x16\xd0\x1d" - "\x76\xf0\x6f\xaa\xf4\xa8\x23\x5c\x6f\xa9\xdf\x98\x20\xd6\x23\x39" - "\x03\xea\x28\x54\x78\x4e\x30\x47\x8a\xfe\x07\xc4\x7a\x0a\xd2\x85" - "\xd5\x46\x5a\x9b\x11\xd3\xcd\xf7\xda\xd2\x2b\x3a\x64\xf3\x74\xc0" - "\x11\x4f\xe0\x98\x67\xf5\xbe\xe0\x6d\x5f\x4d\xfd\xff\x4f\xec\x50" - "\x9c\xe8\x2f\xdb\xd5\xbc\xff\x57\xde\xeb\xa0\xec\x1d\xfe\xe5\x8a" - "\xb5\xfe\xb2\x2f\xaa\xa6\xfc\x90\x6b\x7c\x2a\x87\xa7\xe3\x78\x66" - "\xb1\x93\xaf\xf7\x2a\x46\xfb\x2f\xca\xbe\x90\x1f\x64\x51\xc3\xd3" - "\x7d\x08\x2b\xaf\x0b\x46\xbf\x55\x5c\xee\x37\x67\x74\x25\x9f\x33" - "\x5a\x7c\x02\xd6\xc8\xef\x7e\xd6\x1c\x0e\xa0\xaf\x31\x74\x6c\x50" - "\x4c\xef\x7f\x16\x07\xf7\x19\xc5\xc7\x82\xc7\x06\xc5\x4e\xd9\x2f" - "\x2c\x66\xd1\x81\x7a\xb0\x86\xbe\xa7\xe3\x65\x94\x31\x2c\xcd\x85" - "\x86\x1e\xc3\xae\x31\xf6\x8f\x61\x8b\xc8\x1f\xac\x49\xea\x1f\xc3" - "\x3a\x82\x8d\x61\xed\x41\xe4\xb9\x66\x4b\x70\x79\xae\xa9\x09\x3e" - "\x86\x5d\xb3\x4f\xf4\xf3\x6b\xba\xfc\xe5\xbc\xe6\xd0\xc0\x3b\xe1" - "\xe2\xc6\x4b\x17\x0f\xaf\x9d\x34\x38\x1e\x5e\xfb\x6b\x21\xab\xb5" - "\x67\xfd\x69\x5b\x9b\x15\xdc\xb7\xaf\x2d\x08\x1d\x0f\xaf\xdd\x12" - "\xda\xb7\xaf\x6d\x18\x1c\x0f\x1b\x86\x05\xc0\xb4\xf6\xc7\x4a\x7e" - "\xb1\xd9\xda\x63\x82\x4f\xeb\x28\x9e\x0b\x53\xc1\x3b\xfd\xf5\x1d" - "\x69\x46\x7c\xe8\xdb\x4e\x92\x4f\x53\x74\x26\x14\x4f\x68\xef\xa5" - "\xeb\x77\x42\x04\xda\xc0\x07\x2e\xcb\xba\x7e\xfd\xa7\x75\x7c\x54" - "\x0f\xf9\xc8\x90\xeb\xe9\x24\x85\x3e\xa2\x63\x5d\xc9\x85\xde\x97" - "\x86\xc5\x43\xd6\x8b\x83\xf8\xb1\x8e\xc7\x7f\x84\xe3\xc2\x32\x5b" - "\xd7\x1d\x60\x63\x4e\xb1\x0e\xd7\xfc\x9e\x90\x9b\x39\x60\x2c\x6b" - "\xd6\xf1\x6f\xfa\x42\xfa\x5b\x73\x52\x70\x1d\x35\x1b\xfb\xfd\x6d" - "\x11\xc7\xbb\x3e\x20\x3f\x57\xc8\xc0\xdc\xe2\x8b\x56\xcf\x75\x9b" - "\xcd\xfe\x3e\xc9\x9c\x1b\x50\x2e\x60\xfc\x67\xe6\xf4\x5c\x5c\x7f" - "\x63\xee\x0a\xdd\xdf\xac\x5f\x23\xda\xbf\x21\xe0\xfd\xf2\x7a\xdd" - "\x85\xfb\x9b\xf5\x21\xda\xbf\xde\xe8\xdf\xdf\x6c\x08\x78\x47\xbf" - "\x3e\x37\x78\x7f\xb3\xde\xac\xf8\x19\xe1\x37\xd6\xff\xfe\xe2\xfc" - "\xcd\xfa\x66\x7f\x7f\xb3\xbe\xfa\xeb\xfc\xcd\x81\x41\xfe\x66\xbd" - "\x33\xb6\x26\x58\x5b\x36\x44\x05\xf7\x37\x1b\x12\x85\x0c\x37\x94" - "\xf8\xfb\x9b\x0d\x69\xfe\x32\x5c\x1f\x20\xc3\x0d\x01\xef\xbf\xd7" - "\xeb\xbe\xa9\x4f\x0a\x0b\x0b\x93\xc2\x34\x92\x26\x0c\xb3\xb0\x79" - "\x30\x3c\x4c\x1b\x16\x8e\xd7\x30\xf9\x77\xb8\x14\x26\x69\xf1\xfa" - "\xff\x89\xfb\x1e\xe8\xa8\xaa\x6b\xef\x33\x93\x09\x4c\x70\x32\x13" - "\x42\x8c\x23\x7f\x64\x50\xb0\x51\x41\xa2\xe2\xf7\x51\xc4\x1a\x2b" - "\xbe\x87\x6f\xa1\xa4\x14\x6b\xda\x87\x26\x68\x62\x43\x45\x98\x26" - "\x01\x02\x86\x4c\x18\x22\x8d\x9a\x7f\x6a\xc4\x00\x21\x44\xa5\x2d" - "\xb4\xa8\xb1\xc6\x36\xf6\xa1\x8e\x12\x7d\x51\x43\x26\x5a\x6c\xa3" - "\x0f\xdb\x21\x0d\x31\xa4\x01\x46\x32\x49\x86\x64\xe6\x9e\x6f\xff" - "\xce\xb9\x77\x66\x12\x13\x2c\xef\xbd\xb5\x3e\xd6\x0a\x73\xef\xb9" - "\xe7\xef\x3e\xfb\xec\xb3\xf7\x3e\xfb\xec\x1d\xad\xfe\x4e\x18\xf5" - "\x3e\x11\x65\xe9\xcf\xa0\xfe\x46\x8f\x7a\x9f\xf0\x2d\xdf\x27\xaa" - "\xed\x6a\xed\x1b\x46\xbd\x47\x7f\xcb\xf7\x09\xff\xc3\xf2\xec\x1b" - "\xef\x23\xef\x41\xde\xb5\x6e\xe3\xea\xb5\x6b\x32\x85\x5d\x7b\x96" - "\x6d\xf5\x43\x0f\x65\xe5\xe6\xda\xf2\xd6\xdb\xbe\x7f\xfb\x8a\x1b" - "\x17\xd9\xa4\x79\xfc\xda\x5b\xe7\x64\x4e\x62\x77\x6f\xca\xc1\x87" - "\xbb\x7f\x78\x57\x9a\x2d\xf5\xfb\xb7\x8f\xfc\xa8\x55\x23\xcc\xe0" - "\x2f\x54\x4b\xc4\xda\x4b\x79\x22\x91\xb1\xd2\x9d\x82\xee\x74\xe2" - "\xee\xb9\x94\x27\x8a\x3e\x6f\xc1\xfd\xe5\x21\x07\xc7\xbd\x8a\x0e" - "\x56\xb0\x15\x83\x98\x57\x57\xc4\xec\x0f\xc2\x9f\x4a\xc1\x2e\xfe" - "\xb6\x97\xd9\xfe\x8d\xe9\x3b\xd8\xe3\xa7\x9a\x96\x52\x5e\x7a\x77" - "\x7b\x02\xcc\xe6\x00\x6f\x5b\xf4\x04\x7d\xd3\xf1\xef\x29\x94\xe6" - "\x53\xef\x64\x3a\x76\x89\xb4\xb7\x8b\xb4\x7c\x96\x2e\xb6\xf5\x56" - "\xfe\x36\x17\xef\xf0\x59\x23\xf3\x6d\x9d\xcc\xf5\x8f\xb5\x81\x2e" - "\xd4\xc4\x33\x03\xec\xb2\x77\xc5\x33\xe3\xae\x44\xf8\xdc\xdd\x6a" - "\xd0\xec\xb2\x9f\xa0\x77\x0f\x7b\xbc\x1b\x6d\x23\xaf\xa2\x7f\x6c" - "\x08\xf9\x6b\x47\xe6\x5f\x10\xb6\xe3\xde\x6a\xd0\x53\xbe\xe5\x27" - "\x98\xc5\x12\xe4\x5f\xfb\x27\x05\xf3\xaf\x5f\x4a\x7c\x1a\x4d\x45" - "\x4b\xa0\x88\xc9\xbb\x51\x5b\xb7\x6e\x0e\xf2\x00\x7c\x26\xdc\xdd" - "\xeb\xe0\x15\x8f\x32\x03\xad\x67\x9d\x2b\x07\x77\x29\xb6\x66\xee" - "\xcb\x62\x06\x1a\xff\xf4\x1e\x56\x58\x65\xbb\x87\xf8\xc6\xbb\x99" - "\xe1\xa3\xfc\x22\xc6\xcb\x8d\xbb\xcb\x3f\x65\x86\xdf\x0e\x15\xe9" - "\x87\xb8\x95\x15\xe4\xf1\x6e\x0e\x3f\xdc\x3e\xee\x87\xbd\x6d\x4b" - "\x46\x10\x79\x9e\x1c\x74\x58\x59\x2b\xb1\x2f\x5b\x8f\x73\x7f\xc9" - "\xa7\xd2\x5f\xc5\xd1\x5e\x1f\xee\xcf\x1a\xb7\xde\xcd\xa2\xba\xd2" - "\x98\xfe\x68\x76\x35\x73\xaf\xf2\xb1\x82\xe3\xbc\xbb\x25\xe3\x24" - "\x6b\xcd\xae\x67\xe9\xed\x4c\xdf\xd2\xf9\x25\x13\xbe\xa4\xcb\x53" - "\x8a\x0a\xfb\x99\x75\xeb\x1a\xa4\xf5\xb3\x2d\x5b\x59\xec\x96\xcf" - "\x20\x07\xb5\x53\x3b\xa7\xd9\x4f\x8e\x31\x1d\xd5\xa7\x7f\xec\x4b" - "\x66\x7d\xec\xc7\xb8\x67\x9e\xc2\x6a\x0a\x99\x95\x3b\x92\x4c\x43" - "\x8e\xa4\xb8\x21\x9e\x14\x3f\xe8\x48\x4a\x68\xb5\x53\xfe\xce\xb7" - "\x98\xb9\x9d\x25\xbc\xdd\xd3\xae\xaf\x3e\xc7\xa6\x63\x4c\x5d\x34" - "\xb6\x9a\x73\x94\xbf\x3c\x91\x29\x54\x36\xb2\x4c\x20\x36\xd1\xea" - "\x4e\xf3\x33\x85\xea\xaa\x1e\x62\xd3\x6b\x86\x98\x55\x29\x4b\x64" - "\x28\xd7\xcb\x1c\x4f\xbb\x5b\x18\x61\x0a\x0f\x0e\x97\x47\xe7\x13" - "\x3d\x9c\xf8\xea\x83\x8d\x06\x77\x4b\x2f\x3b\xea\x1b\x62\xad\xec" - "\x0b\xe6\xce\xff\xca\xf5\xdb\x07\x1b\xa3\x89\x9f\xd4\xb9\xb6\xc0" - "\x06\x5e\xe2\x8e\xe3\x28\xfc\xe7\x15\xb1\x8a\x42\x66\xb2\x6f\x61" - "\x13\x7b\x28\x5d\xd0\x9e\x12\x7f\x91\x3b\xf0\x95\x6b\x8b\xb8\x0f" - "\xfe\x78\x77\xe1\x51\x16\xd5\xea\xab\xc6\xbd\x63\x7d\xd0\x9c\x52" - "\xe4\xf6\xb5\x31\xb7\xfd\x6f\x2e\xc5\x94\x92\x5d\xaa\x30\xe3\xcb" - "\x03\x6d\x7a\xb7\x61\x80\xb9\xd3\x7c\xec\x1d\x6a\x9b\x97\xa7\x94" - "\x12\xcd\x4a\x69\xf5\xf9\xe1\x7f\x27\x99\xf7\x59\x27\x55\xe4\xb0" - "\xb9\xb5\xe7\xd8\xec\xbd\xe7\x58\x12\x1f\x4c\xd2\xe3\x8e\x37\xfc" - "\xa5\xed\xa5\x5f\x13\xc9\x60\x34\x76\x79\x8f\x3b\x56\xbd\xeb\x3d" - "\x9c\xc4\xf6\x0d\x85\xef\x7a\x0f\xf5\x85\xef\x7a\x13\x4e\x19\x71" - "\xdf\xdb\xc3\x0a\x6b\x2c\x2d\x6c\x22\xad\x13\x17\xf0\xbb\xe2\x0c" - "\x33\x6c\x3f\xc3\xd8\xf5\x45\x7a\xc8\x99\x06\x5a\x0f\x5b\xdd\x34" - "\x37\x78\xee\x60\x45\x0b\xe8\xd7\x44\x7f\x24\xcf\x15\x09\x5f\x15" - "\x9d\x2a\x1e\x53\x9a\x9e\xd2\x66\xd0\x6f\x14\xfd\x5e\xea\xa8\xe1" - "\x5e\x6a\x2b\x8d\x78\x95\x49\xc0\x67\xf5\x7e\x79\xda\xa0\xb3\xc8" - "\xe4\x61\x87\xd6\x6a\x78\x2d\xe9\xfb\x56\xe3\x3b\x1d\xa7\xe1\xef" - "\xdd\x2b\xfa\x35\x9c\xad\x83\xef\x77\x35\x1d\x7d\xd8\x80\x76\xa9" - "\xfd\x34\xfa\xb5\x48\x19\xd4\xd1\xab\x95\xed\x1b\xce\x46\x9b\x8f" - "\x52\x3a\xd7\xd2\x69\xdc\x06\x7c\x7b\xbd\xe3\xb4\x5e\xe6\x49\xd2" - "\x53\x9d\x7e\xb5\x7e\x5a\xfb\x05\x87\xb0\xc6\xfb\xf4\x16\x7e\x24" - "\x63\x01\xab\xd9\xc9\x5b\xf6\xee\xe4\x4d\x72\xed\x15\xd5\x7b\xd8" - "\x2b\xc2\xf7\x24\xed\xe1\x4d\xa5\xf4\xed\x08\x49\xe3\x80\x4b\x53" - "\x26\xec\x4b\x8b\xda\x3c\xec\xca\x84\xc8\x31\x70\xe7\x96\x7a\xec" - "\xa3\xaf\x14\x36\x93\x3c\xf9\x58\x7d\x6b\x67\x2f\xfb\xed\x50\x77" - "\xb4\xe3\x43\xa6\x77\x07\x3a\xd8\xfc\x04\x19\x27\x67\xdf\x4e\xee" - "\x79\x16\xf1\x83\x77\xf2\x5e\xc2\x97\x19\x3d\x6c\xdb\x8c\xeb\x12" - "\x58\xc2\xc7\xc4\x95\x48\xfa\xb4\xed\xe6\x08\xfa\xf4\xd6\x51\x4f" - "\x63\x04\x6d\x7a\xfc\xd1\x6f\xd2\xa6\xe2\x35\x92\x36\xd1\xda\x17" - "\xb4\x28\xe8\x51\xd3\xef\x1d\x95\xae\xde\x5f\x29\xfe\xee\xa8\x74" - "\xbf\x9a\x3e\x67\x54\xba\x57\xa6\x6f\xcf\xd2\x68\x5f\x2b\xfa\xb1" - "\x09\xb4\x6f\xfb\x5d\xa0\x7d\xad\x19\x2a\xed\x13\xf4\x67\xfb\x3c" - "\xfe\x22\xd1\xa2\x8d\xa0\x37\xdb\xa3\xd1\x7f\xfe\x36\xd3\xfa\x1e" - "\xd3\xc5\x9c\xef\x23\xad\xf2\x0b\x66\xa0\x3f\x95\xee\x15\x5c\x06" - "\xba\x07\x9a\x07\xda\xb7\x27\x91\xb7\xef\xd9\xc9\x8f\xd5\x08\xbf" - "\xd5\xce\x10\xfd\x7b\x8a\xd2\x4a\x29\xed\x29\xfa\x0e\x3a\x08\x98" - "\x1c\x4d\x6b\x64\x22\xae\x4d\xa9\xb1\x5a\xd1\x27\xb3\x72\x9a\x6f" - "\xf8\xbf\x2a\x26\xf8\x5a\x74\xcc\xee\xce\xf3\x89\x7b\x28\xf0\x95" - "\xde\x9a\xd7\x89\x75\x97\xb8\x5d\x81\x9e\xe2\x24\x2b\xf4\xf1\x1e" - "\xdc\x55\x41\x1f\xd2\x37\xff\x1b\x7c\x7d\xeb\x9a\xb2\x19\x83\x5f" - "\x02\xd0\x6c\xea\x8b\xa1\x92\xfa\x24\x7d\x0b\x3b\x0f\x7b\xd8\xdf" - "\x54\x7c\x7d\x1c\x77\xd5\x68\x4f\x21\x41\xdc\x49\xf4\x91\xc6\x66" - "\x09\x16\x31\xf8\x66\x41\x7c\x4d\xfc\xee\xd1\x2b\xd9\x95\x9a\x7f" - "\x16\x27\xd1\x06\xca\xe3\x6e\xf7\x33\xf4\xd9\xc3\x9c\xcb\x8e\x16" - "\x34\x52\xf9\x6d\x5e\xc0\x86\x3b\x1d\x5a\x1d\x3a\x51\x87\x5e\xe8" - "\x6e\xb3\x29\x9f\x47\x94\x37\x47\xe7\x1f\x5d\xe5\x65\xa0\xfb\xee" - "\x6e\xaa\xa3\xa0\x43\xd6\x41\x75\x71\xda\x03\x46\x7c\x53\xeb\x8f" - "\xdd\xca\xbf\xa6\xfa\x0f\x63\xbe\xe0\xa7\x0b\x76\x4a\x04\x17\x13" - "\x7c\x35\x48\x3e\xd4\x79\xe7\xbe\x2f\x18\x53\x7d\x8d\x11\xbe\x39" - "\x97\xc0\x97\x17\xfc\x8b\x5d\xc8\xb7\x18\xc1\x68\xb6\xe6\x5f\x4c" - "\xd9\xf4\xbf\xeb\x5b\x8c\xea\xb6\xd6\xea\x39\xad\x39\xe7\x12\xf8" - "\x17\xa3\xfe\xef\x07\x1e\xaa\x63\x5a\xfa\xdc\x4f\x00\xf3\x6d\xa5" - "\x48\xab\x70\xf2\x66\x6d\xfe\x31\x5e\x8c\x85\xbe\xd9\x25\x7f\xc8" - "\x69\x5d\x16\x2f\xc5\x77\x4a\x5b\x85\xfc\xf3\x89\x8e\xb9\x69\x0f" - "\x7b\xb5\x23\xa8\xaf\xd8\xc2\x0c\x92\xa6\x3d\xbe\x1a\xe5\x25\x4d" - "\x7b\xdc\x1a\xa6\x69\x8f\xc7\x4a\x9a\x26\x61\x2c\x69\xda\xe3\x3a" - "\x49\xd3\x8a\xcf\x0b\x7b\x22\xa2\x69\xf8\x06\xba\xa6\xd1\xb4\xbd" - "\x89\xbc\x19\xb4\x63\xd0\x59\xdc\xad\xd1\xb6\x32\x4a\x03\xed\x40" - "\x1f\x25\x9d\xda\x9e\xc2\xff\x2b\x89\x49\x7b\x4d\x3c\x67\xc3\x7f" - "\x46\xb7\xfa\x8c\xfd\xe4\xc7\x92\xc6\x3d\xbe\x38\x4c\xe3\x8a\x5d" - "\xe1\xb2\xa0\x71\x8f\xff\x40\xd2\x38\x99\xbe\xef\x27\xa0\x71\xdb" - "\x53\x00\x03\xb5\x7e\x3d\xce\xd1\xd4\xfc\x80\xe3\xd2\x48\x1a\x37" - "\x72\x7d\x3d\x5e\xa5\xd1\x38\xd0\x36\x7a\xdf\xef\x61\xb3\x84\x5e" - "\x18\xeb\xac\x8a\x60\xae\xad\x3b\xcc\x01\xc6\x8c\xf8\x01\x80\xdb" - "\x1d\xa7\xd9\x44\xd5\x6f\x8d\x3a\xee\xc7\x3d\xda\x1d\x4d\x82\xff" - "\x37\x7d\x9a\xb1\xb0\x5f\x32\x9a\xeb\x99\xf0\xe7\xe8\x2e\xea\x60" - "\xee\x6a\x5e\xd4\x1a\x38\xce\x94\xed\x8f\x9c\xc0\xbc\x92\xbc\x71" - "\x0b\x7e\x41\x77\x7a\xd8\x8e\x59\xe9\x3e\xa1\xbf\x3f\x51\xa1\xa7" - "\x6f\xf9\x23\xbe\xdd\x8a\x36\xa0\x57\xa4\x67\xe3\x78\x7a\x84\x8b" - "\x68\xab\xec\x02\x6d\x1d\x14\x6d\x11\x2f\x45\x72\xcf\xe4\x33\x6c" - "\x87\x38\x43\x13\x3e\x99\xc7\xae\xeb\x73\xf5\x7b\xd4\x38\xdf\xcf" - "\x5f\xb8\xfc\x2f\x2e\xbf\x70\xf9\x5f\x7c\x17\x34\x08\xf7\xf1\x82" - "\xce\x91\xf5\x98\x03\x5a\xbe\x1e\xe4\x5b\xad\x9e\x83\x9c\x70\xcc" - "\x12\x72\x99\x55\xab\x13\x78\x57\x4e\xf9\x84\xff\x5a\xa2\x91\x4b" - "\x36\x33\xf8\x0e\x8e\x2c\xbb\x37\x0c\xdf\x5f\xa4\x5e\x40\x4f\x63" - "\x72\x93\x14\x88\xf8\xf2\x47\x68\x17\xc4\x5d\x9a\xaa\xd0\xd9\xc3" - "\x2f\x7c\x44\x2f\x45\xfc\x56\xf5\xde\x6e\x2f\xd1\xb7\x99\xf0\xb1" - "\x09\xbe\x52\xbd\x6b\x71\x19\xd1\xe5\x78\xf8\x61\x81\xbe\x3a\x3d" - "\x98\xaa\x3f\x22\xfc\xef\x97\x24\x6b\x65\xc7\xd3\xed\xa1\x5d\xb5" - "\x4d\x71\x0f\x89\xca\x64\x6a\x65\x50\x37\xee\xde\xd0\x7e\x3c\x53" - "\xf8\x37\x0b\xf4\x82\x06\x5e\x46\x3c\x68\xbc\x6c\x27\x83\xa9\xed" - "\x54\x7b\xd8\x8e\xcc\x0b\xdd\x73\x1a\x7f\x7c\x25\xc7\x2e\x7e\x7c" - "\x4c\x1d\xdf\x13\x71\xdf\x32\xbe\x0b\xb4\xfb\xc4\xb2\x8b\x6f\x37" - "\x4e\x6b\xb7\xe4\xe2\xe1\xfa\xc4\xe1\x7f\x1e\xae\xc9\x2a\x5c\x9f" - "\xf0\x7e\x0b\x5c\xc7\x68\xe7\xc9\xd9\xff\x7c\x3b\x36\xb5\x9d\x27" - "\xd3\xc6\x6a\x87\x89\x7f\xe3\xfa\xeb\x31\x6a\x31\x62\xd4\xb8\xc4" - "\x31\x54\x4f\x9d\x87\x95\x84\x62\x0f\xcb\x78\x49\x4f\x36\x78\xd8" - "\x13\x55\x23\xef\x71\x3d\xf9\x49\x7a\x1d\xf6\x75\xae\x78\xd8\x93" - "\xc7\xa0\x6b\x5b\xb2\x55\xfa\x07\x54\xcb\x10\x3d\x7f\x62\xfa\x85" - "\xce\xd3\x44\x2c\x0c\xd5\x77\x07\xee\xa7\xf2\xf2\x04\x4f\x9f\x23" - "\x9b\xc9\x58\xd1\x4f\xdd\x80\x7b\x48\xf4\x3c\x91\x9e\xa5\x1e\x0a" - "\xf1\x05\xa4\x4f\x8a\x09\x94\xb6\x0d\xf1\x27\xe4\xfd\xbd\xa7\x56" - "\x52\x1f\xf2\x85\xae\x49\xf8\xd8\x17\xbe\x5d\x7c\x94\x4f\x8f\xb2" - "\xd2\xa7\xc7\x53\xf9\x5a\x1e\x8f\x56\x5f\xc8\xbf\xc5\x53\x77\xc9" - "\xbd\xe5\xa9\xa5\x7d\xe3\xc4\x31\x82\x9f\xb3\xfd\x85\xc9\x23\xee" - "\x1f\xde\x99\x93\xb3\x3e\x67\x91\x2d\xf7\xd1\x07\xe7\xe5\xe6\xad" - "\xce\xdb\x90\x2b\x2e\xaa\x4f\x62\x94\x60\xcb\x5b\xf3\x68\xd6\xfa" - "\x0d\x79\x49\x9b\x56\xaf\x91\x17\xdb\xaf\xa1\x8c\x91\x99\xd8\xc8" - "\xb8\x91\x44\x83\xda\xb8\x5e\xf8\xa0\x10\xb1\x23\xe1\x8b\x44\xbb" - "\xb7\xdb\x64\x15\x31\xb6\x88\x66\x95\x2e\xf6\xb0\xf5\xdd\xda\x3c" - "\xc0\x3f\x22\xf1\x2d\xd6\x1e\x56\xfa\x63\xe0\xce\x72\x62\x41\xf7" - "\x49\xbf\x12\xc2\x37\x80\x3b\x8f\x12\x5a\x99\xd1\xb5\x11\x7a\xd8" - "\xd2\x36\xc5\xf9\x94\x4b\xf8\x7b\xdc\xd2\x83\xf7\x7e\x8d\x4f\xc0" - "\xb9\x92\x3c\x07\x9e\x79\x5b\x07\x2b\x9d\x83\x76\xb1\xee\x6a\x9f" - "\x91\xb1\xba\xb9\xf3\xa9\x76\xdc\xd5\xa6\x77\x23\xf5\xc1\xa5\xf1" - "\xa2\xd4\x5f\x13\x8f\x4d\xa0\x79\x2e\xf5\xbd\x17\xe7\x65\xea\x5d" - "\x6f\x63\xad\xbc\xd7\x6d\xa0\xbc\xbd\xa1\xbc\x4e\xca\x5b\x96\xd0" - "\x4d\xfb\xe6\x98\x67\xd9\xdc\x1c\x9f\xad\x0c\xa7\x45\x47\x8e\x99" - "\xe4\x6a\x9a\xbf\xb2\x5f\xd2\xd8\x13\x34\x5c\x91\x73\x5f\x56\x26" - "\x7c\x2f\x97\xc7\x67\x53\xda\x04\xfa\x2d\xea\xa3\x6f\xf0\x81\x40" - "\xdf\x32\x70\x46\xd6\x5a\x70\xd6\x75\xc4\xda\x41\xf3\x5e\x66\xf7" - "\xb0\x8d\xd3\xe5\xbd\x35\xca\x4f\x6d\xb8\x8b\x86\x58\x93\x8d\xbb" - "\xa0\xa3\xf3\xb0\xb2\xc3\x4d\x36\x1f\xe3\x51\xff\x7e\x02\xe5\x68" - "\x5d\x59\x1d\xf9\xe0\x45\x28\x5d\xdc\xcf\x2b\xab\xd7\x60\x9e\x67" - "\xe3\xa7\x91\x67\x3c\xbd\x32\xf6\xcb\x0a\xb1\x97\x9c\x63\xb0\xc1" - "\xea\x64\x65\xc7\x46\xef\x17\x73\x32\x17\xd9\x32\x57\xe7\xd9\xd6" - "\xae\x59\x97\x65\xcb\x5c\x93\x69\x5b\xb7\x3e\xcf\xf6\xd3\xf5\x50" - "\xf0\x40\xa5\x33\x02\x27\x14\x8c\x6f\x53\x5a\xb4\x76\x86\xdd\xb7" - "\x29\x7b\x82\xc4\xe9\x8a\x79\x7d\x83\xd9\x13\x47\xc2\xa4\x62\xb2" - "\xdc\x2b\xcb\x33\xa8\xef\x06\x79\xff\x2f\xaa\x9b\xde\x69\xfc\x65" - "\xcd\x23\xd7\x6e\xc5\xfd\x6a\xde\x52\x2d\xaf\xc0\x8b\x2b\x7b\x42" - "\xdf\x2a\x54\x7c\xdc\x27\xef\x29\x0b\xbf\x37\xfb\x84\x0d\x7f\xb9" - "\x6b\xdc\x32\xf0\xf5\xb5\x85\x3d\x74\x86\x95\x1f\xe4\xce\x32\x9f" - "\x8a\x43\x46\xa5\x34\x3e\x5f\xc5\x1f\xc2\x89\x0a\xf6\x4d\xfc\xa9" - "\x58\x05\xfc\xe1\x83\x69\x46\x61\xef\x11\xf0\x13\x9d\xa3\x77\xda" - "\x9f\x3d\xac\x3c\x13\xe3\xf0\x6d\x4a\x33\x3a\x76\x09\xff\x7b\xa7" - "\x70\x76\x8a\xf8\x34\x84\x2b\x31\x32\x8e\x66\xc5\x4a\x6d\x8e\xb4" - "\xfc\x63\xaf\x61\x81\x2f\x23\x71\x4c\xc2\xf3\x65\x81\x63\xc4\x1f" - "\x50\x9f\xf4\x9a\x9f\x3f\xec\x21\xd4\xb7\xa6\xbc\xad\x9c\x53\x1b" - "\x8d\x11\x78\x70\x66\x2c\x3c\xa0\xb9\x7d\x68\xed\xfa\x87\x1e\xa1" - "\x85\x9e\x93\x95\xf7\x50\x36\x7c\x5b\x80\x0e\x08\xc7\x19\x73\x32" - "\x6d\x1b\x72\xb3\x1e\x9a\xc4\xc6\xca\x15\xfa\x18\x39\xff\x71\x0a" - "\xe1\x6b\x5f\x5f\x5a\x34\xee\x58\xc8\x3b\x15\x4f\x6f\xed\xcb\x25" - "\x59\x64\xc4\xbc\x3f\xfd\x73\xb7\x35\x99\x78\xba\x64\xe1\x3b\x0e" - "\x30\x93\x76\x02\x4f\xbf\x01\x38\xf4\xe9\x75\xb4\x9f\x54\xe6\x69" - "\x38\x40\xcf\x45\x34\xa6\xec\xb0\x8d\xc6\xd3\x0d\x7d\xfa\xe8\xe3" - "\xa0\x3f\xd2\x1e\xa4\x87\xe8\x80\x65\x5f\x07\xab\x14\xb6\x60\xb5" - "\x62\x3f\xaa\x6c\xd0\xca\x94\x87\xee\x39\x3f\x3d\x5d\xc3\x93\x88" - "\x32\xbf\x44\x9a\xf0\x75\xe4\xac\x68\xc3\x9c\x73\x39\xf7\x06\x2d" - "\x1f\xc1\x95\xef\x13\x74\xe4\x69\xe3\x68\xda\xf0\x5e\x1c\xce\xc4" - "\x65\x7f\x04\xfe\x99\xe2\x53\x85\xdf\x14\xe2\xf5\x3a\xd8\xd3\x97" - "\xaa\xf6\x29\x42\xa7\xe8\xce\xa7\xba\xfc\xb2\x2e\x6a\x6b\x40\x6b" - "\x8b\xc7\xc6\xa7\xee\x13\x78\xf6\x74\x76\x58\x67\xf8\x74\x02\x64" - "\x65\xde\x97\x36\xc1\xc3\x2a\x57\x0a\xdc\xa2\xe7\xbc\xcb\xa5\x0f" - "\x37\xe0\x1b\xc6\x09\xbc\x0a\xe3\xd4\xd3\x07\xb4\xf9\xc6\x98\xa9" - "\xdc\x2a\x9b\xf0\xf3\xfb\xb4\x4b\x83\xe5\x78\xbe\x66\xc4\xba\x35" - "\x51\x5f\x06\xe5\xda\x15\x72\x9e\xf4\x2f\x84\x7b\x2e\x51\xd4\xc7" - "\xfc\x2e\xf6\xcc\x27\xb0\xdd\xb7\xf8\x21\x37\xc5\x8b\x78\x70\x72" - "\x2f\x7b\xc6\x46\x38\x9c\x10\xbe\x9b\xfe\x0c\xf1\x7f\x95\x09\x72" - "\xee\x9e\x59\x1c\xb1\xf6\xbc\xaa\x3d\xc0\x44\xc0\x08\xf4\xcc\x9d" - "\x7f\xa7\x58\xaf\xf2\xde\xef\x33\xd9\x5a\x39\xe1\x67\x80\x70\x03" - "\x76\xb0\x67\xd8\x33\x25\xd8\x23\xd0\x3f\x0f\x7b\xc6\x88\xf6\x31" - "\x3e\xec\xd9\x02\x6f\xac\x88\x81\xf2\xcc\xfe\x51\x7d\x68\xd0\xea" - "\x52\xeb\x6e\xd2\xde\xe1\x77\xcc\xc3\xaa\x52\x11\x07\xf2\x88\x4f" - "\x8c\xe1\x92\x26\x92\x0a\x9a\x7c\x22\x5f\xaf\x06\x43\x4a\x2f\xa2" - "\x77\x9a\x8b\x52\x26\xcf\x84\x12\xd4\x78\x53\x55\x88\x61\xca\x1d" - "\x36\xf8\x25\x5c\x2c\xe9\x8d\xf0\xa5\x23\xbe\xc5\xa8\x6b\x36\x06" - "\x77\x84\x84\x5d\x8c\x2f\x20\x68\x83\xf4\xbd\x40\xdf\x69\x8d\x0c" - "\x22\xa6\xcb\x70\x76\x8c\xec\xdb\xb3\x19\xa1\x36\x10\x9f\x52\x9c" - "\x41\x3e\x9b\x2a\x7d\x99\x4c\x24\x59\xef\xd9\x22\x6d\xfe\x8a\x77" - "\x52\x1a\xe2\xa7\xea\x99\xb1\x49\xf8\x0a\x7b\xb6\x46\xeb\xaf\xfa" - "\x4d\x2f\xf0\x41\xc0\xe0\xd9\xd0\xfa\xef\x13\xb1\x3e\x9f\x6d\xd6" - "\xda\x11\x79\x29\x1f\xf2\x37\xcd\x16\xdf\x3a\x43\xf5\x48\x1f\x2a" - "\x46\x11\xef\xb9\x0e\xdf\xaa\x58\x98\x56\x3d\x23\xfc\x15\x0b\xbb" - "\x35\x1a\x87\xf7\xb1\xec\x18\x31\x07\x36\x86\xf8\x20\x88\x23\xac" - "\x97\xb8\x58\xb5\x40\x2b\x13\xa5\x03\x1c\xab\x96\x68\x6d\x6b\x75" - "\xa0\xff\x17\xa4\x79\x72\x2c\x06\xac\x11\x35\x66\xa7\xa0\x17\x92" - "\xd7\xaa\x3a\x2a\x70\x50\x8c\xb3\xaa\x2e\x72\xae\x25\x2f\x57\xd5" - "\x10\x81\x0f\xe8\x4f\x68\xfe\x69\xee\x7d\x72\x2f\xa9\x6a\x8f\xe8" - "\x63\x0a\xbd\x77\x87\xe6\xa1\x5c\xcc\x11\x62\x40\x8d\x19\xef\x51" - "\xac\x15\xca\xa3\x70\xd1\x4f\xcc\x07\xc9\x62\x0b\x59\x13\x78\x42" - "\x5a\x2b\x04\x13\xea\xe3\x73\x8f\x02\xaf\x06\x9d\xcf\xa5\x8c\xc4" - "\xcd\xe7\x52\x23\xfa\xab\x03\x5d\xa7\xb4\x4c\x2d\x8f\x87\x3d\x27" - "\xee\x32\x69\xf0\xa4\x6f\x45\xa1\x79\xbc\x51\xe4\xad\xd4\xfa\xf9" - "\x2d\x7b\x86\x0a\xab\xe7\x3e\x54\xdb\x68\xd6\xda\xa0\x67\x92\x7f" - "\xaa\x56\x8d\xae\xe3\xc1\xcd\x79\x59\xd2\xb9\x11\x36\xf9\xd5\x0f" - "\x3d\x92\x95\x39\xd7\xb6\xfa\x61\xb8\x41\xca\x5d\x9b\x95\x65\x17" - "\x87\x38\x23\xf9\xc0\x04\xd1\x1e\xc1\x41\xfa\x9c\x7e\xfe\x07\xcf" - "\x4a\xfb\x15\xac\x0b\xac\x77\x2f\xd6\xfb\x91\x82\x73\x42\xb6\x71" - "\x17\xdd\xc8\xdc\x7e\x5e\x04\xfe\x5f\xd0\x3e\x8c\xdf\xea\x93\xfb" - "\x00\xcd\x27\xf6\xc8\x41\xe7\x4e\xfb\x48\x78\xed\x2c\x1a\xb9\x96" - "\x77\x56\x8e\x4d\x27\x76\xde\x20\xe8\x44\xa9\xc4\x0b\xd0\x27\xd8" - "\xfe\xa3\x5e\x2a\xd3\x34\xaa\xce\x63\x61\x1a\xb5\xd3\xa3\xd1\x28" - "\xb9\x4f\x3c\x6f\xa0\x3d\xa8\x52\x6d\x2b\x10\xc6\x9b\xe7\x0b\x24" - "\xde\x3c\x4f\xf2\xdf\xcb\xc5\x9a\xac\x23\xf7\x8e\xe7\x3c\xe0\x1f" - "\x65\x7c\xed\xe7\x93\xb5\xfa\xaa\xe2\xb1\x6f\x3c\x9f\xf2\x4d\xfe" - "\x61\x67\x2f\xf8\x07\xd8\x25\x02\x16\x22\x9e\xb0\x58\x37\xcf\xaf" - "\x8d\xa0\x3f\x71\xf4\x5e\x30\xd6\x5c\x3f\x88\xed\x78\x1e\x8e\xdb" - "\xe6\x3d\xb4\x2e\xef\x56\xb8\xa8\xca\xca\xb7\x67\x3d\x94\x97\x95" - "\x39\xfa\x9c\x2d\x49\xe3\xc5\x70\xc6\x5d\x45\xeb\xde\x1b\x0b\x78" - "\x3c\x4f\xe3\xdf\x15\xd0\xc6\x20\xe8\x14\xf1\x8e\x2a\x8d\x33\x75" - "\xb1\x5d\x1f\xca\x58\xe2\xcf\x07\x34\x3c\x41\xbe\x3b\xf2\xb9\x32" - "\xe8\xac\xa6\xf1\xef\x34\xaa\xf2\x16\xc9\xb4\xd5\x36\xed\x3d\x5c" - "\xbe\x3a\x4b\xec\x7d\x3b\x85\x4d\x1f\xc1\xb4\xba\x33\x82\xdf\xc2" - "\xfb\x61\xf5\x5d\xf8\x61\x92\x71\xd1\xab\x37\x4b\xf8\x56\xd3\xfc" - "\x3f\xa7\xd2\x8a\x5d\xcd\xb2\x1e\xc6\x5e\x2a\xf4\x46\xef\x13\xfa" - "\xfd\xea\x4a\xad\x3d\x2a\x7f\x3c\xb2\x4d\xec\x5b\xa3\xeb\xf3\xb0" - "\x6a\x71\x3f\x64\xbb\xf0\x21\x57\xdd\x32\x46\x5f\x53\x23\xf3\x51" - "\x1e\x92\x7f\x9f\xab\xd1\xc6\xfc\xc3\x7c\xa4\xed\x32\x5c\x60\x8c" - "\xbd\x72\x8c\xbb\x8a\x80\x5b\x68\x1f\xf8\xaf\xf6\x21\x53\xf5\x4b" - "\xe2\x41\xfc\x46\xf4\x5f\xf8\x47\xb3\x62\x5d\xef\x22\xf9\xf7\xe9" - "\x16\x6d\x1c\x18\x63\x43\xa1\xd7\xa0\xf9\xa5\x92\xe5\x77\xdd\x3a" - "\xb2\x6f\xbb\x4a\x23\xca\x74\xbb\xae\x84\xee\x7e\xd7\x1c\xee\x7c" - "\xbe\x04\x78\x08\x7f\x55\x55\x21\x3c\xdc\xd5\xf8\x4d\xbc\xdb\x35" - "\x1b\x78\x17\x89\x4b\x6b\x6e\x7c\x88\x30\x29\x37\x2b\x6f\x91\xe0" - "\xee\x89\xb1\x83\xdb\xb3\xd5\x79\x6b\xd6\xaf\xcb\x9d\x6b\xcb\xcd" - "\x5c\xad\x2e\xfa\x11\x6b\xde\x29\x64\x7f\x9f\xb6\xce\x06\x9d\xbb" - "\x67\x87\x69\xcb\xee\x30\xfe\xc3\x46\xeb\x4a\xe8\x66\x77\x6f\x96" - "\xeb\x69\xf7\xb2\x88\xb5\x2b\xca\x63\x8d\xee\x13\x3c\xdb\xee\xc8" - "\xfd\xdf\x47\x30\x8d\x39\xc3\x76\x5f\xaa\xc2\xd4\x27\x61\xbc\xfb" - "\x5d\x31\x4e\xe1\x8f\x6b\xd7\x31\x8c\x53\xf8\x7f\x11\xfc\xd9\xee" - "\x03\xda\x78\xc3\x72\xc3\x6e\x97\xe0\xa3\x54\x7e\xed\xdb\xe4\x7a" - "\xc9\x9f\xee\x59\xa5\xea\xde\xda\x35\x19\x4f\xe3\xaf\xa9\x2f\x99" - "\x92\x57\xdd\x73\xe9\xf2\x02\x3e\x9c\x9e\x0f\x3f\x75\x98\x83\x3d" - "\xb7\x6b\xbc\xa5\xb0\xdf\x2b\x8b\x4f\x1b\x74\xee\x59\x18\x49\x27" - "\x78\xd4\x23\xed\x2a\x8f\x98\x26\x65\xd7\x4b\xfe\xd0\x41\x6d\xe1" - "\xec\xe1\x02\x7d\xa3\x71\xed\x21\xfa\xf7\x6a\x03\xea\x01\x7f\xcd" - "\xfb\xac\x6a\xac\xca\x1a\x71\x86\x57\x4b\x75\x7b\x69\x6e\x29\x1f" - "\xf1\x7f\xbb\x05\x6e\x28\x84\xa3\xb0\xdd\xf1\x69\x3c\x12\xdb\xf3" - "\x19\xf6\x22\x7a\x26\xbc\xad\x49\x92\x38\x55\x93\xe4\xcd\x4d\x62" - "\x7d\x7d\x56\x7d\x5f\x6e\x9a\x01\xfa\x02\xc0\xc2\x5d\xe3\x67\x12" - "\x7f\xf6\xf8\x89\xe6\x1d\x88\xac\x4f\xad\x0b\x30\x35\xa0\x1f\x3c" - "\xd7\xaa\x07\x7e\x03\x5f\x79\x5f\x12\xf1\x09\x7b\x5c\x3c\x37\x49" - "\x3f\x8e\xef\xad\x0b\x8d\xd3\x84\x78\x8f\x88\x01\x0a\x7a\x25\xfd" - "\xfb\xef\x7d\xfc\x59\xa9\x1b\x50\xdb\xad\x79\x82\xeb\x5f\x10\xfb" - "\x4a\xb9\xd8\x57\x38\x93\xfe\xd2\x6b\x0e\x08\x3b\x5a\xfb\x0b\x22" - "\xe6\xab\x7a\x3f\xdb\xdb\x64\x0f\x88\x58\x75\x8e\x3c\xf0\x69\x01" - "\x9c\x1b\x89\xfb\xc7\x47\xf2\x02\xec\x87\x7e\xe0\x64\x4d\x3b\x7c" - "\xc5\xcb\x58\xe0\x35\x9d\x9a\x7f\x78\xc4\x90\x44\xfc\x53\x1a\x57" - "\x54\x38\x7e\xe9\xde\xc3\xd0\xdb\x4a\x79\xdc\xca\xca\x89\xa7\x97" - "\x73\xb0\x77\x1e\x62\xf1\x49\x59\xa1\x83\xe6\x25\xea\x2b\xca\x7b" - "\xa7\xc0\x9f\x10\x9d\xd8\xfb\x16\x6c\xd3\x3d\x6a\x1d\x83\xce\xbd" - "\xb4\xff\xef\xc9\x96\x6d\x51\x7d\x83\xda\x7c\xee\x9d\xf7\x4d\xfd" - "\x46\xb8\x3e\x2a\x3f\x57\xe5\x0b\x98\xd4\x7d\xbd\x87\xba\x6a\x34" - "\xdd\x57\x98\xf7\xd9\x5b\xaf\xe9\xbe\xa4\xef\xe9\x9a\x3c\xb4\x3f" - "\x9e\x8e\x88\x3b\x7e\x0c\xbc\x37\x82\x87\x1b\x97\x9f\xa0\xfd\x1d" - "\x7d\xd7\xf8\x42\x39\x3f\xb5\x77\x81\x3f\x44\xcc\x55\x8d\x97\x94" - "\x3c\x40\xed\x4a\xb9\x97\xd5\x2e\xd4\xf6\x32\x2a\xdb\xa0\xd2\x0a" - "\x75\x9f\xab\x0d\xc9\xbf\x63\xdb\xe5\xd7\xe6\x69\x30\xd2\x60\x2e" - "\x61\x54\x7b\xb4\xcf\x3c\xb1\x31\x0c\xdb\xda\xa3\x02\xd6\xa1\xef" - "\xfb\xa2\x23\x60\x8f\x77\x83\xa4\x9b\xb5\xb4\xff\xd7\x2c\x90\x7b" - "\x8a\x4c\xe3\xe6\x84\x7f\x88\xb8\xed\x02\x06\x6b\x84\x6e\xc6\xeb" - "\x48\x42\xdf\xbc\x1e\x5d\xb2\x4d\xd2\xb2\x5a\xca\xbf\xb7\x57\x96" - "\xab\xad\x46\x5f\x22\xfb\x7b\xef\xba\x47\xd6\xad\xdf\xb4\x0e\x0a" - "\xb5\x0d\xb9\xb6\x87\xd6\x67\x66\x4d\x1a\x43\x1f\x62\x45\x5c\x6b" - "\x5f\x55\xc8\xef\xd4\x8b\x46\xd8\xd1\xcb\x98\x05\x2f\xc6\xd8\xae" - "\x06\x7e\xed\x7b\x14\xba\x02\x11\x3b\x02\x3e\x56\xa5\xde\xa0\x1b" - "\xe5\x25\xac\x5f\xe8\xef\xdb\x94\xad\xf2\x58\x2f\xbc\x06\x38\xaa" - "\x32\x07\xa7\x31\x9e\xd2\xf6\x21\xf4\x4f\xf0\xe6\xc3\x49\x82\x2e" - "\x2a\xc3\xd9\x06\x01\xaf\xe1\x24\xda\x6f\xf6\x35\x7b\x74\xd7\x07" - "\xe4\xb8\xf6\x1d\xd3\xe0\x81\xf1\x0f\x22\xd6\x26\x5f\x43\x38\xfa" - "\xa2\x51\xad\x0b\xf4\x13\x75\xd7\x68\x76\xdc\xf0\x25\xea\xda\x08" - "\x3f\xc2\x75\x9f\x29\x65\xa0\x37\x75\x56\x8d\x2e\x61\x2f\x52\xa8" - "\x9e\x57\x07\xbc\xd1\xb4\x6e\x6e\xa7\xb2\x89\x1d\xec\x85\x4c\x19" - "\x6f\xa0\x6e\xc9\xc8\x78\x03\x2f\xd8\xe8\x2f\x53\xfd\x2b\x8e\x78" - "\xbe\xd0\x9f\x56\x26\x35\x9c\x56\x57\x37\x2a\x4f\x31\xf5\xe9\x50" - "\x88\x5f\x91\xfe\x4c\x55\xff\xc7\x88\x9d\x51\x77\x0a\x3e\x43\xc3" - "\xb8\x51\x17\xab\xf2\x20\xdd\x80\x1d\xf6\xdb\x4e\xf6\x82\xf4\x65" - "\x52\x4e\xb8\xc1\xd3\x10\xd7\xdb\xcb\x07\xd7\x10\x4e\xbc\x60\x08" - "\xe3\x81\x84\x11\xa5\x59\xc3\x7c\x4a\x5d\x2f\xca\x44\xc2\x81\xda" - "\xb8\x5d\xca\xa6\x2f\xa4\x68\x7b\x36\xfc\xa5\xca\xf8\x13\x75\x87" - "\x1a\x0a\xbb\x49\xe6\x7f\x61\x55\x44\x1d\x87\x54\x5d\x84\x81\xeb" - "\xf7\xc5\xed\x13\x32\xdb\x0b\x05\x61\x9d\x40\xdd\x21\xd0\x5d\x51" - "\x87\x39\xc1\xeb\xf6\x89\x98\xd1\x3a\x2d\x46\x3c\xe5\x3d\xa0\xf1" - "\x28\x5a\x5d\x4d\x52\xe7\x24\x7c\x5c\xd2\x1a\xac\xa4\x3c\x2d\x21" - "\x7d\x2c\xa5\x85\x64\xc0\x7c\x5a\xc7\x82\xf7\x7e\xa1\x37\x2c\xeb" - "\xed\x13\x7e\x05\x84\x1c\x28\xeb\x31\x7a\xd8\x0b\x9e\xd1\x72\x1b" - "\xf1\x0f\xb6\x35\xeb\xd6\x10\xfb\xf0\x53\xfb\xfa\x5b\x49\x74\xf8" - "\xa9\x7d\xcd\xad\x30\xf9\xba\x7b\xc9\x5d\xe2\x97\x16\xc7\xad\x63" - "\xe8\x8f\xa1\xf7\x16\x71\x99\xa1\x33\x22\x39\x17\xba\xd3\x41\x19" - "\x2b\x75\xa2\xfa\x6b\x54\x7f\x27\xd0\xbe\x57\x44\x6b\xa5\x0c\xb1" - "\x6f\x08\xfe\x75\x8a\x53\xc6\x79\x55\xf7\x6c\xa2\xe5\x2f\x3e\xae" - "\x9d\x97\x09\x1b\x78\xf8\x31\xec\xcb\x16\xfa\xb8\x41\xe7\x8b\x21" - "\xfd\x87\xd4\x2f\xca\x33\x37\x4a\x6f\xd7\xd2\x35\x7d\x2c\xa5\xf5" - "\x6a\xba\x57\x99\xf7\xc5\x40\xb8\xec\x08\xdd\x76\x82\x76\x1e\x37" - "\xe8\x7c\xc9\xa6\xc1\x4c\xab\xc7\x61\xe3\x67\x54\x3e\x29\x4a\xf0" - "\xd5\xce\x17\x13\x84\xef\x50\xf0\xe2\x42\xcf\xfc\xd2\x4a\xad\x1d" - "\xc8\x08\xe8\xb7\x7a\xf6\x23\xd6\x3d\x7c\x84\x4a\x1f\xa3\x2f\x85" - "\xe6\x7f\x14\xcc\x93\x6e\xba\x46\xe8\xe5\x93\x72\x89\x3f\xbb\x66" - "\x94\x1e\x0e\x38\x34\xbf\x8a\xc5\x08\x1d\x93\x94\xd3\xa3\xc1\x23" - "\xd0\x18\x5e\xa0\xf9\x8c\x02\x2d\x97\xfb\xde\x4b\xc7\x43\x7b\xbc" - "\x29\x81\xf0\x6a\x62\x03\xfc\xcc\xcb\x7b\x0b\x2f\x9d\x07\xbe\x79" - "\x2f\x7b\x64\x90\xc3\x46\xf9\xf9\x7f\x1f\x94\x7a\xf8\xfd\x37\x87" - "\x75\x66\x2f\x95\xa8\x3e\x51\x61\xff\x46\xf3\xb5\x7f\x6e\x88\xe7" - "\xa4\xfc\x82\xf7\xa2\x3a\x71\x47\x01\xed\x5f\xc4\x39\x0f\xc9\xfd" - "\x8b\x4a\xe4\x3a\xdd\xef\x12\x75\x10\xad\x96\xf7\x00\xf6\x13\xff" - "\xff\x52\x8d\xdc\x1b\x50\x77\x1a\xeb\x33\x2f\xb2\xf7\x39\x3f\x9a" - "\x0b\x18\xfa\xcc\x2b\xea\xa5\x0f\xe2\xfd\xef\xfa\x9c\x06\x9a\xd3" - "\xfd\x34\xff\xbf\xfd\x86\xac\xab\xb5\x35\xbc\x91\x37\x05\x06\x78" - "\x63\xf9\x17\x44\xe7\x1e\x66\x2c\xb0\x91\xd7\x0f\x0f\xf0\x06\x11" - "\x83\xfc\x41\xc6\xca\xfe\xca\x58\x30\xea\xdf\x4f\x0d\x11\xae\xde" - "\xd3\xaf\x9c\x41\xbc\xc0\x7d\x94\xef\x1e\xdf\x59\x5e\x4b\x65\xee" - "\xb1\xf3\x33\xb5\x94\xef\xee\xd3\x67\xf8\x5e\xca\x7b\x77\x36\xe1" - "\xca\x46\x1e\x08\x46\x3d\x72\xca\xf6\x23\xd0\xee\x5f\x2e\xf1\x96" - "\x99\x9b\xb8\x53\x5f\xc1\xb7\x5f\x77\xed\xa0\xf3\x97\xa9\xa1\x38" - "\x65\x54\x2f\xf0\x6a\x79\x3e\x9e\x1f\x39\x45\x78\x70\x2a\x9d\xf8" - "\x0e\xc2\xdb\x53\x94\x0f\xe7\x3f\xe2\x6e\x96\x37\xea\xda\x78\xfa" - "\x4b\x1a\xb3\xff\x03\xbc\x29\xb8\x91\x37\x56\x3c\x40\xfd\xef\xa1" - "\xfe\x0f\xf0\x7a\x1a\x43\x43\x79\x17\x63\xe8\x7f\x10\x75\x06\x59" - "\x54\xfa\x66\xdd\xe4\x7d\xf4\x3d\x3d\x3f\x8e\xed\xa3\xbc\x0f\xf8" - "\xd8\xe4\x5a\xca\xf3\xc0\xcf\x27\x33\xd1\xff\x5e\xea\x77\xac\xb9" - "\x29\x48\x6d\xa3\xff\xd4\xbe\x5f\xeb\xa7\xd6\x3e\xfa\xab\xad\xdb" - "\x74\xe8\x08\xcd\x13\x45\xbf\xe5\xb9\xc7\xaf\x56\x7b\x73\x69\x9e" - "\xa3\xae\xbb\x56\xca\xd8\xbf\x5a\xa8\xf5\x7f\xe4\x39\xd8\xaf\x8a" - "\x24\xfd\xfc\x15\xc9\x3f\xfb\xd5\x98\x2e\x32\x0d\xe3\xf7\xd2\xba" - "\x55\xef\xfe\x9d\xd2\x60\x46\xdf\xe7\x8e\x3e\xe7\x4a\x5d\x9f\x23" - "\x74\xd4\xab\x1f\xca\x5b\xb3\x71\x35\x49\xbe\x93\x98\x1d\x49\x42" - "\x36\xce\xca\xb4\xad\x5f\x67\x7b\x78\xf5\x9a\xb5\xeb\x37\x66\xe5" - "\xcc\x15\xea\x8c\xdc\xac\x75\x99\x50\x5d\xe7\xac\xce\xb1\x4f\x1a" - "\x25\xcf\x94\x9a\x9b\x5a\x11\x83\xa6\x10\xf8\x7d\xf0\x43\x55\x6f" - "\xeb\xe7\xce\x14\x21\x17\x4b\x1a\xf3\xeb\x9b\x6d\x5b\x52\xf0\xfd" - "\x2d\xb9\x8f\x1f\x6c\xe6\xe5\x13\x83\x9c\x8b\xd8\xda\xba\x33\xec" - "\xe0\x1b\x02\x1e\x7d\x4b\xb5\x7a\x84\xec\x0a\x9c\xb5\x6f\x01\x1f" - "\xf6\xeb\x55\x1c\xdf\x47\xc0\xe2\x60\x99\xe4\x45\x28\x7d\x78\x29" - "\x0b\xdb\xdb\x1f\xfc\x90\xeb\x69\xec\x04\x4b\x55\x66\x28\x51\xef" - "\x3d\xfe\x67\x07\x3b\x08\x59\x0a\xe7\x36\x6d\x82\x27\x17\xf7\xb3" - "\x0e\xae\x21\x99\xa3\x84\x3b\x27\x98\x00\xaf\x72\x29\xd3\xeb\x2d" - "\x3a\xc4\xce\xed\xc0\x5d\xd1\x64\x9c\xef\xee\x73\x2a\xc9\x61\xfb" - "\xa6\x5f\x95\x42\xbe\x10\xe7\x1c\x82\x26\xfd\xba\x5b\x5b\xbb\x7a" - "\xdc\xbf\xd9\x3e\x75\x91\x5c\x7f\xbf\x3e\x8d\xfc\x34\xff\x8b\xe4" - "\xf8\x44\x1c\x70\xe2\x0d\x0e\x46\xd3\xf8\x15\xee\x58\xaa\x9e\x49" - "\x1e\x8c\x56\xcc\x3f\xaa\x0f\xe6\x92\x5c\x60\xba\x2f\x99\x97\x1b" - "\x13\x95\x72\xe3\x84\x20\xf1\x54\x0a\xc9\x09\xbc\xfc\xbe\x9b\x82" - "\xe5\x46\xa6\x6c\x4a\xd2\x63\x6f\x75\xe4\x13\x7c\xd7\x67\x4f\xe2" - "\x67\xb3\x2f\x09\x6e\x4a\x82\x9d\xaa\x91\x73\x2a\x6b\x36\x5a\x45" - "\xbc\xe2\x72\xe3\x24\xf5\x7d\x2a\xde\x15\xe2\x93\x29\xcd\x46\xef" - "\x57\x2a\x3c\x22\xff\xc8\xbc\xb3\xf1\x6e\xd1\x09\xbb\xca\x64\x92" - "\x4b\x16\x63\xec\xda\x98\x85\x7c\x06\x1d\x51\x68\x6c\x07\x99\x96" - "\x0e\xb9\x41\xf2\xf0\xec\x21\x82\xb1\xf4\x65\x11\xca\x77\xe0\x73" - "\x0d\x06\x32\x3e\xf7\x44\xc2\xd9\x83\xcd\x0a\x62\xa3\x6f\x9f\x76" - "\x2d\xd7\xff\x6a\x1f\x68\xd6\xf2\xa0\xa0\x85\x4c\x9e\x3b\x1d\x5c" - "\xa8\xc1\x13\xf7\x08\x40\x4b\x69\xde\x92\xd2\xbd\x6c\x92\xa4\x03" - "\x07\xd3\x22\xe4\xc3\x5e\xcc\xb5\x87\x1d\x50\xfd\x6c\x19\xb7\xcb" - "\xf7\x5f\x1f\x90\x6b\xe5\x60\xb1\x96\x97\xd2\xa4\xbf\x9f\x52\xe3" - "\xf1\x4d\x01\x36\xd5\xfe\x3d\xde\x45\x73\x94\xa6\xe6\x3b\x14\x5e" - "\x53\x12\xdf\xe8\x77\x21\xe4\x6b\x9c\x3f\xe2\xb9\x76\x9c\xbb\xb0" - "\x85\x35\x9c\x63\xbf\xc2\xfe\x69\x9b\xca\x58\xab\x0f\xb2\xd5\x6f" - "\x8c\x47\x6a\x7c\x4c\xcc\xb3\x79\x62\xb0\x8f\x67\x23\x1e\xe8\x98" - "\xb2\x04\xca\x50\xfe\x25\x42\x4e\xa2\x75\xa1\xd0\xba\xa0\x32\x0a" - "\xf0\xba\xb0\x1f\xf2\xcb\x6f\x8a\x9b\x0a\xba\xe1\xab\x9f\xf0\xf5" - "\x37\xc5\x80\x21\xd6\x41\xb9\x53\xdc\x83\x14\xfb\xa4\x6b\xe3\x02" - "\xd4\xf1\x73\xb3\x9f\x19\x5a\x69\x87\xa0\x79\xf1\xdb\x0b\xd9\xe4" - "\x1e\xca\x6f\xc8\x63\x46\xc8\xb0\x23\xf7\x90\xb1\xf7\x8f\x3e\x53" - "\x7c\x63\x5f\x79\x3c\xf1\x3b\xbf\x39\x4c\xb4\x7f\x5c\xff\x89\xdb" - "\x13\x89\xaf\xa1\x7c\x95\x53\x71\x56\xfd\x9b\xee\x0b\xe5\xd5\xee" - "\xe6\x02\x57\xe6\x5b\xa1\x4f\x89\x6f\x14\x67\xde\xe6\xf8\x4a\xa9" - "\xb7\xfc\x6d\x92\x56\x1e\x7a\x4f\xd8\x15\x54\x0c\x31\x6b\x45\x48" - "\x56\xfc\x6d\xaa\x9c\xa3\xdf\xa6\x6a\xf2\xc5\x58\xed\xe4\xed\xe7" - "\x8a\x63\x0e\xd3\xbb\x6d\x5e\x76\xbd\x9f\x99\x6a\x77\x33\x56\xb9" - "\x85\xfb\x9f\xdd\x42\x78\x44\x30\xe6\xfa\xdf\x34\xc3\xfe\x62\x1f" - "\xed\xd1\xe5\x0a\x63\x51\xd4\x97\x67\x07\xa8\xcd\x42\x99\x8f\x4b" - "\xbf\x6a\x56\xca\xe7\xa3\xdf\x04\xa2\x23\xac\xaa\x90\x19\xab\x14" - "\x66\xa8\x2c\x64\xd3\x29\x8d\xf8\x8a\xdf\x1e\xd3\x64\x81\x31\xcf" - "\x85\x6b\x89\x3e\x52\xbb\xdb\x0a\x79\xe0\x3d\x92\xef\x9c\x0a\xf7" - "\xff\x33\x70\xf7\xb0\x43\x0b\xe4\x18\x0f\x2d\xd0\x64\x03\x7a\x4e" - "\x19\x79\xc7\xfa\x50\xd2\xe8\x33\xe6\x07\xd7\xaf\xcf\x4b\xcf\xc9" - "\xc2\x4f\xd2\x9c\x0d\xd7\x8c\xe6\x15\x4d\x32\x1e\xd5\xa1\x34\xac" - "\x2d\xf0\x4f\xf2\xae\xd2\xa1\xea\x08\x7d\x0f\x74\xce\xb7\x81\xef" - "\x83\xad\x09\x7d\x6b\x78\x57\x5c\x1d\x60\xba\x13\x46\xa6\x1f\xdd" - "\xde\xc3\xab\xf3\x56\xaf\x5d\x24\xcd\x1a\xc6\x68\xa7\x79\x64\x3b" - "\x2f\x87\xce\x7f\x55\xd9\xdc\x27\xe8\x63\xd9\x7d\x36\x1e\x7b\x8b" - "\x4b\xee\x75\x2f\xcf\xd6\x6c\x07\xc7\xf6\xe9\x62\xcc\x0b\x96\x27" - "\xa6\x60\x8d\x38\xb6\x32\xfd\xeb\x5b\xda\xf5\x90\x4b\x0a\xe9\x19" - "\xb6\x5c\x42\xff\xad\xc6\x8a\x7c\xfb\x5c\x3b\xed\xa5\x2f\xe7\xf3" - "\x32\x23\xc9\xc0\x2f\xdb\xc7\xb3\xdf\x8a\xbc\x0f\x2f\xcf\xee\x5f" - "\xae\xbc\x80\xad\x97\xc8\xaf\xd9\x69\x8c\x2c\xf7\x4a\xb4\x9c\xb3" - "\x97\x09\xff\x7f\x53\xa7\xe1\xaf\x96\xa7\x22\x51\x8b\xc1\xf9\xf2" - "\xb8\x7e\x90\x79\x69\xbc\x4b\xe2\xf8\x2b\x77\x8a\x33\xea\xa9\xec" - "\x17\x1d\xec\x95\xdb\x0d\x56\x66\xa5\xe7\x5f\xd3\xb3\xd0\x61\xe0" - "\xdb\x08\x3c\x9a\xd1\x5b\x67\x20\x8a\x43\x94\x47\xc7\xe5\x3f\x62" - "\xfc\xe4\xbf\x28\xfa\xd3\x73\x9d\xb8\xb5\x12\x45\x33\x38\x71\x82" - "\x81\x59\xcc\x26\xe3\xcc\x2b\xa6\x5b\x6f\xfb\xde\xe2\x85\x8e\xc2" - "\x82\x7c\xae\x04\xfc\x16\x1e\x11\x37\xb5\xf4\x96\xec\x7b\xaf\x29" - "\x92\xfc\x43\xd9\x2d\xd9\x63\xf5\xb5\xcc\xc9\xed\x90\x69\x15\xf3" - "\x8a\x4a\xc7\x06\xa6\x7f\x75\xc8\xa3\x87\x0c\x05\x1e\xc6\x1d\xf8" - "\x92\x64\xf1\x57\x3e\x79\x87\xd2\x08\x5e\xf9\xbc\x74\x45\xa5\xbc" - "\x93\xf4\xea\x64\xa5\x7c\x45\x65\xb8\x7e\x03\x43\xfd\x24\xa7\xeb" - "\xf7\x17\x76\xeb\xdd\x86\xef\x31\xb7\xcd\xc7\xde\xa1\xe7\x31\xe7" - "\x8a\xda\x84\x4e\x18\x75\xd0\x1e\x5c\xe2\x38\x4f\x7b\x73\xbe\x38" - "\x9f\xd1\x9f\x61\xaf\xde\x55\x3f\x4e\x39\x71\xc6\x6a\x36\x6f\x1c" - "\x74\xbe\x4a\xf4\xff\xc1\xd9\xaa\x1c\x42\x72\xd2\xab\x55\xda\x7e" - "\x40\xdf\x37\xc8\x73\xa2\x57\x0f\x68\x79\xc6\x9c\xa3\x27\x61\xeb" - "\xcc\x5d\xc0\x03\x3e\xd0\xdd\x0d\xdf\x8b\xe3\xe0\xca\x12\xe2\x51" - "\xca\x40\x9b\x63\xb7\xc5\x4d\x30\x6f\x4b\x7e\xb4\x85\x78\xa3\xd8" - "\xde\x4b\x99\xd9\x77\x3f\xfa\x0c\x7b\xfb\xb6\xbd\x24\x73\xe2\x7c" - "\xd8\xa2\x4b\x5e\x63\xd9\x96\xbc\x3a\xe8\x5c\x7c\x13\x78\x28\x4b" - "\xfe\x5d\x3a\x4b\xe0\x76\x5d\xc0\xb9\xe0\xa6\x7d\x32\x56\x91\xaf" - "\x32\x91\xb7\x53\x99\xe3\x54\xc6\x43\x7f\x9d\x54\xae\xa5\x8b\xd5" - "\xaf\xa1\xdf\x66\x8b\x8e\xef\xb3\xd0\x4c\xce\x2f\x12\xb1\x5b\xb1" - "\x3f\xb7\x70\x33\xc9\x76\xc3\x42\x07\x17\x1d\xd6\xc1\xd5\x97\xd2" - "\xbc\x4d\x58\xf6\x38\x7f\x87\xea\x6a\x0e\x0e\x28\xcd\xb5\x67\x40" - "\x0f\x85\x5c\x75\x8c\x68\xc0\xb1\xb9\x55\xcc\xaa\xda\x4c\xeb\x5b" - "\x02\xcd\xd8\x87\xe1\x73\xa0\x89\xda\x3c\x4c\x7f\x8d\xb6\x75\x2c" - "\xea\x0c\xab\xff\x52\xb3\xb9\x92\x7c\xdd\xef\xee\x55\xf5\x00\xae" - "\xeb\xa9\xfc\xd6\x47\x81\x13\xdd\xfa\x00\xd5\x4f\xb2\x76\xb3\x3b" - "\xbb\x59\xd8\xb0\xe1\x4e\x02\xf2\x50\x1b\x49\x6e\x7f\x33\x53\xb8" - "\x55\x4f\xef\x8d\xb8\x5f\xc0\x29\x6f\x6b\x7e\x3b\x6b\xb5\xfb\x69" - "\xdf\x6c\x21\xd9\x33\x69\x36\xf5\x47\xd4\x47\xdf\x8f\xbd\x4a\xf3" - "\x6b\x23\x99\x81\xea\x13\x31\xed\x71\x77\x9f\xe7\x26\x5d\x4d\xe5" - "\x9b\xf8\xb0\x55\x8f\xfa\xcf\xb0\xd7\x4e\xf2\xbe\xa4\xa4\xf9\xbd" - "\x32\x96\x69\x07\x7b\xed\x30\xf5\xb3\x3c\xa2\x9f\x77\x52\xff\x0d" - "\xb4\x57\xba\xa8\xce\xc3\x7c\x23\xb5\xd9\x49\x6d\xfa\xbc\xb0\xff" - "\x9c\xcd\x37\x59\x0d\xe8\x73\x2b\xfa\x9b\x1f\x64\x7c\x53\x92\xa1" - "\xe2\x1c\x33\xd0\x5a\x70\xed\xa3\x5f\x1a\x7f\x03\xf1\xf5\xd3\x07" - "\x9d\xaf\x85\xfc\x3f\x80\x8f\xa4\x77\x8f\x86\x4b\x65\x94\x87\xfa" - "\xd8\x48\xfd\x3a\x1c\xdb\xcb\xa0\x5b\x88\x26\x3c\x8d\xa6\x76\x27" - "\xd2\x5c\x35\x12\xec\xde\x25\x58\x1f\xc6\x98\x94\x01\xa5\x5b\xa1" - "\xfa\x2a\x06\xa8\x4f\xb9\x56\x83\xa9\x13\x71\xde\x07\x39\xc1\xfb" - "\xd8\xf2\xfc\x41\x0e\x7b\x71\xd8\x5e\x53\x99\xbd\x34\x56\x83\x87" - "\xfd\xae\x00\x72\x7e\x17\x7b\xad\x58\xc6\x62\x7d\xad\x44\x3d\x4b" - "\x3e\x26\xf5\xbb\xf5\x5f\x02\xf6\x18\x97\x69\x5b\xdc\x0e\x77\xb7" - "\x97\x99\x3a\x2f\x25\x9e\xe5\x35\x56\xa3\x80\x3f\xfd\x5d\x89\xd6" - "\xcf\x71\xd6\x98\xdf\x4d\xf4\x45\x19\xe0\xdd\x90\x5f\xa4\x9d\xd9" - "\xef\x0e\xa7\xe7\x47\xa5\x90\xac\xa2\xa7\x7e\xe2\x1e\x53\x22\xf1" - "\x68\xb7\xc1\x0e\x91\xfa\x47\x7b\xf6\xef\x8e\x5f\x28\x06\x32\xc1" - "\x87\xf8\x82\xd7\xa9\x0f\xbf\x13\xfa\x54\xc4\x88\x95\x3a\xd6\xd7" - "\x13\x34\x3f\x1c\x7c\x80\x17\x60\xef\xa5\x76\x8b\x8a\x37\x8a\x36" - "\x10\x17\xb7\x3b\xcf\xc6\x4f\x34\xd9\xbc\xe3\xfa\x3a\x88\xb0\x9f" - "\xf3\xaa\xb1\xf6\x84\x2d\xc1\x48\xfb\xb9\xd7\x0b\x22\xf4\x35\xb0" - "\x27\x28\x82\xcd\x84\xf4\x97\xf4\xba\xb0\x09\x5c\x9e\x2f\xfd\xc2" - "\xb8\xfd\xbd\xaa\xdc\xf1\xfa\x87\x22\xfe\x16\x78\x5a\x61\x73\xd7" - "\xa3\xda\xc9\xbd\xbe\x1a\x6d\x34\x8d\x8a\xf1\x9d\xb5\x6e\xf5\x83" - "\x6b\xb3\xa4\x0a\x73\xde\xcf\xf2\x56\xff\x74\xa4\x6c\x64\x10\xb2" - "\xb8\xf3\xf5\x63\xf2\x4c\xa0\xc1\x14\x21\x23\x18\x42\x3a\x5d\x3d" - "\x6b\x90\x7a\xdd\x86\xb9\x63\xe9\x75\xef\xfa\xe9\xba\xf5\x39\xa2" - "\x0d\x61\x52\x98\x25\x6f\x05\x4e\x62\xf7\x2e\xb9\x6b\xc9\xbc\xdc" - "\xac\x3c\x11\x54\x47\x2a\x51\x57\x67\x66\xe6\xa8\x06\x87\x6b\x50" - "\x0a\x5f\x1e\xde\x24\x8a\xda\x1f\xc9\x93\xa6\x8a\xb9\x6b\x57\x6f" - "\xcc\x52\xab\x88\xec\xeb\x74\xd0\xcb\xa6\x1a\xa1\xab\x9a\x24\xed" - "\x23\x1a\x0e\x47\x9c\xa7\x46\xea\x6f\x2e\xa7\x6f\xa1\xf3\x7f\xfb" - "\x95\xc0\x95\x37\xd6\xb4\xd6\x09\x5f\x26\x86\x23\x2f\x02\xbe\x6f" - "\xdc\x89\x38\x10\xb4\xb7\x79\x10\xb7\x58\xb5\x3d\x20\x7a\xfd\xc6" - "\x2c\x92\xb5\x3c\x04\xdf\xfc\xe5\xc4\xe5\x12\x4d\x25\x39\xfd\xcd" - "\x04\x55\x27\x62\x54\xf4\x0d\x0b\x61\x37\x56\x2b\xf4\x77\x6f\x2c" - "\x0e\xeb\xef\xde\x84\x4d\x8f\x91\xe6\xbb\x13\x7d\x43\x3f\xe9\xfb" - "\xaa\x08\x9b\x9d\x4e\x0f\x81\x11\xf5\xc0\xb6\x44\xc4\x68\x21\x9e" - "\x58\xf5\x07\xa1\x6f\x7d\x11\xfb\xd0\x1f\x8a\x41\x73\x95\xd2\xf8" - "\x76\xb9\x66\x7e\xbf\x97\x97\x9b\x37\xcd\xf7\xb1\x04\x49\x33\xde" - "\x80\x2c\x3e\x85\xfa\xd8\x44\xe9\xf9\x44\x77\xa2\xc1\x1b\xc9\x33" - "\xaa\x37\x4e\xa9\xfa\x3c\xc0\x27\x3a\xa2\x0f\x9e\xb0\xce\xef\xcd" - "\x04\x6f\x6c\x7c\x7b\xb1\xb4\xc9\x11\xf6\x07\xd2\x06\xe4\xf7\x86" - "\x90\x8e\x8b\xda\x56\xcf\xdc\x13\xba\x28\x3f\xc1\xa2\x5d\x3d\x07" - "\xc7\xd8\x53\x31\x6e\x69\x4b\xf9\xfb\x11\xf2\x8f\x8c\x89\x61\xde" - "\xa4\x48\x7b\x59\xf4\x3d\x4b\xf0\x51\xd0\x2f\x0e\x01\xde\xbf\xdf" - "\x4c\xdf\x69\xaf\xfb\xbd\xdd\xc3\x5e\x0f\xf5\x07\x7d\xce\xcb\x27" - "\x66\x80\xca\x61\xef\xa3\x3e\x4d\xa4\x3c\x55\xe1\x3e\xff\x5e\x9c" - "\x8d\x42\xa6\x94\x3c\xc8\x1f\x8c\x52\xcf\x1b\xdf\x1d\x31\x6f\x86" - "\x33\xec\xf7\xa7\xa8\xaf\x22\x1e\x96\x36\x7e\x89\xb3\xbf\x1f\x31" - "\xfe\xb0\x0e\xb6\x61\x9d\xd4\xc1\xfe\x81\x85\xe7\xf0\xf7\x4d\xc0" - "\x7b\xd8\x0d\x69\x36\x43\x98\x4f\x19\x2f\xe4\x0f\x49\x5a\x3d\x8a" - "\x39\xbe\x19\x72\x72\xb9\x3c\xff\xa6\x79\xf9\xc3\x9a\x28\xdd\x09" - "\xc1\x4b\xcd\xf7\xb3\x3a\x4a\x9b\x40\x69\xf7\x23\x1f\xda\x14\xba" - "\x4a\x82\x0d\xc6\xa2\x90\x8c\x15\x65\x9d\xb0\x9c\xea\x23\xbc\x3a" - "\x74\x2c\x8c\x1b\x7f\x48\x11\xf4\x52\x85\x35\x77\x36\x6c\x0f\xcb" - "\xee\x7f\xd8\x1f\xd2\xbb\x51\x3d\xe1\x3d\xe3\x0f\x1f\x02\xc6\x15" - "\x21\x1d\x44\x63\x40\xf4\x43\x9e\xa7\xbe\xd7\xc5\x1a\x4f\x73\xe2" - "\x2f\xb0\xd7\x42\x3e\xc4\xdc\x0b\x7e\x4f\xe8\xcf\x1a\x7f\x59\x2b" - "\xcf\x2c\x76\xd2\xf3\x41\x45\x3f\x16\xee\x34\x4e\x8f\xb4\xef\x95" - "\xf0\x6f\xcc\x54\x50\x27\x8d\x1f\x75\xd1\xfe\xa3\xd3\xf4\x9a\x6a" - "\xbd\xf7\x52\x9d\xcf\x77\xa9\xb0\x16\x67\x79\xe5\x2a\x1c\x30\xc7" - "\x02\xe6\x8d\xc4\xfb\xbe\x2e\x62\xa6\x39\xea\xf8\xe9\xf5\x54\x87" - "\x8c\xad\xdb\x58\xc5\x01\x5b\x35\xbf\x17\xf2\x37\xf5\x5d\xde\x89" - "\x24\x5c\x24\xd9\x14\xfd\x54\xca\xe3\xdb\xd0\x77\x9c\xe3\x85\x75" - "\x2a\x8d\x1f\xa2\xac\xf7\x31\x59\xa6\x42\x9e\x33\xd2\xdc\x34\xea" - "\xf8\xa6\x6c\xa6\x9e\x6f\x11\x9e\xff\xbe\x0d\x78\x8f\x7a\x7c\x42" - "\x66\x6e\xf4\x28\x04\x17\x9a\x93\xf8\x41\xe7\x9b\x26\x6d\x4e\x68" - "\x3e\x9a\x2f\xc0\x6f\xd3\x9c\xbc\xb9\x50\xf3\xad\x84\xbd\x89\xd6" - "\x70\x91\xe4\x25\xdf\x3c\x6f\xd9\x76\x1b\xb7\x04\x6e\xba\x09\xbc" - "\xd1\x3e\xbd\xd0\x85\x6a\xf6\xab\x33\x09\x4e\x67\xb5\xbb\x00\xca" - "\xf6\x7f\x6f\x87\xed\xaf\xdb\x2f\x6d\x7f\x91\x7e\x8f\x8f\x2b\xad" - "\xbe\x20\xee\xc2\xb4\x53\x1b\x35\x9a\x9c\x05\xfa\x16\xb5\x4d\x47" - "\xb0\x7b\x13\xf7\x1f\x0f\xab\x74\x6d\x62\x0f\x7b\xf3\x73\xb5\xfe" - "\xc8\x3e\xac\x94\x67\x8a\x6f\xfa\x25\xef\xff\x26\x68\x4f\x95\x94" - "\xd7\xde\xf4\x6a\xfd\xa6\xef\x87\x47\x8f\x31\xf5\x8e\xbb\xb2\x6c" - "\x6b\x41\xa2\x93\x6f\xcc\xb7\x25\xcd\xc9\x9c\x2f\x8c\xc5\x6d\xff" - "\x72\xc7\x22\x5b\xea\xad\x73\xf2\xb3\xe7\xde\x23\x7f\xee\x48\x5d" - "\x86\xdf\x51\xb6\x03\xb6\x41\xe7\x1f\x53\x47\xca\x83\xef\xa8\x7d" - "\xf8\x63\xb6\x47\xf7\x2f\x42\x17\xcd\x4d\xc6\x7a\x5e\x32\xe0\xa5" - "\x3d\xb5\x17\x7c\xf2\xf2\xe0\xdf\x38\x7f\x62\xc0\xcb\x63\x8d\xf5" - "\xde\xd8\x5b\xb2\xe9\x2f\xd9\x1b\x6b\xae\xa9\x20\x1a\x68\xd9\xc6" - "\xfd\x96\xc0\x44\x49\x2b\xe9\x9d\x78\x92\x6e\xe2\x7b\x30\x97\xec" - "\xce\x6b\x1c\x7c\x79\x90\xbb\x89\xff\x21\xb8\xfc\xb1\x59\xdb\xc7" - "\x85\x1e\xb3\xd4\x58\xbf\x3c\x9f\x0f\x03\x77\x88\x3f\x20\x79\x8e" - "\xda\x8c\x82\xde\xf5\x8f\x34\xfe\x57\x93\x25\x2c\xfe\x08\x18\xd8" - "\x54\xf8\xa6\x0e\x3a\xff\x83\xe6\x7f\xb9\xd0\x3d\x2b\x4e\xab\xd8" - "\x2b\x94\xed\xd7\xae\x20\x59\x20\x59\xab\x93\xea\x32\x49\x7b\x26" - "\x59\x1f\x8b\xf0\x4d\x70\xa1\x3f\xa5\x3c\xa6\x09\x7a\x2b\xdc\x0b" - "\xb6\xe4\xeb\x10\x7f\x2b\x2d\xa4\xab\xa3\x6f\xe6\x6d\x71\xd0\xdf" - "\xa5\x99\x7d\xba\x22\xe4\x09\xeb\xb4\x14\x4f\x85\x5e\xf1\x13\x3f" - "\x11\x07\xfc\x10\xbc\xaa\xb0\xa7\xf8\x8f\xc6\xd0\xf9\xdc\x88\xb9" - "\xff\x0f\x81\x0f\xe7\x9c\x06\xc2\xed\x3f\xa6\x5c\x99\x20\x79\x27" - "\xc5\xa9\x63\xd2\x57\xc4\x7f\xbc\x2c\xd6\xa5\x8a\x8f\x04\x5f\x2f" - "\xce\xce\x2d\x01\xee\xc5\x3d\x15\x25\x8a\x70\x92\xf5\x30\x77\xc1" - "\x60\x11\xee\xab\x87\xf0\xd2\x4e\x78\x69\x27\xbc\x84\x9d\x03\xb5" - "\xef\x8d\xba\x36\x83\xd6\xac\xae\x87\xfd\x47\x01\xfa\x0f\xd8\x10" - "\xff\x6e\x52\x08\x56\xc2\x9e\x15\xf0\x31\x5f\xb2\x04\xf7\x0c\x31" - "\x56\x4b\x80\xc6\x1c\x39\x2e\xbd\xe2\x29\x77\xd2\xb8\xf4\x34\xae" - "\xfc\xd3\x42\x17\x84\xfb\x9f\x44\x4b\x12\xc3\x31\x5c\x0e\xd7\x44" - "\x8e\x51\x41\xdc\x27\x31\x86\xc3\x6f\x8d\x35\x46\xae\xc7\x18\x01" - "\x83\xc3\x4f\xab\xe7\x9c\xa2\x9f\xa0\x5b\xbd\xec\x70\xaa\x79\x5b" - "\x11\x43\x3f\x89\xef\xbd\x03\x73\x58\xeb\xe4\x95\xe8\xe7\x58\xf3" - "\x85\xfa\x64\x5d\x6f\xad\xb2\x6c\x2b\xca\x18\x74\xbe\x95\x34\x36" - "\xbc\xdf\xba\xeb\xc2\xf0\x7e\x6b\x06\xca\xa3\x1f\xb8\x43\x6a\x81" - "\x83\x31\xc2\x6f\xe2\x2b\x4a\xc6\x6a\xd7\xbc\xad\x0e\xfd\x1a\xf3" - "\x1b\xe1\x7e\x6f\x45\xce\xc8\x35\xa1\xd4\xfa\x19\xe0\x07\x7d\x91" - "\xd4\xeb\xbf\xd5\x16\x3a\x7f\x28\x35\xb6\x5b\x74\xb6\x28\xac\x31" - "\xc1\x13\xd3\x78\xc7\xaa\xd7\xa2\xab\x84\x8f\xc2\x3b\x88\x56\x8d" - "\xf9\x9d\xd6\x81\x8d\x6f\xbf\xee\x4a\xaa\xaf\xc6\xbc\x4d\xc7\xbd" - "\x51\xd7\x4d\x32\xfb\x02\xb3\x01\x57\xea\x6b\x3e\xad\xf1\x93\x62" - "\xef\x16\xba\x92\xb7\x69\xfd\x7f\x2c\xe2\xee\x78\x63\x8d\x6a\x7c" - "\xae\xb7\x33\x3d\xec\x4f\x11\xb1\x50\xdf\xce\xf3\xe8\xbe\x53\x22" - "\xd7\xea\xb4\xdd\xb4\xa7\xad\x54\x9c\x16\x6e\xdb\x62\xe1\x54\x57" - "\xac\xc2\x93\xf4\xb4\x6f\xad\x0c\xe3\x8e\xbc\xa7\xaa\xe1\x0e\x95" - "\x6f\x18\x1b\x2f\xde\xfe\xec\xc2\x78\xf1\xf6\x41\x55\xcf\x9b\x21" - "\x6d\x6f\xdf\x0e\x68\x32\x07\xdf\x3e\x6d\xb7\xad\x10\xed\xbf\x5d" - "\x29\xdb\x26\x98\x04\x52\x40\x67\x96\x11\xdc\x8a\x06\x9d\xef\x24" - "\x69\xb4\x01\x38\x64\x09\x42\x1e\x62\x02\xcf\xe9\xdb\x12\xa2\x3d" - "\xea\x19\xa1\x65\x09\x78\x55\xc5\xf9\x47\x03\xed\x5f\x7b\x70\xf7" - "\xc4\x17\x1b\x43\x72\xd9\x3b\x44\xff\x0c\x4b\x25\xfd\x8b\x49\xe0" - "\xa5\x31\xd6\x2a\xe9\x87\xc2\x28\x62\x06\xd2\x3a\x47\x9c\x40\xac" - "\x75\x4a\x4b\xa0\x7e\x23\x66\x20\xc9\x08\xef\xd4\x69\x7b\xbf\xe2" - "\x4c\x01\xbc\x85\xce\x58\x0f\x7e\x98\x60\xf7\x9c\x5e\x39\x30\x30" - "\xdf\xca\x30\xe6\x81\xed\x53\x0f\xfc\xe2\x7a\x66\xf8\xc0\xfa\x20" - "\xb3\xdf\xc8\x12\xb6\xfd\x1f\x03\xfb\xc7\x42\xa6\x07\x1c\x3c\xec" - "\x9d\x7a\x09\xbb\x77\xbc\xda\xfc\x78\xd8\xdb\xf0\x01\xc0\x70\x2e" - "\xb3\x3c\xc0\xfb\xe4\xb9\x94\x2b\x8e\xf6\x40\xab\xfc\xfe\xc7\x55" - "\x63\xec\x0f\x77\xda\xd6\xe4\xda\x32\xd7\x6f\x5a\x37\x6b\xd6\xa4" - "\x31\x64\x09\xd7\x6c\x29\x4b\xb8\xd2\x22\x65\x09\x7a\xcf\xa6\xfa" - "\x16\x8e\x96\x1d\x96\xa5\xab\xee\x45\xd2\x93\x59\xf8\xf9\x06\xb6" - "\xec\x86\x88\xd7\x9b\xd8\xb2\x1b\x6f\x4a\x5f\x91\xb5\x3a\x73\x73" - "\x44\xea\xcd\x91\x7a\xc4\x8a\xdd\xd4\x76\xd4\xd4\xef\x13\xfd\xd0" - "\xdd\xf3\x18\xf6\x9d\x77\xef\x2e\x0c\xf0\xaf\x08\x77\x17\xc2\xa7" - "\xd7\xd1\xbc\x00\x3b\x4a\xf4\x8d\x4f\x03\x5d\x9f\x28\xfd\xda\x06" - "\x19\xf4\x74\x16\x1a\xbb\x97\x64\xba\x7e\x79\xf7\xe2\xdd\x9f\xb7" - "\x56\xfb\x89\x4e\x98\xf7\x4b\x7e\xe7\xdd\xb9\x94\x3e\x99\x7e\xef" - "\x95\x67\x3a\xef\xfe\x98\xe4\xe5\x14\xe1\xc3\x64\x23\x7c\x98\xbc" - "\x2b\x6c\xc3\xae\xf7\x15\x31\xe9\x4b\xcf\xd5\x09\x1f\xf7\x1e\xf6" - "\x6e\x15\xf8\x0b\xe4\xa5\x32\xf3\x6c\x3f\x63\xc9\xf8\x05\x3f\x4c" - "\xdf\xe6\xf2\x32\xf3\x7e\xbe\x27\x0d\x36\x35\xb3\x29\xfd\x69\xf0" - "\x6d\x51\x56\xa3\x69\xd0\xf9\x6e\xa5\xc6\x83\xf8\xc6\xb9\xfb\x05" - "\x38\x6b\xfb\xa0\x99\xe8\xb7\xd9\x67\xe1\xe9\xf0\x09\xa4\x63\xb3" - "\xb1\x3f\x58\xf2\x53\xc5\xdd\x42\xec\x8b\xa0\x09\xb5\x82\x96\xbe" - "\xdb\xad\xd1\x85\x72\x29\x8f\x4e\x42\x79\xda\x3f\xcf\xca\xfd\xf3" - "\x3d\xa3\xb6\x16\xe8\x39\x41\xc3\xd5\x11\xf7\xcb\xd6\xe5\x65\xe5" - "\x64\x65\xda\xe6\xe4\x4e\x62\x11\x11\x58\xb3\xb3\xd6\xd9\x72\xb2" - "\x7e\xbe\x21\x2b\x57\x08\x7a\xf8\x3a\xf2\xfc\x8d\x68\x50\x38\x1e" - "\xf6\x54\xc0\xf8\xbd\xcd\x90\x85\x2d\xdb\x66\x89\xb3\x14\x79\x06" - "\xb6\xe2\x80\x52\x1e\x9b\x22\xf5\x96\x3d\x04\xd7\x23\xd2\x1f\x57" - "\xa9\xb9\x0a\x7c\x5c\x17\x3b\x52\x26\x6d\x65\xde\x7b\x5f\x85\x55" - "\x15\xf5\xf3\x70\x98\x5f\x6b\x12\x7e\x87\xa4\xcd\xea\x7b\xc7\x3c" - "\xcc\xd5\x10\xe6\x41\x9a\x6e\x05\x1d\x14\xf4\xf0\x5b\x68\xa1\xca" - "\x3b\x53\x3b\x47\xb6\xf1\x8d\xbc\xb3\x62\x88\x09\x7d\x20\x62\x23" - "\x48\xfa\x7a\x24\x59\x83\x23\xf1\x2f\x9d\xd0\x3b\x68\xf2\xd1\xf2" - "\xc0\x79\x5e\xb8\x99\xe9\xa1\x7b\x20\x1a\x72\xe0\x95\x1c\xaf\x9e" - "\x3b\xdf\xb3\x11\x2f\x53\x85\x3c\xb5\xaa\xed\x26\x8f\x35\x57\x52" - "\x3d\xf9\x61\xb9\xa3\x69\xb1\xe0\xe3\x87\x80\x37\x47\xa6\xa7\x63" - "\x8f\x90\xb4\xfb\x92\x6f\xeb\x2f\x9f\x24\xcf\x51\x24\x7d\x3b\xd2" - "\xa8\x8e\xa1\x17\x34\x4b\xb5\xfd\xd5\x4b\xbc\x6e\x5a\x4c\x38\x57" - "\x85\xb9\x20\x3a\x5f\xa2\xc1\x0b\xe3\x45\xdf\xa1\xb7\x26\x3a\x7c" - "\xe0\xd5\x2d\x7e\xbd\x8c\x5d\xfa\xde\x5c\x29\x1f\x35\xd9\x22\xcf" - "\x0d\xa5\x2c\xd4\xb4\x20\xec\x27\xe4\xbd\xaa\xd1\x34\x62\xfd\x3a" - "\x5c\x27\x7b\x24\x7d\xd3\xea\x47\xb2\xd2\x37\xd8\xe7\xda\x36\xac" - "\x13\xc7\xb6\x42\x0d\x90\xb7\xe1\xa1\x47\x6c\xa0\x22\xe9\x4b\x96" - "\x2d\x4b\xff\xfe\xbd\x3f\xfc\xf1\x24\xf6\xfd\xd5\x94\x96\xb7\xde" - "\xb6\x2c\x79\xae\xfc\xb4\xe2\xce\x3b\x7e\x94\x7e\xc7\xf2\x7b\xef" - "\x59\x39\x86\x4d\xba\x89\x70\xa2\x92\xe6\x28\xba\x83\x7d\x50\x2a" - "\x6d\x90\x9a\x9a\x47\xda\x20\x35\x79\xe8\x8f\xa8\xf3\xfb\x56\xc6" - "\x3e\xa0\xd4\x0f\x4a\xe9\xaf\x48\xe2\x4d\x4c\x1c\xf5\xdf\x17\xc6" - "\x9b\x0f\xc4\x79\x1b\x74\x07\x52\xf7\xfa\x3e\xd1\xbf\xf7\x96\x45" - "\x7e\x0b\xd3\x82\xf7\x83\x82\x5e\xaa\x78\x01\x7c\x48\x0f\x18\x05" - "\x6e\x48\x7e\xe5\xfd\x65\x1a\x6e\x54\xc8\xf3\x21\x06\x9d\x19\xbe" - "\x13\x7e\x57\x41\xbf\x4c\xb8\x50\x89\xb3\x75\xa4\xf3\xd8\x15\x55" - "\x6a\xbd\xc5\xd0\x37\x83\x9f\x55\xcf\xc4\xcc\x3d\xec\xfd\x77\xb9" - "\xb3\x69\xa9\x94\x05\x9b\x36\x0b\xbc\xd9\x3e\xf5\xfb\xe2\x0c\x52" - "\xdc\x27\x7a\xbf\x31\x8c\x3f\x1f\x94\x62\x6e\x40\x17\x24\xed\x7d" - "\xff\xd8\x28\x3d\x4e\x14\xa5\x75\x6b\x7e\xe6\xf3\x66\x31\xbd\x61" - "\x56\x25\xab\xd2\xf3\x22\x0f\x7b\xbf\x5a\xda\xa1\x7e\x60\xd4\xf8" - "\x67\x7a\x4e\xf0\x30\xde\x3e\x5a\xff\x55\x1e\xa1\xff\x2a\xb4\xf3" - "\x13\xad\x76\x2f\x78\x64\x97\xdb\x2b\xfc\x9b\xde\xd6\x6a\xf7\xc1" - "\xb6\x64\x52\x17\xfb\xe0\x7e\x47\x90\x0f\xd1\xf3\x54\x1a\x9b\xd8" - "\x43\xe6\x4b\x9d\x02\xc9\x63\x1f\x94\x49\xd9\x44\xa6\x03\xee\xf4" - "\x8c\x3e\x1a\x30\x3f\x84\x97\xdd\x34\x47\xcb\xc7\xa2\x7b\xe6\x6d" - "\x7a\xd5\x8f\xd4\x07\x27\x20\xa3\x02\x56\xcf\xea\x95\xec\x67\x9d" - "\xf4\x47\xbf\xa0\x7d\x61\xfe\x92\xfb\x25\x6c\x3f\xf0\x34\xe5\xf7" - "\x62\xdf\xf4\x8f\x47\x4b\x69\x3e\x8f\x6b\xf3\xb9\x3c\xe8\xbd\x0d" - "\xf3\x35\xe8\xfc\x4f\xab\x36\x97\x7d\x57\xbf\xee\x89\xda\xc6\x6c" - "\x47\x6a\x6e\x44\x3a\xad\xff\x0f\xaa\x85\x6d\x0f\xd6\xd7\xa8\xb2" - "\x44\x87\x53\xd4\xf2\x69\x5a\xf9\xd1\xfe\x89\xc5\x05\x5d\x28\xb9" - "\x16\x49\x1b\x1f\x35\x9c\xf4\x08\x1b\x1f\x9c\x01\x36\x49\x9c\xd4" - "\x74\x70\x71\x72\x3c\xcd\x3f\x50\xca\x49\xfe\x2e\x8f\x7e\x52\xd5" - "\x03\xd0\xda\xfe\xcf\xfe\xeb\x19\x5b\xeb\xdb\x94\x16\xd2\xa1\x40" - "\xf7\x01\x9f\x83\xd4\x0f\x4f\x84\x8e\x2c\x64\xa3\xe9\x61\xcd\xa9" - "\xb0\x19\xc3\x9d\x65\xd4\x83\x75\x25\xf5\x36\xcd\x71\x6e\xa2\xbc" - "\x54\xdf\x3a\x71\xfe\xed\xfc\xcf\x6c\x81\x7b\x24\x6b\x0b\x39\xbf" - "\x80\x7f\xa5\xda\x30\x09\xde\x45\xde\xc7\x6b\x5e\x12\xd2\x05\x89" - "\xbb\x69\xff\x29\xec\xb2\x29\x7d\xd5\x58\xfa\x42\xa2\x0f\xd9\xab" - "\xd7\x65\xae\x7f\xf8\xe1\x6f\x27\x0d\x91\x67\x5c\x95\x4e\xa5\x84" - "\xea\x24\xf9\xf7\xd5\x6c\x89\xa7\xcd\x44\xff\x5f\x4c\x91\xfc\xdb" - "\xbf\x9f\xa2\x75\x33\xa3\x87\x7d\x68\xd5\xf8\x77\xb9\x8e\x3e\x9c" - "\xcd\x9d\xcd\xd9\xe1\xb5\xd1\xec\xfd\xe6\xda\xf8\xd0\x30\xf6\xda" - "\xf8\x30\x89\xf6\xd9\xe3\xf4\x7d\x36\xb5\x79\x5c\xd0\x7c\xcc\xb7" - "\xe4\xc1\x5d\x96\xc0\x6d\x82\x07\x4f\xdf\xcc\x74\xe0\xbf\xa1\x9b" - "\xc6\x7e\x10\x24\xb9\x36\x48\x34\x22\x3d\xc0\xe2\xb0\x17\x54\xac" - "\x83\xde\x71\x26\x0f\x0c\x70\x4f\xfa\x66\xa2\x17\xf4\x5e\xde\x23" - "\xcf\xe0\x1f\xe8\x27\x39\x84\x9e\x2b\xba\x40\x2b\x14\x04\x43\x60" - "\x72\xbf\xfe\xb0\x5a\xe3\x71\x2d\xdb\x6c\xc2\x47\x36\xf6\xed\xa0" - "\xb4\x67\xaa\xc7\xde\x4d\xed\x34\x08\x1a\x14\xb4\xe0\x0c\x80\x55" - "\xfc\x8c\xea\x85\x5d\xd0\x3a\xf4\x2f\xea\x26\x4b\x20\x59\x9c\x15" - "\xec\xfb\x99\xb0\x07\xba\x49\xda\x03\xdd\xc4\x6a\xd7\x01\x0e\x1f" - "\xfa\x2f\xa8\x1b\x8f\xbd\x25\x35\x32\x3d\xff\xe1\x35\xe9\xf6\xec" - "\xcd\xe9\xb0\x05\x1c\xb5\xbf\xcb\x35\xe4\xfc\x68\xba\x84\xef\x47" - "\xa9\x61\x5d\x95\xb4\xe1\x03\xcd\x9c\xef\x17\x3e\x6c\xd5\xb3\x9e" - "\x8f\x17\x00\xf6\x8e\xf3\x78\x37\x12\xce\x7d\x3c\x0f\x67\x3f\x7d" - "\xb0\x9d\xd9\x97\xc6\x2a\x9d\x1c\xe7\x8d\xc4\x6b\x7d\x7c\xa9\x76" - "\xa7\xbe\x8f\xd2\x69\xed\x23\x2d\x46\x9c\x35\xe6\x09\xdd\x1c\xc1" - "\xe9\x23\x97\x87\x59\x54\x5b\xd7\xe8\xa7\x60\x9f\x27\x6c\xca\x05" - "\x9f\xf1\xd1\x69\x79\x47\xeb\xa3\x4e\x0d\x96\xc4\xfb\x2e\xc4\xbd" - "\x7e\xd8\xe9\xf4\x71\xd8\x04\x7e\xcc\xb4\xf2\x1e\xf6\x91\xb8\x63" - "\x7a\x8f\x4f\x3c\x1f\x7a\xc0\x17\x79\x27\xff\xa3\x6a\x49\xb7\x3e" - "\xaa\xa1\x74\xa2\x95\x1f\x15\x51\x9f\xcd\xd2\x47\x80\xa8\x67\xa9" - "\x66\x0f\x15\x09\xb7\x3b\x56\xdb\x89\x59\x5e\xf3\xf0\xc3\x59\x39" - "\xb9\x5a\x4c\xf9\xa4\xf5\x6b\x33\x6f\x55\xef\xe0\xaf\xcb\xda\x94" - "\xbe\x26\x53\xdc\xf1\xa1\x54\xf9\x38\x0a\xbe\x73\x21\xdf\x08\xbb" - "\x79\x31\xa6\xb6\x39\xb5\x2a\x1f\xd5\xc1\x5a\x1a\xa4\xbd\x45\xcb" - "\xa3\x72\x6f\xbb\xe4\x25\xea\x47\x9b\xb6\xb7\x41\xc7\xd2\xc7\xbe" - "\x6b\xc3\x99\x19\xfc\x32\xe0\x6c\x0e\x7a\x16\xca\x43\x6b\xf4\xa3" - "\xd0\x9d\xe9\x32\x4a\xc7\x99\xb0\x6b\x1d\xce\x81\xdb\xee\x54\xca" - "\x8c\xa5\x7c\x52\xff\x42\xa2\x6b\x26\xcc\x1d\xce\x8a\x64\x0c\x8f" - "\x96\x14\xd0\x6b\xe8\x02\x5d\xeb\x60\x4f\xdb\x12\x47\xfc\x09\xed" - "\x97\x6d\x4b\x49\xd6\x2b\x2d\xde\xc2\x8c\x68\x83\xf6\x42\x8f\xd4" - "\x2b\xb7\xac\x7a\xb7\x80\x31\x75\x3f\xf4\x94\x09\x3d\x67\x4b\x92" - "\xdc\x53\x8d\x75\xaa\x1e\xa5\x8e\xf2\x15\x7b\xd8\x55\x5e\xd9\xe7" - "\xfe\x0c\x81\x27\x82\xd6\xb5\x1c\xe0\x4f\xf6\x8b\x3b\x02\xf4\x9b" - "\xa1\xf0\xec\x28\xbc\xd3\x5e\x33\x89\xe6\xb1\x8d\x3b\x92\x98\x6a" - "\x27\x1d\xd5\xc5\x8e\xde\x00\x3d\x30\xe1\x87\x0b\xb0\xa0\xfa\x0f" - "\xa9\xf5\x1f\xa2\xfa\xa9\xdd\x9b\xd4\xf8\xb9\x2d\x5e\xad\x2d\x5a" - "\xaf\x5e\xda\x8f\x4b\xb1\x27\x53\xff\x8b\xe9\xaf\x44\xea\x9c\xfc" - "\x24\xfb\xcd\x0c\xe9\x9c\x24\xdf\x77\x34\x49\x5b\x2f\x68\x5b\x1d" - "\xc3\x01\xc5\x29\xfc\xb7\xea\xd4\xb6\x0e\x40\xff\xa1\xd5\xc9\xa9" - "\x4e\x3e\xd0\x5b\x47\xfb\xa7\x91\xe8\x86\xd7\xbc\x8d\xf6\x49\xb4" - "\x01\xbe\xdd\x37\x93\xd3\x3e\x1a\x4c\x0f\x1a\xa4\x0f\x8d\xcd\x2c" - "\x36\x92\x67\xa7\xf6\xaa\xc3\x7c\x26\xd5\x31\x40\xf4\xb9\x90\x15" - "\x75\xb2\xa3\xaf\xa1\x6d\xd8\x39\x61\x5e\x87\x68\x9e\x68\xae\x52" - "\xa8\x9d\x7a\x92\x35\x62\x09\x0e\x9f\x61\xbe\x60\x3b\x52\x3b\x24" - "\xe4\x0f\x0b\xf5\xcd\xd0\xc1\x8e\xbe\x8b\xb9\x42\x5d\x84\x17\x71" - "\x81\xc1\xb4\x7f\x85\x0f\x3b\xc0\x7a\x6b\x01\xef\xc6\xf9\x65\x17" - "\x73\xdf\x09\xbe\x9c\x64\x15\xf1\xec\xc8\xe4\x8a\x98\x6b\x61\x3b" - "\xed\xbe\x73\x6b\x37\x57\xce\x3b\x19\x6f\xa6\xfd\xe1\xbc\x9e\x05" - "\xfc\x24\x57\x53\xbf\xf5\x8e\xd3\xf0\xb3\x57\x47\xb4\xa6\x04\x36" - "\x2b\xc6\xf2\x2d\x2c\x0e\x3e\x0a\x1d\x76\xee\x6f\xf5\xd5\xb0\x56" - "\x7b\x0d\xfb\x28\x50\xc5\x5c\x1b\xa1\xa7\x75\xf7\x7e\x9c\x5f\x85" - "\xbb\x2a\x31\xf4\xfc\xb2\xed\x47\x68\xab\xb5\xf8\xe3\x63\x9f\xd2" - "\xcc\x7d\xca\x6c\x3f\x11\xef\x55\x2d\x69\x1f\x11\xb6\x7d\xc4\x1c" - "\x9d\x5c\x01\x8f\x57\xf8\x28\xda\x28\xa1\xba\xea\xe0\xcf\x2f\x4e" - "\xe9\xb3\x4e\xa2\xf1\x1b\x96\xe7\x33\x71\x46\xea\x5a\xf7\x47\xf4" - "\xf1\xd2\xda\x73\xcc\xe8\x5a\xf7\x9e\x78\x16\x3a\x13\x1a\xaf\x3b" - "\xb3\x5d\xd8\x60\xc2\x97\xa1\x3b\xbf\x1b\x77\xbe\x95\x0a\xf4\x31" - "\x28\xfb\x4d\xf0\x32\x68\xe5\xf7\x15\x6a\xe5\x5b\x05\x2d\xd8\x0b" - "\x78\x50\x9f\x8e\xae\x94\x30\x69\xa1\x54\xd9\x67\x82\x4f\x5a\x24" - "\x7c\x5a\x17\x00\x3e\xb0\x49\x57\x36\xf6\xd6\x51\xdf\x52\x08\x06" - "\x8a\xd6\x06\x70\x00\x67\x79\xa8\xbf\xfc\x1c\x33\xb9\xd6\xc1\x66" - "\xdd\xbd\xcb\x92\x6a\x30\x2a\x03\xa7\xeb\x2b\xfa\x99\x01\xf3\x06" - "\xde\xa1\x42\x7c\x17\x30\x2f\xc0\x9c\x79\x63\xa3\xf3\xe9\xaf\x80" - "\xfe\x8a\x80\x7b\xf4\x5b\x4c\xf3\x55\x42\x7d\x48\xa0\xb9\xaa\xc3" - "\xaf\xc0\xc7\x92\x81\x7a\xf8\x78\xc5\xfe\x4c\xb8\x12\x4e\x7f\x72" - "\xe0\xd5\x00\xad\x1d\x45\xc8\x9e\xee\x04\xa5\x2c\xde\x25\xed\x97" - "\x3f\x5e\xb9\x97\x78\xfd\x9a\x67\x84\x8f\x0c\x13\xc9\x27\xd0\x39" - "\xb0\xdd\xe2\x2e\x5d\x9b\x55\xa3\xe3\x4f\x26\xc2\xff\x84\x7b\x89" - "\x5e\xd8\x52\x1a\xf7\xab\xb8\xbe\x9f\xf2\x2c\xf6\xb0\xeb\xb3\xe5" - "\x9a\x68\x11\x77\x00\x41\x07\xc6\xe3\xb3\x68\xef\x6a\x81\x0d\x2b" - "\x9f\x96\xc6\x4c\x3a\xee\x35\x65\x58\xb8\x3b\xd0\x04\x1c\x32\x09" - "\xdc\x97\xdf\x88\x37\xf6\x5a\x68\x6f\x6b\xa3\x74\x83\x96\x8e\x3d" - "\x54\x21\x79\x19\xb2\xfa\xf2\xcd\x16\x5e\xd8\xcf\xa6\x0b\xbd\x97" - "\x96\xbe\xd9\x6b\x69\xa5\x9d\xbf\x90\x68\x37\x7c\xeb\xa0\x0c\xa5" - "\x47\xd1\x5e\x79\x98\xda\x75\x51\xfe\x04\x2d\x3f\xef\x4b\x33\xb8" - "\xf3\x9b\xc4\x3a\x83\xff\x35\xb1\x47\xca\xf4\xe8\xe5\xf9\x5e\x8b" - "\x98\x33\x2d\x2d\x37\x4d\xec\xcd\xf0\xc3\x41\xbc\x37\x17\xfd\xe9" - "\x12\xe9\x3a\x92\x9d\x91\x1e\x17\x91\xa6\x87\xcf\x13\xf8\xd3\x8c" - "\x48\x8b\xa2\x3e\xb3\xd0\x3b\xb5\x8d\x7d\x1a\xeb\x6e\xf9\x66\x9c" - "\x01\xca\xfd\x59\xb4\xbd\x99\x33\xe9\xa3\x57\xa6\x49\x3e\xe0\x93" - "\xba\x48\xb9\x1d\xe7\x2e\x68\x5b\xe9\x4b\xd3\x07\xfb\xd2\xa2\xd0" - "\x3e\xea\x82\xce\x95\xc6\x48\xed\x76\x33\xf8\x87\xe7\x65\x3f\xaa" - "\xe7\xb8\xf7\x45\xf5\x8a\xfe\xe4\xfb\x89\xf6\xdc\x97\x3c\xb6\x7d" - "\x4f\x4a\xb6\xab\xf0\x27\x84\xd3\x9f\x1e\x00\x4d\x09\x9a\x62\x1a" - "\x6c\x3f\xc3\x3e\xfd\xe9\x2c\xcc\x69\x90\xd6\x79\x30\x36\xa6\x61" - "\x7e\x37\xd3\x15\xd2\xda\x91\x67\x93\x9f\xde\x0e\x3e\xd1\xa1\x70" - "\x4e\xcf\x0b\x80\xbb\x96\x5e\xd8\xe5\xc4\x34\x0a\x5b\x18\xf3\xe2" - "\x0c\xb7\xbf\x9b\xb5\x14\x7d\xc1\x5a\x02\xee\xa2\xc3\xe7\xbc\x06" - "\x69\x13\x63\x40\xbd\xf7\xe2\x9b\x83\xd6\x4b\x7a\xb0\x6e\x7c\xd9" - "\x96\xe4\x25\x82\xdd\xdf\xe4\x5e\xf0\xe9\x01\x4d\x46\xba\xf0\x18" - "\xfe\x24\x7c\xa2\xc2\x5e\x54\x29\x9f\x0a\x9d\xab\x83\x0f\x26\xb1" - "\xf9\x5b\xa0\xab\xfe\xb4\xdd\xec\x63\x29\x6a\xbd\x67\x65\xbd\x7f" - "\x62\x17\xaa\x17\x78\xdb\x52\x2d\xed\x50\x14\xf3\xd4\xd4\x20\xd5" - "\x1d\x34\x4f\xad\xa4\xbd\xc6\x41\xfc\x0b\xf1\x23\xc7\xee\xa4\x76" - "\x52\x5b\x03\x6d\x0c\x7e\x95\x6b\x15\xda\xaf\xcf\x5a\x99\x6a\xff" - "\xe3\x38\xc3\xfe\x74\x83\xc2\x93\xe2\x48\x76\x13\x7d\x01\x9d\x85" - "\x3e\xbd\x30\xc8\x26\xb8\xf3\x48\xca\x8a\x4d\xc9\xa6\x3a\xbe\xfb" - "\x3e\x74\xed\x44\xab\x82\xdc\xaa\x7f\x6b\xc0\xc3\x2a\x88\x7e\x0b" - "\xff\xa0\xdb\xa7\xed\x36\x6f\x63\xb7\x71\xbd\x45\xd8\x8f\x29\x65" - "\x8b\xb2\x69\x6e\x25\x8c\xcb\x8d\x0d\x11\xb6\x46\x51\xd4\xd6\x1b" - "\xb0\x35\xe2\x26\x63\x7e\x0d\xf6\x4c\x9a\xb3\x41\xe7\x9f\x88\xff" - "\xff\x44\xec\x77\xa5\xe0\x8b\x04\x9d\x3f\x76\xb7\x37\x36\x31\x19" - "\x75\xc0\x4f\x99\xb2\x31\x50\x5f\xf1\x35\x33\x48\x78\x1c\x9b\xd7" - "\xda\x3b\xe8\xe2\xa5\x89\xc9\x58\x47\x6a\xdd\x16\xaa\x3b\xc8\xcb" - "\x12\x49\xf6\x39\xb6\x4c\xce\x8d\x78\xb6\xe2\x7b\x60\x18\x77\x03" - "\xff\x54\x55\x33\x04\xbe\xe8\x4f\x29\xc4\xeb\xba\xfa\x4c\x89\xc9" - "\x3f\xb4\x16\x11\x0f\x70\x2c\xc3\xa3\x53\xc4\x1d\x36\xcd\xd7\xe9" - "\x78\xe7\x6a\x7c\x8f\x75\x92\x9b\x2a\x21\xbe\x3d\xa1\x87\xfd\xf9" - "\x93\x21\x27\xd3\x0f\xd3\xde\x3a\x44\xb2\x0f\xdf\x93\x66\x2a\x9f" - "\xca\x92\xe9\xdb\xd4\x1e\x76\xec\x8d\x80\x9e\x25\xd0\x5f\x9c\x77" - "\x5a\x76\x0c\xd5\x9b\x02\x9d\xee\xd1\x73\x38\x67\xfe\x4c\xfa\xe5" - "\xd8\xcd\x66\x2b\x54\x1f\x74\xc9\x15\x53\xd9\x6c\xe8\x91\x29\x2d" - "\x29\x3d\x28\xcf\x59\x34\x39\x71\xfb\x54\x36\x77\x64\xbb\xc7\x6a" - "\x24\x9f\xf7\x67\xb1\xc7\x6f\xf2\xb2\x2b\xec\xdf\xe3\x1d\x54\x6f" - "\x25\x77\x46\x71\x3e\xcd\xaa\x97\xfc\xe0\x67\x9b\x2d\xd5\x12\xef" - "\xc4\xb9\x02\xe1\x1b\xce\x6d\x54\x7d\xb5\x4e\xf8\x78\x35\x9b\x97" - "\xe0\x6e\x96\x48\xd3\xc5\x01\x96\x71\xa2\x1f\xaa\x5f\xc6\xe0\xf6" - "\x6b\x33\x50\x07\xfa\x93\xbe\x5a\xea\xba\xe1\xb3\x91\xe0\x2a\xec" - "\x84\x4b\x77\x33\xd3\x53\xbb\x59\xdc\xd1\x87\xc5\xb8\x0e\xc8\xb5" - "\x68\x60\xe8\xaf\x52\x8a\x75\x46\x38\x41\xfd\x46\x7b\xc0\x8d\xd6" - "\xc0\x59\x97\x23\x8f\x2b\xae\x9f\xc1\x3f\xc9\x67\xa7\x5c\x39\x87" - "\xd8\xf2\xce\x80\xf4\x33\xb6\x8a\x79\xf7\x51\x7d\xfb\xa6\xb2\x38" - "\xaa\xab\xdf\xbd\x16\xb4\xd6\x7a\xa5\x2b\xa7\x81\xea\xfe\x73\x0c" - "\xf6\xa3\x32\x82\x8f\xdc\x97\xfe\x7c\xd8\xed\x6f\x67\x88\x71\x71" - "\x8f\x9d\x07\x51\x0f\xe5\xb9\x5d\x8c\x77\x8f\xd5\x96\x2e\xfd\x6a" - "\x8a\xb1\x86\xce\x10\xd4\x71\xb8\xcf\x89\xfa\x56\xba\x33\x88\xe7" - "\x54\xc7\xa4\xc1\x5a\xe2\xd7\x9f\x9f\x76\xe5\xec\x67\x98\x1f\xe4" - "\xa7\xf7\x22\x77\x2f\xe5\x3d\x3d\x72\x5e\x90\x87\xbe\xbd\x46\xf5" - "\xfe\xdf\xf0\xd9\x18\xce\x6c\xc2\x79\x6a\x68\x3c\x04\x2b\xdf\x1e" - "\x82\x91\xd4\x19\xfe\x79\x06\xfa\x4a\x73\x37\xdd\x9d\xf7\xc5\xd8" - "\x77\x22\x69\xed\x13\xde\x6f\x6b\x15\xfa\xb2\xbf\xc4\xde\x13\x50" - "\xb8\xa4\x67\x7f\x71\x11\xef\x96\xed\xa1\x5f\xd0\x02\x41\x4f\xae" - "\xc7\x79\xf6\x5f\xde\xb5\xe8\xe4\xfc\x62\x2c\xe0\x99\xc6\x9a\xe3" - "\x88\xb3\x8a\x38\xf4\x55\x9b\x63\x6e\x4a\xc9\x56\x70\x06\x05\xdb" - "\xde\x61\x2b\x93\xf8\xc7\x2b\xa9\xde\xd7\x54\x1e\xd2\xaf\xee\xa7" - "\xfe\xbe\xd8\x18\x17\x7f\xcc\xca\x34\x3b\x44\x5a\xbf\x87\xd3\xa5" - "\xed\xa8\x15\x34\x6a\x9f\x5e\xae\x1d\xf4\x51\x2d\xeb\x93\x67\xe3" - "\x7f\x29\xa2\xf2\x63\xda\x7d\xf3\xa8\xa9\xf0\x3f\xe5\x80\x0f\x51" - "\x71\x57\x89\x68\x15\xed\x07\x13\xdc\xbe\x21\x26\xcf\xeb\xdb\x6f" - "\x25\x1e\x7f\x02\xee\xa9\x6a\x7d\xbb\xb8\x73\x85\x76\xf5\xbe\x5c" - "\xfb\x52\x4d\x86\xe6\x26\x82\xb1\xd3\x22\xe2\x1d\x10\xdf\xa5\xf8" - "\x62\x53\xec\xde\xd8\x15\x75\x72\xdd\xb4\xdb\x79\xac\xa4\xb7\xe9" - "\x7e\x56\x84\x71\xa9\x7a\x89\x09\x18\x33\xd5\x53\xa9\x9d\x6f\x6b" - "\x75\x8f\x1b\x43\x44\x1b\x1b\x8d\x49\xfa\x37\x48\xc9\x16\x63\x83" - "\x8f\x1e\x31\xb6\xcf\xc5\x1d\xc0\x8b\x1c\x4f\xbb\x84\x6d\x8a\xdd" - "\x35\x15\x75\x7c\xf1\x4b\xf4\x0f\x73\x42\xf4\xe1\xb2\x1e\xf6\x79" - "\x06\x9f\xf4\xd4\xa4\x8b\xab\xf3\xf3\xb9\xb2\xce\x15\x75\xcf\x11" - "\x0d\x96\x77\x16\x61\xb3\xf3\x45\x19\x2f\x5b\x51\x07\x19\xa6\x8f" - "\xda\x23\xfc\x88\xa0\x43\x5f\xc4\x61\xae\xae\x3f\xc4\x52\x24\x1e" - "\x7e\x11\x0d\x79\x57\xc6\x78\xfa\xbc\x81\xf0\x5e\xfa\x97\x0b\xd9" - "\xac\xea\xc4\x3e\x16\x49\x63\x2f\xb2\x8f\x52\xa6\x31\x2f\x22\x79" - "\xee\xf3\xfd\xc2\x2e\x89\xfa\xbb\x29\xa0\xd1\xbf\xcf\xf7\x73\xe8" - "\xbb\x0b\x55\xbd\x27\x68\x59\xa1\xf4\x11\x38\xe8\xfc\x62\x49\x48" - "\xef\x89\x3b\xdd\x4e\xde\x8c\x7c\x34\xf7\x67\x91\x47\xfa\x20\xeb" - "\x51\xef\x3b\x7f\xf1\x63\xf5\x2e\x73\x12\x6c\xb5\xa8\x2c\xd1\x3b" - "\x2e\xf4\xad\x80\x01\xda\x16\x7d\xd7\x43\xc7\xf9\x45\x4d\x58\xcf" - "\xfc\xb9\x88\x0d\x21\xfd\x11\x7c\xd1\xa0\xe1\x08\x8d\x77\x82\x8c" - "\xeb\xf1\xf9\x8c\x23\x73\x99\xc0\x81\x3e\x6e\x9d\x74\x55\x0d\x70" - "\xf2\x8b\xe3\x91\x70\x5a\x1e\x50\x1c\x92\x06\x7d\xde\xc4\xc5\x5a" - "\xff\xbc\xe9\xdb\xf9\x89\xff\xba\x41\xe3\x45\x24\x9c\xe3\x88\xbe" - "\x7c\x19\x10\xb0\x2e\x19\x40\x0c\x38\xcb\x63\x85\xf0\x23\xfe\x5f" - "\x5f\xc3\x5f\x7b\xa0\x64\xc0\x1e\x74\x58\xe1\x9f\x96\x29\x25\x03" - "\x45\x5d\x76\xa6\x4f\xb7\x43\xb7\x9e\x28\x64\x3c\x92\x59\xe3\xb8" - "\x99\xf8\x13\x5a\xe7\x5b\xd7\x30\xcb\xfd\xd9\xd0\x31\x24\x25\xc0" - "\x9f\x3a\x7c\xa9\x23\x16\x42\xd0\x91\x14\x4f\xcf\x89\xc4\xcf\xc5" - "\x71\xe3\x40\x06\xce\xe7\x83\x4e\x4e\xf4\xf8\x38\x7c\xba\xeb\xdd" - "\x5e\x3f\xdb\x7a\x9a\x19\xe1\xaf\x3d\x50\x96\x68\x6d\xf5\x7d\x29" - "\xe4\x1b\xb3\x9d\x25\x10\xff\x81\x3b\x00\x56\x25\x36\x91\xd1\x1e" - "\x6f\x90\xe3\x3e\xcb\xe5\xb8\x65\xbf\xd1\x7f\x41\xe3\x4a\xfc\x45" - "\x85\xa2\xef\x5f\x3e\x17\xa0\xfa\x95\x92\x60\x41\xb0\x24\x98\x2f" - "\xef\xd4\xb7\xb0\xc2\x3c\xde\xed\xf6\xb5\x90\xcc\xd5\x2f\x62\xd7" - "\xe1\xfc\x1f\x63\xc4\xf8\xd0\xf6\xc7\xe7\x4e\x0b\x5e\x2b\x40\xef" - "\x8e\xb5\x6a\x99\x5e\x2a\xd3\xdb\xc2\x86\x4a\x82\x62\xec\xad\x3e" - "\x59\x36\x5d\x3c\xa3\x7c\x04\x1c\xd4\x31\x87\xe0\x40\x63\xc7\xf8" - "\x30\xfe\x00\x60\x42\x30\x50\xc7\x6a\x1d\x56\xc7\x89\x31\x7e\x44" - "\xbb\xce\x6e\x1a\x27\x8d\x55\x8c\x73\x98\xc6\xd9\x9c\xcd\x98\xbf" - "\x3c\xa5\xe8\xfc\xa4\x60\x3e\x64\x54\xc7\x27\xc4\xc3\x17\x54\x32" - "\x92\x45\x0d\x2f\x17\x56\xea\x9f\x24\xde\xa4\xd0\x4b\x32\xa9\x97" - "\x77\xc3\x86\xd7\x6d\xa7\xbf\x40\x0d\x03\x8f\xa3\xf1\xeb\xd4\xb6" - "\xf5\x63\xe5\x24\x2b\xec\xe6\xdd\xc4\x9b\xfa\xdd\x01\xca\x93\x4d" - "\xe3\x27\x19\xb6\x4b\xed\x3f\xf2\x6e\xfd\x5a\x8e\xcb\xb2\x96\x25" - "\xbc\xf3\x93\x12\xbd\xbb\xbd\x84\x69\x63\x79\x80\xf2\xd1\x78\xac" - "\x54\x57\x2c\xc6\xa3\xd0\x38\xf7\x50\x3f\xfd\x11\x63\x3a\xda\x0b" - "\x3b\xe2\xcf\xd8\xa4\x54\xa6\xdb\x7d\x86\xc6\x71\x86\x59\x2b\x0b" - "\x89\xff\x5a\x01\x7e\xf1\xf8\xd1\x4b\xd2\xd8\x6c\x0f\xfb\xaf\x63" - "\x52\xa6\x13\xbe\xa0\x2f\xed\x61\x5f\xf6\x87\xfc\x3d\xc3\x87\x7e" - "\x6c\xe2\x74\xe0\x91\xf0\xfb\x8c\x3d\x63\x90\x70\x06\xe7\xf4\x9b" - "\xa8\x8d\xc1\xa4\x44\xd1\x1f\xe7\x02\xd8\x09\x9b\xe8\x1d\xb1\xa3" - "\x70\x5f\x55\x47\xe5\xac\x9c\x60\x86\xfa\x89\x9f\x33\xe0\x17\x30" - "\x1c\xd3\xe6\xf6\x15\xb6\x90\xda\x68\x80\xfc\x5d\x5f\xe8\xd5\x3f" - "\xfe\x0a\x9b\x7b\x71\x34\xe5\xaf\xb3\xc7\xa3\xdf\xd0\xcf\xa2\x3e" - "\x1a\x5b\x7c\x0f\xfb\x5b\xcc\xc8\x35\x66\x13\xb4\x4c\xd2\xc1\xbf" - "\xb6\x41\xff\x79\x91\xed\x0a\x1e\x0e\x36\x16\x17\x59\xee\x98\xd6" - "\x0f\x7a\x1e\xf7\xbe\xc5\xc5\xc3\xe1\x6f\x73\xc7\xab\xab\x6c\xa7" - "\xb0\x91\x74\x94\xef\x24\x7a\x41\xbc\xc2\x11\x2b\xce\x52\x68\xef" - "\xdc\xef\x63\xb9\x7b\x19\xe2\xcf\xc4\xba\x03\x77\xb3\x23\x35\xc9" - "\xac\xf6\x1c\x7c\xc6\x25\xc5\x3f\x7b\x8e\xe6\x52\xa5\x21\xe0\x49" - "\xa1\x47\xe6\xb9\x49\x71\x15\x3b\x35\x1e\xfe\x6f\xfd\x05\xfd\x4c" - "\x6f\x5b\x27\x9e\x7d\x4b\x6c\x3c\x50\xa5\x57\xb2\x6b\xe0\xc7\xdc" - "\xbc\xa8\x1e\x7e\xcc\x35\xdf\xe0\x82\xf7\xc9\xa7\x35\xd7\x67\x9d" - "\x54\x96\xc3\xe6\x22\x9e\x81\xc5\x2b\x79\x39\xb9\x5f\x7b\x66\x53" - "\xff\xe2\x54\x7f\xe1\x71\xd2\x5f\xf8\x5f\xd7\xc2\xe6\x5c\xfd\x7e" - "\x6f\x90\x64\x18\x51\x6f\x0e\x9b\x5d\x73\x8e\x25\x81\x0f\x4a\x3f" - "\x29\x79\x36\xc8\x85\x77\xf7\x5a\x78\xf0\x1f\x49\x6c\x6f\x4f\x38" - "\xde\x81\x37\x17\x31\x12\xb8\x75\x3c\xfb\xe9\x8a\x44\x61\x4f\x20" - "\x7c\xed\xe2\x9c\x81\xde\x59\xd5\x33\xcc\x70\x04\xb6\x89\x75\xf2" - "\x1e\xde\x91\x80\xb4\xf7\x1d\x74\x7a\x9a\x34\x3f\xf0\xe3\x9e\x97" - "\x97\x4a\x79\x47\x99\x40\xf2\x97\x77\xd0\x25\x7d\x90\x9e\x30\xb9" - "\x8b\x95\x08\x19\xc7\x73\x1a\xdf\x90\x06\xbf\x6e\x29\x02\x96\x27" - "\x16\x40\xee\x51\x65\xc6\x77\x6c\xa1\x34\xc9\xc3\x08\x9b\x6b\xab" - "\x3c\xff\xa3\xbd\xc9\x3c\xe8\x3c\x91\xaa\xed\x67\xd8\xd7\xa5\xaf" - "\xd7\x13\x99\x1e\x3d\x3b\x7e\x81\xfe\xc5\xa9\x36\xe2\x38\xbb\x49" - "\xa1\xfc\x55\xda\xfe\x26\xce\x70\xb7\x4f\xfd\x7e\xee\x66\x36\xfd" - "\x87\x97\x1b\x19\xce\xff\x28\x6f\xb7\xdc\x77\x4f\x1c\x0e\x9f\x11" - "\xa4\x08\x78\xc3\x47\x81\x90\x31\xe0\xfb\x53\xc6\x34\xe8\xd5\x7c" - "\x80\xca\xfd\xf7\xc4\xe7\x11\xed\x04\x42\xfb\x28\xb5\x01\x1b\x74" - "\xd4\x2f\x79\x93\x13\xf5\xe2\x2e\x25\xe5\x93\xfb\xeb\x89\x71\xe5" - "\x36\xf8\xa1\x02\x7c\x15\x55\x9e\x74\xf7\x7e\x25\xe1\x9b\xcf\xa2" - "\xe6\x57\x31\xeb\x3b\x85\x1e\x83\x59\xfa\xe8\xb6\x74\xb0\x8e\xbb" - "\xf1\x1d\xb8\xee\xba\x1e\xfa\xc0\x8e\x83\x6e\xec\xdb\xc3\x69\xa6" - "\x7b\x20\xeb\x0b\x5e\xbc\xa3\x7a\x1e\x95\xa3\xb4\xf8\xb7\xcf\xf8" - "\x0d\x15\x5b\xd8\x5c\xe9\x4b\xb5\x43\xf8\xe8\xc2\x9d\xf5\xab\x12" - "\x98\xf5\xaa\x2a\x96\x34\xe8\xec\x70\x79\x74\x5c\xd8\xab\x88\xf6" - "\xcb\x7f\xd4\x86\x78\x0e\xaf\x0e\x79\xa2\xe5\x5c\xfd\xfd\x7e\x7a" - "\x4f\x0a\xbf\x77\x9c\x57\xcf\x87\xda\x3c\xec\xef\xab\xf6\x9d\x91" - "\xb6\xf4\x42\xbf\x54\x7a\x4b\x6a\xd8\xfe\xe0\xef\xf7\xcb\xbe\xfc" - "\xfd\xfe\x23\x76\x06\xdd\xf9\xb1\x5a\xe1\x9b\xfd\xef\x24\xf7\x9e" - "\xb0\xab\xfa\x98\x36\x81\x57\xe0\x77\x77\x40\x06\xfb\xca\x55\x46" - "\xf9\xb0\x4f\x10\x7f\x94\x22\x79\xf8\x5b\xb2\x15\xc2\x9f\x88\xf1" - "\x7f\x08\x7d\xe3\x98\x34\x71\x37\x63\xa2\x4c\xd9\xa2\x3a\x61\xcf" - "\x52\x76\x5f\x12\xfd\x1a\x79\xd9\xe2\x54\xfa\x35\x11\xce\x65\xd0" - "\x6f\x1c\xfd\x42\x96\x4d\xa0\xef\x71\xc0\x4b\x92\x61\xad\x88\x51" - "\xd9\x17\xbb\xa8\x7a\xbc\x7b\x51\x80\x8d\xbb\xf8\x47\x4c\xda\xec" - "\x75\xa6\x20\x3e\xe1\xf2\xbd\x8c\xe5\x06\xf8\x90\xed\x0a\xc4\x18" - "\xe9\x4c\x71\xec\xc5\x59\x7a\x67\xc2\xc8\xb3\xf4\xce\x05\xf4\x47" - "\x6f\x9d\xcd\xf4\xe7\xa7\xbf\x94\xf0\xdf\xc9\x05\x83\xce\xce\x14" - "\x82\xa3\xe0\xb1\x2e\x8e\x26\xa2\x3c\xcd\x03\xe4\xa2\xd8\xa9\x29" - "\x72\xbc\x2b\x8a\xe8\xdd\xc8\x63\x7f\xe4\x52\xc7\x6b\xa7\xf7\x38" - "\x9b\x83\xf6\xb5\x58\x82\xc9\x54\x1a\x73\xec\x7d\x49\x18\x2f\xfa" - "\xdb\x17\xbb\x38\x35\xf2\x4e\x18\xea\xc4\xf8\xbd\xb1\x54\x8e\x60" - "\xc9\xaf\x7e\xdd\xa3\xc1\x53\x85\x13\xee\xcb\xe8\xfb\xa8\x0e\xc9" - "\x07\x51\x7e\xaa\x43\xcb\x1f\x82\xfd\x54\x26\xf8\x26\xb4\x45\x32" - "\xb1\x51\xbb\x6f\x36\xe8\x3c\x39\xf7\xdd\xb5\x4c\xf5\xe7\xd1\x99" - "\xe2\x8b\x28\x0b\x9f\x0a\x63\x95\xa7\x36\x8d\xb2\xcd\xc5\xa9\x5d" - "\xac\xf3\x76\xd9\xee\x49\xdb\x78\x6b\xa9\x70\x16\xf1\x77\xc4\xf5" - "\xce\x97\x72\xdf\x62\xf7\x74\x1f\x73\xd7\x28\xb4\xe7\xdf\x52\x94" - "\x52\xc8\x5d\x5d\xec\xe4\x89\x56\x7f\xf7\x45\xee\x87\x27\x85\xbf" - "\x10\x3e\x54\xc4\xdc\x05\x37\x8a\xf3\xac\x33\xec\xab\xc9\x6e\xaf" - "\xb8\x73\x4e\xcf\x5d\x41\x7c\xc7\x19\x3a\xf6\x06\x92\xb1\x43\x71" - "\x32\x14\xca\x5b\x8b\x74\x4a\x83\x4f\x92\x7d\x11\xdf\x78\xf9\xa2" - "\x34\xb9\xa6\xba\x3e\x04\x6f\x21\xfa\x1b\xf8\x57\x17\xfa\xac\x94" - "\x2e\x4a\xc3\x18\x1c\x24\xff\x21\x36\x28\xd6\x84\x6d\x23\x74\x85" - "\x5d\xbf\x24\xbc\xe3\x4a\xd9\xa2\xb4\x8b\x1b\x43\x97\xb8\x2b\xe9" - "\x08\xf0\x33\xde\xd8\x45\x69\xe0\x49\x2a\x0a\xa3\x8d\x77\xd4\x70" - "\x57\x9f\xf9\x96\xa2\x41\x67\x57\xf3\xbb\xf9\x72\x6e\x2e\xb2\xde" - "\x66\x6d\xec\xb5\xea\xd8\x29\x4d\x9c\x51\xcd\xaf\x96\xf1\x43\x3c" - "\xec\x2b\x36\xae\xce\x8a\xe6\x19\xfc\x00\xed\x0d\xe7\x25\x2c\xbe" - "\x4a\x0d\xed\x0d\x17\xd5\x8f\xaf\xc6\xf5\xe5\x1f\xd1\xc6\xb0\xda" - "\x46\xc3\x7f\xb3\x8d\x86\x0b\xb5\x21\xcf\xcf\xbb\x53\x2e\x5e\x76" - "\xec\x16\x7e\x75\x88\x7e\xda\x25\xcd\x3c\xf5\x5a\x90\xe4\xb7\x80" - "\x69\x45\x11\x78\x1b\xd8\xca\x22\x96\x4a\xa0\x74\x6a\xca\xd1\xfc" - "\x21\xe6\xda\xf8\x29\xeb\x64\xdd\xc2\x7f\xdf\xd1\x3c\xc8\x6c\x3f" - "\x72\x0d\x97\xdf\xd2\x36\xac\xff\x0a\xf7\x27\xb3\xf7\xd2\x3c\xec" - "\x89\xc0\xb3\x56\xdf\xa7\xcc\x9d\x01\xfd\x6a\x1b\xf4\xda\x2e\x1e" - "\xbb\xa2\x48\x21\xda\x40\x3c\x7a\x50\xc0\x83\xf8\x17\x21\x6f\x91" - "\xcc\x26\xe4\x2d\xaf\xf0\x99\x1c\x2b\x62\xa4\x38\x5f\xc9\x83\xee" - "\x3b\x38\x9c\x66\x1b\x74\xb2\x54\xc4\x4e\x81\xde\x99\x9b\x8c\x95" - "\xcb\x03\x51\x5c\xc8\x53\xc4\xfb\x23\x76\x8a\xdb\xe7\x61\x41\xe2" - "\xa3\x6b\x06\x58\x42\x0d\xf1\x9e\x44\xb3\xe3\x40\xd7\xf7\xa9\xf1" - "\x53\xca\x06\xc2\xf1\x53\x6a\xa1\xeb\x69\xa7\xe7\x01\x66\x08\x96" - "\xa5\x64\xef\x19\x60\xb3\xf7\x6e\x64\x49\x7b\xa0\xcb\x3b\x25\x79" - "\x1f\x61\xdb\x8e\x58\x2a\xeb\x93\x70\x96\x10\xe6\x7d\xe0\x23\x21" - "\x4c\xb7\x0c\x42\x07\x72\x51\xf0\x3e\x25\xf6\xc1\x40\xe9\xa2\xba" - "\x80\xe9\xbe\xa4\xe1\xf2\xc5\xc4\x73\x74\xd7\x13\xfc\xe6\x8e\x35" - "\xb7\x9a\x8d\x4c\x55\x44\xfc\x9b\x77\x67\x4b\xfa\x4e\x75\xf9\xc6" - "\xc3\x89\xe0\x9e\x34\x36\xbf\x97\x25\xcb\x73\xfb\x18\xda\x13\x7b" - "\xd2\x60\xd3\x58\xf8\x28\xb3\x06\xf7\xac\xd2\x39\x5e\x60\x51\xee" - "\x40\x0a\xc3\x5f\xe1\xd7\xbc\x7b\xfe\x5a\x96\x8c\xf3\x07\x9c\x95" - "\xd8\x1e\x13\xf9\xaf\x99\x5d\xc0\x46\x9c\x39\x3c\xba\x39\x67\xcd" - "\x0d\xc9\x3f\xcd\xb2\x3d\xbc\x26\xe7\xd1\x4d\xab\x73\xb2\xd8\x52" - "\x69\x0a\x22\xdc\xd1\x6f\x86\x1d\xc8\xa6\x35\x79\xd9\xb6\x87\x36" - "\xe4\xe4\x64\xad\xcb\xb3\xdd\x7d\x47\xea\x37\x7d\x92\xee\xb1\xee" - "\xc7\x59\x8f\xb4\x0b\xec\x8d\xe1\xcf\x5f\x37\x50\x8e\xf8\x5a\xdb" - "\xee\x5c\x69\x09\x2c\xb5\xc9\x38\x47\xbd\xab\x60\x8b\xcb\x1d\x69" - "\xd5\x92\x4f\xed\xbd\x5f\xf2\xf6\x96\xa5\xf2\x1e\x5d\xaf\xf4\x03" - "\xd8\xb7\x74\xba\x5c\x53\xff\xb8\x35\xca\xce\xf0\xfc\x28\x9e\x2d" - "\x76\x56\xe2\x9a\x8a\xf3\xf0\x7f\x08\x1f\x8d\x7c\xcf\x32\x9d\x96" - "\x4f\xcb\xa3\x7e\x17\x7e\xa7\x6b\xe1\x57\xd7\xd9\x93\x49\xf0\x89" - "\x1f\x74\xfe\x63\xa5\x47\xef\xeb\x56\x79\x84\x6e\x69\x83\xd8\xbb" - "\x0a\x3e\x3a\xf9\xf3\xd3\x06\xd4\x7a\x4a\xa9\xbd\x4b\x28\x6f\x91" - "\x87\xf5\x18\x55\x5b\xc5\x99\x1d\x6a\xbf\xa4\x4d\x45\xcf\x46\x69" - "\x53\xf1\x8f\xfd\x11\x77\xe1\x85\xaf\x09\xec\x8d\x2a\x4f\x3a\xa8" - "\xd6\xd7\xac\xd1\x04\xca\x7f\x8c\xf8\xba\xea\x8b\xa7\x85\xff\x90" - "\xf2\xcf\x08\xdf\x4b\xbd\x77\x8e\xf4\x69\xa2\xc1\xcd\xfa\x2b\xa9" - "\x8b\x97\x70\xa5\x31\x1c\x96\x70\x12\xe9\xd3\x7b\xe8\x1d\xe5\x3c" - "\xac\x77\xfa\x68\xfc\x0a\xcd\xf8\x5d\xeb\x1e\x5a\xff\xa8\x7d\x75" - "\xde\x9a\x07\xd7\xac\x5d\x93\xb7\x59\x5c\xd9\x9f\x2b\xfe\xfb\x97" - "\x39\x99\x2b\x47\xfb\x9f\x4f\x82\x4e\x46\xf5\x5b\xed\x83\x0d\x84" - "\xd4\x8b\xf5\x7e\x1d\x70\xb2\xdb\x2e\x6e\x9c\xbd\xa2\xaf\x35\xc2" - "\x8f\xc7\x69\x46\xfc\x63\xaf\x7a\x3e\xd2\xab\xce\x95\xf8\xde\x67" - "\xba\x2f\xce\x36\x95\x2d\xee\x60\xde\x06\x9c\x8b\x11\xbc\x33\xb0" - "\x7f\x96\x6d\xc1\x3e\xd7\xc6\x8e\x06\x68\x2f\x15\x67\xe5\x67\x62" - "\x01\x33\xf0\x90\x04\xa3\xfd\x1d\xec\xf4\x06\x01\x8b\xb3\xd6\xfd" - "\xc2\x37\xc7\x59\xeb\xaf\x80\x8b\xe8\xb3\xc2\xd3\xf6\x70\x9e\xb6" - "\x5b\x39\x9b\xbd\x87\x9f\xcd\xde\x1d\xf6\x7d\x79\xda\x43\x65\x0f" - "\x51\xd9\x93\x88\x6d\x55\x7e\x86\x1d\x02\x9d\xc4\xbb\x25\x2f\x8e" - "\x64\xc3\x5b\xd2\xd0\x1f\xb7\x37\x99\xc9\xfb\xfa\xa7\x3d\x6e\xdf" - "\x8d\x8c\x78\xcf\x0c\x71\x3f\x54\x9c\xef\x11\x7f\x48\xe5\xdc\xd4" - "\x2f\xb7\x77\x08\x32\x74\x9a\x42\x3c\xa2\x87\x9d\x8e\xa3\xfd\xb6" - "\x1a\xf5\x62\xcc\x7b\x09\x27\x61\xa7\x41\x63\x27\x3e\xa6\xa7\x46" - "\xbd\x1b\xdc\x59\x46\xe9\x80\xc1\xc8\xf9\x3f\x33\x0b\xf3\x48\x30" - "\xfe\xbf\x61\x1c\x38\x23\x7c\x44\x2d\xeb\xe4\x7f\xe3\x25\x03\x75" - "\x72\xbe\xcf\xdc\xa5\xa6\x9d\x0d\xfb\x0b\x38\x73\x3f\xbd\x0f\xd3" - "\x9f\xc2\x4b\x06\x5d\x11\x67\xd3\xf8\x26\x7c\x7a\xc1\xee\xc4\xbe" - "\x85\x5d\x41\xe5\x9f\x96\x67\xd5\x83\xef\x78\x1d\xd9\x51\x54\x26" - "\x88\xfb\xad\x2a\x7c\x5f\x73\x17\x9f\xd1\x6c\x3d\xa8\x4f\x67\x7f" - "\xe0\x7a\x38\xc0\x44\xfc\xfa\xce\x80\xb0\x87\x54\x7d\x44\xe8\x14" - "\x67\x2f\xec\xd5\xe0\x5f\xcd\xb4\x37\x5e\xc6\x7e\x18\x74\x9e\xe9" - "\x0c\xd9\x24\x99\x24\xcf\x08\xbe\x0d\x31\xfd\xb0\x7e\xc0\x03\xa2" - "\x4f\x58\x3f\x54\x77\x1c\xce\xb9\xe5\x3a\x3a\x3b\xfd\xbf\xb7\x8e" - "\xce\x0a\x9c\xa7\x7e\xd7\x73\xbd\x83\xcf\x2f\x65\x19\xc2\x0e\x21" - "\xe0\xc3\xbd\x64\x03\xed\x3d\xc5\x92\x26\x79\xcb\x84\xad\xca\xc6" - "\x5e\xc4\x33\x2e\xda\x37\xc4\x4c\x4a\xa9\xb1\x04\xbc\xfa\xd1\x02" - "\x61\xbf\x61\xa4\x72\xf5\xb0\xef\x80\x8d\xa1\x59\xc4\x8c\xfc\x94" - "\xed\xeb\x67\x86\x4e\x76\xb6\x06\xe7\x49\x61\x58\x9f\xfd\x1a\xe7" - "\x87\xfc\xc9\xfe\x85\x96\x02\xbd\xa8\x43\x19\x38\xbd\x50\x2b\x87" - "\xd8\xe4\x28\xd7\xc1\xce\x7e\x26\xca\x21\xaf\xf0\x25\x12\xb7\x8a" - "\x78\xb5\x3a\xe4\x0f\xd0\x7b\xad\x12\x97\xca\x69\x4f\x09\x6e\x0c" - "\xd4\xd3\xb7\x95\x4a\xe9\xe2\x54\x4a\x4b\x13\xe7\x18\xc3\x56\x9c" - "\x6f\x12\xce\x25\x26\xbb\x3d\x5f\xb9\x44\x7f\x70\x57\x39\x8f\xf6" - "\x5f\x21\xdb\x78\xaf\xa9\x3d\xc5\x0c\xf6\x87\x31\x9f\x5e\xe9\x03" - "\xf8\x0c\x3b\x20\xfb\xe7\x7d\xab\xef\xc9\x60\x7e\x1f\xe1\xab\x4f" - "\x6f\x64\x47\xac\xb0\xb1\xbf\x2f\xee\x88\x75\x88\xe6\xc7\x5b\x4c" - "\xf4\xf2\x80\xe4\xab\xbd\xa1\xb5\x09\x1c\x8d\xb2\xc6\x39\xe8\xfb" - "\x7e\xcd\xa6\x09\x78\x5a\x2a\x7c\xbc\x9f\x2d\x00\xdc\x08\xb7\x17" - "\x1c\x5d\x1b\xf6\xb1\xdc\x27\xef\xf5\xc5\x51\x99\xd0\xfd\xdf\xe0" - "\x80\xd2\x42\xfd\x80\x2f\x9a\xfc\xe0\x46\xe5\x38\xce\xdf\xef\xe9" - "\x57\x38\xee\x3c\xe0\xfe\x0a\x64\xa7\xe5\xf9\xbc\x0f\xb2\x20\xee" - "\x8a\xe1\xec\x1d\x77\xe9\xc3\xeb\xe4\xeb\xd9\xda\x9d\x7a\xac\x11" - "\xf4\x01\xf7\xc1\xca\x7f\x26\xd6\x29\x6c\x60\x4d\xe2\xfc\x21\xea" - "\x91\x53\xf7\xf8\xa8\xce\x33\xe2\xdc\xac\xaf\x56\xad\x07\x3e\xb3" - "\xa8\x8e\x6c\xad\x0e\x05\xf6\xc3\x39\xc2\x7e\xcf\x23\xcb\x4b\x5b" - "\xa3\x7b\x7c\x8a\xb8\xc7\x83\xf2\xd2\x06\xe8\xeb\x9a\x90\x0d\xaa" - "\xb8\x5b\xf3\xf5\x21\xcd\xc6\x8c\x9e\x43\xf7\xbf\x00\xd3\xbe\xd2" - "\x5b\xd2\x7c\x44\x1f\x7c\xa5\x8b\xaa\xe9\x1b\xd1\xff\x53\x6d\x17" - "\xd4\x87\xc0\x8f\xc2\x06\xa6\x57\xcc\xc6\x06\xf8\xc8\x80\xb5\xbd" - "\xb4\x7b\x3f\x77\xb3\xea\x2f\x23\xea\x0c\xfb\xfa\xeb\xf0\x39\x7c" - "\x50\xd5\x21\x9f\x5b\x25\x65\x98\x73\xab\x84\x0e\xb9\xfc\x96\x94" - "\x97\xb6\xf8\xf5\xf5\x5b\x3c\x7a\x69\x8f\x77\x8e\x78\x91\xa1\xe2" - "\xb0\x2d\xe8\xb9\x38\xd4\x35\x36\xcf\x69\xae\x93\x75\xf6\x09\xff" - "\x21\x61\x9d\x40\x9f\xb8\xff\x84\x33\x73\x05\xfc\xa3\x79\x6a\x2a" - "\x6c\xa4\xdc\xf6\x73\xd0\x25\x4f\x90\xfa\x09\x99\x47\xb5\xf3\x9c" - "\xd2\x33\xf2\x3d\x1e\xef\x12\x66\xe7\x3c\xda\xb9\x54\xb9\x5e\x41" - "\xfc\x41\xee\xa8\x23\x7a\x69\xf7\x09\x3f\x0d\x6e\xe2\x47\xa9\x0d" - "\x6e\xcf\xc1\x5d\xca\xbe\x4b\xe1\xbf\x41\xae\xcd\xbe\x27\x44\x9f" - "\x9c\xb7\x71\x07\x64\x32\x2f\x62\x1d\x9d\x63\x94\x6f\x32\xe5\xbb" - "\xbd\xa9\xa0\x17\x36\x66\x05\x88\x63\xdb\xa9\xb6\xed\x8d\x35\xd7" - "\x5d\x65\x62\x19\x83\xce\xbe\x95\x1e\xd6\x54\x73\xf1\x74\xa3\x6f" - "\xe5\x85\xf8\x73\xc9\x2f\xa6\xb0\xf1\x64\x7c\xe8\x70\xae\xa7\xf6" - "\xef\xe6\xe8\xbf\xef\xf6\x80\xde\xcf\x86\xf5\x13\xf9\x75\x45\xf9" - "\x2c\xe0\x9c\xc8\x83\x5b\x68\xbe\xfa\xac\x24\x03\xb6\xb0\x56\x69" - "\x77\x03\xdb\x01\x4b\xa1\x8f\x9f\x73\x07\x1a\x70\x86\xe0\xa5\xb9" - "\x22\xba\xe5\xfb\xae\x3b\xf0\x16\x83\x7d\x37\xe8\x4d\x07\xf3\xcd" - "\x41\xbf\xae\xb7\x17\xb1\x79\x67\xf0\xbd\xaf\x53\xee\xf9\xbe\x14" - "\xf5\x37\x0e\xfe\x81\x23\xfb\xf4\x2f\x1b\xd6\x3d\x04\x27\xd3\xf3" - "\x96\x65\x6d\xcc\x5a\x6b\x5b\x01\x17\xd4\xa3\xed\x46\xc3\x71\x0e" - "\xfb\x4d\xd8\x5f\xc1\xbf\x23\xde\xe1\x85\x62\x1d\x6a\x71\x0e\x69" - "\xcd\xcd\x86\xce\xfb\x7f\x33\xd6\xa1\xc6\x9f\x23\xce\x61\xf8\xfc" - "\xa7\xbf\x25\xb4\x06\x94\x77\x06\xf1\x2e\xf6\x74\xa7\x6f\x19\xd6" - "\x91\xdc\x5f\xfa\x97\x44\xfa\x2a\x92\xfc\x59\x62\x32\xa5\xaf\xd2" - "\xee\xbc\x12\x2e\x9a\xe8\x7d\x6d\xf8\x8e\x4d\x7f\x3e\xcd\x77\xa3" - "\x5c\xbf\x22\x6f\x89\x66\x27\xa1\xc6\xb4\x17\x76\x1d\xca\x8e\x9b" - "\x0b\xa4\x6e\xb2\xbf\xac\x56\x99\x68\x94\xe7\x62\xfd\x0d\xda\x1d" - "\x2e\xb9\x36\xdf\x51\xd7\x66\x7f\xcb\x85\x6c\x59\xc2\x6b\x63\xc0" - "\x18\x5e\xd7\x7f\x53\xcb\x0e\x18\xbf\xcd\x0e\x46\x95\x11\x2f\xed" - "\x61\xfe\x19\xd0\x57\xca\x3b\xdb\x7e\xe1\x5f\x48\xfa\xe3\x18\x3c" - "\xa1\x3e\x53\x1b\x83\x1f\xaa\xcf\xd3\xe8\xf9\x35\xf5\x99\xf8\xc5" - "\xc1\x5d\xea\x33\xad\xd9\xc1\x6d\xea\x73\x02\x3d\xaf\x51\x9f\x69" - "\xef\x18\xfc\x81\xfa\x9c\x48\xcf\xdf\x55\x9f\x2f\xa7\xe7\x59\xea" - "\x33\xad\xc1\x41\x71\x66\x40\x7d\x37\x52\xdf\xfb\x2f\x5e\x66\x1d" - "\x70\xc9\x73\xeb\x41\x46\xfc\x60\x95\xdc\x7b\x42\x69\x09\x84\xd3" - "\x99\x1a\x7c\x29\xbd\x11\xed\x50\xfa\x5c\x0f\xf3\xb4\x45\xa4\xab" - "\xfe\xdb\x06\x97\x78\xd8\xd7\x9e\x88\xf4\x1a\x35\x7d\x15\xc9\xdc" - "\xbe\x88\xf4\x4a\x35\x3d\x8f\xe8\x62\x76\x44\x7a\xb1\x9a\x5e\xea" - "\x61\xff\x65\x88\x48\xcf\x57\xd3\xf7\x6b\x36\x3c\x6a\xfa\x5a\x35" - "\xfd\xb0\x87\x7d\xda\x10\x91\x9e\xa1\xa6\x13\xfd\xef\x6f\x8f\x48" - "\x17\x74\x45\xfa\x64\xb7\xf0\x23\x05\x58\x5b\x83\x7e\x0f\x6b\xdf" - "\x1f\x91\x67\xa9\x2c\xeb\x27\x7e\xf1\x2f\x2d\x11\xe9\x8b\xd5\xf4" - "\x24\x8f\xee\x3b\x91\x75\x26\x8f\x47\xab\x74\xd5\x2c\x63\x3c\xbd" - "\x3e\x64\x20\x61\xcb\x2c\xf8\xec\xf3\x59\xb8\x13\x66\xd9\xcb\x3b" - "\x6c\x85\x9c\x77\xb0\xf3\xcb\x54\xdb\xdd\x7c\xd8\x51\xca\xfb\x75" - "\xe7\x17\xa8\xbe\x15\xbc\xe2\xce\xdd\x16\xa4\xf9\xdf\x14\xfa\x99" - "\xfc\x22\xe9\x2f\x5c\x8b\x3d\x03\xfd\x96\x7a\xf6\x4f\x79\xe0\x2b" - "\x16\xb6\xe0\xbd\xd0\x81\xbb\xf3\x86\xa4\x2f\x79\x92\x83\x91\x06" - "\x3d\x0f\xe0\x11\xa9\xcf\x92\x74\xff\x7c\x96\x32\x84\x7b\xad\x52" - "\x17\x86\xb5\x88\xfc\xb0\x57\x8b\xcc\xeb\x61\xe7\x85\x5f\x8a\x28" - "\xeb\xe4\x3f\x0f\x3a\xcf\x2f\x09\xdf\x27\xf2\xd7\xa8\xe9\x9f\x51" - "\xfa\xaa\x88\xf4\x92\x71\x69\x3b\xd1\x41\x6e\xec\x2f\x1a\x1e\xe0" - "\xbe\xc0\x00\xf7\x97\xff\x95\xfa\xfd\xb0\xb0\x11\xbc\x22\x58\xd2" - "\x5f\x89\xfb\x36\x88\x11\x1b\xd8\xc8\xbd\xb0\x89\xa4\xf4\x4b\xee" - "\xf1\x79\x89\xc7\x18\xe4\x65\x0f\xc2\xfe\xb5\x9f\xe1\x6c\xd6\xd1" - "\x8b\x78\x83\x16\x8e\x7b\xdc\x5b\x4f\x33\x13\xee\xe3\xd4\x3e\x8c" - "\xef\x5f\xb2\xbb\xb3\xbd\xec\x68\x76\x90\xd5\x52\xdd\x7b\x1f\xd4" - "\xf8\x8b\xf3\x81\xd0\x5d\x61\xea\x03\xda\x73\x88\x98\xd8\x43\xc2" - "\x57\xb9\x65\x1b\x6c\x0a\xee\x5b\xc8\xdf\x03\x6f\xbc\x28\xc3\xb2" - "\x8d\xd9\x68\x6f\x5f\x48\xcf\xa9\xf2\xef\x3e\x3c\x8f\x39\xd7\x2a" - "\x6d\xa7\xb5\x3c\x94\x27\x68\x4d\xc9\x00\x93\xf4\x62\x28\x8f\xbf" - "\x88\xfb\x27\x43\xf9\x44\x6f\x16\x12\x1f\xbe\x70\xac\xf2\x5b\xf7" - "\x32\xfd\x70\x39\xf1\x26\x67\x1a\xf5\x92\x3e\x0d\x67\x2a\x7a\xe3" - "\x36\xe8\xda\x45\x3c\xdc\x72\x63\xd3\xa1\x75\x7e\xfd\xd1\x2d\x9d" - "\xec\xb1\xcb\x99\x75\x95\x5f\x4f\x79\x86\x4e\x9a\xf3\xe0\xd3\xfc" - "\x96\x14\xe2\x67\xf5\xaf\xd3\xf7\xb7\xd7\x35\xea\x03\x82\x5f\x19" - "\xce\x14\xfa\xd9\x52\x63\x35\xf6\x10\x77\x7b\x10\xbc\xb8\x89\x78" - "\xf1\x12\xa2\xff\xc6\xe0\xa6\xec\xf8\x40\x6e\xf6\x25\x7b\x73\x98" - "\x29\x98\x9b\x94\xf0\xec\x00\x5b\xa8\xed\x3f\x7b\x37\xd2\x9e\x32" - "\x68\x9d\x54\x41\x7b\x0a\xf4\x3e\x66\x5d\x9c\x38\x87\xc6\xb3\xa2" - "\xff\x6b\x5c\xed\xc6\x0b\xc7\xf6\x0e\x6e\x4a\x12\xfe\x26\xd0\x97" - "\xb1\xc6\x5a\xba\x9b\x19\x82\xea\xbd\xd4\xc2\x93\x2c\x91\xf8\x67" - "\xbd\xb9\x9f\xbb\x7a\xd6\x32\x3d\xe2\x21\x17\x66\x09\xdd\x6a\xf4" - "\xd1\xec\x00\x73\xe7\x7f\xc1\x0a\x73\x30\x47\xc3\x6f\x82\x4f\x83" - "\x3d\x33\xe5\x8f\xeb\x61\xc3\x1f\x5a\xfc\xb4\x67\xf8\x89\x27\xff" - "\x19\xe4\xe2\xe1\x2f\xa5\x7f\x8b\x80\x0d\xf7\x48\x5d\x39\xdf\x47" - "\xda\x79\xc7\x49\x61\x37\x54\x20\xd7\xd6\xf0\x31\xbc\x3b\x70\x4f" - "\xd6\x1c\xdb\xf4\xca\x90\x3f\x5a\xea\xef\x86\x3f\x53\xf7\x87\x64" - "\x29\xdb\x0d\x1f\x1b\x0f\x77\x95\x92\xf3\x90\x5d\x66\xba\x6b\xc0" - "\xbf\x72\x8f\x38\xe3\x87\xcf\x80\xfc\xdb\x5c\x9c\xc8\x9d\xf4\x65" - "\x14\xd8\xa5\x3c\x71\xbe\x4e\xfa\x90\x0c\xc8\xbb\xf9\xd0\xf7\x3f" - "\x71\xbe\x5e\x9c\x6f\x3c\x71\x5e\xea\xfb\x9f\x38\xdf\xb6\x7d\x2a" - "\xee\x13\x04\xaa\xfb\x62\xce\x13\xdf\x16\x58\xdb\x67\x8e\x1f\x33" - "\x3e\x9f\xd8\x8f\x4a\x06\xda\x6c\x57\xb0\x04\x9c\x33\xa5\x07\xa5" - "\x2f\x56\xb9\x86\x83\x35\xfc\x09\xf1\x6d\x66\x87\x9d\x45\x49\x7f" - "\xc7\x81\x53\xf3\x6b\x98\x8d\xfa\x1a\xcb\x8d\xe7\x8b\x84\xdd\x63" - "\xc9\xf9\x4a\x77\x2f\xe2\x54\x05\x99\x3c\x0f\x0c\x1e\xe0\x31\xe7" - "\x8b\x64\xfe\xe0\x77\x5b\x7b\x69\x0c\xc6\xf3\xa9\x6e\xff\x69\x95" - "\x27\x0c\x2e\xa4\x3e\xa6\xf2\x92\xf3\x19\xf2\xbe\x79\xf0\x09\x8d" - "\xae\x4a\x1c\x0d\x6e\x55\x71\xbd\x4d\xc2\x2d\x78\x40\xdd\xaf\x66" - "\xe2\x99\xf6\xee\x64\x69\xbf\x12\xcc\xd3\x78\x64\x8f\x9a\x07\x65" - "\xe8\x59\xf5\xf3\x19\xac\xa2\xb1\xcf\x55\xbf\x2f\x44\x1a\x8d\x8f" - "\xf6\xac\x40\x1b\xc6\x35\x1e\x6d\x15\xb0\x28\x60\x51\xd4\x67\xf8" - "\xc0\xc3\x1d\x01\x9f\xdb\x77\x9b\xcb\x2d\xe6\x80\xdf\x00\xdb\x7e" - "\xb4\x03\x7f\x43\xa0\x9b\x54\xa7\x01\xf5\x85\xfb\xaf\x5c\xaa\xf5" - "\x05\xed\xe1\x1b\x8d\x35\x55\xc8\xd5\x34\x66\xe4\xc1\xbc\x76\xd9" - "\xa1\xf7\xeb\x27\x98\xc1\x86\x8e\xa7\x00\x26\x12\x66\x7c\xba\x2a" - "\xd3\xab\xf3\xc0\x27\x8f\x84\x87\x7c\x57\x8c\x44\x1b\x72\x60\x4b" - "\xc5\x53\x54\xf8\xa9\x31\x56\x14\xe1\x8b\x56\x7e\x53\x7e\x19\x51" - "\x76\x46\x28\x2f\xf5\x1b\xbc\x11\xec\x12\x70\x4e\x25\xf1\x55\x69" - "\x8b\x28\xd7\x96\xfe\x35\xf1\xc8\xc4\x43\x6e\xdf\x29\x62\x56\x12" - "\x6f\xa5\x74\x86\xe1\x2d\xeb\x19\xa3\x8d\x2b\xb4\x36\x3c\x4c\xd9" - "\xaf\xf5\x93\x9e\xd5\x3d\x98\x27\x85\xe7\x44\x59\xaa\x95\x83\x4e" - "\x87\xe6\xc8\x87\xf8\xb1\xe3\xc4\xc5\xd0\xb9\x09\x2a\xad\x81\xdb" - "\x5c\x02\x1f\x19\xaf\x83\xee\x92\xe0\x6a\x97\x38\xc4\x8b\xe5\x5e" - "\xc8\xeb\x50\x27\xce\x1a\xa5\xbf\x51\x5e\x4d\xf5\xaa\x77\x96\xf8" - "\x21\xb5\x0f\x24\xff\x05\xf6\x8f\x96\xeb\xbe\xbf\x3a\xd3\x96\x7a" - "\x83\xb8\x73\x3b\x6f\x83\x1d\xd7\x69\x33\xc3\x2f\x23\x79\xee\xb8" - "\xb0\x8f\x33\xc4\xa2\x56\x7d\x9c\x95\x9a\x9b\x04\xfc\x75\x6c\x09" - "\x1f\xe0\x55\xb8\x3b\xc2\x37\xf2\xea\x72\x9a\x43\x47\x3f\xbb\x0c" - "\x71\xb1\x0b\xed\xfc\x2b\xf8\xbf\x23\x7a\x89\xb8\xee\xdd\x85\xfd" - "\x6c\x22\xec\x92\x40\x7f\x60\xf7\xcc\x63\x29\xbd\xcc\xd8\x1d\xba" - "\x87\xa7\x33\x2c\xc6\xdd\x51\xee\x48\x23\x5e\xda\x18\x00\x3e\xc0" - "\x46\xbd\x4b\x67\x98\x4e\xf9\x70\xaf\x34\xaf\x4c\xe8\x12\x62\x52" - "\x82\x26\x73\x8d\xe3\x34\x9b\x20\x62\x1c\xe6\xfb\xa1\x53\xd3\x77" - "\xe8\xd8\x2f\x79\x6c\x4c\x0a\xa5\x9b\x45\xba\x9f\xda\x2e\x8b\x49" - "\xa1\x6f\x66\xfa\x76\x82\x7e\x15\xaa\x23\xbf\x9c\xfa\x5d\x78\x9a" - "\x5d\x41\x7d\xe9\xe6\xa5\x31\x29\xd4\xcf\x2e\xc7\xa3\x2c\xb1\xd5" - "\xde\x0d\xf9\x8e\xea\xf3\xc8\xd8\x8d\x54\xb6\x43\xa7\xbb\x99\xc6" - "\x95\x0f\x9d\x08\xfd\x16\x94\xd1\x6f\x61\x90\x99\x0b\xb7\xd2\xbe" - "\xb7\x95\xda\xc7\xbd\x56\xaa\x07\x3e\x48\x64\x5f\x68\x6c\xd0\xab" - "\x51\xbd\x5b\x7b\x79\x17\xd5\xdd\x7d\xb4\x97\xea\xcb\x6f\x0f\xd5" - "\xa9\xf2\xd4\x33\x69\xbc\x97\xf2\xf2\x29\x46\xea\x53\x35\x6c\xb7" - "\x29\x2d\x8e\xd2\xe2\x42\xfc\xb0\xce\x30\x59\x7d\x8e\x09\xe5\x75" - "\xa4\xb1\xc2\xf3\x4c\xd8\x50\xdb\x36\x45\xb1\x0e\x5d\x54\x1d\xfc" - "\x60\x85\xeb\xd4\xcf\x40\x7d\xa5\x54\x9f\x23\x8b\xc5\x10\xad\x36" - "\x52\x1f\x11\x23\xfa\x84\x80\x13\xd6\x98\x4e\x3f\x9d\xc6\x52\x89" - "\x31\x29\x34\x77\x65\xb4\x1e\x68\x3c\x3a\x1a\x4f\xcc\xd6\x60\xe8" - "\xae\x2e\xc6\x34\x19\xf2\x1c\xc6\x25\xe7\x31\x66\x15\x8d\x2b\x73" - "\x6b\x36\x3f\x41\x63\xeb\x3e\x9a\xdd\xce\x68\xef\xb1\xb4\xda\xdb" - "\x70\x87\xe2\x84\x84\x5b\x37\x6c\x50\x49\xde\x8f\xc9\x0c\xf9\xea" - "\xd5\x45\xed\xa2\xbe\xc7\x51\xbf\x4a\xd5\x71\x22\xad\x2a\xc4\xd3" - "\xeb\xa2\x9e\x53\x9f\x27\x85\xf2\x7e\x73\x9c\xc6\x88\x71\x52\x79" - "\xc3\xad\xa8\x4f\x1d\xe7\x24\x1a\x67\xcc\x37\xc7\x49\xf8\xb4\x91" - "\x17\xab\xe3\x2c\x51\xc7\xa9\xa7\x71\x4e\xa2\x71\x4e\x8d\x18\x67" - "\xfc\xa8\x71\x66\xd0\x38\xb3\x69\x9c\x1d\x11\xe3\x8c\x1b\x63\x9c" - "\x19\x1e\xb4\x51\x16\x93\x2d\xfd\x83\xf1\x46\x71\xff\x7d\x47\x54" - "\xe8\xfe\xbb\x82\x7b\x97\x03\xc2\x07\x51\x03\xf4\x37\xd0\x1b\x41" - "\xd6\xc3\x1d\xcf\xf4\xcd\x25\x45\x42\x77\x93\x28\x75\xd3\x82\xbf" - "\xda\x11\xb5\x2a\x74\x77\x63\xa7\x88\x5d\xe3\x43\xba\xf0\x19\x90" - "\xc3\x84\xee\x71\xf9\xe6\x4d\x0e\x94\x47\x59\xca\x5f\x1a\xba\x63" - "\xa6\xd3\xdb\xa5\x2e\x7e\x4a\x1c\x9e\xe1\x0b\x4b\x9e\x09\xf0\x66" - "\x71\x26\xb0\x23\x2a\x1c\xff\x69\x23\x6f\x02\x5c\xc4\x7d\x56\x71" - "\x1f\x94\x95\xa4\x07\x4a\xb4\x7b\xe9\xbd\x94\xb7\x33\xe2\x5e\x7a" - "\xaf\xe8\xc3\x90\xf0\xfd\xb0\x69\x79\x60\x93\xb8\x9f\x3e\xb8\xc3" - "\x60\x0c\xb7\xad\x2b\x51\xdb\x36\xe2\xd9\x2b\x7d\xb3\x41\xc7\x66" - "\x13\xf6\x36\x3b\x0c\x0b\x34\x1b\x17\x8f\x8e\xd9\xb1\x96\xc7\x8c" - "\xf3\xb2\xc3\xb0\x6a\x84\x2f\x28\x5d\x34\xfc\xbc\x23\x3d\x2f\x74" - "\xd7\x7c\x87\xa1\xe8\xdb\xee\x9a\x3b\xbc\x34\x4f\xb4\xde\xec\x88" - "\x79\xae\x33\x90\x8c\x6b\xae\x11\xb1\x52\x74\xd1\x33\xd0\xcf\x0e" - "\x9d\x01\xfb\x87\x45\x9c\x07\xe9\x0c\x5f\xaa\xb4\xd9\xbb\x3c\x18" - "\xb0\x78\xa8\x4d\xe1\x5b\x2a\xf4\x6e\x38\x06\x5f\x19\x54\x36\x56" - "\xf8\x39\xa7\xfa\x46\xe6\x17\xdf\x8b\x46\xbd\xa7\x8c\x7a\xb7\xf9" - "\x88\x66\x8d\x67\xcb\x53\x36\x55\xe8\x78\xab\xcd\xdb\x98\xdd\x71" - "\x8a\x45\x11\x2e\x9e\x44\xdf\x5a\xbb\xc5\x3d\x3f\x0b\x77\x26\x33" - "\x77\x77\x40\xf2\xed\xc4\x2f\x75\xcc\xa6\x3c\xa7\x58\x22\xee\x99" - "\x20\x96\x0c\xe5\xef\x11\xf1\x63\x74\x13\xde\x58\xb5\x61\x12\x53" - "\x7e\x9a\x76\x09\xd7\x6f\xa9\x87\x2d\xc1\xcb\x43\x1e\xc4\x60\xd1" - "\x15\xee\x62\xd3\x41\xa7\x08\x87\x3b\xb9\xfe\xb1\x7a\x2a\xd3\xfb" - "\xd2\x50\x77\xb4\x3b\xf0\x05\xb3\x13\xfd\xec\xd1\x4d\x38\x60\x28" - "\x60\x86\x8a\x2e\x16\x47\x78\x16\x38\x12\x58\xc8\x34\x5f\x0f\x35" - "\xf1\xd2\x87\x40\x0d\xe1\x64\xae\x95\xfb\x07\x77\x4c\x30\x90\x5c" - "\x5b\xa4\xe9\x2f\x4a\xa5\xaf\x37\x03\xb5\xff\x73\xe1\x97\x42\xf2" - "\x07\x04\xdb\x09\xb7\xcb\x7b\xa6\x09\x3f\xa5\x32\x0b\x43\xb2\x8d" - "\x6e\x42\x93\xe4\x17\xcd\x52\x17\x4d\xef\x47\x48\x3a\x2a\x96\x36" - "\x51\x09\x94\x37\x33\x64\x13\x05\x9d\x20\x7d\xa7\x39\x74\x09\xb9" - "\xc7\x64\x76\xa5\x07\x8d\xea\x1a\xa7\x74\xda\xb7\x51\x96\xca\x59" - "\x44\x9c\xcb\x1d\x13\xea\xc2\xb8\x36\x01\xf6\xcd\x3a\x1a\x93\x89" - "\xe6\xf5\x38\xc6\x05\x98\xf8\xe0\xd7\x4d\x17\xed\x39\xb2\x7f\x9c" - "\x38\x48\xc6\x01\x16\x10\xfa\xa5\x5b\x16\x12\x3e\x9d\xa6\x39\x98" - "\x02\xdf\x56\x6e\x6a\xe7\x68\xed\x10\x3b\x6a\xed\x63\xad\xf4\x8c" - "\xbb\x0f\xae\x9f\xfd\x9d\x75\xda\xc6\xde\xcb\x89\x1f\x20\xbc\xe8" - "\xaf\x44\x5d\xa0\x35\xb0\x17\x85\x0f\xc2\x56\x2f\xd5\xd5\xc9\x44" - "\x1d\x47\x95\x6e\x76\x34\x1f\x32\xec\x7d\x0b\x5b\x6b\xbf\x60\xad" - "\xd6\x3f\x89\x76\xc0\x6f\xbb\x72\xfa\x2e\x54\x77\x1d\xd5\x5d\xaf" - "\xd6\xdd\x4b\x75\x27\x8c\x5f\xf7\xa2\x8c\x8b\xac\xfb\x22\xfa\xbd" - "\x28\xf5\x62\xea\x76\x54\xf3\x20\xd1\xe1\x58\xda\xe3\x4b\xe0\x9f" - "\x15\x77\x5c\x83\x03\xf0\x49\x33\x53\xc8\xea\x5d\x3a\xe3\x5e\xd0" - "\x1b\x61\x1f\x52\x66\x2c\x16\xf7\x5f\xa1\x67\x57\xef\xbd\xba\x03" - "\x27\x19\xf4\xee\x83\x3b\x8c\x25\x61\xbf\x55\xa1\xb3\x71\xa2\x7d" - "\xc6\x43\xc2\xd6\xba\xd4\x58\x2c\x71\xcb\xb8\x1a\x75\x8d\xad\x23" - "\x8d\x69\x10\x36\xfb\x3a\xe3\x49\x4d\xbf\xd5\x17\x1b\xd3\xa0\xd6" - "\x65\x1b\xad\x37\x55\x1d\x09\xd9\xb2\xf2\xf3\x6c\x9b\x72\xd6\xe4" - "\x65\x69\x17\xb4\x27\xb1\x15\x59\x0f\x65\xad\xd9\x98\x95\x69\x5b" - "\xb9\x21\x67\xdd\xbc\xf5\x0f\x3f\x6c\xbb\x3b\x2b\x37\x77\xf5\x4f" - "\xb3\x26\xb1\x95\x39\xab\xd7\xe5\xae\x81\x6e\xd3\x66\x5b\x72\x53" - "\x7a\xf6\xfa\xbc\x79\xdf\x5b\x92\x3c\x4a\xb7\x89\xfb\xda\xc7\x21" - "\xe3\xd0\xfe\x94\x48\x3c\xc6\x64\xf8\x25\xb2\x6c\xe6\xae\xc7\x48" - "\xbe\x26\x1c\xec\xc1\x5e\x88\xfd\x07\xb2\x17\xfc\x1b\xc3\x67\xf2" - "\x9e\x9d\xbc\xad\x4b\x37\x6d\x2f\xf1\xed\xed\x94\x06\xff\xc4\xc7" - "\xf9\x90\xc3\x2b\xce\xb3\x75\xd3\x36\x53\x9e\xa6\xa7\x28\xcd\x1b" - "\x6b\x76\x55\xfc\x95\x19\x24\x8f\x11\xe3\xe7\xfa\x89\xbc\x14\xbe" - "\x86\xff\x6e\x65\xaa\x8f\x74\xbd\xdb\xe3\x87\x0d\x91\x71\x79\xc0" - "\xc1\x41\x53\xe5\xfa\x8a\x39\x2f\x69\xdd\xf9\x3a\x71\x97\x41\x37" - "\xed\xc7\x90\x11\xb7\x23\xee\xe2\x8e\x49\x44\xff\x87\xed\x61\x5a" - "\x3d\x45\xe3\xcd\xdb\x09\xee\x9b\x3a\xe8\x5d\xf8\x5a\x99\x30\x69" - "\xc1\x08\xfb\x30\x9d\x29\x81\xe9\x2e\x2b\x90\x7f\x54\x46\x77\x59" - "\x89\xfc\xc3\x73\xe4\xdf\xb4\xc5\xf2\x6f\x74\xfa\xff\xf4\x4f\x6b" - "\xff\xbf\x5d\x87\xff\x5b\xfe\xfe\x89\xf6\xc5\xb8\xff\x3f\x8e\xff" - "\x7f\x52\x9e\x16\xc3\x05\xfe\x80\x6f\x84\x5b\xc7\x9f\xfa\x2b\x33" - "\x12\x7e\x56\x95\x3d\x48\x38\xfd\x25\xb3\x16\x04\x78\xa7\xe3\x7e" - "\x36\xbd\xf0\x14\xf1\x60\xc4\x6b\xe5\xe5\xf3\xce\xc2\x01\x7e\x82" - "\xf0\xe6\x13\xc2\xdf\xc6\xf2\x0e\x66\x2a\xeb\x20\x3e\x2b\x4f\xc6" - "\x9e\xc1\x79\x13\xee\x79\xb9\xe9\xbd\x65\xa3\x9f\x7d\xec\xfd\x1a" - "\x36\x95\xae\xd6\x0c\xa2\x3d\xc7\x19\x03\xfe\x9a\x32\x58\x42\x4d" - "\x22\x3f\xcc\x9d\xaf\x64\x72\xfd\x2b\x2b\x29\xed\xd8\xab\x4a\x4a" - "\xf4\xab\x5b\x9a\xa3\x6d\x0f\x62\x9f\x37\xbd\xa9\xe2\xe6\xed\xe2" - "\x1e\x23\xfd\x02\x07\x55\x1f\xd3\xb4\x3f\x4d\x79\x4b\xee\xe9\x53" - "\xca\x54\x7d\x1e\x9e\xc5\xfd\x0d\x1a\x47\x23\x77\x6e\xa9\x47\x9d" - "\xaf\x28\x8d\xd1\xd8\x33\x5f\xdd\x92\x12\x5d\xb0\x9a\xe9\x5b\x3d" - "\x3d\xec\x08\xd1\x42\x9c\x8f\xd3\xba\x3b\x44\xeb\xac\x7e\x6f\x22" - "\xaf\xa4\xfe\x95\x12\x3f\x57\x42\x7d\x3a\x30\xb8\x23\x36\xc9\xa3" - "\x9b\x68\x55\x79\x39\x17\xad\x8b\x43\x65\x94\x67\xf9\x06\x36\xb3" - "\x8c\xf2\x11\x6f\x57\x02\x19\x45\xf6\x6f\xf2\x2c\x82\x41\x03\xb5" - "\xd9\x66\x7b\x00\xef\x66\xc1\x63\xa0\x6d\x1a\x87\xad\x43\x67\x16" - "\x32\x3f\xda\xd0\xda\xa5\xfa\x4b\xa8\xfe\x36\xf5\x8c\xb1\x52\xd6" - "\x13\xdb\x20\xe9\x58\x8c\x09\x31\x44\xe5\x3d\xb1\x18\x53\xd9\x16" - "\xda\xd7\x87\x18\xfc\xe0\x56\x51\x1b\x2e\xcb\x36\xc6\x2d\xb8\x63" - "\x7c\x3c\x40\x72\x8d\x22\xed\x77\x75\xe6\x5d\xb2\xac\xe4\x43\x04" - "\xef\x11\x24\xfe\x5e\xe8\x67\x88\xff\xc8\x26\x3a\x41\x3c\x87\xb8" - "\x9f\x41\xfc\x06\xd2\xa9\x8d\x2a\x1a\x57\x1b\xc9\xcd\x0d\xb4\x77" - "\xd7\x83\x57\x78\xa0\xff\xdf\x18\xce\x38\xc0\x2f\xe4\xe6\x73\xbf" - "\x88\x2b\xb5\xc3\xbc\x40\xe3\x17\x80\x1f\xe0\x11\xca\x1e\x60\x86" - "\x61\x9a\x63\xc2\x91\x66\xe2\x3f\x88\xa7\x37\xdb\xd5\xb9\x69\x16" - "\x7c\x81\x1a\x47\x5a\xd2\x70\xf3\x56\xda\xdf\x4d\xd4\x46\xb3\x47" - "\x37\x4d\xc0\x42\xd2\x20\x73\xa9\xb6\xd7\x43\xe7\xe0\xa1\x3a\x38" - "\xd1\x3a\x82\x5b\xc3\xdc\x0c\x1d\xf3\xe8\x62\x8f\xd1\x5c\x34\x20" - "\x2f\x95\x37\x50\xfe\xc3\xb4\xef\x2f\x56\xe7\xe4\x38\xc9\x04\xc4" - "\x07\x98\x97\xa0\x1f\x54\xa6\x85\x60\x4d\x6d\xc5\xf9\x54\x3a\x76" - "\x4c\xf2\x30\x71\x5f\x6a\xb0\xa7\xb9\x2e\x0e\xc3\xdf\x62\x8c\x84" - "\x3f\xc1\x42\xca\xe5\xba\xb8\x27\x22\xe6\x8e\xe4\xd2\xb8\x0c\xe8" - "\xa1\xa9\xbd\xc3\x42\x87\xa6\xb3\xdc\x0e\xdf\x6f\x84\x33\x87\x09" - "\x16\x87\x29\x5f\x23\x68\xf3\xf6\xbf\x12\xcd\x7d\x10\x3c\x54\xdc" - "\x5d\x92\x47\xb5\x74\x03\x87\xbb\x74\x96\x4f\xf0\xde\xa9\x33\x2f" - "\x45\x7d\xf4\xfe\x26\xfd\x12\x2f\x6b\x79\xcd\x51\x83\xf8\xc6\x31" - "\xf0\xc9\x37\x49\x9d\xeb\x34\xea\x57\x9d\x76\x07\x0a\x38\x80\xb9" - "\xa7\x31\x0a\xfd\x83\x47\x67\xa9\x83\xae\x51\x94\x1b\xce\x46\x1f" - "\x8f\x63\x7d\x6a\xdf\x29\xbd\x1b\x3e\x73\x23\x60\xb3\x54\x9d\x93" - "\x46\x11\x2b\x54\x17\x77\xbb\xec\x5b\xdc\x74\x7a\x37\x52\x1f\xc4" - "\x39\x44\xdf\x70\x76\x54\x05\xca\x14\x86\xcb\x60\xfd\x10\x2e\x5b" - "\xa8\xcc\x77\xe9\x97\x6b\x79\xe1\x37\x9f\xfa\xe1\x7a\x16\xbe\xcb" - "\x74\x96\xf6\xbe\xe1\x24\x3d\xb5\xeb\xa7\x76\xf5\xc0\x0d\xe0\x85" - "\x56\x47\x85\x84\xd1\x21\x9a\x3f\x81\x5f\x47\x02\x8d\x04\xf7\x38" - "\xe2\xff\xfd\x69\x92\xbf\xb3\xb8\xd4\xfe\xb9\xc4\xf9\xe0\x04\xa3" - "\xb7\x56\xfa\x19\x42\xbe\x50\xfc\xd7\x30\x9f\x69\x81\x9f\x21\x23" - "\xd5\xd5\xa2\xe2\x84\x85\xf2\xb5\x85\x70\x08\xfe\x0e\x74\x71\xa9" - "\xe0\x35\xd5\xfe\x03\xf7\xee\x92\xb0\x33\x7b\x81\x03\xc4\xc7\xbb" - "\xe4\x3c\x9b\x97\x82\x57\x95\x78\x38\x39\x41\xab\x43\xf8\x4c\x20" - "\x38\x2b\x54\x87\x86\x2b\x91\xb4\x81\xf2\xa6\x10\x5f\x1a\xc2\x1b" - "\x8d\x16\xc8\x3a\xe3\x37\xab\x7c\xc8\x42\x9a\x1b\xf8\x6b\x77\x09" - "\x3f\x58\x02\x2f\xe3\x97\x1d\xf1\x05\x40\x5f\x8f\x51\xbf\x88\x26" - "\x4c\x3e\xd8\x67\x9e\x62\x0d\xe3\xf6\xe4\x6a\x0d\xb7\x23\xe6\x55" - "\xe0\x76\xb1\xa0\x47\x93\x1b\x3d\xec\x5f\x3b\x35\xdc\xc7\x3a\x57" - "\x68\x5d\x57\x6c\x14\xe7\x03\x16\xe8\x03\xc5\xba\xf7\xf7\x0a\x19" - "\x03\xf3\xd9\x9a\xdf\x29\x7c\xe4\x6f\x57\x98\xb1\xd5\x77\x12\xfa" - "\x91\x1e\xac\x7f\x6d\x8d\x63\x6e\xa8\x2d\x17\xe2\x18\x14\x13\x0d" - "\xc4\x1a\xf4\x51\x9f\xe8\x9b\x11\x3e\xe1\x9a\x56\xa5\xb0\x5c\x9a" - "\xdb\x23\x19\x98\xb7\xf8\x85\xda\x9d\x8b\x0a\x49\x03\x4c\x2a\xbe" - "\x88\x3e\x8e\x82\xab\x45\xc2\x35\x7e\xed\xc8\xf5\x1d\x67\xc2\xfa" - "\x8e\x84\x2b\x60\x0a\xd8\x52\x5e\x1a\xff\xc4\x3c\x0d\xae\x61\x98" - "\x4e\x89\x51\xf1\x51\xa5\xad\xf1\x63\xd2\xd6\x0a\x19\x33\xa2\x71" - "\x3b\xc6\x42\x7b\x0a\xda\x17\xf1\xb0\x54\xd9\xa7\xc9\x0b\x9c\x8a" - "\x0f\x78\x58\x41\x8a\x46\xc7\xa8\x3f\x2b\x81\x4f\x98\x2b\x8d\x76" - "\x40\x57\x26\xfb\x3e\x25\x49\x9b\x0f\xf4\x3b\x92\x26\x50\x9f\x84" - "\xbd\x57\x78\xcc\x53\x7e\x4c\xe5\xe2\x41\xdb\xc2\xfc\xd5\x94\xec" - "\x91\x63\x9f\x92\x8a\xb1\x03\x27\xec\x1b\xa1\x2f\x93\x7b\x99\x47" - "\x67\x3a\x3e\x92\x5e\x99\x3e\x11\x76\x19\x2a\x3f\x06\x7a\x6f\x7f" - "\x40\xe6\xc7\xfe\x46\xf9\x85\x6e\x5e\xdd\x0f\x53\xb0\xff\x51\x5a" - "\xb3\x0a\x83\xe3\x94\xbf\x09\xf7\xb8\xe1\xcb\xe7\x92\xe3\x52\x16" - "\x24\x1a\x7d\x18\xb1\x33\x28\x5f\x49\x2b\xc9\x01\x81\x09\x8c\xd5" - "\xa8\xfc\x26\xe8\x04\xdf\x94\x76\xc9\xa6\x6e\x16\x63\xff\x1e\xff" - "\x7b\x97\x2e\xe1\x71\x5a\x47\x7e\xf8\xcb\xa4\xba\x6d\x5d\xba\xcb" - "\xb2\xa8\xdd\x04\xf5\xd7\x4a\xbf\x77\xd3\xef\xe5\xf4\x7b\x33\xfd" - "\x4e\xa3\xdf\x19\x94\x5f\x51\xf3\x27\xd3\x7b\x34\xa5\xdf\xa4\xfe" - "\x52\x1f\x13\x70\x9e\x9d\xfa\x14\xf8\xca\x07\x90\x9e\xf8\x39\xde" - "\xe9\xf7\x43\x75\xdc\x2d\x72\x6d\x27\x1c\xa4\x7a\xf2\x91\x0f\xfb" - "\x1a\xa5\xd9\x29\x4f\x19\xea\x86\x5f\x05\x7a\xbe\x3d\x82\x3f\xa5" - "\x7a\x2e\x7d\x94\x7e\x17\xd0\xef\x0d\xf4\x9b\x47\xe5\xe1\xcf\x33" - "\x95\x60\xd0\x16\xa6\x17\xe6\xa5\x99\xf9\x72\x3e\x69\x0e\x9b\xb0" - "\xde\x35\x7a\x00\x7c\x1a\x91\x6f\x95\xcc\x27\xe5\xd7\x4b\x67\x6b" - "\x73\x17\x10\x73\x67\x69\x0f\xd0\xdc\x51\xfd\xb7\xa3\x3c\xfd\xde" - "\xa1\xfe\xa6\xa8\xbf\x77\xaa\xbf\xff\xaa\xfe\x2e\x51\x7f\x97\x7a" - "\x74\x09\x3e\x95\x37\x21\x98\x25\x08\x3d\x39\xad\x5d\xb5\xdd\xc4" - "\x24\xc8\xd7\x44\xff\x6f\x46\x1c\x47\x6a\xb7\x46\xd3\x5b\x43\xf7" - "\x33\xbc\x23\xe6\x92\x3d\x42\xf7\x73\x69\x43\x04\x2d\xac\x34\xe9" - "\x52\x18\xf1\x4e\x13\x6a\xf4\xbc\x52\xad\xc7\xa4\x57\xcf\xeb\x11" - "\x0f\x06\x71\x35\xe1\xa7\x50\xc8\x51\xb1\x2b\x0e\x60\xbd\x0a\x9d" - "\x7e\x19\x7c\x14\x99\xab\xe8\xaf\x8e\x64\x8a\xfd\x1a\xbd\x87\xbc" - "\x24\xe5\xfc\x89\x7f\x1a\xdc\x91\x68\x0b\xcb\xf9\x97\xb6\xc9\xb3" - "\xcd\xcb\x7e\x4e\xe9\x11\xf2\xff\xa5\xf0\xd1\x75\x33\xc1\xba\x9d" - "\xc6\xb3\xa0\x43\x97\x98\x41\xbf\x37\x76\xca\x31\x27\x6b\x63\x56" - "\xe7\xca\xae\xc1\xbc\x53\x97\x10\x20\x7a\x98\x03\xfc\xee\x08\xd1" - "\xe5\x84\x00\x7e\x55\xfc\xa1\x79\x4e\x78\x19\xf3\x1d\x41\x4f\x52" - "\xc2\x74\x3a\xf1\xf0\xc8\x79\x31\x1f\x0e\x48\x7e\xa1\x9d\xd6\x25" - "\x70\xa0\x78\xd4\xba\x4c\xc5\xba\x54\xcb\xfa\x47\xd2\xf8\x29\xa9" - "\xa0\xf1\x6a\x1f\x09\x6f\x13\x32\x31\x37\x1e\x5d\x62\xbb\xba\x27" - "\x21\x26\xc3\xcd\x94\xbe\x4c\xf6\x53\xa6\xab\x6d\x11\xfe\x25\x2c" - "\x01\xfe\x6b\xe9\x2a\x7e\xa3\x9e\xc5\x98\x6b\x2d\x5d\xad\x9f\xf0" - "\x34\x61\x01\xd6\x8f\x96\x2e\x71\x72\x72\x29\xe8\x0d\xca\x06\x84" - "\x2d\x23\xc9\xdf\x0f\x34\x51\xbf\x2f\x6b\x24\xfe\x02\xf7\xc4\x8f" - "\x6f\xdf\xc2\x4c\x9b\xaa\x59\xac\x5c\x9b\x97\x7d\xae\x95\x15\x3a" - "\xfd\x1d\x97\xb5\x68\x34\xaa\x42\xd0\xb3\xf8\x94\x91\xb4\x72\xea" - "\x1a\xee\xb4\x04\x02\x26\x73\xe9\xd1\xc0\x02\x41\x73\x69\xdd\xd7" - "\x0c\xee\xb0\x1a\x3c\xec\x95\x38\x75\x2f\x69\x11\xbc\x9a\xce\xfa" - "\xdd\xa3\x75\x92\x76\xc9\xba\xad\x21\xfa\x17\xc1\x87\x08\x5a\x8f" - "\xb6\x50\x17\xed\x2b\x71\x3e\x47\xda\x25\x92\x7e\x5b\xd3\x3c\xec" - "\xca\x04\x8d\xb6\x62\x7f\xb2\xe8\x98\xbd\xfc\x01\xb9\x3f\x29\xd0" - "\x81\xd9\x7d\xc2\x3f\x5d\xab\xbd\x97\x61\xdf\x84\xff\xef\xf4\xcd" - "\x93\xe0\xb3\x2a\x8d\xfa\x7a\x37\xf1\x67\xfb\xd5\xb3\x19\x92\x73" - "\x2f\x0f\x42\x96\x55\xe1\x4a\xeb\xe9\xf2\x13\xea\xbc\x1c\xa7\xfe" - "\xec\x07\x6d\xdf\xbe\x51\xc6\x54\x82\x3e\x48\xc4\xf8\x02\xcf\x6a" - "\xe5\x7e\x11\xcb\x60\x87\xb5\x3b\x42\xc7\x25\xed\xce\x74\x97\x1d" - "\x15\x31\x2a\x4a\xcd\xa5\x52\x9f\x78\xf9\x06\x99\x7e\x79\x9a\xb4" - "\x43\x30\xab\xeb\xe9\xf2\x25\x51\xd6\xc4\xbf\x08\xfd\xeb\x84\x98" - "\xab\x25\x3f\x72\xf9\xc2\x08\x9b\x1f\x01\x6b\xe1\xe7\x78\xc7\xe5" - "\xa9\xe1\x75\x71\xf9\x6c\x94\xa1\xb2\x3d\x94\x9e\xad\xa5\xcb\xbd" - "\xc6\xbc\x58\xd5\x99\x55\x5e\xb2\x2d\x85\x11\x6d\x9e\xb0\xc7\xa9" - "\xad\xdf\xcb\x9b\x65\xfb\x72\xfd\x62\x8c\xc0\x07\xac\xe1\x80\xf0" - "\x2b\xb6\x42\xf8\xc2\xa1\xe7\xaa\x80\xb6\x76\x25\x7f\x27\xee\x9c" - "\xc9\x75\x7b\x79\x7b\x44\x3f\x2a\x55\x5c\x3d\xde\xf7\x90\xd5\x44" - "\xdf\x7c\x1e\x9d\x51\x9e\x65\xe9\xac\x52\xc6\x78\x62\xa0\x4d\x19" - "\xe0\x7e\xe8\xa6\xa1\x4f\x80\xce\x46\xb5\x57\xc5\x59\x89\x0f\xbe" - "\xd2\x2a\x69\x3d\x84\xfd\xa3\xc5\x31\xcd\x3f\xda\xe0\x8e\xa9\x4b" - "\xc2\xba\x63\xeb\x7e\x75\x5c\xa5\xd4\x5e\x8d\xab\xf0\x3d\xe0\xd2" - "\x73\x72\x8d\x59\xab\x80\xc7\x6e\xc2\x3d\xda\x7f\xaa\x8f\x14\x88" - "\xb2\x45\x1a\xee\xd1\x1a\xcd\xec\xd2\x4d\x9b\x5c\x95\xc8\xab\x69" - "\x4e\x61\xb7\xbf\x96\xf0\x20\x48\xbf\x99\xf2\x57\x17\x87\x5f\x15" - "\xe7\xab\xa9\x2c\xad\xff\x59\x8d\xda\x1c\xf8\x62\x17\xd5\x0b\x1c" - "\x2b\x84\x7d\x63\xb2\x38\xeb\x07\x8e\x01\xbf\xc4\x99\x3f\xe1\x9a" - "\x65\xdb\xbf\x31\xe0\x99\xf0\x99\x42\xef\xe8\x2f\xf0\x6c\x70\xc7" - "\x34\xa3\xe6\xf3\xd8\xa3\x9b\x2a\xcf\xdb\x76\x4c\x9b\xae\xd9\x86" - "\x03\x0f\xf3\x66\xb1\x4b\xa9\x7e\x5b\x93\xcd\x07\xdd\xf9\xdf\xdc" - "\x81\x3b\x19\xf2\x02\x76\x92\x5e\x5e\xd6\x44\x65\x22\xe6\xdf\x2c" - "\x6c\x59\x8f\xac\x12\xfa\xcc\x29\xf4\x6d\xed\x48\x9a\x13\xe3\x17" - "\x7c\x25\x51\xc7\xab\x12\x18\xce\xe9\x69\xaf\x99\x56\xa9\xf1\xc3" - "\xf3\x29\x8d\xf2\xa0\x7f\x90\xc1\xdb\xe8\xb9\x12\xfb\xf4\x38\x7a" - "\xe7\x05\xd0\x15\x81\x66\x40\xf7\x04\x3d\x18\xc1\xfa\x58\x97\x6e" - "\xe6\xe4\xa3\xf0\x5f\xb4\xfe\x9b\x7e\xaf\x0b\xf3\x79\x3f\xfc\x69" - "\xd9\x72\xd8\x94\x0e\xdd\x15\x3e\xe8\x9d\x1c\x5f\x43\xc7\x33\xdd" - "\x3a\x52\xc7\x33\x3d\x5b\xfd\x2b\xa0\x3f\x4f\xf8\x6f\x86\x5d\x7d" - "\xee\xbd\xf0\xdf\x8c\x12\x99\x77\x46\x15\xfd\xd5\x49\x58\x59\x69" - "\xad\x4c\x2f\xd0\x60\x05\x9a\x02\x1a\x0b\x3b\x1b\xac\x73\x5d\x80" - "\xc1\x5f\x12\xcd\x13\xf5\x7b\xfb\xb5\x2b\x5c\x5b\x20\xd3\x4e\x17" - "\xb1\x0b\xe0\xbf\xf8\xa2\x6c\xbd\x74\xd3\xc5\x7c\x0a\xff\xb2\xba" - "\xe9\x76\x6a\x3b\xa1\xe2\x0c\x33\xd8\x73\xd8\x0c\xe8\xd0\x2d\x41" - "\xee\x82\x0c\x0c\x9c\x20\x18\xb4\xf5\xe8\x66\xfc\x3c\x6f\x2b\xd3" - "\xd3\xf7\x99\xf4\x9c\xa1\xf1\x52\x54\x26\x2e\xca\xcf\x12\xc0\x43" - "\xdd\xb1\x95\xcd\x1c\xdc\x31\x63\xb1\x36\x57\xe0\x33\xa0\xc7\x0b" - "\xc5\xbb\xd2\x4d\x17\xb6\x00\xf0\xe5\xef\x01\xdc\x34\x5a\x75\x06" - "\xba\xeb\x19\x49\x51\x3e\x16\x27\xf7\xa1\x19\x45\x34\xaf\x29\x12" - "\x5f\x66\x2c\x21\xdc\x3f\x16\xd1\xcf\x7f\x89\x78\xde\x81\xf2\x16" - "\x1f\x78\xb8\xf1\xe0\x33\xe3\xa8\x06\x9f\x0a\xe1\x03\x94\xd9\xc5" - "\x7c\x07\x78\x2f\xf5\xad\xc5\xbe\x85\x19\x7b\x74\x57\xbc\x45\x63" - "\xc4\xdd\xe0\x66\xa9\xe3\xbf\xe2\x35\x4d\x4e\x97\xfd\xbe\x62\xab" - "\x65\x5b\x14\x83\x6e\x1e\x3e\x23\x85\x2d\xe6\x59\xab\xd0\xc7\xbb" - "\x03\x8b\x99\xab\x70\x11\xf2\xdc\xa5\xee\x65\xc7\xfb\x1c\x56\x76" - "\xc4\xba\x98\xd6\xf1\x15\x4b\x3d\x7a\xb6\xf2\xa2\x6d\x5e\x75\x57" - "\x2c\x55\xe1\xdb\x22\x6c\x45\x74\x57\x5c\x8e\xbd\x04\xba\x01\xda" - "\x47\xc0\xa3\xc5\x53\xdd\xfb\xb5\x75\x43\xfb\x44\x13\x95\xb1\x4a" - "\x3d\x66\x7f\x2a\x3d\x27\xc0\x6f\x8d\x90\x1f\x64\x7e\x93\x3c\x37" - "\xb8\xa2\x3d\xc4\x6f\x53\x3e\x94\x13\x36\x84\xba\x19\xbd\xe9\x41" - "\xe8\x12\x66\xf4\x62\x6c\x2a\x2e\xd2\x7e\x35\xd3\x18\x5e\xb7\x33" - "\x96\x88\x75\xdb\x1b\xb9\x2e\x67\x26\x85\xe5\xd4\x69\xc7\xe7\x55" - "\x31\xdb\x58\xeb\xd0\x6e\xc6\x5e\x35\x73\x57\x45\x05\xaf\xab\xd4" - "\x2b\xdf\xdf\x5e\xce\x4c\xba\x52\x02\x1b\xd6\xd9\xc6\x8c\x4b\x69" - "\x3d\x1e\xb4\x98\x2e\x4b\xbd\x23\x6f\x22\x2f\xb4\x32\x7d\xd9\xb9" - "\x89\xc6\x59\xfe\xcb\xea\x78\xd4\xb5\x2b\xee\xce\xc3\xd9\x77\x25" - "\xfb\x6a\x2d\x8b\xba\x83\xa8\xdc\x55\x26\x66\xf7\xe8\x66\x35\xe0" - "\x9e\xfb\x11\x13\x78\x91\x59\x0d\xa8\xb3\xa0\x86\x19\x0b\x3a\x79" - "\x77\xe9\xc3\xd1\x46\xda\x7f\xe3\x68\xdf\x28\xb9\xc4\x74\x59\xdd" - "\x30\xd5\xf1\x6e\x86\x28\x57\x3f\x7e\xdf\x6c\x37\x8f\xdd\x37\x7b" - "\x62\x97\xce\x76\xe7\xc5\xf5\xed\x4a\x5f\xb8\x6f\x57\xfa\xfe\x17" - "\xfa\xf6\x49\x44\xdf\xe2\xc2\x7d\xcb\x46\xdf\x4e\x5c\x5c\xdf\x66" - "\x2f\x08\xf7\x6d\xf6\x82\x7f\xb2\x6f\x87\xc6\xef\xdb\xac\x47\xc7" - "\xee\x5b\xfe\x65\x5d\xba\x59\x5b\x2f\xae\x6f\x73\xf2\xc2\x7d\x9b" - "\x93\xf7\x3f\xe9\x5b\x61\x0d\x3f\xd9\x3a\x9d\xc1\x9f\xa6\x09\x74" - "\xbe\x4b\x77\xe5\xb6\xad\xd3\x85\x1d\x77\x3c\x3d\xdf\xec\xa8\xe1" - "\x7f\x97\xbc\xcd\xac\xf3\x72\x4f\x9b\xe5\x25\xfc\x95\x76\x25\xba" - "\x2b\x3d\xc2\xce\x25\x6a\xea\x01\xee\xe4\x81\xeb\x7d\xb0\x19\x0c" - "\xc0\xb7\x0b\x7c\xc1\x37\xbf\x3a\xe0\x47\x1c\x8e\xf6\x7d\xe7\x0c" - "\xec\xd5\x01\xaf\x7e\x70\xc7\x95\x73\x35\x7f\xae\x5a\x59\x4b\xf5" - "\x85\xe8\xd1\x95\xab\xef\xc8\x66\x16\xd0\x23\xfc\x22\x9e\x66\x45" - "\xe1\x44\xe3\x1d\x5f\x63\xdf\xbf\x32\x5f\xbb\xaf\xab\xd5\xb5\xbc" - "\x7b\x22\xb7\x14\xb0\x28\xdc\x19\x16\xbe\x1f\xad\x5e\x36\xbb\x80" - "\x45\x2f\xcf\xa7\xfa\xfd\x2c\xc3\x92\x4f\x75\x13\x3c\x24\x2f\x7f" - "\xe5\x5b\x51\x6b\x99\xa9\x8a\xea\xc6\xef\x1d\x56\x07\xdf\xbe\x8b" - "\x19\x70\xb7\x18\x77\x84\xe5\xfd\xe0\x09\x46\x6a\xc7\xa3\xb5\xf3" - "\x2d\xf0\x33\x4b\xf8\x5d\xf5\x6e\x18\x7e\x57\x6d\x08\xc3\xef\xaa" - "\xef\x4a\xf8\x5d\x95\x1c\x86\xdf\x6c\xdb\xc5\xc1\xef\xaa\xb5\x61" - "\xf8\xc9\xb2\x17\x86\xdf\x55\x2f\x8c\x0f\xbf\xab\x1a\xc3\xf0\x93" - "\x75\x8d\x03\xbf\x09\x63\xc3\xef\xaa\xe0\x3f\x07\xbf\xd9\xb6\x7f" - "\x12\x7e\xb1\x12\x7e\x73\x74\x61\xf8\xcd\x7e\x23\x0c\xbf\xd9\x9b" - "\x25\xfc\x66\xdb\xc3\xf0\x9b\x93\x71\x71\xf0\x9b\x7d\x28\x0c\x3f" - "\x59\xf6\xc2\xf0\x9b\x7d\x62\x7c\xf8\xcd\xf6\x87\xe1\x27\xeb\xba" - "\x38\xf8\xcd\xb9\x95\xe0\x16\xa7\xc2\x2f\x6e\x7c\xf8\xcd\xc9\xf8" - "\x27\xe1\x67\x91\xf0\xbb\xfa\xf6\x30\xfc\xe6\xf4\x87\xe1\x37\xe7" - "\x4d\x09\xbf\x39\xf5\x61\xf8\x5d\x5d\x77\x71\xf0\x9b\xd3\x1b\x86" - "\x9f\x2c\x7b\x61\xf8\x5d\x3d\x6b\x7c\xf8\x5d\xbd\x30\x0c\x3f\x59" - "\xd7\x38\xf0\x9b\x38\x36\xfc\xae\xde\xfa\xcf\xc1\xef\xea\xba\x0b" - "\xc1\xef\xe2\x78\x8d\xab\xc7\xbd\xff\x7e\x91\xf5\x04\xc6\xab\x07" - "\x30\x84\x7d\xa2\xb2\xe3\xea\x40\xad\x32\xc1\x28\xef\x70\x5c\xdd" - "\x40\x32\xcc\x6d\x1d\xba\xef\xdc\x55\xab\x44\x1b\xb9\xf3\xef\xc7" - "\x15\xe7\xc9\x62\xbe\x6d\x82\x41\xd9\x36\xd1\x00\x7f\x06\xe3\xc6" - "\x5c\xd7\x7d\xe7\x60\xd4\xe5\xec\x0a\xdc\xd7\xdb\x4e\xfc\x1a\x9e" - "\x07\x77\x7c\xa7\x81\x78\x91\x94\xd1\x30\xc9\x5c\x93\x2b\x82\x7d" - "\xe6\x64\x65\x6e\x58\x97\xb9\x7a\x5d\x9e\x6d\xf5\x43\x8f\xe4\x8e" - "\xf4\xa1\x2f\xe2\x64\x16\x63\xfe\xbe\xe3\x0f\xf9\x98\x71\xf2\x7c" - "\xf8\xea\xb3\x5f\x09\xdb\xb4\xa4\x85\x22\xae\x81\xd9\xb2\x84\x0f" - "\xa7\xed\x4e\xb9\x8a\xbf\x23\x7c\x10\x0e\x67\xef\x26\x79\xaa\x17" - "\x7e\x65\x54\x7f\x85\xbd\x5d\xba\x6b\x7f\xc0\x63\xa7\x34\xc2\xa6" - "\x43\xdc\xed\xd0\x25\x69\x77\xb0\x9a\xb9\x29\x66\x89\x52\x3a\xa5" - "\x91\x97\x4d\xa9\x07\x0c\x5a\xe1\xff\x6d\x63\xd4\xcc\x0e\xdd\xdc" - "\x04\x1e\x1b\xb3\x84\x97\xc6\x2c\x55\xcf\x38\x96\xc2\x5e\x34\x65" - "\x0b\xff\x1b\xea\x53\x79\x41\xc4\x2d\x71\x49\x7e\x30\xe9\xa8\x65" - "\x9b\x2d\x0a\x79\xe1\x87\x11\xfe\x09\xb5\x58\x55\xe8\x37\xf2\x12" - "\x3f\x7e\x1b\x95\xbf\x0d\xb1\x3a\x43\x75\xc8\x3e\x4d\xe9\xd1\x5d" - "\x63\x10\x63\x29\x35\x7a\xfb\x1e\x4b\xdb\x2d\xe2\x45\x0a\xb8\x5e" - "\x77\x9e\xc6\xe0\x15\x71\x3e\x03\x67\x45\x9c\x4f\xb5\xcc\x0c\x2a" - "\x23\xe8\x29\x7c\xaf\xca\x3a\xae\x3b\xa1\xf5\x8b\x78\xe8\x49\xf4" - "\xfe\x61\x44\x1b\x97\xd0\xfb\x6b\x11\xdf\x4d\xf4\xfe\x1c\xf1\xa1" - "\x93\xd5\xef\xb1\xf4\xbe\x19\x7c\xa9\x8c\x91\x59\x24\x6d\xa2\x75" - "\xd7\xad\xa2\xb4\x38\x35\xcf\x64\xca\x73\x3b\x78\x5d\xb5\x8e\x78" - "\x7a\x9f\x03\x99\x51\xfd\x9e\x40\xef\x31\x38\x17\x50\xbf\x5f\xda" - "\xa3\xbb\xf6\x34\xbd\x7f\x47\xfd\x4e\x7c\xfd\xb5\xc2\xd7\x16\xc1" - "\x7d\x31\xc6\x44\xb0\xaf\x06\xdc\x09\xd6\x8b\xb9\xc9\xd8\x4b\xf2" - "\xaa\x03\xf3\x88\x71\xba\xb6\xf4\xb0\x0e\xdd\xb5\x97\xe3\x5e\x9e" - "\x9c\xab\x29\x8d\xd2\x3f\x90\x3e\x8d\xd2\xad\x48\x87\x6d\xb9\x52" - "\x36\xa5\x1a\xcf\x04\xd3\xd7\x00\x43\xb5\x2d\x92\x89\xae\x4d\x51" - "\xe7\x99\x60\x07\x1f\xbe\xac\x68\x9f\x3a\x17\xd4\xb7\x89\xf4\x7d" - "\xaf\x7a\xee\x91\xbd\x3c\x30\x2c\xef\x17\xe9\xae\xcd\xfe\x6f\xf9" - "\xac\xa0\x72\x92\xee\x5d\x7b\x40\x8b\x61\x48\x69\xc2\x57\x06\xf0" - "\x13\xfa\x15\x6f\xac\xb1\x5d\xf8\x68\x21\x1c\xd5\x70\x05\x78\xc2" - "\x27\x7c\xc7\x25\x75\x35\xd7\x86\xee\xff\x52\x59\x9b\x1a\xf7\x81" - "\x49\x39\xe1\x3a\x16\xb6\x2f\xba\x46\xd0\x87\x88\x6f\xd3\x23\xbe" - "\x69\x7e\x09\xa5\xcf\xa9\x1d\xd7\x2d\x8c\xf8\x56\x35\xea\xdb\xca" - "\x88\x6f\xc5\xa3\xea\xb4\x47\x7c\xcb\x1b\x55\xae\x34\xe2\x5b\xc6" - "\xa8\x6f\x07\x22\xbe\xa5\xaa\xdf\xa2\x28\xdd\x15\xf2\x91\xa8\xbb" - "\x26\x45\x4d\x27\x5a\x7f\x5d\x7b\x44\x7a\xb2\x9a\x8e\xf6\xbd\x1e" - "\xf6\xe7\xe3\x6a\xba\xc0\x73\xc2\xa3\xab\x65\x1b\x73\x4d\x11\x6d" - "\x30\x39\x87\xc6\x76\x39\x7f\x49\xf9\x16\x9d\x6d\x22\x70\xca\xb2" - "\xad\x08\x31\x84\x2a\xa5\x3f\x30\xb9\x0e\x45\x1c\x6a\xc4\xca\xa5" - "\x7c\xe3\xd1\xc6\xb1\x6d\x04\xe7\x16\x69\xf7\x58\x83\xa5\xc6\xe3" - "\x4a\xa9\x05\xe7\x23\x33\xe1\x37\xcc\xd1\x0b\xdf\x31\x5a\x4c\xc2" - "\x21\xe6\xce\x1b\x2c\x6a\xf5\x8b\xfb\xb6\xb8\x0f\x61\x86\xdf\xb3" - "\x56\xa1\xdf\x39\x2d\xe3\x12\xe2\x7e\x6f\x99\xf1\xf8\xa6\x5e\x36" - "\xdd\xfe\x3d\xde\x09\x39\x4f\xd2\x84\xb9\xa0\x27\x16\x95\xa6\xed" - "\x12\xb6\xde\xba\x79\xc9\x48\x73\xf7\x0a\x3d\xb3\xb1\x4b\x37\xaf" - "\x48\xfb\x2e\xc7\x3b\xaf\x48\xc8\xd2\xea\xbd\xc2\xc1\x1d\xf3\x92" - "\x42\x71\x33\x75\xf3\x8a\xfb\x63\x13\x93\x28\x6d\xf1\x48\xfb\xc6" - "\x79\xf7\xa2\x4e\x8c\xc3\xa3\x9b\xeb\x47\xdd\x94\x27\x23\x64\xdf" - "\x48\xe9\x9b\x02\x6c\x2a\xf5\xad\x4b\xab\x9f\xbe\x93\xfc\x3f\x57" - "\xc8\x95\xa8\xb3\xbf\x6c\x71\x1a\xa5\x55\x79\xf4\x9f\xdb\xa4\x7d" - "\xe4\xbc\x3a\x0f\xeb\x48\x1e\x6f\xff\x13\x3a\x49\xd3\x94\x36\x5e" - "\x3a\xa5\x9d\xd6\x7c\xb3\xf4\x03\x30\xa5\x4d\xca\xf2\xf3\x4e\x23" - "\x16\x19\x62\x78\xe3\xdc\x51\xd2\x9d\xeb\x85\x3d\x04\xd2\x08\x36" - "\x07\x88\x3e\x0b\xfd\xf3\xc5\xad\xc9\x79\x62\xff\x83\xef\x26\xdc" - "\xb9\xc0\x1d\x8e\xc1\x1d\xd7\x2f\x0d\xc5\x7a\xd0\xee\x13\xe8\xae" - "\xff\x39\x74\x7c\x15\x8a\xec\xe3\xe8\x3e\xa0\xbf\x54\x57\xef\xb8" - "\x7b\xa9\x69\x8a\xd4\x83\x96\x9b\x65\x6c\x59\xdd\xf5\x6f\x46\x59" - "\xa7\x75\x53\x5b\x0d\xa1\x18\x17\x94\xa7\x1c\x36\xc1\x54\x7f\x68" - "\x9c\x39\xa2\x8d\xe3\x52\x4f\x7f\xbd\x97\xe8\x58\x73\xc5\x10\x33" - "\xa8\xe9\xde\xd6\x80\x1f\x77\xeb\xc7\xf4\xc1\x85\x3d\x52\xf8\x6f" - "\x2a\x9f\xd2\x8c\xfb\x13\xf3\xfd\x5a\x9f\xe7\x7b\x61\xb7\x8f\x3e" - "\x4b\xd8\xce\x3f\xa9\xc1\xb1\xec\x1c\xd5\x5d\xf8\x05\xeb\xd4\xcd" - "\x7f\x14\xf6\x2d\x02\x26\x5b\x34\x9b\xab\xf9\x8f\x8a\x7c\x43\xa1" - "\x3c\x42\xdf\x01\x7b\x5f\xc0\xa9\x16\x7e\x07\xa8\xce\x72\x9a\x0b" - "\x11\xc7\x56\x37\xff\x0d\xa1\xdf\xa4\xef\x62\xdc\xc2\x9e\x2d\x39" - "\x41\xe2\xca\xfc\x43\x1e\x5d\xb2\x4d\xe2\xa0\x4c\x43\x0c\x78\xd8" - "\x21\x9c\xd1\xcd\x2f\x43\x2c\x59\x82\x47\x3b\x7c\xd7\xb5\xfa\x68" - "\xbd\xe4\x0f\x01\x17\xda\x11\x33\xd0\xa3\x9b\x2f\x63\x59\x99\x00" - "\xf3\xf9\x76\xb4\x0f\xd8\x22\x8e\x2e\xc1\x74\x60\x70\x47\x72\x48" - "\xff\x81\x98\xbd\x94\x67\x5c\xdf\x8d\x80\x51\x90\xfa\xdc\x4a\xfc" - "\xaa\x6b\xea\x17\xe8\xdf\x27\x8a\x79\x4a\x33\xec\x27\xe9\x59\xfa" - "\xbe\x28\x95\x73\x27\xf1\x20\xf9\x60\x94\x75\xfa\xac\x56\x89\x0b" - "\x32\x8e\xb9\x2e\x39\xf5\xff\xb1\xf7\x3d\xf0\x4d\x55\x67\xff\x27" - "\x69\x80\x80\x49\x13\xb1\x73\xc1\x15\x8c\xae\x6e\xd1\xa1\x56\x45" - "\x45\xc4\x59\x15\x1c\x28\x52\x74\xa0\x55\x10\x8a\xfc\x0b\x5a\x20" - "\x94\x52\x02\x94\xfe\x13\xbb\x52\x93\xd2\x39\xe6\x5b\xa4\x2d\x15" - "\x71\x2d\x1b\xba\x6e\xb0\xfd\xba\xbd\x30\xe3\x2b\xec\x2d\xda\x36" - "\xd5\x1f\xfc\x6c\x4a\x1d\x69\xd7\x61\x65\x05\x62\x29\x34\xb4\xc9" - "\x3d\xbf\xe7\xb9\xe7\xa6\xb9\x69\x93\x36\x49\x0b\xe2\xa4\x9f\xcf" - "\xfd\xdc\xde\x73\x9f\x9c\x7b\xce\xf3\x7c\xcf\xf3\x3c\xe7\xdf\x73" - "\x04\xfe\xf1\x67\x5e\x14\xa4\x32\x3e\x30\xfa\xbb\x64\x6c\x5c\x26" - "\xfa\xc7\x50\xae\x52\xef\xb8\xcc\x5d\x32\x7e\x4c\x4d\x58\x63\x0d" - "\xef\x0e\x88\xca\xdc\xc1\xef\x03\x6c\xc7\x3e\x75\xec\x62\xfc\x96" - "\x19\x63\x8b\x21\x2e\x4e\x89\xf1\x1f\x3b\x15\xcb\x89\x6b\xf3\xdc" - "\xca\xc8\x56\x6a\x8e\x6c\x43\x3e\xc3\x6f\xd2\xa0\x2d\xf8\x1d\x5b" - "\x45\xbd\x89\xe7\x9e\x74\xe6\xdc\x35\x5e\x74\xf6\x2e\xd8\xc1\xbb" - "\x5e\xf4\xd8\x39\xb4\xd1\x18\xe7\xa1\x27\xcd\xfc\x9c\x06\x7c\x1c" - "\xad\xe0\xe3\xf8\x1d\x2b\xe2\xe3\x1c\xde\x41\x62\x71\xaf\x31\xae" - "\xd3\x46\xbc\x51\xc5\xb3\x95\x18\x3b\x19\xe3\x40\x5a\x36\xdc\x0d" - "\xe5\xbd\x5b\xf9\xab\xeb\xf9\xfd\x8d\x1d\x96\x3b\xda\x71\x8d\x4e" - "\xdb\xc9\x34\x3e\xbe\x91\x3c\xde\xe8\xa2\x3b\xd9\xd9\xdb\x0e\xaa" - "\x7c\xb6\x12\xdf\xf1\x67\x07\x60\x9e\xe1\xc6\x01\x96\xdc\x55\x2f" - "\xf8\x32\x6d\x60\xcb\xbf\x0f\xf5\xe1\xf7\x33\xc2\xff\xd7\x9f\x92" - "\xdc\x73\x2f\x3b\x2f\x92\xc5\xb2\x17\xd6\x1a\x0e\x67\xfb\xf3\x1d" - "\x84\xdf\x2f\x2d\xb9\x7b\x8f\xf6\x36\x42\xda\x24\x77\xbf\xc7\xc7" - "\x95\x36\x8d\x8c\x15\x78\x10\xbb\x95\x95\x4b\xb5\xc0\x28\xe5\xcb" - "\x88\xe5\x0b\xad\x6c\x77\x7b\xec\xe5\xf0\xce\x9c\xbb\x2b\x3d\xfb" - "\xfa\xf9\xfa\x0b\xf1\xa6\x2d\x37\x63\xbf\xe5\x9e\x5b\x98\x5c\x46" - "\x4e\x10\xbe\x3d\x61\x08\xbe\xed\x10\xf2\x94\xf3\x31\xb7\x81\x2f" - "\x90\x2f\xe8\xbd\x7b\xe2\x3c\xf6\x54\x58\x23\x3f\x9e\xd9\xf9\x7b" - "\x12\xbc\xb6\x94\xf1\xd0\x67\xcf\xce\xaa\x55\x29\x5a\x70\xd8\x0d" - "\x0b\x53\x16\xe9\xb5\x4b\x92\x93\x57\x25\x6b\x31\xe0\x4d\xaf\x73" - "\x95\xe4\x34\xe7\x9e\x24\xe1\xec\xb7\xf2\x9e\xb3\xdf\x72\xee\xd9" - "\x2f\x3e\x93\xcf\x2e\xb9\xa7\x72\x68\xfa\x35\xf7\x04\xdc\xe7\x57" - "\x20\xe5\x2a\xe0\xaa\x84\xcb\x02\x57\x15\xf6\x73\x16\x38\x49\x1c" - "\xd8\x47\x7e\x4e\xd8\xbb\x5f\xfd\x1e\x13\xce\x83\x37\x4b\x26\xdc" - "\x55\xc2\xc9\x08\x1f\xd7\x24\x9b\xc3\xb5\x24\x18\x1f\xbd\x12\x2e" - "\x0b\x5c\x55\x70\xf1\xbf\xe3\xfe\x87\xdf\x6b\x5b\x21\x7e\x87\x73" - "\xd3\x34\xdb\x32\x19\x69\x68\x96\x8c\xf7\x43\xb8\x37\x18\x5d\xaf" - "\x32\x48\x69\xce\xed\xfb\x05\x3a\x5e\x37\x44\x66\x11\xad\x1f\xba" - "\x08\x9a\xf3\x63\xbb\x40\xc7\xef\x7d\xf7\xd4\x07\x63\xf7\x03\xbd" - "\x87\x4e\x46\x73\xee\x32\x08\x74\x2c\xa6\x59\xb6\xd4\xdf\x77\x87" - "\xd1\xec\x0b\xd1\x02\x9d\x5a\x9c\x9f\x88\x66\x38\x97\x73\xe3\x14" - "\xa4\xe1\xb2\x64\xec\x1c\x96\x9c\x7b\x8e\x02\xbd\xdf\x98\xa7\xa1" - "\xc9\xe9\xde\xb4\xde\x72\x32\x2c\x5a\xbe\x64\xd2\xf2\x95\xa9\x78" - "\x92\x54\xca\xaa\xb5\x29\x78\x5f\xb9\xf0\x15\xfe\xb6\x6a\xc1\xd2" - "\x45\xec\x9f\x94\xa4\x58\xfc\x27\x09\xf0\x86\xf7\xc5\x6b\x0d\x78" - "\x5b\xb4\x0a\x1f\x8d\xfa\xf1\x6b\x17\x79\x8e\xf4\xf6\x89\xbb\xd4" - "\x99\x73\x5f\x8c\x5d\x32\x21\x8a\xf9\x23\xf7\xc5\xda\x25\x3f\xe6" - "\xe7\x81\x55\x59\x76\x72\x58\xc7\x9f\xfd\x47\xfa\xc4\x2b\x90\xdc" - "\xf7\x10\xc6\x2b\x50\x65\x19\x16\xa9\x5c\xcb\x97\x50\xb3\x6a\x1a" - "\xfc\x36\xc9\x4e\x76\x0b\x7b\xcb\x47\xc6\xf1\x71\x43\x73\xee\x3d" - "\xe0\x59\x5f\xc8\x99\xe4\x1d\x18\x0f\x9f\x5f\x6f\xf4\x06\xc6\xc2" - "\x19\xa9\x05\xba\xc9\x25\x6f\xf0\xe7\xd2\x44\xc1\x7b\xfc\xdd\x14" - "\x78\xd6\xc0\x73\x34\x97\x7b\x31\x13\xf7\x27\xc2\xb3\x16\x9e\x63" - "\x20\xff\x6a\x4f\xbb\x10\xf3\x46\x38\x6c\x6e\x92\xdf\xfe\xb1\x6f" - "\x8c\x29\x68\x5b\xf7\xab\x3d\x67\xf9\xf2\xe7\xf6\xe6\xdc\xaf\xed" - "\x39\xb7\x97\x3f\xcb\x49\x3d\x8f\xb7\x6b\xbc\x6d\xbf\xbf\x38\x42" - "\x33\x36\x95\xf9\xe1\xf7\x4f\xf3\xc4\x64\x60\x7e\xf6\xfd\x09\xa2" - "\x33\x8f\xf1\x59\xdf\x73\xe6\x31\x8b\x4b\xf6\x16\x1f\xf7\x48\x72" - "\x7f\x05\xcd\xb9\xaf\xbe\xe7\x7c\xba\x9c\xfb\x0b\xc4\xe7\xd3\xd9" - "\xe1\x3d\xf6\x6f\x20\xbd\xdc\x6b\x07\xef\x9f\x8c\xdf\xf4\x77\xbe" - "\x33\xf4\xcf\x8d\x0b\xd6\x83\x2f\x0e\x77\xde\x2f\x17\x7c\x60\x4c" - "\xa7\xd9\x71\x18\xdf\x46\x8b\xef\xd0\xf7\xf3\x3b\xe6\x80\xe7\x2b" - "\x4a\x26\x3e\x82\x71\x77\x1d\x19\x8b\x25\x3f\x2c\xc1\x35\x48\xf0" - "\xcc\xe2\x46\xd2\x33\x92\x89\xfc\x3e\x36\x4f\x4c\x39\xf1\x9e\x78" - "\xbf\x7b\x0f\x3e\xf3\xcc\x19\x27\xad\x52\xb9\x16\x2e\x61\x7e\xdc" - "\xc4\xb7\x99\x2e\x55\x29\x98\xbd\x9f\x68\xa2\xcf\xb0\xf3\x4e\xec" - "\x92\x07\xd4\xb8\x1f\x49\x25\x49\x5a\x45\xe1\xb7\x2a\xe3\xc2\x25" - "\x7c\x1a\xd0\xbd\x0a\xbe\x96\x50\xbe\xd5\xd6\xe8\x56\x42\x2f\xb8" - "\xd9\x5e\x7f\xc9\x44\xc3\xfc\xb1\x99\xf8\x1d\x39\xef\x47\x7c\x46" - "\x14\x78\x56\x20\x96\xad\x44\x14\xf3\x6e\x2b\xa4\xe1\x7a\xac\x73" - "\xcf\x10\x3e\xee\xaf\x50\x16\x03\x7f\x56\x59\xce\x03\x72\x4f\xcc" - "\x1c\x3b\xa4\xf5\xae\xcf\x33\x3f\xe7\x5b\xc8\x2d\x8b\xc6\xcf\x9a" - "\x0a\xff\x8d\x17\x8e\xb9\x15\x63\x27\xfa\x5c\xe4\xb5\x71\xe7\x7e" - "\xb3\xef\x4b\xfe\x9c\xc8\x9c\x07\x12\x40\x4e\x2e\x5e\xde\xaf\xce" - "\xfd\x0a\x75\x0b\x7f\x7e\x22\xee\x2b\xe4\x3a\xe0\xbb\x93\xa7\xf3" - "\xf1\x75\xa5\xcc\x5f\xe4\xe3\xda\xe5\x3c\x80\x31\xbd\xed\xec\x8c" - "\x58\x95\x1d\xe4\xc7\xdb\x7d\x6c\x1b\xfc\xfe\x49\x35\xd6\xfd\x81" - "\x0a\xd0\xa9\x8f\xc1\xf5\x1c\x3b\x1f\x66\xee\x57\x9e\x7c\x31\x7e" - "\x14\x60\x6b\x1a\xdc\xd5\xf0\xfd\xfa\x9e\x35\x42\x3d\x7b\x32\x1f" - "\xb8\x88\xb1\xad\x7a\xf6\xe7\x4a\x26\xdf\xcb\xfc\xca\x49\x32\x3b" - "\xf9\x51\x01\x6b\xdf\x18\xff\xbf\x4a\xd8\x9b\x35\x09\xfa\xbf\x4f" - "\x26\xfa\xe6\x31\x69\x89\x67\xec\x83\xc9\x6e\x52\x1c\x60\xf1\x31" - "\xb8\x9e\x03\xfa\x19\x9e\x33\xb2\x5f\x95\xf2\x7b\x8b\x4e\x46\x68" - "\x48\x2c\xa4\x2f\xf6\xa4\x0f\x93\xc4\x01\x6f\x26\xa5\x78\xf4\xc9" - "\xb9\xc8\xc8\x0e\x78\xde\x0c\x7e\xba\x8b\x3d\xab\xf0\xfd\x36\xcf" - "\x33\xfc\x5f\xea\xd1\x37\xd8\x3f\x3b\xb7\x31\x61\x3b\xf6\xff\x16" - "\x69\xc0\x27\xd3\x60\xff\x6a\x12\xf4\x7f\xff\x37\x93\xfd\x76\x92" - "\xe1\x5c\xf6\xc7\xe3\x3b\x22\x9f\xa9\xe8\x00\x1d\x0a\xef\x1a\xed" - "\xe4\x77\xf3\x84\x7c\x5a\xed\xd2\x86\x16\xaf\x3c\x22\x54\xc0\x63" - "\x17\xab\xd3\x64\x2d\x55\xaa\x09\x9e\x57\xde\x99\xf3\xa0\xda\x2e" - "\xb9\xcf\xc9\xd3\xa5\xb6\x95\x9a\xba\xd4\xb3\xad\xd0\x83\xb7\x2c" - "\x45\xac\x3c\xc8\xef\x4f\x36\x6f\x50\xf3\x31\xc4\x30\x0e\x01\x1f" - "\x9f\x0c\x63\x4e\xba\xc8\x70\x3e\xce\xbf\xf9\x41\x3d\x1f\xdf\x7e" - "\x9d\x4e\xe1\x89\x37\x09\xed\xb4\x80\x4a\xdf\x4f\xc1\x18\x94\xfc" - "\x58\x5a\xa7\x2e\x92\x8f\x3b\x29\xc4\x9b\x2c\x4e\x25\x51\x45\x1c" - "\x8b\x37\xc9\xc7\x28\xe8\x27\xe6\x24\xcd\xfe\x72\x82\x27\xe6\x24" - "\xf0\x01\xf7\x1e\xea\xe8\x05\x97\x13\xee\x31\xa2\x58\x37\x32\xbf" - "\xf1\x27\xa5\xa0\x37\xa5\x2c\xfe\x64\x68\xf6\xe6\xc1\x36\x86\x93" - "\xc9\xe3\x3d\x67\x78\x8b\xd2\xe2\xa0\xbd\x08\x7e\xce\x03\x4e\x21" - "\x6d\xb6\x9d\xfc\xbd\xad\xc7\x37\x03\x7d\x87\x63\x8a\xf0\x3e\x8d" - "\x66\xe8\xb7\x8b\xdb\x15\xe1\xff\xd0\x74\x0f\x03\xbb\x3c\x1c\xae" - "\x11\x78\x4d\xeb\xd1\x1f\x17\x68\x3d\xf6\x11\x54\x12\xb0\x37\xc6" - "\x08\x1a\xef\x72\x45\x2c\x70\x49\x8e\xa2\xef\x89\x7b\xae\xe3\xdd" - "\x2e\xdc\xfb\x2f\x8b\x77\x9f\xc3\xf3\x35\x8f\xe2\x5e\xb2\xad\x4b" - "\x71\x6f\xe3\x8d\x14\xcf\xa9\x89\x77\x9f\xa5\x3b\xd9\x9e\xcd\x3a" - "\xe1\xcc\xcc\x6a\x77\x2a\xad\x02\x39\x28\xb0\xdf\x81\xf1\xb7\x22" - "\x25\x4e\x12\x69\x88\xf8\x60\xe6\xf9\x0f\x28\xc6\xde\xc2\x33\xca" - "\xb8\x1c\x27\xe8\x4a\xad\x64\x81\x2b\x22\xd3\xea\x6a\xe1\xcf\x09" - "\x88\x77\x8f\xa0\xf1\xc6\x87\x28\x7f\xb6\x58\x2a\x3d\x04\x7a\x36" - "\x82\x3f\x43\x7b\x3d\x3d\x07\xff\xcb\xe3\xd7\x9f\xa3\x78\xbe\x27" - "\xe4\x5d\x15\xef\xe2\xba\xe2\x8d\x5c\xc6\x02\xa3\x04\x7e\xf7\x4f" - "\xf8\xdd\x3f\xa1\x3c\xb1\x90\xa7\x1a\x9e\x1f\xa6\x3b\x97\xe2\x1e" - "\xa8\x4c\xbe\xef\x03\x75\xb4\x08\xfb\x4a\x2b\xf1\x4c\x4f\x8c\x33" - "\xbe\xc0\x65\xc9\xdc\x29\xec\x13\xe5\xcf\x96\x35\x76\x53\xe1\x3b" - "\x13\xe3\xd7\x93\x87\x17\xac\xbf\x91\xdf\x6f\x8a\x7b\xa9\xe2\x5d" - "\x5a\xf8\x66\x26\xf2\x43\xc1\x9f\xe7\xcd\xef\xa7\x7a\xa8\xbe\xbf" - "\xf3\x3d\x71\x9d\xc8\x9a\x31\x44\x8a\xfb\x33\xdc\x25\xef\x24\x62" - "\x2c\xb0\x0c\x07\x75\xe2\xb8\xdf\x07\x5d\xf5\x52\x6d\xaa\x0c\xf4" - "\xea\x43\xee\x5a\x43\xac\xff\x3d\x75\x79\x63\xc0\xff\xfd\xbc\x83" - "\xe6\x45\x27\x51\x73\x7d\x0a\x35\xa9\xa3\x70\xbd\x2a\xcd\xbb\x71" - "\x32\x3c\x43\xfa\xcd\x0a\x6a\xb6\xa5\xd0\xbc\x98\x46\xb8\xc3\xf3" - "\x8f\xf7\x52\x73\x03\x3c\x4b\x53\xe0\x77\x0e\x9a\x17\x81\xbf\x33" - "\xd0\x3c\xd9\x62\xb8\xc3\xf3\xb0\x79\x40\x07\xcf\xc3\x67\xc3\x1d" - "\x9e\x47\xcc\x38\x29\xf9\x69\x15\xfc\x06\xd2\x6e\x4b\x63\xdf\xba" - "\x3d\x8d\xff\x56\x1e\xf6\xd5\xf0\x1b\xf7\xa4\xb1\x6f\xdc\x97\xc6" - "\xbe\x01\xf8\xe2\xbf\x21\x9f\x02\xf4\x4e\x9a\x37\x72\x3f\xd0\x19" - "\x69\xde\x35\x31\x70\x87\x67\xc5\x36\xa0\x83\xe7\x48\x19\xdc\xe1" - "\x59\x05\x65\x69\x80\x67\x75\x0b\xd0\xbb\x68\xde\xe8\x04\xa0\x4b" - "\xa3\x79\xd7\x55\xc3\x1d\x9e\xbf\x17\x07\x74\xf0\x7c\x3d\xe4\x63" - "\x83\x67\x8d\x0e\xe8\xe1\x79\x32\x7e\x9f\xd0\xbc\x9f\x62\xbe\x99" - "\x34\xef\x61\xa0\xb7\xc1\xf3\x23\x90\x9f\x0d\x9e\x1f\x8b\x06\x3a" - "\x78\x9e\x72\x08\xee\xf0\xfc\x38\xd6\x55\x46\xf3\xa6\x69\xe0\xbe" - "\x99\xe6\x4d\x87\x74\x1b\x3c\x3f\x69\x80\x3b\x3c\x3f\x85\xf4\xf0" - "\x3c\x13\xeb\x0b\xcf\xb3\x20\x9f\x7a\xe0\xf1\x33\x47\xe1\x9e\x4b" - "\xf3\xe6\x4c\x00\x3a\x78\x7e\x0e\xcb\x0f\xcf\xcf\x77\x00\x1d\x3c" - "\xcf\x03\x5e\x35\xc0\xf3\x7c\xac\xa7\x82\xe6\x2d\xc4\xfc\x4d\x34" - "\x6f\x11\xf2\x03\x9e\x97\xd8\xe1\x0e\xcf\x7a\xe0\x47\x03\x3c\xbf" - "\x5c\x0e\x77\xbf\xe7\xf3\xd1\xbc\x15\x99\x34\x6b\x38\x94\x39\xf5" - "\x00\xcd\x1a\x01\x77\x63\x12\xcd\x1a\xa6\xa3\x79\x1b\xab\x21\x1d" - "\xee\xeb\xa7\xc0\xf3\x78\xe1\x19\xee\x1b\xa2\xe1\x39\x56\x78\x86" - "\xfb\x86\x0e\x78\x9e\x20\x3c\xc3\x7d\x53\x1a\x3c\x4f\xa4\x79\xe9" - "\xb3\xe1\x19\xee\x9b\x5a\xe1\x79\xb2\xf0\x0c\xf7\x4c\x0d\xdc\x5d" - "\x8e\xb1\xbb\x2a\x1d\xca\x32\x83\x43\x79\xdc\x8e\x98\x74\xe7\x7f" - "\xee\xe0\x22\xeb\x31\x8e\xf0\xf0\x8c\xf3\x64\xc4\x49\xc9\x23\xbf" - "\x46\x1b\x69\x4d\xb3\xf3\xe7\xda\x09\xb1\xe9\x86\x37\x4b\xe2\x7e" - "\x09\x3e\xc1\x44\x3c\xdf\x1c\xea\x3c\x9e\x66\x0f\x6b\x87\xfb\x5e" - "\x9a\x7d\x4d\x33\xd4\x19\x9e\xaf\xfd\x0c\xee\xf0\x7c\x5f\x1e\xd4" - "\x19\x9e\xe7\x3e\x0a\xf7\xbd\x9d\x39\x71\x0e\xbb\xe4\xa7\x31\xbc" - "\x7e\xff\xcd\x3e\xbb\xca\x95\x01\x3a\x05\x74\xee\xf6\xe6\x52\x95" - "\x2b\x91\x50\x73\x63\xa6\x0a\xcf\x9f\x28\xde\xe5\xa4\x91\x65\x7c" - "\x99\xf0\x8c\x19\xda\x1d\x23\x65\xdf\xbe\x86\x36\x4b\x1e\x19\x8b" - "\x63\x9f\x34\xf2\x83\x40\xef\x1f\xe2\xdf\xdf\xd0\x5c\xc1\xde\xcb" - "\x89\xf7\xfd\x5c\x7c\xff\xa2\x0a\xc7\xab\xc7\xbd\xc5\xbf\xb7\x76" - "\xb4\x0a\xf5\x8a\xc0\x77\xeb\x91\xd6\x2e\x79\x84\x9d\x43\x26\x89" - "\x2b\xa5\xd9\x11\xe4\x9c\x42\x0d\xbe\xe9\x23\x7b\xed\x92\x87\x5a" - "\x84\xb1\xc4\x0e\xaa\x90\x3b\x59\x1c\x82\xeb\x02\xc5\x48\x91\x73" - "\x26\x7b\xbd\x39\x9b\xd6\x61\x9f\x14\xec\x88\x54\x9b\x1e\x53\xd9" - "\x2c\x79\xcc\x58\xcc\x8f\x35\x34\x1b\x71\xaf\x50\xb3\xe4\xd1\x87" - "\xba\xf3\xd5\x13\xb5\x1b\x54\xf0\xfd\xc7\xd6\x67\x38\xe9\x79\x4b" - "\xfa\xa3\x60\xef\xf8\xf4\x14\xb6\xfe\x9c\xff\x3f\x91\xad\x19\xe2" - "\xff\x9f\xc1\xc6\x4d\x1f\x33\xe2\x6f\xc5\x7d\x00\x77\x4e\x52\x12" - "\x17\xd9\x9c\xc9\xe6\xbc\x1e\x7d\xe4\x20\x67\x97\xaa\x52\xc8\x30" - "\xed\x86\x0f\x20\xff\x47\x73\x7d\xfb\x8b\x1e\x5a\xfe\xdd\x8a\xbf" - "\x01\xed\x0e\x7e\x6c\xe7\xd1\x9e\xf3\x8f\x29\xd4\xe1\x75\xe6\x2b" - "\xc5\xa1\x6d\x63\x3e\xdf\x63\x1a\x8c\x91\xe9\x52\x34\x26\xba\x4c" - "\x65\x89\x6e\x53\xb3\x91\xe6\x37\x67\x46\xba\x24\x84\xad\xdd\x7f" - "\xec\xa9\x3b\x9d\x38\xe6\xf6\x31\xd2\x0e\xe3\x86\xa7\x8e\xbf\xc3" - "\x48\xa4\x96\xe4\x06\x7c\x9e\x4a\x73\x36\x1e\xb2\xb6\xd5\x13\x4b" - "\x32\x9f\xd7\x14\x9a\xf3\x8b\x14\x6e\x78\x96\xa1\x04\x7d\x55\x23" - "\x8e\x15\x7d\x86\x7c\x39\x02\x72\x01\xbe\x3f\x16\xe3\x29\x0b\x9e" - "\x15\x60\x06\xde\xa1\x1f\x89\x7b\xad\x17\xb8\xdd\x18\x17\x2a\xd7" - "\x0e\x7c\x60\xf2\x7a\x0c\x63\x42\x13\xe1\xbb\x2f\x72\x91\xea\x98" - "\xda\x79\x38\xaf\x2a\xc7\x38\x3b\xe7\xf9\xbd\x99\x2e\x3c\xdf\x0f" - "\xed\x25\xa3\xf5\x89\x8f\xbc\xc8\xb0\x60\x83\x61\x55\x72\xca\x82" - "\xb5\x86\x49\x5a\xe8\xc8\x69\x57\x2d\xd5\xae\x58\xb2\x62\x55\xf2" - "\xfa\xde\xfe\xa6\x1c\xca\x75\x00\x70\x52\x85\xe5\x3a\x02\x3e\x2c" - "\x1b\x83\x9e\x6a\x42\x59\x6f\x7f\x93\x9d\x27\x01\x34\x76\x3b\x79" - "\x97\xef\x97\x70\x85\xcd\x85\xb4\x68\x97\x73\x0b\xee\x31\x5f\x8b" - "\x7d\x06\x07\xb1\x92\x76\x28\x1b\x3b\x5b\xb0\x16\xe3\x20\xa4\xa6" - "\x51\x4b\x6a\x3b\xb6\x03\x23\x35\x1f\xcf\xa5\xc5\xef\xc4\x5d\x34" - "\x97\xd5\x37\x4b\xa6\x1a\x2e\x9a\x8f\x1b\x3d\xe7\xff\xb8\x4d\xc7" - "\xeb\x39\x85\xdd\x81\xe7\xff\x74\x53\x0d\xa9\x01\x5e\x76\x99\xd4" - "\x6a\xb0\x03\x8a\xe2\x6c\xb0\x63\xd0\xd7\xe0\xe3\x2f\xfc\x66\x9f" - "\xc5\x4d\x75\x32\x77\x36\x91\xc3\x3d\x92\x46\x36\x6b\xbb\x15\x8d" - "\x06\x7c\x8f\xe7\xfe\xb8\xbb\x75\x24\xfd\x28\xe5\x5e\xd0\x03\x6e" - "\xb2\x09\xe5\xcf\x5a\xd5\x9f\x26\x90\x3e\x8a\xcb\x6f\x24\x27\xa7" - "\x11\x29\xd2\x82\x9f\x44\xe6\xc1\xff\x69\x0b\x89\x12\xe8\x54\x69" - "\x47\x20\xbd\x53\x37\xca\x95\xa1\x93\x77\x65\xe8\x46\x75\x53\x9d" - "\xc2\xda\xe2\x24\xdd\xb7\xec\xab\xbb\xdd\x41\x64\xdb\xc1\x9f\x2a" - "\xe6\xa0\x0d\x16\xed\xb2\xbb\x37\xea\x86\xbb\x36\xea\x64\xdd\xdd" - "\x3a\xb9\x6b\x9d\x4e\xd6\xb5\x4e\x37\xbc\xbb\x53\x27\xb7\x2e\x76" - "\x90\x8f\x1d\xbf\x25\xb5\x2d\xad\xfc\x38\x65\xb7\xb2\x79\x7c\xb7" - "\xb2\x51\xa1\x68\x21\x51\x77\x18\xc0\xaf\x02\x3f\xf3\x2d\xf0\xa9" - "\x01\x13\x0a\xd7\xbb\xfb\x2c\xd4\xdc\x54\x07\xfc\x9d\x33\xf5\x56" - "\x7a\xd6\x9d\xf3\xa4\x4e\xfb\x04\xe8\xab\x2c\x59\x34\xa4\x01\x7e" - "\x9e\x2b\xa4\x39\x3f\xb7\x43\xff\x5e\x0b\x17\xf4\x97\x79\x39\x80" - "\x2f\x37\xbd\x11\x9e\xa3\x91\x96\xd1\xcd\x1a\x6f\xe7\xef\x33\xd2" - "\xf8\x33\x51\x73\x1e\xdb\x5c\xcc\xf7\xfb\xa6\xe6\x7a\xfc\xf5\x43" - "\x32\xff\xfb\xd8\x81\x66\x6f\x4f\xff\x99\x03\x9d\x63\xfe\xdc\xee" - "\x57\x97\xe7\x8f\x70\xe1\x1c\x27\x07\x7c\x3b\x29\x79\x7c\x2c\xc6" - "\x9e\xa2\x19\xd3\x84\x3e\xeb\x54\x7e\x1c\x0b\xf7\x7e\xe3\xb8\x06" - "\x4b\x7b\x9c\x1f\x3b\xe1\xa4\x71\x18\xeb\xbf\x12\xe3\x7d\xe1\x38" - "\x06\xe0\xba\xca\x2e\x79\x1c\xc7\xcd\x86\x41\x7f\xaf\x02\xae\x4a" - "\xb8\x2c\xbf\xc2\xf1\x8d\x6c\x32\xd5\x33\xf6\xe3\xbf\xac\x8f\x43" - "\xff\xf7\x37\xd5\xde\xfe\xef\xe3\xd0\xff\x9d\x6a\x09\x7d\x7d\xe0" - "\xe3\xfa\x7e\xc6\xa1\x65\x18\xb7\x96\xe6\xd7\xab\x0b\xb8\x9e\x38" - "\xb7\x60\x1b\x1e\x3f\x08\x7a\x22\x93\x7f\x67\x6a\xcc\x4c\xff\x9a" - "\x44\xe0\xbb\x0a\x5c\x0f\x01\xcf\xda\x64\x09\xb5\x76\x38\x49\x01" - "\xce\x4b\x44\xef\x72\x56\x5c\x70\x48\xb1\x5d\xd4\x42\x1a\xfc\xf6" - "\x58\xc1\x05\x21\xdf\xc2\xe6\xd2\x8c\xd5\x84\x3f\xbb\x04\xcf\x3f" - "\xc2\xf6\x52\x90\x0e\x7d\x4b\x3c\xab\x29\x19\x75\xf5\xcf\xae\x85" - "\xff\xe5\x48\x47\x15\x8d\x99\x1c\xe4\x01\x6d\xa6\x95\x2a\x1b\xf5" - "\x9c\xf9\xb8\x03\x6c\x48\x05\x1d\xfb\x4e\x02\xb7\xbd\x39\xb7\x33" - "\xe7\x67\x58\x7f\x3e\x96\x30\xc6\x15\xc2\xb1\x13\x37\xf4\xe1\x6b" - "\xcb\x5d\x84\x3e\xea\x22\x87\x53\xce\x43\xff\x43\x1d\xe5\x50\xda" - "\xeb\x1d\xca\xa6\x3a\xb7\xb2\x49\x0b\x57\x8c\x21\x19\xe7\x93\xa7" - "\x8d\xef\x89\x8f\xf9\x75\xff\xf1\x31\x21\xcf\x18\x4f\x8c\x4c\xf7" - "\xba\xd0\xe3\x63\xba\xa5\x27\x74\xc5\xa9\x03\xc7\xc7\x04\x9f\xb5" - "\x0e\xfc\x55\x8b\x27\x96\x89\x9b\x5f\x9f\x4e\x14\x6e\x65\x63\x02" - "\x1f\x0f\xc5\x68\xe1\x63\x9a\xa0\xef\x8a\xb6\xa6\x33\x67\x9a\xde" - "\xe3\x8f\xa2\xfe\x74\x9b\xd5\x5a\xb8\xa2\x21\x3d\xd3\x2e\x99\x5b" - "\xe9\xd1\xad\x60\x73\x0b\xdc\xa3\xb6\xd8\x3b\x71\xcf\x41\xb7\xfe" - "\x61\xa4\x05\x3e\x5a\xe0\xdb\x11\xee\x6e\xfd\x64\xb8\x1e\x82\xeb" - "\xa7\x6e\xf3\xf1\x4c\xb7\xb9\xa9\xc2\x6d\x2e\xdb\x06\x57\x21\x5c" - "\x45\x70\x95\xc2\xb5\x1b\x2e\xf0\x73\xca\xf6\xc2\x1d\xdf\xef\x87" - "\xab\x12\xae\x03\x70\x59\xe0\x3a\xe4\xde\xde\x5c\xe0\x96\xc8\xa2" - "\xe1\x8a\x81\x0b\xca\xd1\xa4\x71\x9b\xed\xad\x6e\x73\x63\x22\xdb" - "\x0b\x3a\x3d\xca\x83\x55\xff\x71\x06\x26\xb1\xf3\x18\x86\x9d\xa0" - "\x2a\x3c\x2b\x38\xed\x3c\xc6\xc7\xd3\x1f\xd6\x75\x84\x76\x2e\x87" - "\x64\xfa\x94\x40\xd8\xc6\xfc\x41\xcf\x74\x87\x98\xdf\xb6\x80\xe3" - "\x30\x9a\xe6\x42\x57\xf4\x3b\x71\xae\x6c\x92\x09\xba\x4d\x52\x9b" - "\xd8\x42\xe2\x1d\x24\xa3\xba\xa5\x8b\x64\x2c\xa6\x6e\x5e\x0f\xa4" - "\xe1\xf9\x2f\xef\xa7\x20\xce\xdd\x34\x41\xdb\x6d\x3a\x9e\xeb\x56" - "\xd8\x2b\xa8\xc2\xde\xca\xc7\xdc\x03\x7d\x82\xe7\x9f\xf5\xf4\x6b" - "\x11\x77\xd0\xb7\xad\x69\x3b\x4f\x36\x2e\xa6\x5c\x0d\x48\x18\xe3" - "\xea\xa9\x24\xe4\x6d\x1e\x7f\x42\xdf\xf6\xc9\x46\x9a\x09\x78\x1a" - "\xe9\x06\xbe\x71\xd8\xa7\x05\xec\xed\x4c\x25\xb1\x1e\xfc\x81\x5d" - "\x57\x7b\xce\x8c\xa2\xc3\xa7\xeb\xe0\x9d\x0c\xcf\x94\x2a\x82\xbe" - "\x6d\x51\x2a\x89\x29\x82\x77\xfc\xf9\x9f\x50\xee\x99\x06\x15\xe5" - "\x5e\xd1\x91\x92\x97\x89\x5c\x79\x9a\x9d\x29\xeb\x06\xde\x7b\xcf" - "\x55\x28\xab\x7f\xea\xb4\x96\x1c\xd6\x7d\x01\xf6\xb9\x02\xe4\x52" - "\x56\xdf\x0d\x36\x0c\x78\xe9\x0e\x8d\x97\x4f\xd8\x2f\x15\x2f\xbb" - "\xa3\x77\xd9\x19\x3f\x13\x09\xf2\xac\x37\x3f\x91\xc7\x1b\x5a\x80" - "\x9f\xc0\x57\xeb\x51\x37\xf4\x4f\xc9\x42\x0f\x3f\x77\x00\x3f\x81" - "\xa7\x1a\xe4\x29\xf0\x83\xe7\x29\x15\x78\x5a\x22\xe2\x29\xe8\x2f" - "\x3e\x3e\x21\xf2\x94\x03\x9e\x96\x04\xe0\x69\xcf\x18\x01\xf0\x74" - "\x67\x50\x3c\x2d\x1f\x04\x4f\x67\x4c\x08\xc4\x53\x17\xfa\x0e\xf9" - "\x65\x75\x14\x74\xa3\xd5\xf5\x31\x1f\x6b\x93\x9a\x9a\x62\x38\x53" - "\x93\x96\x53\x1c\xaf\xc7\x33\xc2\x71\xbe\x1f\xcf\x30\xe3\x63\x43" - "\x95\xd3\x8b\xee\xfc\xe6\x58\x4c\x03\xdd\xa6\xbf\x13\xd7\x18\x19" - "\xec\x60\xbf\x68\x65\xed\x05\x1c\x5f\x8b\x5f\xd1\x85\xbe\x77\x7e" - "\xf3\x2a\x8e\xea\x09\xea\x95\xf9\xb7\x12\x59\x17\xe8\x0e\x43\x2a" - "\xb9\xb1\x00\xf4\x61\x97\xb9\x29\xe6\x94\xe4\x29\xf9\x54\x03\x47" - "\xe1\xca\xc0\x98\x91\x1c\xe8\x5d\xd0\xe7\xbc\x7c\x51\x66\x38\x6f" - "\x58\x33\x1f\xf7\xb0\x3c\x75\xf1\x93\x44\x17\xc9\xd0\xf7\x95\x2f" - "\x97\x91\xa0\x75\x9b\x06\x6e\x27\x78\x8e\x62\x5a\x2b\xca\xb5\x82" - "\x58\x5b\xbc\xed\x84\x13\xf4\x34\xca\x02\xdb\x05\xb6\x91\xad\x22" - "\xfd\x0c\xba\x5f\x5d\x2c\x9c\x2b\xe2\xce\x06\xfd\x8c\x31\xe4\x41" - "\x96\x78\xde\x88\xdf\xf6\xb1\x11\xda\xc7\x06\xfe\xcc\x27\x0d\xf0" - "\xa3\xa2\xab\x93\xc9\x10\x65\x66\x75\x55\xf1\xf2\x2b\x10\xec\x01" - "\xe3\xbb\xfd\xdf\x94\x26\x80\x4f\x17\xa7\xe7\xf2\x9b\xb5\xb4\x53" - "\x3f\x0a\xcf\xfd\xda\x79\x06\xf0\xb4\x18\x7c\xa8\xb3\x60\x2f\x56" - "\x02\xbe\xce\x90\x98\x9d\x2b\xc1\x2f\xea\xc4\xb3\xdb\xa0\x3c\xeb" - "\xd9\x99\xb7\x5c\xce\x74\x13\xbc\xe3\x63\x60\x72\x9e\x18\x98\xe7" - "\x74\x38\xb6\xe1\x1d\x73\x5a\xa5\x93\x7a\xbf\x79\x3d\x71\x2b\xe2" - "\xf4\x6c\xcf\xea\xcc\x0f\xf9\xb1\x60\xb9\x13\xfb\x0b\xa4\x4d\x32" - "\x93\xdf\x2b\x48\x73\xdd\x9b\x0d\xe9\xb8\x96\x68\xe6\x1e\x9a\x3f" - "\xcc\x68\xc0\xf3\xbb\x3d\xef\x32\x12\x90\x0f\xda\x3b\x32\x09\xd8" - "\x80\xb8\x5c\x3c\xd7\x1d\xe3\x89\x85\x86\xc5\x99\x16\xcc\xcb\x6d" - "\xba\x1e\x6d\x7d\x1c\x97\x7f\xbd\x02\x74\x4a\x2c\x7d\x05\xea\xfa" - "\x32\xd4\xf5\x14\xf0\xf5\x14\xd4\x75\x9d\x50\x57\xe1\x3c\x3b\x0e" - "\xf8\x0f\xef\xfc\xdb\x47\x4f\x5d\x5f\x01\x7e\xe7\x9e\x9f\xb5\xe9" - "\x34\xb9\x8e\x82\x4f\x5e\xd3\xc6\xef\x17\xea\xb4\xba\xbe\x20\xf8" - "\x5d\xde\x7e\x9b\xca\xca\xe7\x00\x1e\x91\xe7\xe0\x6b\x43\x5f\xb2" - "\x91\x78\xe4\x80\xe5\xa1\xdd\xfa\x51\x25\x2b\xa1\x3c\xc8\xfb\x33" - "\x64\x3c\xb6\x67\xe0\x7d\x4c\x09\xf2\xdf\xf7\x4c\xe9\x28\x5e\x06" - "\xc3\x41\x06\x2b\x05\x19\x98\x05\x19\x80\xcf\x0c\xb6\x18\xc7\x7a" - "\x34\x25\xd9\x4c\x06\xa1\xf1\x28\xbe\x65\x88\xdb\xeb\x84\xc0\xed" - "\xf5\xe7\x37\x75\xb1\xbe\xb4\x04\x63\x71\x42\x3f\x61\x0d\xd7\x0d" - "\xed\x36\x5f\x68\xb7\x54\xff\x53\x4f\x9b\x3d\x29\x99\x75\x30\xb8" - "\x36\xfb\xf4\x7b\xdf\xd1\x36\x1b\x75\x69\xdb\xec\x33\x6b\x7d\xdb" - "\xec\x33\xe5\xbe\x6d\xf6\x99\x17\xbd\x6d\x56\x78\x37\x24\x6d\xf6" - "\x99\x94\x6f\xa6\xcd\x3e\x93\xe2\xa7\xcd\x46\x05\xd1\x66\x35\x01" - "\xda\xac\xe6\xd2\xb5\xd9\x9f\x17\x5e\x3e\x1b\xfb\xac\xad\x4b\xea" - "\xc7\xc6\x6e\x14\xd9\x58\x25\xda\xd8\xd9\x49\xfe\xda\x6b\x77\x11" - "\xb4\x57\x85\xd0\x5e\x5f\xf8\x2b\xe4\x37\x67\xc9\xc7\x8d\x03\xb7" - "\x57\x57\x91\xd7\x7f\x0a\xd8\x66\xf5\xd8\x66\xcb\x89\xd5\xce\xb7" - "\xd9\x85\x9e\x36\x5b\x24\xf4\x87\xfa\x69\xb7\x51\x81\xda\x2d\x9e" - "\xf1\x85\xe7\x7b\xf5\xdb\x6e\x05\x7f\xa9\x7b\x2c\xb6\x5b\xcb\x15" - "\x66\x6b\x9f\xbd\xdd\xb7\xdd\x3e\x9b\xe8\xdb\x6e\x9f\xfd\x9e\xb7" - "\xdd\x0a\xef\x86\xa4\xdd\x3e\x3b\xfe\x9b\x69\xb7\xcf\x8e\xff\xf6" - "\xd8\xda\xe7\x02\x9e\xff\x37\xf4\xb6\xf6\x85\x5f\xf3\xed\x36\x90" - "\xad\xcd\x10\x6c\xad\x12\x6d\x6d\xc2\xad\xc1\xb5\xdd\xe7\x6f\xfa" - "\x8e\xb7\xdd\x4b\x6c\x73\x9f\xff\xca\xb7\xed\xbe\x10\xed\xdb\x76" - "\x9f\xff\xd4\xdb\x76\x85\x77\x43\xd2\x76\x9f\x6f\xfd\x66\xda\xee" - "\xf3\xad\xdf\x1e\x9b\x3b\x57\x11\xa8\xed\x6a\xc7\x91\xcc\x66\xc9" - "\xdc\x25\xd6\x22\x7e\x6d\x60\xa6\xd5\x35\x89\xb0\x35\x2c\x73\xcd" - "\x56\xcd\x44\xc2\xe5\xab\x73\xf1\xac\x09\x5c\x4b\xf3\x2b\xd1\x5a" - "\x15\xb6\xb6\x62\xee\x7b\x9e\xb5\x36\x3b\x85\xf3\x28\xfa\x5b\x6b" - "\x43\x4d\xea\x68\xe1\x77\xad\x6c\x7d\x8d\x5a\xeb\x79\x66\xb1\xb0" - "\xe6\xb6\x51\xb3\x5a\xe3\x50\xaa\x03\x9d\xbb\x2d\x8f\xcc\xa2\x14" - "\xcf\x71\x3a\x37\x6e\x9f\xe1\x5c\x1e\x21\x05\xfc\x5c\xcc\xbc\x18" - "\xf8\xed\x0c\xb6\xc6\xe2\xb9\x59\xe7\xb2\x67\x11\x48\x9b\xe8\x49" - "\xe3\xcf\xd5\xce\x8e\xa0\x1c\xbc\x03\x1d\x32\x79\x67\x3a\x91\x63" - "\x7c\xd1\x3b\x2e\x20\x16\xe7\x4d\x03\x1d\x11\x85\x67\x41\xe1\xf9" - "\x1b\xf4\xfb\x3f\xe8\x28\x69\x27\xb2\xda\xcd\xfc\xf8\x33\xae\xd1" - "\x29\xcd\x47\xfc\x47\xdc\x56\x48\xa5\x32\xc2\x15\xbf\x33\x8d\x2a" - "\x9b\x74\xfc\x9a\x60\xc0\x8a\x67\xdd\x0e\x9e\xa3\xc6\x8d\xdd\xd5" - "\xea\x89\x6f\x49\xa1\x7c\x7f\x4b\x77\x48\xf1\xfc\xf3\x92\x64\xa2" - "\x86\x4b\x41\xcd\x4d\x3a\x28\x57\x9d\x67\x3c\x31\xe0\xfa\x6e\x3c" - "\x1b\xf8\x07\x1a\x99\xb0\x46\x08\xf7\xe9\xf2\x3e\xd3\x56\x29\x97" - "\xeb\x86\x74\x9a\x9d\xc1\x9f\xc7\xa5\x02\x5e\xe0\x9a\x5c\x3c\x27" - "\x89\x2b\xd9\x67\x78\xf5\x06\x42\xde\xdf\xd0\x2a\xc5\xf5\x20\xee" - "\xff\xfa\x41\x87\x25\xfd\x6e\x8c\x63\xc1\xc7\x40\x3f\x29\x79\xb1" - "\x26\xfe\x2b\x76\x0e\x30\xfc\x6f\xc3\x39\x98\xa7\xe0\x19\xd7\x07" - "\x70\xe7\x34\x32\xa4\x85\xf4\xd7\x2c\xa9\x0d\x44\x65\x20\xf2\x7c" - "\xa8\x9b\x40\x3b\xbb\x83\x8f\x5d\xf3\x22\xbf\xee\x16\x9e\xf5\x38" - "\x6f\x00\xbf\x93\xe3\x3a\x28\x5a\xf4\xce\x34\x5e\x3f\x98\x9a\x74" - "\xdc\xd8\x77\x84\x3d\x53\x4d\xba\xad\x50\x67\xa0\x51\xe0\x9a\x1f" - "\xfe\x9e\x4e\xd4\xdb\x92\x31\x5e\xea\x8b\xf5\x70\x57\x58\x56\xe2" - "\x7a\x95\x17\xa7\x60\xde\x81\xf7\x0d\x34\xe9\x68\xb6\x8c\xb0\xbd" - "\x3f\x92\x4f\x9b\x25\xf3\x8d\x2a\x09\xa5\xb4\x68\x57\xeb\xab\x38" - "\xce\x8d\x6b\xb5\xf9\xf5\xe7\xf3\x9f\x86\xfc\x65\x3b\xf9\x71\xdc" - "\xf9\xb1\x76\xc9\xbc\xc6\x9e\x75\xfe\xfc\x9c\xd3\x7c\x5c\x57\x25" - "\xc1\xdf\x08\xf4\x5a\x86\xbf\x26\x9d\x36\x3d\x82\xc2\xf3\x6a\xb6" - "\x9e\x5b\xbe\x14\x7e\x6f\xf0\xae\x63\xe3\x7f\x07\x58\x9a\xbf\x19" - "\x64\xc6\xaf\xb9\xc1\xe7\x80\x6b\xa5\x05\xb9\xd5\x68\x00\x1b\xbd" - "\x65\xe7\xc1\x08\xe0\xc2\x83\x11\x2c\xef\xef\xd3\xed\x52\x36\xc7" - "\xb1\x80\x5f\xb7\x96\x0f\x32\x74\xef\xd0\xc8\xf8\x38\xe2\xdd\x28" - "\x17\x5c\x73\xbf\xe0\x08\xca\x65\x2b\xd8\x02\x46\x3b\xbf\xcd\x5b" - "\x7e\xfe\xb7\xbc\x3c\x39\x90\x05\x5b\xfb\xbf\xa0\x98\x3f\x93\x06" - "\x74\x06\xae\x3b\x3f\x64\x84\x72\x21\x6e\x01\x23\xef\x27\x3b\xa5" - "\x25\xa9\x2c\xfd\x6f\xed\x4e\x29\xae\x25\xc1\xf1\x70\xf3\xcb\x44" - "\x86\xe3\xea\x98\x27\x8d\xde\xd5\x7a\xa7\x47\x8e\x1b\x40\x76\xa9" - "\x80\x5d\xe0\xf9\x56\xe0\x5f\x49\x17\x3f\x67\xd5\x5a\xc2\x11\x05" - "\x07\x74\x76\xc9\x82\x7a\xc8\x4f\x5d\x7c\x3d\x75\xe0\x5a\x6f\xe0" - "\xe1\x86\xce\x9c\x05\x3d\xfb\x1f\xb0\x4c\xb8\x56\xdb\xcc\xaf\xd9" - "\x5f\x10\xcb\x30\xb4\x80\x78\xea\x1c\x88\x9f\xe6\xf7\x49\xb4\xf9" - "\x0e\x32\x91\x53\x4c\xd2\xd3\x88\x1f\x94\xe2\x78\xf3\x4c\xa8\x35" - "\xc6\xcd\x8f\x7f\xed\x04\xb5\x3a\xdc\x84\x53\x4e\xd2\xe3\xfc\x84" - "\xfb\xd5\xdb\x46\xc7\xaf\xc7\x3d\x16\xc7\x73\x33\x9c\x44\x6d\x4d" - "\x77\xb0\xb3\xd3\xc8\xd7\xc4\xbd\x06\x74\x38\xe8\x75\xb0\xa9\xb2" - "\x8c\xaf\xc9\x18\xe4\x17\xa7\x3c\x9e\x7b\x52\x92\xb8\x65\x4e\x0a" - "\xc9\x0c\x4d\x8f\x26\xf2\xe7\x14\xa1\x7f\x01\x3a\x5f\x8a\x6b\xf4" - "\xac\x0e\xf0\x4f\xcc\xc7\x43\x8c\xf7\x91\xd8\x67\xbd\xb5\xb8\xde" - "\x1c\x8e\x43\x0b\x75\x8e\xc7\x3a\x77\x38\x09\x8e\xe5\xcf\x5c\x8d" - "\xf1\x49\xcf\x13\xce\x3c\x49\x8f\x75\x06\x5f\x47\x1e\xfa\x98\xfe" - "\x42\x4d\x7f\xdf\xa6\xc0\x6f\xee\xd5\x1f\x94\x72\x8a\x26\x39\x7e" - "\x1b\xcb\x80\x7b\x76\x66\x9e\x27\x3c\xdf\x91\xff\x56\xa7\x9b\x50" - "\xa5\xb8\x0c\xae\x50\xcb\x10\xb8\xfe\x77\x90\x68\xd3\xfb\x4c\xee" - "\xee\x57\x05\x1e\xe8\x71\x9e\xac\x49\x8e\x71\xf3\x67\x62\x19\x1c" - "\xa7\xc9\x53\xa7\x09\x2f\x7f\xab\xae\x8d\xb8\x23\x6e\x1b\x8d\x6b" - "\x2f\x50\xfe\xe9\x2e\x90\xff\x05\x27\xc6\x14\x71\x58\x33\x2f\x12" - "\xf4\x5f\x5c\xe7\x74\xd2\xbe\xf2\x7f\x69\xcb\x1c\x63\xa8\xf2\x7f" - "\x69\x88\xe4\xff\xd2\x15\x50\xff\x45\x61\xd4\x7f\xd1\x10\xd5\x7f" - "\xd1\x15\x50\xff\xc5\x61\xd4\x7f\xf1\x10\xd5\x7f\x71\xc0\xfa\x3f" - "\x36\x86\xa3\xfc\x9a\x9c\xc8\xcf\x1d\x68\x03\x98\xbd\x5a\x92\x85" - "\xeb\x6f\xf8\x3d\x5a\xc2\x33\x61\x7b\xb6\xe4\xbd\x9e\x15\xbd\x9e" - "\xd5\xbd\x9e\xa3\x7a\x3d\x6b\x7a\x3d\x47\x7b\x9e\xc1\x8e\x0c\x3b" - "\x23\x59\xfc\x35\xf8\xa5\x99\x76\xc9\x12\x93\xf0\x3e\x06\x63\xee" - "\x80\x4d\x8f\x09\x74\x7e\x9f\x52\x42\x68\xb7\x94\x12\xfe\x5c\x3d" - "\xc9\x52\xd2\x95\x4d\x28\x8d\xb8\x41\x87\x67\x9f\x71\xa6\xb2\xfd" - "\x33\x41\x4f\x5b\x1d\x4e\xf0\xf3\x35\xc3\x21\xef\xef\xe3\x99\x8e" - "\x28\x57\x6d\x32\xae\xaf\x59\x72\x1a\xeb\x79\x87\xc1\x42\xb8\x88" - "\xdb\xf8\xf5\x0d\x9c\xb9\x6c\xbf\x23\xe2\xb6\x1b\xe8\xf6\xe6\x02" - "\x73\x36\x27\xb7\xb6\x1d\x25\xf9\x52\x4e\x9b\x96\x06\xf2\x6d\xdb" - "\x4f\x36\xb6\xd1\xd6\x34\x17\x75\x5a\xe7\x59\x48\x86\x03\xcf\x44" - "\xa9\x22\xb5\x8e\xa3\xfc\xb9\x28\xfc\xf9\x2f\x8e\xfd\x04\xfd\x9f" - "\x0c\xa4\x81\xb4\x5a\xc7\x5e\x52\x03\xcf\x96\x95\xff\x82\x7a\x2e" - "\x2d\xb6\xb6\xed\x85\xfe\x52\x59\x05\xa7\x28\xdb\x46\x15\x65\x85" - "\x35\x6d\x78\x9e\x4a\x59\x11\x96\xb5\x16\xca\x61\x75\x55\x62\x3f" - "\xab\x88\xcf\xb7\xa3\x8e\xef\x93\xe2\xbc\x2d\xa7\x04\x7a\x65\x59" - "\x21\x96\x0f\xcb\xe6\xdf\xdf\xad\x8f\x81\xb2\x4f\x9a\xa3\x93\x11" - "\xdc\x57\x11\x1a\x46\x96\x5a\x02\xfb\xd1\xf5\xbb\x59\xbe\xf2\x30" - "\xf2\x5d\x16\x50\xff\x53\x93\x4d\x28\xaf\x3a\x9c\x7c\xfb\xac\x49" - "\x17\xe5\x2b\x94\x57\x1b\x4e\xbe\x55\x81\xf3\x6d\x10\xca\x1b\x17" - "\x46\xbe\x7a\x6d\x3f\xf9\x0a\xe5\xcd\x0c\x27\xdf\x80\xfb\x8b\x11" - "\x0f\xe1\x61\x41\x5f\xdd\x1f\x16\xc2\xc3\xc1\xf2\x7e\xea\x6f\x8b" - "\x09\x0f\x03\xcb\x53\xfa\xc3\x40\x78\xf2\x5f\xde\xaf\xfc\xc3\x93" - "\xfd\xcb\x7d\xce\x7c\x17\xcb\x3e\x3c\xb9\xbf\x1c\x10\xff\xd8\x37" - "\xa0\xa6\xcf\xed\x34\xb2\x39\x93\xcb\x2f\xb3\x73\x91\x9f\x37\xbf" - "\xca\xc5\x91\xc7\x36\x11\xa2\x2a\x24\xd7\x3e\x56\x7c\x82\xc6\xf1" - "\x7d\xee\x57\xe4\x9b\x8a\x88\x14\xfa\xd0\xd2\xf7\x36\xd4\x4b\xad" - "\xae\x89\xa8\xb7\xdc\xbb\x53\x9d\x92\x1f\x42\xfa\x87\x60\x07\x3b" - "\xc0\x97\x65\x79\x95\xd9\xf3\xd3\xe3\x08\xbf\xe7\x0e\xfa\x11\x33" - "\x57\x9f\xa0\xb8\x97\x39\xfe\x6b\xd0\xaf\x85\x18\xff\x90\x5c\x0b" - "\xbf\x75\x01\x8e\x21\x1f\x27\xf9\x3d\xe7\x90\xcc\x74\xf0\xb4\x0e" - "\xb6\xe6\xfd\xf3\x66\xec\x2b\xd0\x0c\x1d\xc6\x32\x73\xc0\xb7\xd7" - "\x47\x38\x88\xb4\x84\x3f\x8f\xe7\x95\x14\xbb\x24\x69\xb1\xb0\x6f" - "\xb5\x8d\x8f\xb9\x07\x65\xc7\x98\x7b\xaf\x42\xbf\x01\xe9\xef\x30" - "\x10\xe9\x47\x7c\x8c\xe2\x57\x4a\x31\x0e\x5f\x7f\xfb\xbf\xdd\x26" - "\xfb\x21\xfc\x3d\x35\x81\x7d\x3e\x4d\xa4\xb5\x1d\x0e\x42\xa3\xdf" - "\x89\xcb\x87\xfe\xc9\xd4\x5b\x71\x3c\xa5\x9d\xa4\x6f\xa2\x1c\x8e" - "\x6d\x51\xc5\x71\x23\xae\x3f\x64\x31\xe2\x93\x26\x63\x5f\x5f\x38" - "\x87\xe9\x86\x53\xf0\xcc\xf7\x91\x70\x1d\x8e\xa2\x4c\x4f\xf3\x95" - "\x71\xb5\x1d\xed\x84\xc5\x39\x4f\x7a\x08\xe3\xa1\x9d\x53\xd8\x2d" - "\x1d\x0a\x7b\x55\x67\x4e\xd2\x44\x4f\x1d\xf0\xfb\x9e\x74\xec\x13" - "\x22\x1d\xbc\x4f\xf0\xec\x07\x0f\x70\x56\xf1\xe8\x78\x0d\x75\x20" - "\x7f\x59\x59\x56\x1c\x44\x19\x50\x93\xbd\xb2\x23\x43\x37\x8e\x8d" - "\x91\x24\xb5\x60\x5f\x1b\xca\xbd\x9b\xf5\x7b\xcb\x76\xf3\x7b\xff" - "\xc1\x1e\xcc\xd1\x49\x43\xf4\x89\x93\xf8\xbd\xb0\x96\x71\x68\x7f" - "\x57\xbc\x0b\xf9\x3f\xd8\x2c\x59\x21\x9c\x83\x5b\x56\xc9\xf6\x74" - "\x26\xed\x86\x6f\x54\xc2\x73\x22\xd2\xc1\x7b\x9d\xf0\xde\x22\x7a" - "\x6f\xc1\xf5\xa8\xc2\xfb\x69\xc2\xfb\x43\xa2\xf7\x87\x0c\xe3\x70" - "\xdc\x63\x85\x01\xeb\x00\x7c\x2c\x85\xf7\xfb\xf9\xb8\x09\xfc\x19" - "\x91\x65\xa5\x02\xdd\xfe\x36\xc9\x8a\x2d\xe7\x00\x63\xf0\xfe\x80" - "\xe8\xf7\x07\x3e\x32\xc6\x92\xc7\x8a\x91\x87\x2b\x8a\xec\xd2\xe3" - "\x42\xcc\xe9\xa4\x72\xbe\xee\x60\x43\xc5\xf9\xd9\x25\x2b\xf4\x68" - "\x27\x3b\xc0\x47\x03\x9a\x02\xfc\xa6\x98\xdf\x9e\x9d\xa5\xda\xc5" - "\x2b\x16\x6a\x17\xad\x5a\xbb\x12\x77\x06\xfa\xee\x79\x53\xe3\xde" - "\x59\xce\xd4\x58\x6e\x2d\xc4\xbd\x7c\x6a\x7e\xdf\xf8\x36\x5c\xa3" - "\x15\xd9\x64\x77\xe7\x37\x19\xb8\xc8\xe3\x05\x96\x0d\x8f\x92\x33" - "\x92\x95\xfc\xfc\x81\x15\x34\x9b\x09\xde\x5b\x36\x7c\x8c\x69\x7c" - "\x1c\x66\x3c\x2b\x86\x1f\x0f\xd8\x20\x27\x87\xb4\xed\xfc\x98\x02" - "\xbc\x5b\xcf\x8f\x9f\x9c\x27\x52\x57\xb6\x9c\xec\x4b\xaf\x93\x1e" - "\xe0\xec\xd2\x7d\x5c\x3d\xbf\x16\xfa\x23\x4d\x15\xb9\xd3\x28\xc7" - "\x33\xe6\xa4\x1f\x40\x3f\x1d\xdf\xe3\x3b\xcf\xde\x22\xf8\xfd\x11" - "\x7e\x5d\xf4\xcd\xec\xff\x8c\x42\xda\xf4\x91\xc6\x21\xec\x29\x5f" - "\x39\x16\xcb\x8a\xeb\x1c\xdb\x24\x2b\x6f\xc2\xf2\xd9\x25\x2b\xb5" - "\x11\x45\xfc\xfa\x70\xc5\x19\xc9\x2a\x25\x67\x6e\x2c\x47\xdd\xe0" - "\xca\x59\x71\x94\x66\x2b\x7e\x8b\xfb\x0a\x8b\xde\xf0\xec\xa1\x5d" - "\xe9\x14\xed\xb3\x53\x9c\x93\x92\x87\x3b\x73\x56\x29\x3c\x31\x33" - "\xf0\xec\xa2\x40\xba\xc6\x09\xfe\xe3\xc5\xe8\x5d\x55\x9c\xa2\x11" - "\x64\xd1\x58\x5e\x35\x85\xe0\x98\x8e\x04\xd7\x25\xb7\x49\x56\xcb" - "\xa8\xb2\xb1\x30\x1d\xdb\x74\xfe\xf1\x82\xdf\xf2\x31\x98\x9a\xec" - "\x7b\x71\x8d\x21\xf0\x72\x0f\x3c\x7f\x3c\xad\x9c\x68\x9f\x41\x7f" - "\x6c\xd5\xa6\x27\x17\x53\xd7\x6d\xb3\x2c\xa4\xba\xe5\x8f\xe4\x93" - "\xa3\x55\x44\x31\x8f\x44\x64\xd8\xa9\x9b\xaf\x63\x0a\x91\xc6\xdb" - "\x49\x04\xc6\x73\xc2\x18\xee\xb8\x47\xa3\xd6\x59\x03\x3e\xd2\xfb" - "\x29\xef\xa5\xb7\x0e\xd3\xce\x24\xe0\x5b\xb1\xf9\x6b\x7e\x0f\x92" - "\x83\xdf\x17\xae\xc4\xb1\x74\xd1\xde\xa3\x6d\x69\x89\x94\xdb\x74" - "\x9a\xc8\x6b\xf4\x5f\x90\xf8\xc4\x08\xca\xef\x3d\x32\x02\xa1\x03" - "\x64\xbf\x8e\xad\x13\xdc\x7e\x81\x44\xd5\xa6\xd8\x89\xb5\xad\x8a" - "\xec\x48\x26\x51\xb4\x53\x3f\xb2\xba\xea\x63\x42\xf3\x27\x27\xfe" - "\x3e\xdd\x32\xcc\xad\x60\x6b\xb7\x54\x59\x12\x1c\x3b\x8d\x34\xe1" - "\x1a\xae\x0b\x24\x76\xc1\xbf\x32\xf9\xf1\x5e\x1c\x5b\x77\x75\xea" - "\xb4\xdd\x9d\xba\x9b\xbb\xd6\xe9\xc6\x79\xc6\xe4\x5f\x3c\xad\xc6" - "\x39\x88\x04\x9a\xb3\x30\x11\xf7\x2d\xa1\x2f\xea\x52\xc6\xe9\x71" - "\xfc\x9d\x8f\x4f\xb3\x4e\x17\xcd\x2d\xd2\x91\x3b\x1d\xfc\xbe\x28" - "\x9c\x13\x50\x97\xbc\x84\x65\x6d\x27\xfc\x3a\x24\x25\x5b\x87\xe4" - "\xc4\xf9\x70\x45\x93\xe6\x29\x30\xab\x5d\x63\x77\x55\x59\x8d\xbf" - "\x25\x19\x17\x69\x13\xdf\x47\x30\x02\x6e\x73\x56\xc5\x50\x65\x93" - "\xe6\xb0\xee\x18\xda\x96\x89\xa1\xeb\x07\x03\xbf\x96\x15\x79\x03" - "\x72\xb2\xef\x6d\x47\xb9\x1d\x2f\xf8\x5d\xb2\x43\xfa\x44\x0b\x75" - "\xd5\x2c\xfe\x2d\xf9\xa4\xbe\xce\x47\x3e\xbc\x3c\x81\x0e\xe5\x84" - "\x32\x42\x59\x79\xe5\x74\x8c\x97\xd3\x5e\x8e\xc9\xa9\x4b\xf1\xb9" - "\xdd\x23\x2b\x67\xd1\xae\xfa\x60\xe4\x55\xdd\xe2\x5f\x5e\xc0\xe7" - "\x1e\x79\xbd\xd5\x4e\xa2\xac\x6d\xe0\x37\x83\xbc\x9e\x78\x9a\x90" - "\x27\xf6\x50\xae\x66\xda\x67\x3d\x72\x73\x99\x02\xc8\xed\x2b\xaf" - "\xdc\x40\xfe\xfd\xc9\xad\x25\x14\xb9\x55\xb7\x30\xb9\xb9\x84\xf5" - "\x63\xba\x43\x44\xea\x5c\xa7\x93\x16\x5e\x20\x13\x51\x7e\x33\xfe" - "\xa5\x25\x87\x67\xd7\x80\xcc\xfe\xe8\x23\x3f\xce\x6c\xaf\x04\x19" - "\x54\xa3\x0c\xc3\x6b\x77\x29\x69\xc1\xb7\xbb\xe4\xf3\x57\xdb\xdd" - "\x50\xb5\xbb\xe4\xa2\xc1\xb5\xbb\x94\x69\x57\xdb\xdd\x37\xdd\xee" - "\x52\xa6\xf4\x6e\x77\x3d\x7e\x43\xf2\x92\x15\x0b\x97\xaf\x5c\xbe" - "\x72\x99\xf6\xa5\xf5\x29\x4b\xd6\x30\xef\xc1\xc7\x7f\xd0\xb8\xd3" - "\xe3\xa4\x78\xa6\x7b\x75\x61\x1d\xf9\xfd\x0d\x75\x52\xf7\x97\x1a" - "\x19\x35\x3d\x5b\xc1\x99\x9e\x8b\xc5\xf3\xdd\xb1\x7d\xe2\xb9\xef" - "\x27\x25\x1b\x1c\x18\xeb\x90\xc5\x89\xd9\xc0\xe2\x69\x44\xbf\x93" - "\x80\x73\x41\xaf\x6e\x20\xb2\x57\x71\xdf\xb7\x13\xc7\x5c\xf8\xf7" - "\xcf\x63\x5c\x36\x5a\xfc\x4e\x02\xc6\xea\xe9\x50\x94\x25\x6e\x86" - "\xbc\x1c\xca\xc6\x72\x99\x16\xf7\xb5\xa4\x42\xb9\x57\xb4\x79\x63" - "\x2f\x6d\x88\xa6\xc3\x53\x15\xa8\x17\x70\x1f\xe2\x19\x49\xea\xe9" - "\x8b\x38\x8f\x02\xbe\xf4\x9c\x5b\xe1\x3b\x63\x77\xd5\xf3\x71\x25" - "\x40\x47\xb0\xf7\xc6\x3d\xf8\xfd\x8b\xa6\xe3\x05\xe8\x6f\x9c\x53" - "\x34\xd9\xcf\x99\x9a\x0c\x1f\xa7\x15\x0a\x3a\x62\xdd\x98\x27\x0a" - "\x99\x8e\xa8\xd1\x00\x06\x67\x00\x06\x13\x06\xd2\x11\x22\xec\x8d" - "\x0b\x4d\x47\x20\xd6\x10\x73\x88\xb7\x6b\x00\x6f\x88\x41\x0f\xe6" - "\x7e\x25\x60\x4e\xd5\x48\xd4\x3c\xee\x5c\x0c\x77\xb8\x8f\xbb\xc6" - "\xe8\xc5\x9c\xbb\x37\xe6\x2e\xf4\xc2\x9c\x54\xc0\xdc\x3a\x5f\xcc" - "\xcd\xfd\x42\x4d\x76\xf0\x98\x4b\xf4\x62\xce\x1c\xa7\xf7\xe0\x0d" - "\xb1\x87\x38\xe3\x96\xe9\x48\x4d\x5b\x7b\x0f\xf6\x4a\x96\xb2\xb9" - "\x5c\x7e\xad\xb0\x94\x56\x5c\x5c\x27\xe8\x8a\xd3\x1e\x5d\xf1\x56" - "\x00\x1b\xfd\x45\x98\xba\xc2\xc8\xe2\xbf\x80\xac\xba\x40\x6e\x28" - "\xaf\x27\x34\xa0\x23\x34\xbb\xc8\x27\xb3\xaf\x10\xf9\x24\x0f\x8d" - "\x7c\xf0\x4c\x6c\x28\x8b\x1f\x19\x2d\x68\x1b\x48\x46\x28\x1f\x94" - "\x13\x2f\x1f\x90\x93\x67\xbe\x1d\xe7\x5f\x51\x56\x28\x9f\x3b\xd2" - "\x88\x14\xe5\x55\x92\xca\xf4\x03\xea\x01\x7e\x7d\x77\x2f\xfd\x0e" - "\x3c\x37\xa0\xcc\xf8\x3e\x76\xb6\x72\xd9\xb6\xd1\xde\x33\x74\x3a" - "\x73\x36\x4c\xee\xeb\x43\x6f\x98\xe5\x8d\x3b\x97\x2a\x9c\x0b\xda" - "\x98\xc0\x7c\xf6\x8d\x6f\x0b\x6d\x3e\x0e\xfb\xaa\x7c\xbf\xd4\x0d" - "\xfd\x52\x05\xf4\x4b\x4d\xd0\x2f\xc5\x71\x43\x3e\x26\xc3\x86\x62" - "\x36\xa7\x07\xfd\x50\xe5\x71\x23\xf4\x89\xf4\xc8\x4b\x7e\xfe\x58" - "\x69\xb7\xe0\x7c\x17\x35\x43\x9f\x77\x97\x94\xc0\x73\xd5\x61\x9d" - "\x3b\x44\x1c\x6d\x38\x20\xcc\x8f\x6b\x58\xbc\xc2\x8d\x26\x56\xbe" - "\x54\x7e\x5d\x23\x3f\xb7\x28\xe5\x4a\xdd\xaf\xfa\xce\x2d\x8a\xe7" - "\x9e\x7f\x9f\xee\x10\xe6\x15\x37\xb2\xf8\x5e\xd8\x5f\x02\xbd\xf7" - "\x1e\xf4\x61\xbc\x73\x8b\x9f\xe1\xfb\xb5\xbe\x73\x8b\x1b\x85\xb3" - "\xbb\x36\x96\xe2\x7a\x1a\x78\x9e\xc7\xd2\x53\x53\xc4\xe9\xde\xb9" - "\x7b\x96\x8e\x7b\xb8\x84\xb1\x81\x36\x36\x2e\xb0\xb1\xd2\xd3\xff" - "\x0e\xe0\x2f\x85\xa0\x97\x33\x8b\xbc\x7a\x39\x93\x1f\x3b\xa7\x9a" - "\xe6\xdc\x9a\x3e\x7a\x19\x63\x7d\x65\x0e\x9b\x89\x7a\xd9\x74\x3c" - "\x93\x95\x2f\x6d\x2a\xf0\x24\x02\xcf\xbe\xc3\x74\xdc\xeb\x84\x3a" - "\xba\x98\xd7\xd9\xcd\xc6\xcd\xfc\xfa\x81\xb4\xc5\xbe\xba\x3a\xa3" - "\xca\x57\x57\xa7\x6d\xef\x5f\x57\xa7\xcf\xe9\x5f\x57\xa7\x1d\xbe" - "\xaa\xab\x87\x5a\x57\x7b\xfc\xba\x70\x75\x75\xba\xf6\xaa\xae\xbe" - "\xdc\xba\x3a\x3d\x5a\xa4\xab\x67\xfb\xea\xea\x8c\xd6\xbe\xba\x3a" - "\xc3\xe5\xd5\xd5\x69\x06\x5f\x5d\x9d\xf5\x54\x70\xba\x3a\x73\xfa" - "\xa5\xd5\xd5\x99\x7a\x5f\x5d\x9d\x35\x51\xd0\x3b\xca\xd0\x75\x75" - "\xd6\x98\xfe\x75\x75\xd6\x4d\xbe\xba\x3a\xb3\x83\xe9\xe4\xac\x19" - "\x4c\x57\x67\x09\xe9\x69\x0a\x71\xba\x57\x57\xb3\xf4\xbe\xba\x3a" - "\x6b\xf1\x00\xba\x5a\xe7\xe6\x3c\xba\xba\x1e\x74\x75\xbd\x94\x5b" - "\x16\x48\x57\xe7\x94\xd6\xa0\xae\x4e\x46\x5d\x9d\x53\xda\xbf\xae" - "\xce\x19\x89\x3a\x99\x8f\xf5\xf9\x26\x6d\xe1\x63\x2d\xbe\x49\x5b" - "\x11\xa7\x33\xd3\x20\x1d\xd2\x30\x26\x25\xd2\x31\x1e\x7b\x74\x7a" - "\xf6\x98\x1e\x9d\x0e\x74\xdc\x18\xaf\x4e\x47\x7d\x8e\x7a\xbd\xf8" - "\x4d\x6a\x2f\x79\x13\xcf\x2f\xc9\x8e\xf3\xe8\x76\x33\xa4\xe1\x19" - "\x25\x18\x4f\x09\xd7\x5e\x02\x0f\x5a\x5e\x85\xef\x21\x3d\xd0\xe9" - "\x7d\x6d\xc0\x6b\xd5\xbe\x36\x20\xbb\xb8\x7f\x1b\xb0\xf9\xf9\xfe" - "\x6d\x40\xf6\x91\xab\x36\xe0\x4a\xb3\x01\x9b\x63\xae\xda\x80\x81" - "\x6d\x80\x3f\x19\xf5\xb6\x01\xb7\x0b\x36\xa0\x78\x40\x1b\xb0\x59" - "\x1b\xd8\x06\xbc\xd6\xd6\xd7\x06\xe4\x10\xaf\x0d\xc8\x4e\xf1\xb5" - "\x01\xbf\x78\x3a\x38\x1b\x90\xf3\xd4\xa5\xb5\x01\x39\x49\xbe\x36" - "\xe0\x17\x93\x05\x1b\xf5\x17\xb1\x0d\xe0\x22\x82\xb1\x01\xbf\x18" - "\xeb\xb1\x01\xa8\x63\xdf\xc3\xf9\x86\x1e\x1b\x80\xba\xf0\x17\xb7" - "\x58\x52\x9b\x45\x36\x20\xc7\xc9\x74\xfd\x2f\x66\xb9\x79\x1b\xf0" - "\x0b\x85\x60\x4b\x2a\xc5\xe9\x5e\x1b\xc0\xd2\xdd\x62\x1b\xd0\x8a" - "\x36\xe0\x17\xfa\x01\x6c\x40\x6c\xf0\x36\xc0\xe4\xf4\xda\x00\x93" - "\xd3\x63\x03\x50\xef\xa3\x0d\x40\x9d\x8d\x76\x80\x8f\x5b\xc6\xaf" - "\x37\x31\x2d\x54\x39\x88\x1c\xe3\x14\xe3\x98\x0a\xea\xee\xfc\x76" - "\x66\x0b\x78\x9a\x95\x8c\x06\xf4\x79\x0b\xe8\xf0\x56\xd0\xe1\xad" - "\xe6\x33\x44\x06\x74\xf5\xf9\xb8\x76\x11\x9e\x51\xd7\xab\xda\xc0" - "\x6e\xb8\x78\xbb\x51\x8f\xf6\x86\xf1\xcb\xb4\xd0\xd7\x76\xe4\xce" - "\xf1\xd7\x1f\x28\x10\xd9\x8e\x92\xeb\xe9\xd1\xce\x9c\x5c\xa3\xc7" - "\x1e\xe4\xc3\x33\xda\x8c\x82\x76\xde\x66\xd8\xc1\x66\xb4\x30\x9b" - "\x91\x5b\xd4\x43\x03\x65\xe0\x69\x98\x5d\xa9\x7f\x15\xcf\x7b\x63" - "\x34\x16\x5f\xbb\x62\x8a\xf1\xb5\x2b\xb9\xe7\xd1\xae\x40\x1d\xf0" - "\x6c\x34\x09\x67\x6e\x2c\x74\x17\xef\xaa\x47\x1b\xc3\xde\xe7\xfd" - "\xa1\xc7\xae\x5c\x2f\xb2\x2b\x46\x8f\x5d\xd9\x72\xd3\x15\x6f\x57" - "\x00\xcb\x35\x69\xdf\x25\xbb\x92\x97\x76\x25\xd8\x15\x94\xcd\x35" - "\xa2\xb1\xe1\x40\x76\x05\x63\x58\xd4\x24\x7d\xdb\xed\x4a\x9e\x31" - "\xb0\x5d\x31\x4d\xe9\x6b\x57\x4c\x09\x5e\xbb\x92\x5b\xed\x6b\x57" - "\xcc\x7b\x82\xb3\x2b\xa6\x77\x7b\xdb\x15\xe4\x65\x3e\x5b\x63\xd1" - "\x86\xf6\xc4\x6d\xb6\x5b\x38\xb4\x2d\x61\xd9\x15\xd3\x21\x5f\xbb" - "\x62\xde\x26\xd8\xbd\x83\xa1\xdb\x15\x33\x3f\x76\x94\xef\xb1\x2b" - "\x17\x7a\xdb\x15\xf3\x26\x5f\xbb\x62\x9e\xc5\xec\x87\xb9\x9c\xd9" - "\x15\xf3\x62\xc1\x3e\x1d\x10\xa7\x7b\xed\x0a\x4b\xef\x6b\x57\xcc" - "\x96\x01\xec\x8a\xa2\xbb\x68\x57\x7d\x97\xa9\xc9\xe2\xda\xbd\xcf" - "\x30\x7e\xde\x8d\xee\xde\x6d\x83\xb5\x09\x37\x3b\x37\xc8\x33\xc7" - "\xf5\x2c\x21\xdd\x8a\xcf\xed\x9c\xb0\x3f\xba\x2b\x7a\x57\xd5\xc9" - "\x24\x68\x1f\x6d\x81\xdb\x07\xb4\x0d\xb9\xa7\x6d\xd4\xe8\xff\x45" - "\xa0\xbd\x48\x71\x8e\xeb\x2d\x68\x17\xd6\x8e\x7a\x5e\x8f\x29\x5a" - "\xb4\x04\x63\x5d\x2a\xdb\x88\x5a\x29\x91\x0c\x7f\x12\xbc\x7a\x37" - "\xb4\x91\xa9\xb7\x52\xee\xb6\x46\x2d\x51\xea\x49\x24\xb6\x93\xf7" - "\x85\x39\x14\x8c\x6d\x81\x73\x27\x80\xcf\xd8\x05\x9f\xb2\xf6\xf1" - "\x16\x5c\x5d\xac\x7d\x8c\xeb\xea\xd4\xdd\x1c\x68\xee\xc4\x6a\xb4" - "\xf3\x73\x27\xb8\xf7\x08\xf7\x7c\x71\xd0\x3e\x28\xce\x9d\x38\x59" - "\x9b\x80\xf2\xaa\x77\xf2\x73\x27\xcd\x3e\x73\x27\x3f\x69\x24\x52" - "\x8c\x7b\xb1\x43\x3c\x77\xa2\xab\xe9\xd3\x26\xb0\xad\x60\x9b\x08" - "\x5d\x7f\x6d\x9d\xdc\xdf\x5a\x26\x17\xf0\xda\xad\x68\xb2\xd0\xb7" - "\x9a\x2b\x7e\xd7\xec\x94\x60\x8c\x51\x37\xc8\x8e\x03\x3d\x45\x15" - "\xbd\xf4\x54\xb7\x20\x87\x6e\x26\x07\x90\xa1\x7c\x7e\x07\xa1\x0b" - "\x5c\xe0\x6b\x75\x0b\x71\x46\x9d\x76\xc0\xa1\x6e\x74\xf1\x06\xe4" - "\xbb\x86\x14\x0b\xb1\x46\xb9\x8d\xfa\x91\x1c\xf0\x9a\x66\x4b\xc9" - "\x7b\x17\x9c\xfc\x5c\xa3\xa9\x8b\x8c\x07\xbd\xa4\x44\xbd\x04\xd8" - "\x1d\xb5\xb3\x0b\xf8\xde\xc4\xf8\x8e\x71\xec\xf0\xee\xda\xa8\xd3" - "\x42\xde\x37\x77\x77\x83\x5e\x72\x32\xde\xcf\x5f\xad\x26\x7c\x7c" - "\x52\x9c\x6f\x04\x5b\x5f\x0b\xf2\x46\xbd\x34\xb3\x43\x45\xf1\x2c" - "\x0f\xee\x4b\x1d\xc6\xf4\x8a\xbe\xb3\x03\xcf\x6d\xd1\x21\x36\xd4" - "\x25\x27\x71\xbe\xb1\xc1\x67\xbe\xd1\xb1\xd1\x3b\xdf\x58\x5b\x7e" - "\x8c\xad\x0f\xf1\xb1\x1d\xe6\xa3\xdd\xc5\xbb\xaa\x90\xef\xbc\xed" - "\x48\x09\x95\xf7\x05\x01\x63\xa5\x5f\x7a\xde\xab\xbf\xe5\xbc\xdf" - "\xba\x79\x70\xbc\x7f\x23\x60\xfc\x97\x4b\xcf\x7b\xf9\xb7\x9c\xf7" - "\xbf\x24\x83\xe3\xfd\xaf\x2a\xfa\xe3\x3d\xf6\x3d\x3c\xfd\x0e\x4f" - "\x9f\x03\xed\x18\xb3\xc3\x6f\x4e\xf1\xf6\x37\xde\x9c\xe2\x99\xb7" - "\x05\x9e\xc9\xcc\xc2\x78\x93\x61\x29\x9e\x87\xf1\xeb\xbf\x78\xe6" - "\x6c\xd1\xdf\xe7\xe5\xf8\x16\xc8\x71\x25\xee\x1d\x12\x64\x08\x36" - "\x67\x41\x07\xd8\x85\xb1\xbb\xea\xdd\x66\xb0\x49\xef\xee\x33\x04" - "\x90\xa7\x14\xed\x89\x32\x85\xa8\xe7\x1b\xbc\x72\xe5\x36\x82\x3c" - "\xbb\xc0\xcf\x72\xb6\x12\xdc\x0f\xac\x6a\x05\xff\xab\x5b\x3f\x72" - "\x1e\xf8\xf3\x1e\x99\xbe\x9f\xea\xe4\x7d\x2c\xbf\x32\xdd\xee\x2b" - "\xd3\x73\x7e\x64\xfa\xe2\x72\x68\xa7\x52\xc1\x0f\xe6\x65\x6a\xef" - "\x91\x29\x6f\x47\x36\xea\xa2\x51\xae\x1e\x99\xa2\x1d\xe1\x65\xda" - "\xc6\xec\x48\x4f\xec\xa4\x8d\x5e\x3f\xb8\x3a\xf1\x0b\x3f\x32\x7d" - "\x23\xcd\x47\xa6\x89\xa1\xca\xf4\xd7\x9b\x7d\xfd\xaa\x37\xbf\x0e" - "\xce\xaf\x7a\x53\x82\xbe\x93\xd8\xaf\xc2\xe7\x73\xd0\x57\x77\x2b" - "\xed\x87\x3a\xc2\xf2\xa5\xde\x54\xfb\xfa\x52\x6f\x36\xb2\x32\x6d" - "\xbb\x3d\x74\x5f\xea\x4d\xde\xff\x7a\xef\x2d\xd6\x07\xf6\xf5\xa3" - "\xde\x3c\xec\xeb\x47\xbd\x59\xc8\xfc\xa5\x37\x1d\xe7\xb2\xd1\x8f" - "\x7a\x73\x2f\x4b\xdf\x36\x5e\x9c\xee\xf5\xa3\x58\x3a\x3b\xd3\xfe" - "\x4d\x57\x68\xbe\xd3\xf7\xbf\x61\xdf\x49\xd3\x8f\xef\xa4\xf9\x8e" - "\xf8\x4e\x85\x01\xd7\xff\x5f\xb5\xdf\x03\xd9\x90\xff\x52\x0f\xce" - "\x86\x6c\xef\xb8\x6a\xbf\xc3\xe5\x7d\xa1\x65\x70\xbc\xdf\xd1\xef" - "\xfe\x87\xfe\xed\x77\x89\xcc\x6b\xbf\x4b\x64\x81\xed\x77\xf1\xfa" - "\xab\xf6\x3b\x14\xfb\xfd\xd6\xe4\xc1\xd9\xef\xe2\x29\xbe\xf6\xbb" - "\xe4\x0f\xc1\xd9\xef\xe2\x0f\x87\xde\x7e\x17\xd7\xf9\xda\xef\x92" - "\x22\x56\xa6\x1d\xa7\x43\xb7\xdf\x25\x9b\x02\xdb\xef\x92\xd7\x7c" - "\xed\x77\x49\x02\xb3\xd3\x25\x15\xcc\x7e\x97\x24\xb1\xf4\x1d\x6d" - "\xe2\x74\xaf\xfd\x66\xe9\xcc\x7e\x97\x1c\x08\xcd\x7e\xab\xbe\x61" - "\xfb\xad\xee\xc7\x7e\xab\xbf\x23\xf6\xbb\x74\xe2\x55\x1b\x12\xae" - "\x0d\x29\xa9\x1b\x9c\x0d\x79\x3b\xe0\xf9\xd7\x03\xdb\x90\xdd\xd3" - "\xbc\x36\x64\xf7\xb4\xc0\x36\xe4\x9d\x83\x57\x6d\x48\x28\x36\xa4" - "\x34\x73\x70\x36\xe4\x9d\x5c\x5f\x1b\xb2\xfb\x7c\x70\x36\x64\xf7" - "\xb0\xa1\xb7\x21\xbb\xa3\x7c\x6d\xc8\x6e\x3b\x2b\xd3\xae\xbb\x42" - "\xb7\x21\xbb\x3f\x0c\x6c\x43\x76\x1f\xf1\xb5\x21\xbb\x85\xb3\x32" - "\x76\x77\x30\x1b\xb2\x5b\x88\x6b\xbf\x2b\x56\x9c\xee\xb5\x21\x2c" - "\x9d\xd9\x90\x77\x49\x68\x36\x64\xc4\x37\x6c\x43\xe4\xfd\xd8\x10" - "\xf9\x77\xc4\x86\xfc\xa6\xcf\xf9\x87\xc1\xeb\xb1\x3d\x6a\xaf\x1e" - "\xdb\xa3\x0e\xac\xc7\xca\x5f\xbb\xaa\xc7\x42\xd1\x63\xef\x46\x0d" - "\x4e\x8f\x95\xcf\xf2\xd5\x63\x7b\x0e\x06\xa7\xc7\xca\x6b\x86\x5e" - "\x8f\x95\x37\xfa\xea\xb1\x3d\xe5\xac\x4c\xbf\xb9\x18\xba\x1e\xdb" - "\xb3\x25\xb0\x1e\xdb\xf3\x4b\x5f\x3d\xb6\x67\x31\xd3\x57\x7b\x0e" - "\x30\x3d\xb6\xc7\xc8\xd2\x7f\xe3\x14\xa7\x7b\xf5\x18\x4b\x67\x7a" - "\x6c\x4f\xd5\x40\x7a\x0c\xdb\x45\x8d\xa6\x57\xbb\x78\xc5\xd3\x2e" - "\xf6\x4e\xfc\xa4\xc8\xd3\x2e\xf6\xf2\x3e\x1a\x57\xf4\x4e\xc2\xeb" - "\xa9\x44\x66\xc2\x33\x71\x40\x47\x18\x5e\xc0\x76\xf1\xbb\xf7\x70" - "\x7d\x89\xa2\x11\xf4\x5e\x8b\xa0\x07\x8d\xa0\x07\x5b\xe0\x19\xe3" - "\xa4\x8d\x7d\x27\x01\xf5\x17\xae\xd3\xc0\x67\xa6\x0f\x1d\xc3\xf0" - "\x4c\x1e\x7e\x9e\x5d\xd4\x6e\xf8\xb6\x72\x4e\x68\x2b\xe7\x58\x5b" - "\xf1\xec\x97\x4b\x6b\xa1\x9c\x7b\x8d\x6e\x74\xfc\xe2\x08\x8a\xed" - "\x87\xdf\x87\x05\xed\x87\xae\xd1\x45\x16\x25\x43\x9b\x71\xb4\x12" - "\x8c\x85\x8f\x6d\x46\x99\x25\x89\xa4\xe7\xf4\x23\x41\x27\x32\xdd" - "\xc7\x55\x0d\x73\x61\x5c\xab\x35\xa0\xfb\xda\x41\xf7\xb5\x7b\xdb" - "\x0a\xce\x9d\x9f\x5b\xa3\xd3\x76\xac\xd1\x8d\xeb\x3e\x07\xba\xcf" - "\xd1\xbb\x9d\x2c\x68\xdb\xd9\x8e\xba\xaf\x95\x6f\x27\xbc\xee\x83" - "\xb6\xc1\x9d\x03\xdd\xb7\x4c\xd0\x7d\xe7\x74\xa8\xeb\xd5\x3b\x97" - "\x82\xee\x4b\x3c\xc5\x74\x9f\xe0\xc3\xfd\x10\x75\xdf\x1a\x9d\xf4" - "\x57\xed\x82\xee\x5b\x88\xba\xef\x30\xb4\x91\xbf\xfa\xea\x3e\x65" - "\xb8\xba\xef\x77\x46\xdf\x76\xb2\xf7\x5f\xc1\xb5\x93\xdf\x9d\x0f" - "\xd4\x4e\xba\xcd\xe1\xb6\x93\xbd\x32\xdf\x76\xb2\xb7\x8e\x95\xe9" - "\xb7\xd7\x86\xde\x4e\xf6\xfe\xa1\xa7\x9d\xbc\xd2\xbb\x9d\xec\xfd" - "\x8b\x6f\x3b\xd9\x6b\x62\xed\x61\x6f\x0b\x6b\x27\x7b\x4b\x59\xfa" - "\x6f\xd5\xe2\x74\x6f\x3b\x61\xe9\xac\x9d\xec\x75\x5c\x9d\x2f\xff" - "\xb6\xd9\xfb\xf7\x93\xae\xce\x97\x87\xdb\x67\x7c\x4f\x36\xb8\x3e" - "\xe3\xef\x5b\xaf\x8e\xb7\x87\xcb\xfb\xf7\xf7\x0f\x8e\xf7\x7f\x58" - "\x7c\x75\xac\x24\x5c\xde\x57\xc4\x0e\x8e\xf7\x7f\xb4\x0f\xd4\xc7" - "\x08\xec\x4b\xfd\xc9\x54\xdd\xd3\xc7\xf8\x93\xc9\xb3\x3e\xb7\x6f" - "\x1f\xe3\x4f\x12\xdf\xbd\x74\xfb\x7e\xd9\x7b\xed\xec\x40\x7d\x0f" - "\xd7\xd5\xbe\x07\xc8\xfa\x0f\x7b\x07\xd7\xf7\xd8\xdf\x6b\x7d\xe2" - "\x9f\x1f\x08\xce\xa7\xfa\xd3\xf4\x40\x3e\x95\x2b\xec\xbe\xc7\x9f" - "\x12\x7c\x7d\xaa\x3f\xc7\x08\xd8\x78\x31\x74\x9f\xea\xcf\xc3\x02" - "\xfb\x54\x7f\x56\xfa\xfa\x54\x7f\xb2\x33\xdf\xe9\xcf\x13\x99\x4f" - "\xf5\x27\xe1\x8c\xf0\x7d\xf3\xc4\xe9\x5e\x9f\x8a\xa5\x33\x9f\xea" - "\xcf\x53\xae\xce\xa3\x7f\xdb\x7c\xaa\xff\x63\xb9\x6a\xd7\xc3\xb5" - "\x2d\x7f\x4e\x18\x9c\x6d\xf9\xcb\x37\xb8\xfe\xf3\xdb\x6e\xd7\x2b" - "\xe5\x83\xe3\xfd\x5f\xfb\x5d\xff\xd9\xbf\x5d\x3f\xb8\xd8\x6b\xd7" - "\x0f\x2e\x0e\x6c\xd7\x0f\xd8\x7c\xed\xfa\x7f\x2f\xbf\x6a\xd7\xc3" - "\xb1\xeb\x7f\xd9\x3c\x38\xbb\x7e\x60\xb7\xaf\x5d\xff\xdb\xb5\xc1" - "\xd9\xf5\x83\x37\x0d\xbd\x5d\x3f\x18\xeb\x6b\xd7\x0f\xba\x04\x6c" - "\xdc\x1b\xba\x5d\x3f\xf8\x45\x60\xbb\x7e\xf0\x5f\xbe\x76\xfd\xa0" - "\xb0\x4f\xed\x6f\x6a\x66\xd7\x0f\x56\xb3\xf4\xff\x9e\x20\x4e\xf7" - "\xda\x75\x96\xce\xec\xfa\xdf\xa2\xaf\xce\xaf\x7f\xdb\xec\xfa\x07" - "\x01\xcf\xff\xba\x6a\x5b\x06\xb2\x2d\x7f\x1b\x64\x9f\xf1\xc3\xa8" - "\xf0\x6d\xcb\x47\x16\xaf\x6d\xf9\xc8\x12\xd8\xb6\x7c\x74\xaf\xaf" - "\x6d\xf9\xf0\xf0\x55\xdb\x12\x8e\x6d\xf9\xc0\x3e\x38\xdb\xf2\x11" - "\xf1\xb5\x2d\x87\x56\x04\x67\x5b\x3e\xda\x34\xf4\xb6\xe5\x23\x93" - "\xaf\x6d\x39\x24\x94\xe9\xc3\x5f\x86\x6e\x5b\x0e\x3d\x10\xd8\xb6" - "\x1c\x7a\xc4\xd7\xb6\x1c\x8a\x62\x36\xe4\x50\x12\xb3\x2d\x87\x74" - "\x2c\xfd\xc3\x02\x71\xba\xd7\xb6\xb0\x74\x66\x5b\x0e\x19\xaf\xce" - "\xbb\x7f\xdb\x6c\xcb\xe1\x7e\xd7\xff\xf6\xaf\xdf\xaa\x4a\xbd\xfa" - "\xad\xaa\x34\xb0\x7e\xab\xfa\x9e\xaf\x7e\xfb\xfb\xbb\x57\xf5\x5b" - "\x38\xfa\xed\x90\x69\x70\xfa\xed\x7f\xed\xbe\xfa\xed\x48\x90\xf1" - "\x80\xaa\x5e\x1c\x7a\xfd\x56\xd5\x2b\xfe\xc3\x11\x21\x06\xd0\xdf" - "\x57\x87\xae\xdf\x8e\x8c\x09\xac\xdf\x8e\xdc\xe4\xab\xdf\xaa\x84" - "\xf8\x3f\x47\x66\x30\xfd\x76\x44\x48\xff\xbb\x41\x9c\xee\xd5\x6f" - "\x2c\x9d\xe9\xb7\x23\x09\x83\x9b\x8f\xff\xc4\xee\x9d\x8f\xff\x84" - "\x97\x05\x57\xd8\x9c\xdb\x77\x3e\xfe\x93\x39\x38\x1f\xef\x6d\x2f" - "\x47\x6c\xfc\xdc\x3c\xb6\x99\x0e\x16\xbf\xc7\xef\x3c\xfd\x98\xe6" - "\xdc\xab\xf3\xf4\x97\x72\x9e\xfe\x13\xad\x6f\xfb\xa9\x36\x07\xd7" - "\x7e\x3e\x29\x1e\xfa\x79\xfa\x4f\xf6\xfa\xb6\x9f\x6a\xa3\x80\x95" - "\xb7\x43\x6f\x3f\xd5\xcf\x07\x6e\x3f\xd5\x0b\x7d\xdb\x4f\xb5\xd0" - "\xc7\xac\x36\xb1\xf6\x53\x3d\x4d\x68\x83\xa5\xe2\x74\x6f\xfb\x61" - "\xe9\xac\xfd\x54\x17\x06\xe3\x1f\xb8\x14\x4d\x87\xd0\xde\x8f\x6f" - "\xbc\xd1\xdd\x83\xf3\x14\x01\xe7\xfe\xfc\x83\x97\x98\xbd\xe0\x7d" - "\x83\xdd\xfb\x52\x06\xf4\x0f\x5a\x04\xff\x60\x71\x5f\xff\xc0\xe3" - "\x1b\x14\x01\xbe\xdf\x0a\x6a\x8e\x5e\xc0\x3b\xfa\x06\x17\x42\xf5" - "\x0d\x5e\xf2\xfa\x06\xe6\x5e\xbe\xc1\xb2\x5e\xbe\x01\x8f\xf7\x66" - "\x1f\xbc\xf7\xf1\x0d\x7a\xf0\x3e\x54\xbe\x41\xad\xfa\xea\x1c\x7d" - "\xb8\xfd\xce\xea\xbd\x83\xeb\x77\x5a\x4d\x57\xc7\xf2\xc3\xe5\x7d" - "\xed\x20\xc7\xf2\x3f\x95\x5f\x1d\x6f\x09\x97\xf7\xd6\x41\xc6\x72" - "\xf8\x6c\x73\xf8\xfd\x91\x63\xb3\xbc\xfd\x91\x63\xb3\x3c\xfe\x95" - "\x27\x36\x22\xe8\x67\x99\x39\x19\xae\x0b\x84\xbc\x9e\xcc\x9f\x33" - "\x20\xb7\xb6\x1c\xc3\x73\xd7\xc0\xe7\x3a\x7a\x38\xde\x28\xf6\xb9" - "\xfe\xef\x74\x8f\xbf\x15\x8f\xbe\x18\xf8\x56\xe8\x57\x79\xfa\x20" - "\x18\xd7\xaa\xdf\xf5\xc3\xb7\xec\x4b\xc1\x3e\x4b\xb7\xb2\xe9\xd0" - "\x77\xb7\xbf\xf2\xe9\xac\xc1\xf5\x57\x8e\x16\xf8\xfa\x5b\xc7\xdc" - "\xc1\xf9\x5b\xc7\x94\x43\xdf\x5f\x39\x16\xed\xeb\x6f\x1d\x6b\x15" - "\x70\x22\x09\xdd\xdf\x3a\x76\x24\xb0\xbf\x75\xec\x53\x5f\x7f\xeb" - "\xd8\x6e\xe6\x57\x1d\x73\x31\x7f\xeb\x58\x25\x4b\xff\xbf\x44\x9c" - "\xee\xf5\xb7\x58\x3a\xf3\xb7\xfe\x9f\x3c\x48\x7f\xab\x6a\x10\xfe" - "\x96\xf1\xdb\xe3\x6f\x2d\xba\xc2\xfd\xad\xcf\x33\x83\xb0\x3b\x87" - "\x7a\xd9\x9d\x94\xab\x76\x07\x75\xcd\xff\x8b\x1e\x9c\xdd\xa9\x77" - "\x0d\xc8\x7b\x93\x88\xf7\xa8\xf3\x05\xbe\xbb\x63\xf6\xa5\x84\xcd" - "\x7b\xd0\xf5\xc5\xe9\xdf\x66\xbe\x7f\x5e\x35\x38\xbe\x37\x04\x3c" - "\xff\xf0\xaa\xaf\x35\x10\xef\x6d\x53\x06\xc7\xfb\xe3\x8e\xf0\x7d" - "\xad\x7f\x34\x7e\xd2\xe3\x6b\xfd\xa3\xb1\xb7\xaf\x85\xbe\xd5\x53" - "\x4e\xe6\x73\xbd\x0e\xbe\x52\xde\x4a\xf0\xbb\x52\x09\xb1\xb6\x1c" - "\x24\x26\xf0\xbd\xf2\xce\x80\xff\x95\x04\xfe\x97\xeb\x5d\xc1\xff" - "\xfa\xc7\xd3\xbe\xfe\x57\xe3\x11\xbf\xfe\x97\xd2\xeb\x7f\xb9\xc0" - "\xb7\xea\x7e\x77\x5f\x4a\xc1\x19\x91\x2f\xf6\x72\x5f\x5f\xac\xcb" - "\xdc\x54\xd5\x75\xcb\x3e\x63\x37\xf8\x63\xfd\xf9\x62\x3c\x26\xfc" - "\xf8\x63\xff\x19\xbe\x58\xc3\x81\xc1\xf9\x62\xff\x88\xf6\xf5\xc5" - "\x4e\x6c\x09\xce\x17\xfb\xc7\xf6\x80\x63\x5f\x61\xfb\x62\xff\x28" - "\xf7\xf5\xc5\x4e\xa4\x08\x98\x59\x11\xba\x2f\x76\x62\x4e\x60\x5f" - "\xec\xc4\x8b\xbe\xbe\xd8\x09\x61\xef\xe9\x89\x5c\xe6\x8b\x9d\x98" - "\xc2\xd2\x1b\x93\xc4\xe9\x5e\x5f\x8c\xa5\x33\x5f\xec\xc4\xb6\x20" - "\xe7\xc6\x0e\xb9\xc0\xa6\x7f\xf3\xeb\x29\xfb\x9b\x1b\x1b\xaa\xf5" - "\x94\x2f\x5d\xe1\x73\x63\x4d\x03\x8f\x7f\x5d\xf5\x09\xfc\xe8\x9a" - "\x13\xe5\x83\xb3\x4b\xcd\xb9\x57\x7d\x82\x70\x79\xdf\x34\xc8\xb1" - "\xaf\x16\x59\xf8\x3e\xc1\xc9\x3a\xef\xf8\xcb\xc9\xba\xd0\xc6\x5f" - "\x4e\x4e\xf5\xb5\xff\x2d\xfe\xed\xff\xd5\xf1\x97\x10\x6c\x7e\x73" - "\xdd\xe0\x6c\xfe\x49\xb5\xaf\xcd\xff\x72\x53\x70\x36\xff\xa4\x79" - "\xe8\xc7\x5f\x4e\x16\xf9\xda\xfc\x2f\xf5\x02\x4e\xb2\x42\xb7\xf9" - "\x5f\x4e\x0f\x6c\xf3\xbf\x7c\xda\xd7\xe6\x7f\x19\xc3\x6c\xfb\x97" - "\x69\xcc\xe6\x7f\x39\x91\xa5\xb7\x64\x8a\xd3\xbd\x36\x9f\xa5\x33" - "\x9b\xff\x65\x6e\x68\xf3\x5d\xaa\x2b\x74\xbe\x4b\xfd\x1d\x99\xef" - "\xfa\x8a\x5c\xb5\x3b\xe1\xda\x9d\x2f\x8b\x06\x67\x77\x4e\x0d\x18" - "\xff\x23\xb0\xdd\x39\x3d\xcd\x6b\x77\x4e\x4f\x0b\xcd\xee\xb4\x1d" - "\xf4\xb5\x3b\xff\x7e\xe4\xaa\xdd\x19\xac\xdd\xf9\x6a\xda\xe0\xec" - "\x4e\x5b\xaf\xf8\x47\xa7\x83\x8c\x7f\x74\x3a\x60\xfc\xa3\xf0\xed" - "\xce\xe9\x5e\xf1\x8f\x4e\x0b\xf1\x8f\x4e\x85\x11\x37\xe4\xf4\x87" - "\x81\xed\xce\xe9\x5e\xf1\x8f\x4e\x0b\xf1\x8f\x4e\x0b\xf1\x8f\x4e" - "\x0b\xf1\x8f\x4e\x39\xc5\xe9\x5e\xbb\x73\x4a\x14\x37\xe4\xcc\xd5" - "\xf8\x47\xdf\xba\x75\x98\x67\x07\xa1\xff\xda\x75\x5e\xfd\xd7\xae" - "\x0b\xbc\x0e\xf3\xeb\x62\xdf\x75\x98\x8e\xdb\xaf\xae\xc3\x0c\x47" - "\xbf\x9d\x19\x64\x5c\xa4\xaf\xf5\xbe\xfa\xad\xfd\x58\x70\xfa\xed" - "\xeb\x7f\x0d\xbd\x7e\xfb\xba\xc3\x57\xbf\xb5\x5b\x58\x99\xce\x86" - "\xa1\xdf\xda\xdf\x0e\xac\xdf\xda\xf7\xf8\xea\xb7\xf6\x34\xa6\xc7" - "\xda\x8f\x32\xfd\xd6\x5e\xc0\xd2\xcf\x3a\xc5\xe9\x5e\xfd\x76\x56" - "\xa4\xdf\xda\xed\xa1\xcd\x6b\x86\xe5\x57\x5f\x86\x79\xcd\xa1\xf2" - "\xab\xaf\xf4\x79\xcd\x8e\x84\xab\xe3\x68\xe1\xf8\xd4\xed\x1d\x83" - "\xf3\xa9\xcf\xd7\x85\x6f\x53\x9c\xfb\xbd\x36\xc5\xb9\x3f\xd0\xfc" - "\x4e\x1e\xe0\xce\x04\x3e\xf1\x96\x33\x44\xf6\x3a\xce\xef\x1c\xad" - "\x21\x66\x9c\xdf\x59\xe9\x99\xdf\x29\x16\xfc\x6c\xe7\xad\xbe\x7e" - "\xf6\x85\x3d\xfe\xfc\x6c\xf4\xaf\xdd\xe0\x3b\xbb\x7a\xcf\xeb\xbc" - "\xe0\xdf\x16\x75\x29\x9b\xaa\x2e\xbe\xbb\xcf\x18\xaa\x2d\xda\xb1" - "\x81\xd9\xa2\xb7\xbe\xf5\xb6\xa8\xa3\x74\x70\xb6\xa8\xb3\xc3\xd7" - "\x16\x5d\x5c\x18\x9c\x2d\x72\xae\x1e\x7a\x5b\xe4\xcc\xf4\xb5\x45" - "\x17\x67\x08\x58\x79\x2a\x74\x5b\x74\xf1\xf6\xc0\xb6\xe8\xe2\xbd" - "\xbe\xb6\xe8\xa2\x9c\xd9\x9c\x8b\x89\xcc\x16\x5d\x8c\x66\xe9\x17" - "\x66\x88\xd3\xbd\xb6\x88\xa5\x33\x5b\x74\x31\x29\xb4\x31\x9e\x11" - "\x57\xe8\x18\x8f\xfc\x3b\x32\xc6\xd3\xd5\x12\xbe\x4e\x74\x97\x57" - "\xf7\xec\xdf\x70\x97\xf7\x19\x67\x48\x05\x7f\xbb\x9d\xcd\x73\xf7" - "\x8c\x33\xd8\xbf\x10\xf4\x9f\x7b\xac\xaf\xfe\xeb\x0e\xa8\xff\xfa" - "\x9b\xcb\xc6\x71\x05\x37\xe8\x46\x57\xf1\x20\xe6\xb2\x53\xbf\xed" - "\x3a\xef\xe2\x20\xe3\x2b\xbb\x5a\x7d\x75\x1e\x37\x27\x38\x9d\xe7" - "\x5e\x12\x50\xe7\x85\xbd\x8f\xc3\x9d\xe2\xab\xf3\xb8\x38\x01\x1f" - "\x0b\x43\xd7\x79\xdc\x4d\x81\x75\x1e\x77\xab\xaf\xce\x73\xbb\x98" - "\x6e\xe3\x66\x33\x9d\xc7\xa9\x59\x7a\x77\xa2\x38\xdd\xab\xf3\x58" - "\x3a\xd3\x79\x5c\x62\x7f\x3a\x8f\x9a\xca\xaa\x0a\xa4\x5c\x05\x5c" - "\x95\x50\xc6\x31\x80\x0d\x0b\xfc\x5f\x05\x32\x1e\x0d\xff\x07\xf4" - "\x49\x1c\xca\xb2\x2a\x2e\x1b\xca\x2c\x25\x12\xab\xe3\xac\xc5\x72" - "\x83\x0b\xcb\x6d\x67\xfc\x29\xab\x52\xb9\x46\x4c\xe3\xa8\x9e\x80" - "\x5c\xaa\xf8\xb3\x31\x81\x1e\xf7\x07\x69\x53\x49\xe4\x19\x09\x25" - "\x1e\x3a\x28\x6f\x64\xb3\x84\x3b\x88\x79\x74\xe6\x50\x05\xd4\x25" - "\x29\x60\x59\x21\xaf\xf8\x3d\xe3\xc8\x26\x17\xfd\xd2\xb2\xb2\x9d" - "\xb4\x48\xe8\x1c\x55\xdb\x88\x69\x34\x23\x81\xa0\x2f\x57\x71\x83" - "\x43\x86\x79\xe2\x79\xba\xf0\x6e\x22\xbe\x73\x43\x19\xd3\x57\x10" - "\x69\x7e\xfb\x08\x39\xe8\x89\x61\x19\x1d\xb4\x75\x95\x0b\xca\x0c" - "\xd8\xfc\x60\x5c\xbd\xec\xf7\x6f\x41\x9a\x9b\x68\xf0\x6c\x52\xcc" - "\x03\xfc\x59\x28\x0f\x7d\xbe\x04\xe8\xfd\x95\xe1\xb5\xf7\xc9\xf8" - "\x61\xb7\x52\x7b\x68\xb8\xa1\x7b\x03\xf1\x51\x95\x35\x8e\x58\x6e" - "\x03\xde\x69\x89\xd4\xdf\xfb\x90\xbe\x23\x25\xfd\xed\x7f\x97\xe3" - "\xd9\xc6\x19\xdb\x89\x74\x2b\x37\x42\xfe\x51\x1a\x7f\xfe\xb0\xa3" - "\x33\x8f\x64\xda\x25\x8b\x1b\x91\xe7\x78\xae\x25\x9e\xff\x0e\xb8" - "\x21\x90\x5e\xf8\xa1\x91\x90\xde\xb2\x48\x5e\xbc\x62\xa1\x36\x65" - "\xf9\x8a\x25\xab\xd6\xa6\x68\x6f\x59\x3c\x8a\xcc\x5e\xb5\x4a\xbb" - "\x62\xe1\xca\xf5\x5a\xf1\x9b\x49\xda\xc5\xcb\xd7\x2c\x7c\x29\x69" - "\xc9\xed\x2b\x16\x19\x46\xa1\xb0\x45\xe5\x88\xc2\xb2\x70\x79\x64" - "\x77\xc9\x1b\x84\xfc\x6a\x34\x91\x61\xb9\x3a\xf3\x24\x72\xcf\x19" - "\xa6\x78\x86\xa7\x14\x68\x32\x40\x3f\x6e\x4d\x1f\x81\xb4\x51\x3b" - "\xa1\x5c\x25\x50\x6e\x28\x23\x94\x59\x32\xc1\x53\x66\x0f\x26\x32" - "\x10\x13\xe9\xed\xe4\xa4\x54\x32\x47\xe5\x1c\xf1\x33\x4a\x13\xb0" - "\x7e\x18\x43\x4b\x02\x69\xef\xf2\xb6\xcc\x5c\x56\x05\xbf\x35\x78" - "\x30\x86\xbf\xa5\xf9\x65\x05\x9d\xd8\x4e\xa8\xfe\xa7\x7c\x9b\x92" - "\x4a\xa7\xcd\xd1\x49\x08\x7f\x86\x6a\x9e\xa4\xa8\xe7\x0c\x55\x48" - "\x47\xde\x42\x39\xda\x20\x7d\xbf\x5d\x72\x9f\x02\xd3\xf1\xec\x5f" - "\x3c\x0b\x15\xcb\x0c\xf5\x02\x5b\x4a\x2d\x34\x5b\xc0\x7e\xee\xf9" - "\x59\x9c\xe9\xfa\x58\xab\xec\x02\x89\x77\xd1\x6e\xba\xe5\xfc\xac" - "\xda\x8e\x0e\xa2\xca\x32\x2c\xa2\xa3\xc8\x9f\x54\xae\xe5\x4b\xf0" - "\x0c\x57\xce\x7c\x7d\x2c\x35\xab\xa6\xcd\xb9\x95\xa8\x3b\xf3\xa4" - "\x6a\xd1\x59\xae\xb2\xd0\xe4\x2f\xe5\xe5\x8f\x72\xc4\x33\x5a\x99" - "\x1c\xa5\x89\x1f\xa6\xf4\x95\x63\x0f\xfe\xf6\x70\xe4\x30\x60\x81" - "\x2a\xea\xd5\xf1\x6e\xc6\x47\x6c\xbb\xe7\x32\xf4\xe4\x4e\x9e\x77" - "\x11\x1a\x2e\xff\x73\x07\x67\xaa\xd7\x51\x53\x7d\x14\xf0\xac\x3c" - "\x3f\x95\x68\x17\xb8\xd5\xc4\x7c\x81\xc4\x3a\xcc\xf5\xe0\x9f\x64" - "\x4a\xc0\x1f\x91\x82\x3d\x89\x05\x9d\x11\x2b\xb4\xf7\x72\xe4\xe3" - "\xff\xb6\x11\x32\x73\x0d\x21\x5f\x4e\x26\x11\x25\xf0\xbb\x10\xeb" - "\xc3\xdb\x7f\x9a\x27\x2d\xda\x09\xbf\xc5\x33\x7a\x43\xfb\x7d\x44" - "\x4c\xc0\x76\xe7\xad\x77\x81\xff\x7a\xcb\xd4\x5c\x7e\xbd\x01\xea" - "\x5d\x0e\xf5\xde\xe6\xa7\xde\x05\xac\xde\xc3\xda\x87\xbe\xde\x11" - "\x2c\xfe\x75\x5e\xc4\xb6\xf0\xea\x2d\x8b\x1e\xb8\xde\xb6\x00\xf2" - "\x1e\x26\x87\x7a\x83\xbc\x6d\x20\x6f\x9b\x1f\x79\xdb\x04\x79\x5f" - "\xd3\x3c\xf4\xf5\x96\x1d\x65\xf5\x96\x99\xc2\xab\xf7\xb0\x80\xfa" - "\x4f\x54\xef\x00\xf2\x1e\x4e\xb8\x7c\x1b\xc8\xdb\x06\xf2\xb6\xf9" - "\x91\xb7\x4d\x90\xf7\xb5\x9f\x0d\x7d\xbd\x87\xb1\xf8\x87\x79\xc3" - "\x36\x87\x57\xef\xe1\x8a\x81\xeb\xdd\x10\x40\xde\xc3\x9d\x50\x6f" - "\x90\x77\x03\xc8\xbb\xc1\x8f\xbc\x1b\x04\x79\xdf\x97\x37\xf4\xf5" - "\x1e\xce\xce\x7f\xce\x1b\x9e\x16\x5e\xbd\x47\x04\x5c\xff\x22\xaa" - "\x77\x00\x79\x8f\x70\x70\xf9\x0d\x20\xef\x06\x90\x77\x83\x1f\x79" - "\x37\x08\xf2\x9e\xfb\xe8\xd0\xd7\x7b\xc4\x01\x56\xef\x11\x29\x61" - "\xd6\x3b\xe0\xfa\x77\x91\x5e\xd3\x80\xee\xea\x23\x73\xab\x71\x22" - "\xb9\xe3\x02\xd6\x7f\x64\x22\x55\xd6\x6b\xae\xc9\xca\x94\xb8\x14" - "\xf5\xd1\xd7\x40\x5f\x6e\x47\x36\xa7\x57\xd9\xc9\x48\xa8\xab\x9e" - "\xe6\x37\x56\xe0\x9d\x83\x7c\x5c\xa0\xfb\xdd\x8a\xfa\xa8\x2e\x53" - "\x59\xf9\xeb\x4b\x89\x36\xc3\x41\xd4\xb5\xe9\x76\x92\x6e\xa0\x8e" - "\x5a\xd2\x44\x94\x76\x22\xc5\xf1\xb2\x4f\xda\x2a\xc9\xca\x64\x4a" - "\x21\xef\xe9\xd8\xc7\xcc\x3f\x49\x62\xc1\x27\xce\xa4\x60\x3f\x0a" - "\x38\xa2\x85\xfc\x63\x91\x97\x90\xf7\x1f\x55\xb3\x89\xe4\x6f\x2f" - "\x39\x09\xf2\x13\x79\x0b\xfd\xd1\x58\x9e\xaf\x1d\x84\x3c\x39\x97" - "\xf1\x75\xc7\xd2\x50\xf9\x3a\x52\x98\xff\xab\x8f\xb5\xda\xbb\x08" - "\xf8\x96\x6a\xdc\x73\x6f\x97\xca\xeb\x6a\x0d\xed\x84\xe6\xc9\x53" - "\xa8\xb9\x5e\xcb\x81\xcd\x0a\x31\xdf\x80\xf1\xaf\x45\xfc\x2e\x04" - "\x7e\xf7\xc1\x9a\x97\xdf\xa3\xa0\x1f\x52\x5f\x28\xf0\xbb\xe8\x9a" - "\xc6\x61\xed\x01\xf8\x5d\x08\xfc\x2e\x07\x7e\x6f\x0b\x9e\xdf\xa3" - "\xfe\xe2\xcb\xef\x7a\xc3\xe5\xe1\xf7\x28\xe1\xfc\xd3\xfa\x0a\x5f" - "\x7e\x8f\x8a\x63\xfc\x1e\xd9\x02\xfc\x2e\x05\x7e\x17\x84\x98\x6f" - "\x63\x10\x7a\x1c\xf0\xdd\xd7\x86\x79\xf9\xad\x88\xa3\x4a\x9b\x80" - "\x6f\x1b\xe0\xfb\x9a\x66\xff\xfc\xb6\x01\xbe\x6d\x80\x6f\x5b\x08" - "\xf8\x56\xdc\xda\x8b\xdf\x97\x09\xdf\xd7\x08\xe3\x7f\xb6\x5e\xf8" - "\xbe\xa6\x82\xf1\xfb\x9a\xd9\xd4\x6c\x03\x7c\xdb\x42\xc4\xb7\x62" - "\x46\x10\xfc\x06\x7c\xf7\xb5\x9d\x5e\x7e\x2b\x2b\x80\xdf\x02\xbe" - "\x6d\x80\xef\x6b\x3f\x0b\xc0\x6f\xc0\xb7\x0d\xf0\x6d\x0b\x01\xdf" - "\xca\xed\xbe\xfc\xb6\x5d\x26\x7c\x2b\x17\x0b\xfc\xee\x85\x6f\xa5" - "\x96\xf1\x5b\x71\x08\xf8\x0d\xf8\xb6\x85\x88\x6f\xe5\x81\x20\xec" - "\x16\xe0\xbb\xaf\xcd\xf6\xf2\x5b\xa5\xa5\xca\x06\x01\xdf\x0d\x80" - "\xef\xfb\xf2\xfc\xf3\xbb\x01\xf0\xdd\x00\xf8\x6e\x08\x01\xdf\xaa" - "\x91\xbd\xf8\x7d\x99\xf0\x1d\xc9\xfc\x3f\x53\x43\x2f\x7c\x47\x16" - "\x30\x7e\x47\x4e\xa0\xe6\x06\xc0\x77\x43\x88\xf8\x56\x8d\x0f\x82" - "\xdf\x80\xef\xbe\xbe\x82\x97\xdf\xea\x02\xe0\xb7\x80\xef\x06\xc0" - "\xf7\xdc\x47\x03\xf0\x1b\xf0\xdd\x00\xf8\x6e\x08\x01\xdf\xea\xf5" - "\xbe\xfc\x6e\xb8\x4c\xf8\x56\x0b\xe7\x5f\x36\xf4\xc2\xb7\x9a\x30" - "\x7e\xab\x76\x03\xbf\x01\xdf\x0d\x21\xe2\x5b\x5d\x14\x8e\x7f\xb2" - "\xa6\x98\xc8\x7d\x79\x3e\x5a\x76\xe9\x7c\x94\x6b\x4f\x7f\x33\x3e" - "\xca\xb5\x95\xfe\x7d\x94\x6b\x53\x18\xcf\xaf\xd5\x84\xe7\xa3\x8c" - "\x0e\xb8\xff\xa1\x3f\x1f\xa5\x2f\xcf\xaf\x33\x5e\x3a\x3f\xe5\xba" - "\x85\xdf\x8c\x9f\x72\xdd\x78\xff\x7e\xca\xe8\x56\xc6\xf3\xd1\xa6" - "\xf0\xfc\x94\xeb\x02\xc6\x3f\xe8\xcf\x4f\xe9\xcb\xf3\xa8\xb6\x4b" - "\xe7\xab\x44\x1d\xfb\x66\x7c\x95\xa8\x52\xff\xbe\x4a\xd4\x3c\xc6" - "\xf3\x28\x12\x9e\xaf\x12\xe5\x0c\xc7\x57\xe9\xcb\xf3\xeb\x13\x2f" - "\x9d\xbf\x72\xfd\xf4\x6f\xc6\x5f\xb9\x3e\xca\xbf\xbf\xf2\x3d\xa1" - "\xff\xf3\xbd\x94\xf0\xfc\x95\xeb\x83\xe8\xff\xf4\xf5\x57\xfa\xf2" - "\xfc\xfb\x47\x2f\x9d\xcf\xf2\xfd\x83\xdf\x8c\xcf\xf2\xfd\x5c\xff" - "\x3e\xcb\xf7\xa7\x30\x9e\x5f\xdf\x1a\x9e\xcf\xf2\x7d\x7b\x38\x3e" - "\x4b\x5f\x9e\x8f\x99\x76\xe9\xfc\x96\x31\x77\x7d\x33\x7e\x8b\xc6" - "\xe5\xdf\x6f\xd1\x54\x32\x9e\x6b\xe6\x85\xe7\xb7\x8c\x99\x1d\x8e" - "\xdf\x82\xbc\x46\x9e\xa3\xaf\xc2\x78\x1e\xad\xa1\x91\x9f\x3b\xba" - "\xc1\x1f\x51\x02\xdf\x95\x6d\x44\x5a\x8c\x3c\xaf\x67\x3c\x77\x47" - "\x36\x56\x00\x7f\xf4\xc8\x33\xbe\x1e\xff\xd6\x44\xba\x4d\xf5\xd1" - "\x54\x4a\xa0\x2e\x72\x72\x52\x7a\xc3\x2d\xae\x6c\x12\xa9\x4d\xcf" - "\x82\xff\xa3\x47\x22\x8d\x36\x3d\xe7\x0b\xa8\x63\x04\xce\x51\xb8" - "\xcc\x65\xb3\xdc\xca\xe3\x75\x27\xa5\x3f\x58\x42\xc7\xbe\x33\xab" - "\x1b\x7c\x09\xfa\x8a\x26\xca\xda\x56\x41\xac\xae\x8f\x49\x6d\xfd" - "\x5f\x09\x17\xd9\xf8\xc7\x3b\x5d\x44\x47\xff\xad\x8b\xaa\x4e\xb1" - "\x13\xf7\x22\x8d\xc2\x6a\xac\x02\x5c\xfc\x91\xc4\xb7\xd2\x0b\xf4" - "\x9f\x3a\x45\xb7\xb2\x49\xed\x56\x36\x16\xb8\xcd\x4d\xf5\x2e\x65" - "\x13\x79\x2f\x15\x7a\x82\x4e\xa2\x4b\x6a\xa1\x34\xff\x25\x22\xcb" - "\x6f\x26\xf2\xad\x2f\x11\xc5\xd6\x66\xa2\xae\x6e\xa9\x27\x35\xa7" - "\xaa\x48\x4d\xbb\x8d\xd4\x5c\x80\xab\x0b\x2e\x0e\xae\x4c\x1b\xa9" - "\x6e\x23\xe4\xa9\xd3\x84\x64\xb4\x50\xc7\x4f\x1a\x49\x54\xb5\xab" - "\x9e\x68\xe7\x13\x72\x46\x7a\xc3\x45\x45\x22\x89\xa2\xff\xd4\x10" - "\xba\x48\x23\x85\x77\x32\x4c\xb7\xba\x1c\xa4\xba\xc5\x89\xef\xeb" - "\xe1\xbd\x2c\xa3\x05\xf2\xe7\xaa\x30\x96\xa1\xa3\x3a\xf3\x08\xd4" - "\xef\xb9\x38\xe0\xb3\xce\xe3\x93\xe5\x77\x91\xd8\xad\x20\x66\xc4" - "\x4c\x3c\x65\x98\xd9\xd9\x15\x2a\x66\x7e\xc0\xe2\xbf\xbf\xa2\x19" - "\x0d\xfc\xbe\x81\x7b\x25\x41\x3d\xd3\x76\x82\xe2\x7a\x30\x9c\x9f" - "\xa9\xed\xf8\x98\xe0\x9c\x75\xfc\x7a\x42\x66\xb8\x09\x41\x9e\xe0" - "\x5c\xf2\x4c\x03\x51\xe1\x3a\x35\xee\xdf\xba\xd1\xd6\x16\x07\xd9" - "\xe4\x82\xb2\x9e\x71\xf6\x94\xb5\x76\x73\x2d\x81\x77\x37\xd4\xea" - "\xed\x44\x61\x20\x6a\xe4\x33\xf8\x45\x9a\x99\xad\x64\xe4\xca\x0e" - "\x4a\x91\xc7\xc8\x5b\xe4\x33\xe6\xe7\xe1\xbd\x75\xb1\x83\x64\x38" - "\x89\xda\x9a\x0e\x77\x23\x75\x58\xc9\xd7\x04\xca\xa8\xa0\xca\xe7" - "\xe2\x00\x1f\xfb\x11\x13\x76\xe9\x0d\xd1\x80\x83\xd1\x34\x6f\x4c" - "\x5d\x09\xd4\x17\xe7\xf6\x43\xab\x73\x74\x30\xf3\x1f\x7d\x7c\x42" - "\x11\x9e\x0b\x19\x9e\xc7\xb5\xd2\xc8\x7a\x03\xe0\x79\x1b\xc3\xf3" - "\xb0\xf6\x20\xf0\x5c\xe4\xc5\x73\xf4\x79\x2f\x9e\xc7\xd9\x02\xe3" - "\x79\xdc\xbd\x02\x9e\x2b\xae\x4c\x3c\x8f\x3d\xd2\x3f\x9e\xc7\x96" - "\xf7\x83\xe7\x72\x8f\xbf\x3b\x34\x78\x1e\x47\x2e\x23\x9e\x0b\xc3" - "\xc3\xf3\xd8\x46\x5f\x3c\x47\xb7\x31\x3c\x47\x97\x86\x87\xe7\x71" - "\x01\xe3\x1f\xf7\xe7\x6f\x7b\xf1\x6c\x13\xf4\xf3\x4d\x95\x80\x67" - "\xd0\xcf\x36\x41\x3f\x5f\xd3\x3c\x30\x9e\x6d\x22\xfd\x7c\xe3\x61" - "\x2f\x9e\x6f\xda\x13\x18\xcf\x37\x0d\x63\x78\xb6\x5d\xa1\xfa\x59" - "\xbb\xbd\x7f\x3c\x6b\x8d\x81\xf1\x6c\xd3\x79\xfa\x12\x43\x83\x67" - "\x6d\xdd\xe5\xc3\xb3\x2d\x4c\xfd\xac\xdd\xeb\x8b\xe7\x1b\x0f\x30" - "\x3c\xdf\x68\x08\x0f\xcf\x37\x1d\x0a\xa7\x2f\x23\xc2\xb3\xa0\x9f" - "\x63\x72\x69\xa4\x0d\xf4\xb3\x4d\xd0\xcf\xd7\x7e\x16\x04\x9e\x45" - "\xfa\xf9\xe6\x5f\x7b\xf1\x1c\xb3\x3e\x30\x9e\x7f\x78\x4c\xc0\xf3" - "\x15\xaa\x9f\x7f\xb8\xbc\x7f\x3c\xff\x70\x5a\x3f\x78\x2e\xf7\xf4" - "\xd3\x86\x06\xcf\x3f\x2c\xbd\x8c\x78\x0e\x53\x3f\xff\x30\xcd\x17" - "\xcf\x37\x9b\x18\x9e\x6f\x8e\x0b\x0f\xcf\x31\xdb\xc2\xe9\x27\x7a" - "\xf1\xdc\x20\xe8\xe7\x1f\x27\x00\x9e\x41\x3f\x37\x08\xfa\xf9\xbe" - "\xbc\x81\xf1\xdc\x20\xd2\xcf\xb7\x2c\xf1\xe2\xf9\xc7\xd3\x03\xe3" - "\xf9\x47\xef\x32\x3c\x37\x5c\xa1\xfa\xf9\x47\x0f\xf4\x8f\xe7\x1f" - "\x69\x02\xe3\xb9\x41\xe7\xe9\x03\x0f\x0d\x9e\x7f\x64\xb8\x7c\x78" - "\x6e\x08\x53\x3f\xff\x68\x86\x2f\x9e\x6f\x99\xc7\xf0\x7c\x8b\x3a" - "\x3c\x3c\xff\x38\xe0\xf9\xaf\xfd\xf5\xc1\x45\x78\x16\xf4\xf3\x6d" - "\x3a\x1a\xd9\x00\xfa\xb9\x41\xd0\xcf\x73\x1f\x0d\x02\xcf\x22\xfd" - "\xac\xbb\xd7\x8b\xe7\xdb\xc6\x04\xc6\xf3\xad\x6b\x05\x3c\x5f\xa1" - "\xfa\xf9\xd6\x91\xfd\xe3\x59\xd7\xda\x0f\x9e\xcb\x3d\xe3\x0b\x43" - "\x83\xe7\x5b\xe3\x2e\x23\x9e\xc3\xd4\xcf\xb7\x46\xfb\xe2\x59\x37" - "\x9e\xe1\xf9\xc7\xf6\xf0\xf0\x7c\xdb\x84\xa1\x19\xdf\xb8\x5d\x87" - "\xe3\x1b\x5d\x38\xbe\xe1\x5d\xfb\xa7\x57\xd5\x31\x3c\x77\x03\x9e" - "\x77\x88\xf1\x7c\xbc\xf7\xf8\xc6\x4f\x86\x71\x3d\x78\xbe\xbd\x0f" - "\x9e\x39\xc0\x73\x37\x8f\xe7\xf1\x77\x79\xc6\x37\xac\x6d\xa5\x80" - "\x93\x53\xc4\x3a\x0b\xb0\x9c\x2f\x60\xf9\x38\x60\x19\x78\xc8\x01" - "\x8f\xab\x1b\xeb\x49\xbc\x83\xf1\xb2\x0b\x78\xcc\x89\x71\xdc\xd5" - "\x2a\x45\xfc\x22\x6e\x3d\x18\xae\x59\x09\xd8\x4d\xfe\x94\xd4\xa4" - "\xc2\xb5\x01\xae\x74\xb8\xc8\xa7\xa4\xba\x15\xb0\xbb\x5c\x8c\xdd" - "\x3a\x01\xbb\x3f\x39\xdc\x3f\x76\x7f\xb2\xfb\xf2\x8d\x65\xfc\x84" - "\x8d\x7f\x1d\x4f\x50\xc7\x3f\x7d\x82\x5a\x8d\xf5\x02\x3e\x4f\x91" - "\x78\x17\x51\xd1\xb9\xba\xd1\x8a\x04\xa2\xde\xe8\x26\x52\xf3\x4b" - "\x44\x6d\x6e\x80\x7a\x7b\xda\x6f\x33\x51\x7c\xec\xfc\x2b\xa9\x6e" - "\xaf\x27\xd5\x17\x8e\x90\x6a\x0e\xae\x53\x70\x41\x59\xe3\x97\x88" - "\xeb\xed\x10\xea\x3d\xfe\x20\xe4\x15\x13\xb8\xde\xe3\x8b\xf8\x7a" - "\x2f\x86\x7a\x77\x79\xeb\x6d\x85\x76\x00\xf2\xb9\x81\x13\xc6\x43" - "\xe2\x1d\x64\xe4\x2a\x17\xa5\x5d\x02\xfe\x51\x3e\x1f\x1f\x75\x92" - "\x78\x03\xc8\x6c\x11\xe0\xbf\xa5\x9c\x64\xa4\x01\xfe\xbb\x9c\x88" - "\x3b\x87\x35\xf3\x22\xe0\xff\x27\xf5\x14\xf8\xd7\x8d\xf8\x3f\x8e" - "\xf8\xbf\xcd\xc5\xf1\xf8\xbf\xad\x22\x3c\xfc\xdf\x1e\x0c\xfe\x83" - "\x18\x0f\x89\xd5\xe1\x78\x48\x17\x8e\x87\x78\xd7\x80\x0e\x84\x7f" - "\x91\x3e\xbf\x43\x84\xff\xd8\x7e\xf0\x7f\xa7\x07\xff\x15\xdf\x3c" - "\xfe\xef\x18\x00\xff\x77\xf4\x87\xff\x21\x1e\xfb\xb8\xe3\x32\xe2" - "\xff\xce\x01\xf0\x7f\x67\x30\xf8\x2f\x0c\x0f\xff\x77\xf4\xc2\xff" - "\xed\x02\xfe\x6f\x0f\x13\xff\xb1\x41\xe0\x3f\x98\xf1\x93\x7b\x10" - "\xff\xa0\xff\x6d\x51\xa2\xb5\xc0\x03\xe0\x5f\x3c\x7e\x72\x97\x08" - "\xff\xf7\xf4\x83\xff\xbb\xef\xf2\x8c\x9f\x7c\xf3\xf8\xbf\x6b\x00" - "\xfc\xdf\xd5\x0f\xfe\x87\x7a\xac\xe4\xae\xcb\x88\xff\xbb\x07\xc0" - "\xff\xdd\x41\xe0\xdf\x16\xa6\xfe\xbf\xab\x17\xfe\x63\x05\xfc\xc7" - "\x86\x89\xff\x7b\x82\xc1\x7f\x10\xe3\x2d\xf7\xe9\x70\xbc\xa5\x0b" - "\xc7\x5b\xbc\x6b\xc2\x07\xc2\xbf\x48\xff\x4f\x10\xe1\xff\xbe\x7e" - "\xf0\x7f\xaf\x07\xff\x57\x80\xfe\x9f\x30\x00\xfe\x27\xf4\x87\xff" - "\x21\x1e\x5b\x99\x70\x19\xf1\x7f\xef\x00\xf8\xbf\x37\x18\xfc\x87" - "\xa9\xff\x27\xf4\xc2\xff\x3d\x02\xfe\xef\x09\x13\xff\xf7\x05\x81" - "\xff\x60\xc6\x67\x1e\x40\xfc\x83\xfe\x6f\x88\x12\xed\x0d\x18\x00" - "\xff\xe2\xf1\x99\xfb\x45\xf8\x7f\xa0\x1f\xfc\x4f\xbc\xcb\x33\x3e" - "\xf3\xcd\xe3\xff\xfe\x01\xf0\x7f\x7f\x3f\xf8\x1f\xea\xb1\x98\xfb" - "\x2f\x23\xfe\x27\x0e\x80\xff\x89\x41\xe0\xbf\x21\x4c\xfd\x7f\x7f" - "\x2f\xfc\xdf\x27\xe0\xff\xbe\x30\xf1\xff\x40\x30\xf8\x0f\x62\x3c" - "\x67\x32\x3f\x9e\xd3\x85\xe3\x39\xde\x3d\x22\x03\xe1\x5f\xa4\xff" - "\x27\x89\xf0\x3f\xb9\x1f\xfc\x3f\xe8\xc1\xff\x15\xa0\xff\x27\x0d" - "\x80\xff\x49\xfd\xe1\x7f\x88\xc7\x6e\x26\x5d\x46\xfc\x3f\x38\x00" - "\xfe\x1f\x0c\x06\xff\x61\xea\xff\x49\xbd\xf0\xff\x80\x80\xff\x07" - "\xc2\xc4\xff\xe4\x21\x1a\xff\x79\xa8\x0e\xc7\x7f\x38\x45\x7d\x54" - "\x77\xd1\x3b\xb3\x38\x53\x93\x5a\x25\xd1\x12\x97\xe2\x78\x9d\x35" - "\xa5\x83\xcc\x3c\x0f\x32\x31\x9c\x27\xf3\xcf\xab\x89\xdb\xd4\x44" - "\x28\xf4\xff\x7d\xf6\x88\xc2\xe5\x32\x3d\x17\xb7\x75\x25\x91\xb9" - "\x23\x1b\xff\x88\x69\xd6\x93\x4e\x82\x75\xde\x84\x3c\x38\xe5\xe5" - "\x01\x8e\xc1\xd1\xb3\x3a\x75\x49\x36\xd0\x74\xd9\x49\x0b\xe0\xa5" - "\xba\xc5\x0e\xbc\xdf\xc0\x63\x0b\x65\x01\xe5\x31\xec\x3c\x43\x64" - "\xae\x7f\x6a\x6e\x00\x19\x47\x29\xd7\x11\x49\x74\x0b\xe5\x50\x96" - "\x28\x23\x94\xab\x76\x03\xae\x57\x7a\xe8\x48\x2d\xe0\xdb\xf5\x4f" - "\xdd\x0d\x25\x40\x37\xf4\xe3\x32\x0f\xf1\xf3\x1f\x70\xd7\x57\x37" - "\x02\x2f\xf3\x26\x87\x29\xa7\x87\x82\xd8\xff\x12\xcc\x38\xc5\xc3" - "\x46\x1c\xa7\x00\x39\x6d\x0b\x52\x4e\x85\x3e\x7b\x5a\x87\x5c\x4e" - "\x0f\x6b\x82\x93\xd3\xc3\xab\x7b\xc9\x69\x88\xc7\x0f\x1e\x9e\xcc" - "\xe4\xf4\xb0\x9a\xc9\xe9\xa7\x09\xe1\xc9\xe9\xe1\xb0\xd6\xff\xf6" - "\xed\x4f\x3f\xa2\xc5\xfe\x34\x07\xfd\xe9\xe0\xe4\x64\xd3\xf8\xec" - "\xc1\x1d\x72\x39\xc5\x59\x82\x93\xd3\x23\x63\x7c\xe5\x34\xd4\xfd" - "\xdc\xb8\x16\x26\xa7\xb8\x4a\x26\xa7\x38\x12\x9e\x9c\x1e\x09\x62" - "\xff\x47\x30\xfd\xbe\x47\xab\xb0\xdf\x07\x72\x0a\xb2\x3d\xd9\x0a" - "\x7d\xf6\x0c\x0f\xb9\x9c\x1e\xd5\x07\x27\xa7\x47\x3f\xec\x25\xa7" - "\x21\xee\x8f\x3d\x6a\x62\x72\x7a\x34\x91\xc9\xe9\x91\xf2\xf0\xe4" - "\xf4\xe8\xd1\xa1\xe9\x9f\x4c\x31\x60\xff\x84\x83\xfe\x49\x70\x72" - "\x6a\xd0\xf8\xec\x71\x1e\x72\x39\x4d\x51\x07\x27\xa7\x29\xcb\x7d" - "\xe5\x34\xd4\xfd\x86\x29\xec\x3c\x60\xe9\x14\x39\x93\xd3\x63\xb3" - "\xc2\x93\xd3\x94\x80\xf1\x4f\x43\xf3\xa3\x1f\xd7\xa0\x1f\x0d\x72" - "\x0a\xb2\x3d\x35\x14\xfa\xec\xc9\x1e\x72\x39\x4d\xad\x0c\x4e\x4e" - "\x8f\x5f\xdb\x4b\x4e\x43\xec\xdf\x4e\x6d\x64\x72\x9a\x5a\xc1\xe4" - "\x34\xc5\x19\x9e\x9c\x1e\x0f\x66\xfd\xa7\xdf\x7d\x58\x7d\x7d\xbe" - "\x9f\x1d\xba\xb2\x7c\xbe\x9f\x2d\x0e\x4e\x56\x3f\x3b\x78\x69\x7d" - "\xbe\x9f\xe5\x32\x59\xfd\x6c\x1e\x93\xd5\xe3\xbb\xc3\x93\xd5\xcf" - "\x02\xc6\x5a\x1a\x68\xff\x56\x5f\xbf\x6f\xba\xe1\xca\xf2\xfb\xa6" - "\x07\xa9\xff\xa6\x2f\xbf\xb4\x7e\xdf\x74\x41\xff\x4d\x17\xf4\xdf" - "\xb4\x30\xf5\xdf\xf4\x20\xf4\x9f\xff\x7d\x5f\x7d\x7d\xbf\x27\xa3" - "\xaf\x2c\xdf\xef\x89\x03\xc1\xc9\xea\xc9\xef\x5d\x5a\xdf\xef\x09" - "\x3b\x93\xd5\x13\xfb\x99\xac\xa6\xbb\xc2\x93\xd5\x93\xba\x70\xf7" - "\x8b\xf5\xf5\xff\x66\x5c\x61\xfe\xdf\x8c\x20\xfd\xbf\x19\x97\xd8" - "\xff\x9b\x21\xf8\x7f\x33\x04\xff\xef\xc9\x30\xfd\xbf\x19\x61\xf9" - "\x7f\xbe\xb2\xf2\xf8\x80\x33\x53\xae\x2c\x1f\x70\x66\x54\x70\xb2" - "\x9a\xb9\xe2\xd2\xfa\x80\x33\x27\x32\x59\xcd\x54\x30\x59\x3d\x35" - "\x3b\x3c\x59\xcd\xcc\x0c\x77\x7f\x5a\x5f\x3f\x70\x96\xf6\xca\xf2" - "\x03\xe3\x83\xec\xff\xce\x1a\x73\x69\xfd\xc0\x78\xa1\xff\x1b\x2f" - "\xf4\x7f\xe3\xc3\xec\xff\xce\x0a\xa2\xff\x1b\xcc\xb8\xdf\x33\x99" - "\xe8\x03\xba\x4d\xf5\x51\x2a\xe0\xbf\xca\x48\xa4\x5d\xd1\x20\x2f" - "\x05\xc8\x2b\x4b\x4b\xba\x4d\x20\x2f\x87\x8b\xcc\x5c\x7d\x82\xd6" - "\xb6\xb9\x49\x17\xc8\xea\x22\xf8\x81\x56\x47\x2b\xee\xd1\x7b\xb0" - "\x59\xfa\xcc\x98\xb9\xab\xd5\x04\xe5\x85\xfc\x77\x2b\x9e\x8b\xa3" - "\x20\x2f\x5e\x7e\x8a\xa6\x7a\x97\xa9\xb1\xe0\xa9\xd3\x27\xe8\x2a" - "\x3b\xa5\x35\x7a\x27\xc6\x8e\x9c\x55\xa3\xaf\x27\xc0\x85\x91\xda" - "\x67\x50\x2e\x4f\x1f\xc1\x74\xab\xa3\x9e\x60\xdc\x4f\x7e\x0c\xfc" - "\x84\x2e\xca\xf5\xb9\x4e\x81\xf1\x9b\x70\x5f\xa1\x27\x46\x93\xf5" - "\x54\x21\x2f\xff\xde\x63\xaa\xbc\xfc\x3f\xd7\xa9\x77\xe0\xfe\xc4" - "\x21\xf7\x05\x9f\xe6\xc7\xff\xb8\x13\x9a\x1b\x3c\x65\x5c\x95\x44" - "\x29\x94\x71\x74\x6d\x87\x83\x60\x39\x6b\x3b\x2c\x24\x23\x85\xa8" - "\x6b\xbb\x5a\x49\x7a\x07\x75\xd4\x66\x7e\x45\xe2\xcf\xe3\xbc\x00" - "\xe2\xe9\x99\x6b\x99\xbc\x9f\x9e\xcc\x9d\xd0\xdd\x60\x97\x3e\x23" - "\xaf\x05\xaf\x50\x95\x05\xbc\x76\x11\x29\xbf\x5f\x53\x4a\xe4\xc0" - "\x2f\xbd\x35\xb3\x99\xd0\xc8\x2f\xd4\x56\x57\x03\xf2\x53\x0f\xef" - "\x27\xf7\xcc\x37\x44\x7e\x31\x1a\xd3\x90\xb7\xb8\xce\xd4\x6a\x70" - "\xf0\x34\x9e\xf7\x4c\x76\x99\xc4\x6a\xec\x22\xb5\x2e\x42\x00\x1f" - "\xad\x9f\x24\xd4\x03\xbe\x66\x85\xa9\xb7\x9f\x31\x0d\xcd\x78\xe5" - "\x6c\x3b\xfa\xad\x80\xaf\x6d\xac\x8c\xc3\xda\x83\xc0\x57\xa1\x17" - "\x5f\xb3\xd7\x0f\x0e\x5f\xb3\x6f\x1d\x62\x7c\x0d\xb1\xff\xfa\xf3" - "\x8e\xc1\xe1\x6b\xf6\x6a\x86\xaf\x9f\x17\x31\x7c\xcd\xd6\x7b\xf1" - "\x35\xac\xfd\xd2\xe1\xeb\xe7\xd3\x18\xbe\x7e\x2e\x0f\x0f\x5f\xb3" - "\xdb\x86\x66\x9c\x15\xf1\x50\x0f\xfa\xcb\x26\xe8\xaf\x6b\x9a\x07" - "\xc6\x97\x4d\xa4\xbf\x9e\xb5\x0d\x0e\x5f\xcf\x6e\x19\x5a\x7c\x0d" - "\xb5\xcf\xfd\xec\xec\xc1\xe1\xeb\xd9\x4f\x19\xbe\xe6\xb8\x18\xbe" - "\x9e\xad\xf2\xe2\xeb\x9a\xe6\x4b\x87\xaf\x39\xe5\x0c\x5f\x73\xf4" - "\xe1\xe1\xeb\xb9\xb0\xe2\x5f\xf5\xed\x1f\x3c\x5f\x8a\xfd\x03\xc0" - "\x97\xa0\xbf\xae\xfd\x2c\x08\x7c\x89\xf4\xd7\xf3\x0f\x0c\x0e\x5f" - "\x09\x5f\x0d\x31\xbe\x86\xb8\x9f\x90\xb0\x7f\x70\xf8\x7a\xfe\x2e" - "\x86\xaf\x84\x79\x0c\x5f\xcf\xeb\xbc\xf8\xba\xf6\xb3\x4b\x87\xaf" - "\x04\x39\xc3\xd7\x73\x55\xe1\xe1\xeb\xf9\xc0\xf1\x9f\x43\x1a\xd7" - "\x9e\x47\xb0\x4f\xe3\x36\x35\x08\xfa\xeb\xbe\xbc\x81\xf1\xd5\x20" - "\xd2\x5f\x73\xb7\x0f\x0e\x5f\x73\xa7\x0f\x2d\xbe\x86\xba\x6f\x33" - "\x37\x6a\x70\xf8\x9a\xfb\x4b\x86\xaf\x17\x0e\x30\x7c\xcd\xcd\xf5" - "\xe2\xeb\xbe\xbc\x4b\x87\xaf\x17\xf4\x0c\x5f\x2f\xe8\xc2\xc3\xd7" - "\xbc\x60\xe2\xbf\x06\x31\x1e\x3f\x3f\x11\xfb\x61\x80\x2f\x41\x7f" - "\xcd\x7d\x34\x08\x7c\x89\xf4\xd7\x8b\x17\x07\x87\xaf\x17\xf7\x0c" - "\x31\xbe\x86\xb8\x3f\xf6\x62\xca\xe0\xf0\xf5\xe2\xd7\x0c\x5f\x2f" - "\x46\x33\x7c\xbd\xd8\xea\xc5\xd7\xdc\x47\x2f\x1d\xbe\xe6\x55\x31" - "\x7c\xcd\xcb\x0d\x0f\x5f\xf3\x83\x89\x7f\x1a\xe4\x3c\x42\xe2\xa1" - "\xc1\xf5\x21\x13\x5f\x1c\x1c\xc6\x12\x95\x57\x76\x1f\x72\x41\xfd" - "\xe0\x30\x96\x38\x87\x61\x6c\x41\x26\xc3\x58\xe2\x8c\xcb\xd3\x87" - "\x5c\x30\x9e\x61\x6c\x7e\x5b\x78\x18\x4b\x1c\xc2\xf9\x8f\x45\xba" - "\xc1\xf5\x23\x5f\xfa\x70\x70\x18\x7b\x69\xf5\x95\xdd\x8f\x7c\x69" - "\xf2\xe0\x30\xf6\xd2\x5f\x18\xc6\x16\xb6\x30\x8c\xbd\x54\x71\x79" - "\xfa\x91\x0b\x0b\x18\xc6\x16\x86\x39\x6f\xb3\x28\xac\xfd\x2f\xfe" - "\xe7\x6d\x96\x98\x06\xd7\x97\x5c\x72\xcb\xe0\x30\xb6\xf8\xd8\x95" - "\xdd\x97\x5c\x5c\x3a\x38\x8c\x2d\x19\xcb\x30\xb6\x78\x1a\xc3\xd8" - "\x92\xa8\xcb\xd3\x97\x5c\xd4\xc1\x30\xb6\x68\x7f\x78\x18\x5b\x52" - "\x38\x74\xf3\x4d\xcb\x1c\x83\xeb\x4f\x2e\xdb\x32\x38\x8c\x2d\x7b" - "\xe0\xca\xee\x4f\x2e\x93\x0d\x0e\x63\xcb\xb2\x18\xc6\x96\xee\x65" - "\x18\x5b\x66\xbc\x3c\xfd\xc9\xa5\x09\x0c\x63\x4b\x35\xe1\x61\x6c" - "\x59\x10\xf1\xff\x83\x9d\x27\x7b\x79\xf6\xe0\xfa\x94\xcb\x4f\x0f" - "\x0e\x63\xcb\x8b\xaf\xec\x3e\xe5\x72\xfd\xe0\x30\xb6\xfc\x5f\x0c" - "\x63\xcb\xd5\x0c\x63\xcb\x1b\x2f\x4f\x9f\x52\x7f\x80\x61\x4c\x9f" - "\x16\x1e\xc6\x5e\x4e\x1c\xba\xf9\xbd\xa4\xca\xc1\xf5\x2b\x93\x9e" - "\x1e\x1c\xc6\x92\x24\x57\x76\xbf\xf2\x95\xea\xc1\x61\x2c\x69\x3a" - "\xc3\xd8\x2b\x29\x0c\x63\x49\x71\x97\xa7\x5f\xf9\x8a\x96\x61\xec" - "\xe5\x30\xe3\x51\x24\xf5\x89\x7f\xb5\x7c\x65\xea\xc2\xa4\xe5\x8b" - "\xb5\xcb\x57\xa6\x24\xaf\xd6\xae\x59\xbe\x61\xc9\x43\xb7\xac\x1d" - "\xaf\x4d\x36\x6a\x93\x97\xaf\x5c\x26\x24\x2c\x1e\x45\x9e\x59\x92" - "\xb4\xd0\x88\x29\x40\xbd\x6c\xe5\x8a\x25\x2b\x53\xb4\xc9\x4b\x56" - "\xaf\x5d\x9e\xbc\x04\xff\x5f\xa3\x5d\xba\x2a\x19\x12\x16\x2d\x59" - "\x9e\xba\x44\xfb\xd2\xda\xa5\x4b\x97\x24\xaf\x19\x45\x9e\x5a\x9b" - "\x94\xb2\xdc\x90\xb4\x44\x3b\xe5\xa9\x47\x6e\x9f\x3d\xf5\xe7\xb3" - "\x1f\x7e\x18\x0f\x27\x13\x9d\x4d\x16\x4d\x4d\x4d\x75\x80\x39\xd9" - "\x49\x69\xea\x8a\x5a\x0d\xe1\xcf\xc7\xdd\xda\x4e\xd4\x5b\x92\x89" - "\x2c\xb7\x9d\xc8\xcd\xed\x44\xa1\x7d\x99\xc4\x51\xf3\x0d\x71\x90" - "\x1e\x45\xcd\xcf\x64\xd2\xfc\xb2\x04\x6a\x7e\xd6\xe2\x50\x3e\x68" - "\x40\x5a\x6a\x9e\x54\x8a\xef\x80\xb7\x32\x6a\x7e\x4e\xd7\x2c\x4d" - "\x1d\xef\x50\x4e\x9e\x95\xf1\x15\x91\xd2\x51\x2b\x3a\xde\xe7\x1c" - "\xd2\x0f\x71\x24\x01\xea\x4e\xa4\xab\x14\x44\xba\xd2\x09\xf7\x72" - "\xb8\x2a\xe1\x3a\x04\x57\x1b\x5c\x1d\x44\x6a\x90\xc3\x15\x05\x97" - "\x16\x2e\x1d\x5c\xb1\x70\x01\xf7\x0c\x71\x70\x1d\x80\xab\x11\x2e" - "\xa0\x5d\x2d\x63\xf9\x40\x23\x91\xae\x9e\x0c\xd7\x66\xb8\x20\xaf" - "\xe4\xfd\x70\xd9\x89\x74\x4d\x26\x5c\x04\xae\x68\xb8\x62\xe0\x9a" - "\x06\x57\x12\xd0\x44\xb1\x77\x29\x90\x96\x92\x48\xa0\x9c\x03\x5f" - "\x29\x48\x9f\x0b\xd7\x5e\x22\x5d\x0b\xdf\x5c\x6b\x80\xcb\xd2\x8b" - "\x4e\x2e\xfa\x3f\x66\x80\x3c\xa7\xa8\xb2\x6e\xb4\xf3\x67\xe0\x49" - "\x57\x2d\x77\x67\x93\x08\xb7\x79\xf2\x2c\xc3\x6d\x44\x72\x4a\xba" - "\xea\x5e\xeb\x66\xd4\x33\xcf\x64\xf2\x67\x3a\xc2\x33\xf2\xac\x33" - "\x6f\xd5\x04\x3b\x79\xbf\x10\xcf\x34\x0b\x0d\x6f\xab\x26\x08\xbf" - "\x4f\xb1\x4b\x1e\x2f\xe7\xcf\x80\xcb\x57\x4d\xa1\x19\x09\x3b\xd8" - "\xd9\x6f\xab\xf8\x71\x34\x6a\x8a\x2c\xa2\x8a\x91\xd1\xd8\xe6\x2d" - "\x1b\xf8\x72\x29\x69\x36\x89\x84\xdf\x2b\x28\x94\xcd\xa1\x2c\x4b" - "\x80\x72\xca\xf0\xd9\x6d\x7e\xd0\x70\x51\x69\xaf\xc0\xff\x9d\xc5" - "\xbb\xec\xd4\x64\xaf\xc7\x7e\xb6\x25\xfd\x0d\xd2\x0c\xbf\xbb\xa8" - "\x6c\x36\x6a\x9f\x50\xd1\x66\xfc\x6d\x36\xc6\xa8\x5d\x55\xca\xda" - "\xea\x2a\xc5\x45\x65\x59\xa2\xbb\xb0\xb9\x14\xd2\x65\x6e\x73\x59" - "\x02\xcb\xff\x41\xd0\x93\x8d\x99\xf0\xbf\x8b\x4f\x2f\xda\xe5\xf4" - "\xfc\x0f\x77\xa7\x3b\xbf\x49\x8b\x77\x65\x16\xe9\xe0\x9f\xb3\xe3" - "\x08\xbb\xab\x89\xf6\x09\x42\xda\xa4\x86\xb7\xef\xac\x22\x12\xcb" - "\x13\x58\x6e\x43\x52\x46\x15\xe5\xb4\xe9\x11\xf0\x7d\xc3\x8a\x9e" - "\xef\x8e\x69\x2e\xc4\xf3\x53\x69\xde\x0a\xd9\xce\x37\x08\xc1\xdf" - "\x62\xd9\xb6\x8f\x26\xb2\xe2\x37\x88\x1c\xeb\xd8\x99\x67\x28\xf4" - "\x9c\x43\x87\xbf\x91\x02\xfd\xf4\xe9\x19\x54\x94\xf7\x12\x37\xab" - "\x8f\x9c\xf1\xd4\x50\x65\x97\x3c\xb6\x1b\xe9\xb5\x37\xf3\xbc\x54" - "\x0a\xef\x15\x28\x4f\xcc\x9f\x9a\x9b\xea\xf0\x19\xcf\xb9\x53\x55" - "\x11\xa9\x36\x3d\xa6\x92\xf1\xc8\x5e\x8f\xf9\x20\x3d\xcd\x3f\x8e" - "\xff\xef\xa5\x66\x9e\xc7\x3a\xed\x4a\x12\xd7\x2c\x5d\x7d\xaf\xdb" - "\xac\x46\xfe\x41\xbb\x53\xab\x81\xde\xc1\xf3\xdb\xdc\x68\xb0\x4b" - "\x57\xeb\xe0\x9d\xba\xe7\xec\x4b\xc6\x67\x09\xd0\x69\x3b\xf3\x56" - "\xcf\xb3\x4b\xe6\x56\xf2\x72\x4e\xa5\x47\xf1\x8c\xcd\x73\xa9\xd4" - "\x15\xef\x3a\xc1\x81\xae\x22\xf0\x3e\xcd\x4e\xe6\x96\x7a\xea\xc8" - "\x64\xdf\x93\x8f\x12\x9f\x1d\x4a\x3e\x9f\xdd\xfe\xf2\x81\x6f\x27" - "\x2d\x70\x69\x25\x5d\x17\x68\xdd\xd6\x67\x91\x8f\x84\x76\xa5\xd2" - "\xea\x4d\xd3\xa8\x33\xff\x33\x42\x6a\xf4\x8d\x04\xda\x7c\x74\xa4" - "\x84\x3a\xe2\xd7\x13\x55\xa4\x41\x45\x8f\x54\x35\x92\x8d\xd3\x68" - "\x2b\x9e\xfb\x5b\xdb\xd1\x42\xd2\x6c\x44\x91\x51\x43\xa2\xd2\xa6" - "\x51\x47\x75\x62\x23\x61\xe9\x35\x24\xa3\x89\xc8\x36\x1e\xa2\xce" - "\x99\xa0\xff\x3f\x69\xc4\xf4\x16\x82\x67\x54\x66\xb4\x52\x57\xfa" - "\x8b\x44\x81\xff\xd7\x1c\xc2\xf4\x7f\x91\x8c\xd3\x44\x16\x6f\x74" - "\xa8\x4a\xe0\x9b\xf8\xfb\x9d\x50\x16\xee\x02\x3d\xb0\xf5\x02\x21" - "\x1b\x9f\x27\x9a\xb4\x85\x04\xfc\x40\x42\xad\xae\x3f\x91\x78\x37" - "\x05\xfb\x72\x98\x6c\x5a\x4e\xe4\xf1\x2e\xdc\xc7\x76\x8c\xe0\xb9" - "\xdf\x3b\x81\x16\xea\x66\xc1\xba\x6d\xfc\x82\x68\xf0\x1c\x74\xf6" - "\x9b\x83\xc2\x6f\xbe\x20\xc8\xb3\x8b\xca\x67\x2b\x9c\xe6\xe7\x62" - "\xa1\xee\x06\xe4\x01\x7c\xa7\x8e\xc3\xdf\xc1\xef\xb7\x26\xf3\x3c" - "\x90\x2c\x70\x11\x90\x79\x63\xc2\x02\xa3\x85\xcf\xd7\x2e\x4d\xde" - "\xbb\x33\x99\x2f\x93\x0f\x6d\xbc\x8b\x9e\x73\x28\x1b\x01\xf7\xc9" - "\x47\xe3\x8d\x0f\x53\xfc\x2d\xc8\x32\xba\x33\x6f\x4d\x94\x87\xdf" - "\x1e\xb9\xd8\xa5\x6b\xe4\x20\x8b\xe8\x08\x03\x91\xc1\xfb\x09\x76" - "\xc9\xfc\x6d\x22\xac\x61\x1b\x1a\xee\xa1\x15\x68\x12\xec\x92\x79" - "\x8d\x22\x1a\xc4\x57\x0f\x0d\xbc\x37\xda\x25\x2f\xb6\xb0\x6f\xac" - "\x99\x88\x34\x82\xee\xf7\xd0\x46\x50\x93\xdc\xe1\x56\xda\xed\x54" - "\x4a\x9d\x80\x47\x23\x3d\xa7\x51\xcc\x74\x51\x27\x67\x3e\x8e\x7a" - "\x5e\x81\xe7\xba\x32\xfa\x94\x91\xf0\x3e\x53\x9b\xca\xff\x1f\x8d" - "\xdf\xa1\xa6\xb2\xcc\x9e\x77\xd9\x64\x18\x2d\xde\x55\x07\xb6\x43" - "\x1d\x5f\x45\x9d\xd0\xd6\xeb\xf2\x93\xd1\x76\xd8\xeb\xb0\x5d\x73" - "\xca\xc6\x5c\xe7\xf6\x66\x6c\xf3\x13\xb0\x8d\x50\xd3\x71\x83\x50" - "\x8e\xb7\xb1\xdd\x30\x5d\xb3\xc6\xee\x86\x3c\xa0\x4c\x1d\xf0\x6e" - "\x58\xb3\x34\x65\x36\xee\x27\xa5\xa6\x91\xe3\xd9\xb9\x97\x29\xcf" - "\x33\xfc\xca\x1d\x3e\xcf\x52\xbe\xcd\xef\x05\xdf\x26\x01\xf5\x03" - "\xa4\xaf\xf7\xb6\x61\x9e\x6f\x52\xa6\x8b\x8e\x67\x32\x3d\x12\xc1" - "\x01\x9d\xa4\x59\x68\x8f\x17\x95\xea\xa8\xce\xbc\x14\xc0\xff\x4f" - "\x63\x7c\xda\x49\xfe\xb0\x5c\x3c\x63\x13\xca\x12\x01\x79\x7e\x0a" - "\xf7\x11\x70\x3f\xf6\x51\x15\xca\x9b\xcf\xf7\x1a\xfc\x7f\xfb\xf5" - "\xd4\x31\x65\x2a\xc1\xf3\x34\xa1\xbd\xa5\xb4\xd9\x49\x2e\xaf\x23" - "\xb6\xe0\x39\xa3\x90\x86\x34\x9d\x79\x6b\x65\x76\xb2\x65\x9b\x90" - "\xff\xde\x0e\x28\xab\x6f\xfe\x6b\x6f\x65\xf9\xb3\x7c\x31\x3f\x4f" - "\xde\xc5\x6f\xd2\x36\x96\xf7\xda\x69\x9e\xbc\xcd\x90\xe6\xc9\x7f" - "\xca\x8a\x9e\x6f\xe8\xe1\x1b\xd1\xe2\x3a\x14\xbe\x49\x3b\xb6\xf3" - "\xe7\x89\xae\xdd\x6c\x27\xc5\x55\xf8\x2e\x17\xd2\xf0\xb7\x22\x5c" - "\x45\x7c\x34\x0d\xf2\x38\xc4\xe7\xb1\xd7\x4e\x8a\x66\xf5\xd2\x71" - "\x4a\x8f\x8e\x13\xf2\xaa\xf3\xe4\x25\xca\x47\xc0\x53\x54\xab\x20" - "\x57\xcc\x57\x81\xf9\x76\xe6\xa5\x12\x3b\x79\x7d\xb7\xb8\xee\xc0" - "\x73\x99\xf0\x2e\xda\x2e\x79\xa8\xc5\xb7\x1d\xac\x96\xd3\x7c\x7b" - "\x2b\xea\x38\x21\xaf\x7b\x51\x5f\x7b\xde\xe3\x19\xa4\xa0\xd7\xc7" - "\x63\x5b\xe2\x75\xbb\xb9\x31\x11\xf2\x59\xdc\x4b\x97\xcb\x90\xce" - "\x9d\xb7\x62\x61\x31\x9e\xc1\x7a\x3d\x6d\x05\x9a\x5c\x9f\x73\x47" - "\xa5\xe4\xa7\x90\xd6\x73\xfe\x69\x3e\xd0\xd8\xa5\x2b\x02\xc6\x77" - "\x4c\xbf\x89\x48\xad\x40\x0d\xbe\x35\x62\x6e\xb2\x35\xba\x83\x58" - "\x8b\x38\xc2\x95\xbc\x43\xe2\xd2\xa9\xe5\xa4\x74\xdd\x18\x3c\xcf" - "\x3a\x34\x7b\x9d\xca\xce\xff\xec\x02\x9f\x33\xed\x6e\x82\x36\xfa" - "\x8c\xd4\x38\xdd\xea\x68\xe7\xdb\x1d\xfc\xcf\xfb\x03\xbf\x02\x1f" - "\x15\xfd\x54\xe8\x1b\xe8\x0b\xa4\xcc\x57\xe5\x80\xb6\x04\xd3\xd1" - "\x8f\x05\x1d\xba\x53\xf4\x8e\x96\xec\xaa\x64\xbc\x33\x4a\x78\x5b" - "\x81\xe5\x75\xfd\xcc\x82\x65\xe6\x8a\x76\x55\x62\x1d\x32\x8c\x94" - "\xb3\xba\x3a\x2d\xa8\x67\xb5\xa9\xe8\x63\xaf\xfb\x22\xbe\x98\x50" - "\xae\x78\x57\x65\x68\x75\x58\xc7\x9f\x3d\x0e\xfd\x88\x33\x8e\xb1" - "\xbb\xf0\x8c\x65\xe9\xd6\xf4\x61\xf2\xc7\x8a\xa8\xe5\xdc\xb8\x77" - "\x40\xc6\x46\xe2\x39\x67\x37\xb4\x7c\x8d\xc4\x53\xf7\x12\xa1\xee" - "\xf0\x2d\xbe\xcf\x76\x67\x21\x7f\xfe\x37\x3c\x1b\x27\x06\x92\x17" - "\xe8\x98\x56\xfc\x2d\xd4\x3d\x6e\xa7\x87\x4f\x2e\x07\x9e\x7f\x7e" - "\xed\x29\xa9\xb1\x26\x3e\xcd\x42\xf8\x98\xfe\xe6\xe3\xad\x21\x96" - "\x8b\x1f\xff\xaa\x85\x3e\x4c\xbc\xeb\x03\xca\x74\xa2\xf1\xfc\x4c" - "\x21\x3f\x7c\xe7\x91\x55\x89\xd0\xb7\x08\xe3\x1b\x01\xc7\x3f\x44" - "\xf5\x52\xf7\xad\xd7\xfa\x77\xc3\xaf\xd7\x7a\x43\xdf\x7a\xad\xaf" - "\x19\xda\x7a\xad\x0f\xb8\xfe\x59\x54\x2f\x6d\xdf\x7a\x6d\xd8\x14" - "\x7e\xbd\x36\x4c\xeb\x5b\xaf\x0d\xef\x0e\x6d\xbd\x36\x04\x5c\xff" - "\x20\xaa\x57\x6c\xdf\x7a\x6d\x9c\x13\x7e\xbd\x36\x6a\xfb\xd6\x6b" - "\xe3\xa6\xa1\xad\xd7\xc6\x80\xfb\x7f\x03\xea\xc3\xfc\xa6\x58\xa6" - "\x0f\xd3\x6e\x0d\x5d\x1f\x6e\xec\xe8\xab\x0f\x37\x3d\xef\xd5\x87" - "\x9b\xa6\x86\xa5\x0f\xf3\xcb\x04\x7f\x63\xd3\xb5\x7d\xf4\xa1\xa9" - "\xcc\xe0\x5f\x1f\xa6\x9d\xe6\xf5\xa1\xb9\xcc\x10\x5a\x1d\xd2\x2a" - "\x7b\xf4\xa1\xb2\xcc\xe0\xa3\x0f\x23\x9b\x62\x3b\xf3\x36\xa9\xc3" - "\xd3\x87\x9b\xd4\x7d\xf5\x61\x9a\xc1\x57\x1f\x6e\x9a\x16\x18\x87" - "\x8d\x7a\x7f\xfa\x30\xde\x75\x96\x32\x6c\x34\xea\x43\x2c\x4f\x69" - "\x3f\x98\x77\xf4\xff\xad\xe3\x8e\xd0\xbe\x95\x1e\x70\xfd\x07\xf4" - "\x63\xd5\xe0\x83\xa8\x37\xbd\x4d\xa4\x27\xd3\x88\xb4\x36\xba\x1e" - "\xfa\x08\x4e\x72\x87\x01\x30\x91\x4d\x26\xd7\x16\xb5\x91\xda\xe8" - "\x93\x84\x2a\x47\xaa\xe9\x6f\xf6\x65\xc6\x25\x23\x36\xd3\x0f\x5b" - "\x53\x9c\x21\x62\x33\xbd\xc0\x83\xcd\x5a\x17\x60\x33\x15\xf1\x98" - "\x71\xde\xda\x76\x4a\xc0\x26\xf4\x68\x3c\xf2\xc9\x66\xf8\xf4\x8b" - "\x4d\x68\x13\xbe\xd8\x3c\x6e\x67\xd8\xcc\x78\xaf\x2f\x36\x8f\xdb" - "\xfd\x63\x33\x63\x0b\xc3\xe6\x71\x7b\x68\x75\xc8\x98\xed\xc5\xe6" - "\x71\xbb\x0f\x36\x7f\xb4\x2f\xb3\x33\x2f\x63\x6f\x78\xd8\xcc\xd8" - "\xeb\xa9\x7b\xb1\x50\x77\x48\x53\xf8\x62\x33\xa3\x25\xa0\x0c\x73" - "\xcf\xcf\x02\x7d\xa8\x38\x25\xcd\xdc\xef\x06\x9f\x96\x33\xc5\xe9" - "\xa1\x4f\xd6\x89\xe7\xc9\x53\xe9\x04\x42\xd7\xe9\x14\x9d\xd0\x37" - "\xee\xec\xd4\xcb\x69\xa4\xfc\x2d\xda\xad\x21\x50\x76\x15\xed\xd4" - "\x45\x02\xcf\x62\xe0\x3e\xba\x38\x95\x44\xc1\xa5\x29\x16\xf8\x0a" - "\xff\xc7\xd2\x75\x9a\x51\xf9\xa9\x64\xbc\xaa\x83\xc8\xa1\x0c\x09" - "\xaa\x2c\x35\x51\xb9\x48\x14\xfe\x4f\xb3\x4f\xe8\xa0\xef\x26\xc3" - "\x71\x51\x4e\x09\xdf\x33\xaa\x28\x5d\xa3\x23\xd0\x8f\x93\x83\x0c" - "\x34\x3b\xa5\xb4\xc2\xbd\x4e\x27\xa5\x91\xf6\x7f\xd3\x8d\x09\x7c" - "\x99\xb8\x98\x7d\x16\xc0\x90\x85\x66\xe8\xf1\xbb\x71\x78\xae\x31" - "\xfd\xd1\xbe\x43\xb4\x53\x33\xca\x7c\x81\x8c\xdf\x99\x4a\x62\x4a" - "\x52\x89\x8e\x76\xeb\xa4\xc0\x83\x84\xf9\xab\xd5\x28\xf7\x04\x2a" - "\x85\x6f\xa5\xc2\xb7\x5c\xd8\xff\x83\x6f\xb9\xe0\x5b\x67\xe1\x5b" - "\x67\xe0\x5b\xd9\xf0\xad\x6c\xf6\xad\xd0\x78\x9e\xa5\xed\x6f\xfc" - "\x3a\x7e\xd3\x38\x8c\xb3\xfb\xa5\xca\x38\x62\x1a\x8e\x65\x9f\xdb" - "\xa8\x0f\x11\xef\x59\x99\x81\xf2\xdf\xfa\x3e\x89\xa6\x8a\x49\xfa" - "\x99\xaf\x9d\xa0\xd8\xc7\x7e\xed\x7d\x32\x1e\xdb\x5c\xad\xf3\x34" - "\xb4\xb3\x49\xfa\xc3\xba\xb6\x50\xbf\x15\x70\xfd\x73\x5e\x36\xad" - "\xeb\x8e\xc6\x7e\xa1\xdd\xb9\x55\x4a\x8d\x5d\xd1\xbb\x1c\x1f\x1f" - "\xed\x22\x0b\x8c\x38\x5e\x4e\x8d\xda\x17\x88\xbc\x59\x9a\x5b\x9a" - "\x61\xc3\xb1\xc7\x6c\x83\xef\xd8\x63\xf6\x36\x22\xdd\x0c\x5f\x79" - "\x4d\x4f\xa4\x39\x0e\x02\x74\xbd\x2e\x5d\xfc\x9e\x71\x24\xdd\x45" - "\xbf\x84\xfe\x6c\x55\x3e\xf4\x83\xe3\x6f\x95\xd8\x2d\xa9\x38\x16" - "\xb7\xf9\x2e\xe0\xdf\xbf\xc1\x06\xa9\xf0\x7f\xcc\xcf\x90\x4c\xae" - "\x3b\x25\xdd\x1c\xab\xea\x18\x31\xcd\xa5\x68\xd2\xb8\xa0\xff\xd6" - "\xad\x69\xce\xbc\x68\xb2\xd7\x75\x63\x9f\xf6\x25\xd4\x03\xaf\xde" - "\xaa\x92\x64\x42\xbf\x35\x4e\x4f\xa9\x06\xc7\x97\x13\x8a\xe0\x42" - "\xd9\xf3\x72\x8f\x8c\x9c\x82\xf8\x40\x2c\xee\x64\xe9\x6a\xc4\xe3" - "\x56\xc1\x66\x3b\x22\x6e\x4b\xc4\x36\xe0\x86\xdf\x67\xfc\x8b\x44" - "\x5b\x1b\xdd\x04\x30\x9d\xb0\xc0\x2d\xc7\x76\x94\x60\x79\xe1\x33" - "\x72\xd2\x40\xa4\x19\x5f\x13\x25\x60\x48\x81\xed\x81\x83\xf6\x10" - "\xdf\xa8\x72\x42\xbb\xe6\xd2\xcf\x13\x15\xea\x09\x8c\xe1\x6c\x85" - "\xde\x28\x77\x56\x17\xb9\x63\x25\x89\x72\x9d\xd5\x8f\x76\x9c\xd5" - "\x5f\xb7\x9d\x23\x51\x91\x06\xa2\x2e\x5e\x09\xd8\x5d\x05\xed\xe3" - "\x0c\xb4\x8f\x36\xd6\x3e\x7a\xf0\x9a\x43\x77\xe3\xfe\x20\xbe\x6d" - "\x98\x85\xb6\xb1\x0e\xf0\x9a\xea\x6d\x1b\xae\x55\x3a\x69\xb1\x94" - "\x12\x28\x23\xf0\x3d\x2b\x71\x67\xfa\x08\xd4\xfb\x06\x3a\xee\x9d" - "\x44\xd0\xbb\x50\x57\xea\xfa\x3d\xc8\x62\xd8\xad\x52\x2d\xf4\xf9" - "\x35\x1f\xcf\x6a\x25\xde\x3e\x5d\xee\xdb\x5d\x63\x77\x39\xb4\xcf" - "\xd0\xb3\xcd\xd2\xcd\x3a\x48\x97\x6b\x9f\xfd\xb1\x1a\xe4\xf8\x36" - "\xeb\x03\xe6\x96\xe2\x78\x82\x5d\xfa\x2a\xc6\x03\x22\x38\x87\xf2" - "\x09\x3f\x7e\xfa\x5a\x22\xd0\x12\x37\xf0\xdc\xa5\x28\xcb\xe4\x14" - "\xf6\x56\xcb\xcb\x5d\x7c\xdb\xec\x06\x19\x9c\x4c\x22\xd2\x05\x6d" - "\xc0\x1b\x37\xf0\xa6\x93\xd7\x19\xb3\x78\x9d\x61\x92\x6f\x4b\xb3" - "\x53\x2e\x7e\x71\x04\x05\xbe\xc8\x71\x0c\x69\xbe\x81\xd0\x4d\xa7" - "\x81\x47\x1d\xf5\xa8\x5f\x22\xb9\x75\x4c\x87\xec\x00\xfe\x28\xdb" - "\x88\x9a\xe6\x4f\x4e\x7c\x3f\xbd\x6a\x98\x1b\x70\x8e\x7a\x44\x95" - "\x25\x19\x09\xb2\x8a\x34\x61\x3b\x87\x76\xaf\xca\xe2\xf5\x1a\x2f" - "\x5b\xd7\x3a\xdd\xcd\xdd\xeb\x74\x5a\xb8\xc6\x79\x74\x0d\x9e\x1b" - "\x56\x8c\x7a\x26\x2f\xab\x0a\xf5\x8c\xd5\x68\x27\x2e\xe0\x65\x24" - "\xda\xa5\x75\xba\x68\x9e\xa7\xcb\x80\xa7\x4b\x89\xfc\x4e\x27\x91" - "\x40\xb9\xd4\x50\x66\x52\xa3\x6f\x26\xc8\x63\x37\xb4\x23\xe4\x73" - "\x37\xea\x20\xc0\x1a\xf8\x29\x99\x4f\x2d\xd7\x92\xc3\xba\x63\x04" - "\xe3\x40\x65\x5c\xa4\x4d\x38\x7e\x6b\x85\xae\x02\x55\x36\x69\x90" - "\xb7\x76\xe9\x66\xf2\xf1\x2c\x27\x09\x8c\xe9\x9c\xaf\xbc\x98\xce" - "\xf9\xca\x8b\xe9\x9c\x56\x7e\xfe\x43\x84\xeb\x8b\x85\x80\x6b\x85" - "\x18\xd7\x39\x92\x4b\x8a\xeb\x99\xa1\xe3\x7a\xfb\x19\x11\xae\xd3" - "\xbf\x19\x5c\x7f\x92\xc0\xe3\x3a\xa2\x7b\x2c\xe2\x75\xb3\xcc\xea" - "\xfa\x23\xb1\x4b\x73\x8e\x7a\x70\x7b\xe4\xb7\x88\xdb\x5c\xcd\x95" - "\x8a\xdb\x8b\x9d\x3a\x2d\x5c\x43\x8e\x5b\xc8\x33\x68\xdc\x7e\x92" - "\xd0\x45\x3c\xfc\x43\xfc\x52\xd3\x24\xbd\x36\x83\x3c\x0c\x7c\x2b" - "\x55\x65\x8d\x23\x35\x8c\x87\xa5\xda\x67\x29\x07\x3a\xe2\x69\xc4" - "\x53\x57\x36\xa5\x9c\xa2\x31\x37\xe3\x53\xa2\x86\x6f\xd4\x59\x5d" - "\xef\x11\x95\x01\xe7\xa3\xca\x12\xa8\xf2\x39\x1d\x3f\x67\x25\x25" - "\x32\xce\x3c\xa9\x14\xc7\xae\x70\x6c\xd1\x6d\x6e\xaa\xe3\xcc\x37" - "\xc4\x71\xca\x67\x32\x71\x3e\x8b\x2a\x1f\x34\x74\xe6\xe5\x96\x7a" - "\xe6\x5a\xfc\xfb\x97\x4d\x75\xd0\x5e\x64\x27\xa5\x5b\x8a\xe1\x2e" - "\x85\xfb\x03\x70\x8f\x80\x3b\x7f\x6e\x5d\x68\x76\x2e\xf7\x28\x1b" - "\xc3\x6c\x8a\x11\xf4\xe0\x31\xbe\x0d\xde\x46\x94\xa7\x84\xff\x3b" - "\xf3\xb6\xc4\x7a\xe6\x6e\xbc\xf4\x3d\xfc\xa8\xc6\x6f\x03\x4f\x64" - "\x6c\x3e\x89\x3d\x8b\xf2\xab\xe1\x9f\x89\x4c\x0b\xf5\x2f\xc0\x79" - "\x5f\xc0\x92\xa4\x93\xea\x7f\x2a\xdc\x1f\x42\xac\xe2\x18\xec\x87" - "\x46\x66\x23\x3d\xdf\x80\xef\x96\xdb\xa5\xd9\xe3\xc5\xdf\xf5\xc7" - "\x0f\xbb\x74\x4b\xc0\x33\x7d\x42\xe3\xc5\x16\x7b\xa0\x7c\xa6\xea" - "\xdc\x34\xb4\xbc\xf2\x02\xee\xff\xa4\xd1\xbb\x2a\xe2\xcb\xdd\x16" - "\xae\x3b\x41\x75\x38\xed\x74\x88\x7e\x49\x5e\xc0\xfe\xaf\x5b\xd1" - "\x58\x1a\x7f\xeb\x38\xe2\x2e\xda\x55\x81\x63\x9d\xe8\x6b\xd5\xea" - "\x5c\x04\xfd\xad\x3d\x2f\xdb\xa5\xdd\xe0\x33\x46\x42\x7b\x9c\xd9" - "\xf1\x01\xdd\x7a\x0a\x7c\xd4\x75\x09\xaa\xfc\x97\xc9\x64\xd7\x59" - "\xcd\xa8\xd7\x41\x07\x75\x81\x3e\xe8\x3a\xab\x57\xd5\x1a\x9c\x84" - "\x2b\xde\x55\x61\x75\x55\x91\x9d\x40\x87\xfa\x17\xcb\x7b\xf1\x6c" - "\x42\x64\xde\x4a\x9c\xbf\x38\x4f\x2c\x2f\xfd\x16\xf4\xef\xeb\xaf" - "\x0d\xdb\x04\x3a\x07\x74\x06\xaf\x87\xc3\xd0\xc1\x5d\xaf\xde\x96" - "\xf8\xd4\x3c\xea\xac\x6d\xfc\x8c\x64\xd4\x10\x75\xc6\x5a\xa2\xc4" - "\xfc\xad\xae\x1a\xa6\x97\x9f\x07\xbd\x0c\xcf\x25\x22\xbd\xcc\xaf" - "\x2f\xe8\xa5\x97\xd1\xff\xae\x6d\x69\x25\x91\x1d\x64\xc4\xcc\x0e" - "\x95\x33\xbd\x83\x72\xe8\x8f\x5b\x5d\xa7\x71\xef\x71\xa4\x47\x47" - "\xbf\x05\x7e\x47\xf7\x2a\xa6\x9f\x8b\x05\xfd\xfc\xd6\x99\xc1\xeb" - "\xe7\xb7\xb2\x41\x3f\x83\xbf\xb7\x1d\x75\x33\xe8\xe5\xbd\x27\x1d" - "\x52\x17\xe8\xe2\xd0\x64\x6b\x0a\xb8\xfe\x63\x26\xd8\x4f\x94\x29" - "\x62\xa7\xa6\xdc\x85\xeb\x11\xbe\x74\x47\x7e\xee\x40\xfb\xd8\x05" - "\xb6\x71\xcf\xcb\xf5\xd2\x48\x23\xc8\xd6\xf0\x01\x75\xad\x49\x50" - "\xd1\xee\x04\xa5\xdb\xd4\x58\xea\xea\xd6\xc8\xbb\xbb\x41\xbe\xa0" - "\x2f\xc0\x5e\xa9\x1d\x1b\xf5\x3c\x4f\xb8\xb1\xbb\x2a\xb8\x9c\xa5" - "\x15\x60\x9b\x26\x96\x9c\x21\x13\xa8\xb9\x5e\xed\x32\xd7\x47\x77" - "\x9b\xeb\xa3\x00\x97\x91\x17\x4d\x28\xf3\x8b\x16\xce\x5c\x1f\xcb" - "\xe5\x37\x38\xdc\xca\xc6\x52\x87\xb2\x5e\x03\xcf\x3a\x6e\x23\xe0" - "\x60\x03\xe1\xe7\xb4\xb4\x33\xd1\x0e\x9b\xcd\xfe\x70\xb0\x3d\x3b" - "\x34\x5b\xfc\x54\x02\xe0\xa0\x1e\x70\xf0\xb5\x18\x07\x07\x89\x2b" - "\x5b\xb0\xd1\x73\x18\x16\x80\xef\x7c\x5f\xa6\xc7\x4e\x3f\xf3\xb1" - "\x7f\x3c\x34\x06\x87\x87\xae\xb3\xbe\x78\x28\x0a\x13\x0f\x60\x5f" - "\x35\x25\xd0\x6f\xba\x78\x56\x27\x2d\x42\x3c\x1c\xf3\xe2\xe1\x77" - "\xff\x70\x48\xbb\x43\xc6\x43\xbe\x21\x34\x3c\xd4\x1b\x06\x87\x87" - "\x65\x72\x11\x1e\x0a\x00\x0f\x45\x80\x87\x6d\x5e\x3c\x9c\x47\x3c" - "\x54\x88\xf0\x50\x08\xcf\xe5\x7d\xf1\xb0\xb5\xf8\xf2\xe2\x61\x58" - "\xfb\x77\x03\x0f\x05\x01\xfb\xbf\x01\xf0\x30\x48\xfd\xb0\x2c\xd1" - "\x8b\x07\x1b\xe8\x07\x1b\xe8\x07\x9b\x48\x3f\x9c\x06\x3c\xd8\x44" - "\xfa\xc1\x06\xfa\xc1\xe6\x47\x3f\xfc\xf2\xbd\xcb\x8b\x87\x6b\x9a" - "\xbf\x1b\x78\x78\xa3\x20\x34\x3c\xd8\x06\xab\x1f\x2a\x45\x78\x00" - "\xfd\x60\x03\xfd\x60\x13\xe9\x87\x2f\x10\x0f\x22\xfd\x60\x03\xfd" - "\x60\xf3\xa3\x1f\x7e\x75\xf0\xf2\xe2\xe1\xda\xcf\xbe\x1b\x78\xd8" - "\x16\x70\xfc\x3b\x00\x1e\x06\xa9\x1f\xf4\x6a\x2f\x1e\x1a\x40\x3f" - "\x34\x80\x7e\x68\x10\xe9\x87\x83\x80\x87\x06\x91\x7e\x68\x00\xfd" - "\xd0\xe0\x47\x3f\xfc\xba\xe6\xf2\xe2\xe1\xbe\xbc\xef\x06\x1e\xde" - "\xac\x08\x0d\x0f\x0d\x83\xd4\x0f\x7a\xbd\x08\x0f\xa0\x1f\x1a\x40" - "\x3f\x34\x88\xf4\xc3\x26\xc4\x83\x48\x3f\x34\x80\x7e\x68\xf0\xa3" - "\x1f\xfe\xeb\x8b\xcb\x8b\x87\xb9\x8f\x7e\x37\xf0\x50\x68\x19\x08" - "\x0f\x1e\x2c\x20\x2e\x10\x0b\xdd\x19\x09\x04\xfb\x19\x7b\x4e\x31" - "\x3c\x20\x0e\x78\x4c\x9c\x4b\x50\xb9\x01\x0b\xae\x8d\x80\x85\x2e" - "\x86\x05\xe4\x05\xe2\x01\xfb\x15\xd8\x9f\x40\x4c\xb8\xa1\x4f\xe1" - "\x52\x42\x9f\x22\x4b\xa6\x41\x1c\x74\x29\x06\xe8\x57\x74\x11\xbe" - "\xef\x87\x7d\xbc\x33\xd2\xed\xff\xf2\x87\x83\xb7\x42\x1c\xe3\xeb" - "\xe9\x5f\xfa\xe0\xe0\xb0\x17\x07\xcf\x07\xe8\x57\x3c\x1b\x00\x07" - "\xf6\x20\x70\x70\xa6\x6f\x3f\x73\xb0\x38\xe8\x5a\x25\xe0\x00\xfb" - "\x99\x9c\xd0\xcf\x7c\x09\xfa\x99\xca\x50\x71\xf0\x56\x55\x78\x38" - "\xb0\x19\x42\xc3\xc1\xb2\x4a\xf4\x13\x18\x0e\x6c\x45\x2e\x25\xf8" - "\x0a\x3e\x38\xe8\xc7\x5f\xf0\xc1\xc1\x8e\xd3\x97\x17\x07\xbd\xfc" - "\x85\xff\x58\x1c\x14\x05\xdc\xff\xcb\x81\xdc\x51\xdf\xe3\xb8\x3d" - "\xee\x33\x89\x74\xb0\x71\x23\xdc\x6f\xb2\x75\x25\x89\x41\x1b\xe1" - "\x5e\x97\xa0\x32\x9d\x21\x93\xb7\xac\x24\x32\xd7\x1a\x90\x7f\x32" - "\x91\x75\x49\x09\xe9\x5a\xa3\x57\x55\xb7\x38\xd8\x18\x12\xae\x47" - "\x05\xfa\x6e\x13\x1b\x43\x72\x9f\x4b\x88\xdc\xd2\xce\xd6\xc0\x5a" - "\xe6\xef\x02\xd9\x16\x1f\xf1\x27\xdb\x1d\x21\xe8\xfa\x2e\xb1\xae" - "\x3f\xed\x2b\x5b\xb1\x9e\x2f\xca\x16\x8d\x21\xcd\x0c\x30\x86\x14" - "\x84\x4c\xf9\xb1\xfd\x33\x4c\xcf\xf7\x8c\x21\x0d\x72\x8c\xbf\x1b" - "\x74\xfc\x5b\x52\x5f\x1d\x1f\x9e\x4c\x4b\x76\xf7\x37\xee\x88\xed" - "\x1b\xdb\xb5\xa7\x4d\xf7\xd8\x78\x6c\xc7\x20\xef\x8b\xa6\xcf\x3b" - "\x78\x5b\xbf\xd1\xdb\xa6\xb1\x2d\x63\xbb\xc6\x76\xcc\xdb\x7a\x8c" - "\x49\x9c\xa3\xb7\x94\x88\xc6\x8e\xdc\x4a\x41\xcf\xfb\xd1\xf1\x5c" - "\xbf\x3a\x7e\xa7\x5f\xf9\x7f\x1b\x74\x3c\xe2\xc0\xd3\xbe\xaf\xbc" - "\xb6\x5d\x1a\x78\xfd\x57\x50\x38\xa8\x4f\x19\x18\x07\xf5\x06\x2e" - "\x67\x79\x94\x08\x07\x05\x80\x03\xd0\xf3\x6c\xcc\x88\xe1\xc0\x3b" - "\x66\xc4\xf5\x1e\x33\xf2\xc1\xc1\xdb\x9f\x5e\x5e\x1c\xf4\x1a\x33" - "\xfa\x8f\xc5\xc1\xae\xfd\x83\xc4\x41\x10\xfa\xa0\x1e\xf4\xc1\x72" - "\x7d\x89\x68\xac\xc8\xad\xb4\x81\x3e\xb0\x89\xf4\x81\x77\xac\x88" - "\xeb\x3d\x56\xe4\x83\x83\x77\x6c\x97\x17\x07\xbd\xc6\x8a\xfe\x63" - "\x71\xb0\xfb\xc0\xe0\x70\x60\x0b\x42\x1f\xd8\x50\x1f\x1c\x10\xe1" - "\x00\xf4\x81\xe0\xf7\xf9\xf1\xf9\xb8\x7e\x7d\xbe\x77\x9b\xbe\xad" - "\x3e\xdf\x95\x8d\x83\xdf\x04\x9c\x2b\x0d\x12\x07\x41\xe8\x03\x1b" - "\xe8\x83\x97\xd5\x25\xa2\xb1\x21\xb7\xb2\x01\xf4\x41\x83\x48\x1f" - "\x78\xc7\x86\xb8\xde\x63\x43\x3e\x38\x28\xfb\xea\xf2\xe2\xa0\xd7" - "\xd8\xd0\x7f\x2c\x0e\xca\xab\x07\x87\x83\x86\x20\xf4\x41\x03\xe8" - "\x83\x97\x17\x8b\x70\x00\xfa\xa0\x01\xf4\x41\x83\x48\x1f\x78\xc7" - "\x84\xb8\xde\x63\x42\x3e\x38\xd8\xf3\xf5\xe5\xc5\x41\xaf\x31\xa1" - "\xff\x58\x1c\xfc\x36\xe0\xba\x0a\x0f\x06\x7a\xc6\x00\xa8\x17\x07" - "\xbc\xec\xd7\x24\xa8\xba\x14\x9f\x77\x78\xfa\xff\xa6\x3e\xfd\x7f" - "\xbd\x25\xe0\x38\x50\xaf\xf9\x65\xbe\x6f\x90\xff\xb9\x83\xf5\x13" - "\x1a\x4b\x51\xfe\xaf\x6f\x60\xfd\x44\xed\xb3\x28\xff\xdf\xf9\x97" - "\x7f\xa8\x63\x82\x8b\x41\xfe\x2d\xfd\xc8\xff\xc5\x00\xfd\x84\x17" - "\x06\x27\x7f\x5c\xef\xd8\x7d\x76\x08\xe5\xef\x19\x13\xfc\x82\x48" - "\xdf\x1a\x54\x7f\x71\x6f\x40\xf9\xfb\x5d\x4f\x52\xce\xd6\x93\xe0" - "\x5a\x92\xda\xd6\x56\xb2\xe5\x02\x51\x47\x26\x31\x4c\xf0\x6b\x4a" - "\x00\x13\xa6\x53\x64\xb2\x8b\xd5\xad\x67\x4d\x09\xc6\x70\x67\x7a" - "\xc1\xc2\xaf\x29\xf1\x8c\x07\xf4\xac\x27\x99\x8f\xeb\x49\xde\x3b" - "\x36\xe8\xb1\x00\x5c\x4f\x92\x02\x32\xee\x00\x19\x9f\x47\xf9\x1e" - "\xf6\x69\xd7\x3e\x63\x00\x81\xd6\x91\x04\x33\xae\x73\x09\xd6\x91" - "\xf0\x63\x00\x43\xd2\xa6\xdf\x2f\x0f\xa8\xdb\x41\x8e\x28\x4f\xab" - "\xce\xc5\x8f\xeb\x7a\xda\xb8\xd5\x58\x47\xb6\x74\x11\xb5\x67\xfc" - "\xdf\x23\x53\xd4\xf7\x14\x70\x40\xcf\x26\x28\x51\xa6\xaf\xaf\x04" - "\x3d\xbf\xca\xab\xe7\xb9\xe1\x4b\x2b\x8a\x37\x80\x7e\xdf\x40\x26" - "\xf0\x3c\x8a\x6c\x70\xb0\xf1\x80\xc6\x52\x6c\xef\xd8\x9e\xa9\xb2" - "\x5e\xd7\x2d\xb4\x77\x26\xef\x1a\x82\x72\x66\x67\x7d\xfe\xfe\x08" - "\xb6\x3d\x94\x79\xa4\x20\xf3\x92\x00\x32\xe7\xe5\x2d\x51\x63\xdc" - "\x10\xdc\x67\xd6\x23\x73\xd7\xab\xa2\xf1\x1f\xb1\xcc\x85\x71\x1f" - "\x0e\xda\x72\x50\xeb\x87\x82\x94\xfb\x90\x8d\xef\x83\xdc\x4b\x04" - "\xb9\xf7\x8c\xef\x0f\x4a\xee\x15\x81\xf7\xbf\xf8\xc8\xbd\xde\x30" - "\x78\xb9\x2f\x93\xfb\x91\x7b\x81\x20\xf7\x6d\xd8\xcf\x07\xb9\x97" - "\x77\x0b\xeb\x46\xfa\xca\xfd\x0f\x1f\x5e\x7a\xb9\x0f\x6b\xff\x6e" - "\xc8\xfd\x8f\x01\xe3\x9f\xf5\x92\xfb\x10\xb4\xf7\x65\x89\x7d\xe5" - "\x6e\x13\xda\xbb\x2d\x0a\xfb\xf5\x54\x69\x13\xda\xfb\x69\x3f\x72" - "\xdf\xf7\x97\x4b\x2f\xf7\x6b\x9a\xbf\x1b\x72\xdf\x1f\x70\xfd\x87" - "\xaf\xdc\x6d\x43\xd1\xde\x2b\xfd\xc8\x5d\x68\xef\xb6\x6d\xd8\x8f" - "\x07\xb9\x0b\xed\xfd\x0b\x3f\x72\xff\xd3\x1f\x2e\xbd\xdc\xaf\xfd" - "\xec\xbb\x21\xf7\x3f\xe7\x06\x29\xf7\x21\x68\xef\x7a\x75\x5f\xb9" - "\x37\x08\xed\xbd\x21\x0a\xfb\xed\x54\xd9\x20\xb4\xf7\x83\x7e\xe4" - "\xfe\x7f\xf6\x5c\x7a\xb9\xdf\x97\xf7\xdd\x90\x7b\x65\xc0\xf5\x7f" - "\xbe\x72\x6f\x18\x82\xf6\xae\xd7\xfb\x91\xbb\xd0\xde\x1b\xb6\x61" - "\x3f\x1d\xe4\x2e\xb4\xf7\x4d\x7e\xe4\xfe\x97\xb7\x2f\xbd\xdc\xe7" - "\x3e\xfa\xdd\x90\xfb\x5f\x8d\x03\xcd\xd7\x7b\x64\xef\x19\xb3\xe1" - "\xe7\x67\xc1\xbf\xf7\xc8\x1b\x71\x80\x32\x47\x2c\x88\x65\xce\xaf" - "\xe1\x59\xc5\xd6\xf0\xa0\xdf\x4e\xa1\x2f\x4e\x87\xf3\xeb\x37\x74" - "\x7c\xbf\x5d\xf0\xe3\xa9\x44\xa6\x41\x5f\x3e\xb0\x1f\xff\xdf\xbf" - "\xf4\xc8\x3b\xdc\xbe\xdb\x40\xf2\xee\xdd\x27\xbf\x52\xe4\x2d\xee" - "\xbf\x0d\x8d\xbc\x0f\xe8\xc3\x93\xb7\xcd\x10\x9a\xbc\x6d\x05\x4c" - "\xde\xfc\x3a\x8d\x72\xaf\xbc\x6d\xdb\x98\xbc\x6d\x85\x81\xed\xf9" - "\xc1\xac\x4b\x2f\x6f\xdf\x31\xf9\xff\x5c\x79\xff\x2d\xa1\xbf\x31" - "\x18\x94\x35\xca\x7d\xeb\xcb\x24\xe6\xf5\x97\xd9\xd8\x8a\xeb\xac" - "\x06\x75\xbe\x0c\xe5\x8f\x7b\x7c\x22\x01\x03\x9f\x24\x38\x48\x57" - "\x67\x02\xc1\xbd\x3c\xb8\xee\xa2\x56\x6f\x27\x56\xe3\xc7\x64\x4b" - "\x32\x51\x57\x27\xb6\x93\x99\xe5\xb4\xdb\xda\x68\xc1\x3d\xde\x32" - "\xcb\x86\x8f\x09\x5d\xa5\x1b\x35\xbf\x83\x48\xcf\x48\x3f\x50\xe3" - "\xba\x8d\x3b\x3a\x80\x27\xb8\xdf\x07\x64\xbe\xe5\x0c\x21\x87\x53" - "\x08\xd1\x2e\x45\x59\x7f\xb0\x62\xd8\x5a\x3f\xfb\x7c\x42\x19\x97" - "\x11\x8f\xbd\xfa\x91\xf5\x0e\xe9\xd0\xac\xcd\xf0\xac\xcb\xf0\x19" - "\x97\x19\xec\xfe\xcb\x21\x5b\x9b\x61\x89\xeb\x6f\xbd\x0d\xca\x13" - "\xdb\xb4\x2b\x9f\x8d\xcb\x58\x8d\x55\x04\xd7\xd5\x60\x1b\x76\x9f" - "\xd3\xc8\x37\xa6\x40\x5b\xaf\x67\x6d\xfd\xf5\x76\xa0\x4d\x6c\x20" - "\x88\x0f\x26\xdb\x6e\x26\xdb\x76\x94\x6d\x03\xa1\x6b\x74\xa3\xce" - "\x48\x2d\xad\x28\x5f\x94\x6b\x86\x8d\xa8\x17\x60\x5c\x14\xd4\xf1" - "\xa0\xdf\x41\xce\x13\x77\xbe\x4c\x26\x60\xfb\x77\x9b\xeb\xa3\x5c" - "\x66\xb6\x46\x03\xf5\x7e\xb7\xa2\x49\x93\x97\x2c\xc8\xff\x05\x94" - "\xff\x87\x7e\xe5\xbf\x23\xdc\xb1\x77\x41\xfe\x61\xef\xeb\xf9\xa6" - "\xda\xfb\xaa\xa1\x6a\xef\xff\x13\x30\x26\x8a\x2f\x0e\xd8\x38\x4d" - "\x68\x38\xe8\xf4\x83\x83\xff\x71\xf8\xc1\x41\x01\xe8\x7d\x79\x2f" - "\x1c\x6c\x13\x70\x50\x08\xef\xcb\xfb\xe2\xe0\xa3\xb5\x97\x07\x07" - "\x41\xee\xe7\xf9\xd6\xe3\xe0\xd0\xac\x20\x71\x10\x86\x3e\x38\xeb" - "\x07\x07\x87\x9c\x7d\x71\x60\x03\x7d\xb0\x2c\xd1\x17\x07\x36\x41" - "\x1f\xd8\x40\x1f\xd8\xfc\xe8\x83\xc3\x9b\x2e\x0f\x0e\x82\xdc\xc7" - "\xf3\xad\xc7\xc1\xdf\x03\xda\x7f\x5f\x1c\xd8\xc2\xd0\x07\x27\xfc" - "\xe0\xe0\x7f\x89\x1f\x1c\xa0\x3e\xa8\xec\x85\x03\x41\x1f\xd8\x0a" - "\xd1\x3f\xec\x8b\x83\xff\x7d\xed\xf2\xe0\x20\xc8\xfd\x3b\xdf\x7a" - "\x1c\x54\x05\xdc\xff\xdb\x0b\x07\x61\xe8\x83\x0f\xfc\xe0\xe0\x88" - "\xbc\x2f\x0e\x1a\x40\x1f\xe8\xd5\xbe\x38\x68\x10\xf4\x41\x03\xe8" - "\x83\x06\x3f\xfa\xe0\x88\xf9\xf2\xe0\x20\xc8\x7d\x3b\xdf\x7a\x1c" - "\x7c\x1c\xb0\xff\xe7\x8b\x83\x86\x30\xf4\x41\x86\x1f\x1c\x7c\xa2" - "\xf6\x83\x03\xd0\x07\x7a\x7d\x2f\x1c\x08\xfa\xa0\x01\xf4\x41\x83" - "\x1f\x7d\xf0\xc9\xaf\x2f\x0f\x0e\x82\xdc\xaf\xf3\xad\xc7\x41\x75" - "\xc0\xfd\xdf\x62\x1c\x74\xf7\xf4\x17\x2a\x79\x1c\xe4\x6d\x60\x38" - "\xd8\x84\x38\x68\x65\xeb\x77\x4c\x02\x0e\x7a\xfa\x0a\x2d\xbd\x31" - "\x50\x13\xd5\x83\x81\xaf\xbc\x7d\x85\x6e\x90\x37\x3f\x1e\x24\xf4" - "\x13\x3c\xe3\x40\x7c\x3f\x01\xfa\x89\x79\xed\x82\xfc\xf9\x31\x81" - "\x1a\xff\xf2\x0f\xa1\x9f\xe8\xb3\x46\xa3\xb7\xfc\xaf\xf0\x7d\x3a" - "\x7d\xc6\x05\x6c\x83\x5d\x9b\x51\x1b\xa4\xfc\x3d\x7e\x41\xb0\xf2" - "\x3f\xe1\x47\xfe\x56\x3f\xf2\xb7\x15\x30\xf9\x2f\xab\xf4\xf8\x03" - "\x9e\x71\x21\xde\x1f\xe8\x23\x7f\xeb\x65\x92\xff\x95\xb9\x3f\x67" - "\xe8\xe5\x5f\x17\x50\xfe\x05\x52\xae\x02\xae\x4a\xb8\x2c\x70\x55" - "\xb9\xa5\x64\x6a\xb1\x94\xe3\xf7\xf3\x60\x0c\xf1\xe2\xec\x3e\xef" - "\x87\xd3\xe1\x8f\xcf\x40\x1a\x90\x21\x7f\x66\xab\x27\x0f\x9a\x47" - "\x90\x8f\x16\xa5\x24\x11\xe3\x5f\x21\xed\x08\x4f\x5e\xca\x2c\x12" - "\xe7\xc9\x0b\xea\x97\x09\x7c\xb7\xa8\xb2\xe2\x86\x03\x7d\x15\xcd" - "\xdb\x62\x07\x5a\x39\x9f\x67\x96\x2c\x1a\xe9\x3d\xb4\xee\x6c\x09" - "\xc6\x6c\xb2\xa8\x24\x40\xcb\xf2\x1c\x29\xd0\x69\xb9\x6c\xa2\xe5" - "\xcb\x29\x95\xe2\xf7\x7a\x97\x73\x94\x40\x17\x23\x2e\xa3\x32\x2b" - "\x8e\xcf\x4f\xa0\xb9\x86\x0e\xbf\x71\x8a\x50\x17\x9d\x98\xce\xfd" - "\x28\xc1\x3c\x3d\x74\x0a\x21\xaf\xf1\x3e\x34\xbb\x08\x51\x49\xb4" - "\xac\x7c\x46\x29\x11\xca\xa7\x44\x5a\xf7\xa8\xdc\xfd\x6e\x89\x2c" - "\x96\x93\x92\x58\x9f\xdf\xe4\x10\x9e\x5e\xa0\x8d\xe4\x69\x87\xbf" - "\x82\xb4\x13\x04\x9e\xcb\xc4\x3c\x17\xe8\x54\x1e\x3e\x8a\xdf\xb9" - "\xb3\xa5\x98\x17\xbe\x07\x5f\xeb\xe5\x4a\xa8\xc3\x64\x0f\x9d\xe7" - "\x7b\x56\xf0\x00\x78\x5a\x29\xb9\x4b\x90\xc9\xb5\x50\x8f\x38\x0f" - "\x1d\xc6\x51\xf3\xd0\x02\xae\xc7\xec\xf4\xf2\x66\xb4\x3b\x2f\x2f" - "\xc5\x9d\x25\x9b\xd2\x3b\x4f\x55\x96\xc4\x8e\x74\x35\xad\x7c\xde" - "\x20\xbf\x3c\x1d\xd0\x5f\x27\xf0\x68\x1a\x93\x89\xba\x47\x26\x6e" - "\xa9\x0b\xdf\x59\x4a\x58\x59\xa3\x04\xba\x19\x7d\xe9\x64\x62\xba" - "\xef\x31\x3e\x6e\x97\x03\x6f\x66\xf5\xa5\x95\x8b\x69\xaf\x67\xb4" - "\xa6\x72\xa0\x9d\xdd\x97\x56\x2d\xa6\xfd\x3e\xa3\xcd\xaf\x04\xda" - "\x04\x3f\x65\x1d\x2d\xa2\xd5\x30\xda\x82\x2a\xa0\x9d\xd7\x97\x56" - "\x2b\xa6\x1d\xc3\x68\x77\xa8\x81\x36\xb1\x2f\x6d\x9c\x98\xf6\x06" - "\x46\xfb\x46\x3d\xd0\x2e\xee\x4b\x9b\x29\xa6\xfd\x01\xa3\xdd\xd6" - "\x0a\xb4\xfa\xde\xb4\x3b\x99\x6c\x6f\x16\x64\x1b\xcd\x68\xdf\x74" - "\x02\x6d\x92\x9f\xba\x45\xf0\xf9\x32\xda\xb1\x8c\x36\xaf\x1a\x68" - "\x0d\x7e\x64\x21\xa6\x1d\xc7\x68\x7f\x17\x0d\xb4\x29\x7e\x64\x21" - "\xa6\xbd\x91\xd1\x96\xb4\x01\xad\xd1\x8f\x2c\xbc\xb4\xa3\x4a\x3b" - "\x80\x26\x0d\xea\x59\xe7\x87\xb7\xe2\x3c\x6f\x62\x79\xee\x72\x01" - "\x7d\xa6\x1f\xde\x8a\x69\x6f\x66\xb4\xef\xca\x80\x76\xb3\x1f\xde" - "\x8a\x69\x7f\xc8\x68\xcb\x14\x40\x9b\xdb\x97\x16\xda\x1b\xe3\xef" - "\xdd\x02\x7f\x63\x18\xfd\x9e\x28\xa0\x37\xf9\xe1\x2f\xe6\xe7\x69" - "\xb3\xb7\x30\xda\x62\x0d\xd0\x16\xf8\xe1\xaf\x98\xf6\x47\x8c\xf6" - "\xaf\x16\xa0\xdd\xe6\x87\xbf\x62\xda\x1f\x33\xda\xf7\x1d\x40\x5b" - "\xe8\x87\xbf\x62\x5a\x1d\xa3\xad\x40\xec\x14\xf9\x29\xef\xcd\x22" - "\xda\x5b\x19\xed\x1f\xed\x40\x5b\xea\x47\x1e\x62\xda\xdb\x18\xed" - "\x81\x0a\xa0\xdd\xed\x47\x1e\x62\xda\x9f\x30\xda\xfd\x88\xf5\x72" - "\x3f\xf2\xe8\xa1\x05\xbb\x30\xde\x3d\xea\xcf\x75\x3b\x91\x5e\x22" - "\xe3\xf7\x9d\x51\x29\x6f\xdf\x79\x5a\xc0\x89\x45\xd0\x77\xb7\xb3" - "\x3c\x2b\xb1\x5d\xf2\xb1\x09\x90\xa6\xc6\xc9\xeb\x23\xb0\x2f\xae" - "\x7b\x76\x7a\x75\xf7\x1d\x8c\xf6\x3d\xc4\xee\x7e\xb1\x0e\xa5\x52" - "\x99\x98\xee\x4e\x46\x57\x8d\x7a\xa1\xd2\x97\x4e\xee\xa5\x1b\x65" - "\xc9\x85\xf7\x07\x4a\x7a\xe9\x63\x28\xa7\x38\xaf\xbb\x58\x5e\xff" - "\x53\x00\xb4\x16\x5f\x3a\xd7\xdd\x22\xba\xbb\x19\xdd\xa1\x42\xa0" - "\x3b\xe4\x4b\xa7\x15\xd3\xdd\xc3\xe8\x6a\xb1\x6c\x55\xbe\x74\x71" - "\x62\xba\x09\xee\xbc\xbf\x97\xf2\xb4\x59\xb2\xea\xde\xfc\x03\x5e" - "\xdf\x2d\xb2\x69\xf7\xba\xf3\xaa\xca\x05\xda\x3a\x0f\x0f\x79\x3e" - "\x33\xcc\x4b\x05\xcc\xdf\xe7\xce\xfb\xb8\x42\xa0\x3b\x2a\xb6\x03" - "\x22\x5b\x7b\x3f\x1d\xf5\xb7\x52\xc1\x8e\xf2\x67\x20\x83\x7e\x6f" - "\xf4\xe7\x6f\x18\x6e\x23\xd7\x9c\x92\xda\x0c\xcc\xf6\x78\xce\xeb" - "\x6a\x60\xe7\x26\x17\xed\xaa\x8b\xef\xa0\x2e\x71\xda\x56\x29\xad" - "\xbb\xb3\x83\xc8\x30\x66\x2a\x55\xda\x9d\x76\x48\x77\x8c\xdd\xe5" - "\xe8\xcc\xb3\xa5\xd9\x25\x4b\xf8\xd8\x86\xf0\x7f\xae\x9d\xfc\xa6" - "\x1a\xff\xdf\x9a\x4d\x9d\xc0\x13\x09\x9e\xef\xb2\x13\xfe\xcf\x87" - "\x8b\x3f\x53\x05\xfc\x3a\x9a\x43\xe2\x2c\xa9\x2e\x72\xd2\x48\xa4" - "\x5c\x7e\x59\x81\x36\x19\xe3\x0a\xda\x8e\xd1\x75\xfa\xc9\x50\x96" - "\x0a\xf8\xee\xe2\x66\x78\xe6\xcb\x02\xf5\x07\xdb\xb8\xd7\x92\x8c" - "\xb1\x45\x1b\x46\x3a\x94\x4d\x15\xf4\xd5\xb9\x5f\x19\xd2\xc9\x8d" - "\xa7\xa4\x0d\xf2\x73\xa0\x1b\xce\xad\xd3\xff\x14\xf3\xe0\x94\x65" - "\x7b\x81\xe6\x10\xc6\x24\xa4\x85\xcd\x05\x2c\x5e\x61\x03\x1f\xcf" - "\x1d\xca\x53\x47\xa3\x77\x59\xb8\xae\xcd\x99\x78\x36\x9c\x25\xfd" - "\x14\x69\x16\xbd\x73\x8c\x69\xe6\x63\x19\x42\xfd\x2c\x6e\x93\xdc" - "\xc9\x29\xe4\x1d\xd4\x74\x9d\xc3\x9a\x64\x27\xec\x2c\x98\x06\x1b" - "\x8d\x7c\xde\xca\x99\xe4\x8d\x90\x6e\xb7\x76\x74\xf1\xe9\x90\x47" - "\x01\xfa\x9d\xe7\x14\x6a\x19\x35\xa9\xe5\x96\x1b\xba\x48\x8b\xb4" - "\x81\x6f\xe3\x98\x4e\xcd\xd7\x39\x90\x57\x9c\xf9\x3a\x7b\x84\x86" - "\xc8\xce\x29\xd5\xb2\xce\xbc\x86\x0a\xcf\x99\x24\x9e\x6f\x61\xbe" - "\x76\x21\x2f\x78\x5f\x67\x97\x4c\xb5\xb0\x38\x89\x0d\xf2\x7e\xd6" - "\x88\xa8\xa8\xb9\xac\xaa\x33\xef\x38\x01\xdf\xb2\x82\xc9\xe0\xb8" - "\xc2\x2e\x99\x6c\x12\xfe\xd7\xd8\x25\x0f\x77\x08\xff\xc7\xd8\x25" - "\x73\x9d\xc2\xff\x3d\xf1\x1f\xfd\xc7\xa3\x2c\x2b\x02\x9e\xef\xe7" - "\x76\x24\xc8\xd1\x2f\x46\x5f\x9f\x2a\xcb\x8a\xb4\xe3\xf0\x1c\xc2" - "\xe3\x55\xf0\xcd\xfd\xec\x2c\x80\xe3\x66\xb8\xab\x84\xbb\x43\xb8" - "\x53\xa4\xe1\x71\x15\xfd\x4e\x1c\x35\x1d\xcf\x45\x7e\xa7\xbb\x29" - "\x07\xf9\xd6\x03\xef\x5a\xad\xc6\x56\x81\xa7\xc7\xf9\x33\x90\x79" - "\x99\x82\xdc\xa9\xf2\xba\x56\xfe\x5b\xe6\xa6\x0a\x71\xb9\x80\x86" - "\xc4\xde\x75\xf7\x3d\x13\xee\xbd\xef\xfe\x89\x0f\x2c\x7c\x69\xd1" - "\xe2\x25\x4b\x97\xe9\x97\xbf\xfc\x4a\xd2\x8a\x95\xab\x0c\xab\x93" - "\xd7\xa4\xac\x4d\x5d\x67\x5c\xbf\x01\xe9\x7a\xea\xb0\x63\xca\xff" - "\x6f\xef\x7a\xc0\xa2\x3c\xce\xfc\x7c\xcb\x9a\x22\xc5\x82\x86\x10" - "\x6a\x4c\x5c\x0d\xf4\xc8\x9d\xc0\x62\x48\xa2\xd6\x36\x24\x35\x09" - "\xb9\x9a\xc6\xdc\x79\x57\xef\x4a\xee\xe4\x82\x06\x52\x44\x0b\x24" - "\xe2\xbf\x40\xd0\x5e\xd3\x3d\x95\x4d\xe4\x28\x77\x41\x96\x34\xd8" - "\xb3\x2d\xd7\x98\x0b\xf6\xe8\xd5\xf6\xb0\x92\x1e\x26\x44\x4c\x6b" - "\xee\xc8\x15\xec\x8a\x0b\x2c\xb0\xe0\x0a\xab\xa0\x20\x73\xbf\x77" - "\x66\x3e\xf6\xdb\x05\x8d\xf9\xdb\xe7\xb9\x87\xd1\xe1\xfb\xe6\x9d" - "\x99\xf7\xdf\xbc\xf3\xce\x3b\xb3\xb0\xa3\xf9\x4c\x0c\x74\xee\x07" - "\x9d\xb6\x04\xc1\x0f\x60\xd2\x26\xda\xe6\x99\x2d\x53\xeb\xb4\x25" - "\x06\x7b\x9f\x85\x74\x07\x58\xdb\x16\xba\xfb\x06\xf6\xa7\xb5\x54" - "\x3e\xd4\x40\x77\xa7\xb9\x4c\x6d\x39\x27\xbc\x0f\x35\xd0\xdd\x7d" - "\xc7\x62\xdc\x2c\x76\x21\xdd\xaf\xd6\xb6\x86\xea\x1d\x5f\x60\xac" - "\x11\x7d\xa7\xc2\xb9\x30\x92\xc5\xec\x8b\xe6\xde\xb2\x68\xee\x21" - "\xfc\x65\xe5\xdc\xed\xdd\x96\xc5\xf6\xa2\x0c\xbb\x8d\xec\x32\xb5" - "\x27\x1c\x43\xb4\x8d\x38\x7a\x5e\x55\x39\x77\xed\x8a\xe6\xae\x9d" - "\xe5\xdc\xe3\x88\xe6\xce\xd8\x32\x16\x3e\x6c\x6b\x73\x3a\x4d\x6d" - "\x4b\xc4\xbc\x42\xfd\x78\xd8\xef\x5a\x4b\x51\x97\x34\xc6\x42\x1c" - "\x28\x03\xe6\x3b\x66\x91\x7c\xbf\x3a\x38\x32\x03\xf2\x35\xf2\xd1" - "\x1c\x6d\x2f\xe8\xc8\x71\x6a\x7f\xac\x11\x11\x00\xe8\x79\x5b\x46" - "\x3a\x60\x2b\xed\xab\xe8\x4e\x29\xd0\x8b\x68\xa9\xf0\x30\xc2\xf7" - "\x93\xbc\x91\x19\xf9\x73\xf9\x18\xda\x5a\xc7\xb7\xe5\x68\x68\x13" - "\x0e\xdc\x3e\xa3\x3c\xf1\xeb\x37\x14\x58\x72\x9f\xce\xc9\xb9\x23" - "\x8c\xc5\x8b\x67\xc0\xbd\x7f\x05\xf4\x7d\xb4\xfb\xca\x79\x23\xe4" - "\x6c\x80\xbc\x4d\x6f\x23\xe2\x87\xcd\x30\xc8\x64\x07\xde\x03\x80" - "\x1f\xc1\xfb\x11\xf0\xde\x24\xef\x8a\x1b\x78\x87\xdb\xda\xd3\xc1" - "\x27\xad\x39\x16\xfa\xfe\xda\xa1\xcd\xab\x35\xc8\x5d\x86\x76\x4d" - "\x96\xb9\x2c\xae\xcb\x74\x3a\x01\x7c\xd4\xe0\x9d\xda\xbf\x47\xe3" - "\x88\xf6\x8d\x52\xae\x81\xa3\x54\x86\xae\x1a\xf6\x47\xf3\xdd\xc3" - "\xb6\xd3\xa1\xf4\xbd\xdc\xe2\xfe\x22\x94\xa1\x97\x26\xb4\xb5\x0f" - "\x15\xad\xd6\xb0\x6f\xd4\x1c\x13\x38\xdb\x5b\x89\x27\xe2\x83\xf6" - "\xa2\x6f\x21\xf2\x1b\x1f\x5d\xc3\x12\x46\x98\xf6\x96\x8b\xb1\xca" - "\x72\x5e\x8d\x5c\x89\x5c\xf1\x26\xea\x8e\x23\x37\x01\xde\x8c\xe7" - "\x9b\x78\x1e\x47\xc6\x5e\x36\x86\xf8\xce\xdf\xce\xdd\x49\x15\xec" - "\x76\xc2\x0f\xdb\xfa\x7a\x87\x69\x20\x9e\x78\xa7\xef\xbd\xe7\x61" - "\xa7\x2b\x03\xbf\x2b\xdc\x19\xc9\x50\x8f\x67\xac\x7c\x1a\xb3\x33" - "\x07\x79\xb7\x7a\x3f\xc5\x4c\xbf\x1f\x53\xef\x6e\x64\xdf\xfb\xe7" - "\x60\x7c\x57\xcb\x67\xd6\x5e\x7f\xdb\xeb\xca\x95\xd7\xd7\xee\x6c" - "\x0c\x33\x75\xc2\xfb\x77\x1e\x0c\x84\x77\x16\x4b\x58\xef\x4a\x59" - "\xee\x5d\xa3\x9e\xbb\x98\xa9\x0f\x7a\xea\x03\xfe\xbe\x06\x09\xeb" - "\x6b\xc6\x33\x0a\xd9\x12\x44\x9f\x70\xd6\xd1\x78\x8e\x96\x60\xcd" - "\xc0\x58\x3a\x4d\xa7\x73\x68\x8c\x4a\xa5\x6d\x69\xe3\x5c\xc0\xb2" - "\x60\x5b\x95\x7e\xfb\x71\x3e\x1e\x68\x3f\xce\xb4\x20\xfb\xb1\x93" - "\x3f\xc2\x5c\xa8\x73\x48\x7b\x39\x32\xb4\x2d\x13\x65\xe7\x4a\xe0" - "\x39\x42\x67\x24\xc0\x21\xe2\x8a\xd2\x5e\xc6\x66\x65\x31\x33\xf9" - "\x17\x8f\xc9\xb9\x9f\x6c\x96\x68\x2b\xba\x92\x17\xf0\x07\x58\x35" - "\xf1\xb7\x11\x78\x51\xae\x41\xbb\xea\x16\x36\xa8\xf3\x26\xfa\xd8" - "\x9e\x82\x3d\x2a\x7e\x09\x27\xf5\xe3\x7e\xb9\xb2\xa8\x8f\xa4\x7d" - "\xe6\x31\xc0\x69\x6f\x4b\x7f\xff\x14\xd2\x32\xe6\x64\x64\x93\xf4" - "\x6c\x19\xb3\x62\x2e\xa5\xb1\xf1\xe1\x35\x2c\x29\x86\x59\x31\xdf" - "\x66\x76\x98\xce\xa4\x24\x6e\x67\x56\xc2\x47\x7e\x1d\x72\x8c\x38" - "\x68\x2e\x4a\x5c\xea\xfe\xd3\xd3\x59\x6f\x6e\x62\x82\x4e\x15\xf1" - "\x83\x7a\x03\xdd\x32\xda\xc7\x96\x6e\x95\xb2\x82\x56\x0d\xfa\x1f" - "\x22\xd9\x49\x9f\xa8\xaf\x07\x1e\x3b\xd5\x89\xbb\x83\xa4\x3c\x35" - "\x74\xbf\x04\xe9\x83\xda\xd3\x5d\x94\xf2\x7b\xc2\xdb\x0f\x0b\xbd" - "\xa1\x3f\x8d\x07\x07\x0d\xc2\x51\x34\xc6\xc7\x38\xfc\xd1\x2b\x5b" - "\x47\x10\x7b\x9c\x9d\x19\x38\x3e\x67\xdc\xc6\xf1\x41\xbf\x43\xe8" - "\xdf\xc8\x21\x23\xf9\x13\xd0\x8c\xa0\x78\x03\x30\xfb\xb8\x0d\x38" - "\x9e\x19\x11\xe7\x3a\x5d\xa6\x8e\x4b\xe0\xc5\x4e\x78\xc0\x4f\xa3" - "\xc4\xd5\x91\x72\x74\x7b\xe0\x58\x2b\x7c\x35\x34\xe6\x62\x3e\x6f" - "\x15\x32\xc1\x77\x75\x1c\xaf\x92\x75\xf5\x68\x53\xcf\x47\xd3\x18" - "\xdd\xd7\x20\xd7\x12\x51\x57\x57\x74\x49\x8c\x6f\xa3\xf4\x6b\x1d" - "\x3d\xf9\x3b\xb8\xdb\xcf\x77\x47\xb5\x7e\xe7\x85\xe2\xbb\x8e\xe8" - "\xf1\xcd\xe9\x62\x6d\x25\x1a\xd4\x5f\xe1\xdb\x4e\xf8\x74\x5d\x25" - "\x82\x0f\xa9\xaf\x33\x87\x00\xaf\x21\x5b\x14\x7a\x83\x1f\x1d\x2a" - "\x22\x5b\xec\x20\x1b\x3a\xb2\x97\xca\x9b\x45\x79\x89\xf0\xb1\x13" - "\xf5\x67\x3c\x54\xdf\xe2\xc6\xb8\x7d\x13\xb6\x34\xce\xd8\xed\x51" - "\xcc\xea\x2b\x11\xb2\xd5\xfa\xb6\xad\xd0\x8e\x8d\x31\x46\x7c\x42" - "\x47\xf5\xc3\xb6\xb3\x2b\xb1\xd6\x88\xf8\x01\xfe\xba\x8e\xbf\xb2" - "\x86\x11\xcf\xf0\x67\x8a\xbf\xb3\xbf\x50\x63\x5f\x47\x32\x92\x3e" - "\x13\xa5\xef\x43\x5d\x67\x06\xf1\xee\x97\xfb\x6c\x85\x51\xc7\x42" - "\x6e\x8c\x03\x8d\x17\x8d\x8b\x01\x27\xd9\xbe\x1d\xb8\x6a\x65\x59" - "\xda\x06\xe9\xda\x1e\xcd\x9b\xa9\xbd\xbf\xad\xeb\x1d\xaa\x7b\x16" - "\xb4\x93\x36\x31\x71\xf7\x18\xdd\x5b\x02\xbc\xb5\x74\xcf\x28\x70" - "\xd4\x93\x4e\xc1\x4b\x1c\xd9\x23\xca\xcd\xaa\x5f\x2c\xd6\xf3\x45" - "\xc8\xcb\xfd\xf3\xbf\xf3\xa6\x40\xfb\x72\x05\xcf\x7f\x1a\x6f\xfb" - "\x78\x51\x1a\x13\xf6\x90\xc7\x2c\x03\x26\xd7\x6b\x6a\xed\x50\x63" - "\xdd\x39\xe3\x18\xe6\x8b\x01\xc7\xee\xa0\xb1\xae\x17\xf6\xb8\x79" - "\xa5\x46\x32\xa3\x6f\xbd\xc2\x23\x64\x16\xf6\x54\x22\x6c\xa0\x99" - "\x6f\x86\x9c\x13\x76\x70\xd6\xad\xc6\xb9\x39\x48\x27\xba\xef\x4a" - "\xa1\xfb\xe5\xc8\x27\x0d\x97\xb0\x2f\x0f\x8f\xfa\xfd\x12\x8d\xfd" - "\xb8\x18\x7b\x97\xdd\x21\xd7\x5b\xe5\xb7\x5c\xb2\x3e\x3a\xc0\x86" - "\x89\x97\x37\x84\xfd\x12\x2f\x45\xe9\xc4\x4b\xbd\xe0\xa3\xc8\xc2" - "\x06\x4c\x9d\xcb\x89\x3e\xfa\x36\xa9\xf9\xaa\x70\x9d\xad\x24\x5c" - "\x3b\xe1\xab\x88\x27\xd0\x8e\x17\xfe\xef\x41\xa1\x93\xfd\x8a\xf7" - "\xa6\x91\x12\xea\xeb\xb4\x5f\x32\x89\xbe\x4d\x78\x37\x8f\xc8\x3b" - "\x68\xc2\xd0\xff\x20\x7d\xef\x7f\x97\xa9\x67\x8c\x7c\x34\x7d\xe6" - "\x84\xf7\x4e\xfa\xfb\x50\xf8\x14\x33\xf0\x85\x92\x8d\xea\x76\xe1" - "\x31\xf5\xbc\x4b\xdf\x8f\x0f\x5d\xd7\x22\x46\x3a\x48\xfa\x26\x5b" - "\x46\x8c\x94\x32\x6c\xeb\x32\xeb\x76\x0b\x3a\x95\xa4\x7b\x39\x3e" - "\x5d\x0f\xc3\x8e\xeb\xfd\xb6\xd5\xf5\xb0\xd2\xe3\x41\xe8\x31\x14" - "\xf4\x8e\x2b\xb9\x0e\xa2\x3d\x62\xb1\x9e\x9f\x29\xde\x2b\x54\xfb" - "\x75\xfa\x38\xa8\xb9\xda\xbc\x97\xfc\xaf\x18\x83\xae\x31\xd5\xb7" - "\x46\xd1\xba\xa2\xb7\xa5\x18\x51\xde\x2d\xd5\x75\x85\xfc\x60\x12" - "\xc6\x5e\xf8\x3e\x71\x07\xaf\x84\xd1\xdc\x91\x34\x7a\x0e\x08\x3b" - "\x44\xdc\xe3\xb7\xa3\xae\x53\x41\xfe\x89\x7c\xb1\xfd\x04\x70\x90" - "\x3f\x25\x5b\x22\x9f\x4a\xfb\x18\xe0\xab\x55\xf3\x47\xf1\xdc\x7d" - "\x5f\xa0\xad\xf4\xbc\x00\x5b\x49\xf0\xe3\xee\xb6\x4e\xb5\xce\x39" - "\xa4\x0f\xac\x94\x7d\xba\x9f\x53\xb2\xd5\x4a\xd9\x54\x99\xf4\xf6" - "\xac\xd0\xdb\x03\x06\x3d\x42\x6f\xee\xd7\x54\xfb\x7a\xf2\xe5\xfe" - "\xf9\xda\xdd\xaf\xcf\xe5\xc9\xfe\xc2\xfd\x32\xcd\x07\x03\x5f\x4d" - "\x41\xfe\xa2\x7e\x6a\x7f\xd1\x5d\xa1\xe4\xad\x0e\x9a\x1b\x35\x2a" - "\xde\x3d\xac\x8f\xc3\x09\xec\xd3\xe4\x3d\x4a\xed\x87\xc9\x7f\x12" - "\x6d\xe3\x1a\x54\x25\xf5\xaa\xe6\xb2\x7b\xcf\xe4\x71\x70\xa7\x1b" - "\xe7\x33\x8d\x35\xf9\x04\xc2\x41\x63\x2a\xe2\x4a\xc0\xe4\xb8\xba" - "\x53\xc8\x37\x18\x7d\x34\xda\x96\x8d\x73\x9a\x2f\xee\xb5\x81\x73" - "\xb1\xbb\x59\xcd\x45\x45\xbb\x27\x19\x63\x64\x35\xd0\x3d\x15\x44" - "\x97\xc6\xa6\x91\xf4\xa0\xc6\xf4\x56\x7d\x4d\xa3\xf6\xe8\x5b\x38" - "\x6c\xeb\x09\x0d\x5a\x1f\xed\xc4\x1f\x68\x15\x0b\x9f\x55\x2e\x7c" - "\x45\xe1\xb0\xe0\xa7\x27\xdc\xa1\xd6\x09\xc0\xac\x12\xe6\x6e\x55" - "\x6b\x89\x6e\x37\x3b\x02\x79\xea\xc9\x9a\x3a\x3e\xea\x2e\xd6\xe3" - "\x23\x81\x4b\xf8\xa2\x9e\x1c\x25\x1f\xc1\x12\x24\xac\x3b\x85\x60" - "\x7b\xa5\x1e\xca\xb8\x58\xaf\xba\x5a\xd5\x7a\x45\xf3\xcb\x84\x72" - "\x1a\xcd\x31\x2a\x03\x47\x03\xe1\x6f\x29\xbe\x4c\x7b\x88\x0a\xa7" - "\xa9\xd3\x45\xfe\x80\xfc\x05\xfd\x1e\xab\x78\xd2\xef\x96\x9a\x7a" - "\x67\x91\xdf\xa1\x38\x84\xea\xd1\xee\x14\xf9\x22\xc0\x17\xd0\x7d" - "\xad\xbc\x2f\x14\x78\x7b\xcd\xb2\x6f\xef\x5d\x22\x56\xe8\x4b\x0b" - "\xd1\x61\x7a\x3f\xf8\xad\x4e\xea\x47\xfd\x75\xff\x45\xbe\x6b\x8c" - "\x7c\x93\xa0\xd7\xbb\x45\xd9\xb8\xd8\x37\xe8\x71\xd1\xa8\xc9\xd0" - "\x96\xee\x9f\x11\x3e\xad\xb7\x51\xfa\xb3\xde\xc3\xd4\x57\x8c\x1f" - "\x7c\xe5\xb3\x97\xf8\x19\x47\x1e\x33\x57\x0d\x92\x5f\x6c\xaf\x93" - "\x7c\xf6\x45\x2a\x39\xde\x13\x72\x48\x9f\x6a\x97\xbc\xb4\xd7\x55" - "\x5d\x16\x75\x17\x48\x16\xaa\x2b\x35\xd4\xf1\xd1\x78\xd4\xf5\xcd" - "\x16\x7c\x05\xf5\x1b\x1f\xcd\x9a\xd4\x9e\xee\x1f\x86\x0f\x0d\xad" - "\x2a\xd7\x7d\x6f\x9f\x5d\xf2\xd9\xf7\x88\xee\x77\xa1\xf7\x36\xf2" - "\xbd\xa2\x6e\xbd\x6a\xf3\x35\xf5\x14\xfe\xbd\x6f\x87\xd4\x6b\x8c" - "\x49\xe9\xdb\xa5\xe4\x78\x41\xec\xb3\xfb\xd6\x40\xb7\x7d\x05\xba" - "\x6e\x8d\xef\x34\x7f\x40\x3f\x92\xca\xc2\xee\xb7\x8b\x3d\x6c\x25" - "\xb5\x21\x9e\xe4\x1a\xd1\x9b\x13\x1c\x53\x63\xaf\x37\x93\xd6\x25" - "\x19\xab\xf6\xf7\xa8\xb3\x21\xd6\x90\xf7\x7d\xac\x0b\x9e\x14\xdd" - "\xc7\xf0\xe1\x34\xec\xf9\x3b\xd0\xc6\x23\xee\x35\xa5\x3b\x45\x8c" - "\x6d\xc8\x3f\xbd\x7a\xd9\xa9\x70\x7a\x22\x75\xbf\x41\xbe\xe4\x84" - "\xaf\x43\xc5\x74\x9e\x86\x2a\xe5\x4b\x06\x4c\x9e\xa3\x81\x71\x98" - "\xe7\x68\xa0\xcf\xe8\x7f\x37\xd8\x67\x20\x6e\xde\x35\x6c\xf3\x94" - "\x05\xc4\x01\x80\x5d\xdb\x77\x78\xb2\x68\x8e\xd2\x9d\x72\xc2\x3f" - "\x89\xf3\xae\xfe\x3b\x74\x9e\xc9\x6f\x0e\x6d\xd3\xcf\x2f\xfa\xdf" - "\xa0\x58\x2d\x90\x5e\xbf\x39\xc0\x77\x12\x3d\x1d\x9f\x99\xd1\x9d" - "\x64\xd0\x03\x9d\xb9\x78\x4e\x29\x3f\x5f\x1d\xe0\x2b\xd5\x1a\x46" - "\x7e\x32\x70\xad\x6a\x3f\x1c\xb8\x56\xf5\xbf\x36\xd9\x47\xf6\x17" - "\x5f\xff\x5a\xd5\xbf\x86\xfc\x96\xee\x23\x03\x7d\x41\xff\xae\xaa" - "\x80\x58\xb6\x3f\x5c\x8f\x65\xfd\x7e\xd4\x53\x49\x3e\x0a\xf4\xeb" - "\x15\xed\x31\xac\xfb\x13\xb4\x51\x9f\x72\xc2\x02\xdb\xb4\xb5\x67" - "\xc1\xa6\x9c\x2a\x06\x14\x73\xf3\xb2\xb8\xbf\xa8\x2f\x1e\xf6\x17" - "\x46\x76\xd6\x90\x3b\xc8\x5c\xfe\xb5\xa2\x71\x68\xa3\xae\xdf\x81" - "\x3d\xc6\xb8\x70\x7f\x39\x7f\x7e\xd8\x36\x90\x69\x94\x71\x0f\x60" - "\xa5\xea\x0c\x41\xe8\x56\xe0\x1a\x58\xe2\x28\x0f\x94\x4d\xca\x31" - "\x90\x43\x72\xd0\x9e\x08\xf4\x17\x51\xdc\x83\x98\x0f\xef\x9d\x87" - "\x1c\x13\x36\xef\x34\x5f\x2a\x31\xc6\x57\xa7\xc3\xc9\x57\xaa\xbd" - "\x67\x13\xe2\x1d\xbb\xf1\x2c\xe6\x91\xaf\xac\xb2\x6c\xca\xcb\xce" - "\x2d\x58\xbf\xd8\x92\x9d\x9b\x5d\x90\x9d\x91\x93\xbd\x35\xa3\x20" - "\x7b\x63\xee\xa2\x0d\x19\x4f\x66\x3f\x61\xd9\x9c\x91\x6f\xb1\x16" - "\xc6\x15\x86\x31\x7f\xd3\x65\x96\x8c\xfc\xfc\xa7\x37\xac\xcb\xb4" - "\xe4\x66\x3f\x91\x90\xb7\x2e\x7f\x5d\x81\x25\x23\x6f\xe3\xd3\xb9" - "\x99\x96\xb8\xcc\xc4\x38\xeb\xdd\x99\x61\xc6\x33\xb4\x85\x91\xcc" - "\x33\x7e\xd1\xed\x2e\xbd\xc8\x42\x23\xb4\x4d\x79\x11\x85\xd9\xb9" - "\xf2\xdc\xee\xdc\xbb\x49\x65\x6c\x13\xea\xc3\xe9\x7e\x64\x6e\x1b" - "\x70\xe3\x69\xa6\x76\x90\xd3\x82\xf7\x50\xf0\x3e\x6f\xd8\x76\x0e" - "\x3e\x7b\xa8\x58\xdc\x7d\x0c\x38\x64\x9b\xc7\x2f\x36\xb9\x11\xb3" - "\x6d\xa2\xcf\xd7\x1d\x17\x59\x94\xfd\x19\x66\x46\x0e\x47\x8e\x34" - "\x45\xd2\x59\xd7\x39\xf8\x7d\xaf\x5b\x9e\x7d\x7a\x73\xbc\xb3\x66" - "\x2f\xe7\xbb\x67\x2f\x97\xe3\xe2\xcd\xd6\xcf\xa2\x1f\xfd\x36\x7b" - "\x94\xec\xb3\xc3\xe4\x15\x9f\xc5\xed\x84\x2d\xd3\x39\xee\xd0\x2f" - "\xef\x4f\x45\x3c\xd8\x46\xe7\xb0\xa8\xcb\xf6\x99\x58\x38\xf8\x32" - "\x1f\xdb\x6e\x65\xfb\x40\x2b\x3f\x86\xf3\x61\x9b\xd7\xaa\x9f\xa7" - "\x41\x86\x48\xc8\xd2\x2a\xe5\x38\x77\xa3\x90\xa3\x9c\xc7\x96\xcd" - "\x01\x7f\x2f\x12\x3f\xde\x74\x5d\x06\xf0\xdd\xea\x34\x9d\x6b\x00" - "\x9f\x91\xc4\xd7\x54\x67\x7d\x74\xde\x05\x3e\x0f\x8c\x3f\x03\xbd" - "\xdd\x26\xef\xc4\x2b\xad\x92\xf3\x0f\xf2\xb4\x39\xf0\xbe\x77\x90" - "\x85\xef\xa1\xbb\xcb\x4b\xe6\xf3\xb7\x7d\x63\xac\x25\xab\x95\x45" - "\x6c\xe1\x5e\xfe\x53\xb7\x5b\xc9\x74\x92\x7c\xc3\xeb\x4f\xb5\x9a" - "\x49\x26\xac\x15\xe1\x8e\xc1\xab\x9e\x2d\x9a\xf7\x45\x73\x1f\x7f" - "\xc9\x18\x73\x9d\x5f\x4a\x3a\xa1\x78\x6b\xa8\x84\xee\xc0\x3e\x6f" - "\x01\xed\x42\x15\x1b\xfb\xf8\x68\xba\x21\x96\x3a\x4f\x76\xe6\xbb" - "\x0a\xee\x50\x1d\x37\xdd\x93\x4e\x7d\xe4\xf8\x9f\x3f\x80\x3e\x5e" - "\x03\xfe\xe2\x60\xfc\x84\x13\xef\x5e\x9d\x8e\xdc\x87\x9f\xa7\x98" - "\xc0\x0b\x5b\xf6\x5e\x85\x5e\xec\x8b\xe5\xfc\x54\x0b\xe0\xa5\x97" - "\x98\x19\x6d\xe1\xab\x04\x7e\x27\xf4\xbe\x82\xf0\xef\x8c\x66\x6c" - "\x17\xda\x0c\xd9\xbc\x85\x3e\x71\x67\xf9\x79\xd8\x49\xfb\xa6\xe0" - "\xb3\x6c\x65\xcf\xcb\x82\xec\x39\xf5\x45\x8a\x09\xcb\x80\x1f\x36" - "\x54\x7a\x01\xeb\x30\xca\x89\x65\x2c\x9e\xe8\xe0\xfd\x24\x9d\x87" - "\x0c\xdb\x06\x57\xe9\xf4\x38\xec\x7f\xef\xb8\x3c\x83\x51\xb6\xb5" - "\x88\xce\xaf\x8b\x0a\x39\x3f\x06\xff\x4e\x3c\x92\x8d\xa1\xcf\x2e" - "\xdd\xa6\x60\xeb\xa7\x84\x5d\x45\xb1\x78\x6e\x1b\x0c\x75\xcc\x41" - "\x3b\xd8\x55\x15\xec\x89\xec\x0a\x6d\x0f\xe9\x36\x05\x5b\x3b\x49" - "\xed\xc0\x43\xd8\xa1\xad\xa9\x66\xf2\x91\x2e\xd3\x50\x1c\xd9\x18" - "\xff\xde\x57\x5b\xf9\xcd\xdf\x68\x95\xe3\x34\x14\xd7\x32\x22\xc7" - "\xc0\xaf\xf7\xc1\x11\x83\xde\x4f\xc2\x8e\xc3\x48\xcf\xf2\xac\x7a" - "\x28\x0e\xbc\x9d\x14\xb1\xf8\x0e\x8c\x81\x58\xab\x06\x5d\xd4\x5f" - "\xe9\xb0\xd9\xaf\xc3\xa1\xd4\xa9\x74\x18\xa4\x3b\xb3\xbc\x17\x7d" - "\x68\x25\xcd\x15\xf4\x29\xd0\xef\x3a\x9f\x6a\x2c\x41\xc3\x6c\x2e" - "\x63\xa1\x44\xa3\x31\x4a\xb4\xaf\xd1\x69\x94\x42\xd7\xde\xa2\xac" - "\x6b\xda\x73\x63\x35\x63\x74\x26\x4e\xfd\x63\xa3\x48\xbf\x43\x2e" - "\x7f\x7f\xee\x0b\xee\x1f\xf7\x44\x00\xaf\x22\x83\xd7\x91\x7d\x73" - "\x60\x47\x82\x5f\x5f\xec\xb5\xf8\x8d\xb5\xc8\x75\xb2\x61\x21\xd9" - "\xb7\xef\xf1\x96\x0a\xc6\x08\xa6\xca\x2b\x87\xb0\xf6\x04\x9f\xef" - "\x5f\xfd\xf3\x06\xdf\xfe\xc0\xcf\x1b\x7c\xbb\xaf\xf6\x79\x43\x10" - "\xdd\xf7\x88\xee\xb8\x63\xb5\x66\xa0\xdd\x38\x3e\x05\x6d\xbd\x7f" - "\x62\xb5\x71\x3f\x73\xe1\x0e\xe2\xe1\x04\xd6\x29\x7e\xcb\x6a\x8d" - "\x03\x4f\xa3\x58\xc3\x2f\xc4\xcb\xf8\x85\xe2\xa2\x0b\xa1\xd4\x26" - "\x58\x8e\x89\x14\x1a\x45\x67\xea\xec\x92\x28\xcc\x78\x90\x51\x84" - "\xc4\xee\xf6\xea\xd5\xa6\x80\xc6\x8c\x4f\x51\x08\x67\xec\x1e\xd1" - "\x9e\x23\x49\x90\x2a\x4b\x2c\xe6\x89\xf6\x13\xf5\x1f\x21\xcd\x94" - "\xfc\x0a\x7c\x23\x4c\x93\x6f\x4b\x22\x0d\x2d\x56\x5c\xa3\x37\x67" - "\x7a\x97\xa9\xd2\xb7\x90\x8b\x57\xcf\x00\x3e\xab\x68\xcc\xf9\x98" - "\xc2\xaf\x97\xb9\xb1\x4c\x90\xc0\x32\x52\x48\xba\x81\xc0\xfc\x90" - "\x4c\xf1\xab\x52\x5f\xcc\x9c\x00\x99\xaa\x8d\xbc\x42\xdd\xc5\x33" - "\xc4\x4b\x04\xfd\x18\x01\xbe\x78\xd4\x2f\x59\x35\xd1\xe0\x46\xdf" - "\x73\x86\xe6\x6f\x49\xf6\x97\x56\x5f\x43\xc6\x0f\x9a\x6e\x33\xbc" - "\xcf\x97\x8f\xa5\x6b\x3f\x46\xfc\xd7\x4e\x96\x93\x33\xf5\x57\xbf" - "\x79\x2c\x75\x4d\xd5\xd4\xaf\xff\x65\xfa\x18\x73\xa3\x85\xfa\xeb" - "\xbf\xd4\x10\x58\xbe\xd7\x1e\x58\xbe\xcf\xf9\x31\x70\xce\x04\x91" - "\x22\x27\xf6\x62\xa9\xb5\x13\xc0\x88\xa0\x29\x13\x61\x0f\x9a\x42" - "\xfe\xa4\xb8\x09\x61\xec\xfe\x14\x03\xd8\x3c\x75\xeb\x4f\x26\xcd" - "\x7d\x4e\x4d\x88\xf9\xde\xc8\x49\x95\xf7\x06\xc1\xa8\x7c\x83\x45" - "\xc1\x92\x8f\x4e\x6a\x2f\x60\x16\x43\x59\x4b\xc5\x8f\x6a\xd8\xbf" - "\x77\x72\xdb\xe9\x34\x9d\xae\x23\x69\x34\x3f\xa6\xd3\x27\x94\xb8" - "\x5c\xc5\xe1\x89\xc4\x83\xfe\xf1\x09\x47\xc9\x55\x05\x57\x00\xae" - "\x5e\x3e\x96\x75\x7c\x3a\x4d\xa7\xe9\x34\x9d\xa6\xd3\x74\x9a\x4e" - "\xff\x0f\x92\x66\xdc\x58\xd3\xef\xb0\x7e\x46\x3d\x8d\xfb\x1f\x4d" - "\x65\x23\xcc\xf4\x51\xfa\x71\x95\x58\x71\x6a\x83\xa5\x7a\xad\x33" - "\xd2\xbe\xea\xa4\xf5\xd0\x26\x6f\xe8\xf3\x69\x4d\xf1\x07\xb3\xdc" - "\x31\x15\x6b\x5a\x97\xd4\x17\x8e\x98\x77\xad\x68\x8c\xad\xc9\x74" - "\x45\x95\xad\x3e\x95\x52\x57\xe0\x0b\xdf\xbd\xb2\x79\x51\x6d\x8e" - "\x67\x5e\x65\x7a\xdb\xf2\x23\xdb\xc7\x4c\x25\xf7\xff\x6a\xe1\xf7" - "\xff\xae\x63\xce\x8b\x7f\xf6\x9b\xc5\xff\x96\x37\x18\x66\xfb\xd3" - "\x37\xff\xf8\x47\x4f\xf5\xce\xfd\xe7\xbf\xfe\xdf\x65\xff\xb1\xf5" - "\xf2\x0d\x7f\xff\xe0\xaf\xbf\xf0\x83\xf5\x5d\xd1\xe5\x7f\xf9\xdf" - "\x77\xff\xf4\x99\x8b\x9f\xdb\xfb\xb5\x13\x89\x3f\xc9\x1d\xb8\xad" - "\xea\x6f\x4e\x7f\xf9\x97\xcf\x8e\x6b\xcf\xdd\x77\x74\xc1\xcb\x19" - "\x67\x66\xbf\xf0\xd8\x3b\xc9\xaf\x7d\xeb\xfc\xcc\xef\x3e\x7c\xfc" - "\x8e\x1f\x66\xf7\x7c\xfe\x9f\xfe\xea\xbd\xa5\x3f\xdb\x72\x69\xc6" - "\xb7\x1f\x78\x23\xee\xc0\xba\xce\x9b\xfe\xf1\x2f\xde\xbd\xeb\xf0" - "\xd3\x17\x66\xed\x79\xe4\xed\x84\x7f\xdd\xd0\x7f\xeb\xfe\xc7\xdb" - "\xbf\xf4\x8b\x1d\x57\x42\x76\x7e\xe5\xd8\xed\xaf\x3c\x71\xf6\xc6" - "\x7d\x7f\xfe\xdb\x3b\x5f\xcf\x1f\xfa\xec\x3f\x7c\xf5\xad\x3f\xf9" - "\xf1\x37\xfb\x6e\x79\xe9\x1b\xbf\xfb\xe2\xcf\xb7\x8d\x7e\xe6\x3b" - "\x0f\xfd\xd7\x1f\xfd\xcb\x93\xdd\x37\x7f\xef\xeb\xff\x73\xcf\xbf" - "\x6f\x1e\x8e\x28\x7d\xb4\x25\xe9\xd5\x8d\xe7\xe6\x3b\xfe\xf6\xf7" - "\xf7\xfe\x67\x11\xff\x28\xfa\x63\x21\x51\xbf\xfd\x34\xc7\xcd\x1f" - "\x3c\x12\xb8\x6a\xed\x87\xc6\x63\xd2\xd4\xf8\x4b\x40\xf1\x5d\x4c" - "\x0b\x65\x37\x98\x3f\xc4\x8e\xe1\xc3\xca\x7d\x95\x64\x31\xf6\xbf" - "\x9e\x44\xe7\x47\xc9\xc8\x77\x22\xdf\x22\x20\xfe\x53\x80\x85\xd7" - "\x89\xe3\x93\x4f\x1a\x64\x0f\x01\x67\x33\xd8\x0d\xd0\x56\x28\x9b" - "\xc9\xc2\xd8\x67\x59\x38\x9b\xc5\x3e\xc7\x22\x58\x24\x9b\xcd\xe6" - "\xb0\x1b\x59\x14\xbb\x89\x45\xb3\x9b\x59\x0c\xfb\x3c\x9b\x0b\x69" - "\xe6\xb1\x5b\xd9\x6d\x6c\x3e\x94\xb2\x60\x6a\x59\x8a\x59\x6a\x0c" - "\x7e\xe0\xff\x2a\x96\x2a\xca\x6b\xa7\xe1\x9f\x2a\xbc\x41\xc1\x4f" - "\x2a\xb8\x73\x1a\xfe\xa9\xc2\x2d\x7f\xe0\xe7\x82\x3f\xe8\x53\x43" - "\xe8\x20\xa3\x87\x80\x18\x62\x22\x05\x43\x35\x95\x26\xca\xec\x7d" - "\xfa\x4f\xc2\x17\xd8\x3f\x38\xa5\x22\xab\x03\xd9\x22\xc6\xe4\xe7" - "\x0d\xdc\x98\xc6\xca\xb5\x5f\x99\x67\x17\xd3\x47\x27\xa1\x2c\x4a" - "\xfc\x7c\xff\xd4\x50\x80\x5c\x8c\xbc\x1b\xb9\x14\xf9\x25\xe4\x03" - "\x3a\x6e\xa6\xcd\x5f\xc1\x34\xcb\x76\x3c\x9d\x4c\x5b\x10\x83\x5c" - "\xcb\xb4\xd8\x45\x4c\x5b\xe8\x61\x5a\x5c\x8e\x9f\xf9\xc4\xe7\x27" - "\xb8\xd4\x16\x29\xb8\x05\xef\xc9\xc6\xb3\xda\x0f\xba\x9e\x35\x3c" - "\xb0\x3a\xcd\x92\x9c\x98\x92\x78\xd7\x9d\x19\x96\x84\x55\x09\x96" - "\xc5\xd6\xe4\xe4\x24\xeb\xdd\x49\xc9\xf7\x58\x16\x2f\x5e\x96\x6c" - "\x5d\x66\xb5\x5a\x36\x6c\xc9\xcb\x4e\xb6\x3e\xb9\xce\xb2\x3e\x3b" - "\x6f\xc3\xe6\x8c\xbc\x75\xd7\x21\xf5\x07\x4e\x10\x85\xdd\x7a\x45" - "\xb2\x69\x1c\x21\x8d\xdd\xcb\x4c\x57\x0a\x59\xc8\xec\x54\x36\x69" - "\x48\x35\xbb\x12\x29\x5e\xe5\xa0\xea\x1f\xb6\x31\xed\x07\x8d\x4c" - "\x7b\x79\x8c\x69\x2f\xd5\x33\x6d\xdf\x08\xd3\x8e\xe7\x30\xed\xd7" - "\xcb\x99\x76\x34\x9d\x69\x3f\x47\x9b\xd7\xe3\x27\xc3\x7e\xd3\x2c" - "\x61\xe7\xd0\xb7\x17\xd9\xb5\x92\x69\x6d\x4b\x24\x6c\x14\x63\x73" - "\x31\xe6\x93\x50\xc1\x47\x48\x1f\x74\xdc\xb5\xff\x03\x03\x93\xab" - "\x6c" +static unsigned int ethp_z8e_uncompressed_length = 387604 ; +static unsigned int ethp_z8e_length = 121317 ; +static unsigned char ethp_z8e[121317 + 1] = + "\x78\x9c\xec\xbd\x7f\x7c\x54\xc5\xd5\x3f\x7e\xb2\x59\x60\x13\x03" + "\x1b\x31\xe2\x96\x62\x5d\x2d\xd8\x68\x51\x82\x62\x4d\x2d\x68\x14" + "\xd0\xa8\xfc\x88\x4a\xdb\xa8\x68\x82\x06\x0c\x1a\x21\x42\x80\x05" + "\x42\x36\x2c\xd8\x6e\x10\x48\x54\xa4\x11\x02\x89\x9f\x62\xa5\x2d" + "\x56\x6c\x69\x8b\x6d\x02\xab\x49\x3f\x0f\x6d\x93\x2c\x55\xb4\xb1" + "\x5f\x6c\x57\x9e\x94\xa6\x3c\x01\xb6\x64\x61\xd7\x64\xf7\xce\xe7" + "\x7d\x66\xee\x4d\x76\x97\x0d\xca\xf3\x3c\xaf\xd7\xf7\x9f\xe6\xf5" + "\xda\xdc\x7b\xe7\xce\x9c\x39\x73\xe6\x9c\x33\x67\x66\xce\x9c\x4b" + "\x74\xf1\x7f\x3e\xb2\xf0\x25\x89\x4c\x1f\xb8\xdf\xfd\x6f\x94\xff" + "\xf7\xdf\xbf\xff\xfe\xfd\xf7\xef\xbf\x7f\xff\xfd\xfb\xef\xdf\x7f" + "\xff\xff\xfe\xf9\x93\x68\xd2\x19\x93\x99\xde\xab\x21\x0a\xba\x2c" + "\x63\x7c\x49\x49\x33\x7e\xf0\xb2\x08\xe3\x55\x12\xc6\xf9\x31\x7c" + "\xe5\xdf\x4b\x48\x33\xd5\x90\xe5\x9a\x74\x4a\x17\x3f\xb0\x99\xa6" + "\xee\x20\xda\x32\x4a\x74\xbf\xbc\x55\xf8\x5b\xca\x89\x9a\x77\xe1" + "\x79\xab\xe8\x7a\x79\x94\x08\x00\x4e\xa1\x8f\x0a\xcd\x0c\x67\x1d" + "\x9e\xd7\x21\x1d\x69\x65\x48\x0b\x70\x5a\x35\xca\x19\xe9\xde\xf5" + "\xe7\xa8\xc5\x1e\xa6\x6a\x86\x63\x8f\xd0\xb4\xab\x25\x1e\x0d\xc8" + "\x5b\xce\x79\xd7\x8e\x42\xbd\x19\x44\xae\xad\x22\x14\x85\x83\x85" + "\xeb\xe1\xba\xf5\xfc\x87\xe3\xea\xf3\x23\xad\xd3\xa8\x6f\x10\x18" + "\xe9\x5c\x9e\xdb\x60\xff\x0a\x25\x1f\xa7\x4b\x2e\x67\x98\x8c\x9b" + "\x70\x91\xc5\xdb\x1b\xa6\xe3\x94\x92\xd9\xe3\xa2\xe4\x66\x50\x63" + "\xf3\x56\x99\x9e\xec\x0d\x84\xc9\x5e\x41\x49\x78\x37\x13\x57\x13" + "\xca\x0d\x67\xfa\x3c\x54\x47\x63\xb9\x6e\xc0\x35\x0b\x93\x27\xa9" + "\x7e\x24\x11\xd3\x28\x60\xa2\xaf\x05\x5c\x94\x14\x74\xa5\xa0\xfd" + "\x96\x4c\xd9\x7e\xd4\x8b\xb2\xe6\xe3\x94\xfa\x2f\x13\xf2\xa3\x4e" + "\xbf\x7d\x15\xe3\x90\xfa\x3b\xe1\xf2\x98\x0c\x38\x9a\xcb\x73\xc9" + "\xce\x97\x88\x7a\x5c\xa6\x7b\x03\x26\xab\xd0\xe1\x34\x1a\x70\x38" + "\x1f\xea\x4a\xe3\xba\x7a\x5c\xe6\x97\xa2\xf2\xf8\x8c\x3c\xc0\xdb" + "\x3f\x21\x40\xc9\x8c\xf3\x31\x4a\xcd\xe6\xfa\xf4\xb6\x98\xb9\x0e" + "\xef\xf2\x30\x79\xd1\xf7\xa8\x3b\x03\x6d\xb5\x37\x87\x88\x00\xf3" + "\xd2\xfa\x0a\x22\x86\x0f\xfc\xed\x0a\x66\xea\x24\x03\x26\xc3\xe8" + "\x6f\xab\xcb\x33\xb2\x5e\xe2\xc8\x6d\xb5\x90\x9e\xb7\x30\x1a\x47" + "\x86\x8b\xb6\x5c\xc1\x6d\x69\x01\x47\xe9\x79\xd6\xf7\xd3\xa3\xbf" + "\xfd\x97\xe4\xc4\xc1\xb6\x29\xd8\x49\x80\x9d\xe4\xd1\xcb\xf5\xb7" + "\xdf\x17\x97\x5f\xe5\x4d\x4f\x09\x98\x84\x4e\x87\xd4\xae\x81\xbc" + "\x29\x5b\xa2\xf3\x02\x1f\x93\xa2\x2d\x99\x7c\x94\xda\x81\x76\x26" + "\x23\xcf\x0c\xf4\xa3\x5d\x7f\x7f\xb9\xfe\xde\x86\x77\x77\x28\x78" + "\x97\x64\x47\xc1\x4b\x67\x78\xd1\xbc\xa5\x24\xca\x8c\xdf\x10\x18" + "\xc8\x43\xf1\x1b\x66\x31\xf8\x6d\xa9\x4d\x68\xce\x2f\xa1\x4d\x1b" + "\x1a\x41\x0b\x41\x5e\x47\x88\xec\xa3\xc9\x79\x8c\x2e\xd9\x0b\xf8" + "\xb4\x79\x15\x59\x9c\xa5\x22\xe4\x75\x74\x53\xbb\xbf\x9b\x9c\x7e" + "\xc8\x46\xf8\x2c\x55\x9c\x05\x2f\x86\x4f\x52\xc5\x73\x64\x6b\x29" + "\xff\x3b\x25\xe2\x65\xcd\x24\xc8\x39\x86\xcb\x76\x52\x7b\x5d\x27" + "\x39\xeb\x62\xcb\x3a\xaf\x24\x5b\x1b\x9e\xd1\xe7\x56\xc6\x83\xe5" + "\x2d\x9c\xda\x68\x2f\x7f\x95\xcc\xce\xab\xc9\xd4\x56\xe4\xd1\x71" + "\x49\x73\x30\x2e\xeb\x4f\x90\xe5\x87\x0b\xc0\x87\x27\x18\xdf\x16" + "\xfb\x5b\xab\x42\xa6\x66\xdb\x0c\x6a\xb6\x1d\xa5\x16\xdb\x14\x6a" + "\x71\x4c\xa3\xcd\x27\x28\xad\x39\x34\x99\x5a\xcc\x77\x53\xcb\xd8" + "\x69\xe4\xed\xc6\x3d\xe4\xb7\xd9\x16\x20\xfb\x72\xe6\xa7\xb4\xe2" + "\x2d\x4f\x93\xc5\xa7\x60\x82\x76\x69\x65\xef\x96\x11\x31\xed\xf8" + "\x39\x51\x3b\x96\x7e\x89\x6c\xc0\xaf\x0b\xb8\x7c\x13\xb8\xbc\x39" + "\xd6\x46\x59\xc0\x79\x98\xb7\x36\x4c\xe6\x72\x4a\x19\x44\x8e\x33" + "\x34\xf0\x1e\x64\xb7\x7b\x27\xf4\x09\xcb\x6f\xcf\xea\x7c\xe8\x84" + "\x34\xc8\x7f\xda\x7a\x5d\x06\xba\x9d\xaf\x91\xb9\x67\x45\x7e\x52" + "\xfd\x56\xd1\x19\x74\x0d\x27\xe3\x1d\x64\xb1\x13\xef\xbb\x26\x64" + "\x50\xba\x37\x9c\x43\x07\x7b\xbb\x58\x1e\xbb\x47\x04\x28\x89\xe1" + "\x59\x1d\x90\x9d\xe5\x34\x04\xf8\xfc\xa9\x1e\xe9\x5f\x45\x3e\x94" + "\xcf\xf1\xd1\xd6\xbd\x5c\x5e\x5c\xf1\x68\x40\xbb\xe2\xd1\xb3\xda" + "\x0f\x1e\xed\x11\x3f\x78\xf4\x4c\xe4\x07\x8f\xfe\xcb\xb9\x92\x2c" + "\x91\x2b\x1e\xf5\xb7\x97\xca\x3e\x48\x6f\x2f\x45\x1f\x44\xc8\xb2" + "\xe6\x24\xa5\x3f\xfe\x1c\xfa\x3e\xfc\x09\xad\x59\x48\x36\x2d\xe5" + "\xbd\x0e\x6f\xf8\x43\x7a\xbc\x9c\x04\xee\xbb\x12\xb5\xaf\x27\xb5" + "\xa5\xd0\x90\x2d\xd4\xbb\xdf\x67\xfa\xad\x8d\xeb\xf5\xa7\xb4\x16" + "\xe2\x57\x84\x5f\x31\x7e\x25\x22\xb5\xa5\x04\xb4\x72\x8e\x58\x9b" + "\x44\x3b\x7b\x89\x26\x68\x94\x74\x82\x86\x1f\x01\xfe\xe9\x83\xd0" + "\x6d\x8c\xb6\xe1\xcf\x9e\xaf\x55\x52\x45\x30\x58\x4c\xac\x0b\x59" + "\xff\xb1\x3e\x0c\xba\x46\xd8\x51\x4f\xbe\x94\xdf\xad\xd0\x31\xa9" + "\x7f\xf6\x20\xbd\x2b\xb0\xba\x38\xc9\xbf\xba\xd8\xd4\x93\xfa\xe7" + "\x66\xe4\x99\x86\x3c\x35\x3a\x0d\xbb\x18\x16\x64\xcb\x3f\x3c\x4c" + "\xc9\x80\x59\xfa\xeb\x73\x1d\xe6\x1d\x5b\xc5\x51\xe4\x2b\xe9\x87" + "\x05\xd8\x80\x03\xfa\x8f\xa8\x34\xd2\x40\xeb\xce\x4d\xc8\xc7\xe5" + "\xbd\xa1\x1c\x1e\x53\x7c\xde\x92\x2e\xb2\x86\x29\x55\xf4\xa9\xfa" + "\x90\xa7\x8b\x75\xfa\xf0\x10\x0d\x0d\xba\x28\x8f\x61\x73\x39\x6f" + "\x77\x17\xa1\x5c\xb3\x70\x16\x9b\x90\x3e\x2b\x28\x8a\x93\xd6\x23" + "\xbd\x19\xe5\xf5\xba\xbb\x0c\x1c\xb9\x0e\xee\x6b\x89\x27\xf8\xa1" + "\xb9\x24\x44\xc3\x6b\x29\x19\xe5\x1e\x62\x78\x0c\x0b\x7c\xe0\x43" + "\x5b\x9b\x9b\x4b\xfc\xa4\x89\x18\x98\x3e\x05\xcf\x9a\x1d\x03\x0f" + "\xe9\x02\xf0\x98\xff\x5a\x50\x66\x78\x83\x84\xf7\xe0\xaf\x35\x86" + "\x17\x22\xb3\x5d\xe2\xfb\x1d\x86\x11\x64\xfd\x01\x98\x9e\xe5\x77" + "\x51\x37\x59\x1b\xfc\xce\xe2\xe4\x76\x8c\x9b\x5c\xfe\xad\x8a\xae" + "\x21\xa2\x27\x3f\x99\x79\x8e\xdf\x7b\xc3\x67\x38\xcf\x5a\xd1\x53" + "\x9c\x3c\xbc\x1b\xba\x08\x79\x50\xde\xc1\x78\x46\xf7\xe5\x83\xd3" + "\xbf\x33\x85\xbe\x33\xed\xde\x69\x53\x68\xe6\x9d\x53\xa7\x50\xd6" + "\x37\x6f\xc8\x9a\x74\xf3\xad\x37\xcb\x9b\x9b\x6f\xcd\xbe\x99\xf2" + "\xbe\xfb\xe0\x14\xca\x9b\x35\x85\x1e\xc2\x2f\xef\xa1\xe9\x0f\x4e" + "\x9b\xfe\xd0\x14\xca\xbf\xfb\x5e\x3c\x4d\x9d\x32\x31\xeb\x9e\x1b" + "\xf2\xa6\xde\x3b\x9d\x1e\x98\x73\x53\xd6\x4d\x37\xd1\x9d\xd3\x67" + "\x4c\xcc\xca\xd2\xaf\x13\xb3\x38\xcb\x23\xd9\xd3\x1f\xba\x21\x6f" + "\xc9\xe2\xb2\xc5\x37\xcc\xba\x77\x2a\xa7\x40\xbb\x45\xf1\x50\x66" + "\xe4\x9c\xc6\xb4\x0e\x88\xd3\xb9\xa4\x41\x77\xec\x04\x0f\xe0\xd7" + "\xed\xa9\x38\x06\x1d\x70\xe9\xb2\x9d\xdc\x77\x72\x0c\xb0\x36\x42" + "\xee\xcd\x41\x57\x7a\x39\x68\x78\x98\x69\x68\xbf\x86\xf5\x84\x6d" + "\x08\xde\xbd\xab\x8f\x35\x43\xf0\xbe\x2e\xf6\xfd\x65\xd0\xc1\xd6" + "\xff\x68\xb7\x13\x79\xf1\x03\xdd\x03\xd0\x85\xa0\xaf\x9f\x7a\x9c" + "\xf9\x43\xc0\xdf\x49\xa8\xa3\x13\xb2\x79\x18\x65\x3b\xa2\x64\xbe" + "\x13\xfd\x73\x98\xc7\x95\x53\x94\xfe\x76\x7b\x59\x0e\x71\x3f\x79" + "\xcb\x74\x18\x67\xfb\x61\xa4\x4a\x18\xe8\x7b\xc0\x39\xa2\xe0\x5c" + "\x6a\x8f\xd2\x0f\x3e\x86\xb3\x19\xef\x74\x58\x67\xdb\xa1\x27\xa0" + "\xc7\xaf\xd7\x9c\x99\x24\x52\x1b\x33\xb5\xbe\x4c\x39\x56\xa2\x5c" + "\x7e\x14\x5f\x07\x5a\x1c\xc8\xf7\xc3\xdc\x24\xf0\x41\x12\xc6\x5f" + "\xb4\x25\xbd\x08\xfc\x1d\x88\x6c\x68\x7d\x4e\x9c\xce\x67\x3b\x62" + "\xe8\x71\x1a\xf9\x27\xb4\xaf\x55\xdb\xd0\x5a\x2a\x82\x32\x8d\xe9" + "\xb6\x5f\xf0\x73\x2a\xf2\xf5\xf5\xa7\xbd\xc3\x69\xe0\x83\x64\x96" + "\x57\x21\x64\x3a\xc6\xcc\x91\x2b\xa1\xd3\x3a\x90\xb7\x94\xf3\x4e" + "\x08\xd3\x30\xe8\x1a\x9b\xdd\x99\x44\xc7\x68\x24\x69\xa9\xad\x4b" + "\xa2\xea\x03\x9c\x91\x3c\x48\x31\x3f\x9a\x83\xa7\x01\xa7\x47\xa6" + "\xc3\x8e\x19\xf9\x18\xe0\x2f\x65\x5d\xa9\xf4\xb7\x6d\x1c\xe7\xd3" + "\xc7\xe6\x81\x67\xc8\xba\x82\x63\x1b\xd7\x0c\x5a\xb2\xbd\xc0\xf6" + "\x5f\xd0\x35\x72\x8e\x8f\x86\xfb\xd5\xd8\x68\x1b\xcb\x79\x35\xe0" + "\x28\xd2\xc6\x74\x01\x6e\x99\x67\x55\x37\x1d\x2f\xe5\xb1\x76\x64" + "\xba\xe6\x2c\xa6\x58\x9c\x2e\x6d\x65\xfc\x59\x7f\x80\x16\x1f\x82" + "\x0f\x52\x00\x6f\x57\x2c\x1f\x8c\xf4\x00\xce\x73\xc0\xaf\x03\x6d" + "\x7a\xce\x47\x97\x1e\xd2\x7a\x8a\x51\x2f\x99\x20\x57\xd0\xe7\x03" + "\x30\xf4\xf2\x9d\xb1\xe5\x2f\x75\x73\x39\xe4\x1f\x12\xec\x91\xf9" + "\x37\x32\xcd\x75\xbe\x03\x5f\x5e\x96\x11\x9b\xff\x8a\x7f\x02\x97" + "\xbf\x46\xbd\x9f\x14\xf7\xbe\x0d\xef\xff\x53\x7f\x0f\xb9\xbf\x6c" + "\x4e\x1c\xdf\x96\xe2\xfd\x3f\x80\x6f\x00\x72\x0d\xdb\xe2\xd2\x5c" + "\xf0\x98\x3f\x2a\xff\xfa\xb8\xfc\x0d\xc8\xff\x5f\xcc\x37\x3c\xe6" + "\x70\xfe\x7a\x5d\x76\x90\xdf\x82\xfc\xfb\xe2\xea\x7f\x13\xf9\x03" + "\x51\xf8\x1d\x89\x7d\x9f\x51\x87\xf7\x9f\x31\xaf\xc3\x26\x1a\x82" + "\x3c\xc3\x58\x97\xb0\x1e\x6b\x2e\xe1\xfe\xca\x30\xc7\xe5\x1f\x8b" + "\x7c\x69\x3a\x8d\x4c\x3a\x8d\x72\xb9\x1f\x51\xc7\x51\x85\x43\x46" + "\x76\x5c\x99\x7c\x94\xc9\x00\x1d\x9f\x33\xf8\x32\x41\x99\x92\xb8" + "\x32\x1b\xb9\x1f\x85\xaa\xc7\x1c\xec\x1b\x28\xa3\xeb\xc8\x68\x18" + "\xdc\xb6\x4b\x00\x63\x6f\x5c\xdb\x27\xa1\xde\x31\x9b\x94\xde\xb9" + "\x04\x3c\x74\x13\xd2\xc6\x01\xe6\x32\x96\x01\xc8\x6a\xc0\xeb\x0f" + "\x91\x70\xe6\xa6\x29\xde\xbd\xfc\xd2\x11\x61\xe2\xfb\x1b\xf8\x9e" + "\x61\x8b\xe0\x0c\x5d\x26\x2f\xbf\x14\x57\xa4\x67\xb0\xfd\x96\xc4" + "\x3a\x58\x04\xef\xd7\x14\xcc\xcb\x6f\x11\x26\x32\xe1\x39\xa2\xd7" + "\x71\x25\x9e\x93\x80\xff\x12\x8c\x39\x24\x56\x20\xdf\x2a\x9a\x8a" + "\x74\x4e\x5b\xae\xe7\x1b\x78\x5e\x71\x7f\x58\xbd\x1f\xf5\x27\x55" + "\x67\x2e\xf3\xfb\x24\x3c\xff\x5e\xc1\x1b\xf5\x2e\xc3\xc7\xfd\x44" + "\xfd\x3e\x29\xc2\xb0\x4f\x1b\x32\x39\xea\x1d\x59\x0e\x72\x29\xeb" + "\x43\x79\xb1\x42\xbe\x63\x98\xaf\xe3\x7a\x2f\xae\x2f\xe2\xfa\x00" + "\xae\xcf\x3a\x3f\x23\x9b\x33\x22\xe5\x93\x9f\x1f\xc6\xf5\x41\x5c" + "\xa7\xe3\xfa\x10\xae\x13\x71\xbd\x0b\xd7\xe1\x2c\x27\x18\x57\x79" + "\xce\x15\xc0\x38\xab\x78\x8d\xe7\x04\xc1\x5c\xa6\xc9\x74\xb4\x5b" + "\xd2\x42\x53\xfa\xc6\xa2\xfa\xf5\x72\x39\x27\x04\x7f\x70\xda\x30" + "\xc5\x1f\x2a\x2d\x62\xe8\xa5\xd3\x03\x69\xba\xae\xd2\x65\x53\x4f" + "\x53\xf0\xf3\x00\xff\x30\xe3\x2a\x14\xac\x21\x8a\x07\x74\xf8\xaa" + "\x9c\x39\x41\x9d\x49\xd1\x75\xe2\xba\xcb\xe9\x10\x02\xd7\x1a\xee" + "\x33\x1f\x8d\xf2\x80\x7e\x66\x8d\xfb\x64\x09\xcd\x40\x1d\x25\xdc" + "\x07\x06\x4f\x09\xc5\xa3\x43\xf9\x5e\x5b\xf1\x0c\x74\x14\xde\xaf" + "\x78\x46\xd3\xf9\x50\xe6\x91\xef\x15\x2e\x73\xf5\x3a\x26\x71\xff" + "\xc8\xf7\x32\x3d\xe3\x70\x14\x5f\x8e\x0c\xba\xae\xc8\x8d\xe3\xcb" + "\x72\xf0\xe5\x8d\xcc\x7f\xdc\x67\x4c\x97\x11\xa5\xd2\x26\x30\xf5" + "\xc3\x3f\xad\xf8\x7b\xa7\x3e\x07\x56\xba\xe0\x8a\x9a\x38\x5d\x25" + "\xf9\x3f\x4e\x77\x74\x73\x7f\x25\x97\xb3\x4c\x5d\xe1\xf1\xd1\x5b" + "\x3e\x69\x7f\x6e\x68\x5d\xc1\xef\x03\xe0\x0f\xae\x37\xb9\x94\x75" + "\xc1\x15\x3e\xe3\xbd\x7c\x97\xd2\x91\xc3\xb2\x92\x5c\x22\xdf\x21" + "\x2d\x6d\xbf\xf1\xce\xa8\x27\xb9\x8c\xdf\xd9\x6c\x03\x70\x1b\x73" + "\x75\xb8\xc9\x89\xec\x47\xe1\x6e\xcc\xbe\x81\xc8\x74\x7d\x25\x0d" + "\xf1\x86\x8f\xd0\xec\xb0\x88\x7c\xbd\x92\x52\xbc\xe1\x3d\x74\x1d" + "\xd1\xa5\xde\x70\x23\x65\x12\x5d\xed\x0d\x6f\x81\x3d\xb3\x9e\xdf" + "\x1f\xbc\xae\x32\x29\x09\x57\xe7\xd7\xc8\x94\xe4\x0d\xd7\xd1\xb5" + "\x64\xc6\xb5\x8c\xee\x7e\x5e\x04\xbd\xe1\x22\xe4\x2b\xa1\xd9\x11" + "\x71\x7a\xda\x10\xf1\xb7\x82\x08\xa5\xcf\x78\x5e\x38\xbd\x61\xcc" + "\x2d\xc2\xad\x48\xd7\xc4\xec\xc8\x67\xf8\x05\x85\xe6\x6e\xcc\x9d" + "\x1d\x39\x2d\xa6\x3e\x7f\x10\xcf\x7f\x13\x53\x87\x38\x05\xfa\x49" + "\x78\xc3\x93\xa9\x3d\x10\x40\xfe\x49\x24\xaa\x1a\xb3\x1f\x3f\x6b" + "\xa2\x3e\xd8\x24\x5a\x55\x63\x2e\xda\x93\xdf\x87\xb6\x60\xbc\xfe" + "\x6e\xdf\x6a\x5c\x37\x34\x7e\x47\x3e\x5b\x1a\x8b\xd1\x96\xfc\x1b" + "\x2a\x31\xcf\x70\xa0\x1d\x11\xbf\x80\x1d\x63\xf6\x3a\x8e\xd2\x88" + "\xb5\x6c\xab\x4f\xc6\x5c\xed\xef\x84\x7e\xb0\xea\x70\xf3\x79\x8e" + "\x26\x52\x50\x6e\x43\xe3\x7c\x09\xc3\xdd\xe8\xb6\x26\x09\x3f\xf4" + "\xb6\x95\x69\xe1\x0d\x1f\xc5\xef\xef\xc4\x34\xf0\x86\x03\x80\x49" + "\x56\x94\x73\xf7\xa5\x34\x3a\xf0\xab\xc5\xef\x10\xf0\xf8\x8b\x70" + "\x65\xbc\x2b\x60\x3b\xa0\x7c\x17\x9e\x43\x3c\xc7\x94\xb4\x8c\xd0" + "\x30\xe4\xef\x02\xbf\x4c\x03\xdf\x01\xd7\x26\x9b\xac\x67\x43\xd3" + "\x15\x01\xc1\x6d\x68\x1a\xa5\xda\xd0\x74\xb9\x6a\x53\x53\xb6\x2e" + "\x47\x9c\x76\x2b\xee\xe7\x04\x39\x9f\xbb\x29\x5b\x58\x9a\x72\x43" + "\x90\x4d\xd0\xb5\x92\xe9\x08\xba\x56\x32\x2d\x45\x55\x53\xb6\xd7" + "\xb1\x11\xed\x68\xca\xed\x4b\x69\xca\x47\xb9\xa7\xfb\xa4\x3d\xd3" + "\xe4\x08\x28\x38\x2b\x00\x67\xae\x84\x63\x69\x72\x00\x96\x3b\xe2" + "\xb2\xd3\xec\x95\x22\x34\x3b\xbc\x36\x5c\xb0\x92\x92\xc7\x53\x65" + "\x12\xcf\x65\xbc\x8e\x12\xb4\xb3\x05\xd7\x69\x78\x4f\x97\xa1\xae" + "\x83\x80\xeb\xe0\xfa\x50\x8f\x1b\x30\x9f\x07\xac\x22\xc6\xaf\xd7" + "\x44\xe9\x78\xae\xed\x5d\x2d\xf1\xdb\x0f\xd8\x1d\x9a\xa5\xe9\x90" + "\xc1\x43\xcc\x3f\x8a\x6e\xcc\x37\xaf\x13\xf8\x2b\x7d\xb6\x43\x84" + "\xf1\x2e\xdd\xeb\xe0\xf4\x3a\x6a\x2f\x45\x1e\x07\xbf\x2f\xc3\xfd" + "\x4c\xdc\xaf\x27\xe6\x9f\x59\xa5\x81\xb5\x37\x56\x96\x26\x21\xff" + "\xc1\x82\xb0\x85\x1e\x2f\x35\x57\xb6\x97\x76\xe3\x5d\x37\x21\xcd" + "\xe9\x75\xd4\xc9\xb9\x17\xfa\x35\x1c\xb1\x1c\xc8\x8f\xb8\x9b\x76" + "\x8f\x08\x38\x85\xd7\x51\x86\xbc\xa5\x74\x5d\xa5\x25\x49\xe6\x77" + "\x14\xc9\xf6\x68\x9b\x2b\x89\xcb\xb4\x15\xef\x21\x9e\xc3\xa1\xed" + "\xfe\xb6\xee\xf5\xcc\xa3\x9a\xe6\x3e\x90\x09\xfe\xec\x6b\x2b\xde" + "\x42\x33\xbb\x2b\x87\x81\x1e\x49\x48\x8f\xb4\x75\xb7\x20\x6f\xab" + "\xe2\xd9\x95\x61\x6b\x5b\xf1\x7a\x0a\x5b\x9a\x6a\xc3\xee\x03\xd9" + "\xb3\x57\xf6\x89\x99\xc5\xe2\xe0\x63\xdd\x95\xe0\xd3\x3d\x34\xf3" + "\x64\x38\xb9\xbd\x14\x3c\xbf\x32\x88\xf4\xb0\xe4\xff\x99\x27\x7b" + "\xc4\x2c\x58\x46\xb3\x57\xfe\x4d\xb4\x15\x17\xd1\xe3\x01\x1a\x71" + "\xc9\x5a\xa1\xb1\x5c\xb4\x76\xee\xa1\x4b\x8e\x76\x11\xcb\xc4\x8c" + "\x79\x9a\x98\x79\xf2\xb4\x78\xfc\x39\xcc\x5b\x1d\x93\x81\x23\xe8" + "\x12\xd8\xc2\xf4\xde\xdf\x56\xdc\x08\x1c\x20\x37\x8e\x49\x48\x7b" + "\x1d\x79\x3d\xd6\xc7\x4e\xa6\x53\x6b\xe7\x16\x0a\xa7\x34\xd5\x46" + "\xaa\x9a\x76\x6b\x29\x4d\x87\xd0\x47\x1d\x5a\xd5\x81\xcc\x48\xca" + "\x81\xfc\x70\xd5\x81\x6c\xb1\xe1\xc0\x6e\xf4\x53\x0a\xf7\x79\xaf" + "\x8b\xec\x78\xfe\x51\xaf\xe4\xa3\x03\xe8\xa7\x03\x1d\xb0\x9f\x05" + "\xd3\x52\x54\x1d\xd8\xaf\x64\xe0\x40\x47\x5f\xca\x81\x43\xc8\xd7" + "\xa1\xf8\xf0\x40\x17\xf3\x65\x04\xfa\x0e\x69\xff\x88\xa0\x2c\xde" + "\x87\xfa\x52\x0e\x5a\xf0\xb3\x89\x0d\x07\x8b\x01\xff\x52\x86\xaf" + "\xb9\x0f\x3a\x84\xe5\xa0\xfb\x46\x22\x4b\x7b\xa0\x93\x78\xed\x42" + "\xce\xf5\x1d\x9f\x00\x67\xe6\xa9\x30\xae\x61\xc8\xc6\xc1\x62\xed" + "\xf6\x1a\x29\x83\x22\xe5\xa0\x7b\x76\xe4\x0e\xf1\xf8\x59\x96\x27" + "\xa4\x57\x01\x46\xea\xc1\xdd\x21\xc9\xaf\x07\xdf\x60\x1c\xfa\x56" + "\x67\x32\x1c\x33\xde\xc3\x86\xf6\x5c\x1f\x10\x99\xa4\xb9\x3d\x99" + "\x9a\xc5\xe3\x16\x6e\x0f\xe4\xc1\x93\x1b\x71\x7b\xf2\xef\x1f\x22" + "\xfc\xac\xbf\xfa\xbe\x47\xa8\x67\x1f\x85\x6f\x17\xa2\xbd\x74\x3d" + "\xee\x9b\x48\xca\xb0\xe3\x88\xe4\xab\xb6\xee\x23\xa0\xe5\x9b\x48" + "\x6f\x91\x7a\x8c\x69\x2f\x52\x3c\xb9\x8f\x9f\x1d\x5d\xc9\xbc\xf0" + "\x78\x29\x55\x8a\x2a\x4f\xb6\x56\xe5\xc9\x8c\x54\x79\xf2\xb5\x14" + "\xd4\x93\xfa\xde\x1f\x42\x52\xae\xdf\x03\x5f\xef\x43\x99\x26\xc9" + "\x4f\xa2\xea\xbd\x43\x83\xe9\x52\xd6\x69\xac\xc3\x66\x87\x43\xcc" + "\x5f\xff\x60\xfd\xc7\xba\x0c\xba\xa0\xc0\xd0\x65\xac\xc7\x78\x8e" + "\xc5\xba\x4c\xd3\x75\x99\xa6\xeb\x32\x2d\x4a\x97\x81\xfe\x66\xf0" + "\x7b\x48\xea\x2f\xd0\x93\x75\xd7\xec\x48\x96\x88\xd7\x5d\x5c\x26" + "\x02\xbd\xa4\x41\x2f\xe1\x57\xab\x29\xbd\xd4\xa1\xeb\x25\x93\xa1" + "\x97\x00\x8f\xf5\xb6\x96\x48\x2f\x69\xba\x5e\x8a\xe8\x7a\x49\xd3" + "\xf5\x92\x76\x21\xbd\x64\x69\x42\x7b\x9b\x72\x79\x3d\x15\x72\x53" + "\xc9\xfd\x3c\x7b\xa5\x56\x09\x7e\x04\x1d\x9b\x72\x35\xa5\x8f\x8a" + "\x31\xbf\x32\xb1\x3e\x8a\xa0\xbc\x66\xe8\xa3\xa0\xd4\x1b\x6e\xd6" + "\x49\xdc\x77\x05\x61\x3b\xb1\x2e\x92\x7a\x27\x7c\x75\x98\xf5\x0e" + "\xe8\x77\x47\xbc\xde\x01\xbc\x5a\xdc\xa7\xeb\xf5\x1f\xc2\xec\x3a" + "\x6c\x0d\x3b\xc5\x6c\x47\x40\xd2\xa8\xc0\x51\x56\xc9\x3c\x07\x9d" + "\xd0\x21\xda\x2b\x09\x3a\x69\x37\x70\x04\x9f\x47\x08\xb2\x9b\x19" + "\x86\xbe\x80\x1c\x64\x47\x20\xcb\x33\xbb\x7b\xbc\xb3\x4a\x69\xd8" + "\xe3\x81\xcc\xf4\x99\x27\x85\x1f\xb4\xf1\x3d\x5e\x5a\x49\xb3\x02" + "\x99\xd0\x0f\x4d\x34\xa3\x53\x68\x33\x0a\x7d\x76\xc8\x49\xf6\xcc" + "\x85\x1e\xeb\xe3\xcf\xa5\xd3\xac\xb3\xc2\x03\xfd\xf1\xc1\xcc\x93" + "\xe9\xd6\xb9\x9d\xf4\x95\x19\xf3\x84\x16\x81\x2c\xa2\xad\xbb\xd1" + "\xe6\xfd\xc0\xfb\x10\xe4\xb2\x03\x72\x98\x19\x86\x3c\x46\xcb\x22" + "\xe4\xea\x47\xb8\xb7\xcb\x76\xb8\x0f\x74\x40\x16\xf7\x6b\x72\xbc" + "\xeb\x94\x73\x5a\xd4\xd3\x21\xe5\x27\x05\xe9\x55\x4a\x1e\x35\x55" + "\xae\x4b\x63\xda\x99\x94\x3c\x72\x9f\xe0\x7d\x08\x72\x63\xc1\x2f" + "\x46\x1e\x59\xce\x04\xcb\x59\xe9\xd9\x01\x39\x7b\x4e\x97\xb3\x14" + "\x25\x67\x11\xd8\x2a\x91\xd5\x4a\xd6\x18\x3e\xcf\x7b\xfb\x65\x2d" + "\xd5\x93\x89\xfb\x24\xc5\x37\x52\xde\x58\xd6\xa0\x63\x3d\xb9\x90" + "\x3f\xc0\x13\x7e\x96\x03\xf0\xe5\x5f\x79\x3c\x9c\x55\x2a\xfe\x5a" + "\x10\x19\x8d\x3e\xf7\xe4\x43\xdf\xfd\x6d\x66\xb7\xf8\x2b\x74\x5d" + "\x03\x64\x29\x13\x32\x94\x0d\x59\xca\x85\x4c\xb1\x2c\x1d\x8a\xac" + "\x66\x98\xef\x1d\xea\x87\x21\xc7\xd3\x58\x59\x1a\x6c\xdd\x35\xe8" + "\xb2\x77\xfb\xa8\xa9\x95\x6d\x1a\xdc\x87\x7c\x74\xa0\x41\xdd\x5f" + "\x6d\xf6\x51\xc3\x51\x69\xeb\x40\xfe\x4a\x2b\xe8\xf2\x13\x74\xf5" + "\x7e\xf0\x3a\xe1\x3e\x0d\xf7\x8d\xb3\xaf\x3b\x28\xb4\x8d\x66\x1b" + "\xea\x0d\xb2\x0c\x0a\xd7\x24\xb6\xe1\x72\xc0\x83\x16\x11\xcc\x4c" + "\x83\xed\xa8\x89\x3e\x1b\xaf\xed\x59\xf1\x3c\x02\xed\x1f\x8b\xeb" + "\xc8\x1d\xe7\x28\x03\x3f\xdb\x0e\x97\x56\xc9\xf6\x15\xee\xb3\xc4" + "\x0a\x5b\xea\xe6\xe5\x34\xde\x1a\x20\x4b\xbd\x4b\xcb\xb7\xae\x4d" + "\xe7\x35\xae\x0c\xbe\x17\xae\xd7\xa9\xfe\x1c\x99\x79\x1d\x42\x1b" + "\x8e\xfa\x1c\x56\x21\x96\x66\x52\xfd\x12\xe8\x06\x17\xd9\xea\x5d" + "\x62\x6f\x24\x28\xe5\x31\xdb\xc0\x85\x71\x03\x9e\x57\x02\xcf\xd6" + "\x6f\xaf\xcc\xa1\xdf\x39\x28\xe1\xda\x30\xda\xd9\xdf\xfe\xc4\xef" + "\xaf\x49\x33\x68\x32\xc8\xfb\xf1\x06\x9d\x06\x59\x47\x34\xf3\x38" + "\x1e\x59\x2e\xfc\xd5\x4f\x13\xd3\xc2\xe6\x0c\x8b\xff\x04\x1d\x2b" + "\x2b\x22\x74\xe5\xec\x95\x57\x09\x6f\xb7\xf0\x78\x1d\x27\xa9\x1e" + "\xef\x2b\xca\x31\x76\xa6\xb4\xfa\x44\x55\xeb\xd1\x9e\xe5\x22\xcc" + "\x6b\x47\xa8\xa3\xc6\x47\x93\xb3\x54\x5f\x34\xed\x97\x73\x56\x4b" + "\xeb\x51\xc0\xba\x94\x61\xb5\xa1\x7c\xa4\xaa\xb5\x13\xf9\xf6\xfb" + "\xe8\x8f\xfb\x64\x3e\x4b\xd3\xfe\xd2\x55\xf4\xe5\x13\x74\x8d\x5f" + "\xce\x2d\xdc\xad\x01\xd6\x05\x48\x4b\x47\x5a\x18\xf0\x43\xc8\xdf" + "\xe5\xa3\x5f\xeb\x6b\x12\xd7\x84\x8d\x7c\xb8\x97\x76\x7c\x0c\xff" + "\x24\xc9\xc5\x7b\xf4\x97\x7d\x60\x73\x2c\x49\x5f\xce\x37\xfe\xd2" + "\xf1\xcb\x49\xfc\x7a\x40\x97\x1f\xc8\xee\x81\x8e\x76\xae\xa1\x31" + "\xe8\x1f\xe0\xf7\xd5\xe7\x30\x4f\x39\x2e\x5c\x5f\xb5\xfc\x70\x55" + "\x08\x73\x89\xaf\x96\xfb\x68\xe3\xe4\xc1\xe8\x89\xf6\x77\x68\xe7" + "\x44\x57\xf5\xf2\x7e\x5a\x7e\x0a\xdd\x28\xf8\x9e\x75\x51\x3d\xd2" + "\x99\x6e\x80\xd3\x62\xd0\x6c\xf0\x7e\x69\xf5\xab\x39\xee\xd8\xb1" + "\xc2\x25\xc8\xf3\x15\xde\xd3\x1a\x3b\x4e\xd1\xe1\xc0\xa1\x1e\xe8" + "\x11\x5e\x97\xc6\xdc\x2f\xb0\xd4\x26\x40\xaf\xb1\xb0\xff\xc7\x37" + "\xe8\xeb\x5e\x01\x6f\x78\x3a\xeb\x96\x84\x63\x16\xef\xc1\x0d\xc0" + "\x1f\x37\xad\x7d\x0c\xf4\x90\xd4\x4d\x1d\xeb\x2b\x14\xde\x21\x86" + "\xeb\xa9\x38\x43\x9d\x78\xbf\x34\x20\xba\x84\xbb\xc3\xc1\x73\x0d" + "\xcf\xf2\x5e\x4e\x9b\x0e\xde\x16\x9e\x25\x8c\xd3\xb8\xe9\x9e\xaf" + "\xf4\xd2\x71\x07\x25\xd7\xf7\xaf\x37\x8d\xcb\xe2\xf5\x25\xb5\xae" + "\x36\x76\xaf\x8f\x6e\x2c\x36\xf0\x62\x3b\x04\xf4\x65\x5a\xef\x67" + "\x7b\x84\xf7\x3a\x96\x96\x8b\x10\xdb\x25\xc8\x7b\xd4\x68\x03\xb7" + "\x4f\x6f\x97\x3f\xba\x5d\xbc\x27\x66\x2d\x57\x34\x58\xba\x92\x2c" + "\x76\x45\x6b\x0b\xb7\x97\xdb\xc2\x6d\x96\x6d\x91\x3a\x96\xe7\x13" + "\xb7\x60\xce\x26\xd3\x3b\x82\xae\x71\x93\x7d\x74\x83\x59\xf1\xd4" + "\xd8\xbd\xf1\x7c\xd4\xdf\x8f\x96\x26\x37\xe6\xb8\x5f\x71\x6a\xe2" + "\x18\x60\xfe\x5e\xad\xd5\x8d\xfb\xbd\xc6\xb6\x78\x88\xf9\xf7\xfd" + "\x00\x8f\xc5\xde\x72\xd6\xb7\x32\xef\x65\xc8\xdb\x89\x3c\xef\xe8" + "\x79\xdf\x51\x7b\x84\xf2\x3a\x8c\xaf\x18\xc3\x9e\x07\x1e\x87\xfd" + "\x72\xac\xef\xc8\x31\x9e\x05\x9e\x71\x75\x8b\xaa\xf7\x03\x89\x71" + "\xf1\xb8\x79\x2c\x8b\x9c\x13\xdd\xa8\xe7\x0a\xe6\x29\xe7\x4a\xfa" + "\x12\xf8\xf2\xd3\x8a\x35\x74\x19\xf3\x93\x48\x69\x0d\x2b\xba\x5f" + "\x3b\x46\xb8\x60\xf7\x42\xa3\x96\x2e\xa7\x2f\x43\x8e\x02\x27\xe8" + "\xda\x89\x05\xe5\x76\xe0\x4a\x54\x7d\x8a\x48\xea\xa0\x94\xd6\x10" + "\xcf\x71\xea\x4f\xf1\x5a\xd2\xb5\x79\x06\x2f\xe2\x7e\xee\x85\xf4" + "\x05\xc6\x19\x8b\x5a\xdb\xb8\xf6\xf7\xbc\xaf\x71\x8c\xae\xdd\xc7" + "\xed\x55\x7b\xaa\xd7\xbe\x2e\xce\x89\xb9\x42\x8d\x69\xd0\xd5\xd7" + "\x42\x4f\x1c\xb4\xc8\x9f\x8b\x0a\xd5\xf3\x81\x10\xf2\x6d\x11\xe7" + "\x34\xe2\x74\xa4\xed\x11\xae\x24\x96\x89\x46\xd4\xdd\xe1\xa3\x3b" + "\x72\x55\xdf\x5c\xbb\x8b\x61\x25\xc6\xe1\x40\x08\x7d\x4b\xcc\x9b" + "\xc7\xe9\x6b\x77\xda\x2b\x78\xad\xf4\x6b\x97\x4b\xb9\x00\xac\x7a" + "\x93\xd2\xdb\xb0\x51\x2d\x3b\x5d\x5a\x31\x74\x74\xb1\xb6\xe1\xc3" + "\x42\x79\xaf\xbf\x13\xfa\x38\x9a\x18\x7e\xc7\x7a\xcf\x68\xe6\xf1" + "\xaf\xd5\x29\x38\x1d\x0e\xcf\xe8\x13\xfc\xbc\x83\x9f\x03\x96\x8f" + "\x0a\xbd\xb5\x39\xa8\xff\x04\xd7\x5b\xa7\xe6\xfc\x5f\xdb\xd1\x83" + "\x3a\x82\xae\xaf\xd5\xf9\x68\x42\x99\xda\xe3\xf9\xa8\x70\xb0\xbd" + "\x6b\x96\x1d\x96\x39\x25\xd3\xd7\x3d\xd6\xd6\x20\xe5\xaf\xab\xc7" + "\x72\xd0\xa2\xeb\x0d\x5e\x07\x4a\x3b\x46\xd7\xcd\x6d\xb3\x49\xfe" + "\x36\x09\xd3\xd7\xc2\x3f\xd3\xfc\x26\xde\x87\x53\xea\xeb\xba\xb9" + "\xe7\xff\x32\xb3\xf0\x83\x96\xcb\x9c\xa1\x3f\xe7\xe3\x57\x82\x5f" + "\x23\x9e\x67\x48\xda\x6d\x2f\x4a\xf2\xe1\x5d\x0f\xec\x7a\x7e\xf6" + "\x51\x66\xb6\xd8\x3e\xd6\x04\xbb\x44\xde\xd7\x7f\x89\xd7\x12\x32" + "\x8b\xd0\x07\xdd\xaa\x2f\xae\x93\xeb\x29\x90\x47\xa6\xbb\x70\xd6" + "\x8a\x50\x4b\x45\x00\x78\x67\x6e\x69\xa9\x0d\x90\xfd\x5a\x6e\x7f" + "\x66\x2d\xb7\x29\x00\xfa\xf3\x75\x69\xad\xf0\x37\xd7\x85\x89\xf7" + "\x03\x01\x0b\xf2\xbf\xb0\x45\xad\x4b\x74\x34\x30\x3c\x9d\x27\x84" + "\xd1\x7e\xa5\xd3\x3e\x2a\xe4\xbe\x04\xac\xbf\xa3\xed\xd6\x53\x74" + "\xdd\x38\x91\xfa\x61\x61\x73\x31\xd1\x0e\xe8\x11\x8c\x35\x72\x6f" + "\xa2\x5e\xfa\x23\x5c\x87\xf1\xff\x6b\x33\x8c\xfd\xab\x4d\x78\xbf" + "\x19\xef\x30\xf6\xf8\xdb\x8a\x43\xc4\xb0\x22\xdc\x3e\x94\x6f\xd2" + "\xfc\x66\x8c\xd5\xe8\xf3\x8f\x0a\x2b\x4a\xa1\x67\xfa\xf5\x56\x66" + "\xeb\x9a\x93\x22\x64\xb4\xaf\xb9\x81\x65\xe1\x3a\xf0\xff\x33\xbe" + "\x41\xf9\xbf\x1f\xe7\xeb\x57\x36\x8f\x55\x7d\xa6\x81\x2e\xb1\x7d" + "\x76\xbd\x43\xf5\xd7\x75\x7b\x62\xfb\xeb\x7a\x8c\xf2\xd7\x05\x70" + "\x4d\xc3\x6f\x8c\x7a\x8e\xfe\x5d\xe7\x8b\x7a\x1e\x8f\x5f\x11\xf0" + "\xc1\xf8\x7f\x6d\xb1\xea\x07\x4e\x47\x3b\x98\x47\xfe\x45\x16\xad" + "\x2f\x9f\x78\x7f\x98\xd3\x99\x9f\x39\x5d\x83\x3d\x83\x67\xc2\xfb" + "\x74\x96\xd5\x6a\x8d\x62\xde\x7b\xd7\x83\xe7\x56\xf5\x32\xfe\x0f" + "\x30\x2c\xeb\x5a\xb7\x9b\xf9\x14\x79\x40\x23\xb7\x3b\xe8\xba\x7e" + "\xae\x41\x57\xa4\x4d\xe3\xf7\xcc\x93\x48\x2f\xf3\x51\x89\x5d\xee" + "\xff\x62\x4e\x98\xd8\xd6\xb8\xbe\xb6\xdf\x26\xb3\x1c\x2c\x66\x7d" + "\xd4\x4d\x5f\xdf\x05\x9d\x85\xbe\xfd\x30\x5f\x8d\x35\x5f\x7f\x9d" + "\x9f\xa1\x2b\x3f\xc5\x7d\x43\x1b\x74\x52\xef\x86\xd6\xc2\x3e\x13" + "\x0d\xeb\x35\x51\x4e\x78\xb3\x79\x72\x38\xb5\xa5\xc4\xdb\xb5\x8f" + "\xda\xc3\x3f\x27\xfb\xd3\x12\xc6\xab\x5e\xf0\x80\x73\xa5\x88\xbc" + "\xd5\xbb\xdb\xec\x0d\x9f\xf6\x60\x6c\xbe\xea\x04\x7d\x5d\xd2\xe3" + "\x85\x63\x18\xf5\x1f\x97\xb0\x15\x7d\xd2\xcc\xb6\xcd\x0b\x44\x78" + "\xf3\x71\x11\x80\x7d\x97\xba\xa9\x97\xc6\x6f\x5b\x45\x59\x75\xbd" + "\x34\x76\x67\x2f\x65\x8a\x7f\x64\x9a\xea\x60\xb7\x3d\x7e\x36\x9d" + "\xa0\x13\xf2\x47\x94\x92\x65\xe7\x2a\x92\x3c\x12\xd9\x04\xfb\x2d" + "\x0c\xfb\xed\x74\x26\xeb\xc6\x7e\xfb\xad\x4f\xda\xc5\x6d\x45\x8a" + "\x8f\xda\x8a\x86\x17\x53\x52\x5a\x21\xa5\x03\x3f\xe7\x29\xba\xfe" + "\xe3\xb4\x4e\xd8\x8e\x68\xb3\x4f\x6f\x2f\x68\xd7\x6d\x2d\xa6\x61" + "\xb2\xad\xd0\xd7\xa2\xea\xc3\xfc\x41\xc7\x61\x13\xf3\x54\x80\xe5" + "\x86\xdb\xf0\x2f\xde\xa3\xde\x37\x3a\x64\x5e\x5a\x27\x42\x9c\x5e" + "\x76\xb5\x80\xce\xfc\x7a\x07\xd7\xbd\x17\xe9\x41\xd7\x78\xf2\x99" + "\xf6\x8f\x1f\x8c\x47\x31\x37\xd2\xf5\xca\xf8\xb5\xc2\x54\xc9\x73" + "\xf0\xdd\x6b\xc2\xb0\xbd\x4f\xb1\xcc\x8e\xaf\x9c\x5d\x22\xc2\xf6" + "\x45\xec\x2f\x30\xbe\x94\x7d\x19\x78\x0f\xf3\x67\xb0\x6d\x3e\xcf" + "\x7f\x81\xc7\x0b\x9e\x2b\x58\x4b\x00\x73\xc3\xc1\xdd\xc2\x99\x49" + "\x5f\xd4\x7f\x02\xed\x4c\x7b\x79\x14\xfb\xf5\x8c\x6f\xf4\xd1\xcc" + "\x0c\xc6\x5d\xfa\xee\x40\x77\xc2\xde\xba\x0c\x78\x85\x02\xa0\x03" + "\xde\x63\xfc\xbf\xb7\x4b\xdf\x6f\xf6\xf3\x5e\x2f\xd2\x30\xfe\xdf" + "\x2f\xdb\x5b\x76\x35\xd9\xca\xec\x22\xe1\x5e\x3b\xdb\x4c\xbc\x07" + "\x0e\x78\x57\x04\x5d\x37\x8c\x35\xe0\x60\x9c\xfa\x49\x8f\xe9\xdb" + "\xdf\x46\x5a\xb6\x01\x07\x79\x2e\xc7\x73\x6e\x7f\x1e\x55\x26\x3f" + "\xaa\xcc\xb7\x7b\x4c\xd7\xff\x04\x69\x25\x71\x65\xca\xe3\xca\x6c" + "\x8c\x2a\x53\xa9\xd7\xd3\x10\x57\x66\x6f\x5c\x19\x4f\x02\xdc\x8e" + "\xc4\x95\xe9\x8c\x2b\x13\x38\x1f\xb7\x1b\x2d\xb1\x65\x6e\xb4\xc5" + "\x96\xb9\x31\x33\x8a\x96\xec\xc7\x93\x85\xb4\xc9\x71\x65\x66\xc4" + "\x95\x99\x6b\x3c\x0f\x42\xe3\xb4\xa5\x3b\xc8\x06\xde\x64\x5f\x31" + "\xff\xcb\xe8\x9f\x9e\x1f\x3c\x13\xd4\xcb\xd6\x9e\xdf\xae\x1b\xf7" + "\xc4\xd5\xd7\x18\x57\x5f\x6b\x82\x76\xf9\xe2\xca\xf8\x63\xcb\x4c" + "\xa0\xa8\x32\x0d\xaa\x9e\x09\x19\xb1\x65\x26\x8c\x8d\x2b\x33\xe9" + "\x7c\xbe\x9a\x90\x1b\x57\x26\x3f\xae\x4c\xf1\xe7\xd0\x82\xc7\x71" + "\xe5\x47\x37\x8a\x6d\xe5\xbb\x60\x23\x4c\xf8\x13\xfb\x62\xf0\xbe" + "\xeb\x0f\x7b\x43\x43\x78\x3f\x90\xc7\xab\x66\x47\x08\x63\xcb\x04" + "\xcc\x7f\x6e\xc9\x32\xc6\x2c\xf6\x53\x61\x99\x56\x36\xf6\x84\xda" + "\xc1\x6c\x51\xe9\xeb\xa6\xfb\xcb\x71\x5d\xcd\x63\x78\x9c\xca\x32" + "\xf7\xdb\xc4\xca\xe7\x8d\x14\x9c\xac\x87\x8d\x7d\xdf\x7a\xe5\xff" + "\x92\xc4\x36\x79\xb3\x43\x96\xc9\x8e\xb2\xa3\xb9\xfe\xc0\xbe\x55" + "\x21\x73\x2c\x1e\x59\xb6\x0b\xe0\x91\x06\xdb\xa8\xb8\x1d\x56\x11" + "\xef\xe7\xb7\xd5\xc1\x06\x82\xdd\xcf\xb8\x1d\xa3\xac\x06\x69\x93" + "\x2d\xea\x25\xbe\xf7\x96\xdf\x26\xf7\xfb\x95\x4d\x9a\xd5\xd1\x82" + "\xfa\xd9\x76\x6f\x29\x3d\xc3\x3e\x59\x18\x7f\xd9\x76\x9b\x38\xa4" + "\xb9\xdc\xcf\x78\x1d\x36\xfc\x62\x7c\x34\xd1\x2c\x6d\x0d\x77\x47" + "\x21\xfb\x22\xb0\xcf\x4e\x73\x20\x9b\xf3\x80\xff\x27\x1c\x35\xda" + "\x8b\xb1\x1e\x3c\x91\xb5\xe7\x42\x34\x53\x7d\x38\x71\x7c\x2c\x4f" + "\x0e\x01\xaf\x4c\xcc\x89\xed\xf7\x89\x79\xb1\xfd\x3e\xb1\x30\x96" + "\x27\x4d\xe0\xc9\x89\x65\x71\x65\xd6\xc7\x95\xd9\x12\x55\xa6\x46" + "\xaf\x67\x77\x5c\x99\xfd\x71\x65\x0e\x45\x3d\xa3\x8d\x13\x3b\xfa" + "\xe7\x3e\xd2\xe7\x6a\x62\x57\xd4\xb3\x69\x8b\xd4\x9f\x13\xc3\x46" + "\x1a\xaf\x1d\xed\xdc\xaa\x7c\x7e\x14\xbc\x9b\x6c\x71\xf2\x8e\xfc" + "\x37\x8d\x8f\xc5\xe1\xa6\xc9\xb1\x38\xdc\xd4\x2f\xff\xba\xaf\xc0" + "\x7b\xc7\xe9\xe6\xb1\xba\xaf\x40\x37\xc6\xec\xd9\xfc\x0c\x58\xb5" + "\xc8\x0f\x3a\xdc\x54\x1e\x07\x6f\x63\x1c\xbc\xba\xa8\xe7\x74\x3c" + "\xef\x89\x6a\x43\x7a\xb2\x8d\x92\xc0\x2f\xb0\xdf\x6e\x6a\x31\xd2" + "\x79\x4e\x09\x7c\xbb\x9c\x72\xac\xc9\x61\x5f\xb6\x91\xc7\xe8\xa6" + "\xb7\x79\xfe\xa9\xc3\x8c\x96\x7f\x52\xed\xba\xd9\x1c\x8b\xc7\xcd" + "\x19\xb1\x78\xdc\x3c\x36\xaa\x5d\x01\xeb\x5a\x7a\xc0\x1a\x7e\xf0" + "\x61\xb6\x7d\xd8\x7f\x53\xfa\x94\xad\x81\xcd\x76\x96\xd7\xdf\x43" + "\x74\xbc\x8c\x92\xbd\x8e\x2e\xcc\xe5\xda\x06\xb5\xd9\x7b\x52\x3b" + "\x4a\x95\x2f\x17\xd9\x01\x7f\xbd\xc1\x8f\xda\x86\x8e\x52\xad\xea" + "\xc8\x64\xa4\x41\xff\x4d\x4c\x57\x76\xee\x07\x6e\xe1\xcc\xaf\x05" + "\x3d\x31\x2f\x9a\xf4\xbc\x3e\x8f\x58\xcf\x3e\x69\xec\x37\x8b\x31" + "\x3e\x4d\xed\xfb\xdf\xdc\x1a\xc5\xd7\x01\xfb\xaa\x3b\xc4\x31\x9a" + "\xf4\x22\xdb\x00\x2c\xa3\xec\xdb\xd6\x1c\xf6\x13\xcf\xbd\xbd\xe1" + "\x13\xd2\x76\xc3\xfb\x1a\x55\x76\x92\x25\xaa\xac\x5f\x9f\x1b\x77" + "\xf1\xbb\x09\x61\x32\x37\x07\xfc\x04\x38\x19\xca\xde\x9b\xf4\x62" + "\x33\xe4\x15\x65\x26\x1b\x65\x78\x1e\x2d\xf7\x90\xcb\xc8\x7c\x63" + "\x39\x99\x3d\xab\x8e\x49\xd8\x86\x9f\x08\x6c\xe9\x6e\x6f\x79\x17" + "\x79\x03\x1d\xbc\xd6\x65\x56\x3e\x41\x93\x6a\x92\x43\x64\xe9\xa9" + "\xea\x80\x8c\x4c\xaa\x89\x54\x75\x14\x03\xb7\x4a\x1f\xdd\xbc\x8f" + "\xf5\x4d\x34\xed\xa6\x4f\xcf\x7b\x70\xf6\xcc\x1b\xbe\xfb\xe0\xbd" + "\x73\xa6\xdf\x66\x9f\xb3\xf0\xd9\xf9\x45\x37\x2c\x5e\x56\x66\x5f" + "\xb1\x64\x61\xd9\xc2\x45\x4f\xd9\xb3\x1c\xe3\x1c\xf6\x79\x65\xea" + "\x9a\x59\x32\x6f\x69\xd9\x14\xbe\x1d\x6f\x2f\x5d\x32\x7f\xb9\xbc" + "\xbd\x2e\x95\x62\x81\x2c\x2c\x9b\xbf\xc4\x3e\xae\x68\xbc\xfd\xee" + "\x79\x0b\x4b\x96\x2d\x99\x9f\x10\xd6\x6d\xf6\x25\xf3\x97\xcc\x9f" + "\x57\x64\x9f\x62\xcf\x62\xc8\xd1\xe0\xa2\xfa\x33\xcb\x18\xc7\x78" + "\xfc\xaa\x76\x89\xc3\xfa\x78\xe6\x53\xfc\x73\x4b\xd1\xf9\x63\xd9" + "\x2d\x8e\x58\x9e\xbb\xc5\x1d\xcb\x73\xb7\xd4\x9e\x3f\x96\xdd\x12" + "\x37\xfe\xdd\x12\x37\xfe\xdd\xd2\x7a\xfe\x58\x76\x4b\xdc\xf8\x77" + "\x4b\xdc\xf8\xf7\x8d\xfe\xf1\x0f\xbc\xe4\x5b\x27\xf5\xc2\x37\xe2" + "\xc6\xbf\x6f\xc4\x8d\x7f\xdf\x98\x14\xf7\x3c\x2d\xea\xf9\x32\x3c" + "\xcf\x89\x1e\x1f\xf1\x5c\x64\xc8\xe7\x80\x7e\xf9\x86\xc3\xc8\xc3" + "\xba\x1e\xba\xb9\x53\xcf\x5b\x13\x95\xb7\x4b\xcf\xbb\xab\x5f\xfe" + "\x78\xef\x1b\xe9\x6a\xbe\x7e\x6b\x0a\xeb\x74\xf6\xff\xe3\xb1\x09" + "\xf2\x71\xd5\x29\xfa\xc6\x5a\x86\xc5\x3c\xcc\xfe\xa0\xe2\x07\x8f" + "\x06\xeb\x47\x92\x85\xcb\xd4\xbf\xc4\x7e\xc4\x93\xea\xd8\x37\x18" + "\x69\xec\x2b\x0d\x9d\x72\x2b\xdb\xbf\x61\x35\x5e\xdc\x9a\x27\x6d" + "\x7e\x94\xd1\xe1\xcb\x79\x0d\xe0\xb0\xef\xb1\xa5\x5a\x8d\xc5\x9d" + "\xb8\x4f\x63\x9e\x46\x79\xb3\x30\x4d\xfa\x94\x7d\xae\x91\x96\x8e" + "\x5f\x06\xe0\xe5\x19\xf0\xd6\x8f\x4a\x6c\x5b\xc6\xdb\xb9\xfd\xf3" + "\x41\x13\x59\xab\x5d\x5a\x87\x57\x63\xdb\xfa\xd6\xf5\x6a\x6d\xa1" + "\xb5\x52\xb8\x0e\xe6\xd7\x23\x3d\xf1\x3c\xe9\x56\xd8\x7f\xb7\x3a" + "\xd4\x7a\xcb\xad\xe8\xff\x99\xbb\xd4\xda\x69\x6b\x25\xf4\x6d\xef" + "\x71\xca\x9e\x8f\x6b\x1f\xae\xf7\x1a\xf0\x3d\x72\xbe\x7d\x6b\xa7" + "\x70\x25\x3d\xc4\x70\xe3\xd2\xc3\xd0\x6f\xbd\xd6\x70\x65\xfe\xf9" + "\xef\xb2\x6d\xc2\x95\xfc\x60\x82\x74\xf6\xcd\xed\xf5\x51\x76\x11" + "\xe3\x1b\x95\x9e\x2b\x5c\x23\xe6\x70\x7e\x1f\xd7\x87\x32\x83\xd9" + "\xda\x86\xbf\xaf\x3a\x33\x90\xbd\x25\xae\x1d\x9f\x1d\xa7\x6f\x5e" + "\xaa\xda\xf1\xcd\x67\xe3\xea\xde\x93\xb8\x1d\xd9\x2d\x68\xc7\x67" + "\x83\xb4\xc3\x27\x69\x6b\x42\x5b\x4c\xe7\xbd\x0b\xa3\x2d\x9f\x49" + "\xba\xc7\xa4\x7f\x33\x43\xb7\x85\x02\x98\x87\xa5\xe3\x9d\x2c\xfb" + "\x50\xf9\x40\xbf\xe9\xf9\x26\x5b\x6b\x29\xef\xfc\x3a\xbf\x39\x47" + "\xb8\x86\x3d\xe4\xa3\x6f\x6e\x94\x70\x06\xd2\x4b\x14\x2e\xa0\x93" + "\x89\xe9\x84\xf6\xa0\xdc\x60\xfd\x6d\xcc\x4b\xd4\x5a\xc8\x37\x21" + "\xff\xd9\xa5\xc6\x5a\xe6\xd2\x72\xe1\x37\xe8\x88\x77\x1d\x71\xef" + "\x42\x51\xef\x02\x31\xef\xd6\x18\xe9\xb7\xa5\x19\xe9\x5f\xac\x9f" + "\x6e\x9b\x1c\xd7\x4f\xe8\x9f\xdb\xda\x62\xdb\x7d\xdb\x0c\xd5\x3e" + "\xf4\xd1\x79\xb4\xbe\xad\x18\x7d\xd4\x97\xb8\x8f\x6e\x5b\x9f\x98" + "\xd7\x6e\x93\xeb\x68\x62\x24\x25\x82\xb7\x1f\x7d\xd7\x27\x79\x50" + "\xef\xa7\xf3\xfb\xe7\xb6\xa3\x46\xff\x7c\xb1\x36\x7e\xcb\x1e\xd7" + "\xc6\xc8\x71\xfa\xd6\x0e\xd5\xd6\x6f\x9d\x8c\x85\xfd\xad\xec\xc4" + "\xbc\xf8\xad\x3c\xb4\x33\x92\xb8\x9d\xdf\x2a\x19\x9c\x17\xbf\xe5" + "\x46\x7b\x22\xe7\xf3\xe2\xb7\x1a\x54\x19\x4a\x54\xa6\x51\xb8\x12" + "\xd6\x73\xc4\x19\x66\x3b\x77\x72\x1a\xaf\x2f\x45\xa5\x77\xc7\xf2" + "\x1f\xda\xc0\xe5\x98\x7e\x61\xa5\x67\xb9\x1f\x8e\xdb\xc9\xf4\x79" + "\x3c\x19\x74\x4d\x9e\x11\x47\xab\xd3\xc7\x69\x72\x5b\x8f\x29\x69" + "\x97\xa2\xd7\x94\x17\x63\x71\x9a\x5c\x9c\x98\x5e\x93\x2b\x41\xaf" + "\xd3\x89\xe9\x35\xb9\x6e\x70\x7a\x4d\xe6\xfe\x3f\x7d\x3e\xbd\x26" + "\x1f\x8e\xa6\x17\x6c\x5d\xd9\xbe\xaf\xda\xc0\x1b\x7d\x05\xa2\x9e" + "\xdb\x1a\xa1\x74\x2b\x78\x45\x95\xe9\x46\x99\x29\x66\x6b\x48\xf1" + "\x09\x6c\x48\xcb\x29\x9a\xdc\x6d\xc8\xff\x88\x5a\x1a\x26\xfa\x1e" + "\x65\x3f\xa3\x24\x2e\xe7\x75\x9c\xf6\x78\xc3\x59\xc4\xf3\x8f\xd8" + "\x7a\xa7\xe4\x26\xd6\x05\x53\x0a\x41\xd3\x97\x12\xa4\x3b\x94\xaf" + "\xd9\x94\xbd\xb1\x3a\x62\x4a\x4d\x6c\x1f\x81\x6e\x28\xa7\x6f\x3b" + "\x7d\xee\xef\xc2\x7d\x76\x3b\x9d\xdf\x67\xb7\xbf\xa6\xfa\xeb\xf6" + "\xb5\xb1\xf8\xdd\x6e\x4b\xdc\x5f\xb7\x67\x0d\xde\x5f\xb7\xcf\x18" + "\xbc\xbf\x6e\x2f\xe6\xfe\xf2\xd1\xed\x0d\xb1\xe3\xc6\xed\x95\xb1" + "\xed\x45\xbd\x28\x27\x4c\x43\x2f\xe3\xe7\x2f\xda\x6e\xe3\xc7\x3a" + "\x8e\xfb\x8a\xcf\x31\x01\xff\xab\x19\xc7\x8b\x85\x31\x28\x6c\xd0" + "\xb0\x66\x55\xe2\xfd\x56\x9e\xe3\xb6\x63\x26\xce\xfb\xc8\xf6\xaf" + "\xb0\xed\x7e\xc7\x32\xcd\x44\x1d\xb8\x37\x1d\xa7\x3b\xef\xd4\x4c" + "\xa6\x72\xde\xf3\x94\x7e\xf2\x72\x0d\xe1\x8e\x8d\xd1\x7d\xc1\x7b" + "\x9f\x3c\x37\xdd\xac\xe6\x4e\x7f\x3b\x4e\x39\x97\xab\x7e\xb9\xf3" + "\xea\x58\x3a\xde\xb1\x37\x71\xbf\xdc\x71\x08\xfd\xf2\xb7\xc4\xfd" + "\x72\x47\xe7\xe0\xfd\x92\xc3\xeb\x87\x7f\x3b\x5f\x8e\x72\x6c\xba" + "\x1c\xad\xe3\x32\xf6\x45\x3c\x1f\xcf\xa9\xe2\x3c\xb8\x87\x8c\xe4" + "\x3c\xc7\xef\x6f\xe8\x36\xe4\x48\x96\x99\x01\x58\xb2\x7e\x3d\x4f" + "\xae\x0e\x23\x1a\x6e\xa9\xb5\x3b\x91\x9c\xe4\xb8\x39\xef\x8d\xa5" + "\x64\x01\x0d\xf3\x77\x30\x8c\x25\x44\x80\xf1\x09\xe7\xe3\xf4\x1b" + "\x03\xd1\x72\x92\xb3\xdf\xc8\xc7\xba\x4e\xcf\xbb\x57\x04\x8b\x89" + "\xf3\xc5\xc1\xd6\xdb\x3f\x4c\x8e\x23\x9c\x9f\xf3\xc5\xe6\xb9\xd3" + "\xa2\xe4\xf1\xce\x19\xb1\xf2\x78\xa7\x3d\x96\x3f\x41\x7f\x94\xd3" + "\xa0\xe7\x70\x5f\x06\x1c\xbe\x30\x7f\x5d\x58\x36\xef\xac\x8b\x93" + "\x4d\xf0\xc0\x5d\x53\x14\x0f\xdc\x75\x65\x1c\xae\xfb\x12\xf3\xc0" + "\x9d\xad\x83\xf3\xc0\x9d\x5d\x83\xf3\xc0\x5d\x66\xe6\x01\x1f\xdd" + "\x35\x39\x56\x36\xef\x1a\x13\xdb\x76\xd4\x2b\x65\x93\x2e\xbd\x18" + "\xd9\x84\x2d\x74\xd9\x60\x72\xc8\x32\xc5\xfe\x23\xf5\xbd\xc6\x5e" + "\xc7\x17\xa2\x99\x05\x72\xc5\xf8\x1d\xe6\x35\x25\xe8\xf8\x6c\xa6" + "\xe1\x4e\x79\xfe\xf3\xae\xce\x68\x3a\x6e\x56\x67\x2e\x9d\xc7\x69" + "\xea\x42\xde\x57\x56\xf4\x9c\x36\x31\xb6\xfd\x53\xcd\x89\xe9\x39" + "\x75\x0c\xe8\xe9\x4c\x4c\xcf\xa9\xd9\x83\xd3\x73\xea\x1c\x3e\x93" + "\x75\xbe\x4c\x4d\x2d\xb1\x2f\x97\x36\x8a\x2c\x73\x8a\xa6\xfe\xee" + "\x8b\x8d\x4f\x53\x77\xc5\x8e\x4f\x53\x37\x5e\xfc\xf8\x34\xb5\x2b" + "\xf1\xf8\x34\x8d\x12\x8f\x4f\xd3\x6c\x4a\x1e\xa6\xe5\xc5\xca\xc3" + "\xb4\xac\x58\x9e\x00\xed\xfe\xd7\xc6\xa7\x69\x0d\x71\x32\x50\x7d" + "\x9c\xa6\x5f\x0d\x9b\x42\xb7\x37\xa7\xff\x3d\x0e\xc7\xc6\xc4\xfd" + "\x36\xed\x08\xfa\xad\x3a\x71\xbf\x4d\xf3\x0f\xde\x6f\xd3\xd3\xd0" + "\x6f\xd5\xe7\xf7\xdb\xf4\xb1\x17\x6f\x53\x4c\xcf\x8f\xed\xb3\xe9" + "\x39\x17\xdf\x67\xd3\xeb\x12\xf7\xd9\xf4\x7d\x89\xfb\x6c\x7a\xab" + "\xea\xb3\xbb\xcd\xb1\x7d\x36\xbd\x33\xb6\xcf\x40\xb7\xff\x61\x9f" + "\xa1\x7f\xd6\x2b\xff\x84\xbb\xe7\x63\xde\x3e\x2c\xe8\xba\x7b\xae" + "\x8f\xee\x19\xab\xe6\xd6\xf7\xa8\xb1\x43\xf5\xe1\x5b\xc8\x93\x77" + "\xfe\x38\x70\xb7\x43\x4f\xfb\xee\xf9\xfd\x70\xf7\x16\xe8\xe8\xee" + "\x96\x72\xb9\xb7\xa5\xfa\x90\x69\x8e\x7c\x9e\x55\xbc\x3f\x75\xf7" + "\x3e\x2e\x8b\x3e\x16\xde\x50\x98\x58\xaf\x23\x7f\x80\xe1\xf0\x59" + "\xd4\x38\x58\xbe\x8b\x19\xe3\x2f\xe0\x53\xb3\xde\x53\x71\x13\xe0" + "\xdd\x73\x56\xf1\xea\x3d\xf1\xf6\x6f\x3d\xde\xfd\x5e\xf1\xe9\xbd" + "\xaf\xc4\xe2\x70\x4f\x51\x62\x3e\xbd\xa7\x1c\x6d\xa8\x4f\xcc\xa7" + "\xf7\xd4\x0e\xce\xa7\xf7\xa0\xff\xa9\x3e\x6a\xee\x33\xf2\xf1\xb0" + "\x2f\x6e\xee\x73\x4f\x87\x35\xa0\x78\x47\xda\x44\x55\xad\xeb\x83" + "\xae\xdc\x78\xfb\x0f\x7d\x93\xbb\x46\xc7\x79\x59\x6c\xf9\xdc\x41" + "\xec\xbf\x5c\xb6\xff\xde\x4a\x8c\x73\xee\x05\xec\xbf\x5c\xb6\xff" + "\xde\x3a\x5f\xb6\x72\x75\xfb\x2f\xd1\x1c\x2f\xb7\x2e\x71\xff\xe7" + "\xc6\xf5\x3f\xe5\x97\x61\x3e\x2c\xcb\xc7\xe6\x3b\x1a\x9d\x8f\x7d" + "\x93\x38\x2f\xf3\xc8\xf9\x79\xef\xb5\xc4\xc3\x1c\x24\x5f\xd6\x79" + "\xbc\xc7\xbe\x54\x09\x79\xef\x5e\xfd\x3c\xc9\xbd\xfb\x62\xe5\xf1" + "\xde\xb2\x58\x79\xcc\xb5\xc5\x95\xdb\x12\xfb\x1e\xfc\xf3\xbf\xa6" + "\x63\xef\x33\xc7\xf1\xc0\xc1\xe3\x74\xdf\x5a\xc5\x03\xf7\x7d\x1c" + "\x8b\xc7\x7d\x63\x12\xf3\xc0\x7d\x93\xd0\xfe\x83\x89\x79\xe0\xbe" + "\xbc\xc1\x79\xe0\x3e\x3e\xab\x7c\x30\x9a\x6f\x1f\x2a\xcf\x19\x16" + "\x97\xa7\x26\xb1\xce\xbb\x6f\x77\xe2\x35\x82\xfb\x3c\x8a\xc6\xf7" + "\x85\x62\x69\x7c\x5f\x47\x2c\x0d\xd1\x96\xff\x39\x0d\xfb\xe3\x4f" + "\x04\x5d\xf7\xc7\xcb\xbf\xf7\x38\xdd\xaf\xcb\xff\x8c\x77\x63\x71" + "\xbc\xbf\x48\xe1\x92\x68\x5d\xe4\x7e\x9e\xff\x7a\x13\xd3\xf2\xfe" + "\xba\xc4\x6d\xbe\x7f\x1f\xc6\x20\xaf\x76\x9e\x2c\xdd\xdf\x8a\xf4" + "\x87\x78\x3d\x94\xd7\x43\x76\x22\xfd\xa1\x30\x59\xe4\x78\xd5\x3f" + "\x2e\xdd\xef\x67\x5f\x14\xa6\x3f\xf3\xaf\x75\x0c\xe5\xf1\x18\xc4" + "\x78\x15\x94\x4b\xbf\x05\xeb\x7a\xe6\xf5\x6b\x98\xd7\x67\x48\xfb" + "\x8f\xf7\x59\xd8\x8f\xd0\xea\xa0\x3c\x8e\x83\x61\xf0\x3b\xe7\x8f" + "\x85\x3d\x63\x06\xcb\x05\xe7\x37\xf2\xaa\x75\xb3\xca\x38\xdd\x34" + "\xa3\x2c\x71\x1f\xcf\xd8\x38\x38\xef\xcc\xd8\xad\xfa\x79\xc6\xd1" + "\xd8\x7e\x9e\xe1\xd1\x5c\x23\xe6\x70\x5b\x7d\xa0\xf3\xc5\xf4\x71" + "\x99\x5d\xf8\x07\xd5\xf7\xeb\x1e\xed\x28\xad\xa0\xaf\x9c\xa0\x99" + "\xd3\x64\x7d\x26\x11\xb2\xae\x4d\xa2\x16\xa9\x03\x66\xbe\x2a\xf1" + "\x44\x9e\x82\x30\x99\xc4\xba\x67\x3a\xf8\x5d\xbd\x4b\x84\x90\xef" + "\x30\xef\x09\xf0\x59\x6e\xf0\xc2\x65\xc7\x68\xe6\x63\x31\xe5\x31" + "\x32\x7b\x15\x8c\xda\x7a\x29\x8f\x33\xb7\x18\x6b\xba\xeb\xf1\x9c" + "\x78\xdd\x77\xe6\x7e\xc3\xf7\x41\xf9\x8c\xcd\x1c\x74\xff\x92\x71" + "\xe2\xf3\x34\x8c\xd3\x85\xf5\xc0\xac\x34\x83\x7f\x95\xaf\xe5\xac" + "\x31\x03\xbe\x7c\xb3\x32\xf1\xee\xf0\x05\xd6\x06\xa3\xe4\x60\xd6" + "\x9c\x68\x38\x2a\x06\xcb\xac\x62\xc3\x1f\x0f\xf7\x65\x9f\x03\xcb" + "\xc0\xa7\x2e\x0e\x9f\x3d\xb0\x53\xd6\xeb\x30\xf6\x5f\x08\x06\xf7" + "\xb9\xe2\x59\xe6\x87\x59\x87\x2f\xb4\xe6\x97\x6c\xa3\xbc\x97\xcf" + "\xe3\xad\xd9\xd2\x5e\x62\x18\x17\xc6\x71\x76\x4e\xcc\xdc\x42\xee" + "\xdd\xf3\xde\x56\xde\x70\x25\xf7\xb3\xe3\xd6\x08\x67\xcf\x95\xfe" + "\x54\xba\xdc\x3f\x1e\x8e\x97\x83\xd9\xe5\xc6\x18\x1d\x97\xbe\xc5" + "\x90\x7b\xcc\x6b\x19\x6e\xdc\x3a\xeb\xec\x7d\x4a\x16\xf2\xd2\xb4" + "\x94\xe8\xf9\xda\x6c\x69\xff\x19\xeb\xa5\x3e\xe4\x8b\x2b\x17\xb7" + "\xfe\x37\x7b\xae\x18\x7c\x9d\x3e\x0d\xfd\x1b\xe0\xbd\x2d\x15\x1b" + "\x22\x6f\x72\xdc\x7a\x85\x7f\xb3\x3c\xef\xff\x17\x6e\xbf\xae\xf7" + "\x1e\x78\x3b\xb6\xbe\xbc\xb9\xce\x93\x17\x6a\x7f\xde\x20\xed\xcf" + "\x1b\x68\xff\x22\x09\x37\x6e\x2d\x31\x4f\xb6\x3f\x72\x9e\xfe\xcb" + "\x6b\x85\xfe\x32\xe8\x06\x9b\xfb\x81\x71\x86\xad\xce\xeb\x07\x83" + "\xdb\xea\x0f\x0c\xac\xff\xc9\x72\x79\x03\xeb\x7f\xfe\x44\xb6\xba" + "\x8f\xe4\xde\x6a\x4c\xdd\x0f\xe4\x5a\xeb\x12\xb5\xe5\x81\x41\xd6" + "\xff\x1e\xd0\xd7\xff\x1e\x38\x1c\xab\xcf\x1e\xa8\x89\xed\xc3\xbc" + "\xb8\x3e\x7c\x60\x6f\x6c\x1f\xe6\xcd\xfd\xef\x8e\x6b\x78\xa6\xe4" + "\xe4\x64\x53\x72\x92\x29\x29\x19\xaf\xd1\x44\x1a\x96\x6c\x4e\x1e" + "\x82\xdf\x50\xfd\x3a\xcc\x94\x6c\x32\xe3\x37\x44\xbf\x0e\x8d\x7b" + "\x1e\xc6\x65\xf1\x33\xeb\xd7\x21\x71\xcf\x43\x3f\xe7\xfd\x30\xbd" + "\x5e\xa3\x7e\x73\xdc\xf3\x90\xcf\x79\x3f\xf4\x7f\x58\x9e\xce\x7b" + "\x8e\xf5\x43\xbb\x77\xd1\xf2\x79\x25\x0b\x8b\xe4\x7e\xf1\x7c\xfb" + "\xbc\x27\x9f\x9c\xbf\x74\xa9\xbd\x6c\xb1\xfd\xae\x3b\x1f\xbc\xe9" + "\x36\xbb\xda\x76\x2e\x99\x32\xae\x28\x95\x66\xae\x58\xc2\x2f\x66" + "\x3e\x74\x6f\xbe\x3d\xef\xae\x3b\x63\x5f\x1a\x60\xe4\xf6\xf2\x85" + "\xa0\x44\xc9\x5f\x4e\xd5\x28\xa2\x8d\x5b\xa5\xee\xe9\x64\x3f\x5f" + "\xb5\xe6\x91\x3f\xb1\x95\xfd\x47\x7b\x9d\xc2\x73\x0d\xef\xe9\x3f" + "\xf4\x21\x37\xe2\x86\x86\x4a\x2a\x7d\x82\xcf\xaf\x3c\xf4\x2f\x71" + "\xc0\x4f\xf6\xfb\xc8\x74\x8c\x1e\xbb\xb3\x25\x17\x79\xf1\xec\xf5" + "\x85\xc9\xee\x24\xcb\x71\xfa\xee\xa7\x78\x97\x24\x6e\xd7\x90\x16" + "\xd0\x7d\xa1\xbf\xf3\x2f\x99\x76\xa0\xd2\xc8\x67\x3d\x4e\x73\x5e" + "\x11\x07\x84\x7c\xe6\xf3\x41\x2a\xdf\x9c\x85\xc2\xf4\x50\x26\xeb" + "\x86\xba\x91\x64\xe6\xbd\xd0\x57\x47\x92\xe5\xd5\x51\x1c\x23\x65" + "\xce\x5c\x63\x2f\xb4\x0a\xcf\x3e\x7a\x2c\x87\xeb\xe6\xbc\x9a\xe9" + "\xa1\x07\x39\xff\xce\xd8\xfc\x1b\x07\xf6\x62\xe7\xcc\x35\x21\xdf" + "\xec\x4f\xc9\x6a\x8d\x88\x7f\x85\x52\x5b\x0a\x6f\xcc\xa5\x24\x2f" + "\xba\xa2\x35\x5c\x49\xca\xe7\x67\xce\x87\x2b\x23\x22\xcc\xfe\xe9" + "\x33\xbb\x9d\xa2\xfa\x59\x32\x43\xa6\x93\x3c\x4b\xd8\x47\x61\x4e" + "\x63\xfd\x7c\x32\xa3\xfd\x63\x4e\xd0\xb7\xbb\xed\xb3\x88\x9c\x33" + "\xc9\xfc\x07\x07\xfb\x1b\xb6\x6a\x9b\xdf\x27\xf3\x4f\x7b\x2b\x4d" + "\xbd\xc2\x46\xe5\x65\xa2\x4b\x70\xdc\xa4\x80\x08\xb1\x8f\x7f\x6b" + "\x61\x84\xf3\x9c\x0a\x3a\x6d\xd4\x5e\x16\xa0\x35\x47\x45\xc8\xfd" + "\xbe\x3a\x1b\xd0\xd6\x1d\x60\xff\x45\xcb\x9a\x99\x94\x7c\x3c\x9f" + "\x4c\x6d\xc5\xb5\xe4\x9d\x1b\xa0\xf2\xa3\xa2\xab\xb5\xf0\xef\xd4" + "\x5e\xbc\x97\x0a\x3a\xc8\xd4\xda\xf9\x09\xc9\xd8\x3f\x9b\xcd\x59" + "\x15\x67\xc9\xb6\x66\x21\xa7\x9d\xa5\x55\x6b\x68\xf8\xaa\x0f\xc9" + "\xea\xed\xea\x40\x3d\x27\xe9\x91\x23\x94\x04\x78\xa6\xd5\x9f\x90" + "\x6d\xf5\xc3\xec\xe7\x9b\x43\x75\x15\x64\x13\xce\xcc\xb4\x5e\x67" + "\x66\x7a\xaf\xc8\x1c\x19\x74\x66\x66\xb4\x97\x22\x7f\x67\x13\x8d" + "\xe8\xa0\x8c\x03\x27\x3a\x4c\xb5\x67\x68\x0c\xb7\xe9\x38\xda\x56" + "\x77\x06\xf9\x37\x7c\xbc\x57\x43\xd9\xe8\x32\xe1\x94\x8f\x0f\x79" + "\xf3\x43\xa4\x01\x56\x6d\x2f\x8d\xa9\xeb\x25\x9b\x56\xf5\xf1\x5e" + "\x2e\xd7\x4d\xdf\xf9\xa7\x17\x23\x43\xf9\x1a\x11\xe9\xdb\xd0\x5a" + "\x08\x9d\x38\xec\xad\x27\xf6\x9b\xbd\xad\xdd\xd4\x16\xe8\xa5\x76" + "\xfa\x0b\x79\x1d\xff\xf0\xfc\xf4\x89\xfd\x43\x34\x08\x81\x67\x55" + "\x27\xea\x52\xbc\xe3\x6c\x23\xb3\x17\x7d\x50\x5d\x41\x69\xa5\xab" + "\x68\xd8\x09\xa4\xab\xb9\xfd\xc1\x62\x6f\xf8\x1f\x9e\x55\xd2\x1f" + "\xf7\xb1\x9c\x8a\x36\x4a\x6e\x0f\xd4\xb2\xdf\xa7\x29\x32\xc2\x9c" + "\xe5\x0d\x1c\x26\x6f\xe9\xdf\x3c\x5a\x9a\xd9\xb6\x51\x23\xcb\x9b" + "\xe7\x0e\x9b\xbc\xe6\x73\xe4\xcd\x0f\xd0\x41\xd4\x2d\x36\x9b\x27" + "\x43\x6f\xe5\xb4\x07\x42\x7c\xde\x29\x4b\xf4\xd8\x52\xab\x97\xd0" + "\xf8\x9d\x67\x68\xec\x8e\x33\x94\x29\x82\x99\x26\xf6\xb1\xe5\xf3" + "\xab\x3b\x70\x4d\xeb\x24\x0b\xda\xae\xfc\xb1\x87\xeb\xbe\xb6\x7d" + "\x99\x54\xdf\x3b\xe0\x6b\xdb\xdb\x33\xe0\x6b\x0b\x9e\x2a\x64\x7f" + "\x5b\x1f\x7d\x3b\x60\x6d\xa5\x61\xc7\x68\x8e\x8d\xf9\xbb\xfa\x14" + "\x99\xd7\x9d\x22\xba\xb1\xd2\x44\xf6\x05\x7c\xce\xe2\xbb\x1f\x7a" + "\xd1\x37\x7c\x7f\x8c\xbe\xbb\x11\xd7\x34\xfc\x92\x90\xbe\x96\xdb" + "\xd9\xa9\xf3\x31\xd2\x4c\x48\x5b\x86\x6b\x32\xae\xcf\x3a\xeb\x84" + "\x1f\x75\xed\xef\x31\x51\x2a\xf3\xb3\xee\xdf\xbb\x3f\xe8\xfa\x2e" + "\xea\x5c\x54\x64\xf0\xb5\xd2\xf1\x73\x0a\x0f\x1e\x3b\xc9\xf1\xb9" + "\xfc\x12\xaf\xbe\xe2\x24\x8e\xd5\xa5\xa7\x33\x0e\x6d\x5c\x2f\xea" + "\xdf\x8b\xab\x15\x3f\x96\xd3\x69\x46\xd9\x9e\xbe\x62\xae\xf3\x77" + "\x48\x17\x46\x3a\xda\x6d\xe6\x77\xbf\x38\x76\xd2\xa4\xf2\x64\x9a" + "\x00\x33\xa4\xc3\x87\xec\xcf\x31\xb3\x8c\xf7\x98\xac\xa2\xb9\x70" + "\x12\xd5\x6d\x15\xad\x3b\xb6\x8a\x16\x25\x7b\xf9\x16\x1f\x95\x5a" + "\x18\x47\x8c\xe3\x2d\x1b\xf1\xae\xd9\x4e\xc4\x74\x69\x29\x62\x7f" + "\xb2\x7c\xd8\x7f\x97\x34\x46\xb7\x41\xb8\x1e\x94\xb6\xfe\xcf\x2a" + "\x0e\x0d\x81\x0e\xb0\xb4\x77\x76\xd3\x4f\x7b\xbb\x86\x38\x7f\x4f" + "\x26\x6f\xf8\x18\x4d\xc8\x20\x1b\xdb\x83\xf5\x5b\x85\xef\x65\x8e" + "\x07\xb8\x55\x74\x83\x5f\xae\x3c\x41\xf9\xcb\xbe\x9e\x41\x19\x7f" + "\xc4\x68\xa7\xf4\x53\xfe\xa6\x28\xfd\x74\x79\x9b\x6f\x7f\x94\x6e" + "\x9a\xfb\xbb\xf3\x75\xd3\xa3\xef\x2a\xdd\x04\xd9\x97\xba\x28\xe2" + "\xd3\xd3\xdf\x8c\x4b\xd7\xfd\x44\x1e\x7d\x31\x2e\x3d\xa4\xa7\xaf" + "\x89\x4b\xf7\xab\xf4\x47\x9a\x0c\xdd\xd7\xce\x78\xac\x60\xdd\xf7" + "\xc8\x6b\xac\xfb\xda\x0b\x75\xdd\x27\xf5\xcf\x23\xcf\x8b\xff\x03" + "\x5d\xb4\x9c\xf5\xcd\x23\x8f\x31\xfe\xe2\x00\x19\xb8\xa7\x20\xed" + "\x4a\x4e\xab\xf9\x0b\x99\xf1\x33\xf4\xde\x62\xd6\x7b\xac\xf3\x58" + "\xf7\x6d\x1f\x25\x3a\xb6\x6f\x15\x47\xea\x64\xac\xa1\x87\xfb\xf5" + "\xdf\x0b\x48\xdb\x88\xb4\x17\xf0\x9e\xf5\x20\xd3\xa4\x2d\x7f\x3f" + "\xb1\xff\x09\x6c\xad\xb0\x66\xca\xa2\xcd\xe8\x6f\x3e\x6f\xb8\x1e" + "\xf4\xb5\x26\x51\xa9\xb7\x8c\xcf\xaf\x46\xd8\x27\xad\xb3\xbd\xac" + "\x93\xe5\x6e\xd4\x3a\xc8\x19\x9f\x97\xae\x08\x88\x13\x7c\xee\x8e" + "\x71\x28\x58\x79\x1f\xc7\x67\x4a\x6a\x29\x26\x62\xbf\x70\xd6\xd9" + "\xc0\xc5\x5c\x03\x9c\x54\x3c\x98\x47\x32\x7c\xf4\xfa\x34\xd5\xd7" + "\x8f\xe5\x70\x1c\xb8\x63\xf4\x70\x3e\xe6\x7b\x21\x6e\x9b\x35\x52" + "\x49\x7c\x0e\x86\x63\x23\xf2\x75\xbb\x49\x2b\xae\x31\xce\xc2\xb8" + "\xa0\x1b\x90\xc7\xdb\x11\x22\xc6\xd9\x47\x0f\xef\x6a\x2b\xdf\xcf" + "\xe5\x73\x99\x36\xc2\xe5\x34\x60\x24\x49\x18\x26\x39\x6f\xc4\xdc" + "\xe0\x11\xb5\x76\x9e\xda\x5a\xd8\x36\xd7\x4f\xac\xf7\xbd\x5d\x80" + "\x51\x7e\x4c\xc1\x00\x2c\x81\x31\x20\xe6\x9d\x0e\x7f\xf8\x1a\xf1" + "\x2f\xc0\xcf\xe0\xfe\xe2\x73\x91\xbc\xdf\x06\xba\xa4\xb1\xaf\xbc" + "\xb2\x45\x1f\xde\x51\xff\x17\x22\xfd\x6c\x27\xf8\xed\xe1\x3a\x3e" + "\xb7\xc4\xe7\x39\x2f\x74\x96\x13\x34\x1a\x6b\x9c\xe7\xd4\x56\xfc" + "\xef\x9e\xe5\x04\x6c\xdb\x4e\x93\xd8\x0b\xfc\xeb\xf8\x3c\xe7\x31" + "\xca\x0f\x33\x1f\xea\x6d\x6a\x78\xe5\x11\xa6\x79\x7e\x27\xa7\x61" + "\xee\x78\xc8\xe8\x7f\x6e\x2f\xb7\x05\xef\x0e\x29\x1b\x51\x1c\xf6" + "\xd1\xa3\x0d\xfc\x1e\x69\xfb\x38\xff\x04\xe8\x31\x2f\xc6\xb0\xb7" + "\x8e\x45\x4c\xd5\xab\xc8\xac\x74\xda\xdc\x77\xb8\xbc\xd2\x69\x73" + "\x4b\x07\x74\xda\xdc\xf9\x4a\xa7\x29\x1a\x2b\x9d\x36\xf7\x61\xa5" + "\xd3\xe6\x3e\x20\xf7\xc5\xa0\xd3\xf8\x1d\xeb\x35\x43\xa7\xed\x18" + "\x25\x0e\xb1\xee\x08\xba\xe6\xe6\x18\xba\x6d\x13\xd2\x58\x77\x30" + "\x8e\x4a\x4f\x3d\x52\x2b\xfe\xbf\x4c\x52\x7e\x07\x7c\x5f\xcc\xe7" + "\x17\xba\xf4\x7b\xf4\xcb\xdc\xb7\x95\x8e\x9b\xbb\x65\x40\xc7\xcd" + "\xb5\x0d\x94\x65\x1d\x37\xf7\xc7\x4a\xc7\xa9\xf4\xfa\x47\x58\xc7" + "\x3d\x52\xcb\x34\xd0\xe1\x9b\x78\x0d\x4f\xcf\xcf\x74\x6c\x88\xd6" + "\x71\xb1\xf2\x35\xb7\xdb\xd0\x71\xac\xdb\xf0\xcc\x71\x23\x0b\xa5" + "\xbc\x21\xdf\x16\xd0\xdc\x90\x3b\xee\x03\x6e\x33\xc7\x7b\x63\xba" + "\x4d\x3d\x49\xc3\xf4\xb3\x43\x7a\xbb\x1f\xcb\x36\x7c\x1f\x7d\x34" + "\x37\x27\x91\x1d\x3d\x10\x93\x91\xae\xe2\x73\xf3\xde\xca\x63\xe4" + "\xad\x15\x95\xed\xe1\xa3\x54\x50\x06\x5d\x91\xfc\xcc\xa7\xdc\xb7" + "\x98\x77\x7c\x8b\xaf\xac\x7b\x30\x96\xae\x29\x08\xd0\x50\xcc\xd5" + "\x3f\xad\x36\xe1\x9d\x23\xe6\x9d\x5c\x63\xb8\x71\x09\xc7\xf3\x7b" + "\xac\x70\xb0\xf9\xfe\x45\xd6\x77\x72\xf0\xfa\x1e\x4f\x91\xf5\xc1" + "\xa6\xc2\x1c\xe8\xd2\x53\xf4\x98\x9c\x97\xc8\x18\x38\xeb\x12\xc1" + "\x7a\xfc\x9b\xfa\xfb\x21\x83\xbc\x7f\xf8\x73\xca\xaf\xfc\x9c\xf2" + "\xaf\xb2\x2e\x42\xfb\xac\x11\x57\x2c\x9c\x11\x61\x23\xdf\x09\xce" + "\xf7\xae\xbe\x16\xf3\xa9\xf3\x6a\x39\x47\xb3\x19\x30\x99\xff\x36" + "\x23\x9f\x8c\xcb\x02\x5d\x39\x0d\x35\x8e\x08\xc4\x94\x8d\x0c\xd0" + "\xf8\xf1\x41\xcf\x74\xb2\x1e\xf5\xd6\x92\x8c\x51\xdb\x0c\x9b\x94" + "\x63\x26\x6d\xe9\x5f\xff\x28\x98\x03\xbd\x99\x17\xe5\x17\xdb\x0d" + "\x3d\x77\x95\x8a\x47\x13\xa0\x6a\x35\xdf\xbc\x02\xfa\x79\x24\x9f" + "\x87\xe1\xb3\x31\x05\x91\x3c\x53\xb3\x8c\x9d\x56\x50\x63\x94\x1d" + "\x6c\x9d\x85\xeb\xd5\xeb\x64\x1f\xd3\x00\xca\xb4\x18\x65\x18\x36" + "\xfb\x29\x62\x5c\xbe\x4a\x9e\x29\x0d\x77\xb3\x2e\xbc\x02\xb6\xe8" + "\x48\x55\x4f\x21\xe9\xf5\x40\x66\x1e\xf3\x5c\xe8\x6c\xc6\xe0\xed" + "\x2b\x9c\x74\xf1\xed\x23\xbd\x7d\x85\xa5\x9f\xd3\xbe\x0b\xd5\xbb" + "\xe7\xe2\xeb\x4d\x37\xea\xed\xba\x78\xba\xce\x1b\xf3\xc5\xe9\x9a" + "\xa5\xd3\x75\x5e\xde\xe7\xd0\x35\x51\x3d\xeb\xbf\x78\x3d\x76\xa3" + "\x9e\xfd\x89\xea\x21\xf9\x37\xe8\xb9\x29\x8b\x11\xdb\xb3\x07\xb2" + "\xa3\x62\xe3\x3d\x41\xd1\xf1\x92\x7b\xa4\x5c\x3d\x91\xd1\x1f\x9f" + "\x59\xed\x95\x43\x57\x3f\x31\xb1\xa0\x81\xc7\x77\xa1\xf9\xe8\x89" + "\x49\x1c\x37\x76\xda\x1a\x75\x26\x5b\x2f\x93\x7b\xa1\x38\xcd\x1c" + "\x03\x8c\x63\x00\x7a\xa1\xc5\x9b\x6b\x39\x6e\x49\x47\x0d\xfb\xdf" + "\x63\x4e\x05\x1d\xff\xc4\x2b\x1c\xd3\x0c\xf7\xc3\xf8\x9e\xf7\xc3" + "\x71\x6d\x50\xba\xe0\x89\x06\x1f\xcd\xeb\x18\x1c\x6e\x47\xc3\xae" + "\x8a\xac\x21\x83\xf9\xd9\xa3\xbc\xcf\x47\xcf\xed\x91\xbe\xf5\xa9" + "\x1f\x95\x62\x4e\xa1\xc7\x19\x9c\xff\x98\x8c\x3d\xe7\xcc\xe7\x73" + "\x25\x18\x1f\x8b\x9e\xd7\xcf\x03\x80\x2e\x95\xa0\xef\x93\x36\x83" + "\x2e\x46\x3a\xd2\xc6\x1b\x74\x81\x9d\x93\xe6\x6d\x08\xf3\x79\x9d" + "\x80\x3a\x9b\xfd\xe4\x03\xa2\xaa\xa3\x56\xc1\x7e\x52\xf9\xa8\x71" + "\x7d\x7d\xf9\x66\x39\x7f\xaa\xe0\xf9\x53\xd1\x24\x7f\x4a\x47\xad" + "\x81\x87\x58\x6a\x33\xf1\x19\xf0\x09\x18\x53\x37\xab\x58\x7f\x49" + "\x7c\x5e\x4e\xbe\x5f\x9a\x69\x52\xb4\x79\xf2\x97\xa2\x87\xe3\xc7" + "\x48\xd8\x69\xc0\x7b\x2e\xc3\xf5\xe1\xea\x5f\x9d\xc9\xf1\x2f\xf4" + "\xf6\x3c\xb9\x43\xdb\xf0\x51\xa9\x16\xb4\x99\x0c\x7c\x77\xca\xb3" + "\xad\x4f\xa2\xfd\xf3\xe6\x4a\x9c\x25\x3e\x36\x13\xfb\xf5\x6b\xa9" + "\x1d\x0d\x62\xb5\x8d\xf6\x2d\xe9\x92\xf3\x27\xae\x73\x02\xea\x17" + "\x3c\x5f\x82\x8d\x12\x74\x15\xd9\xfa\xe9\x06\xb8\x22\x68\xd0\xed" + "\xc9\x16\x35\x3e\xab\x36\x06\x56\xdb\x4c\xcd\x7e\x79\xee\x8e\xc6" + "\xda\x9d\x9f\xa9\x18\xdc\x45\x73\x0c\xda\xf5\xe3\x04\x7c\x38\x8f" + "\xf2\x73\x2a\x2a\x33\x70\x92\x32\x9c\xca\xe7\x78\x9f\x2c\xe6\xf3" + "\x43\x8a\xfe\xcd\x69\xc8\x53\x7b\x3e\xfd\x8b\xf6\x44\xd1\x3f\x99" + "\x79\x90\xe9\xcf\x6b\x1e\xa0\xed\x87\xa0\xa5\x45\x9d\x7b\x60\xbb" + "\xa6\xe8\x13\x3c\xa7\x31\x9e\x5a\x95\x41\xf3\x7c\xb3\x5a\x2f\x9b" + "\x9f\x1e\xd5\x0f\x68\xaf\x8d\x6d\xb6\x24\xa3\xfd\x5c\x86\x69\xc0" + "\xf1\x2c\xb9\x6e\xe0\x73\x49\xd0\x35\x3f\x33\xbe\x4d\xeb\xd4\x99" + "\x12\x52\x3e\x26\xf3\x73\xa3\x62\x9a\xfb\xcb\xec\x22\xa4\xce\x27" + "\x17\xf9\xf7\x55\xf8\xcd\x83\xe9\x02\xe6\x41\x19\x1b\xd3\x24\xd7" + "\x17\x60\x7b\x3d\x35\x45\x00\x37\xd5\xf7\x4f\x5d\xae\xd2\x16\xcc" + "\xc3\x15\x3c\x36\xff\x1d\x81\xba\xfd\x4e\x19\x6b\x05\x6d\x7b\x2a" + "\x9f\x79\xce\xe0\x33\x5e\x8f\x54\xbe\xe3\x0b\xae\x64\xdd\x62\xd0" + "\x1c\xf8\xa7\x02\xbf\x2e\x03\x7f\x23\x3f\xf7\x1d\xe7\xe1\xbd\x9b" + "\x16\x7b\x48\xea\x5c\x75\x76\x68\x41\x86\x21\xcb\x5c\x07\xf7\x33" + "\xeb\x1c\xa6\x87\xa2\xc5\x82\x49\xb1\xb0\x6c\x26\x15\xaf\x93\x79" + "\x1e\xf2\xb8\x2a\x34\x04\x79\xf2\x07\x60\xcc\x3f\xa2\xde\xf5\xe3" + "\xc9\xfe\xfe\xd2\x27\x4f\xf5\xc7\x82\x77\xb9\x5d\x03\xf8\xb2\xfc" + "\x2d\xe8\xef\x7f\x7e\x17\x70\xda\x38\xf6\xaf\xd4\x35\x65\x57\x33" + "\xbe\x7e\x8e\xa9\x2b\x79\xdd\x47\x0b\x2c\x8c\x3b\xe7\x31\xfa\x6c" + "\x80\x17\x17\xf8\xa2\xe1\x08\xa7\xc4\x55\xc2\x51\xba\xc3\x8f\xb9" + "\x2b\xd9\xd5\xbe\xcb\x53\x69\x03\x38\x2f\x58\x6f\xe0\x33\xa0\x13" + "\x9e\x1a\x1f\xcf\x93\x5c\x37\xc7\xed\xd3\x61\xb3\x2e\x49\x3f\x46" + "\x4f\xd9\x14\x5e\xf3\x6b\xb8\x1f\x07\x1b\xe7\x38\xbe\x26\xc7\x5c" + "\x7d\x59\xe9\x10\xf4\x73\xf1\xab\x2f\xab\xf3\x44\x01\x15\x77\xf5" + "\xa9\x1d\xc2\xf4\x1a\xd3\x8a\xd7\xd5\xfd\x32\x6e\x87\x3c\x6b\xfe" + "\x54\x23\xef\xd7\x8d\x28\x7d\x4d\xc6\xd8\xd5\x7d\x04\xfd\x2d\xa5" + "\x61\x19\xf7\xcf\x59\xc6\x67\x6f\xc3\x3c\xe7\x93\x3e\x70\xcd\x65" + "\x61\x7a\x28\xc4\x32\xf1\x54\x37\x9f\xa9\x57\xf1\xcb\x9f\x0a\x19" + "\xe7\xe8\x39\x66\x27\xc7\x9b\x85\x1e\x4a\x1e\x88\x17\x5b\x7c\x98" + "\x6d\x2d\xbd\x7f\x69\xb3\x49\x1c\x56\xf2\x5f\x7c\x27\x9f\x9b\x57" + "\xfb\x59\xc7\xa0\x13\x92\xff\x81\xbc\x0f\xab\xf5\x1f\x43\x47\x15" + "\xff\x89\xf7\xb4\x7c\x3a\x8c\xa0\xab\xb8\x08\x63\xc6\xa1\xf3\x75" + "\x49\xf1\x9d\xc6\x1c\x86\xcf\xe1\xa9\xfd\xb1\x01\x78\x28\x2f\xed" + "\xea\x81\x3e\x78\x8f\x61\xed\x3d\x5f\x2f\x14\xb7\x18\xb2\x57\x7a" + "\x0d\x9f\xe5\x7e\xca\xcd\xf5\x0f\x36\x5e\x08\xe7\xc3\xdc\x4f\x96" + "\xe3\xf6\xc4\x7d\x93\x78\xbf\x6d\x61\xa6\xd1\x06\x83\x26\xaa\x0d" + "\x0b\xd7\xf6\xa4\xb6\x6e\x1c\x68\xfb\x42\xb9\x46\x14\xf5\xfe\x9d" + "\x28\xda\xf0\xf3\x7e\x35\xae\x2d\x74\x80\x3f\xf4\xb3\xf8\x2a\x0d" + "\xb2\xb3\x5d\xac\xce\x27\x85\xe3\x42\x32\x64\x1d\x79\x77\xf9\x28" + "\x18\x52\xfb\x5e\x0b\x39\xfe\x01\xe9\xe5\x66\x30\x2e\x09\xdb\x19" + "\x83\xe3\xd3\x59\x6c\x73\xa8\xd8\x0a\x4f\x4f\x64\x7c\xed\xd7\x72" + "\x1f\x2f\x94\xb6\xae\x8c\xb3\xd0\x57\x3c\x24\xd0\x97\x49\x3d\x7d" + "\xc5\xd0\x0b\x99\xa6\xa0\xeb\x69\xe8\xff\x73\x47\x54\x9d\x4f\x8f" + "\x35\x70\x65\xdc\x64\x1c\x50\xb1\x30\x31\x7d\xb9\x5e\x19\xfb\xa9" + "\x78\x18\x7e\x16\xfc\x86\x7e\x51\xfb\x04\xf6\x7a\x97\xbf\xea\x83" + "\xf1\xda\x72\x71\x88\x63\x8c\x61\x4e\xd2\x55\x0d\xfe\x1d\xb1\xd6" + "\x03\x1b\xfd\x31\x53\xc1\x4a\xca\xc1\xdc\x99\xc4\x39\x91\xbd\x53" + "\xc3\x75\xb9\x98\xc4\xf1\xcd\xf1\x9c\xa5\x3f\x8f\xe7\xe7\x9e\xe5" + "\x62\x2e\x70\xee\x30\xf6\x0a\x55\x8c\x9c\xa7\xbb\xfa\xe3\x0a\x25" + "\x3f\xca\xe7\x8a\x38\xfe\x94\x86\x39\x51\x17\xd7\x5b\xc0\xf3\x5a" + "\xd4\x17\x74\x3d\x93\x8e\x7e\x9e\xc3\xf9\xfc\xc9\xd7\x8f\xc4\x2f" + "\x73\x90\x3d\xd5\x2e\xc6\xab\x27\xe5\x83\xf1\x06\xae\x23\x02\x39" + "\xa6\x2f\x86\xdb\x33\x65\x06\x6e\x48\x3f\x54\xad\xd2\xc3\x1c\x2b" + "\x91\x7d\x1e\xf1\x7e\x8b\x81\xab\x81\x03\xd7\xc7\xe7\x38\x45\x6a" + "\x6b\x2d\xc7\xa0\xe1\xfa\x38\x6e\x2b\xf2\x7a\x0c\x7c\xbf\x28\x2f" + "\x57\xd4\x09\xc1\xe3\x27\xeb\x5f\xfb\x68\x92\xb1\xf5\x8e\x53\x49" + "\x46\x73\x5d\x80\xd7\xbd\xb7\xa1\x8e\x57\x7b\x38\x36\x6a\x5f\x71" + "\xc2\x3e\xe6\x32\xc8\x9f\x27\xf5\xc3\x86\xd6\x57\x35\x91\x0b\x3d" + "\x81\x72\x7d\xb9\xbc\xe6\x04\xb9\x2d\x29\x6f\x29\xef\xe2\xb3\x97" + "\xd0\x39\x25\xe5\xc8\x53\xcb\x76\x16\xe6\x5d\x21\xf9\xdd\x0c\xe8" + "\x26\xcf\xf2\x49\x0c\x63\x8d\xd9\x41\xe6\x96\xb8\x78\x55\x83\xf1" + "\x47\x8f\xe5\xa3\xdd\x3d\x1b\x3e\xaa\x0c\xba\x4a\xf6\xf9\xe8\xd9" + "\x41\x6d\xc2\x75\xa3\x40\x4f\xe4\xab\x19\xcd\xf3\xbe\x12\xdf\x85" + "\xf2\x1a\xfb\xd6\xac\x83\x26\xd8\x28\x4d\xa4\x7c\xb4\x9b\xf5\x6d" + "\x4f\xea\x47\x95\x3c\x96\x04\x5d\xcf\xda\x8d\xf2\x3c\xae\xf3\xd8" + "\x81\xfe\xb2\x55\xf7\xeb\xc3\x67\xf5\x78\xc5\xcf\xe6\x1a\x32\x9a" + "\xa8\x9e\xb2\x5d\x42\x73\x8e\x23\x93\x17\xe3\xd6\x8d\x21\x4a\xdb" + "\xb9\x8d\xa8\x66\x95\x08\xbd\xbc\x0a\x73\x99\xd1\xfc\x9d\x8d\x12" + "\x0f\xcb\x28\xf3\xf7\x66\xf0\x4b\x32\x70\x79\xf9\x1c\xea\xac\x50" + "\xf9\x74\xff\x75\x1b\xf2\x75\xe3\x9a\x21\x4c\x26\xda\x52\x41\x96" + "\x2d\x1a\x99\x6b\x2a\x68\x0c\xd2\x60\xeb\x3e\xdb\x6a\xc8\x6c\x22" + "\x1c\xaa\x77\x12\xbd\x84\x7a\xd7\x56\x88\xf0\x7b\x18\xcf\x5d\x9a" + "\x08\x7d\x11\xba\xfb\x68\xd1\x78\xd5\xc6\x45\xe3\x0d\x9b\x10\xf7" + "\xd9\xb1\xfe\x07\x8b\xec\xf1\x73\xe5\x27\x16\x2f\x2e\x2b\x58\x32" + "\x9f\x2f\x99\xe3\x96\x5d\x97\x1a\xbd\x26\xc2\xe3\x9f\x8a\x57\xb1" + "\x28\x8f\xd7\x1f\x5f\x1e\x69\xec\xa7\x2f\xaa\x31\xd6\x40\x75\xbf" + "\xfd\x3b\x78\x6e\xc7\x73\x20\xbc\xdb\xf3\x6e\xf9\x1a\x06\x93\xf4" + "\xa9\x85\x4c\xf1\xf5\x2d\x98\x57\x36\xaf\xe4\x36\xde\x39\x4b\x4d" + "\x54\x8f\x27\xae\x9e\x50\x7f\x3d\x6a\xfc\x09\x98\x38\xdf\xa6\xd1" + "\x87\x45\x8a\x28\x55\x67\xa6\x17\x8f\x31\xd6\xb6\x06\xf1\x77\xec" + "\x88\x6c\xf8\xd8\xcf\xf2\xe0\x5c\x43\xa6\x5f\xac\xea\x30\xb1\x1d" + "\x59\x81\x7b\x5e\x63\x90\x6b\x65\x7a\xdc\xa8\x03\x67\x3a\x30\xbe" + "\x2f\x2e\x15\x55\xad\xd0\x4b\x8b\x8b\x07\x5b\x57\x88\xf6\x15\x61" + "\xdf\xc2\x4e\x5a\xec\xbe\x90\xef\x11\xe7\xe7\xf6\x30\xcf\xc6\x95" + "\x8b\xa8\x3e\x5b\x0c\xfe\x2f\xa9\xed\x3f\xd7\xab\xe7\xa9\x1e\x65" + "\xc4\xe3\x5a\x7c\x64\x50\xbf\x11\xf7\x47\x7b\x15\x8f\x97\x4e\x69" + "\xc1\xbc\x0d\xed\xfc\xfe\x31\x2a\xfd\xa6\xd9\x06\x1b\x61\x34\xbd" + "\x81\x7b\xfe\x04\x40\x12\xbf\x8b\xe1\xa3\x2b\x4f\x36\x98\xa1\x5d" + "\xa0\x65\x92\x84\xfa\x23\xb3\x7e\x93\x8c\x9f\x49\x24\xc9\x5d\xd5" + "\x64\xf4\xe0\xb0\xa1\x66\xb2\x8e\x48\xb3\x5c\xf5\x95\x31\xb6\x3b" + "\x6e\x9f\x9c\xed\xac\x28\x87\x56\x0e\x87\xac\x22\x3a\x8e\x9a\xb0" + "\x7d\xfb\xba\x4a\x92\x7e\x35\x55\xc2\x96\x08\xd7\x4d\x2e\x51\xca" + "\x67\xd8\xb5\x11\xa3\x72\x9c\xcb\xc8\xf4\x56\xaf\xcf\xc4\xb1\xa0" + "\xd9\x7e\xe6\x38\xaf\xc0\xf5\xf7\x07\x91\x06\x7a\x39\xc4\xc6\x51" + "\x39\xca\xee\x7c\x2e\x45\xdb\x3c\x2a\x67\x00\xbe\x99\x18\xbe\xf3" + "\x55\x32\xed\xaa\xe8\x32\x79\xcd\xb7\x93\xd7\x1e\xa0\x83\xb8\x4f" + "\xd8\x57\xa8\x93\x6d\x59\x86\x51\xef\xd2\x38\x6e\x97\x49\x3f\x87" + "\x6a\x3a\x45\xcf\xdd\xb9\x77\x90\x72\x7c\xee\xbb\x27\xf5\xfd\xff" + "\x0c\xba\x9e\x2b\xf7\xd1\x5d\xfb\x74\x5b\x06\x63\xee\x73\x1b\xc1" + "\x1b\xd2\xfe\xc4\xfb\x63\xfc\x3d\x1a\xa4\x35\x18\x79\x12\xdb\x33" + "\xbc\x16\x2f\x3c\xcc\x07\xe2\xdc\x3f\xbb\xf8\x8c\xcb\x20\xfe\x30" + "\xc3\xbc\x8e\x9b\x78\x4f\x72\xc8\x08\xe8\x1f\xe7\x59\xd1\x17\x71" + "\x51\x06\xc4\xc9\x14\x31\xd1\x55\xe1\x73\x22\xbf\xad\xfb\x0c\xc6" + "\x82\x23\x3c\x17\x49\xfa\xd9\x82\xf7\x4c\xde\xd0\x69\x8f\x77\xbd" + "\x46\xed\xb0\x2b\xbd\x75\xa7\x3d\x2a\xfe\x69\x84\xda\xe8\x2f\xd4" + "\xe6\xf8\x73\xa5\xb7\xf2\x2f\x48\x17\x95\x4c\xe7\xbe\x73\x62\x8e" + "\xd7\xfc\x11\xf1\xf7\x91\x78\x8c\x03\xdd\xed\xa7\x68\xc9\xc2\x03" + "\x80\xf3\xd6\x5f\x01\x4b\xc6\x4e\x9b\x42\x07\x71\x1f\x74\x2d\xe9" + "\x1f\xff\x12\xc6\x9c\x49\xf2\x6c\xb2\x3a\x1e\x33\x69\x18\x4b\x39" + "\xc6\x1d\xc6\xd0\x49\xdc\x2e\x3c\x67\xf1\x33\xae\xe3\xf9\x6a\x5d" + "\xeb\xd9\x61\x0d\x3f\xc6\x63\x6b\x3e\x8f\x9b\x48\x9f\x53\x7f\x4e" + "\x8e\xb5\x79\xfa\xf3\x0c\xfd\x39\x57\x7f\x9e\xa6\x3f\xe7\xe8\xcf" + "\x93\xf9\x59\x8d\xc9\x4b\x2d\xfd\xf6\x82\x69\xd8\x61\x3c\xdb\x8c" + "\xbe\x00\x3e\xc3\xad\x8e\x35\x72\x6c\xd7\xf1\x98\xa4\xe3\x95\xa5" + "\x3f\x1b\xf8\x5c\x69\x0d\xaf\xf9\xdf\xc2\xa7\x36\x0e\x9f\xdd\x51" + "\xf8\x90\xd5\x91\xf3\x45\xf0\x49\xb7\xf2\xf7\x29\xfe\x07\xf8\x30" + "\x2e\x9c\x16\x74\x95\x65\xc6\xe2\x53\x96\x6d\xe0\x93\x90\xdf\x96" + "\x8b\x2e\xb6\x6b\x96\x7e\x49\xc6\x80\x1e\xc6\x36\x4b\x7d\xaf\x11" + "\xaf\xb0\xac\xec\x42\xf1\x0a\x21\x0b\x18\xb7\xcb\xd0\xfe\xb2\x69" + "\xba\xfd\xd6\xa8\xec\xfc\xb2\x3d\x86\x0f\x19\xda\xba\xbb\x5a\xb5" + "\x75\xcf\x7a\x8e\xd9\xb7\x92\xbe\xec\x74\x88\x2e\xcc\xbb\xff\x93" + "\xe7\x86\xd1\x70\x4b\xca\x96\x2e\x7d\xf6\x36\x7b\xc9\xbc\x45\xf3" + "\xed\xe3\x8a\xec\x4b\x8b\x17\x2e\x28\x9b\x1f\xeb\x57\x91\xae\x7f" + "\x37\x48\x9e\x17\xe1\xb9\x94\x9c\x4b\x83\xff\xa5\x9e\x94\xbe\x79" + "\xcb\x9e\x15\xae\xb2\x0e\xd6\xb9\x3b\x5f\x52\xdf\x97\x0a\xba\x96" + "\x4d\x36\xc6\x10\x63\xfe\xcb\x63\x08\xd2\xe7\x60\x9c\x3c\x12\x95" + "\xce\x79\x8b\x8d\x34\x86\xaf\xeb\xa6\x61\xc7\x68\x59\x0a\xd7\x99" + "\x90\x86\xe7\x04\xe6\x01\xf9\xfc\xed\x0c\x13\x74\x8a\xe0\xf8\x5b" + "\x7c\x0e\x13\xe5\x04\xf0\x91\xf3\x8a\x39\x78\x56\x73\x36\xc1\x38" + "\xb6\xa1\xcc\x2e\xa4\x99\xd9\x86\xc0\x3c\xb0\x8b\xcb\x21\xfd\xef" + "\x1c\x0f\x03\xe9\x16\x3d\xae\x18\xa7\x7d\xc6\xf1\x2a\x90\x96\x3e" + "\x90\xb6\x7c\x38\xd2\x6c\x48\xb3\x2b\x78\xcb\xaf\x64\x3a\xe3\x39" + "\x47\x5f\x27\xe3\x3c\x13\xf5\x7a\x2b\xa3\x71\xe6\x6f\xc7\xdc\x74" + "\x63\x96\x7d\xce\x43\xdf\x98\x72\xfb\x93\x8b\x17\x2d\x48\x25\x49" + "\xf6\x4c\x0c\xc7\x59\x37\x39\xae\xbb\xcd\x5e\x3a\x7f\xfe\x12\xfb" + "\x8a\xf9\x8b\xca\xec\xf3\x56\xcc\x5b\x99\x4a\x0b\x16\x2f\x79\x92" + "\xa3\x2d\x70\xb7\x2c\x2d\x78\x72\xc1\x53\xec\xfc\xa2\x72\xa7\xc6" + "\xd8\x09\x73\x58\xb7\xe9\xf1\x49\x0e\x55\xb3\x0d\x99\xf2\x67\x07" + "\xee\x39\x6e\x97\x0d\xd7\x16\xfc\x1a\xf1\xdb\x8f\xdf\x11\xfc\x0e" + "\x9f\xa0\xd5\x61\x5c\xf7\x05\x5d\xcb\x8f\x1a\xf6\xca\x00\x0f\x2d" + "\xf7\x1b\x3c\x04\xfb\x62\x9f\x1a\xdf\x56\xd8\xdb\xc3\x52\x7e\xfa" + "\x79\xaa\xfa\xdc\x00\x4f\x71\xdc\xd1\x76\xf6\xed\x5a\x8e\xf7\xbd" + "\x72\xcd\x92\xd7\x4c\x52\x98\x6e\xc7\x69\xd5\xe5\xf5\x5b\x05\xfb" + "\x98\xf1\x7a\x6e\x0b\xf8\xa5\x55\xc5\xa9\x59\x51\x87\x7c\x57\xa3" + "\x8e\x46\xbd\x0e\xf5\x3c\x4a\x1c\xe2\x6f\xc7\x1c\xd3\x9f\x19\xd6" + "\x71\x5a\xf9\x26\xdf\xf3\x55\xdf\x43\xb5\xea\xdf\x96\x33\x0d\xbc" + "\x73\x4c\xd7\xeb\xe0\x6f\x0c\x55\xee\x74\x89\x90\x31\x77\xe6\xb5" + "\x62\x6b\xd2\x1d\x02\xf8\x9c\xd6\x92\x1f\xed\x90\x71\x30\x2b\x7b" + "\xa1\x23\x6e\xbe\xd9\xeb\x90\xf9\x93\x78\x2d\x79\x56\xa9\xd0\xf8" + "\x3b\x54\x5a\xf2\x33\x1d\x5c\x4e\x58\xfe\xec\xd0\x36\x0f\xcf\x51" + "\x36\x03\xc7\x1f\x74\xd8\x75\x98\x21\xa6\xed\x09\x5a\xfe\x27\x35" + "\x0f\x5f\x1d\x56\xb6\x84\x63\xbc\xe1\x73\x09\x19\xcd\xc4\xf3\x64" + "\x43\x07\xf8\xc8\x61\xd1\xfd\xe3\x3c\xaa\xfd\x8e\x32\xfd\x79\xbf" + "\x8e\x63\x12\xc7\x44\x01\xfe\x87\xb9\xef\x60\xaf\xec\xc7\xfd\x11" + "\xd0\xa7\x55\xd1\xc7\x21\xfd\x7c\x61\x37\xf1\xfb\x23\xfc\x9d\x1d" + "\xbc\x3b\xa2\xe2\x8d\xac\xd8\xc3\x6d\x1e\xf0\xa1\xad\xcb\x01\xfd" + "\xde\xe4\xbd\x66\xc8\xd2\x7e\xef\x39\x96\xcf\x15\xbb\x01\x6f\xaf" + "\xa1\x77\x58\xcf\x14\x44\x20\xa7\x72\x3e\xe5\xe8\x34\xf4\xcd\x00" + "\x1f\x38\x42\x89\x74\x49\xa2\x7e\xd7\xfb\x66\x9e\x70\x2d\x9f\x0c" + "\x9c\xf6\xca\x3e\xe0\xb8\xac\xe7\xfa\xe7\x6d\x7d\x4a\x47\xae\x9c" + "\xd1\x3f\xc7\xd4\xf1\xe0\x38\xf0\x3e\xc6\xad\x57\xee\xff\xeb\x7a" + "\x63\x65\x99\xa1\x37\x0c\x38\xd6\x24\xa1\x59\x1d\xf8\xe7\x6e\x73" + "\xf0\x5e\x09\x8f\x97\xd2\x1e\x01\x9c\x11\x67\xd5\x59\x38\xad\xaa" + "\xcd\xe1\xa3\x95\xe3\xf9\x5b\x73\xd2\xa6\x75\x2d\x9f\x3d\xa0\x8b" + "\x56\x1e\x8a\x86\x29\x2c\x6d\x0e\x86\xcb\xfa\x88\x6d\x92\x82\x88" + "\x99\xe3\xd1\x38\xf4\xf1\x05\x3a\x78\x65\xc8\xc0\x15\x34\x3c\x64" + "\xe0\xab\x7f\xeb\xec\x10\xea\xc9\x9f\x1d\xe9\x63\x9f\xf0\x16\xd5" + "\x9f\xab\xa5\xbe\xc1\xbb\x3d\x41\xd7\xaa\x49\x3e\x5a\xe6\xd6\x65" + "\xa8\x15\xe5\xf7\x34\x57\x4c\x43\x9e\x55\x79\xba\x5f\xf3\x61\xf4" + "\xef\x91\x28\xde\x9f\x1e\xb5\xce\x73\x44\xf5\xe1\xed\x95\xc7\x68" + "\x55\x4d\x54\xba\xde\xb7\xcd\x79\xc7\x68\xf5\x74\xb5\x66\xd2\x96" + "\xad\xca\xaf\x92\x36\xaa\x81\x23\xeb\x02\x3e\xb7\xc7\x32\x2e\x69" + "\x2f\xfb\x78\xd5\x21\x63\xbc\x00\xac\x7d\x92\xe6\xa3\x44\x23\xd3" + "\x49\xc5\xfd\x58\xbe\x48\xd1\x69\x95\x3f\x86\xf6\x3c\x6e\xa2\x1e" + "\xa6\xd3\x88\xb5\x42\x1b\x11\x48\x12\x05\x2b\xcd\xc4\xf2\xc2\x32" + "\xce\x7b\x84\xe0\x0f\x69\x57\x29\xba\xad\xce\x32\xe8\x66\xf4\x1d" + "\xd3\xc9\x47\xab\x1a\x98\xb6\xb1\x6d\x1c\x76\xf8\x98\xd1\x76\xd0" + "\x94\x63\x9b\xe2\x79\x9a\x2e\x17\xad\x9e\xd1\xec\x43\xb2\xe2\xde" + "\x66\xf3\x37\xa8\xd9\x31\x89\x14\x6d\x57\xd7\xa0\x1d\xfe\xa8\x79" + "\xc9\x21\xa6\x2f\xcb\x0a\xf0\x2c\xd3\x63\x70\x1d\x52\xfe\x4c\x2b" + "\xa6\x89\xaa\xb6\x32\x29\xcb\xcb\x65\xac\x14\x8e\xdf\x7b\x98\x69" + "\xc4\x7a\x91\x65\x89\x65\x80\xe5\x49\xd1\x68\x75\x77\x14\x8d\x5a" + "\x98\x3e\x3a\x9d\xf6\xc5\xe9\xf2\xf9\xf6\x92\x29\x4a\x17\xdb\x33" + "\xc7\x15\x4d\x90\x01\x6f\xec\x77\x4f\xbd\xcd\x9e\x37\x65\x9c\xa3" + "\x78\xfc\x2c\x75\x99\x9a\x37\x83\xaf\xa9\xb1\xf3\x3a\x7b\xd0\x55" + "\x3e\x27\x76\x6e\xb8\xd6\xa7\xf4\x47\x79\x89\x2f\x69\x84\x8c\xe3" + "\xc2\xf1\x67\xab\x17\x11\x45\x80\xf7\xe6\x13\xe8\x53\x4b\x5b\x06" + "\xc7\x3b\x9e\xed\x20\x8e\x8f\xfe\x59\x3d\xde\xed\x44\xfa\x88\x52" + "\xfe\x96\xc2\xdf\x84\x96\xd2\x96\xc1\x6b\x36\xa2\xaa\xa9\xc3\x9f" + "\x22\x6c\xfe\x14\xcd\xe7\x4f\xf9\xc0\x3c\xfd\x3a\xa7\x00\xdc\x16" + "\xa3\x5d\xbc\xb6\x03\x3a\x65\xcc\x76\x88\x08\xd3\xa8\xc0\xc1\x31" + "\xc9\x01\x3b\x99\xd7\x76\xca\xd1\xfe\xe7\x32\xd5\xfc\xb5\x1c\xfc" + "\xbf\x7c\xa3\xae\xcb\xf2\x82\xae\x35\xb0\xff\x6e\x95\xbe\x00\x9a" + "\xcb\x26\x63\x99\x6b\xeb\xae\x7f\x50\x54\x69\x3e\x03\x26\x60\x0d" + "\xd5\xfd\x1f\x24\xbc\x2f\xea\x5f\xab\x6d\x68\xcf\xb2\x26\xa9\xf8" + "\x90\x90\xf1\xca\x7a\x93\x96\xdf\xef\x2f\x83\x77\x23\xd6\xa6\xb3" + "\x3f\x4d\x3e\x78\xaf\x92\xf3\x18\xef\xaa\x5d\x9a\xaf\xda\xa4\x85" + "\xd0\x8f\xe9\xca\x7e\xee\x66\xfd\x89\xb9\xeb\x9a\x7d\xc6\xb8\x26" + "\xc7\x43\x13\x55\xaa\xf9\xcc\x1a\xe9\xf7\x79\xc6\x65\x26\x1f\x95" + "\x4f\xbb\x26\x43\xce\x51\x42\x9a\x2b\x89\x94\x4f\xf3\x9a\x1f\x1b" + "\x3a\x96\xf7\x4d\xad\x6b\x85\x9f\xd7\x88\xad\x61\xe1\xe7\x3d\x54" + "\x39\x76\xd0\x09\xf2\x96\x07\x2b\xbd\xf2\xdb\x9f\xfc\x0d\x92\x80" + "\x3e\x6e\x44\xd4\xb8\x81\xfa\xfd\xc9\xd7\x17\x62\x7c\x48\x3a\x41" + "\x6b\x1c\x8c\x3f\xd3\x86\xf7\x5a\x34\xd0\xca\xcb\xe3\x24\xd3\x27" + "\xd5\xbb\x97\x7d\x61\xb8\xad\xd6\x30\xda\x1c\xdd\x2e\x93\xe6\xdb" + "\xec\x42\xbb\x4c\xfc\x1d\x8f\x93\x2c\x33\x21\xf6\x51\x82\xbc\x8d" + "\x92\x71\xad\xe5\xfc\xbc\xa2\x36\xba\x8d\xac\xff\x55\x1b\x2a\xde" + "\x49\xd4\x46\x61\xe2\x36\x32\x0d\x2a\x36\xe9\xf2\x26\xf1\x64\xfd" + "\xd1\x4d\x15\x33\x46\xac\x65\xdf\xa0\xb6\x0c\xe8\xb7\xa9\xdc\x87" + "\x18\x3f\x6b\x18\xcf\x44\xfd\xc5\xf0\x14\x2c\x67\xbe\x75\x6d\x65" + "\x61\xd0\xe5\x1c\x9b\x98\xde\xce\xe9\x17\xa6\xb7\xf3\x4b\x5c\x9e" + "\xf1\xe0\xfd\x1d\x6b\xd8\x04\x1d\xac\xf9\x30\x5f\x73\x27\xaa\x77" + "\xc4\xda\x06\xc6\x2b\xe1\x3b\xc1\xf2\xa2\xeb\x20\xf0\xa1\x80\x9c" + "\x08\xd6\x49\xc0\xcd\x63\xe8\x23\x6b\x92\x3d\x59\xea\x07\x93\xa8" + "\x49\x04\xc3\xba\xb6\x86\xf7\xb9\xa6\xa2\xfe\x84\xef\x35\xfe\xce" + "\x87\xbb\x8d\xb4\x75\x5f\xbf\xc6\x9a\x44\x77\xf8\x93\xbf\x9e\x6a" + "\x75\x84\xc7\x32\x0d\x01\xd3\x01\x39\x6e\xe3\x79\xaa\x5a\x1b\xa9" + "\x84\xfd\xff\xe2\x6e\xb9\x46\x99\xd2\xa6\xef\x1b\x55\x62\xfc\xab" + "\xed\x34\xd6\xe6\xf1\x3c\xd7\x47\xff\xa5\x62\xf5\x26\x7f\x79\x9b" + "\xd8\xf0\x3e\x6c\x11\xab\xb0\xaf\xb2\xc2\x8e\xac\x3c\xab\x09\xfe" + "\xa6\xc3\xfb\x9e\x01\x3e\x51\x7e\x53\x06\x9f\xa0\x7c\x5d\x62\x1e" + "\xa8\x6c\xba\x30\x0f\x54\xbe\xc8\xef\x99\xee\x6a\xae\x52\xd9\x69" + "\xd8\x29\x62\xdd\x97\xb7\xd9\x2b\x64\xfd\x0e\x55\x37\xd3\x24\x87" + "\xf1\x9f\x01\xba\x54\x06\x5d\x6b\xd3\x0d\x3d\xc0\xfc\x62\x8d\xf0" + "\xf7\x2e\x48\xf2\x34\xde\xc1\xfe\x29\xab\x54\xeb\xe0\x1f\xb8\xe5" + "\x77\x33\x5d\xe5\x16\xbf\xb3\x78\x3b\x7f\x1f\x36\x90\xd2\x56\x8e" + "\x3c\x79\x3e\xfa\x0f\x65\x57\x58\xda\xca\x00\xc3\xb1\x45\xf9\x45" + "\x5b\x64\xdc\x28\xc8\x34\xc7\x8a\x62\xb9\x46\x5a\x06\xf0\xe6\xb8" + "\x51\x98\xef\xac\x75\xf7\x8f\x4b\xae\x1c\xe8\x0a\x21\xcf\x36\x61" + "\x5c\x1a\xd3\x03\xda\xbd\x62\xd2\x76\x9f\x9b\x60\x23\x6e\xf3\xb9" + "\x75\xa3\x77\x7f\xff\x46\x32\xff\x5f\xdb\x13\x54\x7a\x13\x65\xac" + "\xfd\x86\x99\xfe\x2b\x9b\x4c\x4c\x07\x1f\xad\xad\x55\xb4\x5b\xdb" + "\x61\xf4\x8f\x8f\x2a\x73\xa4\xee\x5c\xf7\x68\xd7\xec\xb0\xf8\x4c" + "\xad\x73\xaf\x85\xfe\x5b\x94\xae\xde\x97\x17\xc6\xaf\x01\xb1\x3d" + "\x6f\x5f\xb8\xd4\x5e\xb4\x78\xc5\xa2\xab\xaf\x8e\x99\x2b\x99\xd5" + "\xf7\x78\x5d\x69\x6a\x3c\x75\xe5\x18\x78\xb3\x5d\x82\x67\xb4\xbf" + "\xfc\xbc\x98\xf6\x33\x0a\x74\x77\xf7\x82\x2c\x1a\xb8\x9f\x48\x33" + "\x26\x46\x3d\xde\x4c\x33\x6e\xba\xb9\xe0\xc1\xf9\xf3\x8a\x56\x46" + "\xa5\xde\x12\xbd\x6e\x58\xbd\x0d\x75\x27\x8f\xbe\x0b\xba\x22\x69" + "\xd6\x6a\x1e\x5b\xd6\xdd\x52\x11\x16\xff\x80\xbe\xe6\xb8\x35\x05" + "\x6d\x65\x61\x6a\x83\x2e\x13\x5f\x66\x1d\x3e\x4c\x9d\xf1\x84\x3d" + "\x05\xde\xb2\xa2\xed\x7e\xd8\x75\x67\x79\x7d\x06\xe5\x1e\x6e\xaf" + "\xe5\xd8\xce\x1f\xa4\x29\x1b\x63\x5d\x06\xd2\x2f\xc5\x75\x0a\xae" + "\x43\x71\xbd\xd3\xbe\x08\xf3\x1e\xf6\xa9\x5f\xce\x3e\xf5\xeb\xae" + "\x93\x7e\x41\x81\x4a\x62\xdf\xa0\xe3\xe4\x6a\x65\x1b\xc4\x47\xeb" + "\xca\x79\x1d\x9c\xf3\xa2\xcc\xe5\xf6\xa7\x29\x8b\xaf\x42\xee\x0d" + "\xae\xcb\x10\x55\x1f\xa4\x89\xed\xf9\xfc\x5d\xb7\xb1\x48\x5f\x99" + "\x9c\xf4\x29\x25\xdb\x2c\x29\x41\xd7\x3a\xd8\x72\x8b\xe4\xb7\x18" + "\x06\xfb\x06\xae\xfc\xf6\x70\x9c\x7d\x38\x60\x1b\x6e\x20\x69\xdf" + "\xea\xf6\xdc\x4e\x39\x2e\xac\x6b\x8d\xb2\xe9\x78\x6f\x3a\x55\xd9" + "\x27\x22\xa2\xec\xd3\x75\xdd\x86\x1c\xe0\x3e\x64\xf0\x69\x4c\x9c" + "\xbd\x45\x65\xf3\x97\xcc\x2f\xb2\x8f\x5b\x9a\x4a\x51\x51\xf6\x8a" + "\xe7\x2f\xb2\x2f\x99\xff\xdc\xb2\xf9\x4b\x65\x84\x3c\x7e\x1b\x33" + "\xe6\x43\xdf\xff\x29\xcb\x38\xff\x65\x1f\xcd\xf4\x5d\xff\x18\xc7" + "\x66\x13\x1b\xfe\xc4\xf6\xb2\xdc\x2f\x14\x69\xa3\xf2\x63\xe7\x1b" + "\xcf\xeb\xdf\x6b\x78\x3f\xac\xe6\x3a\xcf\xcb\xd8\x86\x48\xb7\x0c" + "\xc4\x81\x5f\xff\x0e\x68\x69\xd2\xe9\x76\x26\xe8\x5a\xbf\xd7\xa0" + "\x9b\x8f\xbe\x97\xad\xdb\x52\xdd\x52\x7f\x60\x8c\x85\xfe\x8b\x19" + "\x5f\xd5\xb7\x6f\xd7\xef\x07\x6f\x24\xcb\xf5\xe4\x94\x0f\xe4\xbc" + "\x8a\x61\x1e\x47\x79\x51\xf5\x3e\xeb\x4d\xd6\x6f\x6e\x03\x1e\xea" + "\x6c\xe0\xfa\xf4\x79\xd0\x15\x27\xe8\x79\x79\x2e\x47\x73\x7f\x40" + "\xac\x53\x38\x96\x88\x56\xf5\x81\xfe\x6d\xe3\xef\x65\xcb\x75\x58" + "\xfe\x16\x01\x60\xf1\x3a\x30\x74\x43\x3a\x7f\x27\x99\xd3\x54\x8c" + "\xb8\xf5\xf2\x5c\x04\xea\x0a\x05\x5d\xcf\x97\x0e\x9c\x71\xf8\x9e" + "\xb4\x3b\x19\xae\x8f\x9e\x9f\xc4\xf0\x54\x0c\xbc\xe7\xb7\xf8\xc8" + "\x55\x37\x60\x3f\x3d\xdf\x11\x35\x2f\x03\x3e\x0a\xcf\x00\x70\x91" + "\xf1\x56\x95\xcf\xa9\x6c\x37\xeb\xcf\x2d\x7a\xdb\x8d\xf6\x00\x1e" + "\xf4\xdf\x3a\xb7\xe1\x37\xe1\xd3\xdb\xcd\xf8\x31\xee\xd1\x38\xeb" + "\xf8\xa6\x33\xbe\x41\xd7\xf7\xc6\x44\xc9\x36\xaf\xcb\x0c\x41\x5a" + "\xd6\x80\x2f\xfb\x7a\x47\xbc\xde\x58\xbc\xc8\x5e\xb2\x70\xd1\x33" + "\x05\x2b\xe6\x3d\x33\xbf\x60\x59\xe9\x78\xfb\xb2\x45\x4f\x94\x2c" + "\x7e\xf2\x19\xe6\x9a\xa5\x65\xcb\x9e\x7c\xc6\xce\x9a\xa5\x60\xda" + "\x8c\x19\x05\x77\x7d\xfb\xa1\x87\x53\xe9\xae\x79\x48\xc3\xcc\x7f" + "\x46\xd6\x78\xf5\xea\xc1\xe9\x53\xbf\x53\x30\x75\xf6\xb7\x67\xcd" + "\x91\x87\x5f\xfa\xdf\x4f\x5b\x94\x38\x43\x0c\x1f\xa6\x83\x97\x42" + "\xe8\xdf\x21\xc7\xa8\x6a\x9f\x8a\x9b\xfe\xbd\xce\xd8\xb8\xe9\xdf" + "\x83\x36\xff\xbe\x0d\xbf\x49\x44\xee\x62\xfc\xf0\xa6\x6a\xb7\xe2" + "\xaf\x94\x47\x83\xae\xef\xa7\x0f\xf0\x57\x95\x3c\x53\xc6\xfe\x4a" + "\x6a\x7d\xf6\xfb\xd0\xff\xeb\xb3\xa2\xdf\x0d\xcc\x27\xbf\x9f\xdb" + "\x3f\x9f\xec\xd7\x29\xdf\x2f\x33\xe6\x96\x48\x33\x63\x5e\x99\xc2" + "\xf3\x4a\xb5\x9e\x54\xf5\x4b\xc9\x53\x83\xca\xb7\x85\x8c\x79\x25" + "\xcb\xb6\xdc\x93\x92\xf3\x8f\xef\xef\x8d\x96\x71\xb9\xa6\xaf\xcb" + "\x38\x97\x93\xeb\x77\x69\xa3\xa6\xf1\x9a\xb6\x3f\xe5\xfd\x10\x6c" + "\x05\x8c\x5f\x41\x21\x86\x8f\x9a\xa6\xe3\xe4\xe7\x35\x6e\xb6\x9b" + "\x75\x7e\x1a\x71\x82\xdc\x37\x08\xd7\xf7\xa6\xa9\x39\xe5\xf7\x96" + "\xb1\x5e\x17\xeb\x46\xdf\xc5\xbe\x45\x3c\x77\x0a\xba\xdc\x63\x07" + "\x78\xb6\x6a\x1f\xf3\xc2\xc0\x5c\xd6\x1d\xa3\xff\x7b\xe4\x37\x0c" + "\xdd\x73\x8c\xb8\x0f\x65\x57\x93\xc9\x7c\x75\x0d\x6d\x31\x89\x4a" + "\x1f\xb9\xe5\xbc\x95\xe9\xe9\xa3\xef\xdb\x91\xd7\x3c\x40\x3f\xb7" + "\xbb\x9f\x7e\xfa\x3a\x8b\xb1\xc6\xa2\xf0\xae\xfa\xe5\x60\xb4\x4a" + "\x4c\x27\x77\xc7\xe7\xd2\xc9\x45\x43\x58\x26\x0d\x7a\x9d\x4f\xab" + "\xaa\x31\xe7\xd3\xaa\xea\xd9\x28\x5a\xbd\x72\x3e\xad\xaa\xf2\xa2" + "\xf6\x95\xf4\x75\x94\xaa\x5f\x32\xcd\x98\xc7\xd0\x6e\x33\xf8\xec" + "\x95\x01\xfa\x55\x55\x9e\x4f\xbf\xaa\x2d\x89\xe9\x57\x95\x75\x4d" + "\x2c\x9c\xed\x89\xc6\x8d\x11\x6b\x4d\xfa\xb9\xb0\x0d\x29\x2d\x63" + "\xe4\x9c\x34\xf4\xb2\x49\x2b\x7e\xd9\x85\x1f\xae\x3c\x8f\x18\xb0" + "\xc5\x45\x48\xb5\x75\x83\xa5\x05\x73\x5e\x5e\x57\xba\xc0\x58\x74" + "\xd4\x58\xf3\xc0\x7d\x07\xcf\x9d\xf9\xdb\x50\x9c\xce\xf4\xc4\x9c" + "\xcb\x0f\x7e\xef\x50\x76\xe9\x86\xfc\xfe\x35\x97\x6b\x57\x36\x24" + "\xaf\x25\x7b\x73\xdd\x4d\x9c\x5e\x8a\x76\x48\xbf\x45\xf6\xdd\x1a" + "\x0c\x66\x41\x24\x87\x06\x81\xdb\xcf\xff\x83\x9d\x8d\x8e\xd3\x47" + "\xc5\xf3\x16\x15\x2d\x5e\xb0\xe0\xf3\x55\x51\xf4\xbe\x5a\x8d\x4b" + "\x73\x07\xf9\x1b\x9d\xeb\x9e\x5e\x15\x74\xbd\xc0\xf6\x7f\xa1\x1a" + "\x37\x5f\x80\xfe\x7b\x7a\xb2\xb2\x25\x1f\xed\x52\xe7\xc1\x5f\xd8" + "\x18\xa5\x9f\xc1\x23\x2f\xd4\x0a\xd7\x86\x23\x03\x7d\xfc\x42\xd1" + "\xf9\x7d\xfc\x82\x23\x71\x1f\xbf\x50\xa7\x2d\xe7\xf3\x38\x2f\x60" + "\xfe\xb3\x44\xda\x9a\xfc\xcc\x7e\x10\x98\x33\x77\x61\xbe\xdc\x3d" + "\x7b\xa5\xe7\x8e\x82\x95\x49\x72\xaf\x98\xbf\xc1\x12\x3e\x27\x3a" + "\xd9\x17\x81\xf7\xc7\xf8\x1b\x2c\xfc\xed\x25\xfe\x56\xa8\xcc\x83" + "\xfb\xea\xe3\x24\xe7\x8e\x78\x6f\xaf\x3f\x2e\xbf\xcb\x0d\x5b\xe1" + "\x85\x90\x61\x5b\x5b\xd7\xda\xe5\x39\xf5\xcd\xaa\x3f\x3a\xb8\x2f" + "\xb8\xbe\x82\x95\x1e\x55\xc7\x39\xfe\xb6\x1a\x59\x95\x0d\xb1\x31" + "\xeb\x82\x6b\xf7\x29\x62\xb0\x58\x68\x16\x61\xaa\x1c\xd6\xbf\x57" + "\xa9\x7f\xff\x98\x65\x9f\xfd\x48\x01\xd7\x1d\xef\x87\xaa\x7c\x87" + "\x36\x36\x18\x3e\x59\xd5\xd2\x07\x8a\xac\xac\x3f\x79\x9e\x73\x9c" + "\x36\xf2\x1a\x06\xc6\xcb\x8d\x2d\xd1\x7b\x9c\xf6\x55\x6b\x87\x9e" + "\xa2\x8d\xcf\x5e\x60\xdf\x34\x6d\xc0\x07\xb6\x72\x58\xd0\xb5\xc9" + "\xdc\xef\x23\xe6\xaa\x1c\x56\x1f\x85\x1b\xde\xd9\xa3\x7c\x15\xfd" + "\x3c\x1e\xf3\xfc\xb1\x5e\x7d\x83\xd5\x7f\x9c\x36\x4d\x47\x1a\xe6" + "\x13\x9b\xe4\x99\x87\x15\x61\x1a\x53\x7a\x3b\x7f\xbb\x67\xd3\xb3" + "\xfa\x3c\xb4\xdb\x5e\xc1\xf8\x6c\x1a\xce\x70\x7d\xc8\x27\xe4\x7e" + "\xc0\x26\x47\x3f\xce\x51\xf5\x19\xb0\x15\x4d\x36\xd5\x19\x78\xa1" + "\xdc\x1c\xb9\xd7\x5a\x1e\xbb\xbf\xe7\x58\xb0\xb0\xa0\xb4\x78\x65" + "\xc1\xc2\x45\x0b\xcb\x52\xc9\x31\x6f\xd9\xc2\x09\x48\xb2\x3f\x59" + "\xbc\xb0\xb4\x60\xa1\x8c\x5a\x2c\x03\x22\x97\xad\x2c\xe5\xbd\x8f" + "\xf3\xf6\xe0\xd3\xa5\x2d\x6f\xda\xb4\x4f\x8d\xf7\x9b\xd3\x0c\x3e" + "\x95\xdf\x1c\x17\xf9\x34\xe0\x7b\x25\xbf\x4d\x9c\x7c\x9c\x36\x7f" + "\x93\x79\x58\xc5\xf9\xa9\xce\x53\xf6\xc5\xe6\x69\xe7\xfb\x64\x6d" + "\xce\x37\x7c\xb2\xc0\xdf\xe9\x2c\xeb\x51\xb0\xc0\xff\x9b\x1d\x09" + "\xca\x6c\xec\xf7\xef\xd4\xbf\x77\xce\x7d\x25\xe3\xde\xbf\xc4\xfa" + "\x76\xd3\x7b\x5e\xc7\x74\x8e\xdd\xab\xcb\xd5\xe6\xc6\x28\x7c\xa5" + "\x2f\x2f\xc3\xe2\xf3\x52\x13\x42\xd1\xbe\x6c\xd5\x53\x30\xf6\xda" + "\x8c\x7a\xec\xab\x4d\xd0\x77\xd5\x97\x06\x4c\x9e\x64\xe9\x87\x8c" + "\x72\x41\x57\xb5\xc5\xf0\xa3\xf1\xf5\xb7\xab\x7a\x4c\x3c\x8e\xc0" + "\xfd\x6a\xa4\x4f\x1a\xf0\x13\xdc\xcc\x7e\x9e\x35\x48\xc3\xf8\x5f" + "\xbd\x2b\x3a\x2d\xba\x9f\xee\x9c\x3e\x03\x06\xf4\xd2\xf9\xe8\xa4" + "\xa9\xf3\x4a\x4a\x58\x07\xcd\x9b\x5f\xb2\x6c\xc9\xe2\xa5\x7a\xd7" + "\xdd\xb9\x80\xc3\x51\xcb\x2c\xb7\xe9\x6f\xec\x8b\xe6\xcf\x2f\x52" + "\x49\x7a\x47\xc6\xee\x59\x29\x3f\x86\x6a\xcc\xff\x37\xfa\x06\x6c" + "\xc5\x1a\x9b\x30\x55\xcf\xc5\xef\x29\xa9\x7f\x64\xbf\x56\x77\xc6" + "\xce\xd1\xaa\x03\x86\xec\xcb\x7e\x76\xe6\xcb\x6f\x22\xf7\x08\xb9" + "\xc7\x83\x7e\x7d\xf1\x5e\xb4\x73\x08\xe6\x8f\xb9\x3c\x37\x19\x80" + "\x53\x33\xbe\x9f\xde\xeb\x1e\xed\x58\xa7\x7c\x26\xcc\xd0\x0d\x66" + "\x8e\x2d\x81\xf7\x98\xff\x6f\x9c\xa3\xf4\x64\x4d\x7e\xff\xde\x8b" + "\x29\x19\xf3\xcd\x9a\x62\xcc\x3d\x76\x9f\x2f\xdf\x35\x95\xe7\xcb" + "\x3d\xfb\x5a\xd6\xd4\x1a\x34\x36\x78\x41\xf1\xdf\x8b\xb7\x18\x6b" + "\xc6\xf5\xfa\xb7\x11\xf8\x9e\xcb\xf2\xbc\x42\x8c\x18\x7e\x07\xfb" + "\x35\x1c\xa3\x17\xcd\x8a\xa7\x6a\x7c\x51\xbe\x81\xe9\x27\xe8\x45" + "\x52\x7d\x5b\x13\x32\xe4\xcf\x47\x35\xd2\x96\x63\x18\x6a\x5c\xaf" + "\x5e\xa3\xf8\xeb\xc5\x31\x06\x6d\x79\x0e\x8f\xe7\xf1\x03\x76\x50" + "\x75\xab\xf4\x17\x51\xb1\x35\xfa\xb8\xfd\x80\xb3\xc7\x80\x83\xbc" + "\x68\xbf\xc5\x6f\xd0\xca\xc8\x13\xcd\x13\x53\xe7\x95\x62\x82\xbd" + "\x70\xc1\x82\xf9\x4b\x96\x1a\xf1\xc6\x33\x17\x97\x14\xa9\xf8\xe2" + "\xb7\xa1\xfb\x57\x40\x86\xa7\x70\x88\x72\xa4\xaa\xdb\x38\x7b\x77" + "\x3c\xaf\x89\x48\xff\x51\x39\xe7\xda\xba\x76\xa7\x3e\xff\x3a\x46" + "\x2f\x67\x28\xff\xab\x97\xaa\x94\x6d\x7b\xc9\x8f\x80\x53\xb7\x61" + "\xdb\xf2\x5a\x6b\x0f\x7d\x95\xe3\x2a\xca\x33\x05\x3b\xb6\x8a\x4e" + "\x5e\x5b\x0d\xba\x5e\x4a\x37\xbe\x49\xc7\x76\xd3\xa6\xad\x2a\x96" + "\xb6\x67\x11\xfb\x8a\x6c\x7d\x4d\xab\x6a\xf5\x8b\xd4\x46\x3b\xec" + "\xb3\x34\x96\x89\xe1\xdd\xec\xc3\xcb\x31\xb0\x5e\x9a\xcb\x76\x1d" + "\xeb\x32\xfe\x6e\x43\x27\xbd\x34\x1e\x3a\x1a\xb0\xb6\xee\xf2\xa7" + "\xb4\xfa\xd7\xaf\x22\x0b\xd7\x01\x7d\xed\x6b\x69\x60\xda\xbe\xe4" + "\x78\x17\xba\x4c\xd7\xd9\x3e\xae\xc7\x47\x2f\x4d\xd3\xd7\xfd\xcd" + "\xc2\x72\x24\x9b\x75\xa1\x3a\x2f\xfa\xd2\x1e\x51\x85\x34\x77\x63" + "\x31\xe8\xc8\xdf\x3c\x2c\x56\xdf\xfb\x7b\xa9\x45\xe5\x6f\xda\x3d" + "\x9b\xe3\x38\x55\x35\xed\x46\xfa\x18\xa4\xfb\x54\xfa\xc1\xe2\xd9" + "\x91\x10\xcf\x93\xaf\xe2\x6f\x57\xa2\x4e\xb4\x7f\x78\xad\xe2\xfb" + "\xa6\x1f\x7c\xad\x92\x1c\xfc\xbd\x4b\x15\x0b\xeb\xa3\xbd\x80\x53" + "\xcb\xdf\x95\x44\x7e\xcc\x9d\x5e\xec\x06\xbc\x5a\xdd\x9f\x1c\x7c" + "\xf7\xf2\x8b\xea\x9c\xc0\x8b\x47\x99\x9e\xc0\x31\x5d\x5f\x0b\x4e" + "\x0f\xba\x5e\x86\xfe\xbb\x52\x9f\x57\xbf\x9c\x67\xd4\x81\xb1\xd4" + "\x0f\x1b\x3c\xc0\x76\x38\x68\xd0\x85\x5f\x77\xb5\xdc\x97\xf7\x61" + "\x0c\xb1\x0a\xf6\x83\x1b\xf8\x86\xdf\xcb\x6e\x63\x5c\xe5\xba\x75" + "\x3a\xa4\xf1\xba\x21\xaf\x19\xea\x75\x71\x2c\xba\x24\x03\xa6\xa8" + "\x6a\xed\xd2\xce\x9d\x6c\x00\x4c\x0b\x6c\x04\xbf\xfe\xed\xb6\xee" + "\xea\x33\xec\x33\xe9\x83\x0d\x70\x95\x28\x08\xa7\xf3\x7e\xd6\x70" + "\xe3\xdb\x78\xf5\x67\x98\xf6\x2f\x07\x06\xf6\xa9\x50\x1e\x7d\x09" + "\xd9\xaa\xec\xa4\x2d\xc3\xb9\x5e\x96\x2b\xe6\x8b\x5e\xf4\x33\xfa" + "\x3a\x53\x9c\x3b\xb9\xd7\xbe\x88\x86\x1f\xa7\x2d\x13\xb9\xbf\x79" + "\x6f\x99\x7d\x19\x91\x66\xe5\x58\xfe\xc7\x68\xcb\x95\xdc\xd7\x8c" + "\x0b\xfa\x28\x14\x0e\xe6\xdf\xc3\xe7\xb8\x59\xff\xae\x29\x87\xfd" + "\xbe\x80\xf5\xd2\x2b\xaf\xf1\x7a\x00\x7f\x83\x89\xef\x9d\x45\x42" + "\x93\xbc\xb2\x8a\x79\xe5\x95\xd7\xd6\x74\x09\xed\x33\x17\x89\x43" + "\x01\xa2\xcf\x4c\x14\x0e\x99\x92\x18\x6f\x93\xf3\x24\x9f\x35\x6f" + "\x20\xaf\xc3\xcd\x7e\x71\x96\xcd\xab\x28\x9d\xcf\xe9\xf3\xf7\x85" + "\xda\x03\xfc\xfd\xe7\x3a\xfa\x43\x78\x0b\x79\x96\x73\xcc\x95\xad" + "\xb9\x7f\x74\x6c\xe1\x79\x79\x0a\xee\x53\xec\xdf\xe1\xba\xb6\xf8" + "\xfe\x78\xe4\x7d\xfa\xa3\xe7\x7d\xb2\x3f\x22\x9f\xfd\xad\xf9\x7f" + "\xa0\xd6\x9c\x3f\x90\xb3\x53\x68\x3c\x47\xac\x78\x96\xeb\x70\x03" + "\x56\x03\x9f\x69\x4f\xd7\x7a\x6c\xa9\xea\xbb\xb9\xec\x1b\xe9\x27" + "\xcf\xa2\xdf\x30\x8e\xcf\xed\x3c\x43\x16\xcf\xa2\xf7\xe4\xbd\x9a" + "\xbb\x9d\x6c\xf0\x16\x75\xb0\x7d\x1a\xe6\xf3\xfc\xbc\xbf\x89\xf9" + "\x8a\x56\xcd\x38\x46\x14\xde\xa0\x97\xd9\x28\x0f\xfb\xd5\x28\x3f" + "\x89\xcb\xef\x60\x7a\x00\xa7\xb6\x39\x8a\x26\xad\x98\xe5\x2b\x9c" + "\x41\x9f\xfc\x68\xfa\x6c\xa9\x61\xfa\x70\x1c\x58\x0d\xfd\x05\xdc" + "\x72\x40\x03\xcd\xa8\x03\x38\x5b\xf4\xf5\x60\xcb\xe6\x33\x94\xe6" + "\x59\xc4\xdf\x97\x7b\xe5\xac\x35\xcf\x6c\xd1\xce\x9d\xda\x5b\x7d" + "\x96\xcc\xdc\x6f\xbc\x07\x54\x2d\xdf\x4b\x9a\x77\x70\x9f\x81\x27" + "\x0b\xf1\x2b\xc2\xaf\x98\xf9\x0e\xd7\x12\xf4\x97\x1b\x38\x94\xa2" + "\xaf\x1a\xf8\xaa\xcb\x58\x2d\xc7\x3a\xd1\xe7\x63\x03\xe9\x90\xa3" + "\x30\x7f\xff\x55\xae\x77\xbd\x52\xaa\x41\x8e\x78\x3d\x68\xe7\x4b" + "\x94\xa6\xb9\x5e\x2c\xdd\x01\xbd\x59\xf7\x92\x3c\xeb\x9c\xce\x6b" + "\xa4\xdb\xe4\xf7\x3a\xb6\xf6\xef\x7f\x6e\x18\xc5\xe7\x41\x5f\x69" + "\x30\xf1\x1a\x92\xbb\xcd\xa2\xf3\xb9\x05\x79\xa0\xff\x6d\xba\x3c" + "\xbc\x2c\xf5\x02\xeb\x91\xc1\xe6\x26\xb0\x8b\x5b\xc5\xf6\x7c\xe2" + "\xbd\xa4\xb4\xb5\xc2\x9f\xd6\x69\x15\xed\x81\x56\x79\x0e\xb8\x3d" + "\x10\x91\x7b\x49\x78\x9f\x34\x2b\xe0\xb7\xc2\x8e\x3e\xcc\xb4\x33" + "\xd2\x79\x1f\x8a\xd7\xe8\x66\x05\x84\x7f\xf6\x4a\x2b\x7f\x5f\x73" + "\x8c\xdc\x87\xd0\xd3\xdb\x6d\x98\x83\xac\xf4\x5b\xd1\xf6\x70\x3f" + "\xac\x9e\xfc\x64\x96\x37\xe4\xcd\xe8\xcf\xdb\x93\x6f\xf6\x3a\x54" + "\x9d\x51\x69\x43\x66\x3b\x50\x96\xfb\x4a\x4f\x53\xf6\xf7\x0f\x1c" + "\xfd\xf3\x53\x3e\x0b\xd1\x83\x31\x78\x69\x7e\x92\xd6\x93\x6f\x8a" + "\x00\x36\x78\x3f\x5d\x7e\xe7\x33\xec\xd7\xbf\x9b\xc5\xdf\xfa\xee" + "\x20\xb1\x69\x74\x21\xf2\x99\x19\x2e\xc7\x97\xe0\xef\x8d\x88\xe1" + "\x63\x12\x7e\x67\x40\x6c\x34\xdb\x3c\x15\x8f\x80\x9f\x6a\x2b\x59" + "\x9e\x23\x96\x76\xbb\xfd\x69\xb6\x87\x7e\xf0\x19\xd3\x33\x02\x19" + "\x8b\xa4\xb4\xdb\x27\x74\x51\x52\x05\xf8\x56\xad\x67\xd5\x7e\xc9" + "\x0b\x19\x74\x6a\x02\x36\x6d\x6d\x1a\xf3\x8d\xb5\x9b\xfd\xee\xda" + "\xc7\x4a\x5f\xb7\x11\x94\xee\x0d\x75\x51\x6b\xe5\x5f\xa8\x35\xec" + "\xad\x6c\x3c\xe3\x37\x2b\x9f\x37\x33\xe0\xd6\xde\xc0\xef\x9c\xe0" + "\xd5\x82\x48\x03\x0d\xb6\xcf\xc0\x73\x6d\xe8\xeb\xbf\xa9\x79\x67" + "\x6d\xa5\x31\xc7\xfe\x9c\x36\x74\x70\x4c\x0e\x21\x6c\xa4\x6d\xf8" + "\x2b\xc7\xdf\x77\x8a\x60\x26\x4d\x58\xc5\xeb\x7b\xb5\x7b\x31\xdf" + "\xc9\xd1\xe1\x9e\xd6\xe1\x76\x5c\x08\x2e\xf3\x4c\x6b\xad\xdc\xe3" + "\x22\x2d\xf5\xaf\x14\x01\xec\x48\xea\x5f\x73\xa0\xe3\x9d\xce\xcf" + "\x78\xfd\x77\xdb\x95\xa8\x87\xda\xc3\x87\x89\x63\xfb\xec\xd4\x30" + "\xd6\x9e\xb6\x91\xee\xdf\xe7\x3c\x45\xaf\xa6\x68\x22\x33\x1d\x73" + "\x7f\xde\xdb\x71\xb2\x8e\xe3\x75\x85\x8a\x08\x0d\xf5\x96\xf9\x88" + "\xe3\x51\x00\xc6\xa5\xbf\xe3\x7d\x34\xe8\x89\x88\xb0\x99\x9a\xce" + "\xc1\x6a\x80\xee\x94\xf1\x29\xd6\x7d\x79\xdb\x88\xb5\x74\x87\x30" + "\x59\xa5\x7f\xa8\x56\xa5\xd9\xd0\xb7\xc5\x12\x9f\x0d\x6d\xb6\x28" + "\x5f\xc2\x64\xd4\xb5\x89\x7d\x09\x85\xa5\xf5\x68\x9d\x5c\xc3\x6c" + "\xb7\x07\x5d\xaf\xee\xf7\xd1\x0f\xe4\x79\x84\x8d\x7c\x5e\x44\xea" + "\xd8\x6d\xe3\xfc\x29\x1f\xfb\x18\x06\x9f\x8f\xd5\x96\x47\xf6\x56" + "\xff\x4b\xda\xea\xfc\x6e\x48\x7b\x77\xd0\x23\xdc\x1f\xfb\xf8\x6c" + "\xa4\x0e\xdb\x0a\xd8\x1f\x8a\xaa\x8f\x61\x23\x6d\x53\xf1\x4c\xdd" + "\x7c\xff\xaa\x9f\xdf\x87\xfb\x32\x09\xf7\x25\x75\xbd\xbc\xaf\xf0" + "\xaa\x4d\xb8\xae\xf2\xf4\x58\x3e\xf6\x3d\x64\x63\xfb\x6c\x5b\xb6" + "\x2f\xe9\xff\x16\xeb\x6b\x8a\x32\xd6\xc6\x60\xf3\x2d\xb1\xdd\x96" + "\xea\x05\x10\xcc\x8d\x33\x4e\x50\xdd\x8f\x7b\x5d\x64\xea\x83\x5d" + "\xd9\x6b\xa2\x74\xc8\x57\xda\xe6\xd1\x94\x85\x77\xa3\x4f\xd0\xb6" + "\x4d\x61\x13\x65\xe0\x97\xee\xff\x72\x71\x0a\xe0\xe6\xf0\x7a\x6b" + "\xdb\x19\x5e\x2f\xdb\x76\x52\xda\x7d\xdb\x68\xac\x06\x78\xbc\x77" + "\x54\x3d\x9a\xc6\xf2\x9a\x27\xd2\x32\x0b\x22\x6a\x0f\xd5\x58\xd7" + "\x58\x37\x9a\xc6\xc7\xd6\xbb\xad\x4c\xad\x89\xd6\xc9\x7d\x95\x15" + "\x7e\xfa\x0a\xe6\x69\xc7\x8e\xd3\xf6\x62\xe1\x4a\x16\xe2\xcb\x36" + "\x93\xf2\x73\xd8\xfe\x80\xb5\x56\xf1\x9d\xdc\x33\x04\xbf\xf1\x9e" + "\xac\xbe\x3f\x95\x24\x63\x8c\xa4\xbe\xbf\x97\xbf\x6d\x1d\xb5\xe6" + "\x9c\x2e\xf1\xd0\xe3\x02\x44\xd6\x5d\x5f\xc8\x30\x18\x9f\x82\x79" + "\x6a\x6f\x8b\x63\x06\x80\xc6\xf2\xcc\xfe\xc6\x6d\x94\xf6\xc2\x36" + "\x4a\x6f\x5b\xc0\xed\xda\xae\xca\x98\xcc\xc4\xf8\x6a\x6e\x96\x33" + "\xf0\x04\xf0\xe6\xfa\x98\x37\xda\xc3\xa7\x3d\xce\x32\xa1\x79\x9e" + "\x66\xbb\x76\xfb\xbb\x9e\x25\x7b\x68\x76\x67\x58\x9d\x6f\x9d\x4b" + "\xfe\x7a\xc0\xab\x1f\x4d\xe9\x80\xd5\xe6\x2d\x21\xde\xfb\xb8\xc6" + "\xb3\x64\x1f\xc3\xfe\x94\xc7\x82\x4d\xa0\x8f\x1a\x13\xea\xb6\x78" + "\x43\x1d\xd4\x06\xf9\x9e\x55\x2a\x22\x0c\xe7\x38\xd5\x7d\x49\xb6" + "\x77\xbb\xcd\x5e\xa0\xe2\x3a\xc8\xb6\xf6\xef\x19\xea\xed\xf0\x9e" + "\x61\x78\x75\xe3\xbd\x85\xb0\x17\xf5\x36\x19\xb4\x56\xfc\x55\xb7" + "\xd0\xb3\x64\x17\x71\xff\x70\x7e\x3c\xe7\x7b\x61\xc5\x14\x9c\x8c" + "\xed\x17\xce\x83\x77\x55\x80\x7b\xeb\xc0\xbe\x37\xef\xc7\x0e\xe4" + "\xa9\xdb\xc6\x67\xdb\xb6\xb5\x6e\x07\x8d\xd4\x3e\xc1\xf6\xb3\x8c" + "\xab\x8f\xb6\x07\xbc\x65\x7f\x49\xec\xdf\x0a\xd9\x07\xdf\xaf\x6d" + "\x97\xfb\x7f\x75\x7f\x9f\x15\xd6\x84\xd2\x67\x3b\x6a\x35\xe8\x01" + "\x1f\xae\xac\x0b\xa4\x3e\xb9\x91\x7d\x8a\x76\xbc\x6a\x4d\x52\xfd" + "\xcb\x6d\x61\x7b\x25\x51\x1f\x47\xed\x4d\xa6\x33\xae\x46\x1f\xf3" + "\x77\x21\x35\xde\x5f\x66\xdf\xfd\x3e\x1b\x29\xfe\x13\x35\x80\x5b" + "\xa5\xdb\x6e\xf9\xfa\x58\x96\xdf\x93\xd2\x3e\x9e\xcf\x5a\x1a\x7e" + "\xc6\x90\xdf\xcc\x02\xe5\x1b\x6e\x63\x1d\x55\x6f\x52\xb2\xc3\x38" + "\xea\x65\xe7\x28\xff\x8e\x1d\xf9\x28\x3f\x27\x61\x7b\x93\xa1\x77" + "\x5c\x50\xd3\x68\x0f\xdb\x91\x02\xba\x0a\xe3\xc1\x50\x6f\xa0\x57" + "\xff\x26\xe7\xce\xcb\x61\x9f\x0f\xe5\xb3\x56\x06\x6e\x17\xb7\x8f" + "\xb8\xc3\xa7\xe6\x49\x3b\xed\xc6\x3a\x95\xb0\x80\xc6\x2e\xab\xe0" + "\x73\x97\x7c\x76\x26\x30\xdc\x6c\xf7\x0f\x1f\x95\xa7\xe4\x66\x67" + "\xae\x48\x51\xfa\xb6\x20\x44\x52\xa7\xf3\x3e\x31\xe6\x60\x43\xb9" + "\xcd\x80\x03\xfb\xa2\x74\x9f\x1a\xcf\x15\xec\x41\xd7\x89\x8c\xb6" + "\xa1\x4d\xb2\x6d\x68\xa3\x6c\x9b\xfe\xcd\x2a\xd4\xf5\x77\xb9\xf6" + "\x7e\x51\xed\xd9\xa9\x62\xa4\x6d\x34\xdb\xf9\x7b\xbc\xc7\xa9\x61" + "\x8d\x3c\x4f\x83\x3e\x51\x7b\x2a\xf5\xd9\x22\xf5\x85\xd4\x8b\x83" + "\x59\x6f\x56\x30\x47\xe5\xbd\xc2\xf1\x2d\xf5\xef\xde\x01\xf6\x7c" + "\xb1\x69\x54\x9e\x3c\xaf\x88\xfa\xf8\xbb\xa1\x03\x7a\xa8\xbe\x8b" + "\xfb\xea\xc6\x3d\x94\xa3\xf8\xb0\xfe\x13\x5e\xb7\x56\x73\xc6\xfa" + "\x8d\xe0\xfb\x3c\x35\x3f\x33\x7c\xd2\x93\xa4\x4f\x7a\xb4\x8e\xbd" + "\x48\x1c\xa5\xbe\x13\xa9\x11\x0f\xee\xcb\xe5\xb9\x4b\xe0\xbb\x22" + "\x6c\xe8\xbf\xfa\x72\xf6\x6f\xea\xf7\x2d\x58\x09\x5e\xa9\x50\x67" + "\xd3\x83\xae\x86\xfe\xf8\x8f\xf2\x3b\x67\x2e\x71\x88\xf3\xcd\x5e" + "\x79\x5a\xfa\x1e\x54\xcb\x38\x0a\x27\xf4\x33\x7b\x0d\x13\xf5\x35" + "\x92\x4c\x3e\x0f\x80\xb2\x98\xff\x36\xcb\xf9\x3e\xd3\x80\xeb\x96" + "\xb8\xcb\x6f\x8d\x35\x94\x0d\xec\x21\xd5\xcb\xb5\x16\xe5\x23\xdb" + "\xb0\xd1\xe0\x11\xb4\x77\xa8\x8a\x37\xba\xf3\x6c\xf3\x78\x92\x3c" + "\xd0\x23\x6c\xa9\x5f\xad\x63\x9e\x6c\xd8\x17\x4d\xa7\xd9\x61\xcd" + "\xa9\x74\x50\x7d\x9d\x90\xb2\x5e\x5f\xf7\xf9\xf6\xc4\x6b\x29\x86" + "\x2d\xa2\xe8\x9c\x0e\xfd\xf2\xc3\x23\x92\xd6\xee\xa6\x6c\x8e\xfb" + "\xb2\xba\x82\xe3\x58\xbd\xf6\x7b\x8e\x17\x16\x76\x37\xe5\x47\xf8" + "\x7c\x27\xc6\x59\xcd\xdd\x54\x7c\xbc\x94\x4c\x05\xa5\xbc\x6f\xf6" + "\xf1\x5e\x9e\x5f\x09\x27\x6c\x81\x54\xd8\x27\x90\xf3\x35\x0b\xc9" + "\xfa\x58\x31\x60\x3b\x33\x33\x38\x9e\x17\xc7\xf2\xe2\x78\x7c\x11" + "\x67\xe6\x48\xdc\x8f\x82\x3d\x97\x2e\x2c\x4d\xb9\xec\x7b\x13\x71" + "\x09\xe8\xe3\xa3\x1c\x53\xcc\xe4\xf5\x87\x68\xcd\x49\xb2\x70\xbc" + "\xb0\x70\xd5\xc7\x87\xda\x03\x9f\xc8\xb9\xc5\x88\x52\xd8\xd3\x9a" + "\x3c\xe3\x63\xd3\x52\x3e\xde\x8b\x31\x7e\x9f\x6a\xf7\x69\xa1\xda" + "\xad\xf0\x66\xfc\xa5\x8e\xc3\xbc\xb7\x42\xe2\xfe\xc3\x67\xc3\x80" + "\xaf\xb9\x5b\x8a\x22\xee\x96\x42\x75\x2e\xb4\x95\x2a\xca\x44\x97" + "\x17\xb6\x31\xfb\x82\xf2\xd9\x5f\xf6\xed\xe1\x36\x72\xfb\xb8\xee" + "\x3f\x9e\x39\x29\xe3\x9f\x85\xf1\xec\x2c\xd1\xcb\x74\xa3\x4c\x77" + "\x2b\xf5\xba\x5b\x64\xdb\xdb\x03\xaa\x6c\x81\xbc\xe7\xf2\x51\x74" + "\xd0\xdb\xdc\x4f\x07\xb4\x9d\xdb\xc7\xed\x0f\x33\x4d\x40\x03\xbd" + "\xad\xb6\x3e\xbd\x9d\xdc\xc6\x3f\x60\xd4\xd9\x86\x76\xa2\xad\xb2" + "\x9d\x7d\x68\xe7\xa1\x62\xa2\xd0\x66\x73\xd6\x67\xa9\x2d\x85\x3c" + "\x3f\x74\xfe\x09\x76\x74\x79\x0d\x61\x1e\x68\x7e\xb3\xa2\xc6\xb4" + "\x01\xb6\x49\x85\x1f\xf3\x41\xbf\xe8\x62\x7b\xdf\x5b\x8a\x5f\xb8" + "\x4e\x7e\xcb\x58\xda\xc7\xfc\xdd\xd9\xe7\xd0\x26\xed\xef\x54\xd1" + "\x25\xba\x60\x9b\x86\xbc\x61\xe4\x29\x46\xfb\x31\x7f\x3c\xae\xe3" + "\xcf\x79\xd7\xfc\x4b\xb5\xcb\x5a\x42\x19\x07\x1f\x71\x9b\xbc\x1d" + "\x6e\x32\xda\xf2\x38\xf2\xa1\x3d\x36\xc0\x1a\x2e\xbf\xf5\x80\x76" + "\x6e\x07\x9e\xa1\xa8\x36\xb5\x75\x87\x00\xf3\x43\x4a\xcd\xa3\xa4" + "\x6d\xa7\xd0\x8e\x53\x64\xab\xa9\x80\xfd\xf5\x20\xdb\x8b\xff\xe7" + "\xf5\x4b\xf2\x69\xac\x8f\x5e\xdb\xa3\xf8\x4e\xc6\x22\xba\xfc\x04" + "\xfd\xb0\xad\x3f\xde\x10\xc7\x70\x4b\xf9\xb8\x95\xf9\x48\xc6\x1d" + "\xe2\x31\x23\x08\x9e\x61\xbf\x9c\x15\xa8\x23\x98\x39\x4a\xe2\xe3" + "\x9a\x44\x78\x4e\xc3\x33\xdb\xc1\x19\xbc\x26\x80\x72\x87\x04\x68" + "\xc6\xf0\x61\xcf\xed\xe3\x2b\xd3\x30\xe1\xb9\x95\x9f\x11\x74\x1d" + "\x6c\x4c\xcc\x7d\xf7\x56\xf8\x4d\xcf\xff\x8c\xc6\x5f\x9c\x4e\xf9" + "\x61\x78\x30\xfd\xcd\x7b\x20\x0c\x0f\x6d\x1b\x79\x82\x76\x7d\x1a" + "\x2b\x63\x76\xa9\xcb\x94\x1e\xdc\xb5\x9b\xf7\x1d\x2e\xae\xde\x5d" + "\xd2\x86\x63\xff\xa9\x8b\x2c\xb7\xc7\xc0\x03\xf7\x83\x9e\xbd\xba" + "\x78\x3a\xbc\x6e\x1e\x0c\xd6\xa6\xad\x32\x06\x9d\x73\xf3\x56\xe8" + "\x0b\xd8\x0a\xcd\x36\x8e\x0b\x8e\xb1\x73\x57\x80\x96\xee\x20\x8b" + "\xf3\x24\xaf\xc9\xcc\xa4\xe6\xba\x2c\xda\x89\x39\xb9\xe8\xc9\x1c" + "\xf9\xf2\x19\xf6\xa3\x50\x3a\x84\x6d\x52\x3e\x97\x29\x96\x66\xa6" + "\x57\x6f\x35\x6c\xf8\xd7\xdb\xca\xcf\x92\x49\x7d\x77\xe5\xf5\xd6" + "\x69\x76\x11\xde\x62\xd2\x8a\xeb\x38\x8e\x56\xaa\x56\xc8\x71\xb4" + "\x8c\xd8\x54\xd2\xf6\x71\x40\xe6\x7a\x6c\xa9\x9b\x96\xd0\x78\x8e" + "\xa7\x67\xf5\x2b\x5b\x4e\x8d\xd7\xaf\xb3\x8e\x4d\xd7\x7d\x07\xd2" + "\x55\xbc\xaa\x5d\xd3\xea\xcf\xa0\x2e\xf9\xfe\x47\x37\x44\x30\x87" + "\x91\x70\x97\xd0\xd8\xba\x33\x94\xc9\x76\x50\xc1\xdf\x95\xcd\xc6" + "\xf3\xc2\x99\xdd\x56\x11\xf9\xaf\x4c\xda\x71\x62\x20\xde\x9e\x7f" + "\x29\xc7\xe8\x4b\x7c\x46\x4b\xad\xe5\x4b\xff\x21\x19\xe3\x45\x7d" + "\x97\x8f\x68\xcb\x4b\x64\xe6\xef\xd0\xf2\xba\x20\xaf\x33\xf3\x19" + "\x22\x35\x86\xfc\xa8\xce\x88\x43\x36\xe8\x9e\xa4\x5b\xcd\x77\xb4" + "\xa1\x98\x7f\xf9\x83\x1e\xcf\x72\x1e\x33\x7e\xd4\xc9\xe7\x96\x06" + "\xe6\x38\x3f\xfa\x1d\xbf\xe3\x34\xf6\xab\xcf\x91\xb4\x7c\x23\x8d" + "\xe7\x3d\xfa\x9c\xf1\xa0\xbd\x3f\x4d\xd9\x30\x3c\x96\x31\x0e\xf5" + "\x6a\x4d\x7a\x44\xd0\xf5\x46\xa6\x31\x9e\xf1\xb8\xae\xbe\x81\xfb" + "\xc6\x64\x5f\xd2\xa1\x86\x0b\xe0\x97\xae\x7f\x43\x9a\xe3\x2c\xe4" + "\x20\x7f\x89\x31\xbe\xc9\x6f\x9c\xac\x1b\x7d\xd7\xd2\x95\x34\xe6" + "\xa1\x2f\x59\x64\x1c\x0f\xfe\x96\xa9\x1a\x77\xdf\xd8\x32\xb0\x37" + "\x97\x23\xe9\x2d\xbf\x5f\xc8\x73\x0c\x13\xc6\x60\x15\x53\xaf\x5b" + "\x8d\xbf\xc6\x99\xf9\x37\xde\x8e\xaa\xe7\x48\xff\x38\x8a\x3a\xd8" + "\x47\x84\xe1\x2b\xdb\xe4\x0d\x37\xd7\xc1\x73\x2b\x35\xbe\xbe\x71" + "\xa1\xf3\x85\x99\x4c\x5f\x4d\x9f\x4f\x7a\xbb\xff\xa1\xe8\xeb\xa0" + "\xe4\x09\x5b\xc8\x76\xb0\xc2\x67\x1e\xa1\x62\x43\x59\x8f\xd1\xee" + "\x71\xfc\x9e\x79\xdd\x73\x23\xaf\xc5\xed\x5e\xeb\xe5\x71\xbb\x2f" + "\x3f\x6d\x16\xcf\xf5\xa5\x2d\xbe\xbb\xf4\x06\x94\x43\xda\xc8\x03" + "\xa7\x42\xe6\xea\x55\x34\x9e\xbf\x13\x8a\x74\xb9\xb7\xe5\xbf\xe2" + "\x99\xe0\x57\x33\xc8\xf6\xd5\x2d\x7c\xb6\x60\x77\x2d\xe6\x97\xea" + "\x9b\xa8\x5c\xff\xe6\xd1\x95\x1c\x4f\xf0\xad\x5e\xdf\x10\xd5\x57" + "\x3f\xbe\x05\xcf\x99\x03\xcf\xbb\xff\x64\xec\x0b\xf8\xe8\xc7\x93" + "\xe4\x3e\x28\xfb\x4f\x2f\xe2\xf1\x5a\xd0\x80\xcf\xd1\x8f\x6f\x51" + "\xb8\xfc\xf8\x96\xe6\x52\xe2\x75\xef\x23\x3b\x65\x6c\xb0\x1f\x43" + "\x9e\xdf\xc8\xd5\xd7\x63\x0e\x4b\xbe\x62\x7b\xf7\x7b\x3c\x07\xfb" + "\x87\x67\x13\xf2\xf1\x38\x51\xe0\xa0\x1c\x65\xc3\x0b\x8e\xa5\xe9" + "\x8b\x6a\xff\x6b\xbc\xd6\x97\x50\x27\x6e\x23\x92\x65\xaa\xb4\x3c" + "\xe9\xbf\xb6\x69\x8c\x0f\x57\x8b\xd8\x44\x3c\x5f\x62\x9e\x4b\xc7" + "\x35\x1d\x57\xce\x9b\x21\x36\x8d\xf6\x30\x5f\x62\x0e\x6b\xc3\x3c" + "\xc1\xd2\x93\xa2\xe5\x0e\x76\xee\x91\x69\xe3\x5d\xff\x1d\x52\xfe" + "\xb8\x3f\xb1\xb5\xf9\x61\x9f\xed\x20\x5a\x1a\x16\xbd\xf6\xaf\xf0" + "\xf9\xa2\x9f\xd8\x9c\x3b\xd8\x0f\xe6\xc7\xdd\xb1\x7e\x30\x3f\x49" + "\xc3\x6f\x06\x7e\x90\xba\x9f\x1c\xc6\xcf\x36\xf0\xfb\x69\x5a\xd0" + "\xf5\x13\xe8\xca\x1f\x4b\x1b\xeb\xe2\x74\xe2\x4f\x64\x9c\xb6\x6a" + "\x9e\x17\xa5\x7c\xe2\x57\xed\x1d\x95\x85\x67\x8b\x18\x3e\xba\x54" + "\x6f\xaf\x1d\xcf\xe9\x76\x27\xc6\xb5\x14\xd0\x64\x34\xda\x3c\x7c" + "\x8c\x8f\xdb\xcb\xf8\xf6\x0c\x27\x8a\x3e\xf3\xc9\x30\xb9\xfd\xfe" + "\x14\x94\x03\x2d\xc5\xb5\x2b\x1b\x0c\x7a\xea\x74\xe2\x3d\x28\x53" + "\x0f\x60\x28\x3b\x08\xf9\x01\xc3\xc8\xdf\x4f\xfb\xd1\xfc\xcd\x0e" + "\xf4\x29\xf2\x61\x4e\x6c\x31\xce\x93\x06\x5d\x3f\x35\xbf\x5b\x42" + "\x7a\x4c\x85\x9f\xd8\x02\x51\x65\x39\x7e\x46\xa2\xf2\xa8\xd3\xa2" + "\xea\x64\x5e\xfa\xc9\x97\xf4\x7a\x43\x83\xc9\x52\xc5\xd5\xb0\xef" + "\xa0\xcd\x26\xa8\x79\xdf\x64\xef\x98\x00\x79\xeb\x34\x8c\xf9\x22" + "\x2b\xa7\x42\x78\x8e\xd3\x4f\xdf\x69\x0f\x75\x5d\xe4\x78\xf8\x53" + "\xf5\x8d\xd0\xde\x4a\xf2\x96\xdf\x24\xbf\x8f\x7d\x8a\xf6\xfc\xd3" + "\xeb\x97\x71\xe6\xf9\x5e\xfa\x83\xb3\xcf\x07\x8f\x0d\x98\x63\xf7" + "\xc7\x69\xd4\x90\x77\x27\xa7\x23\xcd\x1b\xf0\xcb\x78\x8e\x03\x3e" + "\xe9\x9a\x45\xc9\xd4\x9e\xd7\x64\x2c\x07\xc6\x37\x7c\x8f\x87\x71" + "\xd6\xdc\x9a\x85\xdb\xe0\xc4\xfc\xcf\x1b\x0e\x7a\x58\x26\xec\xcb" + "\x79\xad\x70\xcf\x1a\xf0\x9d\xd0\xaa\x34\xcb\xc5\xb5\x61\x8f\x3c" + "\x3f\xef\x0c\x8b\x53\xfe\x14\xcd\xc2\x36\x49\x75\xc5\x10\xcb\xd4" + "\x3a\xe1\xe9\x49\x15\x59\x41\xd7\x9e\x86\x77\x1d\xaa\x6f\x2e\x12" + "\x6e\x83\xd1\xf6\x9d\x7a\xdb\x91\x26\x79\x7f\x42\xad\x8a\x5f\x89" + "\xe7\x8e\x41\xd7\xac\xd0\xcf\x6c\x0f\xb0\xbf\xac\xa2\xc5\x9b\x99" + "\xfd\x63\xc3\x45\xe1\xf1\x66\xe6\x17\xa8\xa3\x4f\xaf\x63\xe3\x7f" + "\xb3\x8e\x8d\x17\xaa\x03\xba\xe1\xca\x13\xf4\x33\xdb\xc5\xcf\x1d" + "\xdf\x94\xdf\x08\x82\xfe\xb4\x2b\x9d\xf9\x56\x55\x04\xf3\xb7\x70" + "\xda\xa8\x2c\xf9\x2d\x2b\x13\x55\x72\x2c\xcf\xb0\xfb\x13\x7f\x9b" + "\xa3\x97\x3c\xcb\xdf\xa7\x4e\xfa\x99\xfc\x66\x6e\x5b\x19\xcf\xd9" + "\x46\x97\xf6\x6d\x10\x95\x7d\xa6\x37\x25\x9f\xed\x40\x3f\x6c\x8f" + "\xe2\xb3\xf6\xc0\xfb\xe4\x2d\xe4\xf5\xd5\xc3\xbc\xae\x5d\x2a\x86" + "\x8f\xca\xd2\xa0\x1b\x60\xa3\x47\x24\x3d\x60\xbf\xc8\xf9\x16\xe6" + "\x6c\x72\xbe\xe5\x97\x67\x1d\x87\xcb\x18\x9d\xae\xd2\x12\x5e\xfb" + "\x8e\xf4\xe5\xdb\x83\x2e\xca\xe3\xd8\x9d\xbc\xee\x2c\x2c\xad\x81" + "\xd9\xe1\x64\x21\xe7\x53\xb0\xfd\x39\x76\xa7\x37\xe0\xa3\x08\xec" + "\xe8\xba\x73\x94\x51\x07\xdb\x13\x3a\x3b\x9d\xf5\x7a\xbd\x1e\xbf" + "\x73\xd3\xb9\x81\xf8\x9d\x3b\x79\xad\xa7\x03\xf7\xe7\xc8\x1c\xd9" + "\x64\xb6\x6d\x3f\x47\x63\x77\x2c\xa7\xcc\xed\xbc\x96\xf7\x4f\x65" + "\xfb\xb0\x5d\x21\x63\x79\x2e\xce\xe4\xf5\xfc\x01\xdb\x67\x05\xc7" + "\x1a\xee\xd7\x5b\x66\xb9\x06\x72\x51\xf4\x7e\x4b\x8e\x83\x61\xb7" + "\x96\x17\x4e\x1b\xe3\xeb\xdb\xcc\x7e\x72\x3f\x73\x83\x7e\x09\xc7" + "\x15\xc3\xa7\x6b\x4b\x54\xfc\xd5\x77\xc7\x2a\xfd\x0e\x58\xad\x83" + "\xf1\x44\x64\x7b\x3e\x4d\xe8\xa6\x2c\xe5\x1f\x91\x82\x31\x71\x6f" + "\x16\xef\xc5\x57\x3c\x4b\xb6\xc8\xf6\xb9\x49\xce\xd7\x28\x99\xbf" + "\x9d\xce\xbf\x8a\x7f\x89\xae\x09\x25\x94\xc5\xfb\x0f\xec\x43\x61" + "\x5f\x2d\xf3\x27\x8d\x2d\xa7\xac\x68\xd8\xb9\xca\xc9\xea\x36\xfb" + "\xd2\xb2\x79\x2b\xd9\xbb\x61\xc5\xc2\xb2\x62\xfb\x93\xcb\x96\x2c" + "\xe1\x13\x9f\x33\xa7\xe6\xc5\x9e\xe9\x34\x6f\xc6\xb8\x60\x5d\x3b" + "\x7d\x8e\x35\x9c\x6b\x57\xf1\x73\xdf\xae\x8d\xfa\xce\x39\x3f\xab" + "\xef\x69\xb8\x3f\xd8\xc8\xe3\x36\xbf\x57\xcf\x47\xb2\x95\xcf\xd5" + "\x5e\x39\xde\x6b\xdb\x6d\xbb\xd4\x19\xca\xb7\xef\x65\x5f\x06\xc5" + "\xa7\xaa\xac\xf2\x53\xdf\x3b\x59\xed\xe5\xef\xed\xea\xf7\x5d\x70" + "\xab\xb1\x84\x7d\x17\x78\x3f\x59\xc9\xde\xdb\x16\x43\xf6\x82\xae" + "\xb7\x33\x60\x3f\xd5\x5c\xbc\xce\x79\x5b\x9e\x27\xd1\xcf\xca\x32" + "\x4e\x6b\xa3\x62\xcc\x0d\xed\x6f\xc3\x76\xdb\x8f\xd4\x7a\xf7\xdb" + "\xaf\x32\xbe\x3e\xda\x7b\x28\x2a\x7d\x0c\xda\x76\x48\xa5\xbf\x9d" + "\xcf\xe5\x13\xd2\xf9\xde\x45\x4f\x2e\x7e\xb6\x74\x5e\xd9\xc2\x27" + "\x16\x96\x2c\x2c\x5b\x29\xc3\x5e\x8c\x97\xff\xee\x1e\x57\x34\x47" + "\x3a\x0a\x44\xdb\x71\xbc\xee\x61\xc4\xdd\x52\xeb\x4e\x3f\xbf\x4e" + "\xfa\x4a\x5e\x5c\xfb\x02\x6a\x4d\xf0\xe7\x93\x7c\x49\xff\xb1\x77" + "\xc0\xe7\x44\xa5\xf7\xa4\x8d\xf6\xd8\x47\xd3\xe4\x63\xf4\xcb\x7c" + "\xde\x6f\x02\x9d\xd3\x79\x5c\xda\xdc\xcb\xe3\x47\x17\xb5\x85\x6f" + "\xd2\x7d\xa6\x7f\xfe\x3a\xc7\x19\x66\xdf\x35\xd0\x7e\xd7\x31\x3c" + "\xcb\xf6\x9f\xb6\xed\xe2\xf3\x4d\x62\xb1\xed\x47\xcc\x0b\x8c\x1f" + "\x68\xb7\x5d\x88\xfc\x6d\x62\x71\xf1\x76\x71\xba\x78\x1b\xec\xb5" + "\xae\x9d\x5b\x45\x27\x70\xd8\x0f\xba\x15\x46\xfb\xfe\x6c\x52\xdf" + "\xb8\xef\x54\xb4\xfe\xf9\xc7\xd0\x55\xb7\xe2\x77\x85\x70\x37\xb9" + "\x15\x5d\x7f\x2e\xf7\x10\x66\x16\x8b\xd3\x03\xb1\x2d\x7e\xc1\xcf" + "\x7d\xf8\x69\xc2\x7d\x60\x77\xd4\x1e\x27\xbf\xbb\x41\x6c\x38\xf0" + "\x06\xdb\xdb\x8a\xe7\x7e\x71\x8b\x1a\x1f\x0f\xbc\xe1\x77\x16\x27" + "\xa3\x4c\x44\xfa\x9b\xc9\x36\xfd\x62\x9e\x77\xfd\x39\xf6\x7f\x08" + "\xe8\x65\x0b\xf9\xd9\xf3\x34\xdb\xd8\xbf\x88\x08\x93\x53\xf0\xbe" + "\xa8\xb7\x2b\x4c\xba\x3f\x13\x78\xf3\xed\x5d\xfc\x0d\x72\xe6\xcf" + "\x9d\x2f\x91\xa5\x66\x24\xc1\xee\xfa\x45\x7f\xfc\x13\x91\xa6\xec" + "\x20\xe6\x55\x8e\x93\x2e\x7d\x1f\x86\xab\x78\x7f\xcc\xab\x80\xdb" + "\xc8\xfb\xa6\x8a\x67\x7f\x71\xe8\xbf\xc7\xb3\xbf\x90\xbc\x37\x61" + "\x23\x15\xf2\x5e\x03\xfb\x03\x70\x1c\x71\xe8\xd1\x2e\x25\x87\xbf" + "\x9c\x28\xfd\x1d\xa0\xeb\x79\x1f\xab\xbe\x02\xf6\x9b\xa5\xb5\x9b" + "\xed\xce\xb0\x8b\x2a\x79\xcf\x59\x3b\x77\x72\x2f\xfb\x09\xc8\xf3" + "\xa3\x32\xfe\xfe\x1f\xa8\xfe\x2c\x99\x3b\x69\x5f\x0e\xef\x8d\x0c" + "\xd0\x7a\xdf\x2b\x0c\x43\x6c\x68\xb4\x5b\xcb\x4d\x6e\x86\xa1\x9d" + "\x3b\x95\x6d\x94\x83\xad\x35\x8c\xcb\x1d\xa3\x7d\x2b\x65\x39\xce" + "\x2b\xe3\xde\xa4\xcf\x15\x16\x2d\x4f\xd6\xa9\x9e\xf3\x04\xf4\x63" + "\xf8\x5c\x64\x2f\xee\xe7\x30\x9d\x70\xcd\x97\x6b\xf2\x7d\x36\x92" + "\xf1\x96\x2c\x1f\xfb\xbc\xbe\x7f\x78\x24\x3e\xec\x6f\x5d\x86\xb1" + "\x44\xda\xe9\xfb\xda\x76\xfe\x9d\xcc\xa5\x4f\x73\x7f\xfe\xb2\x50" + "\xda\xaa\xa7\x68\xb7\xc2\xef\x97\xf3\x7a\x36\xb4\x14\xf6\x58\x44" + "\x7a\xc0\x64\xa1\x66\x5b\x88\xc7\x30\x4f\xb3\xad\x17\xfa\xe3\x97" + "\x99\x3e\xd3\x6f\x6b\x94\x8d\xa8\xca\xf1\xfe\x3d\xf3\x63\xb2\x2d" + "\xdd\x89\xf7\xb9\x86\x6f\x0d\xf3\xe1\x26\xbc\xf3\xd1\x3e\x3b\xd3" + "\xcd\x47\x3f\x2f\x6a\xef\x56\xe7\x6f\xf0\x3c\x94\x63\x2a\x48\x5a" + "\xaf\x7b\xa6\xcb\xba\xd6\xc3\x67\x7c\xb3\xad\xe1\x1c\x13\xef\xcf" + "\x73\x6c\x07\x8e\x77\xc1\xf1\x1d\x78\x8d\x55\x7f\x9f\x15\xf7\x7e" + "\xbc\xf1\x1e\xf5\x7a\x8c\xb8\x0c\x1c\x37\x8b\x7d\x3f\x22\xba\x3f" + "\xa8\x8c\x27\x75\x46\xed\x6f\xb3\x3f\x28\xaf\xef\xf2\xb9\x56\xde" + "\x83\x46\xb9\xfe\xf3\xbf\xea\x3c\xd7\xaf\xfa\xfd\xdf\x70\x9f\xd1" + "\xef\xbb\x05\x5a\xf4\xb8\x85\x25\x00\xd9\x0e\xb8\xb5\x5c\xbc\xcb" + "\xc2\xd8\xb2\xfb\x82\x73\x72\x8e\xbf\xbd\x8c\x4c\x5a\x6a\x1b\xcf" + "\xd7\x4c\xcd\x01\xd2\xcf\xb2\xff\xea\x45\x3d\xee\x41\xf2\x29\xfa" + "\xd5\xcc\x81\xbd\xe0\x88\xbe\x8e\xf9\xab\xfd\xca\x8e\xfe\xd5\x7e" + "\xb9\x8e\xb9\x41\xf3\xff\x70\x55\xc8\xb4\x77\x95\xcf\xa4\xce\xb7" + "\xfc\x6a\x8f\x8f\x0e\xf8\x0c\xdf\x24\xe4\x2b\x19\x2c\xbe\x1e\xc6" + "\x0d\xdd\x86\xfd\xf5\x6b\x72\x9c\xe8\x9f\x97\xfe\x5a\x7d\xf7\x70" + "\xdd\x68\xfe\xe6\x81\x53\xa4\xfe\x55\xfa\xc6\x7a\x4b\xcf\xf0\x7a" + "\xe6\x50\x35\x47\x56\x79\x74\x7f\xde\xcb\x4e\xc4\x3e\x8f\xe4\x67" + "\x45\xb3\x5f\x4f\x36\xf6\x46\x36\x9b\x34\x8e\xc1\x2e\x9c\x0d\x22" + "\xe0\x2d\x0d\x10\xec\x63\xbf\x17\x36\x11\xea\x10\xa5\x4b\xf8\x1b" + "\x09\xbf\x7e\x8e\x69\xaf\x64\xea\xd7\x72\xff\x42\x73\xdd\x21\x9c" + "\x3c\x2f\xf0\x77\xcb\xf9\x29\xf2\x5d\x8a\x7c\x3b\x5a\xca\xbb\x21" + "\xf7\xad\x3e\x8e\x6b\xd9\xa9\xd7\xed\x4f\xf9\xc0\xf2\xd5\x34\x2a" + "\x44\x9d\x7b\x7d\xf4\xbd\xfd\x17\x2f\xe7\xbf\x1e\x7c\x7f\xb6\xdf" + "\x66\xc9\xa1\xc1\xe6\x99\xbc\x8e\x70\x23\xea\x9f\x29\x18\xff\xfd" + "\x3b\xc2\xa6\x10\xf5\x99\x86\x89\xaf\x57\x3a\xa0\x07\x86\x89\xc8" + "\x2a\xf4\x57\x8f\x0d\xf3\x90\x56\x6a\x0f\xb7\x48\xdf\x1d\xc8\xb0" + "\xb5\x22\x20\xce\x78\xc3\xfb\xa4\x0f\xb7\x1a\xa7\xf7\xbf\xe2\x0d" + "\x37\x51\x7b\xa9\x9f\x3c\x4b\xde\x87\x2d\xb1\x5f\xc6\xcb\xbb\xb1" + "\xb4\x92\x6e\x38\x25\xdf\xe7\x28\xfb\x65\x7f\x9d\x7e\x2d\xe1\xf8" + "\xa7\xd1\x38\xdd\xbd\x6c\xd1\x93\x65\x0b\x17\x2f\xba\x61\xc6\xfc" + "\xe5\xf3\x4b\xec\x0f\x2a\xb7\xca\x98\xf1\xce\x32\x10\xeb\xfd\x9d" + "\x62\x1e\x8b\xd8\x86\xe4\x98\xef\x17\x8a\xf7\x6e\xc4\x7a\x87\x3d" + "\x37\x96\xd7\x5d\xff\x37\xe3\xbd\x1b\x36\x22\xc7\x7a\x1f\xd8\x83" + "\xf8\x4d\x66\xbf\x0c\x68\x07\x83\xfc\xcc\xe3\x9f\xe6\xda\xbf\x9b" + "\xe5\x68\xa7\xb4\x5b\xde\x69\x88\x8e\x87\xc5\x36\x0b\xaf\x5b\x21" + "\x7d\xbf\x71\x96\x1a\xbc\x88\x71\xe3\x9d\x43\x03\x67\xbb\xde\x39" + "\x02\xba\x65\x28\xf9\x95\x79\x3b\x8d\xbd\x7a\xfd\x1b\x7b\xd2\xb7" + "\x40\x73\x69\x76\xb5\x3e\xf6\xce\x3f\x77\x6a\xc3\x2c\x6a\x6f\xe6" + "\x37\xe9\xc6\xb9\x41\x25\x9b\x07\x75\xd9\xfc\x4d\xe6\x85\xfc\x29" + "\x06\x64\xe3\x37\x45\x03\x72\xfd\x37\xa3\x6c\xd1\xe7\xf9\x62\xe8" + "\xf3\x94\xcb\x4f\x50\xe3\x4a\x5e\x33\xc3\xfd\x55\xb8\x9f\xc7\xb0" + "\xd4\x19\x8a\xc6\x29\xfa\x3d\xea\x68\x1c\xa7\xdf\x7f\x19\xf7\xc3" + "\xf5\x7b\xd8\x53\xbf\x3d\xab\xdf\x43\x66\x7f\xfb\x89\x7e\x9f\x81" + "\xfb\xdf\xe9\xf7\xd0\xf9\xbf\x7d\x53\xbf\x1f\x85\xfb\x57\xf4\xfb" + "\x2f\xe1\x7e\x8d\x7e\x0f\x19\xfc\xed\x7c\x7d\x5f\xdb\x72\x9c\x7e" + "\xfb\xc0\xc5\xcf\x9b\x7e\x3b\x46\xd9\x49\xbf\x9d\x0b\x9b\xe9\xb0" + "\x1a\x33\xfa\xd3\x4a\xd1\x37\x1e\x83\xbe\x48\xcf\xe0\x7a\x90\xee" + "\xf6\xd1\x8f\x76\x47\xa5\x9b\xf5\xfc\x0d\xd0\x73\x93\x07\xd2\x7f" + "\x13\xd2\xd3\x61\xff\xbc\xd9\x1a\x95\xde\xad\xa7\x1f\x46\xfe\x96" + "\xa8\x74\x7d\x1f\xf7\xb7\x5d\x3e\x6a\x38\x1a\x95\x7e\x44\xa5\x37" + "\x92\xe1\x47\xa2\xa7\x1f\xd2\xd3\x71\x5f\xbb\x31\x2a\xbd\x51\x4f" + "\x87\xfe\xff\xcd\xa4\xa8\x74\xf5\xad\x7a\x79\xde\xd0\x2a\x9a\xcb" + "\x59\xb6\x1a\xe7\xf8\x68\x67\x79\x54\x9e\x5d\x7a\xd9\x12\x1f\xed" + "\xd8\x15\x95\xae\x9f\x55\x6d\x5c\xef\xa3\xff\x0a\x47\xa5\x0f\x3a" + "\x9f\x4d\xaa\xa5\xc2\xc1\xd6\x96\xf9\x9b\x64\xd2\x17\x56\xda\xa4" + "\x4d\xef\xf2\x59\x44\xeb\x0e\x71\xcc\x5e\x21\xc4\x31\x6a\xda\xad" + "\xfc\x36\x5b\x8f\xb2\x1f\x9d\x3a\xd3\xd9\x54\x23\xcf\xf9\xb1\x9d" + "\xc9\xe7\x3c\x57\xc9\xb4\xcb\xa5\x3d\xe4\xa8\x54\x71\x57\x95\x8f" + "\x71\xb7\x5c\x63\xd1\xf7\x9f\x91\x67\x0a\xdb\xd2\x0c\x87\xd7\x61" + "\xbd\x65\xbd\xd2\xef\x95\xe7\xb8\x9c\xc6\x6b\x0d\xf2\xec\x5f\xd4" + "\x5c\x57\xe9\xfd\xa6\x77\x35\x8e\xcd\xe0\x52\xeb\x31\x2c\x8b\x9c" + "\x9f\x7d\xa6\xa2\xf3\xfa\xa8\xc9\xc3\xd7\x64\xdb\xa5\x1f\x05\x5d" + "\x4d\x0d\x03\xe7\xd1\x1a\x43\x7a\xfa\x87\x48\xdf\x1f\x95\xde\x39" + "\xb8\x6e\x87\xbe\xb3\x34\x16\xf7\x9d\x13\x81\xf0\x39\x11\xda\xfc" + "\x57\xe0\xbd\x40\x9e\xad\xfa\x4a\xc4\xdd\xe8\xd0\xe3\x9c\x7c\x1a" + "\x5e\x2e\xfc\xd0\xd9\xfc\x3d\x91\x4b\x66\x05\xfc\x34\xab\x34\x28" + "\x36\x3d\xc1\xfe\x8f\x67\x65\xcc\x2f\x67\x37\xc7\x5a\x67\x9f\xba" + "\x00\xef\xdb\xa5\xb5\x63\x8c\xdb\xb9\x80\xdf\x7f\x42\x33\x8b\xfd" + "\xd4\x56\x1c\xa1\x9d\x80\xbd\xe3\x09\xc3\x9f\xf5\x40\xff\xf9\x1f" + "\xc6\x81\xeb\x73\xca\xef\x02\x1d\x90\xfe\x11\xfc\xdd\x43\xb1\x69" + "\x8c\x5f\xbc\xc7\xb6\xac\x96\xfe\xff\xd8\x7b\x1b\xb0\xa8\xae\x6b" + "\x6f\x7c\xcf\x30\xe8\x88\x03\x8c\x96\x98\xd1\xa0\x99\x24\xda\x4e" + "\x2c\x26\xa4\xc5\x5c\xda\x6b\x5a\x92\x98\x5b\x93\xaa\xd0\x54\xff" + "\x97\xde\x18\xc5\x08\x76\x68\x40\x27\x48\x08\x1a\x04\x44\xe5\x45" + "\x03\x48\x6f\x68\x2e\x49\xf8\xd2\xd7\x2a\xe9\x35\x89\xed\x35\xcf" + "\x35\x79\x4c\x3b\x56\x6c\x30\x01\x06\x15\x23\x26\x18\x47\x82\x04" + "\x0d\x9a\x91\x0f\x19\x61\xe6\xec\xff\x5a\x7b\x9f\xc3\xcc\x00\x03" + "\xc3\x80\xc6\xbc\x95\xe7\x39\xcf\x70\xf6\xd9\x67\x9f\xbd\xd7\xfa" + "\xed\xb5\xd6\xfe\x5a\x2b\x70\x13\xd1\x82\x6e\x2f\x84\xff\x09\xbb" + "\xf0\x19\xa4\xbb\x6b\x13\xef\xcb\x7f\xad\x13\xd7\xd2\x5a\xb9\xbc" + "\xf8\x6b\x1d\xdd\x85\xe3\xa6\xbf\xd6\xc3\xbb\xad\x96\x09\xc2\xa0" + "\xfb\xe2\x36\x96\x10\x79\xef\x76\xb0\x4d\xae\x1c\x94\x73\xf9\xf4" + "\x37\xa3\x20\x57\x6e\xc2\xf9\x5e\x16\x13\x64\x7b\x8d\x6e\xdf\x1a" + "\xab\xbc\x66\x43\x33\x79\x79\x2a\xd1\x2c\xb3\xe2\x79\x81\xbf\x3d" + "\x1a\x90\x8c\xfe\xd6\x04\x0b\xd8\xa1\xf2\xff\x81\xe7\x7f\x5d\x73" + "\x50\x6e\x63\xf6\xca\xdf\x8c\x6c\x8e\x30\xa7\x1a\xf7\x03\x06\x9a" + "\x1a\xec\xa8\x07\x98\x9d\x0c\xf2\x5f\x69\x7f\x49\x3f\xd9\xb6\x4e" + "\x3f\xb1\x24\x89\xa8\xec\xeb\x74\x41\xaf\x5e\x23\xe1\x92\xfe\x29" + "\x49\x01\x9d\xd2\xad\xf1\xdb\x01\x3a\x05\xe7\x1e\x02\x64\x6a\xb6" + "\x16\x8a\xff\x0b\xf2\xff\xdb\x5a\x9a\x32\x74\x7c\x23\xfb\x4b\x3a" + "\x39\xfa\x17\xc7\xba\x0c\xd6\xd6\x5c\x18\x67\xdb\xc5\xb3\xd0\xe9" + "\x17\xc8\x14\xc3\x6a\x22\x0f\xe8\xa2\xc6\x4b\x09\x44\x8e\x31\x61" + "\xd2\xe3\xd8\xfc\x9e\x6f\x8d\xde\x46\x4c\xa9\x9f\x91\xf4\x24\xe4" + "\x91\xf1\x0e\xb4\xd3\x70\x3f\x2b\xe4\x57\x03\xea\x67\x05\x5a\x41" + "\x67\x58\xc1\x96\xfe\x1d\x8e\x1d\x8d\x3f\xe9\x64\xfe\x8d\x8d\x78" + "\xf6\x19\xec\xfd\xc7\x30\x6d\x69\xc6\x05\x16\xdf\xd9\xcc\xfb\x96" + "\x31\x14\xef\x33\xf0\x6c\xb6\xdf\x89\xd0\x77\x7a\xac\xbe\x7c\x9c" + "\x64\x7c\x88\xf3\x4c\x30\xf3\x31\x99\x31\xd4\x1d\x76\x85\x1c\x63" + "\x0e\x45\x3f\xf8\xc5\x36\xb2\xb8\x93\x9a\xd9\x3a\x33\xfa\xa4\x48" + "\xfd\xb9\x91\x5e\x2b\x20\xfc\x1c\xa5\xb1\x4b\xd8\x66\xcc\xe1\x3e" + "\x49\x8d\xd2\x1e\x31\xd0\x91\xc6\x22\x36\xc7\xbe\xcd\x58\xc1\xe7" + "\x9c\x8d\x07\x37\x4f\xc3\xfd\xe8\xc6\xce\x8e\x09\x46\xd0\x95\xc6" + "\xaa\x0e\xbf\x4f\x0f\xba\xd7\x47\x1f\x1e\xd4\xce\x20\x41\xb8\xd6" + "\x81\xfb\xc1\xcb\xf8\x3e\x70\xf8\xc6\x61\xdc\x67\x8e\xcf\xee\x6e" + "\x32\x10\x1f\x9c\x1f\x86\xb4\x27\x1e\x2c\x26\x5a\xa8\xab\x3f\x55" + "\x1a\xf5\x6c\xef\x5d\x8e\x31\xd5\xd4\x46\x8d\xb8\xe7\x93\xaf\x49" + "\xfd\x5d\x41\x27\x18\xf5\x62\xfe\x3f\xd4\xb6\x41\x1b\x94\xc6\x70" + "\x93\xf5\xb2\x68\x13\x1e\x06\xec\x1b\xc3\x69\x8e\x71\x01\xf7\x71" + "\x70\xf8\x82\x24\x57\x39\x46\x0f\x9f\xe1\x74\xfb\xf0\x20\xa7\xdb" + "\xdf\x15\xa2\xbe\xba\x1b\xff\x07\xdd\x1d\xca\xf7\x50\x1c\xae\x93" + "\x6c\x64\xb3\x98\x07\xdf\x31\x93\xc3\x07\xb8\xac\x3d\x6c\x81\xb6" + "\xe7\xf0\xe7\x87\x0b\x31\x0d\xda\x07\x3a\xeb\x70\x08\xb6\xcb\x9d" + "\x6c\x65\xb4\x48\x23\x3e\x50\xe7\x68\xdc\xeb\x8b\x76\x8a\xa9\xf3" + "\xe7\x46\x1e\xb7\xf4\x48\x1e\x3b\xeb\x0d\xdf\x01\xfe\xc8\x51\x6e" + "\xe2\xd9\x74\x2c\xcf\x51\xff\xbf\xbf\x20\xd5\x05\xbf\x87\xcf\xa0" + "\xad\x78\x66\x1f\x69\xb5\x00\xf3\x20\x5f\x5b\x0c\x38\xf7\xd4\x05" + "\x34\xc3\x7d\x5c\x47\x8a\x91\x26\x9c\x66\x47\xd8\x59\xe3\x1d\x7d" + "\x7c\x38\x92\xe8\x4a\x0f\x7e\x2f\x28\x41\x36\x24\xe1\x7e\x9e\x23" + "\xc5\x22\xfd\xda\xf8\xf7\x8f\x3c\xc9\xe8\xc5\x9f\xc9\x9c\xde\x9d" + "\xde\x97\x97\xc7\xc8\x95\xe3\xda\x38\xae\x95\x70\xbc\x1e\x09\x71" + "\x7a\x2f\x64\xc5\x55\xb4\x91\x0f\x85\x63\x4c\x53\xa4\x79\x77\xd6" + "\x91\x08\x07\xbd\x79\x39\x83\x7c\x63\x86\xf4\x0d\xc8\x43\xa4\x7a" + "\x02\x7f\x44\x1d\x7c\x64\x8b\x83\x27\x7f\xdf\x2d\xbd\x57\xca\xce" + "\x8b\xfd\x3d\x0a\xcf\xb9\x0e\x2a\x07\x71\x4d\x0e\xac\x8a\x5a\xdb" + "\xcf\x8d\x0c\x8f\xe4\x88\x0d\xf7\x2a\x03\x5d\xa3\x39\x86\x8e\x98" + "\xb9\x2e\x3c\xc2\xd6\xeb\x71\xbd\x8b\xfb\xb4\x3d\x02\x63\xa7\xbf" + "\x8b\xbe\x1f\x2a\x95\xbc\x0e\x95\x88\x01\xd2\x7f\x5c\xf7\xd8\xca" + "\x58\x76\xa0\x7b\xce\x8b\x86\xfe\x67\xc7\x94\x8e\xb3\xbb\x95\xf3" + "\x9d\xce\x3e\x87\x70\x7a\x57\x16\xc0\x38\xf5\x40\x3e\xf7\x7d\x7c" + "\x30\x1f\x78\x96\xd1\x45\xa6\x61\x2c\xa0\x74\x03\xbd\x54\x6b\x80" + "\xb1\xb5\xb2\x66\x3e\xcd\xa9\x59\x90\xde\x45\xfc\x70\x2f\x0c\xca" + "\x1b\xdc\x6b\x4b\x27\xd4\xa0\x5f\xa3\x05\x8e\xf3\x95\x1f\xcd\x83" + "\xb1\x6d\x45\x1e\x8c\x65\x33\x2e\x93\x69\x7c\x6f\x4b\x65\x8d\x38" + "\x5f\xf8\x86\x90\x53\xb3\x10\xcf\xee\xd6\x42\xab\x68\x86\xfe\x0d" + "\x61\x5b\xcd\x42\x28\x77\x59\x46\x22\x99\x8c\xfa\x0d\xf7\x50\x73" + "\xcc\x7c\x14\x0c\xe5\x2e\x43\xbf\x7a\x02\x8d\x96\xc1\xf7\xcb\x05" + "\xe5\x49\x45\x9e\x40\xd8\xde\x7d\xc0\x99\xbc\x89\x1c\x9d\x0e\xdf" + "\x2f\xc7\x18\xa5\x38\x0f\x64\xb2\x5a\xd1\xf7\x47\x39\x3c\x0b\x80" + "\x67\x4f\xc2\xaf\x80\x3e\xf6\xd0\x67\x3f\x94\xaf\xc1\xf2\xe1\x5b" + "\xe5\xbc\xee\xcc\xf7\x4d\x39\xe4\xdb\x88\x79\x24\xdf\x7d\x42\x46" + "\xb4\x0f\x3e\xc7\xb3\xe0\x76\x8c\x81\x91\x6a\x26\xfc\x9d\x86\xbe" + "\x77\x44\xfb\x19\xfa\xf2\x47\x77\xd0\xed\x9f\xd6\x41\xde\x83\xb8" + "\x57\x98\xdb\xb2\x1f\xa9\xc5\xbe\x0e\xf6\xf1\x47\x93\xc4\xff\x55" + "\x7d\x79\x33\xa2\x49\xfa\x75\xa2\x61\xeb\xdd\x2f\xf9\x80\xec\xfd" + "\x87\x1e\xe3\x69\x38\x95\xf9\x08\x96\x97\x8b\x3e\x01\xe3\x88\x0a" + "\xe4\xf2\x44\xa8\x37\xc6\xc2\x39\x8f\x73\xe8\x22\x6d\xe6\x01\x9f" + "\xf6\xef\xe0\x7e\x1f\x0f\xe4\x01\xf6\xd3\x37\x82\x3d\xb0\x91\xa8" + "\x36\xda\x49\x30\xb6\x13\xf8\xd6\x8a\xfb\xdd\x71\xec\x86\xb4\x11" + "\x79\x78\x08\xda\x52\xb9\x51\x4f\x9b\x37\xb6\xd1\xd6\x1a\x7d\x03" + "\x01\x3d\x33\xb9\xd6\x50\x87\xfe\xe7\xcf\x63\x5b\x71\xee\x0f\x68" + "\x7a\xc8\x8c\xdf\xd8\x56\x53\x89\xe7\xa1\xd8\x3c\x81\xbc\x32\x48" + "\x3a\x3b\x56\xca\xce\x97\xfd\xa3\x2f\xfe\x19\xd4\xa5\x52\xac\x4b" + "\x95\x80\xff\xa7\xb0\x33\xa8\x7e\x38\xfe\xc1\x39\x8d\x15\xeb\xcb" + "\xfb\xce\xce\xf0\xb9\x81\x7f\x54\x39\xf9\x5e\x63\xef\xe2\x1c\x01" + "\xbe\x1b\x69\xa3\x5d\x3b\xc4\xbc\xf8\x6e\xe4\xfa\x15\x14\xdf\x85" + "\x77\x6c\x7d\xef\xb8\x9c\xe3\x3a\xca\xed\x0a\xa0\x2d\xfe\x6f\x01" + "\x5a\x8a\x7b\xdb\xb4\x7c\x5f\xc2\x47\x61\xd2\x5e\x00\xe8\x3f\x6d" + "\x88\xa7\xc1\x7d\xc6\x7f\xb4\xcc\xd5\x0f\x56\x55\x08\xfa\xe8\x82" + "\xf4\x64\xc9\x5f\x15\xfc\x9f\x09\x65\xf0\xfd\x95\x4e\x7e\xe8\xf2" + "\x9d\x7c\x5a\x66\x58\xe8\x97\x88\x13\x90\x2b\x3e\xc0\xcb\x6a\xba" + "\xed\xa4\x82\x9f\x85\xab\x9a\x8e\xf5\x6c\x22\x1f\xa1\x8c\x0b\xe4" + "\xfe\x32\x3e\x3a\x2b\xca\x8f\x86\x48\xbb\x2d\xd0\x0c\xdf\xc4\x73" + "\x5d\x8e\xfb\x8f\xea\x41\x9e\xa8\xe1\x5d\x7f\xee\xf3\xf1\xa3\x6a" + "\xd7\xfc\xec\x79\x66\xbf\xfb\x88\x7e\xf7\xda\x4e\xe8\x37\xee\xf6" + "\x3c\xe4\x4d\x63\xf3\x87\xb6\x80\x4d\xc4\x90\x71\x91\xf8\x00\x56" + "\x2e\x60\xdd\x6a\x5b\xdb\xb0\x4d\x81\x34\x2b\x94\xe0\x3c\x28\xb3" + "\x2d\x41\xa7\x37\xcd\x84\x3c\x17\xc9\x14\xdc\x8f\x8f\xf1\x70\x20" + "\xff\x25\xee\xab\xfe\xd8\x7b\xcb\x5e\xf4\x23\xc2\x6f\xa3\x27\x52" + "\xf9\xd3\x4a\x5c\x73\x7d\xbb\xc7\xec\x8b\xeb\x8f\xe9\xaf\x03\x26" + "\xed\x64\x0a\x60\xac\x19\x63\x0f\xc2\x3b\x6d\xff\xb7\xa7\xd5\xd7" + "\x64\xfb\x8c\x18\x7e\x47\xe4\x97\xc8\xb1\x0a\x45\x1a\x51\xec\x68" + "\x21\x6a\xe0\xab\xed\x88\x2d\x9c\x48\xfe\x2e\x8a\x27\xf3\xb3\xfa" + "\xc5\x20\x5f\xd7\x69\xa8\xb5\x3b\xeb\x98\x02\xc6\x5e\xd1\xd2\x18" + "\x3b\x97\xc7\xbc\x51\xc0\xf7\x5f\x90\x8b\xbe\x3d\x38\x6d\x8f\x3d" + "\xca\xcf\xd2\x05\xfd\x16\xde\x09\x77\xd8\xdf\xc7\xc4\x73\x68\x27" + "\x75\x5c\xf6\x1d\xab\x3c\x02\xa3\xe0\x2d\x7c\xef\x48\x10\xe4\x8d" + "\xed\xdb\x3b\xc2\xe6\xad\x8e\x55\x02\x0f\x75\xdc\x36\x3f\xa9\x5b" + "\x61\x57\x8a\x7d\x10\xd3\x0f\x85\xe3\xbb\xf0\x5e\x60\x27\x9b\x63" + "\x3a\x56\xee\xc0\xda\x31\x8c\xb9\x27\x83\x36\xa9\x80\xaf\x8d\xd8" + "\x2e\xa4\x09\xe4\x83\xfa\x57\x99\x8f\xec\x76\xe3\xfb\x57\x79\xa8" + "\xd5\x86\x73\x20\x39\x42\x2b\xe0\xe9\x32\xf0\xe0\x7b\xe8\xdf\xcb" + "\x04\xdf\xa9\x29\xed\x21\x35\x9a\x0e\x52\x0b\xff\xe3\x1e\x71\xe3" + "\xef\xbe\x24\xcd\xda\xc1\xf5\x0d\xe8\x2c\x3d\xd4\x39\x15\xcb\x42" + "\x59\x80\xfb\xea\x4c\x69\xa0\x7f\x2c\x50\x16\x8c\x40\xb0\x8c\x1a" + "\xa1\x95\xd4\xa4\xc2\x38\x2b\x37\xd8\x52\x5b\xfa\x19\xa9\xd5\x9c" + "\x64\xdf\x41\x9b\xd0\x98\xd4\x31\x54\xd9\x39\x50\x76\x91\x58\x76" + "\x1b\x94\x1d\xe4\xb6\xec\x1c\x41\x3d\xc2\xb2\x3d\xaf\x77\x8e\x40" + "\x46\x52\x36\xd8\xbb\x6d\x18\xd3\x08\xcf\xdb\xa5\x4f\x25\xfe\xf6" + "\x6b\xe8\xdb\xf5\x6e\xca\xf7\x29\x7f\xf2\x3a\x3b\x93\x87\x6b\xe8" + "\xdb\xaa\x5b\xd9\xd9\xbc\x2b\x84\xed\x35\xe5\xe7\xf1\x2e\x10\xdc" + "\xa7\xd2\x9d\xf5\xc9\x16\xc7\x58\xa9\x6f\xfd\x10\x6c\xd5\x4f\x2a" + "\xf8\x7e\xd4\x6a\x71\x3d\xe2\x93\x67\xb1\xac\xc1\xeb\x51\x2b\xee" + "\x6b\xfe\xa4\x6f\xcf\x5d\xc7\x84\x5a\xad\x58\x96\xb6\xff\xbc\x9e" + "\x14\x7c\x38\x2e\x35\x59\x8a\x63\x9c\x2c\x1e\x31\x7e\x3a\x6e\x55" + "\x5c\x7c\x4a\x5c\xac\x76\xc9\x8b\x49\x6b\xe6\xac\x5d\xbd\x5a\xbb" + "\x28\x6e\xdd\xba\x95\xbf\x8d\xf3\x23\x4b\x92\x56\xae\x59\x17\x8f" + "\x73\x6f\x5a\xed\xfc\x1f\xaf\xd0\xaf\x4d\x9e\xf3\xb3\xf9\xa1\xfd" + "\xe6\xde\xf0\x3c\x6a\x23\xda\xe0\xa0\x3b\xa6\xa4\xdb\xc9\x24\xf4" + "\xd5\x14\xb8\x9e\x1a\x5f\x86\xf1\x1f\xe0\xef\x12\xea\x29\xd4\x0d" + "\x38\x36\x40\x3f\x91\x20\xbf\xab\xdf\x7c\x8d\xd6\xb5\x90\x2f\x7e" + "\x03\x76\x65\x43\x19\xf7\x79\xd8\x08\x63\x72\x0b\x5f\x1b\xfc\x62" + "\x2e\xfa\x33\x7c\x05\xd2\x2c\x13\x4e\xea\x76\x7c\x41\x14\xa0\xd7" + "\x60\x5c\x52\xdd\x49\xe5\xe3\x69\xee\x14\x5a\x49\xbf\xd4\x10\xd1" + "\x4f\xbc\xdc\x64\xb6\xe2\x3e\x0b\x65\xa4\x2d\x83\xa2\x3c\xe5\x7d" + "\xab\xba\x8b\xd3\xc5\x98\xc3\xf7\x7b\x7f\x71\x07\x8e\x61\x36\xb3" + "\xd8\xa7\x35\xd0\x7f\xfe\x56\xed\x90\xd3\x9f\x6a\x45\xdb\xb1\x01" + "\xe8\xfe\x52\x13\xdc\x73\x5f\x32\x35\xa1\xae\x7b\x68\x4c\xa0\x97" + "\x3f\x9b\xcf\x2f\x7c\xe7\xb3\x58\x7e\xe1\xff\xce\xd7\x59\x2b\xbf" + "\xfa\xa7\x8f\xf6\x92\xbe\xef\x75\x19\x0d\xc3\x5c\x1e\x7c\x9f\xb5" + "\xfb\x5b\x6c\xff\xa8\xca\x30\x0f\x75\x21\xde\x00\x5b\x8d\xaf\x7c" + "\x41\x94\x80\xcf\xc2\xbc\xe7\x00\xd3\x67\x89\x26\xcd\x46\x9b\x33" + "\x9e\x25\xc1\xe9\x17\x09\xc6\x9e\x6c\x4d\x4e\xa5\xcd\xe9\xd7\xd0" + "\x26\xfd\xf4\xcf\x80\xdf\x83\xf9\x4d\x44\x95\xd7\x44\xd4\xb5\xc9" + "\x18\x97\x1a\xfd\xb9\x41\x4d\xdb\xe0\x82\xfb\xea\x14\x2b\xf9\xc4" + "\x72\x15\xf7\x9d\x19\x6b\x63\x40\xee\x34\x12\x82\xf8\x55\xc5\x90" + "\xa0\xe2\x29\xf4\x10\xcd\x32\x2c\xa3\x72\xc3\x42\x48\xab\x7f\x57" + "\x88\xf0\x7d\x77\x43\x95\xaf\xf6\x39\xd4\xf1\xa6\xf7\x44\x6c\xde" + "\xc3\xcf\x7a\x7d\x7a\x0f\x62\x10\xfa\x49\x3d\x9f\x57\xff\xb4\x84" + "\xeb\xf3\x4f\xd9\x38\x88\xfb\x6a\xfe\x94\xd9\x8a\xd0\x8e\x83\x18" + "\xab\x17\xcb\x7c\x47\x38\xc8\x62\xf5\xbe\xbb\x21\xc2\x37\x6d\x25" + "\x91\xd7\x9a\x61\x64\x02\x72\x10\xd7\x63\xa1\xdf\xed\x83\x7e\xb6" + "\xbf\x64\x0a\x2d\x80\xfa\xe5\x96\x4e\xa1\x39\x50\xa7\x8a\xee\xac" + "\xba\x99\x66\xf2\xb1\x46\x5c\x77\x31\x42\xbf\xd8\x97\x07\x79\x22" + "\x5f\x24\x77\xe7\x41\xbe\x7c\xc8\x87\x76\x32\xaf\xdf\xc9\x8b\x40" + "\x83\x03\xf0\xcd\x3a\xed\x72\xbc\x3f\xce\xce\x00\xe2\xb7\xa1\x1d" + "\xda\x26\x72\x3c\x19\x74\x9b\x02\xbf\x21\x7d\x17\xca\x07\xf9\xf7" + "\x31\x9b\x27\xc5\x72\x79\x39\x75\xfc\xbc\x46\x4e\x4d\xc2\x0e\x47" + "\x2c\xe5\x84\xbc\x0d\xa0\xd3\x7b\x98\x9f\xd3\x42\x9c\x6f\x41\x1b" + "\x83\xd9\x15\x76\x12\xc8\xe7\x07\xc0\xb6\xd0\x83\x1c\x00\x7b\x82" + "\xed\x51\x07\x5b\x02\xea\x52\x88\x31\x3d\xf1\x39\x8c\xdb\x0e\x80" + "\x5e\xc6\x33\xaa\xca\xe5\x5d\x4f\xe1\xba\x2b\xc1\x78\xbc\xeb\x96" + "\x51\x2b\x8f\x8b\x74\x5c\x2d\xd9\x02\x28\x83\x50\xff\x83\x2d\xac" + "\xe8\x05\x1e\x02\x06\xaa\xc0\xb6\x98\x74\x89\x1c\x5f\x28\xd2\xbe" + "\x8a\xe9\xfc\x14\xe6\x97\xdb\x87\xcb\xe8\xe3\xbf\x81\xf6\xa9\xe0" + "\x1b\x60\x8f\x7e\xc1\xe6\xc2\xb9\x8c\x39\xae\x97\xf4\x38\x8e\x79" + "\xcd\x50\x06\x05\x59\x26\x3e\x83\xf6\x57\x49\x67\xee\x1b\xe1\x99" + "\x46\xa4\x59\x35\xd0\x0c\xcb\x64\x63\x7f\xb0\xb9\x74\x9c\x36\xc7" + "\x67\xa2\x5d\x21\xbe\x6b\x94\xca\xc5\x71\xb9\x00\x76\x05\xd2\x0b" + "\xe9\x04\xe5\xcc\x14\xe5\x58\x3d\xb7\x5f\x4e\xb2\x3d\x13\x48\x7b" + "\xe0\xf5\x16\x07\xfd\x4f\x28\x9c\xe9\x0f\xef\x6f\x11\x79\xb9\xd1" + "\x89\x77\x30\x36\x3a\xb9\x04\xe7\x49\xa1\x8e\x87\xf8\x1c\xcf\x89" + "\x47\xd0\x1f\x1e\xfa\xdf\x06\x1a\x1f\xca\x45\x5f\xcf\x20\x9b\x37" + "\x7f\x01\x32\xf7\x39\xb4\x9f\x4e\x3e\xc2\xed\xd3\x13\x8d\x88\xe1" + "\x16\x72\x82\xcd\xc3\x37\x43\xbd\xb0\x3c\xb8\x7f\x1b\x7e\xc1\x8e" + "\x3d\xf1\x47\xe7\xd8\xd9\x8e\xb8\xd9\x27\x8a\x1d\xe7\x44\x8e\xb3" + "\x79\x69\xfc\xc5\x39\x30\x96\xbf\x57\x8f\x75\x6b\xc4\x7e\x29\xb5" + "\x15\x63\x68\x43\x3a\xda\xfe\x8d\xc8\x37\x29\x1d\xfd\x44\x03\x9f" + "\x54\x50\xa7\xb9\xbc\x4e\x27\xd5\x3c\xce\xe0\x89\x4c\xbc\xc7\x78" + "\xda\x3b\xf0\x9d\x74\xc7\x3b\xd8\x6f\x00\xc3\x81\xf0\xce\x1c\xf8" + "\xa5\x52\x5e\x1e\x67\xfb\xc4\x81\x57\x7b\x70\x0e\xec\x44\xb5\x14" + "\x67\x1b\x63\x6c\xa3\xcc\xc8\x5b\xee\x42\x7b\xa4\xcd\x3e\xe0\x15" + "\xc3\xdd\x11\xdb\x41\xa0\xf7\x49\xb0\xff\x0f\x89\x67\xa1\x4e\x1c" + "\x10\xeb\x67\xe4\x3e\x72\x3e\x69\x63\x3e\x9d\xd9\x78\xe8\x64\xb1" + "\x63\xcf\x8a\x64\x5b\x9e\x60\xfe\xb7\xa0\xac\x6a\xe4\x3f\xda\x89" + "\x90\xaf\xb2\x0f\x5b\xec\x1c\xf6\xc9\xf9\x68\x5f\x8a\xf5\x47\xbc" + "\xcc\x12\x69\xd7\xe6\xdc\xef\x9c\xfb\x79\x77\x56\x3d\x8c\xff\x8f" + "\xf5\x61\x40\xea\xd7\x1c\x07\xa7\x1e\xe1\x7d\x51\x68\x45\x3f\xcd" + "\x50\xae\x11\x6d\x70\xae\x57\x4f\xa9\x8f\x34\xb2\x3d\x0d\xf5\x70" + "\x0f\xfd\xbb\xbe\xad\xc3\xef\xd3\x86\x2d\x4c\x6e\xd4\xc3\xf8\x27" + "\x94\xf1\x0f\xe9\x22\xf5\xd7\x1d\xcb\x71\xec\x17\xca\xfb\x6c\x6a" + "\x33\xa9\xb5\xb6\x11\xf1\x0c\x06\xf4\xd9\x0b\xb8\x76\x7a\x09\x30" + "\xa4\xc4\xfe\x0b\xfc\xdd\x87\x3e\xc5\x81\x8e\x75\x5b\x5e\x63\xfd" + "\x56\x85\xfd\xb6\x17\xfd\x84\xc0\x77\x2a\x63\x22\xc8\x91\x54\x23" + "\xeb\xc7\xe8\x23\xe6\x4d\xa0\x1d\xc6\xb4\x86\x6f\x37\x48\x7b\xc7" + "\x11\x23\xe8\x13\x46\xc4\x89\x16\xfb\xb2\x48\x3b\x45\x77\xd6\x29" + "\x22\xf5\x3d\x27\xfe\xb3\x3c\xfd\xfa\x5b\x20\xef\x6f\xa7\x42\x25" + "\x5a\xdb\x58\x3f\x3e\x51\x6d\x83\x7e\xec\x4c\x53\xa4\x27\xd2\x15" + "\xf2\x42\xfb\x3f\x4e\x96\x68\xea\x44\xcf\x1a\x91\xe7\x75\x7c\x8e" + "\xe9\x14\xf7\x83\xed\x44\x43\x11\x7f\x18\x8b\xf8\xe0\x66\x6c\x3b" + "\xe8\x06\xfc\x3e\x62\xe4\x4d\x51\x66\x55\x5a\x10\x23\xa7\xa0\xff" + "\xff\xba\xc8\x21\x3b\x4e\xd4\xb1\x31\x0b\xf0\x49\xe4\xcf\x75\xe6" + "\x53\x65\x10\xd9\x01\x38\x39\xe8\x90\x4f\x9f\x2a\x25\x3a\x48\x98" + "\x94\xfa\x3d\xe8\x91\xa5\xae\xf2\xe7\xd3\x9f\x40\x19\x93\x51\xbe" + "\x39\x6c\xa8\x4f\x17\xb8\xca\xb7\x4f\x43\x51\xbe\x21\xae\x0d\x29" + "\x38\xc7\xc6\xf5\x95\x99\x98\x1a\x5c\x65\x92\xa9\x86\xef\x0d\xe0" + "\x36\x17\x62\xcb\xb0\x9c\xe7\x47\x1d\x06\xf9\xd9\x58\x5c\xd4\x79" + "\x5a\xd4\x71\x90\x56\x29\xd2\xab\x11\xf2\x57\xe2\x79\x56\xf4\x61" + "\x31\xb1\x91\x8f\xf5\x40\x4e\x1f\x42\x1f\xed\x90\x6f\x4b\x2d\xd8" + "\xf9\xbd\xd9\x5c\x76\x4b\xb2\x82\xae\x8a\x9e\xf8\x52\x2b\x99\x60" + "\xf8\x19\xfd\xb2\x85\x9c\x8e\x83\x3e\x63\x45\x3f\xa1\x50\xb6\xb6" + "\x85\x7c\x36\x07\xbe\x1b\x24\xfe\x6a\xe0\xf7\x0e\xf8\x9d\xda\x42" + "\xce\xd8\xe1\xf7\x2e\xf8\xbd\x00\xf9\x05\x31\x7f\x28\xdc\xd7\x40" + "\xfa\x8f\xc5\x5f\xa8\xe3\xe9\x65\xf0\x1b\x25\xda\x8e\x98\xbe\x13" + "\xef\xe1\xf7\xf7\x22\xcf\xab\x39\xcf\x4f\x6f\x83\x72\x52\xa1\xfe" + "\x0d\xa6\x46\x56\x96\x01\xf2\xfc\x0a\xcb\xc6\xf3\xe5\xf0\xbf\x2f" + "\x71\xd8\xa0\x50\x4e\xc3\x43\xf0\x1b\x06\xef\x75\xc1\x6f\x32\xfc" + "\x1e\x13\x69\x50\x87\xb2\x21\x36\x15\x69\x7b\xaa\x59\xcb\xed\xdd" + "\x28\xa9\xcf\xa3\x1e\x76\xc8\x8e\xe3\x33\x63\x97\x71\x7e\x43\x5e" + "\x86\x03\xc8\xfb\x28\xe6\x85\xdf\xc7\xc5\xdf\x08\xf1\xf7\x09\xf1" + "\xf7\x17\xe2\xef\x7c\xf1\x17\xf8\x7c\xba\x5a\xb4\x31\x80\x2e\xa7" + "\x59\xbc\x03\x90\xdd\x33\xf9\x37\x1a\xda\x70\x8c\x0c\x72\x7c\x2e" + "\x94\xef\xd3\x9d\xd5\x10\x23\xcd\x8f\xe2\x9c\x4f\x6f\x56\xf5\xf8" + "\x37\xd9\xba\x76\x43\xaa\x43\xb6\x9d\xb0\xaa\x64\x11\x04\x6c\xa0" + "\x3b\x8a\xe5\xa0\xff\x79\x39\x75\x72\x71\x5d\x58\x8c\xff\xe0\x83" + "\x3e\x11\xd9\x78\xc8\x7f\x4a\x34\xf6\x55\x36\x77\x8c\xfe\xfb\x26" + "\x9c\xb0\x01\xd6\x94\x30\x36\x50\x49\xf2\x1b\xc7\x3d\x7c\xac\x8e" + "\xfe\x7f\x1b\x9a\x1d\x63\xf5\x06\x36\xe7\xed\xa3\xb9\xf3\x05\x48" + "\xb7\x39\xa5\x47\x61\x9d\x81\x9e\x0d\xd0\x9e\xb0\x26\x72\x66\x26" + "\xfc\xfe\xa8\x99\xb7\x39\x54\x6a\xb3\xc8\x0f\x83\x44\xdf\x66\x72" + "\xba\x1e\x64\x61\x12\x62\xb8\xa9\x4f\xce\x9e\x66\xf3\xba\x22\x46" + "\x80\x97\xa7\xf3\x90\xa7\x4e\x7d\xd0\x59\x06\x05\x75\x67\x9d\xd9" + "\xe2\x2a\x53\x8e\x6f\x41\x99\x82\xd8\x00\xf9\x8d\xbc\x8e\xed\xd7" + "\xff\x70\xae\x7f\x32\xef\x77\x67\x8c\xae\xef\x7e\x1a\x6a\xe3\xfd" + "\xae\x01\x70\x06\xf8\x3c\x3d\x1f\xf9\x63\x26\x67\xca\xc5\x3e\xdd" + "\x00\x7d\x7a\x2e\xa4\x87\xf0\xba\xf2\x74\xf1\x5b\x80\xb3\xd3\xd8" + "\xee\xbb\xa4\x74\xb1\xbd\x58\x4e\x30\xf2\x5b\x4a\x17\xcb\x47\x3c" + "\x22\x86\x34\x52\xba\xd8\x26\xb0\xa3\x3e\x8b\x96\xe4\x49\x2e\xc3" + "\x5b\xbd\x59\x7a\x0f\xf9\x86\x3e\xd0\xf8\x1c\xff\x67\xf3\xa1\xaf" + "\x96\xa3\x7e\xd8\xbc\x9c\xa8\x5e\x2a\x22\xfe\xbc\x5f\x7e\x36\xdf" + "\x55\x46\x9e\x9d\x45\xb3\x02\x6d\x54\x79\xa2\xb3\xc6\x16\x26\xd9" + "\xab\xc5\xf0\x1d\xa3\x14\xd3\xdd\x11\x4b\xe2\xb3\xae\x9a\xf2\x3e" + "\xfa\x62\x5d\x9a\xa5\xba\x38\xe9\x67\xc6\x03\xac\x1b\x96\xb5\x19" + "\xec\xf5\x4e\x90\x0b\x5c\x6e\x7f\x1e\x64\x26\x13\x0f\x49\x32\x15" + "\xf5\x56\xa0\x8c\x18\xf2\x53\xd8\xfa\x68\x20\xea\x46\xdc\xe3\x23" + "\xe0\x3c\x56\xaa\x9d\xd4\x1a\x60\x2c\x9f\x7a\x81\xac\x58\xef\x87" + "\x3e\x71\xa2\xa1\xae\x13\xa0\x6e\xbb\xed\x38\xf7\xbf\x06\xc7\xa9" + "\x8d\x1f\xda\x53\xa8\x55\xa4\x19\xf4\xa3\xc6\x9d\x22\x6d\x51\x7e" + "\xed\x46\x99\xbe\x39\x9d\xc7\x85\xc2\xb9\x1c\xec\x1f\xaf\xa2\x1e" + "\xd3\x50\x6b\x65\x31\xf6\x95\xcf\x77\x4b\x36\x29\xd4\xb7\x9c\xdb" + "\x84\xa7\x58\xac\x19\xe8\x3b\x9d\x7c\x2e\xb0\xf1\x21\xde\xf6\x46" + "\x0d\x5f\xe7\x3e\x21\xfa\x75\x6c\x54\xf8\x68\xa6\x9c\xe6\xfb\xb2" + "\xaa\xef\xe5\x7b\x4a\x3e\xef\xec\xdb\x53\xe2\xb0\x15\x83\xb9\x6f" + "\xb0\x46\x27\xff\xa7\x9f\x9b\xf1\x3d\x78\xff\x12\xa4\xeb\x1c\xe9" + "\x78\xac\x80\xf9\xed\xb5\x06\x6c\x8a\xc0\xbd\x65\x77\xa0\x3f\x75" + "\xf1\x7b\x39\xec\xfb\x6c\xce\x03\xfa\xa6\xd8\x7f\x91\xce\xa8\xb3" + "\x59\x1f\x86\xfe\x8b\xfd\xb8\x77\xdb\x09\x5b\xef\x36\xb1\xdf\x72" + "\xdd\x1c\xcc\xfa\x2d\xeb\xb3\x8d\x45\x8e\xef\x35\x46\xb1\x79\x2f" + "\xe4\xe7\xcb\x1a\x15\x3c\x3b\x60\x26\x9f\x84\x88\x75\x64\x7e\x68" + "\xd0\xef\x8b\xed\x1a\xb5\xe0\xda\x36\xae\x75\xe2\xd9\xb9\x40\x40" + "\x37\xfa\x6a\x91\xd6\xaa\x17\xb5\x65\x50\x3b\xae\x3b\x5d\xa3\x9d" + "\x05\x7d\xf1\x1c\xce\x12\x87\xdf\xa5\xcf\x63\xc4\x76\xa1\xbf\xd0" + "\x62\xbe\x17\xec\xf3\x5f\x71\x9b\xea\xf3\x28\xc4\xa9\x09\xb0\x07" + "\xbf\x45\x3c\x06\xf7\xd9\x79\x12\xf6\xa0\x5f\xc6\x02\xdf\x6b\x0a" + "\xa7\xd0\x22\xe0\x69\x11\xf4\xa5\x04\xb8\x7f\x1f\x7e\x63\xf9\xaf" + "\x4c\x8d\xbf\x62\x1f\x29\x82\x77\x53\x01\x63\x31\x52\xff\xe8\x9c" + "\x20\xc4\x20\xce\xf2\x81\x0e\x88\x35\xb6\x8e\x0c\xf5\x46\x7c\x21" + "\xce\x10\x63\x81\x9b\x9e\x62\x38\x63\x7e\x21\x20\x1d\xeb\x8b\x38" + "\x83\xb2\x2a\x25\x5f\xce\x66\x72\x96\x9d\x6f\x84\xb4\x06\x69\x8f" + "\x2e\xae\x25\x25\xdf\x43\xee\x80\x72\xb5\x95\x5a\xe6\x2f\xf5\x9c" + "\xc9\xf6\x04\xc1\xbc\xb8\x0e\xc7\xe5\xe4\x9d\x95\xdd\x59\x5f\xa8" + "\x1c\x34\x3f\xce\xce\x96\x1c\x59\xc6\xe6\x22\xbf\x07\xcf\x74\xce" + "\xe3\x0c\x33\xa9\xee\xc4\xb1\x06\xee\xed\xbb\x2f\x88\x68\x01\xb7" + "\x20\xc7\xbe\x58\x28\xd9\xb5\x0f\x06\xe1\x7a\x7e\x75\x39\xd4\x0f" + "\xc7\xd0\x75\xf0\x7f\x2e\x8c\x25\xab\xdc\xcc\x19\x87\xe1\x5c\x8f" + "\x18\x83\xa9\x11\xe7\xb1\x30\x66\x45\x0b\x39\x5f\x53\x83\x3e\x5a" + "\xd6\x0e\xf4\xe5\x9d\x9e\x4a\xbb\xd0\x9f\xb7\x36\x89\x7c\xaf\x89" + "\x9c\x47\x1f\xd3\x0d\x19\x57\x71\x8e\xe6\x8b\x7a\xd7\x39\x9a\x73" + "\x33\xc5\x2b\x1c\xae\x62\xc7\x65\x0e\x11\xff\xaf\x18\xfa\x32\xcf" + "\xe7\x79\xcd\x51\x70\x2d\xe3\xb4\xd2\x40\x3f\x39\xd7\x37\xff\x8b" + "\xb8\xc4\xbe\x8d\xfb\x38\x70\xce\x49\x66\x23\xe8\x13\x06\xf8\x04" + "\xf5\xde\x3c\xfb\x69\xe3\x06\xc4\xd1\xb9\x78\x36\x76\x90\x8f\xf4" + "\xec\xea\x39\xc6\x4f\xee\xf3\xf5\x5c\x08\x7c\x3b\x68\xc7\x15\xa2" + "\x30\x24\x91\xe9\x38\xff\x1d\x68\xa7\x46\x1c\xe3\x8a\x7e\x23\xeb" + "\x2e\x11\xf3\x9c\xe4\x8d\x44\x0e\xcf\xef\x86\xff\x83\x25\x3b\x09" + "\xde\x51\xfb\x58\x49\x10\xda\x47\x8f\x6f\x24\x77\x43\xfd\xad\x12" + "\xaf\xd0\x86\xc0\x79\x38\x71\x2e\x01\xeb\xfa\x13\x7c\x0f\x63\x11" + "\x98\x19\xdd\x98\x1c\xc6\x32\x00\x1f\xe7\x9a\x7d\x3a\x89\x9a\xeb" + "\x1e\x33\xe0\xbf\x5a\xb4\x19\xcd\x18\x8b\xbb\xde\xa9\x9e\xff\xe6" + "\xf4\x7f\x36\xbe\x1f\xd8\x89\xf6\x99\x3b\xfa\x98\xb7\x49\xf4\xc1" + "\xfd\xaa\x81\x30\x4e\x60\xfc\xb6\xd1\x36\xa8\x5b\xb5\x61\x03\x51" + "\x5e\x22\xe7\xd7\x97\xbd\xc6\xce\x3f\x56\xf1\xf9\xf9\xf3\x89\xd2" + "\x38\x9c\xd7\xfb\xfc\x4f\x02\x37\xf9\x10\x9c\x57\x47\x9f\x76\x6c" + "\xaf\xdf\x37\x1a\x36\x97\x6e\xb2\xcd\x23\xc6\xf4\x9f\x62\x1e\xc9" + "\xae\x6a\xec\xc8\xd0\x90\x23\x9a\x79\xd0\x8f\xcf\x2b\xcc\xb2\x2a" + "\xcd\xc8\xf7\x54\x9e\x57\x88\xf4\xad\xe6\x7b\x11\xcc\xa7\x50\x97" + "\xe0\xd8\x1f\xf4\x48\x25\xea\x68\x28\x3b\x46\xea\x37\xa0\x37\xa0" + "\x9f\x9a\x79\x2c\x9b\x1c\x5c\xff\x35\xd7\xa1\x6f\x0e\x36\x6e\xe0" + "\xf9\x55\x7c\xce\xff\x7c\x61\x9f\x2d\x0d\xf9\xf0\x3d\xbe\x47\xcd" + "\x5c\xb1\xc2\x2e\x03\x9a\x9a\x2b\xb0\x6d\x22\x16\x41\x5f\x9d\xaf" + "\x74\xf4\x5b\x33\xc3\xfd\x91\x36\xe7\x7e\x79\xbe\xd9\x31\xde\xfc" + "\xa2\x68\x4e\x21\xd1\x0e\xd6\x0f\x0d\x01\xa8\xab\x9a\x96\xee\xd8" + "\x41\xcb\x0b\xe4\xc2\x63\x9b\xf3\x89\x4a\x96\x0b\x64\xc3\x7e\x96" + "\x12\x73\x47\x0b\x69\x8a\x0b\x54\xdd\x19\xf5\x78\xf2\x78\x9a\xae" + "\x21\xf2\xbc\xf6\xf1\xca\x7b\xac\x77\x96\x53\x9f\xd9\x4f\x2f\x4a" + "\xb6\x12\xed\xef\x0a\xc8\x57\x09\xc4\xe7\x71\x3b\x7c\x5b\x45\x0c" + "\x66\xd2\x6c\xc0\x95\xe7\x23\x2a\xb4\x3f\x9a\x0d\x58\x66\x5a\x31" + "\x51\xa6\x35\xd3\xd6\xdc\xd5\xbe\x4a\xd0\x07\xea\x37\x01\x63\x13" + "\x55\x77\x96\xf7\x42\x19\x87\x63\xd8\x7b\x83\x9e\x59\x17\xeb\x76" + "\x75\xf0\xba\x19\xa6\xb4\x90\x2f\x65\x23\xab\x5b\x8b\xda\x51\xb7" + "\x16\xf5\xe8\xeb\xf6\x65\x9e\x53\xdd\xd4\x8e\xba\xe9\xb1\x6e\x25" + "\x23\xab\xdb\x57\xfb\x1d\x75\xfb\x6a\xbf\x87\x75\xdb\xe7\xbe\x6e" + "\xcd\xf7\x0f\x5e\xb7\xd4\x3b\x5b\x48\xf3\x4f\x46\x56\xb7\x8b\x51" + "\x8e\xba\x5d\x8c\x1a\x4d\xdd\x70\x2c\x9f\x1e\x4c\x2f\xb0\x98\x01" + "\x49\xdc\x27\x6f\x0b\xb9\xf0\x7a\x7a\x31\xbb\x9f\x0c\xff\x2f\x15" + "\xfb\xb7\x25\xa3\x93\x7e\xc9\xed\x9c\xe6\xc3\x0f\x18\x70\xbf\x6b" + "\xf3\x41\xc0\xb2\x81\x63\xfa\x02\xdb\xdf\x90\x61\xa1\xe2\x7e\xd3" + "\xe6\xf3\xa5\x6c\x3f\xca\xe9\x4c\x7e\x7f\x61\x66\x87\xdf\xc9\x50" + "\xdc\x0b\x22\x40\x7f\xa6\x7e\x27\xe7\x61\x8c\xd6\x77\x93\x2c\x72" + "\x9a\x85\x3e\xdd\xd0\x0f\xa3\x82\xd0\xed\x27\x17\xbe\x9b\x64\x65" + "\xf1\xe1\x37\xb3\x73\xd8\x17\x82\xa5\xb3\x87\xd2\x37\x2c\x13\x4e" + "\x67\x42\x7a\x98\x14\xeb\x97\xca\xc1\x9e\x99\x70\x32\x0c\xcb\x87" + "\xf4\x85\x52\xfc\x5d\xc0\xbb\x59\x94\x0d\x9d\x81\xd6\xa1\xe4\xde" + "\x85\x4d\x92\xdc\x7b\x3c\x99\x04\x62\xec\xd1\x1d\xe9\xe3\x71\xcd" + "\xd1\x02\xdf\x54\x23\xdd\x23\x3b\xc7\xd3\xc0\x34\xe2\x83\x67\x2e" + "\x71\x8f\x9e\x49\x63\x21\x33\xd3\x88\x6f\x64\x2a\x94\x69\x25\x31" + "\x81\xa9\x50\x1e\xd0\x9a\x8f\x0d\x2e\xb0\x39\xbe\x42\x28\x0f\xd7" + "\xbf\x7d\x92\x89\xea\x71\x4d\x06\xdd\xfc\x3a\x51\xe0\xf9\x4c\x3c" + "\x67\xc9\xcf\x58\x8e\x53\x42\x7d\x6d\x52\xfb\x3c\xe0\x4f\x00\xe7" + "\xcf\x57\x3f\x71\xf0\xa7\xa5\x6b\x20\x7f\x5a\x56\x72\xfe\xb4\x44" + "\x3b\xf8\xf3\x55\xb1\x2b\x7f\x5a\x36\xb9\xf2\xa7\xa5\xd2\x3b\xfe" + "\xb4\x1c\x72\xf0\x87\x7f\x83\xf3\xa7\xa5\x7e\x70\xfe\xb4\xb4\x39" + "\xf8\xd3\x92\xe9\x19\x7f\xbe\xba\xc7\x3d\x7f\x5a\xf6\x0f\xc1\x9f" + "\x71\x83\xf3\xe7\xab\x17\x3c\xe7\xcf\x57\xc5\x23\xe0\x8f\x3f\xe7" + "\x4f\xeb\x19\x07\x7f\x5a\xff\x30\x90\x3f\xad\x32\xce\x9f\xaf\xac" + "\x0e\xfe\x5c\x9c\xe7\xca\x9f\xd6\x7b\x5c\xf9\xd3\x1a\xeb\x1d\x7f" + "\x5a\x97\x39\xf8\xc3\xbf\xc1\xf9\xd3\x9a\x3c\x38\x7f\x5a\x73\x1d" + "\xfc\x69\xd5\x7a\xc6\x9f\xd6\xc3\xee\xf9\xd3\x1a\x35\x72\xfe\x5c" + "\x9c\xd4\x8f\x3f\x6a\xf7\xfc\xb9\x38\x6f\x04\xfc\x09\xe4\xfc\xb9" + "\xb4\xde\xc1\x9f\x4b\x73\x07\xf2\xe7\xe2\x4e\xce\x9f\x8b\x45\x0e" + "\xfe\x5c\x6a\x74\xe5\xcf\xc5\xc3\xae\xfc\xb9\xa4\xf0\x8e\x3f\x17" + "\x6d\x0e\xfe\xf0\x6f\x70\xfe\x5c\x0a\x1a\x9c\x3f\x97\x42\x1c\xfc" + "\xb9\x68\xf4\x8c\x3f\x97\x56\xba\xe7\xcf\x45\xcb\x10\xfc\x19\x3f" + "\x38\x7f\x2e\xfd\xd9\x73\xfe\x5c\x6a\x1c\x8a\x3f\x23\xb3\xf5\x2e" + "\xb1\x58\x35\xa3\x2f\xe7\xeb\x70\x77\xe5\x20\xed\x70\xff\xa1\x90" + "\xf5\x75\x78\xa9\x30\x4e\xc9\xcf\x68\x5c\xb2\x68\x37\x90\x9f\x37" + "\x91\xaf\xb7\x96\x0a\xbe\x4a\x9a\xf5\xd6\x01\x21\xeb\xbf\x97\xd1" + "\x4d\xe3\x14\xc2\xa6\xf1\x0a\x3c\x33\x3f\x58\x59\x7c\x3f\xec\xd7" + "\x17\x7c\xa6\x92\x19\x78\x8e\x6e\x33\xd8\xcb\xf8\x7f\x77\xd6\xd7" + "\x40\xf7\x43\xc5\x43\x9d\xdf\xc2\xbd\x4e\x47\xb6\xe0\xf8\xb6\x2d" + "\xb8\xcf\x5f\x49\x16\x4d\x45\xbf\x6f\x86\x7b\xf1\x9c\x45\xdb\x7c" + "\xf4\xe7\x4e\x73\x6a\x76\x47\xdc\x4b\xcf\xe1\xd8\xa3\x85\x5c\x7e" + "\x94\x6e\xab\xd9\x8d\x78\x00\x5b\xfd\x7b\x90\x27\xb7\x6f\x7f\x1e" + "\x8d\x7e\x43\x9c\x23\x8c\xe2\x79\xaf\xfc\x19\xf2\x46\x61\xac\xd9" + "\x75\xe9\x18\x43\xf5\xca\xeb\x60\xfb\x7e\x1f\xbf\x81\x3e\xad\xca" + "\xe0\x17\xf7\xc9\xf0\xbd\x99\x6d\xdc\x77\xcf\xe6\xbb\xde\xe0\x7b" + "\xe1\xae\x6c\x92\x70\x07\xdf\xf1\x83\xfb\x78\xd1\x9e\xc7\xfc\x13" + "\xe1\xfe\x57\x4e\xcf\x55\x70\x8f\xf3\x90\x93\xc4\xe7\xfe\x70\x3f" + "\x15\xed\x6c\xe6\x7f\x25\x3f\x53\xdc\x43\x7c\xd9\x06\x69\x6a\x31" + "\xcf\xa4\x4b\xe4\xf2\x79\xb4\xdd\xc5\x32\x26\xc3\xfd\x51\x1c\x03" + "\x8b\xcf\x83\xe0\xfe\x2d\x5c\x3b\x10\x9f\xdf\x01\xf7\x79\x70\xff" + "\x03\x7e\xe6\xa5\x57\xec\xa3\x97\xa3\xbd\x3b\xcb\x7f\x99\xf9\x5e" + "\x44\x1e\xf0\xb1\xc0\x65\xa7\xfd\x3f\x97\x23\xfa\x3d\x3b\xe4\xf4" + "\x2c\x54\x7a\xc6\xf7\xa8\x5d\x6e\x70\x7a\xa6\xed\xf7\xac\xd3\xe9" + "\x99\xda\xb5\xcc\x2b\x6a\xa7\x67\xc4\xf5\xbd\x2b\x21\x8e\x67\x6d" + "\x6d\xfd\x9e\x2d\x70\x7a\xd6\x28\x3e\xf3\x81\xf4\x18\xc7\x1a\x5e" + "\x5b\xb5\x98\x2e\x87\xf4\x54\xa7\xf4\x43\x62\x3a\x7e\xbf\xc0\x4c" + "\x8a\xc5\xb1\x0a\xe7\xbd\x58\x7e\x85\x53\xf9\xb9\x7c\x8e\xe3\xca" + "\xa1\xbe\xbd\x73\x7e\x27\x73\x84\xde\xe8\x37\xe0\x59\x32\xe2\xca" + "\x19\xdb\x6b\x52\xb4\xcf\xbd\xf8\x5b\x6d\x52\x5c\x32\x6e\x5f\x49" + "\x8c\x4f\xd6\x26\xae\x8d\x8d\x73\xf1\xa5\x1f\x84\xbe\x20\x31\x6e" + "\x1e\xfa\xd4\x61\x31\x2a\x5e\xa3\xad\x7d\x71\x5d\x40\xae\x76\x67" + "\x7d\xa3\x33\x93\x7f\x0b\xc7\x6f\x15\x72\x9f\xf3\x55\xe8\x93\x87" + "\xfb\xdf\x21\x4f\x35\x91\x6f\xe6\x88\xfe\x77\x8c\x90\x77\x89\x7b" + "\xff\x3b\x57\x43\x99\xdf\x49\xc8\xc7\xfd\xef\x5c\x0d\x83\x7e\xfe" + "\x38\xf5\xe3\x71\x5a\x78\xfc\xba\x6f\x24\xdb\xc4\xb2\xe2\x3a\xf3" + "\xdd\x98\xc9\xe7\x32\xfa\xfb\xd1\xad\xd9\x82\xef\x89\xeb\xa5\x5b" + "\x9c\xde\x37\xf2\xe7\x92\x7e\x10\xbf\x99\x53\x93\x03\xf7\x7e\x4d" + "\x70\xcf\xe6\xef\xd9\x33\x0b\x9f\xcb\xdb\x56\x93\x8b\x6d\xc2\x76" + "\xbb\xb6\x4d\xfe\xef\x4d\xc4\x32\xc1\xd1\x36\x4b\xa8\x93\x8f\x3e" + "\xb1\x0d\x96\x68\xde\x47\x07\xb4\x95\xed\x4f\xa4\xca\x9a\x5c\xfc" + "\x36\xca\x33\x56\xd7\x09\x70\xbf\xad\x26\x47\xaa\x8f\x53\xfd\x72" + "\x71\x5c\x0f\xf5\x9b\xcb\x69\x02\xf2\x03\x78\x2a\xd6\xb3\x8b\x66" + "\x5d\x69\xe0\xf1\x2a\x40\x9f\x60\xdc\x1d\xa6\xab\x2c\x46\x69\x2e" + "\x13\x75\x14\x9f\xc3\xb4\x38\xec\x3f\xf4\x9d\xb6\x4d\xd2\x5f\x16" + "\x27\xfb\x8f\x7f\xb3\x3b\xeb\x2a\x71\xc6\x90\xe3\x7b\x57\xe7\xe0" + "\xf7\xcc\xc4\x52\xc1\xcf\x03\xd4\xe4\x60\x7f\x87\xfb\x04\xdc\x8b" + "\x89\xef\x62\x1d\xdd\xc5\x5a\x74\xe7\xdb\xd2\x41\xc7\xab\xa9\x12" + "\x1d\x0b\x59\x0c\x93\xab\x39\xd2\x7c\x9d\x18\xe7\xc4\x58\xd8\x17" + "\x7b\xfc\xea\x01\x16\xbf\x2f\x77\x5a\xd5\x83\x2a\x12\x23\xd2\xf6" + "\x43\x94\xf1\xd8\x67\xb8\xac\x6f\x0f\x16\x79\x1e\x2d\xd6\xff\x02" + "\xa6\x3b\xf6\xdf\xb7\xcf\x93\xf2\x49\x72\x99\xaf\x57\xb5\xdf\xc1" + "\xf2\xf1\x78\xd0\x31\x9c\xe7\x3f\x50\x37\x91\x76\x9d\x98\xbf\x2f" + "\x76\xaf\x99\xb4\xcf\xa7\xdb\x4e\xc7\x74\x67\xb5\xc3\xf8\xe7\x8a" + "\x85\xd3\x91\x7f\x17\x7e\x75\x58\x17\xa4\x11\x9e\x25\xa7\x79\xd3" + "\xaa\x80\x3f\xd1\x83\x9f\x25\x7d\x46\x3c\xaf\xd3\xc1\x6d\x08\x39" + "\xb5\xe2\x1c\x2b\x6f\x6b\xc7\x61\xa7\xbd\xcf\x2a\x29\x0f\x97\xdd" + "\xec\x19\xdb\x53\x6e\x48\xc1\xf9\x20\xf1\x59\x0a\x9e\xaf\xed\xfb" + "\x7f\x9c\xd3\xff\xbe\xf8\x3f\xdb\xd7\xbc\x81\xe9\x56\x85\xe3\x6c" + "\x7f\x87\x11\xee\x55\xfd\xee\x83\x5c\xee\xd7\xf3\x7d\xcf\x60\x9b" + "\x35\xb3\x3d\xe4\x62\xba\x58\xf6\x04\x56\x9f\x14\x1a\x0e\xd8\x28" + "\xc2\x33\xdd\x62\x3f\x2c\xc2\x33\xdb\x81\xb6\x67\xd9\x79\x6d\x78" + "\x1e\x26\xfe\x86\x8a\xbf\x21\x3c\x16\x6f\x47\xaa\x74\x6e\xbb\x83" + "\xcd\xd1\x74\xe4\x48\xe7\x37\xf1\x8c\x37\x9e\xef\x86\xb6\x86\xe3" + "\x19\x6f\x3c\x0f\x2e\xfe\x86\x8a\xbf\x21\x62\x3c\xe2\x65\xf0\x5e" + "\xdf\xf9\x6f\x77\xfa\x1c\xf2\x34\x4b\xe7\xb9\xed\x39\x35\xf3\x84" + "\x9c\xfa\x08\x8c\xff\x8a\x3e\xdc\x32\xda\xa8\xc0\x63\x86\x77\x12" + "\x13\xe9\x21\xa6\xe4\xee\x4c\xe0\x45\x40\xad\xc1\xc6\xe6\xf0\x6b" + "\xad\x36\x52\x6b\xb8\xcc\x62\xbf\xbe\xd4\x26\xc5\xb6\xe9\x9c\x6f" + "\xdf\x56\x33\x4f\xec\x2f\xaf\xf3\x3d\xfa\x9d\xdc\x17\x11\xce\xb5" + "\xb5\xb1\x75\x2f\x65\x0b\xe9\x8a\x96\xf2\x70\xda\x75\x31\x39\x51" + "\x96\x25\xc5\xf7\xec\x4c\x93\xe2\x89\x9b\x49\xd7\xb2\xae\x09\x67" + "\x1a\x20\xad\xc0\x75\xcf\x74\xe7\x5b\x58\x26\xd6\xdb\x4c\x3a\x17" + "\x62\xd9\x90\xe7\x40\x5f\x9f\x55\x42\x3d\xb2\xc8\xcf\xf9\x39\x94" + "\xae\x68\x1e\x3b\xb6\x13\xfa\x7f\x7b\x8c\xb8\x17\x7c\x3f\xc5\xfd" + "\xd4\xb8\x1f\x1c\x69\xe7\x77\xa2\x3e\xe3\x2a\x09\xea\xe8\x8d\xc6" + "\xfd\xe9\xcd\xec\x3c\xc2\x0b\xe8\x0b\xde\x4a\x16\x1b\x88\x18\x37" + "\xab\xeb\x27\x78\x96\x60\x33\x8b\xe9\x57\x53\xd7\xe1\x77\xa2\xa9" + "\x3b\xab\x0b\xe4\xff\x63\x0e\xdf\x6d\xdb\x4f\xc0\x37\xa0\x7d\x19" + "\x7a\x8c\xcb\x5d\x0d\x79\xa0\x0f\x77\x2d\x94\xf2\xe0\xf3\x6e\x5c" + "\x7b\xa2\x7a\x82\xed\xea\xca\xc3\x7d\xdf\x5d\x09\x66\x79\x79\x08" + "\xdf\xf7\xdd\x05\xfc\xaf\x50\x0e\xc5\x37\xe8\x8f\x05\xd0\x9f\x8b" + "\x84\x9c\xd3\x39\xcc\xcf\xfb\x84\xd3\x05\x7c\x9e\xb3\xeb\x28\xc6" + "\x9e\xdc\x71\x8d\x28\x70\x1f\x06\xef\x37\xd7\x98\x3f\x53\x4c\x03" + "\x7d\x51\x01\xfd\x94\x9d\xad\x1c\x99\xed\xd1\xc5\xe6\x26\xd1\x77" + "\x17\xd2\x11\xcf\x4f\x75\x67\x5d\xd3\xf6\xc5\xe9\xe8\x93\x25\xd7" + "\x9e\xc4\xf5\x0f\xe8\xa3\xac\x8e\xfd\xeb\x80\xf5\x85\xb2\x2a\xdd" + "\xda\xb9\xca\xd3\x7c\x8d\x68\xfb\xc9\x65\x7c\x9f\xec\xb5\xdf\xfb" + "\x68\xee\xba\x06\xdf\xca\xed\x8b\x4f\x02\x79\x90\x67\x02\x94\xdf" + "\xd7\xce\x24\xf6\x8d\x03\x5c\xde\x5c\xab\x12\xb6\x9d\xce\xd9\xd1" + "\x43\x14\x62\x7a\x55\xad\xcd\x8a\x71\x29\xdc\xed\x4b\x57\x32\xff" + "\x5d\xdb\x4f\xa3\xff\xbb\xce\x07\xad\x52\x9d\xbb\xab\xf0\xcc\x0c" + "\xd6\x99\xd3\xb6\xfb\x43\x89\x8e\x79\xed\x50\x76\xfa\x67\xa4\x99" + "\x74\x3f\x81\x7b\xf7\x18\x4d\x36\x48\xfb\x49\xbb\xb9\x5c\xec\xe9" + "\xcb\xc3\x6c\x2c\x16\x2f\x0b\xca\x2f\x65\x31\xff\xa0\x0d\xc0\x0b" + "\x63\x3a\xfa\x1d\xe8\x66\x71\x89\x37\xc3\x73\xd6\x6e\xb6\x57\xb7" + "\x5b\x3c\xb3\xdb\xbd\x45\xd2\x57\x66\x31\x6d\x07\x7e\x3b\xa5\x87" + "\x5c\x21\xdd\x71\xa6\xcc\x1e\x02\xf4\x28\x42\xdf\x85\xb5\x9d\xd0" + "\x47\x53\x7b\x10\x0b\x45\x18\x23\x16\xf2\xf3\xf3\xd6\x4a\xa4\x79" + "\xf7\x02\xfc\x3e\xd2\x16\xc6\x87\x16\x1f\x4d\x30\xf4\xfd\x6e\xb3" + "\x44\xd3\xfc\x29\x38\xe6\xba\xe6\xd6\x77\x27\xd2\xc8\x0e\x75\xae" + "\x05\xe4\x18\xa7\x7d\x06\xf5\xb3\xbe\x25\xf8\x9d\xce\xc1\x7d\xe1" + "\xf0\xbf\xe8\xaf\x81\xf3\x8e\xe3\xc0\xba\x09\xbe\xf1\x60\x2d\xc7" + "\x02\xe1\x7e\x7a\xac\x3a\x91\x7e\x2c\xd6\x48\x41\x0a\xa7\x83\x98" + "\xbf\x91\xcf\x59\x07\xcf\xed\xce\xb2\xa6\x3a\xe6\xac\xad\xcc\x5e" + "\xc4\xb8\x08\xa5\x6c\x5c\x6a\x2d\x74\xaa\x73\x27\x3b\x83\xdb\x8e" + "\xf3\x8d\xd6\x79\xf8\xad\x3c\xf4\x2d\x87\xb8\xb8\xe4\x8c\x7f\xeb" + "\x74\xac\x27\xee\x3b\xb6\x4f\x38\xb9\x0c\x74\x7e\x0c\xd2\x19\xde" + "\x59\x02\x7d\x21\x67\x08\x7d\xcc\xe2\x3b\x76\x67\x5d\x57\x4a\xfa" + "\x18\xc6\x38\xa0\x9b\x7a\x64\x6c\xec\x0b\x36\xbd\x49\x40\x9b\xaa" + "\x87\xc5\xde\x06\x59\x9f\x29\xca\x79\xb0\x3d\xae\xcf\x93\xd6\xdd" + "\xec\x78\x76\xe3\x0a\x5b\x73\xee\x94\xe2\x16\x72\x5f\x8e\xd7\x63" + "\x1c\x67\x3d\xae\x27\x0c\x38\xeb\x81\xe7\x8f\x5e\x63\xf1\xed\xf6" + "\xa1\x5e\xab\x69\x6b\x46\x3d\xc5\xde\xc7\xf3\x1f\x20\xa3\xbe\xe4" + "\x67\x98\x9a\x71\x8d\x80\xc5\xd6\xc1\xba\xf0\xb8\x24\x4d\xec\x7f" + "\xc0\xad\x02\x7f\x39\x96\xae\x83\x9e\x7e\x31\x47\xb2\x23\x70\xbd" + "\xef\x88\xe2\xdf\x88\xf1\x5e\xb4\x19\x7a\x64\x18\x67\x1e\xf2\x74" + "\x4a\x31\xe6\x59\x4c\x79\xde\x9e\x64\xb7\x3e\x3b\x1f\x20\xa1\xe8" + "\xb3\x00\xcf\xf8\x31\x1a\xa8\xa6\xe9\xd1\x0f\x38\xfa\x34\x35\x6e" + "\xc0\xd8\x3f\x3d\x7f\x7e\x75\x0a\x3b\x27\xdd\x69\x7c\xa0\x1d\xf7" + "\x82\xb5\xb5\xa4\x31\x5f\x5d\xca\xc8\x54\x1b\xc5\xf7\x98\x4d\xe3" + "\x3f\x0d\xcf\x3c\xb7\xb1\x38\x18\x58\xa6\xd7\x3e\xad\x7b\xd2\x44" + "\xfb\xb8\x0d\xc6\x5f\x77\x02\xaf\xd8\xb8\x08\xfe\x9f\x72\x89\xf4" + "\x9e\xe1\xb1\x8e\x79\x5c\x06\x71\x4f\xf8\x38\xee\xe7\x03\x68\xc6" + "\xfc\x2e\xf4\x2e\xd2\xce\xc6\xb8\xe0\xbd\xbf\x62\x3e\xd2\x73\x6a" + "\x0a\x44\x1a\x14\xec\xe0\xf5\x0a\x5c\x91\x2a\x67\x75\xc4\xfa\x8d" + "\xac\x6e\xbd\x1a\x71\x2c\x33\xae\x3b\xab\x77\x99\xe4\x1f\x84\xdb" + "\x74\xdc\x77\x3a\xe7\x45\xef\x31\xd1\x86\x2f\x14\xbf\x5d\x38\x06" + "\xdf\x2e\x14\xcb\xd4\x73\xff\xf1\x3d\x11\x50\xae\x1e\xea\xd1\x2c" + "\x8d\xa9\xc4\x73\x4c\x21\x7c\xac\xd7\x6b\x73\x8c\xa9\x38\x0d\x5d" + "\xce\xfe\xad\x5d\x9b\xac\x8d\x8d\x5f\x67\x58\x99\xbc\x4a\xaf\x8d" + "\x4b\x4a\x5a\x9b\xa4\x45\xc7\x52\xce\xfd\x87\xc7\xcb\xb2\xa9\xc5" + "\x38\x98\x15\x8e\x38\x98\xb6\x68\xe7\xd8\xb1\x66\x62\x5b\x36\x36" + "\xf3\x27\xb6\x01\x31\x67\xa5\x72\x0a\xe4\x02\xae\x95\x1c\x84\xcb" + "\x08\x57\x15\xce\xa7\xac\xb0\x92\x08\xb0\x37\xd8\x1e\x32\x87\xdf" + "\x0b\x5b\x28\xee\x73\x6a\x22\xb6\x53\xa5\x82\x02\xed\x1c\x8c\x4f" + "\xbf\x9f\xf9\xc7\x82\xf7\xe1\x32\xc2\x55\x05\x17\x7b\x4f\xf8\x3b" + "\x3b\xb3\xbf\xdf\xf9\x19\xdf\xc3\x92\x85\xf1\x27\xea\xe8\x26\x05" + "\xeb\x7b\xc2\x7f\xf2\x7c\xfd\xea\x20\xa7\x59\x5d\xb9\x62\x3e\xb6" + "\x5e\x18\xb0\x89\x68\x07\xc9\xe7\x43\xb3\xda\x14\x62\x3e\x76\x26" + "\x53\x6a\x0f\xc6\xa1\x80\xfc\x52\x3e\x05\xcd\xea\x09\x12\xf3\xa9" + "\xd8\x77\xb3\xe4\x83\x7d\xd7\x97\x66\x7d\x90\x2a\xe6\x53\x3b\x97" + "\xe7\x94\x67\x9c\x90\xd5\x84\x6d\xae\x13\x36\x29\xb8\xef\xb2\x2c" + "\x5b\x2a\xe4\x1f\xd4\x07\xcc\xc8\xf8\x24\x68\xfb\xf3\xc9\xb0\x2a" + "\x3e\xee\xa7\xf1\x6b\x52\x30\xa2\x59\xf2\xda\x17\x93\xf1\x77\xcd" + "\xca\xe7\xd9\xcf\xda\x15\xab\x57\xf1\x7f\x92\x13\x42\xf1\x9f\x04" + "\xc0\x1b\xfe\xc6\xbe\x68\xc0\x9f\x55\x6b\xf1\x36\x55\x1f\xf2\xe2" + "\x2a\xfc\xe9\x7f\x16\x55\xd7\x9d\x25\x54\x01\x36\x0e\x72\x39\x2b" + "\x80\x6d\xf6\x75\x2a\xb3\xa5\x37\x99\xc9\x51\x9d\x8d\x48\x73\x6b" + "\xae\x7e\x4f\x84\xf3\xe8\xf7\x24\x70\x93\x61\x55\xa0\x2d\x3e\x0e" + "\x74\x46\x6e\x77\x16\x55\x9b\xc9\xef\x52\x45\xd9\x58\xce\x7c\xe0" + "\x66\x09\x31\xe2\xfe\x52\x85\x90\x53\xb3\x04\x63\x3b\xa0\xbf\x2e" + "\x8c\xe7\x0e\xf7\x99\x70\x5f\x0c\xf7\xd8\x07\x82\xe0\x7e\x19\xce" + "\x8b\xc1\xbd\x06\xee\x83\x85\x1c\xa3\x1e\xcf\x39\xc3\xbd\x16\xee" + "\x67\x42\xf9\x7d\xf1\x9f\x07\x3f\x33\x48\x0b\xa4\x18\xf3\x3c\x9e" + "\x3c\x2d\xef\x8b\x27\x8f\xb1\xbe\xd2\xd5\x6c\x0f\x02\xb7\x41\x68" + "\xa5\x8f\x66\xfa\x16\xc8\xd3\xb7\xfe\xcb\xe7\x5c\x68\xbd\xe4\xc3" + "\x85\xcf\xa9\x60\x6c\xb5\xa2\x66\xa7\x7b\x90\xff\x5f\x57\x4a\xf3" + "\x7a\x2c\x2e\x28\xfc\xd2\x2c\xf4\x35\x4c\x2b\x06\x9d\x4f\x44\xbb" + "\x58\x46\x7e\x83\x7e\x9b\x2d\x19\xb1\xb2\xfb\x4a\x89\x8c\xdd\x73" + "\xbf\xa3\xf4\x8a\x8c\xb0\xf8\xe8\x92\x4f\x42\x67\x7f\x16\x83\x9e" + "\xc9\x3a\x01\x36\x03\x8b\x85\x96\xb0\x36\xd0\xb6\x32\x8e\xd9\x81" + "\x32\xf2\x3e\x97\x5f\x27\xf9\xbc\x85\x8c\xec\xa6\x4f\xf3\x78\x39" + "\x66\x99\x4c\xc7\xfd\x5f\x25\xac\xa5\xf0\x6e\x60\xea\xca\x38\x96" + "\x06\xf9\x36\x83\xad\x26\xd6\x6f\x9b\x29\x18\xcf\xd9\x0a\xdc\x4f" + "\x87\x8c\xe4\x2c\x9f\x9e\x89\xdf\x51\x32\x3b\xe4\x04\x51\x61\x5c" + "\x57\xac\x5b\xa9\x93\xcf\xc4\x1d\x90\x86\xfb\x58\x3b\x9e\x26\x2a" + "\xf4\x11\x2d\xd6\x25\x87\xc5\xa9\xcb\x96\x69\x25\x7f\x57\x66\x48" + "\xeb\xdf\x9e\xa7\x7f\xcd\x50\x39\x6b\x55\x48\xd4\x13\xf0\x5f\x88" + "\x18\x1a\xdd\x19\x9b\xc1\x1d\x7e\xa7\xa2\x3b\xf6\xac\xdf\xcb\xe2" + "\xdf\x66\xcb\x0c\x50\x0e\x1b\xdf\x08\x38\x0e\xef\x8e\x2e\x62\xfb" + "\x60\x65\x32\x1c\xe7\x44\x08\x59\x68\x4f\xb6\xc1\xf7\x65\x45\x88" + "\x59\xaa\x3c\xb9\xa5\x6c\x23\xfa\xff\x96\x01\x8d\x65\x79\xf8\x4c" + "\xf4\x23\x26\x67\x7e\xb6\xec\x44\xc3\xce\x29\x83\x8d\x82\xe7\x60" + "\x5b\x64\x8a\xb7\xd1\xee\xc0\x39\x2d\x21\x5b\x16\x86\xb8\x05\x1e" + "\xa3\x1f\x93\x4e\xea\x57\x13\x41\x27\xd4\xcf\x44\x1c\xa3\xad\x8b" + "\xa7\x67\x5a\x64\x72\x94\x7f\x8f\xc3\xf5\xef\x3c\x2e\xd1\x33\xad" + "\x52\x99\x70\xaf\x02\x1b\x2a\x17\x7e\xd5\xdd\xd9\x72\x9d\x53\xec" + "\x47\x7e\x2e\x5b\x26\x7f\x12\xfd\xcf\x61\xd9\xcc\x76\x96\x29\x98" + "\xdf\x45\xc8\xbb\xc4\x4c\xd4\xcc\x47\x0c\xfc\x0f\xf6\xcf\x2b\x44" + "\xfc\x1f\xec\x9f\x1f\xc7\xf4\x2b\xe3\x3d\x69\xbe\x96\x61\x5a\x26" + "\x2f\x00\x8c\x3e\x0e\xd7\xbf\x43\xfe\x62\x33\xf9\x17\x96\x7f\xb3" + "\x9c\x9d\xd5\x6c\xf1\xd1\x90\x50\x48\x3f\x20\xa5\xfb\xca\x22\x80" + "\xa6\xf2\x4a\xa9\xef\x77\xf8\x9d\xd4\xc3\x7d\xbd\x34\xcf\xc3\xe6" + "\x7d\xb2\xe5\xcd\x4e\xf7\xc9\x70\xdf\x29\xdd\x77\x67\xfb\x10\x49" + "\x56\xe0\xbc\x48\x47\x46\xf4\xeb\x38\xee\x5d\xa5\x01\xbb\x10\xec" + "\x1b\x78\x0e\xfc\xdf\x6e\xe4\xef\x0a\xda\x8e\xac\xbc\xd6\xce\x80" + "\x29\x31\x9d\x20\xff\xe0\x19\xd8\x7f\x89\x4b\xc4\x72\x16\x98\xe5" + "\x3b\xeb\xa4\xb6\x09\x59\x3e\x81\xc2\xb6\xfa\x08\xde\x46\xc5\x16" + "\xf8\x7f\xbe\x65\x42\x0d\xbe\x63\x30\x13\xca\x7d\xe3\xa4\x5c\x2e" + "\xcf\xed\x51\x2f\x31\xc1\xc8\xd9\xb8\x1a\x31\xa7\x60\x73\xd7\x79" + "\x1b\xd4\xcc\xaf\x31\xfa\x22\x61\xf1\xf2\xd0\xf7\xa9\x8d\x8c\x63" + "\xf1\x26\xb6\x51\x0d\x8b\xb3\xf0\x92\x4e\x25\xf9\x3d\xa5\x39\x78" + "\x0e\xce\x90\x80\xbe\x50\x59\x5c\x99\x6e\x5d\x00\xf3\x7f\x2a\xfa" + "\x3d\x2d\x49\x21\x41\xc5\x02\xf7\x7b\xca\xfc\x94\x8c\x83\x71\x4a" + "\xca\xe0\xbe\x4f\x69\xd6\xdb\x2a\xc9\xf7\x29\xbd\x66\xb7\xc2\xff" + "\x33\x81\x1e\x0a\xf8\xd5\xb1\x7b\x87\xcf\x2b\xc5\xa0\xbe\x50\xe5" + "\x84\xc5\xb3\x41\x5f\xa8\x23\xd2\x17\x32\x05\x8f\xb9\x9a\xad\x00" + "\xf9\x97\xc6\xf7\x14\x39\xd2\x76\x43\x9f\xe1\x73\xc5\x32\xf9\x02" + "\x31\xed\x20\xf0\x25\x48\x1c\x97\x5a\x70\x9e\x01\xe7\xcb\x40\x26" + "\x54\xd3\x5e\xfd\xeb\x83\xc9\x9c\xf6\x80\x60\x73\x3b\xfa\xc8\xc8" + "\x56\x58\xcd\x32\x5f\x16\xd3\x97\x8d\x25\x65\x8a\x01\x7e\x9b\x9f" + "\x5b\xb5\x36\x36\x6e\xc5\xef\x12\x0d\xda\xa7\x97\x3c\xce\x02\x72" + "\x86\x68\xe3\x93\xe3\x98\x4a\xd2\x3e\xfd\xc4\x63\x91\x91\x4b\x56" + "\xfc\x7a\xc9\xa3\x4b\x96\xfe\xfa\x11\x7e\x6a\x72\x49\x12\x73\x7b" + "\x9a\xbc\x56\x8b\x2f\x3d\x27\x46\xad\xdf\x10\x97\xb4\xb6\xbf\x3c" + "\x08\x62\x73\x6d\x72\x36\xaf\xdc\x89\xff\xb3\xf9\x3c\x99\x6f\xa1" + "\x34\xcf\xc6\x65\x9f\xef\x56\xa4\x2d\x8b\x69\x9f\xed\xab\x42\xfb" + "\x8a\xf9\x14\x9a\xcc\xf4\x8e\x02\xfb\x34\xea\x9f\xee\x6c\x5f\xa3" + "\xb3\x7f\x30\xf1\xdd\x66\x39\xbe\x27\xf6\x65\x31\xed\x3a\x9d\x36" + "\x2d\x83\xf9\xf8\xca\xf6\xed\x94\xe6\xde\x31\x4d\xaa\x43\x13\xe6" + "\xc9\xf6\x7d\xa4\x2f\x6e\x75\xf6\xb8\x60\x47\xbc\x53\xf6\xe7\x42" + "\x23\x42\xd0\x9c\xf1\x05\x5b\x65\x1c\x5c\xe3\xf1\x5a\xd0\x27\xdf" + "\x53\x68\x03\x8e\xd9\x02\x65\xa0\x83\x53\x7d\x78\x8c\xb3\xec\x7a" + "\x16\x97\x23\xd2\x6e\xf3\x59\x61\x97\xc3\xaf\x0f\x5d\x61\x57\xb0" + "\x71\x22\x4d\xa1\xf5\xec\xbc\x7f\x0a\xad\xc3\x58\x7e\x80\xe3\x9c" + "\x48\x5b\x7a\x4e\xa4\x9d\xda\x56\x80\xfd\x0e\xbf\x5f\xe1\xb9\xf5" + "\x48\xfb\x57\x94\xc5\x33\xc2\xf9\x1c\xee\xeb\xb0\x0a\xf7\x71\x2e" + "\x07\x0c\x97\xb6\xf3\xd8\xd7\x91\xeb\xbf\x39\xb7\x62\xbd\x99\xc7" + "\xbe\xbe\xc2\xe3\xc5\xe3\xf7\xa1\xcc\x74\x28\xe7\xd8\x0a\xbb\x8f" + "\x36\xd2\xde\x4b\xd9\xd9\xdb\xec\xf1\x64\xa8\x78\xd6\x28\x63\xd7" + "\x4d\x25\x72\x3c\xcb\x67\x2f\x8d\xd7\xa2\x5f\xc3\x0c\x0b\xb5\xa2" + "\x7f\x9c\xbf\xf5\x34\xc8\xb5\x29\x0a\xa0\xdb\xf8\x59\xb5\x86\xd0" + "\xc1\xcf\x5e\x67\x9f\x8f\xa1\x79\x25\x07\x68\x76\x73\x28\xcd\x2b" + "\x0d\xa3\x39\xf5\x38\x3f\x2b\xa3\xd9\x5f\x11\xb8\x87\xf4\x8b\x75" + "\x34\xaf\x2c\x8c\x66\xb7\x95\xc3\x2f\xdc\x7f\x63\xa0\x79\xe5\x70" + "\xff\x71\x38\xbc\xb7\x9f\x66\x7f\x82\xef\x85\xd2\xec\x6a\x1d\xfc" + "\xc2\x7d\x8d\x16\xf2\xc1\x7d\xad\x06\x7e\xe1\xde\xa4\x6e\x91\x8d" + "\xb7\xc0\x3b\x90\xd6\x1e\xc1\xbf\xd5\x15\xc1\xbe\x95\x6d\x8d\xe0" + "\xdf\xe8\x8d\xe0\xdf\x10\x22\xd8\x37\xb6\xcb\x22\xf8\x37\xea\x94" + "\x90\xff\x20\xcd\x3e\x9e\x0a\xf9\xc2\x69\xf6\x89\x56\xf8\x85\xfb" + "\xfa\x68\xc8\x07\xf7\xa7\xaa\xe0\x17\xee\x4f\x43\x5d\xca\xe1\xbe" + "\xa1\x02\xf2\x1f\xa2\xd9\x9f\x05\x43\xbe\x79\x34\xfb\xf3\x02\xf8" + "\x85\xfb\xb3\x0a\xc8\x07\xf7\x5f\x40\x39\x65\x70\x7f\xae\x0d\xf2" + "\xcf\xa3\xdb\x15\x58\x1f\x23\xdd\xee\x8b\xe5\x46\xd0\xed\xe3\x31" + "\x3f\xdc\x4f\x80\xf2\xca\xe0\xde\xcf\x0c\xbf\x70\xaf\xca\x81\xfc" + "\x70\x1f\x00\x6d\x2d\xa9\xa4\xdb\x03\x1b\x21\xdf\x7c\xba\x7d\x12" + "\xa4\x97\xc2\xfd\xf7\xc2\x20\x1f\xdc\x07\x61\x7e\xb8\x9f\x92\x0b" + "\xf9\xe1\x5e\x83\x34\xaa\xa2\xdb\xa7\x15\x41\xbe\x05\x74\x7b\xb0" + "\x15\x7e\xe1\xfe\x6e\xac\x3f\xdc\xdf\x73\x10\x7e\xe1\x7e\x26\xd0" + "\xaa\x1c\xee\xbf\x0f\xf5\x2b\xa9\xa6\xdb\x75\x58\xfe\x42\xba\xfd" + "\x87\x48\x1f\xb8\x9f\xb3\x1b\xf2\xc1\x7d\x28\xd0\xa3\x0c\xee\x7f" + "\x94\x00\xf9\x17\x0e\xca\xcf\xed\x73\xe7\xd3\x4d\xe3\x08\xdd\xfe" + "\x48\x3d\xdd\x34\x1e\x7e\x7f\xbe\x85\x6e\xf2\xd5\xd1\xed\x8f\x35" + "\x43\x3a\xfc\x46\x2c\x83\xfb\x10\xf1\x1e\x7e\x1f\x0d\x83\xfb\x50" + "\xf1\x1e\x7f\x55\x70\x1f\x26\xde\xc3\xef\xfc\x42\xb8\x0f\xa7\xdb" + "\x9f\x48\x80\x7b\xfc\x25\x70\x3f\x4f\xbc\x87\xdf\x5f\x84\xc2\xaf" + "\xcd\x32\x5d\x9f\x6a\xf1\x4f\x0c\xb5\xf8\xef\x2c\x47\x4c\xda\xf3" + "\x4b\xf6\x0b\x01\xa5\xa1\xa0\x77\xc7\x65\x74\x91\xf1\x2d\x32\xbf" + "\x0f\x51\xa6\x98\xd2\xcc\x2c\x4e\xa4\xe8\x67\x73\x5c\x93\x6c\xc2" + "\xfb\x60\x23\x85\x83\x0c\x97\x43\xdb\xdb\x68\x96\x6f\x3b\xb4\x39" + "\x81\x66\x4d\x6c\x82\x5f\xb8\x9f\x74\x02\xda\x0c\xf7\x0f\x6f\x87" + "\x5f\xb8\x7f\xe6\x31\x68\x7b\x42\x77\xb6\x9f\xc6\x2c\x1b\xbf\x90" + "\xc9\x88\x3d\xeb\xcb\x03\x6d\x19\x34\xd2\x06\xba\xe3\xf5\x8a\x98" + "\x40\x5b\x0c\x60\x77\x57\x44\x20\xc6\x73\x29\xd1\x1f\xa4\x01\x89" + "\xac\x4e\x18\xb3\x89\xf6\xce\x94\xf3\x6f\x4f\xa4\x4d\x32\xbf\x27" + "\x30\xb6\x08\x0d\xd8\xea\xee\x79\x1c\x7b\x3e\xad\xc2\xc0\x9f\x2b" + "\x89\xe3\xf9\x33\xf8\x7c\x6b\x20\xfa\xe8\x9f\x11\xc3\x9e\x9b\x3a" + "\x5b\xc5\x76\xf9\xe0\xb3\x9d\x98\xd7\x2c\xf3\xab\xe4\x32\x7c\x42" + "\x15\xcd\xf2\x21\x1d\xca\xfa\x05\x50\xf7\x7a\xa8\xbb\x4a\xb4\xe1" + "\x97\x50\x65\x4d\x34\xf7\xb3\x72\x7a\xd0\xfd\x7b\x38\x86\x15\x72" + "\xf7\x14\xe5\x81\x1c\xc4\x71\x31\xe8\x43\xb9\x36\x7d\xe6\xc1\x26" + "\x99\xaa\xbc\x84\xcd\x77\x54\x84\x73\xf9\x38\x31\xae\x77\x7b\x7d" + "\x9a\x76\x43\x20\x7c\x5f\xb5\x33\xc3\x4a\xbb\x8c\xe9\x8f\x81\x6c" + "\x65\xe9\x07\xd9\x39\x26\xfe\xff\x6e\xb6\x3f\x95\xff\x5f\xc0\xe6" + "\xc2\xa1\x2c\x7c\xd7\x79\x1c\x62\xcf\x0e\x0b\x15\x02\x2a\x22\xd8" + "\xfa\xbe\x6c\x62\xfc\x87\x82\x59\x1e\x98\x4c\x7c\xb5\x1b\xfe\x06" + "\xe5\x4f\xdc\xef\x32\x66\xed\xcb\xcb\x9e\xfd\xe1\xaf\x90\xf7\x4d" + "\x9c\x5f\xca\x9e\x68\xec\x8b\xe5\x0d\x6d\x78\x05\x75\xa1\x9c\x44" + "\xa0\x7e\xe6\x36\xb0\x2a\xa2\x26\x8d\x10\x9b\x6a\x97\xd6\x96\x9b" + "\xa8\xb5\xe7\x56\x84\xd3\xfc\x8a\x88\x00\x9b\x8c\xb0\x73\x04\x32" + "\xd5\x8b\x0f\x5a\xd1\xe6\xfc\x18\xf3\xce\x11\xc6\x3d\x62\x79\x20" + "\x95\xc8\x8d\x49\x9f\xe1\x7d\x22\xcd\x7e\x3c\xc7\xd4\xd6\x40\x8c" + "\x49\xac\xac\x04\x9a\x1d\x19\x2e\x8c\x7b\x32\xac\x14\x6d\xf7\x54" + "\x9c\x7b\x3b\x81\x74\xb9\x0a\x7c\x01\xbd\xa2\x5a\x28\xd5\x05\x75" + "\x4a\x1e\xd0\x0e\xed\x6a\xf4\xc9\xb1\xc2\x6e\x47\x1f\x77\x39\x66" + "\xa0\x03\xe7\x97\x2a\x14\x6c\x0a\x22\x7e\x77\xab\xe0\x57\xaf\xaf" + "\x5d\x86\x6b\x99\x4a\xf4\x19\xd6\xc5\xce\xf1\x63\x94\x6d\x01\x75" + "\x3e\xcf\xeb\xcc\xbb\xc4\x55\x86\x15\x1b\x0c\x6b\x93\x92\x57\xbc" + "\x68\xf8\xa9\x16\x06\x93\xda\xb5\xab\xb5\x89\x71\x89\x6b\x93\xd6" + "\x0f\xf0\x53\x04\xf5\x6a\x06\x9c\xb0\xf9\xae\x63\xf0\x75\xb6\xae" + "\x20\x0b\x38\x80\xbc\x7e\xfd\x35\x1e\x9f\xa5\x3b\xdb\x1f\xc6\xac" + "\xcf\xb3\xb9\x1a\xa1\xa8\x22\x9a\x16\xeb\x0f\x6e\x43\x5f\x24\x2f" + "\x62\xfc\x0f\x0b\x31\x91\x76\x1e\xb3\x99\xc5\x63\x84\x31\x46\xca" + "\x46\x6a\x4c\x69\xc7\x7e\x00\x32\x68\xe7\x02\x5a\x12\x4f\xae\xe7" + "\x25\x16\x35\xc9\x02\x8a\xae\xe7\xed\x0c\x97\xe2\x69\xd9\x73\x77" + "\x16\x09\xaa\x3d\xfb\x31\x9e\x56\x2f\xd5\x90\x1a\xa0\x65\x4f\x4e" + "\x3d\x8c\x21\xeb\xa3\x4a\xb2\xe8\x41\x3b\x8c\xb9\x98\x1f\x9d\x3d" + "\xeb\x33\xed\x54\xa7\xb0\x67\x11\x25\xfc\x06\xd0\x80\xbd\xe6\x5e" + "\xd5\xae\x50\x7c\x8e\x71\xb4\xec\xbd\x3a\x92\x5e\x4f\x85\xff\xd0" + "\x03\x6e\xb2\x08\x65\x71\x83\xf5\x97\x09\xa4\xfb\x09\xf9\x3b\x8d" + "\x2d\x0b\x88\x1c\xf3\x82\xbd\x47\x96\xc1\xff\x69\x2b\x89\x3f\xe4" + "\x0b\x4c\x3b\x06\xe9\xdd\x3a\x3f\x5b\x86\x4e\xd9\x93\xa1\xf3\xeb" + "\xa5\x3a\x95\xa9\xd9\x4a\x7a\x67\xad\x2f\x98\x63\x21\x8a\xd7\xc1" + "\x2e\x2c\x11\xa0\x0f\x16\xeb\xcb\xed\x2f\xeb\xc6\xd9\x5e\xd6\x29" + "\x7a\x7b\x75\x4a\xdb\x4b\x3a\x45\xcf\x4b\xba\x71\xbd\xdd\x3a\xa5" + "\x29\xd6\x42\x3e\xb6\xfc\x89\xd4\x36\xb7\xb2\x79\xdf\x5e\xff\xbd" + "\x6d\xbd\xfe\x3b\xab\x55\xcd\x24\xe8\x01\x03\xd8\x85\x60\x2f\xbf" + "\x01\x63\x05\xc0\x84\xca\xf6\xc7\xf5\x99\x34\x6f\x6f\x01\xd0\x77" + "\xe3\x13\xf7\xd3\x6f\xec\xd9\xdf\x5b\xa0\x7d\x0a\xe4\xd5\x26\x85" + "\x06\xd2\x00\x3f\x77\x83\x3e\x09\x06\x19\xa7\x08\x86\x4b\x6b\xe6" + "\x7c\x20\x34\x7b\x92\x0d\xe7\x1d\x30\x2f\xcf\xa7\x59\x68\x66\xbf" + "\x41\xc5\x2c\xbe\x6f\xb6\x6a\x5f\x09\xb3\x49\x02\xf6\x4b\x36\x49" + "\xa5\x62\x70\x7f\x27\x90\xa7\xbe\x6f\x0c\x2f\x80\xcc\xc9\x2b\x19" + "\xd4\x3f\x0f\xf7\x41\x04\xdf\xce\x2f\xa9\x2b\x10\xfa\x7c\x50\x83" + "\xcc\x0c\xb0\x43\xff\xc9\x64\xcf\x72\x77\x45\xa4\x5f\x25\x3e\xf8" + "\x6c\xff\x35\xab\x1c\xef\xb5\x49\x32\x6a\xea\xb4\x92\x02\x5c\xff" + "\x08\xd6\x1f\xdc\x7f\xcd\x22\x47\xbc\xe0\x1a\x52\x93\x2c\xf0\x8e" + "\x82\x6b\x62\xb9\x45\x15\x31\x19\x2f\x10\x16\x23\x07\xe3\x6c\x21" + "\x8e\x0a\xd2\x61\x0c\x8a\x31\xc1\x92\x50\x86\x05\xfe\x0a\xfe\x57" + "\x62\x3e\xaa\xda\x15\x21\x40\x19\x80\xa5\x0a\xea\xbf\x4b\x27\xe4" + "\xed\xdc\x0f\xb2\xd5\x40\xa7\xc7\x6b\x84\xd7\x2b\x40\xa6\x05\x56" + "\x00\x3d\x8c\xd2\x9c\x46\x6d\x85\x8d\xa0\x0f\x31\xfa\x98\x8d\x1c" + "\x4d\xee\x42\x3f\xc3\x3e\x96\x09\xf5\xd1\x16\xff\x3d\x45\x16\xff" + "\xbd\x05\x42\xde\x1e\x33\x5c\xcd\x86\x24\xa2\xba\x24\x53\x27\xf4" + "\xf9\xc0\xbd\x7a\x8b\xf8\xc0\x05\x3b\x8f\xd9\x7b\x80\x1d\xb4\xdf" + "\x84\xbc\x5d\x2c\xd6\x0d\xda\x75\x28\x73\xbb\xb3\xd5\x45\x92\x5d" + "\x86\x72\xc4\xbe\xad\x3e\x16\xae\x18\x48\xdf\x6f\x96\xdd\xd7\x20" + "\xc9\x18\xd0\x3d\x51\xc2\xf6\x28\x2b\x5b\x6b\xeb\xd5\xff\x1c\xf3" + "\x02\xdd\x70\x0d\xd3\xc7\xde\xab\x9f\x07\xd7\x23\x70\xfd\xcc\x9e" + "\xb7\x4b\x6b\xcf\xdb\x19\x61\xcf\xdb\x6b\xb0\xe7\x25\x2e\x81\x2b" + "\x1a\xae\x65\x70\xc5\xc0\x15\x0b\x97\x9e\xe6\x25\x26\xc0\x2f\x3e" + "\x4f\x86\x2b\x15\xae\x34\xb8\x32\xe1\xda\x62\x7f\xbd\x22\x4a\x00" + "\x7c\xc2\xa5\x85\x2b\xd8\x9e\xb7\xa7\x01\xae\x41\xe7\x4a\x68\x8e" + "\xc0\xe3\x7a\xf8\x9e\xa3\x81\x18\xf7\x39\xad\x0b\x7d\x5a\x6a\x8e" + "\xea\x3a\x47\x16\xdf\x45\x36\x29\xd6\xdd\xfc\x09\x96\x0f\xfd\xab" + "\x77\x84\xe5\x1d\x70\x3b\x1f\xa3\xa9\x88\xb6\x05\xc7\x33\x9f\xee" + "\xd0\xa7\x65\xb5\x31\xcd\x24\xd2\x42\x32\xaa\x9b\x7b\x48\x46\x2c" + "\xb5\xb3\xb1\x79\x1a\x9e\xaf\x31\xb0\xfd\x0f\x76\x1a\xad\xed\xcd" + "\xdd\xb9\xc0\xae\xda\x63\xa0\xaa\x3d\x15\xcc\x6f\x26\xc8\x1f\x8c" + "\xa3\xd7\x37\x2e\x45\x5c\xc1\xd8\xb4\xa6\xad\x8b\xbc\x1c\x4b\x85" + "\x1a\x3d\x9e\xfe\x05\x80\xc9\xc8\x4e\xc4\x98\x34\x36\xfd\x65\x23" + "\xcd\x04\xbc\x4c\xb0\x03\xdd\x04\x1c\x93\x02\xb6\x70\x7c\x2a\xe1" + "\x0b\xf4\x99\x5a\x8a\x3d\x46\xc7\x4d\x5a\x00\xcf\x14\x18\x9b\xac" + "\x18\xc6\xa4\xc5\x29\x64\x66\x31\x3c\x63\x71\x64\xa1\xde\x8b\x0d" + "\x81\x54\x78\x5e\x47\x4a\x7f\x47\x94\xfe\x97\x79\x6c\x62\x3b\xd0" + "\xbe\x2f\x3e\x47\x6e\x62\xd1\xa2\xcb\x5a\x72\x54\x77\x16\xf4\xd2" + "\x7e\x90\xdf\x89\x45\xbd\x20\xbb\x81\x96\xf6\x91\xd1\xf2\x7b\x03" + "\xc6\x43\x63\x45\xcb\xde\x60\x7d\x39\xa7\x67\x0c\x41\x9a\xf5\xa7" + "\x27\xd2\x78\x43\x33\xd0\x13\xe8\x6a\xaa\xb7\x93\x00\x19\x59\x29" + "\xd1\xf3\x4d\xa0\x27\xd0\x54\x83\x34\x05\x7a\x30\x9a\x52\x91\xa6" + "\xa5\x4e\x34\x05\xf9\xc4\x7c\x8c\x22\x4d\x05\xa0\x69\xa9\x1b\x9a" + "\xf6\x8d\xef\x81\xa6\x65\x1e\xd1\xb4\x62\x14\x34\x0d\x5a\xe2\x8e" + "\xa6\x36\xd4\x99\xf9\x89\x05\x14\x64\x9e\xc9\xf6\x31\xf3\x97\x0b" + "\xf6\x4e\x33\xd8\x6d\x66\x41\xb5\xb3\x08\x68\xa2\xc2\x7d\xae\x18" + "\x0b\x8f\xf9\xb6\xab\xa0\xd7\xed\xf9\x7b\x2d\x98\x06\xb2\x4b\xff" + "\x20\xfa\x07\x34\x98\x49\xa9\x9c\x1e\xac\xbd\xd6\x09\x3a\xe6\xce" + "\xbc\x1e\xb4\x39\xf3\x2b\x1e\x14\xa8\x9e\xa0\x1c\x59\x7e\x3f\x51" + "\xf4\x80\xac\x30\xa4\x90\xbb\x0b\x40\xde\xf5\x80\xfc\xbc\x24\xbb" + "\x43\xf7\x84\x41\xa0\x70\x65\xa0\xdf\x57\xc1\x7f\x8f\x19\xe4\x35" + "\xe3\x2f\xf2\x0c\xd7\x1f\x6b\x96\xff\x1d\xca\x9b\x32\xf5\x93\x18" + "\x1b\xc9\xd0\x0f\xe4\xaf\x90\x11\x0d\x76\xd7\xf0\xfd\x04\xe3\x71" + "\xa6\xb5\x22\x5f\xf7\x13\x53\xb3\xa3\x9f\x08\x2f\x71\x39\x8c\xbc" + "\xc0\x7e\x81\x7d\x64\x87\x93\xfc\x05\xd9\xae\x2e\x11\xe3\xd3\xd8" + "\x41\xfe\x42\x5e\x05\xfa\x8b\xc5\xb8\x35\x83\xf6\x8f\x97\xa1\x7f" + "\x6c\x60\xb1\xc3\x34\x40\x8f\xfd\x3d\xdd\x9c\x87\xc8\x33\x93\xad" + "\x8a\xf1\xaf\x40\x94\xf7\x9c\xee\x7b\xfe\x9b\xd2\x68\xb0\x65\x40" + "\xfe\xe5\xef\x35\xd3\x6e\xbd\x1f\xce\x55\xc2\xf8\x39\x34\x30\x16" + "\x6c\x87\x6f\x40\x1f\xac\x01\x7c\x5d\x21\x33\xcb\xd6\x80\x3d\xd0" + "\x8d\x31\x00\xa1\x3e\xeb\x79\xec\x64\x21\x7b\xd2\x3e\x78\xc6\xfc" + "\xd8\x0a\x92\x1f\xdb\x0e\x1d\x8e\xfb\x1d\xf3\x45\x6b\x75\x72\xc7" + "\x37\xcf\xec\xb7\xab\xc0\x16\xc0\x33\xff\xb2\x29\xdc\x9f\x95\xf2" + "\x6f\x7a\xa4\x6b\x9b\xec\x4e\xbe\x4e\x91\x53\x99\x60\x48\x27\xe3" + "\x2f\xc9\xa6\x60\x7c\xd6\x18\x03\xc6\x81\x97\x9e\x65\x40\x5d\xb3" + "\x76\x5b\x1f\xc8\x24\x20\xbb\x15\xe1\xa6\xd4\xcb\xe8\x17\x72\x84" + "\xb2\x77\x0a\x4e\x79\xc8\xec\x39\x67\x0e\x00\x9d\x22\x84\xed\x67" + "\x0e\x81\x4c\x09\xa5\xcf\x43\x5b\x7f\x07\x6d\xbd\x04\x74\xbd\x04" + "\x6d\x7d\x49\x6c\xab\x18\x17\x51\x00\xfa\xc3\xb3\xc1\xf5\x9f\xd4" + "\xd6\xe7\x31\x4e\xd0\xa1\xf0\x8d\x97\xc9\xf7\xe8\xbd\xb8\xe6\xcb" + "\xce\x64\x76\x9b\x6c\x67\x09\x7e\x97\xe9\xe7\xdc\x44\xfd\x52\xc0" + "\x23\xd2\x1c\x6c\x02\xd0\x73\x3b\x8d\x12\x1f\xb0\x3e\xb4\x57\xef" + "\x57\xba\x06\xea\x83\xb4\xbf\x42\x42\xb0\x3f\x03\xed\x67\x96\x22" + "\xfd\x5d\x63\x93\x07\x31\x1e\x8c\x03\x1e\xac\x11\x79\x90\x27\xf2" + "\x00\x6c\x45\xd0\xd5\x38\xc7\xa1\x29\xcd\xe2\x3c\x18\x19\x8d\x34" + "\x6e\xe3\x5f\x7a\xd9\x5f\x3b\xdd\xf7\xd7\xbb\x1e\xed\xe1\x63\x48" + "\x19\xfa\xd3\xa5\x01\x15\x3f\x16\x7a\xa1\xdf\xe6\x8b\xfd\x96\xea" + "\x7f\x26\xf5\xd9\x16\x99\xe6\xac\x67\x7d\x76\x6a\xcd\x3f\x69\x9f" + "\x0d\xba\xb1\x7d\x76\xda\x1f\x5c\xfb\xec\xb4\x2a\xd7\x3e\x3b\x6d" + "\xa3\xa3\xcf\x8a\xcf\xc6\xa4\xcf\x4e\x2b\xfc\x76\xfa\xec\xb4\xc2" + "\x41\xfa\x6c\xbd\x07\x7d\x56\xe3\xa6\xcf\x6a\x6e\x5c\x9f\xbd\xeb" + "\xe0\xcd\xd3\xb1\x33\xae\xf7\xc8\x07\xd1\xb1\x2f\x3b\xe9\x58\x7f" + "\xd4\xb1\xc1\xb9\x83\xf5\xd7\xde\x62\xe8\xaf\x2a\xb1\xbf\xfe\xc7" + "\x07\x50\xde\xf4\xad\x1f\x37\x0e\xdf\x5f\x6d\xc5\x0e\xfb\xc9\x6d" + "\x9f\xd5\x63\x9f\xad\x20\x26\x33\xeb\xb3\x2b\xa5\x3e\x5b\x2c\x8e" + "\x77\x86\xe8\xb7\x41\xee\xfa\x2d\xc6\x8a\xc3\x38\x71\x43\xf6\x5b" + "\xd1\x5e\xea\x9d\x8e\xfd\xd6\x78\x8b\xe9\xda\x19\x8b\x5c\xfb\xed" + "\x8c\x4c\xd7\x7e\x3b\x63\xae\xa3\xdf\x8a\xcf\xc6\xa4\xdf\xce\x58" + "\xf8\xed\xf4\xdb\x19\x0b\xbf\x3b\xba\xf6\x6e\xc3\xcd\xd3\xb5\xf7" + "\xbe\xc7\xfa\xad\x3b\x5d\x9b\x21\xea\x5a\x7f\xd4\xb5\xda\x27\x3d" + "\xeb\xbb\xf7\x3c\xfa\x4f\xde\x77\x6f\xb0\xce\xbd\x77\x82\x6b\xdf" + "\xbd\x77\x9e\x6b\xdf\xbd\xe7\xaa\xa3\xef\x8a\xcf\xc6\xa4\xef\xde" + "\xab\xfc\x76\xfa\xee\xbd\xca\xef\x8e\xce\xbd\x2f\xc4\x5d\xdf\xd5" + "\xce\x20\x99\x4d\xb2\xfb\xb6\x9a\x8a\xd9\xbe\xbc\x4c\x93\xed\xa7" + "\x7c\x0f\xba\xec\xbe\xb7\x4d\x9a\x70\x22\x6c\xaf\xaf\xc3\x78\x31" + "\xb8\xa7\xe6\x55\xa7\x3d\x2b\x7c\x4d\xf7\xbe\x1a\x69\xcf\x4d\x99" + "\x18\x53\x66\xa8\x3d\x37\x34\xa7\x3e\x86\xbf\x37\x53\xc9\xb1\x51" + "\x1f\x2b\xdd\x33\x1f\x37\xb2\x99\x2a\xba\xad\x7e\x99\x65\x42\xfd" + "\x32\x77\xeb\x24\x01\x9b\x28\xc5\x7d\x26\x1d\x33\xd6\x87\x76\x6c" + "\x27\xa4\x80\xad\x41\xcc\x9c\x0f\x6d\x4c\x60\x7b\x24\x02\xa6\xab" + "\x3b\xb2\xa2\x08\xa4\x45\x4b\x69\x2c\x3e\x7b\x96\x0f\x15\xe0\x19" + "\xcd\x4f\xb0\x61\xcc\x40\xf4\xbf\xfc\xc0\x35\xc4\xe2\x4c\x3d\xc8" + "\x08\xb6\x87\x84\xad\xe3\xdf\x79\x57\x67\x69\x3b\x51\xd4\x6e\x61" + "\x7b\xe9\x70\xaf\x4e\x79\x3e\xe2\xdf\x67\x76\x11\x95\x2b\x88\x50" + "\x12\xaf\xa4\xfe\x7b\x5a\xd9\xde\x62\xc0\x8a\xb4\x7f\x07\xe3\x2b" + "\x0a\xd3\xf5\x15\x92\x0f\x60\x0a\xf5\xfb\x6b\x3a\x9e\x7f\xf5\xa1" + "\xa5\x49\x44\x0d\x97\x8a\xe6\xed\x69\x85\x7a\x59\xa4\xf9\x43\xb7" + "\xfb\xc4\x31\xc6\xf4\x5d\x1a\x85\xb8\x57\x08\x7d\x21\xb0\xbd\xf4" + "\x3b\xe4\x42\x8e\x1d\xd2\x69\x56\x06\x35\xa5\xda\x48\x20\xd0\x02" + "\xd7\xf0\x31\xd6\x99\x50\xba\x3e\x74\xf3\x34\x42\xde\xd9\xd0\x2a" + "\xc7\xfd\x1c\xf6\xff\xba\xab\xd3\x98\xfe\x23\x5c\xe3\x67\x71\x0d" + "\x5a\x64\xb3\x2e\x47\x5e\xe4\xf1\xa4\xe1\xff\xeb\xb8\xf6\xb0\x08" + "\xee\x71\x8d\x5c\xe8\xd0\x28\x30\x2f\xa4\xff\xd1\x98\xf2\x19\x09" + "\x34\x10\x65\x3e\xb4\x4d\xcc\x9b\x8c\x79\xcd\xb2\x59\x6c\x8f\x02" + "\xdc\xb3\xbd\x4a\xf0\x1e\x9b\x2b\xa5\xc5\xf1\x4a\x26\x1f\x72\xf7" + "\xb4\x0a\xd3\xe3\x95\x6c\x2f\x29\xb4\x73\x07\xb4\x19\xf2\xa8\x70" + "\x0f\x0f\xfb\x4d\x27\xea\x42\x48\xc3\x72\xe0\x57\xc5\xf6\x11\xcb" + "\x66\xa1\xff\x3e\x77\x7b\xc1\x15\x20\x8f\x5b\x29\x60\x9b\x9f\x09" + "\x92\x1d\x6f\x92\x7d\xbf\x28\x50\x46\x29\x2d\xd6\x57\x6c\xc6\x79" + "\x6c\xdc\xf3\x8d\xfb\xd8\x65\xdf\x7f\x01\xca\x57\x94\xb1\x79\xdb" + "\xef\x47\x01\x8e\x1c\xfb\x11\xd8\x5a\xcb\xf7\x2b\xf0\x3b\xf8\x8e" + "\x98\x9f\xed\x35\xc5\x3a\x6b\xd3\x7d\x28\xdc\xff\x9e\xef\x0b\x57" + "\xfe\x05\xde\x2f\xe8\xdb\x17\xce\xdf\x03\x2c\x7d\x7f\x37\x94\xc9" + "\xfc\xb3\xe0\xbd\xdb\x7d\xca\x22\xdf\x6a\x34\x80\x8d\xfe\xbc\x93" + "\x30\x02\xb8\x90\x30\x82\xf5\x7d\x37\xdd\x2c\xe7\xfb\x8e\x7e\xc0" + "\xe2\xd2\xe4\x03\x0f\xed\x6f\x6a\x14\x6c\x6e\xba\x17\xf9\xd2\x84" + "\xcf\x2e\x22\x5f\x76\x80\x2e\x10\xf3\xaa\x1c\xf5\x67\xf7\x8c\x9f" + "\x02\xf0\x82\xef\x83\xfa\xc1\x87\x2c\xae\x14\xc8\x0c\xdc\xbf\x5e" + "\x99\x0a\xf5\x42\xdc\x02\x46\xde\x49\xb2\xca\x4b\x53\x78\xfa\x5f" + "\xdb\xad\xf2\x1d\x97\x08\xca\x16\x92\xf7\x3b\xa2\x00\x3d\xa4\xc0" + "\x32\x69\xb0\xbe\xe2\x41\x89\x8f\x1b\x80\x77\x29\x80\x5d\xa0\xf9" + "\x0e\xa0\x5f\x69\x0f\x5b\xab\xa9\x28\x15\x88\x4a\x80\x7c\x66\xd9" + "\x0f\xac\x50\x9e\xba\x64\x0a\xb5\xe0\x3e\x6b\xa0\xe1\x3f\xba\xb3" + "\x7f\x50\x2f\xd1\x10\xeb\x84\xfb\xa4\xf3\x70\xef\xbf\xec\x07\x51" + "\x1c\x43\x3f\xd0\x4a\x6d\x76\x47\xcf\xbc\x77\x48\x70\xde\x03\x24" + "\x5c\x50\x0a\x1a\xea\x73\x57\x39\xce\x37\x2f\x6e\x43\x5f\x5a\xad" + "\x24\x72\xeb\x39\x6a\xb2\xd8\x89\x30\x41\xd0\xe0\x3a\x84\x7d\xf3" + "\xec\xc9\x91\xeb\x81\x5e\xa0\xef\x33\xac\x44\x6d\x4a\xb7\xf0\xf8" + "\x87\xe4\x2a\xb1\xaf\x03\x19\x0e\x72\x1d\x74\xaa\x22\xe3\x2a\x99" + "\x8a\xf4\x12\xfc\x77\x2e\x68\x91\xe9\xde\x5a\x9a\x4c\x32\x47\x26" + "\x47\x75\xc9\x8c\xee\x60\x5f\x80\xcc\x97\xe3\x5e\x3d\x93\x05\xec" + "\x93\xbc\x9d\x0b\x46\x58\xce\x21\x77\x32\x12\xdb\x2d\xe0\x3c\xb4" + "\xd8\xe6\x48\x6c\x73\xa7\x95\xe0\x5c\xfe\xe2\x17\xd0\x87\x73\x17" + "\x11\xb6\x09\x1a\x6c\x33\xd8\x3a\x55\x23\x9f\xd3\xbf\xdf\xed\xf9" + "\x6f\xfc\x36\x05\x7a\x0b\x9b\xef\x2a\x17\x54\x7b\xaa\xf0\xdb\x58" + "\x07\x3c\xfb\xb3\xb8\x8b\x30\xba\x23\xfd\x4d\x56\x3b\xa1\x13\x9c" + "\xeb\x60\x1b\x69\x1d\xdc\xb7\xff\x01\x12\x9c\xfb\x0e\xe7\xbb\x7d" + "\xb3\x48\x03\x3d\xae\x83\xed\xa9\xc2\xb8\x1f\x8b\xb1\x0e\x96\xcb" + "\x64\xd1\x65\xc2\xf8\x6f\xd2\xb5\x11\xbb\xcf\xec\xc9\xb8\xe7\x00" + "\xf9\x9f\x6e\x03\xfe\x5f\xb3\xa2\xdf\x26\x8b\x29\xf3\x3a\x41\xfb" + "\xc5\xd6\xa1\x93\x0f\xe4\xff\xec\xb7\x96\xa6\x8e\x94\xff\xb3\xc7" + "\x88\xff\xb3\x6f\x81\xf6\xff\xd0\x8b\xf6\xff\x70\x8c\xda\xff\xc3" + "\x5b\xa0\xfd\x21\x5e\xb4\x3f\x64\x8c\xda\x1f\xe2\xb6\xfd\x8f\x4f" + "\x15\x28\xdb\x8b\x12\x50\xc2\x62\xe1\x70\x7d\x35\x67\x27\xee\x3b" + "\x61\x67\xbd\xc4\x7b\xc2\xcf\x7e\x29\xfb\xdd\xab\xfa\xdd\xab\xfb" + "\xdd\x07\xf5\xbb\xd7\xf4\xbb\x0f\x96\xee\x41\x8f\xf8\x5e\x91\xcd" + "\x99\x04\x76\x69\xa6\x59\x36\x67\x9f\xf8\x7c\x26\xfa\x35\x03\x9d" + "\x3e\x73\x88\x18\x9c\x77\x5d\x92\x3d\xc0\xce\xa0\xd0\xcd\xd3\x74" + "\x74\x43\x26\x11\x72\x13\x93\x17\x6f\x04\xd9\x05\xfc\xa3\xbd\x9a" + "\x71\x60\x23\xdc\x89\xbe\xf3\x70\xdf\x81\x36\x09\xf7\x93\x3c\xe0" + "\x8b\xed\x7b\xc0\x60\x24\x82\xcf\x6c\xb6\x9e\x2f\xe4\x25\x26\x5b" + "\x7c\x66\x4f\xa3\xaf\x57\x44\xe5\xcb\x05\x65\x7e\x96\xa0\xdd\x68" + "\xa1\x96\x85\x57\x41\x0e\x75\xa1\x3f\x7b\xe0\x71\x32\xb5\x18\x93" + "\x2e\x43\x7d\x1f\x48\xac\x49\x83\xb2\xe1\x3b\xf0\x2d\x18\xc7\x25" + "\x2e\x31\xd9\xea\x70\x7c\x94\x5c\xdb\x59\x45\x30\xce\x91\x58\xa6" + "\x81\xfa\x27\x2e\xc1\x32\x07\xb5\x4f\x73\x4b\x9a\xe1\x9b\x3f\x5d" + "\xaa\x53\xe0\xfe\x80\xa0\x91\xf1\xf4\x81\x02\xb7\x76\x6f\x6e\x69" + "\x2c\x2f\x57\xe9\x4d\xb9\xad\x43\x94\x2b\xd6\x57\xed\x45\xb9\x0f" + "\x46\xb8\x2f\xb7\x4c\xac\xaf\xd6\x9b\x72\x8b\x86\x28\x57\xac\x6f" + "\x84\x37\xe5\xba\xf5\x7f\x42\x73\xcb\xc5\xfa\x66\x7a\x51\x6e\xe8" + "\x02\xf7\xe5\x96\x34\x7b\x87\x85\xd0\xe2\xa1\xb0\xe0\x1d\x0e\x42" + "\x87\x68\x7f\x69\xb3\x77\x18\x78\x68\xfe\x50\x18\xf0\x8e\xff\x0f" + "\x0d\xc9\x7f\xef\x78\xff\x50\xdb\x50\xbc\xf7\x8e\xef\x3f\x72\x8b" + "\x7f\xb4\xe5\x81\xf7\xe5\x34\xa0\x22\x42\xc8\x4f\x2c\x17\x02\x4a" + "\x76\x6d\x16\x22\xc8\xe3\x20\xc3\x02\x8b\xc8\xa4\x08\x36\x3e\xfe" + "\x51\xfd\xc6\x62\x22\x87\xf1\xae\xfc\xed\x0d\x0d\x72\x93\x2d\x1c" + "\x75\x8e\x7d\x77\x8a\x55\x76\x1f\xa4\x1f\x06\x9d\xd5\x09\x76\x27" + "\x2f\x27\xb1\x3c\x3f\x3d\x82\x88\xbe\x3c\x3a\xf1\xec\x72\x24\xc8" + "\x31\x53\x91\x15\xf7\xad\x4c\x82\xf7\x6c\x80\x5f\x28\xc3\x4a\xde" + "\x15\x2c\xb2\x88\x24\x96\xcf\xc2\xce\xec\xe5\x97\xec\xa2\x19\x3a" + "\xf4\xe9\x68\x69\x91\xfd\xf8\x11\x1f\x0b\x91\xa3\xef\xa5\xee\xec" + "\x1f\x87\x9b\x65\x61\x3a\xf1\x8c\x6a\x1b\xf3\x3d\x0a\xf5\xc5\xf3" + "\x9f\x98\x17\x7d\x90\x3e\x60\x20\x72\xf4\x0b\x0f\x79\x63\xd1\x1f" + "\xe9\x50\x67\xbd\xed\xb9\x7b\xb6\xe0\xfb\x34\x17\x74\xe8\x65\x22" + "\xc7\xf3\x9d\x34\x38\x9e\xe4\xc3\x18\xe2\x89\xfb\x71\xce\xa3\x9d" + "\xa4\x6f\xa4\x02\xce\x3f\x51\xd5\xce\x70\xdc\x1b\xc7\xf7\x8d\x87" + "\xb1\x73\x1f\xa2\xec\x9f\x76\x09\xee\xd9\x38\x06\xf7\xc6\xa8\x12" + "\x75\x34\xdf\x3f\xa2\xb6\xb3\x9d\xc5\x31\x6a\x92\x85\x31\xbf\x90" + "\x1d\xaa\x3d\x99\x9d\xaa\x3d\x39\x50\x2f\x9b\xd4\x06\xfc\xbe\x94" + "\x8e\xe3\x36\xcc\xd7\x9d\x1d\x16\x2c\x9d\xfd\x76\x13\x13\x7c\x72" + "\xa4\x86\x5a\xfa\xfc\x7d\xc8\xe6\x6e\x42\xda\x83\xad\x90\xda\x99" + "\xa1\x9b\xc1\xe7\x31\xc2\x2a\x70\x3c\x0c\xf5\x8e\xe5\x63\xd3\xc4" + "\x58\xe6\x1b\x18\x74\xc0\x52\x9d\x7c\x84\x76\x6b\x18\xd3\xff\xc6" + "\x19\xa8\x23\xe7\xc6\x43\xf9\xff\x0a\x6d\xe2\xf1\xcb\x72\x13\x53" + "\xd9\x99\x47\x59\x18\xee\xe3\x49\x85\x7b\x2d\xe6\x83\xe7\x6d\xe2" + "\xf3\x4c\xa7\xe7\x99\xb8\x57\x92\x3f\x9f\x2b\x8e\xe5\x12\xb7\x38" + "\x3d\xdf\x62\x98\x81\x73\x13\x73\xc3\xb0\x0d\x40\xc7\x18\xd4\x6d" + "\x7d\xfe\x4b\xfc\x13\x63\xc4\x7c\xc9\x6d\xb2\xb9\x8b\x3a\x00\x5b" + "\xf0\x3c\xcd\xe9\xfd\xb4\x23\xa9\xa1\xe4\xf1\x12\xa4\xe1\xdc\x18" + "\xb3\x7c\x97\x8e\x8f\x67\xc3\x12\x58\xdb\x55\x89\xd1\xce\xe5\x99" + "\x65\x73\x43\xa0\xcc\xe8\x4e\xb0\xa3\x20\xcf\x12\xfc\xa6\x33\xbd" + "\xa5\x93\x97\xda\xd8\xc4\x95\xda\x55\x6b\x5f\x5c\x83\x27\xe7\xfc" + "\x5c\xf6\x38\xaa\xf1\x6c\xa9\x90\xbb\x4b\x6f\x2a\xc2\xb3\x6e\x6a" + "\x76\x46\xbc\x10\xf7\x4d\x05\xec\x2d\xb7\xe7\xef\x0d\x15\x02\x76" + "\x46\x19\x37\x3c\x46\xae\xc8\xe6\x5e\xc5\xf6\x9a\xb4\x84\xe4\xbe" + "\x86\xfe\x45\x3e\x86\xb4\x87\x99\x4f\x54\x8c\x77\xc5\xc6\xec\x1b" + "\x94\xa4\x52\xdb\xce\xc6\xfd\xf0\xec\x11\x36\xc7\xd1\x45\xe4\xb6" + "\x2c\x25\xf9\x9f\xf4\x3a\xf9\x21\xc1\x2c\xff\x1f\xa1\x81\xed\xd3" + "\x3d\xa2\xa9\x22\x0f\xa6\x2a\x31\xb6\xa3\xfc\x6f\x30\x96\xc6\xe7" + "\xf8\x4c\x3a\x8b\x00\xef\xe7\xb1\x3d\xbb\xf7\xf2\xff\x33\x8a\xe8" + "\xf9\x23\x1a\xd1\x97\x86\x6c\xee\x79\xac\x2b\xfa\x19\x01\x3a\x5e" + "\xc0\xfa\x01\x2d\x9a\x7d\x8a\xd9\xde\x65\x15\xe4\x3f\x2e\xe4\xed" + "\xd2\xa3\x3c\xb0\x65\xcf\x2d\xa2\x59\xaa\x5e\x3c\x77\x57\x2c\x9e" + "\xc5\xeb\xce\x7e\xf8\x90\xd3\x19\x53\x55\x87\x9c\xfc\x1c\xd2\xea" + "\xa4\xb3\x0d\x18\x7f\xcd\x9d\x7c\xb1\x82\x8d\x77\x3d\x58\x9f\x23" + "\xa8\x76\x01\x2f\x76\xe9\xab\x40\x12\x07\x1a\x70\x3f\x6b\x0f\xd4" + "\x25\xbc\x8a\xfa\xef\x8a\x4e\xc7\x3e\x9d\xbf\x33\xea\x4f\xb8\xef" + "\x0f\xe8\xb8\x0f\xf7\xf9\x01\x2d\xdf\x82\xfb\x8f\x17\x54\x10\xed" + "\xd3\x68\x3b\xfd\xcb\xa3\xbf\x8c\xa5\xb6\xd9\x51\x46\x52\xdd\xfc" + "\x17\xf2\x49\x7d\x15\x51\x2d\x23\x3e\x19\x66\x6a\x67\x6d\x4c\x26" + "\xf2\x48\x33\xf1\x49\xef\xc2\x3e\x6d\x27\x78\x7e\xa0\xd6\x5a\x03" + "\xf6\x90\x21\xe1\xed\xf4\x56\x5f\xed\x62\x42\xa0\xef\xb1\x35\x66" + "\x76\xce\xc7\xc2\xce\x4d\xfb\xe3\x7c\xb7\xd3\xf9\x1e\x6b\x5a\x0c" + "\x15\x36\x5e\x26\xca\x1a\xfd\x59\x12\x19\xe3\x43\xd9\xf9\x9e\x54" + "\xc8\x68\x01\xde\xbf\xa4\x0b\xb0\xbf\xa4\x9b\xfc\xfa\x35\x12\x54" + "\x9b\x6c\x06\xdb\xac\x8a\xbc\x99\x44\x82\x68\xb7\x7e\x42\x75\xd5" + "\xc7\x84\xe6\x13\xf5\xbb\xe9\x46\x5f\xbb\x92\xef\xaf\x0a\xdc\x24" + "\xc3\xf9\xcd\x80\x5c\xdc\x67\x75\x8d\x84\xae\xb8\x90\xc9\xe6\x64" + "\x71\xfe\xdb\xd6\xad\xd3\xf6\x76\xeb\xee\xed\x79\x49\x37\x43\x9a" + "\x37\x7f\xf6\xb2\x1a\xd7\x09\xa2\x69\xf6\xfd\x99\xb8\xb7\x0f\xc7" + "\x01\x36\x7f\x85\x06\xe7\xc8\x11\xc3\xf0\xfd\x60\x61\x95\x8e\x80" + "\x85\x80\x67\x8f\x70\xde\x5e\x5d\xfa\x1c\xd6\xb5\x9d\xb0\xbd\x42" + "\x13\xf8\x5e\x21\x2b\xae\x59\xab\xf6\x34\x2c\x8a\xd7\x92\x9e\xe9" + "\xfa\x1c\x53\xea\x9f\x48\xc6\x75\x7a\x9e\xd9\xf1\xa9\x80\xdb\xec" + "\x87\x5b\xa9\xff\x9e\x86\xa3\xba\x53\xa8\x4f\xc2\x46\x2e\x1f\xc2" + "\xd9\xfa\x2f\xd2\x06\xf8\x54\xbe\xaf\x1d\xf9\xb6\x33\xea\xbf\x93" + "\x2c\xf2\xa7\x9a\xa9\xad\x26\xf6\x4f\xe4\x93\x86\x3a\x17\xfe\x30" + "\x7e\x42\x3e\xe4\x13\xf2\x08\x79\xe5\xe0\xd3\x29\xc6\xa7\x7d\x02" + "\xe7\x53\x8f\xaa\xa4\x5c\xe2\x95\xb5\x58\x5f\xe4\x09\xbf\xaa\x9b" + "\x07\xe7\x17\xd0\xb9\x8f\x5f\x6f\xb4\x93\x20\x53\x1b\xd8\xcb\xc0" + "\xaf\xa7\x7e\x45\xc8\x53\x6f\x51\xa1\x66\xc1\x89\x3e\xbe\xd9\x72" + "\xdc\xf0\xed\xa2\x83\x6f\xc0\xff\x21\xf8\x36\x5b\x31\x12\xbe\x55" + "\x37\x73\xbe\xd9\xc4\x3d\x5e\xba\x4a\x22\xb7\xbe\xa4\x93\x17\x5d" + "\x23\xe1\xc8\xbf\x85\x17\xb4\xe4\xe8\x92\x1a\xe0\xd9\x5f\x5c\xf8" + "\x27\xe4\xed\x49\x05\x1e\x14\x20\x0f\xbd\xeb\x77\xf3\x22\x3c\xef" + "\x77\x3f\x7d\xff\x76\xbf\x1b\xab\x7e\xf7\xd3\x98\xd1\xf5\xbb\x79" + "\xaa\xdb\xfd\xee\xdb\xee\x77\xf3\x94\xfd\xfb\x5d\x9f\xdd\x90\x14" + "\x97\xb8\x32\x7e\x0d\x1e\x4f\x7c\x6e\x7d\x72\xdc\x3a\x6e\x3d\xb8" + "\xd8\x0f\x1a\x7b\x7a\x84\x1c\xfd\xde\x55\x17\xd5\x91\x77\xa7\xd5" + "\xc9\xed\x5f\x69\x14\x34\x77\x5a\x8c\x90\x1b\xdc\x8a\xfe\x4b\xb1" + "\x7f\x16\xa2\x5f\x0f\xd9\x63\x07\x6a\x83\x79\xac\x50\xfc\x9f\xd9" + "\x4e\xc1\xf1\x1a\x5c\xaf\xd9\xbc\x81\x28\x36\xe3\x19\x6d\x2b\xce" + "\x8b\xb0\xe7\xd3\xd1\x9f\x23\x2d\x89\xd7\xa0\x5f\x9e\x4e\x55\xa2" + "\x76\x0b\x94\x65\xf1\xdf\xa5\x57\x68\xf1\xcc\xc5\xcf\xd2\x40\xdf" + "\xef\xef\xf3\xf5\x24\x7b\xd4\x4c\xc7\x3d\x52\x87\x72\x01\xcf\xc8" + "\x5d\x91\xfd\xec\xcf\xd7\x71\xad\x03\xec\xe9\xa5\xf7\xc3\x77\xa6" + "\xeb\x8b\x98\xdf\x05\x90\x11\xfc\x79\x04\xf3\xff\x7e\x3d\x77\x27" + "\xc6\xdb\xe9\xec\x50\xed\x2d\xef\xc8\xdd\x1b\xfa\x71\x5a\x91\x28" + "\x23\x7e\x76\xf6\xa9\x22\x2e\x23\x6a\x34\x80\xc1\x85\x80\xc1\xe8" + "\xe1\x64\x84\x13\xf6\x66\x8c\x4c\x46\x20\xd6\x10\x73\x88\xb7\x89" + "\x80\x37\xc4\xa0\x84\xb9\x57\x45\xcc\x05\x36\x12\x35\xc3\x9d\x8d" + "\xe3\x0e\xcf\x3d\xd7\xa4\x3a\x30\x67\xef\x8f\xb9\x6b\xfd\x30\x27" + "\x17\x31\xf7\x92\x2b\xe6\x9e\x39\xab\x26\x6f\x72\x59\xe1\xc0\x5c" + "\x9e\x42\x23\xe1\x0d\xb1\x87\x38\x13\x7e\xab\x23\x35\x6d\xed\x7d" + "\xd8\x2b\x5d\xcd\xd7\x5b\xd9\x7e\x5e\x39\xdd\x7f\xfd\x25\x51\x56" + "\x5c\x96\x64\xc5\x1b\x6e\x74\xf4\x59\x2f\x65\x45\x04\x9b\xff\x46" + "\x5e\xf5\x00\xdf\x90\x5f\x4f\x69\x40\x46\x68\x76\x91\x4f\x96\xdc" + "\x22\xfc\x49\x1a\x1b\xfe\xa0\x3f\x5e\xa8\xcb\x20\x3c\xd2\xa9\x86" + "\xe3\x11\xf2\x07\xf9\xc4\xf8\x03\x7c\x92\xd6\xc4\x71\x8d\x14\x79" + "\x85\xfc\x79\x20\x8d\xc8\x91\x5f\xa5\x29\x5c\x3e\xa0\x1c\x60\x7b" + "\xb0\xfb\xc9\x77\xa0\x79\x18\xf2\x8c\x8d\xab\xb3\xfc\x0f\x16\xe2" + "\x19\xe2\xc9\x92\x0d\x0d\x36\xf7\x00\x1b\xfa\xb1\xa0\x3e\xdf\x9c" + "\xb2\x9f\xe5\xf0\xf1\xd1\x2e\xf1\x1c\xf1\xe3\x71\x62\x9f\x27\x38" + "\x56\x65\xe3\x52\x3b\x8c\x4b\x55\x30\x2e\xcd\x85\x71\x69\x6a\xab" + "\xe8\x3f\xe1\xb1\x95\x44\x3c\xcf\x4c\xfd\x77\x86\xc3\x98\x08\xe3" + "\x12\xf2\x35\x5e\xff\x3d\x99\xb8\x26\x45\xf3\x60\xcc\xbb\x4b\x4e" + "\xe0\x3e\xe7\xa8\xce\x3e\x42\x1c\x3d\x26\xee\x4d\xaa\x5f\x66\xd8" + "\x80\xfb\x1b\x1e\x8f\xe2\xf5\xfb\x19\x8b\x5d\xc1\xd6\xff\xe4\x42" + "\xb9\x7d\xb3\xeb\xfa\x9f\xf3\xfa\xf0\xbb\xe9\x16\x71\xed\xef\x71" + "\xb6\xf6\x87\x32\x04\xe5\xde\xdb\x30\x86\x71\xac\xff\x9d\xc0\xe7" + "\x3f\x71\x5d\xff\x7b\x9c\xe9\x3b\xb3\xec\xf1\x58\xdc\xf3\x02\xf7" + "\xe2\x7a\xda\xcf\xc2\x9d\xd3\x1d\xeb\xeb\x3c\x5d\x90\xb3\xd8\x2f" + "\x38\x3f\xd0\xc6\xe7\x05\x1e\x4f\x93\xc6\xdf\x6e\xec\xa5\x11\xc8" + "\xe5\x05\x31\x0e\xb9\xbc\x20\x86\xd1\x46\x53\xb1\xa0\x66\x80\x5c" + "\xfe\x0c\x9e\xff\xe2\xd8\x62\x94\xcb\xb9\x3b\x23\x78\xfd\xe6\x4f" + "\x00\x9a\xf8\x60\x0c\x4f\x4c\xc7\xf3\x46\x28\xa3\x4b\x98\xcc\xae" + "\x08\xdf\xc2\xd6\xf8\xe7\xeb\x5c\x65\xf5\x2f\x72\x5d\x65\xf5\xfc" + "\x67\x87\x96\xd5\xff\x36\x75\x68\x59\x3d\x7f\xdb\x6d\x59\x3d\xd6" + "\xb2\x5a\xb2\xeb\xbc\x95\xd5\x4f\x34\xdf\x96\xd5\x37\x5b\x56\x3f" + "\x61\x76\x92\xd5\x7f\x74\x95\xd5\xbf\xd8\x37\x50\x56\xff\xc2\xe8" + "\x90\xd5\xf3\xc3\x5c\x65\xf5\x93\x93\x3c\x93\xd5\x0b\xfc\x6f\xac" + "\xac\x5e\x10\xe2\x2a\xab\x17\xd8\x44\x5d\x72\x7c\xe4\xb2\x7a\xc1" + "\xd9\xa1\x65\xf5\x82\x0b\xae\xb2\x7a\xc1\x41\x2e\x93\x9f\x54\x73" + "\x59\xbd\xa0\x5a\x94\xe1\x75\xce\xe9\x0e\x59\xcd\xd3\x07\xca\xea" + "\x27\x75\xc3\xc8\x6a\x9d\x5d\x90\x64\x75\x03\xc8\xea\x06\xb9\xf0" + "\x5b\x77\xb2\x7a\x71\x6c\x0d\xca\xea\x24\x94\xd5\x8b\x63\x87\x96" + "\xd5\x8b\x6a\x50\x26\x33\xbf\x9e\xaf\xd1\x66\xe6\x57\xf1\x35\xda" + "\x8a\x38\x5d\x9c\x06\xe9\x90\x86\xfe\x27\x31\x1f\xe7\xbd\x24\xd3" + "\x9f\x3c\xdb\x27\xd3\x21\x9f\x30\xd5\x21\xd3\x51\x9e\xa3\x5c\x2f" + "\x79\x8d\x9a\x4b\x5f\xa3\x8d\xdd\xd9\x4f\x29\x24\xd9\x9e\x07\x69" + "\x18\xab\x09\x7d\x1f\xe1\xfe\x48\xa0\x41\xf3\x66\xf8\x1e\xe6\x87" + "\x7c\x21\xae\x3a\x60\x51\x81\xab\x0e\x78\x6a\xe5\xd0\x3a\x60\xe1" + "\xf4\xa1\x75\xc0\x53\x79\xb7\x75\xc0\xad\xa6\x03\x7e\xd9\x7a\x5b" + "\x07\x0c\xaf\x03\x06\xe3\x51\x7f\x1d\x30\x47\xd4\x01\x25\xc3\xea" + "\x80\x5f\x36\xbb\xd7\x01\x8b\xf6\x0f\xd4\x01\x8b\x2a\x1d\x3a\xe0" + "\xa9\x70\x57\x1d\x10\x79\x87\x67\x3a\x60\xf1\xa4\x1b\xab\x03\x16" + "\x87\xba\xea\x80\x48\x71\x0d\xe0\xc9\x8d\xce\x3a\x40\xf0\xf1\x44" + "\x07\x2c\x3e\x2f\xe9\x00\x94\xb1\x6f\xe3\x7a\x43\x9f\x0e\x40\x59" + "\xb8\xf8\xa2\x31\xa5\xc9\x49\x07\x2c\x3e\xc4\x65\x7d\x64\x90\x9d" + "\xe9\x80\xc5\x3c\x36\xb2\xec\xc9\x34\xe7\x74\x87\x0e\xe0\xe9\x76" + "\x67\x1d\xd0\x8a\x3a\x20\x32\x64\x18\x1d\x10\xea\xb9\x0e\x58\x72" + "\xc8\xa1\x03\x96\x1c\x92\x74\x00\xca\x7d\xd4\x01\x28\xb3\x51\x0f" + "\x30\xdf\x60\x6c\x4f\xc8\x92\x59\x81\x16\xa2\x44\x9f\xc4\x38\xa7" + "\x82\xb2\x1b\xfd\x1f\xa1\x2e\x60\x79\xd6\xf0\x3c\x20\xcf\x9b\x41" + "\x86\xb7\x82\x0c\x6f\xcd\xbb\x42\x14\x90\xaf\x21\x1f\xf7\x17\xc2" + "\x3d\xca\xfa\xc0\x36\xd0\x1b\x36\xa6\x37\x1a\x50\xdf\x70\x7a\x2d" + "\x99\xe5\xaa\x3b\xa2\xa6\x0e\x36\x1e\x28\x70\xd2\x1d\xa5\x53\x68" + "\x7d\x77\x76\xd4\x3c\x49\x1f\xe4\xc3\x3d\xea\x8c\x82\x76\xa6\x33" + "\xcc\xa0\x33\x9a\xb9\xce\x88\x8a\xe9\xcb\x03\x75\x60\x79\xb8\x5e" + "\x69\x80\x3c\x8d\x62\x9e\x2d\xae\x7a\xe5\xd7\xad\xae\x7a\x25\xea" + "\x7d\xd4\x2b\xe8\x27\x97\xc5\xb8\xcf\xdb\x15\x6d\x2f\xd1\x17\xa1" + "\x8e\xe1\xcf\x9f\x7e\xb1\x4f\xaf\x4c\x71\xd2\x2b\xa9\x92\x5e\x89" + "\xba\x70\xcb\xeb\x15\xc0\x72\x4d\xda\x3f\x93\x5e\x79\x3a\xe2\x56" + "\xd0\x2b\xc8\x9b\x89\x4e\x73\xc3\xee\xf4\x0a\xfa\x95\xa8\x49\xf8" + "\xae\xeb\x95\xa7\xe7\xb9\xd7\x2b\x4b\x94\x03\xf5\xca\x92\x60\x87" + "\x5e\x89\x2a\x70\xd5\x2b\x4b\x13\x3d\xd3\x2b\x4b\xe2\xfb\xeb\x15" + "\xa4\x65\x3e\xdf\x5f\xd1\x86\xfa\xc4\x9e\xb7\x27\x53\x40\xdd\xe2" + "\x95\x5e\x59\x92\xe3\xaa\x57\x96\x46\x8b\x7a\x6f\xd3\xc8\xf5\xca" + "\x52\x36\x77\x94\x2f\xe9\x95\x6b\xfd\xf5\xca\xd2\x47\x5d\xf5\xca" + "\xd2\x20\xae\x3f\x96\x26\x70\xbd\xb2\x54\xc7\xd3\x23\x33\x9d\xd3" + "\x1d\x7a\x85\xa7\x0f\xd4\x2b\x4b\xb7\x0c\xa3\x57\x54\xbd\xc5\xfa" + "\xa2\x9e\xdc\xbd\x99\xb6\xdd\xeb\x43\x43\x96\xdd\x6d\xef\xdf\x37" + "\x78\x9f\xb0\x13\xec\x23\x7d\x6b\x5c\xff\x1f\x21\xbd\xaa\x12\xdc" + "\x4b\xcc\xfa\x46\x4f\xb0\x3e\xa7\x25\x01\xfa\x47\x9b\xfb\xfe\x01" + "\x7d\x43\x29\xf5\x8d\x1a\xfd\x05\x02\xfd\x45\x8e\x6b\x5c\x6f\x40" + "\xbf\x30\x75\x36\x30\x39\xa6\x6a\xd6\x12\xf4\x27\xe9\xdf\x46\xd4" + "\xfe\x32\xd9\xb8\x5f\xfe\x06\xfa\x1f\xf4\x91\x27\xee\xa7\xc2\xec" + "\x46\x2d\xf1\xd7\x93\x00\xec\x27\xef\x88\x6b\x28\xe8\x7f\x02\xd7" + "\x4e\x00\x9f\xa1\x2b\x8e\xf3\xfe\xf1\x06\x5c\x3d\xbc\x7f\xcc\xe8" + "\xe9\xd6\xdd\xeb\x6e\xed\xc4\x94\x6a\x66\x6b\x27\x78\x3e\x08\xcf" + "\x65\x09\xd0\x3f\x28\xae\x9d\x58\x79\x9f\x80\xfa\xaa\xcb\xd8\xda" + "\x49\x93\xcb\xda\xc9\x0f\x1b\x89\x1c\x7d\x53\xbc\xe9\xbc\x76\xa2" + "\xab\x19\xd0\x27\xb0\xaf\x60\x9f\x18\xb9\xfc\xfa\x77\x32\xd4\xfe" + "\x25\x1b\xd0\xda\xae\xda\x9b\x49\xdf\xa8\x30\xfc\x77\x93\x55\x86" + "\x7e\x3c\xed\xc0\x3b\x01\xe4\x14\x55\xf5\x93\x53\xbd\x22\x1f\x7a" + "\x39\x1f\x80\x87\xca\xe5\x9d\x84\xae\xb0\x81\xad\xd5\x2b\xfa\xf2" + "\xb4\x9a\x01\x87\xba\xc9\x25\x1b\x90\xee\x1a\x52\x22\xfa\xf3\x14" + "\x5e\xd6\x4f\x10\xf2\x71\xff\x87\x9c\xbc\x7d\xcd\xca\xd6\x1a\x73" + "\x7b\x48\x08\xc8\x25\x7f\x94\x4b\x80\x5d\xbf\xb2\x1e\xa0\xfb\x79" + "\x4e\x77\xf4\xb1\x86\xbf\xb6\x97\x75\x5a\x28\xfb\xde\xde\x5e\x90" + "\x4b\x56\x4e\xfb\xe5\x2f\xa8\x09\xf3\x01\x8a\xeb\x8d\x3d\x18\x13" + "\xa3\x81\xc9\xa5\xc5\x9d\x81\x14\x63\x85\x08\x5f\xe9\xd0\xdf\x54" + "\xf0\x83\x9d\x40\xfb\x5e\x1d\x62\x43\x5d\xda\x82\xeb\x8d\x9f\xb9" + "\xac\x37\x5a\x5e\x76\xac\x37\xd6\x56\x9c\xe2\xfb\x43\x5c\x74\xc7" + "\xd2\xa2\xde\x12\x7d\x0e\xd2\x9d\xe9\x8e\xe4\x91\xd2\x3e\x3a\xed" + "\xdb\xa3\xbd\xfa\x3b\x4e\xfb\x7f\x5f\x30\x3a\xda\xff\x66\x80\xaf" + "\xd4\x9b\x47\x7b\xe5\x77\x9c\xf6\xd1\x95\xa3\xa3\xfd\x33\xc9\x43" + "\xd1\x1e\xc7\x1e\xd2\xb8\x43\x1a\x73\xa0\x1e\xe3\x7a\x78\xb9\xd2" + "\x31\xde\x58\xae\x94\xd6\x6d\x81\x66\x8a\x3c\x71\xbe\xc9\xb0\x9a" + "\xdc\x7d\x49\xf6\xec\x46\x69\xcd\x16\xed\x7d\xc6\xc7\x37\x80\x8f" + "\x6b\xf0\x7c\x8f\xc8\x43\xd0\x39\x2b\x3a\x41\x2f\x4c\xd7\x17\xd9" + "\xf3\x40\x27\xfd\x71\x7d\xa8\x1b\x7e\xca\x51\x9f\xf8\x27\x13\xf5" + "\x72\x83\x83\xaf\xc2\xcb\xc0\xcf\x1e\xb0\xb3\xac\xad\x04\xcf\xec" + "\x06\xb6\x02\x1f\x7b\xf5\x13\x96\x81\x3d\x2f\xf1\xf4\x9d\x14\x2b" + "\xb3\xb1\x06\xe5\xe9\xeb\xae\x3c\xed\x18\x84\xa7\xcf\xc6\x43\x3f" + "\x95\x8b\x76\x30\xe3\xa9\xb9\x8f\xa7\x4c\x8f\xbc\xac\x0b\x46\xbe" + "\x4a\x3c\x45\x3d\xc2\x78\xda\xc6\xf5\x48\x9f\x7f\xa3\x97\x1d\x76" + "\x70\x75\xcc\xd9\x41\x78\xfa\x1f\x11\x2e\x3c\x8d\x19\x29\x4f\x9f" + "\x5d\xe0\x6a\x57\x2d\x7f\xcf\x33\xbb\xea\xd9\xa3\x68\x3b\x39\xdb" + "\x55\x78\xdf\x01\x63\x75\xbb\xff\x9e\x2d\x9d\x5e\xd9\x52\xcf\xd6" + "\xbb\xda\x52\xcb\xcb\x79\x9d\x9e\xb9\x3a\x72\x5b\x6a\x39\xb3\xbf" + "\xde\x7e\x83\x8f\x81\x5d\xed\xa8\xe5\xdb\x5c\xed\xa8\xe5\xcb\xb8" + "\xbd\xb4\xfc\x40\x47\x16\xda\x51\xcb\x0d\x3c\xfd\x19\x8b\x73\xba" + "\xc3\x8e\xe2\xe9\x1d\xe8\xf3\x2d\x7b\xb9\x71\x64\xb6\xd3\x9d\xdf" + "\xb2\xed\xa4\x19\xc2\x76\xd2\xfc\x93\xd8\x4e\x31\xf3\x6e\xeb\x6f" + "\x6f\x75\xc8\xf2\xfa\xd1\xe9\x90\x95\x6e\xfd\xbf\xdc\xd6\xdf\xc3" + "\xd1\x3e\x66\xcb\xe8\x68\xbf\x2a\xcc\x7b\xfd\x1d\x57\xe5\xd0\xdf" + "\x71\x55\xee\xf5\x77\xdc\x23\xb7\xf5\xf7\x48\xf4\xf7\x73\x64\x74" + "\xfa\x3b\x4e\xe9\xaa\xbf\x57\xbf\xe8\x99\xfe\x8e\xdb\x3a\xf6\xfa" + "\x3b\xae\xd0\x55\x7f\xaf\x16\xfd\x3d\xac\xfa\xf3\xc8\xf5\xf7\xea" + "\x47\xdd\xeb\xef\xd5\x4f\xba\xea\xef\xd5\x3c\x06\xa8\x6c\x75\x32" + "\xd7\xdf\xab\x43\x79\xfa\xaa\xfd\xce\xe9\x0e\xfd\xcd\xd3\xb9\xfe" + "\x5e\x9d\x39\x32\xfd\x1d\xf8\x2d\xeb\x6f\xf5\x10\xfa\x5b\xfd\x4f" + "\xa2\xbf\x7f\x3b\x54\x0c\xc1\xdb\x3a\x64\x48\x1d\xb2\xba\x70\x74" + "\x3a\x24\xde\x6d\xfc\xb3\xe1\x75\x48\x82\xca\xa1\x43\x12\x54\xee" + "\x75\xc8\xf3\x9b\x6e\xeb\x90\x91\xe8\x10\xfd\xfc\xd1\xe9\x90\xe7" + "\x17\xba\xea\x90\x84\xf7\x3d\xd3\x21\xcf\x1f\x1b\x7b\x1d\xf2\x7c" + "\x83\xab\x0e\x49\xd8\xcd\xeb\x14\xdf\x35\x72\x1d\x92\xb0\xd5\xbd" + "\x0e\x49\xc8\x73\xd5\x21\x09\x31\x5c\x57\x24\x1c\xe4\x3a\x24\x21" + "\x99\xa7\xc7\x77\x3a\xa7\x3b\x74\x08\x4f\xe7\x3a\x24\xa1\x72\x64" + "\x3a\x64\xfc\xb7\xac\x43\x94\x43\xe8\x10\xe5\x3f\x89\x0e\x59\x33" + "\xe4\xf9\xdf\xa1\xe5\x98\xa1\xde\x21\xc7\x0c\xf5\xee\xe5\x98\xe1" + "\xc9\xdb\x72\x6c\x24\x72\x2c\xa1\x61\x74\x72\xcc\x10\xe4\x2a\xc7" + "\x5e\xd8\xe4\x99\x1c\x33\xfc\x7e\xec\xe5\x98\xa1\xdc\x55\x8e\xbd" + "\x90\xc0\xeb\xb4\xe6\xc3\x91\xcb\xb1\x17\x16\xb9\x97\x63\x2f\x2c" + "\x75\x95\x63\x2f\xe8\xb8\xbc\x7a\x21\x93\xcb\xb1\x17\xe6\xf1\xf4" + "\x35\x87\x9c\xd3\x1d\x72\x8c\xa7\x73\x39\xf6\x42\xee\x70\x72\x0c" + "\xfb\x45\x8d\xa6\x5f\xbf\x78\x5e\xea\x17\xeb\x6c\x9f\x14\x4b\xfd" + "\x62\x1d\xb3\xd1\x84\xe2\x78\xcd\x2b\x29\x44\x91\x8b\xf1\x5a\x40" + "\x46\x18\xfe\x03\xfb\xc5\xba\x17\x70\x7f\x89\xaa\x11\xe4\x5e\xb3" + "\x28\x07\x53\x41\x0e\x36\xc3\x3d\xfa\x32\x9b\x1e\xaf\x41\xf9\x85" + "\xfb\x34\xf0\x9e\xcb\x43\x8b\x2f\xc6\x8b\x61\xeb\xec\x4e\xfd\x86" + "\xf5\x95\x0e\xb1\xaf\x74\xf0\xbe\x22\x9d\x97\x4b\x6b\xa6\x82\x7d" + "\x9d\x6e\x72\x64\xac\x0f\xc5\xfe\xc3\xce\x61\x41\xff\xa1\xeb\x74" + "\x01\xc5\x49\xd0\x67\x2c\xad\x04\xfd\xd5\x63\x9f\xf1\xdf\x24\x0b" + "\xa0\x1d\xfa\x09\x20\x13\xb9\xec\x13\xaa\x7c\x6d\xe8\x7b\x6a\x1d" + "\xc8\xbe\x76\x90\x7d\xed\x8e\xbe\x82\x6b\xe7\x1d\xeb\x74\xda\xce" + "\x75\xba\x19\xbd\x1d\x20\xfb\x2c\xfd\xfb\x89\x4e\x55\xd6\x8e\xb2" + "\xaf\x95\xf5\x13\x26\xfb\xa0\x6f\x08\x1d\x20\xfb\x7e\x2b\xca\xbe" + "\x0e\x1d\xca\x7a\x75\xd9\x6a\x90\x7d\x31\x97\xb8\xec\x13\x6d\xb8" + "\xfb\x50\xf6\xad\xd3\xc9\x5f\x6d\x17\x65\xdf\x4a\x94\x7d\x47\xa1" + "\x8f\x7c\xe0\x2a\xfb\xfc\xbd\x95\x7d\xeb\xe6\xb9\xf6\x93\xe4\xb7" + "\x3c\xeb\x27\xeb\xde\x77\xd7\x4f\x7a\xf3\xbc\xed\x27\xeb\xaa\x5c" + "\xfb\x49\x72\xa1\xd8\x77\x4f\x8d\xbc\x9f\x24\xbf\xd8\xd7\x4f\x9e" + "\xef\xdf\x4f\x92\x37\xba\xf6\x93\xe4\x28\xde\x1f\x92\x2b\x78\x3f" + "\x49\x8e\x15\xfb\x4f\xbd\x73\xba\xa3\x9f\xf0\x74\xde\x4f\x92\x0f" + "\xdc\x5e\x2f\xff\xae\xe9\xfb\x94\xd0\xdb\xeb\xe5\xde\x8e\x19\x93" + "\xab\x46\x37\x66\x7c\x69\xdf\xed\xf9\x76\x6f\x69\x9f\x92\x3a\x3a" + "\xda\xaf\xd7\xdd\x9e\x2b\xf1\x96\xf6\x2f\x75\x8e\x8e\xf6\x1b\x76" + "\x0f\x37\xc6\x70\x6f\x4b\x6d\x8c\xaa\xee\x1b\x63\x6c\x8c\x92\xf6" + "\xe7\x0e\x1c\x63\xa4\x1d\x75\x3d\x4b\xf7\xf2\xd2\xfe\x7b\x67\x87" + "\x1b\x7b\xd8\x6e\x8f\x3d\x80\xd7\xeb\x0d\xa3\x1b\x7b\xa4\xf5\xdb" + "\x9f\xb8\xd1\xee\x99\x4d\xb5\xd1\xdf\x9d\x4d\x65\xf3\x7a\xec\xb1" + "\x31\xd8\xd5\xa6\xda\x28\xfa\x89\x7d\xf9\x9e\x91\xdb\x54\x1b\x8f" + "\xb9\xb7\xa9\x36\x1e\x77\xb5\xa9\x36\xee\xe6\xb6\xd3\x46\x1b\xb7" + "\xa9\x36\x1e\xe4\xe9\x2f\x6b\x9d\xd3\x1d\x36\x15\x4f\xe7\x36\x55" + "\xba\xf2\xf6\x3a\xfa\x77\xcd\xa6\xca\xd8\x72\x5b\xaf\x7b\xab\x5b" + "\xd2\x83\x47\xa7\x5b\x36\x7d\x8b\xfb\x3f\xbf\xeb\x7a\x3d\xa3\x7a" + "\x74\xb4\xcf\x1a\x72\xff\xe7\xd0\x7a\x7d\xab\xce\xa1\xd7\xb7\xea" + "\xdc\xeb\xf5\x2d\x25\xae\x7a\x7d\xf3\x9c\xdb\x7a\xdd\x1b\xbd\xbe" + "\x69\xc1\xe8\xf4\xfa\x16\xbd\xab\x5e\xdf\x7a\xca\x33\xbd\xbe\xe5" + "\xc2\xd8\xeb\xf5\x2d\x9d\xae\x7a\x7d\xab\x91\xd7\x29\xeb\xfa\xc8" + "\xf5\xfa\xd6\x9d\xee\xf5\xfa\xd6\xb7\x5c\xf5\xfa\x56\xf1\x9c\xda" + "\xd6\x7a\xae\xd7\xb7\x16\xf0\xf4\x2c\xab\x73\xba\x43\xaf\xf3\x74" + "\xae\xd7\xb7\x9a\x6f\xaf\xaf\x7f\xd7\xf4\xfa\xff\x59\x76\x5b\xb7" + "\x78\xab\x5b\xb6\x8e\x72\xcc\x98\xd3\xe0\xbd\x6e\x79\x65\x8b\x43" + "\xb7\xbc\xb2\xc5\xbd\x6e\xd9\x7e\xdd\x55\xb7\x6c\xdb\x76\x5b\xb7" + "\x78\xa3\x5b\xfe\xcf\xee\xd1\xe9\x96\xed\x95\xae\xba\x25\xf7\x21" + "\xcf\x74\xcb\x2b\x8f\x8e\xbd\x6e\x79\x25\xca\x55\xb7\xe4\x06\x8b" + "\xd8\x58\x3a\x72\xdd\xf2\x8a\xdd\xbd\x6e\xc9\xf5\x75\xd5\x2d\xaf" + "\x34\x70\x1d\x92\x1b\xca\x75\xcb\x2b\x6d\x3c\x7d\xdb\x12\xe7\x74" + "\x87\x6e\xe1\xe9\x5c\xb7\xe4\xce\xbb\xbd\xee\xfe\x5d\xd3\x2d\x79" + "\x43\xee\xff\x1d\x5a\xbe\x15\xc4\x3a\xe4\x5b\x41\xac\x7b\xf9\xb6" + "\xe3\x8c\xab\x7c\xcb\x8f\xbf\x2d\xdf\xbc\x91\x6f\xb9\x51\xa3\x93" + "\x6f\x3b\x76\xbb\xca\xb7\xdf\x7b\xe8\x0f\xa8\xe0\x9e\xb1\x97\x6f" + "\x05\xfd\xfc\x3f\x14\x88\x3e\x80\xf2\xe7\x8e\x5c\xbe\x15\x9c\x75" + "\x2f\xdf\x0a\x2e\xb8\xca\xb7\x02\xd1\xff\xcf\xef\xd5\x5c\xbe\x15" + "\x88\xfe\x7f\xf2\xc3\x9c\xd3\x1d\xf2\x8d\xa7\x73\xf9\xf6\xfb\xe0" + "\xd1\xad\xc7\xbf\xba\xdb\xb1\x1e\xff\x2a\xe3\x85\x50\x54\xb1\x60" + "\xe0\x7a\xfc\xab\x53\x71\x3d\xde\xd1\x5f\x7e\x5f\xc2\xd6\xe6\xb1" + "\xcf\x74\x72\xff\x3d\x83\xae\xd3\x4f\xad\x58\x70\x7b\x9d\xfe\x46" + "\xae\xd3\xff\x67\xb3\x6b\xff\x29\xfc\x95\x67\xfd\xe7\xd5\x95\x63" + "\xbf\x4e\xff\xaa\xc1\xb5\xff\x14\xce\x13\xb1\x12\x37\xf2\xfe\x53" + "\x38\xdd\x7d\xff\x29\x9c\xe5\xda\x7f\x5e\x15\xc7\x98\x85\x51\xbc" + "\xff\x14\xaa\x78\xfa\xef\x63\x9d\xd3\x1d\xfd\x87\xa7\xf3\xfe\x53" + "\xb8\xcc\x13\xfb\xc0\xa6\xda\xbb\x05\xf5\x7d\x48\xe3\xdd\xf6\x3e" + "\x9c\x27\x8b\x38\x1f\xcc\x3e\x78\x8e\xeb\x0b\x66\x1b\xec\x5e\x1f" + "\x36\xac\x7d\xd0\x2c\xda\x07\xb1\x03\xed\x03\xc9\x36\x28\x06\x7c" + "\xbf\xe1\xd1\x1a\xbd\x88\x77\xb4\x0d\xae\x8d\xd4\x36\xf8\xa1\xc3" + "\x36\xc8\xeb\x67\x1b\xfc\xb6\x9f\x6d\xc0\xf0\xde\xe4\x82\xf7\x01" + "\xb6\x41\x1f\xde\xc7\xca\x36\xf8\x43\xfd\xed\x35\x7a\x6f\xc7\x9d" + "\x85\x86\xd1\x8d\x3b\xff\x2b\xea\xf6\x5c\xbe\xb7\xb4\x7f\x6d\x94" + "\x73\xf9\x45\xd5\xb7\xe7\x5b\xbc\xa5\xfd\x7f\x8d\xd2\x97\xc3\x1b" + "\x6e\xe3\x3f\x0d\x6f\x5f\x95\x04\x39\xc6\x23\x25\x41\x92\x7d\x25" + "\xf9\x46\x04\xf9\xac\xc8\x4b\x82\xeb\x1a\x21\xaf\x24\xb1\x38\x03" + "\x4a\x53\xf3\x29\x62\x48\x47\x9b\xab\x78\x5b\x64\xaa\xb3\xcd\xf5" + "\xa6\xbf\x64\x6f\x45\xa2\x2d\x06\xb6\x15\xda\x55\xd2\x18\x04\xfd" + "\x5a\x0d\xb9\x7f\x78\xd6\xfa\x30\x1c\xb3\xf4\xfa\xef\xdd\xf2\xcf" + "\x3b\x5e\x79\x3d\x68\x74\xe3\x95\xe2\x25\xae\xf6\x56\xc9\x61\xcf" + "\xec\xad\xe2\xe3\x63\x3f\x5e\x29\x36\xbb\xda\x5b\x25\xfb\x78\x9d" + "\xde\x38\x3a\x72\x7b\xab\x24\xcf\xbd\xbd\x55\xf2\x07\x57\x7b\xab" + "\x44\xcf\xed\xaa\x12\x23\xb7\xb7\x4a\xd2\x78\xfa\x1b\x95\xce\xe9" + "\x0e\x7b\x8b\xa7\x73\x7b\xab\xa4\xda\x43\x7b\x2b\x67\x14\xf6\x56" + "\xf8\x77\xc7\xde\x0a\xb9\xc5\xed\xad\x32\xb7\xf1\xdf\x9c\xf4\xce" + "\x96\x7e\x7a\x27\xec\xb6\xde\x41\x59\x53\x62\x1e\x9d\xde\x29\x37" + "\x0e\x4b\xfb\x5c\x27\xda\xa3\xcc\x17\xe9\x6e\x9f\xb9\x3e\xcc\x6b" + "\xda\x83\xac\x2f\x49\xff\x2e\xd3\xbd\x2c\x77\x74\x74\xdf\xe5\x36" + "\xfe\xf1\x6d\x5b\x6b\x38\xda\xef\x54\x8e\x8e\xf6\xff\xf7\x80\xf7" + "\xb6\xd6\x9e\xf2\x4f\xfa\x6c\xad\x3d\xe5\xfd\x6d\x2d\xb4\xad\x16" + "\x59\xb9\xcd\xf5\x0a\xd8\x4a\xdb\xd7\x80\xdd\x95\x42\x88\xa9\xf9" + "\x43\x92\x0b\xb6\xd7\xf6\x2b\x60\x7f\x25\x80\xfd\x65\xfb\xa3\x68" + "\x7f\xed\xb9\xc3\xd5\xfe\xda\x9d\x37\xa8\xfd\xe5\xef\xb0\xbf\x6c" + "\x60\x5b\xf5\xfe\x71\x7d\x58\xc1\x15\x27\x5b\xec\x77\x03\x6d\xb1" + "\x9e\xbc\xbd\x39\x3d\xb3\xd6\x87\xf7\x82\x3d\x36\x94\x2d\xc6\x30" + "\x31\x88\x3d\xf6\xff\x86\x2d\xb6\x2b\x73\x74\xb6\xd8\x1f\xcd\xae" + "\xb6\xd8\xde\x45\x9e\xd9\x62\x7b\x9e\x75\x3b\xf7\xe5\xb5\x2d\xb6" + "\x27\xc1\xd5\x16\xdb\x1b\x2e\x62\xe6\xa1\x91\xdb\x62\x7b\xa7\xba" + "\xb7\xc5\xf6\xde\xe3\x6a\x8b\xed\x11\xcf\x9e\xee\x5d\xc8\x6d\xb1" + "\xbd\x62\xfa\xee\x50\xe7\x74\x87\x2d\xc6\xd3\xb9\x2d\xb6\x37\xda" + "\xc3\xb5\xb1\x2d\x36\xd0\xe9\xdf\xfe\x7e\xca\xa1\xd6\xc6\xc6\x6a" + "\x3f\xe5\x0f\x6f\xf1\xb5\xb1\x8a\xe1\xe7\xbf\x6e\xdb\x04\x83\xc8" + "\x9a\xbd\x09\xa3\xd3\x4b\x7f\x5a\x78\xdb\x26\xf0\x96\xf6\x6f\x8d" + "\x72\xee\xeb\xbf\xab\xbc\xb7\x09\xde\x29\x74\xcc\xbf\xbc\x53\x38" + "\xb2\xf9\x97\x77\x26\xb8\xea\xff\x7d\x83\xeb\xff\xdb\xf3\x2f\x23" + "\xd0\xf9\x7f\x2a\x1c\x9d\xce\x7f\xbb\xde\x55\xe7\xbf\xfb\xa8\x67" + "\x3a\xff\x9d\x5f\x8d\xfd\xfc\xcb\x3b\x31\xae\x3a\xff\xdd\x10\x11" + "\x27\x4f\x8c\x5c\xe7\xbf\xeb\xef\x5e\xe7\xbf\x7b\x87\xab\xce\x7f" + "\xa7\x95\xeb\xf6\x77\x23\xb8\xce\x7f\xc7\xc6\xd3\xf7\xcd\x77\x4e" + "\x77\xe8\x7c\x9e\xce\x75\xfe\xbb\x0b\x47\xb6\xde\x15\x78\x8b\xae" + "\x77\xa9\xff\x49\xd6\xbb\xf6\x57\xde\xd6\x3b\xde\xea\x9d\x77\x63" + "\x46\xa7\x77\xfe\x12\xe1\xbd\xde\x79\x4f\xe5\xd0\x3b\xef\xa9\x46" + "\xa6\x77\x0e\x6c\x72\xd5\x3b\xff\xe3\x7b\x5b\xef\x8c\x56\xef\xfc" + "\x59\x35\x3a\xbd\x73\xa0\x9f\xff\xa3\xf7\x3c\xf4\x7f\x74\xc0\xad" + "\xff\x23\xef\xf5\xce\x81\x7e\xfe\x8f\xde\x13\xfd\x1f\xfd\xc5\x0b" + "\xbf\x21\xef\x6d\x75\xaf\x77\xde\xeb\xe7\xff\xe8\xbd\x18\xae\x5f" + "\xde\x13\xfd\x1f\xbd\x27\xfa\x3f\xfa\xcb\x21\xe7\x74\x87\xde\xf9" + "\x8b\x93\xdf\x90\xf7\x6e\xfb\x3f\xfa\xce\xed\xc3\xfc\xdf\x51\xc8" + "\xbf\xf7\xdb\x1c\xf2\xef\xfd\x36\xf7\xfb\x30\xdf\x5f\xe9\xba\x0f" + "\xf3\x7f\xaf\xde\xde\x87\xe9\x8d\x7c\x7b\x6f\x94\x7e\x91\xde\x0f" + "\x71\x95\x6f\x1f\xbc\xee\x99\x7c\x7b\xff\xad\xb1\x97\x6f\xef\x1f" + "\x74\x95\x6f\x1f\x6c\x11\xb1\xe1\x85\x7c\xfb\x20\xce\xbd\x7c\xfb" + "\x20\xd1\x55\xbe\x7d\x10\xc1\xe5\xd8\x07\x45\x5c\xbe\x7d\xb0\x84" + "\xa7\xff\xef\x21\xe7\x74\x87\x7c\xfb\x5f\x27\xf9\xf6\xc1\xee\x91" + "\xad\x6b\x7a\x65\x57\xdf\x84\x75\xcd\xb1\xb2\xab\x6f\xf5\x75\xcd" + "\x43\xc1\xb7\xe7\xd1\xbc\xb1\xa9\x3f\x38\x38\x3a\x9b\xfa\xc3\x42" + "\xef\x75\x8a\x31\xd5\xa1\x53\x8c\xa9\xee\xd6\x77\xb6\x03\xee\x72" + "\xc1\x26\xde\x76\x85\x28\x5e\xc1\xf5\x9d\xfa\x1a\x92\x87\xeb\x3b" + "\x6b\xa4\xf5\x9d\x12\xd1\xce\xfe\xdb\x65\x57\x3b\xfb\xaf\x89\x83" + "\xd9\xd9\x68\x5f\xdb\xc1\x76\xb6\xf5\x5f\xd7\xf9\x8f\xc1\x75\x51" + "\x8f\xff\xde\x9c\xeb\x7f\x5c\x1f\x3e\x52\x5d\xf4\xe6\x06\xae\x8b" + "\xde\xf8\xce\xeb\xa2\x43\xb1\xa3\xd3\x45\x7f\x3b\xe8\xaa\x8b\x0e" + "\xcf\xf2\x4c\x17\x19\xe7\x8e\xbd\x2e\x32\xce\x77\xd5\x45\x87\xd5" + "\x22\x56\x26\x8d\x5c\x17\x19\xaf\xba\xd7\x45\xc6\xeb\xae\xba\xc8" + "\x58\xcd\x75\xce\xe1\x99\x5c\x17\x19\xcd\x3c\xfd\xaf\x6a\xe7\x74" + "\x87\x2e\xe2\xe9\x5c\x17\x1d\x0e\x1d\xd9\x1c\xcf\xf8\x5b\x74\x8e" + "\x47\xf9\x4f\x32\xc7\xf3\xf7\x0a\xef\x65\xe2\xd1\x84\xea\xbe\xf3" + "\x1b\x47\x13\x06\xcc\x33\xa4\x80\xbd\xdd\xce\xd7\xb9\xfb\xe6\x19" + "\xcc\x67\x45\xf9\x57\x79\xde\x55\xfe\x1d\x71\x2b\xff\x86\x5a\xcb" + "\xc6\x79\x05\x3b\xc8\x46\x5b\xc9\x28\xd6\xb2\x53\xbe\xeb\x32\xef" + "\xf0\x28\xfd\x2b\x57\xee\x73\x95\x79\xff\x98\xea\x99\xcc\x3b\x7a" + "\xbf\x5b\x99\xe7\xf5\x39\x8e\xa3\xe1\xae\x32\xef\x1f\x0a\x11\x1f" + "\xb3\x46\x2e\xf3\x8e\x5e\x70\x2f\xf3\x8e\x5e\x76\x95\x79\x47\x8d" + "\x5c\xb6\xfd\x43\xc3\x65\xde\xd1\x7a\x9e\x7e\x64\xa6\x73\xba\x43" + "\xe6\xf1\x74\x2e\xf3\xfe\x31\x73\x28\x99\x47\x73\x13\x73\x0a\xe4" + "\xc2\x7e\xb8\x0e\x42\x1d\xa7\x02\x36\x8c\xf0\x7f\x15\xf0\x78\x12" + "\xfc\x5f\xe7\xae\xff\x59\xfc\x13\x73\x84\x2c\xa8\xb3\x9c\xc8\x4c" + "\x96\x6f\x8c\xc6\x69\x36\xe4\x8d\x78\x66\x2d\x31\x27\xd0\x36\x7e" + "\x81\x40\xf5\x04\xf8\x92\xc3\x62\x63\x42\x7e\x3c\x1f\xa4\x4d\x21" + "\x01\x57\x64\xff\xa8\x94\xf2\x41\x7d\x03\x9a\x64\xff\xd8\x84\x65" + "\x40\x5d\xeb\xa0\x2d\xa1\x6e\xeb\x0a\x65\x45\xbe\x35\x83\x6c\xb4" + "\xd1\xaf\x8c\x6b\xda\x49\xb3\xec\xa3\xa9\x81\x6d\xe3\x17\xd0\x8c" + "\x68\x82\xb6\xdc\xfe\x69\x16\x05\x96\x89\xf1\x74\x9b\x65\xff\xb0" + "\xe1\x33\x3b\xd4\x31\x3d\x91\xc8\xf3\xdb\xc7\x2b\x41\x4e\xf8\x66" + "\x74\xd2\xd6\xb5\x36\xa8\x33\x60\xf3\x6f\x33\x1a\x14\xef\xbe\xd1" + "\x80\x73\x88\x1a\x8c\x4d\x8a\x65\x80\x3d\x0b\xf5\xf9\x68\x7a\x29" + "\xe4\x1f\xac\x0e\x5b\xdf\x21\x21\xbe\xf7\x53\xf3\xc8\x70\xf3\x91" + "\xc1\x1d\x1d\x03\x37\xcd\x20\xc6\xd9\x40\x3b\x2d\x91\x0f\xf6\x7c" + "\x84\xdf\x19\xea\xfc\xbb\x12\x63\x1b\x67\xbc\x4e\xe4\x3b\x84\xf1" + "\xca\x23\x69\x2c\xfe\xb0\xa5\x3b\xbb\x6a\xbe\x59\x16\xc2\x62\x87" + "\x62\x5c\x4b\x8c\xff\x0e\xb8\x21\x90\xbe\xec\x30\x58\x92\xfd\x79" + "\x91\x14\x9b\xb8\x52\x9b\x1c\x9f\x18\xb7\xf6\xc5\x64\xed\xac\x58" + "\x3f\xb2\x64\xed\x5a\x6d\xe2\xca\x35\xeb\xb5\xce\x4f\x7e\xaa\x8d" + "\x8d\x5f\xb7\xf2\xb9\x84\xb8\x39\x89\xab\x0c\x7e\x50\x27\xe2\x54" + "\x8f\x20\xac\x8b\x90\x5d\xa5\x2f\xfd\x4f\x42\x5e\x9d\x4c\x14\x58" + "\x2f\xf8\x5e\xb5\x14\xc3\x14\x63\x78\xca\x21\x4f\x06\xc8\xc7\x1d" + "\xe9\xe3\x21\xef\x47\x0d\x65\x50\xaf\x52\xa8\x37\xd4\x11\xeb\x6c" + "\x95\xea\x2c\x61\x22\x03\x31\x91\xde\x0e\x18\x3c\x36\x35\xd0\x3a" + "\xfe\x17\x94\x46\x63\xfb\x3a\xa1\x9f\xc8\x20\x2d\x9e\xe9\xb2\xbc" + "\xc4\x9c\xee\xec\x63\x61\x12\xc6\xf0\x5d\x9a\x9f\x18\xd5\x8d\xfd" + "\x84\xea\x7f\xc6\xfb\xd4\xc7\xaa\xa5\x3a\x19\xe1\x31\x54\x8f\xc5" + "\x38\x62\xa8\x7e\xcc\xe6\xaa\xa1\x1e\x6d\x90\x0e\x1a\x53\x60\x31" + "\x8f\x31\xf6\x2f\xc6\x42\xc5\x3a\x43\xbb\x40\x97\x52\x23\xcd\x12" + "\xb1\x9f\x73\x28\x5c\xc8\x39\x63\x36\x29\xae\x91\x48\x1b\xed\xa5" + "\xdb\x0e\x85\xd7\x76\x76\x92\xc0\x4d\x86\x55\x74\x5c\xd5\xfa\x40" + "\x5b\x7c\x1c\xc6\x70\x15\xb6\x9d\x31\xd3\x6d\x27\x73\x97\xde\x4f" + "\xd4\x50\x76\xbd\x53\x2c\x57\xc5\xc8\xf8\x7f\x8c\xf1\x1f\xf9\x88" + "\x31\x5a\x39\x1f\x3f\x9e\x79\x38\x79\x20\x1f\xfb\xf0\xf7\x96\x40" + "\x8e\x02\x16\xa8\xaa\xa4\x2e\xd2\xce\xe9\x88\x7d\xb7\x23\x43\x4f" + "\x1e\x64\xb4\xfb\xb8\x51\xc8\x2f\xd9\x2f\xe4\x96\xb4\xd2\xdc\x92" + "\x7a\xa0\x99\x3e\x3f\x85\x68\x57\xd8\xd5\x24\xef\x1a\x09\xb5\xe4" + "\x95\xd4\xf9\xcb\x32\x65\x60\x8f\xc8\x41\x9f\x84\x82\xcc\x08\x15" + "\xfb\xbb\x1e\xe9\xf8\x51\x1b\x21\x8b\xd7\x11\xf2\xd5\x3c\xe2\x53" + "\x0a\xef\x8d\xac\x3d\x1f\x33\xfd\x4f\xb3\x3f\x8e\x29\x83\x77\x31" + "\x46\xef\x08\xdf\x6f\x75\xdb\xef\xfa\xda\x5d\x1a\x35\x78\xbb\x3f" + "\xa9\x17\xf2\x4b\x43\x85\xdc\x52\x3d\xcd\x2d\x5d\x32\xb0\xdd\xa5" + "\x51\xbc\xdd\xbe\xed\x63\xdf\xee\x4f\xca\x79\xbb\x3f\x89\xf6\xae" + "\xdd\x9f\x98\x3d\x68\xb7\x1b\x7e\x57\x57\x43\xbb\x81\xdf\xa5\xc0" + "\xef\xd2\x41\xf8\x5d\x2a\xf2\x7b\x62\xd3\xd8\xb7\xbb\xba\x88\xb7" + "\xbb\x3a\xca\xbb\x76\x57\xbb\x95\x7f\x8e\x76\x97\xb9\xe1\x77\x4d" + "\xa5\x90\x5f\x06\xfc\x2e\x03\x7e\x97\x0d\xc2\xef\x32\x91\xdf\x93" + "\x4e\x8c\x7d\xbb\x6b\xb8\xff\xc3\xec\x9a\x05\xde\xb5\xbb\xc6\xad" + "\x9e\x76\x6a\xb7\x1b\x7e\xd7\x1e\x82\x76\x03\xbf\xcb\x80\xdf\x65" + "\x83\xf0\xbb\x4c\xe4\xf7\xc3\xdb\xc7\xbe\xdd\xb5\x3c\xfe\x73\x76" + "\x6d\x84\x77\xed\xae\x75\xbb\xff\xc5\xd1\xee\x72\x37\xfc\x36\x1d" + "\x10\xf2\xcb\x81\xdf\xe5\xc0\xef\xf2\x41\xf8\x5d\x2e\xf2\xfb\x99" + "\xc7\xc6\xbe\xdd\xa6\x4c\xde\x6e\x53\xb8\x77\xed\x36\xb9\xdd\xff" + "\xee\x24\xcf\x1b\x40\x66\x0f\xe0\xb9\x29\x35\x9c\x3c\x70\x0d\xdb" + "\x7f\x7c\x26\xf5\x2f\x69\x98\xb8\x29\x53\x66\x53\x95\x34\x4e\x84" + "\xb1\xdc\x9b\x59\x82\x3e\xd0\x4c\x26\x40\x5b\xf5\x34\x7f\x97\x01" + "\x7f\x05\x28\xc7\x06\xb2\xdf\xae\x2a\xa9\xef\xc9\x4d\xd4\xbf\xb2" + "\x9a\x68\x33\x2c\x44\x5d\x9b\x6e\x26\xe9\x06\x6a\xa9\x25\xe7\x89" + "\xbf\x99\xc8\x71\xbe\xec\x93\xb6\x83\x64\x4d\x12\xa5\x50\xb6\x3f" + "\x8e\x31\xf3\x5b\x48\x28\xd8\xc4\x99\x14\xf4\x47\x81\x40\xb4\x50" + "\x7e\x28\xd2\x12\xca\x4e\x0a\x5c\x42\x64\x7f\x7d\xce\x4a\x90\x9e" + "\x48\x5b\x18\x8f\x86\x32\xba\x76\x12\xf2\xcb\x67\x38\x5d\xdf\x5c" + "\x3d\x52\xba\xd6\xf1\xf5\xbf\xdc\x12\x8b\xc9\xdc\x43\xc0\xb6\x54" + "\xe3\x99\x7b\x48\x2f\xac\x35\xb4\xc3\x58\xa4\x0e\xc6\x01\x25\x66" + "\x01\x74\xd6\xc8\xca\x3d\xee\xd6\xff\xb5\x93\x3c\x8d\x06\x99\x39" + "\x00\x6b\x0e\x7a\x9f\x28\xa4\xfe\xa5\xd1\x9c\xde\xa5\xcb\x26\x36" + "\xfa\xb6\x0f\x4e\xef\xd2\x68\x1b\xe8\x1c\xbb\xaa\x74\x89\xe7\xf4" + "\x3e\xb1\xd1\x95\xde\xa5\xa1\x37\x87\xde\x27\xc4\xf8\xa7\xa5\x06" + "\x57\x7a\x9f\x50\x70\x7a\x1f\xaf\xa0\x79\xa5\x31\x02\xe8\xca\x11" + "\x96\x5b\xee\x01\xbd\x01\xdf\x03\x75\x98\x83\xde\xf5\x0a\xa0\xb7" + "\x88\xef\x52\xc0\xf7\xc4\x26\x37\xf4\x06\x7c\x97\x02\xbe\x4b\x47" + "\x80\xef\x93\x97\xfb\xd1\xfb\x26\xe1\xfb\xa4\x38\xff\x57\xda\x0f" + "\xdf\x27\x93\x39\xbd\x4f\x6a\x80\xde\x80\xef\xd2\x11\xe2\xbb\x5e" + "\xed\x81\xfe\x00\x7c\x0f\xd4\x9d\x0e\x7a\x9f\x4a\xa6\xfe\x65\x22" + "\xbe\xcb\x00\xdf\x93\x4e\x0c\x4e\xef\x32\xc0\x77\x19\xe0\xbb\x6c" + "\x04\xf8\x3e\xf5\xac\x2b\xbd\xcb\x6e\x12\xbe\x4f\x71\x1f\x93\xb9" + "\x65\xfd\xf0\x5d\xdf\xcc\xe9\x5d\x9f\x43\xf3\xca\x00\xdf\x65\x23" + "\xc4\xf7\xa9\x4c\x0f\xe8\x0d\xf8\x1e\xa8\xb3\x1d\xf4\xfe\xb4\x19" + "\xe8\x2d\xe2\xbb\x0c\xf0\xfd\xf0\x76\x37\xf4\x06\x7c\x97\x01\xbe" + "\xcb\x46\x80\xef\x4f\x6b\xfa\xd1\xfb\x26\xe1\xfb\xd3\x22\x91\xde" + "\xfd\xf0\xfd\xe9\x12\x4e\xef\x53\x56\xa0\x37\xe0\xbb\x6c\x84\xf8" + "\xfe\xd4\xe2\x81\x9d\x00\xf8\x1e\x68\x2b\x38\xe8\xdd\xb0\x84\xfa" + "\x97\x8b\xf8\x2e\x07\x7c\x3f\xf3\xd8\xe0\xf4\x2e\x07\x7c\x97\x03" + "\xbe\xcb\x47\x80\xef\x86\x47\x5c\xe9\x5d\x7e\x93\xf0\xdd\x20\xc6" + "\xbf\x2c\xef\x87\xef\xd3\x95\x9c\xde\xa7\xf5\x34\xaf\x1c\xf0\x5d" + "\x3e\x42\x7c\x37\xc4\x78\x63\x9f\xac\x2b\x21\x4a\x57\x9a\x9f\xa9" + "\xba\x71\x36\xca\x99\x3f\x7f\x3b\x36\xca\x99\xb4\xc1\x6d\x94\x33" + "\xe1\x9c\xe6\x0d\x8d\xde\xd9\x28\x67\xdc\x9e\x7f\x18\xca\x46\x19" + "\x48\xf3\xcf\xe7\xdd\x38\x3b\xe5\xf3\x59\xdf\x8e\x9d\xf2\x99\x65" + "\x70\x3b\xe5\xb3\x7d\x9c\xe6\x9f\x45\x79\x67\xa7\x7c\xee\xd6\xff" + "\xc1\x50\x76\xca\x40\x9a\x37\xee\xbf\x71\xb6\x4a\xe3\xeb\xdf\x8e" + "\xad\xd2\x18\x3b\xb8\xad\xd2\xa8\xe5\x34\xff\xbc\xd2\x3b\x5b\xa5" + "\xf1\x90\x37\xb6\xca\x40\x9a\x7f\x31\xf3\xc6\xd9\x2b\x5f\xf8\x7f" + "\x3b\xf6\xca\xd9\x86\xc1\xed\x95\xb3\xe2\xf8\xe7\x6c\xb8\x77\xf6" + "\xca\x17\x1e\x8c\x7f\x06\xda\x2b\x03\x69\x7e\xae\xe8\xc6\xd9\x2c" + "\xe7\x36\x7d\x3b\x36\xcb\xb9\x85\x83\xdb\x2c\xe7\x94\x9c\xe6\x5f" + "\xec\xf3\xce\x66\x39\xe7\x36\xfe\xc9\x50\x36\xcb\x40\x9a\x9f\x57" + "\xdd\x38\xbb\xc5\xdc\xf5\xed\xd8\x2d\x66\xe3\xe0\x76\x8b\x39\x8d" + "\xd3\xdc\xac\xf5\xce\x6e\x39\xaf\xf1\xc6\x6e\x41\x5a\x23\xcd\xd1" + "\x56\xe1\x34\xff\xb2\x91\x06\x94\xec\xef\x05\x7b\xc4\x1f\xe8\xee" + "\xdf\x46\xe4\x25\x48\xf3\x06\x4e\x73\x7b\xc0\x2e\x03\xd0\x47\x8f" + "\x34\x63\xed\xf8\x5a\x13\x60\xcf\x2d\x69\xa4\x72\x02\x6d\x51\x12" + "\xe0\xd9\x45\x5b\x16\x09\xd0\xa6\x6f\x82\xff\xbf\xac\xc1\x3c\xda" + "\xf4\xec\xb3\xd0\x46\x1f\x5c\xa3\xb0\xe5\x25\xaa\xed\xfe\x3b\x0b" + "\xe0\xd9\xfd\x74\x7a\xbc\xba\x17\x6c\x09\xfa\xbc\x26\xc8\xd4\xb6" + "\x9f\x98\x6c\x1f\x93\xda\x86\x0f\x88\x10\xb0\x2b\xe9\x41\x1b\xd1" + "\xd1\xaf\x75\x41\xd5\xc9\x66\x62\x5f\xa5\x51\x99\x52\xab\x00\x17" + "\x7f\x21\x91\xad\xf4\x1a\xfd\x52\xa7\xea\xf5\xdf\x53\x67\xf7\xdf" + "\x15\x65\xcf\xdb\x5b\x64\xf3\xdf\x63\x7c\x3b\xc5\x2c\x57\x59\x89" + "\x2e\xa1\x99\xd2\xfc\xe7\x88\x22\xbf\x89\x28\x77\x3c\x47\x54\x3b" + "\x9a\x88\xba\xba\xb9\x81\xd4\x5c\xaa\x22\x35\xed\x67\x48\xcd\x35" + "\xb8\x7a\xe0\x12\xe0\xca\x3c\x43\xaa\xdb\x08\x59\x74\x99\x90\x8c" + "\x66\x6a\xf9\x61\x23\x09\xaa\xb6\x35\x10\xed\x72\x42\xae\xc8\x9a" + "\x3e\x54\xc5\x90\x20\xfa\xa5\x86\xd0\x55\x1a\x39\x3c\x53\x60\xba" + "\xc9\x66\x21\xd5\xcd\x56\x7c\x5e\x0c\xcf\x15\x19\xcd\x50\xbe\x50" + "\x85\xbe\x0c\x2d\xd5\x99\xc7\xa0\x7d\xd3\x91\xce\xad\x92\x4d\x96" + "\xdf\x43\x42\x77\x00\x9b\x11\x33\x91\x94\x63\xa6\xac\x67\xa4\x98" + "\x69\xe2\xfe\xdf\x9f\xd7\x4c\x06\x7a\x4f\x13\x9e\x8f\x56\x2f\x3e" + "\x73\x8e\xe2\x7e\x30\x5c\x9f\xa9\xed\xfc\x98\xe0\x9a\x75\xe4\x7a" + "\x42\x16\xda\x09\x41\x9a\xe0\x5a\xf2\x62\x03\x09\xc4\x7d\x6a\xc2" + "\xd7\xba\xc9\xa6\x66\x0b\xd9\x68\x83\xba\x5e\xb1\xf6\xd5\xb5\x76" + "\x4b\x2d\x81\x67\xd3\x6a\xf5\x66\xa2\x32\x10\x35\xd2\x19\x6c\xd1" + "\x86\xc5\xad\x64\xc2\x9a\x4e\x4a\x91\xc6\x48\x5b\xa4\x33\x96\x27" + "\xd1\xde\x14\x6b\x21\x19\x56\xa2\x36\xa5\xc3\x6f\x2a\xb5\x98\xc8" + "\x55\x02\x75\xac\xa3\xfe\xd3\x09\xe0\x23\x19\x31\x01\x78\x34\x03" + "\x0e\x26\xd3\xec\xf3\x85\xa5\xd0\x5e\x5c\xdb\x1f\x59\x9b\xbf\xf4" + "\x64\xfd\x63\x80\x4d\xe8\xc0\x73\x69\x34\xc7\x73\xcb\x3e\x1a\x50" + "\x1a\xda\x0b\xb6\x1e\xc7\xb3\x6f\xfb\xf0\x78\x2e\x5d\xe6\xc0\x73" + "\xf3\xfb\x0e\x3c\xb7\x94\xb8\xc7\xf3\x85\xeb\x1c\xcf\xa5\x86\x5b" + "\x13\xcf\x17\xf2\x86\xc6\xf3\x85\x04\xf7\x78\x2e\xd5\x4b\xf6\xee" + "\xd8\xe0\xf9\x42\xe5\xcd\xc3\x73\x69\xb4\x77\x78\xbe\x50\xee\x8a" + "\xe7\xe6\xfd\x1c\xcf\xcd\xb1\xde\xe1\xb9\xc5\xad\xff\xe3\xa1\xec" + "\x6d\x27\x3c\x8b\xf2\xf9\x62\x1a\xe0\x19\xe4\x73\xa9\x28\x9f\x27" + "\x36\x79\x80\x67\x27\xf9\xfc\xd5\x36\x07\x9e\x2f\x26\xba\xc7\x73" + "\xeb\x31\x11\xcf\xb7\xa8\x7c\x6e\x7d\x76\x68\x3c\xb7\xce\x1b\x02" + "\xcf\xad\xd2\x58\x62\x6c\xf0\xdc\x5a\x78\x13\xf1\xec\xa5\x7c\x6e" + "\x35\xb8\xe2\xf9\xab\x4c\x8e\xe7\xaf\xc2\xbc\xc3\xf3\xc5\x1c\x6f" + "\xc6\x32\x0e\x3c\x97\x89\xf2\xb9\x6d\x21\x0d\x28\x03\xf9\x5c\x26" + "\xca\xe7\x49\x27\x86\xc7\x73\x99\x93\x7c\xbe\xf4\x1b\x07\x9e\xdb" + "\x1e\x71\x8f\xe7\xaf\x5f\xe7\x78\x2e\xbb\x45\xe5\xf3\xd7\x73\x86" + "\xc6\xf3\xd7\x2a\xf7\x78\x2e\xd3\x4b\xe3\xb4\xb1\xc1\xf3\xd7\xb1" + "\x37\x0f\xcf\x65\x5e\xca\xe7\xaf\x23\x5c\xf1\x7c\x29\x8a\xe3\xf9" + "\x92\xc2\x3b\x3c\xb7\x45\x7b\x33\x4e\x74\xc2\xb3\x28\x9f\xbf\x09" + "\x06\x3c\x83\x7c\x2e\x13\xe5\xf3\xc3\xdb\x3d\xc0\xb3\x93\x7c\xbe" + "\x7c\xbf\x03\xcf\xdf\xf8\xbb\xc7\xf3\x95\x78\x11\xcf\xb7\xa8\x7c" + "\xbe\x6c\x1f\x1a\xcf\x97\x1b\x87\xc0\x73\xab\x34\x06\x1e\x1b\x3c" + "\x5f\x09\xbb\x89\x78\xf6\x52\x3e\x5f\x51\xbb\xe2\xf9\xb2\x96\xe3" + "\xb9\xad\xde\x3b\x3c\x7f\xe3\x36\xfe\xeb\x50\x63\x70\x07\x9e\xcb" + "\x45\xf9\x7c\xb5\x8d\x06\x94\x83\x7c\x2e\x17\xe5\xf3\x33\x8f\x0d" + "\x8f\xe7\x72\x27\xf9\xfc\xcd\x75\x07\x9e\xaf\x9e\x75\x8f\xe7\xab" + "\x3f\xe1\x78\x2e\xbf\x45\xe5\xb3\xa5\x66\x68\x3c\x5b\xf6\xb9\xc7" + "\x73\xb9\x5e\x9a\x5f\x18\x1b\x3c\x5f\x55\xdc\x3c\x3c\x97\x7b\x29" + "\x9f\x2d\x66\x57\x3c\x7f\x63\xe1\x78\xfe\x66\xb7\x77\x78\xbe\x6a" + "\x1d\x9b\xf9\x8d\xce\x36\x9c\xdf\xe8\xc1\xf9\x0d\xc7\xde\x3f\x7d" + "\x60\x1d\xc7\x73\x2f\xe0\xf9\x4d\x67\x3c\x7f\xde\x7f\x7e\xa3\xfd" + "\x98\xd0\x87\xe7\xce\x01\x78\x16\x00\xcf\xbd\x0c\xcf\x1d\x5d\xd2" + "\xfc\x86\xa9\xad\x1c\x70\x72\x89\x98\xa2\x00\xcb\xf9\x22\x96\x3f" + "\x07\x2c\x03\x0d\x05\xa0\x71\x75\x63\x03\x89\xb4\x70\x5a\xf6\x00" + "\x8d\x05\x67\x1c\xf7\xb4\xca\x11\xbf\x88\x5b\x09\xc3\x35\x6b\x00" + "\xbb\x49\xc7\x49\x4d\x0a\x5c\x1b\xe0\x4a\x87\x8b\x1c\x27\xd5\x30" + "\x62\x5e\x14\xef\x8c\xdd\x3a\x11\xbb\x1d\xdb\x86\xc6\x6e\x87\xfe" + "\xe6\xcd\x65\x74\xf0\xf9\xaf\xcf\xa3\xd5\x91\xbf\x3a\x47\x4d\xa9" + "\x0d\x22\x3e\x2f\x91\x48\x1b\x09\xa4\xcf\xe8\x26\xab\xa2\x89\xfa" + "\x65\x3b\x91\xe7\x3d\x47\xd4\x79\x9f\x41\xbb\xa5\xfe\xdb\x44\x54" + "\x1f\x5b\x3f\x20\xd5\xed\x0d\xa4\xfa\xda\x31\x52\x2d\xc0\x75\x09" + "\x2e\xa8\x6b\x64\x9c\x73\xbb\x2d\x62\xbb\x3b\x37\x41\x59\x33\xdd" + "\xb7\xbb\x33\x86\xb5\x3b\x16\xda\xdd\xe3\x68\xb7\x09\xfa\x01\xf0" + "\x67\x9a\x20\xce\x87\x44\x5a\xc8\x84\xb5\x36\x4a\x7b\x44\xfc\x23" + "\x7f\x3e\xae\xb7\x92\x48\x03\xf0\x6c\x15\xe0\xbf\xb9\x82\x64\xa4" + "\x01\xfe\x7b\xac\x88\x3b\x8b\x29\xf3\x3a\xe0\xbf\xa3\x98\x02\xfd" + "\x7a\x11\xff\x9f\x23\xfe\xdb\x8d\x02\xc3\x7f\x7b\xb2\x77\xf8\xef" + "\xf4\x00\xff\x9e\xcc\x87\x74\xb7\xe1\x7c\x48\x0f\xce\x87\x38\xf6" + "\x80\x0e\x83\x7f\xe7\xf9\x90\x2e\x27\xfc\x77\x0f\x81\xff\x6b\x5d" + "\xd2\x7c\xc8\xb7\x8f\xff\x6b\xc3\xe0\xff\xda\x10\xf8\x1f\xeb\xb9" + "\x8f\x6b\x37\x11\xff\xdd\xc3\xe0\xbf\xdb\x03\xfc\x97\x46\x7b\x87" + "\xff\x6b\xfd\xf0\xdf\x25\xe2\xbf\xcb\x4b\xfc\x77\x7b\x82\x7f\x0f" + "\xe6\x4f\x7a\x10\xff\x20\xff\x4b\xeb\x9d\xf6\x02\x0f\x87\x7f\x27" + "\xf9\x6f\x75\xc2\x7f\xcf\x10\xf8\xbf\x2e\xe1\xff\x16\x90\xff\xd7" + "\x87\xc1\xff\xf5\xa1\xf0\x3f\xc6\x73\x25\xd7\x6f\x22\xfe\x7b\x86" + "\xc1\x7f\x8f\x27\xf8\xf7\x52\xfe\x5f\xef\x87\x7f\xab\x88\x7f\xab" + "\x97\xf8\xef\xf1\x00\xff\x9e\xcc\xb7\xd8\xdb\x70\xbe\xa5\x07\xe7" + "\x5b\x1c\x7b\xc2\x87\xc1\xbf\xf3\x7c\x4b\xaf\x13\xfe\xed\x43\xe0" + "\xdf\xd6\x25\xcd\xb7\x7c\xfb\xf8\xb7\x0d\x83\x7f\xdb\x10\xf8\x1f" + "\xeb\xb9\x15\xdb\x4d\xc4\xbf\x7d\x18\xfc\xdb\x3d\xc0\x7f\x99\x97" + "\xf2\xdf\xd6\x0f\xff\xbd\x22\xfe\x7b\xbd\xc4\xbf\xdd\x13\xfc\x0f" + "\x3f\x3f\x23\x27\x88\x7f\x90\xff\x65\xf5\x4e\x67\x03\x86\xc3\xbf" + "\x93\xfc\x17\x1c\xf8\x97\x93\x21\xf0\x4f\x25\xfc\xdf\x02\xf2\x9f" + "\x0e\x83\x7f\x3a\x14\xfe\xc7\x78\x2e\x86\xde\x3c\xfc\xcb\xc9\xd0" + "\xf8\x97\x13\x4f\xf0\xef\xa5\xfc\xa7\xfd\xf0\x2f\x88\xf8\x17\xbc" + "\xc3\xbf\x9c\x78\x80\x7f\x0f\xe6\x73\xe4\x3e\x6c\x3e\xa7\x07\xe7" + "\x73\x1c\x67\x44\x86\xc1\xbf\xd3\x7c\x8e\x5c\xe6\x84\x7f\x1f\xf7" + "\xf8\x97\xcb\xbb\xa4\xf9\x9c\x6f\x1d\xff\x72\xf9\xd0\xf8\x97\xcb" + "\x87\xc0\xff\x18\xcf\xdd\xc8\xe5\x37\x11\xff\x3e\xc3\xe0\xdf\xc7" + "\x03\xfc\x97\x7b\x27\xff\xe5\x72\x57\xfc\xcb\x65\x1c\xff\xdb\x65" + "\x5e\xe2\xdf\x67\x6c\xe6\x7f\xe4\xbe\x85\x38\xff\x23\xa8\x4a\xea" + "\x7b\x8b\xe3\xd5\x42\xee\x9e\xba\x40\x99\x96\xd8\x54\x3b\x0b\x4c" + "\xc9\x9d\x64\x71\x17\xf0\xc4\xd0\x45\x96\x77\xa9\x31\x96\xa5\x91" + "\xc2\xf8\xdf\xe5\x8c\x28\x5c\xb6\xdc\xe9\x64\xc7\x1a\xa2\xb0\x07" + "\xec\x4a\xc2\x34\x53\x8b\x95\x60\x9b\x37\x22\x0d\x2e\x39\x68\x80" + "\x73\x70\xf4\x1b\x9d\xba\x34\x0b\xf2\xf4\x98\x49\x33\xe0\xa5\xba" + "\xd9\x0c\xb4\xdf\xc0\xb0\x85\xbc\x80\xfa\x84\x95\x5d\x21\x0a\xdb" + "\x97\x9a\x69\xc0\xe3\x20\xff\x97\x88\x2c\xb8\x99\x0a\xc8\x4b\xe4" + "\x11\xf2\x55\xbb\x81\x52\xc8\x97\x57\x0b\xf8\xb6\x7d\xa9\x9b\x56" + "\x0a\xf9\xc6\x7c\x5e\x46\xee\xcb\xd6\x3f\xe0\x37\xa4\xba\x11\x68" + "\xb9\x5d\xe1\x25\x9f\x7c\x3d\x39\xff\x32\xfc\x3c\x85\x7c\xfc\x3c" + "\x9c\xa7\x10\x54\xa5\x4b\x3c\xe3\x53\x69\xb4\xcb\x99\xd6\x31\xe7" + "\xd3\xb8\x46\xcf\xf8\x34\x7e\xae\x2b\x9f\xc6\x78\xfe\x40\x3e\x9e" + "\x70\x3e\x8d\xab\xe7\x7c\x1a\x17\xec\x1d\x9f\xc6\x7b\xb5\xff\x77" + "\xc0\x78\x5a\xae\x6c\xc6\xf1\x34\xf0\xc9\xc3\xfe\x54\xda\xe0\x72" + "\x06\x77\xcc\xf9\xa4\xdc\xe2\x19\x9f\x94\x67\xfb\xf1\x69\x6c\xc7" + "\xb9\x72\x65\x05\xe7\x93\x32\x8d\xf3\x69\x7c\xa5\x77\x7c\x52\x7a" + "\x70\xfe\xc3\x83\x71\x9f\xdc\x2f\x17\xc7\x7d\x02\x8c\xfb\x3c\xe3" + "\x53\x59\xb4\xcb\x99\xe1\x31\xe7\x93\x5f\x88\x67\x7c\xf2\xdb\xea" + "\xca\xa7\x31\x1e\x8f\xc9\xfd\xa2\x38\x9f\xfc\x66\x72\x3e\x4d\x48" + "\xf0\x8e\x4f\x7e\x45\x63\x33\x3e\x51\x85\xe1\xf8\x04\xf8\xe4\x61" + "\x7f\x2a\x6b\x70\x39\xe3\x3c\xe6\x7c\x9a\x58\xef\x19\x9f\x54\x73" + "\xfa\xf1\x69\x6c\xc7\x0d\xf2\x89\x3c\x1e\xb0\x7c\x62\x35\xe7\xd3" + "\xc4\x20\xef\xf8\xa4\x8a\x18\x1b\x3b\xda\xbf\x11\xed\x68\x01\xec" + "\x68\xcf\xf8\x54\x1e\xed\x72\x26\x7b\xcc\xf9\xe4\x9f\xe6\x19\x9f" + "\xfc\x4f\xb9\xf2\x69\xac\xed\x5b\xff\x72\xce\x27\xff\x64\xce\x27" + "\xd5\x21\xef\xf8\xe4\xef\xc1\xfe\xcf\xc1\xcf\x61\x0d\xb4\xf9\x02" + "\x73\x6e\x2d\x9b\x2f\x50\xe7\x19\xaf\x02\x37\xdd\x58\x9b\x2f\x70" + "\x21\xe7\x55\xa0\x96\xf3\x2a\x40\xef\x1d\xaf\x02\xdd\xfa\x7f\x1c" + "\xee\xfc\xd6\x40\xbb\x6f\x52\xd8\xad\x65\xf7\xa9\x3d\x94\x7f\x93" + "\xe6\xdc\x58\xbb\x4f\x2d\xca\x3f\xb5\x28\xff\xd4\x5e\xca\xbf\x49" + "\x1e\xc8\xbf\xc1\xcf\x7d\x0d\xb4\xfd\x26\x9b\x6f\x2d\xdb\x6f\x72" + "\xa6\x67\xbc\x9a\x7c\xe6\xc6\xda\x7e\x93\x77\x73\x5e\x4d\x4e\xe5" + "\xbc\x9a\x64\xf4\x8e\x57\x93\xdb\xbc\x3d\x2f\x36\xd0\xfe\x0b\xba" + "\xc5\xec\xbf\x20\x0f\xed\xbf\xa0\x1b\x6c\xff\x05\x89\xf6\x5f\x90" + "\x68\xff\x7d\xcf\x4b\xfb\x2f\xc8\x2b\xfb\xaf\x1f\xaf\xc4\x7e\x35" + "\x25\xfc\xd6\xb2\x01\xef\x68\xf0\x8c\x57\x53\x1e\xba\xb1\x36\xe0" + "\x1d\x36\xce\xab\x3b\xea\x38\xaf\xee\xd0\x78\xc7\xab\x29\x6e\xe3" + "\xdf\x0e\x77\x3e\x6d\xa0\x1d\x78\x67\xf3\xad\x65\x07\xde\xe9\xe1" + "\xf8\xf7\xce\xb3\x37\xd6\x0e\xbc\x53\x1c\xff\xde\x29\x8e\x7f\xa7" + "\x78\x39\xfe\xbd\xd3\x83\xf1\xaf\x27\xf3\x7e\xd3\xe6\xa3\x0d\x68" + "\xcf\x2d\xa9\x0f\x04\xfa\x07\xa6\x12\x79\x4f\x30\xf0\x4b\x05\xfc" + "\xda\xa4\x25\xbd\xb9\xc0\x2f\x8b\x8d\x2c\x7e\xe1\x1c\xad\x6d\xb3" + "\x93\x1e\xe0\xd5\x75\xb0\x03\x4d\x96\x56\x3c\xa3\xf7\xaf\x4d\xf2" + "\xa9\x67\x9f\x79\x41\x4d\x90\x5f\x48\x7f\xbb\x6a\x3a\xa1\xc0\x2f" + "\xc6\x3f\xd5\xde\x22\x5b\xee\xae\xa8\x45\x97\xcf\xd1\xb5\x66\x4a" + "\x6b\xf4\x56\xf4\x1d\xa9\xae\xd1\x37\x90\xc8\x66\x32\x41\xfb\x34" + "\xf2\x65\x6a\x1e\xa6\x9b\x2c\x0d\x04\xfd\x7e\xb2\x39\xf0\x73\xba" + "\x20\xdb\x69\x9d\x0a\xfd\x37\xe1\xb9\x42\xc9\x47\x93\xe9\x52\x11" + "\xe3\x7f\xff\x39\x55\xc6\xff\xd3\x3a\xf5\x9b\x78\x3e\x71\xcc\x6d" + "\xc1\xa9\x6c\xfe\x4f\x38\xa7\x99\x26\xd5\x71\x6d\x02\xa5\x50\xc7" + "\xc9\xb5\x9d\x16\x82\xf5\xac\xed\x34\x92\x8c\x64\xa2\xae\xed\x69" + "\x25\xe9\x9d\xd4\x52\x9b\x79\x91\x44\x76\xe1\xba\x00\xe2\x69\xea" + "\x29\xce\xef\xa9\x44\x38\xa7\x9b\x06\xbf\xd5\xb5\x75\x84\x04\x6e" + "\x02\x5a\xdb\x88\x9c\x9d\xd7\x94\x13\x25\xd0\x4b\x6f\xca\x6c\x42" + "\xda\xd5\x99\x6c\x9f\x21\x3d\xf5\xf0\x7c\x5e\xdf\x7a\x43\xc0\xae" + "\x13\x98\x86\xb4\xc5\x7d\xa6\x26\x83\x85\xe5\x91\x9e\x73\xde\x65" + "\x12\x53\x6a\x0f\xa9\x05\x69\x60\x96\x6b\xf6\x7d\x12\xdd\x00\xf8" + "\xd2\x78\x29\xb7\xa7\x45\x8d\xcd\x7c\x65\xf0\x6e\xb4\x5b\xed\xb9" + "\xa5\x4b\x78\x1d\x7d\xdb\x87\xc7\x57\x69\xb4\x03\x5f\xc1\x8f\x8c" + "\x0e\x5f\x77\x5d\x1e\x5b\x7c\x8d\xb5\xfd\x7a\xd7\xc1\xd1\xe1\x2b" + "\x78\x2e\xc7\xd7\x5d\x31\x1c\x5f\xc1\x21\x0e\x7c\xf9\xb6\xdf\x38" + "\x7c\xdd\xa5\xe2\xf8\x9a\x56\xed\x1d\xbe\x82\xf7\x8f\xcd\x3c\xeb" + "\xdd\x0a\xb4\xb5\x01\x5f\xa2\xfc\x9a\xd8\xe4\x01\xbe\x9c\xe4\xd7" + "\x8c\x92\xd1\xe1\x6b\xc6\xa2\x31\xc6\xd7\x18\xdb\xdc\x33\x34\xa3" + "\xc3\xd7\x8c\x3f\x70\x7c\x4d\x37\x72\x7c\xcd\xc8\x75\xe0\x6b\x62" + "\xd3\x8d\xc3\xd7\xf4\x04\x8e\xaf\xe9\x21\xde\xe1\xeb\x6e\xaf\xfc" + "\x5f\x0d\x1c\x1f\xdc\x13\x8b\xe3\x03\x7b\x6e\x99\x28\xbf\x26\x9d" + "\x18\x1e\x5f\x65\x4e\xf2\x4b\x6b\x1f\x1d\xbe\xb4\x6f\x8f\x2d\xbe" + "\xc6\x7a\x9c\xa0\x4d\x1d\x1d\xbe\xb4\x5d\x1c\x5f\x5a\x2d\xc7\x97" + "\xb6\xcd\x81\xaf\x49\x27\x6e\x1c\xbe\xee\xae\xe6\xf8\xba\x3b\xd7" + "\x3b\x7c\xdd\xe3\xde\xff\xf3\x88\xe6\xb5\xef\xab\xc4\x31\x0d\xe0" + "\x4b\x94\x5f\x0f\x6f\xf7\x00\x5f\x4e\xf2\xeb\xbe\x67\x47\x87\xaf" + "\xfb\xfc\xc7\x18\x5f\x63\x3c\xb6\xb9\xb7\x61\x74\xf8\xba\x6f\x29" + "\xc7\xd7\xbd\x99\x1c\x5f\xf7\x2d\x74\xe0\xeb\xe1\xed\x37\x0e\x5f" + "\xf7\x86\x70\x7c\xdd\xd3\xe6\x1d\xbe\xee\xf3\xc0\xff\xab\x27\xf3" + "\xf1\xdf\x9f\x89\xe3\x30\x7b\x6e\xb9\x28\xbf\x9e\x79\x6c\x78\x7c" + "\x95\x3b\xc9\xaf\x59\x1f\x8e\x0e\x5f\xb3\x12\xc7\x16\x5f\x63\x3d" + "\x1e\x9b\x15\x3e\x3a\x7c\xcd\x7a\x8f\xe3\x6b\xa6\x99\xe3\x6b\xd6" + "\x3e\x07\xbe\x9e\x79\xec\xc6\xe1\x6b\x66\x2e\xc7\xd7\xcc\x85\xde" + "\xe1\xeb\xfb\x1e\xf8\xff\xf1\x74\x1d\x41\x97\x33\xba\x31\xa4\xee" + "\x9e\xd1\x61\xec\x07\xc7\x6f\xed\x31\xe4\x0f\x8a\x47\x87\x31\xdd" + "\x54\x8e\xb1\x1f\xcc\xe7\x18\xd3\xa9\x6f\xce\x18\xf2\xfb\x16\x8e" + "\xb1\xef\xef\xf7\x0e\x63\xba\x31\x5c\xff\x98\xdd\x36\xba\x71\xe4" + "\xec\xad\xa3\xc3\xd8\xec\xb9\xb7\xf6\x38\x72\x36\x19\x1d\xc6\x66" + "\x6f\xe4\x18\xbb\xbf\x82\x63\x6c\x76\xf2\xcd\x19\x47\xde\xbf\x84" + "\x63\xec\x7e\x2f\xd7\x6d\x66\x7b\x75\xfe\x65\xf0\x75\x9b\x39\x51" + "\xa3\x1b\x4b\x86\x5c\x1c\x1d\xc6\x42\x5e\xbf\xb5\xc7\x92\x21\xb1" + "\xa3\xc3\x58\xc8\x79\x8e\xb1\x10\x15\xc7\x58\x48\xc3\xcd\x19\x4b" + "\xfe\xf0\x20\xc7\xd8\x0f\x53\xbd\xc3\xd8\x9c\x65\x63\xb7\xde\xf4" + "\xe0\x81\xd1\x8d\x27\x1f\x5c\x34\x3a\x8c\x3d\x60\xbf\xb5\xc7\x93" + "\x0f\x54\x8d\x0e\x63\x0f\x3e\xc1\x31\xf6\x80\x81\x63\xec\xc1\x79" + "\x37\x67\x3c\xf9\x40\x30\xc7\xd8\x9c\x46\xef\x30\xf6\xa0\x71\xec" + "\xd6\xc9\x7e\xa4\x19\xdd\x98\xf2\xa1\x3f\x8f\x0e\x63\x0f\xad\xbc" + "\xb5\xc7\x94\x0f\x85\x8c\x0e\x63\x0f\xbd\xc5\x31\x16\x5a\xcf\x31" + "\xf6\x50\xf9\xcd\x19\x53\x86\x66\x72\x8c\x85\x46\x78\x87\xb1\x1f" + "\xcd\x1c\xbb\xf5\xbd\xb0\xb4\xd1\x8d\x2b\xc3\xee\x18\x1d\xc6\x7e" + "\x7c\xf4\xd6\x1e\x57\xfe\xb8\x60\x74\x18\x0b\xf3\xe7\x18\xfb\x71" + "\x38\xc7\x58\x98\xe2\xe6\x8c\x2b\x7f\xd4\xcc\x31\xf6\x23\xef\xfc" + "\x51\xc8\xc3\x06\xf8\xbf\x8a\x5f\x93\xb2\x32\x21\x3e\x56\x1b\xbf" + "\x26\x39\xe9\x05\xed\xba\xf8\x0d\x71\x8f\xcc\x7a\x31\x44\x9b\x94" + "\xaa\x4d\x8a\x5f\xf3\x5b\x31\x21\xd6\x8f\x3c\x1d\x97\xb0\x32\x15" + "\x53\x20\xf7\x6f\xd7\x24\xc6\xad\x49\xd6\x26\xc5\xbd\xf0\x62\x7c" + "\x52\x1c\xfe\xbf\x4e\xbb\x7a\x6d\x12\x24\xac\x8a\x8b\x4f\x89\xd3" + "\x3e\xf7\xe2\xea\xd5\x71\x49\xeb\xfc\xc8\xa2\x17\x13\x92\xe3\x0d" + "\x09\x71\xda\xf9\x8b\x1e\x9d\xb3\xe4\x89\x5f\x2f\xf9\xf9\xcf\x31" + "\x38\x99\x53\x6c\xb2\x60\x9a\xbb\xb7\x00\x30\xa7\x68\x91\x3f\xb2" + "\xb5\x56\x43\x58\x7c\xdc\x1d\xed\x44\xbd\x3d\x89\x28\xb6\xb5\x13" + "\x65\x5e\x3b\x51\x69\x7f\x47\x22\xe8\xb6\xb3\x96\xfc\x76\x12\x44" + "\xf3\x13\x35\x42\xde\x94\x50\x9a\x37\xcd\x60\x99\x40\xb5\x90\xa6" + "\x16\xb6\x09\x51\xf0\x4e\x10\xd0\x56\x41\xf3\x82\xcd\x4d\xf2\x47" + "\xe6\x5b\x80\x43\x19\x17\x89\x9c\xfa\xcd\x3d\xf8\x8e\x60\x91\x1f" + "\x4e\x26\xcc\x06\x27\xf2\x87\xeb\xe0\x3a\x44\xe4\xff\x92\x00\x57" + "\x1a\x5c\x39\x70\xed\x87\xeb\x20\x5c\xd5\x70\x35\xc0\xd5\x0c\x57" + "\x1b\x5c\x9d\x70\xc1\x28\x2e\x5c\x01\x57\x26\x5c\xe5\x70\x41\xde" + "\xf0\x2a\x5e\x4e\x78\x3d\x91\xff\x84\xc0\xa5\x83\x2b\x02\x2e\xc8" + "\xff\xd3\x20\xb8\x0a\xe1\x0a\x81\x0b\x28\xff\x53\x48\xff\x69\x2c" + "\x5c\xf8\x7e\x03\x7f\xf6\xaf\xf3\xe0\x82\x91\xf8\x23\xf3\x87\xbf" + "\xfe\xb5\x08\x2e\xf8\xee\xbf\x56\x12\xf9\xbc\x99\x70\x41\x7d\xe7" + "\x35\xf4\xcb\xa7\x75\xfa\x7f\xde\x30\x65\x2e\x0b\xdc\x74\xb7\x99" + "\xc5\xc0\x93\xff\xcb\x1c\x9a\x45\x7c\x68\x1e\x21\x86\xd9\x44\x76" + "\x49\xfe\xf0\x75\xd3\x16\x94\x33\x53\x42\x59\x4c\x47\xb8\x47\x9a" + "\x75\x6f\x7f\xd8\x6a\x26\x86\x02\x8c\x69\x36\x32\xbc\x3d\x6c\xe5" + "\xef\xff\x4b\xb8\x59\x16\xd0\xca\x62\xc0\x6d\x3f\x99\x43\x33\xa2" + "\xdf\x64\xb1\xdf\x80\x86\x78\x2e\x8b\xe6\x9c\x54\x50\x65\x4d\x1a" + "\xf6\x79\xe3\x06\xac\xd7\xc3\xc7\x79\xff\x82\xe7\x50\x37\x8b\x7f" + "\xa2\x06\xea\xa9\xc0\x7b\xba\x8d\x6a\x7b\xfc\xf7\x18\xf0\xff\xeb" + "\x25\xfa\x72\x9a\xbb\xa7\x08\xc7\xd9\xc6\xf4\x5d\xa4\x09\xde\xeb" + "\xf1\xaf\x08\xd7\x3e\x1d\x48\x9b\x78\xd9\x72\xb3\xfc\x5f\x62\xa5" + "\xb2\x7a\xfc\x13\xb5\xb4\xa8\x22\x86\xe6\x01\x86\xc4\xf2\x04\x28" + "\x8f\xfe\xff\xec\x7d\x0d\x7c\x54\xc5\xb5\xf8\xd9\x9b\x0d\x6c\x42" + "\x3e\x16\x8c\xba\x68\xc4\x05\xa3\x06\xe5\x63\xb1\xd1\x46\x0d\xb2" + "\xca\x87\x41\x81\x04\x88\x18\x25\x42\x90\x80\x8b\x06\x88\x10\x21" + "\x60\x20\x61\x45\x1b\xd2\x24\xa4\x2d\xb5\xd1\x86\x24\x20\x6a\xb4" + "\xa8\x51\xb1\xa6\x7d\xf8\x77\x5b\x22\x4d\x95\xb0\x69\x1f\xfe\x9a" + "\xf6\x47\xeb\xca\x8b\x34\xe5\x05\xd8\x9a\xc5\x5d\x92\xdd\x9d\xff" + "\x39\x33\xf7\x26\x77\x37\xbb\x08\x4a\x7d\xfd\x30\x7a\xd9\x7b\x67" + "\xce\x9c\x39\x73\xbe\xe6\xcc\xdc\xb9\x33\x15\xbb\xcd\x08\x67\xa3" + "\x74\x56\x6b\x69\x56\xee\xf1\x77\x3f\xab\x7a\xc9\x41\xbf\xf1\x5b" + "\xc0\xc5\x9f\xad\x66\x10\xbf\x7a\x20\x5f\xd7\x2d\xa5\x2e\x9b\xd8" + "\x0e\x1a\xdb\x3c\xa2\x3b\xd5\x54\xd2\xce\xfc\xc6\xcd\x11\x58\x7f" + "\xea\xa4\xfe\x7a\x47\x36\x66\xd3\xf9\xa9\xfe\xf2\x94\x56\x3a\x83" + "\x8f\xca\x12\x6d\xcf\x8f\x00\x6d\xfd\x0f\x41\x47\x6d\x74\x97\xa7" + "\xe6\x28\xe7\xd0\x51\x19\x09\xe1\xef\x99\x5b\xc2\x54\xb8\xc7\x32" + "\xde\x9e\x5b\x0e\x09\x9e\xa6\x56\x38\x34\x31\x87\x08\xde\x38\x86" + "\xf3\xf2\x77\x72\x7e\x3b\xc9\x93\xf0\xfb\x2b\x5f\xae\xa6\x67\x3a" + "\xe7\x2e\x1e\xb5\xd5\xb8\x39\xa9\x59\xf0\xe8\xa5\x1a\xc2\x43\xf0" + "\xfe\xaa\x5d\x78\xff\xdd\x02\x3f\xb6\xd7\x67\x85\x64\xe3\x2a\x30" + "\x23\xed\x67\x7d\xdb\x8e\x64\x62\x3e\xda\xdd\x91\x2c\x84\x6f\xe2" + "\xfc\xae\xdc\x6d\x72\x48\xa9\xdd\x98\x97\xd5\x7f\xf6\xa5\xe0\xb3" + "\xc6\xbf\xed\x48\x9e\xbb\xfc\x56\xa3\x43\x73\x4d\x87\xd2\x06\xee" + "\xe3\x06\xe0\x64\x99\xde\x9a\xe0\x8c\x3a\x92\xd7\xb7\x8e\xb5\x6f" + "\xff\x13\x00\xd6\xc9\x7a\xbf\x60\x87\x8a\x33\x99\xa7\x6a\x01\xc0" + "\xa1\xdc\xa3\x50\xb2\x04\x12\x87\x6d\x61\xce\x0c\x1f\xc4\x0f\x3b" + "\x1a\xcf\xda\x32\x8f\xa2\x8f\x3e\x03\xc5\xed\xac\xeb\x70\xc1\x7e" + "\x28\xfe\x0c\x62\x36\xad\x80\x84\x92\x4c\xe6\xdc\x7c\x88\x79\xec" + "\x45\x47\xe1\xb0\x0b\xaf\x82\x36\x84\xfb\x18\xaf\xfd\x50\xb2\x01" + "\xb4\x73\xd0\x9f\x6e\x3e\x03\x31\x87\x0b\xce\x60\xda\x49\x28\xce" + "\x65\xde\xb6\x43\x04\xf7\x01\x64\x78\x9d\xf1\x9b\x4e\x82\xb6\x6e" + "\x01\x7d\x5b\xf6\x67\xa8\x47\x5a\x7a\x63\xaf\xc8\x3d\x5b\x99\xd8" + "\xd5\xb3\x8e\x79\xb1\x2d\xdd\x0e\x48\x33\x05\xb4\x85\x68\xee\xe5" + "\xbc\xd5\x10\x8c\xbf\x72\xb7\x61\xb1\x97\xf4\xfc\x56\x07\xfa\x62" + "\x50\xf2\x29\xcf\x19\xbb\x1b\xf5\xe7\xb6\x98\x0c\x2f\x73\x13\x3c" + "\xb5\x1b\x79\x94\x2b\xb7\x3f\x37\xa2\x00\xb4\xee\xf2\xdb\x32\x1d" + "\x9a\xeb\xf6\xa9\x64\x48\x32\x19\xa2\xd4\x27\xc3\x14\x3a\x34\x49" + "\x5c\x2f\xfc\x3c\xef\xbb\x39\x04\x8b\xe9\x28\xff\xeb\xb4\x82\xbe" + "\xdb\xb2\x28\x4d\xf6\xa5\x64\xd7\x79\x7e\xb2\xeb\xb2\xb6\x4c\x5f" + "\xec\x4b\x0d\x4c\x62\x1e\xd4\xe7\x54\xd6\x63\x88\x99\xe3\x65\x1e" + "\x7f\xe5\x2e\x13\xfa\xcb\x18\x3a\x27\x55\xc0\xdf\x7e\x2d\xe6\x9b" + "\x8d\xeb\xf8\x7d\x2c\xd5\xe3\xdf\x69\xa9\x26\xdf\x9a\xd1\x4e\xf0" + "\x2b\xab\xab\xd6\xa0\xef\xad\x7c\xa9\x9a\xec\xd0\x1f\xbb\x3b\xfd" + "\xec\x73\x8d\x66\xb2\x6f\x86\x3a\xc6\x2a\x56\x9a\xfb\xf1\x58\x21" + "\x12\xe9\xe9\x64\x58\x9e\x55\xec\x32\xc9\xb2\x6f\x13\xba\x79\x9b" + "\x83\xec\x0e\xe9\xca\xc2\xf4\xc8\x63\xd2\xed\xf9\xf4\x8d\x26\x3e" + "\x57\xf0\xb3\x24\xa5\xdb\x1f\x17\x3a\xd3\x96\x19\xf0\x2c\x11\xff" + "\xd0\x26\xd1\x0f\x88\xf8\xe2\xf6\x1f\x0c\xd8\x85\xd0\x63\x61\xdf" + "\xbb\x90\xa6\xd4\x43\x7e\x6b\x84\x1f\xe1\x34\xc7\x04\x1f\xa4\xde" + "\xa8\x23\xd9\xee\xf2\xdb\xf7\x3b\x34\x43\x67\x05\xc8\xb3\xfc\x50" + "\x01\x9d\x5b\x89\xb4\x44\x20\xce\xbf\xe1\xef\x50\xfc\x3d\x79\xa0" + "\x9d\xfa\x5a\x8e\x77\x18\xdd\x3f\x7f\x19\x73\x4e\x9b\x0d\x74\x46" + "\x25\xf2\x3d\x4d\xeb\x80\x5c\xce\xf7\x72\x3a\xbb\x13\xd3\x08\x06" + "\xd3\x13\x31\xdd\x25\xf0\x7f\xd7\xe6\x22\x9f\x15\x80\x3f\xed\x4e" + "\x81\x5f\xe0\x25\x7c\x0a\xee\x9d\xcf\xb2\x6e\x19\x77\xae\x82\xbb" + "\x12\xd3\x14\xfc\xd3\x56\xf6\xd7\x51\x8a\xf9\xc5\xea\x36\x3c\xf7" + "\x2c\x73\x11\x0e\xcc\xab\x75\x80\xe5\x28\xe5\x6d\xc3\x34\x2a\xab" + "\xd2\xa9\x88\x03\x99\x88\xe3\x10\xc7\xd1\xe2\x80\x47\xf2\xd4\x7e" + "\x03\x79\x14\xab\xf8\x5a\x19\x57\x97\x82\x6b\x00\x8f\xa2\x53\x1d" + "\x35\xb2\x4c\x09\x6f\x0c\xe1\x75\x97\x4f\x36\x38\xe0\xe1\xbd\xea" + "\xb6\x23\xcf\xd3\xe5\xbc\x14\xe4\x7b\x8c\x9a\x66\xd9\xaf\x36\x62" + "\x79\x8d\x8c\xeb\x2c\xf9\x2c\x25\x9f\xce\xf5\x64\xe5\x29\x4e\xb2" + "\x1b\xf4\x8f\x80\x76\x66\x44\x3c\xc5\x41\xfe\x51\x4b\x70\xfe\xf2" + "\x9b\xaf\xe5\xe7\x9a\x5e\xc6\xba\x10\xa6\x21\xe0\x2c\x4f\x09\xee" + "\xc0\xb4\x7d\xca\x99\xa2\x55\x08\xe3\x90\x6e\x0e\xbb\x67\xe2\xe6" + "\xd1\x20\xd9\x91\x8b\x18\xaf\x92\xce\xa5\xd9\x13\x5d\x60\xaf\xf5" + "\x83\xbf\xce\x62\x33\x6f\x66\xb6\xe3\xd2\x1d\x93\xe8\x8c\xe8\x0b" + "\xeb\x03\x27\xf3\xf5\x7f\xac\x17\xe3\xb8\xe2\x9b\x80\xfa\xbd\x53" + "\xd2\x94\x25\x76\xe7\xe7\xdc\xf6\xf0\x7e\x36\xe5\xff\x08\xe3\x3e" + "\x8a\xfd\x30\xde\xb6\x54\x4b\x22\xfe\xf3\x23\x6c\x1d\xa5\x53\x6c" + "\x88\x71\x69\xbd\x2a\x8f\xd5\x59\x8a\x04\xef\xa6\x8c\x24\x3e\x72" + "\x7a\xbd\x77\xdb\x88\x66\x7f\xad\xa5\x88\xda\x50\x52\xc4\xfc\x76" + "\xaf\xdb\x46\x67\xed\x1a\xd7\x51\xdc\x7a\xc7\x99\x8c\x9d\xc0\xd0" + "\xb6\x8b\x2e\xac\x0d\x77\xf0\xf1\x2f\xc6\xe6\xa7\x9c\x57\x59\x8a" + "\xe8\x6c\xe5\xed\x9b\x23\x75\x53\x6b\x99\xad\x67\x94\xc5\xe6\x2e" + "\x9f\x62\x50\xce\xae\xbd\x30\xbc\x53\x0c\x4a\xdb\xeb\xe4\xb6\x63" + "\x5d\xfc\x9d\xf5\xc4\x1a\x7e\xa6\x36\x3e\x4f\x09\xbb\xd6\x09\xfd" + "\x4b\x23\x95\xc5\xb6\x9b\xeb\x15\x3e\x79\x9d\x74\xa6\xf8\xf0\x13" + "\xd2\x94\xcf\x32\x8a\x6d\xc0\xf7\xc9\xaf\xdc\xd5\x78\x81\x74\xf1" + "\xf5\x2f\x87\x71\x5c\x90\xe1\x7d\x9f\x09\xbf\x68\x8e\x9d\x23\xe3" + "\xa3\x3c\x45\x56\x75\x72\xbc\x7e\xe1\x75\x98\x13\xce\xa3\x5d\xfa" + "\xc1\xed\x32\xbf\xf7\xd5\xdb\x65\x2e\x0b\xd1\xae\xcf\x2e\x72\xbb" + "\xc2\xae\xff\x56\xb5\xcb\x38\xb8\x5d\x77\xfe\xf8\xab\xb7\xeb\xce" + "\xdc\xc1\xed\xba\xf3\xbd\x8b\xdb\xae\x3b\x5b\xce\xa3\x5d\xa6\xc1" + "\xed\xba\x6b\xe5\x57\x6f\xd7\x5d\xa9\x83\xdb\x75\xd7\x8f\x2f\x6e" + "\xbb\xee\xaa\xbd\x60\x7f\x58\xf5\x92\x53\xf8\xc3\xa9\x77\x5e\xb8" + "\x3f\x9c\x1a\x33\xd8\x1f\x4e\x7b\x7c\xc0\x1f\x4e\x7b\xe8\x2b\xf9" + "\xc3\xaa\x95\x72\xac\x31\x6d\xec\x20\x7f\x58\xb1\xd2\x14\xda\x1f" + "\x4e\x8b\xe4\xfe\xb0\x72\xe5\x05\x8e\xa3\xa7\xb6\xf7\xfb\xc3\xd8" + "\x95\xa6\x00\x7f\x18\xf7\x12\xf6\x9f\xd3\x92\xbf\x9a\x3f\x9c\x96" + "\x3c\xd8\x1f\x4e\x2d\x0b\xf4\x87\xd3\x72\xc3\xeb\xe1\xee\xe4\x50" + "\xfe\x30\xc3\x7b\x9a\x09\xdd\xd8\x9d\x7c\x81\xf4\x84\xdd\xff\x1d" + "\x75\xbe\xe9\xdc\x75\xed\x6a\xba\xb0\xba\xa6\x87\x9d\xff\xc2\xb1" + "\x61\x01\xc6\x20\xfa\x4d\xbb\x40\x3a\x8e\x23\xf6\xc3\x89\x1d\x60" + "\x2f\xf2\xc0\x84\x02\xd4\x09\x2b\xa4\x1d\xae\xed\x86\xc3\x89\xc7" + "\x81\x45\xb5\x15\xb0\x97\x36\x98\xcd\x6b\x48\x37\xa7\xff\xd9\x5e" + "\xe8\xb9\x40\xdd\x9c\xde\xa8\xe8\xe6\x61\x2f\xea\xe6\x3a\xd2\xc7" + "\xbb\x63\xed\xdd\x27\x64\xdd\x9c\x71\xb6\x5f\x3e\x56\xa1\x9f\x21" + "\x75\x13\x6d\x22\x50\x37\x77\x35\x08\xdd\x9c\xf1\xc1\x60\xdd\xdc" + "\xd5\x10\x5a\x37\x67\xec\x12\xba\xb9\xab\xe1\xc2\xda\x30\x23\x7f" + "\x40\x37\x77\x35\x04\xe8\xe6\x75\x1b\xcc\xee\xf2\x19\x2d\x5f\x4d" + "\x37\x67\xb4\x28\x6d\xdf\x29\xb7\x1d\xd3\x92\x02\x75\x73\x86\x37" + "\xac\x0c\xcb\xf6\xa7\xa2\x3f\x8c\x39\x21\xdd\x7d\xc8\x87\x31\xad" + "\xbf\x42\x6b\xc8\xf0\x31\x37\x9d\xd1\xce\xa4\x14\x60\xeb\x93\x63" + "\xdc\x38\xde\x74\xbb\x2d\x3a\x16\x7d\xc8\xcf\xfa\x0c\x80\xb4\xc7" + "\x33\x77\x72\x1c\xf2\x2c\x09\x7f\x47\xec\x5c\x07\x09\x78\x19\x76" + "\xca\x7c\xc5\x7b\x13\x5b\x6f\x88\xae\x5a\x07\xe3\xe2\x5d\xa0\x43" + "\x1a\xb2\xe3\xb7\xe8\x21\xde\x0b\x09\x74\xcf\xac\x2f\x42\xfd\x17" + "\xa0\xa5\xb9\x46\x7f\x2c\xd6\x57\x14\xcf\xd8\xda\x64\xa8\x5f\x83" + "\xf4\x48\x60\xa8\x97\x58\x93\x6f\x7d\xb2\xc4\xe2\x5e\xfa\x19\x7b" + "\x32\x9b\xd3\xe4\x4f\xda\x50\x8a\x3a\x54\xca\x4a\x2c\x54\xaf\x99" + "\xce\x0a\x66\xd7\x6d\xd8\xca\xdc\x86\xe8\xca\x2f\x60\x5c\xfd\x3a" + "\x48\xaa\x5b\x07\xc9\xac\x2f\x59\x42\x1e\x64\x2f\x7a\x5c\x4f\x72" + "\xcf\x66\x12\xd6\xb5\x0e\xeb\x42\x59\xfa\x2a\xb1\x2e\x2f\xd6\x75" + "\x1a\xeb\x3a\x85\x75\x59\xb1\x2e\xab\xa8\xeb\xc2\x78\x9e\x9e\x7a" + "\xae\x39\xe1\x8c\x4d\xa3\x68\xef\xda\xbf\xc6\x17\x0d\x4d\xa7\xf9" + "\xe1\x9e\x27\x2d\x17\xa8\xef\xe9\x61\xbf\xff\xd9\xfe\x3a\x24\x32" + "\x9d\xdf\x30\xe7\xe9\x4f\x58\x06\x4a\xf5\xe9\xd7\x61\x1c\xd9\xdc" + "\x61\xcf\x49\xb4\x33\xbf\xe1\x83\xe4\xee\x0b\xac\x6b\xa6\x36\x5c" + "\x5d\xe5\x56\xd6\xde\x97\x48\xe3\xc5\x97\x9a\xb7\x4b\xac\xa8\x37" + "\xd1\xd2\xf4\xe1\x91\x5e\x58\x5c\x44\x73\xd0\xac\xc8\xf8\x20\xe8" + "\x8e\x49\x19\xcd\x25\x7f\xa4\xf9\xbc\x99\x65\x81\xf3\x79\x33\xf7" + "\x82\x74\x6f\x26\x48\xb3\x4a\x41\x9a\xa3\x03\x84\x0b\xba\xcc\x19" + "\xaf\x8c\x82\xcd\x5e\xf6\x57\x1c\xa7\x96\x55\xe1\x58\x38\x63\xac" + "\xc6\x61\x5b\x47\xf3\x5b\xf7\xce\x44\xfe\xfd\x2f\xf6\x41\xf1\x74" + "\x4f\xf8\x0a\xd6\xc0\x25\x27\xa4\x7b\xd3\xe3\x5d\x43\xd3\xbd\x31" + "\x2f\x75\x78\x71\xfc\xd6\x67\x68\x34\x9f\xad\x78\xa9\xba\x8f\xc6" + "\xb3\x0f\x93\x1f\xb8\xe7\xce\x78\x4d\x29\x8e\xb7\xb5\x06\xc6\x0c" + "\x34\x67\x9b\x5d\x8b\x17\xc9\x9e\xcb\x3d\xfa\xf7\x4d\xa4\x1f\xa4" + "\x8b\xf5\x22\x5d\x4f\xfa\xb8\x5d\xee\xb3\x9d\x11\x37\xe4\x92\x0d" + "\xf8\xb0\x7c\xc9\x67\x90\x68\x3f\xea\x03\xd4\xe9\xec\xc5\x3e\x1d" + "\xd9\x51\xb6\xed\xc1\xdf\xc3\xf1\x02\x90\x4a\xfe\x0e\xb1\xa8\x43" + "\x31\x64\x0f\x7e\xb4\x87\x8c\xa3\xf1\x1e\xb4\x6b\xff\xe6\x33\x10" + "\x4f\x7e\x82\xf6\x45\xb6\x77\x3b\xc0\x7f\x3a\x39\xee\xa7\xab\x20" + "\xc1\x7b\xda\x32\xc2\x79\xda\x72\xc9\x73\x7e\x48\x88\x2b\x00\xfd" + "\xce\x55\xa8\xbb\xab\xd1\x3e\x4e\xa1\x7d\x74\x0b\xfb\xe8\xd7\xd7" + "\x67\x7e\x63\xa1\x6f\x6e\xb8\x6d\x54\xca\xb6\xb1\x3e\x99\x74\xb8" + "\xdf\x36\xbc\xab\x93\xa5\x9d\x12\x03\xa4\x11\xf9\x9e\x5e\x54\xbf" + "\x79\x28\xf9\x7d\x13\x1b\xb5\xc2\x48\x63\xb3\x0c\x2f\xf3\xbe\x81" + "\xb2\x88\x1c\x2b\x19\x59\xe5\x4b\x1d\x1f\x66\x76\xc1\xc0\x98\x2e" + "\xe3\x17\xbd\x57\x59\x9a\x8c\xf3\xd8\xe9\x63\xd2\xbd\x66\x4c\xd7" + "\x19\x17\x5c\xaf\x47\x39\xfe\x42\x8c\x01\x33\x9a\x69\x8e\xc0\x21" + "\xdd\x9b\x80\xb8\x80\xde\x4b\x7c\xc4\xe7\x24\x67\x15\x21\x2c\xf8" + "\x90\xe7\xde\x98\x95\x66\x7f\xcc\x4b\x8d\xb6\x47\x7b\xb9\x6d\xf6" + "\xa1\x0c\x8e\xe7\x83\xb4\xb8\x1b\x79\xe3\x43\xde\xb8\xb9\xcf\xc8" + "\xe4\x3e\xa3\xec\x90\xa7\xd8\xc1\xfc\x19\x79\x11\x0c\xf9\xa2\xb3" + "\x17\xf9\x60\x51\x01\xb0\x4d\x27\x91\x47\xae\x0e\xf2\x2f\x71\xfe" + "\xf5\xc2\x87\xfc\x14\xf9\x13\xdb\x0d\x7a\x56\x05\xfa\xd7\x37\xb7" + "\x46\xfa\x50\xcf\xc9\x8f\xc4\x6f\xd1\x44\xa1\xac\xe2\x2a\xc8\xce" + "\xd1\xee\xe3\xb7\x70\xbf\xc6\x65\xeb\x5d\x9f\x3c\xa6\x6f\x7d\xb2" + "\x11\xaf\x51\x8a\xaf\xa1\xb3\xb8\x76\x92\x9f\x29\x4f\x77\x90\x9f" + "\xb1\x17\x39\xc0\x8b\xbc\x8c\xa3\x7e\x69\x7d\x72\x22\xe7\xe9\x23" + "\xc8\xd3\xe5\xa0\x9b\xe8\x01\x0d\xd2\xa5\x47\x9a\xa1\xcd\x72\x0c" + "\x88\xc7\x3e\xb4\x23\xe2\x73\x1f\xf9\x20\xd4\x35\x8c\x53\xcc\xb3" + "\x57\x18\xe1\x83\xe4\x8f\x81\xf6\x56\x2a\x39\xcb\x3e\xa5\x39\x51" + "\x7b\x91\x17\x58\xec\x4b\x1d\x8c\xcf\x23\xdd\x6b\xf8\x30\xd3\x03" + "\xe1\x75\x7a\x8e\x66\x40\xa7\xe7\x68\x06\x74\x7a\x0e\xb7\x17\xb5" + "\x5e\x9f\xad\x41\xbd\x8e\x51\xeb\xf5\xec\x91\xff\x50\xbd\x9e\x73" + "\xe1\x7a\xfd\xdc\x29\x95\x5e\x6f\xfe\xbf\xd1\xeb\x8f\xb2\xb9\x5e" + "\x47\xf4\x5d\xc5\xf5\x35\xd1\xee\x7d\x0b\x1c\xd2\xec\x6e\x45\x6f" + "\x7f\xfb\x2a\xe9\x6d\x86\xe9\x9f\x55\x6f\xcf\xba\x93\x8d\x78\x5d" + "\x74\xbd\x45\x9c\xe7\xad\xb7\x1f\x65\xf7\x82\xc2\x3f\xd2\x5f\x56" + "\xe6\x37\x18\x4b\x60\x0a\xf2\xad\x39\x7e\xcb\x28\x68\x13\x3c\x6c" + "\x36\x2e\x60\x7e\xf4\x11\x2b\x48\x9f\x7a\xad\x8c\xf9\x63\x76\xa7" + "\x97\xfc\x0e\xf4\x58\x47\xb5\xdd\xfb\x1a\xc4\x17\xd0\x3b\x9e\x95" + "\x06\x16\x9b\xe8\xa0\x77\x41\x48\x8f\x96\xde\xff\xf8\x2a\x91\xf7" + "\xe8\x4f\x7c\x95\x2f\x57\xfb\xb7\xfd\xd9\xe9\x8f\x15\xef\x88\x58" + "\x14\x33\xba\xcb\x33\x9a\x95\xf7\x17\x21\x63\x93\x98\x97\xab\xd1" + "\x5e\xb4\xc7\xa5\xcc\x77\xf0\x57\xc2\xdf\xb9\xf8\x1b\x81\xbf\xa3" + "\x89\x8e\x0b\xeb\xe7\x32\xf8\xf8\x17\xfb\xb2\x4e\xd9\x0f\x9e\xe4" + "\x36\x78\x03\xc4\x9e\x90\xef\xdd\xe5\x99\xe9\xca\xfb\x90\x7e\xf8" + "\x01\x7e\x74\x52\xdd\xc8\x13\xad\x78\x47\x23\x9e\x55\xf8\x3e\xe3" + "\xcf\xa0\x4d\xc4\xf6\x67\xd2\xbb\x54\xd4\x25\x8d\x9b\x59\xee\x90" + "\x7f\x27\x8b\x77\x3a\x2f\x57\x53\x9c\x27\xfb\xda\x6e\xb9\x5e\x1b" + "\xf6\xc3\xd3\xd4\xf5\x86\xe2\x87\x43\xca\x3c\x1a\x2e\xef\xc2\x78" + "\x91\x19\x76\xfd\xd7\xf4\x64\x1f\xbb\x30\x5c\x73\xc3\x7e\xff\xca" + "\x12\x2d\x05\x19\x8d\x3e\x9b\xbf\x2f\x3b\xfe\x83\xe2\x93\x17\x18" + "\x97\xcc\x0d\x3b\xfe\xf5\xc5\xec\xce\xcd\x18\x3b\x0a\x7c\xb5\x96" + "\x02\x9a\xeb\xa4\x58\xeb\x70\xb2\x17\x28\xde\x7a\xe5\x51\x87\xd4" + "\x87\x31\x63\x1c\xda\xe3\x1c\xd7\xfb\x6c\xfb\x09\x8c\x51\xd7\x67" + "\xc7\x57\x3d\x0a\x69\xde\xd3\x86\xe8\xef\xa3\x0f\xea\x45\x7f\xd0" + "\x7b\xda\x12\x7f\xb8\xc0\x03\xfe\x9d\x96\x02\xbb\xb7\x15\xea\x11" + "\x8e\xfc\x2f\xd1\x7b\xf6\x74\x76\x5c\xf9\x2a\xe0\xef\x36\x6c\x0f" + "\xbf\x8a\xfe\x77\xde\xce\xc8\x4d\xe8\x73\xd0\x67\x70\x3f\xfc\x15" + "\x7c\x70\xef\x53\x37\xe4\xce\xce\x61\x9e\xc3\x47\x7f\x0f\x25\x6d" + "\xa0\x2f\x79\x02\x62\x09\xbf\xdd\xdb\x26\xfc\xf2\x03\xe8\x97\xf1" + "\xb9\x4e\xe5\x97\xf9\x9c\x7a\x90\x5f\xa6\xf8\xfb\x70\x67\x17\xc4" + "\xb9\x60\xe8\x1c\x57\xbc\x67\xb3\x8b\xf9\x29\x1e\xa7\xf7\x28\x08" + "\x13\xa7\xf8\xe8\xe7\x31\xee\xe8\x5b\x2d\xfc\xf3\x4e\xd9\x3f\x3f" + "\x7f\xea\xeb\xfb\xe7\xe7\xad\xe8\x9f\x31\xde\x7b\x8e\x7c\x33\xfa" + "\xe5\xbd\xc7\x9d\x92\x17\x7d\xf1\x85\xc9\x76\x7e\x51\x38\xd9\xce" + "\xc1\xfe\x93\x64\x4a\xba\xd3\xd6\xe8\xa5\x77\xfc\x7f\xf5\xc5\xed" + "\x6c\xa2\xfe\xb1\x17\xfb\xc6\x57\x1e\xed\x90\xe2\x8a\x50\xb6\x05" + "\xef\x33\xef\xda\xec\x78\xd6\x97\x1d\xeb\xab\xd8\x9d\xeb\xed\x33" + "\xe8\xfa\xfa\x50\xbe\xe8\x2f\xb0\xbf\xd2\x3b\x9f\xb4\x70\x9e\xf8" + "\xaf\xb2\x14\xf8\x9f\x99\x50\x8a\x7d\x53\x6a\xdd\x29\x48\x61\x95" + "\x3b\xdb\xbd\x95\x3b\x8f\xf6\x55\xee\x3c\x82\x7a\x19\x87\xf1\x23" + "\xca\xfc\xac\xcd\x5f\xb9\xd3\xe9\xaf\x6a\x68\xf2\xc5\xee\xce\x75" + "\xc6\xee\xec\xc0\xe7\x2e\xff\x93\xa8\x07\x1b\x49\x0f\x3e\x00\xe3" + "\x1c\xea\x87\xb3\x5e\x0c\xa5\x07\xcf\x59\x2f\xac\x2f\x9e\x9d\x8d" + "\x7a\xd0\x81\x7a\xf0\x77\xb5\x1e\xbc\x07\x5e\xab\xdc\x47\xdf\x27" + "\x74\x01\xf9\xce\xc7\x32\xfd\xfd\xf4\xbc\x0f\x43\xeb\xc3\xd1\xf3" + "\xd3\x87\xde\xd3\x81\xfa\x50\xfb\x15\xf5\x01\xfb\x57\x43\x1d\x8e" + "\x9b\xce\x9e\x4e\x96\x6a\x49\x1f\x3e\x1e\xd0\x87\x9f\xfd\xc5\x29" + "\xf5\x5d\xb0\x3e\xdc\x17\xf6\xfc\xaf\xd0\xfa\x50\x67\xfa\x9a\xfa" + "\xd0\x31\xa0\x0f\x75\x99\xde\xca\xba\x9c\xbe\xca\xba\xac\x01\x7d" + "\x38\x83\xfa\x50\x57\x30\xa0\x0f\x75\xd9\xf8\x6c\x19\xac\x0f\x0b" + "\xde\xf9\x66\xf5\x21\xf2\xf3\xff\x0c\x7d\xb8\x3f\xec\xf8\x37\x8c" + "\x3e\x7c\x4d\xff\x30\xd1\xa4\xd2\x07\xf4\x0f\x75\xe8\x1f\xea\x54" + "\xfe\xe1\x24\xe9\x83\xca\x3f\xd4\xa1\x7f\xa8\x0b\xe1\x1f\xb2\x3f" + "\xf8\x66\xf5\x61\xd8\xb1\xff\x0c\x7d\x78\xa0\xf1\xc2\xf4\xa1\xfe" + "\x6b\xfa\x87\x89\x65\x03\xfa\x50\x8f\xfe\xa1\x1e\xfd\x43\xbd\xca" + "\x3f\xfc\x19\xf5\xa1\x5e\xe5\x1f\xea\xd1\x3f\xd4\x87\xf0\x0f\x0f" + "\x7e\xfc\xcd\xea\xc3\xf0\xdf\xff\x67\xe8\xc3\xc2\xb0\xf3\xdf\x61" + "\xf4\xe1\xeb\xfa\x07\x87\x4a\x1f\xd0\x3f\xd4\xa3\x7f\xa8\x57\xf9" + "\x87\xf7\x48\x1f\x54\xfe\xa1\x1e\xfd\x43\x7d\x08\xff\x90\xf3\xd9" + "\x37\xab\x0f\xb7\x94\xff\x67\xe8\xc3\x43\xad\x17\xa6\x0f\x0d\x5f" + "\xd3\x3f\x98\x52\x07\xf4\xa1\x01\xfd\x43\x03\xfa\x87\x06\x95\x7f" + "\xd8\x84\xfa\xd0\xa0\xf2\x0f\x0d\xe8\x1f\x1a\x42\xf8\x87\x45\x67" + "\xbe\x59\x7d\x58\x78\xd7\x7f\x86\x3e\x2c\xee\xf8\x32\x7d\x50\x74" + "\x81\xf4\x82\x74\xa1\xaf\x24\x1b\x68\x9c\xf1\xca\x09\xa1\x0f\xa4" + "\x07\x5c\x27\x7a\xb2\xe3\x7d\xa8\x0b\xde\x27\x51\x17\x7a\x85\x2e" + "\x10\x2f\x48\x1f\x68\x5c\x41\xe3\x09\xd2\x09\x1f\x8e\x29\xbc\xb1" + "\x38\xa6\xd8\xa2\x4d\x20\x3d\xe8\x8d\xf9\x92\x71\x45\x2f\xf0\xb1" + "\x1f\x8d\xf1\x4e\x49\xb9\xbe\x50\x7a\xf0\xfc\x05\xce\xf1\xf5\x8f" + "\x2f\x03\xf4\xe0\x83\x01\x3d\x78\x20\xcc\xb8\x62\x41\x18\x3d\x70" + "\x9c\x87\x1e\x9c\x1a\x3c\xce\xfc\xba\x7a\xd0\xbb\x5a\xd6\x03\x1a" + "\x67\xfa\xe5\x71\xe6\xc3\x38\xce\x8c\xbd\x50\x3d\x58\xe2\xf8\x6a" + "\x7a\x50\x6f\xba\x30\x3d\x98\x58\x46\x71\x82\xd0\x83\xfa\x1c\x6f" + "\x2c\xc6\x0a\x01\x7a\x70\x8e\x78\x21\x40\x0f\x96\x46\x7e\xb3\x7a" + "\x10\x14\x2f\xfc\xdb\xea\xc1\xd2\xb0\xfb\xbf\xfa\x51\xee\xe4\xef" + "\x69\xde\x9e\xbe\xdd\x88\x73\x8a\x79\x23\xfa\x86\x63\xfb\x2a\x48" + "\xa2\x3e\xc2\xb7\x3e\x3b\xbe\xe2\x14\xa4\x6d\x5b\x05\x5a\xef\x5a" + "\x94\xff\x1a\xd0\xf6\x4a\x00\xbd\x6b\x2d\xf1\x87\x3a\x9d\x62\x0e" + "\xa9\xc8\x06\xf5\x08\xdf\x57\x21\xe6\x90\x7c\x3d\xd9\x71\xdb\x3e" + "\x07\xbe\xee\xd5\xb6\x68\x37\xca\x36\xef\xd3\x50\xb2\xfd\xe9\x05" + "\xf8\xfa\x5e\xb5\xaf\x3f\x19\x28\x5b\xb5\x9f\xaf\xb5\xaa\xe6\x90" + "\xe6\x84\x99\x43\x3a\x0f\x99\xf2\xb9\xfd\x53\xc2\xcf\xf7\xcf\x21" + "\x7d\xcd\x39\xfe\x3e\xf4\xf1\xcf\x4b\x81\x3e\xfe\xab\xc9\x74\xd9" + "\xfe\x73\xcd\x3b\x92\x7d\x93\x5d\x2b\x36\xdd\xdf\xc7\x93\x1d\xa3" + "\xbc\xcf\x56\xec\xdc\xc7\xfb\xfa\x27\x07\x6c\x9a\x6c\x99\xec\x9a" + "\xec\x98\xf7\xf5\xb4\xcf\xef\x33\xa6\xea\x3a\xd5\xdc\x91\x2f\x56" + "\xf6\xf3\x21\x7c\xbc\xff\x9c\x3e\x7e\x79\x48\xf9\xff\x2b\xf8\x78" + "\xd2\x03\xc5\xbe\xff\xf9\x6c\xfb\x91\xf0\xeb\xbf\xce\x4b\x0f\xea" + "\x52\xbe\x5c\x0f\xea\x4c\xa8\x07\x9d\x75\xaa\x39\x23\x5f\x6c\x1d" + "\xfa\x79\x31\x67\x24\xf4\x60\x60\xce\xc8\x1f\x3c\x67\x14\xa0\x07" + "\x96\xbf\x7d\xb3\x7a\x10\x34\x67\xf4\x6f\xab\x07\x2b\x0e\x7d\x4d" + "\x3d\x38\x0f\x7f\x50\x87\xfe\x60\x52\xaa\x4a\x0f\xd0\x1f\xd4\xa1" + "\x3f\xa8\x53\xf9\x83\x81\xb9\x22\x7f\xf0\x5c\x51\x80\x1e\x3c\xfa" + "\xf7\x6f\x56\x0f\x82\xe6\x8a\xfe\x6d\xf5\xe0\xb1\x23\x5f\x4f\x0f" + "\xea\xcf\xc3\x1f\xd4\xa3\x3f\x98\x54\x51\xa7\x9a\x23\xf2\xc5\xca" + "\x71\x5f\x88\x98\xcf\x7f\xce\x98\x2f\xff\xec\xbf\x6a\xcc\xf7\xcf" + "\xad\x07\x2b\xc3\xbe\x2b\x3d\x4f\x3d\x38\x0f\x7f\x50\x4f\xfe\xc0" + "\xa1\xd2\x03\xf4\x07\xf5\xe8\x0f\xea\x55\xfe\x60\x60\x6e\xc8\x1f" + "\x3c\x37\x14\xa0\x07\xab\x35\xdf\xac\x1e\x04\xcd\x0d\xfd\xdb\xea" + "\xc1\xea\xce\xaf\xa7\x07\x0d\xe7\xe1\x0f\x1a\xd0\x1f\xdc\x94\x52" + "\xa7\x9a\x13\xf2\xc5\x36\xa0\x3f\x68\x50\xf9\x83\x81\x39\x21\x7f" + "\xf0\x9c\x50\x80\x1e\x3c\x1e\xf5\xcd\xea\x41\xd0\x9c\xd0\xbf\xad" + "\x1e\x3c\x1e\x76\x5d\x85\xa2\x03\xfd\x73\x00\x6c\x40\x0f\xb8\xec" + "\xd7\x66\xc7\xf7\xc6\xec\xdc\xa7\x8c\xff\x2b\x06\x8d\xff\x4d\xd5" + "\x61\xe7\x81\x82\xde\x2f\xf3\xb1\x41\xd5\xce\x26\x31\x4e\xd8\x9d" + "\x4b\xf2\xff\xfe\x46\x31\x4e\x34\x2e\x20\xf9\xaf\x0d\x2d\xff\x0b" + "\x9d\x13\xcc\x43\xf9\x77\x9e\x43\xfe\x0f\x85\x19\x27\x3c\xf8\xf5" + "\xe4\x4f\xeb\x1d\xfb\x4e\x5f\x44\xf9\x2b\x73\x82\x7f\x06\xe9\xf9" + "\xaf\x35\x5e\x5c\x1b\x56\xfe\x21\xd7\x93\x34\x8a\xf5\x24\xb4\x96" + "\xe4\x70\x57\x17\x6c\xfb\x02\xf4\x71\xf9\x42\x27\xf8\x9a\x12\xd4" + "\x89\x8a\x13\x90\xe6\x15\x6d\xeb\x5f\x53\x42\xfb\xa2\x0b\xbf\x60" + "\xe3\x6b\x4a\x94\xf9\x80\xfe\xf5\x24\x8b\x68\x3d\x49\xe1\xc9\xaf" + "\x3d\x17\x40\xeb\x49\x0a\x51\xc6\x2e\x94\xf1\x19\x92\xef\x07\x01" + "\x76\x1d\x30\x07\x10\x6e\x1d\xc9\xf9\xcc\xeb\xfc\x03\xd6\x91\xf0" + "\x39\x80\x8b\x62\xd3\x4f\xd8\xc2\xfa\x76\x94\x23\xc9\xd3\x9e\xec" + "\xe5\xf3\xba\x8a\x8d\xdb\x8b\xda\x61\x5b\x2f\xe8\x95\xf9\x7f\x45" + "\xa6\xe4\xef\x19\xea\x01\x3b\x9d\x1d\x4b\x32\xfd\xfe\x2a\xf4\xf3" + "\xab\x07\xfc\xbc\x7f\xc8\x84\xd2\x9d\x1b\xd1\xbf\x6f\x84\x14\xce" + "\xa3\xb8\x86\x26\x31\x1f\xb0\x3b\x97\xec\x9d\xec\x99\xc5\xee\xec" + "\xea\x93\xed\x5d\xc8\xbb\x0d\x48\xce\xe2\xfc\xcc\x75\x9f\x92\xed" + "\x91\xcc\xe3\x64\x99\xd7\x85\x91\x39\x97\xb7\x46\x4f\x7b\x71\xd0" + "\x77\x66\xfd\x32\xf7\x3e\xa5\x9a\xff\x51\xcb\x5c\x9e\xf7\xf1\xa3" + "\x2d\x9f\xd7\xfa\xa1\xf3\x94\xfb\x45\x9b\xdf\x47\xb9\xd7\xc9\x72" + "\xef\x9f\xdf\xff\x5a\x72\x5f\x1f\xfe\xfb\x97\x00\xb9\xd7\x99\x2e" + "\x82\xdc\x3b\x06\xcb\x9d\xc6\xff\x24\xf7\xba\x2c\x1a\xe7\xb3\xd8" + "\x3a\x4b\x9f\xbc\x6e\x64\xb0\xdc\x8b\xfe\xf8\x8f\x97\x7b\xe4\xe7" + "\xff\x19\x72\xdf\x10\x76\xff\xf3\x20\xb9\x5f\x04\x7b\x9f\x68\x0a" + "\x21\x77\xd9\xde\xeb\x8e\xd0\xb8\x1e\xe5\x2e\xdb\xfb\xc9\x10\x72" + "\xdf\xf8\xbb\x7f\xbc\xdc\x87\x1d\xfb\xcf\x90\xfb\x93\x61\xd7\x7f" + "\x04\xca\xbd\xfe\x22\xd8\xfb\xc4\xb2\xc1\x72\xaf\x97\xed\xbd\x3e" + "\x8b\xc6\xf1\x2c\xb6\x5e\xb6\xf7\x3f\x87\x90\x7b\xf1\x6f\xff\xf1" + "\x72\x1f\xfe\xfb\xff\x0c\xb9\x6f\x6a\x38\x4f\xb9\x5f\x0c\x7b\x77" + "\x84\x90\xbb\x6c\xef\xf5\x47\x68\xdc\x8e\x72\x97\xed\xfd\xbd\x10" + "\x72\xdf\xfc\xab\x7f\xbc\xdc\x6f\x29\xff\xcf\x90\x7b\x49\xd8\xf5" + "\x7f\x81\x72\x6f\xb8\x08\xf6\x6e\x4a\x1d\x2c\xf7\x06\xd9\xde\x1b" + "\xb2\x68\x9c\xce\x62\x1b\x64\x7b\xdf\x14\x42\xee\xa5\xbf\xf8\xc7" + "\xcb\x7d\xe1\x5d\xff\x19\x72\xdf\x52\xfd\x65\xef\xeb\x15\xd9\x2b" + "\x73\x36\xfc\xfd\x2c\xc6\xf7\x8a\xbc\x49\x0f\x48\xe6\xa4\x0b\x6a" + "\x99\xf3\x35\x3c\xab\xc5\x1a\x1e\x8a\xdb\x19\x8e\xc5\xd9\x10\xbe" + "\x7e\xa3\x8b\x8f\xdb\xe5\x38\x9e\x69\xb4\x09\x14\xcb\x87\x8f\xe3" + "\xad\xaf\x28\xf2\xfe\xaa\x63\xb7\x2f\x93\x77\xf0\x98\xfc\x9f\x45" + "\xde\xea\xf1\xdb\xc5\x91\xf7\x53\xa5\x5f\x4d\xde\xf5\xa6\x0b\x93" + "\x77\x7d\xa6\x90\x37\x5f\xa7\x61\x19\x90\x77\x7d\x96\x90\x77\x7d" + "\x76\xf8\xfe\x7c\xeb\x73\xff\x78\x79\x07\xce\xc9\xff\xfb\xca\xfb" + "\xe9\xb0\xe7\x7f\xd0\x1c\x0c\xc9\x9a\xe4\xbe\xfd\x51\x48\xfa\xfe" + "\xa3\x62\x6e\xc5\x7b\xda\x40\x3e\x5f\x4b\xf2\xa7\x6f\x7c\xe2\x50" + "\x07\x3e\xca\x76\x42\xaf\x3b\x1b\xe8\x5b\x1e\x5a\x77\x71\xd8\xe2" + "\x00\x7b\xd1\x87\xb0\x6d\x0d\xe8\x0f\xe5\x7e\x0e\x73\x1a\x59\x9f" + "\xfd\xa8\x8d\xbe\xf1\xd6\xda\x36\x7e\x08\x6c\x75\x72\xf4\x22\x17" + "\x48\xa7\xa4\x67\x92\x69\xdd\xc6\x04\x17\xf2\x84\xbe\xf7\x41\x99" + "\x6f\x3b\x05\xf0\x41\x21\x80\x71\x39\xc9\xfa\x99\xa7\x23\x9f\x08" + "\xf1\x9d\xcf\x85\xcc\xcb\xa8\xe7\x5e\x43\xc8\xfa\xa7\xd2\xc5\x59" + "\x9b\xa1\xac\xcb\x08\x98\x97\xf9\xba\xdf\x5f\x5e\xb4\xb5\x19\xdf" + "\x0b\xbb\x97\x13\xad\xb7\x21\x79\x92\x4d\x7b\xab\xc4\xbc\x8c\xbd" + "\xa8\x15\x68\x5d\x0d\xd9\xb0\xaf\xc7\xa0\x7b\xb2\x10\x6d\xbd\x43" + "\xd8\xfa\xf7\x3f\x47\xd8\xdc\x3f\x01\xe9\x87\x90\x6d\x9f\x90\xed" + "\xe7\x24\xdb\x3f\x01\x5b\x9b\x1c\x7d\x4a\x2a\x03\x92\x2f\xc9\xb5" + "\xe4\x8f\xa0\x5f\x4c\xfb\xa2\x90\x8f\x47\xff\x8e\x72\x4e\xad\x7f" + "\x14\x52\xc8\xfe\x7d\x95\x3b\x8f\x78\x2b\xc5\x1a\x0d\xf2\xfb\x7d" + "\x31\x2f\x75\x94\xaf\x91\xe5\xff\x20\xc9\xbf\x2c\xa4\xfc\x7f\xfa" + "\x55\xe7\xde\x65\xf9\x7f\xe5\xef\x7a\xfe\xaf\xec\x7d\xf5\xc5\xb2" + "\xf7\x6d\xb9\xe7\xa7\x07\x62\x9e\xe6\xc2\xf4\xc0\x1d\x42\x0f\xca" + "\x75\x83\xf5\xa0\x2e\x13\xf5\xa0\x23\x50\x0f\xea\xb2\x84\x1e\xd4" + "\x65\x63\xbe\x65\xb0\x1e\x94\x57\x7e\x33\x7a\x70\x9e\xdf\xf3\xfc" + "\xcb\xeb\xc1\xf7\x2d\xe7\xa9\x07\x5f\xc1\x1f\x9c\x0e\xa1\x07\x15" + "\xfa\x10\x7a\x80\xfe\x60\xa2\x29\x48\x0f\x64\x7f\x50\x87\xfe\xa0" + "\x2e\x84\x3f\xa8\xf8\xf1\x37\xa3\x07\xe7\xf9\x1d\xcf\xbf\xbc\x1e" + "\x54\x86\xed\xff\x03\xf5\xa0\xfe\x2b\xf8\x83\x4f\x42\xe8\x41\x95" + "\x61\xb0\x1e\x60\x2c\x88\x71\x60\xa0\x1e\xd4\xcb\xfe\xa0\x3e\x9b" + "\xe2\xc3\xc1\x7a\x50\xb5\xf3\x9b\xd1\x83\xf3\xfc\x7e\xe7\x5f\x5e" + "\x0f\xb6\x87\xfd\xfe\x37\x48\x0f\xbe\x82\x3f\x78\x3f\x84\x1e\x54" + "\x1b\x43\xe8\x01\xf9\x03\x47\x90\x1e\xc8\xfe\xa0\x1e\xfd\x41\x7d" + "\x08\x7f\x50\xfd\xe2\x37\xa3\x07\xe7\xf9\xdd\xce\xbf\xbc\x1e\xfc" + "\x20\xec\xf8\x2f\x50\x0f\x1a\xbe\x82\x3f\x28\x09\xa1\x07\x3f\x4c" + "\x1e\xac\x07\x0d\xe8\x0f\x4c\xa9\x81\x7a\xd0\x20\xfb\x83\x06\xf4" + "\x07\x0d\x21\xfc\xc1\x0f\x5f\xfb\x66\xf4\xe0\x3c\xbf\xd7\xf9\x97" + "\xd7\x83\x1f\x85\xfd\xfe\x5b\xad\x07\x7d\xfd\xe3\x85\x66\xae\x07" + "\xe5\x1b\x85\x1e\x6c\x22\x3d\xe8\x12\xeb\x77\x2a\x64\x3d\xe8\x1f" + "\x2b\x74\x06\xeb\xc0\x8e\x71\xfd\x3a\xf0\xb7\x81\xb1\x42\x1f\xca" + "\x9b\xcf\x07\xc9\xe3\x04\x65\x1e\x88\x8f\x13\x70\x9c\x58\xfe\xb9" + "\x2c\x7f\x3e\x27\xb0\x23\xb4\xfc\x2f\x60\x9c\x18\xb0\x46\x23\x58" + "\xfe\xff\xe4\xdf\xe9\x0c\x9a\x17\xf8\xe3\xd7\x5d\x9b\xf1\xe3\xf3" + "\x94\xbf\x12\x17\x9c\xaf\xfc\x3f\x09\x21\xff\x67\x43\xc8\xbf\x3e" + "\x53\xc8\x7f\x62\x99\x12\x0f\x28\xf3\x42\x3c\x1e\x18\x24\xff\x67" + "\xbf\x21\xf9\xff\x73\x7e\x9f\x73\xf1\xe5\xff\x93\xb0\xf2\xf7\xa1" + "\x0d\xec\x94\xfc\x4d\xd5\x92\xbf\x19\x2f\x1b\x5e\xad\x98\x16\x89" + "\x69\x7c\xaf\xcf\x6a\x39\xcf\x57\x0e\xb4\x77\x92\x2d\x5e\x93\x4b" + "\xfc\x26\x98\x21\x0a\x4c\xfc\x16\x30\x63\xdb\x04\x9c\x04\xa5\x98" + "\x6e\x8b\xdd\x62\x1e\x82\xf0\xad\xac\x3c\xd3\x83\x69\x43\x09\x96" + "\x6d\xd1\xf2\x7d\x8f\xe3\x35\x7c\xef\x4c\x19\x5e\x43\x7b\x65\xd9" + "\x08\x16\xe1\x74\x32\x5c\x22\xdf\x1b\x48\x92\xa0\x7e\x30\x6d\x51" + "\x32\x0c\xed\x59\x65\x54\xd3\x18\xab\x31\x73\x5c\x32\x5c\xb4\xcf" + "\x7a\x8c\x9e\xdb\x7d\x5b\xb4\x49\x6a\x38\x76\x17\x10\x5e\x05\x6e" + "\x98\x8c\x2f\x39\xa0\xbd\x63\x00\x62\xb7\x18\x39\xbe\xd8\x6e\x09" + "\x64\xfa\x50\x27\x32\x0e\x71\x78\x8d\x76\x5c\x00\xfc\x10\x50\xb7" + "\x23\x96\x0d\xf9\x4e\x91\x0c\x67\xf2\x4b\xc0\xcf\xb5\xc4\x74\xad" + "\x9a\xd7\x32\x6c\x9c\xc2\x47\xda\xd3\x49\xdd\x5e\x1f\xb6\x7f\xa7" + "\xa0\x31\xde\xf7\xcc\x4d\x65\x72\x5b\x52\xd5\xf5\x12\x1c\x96\x9b" + "\x24\xcb\x44\x8f\xed\x48\xeb\xc7\x57\xb1\xb2\x4c\x81\x43\x9d\x1d" + "\x89\x32\xb2\xd9\x71\xa4\x28\xb7\x7b\x38\x2b\x9f\x5b\x21\xb7\xdd" + "\x1c\xc8\x47\x8d\x43\xe1\x23\xc2\x98\x11\x76\x04\xc2\x4c\x53\xf0" + "\xfa\xac\x7c\x1f\x2d\xd1\x6e\xab\xf7\x12\xd2\x8b\xb6\x2e\x80\x3a" + "\xd1\x9e\x4b\x64\x9c\xe9\xa2\xcd\x7a\xd8\xd9\x2f\x6b\x2d\xe5\xd9" + "\x64\xb8\x04\xde\x9e\xe8\x5c\xa3\x4f\xa3\x9d\x35\x18\x56\xa7\x86" + "\xbd\x54\xc0\xce\xb7\x21\x6c\xe6\x60\x58\xbd\x1a\xf6\x32\x01\x7b" + "\x5f\x3b\xc2\x66\x0d\x86\xf5\x8e\x50\xc1\x5e\x2e\x60\xef\x77\x20" + "\x6c\xf6\x60\x58\xa3\x1a\xd6\x20\x60\x1f\x4e\x46\xd8\x9c\xc1\xb0" + "\x66\x35\xec\x48\x01\xfb\x80\x13\x61\x73\x07\xc3\x96\xaa\x61\xaf" + "\x10\xb0\x39\x80\xb0\x79\xc1\xb0\xf5\x5c\x0f\x60\x8c\xac\x07\x57" + "\x0a\xd8\x45\x7a\x84\xb5\x84\x68\x5b\x04\xc7\x2b\x60\x13\x05\xec" + "\xdc\x4e\x84\xcd\x0f\x21\x0b\x35\xec\x55\x02\x76\x4d\x0a\xc2\x16" + "\x84\x90\x85\x1a\x76\x94\x80\x5d\xae\x45\xd8\xc2\x10\xb2\x50\xc3" + "\x5e\x2d\x60\x2d\x31\x08\x5b\x14\x82\xbf\x03\xb0\xd1\x8f\x26\x20" + "\x4c\x31\xf2\xa4\x3d\x04\x6f\xd5\x38\x47\x0b\x9c\xf9\x89\x08\x5f" + "\x1a\x82\xb7\x6a\xd8\x31\x02\x76\x55\x12\xc2\x6e\x1d\x0c\x0b\x9a" + "\x9d\x82\xbf\x37\xc9\xfc\xbd\x46\xc0\x17\x8c\x43\xf8\xb2\x10\xfc" + "\xa5\x7c\x9b\x6c\x6b\x49\x02\x36\xcf\x84\xb0\x15\x21\xf8\xab\x86" + "\xbd\x56\xc0\x6e\xe9\x40\xd8\xea\x10\xfc\x55\xc3\x5e\x27\x60\xd7" + "\xe9\x10\x76\x47\x08\xfe\xaa\x61\xaf\x17\xb0\x45\xa4\x3b\x35\x21" + "\xe8\x1d\xa3\x82\x4d\x16\xb0\x1b\x3c\x08\x5b\x1b\x42\x16\x6a\xd8" + "\xb1\x02\xf6\xa9\x56\x84\x6d\x08\x21\x0f\x35\xec\x0d\x02\xf6\x49" + "\xd2\xf5\x3d\x21\xe4\xa1\x86\xbd\x91\x45\x6f\xea\x92\xfd\x62\x63" + "\x30\x2c\xca\x5e\xf8\x44\x2b\x8c\x63\xd1\x25\x0e\xbc\x27\xb8\xbd" + "\x04\xd7\x8f\xcf\xea\xfd\x0e\xf9\x1b\xd9\x87\x8d\x67\xd1\x85\x29" + "\x32\xbe\xa6\x41\x75\x5b\xb5\x6a\xd8\x09\x2c\xfa\x47\xed\x32\xec" + "\xbe\xc1\xb0\x3a\x35\xec\x44\x16\xfd\xbd\x06\x19\xb6\x79\x30\xac" + "\xbe\x1f\x96\x45\x6f\x6b\x44\x98\xfd\x75\xb2\x6f\x54\xd1\x79\x93" + "\x0a\xdf\x24\x16\xfd\xfd\x26\x19\x9f\x6d\x30\x3e\xa3\x1a\xf6\x26" + "\x16\xfd\x63\x85\xce\x96\xc1\xb0\x66\x35\xec\x77\x58\x74\x65\xb3" + "\x0c\xdb\x3a\x18\xb6\x54\x0d\x9b\xc2\xa2\xb7\xdb\x64\xd8\x43\x83" + "\x78\x4f\x76\x60\xc5\x58\x40\xf8\xa4\x9b\x59\xf4\x0f\x5a\x65\xd8" + "\x80\x38\x40\xd5\x0f\xdf\x22\xe4\xfe\x74\x33\xca\x9d\x7f\x13\x84" + "\x3e\xbf\x23\x54\x8c\x51\x70\x03\x0c\x3b\x21\x35\x14\x8b\x3e\x49" + "\x39\xf7\x6a\x17\x6f\x9b\xbf\xd6\x52\x9d\xe1\x62\x5e\x75\xda\x76" + "\x89\xb5\x4f\x74\x81\x96\x9f\xa5\x12\xfb\x52\xb3\x03\xd3\x9d\x57" + "\x59\x9a\xdc\xe5\x0d\x65\x0e\xcd\xf8\x66\xda\xc7\x0f\xef\x77\x38" + "\xe0\x31\x7e\x0e\xd0\x76\x2b\xf3\xd0\xfe\x95\xbe\xaa\x95\x99\x76" + "\x7f\x37\xc6\x72\xcc\x83\x38\x3c\x18\xcb\x45\x18\x71\x5c\x59\x52" + "\xc4\x7a\xed\x45\xdd\x70\x5c\x6a\xf8\x23\x5b\x6d\x49\x43\x1a\x0a" + "\xb0\xbe\xbc\x63\xf8\xcc\x69\xc0\x18\x08\xfb\xca\x7c\xdb\x1a\xda" + "\x47\x74\x57\x94\x33\xf6\xe5\x02\xf6\xd4\xc2\xae\x82\xcd\x70\xf5" + "\x09\x69\x97\x8e\x60\xf8\x1e\x83\xa7\x2d\x77\xf8\x63\x57\xe6\xd3" + "\xde\x83\xac\xa6\x31\x53\xec\x4b\xb8\x8b\x9f\xed\x88\x34\xb4\xb3" + "\x44\x4b\xa9\xbf\x77\x6b\x29\x9d\xab\x66\xdb\x7c\x02\x8e\xa9\xf2" + "\x9c\x23\x1b\xf9\x9e\x85\xd8\xa6\x52\x5f\x59\x5b\xb6\x5f\xd7\x96" + "\xc5\xca\xfe\xd0\x64\xcf\x77\x80\x38\xf3\x65\xd7\x07\x2c\xee\x01" + "\xbb\xbf\xac\x2d\x0d\xd3\x1b\xec\xae\x5e\x9e\x8e\x38\xaa\x29\xbe" + "\xec\xd1\x1d\x49\x67\x65\x47\x66\xd9\xae\xe8\x85\x4e\x69\x17\xb7" + "\x5f\x4a\x67\xdb\xfe\xd0\x44\xfc\xf1\x6f\xfb\x43\x43\x84\x01\xb4" + "\x3d\x51\x47\xd2\xdd\xe5\xbb\x9a\x94\xb3\x47\x94\xba\x08\xaf\x43" + "\xc6\x15\x66\xdd\x47\x3c\xab\x5c\x59\x86\x65\xbb\x31\x5e\x6c\x15" + "\x3c\xde\xe5\x71\x68\x86\x4c\x13\xf7\xbb\xb5\x0e\x4d\x54\xa2\x7c" + "\xaf\x77\x68\x92\x0c\xf2\x7d\xa2\xb2\xa7\x63\xe8\x3d\x26\x57\xe6" + "\x20\x6f\x0b\xfd\x3f\xcd\xd6\x51\xac\x4b\xf1\x3b\x8b\x5d\x99\x63" + "\x1c\x45\xe7\xf5\xed\xde\x87\x75\x16\x8a\xfd\xfd\x77\x6f\xc0\xdf" + "\x78\xf9\xd7\x29\xff\x32\x82\xe1\x7a\x93\xb8\x02\x58\xc5\xae\x74" + "\xe2\xed\x66\x1f\xf3\x23\xde\x1a\xe4\x53\xa3\xbd\xa8\x4b\xe6\xdf" + "\xee\x17\x79\xdc\x4f\xb2\x43\xf9\xb2\xa8\x3f\x34\xf2\xba\x2a\x5f" + "\x2e\x50\xd3\x65\x9a\x74\xd3\x77\x52\x6e\xbe\xe5\xbb\xa9\xb7\x2e" + "\x79\x78\x69\xde\xb2\xe5\x8f\x58\x56\x3c\xfa\x58\xfe\xca\x55\xab" + "\x0b\x1e\x5f\xb3\xb6\xf0\x89\x75\xeb\x8b\x36\x6c\x44\x3c\xfd\x67" + "\xb5\xb1\x9f\x4e\xd3\xb8\x24\xc0\x3a\xee\xc2\x3a\x5e\xb8\x94\xd3" + "\x82\x69\x42\xf6\x2f\x68\xb5\xc6\xd0\x71\xb5\x1d\x23\x5d\x3a\x3f" + "\xa6\x5b\x7a\x61\x09\x9d\x65\x83\x3a\xa6\xb1\xd7\xde\x6d\xa3\xf3" + "\xc5\x3a\xa5\x17\xb2\x0e\x3b\xef\xb6\xd1\xf9\x76\x07\x0c\x5d\x90" + "\x34\x86\xce\x20\x7b\xc1\x4c\xf9\xf5\xd7\x01\xb4\x60\xd9\x50\x38" + "\xc7\xe8\xc1\xf0\xa3\xcb\x98\x73\xc7\x65\xac\x9b\xf0\xef\x78\x96" + "\x75\x39\x9f\xb4\x40\x15\x3e\xa3\x9e\xeb\x8f\x4b\x7b\x2e\x3d\x90" + "\xc8\xcf\x69\x4a\xac\x7b\x96\x75\x6e\xbd\x8c\x75\x3e\xf5\x2c\xeb" + "\xae\xbf\x8c\x39\x92\x76\x40\x8c\xbb\xfc\x85\x56\x87\xf4\x82\x91" + "\xdb\x0c\xe6\xfb\xa3\x77\xdb\xb6\x63\xde\x44\x2f\x44\xd4\xe3\x33" + "\xa6\xb9\x0e\x18\x05\xdd\x6f\x7c\xee\x89\xc4\xf6\xed\x65\x7d\xf9" + "\x9a\x2a\xac\x47\xc8\x68\xcf\xad\x2d\xd8\x8b\x63\x7d\x4e\xbb\xe7" + "\x18\x38\xa4\x3d\xa9\xf5\x5f\xf0\xfa\xe2\xed\x35\xdd\x40\xf8\x5e" + "\x5f\xe3\x89\x5c\x7b\x05\xf3\x22\xac\xc1\xff\x64\xbe\x06\xeb\x73" + "\x21\x6e\x97\xba\x3d\xc9\xcb\x51\xe6\xab\x9e\xc8\xcf\x1f\x1b\x0d" + "\xc9\xfc\x37\xe0\x6c\xbc\x42\xda\x5f\xf6\x47\xcf\xb2\x16\x6c\xa7" + "\x0d\xdb\xdb\xda\x86\xd1\x3b\xea\x0b\x60\x9b\xaa\x11\x6f\x25\xa6" + "\xef\xc7\xfb\xfd\x48\x7b\xab\x38\x4f\xed\x9d\x5f\xb0\xf2\x3d\xd3" + "\x90\xce\x56\x3a\x63\x83\xf6\xa3\xed\x59\x9f\xa5\xc1\x76\xef\x40" + "\xb8\x56\xe3\x15\x70\xed\x71\xe9\xc5\x4b\x91\x8e\x3d\x78\x4f\xf0" + "\xbf\x22\x39\x22\x7c\x8b\x68\xd7\x3b\xfc\xec\x4c\xe4\x95\x6d\xe7" + "\x65\xac\xc2\x5d\xbe\xc7\x49\xfb\x6c\xf3\xf3\x88\xf0\x19\xf9\xd2" + "\x8a\xb0\xd5\x3d\x25\x59\x1a\x1c\x07\x6a\xea\xfb\x71\xee\xb1\x11" + "\x4d\x44\x07\x8d\x2d\x3f\xc2\xe8\xcd\xdf\x97\x0d\xe3\x3d\xa0\xf9" + "\xa8\x13\xa0\xf6\x59\xd6\x80\x57\x2d\x5e\x35\x1f\x62\xde\x6f\xf1" + "\x6a\xc5\xf4\x43\xf8\xfb\x21\xfe\xfe\x16\x2f\x1c\x9b\x1a\x88\xee" + "\xb5\xc5\xac\x6b\x62\x0d\x5c\x43\xf8\x51\xb7\xee\x3f\x26\xbd\xa3" + "\x27\xda\x69\x1f\x7b\x16\xfd\xe2\xd6\xc0\xbd\xbf\x5f\xf2\x00\xe6" + "\x83\xf4\x72\x8c\xf8\x55\x5f\x2f\x67\xe1\x55\x28\xdf\xef\x47\xd8" + "\x4e\xf9\xbe\x1d\xaf\xa3\x5f\x7e\x05\xe3\x0b\x77\x35\xa6\x9f\x3f" + "\xec\x79\x5d\x5b\xcf\x0f\xee\x55\x00\x69\x6f\x36\x5e\xd5\x81\xe9" + "\x7b\x2d\x22\xed\xcd\x14\xf1\xfc\xa6\x59\xfe\xcd\x07\xe9\x2d\xe4" + "\xd3\x5b\x88\xff\xad\x46\x91\xf6\xd6\x3e\x90\xf6\x79\xf1\x5e\x17" + "\x54\x3f\xe1\xac\x25\x79\xf6\xd1\xd9\x6e\x28\x4b\x87\xf4\x62\x16" + "\xc9\x68\xbb\xd0\x2d\x8d\x9f\xf1\xb4\x4c\xd4\xad\xda\x01\xfd\x79" + "\x79\x7a\xa0\xfe\xbc\x6c\x0a\xd2\x9f\x6a\xf2\x45\x68\x2f\xb5\xf5" + "\x42\x5f\xf6\xf7\x3c\x99\x87\xcf\x2f\xa7\x20\x9e\xfd\x34\xe7\x81" + "\x38\x78\x3c\xb4\xfd\x04\x8e\x3b\x2d\xa0\x25\xff\xd2\x2d\xbd\xfc" + "\x34\xe9\x2c\xd5\x2d\xd7\x2b\x68\x41\xfa\x30\xad\x81\xe8\x5b\x8d" + "\x78\xf1\x79\x0f\xc2\x35\xd8\xe1\x73\x85\x36\x5e\xa6\xfc\x51\xd4" + "\x47\x99\x5e\xc2\x49\xe5\xd8\x40\xbb\x32\xa9\x8c\xa8\xbb\xf1\x56" + "\x4c\xa7\x71\x2a\x7d\xcf\x14\x61\xf7\x3a\x80\x74\x92\x7e\xed\x5e" + "\x13\xda\x52\x3a\xf8\xdd\xd9\x30\xd1\x00\x26\xb4\xb7\xa8\x63\x52" + "\x63\xe2\x84\x62\x30\x11\x3e\xf2\xe9\xd8\x0e\x47\x3d\xd9\xa2\xc0" + "\x25\x9f\xff\xf7\x62\xe6\x87\x05\xc0\xeb\xa9\x23\x7a\x30\x5f\x55" + "\xef\x0e\x1a\x87\x6e\xdf\x28\xda\x8a\x75\xed\xc1\xf2\x4d\xd4\x76" + "\xe2\x27\xe6\x37\x23\x9e\x22\xca\xe3\x67\x01\x89\xf6\xec\xa1\xf3" + "\x22\x88\x1f\x04\x4f\xe7\x35\x8a\x7d\xbf\xf7\xec\xe4\x7c\xc3\xf2" + "\x24\x0f\x86\x75\x10\x8e\x12\x2f\xf3\x32\xf4\x47\x2f\x6c\xf4\x60" + "\x5c\xf1\xca\xdf\x03\xe5\xd3\xd8\xae\x96\x0f\x96\x6b\xc2\xf2\x2d" + "\x0c\xdb\x48\xfe\x04\xeb\x8c\xa7\x33\xe2\x30\xad\xda\x5f\x8e\x38" + "\xd6\x79\xf8\x3c\x0d\xe2\xf9\x14\x69\xa9\x26\x3c\x48\x4f\x8b\xc0" + "\xf5\x4a\xe2\xaf\x8a\x03\x65\x2d\xe3\xdb\x43\x32\xe7\xf6\xbc\x91" + "\xb7\x09\x7d\xd7\x2b\x6f\xd6\x89\xbc\x66\x84\x69\x66\x7d\xe9\x40" + "\xe7\x2f\x88\xbe\x84\xe7\xed\x2b\x39\xcb\xe5\xdb\x22\xfc\xda\x2b" + "\xbf\x5b\xbb\x89\x75\x0d\xd0\xfd\x4a\x99\x72\x86\x85\x4c\xf7\x3e" + "\xaa\x8f\xad\xcf\xe1\xfd\x2a\xd5\x41\xe5\x65\x7c\x79\x84\x4f\xe1" + "\xd5\x04\xa4\x43\xf0\xab\xb1\x06\xd3\xf7\x90\x2e\x72\xbe\xa1\x1f" + "\xed\x29\x21\x5d\x7c\xa5\x02\xcb\xef\xaf\xa2\xe7\xf5\xfc\xd9\xc8" + "\x7d\x6c\x7f\x7e\xe3\x11\xca\xb7\xe3\x38\x7f\xfb\x63\xa8\x4b\x7e" + "\x80\x6b\x12\xc0\xe4\xb2\xf2\xb6\xed\x75\x3d\x39\x4d\x73\xc0\x0b" + "\x40\x74\x22\x8f\x9a\xdd\xe5\xaf\xa6\xa0\xef\x2f\x24\x5a\xd1\x5f" + "\xef\x63\x2f\x64\x03\xd1\x8c\xfe\x4c\xa6\xef\xd5\x17\x65\xd9\xef" + "\xa3\x36\x12\x3f\x27\x08\xdf\x87\x79\x7b\x67\x12\xed\x03\xed\x7e" + "\xb5\x54\xcd\x63\xde\x6e\x94\x03\xc9\x8b\xe4\xa2\xc2\x49\xba\x5f" + "\x8d\xb8\xf6\x8a\x67\xa1\x1b\xc4\xeb\xea\xcb\xd8\x21\x82\x1f\x80" + "\xfd\x19\xdf\x8f\x7f\x33\xd6\x3d\xb1\x00\xfb\x74\xb4\x0b\x3a\x87" + "\x04\xf1\xee\xa5\xb3\x38\x11\x47\x33\xf1\x14\x69\x89\x25\x7d\xc4" + "\xe7\x43\x72\xb9\x18\xec\xcf\xc7\xe1\x95\x36\x60\xff\x3f\xf3\x05" + "\xea\xd7\xcf\x82\xed\x9f\xe4\x5d\xed\x2f\x49\x07\xae\x0f\x6b\xc0" + "\x78\x4a\xfa\xd9\x73\x72\xdf\x21\xcb\xfa\x67\x27\x0f\xa0\xbd\xa8" + "\x70\x14\x06\xc9\xba\x99\xeb\xe3\xfa\x59\x1a\x6a\x33\x96\x6d\x96" + "\xf1\xf0\x36\x73\x7d\xb2\x72\x1d\x38\xc4\xd6\x63\x3b\xfb\xf5\xe0" + "\xd5\x76\x59\xce\x87\x82\x78\xa2\xf8\xae\x44\x3a\x2f\x8e\x7c\x12" + "\xc6\xb8\x77\xb8\xfb\x06\xfc\x12\xc9\xde\xcf\x65\xff\xb3\xa2\x7a" + "\xd1\xdf\xca\x7e\xeb\x67\x22\xff\xb2\x00\x1d\x26\x5a\x5e\xe3\xfa" + "\x4b\xb4\x94\xe4\x10\x2d\xcd\x9c\x8e\x12\x23\x9c\x92\xf6\x26\x51" + "\xfd\x58\xb6\x49\xb6\x57\x19\xd7\xab\x5b\x09\xd7\x53\xe8\xab\x88" + "\x26\xac\x5b\xcf\xfd\xdf\x0c\xae\x07\x4f\xcb\xb4\xb7\x7a\xac\x54" + "\xf6\xe5\xa2\xb3\x12\x2f\x8b\x71\xcc\x4b\xdd\x1e\x71\xa6\x4c\x34" + "\x96\x6f\xa4\x7d\xfc\x8f\x4b\x4d\x9d\xe4\xa3\xe9\x1d\x12\xde\xb7" + "\xd1\xf7\x9e\xe8\x53\xb4\x88\x4f\x47\x3a\xaa\xe8\x45\xb7\xd4\xf4" + "\x1e\x8d\x17\x90\xd7\x7b\x31\x46\x6a\x24\x7e\x93\x2e\x63\x8c\x94" + "\xe2\x2e\xdf\xdb\xad\xe8\x2d\xd6\x53\x4b\xbc\x17\xf2\x79\x6d\x12" + "\xea\x71\xf3\x80\x6e\xbd\x36\x49\xe6\x63\x23\xf2\x51\x87\xf5\xbd" + "\x29\xb7\xab\x11\xe1\x31\x16\x6b\xda\x25\xd3\x2e\x9f\x1b\xf8\xda" + "\x6c\x45\x0e\xb2\xad\x1e\xaa\x22\xff\xcb\x65\xf0\x5a\xa7\x5c\x76" + "\x8f\x5c\xd7\x67\x0a\x2c\xc5\x88\xe2\xac\xa8\xd7\x3e\x23\x3f\x38" + "\x11\x65\xcf\x7d\x1f\x3f\xa7\x56\xa4\x91\xed\x88\x3a\x9a\x2a\xb9" + "\x1e\x62\xdc\x33\xa0\x47\xaf\xed\x0f\xf2\x4f\xe4\x8b\xab\x0f\x23" + "\x0e\xf2\xa7\xa4\x4b\xe4\x53\x69\xbc\x82\xf8\x76\xc8\xf6\x23\xd3" + "\xfc\xfa\xd8\x40\x5d\x69\xda\x80\xba\x32\x7e\x00\xf7\xeb\x86\x50" + "\xfd\x5c\xbd\xf0\x81\xb5\xa2\xcc\xeb\x2b\xe4\xb6\xed\x15\x6d\x93" + "\x9f\x89\x6f\x9b\x39\xdf\xc6\xab\xf8\x88\x7c\x7b\xe3\x39\x19\xbe" + "\x99\x7c\xf9\x80\xbd\xbe\xfe\xb1\x62\xcb\x83\xfd\xc5\x1b\xdb\xc8" + "\x1e\x54\x74\x35\x05\xf9\x8b\xe6\xd0\xfe\xe2\xf5\x52\xb9\xbd\x0d" + "\x41\xb6\xb1\x47\x8e\x77\x77\x2a\x72\x38\x8c\xe3\x31\x71\x2e\xd2" + "\x9e\x9d\xe4\x3f\xa9\x6e\x75\x1f\x54\x27\xf8\x2a\xdb\xf2\x1b\x4f" + "\x0c\x96\xc3\x1b\xd3\xd4\xf6\x4c\xb2\x26\x9f\x40\x38\x48\xa6\x3c" + "\xae\xc4\x34\x21\xd7\x37\x28\x7e\xaf\x56\xfb\x68\x84\xdd\xe1\x67" + "\x64\x2f\x6f\xa4\x07\xda\xe2\xeb\xfb\x64\x5b\x94\xeb\x6e\x1a\x89" + "\x32\x32\xa9\xea\xdd\x1f\x54\x2f\xc9\xa6\x85\xf8\x20\xcb\x34\x52" + "\xe9\xd3\x08\x1e\xcb\x16\x61\x19\x67\x50\xff\x58\x4d\xf4\x61\x5d" + "\x16\xee\xb3\x9e\xe5\xbe\xa2\xc8\x2d\xe8\x71\xd5\xcb\xfd\x04\xa6" + "\x99\xe4\x34\x9b\xdc\x97\x28\x7a\xb3\x2c\x90\xa6\xa6\xcc\xd0\xf1" + "\xd1\xeb\x16\x25\x3e\xe2\xb8\xb8\x2f\x6a\xca\x92\xdb\x47\x69\xe3" + "\x45\xda\xeb\x89\x94\x56\x25\xf8\xb0\x83\xf1\xfe\xea\x35\x9b\xdc" + "\x5f\x91\x7d\x49\xf8\x6c\x22\x1b\xa3\x67\xc4\xc1\xc7\x82\xf6\xd2" + "\x5e\x1a\x43\xd4\x38\xa4\xbd\x87\xc8\x1f\x90\xbf\xa0\x75\xa9\xfc" + "\x77\x0e\xff\x3d\x43\x7e\x87\xe2\x10\xca\x47\xb8\xfd\xe4\x8b\x8e" + "\x4b\x6f\x46\x19\xef\xc1\xb8\xe0\x7f\x75\x88\xb7\xa9\x5b\x94\x7d" + "\xf3\x2a\x1e\x2b\xfc\x6f\x7a\x84\x92\xa6\x94\x43\xbf\xd5\x46\xe5" + "\xa8\xbc\xe2\xbf\xc8\x77\x79\xc9\x37\xf1\xfa\xde\x5c\x22\xeb\x38" + "\x1f\x37\x28\x71\x51\x9f\xa4\x82\xa5\xf3\x64\xb8\x4f\x7b\x73\xaf" + "\xf0\x67\x6f\xee\xa4\xb2\x5c\x7e\xe8\x2b\x37\x9f\x65\x9f\xd6\xaf" + "\x01\x6d\xdd\xe7\xe4\x17\xf7\xd4\xca\x74\x7a\x44\x3b\xde\xfc\x15" + "\x6f\x87\xf0\xa9\xd5\x82\x96\x3d\xb5\x75\xbd\x3c\xef\xcf\xd4\x16" + "\xca\xdb\xae\xca\x63\x7d\xc9\x94\xc7\xcf\xf9\x0a\x2e\xe7\xef\xb3" + "\x0c\x82\xaf\x17\xe7\x01\xeb\xea\x9e\x55\x7c\xef\x5b\x45\x82\xce" + "\xb7\x6e\x56\xfc\x2e\xf2\xa5\x85\x7c\x2f\xcf\x5b\x2e\xc3\xcc\x91" + "\x7f\xb9\x7f\x7f\x6b\x99\xe0\xab\x41\x92\xf9\x7d\x48\xb4\xe3\xad" + "\x0d\x7c\x9c\xfd\xbf\xd9\xc8\xdb\xb7\x72\x14\xde\xaa\xef\xc9\x7e" + "\xb0\x7e\x3d\x3d\x73\xbd\x2f\xe6\x63\xd8\x5a\x82\x21\x9a\x44\x1f" + "\xf1\x66\x56\x70\x4c\x7d\x5c\xda\xf7\x77\xea\x97\x44\xac\xba\xef" + "\x77\xf2\xfc\x0f\xd8\xd6\xec\xc6\x7e\xe1\xed\x44\xc5\xc7\x30\x77" + "\x3a\x8e\xf9\x8f\x21\xcc\xdb\x57\x51\x1a\x9d\x11\xa2\x86\x21\xff" + "\xf4\x46\xaf\x43\xc6\xf9\x96\x47\xf1\x1b\xe4\x4b\x0e\xbb\x8e\xc9" + "\x31\xdd\xdb\x8d\x75\xb2\x2f\x39\x25\xbd\xfd\x4a\x60\x1c\xf6\xf6" + "\x2b\x81\x3e\x63\xdf\x7b\xc1\x3e\x03\xe3\xe6\xad\xee\xf2\xb7\x8b" + "\x03\xe2\x00\x4c\x3b\xb7\xef\x78\x3b\x93\x6c\x94\xce\x88\xe3\xfe" + "\x89\xcf\x69\xed\x1b\xae\xd0\x4c\x7e\xb3\xe7\x49\x65\xfe\x62\xdf" + "\x6b\x14\xab\x05\xd5\xd7\x1d\xe0\x3b\xa9\x3e\x05\x9f\x16\xe8\x8c" + "\x31\xe4\x03\xcd\xb7\xbc\xbd\x5f\xf6\xf3\x0d\x01\xbe\x52\xee\xc3" + "\xc8\x4f\x06\xf6\x55\x7b\x76\x06\xf6\x55\xfb\x9e\x1b\xec\x23\xf7" + "\x59\xce\xbf\xaf\xda\x67\x26\xbf\xa5\xf8\xc8\x40\x5f\xb0\x2f\xbf" + "\x2e\x20\x96\x7d\xdb\xa5\xc4\xb2\x03\x7e\xf4\xed\xad\xe4\xa3\xb0" + "\xfe\x66\xb9\xee\x4e\x87\xb4\xbb\x4b\xa9\x1b\xf3\x13\x0f\x1b\x51" + "\x37\xcb\xf7\x64\xa2\x4e\xb5\xca\x31\x20\xb7\xcd\x5e\x7e\x1e\xd1" + "\x5b\x7a\xd4\xbf\x68\xd2\x33\xdb\xaa\xcf\xa1\x73\xa0\xaf\x68\xe9" + "\x59\xad\xf0\xf7\x9d\x27\xd4\x71\xe1\xce\x67\x59\x99\xbb\xfc\x9d" + "\x59\xea\x36\x56\x62\xda\x76\x79\x0e\x81\xf3\x96\xe3\x7a\xc7\x58" + "\xff\x6c\x60\xdb\x44\x3b\xde\xc9\xa2\x76\xd0\x98\x08\xeb\x4f\xa0" + "\xb8\x07\x63\x3e\xbc\xdf\x5b\x53\xdf\xaf\xf3\x2f\x75\x9f\xb5\xaa" + "\xe3\xab\x3d\x2e\xf2\x95\xf2\xd8\xb3\x15\xe3\x9d\x6a\xf5\x5c\xcc" + "\xec\xa9\x99\xc6\x82\x35\x2b\x56\x15\x2e\xbf\xc9\xb8\x62\xd5\x8a" + "\xc2\x15\x4b\xf2\x57\x6c\x5c\x52\xb8\x62\xf5\xaa\x71\x2b\x97\x3c" + "\xb2\x62\xa9\x71\xfd\x92\xb5\x46\x53\xd1\xb5\x45\xd1\x30\x00\x7a" + "\x9b\x71\xc9\xda\xb5\x4f\xac\x5c\x96\x67\x5c\xb5\x62\xe9\xf8\x35" + "\xcb\xd6\x2e\x2b\x34\x2e\x59\xb3\xfa\x89\x55\x79\xc6\x6b\xf3\x26" + "\x5c\x6b\xba\x25\x2f\x5a\x3d\x87\x36\x46\x0f\xdd\xfe\x2f\xfe\xd6" + "\xb5\xfd\x0b\xd0\xc5\x6b\x0a\xd6\xc4\x17\xad\x58\x25\xe6\xec\x7e" + "\xfe\xde\xc4\x1d\x50\x40\x67\xc4\xd3\x79\xc7\xac\xfc\x9d\x76\xfc" + "\xd5\x12\x1c\xb6\xd3\x48\x67\xc4\x23\xed\x89\xee\xf2\x9f\x97\x3a" + "\xa4\x5f\x5a\xf8\x59\xc6\x98\x8e\x6d\x4b\x64\x5f\xfc\xb6\x0b\x63" + "\xb6\x02\x7a\x5f\x5e\xff\x05\x24\x54\xaf\x03\x2d\x5e\x31\x78\xe9" + "\xe9\x0c\x79\x2c\xb3\xcf\x21\xbd\xdb\x2e\xce\x7c\x79\x37\xcb\x19" + "\xf5\x71\x26\x2b\xfb\x58\x9e\xb3\x7d\x77\xae\x32\xcf\x9c\xf1\x34" + "\x64\x90\x7e\x1e\x93\xde\xe5\xef\x15\x9f\x42\x5d\xa6\xf9\xda\x9e" + "\xff\x77\x97\x19\xe3\xc1\xa3\x34\xdf\x8a\x79\x73\x5d\x12\xc4\x20" + "\x5d\xda\x03\xc5\x26\xf8\x11\xd6\xb5\xd6\xc0\x98\xbb\xfc\x5d\x83" + "\x32\x9f\x86\x6d\xd0\x63\x5b\x3a\xe4\x76\xf4\xf1\x76\x3c\xcb\x92" + "\x76\x8c\x40\xfa\x7e\x48\xf4\xbc\x3b\x4d\x69\x03\xd2\xdd\xe1\x90" + "\x7e\xde\x88\x74\xea\x89\xae\x50\x73\x7d\x34\xdf\x85\x74\x56\xfa" + "\xd7\x21\xdf\x46\x89\x33\xee\xb6\xd7\x09\xfb\xc3\xf6\xb4\xd4\xe3" + "\x7d\xd5\xe7\x10\x53\x49\xe7\x93\x5b\xaf\x66\x6d\x2e\x2f\xd8\x2d" + "\x1d\x10\xbf\x81\x39\xd9\xcf\xff\xd6\x25\xb7\xa9\x99\x7c\xc3\xdb" + "\x8f\x76\x68\xa9\x4d\xd8\x57\xc4\xd4\x7f\x1e\x76\x6e\x51\xfb\xa3" + "\xcb\x98\x8b\xfd\x54\x1d\x73\x35\xf3\x73\x80\x28\xde\xea\xb1\xd2" + "\x99\xd6\xcd\x3a\xac\x3b\x57\x8e\x8d\x5d\xac\x2f\x47\x15\x4b\xbd" + "\x4b\x7a\xe6\x0a\x83\x5b\xa7\xe0\xa6\x73\xcf\xa9\x8c\x90\x7f\x73" + "\x25\x96\x71\xaa\xf0\x5b\x82\xf1\x13\x4e\xbc\x77\x2a\xf5\x88\x71" + "\x78\x33\xc5\x04\x4e\xd4\x65\x67\x98\xfa\x92\x7e\xf8\x2c\x3b\x62" + "\xc7\xf4\xed\x67\x41\x8b\xb0\x38\x76\xe5\xf8\xd1\x3e\x7e\x3e\x8e" + "\xf0\x3f\x75\x19\xc0\x56\x84\xe9\x29\x7f\x37\xd7\xc5\xcf\x20\x6f" + "\x46\xfb\xdf\x93\x1d\x3c\x8f\x2d\xeb\xf3\x6d\x41\xfa\x6c\xfe\x21" + "\xc5\x84\x3b\x10\x3f\xea\xd0\xf6\x33\xd8\x0f\xe3\xf3\x84\x1d\x90" + "\x4c\xf5\xe0\x7d\x3b\xcd\x87\xb8\xcb\x7f\x91\xaa\xd4\xc7\x50\xff" + "\xab\xfc\x62\x0e\x46\xd6\xad\x71\x34\x77\x5d\x52\xc4\xd8\x01\xf4" + "\xef\x44\x23\xe9\x18\x96\xc9\x57\x74\x0a\x75\xfd\x08\xd7\xab\x04" + "\x48\x66\xe5\xcd\xce\xfa\x11\x08\x87\x7a\x55\x87\xfa\x44\x7a\x85" + "\xb0\x35\x8a\x4e\xa1\xae\xb5\x13\x1c\xd2\x10\xdd\xb4\xd1\xac\x25" + "\x1f\xd9\x29\xfd\x32\x96\x74\x8c\xfd\xe4\xde\x0e\x76\xf9\xc2\x0e" + "\x21\xa7\x5f\xc6\xda\x3d\x42\x06\x03\x7c\xff\x85\x43\xc5\xf7\x76" + "\xd4\xe3\x68\xe2\xb3\x98\xab\xfe\x65\x2c\xd2\xd6\xce\x63\xf1\x4d" + "\x28\x03\xde\x57\xfd\xe2\x10\x95\x97\x79\x78\x68\x80\x87\xbf\x4c" + "\x0e\xc5\xc3\x20\xde\x69\xc5\x39\xe7\xbf\x4c\x21\x5b\xc1\x32\x39" + "\xca\xd9\xe5\xa1\x64\x89\x75\x68\xb5\x3b\x40\x47\x75\xb4\x24\x70" + "\xf8\x0a\xa5\x8e\xed\xc8\x6b\x67\x89\xe5\x9c\xfa\xdc\xd2\x00\x40" + "\x73\xe2\x54\x3e\x29\x81\xf8\xfb\xcb\x43\x03\xe5\x99\x2b\xb8\xfc" + "\xb5\x4b\x03\x68\xe5\x17\xd2\xea\xf8\xd1\x08\xd4\x23\x4e\xef\x7f" + "\xc5\x9c\x8b\xde\x24\xa3\xe8\x27\x6d\x63\x48\xbf\xff\x6b\xba\xbd" + "\x06\x80\xd2\xe4\xe7\x94\x1e\xec\x7b\x82\xe7\xf7\xc3\xbf\x6f\xf8" + "\xaf\xa7\x03\xdf\x37\xfc\x57\x61\xb8\xf7\x0d\x41\xf5\xfe\x8a\xea" + "\xf5\xd7\x67\x69\x54\x75\xef\xf5\x87\xa8\x5b\x29\x3f\xa1\x41\x3d" + "\x9e\xd9\x3f\x9c\x68\x38\x8c\xfd\x14\xbb\x32\x4b\xc3\x10\x4f\x0b" + "\xef\xc3\xf7\xeb\x45\xfc\x42\x71\xd1\x7f\x39\x09\x26\xb8\x1d\xfd" + "\x7f\xba\x04\x9a\x63\x87\xb3\xfc\x21\x72\x06\xe8\xe9\xd7\xd8\xa1" + "\x64\x4b\x01\xc0\xc0\x42\x3c\xc4\x00\x8c\xe6\xf0\x0c\xff\x44\x92" + "\xfc\xec\xe4\x0f\xda\x7e\xf8\xfe\xfc\xaf\xf1\x17\x25\xe8\xe5\xf8" + "\x3c\xa0\x91\xeb\x53\xb7\x69\xda\x39\x4a\x33\x50\x8a\x84\xfa\x7b" + "\x1c\xaf\xd2\xac\x48\x80\x31\x06\x0e\xcc\x98\x57\x64\xf4\x3f\x33" + "\xf5\x33\xa5\x04\x3e\xe3\x5f\x44\x8e\xaa\x82\xab\x23\xf2\xf8\xd2" + "\xa7\x6b\x33\xfb\x93\xa4\x06\xbd\xba\x4a\x3d\x94\x46\xf2\x9b\x78" + "\xfa\xc7\x83\xf8\x92\x31\x7f\x4c\x6a\x3f\xc0\x25\xae\x2d\x2a\xf0" + "\x8f\x04\xf9\xd7\x94\x9d\xa3\x8d\x17\xfa\x37\x4a\x75\x7f\xb5\xf8" + "\xb9\x26\xfd\x22\xe2\x3f\xf7\x9f\xb1\x3d\x4a\xb9\x1d\x50\x8f\x6b" + "\xda\x43\x81\x0e\xf0\x3f\xc9\xa4\x24\xa9\x35\x74\x20\xff\xfa\xbd" + "\x81\xcf\x63\x2d\x81\xcf\x37\x36\x5f\x0c\xd2\x6d\xf4\x4f\x89\x03" + "\x63\xf6\x1b\xb6\xf6\x27\xc6\x07\x99\x4c\x7c\x75\x90\x09\x0d\xfc" + "\xc9\xd4\x44\x00\x8c\x8b\x51\x25\x6b\x43\x43\xff\x63\xfe\xae\xd8" + "\x22\x1b\xc4\xd5\x4e\xfd\xa0\xcc\x29\x41\x69\xf4\x3c\xc4\x28\xa7" + "\x4d\xfa\xd5\x20\x78\x9e\x66\x54\x3d\x6b\xcc\xf8\x4f\x03\xea\xff" + "\xd1\x8b\x41\xeb\xb7\x7f\xff\x81\x7f\x1a\xb2\x8f\x6f\xff\xfe\x41" + "\x7f\x4c\xf4\xe2\xe8\x89\xf8\x0f\xfd\xc7\xfa\x1d\x25\x93\x33\x98" + "\x9c\xc0\xe4\x9b\x8b\xd2\x8f\x7f\xfb\xf7\xed\xdf\xb7\x7f\xdf\xfe" + "\x7d\xfb\xf7\xed\xdf\xb7\x7f\xff\x06\x7f\x1a\x3e\x8e\x60\xf2\x5f" + "\xff\x7d\x7f\x3e\x0d\x83\x56\x24\x30\x49\x03\x4c\x95\x51\x7a\x33" + "\x68\x74\x30\x44\x7b\xf1\xa2\x3c\x63\x3f\x41\xe7\x59\x80\xc6\x92" + "\xb4\x46\xe0\x3b\x78\x5d\xa9\x4a\x4f\xba\x58\x14\x5d\xb4\x3f\x0d" + "\x32\x31\x02\xc7\x87\x91\x30\x04\x86\x82\x0e\xa2\x20\x1a\x86\x41" + "\x0c\xc4\x42\x1c\x8e\x3b\xf5\x30\x1c\x46\xc0\x25\x90\x00\x97\xc2" + "\x65\x70\x39\x18\x60\x24\x5c\x81\x2d\x4a\x84\xab\x70\x8c\x7f\x35" + "\x32\x66\x34\x8c\x81\x6b\x42\xb7\xab\x14\xcc\x06\xfc\x07\xff\xcf" + "\x04\x33\x7f\xce\xfd\x36\xfd\x1b\x4d\xb7\xc9\xe9\xed\x72\xba\xe3" + "\xdb\xf4\x6f\x34\xdd\xf8\x7f\xfc\x3b\xfa\xff\xf4\x57\x83\xee\x5b" + "\x78\x70\x4d\x48\xbf\x19\x9c\xaa\x91\xff\xfa\x9f\xe1\x4b\xca\x0f" + "\xc2\x17\x58\x3e\xf8\xcf\x8c\x57\x8a\xb8\x2d\x01\x90\xe7\x7c\x99" + "\xfa\xcf\x7b\x2a\xe0\x2f\x1c\xa2\xfe\x3f\x6b\x0e\x5e\x16\xbc\x0a" + "\xf1\x5a\x8f\xd7\x53\x78\x55\x2a\x68\x05\x0c\x7d\x42\xf2\xf7\x6c" + "\x80\x63\xf8\xfb\x3f\xa9\xf8\x5b\x8b\xbf\x47\x00\x3a\xb1\xdc\x5f" + "\x1b\x01\x8e\x23\xc0\xdf\x54\x73\xa3\x5f\xe4\x0e\x50\xdb\x73\x48" + "\xdc\x1b\xf1\xf2\xd0\x39\x7b\xe0\xd0\x68\x1d\xf8\x63\x9b\x9e\x95" + "\x6e\x9c\x34\x21\x65\xc2\xcd\x37\x1b\xc7\x67\x8e\x37\xde\x64\x9a" + "\x74\xd3\x44\x53\xca\xc4\x9b\x26\x19\x4d\x93\x6e\x4b\x49\xbd\xed" + "\x3b\x29\xc6\x95\x1b\xd6\xac\x98\x64\x7a\x64\x99\x71\xf9\x8a\x35" + "\x2b\xd7\x2f\x59\xb3\xec\x4b\x9b\xf3\x55\xfe\x88\xb4\xab\xfc\xc0" + "\xa5\x11\xc8\xf9\x29\x20\xb5\xe4\x82\xf4\x71\x36\x0c\x12\x95\xa6" + "\x5a\x9e\x63\x4d\x96\xaf\xa0\xec\xc7\x1b\x40\xb3\xaa\x0c\x34\x2b" + "\x6c\xa0\x59\x5a\x0c\x9a\x85\xfb\x41\xf3\x03\x13\x68\xaa\x30\x6f" + "\x9b\x11\x34\xd6\x16\xd0\x6c\xec\x1e\x9c\xf6\x7c\xb5\x48\x7b\x17" + "\xcb\xbe\x85\xd7\x5e\x3d\x68\x5e\xf0\x8a\xb4\x5f\x3b\x41\xf3\xde" + "\x3f\xdb\x9c\xe1\xf9\xc6\x13\x83\xfe\x1c\x5c\xaf\x68\x26\x6b\xc4" + "\xfe\x10\x93\xa6\xdf\xfe\x7d\xfb\xf7\xed\xdf\xb7\x7f\xdf\xfe\x7d" + "\xfb\xf7\xed\xdf\x3f\xf9\x9f\x53\x03\x29\x9f\x4b\x5a\xf8\x35\x46" + "\x45\x6e\xab\x2e\xd1\xa1\x49\xab\xa0\x35\x26\x40\xdf\x52\x81\x8e" + "\xaf\x39\x15\x97\x16\x7f\x22\xb1\xe3\x1f\x82\xd7\x50\x9d\x7a\xad" + "\x0a\xad\x45\x3a\x60\x30\x41\x84\x01\xc4\xba\x29\x2b\x6b\x17\xdf" + "\x22\xdf\x04\xdd\xa0\xe3\x7b\x09\xd0\xf7\xa3\x88\xbf\xc8\x01\x3f" + "\x33\x28\xeb\xac\x14\x38\x5a\x67\x45\xeb\xb2\x10\x76\x25\xc1\x86" + "\x59\x57\xa3\x67\x3f\x31\x48\x53\x77\x02\xd0\x77\xa8\x3f\x7a\x96" + "\x39\x5b\x8a\x01\x0e\xec\x11\xdf\xa3\xd2\x9a\x1b\xc4\xdf\xe1\x80" + "\x6d\x09\x62\x9d\x15\x73\x3d\x85\xe9\x98\xd6\xed\x80\x72\xad\x5c" + "\x67\xb7\x92\x6e\xdf\xfa\x05\xb4\x18\xf9\xf7\x36\xce\x16\xa3\x0f" + "\xa6\x8d\xa6\xf6\x47\x19\xb0\x7c\x45\xb8\x35\x36\xca\x7a\x32\xaa" + "\x5b\x86\x4f\x0f\xaa\x0f\xdb\x18\x95\xa3\xd4\x17\x06\x47\x0c\x95" + "\x55\xf0\x20\xed\xdd\x58\xa6\x5a\xc1\x83\xf4\x28\x34\x3a\xa7\x6d" + "\xe2\x75\xec\x0d\x45\x93\xf1\x83\xb4\xc8\x65\xb7\x4c\xec\x4c\x3b" + "\xb2\x3c\xc9\x78\xe9\xa4\xe9\xcb\x92\xae\x67\xa6\xf8\x71\xdf\x37" + "\x0d\x33\x47\x99\xe3\x26\xce\x33\x49\x7a\x69\x8c\x64\x1a\xa1\x97" + "\xae\x7b\x98\xfe\x6d\x1f\x95\xcc\x7f\x8d\xda\xb4\xad\x79\xb7\x18" + "\x87\x4e\xf9\xde\x33\xeb\xcc\xef\xbe\x3c\xc3\x7c\xf7\x82\xb5\x63" + "\x7f\x6d\x92\x2e\xf9\xfd\xf7\xdf\x4b\xfe\x9c\x20\x46\x8f\xa1\x7f" + "\x73\x0e\x44\x24\x8c\xb5\x12\x96\xf6\x91\xc6\x5f\x53\xca\x0d\xda" + "\xb4\xc2\xbc\x9b\x27\xee\xa1\x1a\xef\x5b\x3a\xde\x4a\x65\x66\xcc" + "\x16\x65\x04\xc4\xc4\x7d\xea\xbc\x09\x6f\x51\x69\x23\xa7\x01\xb4" + "\x02\x57\x3f\xee\xcb\x05\x85\x22\x75\x4c\x9b\xe9\x2a\xb9\xee\xdd" + "\xf4\xef\x83\x2f\x4c\x90\x10\xc3\x88\xf1\x77\x51\xee\x44\xb7\xc9" + "\x6d\x6c\x49\xd3\x3e\x92\x94\x3c\x74\xd2\xcb\x78\x97\xf4\x48\x92" + "\x5e\xc2\xfb\xef\x89\x7b\xe2\x41\xde\x77\x05\x84\x5e\xba\x36\x21" + "\x2d\x2f\xef\x96\x4f\x5c\x79\xb7\xe8\x25\xf3\x9e\xbc\x34\xf3\x65" + "\x15\xf9\x37\x26\xa5\x25\xe5\xdd\xac\x97\xf8\xef\x6d\xe6\x6b\xcb" + "\x1f\xd4\x4b\xd7\xff\xca\x34\x5c\xaf\xf9\x4d\x83\x06\x3e\x90\xe6" + "\xef\xfd\x20\xe2\xe3\x8f\x0f\xc2\x0d\x2b\x0f\x6a\x6e\x98\x75\x50" + "\xd2\x0c\x3f\x18\xf3\x00\xfc\x46\x3f\x14\x7e\x63\xc0\xcb\x78\x37" + "\xb4\x6a\x4a\x32\x5b\xa5\xf5\xb9\xad\x11\x25\x87\x5b\xb5\xf7\x43" + "\x6b\xe4\xe2\xe1\xad\x43\xee\x9e\xdb\x3a\xf4\xfe\x4f\x5b\x75\xd7" + "\x43\x6b\x14\x40\xeb\x68\x90\x5a\xc7\x40\x42\xeb\x4d\xc3\x9f\x69" + "\xbd\x7b\x94\x64\xbb\xa4\xe7\x4e\xdb\x15\xda\x19\xb6\x24\x3d\xd8" + "\xae\x8d\x06\xdb\x75\x31\x31\xb6\xeb\xf1\x1a\x0b\x0d\x36\x13\x3e" + "\xa7\x41\xa2\x2d\x72\xe3\x10\x00\x41\xcb\x41\x23\xc0\xc1\xd1\x30" + "\xe5\xe0\x18\xfc\xbd\x06\xaf\x24\xbc\xae\xc5\xeb\x7a\xbc\x70\x9c" + "\x72\x90\xf6\xfd\x81\xe4\x21\x69\x3f\xff\xd5\x92\x25\x29\x4b\x6e" + "\xce\x9a\x1a\x11\xb1\x2c\x09\x86\x21\xd7\xb4\x69\x49\xa3\x23\x53" + "\x23\x97\x25\x7d\xe2\x32\xe3\xbf\x7a\xe9\xa1\xff\x8e\x18\x32\xd1" + "\x9d\xea\xce\x7d\xf7\x13\x1f\x44\x23\xff\x21\x58\x87\x7b\xac\xa0" + "\x71\x21\x8d\x2e\x6b\xcf\x9d\x6e\x6b\x8c\xde\x01\x51\x16\x45\x8f" + "\x45\xde\xaf\xf5\x2e\x6b\x29\xea\x5f\xcc\xb8\xd0\x79\x5b\x28\x2f" + "\xfd\x1c\xe5\xf2\x42\xe7\x91\x4e\xc7\x94\x2a\x79\x3d\xd2\x81\x4c" + "\x7c\x46\xfd\xd7\xa5\x06\xc2\xda\x22\x5c\x56\xcd\x16\xcc\xdb\x3b" + "\x18\x8f\x0d\xf1\x4c\x2b\xc7\xbc\xd6\x10\x79\xf7\xb8\xac\xf3\xa8" + "\x8e\xce\xa0\x3a\x5c\x4a\x1d\xf4\x9d\x77\x1d\xda\x17\xf9\x1d\xbf" + "\x35\xaa\x99\xca\xda\x3d\x4e\xd8\xe3\xef\xd2\x68\x8b\x0e\x01\xe1" + "\x71\x5b\x63\x93\x94\xf2\x04\x47\xfb\x14\xd0\xf7\x79\x7c\x1d\x28" + "\xc4\xde\x47\xeb\x40\xab\x10\x87\x71\x9d\xe6\xf2\x63\x10\xe3\xa3" + "\x32\x0e\x88\xb5\xb8\xa4\x0f\xb1\xee\xd8\x5c\xc5\xcf\x61\x5a\x1a" + "\x88\xf5\xe6\x2e\x6c\x7b\x29\xe6\x15\x0f\xa6\xf9\xc3\x11\x82\x2f" + "\xb1\x35\x4a\xde\xb9\xd6\x16\x8a\x32\x8c\xb9\xac\x1f\xfa\xb1\xcc" + "\xa1\xc1\xf8\x58\xa9\xcb\x2a\x3d\x83\x79\x5d\x21\xf2\xb6\x88\xba" + "\xe2\xb4\x21\xf2\xac\x98\x27\x61\x9e\x31\x4c\x5e\x04\xe6\xa5\x85" + "\xca\x6b\xa9\xe5\x38\xb3\xfb\x79\x1e\x17\x6b\xc6\x67\x8b\xc2\xf3" + "\x2f\x6f\x0f\xc9\x7b\x12\xf2\x3d\xae\x36\x18\x3f\xe1\x76\x49\x6d" + "\x84\xaf\x79\x70\xdd\x87\x34\x2e\x6b\x3a\xea\x42\xdc\x91\xc1\x79" + "\x1f\x5d\x89\x7c\x20\xba\x9c\x21\xf2\x12\xb1\x3d\xe8\xaf\xe3\x63" + "\x42\xe0\x1c\x82\x79\x0e\xcc\x4b\xfe\x12\x79\xe8\xb9\x0f\xa7\x7d" + "\x10\x46\x41\xe4\x71\x18\x31\x99\xda\x23\xf4\x02\x86\x1c\x87\xe1" + "\x6d\x3d\x62\x4d\xbc\xd3\xb8\x11\x22\xf0\x79\x17\xb3\xda\x2e\xc5" + "\xfc\x6e\xd4\x27\x9d\xfd\x0b\x2f\x1c\x87\xf8\x0a\x84\x89\xa0\x6f" + "\x58\xa9\x7f\xc2\xf4\x08\xbb\xc7\x4b\xdf\x71\xa0\x9e\xc5\xbf\x89" + "\xbf\x12\x96\xe3\xdf\x2c\xcc\xaf\x85\x24\xa2\x91\xaf\x63\xb5\xda" + "\x34\xb4\x2e\x94\xfa\x43\x97\x04\xd7\xbb\xb8\xce\xc6\x63\xff\xa7" + "\x6b\x90\xd7\xf0\x12\x0d\x5a\x2c\xbb\x49\xd2\xf3\x35\xe1\x4e\xc4" + "\x45\x34\xcc\xf5\x5b\x6d\x52\x3f\x1e\xc9\x36\x8c\xd6\xf7\xf6\x58" + "\xa5\x99\x2e\x29\x9e\x09\x3c\x7a\xa3\x82\x87\xe0\xb0\x2e\xbe\x4e" + "\xbe\xc7\xaa\xfd\xa1\x0a\x66\x9a\xba\xae\x89\x2e\x88\x20\x9a\x8f" + "\x81\xbe\x96\xea\x93\xdb\xc8\xd7\xdc\xda\xd7\x79\xc1\x8e\xf1\xc5" + "\x71\xd0\x17\x61\x5b\x8d\x07\x3c\xf4\xad\xb3\x6d\x78\xfd\x66\x00" + "\x6e\x17\x12\x18\x65\x9c\x35\x0a\x4e\xc2\xa1\x6a\xeb\x08\x51\x3f" + "\xb5\x55\x07\x32\x6c\x8b\x9a\x46\xc2\x8b\xed\xba\xbc\x0e\xe1\x5a" + "\x30\x6a\x91\x61\xba\x14\x18\x95\x0c\x46\xcb\xf4\x11\x7f\x48\x66" + "\x39\x8a\x7d\xba\xad\xc3\xb1\xff\x1f\xd6\x25\xec\x76\x20\x5d\xa6" + "\xc1\x20\x68\xd0\x20\x0d\x1a\x9b\xc0\x3f\x3c\x5d\xc1\xef\x00\xbd" + "\x47\x4d\x73\x1d\x87\xd5\x47\x09\x3b\xe5\xb0\x85\x03\xb0\xf1\x01" + "\xb0\xc8\x0b\x49\xc8\x00\x24\x07\x0c\xcf\x43\x7e\x44\x20\x4c\x13" + "\xca\xdb\xa8\xc0\xc8\xed\x37\x60\xde\x14\x19\x5f\x8b\x0a\x5f\x21" + "\xe1\xa3\x75\xb1\xc2\xf7\x0e\x77\x0c\xf8\x3e\x68\xc5\x67\xe7\x60" + "\xff\x4a\xf6\x3a\x42\x87\x70\x49\x94\x5e\x30\x06\xf4\x27\x60\xf8" + "\x67\x3d\x52\x44\x97\xe0\xc5\x08\xf4\x7f\xb1\x7b\x94\x32\xf8\x9c" + "\xe2\x00\xa3\x47\xae\x2f\x8f\x78\x33\xe0\x6f\xa9\xce\x11\x59\x4a" + "\x9d\x4a\xbe\xda\x66\xcc\x51\x13\x31\x3e\x31\xbf\x6a\x4e\x34\x8f" + "\x52\x62\x97\xc9\x2d\xcb\x93\x26\xba\x26\xb7\x18\x6f\x36\xbd\xb8" + "\x2c\x69\x1c\xef\xfb\xaf\x3f\x66\x1a\x83\xbd\xfb\xef\xf9\xbf\x3f" + "\xa4\x94\x24\x9e\x82\xe9\x74\x3f\x86\xee\xe5\x78\x01\xef\xee\x9b" + "\x1f\x31\xf4\xda\x35\x74\x27\x22\x07\xf3\x65\x8b\x96\x46\x4c\x93" + "\xef\xe3\x44\xce\x8d\x3c\xe6\x48\xbe\x8b\xee\xaf\xe3\xb8\x26\xee" + "\xa1\x9a\x27\x7c\xdf\x74\xfb\x82\xb7\x23\x0e\x3e\xf3\x98\x39\xe6" + "\x7a\x2b\xc1\x8c\xbb\xd7\xf4\x53\x4c\x39\x40\x29\x63\x76\x73\x0a" + "\xd4\xa5\xf6\x51\x29\x39\x3f\x71\xdc\x74\xd3\x8f\x17\xce\xbf\xe6" + "\xf7\xa6\x11\x97\xfc\x3a\xe7\x00\x95\xbf\x64\x44\x40\x4d\x63\x06" + "\xa8\x7a\x78\xfb\xd8\xa7\xbf\xf3\xa2\xc0\xb2\x60\x7e\xc4\xef\xcd" + "\xa3\x56\xaf\xa1\xd4\x6b\x78\x2c\x46\xb1\xca\xc4\x33\xa6\xc8\x67" + "\x16\x7c\xf2\xcb\x05\x2f\xb4\x3f\x38\x16\x5b\x7a\xc9\x0f\xdb\x1f" + "\x5c\xf0\xc2\x27\xbf\x8c\x78\x8a\x20\x6f\xc8\x33\x25\x18\x23\x27" + "\x3f\xd1\x32\x77\x2c\xa7\xea\xf2\x0a\x43\xcd\xc8\x3d\x57\x34\x5d" + "\xb9\x3f\xb1\xf5\xaa\xff\x1e\xf5\x97\xab\xff\x66\x74\x8d\x66\x18" + "\x47\xdc\x69\x1a\xdd\x1f\x47\x00\xc6\x11\xc7\x30\x8e\x28\xc1\x38" + "\xe2\xb0\x3a\x8e\xf8\x6d\xf4\x6d\xc5\x22\x96\x10\xf0\x22\xfe\x19" + "\xf7\xdf\x18\xff\xac\xc2\xf8\x67\xdc\xc1\xc8\xfb\xee\x3f\x18\x93" + "\x25\xe2\x9f\xe1\xf1\x43\x78\x0c\x34\x12\x7f\x31\x0e\xfa\xcd\x68" + "\xfc\x4d\xc6\xe7\xb1\x23\x86\x06\xc6\x44\xf3\xe2\x5a\x23\x73\x30" + "\x26\x4a\xc3\x98\xc8\xbc\xa4\x55\x37\xf3\x57\xad\x51\xa9\xe6\xd6" + "\xe8\xfe\xb8\x68\x46\xeb\x34\xc3\xc4\xd6\x99\x5a\x68\xbd\x07\x44" + "\x6c\xb4\x15\x4c\xbf\xd5\x26\x68\x3e\x8a\x01\xed\x47\x71\x0d\xd1" + "\x1f\xc5\xdb\x6c\x1f\xe9\xf1\x1a\x0e\x0d\x1f\x8d\x80\xa1\xbf\xbe" + "\xb3\x01\x7e\x3d\xb5\xc4\x71\x50\x0b\x71\x07\xa3\xe0\xcc\xc1\xe1" + "\xf8\x9b\xfb\x2c\x1c\xfc\x1e\x68\x0f\x46\x6b\xcf\x0c\xb4\x37\xe1" + "\xb3\x83\xa3\x3f\x98\x7c\x70\x4c\xda\xff\x3b\x78\xcd\xb4\x79\x07" + "\x93\x3e\xf8\xe0\xe0\xb5\x8e\x51\xea\xb8\x89\xda\x0c\x70\xe3\x56" + "\x8a\x60\x91\xdf\x37\x27\x0f\x31\x0d\x79\x7a\x19\x8f\x07\x6f\x91" + "\xe3\xc2\x5b\xcc\xd3\x9f\x59\xb0\x60\x69\x84\x64\x1e\xc5\xa3\x4b" + "\x39\xd2\x1c\x88\x3e\x03\x63\xce\xc9\x2d\x03\x31\x67\x92\x6b\x20" + "\xe6\x34\x0e\x99\xbc\x2e\x20\x3e\xeb\xc3\xb4\x23\x69\x49\xc6\x6b" + "\x4d\x3c\x32\x6b\x1f\x19\x1c\xad\x4d\xa8\x34\x4d\x4e\xd2\xdd\xdc" + "\x81\x31\xdb\xd0\xb2\xef\x2d\x7d\x99\x2e\x8c\xda\xce\xea\xa5\x67" + "\x1e\x5d\x92\x9a\xfd\xd4\x0d\x28\xf3\x4b\x28\x0a\x1e\xfa\xbd\xa7" + "\x9b\xbf\xf7\xbd\x67\x9a\x0f\x3e\x38\x7f\xec\x5b\x98\xf6\xeb\xa4" + "\x42\xd4\x9f\x3f\xe4\xfd\x61\xe2\x99\xb4\xc8\xef\xdd\xdf\xfc\xcc" + "\x4f\x1e\x79\xa4\x85\xf4\x85\x64\xab\xf4\x51\x3d\xd6\x11\x18\x93" + "\x68\xde\x75\x5b\x2f\xc5\xf8\x67\x64\x6b\x70\x5f\xf6\xad\x5d\x7e" + "\x6b\x97\xdf\xda\xe5\xff\x85\x5d\x5e\x06\xc2\x2e\x47\x56\x84\xb2" + "\xcb\x99\x73\x66\x64\xdc\x66\x7c\x62\xa9\xb1\x60\xcd\xea\x47\xd6" + "\x2c\x59\x69\xcc\x5f\xbd\x24\x6f\x59\x5e\x34\xf4\x67\x2c\x59\x5a" + "\xb8\x62\xdd\x92\xc2\x65\x83\xbe\x79\x34\x28\x31\xe9\xe0\xd8\x7a" + "\xa4\x27\x7c\x6c\x7d\x45\x42\xe8\x71\x89\x06\xfb\xf6\x2b\x4c\x21" + "\xf2\xc6\xc8\x79\xb3\x42\xe4\xdd\x25\xe7\x59\x42\x8c\x01\x63\xc5" + "\x18\xe3\x8a\xad\xa1\xf2\x30\xbd\x56\x89\x49\x70\x9c\x26\xb5\x8c" + "\xe9\x06\x8a\x49\x8e\xc3\x15\x1f\x60\x9b\xba\x30\x7f\xbf\x12\xcb" + "\x38\xe0\x8a\xad\x4a\x8c\x26\x8f\x43\x92\x5d\x56\x33\xb6\xf3\x0a" + "\x47\x88\x31\xca\x0d\x72\xbd\xde\x81\xd8\x68\x8e\xd1\x6d\xbd\x32" + "\x66\x70\x6c\xd4\x0e\x62\x0c\x79\x65\x72\x10\x6c\xaa\x02\x8b\xf1" + "\x24\xed\x05\xd1\x4d\xdf\xaa\x75\xc3\x95\xfb\x99\x75\x64\x0d\xc5" + "\x94\x34\x8e\x24\x3c\x62\x2c\xd9\xc1\xc7\x92\x38\x56\xec\xc4\xb2" + "\x85\xaa\xf1\x64\x27\xc6\xc6\x43\x69\x3c\x79\x1c\xae\xdc\x45\x63" + "\xca\x2a\x8e\xeb\x04\xe1\x9a\x4d\xb8\x1c\x70\xa5\x8d\xc7\x7d\xa2" + "\x6c\x93\x6a\xde\x0c\xc7\xb5\x57\xf2\x3d\x42\x95\xb8\x10\xf3\xdb" + "\x1d\xd2\x99\x7c\xa5\x0d\x14\x0b\xca\xed\x28\x15\x72\xb8\x32\xc4" + "\xf8\xa7\xfd\x87\x62\x1c\x98\xd8\x3f\xfe\x21\x7c\x7e\xeb\xc8\x37" + "\xeb\x38\xce\xc4\x24\x05\xa7\x5a\x2f\x97\xae\x5e\xb5\x7c\xc5\x23" + "\x4f\xac\x59\x66\x5c\x3b\x6b\x96\x71\xe5\xea\xbc\x65\x13\x26\x4c" + "\x88\x0e\xd0\xbf\x18\x11\xd3\x7e\x68\x26\x3d\xa4\xb8\x56\xd6\x43" + "\x33\xc6\x9c\x72\xdc\x9c\x58\x1a\x38\xbe\xf8\xd0\x2c\xc7\xb7\x7a" + "\x84\x31\xc9\x30\x7b\x02\x60\x10\x9f\x1c\x23\x53\x9c\x1b\x27\xc3" + "\xb4\x06\xe3\xc1\x3c\x3e\x2e\xa2\xef\xef\x7a\x44\xfb\xba\x83\xf0" + "\xdc\x29\x8f\x77\x50\xef\x87\xc8\xe3\x84\xab\xf4\x41\x78\xee\x1c" + "\x18\x6f\x68\x14\x98\x14\xf5\xd8\x04\x9f\xa7\x29\x32\x19\x88\xe3" + "\x0f\x74\x09\xdc\x1a\xfd\x40\xdc\x7f\x55\x7e\xd0\x58\xea\xb2\x01" + "\xdc\xa0\x97\x61\xaa\x03\x69\x3c\x70\x42\x6e\xab\x4e\x85\x67\x5f" + "\x20\x9e\x03\xff\x2b\xe3\x89\x50\xc1\x74\x04\xd1\xd8\x35\x98\x46" + "\x5b\x9c\xc0\xdd\x80\xf5\x3b\xe4\xb6\x8d\x0a\x6a\x3f\xc2\x70\xdc" + "\x09\x08\x93\xa8\xc0\xa4\xa8\xc7\x52\x34\x9e\xe3\xdf\x64\xc2\xa8" + "\x59\xa4\x4f\x78\x0d\x41\xba\xff\xaa\x1a\xd3\x0d\x95\xcb\x05\xb7" + "\x3f\xb6\x07\xc7\x0b\xf5\x01\xe3\xb4\x51\x41\xed\xc7\xb1\xe1\x08" + "\x85\x47\x5a\x05\x26\xb8\xfd\x0e\x41\xe3\xf0\xe1\x03\xed\x1f\xd5" + "\x11\x84\xe7\x32\xd2\x29\xc2\xa5\xaa\xcb\x1b\x84\xe7\x98\xcc\x47" + "\x15\xaf\xaf\x36\x06\xc9\xe3\x7f\x64\x7a\x54\xbc\xbe\x7a\x5a\x10" + "\x9e\xd3\x94\x1f\xd8\xae\xab\x2d\x41\x78\x4e\x0f\xb4\x0b\xf5\x58" + "\xc0\x54\x04\x8d\x63\x25\x66\xfd\x75\x6c\x10\x9e\x26\x05\xa6\x67" + "\xc8\x33\x0d\x42\xb6\x57\xb7\x28\xbe\x48\xc8\x35\xd1\x44\xb8\x31" + "\xfd\xa8\xda\x17\x20\x5d\x5d\x83\xf9\x64\x84\x60\x3e\xa9\xe8\x92" + "\xc7\xe2\xc6\xa4\xa0\xf6\x9d\x90\xf9\x14\xad\xc2\x93\x1e\xd4\xbe" + "\xff\x95\xf1\x44\xaa\x60\x82\xe4\x7f\xa0\x5b\xc6\xa3\x55\xc1\x04" + "\xeb\xff\x49\x19\x8f\xba\xae\x7d\x5f\xce\x27\x63\x80\xfe\x13\xaf" + "\x30\xad\xfb\x4b\xe6\xa0\x74\xe2\xdd\xc1\x68\xec\xff\xf6\xf0\x39" + "\x78\x16\x37\x2c\x86\xf6\x96\x42\x1f\x6d\xe6\x73\x83\xbd\xe4\xa7" + "\x47\xd3\x5e\x54\x4e\xd1\x06\x30\x09\xdf\x3d\x9a\xef\xa7\x82\x65" + "\x33\x1d\x10\x57\xa8\x7e\x0f\xe0\x80\xd1\x15\x72\x1e\xb6\xff\xd2" + "\x0e\x25\x8f\xd2\xc5\xfc\xe2\x68\xec\xff\x46\x16\x88\x7e\x6c\x74" + "\xbe\x0c\x8b\x7e\x3f\x31\x3d\xd4\x77\xcc\xe1\xde\xbf\xac\x35\x30" + "\x7f\xc9\x48\xfa\xae\xd9\x53\xed\xb7\x32\xb0\x17\x79\xc0\x78\x05" + "\x94\x1c\x83\x31\x3a\x1a\xe3\x57\x6d\x04\x5d\x49\x01\xf3\xd0\x3e" + "\xb4\x87\x9d\xdd\x50\xe2\x64\x5d\x74\x06\xc1\xe6\x33\xa0\xa3\xb3" + "\x04\x36\x3f\x0e\x86\x96\xe2\xcf\x42\x7e\x9b\xeb\xa7\x33\x03\x13" + "\xa9\x6c\x27\x1c\xae\xed\x84\x92\xda\xc0\xb2\x25\x57\x81\xa1\x8d" + "\xce\x33\xb0\x42\x3c\xd1\x41\xef\x53\xbc\xd1\x9e\xea\xe2\xe7\x40" + "\x5b\x82\xd1\x65\x5b\x9e\x4d\xa1\xa5\x9d\x68\xd9\x7a\x02\x74\x2f" + "\x2c\xb7\x49\x4f\x9d\x40\x7a\xab\xa0\xfa\x8d\x8d\x1e\xe9\x80\x61" + "\x16\x1c\x30\x1c\x85\x16\xc3\x64\x68\x29\x9a\x06\x55\x27\x20\xe6" + "\x80\x27\x0d\x5a\xb4\x33\xa0\x25\x69\x1a\xd8\xbb\xf1\xde\xe8\x43" + "\x18\x17\xdf\x07\xe9\x38\x8c\xb1\xed\x78\x14\x74\x0e\x81\x13\x79" + "\x36\xe6\x90\xb2\xa7\x0f\x3d\x87\x6a\xc7\xda\x91\x60\x40\xfa\xba" + "\x90\x96\x5b\x8f\xc1\x35\x91\x49\x06\x30\x51\xff\x6b\xaf\xf1\x82" + "\xb6\x18\xa2\xc2\xe8\x45\x02\xdf\x0f\x14\xe3\xa8\xba\x67\xb1\xaf" + "\xc7\xdf\x1e\xd4\x09\xb7\xf5\x9a\x34\xac\xfb\xa8\x3c\xef\xd5\x5d" + "\xb2\x0b\xf5\x6c\x7d\x36\xed\x0f\x82\xfd\xf4\x35\xd9\x4a\x1e\xed" + "\x73\x4a\xfb\x97\x4e\x4c\x00\xbd\xdd\x6b\x86\xf7\x7b\xbb\xe8\x1b" + "\xfc\x6e\xda\x17\x81\xf0\x61\x9f\x1f\x41\xf3\x4f\x48\xcf\x58\xec" + "\xe3\xbb\xaf\x41\x38\x2c\x8f\xf2\xff\x6f\x3e\xe7\xc2\x2e\x5f\xe8" + "\xf2\x5f\xbe\xf0\x8c\xff\x27\x0b\x7b\xd8\x4f\x16\x7e\xee\xfb\xc9" + "\xc2\xbf\x97\x6c\x00\x9d\xef\xf2\x85\xce\xc3\x05\x5c\x06\xfa\xc3" + "\x05\x27\xe9\x7b\x7a\xdd\xa6\x93\xa0\x5f\xf4\x38\xca\xde\xfb\x67" + "\xd8\xb4\x02\x0c\xfe\x28\x96\x6e\xf7\x7e\x0c\x8b\x8a\x81\xe1\x7d" + "\x76\xa8\xf6\xf5\xc4\x41\xbb\x32\x9f\xe6\xb6\x26\xe9\x1d\x92\xbb" + "\x8c\xea\x75\xc6\xea\xda\xf1\x3a\x82\x57\x07\x5e\x47\x59\x1c\x1c" + "\x45\x5e\x95\xc4\x6d\xd1\x00\xed\xe3\x33\xd1\x0f\x9a\x13\x90\x34" + "\x8e\xce\x3a\x0e\xc3\xb7\x44\x7f\xd5\xe5\x05\xd7\x97\xc2\x66\xb7" + "\xdb\x42\xfb\xa9\x3a\xc9\xbe\x28\x1e\xc5\x7a\x8a\xb0\x1e\x1e\xeb" + "\xa2\x8d\xb8\x58\xdc\xe5\x05\x14\xd3\xb9\x9e\xb4\x68\x9c\x4f\x5a" + "\xa4\x9e\xb8\xcb\xd7\x22\x4c\xad\x43\xf2\x80\xcc\xc3\x2e\xc2\x85" + "\x76\xe3\x8c\xf5\x42\x04\xe2\x2c\x78\xf7\x8b\x0e\xed\xce\x67\xd9" + "\x51\x84\x6b\xe9\xc7\x85\xb8\x77\xf0\x38\x29\xa9\x43\x49\xa3\x38" + "\xa9\x12\xe1\xa8\xbc\xdd\x63\xa6\x77\x86\x0e\x7b\x7e\x17\xed\x63" + "\x11\xcd\xfa\x44\x7d\x14\xc3\x91\xad\xc6\x7a\x60\x88\xdb\x0a\x99" + "\x84\x9b\xca\xd9\xbb\xbb\x00\xcb\xad\x65\x25\x16\x8c\x17\x61\x8e" + "\x9b\x59\x34\xb4\xa7\xed\x01\x2c\x2f\xea\xbe\xd6\xac\xd0\x48\x75" + "\xf0\x3d\x6d\x89\x4e\xd4\x87\x03\xf9\x1e\x88\xad\xa1\x79\x72\x98" + "\x4f\xf8\x08\x17\xea\x81\x03\xdb\xba\xf6\x40\xbe\x13\xfc\x2c\x00" + "\xa7\x43\xc6\x57\x1d\x80\x0f\xd3\x19\xe2\x23\xfd\x6b\xc1\x32\xb1" + "\x0d\x1c\xdf\xbc\x77\xfd\x84\xcf\x03\x5a\x23\xa7\x77\x01\xe1\xe0" + "\xfb\x43\x23\x4e\xdb\xba\xbb\x30\x76\xbc\xd6\xe3\x2c\xb1\x44\xf0" + "\xef\xe7\xb1\xfc\x1b\x9b\xbb\x22\x59\x4f\x76\x44\x1c\xff\x76\xfe" + "\x2e\xa0\x77\xad\x08\xf3\x47\xd6\x63\x89\x88\xed\xc6\x58\x0f\x61" + "\x68\x3f\x2d\xa2\x53\x2d\xcb\x79\xd3\x17\x4c\x86\x05\xd3\x66\x4e" + "\x9b\x0c\xb3\xef\x9c\x3a\x19\x4c\xb7\x8e\x37\xa5\x7c\xe7\xbb\xdf" + "\xe1\x37\xdf\xf9\x6e\xea\x77\x20\xf3\xfe\x79\x93\x21\x73\xce\x64" + "\x98\x8f\x57\xe6\xfc\xe9\xf3\xa6\x4d\x9f\x3f\x19\xb2\x67\xcc\xc4" + "\xa7\xa9\x93\x27\x99\xee\x1e\x9f\x39\x75\xe6\x74\x98\x9b\x75\x93" + "\xe9\xa6\x9b\xe0\xce\xe9\xb3\x26\x99\x4c\xf2\xef\x24\x13\x81\x3c" + "\x98\x3a\x7d\xfe\xf8\xcc\x35\xab\x0b\x57\x8f\x9f\x33\x73\x2a\xa5" + "\xc0\xf4\xe9\x93\x33\x03\xe2\xc8\x64\xdf\x17\x3e\xe2\xb7\x8b\x9d" + "\x4e\xa7\x7d\x8c\xa1\x0e\xf5\x00\xaf\x6e\xbe\x3f\x12\x5c\xff\xbb" + "\x3a\x92\x1f\xef\x0b\xae\x4b\xa0\xfe\xd4\x6d\xbd\x0e\xe5\xef\x31" + "\x13\x1f\x69\x2f\xe1\xe3\x30\x61\x1b\xe6\x8d\x94\xe3\x91\x48\xcc" + "\xf7\x04\xe6\x8f\xcd\xc1\xfc\xab\x69\xbf\x1d\x3b\x5e\xc8\x7b\x17" + "\xfa\x43\xe4\xb1\x13\x7a\x4a\xb2\x23\xf9\x7e\x87\x28\x77\xda\x87" + "\xc2\x6d\xbd\x3e\x45\x65\xf7\x9d\xb4\x5f\x05\xcd\x27\x9f\x82\xeb" + "\x63\x0f\x17\x9a\x69\x4f\x2a\xb0\x17\xca\x38\xce\xf4\xe3\x88\x96" + "\xf7\x4c\x74\xd4\xd1\x5e\x20\x02\x4f\xb1\xca\x47\x38\x08\x4f\x15" + "\xe6\xc9\xb8\xe6\x1e\x46\x5f\x81\xbe\xfc\x79\x7f\x49\x32\xb0\x68" + "\x4f\x8d\xbf\x2f\x19\xc4\xfc\xeb\xf5\xfb\x54\xba\xed\x6a\x29\x42" + "\xb8\x17\xd2\x35\xb4\x2f\x03\xdf\xa3\x01\xae\xb3\xa1\x8e\xbb\x7c" + "\x55\xba\x4f\xd9\x69\xbe\x2f\xe2\x10\x6c\xdf\x78\x6c\x5f\x92\xbf" + "\x4a\xe7\xe0\x7b\x8c\x72\xb8\xe4\x04\x46\xcf\x71\x08\xd7\xd7\x9f" + "\x76\x29\xa5\xb9\xe9\xfd\x0e\xda\x2c\x63\x3c\x3d\x02\xd3\x3f\x46" + "\xbf\xd6\x81\xb0\x0e\x82\x9d\xe8\x85\xa1\x7c\x3f\x94\x12\x0d\x1c" + "\x83\xe4\x1c\x7f\x9c\xee\x98\xaa\x3e\xc2\x93\x23\xfa\x31\x94\xc5" + "\x69\xc4\xd3\xc3\xd3\x25\x4c\xff\x05\xe2\xff\x1f\xf2\x97\xc2\x87" + "\x4f\xe0\xfb\x1e\xcb\x73\xf2\x03\xcf\xb4\xdf\xf3\x66\xf1\x7c\x00" + "\x79\x49\xef\x09\xe8\x1d\xbf\xdb\x9a\x8c\xf1\x4f\x52\xba\xe8\x2b" + "\x27\xf0\xfd\x6a\x69\x7f\x59\x16\xf3\x60\x03\xe2\xed\xb4\x6d\xec" + "\xe6\xe7\xe7\x38\x20\x39\xdf\x5f\x62\x81\x20\x9a\x92\x89\x7e\xf2" + "\x21\xc8\x8b\xf1\xa8\x07\x51\x6e\xeb\x58\x08\xd2\x83\x44\xc4\xf3" + "\x29\xd2\xd7\x81\x6d\xfa\x14\xf1\x24\xf9\x7b\x2c\x58\x2f\x8e\x17" + "\x99\x05\x63\xa5\x01\x1c\x72\x79\x73\x60\xf9\xeb\x3b\xa9\x1c\xc2" + "\x47\xba\x7b\x08\xfe\xfa\x2e\xe2\xb9\xac\x77\xa8\x97\x63\x0b\x82" + "\xf4\x72\x25\xd2\x72\x8b\x2a\xbf\x3a\x28\x7f\x2e\xe6\xdf\x2e\xe7" + "\xa3\xed\x8f\x6d\x0a\xa2\xf7\x10\xe6\x4f\x41\x7a\x5d\x68\xdb\x11" + "\x58\xdf\x9e\x3a\x39\x36\x91\xe1\x1d\x41\xf0\x5e\x84\x9f\x4a\x7a" + "\x43\xfd\x0e\xc1\xd7\xcb\xb6\x83\xf0\x3a\xb7\xf5\x06\x7d\x50\xfd" + "\x93\x10\x7e\xd6\x00\x7d\x37\x98\x02\xf3\x6f\xf0\x60\xfe\x5c\xd2" + "\x75\xfc\x7d\x88\x62\x7d\xf2\x27\xe4\xcb\x0e\xe4\x93\xbc\x6e\xc8" + "\x0d\x82\x2f\x45\xb8\x3c\x99\x47\x92\xcc\xa3\x3d\xf2\xd8\xfd\xa8" + "\x4c\xc3\x8e\xa0\x32\xfb\xb0\x4c\x3e\xf2\xf1\x53\x45\x2f\x43\x94" + "\x69\x0d\x2a\xd3\x45\x72\x64\xa2\x1e\xad\xbb\x6f\xa0\x8c\xec\x27" + "\xd5\x38\xa8\x6d\xc3\xdc\xd6\x1b\x63\x02\x71\x8c\xaf\xc6\x7a\x0b" + "\x2b\x85\xdf\x19\x86\x3a\x74\x13\xa6\x6d\x41\x9c\x9f\x91\x0d\x54" + "\x51\x3c\xe8\xf4\x00\x2b\x49\x8f\x11\xba\x7b\xe3\xca\x38\x2f\xd0" + "\xfd\x78\xba\x27\xdc\xcc\x3d\x4b\xb6\xc9\x1b\x57\xe2\x2f\xa5\xf3" + "\xfd\xe0\xc8\x0f\x33\xf7\xbd\x7e\x81\xf3\xc6\x1f\xd0\x39\x60\xf8" + "\xec\x93\xeb\xd8\x40\x7b\x88\x22\xfd\xc7\xb0\xdf\x01\xb6\x1e\xe1" + "\x36\xc2\x54\x4c\x7f\x08\xd3\x8e\xcb\x70\x03\xcf\xeb\xef\xf5\xca" + "\xf9\xe3\x45\x9d\xe9\xa4\xef\x29\xf8\x7c\xad\x8c\xef\x2a\xc2\x8f" + "\xf7\x93\xe4\x7b\x8d\x8f\x70\x9f\x56\x6c\x72\xbc\xd8\x53\x1e\xed" + "\x92\xd7\x87\xe5\x69\xff\x56\xb9\x0e\xa2\x7f\xe6\x71\x18\x77\x12" + "\x7f\xe7\xe2\xef\x6f\x69\x3f\xd5\x12\x1f\xb7\x4f\x7a\x7e\x07\x7f" + "\xe7\xe1\xef\x2e\xfc\x9d\x8f\xbf\x95\xf8\x7b\x17\xfe\xae\x20\x3b" + "\xa1\xbd\xe1\x69\x8f\x1b\xec\x6b\x85\xae\xd1\xbb\x40\x77\x3a\xe1" + "\x9c\x8e\x30\x9c\x17\x7e\xe1\x6f\x74\x42\xae\xe3\xf8\x3a\x6d\xd4" + "\x0f\x4a\x1b\x2a\xf4\x43\xa4\xf9\x14\xbf\x74\x7a\x20\x4d\xf6\x55" + "\xb2\x6d\xca\x69\x02\x7f\x26\xe2\x1f\x47\xb4\x32\x81\x2b\x52\xe8" + "\x80\x8c\x5f\x94\xd3\x86\xa8\x53\xa3\xae\x13\x7f\xf9\xfe\x48\x0e" + "\xb8\x91\xc7\x6b\x0e\x18\x9f\x48\x67\x24\xf9\x49\x26\x6b\x60\x16" + "\xca\xae\x95\x64\xa0\xe8\x14\x13\x3a\x3a\x84\xee\xfd\xeb\x1f\x43" + "\x1f\x85\xf9\xeb\x1f\xf3\xcb\x7a\xc8\x61\x78\x3e\xa7\x85\xef\xd5" + "\x81\x38\x6f\xac\x26\xf9\xf0\x7c\x91\x3e\x4e\xa5\x97\x23\xdc\xd6" + "\xf1\x7b\x82\xf4\xb2\x03\xf5\xf2\x19\xd2\x3f\x92\x19\xf1\x25\xae" + "\x80\xc7\x05\x52\x3f\xfe\xd3\x42\xbf\xeb\xe4\x75\x4e\xc2\x17\x8c" + "\xef\x0e\xb2\x6d\x1d\xe2\x29\x0f\xf2\x1d\xdd\x03\x7d\xe4\x84\xc4" + "\x20\xdf\xb6\x87\x55\x45\x65\x39\xd0\xb6\x64\x1f\xed\x8a\x28\x26" + "\xdb\x9b\x80\xe3\xdf\x93\x7c\x3f\x23\xa4\xe7\xaf\x84\xc7\x55\xc2" + "\xcf\x04\x70\x45\x14\x90\xcf\x98\x90\xa7\xe4\xf3\xbc\xd8\xcb\x9d" + "\x64\x53\x11\xf9\x3c\xaf\xd4\x01\xd7\xe8\x95\x3c\x10\x7b\xcd\xb9" + "\x22\x0a\x79\x5e\x6d\x3f\xde\x72\x4f\xb3\x8c\x37\x22\xe4\x19\x0f" + "\x65\x9e\x46\x54\x7e\xe9\x86\x52\x88\xb4\x7b\x8f\x40\x86\x97\xf9" + "\x6e\x2c\x85\x28\xbb\x77\x2f\x8c\x05\x18\x6e\xf7\xee\xa7\x05\xfe" + "\xa3\xed\xde\x1d\x18\xfb\x6c\xa5\xfc\xf7\xc7\x96\x6a\x34\xf8\x5b" + "\x72\x3d\x48\x1a\xbb\xb7\x16\xae\x03\x2d\xfe\x16\xc2\x8c\xa7\x99" + "\xdb\xee\xcd\x43\xb8\x7c\xc8\xf0\xb1\xd3\xd3\x22\xd9\x27\x8b\x7d" + "\xa0\x9f\xf5\x34\x2b\xb1\x7b\x71\x1c\xe2\x3d\x84\xe9\x7e\x96\xe1" + "\x3b\x8b\x97\x9b\xf9\xcb\x3c\xcd\x19\xbe\xd3\x6c\xea\xd3\xef\xe3" + "\xf3\x27\x6c\x6a\x64\x09\x43\x79\x32\xbb\x37\x0d\x0e\xbb\x5c\x08" + "\x9f\x02\x6c\x9b\xa7\x71\xd1\x19\x09\xfa\xe8\x1c\x86\x6d\x9e\x66" + "\x6c\x4f\x6b\x1f\xb6\x05\xfb\xf5\xdf\xf4\x3d\x89\xbf\xe5\x9e\x83" + "\xfc\x59\xe7\xe9\xc0\xb6\xb4\x8e\x2f\xc5\x31\x49\x11\xb6\xc3\xe7" + "\x64\x18\xef\x68\xed\x45\x47\x21\x6e\x0b\xc5\xf5\x69\x38\xae\xfb" + "\x8c\xf6\x70\x8e\x97\xf1\xb6\xd2\x78\x8e\x45\x61\xb9\x72\xcf\xc7" + "\x1c\x47\x99\xc7\x13\xaf\x61\x4e\xf4\xef\xf1\xc4\x0b\xbb\xf7\x28" + "\x5e\x9f\x01\xf1\x80\xf6\x14\xcf\xf0\x41\x3c\x96\xf3\xf4\x45\x79" + "\xba\xfa\xa2\xce\xea\xf0\x4a\x65\xd1\x67\xef\x61\xd6\x84\x5f\xd1" + "\x1e\x9c\xac\xec\x6c\x36\x3e\x5b\x5c\x7c\x3f\x6a\xa2\x01\x86\xb2" + "\x6d\x67\xb3\x51\xaf\xa6\xa1\x7e\x22\xad\x67\xcb\x78\x3d\xe5\x67" + "\xbf\xe7\x62\xd4\x86\xb3\xcf\x88\x36\x9c\x7d\x5a\xb4\xe9\x6c\xa3" + "\x6c\x6f\x94\xf6\x32\xde\x67\xb9\x09\xae\xec\x6c\x23\xd3\x9d\x6d" + "\xf6\xa0\x0d\x23\x5f\x4b\x89\x8f\xc8\xd7\x52\xe2\x25\xe2\x6f\xb4" + "\x17\x55\x60\x3b\xce\x36\x23\x3d\xad\x58\xee\x4f\x7d\x3c\xee\x39" + "\xdb\xe5\x12\x78\xfe\x8a\x78\x72\x38\x1e\xdd\xd9\x2e\xc4\xe5\xf1" + "\x59\x8d\x90\xb1\x81\x79\x32\xbc\x5b\xbc\x8b\x37\x40\xc4\x38\x28" + "\xd5\xd0\xb8\xc7\x5e\x94\x8f\xed\x6c\xc1\xdf\x69\x98\x0f\x97\x60" + "\x5d\xef\x23\xde\x2e\xaa\x0f\xeb\xf1\x20\xce\x33\x88\x2b\x8f\xe8" + "\xeb\xa5\xf3\xca\xa2\x7b\x75\xbd\x44\x7f\x59\x6f\x32\xd3\xf5\xa6" + "\xfb\x75\xbd\xa9\x8a\x0e\x91\xfe\x08\xbe\x91\xde\xbc\x88\xbd\x17" + "\xe8\x33\x8a\x98\x17\xf3\xf4\xf6\x22\x4a\xaf\x85\xc3\x05\x08\x53" + "\x44\xf9\x85\x78\x3f\x1b\xef\xb7\x02\xe9\xcf\x9c\x02\xd7\x96\x09" + "\xa5\x05\x1a\x84\x7f\x7f\xb1\x57\x07\x8b\x0a\xb4\xa5\x87\x0b\xba" + "\x31\xaf\x1b\x30\xad\xc4\x5e\x54\xcb\xc7\x69\x28\x57\xaf\x4f\xd7" + "\xdb\xea\x2b\xeb\x35\xc4\xb9\x4a\x98\xbd\xa8\x10\x61\x0b\x60\x6c" + "\xa9\x4e\xc3\xe1\x8b\xf2\x78\x7b\xfc\x55\xa5\x40\x65\xda\x2c\x7b" + "\x81\xc6\x7b\xd8\x76\x67\x5b\xf7\x56\xd2\x51\xbf\xbf\xac\xb7\x06" + "\xf5\xb3\xaf\xcd\xb2\x03\x66\x77\x97\x0e\x45\x7e\x68\x30\xdd\xd7" + "\xd6\xdd\x82\xb0\x87\x84\xce\x6e\xf0\xc6\xb7\x59\xb6\x82\x57\xd7" + "\xab\xf3\x96\xf5\x36\x66\x6c\xe8\x63\xb3\x2d\xec\xfd\x87\xba\x4b" + "\x51\x4f\xf7\xc2\xec\x93\xde\x88\xc3\x05\xa8\xf3\x1b\xdc\x98\xee" + "\xe5\xfa\x3f\xfb\x64\x0f\x9b\xf3\x38\x3b\x9d\xb1\xe1\x13\xd6\x66" + "\xc9\x83\x45\x2e\x88\x1b\xb6\x85\xf9\xc9\x2e\x0e\x75\xee\x85\x61" + "\x47\xbb\x80\x6c\x62\xd6\x12\x3f\x9b\x7d\xf2\x34\x5b\xf4\x38\x8e" + "\x71\x8b\xd2\x90\x46\xe4\x8b\x6b\x07\xf2\xbb\x37\xb9\xcd\xb2\x1f" + "\x69\x40\xbb\x29\x4a\xc1\xb4\x17\x11\xd6\x16\xff\xd0\x49\x3d\x1c" + "\xea\xdc\x01\xde\xa8\x5e\x9d\x6f\x5b\x2f\x8e\x53\x7b\x53\x59\x14" + "\xf2\x7e\x5b\x6f\x8d\x2f\xaa\xb7\xd5\xbb\xad\xb7\x91\x95\xf7\x19" + "\x50\x4e\x51\x24\xf3\x5e\x2b\x18\xf1\xf9\xb2\x5e\xae\x47\x7d\x28" + "\xa7\xbe\x74\x8c\xb3\x19\xf1\x92\x6d\xeb\x4b\x16\x36\xd0\x97\xde" + "\x17\xd5\x97\x8a\x70\xe9\x42\x0f\xfb\xb2\x49\x2f\xe9\x4c\x21\x4c" + "\xbb\xdf\x87\x65\x31\xdf\x82\x57\x11\x5e\x65\x98\xd6\x81\xf8\x87" + "\x13\x7e\x7f\x59\x5f\x17\xe2\xf4\x4c\x00\xd0\x1d\x76\x75\x02\xcd" + "\x73\xf0\x79\x81\xa2\x3f\x23\xcd\xa4\x53\x5e\xfc\xf5\xa2\x6d\xf4" + "\x75\xf8\xef\xa8\xe6\x36\x88\xf5\x79\x32\x7c\x53\xd8\xa2\x33\x64" + "\x4f\x98\xbe\x0d\x71\x44\x7b\x0d\x1e\xae\xaf\xde\xcb\x89\x86\xbe" + "\x27\x93\x09\x8f\x96\x6d\xf3\x26\x63\xda\xf3\x2e\x96\x0c\xfe\x32" + "\x6f\x8d\x5f\xe7\xf5\xb0\x32\x2f\xda\x83\xb7\xd9\x57\xe6\x6d\xbd" + "\x37\x92\x39\xc9\x7f\xf5\x3d\x03\x58\xcf\x3e\xf0\xde\xc1\xd8\xe1" + "\x82\xad\x78\xff\x1e\x70\x1b\x2e\x3a\xc2\xf5\xaa\xad\xfb\x08\xf2" + "\xf2\x35\x4c\x6f\xe1\x7e\x8c\x78\xcf\xa2\xbc\xcd\x8b\xce\x5c\x51" + "\x4a\xba\xb0\xa8\x00\x4a\xb1\xae\x46\xff\x36\x6f\x8d\x6f\x9b\xb7" + "\xd5\x1f\x85\xf5\x44\xb3\xdb\x3c\xdc\xae\x19\xea\xf5\x3e\x2c\xf3" + "\x1e\xd7\x27\xb6\x8d\xa5\x86\xf3\xa5\xe4\xd3\xc8\x87\x65\x78\x3d" + "\xa4\x5f\x7f\x25\xff\x47\xbe\x0c\x7d\xc1\x62\xc5\x97\x91\x1f\xa3" + "\xb1\x18\xf9\x32\xbf\xec\xcb\xfc\xb2\x2f\xf3\xab\x7c\x19\xf2\x5f" + "\x8b\xfa\xee\xe1\xfe\x0b\xf9\x49\xbe\x2b\xc3\x67\x62\xc1\xbe\x8b" + "\xca\xf8\xd0\x2f\xf9\xd1\x2f\xf9\xd1\x2f\xf9\x85\x5f\x4a\x97\xfd" + "\x92\xa4\xf8\x25\xc4\x47\x7e\xdb\x1f\xca\x2f\xf9\x65\xbf\xe4\x93" + "\xfd\x92\x5f\xf6\x4b\xfe\x73\xf9\x25\xdd\x59\x6c\xef\x59\xda\xbb" + "\x3e\x02\xed\xa6\x94\xe4\x9c\xb1\xc1\x5f\x8a\x3e\x03\xf9\x78\xb6" + "\xd9\x2f\xfc\x51\x07\x8e\xc3\x24\xf2\x47\x3e\x2c\xef\x57\xfc\x91" + "\x9b\xfb\x35\x0f\xf9\x24\x92\xdd\x62\xaf\x11\xc8\x17\x71\xbf\xe3" + "\x1d\xed\x25\xbf\x83\xfc\x9b\x12\xec\x77\x58\x79\x2f\xf6\x9b\xa0" + "\x17\xf5\xf7\xa6\xc6\xa3\x0f\x88\xf7\x96\xb0\x8c\x22\x17\xe7\xd1" + "\xe2\xa2\xc2\x52\xd2\x39\xf4\x09\xe9\xec\x70\x29\xa0\x4f\x32\xa0" + "\x8d\xa3\x9e\xfb\x00\x6d\xb7\x06\x6d\xb8\x15\xfd\x55\x23\xfa\x0d" + "\xdd\xec\xee\x1e\xfb\x9c\x02\x18\xba\xc8\x95\xac\x9f\x7d\x92\x39" + "\x91\x37\x8e\x45\x05\xa5\x30\xc7\x95\x8c\xfe\xe1\x3d\x98\xd5\xc9" + "\xfc\xb3\x72\x1d\x46\xb4\xc5\xc6\xd9\x2b\x6c\xf1\x74\xfe\xe7\x9c" + "\x33\xcc\x86\xfe\xe3\xbf\x67\x9f\xd4\xc7\xe7\x74\xc2\xa8\x59\x4b" + "\x98\x1f\xed\x0e\x79\x8e\xf5\xa0\xcd\xa2\x2d\xa6\xa2\x5d\xa6\xa3" + "\x1d\xd6\xa0\x8d\xb6\xaa\x6d\x11\xed\xea\x32\xbc\x37\xf2\x76\x94" + "\xf5\xa5\xa3\xdd\x24\xfb\x79\x7f\xd7\xc9\xc7\xbe\x68\x0b\xe9\xdc" + "\x7e\xa2\x30\x7d\x9b\xb0\x47\xbf\x28\x97\xed\x27\xde\x49\xc2\x1e" + "\x49\x26\x98\x6f\xc1\xab\x08\xaf\x00\x7b\x24\x3b\x63\x64\x67\x05" + "\x67\x06\xec\xec\x71\xd9\xce\xa2\x84\x9d\xf9\x30\xa6\xf1\x3d\x29" + "\x6c\x8d\xf0\xd3\xf8\xb8\xdf\xd6\xa2\xbd\x35\x74\x16\x81\xd0\x1b" + "\x6e\x6f\x64\x6b\xe8\x63\xbd\xcd\x68\x7f\x88\x8f\x39\xc9\x0e\x50" + "\x2f\xff\x42\xfd\xe1\x9c\x02\xf6\x97\xc5\xbe\x2b\x50\xe6\xde\x56" + "\xf4\x77\x9f\xcc\xee\x66\x7f\x41\x5f\xd7\x80\xb8\x6a\xd0\x86\x1a" + "\xd1\x96\x9a\xd1\xa6\xc8\x96\x52\x7d\x4f\x12\x4e\x96\xda\x8f\x83" + "\xf7\xa7\x81\xb6\x74\xae\x79\x5a\xb7\xf5\xbb\x85\x0e\xf0\x8a\x33" + "\xad\xac\xdf\xc5\xf8\xc7\x67\x90\xef\x2b\x1c\xf0\x97\x2c\x1e\xef" + "\xa0\x0d\x16\x6c\x86\x4b\x4f\x40\xaa\x19\xf5\x1d\xf0\x3e\x06\xef" + "\xa7\x65\x8c\x7d\x9f\xf9\x2b\xa6\x76\x60\xdd\x6e\xb2\x43\x66\x4d" + "\xa1\x78\xcf\x8c\x7a\xa8\x63\xee\xe4\x18\x16\x37\xec\x73\x3a\x2f" + "\x96\xce\x87\xc5\xe7\x38\xe4\x41\x12\xfe\x8e\xd8\xf9\x05\x24\xe0" + "\x65\xd8\x29\x9f\x4d\x8b\xf7\x26\xb6\xde\x10\x5d\xb5\x0e\xc6\xc5" + "\xbb\xc4\xb9\xb0\x74\x8e\x2d\xc6\xe9\x09\x74\xcf\xac\xc7\x8a\xea" + "\xbf\x90\xcf\x86\x8d\xc5\xfa\xe8\x6c\xd8\xb5\xc9\x50\xbf\x86\x9f" + "\xd3\x65\xa8\xb7\xb2\x26\x9f\x9b\xf8\xe0\x69\x54\x68\x21\xda\x90" + "\xce\xab\x90\xce\xac\xfb\x36\x98\xe1\x83\xa2\xd0\xfb\x3c\xba\xad" + "\xa9\xfd\xed\x0f\x93\xbf\x43\xe1\x49\x98\xfc\x7d\x0a\x9f\xc2\xad" + "\x25\xa5\xbe\xdc\xb7\x8e\x75\xd3\x9e\xe1\x34\x4f\x51\xe2\x65\xff" + "\x83\x7c\x2c\xdd\xec\x03\x5d\x46\x91\x87\xd9\xbb\x99\xcd\x5e\x74" + "\x12\xea\x69\x1f\xf3\x62\xec\x3f\x63\x87\x1d\x61\x95\xc3\xda\x7b" + "\xd6\x31\x2f\xcd\x33\xb9\xad\xb7\x1a\x1c\x90\xa3\x17\xb2\xe8\x4d" + "\xe6\xe3\xdb\x98\x61\xed\x88\x6b\x38\xe1\x6a\xc3\xf2\xbe\xca\x61" + "\xa8\xaf\xb7\x9a\x1d\x9a\x61\x7c\x4d\x3e\xda\x71\x72\xc1\x46\xb8" + "\xf2\x04\xdc\xca\xcf\x99\x64\x15\xc3\xba\xc8\x1f\x60\x9a\x1e\xd3" + "\xb6\x22\xfe\x6e\x84\x2f\x70\xc0\x17\xf2\xda\xb8\x5b\xb7\x2a\x70" + "\x78\x9f\x1d\xbc\x4e\x4e\xfe\x2a\xb3\x34\x60\xdf\x39\x0d\x04\xee" + "\xa2\x47\x3b\xd6\x99\x43\x67\x0f\xf8\xf3\xde\x46\x3a\xff\xab\x64" + "\x13\x24\xa2\x7c\x88\xbe\xb3\x38\xa6\x39\xce\xac\xb7\x56\xbf\xb0" + "\xd1\x83\xe3\x8e\xdb\xb4\x0e\x68\xd3\x85\xe3\xa7\xff\x0b\xd6\x89" + "\x38\xd2\xb7\xaf\x03\x20\xfe\x10\x3f\xd1\x6e\xfc\xc8\x87\x4f\xc9" + "\x1f\xd5\xaf\xa3\x71\xfe\x6d\xe9\x0a\xbf\xc2\xca\xa4\x62\x58\xa7" + "\x18\x0b\xdf\x86\x7a\xcb\xc0\x36\x8a\xde\x9b\xdc\xc6\xe7\x7b\xd0" + "\xde\x53\x7b\xd0\x8f\xd0\x1c\x36\x9d\xd5\xb5\xd6\xc0\x3c\x88\x13" + "\xe3\xff\xa9\xa9\xf2\xfc\x98\xcb\xee\x9d\x4e\xbe\x25\x64\x9f\xc5" + "\xf7\x48\xed\xc7\x7f\x7b\xeb\xe1\x44\x00\xee\x9b\x62\x0c\x29\x9b" + "\x85\xfc\x3d\x84\x97\xbe\x2d\xe9\xc4\xfc\xb5\x2e\xd6\xc5\x2a\x0c" + "\xc9\x34\xd6\xa0\xfd\x46\x31\xed\xb7\xa8\xd7\xcc\xb6\x86\x68\xba" + "\xfd\xb7\xb6\x51\xbd\x70\xbc\x08\x22\xea\xfb\xe7\xa5\x6e\xdf\x47" + "\xf3\x50\x62\xfe\xed\xf6\x14\x07\x4c\x3f\xa2\xd0\x45\x71\x08\xf2" + "\x56\x47\x71\x09\xc5\x23\xf4\x5e\x64\x6d\x31\xf3\x50\x5c\x82\xb0" + "\xb9\x4a\x1b\xa8\x7d\xa2\x5d\xb7\x17\xaa\xdb\x45\x6b\x05\xe2\x8b" + "\x05\x0f\xd6\x6e\x00\x1d\x3f\x3b\xc8\x47\xef\x55\xa6\xf3\xb6\x50" + "\x9b\x79\x5b\xb8\x8f\xa5\xf1\xc4\xcd\x38\xb6\xe3\xe9\xe9\x88\xcb" + "\xe6\x80\x69\x66\xa1\x4f\xb7\xa7\x84\xfb\x66\x06\xfb\x27\x0f\x8e" + "\x85\x47\x95\xf8\xd9\xb1\xe3\x90\x36\x5b\xcc\xe9\xa5\xcd\xf6\x53" + "\x2c\xee\x41\xdd\x8d\x19\x01\xd4\x17\xdb\x8b\xc9\xdf\x72\xd8\x4b" + "\x10\xb6\x13\x61\x26\xcb\xb0\x93\xf9\xf9\x88\xe2\x77\x28\xfd\x62" + "\x9f\x78\xc6\x01\x69\x59\x34\xcf\xcc\x62\x2e\x77\x2a\xcf\x0c\x9f" + "\xf1\x37\x86\x55\x8e\x08\x7d\xce\x1f\xc6\x3e\xd4\x97\xf9\xbe\x60" + "\xdd\x58\xcf\xe5\xa4\x47\x25\x1b\x60\x24\xea\xe4\xa7\x9b\x37\xc1" + "\xa5\xa4\x63\x2c\x76\x98\xcc\xf7\xb4\x06\x66\xc5\xb8\x17\x3d\x6a" + "\xc1\x3a\xb8\x12\x6d\xa8\xeb\x04\xa4\xbd\xb3\xb8\xd8\x88\xb4\x02" + "\x6c\x3f\x05\x14\x9f\x7c\x82\xf0\xdd\x34\xc6\xa9\x3f\x45\xba\x98" + "\x76\x44\xd1\x45\xbc\x77\x9c\xcb\x57\x20\x5f\x8b\xc4\x1c\xc8\xe4" + "\xd9\xf4\x0e\xe4\x18\x4c\x4e\xa5\xf6\x8a\x35\xd7\x93\xc7\xb2\x2f" + "\x58\x22\x13\x7d\x9a\xc5\x01\x93\xf3\xf0\xb7\x88\x5f\xe8\x4b\xe4" + "\x67\x0b\xc2\x19\xd8\x17\x3e\x82\x29\xc2\x34\x13\xb3\x6a\xc8\x4e" + "\x6a\xdd\xd6\xc9\x39\x0e\x58\x9c\x2c\x64\x33\x39\x99\x70\x85\xa1" + "\xc1\xc2\xf8\x7e\xbb\x9f\x63\x7b\x27\x7f\x60\xdc\x4c\x73\xaa\x93" + "\xf9\x3a\x6f\xc2\x55\x2f\x09\x9f\x8d\x31\x6a\x51\x9d\xd5\x6f\x41" + "\xff\x6c\xf1\x57\x25\xd8\xf8\xbd\x9c\xc7\xe4\x7e\x34\x24\xfe\x0a" + "\x43\x0a\x3f\xb3\x11\xee\x30\x72\x3c\xa8\xf7\xb6\x2b\x4e\xd0\x33" + "\xdf\x5b\xdb\x15\x73\xa9\xcd\x5e\x63\x16\xe7\x45\x22\x8c\x18\xeb" + "\xdf\x31\xba\x07\xeb\x70\x5b\xef\x30\x3a\xe0\x6e\xbd\x78\x1f\x74" + "\xa9\x2d\xec\xf7\x58\x68\x03\x64\x73\xc2\xa6\xa7\x9c\x69\x6b\xe0" + "\xf6\x97\x8d\x3a\x5f\x24\xfb\x5f\x9a\x2f\x8a\x39\x06\x53\x5c\x6d" + "\x06\xae\xdf\x12\x93\xee\x28\x0d\x38\x53\x0e\xf3\x06\x5f\x77\xec" + "\xc3\xab\x05\xaf\x76\xf9\xf9\x28\x5e\x4e\xbc\x47\xaf\x37\xa5\x93" + "\xf3\xee\xa7\x79\x1a\x07\xe6\xf5\x60\x5c\x4f\xcf\x0e\xb8\x63\x3f" + "\xfb\x69\x92\xa4\xdc\xd7\x3f\x47\x73\x09\x77\xa0\x8f\x9d\x2c\xbf" + "\x63\x25\x3c\xa0\x41\xda\x88\xef\xac\xa4\x86\x79\x5a\x36\xbb\x88" + "\x6e\x43\x4b\x8d\x0b\x8c\xd7\x51\xfb\xa7\x90\xdc\x19\xad\x99\xa1" + "\xdf\xb5\x35\xcc\x79\xa0\xd6\x0b\xf4\xee\xd0\x6d\x9d\x82\xf6\x5f" + "\x5f\x2b\xe6\x3b\x0c\xb9\x84\x4f\xd6\x09\xa6\xb4\x5f\xf0\xf9\x52" + "\x9b\x71\x9d\x86\x9e\xb7\xd4\xd1\x1c\x62\x55\x14\xda\x46\xb6\xbc" + "\x56\x62\x0a\x9d\x2d\x39\x85\xce\x9b\x3c\x05\x53\xde\x63\xc8\xeb" + "\x03\x16\x7e\x76\x95\x13\xfb\x9f\xee\x3a\xbe\xbe\x69\x0a\xfa\xbf" + "\xc9\x7c\xff\xf8\x4a\x4c\xe7\xbe\x06\x71\x56\x61\x1e\xf6\x47\xdd" + "\x6d\x16\x0f\xf8\xa8\xcd\x58\xf6\xbd\x2f\x3c\xda\xf8\x42\xd0\x6c" + "\x2e\x40\xbf\x83\x74\x30\x94\x95\xf0\x65\x53\x32\x37\x9d\x64\x1e" + "\xa5\xcd\x07\x1a\xc8\x3e\xa6\xb8\x1c\xf0\xea\xac\xb0\x36\xd1\xdf" + "\x8e\x3b\x87\x1f\x48\x12\x72\xf4\x23\xaf\x02\xe5\x78\xa7\x5e\xc8" + "\xd0\x3c\x2d\x50\x86\x77\x62\x8f\x64\xae\xc0\x6b\x0f\x5e\xfb\xc4" + "\xb3\xfa\x32\x17\xa9\xee\x51\xae\x66\xb4\x51\xf3\x56\xf4\x17\xdd" + "\x42\x36\x94\x8e\xfa\x4c\x7a\xf3\x77\xec\x7b\xfa\xb2\x81\xde\x2f" + "\x53\x3a\xe9\x38\xa5\xfb\x31\xbe\x71\x80\xb9\x06\xf3\xf5\x64\xbf" + "\x74\x0e\x98\x3a\xbf\xff\xbc\x07\x30\xff\x8d\x70\xc5\x6f\x29\x2b" + "\x23\xdd\xc5\x32\xb5\xf1\xde\xb2\x32\xac\xcf\xa5\xf0\x15\xd3\x8e" + "\x52\x3e\xe9\xa9\xdb\x7a\x67\x0c\xf2\x85\xf7\xe5\x2e\x1c\x27\x86" + "\x8e\x3d\xee\x34\xf5\xc7\x68\xba\xbe\x0e\x92\x65\x37\xdc\x95\x86" + "\x7e\x0c\xfb\xf1\x84\x66\xd1\xff\xdc\x35\x99\x9e\xd1\x7f\x7e\x8a" + "\xf7\xa9\x6d\xe8\xa7\x7a\xab\x74\xed\x7d\x12\x0c\xed\x95\xb0\xc1" + "\x55\x53\xbd\xde\x38\x38\x6a\xef\xda\x07\x87\xbd\x6f\x81\xf1\x51" + "\x8e\x63\x12\x9d\x47\x57\xb2\x81\xf9\xde\xe8\x6d\xd4\xda\xbd\xa7" + "\x6d\xfc\xec\x57\xb8\x8b\xf3\xe3\xfb\xc7\x30\x0a\x58\xc4\x71\x0b" + "\xfe\xc4\x4c\xed\xa8\x5a\xce\xbc\x55\xc7\x69\x8f\x7a\x43\x74\x65" + "\x2f\x8c\x7b\x7e\x23\x98\x6a\x7b\x21\xa9\xae\x17\x92\xd9\x5f\x93" + "\xa5\x5a\x8c\xe3\x16\x9d\xd1\xd3\x99\xe8\xd9\x71\x05\xa0\xab\xdb" + "\x88\xf1\x9c\x17\x34\xbe\x4a\x8c\xe7\xbc\x18\xcf\x9d\x4e\x26\x7f" + "\xd9\x1f\xcf\xf5\x51\xac\x5c\x11\x93\x23\xce\x2c\x8d\xc9\x89\xb5" + "\x80\x26\x26\x17\xf4\x48\x5f\xc9\x29\xb8\xf3\xf1\x98\x4e\x8c\x25" + "\xb1\xcd\x0e\xb9\xbd\xc8\xf3\xad\xf1\x16\x18\xca\xdb\x8a\x3e\x9c" + "\x55\x26\x34\x87\xed\x9b\x25\xd2\x29\x17\xd9\x12\xb5\x61\x1b\xbd" + "\xe3\xde\x77\x85\x47\xbb\xb6\x96\x79\x28\xbd\x70\x34\xf3\x60\x7a" + "\x01\xd5\xdd\x84\xe9\x6e\xeb\x5d\x35\x0e\xc9\x55\x1b\x4e\x47\x71" + "\xbc\x24\xfb\x9a\xa9\x23\x99\x54\x8a\x3a\xea\x35\x6c\xf2\x62\x3c" + "\x7e\x8a\xec\x78\xaa\x21\x23\x9f\x79\x8d\xab\x68\xbd\xc1\x54\x1d" + "\xad\x85\xa0\x77\xa0\xaf\x63\xac\xf3\x65\xeb\x1f\xa8\x0f\xa1\xf1" + "\x43\x7c\x3e\xe2\x2c\xf7\x1a\x58\x49\x72\x88\xfd\xc5\xc3\x7e\xff" + "\x1a\x23\xbe\x6d\x9d\x9a\xe5\x80\x55\x8d\x44\x3b\xff\x1e\x88\xfb" + "\xd3\x69\x29\x2e\xe4\x41\xa0\x0f\x98\xa6\xa3\xfd\xd2\x7b\x2a\xa2" + "\x72\x6c\xa3\xc8\xf7\x4f\xd3\x88\x78\x30\x2a\x5b\xf4\x05\x53\x3f" + "\x15\xef\x2b\xa6\xee\x71\xc0\x7c\xde\xc7\x17\x8c\x21\x9d\x98\x7a" + "\x94\xc5\x45\x2d\x24\xb8\x09\xa5\x50\xba\xda\x0b\xb9\xac\x32\x2a" + "\x9b\x71\x5b\x39\x05\xec\x27\x8f\xb9\xe9\x1b\x1f\xd7\xe5\x0b\xdd" + "\x18\x1b\xa4\x60\x5e\x0e\xd5\xe1\x44\x18\xe4\x7b\x94\x58\x2b\x31" + "\x15\x7d\xc2\x5c\xd9\x1f\x4e\x3d\x24\xe6\xa1\xa7\x1e\xea\xc1\xb2" + "\x18\x2b\x5e\xe2\xb6\x4e\xc3\xf8\xf7\xb1\x62\xf9\x9d\xba\xf3\x29" + "\xfe\x6d\xea\xb4\x71\x0e\xc8\xb7\x51\x5a\xe1\x68\x30\x14\x1a\x59" + "\x57\xd8\x58\x2f\xa0\x9d\xd3\xdf\xe4\xeb\xfe\x24\xb8\x1c\x71\x14" + "\x28\x78\xb1\xbf\x7d\xb5\x47\xba\xef\x3e\x4c\xdb\xaa\xe0\x45\x98" + "\x4b\xf1\x79\x47\x3f\x8c\x28\xb3\x47\x55\xe6\xbe\x1e\xe9\x86\x57" + "\x31\xad\x39\xa8\x4c\x6b\x50\x99\x0e\x55\x99\x52\xb9\x9e\xee\xa0" + "\x32\xde\xc0\x32\xd3\x63\x06\xd3\x36\xdd\x18\x58\x66\xba\x29\xa8" + "\x8c\x79\x30\x6d\xd3\xb3\x82\xca\xe4\x05\x95\x29\x54\xf1\x96\xd6" + "\x2f\x99\x30\xad\x2c\xa8\x4c\x4d\x50\x99\x46\xe5\x19\x63\xcf\x56" + "\x11\x1b\xa0\x3e\xa1\x4c\x51\xae\x39\x98\x8f\xed\xbf\xef\xe8\x39" + "\xe2\x6f\x1c\x1b\x46\x65\x95\xec\x14\xe7\xf7\x92\x5f\xa5\xf5\x0e" + "\xe4\xcf\xe9\x9d\x0c\xe9\x04\xc5\x9d\x54\xd7\x71\x98\x71\x86\x74" + "\xc8\x6d\x9d\x91\x38\x98\x1f\x33\x4c\x81\x74\xce\x30\x07\xd2\x39" + "\x23\x73\x30\x3f\x66\xe4\x05\x95\x29\x0c\x2a\xb3\x55\x55\xa6\x41" + "\xae\xa7\x26\xa8\x4c\x63\x50\x99\xe6\xc1\xfa\x39\xe3\x50\x50\x99" + "\xa3\x41\x65\xba\x07\x78\x78\x37\x19\xb1\x86\xec\xc1\x6d\xbd\x1b" + "\xc7\x3f\x59\xe3\xce\xc1\x3b\xbd\xa2\xcf\xca\xb7\xda\x42\xaf\xef" + "\xde\xb6\x43\x7c\xa7\xc7\xcf\x4a\xe8\x84\xbb\x95\xf3\x87\x9c\x2f" + "\xf4\x7a\x22\xe9\x1d\x2b\xf2\xb6\xeb\x40\x91\x07\xfb\xdc\xbb\x31" + "\x16\x99\xdd\xa0\xac\x65\xa1\xf5\x3f\xfc\xac\x1d\x3e\x1e\xb9\x3b" + "\x5d\xd8\xdf\xdd\xb5\xf2\x7b\x1f\x6a\x0f\x8e\x33\xee\xae\xfd\x6a" + "\x74\xa5\x4f\x26\xba\xe8\xcc\x09\xc4\xe1\xe8\x1f\x6b\xf4\xd3\x4a" + "\x75\xa6\xcf\x54\x68\xad\x17\x6b\x90\x68\x6d\xb2\x93\xce\x01\x71" + "\x5b\xd3\x13\x54\xe3\x13\xa2\xd5\xb5\x6f\xa3\x47\x1b\x44\xb3\x4b" + "\xd0\x9c\x9e\x2e\x7c\x54\x7a\xba\xe2\x4f\xc2\xea\x5f\x85\xc1\x70" + "\x18\x5b\x48\x6b\x2c\xda\x6a\x31\xde\xc4\x31\x16\xd1\x7d\x0c\xd2" + "\xab\x79\xfc\xbb\xaa\x17\xe8\xde\x5e\x7c\x1b\x5f\x83\x21\xb7\xa5" + "\x95\xce\x7b\xa6\xd8\xa7\xa5\xe0\x73\x5a\x07\xc8\xf8\xd9\x4f\x90" + "\x7e\xe6\x40\xb1\x93\x68\xb5\x29\xeb\x95\x90\x16\x11\xd7\x55\x18" + "\xf4\xb4\x3e\x84\xd6\x52\x1d\x70\xa5\x12\x4c\x27\xf2\xb6\x51\xe1" + "\x01\x9d\x1d\x8d\xb0\xb5\xe1\xc6\x4a\x6a\xbe\x0a\x1a\xee\x5d\x22" + "\xf4\x67\xe6\xb8\x40\x7b\x88\x44\x3d\x9d\x69\x0e\xd4\xb9\x99\x99" + "\x81\x3a\x37\x33\x37\xd0\x1e\x24\xb4\x87\x99\x85\x41\x65\xb6\x06" + "\x95\xd9\xa1\x2a\x53\x2d\xd7\xd3\x18\x54\xa6\x39\xa8\x8c\xda\xff" + "\x61\x9b\x67\x76\xf4\x8f\x3b\xb9\xbf\x9f\xd9\xa5\x7a\x96\x76\xf0" + "\x7e\x6a\xa6\x57\x49\x93\xbf\x83\xe6\x6b\xb3\x04\xbe\x7b\x0c\x41" + "\x3e\x0a\xe1\xef\x19\x17\x48\xc3\x3d\x69\x81\x34\xdc\x33\x4b\x79" + "\x96\xd7\x73\xfc\xfa\x38\xdc\xf3\x03\x59\xcf\x5c\xf1\x5b\x60\x6e" + "\xbc\x77\xde\x03\x14\x9b\x51\xff\xc4\xd7\xcc\x6d\xc2\x98\xf2\x0c" + "\xbd\x33\xf0\xc0\xf1\x42\x88\xa0\xf3\x68\x1c\x70\x6f\x0b\x8b\x8d" + "\xc9\xa6\x35\xf5\x18\x4f\x65\x20\x8e\x1c\xac\xbf\x06\xeb\x40\xde" + "\xdd\xd3\x14\x44\x83\x2d\x88\x86\x76\xd5\xb3\x1e\x9f\x1d\xaa\x76" + "\xeb\x69\x5f\x8a\x1f\xf1\xd8\xfa\x1e\x8f\x92\x4e\x73\x00\xd8\xc6" + "\xae\x12\x1e\x07\x98\x69\x9d\xe2\x88\x63\x70\xcf\x67\x34\x5f\x20" + "\x70\xde\x9b\xa4\xe6\xad\xe0\xc5\xbd\xa9\x81\x74\xdc\x9b\x1e\x48" + "\xc7\xbd\xd9\x03\xbe\xe6\x1e\x79\x2d\xcc\xbd\xf9\x0e\x58\x50\x43" + "\x69\xc8\x0b\x63\xbc\xd7\x78\x89\x6d\x0c\xc5\xa9\xf7\xfe\xc2\x85" + "\xed\x65\xcf\x48\x23\xe4\xe7\xf7\x18\xc6\x0c\x18\x8b\x65\xa3\x7f" + "\xa6\x6f\x75\xaf\xc6\xb4\x16\x21\xd7\x7b\xb1\xfd\xf3\x9b\x04\xde" + "\x7b\x5b\x78\x3f\x30\x86\xe2\xdf\x7b\xab\x59\xac\x21\x39\x9c\x3e" + "\xf7\xc4\x19\x8c\xca\x9a\x5e\xc4\xe1\x52\xec\xc1\x5f\x65\x30\xfa" + "\x2b\x2f\x29\x70\x5b\x67\xe9\x1c\x30\x13\xc4\x98\x66\xc4\x7e\xd4" + "\xfd\x1a\x94\x1f\x8e\x81\x67\xc9\x63\x19\x43\x0a\xad\x55\xa4\xfd" + "\x32\xd0\x67\xc6\x88\xb5\x20\xb3\xd2\x54\x76\xe5\x32\x6e\x9c\xc2" + "\x8e\xc1\x6c\xf2\xa9\x7a\xf2\x1b\xb4\xe6\xf1\x80\xd7\x09\x34\xcf" + "\x62\xf7\x9e\xe0\x31\x39\xe6\x83\x5c\xb6\x48\x55\xd6\x29\xcf\x83" + "\x74\x51\xde\x44\x2f\x68\x0f\xb8\x9c\x74\xb6\x6f\x82\x88\xe3\x67" + "\x6b\x0e\xa0\xbf\xc0\x32\x7b\x95\x32\x34\x67\xc2\xd7\x15\x14\x82" + "\x76\x42\x31\x68\x6d\x1b\x8f\x71\xdc\xca\xda\x21\x1a\x1f\xd9\x8b" + "\xbb\xc0\xee\xea\xa0\x39\x4d\xad\x58\x27\x36\x1b\x22\x3c\xa0\xeb" + "\xa9\x34\xe8\xd1\x17\x83\xaf\xd2\x60\x40\xda\xb0\x3f\x9b\x95\x44" + "\x3e\x50\xcd\xbb\xe9\xd3\x33\xe7\x65\xcc\x1e\x7f\xff\xbc\x99\x59" + "\xd3\x6f\x33\x66\xad\x58\xb9\x2c\x6f\xfc\xea\x27\x0a\x8d\xeb\xd7" + "\xac\x28\x5c\xb1\xea\x11\x7e\x1c\x99\x71\x49\xa1\xf8\x4d\xce\x5f" + "\xb2\xb6\x70\x32\xdd\x8e\x33\x16\xac\x59\xb6\x8e\xdf\x8e\x8d\x86" + "\x40\x24\x2b\x0a\x97\xad\x31\x5e\x9b\x37\xce\x38\x63\xc9\x8a\x7c" + "\xfa\x6a\x22\x14\xae\xdb\x8c\x6b\x96\xad\x59\xb6\x24\xcf\x38\xd9" + "\x68\x22\xcc\x6a\x74\x2a\x79\x9a\x14\xff\xb4\x16\xfb\x73\x8c\xa1" + "\xbb\xc8\x4f\x51\xbf\x7e\x1c\x32\x3e\xa3\x18\x8e\x9f\x1f\x86\x7a" + "\x88\x7d\x82\xc3\x6d\x9d\xdd\x39\xb8\x1f\x9f\xed\x09\xd4\xdf\x39" + "\xba\x40\xfd\x9d\x63\x18\xdc\x8f\xcf\x09\xb2\xff\x39\x41\xf6\x3f" + "\x67\xd6\xe0\x7e\x7c\x4e\x6e\x50\x99\x82\xa0\x32\xa5\xfd\x7e\x06" + "\x69\x7d\x8a\xfb\xa5\x39\x3b\x82\xca\xec\x09\x2a\xb3\x2f\xe8\xb9" + "\x45\xf5\x8c\xb1\xeb\x9c\x23\xea\xd8\x00\x9f\x3b\x15\x5b\x1f\xf0" + "\x6f\x73\x3c\x0a\x0c\xf5\x3d\xf4\x6d\x8d\x80\xcd\xd0\xab\x60\xbb" + "\x04\x6c\x46\xbf\xfd\x93\x4f\xa2\xb5\xa2\x22\x3e\xcf\xf8\xb1\xec" + "\xdb\x3a\xb7\x0f\xf4\xa1\x9d\x28\x8b\xab\x4f\x41\x06\xad\x03\x26" + "\x58\x27\xad\x1f\x66\x3f\x59\xe8\xae\x1f\x01\x3a\x2a\x4b\xe7\x67" + "\x31\xeb\x6c\xfe\x1d\x3d\xa6\xc5\xe0\x85\x7e\x2a\xa3\x4c\x59\xab" + "\xbf\x15\x61\x1c\xc0\x8f\xd5\xd1\x50\xb9\xad\x7c\x9d\x23\xd5\x97" + "\x49\xdf\xf9\xd0\xb7\xe7\xba\xed\x62\xcf\x8a\x4e\x3a\xd7\x8d\xea" + "\x46\x1c\x5a\x26\xcd\x9e\x2b\x9f\xcf\xa5\xc7\x2b\x01\x71\xf6\xaf" + "\xff\x77\x40\x06\xff\x4e\x88\x62\x3e\x8a\xf5\x44\xdc\x93\xe1\x55" + "\xe2\x0b\x1a\x2b\x84\xf2\x1d\xa1\xd7\x82\x43\xfc\x76\xab\xbf\xc3" + "\xb6\xb9\x93\x68\x1a\x47\x71\xa8\xdd\xe0\x85\xc3\xb5\x5e\x1c\xbf" + "\x82\x9e\x8f\xa7\x8a\x4e\x82\xbd\xc1\x0b\x34\x3f\xbc\xb8\x08\x4a" + "\xeb\x25\x7f\x07\xeb\x2f\x47\x63\xb4\x4c\xfe\x5d\xf8\x56\x4a\xc7" + "\xf2\x38\x96\x70\xd2\x9a\xf1\x30\xf3\x11\xf1\x04\x67\x1b\x43\xe3" + "\xbd\xcc\x5a\x39\xf6\x2d\xab\x47\x5c\x21\xd7\x33\x4b\x60\x77\x5b" + "\x33\xb1\xff\x2b\x32\x2b\x3e\xfb\x40\x0d\xf7\x7d\x12\xa6\x63\xdf" + "\x9f\x69\x0c\x17\xa7\xc8\xfe\xbd\x80\xd6\xb1\xb9\xad\x73\x13\xcf" + "\x05\x4b\x74\x1f\xc0\x76\xa3\x2d\xe6\xbe\xb0\xd9\x14\x29\xfb\x57" + "\x1d\x96\xcb\x52\xca\x9d\x4f\xfb\x28\x36\xa2\xfe\x18\x6d\xd5\x25" + "\xc6\x8a\xf3\x7e\xfb\x23\xbe\x46\x7a\x2e\xc6\x7f\x99\x8a\x1d\x0c" + "\xc3\x67\xf4\x7f\x73\xf9\x7c\x22\x5f\xfb\x83\xe3\xc9\xb5\x05\x18" + "\xb3\x19\x5c\xe8\x1b\xe7\xb6\x2a\x79\x7c\x9e\x88\xf2\x8a\x99\xe7" + "\x80\xa1\x93\xf2\x3a\xfb\xf3\xc4\x37\x0b\xec\x40\x91\x97\xd2\xbd" + "\x4a\xba\xe8\x5b\xe6\xc5\x04\x3d\x27\x2a\xcf\x78\x9f\x8c\xb4\x54" + "\xcb\xf8\x9d\xe8\x73\x35\x62\x8f\x87\x79\xdb\xea\xb8\xdd\xcc\x4b" + "\x57\xf2\xf9\x9c\xda\x2e\x7a\x37\xe6\x02\x7f\x5c\x54\x2e\x8f\xb9" + "\xb0\xcc\x1b\x9f\x7b\x22\x71\x8c\xa1\x61\x74\x96\x2b\xa6\x11\x1e" + "\xb2\x19\x3a\x57\x93\x62\x35\xc4\x95\x46\xdf\x55\x90\x8e\xac\xf7" + "\x42\x62\xc1\x1d\x34\xff\x3c\x8f\xeb\x2d\xa5\x11\x5e\xc2\x47\x7d" + "\x22\xe1\x26\x7c\x55\x14\xd3\xf2\xf5\x99\xf3\xb0\xfd\x99\x61\xcf" + "\x44\xc3\xfc\x2e\x15\x2f\x23\xf1\xd9\x13\xd8\xd6\xf9\xba\xa0\x67" + "\x83\xf2\x4c\x73\xbd\x42\xf7\xe6\xc7\xc8\x79\x29\xe7\xaa\x6b\x0c" + "\xff\x26\x67\x7e\x76\x60\x7d\xf3\x2d\x41\xf8\x8b\x82\x9e\xcb\x94" + "\xe7\x1d\xfc\x1d\xc3\xfc\x1a\xa5\x0e\x2e\x33\xd4\xb1\x3d\x9b\x9d" + "\x91\xe7\xda\x3b\x05\xcb\x1c\x52\xd5\x39\x04\x9f\x8f\x0e\xc8\x6f" + "\x7e\x97\x82\x0f\xef\x5d\x2a\x38\x8c\x4b\xb2\xb4\x0a\x9c\x78\xbf" + "\x91\x95\x30\x50\x2e\xcb\xf8\x25\x6d\x0d\xd2\xdd\xfb\x56\x0a\xdd" + "\xcd\xca\x0e\xa4\x25\xcb\xa2\xc2\x59\x38\x40\x4b\x56\xa9\x0a\x0e" + "\xed\x33\xab\x3a\x58\x57\xd7\x16\x91\x8e\x93\xbe\x66\xed\x0d\x91" + "\xe7\x91\xf3\x5a\x43\xeb\x78\x96\x43\x95\x2e\x8f\x8f\xee\x9b\x2e" + "\xc7\x09\xe4\x9f\x5d\x3d\x25\x59\xca\xb9\xae\x5c\x27\x69\xdf\xb2" + "\x89\xe2\x0c\x71\xd4\xeb\xfb\x8c\xc1\x78\xc5\xf7\x3e\x32\x8e\x7e" + "\x9c\x59\x4e\x11\xe3\xdd\x97\x39\xd0\xb6\xfb\x72\x1c\x30\x4f\x79" + "\x4f\xe4\x14\x73\x83\x59\xb3\xc2\x8d\x3b\x10\xbe\x22\x90\x67\xf7" + "\xd5\x0e\xf0\xec\xbe\x46\x15\xde\x7d\x2a\xb8\xdf\xe0\x73\x8b\x0a" + "\xae\xfd\xcb\x74\x53\xe8\xca\x7d\x9e\xc0\xba\x16\xe8\x06\x70\x2c" + "\x48\x18\xa8\x6b\x81\x51\x05\xd7\x81\xcf\xa6\xf0\xf2\x59\x30\x2b" + "\xbc\x7c\x16\x58\x42\xcb\x67\x41\xa9\xaa\xde\x8a\x2f\xb7\xab\x05" + "\x4d\x2a\x7a\xea\xf1\xd9\x16\x68\x47\x0b\xda\x83\x9e\xfb\xe5\xcf" + "\xd0\x77\xec\xd9\x68\x8e\xa4\xf4\xc2\xd1\xa0\x17\x76\x76\x3f\xa8" + "\xf3\xdf\xe8\x15\xf9\x44\x23\x7f\x07\x47\xef\x37\x05\x5c\x72\x30" + "\x1c\xc1\xa8\xf2\xd3\x15\xda\xb1\xbf\x0e\x79\x06\xa9\xd2\xff\xd9" + "\xfd\xd4\xff\xdd\xcf\xfb\x3f\x56\x19\xbd\x83\x59\xdf\xcf\x0e\xd7" + "\x97\x21\xde\x06\x07\xdc\x9f\x2d\xf8\x73\x3f\xea\xff\x6a\x1e\x9b" + "\xb0\x8a\xe8\x1d\xa8\x4f\xbd\xc7\x21\x7b\x3a\xfe\xf6\xe1\xef\xd8" + "\xc0\xfe\xf5\xfe\x16\x66\xd5\xcc\xaf\xb7\x06\xf7\xbb\xf7\x1f\xc5" + "\xb1\x47\x6f\xbc\xb7\x34\x3b\x44\x9e\x87\x59\x23\xe6\x0d\x4e\xcf" + "\xa6\xf7\x3b\xbd\x0e\xc8\x9e\x46\xf4\xaa\xd2\x93\x99\x35\x2e\x8b" + "\xe0\x1d\x54\x1f\x96\x09\x27\x37\xe5\xbb\x2b\xa1\x7b\xd9\x85\x41" + "\xed\x38\x8b\xb8\xfe\x2e\xda\xf1\xc0\xec\xa0\xba\x2b\x42\xb7\x23" + "\x7b\x0f\xb6\xe3\x6c\xe8\x76\x64\xdb\x38\x6f\x25\x6c\xcb\xa0\xb8" + "\x23\x9b\xbe\x61\x3a\xcb\xf9\x1e\x98\xee\x52\xc6\xa9\x25\x67\x71" + "\xfc\x2f\x01\x2f\x3b\xbf\x78\x40\x6e\x02\xee\x81\xc4\xf8\x1a\xc8" + "\x1c\x5c\xe7\x03\x29\xcc\x3a\x74\xbe\x03\x1e\xc8\x57\xfa\x2b\x39" + "\x7d\x96\xa0\x05\xf9\x24\x11\x9f\xb0\x3d\x58\x2e\x9c\xbc\x15\xfb" + "\x14\xef\x99\x1e\x40\xfb\xcf\xce\x54\xfa\x74\xec\xcf\x9d\x0a\x1f" + "\x31\xaf\x39\x28\xcf\xa3\xca\x3b\x12\x90\xb7\xa9\x3f\xbd\x5b\x49" + "\x3f\x3f\x39\x3d\x98\x18\x24\x27\x94\xcf\x83\xaf\x05\xb6\xfb\xc1" + "\x71\xa2\x7d\x28\xa3\x41\xbc\x7e\x30\x1d\x65\xd4\x17\x5a\x46\x0f" + "\xe6\x85\xd6\xb5\x07\x8b\x39\xbe\x11\x10\x0a\x1f\xad\xe9\xe9\xe3" + "\x3a\x28\xcb\x69\xb0\x7c\x1e\xdc\xaf\xc8\xe7\xfc\xda\xb8\x10\x82" + "\xda\xe8\x3b\x0e\x0b\x37\x89\xb6\x2e\x6c\x0b\xc4\xbd\xd0\x10\x5a" + "\x17\x17\x9a\xb0\x9d\xbe\xd0\xed\x5c\x38\x2b\xbc\x2e\x2e\xb4\x60" + "\x7b\x7c\x83\x75\x71\xa1\x78\xa7\x2b\xeb\x60\x50\x5e\x2d\xb3\x86" + "\xac\x67\x1f\xc5\x45\x0e\x58\xd8\x4d\xef\xe9\x54\xe9\x87\x02\xf5" + "\x0f\xdb\x40\xe5\x88\x7f\x5e\x31\x8e\x21\x39\x1c\x37\x82\xf4\x65" + "\x3a\xe9\xb6\xe6\x8c\x0b\xe2\xd5\xe9\xe3\x90\xf3\x5a\x8f\x24\xcd" + "\x10\xfc\x7a\xe8\xf1\x40\x9a\x72\xd2\x43\xf3\x2b\x27\x17\xf9\x75" + "\x3a\x34\xbf\x72\x8a\xc3\xf3\x2b\x87\xe4\x7f\x7a\x30\xbf\x72\x9a" + "\xd4\xfc\xf2\x5b\x45\xfb\xae\x31\xa0\x6e\xf4\x2d\x66\xf5\xc2\x97" + "\xeb\xe3\x51\x57\x44\x99\x6e\x2a\xd3\x19\xef\x11\x7a\x62\xbc\x02" + "\x74\xa7\x20\xe7\x90\x62\xff\x71\x35\x30\x94\xf5\x2d\xa4\x35\xdc" + "\x74\xb6\xb4\xde\x5e\x74\xda\x66\xf7\x9a\x80\xe6\x1b\x03\xeb\x7d" + "\x28\x39\xb4\x2f\x78\xc8\x8c\x3c\xfd\x61\x88\x74\xf9\x9b\x82\x87" + "\xaa\x03\x7d\xc4\x43\x05\x81\x32\xca\xa1\xb5\x1e\xf1\xd0\xbf\xdf" + "\xea\xb9\xaf\x73\xcb\xec\x21\xc7\x60\x99\x2d\xda\x22\xe4\xb5\x68" + "\x49\x10\x7d\x9e\xd0\xf2\x5a\xa4\x0f\x2f\xaf\x45\xe3\xc2\xcb\x6b" + "\x51\x3a\xc9\xcb\x01\x8b\x4a\x03\xfb\x8d\x45\xb9\x81\xed\xc5\x7a" + "\xb1\x1c\x93\x86\x5c\x42\xcf\xe7\xdb\x6e\xe5\x22\x1f\x47\xb2\xa2" + "\xfd\x06\x90\xfe\xd1\x44\xe3\x85\xe2\x08\x8b\x1b\x79\x58\xbd\x31" + "\xec\x79\xe5\x31\x87\x71\x5c\x49\xeb\xf3\x8c\xa3\x68\xae\x6c\xf1" + "\x7d\x7e\x49\x73\x1b\xde\x4b\xc7\x61\xc9\x68\xbf\x14\x51\x4a\x6b" + "\xc9\xf8\xb7\x8a\xfc\xfd\xc4\xe2\x7c\xb5\x2c\x68\x4d\x59\x95\xd8" + "\x3b\x92\xe6\x39\x3f\xc1\xf2\x67\x84\x5c\x96\x68\x02\xf9\xb8\xb8" + "\x3a\xb4\x5c\x16\x37\xa2\x5c\x3e\x09\x2d\x97\xc5\x2d\xe1\xe5\xb2" + "\xd8\x81\x72\xf9\x64\xb0\x1d\x2d\xf6\xc8\x76\xf4\x14\x95\x31\xae" + "\xa2\x78\x35\x77\x05\xc1\xe0\x3d\xda\x48\x2e\x3f\xb3\x7e\x7c\xb7" + "\x62\x47\x54\x26\x97\xc6\xff\xbc\x7e\x19\x26\x59\xc6\xa1\xc2\x9b" + "\x9b\x19\xdf\x1d\xca\x4e\x72\xe9\xec\x5a\xcd\x84\x02\xd0\x21\x0f" + "\xb3\x77\x12\x8e\x35\x00\x88\xe3\x3d\x82\xa3\x74\x3a\xeb\x59\x05" + "\x5f\xa3\xc0\xf1\x79\x51\x01\x5b\xcd\xdc\x16\x20\xb8\x20\xdc\x72" + "\xfb\x87\xf2\x7e\x84\xe0\x09\x2e\x08\xa6\x4b\xd8\xe3\x92\x71\x81" + "\xf6\xb8\x04\x02\xf5\x73\x31\xbd\x9f\x88\xf7\xa3\x9f\xc3\xfb\x2c" + "\x9f\x55\x73\xdb\xc5\xb1\xcd\x25\xc5\x41\xb6\x89\x3a\xf0\xf0\x55" + "\xb2\x0e\xf8\x02\x69\x5d\xb2\x23\xb4\x0e\x2c\xd9\x1b\x5e\x07\x96" + "\xb4\x86\xd7\x81\x25\xb4\xef\xcc\x27\x0e\x78\x38\x31\xd0\x36\x97" + "\x78\x03\xdb\xbe\x64\x87\xb0\x4d\x18\x7e\x21\xb6\x89\xb1\xd0\x25" + "\xe1\xec\x50\x8e\xff\x35\xf5\xbd\x00\x17\xc0\x33\x1d\xda\x15\xd2" + "\xf7\x70\x13\xbd\x43\x42\x1f\x6f\x21\x1e\xd6\xf1\x31\xda\xc3\x2d" + "\x6a\x3e\x56\x89\xb1\x56\xc9\x71\x58\x3a\x93\xd6\xec\x09\x7e\xe6" + "\x0d\x0f\x6c\xff\xc3\x9d\xa1\xf9\xf9\x30\xcd\xcd\x97\x84\xe6\xe7" + "\x52\x43\x78\x7e\x2e\x4d\xa1\x6f\xe3\x07\xdb\xd4\xd2\x59\xc6\x75" + "\x3c\x46\xe1\x65\x4e\xc1\xd2\x17\xcf\xaf\x7f\x5a\xba\x35\xb0\x7f" + "\x5a\x9a\x7f\xe1\xfd\xd3\xd2\xd6\xd0\xfd\xd3\x52\x47\xe8\xfe\x69" + "\xa9\x47\xd8\x43\x9e\x29\xd0\x1e\xf2\xf4\x81\x3a\x81\xbc\xbb\x68" + "\xfd\x53\x5e\x69\x90\x0d\x6c\x3f\x0e\xcb\x34\x18\x53\x3c\x2d\xe4" + "\xb6\xec\x83\x40\x1a\xf3\x6a\x43\xcb\x2d\x6f\x1f\xca\x6d\x7b\x68" + "\xb9\xe5\xb5\x87\x97\x5b\x1e\xbd\x13\xdd\x3e\x58\x6e\xcb\xb4\x17" + "\x1e\x53\x2c\x4b\x0d\x94\xd9\x32\xe3\x85\xcb\x6c\x59\x71\x68\x99" + "\x2d\xdb\x11\x5a\x66\xcb\xf6\x0a\x99\x2d\xeb\x0c\x94\xd9\xb2\x96" + "\x40\x99\x21\xdf\x2e\x9a\xcc\x96\xa7\x04\xc9\x6c\xf5\x71\x58\xfe" + "\x0e\xca\xac\x5d\xc8\xec\x91\x0d\x81\x34\x2e\xcf\x0c\x2d\xb3\xe5" + "\x16\x94\xd9\xea\xd0\x32\x5b\xbe\x35\xbc\xcc\x96\x37\xa0\xcc\x56" + "\x0f\x96\xd9\xf2\xe6\x0b\x97\xd9\xf2\xee\x40\x99\x2d\x3f\x72\xe1" + "\x32\x7b\xc4\x14\x5a\x66\x8f\xa4\x87\x96\xd9\x23\xb9\x42\x66\x8f" + "\xd4\x04\xca\xec\x91\xa2\x40\x99\x21\xdf\xbe\xa6\xcc\x50\x3e\x35" + "\x62\xbd\xee\x23\x67\x7b\xf8\x9c\xf6\x23\x38\x46\xb0\x34\x8b\x77" + "\x02\x16\xae\x3b\xb2\x0c\xdf\x40\x98\xce\xc1\x7d\xb7\x25\x46\x4e" + "\xbb\x7f\xb0\x1c\x2c\xc9\xd8\xaf\x76\xb7\x14\xf3\x75\x5d\x42\x86" + "\xc4\x73\x84\x13\x73\x64\x16\xbe\x36\x00\x65\xcc\x68\x1f\x63\xea" + "\x8b\x11\xde\x45\x78\x68\x1f\x97\x20\x5c\x85\x17\x12\x97\x85\x5f" + "\x63\x1e\x5d\x43\x67\x0d\x1c\x87\x15\xdb\x84\xae\x5a\x82\xe3\xdf" + "\x7a\xcc\x7b\x48\xe8\xe9\x63\x41\x73\x26\x96\x30\xf1\xef\x0a\x8a" + "\x7f\xeb\x43\xeb\xe9\x8a\x73\xc4\xbf\x2b\x28\xfe\xad\x57\x8d\x57" + "\x47\x2c\xf2\x3a\x82\xc6\xab\x2b\xf2\xe3\x5d\x42\x77\x78\x1c\x5b" + "\x19\x5d\xe3\xb6\xae\xd8\x11\x44\x33\xca\xe6\xd1\xe1\x32\xcd\x51" + "\x41\xe5\xf7\x86\xa1\xb9\x05\x69\x7e\x23\x0c\xcd\x8e\x73\xd0\x4c" + "\xf3\xdd\x6f\x0c\xb6\xad\x47\x13\x64\x3d\x08\x31\x2e\x7f\xd4\x14" + "\x5a\xfe\x8f\x06\xc9\x1f\xb2\x0b\x8b\x99\x93\x97\x0f\x84\x2b\x50" + "\xc3\xd1\x5a\x7d\x82\x25\x1d\x09\x01\x5b\x1b\x8c\x33\x0c\x5c\xcb" + "\x20\xdd\xa3\x6f\x0b\x42\xea\xde\xa3\x4e\x61\x8f\x8f\xa5\x07\xda" + "\xe3\x63\xba\x40\x7b\x44\x5e\x07\x94\x7b\x2c\x39\x30\xdf\xe2\xb9" + "\x78\x3e\xf6\xb1\x9a\x20\x1d\x78\xff\x38\xe4\x5f\x2a\x74\x20\x7f" + "\x65\x10\x1d\x4d\xa1\x75\xe0\xb1\x56\x6c\xff\xfb\xa1\x75\xe0\xb1" + "\xce\xf0\x3a\x90\x4f\xf6\xfc\xbe\x5a\x6f\xe7\x17\x9b\x87\x06\xc1" + "\x24\x85\xf6\x79\xf9\x69\xa1\xe7\x75\xf2\xb3\x04\x8f\xf3\x2b\x02" + "\x79\x9c\x9f\x1f\xc8\x43\x6c\xcb\xd7\xe7\x61\xff\xd9\x1c\x6e\x6b" + "\x7e\xb0\xfd\xdb\x8f\xc3\x4a\xd9\xfe\x57\xdd\x17\x44\xa3\x3c\xfe" + "\x09\x35\x97\xb5\x32\x01\x79\x69\x0f\xcd\xcb\x95\xa6\xd0\x6d\x5e" + "\x49\xdf\xa8\xda\xfd\x83\x6c\x69\x65\x2e\xa6\xcf\xa7\x77\x07\x34" + "\x87\x55\x87\xe9\xf3\xbd\xa0\xe3\xfd\x55\x7f\xbf\xb4\x72\x2b\xcd" + "\x91\xf3\x39\x66\xd4\xdf\xf8\x44\xc8\xa4\x3e\x88\xe8\x5a\x5c\x1c" + "\xfc\x4e\x74\x25\x9f\xff\xa0\x75\x2c\xf4\x5d\x4d\x7c\x11\x64\xda" + "\x5d\x5e\x50\xf4\x9d\xe0\x83\x70\x3b\xc8\x2e\x08\x5e\x81\x15\x73" + "\x9d\xa5\x41\xbe\x69\x95\x2e\xb4\x8c\x57\x19\xc3\xeb\xce\xaa\x34" + "\x21\xe7\x55\x05\x81\x72\x5e\x95\xe5\xb7\xc6\x65\x51\x5b\x51\x07" + "\x2e\xc8\x4e\xe8\xdd\x69\x58\x7f\xff\xd4\xc2\x8e\x82\xcd\x30\xea" + "\x04\xac\xe2\x63\x8d\xed\x12\xf3\xc4\x6f\xd1\x40\x0b\xf7\x01\xab" + "\xc5\x7e\x18\x08\xb3\xd8\x0b\x12\x7b\xea\xb1\x0e\xca\xab\xb7\x32" + "\x0f\x9d\x53\xa3\x9c\x39\x83\xba\x70\xc9\x31\x58\xf5\xf7\x80\xf2" + "\x18\xfd\xd9\x05\x8e\x71\x62\x7e\x7f\x75\xb2\x32\x0f\x1f\x6e\x7e" + "\x1f\x61\x66\x29\xeb\x7e\xc5\xbb\xb0\xd5\xe6\xb0\xfd\x32\xd2\x44" + "\xdf\x97\x13\x4d\xe7\xf6\x03\xab\x1b\x14\xfd\x15\xef\xe6\x56\x37" + "\x0d\x7c\xdb\xb2\x7a\x3f\xe6\xe5\x9d\x63\x3e\x57\x65\x07\xab\xbb" + "\xd4\x78\xc4\xf9\x34\xab\xbd\xca\xf7\x29\x6e\x6b\x81\xee\x4b\x70" + "\xc9\xf4\x14\x98\x02\xe9\x29\x30\x63\x6c\x99\x27\xe3\x98\xf5\x25" + "\x38\x12\xec\x7b\x6e\x83\x09\x7e\x88\x38\x01\x6b\x9e\xa3\xf3\x6e" + "\xec\xb5\x5d\x10\xe3\x05\xad\x18\xdb\x15\xec\xa2\x6f\x43\x18\xdf" + "\x77\x60\x8a\x8d\xde\xc1\xf1\x35\x04\x86\x29\xb6\xb6\x22\x9f\xbc" + "\xe7\x5b\xc1\x9b\xc4\xd3\x36\xcb\x69\x5b\xed\xb3\xac\x6b\x27\xdf" + "\xeb\xab\x20\x60\xfc\x57\x41\xeb\x7f\x68\x1d\xc6\x66\x98\x72\x1c" + "\x1e\x9f\x29\x6c\x7d\x4d\x50\x4c\x5a\x10\x66\xfc\x57\x40\xe3\xbf" + "\x29\xa1\xed\xfc\xf1\x73\x8c\xff\x1e\xa7\xf1\xdf\x14\x75\xbf\x29" + "\xde\xf3\x3c\x3e\x4b\x1d\x93\xd2\x7e\x5c\xc6\xe5\x14\x67\x3e\xfe" + "\xab\x1b\x77\x80\xde\x4b\xef\xb4\xd1\x36\xed\x5d\x2d\x64\xaf\xfa" + "\x36\x67\x33\xa0\xae\xea\xe2\x0a\x48\x17\xa9\x2f\x23\x7b\x7d\x9c" + "\xcf\x17\xc6\x7b\x85\x2d\x96\x14\x31\xe7\xb8\x4e\xd4\xa1\xd5\x16" + "\x05\x57\xf1\x26\x8b\xf8\xee\x23\xae\x13\x86\xda\xbb\x78\xbf\xa8" + "\xa1\x78\x95\xc7\xad\xde\x33\x40\x78\x0f\x14\xb7\x01\xe1\xf5\xf7" + "\xf7\x93\x1c\x77\x37\xd9\x38\xe1\x24\xdc\x87\x11\x8e\xf0\x12\x9c" + "\xd2\x0e\xf1\x6d\xcc\x9a\x04\x75\xdb\xf9\xfc\x0b\xd6\x8d\xe9\x73" + "\x69\x5e\xc5\x4e\xe5\x4a\x16\xb2\x09\x9d\xf4\xce\xec\xb4\x8d\x95" + "\x3c\xc6\x26\xac\xa1\x39\xb1\x35\xbb\xa8\xdc\x1b\x7f\x71\x44\x16" + "\x8e\x06\x9d\x9c\x96\xd3\x62\xf4\x80\x03\xd6\x34\x04\xfa\x88\x35" + "\x41\xf1\x6f\x01\x1f\x67\xe2\x6f\x21\xad\x4f\x94\xd7\xaf\x92\x3f" + "\x60\x76\xaf\x9b\xeb\xc7\xb9\xd6\x54\xd0\x3b\x69\x5a\x13\x25\xf6" + "\x9b\x5b\xd3\x15\x34\xf7\xe6\xac\xe2\xeb\x6a\xfe\x84\xf5\xae\x7d" + "\x42\xe8\x48\xe1\x13\x81\x32\x5d\xab\x2b\x39\x49\xef\x82\x44\x7f" + "\xb0\xc8\x1b\xec\x1f\xd7\x26\x2b\xb1\x5b\x50\xba\x59\xe9\x0f\x8c" + "\xab\x38\xde\xa0\x7e\x66\x2d\x8f\xff\x7d\x83\xfa\x85\xb5\xf4\x0d" + "\x51\x80\x4e\x1e\xe6\x3a\xb4\xb6\xba\xcd\x85\x7a\xb3\x86\xf4\xbf" + "\x30\x0a\x61\xb6\xd0\x37\x87\xf8\x3c\xf4\x14\xac\xb5\xf9\xac\xa0" + "\x6b\x73\xf2\x6f\xaa\xf4\xa8\x23\x5c\x6f\xa9\xdf\x98\x28\xd6\x23" + "\xb9\x82\xea\x38\xaa\xf0\x9c\x60\x0e\xaf\xf9\x13\x88\xf5\x14\xa4" + "\x0b\x6b\x9b\x68\x6d\xc6\xff\x27\xee\x6d\xc0\xa3\xaa\xae\xfd\xe1" + "\x3d\x93\x01\x06\x32\xc9\x84\x18\xc2\x80\x20\x83\x05\x1b\x2d\x68" + "\xaa\xf4\xfd\x53\x5f\x3e\x62\xc1\xfb\xc7\xfb\x80\xd0\x16\x7d\x52" + "\x4a\x0d\x91\xc4\x86\x8a\x90\x26\x43\x18\x30\x5f\x0c\x90\x86\x9a" + "\x2f\x35\x62\x84\x10\xa2\xc5\x5e\xac\xa8\x69\x8b\x6d\x6c\x51\x47" + "\x89\x35\xd6\x24\x13\x2d\x6d\x53\x1b\xda\x21\x0d\x21\xa4\x01\x06" + "\x32\x24\x43\x32\x73\xf6\xbb\x7e\x7b\x9f\x33\x33\x89\x09\xca\xbd" + "\xf7\x79\x5e\x9e\x27\xcc\x39\xfb\xec\xcf\xb5\xd7\x5e\x7b\xad\xb5" + "\xd7\x5e\x2b\xba\x57\xf8\xf6\x8a\xd1\x70\xc8\xe5\x6f\x63\x2d\xfe" + "\x91\x32\x8f\x6d\xce\xe8\x63\xb7\x61\xff\x7f\xc6\xcd\x6c\x95\xc3" + "\xe7\xd6\x26\xf6\x7f\xed\x5c\xc7\x4d\x30\x18\x51\xce\x36\x7c\xee" + "\xb3\x05\xac\xc7\xb4\xf1\x29\x99\x54\x4d\xf2\x4c\x8a\x57\xd8\x7b" + "\xd9\x68\xfd\x67\x35\x5c\x8f\x0e\x72\xd3\xa4\x6a\x85\xf2\xaa\x76" + "\xc1\x44\xb7\x6c\xbe\x61\x3a\xa3\x78\xa1\x33\x4a\xe9\x62\xdb\xd4" + "\xb3\x9f\x9c\xc5\xc3\xfb\xb7\x2d\x6e\x6c\xde\x60\x1b\xce\x7f\x52" + "\x46\xa7\x19\xdb\x56\x8e\xce\x1b\x6c\x4b\x53\xe9\x42\x0a\x8f\x1a" + "\x89\x07\xdb\x0a\x69\x8e\x45\x19\x4d\x86\x85\x2e\x74\x6c\x19\x76" + "\x5b\x5d\x50\x86\xcd\x02\x3d\xd8\x56\x15\x94\x61\x3d\xa3\xc9\xb0" + "\xee\x51\xe6\x73\x9b\x77\xf4\xf9\xcc\x31\x8d\x2e\xc3\xe6\xcc\x91" + "\xfb\x7c\x4e\xf2\xf0\x79\xce\x59\x14\x3a\x13\xde\x16\xf7\xbf\xc7" + "\x0f\xe7\x1c\xfd\x3c\x3f\xbc\x7d\xae\x9c\xab\xed\xe9\x23\xfa\xe6" + "\x1c\x9d\xb6\xe7\xb4\x8d\xcd\x0f\xe7\x78\xc7\xa6\xed\xdb\x63\x3e" + "\xcf\x0f\x5b\xc7\x8f\xc8\xb3\x20\xc8\x2b\x0d\xe3\xcd\xb6\xaf\x94" + "\x70\xda\x0e\x7e\x2e\x22\x2c\x7f\xda\x70\x7c\xa7\x3e\x53\x7d\x44" + "\xdb\x7a\x40\xd3\x34\x9c\x19\x0b\x26\xf0\xcf\xf4\x95\x4a\x36\x91" + "\xd6\xc0\xbb\x03\x8e\xed\x41\xfc\x87\x1d\x1f\xda\x01\x8d\x1c\xd3" + "\x9e\x4e\xaf\xf5\x4f\xf4\xa3\xf7\x7a\xe7\xa5\x11\x16\xb6\xe6\xd9" + "\xcf\xc1\xc3\x2e\xf8\x3f\xd4\x71\xfd\x39\xb3\xaf\x1f\xb1\xc6\xbc" + "\xd2\x0e\x77\xc7\xed\x72\xde\x76\x8c\x90\x65\xed\x76\x71\xa7\x6f" + "\x4c\x7a\x6b\xaf\x1a\x1d\x47\xed\x75\x41\x7a\x9b\x85\x7a\xed\xe7" + "\x47\x7c\x6f\x95\x73\xb0\x23\x41\x89\x0a\xd7\x75\xdb\xbb\x87\xd3" + "\x24\x7b\xeb\xf0\x72\x3b\x46\xc8\x7f\x76\x3b\xbe\x7f\xb9\xfd\x66" + "\x47\xf2\xd8\xfb\xcd\x8e\xb3\x72\xfc\x3b\x47\x9c\x2f\xef\xb0\x5f" + "\x7f\xbf\xd9\x31\xc6\xf8\x77\xd4\x0d\xdf\x6f\x76\x8e\x38\xa3\xdf" + "\xd1\x3a\xfa\x7e\xb3\xa3\x5b\xa3\x33\x92\x6e\xec\xbc\xef\xcb\xd1" + "\x9b\x9d\xd6\xe1\xf4\x66\xa7\xf1\x8b\xe8\xcd\xc9\xcf\xd1\x9b\x9d" + "\x69\xe6\xea\xd1\xc6\xb2\x33\x77\x74\x7a\xb3\xb3\x52\xce\x21\x31" + "\x2d\xc3\xe8\xcd\xce\x63\xc3\xe7\x70\xc7\x88\x39\xdc\x39\xe2\xfc" + "\x7b\x87\xfd\xbf\x4b\x93\x22\x22\x22\xf4\x11\x3a\xbd\x2e\x82\x3e" + "\xd1\xf0\xd8\x84\x08\x43\xc4\x38\xfa\x1b\xaf\xfe\x4e\xd0\x47\xe8" + "\x0d\xf4\x37\x4e\xfd\x1d\x3f\xe2\x7d\x02\xca\xd2\x9f\x41\xfd\x1d" + "\x37\xe2\x7d\xfc\x17\x7c\x9f\xa0\xb6\xab\xb5\x6f\x18\xf1\x3e\xee" + "\x0b\xbe\x8f\xff\x1f\x96\x67\x9f\x7b\x1f\x7e\x0f\xf2\x81\x2d\x39" + "\xa9\x9b\x37\xa5\x09\xbb\xf6\x74\x6b\xea\xc6\x8d\xe9\xd9\xd9\x56" + "\xdb\x56\xeb\xb7\xee\xfb\xce\xdd\xf7\x5a\xa5\x79\xfc\xe6\xc5\x73" + "\xd3\x26\xb1\x55\xdb\xb3\xf0\x61\xd5\x77\x1f\x48\xb6\xae\xf9\xd6" + "\x7d\xc3\x3f\x6a\xd5\x08\x33\xf8\xeb\xd5\x12\xb6\xf6\x92\xf6\xc5" + "\x33\x56\xb2\x5f\xd0\x9d\x4e\xdc\x3d\x97\xf2\xc4\xae\x07\x9a\x70" + "\x7f\x79\xb0\x80\xe3\x5e\x45\x07\xcb\xbd\x80\x41\xcc\xaf\x2d\x64" + "\x99\x8f\xc2\x9f\x4a\xde\x44\xfe\x8e\x87\x59\xff\x93\xe9\x3b\x58" + "\xd1\xf7\x1a\x56\x50\x5e\x7a\x77\xb9\xfd\xcc\x5a\x00\xde\xb6\xf0" + "\x1a\x7d\xd3\xf1\x25\x0a\xa5\x79\xd5\xfb\xf9\x85\x13\x45\xda\x3b" + "\x85\x5a\x3e\x73\x17\xcb\x7b\x8d\xbf\xc3\xc5\x3b\x7c\xd6\xc8\x7c" + "\x79\xbb\xb8\x3e\x37\x09\x74\xa1\x3a\x96\x19\x60\x97\xfd\x42\x2c" + "\x33\xbe\x10\x0f\x1f\xbf\x79\x36\xcd\x2e\x7b\x1f\xbd\xbb\x59\x51" + "\x32\xda\x46\x5e\x45\x9f\xfb\x23\xe4\xaf\x19\x9e\xff\x48\xc8\x8e" + "\x3b\x0f\xf1\xbd\x4c\xab\xcf\x30\xb3\x39\xc0\x2f\xfb\xa2\x59\xeb" + "\x9d\x2b\x88\x4f\xa3\xa9\x68\xf2\x17\x32\x79\x37\x2a\xef\xc2\x8e" + "\x00\xf7\xc3\x67\xc2\xaa\xde\x02\x5e\xfe\x04\x33\xd0\x7a\xd6\x39" + "\xb3\x70\x97\x22\xef\xd4\xe1\x74\x66\xa0\xf1\xcf\xe8\x61\x05\x06" + "\xeb\x83\xc4\x37\xae\x62\x86\x3f\xda\x0b\x19\x2f\x8b\xbc\x52\xf6" + "\x29\x33\xbc\x3a\x58\xa8\x1f\xe4\x16\x96\x6b\xe3\xdd\x1c\x7e\xbf" + "\xbd\xdc\x07\x7b\xdb\xa6\x0d\x01\xe4\xe9\x18\x28\xb0\xb0\x16\x9b" + "\x97\xe5\xb5\x73\x5f\xf1\xa7\xd2\x5f\x45\x73\xaf\x17\xf7\x67\x8d" + "\x79\xab\x58\x44\x57\x32\xd3\x37\x67\x54\x31\xd7\x7a\x2f\xcb\x6d" + "\xe7\xdd\x4d\x1b\xce\xb2\x96\x8c\x3a\x96\xd2\xc6\xf4\x4d\x9d\xa7" + "\x99\xf0\x5d\x5d\xb6\xcc\x93\x7f\x95\x59\xf2\x36\x21\xed\x2a\xdb" + "\x99\xc7\xa2\x76\xfe\x19\x72\x50\x1b\xb5\x73\x81\xad\x3b\xc5\x74" + "\x54\x9f\xfe\xc9\xd3\xcc\xf2\xe4\xf7\xc4\x3d\x73\x56\x9d\xcf\x70" + "\x1f\xd7\x34\x58\x90\x10\x33\xc8\x13\x62\x07\x0a\x12\xe2\x5a\x32" + "\x29\x7f\xe7\xdb\x2c\xba\x8d\xc5\xbd\xd3\xd3\xa6\xaf\xba\xc2\x66" + "\x60\x4c\x5d\x34\xb6\xea\x2b\x94\xbf\x6c\x5a\xa6\x42\x65\xc3\xcb" + "\xf8\xa3\xa6\x15\xbb\x92\x7d\x4c\xa1\xba\xaa\x06\xd9\x8c\xea\x41" + "\x66\x51\x4a\xa7\x65\xa2\x5c\x2f\x7c\xc8\x11\xc5\xc8\xcd\xe3\x81" + "\xa1\x32\x63\x2b\xd1\xc3\x09\x6f\x3c\x5a\x6f\x70\x35\xf5\xb2\x66" + "\xef\x20\x6b\x61\x9f\x31\x97\xfd\x9c\xf3\xd5\x47\xeb\xc7\x11\x3f" + "\xa9\x73\xee\x84\x0d\xbc\xc4\x9d\x82\x66\x66\x70\xd1\x1c\x94\xe7" + "\x33\x53\xe6\x4e\x36\xa1\x87\xd2\x05\xed\x29\x1e\x6a\x73\xf9\xcf" + "\x39\x77\x8a\xfb\xe0\x45\xc9\xf9\xcd\x2c\xa2\xc5\x5b\x85\x7b\xc7" + "\xfa\x40\xf4\x32\x8f\xcb\xdb\xca\x5c\x99\xff\x74\x2a\xa6\x65\x6d" + "\x25\x0a\x33\xbe\xd6\xdf\xaa\x77\x19\xfa\x99\x2b\xd9\xcb\xde\xa5" + "\xb6\x79\xd9\x32\xd8\x54\x27\xb5\x78\x7d\xf0\xbf\x93\xc8\xfb\x2c" + "\x93\xca\xb3\xd8\xbc\x9a\x2b\x6c\xce\xa1\x2b\x2c\x81\x0f\x24\xe8" + "\x71\xc7\x1b\x3e\xd5\x0e\xd1\xaf\x89\x64\x30\x1a\xbb\xb8\xeb\xcd" + "\xa3\xd4\xbb\xde\x43\x09\xec\xf0\x60\xe8\xae\xf7\x60\x5f\xe8\xae" + "\x37\xe1\x94\x1d\xf7\xbd\xdd\xac\xc0\x64\x6e\x62\x13\x3a\x58\x5e" + "\x22\xf0\xbb\xfc\x22\x33\xec\xbe\xc8\xd8\x9d\x85\x7a\xc8\x99\x06" + "\xc2\xfd\x0b\x2e\x9a\x1b\x3c\x77\xb0\xc2\x23\xf4\x6b\xa2\x3f\x92" + "\xe7\x0a\x85\xaf\x8a\x4e\x15\x8f\x29\x4d\x4f\x69\xa5\xf4\x1b\x41" + "\xbf\x7b\x0b\xaa\xb9\x87\xda\xaa\x23\x5e\x65\x12\xf0\x59\xbd\x5f" + "\x5e\x37\xe0\x28\xcc\x75\xb3\x63\x9d\x1a\x5e\x4b\xfa\x9e\x67\x7f" + "\xb7\xe3\x02\xfc\xcb\x7b\x44\xbf\x86\x32\x74\xf0\x35\xaf\xa6\xa3" + "\x0f\x67\xd1\x2e\xb5\xdf\x48\xbf\x66\x29\x83\x16\xae\xd7\xca\xf6" + "\x0d\x65\xa0\xcd\xd3\x94\xce\xb5\x74\x1a\xb7\x01\xdf\x7e\xdd\x71" + "\x41\x2f\xf3\x24\xe8\xa9\x4e\x9f\x5a\x3f\xad\xfd\xbc\x19\x58\xe3" + "\x7d\x7a\x33\x3f\xb9\x61\x01\xab\xde\xcf\x9b\x0e\xed\xe7\x0d\x72" + "\xed\xed\xb2\xba\xd9\xeb\xe2\x7e\x21\xed\xe1\x0d\x25\xf4\xed\x24" + "\x71\x3f\x80\x4b\x43\x1a\xec\x4b\x77\x25\xb9\xd9\xad\x71\xe1\x63" + "\xe0\x8e\x27\xad\xd8\x47\x5f\xcf\x6f\x1c\x47\x34\xc0\xda\xd2\xd9" + "\xcb\x5e\x1d\xec\x1e\x57\xf0\x11\xd3\xbb\xfc\x1d\xec\xae\x38\x19" + "\x97\xe7\xf0\x7e\xee\x7e\x16\xf1\x8a\xf7\xf3\x5e\xc2\x97\x99\x3d" + "\x6c\x57\xe9\xd7\xe2\x58\xdc\xc7\x24\x05\x4b\xfa\xb4\xeb\xe5\x30" + "\xfa\x34\xbf\xd9\x5d\x1f\x46\x9b\xf6\x9e\xfe\x3c\x6d\xda\xf3\x37" + "\x49\x9b\x68\xed\x0b\x5a\x14\x70\xab\xe9\x1f\x8c\x48\x57\xef\xaf" + "\xec\x79\x65\x44\xba\x4f\x4d\x7f\x6e\x44\xba\x47\xa6\xef\xfe\xb3" + "\x46\xfb\x5a\xd0\x8f\xed\xa0\x7d\xbb\xdf\x02\xed\x6b\xd9\xa0\xd2" + "\x3e\x41\x7f\x76\x1f\xe2\x2f\x11\x2d\xca\x01\xbd\xd9\xbd\x0d\xfd" + "\xe7\xef\x30\xad\xef\x13\x29\xed\x1b\x48\xab\xf8\x8c\x19\xe8\x4f" + "\xa3\x7b\x3f\x01\xdd\x03\xcd\x03\xed\x3b\x18\xcf\xdb\x0e\xee\xe7" + "\xa7\xaa\x85\x9f\x6c\x47\x90\xfe\x3d\x45\x69\x25\x94\xf6\x14\x7d" + "\x07\x1d\x04\x4c\x9a\x93\xeb\x99\x88\xa3\x53\x12\xe9\x51\xf4\x89" + "\xac\x8c\xe6\x1b\xfe\xaf\xf6\x10\x7c\xcd\x3a\x96\xe9\xb2\x79\xc5" + "\x3d\x14\xf8\x66\x6f\xb1\x75\x62\xdd\xc5\xef\x56\xa0\xa7\x38\xcb" + "\xf2\xbd\xbc\x07\x77\x55\xd0\x87\x94\x1d\xff\x09\xdf\xe2\xba\x86" + "\x0c\xc6\xe0\x97\x00\x34\x9b\xfa\x62\xa8\xa0\x3e\x49\x5f\xc6\xbb" + "\xe7\xb9\x59\xc7\x09\x39\xd7\x45\xc9\x88\x63\xd0\xc1\x1c\x99\xdc" + "\x41\xf4\x91\xc6\x66\x0e\x14\x32\xf8\x66\x41\x3c\x4f\xfc\x1e\xd4" + "\x2b\x19\x15\x9a\x7f\x16\x07\xd1\x06\xca\xe3\x6a\xf3\x31\xf4\xd9" + "\xcd\x1c\x27\x9a\x73\xeb\x51\x7e\x03\x60\xc3\x1d\x05\x5a\x1d\x3a" + "\x51\x87\x5e\xe8\x6e\x33\xdc\x6c\xf7\x1a\x51\x3e\xda\xd8\xda\xbc" + "\xde\xc3\x40\xf7\x5d\xdd\x54\x47\x6e\x87\xac\x83\xea\xe2\xb4\x07" + "\x0c\xfb\xa6\xd6\x1f\x95\xc7\x2f\x53\xfd\xf3\x30\x5f\xf0\xd3\x05" + "\x3b\x25\x82\x8b\x09\xbe\x1a\x24\x1f\xea\x78\xf3\xf0\x67\x8c\xa9" + "\xbe\xc6\x08\xdf\x1c\xc7\xe1\xcb\x0b\xfe\xc5\xae\xe7\x5b\x8c\x60" + "\x34\x47\xf3\x2f\xa6\x6c\xff\xdf\xf5\x2d\x46\x75\x5b\x6a\xf4\xbc" + "\x8e\xfa\x7f\x1c\xfe\xc5\xa8\xff\x71\xc0\x43\x75\x4c\xf5\xcf\xad" + "\x03\xcc\x77\xf9\x91\x56\xee\xe0\x8d\xda\xfc\x63\xbc\x18\x0b\x7d" + "\x73\x4b\xfe\x90\xb7\xba\xd9\x9e\x7a\x7c\xa7\xb4\x26\xe4\xbf\x8b" + "\xe8\x98\x8b\xf6\xb0\x37\x3a\x02\xfa\xf2\x9d\xcc\x20\x69\xda\xde" + "\x4f\x50\x5e\xd2\xb4\xbd\xc5\x21\x9a\xb6\x37\x4f\xd2\x34\x09\x63" + "\x49\xd3\xf6\xfe\x58\xd2\xb4\xbd\x9b\x84\x3d\x11\xd1\x34\x7c\x03" + "\x5d\xd3\x68\xda\xa1\x78\xde\x08\xda\x31\xe0\xd8\x9b\xac\xd1\xb6" + "\x52\x4a\x03\xed\x40\x1f\x25\x9d\xda\x5d\xc7\xff\x9e\xc0\xa4\xbd" + "\x26\x9e\x33\xe0\x3f\xa3\x5b\x7d\xa6\x79\xd9\xfb\x91\xa4\x71\x7b" + "\x8f\x85\x68\xdc\xde\xc4\x50\x59\xd0\xb8\xbd\xef\x49\x1a\x27\xd3" + "\x0f\xaf\x03\x8d\xdb\x5d\x07\x18\xa8\xf5\xeb\x71\x8e\xa6\xe6\x27" + "\x38\xee\xaa\x0f\xa7\x71\xc3\xd7\x57\x91\x41\xa3\x71\xa0\x6d\xf4" + "\x1e\xe7\x66\xb3\xc5\x19\x31\xd6\x59\x25\xc1\x5c\x5b\x77\x98\x03" + "\x8c\x19\xf1\x0a\x00\xb7\x65\x17\xd8\x04\xd5\x6f\x8d\x3a\xee\xa2" + "\x35\xda\x1d\x4d\x37\xdb\xfb\x79\x9f\x66\x2c\xe4\x97\x8c\xe6\x7a" + "\x16\x7c\x39\xba\x0a\x3b\x98\xab\x8a\x17\xb6\xf8\xdb\x99\xb2\xfb" + "\xf1\x33\x98\x57\x92\x37\xfe\x5f\xfc\x82\xee\xd0\x3e\xfa\x74\x8a" + "\x57\xe8\xef\xcf\x94\xeb\xe9\x9b\x7d\xd8\xb7\xd7\xd0\x06\xf4\x8a" + "\xf4\x6c\x1f\x4b\x8f\x70\x03\x6d\x05\xc6\x6e\xeb\x27\xd3\x44\x5b" + "\xc4\x4b\x91\xdc\x33\xf9\x22\x2b\x12\x67\x68\xc2\x6f\xf3\xa8\x75" + "\xfd\xe4\x01\xf5\x7b\xc4\x18\xdf\x37\x7d\x41\xf9\x7d\x5f\x50\xfe" + "\x15\xd0\x20\xdc\xc7\x0b\x38\x86\xd7\x13\xed\xd7\xf2\xf5\x20\xdf" + "\x27\xea\x39\xc8\x99\x82\xd9\x42\x2e\xb3\x68\x75\x02\xef\xca\x28" + "\x9f\xf0\x11\x4c\x34\x72\xf9\x0e\x06\xff\x9c\x61\x65\x8b\xa3\x42" + "\xf0\xfd\x89\xf3\x3a\x7a\x1a\x93\xab\x8a\x31\xc4\xb3\x3f\x49\xbc" + "\x28\xee\xd2\x54\x06\xcf\x1e\x8a\xd3\x88\x5e\x0a\x9f\x77\xea\xbd" + "\xdd\x5e\xa2\x6f\xb3\xa4\x6f\x64\xaf\x76\xd7\x62\x2a\xd1\xe5\x58" + "\xf8\x61\x81\xbe\x3a\x25\xb0\x46\x7f\x52\xf8\xfb\x2f\xae\xd5\xca" + "\x8e\xa5\xdb\x43\xbb\x6a\x9b\xe2\x1e\x12\x95\x39\xa5\x95\x41\xdd" + "\xb8\x7b\x43\xfb\xf1\x2c\xe1\xdf\xcc\xdf\x0b\x1a\x38\x95\x78\xd0" + "\x58\xd9\xce\x06\x26\xdb\xd9\x67\xa4\x32\xa7\xae\x77\xcf\x69\xec" + "\xf1\xed\x5b\x7e\xe3\xe3\x63\xea\xf8\xf6\x15\x7e\xc1\xf8\xae\xd7" + "\xee\x89\x1b\x6f\x37\x46\x6b\xd7\x77\xe3\x70\xfd\xe9\xbc\x2f\x0f" + "\xd7\x44\x15\xae\x3f\xdd\xf0\x05\x70\x1d\xad\x9d\xca\x2f\xdf\x8e" + "\x55\x6b\xa7\x71\xb4\x76\x98\xf8\x37\xa6\xbf\x1e\xa3\x16\x93\x46" + "\x8d\x83\x3c\x71\xc0\xf1\x54\x8c\x9b\xed\x8b\xd3\xce\xb7\x64\x7c" + "\xa6\xa7\xe6\xb8\xd9\x4f\x0d\xc3\xef\x71\x3d\x75\x5f\x4a\x2d\xf6" + "\x75\xae\xb8\xd9\x53\xcb\xa1\x6b\x5b\x9e\x27\xfd\x03\xaa\x65\x88" + "\xfe\xef\x2b\xb9\xde\x79\x9a\x88\xbd\xa1\xfa\xee\xc0\xfd\x54\x5e" + "\x66\x59\xd3\x57\x90\xc1\x64\x6c\xea\xa7\x5e\xc1\x3d\x24\x7a\x9e" + "\x80\x67\xfa\xa5\x3d\xa0\x44\xda\xe1\x21\xae\x81\xf4\x4d\x31\x9e" + "\xbe\x5d\x43\xdc\x0b\x79\x8f\xef\xa9\x26\xea\xa7\x88\x59\x2d\x7d" + "\xf9\x0b\x1f\x2f\x5e\xca\xa7\x47\x59\xe9\xdb\xe3\x29\x8f\x96\xc7" + "\xad\xd5\x17\xf4\x73\xf1\xd4\x7b\x72\x8f\x79\xca\xd9\x37\x46\xfc" + "\x24\xf8\x3b\x3b\x92\x9f\x38\xec\x1e\xe2\xfd\x59\x59\x5b\xb3\xee" + "\xb5\x66\x3f\xf1\xe8\xfc\x6c\x5b\xaa\x6d\x5b\xb6\xb8\xb0\x3e\x89" + "\x51\x82\xd5\xb6\xe9\x89\xf4\xad\xdb\x6c\x09\xdb\x53\x37\xc9\x0b" + "\xee\xb7\x53\xc6\xf0\x4c\x6c\x78\xbc\x4a\xa2\x45\xd0\xdf\xc0\x17" + "\x85\x88\x59\x09\x9f\x24\xda\xfd\xdd\x06\x8b\x88\xed\x45\xb4\xab" + "\xe4\xb8\x9b\x65\x26\x6b\xf3\x01\x3f\x89\xc4\xbf\x58\x7a\x58\xc9" + "\x27\xc0\xa1\xd5\xc4\x8a\x1e\x96\xfe\x25\x84\x8f\x00\x97\x8d\x12" + "\x5a\x98\xd1\x99\x03\x7d\x6c\xe9\x0a\xc5\x51\xb2\x50\xf8\x7d\xdc" + "\xd9\x83\xf7\x27\x34\x7e\x01\xe7\x4b\xf2\x3c\x78\xd6\xd2\x0e\x56" + "\x72\x08\xed\x62\xfd\xd5\x3c\x23\x63\x84\x73\x47\xc9\x1a\xdc\xd9" + "\xa6\x77\xe3\x80\xa3\x74\xa1\xc6\x93\x52\x7f\x4d\x3c\xca\x42\xf3" + "\x5d\xba\xf9\xfd\x18\x0f\x53\xef\x7c\x1b\x6b\xe4\xfd\x6e\x03\xe5" + "\x4d\x0b\xe6\x75\x50\xde\x52\x4b\x32\xed\x9f\xa3\x9e\x69\xf3\xe8" + "\x29\x6e\x65\x28\x79\x5c\xf8\x98\x49\xbe\xa6\xf9\x2b\x9b\x49\x63" + "\x8f\xd3\x70\x46\xce\x7d\xd9\x38\xe1\x7f\xb9\x6c\x0a\xd2\xc6\xd3" + "\xaf\xaf\x8f\xbe\xc1\x17\x02\x8d\x0b\x7a\x68\x5d\x4b\xee\x25\xe7" + "\x49\x4b\x07\xcd\x7b\x29\xf1\x17\x39\xd2\x4f\x29\xb5\xc1\xa9\x0d" + "\x57\xe1\x20\x6b\xb0\x72\xe8\x9d\x69\xce\xcb\x16\x34\x58\xbd\x8c" + "\x47\x7c\xff\x0c\xca\xd1\xfa\xb2\x14\xd8\xc1\x93\x50\xba\xb8\xa7" + "\x57\x96\xa0\xc1\xdc\x66\xe5\x17\x90\x67\x2c\xfd\x32\xf6\xcd\x72" + "\xb1\xa7\x5c\x61\xb0\xc5\xea\x64\x65\x9f\xbb\xf3\x38\x37\xed\x5e" + "\x6b\x5a\xaa\xcd\xba\x79\xd3\x96\x74\x6b\xda\xa6\x34\xeb\x96\xad" + "\x36\xeb\x0f\xb7\x42\xd1\x03\xd5\xce\x30\x9c\x50\x30\xbe\xed\xc9" + "\xe3\xb4\xb3\xec\xbe\xed\x19\xe3\x25\x4e\x97\xbf\xdc\x37\x90\x31" + "\x61\x38\x4c\xca\xd5\x3d\xb3\xac\x8d\xe6\x43\xf5\x09\x10\xd1\x4d" + "\xef\x18\x4b\xd2\xf0\x35\x5c\xfe\x67\x99\xb7\xdc\xa0\xe5\x15\x78" + "\x71\x6b\x4f\xf0\x5b\xb9\x8a\x8f\x87\xe5\x7d\x65\xe1\xff\xe6\xb0" + "\xb0\xe5\x2f\x5f\x38\x66\x19\xf8\xfc\xda\xc9\x36\x5e\x64\xe5\xb3" + "\xb9\xa3\x6c\xb3\x8a\x43\x46\xa5\x64\x8a\x47\xc5\x1f\xc2\x89\x72" + "\xfb\xe7\xf1\xa7\xfc\x14\xf0\x87\x0f\x24\x1b\x85\xdd\x87\xdf\x47" + "\xf4\x8e\xde\x69\x9f\xa6\xbe\xb7\x63\x1c\xde\xed\xc9\xc6\x82\x17" + "\x84\x1f\xbe\xf3\x38\x43\x45\x5c\x1c\xc2\x95\x89\x32\x7e\x67\x79" + "\x93\x36\x47\x5a\xfe\xd1\xd7\xb0\xc0\x97\xe1\x38\x26\xe0\x59\x31" + "\x57\xe0\x18\xf1\x09\xd4\x27\xbd\xe6\xef\x0f\x7b\x89\x9b\x55\x2c" + "\xb2\xe5\x71\x3e\xe0\xa8\x48\x0c\xc3\x83\x8b\xa3\xe1\x01\xcd\xed" + "\xc6\xcd\x5b\x37\x3e\x4e\x0b\x3d\x2b\xdd\xb6\x31\x03\x3e\x2e\x40" + "\x07\x84\x03\x8d\xb9\x69\xd6\x6d\xd9\xe9\x1b\x27\xb1\xd1\x72\x05" + "\x3f\x86\xcf\x7f\x8c\x42\xf8\xda\xd7\x97\x3c\x0e\x77\x2d\xe4\xdd" + "\x8a\xa7\xaf\xf6\x65\x93\x4c\x32\x6c\xde\x9f\x3e\xef\xb2\x24\x12" + "\x6f\x97\xc8\x04\x2f\x4e\x30\x93\xf6\x02\xcf\xcc\x07\x1c\xfa\xf4" + "\x3a\xda\x57\x2a\x7a\x35\x1c\xa0\x67\xda\xff\xca\xdd\x21\x5b\x8d" + "\x67\xe6\xf5\xe9\xc7\xb5\x83\xfe\x48\xbb\x90\x1e\xa2\x03\xe6\xc3" + "\x1d\xec\x69\x21\x7f\xd5\x88\x7d\xe9\xe9\x79\x5a\x99\xb2\xe0\x7d" + "\xe7\xa7\x2b\x35\x3c\x09\x2b\x33\x13\x69\xc2\xe7\x91\xa3\x62\x05" + "\xe6\x9c\xcb\xb9\x37\x68\xf9\x08\xae\xfc\xb0\xa0\x23\x4f\x17\x8e" + "\xa4\x0d\xef\xc7\xe0\x6c\x5c\xf6\x47\xe0\x9f\x69\x4a\xa3\xf0\x9f" + "\x42\x3c\x1f\xd5\x5d\xaa\xda\xa9\xb4\x0a\xde\xc0\x4e\x75\xf9\x64" + "\x5d\xd4\xd6\x16\xad\x2d\x1e\x35\xa5\xf1\xb0\xc0\xb3\xa7\xdd\x21" + "\xdd\xe1\xd3\x25\x90\x99\x79\x5f\xf2\x78\x9a\xcf\x26\x81\x5b\xf4" + "\x6c\x9b\x26\x7d\xb9\x01\xdf\x30\x4e\xe0\x55\x08\xa7\x9e\xb1\x6a" + "\xf3\x8d\x31\x53\xb9\x53\x56\xe1\xef\xf7\x99\x85\x1a\x2c\xc7\xf2" + "\x39\x23\xd6\xad\x89\xfa\x32\x20\xd7\xae\x90\xf7\xa4\x9f\x21\xdc" + "\x77\x89\xa0\x3e\x7a\xba\xd8\xb3\x0f\xc0\x86\xdf\xec\x83\xfc\x34" + "\xc5\x03\x1f\x0a\x72\x2f\x7b\xa6\x8a\xea\x2f\x09\xdd\x51\x7f\xe6" + "\x28\xb5\x5d\x22\xe7\xee\x99\xe3\x61\x6b\xcf\xa3\xda\x05\x4c\x00" + "\x8c\x40\xcf\x5c\xf6\xfb\xc5\x7a\x95\xf7\x7f\x9f\x71\x6b\xe5\x84" + "\xbf\x01\xc2\x0d\xd8\xc3\x5e\x64\xcf\x0a\x7e\x03\xfd\x23\x58\x17" + "\xa2\x7d\x8c\x0f\x7b\xb7\xc0\x1b\x0b\xe2\xa5\x3c\x3b\x63\x78\x1f" + "\x9e\x9d\xa7\xd5\x25\xeb\x7e\x76\x91\xf6\x0e\xff\x63\x6e\x56\xd9" + "\x88\xf8\x93\x27\xbd\x62\x0c\x91\x0d\x36\x5a\x5b\x5e\x91\x2f\x4d" + "\x83\x21\xa5\x17\xd2\xbb\x8d\xf6\x5e\xbb\x3c\x1b\xb2\x24\x4b\x5a" + "\x54\xd9\x00\xdf\x56\x05\x56\xf8\x27\x5c\x24\xe9\x8d\xf0\xa9\x23" + "\xbe\xed\x52\xd7\xec\x44\xdc\x15\x12\xf6\x31\x5e\xbf\xa0\x0d\xd2" + "\x07\x03\x7d\xa7\x35\x32\x80\xf8\x2f\x43\x19\x13\xd5\xbe\xb5\x05" + "\xdb\x40\x5c\x4c\x71\x16\xf9\x6c\xa3\xf4\x69\x32\x81\x64\xbe\x67" + "\x7d\xda\xfc\xed\xd9\x4f\x69\x88\xdb\xaa\x67\xc6\x06\xe1\x33\xac" + "\x32\x4e\xeb\xaf\xfa\x4d\x2f\xf0\x41\xc0\xa0\x32\xb8\xfe\xfb\x44" + "\x8c\xd1\xca\x24\xad\x1d\x91\x97\xf2\x21\x7f\xc3\x1c\xf1\x6d\x7d" + "\xb0\x1e\xe9\x4b\xc5\x28\xe2\x4c\xd7\x8a\x6f\xf6\x10\xad\x7a\x56" + "\xd8\x8c\x09\xfb\x35\x1a\x87\xe7\xc9\x8c\x89\x62\x0e\xac\x2c\x82" + "\xca\x20\x7e\xb1\x5e\xe2\x62\xe5\x31\xad\x4c\x84\x0e\x70\xac\x3c" + "\xa1\xb5\xad\xd5\x81\xfe\x5f\x97\xe6\xc9\xb1\x18\xb0\x46\xd4\x58" + "\xa1\x82\x5e\x48\x9e\xeb\xb9\xfb\x05\x0e\x8a\x71\x3e\x67\x09\x9f" + "\x6b\xc9\xd3\x3d\x37\x2f\x0c\x1f\xa8\x3f\xcf\x05\xe7\xdf\xcd\x9e" + "\x53\xe3\x76\x3e\xb7\x26\xac\x8f\x49\xf4\xbe\x21\x38\x0f\x65\x53" + "\x64\x7c\x21\x9e\x31\x6a\x9c\x49\xb1\x56\x28\x8f\xc2\x45\x3f\x31" + "\x1f\x24\x93\x2d\x64\x0d\xe0\x0d\x69\xad\x10\x4c\xd0\xc7\xb3\xc0" + "\x2b\xaa\xb7\x7e\x38\x6e\x3e\xd7\x18\xd6\x5f\x1d\xe8\x3a\xa5\xb5" + "\x6b\x79\xdc\x6c\xbf\x38\xa3\xd3\xe0\x49\xdf\x7c\xc1\x79\xbc\x1b" + "\x79\xf7\x1b\xb5\x7e\x7e\xc1\x9e\xa1\xc2\x6a\xff\x7d\xb2\x8d\xfd" + "\x49\x5a\x1b\xf4\xbc\x92\xd6\xc0\xe7\x78\xf0\x47\x77\xd8\xd2\xa5" + "\x93\x23\x6c\xf2\xa9\x1b\x1f\x4f\x4f\x9b\x67\x4d\x7d\x0c\xee\x90" + "\xb2\x37\xa7\xa7\x67\x8a\xc3\x9c\xe1\x7c\x60\x9c\x68\x8f\xe0\x20" + "\x7d\x4f\x3f\x0f\x7f\x28\x5e\x75\x1f\xc6\x7a\xf7\x60\xbd\x9f\xcc" + "\xbd\x22\x64\x1c\x57\xe1\xdd\xcc\xe5\xe3\x85\x90\x03\x04\xed\xc3" + "\xf8\x2d\x5e\xb9\x0f\xd0\x7c\x62\x8f\xa4\xbe\x75\x0f\x87\xd7\x7e" + "\xdf\xf0\xb5\xfc\xbc\x71\x74\x3a\xb1\xff\x15\x41\x27\x4a\x24\x5e" + "\x80\x3e\xe1\x0e\x00\xea\xa5\x32\x8b\x86\xd7\xf9\xfc\xca\x10\x8d" + "\x7a\x3e\x59\xa3\x51\x72\x9f\x78\x3e\x97\xf6\xa0\x0a\xb5\x2d\x5b" + "\x08\x6f\x9e\xf7\x4a\xbc\x79\xbe\xd8\xcd\x5e\x0b\xfa\xfb\x90\x7b" + "\xc7\xfe\x64\xf0\x8f\x32\xae\xf7\xf3\x47\xb5\xfa\x2a\x63\xb1\x6f" + "\x3c\x5f\xff\x79\xfe\xe1\xf9\x34\xf0\x0f\xb0\x4f\x04\x2c\x44\x1c" + "\x63\xb1\x6e\x9e\xef\x0c\xa3\x3f\x31\xf4\xee\x1d\x6d\xae\x1f\xc5" + "\x76\x3c\x1f\xc7\x6e\xf3\x37\x6e\xb1\x2d\x86\xab\xaa\x74\x7b\x66" + "\xfa\x46\x5b\x7a\xda\xc8\xf3\xb6\x04\x8d\x17\xc3\x59\x77\x25\xad" + "\x7b\x4f\x14\xe0\x51\x45\xe3\x3f\x60\xd3\xc6\x20\xe8\x14\xf1\x8e" + "\x2a\x8d\x33\x75\xb1\x03\xf7\xc9\x18\xe6\x55\x36\x0d\x4f\x90\x6f" + "\x99\x9d\x2b\x94\x46\xe3\xdf\x5f\xa8\xca\x5d\xa8\xab\x4a\x7b\x0f" + "\x95\xaf\x3a\x2d\xf6\xbe\xfd\x5c\xf5\xf3\xfe\xc2\xfa\x30\x7e\x0b" + "\xef\x0b\xd4\x77\xe1\x8f\x49\xc6\x63\xaf\xba\x2c\xe1\x5b\x45\xf3" + "\xff\x9c\x4a\x2b\x0e\x24\xc9\x7a\x18\xfb\x59\xbe\x67\xdc\x61\xa1" + "\xe7\x7f\xc1\xa8\xb5\x47\xe5\xdb\xc3\xdb\xc4\xbe\x35\xb2\x3e\x37" + "\xab\x12\x76\x54\xbb\x85\x2f\xb9\x17\x96\x8f\xd2\xd7\xc6\xf0\x7c" + "\x94\x27\x83\xf2\xc4\x69\x63\xfe\xae\x5d\xa4\xe5\x5e\x67\x8c\xbd" + "\xea\x18\x7d\xc0\x2d\xb4\x0f\xfc\x57\xfb\xd0\xae\xfa\x27\x71\x23" + "\x6e\x24\xfa\x2f\xfc\xa4\x59\xb0\xae\x5f\x68\xa5\xfd\x6c\xb9\x36" + "\x0e\x8c\xf1\x78\xbe\xc7\xa0\xf9\xa7\x92\xe5\x5f\x78\x73\x78\xdf" + "\x0e\x18\xc2\xca\x74\x3b\x6f\x85\x0e\xff\x85\x43\xdc\x51\x25\xe4" + "\x1f\xf8\xad\xaa\x0c\xe2\xe1\x81\xc4\xcf\xe3\xdd\x0b\xd5\xc0\xbb" + "\x70\x5c\xda\x74\xf7\x46\xc2\xa4\xec\x74\xdb\xbd\x82\xbb\x27\xc6" + "\x0e\xee\xcf\x52\x6d\x9b\xb6\x6e\xc9\x9e\x67\xcd\x4e\x4b\x55\x17" + "\xfd\xb0\x35\xef\x10\x3a\x00\xaf\xb6\xce\xa8\xad\xea\x10\x6d\x39" + "\x10\xc2\x7f\xd8\x6a\xdd\x0a\x1d\xed\x81\xcb\x72\x3d\x1d\x68\x08" + "\x5b\xbb\xa2\x3c\xd6\xe8\x61\xc1\xb3\x1d\x08\xdf\xff\xbd\x04\xd3" + "\x89\x17\xd9\x81\x52\x15\xa6\x5e\x09\xe3\x83\xdf\x14\xe3\x14\x7e" + "\xb9\x0e\xac\xc4\x38\x85\x1f\x18\xc1\x9f\x1d\xb4\x6a\xe3\x0d\xc9" + "\x0d\x07\x17\x0a\x3e\x4a\xe5\xd7\xbe\x48\xbe\x97\xfc\xe9\xc1\x53" + "\xaa\x0e\xae\x4d\x93\xf1\x34\xfe\x9a\xfa\x92\x26\x79\xd5\x83\xa5" + "\xab\x73\xf9\x50\x8a\x1d\xfe\xea\x30\x07\x07\xdf\xd2\x78\x4b\x61" + "\xc7\x57\x3a\x85\xf6\xed\x83\x75\xe1\x74\x82\x47\x3c\xde\xa6\xf2" + "\x88\xaa\x2d\x73\xe4\x6f\x3b\xa8\x2d\x9c\x41\x5c\xa7\x6f\x18\x17" + "\xd1\xbf\x3a\xe1\xfb\x0b\xfc\x35\xef\xb3\xa8\x31\x32\xab\x85\xbd" + "\x66\x0d\xd5\xed\xa1\xb9\x1d\x70\x54\x13\xff\x77\x50\xe0\x86\x42" + "\x38\x0a\x1b\x1e\xaf\xc6\x23\xb1\xea\x55\xd8\x8b\xe8\x99\xf0\xb6" + "\xba\x56\xe2\x54\x75\xad\x27\x3b\x81\xf5\xf5\x59\xf4\x7d\xd9\xc9" + "\x06\xe8\x0b\x00\x0b\x57\xb5\x8f\x49\xfc\xa9\xce\x24\xbc\xb3\x86" + "\xd7\xa7\xd6\x05\x98\x1a\xd0\x0f\x9e\x6d\xd1\x03\xbf\x81\xaf\xbc" + "\x2f\x81\x78\xe1\xea\x85\x3c\x3b\x41\x3f\x86\x0f\xae\xeb\x8d\xd3" + "\x84\x38\x93\x88\x3d\x0a\x7a\x25\xfd\xfc\x1f\x0a\x3c\x2b\x75\x03" + "\x6a\xbb\x87\x74\x5c\xff\xa2\xd8\x57\xca\xc4\xbe\xc2\x99\xf4\x9b" + "\x7e\xc8\x2a\xec\x69\x33\x5f\x14\xb1\x66\xd5\x7b\xda\x9e\x86\x4c" + "\xbf\x88\x6b\x57\x60\x03\x9f\xe6\xc7\xf9\x91\xb8\x87\x7c\xd2\xe6" + "\x67\xdf\xf5\x01\x27\x0f\xad\x81\xcf\x78\x19\x83\xfc\xd0\x7a\xcd" + "\x4f\x3c\x62\x57\x22\xee\x2a\x8d\x2b\x22\x14\x37\xb5\x06\x3e\xa1" + "\x99\x94\xc7\x2d\xac\x8c\x78\x7a\x39\x07\x87\x5e\x46\xdc\x3e\x29" + "\x2b\x74\xd0\xbc\x44\x9c\xeb\x60\x87\xde\x16\xf8\x13\xa4\x13\x35" + "\xdf\x80\x8d\xba\x5b\xad\x83\xda\xa2\xfd\xff\xa0\x5b\xb6\x45\xf5" + "\x0d\x68\xf3\x79\xe8\xe5\xcf\xeb\x37\x42\xf5\xb9\xd9\xa1\x23\x2a" + "\x5f\xc0\xa4\x0e\xec\x7d\xaa\xab\x26\x4e\xd3\x81\x85\x78\x9f\x9a" + "\x04\x4d\x07\x26\x7d\x50\x57\xf7\xa2\xfd\xb1\x74\x44\xbc\xe0\x7b" + "\x4c\xe8\xac\x88\x87\x1b\x93\x9f\xa0\xfd\x1d\x7d\xd7\xf8\x42\x39" + "\x3f\x35\xef\x81\x3f\x44\xac\x57\x8d\x97\x94\x3c\x40\x4d\x93\xdc" + "\xcb\x6a\xea\xb4\xbd\x8c\xca\x1e\x57\x69\x85\xba\xcf\xd5\x04\xe5" + "\xdf\xd1\xed\xf3\x6b\x7a\x35\x18\x69\x30\x97\x30\x3a\x7c\x7f\x5f" + "\x74\x64\x4c\x08\xb6\x87\x85\x6f\xa7\xb0\xef\x79\x61\xb0\xc7\x7b" + "\xae\xa4\x9b\x87\x69\xff\xaf\x3e\x26\xf7\x14\x99\xc6\xa3\x2d\xdf" + "\x17\xf1\xe2\x05\x0c\x36\x09\xdd\x8c\xa7\x20\x81\xfa\x76\x38\xc3" + "\xad\xbb\xc7\x2e\x69\xd9\x61\xda\xff\x6a\xd2\xd4\x72\x31\xe8\x4b" + "\x78\x7f\x1f\xda\xf2\xf8\x96\xad\xdb\xb7\x40\xa1\xb6\x2d\xdb\xba" + "\x71\x6b\x5a\xfa\xa4\x51\xf4\x21\x16\xc4\xd3\xf6\x56\x06\xfd\x4f" + "\xbd\x54\x08\x7b\x7a\x19\xbb\xe0\xa5\x5d\xd6\xdb\x80\x5f\x87\xcf" + "\x42\x57\x20\x62\x48\xc0\xd7\xaa\xd4\x1b\x74\xa3\xbc\x84\xf5\x4b" + "\x4f\xf4\x6d\xcf\x50\x79\xac\x97\x6e\x07\x1c\x55\x99\x83\x77\xb1" + "\xda\x54\x6d\x1f\x42\xff\x04\x6f\x3e\x94\x20\xe8\xa2\x32\x94\x61" + "\x10\xf0\x1a\x4a\xa0\xfd\xa6\x36\xc9\xad\xbb\x7b\xad\x1c\x57\xed" + "\x4a\x0d\x1e\x18\xff\x00\x62\x7a\xf2\x4d\x84\xa3\x2f\x15\xaa\x75" + "\x81\x7e\xa2\xee\x38\xcd\x9e\x1b\x3e\x45\x9d\x39\xf0\x27\xfc\xe2" + "\x2a\xa5\x14\xf4\xa6\xb6\x42\xa3\x4b\xd8\x8b\x14\xaa\xe7\x8d\x7e" + "\xcf\x38\x5a\x37\xf7\x51\xd9\xf8\x0e\xf6\x62\xbb\x8c\x3b\x50\x7b" + "\x62\x78\xdc\x81\x17\x89\x1b\x7d\xb1\x5d\xfd\xf3\x87\x3d\x5f\xef" + "\x4f\x2b\xd3\x18\x96\x66\x19\x91\x87\xc6\xf5\xe2\x9c\x20\xbf\x22" + "\xfd\x9a\xaa\x7e\x90\x11\x43\xe3\xc5\x54\xf8\x0e\x0d\xe1\x46\xed" + "\x5e\x95\x07\xe9\x06\xec\xb0\xdf\x52\x1e\x79\x97\xb5\x8c\x70\x83" + "\x27\x33\x8c\x89\x0f\x6c\x22\x9c\x78\x31\x37\x84\x07\x12\x46\x94" + "\x56\x11\xe2\x53\x5e\x4c\x43\x99\x70\x38\x50\x1b\xf7\x49\xd9\xf4" + "\xc5\x7a\x6d\xcf\x86\xdf\x54\x19\x87\xe2\xc5\x39\xc7\xf3\xbb\x49" + "\xe6\x7f\xf1\x54\x58\x1d\x73\x54\x5d\x84\x81\xeb\x0f\x17\x1f\x16" + "\x32\xdb\x8b\xde\x90\x4e\xe0\xc5\x39\xa0\xbb\xa2\x8e\x68\xcb\x06" + "\x97\x57\xc4\xaa\xd6\x69\xb1\xe9\x07\x1c\x2f\x59\x35\x1e\x45\xab" + "\xab\x41\xea\x9c\x84\xaf\x4b\x5a\x83\x15\x94\x67\x79\x50\x1f\x4b" + "\x69\x41\x19\xd0\x4e\xeb\x58\xf0\xde\x2f\xa5\x85\x64\xbd\x5a\x71" + "\xaf\x5a\xc8\x81\xb2\x1e\xe2\xbb\x5e\x4a\x1e\x29\xb7\x11\xff\x60" + "\xdd\xb4\x65\x13\xb1\x0f\x3f\xcc\xdc\xba\x98\x44\x87\x1f\x66\x6e" + "\x5a\x0c\xd3\xaf\x55\xcb\x1f\x10\xbf\xb4\x38\x16\x8f\xa2\x3f\x86" + "\xde\x5b\xc4\x83\x86\xce\x88\xe4\x5c\xe8\x4e\x07\x64\x5c\xd5\x09" + "\xea\xaf\x51\xfd\x1d\x4f\xfb\x9e\xaf\x8b\xfd\x6c\x1c\x62\xe0\xb8" + "\xd9\xcf\x2c\x8a\x43\xc6\x93\x55\xf7\x6c\xa2\xe5\x2f\x05\xb4\x73" + "\x33\x61\x0b\x0f\x7f\x86\x7d\x19\x42\x1f\x37\xe0\xf8\x59\x50\xff" + "\x21\xf5\x8b\xf2\xec\x8d\xd2\xd7\x68\xe9\x9a\x3e\x96\xd2\xd2\x34" + "\xdd\xab\xcc\xfb\x33\x5b\xa8\xec\x30\xdd\x76\x9c\x76\x2e\x47\x79" + "\xaa\x34\x98\x69\xf5\x14\x58\xf9\x45\x95\x4f\x8a\x10\x7c\xb5\xe3" + "\xa5\x12\xe1\x43\x14\xbc\xb8\xd0\x33\xff\xac\x49\x6b\x07\x32\x02" + "\xfa\xad\x9e\x01\x89\x75\x0f\x5f\xa1\xd2\xd7\xe8\xcf\x82\xf3\x3f" + "\x02\xe6\x09\xf7\xdc\x2e\xf4\xf2\x09\xd9\xc4\x9f\xdd\x3e\x42\x0f" + "\x07\x1c\xba\xab\x92\x4d\x14\x3a\x26\x29\xa7\x8f\x03\x8f\x40\x63" + "\x78\x91\xe6\x33\x02\xb4\x5c\xee\x7b\x47\xd6\x06\xf7\x78\x93\x25" + "\x99\x47\x47\x9a\xe0\x6f\x5e\xde\x5f\x38\xf2\x63\xe0\x9b\x67\xea" + "\xe3\x03\x1c\xb6\xca\xcf\x7f\x7f\x40\xea\xe1\x8f\xbc\x16\xd2\x99" + "\x1d\x61\xaa\x6f\x54\xd8\xc1\xd1\x7c\x1d\x09\xda\x7f\x20\xbf\xe0" + "\xbd\xa8\x4e\xdc\x55\x40\xfb\x37\x70\xde\x43\x72\xff\x62\x9f\x5c" + "\xa7\x2f\x2f\x14\x75\x10\xad\x96\xf7\x01\x5e\x26\x3c\x3c\x12\x27" + "\xf7\x06\xd4\x9d\xcc\xfa\xa2\x17\xbb\xfb\x1c\xcd\x89\x80\xa1\x37" + "\xfa\x61\xab\xf4\x45\xfc\xf2\x37\xbd\x0e\x03\xcd\xe9\xcb\x34\xff" + "\xaf\x8e\x79\xae\x35\x94\xc3\x1b\xfc\xfd\xbc\xbe\xec\x33\xa2\x73" + "\x8f\x31\xe6\xcf\xe1\x75\x43\xfd\xfc\xb8\x88\x7d\xfe\x28\x63\xa5" + "\xff\x60\x2c\x10\xf1\xfd\xf3\x83\x84\xab\x0f\x5e\x55\x2e\x22\x66" + "\xe0\x61\xca\xf7\xa0\xf7\x12\xaf\xa1\x32\x0f\x66\xf2\x8b\x35\x94" + "\x6f\xd5\x85\x8b\xfc\x10\xe5\x5d\x95\x41\xb8\x92\xc3\xfd\x81\x88" + "\xc7\xcf\x5b\x1f\x06\xed\x7e\xf9\x84\xa7\x34\x76\x21\x77\xe8\xcb" + "\xf9\xee\xaf\xdd\x41\xfd\x69\x0c\xc6\x2b\xa3\x7a\x81\x57\x88\x53" + "\x4a\xfc\xe1\x79\xc2\x83\xf3\x29\xc4\x77\x10\xde\x9e\xa7\x7c\x1e" + "\x37\x7b\x4a\xd0\x1c\x4f\xc4\x1d\xb1\xf4\x37\xaa\xcf\x68\xea\x6b" + "\x43\x20\x87\xd7\x97\x3f\x42\xfd\xef\xa1\xfe\xf7\xf3\x3a\x1a\xc3" + "\xf1\xb2\x2e\xc6\xd0\xff\x00\xea\x0c\x20\x5e\xa2\x6e\xf2\x61\xfa" + "\x9e\x62\x8f\x61\x87\x29\xef\x23\x5e\x36\xb9\x86\xf2\x3c\xf2\xe3" + "\xc9\x4c\xf4\xbf\x97\xfa\x1d\x15\xbb\x30\x40\x6d\xa3\xff\x03\x8e" + "\x9f\x67\x6a\xfd\xd4\xda\x47\x7f\xb5\x75\x9b\x02\x1d\x61\x74\xe4" + "\x5a\xf4\x5b\x9e\x7b\xfc\xfc\x6f\x9e\x6c\x9a\xe7\x88\xaf\xdd\x21" + "\x65\xec\x9f\xd7\x69\xfd\x1f\x7e\x0e\xf6\x73\x9f\xa4\x9f\x3f\x27" + "\xf9\xe7\x48\x9b\xa4\x35\x32\x0d\xe3\xf7\xd0\xba\x55\xef\x00\x9e" + "\xd7\x60\x46\xdf\x8f\x8c\x3c\xe7\x5a\xb3\x35\x4b\xe8\xa8\x53\x37" + "\xda\x36\xe5\xa4\x92\xe4\x3b\x89\x65\x22\x49\xc8\xc6\xe9\x69\xd6" + "\xad\x5b\xac\x8f\xa5\x6e\xda\xbc\x35\x27\x3d\x6b\x9e\x50\x67\x64" + "\xa7\x6f\x49\x83\xea\x3a\x2b\x35\x2b\x73\xd2\x08\x79\xa6\x24\x76" + "\x61\x0b\x62\xd1\xe4\x03\xbf\x7f\x71\x9f\xaa\xb7\xf5\x71\x47\x92" + "\x90\x8b\x25\x8d\xf9\xaf\xd7\xac\x3b\x93\xf0\xfd\x1b\x72\x1f\xff" + "\x45\x12\x2f\x8b\x7c\x88\x73\x11\xc3\x5b\x77\x91\xfd\x62\xbe\x80" + "\x47\xdf\x0a\xad\x1e\x21\xbb\x02\x67\x33\x77\x82\x0f\xfb\xaf\x53" + "\x1c\xdf\x87\xc1\xe2\x17\xe3\x24\x2f\x42\xe9\x43\x2b\x58\xc8\xee" + "\xfe\x17\xf7\x71\x3d\x8d\x9d\x60\x29\x65\x86\x78\xa6\xde\x7f\xfc" + "\xb0\x83\xbd\x02\x59\x0a\xe7\x36\xad\x82\x27\x17\xf7\xb4\x5e\x39" + "\xc3\x4b\xe3\x89\xce\x8c\x37\x01\x5e\x65\x52\xa6\xd7\x9b\x75\x88" + "\xb3\xdb\x81\x3b\xa3\x89\x38\xe7\x3d\xec\x50\x12\x43\x76\x4e\xff" + "\x65\x80\x7c\x21\xce\x39\x04\x4d\x3a\xba\x41\x5b\xbb\x7a\xdc\xc3" + "\xd9\x3d\xfd\x5e\xb9\xfe\x8e\xa6\x23\x3f\xcd\xff\xbd\x72\x7c\x22" + "\xde\x38\xf1\x06\xaf\xe4\xd1\xf8\x1f\xe6\x05\x2b\xd4\x33\xc9\x57" + "\xf2\x94\xe8\x75\xd6\x40\x36\xc9\x05\xa6\x75\xb5\xf4\x6d\x8b\x52" + "\x16\xf9\x48\x80\x78\x2a\x85\xe4\x04\x5e\xb6\xee\x67\x81\xb2\xc8" + "\x64\x65\x7b\x82\x1e\x7b\x6b\x81\x9d\xe0\xbb\x35\x63\x12\xbf\x94" + "\x11\x19\xd8\x9e\x00\x7b\xd5\x0d\x9c\x53\xd9\xe8\xc8\x4c\x11\xdb" + "\xb8\x2c\xf2\x51\xf5\x3d\x0b\xef\x0a\xf1\xc9\x94\x66\xa7\xf7\x9d" + "\x0a\x0f\xcb\x3f\x3c\x6f\x2e\xde\xcd\x3a\x61\x5f\x99\x48\x72\xc9" + "\x22\x8c\x5d\x1b\xb3\x90\xcf\xa0\x23\x0a\x8e\xed\x15\xbb\x96\x0e" + "\xb9\x41\xf2\xf0\x6c\x23\xc1\xb8\x44\xe2\x63\x30\xdf\xb7\x35\x18" + "\xc8\x58\xde\x91\x44\x37\x7f\x91\xa4\x20\x06\xfb\xee\x9b\xef\xe0" + "\xfa\xff\x9a\x0a\x9a\xb5\x3a\x20\x68\x21\x93\xe7\x4e\xaf\xd4\x69" + "\xf0\xc4\x7d\x02\xd0\x52\x9a\xb7\x84\x14\x0f\x9b\x24\xe9\xc0\x2b" + "\xad\x61\xf2\x61\x2f\xe6\xda\xcd\x5e\x11\x7e\x96\xb8\xde\xb8\x5b" + "\xbe\x1f\xb5\xca\xb5\xf2\x8a\x5f\xcb\x4b\x69\xd2\xdf\x49\x89\x69" + "\xc1\x76\x3f\x9b\x9e\xb9\x84\x77\x11\x6e\xb6\xca\x7c\xbf\x98\x13" + "\x5a\x53\x12\xdf\xe8\xb7\x0e\xf2\x35\xce\x1f\xf1\x5c\x33\xc6\x9d" + "\xd8\xfc\x6a\xce\xb1\x5f\x61\xff\xb4\x4e\x67\x22\x86\x2e\xe1\x61" + "\xe1\xc9\x6a\x2f\x13\xf3\x1c\x1d\xf9\x50\x1f\x62\xa5\x13\x2d\x1f" + "\xad\x3c\xca\x50\xfe\x13\x42\x4e\xa2\x75\xa1\xd0\xba\xa0\x32\x0f" + "\x03\xaf\xf3\xaf\x42\x7e\xf9\x85\xbf\x21\xb7\x1b\x3e\xfb\x09\x5f" + "\x7f\xe1\x07\x0c\xb1\x0e\xca\x1c\xe2\x3e\xa4\xd8\x27\x9d\x39\x0b" + "\x50\xc7\xf9\x68\x1f\x33\xb4\x10\x45\xa0\x79\xf1\x65\xe6\xb3\xc9" + "\x3d\x94\xdf\x60\x63\x46\xc8\xb0\xc3\xf7\x90\xd1\xf7\x8f\x3e\x53" + "\x7c\x62\x5f\x59\x3c\xed\x47\xaf\x2e\x70\xb3\x63\x63\xca\x19\xbb" + "\xe3\x89\xaf\xa1\x7c\x15\xd3\x71\x56\xfd\xea\x86\xeb\xe5\xd5\xee" + "\xe8\x02\x57\xee\xb2\x40\x9f\x12\x9f\x28\xce\xbc\xa3\xe3\x8d\x52" + "\x6f\xf9\x6a\xad\x56\x1e\x7a\x4f\xd8\x17\x94\x0f\x32\x4b\x79\x50" + "\x56\x7c\xb5\x51\xce\xd1\xab\x8d\x9a\x7c\x31\x5a\x3b\xb6\x23\x5c" + "\x29\x98\xcb\xf4\x2e\xab\x87\xdd\xe9\x63\xa6\x9a\x03\x8c\x55\xec" + "\xe4\xbe\x67\x77\x12\x1e\x11\x8c\xb9\xfe\xd5\x24\xd8\x61\x1c\xa6" + "\x3d\xba\x4c\x61\x2c\x82\xfa\xf2\x6c\x3f\xb5\x99\x2f\xf3\x71\xe9" + "\x5f\xcd\x42\xf9\x36\xd3\x6f\x1c\xd1\x11\x56\x99\xcf\x8c\x95\x0a" + "\x33\x54\xe4\xb3\x19\x94\x46\x7c\xc5\xb1\x95\x9a\x2c\x30\xea\xb9" + "\x70\x0d\xd1\x47\x6a\x77\x57\x3e\xf7\xbf\x4f\xd2\x92\x43\xe1\xbe" + "\x2f\x03\x77\x1a\xff\x31\x39\xc6\x63\xc7\x34\xd9\x80\x9e\xeb\x87" + "\xdf\xb5\x3e\x56\x3b\xf2\x8c\xf9\xd1\xad\x5b\x6d\x29\x59\xe9\xf8" + "\x49\x98\xbb\xed\xf6\x91\xbc\xa2\x49\xc6\xa5\x3a\xd6\x8a\xb5\x05" + "\xfe\x49\xde\x59\x7a\x2d\x26\x4c\xdf\x03\x9d\xf3\x52\xf0\x7d\xb0" + "\x39\xa1\x6f\xf3\xde\xcb\xcd\x13\xf2\xc6\x19\x23\xd3\x8f\x6c\xef" + "\xb1\x54\x5b\xea\xe6\x7b\xa5\x59\xc3\xe7\xdb\x79\x2d\x69\x44\x3b" + "\xc1\xf3\x5f\x55\x36\xf7\x0a\xfa\x58\xba\xae\x82\x47\x2d\x4d\x94" + "\x7b\xdd\x6b\xd5\x9a\x0d\xe1\xe8\xbe\x5d\x22\x9b\x02\x65\xd3\xea" + "\xb0\x46\x0a\xf2\x98\xfe\xd7\x3b\xdb\xf4\x90\x4b\xf2\xe9\x19\x36" + "\x5d\x42\xff\xad\xc6\x8c\x7c\xe7\x4a\x1b\xed\xa5\xaf\x79\x78\x69" + "\x24\xf1\x88\xaf\x75\x8f\x65\xc7\x15\x7e\x2f\x5e\x9e\xdd\xbf\x6e" + "\xbc\x8e\xcd\x97\xc8\xaf\xd9\x69\x8c\x28\x97\x27\xe7\xec\x75\xc2" + "\xff\x57\x2d\x1a\xfe\x6a\x79\xca\xe3\xb5\x58\x9c\xaf\xaf\x1d\xab" + "\x7e\x5e\x12\xbf\x50\xe2\xf8\xeb\x6f\x8b\x33\xea\xe9\xec\x27\x1d" + "\xec\xf5\xb7\x0c\x16\x66\xa1\xe7\xff\xa2\x67\xa1\xc3\xc0\xb7\x61" + "\x78\x34\xb3\xb7\xd6\x40\x14\x87\x28\x8f\x8e\xcb\x7f\xc4\xf8\xc9" + "\x7f\x11\xf4\xa7\xe7\x3a\x71\x7b\x25\x82\x66\x70\xc2\x78\x03\x33" + "\x47\x9b\x8c\xb3\x6e\x99\x61\x59\xba\x64\xd1\xc2\x82\xfc\x5c\x3b" + "\x57\xfc\x3e\x33\x0f\x8b\x9f\x5a\xb2\xa4\xed\xa1\xdb\x0b\x25\xff" + "\x50\xba\x64\xd4\x3b\x6f\xa5\x0e\x9e\x09\x99\x56\x89\x7e\x98\x15" + "\x6c\x63\xfa\x37\x06\xdd\x7a\xc8\x50\xe0\x61\x10\xe3\xbd\x83\xbd" + "\xf1\xc0\xbb\x94\x46\xf0\xb2\xf3\x92\x87\x99\xbc\x9b\xf4\xc6\x3e" + "\xa5\xec\x61\x16\xaa\xdf\xc0\x50\x3f\xc9\xe9\xfa\x23\xf9\xdd\x7a" + "\x97\x61\x09\x73\x59\xbd\xec\x5d\x7a\x1e\x75\xae\xa8\x4d\xe8\x84" + "\x51\x07\xed\xc1\xc5\x05\xd7\x68\x6f\xb6\x8b\xf3\x19\xfd\x45\xf6" + "\xc6\x7b\x75\x63\x94\x13\x67\xac\xd1\x93\xff\x3e\xe0\x78\x83\xe8" + "\xf9\xa3\x95\xaa\x1c\x42\x72\x52\x9d\x49\xdb\x0f\xe8\xfb\x67\xf2" + "\x9c\xa8\xce\xaa\xe5\x19\x75\x8e\x7e\x0a\x9b\x67\xee\x04\x1e\xf0" + "\xfe\xee\x6e\xf8\x60\x1c\x4b\x17\x07\x9b\xfb\x6c\x0b\x57\xf8\xf3" + "\x8f\x7b\xf3\xab\xb8\x2f\x7f\x06\xef\x2e\x98\x21\x6c\x65\x20\x57" + "\xc4\xf4\x4d\x7d\xfc\x72\xdf\xf3\x8f\xf7\x29\xcf\x3f\x7e\x85\x4f" + "\x7d\xfc\xaa\x32\xf5\xf1\x7e\xa9\x33\x64\xe6\x81\xe7\x1f\xc7\xd9" + "\xf0\x32\xea\xe7\x45\x9c\x43\x92\x9c\x41\xf2\x5c\xdd\x09\x4d\xce" + "\x18\x26\xc7\xa4\xd9\x52\x60\x54\x90\xfa\xc4\xf7\x13\x7f\xa0\x86" + "\xe5\xf8\xf1\xb6\xd4\xc7\xd3\x53\x48\xc2\x49\x51\xad\x8f\xa0\x7e" + "\x26\x66\x0e\x79\x71\xe2\x71\xaf\x75\x7b\x7a\x56\xd6\xfc\xad\x5b" + "\xee\xb5\x22\x98\x87\x48\x97\xf7\x98\x32\x52\xd3\x04\xcb\x97\xfe" + "\x39\x7d\x35\xc6\x82\xd8\x91\x34\x9e\x2b\xe1\x63\x50\xfb\x3c\x4b" + "\xf4\x99\xfa\x8b\x7e\xab\x7d\x26\xb9\xfd\x97\x41\xfd\x67\x48\x67" + "\xf0\x4b\x1f\xf6\x71\xad\x0e\x94\xa7\x72\x97\xc2\xca\xd1\x58\x7f" + "\x79\x34\x5c\x6f\x2a\x75\x97\xbf\x5a\x23\x74\xa6\xcf\x7f\xdf\x83" + "\x38\x3a\xc4\x0f\xea\x7a\xd8\xaf\x04\xdf\x04\x99\x4f\xc0\xdc\xaf" + "\xc5\x9b\xa8\x6b\x84\x0d\x8a\xec\xdb\x2f\xbd\x61\x3c\x19\xcd\xf9" + "\xaf\xd6\x43\x97\xd7\xcb\x7e\xf5\x0d\xca\x77\x99\xea\xf3\x2a\xcf" + "\x7f\xbf\x8f\xe4\x33\x9a\x83\xef\xf7\xc3\x8f\x08\xee\x9e\x20\xb6" + "\x43\x8b\xd7\x23\xe2\xe4\x89\x32\x24\xc5\xa2\xcf\xb2\xce\x5f\xad" + "\x08\xe9\x14\x7e\x65\xd4\xfa\xe5\x66\xbf\x44\xcc\x64\x4b\xf8\xfc" + "\x3c\xb0\x7c\xed\xfc\x2d\x5b\xe7\x6f\xdc\x66\x9b\x6f\xcb\xc8\xda" + "\xba\xed\x87\x19\xc3\xe8\xe5\x0a\x7f\x99\xf1\x2c\x3f\x97\xcc\xa2" + "\x77\xc5\x8c\x37\xeb\x12\x9f\x68\xde\x03\x9b\xd4\x29\xcc\x6c\xff" + "\x01\x74\x84\xec\xd0\x7e\xde\x0a\xdd\x04\xce\xc8\xcd\xbb\x12\x37" + "\x99\x76\x25\xa6\x2a\x8e\x45\xf7\xe0\x0e\x94\xd9\xff\x80\xce\xd4" + "\x79\x9f\x2e\xe0\x58\x70\x0f\x78\xb2\x6a\xa2\xe1\x15\xf1\xbc\x8d" + "\xca\xb4\x53\x19\x37\xfd\x75\x52\xb9\xa6\x2e\xf6\xeb\x89\xf4\xdb" + "\x68\xde\xc5\x0f\x9b\xfd\x5c\x99\x57\x48\xf2\x17\xd5\x8b\xbb\x1f" + "\x3c\xda\x08\xfb\x28\xe8\x6a\xc7\x85\x74\xb5\xbf\x9e\x47\x6b\x6d" + "\xfc\xaa\xbd\xfc\x5d\xaa\xab\x51\xe9\x57\x1a\x11\xf7\x58\x3d\xb3" + "\x38\x55\x42\x7f\x77\x56\x32\x0b\x6c\xec\x73\xcf\x32\x7d\x4b\x67" + "\x37\xee\x91\x38\xa9\xbd\x06\xca\x7f\x82\xfe\xea\xad\x5b\x58\xc4" + "\x45\xf6\xeb\x3c\xcd\x36\x4f\xf2\xff\x6f\x0a\x3e\x98\xca\x3b\x71" + "\x2f\x24\xef\x09\xa2\x1d\x5d\x1e\x3d\xea\xa7\xb4\x46\x57\x46\x37" + "\xf1\xe8\x4d\xb8\xbb\x03\x1d\x0d\xf2\x24\xf8\xe9\x1b\xf4\x34\x0a" + "\xb7\xe8\x89\x8e\x36\xd1\x3e\x55\x0f\x9b\xcf\x96\xdc\x36\xd6\x92" + "\xd9\xc8\x94\xbe\x84\x39\xa2\x3e\xea\x0f\x95\x39\xf5\xc6\x63\x3e" + "\x3d\xf0\x85\xf2\xb5\x82\x1f\x82\xaf\x07\x9e\x9d\x70\x1b\xe5\x69" + "\xa0\xef\xad\xfc\x9c\x45\x0f\xbb\xca\x8b\xec\xf8\x5e\xde\x97\x90" + "\x70\x57\xaf\x8c\x7f\xdb\xc1\x8e\xaf\xa7\xbe\x9e\x0b\xeb\xeb\x43" + "\x34\x06\xc2\x25\xe6\xa4\x76\x4f\xa0\x1f\x2d\x19\x8d\xac\xc5\x47" + "\xed\x7a\x1b\x61\x37\x3c\x87\x6f\xb7\x18\x60\x47\xcc\xb7\x27\x18" + "\xca\xaf\x30\x03\xd1\x4c\xe7\x61\xfa\xa5\xf1\x1f\x27\xf9\x6f\xc6" + "\x80\xe3\x78\xa6\xe6\x2f\x04\xf2\x06\xbd\x17\x6a\x34\xa7\x94\xf2" + "\x50\x7f\xea\x51\x77\x54\x2f\x83\x0e\x6a\x1c\xd1\xb3\x71\xd4\xe6" + "\x04\x82\x63\x3d\xc1\x2e\x95\xe6\xec\x04\x60\x4d\xf0\xe9\x56\xa8" + "\xbe\xf2\x7e\xea\x4f\xb6\xc5\x60\xea\x64\xba\xd5\xfe\x01\x4e\x30" + "\x3f\xb5\xda\x3e\xc0\x71\xbf\x00\xb6\xfa\x54\x66\x31\x8d\xd5\x20" + "\x6d\x1e\x8e\xf7\x6a\x6d\x05\x80\x63\x97\x92\x55\xfd\xee\x9b\xa5" + "\xb0\xa1\x0c\xd9\x41\xbe\x59\x42\xef\x5d\xe1\xef\xc0\x73\xc5\xf1" + "\xab\x8c\x1a\x81\xeb\x6f\x2e\x20\x5c\x37\xa9\xeb\x87\xea\x36\x18" + "\xfa\x1c\x1b\x90\xbe\x92\xf8\x93\xb5\x72\x0d\xbc\x29\x78\xfd\x2e" + "\x76\x3c\x41\xc6\x0a\x3e\x3e\x4f\xd5\x0b\x9e\x92\x75\xfe\x3a\x0f" + "\x73\x0d\x18\x12\x9e\x17\xb9\xba\x1b\x05\x8e\xbb\xd9\xaf\x6b\x6b" + "\x88\xa7\x1a\x83\xde\xfb\x5c\xb4\xd7\x29\xfd\xbc\x1b\xb2\xb4\xb4" + "\x79\x7c\xd3\x99\x62\x8f\x48\x22\xb9\x59\x4f\xb0\xc0\x1a\x8d\x27" + "\x79\x61\x29\x6c\x63\x09\x06\xe8\x93\xfb\x7a\x71\xb9\x69\x0e\x88" + "\x47\xfd\x8d\x81\xfa\x2b\xe2\x52\x21\x6e\xb1\xd4\xf7\xff\xc6\xa2" + "\xf9\x86\xe1\xfd\x3c\x17\x7c\x20\xb5\x5b\xb8\x27\x47\xb4\x81\x58" + "\xcd\xdd\x36\x2b\x3f\xd3\x60\xf5\x8c\x49\xef\xc3\x6c\x39\x3d\x6a" + "\xfc\x47\x61\xd7\x32\xdc\x96\xf3\x37\x85\x61\xba\x43\xd8\xb6\x14" + "\xc2\x7e\x47\xfa\xf0\xfa\x8d\xf0\xf5\xb5\xda\x2e\x7d\x15\xb9\x7c" + "\xbd\xaa\x0c\xfc\x9b\x66\x11\x13\x0e\xf2\x95\xb0\xff\xec\x51\x6d" + "\x36\x7f\x93\x8e\x36\x1a\x46\xc4\x9d\x4f\xdf\x92\xfa\xe8\xe6\x74" + "\xa9\x4e\x9f\xff\x23\x5b\xea\x0f\x87\xcb\xe9\x82\xee\x72\xc7\x6f" + "\xda\x24\x1d\xfb\x6d\x4c\x18\x6d\x34\x04\xcf\x17\xf4\xec\xb8\x3c" + "\x63\xf8\x6d\xe2\x68\x67\x0c\x0f\xfc\x70\xcb\xd6\x2c\xd1\x86\x30" + "\x6f\x4d\x97\x37\x55\x27\xb1\x87\x96\x3f\xb0\x7c\x7e\x76\xba\x4d" + "\x04\x7a\x92\x0a\xfd\xd4\xb4\xb4\x2c\xd5\xf8\x75\x13\x4a\xe1\xcb" + "\x63\xdb\x45\xd1\xcc\xc7\x6d\xd2\x6c\x36\x7b\x73\x6a\x4e\xba\x5a" + "\x45\x78\x5f\x67\x60\xef\x6e\xa8\x16\xfb\xc3\x24\x69\xab\xf3\x5b" + "\x67\xd8\xd9\x7e\xb8\x2e\x71\x1a\x7d\x6b\xd7\xbe\x65\xde\x0a\x5c" + "\xa9\x7f\xa2\xa5\x56\xd0\x2c\xc3\xc9\x97\x00\xdf\xfa\x07\x10\x9b" + "\x84\xf8\xac\x64\xc4\xd2\x56\xed\x60\x88\x77\xa8\x9f\x4b\x72\x7f" + "\x32\xc1\xd7\xbe\x3a\xa0\x70\xda\xdf\xed\x6e\x76\xc2\xa2\xea\xe7" + "\x8c\x8a\xfe\xb7\x8b\x60\xc3\x58\x23\x74\xc9\xf5\x49\x21\xba\x7f" + "\xc2\x02\x1e\x16\x34\x16\x7d\x43\x3f\xe9\xfb\x86\x30\xfb\xb1\x4e" + "\x37\xfb\xad\xd0\xc9\xc0\xce\x49\xc4\x0d\x22\x7a\xa4\xfa\x28\xd1" + "\xb7\xbc\x04\x9e\xe8\x77\xc5\xb0\x0f\x53\x4a\xe2\xd7\xc8\x3d\xee" + "\xad\x17\x79\xd9\xe4\x9e\xbb\xbc\x2c\x4e\xd2\xa4\xfa\x0b\x94\x7e" + "\x13\xf5\xb1\x91\xd2\xff\xfd\x46\x7e\xf7\x38\xf0\xe9\xf2\xbc\xb4" + "\xfe\x82\xaa\x5b\x06\x7c\xc6\x85\xf5\xa1\x33\xa4\x7f\x3e\x61\xf1" + "\x44\xc5\xaf\xd9\x23\xed\xc3\x84\x2d\x8c\xb4\x47\x7a\xcb\x18\xd4" + "\xb7\x52\xdb\xaa\xfd\x47\x5c\x17\xe5\x27\x58\xac\x51\x6d\x32\x30" + "\xf6\xb5\x18\xb7\xb4\xeb\x7d\x6b\x51\xb8\x2c\x2e\xe3\xb4\x4c\xee" + "\x51\xa4\x0d\x37\xfa\xbe\x49\xf0\xf4\xd0\x75\x0f\x02\xde\x6f\x11" + "\xed\x9f\x7c\x9e\xca\xd1\xce\xf9\x9b\x5e\xad\x3f\xe8\xb3\xcd\x4e" + "\x8c\x29\x95\x03\x1f\xd6\x27\xf6\xfb\xb7\xaa\x42\x7d\x7e\x4b\xca" + "\xef\x5c\xa3\x57\xbf\x33\xc9\x33\x87\xf8\x0d\x61\xf3\x66\xb8\xc8" + "\xde\xba\x40\x7d\xdd\xb0\x5b\xda\x61\x8d\xd3\xec\x9b\xa8\xae\x61" + "\xe3\x0f\x9d\x07\xfc\x36\x4b\x9e\x07\xfc\xce\x10\x9a\xc3\xb7\x1a" + "\x81\xf7\xb0\x61\xd3\xec\xd7\x30\x9f\x32\x86\xcd\xef\xe6\x69\xf5" + "\x28\xd1\xf1\x49\xd0\xd9\x94\x49\x5b\x0c\x9a\x97\xdf\x3d\x11\xa1" + "\x3b\x23\xf8\xfa\xbb\x7c\xac\x96\xd2\xc6\x53\x5a\x2a\xf2\xa1\x4d" + "\xa1\x37\x27\xd8\x60\x2c\x0a\xc9\xfb\x11\x96\xf1\x2b\xa9\xbe\x5c" + "\xa2\xc7\x2b\x43\xb8\xf1\xbb\xe5\xc2\x0e\x4c\x85\x35\x77\xfc\xf6" + "\x27\x21\x3d\xd2\xef\x8e\x06\x75\xc0\x54\x4f\x68\x4f\xfa\x5d\x33" + "\x60\x5c\x1e\xd4\x87\x9d\x60\xa2\x1f\xf2\x6c\xff\xfd\x2e\xf6\xfb" + "\xcb\x3c\x7a\xf2\x79\xec\xe7\xd0\x55\x60\xee\x85\xec\x21\x74\xb9" + "\xbf\x7f\xa5\x46\x9e\x9f\xed\xa7\xe7\xd7\x14\xfd\x68\xb8\xf3\x7b" + "\x6b\xb8\xad\xb9\x84\xff\xef\x33\x14\xd4\x49\xe3\x47\x5d\xb4\xc7" + "\xe9\x34\x1d\xbb\x5a\xef\xf7\xa8\xce\xe7\xbb\x54\x58\x8b\x73\xe5" + "\x32\x15\x0e\x98\x63\x01\xf3\xdf\xd3\x9a\xfa\x8d\x38\xbf\x29\xa8" + "\xe5\x17\xb6\x52\x1d\x32\xde\xf3\xef\xab\x38\x60\xab\xe6\xf7\x40" + "\x17\x44\x7d\x97\xf7\x74\x09\x17\x87\x32\xc4\x1d\x45\xa5\x2c\x7e" + "\x05\xfa\x8e\x33\xe5\x90\x7e\xef\xf7\xcd\x28\xeb\x79\x52\x96\x29" + "\x97\x67\xde\x34\x37\xbf\x1f\xc7\xb7\x67\x30\xf5\xac\x95\x68\xfd" + "\x5b\xa7\x80\xf7\xa8\xc7\x2b\xf4\x37\xbf\xef\x54\x08\x2e\x34\x27" + "\xe6\x01\xc7\x89\x18\x6d\x4e\x68\x3e\x9a\xae\x23\xfb\xd1\x9c\x9c" + "\x58\xa4\xf9\xfb\xc2\xde\x44\x6b\xb8\x50\xca\x35\x27\x02\xe6\x5d" + "\x4b\xb9\xd9\x7f\x0f\x78\x30\xef\x61\xbd\xd0\xcb\x6b\xb6\xd4\xb3" + "\x08\x4e\x97\xb4\xfb\x29\xca\xee\xef\xb7\xc1\x0e\xdd\xe5\x93\x76" + "\xe8\x48\x7f\xd0\xcb\x95\x16\x6f\x00\xf7\xb3\xda\xa8\x8d\x5a\x4d" + "\xe6\x07\x7d\x8b\xd8\xa5\x23\xd8\x9d\x38\xee\x66\x6f\x2c\x50\xe9" + "\xda\x04\x9a\xf3\xd3\x6a\xfd\xe1\x7d\x50\x7d\xed\x9f\xf0\x4b\x39" + "\xf4\x44\x37\xd1\x9e\x2a\xa9\x3b\x38\xe1\xd5\xfa\x4d\xdf\x9d\x23" + "\xc7\xb8\x66\xd9\x03\xe9\xd6\xcd\x20\xd1\x89\x77\xdb\xad\x09\x73" + "\xd3\xee\x12\x17\x17\xac\xff\xb1\xec\x5e\xeb\x9a\xc5\x73\xed\x19" + "\xf3\x1e\x94\x3f\xcb\xd6\xac\xc4\xef\x08\xb9\xc0\x3a\xe0\x78\x7b" + "\xed\x70\xdd\xc4\xfb\x6a\x1f\xde\xde\xec\xd6\xfd\xa7\x8c\xb1\x68" + "\x32\x19\x79\xf1\xe0\x0a\xda\x53\x7b\x21\xb3\xad\x0e\xfc\x93\xf3" + "\x7d\x83\x2b\x78\x94\xc9\xe8\x89\x5a\xd2\x46\x7f\xb5\x9e\xa8\xd8" + "\x98\x72\xa2\x81\xc4\xa3\xfa\xcc\xfe\x09\x92\x56\xd2\x3b\xf1\x3d" + "\xdd\xc4\x5b\x61\x2e\xd9\xfd\xb7\x17\xf0\xd5\x01\xee\x22\x1e\x8b" + "\xe0\xf2\x76\x93\xb6\x8f\x0b\x9d\x7a\x89\xc9\xb8\xda\xce\x87\x80" + "\x3b\xc4\x1f\x18\x79\x29\xb5\x19\x81\x33\x80\xb7\x69\xfc\x6f\x1c" + "\x95\xb0\x78\x87\xe6\xff\xc4\x1c\x15\xbe\x6b\xe8\x9d\xe6\x7f\x8d" + "\xe0\x6d\x14\x87\x45\xec\x15\xca\xee\x3b\xbe\x43\x72\x69\xad\x56" + "\x27\xd5\x65\x52\xef\x3b\x8a\xfa\xe4\xf9\xeb\x17\xff\x29\x65\x51" + "\x09\xd0\xa1\xe2\xae\xba\xd9\xae\x43\x4c\xb8\xe4\xa0\xde\x98\xbe" + "\x11\x1f\x04\x39\x36\x39\xda\xab\x2b\x44\x9e\x90\x7e\x55\x71\x97" + "\xeb\x15\x1f\xf1\x13\x31\xc0\x0f\xf0\xaa\xd2\xb6\xe7\x9d\x13\xc1" + "\xb3\xe2\x61\x73\xff\x8e\xc0\x87\x2b\x0e\x03\x8d\xed\xed\xe5\xb7" + "\xc6\x49\xde\x49\x71\xe8\x98\xf4\x5f\xf2\x8e\xf0\x21\xa7\xf2\x27" + "\xb3\x08\xbe\x1e\xd8\x71\x90\x1c\xe0\x01\x1f\xad\x44\x10\x4e\xb2" + "\x1e\xe6\xca\x1d\x28\x84\x0f\x85\x20\x5e\x66\x12\x5e\x66\x12\x5e" + "\xc2\xe6\x86\xda\xf7\x44\xdc\xb1\x81\xd6\x2c\xc9\x5c\xef\x14\xa2" + "\xff\x80\x8d\xe2\x60\x26\x85\x60\x25\x6c\xab\x01\x9f\xe8\xe8\xa3" + "\xb8\xfb\x8a\xb1\x9a\xfd\x34\xe6\xf0\x71\xe9\x15\x77\x99\x83\xc6" + "\xa5\xa7\x71\xd9\x2f\x08\xbd\x24\xee\x24\x13\x2d\x89\x0f\xc5\x15" + "\x7a\xb7\x36\x7c\x8c\x0a\x62\x91\x89\x31\xbc\xfb\xde\x68\x63\xe4" + "\x7a\x9d\xaa\x5b\x78\xf7\x39\xf5\xcc\x5d\xf4\x13\x74\xab\x97\xbd" + "\xbb\x36\x7a\x57\x21\xe2\x8a\x1a\x89\xb7\x5e\x86\x39\xac\x71\xf0" + "\x0a\xf4\x73\xb4\xf9\x42\x7d\xb2\x2e\xe7\x06\xf3\xae\xc2\x0d\x03" + "\x0e\xe7\xbc\xd1\xe1\xed\x5c\x75\x7d\x78\x3b\x67\xa3\x3c\xfa\x81" + "\x7b\xcd\x66\x38\xbd\x23\xfc\x26\xbe\xa2\x78\xb4\x76\xa3\x77\xd5" + "\xa2\x5f\xa3\x7e\x23\xdc\xef\x2d\xcf\x1a\xbe\x26\x94\x1a\x1f\x03" + "\xfc\xa0\xbb\x94\x67\x4c\xce\x53\xc1\xb3\xb0\x12\x53\xa2\x59\x67" + "\x8d\xc0\x1a\x13\x3c\x31\x8d\x77\xb4\x7a\xcd\xba\x0a\xf8\xcd\x5c" + "\x46\xb4\x6a\xd4\xef\xb4\x0e\xac\x7c\xf7\xd7\x6e\xe5\x25\x91\xde" + "\xe8\x5d\x3a\xee\x89\xf8\xda\xa4\x68\xaf\x7f\x0e\xe0\x4a\x7d\xb5" + "\xd3\x1a\x3f\x2f\xf6\x6e\xa1\xb7\x7b\x8f\xd6\x7f\x8b\x88\x85\xe7" + "\x89\x8a\xf4\x4a\x1b\xb5\xf7\x32\xdc\xec\x2f\xeb\x35\x3a\x46\xef" + "\x76\xb7\xee\x8e\xf5\x72\xad\xde\x7c\x80\xf6\xb4\x7a\xc5\x61\xe6" + "\xd6\x9d\x66\x4e\x75\x4d\x56\x78\x82\x9e\xf6\xad\xfa\x10\xee\xc8" + "\xbb\xd3\x1a\xee\x50\xf9\xfa\xd1\xf1\xe2\xbd\xbf\x5d\x1f\x2f\xde" + "\x7b\x4d\x3d\x73\xd8\x20\x65\xa2\xf7\x99\x26\x13\xf1\xdd\x37\x1f" + "\xb0\xe6\xa3\xfd\xf7\x2a\x65\xdb\x04\x13\x7f\x12\xe8\xcc\x4a\x82" + "\x5b\x21\xe5\x9d\xa7\xd1\x06\xe0\x90\x39\x00\x99\x8b\x09\x3c\xa7" + "\x6f\x2b\x88\xf6\xf4\xca\xfd\x39\xf6\x04\x78\x55\xc5\xf1\xb6\x91" + "\xf6\xaf\x83\x90\x99\xbc\x51\x26\x1b\xe5\x21\xfa\x37\x61\x86\x4a" + "\xff\x36\x53\x1d\x99\x95\xd2\x37\x8a\x51\xc4\xb1\xa4\x75\x8e\xd8" + "\x95\x58\xeb\x94\x16\x47\xfd\x86\x2e\x84\x64\x84\xf7\x83\xe7\xbf" + "\x8a\x23\x09\xf0\x3e\x8a\x31\xe8\xc1\x0f\x13\xec\x9e\xd3\x2b\x47" + "\xfb\xef\xb2\x30\x8c\xb9\x7f\xf7\xf4\xa3\x3f\xb9\x93\x19\xfe\x60" + "\x79\x94\x65\xde\xcd\xe2\x76\xfd\x3f\x06\xf6\xef\x85\x4c\x0f\x38" + "\xb8\xd9\xfb\xc7\x25\xec\xde\xf7\x6a\xf3\xe3\x66\xef\xad\xc7\x7c" + "\xe0\x8c\x70\xb5\x9f\xf7\xc9\x33\xd2\x93\x71\x6e\x76\x4c\xfd\xfe" + "\xf6\x86\x51\xf6\x87\xfb\xad\x9b\xb2\xad\x69\x5b\xb7\x6f\x99\x3d" + "\x7b\xd2\x28\xb2\xc4\xc9\x04\x29\x4b\x9c\x5c\x1f\x2e\x4b\xd0\xfb" + "\x66\xaa\x6f\xd1\x48\xd9\x61\x65\x8a\xea\xf2\x26\x25\x91\x85\x9e" + "\xbf\xce\x56\x7e\x3d\xec\xf5\x1e\xb6\xf2\xee\x7b\x52\xbe\x93\x9e" + "\x9a\xb6\x23\x2c\xf5\x1b\xe1\x3a\xed\xf2\x03\xd4\x76\xc4\xf4\x6f" + "\x11\xfd\xd0\x3d\xf8\x24\xf6\x9d\x86\x6f\xe7\xfb\xf9\x39\xc2\xdd" + "\x85\xf0\x33\xd7\x6c\xf3\xb3\x66\xa2\x6f\xfc\x66\xd0\xf5\x09\xd2" + "\xd7\x72\x80\x41\x67\x6c\xa6\xb1\x7b\x48\xa6\xbb\x2a\xef\x01\x35" + "\x6c\x6b\xa9\xf2\x11\x9d\x88\xb5\x48\x7e\xa7\x21\x91\xd2\x27\xd3" + "\xef\xf7\xe4\xf9\x62\xc3\x0f\x48\x26\x4f\x12\x7e\x75\x72\xe0\x57" + "\xa7\x41\xd8\x4b\xdd\xe9\x2d\x64\xd2\xbf\xe3\xc9\x6e\xc4\x5d\x70" + "\xb3\x86\x2a\xf0\x17\xc8\x4b\x65\xbe\x6e\xfd\x11\x4b\xc4\x2f\xf8" + "\x61\xfa\x96\xc8\x4b\x63\x2d\xfc\x60\x32\xec\xbb\xe6\x50\xfa\x73" + "\xe0\xdb\x22\x2c\xc6\x89\x03\x8e\x86\x4a\x8d\x07\xf1\x8e\x71\x0f" + "\x51\xc8\xe3\xea\x3e\x18\x4d\xf4\x3b\xda\x6b\xe6\x29\xf0\x53\xa5" + "\x63\x73\xb0\x3f\x98\xed\x6b\xc4\x7d\x57\xec\x8b\xa0\x09\x35\x82" + "\x96\x36\xf4\x6a\x74\xa1\x4c\xca\xa3\x93\x50\x9e\xf6\xcf\x4b\x72" + "\xff\xfc\x20\xa8\xff\xa4\x67\x8b\x86\xab\xc3\xee\x3a\x6e\xb1\xa5" + "\x67\xa5\xa7\x59\xe7\x66\x4f\x62\x61\x51\x81\x33\xd2\xb7\x58\xb3" + "\xd2\x7f\xbc\x2d\x3d\x5b\x08\x7a\xf8\x3a\x5c\x57\x48\x34\x28\x14" + "\xa3\x7d\x3a\x60\xfc\x41\x9e\xd4\x5f\xcd\x16\xe7\x7a\xf2\x3c\xf6" + "\x61\x0b\xed\x91\x49\x52\x87\xde\x43\x70\xfd\x83\x3c\xbf\x2e\x89" + "\x35\x82\x8f\xeb\x62\x7f\x78\x5a\xda\x6d\x7d\xf0\x91\x0a\xab\xa7" + "\xa9\x9f\xce\x10\xbf\xf6\xa1\x38\x1b\x96\xf6\xd3\x1f\xb4\xb9\xd9" + "\xc9\xfa\x10\x0f\xf2\xe1\x7d\xa0\x83\x82\x1e\x7e\x01\x2d\x54\x79" + "\x67\x6a\xe7\x0f\x7b\x79\x0e\xef\x2c\x1f\x64\x42\x37\x8d\x78\x1d" + "\x92\xbe\xfe\x61\x81\x06\x47\xe2\x5f\x3a\xa1\x77\xd0\xe4\xa3\xd5" + "\xfe\x6b\x3c\x7f\x07\xd3\x43\xf7\xc0\xa3\x63\x67\xbc\x9e\xe5\xd1" + "\x73\xc7\x07\x73\x88\x97\x11\x3c\x7a\x8d\x6a\x47\xcc\xa3\x62\x69" + "\x3d\xfc\x21\x37\x24\x77\x7c\x98\x24\xf8\xf8\x41\xe0\xcd\x1f\xac" + "\x29\xd8\x23\x24\xed\x8e\xfc\xa2\xfe\xf2\x49\xf2\x4c\x4f\xd2\xb7" + "\x3f\x9c\x50\xc7\xd0\x0b\x9a\xa5\xda\xa1\xeb\x25\x5e\x7f\x98\x44" + "\x38\x67\xc4\x5c\x10\x9d\x2f\xd6\xe0\x85\xf1\xa2\xef\x38\x43\x21" + "\xda\x35\xe3\x8d\x9d\x3e\xbd\x8c\xa7\xfb\x41\xa2\x94\x8f\x3e\x9c" + "\x13\x7e\x86\x2d\x65\xa1\x0f\x17\x86\x7c\xd7\x7c\x50\x35\x92\x46" + "\x6c\xdd\x82\xab\x8d\x8f\xa7\x6c\x87\xda\x79\x5b\xe6\x3c\xeb\xb6" + "\x2d\xc2\x84\x40\xa8\x01\x6c\xdb\x36\x3e\x6e\x05\x15\x49\x59\xbe" + "\x72\x65\xca\xb7\x1e\xfa\xee\xf7\x26\xb1\x6f\xa5\x52\x9a\x6d\xab" + "\x75\x65\xe2\x3c\xf9\xe9\x3b\xf7\x2f\x7b\x38\x65\xd9\xea\x87\x1e" + "\x5c\x3b\xca\xfd\x08\x13\xe1\x84\x81\xe6\x68\x5c\x07\xfb\xa8\x42" + "\xda\xc3\x7d\xd8\x34\xdc\x1e\xee\xc3\x4e\xc6\x70\x34\xd8\x48\x92" + "\xcc\x47\x76\xfa\x23\xd8\x7d\xb4\x47\xe2\xcd\xc4\x28\xea\xbf\x2f" + "\x84\x37\x1f\x09\xb8\x42\x77\x20\xcf\x01\x1a\x89\xfe\x7d\xb0\x26" + "\xfc\x5b\x88\x16\x7c\x24\x6c\x45\x35\xbc\x00\x3e\xa4\xf8\x8d\x02" + "\x37\x24\xbf\xd2\xb8\x46\xc3\x8d\x72\x79\x56\xc9\xa0\x97\xc3\x77" + "\xc2\x6f\x03\xce\x3a\x08\x17\x0c\xb0\xf3\x40\x3a\x8f\x7a\xd8\x20" + "\xeb\x6d\x2c\xc6\xd9\x07\xf8\x59\xf5\x7c\x36\xba\x87\x35\x7e\xc0" + "\x1d\x1f\xae\x94\xb2\xe0\x87\x79\x02\x6f\x76\x4f\xff\x96\x38\x0f" + "\x17\x77\xdb\x1a\x4f\x84\xf0\xe7\xa3\x0a\xcc\x4d\x48\x1f\xdd\xd8" + "\x36\x42\x8f\x13\x41\x69\xbd\x5a\xec\x03\xdb\x6c\xa6\x37\xcc\xae" + "\x60\x95\x7a\x5e\xe8\x66\x8d\xd5\xd2\x26\xfa\x23\x93\xc6\x3f\xd3" + "\x33\xad\x7f\xfd\xb1\x91\xfa\xaf\xb2\x30\xfd\x57\x7e\x26\x3f\xd3" + "\x92\xe9\x01\x8f\xec\x74\x79\x84\xcf\xdd\xa5\x2d\x99\x5e\xd8\x39" + "\x4d\x22\x38\xa5\x16\x04\xf8\x20\x3d\x4f\xa7\xb1\x89\x3d\xe4\x2e" + "\xa9\x53\x20\x79\xec\xa3\xa7\xa5\x6c\x22\xd3\x01\x77\x7a\x06\x5e" + "\x19\x30\x3f\x84\x97\xbd\x34\x47\x2b\x47\xa3\x7b\xd1\xbb\xf4\xaa" + "\x6f\xb3\x8f\xce\x42\x46\x05\xac\x9e\xd5\x2b\x19\xcf\x3a\xe8\x8f" + "\x7e\x41\xfb\x42\xfc\x25\x57\x6d\x9d\x3e\xea\x6c\xb0\xf7\x62\xdf" + "\xf4\x8d\x45\x4b\x69\x3e\xdb\xb5\xf9\x5c\x1d\xf0\x2c\xc5\x7c\x0d" + "\x38\xfe\x38\x43\x9b\xcb\xbe\xdb\x7e\xbb\x26\x62\x17\xb3\x9e\xac" + "\xbe\x1b\xe9\xb4\xfe\x3f\x12\x76\xcd\xf0\x45\x30\xb2\x2c\xd1\xe1" + "\x24\xb5\xfc\x7a\xad\xfc\x48\x9f\xd9\xe2\xb2\x38\x94\x5c\xf7\x4a" + "\x7b\x33\x35\xc4\xf9\x30\x7b\x33\x9c\x47\x37\x48\x9c\xd4\x74\x70" + "\x31\x72\x3c\x1f\x3f\xa4\x94\x4d\x86\xcd\x50\x87\xaa\x07\xa0\xb5" + "\xfd\xc7\x6b\x77\x32\xb6\xd9\xbb\x3d\x39\xa8\x43\x81\xee\x03\x7e" + "\x30\xa9\x1f\xe1\xf7\x5f\x82\xf6\xc2\x6e\xf6\xf1\x5a\xd8\x2f\x6a" + "\xba\x5f\xac\x2b\xa9\xb7\xf9\x38\xce\xe5\x65\x8c\xea\xdb\x22\x6c" + "\x31\x1c\x7f\xdc\x2c\x70\x8f\x64\x6d\x21\xe7\xe7\xf2\x73\xda\xb9" + "\x0a\x78\x17\x79\x37\xf4\xe3\xe0\xf9\x87\xbc\x27\xf9\xc7\x06\x9c" + "\xad\x50\xfa\x86\xd1\xf4\x85\x44\x1f\x32\x52\xb7\xa4\x6d\x7d\xec" + "\xb1\x2f\x26\x0d\xe1\xe7\xad\x15\x0e\xa5\x98\xea\x84\xfc\xeb\x96" + "\x78\xfa\x31\xd1\xff\x97\xea\x25\xff\xf6\xfd\xf3\xb4\x6e\x66\xf6" + "\xb0\xa6\x19\x1a\xff\x2e\xd7\x51\x53\x02\x77\x7c\xbc\x39\xb4\x36" + "\x3e\xf6\x7e\x7e\x6d\x34\x19\x47\x5f\x1b\x4d\xf3\x68\x9f\x6d\xa7" + "\xef\x09\x6e\xf6\x2b\x71\xff\x02\xef\x2a\x0f\xee\x34\xfb\x97\x0a" + "\x1e\x3c\x65\x07\xd3\x81\xff\x86\x6e\x1a\xfb\x41\x80\xe4\xda\x00" + "\xd1\x88\x14\x3f\x8b\xc1\x5e\x50\xbe\x05\x7a\xc7\x59\xdc\xdf\xcf" + "\xdd\x29\x3b\x88\x5e\xd0\x7b\x59\x8f\xb4\x07\x79\xe4\x2a\xc9\x21" + "\xf4\x5c\xde\x05\x5a\xa1\x20\x40\x07\x93\xfb\x75\x53\xb5\xc6\xe3" + "\x9a\x77\x59\x85\xdf\x76\xec\xdb\x01\x69\x5b\x57\x87\xbd\x9b\xda" + "\x39\x2e\x68\x50\xc0\x8c\x73\x06\x56\xfe\x23\xaa\x17\x36\x6a\x5b" + "\xd0\xbf\x88\x7b\xcc\xfe\x44\xe1\xd7\xe4\xf0\x8f\x84\x6d\xda\x3d" + "\xd2\x36\xed\x1e\x56\xb3\x05\x70\x68\xf2\x5f\x57\x37\x1e\xb5\xc4" + "\x19\x9e\x6e\x7f\x6c\x53\x4a\x66\xc6\x8e\x14\xd8\xa5\x8e\xd8\xdf" + "\xe5\x1a\x72\x34\x5b\x25\x7c\x9b\xd7\x86\x74\x55\xd2\x9e\x14\x34" + "\xf3\x2e\x9f\xf0\xab\xac\x9e\x27\xb5\x88\xfb\x0e\x05\xd7\xf0\x6e" + "\x24\x9c\x6b\xf9\x3a\xf1\xf0\xe3\xfb\x60\xc7\x75\x38\x99\x55\x38" + "\xb8\x13\x3a\x34\x4a\x9f\xa6\xf9\x77\xe8\xa3\x74\x5a\xfb\x48\x13" + "\x3e\x59\xa0\x9f\x93\xb8\xd7\xdc\xe0\x66\xe6\x05\x6a\x7b\xff\x82" + "\xad\xa8\xb8\xdf\x20\xf8\x8c\xe6\xcb\xf2\xbe\x60\x73\xb7\x06\x4b" + "\xe2\x7d\x17\xc1\xd7\x04\x6c\xc6\xfa\x38\xec\x53\x5b\x0c\x5a\x79" + "\x37\x6b\x16\x77\x82\x1e\xf4\x8a\xe7\xba\x47\xbc\xe1\xfe\x21\x9a" + "\xab\x25\xdd\x6a\xae\xa5\x74\xc2\x97\xe6\x3d\xd4\xe7\x68\xe9\xb7" + "\x42\xd4\xb3\x52\xb3\xcd\x0b\x87\xdb\xb2\xd4\x4c\x62\x96\x37\x3d" + "\xf6\x58\x7a\x56\xb6\x35\x55\xba\x81\x48\xd8\xba\x39\x6d\xb1\xea" + "\x0f\x62\x4b\xfa\xf6\x94\x4d\x69\xe2\xbe\x19\xa5\xca\xc7\x11\xf0" + "\x9d\x07\xf9\x46\xdc\xe1\x10\x63\xfa\xd3\xb6\x1a\x95\x8f\xea\x60" + "\xad\x06\x69\xfb\xe3\xfa\xb1\xdc\xdb\x22\x7f\x4e\xfd\x38\xa5\xed" + "\x6d\xd0\xb1\xf4\xb1\x6f\x56\xe0\x5c\x0e\xbe\x42\x0e\xed\xe7\x9d" + "\xd0\xb3\x50\x1e\xda\xff\x9a\x8d\xda\x7a\x2d\xa5\x74\xd8\x27\x38" + "\xb7\xc0\x26\xe1\x4f\xcf\x29\xa5\x91\x9d\x7c\x92\xaf\x82\xe8\x9a" + "\x88\xf9\x8d\xf3\x28\x19\x57\xc6\xb5\x1c\xf4\x1a\xba\x40\xe7\x16" + "\xd8\x76\xbb\xe2\x88\x3f\x89\x71\xb3\x3f\x55\x91\xac\xd7\xb9\x67" + "\x27\x33\x1e\x92\x67\x8c\x6e\xa9\x57\x76\x6d\x78\x2f\x97\x31\x75" + "\x3f\x74\x97\x0a\x3d\xa7\x4b\xc6\x8c\x29\x89\xf4\x71\xd3\x4d\x9b" + "\x21\x87\x4b\xff\x6f\xae\x4a\x5e\x4a\x69\xc5\x3e\xc4\x06\x18\xe0" + "\xfb\x7c\x6d\x94\x7e\x33\xa5\x4b\x1f\xa7\xc5\x83\x96\xd5\x88\x8d" + "\xb2\x6f\x10\x67\xbd\x33\x28\x5d\xc6\x77\x2b\x1e\x6a\x5b\x1d\xf0" + "\xc1\xa7\xcc\x2c\xbe\x6f\xa8\x8d\xda\xa4\xf1\x7f\xc5\x23\xc7\xef" + "\xab\x17\x38\x27\xe8\xa6\xcb\xc7\x7f\x7a\x6d\x85\xb0\xe5\xff\xa9" + "\xaf\x5e\xe1\x19\x11\x78\xa7\x7d\x6b\x12\xe1\xc4\x29\x5e\x90\xc0" + "\x54\xfb\xff\x88\x2e\xd6\xba\x0b\x3a\x65\xc2\xb5\x06\xc0\x95\x78" + "\x31\x83\xaa\xf3\xa1\x7d\xb7\x95\xe8\xff\x02\x26\xe9\x4f\x6b\x92" + "\xd6\x16\xad\x7d\x0f\xed\xed\x0c\xfb\x3b\xc1\xa2\x9d\xfe\xdc\x52" + "\x7f\xe5\x23\x39\x72\x56\x50\x7f\x25\x79\xc8\x56\xbb\xb6\xf6\xd0" + "\xb6\x84\x87\x09\x71\xdd\xe0\xf3\x56\xa7\xb6\xc5\xa0\x4b\xd1\xea" + "\xe4\x54\x27\xef\xef\xad\xa5\xbd\xd8\x48\x34\xc8\x13\xbd\x8b\xf6" + "\x5c\xb4\x01\x19\xc0\x3b\x8b\xd3\x9e\x1c\x48\x09\x18\xa4\x8f\x98" + "\x1d\x2c\x2a\x9c\xff\xa7\xf6\xba\x43\x3c\x2b\xd5\xd1\x4f\xb4\x3e" + "\x9f\x15\x76\xb2\x4f\x04\x0f\x89\xb3\x62\xe0\xc8\x20\xcd\x39\xcd" + "\x7b\x15\xb5\x53\x47\x72\x4b\x54\x17\xfb\x64\x2e\xe6\x1e\x36\x51" + "\x35\x83\x42\x96\x31\x53\xdf\x0c\x1d\xec\x93\xc9\x98\x77\xd4\xc5" + "\x8b\xaf\x65\xf8\x07\x92\xff\x2f\x7c\x34\x02\xd6\x79\xb9\xbc\xdb" + "\xfa\x18\xe0\xfd\xe9\x73\xe0\xf1\x49\xee\x11\xcf\x05\x69\x5c\x11" + "\x78\x23\xee\x04\x7c\xfa\x5c\x5e\x37\x57\xae\x39\x18\x6f\xa4\xbd" + "\xe6\x9a\x9e\xf9\x7d\x24\xa3\x53\xbf\xf5\x05\x17\xe0\x47\xb2\x96" + "\xe8\x56\x31\x6c\xb1\x8c\x65\x3b\x59\x0c\x7c\x70\x16\x64\x72\x5f" + "\x8b\xb7\x9a\xb5\x64\x56\xb3\x3f\xfa\x2b\x99\x33\x07\x3a\xdf\x3f" + "\x2d\xfa\xd8\x5e\x89\x3b\x58\x13\xa9\x8d\x80\xf5\x61\xb4\xf5\xc9" + "\xa9\x8f\x4f\x7d\xca\x3e\x76\x7e\xca\xac\xeb\xc4\x7b\x67\x53\xf2" + "\x1f\x59\x53\xd2\x1f\x59\x41\x27\x57\xc0\x2f\xe6\x3f\x81\x36\x8a" + "\xa9\xae\x5a\xf8\xab\x8c\x51\xfa\x2c\x93\x68\xfc\x86\xd5\x76\xd0" + "\x64\x0f\x73\x6e\xf9\x1d\xfa\x98\x5e\x73\x85\x19\x9d\x5b\xde\x17" + "\xcf\x42\xff\x42\xe3\x75\xa5\xb5\x09\xdb\x62\xf8\xea\x74\xd9\xbb" + "\xe1\xcb\x40\x29\x47\x1f\x03\xb2\xdf\x04\x2f\x83\x56\xfe\x70\x7e" + "\xb0\xbc\x88\x95\x73\x08\xf0\xa0\x3e\x35\xaf\x95\x30\x69\x6a\x23" + "\x98\x3e\xac\xc2\x27\x39\x1c\x3e\x9f\xec\x01\x7c\x70\xd7\x42\xc9" + "\xe9\xad\xa5\xbe\x25\x11\x0c\x14\xad\x0d\xe0\x00\xce\x05\x51\x7f" + "\xd9\x15\x66\x72\x6e\xc1\x5d\x8c\x4f\xcf\x9b\xd7\x18\x8c\x4a\xff" + "\x85\xba\xf2\xab\xcc\x80\x79\x03\x1f\x52\x2e\xbe\x0b\x98\x37\x61" + "\xce\x3c\x51\xc6\x56\xfa\x3b\x45\x7f\x6d\xc0\x3d\xfa\x6d\xa7\xf9" + "\x2a\xa6\x3e\xa4\xd1\x5c\xd5\xe2\x57\x5d\x6f\x46\xf8\x30\xc6\x5e" + "\x4f\xb8\x12\x4a\xff\xe9\xe0\x04\x3f\xad\x1d\x45\xc8\xb1\x9f\xa6" + "\x29\xa5\xf1\x0b\xa5\x5d\x7e\x4b\xf2\x21\x92\x1b\xaa\x9f\x11\xbe" + "\x5f\x4c\x24\xeb\x08\x5b\x8e\x03\xe2\x8e\xe8\x9f\x32\xb4\x3d\xe1" + "\xa7\xf1\xf0\xab\xf2\x69\xa5\x5e\xd8\x08\x47\xfa\x25\xae\x47\x12" + "\x8e\xfe\xa9\xc4\xcd\xee\x3c\x2e\xd7\x44\xab\xb8\xcb\x0a\x9a\x32" + "\x16\xcf\x46\xfb\x60\x13\x6c\xb3\xf9\xcd\xc9\xcc\xa4\xe3\x1e\xd3" + "\x06\x33\x77\xf9\x1b\x80\x43\x26\x81\xfb\xf2\x1b\xf1\xd9\x1e\x33" + "\xed\x93\xad\x94\x6e\xd0\xd2\xb1\x1f\x2b\x24\x7b\x43\xee\x5f\xbd" + "\xc3\xcc\xf3\xaf\xb2\x19\x42\x87\xa6\xa5\xef\xf0\x98\x5b\x2c\x0c" + "\xf7\xdb\xfc\xf0\x1d\x85\x32\x94\x1e\x41\xfb\xee\x09\x6a\xd7\x49" + "\xf9\xe3\xb4\xfc\xbc\x2f\xd9\xe0\xb2\x37\x88\x75\x06\xff\x82\x62" + "\xbf\x95\xe9\xe3\x56\xdb\x3d\x66\x31\x67\x5a\x5a\x76\xb2\xd8\xe7" + "\xe1\x5f\x86\xf8\x78\x2e\xfa\xd3\x25\xd2\x75\x24\x87\x0b\x1b\x93" + "\xb0\x34\x3d\x7c\xf9\xc0\x5f\x6c\x58\x5a\x04\xf5\x99\x05\xdf\xa9" + "\x6d\xec\xf9\x58\x77\xab\x77\xe0\x3c\x51\xee\xf5\xa2\xed\x1d\x9c" + "\x49\x1f\xd4\x32\x4d\xf2\x14\xa7\x3c\xe1\x3a\x00\x9c\xe1\xa0\x6d" + "\xa5\x2f\x59\x1f\xe8\x4b\x8e\x40\xfb\xa8\x0b\xfa\x5b\x1a\x23\xb5" + "\x0b\xfb\x8b\x36\xc6\x4b\xd7\x59\x39\xee\x33\x52\xbd\xa2\x3f\x76" + "\x1f\xd1\x9e\x75\xb5\xa3\xdb\xad\x2d\x6b\x73\xe6\xaf\x23\x9c\xfe" + "\xb3\x0f\x34\x25\x60\x8a\xb2\x58\x7f\x84\x3d\xff\xcf\x3f\xc6\x9c" + "\x06\x68\x9d\x07\xa2\xa2\x2c\x77\x75\x33\x5d\x3e\xad\x1d\x79\xce" + "\xf9\xe7\xa7\xc1\x73\x16\x28\x9c\xd3\xf3\x1e\xe0\xae\xb9\x17\xf6" + "\x66\x51\x33\x84\x8d\x57\xf4\xd2\x56\x97\xaf\x9b\x35\x15\x7e\xc6" + "\x9a\xfc\xae\xc2\x13\x57\x3c\x06\x69\xeb\x65\x40\xbd\x2f\xe3\x5b" + "\x01\xad\x97\x94\x40\xed\xd8\x72\x32\xc9\x5e\x04\xbb\x7f\xca\xbd" + "\xe0\xcf\x3e\x4d\xde\xba\xfe\x18\xfe\xb2\x06\x3e\x7f\x61\x07\xad" + "\x94\xcd\x84\xbe\xbc\x80\x0f\x24\xb0\xbb\x84\xad\xd1\x5f\x12\xa2" + "\xbd\x2c\x49\xad\xf7\x92\xac\x97\xf2\x5f\xa7\x5e\xe0\x6d\x53\x95" + "\xd0\xa9\xd3\x98\x66\x3a\x03\x54\x77\x20\xfa\x16\xf0\x17\x05\xc4" + "\x0b\x11\x6f\xf3\xd7\xe7\xa8\x1d\x67\x8b\xbf\x95\xc1\x6f\x78\x8d" + "\x42\x7b\xff\x25\x0b\x53\xed\xda\x0a\x2e\xb2\xbf\xec\x52\x78\x42" + "\x0c\xc9\x81\xd0\x25\x17\x80\xce\x42\x37\x9f\x1f\x60\xe3\x5d\x36" + "\x37\x83\xbf\x5b\xaa\x63\xdf\x07\xd0\xdb\x13\xad\x0a\x70\x8b\xfe" + "\xed\x7e\x37\x2b\x27\xfa\x2d\xfc\xdf\xee\xbe\xf9\x40\xf4\x2e\xb6" + "\x94\xeb\xcd\xc2\x2e\x52\x29\x5d\xdc\x46\x73\x9b\x20\xed\xe8\x4c" + "\xa6\x30\x1b\xba\x88\x8b\xec\xaf\xe3\x60\x43\xc7\x4d\x91\xb0\x0b" + "\xf2\x72\x9a\xb3\x01\xc7\x5f\x13\xdd\xec\xcf\xe2\xee\x4e\x09\x78" + "\x2c\x41\xe7\xff\x7a\xc8\x13\x35\xad\x16\x75\xc0\x0f\x9f\x92\xe3" + "\xaf\x2b\xbf\xcc\x54\xb9\xf6\xaf\x79\x2d\xbd\x03\x4e\x5e\x32\xad" + "\x16\xeb\x48\xad\xdb\x4c\x75\xaf\xe2\xa5\xd3\x6a\xdd\xec\xaf\xd5" + "\x72\x6e\xc4\x73\x06\xbe\xfb\x87\x70\xe7\xf5\x2f\x9d\xd5\x83\xe0" + "\xb1\xfe\x52\x41\x7c\xb3\xb3\xcf\x34\xad\xf6\xbb\x96\x42\xe2\x27" + "\xfe\x5a\xe7\xd6\xeb\xa4\xbe\x56\xf5\xe5\x3b\x52\xf7\x10\x9c\xc3" + "\x83\x96\x49\x2e\xaa\x84\x64\x80\xb8\x1e\xf6\xd9\xec\x41\x07\xd3" + "\x0f\xd1\xde\x3a\x48\x72\x14\x3f\x98\x6c\x2a\x9b\xce\x12\xe9\xdb" + "\xf4\x1e\xd6\x36\xce\xaf\x67\x71\xf4\x17\xe3\xb9\x39\x03\xf1\x45" + "\x92\xa0\x1f\x6e\xbe\x82\x33\xeb\x36\x41\xf7\xcb\x0f\xb0\x39\x0a" + "\xd5\x07\xbd\x74\xf9\x74\x36\x07\x3a\x69\x4a\x4b\x48\x09\xc8\x33" + "\x1b\x4d\xe6\xdc\x3d\x9d\xcd\x1b\xde\xee\x5f\x7b\x25\xcf\xf8\x99" + "\x15\xbf\xdb\x3d\xec\x96\xcc\x25\xbc\x83\xea\x45\x0c\x52\xce\x6f" + "\xb6\xe8\x25\x6f\xd9\xf6\x91\xb9\x4a\xe2\x9d\x38\xa3\x20\x7c\xc3" + "\x19\x90\xaa\xfb\xd6\x09\x1f\xc6\xd1\x93\x8f\xe2\xce\xa1\x48\xd3" + "\xc5\x00\x96\x31\xa2\x1f\xaa\xdf\xd1\xc0\xee\x3b\x36\xa0\x0e\xf4" + "\x27\x25\x55\xea\xcd\xe1\x93\xd4\xcd\xda\x84\x9e\xa7\xe4\x00\x33" + "\x3d\x75\x80\xc5\x34\x3f\x26\xc6\xe5\x93\x6b\xd1\xc0\xd0\x5f\xa5" + "\x04\xeb\x8c\x70\x82\xfa\x8d\xf6\x80\x1b\x2d\xfe\x4b\xce\x02\x1b" + "\x57\x9c\x3f\x82\xdf\x9d\xbf\x7d\xd3\x99\x75\x8c\xad\xee\xf4\x4b" + "\x3f\x7a\xeb\x99\xe7\x30\xd5\x77\x78\x3a\x8b\xe9\x62\x7f\xbb\xdf" + "\xb5\x19\xb4\xd6\x72\xab\x33\xeb\x38\xd5\xfd\xb7\xef\x61\x3f\x2a" + "\x25\xf8\xc8\x7d\xe9\x33\x93\xcb\xd7\xc6\x10\xc3\xe5\xc1\x4c\x1e" + "\x40\x3d\x94\xe7\x69\x31\xde\x83\x16\x6b\x8a\xf4\x1b\x2b\xc6\x1a" + "\x3c\x8f\x50\xc7\xe1\xba\x22\xea\x3b\xe2\xda\x40\xfc\xab\x3a\x26" + "\x0d\xd6\x12\xbf\xfe\x76\xc6\x99\x75\x84\x61\x7e\x90\x9f\xde\x5b" + "\x5d\x04\xf1\x94\x0b\xc3\xe7\x05\x79\xba\xd8\x67\xa8\xf7\xff\x84" + "\xce\xd9\x70\xfe\x13\xca\x53\x7d\x00\xb6\x80\x6d\xcb\x0f\x12\x8c" + "\xa4\xfe\xf1\x6f\x4f\xa0\xaf\x6e\xf6\xb7\xcd\x2e\xdb\x67\xa3\xdf" + "\xf5\xa5\xb5\x4f\x78\xbf\xab\x45\xe8\xde\x3e\xfb\xc1\x83\x7e\x85" + "\x4b\x7a\xf6\xf7\x18\xe2\xdd\x68\x7f\xfd\x7b\x0c\x68\x81\xa0\x27" + "\x77\xe2\x6c\xfc\xef\x93\xcd\x3a\x39\xbf\x18\x0b\x78\xa6\xd1\xe6" + "\x38\xec\xdc\x23\x06\x7d\xd5\xe6\x98\x9b\x96\xb5\x29\x38\xcf\x82" + "\xcd\xfa\x90\x85\x49\xfc\xe3\x15\x54\xaf\x4a\xe3\x4c\x6b\x54\xde" + "\x71\x4d\x5f\x54\xd4\x1c\xfe\xa4\x25\x68\x5f\x4b\xeb\xd7\x9a\x22" + "\x6d\xa2\x2d\xa0\x51\x87\xf5\x72\xed\xa0\x8f\x6a\xd9\x95\xf2\x9c" + "\xfd\xb3\x56\x2a\x3f\xaa\xfe\x85\x47\x10\xdd\x71\x10\x99\xa6\xf1" + "\x88\x3b\x78\x44\xab\x68\x3f\x18\xef\xf2\x0e\x32\x79\xf6\xff\x77" + "\xf8\x16\x18\x8f\xfb\xd7\x5a\xdf\x6e\xec\x8c\xe2\xef\xc9\xf2\x8c" + "\xe2\xef\x55\x9a\x3c\xce\x4d\x04\x63\x87\x59\xc4\xf3\x20\xbe\x4b" + "\xf1\x46\x2d\x73\x7b\xa2\x1e\x8e\x91\xeb\xe6\xef\x4e\x1e\x25\xe9" + "\x6d\x8a\x8f\x15\x62\x5c\xaa\x8e\x63\x3c\xc6\x4c\xf5\xb8\xb5\xb3" + "\x72\xad\xee\x31\x63\xe4\x68\x63\xa3\x31\x49\xbf\x1d\xcb\xda\xc4" + "\xd8\xe0\x7b\x4a\x8c\xad\xfd\x07\x28\x7f\x63\xe3\x69\x97\x31\x12" + "\x4b\x96\xb9\x9d\xd3\x51\xc7\xe9\xab\xe8\x1f\xe6\x84\xe8\xc3\xd4" + "\x1e\xd6\x5e\xc7\x27\x3d\x35\xe9\x06\xeb\x94\x77\xad\x4b\x1e\x8e" + "\x79\x8e\x68\xb0\xbc\x8b\x0b\xfb\x9f\xd3\xa7\x79\xe9\xc3\x31\x90" + "\x61\xfa\xa8\x3d\xc2\x8f\x30\x3a\x74\x7a\x03\xe6\xea\xce\x63\x2c" + "\x49\xe2\xe1\xe9\x87\x20\x3b\xcb\x18\x66\xa7\x49\xfe\xfd\x6b\xa3" + "\x3c\xd7\xd2\x6c\xb1\x75\xc2\x16\x3b\x9c\xc6\xde\x58\x1f\x4f\x0b" + "\x7a\xc7\xa3\x17\x13\xfd\x69\xf7\x0a\x1b\x27\xea\xef\x76\xbf\x46" + "\xff\xda\xbd\x1c\xba\xf3\x7c\x55\x87\x0a\x5a\x96\x2f\x7d\x60\x52" + "\x7f\x2a\x83\x3a\x54\xf8\x2a\x70\xf0\x46\xe4\xa3\xb9\xbf\x84\x3c" + "\xd2\xb7\x5e\x8f\x7a\x8f\xff\xf4\x2b\xea\x1d\xfd\x04\xd8\x7d\x51" + "\xd9\x56\xb7\x4e\x2f\xec\x84\x01\x03\xb4\x2d\xfa\xae\x87\xbe\xf4" + "\x74\x6f\x48\x67\xdd\x2e\x64\x47\xe9\x67\xe3\x1f\x06\x0d\x47\x68" + "\xbc\xe3\x65\xdc\x9a\xf6\x27\x4e\xce\x63\x02\x07\xfa\xb8\x65\xd2" + "\x57\xaa\x81\x93\xff\x98\x17\x0e\xa7\xd5\x7e\xa5\x40\xd2\xa0\xd3" + "\x71\x5c\xac\xf5\xd3\x71\x5f\xcc\x4f\xfc\x63\x97\xc6\x8b\x48\x38" + "\xc7\x10\x7d\x39\xb3\x52\xc0\xba\xf8\xda\x51\xf8\x95\x7e\x32\x1f" + "\x7e\xf2\xff\x79\x1f\xe2\x11\xf8\x8b\xaf\x35\x06\x0a\x2c\xf0\xbf" + "\xcc\x94\xe2\x6b\x6d\x5d\x99\x4c\x9f\x92\x09\x3d\xfd\xb4\x4c\xc8" + "\x78\x24\xb3\xc6\xf0\x68\xe2\x4f\x68\x9d\xe7\x6d\x62\xe6\x1f\x64" + "\x40\x5f\x91\x10\x87\x78\x01\x88\x15\x80\x58\x1f\x81\x82\x84\x58" + "\x7a\x8e\x27\x7e\x2e\x86\x1b\xaf\xd5\xe3\xac\x3f\xe0\xe0\x44\x8f" + "\xdb\x61\xcb\xac\x77\x79\x7c\x2c\xef\x02\x33\x22\x1e\x81\xbf\x74" + "\x5a\x71\x8b\xf7\xb4\x90\x6f\xa2\x33\x59\x1c\xf1\x1f\xb8\xdb\x62" + "\x51\xa2\xa6\x65\xd2\x1e\x6f\x93\xe3\xbe\xc4\xe5\xb8\x65\xbf\xd1" + "\x7f\x41\xe3\x48\x0e\xcf\x17\x7d\x77\x9f\xf5\x53\xfd\x4a\x09\x3b" + "\x15\x28\x61\xad\xd2\x57\x44\x13\xcb\xb7\xf1\x6e\x97\xb7\x89\x64" + "\xae\xab\x22\x36\x23\x6c\x09\x30\x46\x8c\x0f\x6d\x7f\x7c\xe5\x82" + "\x88\xaf\xe0\xa7\xf7\x82\xcd\x6a\x99\x5e\x2a\xd3\xdb\xc4\x06\x4b" + "\x98\x18\x7b\x8b\x57\x96\x4d\x11\xcf\x28\x1f\x06\x07\x75\xcc\x41" + "\x38\xd0\xd8\x31\x3e\x8c\xdf\x0f\x98\x10\x0c\xd4\xb1\x5a\x86\xd4" + "\x71\x62\x8c\x7f\x24\xaa\x70\x80\xc6\x49\x63\x15\xe3\x1c\xa2\x71" + "\x36\x66\x30\xe6\x2b\x5b\xe6\xb9\x16\xcd\x5a\x21\xa3\x16\x7c\x42" + "\x3c\x7c\x6e\x05\x23\x59\xd4\xf0\x5a\x7e\x85\xfe\xa7\xc4\x9b\xe4" + "\x7b\x48\x26\xf5\xf0\xee\x16\x1a\x93\x2b\x93\xfe\xfc\xd5\x0c\x3c" + "\x8e\xc6\xaf\xc3\x4e\xfc\x63\xe5\x2c\xcb\xef\xe6\xdd\xc4\x9b\xfa" + "\x60\xc7\xec\xca\xa0\xf1\x93\x0c\xdb\xa5\xf6\x1f\x79\xf3\x2e\xcb" + "\x71\x99\x37\xb3\xb8\x77\xd7\x15\xeb\x5d\x6d\xc5\x4c\x1b\xcb\x23" + "\x94\x8f\xc6\x63\xa1\xba\xa2\x30\x1e\x85\xc6\x79\x90\xfa\xe9\x0b" + "\x1b\x53\x73\xaf\x8f\xea\xfc\x33\x9b\xb4\x86\xe9\x0e\x5c\xa4\x71" + "\x5c\x64\x96\x8a\x7c\xe2\xbf\xbe\x03\x7e\xd1\x3d\x33\x32\x99\xcd" + "\x71\xb3\x7f\xce\x91\x32\x9d\xf0\x75\x3e\xa5\x87\x9d\xb9\x3f\xe8" + "\xcf\x1c\x31\x22\xa2\xa6\x95\x00\x8f\x84\x5f\x73\xec\x19\x03\x84" + "\x33\x38\xf3\xdf\x4e\x6d\x0c\x24\xc4\x8b\xfe\x38\x16\xc0\xae\xd9" + "\x44\xef\x88\x8d\x86\x7b\xd8\x3a\x2a\x57\xcc\x09\x66\xa8\x9f\xf8" + "\x39\x1b\x7e\x01\xc3\x51\xed\x77\x5f\x67\x0b\x79\x34\xf1\x98\x24" + "\x7f\xd7\xe5\x7b\xf4\x7b\x5f\x67\xf3\x6e\x8c\xa6\x9c\xb1\x8d\x45" + "\xbf\xa1\xeb\x45\x7d\x34\xb6\x58\xda\xb9\xbf\x37\x7c\x8d\x59\x05" + "\x2d\x93\x74\xb0\xc3\x0a\x5d\xea\x0d\xb6\x2b\x78\x38\xd8\x6b\xdc" + "\x58\xb9\x8e\x39\x5a\x3f\xa8\x0e\xf7\x58\x7d\xbf\x71\x38\x74\xe4" + "\x8e\x55\x57\xe9\x7e\x61\x6f\x59\x50\xb6\x9f\xe8\x05\xf1\x0a\x27" + "\x2d\x38\x97\xa1\xbd\xf3\x88\x97\x65\x1f\x62\x88\xe7\x17\xe5\xf2" + "\xaf\x62\x27\xab\x13\x59\xcd\x15\xf8\x42\x4c\x88\x7d\xf6\x0a\xcd" + "\xa5\x4a\x43\xc0\x93\x42\x27\xcd\xb3\x13\x62\xca\xf7\x6b\x3c\xfc" + "\xbf\xee\xcf\xbd\xca\xf4\xd6\x2d\xe2\x79\xf9\x72\x2b\xf7\x57\xea" + "\x95\x8c\x6a\xf8\xe9\x8f\x5e\x62\x85\x9f\x7e\xcd\xf7\xbd\xe0\x7d" + "\xec\xb4\xe6\xfa\x2c\x93\x4a\xb3\xd8\x3c\xc4\xeb\x30\x7b\x24\x2f" + "\x27\xf7\xeb\x7f\xd9\xa8\x7f\x31\xaa\x3f\xfc\x18\xe9\x0f\xff\xcc" + "\x09\xd8\xc8\xab\xdf\x5f\x0e\x90\x0c\x23\xea\xcd\x62\x73\xaa\xaf" + "\xb0\x04\xf0\x41\x29\x67\x25\xcf\x06\xb9\x70\x55\xaf\x99\x07\xfe" + "\x9d\xc0\x0e\xf5\x84\xe2\x79\x78\xb2\x11\x03\x84\x5b\xc6\xb2\xc5" + "\x2e\x8f\x17\xb6\x09\xc2\x97\x34\xce\x2c\xe8\x9d\x55\x3e\xc3\x0c" + "\x27\x61\xe7\x58\x2b\xef\x97\x9e\xf4\x4b\xdb\xe1\x01\x47\x67\x9c" + "\x16\xe7\x60\xcc\xb3\xf7\x12\x29\xef\x28\xe3\x49\xfe\xf2\x0c\x38" + "\xa5\x6f\xdd\xce\xf5\xae\x3d\x4a\x98\x8c\xd3\xb9\x18\xdf\x90\x06" + "\x7f\x85\x49\x02\x96\x9d\x7b\x20\xf7\xa8\x32\xe3\xbb\xd6\x60\x9a" + "\xe4\x61\x84\xfd\xb6\x45\x9e\x25\xd2\xde\x14\x4d\x7d\xa9\xd5\xf6" + "\x33\xec\xeb\xd2\x87\x71\xe7\x71\xb7\xde\xb0\xe0\x3a\xfd\x8b\x51" + "\xed\xcd\x71\x0e\x94\x44\xf9\x3b\xb5\xfd\x4d\x9c\x07\xef\x9e\xfe" + "\xad\xec\x1d\x6c\xc6\x77\xa7\x19\x19\xce\x12\x29\x6f\xb7\xdc\x77" + "\xcf\x9a\x42\xe7\x0d\x49\x02\xde\xf0\xbd\x21\x64\x0c\xf8\xb4\x95" + "\x31\x3b\x7a\x35\xdf\xb6\x72\xff\x3d\x7b\x7b\xa8\x9d\xb3\x2b\x83" + "\xfb\x28\xb5\x01\x7b\x76\xd4\x2f\x79\x93\xb3\xd2\xdf\x24\xe5\x93" + "\xfb\xeb\x59\x76\x1d\x5e\x2c\x01\xf0\x55\x54\x79\xd2\xd5\x7b\x4e" + "\xc2\xd7\xce\x22\x70\xa7\xe3\xdd\x7c\xb7\x21\x5a\xfa\xa0\x37\x53" + "\xfb\x87\xf0\x1d\xb8\xee\xbc\x13\xfa\xc0\xb3\xd7\xa0\x5d\xe6\x43" + "\xc9\xa6\x07\x21\xeb\x0b\x5e\xfc\x6c\xf7\x7c\x2a\x47\x69\xb1\xef" + "\x5c\xf4\x19\xca\x77\xb2\x79\xd2\x47\xf0\x59\x61\xdf\x09\x5f\x0c" + "\x5f\x89\x63\x96\xaf\x54\xb2\x84\x01\x47\x57\x8c\x5b\xaf\xcf\x14" + "\x7a\x52\xb4\x5f\xb6\x2e\x09\xf7\x52\xde\x18\x74\x8f\x93\x73\xd5" + "\xf5\x1a\xee\xa0\x84\xbd\x3f\xa0\x9e\x35\xb5\xba\x59\xd7\xb1\xc3" + "\x17\xa5\x5d\xbe\xd0\x2f\x95\x2c\x71\x86\x6c\x19\xba\x5e\x93\x7d" + "\xe9\x7a\xed\x64\xa6\xb8\xc3\x73\xaa\x46\xc4\x1e\xe8\x22\xfe\xa8" + "\xd3\xa9\xea\x63\x5a\x05\x5e\x81\xdf\x2d\x82\x0c\x76\xce\x59\x4a" + "\xf9\xb0\x4f\x10\x7f\x94\x24\x79\xf8\x25\x6d\x0a\xe1\x4f\x68\xfc" + "\x5d\xd3\xa0\x6f\x1c\x95\x26\x1e\x60\x4c\x94\x29\x5d\x12\x23\x6c" + "\x63\x4a\xd7\x55\xd1\xaf\x91\x97\x2e\x75\xd2\xaf\x89\xd2\x5b\xe9" + "\x37\x86\x7e\x1b\xe9\x97\x78\x98\x75\x85\xc0\x4b\x92\x61\x2d\x88" + "\xc1\xda\x17\xb5\xc4\x38\xd6\x7d\x3f\xc0\xc6\xb5\xe7\x61\x26\xed" + "\xff\xce\x55\x20\xfe\xe6\xea\x43\x8c\x65\xfb\xf9\xa0\xf5\x16\xc4" + "\xd0\x39\x57\x51\x70\x08\xe7\xf2\xe7\xd2\x86\x9f\xcb\x9f\xdb\x43" + "\x7f\x0d\x8c\x75\x13\x96\x77\xaf\xa0\xe7\x8a\xd0\x5f\xf7\x9e\x01" + "\xc7\xb9\x0a\x82\xa3\xe0\xb1\x6e\x8c\x26\x9e\x13\x3a\x9f\x72\xc8" + "\x45\x51\x33\xeb\xe4\x78\x1f\xf2\xd0\xbb\x91\x47\xad\x4b\x54\xc7" + "\xeb\xa6\xf7\x18\x6b\x01\xed\x6b\x51\x04\x93\xe9\x34\xe6\xa8\x75" + "\x55\x18\x2f\xfa\xdb\x17\xb5\xd4\x19\x7e\xd7\x11\x75\x62\xfc\x9e" + "\x28\x2a\x47\xb0\xe4\xb7\xfd\x76\x8d\x06\x4f\x15\x4e\xb8\xdf\xa3" + "\xef\xa3\x3a\x24\x1f\x74\x0e\x77\x57\x9d\x5a\xfe\x20\xec\xa7\x33" + "\x71\xee\x8f\xb6\x48\x26\x36\x6a\xf7\x28\x07\x1c\xdd\xb9\xef\x6d" + "\x96\x67\x23\x28\xeb\x0d\x2b\x0b\x5f\x21\xa3\x95\xa7\x36\x8d\xb2" + "\xcd\xa5\xce\x2e\x76\xee\x69\xd9\x6e\x77\xe6\x58\x6b\x29\x7f\x36" + "\xf1\x77\xd5\x6e\xdc\xe5\x02\x3f\xb4\xc8\x35\xc3\xcb\x5c\xd5\x0a" + "\xed\xf9\x4b\x3c\x49\xf9\x9c\xea\x38\xff\xf5\x16\x5f\xf7\x0d\xee" + "\x87\xdd\xc2\x9e\x97\x0f\x16\x32\x57\xee\xdd\xe2\x6c\xec\x22\xeb" + "\x49\x75\x79\x84\x2f\x05\x3c\x0b\x7b\x48\x9c\xc7\x63\x6f\x20\x19" + "\x3b\x18\x07\x46\xa1\xbc\x35\x48\xa7\x34\xdc\xe1\x3a\x1c\xf6\x8d" + "\x97\x2d\x6e\x94\x6b\xaa\x67\x1a\x78\x0b\xd1\x5f\xff\xff\x75\xa2" + "\xcf\x4a\xc9\xe2\x46\x8c\xa1\x80\xe4\x3f\xc4\xbe\xc5\x9a\xb0\xe6" + "\x40\x57\x78\xfe\x2a\xe1\x1d\x57\x4a\x17\x37\xde\xd8\x18\xce\x3b" + "\xd1\x66\x81\x9f\x5f\xf4\x44\x2d\x6e\x04\x4f\x52\x9e\x3f\xce\xb8" + "\xac\x9a\x3b\xfb\xa2\x97\x10\x2d\xec\xb1\xbc\x67\x97\x73\x73\x63" + "\xf5\xf6\x58\xb4\xb1\xd7\xa8\x63\xa7\xb6\x84\x3f\x84\xbb\xaa\x64" + "\x7c\x1c\xca\xb3\x66\x4c\x9d\x15\xcd\x33\xf8\x01\xda\x1b\xae\xa9" + "\xb0\xa8\x0d\xee\x0d\x37\xd6\x8f\xda\x2f\xd1\xc6\x90\x6c\xe3\xdf" + "\x86\xff\x5e\x1b\xff\x36\x5c\xaf\x0d\x79\x16\xff\xef\x8a\x1b\x97" + "\x1d\xff\x2d\xfc\x5a\x12\xfd\x74\x4b\x9a\x79\x41\x17\x20\xf9\xcd" + "\x6f\x7a\x08\xfb\x47\x01\xec\x6e\x11\x2b\xc8\x5f\x32\xb3\xae\xd9" + "\x3e\xc8\x9c\x39\x9f\xb2\x4e\xf6\xef\x8f\x50\xa6\xd9\x06\x99\x6d" + "\x5d\xe2\x50\xd9\xd2\xa4\x21\x7d\x8f\x1b\xf0\x3e\x44\xf3\x70\x30" + "\x0c\xcf\x5a\xbc\x9f\x32\xd7\x06\xe8\x57\x5b\xa1\xd7\x4e\xe4\x51" + "\x0f\x79\x14\xa2\x0d\xc4\xa3\x07\x04\x3c\x88\x7f\x11\xf2\x16\xc9" + "\x6c\x42\xde\xf2\x08\x5f\xe0\x51\x22\x06\x90\xe3\xf5\x5e\xe8\xbe" + "\x03\x43\xc9\xd6\x01\x07\x5b\x83\xd8\x40\xd0\x3b\x73\x53\x64\xf7" + "\x6a\x7f\x04\x17\xf2\x14\xf1\xfe\x88\x0d\xe4\xf2\xba\x59\x80\xf8" + "\xe8\xea\x7e\x16\x57\x4d\xbc\x27\xd1\xec\x18\xd0\xf5\xc3\x6a\x7c" + "\xa0\xd2\xfe\x50\x7c\xa0\x1a\xe8\x7a\xda\xe8\xb9\x9f\x19\x02\xa5" + "\xcb\xda\x0e\xf6\xb3\x39\x87\x72\x58\xc2\x41\xe8\xf2\xce\x4b\xde" + "\x47\xd8\xc9\x23\x56\xd0\xd6\x04\x9c\x25\x84\x78\x1f\xf8\xfe\x08" + "\xd1\x2d\x31\x97\x37\x06\xef\x5e\xb1\x0f\xfa\x4b\x96\xc4\xf8\x4d" + "\xeb\xaa\x08\x76\x4e\x4a\x63\x04\xbf\xdc\xd1\xe6\x56\xb3\xb7\xa9" + "\x0c\x8b\xef\xf4\xde\x1c\x49\xdf\xdd\xec\xc2\xf2\xb1\x70\x22\x70" + "\x30\x99\xdd\xd5\xcb\x12\xa5\x0d\xc0\x44\xda\x13\x2f\x1c\x85\x7d" + "\x64\xfe\x13\xcc\x12\x38\xb8\x5e\x57\xf0\x22\x8b\x70\xf9\x93\x18" + "\xfe\xf2\x2f\xf3\xee\xbb\x36\xb3\x44\x9c\x3f\xe0\xac\xc4\xfa\xa4" + "\xc8\xbf\x63\x4e\x2e\x4b\x0c\xaf\x7b\x85\x34\x22\x11\x41\x15\x76" + "\xc0\x82\x64\xfb\x26\x5b\x86\x75\xe3\xb6\xac\xac\xf4\x2d\x36\xeb" + "\xaa\x65\x6b\x46\xdc\x75\x2b\xa3\x7d\xc1\xbc\xeb\xfe\xb5\x66\xff" + "\x0a\xab\x8c\xcf\x75\x29\x11\xf6\xba\xbc\x20\xb9\x4a\xf2\x9f\x97" + "\xbe\x2e\x79\xf6\x58\xa7\xbc\x6b\x77\x29\x51\xbe\xdf\xb4\x99\xf0" + "\xf9\x96\x1e\x76\x51\xec\xf7\xca\x41\xcb\x11\xc2\x4d\x5d\x17\xbb" + "\x78\x06\x36\x0e\x12\x4f\x2f\xbe\x07\xbf\x11\xd2\x16\xe2\xc2\x71" + "\x69\x0b\x71\x31\xe8\xff\x45\xda\x7e\x2d\x71\xc3\xee\x01\xe7\xdb" + "\x72\xed\x5d\x2c\xd4\xd6\x1e\xe5\x2d\x21\xfe\x29\xe6\xc6\x69\xce" + "\xc5\x12\xa9\x33\xbb\xd8\x44\xf0\x4f\x56\x6d\x1e\x67\x75\x50\xdf" + "\xd1\x17\xfa\xbe\x06\xfd\x09\xdd\x19\xba\x34\x6d\xb8\xbf\x1c\x75" + "\x8c\x07\x2d\x3f\x97\xfa\xf0\x4b\x5f\xc7\x78\xa8\x5c\x52\x58\xfa" + "\x0c\x1a\x7b\x92\x9a\xee\x41\xf9\x51\xe7\xe1\x81\x2d\x1b\xb7\x3e" + "\x91\x99\x6a\xdb\xf4\xe8\xa6\xcd\x9b\x6c\x3b\x84\x3b\x88\x79\xe2" + "\xbf\xff\x98\x9b\xb6\x76\x64\x6c\x83\x04\xe8\x45\x54\x9f\xe8\x5e" + "\xd8\x34\x48\xdd\xd4\xa5\x0f\xfc\x0e\xb6\xf4\xc6\x60\x70\x49\xd0" + "\x99\x6a\xe1\x23\xe6\xd2\x29\xb7\x3e\x62\xb9\x7a\x46\xd1\x2b\xed" + "\x3f\xe5\xf7\x3e\xd3\xba\x42\xeb\x74\xb6\xa8\x83\xf5\x15\xe3\x6c" + "\x8a\xe6\xa4\x15\x7b\x58\xe9\x4e\xec\x35\xad\xac\xd9\x4f\xfb\x99" + "\x38\xaf\xf6\xbc\x85\x98\x67\xe0\xe3\x08\x46\x47\x3a\x98\x47\xcc" + "\x3b\xbf\x64\x39\x22\xfc\xbe\x5c\xb2\xfc\x1c\x78\x83\x3e\x2b\x3c" + "\xf9\x20\xe7\xc9\x07\x94\x4b\x19\x07\xf9\xa5\x8c\x03\x21\xbf\xaa" + "\x9e\xe3\x54\xf6\x58\x87\x5a\x57\xd9\x45\x76\x0c\xb4\x0a\xef\x66" + "\x5b\x0c\xc9\x67\x4b\x1a\xd1\x1f\x97\x27\x91\x49\x5f\x10\x9e\xe3" + "\x2e\xef\xdd\x8c\xf8\xbf\x56\x71\xdf\x53\x9c\xb1\x11\x8f\x46\xe5" + "\x5c\xd4\x2f\x97\x67\x10\xfc\x40\xa3\x42\x7c\x1a\x8d\xb7\x93\x68" + "\x96\x88\xcb\x86\x31\x1f\x22\x3e\x1d\x76\x17\x03\x0e\x0f\xf1\xa1" + "\x17\xda\xc2\x6d\x6f\x00\x83\x52\xfa\x0e\xdb\x0b\x39\xff\x9e\xab" + "\x98\x3f\x82\xf1\xff\x09\xe1\xc0\xe5\x89\x18\xdf\xca\x4e\xfe\x4f" + "\x5e\x7c\xcd\x27\xe7\xfb\xf2\x4c\x35\xed\x52\xc8\x17\xc5\xe5\xaf" + "\xd3\xfb\x10\xfd\x29\xbc\x78\xc8\x12\x76\x3e\x8c\x6f\x42\xee\x86" + "\x1d\x49\xe6\x4e\xac\x95\xcb\xe9\xf2\xbc\x78\x68\xaa\xa7\x20\x23" + "\x82\xca\x04\x70\x5f\x55\xc2\xf7\xf2\x5e\xd7\x9e\x8b\x9a\xbd\x05" + "\xf5\xe9\xca\x5c\xe7\x63\x7e\xd8\xa0\xc5\xb9\x3a\xfd\xc2\xbe\x51" + "\xf5\x3f\xa2\x53\x1c\x97\x16\xc1\x2e\x9e\x64\x34\xd3\xa1\x58\x19" + "\x57\x64\xc0\x71\x39\xe4\xff\xd9\x24\xf9\x36\xac\x2d\xc4\x8d\x14" + "\xb6\x23\xc4\x1f\xa1\x4f\x58\x5b\xd4\x56\x27\xce\x9a\xe5\x1a\xbb" + "\xec\xf9\xef\xad\xb1\xcb\x1e\x8c\x85\xea\xda\xc3\xf5\x05\xfc\xae" + "\x12\xb6\x41\xd8\x02\xf8\xbd\xb8\x67\x6c\x20\xfa\xdf\x2e\xe9\x47" + "\x5f\xaa\xb0\x17\xc9\xe9\xad\xc5\x5d\xde\xc3\x83\xcc\xa4\x94\x44" + "\xba\xc1\x2f\x37\xe7\x0a\x1b\x0a\x23\x95\xab\x83\x8d\x05\x6c\x06" + "\xa3\x45\x5c\xd2\x4f\xd9\xe1\xab\xcc\xd0\xc9\xae\x64\xe2\x4c\x27" + "\x04\xeb\x2b\x1f\xe0\x0c\x8f\xff\xd4\x57\x61\xce\xd5\x17\xa3\x0e" + "\xa5\xff\xc2\x42\xad\x1c\xf1\x88\x13\x50\xae\x83\x5d\x79\x45\x94" + "\x43\x5e\xe1\xa7\x26\x66\x3d\xed\x9d\x31\xc8\xef\xa7\xf7\x1a\x25" + "\x66\x0d\x27\xba\x1e\xc8\xf1\xd7\xd1\xb7\xb5\x4a\xc9\x52\x27\xa5" + "\x25\x8b\xb3\x84\x21\x0b\xce\x18\x09\xe7\xa6\xd5\xba\xdc\xe7\x9c" + "\xa2\x3f\xb8\x7b\x6c\xa3\x3d\x50\xc8\x17\x57\x02\x35\xe7\x99\x21" + "\xf3\x31\xcc\x67\x9f\xe4\xb1\x2f\xb2\xa3\xb2\x7f\x7d\x4f\xf7\x95" + "\xb1\xd6\x3e\xc2\x57\xaf\xde\xc8\x4e\x5a\x60\x33\xbf\xae\xf0\xa4" + "\x65\x90\xe6\xa7\x2f\xd9\xad\xf7\xa9\xbc\x6d\x5f\x70\x6d\x02\x47" + "\x23\x2c\x31\x05\xf4\xdd\xae\xd9\x28\x01\x2f\x4b\x44\xfc\x80\x2b" + "\x6b\x00\x37\x37\xf3\x18\x9b\x37\x87\xfc\x77\xf7\xc9\x7b\x7a\x31" + "\x54\x26\xe8\xff\x3e\xd0\xaf\x34\x51\x3f\xe0\xe7\xc8\x1e\xc8\x51" + "\xda\x71\x06\xfe\xe0\x55\x85\xe3\x0e\x03\xee\xa3\x40\x7e\x59\x6d" + "\xe7\x7d\x90\xc7\x70\xf7\x0b\xe7\xdf\xb8\x7f\x1f\x5a\x27\x7d\x3e" + "\xed\x1e\xbe\xb6\x36\x70\xbf\xab\xec\x47\x62\x9d\xc2\xa6\xd5\x24" + "\xce\x00\x22\x1e\x3f\xff\xa0\x97\xea\xbc\x28\xce\xae\xfa\x6a\xd4" + "\x7a\xe0\x8f\x6d\xc0\xe1\x5d\xa4\xd5\xa1\xc0\x1e\x38\x4b\xd8\xe3" + "\xb9\x65\x79\x69\xef\xf3\xa0\x57\x11\xf7\x72\x50\x5e\xda\xe1\x78" + "\x83\xfe\xdf\xe4\x5d\x19\x6f\xa1\x66\x33\x46\xcf\x25\xc1\xbb\x7e" + "\x04\xd3\xbe\x92\x25\x8d\x5e\xa2\x0f\xde\x92\x25\x46\xfa\x76\x94" + "\xd6\xf5\xe7\x7c\x7d\x0c\xd3\x49\x20\xbe\xe1\x36\xa6\x57\xa2\x4d" + "\x26\xf8\x5f\xc1\x1d\x56\x69\xc7\x7e\x75\xa2\xea\x8b\x25\xe2\x22" + "\xf3\x7e\x10\x3a\x0b\x0f\xa8\x7a\xdc\xab\x89\x52\x8e\xb8\x9a\x28" + "\xf4\xb8\x65\x4b\xea\x7e\xb6\xd3\xa7\xaf\xdb\xe9\xd6\x4b\xfb\xba" + "\xab\x73\x88\x93\x09\x8b\x81\xe1\xed\x44\x5d\xa3\xf3\x7d\xb1\x71" + "\xb2\xce\x7e\x11\x2b\x2e\x24\x97\xf7\x0b\x9e\x0e\xe7\xd6\x0a\x78" + "\xb8\xe8\x99\x4e\xd8\x29\xb9\x32\xaf\x40\x9f\x3b\x5e\xea\x08\x64" + "\x1e\xd5\x6e\xf3\xa6\x9e\xe1\xef\xb1\x78\x97\x30\xbb\x7a\x5c\x3b" + "\x1b\x2a\xd3\x2b\x88\x71\xc9\x0b\x6a\x89\x5e\x66\x7a\x85\x6f\x07" + "\x17\xf1\x84\xd4\x06\xcf\xcc\xc2\xdd\xc8\xab\xe7\x11\x37\x4b\xae" + "\xcd\x7e\x71\x7e\xa3\x38\x96\xf2\x02\xc8\x45\x9e\x5e\xe1\xff\x8d" + "\xf2\x4d\xa6\xba\xa7\x34\xe4\xf6\x12\xfe\x46\x9e\x42\xac\xe4\x4e" + "\xb5\x6d\x4f\x54\x6c\xdc\x57\x4c\x6c\xc3\x80\xa3\x3f\xc1\xcd\x3e" + "\xac\xbd\x71\xba\xd1\x9f\x70\x3d\x1e\x59\xf2\x6c\x49\x6c\x2c\x39" + "\x1b\x7a\x94\x3b\xa9\xfd\x55\x1c\xfd\x1f\x98\xe2\xa7\x35\x35\xa4" + "\x9f\xc0\xbf\x56\x68\x67\x7e\xc7\x04\x1e\xd8\x49\xf3\xd5\x67\x21" + "\x39\xac\x89\xb5\x48\xdb\x17\x9c\xdf\x9b\xf3\xbd\xfc\x8a\xcb\x7f" + "\x1c\x7a\x7c\x8f\xe4\x53\x06\xa2\x5c\xfe\xb7\x19\xec\xb5\x41\x6f" + "\x3a\x58\xff\x35\xf4\xeb\xce\xcc\x42\x36\xff\x22\xbe\xf7\xd7\x4b" + "\xfe\x6d\x20\x4e\xfe\xf6\x77\xc2\xf7\x74\x78\x9f\xfe\x63\xdb\x96" + "\x8d\x70\x60\x3e\x7f\x65\x7a\x4e\xfa\x66\xeb\x77\xe0\xde\x7c\xa4" + "\x1d\x68\x28\x96\xe6\x80\x1b\xfb\x2b\x78\x68\xc4\xd4\xbc\x5e\x3c" + "\x4d\x2d\x96\x26\xad\xb9\x39\xd0\x3b\xff\x6f\xc6\xd3\xd4\x78\x64" + "\xc4\xd2\x0c\x9d\xc1\xf8\x6a\x83\x6b\x40\x79\x77\x00\xef\x62\x4f" + "\x77\x0c\x58\xb1\x8e\xe4\xfe\xe2\xb3\x84\xfb\xc1\x12\xfe\x5c\x4a" + "\xa7\xd5\x52\x7a\xa2\x76\x87\x95\x70\xd1\x44\xef\x49\xa1\x3b\x33" + "\xbe\x95\x04\x37\xe9\xe7\xd4\x24\xf2\xae\xd7\x6c\x15\x84\x1f\x52" + "\xd5\xb6\x42\x29\x5a\x78\x4a\xea\x07\x7d\xa9\x35\xca\x04\xa3\x3c" + "\x9b\xf2\x15\x6b\x77\xb2\xe4\xda\x7c\x57\x5d\x9b\xbe\xda\xeb\xd9" + "\x93\x84\xd6\x86\xaf\x3d\xb4\xae\xff\xa9\x95\x6d\xff\x22\x5b\x14" + "\x55\x4e\x9b\xd2\xc3\x06\x2f\x43\x67\x28\xef\x60\x0f\x8a\x3b\x74" + "\xd2\xbf\xc6\xe0\x9b\xea\x33\xb5\x31\x78\x48\x7d\xbe\x99\x9e\xf7" + "\xaa\xcf\xc4\x2f\x0e\x3e\xa1\x3e\xd3\x9a\x1d\x7c\x48\x7d\x8e\xa3" + "\xe7\xc5\xea\x33\xed\x1d\x83\x73\xd5\xe7\x78\x7a\x8e\x52\x9f\xa7" + "\xf5\xb0\x6b\x57\xd5\x67\x5a\x83\xd7\x4e\xab\xe7\xfa\xc6\x2e\x76" + "\xed\xa3\x1b\x97\x1b\xaf\x55\x4a\x3e\xf8\xda\x29\xe2\x8f\x32\xe4" + "\xde\x13\x4c\xeb\x26\xdc\x5e\xa8\xc1\x97\xd2\x4b\xd0\xce\x80\x63" + "\x90\xf8\xd9\x4e\x6b\x58\xba\xea\xdb\x7a\xd0\x42\x74\xee\x78\x58" + "\x7a\xa6\x9a\x9e\x48\xf2\xe9\xf2\xb0\xf4\x34\x35\x7d\x05\xd1\xcf" + "\x45\x61\xe9\xea\x39\xf6\xe0\x06\x37\xfb\xc7\xda\xb0\xf4\x95\x6a" + "\xba\x5d\xb3\xa3\x51\xd3\x93\xd4\xf4\x0a\x37\xfb\x8b\x21\x2c\x7d" + "\x81\x9a\x4e\xf4\xdf\x77\x2c\x2c\x5d\xd0\x15\xe9\xef\xdf\xcc\x4f" + "\xe6\x62\x6d\x0d\x12\xff\xff\x77\x6f\x58\x9e\x19\x6a\xd9\x4e\x4a" + "\x9f\x11\x96\x1e\xa3\xa6\xfb\xdd\xba\x3b\xc2\xeb\x1c\x53\x9e\xd7" + "\x55\xb1\x0d\x63\xe9\xd6\x11\x03\x43\xd8\x26\x0b\x3e\xdb\xff\x4d" + "\xdc\xf1\x32\x1f\xe2\x1d\xd6\x7c\xce\x3b\x98\xdf\x2a\xed\x67\x23" + "\xc1\xd3\xf6\xca\xfb\x72\x7e\xa3\xea\x2b\xc1\x23\xee\xd0\xed\x44" + "\xda\x90\x88\xeb\x74\x97\xbd\x50\xfa\xa2\xd7\xe2\x1a\x41\xc7\xa4" + "\x9e\xbf\x53\x9e\x37\xa1\x73\x47\x3d\xd0\x43\xbb\x6c\x83\x32\x4e" + "\x01\xc9\xa2\x48\x83\xae\x05\xf0\x08\xd7\x29\x49\xba\xef\xff\xa6" + "\x32\x88\x7b\xaa\x52\x1f\x85\xb5\x88\xfc\xb0\x19\x0b\xcf\xeb\x66" + "\xfe\x85\xf8\x8d\xb0\x4c\xfe\xcb\x80\xc3\x6f\x09\xdd\x0f\x1a\xca" + "\x54\xd3\xff\x4c\xe9\x89\x61\xe9\xeb\xc7\xa4\xed\x44\x07\xb9\xd1" + "\xd7\x36\xd4\xcf\xbd\xfe\x7e\xee\x2b\xfb\x07\xf5\xfb\x31\x61\xa7" + "\x77\x4b\xa0\xd8\xd7\x8d\xfb\x33\x88\x43\xec\xcf\xe1\x1e\xd8\x25" + "\x52\x7a\xe4\x83\x5e\x0f\xf1\x18\x03\xbc\xf4\x51\xd8\xa0\x5e\x65" + "\x38\x1f\x2d\xe8\x45\x4c\x4b\x33\xc7\xbd\xec\xbc\x0b\xcc\x84\xfb" + "\x35\x35\x8f\xe1\xfb\x69\xb6\x2a\xc3\xc3\x9a\x33\x02\xac\x86\xea" + "\x3e\xf4\xa8\xc6\x5f\xf8\x5b\x83\x77\x7f\xa9\x0f\x68\xaf\x40\xc4" + "\x5d\x0f\x48\xbb\x9a\x5d\x38\xd7\x5f\x77\x94\xbf\x0f\xde\x78\x71" + "\xab\x79\x17\xb3\xd2\xde\x6e\xa2\x67\xa7\xfc\xa3\x6f\x94\x3e\xd6" + "\x98\xe4\x5a\x0e\xac\x90\x67\x89\xd7\x92\x25\xbd\x08\xac\xe0\x2f" + "\x41\x2e\x0c\xe0\x3c\xf8\x28\xf1\xe1\x47\x47\x2b\x9f\x77\x88\xe9" + "\x87\xca\x88\x37\xb9\x58\xaf\x97\xf4\x49\x59\xa8\xe8\x8d\xbb\xa0" + "\xef\x16\x31\x97\xcb\x4c\x33\x8e\x6d\xf1\xe9\x9b\x77\x76\xb2\x27" + "\xa7\x31\xcb\x7a\x9f\x9e\xf2\x04\xde\x8a\xb6\xc1\x5f\xfe\x92\x3a" + "\xe2\x67\xf5\xbf\xa6\xef\xef\x6c\xa9\xd7\xfb\x05\xbf\xa2\x2c\x14" + "\x3a\xd2\x92\x48\x0f\xf6\x10\x57\x5b\x00\xbc\xb8\x89\x78\x71\x37" + "\xd1\x7f\x63\x60\x7b\x46\xac\x3f\x3b\x23\xf2\x50\x16\x33\x05\xb2" + "\x13\xe2\x9e\xed\x67\x0b\xb5\xfd\xe7\x50\x0e\xed\x29\x03\x96\x49" + "\xe5\xb4\xa7\x40\xf7\x12\xad\x8b\x11\x67\xc1\x78\x56\xf4\x67\x36" + "\xd4\xe4\x5c\x3f\x7e\x7c\x60\x7b\x82\xf0\x1f\x81\xbe\x8c\x36\xd6" + "\x92\x03\xcc\x10\x50\xef\x99\xe6\x9f\x65\xf1\xc4\x3f\xeb\xa3\xaf" + "\x72\x67\xcf\x66\xa6\x47\xcc\xed\xfc\x74\xa1\xdf\x1c\xd7\x9c\xe1" + "\x67\x2e\xfb\x67\x2c\x3f\x0b\x73\xa4\x94\x82\x4f\x83\x4d\x31\xe5" + "\x8f\xe9\x61\xca\x21\xb3\x8f\xf6\x0c\x1f\xf1\xe4\x3f\x82\x5c\xac" + "\xfc\x52\xfa\xab\x50\xbc\xb8\x17\xea\xcc\xfa\x16\xd2\x9a\x0b\xce" + "\x0a\x5b\xfa\x53\x72\x6d\x29\x47\xf1\x5e\x80\x7b\xaf\xd1\x93\x13" + "\x5e\x1f\xf4\x8d\x93\xba\x09\xe5\x15\x75\x7f\xa8\x95\xb2\x9d\x72" + "\x74\x2c\xdc\x55\x8a\xfd\xf0\x4d\x33\xcb\x55\x0d\xfe\x95\xbb\xc5" + "\x39\x3b\x7c\x00\xd8\x49\xce\xea\xaf\x50\x7d\x13\xf1\x27\x94\x7d" + "\x7e\x9f\xf4\x4f\xca\x35\x1b\x39\x03\xdf\x17\x30\x8a\x33\x86\x7d" + "\x01\x8b\xd0\xb9\xef\x0b\x24\xec\x9e\x8e\xfb\x01\x7c\x73\xdf\xc4" + "\xc0\x42\xfa\x4d\xea\x8b\x8e\xcf\x18\x73\x3f\x2a\x1e\x4c\xb0\xde" + "\xc2\xe2\x70\xd6\x93\x12\x90\x7e\x7e\xc5\x1a\xd6\xb1\x4c\xbe\x4f" + "\x7c\x9b\xd5\x91\xc9\x22\xa4\x2f\x6d\xfe\xf6\x5d\xd5\x0c\x71\x2a" + "\xa2\xb8\xd1\xdf\x26\x6c\x0f\x8b\xfd\xdd\xae\x5e\xc4\x40\x0b\x30" + "\x71\x66\xa4\x63\xb9\x7c\xa2\xbf\x4d\xe4\xd7\xb1\xa8\x96\x5e\x1a" + "\x83\xd1\x7f\xd4\xe5\xbb\xc0\xd4\x7a\xa9\x8f\xfe\xa3\xbc\xd8\x5f" + "\x2f\xee\x8f\xeb\xd8\x0f\x34\xba\x2a\x70\x54\xc7\xbe\x2d\x71\x7d" + "\x30\x41\xc0\x8d\xea\x53\xf7\xab\x59\x78\xa6\xbd\x3b\x51\xd8\x90" + "\x14\xb1\x15\x1a\x8f\xec\x56\xf3\xa0\x0c\x3d\x8b\xbb\x0e\xf4\x3d" + "\x83\xc6\xce\xd4\xef\x26\xa4\xd1\xf8\x68\xcf\xe2\x47\x30\xae\xb1" + "\x68\xab\x80\x45\x2e\x8b\xa0\x3e\x37\xc2\xde\x1a\x7c\x8a\xcb\xbb" + "\xd4\xe9\xc2\x1c\xe8\xf4\x88\xdd\xd3\x8b\x76\xe0\x3f\x08\x74\x93" + "\xea\x34\xa0\xbe\xb0\xfe\x9f\xd7\xfa\x82\xf6\xf0\x8d\xc6\x7a\x54" + "\xc8\xd5\x34\x66\xe4\xc1\xbc\x76\x65\x42\xf7\x76\x95\x60\xe6\x45" + "\xbd\x71\x80\x89\x84\x99\xce\xa3\xca\xf4\xea\x3c\xe8\xce\x0e\x87" + "\x87\x7c\x57\x8c\x44\x1b\xb2\xd8\xd4\x1e\x9d\x3e\x4e\x85\x9f\x8c" + "\xdf\xa3\xd3\x09\x3f\x0d\xf2\x9b\x6e\x47\x58\xd9\x99\xc1\xbc\xd4" + "\x6f\xf0\x46\xb0\x0d\xc0\x59\x91\xc0\x57\x9d\xee\x48\x58\xb9\x23" + "\x29\x97\x89\x47\x26\x1e\x72\xf7\x7e\x11\x0f\x35\x71\xa0\x48\x57" + "\x1f\x82\xb7\xac\x67\x94\x36\x6e\xd1\xda\x70\xeb\x74\x76\xad\x9f" + "\xf4\x2c\xf7\xe0\x22\x9d\x3f\x34\x27\xba\x19\x5a\x39\xe8\x74\x68" + "\x8e\x1a\x11\xa3\x78\x8c\x98\x2b\x3a\x17\xe5\x6e\xf1\x2f\x75\x0a" + "\x7c\xd4\xe9\x6d\xb0\x15\x27\xb8\x36\x4a\x1c\xd2\x27\x8b\xbd\x90" + "\xd2\x51\x27\xce\xfb\x84\x2f\xdb\x22\xfd\x66\xaa\xb7\x58\xed\x73" + "\xa1\xec\x83\x9e\xe4\x3f\xfe\x39\xbf\xb5\xdf\x4a\x4d\xb3\xae\xf9" + "\xba\xb8\x43\x3b\x7f\x5b\x26\xae\xc7\xa6\x85\x5e\x86\xf3\xdc\x31" + "\x41\x9f\x65\x45\xfa\xa6\xa0\xcf\xb2\x92\x58\xa9\x43\xa0\x5d\x8b" + "\xf7\xf3\x4a\xdc\xdf\xe0\x39\xbc\xaa\x0c\xbe\x11\xaf\xb2\xa9\x88" + "\xbd\x9e\x9f\xc9\xcf\xb5\x64\x92\xcc\x6e\x32\x2d\xe2\x25\xa6\xa4" + "\xfc\xab\x6c\x02\x6c\x83\x40\x7f\x60\x7b\xcc\xa3\x28\xbd\xd4\x94" + "\x14\xbc\x57\xa7\x9b\x10\x83\xbb\xa0\xbc\x20\x99\x78\x69\xd3\x5a" + "\xe0\x03\xec\xc4\xbb\x74\xe3\x3d\x94\x6f\x2d\x7d\xb3\x95\x0a\x5d" + "\x82\xa9\x2a\x60\x8a\x8d\x29\xb8\xc0\xc6\x8b\xf8\x99\x76\x1f\x74" + "\x6a\xfa\x0e\x5d\xc4\x0e\xaa\xb3\x8a\xd2\xa3\x45\xba\xcf\x07\xdf" + "\x09\x55\xf4\x2d\x9a\xbe\xbd\x49\xbf\x0a\xd5\x61\x2f\xa3\x7e\xe7" + "\x5f\x60\xb7\x50\x5f\xba\xa9\x9d\x2a\xea\x67\x57\xc1\x13\x2c\xbe" + "\x25\xb3\x1b\xf2\x1d\xd5\xe7\x66\xaa\x7f\x91\xaa\x0e\x9d\x61\x22" + "\x8d\xcb\x0e\x9d\x08\xfd\xe6\x96\xd2\x6f\x7e\x80\x45\xe7\xe7\xd1" + "\xbe\x97\x47\xed\xe3\x9e\x2a\xd5\x03\x9f\x22\xb2\x2f\x34\x36\xe8" + "\xd5\xa8\xde\xbc\x5e\xde\x45\x75\x77\x37\xf7\x52\x7d\xf6\xb6\x60" + "\x9d\x2a\x4f\x4d\xeb\x7b\xfc\x79\x5e\x16\x5f\x48\x7d\xaa\x82\xfd" + "\x34\xa5\xc5\x50\x5a\x67\x90\x1f\xd6\x8d\x3f\xab\x3e\x4f\x0c\xe6" + "\x2d\x48\x66\xf9\xd7\x98\x45\xd8\x00\x6c\x8f\x60\x1d\xba\xf1\x36" + "\xf8\xb5\x0a\xd5\x69\xb8\x8c\xfa\x4a\xa8\xbe\x82\x74\x36\x91\x68" + "\xb5\x91\xfa\x88\x38\xe4\x67\x04\x9c\xc4\x1a\x33\x78\x68\x2c\xb8" + "\x7b\x85\xfb\x84\x95\xa5\xb4\x1e\x68\x3c\x3a\x1a\xcf\xc4\xbc\x40" + "\xf0\xee\x2d\xc6\x34\x19\xf2\x1c\xc6\xa5\xce\xe3\x71\x1a\xd7\x89" + "\xbc\x0c\x7e\x86\xc6\xd6\xdd\x9c\xd1\xc6\x68\xef\x31\xb7\x64\xb6" + "\xe2\x1e\xc3\x19\x09\xb7\x6e\xcc\xeb\x71\x1a\xe7\x89\xa0\x1f\x68" + "\xdd\xf8\x27\xa8\xef\xc5\xd4\xaf\x12\x75\x9c\x48\xcb\x08\xf2\xf4" + "\xba\xf1\x9b\xd4\xe7\x49\xc1\xbc\x9f\x1b\xe7\xb8\xf6\xb0\x71\x52" + "\xf9\x09\x93\x51\x9f\x3a\xce\x49\x34\xce\x89\x9f\x1f\x27\xe1\x53" + "\x0e\xdf\xa3\x8e\xb3\x58\x1d\xa7\x9e\xc6\x39\x89\xc6\x39\x3d\x6c" + "\x9c\xb1\x23\xc6\x59\x4f\xe3\x74\xd2\x38\x3b\xc2\xc6\x19\x33\xca" + "\x38\xeb\xdd\x68\xa3\xd4\xe4\x14\x7b\xcb\x78\x7d\x89\xb8\xcf\x5e" + "\x34\x2e\x78\xff\x53\xc1\x3d\xca\x7e\xe1\x53\xe8\x38\xf4\x37\xd0" + "\x1b\x41\xd6\xc3\x9d\xcd\x94\x1d\xc5\x85\x42\x77\x13\x2f\x75\xd3" + "\x82\xbf\x2a\x1a\x9f\x18\xbc\x3f\xb1\x5f\xc4\x45\xf2\x22\x5d\xf8" + "\x00\xc8\x62\x42\xf7\xb8\x7a\xc7\xf6\x02\x94\x47\x59\xca\xbf\x21" + "\x78\xcf\x4b\x37\x4e\x9c\x8d\x00\x7e\x78\x86\x6f\x2b\xd1\xaf\x22" + "\x7d\xb5\x38\x2b\x28\x1a\x5f\x12\xd4\x69\xe6\xf0\x06\xc0\x45\xdc" + "\x4f\x15\xf7\x3b\x59\x71\x8a\xbf\x58\xbb\x67\xde\x4b\x79\xeb\xc3" + "\xee\x99\xf7\x8a\x3e\x0c\x0a\x5f\x0e\xdb\x57\xfb\xb7\x8b\xfb\xe6" + "\x94\xa7\x3d\xd4\xb6\x61\xbd\xda\x76\x21\x9e\x3d\xd2\xd7\x1a\x74" + "\x6c\x56\x61\xf3\x52\x34\xc1\xa8\xd9\x99\xb8\x75\x11\xcb\xb1\x96" + "\x47\x8d\x21\x54\x34\x21\x71\x98\x6f\x27\x9d\x51\xc4\x30\xa1\xf4" + "\x15\xc1\xbb\xe3\x45\x13\xd6\x7e\xd1\xdd\xf1\x02\x0f\xcd\x13\xad" + "\x37\xa2\xd9\x3a\xc2\x15\x92\x71\x63\x63\x44\x1c\x1e\xdd\x04\x11" + "\x5f\xae\x43\x37\x01\xfa\x5b\xb3\xf0\xfb\xa0\x9b\xf0\x4b\x95\x36" + "\xaf\x58\x1d\xf0\x9b\xdd\xd4\xa6\xf0\x15\x15\x7c\x9f\x70\x14\xbe" + "\x2f\x28\xdf\x19\xe1\x43\x9f\xea\x1b\x9e\x5f\x7c\x2f\x1c\xf1\x9e" + "\x34\xe2\xdd\xea\x25\x9a\x35\x96\x3d\x4d\xe9\x74\xa1\xe3\xf5\x44" + "\xef\x62\x99\x05\xe7\x59\x04\xe1\xe2\x59\xf4\xad\xa5\x5b\xdc\xb5" + "\x33\x73\x47\x22\x73\x75\xfb\x25\xdf\x4e\xfc\x52\xc7\x1c\xca\x73" + "\x9e\xc5\xe3\xae\x07\xe2\x14\x51\xfe\x1e\x11\x9b\x48\x37\x71\xdf" + "\xfa\x6d\x93\x98\xf2\xc3\xe4\x48\xae\x7f\xd2\x8a\xf3\xfc\xd7\x06" + "\xdd\x88\xef\xa3\xcb\x7f\x81\xcd\x00\x9d\x22\x1c\xee\xe4\xfa\x5c" + "\x2b\x95\xe9\xfd\xd9\x60\xf7\x38\x97\xff\x33\x96\x49\xf4\xb3\x47" + "\x37\x31\xd7\x90\xcb\x0c\xe5\x5d\x2c\x86\xf0\xcc\x7f\x92\xc4\x15" + "\xcd\x77\x43\x75\xac\xf4\x09\x50\x4d\x38\x99\x6d\xe1\xbe\x81\x22" + "\xdc\xed\xfa\x57\xab\xa6\xbf\x28\x91\xbe\xdb\x0c\xd4\xfe\xfd\xc2" + "\xcf\x84\xe4\x0f\x08\xb6\x13\xa7\xc8\x7b\xa3\x71\x3f\x1c\x28\x9a" + "\x68\x0a\xca\x36\xba\x89\x55\xea\x39\xd8\x02\xb9\x8f\x4c\xac\x3a" + "\x49\x92\xee\x1e\x69\x97\x14\x47\x79\x17\x06\xed\x92\xa0\x13\xa4" + "\xef\x34\x87\x0b\x84\xdc\x63\x8a\x5d\x90\x12\x30\xaa\x6b\x9c\xd2" + "\x69\xdf\x46\x59\x2a\x67\x16\x31\x54\x8b\x26\xda\x42\xb8\x36\x71" + "\x11\xf6\x53\x1a\x93\x89\xe6\xb5\x0e\xe3\x02\x4c\xbc\xf0\xd3\xa6" + "\x33\x1e\x3f\x79\x64\x8c\x18\x5b\xc6\x6b\xc9\x7e\xa1\x5f\x5a\x72" + "\x94\xf0\xe9\x02\xcd\xc1\x4d\xf0\x55\xe5\xa2\x76\x9a\x6b\x06\x59" + "\xb3\xa5\x8f\xb5\xd0\x33\xee\x1f\x38\x7f\xf4\x2f\x92\xf0\x47\xdf" + "\xcb\x89\x1f\x68\xa3\x3e\x77\xa3\x2e\xd0\x1a\xd8\x6c\xc2\xa7\x60" + "\x0b\x71\x3d\x2e\xa2\xf4\xa8\xa3\x59\xe9\x66\xcd\x76\xc8\xb0\xeb" + "\x8e\xb6\xd4\x7c\xc6\x5a\x2c\x7f\x12\xed\x80\xdf\x76\x66\xf5\x5d" + "\xaf\x6e\x1f\xc9\x48\x46\xb5\xee\x5e\xaa\x3b\x6e\xec\xba\x17\xb7" + "\xde\x60\xdd\x37\xd0\xef\xc5\xce\x1b\xa9\xbb\xa0\x8a\x07\x88\x0e" + "\x47\x91\x4c\xe1\x86\xbf\x55\xdc\x33\x0d\xf4\xc3\xc7\xcc\x2c\x21" + "\xab\x77\xe9\x22\x7f\x0c\x7a\x23\x6c\x34\x4a\x23\xdb\xc5\x1d\x54" + "\xe8\xd9\xd5\xbb\xa7\x2e\xff\x59\x06\xbd\xfb\x40\x51\xe4\xfa\x90" + "\x1f\xaa\xe0\xf9\x74\x8c\x5b\x17\x29\xce\x3c\xa9\xfe\x76\x89\x5b" + "\x91\xdf\x40\x5d\xa3\xeb\x48\xa3\x2c\xc2\x6e\x5e\x17\xf9\x96\xa6" + "\xdf\xea\x8b\x8a\xb2\xa8\x75\x59\x47\xea\x4d\x55\xc7\x40\xd6\x74" + "\xbb\xcd\x2a\xfd\x57\xab\x17\xae\x27\xb1\xef\xa4\x6f\x4c\xdf\x94" + "\x93\x9e\x66\x5d\xbb\x2d\x6b\xcb\xfc\xad\x8f\x3d\x66\x5d\x95\x9e" + "\x9d\x9d\xfa\xc3\xf4\x49\x6c\x6d\x56\xea\x96\xec\x4d\xd0\x6d\x5a" + "\xad\xcb\xef\x49\xc9\xd8\x6a\x9b\xbf\x64\x79\xe2\x08\xdd\x26\xee" + "\x5f\xb7\x43\xc6\xa1\xfd\x29\x9e\x78\x8c\xc9\xf0\x33\x64\xde\xc1" + "\x9d\x4f\x92\x7c\x4d\x38\xd8\x83\xbd\x10\xfb\x0f\x64\x2f\xa2\xd1" + "\xa7\x68\xcf\x68\x3a\xb8\x9f\xb7\x76\xe9\x6e\xf9\x31\xf1\xed\x6d" + "\xf0\xb7\x4c\x7b\x46\x3b\x1f\x2c\xf0\x88\xb3\x67\xdd\x2d\xab\xe0" + "\x1f\xf9\x29\x4a\xf3\x44\xc5\x2e\x28\xff\x07\x33\x48\x1e\xc3\xd4" + "\xc4\xf5\x13\x78\x49\x3c\x6f\xe0\xff\xb2\x30\xd5\xff\xbe\xde\xe5" + "\xf6\xc1\x8e\xc7\xb8\xda\x5f\xc0\x41\x53\xe5\xfa\x32\x35\x4b\x5a" + "\xe7\xf7\x89\xfb\x04\xba\x5b\xe6\x43\x46\xdc\x8d\x98\x9e\x45\x26" + "\xa2\xff\xca\xf2\x10\xad\x8e\xd7\x78\xf3\x36\x82\xfb\xf6\x0e\x7a" + "\x17\xbe\x53\xc6\x47\x19\x87\xd9\x68\xe9\xa2\xbb\x99\x6e\xfa\x1a" + "\xf9\x47\x65\x74\xd3\xd7\xcb\x3f\x3c\x87\xff\xdd\x12\x23\xff\x46" + "\xa6\xff\x4f\xff\xb4\xf6\xff\xdb\x75\x34\x7d\xc1\xdf\x97\x68\x5f" + "\x8c\xfb\xff\xc7\xf1\xff\x8f\xea\x38\x75\xbd\x3f\xe0\x1b\xe1\x56" + "\xfb\x53\xff\x60\x46\xc2\xcf\xca\xd2\x47\x09\xa7\x4f\x33\x4b\xae" + "\x9f\x77\x16\xfc\x80\xcd\xc8\x3f\x4f\x3c\x18\xf1\x5a\x36\x3b\xef" + "\xcc\xef\xe7\x67\x08\x6f\x5e\x26\xfc\xad\x2f\xeb\x60\xa6\xd2\x0e" + "\xe2\xb3\x6c\x32\xae\x11\xce\x9b\x70\xd7\xca\x45\xef\x4d\x39\x3e" + "\xf6\xb1\xe7\x32\xec\x1a\x9d\x2d\x1b\x98\xf0\xa2\x00\xfc\x35\x6d" + "\x60\x71\xd5\xf1\xfc\x04\x77\xbc\xde\xce\xf5\xaf\x37\x51\xda\xa9" + "\x37\x94\xa4\x71\x6f\xec\x6c\x1c\x67\x7d\x14\xfb\xbc\xb9\x54\xc5" + "\xcd\x29\xe2\x2e\x21\xfd\x02\x07\xe1\xb7\x5b\x9c\x5b\xe8\xe2\x9f" + "\x96\x7b\x7a\x7c\xaa\xaa\xcf\xc3\xb3\x88\xef\x43\xe3\xa8\xe7\x8e" + "\x27\xad\xa8\xf3\x75\xa5\x7e\x1c\xf6\xcc\x37\x76\x26\x8d\xcb\x4d" + "\x65\xfa\x16\x77\x0f\x3b\x49\xb4\x10\xe7\xe3\xb4\xee\x8e\xd1\x3a" + "\xab\x3b\x14\xcf\x2b\xa8\x7f\x25\xc4\xcf\x15\x53\x9f\x8e\x0e\x14" + "\x99\xb1\xff\xf4\xaa\xbc\x9c\x93\xd6\xc5\xb1\x52\xca\xb3\x7a\x1b" + "\x9b\x55\x4a\xf9\x88\xb7\x2b\x86\x8c\x22\xfb\x77\xd3\x55\x82\xc1" + "\x71\x6a\xb3\xd5\xfa\x08\xde\x27\x0b\x1e\x03\x6d\xd3\x38\xac\x1d" + "\xba\xc9\x42\xe6\x47\x1b\x5a\xbb\x03\x45\x31\xeb\xdd\xba\x49\x47" + "\xd4\x33\xc6\x0a\x59\x4f\x4c\xb1\xa4\x63\xa6\x34\xc4\xa7\x55\xef" + "\x6a\xa5\x95\xee\xa4\x7d\x7d\x90\x19\xa9\x8d\x4a\x6a\xc3\x69\xde" + "\xc5\xb8\x19\xf7\x7c\xdb\xfd\x24\xd7\x28\xd2\x86\x56\x37\xf9\x09" + "\x59\x56\xf2\x21\x82\xf7\x08\x10\x7f\x2f\xf4\x33\xc4\x7f\x64\x10" + "\x9d\x20\x9e\x43\xdc\x91\x20\x7e\x03\xe9\xd4\x46\x25\xfc\x9e\x93" + "\xdc\x7c\x9c\xf6\xee\x3a\xf0\x0a\x8f\x5c\xfd\x4f\x86\x33\x0e\xf0" + "\x0b\xd9\x76\xee\x13\x31\xcb\x8a\x26\x1b\x35\x7e\x01\xf8\x01\x1e" + "\xa1\xf4\x11\x66\x18\xa2\x39\x26\x1c\x69\x24\xfe\x83\x78\xfa\xc9" + "\xcb\xd5\xb9\x69\x14\x7c\x81\x1a\xa3\x5c\xd2\xf0\xc9\xdf\xa6\xfd" + "\xdd\x44\x6d\x34\xba\x75\xb7\x08\x58\x48\x1a\x34\x79\x83\xb6\xd7" + "\x43\xe7\xe0\xa6\x3a\x38\xd1\x3a\x82\xdb\xf1\x79\x1b\x74\xcc\xad" + "\x8b\x39\x4a\x73\x71\x1c\x79\xa9\xbc\x81\xf2\x57\xd0\xbe\xaf\xf1" + "\xd7\xed\x24\x13\x10\x1f\x30\xd9\x82\x7e\x50\x99\x26\x82\x35\xe6" + "\xa2\x51\xa5\x63\xa7\x24\x0f\x73\xd3\x2f\x35\xd8\xd3\x5c\xef\x09" + "\xc1\x7f\x72\x7b\x38\xfc\x09\x16\x7b\xd4\xb9\xfc\x41\xd8\xdc\x91" + "\x5c\x7a\xd3\x02\xe8\xa1\xa9\xbd\x13\x42\x87\xa6\x8b\x9d\x02\x5f" + "\x6e\x84\x33\x27\x08\x16\x27\x28\x5f\x3d\x68\xf3\xee\x7f\x10\xcd" + "\x7d\x14\x3c\xd4\x4d\x33\x25\x8f\x1a\x7b\x02\x38\xdc\xa5\x8b\x15" + "\x31\x46\x3b\x75\x93\x67\xa0\x3e\x7a\x2f\xa5\x5f\xe2\x65\x63\xf7" + "\x16\x54\x23\x76\xb6\xa9\x0e\xbe\xd6\xd4\xb9\xae\x1b\x28\x8a\xb5" + "\x69\xf7\x90\x80\x03\x98\x7b\x1a\xe3\x0c\xa9\xa7\x88\xb5\x41\xd7" + "\x28\xca\x0d\x65\xa0\x8f\xed\x58\x9f\xda\x77\x4a\xef\x86\x0f\xdc" + "\x30\xd8\xcc\x50\xe7\xa4\x5e\xc4\xa1\xd5\xdd\x34\x45\xed\x1b\xce" + "\xfd\x8c\xd4\x07\x71\x0e\xd1\x37\x94\x11\x51\x8e\x32\xf9\xa1\x32" + "\x58\x3f\x84\xcb\x66\x2a\x13\x45\xbf\x5c\xcb\x0b\x5f\xfb\xd4\x8f" + "\xca\x67\xe1\x8b\x4c\x17\x7b\xac\x6f\x28\x41\x8f\xd8\x15\xd4\xae" + "\x1e\xb8\x01\xbc\xd0\xea\x28\x97\x30\x3a\x46\xf3\x27\xf0\xeb\xa4" + "\xbf\x9e\xe0\x7e\xd3\x5a\x37\x1b\x92\xbe\x56\xa8\x1e\xb5\x7f\x4e" + "\x71\x3e\x38\x3e\xb2\xa1\x46\xfa\x0d\x42\xbe\xdc\x90\x6d\x94\xc6" + "\x67\xc6\xc2\x2f\x80\x91\xea\x6a\x52\x71\xc2\x4c\xf9\x8e\x04\x71" + "\x08\x3e\x07\x74\x37\xcd\x01\xaf\xa9\xf6\x1f\xb8\x37\x53\xc2\x6e" + "\x72\x03\x70\x80\xf8\xf8\x05\x72\x9e\x27\xc3\x5f\x78\x9c\xc4\xc3" + "\x9b\xba\xb5\x3a\x84\xdf\x02\x82\xb3\x42\x75\x68\xb8\x12\x4e\x1b" + "\x06\x8a\xe2\xe2\x88\x2e\x04\xf1\x46\xa3\x05\xb2\xce\x29\xab\x54" + "\x3e\xe4\x28\xcd\x4d\xab\x88\x49\x00\xbf\x56\x02\x2f\xa7\x58\x4f" + "\x7a\xfd\xec\x29\xe0\xe5\x23\xa0\x09\x71\x79\x7d\xd1\xf1\x15\x21" + "\xdc\x8e\xdb\xac\xe1\x76\xd8\xbc\x0a\xdc\xde\x23\xe8\x51\x5c\x89" + "\x9b\xad\x58\xab\xe1\x3e\xd6\xb9\x42\xeb\xba\x3c\x47\x9c\x0f\x98" + "\xa1\x0f\x14\xeb\xde\xd7\x2b\x64\x0c\xcc\x67\x8b\xbd\x53\xf8\xbc" + "\xdf\xad\x20\x46\xc5\x59\xe8\x47\x7a\xb0\xfe\xb5\x35\x8e\xb9\xa1" + "\xb6\x9c\x88\x73\xb0\x87\x68\x20\xd6\xa0\x97\xfa\x24\x62\x61\xc4" + "\x32\x43\xc3\xfa\x24\x96\x4d\x73\x7b\x72\x03\xe6\x6d\x8a\x49\xbb" + "\xf7\x50\x2e\x69\x80\x49\xc5\x17\xd1\xc7\x11\x70\x35\x4b\xb8\x4e" + "\x49\x1a\xbe\xbe\x63\xdd\x58\xdf\xe1\x70\x05\x4c\x01\x5b\xca\x4b" + "\xe3\x9f\xb4\x42\x83\x6b\x18\x4c\x4f\xab\xf8\xa8\xd2\xd6\x29\xa3" + "\xd2\x56\xc4\x0e\x40\xac\x87\xdd\x18\x0b\xed\x29\x68\x5f\xc4\x5a" + "\x53\x65\x9f\x06\x0f\x70\x6a\x4a\xab\x9b\xe5\xd6\x69\x74\x8c\x70" + "\x25\x01\xf8\x84\xb9\xd2\x68\x07\x74\x65\x6a\xdf\xfd\xda\x7c\xa0" + "\xdf\xe1\x34\x81\xf6\x18\x61\xef\x15\x1a\x73\xfc\x7c\x2a\x17\x0b" + "\xda\x16\xe2\xaf\xe2\x17\x0d\x1f\x7b\xfc\x1c\x8c\x1d\x38\x91\x99" + "\x03\x7d\x99\xdc\xcb\xdc\x3a\x73\xdd\x70\x7a\x65\x7e\x59\xd8\x65" + "\xa8\xfc\x18\xe8\x7d\xe6\x23\x32\x3f\xf6\x37\xca\x2f\x74\xf3\xea" + "\x7e\x08\x7b\x0a\xa4\x55\xab\x30\x68\xa7\xfc\x0d\xb8\x4b\x0d\xdf" + "\x3c\x91\xed\x52\x16\x24\x1a\x7d\x82\xf6\x0e\x27\xe5\x5b\xdf\x42" + "\xd0\xf2\x8f\x67\xac\x5a\xe5\x37\x41\x27\xf8\xf6\xe4\xc8\xed\xdd" + "\x6c\x62\xe6\x12\xfe\xaf\x2e\xdd\xd4\xef\xd1\x3a\xf2\xc1\xff\x25" + "\xd5\x6d\xed\xd2\x4d\xff\x26\xb5\x1b\xa7\xfe\x5a\xe8\x77\x36\xfd" + "\x4e\xa3\xdf\x89\xf4\x7b\x73\x97\x6e\xda\x65\xca\xaf\xa8\xf9\x13" + "\xe9\xfd\x6f\x94\x7e\x8f\xfa\x4b\x7d\x9c\xba\x86\x7e\xd7\x3c\x05" + "\xbe\xf2\x11\x91\xfe\x1a\xde\xe9\xf7\x90\x3a\xee\x26\xb9\xb6\xa7" + "\xe6\x51\x3d\x76\xe4\xc3\xbe\x46\x69\x99\x94\x27\x15\x75\xc3\xb7" + "\x01\x3d\x4f\x09\xe3\x4f\xa9\x1e\x0b\x62\xde\x2e\xa0\x5f\xdc\xb5" + "\xb0\x51\xf9\x8f\x50\x2f\xc1\xa0\x35\x44\x2f\x26\xcf\x48\xb3\xcb" + "\xf9\xa4\xb9\xae\xc2\x7a\xd7\xe8\x01\xf0\x69\x58\xbe\xf5\x32\x9f" + "\x94\x5f\xa7\xfa\xb4\xb9\xf3\x4b\xbc\x3d\xe6\xa7\xb9\xa3\xfa\xef" + "\x43\x79\xfa\x5d\xa6\xfe\x26\xa9\xbf\xf7\xab\xbf\xff\x57\xfd\x5d" + "\xae\xfe\xae\x70\xeb\xa6\x36\xaa\xbc\x09\xc1\x6c\x6a\x23\x60\x42" + "\x34\x5f\xfa\x1c\xd2\x59\xfc\x90\xaf\x89\xfe\x7f\x03\x31\x42\x07" + "\x8a\x2c\x99\x9a\xde\x1a\xba\x9f\xa1\xa2\xc8\x7f\x1e\x14\xba\x1f" + "\x4b\x71\x18\x2d\x34\x98\x74\x49\x8c\x78\xa7\xf1\xd5\x7a\xe2\x1b" + "\x64\x3d\xc2\x6e\x14\xf2\x0f\x62\x0d\x21\x66\x2b\xfc\x0e\x0a\x39" + "\x2a\xea\x61\x0b\xd6\xab\xd0\xe9\x97\xc2\x4f\x50\xac\x91\xfe\xe2" + "\x48\xa6\xb0\x68\xf4\x1e\xf2\x92\x94\xf3\x27\xb4\x52\x5b\xde\x90" + "\x9c\x6f\x39\x22\xcf\x36\xa7\xfe\x78\xa0\x68\x5a\x98\xfc\x6f\xd9" + "\x80\x3e\x13\xac\xdb\x68\x3c\x0b\x3a\x74\xd3\x00\x9b\xbb\x3b\xe5" + "\x98\x13\xb5\x31\xab\x73\x95\xa9\xc1\xbc\x53\x37\xb5\x95\xe8\x61" + "\x16\xf0\xbb\x23\x48\x97\xa7\x8a\x38\x7a\x2a\xfe\xd0\x3c\x4f\x85" + "\x6f\xa5\x82\x30\x7a\x12\x17\xa2\xd3\xd3\x2a\x86\xcf\xcb\xe4\x0a" + "\xbf\xe4\x17\xda\x68\x5d\x02\x07\x92\x47\xac\xcb\x39\x58\x97\x6a" + "\xd9\xa6\xe1\x34\x3e\x7e\x0e\x68\xbc\xda\x47\xc2\xdb\xa9\x0b\x31" + "\x37\x6e\xdd\xb4\x63\xea\x9e\xd4\x46\x7b\xe4\x37\x28\xdd\x2a\xfb" + "\x29\xd3\xd5\xb6\x08\xff\xa6\x5a\x80\xff\x5a\xba\x8a\xdf\xa8\x07" + "\x77\xcf\xa7\x69\xe9\x6a\xfd\x84\xa7\x53\x8d\x58\x3f\x5a\xba\xc4" + "\xc9\xb8\x0d\xa0\x37\x28\xeb\x17\xb6\x8c\x24\x7f\x3f\xd2\x40\xfd" + "\x9e\x5e\x42\xfc\x45\x2d\xd6\xf3\xee\x9d\xcc\xb4\xbd\x8a\x45\xc9" + "\xb5\x39\xfd\x35\xad\xac\xd4\xe9\x4f\xaf\xd5\x68\x54\xb9\xa0\x67" + "\x53\xe2\x86\xd3\xca\x99\x8b\xb9\xc3\xec\xf7\x9b\x62\x59\xb3\x7f" + "\x81\xa0\xb9\xb4\xee\xab\xa9\x5c\x9b\x9b\xbd\x5e\xac\xee\x25\x4d" + "\xf2\x4c\xe5\xe6\xa8\xe6\x5a\x49\xbb\xd4\xba\x83\xf4\x2f\x8c\x0f" + "\x11\xb4\x1e\x6d\xa1\x2e\xda\x57\x62\xbc\x05\xc9\x91\x92\x7e\xdf" + "\x3c\xcf\xcd\x6e\x8d\xd3\x68\x2b\xf6\x27\xb3\x8e\x65\x96\x3d\x22" + "\xf7\x27\x05\x3a\xb0\x4c\xaf\xf0\x37\xd7\x92\xd9\xcb\xb0\x6f\xc2" + "\x9f\x77\xca\x8e\x49\xf0\x1b\x95\x4c\x7d\x9d\x4d\xfc\xd9\x11\xf5" + "\x6c\x86\xe4\xdc\x19\x9f\x40\x96\x55\xe1\x4a\xeb\x69\xc6\x9b\xea" + "\xbc\xb4\x53\x7f\x8e\x80\xb6\xef\xce\x91\xf1\xba\xa0\x0f\x12\xf1" + "\xe3\xc0\xb3\x5a\xb8\x4f\xc4\x26\x28\xba\xf9\x44\x98\x8e\xab\x56" + "\xae\x93\xe9\x2f\x8a\x98\x13\x25\xb1\x4c\xea\x13\x67\x3c\x20\xd3" + "\x67\xcc\x93\x76\x08\xb1\x06\xf5\xdd\x12\x61\x89\xff\xab\xd4\x0b" + "\x47\x0e\x4a\x7e\x64\x86\x29\xcc\xe6\x47\xc0\x5a\xf8\x2d\x2e\x9a" + "\x31\x27\xb4\x2e\x6e\xf6\xa1\x0c\x95\xed\xa1\xf4\x45\x5a\xba\xdc" + "\x6b\x26\xab\x7e\x14\x62\x0d\x91\xbb\x92\x18\xd1\xe6\xf1\x07\x1d" + "\xda\xfa\x9d\x51\x2d\xdb\x97\xeb\x17\x63\x04\x3e\x60\x0d\xfb\x85" + "\x6f\xaf\x87\x85\x4f\x06\x7a\x36\xfa\xb5\xb5\x2b\xf9\xbb\x38\xb1" + "\x76\xc5\xba\x9d\x71\x2c\xd4\x8f\x19\x69\x2a\xae\xb6\xf7\x6d\xb4" + "\x98\xe8\x1b\xf1\xdd\x91\xea\x59\xd6\xcd\x52\xc6\xd8\x37\x98\xa0" + "\xf4\x73\x1f\x74\xd3\xd0\x27\x40\x67\xa3\xda\xab\xe2\xac\xc4\x0b" + "\x7f\x65\x15\xb4\x1e\x42\x3e\xca\x62\x98\xe6\xa3\x6c\xa0\x68\xa6" + "\x25\xa4\x3b\xbe\xd9\xae\x8e\x0b\x3c\x78\xb5\x33\xff\x7d\xe0\xd2" + "\x26\xb9\xc6\x6e\xce\x00\x1e\xbb\x08\xf7\x68\xff\xa9\x3a\x99\x2b" + "\xca\xae\xd5\x70\x8f\xd6\x68\x1a\xcd\xfb\xd9\xca\x78\x5e\x45\x73" + "\x0a\x1b\xfb\xcd\xf4\xfe\x09\xfd\xa6\xc9\x5f\x5d\x0c\x7e\x55\x9c" + "\xaf\xa2\xb2\x15\x6e\x36\xbb\x5e\x9b\x03\x6f\xd4\x12\xab\xc0\xb1" + "\x7c\xd8\x37\x26\x8a\xb3\x7e\xe0\x18\xf0\x4b\x9c\xf9\x13\xae\x99" + "\x77\xfd\x27\x03\x9e\x09\xbf\x25\xf4\x8e\xfe\x02\xcf\xa8\xae\x76" + "\xcd\x87\xb1\x5b\x37\x53\x3d\x6f\x9b\xe9\xd1\x6c\xc3\x81\x87\xb6" + "\xd9\x6c\x0a\xd5\x6f\x6d\xb0\x7a\xa1\x3b\xff\xa7\xcb\x7f\x3f\x43" + "\x5e\xc0\x4e\xd2\xcb\xa9\x0d\x03\x45\xb7\x84\xcd\xff\x64\xe9\x2b" + "\x76\xbd\xd0\x67\xde\x44\xdf\x92\x86\xd3\x1c\x53\x93\xe0\x2b\x69" + "\x7f\xfe\x4a\x1c\xb3\x12\xde\xd2\x5e\x73\x4b\x9a\xc6\x0f\xdf\x45" + "\x69\x94\x07\xfd\x83\x0c\xde\x4a\xcf\x69\xd8\xa7\xc7\xd0\x3b\x43" + "\x2e\xf1\x80\x66\x40\xf7\x04\x3d\x18\xc1\xfa\x54\x97\x6e\xf6\xd9" + "\x66\xf8\x10\xda\xfa\x79\x3f\xd6\xf9\x76\x7e\x15\x3e\xad\xac\x59" + "\xec\xa6\x0e\xdd\xec\x46\xe8\x9d\x0a\x2e\x43\xc7\x73\x4b\xef\x70" + "\x1d\xcf\xac\x45\xea\xdf\x1a\xfa\x3b\x1e\xfa\xb3\x2e\x57\x9f\x9d" + "\xd7\xff\xb3\xae\x97\x79\xad\x19\xf4\x67\x93\xb0\xb2\xd0\x5a\x99" + "\xb5\x46\x83\x15\x68\x0a\x68\x2c\xec\x6c\xb0\xce\x75\x7e\x06\x9f" + "\x45\x34\x4f\xd4\xef\xdd\x77\x7c\xc7\xb9\x13\x32\xed\x2c\xe1\x0f" + "\x01\xfe\x88\x6f\xc8\xd6\x4b\x37\x4b\xcc\xa7\xf0\x17\xab\x9b\xb5" + "\x9c\xda\x8e\x2b\xbf\xc8\x0c\x99\x59\x6c\x26\x74\xe8\xe6\x00\x77" + "\x42\x06\x06\x4e\x20\xae\x59\x8f\xce\x7a\xbf\x2d\x8f\xe9\xe9\xfb" + "\x2c\x7a\x5e\xa0\xf1\x52\x54\x26\x26\xc2\xc7\xe2\xc0\x43\x2d\xcb" + "\x63\xb3\x06\x8a\xac\x31\xda\x5c\x81\xcf\x80\x1e\x4f\xd5\x45\xa0" + "\xaf\xc2\x16\x00\xbe\xf9\xdd\x80\x9b\x46\xab\x2e\x42\x77\x3d\xcb" + "\x1f\xe1\x65\x31\x72\x1f\xb2\xae\xa5\x79\x8d\x93\xf8\x62\xb5\x10" + "\xee\x9f\x0a\xeb\xe7\x7f\x84\x3d\x17\xa1\xbc\xd9\x0b\x1e\x6e\x2c" + "\xf8\x58\x5f\xd4\xe0\x53\x2e\x7c\x7a\xb2\x4c\x31\xdf\x7e\xde\x8b" + "\x38\x6e\x99\x3b\x99\xb1\x47\x37\xfb\x69\x1a\x23\xee\xe7\x36\x4a" + "\x1d\xff\xec\xbd\x9a\x9c\x2e\xfb\x3d\xfb\xdb\xe6\x5d\x11\x0c\xba" + "\x79\xf8\x80\x14\xb6\x98\x97\x2c\x42\x1f\xef\xf2\x2f\x62\xce\xfc" + "\x7b\x91\x67\xa6\xba\x97\xb5\xf7\x15\x58\xd8\x49\xcb\x22\x5a\xc7" + "\xb3\x67\xd0\x5a\x39\x76\xc3\x36\xaf\xba\xd9\x33\x54\xf8\x36\x09" + "\x5b\x11\x9d\xf5\x02\xf6\x12\xe8\x06\x68\x1f\x69\xc0\x7e\x4d\x75" + "\xdb\xb5\x75\x43\xfb\x44\x03\xc1\xa9\x57\xea\x31\x71\x3e\x6f\xed" + "\x86\xef\x18\x21\x3f\xc8\xfc\x26\x79\x6e\x30\xfb\x58\x90\xdf\xa6" + "\x7c\x28\x27\x6c\x08\x75\x56\x67\x4a\x00\xba\x04\xab\x13\x63\x53" + "\x71\x91\xf6\xab\xd9\xed\xa1\x75\x6b\x15\xf7\xf2\x4e\xf6\x86\xaf" + "\xcb\xd9\xfe\x90\x9c\x7a\x4b\xdd\xfc\x4a\x66\x1d\x6d\x1d\x66\x46" + "\x63\xaf\xba\xf5\x89\xf2\x72\x5e\x5b\xa1\x57\xbe\xb5\xbb\x8c\x99" + "\x74\x25\x04\x36\xac\xb3\x9c\x0d\x53\xba\x74\xb7\xe6\x99\x4d\x53" + "\xd7\x2c\xb3\x4d\xe0\xf9\x16\xa6\x2f\xbd\x32\xc1\x38\xdb\x37\xb5" + "\x96\x47\xdc\xf1\x9d\x55\x36\x9c\x7d\x57\xb0\x73\x9b\x59\xc4\xb2" + "\x00\xb5\x6d\x62\x99\x6e\xdd\x9c\x62\xdc\x35\x3f\x69\x02\x2f\x32" + "\xa7\x18\x75\xe6\x56\x33\x63\x6e\x27\xef\x2e\x79\x6c\x9c\x91\xf6" + "\xdf\x18\xda\x37\x8a\x23\x4d\x53\x6b\x87\xa8\x8e\xf7\x36\x88\x72" + "\x75\x63\xf7\xed\x2b\x13\x47\xef\x5b\x66\x7c\x97\xee\x2b\xd3\x6e" + "\xac\x6f\x73\x1b\x43\x7d\x9b\xdb\xf8\xbf\xd0\xb7\x97\xc3\xfa\x16" + "\x13\xea\x5b\x06\xfa\xf6\xe6\x8d\xf5\xed\xab\xc6\x50\xdf\xbe\x6a" + "\xfc\x92\x7d\x3b\x36\x76\xdf\xe6\xdc\x37\x7a\xdf\xec\x53\xbb\x74" + "\x73\xbe\x7d\x63\x7d\x4b\x58\x11\xea\x5b\xc2\x8a\xff\x49\xdf\xf2" + "\xab\xf9\xd9\x16\x5a\x41\xd0\xe7\x80\xce\x77\xe9\xe6\x3e\x94\x37" + "\x43\xd8\x71\xc7\xd2\xf3\xc4\x82\x6a\xfe\x2f\xc9\xdb\xcc\x69\x96" + "\x7b\xda\x1c\x5a\x3f\xb7\xa8\x76\x25\x73\x45\x8c\x07\x25\x62\xfa" + "\x51\xee\xe0\xfe\x3b\xbd\xb0\x19\xf4\xc3\xbf\x0a\x7c\xbb\x2f\x7a" + "\xa3\xdf\xa7\xe7\xd1\xb1\x2b\x0f\x5f\x31\xb0\x37\xfa\x3d\xfa\x81" + "\xa2\xb9\x4c\xf3\xcf\xaa\x95\x35\x57\x5d\x8f\x1e\xcd\xfd\xc6\xb2" + "\x0c\x66\x06\x3d\xc2\x2f\x62\xb5\x96\xe7\x4f\x30\x2e\xbb\x8c\x7d" + "\x7f\xee\x4a\xed\xce\xac\x56\xd7\xea\xee\x09\xdc\x9c\xcb\x22\x70" + "\x6f\x57\xf8\x5f\xb4\x78\xd8\x9c\x5c\x36\x6e\xb5\x9d\xea\xf7\xb1" + "\x0d\x66\x3b\xd5\x4d\xf0\x90\xbc\xfc\xdc\xa7\x23\x36\x33\x53\x25" + "\xd5\x8d\xdf\x65\x96\x02\xbe\xfb\x05\x66\xc0\xfd\x5e\xdc\xd3\x95" + "\x77\x74\xc7\x1b\xa9\x9d\xe3\x5a\x3b\x5f\x00\xbf\x68\x09\xbf\xdb" + "\x9e\x0b\xc1\xef\xb6\x07\x42\xf0\xbb\x2d\x4a\xc2\xef\x36\x43\x08" + "\x7e\xb7\x79\x6f\x0c\x7e\xb7\x25\x85\xe0\x27\xcb\x5e\x1f\x7e\xb7" + "\x6d\x1b\x1b\x7e\xb7\x95\x84\xe0\x27\xeb\x1a\x03\x7e\xe3\x47\x87" + "\xdf\x6d\x9f\x7c\x39\xf8\xdd\xe6\xfd\x92\xf0\x8b\x92\xf0\xfb\xea" + "\x9f\x43\xf0\xfb\xea\xbe\x10\xfc\xbe\xba\x4a\xc2\xef\xab\xcb\x43" + "\xf0\x4b\x58\x70\x63\xf0\xfb\x6a\x61\x08\x7e\xb2\xec\xf5\xe1\xf7" + "\xd5\x37\xc7\x86\xdf\x57\x9b\x42\xf0\x93\x75\xdd\x18\xfc\x12\x26" + "\x13\xdc\x62\x54\xf8\xc5\x8c\x0d\xbf\x84\x05\x5f\x12\x7e\x66\x09" + "\xbf\xdb\xa7\x84\xe0\x97\xf0\x51\x08\x7e\x09\xa5\x12\x7e\x09\x7b" + "\x42\xf0\xbb\xdd\x76\x63\xf0\x4b\x70\x86\xe0\x27\xcb\x5e\x1f\x7e" + "\x09\x57\xc7\x86\xdf\xed\xa6\x10\xfc\x64\x5d\x63\xc0\x6f\xc2\xe8" + "\xf0\xbb\xfd\xdb\x5f\x0e\x7e\xb7\xdb\xae\x07\xbf\x1b\xe3\x35\x6e" + "\x17\xb2\xce\xff\x42\x3d\xad\x63\xd5\x03\x18\xc2\x3e\x51\x29\xba" + "\xbd\xb5\x46\x19\x6f\x94\x77\x38\x6e\x2f\x26\x19\x66\x69\x87\xee" + "\x8e\x99\x35\xca\x38\x23\x77\x9c\x9b\xa7\x38\xba\x4f\xf1\x5d\xe3" + "\x0d\xca\xae\x09\x06\xf8\x14\x18\xad\x2e\x61\x2f\xab\xbb\x23\x2f" + "\x62\x1a\xbb\x05\xf7\xf5\x76\x13\xbf\x86\xe7\x81\xa2\x3b\x8a\x89" + "\x17\x89\x1b\x09\x93\xb4\x4d\xd9\x22\x78\x67\x56\x7a\xda\xb6\x2d" + "\x69\xa9\x5b\x6c\xd6\xd4\x8d\x8f\x67\x0f\xf7\x89\x2f\xe2\x5e\xee" + "\xc1\xfc\xdd\xd1\x14\xf4\xf3\xe2\xe0\x76\xf8\xcb\xcb\xbc\x15\xb6" + "\x69\x5f\x33\x89\x38\x05\xd1\xb1\x27\xf8\x50\xf2\x81\xa4\xaf\xf0" + "\x77\x85\x1f\xc0\xa1\x8c\x03\xbc\xc4\xb4\x1c\xbe\x5d\xd4\xb3\x09" + "\x92\xc1\xe7\xcf\xe5\x51\x53\x13\x61\xd3\x21\xee\x76\xe8\xbe\xa6" + "\xdd\xc1\x6a\xe4\x26\x53\xb5\x52\x32\x35\x91\x97\x4e\x4d\x00\x0c" + "\x5a\xe0\x83\x2d\x27\x62\x56\x87\xee\xce\x6e\x1e\x65\xaa\xa6\xba" + "\x6a\xd5\x7a\xa0\xd7\xf0\x26\xed\xe4\xff\x44\x7d\x2a\x2f\x88\x38" + "\x24\x4e\xc9\x0f\x7e\xed\x45\xf3\x2e\x6b\x04\xf2\xc2\x17\x22\x7c" + "\x04\x6a\xb1\xa7\xd0\x6f\xe4\x25\x7e\x7c\x29\x95\x5f\x8a\xd8\x9b" + "\xc1\x3a\x64\x9f\x6e\xa2\x3e\xb5\x89\xb1\x94\x98\x56\xf4\x3d\x99" + "\x7c\x40\xc4\x7f\x14\x70\xbd\xb3\x99\xda\x5e\x21\xe2\x76\xfa\x2f" + "\x89\xb8\x9d\x6a\x99\x99\x54\x46\xd0\x53\xf8\x3f\x95\x75\xdc\xf9" + "\xa6\xd6\x2f\xe2\xa1\x27\xd1\xfb\xa1\xb0\x36\x22\xe9\x7d\x6f\xd8" + "\x77\x13\xbd\x6f\x22\x3e\x74\xb2\xfa\x3d\x8a\xde\x57\x81\x2f\x95" + "\x31\x2f\x0b\xa5\x4d\xb4\xee\x4e\xd8\x02\xc7\xa8\x79\x26\x53\x9e" + "\x29\xe0\x75\xd5\x3a\x62\x7b\x74\xf3\xaf\x41\x66\x54\xbf\xc7\xd1" + "\xfb\x69\x9c\x0b\xa8\xdf\xa7\xd0\xfb\x7b\xff\x1f\x7b\xdf\x03\x17" + "\x55\x95\xf6\x7f\xe6\x32\xea\xa4\x33\x30\x2a\xd5\x58\x68\x53\x6b" + "\xbb\x53\x6b\x45\xc5\xb6\x54\x9a\x54\xda\x52\x99\x50\xab\x2d\x99" + "\x25\x26\xda\x58\xfe\x41\x24\x44\x45\xfe\x49\xac\xd2\x0c\x52\xeb" + "\xee\xa2\x01\xea\xbe\xc5\x9a\x7f\x8a\xdd\xad\xd6\xde\xb7\xb6\xe9" + "\x5d\xdd\xa8\x80\xa1\x5e\xfb\xbd\x94\x03\x4c\xec\xe0\x92\x2f\xda" + "\x04\x28\x23\xcc\xdc\xf3\x7b\x9e\x7b\xee\x65\x66\x60\x06\x66\x06" + "\x34\xdb\xe4\xf3\xb9\x9f\xcb\x3d\xf7\xcc\xb9\xe7\x3c\xcf\xf7\x3c" + "\xcf\x73\xfe\x3d\x0f\x3c\xff\x44\x7c\x0f\x76\xfd\x34\x16\xff\x46" + "\xa9\xdc\x8e\x6d\x02\xda\xab\x91\xee\x40\xeb\xed\x90\x36\x0b\xc6" + "\xab\x39\xc8\x47\x6c\xa7\x69\xc3\x09\xd2\x22\x9b\x86\xb1\x41\xc3" + "\x18\xaf\x2e\x8f\x66\x3e\x7a\xb8\x24\x48\x6f\xc7\x74\xdc\x5b\xce" + "\x1b\x2f\x57\xe3\xff\x40\xd3\xe7\x91\x86\xe2\xb7\x60\x4c\x74\x43" + "\xa4\xc8\x67\xa0\x1d\xfa\xd1\x25\xb9\xbb\x44\x5e\x40\xdd\xc6\xc0" + "\xfb\x35\xe2\xba\x47\x43\x82\xb3\x97\x9d\x2f\x92\xdd\x30\x3d\x24" + "\xbf\x11\xf0\x3b\x26\xf7\x6e\xc8\x92\x62\x12\x42\x1a\xf3\x95\x05" + "\xf8\xc4\xf9\x15\xbb\x4a\x19\x2d\xf8\x49\x01\x8c\x4a\x58\x41\x9c" + "\xd0\xd1\xd7\x6f\x67\x73\x35\x37\xf4\x9d\xff\xb5\xca\xa6\x75\x89" + "\x71\x1c\x08\x1b\x27\xdc\x70\xd4\xbd\xbf\x68\x9a\x20\x1f\x3c\xde" + "\xd9\x3d\xde\x65\x4a\xef\xd8\x1e\xb8\x1b\x95\x1e\xef\xf4\xfd\xde" + "\xe9\x3c\xde\x25\x79\x97\x79\xe3\x2c\x8f\x77\xf1\xfd\x7e\x97\xec" + "\xf1\x2e\xa6\xdf\xbb\x2c\x8f\x77\x53\xc5\x77\x61\x90\xbe\xbd\xcf" + "\x4f\xa1\x6c\x5a\xa4\x98\x0e\xb2\xfe\xc6\x03\x1e\xe9\x72\x31\x1d" + "\xbf\x7f\xd8\x4a\xbe\x14\xc7\x31\x0c\xe7\x80\xa3\x1f\x8b\xdf\xb0" + "\xba\xbf\xf1\x53\xc9\xcf\x7c\x34\xe3\xdf\x4f\xe7\x44\xc8\xb4\x63" + "\x10\x53\x11\x79\xb9\x18\x13\xa8\x84\xf9\xe4\x62\xfd\x50\x88\x5d" + "\x8d\xb1\x6f\x21\x9f\x3f\xd9\xe8\x37\x36\x66\xe1\x4d\x49\xd2\x59" + "\x56\x97\x41\x19\xc3\x1b\x26\xa6\x63\xac\x41\xf4\xdf\x95\xd3\x4e" + "\x79\x21\xc6\x20\xc6\x32\x24\x3d\xc4\x9c\xde\x9d\x0b\xb2\x21\x1c" + "\xf5\x1c\xae\xef\xd5\xc1\xf8\xb6\x2e\xf5\x24\x8b\x33\x88\xe7\x7b" + "\x8d\xca\x98\x75\xed\x24\x2a\xf5\x2e\x6a\xc3\x71\x1e\x93\x09\x37" + "\x55\x43\xde\x08\x51\xa6\xed\x60\x7b\xbd\xa3\x31\x36\x77\x84\xb9" + "\x5d\x98\x67\x56\x1c\x97\x45\x37\x48\xef\x59\x7b\xa3\x1b\x84\xb1" + "\xb4\x78\xae\x10\xea\xe8\xec\x8b\x83\x29\x8b\xb6\x9c\x56\x4d\x2a" + "\xed\x2e\x8c\x56\x7b\xef\x6f\x8c\xbe\x0e\xcb\xc4\x36\x58\x65\x37" + "\xd5\x60\xd9\x90\x27\xa6\x6f\x7f\xa3\x52\x19\x03\xef\x67\xb2\xfd" + "\xf8\xd1\x0d\x42\x0c\xa0\xc2\x68\x18\xff\xdf\x34\x4d\xdc\xc7\x59" + "\x40\x71\xef\x63\x0f\x21\xb8\xaf\x99\x86\x8f\xaf\xc9\xf9\x96\x4c" + "\xe8\xec\x4d\xc2\xbd\xaa\x2d\xc2\x3e\xec\x35\xe8\xff\xcf\x41\xe6" + "\xa6\x12\x16\xdb\x46\x16\xfd\x4e\x5d\x97\x95\x6c\xc6\x33\x89\x46" + "\x65\x75\x67\xf8\xf8\x2f\xa1\xcc\xbd\x56\xf2\xd4\x76\x71\x5e\x02" + "\xe3\xec\xd6\x58\xb1\x7d\x39\x7a\x02\x79\x0e\x43\x9e\x36\xc8\x53" + "\x23\xe5\xc1\xf7\xdd\x38\xc7\x4b\xf5\x04\xdb\x75\xda\x38\xb3\x1a" + "\xde\xb7\x5b\x39\x4b\x26\xdb\xa3\x19\xed\xb0\x92\xd6\x5c\x7f\x3a" + "\x58\x98\x17\x55\x5e\x1e\x4f\x0d\x97\x27\x82\xdc\x89\x63\xbe\x08" + "\x2e\x8f\x67\xf3\x09\x37\xcf\xc6\xf8\x66\x18\x7b\x1c\xd7\x3e\x99" + "\xec\xbb\x79\xab\x20\x3f\x20\x0d\xf8\xb3\x17\x74\x84\x30\x3f\x12" + "\x9c\x5c\xb8\x79\x9e\x50\xc6\x15\xcc\xff\x19\x9e\x23\xe9\x2e\xbc" + "\x79\x77\x5f\xfc\x88\xbe\x33\x0d\x37\x7f\x84\xf3\x8c\xdb\x78\x56" + "\xc7\xfe\x75\xc0\xfa\x42\x59\x7e\xfd\x90\xc0\x6f\xe2\x84\xb9\xd8" + "\xe2\x09\x0b\xd9\x7e\xb6\x5b\xc6\x87\x69\xae\x3c\xd3\x5d\x78\x4b" + "\xdf\xfa\x07\xe6\x41\x9e\xf1\x50\x7e\x5f\x3b\xd3\xf0\x1b\xb7\xc4" + "\xb0\xb5\x82\x5b\xe2\x41\x96\xc6\x6d\xeb\x21\x72\x31\x3d\xbe\xce" + "\xe9\xc0\xf3\xfd\x3e\x7d\x71\xa1\x9e\x16\xfc\x38\x15\x5f\x1e\x87" + "\x67\x38\x6e\x72\x48\x75\xbe\x35\x1e\xcf\x0e\x60\x9d\x19\x6d\x6f" + "\x9d\x21\xd1\xd1\xd8\x01\x65\x67\x7f\x49\x6c\xb2\x5b\x8e\xe0\x1e" + "\x1b\x81\x26\x1b\xa4\x7d\x5f\xb7\x08\xe7\xb8\x85\xef\xb3\x3c\xc2" + "\x9a\x29\xee\x39\x46\x3a\x55\x20\xd6\xa0\xcc\x62\xe0\x85\x10\x1b" + "\x57\x76\xab\x30\xd6\xd9\x0c\xef\x85\x76\x0b\x7b\xea\x6e\x5d\xc1" + "\xfa\xc1\xad\x30\xfe\xb9\x35\x93\xf5\x03\x96\x86\xb1\xeb\x71\x2f" + "\xc4\x29\xd9\x2d\xad\x18\x9f\x16\xe8\x91\x88\x3e\xec\xea\xba\xa0" + "\xbf\x66\xf6\x20\x16\x12\x31\x0e\x21\xd0\xc1\xc6\x74\x14\xd2\xfc" + "\x96\x6a\xfc\x3e\xd2\x16\x63\xf3\x86\x69\xa2\x40\x0e\xdc\x9a\xdc" + "\x17\xe3\xf8\x32\x3c\x57\x71\x8b\x5f\xdf\x85\x48\x23\x17\xd4\xb9" + "\x0e\x6c\x66\xd3\x15\x5f\x42\xfd\x62\xae\xe3\xc3\x2f\x8f\xc3\x3d" + "\x9c\x50\x57\xb6\xcf\xcd\xc0\x78\xc7\x70\x10\x23\x83\x6f\xdc\x54" + "\xc7\xb0\xc0\x62\xa3\xcb\x6e\xdd\x2b\xd2\x4f\x88\x7d\x51\x92\xc1" + "\xe8\x20\xe6\x5f\xc8\xe6\x86\xa2\x7e\x06\xf5\x72\xc7\xff\x82\x74" + "\x61\x5e\x4f\xdc\xe7\xdd\x5d\x18\x13\xe9\x51\xe7\x2e\xe1\x2c\x62" + "\x07\x8e\xeb\x6f\x7d\x17\xbf\x65\x44\x1f\x63\x88\x8b\x13\x9e\xf8" + "\xbf\xb5\x1c\xeb\x89\xfb\x03\x5d\xaa\x09\x0b\xa9\x71\x42\x32\xd2" + "\x19\x7e\x73\x14\xfa\x42\x9c\x9f\xd8\xf3\x42\xec\x2b\xf8\x5e\x81" + "\x47\x3c\x5f\xd0\xc5\x31\x6f\x49\xba\x16\xed\x04\xf4\x35\xd1\x97" + "\x66\x5c\xb0\x05\xe4\x77\xa6\x68\x67\x65\xfa\xf5\x77\x78\x23\x89" + "\xc6\xf3\xce\xb8\x57\x1c\xf1\x46\x95\x0b\x74\xe8\x43\x19\xfd\x41" + "\x9a\x36\xdc\x02\xf5\xfd\xd9\xd2\xdf\x5c\x26\x9c\xb1\xec\x32\xdd" + "\xd8\x81\xfb\x84\xda\x8f\x67\x09\x7e\x8e\x14\x09\x99\x4e\xba\x8b" + "\xc5\xf3\xb6\x53\xd5\x02\x1d\xbe\x13\x62\x08\x60\x99\xa1\xfa\x03" + "\x96\xfd\x2c\x5a\xb4\xa7\xda\xc1\x9e\xb8\x1c\xda\x23\xe8\x29\xf8" + "\xff\xb2\x13\xb2\xdb\x8c\x2c\x06\x25\xf3\x69\x2f\xee\x77\x1c\xcd" + "\x7c\x04\xd8\x89\x70\x66\x5b\x76\x9b\x4c\x7b\x3d\x21\xed\xb2\xdb" + "\x46\x09\xfe\xa5\x0d\xca\x2d\x22\x0d\xb6\x6c\x63\xf5\x8a\x58\x94" + "\xc9\x09\x75\xc4\xfa\x05\x59\xb7\x1a\x51\x97\x8e\xee\x2e\xbc\x4d" + "\x2d\xf9\x16\x10\xda\x2f\xfa\x9d\x36\x5d\x83\x63\xa7\xdb\x36\x89" + "\xfa\xd3\x20\x7e\xdb\x30\xfc\x6f\xdf\x16\x2f\x96\x99\x2c\xf8\xde" + "\x06\xba\x40\xb9\xc9\x50\x8f\x52\x49\xa7\x8b\xfb\xf4\xa7\x31\x5b" + "\xe3\xb6\x2a\xb7\x3e\x67\x34\xf4\x3a\x37\xb4\x7a\x75\xba\x16\x06" + "\x0d\xa9\x8b\xd3\x97\xe8\xb5\x4b\xd3\xd2\x56\xa7\x69\xd1\xe9\x4e" + "\xbf\x58\x4d\x0a\x5a\x78\xdb\x61\x31\x9e\xdc\xde\xbe\x78\x72\x85" + "\x3f\x57\x7a\xc6\xf9\xb3\xca\x7e\xae\x1e\x99\xb1\xd5\xcf\xa7\xf9" + "\x2b\xa7\x84\xe3\xab\xe0\x3a\x04\x97\x09\xae\x6a\x1c\x6b\x2d\x72" + "\x90\x38\xd0\xd1\xc2\x78\xcc\x7d\x66\xfe\x36\xf4\x5d\x13\xd7\x22" + "\xfb\xf9\xd6\x0a\x5e\x4e\x04\xdf\x2a\xf9\x3c\xee\x67\x41\x3f\xe9" + "\x87\xe0\x32\xc1\x55\x0d\x97\xf0\x3b\xfe\xbf\x85\xf3\xbe\x55\x9e" + "\xef\x70\x7d\x9c\xe6\xff\x1d\xfd\xad\xd7\xd3\x3c\xb9\xb0\x0e\xc2" + "\xbf\xc4\xf2\xf5\xab\x03\x47\x0b\x6f\x56\x8a\xf9\x04\x3b\x2b\x3c" + "\x8f\x68\x7d\xe4\x0b\xa3\x85\xd7\xbf\x29\xe6\x13\x62\x08\x4b\xed" + "\x41\x1f\xfe\x90\x5f\xca\x27\xa7\x85\x31\xd5\x62\x3e\xe1\xec\x1f" + "\x9f\xcf\xf9\xfa\xee\x28\x9a\xef\xb0\x8b\xf9\xd4\x9e\xe5\x79\xe4" + "\x19\xcd\x17\x5e\xa3\xc1\x3c\x7c\x9e\x5c\xb0\x0d\x69\xe1\xcf\xa7" + "\x41\x7e\x9f\xbe\x4f\x83\xe3\x53\xec\xd1\xfe\x7c\x4a\x5d\xb2\x7c" + "\xe9\x1d\xcb\x57\x65\x60\x74\xaa\xf4\xd5\xcf\xa5\xe3\x7d\xd5\xe2" + "\x67\x85\xdb\xea\x45\xcb\x96\xb0\x7f\xd2\x57\x44\xe3\x3f\x2b\x00" + "\x6f\x78\x4f\x79\x2e\x15\x6f\x4b\x56\xe3\x63\xa6\x7e\xda\x73\x4b" + "\xa4\x30\xe1\x5e\xbe\x9f\xba\x0b\x6f\x07\xfb\xf7\xe7\x2b\x98\x3d" + "\x72\xfb\x16\xab\xec\x7a\x61\xbd\x31\x22\xcf\x4a\x8e\xe8\x84\x78" + "\x82\x64\x80\xcf\x04\xd9\xed\xbf\x45\x9f\x09\x11\x79\xa9\x4b\x22" + "\x9c\xcb\x97\x82\x9c\x35\xc1\x6f\xc1\xfe\x7d\x55\x3c\x93\xaf\x2c" + "\x15\xfc\x87\x16\xde\x1e\x29\xed\x71\xe4\x0d\xca\x39\xe8\x17\x5f" + "\xd8\xf3\xf4\x12\xfa\xe3\x51\x66\xc2\xf3\xf6\x8a\x97\x84\xf8\x34" + "\x91\xf0\x3c\x0f\x9e\xcb\xe0\x59\x03\xcf\x51\xfc\x16\x67\x03\x9e" + "\x91\x84\x67\x8c\x67\x36\xb5\xbb\xf0\x8e\xbe\xf8\x97\x9e\xb4\x11" + "\x03\xd8\xdd\xe1\x73\x8c\xde\xcf\xef\x18\x94\xa1\x97\xe2\x03\x0b" + "\xb1\x80\x0b\xef\xc8\xec\x8b\x05\x2c\xc4\x74\x52\x0b\xba\x89\xe9" + "\xf6\x3b\x4e\x87\x69\x26\x17\xb0\xb1\xc0\x1d\xbb\x25\xbf\x10\xcc" + "\xd6\xbf\xa3\xca\x23\x8e\x32\x3e\x9b\xfa\xe2\x28\x33\x3f\x66\x3b" + "\x05\xdf\x4b\xb2\x3b\xa1\x8f\xdf\x11\xdd\x17\xf3\xae\xf0\x8e\x36" + "\xcf\x98\x77\x56\x78\x8f\x63\xac\xee\xc2\x3b\x89\x5b\x0f\xde\xb1" + "\x1d\xbf\xe9\x2b\x66\xf4\x36\x0e\xc6\x03\xeb\x61\x3c\x00\x77\x61" + "\x6c\x20\xda\xe1\x98\x4e\xf3\xe3\xd0\xc7\x8e\x16\xdf\xa1\xed\xe7" + "\x73\xde\x43\xb0\x6b\xef\xdc\x81\xfe\x77\xed\x39\x29\xb2\x1f\x55" + "\xe0\x3e\x28\x78\x66\xfe\x23\xe9\x29\xd9\x9d\xc2\x19\x33\xc9\xb7" + "\x9c\xe7\xb9\x7c\x9f\xe7\x1f\x3e\x93\xd6\xad\x57\xac\x8e\x70\x2e" + "\x5e\xca\xec\xb8\x3b\xcf\x8a\xeb\xd4\xb9\x4c\xdf\xdf\x69\xa3\x8f" + "\xb0\xb8\x27\x56\xd9\x74\x3d\x9e\x89\x8a\x90\xad\x58\x4d\xe1\xb7" + "\x11\x99\x8b\x97\x0a\x69\x90\x6f\x33\xd8\x5a\x62\xfd\x3e\x32\x47" + "\xb5\x11\x7a\xc6\xc5\xfc\x0d\xc8\xee\xac\x7e\x72\x72\x2e\x7e\x47" + "\x21\xd8\x11\x9f\x11\x25\xc6\x1f\xc4\xba\x55\x78\xf8\xbe\xdb\x06" + "\x69\xb8\x27\xac\xf3\x11\xa2\x44\x5f\xbf\x62\x5d\xaa\x85\xf8\x67" + "\x85\xd3\x93\x25\xbf\x3d\x40\xf3\xea\xfe\xed\x79\xe4\x97\x42\x0f" + "\xb9\x76\xc9\xb4\xc4\xd9\xf0\xdf\x34\x31\x74\xae\x27\x76\xa2\x3a" + "\xc3\x23\x0f\x75\x56\xfe\xf5\x57\x42\xec\xc9\xc2\xe9\x20\xff\xef" + "\x64\xfe\x24\x36\x3f\xfe\x35\xca\x16\x21\x26\x23\x9e\x6d\xe4\xf1" + "\xec\xee\xcc\x3d\x82\x9f\x5d\x8e\xd9\x8b\x42\x5c\xa6\xc2\xe9\xe9" + "\x34\x5c\x19\xcb\xe2\xce\x4e\x4c\x02\xfe\x09\x7a\x1f\xfb\x86\x70" + "\x86\x53\x8d\x6d\x9f\x81\xe7\x5a\xef\x85\xeb\x57\x2c\x4e\xcc\xe3" + "\x5f\x4b\xe5\xa2\x0f\x2b\xc0\x96\x09\xee\xea\xee\xc2\x19\xd1\x7d" + "\xfb\x94\xfa\xce\x85\xce\x78\x18\xfd\x6b\xb9\xcf\x08\xcf\x14\xe7" + "\x35\x67\x2c\xb4\x92\x1f\x97\xb0\xfe\x3d\x03\xf0\xff\x89\x78\x3e" + "\x6c\x46\xba\x95\x3c\x58\xdf\xaf\x8c\xf7\xa4\xf9\x17\xc6\xbb\x19" + "\xa5\x80\xc5\x7b\xe1\xfa\x15\xe4\x7f\x45\x8a\xbb\xbd\x99\x13\xce" + "\x37\x1d\x0f\xd3\xe0\x19\xe0\x19\xef\x4a\xe9\xa3\x64\x71\x40\x9b" + "\x19\x35\x92\x3c\xe9\x0c\x9f\xa0\x87\x67\x0b\xd8\x9b\xf3\xc4\x67" + "\xe8\x73\x33\xda\xa5\x67\xf8\xdf\x21\xc9\x1b\x1c\x23\x76\x6e\x4c" + "\xda\x81\x63\xcf\x25\x1a\xb0\xc9\x34\x38\xc6\xbb\x4b\x63\x25\x1f" + "\x17\xb0\xdf\xce\xb0\x76\xe6\xd7\x46\x77\x85\x3f\xaa\xed\x02\x19" + "\x0a\xef\x62\xac\x64\xff\x51\x56\xce\x5d\x71\x56\xae\x69\xba\x9b" + "\x1f\x61\x11\x40\xe3\x74\xd6\xa6\x99\x99\xf0\x7f\x26\xc6\x40\x87" + "\x7c\x7a\xe8\x5f\x89\x6c\x4c\xd8\xbe\xdb\xd0\xa3\x9e\x67\x2e\x00" + "\x9b\x75\x19\x62\x65\xa6\x10\x3f\xda\xb8\x41\x9d\x88\x36\x1f\xfa" + "\x42\x10\x7c\xa4\xa1\xef\x49\x27\x19\x2d\xf8\xfb\x37\xde\xd5\x20" + "\xf8\xb9\x5f\xa7\x53\x4a\x7e\x27\xa9\x61\x5c\x1b\xe5\x5e\x6f\x47" + "\x5f\x94\xc2\x7c\x5e\xb7\x2e\x5c\xf0\x3f\x29\xfa\x9d\x2c\xcf\x20" + "\x91\x65\x3c\xf3\x3b\x29\xf8\x49\x18\xc4\xf7\x24\xcd\x3f\x51\x20" + "\xf9\x9e\x04\x3a\xe0\xf9\x47\x1d\x3d\xe3\x74\xc0\x7d\xaa\x87\xbf" + "\x1d\xb9\x4f\x3f\x94\x1c\xc8\x4d\x8e\xf9\xa1\x0c\x4e\xdf\xcc\x9c" + "\xc5\x70\x32\xb3\x40\x8a\x0b\xee\x91\x56\x0a\x38\x7f\x85\xa5\xcd" + "\x48\x14\xd3\x0e\x58\xc9\x47\xf6\x3e\xdb\x0c\xe4\x1d\xce\x6b\x42" + "\x3f\x3e\x0a\xe3\xe0\x1d\x9e\xfd\x8a\x08\x7f\xa8\xba\x47\x81\x5e" + "\x1e\x0d\xd7\x18\xbc\xe2\xfb\xe4\xc7\x19\xda\x80\x63\x84\x08\x19" + "\xe8\x9b\xcc\x30\x9a\xe0\x74\x86\x2d\x72\xca\x8e\xa2\xed\x89\xe7" + "\xbe\x13\x5c\x4e\xf4\x3f\x20\x4f\x70\x75\x62\xcc\xce\xa3\x78\x9e" + "\x6d\xdb\x32\x3c\x5f\x79\x15\xc5\x78\x35\x09\xae\x6f\xe8\x2e\x76" + "\x6e\xb4\x5e\x8c\xc3\x59\xe3\xca\xa0\xd5\xc0\x07\x25\x8e\x3b\xd0" + "\x07\x58\xb8\xcc\x41\xc2\x53\xc3\xde\x9f\x7b\xfa\x7d\x8a\xfe\xbf" + "\x30\x56\x19\x5f\xe8\x00\x59\xa9\x95\x2d\x72\x86\xe5\x9a\x9d\x36" + "\x21\x5e\x40\x82\x6b\x0c\x4d\xc8\x9c\x41\x85\x18\x63\x19\xf4\x30" + "\xc8\xd9\x30\x21\x2e\xf7\x7a\xda\x09\xff\x2b\x12\xd6\x77\x52\x8c" + "\x19\x0a\x65\x57\x27\x38\xf9\x9e\x84\x4c\x3e\x67\x51\xa6\x0c\x7e" + "\xf7\x4f\xf8\xdd\x3f\xa1\x3e\xd1\x50\xa6\x1a\x9e\x67\xd2\x5d\xcb" + "\xf0\x1c\x56\xae\x30\xf6\x81\x36\x9a\xc4\xb3\xad\x87\x30\x4e\x28" + "\xfa\x1b\x5f\xe4\x34\xe5\xee\x12\xcf\xaa\x0a\xf1\x6a\x33\x7b\xa9" + "\xf8\x9d\xd8\x84\xf5\x64\xe6\xa2\xf5\x57\x09\x67\x5e\xf1\x3c\x57" + "\x82\x53\x0b\xdf\xcc\x45\x7a\x28\x85\x18\xe1\xc2\x99\xae\xbb\xa3" + "\x07\x8b\x19\x8a\x7b\x55\xd6\x4e\x22\x1c\x9e\x11\x71\x55\x54\xd6" + "\xa3\x3f\xb2\x1c\x3b\x75\xe0\xdc\xe3\xfb\x3d\x0d\x9c\x36\x43\x0e" + "\x72\xf5\xee\xf9\x75\xa9\xd1\xbe\xcf\xf5\x15\x45\x81\xfd\x7b\x2c" + "\x85\x16\x5d\x75\x18\xee\x36\x6a\x98\x88\x7e\x7a\x64\xb4\xe8\x9a" + "\xed\xd4\x68\x81\xf4\x6b\x53\xe0\x6e\xa3\x45\xba\x18\x6a\x6c\x84" + "\xe7\x9f\xca\xe1\x0e\xcf\xa3\x6a\x20\x7f\x32\x2d\x1a\x8d\xbf\xb3" + "\xd2\xa2\x31\xef\x42\x3e\x78\x56\xbc\x09\x77\x78\xbe\xe4\x00\xe4" + "\x83\xe7\xb1\xaf\x1c\x97\xdd\xa3\x85\xff\x21\xed\x86\xa3\xec\x5b" + "\xd1\x47\x85\x6f\x15\xe1\x58\x0d\xbf\x71\xdb\x51\xf6\x8d\xdb\x8f" + "\xb2\x6f\x4c\x3f\xca\xbe\x31\xae\x0c\xf2\xe9\x69\x91\x4a\x09\xf7" + "\x36\x5a\x14\x9e\x05\xf9\xe0\x39\xa2\x1d\xee\xf0\x3c\x1e\xc6\x7d" + "\x8d\xf0\x3c\x01\xea\xd2\x08\xcf\x91\xd3\x21\xdf\x0a\x5a\x74\x69" + "\x15\xdc\xdb\x69\xd1\xe5\x53\x21\x1f\x3c\x6b\x4a\xe1\x0e\xcf\x57" + "\x40\x39\x8d\xf0\x7c\x65\x2e\xdc\xe1\x79\x26\xd6\x23\x95\x16\xdd" + "\x0d\xe5\x1e\xb3\xd3\xa2\x7b\x31\x3f\x3c\xcf\x82\xf2\x2c\xf0\x7c" + "\x5f\x3a\xe4\x83\xe7\xf8\x28\xb8\xc3\xf3\xfd\xd8\xd6\x74\x5a\xf4" + "\x60\x2a\xdc\xbb\x68\xd1\x43\x90\x6e\x81\xe7\xb9\xd5\x70\x87\xe7" + "\x44\xcc\x0f\xcf\x8f\x60\x7b\xe1\xf9\x97\x48\xa3\x4c\x5a\xf4\xe8" + "\x34\xb8\x3b\x68\x51\x92\x01\xf2\xc1\xf3\x02\xac\x3f\x3c\x3f\x31" + "\x07\xf2\xc1\xf3\x22\xa4\x15\x3c\x3f\x85\xed\xcc\xa2\x45\x29\x58" + "\xbe\x93\x16\x2d\x43\xba\xc0\xf3\xf2\x58\xb8\xc3\xf3\xb3\x40\x8f" + "\x46\x78\x5e\x45\xe0\xee\x13\x0f\xb4\x28\xb5\x81\xe6\x8d\x26\xb4" + "\x68\x43\x24\xcd\x1b\x03\xf7\x8d\x87\x69\xde\x28\x1d\x2d\xca\x99" + "\x0a\xe9\x70\xcf\x2a\x83\xe7\x69\xe2\x33\xdc\x37\xa5\xc3\x73\xb4" + "\xf8\x0c\xf7\xec\x39\xf0\x1c\x23\x3e\xc3\x3d\xf7\x28\x3c\xc7\xd2" + "\xa2\xbc\x03\xf0\x8c\xf7\x38\x78\x9e\x2e\x3e\xc3\x7d\x73\x2a\xdc" + "\x9d\xf6\xc9\x95\x3a\xbb\x6a\x9f\xd5\xae\x6a\x4e\x44\x4c\xba\x8a" + "\x8f\x25\xf3\xe1\xc7\xd0\x4f\xeb\xe8\x9c\xd3\x64\xcc\x71\xd9\xac" + "\x93\xa8\x23\xcd\x59\x56\x21\xbe\x9d\xe8\x1f\x6f\x74\x8b\xec\xde" + "\xaf\xc1\x26\x88\xc5\x98\xe9\xd0\xe6\x32\x9a\x3f\xaa\x03\xda\x1a" + "\x45\xf3\xc7\xb5\xc0\x1d\x9e\xc7\x7f\x06\x6d\x85\xe7\xdb\x8a\xe0" + "\x0e\xcf\x8f\xdf\x43\x8d\x4d\x51\xdd\x85\xb3\xe2\xad\xb2\xbb\x85" + "\xf8\xc0\xb4\xf2\xaf\x89\x11\xce\x1c\x90\x29\x20\x73\x77\x1c\x57" + "\x47\x38\x93\x81\x3e\xcd\xf6\x08\x8c\x43\x51\x5e\xa9\xa7\xe1\xfb" + "\x85\x3a\x61\xac\x19\xda\x3b\x95\x63\xdf\x1e\x47\x5b\x64\xb3\x9e" + "\xc3\xf9\x57\x1a\xfe\x77\x7f\xef\x7f\x2b\xbc\xbf\xe2\xb8\x96\xbd" + "\x57\x10\xf7\xfb\xc7\xf1\xfd\x5b\x11\x38\x67\x3e\xa5\x42\x78\x6f" + "\xee\x6a\x13\xdb\x15\x86\xef\x3e\xc5\xbc\x56\xd9\xac\x2e\x36\x7f" + "\x75\xaf\x83\xe6\x87\x91\x4e\xe5\xc4\xac\xee\xc2\xd9\x60\x0f\xde" + "\x2d\xfa\xae\x02\x5b\x59\xa9\x4c\x64\xbe\x10\x2e\xf7\xe7\xa7\x45" + "\xc1\x1b\x6c\xf1\xc6\x7c\x5a\x8f\x63\x52\xd0\x23\x9c\x36\x7b\xea" + "\xa1\x16\xd9\x7d\xf5\xe5\xc2\x5c\x43\x6b\x1b\x9e\x57\x6a\x91\xcd" + "\xfe\x6d\x6f\xf1\xc4\x2a\xed\x86\x08\xf8\xfe\x7d\x9f\xe6\x38\xe8" + "\x69\x53\xf6\x3d\xa0\xef\x84\xf4\x76\xb6\x07\x5e\xf8\xbf\x81\xed" + "\x5b\x12\xfe\x3f\xcc\xe6\x6e\xef\xab\xc7\xdf\x7a\x8e\x01\x5c\x85" + "\xab\x0f\xf3\xe1\xad\x76\xb6\xee\x36\x7b\xc7\x7b\xbc\x95\x8b\x48" + "\x27\xa3\xb4\x1b\xde\x87\xf2\x67\x5b\xbd\xc7\x8b\x52\x5e\xe1\xdd" + "\x91\xbf\x41\xde\x97\x85\xb9\x9d\xd9\x76\x69\x5e\x9a\x42\x1b\x5e" + "\x60\xb6\x52\x1c\xea\x36\x66\xf3\xdd\x97\x8a\x7e\x3a\x9d\xca\xe6" + "\x7a\xa7\x61\x5f\xbd\xcb\xd0\xda\x46\x8b\x5b\xed\xe1\x4e\x19\x61" + "\xe7\x07\xee\x7b\xf5\x26\x07\xce\xb9\x7d\x8c\x79\x9f\xe0\x47\xaf" + "\x2f\xb8\x31\x93\x70\xa6\xb4\x2f\xf1\xb9\x9c\x16\xe6\x44\x99\xdb" + "\x1b\x88\x29\x4d\x28\xab\x8c\x16\x16\xd5\xf0\xa3\x0b\xaa\x2b\xd0" + "\x56\xcd\xc4\xb9\xa2\xcf\x30\xfd\x6a\xe0\x0b\x8c\x09\xee\xcb\x92" + "\xea\x82\x31\x03\x8c\x40\x3b\xb4\x23\xf1\xbc\xf7\x22\x97\x0b\x7d" + "\x53\xc1\x98\xe8\xbe\x7a\xc6\xaf\xfb\x92\x51\x6e\x8b\xdf\x7d\x8b" + "\x0f\x9f\x58\x56\xb7\x10\xd7\x76\x15\xe8\xeb\xe7\xb4\x70\x3e\xd4" + "\x89\x71\xfe\x50\x5f\xb2\xbc\x9e\xbc\x5b\xb9\x24\x75\xd1\x86\xd4" + "\xd5\x69\xe9\x8b\x9e\x4b\xbd\x43\x0b\x03\x39\xed\xea\x65\xda\x95" + "\x4b\x57\xae\x4e\x5b\xdf\xdf\xde\x54\x74\x17\xfe\x22\xd2\x2a\x9b" + "\x2d\xd8\xac\x1f\x81\x0d\xcb\xe6\xc1\xe3\x6d\xc8\xeb\x1d\xbf\x63" + "\x71\x25\x20\x4f\xac\x95\x54\x0a\x7e\xca\xf8\xd2\xe3\x0a\x5a\x56" + "\xa9\xdf\x8a\xe7\xdc\x9f\xc3\x31\x83\x9d\x98\x49\x07\xd4\x8d\xc5" + "\x18\xac\x43\x5f\x0c\x19\x59\xd4\x94\xd1\x81\xfd\xa0\x0d\xfa\x8b" + "\x03\xfa\x41\xd5\x59\xe3\xfe\xf8\x16\x59\x7c\xf5\x59\x63\x53\x9b" + "\x14\x07\xc8\x65\x68\x8e\xe7\x95\xb6\x64\x8c\x03\xd4\x4b\x35\xa4" + "\x16\x68\xd9\x63\x98\xb8\x05\xf4\x40\x41\x79\x3e\xe8\x31\x18\x6b" + "\x08\x3e\x20\x2a\xff\x1a\xed\xa2\x3a\xb9\x2b\x9f\x28\xe0\x1e\x4e" + "\xc3\x5b\x4b\x7a\x95\xcd\x56\x7c\x8f\xf1\x7f\x5c\xbd\x3a\x92\x7d" + "\x94\xf2\x0b\xf4\x80\x9b\x7c\x42\x85\x98\xab\xfa\x93\x04\xd2\xc7" + "\xf2\xc5\xcd\xa9\xc7\xe3\x09\x87\x79\xc1\x4e\x22\x0b\xe1\xff\xac" + "\xc5\x44\x05\xf9\x22\xb2\x3e\x82\xf4\x6e\xdd\x58\x67\x8e\x4e\xd1" + "\x93\xa3\x1b\xdb\x4b\x75\x4a\xb3\xcd\x41\x7a\xaf\xfd\x6b\xdc\x0d" + "\x76\x22\xdf\x01\xf6\x54\x39\x0f\x7d\xb0\xac\x32\xd1\xb5\x51\x37" + "\xda\xb9\x51\x27\xef\xed\xd5\x29\x9c\xeb\x74\xf2\x9e\x75\xba\xd1" + "\xbd\xdd\x3a\x85\x39\xc5\x4e\x3e\xb6\xef\x23\x75\xb6\x36\x61\x9e" + "\xb2\x57\xd5\x5a\xd6\xab\x6a\xce\x52\xda\x48\xe4\x8d\xa9\x60\x57" + "\x81\x9d\xb9\x13\x6c\x6a\xc0\x84\xd2\xf9\xea\x5f\xa3\xa9\xb1\x35" + "\x0e\xe8\x7b\x70\xf6\x75\xf4\x1b\x57\xe1\xdc\x5c\xed\x03\x20\xaf" + "\xf2\xe4\x51\x90\x06\xf8\x59\x60\xa7\x85\xbf\x8a\x85\xf1\xbd\x16" + "\xae\xa9\x56\xc6\x07\xb0\xe5\x1e\x8a\x81\xe7\x28\xcc\xcb\xf2\xfd" + "\xb2\xc0\x2a\xdc\x13\x8e\x0a\xb1\x51\x0b\xef\xb3\x94\x0b\xe3\xbe" + "\x78\xab\x64\xaf\x1f\x96\xfb\x3e\x4b\xdf\x5d\x78\xbf\xbc\x6f\xfc" + "\xcc\x83\xcc\x31\x1e\x4b\xf4\x29\xcb\x8b\xc7\xcd\xc3\x75\x56\x1e" + "\xe8\x76\x5c\x76\xff\x73\xe8\xff\x8a\xe6\xc4\x8b\x63\xd6\xfb\x85" + "\x79\x2c\x3c\x7f\x8e\xf3\x1a\x62\x1a\xf3\xe3\xce\xc5\xa1\xcf\xff" + "\x43\xe8\x73\x0c\xe7\x31\x00\xd7\xd5\x56\xd9\xfd\x5b\x80\x0e\xa3" + "\x60\xbc\x57\x05\xd7\x21\xb8\x4c\xbf\xc1\xf9\x8d\x7c\x32\x5b\x9a" + "\xfb\xf1\x53\x57\x18\xff\xfe\x71\x96\x7b\xfc\x7b\x3f\x8c\x7f\xef" + "\xd7\x04\xbf\x47\xf1\x7e\xd3\x20\xf3\xd0\x72\xf4\x9d\x4b\x8b\x8f" + "\xe5\x96\xf0\x7d\xbe\x76\x41\x37\x3c\x70\x29\xc8\x89\x5c\xe1\x9d" + "\xa1\xd9\x9e\xfd\x2d\x09\xc3\x77\x55\xb8\x27\x03\x9e\xb5\x69\x32" + "\x6a\xee\x72\x90\x12\x5c\x97\x88\xaa\xd4\x57\x9d\xb1\x73\xd8\x2f" + "\x70\x6d\x07\x7e\x7b\x43\xc9\x19\xb1\xdc\xd2\xe3\xea\x9c\x35\x44" + "\x88\x61\x82\x71\x90\xb0\xbf\x94\x64\xc3\xd8\x12\x63\x36\xa5\xa1" + "\xac\x7e\x60\x39\xfc\xaf\xc0\x7c\x54\xd9\x6c\xe7\xa1\x0c\xe8\x37" + "\x49\x54\xd5\xdc\xc0\x1b\x9b\x93\xa1\xef\x68\xe9\xe4\xca\x6a\x7e" + "\x47\xab\xa3\xbb\xf0\x01\x68\x7f\x3c\x8b\x3f\xad\x70\xec\xc5\xb9" + "\x13\x17\x8c\xe1\xeb\xf6\x3a\x09\xbd\xc7\x49\x8e\xa4\x9f\x26\x76" + "\xd5\x44\x83\x5d\x65\x8b\xb7\xab\x5a\xe3\x5c\x2a\x5b\x09\x5c\xdb" + "\x53\xd3\x70\x4d\xfb\xc1\x82\x3e\x1f\x9d\xdf\x0e\xee\xa3\x13\xca" + "\x9c\x2a\xf9\xe9\x74\xad\x0b\xde\x47\xa7\x8b\x6b\xc9\x2c\xcf\x18" + "\xda\x47\x27\xd8\xac\xf5\x60\xaf\x9a\x24\x7f\x2a\x2e\x61\x8f\x3c" + "\x51\xba\x54\xcd\xd5\x82\x4f\x96\x4c\x93\xe0\x57\x05\x6d\x57\xd4" + "\x35\xdd\x85\x0f\x9a\x24\x7b\x14\xe5\xa7\xcb\x38\xb1\x14\xae\xed" + "\x90\xde\x60\x95\x2d\x52\x4b\xb2\x15\x74\x2e\x71\x8d\x35\xc6\x0a" + "\x6b\x62\xbd\xfa\x99\x98\x17\xe8\x88\x73\xb7\x61\xae\x5e\xfd\x74" + "\xb8\x66\xc0\x75\x97\xcb\xd8\x64\x77\x19\x5b\xb5\x2e\xe3\x7e\x18" + "\x0b\xed\x57\xc0\xa5\x84\x4b\x0d\x57\x24\x5c\x1a\x6a\xdc\x1f\x05" + "\x77\x7c\x3f\x15\x2e\x1d\x5c\xd3\xe0\x8a\x86\x2b\xc6\xb5\x03\xbd" + "\xec\xc9\xa3\xe0\x9a\x0a\x17\xe4\xb1\x6d\x81\x2b\xc9\x65\x6c\xae" + "\x67\xe7\x51\xe7\xac\x90\xb0\xea\xdb\xd7\xc1\x0c\x16\x97\x61\x54" + "\x33\x8d\xc0\x98\xc1\x59\xa7\xd1\x47\x5f\xc3\x11\x5d\x57\x70\xf1" + "\x39\x64\x73\xca\xfc\x61\x1b\xcb\x07\x39\xd3\x1b\x64\x79\xed\x7e" + "\xe7\x61\x34\xc7\x15\xce\xa8\xca\x2a\x67\x3e\xc9\x05\xd9\x26\xab" + "\x4b\xb6\x91\x04\x3b\xc9\xa9\xb1\xf5\x90\x9c\x14\xea\x12\xe4\x40" + "\x16\xc6\x81\x79\xbd\x1d\x71\xee\xa2\x49\xda\x5e\x43\x93\xc3\xa5" + "\xb4\x69\xa9\xd2\x96\x24\xf8\xfd\x03\x79\x82\x71\xd0\xfa\xc6\xb5" + "\x88\x3b\x18\xdb\xd6\xb6\x9f\x26\x1b\x53\x28\x5f\xab\x07\x1b\xad" + "\x01\xc0\x27\x23\x7b\x04\xfc\x89\x63\xdb\x07\x2d\x34\x17\xf0\x74" + "\x89\x0b\xe8\xc6\xe3\x98\x16\xb0\xb7\x2b\x83\x44\x4b\xf8\x03\xbd" + "\xae\x96\x62\x47\xd1\xd1\x73\x72\xe1\x9d\x1c\x63\x4b\x95\xc1\xd8" + "\xb6\x2c\x83\x4c\x2d\x83\x77\x42\x1c\x50\xa8\xf7\xdc\xd4\x08\xca" + "\x3f\xab\x23\x15\xcf\x10\x85\xea\x24\x8b\x2d\xeb\x02\xda\xbb\xe3" + "\x2b\xec\x8f\x7f\xe8\xa4\x96\x1c\xd1\x35\x82\x7e\xae\x02\xbe\xec" + "\x8f\xef\x05\x1d\x06\xb4\x74\x05\x47\xcb\xb9\xb1\xe7\x8a\x96\xbd" + "\x51\x95\x89\x8c\x9e\xc9\x04\x69\xd6\x9f\x9e\x48\xe3\x0d\x36\xa0" + "\x27\xd0\xd5\x7c\xd4\x05\xe3\x53\xb2\x58\xa2\xe7\xcb\x40\x4f\xa0" + "\xa9\x06\x69\x0a\xf4\x10\x68\x4a\x45\x9a\x56\x78\xd0\x14\xe4\x97" + "\xe0\x23\x11\x69\xca\x03\x4d\x2b\xfc\xd0\xb4\x6f\x8e\x00\x68\xba" + "\x2b\x20\x9a\xee\x1d\x06\x4d\x13\x0c\xfe\x68\xea\x44\xdb\xa1\x78" + "\x7f\x1c\x05\xd9\x68\x76\x7e\x2c\xf8\xfb\x04\xbb\x6f\x3b\xd8\xaf" + "\x25\xbc\xb2\x39\x1e\x63\x85\x63\xbc\x33\x8c\x65\x26\xf8\xa7\xda" + "\x4b\xcf\xba\x8a\x5b\x77\x63\x1a\xc8\x36\xfd\x4d\xb8\xcf\x29\xd5" + "\x0a\xfa\x8b\x1e\xaa\x3b\x83\xf3\x6b\x8f\x1c\xe9\x41\xdb\xbb\xb8" + "\xb5\x99\xa7\x7a\x82\x72\xe5\xc9\xeb\x88\xbc\x07\x64\x47\x6a\x06" + "\xb9\xaa\x04\xe4\x61\x8f\xd1\xb6\xfd\x84\x2c\x31\x79\x76\x2a\x4f" + "\xe1\xca\x41\xbf\x95\x3c\xc8\x5d\x90\xe7\x02\x7f\x91\x67\xb8\x6e" + "\x58\xfb\x24\x9e\xa3\x79\xf8\xe1\x4f\x92\x9d\x24\x47\x3f\x90\xbf" + "\x7c\x4e\x92\xd6\x65\x18\xba\x9f\x60\x3c\xc5\xac\x36\xe4\x6b\x15" + "\x31\xdb\xdc\xfd\x84\x17\xe5\x34\xf2\x02\xfb\x05\xf6\x91\x6d\x1e" + "\xf2\x19\x64\xbf\xba\x5c\x8c\x2f\xe2\xca\x07\xf9\x8c\x7e\xec\x81" + "\x97\x18\x77\xc4\x67\xff\xd8\x08\xfd\x63\x83\x10\xfb\x49\x03\xf4" + "\xa8\xea\xe9\x66\x3c\x44\x9e\x99\x9d\xd5\x02\xff\x4a\x44\x7d\xc0" + "\xe8\x6e\x7b\x9c\xd2\x24\xb0\xe9\xee\x6d\xe0\x8b\x5b\x4b\x68\xb7" + "\x7e\x2c\xc6\xff\xda\x75\x0a\xf0\x94\x02\x36\xd4\x37\xa0\x2f\x56" + "\x01\xbe\x4e\x91\xa9\xbb\x56\x81\x5d\xd4\x8d\x31\xdc\xa0\x3e\xeb" + "\x59\xec\x5b\xbe\x70\x8e\x0d\xde\x09\x7e\x38\x79\xc9\x0f\x67\xa7" + "\x0e\xe7\x36\xdc\x73\x4e\xab\x75\x9c\xfb\x9b\x93\x52\x5d\xca\x7b" + "\x1b\xd8\xb9\xd9\x47\x04\xff\xe3\x54\xd1\x8b\xe7\x17\x49\xbb\xec" + "\x91\x39\x6c\x6e\x98\x58\x52\xb3\x71\x3f\xd3\x23\x32\x5a\xac\xa8" + "\x4f\xc5\x38\xde\xd2\xbb\x9c\x24\xa4\x43\xea\x8d\xb9\x24\xd7\x65" + "\xbc\xd7\x81\xf1\xdd\x71\x7f\x45\x70\x58\x7c\x44\x38\x67\xe0\x32" + "\x4c\x4a\x07\x3a\xc5\xf1\xc5\x93\xb2\x40\xa6\x44\xd3\x67\xa1\xad" + "\xcf\x40\x5b\x4f\x00\x5d\x4f\x40\x5b\xd7\x89\x6d\x15\xe3\xda\xf1" + "\x40\x7f\x78\xe7\x5b\x3f\x4a\x6d\x7d\x16\xe8\xbd\xc5\xb1\x77\xd3" + "\x49\x32\x91\x82\x4d\x5e\xdb\x2e\x9c\x59\xea\x36\x3b\x1b\x09\x7e" + "\x57\xd0\xdf\x86\xfd\x9a\xf9\x80\x47\xa4\x39\xd8\x0c\xb9\x34\xbc" + "\x39\x55\xe2\x03\xd6\x87\xf6\xea\xc7\x56\xac\x82\xfa\x20\xed\x4f" + "\x91\x69\xd8\x9f\x81\xf6\x53\x2b\x90\xfe\xde\xb1\xa5\x23\x05\x1e" + "\x8c\x06\x1e\xac\x12\x79\x60\x14\x79\x00\x36\x33\xe8\x62\x9c\xeb" + "\xd1\x54\xe4\x33\x1e\x04\x47\xa3\x5f\x4e\x1f\xe1\xfe\xfa\x8a\xff" + "\xfe\xfa\xe8\xfa\x1e\x36\x96\x96\xa1\x3f\x50\x18\x27\xfc\x93\xef" + "\x85\x7e\x5b\x2c\xf6\x5b\xaa\xbf\x4b\xea\xb3\xc7\x65\xf3\x2e\x0d" + "\xac\xcf\xce\x1f\xf5\x03\xed\xb3\x91\xe7\xb6\xcf\xce\xaf\xf5\xee" + "\xb3\x8f\x12\xef\x3e\x3b\xff\x2d\x77\x9f\x15\xdf\x8d\x48\x9f\x9d" + "\x5f\xf3\xdd\xf4\xd9\xf9\x35\x3e\xfa\x6c\x41\x00\x7d\x56\xe3\xa7" + "\xcf\x6a\xce\x5d\x9f\x7d\xd4\x7e\xfe\x74\xec\x82\x9b\x7b\x38\x1f" + "\x3a\x76\xa3\x87\x8e\x55\xa1\x8e\xfd\xd5\x61\x5f\xfd\xb5\xb7\x0c" + "\xfa\xab\x52\xec\xaf\x0b\xfe\x13\xca\x4b\x7a\xef\x63\xcb\xd0\xfd" + "\xd5\x59\xe6\xb6\x9f\xfc\xf6\x59\x3d\xf6\xd9\xbd\xc4\x6c\x15\xfa" + "\xec\x62\xa9\xcf\x96\x89\xe3\xa1\x41\xfa\x6d\xa4\xbf\x7e\x8b\xb1" + "\xbe\x30\xce\xd7\xa0\xfd\x56\xb4\x97\x7a\x27\x63\xbf\x35\x5d\x60" + "\xba\xf6\xb1\xe7\xbd\xfb\xed\x63\x87\xbc\xfb\xed\x63\x2b\xdd\xfd" + "\x56\x7c\x37\x22\xfd\xf6\xb1\x82\xef\xa6\xdf\x3e\x56\xf0\xfd\xd1" + "\xb5\x0b\xfc\xfa\xf9\x1e\x79\x5d\xfb\xc4\x49\xa1\xdf\xfa\xd3\xb5" + "\x39\xa2\xae\x55\xa1\xae\x7d\x3c\x2f\xb0\xbe\xbb\x70\xfd\x0f\xbc" + "\xef\x9e\x63\x9d\xfb\xc4\xdd\xde\x7d\xf7\x89\x74\xef\xbe\xfb\xc4" + "\x75\xee\xbe\x2b\xbe\x1b\x91\xbe\xfb\x44\xdc\x77\xd3\x77\x9f\x88" + "\xfb\xfe\xe8\xdc\x27\x53\xfc\xf5\x5d\xed\x14\x92\xdb\x22\x7b\xf2" + "\x3d\x73\x99\xb0\x37\x30\xd7\xec\xbc\x43\xdc\x3b\xfe\x64\xab\x59" + "\x13\x4b\xf8\xe2\x48\x21\xde\x05\xee\xa5\xf9\x8d\xc7\x5e\x15\xb6" + "\xb7\x62\xd1\x28\x69\xaf\xcd\x2e\x31\x26\xc6\x60\x7b\x6d\xa8\x61" + "\xe2\x76\xf1\x77\x71\x0c\x1b\x13\x4b\xa5\x67\xe6\x8f\x6b\xd1\x2c" + "\x6a\x9c\x58\x62\x57\x4d\x2c\xf1\xb7\x5e\x14\x9e\x47\x29\xc6\x92" + "\xea\x9c\xf2\xb6\xb5\xb3\x88\x90\x12\x61\x2d\x66\x51\x16\xb4\xf1" + "\x15\xb6\xc7\x62\x81\xa9\x33\x3f\x91\x40\x5a\x89\x94\x26\xc4\xd7" + "\xce\x0f\xa3\x3c\xbc\xa3\xc5\xfb\x0e\xec\xca\x26\x0a\xf4\x71\x7a" + "\xe3\x19\xc4\xe2\xa2\xdd\x20\x23\x22\x31\x1e\x15\xc6\x00\xa1\x97" + "\x5f\xd9\x55\xd1\x41\xe4\x75\x05\xc2\xfc\x33\xee\xd1\xd9\x5d\x8c" + "\xf8\x0f\xbb\xbe\x94\x72\x72\xc2\x97\x57\x1e\xa2\x2a\x5b\xa9\xb0" + "\x27\x18\xb0\x22\xed\xdb\xc1\x58\x6e\xfc\xe4\xca\x24\xc9\xc7\x26" + "\x85\xfa\xfd\x2d\xdb\xce\x61\x1c\xf4\x8a\x34\xa2\x86\x4b\x49\x8d" + "\xb6\xd2\xee\xc2\x64\x9d\x34\x9f\xe8\x77\x7f\x37\xc6\x08\xbe\x52" + "\x23\x17\xf7\x08\xe1\x59\x61\xc1\x87\xee\x36\x8e\xdf\xe2\x82\x74" + "\x9a\x9f\x23\xc4\x04\x8b\x00\x5a\xe0\x9e\x5c\x8c\xd5\xc4\x57\xbc" + "\x6d\xdd\x7c\x05\x21\xaf\x6f\x68\xe3\x70\x3f\x88\xeb\xf7\x57\x76" + "\x99\xb2\x6f\x11\x62\x65\xa3\xaf\xf2\xe3\xb2\xc5\xd7\x26\x7c\xcd" + "\xe2\x01\xc3\xff\x37\xe3\x1a\xcc\x43\xf0\x8c\xfb\x03\xf8\x4e\x8d" + "\x1c\xf3\x1e\x97\x25\x37\x9a\x32\xbe\x24\x11\xa9\x44\x51\x0c\x6d" + "\x63\x79\x93\x0f\x74\x09\xfe\x73\x16\x0b\xfb\x6e\xe1\xd9\x84\xeb" + "\x06\xf0\x3b\x05\xee\x83\xa2\x65\x95\x87\x04\xf9\x60\xb0\x95\x42" + "\xfb\x0f\xb1\xfd\xac\xb6\xd2\x6d\xd0\x66\xc8\xa3\xc4\x3d\x3f\xc2" + "\x3d\x9b\xa8\xb7\xa7\xa1\xcf\xd6\xc5\xd1\x70\x57\x9a\x56\xe1\x7e" + "\x95\xe4\x32\x2c\xdb\xff\xb9\x01\x5b\x29\xcd\x97\x13\x76\xfe\x48" + "\xf6\x69\x8b\x6c\x71\x7d\x84\x8c\x52\xf8\x66\xd2\x66\x9c\xe7\xc6" + "\xbd\xda\xc2\xfe\xf3\xc5\xaf\x41\xf9\xf2\x5d\xc2\x3c\xee\xe2\x2d" + "\x56\x59\x72\x4c\xdf\x3e\x7f\x61\xcd\x69\xb1\x15\xbf\x83\xbf\x11" + "\xf3\x8b\x7e\x48\x6c\x80\xbf\x30\x0a\xcf\x1f\xb1\xfd\xdc\x8a\x3f" + "\xc3\xef\xab\xdd\xfb\xd8\x84\xdf\x01\x96\x16\x5b\x80\x67\xc2\x9e" + "\x1b\x7c\xf6\xbb\x57\x5a\xe4\x5b\x2d\x8c\xdc\x07\xf0\x4e\xc2\x08" + "\xe0\x42\xc2\x08\xd6\xf7\x8d\x6c\x2b\xc7\xd6\x38\x9e\x12\xf6\xad" + "\x15\x03\x0f\x5d\x2f\x6b\xe4\x82\x2f\xf3\x5e\xe4\x0b\xee\xb9\x5f" + "\x72\x35\xf2\x65\x1b\xe8\x02\x31\xef\x2c\x77\xfd\xf1\x79\x89\xc0" + "\x4f\x1e\x78\xc1\xf6\xfe\x3f\x75\x5a\x88\x8b\x03\x32\x03\xf7\x9d" + "\x1f\x86\xd6\x52\xc4\x2d\x60\xe4\xf5\x34\x07\x57\x91\xc1\xd2\xff" + "\xd6\xe1\xe0\x70\x2f\x09\xce\x87\x1b\x9f\x21\x72\x9c\x57\xc7\x32" + "\x69\x54\x65\xd2\x4d\x12\x1f\x37\x00\xef\x32\x00\xbb\x40\xf3\x6d" + "\x40\xbf\x8a\x1e\x61\xcd\x2a\xa9\x82\x27\x4a\x1e\xf2\x59\x65\x4b" + "\xa2\xa1\x3c\x75\xf9\x65\xd4\x8e\x7b\xbd\x81\x86\xff\xe8\x2e\x5c" + "\xd2\x77\xfe\x01\xeb\x84\x7b\xb5\x8d\xc2\x9e\xfd\xa7\xb6\x30\x0c" + "\x3d\x95\x24\xb5\xd9\x1f\x3d\x8d\xaf\x93\x28\xe3\x8d\x24\x96\x57" + "\xce\x68\xa0\x61\x57\xee\xc6\xf9\xe6\xb9\xed\x84\xa0\xef\xfe\x84" + "\xe7\x9b\xa9\xd9\xee\x22\xbc\x6a\x46\x03\xae\x4f\xb8\x36\x5f\x3f" + "\x21\x61\x3d\x9e\xb1\x68\x72\xe4\x38\x88\xda\x9c\x6d\x67\xf1\xdb" + "\xc8\xb7\xc4\xb5\x16\x64\x38\xc8\x75\xd0\xa9\xf2\x9c\x6f\xc9\x24" + "\xa4\x17\xaf\x6a\x72\x00\xcd\xbe\x9a\x9f\x4e\x72\x83\x93\xa3\x4b" + "\x04\x7f\x4c\x68\x5f\x80\xcc\xe7\x70\x8f\x9e\xd9\x0e\xf6\x89\xb1" + "\xc9\x11\x64\x39\x03\xf6\x5b\x7b\xb6\x9b\xc7\x79\x68\xb1\xcd\x09" + "\xd8\xe6\x2e\x07\xc1\xb9\xfc\xb9\x6b\xd0\x47\xea\x69\xc2\x1b\x67" + "\x34\x60\x9b\xc1\xd6\xc9\x0c\x7e\x4e\x3f\xc5\x6f\x8c\x6f\xfc\x36" + "\x05\x7a\xf3\x9b\xaf\xdc\xcd\x2b\x6d\x99\xf8\x6d\xac\x03\x9e\xd9" + "\x99\x7b\x9a\x08\x74\x47\xfa\x9b\x1d\x2e\x42\x55\x9e\x75\x70\x06" + "\x5b\x07\xff\xed\xbf\x91\x44\x19\x5e\x67\x7c\x77\x6d\x16\x69\xa0" + "\xc7\x75\x32\x5b\x26\xfa\xee\x9f\x8b\x75\xb0\x9f\x24\x0f\x9d\x24" + "\x02\xff\xcd\xba\x76\xe2\x0a\xbb\x7e\x02\xee\xbd\x40\xfe\x67\x3b" + "\x81\xff\x67\x1c\xe8\xd7\xc4\x6e\xce\x3d\x4b\xd0\x7e\x71\x76\xea" + "\xb8\x81\xfc\x5f\xfa\xd5\xfc\xcc\x60\xf9\xbf\x74\x84\xf8\xbf\xf4" + "\x02\x68\xff\xb2\x10\xda\xbf\x6c\x84\xda\xbf\xec\x02\x68\xff\xd3" + "\x21\xb4\xff\xe9\x11\x6a\xff\xd3\x7e\xdb\x7f\xef\x24\x9e\x0a\x7b" + "\x72\xc2\x8f\x25\xa3\x0e\x60\xfa\x4a\xff\x05\xee\xbf\x11\xce\x68" + "\x89\xcf\x84\x9d\xd9\x52\xf4\x7b\x56\xf6\x7b\x56\xf7\x7b\x8e\xec" + "\xf7\xac\xe9\xf7\x1c\x25\x3d\x83\x1e\x19\x75\x4a\xa6\xbf\x1f\xec" + "\xd2\x5c\xab\x4c\x6f\x13\xdf\x4f\x45\xbf\x3f\xa0\xd3\xa7\xfa\x8b" + "\x21\xa8\x92\x11\xda\xcb\x51\x22\xc4\xf6\x93\x2d\x4f\xea\xc9\x27" + "\x94\x86\x5d\xa1\xc3\xf8\x6b\xbc\x61\xff\xd4\xb9\x20\xa7\xcd\x76" + "\x07\xd8\xf9\x9a\xd1\x50\xf6\xe5\x18\x57\x12\xf9\xaa\x4d\xc3\xfd" + "\x35\xcb\x67\x63\x3b\x6f\x4c\x35\x11\x3e\xec\x7a\x61\x7f\x03\x6f" + "\xdc\x3f\xd5\x1e\x76\xfd\x15\x74\xc7\x71\x62\xcc\xe7\x15\xe6\xf6" + "\xa3\xa4\x98\xe3\xb5\x59\x59\xc0\xdf\xf6\x37\xc9\xc6\x76\xda\x96" + "\xe5\xa4\x0e\xf3\x42\x13\xc9\xb1\x63\x5c\x96\x6a\x52\x67\x3f\x2a" + "\xc4\x66\x11\x62\xd0\xd8\xdf\x24\x68\xff\xe4\x60\x1e\x48\xab\xb3" + "\x1f\x20\xb5\xf0\x6c\x5a\xd5\x0a\xed\x5c\x7e\xda\xdc\x7e\x00\xc6" + "\x4b\xfb\xb5\xbc\x72\x3f\xd8\x1b\xfb\x15\xb5\xed\x18\xd3\x65\xbf" + "\x12\xeb\x5a\x07\xf5\x30\x3b\x0f\xe1\x38\x4b\x29\x94\xdb\x55\x2f" + "\x8c\x49\x71\xdd\x96\x57\x41\x7e\xd5\x7e\x05\xd6\x0f\xeb\xe6\xdb" + "\xde\x3d\xb6\x1d\xea\x7e\xc7\x7c\x9d\x9c\xe0\xb9\x8a\xe0\x30\xf2" + "\x8c\xc6\xbf\x1d\x6d\x89\x64\xe5\x2a\x42\x29\xd7\xaf\xfc\x87\x72" + "\xc5\xfa\xaa\x43\x29\x77\xc0\x9e\x74\x77\xb9\x8d\x62\x7d\xb5\x21" + "\x94\xfb\xac\x76\x90\x72\xc5\xfa\xc6\x85\x52\x6e\xa6\xff\x72\x9b" + "\xc4\xfa\xe6\x86\x52\xae\x7f\xff\x0f\x80\x87\xd0\xb0\xb0\x62\xea" + "\x60\x58\x08\x0d\x07\x2b\x06\x69\xbf\x65\x7b\x68\x18\x58\x51\x33" + "\x18\x06\x42\xe3\xff\xca\x41\xf9\x1f\x1a\xef\x57\xa6\x0f\xc6\xfb" + "\xd0\xf8\xbe\xd2\x2f\xfe\x71\x6c\x00\xbc\x4f\xa4\xe1\xad\x76\xbe" + "\x78\x7f\x22\x1f\x7e\xec\x91\xcd\x7c\x1c\xb9\x77\x13\x21\x11\xa5" + "\x64\xfc\xbd\xe5\xcd\x34\x4e\x18\x73\xaf\x4a\xde\x54\x46\x38\x18" + "\x43\x73\x07\x37\x34\x70\x66\x67\x2c\xca\x2d\xd7\x2b\x19\x0e\xd9" + "\x8f\x20\xfd\x03\xd0\x83\x5d\x60\xcb\xb2\xb2\xf6\x27\x16\x67\xc7" + "\x11\xe1\xcc\x1d\x8c\x23\xe6\xae\x69\xa6\x78\x96\x39\xe1\x5b\x90" + "\xaf\xa5\xe8\x83\x91\x8c\x87\xdf\x3a\x01\xc7\x50\x8e\x83\xbc\xc1" + "\xdb\x65\x73\xed\x42\x5e\x3b\xdb\xf3\x7e\xec\x11\x1c\x2b\xd0\x1c" + "\x1d\xfa\x53\xb3\xc3\xb7\x3f\x0d\xb3\x13\xae\x42\x88\x09\xb4\xaa" + "\xc6\x2a\x5b\xfd\xae\x78\x6e\xb5\x5d\xf0\xfb\x07\x75\x47\xbf\x7f" + "\x9b\x61\xdc\x80\xf9\x6f\x4c\x25\xdc\xdf\x05\x3f\xc9\xab\x1c\xe8" + "\x0b\x70\xb0\xf3\xdf\x2e\x83\x2d\x06\x7f\x0f\xb4\x75\x64\x9f\xc4" + "\x33\xea\x76\x02\x63\x8c\xaa\x62\x18\x9f\xcc\xbe\x0e\xe7\x53\x3a" + "\x48\xf6\x26\xca\xe3\xdc\x16\x55\x36\xb5\xe1\xfe\x43\xe6\xa7\x7e" + "\xf5\x76\x1c\xeb\x8b\xb1\xa0\xae\x38\x01\xcf\xc2\x18\x09\xf7\xe1" + "\x28\xf7\x35\xd0\x62\x55\x5c\x5d\x57\x07\x61\xbe\xd6\x57\xff\x16" + "\x7d\xb2\x75\x2a\x6d\xd1\x5d\x4a\x5b\x6c\x77\xe1\xea\x12\xa9\x0d" + "\xf8\x7d\x29\x1d\xc7\x84\x98\x0f\xde\x57\x49\xe7\xc1\xfd\xc4\x4b" + "\x9e\x90\xa0\xa1\x76\xa4\x2f\xab\xcb\x9a\x4b\x91\x07\x60\x87\xe8" + "\xba\x72\x74\x53\xd8\x1c\x49\xea\x74\x1c\x6b\x43\xbd\x23\xd9\xb8" + "\x77\x7f\xa4\x10\xcb\x04\xf4\xc1\x7c\x1d\x17\xa4\x4d\x9c\x2a\xcc" + "\x25\x98\xa6\xa0\xfe\x4d\x75\x41\xf9\x77\xb6\xc8\x52\x93\xd9\x38" + "\x6f\xbf\x8e\x9d\xe9\x5c\xed\x84\x6f\xe8\xa8\x61\x5f\x3d\xe6\x83" + "\xf7\xb9\xe2\xfb\x68\x8f\xf7\xd1\xb8\x1f\x55\x7c\xbf\x5b\x7c\x1f" + "\xe3\xf1\x3e\x26\x75\x0a\xce\x7b\xa4\x56\x63\x1b\x40\xe7\xa9\xe1" + "\xfd\x54\xc1\x77\x83\x10\xa7\x72\xbf\x5a\xcc\x37\xb5\x5d\x96\xfa" + "\x55\x27\x60\x0c\xde\x4f\xf3\xf8\xfd\xb4\xbf\x67\x46\x93\x7b\xcb" + "\x91\x86\xa9\x5d\x56\xae\x69\x3b\x1b\x2b\xa7\x0a\xba\x11\x75\xa8" + "\x67\x79\x90\x6e\x42\x3d\xd9\x05\x36\x1a\xfc\xbe\x0d\xbf\xe9\x49" + "\x6f\xe9\x64\xa9\x36\x65\xe5\x62\xed\x92\xd5\xcf\xad\xc2\x93\x81" + "\xde\x67\xde\xd4\x78\x76\x96\x37\x58\x35\xe6\x52\x3c\xcb\xa7\x16" + "\xce\x8d\x6f\xc7\x3d\x5a\xe1\xad\x89\xae\x62\x9b\x95\x0f\x6f\x26" + "\xa6\x0d\xf7\x90\x53\xb2\x35\xc2\xfa\x81\x19\x24\x86\x01\xde\x9b" + "\x36\x7c\x8c\x69\x3b\x84\xb4\x14\x76\x9e\x5d\xbb\x41\x41\x0e\x6b" + "\x3b\x84\x39\x05\x78\xf7\xa9\x30\x7f\x72\x9a\x70\xce\x7c\x05\xf9" + "\x4b\x76\x3d\xf7\x2e\x6f\xe5\xfe\xc2\x37\x08\x7b\xa1\xff\xae\xa9" + "\x26\x37\x65\x2a\x30\xce\x1d\xf7\x3e\x8c\xd3\xf1\x3d\xbe\x93\xce" + "\x16\x9d\x92\xa5\x5d\x2d\xec\x8b\xbe\x86\xfd\x9f\x53\x4a\xbf\xfa" + "\xbb\xc6\x2e\x9e\x29\x5f\xf3\x1c\xd6\x15\xf7\x39\xb6\xcb\xd6\xac" + "\xc7\xfa\x59\x65\x6b\x32\xc3\xca\x70\x1f\x35\x51\x42\xfe\xa5\xbc" + "\xd1\xaa\x41\xd9\xe0\x2c\x5c\x33\x8d\xe6\x2b\x7b\xf1\x5c\x61\xd9" + "\x4b\xd2\x19\xda\xb4\x44\x8f\x73\x76\xca\x4e\x8e\xcc\x84\xb4\x14" + "\xc9\x6f\x07\xc6\x4f\xf2\x27\x6b\x1c\x60\x3f\x9e\x8d\xaa\x04\x1b" + "\xda\x0a\xbc\xb0\x6a\xaa\x67\x11\x9c\xd3\x91\xe1\xbe\xe4\x76\x59" + "\xfa\x42\xaa\xb2\x2a\xb2\xb1\x4f\x17\x37\x93\x7d\x82\x1f\xa8\xd6" + "\xc4\x03\xb8\xc7\x10\x68\xf9\x1a\x3c\x7f\x1c\xbf\x97\x68\x1f\x41" + "\x7b\x2c\xed\xf3\x07\x53\xa8\xf3\xfa\x44\x13\xa9\xb1\xfd\x99\x7c" + "\x72\xb4\x9a\x28\x17\x92\xb0\x1c\x2b\x75\x09\x6d\x4c\x27\x5c\x82" + "\x95\x84\xa1\x4f\x29\xf4\x23\x8f\x67\x34\xea\x1c\xb5\x80\x83\xd7" + "\xdb\x0f\x66\xb7\x8d\xd2\xce\x25\x60\x5b\xb1\xf5\x6b\xe1\x0c\x92" + "\x5d\x38\x17\xae\xc2\xb9\x74\x8f\xb3\x47\xed\x59\xc9\x94\xdf\x74" + "\x92\x28\x6a\xf5\x8d\x24\x21\x39\x8c\x0a\x67\x8f\x32\x21\xa3\x1d" + "\x78\xbf\x8e\xed\x13\xdc\x71\x86\x44\xd6\xa5\x5b\x89\xb9\xbd\x9a" + "\xbc\x9c\x46\x22\x69\xb7\xfe\x92\x9a\xea\x8f\x09\x2d\x9e\x59\xff" + "\x46\xb6\x69\x94\x4b\xc9\xf6\x6e\x45\xe4\xc9\x70\xee\x34\xdc\x80" + "\x7b\xb8\xce\x90\xe8\x45\xad\xb9\xc2\x7c\x2f\xce\xad\x3b\xbb\x75" + "\xda\xde\x6e\xdd\x35\x3d\xeb\x74\x53\xa4\x39\xf9\x27\x4e\xaa\x71" + "\x0d\x22\x89\x16\xa6\x1c\xc2\x73\x4b\x68\x8b\x3a\x55\xf7\x36\xe0" + "\xfc\xbb\xe0\x23\x67\x9d\x2e\x8a\x5f\xa2\x23\x37\xd9\x85\x73\x51" + "\xb8\x26\xa0\xae\x78\x0a\xeb\xda\x41\x84\x7d\x48\x2a\xb6\x0f\xc9" + "\x81\xeb\xe1\x4a\xdb\x96\x87\x96\x6b\x49\xcf\xe4\xca\x58\x73\xe6" + "\x3e\x92\x73\x96\x7e\x25\x8c\x11\x32\x01\xb7\x85\x69\x59\x54\x65" + "\xdb\x72\x44\xf7\x39\xea\x96\xd8\xe0\xe5\x43\xba\x10\xa7\x19\x69" + "\x43\x8b\x81\x5f\x1d\xc8\xb7\x66\xb2\x3f\xcd\xce\x3d\x60\xa3\xce" + "\xda\x94\x7d\xe4\x93\x86\x7a\x2f\xfe\x08\xfc\x84\x7c\xc8\x27\xe4" + "\x11\xf2\xca\xcd\xa7\xcf\x05\x3e\x1d\xe0\x19\x9f\x7a\x94\xc7\x12" + "\x25\x5e\x39\xca\x2a\xe3\x03\xe1\x57\x8d\xcd\x37\xbf\x80\xce\x7d" + "\xfc\xda\xd9\x41\x22\xcd\xed\x60\x37\x03\xbf\x1e\x78\x98\x90\x07" + "\x5e\xa3\x7c\x6d\xfc\x67\x7d\x7c\x73\x1a\xfc\xf0\xed\x6b\x37\xdf" + "\x80\xff\x83\xf0\x6d\xe9\xf4\x60\xf8\x56\x63\x63\x7c\x73\x8a\xfb" + "\xc7\x74\x87\x09\xe7\x58\xa7\xe3\x4a\xcf\x90\x58\xe4\xdf\x9c\x56" + "\x2d\x39\x32\xaf\x16\x78\xf6\x67\x2f\xfe\xf1\x46\x9b\x0e\x78\x30" + "\x15\x79\x18\x5a\xbf\x5b\x77\x34\xf0\x7e\x97\xf1\xd0\xc5\x7e\x37" + "\x52\xfd\xee\xb9\xae\xe1\xf5\xbb\x75\xbb\x2f\xf6\xbb\xef\xba\xdf" + "\xad\x2b\xeb\xdf\xef\xfa\xec\x86\xb4\xa5\x2b\x17\x2f\x5f\xb5\x7c" + "\xd5\xd3\xda\xa7\xd6\xa7\x2f\x5d\xcb\xac\x07\x2f\xfb\x41\xe3\xca" + "\x8e\xe3\x30\xae\x7c\x4d\x69\x3d\x79\xe3\x8a\x7a\xce\xf5\x2f\x8d" + "\x9c\x1a\x16\x68\x79\xc3\x82\xdd\x18\x63\x1e\xfb\x27\xc6\x9e\x3f" + "\x2e\xcb\x8e\x47\x7f\x8b\xcc\x4f\x4c\x36\xf3\xa7\x11\x55\x59\x8d" + "\x6b\x41\x9b\x37\x10\xf9\x66\x3c\xf7\xed\xc0\x39\x17\x7c\xbf\xe9" + "\x4f\xe8\x1b\x8e\x96\x57\x56\xa3\xaf\x9e\x2e\xe5\x3e\x8c\x8b\x62" + "\xb7\xab\xac\x1a\xb9\x16\xcf\xb5\x6c\x00\x3b\x6a\x8d\x47\xcc\xb4" + "\x4d\xe9\x74\xf4\xfa\x14\x94\x0b\x78\x0e\xf1\x94\x6c\xc3\xec\xb3" + "\xb8\x8e\x02\xb6\xf4\xfc\xeb\xe0\x3b\x93\x2b\xe3\x05\xbf\x12\x20" + "\x23\xd8\xfb\x2c\x21\xce\xfa\x59\x43\xb3\x60\xb7\x74\x2a\x5b\x13" + "\x3b\x0d\x36\xeb\xc7\x59\xa5\xa2\x8c\xd8\xb0\xe6\x81\x52\x26\x23" + "\x6a\x35\x80\xc1\x39\x80\xc1\xa4\xa1\x64\x84\x07\xf6\xa6\x04\x27" + "\x23\x10\x6b\x88\x39\xc4\xdb\x38\xc0\x1b\x62\x50\xc2\xdc\x6f\x44" + "\xcc\x45\x58\x88\x5a\xc0\x9d\x93\xe1\x0e\xcf\x71\xd7\x66\xba\x31" + "\xe7\xea\x8f\xb9\x33\xfd\x30\xc7\x89\x98\x5b\xe7\x8d\xb9\xc7\x1b" + "\xd5\xe4\x65\x26\x2b\xdc\x98\x33\xde\xdb\x20\xe1\x0d\xb1\x87\x38" + "\xe3\x9f\xd6\x91\xda\xf6\x8e\x3e\xec\x55\x2c\x63\x6b\xb9\xc2\x5e" + "\x61\x8e\x56\x9d\x5d\x27\xca\x8a\x93\x92\xac\xd8\xe9\x47\x47\x37" + "\x86\x28\x2b\x36\x32\xff\x2f\xc0\xab\x1e\xe0\x1b\xf2\xeb\x01\x0d" + "\xc8\x08\xcd\x1f\xc8\x27\xf3\x2e\x10\xfe\xa4\x8d\x0c\x7f\x30\x2e" + "\x37\xd4\xc5\x07\x8f\x96\xcc\x1a\x8a\x47\xc8\x1f\xe4\x93\xc0\x1f" + "\xe0\x93\xb4\xde\x8e\xeb\xaf\xc8\x2b\xe4\xcf\x8d\x59\x84\x43\x7e" + "\x55\x64\x30\xf9\x80\x72\x40\xd8\xdf\xdd\x4f\xbe\x03\xcd\xab\x91" + "\x67\xc2\x18\x3b\x5f\x75\x68\xfb\x04\x77\x1c\x9f\xee\xc2\x4d\xdb" + "\x07\xda\xd0\x9b\xf6\xba\x7d\xdf\x6d\x60\xb1\xba\x0d\xcd\xd5\xcc" + "\x66\xcf\x3e\x2b\xf6\xf9\x2a\x1c\xab\x0a\xe3\x52\x17\x8c\x4b\x95" + "\x30\x2e\x35\x34\x09\x31\x9f\x99\x4f\x86\x4d\xa7\xd9\x9a\x1e\x8c" + "\x43\x55\x4d\x6d\xd4\xb8\xaf\x01\x69\x29\xac\x1f\xab\x6c\xd1\xb8" + "\xde\x45\x8d\x30\xe6\xfd\x03\x47\xe0\x39\xf6\x88\xce\x15\x24\x8e" + "\xb2\x23\xc5\xf5\xf1\x12\xe6\x33\x31\xdb\xc6\xea\xb7\x5e\xd8\xd7" + "\x28\xac\x2d\x72\xfc\x6e\xd7\x66\xef\xb5\x45\xcf\xb5\xe7\x37\xb2" + "\xed\xe2\xba\x62\x36\xf3\xef\x85\xe3\x25\x90\x7b\x07\x61\x0c\xe3" + "\x5e\x5b\xfc\x0c\xdf\xd7\x7a\xaf\x2d\x66\x0b\xfa\x0e\xea\xe0\xc0" + "\xfd\x34\xf0\xfc\x26\x4b\x5f\x5f\xe3\x99\xee\x5e\xbb\x67\xe9\x78" + "\x86\x4b\x9c\x1b\x68\x67\xf3\x02\x39\x6a\x69\xfc\xed\xc7\x5e\x0a" + "\x42\x2e\x6f\xee\x72\xcb\xe5\xcd\xcc\xff\xa6\xa6\xd5\x51\x3b\x40" + "\x2e\xa3\xaf\xaf\xcd\x4f\xcc\x45\xb9\x6c\x68\xb2\xb3\xfa\xe5\x94" + "\x03\x4d\xc2\x30\xfe\x1e\xa6\xe3\x59\x27\x94\xd1\xe5\x82\xcc\x6e" + "\x6d\x2b\x10\xf6\x0f\xe4\xbc\xeb\x2d\xab\x37\x6b\xbd\x65\x75\xce" + "\xb7\x83\xcb\xea\xbc\x83\x83\xcb\xea\xdc\xc9\x17\x65\xf5\x48\xcb" + "\x6a\xc9\xae\x0b\x55\x56\xe7\x65\x5e\x94\xd5\xe7\x5b\x56\xe7\xa5" + "\x7b\xc8\xea\x57\xbd\x65\xf5\xe6\xb8\x81\xb2\x7a\xf3\x3c\xb7\xac" + "\xce\xa9\xf6\x96\xd5\x05\xaf\x06\x26\xab\x37\xef\x39\xb7\xb2\x7a" + "\xb3\xc9\x5b\x56\x17\x88\x71\x7a\x72\x96\x06\x2f\xab\x0b\xd6\x0c" + "\x2e\xab\x0b\xd6\x7b\xcb\xea\x82\x39\x4c\x26\x17\xbc\xc2\x64\x75" + "\x41\x32\x4b\xcf\x49\xf1\x4c\x77\xcb\x6a\x96\x3e\x50\x56\x17\xbc" + "\x3b\x84\xac\xd6\xb9\x78\x49\x56\x37\x80\xac\x6e\xe0\xf8\xa7\xfd" + "\xc9\xea\xad\x8e\x5a\x94\xd5\x69\x28\xab\xb7\x3a\x06\x97\xd5\x5b" + "\x17\xa3\x4c\x16\x7c\x7d\xfe\x8e\xda\x04\x5f\x8b\xbf\xa3\x6d\x88" + "\xd3\xb9\x59\x90\x0e\x69\xe8\x93\x12\xf3\x31\x1a\x4b\x32\xfd\xf9" + "\x35\x7d\x32\x1d\xf2\xf1\x93\xdc\x32\x1d\xe5\x39\xca\xf5\xf2\xdf" + "\x51\x6b\xc5\xef\x30\x86\xca\xf3\xa5\x92\x6c\x37\x42\x1a\xc6\x49" + "\x41\x7f\x4a\xb8\xf7\x12\x68\x60\xdb\x0c\xdf\xc3\xfc\x90\xcf\xe4" + "\xad\x03\xb6\x4e\xf5\xd6\x01\xcf\x9f\x1e\x5c\x07\xfc\xfa\x4f\x83" + "\xeb\x80\xc2\xab\x2f\xea\x80\x0b\x4d\x07\xfc\x3a\xeb\xa2\x0e\x18" + "\x5a\x07\xf8\xe2\x51\x7f\x1d\x70\x83\xa8\x03\xca\x87\xd4\x01\xbf" + "\xce\xf4\xaf\x03\xb6\xce\x1a\xa8\x03\xb6\x26\xb9\x75\xc0\xf3\x35" + "\xde\x3a\xa0\xe8\xb5\xc0\x74\xc0\xd6\x57\xcf\xad\x0e\xd8\x7a\xd8" + "\x5b\x07\x14\x89\xfb\x5c\x9f\x1f\xef\xa9\x03\xf8\xb0\x40\x74\x40" + "\xd1\x73\x92\x0e\x40\x19\x7b\x10\xd7\x1b\xfa\x74\x00\xca\xc2\xa2" + "\x4d\xa6\x8c\x16\x0f\x1d\x50\x94\xc8\x64\x7d\xd1\x5e\x97\xa0\x03" + "\x8a\x52\x58\xfa\xf3\x6a\xcf\x74\xb7\x0e\x60\xe9\x2e\x4f\x1d\xd0" + "\x86\x3a\xa0\xc8\x34\x84\x0e\x88\x0e\x5c\x07\x94\x24\xba\x75\x40" + "\x49\xa2\xa4\x03\x50\xee\xa3\x0e\x40\x99\x8d\x7a\x40\xf0\x5b\x26" + "\xec\x37\xd9\xf6\x4e\x84\x9d\x28\xd0\x4f\x31\xce\xa9\xa0\xec\x2e" + "\xee\x60\xba\x40\xc8\xb3\x8a\xe5\x01\x79\x6e\x03\x19\xde\x06\x32" + "\xbc\xcd\x78\x8a\xc8\x21\x5f\x43\x31\xee\x5d\x84\x67\x94\xf5\x11" + "\xed\xa0\x37\x9c\x82\xde\x68\x40\x7d\xc3\xe8\xb5\xed\x1d\x6f\xdd" + "\xf1\xc2\x41\x5f\xe3\x81\x12\x0f\xdd\x51\x71\x19\x3d\xda\x5d\xf8" + "\x42\xbd\xa4\x0f\x8a\xe1\x19\x75\x46\x49\x87\xa0\x33\xac\xa0\x33" + "\x6c\x4c\x67\xbc\xd0\xd5\x97\x07\xea\x20\xe4\x61\x7a\xa5\x61\x33" + "\xc6\x9c\x13\xf2\x18\x34\xde\x7a\x65\x5b\x96\xb7\x5e\x31\x3c\x84" + "\x7a\x05\xda\x80\xf1\xd9\x64\xbc\xd1\xaa\x70\x95\x57\xc6\xa3\x8e" + "\x61\xef\x8b\x2f\xe9\xd3\x2b\x97\x79\xe8\x95\x4c\x49\xaf\x18\xd6" + "\x5f\xf0\x7a\x05\xb0\x5c\x9b\xf5\x43\xd2\x2b\xc6\xa3\x17\x82\x5e" + "\x41\xde\x8c\xf3\x98\x1b\xf6\xa7\x57\xd0\x87\x45\xed\x8a\xef\xbb" + "\x5e\x31\xd6\xfb\xd7\x2b\xdb\xca\x06\xea\x95\x6d\x55\x6e\xbd\x62" + "\x98\xea\xad\x57\x5e\x94\x05\xa6\x57\xb6\xb9\xfa\xeb\x15\xa4\x65" + "\x31\xdb\x63\xd1\x8e\xfa\xc4\x65\xb4\x45\xf3\xa8\x5b\x42\xd2\x2b" + "\x25\x51\xde\x7a\xa5\xa4\x5d\x94\x61\x97\x06\xaf\x57\x4a\x84\xb9" + "\xa3\x62\x49\xaf\x9c\xe9\xaf\x57\x4a\x3e\xf7\xd6\x2b\x25\x7b\x99" + "\xfe\x78\x91\x30\xbd\x52\xf2\x2e\x4b\x7f\x21\xd2\x33\xdd\xad\x57" + "\x58\xfa\x40\xbd\xf2\xa2\x66\x08\xbd\xa2\xec\x2d\xab\x8c\xef\x31" + "\xb4\x46\x3b\x5f\x79\xdb\x3a\x6d\xe1\x55\xae\xfe\x7d\x83\xf5\x09" + "\x17\x8b\x5d\x24\xad\x71\x3d\x4a\x48\xaf\xf2\x58\x22\x2f\x9e\x8f" + "\xee\x89\xaa\x8c\x3d\xbe\x02\xfa\x47\xbb\xff\xfe\x01\x7d\x43\x21" + "\xf5\x8d\x5a\x7d\x2b\x81\xfe\xc2\xe1\x1a\xd7\x4e\xe8\x17\xe6\xae" + "\x06\x41\x8e\x29\x6d\x5a\x82\xbe\x2e\x55\xed\x44\xad\x92\xc9\x46" + "\x3f\xf8\x18\xf4\x3f\xe8\x23\xb3\xaf\xa3\xfc\xf5\x16\x2d\x51\xe9" + "\x49\x38\xf6\x93\xd7\xc5\x35\x14\xf4\x6d\x81\x6b\x27\x80\xcf\xe8" + "\x45\x9f\xb2\xfe\xb1\x13\xae\x1e\xd6\x3f\xa6\xf4\x74\xeb\xae\xf1" + "\xb7\x76\x62\xce\xb4\x0a\x6b\x27\x78\xf6\x08\xcf\x7c\xf1\xd0\x3f" + "\x28\xae\x9d\x38\x58\x9f\x80\xfa\xaa\x77\x09\x6b\x27\x2d\x5e\x6b" + "\x27\x3f\xb5\x10\x0e\xfd\x5e\xbc\xec\xb9\x76\xa2\xab\x1d\xd0\x27" + "\xb0\xaf\x60\x9f\x08\x5e\x7e\xbd\xb4\x7d\xb0\xbd\x4c\x4e\xa0\xb5" + "\x4b\xd9\x1a\x4d\x77\x1e\xd7\xee\x6f\x71\xc8\xd0\xc7\xa8\x0b\x78" + "\xc7\x83\x9c\xa2\xca\x7e\x72\xaa\x57\xe4\x43\x2f\xe3\x03\xf0\x50" + "\xf1\x64\x17\xa1\x8b\x9c\x60\x6b\xf5\x8a\x7e\x46\x1d\x56\xc0\xa1" + "\x6e\x42\xf9\x06\xa4\xbb\x86\x94\x8b\xbe\x46\xf9\x8d\xfa\x4b\x78" + "\xa0\x35\xcd\xe7\xc8\xc1\x33\x0e\x61\xad\xd1\xd0\x43\xa6\x81\x5c" + "\x52\xa1\x5c\x02\xec\x8e\xdd\xd5\x03\x74\xff\x8a\xd1\x1d\xfd\xd8" + "\xe1\xdd\xb9\x51\xa7\x85\xb2\xaf\xe9\xed\x05\xb9\xe4\x60\xb4\x7f" + "\x72\x8d\x9a\x08\xfe\x49\x71\xbd\x11\x74\x7d\x1d\xf0\x1b\xe5\xd2" + "\xdc\xae\x08\x8a\xb1\x44\xf8\x7f\xe9\xd0\xa7\x57\xd4\x4d\x5d\x18" + "\x3b\x46\x87\xd8\x50\x57\x1c\xc7\xf5\xc6\x2f\xbd\xd6\x1b\xed\x1b" + "\xdd\xeb\x8d\x75\x7b\x3f\x67\xfb\x43\xbc\x74\xc7\x8b\xd3\x7a\xcb" + "\x2b\x63\x91\xee\x82\xee\x48\x0f\x96\xf6\xdb\xfd\xfa\x4a\x3f\xf7" + "\xb4\x57\x7f\xcf\x69\xff\x92\x65\x78\xb4\xff\xad\x5f\xff\x2f\xe7" + "\x9e\xf6\x8a\xef\x39\xed\xb7\x27\x0d\x8f\xf6\xbf\x57\x0c\x46\x7b" + "\x1c\x7b\x48\xe3\x0e\x69\xcc\x81\x7a\x8c\xe9\xe1\x1d\x65\xee\xf1" + "\xc6\x8e\x32\x69\xdd\x16\x68\x26\x37\x8a\xf3\x4d\xa9\xcb\x30\x1e" + "\xc6\x8e\xf1\xd2\x9a\x2d\xda\xfb\x02\x1f\x77\x02\x1f\x57\xe1\xd9" + "\x21\x91\x87\xa0\x73\x16\x75\x81\x5e\x98\x5c\x19\xef\x32\x82\x4e" + "\x7a\xf5\x6d\xab\x1f\x7e\x72\xa8\x4f\x54\xe9\x44\xfd\x64\xaa\x9b" + "\xaf\xfc\x46\xe0\x67\x0f\xd8\x59\x8e\x36\x82\xe7\x81\x23\xda\xc0" + "\xfe\xea\xd5\x5f\xb2\x10\xec\x79\x89\xa7\xaf\x67\x38\x04\x1b\xcb" + "\x27\x4f\x77\x78\xf3\xb4\xd3\x07\x4f\x9f\x58\x0e\xfd\x94\x13\xed" + "\x60\x81\xa7\xd6\x3e\x9e\x0a\x7a\x64\xa3\x2e\x0a\xf9\x2a\xf1\x14" + "\xf5\x88\xc0\xd3\x76\xa6\x47\xfa\x7c\x27\x6d\x74\xdb\xc1\x35\xc9" + "\x8d\x3e\x78\xfa\xdb\xa3\x5e\x3c\x4d\x0e\x96\xa7\xa5\x16\x6f\xbb" + "\x6a\xe7\xfd\x81\xd9\x55\x3b\x1e\x43\xdb\xc9\xd3\xae\xc2\xe7\x4e" + "\x18\xab\xbb\x54\xb6\x98\xae\x90\x6c\xa9\x1d\x7a\x6f\x5b\x6a\x67" + "\x0c\xab\xd3\xef\x9f\x0f\xde\x96\xda\x29\xd8\x5f\x07\x77\xb2\x31" + "\xb0\xb7\x1d\xb5\x73\xb2\xb7\x1d\xb5\xc3\xce\xec\xa5\x9d\xf1\x9d" + "\xf9\x68\x47\xed\x94\xb3\xf4\xdf\x17\x78\xa6\xbb\xed\x28\x96\xde" + "\x89\xfe\xe5\x0a\x77\xce\x0b\xce\x76\xba\xfc\x3b\xb6\x9d\x34\x83" + "\xd8\x4e\x9a\x1f\x88\xed\xf4\xb2\xdf\xfd\xff\x17\xf5\xf7\x50\x3a" + "\x64\xa7\x7e\x78\x3a\xa4\xdc\x6f\x7c\xb9\x8b\xfa\x7b\x28\xda\x97" + "\x69\x86\x47\xfb\x8a\x41\xcf\x3f\x0c\xae\xbf\xf7\x2c\x74\xeb\xef" + "\x3d\x0b\xfd\xeb\xef\xdd\x9f\x5e\xd4\xdf\xc1\xe8\xef\xf2\xed\xc3" + "\xd3\xdf\xbb\xcb\xbc\xf5\xf7\x1f\x2e\x09\x4c\x7f\xef\x99\x34\xf2" + "\xfa\x7b\x8f\xce\x5b\x7f\xef\x11\xe3\x7b\xec\x9a\x1d\xbc\xfe\xde" + "\xf3\xb9\x7f\xfd\xbd\xa7\xd1\x5b\x7f\xef\xa9\x62\x7a\xfa\x0f\x0a" + "\xa6\xbf\xf7\x1c\x66\xe9\xbb\x66\x79\xa6\xbb\xf5\x37\x4b\x67\xfa" + "\xfb\x0f\x91\xc1\xe9\xef\x88\xef\x58\x7f\xab\x07\xd1\xdf\xea\x1f" + "\x88\xfe\xfe\x8f\x92\x8b\x3a\x24\x54\x1d\xf2\x07\xdd\xf0\x74\xc8" + "\xab\xca\xd0\x75\xc8\x1f\x77\xbb\x75\xc8\x1f\x77\xfb\xd7\x21\x7f" + "\xbc\xf4\xa2\x0e\x09\x46\x87\xfc\x47\xc3\xf0\x74\x48\xa5\xd5\x5b" + "\x87\xec\x7d\x28\x30\x1d\xf2\xc7\x27\x46\x5e\x87\xfc\x71\x85\xb7" + "\x0e\xd9\x1b\xcb\xea\xf4\xea\xd6\xe0\x75\xc8\xde\x49\xfe\x75\xc8" + "\xde\xab\xbd\x75\xc8\x1f\xc5\x58\x19\x7b\xe7\x30\x1d\xb2\x57\x4c" + "\x7f\x75\x8b\x67\xba\x5b\x87\xb0\x74\xa6\x43\xf6\x26\x05\xa7\x43" + "\xc6\x7c\xc7\x3a\x44\x31\x88\x0e\x51\xfc\x40\x74\xc8\x6b\x03\xe2" + "\x1f\x06\x2e\xc7\x0e\xe8\xdd\x72\xec\x80\xde\xbf\x1c\xdb\xdf\x78" + "\x51\x8e\x05\x23\xc7\xf6\xae\x18\x9e\x1c\xdb\xbf\xd7\x5b\x8e\x1d" + "\xbc\x34\x30\x39\x76\xe0\xda\x91\x97\x63\x07\x62\xbc\xe5\xd8\x41" + "\xf1\xcc\xe9\xbe\x87\x83\x97\x63\x07\xbe\xf2\x2f\xc7\x0e\x7c\xed" + "\x2d\xc7\x0e\xbc\xcb\xe4\xd5\xc1\x48\x26\xc7\x0e\xd4\xb3\xf4\x7d" + "\x89\x9e\xe9\x6e\x39\xc6\xd2\x99\x1c\x3b\xa8\x1d\x4a\x8e\x61\xbf" + "\xa8\xd5\xf4\xeb\x17\xcf\x4a\xfd\xe2\x8d\x92\x4f\xca\xa4\x7e\xf1" + "\x86\x60\xa3\xf1\x65\x95\xd5\x2f\x64\x10\xb9\x01\x63\xe2\x80\x8c" + "\x48\x5d\x80\xfd\xe2\x8d\x51\xb8\xbf\x44\x69\x01\xb9\x67\x13\xe5" + "\x60\x26\xc8\x41\x1b\x3c\xa3\x9f\xb4\xc9\x95\xd5\x28\xbf\x70\x9f" + "\x06\x3e\x33\x79\x68\x1f\x85\x31\x79\x84\x75\x76\x8f\x7e\x23\xf4" + "\x95\x4e\xb1\xaf\x74\xb2\xbe\x22\x9d\x97\xcb\xb2\x51\xde\xb5\x56" + "\x37\x21\x21\x25\x8c\x62\xff\x11\xce\x61\x41\xff\xa1\x6b\x75\xe1" + "\x65\x69\xd0\x67\xec\x6d\x04\x7d\xe1\x63\x9f\x51\xe5\xc9\xc2\x69" + "\xa7\xfe\x12\x90\x89\x4c\xf6\xf1\xd5\xa3\x9c\xe8\xd7\x6a\x2d\xc8" + "\xbe\x0e\x90\x7d\x1d\xee\xbe\x82\x6b\xe7\x9d\x6b\x75\xda\xae\xb5" + "\xba\x29\xbd\x9d\x20\xfb\xec\xfd\xfb\xc9\x92\x59\xbb\x3a\x50\xf6" + "\xb5\x09\xfd\x44\x90\x7d\xd0\x37\xf8\x4e\x90\x7d\x4f\x8b\xb2\xaf" + "\x53\x87\xb2\x5e\xbd\x6b\x19\xc8\xbe\xe4\x13\x4c\xf6\x89\x36\xdc" + "\x8f\x50\xf6\xad\xd5\x71\xbf\xe9\x10\x65\xdf\x62\x94\x7d\x47\xa0" + "\x8f\xfc\xa7\xb7\xec\x53\x85\x2a\xfb\x5e\xaf\xf7\xee\x27\x55\x33" + "\x02\xeb\x27\x6f\x3c\xe4\xaf\x9f\xf4\x1a\x43\xed\x27\x6f\x2c\xf4" + "\xee\x27\x55\x3a\xb1\xef\x2e\x0f\xbe\x9f\x54\x5d\xd2\xd7\x4f\x9e" + "\xed\xdf\x4f\xaa\xc6\x7b\xf7\x93\x37\x6c\xac\x3f\x54\x4d\x67\xfd" + "\xe4\x0d\x07\x4b\x3f\xa8\xf7\x4c\x77\xf7\x13\x96\xce\xfa\x49\x55" + "\xfc\xc5\xf5\xf2\xef\x9b\xbe\xff\xd3\xe1\x8b\xeb\xe5\xa1\x8e\x19" + "\xab\x16\x0e\x6f\xcc\xf8\x97\xb8\x8b\xf3\xed\xa1\xd2\xfe\xcf\xca" + "\xe1\xd1\xfe\xcd\x77\x2f\xce\x95\x84\x4a\xfb\xbf\x6c\x19\x1e\xed" + "\xdf\xf6\x1b\xff\x67\x68\x5b\xea\x90\xad\xa6\x6f\x8c\x71\xc8\x26" + "\xed\xcf\x1d\x38\xc6\x38\xf4\x98\xf7\x59\xba\xb7\xbf\xee\xbf\x77" + "\x76\xa8\xb1\x87\xf3\xe2\xd8\x03\x78\xfd\x96\x7c\x78\x63\x8f\x43" + "\xfd\xf6\x27\xbe\xf3\x62\x60\x36\xd5\xa1\x3d\xfe\x6c\x2a\x67\xc8" + "\x63\x8f\x43\x55\xde\x36\xd5\x3b\x59\x22\x36\xde\x0a\xde\xa6\x7a" + "\xe7\x09\xff\x36\xd5\x3b\x4b\xbd\x6d\xaa\x77\x62\x99\xed\xf4\x4e" + "\x09\xb3\xa9\xde\x99\xc3\xd2\xdf\x7e\xd3\x33\xdd\x6d\x53\xb1\x74" + "\x66\x53\xbd\x53\x76\x71\x1d\xfd\xfb\x66\x53\xfd\x97\x5f\xff\x87" + "\x17\xf5\xfa\x50\xba\xe5\x9d\xaa\xe1\xe9\x96\x77\xbf\xc3\xfd\x9f" + "\xdf\x77\xbd\xfe\x5f\xc9\xc3\xa3\xfd\xdf\x06\xdd\xff\x39\xb8\x5e" + "\x37\xbd\xeb\xd6\xeb\xa6\x77\xfd\xeb\x75\xd3\xcd\xde\x7a\xfd\x6f" + "\x1f\x5c\xd4\xeb\xa1\xe8\xf5\x77\x2d\xc3\xd3\xeb\xef\x3b\xbd\xf5" + "\xfa\x07\xcb\x03\xd3\xeb\xa6\xf5\x23\xaf\xd7\x4d\x5b\xbc\xf5\xfa" + "\x07\xf3\x44\x6c\x18\x83\xd7\xeb\x1f\xfc\xcc\xbf\x5e\xff\x60\x86" + "\xb7\x5e\xff\x40\x3c\xa7\xf6\x81\x9e\xe9\xf5\x0f\xa6\xb2\xf4\xbf" + "\x19\x3c\xd3\xdd\x7a\x9d\xa5\x33\xbd\xfe\x41\xfa\xc5\xf5\xf5\xef" + "\x9b\x5e\xff\x6f\xbf\xf1\xbf\x2e\xea\x96\xa1\x74\xcb\x07\xc3\x1c" + "\x33\x1e\x5e\x11\xba\x6e\xf9\x50\xe3\xd6\x2d\x1f\x6a\xfc\xeb\x96" + "\x7f\x18\xbd\x75\xcb\x91\xc9\x17\x75\x4b\x28\xba\xe5\xef\xb1\xc3" + "\xd3\x2d\xff\x48\xf2\xd6\x2d\x1f\x1e\x09\x4c\xb7\xfc\xe3\xf3\x91" + "\xd7\x2d\xff\xb0\x79\xeb\x96\x0f\xab\x58\x9d\x0e\x7f\x1d\xbc\x6e" + "\xf9\xf0\x45\xff\xba\xe5\xc3\x1d\xde\xba\xe5\xc3\x15\x4c\x87\x7c" + "\x78\x98\xe9\x96\x0f\x73\x59\xfa\xe1\x36\xcf\x74\xb7\x6e\x61\xe9" + "\x4c\xb7\x7c\x58\x7f\x71\xdd\xfd\xfb\xa6\x5b\x3e\x1a\x74\xff\xef" + "\xe0\xf2\xed\x13\x87\x5b\xbe\x7d\xe2\xf0\x2f\xdf\x3e\x59\xe9\x2d" + "\xdf\x3e\x72\x5d\x94\x6f\xa1\xc8\xb7\x0f\x6d\xc3\x93\x6f\x9f\xc4" + "\x7a\xcb\xb7\x9a\x00\xfd\x01\x7d\xf2\xd6\xc8\xcb\xb7\x4f\xfa\xf9" + "\x7f\xa8\x11\x7d\x00\x7d\xf4\x51\xf0\xf2\xad\x66\x8d\x7f\xf9\x56" + "\xb3\xde\x5b\xbe\xd5\x88\xfe\x7f\x6a\x5e\x61\xf2\xad\x46\xf4\xff" + "\xf3\x51\xb5\x67\xba\x5b\xbe\xb1\x74\x26\xdf\x6a\xaa\x86\xb7\x1e" + "\x6f\x8e\x75\xaf\xc7\x9b\x05\x5e\xf0\xa5\xad\x8e\x81\xeb\xf1\x75" + "\x07\x71\x3d\xde\xdd\x5f\x6a\x6f\x16\xd6\xe6\xb1\xcf\x74\x31\xff" + "\x3d\x3e\xd7\xe9\x27\xb5\x3a\x2e\xae\xd3\x9f\xcb\x75\xfa\xba\x4c" + "\xef\xfe\x63\x6e\x0d\xac\xff\xd4\x9d\x1e\xf9\x75\x7a\xb3\xdc\xbb" + "\xff\x98\xeb\xc5\x3e\x7d\x36\xf8\xfe\x63\xfe\x93\xff\xfe\x63\x7e" + "\xc7\xbb\xff\x98\xc5\x31\xa6\xd9\xc6\xfa\x8f\x79\xb7\xd8\xaf\x1c" + "\x9e\xe9\xee\xfe\xc3\xd2\x59\xff\x31\xdb\x03\xb1\x0f\x9c\xca\xd6" + "\x18\xd4\xf7\xd3\x2c\x57\xb9\xfa\x70\x9e\x2e\xe2\xdc\x97\x7d\xf0" + "\x14\xd3\x17\x82\x6d\xf0\xca\xdb\xb6\x21\xed\x03\x9b\x68\x1f\xa4" + "\x0c\xb4\x0f\x24\xdb\xa0\x0c\xf0\xbd\x33\xa0\x35\x7a\x11\xef\x68" + "\x1b\x9c\x09\xd6\x36\x58\xe6\xb6\x0d\x8c\xfd\x6c\x83\xa7\xfb\xd9" + "\x06\x02\xde\x5b\xbc\xf0\x3e\xc0\x36\xe8\xc3\xfb\x48\xd9\x06\x9f" + "\xea\x2f\xae\xd1\x87\x3a\xee\xac\x97\x0f\x6f\xdc\xf9\x99\xed\xe2" + "\x5c\x7e\xa8\xb4\xff\x74\x98\x73\xf9\x47\x93\x2f\xce\xb7\x84\x4a" + "\xfb\xff\x19\xa6\x2f\x87\xcf\x2d\xa1\x8f\x47\x1a\xf6\xba\xc7\x23" + "\x0d\x7b\x25\xfb\x4a\xf2\x8d\x08\xf2\x59\x6e\x4c\x83\xeb\x0c\x21" + "\x2f\xa4\x09\x71\x06\x14\x66\xdb\xe7\x18\x77\x0d\x6c\xae\x86\xc9" + "\x09\x99\x9e\x36\xd7\xff\xdb\x23\xd9\x5b\x09\x68\x8b\x81\x6d\x85" + "\x76\x95\x34\x06\x41\xbf\x56\x83\xee\x1f\xbe\xf6\x6d\x1b\x8e\x59" + "\x7a\x55\xad\x31\x3f\xdc\xf1\xca\xd1\xbd\xc3\x1b\xaf\xfc\x6f\x9b" + "\xb7\xbd\xf5\xc5\xfc\xc0\xec\xad\x86\xa5\x23\x3f\x5e\x69\x48\xf7" + "\xb6\xb7\xbe\x88\x13\x71\xf2\x58\xf0\xf6\xd6\x17\x57\xfb\xb7\xb7" + "\xbe\xb8\xce\xdb\xde\x6a\x70\x32\xbb\xea\x8b\x79\xcc\xde\xfa\x42" + "\xcd\xd2\xff\x5f\x92\x67\xba\xdb\xde\x62\xe9\xcc\xde\xfa\x22\x39" + "\x40\x7b\x2b\x76\x18\xf6\x56\xdb\xf7\xc7\xde\x7a\xfa\x02\xb7\xb7" + "\xbe\x6c\x08\x40\xef\xc4\xf4\xd3\x3b\xb6\x8b\x7a\x07\x65\xcd\x17" + "\xe9\xc3\xd3\x3b\x96\x79\x43\xd2\xde\xe0\x41\x7b\x94\xf9\x22\xdd" + "\x5d\x53\xdf\xb6\x85\x4c\x7b\x90\xf5\xe5\xd9\xdf\x67\xba\x1f\xd3" + "\x0e\x8f\xee\x8d\x7e\xe3\x1f\x5e\xb4\xb5\x86\xa2\xbd\xa5\x6c\x78" + "\xb4\x6f\x8e\x0f\xdd\xd6\x6a\x89\xf9\xa4\xcf\xd6\x6a\x89\xe9\x6f" + "\x6b\xa1\x6d\xf5\x90\x83\xd9\x5c\x2f\x80\xad\x54\xb4\x0a\xec\xae" + "\x0c\x42\xcc\xb6\xf7\x88\x01\x6c\xaf\xa2\x53\x60\x7f\xad\x00\xfb" + "\xcb\xf9\xaa\x68\x7f\x7d\xf5\x9a\xb7\xfd\x65\xbd\xda\xa7\xfd\xa5" + "\x72\xdb\x5f\x4e\xb0\xad\x7a\x5f\x7d\xdb\x56\x72\xca\xc3\x16\x7b" + "\x66\xa0\x2d\xd6\x63\x6c\x8d\xed\xb9\xf6\xed\xb6\x5e\xb0\xc7\x06" + "\xb3\xc5\x04\x4c\xf8\xb0\xc7\xfe\x3d\x6c\xb1\xa6\xc8\xe1\xd9\x62" + "\x5f\xa5\x7b\xdb\x62\x2d\x5f\x05\x66\x8b\x7d\xf5\xad\xdf\xb9\xaf" + "\x90\x6d\xb1\x16\xe2\x6d\x8b\xb5\xd4\xb0\x3a\x35\x1f\x09\xde\x16" + "\x6b\x39\xe8\xdf\x16\x6b\x79\xcb\xdb\x16\x6b\x11\xcf\x9e\xb6\x58" + "\x99\x2d\xd6\x52\xc6\xd2\x9b\x0f\x7b\xa6\xbb\x6d\x31\x96\xce\x6c" + "\xb1\x96\xf6\x00\xd7\xc6\x62\x9c\xa0\xd3\xbf\xfb\xfd\x94\x83\xad" + "\x8d\x8d\xd4\x7e\xca\x65\x17\xf8\xda\x98\x6d\xe8\xf9\xaf\x8b\x36" + "\x81\x0f\x59\xf3\x4f\x32\x3c\xbd\xd4\x6a\xbd\x68\x13\x84\x4a\x7b" + "\xdb\x30\xe7\xbe\xfe\xb5\x30\x74\x9b\xe0\x84\xce\x3d\xff\x72\x42" + "\x17\xdc\xfc\xcb\xd7\xe5\xde\xfa\xbf\xcd\xb7\xfe\xbf\x38\xff\x12" + "\x84\xce\x3f\xae\x1b\x9e\xce\xff\x5a\xef\xad\xf3\x4f\x7c\x1e\x98" + "\xce\xff\xba\x75\xe4\xe7\x5f\xbe\xee\xf2\xd6\xf9\x27\x4c\xac\x4e" + "\xff\xfa\x22\x78\x9d\x7f\x62\x8f\x7f\x9d\x7f\xe2\x35\x6f\x9d\x7f" + "\x22\x8b\xe9\xf6\x13\x47\x99\xce\x3f\x51\xc2\xd2\xff\xd5\xe0\x99" + "\xee\xd6\xf9\x2c\x9d\xe9\xfc\x13\xd6\xe0\xd6\xbb\x22\x2e\xd0\xf5" + "\x2e\xf5\x0f\x64\xbd\xab\x3d\xe9\xa2\xde\x09\x55\xef\x9c\xe8\x1a" + "\x9e\xde\x39\x39\xa4\xff\x0f\xff\x7a\xc7\xbe\xdb\xad\x77\xec\xbb" + "\x83\xd3\x3b\xf6\x4b\xbd\xf5\xce\xa9\x1d\x17\xf5\xce\x70\xf5\x4e" + "\xfb\xee\xe1\xe9\x9d\x6f\xac\xde\x7a\xe7\xdb\x00\xfd\x1f\xd9\xfd" + "\xfa\x3f\x0a\x5d\xef\xd8\xfb\xf9\x3f\xfa\x56\xf4\x7f\x74\x2a\x04" + "\xbf\x21\xdf\x4e\xf2\xaf\x77\xbe\xed\xe7\xff\xc8\x2e\xfa\x3f\xfa" + "\x56\xf4\x7f\xf4\xad\x98\x7e\x2a\xd1\x33\xdd\xad\x77\x4e\x79\xf8" + "\x0d\xf9\xf6\xa2\xff\xa3\xef\xdd\x3e\xcc\x8e\x61\xc8\xbf\xd3\xb9" + "\x6e\xf9\x77\x3a\xd7\xff\x3e\xcc\xae\xd3\xde\xfb\x30\x3b\x9f\xbf" + "\xb8\x0f\x33\x14\xf9\xf6\xed\x30\xfd\x22\x75\x99\xbc\xe5\xdb\x99" + "\x1b\x02\x93\x6f\xa7\x67\x8c\xbc\x7c\x3b\x3d\xc7\x5b\xbe\x9d\xd1" + "\x88\xd8\x08\x41\xbe\x9d\x3e\xeb\x5f\xbe\x9d\x91\x79\xcb\xb7\xd3" + "\x47\x99\x1c\x3b\x33\x8d\xc9\xb7\xd3\x6d\x2c\xbd\x33\xd1\x33\xdd" + "\x2d\xdf\x3a\x3d\xe4\xdb\x99\xd8\xe0\xd6\x35\x43\xb2\xab\xcf\xc3" + "\xba\xe6\x48\xd9\xd5\x17\xfa\xba\x66\x77\xd5\xc5\x79\xb4\x50\x6c" + "\xea\x33\x73\x86\x67\x53\x9f\xd5\x85\xae\x53\x9c\x4a\xb7\x4e\x71" + "\x2a\xfd\xad\xef\x14\x01\xee\x0c\x60\x13\x6f\x3d\x45\xe4\x2f\xe0" + "\xfa\xce\xd1\x5a\x62\xc4\xf5\x9d\x55\xd2\xfa\x4e\xb9\x68\x67\xf7" + "\xe6\x79\xdb\xd9\x3d\x32\x5f\x76\x36\xda\xd7\x2e\xb0\x9d\x9d\xfd" + "\xd7\x75\x16\xf8\xd6\x45\x3d\xaa\xd6\xd8\xb3\xaf\xbe\xdd\x16\xac" + "\x2e\x7a\x79\x03\xd3\x45\x3b\xbf\xf7\xba\xa8\xdb\x31\x3c\x5d\xd4" + "\x3b\xc7\x5b\x17\x39\xdf\x09\x4c\x17\xf5\x7e\x34\xf2\xba\xa8\xb7" + "\xc1\x5b\x17\x39\x5f\x61\x75\x3a\xfb\x6a\xf0\xba\xc8\xf9\xbc\x7f" + "\x5d\xe4\x34\x7a\xeb\x22\x67\x32\xd3\x39\xce\x43\x4c\x17\x39\xd3" + "\x59\xfa\xd9\x57\x3c\xd3\xdd\xba\x88\xa5\x33\x5d\xe4\x3c\x1c\xdc" + "\x1c\xcf\x98\x0b\x74\x8e\x47\xf1\x03\x99\xe3\xe1\xa7\x87\x2c\x13" + "\x39\x19\xa9\x91\xce\x6f\x70\x32\x32\x60\x9e\x21\x03\xec\xed\x0e" + "\xb6\xce\xdd\x37\xcf\x60\x6d\x64\xf2\x8f\x23\xcf\x79\xcb\x3f\xea" + "\x57\xfe\x0d\xb6\x96\x8d\xf3\x0a\x2e\x90\x8d\xce\xf2\x61\xac\x65" + "\x67\x7c\xdf\x65\x9e\x73\x78\xfe\x95\x39\x12\xe7\x25\xf3\x38\xd9" + "\xc1\x80\x64\x1e\x47\xde\xf3\x2b\xf3\x42\x3d\xc7\xc1\x91\x1a\x2f" + "\x99\xc7\xc9\x44\x19\xc3\xbf\x13\xb4\xcc\xe3\x64\xeb\xfd\xca\x3c" + "\x4e\x96\xe7\x25\xf3\x38\x99\xb0\xdf\xc9\xca\xc9\x0e\x08\x32\x8f" + "\x93\xe9\x99\xcc\xe3\x0f\x79\xa6\xbb\x65\x1e\x4b\x17\x64\x5e\x91" + "\xec\xd0\x60\x32\x8f\x1a\xf6\xc7\x96\x70\x7c\x15\x5c\x87\xa0\x8e" + "\x93\x00\x1b\x26\xf8\xbf\x1a\x78\x3c\x01\xfe\xf7\x1b\xeb\xc5\xae" + "\xda\x1f\xcb\xe7\x43\x9d\x39\x22\x33\xdb\xbf\x31\x99\xae\x70\x42" + "\x3d\x39\xf1\xcc\xda\xfe\xd8\x08\xe7\x98\x78\x9e\xea\x09\xf0\x25" + "\x56\x88\x8d\x09\xf9\xf1\x7c\x90\x36\x83\x84\x9f\xe2\xb8\x24\x29" + "\x1f\xd4\x37\xbc\x85\xe3\x2e\xc5\x32\xba\x8b\xb8\x14\x68\xcb\x61" + "\xbf\x75\x85\xb2\x12\x5e\x9b\x42\x36\x39\xe9\xbf\x4c\xab\x3a\x88" + "\x8d\xe3\x0e\x46\xb4\x8f\x89\xa7\x39\x49\x04\x6d\xb9\xaa\x2b\xec" + "\x72\x2c\x13\xe3\xe9\xc2\xbb\x12\x7c\xe7\x82\x3a\x66\xaf\x24\x5c" + "\x71\xc7\x18\x05\xc8\x89\x51\x39\x5d\xb4\x6d\xb5\x13\xea\x0c\xd8" + "\x7c\x7f\x4a\x83\xfc\x8d\x9d\x90\xe6\x22\x1a\x8c\x4d\x8a\x65\x80" + "\x3d\x8b\xf5\xf9\x53\x05\xe4\xf7\x55\x87\xe7\x5f\x27\xd3\x46\x5d" + "\x47\xad\xc1\xe1\x26\x4c\xee\x8f\x8e\x11\x79\x53\x88\xe9\x7a\xa0" + "\x9d\x96\x70\xbe\xde\x07\xf9\x9d\xc1\xce\xbf\x2b\x30\xb6\x71\xce" + "\x0e\xc2\x6d\xe3\xc7\x28\xfe\x9e\x25\xc4\x1f\xb6\x77\x17\x85\x35" + "\x58\x65\xfa\x18\xa4\x39\xc6\xb5\xc4\xf8\xef\x80\x1b\x02\xe9\xf6" + "\x0f\x32\x09\xe9\xcf\x8b\xb4\x94\x95\x8b\xb5\xe9\xcb\x57\x2e\x5d" + "\xfd\x5c\xba\xf6\xda\x94\xb1\x64\xde\xea\xd5\xda\x95\x8b\x57\xad" + "\xd7\x7a\xbe\xb9\x43\x9b\xb2\x7c\xed\xe2\xa7\x56\x2c\xbd\x61\xe5" + "\x92\xd4\xb1\x28\x7c\x3d\xea\x11\x89\x75\xe1\x8b\xc2\x9c\x15\x2f" + "\x11\xf2\x9b\x09\x44\x8e\xf5\xea\x2e\x92\x27\x4b\x31\x4c\x31\x86" + "\x27\x07\x79\x72\x40\x3e\x6e\xcb\x1e\x83\x79\x57\xec\x82\x7a\x55" + "\x40\xbd\xa1\x8e\x50\x67\xb9\x41\xaa\xb3\x84\x89\x1c\xc4\x44\x76" + "\x07\x60\x50\x7e\x30\xc2\x31\xe6\x17\x94\x26\x61\xfb\xba\xa0\x9f" + "\xc8\x20\xcd\x25\xe8\x32\xe3\xfe\x58\xf8\x6d\xb5\x84\x31\xfc\x2d" + "\x2d\xde\x4f\xba\xb1\x9f\x50\xfd\x5d\xac\xaf\x8d\xda\x3d\x5f\x27" + "\x23\x42\x0c\xd5\x22\x79\x57\x5f\x0c\x55\x48\x47\xda\x42\x3d\xda" + "\xbb\x8b\x46\x29\xad\xb2\xdb\x53\x30\x1d\x63\xff\x62\x2c\x54\xac" + "\x33\xb4\x0b\x74\x29\x35\xd1\x7c\x11\xfb\x5b\x1c\x7b\x79\xc3\xa4" + "\xdd\x66\xf9\x19\x92\xe0\xa4\xbd\x74\xab\x63\x6f\x5d\x57\x17\x89" + "\xc8\x4b\x5d\x42\xc7\xca\x41\x66\x2f\x5f\x8a\x31\x5c\x79\xe3\xa4" + "\xdd\xd4\x38\xc1\x34\xff\x3a\xa2\x86\xb2\xf5\x1e\xb1\x5c\xe5\xc1" + "\xf1\x7f\x94\xc0\x7f\xe4\x23\xc6\x68\x65\x7c\x1c\x75\xe8\x83\xf4" + "\x81\x7c\xec\xc3\xdf\x6b\x3c\x39\x02\x58\xa0\xca\x63\xb9\x09\x2e" + "\x46\x47\xec\xbb\x9d\x39\x7a\x72\x93\x40\xbb\xd1\xa9\x7c\xf1\xb1" + "\x64\xde\x70\xac\x94\x1a\x8e\x15\x00\xcd\x34\xc5\x19\x44\xbb\xc8" + "\xa5\x26\xc6\x33\x24\xda\x6e\x3c\x96\xab\x92\xe5\xca\xc0\x1e\xe1" + "\x40\x9f\x44\x83\xcc\x88\x16\xfb\xbb\x06\xe9\xf8\x61\x3b\x21\x73" + "\xd7\x12\xf2\xaf\xe9\x24\xac\x02\x7e\x17\x5c\x7b\x46\x0b\xfa\x9f" + "\x16\x8d\xea\xda\x05\xbf\xc5\x18\xbd\x41\xfe\x3e\xcb\x6f\xbf\xeb" + "\x6b\xb7\x85\xf8\x6e\xf7\x18\x3d\xb4\xdb\xca\x1b\x2c\x1a\x6a\xb0" + "\xc8\x07\xb6\xdb\x42\x58\xbb\x47\x75\x8c\x7c\xbb\xc7\x30\xff\xd7" + "\x45\xa3\xdb\x43\x6b\xf7\x98\xf4\x00\xda\xed\x87\xdf\x8a\x64\xbe" + "\xd8\x02\xfc\xb6\x00\xbf\x2d\x3e\xf8\x6d\x11\xf9\x3d\xae\x65\xe4" + "\xdb\xad\x98\xc6\xda\x3d\xc6\x16\x5a\xbb\x15\x7e\xe5\x9f\xbb\xdd" + "\x8d\x7e\xf8\x7d\x49\x12\xb4\x1b\xf8\xdd\x08\xfc\x6e\xf4\xc1\xef" + "\x46\x91\xdf\xe3\x3f\x1b\xf9\x76\x5f\xc2\xfc\x1f\x16\x29\x2c\xa1" + "\xb5\xfb\x92\x94\x00\xda\xed\x87\xdf\x63\x13\xf9\xe2\x46\xe0\x77" + "\x23\xf0\xbb\xd1\x07\xbf\x1b\x45\x7e\xdf\x56\x34\xf2\xed\x1e\xcb" + "\xe2\x3f\x17\x5d\x72\x34\xb4\x76\x8f\xf5\xbb\xff\xc5\xdd\xee\x26" + "\x3f\xfc\x1e\x17\x0f\xed\x06\x7e\x37\x01\xbf\x9b\x7c\xf0\xbb\x49" + "\xe4\xf7\xe3\xf7\x8c\x7c\xbb\xc7\x45\xb2\x76\x8f\xad\x09\xad\xdd" + "\xe3\xfc\xee\x7f\xf7\x90\xe7\x5b\x40\x66\x0f\xe0\xb9\x39\x33\x96" + "\xdc\x78\x06\xdb\xaf\x3c\x44\x55\xc7\xb6\x8c\xcb\xcb\x95\x39\x95" + "\xc7\x0c\xe3\x60\x2c\xf7\x72\x3e\xaf\x8f\xb0\x92\x4b\xa0\xad\x7a" + "\x5a\x6c\xd5\xe2\x9d\x87\x72\x9c\x20\xfb\x5d\xca\x63\x05\x3d\x86" + "\xfd\x9a\x17\x96\x11\x6d\x8e\x9d\xa8\xeb\xb2\xad\x24\x3b\x95\xda" + "\xeb\xc8\x57\x44\x65\x25\x1c\xce\x97\x7d\xd2\x7e\x88\xac\x4a\xa3" + "\x14\xca\xde\x83\x63\xcc\xe2\xe3\x24\x1a\x6c\xe2\x5c\x0a\xfa\xa3" + "\x84\x27\x5a\x28\x3f\x1a\x69\x09\x65\x5f\x13\x31\x8f\xc8\xfe\xf6" + "\x94\x83\x20\x3d\x91\xb6\x30\x1e\x8d\x16\xe8\xda\x45\xc8\x83\x8f" + "\x33\xba\xbe\xbc\x2c\x58\xba\x2a\xc5\xf5\xbf\x63\xbb\xcd\xd6\x1e" + "\x8c\x19\xa0\xc6\x33\xf7\x90\xae\xab\x4b\xed\x20\xb4\x68\x5c\x0d" + "\x35\x1e\x2b\xe1\x41\x67\x05\x59\xae\x5f\xff\xd7\x1e\xf2\x54\x01" + "\x32\x73\x00\xd6\xdc\xf4\x0e\x87\x31\xb0\x45\xc1\xe8\x6d\x51\x8e" + "\xb3\x8c\xea\xf0\x4d\x6f\x8b\xc2\x09\x3a\xc7\xa5\xb4\xc8\x03\xa7" + "\x77\xf8\xf8\x7e\xf4\xb6\x9e\x1f\x7a\xab\xc4\xf8\xa7\x16\xad\x37" + "\xbd\x55\xa5\x8c\xde\xaa\xe9\xd4\x68\x51\xf3\xa0\x2b\x83\x2b\x37" + "\x3c\x26\x00\x7a\x03\xbe\x07\xea\x30\x37\xbd\x23\x4a\x81\xde\x22" + "\xbe\x2d\x80\xef\x71\x2d\x7e\xe8\x0d\xf8\xb6\x00\xbe\x2d\x41\xe0" + "\x3b\x22\xcf\x9b\xde\x96\xf3\x84\xef\x08\x71\xfe\xcf\xd2\x0f\xdf" + "\x11\x0a\x46\xef\xf0\x03\x40\x6f\xc0\xb7\x25\x48\x7c\x47\xbc\x12" + "\x80\xfe\x00\x7c\x0f\xd4\x9d\x6e\x7a\x8f\x57\x50\x55\xa3\x88\xef" + "\x46\xc0\xf7\xf8\xcf\x7c\xd3\xbb\x11\xf0\xdd\x08\xf8\x6e\x0c\x02" + "\xdf\xea\x6f\xfb\xd1\xfb\x3c\xe1\x5b\xcd\x7c\x4c\x1a\x1a\xfb\xe1" + "\x5b\x9d\xc9\xe8\xad\x8e\xa2\xc6\x46\xc0\x77\x63\x90\xf8\x1e\x1f" + "\x19\x00\xbd\x01\xdf\x03\x75\xb6\x9b\xde\x13\x32\x81\xde\x22\xbe" + "\x1b\x01\xdf\xb7\x15\xf9\xa1\x37\xe0\xbb\x11\xf0\xdd\x18\x04\xbe" + "\x27\x2c\xf6\xa6\x77\xe3\x79\xc2\xf7\x84\x69\x22\xbd\xfb\xe1\x7b" + "\x7c\x1b\xa3\xf7\x78\x03\xd0\x1b\xf0\xdd\x18\x24\xbe\x27\x14\x04" + "\x60\x27\x00\xbe\x07\xda\x0a\x6e\x7a\x4f\x6c\xa3\xaa\x26\x11\xdf" + "\x4d\x80\xef\xc7\xef\xf1\x4d\xef\x26\xc0\x77\x13\xe0\xbb\x29\x08" + "\x7c\x4f\xfc\xb4\x1f\xbd\xcf\x13\xbe\x27\x8a\xf1\x2f\x9b\xfa\xe1" + "\x7b\x62\x12\xa3\xf7\x04\x27\x35\x36\x01\xbe\x9b\x82\xc4\xf7\xc4" + "\xae\x50\xec\x93\xb5\xe5\x44\xe1\x4d\xf3\x4b\x17\x9e\x3b\x1b\xe5" + "\xd2\xd9\xdf\x8d\x8d\x72\xa9\xda\xb7\x8d\x12\x59\xc3\x68\x1e\x99" + "\x1a\x9a\x8d\x72\xa9\xdf\xf3\x0f\x83\xd9\x28\x03\x69\x7e\x59\xfd" + "\xb9\xb3\x53\x2e\x7b\xe7\xbb\xb1\x53\x2e\x2b\xf0\x6d\xa7\x5c\x16" + "\xc7\x68\x7e\xa9\x2d\x34\x3b\xe5\x32\xbf\xfe\x0f\x06\xb3\x53\x06" + "\xd2\x5c\x33\xeb\xdc\xd9\x2a\x9a\x1b\xbe\x1b\x5b\xe5\x72\x87\x6f" + "\x5b\xe5\xf2\x37\x19\xcd\x2f\x4f\x0a\xcd\x56\xd1\x24\x86\x62\xab" + "\x0c\xa4\xf9\xa4\x43\xe7\xce\x5e\x99\xb4\xe7\xbb\xb1\x57\x26\xad" + "\xf0\x6d\xaf\x4c\x12\xc7\x3f\x9a\x9a\xd0\xec\x95\x49\x01\x8c\x7f" + "\x06\xda\x2b\x03\x69\x7e\xe5\xb4\x73\x67\xb3\x5c\x79\xe9\x77\x63" + "\xb3\x5c\x61\xf5\x6d\xb3\x5c\x51\xc6\x68\x7e\x45\x5c\x68\x36\xcb" + "\x95\x7e\xe3\x9f\x0c\x66\xb3\x0c\xa4\x79\xd4\xee\x73\x67\xb7\x44" + "\x6d\xfd\x6e\xec\x96\xa8\x79\xbe\xed\x96\x28\x35\xa3\xf9\x95\x6f" + "\x86\x66\xb7\x44\x1d\x08\xc5\x6e\x41\x5a\x23\xcd\xd1\x56\x61\x34" + "\xbf\x2a\x95\x86\x1f\x4b\xee\x05\x7b\x44\x05\x74\x57\xb5\x13\xae" + "\x1c\x69\xde\xc0\x68\xee\x0a\xb7\x6a\x81\x3e\x7a\xa4\x99\xd0\x8e" + "\xff\xd3\x84\xbb\x0c\xc7\x0c\x94\x23\xd0\x16\x05\x39\xce\x4d\xde" + "\xe4\xcc\x27\xe1\xda\xec\x3c\xf8\xff\xaa\xc5\x98\x47\x9b\x5d\xd8" + "\x08\x6d\x0c\xc3\x35\x0a\xa7\x71\x9f\xc9\xa5\x6a\x8e\x3b\xce\x4d" + "\x79\x8f\x4e\xae\x34\xf5\x82\x2d\x41\x9f\xd5\x44\x9a\xdb\xab\x88" + "\xd9\xf9\x31\xa9\x6b\xf8\x4f\xc2\x87\x5b\xaf\xb9\xc9\x49\x74\xf4" + "\xff\x74\x91\x35\xe9\x56\xe2\x5a\xa2\x51\x9a\x33\xab\x01\x17\x7f" + "\x26\x09\x6d\xf4\x0c\xfd\xa7\x4e\xd9\xab\xb2\xe5\xba\x80\xa9\x2e" + "\x63\x6b\xbc\x53\x65\x4b\x3d\x98\x61\xe5\x94\x0e\xa2\x5b\x61\xa3" + "\xb4\xf8\x29\x22\x2f\x6e\x21\x8a\x6d\x4f\x11\xe5\xb6\x16\xa2\xae" + "\xb1\x35\x90\xda\x13\xd5\xa4\xb6\xe3\x0b\x52\x7b\x06\xae\x1e\xb8" + "\x78\xb8\x72\xbf\x20\x35\xed\x84\x3c\x74\x92\x90\x1c\x1b\xb5\xff" + "\xd4\x42\x22\x6b\x9c\x0d\x44\xfb\x24\x21\xa7\xb8\x29\x0f\x2b\x93" + "\x49\x24\xfd\xa7\x86\xd0\x25\x1a\x0e\xde\xc9\x31\xdd\xec\xb4\x93" + "\x1a\x9b\x03\xdf\x47\xc3\x7b\x79\x8e\x0d\xca\xe7\xab\xd1\x97\xa1" + "\xbd\x26\xf7\x23\x68\xdf\x82\x2a\xa0\x73\xa9\x64\x93\x15\xf7\x90" + "\xe8\x6d\xc0\x66\xc4\x4c\x02\x65\x98\xd9\xd5\x13\x2c\x66\xa6\x30" + "\xff\xef\xcf\x6a\x26\x00\xbd\xaf\xe0\x9f\x4d\x52\xcf\xfd\xa2\x99" + "\xe2\x7e\x30\x5c\x9f\xa9\xeb\xfa\x98\xe0\x9a\x75\xc2\x7a\x42\xe6" + "\xb8\x88\x40\x13\x5c\x4b\x9e\x9b\x4a\x22\x70\x9f\x1a\xff\x7f\xba" + "\x09\x66\x9b\x9d\x6c\x72\x42\x5d\x4f\x39\xfa\xea\x5a\x57\x50\x47" + "\xe0\xdd\x15\x75\x7a\x2b\x51\xa6\x12\x35\xd2\x19\x6c\xd1\x2d\x73" + "\xdb\xc8\x25\xab\xba\x28\x45\x1a\x23\x6d\x91\xce\x58\x9e\x44\x7b" + "\x73\x8a\x9d\xe4\x38\x88\xda\x9c\x0d\xf7\x4c\x6a\x37\x93\x6f\x09" + "\xd4\x31\x85\xaa\x16\x54\x01\x3e\xa6\x22\x26\xac\xdc\xe4\x74\xc0" + "\xc1\x04\x5a\x34\x59\x57\x01\xed\xc5\xb5\xfd\xe0\xda\x7c\x55\x20" + "\xeb\x1f\x03\x6c\x42\x37\x9e\x2d\x0a\x86\xe7\x6b\xe2\x00\xcf\xd6" + "\x5e\xb0\xf5\x18\x9e\x47\x75\x0c\x8d\x67\x8b\xd2\x8d\x67\xed\x43" + "\x6e\x3c\x5f\x73\xb3\x7f\x3c\x5f\x6d\x64\x78\xb6\x68\x2f\x4c\x3c" + "\x5f\x7d\xf5\xe0\x78\xbe\x9a\xf8\xc7\xb3\x45\x23\xd9\xbb\x23\x83" + "\xe7\xab\x93\xce\x1f\x9e\x2d\x8a\xd0\xf0\x7c\x75\x8c\x37\x9e\xb5" + "\xb3\x18\x9e\xaf\x72\x84\x86\xe7\x6b\xfc\xfa\x3f\x1e\xcc\xde\xf6" + "\xc0\xb3\x28\x9f\xaf\x55\xd3\x70\x0b\xc8\x67\x8b\x28\x9f\xc7\xb5" + "\x04\x80\x67\x0f\xf9\xfc\xa3\xc9\x6e\x3c\x5f\x2b\xf3\x8f\xe7\xa9" + "\x4f\x88\x78\xbe\x40\xe5\xf3\x8f\xbe\x1d\x1c\xcf\x3f\xaa\x1f\x04" + "\xcf\xa5\xd2\x58\x62\x64\xf0\x3c\x55\x77\x1e\xf1\x1c\xa2\x7c\x9e" + "\x2a\xf7\xc6\xf3\x8f\x22\x19\x9e\xaf\xa9\x0e\x0d\xcf\xd7\x46\x85" + "\x32\x96\x71\xe3\xb9\x51\x94\xcf\x3f\xb1\x02\x9e\x41\x3e\x37\x8a" + "\xf2\x79\xfc\x67\x43\xe3\xb9\xd1\x43\x3e\x5f\x7b\xd2\x8d\xe7\x9f" + "\x7c\xea\x1f\xcf\x3f\xb9\x81\xe1\xb9\xf1\x02\x95\xcf\x3f\xfe\x60" + "\x70\x3c\xff\x78\xb7\x7f\x3c\x37\x6a\xa4\x71\xda\xc8\xe0\xf9\xc7" + "\x8e\xf3\x87\xe7\xc6\x10\xe5\xf3\x8f\x8f\x7a\xe3\xf9\x5a\x1b\xc3" + "\xf3\xb5\xa5\xa1\xe1\xf9\x27\xed\xa1\x8c\x13\x3d\xf0\x2c\xca\xe7" + "\xeb\xab\x68\x78\x23\xc8\xe7\x46\x51\x3e\xdf\x56\x14\x00\x9e\x3d" + "\xe4\xb3\xee\x3d\x37\x9e\xaf\xdf\xe3\x1f\xcf\xd7\xb9\x44\x3c\x5f" + "\xa0\xf2\xf9\xba\x17\x07\xc7\xf3\x75\xa9\x83\xe0\xb9\x54\x1a\x03" + "\x8f\x0c\x9e\xaf\xab\x3e\x8f\x78\x0e\x51\x3e\x5f\xf7\x8a\x37\x9e" + "\x75\x6f\x32\x3c\xeb\xf4\xa1\xe1\xf9\x7a\xbf\xf1\x5f\x07\x1b\x83" + "\xbb\xf1\xdc\x24\xca\xe7\x1b\x72\x01\xcf\x20\x9f\x9b\x44\xf9\xfc" + "\xf8\x3d\x43\xe3\xb9\xc9\x43\x3e\xff\xd4\xe8\xc6\xf3\x0d\x6b\xfc" + "\xe3\x79\x5a\x2d\xc3\x73\xd3\x05\x2a\x9f\xa7\x2d\x1e\x1c\xcf\xd3" + "\xe2\xfc\xe3\xb9\x49\x23\xcd\x2f\x8c\x0c\x9e\xa7\x95\x9e\x3f\x3c" + "\x37\x85\x28\x9f\xa7\xa5\x7b\xe3\xf9\xa7\x05\x0c\xcf\x3f\x8d\x0d" + "\x0d\xcf\x37\x18\x46\x66\x7e\x23\x3a\x17\xe7\x37\x7a\x70\x7e\xc3" + "\xbd\xf7\x4f\x1f\x51\xcf\xf0\xdc\x0b\x78\x7e\xd9\x13\xcf\xc7\xfa" + "\xcf\x6f\xdc\xf8\x04\xdf\x87\xe7\xe8\x01\x78\xe6\x01\xcf\xbd\x02" + "\x9e\x6f\xda\x2a\xcd\x6f\x98\xdb\x77\x03\x4e\x4e\x10\x73\x22\x60" + "\xb9\x58\xc4\xf2\x31\xc0\x32\xd0\x90\x07\x1a\xd7\x58\x1a\x48\x82" + "\x9d\xd1\xb2\x07\x68\xcc\x7b\xe2\xb8\xa7\x8d\x43\xfc\x22\x6e\x25" + "\x0c\xd7\xae\x02\xec\xa6\x7d\x4a\x6a\x33\xe0\xda\x00\x57\x36\x5c" + "\xe4\x53\x52\xd3\x06\xd8\x5d\xee\x89\xdd\x7a\x11\xbb\x37\x4d\x1e" + "\x1c\xbb\x37\x3a\xcf\xdf\x5c\xc6\x4d\x6c\xfe\xeb\x58\x92\x3a\xe1" + "\xe1\x66\x6a\xce\x6c\x10\xf1\x79\x82\x24\x38\x49\x04\x7d\x5c\x37" + "\x41\x99\x44\xd4\x1b\x5d\x84\x33\x3e\x45\xd4\xc6\x2f\xa1\xdd\x52" + "\xff\x6d\x21\xca\x8f\x1d\xff\x49\x6a\x3a\x1a\x48\xcd\x99\x8f\x48" + "\x0d\x0f\xd7\x09\xb8\xa0\xae\x09\x4b\x3d\xdb\x6d\x17\xdb\x1d\x7d" + "\x29\x94\x35\xd5\x7f\xbb\x6f\xea\x12\xda\x9d\x02\xed\xee\x71\xb7" + "\xdb\x0c\xfd\x00\xf8\x73\x05\x2f\xce\x87\x24\xd8\xc9\x25\xab\x9d" + "\x94\xf6\x88\xf8\x47\xfe\x7c\x7c\xd4\x41\x12\x52\x81\x67\x4b\x00" + "\xff\xb6\xbd\x24\x27\x0b\xf0\xdf\xe3\x40\xdc\xd9\xcd\xb9\x67\x01" + "\xff\x37\x45\x53\xa0\x5f\x2f\xe2\xff\x18\xe2\xff\xc6\x79\xbc\x80" + "\xff\x1b\x15\xa1\xe1\x3f\x3a\x00\xfc\x07\x32\x1f\x72\x2b\xe2\xdf" + "\xda\x83\xf3\x21\xee\x3d\xa0\x43\xe0\xdf\x73\x3e\xe4\x66\x0f\xfc" + "\xdf\x3a\x08\xfe\x6f\xd9\x2a\xcd\x87\x7c\xf7\xf8\xbf\x65\x08\xfc" + "\xdf\x3c\x08\xfe\x47\x7a\xee\xe3\x96\xf3\x88\xff\x5b\x87\xc0\xff" + "\x2d\x01\xe0\xdf\xa2\x08\x0d\xff\xb7\xf4\xc3\xff\xcd\x22\xfe\x6f" + "\x0e\x11\xff\xb7\x06\x82\xff\x00\xe6\x4f\x6e\xcb\xc5\xf9\x93\x1e" + "\x9c\x3f\x71\xef\x05\x1e\x0a\xff\x1e\xf2\x3f\xc6\x03\xff\xb7\x0d" + "\x82\xff\x9f\x49\xf8\xbf\x00\xe4\xff\xcf\x86\xc0\x7f\xcc\x60\xf8" + "\x1f\xe1\xb9\x92\x9f\x9d\x47\xfc\xdf\x36\x04\xfe\x7f\x16\x08\xfe" + "\x43\x94\xff\x3f\xeb\x87\xff\x18\x11\xff\x31\x21\xe2\xff\xb6\x00" + "\xf0\x1f\xc8\x7c\xcb\xed\x88\x7f\x90\xff\x8d\x72\x8f\x3d\xe1\x43" + "\xe0\xdf\x73\xbe\xe5\xe7\x1e\xf8\xbf\x7d\x10\xfc\xc7\x6e\x95\xe6" + "\x5b\xbe\x7b\xfc\xc7\x0e\x81\xff\x9f\x0f\x82\xff\x91\x9e\x5b\x89" + "\x3d\x8f\xf8\xbf\x7d\x08\xfc\xc7\x06\x80\xff\xc6\x10\xe5\x7f\x6c" + "\x3f\xfc\xff\x5c\xc4\xff\xcf\x43\xc4\xff\xed\x81\xe0\x3f\x80\xf9" + "\x99\xe9\x38\x9e\x05\xf9\xdf\x58\xe0\x71\x36\x60\x28\xfc\x7b\xc8" + "\xff\x3b\x3c\xf0\x3f\x7d\x10\xfc\xdf\x29\xe1\xff\x02\x90\xff\x77" + "\x0e\x81\xff\x3b\x06\xc3\xff\x08\xcf\xc5\xdc\x79\x1e\xf1\x3f\x7d" + "\x08\xfc\xdf\x19\x08\xfe\x43\x94\xff\x77\xf6\xc3\xff\x1d\x22\xfe" + "\xef\x08\x11\xff\xd3\x03\xc0\x7f\x20\xf3\x39\x33\x85\xf9\x9c\x1e" + "\x9c\xcf\x71\x9f\x11\x19\x02\xff\x9e\xf3\x39\x33\x3c\xf0\x3f\x73" + "\x10\xfc\xdf\xb5\x55\x9a\xcf\xf9\xee\xf1\x7f\xd7\x10\xf8\x9f\x31" + "\x08\xfe\x47\x7a\xee\xe6\xae\xf3\x88\xff\x99\x43\xe0\xff\xae\x00" + "\xf0\xdf\x14\xa2\xfc\xbf\xab\x1f\xfe\x67\x88\xf8\x9f\x11\x22\xfe" + "\x67\x8e\xd0\xfc\xcf\xdd\x3a\x9c\xff\xe1\x95\xc7\x0a\x7a\xcb\x2a" + "\x4d\xbc\xc1\x96\x1b\x21\xd3\x12\xa7\xb2\x39\xce\x9c\xde\x45\xe6" + "\x9e\x06\x9e\xa4\x9e\x26\x4f\x9e\x56\x63\x2c\xcb\x54\x0a\xe3\x7f" + "\xaf\x33\xa2\x70\x39\x0d\x0b\xaa\xb6\xad\x22\x72\x57\xb8\xf5\x1a" + "\x4c\x33\x1f\x77\x10\x6c\xf3\x26\xa4\xc1\x09\x37\x0d\x70\x0e\x8e" + "\x7e\xa3\x53\x57\xe4\x43\x9e\x1e\x2b\xb1\x01\x5e\x6a\x6c\x56\xa0" + "\xfd\x06\x01\x5b\xc8\x8b\xe3\x5c\x5c\xf5\xae\x53\x44\xee\xfc\xa7" + "\xe6\x0a\xe0\x71\xa4\x6a\x1d\x91\x45\xd9\x28\x8f\xbc\x44\x1e\x21" + "\x5f\xb5\x1b\x70\xbf\xd2\xdd\x57\xd7\x01\xbe\x9d\xff\xd4\x5d\x51" + "\x01\xf9\x46\x7e\x5e\x26\xae\x9d\x9d\xc7\x8f\x33\xd5\x58\x80\x96" + "\x45\x71\x21\xf2\xe9\xee\x40\xce\xbf\x04\x30\x4f\x71\x4f\x3d\xce" + "\x53\xf0\x4a\x8b\x3c\x30\x3e\x59\x14\x5e\x67\x5a\x47\x9c\x4f\xf7" + "\xa4\x06\xc6\xa7\x7b\x3e\xf2\xe6\xd3\x48\xcf\x1f\xdc\xb3\x9d\xf1" + "\xe9\x1e\x3d\xe3\xd3\xdd\x55\xa1\xf1\xe9\x9e\x90\xf6\xff\x0e\x1c" + "\x4f\xcf\xca\xc4\xf1\x34\xf0\x29\xc0\xfe\x64\xd9\xe2\x75\x06\x77" + "\xc4\xf9\x34\x4b\x13\x18\x9f\x66\xad\xe9\xc7\xa7\x11\x1e\xe7\xce" + "\x9a\xce\xf8\x34\x4b\xcd\xf8\x74\x6f\x52\x68\x7c\x9a\x15\xc0\xf9" + "\x8f\x40\xc6\x7d\xf7\x69\x71\xdc\xc7\xc3\xb8\x2f\x30\x3e\x35\x2a" + "\xbc\xce\x0c\x8f\x38\x9f\x66\x9b\x02\xe3\xd3\x7d\x93\xbc\xf9\x34" + "\xd2\xe3\xb1\xd9\x36\xc6\xa7\xd9\x87\x18\x9f\x66\x93\xd0\xf8\x74" + "\xdf\xb4\x91\x19\x9f\xfc\xa2\x1a\xc7\x27\xc0\xa7\x00\xfb\x53\xe3" + "\x16\xaf\x33\xce\x23\xce\xa7\x5f\xe8\x03\xe3\xd3\x2f\x3e\xe8\xc7" + "\xa7\x11\x1e\x37\xfc\x82\xc5\x03\xe6\x7e\x91\xcc\xf8\x74\xdf\xde" + "\xd0\xf8\xf4\x0b\xbf\xfe\x4f\x83\xb3\xa3\xef\x4f\x45\x3b\x9a\x07" + "\x3b\x3a\x30\x3e\x35\x29\xbc\xce\x64\x8f\x38\x9f\xee\x57\x07\xc6" + "\xa7\xfb\x97\x7b\xf3\x69\xa4\xed\xdb\xfb\x63\x18\x9f\xee\x57\x30" + "\x3e\xc5\x27\x86\xc6\xa7\xfb\x03\xd8\xff\xe9\xfb\x1c\xd6\x40\x9b" + "\xef\xc1\xa8\x0b\xcb\xe6\x7b\xe0\xdd\xc0\x78\xf5\xe0\xa5\xe7\xd6" + "\xe6\x7b\xc0\xca\x78\xf5\xc0\x9b\x8c\x57\xf7\x3b\x43\xe3\xd5\x83" + "\x7e\xfd\x3f\x0e\x75\x7e\x6b\xa0\xdd\x37\xa7\xfa\xc2\xb2\xfb\xe6" + "\x04\x28\xff\xe6\x7c\x70\x6e\xed\xbe\x39\xa2\xfc\x9b\x23\xca\xbf" + "\x07\x43\x94\x7f\x73\x02\x90\x7f\xbe\xcf\x7d\x0d\xb4\xfd\xe6\xa6" + "\x5f\x58\xb6\xdf\xdc\xc8\xc0\x78\x35\x77\xe5\xb9\xb5\xfd\xe6\xc6" + "\x32\x5e\xcd\x55\x32\x5e\x3d\x34\x2f\x34\x5e\xcd\xcd\x0d\xf5\xbc" + "\xd8\x40\xfb\x2f\xf1\x02\xb3\xff\x12\x02\xb4\xff\x12\xcf\xb1\xfd" + "\x97\x20\xda\x7f\x09\xa2\xfd\x97\x10\xa2\xfd\x97\x18\x92\xfd\xd7" + "\x8f\x57\x62\xbf\x7a\xb8\xe6\xc2\xb2\x01\x1f\x5e\x11\x18\xaf\x1e" + "\x3e\x72\x6e\x6d\xc0\x87\x4b\x18\xaf\x1e\x4e\x61\xbc\x4a\x3c\x10" + "\x1a\xaf\x1e\xf6\x1b\xff\x76\xa8\xf3\x69\x03\xed\xc0\x5f\x66\x5e" + "\x58\x76\xe0\x2f\x03\x1c\xff\xfe\x72\xcd\xb9\xb5\x03\x7f\x29\x8e" + "\x7f\x7f\x29\x8e\x7f\x1f\x09\x71\xfc\xfb\xcb\x00\xc6\xbf\x81\xcc" + "\xfb\xcd\x6f\x40\x1b\xd0\x65\x38\x56\x10\x01\xf4\x8f\xc8\x24\x5c" + "\x4f\x14\xf0\x4b\x09\xfc\xca\xd3\x92\x5e\x03\xf0\xcb\xee\x24\x73" + "\xd7\x34\xd3\xba\x76\x17\xe9\x01\x5e\x9d\x05\x3b\xd0\x6c\x6f\xc3" + "\x33\x7a\x77\xb6\x70\xf3\xd7\x3c\xbe\x46\x4d\x90\x5f\x48\x7f\x97" + "\x72\x41\x15\x05\x7e\x09\xfc\x53\xb6\xc6\x3b\x0d\x56\xf2\xd0\xc9" + "\x66\xba\xda\x4a\x69\xad\xde\x01\x75\xda\x67\xaa\xd5\x37\x10\x90" + "\x2e\x97\x68\x1f\x41\xbe\xcc\xbf\x1a\xd3\xcd\xf6\x06\x82\x7e\x3f" + "\x85\x39\xf0\x66\x5d\xa4\xf3\x7f\x75\x4a\xf4\xdf\x84\xe7\x0a\x25" + "\x1f\x4d\xe6\x13\xa5\x02\xff\xfb\xcf\xa9\x0a\xfc\xff\x5f\x9d\xfa" + "\x65\x3c\x9f\x38\xe2\xb6\xe0\x3c\x61\xfe\x8f\x6f\xd6\x5c\x21\xd5" + "\x71\xf5\x0a\x4a\xa1\x8e\x13\xea\xba\xec\x04\xeb\x59\xd7\x65\x22" + "\x39\xe9\x44\x5d\xd7\xd3\x46\xb2\xbb\xa8\xbd\x2e\xf7\x6b\x92\x70" + "\x1a\xd7\x05\x10\x4f\xf3\x97\x33\x7e\xcf\xdb\xce\x37\xeb\xae\xb0" + "\x72\xf3\x93\xeb\xea\x09\x89\xc8\x03\x5a\x3b\x09\x27\x9c\xd7\xe4" + "\x88\x02\xe8\xa5\x37\xe7\xb6\x10\xa0\x5d\xae\xd9\xf9\x25\xd2\x53" + "\x0f\xef\xa7\xf7\xad\x37\x84\x5b\xf3\x31\x0d\x69\x8b\xfb\x4c\xcd" + "\xa9\x76\x21\x8f\xf4\x9e\xf1\x2e\x97\x98\x33\x7b\x48\x9d\x93\x10" + "\xf8\x5e\xdc\x27\x49\x0d\x80\xaf\x79\x21\xca\xed\xf9\xb6\x91\x99" + "\xaf\x4c\x8a\x45\xbb\xd5\x65\xb0\xc8\x59\x1d\x47\x75\x0c\x8d\x2f" + "\x8b\xc2\x8d\xaf\x5f\x7d\x3a\x3c\x7c\xfd\x2a\x6f\x64\xf1\x35\xd2" + "\xf6\xeb\xaf\xe6\x0c\x0f\x5f\xbf\xfa\x88\xe1\xeb\xd1\x2e\x86\xaf" + "\x5f\x99\xdc\xf8\x1a\xd5\x71\xee\xf0\xf5\xe8\x6e\x86\xaf\x47\x93" + "\x43\xc3\x57\xd2\xac\x91\x99\x67\x5d\x50\x8a\xb6\x36\xe0\x4b\x94" + "\x5f\xe3\x5a\x02\xc0\x97\x87\xfc\x5a\x70\xf3\xf0\xf0\xf5\xd8\x57" + "\x23\x8c\xaf\x11\xb6\xb9\x1f\x3b\x30\x3c\x7c\x2d\xb8\x8e\xe1\xeb" + "\xb1\x79\x0c\x5f\x0b\xb4\x6e\x7c\x8d\x6b\x39\x77\xf8\x7a\x8c\x30" + "\x7c\x25\x99\x42\xc3\xd7\x82\x90\xfc\x5f\x0d\x1c\x1f\x2c\x74\xe0" + "\xf8\xc0\x65\x68\x14\xe5\xd7\xf8\xcf\x86\xc6\x57\xa3\x87\xfc\x5a" + "\xf8\xe2\xf0\xf0\xb5\xf0\xee\x91\xc5\xd7\x48\x8f\x13\x16\x2a\x87" + "\x87\xaf\x85\x5b\x19\xbe\x1e\x7f\x93\xe1\x6b\x61\xae\x1b\x5f\xe3" + "\x3f\x3b\x77\xf8\x7a\x3c\x99\xe1\xeb\x71\x6d\x68\xf8\x7a\xc2\xbf" + "\xff\xe7\xa0\xe6\xb5\x17\x25\xe1\x98\x06\xf0\x25\xca\xaf\xdb\x8a" + "\x02\xc0\x97\x87\xfc\x7a\xf2\xdb\xe1\xe1\xeb\xc9\x3d\x23\x8c\xaf" + "\x11\x1e\xdb\x3c\xb9\x62\x78\xf8\x7a\xf2\x6b\x86\xaf\x27\x23\x19" + "\xbe\x9e\xb4\xba\xf1\x75\x5b\xd1\xb9\xc3\xd7\x13\x26\x86\xaf\x27" + "\x72\x43\xc3\xd7\xa2\x00\xfc\xbf\x06\x32\x1f\xbf\xf8\x10\x8e\xc3" + "\x5c\x86\x26\x51\x7e\x3d\x7e\xcf\xd0\xf8\x6a\xf2\x90\x5f\x8b\x1f" + "\x1e\x1e\xbe\x16\xcb\x46\x16\x5f\x23\x3d\x1e\x4b\xae\x19\x1e\xbe" + "\x16\xdf\xcf\xf0\x95\x9c\xce\xf0\xb5\x38\xce\x8d\xaf\xc7\xef\x39" + "\x77\xf8\x4a\xd6\x32\x7c\x2d\xb2\x86\x86\xaf\xc5\x01\xf8\xff\x09" + "\x74\x1d\x21\x25\x6a\x78\x63\xc8\x25\x6f\x0d\x0f\x63\x4b\x96\x5e" + "\xd8\x63\xc8\x25\xd1\xc3\xc3\xd8\x92\x83\x0c\x63\x4f\x35\x30\x8c" + "\x2d\x79\xe5\xfc\x8c\x21\x9f\x2a\x60\x18\x7b\x6a\x56\x68\x18\x4b" + "\x19\xc1\xf5\x8f\x65\xb9\xc3\x1b\x47\x2e\x9b\x34\x3c\x8c\x2d\xfd" + "\xe8\xc2\x1e\x47\x2e\xdd\x3e\x3c\x8c\x2d\x1b\xcf\x30\xb6\x74\x3a" + "\xc3\xd8\x32\xc5\xf9\x19\x47\xa6\xb4\x31\x8c\xa5\x84\xb8\x6e\xb3" + "\x2c\xa4\xf3\x2f\xbe\xd7\x6d\xf4\xb6\xe1\x8d\x25\xf5\x9b\x86\x87" + "\x31\xfd\x0d\x17\xf6\x58\xf2\x69\xc7\xf0\x30\xa6\x7f\x8e\x61\xec" + "\xe9\xdd\x0c\x63\xfa\x15\xe7\x67\x2c\xf9\xf4\x1c\x86\xb1\xa7\x95" + "\xa1\x61\x4c\x6f\x1f\xb9\xf5\xa6\x67\xe3\x87\x37\x9e\x7c\xe6\xab" + "\xe1\x61\xec\x99\x17\x2f\xec\xf1\xe4\x33\x0b\x87\x87\xb1\x67\xbe" + "\x60\x18\x7b\x46\xce\x30\xf6\x4c\xfd\xf9\x19\x4f\x2e\xaf\x62\x18" + "\x5b\x9e\x1a\x1a\xc6\x9e\x0d\xc0\xff\x7f\xa0\xeb\x64\x2b\x0f\x0c" + "\x6f\x4c\xb9\x72\xf6\xf0\x30\xb6\xe2\xf4\x85\x3d\xa6\x5c\x61\x1a" + "\x1e\xc6\x56\xce\x60\x18\x5b\xa1\x67\x18\x5b\x19\x73\x7e\xc6\x94" + "\x2b\x22\x19\xc6\x9e\x3d\x1a\x1a\xc6\x56\x1e\x1a\xb9\xf5\xbd\x54" + "\xf5\xf0\xc6\x95\xab\x5f\x1b\x1e\xc6\x56\x3f\x76\x61\x8f\x2b\x57" + "\x4f\x1d\x1e\xc6\x56\xef\x61\x18\x5b\x55\xc3\x30\xb6\xba\xf4\xfc" + "\x8c\x2b\x57\x65\x32\x8c\xad\x0a\xd1\x1f\x45\xea\x00\xff\x57\xcb" + "\x57\x65\x2c\x5e\xb1\x3c\x45\xbb\x7c\x55\x7a\xda\x1a\xed\xda\xe5" + "\x1b\x96\xce\xb8\xf6\xb9\x69\xda\xb4\x4c\x6d\xda\xf2\x55\x4f\x8b" + "\x09\x29\x63\xc9\x23\x4b\x57\x2c\xce\xc4\x14\xc8\xfd\xf4\xaa\x95" + "\x4b\x57\xa5\x6b\xd3\x96\xae\x79\x6e\x79\xda\x52\xfc\x7f\xad\x76" + "\xd9\xea\x34\x48\x58\xb2\x74\x79\xc6\x52\xed\x53\xcf\x2d\x5b\xb6" + "\x34\x6d\xed\x58\xf2\xd0\x73\x2b\xd2\x97\xa7\xae\x58\xaa\x9d\xf5" + "\xd0\xdd\x37\xcc\x9b\xfd\xcb\x79\x33\x67\x62\x70\x32\x8f\xd8\x64" + "\x51\xd4\xd0\x1a\x07\x98\x93\x1f\xe7\xd6\x1f\xa9\xd3\x10\x21\x3e" + "\xee\xb6\x0e\xa2\xde\x9a\x46\xe4\x5b\x3a\x88\xc2\xd8\x41\x94\xda" + "\x67\x48\x1c\x35\x4e\xae\x82\xf4\x48\x6a\x9c\x6f\xa7\xc5\xfb\xaa" + "\xa9\x71\x41\xb4\x5d\x75\x97\x15\xf3\x52\xe3\x5d\x6a\x7c\x07\xb4" + "\x95\x43\x7a\x69\x0b\xb7\xbe\xc0\xae\x9a\x69\xca\xf9\x9a\x70\x74" + "\xec\x9a\x39\xaf\xf3\x76\xee\x03\x8c\xd0\x04\x6d\x27\x5c\x5a\x0a" + "\x5c\x89\x84\x5b\x4b\xe0\x52\xc3\x15\x05\xd7\x2c\xb8\xe6\xc0\x95" + "\x0c\xd7\x0a\xb8\x60\x94\xbc\x36\x17\xae\x2d\x70\x95\xc0\x55\x4a" + "\xb8\xf4\x48\xb8\x62\xe0\x82\xbc\xe9\x0b\x59\x39\xe9\x7a\xb8\xb6" + "\xc3\x65\x21\xdc\x73\x50\x56\x86\x12\x2e\xa0\x76\x46\x03\x5c\x49" + "\x70\xa5\xc3\x95\x05\xd7\x6e\xb8\x0e\x43\xbe\x15\xec\xdd\x3a\x48" + "\x5b\x77\x88\x40\x3d\x87\xbe\xd6\x61\x7e\x2b\xe1\x32\xe5\x70\xc1" + "\x37\x33\xab\x21\x5d\xd3\x2f\x5f\xb2\xc7\xff\x59\x43\x94\x59\x16" + "\x91\x77\x95\x55\x88\x81\xc7\xa5\x7d\xe0\xca\x27\x61\x2e\xe3\x4c" + "\x53\xea\xf5\x44\x76\x82\x4b\x33\x9a\x0b\x50\xce\xcc\xb7\xb3\x98" + "\x8e\x69\x46\xa4\x59\x77\x51\x1a\xf4\xf8\x37\xd4\x18\xd3\x2c\x38" + "\xbc\xa5\x19\xc4\xdf\xd7\x58\x65\x0f\x08\x31\xd1\x68\xf1\x84\x77" + "\x69\x4e\xd2\xcb\x2c\xf6\x5b\x9a\x30\x8f\x46\x0d\x13\xd4\x54\xa9" + "\x4c\xc7\x3e\x6f\xda\x20\xd4\x6b\x29\xcd\x27\xe1\xf0\xfb\x14\x0a" + "\x75\xb3\xab\xf6\x55\x43\x3d\xe5\xf8\xec\x32\xde\x65\x3d\xab\xb2" + "\x69\xf1\x7f\x47\x79\x65\x22\x35\xd8\xe2\x71\x9c\x6d\xca\x7e\x89" + "\xb4\xc0\xef\xce\xaa\x5a\xdb\xb4\x0f\x44\xd0\x16\xfc\x6d\x3e\xfa" + "\xa8\x4d\x73\xb0\xbe\x9a\x96\x72\x56\xb5\xaf\xde\x55\x7a\x5c\x0d" + "\xe9\x72\x97\x71\x5f\x35\x2b\xff\x2e\x90\x93\xcd\x76\x2b\xb7\x76" + "\x9e\x90\x5e\x56\xa9\x97\xfe\x87\x7b\xa2\xab\xd8\x56\x82\x77\x55" + "\x1e\xe9\x12\x9e\xf3\xe3\x08\xbb\xab\x89\xf6\x01\x42\xda\xb9\xb5" + "\x67\x6f\xaa\x26\x32\xd3\x03\x58\xef\xb5\x87\x73\xaa\x29\xaf\xcd" + "\x0e\x83\xef\xaf\x3d\xd2\xf7\xdd\x49\xc7\x85\xf8\xa9\xb4\x28\x75" + "\xe1\xae\x97\x08\xc1\xdf\x62\xdd\x76\x4c\x20\xf2\xf2\x97\x88\x02" + "\xdb\xd8\x5d\xb4\xd6\x2e\xc5\xa1\xc3\xdf\x70\x90\xff\xfe\xfb\x73" + "\xa8\x47\xd9\xef\xb9\x58\x7b\x92\x19\x4d\xd3\xb5\x56\xd9\x7d\x4e" + "\xcc\xaf\xbd\x46\xa0\xe5\x52\xf1\x7d\x0a\xf2\x13\xcb\xa7\xc6\xd6" + "\x38\x7c\xc6\x38\x77\x11\x80\x1a\x6d\xf6\xd4\x43\x8c\x46\xb6\x78" + "\x2c\x07\xf3\xd3\xe2\x66\xf8\x7f\x2d\xf4\x1b\x81\xc6\x3a\xed\x2a" + "\x12\xd7\xc2\xa5\x1b\x5d\xc6\x89\x05\x50\x06\xf4\xbb\x89\x5b\x20" + "\x7f\xb2\x40\x6f\x63\xb3\xd5\xca\xa5\xe7\xc2\xbb\x2d\x7d\xb1\x2f" + "\x19\x9d\x65\x90\xaf\x14\xea\xf4\xa6\x55\xb6\x48\xc0\x09\xcd\xa0" + "\x47\x31\xc6\x66\x67\x06\x75\x26\x38\x9b\x79\x90\x55\x04\xde\x1f" + "\xb5\x92\x85\x6a\xa9\x8d\x8c\xf7\x7d\xe5\x2c\xc5\x67\xbb\x4a\x28" + "\xc7\xe9\xab\x1c\xf8\xf6\xe1\x45\x4e\xad\xac\xe7\x0c\xad\xdf\xf6" + "\x28\xd2\x91\xd0\x9e\x0c\x5a\xb3\x29\x9e\x3a\x8a\x3f\x23\xa4\x56" + "\x6f\x21\xd0\xe7\xa3\xc2\x65\xd4\x9e\xb0\x9e\x44\x84\xa7\x46\xd0" + "\x8f\xaa\x2d\x64\x63\x3c\x6d\xc3\xb8\xbf\x75\x5d\x36\x92\xf5\x05" + "\x51\xe6\xd4\x92\xc8\xac\x78\x6a\xaf\x49\xb6\x10\x96\x5e\x4b\x72" + "\xbe\x22\xf2\x8d\x87\xa9\x63\x2e\xc8\xff\x4f\x2c\x98\x6e\x23\x18" + "\xa3\x32\xa7\x8d\x3a\xb3\x9f\x20\x4a\xfc\xbf\xf6\x30\xa6\xb7\x92" + "\x9c\x93\x44\x9e\x90\x69\x8f\xa8\x80\x6f\xe2\xef\x77\x41\x5d\xf8" + "\x33\xf4\xdd\x6d\x67\x08\xd9\xf8\x18\xd1\x64\x2d\x26\xea\x04\x17" + "\xa1\x66\xe7\x5b\xa0\xab\x29\xe8\x97\x23\x64\xd3\x72\xa2\x48\x70" + "\xe2\x39\xb6\xcf\x09\xc6\xfd\xde\x05\x79\xa1\x6d\x26\x6c\xdb\xc6" + "\x46\xa2\xc1\x38\xe8\xec\x37\xef\x89\xbf\x69\x24\x48\xb3\xb3\xaa" + "\x05\x5a\x87\x71\xc1\x6e\x68\x7b\x35\xd2\x00\xbe\x53\xcf\xe3\xef" + "\xe0\xf7\xdb\xd2\x04\x1a\xc8\x16\x39\x89\xd2\x65\x6c\xae\x5e\x94" + "\x69\x12\xca\xb5\x72\x19\xf2\x5d\x69\x42\x9d\xbc\xf2\x26\x38\x69" + "\xa7\x5d\xd5\x0c\xb8\xcf\x98\x96\x90\x39\x93\xe2\x6f\x81\x97\xdb" + "\xbb\x8b\x32\x56\x48\xf4\x96\xf8\x02\x79\x92\x81\x17\xdb\xc3\x52" + "\x89\x1c\xde\x1b\xac\xb2\xc5\xed\x1e\x58\x73\x00\xcf\x47\x4b\x79" + "\xc5\x3c\x55\x56\x59\x72\x8c\x47\x1e\xc4\x57\x5f\x1e\x78\x5f\x0f" + "\x65\x4c\x67\xdf\xc8\x28\xc1\x3c\xa2\xec\x97\xf2\x86\x51\x83\x32" + "\xde\xa5\xb2\x25\x52\x8e\x3a\x00\x8f\x6d\xb4\x53\xa3\x9c\xeb\xa4" + "\x0e\xde\xd8\x84\x72\x5e\x89\x71\x5d\x59\xfe\x75\x8b\xe1\xbd\x5d" + "\x9b\x21\xfc\x9f\x8e\xdf\xa1\x86\x7d\xf6\xbe\x77\xf9\x64\x14\x2d" + "\xaf\x8c\x03\xdd\xa1\x4e\xa8\xa6\x0e\x97\x71\x7f\x5c\x71\x1a\xea" + "\x0e\x5b\x1c\xf6\x6b\x5e\xd5\xec\x70\xec\x68\xb5\xa3\x7c\xc2\x3e" + "\x42\x0d\x4d\x56\xb1\x1e\x67\xb1\xdf\x30\x59\xb3\x2e\xd6\x05\x65" + "\x40\x9d\xe6\xc0\xbb\x51\x2d\xdc\xba\x03\x78\x9e\x14\x9e\x0b\x58" + "\xdc\xcb\x75\x7f\x62\xf8\x55\xc6\x7b\x3d\x73\x48\x3b\xe8\x4f\x20" + "\xb3\x50\x3e\x40\xfa\xa7\xee\x3e\x2c\xd0\x8d\x63\xb2\xa8\xc9\xce" + "\xe4\x48\x18\x0f\xf9\x64\x2d\x62\x7f\x3c\xab\x9a\x68\xe8\x2e\x5a" + "\x07\xf8\xbf\x3b\xcb\xab\x9f\x14\x2b\xac\x18\x63\x13\xea\x12\x76" + "\x9c\xcb\xbc\x0e\xee\x63\xe0\x7e\xc3\xdf\xab\x91\xdf\x42\xb9\xe3" + "\xf0\xff\x1d\x97\x51\xfb\xac\xd9\x04\xe3\x69\x42\x7f\xcb\x9c\x65" + "\x25\x5b\x23\xb1\x9c\xad\x18\x67\x14\xd2\x30\x0f\xa4\x2f\xb4\x92" + "\x22\x39\x2b\x7f\xad\xbc\x0b\xea\xda\xaf\xfc\x3c\x56\x3e\x2b\x17" + "\xcb\x93\xca\x2e\xff\x1d\x6d\x17\xcb\xde\x2d\x95\x6d\x84\x34\xa9" + "\xfc\x59\x2b\xfb\xbe\x61\x82\xf7\x06\xcf\x36\x94\xfe\x8e\x76\xed" + "\x10\xe2\x89\x66\x5a\xac\xa4\x22\x0e\xdf\x6d\x81\x34\xfc\xad\x07" + "\xae\xc2\xfe\x1e\x0f\x65\x1c\xc6\x32\xd6\xcb\xad\xa4\xac\xba\x9f" + "\x8c\x53\x49\x32\x8e\x95\xb5\x5e\x27\x95\xe5\x51\x8e\x88\x27\x4d" + "\x92\xc8\x57\x2c\x57\x89\xe5\x42\xfe\x24\x2b\x31\x44\x79\xb6\x1d" + "\x68\x9e\x25\xbe\x4b\x07\xba\x4f\xf7\xee\x07\xe9\xc9\xb4\xd8\x96" + "\x84\x32\x4e\x2c\xcb\x88\xf2\x5a\x7a\x8f\x31\x48\x41\xae\x17\x60" + "\x5f\x12\x64\xbb\xb1\xb9\x1e\xca\x79\xb7\x9f\x2c\x97\x63\x3e\x57" + "\x51\xea\x3b\xe5\x18\x83\xf5\x32\xda\x06\x79\xac\x5e\x71\x47\x39" + "\x72\x17\xa4\xf5\xc5\x3f\x2d\x86\x3c\x60\xaf\xf9\xf5\xef\x98\x7d" + "\x35\xe1\xcc\x65\x56\xb4\xad\x11\x73\xd3\xcd\x51\x5d\xc4\x5c\xc6" + "\x13\xbe\xa2\x32\x35\x2e\x9b\x9a\x8e\x73\x1b\xd6\x60\x3c\xeb\xe0" + "\xf4\xf5\x06\x16\xff\xb3\x07\x6c\xce\xac\x5b\x08\xea\xe8\x53\xdc" + "\xc6\x3d\x66\x7b\x87\xd0\xef\xe0\x7f\xc1\x1e\xf8\x0d\xd8\xa8\x68" + "\xa7\xc2\xd8\x40\x5f\xc2\x31\x5b\x95\x87\xbc\x15\x98\x8e\x76\x2c" + "\xc8\xd0\x5d\x1e\xef\x68\x45\xa5\x8e\xd1\x6e\xe3\x63\x82\xae\xc0" + "\xfa\x3a\x7f\x61\xc2\x3a\xf3\x65\x95\x3a\x6c\x43\x4e\x26\xe5\xcd" + "\xce\x6e\x13\xca\x59\x6d\x06\xda\xd8\x1b\x7f\x96\x50\x4e\x28\x5f" + "\x5e\xa9\x0b\xae\x0d\x1b\x05\x3b\x0f\xc6\x11\xa7\xec\x93\x2b\x75" + "\x18\x07\x7a\x5b\xf6\x28\xc5\xbd\x65\xd4\xd4\x39\xa5\x32\xb5\xbb" + "\x68\x63\x92\x14\x67\x37\xc8\x72\x93\xa4\xb6\x57\x88\x6d\x07\x7a" + "\x09\x63\xb6\x9b\x4a\x85\xf8\xdf\xf0\xbc\xb1\xc4\x1f\xbf\xa8\xa1" + "\x39\x09\x7f\x0b\x6d\x8f\xdb\x25\xd1\xc9\x69\xc7\xf8\xe7\xe3\x4f" + "\x70\x59\xd7\x26\x64\x99\x88\xe0\xd3\xdf\xd8\x9c\x14\x64\xbd\x84" + "\xf9\xaf\x3a\x18\xc3\x24\x38\xdf\xa7\x4c\x26\x66\x3d\x34\x57\x2c" + "\x0f\xdf\x49\xbc\xaa\x10\xc7\x16\xc1\x7f\x23\xcb\xef\xfc\x87\x47" + "\xbb\xd4\x3e\xda\xe5\x0a\xbd\x5d\x59\xd5\x03\xdb\xb5\xe9\xda\x91" + "\x6d\xd7\x26\xbf\xfb\x9f\x3d\xda\xa5\x1d\xd8\xae\x4d\x9f\x87\xde" + "\xae\x4d\xbb\x7d\xb4\xcb\x35\xb2\xed\xca\xf6\xbb\xff\xc1\xa3\x5d" + "\xd1\x03\xdb\x95\x7d\x30\xf4\x76\x65\x67\x0e\x6c\x57\xf6\xe7\x23" + "\xdc\x2e\xbf\xe7\x7f\xfd\xca\xc3\x62\xdb\x6e\x26\x0f\x73\xf2\x82" + "\x97\x87\x39\x73\x06\xca\xc3\xdc\x3f\xb9\xe5\x61\x6e\x79\x48\xf2" + "\xb0\x78\x9f\x68\x6f\xe4\x2e\x1f\x20\x0f\x0d\xfb\xac\xbe\xe5\x61" + "\xee\x6c\x41\x1e\x1a\xf7\x05\x19\x0b\x3d\x57\xdd\x27\x0f\x55\xfb" + "\xac\x5e\xf2\x30\xdc\xb6\xbb\xbb\x28\x57\x1f\x9a\x3c\xcc\xd5\x0f" + "\x94\x87\x39\xd5\xde\xf2\x30\x77\xf7\x20\x38\x6c\xf0\x25\x0f\x13" + "\x9c\xdf\x50\x11\x1b\x0d\x41\xd6\xc7\x31\xc8\xb7\x92\x87\xf8\x56" + "\x72\x70\xdf\xca\xf3\xbb\xff\x03\xc6\xb1\x7a\xb0\x41\xd4\x9b\xf6" + "\x10\xee\x38\x8c\xc4\xeb\xa2\x1a\x60\x8c\xe0\x20\x37\xa6\x02\x26" + "\xf2\xc9\xf4\xba\xb2\x76\x52\x17\x75\x9c\x50\x95\x52\x4f\x2b\xdf" + "\xb6\xc7\xa5\x21\x36\xf3\x27\x9b\xd3\x1d\x41\x62\x33\xaf\x4d\xc2" + "\x66\x9d\x13\xb0\x99\x81\x78\xdc\xfc\x90\xb9\xfd\x84\x88\xcd\xcd" + "\xb7\xf7\xf1\x27\x9f\xe1\xd3\x27\x36\xa1\x4f\x78\x63\xb3\x39\x91" + "\x61\x73\xf3\xa8\x81\xd8\x6c\x4e\xf4\x8d\xcd\xfc\xaf\x18\x36\x9b" + "\x13\x83\x6b\x43\xfe\x01\x37\x36\x9b\x13\xbd\xb0\xf9\xe3\xb7\xc1" + "\xb6\xdb\x2c\x0f\x0d\x9b\x9b\xe5\x52\xdb\xcb\xc5\xb6\xc3\xb7\x52" + "\xbc\xb1\xb9\x79\xba\x5f\x1e\x6e\x71\xec\x05\x79\xa8\x3c\xc1\x15" + "\x28\x5d\x60\xd3\xf2\x86\x7b\x1b\x60\x4c\xd6\x8d\xf1\xe4\x29\x17" + "\x43\xe8\x3a\x9d\xb2\x1b\xc6\xc6\xdd\xdd\x7a\x05\x0d\x1f\xd7\x41" + "\x7b\x35\x04\xea\x1e\x41\xbb\x75\xe1\x40\xb3\xa9\x70\x9f\x50\x9e" + "\x41\x22\xe1\xd2\x94\x8b\x74\x85\xff\xa3\xe9\x3a\xcd\xd8\xe2\x0c" + "\x32\x2d\xa2\x8b\x28\xa0\x0e\x49\x11\x79\x6a\x12\xe1\x24\x91\xf8" + "\x3f\xcd\x6f\xc9\x84\xb1\x9b\x1c\xe7\x45\x79\x15\x7c\x2f\x33\x82" + "\xd2\xb5\x3a\x02\xe3\x38\x05\xf0\x40\xb3\x8b\xa3\x55\xae\x75\x3a" + "\x8e\x86\xdb\x1e\xa7\x60\x8a\x60\x9d\xf8\xa9\x7f\x8d\xa6\x95\x70" + "\xe5\xe8\xf1\xbb\x71\x18\xd7\x98\xfe\xf8\xaf\x31\xb4\x5b\x33\xd6" + "\x78\x86\x4c\xdb\x95\x41\xa6\x56\x64\x10\x1d\xed\xd5\x71\x40\x83" + "\xa4\x27\xd7\xa8\x91\xef\x49\x94\x83\x6f\x65\xc0\xb7\x9c\x38\xfe" + "\x83\x6f\x39\xe1\x5b\xdf\xc0\xb7\x4e\xc1\xb7\xf2\xe1\x5b\xf9\xec" + "\x5b\xc1\xd1\xbc\x20\x73\xb0\xf9\xeb\x84\x4d\x53\xd0\xcf\xee\xbf" + "\x22\x32\xc7\xc4\xe3\x5c\x76\xe7\x46\x7d\x90\x78\x2f\xf0\x7b\xfe" + "\x65\xdb\xeb\x24\x8a\x2a\x67\x34\xcc\x7d\xbe\x99\xe2\x18\xfb\xf9" + "\xd7\xc9\x34\xec\x73\x75\x8e\x93\xd0\xcf\x66\x34\x1c\xd1\xb5\x07" + "\xf9\xad\xe7\xfd\xee\x7f\x2e\xca\xa7\xf5\xbd\x51\x38\x2e\xb4\xe9" + "\xb7\x71\x34\xb3\x27\xaa\x32\xf9\xe3\xa3\x3d\x64\x51\x26\xce\x97" + "\xd3\x4c\xed\x02\xa2\x68\xe1\x5e\x70\xe4\x7c\x81\x73\x8f\xcf\x57" + "\x7b\xcf\x3d\x3e\xdf\x4e\xb8\x5f\x97\x10\x6e\x8b\x89\x70\x45\xf1" + "\x04\xf2\xf5\xbb\x72\x13\x5e\x9b\x42\xb2\x9d\xf4\x5f\xd4\xb0\x3f" + "\xb6\x18\xc6\xc1\x09\xd7\xc9\xac\xa6\x0c\x9c\x8b\xfb\xf5\x56\xa0" + "\xdf\xff\x81\x0e\x8a\xc0\xff\xb1\xbc\xd4\x34\x32\xf1\x04\xf7\xeb" + "\x2d\x11\x5d\x63\xe2\x9d\x4a\xdb\x16\x27\x8c\xdf\x7a\x35\xad\xf6" + "\xb3\x06\x5b\x5c\x2f\x8e\x69\x9f\x42\x39\x50\x98\x17\x21\xcb\x85" + "\x71\xeb\xbd\x0d\x94\x6a\x70\x7e\x39\xa9\x0c\x2e\xe4\xbd\xc0\xf7" + "\xf0\xf1\x7b\x11\x1f\x88\xc5\x5d\x2c\x5d\x8d\x78\xdc\x26\xea\x6c" + "\x7b\xd8\xf5\xc9\xd8\x07\x5c\xf0\xfb\x9c\x56\x12\x65\xb6\xb8\x08" + "\x60\x3a\x69\x91\x4b\x81\xfd\x28\xc9\xb4\xe0\x33\x72\x3c\x95\x70" + "\x39\xdf\x12\x15\x60\x48\x89\xfd\x81\x87\xfe\x90\x60\x89\x70\x40" + "\xbf\xe6\xb3\x4f\x93\x08\x94\x13\xe8\xc3\xd9\xdc\x6e\x25\xfc\x37" + "\xba\xf0\x97\x57\x91\x48\xe7\x37\xfa\x09\xf6\x6f\xf4\x13\x77\xf0" + "\x24\x32\x3c\x95\xa8\xcb\x57\x01\x76\x57\x43\xff\x38\x05\xfd\xa3" + "\x9d\xf5\x8f\x3e\xbc\x16\x71\x4e\x3c\x1f\x24\xf4\x0d\xa3\xd8\x37" + "\xd6\x01\x5e\x33\xdc\x7d\xc3\xb9\x5a\xc7\x95\x73\x94\x40\x1d\x81" + "\xee\x05\x87\x76\x65\x8f\x51\xe0\xb8\x9e\x4e\xa9\xac\x07\xb9\x0b" + "\x6d\xa5\xce\x37\x80\x17\xa3\xae\xe3\xb4\xd4\x68\xdb\xf2\x71\x62" + "\x1b\x71\x8f\xe9\x5e\x38\xdb\x33\xb9\x32\x59\xfb\x08\xfd\xa6\x85" + "\xfb\x75\x2e\xa4\x2b\xb4\x8f\xfe\x44\x0d\x7c\x3c\xcb\xc6\x80\x2f" + "\x38\x70\x3e\xc1\xca\xfd\x1a\xfd\x01\x11\x5c\x43\xf9\x44\x98\x3f" + "\xdd\x72\x08\xf2\x12\x17\xd0\xdc\xa9\xdc\x67\xe7\x95\xb6\x24\xd3" + "\x33\x3d\x42\xdf\xec\x05\x1e\x1c\x5f\x41\xb8\x45\xc0\x71\x90\x0d" + "\x2a\x90\x09\x28\x33\x12\x05\x99\x61\x18\xd7\x9e\x65\xa5\x7c\x42" + "\x4a\x18\x05\xba\x28\x70\x0e\xe9\xc9\x54\x42\x37\x9d\x04\x1a\x75" + "\x35\xa0\x7c\x09\xe7\xd7\x31\x19\xf2\x32\xd0\x47\xd5\x4e\xd4\xb4" + "\x78\x66\xfd\xeb\xd9\xd5\xa3\x5c\x80\x73\x94\x23\x11\x79\xb2\x4b" + "\x80\x57\xe1\x06\xec\xe7\xd0\xef\x23\xf2\x04\xb9\x26\xf0\xd6\xb9" + "\x4e\x77\x4d\xef\x3a\x9d\x16\xae\x29\x92\xac\xc1\xb8\x61\xe5\x28" + "\x67\x8a\x9e\xc7\xf8\xe7\x72\x73\xa6\x95\x38\x81\x96\xe1\xa8\x97" + "\xd6\xe9\xa2\x04\x9a\x3e\x0d\x34\x5d\x46\x14\x37\x39\x88\x0c\xea" + "\xa5\x86\x3a\x93\x5a\x7d\x0b\x41\x1a\xbb\xa0\x1f\x21\x9d\x7b\x51" + "\x06\x01\xd6\xc0\x4e\xb1\x3f\xb4\x5c\x4b\x8e\xe8\x3e\x27\xe8\x07" + "\x2a\xe7\x2c\xfd\x0a\xe7\x6f\xcd\x99\x4e\xe8\x73\xb6\x2d\x48\x5b" + "\xa0\x57\xd2\xc7\x89\x0e\xe2\x1f\xd3\x45\x77\xbb\x31\x5d\x74\xb7" + "\x1b\xd3\x45\x71\xc2\xfa\x87\x07\xae\xcf\x96\x02\xae\x95\x9e\xb8" + "\xde\xfa\xd8\x39\xc5\xf5\xdc\xe0\x71\xbd\xe3\x94\x07\xae\xb3\xbf" + "\x1b\x5c\x7f\x92\x24\xe0\x3a\xac\x77\xb2\x80\xd7\x85\x66\xe7\x9f" + "\x89\x95\x2b\x9a\x26\xe1\xf6\xa3\x7d\x88\xdb\x17\x52\x2f\x54\xdc" + "\x9e\xed\xd6\x69\xe1\x1a\x71\xdc\x42\x99\x01\xe3\xf6\x93\xa4\x1e" + "\x22\xd1\x0f\xf1\x4b\x0d\x33\x1a\xb4\x39\x64\x26\xd0\xcd\x11\x91" + "\x37\x85\xd4\x32\x1a\x3a\xb4\x8f\x52\x1e\x64\xc4\x6b\x88\xa7\x9e" + "\x7c\x4a\x79\x65\xb3\x23\xe7\x53\xa2\xe6\x0d\xfb\xe3\xcc\xce\x83" + "\x24\x22\x95\x08\xf3\xea\x54\xb5\xa0\x54\x58\xb3\xe2\x88\x9c\x37" + "\xde\xa5\xc6\xb9\x2b\x9c\x5b\x74\x19\x5b\xe3\x78\xe3\xe4\x2a\x5e" + "\x35\xdf\x8e\xeb\x59\x54\x75\x97\xb5\xbb\xe8\x05\x87\xb4\xd6\xe2" + "\xdb\xbe\x6c\x8d\x83\xfe\x22\x3f\xce\x19\x4e\xc3\x9d\x83\xfb\x8b" + "\x70\x0f\x83\xbb\x10\xb7\x2e\x38\x3d\x67\x10\xe3\x3f\xdb\xb6\x33" + "\x39\x68\xb8\x41\xe8\x83\xd7\x13\xd5\x09\xf1\xff\xee\x22\xc3\x16" + "\x69\xed\xc6\x9d\x5f\xa2\x87\x61\x2a\x7e\x1b\x68\x22\x67\xeb\x49" + "\xec\xd9\xa3\xbc\x6b\x85\x67\x22\xd7\xd2\xe2\xfd\x04\xd7\x7d\x01" + "\x4b\xb2\x6e\xaa\xbf\x4b\xbc\xcf\x40\xac\xe2\x1c\x2c\xda\x79\x4c" + "\xd6\xb2\x6f\x74\x17\x19\x01\xb7\xcf\x17\x78\x7e\xd7\x17\x3d\xac" + "\x9c\xd1\x6f\x4c\x9f\xe0\x68\x61\xf4\x1b\xff\x71\xb6\xce\x45\x83" + "\x2c\xcb\xef\xf9\x4f\x1a\x55\xa9\x4d\xd8\xeb\x32\xf1\xbd\x49\x11" + "\x47\xb2\x4e\x06\x69\x97\x18\xfd\x8e\x7f\x5d\x4a\xab\x3a\xe1\xba" + "\x29\xc4\x55\x56\xa9\xc5\xb9\x4e\xb4\xb5\xea\x74\x4e\x82\xf6\xd6" + "\x6b\xcf\x58\xb9\x5e\xb0\x19\xc3\xa1\x3f\xce\xed\x7a\x9f\x6e\x3b" + "\x01\x36\xea\xba\xa4\x88\xe2\x67\xc8\x74\xe7\x37\x9a\xb1\x2f\x80" + "\x0c\xea\x01\x79\xd0\xf3\x8d\x3e\xa2\x2e\xd5\x41\xf8\xf2\x4a\xad" + "\xd9\x59\x4d\x76\x41\x3e\x94\xbf\x58\xdf\xb3\xdf\x24\x85\x17\xad" + "\xc2\xf5\x8b\xd3\xc4\xf4\xd4\x3e\x90\xbf\xc5\x8d\xa3\x36\x81\xcc" + "\x01\x99\x21\xc8\xe1\x10\x64\x70\xcf\xe6\xeb\x93\x1f\x5a\x48\x1d" + "\x75\x96\xcf\x48\x4e\x2d\x51\xe7\x3c\x47\x54\x58\xbe\xd9\x59\xcb" + "\xe4\xf2\x63\x20\x97\xe1\xb9\xc2\x43\x2e\x0b\xfb\x0b\xfa\xc9\x65" + "\xb4\xbf\xeb\x6c\x6d\x24\xbc\x8b\x8c\x99\xdb\x15\xe1\xc8\xee\xa2" + "\x3c\xda\xe3\x66\xe7\x49\x3c\x7b\x1c\x2e\xc9\xe8\x9d\x60\x77\xf4" + "\xae\x66\xf2\xb9\x5c\x94\xcf\x3b\x4f\x0d\x5f\x3e\xef\xcc\x07\xf9" + "\x0c\xf6\xde\x0e\x94\xcd\x20\x97\x0f\x1c\xb7\x73\x4e\x90\xc5\xc1" + "\xf1\x76\x9b\xdf\xfd\x1f\x73\x41\x7f\x22\x4f\x11\x3b\xb5\x7b\x9d" + "\xb8\x1f\xe1\x5f\xae\xf0\x63\xc9\xa8\x1f\x7b\x40\x37\xbe\xf6\x4c" + "\x03\x17\x9e\x09\xbc\x4d\x7d\x9f\x3a\xd7\x26\x45\xd0\xde\x24\x95" + "\xcb\x60\x55\x3b\x7b\x35\x8a\xde\x5e\xe0\x2f\xc8\x0b\xd0\x57\x6a" + "\xfb\x46\xbd\x40\x13\x7e\x72\xa5\x96\x2f\x7c\x46\x01\xba\x29\xb6" + "\xe2\x14\x89\xa1\xc6\x63\xb9\x4e\xe3\x31\x43\xaf\xf1\x58\x01\xe0" + "\x32\x1c\xec\x47\xe0\xf9\x59\x13\x6f\x3c\xb6\x9b\x2f\x6e\x4a\x76" + "\xa9\xac\x6a\xbb\xea\xd8\x16\x78\x2e\xe5\x37\x02\x0e\x36\x10\x61" + "\x4d\x4b\x3b\x17\xf5\x70\x49\xab\x2f\x1c\xec\xc8\x0f\x4e\x17\x3f" + "\x94\x04\x38\x68\x00\x1c\x7c\xeb\x89\x83\xf7\x88\x33\x5f\xd4\xd1" + "\xf3\x19\x16\x80\xee\xc2\x58\xa6\x4f\x4f\x3f\xf2\xb1\x6f\x3c\x58" + "\x02\xc3\x43\xcf\x37\xde\x78\x28\x0b\x11\x0f\xa0\x5f\x35\x15\x30" + "\x6e\x3a\xfb\x8d\x8e\x2b\x43\x3c\x7c\xee\xc6\xc3\xfe\x26\x3b\xd7" + "\x1b\x34\x1e\x5e\xac\x0e\x12\x0f\xd6\x61\xe2\x21\xd9\x8d\x07\x0b" + "\xe8\x58\x8b\xb2\xd7\x68\x91\xbb\xf1\x70\x1a\xf0\x60\xd1\xba\xf1" + "\x60\x51\xc0\xb3\x66\x20\x1e\x5e\x3a\x7d\x7e\xf1\x30\xaa\xe3\x87" + "\x81\x87\xdf\xf8\x1d\xff\xfa\xc6\x83\x65\xb8\xf2\xe1\x90\x07\x1e" + "\x40\x3e\x58\x40\x3e\x58\x3c\xe4\xc3\x49\xc4\x83\x87\x7c\xb0\x80" + "\x7c\xb0\xf8\x90\x0f\xbf\x1d\x75\x7e\xf1\x30\xae\xe5\x87\x81\x87" + "\xdf\xb6\x05\x89\x87\x61\xca\x87\x67\xd5\x6e\x3c\x34\x82\x7c\x68" + "\x04\xf9\xd0\xe8\x21\x1f\x1a\x01\x0f\x8d\x1e\xf2\xa1\x11\xe4\x43" + "\xa3\x0f\xf9\xf0\xfb\x4b\xcf\x2f\x1e\xc6\x7f\xf6\xc3\xc0\xc3\xef" + "\xfd\xce\x7f\xfb\xc6\x43\xe3\x30\xe5\xc3\xb3\x7a\x0f\x3c\x80\x7c" + "\x68\x04\xf9\xd0\xe8\x21\x1f\xde\x43\x3c\x78\xc8\x87\x46\x90\x0f" + "\x8d\x3e\xe4\xc3\x8e\x6b\xcf\x2f\x1e\x6e\x2b\xfa\x61\xe0\x61\xa7" + "\x22\x48\x3c\x0c\x57\x3e\x98\xdc\x78\x68\x02\xf9\xd0\x04\xf2\xa1" + "\xc9\x43\x3e\x6c\x02\x3c\x34\x79\xc8\x87\x26\x90\x0f\x4d\x3e\xe4" + "\xc3\xcb\x3f\x3b\xbf\x78\x78\xfc\x9e\x1f\x06\x1e\xca\x34\x43\xe1" + "\x41\xc2\x02\xe2\x02\xb1\xd0\x9b\x93\x44\x70\x9c\xf1\xda\x09\x86" + "\x07\xc4\x81\x80\x89\xce\xa4\x08\x17\x60\xc1\xb9\x11\xb0\xd0\xc3" + "\xb0\x80\xb4\x40\x3c\xe0\xb8\x02\xc7\x13\x88\x09\x17\x8c\x29\x9c" + "\x2a\x18\x53\xe4\xc9\x35\x88\x83\x1e\xe5\x10\xe3\x8a\x1e\x22\x8c" + "\xfd\x70\x8c\x77\x8a\x2b\x9f\xe1\x0b\x07\x3b\x83\x9c\xe3\xeb\x1b" + "\x5f\x7a\xe1\xe0\x88\x1b\x07\x8f\xf9\x19\x57\x3c\xea\x07\x07\xd6" + "\x00\x70\x70\x6a\xe0\x38\x73\xb8\x38\xe8\x59\x2d\xe2\x00\xc7\x99" + "\xbc\x38\xce\x7c\x0a\xc6\x99\xaa\x60\x71\x50\xa1\x0d\x0d\x07\x16" + "\x6b\x70\x38\x78\x56\x8d\x76\x02\xc3\x41\xa3\xd2\xa9\x02\x5b\xc1" + "\x0b\x07\x83\xd8\x0b\x5e\x38\xd8\x35\xfb\xfc\xe2\xa0\x9f\xbd\xf0" + "\x6f\x8b\x83\xdd\x7e\xcf\xff\xf2\xc0\x77\x94\xf7\x38\x6f\x8f\xe7" + "\x4c\xc2\xed\x6c\xde\x08\xcf\x9b\x6c\x5b\x45\xa6\xa2\x8e\x70\xad" + "\x4b\x8a\x30\x9c\x22\xd3\xb7\xae\x22\x72\xe7\x5a\xe0\x7f\x1a\x91" + "\xf7\x70\x84\xf4\xac\xd5\x47\xd4\xd8\xec\x6c\x0e\x09\xf7\xa3\x42" + "\xfe\x5e\x03\x9b\x43\x72\x75\x26\x85\x6f\xed\x60\x7b\x60\x4d\x4f" + "\xfe\x01\x78\xbb\xe7\x6a\x5f\xbc\x7d\x39\x08\x59\xdf\xe3\x29\xeb" + "\x4f\x7a\xf3\xd6\x53\xce\x97\xe5\x7b\xcc\x21\xcd\xf5\x33\x87\x14" + "\x00\x4f\x85\xb9\xfd\x53\x4c\xce\xf7\xcd\x21\x0d\x73\x8e\xbf\x17" + "\x64\xfc\x4e\xce\x5b\xc6\x87\xc6\xd3\x3d\xce\xc1\xe6\x1d\xb1\x7f" + "\x63\xbf\x96\xfa\x74\x9f\x8e\xc7\x7e\x0c\xfc\x3e\x6b\x38\x96\x22" + "\xe8\xfa\x8d\xee\x3e\x8d\x7d\x19\xfb\x35\xf6\x63\x41\xd7\xa3\x4f" + "\xe2\xc2\x15\x9a\x0a\x8f\xb9\x23\x97\x4a\x94\xf3\x3e\x64\x3c\x3f" + "\xa8\x8c\xff\x0f\x9f\xfc\xff\x3e\xc8\x78\xc4\x81\xd4\xbf\x2f\xbc" + "\xbe\xfd\x8a\xff\xfd\x5f\x81\xe1\xc0\x16\x00\x0e\xac\x80\x83\x15" + "\x15\x1e\x73\x46\x2e\x95\x05\xe4\x3c\x9b\x33\x62\x38\x70\xcf\x19" + "\xf1\xfd\xe7\x8c\xbc\x70\xf0\xea\x75\xe7\x17\x07\xfd\xe6\x8c\xfe" + "\x6d\x71\x50\xa9\x1c\x1e\x0e\x2c\x01\xc8\x03\x0b\xca\x03\x93\x07" + "\x0e\x40\x1e\x58\x40\x1e\x58\x3c\xe4\x81\x7b\xae\x88\xef\x3f\x57" + "\xe4\x85\x83\x3f\xde\x7c\x7e\x71\xd0\x6f\xae\xe8\xdf\x16\x07\x7b" + "\x23\x87\x89\x83\x00\xe4\x81\x05\xe4\xc1\xca\xc8\x0a\x8f\x39\x22" + "\x97\x4a\xb4\xfb\x7c\xd8\x7c\xfc\xa0\x36\xdf\x6b\xb7\x7f\x5f\x6d" + "\xbe\x0b\x1b\x07\xfb\xfc\xae\x95\x06\x86\x83\xc6\x00\xe4\x41\x23" + "\xc8\x83\x95\x7a\x0f\x1c\x80\x3c\x68\x04\x79\xd0\xe8\x21\x0f\xdc" + "\x73\x43\x7c\xff\xb9\x21\x2f\x1c\xec\xbf\xfb\xfc\xe2\xa0\xdf\xdc" + "\xd0\xbf\x2d\x0e\x0e\x4c\x1d\x26\x0e\x02\x90\x07\x8d\x28\x0f\xde" + "\xad\xf0\x98\x13\x72\xa9\x9a\x40\x1e\x34\x79\xc8\x03\xf7\x9c\x10" + "\xdf\x7f\x4e\xc8\x0b\x07\x07\xef\x3f\xbf\x38\xe8\x37\x27\xf4\x6f" + "\x8b\x83\xd7\xfd\xee\xab\x90\x30\xd0\x37\x07\x40\xdd\x38\x10\x78" + "\xbf\x36\x29\xa2\x47\x79\x2c\x45\x1a\xff\x1b\x06\x8c\xff\x57\x68" + "\xfc\xce\x03\xf5\x5b\x5f\x16\xc6\x06\xc5\xc7\x92\xd9\x38\xc1\xaa" + "\x46\xfe\xbf\xb0\x81\x8d\x13\xb5\x8f\x22\xff\xdf\xf0\xcd\xff\x60" + "\xe7\x04\x53\x80\xff\xb6\x41\xf8\xff\x84\x9f\x71\xc2\x82\xe1\xf1" + "\x1f\xf7\x3b\xf6\x7e\x33\x82\xfc\x97\xe6\x04\x1b\x09\xb7\x73\x58" + "\xe3\xc5\x2a\xbf\xfc\xf7\xb9\x9f\x64\x2f\xdb\x4f\x82\x7b\x49\xea" + "\xda\xda\xc8\xd6\x33\x44\x1d\xbe\x82\x61\x42\xd8\x53\x02\x98\x30" + "\x9c\x20\xd3\x9d\xac\x6d\x7d\x7b\x4a\xd0\x87\x3b\x93\x0b\x26\x61" + "\x4f\x89\x34\x1f\xd0\xb7\x9f\xe4\x49\xdc\x4f\xf2\xa7\x1b\x86\x3d" + "\x17\x80\xfb\x49\xd2\x81\xc7\x5d\xc0\xe3\xd3\xc8\xdf\x23\x5e\xfd" + "\xda\x6b\x0e\xc0\xdf\x3e\x92\x40\xe6\x75\xce\xc1\x3e\x12\x61\x0e" + "\x60\x44\xfa\xf4\x9f\x89\x5f\xd9\x0e\x7c\x44\x7e\x9a\x75\x4e\x61" + "\x5e\x57\xea\xe3\xe6\xcc\x7a\xb2\xb5\x87\xa8\xa5\xf9\x7f\x89\xa7" + "\x28\xef\x29\xe0\x80\x7e\x93\xa4\x42\x9e\xbe\xb0\x0a\xe4\xfc\x6a" + "\xb7\x9c\xe7\x47\x3f\xa3\x28\xdf\x00\xf2\x7d\x03\x89\x11\x68\x14" + "\xde\x94\xcc\xe6\x03\xac\x6a\xec\xef\xd8\x9f\xa9\xea\x58\x69\xaf" + "\xd8\xdf\x19\xbf\x6b\x09\xf2\x99\xc5\xfa\xfc\xcb\xd5\xd8\xf7\x90" + "\xe7\xe1\x22\xcf\x2b\xfc\xf0\x5c\xe0\xb7\x4c\x8d\x7e\x43\xf0\x9c" + "\x59\x1f\xcf\x9d\x9b\x3d\xe6\x7f\x3c\x79\x2e\xce\xfb\xf0\xd0\x97" + "\x03\xda\x3f\x14\x20\xdf\x47\x6c\x7e\x1f\xf8\x5e\x21\xf2\xbd\x6f" + "\x7e\x7f\x58\x7c\xff\x8b\xff\xf3\x2f\xde\x7c\xb7\x8e\x00\xdf\x93" + "\x07\xf2\x1d\xc7\xff\xc8\x77\x8b\x1c\xc7\xf9\x54\x65\xd1\xf4\x8a" + "\xfb\x46\x06\xf2\xfd\xad\x49\xe7\x9e\xef\xa3\x3a\x7e\x18\x7c\x7f" + "\xcb\xaf\xff\x33\x6f\xbe\x5b\x46\xa2\xbf\x1f\xf2\xc1\x77\xb1\xbf" + "\x5b\x0a\x70\x5c\x0f\x7c\x17\xfb\xfb\x49\x1f\x7c\xff\xeb\xf8\x73" + "\xcf\xf7\x71\x2d\x3f\x0c\xbe\xff\xd5\xef\xfe\x8f\x7e\x7c\x1f\x81" + "\xfe\xfe\xac\x7a\x20\xdf\x1b\xc5\xfe\xde\x28\xc7\x71\x3c\x55\x35" + "\x8a\xfd\xbd\xd1\x07\xdf\xdf\xb9\xe4\xdc\xf3\x7d\xfc\x67\x3f\x0c" + "\xbe\xbf\x63\x0d\x8c\xef\x8d\x23\xd0\xdf\x9f\xd5\xfb\xe0\xbb\xd8" + "\xdf\x1b\x0b\x70\xdc\x0e\x7c\x17\xfb\xfb\x7b\x3e\xf8\xfe\x5f\xb2" + "\x73\xcf\xf7\xdb\x8a\x7e\x18\x7c\xff\x2f\xbf\xfb\xff\xfa\xf1\x7d" + "\x24\xfa\xbb\x69\x20\xdf\x9b\xc4\xfe\xde\x24\xc7\x71\x3a\x55\x35" + "\x89\xfd\x7d\x93\x0f\xbe\xbf\x7b\xf6\xdc\xf3\xfd\xf1\x7b\x7e\x18" + "\x7c\x7f\xaf\x7e\xa8\xf5\x7a\x89\xf7\xd2\x9c\x8d\xb0\x3e\x0b\xf6" + "\xbd\xc4\x6f\xc4\x01\xf2\x1c\xb1\xe0\xc9\x73\x61\x0f\xcf\x6a\xb6" + "\x87\x07\xed\x76\x0a\x63\x71\x3a\x5a\xd8\xbf\x51\x2a\x8c\xdb\x45" + "\x3b\x9e\xca\xe4\x1a\xb4\xe5\xfd\xdb\xf1\x7f\xfb\x5a\xe2\x77\xa8" + "\x63\xb7\xa1\xf8\xdd\x7f\x4c\x7e\xa1\xf0\xdb\x73\xfc\x36\x32\xfc" + "\x7e\xdf\x14\x1a\xbf\x2d\xd6\xe0\xf8\xdd\x48\x18\xbf\x85\x7d\x1a" + "\x1a\x37\xbf\x1b\xe5\x8c\xdf\x8d\x0a\xff\xfa\xdc\xf4\xc5\xb9\xe7" + "\xb7\xf7\x9c\xfc\xbf\x2f\xbf\x3f\xa8\x1a\x6c\x0e\x06\x79\x8d\x7c" + "\xdf\xf6\x0c\x99\xfa\xc2\x33\x6c\x6e\xc5\xf9\x8d\x06\x65\xbe\x1c" + "\xf9\x8f\x67\x7c\xc2\x01\x03\x9f\x24\xd9\x49\x4f\x77\x12\xc1\xb3" + "\x3c\xb8\xef\xa2\x4e\x6f\x25\xe6\xcc\x8f\xc9\xd6\x34\xa2\xae\x49" + "\xee\x20\x73\x81\x1b\x66\x8b\x09\xcf\x78\xcb\x4d\x1b\x3e\x26\x74" + "\xb5\x6e\xec\x93\x5d\x84\x3b\xc5\xfd\xb7\x1e\xf7\x6d\xdc\xd8\x05" + "\x34\xc1\xf3\x3e\xc0\xf3\xad\xa7\x08\x39\x92\x4e\x88\x76\x19\xf2" + "\xfa\xbf\x8f\x8c\x7a\xce\xc7\x39\x9f\x60\xe6\x65\x3c\xe7\x5e\x7d" + "\xf0\xfa\x65\x6e\x64\xf6\x66\x48\xfb\x32\xbc\xe6\x65\x86\x7b\xfe" + "\x72\xc4\xf6\x66\xfc\xbd\x74\xb0\xfd\x36\xc8\x4f\xec\xd3\xce\x62" + "\x36\x2f\x63\xce\xac\x26\xb8\xaf\x06\xfb\xb0\xab\x53\xa3\xd8\x98" + "\x0e\x7d\xbd\x81\xf5\xf5\x17\x3a\x20\x6f\xf2\x97\x04\xf1\xc1\x78" + "\xdb\xcb\x78\xdb\x81\xbc\xfd\x92\xd0\xb5\xba\xb1\xa7\xb8\xc3\x71" + "\xc8\x5f\xe4\x6b\xce\x17\x44\xbd\x08\xfd\xa2\xa0\x8c\x07\xf9\x0e" + "\x7c\x8e\xdd\xf5\x0c\x89\xc1\xfe\xef\x32\x1e\x2b\x70\x1a\xd9\x1e" + "\x0d\x94\xfb\xbd\x4a\xdb\x96\xa2\x34\x91\xff\x0b\x90\xff\x87\x7d" + "\xf2\xff\xe5\x50\xe7\xde\x45\xfe\x87\x7c\xae\xe7\xbb\xea\xef\xab" + "\x47\xaa\xbf\x1f\xd9\x1d\x20\x0e\xac\xc1\xe3\xa0\xdb\x07\x0e\xfe" + "\x11\x3f\x10\x07\x16\x02\x38\x48\xf6\xc6\x81\x45\xce\x70\x60\x01" + "\xfd\x6f\xd1\x0c\xc4\xc1\x3f\x6a\xcf\x0f\x0e\x02\x3c\xcf\xf3\xbd" + "\xc7\xc1\x87\x7b\x03\xc3\x81\x25\x04\x79\xf0\x8d\x0f\x1c\x54\x27" + "\xfa\xc0\x01\xca\x83\x43\xfd\x70\x20\xca\x03\x0b\xc8\x03\x8b\x0f" + "\x79\x50\xfd\xf9\xf9\xc1\x41\x80\xe7\x78\xbe\xf7\x38\xf8\xc8\xaf" + "\xfe\xef\x87\x83\x10\xe4\x41\xb3\x0f\x1c\x7c\x9c\x34\x10\x07\x60" + "\x0b\x82\x1d\xe8\x8d\x83\x46\x51\x1e\x34\x2a\xd0\x3e\x1c\x88\x83" + "\x8f\x1b\xcf\x0f\x0e\x02\x3c\xbf\xf3\xbd\xc7\xc1\x27\x7e\xcf\xff" + "\x7a\xe3\xa0\x31\x04\x79\xf0\xbe\x0f\x1c\xd4\x24\xfb\xc0\x01\xc8" + "\x83\x67\xf5\xfd\x70\x20\xca\x83\x46\x90\x07\x8d\x3e\xe4\x41\x4d" + "\xeb\xf9\xc1\x41\x80\xe7\x76\xbe\xf7\x38\xa8\xf5\x3b\xfe\xeb\x87" + "\x83\x10\xe4\x41\x8e\x0f\x1c\xd4\xe9\x07\xe2\xa0\x09\xe5\x81\xc9" + "\x1b\x07\x4d\xa2\x3c\x68\x02\x79\xd0\xe4\x43\x1e\xd4\x9d\x3c\x3f" + "\x38\x08\xf0\xbc\xce\xf7\x1e\x07\x66\xbf\xe7\xbf\x3d\x71\xd0\xdb" + "\x37\x5e\x38\x24\xe0\xa0\x68\x03\xc3\xc1\x26\xc4\x41\x1b\xdb\xbf" + "\x63\x10\x71\xd0\x37\x56\xb0\xf5\xc7\x40\xfd\x8a\x3e\x0c\x7c\xed" + "\x1e\x2b\xf4\x02\xbf\x85\xf9\x20\x71\x9c\x20\xcd\x03\x09\xe3\x04" + "\x18\x27\x16\x75\x88\xfc\x17\xe6\x04\xea\x7d\xf3\x3f\x88\x71\xa2" + "\xd7\x1e\x8d\xfe\xfc\xbf\xc0\xcf\xe9\x0c\x98\x17\xf8\x62\xb8\x7b" + "\x33\x3e\x0d\x90\xff\x92\x5d\x10\x28\xff\x9b\x7d\xf0\xff\x33\x1f" + "\xfc\x6f\x24\x8c\xff\xcf\xaa\x25\x7b\x40\x9a\x17\x12\xec\x81\x01" + "\xfc\xff\xec\x3c\xf1\xff\xc2\x3c\x9f\x33\xf2\xfc\xff\x1f\xbf\xfc" + "\x2f\xe1\xf8\x2a\xb8\x0e\xc1\x65\x82\xab\xda\xc5\x91\xd9\xe5\x1c" + "\x2f\xcc\x13\xa3\x0f\xf1\xf2\xfc\x01\xef\x47\xd3\xd1\xf7\xbf\x82" + "\x79\x80\x87\xc2\x5e\x60\xa9\x0c\x5a\x44\x90\x8e\x26\x95\x2c\x19" + "\xfd\x5f\x61\xde\x31\x52\x59\xaa\x3c\x12\x27\x95\x05\xed\xcb\x05" + "\xba\x9b\x22\xf2\xe2\x46\x43\xfe\x6a\x5a\x64\x8c\x85\xbc\x0a\xa1" + "\xcc\x3c\xb9\xb0\xaf\x54\xca\xeb\xca\x97\xa1\xcf\x26\x53\x84\x0c" + "\xf2\xb2\x32\x2f\x11\xf3\x69\xf9\x7c\x22\x9c\x3f\x73\x71\x1c\x7e" + "\xaf\x7f\x3d\xc7\x8a\xf9\xa6\x7a\xd6\x51\x95\x17\x27\x94\x27\xe6" + "\x19\x47\x47\x5f\xa3\x11\xdb\xa2\xf3\xcc\xe7\xba\x87\x60\x99\x52" + "\x3e\xa5\x58\xd6\x34\xaf\x3c\x7f\x20\x24\x42\xa6\x65\xf5\xcb\xe4" + "\x88\x58\x3f\x15\xe6\x75\x8d\x35\x28\x5d\x32\x79\x34\xcf\x91\x68" + "\xaf\xdf\x14\x12\x21\xbf\x98\x37\x5c\xc8\x3b\x7a\x35\xe6\x8d\x11" + "\x69\x2e\xf7\xa4\xb9\x98\x2f\x42\xa2\xa3\xe7\x3b\x57\x3e\x87\x65" + "\xe1\x7b\xe8\x5b\xab\xd4\xd0\x86\xe9\x52\x3e\xe9\x7b\x66\x3d\x21" + "\x42\x5e\x8e\xdc\x2c\xf2\x64\x3c\xb4\x23\x4e\xca\x87\x7e\xd4\xa4" + "\xbc\x80\xeb\x49\xbb\xdc\xb4\x99\xe0\x2a\x32\xd6\xb8\xf2\xe4\xb3" + "\xfa\x97\x19\x91\x27\xb3\x62\xbe\xda\x36\xa1\x6c\xe4\x5f\x2e\xe4" + "\x9f\x28\xd2\x28\x9e\xf1\x44\xdd\xc7\x13\x17\xe7\xc4\x77\xa6\x0a" + "\x56\xd7\x48\x31\xdf\x9c\x81\xf9\xe4\x9e\xf9\x2e\x65\x74\x2c\x4b" + "\x06\xda\x24\x0e\xcc\xab\xf0\xcc\x7b\x19\xcb\x5b\x42\x20\xef\xbc" + "\x81\x79\xd5\x9e\x79\x2f\x67\x79\x5f\x52\x43\xde\x24\x1f\x75\x9d" + "\xe0\x91\x57\xc3\xf2\x6e\xd7\x42\xde\x85\x03\xf3\x6a\x3d\xf3\x4e" + "\x62\x79\x2b\xf4\x90\x37\x79\x60\xde\x38\xcf\xbc\x57\xb0\xbc\xbf" + "\x8b\x86\xbc\x29\x03\xf3\xe6\x7a\xe6\xbd\x92\xe5\x2d\x8d\x83\xbc" + "\xfa\xfe\x79\x77\x31\xde\x5e\x23\xf2\x36\x8a\xe5\xdd\x99\x08\x79" + "\x57\xf8\x68\x5b\x98\x50\x2e\xcb\x3b\x99\xe5\x2d\x9e\x0a\x79\x53" + "\x7d\xf0\xc2\x33\xef\x14\x96\xf7\xf5\x74\xc8\x9b\xee\x83\x17\x9e" + "\x79\xaf\x62\x79\xff\x30\x0b\xf2\x66\xfa\xe0\x85\x3b\xef\xd8\x57" + "\xe6\x40\x9e\x2c\x68\x67\xbd\x0f\xda\x7a\x96\x79\x35\x2b\xb3\x72" + "\x1e\xe4\xcf\xfd\xff\xed\x3d\x0d\x58\x54\xd7\x95\xf7\x3d\xc6\x14" + "\x09\x04\x54\x82\x68\x30\x8e\x8a\x09\xa6\xfc\x0c\x88\x09\xb1\x26" + "\x21\x89\x49\xec\xd6\x24\x74\x97\x6c\xe9\x86\x6e\xa1\xa2\x81\x44" + "\x91\xe0\x0f\xa8\x28\x88\xda\xb5\xb3\x28\xd3\xc8\x12\xbb\x21\x0c" + "\x69\x88\x25\xd1\x36\x6e\x4b\xb2\xb4\x6b\xb3\x63\x99\x6e\x31\x21" + "\x42\xba\xa6\x4b\x76\x55\x06\x45\x1c\x7e\xc4\x91\x19\x99\x51\x61" + "\xee\x9e\x73\xef\x7d\xcc\x9b\x61\xb4\xe6\xb7\xdf\xb7\xcb\x4d\x1e" + "\xef\xdd\x73\xcf\x3d\x7f\xf7\xdc\x73\xcf\xbb\xe0\xbb\x7e\x6c\xab" + "\xc6\x9d\xcb\x71\x1b\x32\x01\x77\xa7\x1f\xdb\xaa\x71\xe7\x71\xdc" + "\xb7\x72\x00\x77\xf7\x78\x5c\x98\x6f\xdc\xbe\x49\xc2\xbe\xd1\x1c" + "\xff\xd0\x6a\xc0\xaf\xf0\x63\x5f\xa4\xa7\xcc\xd9\xf9\x1c\xb7\xae" + "\x00\x70\x0d\x7e\xec\xab\xc6\xbd\x8b\xe3\xbe\x17\x09\xb8\x55\x7e" + "\xec\xab\xc6\xbd\x9b\xe3\xfe\x72\x19\xe0\xee\xf7\x63\x5f\x35\x6e" + "\x0c\xc7\x6d\x44\xdf\xa9\xf1\x23\xef\x5c\x15\xee\x02\x8e\xfb\x6e" + "\x0a\xe0\xd6\xf9\x19\x0f\x35\xee\x3d\x1c\xd7\x14\x08\xb8\xf5\x7e" + "\xc6\x43\x8d\xfb\x75\x8e\xdb\x84\xbe\xde\xe0\x67\x3c\xc6\x70\x61" + "\x5d\x88\x1d\x0d\xfa\x4d\x8c\x11\xf1\x25\x0d\xfb\x9e\x2f\x95\xd9" + "\xfa\xce\x70\xc1\x4f\x4c\x22\xde\xc5\x71\x9a\x47\x70\x5e\xb2\x3d" + "\x0f\xc4\xf9\xd0\xc5\xe2\x11\xac\x2f\x23\x0b\x8d\x9e\xd8\x1d\xcf" + "\x71\x0f\xa3\xef\x36\xaa\x63\x28\x95\x35\x6a\xbc\x04\x8e\xd7\x8e" + "\x71\xa1\xc9\x1b\x2f\xd0\x83\x17\xd4\x6c\x81\xf6\x23\xb5\x3e\xf1" + "\x18\xe4\x54\xd3\x4a\xe4\xb4\x7e\x6f\x05\x5c\x93\x37\xde\x48\x92" + "\x0a\x2f\x89\xe3\xfd\xc1\x06\x78\x66\x6f\x3c\xad\x1a\x6f\x21\xc7" + "\xfb\x23\xca\xd6\xe2\x8d\x97\xaa\xc6\x4b\x1e\xd5\x1f\x73\x31\xdc" + "\xed\x9a\x56\x5f\xfb\x81\xad\x93\x54\x6b\xda\xa2\x51\x7d\x2b\x11" + "\xb8\xed\x8a\x0d\x99\x9d\xb9\xcf\xcb\xc2\xe7\xef\x1d\xd5\x1f\x0f" + "\x14\x78\x27\xd4\xeb\x80\x6a\xad\xbd\x8f\x06\x1d\x75\x89\x75\x94" + "\xfd\x6d\x01\xc4\xf7\x93\xfe\xf2\x8d\x82\x7b\xc8\xad\x7d\xf2\xc9" + "\x16\xbe\xf6\x28\xe7\x75\x9d\xe6\xe7\x26\xd7\x1c\x48\x7d\xda\x41" + "\x47\xd4\xb0\x4a\x99\xb6\x27\x38\x88\x06\xbf\x99\x4a\x43\xba\x73" + "\x2d\x00\xb7\xcd\x3a\x90\xe5\xd4\x9f\x3c\x61\x91\x72\x6d\xf8\x4d" + "\x3f\x78\xb6\x58\xc8\xcf\x96\xe2\x73\x65\x39\x75\x81\x4d\x24\x3c" + "\xdf\xc5\x08\xcf\x7b\xe1\x62\x67\xaa\x40\x5e\x47\x7f\x48\x52\x4d" + "\x1b\x47\x48\x4f\x31\x91\xdd\x7b\x0f\x12\x6d\x21\x7e\x57\xf0\x54" + "\x1c\x2d\xca\x5d\x02\xb2\x68\x81\x6f\xce\x19\xa8\x33\x59\x40\x7f" + "\x58\x1b\xa3\x4c\x85\xf8\x6d\xd1\x53\xd9\xb6\x90\x73\x5a\xba\xe3" + "\xd9\xde\x82\x6d\x64\x76\x9f\x7c\x2a\xcb\x0e\xb1\xc1\x5e\x94\xfb" + "\x20\xd2\x70\x87\x1c\x8c\x02\x79\xa3\xf0\x9b\x84\x74\x7f\x8f\x38" + "\x57\xe6\x14\xfb\x9e\x3b\xc8\xd3\x4e\xa3\x0e\xe8\xdc\x57\x77\x96" + "\xe1\xd9\x70\xa6\x6d\x7d\xe4\x8c\xaa\xcd\x36\xa3\x87\x7d\xcb\x10" + "\xf4\xd3\x8d\x56\x04\xa7\xb9\x83\x83\x97\xd3\x8a\xe9\xb9\x6d\xab" + "\x2d\x84\x9f\x05\x73\x3a\x91\xde\xf6\xdd\x36\x77\x45\x70\x32\xc0" + "\x33\xda\x1c\x57\x19\x1c\x68\x58\x31\xef\xb4\x07\x4f\x2b\xa1\x15" + "\xd3\xca\x4c\x33\xaf\x92\x6e\xf9\x94\x03\xe9\x22\x9c\xee\x99\xce" + "\x6c\xe5\xde\x33\x3d\x23\x20\x92\x68\xec\x21\xd3\x4a\x9c\xfa\xd3" + "\x81\xca\x99\x24\x0a\x2f\xa4\x6b\x11\xb4\xa0\x3d\xc6\x22\x7d\x33" + "\x92\x7f\x27\xf1\x54\xd6\x0d\xfe\x46\x24\x94\xee\x39\x98\x02\xf8" + "\x19\x16\xf9\x44\x20\x1f\x83\xd3\x39\x16\xe9\xa1\x6e\xf1\x5c\x60" + "\x91\x1e\x5d\x2e\x9e\x4b\x2c\xd2\xf7\xd3\xc4\xf3\xd8\xf7\x1f\xfd" + "\x7f\x8f\xf2\x60\x30\xd8\x3c\xda\xfd\x4a\x46\x20\xe6\xc5\x98\xeb" + "\xd3\x90\x83\xc1\xda\x3b\xf1\x1c\xc2\x4e\x2d\xf0\x8c\xe6\x67\x01" + "\x9c\x3e\x07\xf7\x50\x71\xb7\x89\x3b\x45\x1c\xe6\x57\x51\x07\x0e" + "\xd3\x8a\xd3\x2e\xb4\xf7\xb6\x51\xea\x06\xba\xcb\xc0\x76\x59\x6d" + "\xc5\x56\x61\xd3\x4e\x76\x06\x32\x1b\x53\x18\x77\x1a\x32\x3d\x8b" + "\xf1\xda\x73\x4e\xab\x96\x0b\xff\xf8\x59\x97\x98\xb4\x30\x79\xd1" + "\xbd\xf7\xa5\xdc\x9f\xfd\x83\x15\x39\x2b\x57\x3d\x97\x9b\xf7\xfc" + "\x0b\xab\xd7\xe4\xaf\x2d\x78\xb1\x70\xdd\xfa\x0d\x1b\x8b\x8a\x37" + "\x6d\x46\xbc\x31\x1d\x5e\x59\x2a\x39\x64\x02\x7c\x1e\x41\x3e\xbb" + "\x98\x3c\x00\xe3\x3e\xd1\xb9\x5e\xa3\xf5\x6f\xd3\xb6\x48\x78\xf7" + "\x99\x8b\x67\x80\x75\x7e\x84\x67\xdf\x80\xff\x49\x6d\x35\x4f\x98" + "\xf0\xec\xb4\x6e\xb9\xd3\x7c\xdc\xf6\x84\x09\xcf\xee\x6b\x8e\xb4" + "\x92\xe8\xb9\x78\xbe\x5a\xe7\x61\x6c\x37\xde\x45\x88\x19\xfa\xfa" + "\xa3\x39\x37\x8c\x44\xee\x8b\xa0\xb6\xaa\x08\x3a\x80\xf4\xab\xaa" + "\xa9\xd5\xb6\x25\x97\xec\x85\x3a\xf8\x6d\x58\x8f\x6c\xd9\xd5\x0c" + "\xd9\x36\xe4\xd1\x51\xb5\xd5\xb4\x7b\x67\x04\xed\xde\x51\x4d\x07" + "\x8c\x11\xd4\x12\x5d\x45\x82\x9d\x7a\x4b\x8a\x45\xee\x34\xb0\x79" + "\x05\xed\xee\xa0\x4e\x5d\x25\xb4\x25\x8c\x90\x00\x23\xd4\x01\xe6" + "\x68\xd6\x72\xb9\xdf\x1e\x72\x4d\x02\x7a\x51\xf4\xda\x6a\x69\x2f" + "\xf0\xe1\xe3\x64\x79\xd3\x0c\x19\x00\xf0\xb3\xb5\xb9\xce\x10\x8b" + "\x6c\x69\xc0\x33\xa5\x80\x5f\x68\xdb\xfe\x01\x82\xf4\x7e\x51\xe8" + "\x9a\xb4\x6e\x26\x1d\x01\xdc\xdd\xee\x2d\xab\x25\xc0\xc9\x01\xda" + "\x0e\xb5\x3e\x31\xab\xd6\xac\xd7\xe6\x6f\x58\xbd\x7a\x41\x10\x89" + "\x61\x77\xaf\x73\xff\xd6\xe3\xf7\x68\xf7\x55\x53\x33\xe8\x69\x02" + "\x7d\x5b\x3e\x84\x8c\x1f\x7c\x86\x80\x4e\x06\xa0\x3b\x0a\xf0\x23" + "\xf0\x7c\x04\x64\x6f\xe1\x67\xc5\x0d\x2d\xa0\x7a\x4b\x23\xc8\x89" + "\x6b\x0e\xbe\xff\x12\x7b\x51\xba\x04\x7a\x57\x01\x5e\x8b\x76\x26" + "\x99\xdf\x23\x77\xed\x02\x39\xea\xe1\x19\xf1\x13\x71\x1c\x01\xdf" + "\xcc\xf5\x1a\x9a\x81\x75\xb0\x95\xe9\xd5\x08\x5a\xe1\xd4\x77\x65" + "\xe1\x77\xb9\xd9\xf9\x45\x50\x07\xbb\xb4\x00\xae\xc1\x5e\x9a\x2e" + "\xc1\x7b\xa3\x64\xf4\xd0\xd4\xa1\x4c\x28\x07\xbe\x8b\x7e\x00\x99" + "\x9f\xfb\x5a\x06\x89\x73\x11\xe9\x83\x6e\x42\x6a\xaa\x69\x1d\x5c" + "\x35\x70\xed\x7f\x1f\xda\x8e\xc1\xd5\x02\xf0\x56\xb8\xbf\x0f\xf7" + "\x63\x70\xc1\xbb\x6c\x24\xca\xbd\xae\x84\x5a\x13\xf6\x93\x79\x48" + "\x1f\x7c\xeb\x3b\x67\xe4\x4b\x65\x28\x3b\x7e\xf7\x9e\x06\x75\x39" + "\xbc\xbf\x15\x7e\x36\x97\x40\x3b\xdc\x4b\xf8\x5d\x7d\x9d\x35\xc3" + "\xd5\xcd\x9f\xbb\x63\xe1\x39\x5d\x3c\xa7\xc2\xb5\xfc\xcf\x5f\xbe" + "\xf4\xae\x77\x75\x37\xdd\x3c\xee\x4d\x5d\x8e\x9b\xc3\xc3\xc8\x6f" + "\x6d\x21\x72\x2f\xf1\x86\x5b\x3b\x38\xec\x42\x3d\xaf\x5f\x38\x2c" + "\xee\x27\x89\x3c\x08\x76\x1a\x04\xfa\x17\x23\x39\xec\x62\x34\xdc" + "\x57\xc3\x55\xec\xcd\x7f\x08\xfa\x0f\x05\xe3\x78\x5e\x2b\x87\x35" + "\x03\xc6\xd2\x22\x77\x99\x71\x8c\x2a\xb9\x6f\x49\x6e\xca\x60\x26" + "\xf0\xad\x1a\x8f\xff\x9c\x7d\xc7\xdb\x7f\xce\xd6\xf9\xf8\x8f\x01" + "\xe3\x11\xf4\x0b\x36\x72\x7f\x39\x62\xdf\x92\x03\xf5\xb3\xf5\x40" + "\xe7\x08\xee\x91\xf4\xc8\xdd\xec\x1b\x3c\x95\x7d\x84\x84\xe4\x12" + "\x0d\xc6\x97\x01\xf9\xec\x65\xf4\x59\xe4\x2d\xf8\x72\x59\x40\x3e" + "\x80\xd5\xa1\x7c\x6b\x81\x2e\xd4\xeb\x01\xaf\xae\x8d\x0c\x29\xb2" + "\xb1\x3e\xfa\xe7\xc1\x1f\x85\xbc\x48\x13\xfb\x51\x8f\x5e\x26\xec" + "\x23\x78\xbf\x09\x70\x7c\xb7\xc5\x7f\xff\x14\xd0\x36\x62\x21\xe8" + "\x93\x78\x6f\x1b\xd1\xc1\x5c\x5a\x46\xdc\xce\x0c\x92\x10\x49\x74" + "\x30\xdf\x26\x9f\x91\xbb\x2b\xe2\x4b\x08\xc6\x8e\x16\x8c\xeb\x16" + "\xb9\x3b\xcd\x88\x73\x91\xd3\x12\xe7\x9f\x76\x99\xde\x2f\x20\x8c" + "\x4f\x2d\xca\x03\xed\x2a\xbe\x55\xf8\x1e\x5b\xb9\x99\xeb\x0a\xbc" + "\xd0\x0e\x87\x51\x77\xb4\x27\xb4\x37\x01\x1d\x2b\xb6\xb1\xb3\x83" + "\xb8\x3e\xf5\x78\xbe\x04\xda\x03\xf1\xf1\x2c\x4a\xfe\x9d\xf0\xae" + "\x10\x66\x37\xe8\x8f\xe3\x41\x81\x07\xd2\x28\x1d\xa1\x23\x14\xe2" + "\xd1\xeb\x9b\x5d\x90\x7b\xf4\x64\x7b\x8f\xcf\xb9\x54\xf5\xf8\x40" + "\xbf\xc3\xd0\xdf\x4c\x41\x47\x8c\x27\xc0\x33\x14\xf3\x0d\x80\x19" + "\xdc\x7a\xa0\xb1\xd1\xc5\xf6\x75\x80\xce\xb7\x41\x16\x03\xd2\x01" + "\x79\xcc\x82\x56\xc5\xd1\x12\xef\xb1\x16\xf4\xea\x71\xcc\xd9\x7c" + "\xde\xcc\x74\x82\xd8\xd5\x33\xa7\x96\xb7\x35\x01\x4e\x13\xbd\xb6" + "\x8c\xe0\x79\x0d\x7c\x2d\x61\x6d\x8d\xa5\x57\xd8\xf8\x9a\x79\x5c" + "\xeb\x79\x78\xdd\x56\x6a\x55\xc9\xed\x52\xce\xbc\x10\x72\x37\x22" + "\x3f\x5a\x94\xc9\xd6\x56\xe4\x81\xfd\x39\xbd\x73\x27\x90\x9e\x62" + "\xab\x78\x90\x83\xdb\xeb\x5c\x20\xc0\xeb\xd1\x17\x99\xdd\x20\x8e" + "\xda\x4b\xd1\x17\xcf\x8d\x40\xff\x23\x7b\xb1\x5e\xc4\xea\x06\x16" + "\x63\x3d\xed\x4b\xb1\xbd\xcd\x0a\xe3\xf6\x02\xf8\x92\x9b\x90\x79" + "\xe1\x44\xe7\x28\x67\xba\x1d\x72\x6c\x59\x2a\x35\x8f\x10\x82\x72" + "\x82\x8d\x9a\x9c\xfa\x1e\xe0\xd1\xc9\xf2\x07\x88\xd7\x8d\xf4\xf5" + "\x0c\x82\x32\x43\x3c\x13\xf2\x9d\xbf\x5d\x8c\x7d\x23\xea\x88\xf6" + "\x8c\xe7\xb1\x0f\xda\xac\xbf\x46\xd9\x3d\x7a\xf7\xd8\xd4\x36\x66" + "\x7a\xc3\x38\xe0\x78\xe1\xb8\x78\x68\xf6\xa0\xef\x1b\x80\xd6\x21" + "\x5e\xe7\xbe\x81\xb6\x36\x44\xd0\x56\xc4\xf7\xe0\x5a\x17\x60\xdb" + "\x36\xe0\x9d\x50\x00\x6b\x3a\xcc\x0b\x3c\xb7\x04\xe8\x1e\xc2\x73" + "\x46\x81\x46\x13\xda\x14\xf0\xb6\xa2\x3f\x42\xbd\x55\xc8\x5d\x02" + "\xeb\x79\x2c\x5c\x4b\x3c\xf3\xdf\xba\xc6\xdb\xbf\xce\xfb\xce\x7f" + "\x1c\x6f\x83\xbb\x74\x19\x61\xfe\x50\x48\xb4\x83\xb2\x75\xb2\x58" + "\x3b\xc4\x58\x5b\xbf\xd7\x0c\xf3\x45\x45\xa3\xdb\x67\xac\x9b\x98" + "\x3f\x16\x2d\x97\x50\x67\xe8\xdb\xc4\xe9\x9c\x67\x3a\x33\x7f\x2a" + "\x67\x3e\xd0\x4a\x8b\x40\xcf\x31\x3f\x38\x9f\x2a\xc6\xb9\xd5\xc7" + "\x26\x4a\xec\xaa\xc0\xf3\xe5\x30\x26\x39\xcb\xc9\x83\xce\x6b\x9e" + "\xb8\x84\x63\xef\x66\x63\x7f\xde\x6a\xe4\xeb\xad\x88\x5b\xe7\x79" + "\x7b\x84\x97\x0f\xa3\x4e\xb3\x98\xff\xa2\x2c\xa5\x99\x28\x4b\x13" + "\x93\xa3\x54\x4b\xa0\x8d\x7d\xf7\xdb\x22\x5b\xb5\x62\xbe\x0a\x5a" + "\x3d\x0e\xa4\xb5\x03\x62\x15\xca\x04\xbc\xcb\x58\xfc\x7b\x9c\xd9" + "\xe4\xb2\x90\xbd\xc5\x55\x8e\x7d\xcf\x5a\xaf\xc8\xac\x6f\x0b\x3c" + "\x67\xba\xf8\x19\x34\x41\xd0\xbf\x01\xbf\xfb\xdf\x23\x5f\x48\xc7" + "\x18\x8d\xbf\x73\x82\xe7\x07\xf0\xdf\x87\x42\x4c\xd1\x00\xbd\x40" + "\xf4\x51\xc5\x2f\x06\xe4\x0b\x71\xf8\x7d\x7c\xb0\xf5\x21\xc8\x91" + "\x1a\xd0\xde\xe8\xcb\x90\x23\x25\x3b\xf5\xbd\x99\x8a\xdf\x02\x9f" + "\x1a\xb4\x3d\x1f\x9f\xde\xd7\xc0\x8f\x9b\x3c\xbe\xd5\xfb\x9a\xb0" + "\x63\x03\xd8\x31\x10\xf8\xcd\x11\x7a\x35\x00\x3e\xe4\x62\x17\xa6" + "\x08\xd9\xc5\x19\xa6\xbd\xbf\x55\xc6\x41\xcc\xd5\xd6\xbd\x18\x7f" + "\xd9\x18\xf4\xa5\x8b\xbe\xf5\x9c\x57\xdf\x33\x0a\x2e\xe6\x88\xfc" + "\x6c\xa9\xbe\x67\x30\x0e\x26\xc0\xd8\xb3\xd8\xc7\xce\xe0\xe5\x30" + "\x9c\x3b\x9c\xc7\xc0\x28\xf3\x43\xc8\x7b\x3c\x7e\xd4\x17\xeb\x13" + "\x9f\x30\x16\x1b\x8e\x03\x0d\x8c\xa7\xe8\x4b\x18\x53\xf1\x3d\x06" + "\xe8\x69\xc4\xfc\x11\x32\xf7\xfd\xc4\xdb\x57\x06\x7a\xc1\x57\xe2" + "\x54\xb4\x77\xfb\x5b\xe7\x8c\x3c\x06\xd6\x08\xdd\x3e\x11\xba\x1d" + "\x12\xba\x7d\x22\x74\x6b\x00\x1e\x60\xb7\x81\x57\x55\x76\x04\xbb" + "\x0d\x4c\x16\xf8\x4d\x18\xcb\x3d\xf3\xb5\xff\x31\x65\x2e\x8f\x8f" + "\x17\xfd\x57\x70\x3e\x78\xe4\xea\xd7\xfa\xc4\x8b\x26\xff\xf1\xa2" + "\xcf\x26\xf4\xad\xf3\x99\x1b\xf5\x5c\x76\xb1\xb6\xc0\x38\x1c\x87" + "\xf7\x34\x7e\x8e\x52\x57\x08\xc6\x4f\xe4\xad\x5e\x83\x6a\xb9\x5d" + "\xc5\x5c\xee\x3f\x37\x7e\x1c\xfa\x1b\xd5\xf3\x19\xc7\x1a\x63\x02" + "\xd2\xc0\x31\x65\x79\x25\xc0\xf8\xb8\xf6\x57\x60\x6c\x50\xc7\x68" + "\xc0\xad\x72\x53\x9c\x2f\xfd\x4d\xde\x73\xb1\x3f\x5a\xcc\x45\xc1" + "\x7b\xe0\x47\x30\x46\x3a\x0f\xdf\x81\x58\x1f\xbe\x38\x36\x66\xb4" + "\x83\x18\xd3\x0d\xca\x9a\x86\xf8\xd0\xb7\x18\xfa\x64\xf9\xac\x8f" + "\x06\x94\xcf\x22\xf7\x75\xb0\x98\x55\xcd\x62\x45\xb1\x93\xc9\x33" + "\x90\x63\x14\xeb\x04\xc0\x74\x02\xa6\x13\x6b\x89\xe2\x37\x1f\xfb" + "\xc8\x64\xf2\x9f\x1f\xf5\x75\x28\xf9\x11\xa3\xc5\x62\xd1\x80\x59" + "\xe8\x87\xb0\x38\x0e\xeb\xc3\x35\x86\xad\x55\x00\xaf\xa2\x6c\xbd" + "\xea\xd3\x89\xf5\x0a\xe7\x97\x6c\x91\x7b\xeb\x70\x8e\x61\xdd\x22" + "\x5f\x88\x44\xfa\x6d\x65\x57\xf1\x1d\x62\x3f\xb4\x2d\xc1\x78\x80" + "\xf1\x02\xff\x8e\x95\xdd\x9f\x62\xf7\x95\x18\x77\x30\x0f\xc1\x76" + "\xc0\x8b\xc5\x58\x04\xf0\x4d\x78\x5e\x2b\xed\x0f\x04\xba\x17\x32" + "\x45\xdf\x3d\x2c\x57\xe8\x5f\x16\xa0\xc0\x94\x7e\x30\xd7\x1f\xc0" + "\x7e\xd8\x5f\x89\x5f\x18\xbb\x46\x30\x36\x71\x7e\x1f\x09\x1f\x67" + "\xef\x0d\x4a\x5e\x74\x4d\x56\xe1\xe2\xf9\x33\x2c\xa6\x0d\x46\xf1" + "\x78\x36\x18\x82\x7d\xd9\xf8\x41\xac\xdc\x76\x85\x76\x19\x0b\x89" + "\xa6\x76\x88\xe5\x58\xc1\x5c\xce\xc1\x5c\xae\xc7\x60\x22\xd3\x83" + "\xc7\x54\x03\x97\xa5\x2b\xb8\xf6\x2a\x6b\x7b\x12\x75\xc1\xb6\x4a" + "\x55\x1b\xbd\x16\x83\x6d\x79\x4c\x2e\x9f\x7e\xee\x6b\xb9\xe3\xf0" + "\xf1\xfc\x61\x88\xa1\x98\x4b\x88\xd8\x3b\x68\x15\x72\xbe\xa1\xc4" + "\x5d\xb0\x4b\x32\xc6\x5e\xd6\xb6\x4a\xe0\x3c\x25\xee\x2c\xbe\x0f" + "\x7e\xcc\xed\x1a\x29\x0b\x7b\x2f\x11\x7a\xf4\xb2\xf7\xec\xfe\x0c" + "\xb0\xed\x60\xab\x62\x5b\xf5\x33\xce\x1f\xe0\x1f\x86\x75\xe6\xf7" + "\x25\xec\x1d\xb6\x06\x71\x50\x26\xbe\x46\x5c\x30\xfb\xe6\xd4\x3d" + "\xf2\xa5\x6c\x5c\x97\x78\xae\x7a\xe9\x61\xb1\x37\x44\x4c\x85\x3f" + "\x85\x75\xe1\x62\x85\x12\x63\xa8\x73\x19\xbc\xf3\x9f\x01\x9c\x8b" + "\xec\x5c\x53\x3c\x53\x44\x8d\x83\xf1\xe9\xed\xab\x16\x41\xf3\x62" + "\xae\x12\x37\x30\x96\x1c\x77\x9c\x11\x39\x9d\x2d\xb2\x56\xc4\x92" + "\x41\xd9\x36\xc3\x3b\x0f\xb3\xcd\xf0\x8e\x19\x97\xe2\x7c\x63\x06" + "\xe4\xcd\x3b\x9d\xfa\x8b\x03\x5e\x79\x00\xc0\x6e\x1c\x3b\x2e\x9a" + "\x70\x8e\xe2\x99\x72\x2c\x3e\xb1\xfd\x2e\xdb\x76\x45\x66\x8c\x9b" + "\xf6\x2d\xca\xfe\xc5\xa5\x59\x98\xab\x79\xf3\xb3\x65\x7a\xc5\x4e" + "\xe4\xa7\xd0\xd3\x10\x3c\x93\x0c\xec\x80\x7b\x2e\xb6\x58\x11\xe7" + "\xeb\xbc\x62\xa5\x58\xc3\x30\x4e\x7a\xaf\x55\x5d\x21\xde\x6b\xd5" + "\xa5\xc9\xe3\x63\xa4\xad\xe3\xe6\xd7\x2a\xdb\x61\x8c\x5b\x4a\x8c" + "\xf4\x8e\x05\xb6\x93\xb5\x5e\xb9\xac\x2d\x47\xc9\x65\x3d\x71\xf4" + "\xa2\x03\x63\x14\xf0\x6f\xe2\xbc\x2f\xa5\xc3\xba\x9f\xa1\xf0\x86" + "\xf6\x8a\xe3\x90\xa9\x50\xbd\xc5\x04\xcf\x29\x22\x07\x64\x73\xf3" + "\x2a\x3b\xbf\x68\xb0\x0c\xfc\x2f\x08\xfd\xcc\x94\x3f\x44\xba\x3d" + "\x6b\x85\xd9\xbe\x76\xcc\xbe\xe7\xd4\x79\xe1\xab\xd5\x74\x37\xf0" + "\x39\xa2\xd6\x71\x0f\xc0\x2a\xc5\x1e\x02\xb3\x2d\xa3\x75\xc9\x60" + "\xac\xf6\xd6\x8d\xeb\x71\xc9\x8c\x7a\xe0\x3b\x11\xf0\xdf\x89\x79" + "\x0f\xe4\x7c\xf0\xdc\x8b\xf9\x4d\x83\x92\x17\x5d\x29\x57\xe7\x57" + "\x5d\x39\x18\x2b\xc5\xbb\x67\x0b\xe4\x3b\x06\xf5\x5e\xcc\x93\x8f" + "\xa6\x69\x0b\x0a\xf3\xf2\xd7\xaf\x4a\xd2\xe6\xe5\xe7\xad\xcf\xcb" + "\x5e\x9d\xb7\x39\x7b\x7d\xde\xda\xfc\xd8\x35\xd9\xcf\xe5\xad\xd0" + "\x16\x65\xaf\xd3\xea\x8a\xe7\x17\x07\x11\x0f\xea\x62\x6d\xf6\xba" + "\x75\x1b\xd6\xac\xcc\xd1\xe6\xe7\xad\x88\x2b\x5c\xb9\x6e\xe5\x7a" + "\x6d\x76\xe1\xda\x0d\xf9\x39\xda\xf9\x39\xf1\xf3\x75\xf7\xe6\x04" + "\xa9\xf7\xd0\xe6\x86\x91\x01\xf7\xb0\xd5\x5a\x39\x4c\x02\x43\xa5" + "\x82\xc2\xd0\xe2\xbc\x7c\xbe\x6f\x67\x8f\x4b\xa8\x22\x05\xd0\x1e" + "\x8c\xe7\x23\x53\xfd\x50\x2a\xdc\x35\x88\x07\x7a\x6a\xe1\x39\x10" + "\x64\x8f\x72\xea\x87\x6c\x16\x79\xb8\x83\x9d\x7d\x0c\x70\xd0\x2d" + "\x8a\x0e\xb7\x58\x21\x67\x2b\xc0\xdf\xaf\x1b\x87\x49\xb8\x61\x23" + "\xd1\xc0\x15\x0c\x57\x98\x1c\x86\x7b\x5d\xf6\x68\x8b\xec\x48\xe5" + "\x7b\x9f\x76\xb3\x2d\x24\xbc\x91\x56\x84\x37\xf2\x71\xb1\x1f\x55" + "\xf6\xa2\x9f\xde\x45\x9e\x46\xff\x3c\x23\xdb\xd9\xbe\xfe\x0e\xf0" + "\x65\xdc\xc7\xb5\xbf\xf7\x48\x2a\xe4\x83\x27\x71\x1f\x16\xda\x8e" + "\x3a\x64\x12\x0c\x72\x69\x9a\x4b\x74\x64\x1f\xf0\x5a\x17\x49\x29" + "\xf0\xd8\xad\xec\xa7\x81\x0e\x61\xa0\x4b\x87\xd0\xe3\x05\xa6\x47" + "\x35\x8d\xae\x9a\x0a\xf2\xbd\xc4\xe4\x69\x54\x74\x00\xb9\x3b\x40" + "\xa6\x48\x90\x33\x0c\xe5\xf2\xb7\xd7\x87\xfb\x5d\x20\xe7\xa8\x7b" + "\x23\xd8\xed\x4e\x7e\x26\x5e\x65\x2d\x9f\x7f\xa0\x57\xb2\x11\x9e" + "\xf7\x0e\x91\xe0\x3d\x78\x76\x79\xf9\x6c\xfa\xa1\x63\x84\xb4\xe5" + "\x76\x90\xd0\x4d\xd4\x46\xdf\xb5\x5a\xb9\x4e\x8e\x18\x8c\x0d\xbf" + "\x7a\xbe\x43\x83\x3a\xc1\x5a\x11\x6c\x1c\xba\xee\xde\xa2\x66\x5f" + "\x04\x75\xd0\x57\xd4\x39\x97\xe3\xc7\x68\x13\xcc\xb7\xec\xe5\x78" + "\x06\xb6\xa3\x18\xe4\x6e\x17\xb9\xb1\x83\x5e\xcb\x54\xe5\x52\x0e" + "\xf4\x33\xc7\x75\x68\x07\x2a\xb4\xf1\x9c\x74\xec\xc3\xc7\xdf\x31" + "\x0a\x7d\x6c\x2a\xfa\x1d\xbe\xf4\x91\x26\x3c\xdb\x14\x3e\xfc\x3d" + "\xdc\x81\x39\x81\x0d\x7c\xd9\x76\x1d\x7e\xd1\x2f\x55\xd3\x13\x6d" + "\x00\xaf\xbc\x42\x30\xa7\x3d\x61\xac\x46\xfa\x97\x53\x2c\xf2\x50" + "\x0d\xd2\xdf\x11\x41\xc8\x4e\xc0\xb1\xeb\xed\xed\x0e\x76\x66\xf9" + "\x65\x98\xff\x96\x16\xdf\xbd\x6c\xe1\xcf\x8b\x7d\xfc\x39\xf5\x25" + "\xcc\x09\xab\x80\x3e\xf8\x50\xe5\x65\x58\x87\xa1\x1e\x5f\x45\x62" + "\x90\x0f\x3c\xb7\xe3\x7e\x08\xd0\x6c\x50\xf8\x51\xf0\xff\xbd\x6e" + "\xbe\x07\x23\x7c\x2b\x16\xf7\xaf\x4b\x8b\x29\x6d\x86\xf8\x8e\x32" + "\xa2\x8f\x41\x9f\x93\x8a\x4f\x81\xaf\x9f\x60\x7e\x15\x4e\x62\xa8" + "\xfe\x72\x96\x71\x2a\xe0\x81\x5f\xd5\x82\x3f\xa1\x5f\x39\xf5\xc3" + "\x81\x8a\x4f\x81\xaf\xb5\x23\x1e\xc8\x10\x74\x78\x73\xaa\x06\x63" + "\x64\xb7\x3c\xbc\x15\x7d\x8c\xbe\xfc\xad\x0e\x3a\xfd\xd9\x0e\x3e" + "\x4e\xc3\x5b\xdb\x5c\x7c\x0c\x3c\x76\x1f\x4e\x53\xd9\xbd\x1d\xfc" + "\x38\x08\xed\xcc\xf7\xaa\x87\xb7\x82\x6c\xed\x2c\x17\xdf\x0a\x63" + "\xc0\xd6\xaa\xe1\x25\xd8\x5f\xd8\xb0\xd5\x63\xc3\xe1\xfd\xfe\x6c" + "\xe8\x63\x3b\x0d\x3f\x17\x7d\xb8\x1e\xe7\x0a\xf4\x69\x55\xce\x3a" + "\xf7\x37\x96\xc0\x43\xa3\xa9\x22\x81\xc8\xc3\x1c\xce\xf0\x47\x14" + "\x1e\x95\x60\x6b\x5b\x69\xee\x0d\xfd\xd9\x5c\x47\x08\xee\x89\x63" + "\xff\xe8\x70\xb4\xaf\x73\x89\xa7\x3f\x75\xf8\xf6\x9f\xbf\xc2\x4b" + "\x56\x76\x51\xbd\x33\x6d\xdf\x54\xf0\x23\x26\xaf\xb3\xe4\x46\xf2" + "\x46\x6b\xf9\x3a\x69\x9a\x8b\xfe\xed\x7c\xa7\x6d\x3f\x21\x08\x13" + "\xf5\x7a\x3b\xac\x3d\xbe\xfb\xfb\xd7\xff\x7d\x83\xf3\xb2\xf7\xef" + "\x1b\x9c\xdd\xd7\xfb\x7d\x83\x37\x5f\x57\x22\xf2\x75\x1b\xd3\x25" + "\x0f\x6f\x57\x94\xdb\x0f\x6f\xa5\x7f\x7c\x9d\xfa\x7d\xc6\xb5\x1d" + "\x65\x38\x0e\xeb\x14\xbd\x23\x5d\xa2\x40\xc7\xcc\xd6\x70\x57\x19" + "\xcf\x5f\x30\x2f\x72\x65\x21\x8e\xaf\x1e\x63\x25\x30\x1c\x63\x2c" + "\xb9\xc2\x2a\x93\x1e\x27\x78\xd2\x30\xb9\x2f\x4b\x69\x96\xbd\x90" + "\x09\xf5\x53\x81\xb5\x2f\x85\xe1\x53\x28\x1c\x24\xea\x36\x56\xd1" + "\x8c\xe1\x8f\xb5\x7f\x8e\x32\x99\xcb\xcb\xe8\xb9\x88\x24\xf8\x95" + "\xa9\x30\x96\xde\xa0\x37\x25\x4a\x17\x7f\xe5\x45\xb8\xca\xd2\x27" + "\x01\xbd\x3a\x86\x4c\xe9\x88\xa0\xaf\xd4\xa9\xba\x8e\x10\xef\x3a" + "\x94\x80\x4c\x15\x83\xd9\x01\x39\xec\x4f\xa5\xbe\x71\x62\x0c\x24" + "\xd7\x85\xa9\x59\x86\x91\xb2\x49\xec\x21\x14\x7f\xb8\x80\x5e\x0c" + "\xb4\xa7\x98\xc6\x10\xa6\x39\xb6\xab\xd0\x3f\xe0\xe2\x2f\xf6\xa2" + "\xf1\x39\xcb\x9d\xaa\xe7\xd9\xfc\x76\x7f\xfb\x17\x48\xff\xc6\x45" + "\xdb\x3e\x59\x79\xf4\xb8\xc7\xe2\x74\x7f\xa8\x1e\xfb\x2f\x6e\x54" + "\x40\x6a\x0f\xf5\xb4\x3f\xa8\xf3\xae\xa7\xfa\xb4\x3f\x92\xf6\x05" + "\x48\x4e\x4c\xf8\xa3\xd4\x32\x85\x90\x87\xa3\xc6\x80\xa1\x3e\x53" + "\x26\xd4\xe0\x33\x85\x3c\x45\x48\x13\x00\xf2\xd4\xab\xc0\x1a\xff" + "\xd8\x5f\x4e\x99\xb9\x5d\x4c\x88\xd9\xb6\xf1\x3e\xf5\x90\x0f\x0c" + "\xeb\xb7\x68\x05\x2c\xf1\xe8\x38\x7c\x06\xd3\xaa\xea\x52\x2a\xfc" + "\xa8\x23\x64\x49\xd6\x17\x20\xea\x44\xf9\xff\x58\x24\x9c\x1f\x13" + "\xe5\x4b\x2a\x94\xaf\xe2\x10\x89\xd8\x0d\xff\xa3\x63\x81\x92\x8a" + "\x06\x2a\x00\x54\x3c\x7c\x21\xeb\xf8\x44\x99\x28\x13\x65\xa2\x4c" + "\x94\x89\x32\x51\xfe\x0f\x14\x49\xfd\x62\x8d\xe7\xd6\x7d\x4d\xdc" + "\xd5\xef\x3f\x92\xb8\xd4\x30\xf9\xf3\xf4\xa3\xa2\x90\xb2\x54\x93" + "\xb6\x2e\xcb\x12\x66\x48\x6b\xd7\x1d\x2e\xb0\x05\xee\x5e\xd6\x12" + "\xd3\x90\x6b\x8d\xdc\x9f\xd1\x91\xd2\x54\xec\xd2\xec\x5c\x6a\x8e" + "\xae\xcf\xe9\x0e\xaf\x4a\x3f\x91\xdc\xb8\xde\x11\x5c\xb1\xbc\x35" + "\xf6\xd0\xea\x81\xa8\x9a\xcc\x93\x4b\x8e\x94\x8c\xc8\xe5\x8f\xfc" + "\x6e\xee\x4f\x7f\x70\x66\xea\x4b\x7f\xfd\xc7\xa4\x5f\x16\x0e\x05" + "\xe9\xff\xea\xfd\x7b\xde\x7a\xbe\x6f\xe6\x3f\xff\xdd\x7f\x2f\xfe" + "\xcd\xe6\xab\xb7\xfc\xf0\xf1\xff\xb8\xeb\xc0\xaa\x9e\x88\xea\xbf" + "\xfd\xd3\xbd\xef\x6e\x1c\xbe\x6d\xef\x53\xc7\xe3\x7f\x91\x3f\x78" + "\x67\xed\xdf\x9f\x7e\xf0\xbd\x6d\x6e\x69\xfb\xc3\x47\xe7\xbc\x96" + "\xdd\x35\xe5\xc7\xdf\xfe\x28\xf1\x5f\x5e\xbc\x34\xf9\x47\xdf\x3c" + "\xb6\xe0\xcd\xbc\xde\x19\x3f\xf9\xee\x27\xf7\xff\x7a\xd3\x95\x49" + "\xbb\x1e\xfb\xfd\xfc\x37\x56\x9e\xbb\xfd\x9f\x9e\xf9\x78\xd1\x3b" + "\x1b\x2e\x87\xec\x79\xf2\xc3\xb8\x9f\xaf\xb9\x30\xeb\xd5\xef\x9d" + "\x7a\xe0\xb7\x5b\x47\x03\x76\x3c\xda\x3c\xef\xf5\x15\x67\xa7\xed" + "\xfb\x9b\xff\x5c\xf8\xab\x75\xf6\x5b\xff\xf1\x5b\x1f\x7c\xfd\xe0" + "\x0b\xfd\x77\xbc\xf2\xec\xff\x7c\xe3\xdf\xb6\x5c\xfb\xda\x3f\x3c" + "\xf1\x87\xbb\x7f\xf6\xdc\xf9\xe9\x2f\x7f\xe7\xbf\xee\xfb\xd7\x22" + "\x67\x68\xe5\xd3\x6d\x09\x6f\xaf\xbd\x38\xdb\xf8\xfd\xce\x87\xfe" + "\xbd\x94\x7e\x1e\xfb\x91\x80\xc8\x47\xbf\xca\x71\xf3\x24\x8f\x08" + "\xae\xed\xf8\xcc\x74\x64\x49\x8c\x3f\x07\x94\x2d\x22\x52\x20\xb9" + "\x45\xf3\x19\xde\x18\x3e\xab\xde\xd7\x29\x5a\x75\xff\x9b\x29\xb8" + "\x5f\x81\x7f\xeb\xba\x10\xae\x3b\x18\xc4\xb3\x0b\x10\x7d\x93\x34" + "\xbe\xba\x22\x81\x0d\x02\x40\xc2\x49\xe4\x16\xb0\x5a\x20\x99\x4c" + "\x82\xc8\xad\x24\x98\x84\x90\xdb\x48\x28\x09\x23\x53\xc8\x54\x32" + "\x8d\x84\x93\xdb\x49\x04\x99\x4e\x22\xc9\x0c\x32\x13\xb4\x8a\x22" + "\xb3\xc8\x9d\x64\x36\x18\x67\x0e\x99\x4b\xe6\xf9\xd7\xab\x8c\xa4" + "\x46\xc2\x0f\xf8\x3f\x8d\xed\xda\x94\x91\xac\x09\xf8\x57\x0a\x37" + "\x09\x78\xbb\x80\x5b\x26\xe0\x5f\x29\x5c\xfb\x17\xbe\xcf\xf9\x8b" + "\xde\x25\x48\x23\x78\x26\xe1\x95\x4f\x8c\x15\x5f\xa8\x24\xca\x58" + "\x9d\xfc\x99\xfe\xe3\xe8\x79\xf7\xf7\x2d\xa9\x70\x25\xf3\xc7\x52" + "\x42\xc4\xef\x1e\xa8\xba\x8c\x0c\x7a\x95\x6a\xe9\x77\x9a\x29\x65" + "\xf8\x5b\x95\x40\x12\xce\x7e\xde\x44\xc1\xdf\x2c\x36\xef\x84\xcb" + "\x00\xd7\x3e\xb8\x8c\x70\xbd\xa9\xb0\x22\xd2\xdc\x48\x22\xcd\x4b" + "\x83\x7b\x23\xdc\x07\x88\x14\x5d\x46\xa4\xbb\x41\xf8\xf9\x26\x22" + "\xc5\xa4\x7a\x94\x49\xb4\x8c\x49\x2d\x25\x08\xb8\x16\x9e\x93\x73" + "\x7d\x18\x7e\xda\xf5\xce\xf4\x58\xfa\x32\x6d\x62\x7c\x72\xfc\xa2" + "\x45\xda\xb8\xb4\x38\x6d\x92\x2e\x31\x29\x41\x97\x9c\x90\x94\xa8" + "\xd5\x25\x2e\x4e\x4e\x59\xbc\x30\x59\xbb\x66\x53\x61\x5e\xa2\xee" + "\xb9\x95\xda\x55\x79\x85\x6b\x8a\xb2\x0b\x57\xde\x8c\xe6\x9f\xba" + "\x80\x3a\x64\xd6\x28\x17\x53\x3d\x6a\x12\x79\x08\xd6\xa4\x76\x12" + "\x10\xde\x44\xc6\x0d\xb3\x64\x10\x2a\xc5\x88\xcb\xa7\xf9\xe7\xc9" + "\x44\x7a\x2b\x8a\x48\x6f\xa4\x13\xc9\x18\x46\xa4\x97\xc1\xd6\xad" + "\x66\x22\x1d\xab\x22\x92\x19\x6c\xfe\x5e\x06\x91\xde\x2d\x1b\x0f" + "\xfb\x53\x34\x87\xd9\xa1\xef\x20\x5c\xe7\xeb\x89\xd4\x69\xe0\x30" + "\xf7\x4e\x22\x5d\x29\xf8\x52\x6c\xf0\xd9\xcb\xa7\x1d\x77\xe9\x7f" + "\x01\xaa\xe7\x10\x61" ; diff --git a/sys/dev/mxge/rss_eth_z8e.h b/sys/dev/mxge/rss_eth_z8e.h index e0dfade3618..acc0fbf44cc 100644 --- a/sys/dev/mxge/rss_eth_z8e.h +++ b/sys/dev/mxge/rss_eth_z8e.h @@ -1,6 +1,6 @@ /******************************************************************************* -Copyright (c) 2006-2011, Myricom Inc. +Copyright (c) 2006-2012, Myricom Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -28,9874 +28,9502 @@ POSSIBILITY OF SUCH DAMAGE. $FreeBSD$ ***************************************************************************/ -static unsigned int rss_eth_z8e_uncompressed_length = 561364 ; -static unsigned int rss_eth_z8e_length = 157863 ; -static unsigned char rss_eth_z8e[157863 + 1] = - "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x3f\xbc\x32\x19\x60\xc4\xc0" - "\xcc\x84\x88\x53\x8b\xed\x60\x01\x47\xcb\x8f\x68\xb1\x8d\x16\x34" - "\x08\x28\x58\x7e\x29\xd8\x46\x09\x04\x14\x68\xd0\x08\x11\x22\x0c" - "\x10\x32\x61\x82\x36\x56\x20\x93\x18\x35\x42\x48\xf0\x8a\x2d\x6d" - "\x69\xc5\x16\x2b\xde\x62\x1d\x4b\x7c\x5f\xda\x26\x19\xda\x97\x7e" - "\x6f\x6e\x5f\x6c\x47\x1a\x69\xca\x0d\x30\x25\x03\x19\xc9\xcc\xd9" - "\xef\x67\xed\x7d\x4e\x32\x33\x4c\x50\xee\xbd\xcf\xf3\xfe\xd3\x3c" - "\xcf\xe4\x9c\xb3\xcf\xde\x6b\xaf\xbd\xf6\x5a\x6b\xaf\xbd\xf7\xda" - "\xeb\x10\x5d\xfd\x5f\x90\x2c\x7c\x49\x23\xf3\xcd\xb6\x0f\xfe\x1b" - "\xe5\xff\xf5\xf7\xaf\xbf\x7f\xfd\xfd\xeb\xef\x5f\x7f\xff\xfa\xfb" - "\xd7\xdf\xff\xbf\x7f\xa1\x34\x9a\x78\xde\x64\xa6\xdf\xf8\x88\xba" - "\xbd\x96\x11\x41\xd2\x8a\x5e\x79\x51\x44\xf1\x2a\x0d\xe3\xfc\x08" - "\xbe\xf2\xaf\x06\x69\x26\x1f\x59\x6e\xb2\x91\x4d\xbc\xe2\x30\x4d" - "\xdd\x4d\x54\x3b\x5c\x74\xbe\xf8\xb2\x08\x35\x95\x12\x1d\xd9\x8b" - "\xe7\x97\x45\xc7\x8b\xc3\x45\x18\x70\x96\x04\xa9\xa0\x96\xe1\x54" - "\xe0\xb9\x02\xe9\x48\x2b\x09\xd2\x92\xad\x9c\x56\x85\x72\x46\x7a" - "\x60\xeb\x45\x6a\x72\x46\xa9\x8a\xe1\x38\x63\x34\x6d\xa4\xc4\x63" - "\x0f\xf2\x66\x70\xde\x2d\xc3\x51\x6f\x16\x91\xf7\x65\x11\x89\xc3" - "\xc1\xc2\xf5\x70\xdd\x7a\xfe\x63\x49\xf5\x85\x90\xd6\x6e\xd4\xd7" - "\x0f\x0c\x1b\x97\xe7\x36\x38\xbf\x44\xe9\xa7\xe8\xda\xeb\x18\x26" - "\xe3\x26\xbc\x64\x09\x5c\x8a\xd2\x29\xba\xc6\xd5\xe5\xa5\xf4\x23" - "\xa0\xc6\x8e\x97\x65\x7a\x7a\x20\x1c\x25\x67\x19\xa5\xe1\xdd\x6c" - "\x5c\x4d\x28\x37\x84\xe9\x33\xbf\x9e\x46\x71\xdd\x80\x6b\x16\x26" - "\x7f\x5a\x63\x26\x11\xd3\x28\x6c\xa2\x9b\xc3\x5e\x4a\xeb\xf6\x5e" - "\x83\xf6\x5b\x5c\xb2\xfd\xa8\x17\x65\xcd\xa7\x68\xf0\x3f\x4d\xc8" - "\x8f\x3a\x43\xce\x8d\x8c\xc3\xe0\x0f\x85\xd7\x6f\x32\xe0\x68\x5e" - "\xff\xb5\x0d\x35\x44\x5d\x5e\xd3\xcc\xb0\xc9\x2a\x74\x38\x87\x0d" - "\x38\x9c\x0f\x75\x65\x70\x5d\x5d\x5e\x73\x4d\x5c\x9e\xa0\x91\x07" - "\x78\x87\x26\x84\x29\x9d\x71\x3e\x49\x83\x73\xb8\x3e\xbd\x2d\x66" - "\xae\x23\xb0\x2e\x4a\x01\xf4\x3d\xea\xce\x42\x5b\x9d\x47\x22\x44" - "\x80\x69\x6f\x2c\x23\x62\xf8\xc0\xdf\xa9\x60\x0e\x9e\x68\xc0\x64" - "\x18\xbd\x6d\xf5\xfa\x33\x1b\x25\x8e\xdc\x56\x0b\xe9\x79\x97\xc4" - "\xe3\xc8\x70\xd1\x96\xeb\xb9\x2d\x4d\xe0\x28\x3d\xcf\xd6\x5e\x7a" - "\xf4\xb6\xff\xda\xdc\x24\xd8\x0e\x05\x3b\x0d\xb0\xd3\xfc\x7a\xb9" - "\xde\xf6\x07\x93\xf2\xab\xbc\xb6\x6b\xc2\x26\xa1\xd3\x61\x70\x47" - "\x5f\xde\x6b\x6a\xe3\xf3\x02\x1f\x93\xa2\x2d\x99\x82\x34\xb8\x0d" - "\xed\x4c\x47\x9e\x59\xe8\x47\xa7\xfe\xfe\x3a\xfd\xbd\x03\xef\xee" - "\x51\xf0\xae\xcd\x89\x83\x67\x63\x78\xf1\xbc\xa5\x24\xca\x8c\xdf" - "\x00\x18\xc8\x03\xf1\x1b\x64\x31\xf8\x6d\xad\x43\x68\x9e\x2f\xa0" - "\x4d\x35\x56\xbf\xe6\x15\x14\x70\x47\xc8\x79\x03\x79\x4e\xd2\xb5" - "\x07\x00\x9f\x76\x6c\x24\x8b\xa7\x58\x44\x02\xee\x4e\x6a\x0d\x75" - "\x92\x27\x04\xd9\x88\x5e\xa0\xb2\x0b\xe0\xc5\xe8\x19\x2a\x7b\x9a" - "\x1c\x4d\xa5\x9f\x50\x2a\x5e\xd6\x4c\x82\x3c\x23\xb8\x6c\x3b\xb5" - "\xd6\xb7\x93\xa7\x3e\xb1\xac\xe7\x46\x72\xb4\xe0\x19\x7d\x6e\x65" - "\x3c\x58\xde\xa2\x99\x56\x7f\xe9\xab\x64\xf6\x8c\x24\x53\xcb\x32" - "\xbf\x8e\x4b\x86\x9b\x71\xd9\x7a\x9a\x2c\xaf\xaf\x00\x1f\x9e\x66" - "\x7c\xaf\xf7\xbf\xb9\x31\x62\x3a\xe2\x98\x45\x47\x1c\x27\xa8\xc9" - "\x31\x99\x9a\xdc\xd3\x68\xc7\x69\xca\x38\x12\x99\x44\x4d\xe6\xfb" - "\xa8\x69\xd4\x34\x0a\x74\xe2\x1e\xf2\x7b\xc4\x11\x26\xe7\x3a\xe6" - "\xa7\x8c\xc2\xda\x27\xc8\x12\x54\x30\x41\xbb\x8c\x92\x0f\x4a\x88" - "\x98\x76\xfc\x9c\xaa\x1d\x6b\xbf\x40\x0e\xe0\xd7\x01\x5c\xee\x04" - "\x2e\x3f\x1d\xe5\xa0\x6c\xe0\x3c\x28\x50\x17\x25\x73\x29\x5d\xd3" - "\x8f\x1c\x67\x69\xe0\x3d\xc8\x6e\x67\x03\xf4\x09\xcb\x6f\xd7\xa6" - "\x3c\xe8\x84\x0c\xc8\x7f\xc6\x56\x5d\x06\x3a\x3d\xaf\x91\xb9\x6b" - "\x7d\x5e\x5a\xe3\xcb\xa2\xbd\xdb\x3b\x84\x8c\x77\x90\xc5\x76\xbc" - "\xef\x98\x90\x45\xb6\x40\x34\x97\xde\xbf\xd4\xc1\xf2\xd8\x39\x34" - "\x4c\x69\x0c\xcf\xea\x86\xec\xac\xa3\x01\xc0\xe7\x0f\x8d\x48\xff" - "\x0a\xf2\xa1\x7c\x6e\x90\x5e\xea\xe4\xf2\xe2\xfa\x85\x61\xed\xfa" - "\x85\x17\xb4\x57\x16\x76\x89\x57\x16\x9e\x8f\xbd\xb2\xf0\x9f\x9e" - "\x0d\x64\x89\x5d\xbf\x30\xd4\x5a\x2c\xfb\xc0\xd6\x5a\x8c\x3e\x88" - "\x91\x65\xf3\x19\xb2\x2d\x7e\x1a\x7d\x1f\xfd\x88\x36\xaf\x24\x87" - "\x66\x1f\xee\x0e\x44\xff\x44\x8b\x4b\x49\xe0\xbe\x32\x55\xfb\xba" - "\x32\x1d\xbd\xb2\x85\x7a\x0f\x05\xcd\x43\x0f\x71\xbd\x21\xbb\x93" - "\xf0\x33\xe3\x67\xc1\x2f\x43\x64\x3a\x32\x40\x2b\xcf\xd0\x2d\x69" - "\xd4\x70\x89\x68\x82\x46\x69\xa7\x69\xc8\x71\xe0\x6f\xeb\x87\x6e" - "\x23\xb4\x9a\x85\xc1\x9b\xcb\xa9\xac\xbb\xbb\x90\x58\x17\xb2\xfe" - "\x63\x7d\xd8\xed\x1d\xea\x44\x3d\x11\x29\xbf\x2f\x43\xc7\x64\x2e" - "\x0c\x22\xbd\x23\xbc\xa9\x30\x2d\xb4\xa9\xd0\xd4\x95\xb9\xf0\x6f" - "\xc8\x33\x2d\x68\xb6\x66\xeb\x34\xec\x60\x58\x90\xad\xd0\x90\x28" - "\xa5\x03\x66\xf1\x3b\x17\xdb\xcc\xbb\x5f\x16\x27\x90\xaf\xa8\x17" - "\x16\x60\x03\x0e\xe8\x3f\xb4\xdc\x48\x03\xad\xdb\xb7\x23\x1f\x97" - "\x0f\x44\x72\x79\x4c\x09\x06\x8a\x3a\xc8\x1a\xa5\xc1\xa2\x47\xd5" - "\x87\x3c\x1d\xac\xd3\x87\x44\x68\x60\xb7\x97\xe6\x31\x6c\x2e\x17" - "\xe8\xec\x20\x94\xfb\x9b\xf0\x14\x9a\x90\x3e\xa7\x5b\x14\xa6\x6d" - "\x45\xfa\x11\x94\xd7\xeb\xee\x30\x70\xe4\x3a\xb8\xaf\x25\x9e\xe0" - "\x87\x23\x45\x11\x1a\x52\x47\xe9\x28\x37\x9f\xe1\x31\x2c\xf0\x41" - "\x10\x6d\xfd\xdb\x91\xa2\x10\x69\x22\x01\x66\x50\xc1\xb3\xe6\x24" - "\xc0\x43\xba\x00\x3c\xe6\xbf\x26\x94\x19\xb2\x47\xc2\x7b\xe8\x1d" - "\x8d\xe1\x45\xc8\xec\x94\xf8\x7e\x9b\x61\x74\xb3\xfe\x00\x4c\xff" - "\xba\x7b\xa9\x93\xac\x7b\x42\x9e\xc2\xf4\x56\x8c\x9b\x5c\xfe\xcd" - "\xb2\x8e\x01\xa2\x2b\x2f\x9d\x79\x8e\xdf\x07\xa2\xe7\x39\xcf\x16" - "\xd1\x55\x98\x3e\xa4\x13\xba\x08\x79\x50\xde\xcd\x78\xc6\xf7\xe5" - "\x43\xd3\xbf\x3d\x99\xbe\x3d\x6d\xe6\xb4\xc9\x34\x7b\xca\xd4\xc9" - "\x94\x7d\xe7\xb8\xec\x89\x5f\xfb\xc6\xd7\xe4\xcd\xd7\xbe\x91\xf3" - "\x35\x9a\xf7\x9d\x87\x26\xd3\xbc\x39\x93\x69\x3e\x7e\xf3\xe6\x4f" - "\x7f\x68\xda\xf4\xf9\x93\x29\xef\xbe\x99\x78\x9a\x3a\xf9\xb6\xec" - "\xfb\xc7\xcd\x9b\x3a\x73\x3a\x3d\xb8\xe0\xf6\xec\xdb\x6f\xa7\x29" - "\xd3\x67\xdd\x96\x9d\xad\x5f\x6f\xcb\xe6\x2c\x8f\xe6\x4c\x9f\x3f" - "\x6e\xde\x9a\xd5\x25\xab\xc7\xcd\x99\x39\x95\x53\xa0\xdd\xe2\x78" - "\xc8\x15\xbb\xa8\x31\xad\xc3\xe2\xdc\x0c\xd2\xa0\x3b\x1a\xc0\x03" - "\xf8\x75\xfa\xcb\x4e\x42\x07\xd8\x9f\x69\xe0\xbe\x93\x63\x80\xf5" - "\x30\xe4\xde\xdc\xed\xb5\x95\x82\x86\xc5\x4c\x43\xe7\x4d\xac\x27" - "\xae\x7f\x17\xef\x3e\xd0\xc7\x9a\x01\x78\x5f\x9f\xf8\x7e\x18\xf8" - "\xdf\xfa\x7f\xb7\x3a\x89\x02\xf8\x81\xee\x61\xe8\x42\xd0\x37\x44" - "\x5d\x9e\xbc\x01\xe0\xef\x34\xd4\xd1\x0e\xd9\x3c\x86\xb2\x6d\x71" - "\x32\xdf\x8e\xfe\x39\xc6\xe3\xca\x59\xb2\xbd\xd5\x5a\x92\x4b\xdc" - "\x4f\x81\x12\x1d\xc6\x85\x5e\x18\x83\x25\x0c\xf4\x3d\xe0\x1c\x57" - "\x70\xec\xce\x38\xfd\x10\x64\x38\x3b\xf0\x4e\x87\x75\xa1\x15\x7a" - "\x02\x7a\xfc\x77\x9a\xc7\x45\x22\xd3\x7a\x54\xeb\x71\xc9\xb1\x12" - "\xe5\xf2\xe2\xf8\x3a\xdc\xe4\x46\xbe\xd7\x67\xa4\x81\x0f\xd2\x30" - "\xfe\xa2\x2d\xb6\x65\xe0\xef\x70\xac\xc6\x69\x17\xe7\xf2\xd8\x8e" - "\x18\x78\x8a\x32\xff\x80\xf6\x35\x6b\x35\x4e\x9b\xe8\x96\x69\x4c" - "\xb7\x43\x82\x9f\x33\x91\xaf\xa7\x37\xed\x5d\x4e\x03\x1f\xa4\xb3" - "\xbc\x0a\x21\xd3\x31\x66\x66\x6e\x80\x4e\x6b\x43\x5e\x1b\xe7\x9d" - "\x10\xa5\x41\xd0\x35\x0e\xa7\x27\x8d\x4e\x52\x26\x69\x99\xce\xcc" - "\xb8\xfa\x00\x27\x93\x07\x29\xe6\x47\x73\xf7\x39\xc0\xe9\x92\xe9" - "\xb0\x63\x32\x17\x01\xfe\x30\xd6\x95\x4a\x7f\x5f\xff\x9f\x9c\x4f" - "\x1f\x9b\xfb\x9e\x21\xeb\x0a\xce\xf5\xff\x79\x04\xb4\x64\x7b\x81" - "\xed\xbf\x6e\x6f\xe6\x82\x20\x0d\x09\xa9\xb1\xf1\xfa\x36\xce\xab" - "\x01\x47\x61\x7b\xcd\x02\xb8\x59\xfe\x8d\x9d\x74\xaa\x98\xc7\xda" - "\x4c\x9b\xe6\x29\xa4\x44\x9c\xec\xcd\x8c\x3f\xeb\x0f\xd0\xe2\x4f" - "\xe0\x83\x6b\x00\x6f\x6f\x22\x1f\x64\xfa\x01\xc7\x0e\xfc\xda\xd0" - "\x26\x7b\x90\xec\x47\xb5\xae\x42\xd4\x4b\x26\xc8\x15\xf4\x79\x1f" - "\x0c\xbd\x7c\x7b\x62\x79\x7b\x25\x97\x43\xfe\x01\xdd\x5d\x32\xff" - "\x36\xa6\xb9\xce\x77\xe0\xcb\x61\x59\x49\x7c\xb9\x1b\xb8\xfc\x25" - "\xee\xfd\xc4\xa4\xf7\x5b\xf0\xfe\x6f\xfa\x7b\xc8\xfd\xb0\x05\x49" - "\x7c\x5b\x8c\xf7\x7f\x07\xbe\x61\xc8\x35\x6c\x0b\xfb\x0c\xf0\x58" - "\x28\x2e\xff\xd6\xa4\xfc\x7b\x90\xff\xbf\x98\x6f\x78\xcc\xe1\xfc" - "\x8d\xba\xec\x20\xbf\x05\xf9\x0f\x26\xd5\xbf\x14\xf9\xc3\x71\xf8" - "\x1d\x4f\x7c\x9f\x55\x8f\xf7\x9f\x32\xaf\xc3\x26\x1a\x80\x3c\x83" - "\x58\x97\xb0\x1e\x3b\x52\xc4\xfd\x95\x65\x4e\xca\x3f\x0a\xf9\x32" - "\x74\x1a\x99\x74\x1a\xcd\xe0\x7e\x44\x1d\x27\x14\x0e\x59\x39\x49" - "\x65\xf2\x50\x26\x0b\x74\xb4\x1b\x7c\x99\xa2\x4c\x51\x52\x99\x6d" - "\xdc\x8f\x42\xd5\x63\xee\xee\xe9\x2b\xa3\xeb\xc8\x78\x18\xdc\xb6" - "\x6b\x01\xe3\x40\x22\x8c\xe1\x1d\xa8\x77\xc4\x76\xa5\x77\xae\x05" - "\x0f\xdd\x8e\xb4\xff\x04\xcc\xeb\x58\x06\x20\xab\xe1\x40\x28\x42" - "\xc2\x33\x23\x43\xf1\xee\x75\xf6\xa1\x51\xe2\xfb\x71\x7c\xcf\xb0" - "\x45\xf7\x2c\x5d\x26\xaf\xb3\xe3\x8a\xf4\x2c\xb6\xdf\xd2\x58\x07" - "\x8b\xee\x6f\x69\x0a\xe6\x75\x77\x08\x13\x99\xf0\x1c\xd3\xeb\xf8" - "\x03\x9e\xd3\x80\x7f\x26\xc6\x1c\x12\xeb\x91\x6f\x23\x4d\x45\xfa" - "\x07\x52\x56\x55\x3e\xf9\xac\xea\x98\xc1\xfc\x3d\x11\xcf\xef\xea" - "\xe5\xdf\x62\x78\xb8\xbf\x4d\xbf\x4f\x8b\x31\xac\x73\x86\x0c\x0e" - "\xff\x91\x2c\x07\x39\x94\xf0\x51\x5e\xac\x97\xef\x18\xe6\x4b\xb8" - "\xce\xc4\x75\x0b\xae\x0f\xe2\xba\xc8\xf3\x29\x39\x3c\x31\x29\x8f" - "\xfc\x3c\x13\xd7\x87\x70\xbd\x03\xd7\xf9\xb8\x8e\xc4\xf5\x5e\xb4" - "\x21\xc6\x72\x81\x71\x94\xe7\x58\x61\x8c\xab\x8a\xb7\x78\x0e\xd0" - "\x3d\x83\x69\x30\x1d\x79\x3a\xa4\xbc\x2a\xfd\x62\x51\xfd\x78\x5d" - "\xa7\x4c\xcb\x94\x69\x83\x14\x3f\xa8\xb4\x98\xa1\x87\xce\xf5\xa5" - "\xe9\xba\x49\x97\x45\x3d\x4d\xc1\x9f\x07\xf8\x7e\xc6\x55\x28\x58" - "\x03\x54\x9f\xeb\xf0\x55\x39\x73\x8a\x3a\xd3\xe2\xeb\xc4\xb5\xd6" - "\xe3\x16\x02\xd7\x72\xee\xa3\x20\x0d\x3f\x20\x24\xdf\x63\x8c\x55" - "\xf0\xf2\xf5\x7c\x13\x99\xc6\xb2\xbc\x4c\xcf\x3a\x16\xc7\x4b\x99" - "\xdd\xde\xe1\xd1\x24\x39\xca\x06\x2f\x8d\x67\x9e\x61\xba\x73\xdb" - "\x86\x16\xcb\x71\x5c\xb6\x45\xc2\x3f\xa7\x78\xb2\x41\x9f\xb7\x2a" - "\xf9\xbd\x7e\x5a\x92\x7e\x91\x3c\x9b\x24\xef\x9d\x4c\xf3\xf4\x52" - "\x96\x83\xeb\x31\xff\x7b\x73\x84\xb4\x19\x6b\x9c\xc3\xf9\x7d\x18" - "\x7d\xcc\xf5\xa6\x17\x73\x3b\xae\xaf\x35\xde\xcb\x77\xf6\xfc\x25" - "\xcc\xdf\xe9\x45\xf2\xdd\x01\x8c\x47\x87\x8c\x77\x46\x3d\xe9\x25" - "\xf2\x5d\x73\x1f\x5c\x6b\x87\x0e\x37\x3d\x95\xcd\x27\x7c\xd6\xb6" - "\x71\x44\xa6\x5b\xcb\x69\x40\x20\x7a\x9c\xe6\x46\x45\x6c\x5c\x39" - "\x5d\x13\x88\xee\xa7\x5b\x88\xec\x81\xe8\x09\xba\x95\x68\x64\x20" - "\x5a\x0b\x1b\x64\x2f\xbf\x7f\xff\x66\x4a\x4b\xc3\xd5\x33\xa6\xdc" - "\x94\x16\x88\x96\xd0\xa8\x72\x33\xae\x45\x74\xdf\x00\xd1\x1d\x88" - "\xce\x42\xbe\x65\x34\x37\x26\xce\x4d\x1b\x20\xfe\x5a\x10\x23\xdb" - "\xac\x67\x85\x27\x10\xc5\x7c\x20\xda\x8c\x74\x4d\xcc\x8d\x7d\x8a" - "\x5f\xb7\xd0\x7c\xd6\x8e\xb9\xb1\x73\x62\xea\xb3\xef\xe3\xf9\xaf" - "\x02\x7d\x24\x02\xd1\x49\xd4\x1a\x0e\x23\x9f\x47\x88\x6a\x6b\xdb" - "\xe2\x0b\x26\xea\x81\x0d\xa1\x55\x5b\x3b\xd0\x96\x48\x0f\xda\x81" - "\xf1\xb5\xbb\x67\x13\xae\x35\xd6\x8b\xf2\xd9\x67\xb3\x08\x9b\x35" - "\x32\x1e\x93\x2b\x6e\x43\x20\xda\x4e\x05\x98\x1e\xcc\xdd\x10\x12" - "\x8c\xff\xd0\x2d\x3c\xb7\x9a\x44\xe8\x03\xeb\xdc\x0d\x1e\x81\x77" - "\x16\x61\xb7\x46\x02\xd1\x4e\x12\xd5\x28\x9b\x69\x1b\x20\xe1\xf9" - "\x6c\x2e\xe4\x0d\x71\xbe\x78\x38\x0c\x83\xf3\xce\x8d\x91\x15\xf9" - "\x5d\x3d\x76\x9b\x03\xbf\x1c\xfc\x0a\x51\x76\xa3\xf0\x66\x7d\x20" - "\x30\xde\xa3\x7c\x25\x9e\xeb\x22\x90\x61\x49\xcb\x18\x0d\x42\xfe" - "\x4a\xf0\xcb\x34\xf0\x1d\xf0\xb5\x1d\x92\xf8\xd6\xd8\xde\x89\xc8" - "\x76\xd8\x7e\xa9\xda\x61\x7b\x9b\xd3\xbb\x60\xeb\xe0\xbe\xad\x4b" - "\xbd\xfb\x0f\x94\x5b\x20\xcb\xf9\x6c\x6d\xc2\x66\xeb\x88\x40\xbe" - "\x40\xd7\x72\xa6\x23\xe8\x5a\xce\xb4\x04\xfc\xb6\x80\x7b\x1b\x09" - "\xbb\xad\x03\xf8\x44\x44\x8d\x7d\x70\x8f\xb4\x41\xec\x8e\x88\x84" - "\x6d\xbf\x1e\x70\xf2\xc1\xb7\xe9\xc2\x66\x77\x08\x9f\xdd\xd5\xe3" - "\x75\xd2\xdc\x0d\x22\x32\x37\xba\x25\x5a\xb0\x81\xd2\xc7\x52\x39" - "\xf0\x7d\x0f\x34\x5a\x86\x76\x36\xe1\x3a\x0d\xef\x69\x18\xea\x7a" - "\x5f\xd8\xed\x0e\xae\x4f\x54\xdb\x5d\x80\x39\x1a\xb0\x96\x31\x4e" - "\x9f\x7a\x09\xb6\x88\x3d\xe7\x53\x89\x9f\x3d\x4f\xf3\xd9\xdd\x9a" - "\xcd\x5e\x68\xf0\x10\xf3\x8f\xa2\x5b\x2d\xcd\x09\x8b\x68\x20\xba" - "\x9b\xc0\x63\xb6\xd6\xf0\x09\x7e\x8f\xf9\xcf\x7e\xf4\x33\xf3\x54" - "\x09\xae\x7b\x89\xf9\xa7\xb5\xf8\x59\xce\xfb\x3e\xf3\xd0\x9c\xe2" - "\xf0\x96\x71\x54\x9c\x86\x67\x4f\x41\xd4\x42\x8b\x8b\xcd\xe5\x31" - "\x9f\x7d\x46\x6b\x31\xf7\xcb\x71\x94\xe1\x72\x45\x64\x4d\xc3\x1c" - "\x20\x4d\x44\xad\xee\x90\x79\x48\xa1\x47\xb4\x86\x67\x21\x6f\x31" - "\x71\x7b\x98\x8f\x38\xff\xec\x4e\x11\x8c\xd9\xec\x11\x6e\x9b\x18" - "\x5a\x4e\x2d\x9d\x77\x10\xcf\xc3\x5a\x3a\xf7\x32\x9f\x6a\xa0\xcb" - "\x51\xf0\x68\xcf\xec\xce\xf2\x01\x8b\x2f\x50\x1a\xd2\x62\x2d\x85" - "\xfb\xf1\xbe\x09\xf9\x9a\x25\xdf\xce\xb9\x10\xb5\x46\x6d\xf6\x9c" - "\xa8\xcf\xde\x36\xe7\x42\x8f\x68\x29\xac\xa5\x45\x9d\xe5\xa0\xd5" - "\x7e\x9a\x7d\x26\x9a\xde\x5a\xbc\x0c\x79\xba\x91\xbe\x57\xf2\xff" - "\xec\x33\x5d\x62\xce\xd3\xe2\xdc\x9c\x0b\x7f\x15\xb3\x0b\xc5\xfb" - "\x05\x6e\x1a\x7a\xed\x16\xa1\xb1\x5c\x34\xb7\xef\xa7\x6b\x4f\x04" - "\x89\x65\x62\xd6\x52\x4d\xcc\x3e\x73\x4e\x2c\x7e\x9a\x69\x33\x89" - "\x5a\x0a\x21\x3f\xee\x5a\xa6\x77\x5e\x4b\xe1\x61\xd4\x3f\x0d\x70" - "\x3d\x22\xe0\xde\x8d\xbc\x7e\xeb\xa2\x33\x36\x6a\x6e\xaf\xa5\xa8" - "\xdd\x9e\x13\xab\xb6\xcf\xd0\xec\xf6\x42\xad\xda\xee\x46\x3f\x1d" - "\x8d\x56\xdb\xdb\x62\x76\x3b\x78\x20\x73\x06\xfa\xe9\x1a\xee\xf3" - "\x4b\x5e\x72\xe2\xf9\xbe\x4b\xdc\xff\xbe\xcc\x3c\x61\xcb\x74\xc3" - "\xe6\x15\x8a\xf7\x33\xf3\x78\x6d\x41\xd8\x33\xdd\x3d\xf6\xcc\x42" - "\xe4\x73\x2b\xf9\xca\xac\x64\xbe\x44\x3e\x13\xd2\xbe\x87\x79\x4f" - "\x3a\xde\xd7\xe1\xb7\x0f\x3f\xd8\xa1\xc3\xa0\xbb\xc8\x2e\x79\xca" - "\x37\xcc\x22\xee\xf6\xc1\x86\xbe\x00\x38\xc3\x5c\x73\x63\xf7\x08" - "\xd0\x10\x72\x32\xcc\xa2\x55\x0f\x83\x7e\x1f\x36\x23\x22\x79\x7f" - "\xd8\xfd\x0c\xbb\x67\x93\x8b\xd7\x1c\xcc\x78\x9f\x87\xb4\xdf\x45" - "\x98\x57\x6d\xc3\x8e\x6a\xb6\x2c\x17\x60\xb5\x7d\xeb\x59\x11\x8a" - "\xf9\x86\x45\x34\xdf\xb0\x8e\xe8\x40\xd8\xe6\xee\xc3\xc4\xfa\x29" - "\xfa\x6b\x01\x1a\x7c\x08\x7a\xec\x95\xfd\x1f\x70\x43\x06\x36\xdc" - "\x50\xde\xd2\x09\x5e\x28\xfe\xa9\xd4\x4d\xad\xe1\xe3\x92\xa6\xc0" - "\xe3\x28\xf3\x14\xf7\xef\xe2\x62\x2a\x47\x5d\x6d\xc0\xa5\x23\x56" - "\x0d\xb8\x76\xd4\x93\x39\xfc\x89\x88\x94\xd7\xe1\xe0\xd7\xc3\x28" - "\xf3\x21\x29\x1e\x1f\x5e\xd8\x9f\x8e\x64\x5d\xc5\xfa\x69\x6e\x34" - "\xc2\x3c\xf3\x77\xd6\x6b\x4a\x4f\x51\x81\xa1\xa7\x58\x47\xf1\x7c" - "\x87\xf5\x94\xa6\xeb\x29\x4d\xd7\x53\xf2\xd9\x66\x63\x58\x11\xd6" - "\x47\x73\xdd\x4a\xcf\xcc\x8d\x65\x0b\xf0\x46\x06\x60\x44\x54\x5f" - "\x20\x4f\x8d\x6d\x80\xcc\x2f\xe9\x64\x73\x69\xd0\x37\xf8\xe5\x68" - "\x4a\xdf\xb8\x75\x7d\x63\x32\xf4\x4d\x0c\xe3\x1a\x64\x4a\x4b\xa5" - "\x6f\x34\x5d\xdf\xc4\x84\xd2\x37\x9a\xae\x6f\x38\x3d\xa6\xeb\x9b" - "\x58\x0a\x7d\xa3\xf9\x6c\xdc\xde\x74\x5d\xcf\x94\xb3\x9e\xe1\xf6" - "\x6a\xd5\xb6\x0e\x4d\xe9\x19\x0b\xe6\x3a\x26\xd6\x33\x31\x94\xd1" - "\x0c\x3d\xd3\x2d\xf5\x81\x8b\x75\x4d\xcf\x73\x04\xfd\xe9\x24\xd6" - "\x31\x52\x9f\x44\x47\x46\x59\x9f\x80\x7e\xf7\x24\xeb\x13\xc0\xcb" - "\xc1\xbd\x4d\xd7\x53\x85\x98\xe9\x46\xa1\x4f\x66\xcc\x75\x87\xd1" - "\xd7\x1f\x61\xee\x0f\xbd\xed\x2e\x29\x0f\xb8\xa3\x04\x3d\xe0\x16" - "\xad\xe5\x04\x9d\x03\xfe\x8d\x41\x57\x10\x41\x2e\x8f\x42\x3e\x23" - "\xa8\xbb\xad\xb5\xf8\x4f\x04\x79\xcf\x99\xdd\xd9\x15\x58\x1c\x76" - "\xd9\x66\x9f\x11\x21\xd0\x27\xb8\xb8\xb8\x1c\xfa\xc5\x15\x6a\xe9" - "\x7c\x8f\x66\xb5\x0b\x6d\xd6\x92\xa0\x13\x78\xb4\xcd\x5e\xe9\xb7" - "\x2e\x7e\xda\x06\x39\x13\x7e\xe8\xc5\xff\x67\xf6\x19\x9b\x35\xbf" - "\x9d\xbe\x34\x6b\xa9\xd0\x20\x4f\xa0\x3b\xe4\x0c\xf2\x08\xdc\x0b" - "\x21\x73\x6e\xc8\xd9\xd1\x68\x92\x9c\x41\x66\xee\xc3\xbd\x53\xd1" - "\x2f\xd3\x0d\x39\xcb\xd3\xe4\x78\xd6\x2e\xe7\x98\x90\x35\x37\xaf" - "\xc5\x41\xd6\xf2\xb4\x6a\x25\x6b\x9a\x2a\x57\xa9\x31\xfd\x4c\xba" - "\xac\xa1\x2f\xf0\xbe\x0e\xbf\x7d\xf8\xa5\x96\xb5\xe2\x38\x59\x7b" - "\x5a\x97\x35\xbb\x92\x35\xf4\x69\x7a\x6c\x93\x92\x37\x86\xcf\xf3" - "\xd0\x5e\x79\xcb\x1c\x76\x14\xf7\x69\x8a\x77\x58\xe6\x86\x61\x5c" - "\x19\x16\x81\xbc\x75\x68\xbe\x2c\xc0\x13\x21\xd6\x9b\xe0\xcd\xbf" - "\xf0\x58\x37\xa7\x58\xfc\xa5\x20\x76\x43\x39\xea\x8a\x40\x97\xfd" - "\x15\x7a\xf4\x2f\x8b\xc3\xb4\x07\xb0\x8e\xa2\xbe\x36\xc8\x53\x87" - "\x56\x2d\xe5\xa9\x30\xb6\x89\x61\x0e\x2f\xec\x85\x21\xc7\xca\x44" - "\x79\xea\x6f\x1d\xb4\xdb\xeb\x2c\x0d\xd2\xaf\xa4\xdd\x84\xfb\xca" - "\x20\x1d\x9e\xa6\xdf\xc3\xfe\xd9\xe3\x90\x76\x0c\x64\xb0\xb8\x8c" - "\xae\x3b\x4d\x23\x67\x80\xdf\x09\xf7\x19\xb8\x9f\x35\xf7\x96\xf7" - "\x61\x47\x54\xe6\xa0\xde\x6e\x96\x43\xe1\x9d\xc8\xf6\x59\x2e\xf8" - "\xd0\x22\xba\x5d\x19\xb0\x2f\x1b\x44\x8f\x83\xd7\xda\xac\x78\x1e" - "\x8a\xf6\x8f\xc2\x35\x73\xf7\x45\xca\xc2\xcf\xb1\xdb\xab\x95\xb3" - "\xed\x84\xfb\x6c\xb1\xde\x31\x78\xc7\x3a\x1a\x6b\x0d\x93\xa5\xd1" - "\xab\xe5\x59\xb7\xd8\x78\xcd\x29\x8b\xef\x85\x77\xef\xa4\xc6\x8b" - "\x64\xe6\x75\x01\xcd\x8e\xfa\xdc\x56\x21\xd6\xba\xa8\x71\x0d\xf4" - "\x83\x97\x1c\x8d\x5e\x71\x20\xd6\xcd\x34\xb0\xb6\x19\xb8\x30\x6e" - "\xc0\xf3\x46\xe0\x99\xff\xf0\x86\x5c\xfa\xd0\x4d\x29\xd7\x6a\xbb" - "\xbd\x23\x7b\xdb\xdf\xcf\xfb\x7a\x83\x26\xfd\xbc\x3f\x6c\xd0\xa9" - "\x9f\x75\x3d\x33\x8f\xd1\xb1\x75\x22\x54\xf5\x04\x31\x2d\x1c\x9e" - "\xa8\xf8\x1b\xe8\x58\x5e\x16\xa3\x1b\xe7\x6e\xf8\xb2\x08\x74\x0a" - "\x7f\xc0\x7d\x86\x1a\xf1\xbe\xac\x54\x68\x9a\xdd\x09\x99\x77\x96" - "\x76\xad\x13\x51\x5e\xcb\xe9\xf6\xde\xe4\x0c\xd2\x37\xfd\xaa\x2f" - "\xec\x79\x72\x0e\x69\x73\x96\x02\x96\x9d\x61\xb5\xa0\x7c\xac\xda" - "\xb9\x15\xf9\x66\x04\xe9\xb7\x79\x32\x9f\xcd\x9e\x57\xbc\x91\xbe" - "\x78\x9a\x6e\x92\x34\x16\x3e\x67\x2d\xeb\x03\xa4\xd9\x90\xb6\x0d" - "\xf0\xeb\x90\xdf\x1d\xa4\xb7\x6b\x95\x1d\x7b\xd3\x36\x23\x1f\xee" - "\x97\xf0\x7d\x02\xff\xa4\xc9\xc5\x74\xc0\x72\xf6\x6d\x56\xa5\xe9" - "\xcb\xeb\xc6\x9f\x0d\xbf\xdc\xd4\xaf\xfb\xf4\xb9\xbd\x0d\xb6\x16" - "\x79\x36\xd3\x08\xf4\x0f\xf0\xfb\x4a\x1a\xe6\x11\xa7\x84\xf7\xa6" - "\xba\xd7\x37\x46\x30\x4f\xf8\x4a\x46\x90\x5e\x68\xea\x8f\x9e\x82" - "\x6d\x9d\x8b\xa2\xa3\x6a\x5d\x2f\x2d\x3f\x9e\xbb\x41\x13\x7c\xcf" - "\xfa\xa8\x11\xe9\x4c\x37\xc0\x59\x60\xd0\xac\xff\x7e\x71\xfa\xd4" - "\x9c\xf3\x2b\x07\x85\x57\x90\xff\x4b\xbc\xc7\xf4\x95\xb7\x15\x1d" - "\x32\x0b\xbb\xa0\x47\x78\x9d\x18\x73\xb3\xf0\x5a\x87\x88\x00\xe6" - "\xbe\x20\x8d\x35\xd6\x58\xc3\x81\xe8\x74\xd6\x2d\x29\xc7\x2d\xde" - "\x13\xeb\x83\x3f\xea\x78\xeb\x08\xe8\x21\xa9\x9b\xf2\xf7\x96\x29" - "\xbc\x23\x0c\xd7\x5f\x76\x9e\xda\xf1\x7e\x6d\x58\x74\x08\x5f\x7e" - "\x1d\xcf\x23\xfc\xeb\x2e\x71\xda\x9f\xc0\xdb\xc2\xbf\x86\x71\x1a" - "\xf5\x27\xff\x97\x2e\xd1\x29\x37\xa5\x37\xf6\xae\xff\x8c\xf2\xf3" - "\x7a\x8f\x5a\xe7\x1a\x95\x1b\xa4\x71\x11\x03\x2f\xb6\x31\x40\x5f" - "\x0b\xdb\x1c\x6c\x6b\xf0\xde\xc3\xda\x52\x11\x61\x9b\x03\x79\x8b" - "\x8c\x36\x70\xfb\x54\xbb\x46\x95\xc7\xb7\x8b\xf7\xa8\xac\xa5\x8a" - "\x06\x6b\x37\x90\xc5\xa9\x68\x6d\xe1\xf6\x72\x5b\xb8\xcd\xb2\x2d" - "\x52\xc7\x62\x8c\x88\xde\x81\xf9\x98\x4c\x77\x03\x16\xe6\x3f\x63" - "\x75\x9e\x1a\x95\x9b\xcc\x47\xbd\xfd\x68\xb3\xbb\x30\x07\xfd\x92" - "\x47\x13\x27\x4f\xd1\xe8\x47\xd4\xda\xd9\xe8\x47\x34\xb6\xb3\x23" - "\xcc\xbf\x63\xdc\x3c\x26\x07\x4a\x59\xdf\xca\xbc\xc3\x90\xb7\x1d" - "\x79\x66\xea\x79\x67\xaa\x3d\x3b\x79\x1d\xc4\x57\x8c\x63\xa3\x83" - "\x34\x7a\x49\x48\x8e\xf7\xf9\x4b\x8c\x67\xcc\xdd\x31\xff\x1b\xed" - "\x10\xd5\x63\xdc\xa9\x71\xc9\x72\xf1\x78\x16\xbb\x28\x3a\x51\xcf" - "\xf5\xcc\x53\x9e\x0d\xf4\x05\xf0\xe5\xc7\x65\x9b\x69\x18\xf3\x93" - "\xb0\x3b\xeb\x15\xdd\x47\xef\x17\x5e\xd8\x9e\xd0\xa8\xc5\xeb\xe8" - "\x8b\x90\xa3\xda\xd3\x34\xfa\x83\x82\x52\x27\x70\x25\xaa\x3a\x4b" - "\x24\x75\x90\xdd\x59\x17\x88\x7e\x42\x8d\x67\x79\x6d\x67\x74\xd0" - "\xe0\x45\xdc\x77\x5e\x49\x5f\x80\xae\xfb\xd4\xda\xc3\x98\x47\x78" - "\x9f\xe1\x24\x8d\x99\xc6\xed\x55\x7b\x9c\x63\xee\x10\x17\x45\xbe" - "\x50\x63\x5a\x5d\x90\xc6\x14\xe3\xba\x4f\xfe\xbc\xb4\x44\x7f\xae" - "\x43\xbe\x51\xe2\xa2\xc6\x79\xc0\xaf\x63\x26\x09\x6f\x1a\xcb\xc4" - "\xe1\x6e\xef\x98\xc2\x20\xdd\xdd\xa6\xfa\x66\xcc\x44\x86\xd5\x0f" - "\x0e\x75\xe8\x5b\x62\xde\x04\xac\x3f\x38\xcb\x78\xed\x72\xcc\x1b" - "\x52\x2e\x00\xab\xd1\xa4\xf4\xb6\x06\x5c\x1b\xbc\x5a\x21\x74\x74" - "\xa1\x56\xe3\x8a\xc8\x7b\xfd\x9d\xd0\xc7\xd1\xd4\xf0\xf3\xf7\xfa" - "\x6f\x60\x1e\xbf\x79\xac\x82\x93\x5f\xe7\xbf\xe1\x34\x3f\x8f\xe3" - "\xe7\xb0\xed\x96\x48\xa0\x2e\x17\xf5\x9f\x46\xbd\x37\x8f\x55\xf3" - "\xf9\x9b\xc7\x75\xa1\x8e\x6e\xef\xcd\x63\x83\x34\xc1\xac\xf6\x5c" - "\x6e\x89\xf4\xb7\x97\xcc\xb2\xc3\x32\xa7\x64\xda\x75\xa6\x65\x8f" - "\x94\xbf\x4a\xf0\xfc\x3e\x5d\x6f\xf0\x3a\x4d\xc6\x49\x72\x75\xb6" - "\x38\x24\x7f\x9b\x84\xe9\xe6\x6d\x3f\xd3\x42\x26\xde\x17\x53\xea" - "\xcb\xd5\x79\xf9\xef\x66\x3f\x7e\xc7\xf0\x3b\xa1\x3f\x77\xe0\x17" - "\xc5\xfd\x2c\xfc\x4e\x48\xda\xed\x5a\x96\x16\xc4\xbb\x2e\xd8\xec" - "\xfc\x1c\xa4\x9b\x8f\x8a\x5d\xa3\x4c\xb0\x4b\xe4\x7d\xe3\x17\x78" - "\x9d\xe0\xe6\x30\xfa\xa0\x54\xf5\x85\x4b\xae\xa9\x00\x37\xa6\xbb" - "\xf0\xd4\x89\x48\x53\x59\x98\xf1\x1e\xd5\x54\x17\x26\xe7\x18\x6e" - "\xbf\xcb\xc5\x6d\x0a\x83\xfe\x7c\x5d\x5b\x27\x42\x47\xea\xa3\xc4" - "\xfb\x73\xdd\x5e\x17\xe4\x7f\xe5\x2c\xb5\xe6\x90\xef\x67\x78\x3a" - "\x4f\x08\xa3\xfd\x4a\xa7\xdd\x12\xe1\xbe\xc4\xf3\x33\x68\xbb\xf5" - "\x2c\xb9\xde\x16\x99\xae\xc8\x91\x42\xa2\xdd\xd0\x23\x18\x6b\xe4" - "\x5e\x41\xa3\xf4\x0f\x70\x61\x1c\x18\x73\xc2\xd8\x4f\xda\x8e\xf7" - "\x3b\xf0\x0e\x63\x4f\xa8\xa5\x30\x42\x0c\x2b\xc6\xed\x43\xf9\xf7" - "\xb4\x90\x19\x63\x35\xfa\xfc\x96\x48\x59\x31\xf4\x4c\xaf\xde\x72" - "\xe5\x6f\x3e\x23\x22\x46\xfb\x8e\xec\x61\x59\x70\x81\xff\x9f\x2c" - "\xec\x97\xff\x7b\x71\xbe\xf5\x9a\x23\xa3\x54\x9f\x69\xa0\x4b\x62" - "\x9f\xdd\x6a\x51\xfd\x75\xcb\xa4\xc4\xfe\xba\x15\xb6\xcd\x2d\x5b" - "\xf1\xab\xc7\x6f\xbf\x7a\x8e\xff\xdd\x52\x1c\x77\x7f\x18\x3f\xe8" - "\xce\x5b\x30\xfe\x8f\x8e\xa8\x7e\xe0\x74\xb4\x83\x79\xe4\x9f\x64" - "\xd1\x7a\xf2\x88\xf7\x6b\x39\x9d\xf9\x99\xd3\x35\xd8\x33\x41\xba" - "\xc5\x87\xf7\x36\x96\xd5\x2a\x8d\x12\xde\x07\x50\xbb\x7f\x23\x74" - "\x35\xdd\xf2\x31\xc3\xb2\x6e\xa9\xac\x64\x3e\x45\x99\x5a\x6b\xb4" - "\x12\xf3\x83\x5b\x3a\x0d\xba\x22\xed\x38\xbf\x67\x9e\xec\xf6\xde" - "\x6a\x06\x5d\xf6\xc9\xfd\x58\xcc\xf7\x52\xdb\x1a\xb7\xba\x7a\x6d" - "\x32\xdb\x30\x0b\xeb\xa3\x4e\xfa\xea\x44\xe8\x2c\xf4\xad\x2b\xa4" - "\xc6\x9a\xaf\xde\xc1\xcf\xd0\x95\x1f\xe3\x3e\xbb\x05\x3a\xe9\x52" - "\x8d\x93\xd7\x71\x06\x5d\x32\x51\x6e\xb4\xa6\x32\x3f\x9a\xe9\xc8" - "\x08\x74\x1c\xa4\xd6\xe8\xcf\xc9\xf9\x84\x84\x71\x4b\x00\x3c\xe0" - "\xd9\x20\x62\x6f\x5e\xda\x67\x0e\x44\xcf\xf9\x31\x36\x7f\xf9\x34" - "\x7d\x55\xd2\xe3\x85\x93\x18\xf5\x17\x4b\xd8\x3a\x7d\x2a\x73\x76" - "\xac\x10\xd1\x1d\xa7\x44\x18\xf6\xdd\xe0\xed\x97\x68\xec\xce\x8d" - "\x94\x5d\x7f\x89\x46\x35\x5c\x22\x97\xf8\xbb\xcb\x54\x0f\xbb\x6d" - "\xf1\x05\x1b\x41\x27\xe4\x0d\x2d\x26\x4b\xc3\x46\x92\x3c\x12\xab" - "\x86\xfd\x16\x85\xfd\x76\xce\xc5\xba\xb1\xd7\x7e\xeb\x91\x76\xf1" - "\x48\x9d\x8f\x46\x9a\x87\x14\x52\x5a\xc6\x12\xb2\x01\x3f\xcf\x59" - "\xba\x75\x65\x06\x06\x44\x6e\x73\x50\x6f\x2f\x68\x5e\x6a\x2d\xa4" - "\x41\xb2\xad\xd0\xd7\xa2\xda\x15\xea\x77\x1c\x36\x31\x4f\x85\x59" - "\x6e\xb8\x0d\x5b\x78\xcf\xf8\xe0\x0d\x11\xf3\xda\x7a\x11\xe1\xf4" - "\x92\x91\x22\x82\xf4\x42\xae\xfb\x00\xd2\xbb\xbd\x5f\xf5\x05\xcd" - "\xd7\x36\xf7\xc7\xa3\x98\x1f\xe9\x7a\x65\xac\x5d\x98\xca\xc1\xa3" - "\xc3\x66\x6c\x8e\xc2\xf6\x3e\xcb\x32\x3b\xd6\x36\xb7\x48\x44\x9d" - "\xab\x78\xff\x7e\x2c\xb1\x6f\x01\xef\x29\xfe\x0c\xb6\xcd\x67\xf9" - "\x13\xf0\x78\xc1\x73\x05\x6b\x11\x60\xd6\x0c\x9b\x21\x30\x3f\xff" - "\xbc\xfe\x0c\x68\x67\xc6\x8b\xc3\xd9\xcf\x66\xec\xac\x20\xcd\xda" - "\xcb\xb8\x4b\x5f\x1a\xe8\x4e\xd8\x5b\xc3\x80\x57\x65\x18\x74\xc0" - "\x7b\x8c\xff\x33\xdd\xfa\xfe\x6f\x88\xf7\x5e\x91\x86\xf1\xff\x81" - "\xc3\x9c\x56\x32\x92\x1c\x25\x4e\xd1\xd1\x9f\xcd\xc4\x7b\xd2\x80" - "\x87\xf9\xe6\xd8\x83\x06\x1c\x8c\x53\x3f\xee\x32\x3d\xfc\x30\xd2" - "\x8e\x1a\x70\x90\xe7\x3a\x3c\xb7\xf5\xe6\x51\x65\x3a\xe2\xca\x3c" - "\xdc\x65\xba\xf5\xc7\x48\x8b\x26\x96\x19\x97\x91\x58\x66\xdc\x88" - "\xb8\x32\xe5\xaa\x9e\x71\xd9\x49\x65\x72\x93\xca\xcc\xbb\x1c\xb7" - "\x71\xcb\x92\xca\x94\x24\x95\xd9\x7a\x39\x6e\xe3\xea\x92\xca\xec" - "\x4b\x2a\x73\x28\x8e\x96\xec\x57\x93\x8d\xb4\xe6\xa4\x32\x27\x92" - "\xca\x74\x1a\xcf\xfd\xd0\x38\x63\xed\x6e\x72\x80\x37\xd9\x77\x2b" - "\xf4\x22\xfa\xa7\xeb\x95\x27\xbb\x55\xd9\xf1\xae\xcb\xdb\x35\x7e" - "\x52\x62\x7d\xe3\x67\x25\xd6\x37\x3e\xff\xf2\x76\x8d\x2f\x4e\x2a" - "\x53\x9e\x54\xc6\x17\x57\x66\x8f\x5e\xcf\xde\xa4\x32\x07\x93\xca" - "\x34\x5d\xce\x57\xe3\xdb\x92\xca\x74\x24\x95\x89\x7c\x06\x2d\x78" - "\x1c\x57\x7e\x6d\xc3\xd9\x56\xbe\x17\x36\xc2\x84\xa5\xec\x1b\xc1" - "\xfb\xa0\xaf\x5f\x8a\x0c\xe0\xfd\x39\x1e\xaf\x8e\xb8\x23\x18\x5b" - "\x26\x60\xfe\x33\xd1\x6f\x8c\x59\xec\x37\xc2\x32\xad\x6c\xec\x09" - "\xae\xfe\x6c\x51\xe9\x7b\xa6\xfb\xaf\x71\x5d\x47\x46\xf0\x38\x35" - "\xa1\xb6\xd7\x26\x56\x3e\x68\xa4\xc3\xf9\x87\xb1\x0f\xdb\xa8\xfc" - "\x51\xd2\xd8\x26\x3f\xe2\x96\x65\x8e\xc6\xd9\xd1\x5c\x7f\xf8\xe0" - "\xc6\x88\x39\x09\x8f\x7d\x57\xc0\x23\x03\xb6\x51\x65\x2b\x46\x2f" - "\xde\x5f\x6f\xa9\x87\x0d\x04\xbb\x9f\x71\x3b\x49\xd9\xd9\xd2\x26" - "\x5b\x75\x89\xf8\x3e\x50\x7a\x97\xdc\x7f\x57\x36\x69\x76\x61\x13" - "\xea\x67\xdb\xbd\xa9\xf8\x3c\xfb\xa7\x60\xfc\x65\xdb\x2d\xfb\xa5" - "\x23\xa5\x21\xe0\x95\xbd\xc4\xf0\x53\x09\x52\x76\xad\xb4\x35\x7c" - "\xf9\xe5\xec\x1b\xc0\x3e\x34\x47\xc2\x39\x9c\x07\xfc\x3f\xa1\xc8" - "\x68\x2f\xc6\xfa\x10\xf2\x4e\xba\x12\xcd\x54\x1f\x66\x1f\x4e\xe4" - "\xc9\x01\xe0\x95\xec\x63\x89\xfd\x9e\x1d\x4c\xec\xf7\xec\x50\x22" - "\x4f\x9a\xc0\x93\xb7\x99\x13\xcb\xdc\x96\x95\x58\xe6\xb6\x51\x71" - "\x65\x7c\xaa\x9e\xdb\x72\x92\xca\xcc\x48\x2a\x93\x17\xf7\x8c\x36" - "\xde\x56\xd8\x3b\xf7\x91\x3e\x50\xb7\xb9\xe3\x9e\x4d\xb5\x52\x7f" - "\xde\xb6\xcd\x48\xe3\xb5\xa3\x86\x97\x95\x0f\x8e\x0e\x6f\x5f\x92" - "\xbc\x73\xfe\xc3\x49\x38\x34\x27\xe1\xd0\x2b\xff\xfa\xde\xfd\x6f" - "\x4e\xd1\xed\x07\xf5\xbd\xfb\x4e\x8c\xd9\x73\xf9\x19\xb0\xea\x90" - "\x1f\x74\xb8\x3d\x23\x11\xde\xed\x23\x12\xe1\xdd\x3e\x36\xee\xd9" - "\x86\xe7\x49\x71\x6d\xb0\xa5\x3b\x28\x0d\xfc\x02\xfb\xed\xf6\x05" - "\x46\x3a\xcf\x29\x81\x6f\x87\x47\x8e\x35\xb9\xec\x5b\x96\x79\x92" - "\x6e\x9f\xc2\xf3\x4f\x1d\x66\xbc\xfc\x93\x6a\xd7\xed\xb5\x49\x78" - "\xec\x4d\xc2\xe3\x60\x5c\xbb\xc2\xd6\x2d\xf4\xa0\x35\xfa\xd0\x23" - "\x6c\xfb\xb0\x3f\xa5\xf4\xf1\xda\x0c\x9b\xed\x02\xd9\xd8\xb7\xee" - "\x54\x09\xa5\x07\xdc\x1d\x98\xcb\x8d\x4c\xb9\x0e\x23\xf9\x29\x33" - "\xdf\xa7\x7c\xab\xc8\xd9\xed\xfd\x5a\x96\xc1\x8f\x5a\x4d\xbe\x4f" - "\xab\xbe\xb9\x09\x69\xd0\x7f\xd9\x7b\x94\x9d\x7b\xb3\x4d\x78\xf2" - "\xea\x40\x4f\xcc\x8b\x26\x5e\xa7\xcf\x23\xf6\xb2\x8f\x18\xfb\xb1" - "\x62\x8c\xcf\x50\xfb\xf0\x5f\xcb\x8f\xe3\xeb\xb0\x73\xe3\x3d\xe2" - "\x24\x4d\x1c\xc9\x36\x00\xcb\x28\xfb\x9a\x1d\x89\x86\x88\xe7\xde" - "\x81\xe8\x69\x69\xbb\xe1\xbd\x53\x2f\x5b\x17\x57\x36\xa4\xcf\x8d" - "\x3b\xf8\xdd\x84\x28\x99\x8f\x84\x43\x04\x38\x59\xca\xde\x9b\x38" - "\xf2\x08\xe4\x15\x65\x9a\x8d\x32\x3c\x8f\x96\x7b\xbc\x25\x64\x1e" - "\x5f\x4a\x66\xff\xc6\x93\x12\xb6\xe1\xb7\x01\x5b\xba\x33\x50\xda" - "\x41\x81\x70\x1b\xaf\x75\x99\x95\x8f\xce\x44\x67\x7a\x84\x2c\x5d" - "\xd5\xf9\xe8\x93\x89\xce\x58\x75\x7e\x25\x70\xdb\x13\xa4\xaf\x4d" - "\x63\x7d\x13\x4f\xbb\xe9\xd3\xe7\x3d\x34\x77\xf6\xb8\xef\x3c\x34" - "\x73\xc1\xf4\xbb\x9c\x0b\x56\x3e\xb5\x7c\xd9\xb8\xd5\xcf\x94\x38" - "\xd7\xaf\x59\x59\xb2\x72\xd5\x77\x9d\xd9\xee\xd1\x6e\xe7\xd2\x12" - "\x75\x75\x15\x2d\x5d\x5b\x32\x99\x6f\xc7\x3a\x8b\xd7\x2c\x5f\x27" - "\x6f\x6f\x19\x4c\x89\x40\x56\x96\x2c\x5f\xe3\x1c\xbd\x6c\xac\xf3" - "\xbe\xa5\x2b\x8b\x9e\x59\xb3\x3c\x25\xac\xbb\x9c\x6b\x96\xaf\x59" - "\xbe\x74\x99\x73\xb2\x33\x9b\x21\xc7\x83\x8b\xeb\xcf\x6c\x63\x1c" - "\xe3\xf1\xab\xca\x2b\x8e\xe9\xe3\x59\x50\xf1\xcf\xc4\xf0\xe5\x63" - "\xd9\x1d\x96\x44\x9e\xbb\xc3\x91\xc8\x73\x77\xb8\x2e\x1f\xcb\xee" - "\x48\x1a\xff\xee\x48\x1a\xff\xee\xc8\xbf\x7c\x2c\xbb\x23\x69\xfc" - "\xbb\x23\x69\xfc\xbb\xa3\x77\xfc\x03\x2f\x49\x3f\x3a\xa4\x25\x8d" - "\x7f\x77\x24\x8d\x7f\x77\x34\x25\x3d\x1f\x8f\x7b\x1e\x86\xe7\xf6" - "\xf8\xf1\x11\xcf\x61\x43\x3e\xfb\xf4\xcb\xd7\x2d\x46\x1e\xd6\xf5" - "\xd0\xcd\xed\x2a\xef\xd7\x9d\x71\x79\x3b\xf4\xbc\x13\x7b\xe5\x8f" - "\xf7\xb5\x91\xae\xe6\xeb\x5f\x7f\x95\x75\x3a\xfb\xe3\xf1\xd8\x04" - "\xf9\xf8\xf2\x59\xfa\xba\x9d\x61\x31\x0f\xb3\x7f\xa6\x78\x65\x61" - "\x77\x63\x26\x59\xb8\x4c\x63\x0d\xfb\xf5\x4e\x1c\xcb\xbe\xba\x48" - "\x63\xdf\x65\xe8\x94\xaf\xc3\xfe\xcd\xa8\x57\xe3\xc5\xd7\x83\xd2" - "\xe6\x47\x19\x1d\xbe\x9c\xd7\x00\x0e\xfb\x02\x5b\xaa\xd4\x58\xdc" - "\x8e\xfb\x0c\xe6\x69\x94\x37\x0b\xd3\xc4\xa7\xd9\x07\x1a\x69\x36" - "\xfc\xb2\x00\x2f\x68\xc0\xdb\x3a\x3c\xb5\x6d\x99\x6c\xe7\xf6\xce" - "\x07\x4d\x64\xad\xf2\x6a\x6d\x01\x8d\x6d\xeb\x6f\x64\xa9\xb5\x05" - "\xa7\x53\x78\xdf\xcf\x6b\x44\x7a\xea\x79\xd2\x37\x60\xff\x7d\xc3" - "\xa2\xd6\x5b\xbe\x81\xfe\x9f\x3d\x51\xad\x9d\x3a\x9d\xd0\xb7\x97" - "\x00\xe7\x02\xae\x3d\xb8\xfe\xa7\x01\xdf\x2f\xe7\xdb\xdf\x28\x11" - "\xde\xb4\xf9\x0c\x37\x29\x7d\x1b\xf4\xdb\x25\x6b\xb4\x3c\x2f\xc5" - "\x3b\xcc\xb3\xd3\x1f\x4a\x91\xee\x87\xcd\x70\x09\x78\x84\x19\xdf" - "\xb8\xf4\x36\xe1\x1d\xba\x80\xf3\x07\xb9\x3e\x94\xe9\xcf\xd6\x36" - "\xfc\x6f\x95\x0f\x7f\xce\xa8\xa4\x76\x7c\x7a\x8a\x72\x5e\x53\xed" - "\xc8\x89\x25\xd6\x9d\x33\x29\x75\x3b\x72\x16\xa0\x1d\x9f\xa6\x6e" - "\x47\x4e\xb1\xa4\xad\x09\x6d\x31\x5d\xf6\x6e\x1b\xda\xf2\xa9\xa4" - "\x7b\x62\xfa\x5e\xdd\x16\x0a\x63\x1e\x66\xc3\x3b\x59\x76\x7e\x69" - "\x5f\xbf\xe9\xf9\x9a\xad\x75\x34\x2f\x45\x9d\xed\xc2\x3b\x68\x7e" - "\x90\xee\x94\xe7\x1a\xe2\xd2\xa3\x0a\x17\xd0\xc9\xc4\x74\x42\x7b" - "\x50\xae\xbf\xfe\x36\xe6\x25\x6a\x2d\xe4\x4e\xc8\x7f\x0e\x19\x6b" - "\x99\x6b\x4b\x45\xc8\xa0\x23\xde\x15\x26\xbd\x8b\xc4\xbd\xdb\x9a" - "\xf0\x6e\x73\x6f\x7a\xbd\x91\xfe\xf9\xfa\xe9\xce\xe6\xa4\x7e\x42" - "\xff\xdc\xb5\x28\xb1\xdd\x77\x9e\x50\xed\x43\x1f\x5d\x46\xeb\x3b" - "\x23\xe8\xa3\x9e\xd4\x7d\x74\x57\x56\x6a\x5e\xbb\x4b\xae\xa3\x89" - "\x4c\x4a\x01\xef\xae\x19\xe8\xbb\x1e\xc9\x83\x7a\x3f\x5d\xde\x3f" - "\x77\x15\x19\xfd\xf3\xf9\xda\x78\xd7\x81\xa4\x36\xc6\x4e\xd1\x37" - "\xc7\xa9\xb6\x7e\x73\x73\x12\xec\xa3\xa9\x79\xf1\xae\x20\xda\x19" - "\xeb\xa7\x9d\xd1\xfe\x79\xf1\x9b\x0e\xb4\x27\x76\x39\x2f\x7e\x33" - "\x5b\x95\xa1\x54\x65\x66\x09\x6f\xaa\x7a\xbe\xb9\xcc\x13\x65\x3b" - "\xf7\x9b\xf5\xbc\xbe\x14\x97\x5e\x9a\xc8\x7f\x68\x03\x97\x63\xfa" - "\x45\x95\x9e\xe5\x7e\x38\xe5\x24\xd3\x67\xf1\x64\xb7\xf7\x9b\x27" - "\x92\x68\x75\xee\x14\x4d\x5a\xd4\x65\x4a\xdb\xab\xe8\x35\x79\x64" - "\x12\x4e\x91\xd4\xf4\x9a\x64\x03\xbd\xce\xa5\xa6\xd7\xa4\xb1\xfd" - "\xd3\x6b\x12\xf7\xff\xb9\xcb\xe9\x35\x69\x49\x3c\xbd\x60\xeb\xca" - "\xf6\x7d\xc5\x01\xde\xe8\x29\x10\x8d\xdc\xd6\x18\xd9\xac\xe0\x15" - "\x55\xa6\x93\xcb\xd4\x5a\x23\x8a\x4f\x60\x43\x5a\xce\xd2\xa4\x52" - "\x43\xfe\x87\xd6\xd1\x20\xd1\xb3\x90\xfd\x88\xd2\xb8\x5c\xc0\x7d" - "\xce\x1f\x88\x66\x13\xcf\x3f\x92\xea\x6d\x4b\xad\x0b\x26\x85\x40" - "\xd3\x9a\xcb\xd3\x27\x5b\x94\x1f\xd9\xe4\xdc\x44\x1d\x31\xd9\x99" - "\xd8\x47\xa0\x1b\xca\xe9\xdb\x4e\x9f\xf9\xbb\x72\x9f\x4d\xf6\x5d" - "\xde\x67\x77\xdf\xa6\xfa\xeb\x6e\x7b\x12\x7e\xfb\x52\xf7\xd7\x64" - "\x7f\xff\xfd\x35\xf9\x44\xff\xfd\x35\x99\xd7\x4f\xcf\x05\xe9\xee" - "\xec\xc4\x71\xe3\x6e\x5b\x62\x7b\x51\x2f\xca\x09\xd3\xc0\x61\xfc" - "\xfc\x79\xdb\x6d\xfc\x58\xc7\x71\x5f\xf1\xb9\x22\xe0\x3f\x92\x71" - "\xbc\x5a\x18\xfd\xc2\x06\x0d\x7d\x1b\x53\xef\xb7\xf2\x1c\xb7\xb5" - "\x8e\x88\xf7\x91\x9d\x5f\x62\xdb\xfd\x9e\x01\x9a\x89\xda\x70\x6f" - "\x3a\x45\xb9\x7f\xd0\x4c\xa6\x52\xde\xf3\x94\x7e\xeb\x72\x0d\xe1" - "\x9e\x11\xf1\x7d\xc1\x7b\x9f\x3c\x37\xdd\xa1\xe6\x4e\x7f\x45\xf9" - "\x37\x54\xbf\xe4\xbe\x95\x48\xc7\x7b\x72\x53\xf7\xcb\x3d\x79\xe8" - "\x97\xbf\xa6\xee\x97\x7b\x4a\xfa\xef\x97\x7b\x7c\xe8\x97\xbf\x5e" - "\x2e\x47\xf7\xec\xd3\xe5\xa8\x82\xcb\x38\x57\xf1\x7c\x3c\xf7\x0b" - "\x9c\x07\xf7\x90\x91\x5c\x49\x93\x71\x9d\x86\x1c\xc9\x32\x27\x00" - "\x4b\xd6\xaf\xf2\xdc\xd3\xa6\xc3\x88\x83\x9b\x4b\xd6\xce\x54\x72" - "\x92\xeb\xe0\xbc\xe3\x8b\xc9\x02\x1a\xe6\xed\x66\x18\x6b\x88\x50" - "\xcf\x53\x9c\x8f\xd3\xc7\x87\xe3\xe5\x24\x77\x86\x91\x8f\x75\x9d" - "\x9e\x37\x57\x74\x17\x12\xe7\x4b\x82\xad\xb7\x7f\x90\x1c\x47\x38" - "\x3f\xe7\x4b\xca\x53\xa7\xe4\x31\xf7\x44\xa2\x3c\xe6\x1e\x48\xe4" - "\x4f\xd0\x1f\xe5\x34\xe8\x39\xdc\x9b\x81\xc3\xe7\xe6\xaf\x2b\xcb" - "\xe6\x94\xb1\x49\xb2\x09\x1e\x98\xd2\xa2\x78\x60\xca\x4f\x13\x71" - "\x9d\x32\x2d\x35\x0f\x4c\xc9\xef\x9f\x07\xa6\xb8\xfb\xe7\x81\x29" - "\xb5\xcc\x03\x41\x9a\xd2\x9c\x28\x9b\x53\xf6\x27\xb6\x1d\xf5\x4a" - "\xd9\x24\xfb\xd5\xc8\x26\x6c\xa1\x61\xfd\xc9\x21\xcb\x14\xfb\x8f" - "\x34\x5e\x32\xf6\x3a\x3e\x17\xcd\x2c\x90\x2b\xe0\x77\xef\x12\x5e" - "\x53\x82\x8e\xcf\x61\x1a\x36\xc8\xf3\x98\xf7\x96\xc4\xd3\x71\x87" - "\x3a\x03\xe9\x41\xde\x4f\x79\x5f\x59\xd1\x73\xea\x07\x89\xed\xbf" - "\xb7\x36\x35\x3d\xef\xdd\x0f\x7a\x7a\x52\xd3\xf3\xde\xa3\xfd\xd3" - "\xf3\xde\x76\x3e\x23\x75\xb9\x4c\xdd\x1b\x75\xae\x93\x36\x8a\x2c" - "\x73\x96\xa6\x3e\xfc\xf9\xc6\xa7\xa9\x13\x13\xc7\xa7\xa9\x23\xae" - "\x7e\x7c\x9a\xea\x4e\x3d\x3e\x4d\xf5\xa5\x1e\x9f\xa6\xee\x53\xf2" - "\x30\x35\x98\x28\x0f\x53\xfd\x89\x3c\x01\xda\xfd\xaf\x8d\x4f\xd3" - "\xb2\x93\x64\xa0\xea\x14\x4d\x7b\x0b\x36\x45\xb9\xea\xb7\xe9\xcf" - "\x24\xe2\x38\x6d\x56\xea\x7e\x9b\xb6\x0c\xfd\x56\x95\xba\xdf\xa6" - "\x95\xf7\xdf\x6f\xd3\xea\xd1\x6f\x55\x97\xf7\xdb\xb4\x83\x57\x6f" - "\x53\x4c\xeb\x48\xec\xb3\x69\xc7\xae\xbe\xcf\xa6\x8f\x4d\xdd\x67" - "\xd3\xa7\xa5\xee\xb3\xe9\xba\x6f\xfa\xf4\xda\xc4\x3e\x9b\x5e\x92" - "\xd8\x67\xa0\xdb\xff\xb0\xcf\xd0\x3f\xa3\x94\x7f\xc2\xf4\x0b\x98" - "\xb7\x0f\xea\xf6\x4e\xef\x0c\xd2\x7d\x07\xd5\xdc\xfa\x3e\x35\x76" - "\xa8\x3e\x7c\x13\x79\x82\x97\x8f\x03\xf7\x59\xf4\xb4\xef\x5c\xde" - "\x0f\xf7\x8d\x82\x8e\xee\x6c\x2a\x95\x7b\x5b\xaa\x0f\x99\xe6\xc8" - "\xe7\xdf\xc8\xfb\x53\xf7\x4d\xe3\xb2\xe8\x63\x11\x88\x44\x89\xf5" - "\x3a\xf2\x87\x19\x0e\x9f\x0d\x4d\x82\x55\x7c\x35\x63\xfc\x15\x7c" - "\x6a\x46\xf9\xcb\x6e\x07\xbc\xfb\x9f\x55\xbc\x7a\x5f\xb2\xfd\xdb" - "\x88\x77\x8f\x28\x3e\x9d\x39\x3a\x09\x87\x70\x6a\x3e\xbd\x3f\x03" - "\x6d\x68\x4c\xcd\xa7\xf7\xbb\xfa\xe7\xd3\xfb\xd1\xff\xd4\x18\x37" - "\xf7\xc9\x5c\x1c\x0d\x26\xcd\x7d\xee\x2f\xb4\x86\x15\xef\x48\x9b" - "\xa8\xda\x39\xaa\xdb\x7b\x7f\xb2\xfd\x87\xbe\x99\x31\x44\xc7\x79" - "\x40\x52\xf9\x7e\xec\xbf\xfb\xd9\xfe\x7b\xb3\x1f\x9c\xaf\x60\xff" - "\xdd\xcf\xf6\xdf\x9b\x97\xcb\xd6\x0c\xdd\xfe\x4b\x35\xc7\x9b\x31" - "\x36\x75\xff\xcf\x48\xea\x7f\xca\x2b\xc1\x7c\x58\x96\x4f\xcc\x57" - "\x14\x9f\x8f\x7d\x93\x38\x2f\xf3\x48\x8a\xbc\x75\xc9\x30\xfb\xc9" - "\xe7\xbf\x8c\xf7\xd8\x97\x2a\x25\xef\xcd\xd0\xcf\x94\xcc\x9c\x96" - "\x28\x8f\x33\xcd\x89\xf2\x78\xff\xbe\xc4\x72\x33\x47\x25\xbe\xbf" - "\x2f\xfc\xbf\xa7\x63\x67\xd6\x26\xf1\xc0\xfb\xa7\xe8\x01\xbb\xe2" - "\x81\x07\x56\x26\xe1\xb1\x3f\x35\x0f\xcc\x6c\x42\xfb\xdf\x4f\xcd" - "\x03\x33\x83\xfd\xf3\xc0\xcc\x28\x68\xf9\x7e\x3c\xdf\xce\x2f\xcd" - "\x1d\x94\x98\xe7\x01\x67\x6a\x9d\xf7\x40\x4e\xea\x35\x82\x07\xe6" - "\x29\x1a\x3f\x50\x99\x48\xe3\x07\x0a\x13\x69\x88\xb6\xfc\xcf\x69" - "\xd8\x1b\x0f\xa2\xdb\xfb\x40\xb2\xfc\x07\x4e\xd1\xb7\x74\xf9\x9f" - "\xf5\x60\x12\x8e\x61\x85\x4b\xaa\x75\x91\x6f\xf1\xfc\x37\x90\x9a" - "\x96\xdf\x1a\x9b\xba\xcd\xdf\x9a\x86\x31\x28\xa0\x5d\x26\x4b\xdf" - "\xca\x47\xfa\x7c\x5e\x0f\xe5\xf5\x90\x06\xa4\xcf\x8f\x92\x45\x8e" - "\x57\xbd\xe3\xd2\xb7\xca\xd9\x17\x85\xe9\xcf\xfc\x6b\x1d\x41\xf3" - "\x78\x0c\x62\xbc\x0a\x4a\xa5\xdf\x82\x75\x2b\xf3\xfa\x4d\xcc\xeb" - "\xdf\x92\xf6\x1f\xef\xb3\xb0\x1f\xa1\xd5\x4d\xf3\x38\x2e\x85\xc1" - "\xef\x9c\x3f\x09\xf6\x09\x96\x0b\xce\x6f\xe4\x55\xeb\x66\xe5\x49" - "\xba\x69\x96\x39\x75\x1f\xcf\x1a\xd1\x3f\xef\xcc\xca\x51\xfd\x3c" - "\xab\x28\xb1\x9f\x67\xcd\xd3\xbc\x43\x17\x70\x5b\xc1\x03\x57\x25" - "\x27\x25\x4e\xd1\x9f\x6f\x85\x59\x54\x2c\x64\xdf\xe0\x2f\x9d\xa6" - "\x59\xc7\x65\x7d\x26\x11\xb1\x6e\x49\xa3\x26\xa9\x03\x66\xdf\x22" - "\xf1\x44\x9e\x82\x28\x99\x44\xc5\x93\x6d\xfc\xae\xd1\x2b\x22\xc8" - "\x77\x8c\xf7\x04\xf8\x6c\x35\x78\x61\xd8\x49\x9a\x75\x26\xa1\x3c" - "\x24\x3f\xa0\x60\xb8\x1a\xa5\x3c\xce\x1e\x65\xac\xe9\x6e\xc5\x73" - "\xea\x75\xdf\xd9\x33\x0c\xdf\x07\xe5\x33\x36\xbb\xdf\xfd\x4b\xc6" - "\x89\xcf\xca\x30\x4e\x57\xd6\x03\xb3\xeb\x0d\xfe\x55\xbe\x96\xb3" - "\xf7\xf7\xf9\xf2\xcd\x3e\x84\x77\x4b\xae\xb0\x36\x18\x27\x07\xb3" - "\xdb\xe3\xe1\xa8\x98\x28\xb3\x23\x86\x3f\x5e\xb7\x77\x8e\xf9\x33" - "\x60\xe9\xf8\xcc\x19\x9b\x88\xcf\x9c\x49\xb0\x53\xb2\x74\x18\x33" - "\xae\x04\x83\xfb\x5c\xf1\x2c\xf3\xc3\x9c\x25\x57\x5a\xf3\x4b\x77" - "\xd0\xbc\x17\x2f\xe3\xad\x39\xd2\x5e\x62\x18\x9f\x81\xe3\xb1\x84" - "\xb9\x85\xdc\xbb\xe7\xbd\xad\xb9\xbb\x95\xdc\xcf\x4d\x5a\x23\x9c" - "\xd3\x29\xfd\xa9\x74\xb9\x5f\x1c\x4d\x96\x83\xb9\x19\xc6\x18\x9d" - "\x94\x3e\xca\x90\x7b\xcc\x6b\x19\x6e\xd2\x3a\xeb\xdc\x69\x4a\x16" - "\xe6\xd6\x6b\xf6\xf8\xf9\xda\x5c\x69\xff\x19\xeb\xa5\x78\x3f\x2d" - "\xa9\x5c\xd2\xfa\xdf\x9c\x4e\xd1\xff\x3a\x7d\x06\xfa\x37\xcc\x7b" - "\x5b\x2a\x56\xc3\xdc\xe6\xa4\xf5\x8a\xd0\x0e\x79\xfe\xfe\xcf\x80" - "\x3b\x4f\xd7\x7b\x0f\x4e\x49\xaa\xaf\xd3\x73\xe6\x4a\xed\x9f\xd7" - "\x4f\xfb\xe7\xf5\xb5\x7f\x95\x84\x9b\xb4\x96\x38\x4f\xb6\x3f\x76" - "\x99\xfe\x9b\xc7\x3e\xa4\x06\xdd\x60\x73\xcf\x7b\xdb\xb0\xd5\x79" - "\xfd\xa0\x7f\x5b\x7d\x5e\xdf\xfa\x9f\x2a\xd7\xb7\xfe\x17\x4a\x65" - "\xab\x07\x49\xee\xad\x26\xd6\xdd\x66\xad\x4f\xd9\x96\x7e\xd6\xff" - "\x1e\xd4\xd7\xff\x1e\x5c\x92\xa8\xcf\x1e\x74\x26\xf6\xe1\xbc\xa4" - "\x3e\x7c\x30\x37\xb1\x0f\xe7\x76\xfe\x77\xc7\x35\x3c\x53\x7a\x7a" - "\xba\x29\x3d\xcd\x94\x96\x8e\xd7\x68\x22\x0d\x4a\x37\xa7\x0f\xc0" - "\x6f\xa0\x7e\x1d\x64\x4a\x37\x99\xf1\x1b\xa0\x5f\x07\x26\x3d\x0f" - "\xe2\xb2\xf8\x99\xf5\xeb\x80\xa4\xe7\x81\x9f\xf1\x7e\x90\x5e\xaf" - "\x51\xbf\x39\xe9\x79\xc0\x67\xbc\x1f\xf8\x3f\x2c\x4f\x97\x3d\x27" - "\xfa\xa1\xcd\x5c\xb5\x6e\x69\xd1\xca\x65\x72\xbf\x78\xb9\x73\xe9" - "\xe3\x8f\x2f\x5f\xbb\xd6\x59\xb2\xda\x79\xef\x94\x87\x6e\xbf\xcb" - "\xa9\xb6\x9d\x8b\x26\x8f\x5e\x36\x98\x66\xaf\x5f\xc3\x2f\x66\xcf" - "\x9f\x99\xe7\x9c\x77\xef\x94\xc4\x97\x06\x18\xb9\xbd\x7c\x25\x28" - "\x71\xf2\x97\xfb\xfc\x70\xa2\x6d\x2f\x4b\xdd\xd3\xce\x7e\xbe\x6a" - "\xcd\xe3\x3b\x1f\x34\xb3\xff\xe8\x25\x8f\xf0\xdf\xc4\x7b\xfa\xf3" - "\x97\x73\x23\xc6\xed\x29\xa7\xe2\xc7\xf8\xfc\xca\xfc\x2d\xe2\xd7" - "\x21\x72\x3e\x40\xa6\x93\x94\xff\x87\xa6\x19\xc8\x8b\xe7\x40\x30" - "\x4a\x4e\x0f\x59\x50\xfe\x69\xbc\x4b\x13\x77\x6b\x48\x0b\xeb\xbe" - "\xd0\xdf\xde\x22\xd3\x7e\x5d\x6e\xe4\xb3\x9e\xa2\x05\xa3\xc5\xaf" - "\x85\x7c\xe6\xf3\x41\x2a\xdf\xfc\x4f\x85\xe9\xa1\x43\xac\x1b\xea" - "\x33\xc9\xcc\x7b\xa1\xaf\x66\x92\xe5\xd5\xe1\x1c\xb3\x64\x7e\xa7" - "\xb1\x17\xfa\x3c\x9e\x83\x94\x7f\x8c\xeb\xe6\xbc\x9a\xe9\xa1\x93" - "\x9c\xbf\x21\x21\xff\x82\x11\x7d\x7b\xb1\xf3\x3b\x4d\xc8\x37\xf7" - "\x63\xb2\x5a\x63\xe2\x9f\x91\x4c\x07\x8d\x9f\x41\x69\x01\x74\x45" - "\x73\xb4\x9c\x94\xcf\xcf\x82\xe5\x1b\x62\x22\xca\xfe\xe9\xb3\x3b" - "\x3d\xa2\xea\x29\x32\x43\xa6\xd3\xfc\x6b\xd8\x47\x61\xc1\xac\xc6" - "\xe5\x64\x46\xfb\x47\x9c\xa6\x87\x4b\x9d\x73\x88\x3c\xb3\xc9\xfc" - "\x3b\x37\xfb\x1b\x3a\x1b\x76\xfc\x91\xcc\x3f\xb9\x54\x6e\xba\x24" - "\x1c\x54\x5a\x22\x3a\x04\xc7\x31\x0a\x8b\x08\xfb\xf8\x37\x2f\x89" - "\x71\x9e\x1d\xdd\x1e\x07\xb5\x96\x84\x69\xf3\x09\x11\xa9\xfc\xa3" - "\x3a\x1b\xd0\xd2\x19\x66\xff\x45\xcb\xe6\xd9\x94\x7e\x2a\x8f\x4c" - "\x2d\x85\x75\x14\xc8\x0f\x53\xe9\x09\xd1\xd1\xbc\xe4\x13\x6a\x2d" - "\x3c\x40\x05\x6d\x64\x6a\x6e\xff\x88\x64\x2c\x9e\x9a\xca\x79\x65" - "\x17\xc8\xb1\x79\x25\xa7\x5d\xa0\x8d\x9b\x69\xc8\xc6\x3f\x91\x35" - "\xd0\xd1\x86\x7a\xce\xd0\xa3\xc7\x29\x0d\xf0\x4c\x9b\x3e\x22\xc7" - "\xa6\x47\xd8\xcf\x37\x97\xea\xcb\xc8\x21\x3c\xae\x8c\x4b\x1e\x97" - "\xed\x92\x70\x65\x76\x7b\x5c\x59\xad\xc5\xc8\xdf\xfe\x1e\x0d\x6d" - "\xa3\xac\x5f\x9f\x6e\x33\xd5\x9d\xa7\x11\xdc\xa6\x53\x68\x5b\xfd" - "\x79\xe4\xaf\x59\x74\x4c\x43\xd9\xf8\x32\x51\xfb\xa2\x8e\x40\x5e" - "\x84\x34\xc0\xaa\xbb\x44\x23\xea\x2f\x91\x43\xab\x5e\x74\x8c\xcb" - "\x75\xd2\xb7\x37\x04\x9a\x89\x4a\x37\x8b\x58\x4f\x8d\x93\xd7\xcb" - "\x06\xbd\xf9\xd8\x21\x73\xa0\xb9\x93\x5a\xc2\x97\xa8\x95\xfe\x4c" - "\x01\xf7\xdf\xfd\x3f\x79\xec\x10\xaf\x59\xa7\xf9\x37\xb6\xa3\x2e" - "\xc5\x3b\x9e\x16\x3e\xab\x5c\x4e\x55\x65\x94\x51\xbc\x91\x06\x9d" - "\x46\xba\x9a\xdb\x0f\xb3\x04\xa2\x7f\xf7\x6f\x94\xfe\xb8\xf9\xc7" - "\xca\x5a\x28\xbd\x35\x5c\xc7\x7e\x9f\xa6\x58\x66\x25\x6c\xbf\x63" - "\x14\x28\xfe\xab\x5f\xb3\x55\xe6\x6c\xd3\xc8\xf2\xd3\x8b\xc7\x4c" - "\x01\xf3\x45\x0a\xe4\x85\xe9\x7d\xd4\x2d\x6a\x2a\xf3\xa1\xb7\x72" - "\x5b\xc3\x11\x3e\xef\x94\x2d\xba\x1c\x83\xab\xd6\xd0\xd8\x86\xf3" - "\x34\x6a\xf7\x79\x72\x89\x6e\x97\x89\x7d\x6c\xf9\x6c\xea\x6e\x5c" - "\x33\xda\xc9\x82\xb6\x2b\x3f\x5a\xbb\xee\x6b\xdb\xe3\xa2\xc6\x4b" - "\x7d\xbe\xb6\x97\xba\xfa\x7c\x6d\xc1\x53\x21\xf6\xb7\x0d\xd2\xc3" - "\x5b\xad\xcd\x34\x08\x72\xb2\x8f\xf9\xbb\xea\x2c\x99\x2b\xce\x12" - "\x8d\x2f\x37\x91\x73\x05\x9f\xb3\xf8\xce\xf2\x00\xfa\x86\xef\x4f" - "\xd2\x77\x46\xe0\x9a\x81\x5f\x1a\xd2\x65\xfc\x86\x76\x9d\x8f\x91" - "\x66\x42\xda\x00\x5c\xd3\x21\x2f\x31\x4f\xbd\x08\xa1\xae\xbc\x2e" - "\x13\x0d\x66\x7e\xd6\xfd\x7b\xf3\xba\xbd\xdf\x0e\x07\xe9\xa9\x4e" - "\x83\xaf\x95\x8e\x9f\x1f\x7a\xff\xe4\x19\x8e\x97\x15\x92\x78\xf5" - "\x14\xa6\x71\xec\x2c\x3d\x9d\x71\x58\xc4\xf5\xa2\xfe\x5c\x5c\xad" - "\xf8\x41\x4e\xbf\x7d\xdc\x28\xdb\xd5\x53\x88\x3a\xbf\xf3\x30\xd2" - "\x85\x91\x8e\x76\x9b\xf9\xdd\x2f\x4e\x9e\x31\xa9\x3c\x2e\x13\x60" - "\x46\x74\xf8\x90\xfd\xf9\xb5\x2c\xe3\x5d\x26\xab\x38\xb2\x64\x22" - "\xd5\xbf\x2c\x9a\x77\xbf\x2c\x9a\x94\xec\x7d\xa7\x2e\x48\xab\x7d" - "\x8c\x23\xc6\xf1\xa6\x6d\x78\x77\x04\xa3\x0e\xd3\xa5\x69\x19\xfb" - "\x93\x7d\x07\xf6\xdf\xb5\x87\xe3\xdb\x20\xbc\x0f\xd6\xf1\x58\xfa" - "\xb3\xb2\xa3\x03\xa0\x03\xea\x5a\xdb\x3b\xe9\x27\x97\x3a\x06\x78" - "\x7e\x4b\xa6\x40\xf4\x24\x4d\xc8\x22\x07\xdb\x83\x8d\x2f\x8b\xe0" - "\x8b\x1c\x9f\xef\x65\xd1\x09\x7e\xb9\xf1\x34\xe5\x0d\xf8\x6a\x16" - "\x65\xfd\xde\x4d\xba\x7e\xca\xbb\x31\x4e\x3f\xbd\xd1\x12\x3c\x14" - "\xa7\x9b\xf2\x1f\xbe\x5c\x37\x2d\x7c\x50\xe9\x26\xc8\xbe\xd4\x45" - "\xb1\xa0\x9e\x3e\x39\x29\x5d\xf7\x13\x59\x38\x32\x29\x3d\xa2\xa7" - "\x0f\x49\x4a\x0f\xa9\xf4\x47\x67\x1b\xba\xaf\x95\xf1\x58\xcf\xba" - "\xef\xd1\xdb\x58\xf7\xb5\x2e\xd1\x75\x9f\xd4\x3f\x8f\x5e\x27\xfe" - "\x0d\xba\x68\x1d\xeb\x9b\x47\xce\x30\xfe\xe2\xd7\x64\xe0\x7e\x0d" - "\xd2\x7e\xca\x69\xbe\x3f\x93\x19\x3f\x43\xef\x09\xd6\x7b\xac\xf3" - "\x58\xf7\xed\x1a\x2e\xda\x76\xbd\x2c\x8e\xd7\xcb\xd8\x3f\x8f\xf4" - "\xea\xbf\x17\x90\xb6\x0d\x69\x2f\xe0\x3d\xeb\x41\xa6\x49\x4b\xde" - "\x21\x62\xff\x13\xd8\x5a\xf5\x9a\x29\x9b\x76\xa0\xbf\xf9\xbc\xe1" - "\x56\xd0\xd7\x9a\x46\xc5\x81\x12\x3e\xc3\x1a\x63\x9f\xb4\xf6\xd6" - "\x92\x76\x96\xbb\xe1\x15\x90\xb3\x80\xfb\x13\x2a\x0b\x8b\xd3\x7c" - "\xee\x8e\x71\x28\xd8\xf0\x00\xc7\x4b\x4a\x6b\xc2\x6c\x98\xfd\xc2" - "\x59\x67\x03\x17\xb3\x0f\x38\xa9\xf8\x2c\x8f\xec\x0d\xd2\xde\x72" - "\xd5\xd7\xf9\xc7\x38\x2e\xdb\x49\xca\xeb\xc0\x7c\x2f\xc2\x6d\xb3" - "\xc6\xca\x89\xcf\xc1\x70\xac\x42\xbe\xee\x32\x69\x85\x3e\xe3\x2c" - "\x8c\x17\xba\x01\x79\x02\x6d\x11\x62\x9c\x83\xf4\xc8\xc4\x96\xd2" - "\x43\x5c\xbe\x8d\x69\x23\xbc\x1e\x03\x46\x9a\x84\x61\x92\xf3\xc6" - "\x42\xe4\x53\x6b\xe7\x99\x4e\x6a\xc9\x0f\x11\xeb\xfd\x40\x07\x60" - "\x94\x9e\x54\x30\x00\x4b\x60\x0c\x48\x78\xa7\xc3\x1f\xb2\x59\xfc" - "\x13\xf0\xf7\x72\x7f\xf1\xb9\x48\xde\x6f\x03\x5d\x32\xd8\x57\x5e" - "\xd9\xa2\x8f\x8c\x6b\xfc\x33\x91\x7e\xb6\x13\xfc\xf6\xc8\x58\x3e" - "\xb7\xc4\xe7\x39\xaf\x74\x96\x13\x34\x1a\x65\x9c\xe7\xd4\xd6\xff" - "\xef\x9e\xe5\x04\x6c\x47\x83\x49\x1c\x00\xfe\x63\xf9\x3c\x27\xf0" - "\xdf\xc6\x7c\xa8\xb7\x29\xfb\xa5\x47\x25\xcd\x4b\x38\x0d\x73\xc7" - "\xa3\x46\xff\x73\x7b\xb9\x2d\x78\x97\xa7\x6c\x44\x81\xf9\xc7\xc2" - "\x6c\x7e\x8f\xb4\x69\x9c\x7f\x02\xf4\x58\x00\x63\xd8\x9b\x27\x63" - "\xa6\xaa\x8d\x64\x56\x3a\x2d\x7f\x26\x97\x57\x3a\x2d\x9f\xfa\x74" - "\xda\xc2\x0b\x4a\xa7\x29\x1a\x2b\x9d\xb6\xf0\x1f\x4a\xa7\x2d\xfc" - "\x58\xee\x8b\x41\xa7\xf1\x3b\xd6\x6b\x86\x4e\xdb\x3d\x5c\x1c\x65" - "\xdd\xd1\xed\x5d\x78\xcc\xd0\x6d\xdb\x91\xc6\xba\x83\x71\x54\x7a" - "\xea\x51\x97\xf8\x7f\x5d\xa4\xfc\x0e\xf8\xbe\x90\xcf\x2f\x74\xe8" - "\xf7\x3c\x9e\x4c\x51\x3a\x2e\x7f\x54\x9f\x8e\x5b\xb8\xaf\xaf\x2c" - "\xeb\xb8\xfc\x3b\x95\x8e\x53\xe9\x8d\x8f\xb2\x8e\x7b\xd4\xc5\x34" - "\xd0\xe1\x9b\x78\x0d\x4f\xcf\xcf\x74\xcc\x8e\xd7\x71\x89\xf2\x95" - "\x5f\x6a\xe8\x38\xd6\x6d\x78\xde\x06\x9d\x26\xe7\x90\x2c\x67\xb5" - "\xa0\xb9\x21\x77\xdc\x07\xdc\x66\x8e\xbf\xc6\x74\x9b\x7a\x86\x06" - "\xe9\x67\x87\xf4\x76\xe7\x1f\x35\x7c\x1f\x41\xff\x63\xa9\xec\xe8" - "\xbe\x18\x89\xf4\x65\x3e\x3b\x1f\x28\x3f\x49\x81\x3a\x51\xde\x1a" - "\x3d\x41\x05\x25\xd0\x15\xe9\x4f\x7e\xcc\x7d\x8b\x79\xc7\x37\xf9" - "\xca\xba\xe7\x34\x2d\x1a\x52\x10\xa6\x81\x98\xab\x7f\x5c\x65\xc2" - "\x3b\x77\xc2\x3b\xb9\xc6\x30\x7e\x0d\xc7\xd7\x83\x20\xf4\x33\xdf" - "\xbf\xca\xfa\x36\x5f\xa1\xbe\x57\x65\x7d\xb0\xa9\x30\x07\xb2\x9f" - "\xa5\x45\x72\x5e\x22\xe3\xdb\x54\xa4\x84\xf5\x5b\xfd\xfd\x80\x7e" - "\xde\xff\xe3\xca\xe5\x17\x5f\x73\xe5\xf2\x8b\x6f\x61\x5d\x84\xf6" - "\x59\x63\xde\x44\x38\x43\xa3\x46\xbe\xd3\x9c\xef\x41\x7d\x2d\xe6" - "\x63\xcf\x48\x39\x47\x73\x18\x30\x99\xff\x76\x20\x9f\x8c\x19\x02" - "\x5d\x39\x6d\x03\x71\xbc\x96\xf8\xb2\xdb\xfb\x68\xbc\x38\xf7\x0a" - "\xeb\x7e\x19\x81\x3a\x92\x31\x63\x8f\xc0\x26\xe5\x98\x46\xb5\xbd" - "\xeb\x1f\x8b\xdb\xa1\x37\x83\x71\x7e\xb1\x3c\x1f\xfb\x32\xc7\x35" - "\x60\xfb\xb2\x4a\xcd\x37\xaf\x87\x7e\xce\xe4\xf3\x30\x7c\x36\xa6" - "\x20\x36\xcf\x74\x44\xc6\x32\x2b\x70\x1a\x65\xfb\x5b\x67\xe1\x7a" - "\xf5\x3a\xd9\xc7\x34\x8c\x32\x0b\x8c\x32\x0c\x9b\xfd\x14\x31\x2e" - "\x7f\x59\x9e\x29\x8d\x76\xb2\x2e\xbc\x1e\xb6\x68\xa6\xaa\x67\x09" - "\xe9\xf5\x54\x06\x69\xd1\xbc\x2b\x9d\xcd\xe8\xbf\x7d\x05\x4d\x57" - "\xdf\x3e\xd2\xdb\xb7\x84\x3e\xa3\x7d\x57\xa8\x77\xc9\xa4\xab\xaf" - "\xd7\x66\xd4\xeb\xbe\x7a\xba\x2e\xd9\xff\xf9\xe9\x9a\xad\xd3\x75" - "\x49\xf0\x33\xe8\x9a\xa2\x9e\xa5\x59\x9f\xbf\x1e\xa7\x5e\xcf\xd2" - "\x19\xa9\xea\x21\xf9\xd7\xef\xb9\x29\x8b\x11\x6b\xb3\x0b\xb2\xa3" - "\x62\xd5\x2d\xf5\xc5\xc7\x2f\xee\x92\x72\xb5\x74\x6f\x6f\xbc\x64" - "\xb5\x57\x0e\x5d\xbd\xf4\x83\x82\x3d\x3c\xbe\x0b\x2d\x48\x4b\x9b" - "\x38\x8e\xeb\xb4\xcd\xea\x4c\xb6\x5e\xa6\xed\x4a\x71\x93\x39\x46" - "\x17\xc7\xe4\x0b\x38\xd0\xf6\x3a\x8e\x5d\x92\x7f\x80\xfd\xef\x31" - "\xa7\x82\x8e\x7f\xec\x46\x8e\x39\x86\xfb\x41\xb8\x77\x29\x1d\xf0" - "\x98\x0b\xf5\xf4\x7f\x76\xb2\x26\xdf\xbf\xb7\x2c\x7b\x40\x7f\xfe" - "\xf5\x28\x0f\x9b\xe2\x69\xb9\x36\xa5\x65\xde\x6a\xc1\x5c\x42\x8f" - "\xf7\xb7\xec\x13\x19\x03\xce\x93\xc7\xe7\x49\x30\x2e\x2e\x1b\xa2" - "\x9f\x03\x00\x3d\xca\x41\xd7\xc7\xf6\x18\xf4\x30\xd2\x91\x76\xd0" - "\xa0\x07\xec\x9b\x8c\xc0\x9e\x28\x9f\xd3\x09\xab\x33\xd9\x8f\xfd" - "\xa7\xa8\xce\x3f\xa4\x60\x3f\xae\xf6\x68\xb8\xbe\x9e\x3c\xb3\x9c" - "\x37\x95\xf1\xbc\xe9\xf1\xc3\x21\x7b\xfe\x21\x03\x0f\xb1\xd6\x61" - "\xe2\xb3\xdf\x13\x30\x96\xee\x50\x31\xf7\xd2\xf8\x9c\x9c\x7c\xbf" - "\xd6\x65\x52\x34\x79\x7c\xb2\xe8\xe2\xd8\x31\x12\x76\x06\xf0\x6c" - "\x67\xb8\x41\x5c\x43\x9b\x5c\x1c\xf7\x42\x6f\xcf\xe3\xa3\xb5\x9a" - "\x5b\x2d\x5a\xb7\xc3\x64\xe0\xdb\x20\xcf\xb4\x3e\x8e\xf6\x2f\x51" - "\x71\x62\x25\x3e\x0e\x13\xfb\xf3\x6b\x99\xf9\x7e\xb1\xc9\x41\x07" - "\xd7\x74\xc8\x39\x11\xd7\x39\x01\xf5\x0b\x9e\x27\xc1\x36\x41\xb9" - "\x3d\xbd\x74\x03\x5c\xd1\x6d\xd0\xed\xf1\x59\x6a\x5c\x56\x6d\x0c" - "\x6f\x72\x98\x8e\x84\xe4\x79\x3b\x1a\xe5\xf4\x7c\xaa\x62\x61\x3f" - "\x7e\xc2\xa0\x5d\x2f\x4e\xc0\x87\xf3\x28\xff\xa6\xc7\xa3\x06\x4e" - "\x52\x76\x33\xf9\xfc\xee\x63\x21\x3e\x37\xa4\xe8\x7f\x24\xa3\xdb" - "\xbb\xcc\x79\x39\xfd\x97\x4d\x8c\xa3\x7f\x3a\xf3\x1e\xd3\x9f\xd7" - "\x3a\x40\x97\x45\xa0\xa5\x45\x9d\x77\x60\x7b\x66\xd9\x72\x3c\x67" - "\x30\x9e\x5a\xb5\x41\xf3\x3c\xb3\x5a\x27\x5b\x56\x17\xd7\x0f\x68" - "\xaf\x83\x6d\xb5\x34\xa3\xfd\x5c\x86\x69\xc0\x71\x25\xb9\x6e\xe0" - "\x73\x2d\xea\x3e\x90\xdc\xa6\x0a\x75\x96\x84\x94\x6f\xc9\xb2\x63" - "\x71\xb1\xc5\x43\x25\x4e\x11\x51\xe7\x92\x97\xb9\x0f\x96\x85\xcc" - "\xfd\xe9\x00\xe6\x41\x19\xa3\xd2\x24\xd7\x15\x60\x73\xad\xf8\x50" - "\x00\x37\xd5\xf7\x2b\x76\xab\xb4\xe5\xff\xc0\x15\x3c\xb6\x7c\x8a" - "\x40\xdd\x21\x8f\x8c\xb1\x82\xb6\xad\x08\x32\xcf\x19\x7c\xc6\xeb" - "\x90\xca\x67\x7c\xf9\x1b\xac\x53\x0c\x9a\x03\xff\xc1\xdd\xde\xe5" - "\xc5\x06\xfe\x46\x7e\xee\x3b\xce\xc3\x7b\x36\x4d\xce\x88\xd4\xb5" - "\xea\xcc\xd0\xf2\x7a\x43\x86\xb9\x0e\xee\x67\xd6\x35\x4c\x0f\x45" - "\x8b\xe5\x87\x13\x61\x39\x4c\x2a\x6e\x26\xf3\x3c\xe4\x71\x63\x64" - "\x00\xf2\x04\xfb\x60\x2c\xcf\x57\xef\x7a\xf1\x64\x3f\x7f\xe9\x8b" - "\xa7\xfa\x63\xc5\x4c\x6e\x57\x1f\xbe\x2c\x7f\x2b\x7a\xfb\x9f\xdf" - "\x85\x3d\x0e\x8e\xc1\x2b\x75\x4c\xc9\x48\xc6\x37\xc4\xb1\x6d\x25" - "\xaf\x03\xbe\x8f\x71\xe7\x3c\x46\x9f\xf5\xf1\xe2\x8a\xc2\x78\x38" - "\xc2\x23\x71\x95\x70\x94\xee\x08\xf1\xde\xb6\x53\xed\xb7\xac\xa8" - "\x8d\x6b\x77\x86\x81\x4f\x9f\x4e\x58\x71\x30\x99\x27\xb9\x6e\x8e" - "\xc5\xa7\xc3\x66\x5d\x62\x3b\x49\x2b\xf6\xe8\x78\x39\xb8\x1f\xfb" - "\x1b\xdf\x38\xce\x25\xc7\x3e\x7d\x51\xe9\x10\xf4\x73\xe1\xc8\x17" - "\xd5\x39\xa2\xb0\x8a\x7f\xfa\xdd\xd1\xc2\xf4\x1a\xd3\x8a\xd7\xd3" - "\x43\x32\x5e\x87\x3c\x63\xfe\x5d\xde\xe3\x17\x43\x8b\x5f\x93\xb1" - "\x6e\x75\xdf\xc0\x50\x53\x71\x54\xc6\xf2\xf3\x94\xf0\x99\xdb\x28" - "\xcf\xf5\xa4\xef\xdb\x91\x92\x28\xcd\x8f\xb0\x4c\x7c\xb7\x84\xcf" - "\xd2\xab\x38\xe2\xdf\x2d\x37\xce\xcf\x73\xec\x4c\x8e\xfb\x0a\x3d" - "\x94\xde\x17\xb7\xb5\x30\x8f\x6d\x2c\xbd\x7f\x69\x87\x49\x1c\x53" - "\xf2\xff\xdd\xdf\xf2\x79\x79\xb5\x8f\x75\x12\x3a\x21\xfd\xef\x27" - "\xe9\xbb\x1f\xab\x75\x1f\x43\x47\x15\x3e\xc2\x7b\x59\x41\x1d\x06" - "\xea\xea\x84\x7c\xcf\xbb\x5c\x97\x7c\xf7\xb7\xc6\xdc\x85\xcf\xdf" - "\xa9\x7d\xb1\x3e\x78\x41\xfa\xae\x9c\x0b\xf6\xf5\xc1\x6f\x00\xab" - "\x30\xe7\x72\xbd\x50\x38\xcb\x90\xbd\xe2\x9b\xf8\x0c\xf7\x77\x6d" - "\x5c\x7f\x7f\xe3\x85\xf0\x3c\xc2\xfd\x64\x39\xe5\x4c\xdd\x37\xa9" - "\xf7\xd9\x0a\x0f\x18\x6d\x30\x68\xa2\xda\xb0\xf2\x9a\xae\x4c\xe7" - "\xd8\xbe\xb6\xaf\x94\xb6\x6b\xdc\xfb\x29\x71\xb4\xe1\xe7\x5c\x35" - "\xae\xad\x04\x7d\x96\xe9\xb1\x6a\x55\x1a\x64\xe7\x57\x62\x53\x1e" - "\x29\x1c\x57\x92\x21\xeb\xc8\x3b\x36\x48\x17\x1c\x6a\xbf\x6b\x25" - "\xda\x5f\x58\xa9\xca\x15\x1e\x67\x5c\x52\xb6\x33\x11\xc7\x43\x6c" - "\x6b\xa8\x98\x0a\x2b\xdf\x65\x7c\x9d\x63\xb8\x8f\x57\x3e\x2b\x75" - "\x38\xc7\x57\xe8\x29\x1c\x10\xee\x71\x51\x57\x4f\x21\xf4\x82\xcb" - "\x84\x7a\xa0\xff\xbb\xc2\x7a\x9d\xfb\x0d\x5c\x19\x37\x19\x9f\x53" - "\xac\x4c\x4d\x5f\xae\x57\xc6\x7c\x2a\x1c\x84\x1f\x70\x28\x1c\xf8" - "\x79\xed\x12\xd8\xe9\x1d\xa1\xea\x31\x07\xb4\x75\xe2\x28\xc7\x17" - "\xc3\x5c\xa4\xa3\x0a\xfc\x3b\x74\x8b\x1f\xb6\xf9\x22\x53\xc1\x06" - "\xca\xc5\x9c\x99\xc4\x45\x91\xd3\xa0\xe1\xba\x4e\x4c\xe4\x38\xe3" - "\x78\xce\xd6\x9f\xc7\xf2\x73\xd7\x3a\x91\xdf\xed\x7d\x62\x89\xb1" - "\x47\xa8\x62\xe3\x3c\x51\xdc\x1b\x4f\x28\x7d\x21\x9f\x27\xe2\xb8" - "\x53\x1a\xe6\x42\x1d\x5c\x6f\x01\xcf\x67\x51\x1f\xf2\xd5\xc1\xde" - "\x68\xe7\x7c\xa1\xf4\x5b\x33\xf1\x73\xf5\xb3\x97\xda\xc1\x78\x75" - "\xd9\xc7\x1c\x30\x70\x1d\x1a\xce\x35\x7d\x4e\xdc\xa2\x06\x6e\x48" - "\x3f\x5a\xa5\xd2\xa3\x1c\xff\x90\x7d\x1d\xbb\xbd\x4f\x8e\x30\x70" - "\x35\x70\xe0\xfa\xf8\xfc\xa6\xc8\x74\xe6\x70\xec\x19\xae\x8f\xe3" - "\xa9\x22\xef\x0c\x03\xdf\xcf\xcb\xcb\x65\xf5\x42\xf0\xf8\xc9\xfa" - "\xd7\x79\x03\x51\x6b\x98\x75\xca\x93\xf5\x47\xea\xc3\xbc\xde\x7d" - "\x17\xea\xb8\xb3\x4b\x14\x92\xd6\x53\x98\xb2\x8f\xb9\x0c\xf2\xb7" - "\x49\xfd\x50\xe3\xbc\x53\x13\x33\xa0\x27\x50\xae\x67\x06\xaf\x35" - "\x41\x6e\x8b\xcc\x4d\xa5\x1d\x7c\xe6\x12\x3a\xa7\xc8\x8c\x3c\x39" - "\x6c\x67\x61\xbe\x15\x91\xdf\xaf\x80\x6e\xf2\xaf\x9b\x08\x18\x45" - "\x03\xcc\x6e\x32\x37\x25\xc5\xa9\xea\x8f\x3f\xba\x6c\xb7\xe6\x76" - "\xd5\xdc\x8a\x39\x5c\x11\xec\xff\xa7\xfa\xdd\xf3\xad\x18\x0e\x7a" - "\x22\x9f\xef\x06\x9e\xef\x15\x15\x5e\x29\xaf\xb1\x5f\xcd\x3a\x68" - "\x82\x83\x32\x84\xfd\xd6\x5c\xd6\xb7\x5d\x99\xb7\x3a\x78\x2c\x41" - "\xf9\x7d\x46\x79\x1e\xd7\x79\xec\x40\x7f\x39\xaa\x7a\xf5\x61\xd1" - "\x31\x25\xcf\x45\xc7\x0c\x19\x4d\x55\x4f\xc9\x5e\xa1\x79\x46\x93" - "\x29\x80\x71\x6b\x7c\x84\x32\x1a\x76\x12\xf9\x36\x8a\xc8\x8b\x1b" - "\x31\x87\xb9\x81\xbf\x77\x51\x34\x83\x65\x94\xf9\x7b\x07\xf8\x25" - "\x1d\xb8\xbc\x78\x11\x75\x96\xa9\x7c\xba\xdf\xba\x03\xf9\x4a\x70" - "\xcd\x12\x26\x13\xd5\x96\x91\xa5\x56\x23\xb3\xaf\x8c\x46\x20\x0d" - "\xb6\xee\x53\x0b\x0c\x99\x4d\x85\x43\x55\x03\x51\x0d\xea\xdd\x52" - "\x26\xa2\xbf\xc1\x78\xee\xd5\x44\xe4\xf3\xd0\x1d\xed\x3f\xa8\xda" - "\xf8\xd4\x41\xc3\x26\xc4\xbd\x3f\xd1\xef\xe0\xa9\xcb\xce\x78\x3f" - "\xb6\x7a\x75\x49\xc1\x9a\xe5\x7c\x71\x8d\x7e\xe6\x96\xc1\xf1\x6b" - "\x21\x3c\xfe\xa9\x38\x15\x4f\xb5\xf1\xba\xe3\x8b\x99\xc6\x3e\xfa" - "\x2a\x87\xb1\xf6\xa9\xfb\xeb\xdf\xc3\x73\x3a\x9e\xfb\xe0\xdd\xc4" - "\x0f\x4a\x37\x33\x98\xb4\x8f\x2d\x64\x4a\xae\x6f\xc5\xd2\x92\xa5" - "\x45\x77\xf1\x8e\xd9\xe0\x14\xf5\xac\x9a\x91\x54\x4f\x79\x6f\x3d" - "\x6a\xfc\x09\x9b\x38\x5f\x75\x43\x48\xd8\x2b\x7c\xea\xac\xf4\xaa" - "\xbd\xc6\x9a\x56\x3f\x7e\x8e\xee\x58\xcd\x62\x1b\xcb\x83\x67\x33" - "\x99\x7e\xb1\xb1\xcd\xc4\x76\x64\x19\xee\x79\x6d\x41\xae\x91\xe9" - "\xf1\xa2\x7e\x7d\xbe\x0d\xe3\xfb\xaa\x88\xa8\x76\x62\xfe\xb9\xaa" - "\xdf\x35\x9b\x78\x1f\x11\xf6\x29\x6c\xa7\xd5\xb6\x2b\xf9\x1c\x71" - "\x7e\x6e\x0f\xf3\x6c\x52\xb9\x67\x55\x9f\xad\x06\xff\x17\x39\x7b" - "\xcf\xf3\xea\x79\xaa\x86\x1b\x71\xb8\x56\xe7\xf7\xeb\x2f\xe2\xbb" - "\x75\x86\xe2\xf1\xd5\x1f\x36\x61\xbe\x86\x76\x7e\xef\x24\xad\xfe" - "\xc0\xec\x80\x8d\x70\x03\xfd\x10\xf7\x1f\x72\x59\x7e\x97\xc0\x47" - "\x37\x9e\xd9\x63\x86\x76\x81\x96\x49\x13\xea\x8f\xcc\xfa\x4d\x3a" - "\x7e\x26\x91\x26\x77\x53\xd3\xd1\x83\x83\x06\x9a\xc9\x3a\x34\xc3" - "\xf2\xe5\x2f\x8d\x70\xdc\x73\xf7\xa4\x1c\x4f\x59\x29\xb4\x72\x34" - "\x62\x15\xf1\xf1\xd3\x2a\x72\x1e\xbe\xa5\x9c\xa4\x3f\x4d\x75\x45" - "\x4e\x2a\x5c\xb7\x7b\x45\x31\x9f\x5d\xd7\x32\x77\x2e\xf1\x3c\x43" - "\xa6\x37\x2f\x05\x4d\x1c\xa3\x99\xed\x67\xfe\xd6\xc5\x49\x2a\x7e" - "\xf0\x7d\xa4\x81\x5e\x6e\xe1\xdb\xb9\x44\xd9\x9d\xc5\xd5\x5a\xcd" - "\xce\x25\x7d\xf0\xcd\xc4\xf0\x3d\xaf\x92\x69\x6f\x59\x87\x29\x60" - "\xbe\x9b\x02\xce\x30\xbd\x8f\xfb\x94\x7d\x85\x3a\xd9\x96\x65\x18" - "\x8d\x5e\xad\xd2\xf3\x29\x99\xf4\xf3\xa7\xa6\xb3\x54\xfc\xdb\x03" - "\xfd\x94\xe3\xf3\xde\x5d\x99\x63\xd6\x75\x7b\x9f\x36\x07\xe9\xde" - "\x69\xba\x2d\x83\x31\xf7\x69\xcc\xff\x57\xcb\x38\x4f\x78\xff\x0c" - "\x7f\x17\x06\x69\x2e\x23\x4f\xca\x3e\xfa\x3e\xaf\xc1\x0b\x3f\xf3" - "\x81\xb8\xf8\x8f\x0e\x3e\xdb\xd2\x8f\x1f\xcc\xa0\x80\xfb\x76\xde" - "\x8b\x1c\x30\x14\xfa\xc7\x73\x41\xf4\xc4\xbc\x94\x05\x71\x32\xc5" - "\x4c\xf4\xe5\xe8\x45\x91\xd7\xd2\x79\x5e\xc6\x34\x65\x5d\xf3\xb3" - "\x15\xbf\x31\x05\x22\xe7\xfc\x81\xad\x1a\xb5\xc2\xae\x0c\xd4\x9f" - "\xf3\xab\xd8\xa7\x31\x6a\xa1\x3f\x53\x8b\xfb\x3f\xca\x03\xe5\x7f" - "\x46\xba\x90\xb1\xb0\x7b\x2e\x8a\x05\x01\xf3\xff\x21\xfe\x4e\x11" - "\x8f\x71\xa0\xbb\xf3\x2c\x3d\xfd\xcf\x5f\x03\xce\x9b\x7f\x01\x2c" - "\x19\x33\x6d\x32\xbd\x8f\x7b\xb4\xa9\x77\xfc\x4b\x19\x6b\x26\xcd" - "\xbf\xdd\xea\x5e\x64\xd2\x30\x96\x72\x6c\x3b\x8c\xa1\x13\xb9\x5d" - "\x78\xce\xe6\x67\x5c\xc7\xf2\xd5\xba\xc5\xbf\xdb\x1a\x5d\xc4\x63" - "\x6b\x1e\x8f\x9b\x48\x5f\xd0\x78\x51\x8e\xb5\xf3\xf4\xe7\x59\xfa" - "\xf3\x0c\xfd\x79\x9a\xfe\x9c\xab\x3f\xf3\xba\xbc\x3e\x26\xaf\xf1" - "\xf5\xda\x0b\xa6\x41\xc7\xf0\xbc\xc7\xe8\x0b\xe0\x33\xc4\xea\xde" - "\x2c\xc7\x76\x1d\x8f\x89\x3a\x5e\xd9\xfa\xb3\x81\xcf\x8d\xd6\xe8" - "\xe6\xff\x25\x7c\xd6\x3a\x13\xf1\x59\x9b\x1d\x87\x0f\x59\xdd\xb9" - "\x9f\x07\x1f\x9b\x95\xbf\x13\xf1\x3f\xc0\x87\x71\xe1\x34\xd4\x7f" - "\x20\x09\x1f\xbf\x81\x4f\x4a\x7e\x5b\x27\x3a\xd8\xae\x59\xfb\x05" - "\x19\xd7\x79\x10\xdb\x2c\x8d\x97\x8c\x38\x85\x6b\xa3\x57\x8a\x53" - "\x08\x59\xc0\xb8\x5d\x82\xf6\xaf\x6d\xd6\xed\xb7\xc3\xca\xce\x2f" - "\x99\x68\xf8\x8e\xa1\xad\xfb\xaa\x54\x5b\xf7\x6f\xe5\x58\x7d\x1b" - "\xe8\x8b\x1e\xb7\xe8\xc0\xbc\xfb\x6f\x3c\x37\x8c\x87\x5b\x54\xb2" - "\x76\xed\x53\x77\x39\x8b\x96\xae\x5a\xee\x1c\xbd\xcc\xb9\xb6\x70" - "\xe5\x8a\x92\xe5\x89\xfe\x14\x36\xfd\xfb\x3d\xf2\x9c\x08\xcf\xa5" - "\xe4\x5c\x1a\xfc\x2f\xf5\xa4\xf4\xc9\x2b\xb9\x20\xbc\x25\x4b\x58" - "\xe7\x36\xd4\xa8\xef\x3c\x01\x9f\x26\x63\x0c\x31\xe6\xbf\x3c\x86" - "\x20\xfd\x04\xc6\xc9\xfc\xb8\x74\xce\x1b\x32\xd2\x18\xbe\xae\x9b" - "\x06\x9d\xa4\x92\x6a\xae\x33\x25\x0d\x2f\x8a\x3d\xb0\x9b\xf8\x1b" - "\x16\x26\xe8\x14\xc1\x71\xb7\xf8\xfc\x25\xca\x89\x53\xf4\x8c\x9c" - "\x57\x2c\xc0\xb3\x9a\xb3\x09\xe0\xf8\xcc\xc3\x28\xb3\x17\x69\x66" - "\xb6\x21\x30\x0f\xec\xe0\x72\x48\x7f\x8a\xe3\x60\x20\xdd\xa2\xc7" - "\x13\xe3\xb4\x2d\x1c\xa7\x02\x69\xb6\xb8\xb4\x97\x90\xe6\x40\x9a" - "\x53\x87\xf7\x06\xd3\x19\xcf\xb9\xfa\x3a\x19\xe7\x79\x57\xaf\xb7" - "\x3c\x1e\x67\xfe\x86\xcb\xed\xe3\xb3\x9d\x0b\xe6\x7f\x7d\xf2\xdd" - "\x8f\xaf\x5e\xb5\x62\x30\x49\xb2\xbb\x30\x1c\x67\xdf\xee\xbe\xe5" - "\x2e\x67\xf1\xf2\xe5\x6b\x9c\xeb\x97\xaf\x2a\x71\x2e\x5d\xbf\x74" - "\xc3\x60\x5a\xb1\x7a\xcd\xe3\x1c\x65\x81\xbb\x65\x6d\xc1\xe3\x2b" - "\xbe\xcb\x4e\x2f\x2a\xf7\xe0\x04\x3b\x61\x01\xeb\x36\x3d\x2e\xc9" - "\xd1\x2a\xb6\x21\xed\x5f\xb5\xe1\x9e\xe3\x75\x39\x70\x6d\xc2\xef" - "\x30\x7e\x87\xf0\x3b\x8e\xdf\xb1\xd3\xb4\x69\x2b\xae\x07\xbb\xbd" - "\xeb\x96\x19\xf6\x4a\x1f\x0f\xad\x73\x1b\x3c\x04\xfb\xe2\xa0\x1a" - "\xdf\xd6\xed\x6b\x8d\x4a\xf9\xe9\xe5\xa9\xaa\x8b\x7d\x3c\xc5\xf1" - "\x46\x5b\xd9\xa7\x6b\x1d\xde\x5f\x92\x6b\x95\xbc\x66\x72\x0d\xd3" - "\xed\x14\x6d\xd8\xdd\xf8\xb2\x68\xe6\x58\x39\xb8\x36\x81\x5f\x9a" - "\x55\x7c\x9a\xf5\xa3\x90\x6f\x24\xea\x38\xac\xea\xd0\x9f\x87\x8b" - "\xa3\xfc\x0d\x97\x93\xfa\x33\xc3\x02\x8c\x3b\xf8\x9e\xaf\xfa\xde" - "\xa9\x55\xff\xc6\x9b\xa9\xef\xdd\xfa\x16\xbd\x0e\x3f\x68\x51\xde" - "\xe0\x95\x73\x29\x39\x77\xe6\x35\x62\x6b\xda\x3d\x02\xf8\x9c\xd3" - "\xd2\x17\xb6\xc9\xf8\x97\xe5\x97\xa0\x23\xbe\xf6\xb5\x80\x5b\xe6" - "\x4f\xe3\x35\xe4\x39\xc5\x42\xe3\x38\xe4\x5a\xfa\x93\x6d\x5c\x4e" - "\xd8\xbe\x6a\xd3\x76\x0c\xc9\x55\x36\x03\xc7\x1d\x5c\xbf\x4f\x87" - "\x19\x61\xda\x9e\xa6\x75\x8f\xa8\x79\xf8\xa6\xad\xca\x96\x58\x7f" - "\xd0\xf0\xb5\x84\x8c\xba\xf0\xdc\x64\xe8\x80\x20\xad\xf7\xe9\x7e" - "\x71\x7e\xbd\xfd\x51\xfd\xf9\x90\x8e\x63\x1a\xc7\x42\x01\xfe\xc7" - "\xb8\xef\x60\xaf\x1c\xc2\xfd\x71\xd0\xa7\x59\xd1\xc7\x2d\xe3\x1c" - "\xc0\x6e\xe2\xf7\xc7\xf9\x7b\x37\x78\x77\x5c\xc5\x19\x59\x3f\x91" - "\xdb\xdc\xe7\x3b\x5b\x9f\x0b\x5c\xef\xe0\x3d\x66\xc8\xd2\xa1\xc0" - "\x45\x96\xcf\xf5\xd9\x80\x77\xc0\xd0\x3b\xac\x67\x0a\x62\x90\x53" - "\x39\x9f\x72\x17\x19\xfa\xa6\x8f\x0f\xdc\xe5\xa9\x74\x49\xaa\x7e" - "\x57\xf4\x77\xff\x43\x78\x9f\x69\x02\x4e\x07\x64\x1f\x70\x3c\xd6" - "\x8b\xbd\xf3\xb6\x1e\xa5\x23\xdd\xc7\x7b\xe7\x98\x3a\x1e\x1c\xdb" - "\x3d\xc8\xb8\x5d\x92\xfb\xfe\xba\xde\x70\x47\x0d\xbd\x61\xc0\xb1" - "\xa6\x09\xcd\xea\xc6\x3f\xdf\x48\x07\xef\x91\xf0\x78\x29\xed\x11" - "\xc0\x19\x7a\x41\x9d\x81\xd3\xaa\x47\x3a\x82\xe4\x3e\xc8\xdf\x7c" - "\x93\x36\xad\xf7\x99\xff\xe8\xd3\x45\x1b\xe6\xc5\xc3\x14\xb6\x91" - "\x0e\x86\xcb\xfa\x88\x6d\x92\x82\x98\x99\xe3\xd0\x38\xf4\xf1\x05" - "\x3a\x78\x43\xb9\x81\x2b\x68\x78\xd4\xc0\x57\xff\xe6\xd8\x51\xd4" - "\x13\x9c\x1b\xeb\x61\x5f\xf0\x26\xd5\x9f\x9b\xa4\xbe\xc1\xbb\xfd" - "\x28\x7b\x38\x48\xcf\xd8\x74\x19\x6a\x46\xf9\xfd\x47\xca\xa6\x21" - "\xcf\x86\x36\xdd\x9f\xf9\x18\xfa\xf7\x78\x1f\xef\xaf\x6b\x89\x5b" - "\xe7\x39\xae\xfa\xf0\xee\xf2\x93\xb4\xd1\x11\x97\xae\xf7\xed\x91" - "\x79\x48\x6f\x51\x6b\x26\xce\x36\x55\x7e\xa3\xf2\x5d\xd5\x71\x64" - "\x5d\xc0\xe7\xf5\x58\xc6\x25\xed\x65\x1f\x6f\x9c\x67\x8c\x17\x80" - "\x75\x50\xd2\x7c\xb8\x38\xcc\x74\x52\xf1\x3e\x9e\xb9\xa8\xe8\xb4" - "\xd1\x9d\x40\x7b\x1e\x37\x51\x0f\xd3\x69\xe8\x16\xa1\x0d\x0d\xa7" - "\x89\x82\x0d\x66\x62\x79\x61\x19\xe7\xbd\x41\xf0\x87\xb4\xab\x14" - "\xdd\x36\x1e\x32\xe8\x66\xf4\x1d\xd3\x29\x48\x1b\x5d\x4c\xdb\xc4" - "\x36\x0e\x3a\x76\xd2\x68\x3b\x68\xca\x31\x4d\xf1\xdc\xac\xcb\x45" - "\xb3\xff\x06\xf6\x1d\x59\xf7\x87\x23\xe6\xaf\xd3\x11\xf7\x44\x52" - "\xb4\xdd\x84\x3e\x2e\x71\xc7\xcd\x4b\x8e\x32\x7d\x59\x56\x84\x6f" - "\x64\x96\x1e\x7b\xeb\xa8\xf2\x63\x5a\xd7\x2c\xaa\x47\x66\x49\x59" - "\x5e\x27\x63\xa4\x70\xdc\xde\x63\x4c\x23\xd6\x8b\x2c\x4b\x2c\x03" - "\x2c\x4f\x8a\x46\x9b\x4a\xe2\x68\xd4\xc4\xf4\xd1\xe9\x74\x30\x49" - "\x97\x2f\x77\x16\x4d\x56\xba\xd8\xe9\x1a\xbd\x6c\x82\x0c\x74\xe3" - "\xbc\x6f\xea\x5d\xce\x79\x93\x47\xbb\x0b\xc7\xce\x51\x97\xa9\xf3" - "\x66\xf1\x75\x70\xe2\xbc\xce\x89\x7a\x4e\x24\xce\x0d\xb7\x14\x2a" - "\xfd\xb1\x29\x1c\x4c\xb3\x4a\xda\x71\xdc\xd9\xaa\x55\x44\x31\xe0" - "\xbd\xe3\x34\xfa\xd4\xe6\x3c\xc8\x71\x8e\xe7\xba\x89\xe3\xa2\x7f" - "\xda\x88\x77\x0d\x48\x1f\x5a\xcc\xdf\x47\xf8\xab\xd0\xec\xce\x83" - "\xbc\x66\x23\xaa\xed\xee\x90\xbd\x22\x07\x3f\x0a\xd9\xc7\x54\x4e" - "\xbf\xc5\x23\xba\xbd\xa5\xb3\x8c\x76\xf1\xda\x0e\xfa\xf3\xe0\x5c" - "\xb7\x88\x31\x8d\x0a\xdc\x1c\x8b\x1c\xb0\xd3\x79\x6d\xa7\x14\xed" - "\x2f\x3e\xa0\xe6\xaf\xa5\xe0\xff\x75\xba\x3d\x43\xf3\xf0\x0c\xfb" - "\xef\xeb\x72\x8d\x4b\xf3\x3a\x64\x0c\x73\xad\xe2\xd6\x87\x30\x1f" - "\x20\x03\x26\x60\x0d\x54\x7e\x0f\x0a\xde\xe7\xf5\xab\xd5\x6a\x46" - "\x36\x59\xd3\x54\x5c\x48\xc8\x78\x79\xa3\x49\xcb\xeb\xf5\x93\xc1" - "\xbb\xa1\x5b\x6c\xec\x47\x93\x07\xde\x2b\xe7\x3c\xc6\xbb\x2a\xaf" - "\x16\xac\x32\x69\x11\xf4\xa3\x4d\xd9\xcf\x9d\xac\x3f\x31\x77\xdd" - "\x3c\xc9\x18\xd7\xe4\x78\x68\xa2\x72\x35\x9f\xd9\xbc\x88\xcb\x9d" - "\xf7\x9a\x09\x3a\xbb\xf9\xa6\x2c\x39\x47\x89\x68\xde\x34\x52\xbe" - "\xcc\x9b\x6f\x33\x74\x2c\xef\x97\x5a\xb7\x88\x10\xaf\x11\x5b\xa3" - "\x22\x24\x63\xed\xf3\xd8\x41\xa7\x29\x50\xda\x5d\x1e\x90\xdf\xe0" - "\xe4\xef\x8a\x84\xf5\x71\x23\xa6\xc6\x0d\xd4\x1f\x4a\xbf\x75\x09" - "\xc6\x87\xb4\xd3\x04\x5b\x17\xf8\x33\x6d\x78\xaf\x45\x03\xad\x02" - "\x3c\x4e\x32\x7d\x32\xbf\x32\x8d\x7d\x60\xb8\xad\xd6\x28\xda\x1c" - "\xdf\x2e\x93\x16\xdc\xe1\x45\xbb\x4c\x68\x97\xfb\x0c\xcb\x4c\x84" - "\x7d\x93\x20\x6f\xc3\x65\x3c\x6b\x39\x3f\x2f\x73\xc6\xb7\x91\xf5" - "\xbf\x6a\x43\xd9\x94\x54\x6d\x14\x26\x6e\x23\xd3\xa0\xec\x3a\x5d" - "\xde\x24\x9e\xac\x3f\x3a\x69\xf3\xf1\xa1\x5b\xd8\x27\xc8\x79\x10" - "\xfa\x6d\x2a\xf7\x21\xc6\x4f\x1f\xe3\x99\xaa\xbf\x18\x9e\x0e\x2b" - "\x68\xdd\x52\xbe\x04\xb8\xec\x4f\x4d\xef\xb2\x96\x2b\xd3\xbb\xec" - "\x35\x2e\xcf\x78\xf0\xfe\x8e\x35\x6a\x82\x0e\xae\xe0\xf9\x5a\x65" - "\xaa\x7a\x87\x6e\xd9\xc3\x78\xa5\x7c\x27\x58\x5e\x74\x1d\x04\x3e" - "\x14\x90\x13\xc1\x3a\xa9\xdb\xeb\x99\x61\xe8\x23\x6b\x9a\x33\x5d" - "\xea\x07\x93\xf0\xa5\x82\x61\xdd\xe2\xe3\x7d\xae\xa9\xa8\x3f\xe5" - "\x7b\x8d\xbf\xdd\xe1\x73\xee\xd1\x2a\xbe\x7a\x93\x35\x8d\xee\x09" - "\xa5\x7f\x75\xb0\xd5\x1d\xe5\xb3\x9c\xe8\x47\xe1\x86\x1c\x3f\xcc" - "\xf3\x54\xb5\x36\xe2\x81\xfd\x5f\x2d\xe3\x33\x85\xec\xce\x3d\x6a" - "\xdf\xc8\x83\xf1\xaf\xce\x69\xac\xcd\xe3\xb9\x3d\x48\xff\x28\x54" - "\x72\xf9\xc5\x9d\xa2\x66\xcc\x02\xcd\x6b\x15\xce\x8d\x56\xd8\x91" - "\xe5\x9b\x35\xc1\xdf\x73\x18\xb3\xa0\x8f\x4f\x94\xbf\x94\xc1\x27" - "\xdd\xde\xf2\x51\xa9\x79\xa0\x7c\xfa\x95\x79\xa0\xfc\x0b\xfc\x9e" - "\xe9\xae\xe6\x2a\xe5\x45\x86\x9d\x22\x2a\xbe\xb8\xd3\x59\x26\xeb" - "\x27\x55\x37\xd3\x24\x97\xf7\x8c\x66\x81\x2e\xe5\xc8\x5b\x67\xe8" - "\x01\xe6\x17\x6b\x8c\xbf\x75\x41\x92\xa7\xf1\x0e\xe3\x4a\x89\x45" - "\xad\x83\xdf\x6c\x93\xdf\xaf\xf4\x6e\xf2\x85\x3c\x85\xbb\xf8\x3b" - "\xad\x61\xfb\xc8\x11\xc8\xd3\x16\xa4\x26\xb5\xdf\x6a\x1b\x99\x05" - "\x9d\xed\xa8\x55\xfe\xd0\x16\x19\x2f\x0a\x32\xcd\x31\xa2\x58\xae" - "\x91\xc6\xba\x9b\xe3\x45\x61\xbe\xb3\xc5\xd6\x3b\x2e\x79\x73\xa1" - "\x2b\x84\xb4\xc5\x30\x2e\x8d\xe8\x02\xed\x5e\x32\x69\xfb\x2e\x4e" - "\x70\x10\xb7\xf9\x62\xc5\x0d\xfb\xbe\x37\x9e\xcc\xff\x97\xe3\x31" - "\x2a\xbe\x9d\xb2\xb6\x7c\xdd\x4c\xff\x95\x43\x26\xa6\x43\x90\xb6" - "\x38\x15\xed\xb6\x2c\x31\xfa\x27\x48\x9e\xa3\x52\x77\x56\x2c\xec" - "\x98\x1b\x15\x9f\xaa\x75\xee\x2d\xd0\x7f\x4f\xd5\xa9\xf7\x9b\x3a" - "\x92\xd7\x80\xd8\x9e\x77\xae\x5c\xeb\x5c\xb6\x7a\xfd\xaa\x91\x23" - "\x13\xe6\x4a\x66\xf5\x5d\xdc\x2d\xb5\x6a\x3c\xdd\x72\xd4\xc0\x9b" - "\xed\x12\x3c\xa3\xfd\x9b\x2e\x8b\x65\x3f\xab\x40\x77\x73\x2f\xc8" - "\xa6\xbe\xfb\xdb\x68\xd6\x6d\x71\x8f\x5f\xa3\x59\xb7\x7f\xad\xe0" - "\xa1\xe5\x4b\x97\x6d\x88\x4b\xbd\x23\x7e\xdd\xb0\x6a\x27\xea\x4e" - "\xbf\xe1\x5e\xe8\x8a\xb4\x39\x9b\x78\x6c\xf1\xbe\x57\x16\x15\x7f" - "\x87\xbe\xce\x81\x8c\x15\xb4\x94\x44\xa9\x05\xba\x4c\x7c\x91\x75" - "\xf8\x20\x75\xb6\x13\xf6\x14\x78\xcb\x8a\xb6\x87\x60\xd7\x5d\xe0" - "\xf5\x19\x94\xfb\xb8\xb5\x8e\x63\x3a\x8f\xd1\xe3\xd5\x7b\x39\xd6" - "\xb9\x1d\xd7\x0f\x71\x1d\x88\xeb\x6f\x9d\xab\x30\xef\x61\x5f\xfa" - "\x75\xec\x4b\xef\x7d\x4b\xfa\x03\x85\xcb\x89\x7d\x82\xf0\x7e\x01" - "\xdb\x20\x41\xaa\x30\xf3\x3a\x38\xe7\x45\xda\x6e\xe7\x13\x94\xcd" - "\x57\x21\xf7\x06\xbd\xf5\xa2\x7a\x8c\x4f\xec\xca\xe3\xef\xad\x8d" - "\x3a\x45\x15\x69\xe9\x69\x1f\x53\xba\xc3\x92\xd1\xed\xad\x40\xd9" - "\x55\x0b\x98\x4e\xfd\x7d\x8b\x56\x7e\x03\x38\xc9\x3e\xec\xb3\x0d" - "\xbf\x4f\xd2\xbe\xd5\xed\xb9\x06\x39\x2e\x54\x2c\x88\xb3\xe9\x78" - "\x6f\x7a\xb0\xb2\x4f\x44\x4c\xd9\xa7\x15\x25\x86\x1c\xe0\xbe\xdc" - "\xe0\xd3\x84\xf8\x7a\xab\x4a\x96\xaf\x59\xbe\xcc\x39\x7a\xed\x60" - "\x8a\x8b\xae\x57\xb8\x7c\x95\x73\xcd\xf2\xa7\x9f\x59\xbe\x56\x46" - "\xc6\xe3\xb7\x09\x63\x7e\x96\xc8\x1c\xd5\x64\x9c\xfb\x72\xde\xc0" - "\xf4\xad\xf8\x84\x63\xb2\x89\x9a\xd1\x1c\xc3\xaf\x53\xcd\x37\x76" - "\xba\x13\xe7\x1b\xcf\xaa\xb8\x13\xbe\x31\xe5\x6a\xae\xf3\xac\xfc" - "\x8e\xf5\x49\xda\xea\xeb\x8b\xff\xbe\x75\x0a\x68\x69\xd2\xe9\x76" - "\xa1\xdb\xbb\x35\xc7\xa0\x5b\x90\x9e\xf5\xeb\xb6\x54\xa7\xd4\x1f" - "\x18\x63\xa1\xff\x12\xc6\x57\xf5\x0d\xda\xad\x1c\x97\x23\x5d\xae" - "\x27\xdb\xc7\x6c\xe5\xba\x18\x26\xea\xf3\xa3\x7f\xca\xa1\x37\x59" - "\xbf\x55\x1a\xf0\x50\xa7\x8b\xeb\xd3\xe7\x41\xd7\x9f\xa6\x67\xe5" - "\x9a\xb3\xe6\x1b\xb3\x95\x75\x0a\xc7\x10\xd1\xaa\x01\x47\xee\xd1" - "\x3e\xeb\x97\xeb\xb0\xfc\x0d\x02\xc0\xe2\x75\x60\xe8\xb9\x5a\xfe" - "\x5e\x31\xa7\xa9\xd8\x70\x15\xdb\x78\xed\x19\x75\x95\x02\xff\x48" - "\xdf\xd9\x86\x67\xfd\x6c\x77\x32\xdc\x20\x6d\x3d\xcc\xf0\x54\xec" - "\xbb\x67\x47\x80\x77\x46\xf5\xd9\x4f\xcf\x2e\x89\x9b\x97\x31\x3e" - "\x12\xcf\x30\x70\x91\x71\x56\x95\xaf\xa9\x6c\x37\xeb\xcf\x5a\xbd" - "\xed\x46\x7b\x00\x0f\xfa\xaf\xc2\x66\xf8\x4d\x04\xf5\x76\x33\x7e" - "\x8c\x7b\x3c\xce\x3a\xbe\x75\x8c\x2f\xca\xed\x8d\x93\x6d\x5e\x97" - "\x19\x80\xb4\x43\x7d\x3e\xec\x5b\x29\x59\x6f\xac\x5e\xe5\x2c\x5a" - "\xb9\xea\xc9\x82\xf5\x4b\x9f\x5c\x5e\xf0\x4c\xf1\x58\xe7\x33\xab" - "\x1e\x2b\x5a\xfd\xf8\x93\xcc\x35\x6b\x4b\x9e\x79\xfc\x49\x27\x6b" - "\x96\x82\x69\xb3\x66\x15\xdc\xfb\xf0\xfc\x47\x06\xd3\xbd\x4b\x91" - "\x86\x99\xff\xac\xec\xb1\xea\xd5\x43\xd3\xa7\x7e\xbb\x60\xea\xdc" - "\x87\xe7\x2c\x90\x87\x5e\x7a\xdf\x4f\x5b\x95\x3a\x43\x02\x1f\xda" - "\xc0\x4b\xa5\xe8\xdf\x01\x27\xe9\xf9\x49\x2a\x5e\xfa\x73\x45\x89" - "\xf1\xd2\x9f\x03\xd2\xcf\xed\xc1\xef\x30\xd1\xf7\x42\xf8\x41\xbb" - "\x3f\x9f\xad\xf8\xeb\x9a\xc5\xdd\xde\xe7\xea\xfa\xf8\xeb\x79\x79" - "\x96\x92\xfd\x94\xd4\xfa\xec\x73\xd0\xff\x15\x87\xe2\xdf\xf5\xcd" - "\x27\x9f\x3b\xd6\x3b\x9f\xec\xd5\x29\xcf\xf5\xce\x2d\x91\x56\x89" - "\x79\xe5\x35\x3c\xaf\x54\xeb\x49\xcf\x4f\x96\x3c\xd5\xaf\x7c\x5b" - "\xc8\x98\x57\xb2\x6c\xcb\x3d\x29\x39\xff\xf8\x5e\x4e\xbc\x8c\xcb" - "\x35\x7d\x5d\xc6\xb9\x9c\x5c\xbf\xb3\xed\x5c\xc6\x6b\xda\xb0\x8f" - "\x4b\x61\x2b\x60\xfc\xea\x16\xc2\xbe\x73\x99\xc2\xe9\x7b\x6e\x5e" - "\xe3\x66\xbb\x59\xe7\xa7\xa1\xa7\xe9\x7b\x6f\x0b\xef\xb3\xcd\x6a" - "\x4e\xf9\x6c\x8c\xf5\xba\xa8\xb8\xe1\x5e\xf6\x2d\xe2\xb9\x13\xea" - "\xdc\xdf\xc7\xb3\xcf\x4f\x62\x5e\xe8\x9b\xcb\x7e\x2f\x41\xff\x77" - "\xc9\xef\x12\x7e\xef\x84\x11\xef\xa1\x64\x24\x99\xcc\x23\x7d\x54" - "\x6b\x12\xd0\x37\xdf\xdb\xc6\x75\x30\x3d\x83\xf4\xdc\x3e\xe4\x35" - "\xf7\xd1\xaf\xd2\xd6\x4b\x3f\x7d\x9d\xc5\x58\x63\x51\x78\x3f\x3f" - "\xb9\x3f\x5a\xa5\xa6\x53\xe5\x92\xcf\xa4\x93\x97\x06\xb0\x4c\x1a" - "\xf4\xba\x9c\x56\x95\x7b\x2f\xa7\x55\xe5\x85\x3e\x5a\x3d\x77\xe3" - "\xe5\xb4\xaa\x6c\x8b\xdb\x57\xd2\xd7\x51\x9e\x9f\xcc\x34\x63\x1e" - "\x43\xbb\xb7\x81\xcf\xea\xfa\xe8\xf7\xbc\xe5\x72\xfa\x3d\x3f\x22" - "\x35\xfd\x2a\xf9\x7c\x55\x3c\x9c\x86\x54\xe3\xc6\xd0\x2d\x26\xfd" - "\x3c\xd8\xf3\xd5\xfc\xad\x7b\xc6\xe3\x45\x93\x56\xf8\xa2\x17\x3f" - "\x5c\x79\x1e\xd1\x67\x8b\x8b\x88\x4e\x5f\x5f\x13\xe6\xbc\xbc\xae" - "\x74\x85\xb1\xe8\x84\xb1\xe6\x81\xfb\x36\x9e\x3b\xf3\x37\xa1\x38" - "\x9d\xe9\xc9\xdf\x18\x03\xbf\xb7\x29\xbb\xf4\xf9\xde\xef\x7f\x74" - "\x8d\x1f\xed\x4f\xdf\x42\xce\x23\xf5\xb7\x73\x7a\x04\x3c\x34\x83" - "\xd3\xd9\x77\xab\x3f\x98\x05\xb1\x5c\x4a\x0d\xf7\xfb\xbd\xfc\xdf" - "\xdf\x99\xe8\x24\x7d\x54\xb8\x74\xd5\xb2\xd5\x2b\x56\x7c\xb6\x2a" - "\x8a\xdf\x57\xf3\x79\x35\xfe\xae\xd9\xc0\xee\x8a\x27\x36\xa2\x4e" - "\xd8\xff\xc5\x1d\x6a\xdc\xfc\x3e\xf4\xdf\xca\x26\x65\x4b\x2e\xec" - "\x50\xe7\xc0\x5f\xc8\x8a\xd3\xcf\xe0\x91\x17\x9c\xc2\xfb\xfd\xfc" - "\xbe\x3e\xfe\x7e\xe7\xe5\x7d\xfc\x02\xa5\xee\xe3\x17\x46\x69\xeb" - "\xf8\x1c\xce\x0b\x98\xff\xac\x91\xb6\x26\x3f\xb3\x1f\x04\xe6\xcc" - "\x1d\x98\x2f\x77\xce\xdd\xe0\xbf\xa7\x60\x43\x9a\xdc\x2b\xe6\x6f" - "\xaf\x44\x2f\x8a\x76\xf6\x45\xe0\xfd\x31\xfe\xf6\x0a\x7f\x73\x89" - "\xbf\xff\x29\xf3\xe0\xbe\xea\x14\xc9\xb9\x23\xde\x3b\x1b\x4f\xc9" - "\xef\x63\xc3\x56\x78\xa1\xdc\xb0\xad\xad\x30\x19\xf9\x7c\xfa\x0e" - "\xd5\x1f\x6d\xdc\x17\x5c\x5f\xc1\x06\xbf\xaa\xe3\x22\x7f\x57\x8d" - "\xac\xca\x86\x78\xe1\xd0\x15\xd7\xee\xed\x15\xce\xfe\xbf\x49\x50" - "\x3e\xa8\x77\xaf\x52\xff\x0e\x31\xcb\x3e\xfb\x8f\x76\x7b\xb7\xd9" - "\x92\xfd\x4f\x95\xef\xd0\x36\x97\xe1\x93\x55\x25\x7d\xa0\xc8\xca" - "\xfa\x93\xe7\x39\xa7\x68\xdb\xac\x46\x39\x5e\x6e\x9b\x15\xbf\xc7" - "\xe9\xdc\xb8\x65\xe0\x59\x7a\xe1\xc2\x15\xf6\x4d\x33\xfa\x7c\x5f" - "\xcb\x07\xa1\xfc\xb6\x5e\x1f\x31\x6f\xf9\xa0\xc6\x38\xdc\xf0\x6e" - "\x5f\x9c\xaf\x62\x88\xc7\x63\x9e\x3f\x36\xaa\xef\xaa\x86\x80\x43" - "\x0b\xd2\x30\x9f\xd8\x2e\xe3\x11\xae\x8f\xd2\x88\xe2\xbb\xf9\x9b" - "\x3d\xdb\x2e\xe8\xf3\xd0\x4e\x67\x19\xe3\xb3\xed\x25\x86\x1b\x44" - "\x3e\x21\xf7\x03\xb6\x53\x2f\xce\x71\xf5\x19\xb0\x15\x4d\xb6\x8f" - "\x32\xf0\x0a\xd2\x36\x19\x3f\x85\xbf\x73\x1d\xdf\x26\xf7\x8a\x95" - "\x05\xc5\x85\x1b\x0a\x56\xae\x5a\x59\x32\x98\xdc\x4b\x9f\x59\x39" - "\x01\x49\xce\xc7\x0b\x57\x16\x17\xac\x94\xd1\x8a\x65\x20\xe4\x92" - "\x0d\xc5\xbc\xf7\x71\xd9\x1e\xbc\x4d\xda\xf2\xa6\xed\x93\xd4\x78" - "\xbf\xbd\xd6\xe0\x53\xf9\xed\x6f\x91\x47\x7d\xbe\x57\xf2\x9b\xc1" - "\xe9\x68\xe7\x07\xcc\xc3\x2a\xbe\xcf\x8e\x36\x65\x5f\x6c\x6f\xbe" - "\xdc\x27\x6b\x7b\xd0\xf0\xc9\x02\x7f\xdb\x58\xd6\xe3\x60\x81\xff" - "\x77\xd0\xe5\x65\x76\x64\xf5\xfa\x77\xea\xdf\x1d\xe7\xbe\x92\xf1" - "\xee\x6b\x58\xdf\x6e\x7f\x20\xe0\x9e\xce\x31\x7b\x75\xb9\xda\x31" - "\x2d\x0e\x5f\xe9\xcb\xcb\xb0\xf8\x9c\xd4\x84\x48\xbc\x2f\xdb\x8e" - "\x0f\x31\xf6\x3a\x8c\x7a\x9c\x9b\x4c\xd0\x77\x3b\x5e\x0d\x9b\xfc" - "\xe9\xd2\xff\x18\xe5\x00\xcb\x67\xf8\xd1\x04\x7b\xdb\xb5\x63\x6f" - "\x32\x8e\xc0\x7d\x24\xd2\x0f\xf7\xf9\x09\xee\x28\x67\x18\x48\xc3" - "\xf8\x5f\x35\x36\x3e\x2d\xbe\x9f\xa6\x4c\x9f\x05\x03\x7a\xed\x72" - "\x74\xd2\xd4\xa5\x45\x45\xac\x83\x96\x2e\x2f\x7a\x66\xcd\xea\xb5" - "\x7a\xd7\x4d\x59\xc1\x61\xa8\x65\x96\xbb\xf4\x37\xce\x55\xcb\x97" - "\x2f\x53\x49\x7a\x47\x26\xee\x59\x29\x3f\x86\x2a\xcc\xff\xb7\x15" - "\xf6\xd9\x8a\x55\x7b\x84\x69\x47\x3b\x7e\xe7\xa4\xfe\x91\xfd\x5a" - "\x55\x94\x38\x47\xab\x2a\x35\x64\x5f\xf6\xb3\x87\x7d\xce\x9c\xf6" - "\x2e\x21\xf7\x78\xd0\xaf\xbe\x3f\xa0\x9d\x03\x82\xe4\xe3\x33\x5f" - "\x69\x71\x70\x0e\xf6\xd2\xbb\x62\x61\x5b\x85\xf2\x99\x30\xf3\x37" - "\x6b\x39\xa6\x04\xde\x63\xfe\xff\xc2\x09\xa5\x27\xab\x82\xbd\x7b" - "\x2f\xa6\x74\xcc\x37\xab\xc0\xfb\xab\xb3\x2f\x97\x6f\x9f\xe5\x72" - "\xb9\x67\x5f\x4b\x9f\xd3\xa0\x71\xdc\x37\xe8\xc1\x7f\xbe\xf7\x8c" - "\x35\xe3\x46\xfd\x9b\x08\x7c\xcf\x65\x79\x5e\x21\x86\x0e\xb9\x87" - "\xfd\x1a\x4e\x92\x6f\x9b\xe2\x29\x5f\x61\x9c\x6f\xa0\xed\x34\xf9" - "\x2a\x55\xdf\xfa\xca\x0d\xf9\x43\x3b\xa5\x2d\xc7\x30\xd4\xb8\x5e" - "\x35\x40\xf1\x97\x6f\xaf\x41\x5b\x9e\xc3\xe3\xf9\x60\x9f\x1d\x54" - "\xb5\x40\xfa\x8b\xa8\x98\x1a\x3d\xdc\x7e\xc0\x99\x68\xc0\x41\x5e" - "\xb4\xdf\x12\x32\x68\x65\xe4\x89\xe7\x89\xa9\x4b\x8b\x31\xc1\x5e" - "\xb9\x62\xc5\xf2\x35\x6b\x8d\x38\xe3\xae\xd5\x45\xcb\x54\x5c\xf1" - "\xbb\xd0\xfd\xeb\x21\xc3\x93\x39\x34\x39\x52\xd5\x6d\x92\xbd\x3b" - "\x96\xd7\x44\xa4\xff\xa8\x9c\x73\xbd\xf4\x5e\x83\x3e\xff\x3a\x49" - "\x35\xf3\x94\xff\x55\x8d\x5d\xd9\xb6\xd7\xbe\xde\xed\xad\x2e\x31" - "\x6c\x5b\x5e\x6b\xed\xa2\x9b\xf8\x5b\x9e\xf2\x2c\xc1\xee\x97\x45" - "\x3b\xaf\xad\x22\x4f\x9d\xf1\x2d\x3a\xb6\x9b\xb6\xbf\xac\x62\x68" - "\xfb\x57\xb1\xaf\xc8\x4b\x1f\x69\xd5\x4e\x9f\xc8\xb4\xfa\x61\x9f" - "\x65\xb0\x4c\x0c\xe9\x64\x1f\x5e\x8e\x7d\x55\xdd\xce\x76\x1d\xeb" - "\x32\xfe\x5e\x43\x3b\x55\x1f\x84\x8e\x86\x4e\x7f\x29\x18\xb2\x3b" - "\x7d\x5b\x37\x92\x85\xeb\x80\xbe\x0e\x36\xed\x61\xda\xd6\xd0\x07" - "\xd0\x65\xba\xce\x0e\x72\x3d\x41\xaa\x6e\xd6\xd7\xfd\xf7\xea\xeb" - "\xac\x7b\x91\x0f\xfa\x7f\x48\x9d\xe2\x55\xfb\x37\x6e\x2e\x27\x37" - "\x7f\x9b\x52\xc5\xad\xba\x75\x06\xda\xc1\xdf\x62\x0c\xc1\x16\xc4" - "\x7c\xa7\xba\x04\x6d\xc8\xd1\x7d\xc0\xc1\x2b\x35\x2d\xca\xb7\xbf" - "\x7a\x19\xd3\x00\x70\x0f\xe8\x70\x21\xaf\x35\xe8\xff\x1b\xf5\x78" - "\xd9\x35\xdb\x8c\x3a\x30\xfe\x85\x60\x37\xbb\xd9\x76\x06\xde\x95" - "\xf8\x6d\xab\x92\x7b\xe9\x41\xe8\x7d\xab\x60\xdf\xb5\xbe\xef\xed" - "\xd5\x34\x19\x63\x21\xd7\xad\xe3\xce\xb1\x84\x2c\xbc\xce\xa7\xd7" - "\xb5\x9f\xd7\x02\x0c\x98\x78\xae\xd4\x2e\x9e\xd9\x03\x98\x16\x8c" - "\xeb\x21\xfd\x3b\x6b\xdb\xaa\xce\xb3\x9f\x63\x10\xe3\xf6\x97\x45" - "\x41\xd4\xc6\x7b\x50\x43\x8c\xef\xd8\x35\x9e\x67\x7a\xbd\x98\xdd" - "\xb7\xb7\x84\xf2\xa0\x3f\xe4\xa1\xbc\x9d\x5e\x9c\xc9\xf5\xb2\x2c" - "\x70\x5f\x5e\x42\xdf\xa0\x7f\x8e\x8a\x8b\x67\x0e\x38\x57\xd1\x90" - "\x53\xf4\xe2\x53\xdc\x47\xbc\x1f\xcc\xfe\x87\x48\xb3\x72\xdc\xfd" - "\x93\xf4\xe2\x23\xdc\x3f\x8c\x8b\xf0\xd9\xea\xa2\xdd\x79\xf7\xf3" - "\x99\x6b\xd6\x99\x9b\x4b\x61\x73\xaf\x60\x5d\x52\xfb\x11\xcf\xe1" - "\xf9\x7b\x49\x7c\xef\x59\x26\x34\xd9\xbf\x1b\xb9\x7f\x6b\x3f\xda" - "\xdc\x21\xb4\x4f\xbd\x24\x8e\x86\x89\x3e\x35\x51\x34\x62\x4a\x63" - "\xbc\x4d\x9e\x33\x7c\x2e\x7c\x0f\x05\xdc\x95\xec\xcb\x66\xd9\xb1" - "\x91\x6c\x7c\xa6\x9e\xbf\x05\xd4\x1a\xae\xa7\xd6\xe2\x7a\xfa\x5d" - "\xb4\x96\xfc\xeb\x38\x3e\xca\x4b\x5b\x7f\xef\xae\xe5\x3d\xb6\x6b" - "\x70\x3f\xdd\xf9\x6d\x59\xd7\x88\xdf\x1f\xff\x23\xfd\xde\xff\x47" - "\x72\x3e\x2a\x9f\xc7\x36\xe7\xfd\x8e\x9a\x73\x7f\x47\x9e\x76\xa1" - "\xf1\xbc\xae\xec\x29\xae\xa3\x12\xb0\xf6\xf0\xf9\x73\x9b\xd6\xe5" - "\x18\x8c\xf6\x9b\x79\xff\xa0\x35\x1c\x22\xff\xaa\x7f\x67\x1c\x7f" - "\xda\x70\x9e\x2c\xfe\x55\xbf\x91\xf7\x6a\xbe\x75\x66\x4f\x60\x59" - "\x1b\xdb\x94\x51\x3e\x7b\xcf\x7b\x92\x98\x63\x68\x55\x8c\x63\x4c" - "\xe1\x0d\x7a\x99\x8d\xf2\xb0\x39\x8d\xf2\x32\x56\xdc\x6e\xa6\x07" - "\x70\x6a\x59\xa0\x68\xd2\x8c\x91\x42\xc7\xf9\x23\x4f\x5e\x3c\x7d" - "\x5e\x6c\x66\xfa\x70\xcc\x56\x0d\xfd\x05\xdc\x72\x41\x03\xcd\xa8" - "\x03\x38\x5b\xf4\x35\x5c\xcb\x8e\xf3\x94\xe1\x5f\xc5\xdf\x82\x7b" - "\xe9\x36\xeb\x3c\xb3\x45\xbb\x78\xf6\x40\xd5\x05\x32\x73\xbf\xf1" - "\xbe\x4d\x95\x7c\xcf\x30\x5f\xe2\xfd\x1f\x1b\x78\x92\xf0\x33\xe3" - "\x67\x61\xbe\xc3\x95\xcf\x70\x56\x02\x87\xfd\xe8\xab\x3d\x7c\x55" - "\xbc\x68\xcf\xe1\xb8\x24\xfa\x1c\xaa\x2f\x1d\x72\x14\x15\xf2\x7b" - "\xcb\x90\x99\xda\xfd\x1a\xe4\x88\xd7\x70\x1a\x6a\x28\x43\xf3\xfa" - "\x22\xbb\xa1\xeb\xea\x6b\xe4\xb9\x64\x1b\xaf\x6b\xee\x94\xdf\xd6" - "\x78\xe9\x80\xa1\xfb\xbe\x3f\x9c\xcf\x6e\xd6\x9e\x30\xf1\xba\x8f" - "\xcf\xb9\x4f\xe7\xf3\x7d\xc8\x03\xfd\x7f\xbd\x3e\x86\xd6\xc8\xf9" - "\x05\xcb\x7e\x7f\xf3\x09\xd8\xb2\xcd\x62\x57\x1e\xf1\xfe\x4f\xc6" - "\x16\x11\xca\x68\xb7\x8a\xd6\x70\xb3\x3c\xb3\xdb\x1a\x8e\xc9\xfd" - "\x1f\xbc\x4f\x9b\x13\x0e\x59\x61\xfb\x1e\x63\xda\x19\xe9\xbc\x77" - "\xc4\xeb\x6a\x73\xc2\x22\x34\x77\x83\x95\xbf\x85\x39\x42\xee\x1d" - "\xe8\xe9\xad\x0e\xcc\x1b\x36\x84\xac\x68\x7b\xb4\x17\x56\x57\x5e" - "\x3a\xcb\x1b\xf2\x66\xf5\xe6\xed\xca\x33\xf3\xb7\x9d\xb9\xce\xb8" - "\xb4\x01\x73\xdd\x28\xcb\x7d\xa5\xa7\x29\x9b\xf9\xe5\x83\xbd\x73" - "\x4a\x3e\xbf\xd0\x85\x71\x73\x6d\x5e\x9a\xd6\x95\x67\x8a\x01\x36" - "\x78\xdf\x26\xbf\xc9\x19\x0d\xe9\xdf\xb8\xea\x80\xfc\xb6\x91\xa8" - "\x6e\x28\x47\x3e\x33\xc3\xe5\x58\x10\xfc\x6d\x10\x61\x7f\x2d\xb5" - "\xdf\xb6\xaf\x32\xc7\x5f\xf6\x28\xf8\xe9\x95\xc3\x2c\xcf\x31\xdb" - "\xc8\x83\xce\x27\xd8\x86\x79\x45\xfa\x06\xc4\x20\x63\x31\xfb\xc8" - "\x83\x13\x3a\x28\xad\x0c\x7c\xab\xd6\xa0\x5e\x79\x38\x00\x19\xf4" - "\x68\x02\x76\xe8\x2b\x33\x98\x6f\xac\x9d\xec\x2b\x37\xf2\x90\xf4" - "\x4f\xcb\xdc\x9a\x1d\x88\x74\x50\x73\xf9\x9f\xa9\x39\x1a\x28\x3f" - "\x7c\x3e\x64\x56\x7e\x6a\x66\x86\xbb\x92\xdf\x79\xc0\xab\x05\xb1" - "\x3d\xd4\xdf\xde\x00\xcf\x8f\x31\x86\xfd\x55\xcd\x15\x5f\x39\x6c" - "\xcc\x8b\xaf\xdc\x86\xba\x2c\x8e\x9f\x21\x84\x83\xb4\x9a\xc7\xf8" - "\x5b\x3e\x1e\xd1\xed\xa2\x09\x1b\x79\x4d\xee\x95\x4e\xcc\x51\x72" - "\x75\xb8\xe7\x14\x5c\xe4\xbf\x02\x5c\xe6\x99\xe6\x3a\xb9\x2f\x85" - "\x36\x3d\xe6\x8c\x01\x76\x2c\xf3\xb1\x25\xd0\xf1\x1e\xcf\xa7\xbc" - "\x66\xfb\xea\x23\xa8\xc7\xd9\x1a\x3d\x46\x1c\x87\xa7\x41\xc3\xf8" - "\x78\xce\x41\xba\x4f\x9e\xe7\x2c\xd5\x4d\xd7\x84\xcb\x86\xf9\x3a" - "\xef\xc7\x78\x58\xc7\xf1\x5a\x40\x59\x8c\x06\x06\x30\x32\x72\xec" - "\x08\xc0\x98\xfd\x21\xef\x7d\x41\x4f\xc4\x84\xc3\xf4\xde\x45\x8c" - "\xf4\xd0\x9d\x32\x96\x44\xc5\x17\x77\x0e\xdd\x42\xf7\x08\x93\x55" - "\xfa\x74\x6a\xd5\xde\x1c\xf4\x6d\xa5\xf2\x01\x74\x1e\x8a\xf3\xff" - "\x4b\x47\x5d\xd2\xff\x4f\xd8\x9c\xa5\xf5\x72\xdd\x71\xe4\xc1\x6e" - "\x6f\x5d\x38\x48\xaf\xc8\xf5\xd7\x6d\x7c\xc6\x43\xea\xd8\x57\x97" - "\x86\xec\x8b\x65\x9b\xf8\x2c\xab\xb6\x2e\x76\xa0\xea\x9f\xd2\xbe" - "\xe6\x77\x53\x5a\x3b\xbb\xfd\xc2\xb7\x58\x7e\x93\x4f\x87\x6d\x3d" - "\x4b\xaf\xda\x45\xf5\x62\xd8\xcf\xaf\x2e\x51\x7d\x23\xef\xc7\xf2" - "\xfb\x68\x8f\x0b\xf7\x75\xfb\xea\x2f\xf1\x5e\x40\xdd\x02\xe1\xfd" - "\xb2\xbf\xcb\xb6\x98\xe6\x3b\xd8\xa6\x7a\xb5\x24\x68\xfa\x5d\x96" - "\xbe\x0e\x28\xe3\x62\xf4\x37\x47\x12\xbb\x1c\x83\x03\x00\x82\xf9" - "\x6c\xd6\x69\xda\xf5\xc9\x25\x2f\x99\x7a\x60\x0b\x5e\x32\x91\x0d" - "\xf2\x95\xb1\xe3\x06\xca\xc6\xbb\x1b\x4e\xd3\xab\xbf\x8d\x9a\x28" - "\x0b\x3f\x5b\xe8\x8b\x85\xd7\x00\x6e\x2e\xaf\x91\xb6\x9c\xe7\x35" - "\xae\x9d\xf2\x9c\x72\xd5\x4e\x1a\xa5\x01\x1e\xef\xf7\x54\xdd\x40" - "\xa3\x78\x9d\x12\x69\xae\x82\x98\xda\xf7\x34\xd6\x22\x2a\x6e\xa0" - "\xb1\x89\xf5\xbe\x7a\x40\xad\x63\xee\x6a\x97\x73\xab\x10\x7d\x09" - "\x73\xab\x93\x80\xbb\x57\x78\xd3\x85\xf8\xa2\xc3\xa4\x7c\x13\x76" - "\x6e\xb7\xd6\x29\xbe\x93\xfb\x7c\xe0\x37\xde\x47\xd5\xf7\x94\xd2" - "\x64\x3c\x90\xcc\x31\xd3\xf8\x3b\xd4\x71\xeb\xc4\x36\x89\x87\x7e" - "\x86\x3f\x56\x71\x2b\xc7\x06\x93\x67\xf7\x0b\x96\xaa\xfd\x28\x3e" - "\xdf\x1f\xa4\x9d\x32\x1e\xe3\xb6\x9d\x94\xf1\xc2\x4e\xb2\xb5\xac" - "\x90\xed\x3a\xac\x64\xd1\x4c\x8c\xaf\xe6\x63\x39\x03\x4f\x00\x6f" - "\xae\x8f\x79\xa3\x35\x7a\xce\xef\x29\x11\x9a\xff\x09\xb6\x45\x77" - "\xc6\xfc\x6b\xf6\xd3\xdc\xf6\xa8\x3a\x8b\x9a\x4f\xa1\x46\xc0\x6b" - "\xbc\x81\x6c\xa7\x68\xd7\x35\x81\x22\xe2\xfd\x8a\x9b\xfc\x6b\x0e" - "\x02\xf6\xae\x1b\x79\x2c\xd8\x0e\xfa\xa8\x31\x61\xd7\xb1\x40\xa4" - "\x8d\x5a\x20\xdf\x73\x8a\x85\x84\x83\x3c\x0f\xcb\xf6\xee\x72\x38" - "\x0b\x54\x0c\x06\xd9\xd6\xde\x7d\x3e\xbd\x1d\x81\xf3\x12\x5e\x61" - "\x00\x5c\x62\xb4\xc9\xa0\xb5\xe2\xaf\x5d\x6f\xf8\xd7\xec\x25\xee" - "\x1f\xce\x8f\xe7\xda\x40\x27\xf2\x9e\x49\xec\x17\xce\x83\x77\x1f" - "\x02\xee\x37\xfa\xf6\xaa\x79\x0f\xb5\x2f\x4f\xfd\x4e\x3e\x8f\xb6" - "\xd3\xb2\x0b\x34\x52\x6b\xfb\xbb\x6e\x63\x5c\xd1\x77\xd9\x81\x92" - "\x3f\xa7\xf6\x49\x85\xec\x83\xef\xb7\xb4\xca\x3d\xbb\xfa\x91\x73" - "\xa2\x9a\x50\xfa\xac\xfe\xb8\x06\x3d\x10\xc4\x95\x75\x81\xd4\x27" - "\xe3\xd9\x0f\xa8\xfe\x4f\xd6\x34\xd5\xbf\xdc\x16\xb6\x57\x52\xf5" - "\x71\xdc\x7e\xa2\x8d\x71\x35\xfa\x98\xbf\xe1\xa8\xf1\x9e\x30\xfb" - "\xdb\xf7\x38\x48\xf1\x9f\xf0\x01\xee\x87\xba\xed\x16\xd1\xc7\xb2" - "\x48\x97\x7d\xa4\x3c\x1f\x69\xf8\x06\x43\x7e\x0f\x17\x28\x7f\x6e" - "\x07\xeb\xa8\x46\x93\xd0\x79\xb3\xfe\xb8\x5e\x36\xac\x7c\x32\xea" - "\x6b\x51\x3e\xe5\xba\x94\x48\x87\xde\xf1\x42\x4d\xa3\x3d\x6c\x47" - "\x0a\xe8\x2a\x8c\x07\x03\x03\xe1\x4b\xfa\xf7\x33\x77\x3f\x08\x9b" - "\x7a\x20\x9f\x8f\x32\x70\xbb\xba\xbd\xbf\xdd\x23\xd4\xdc\x66\x77" - "\xbe\xb1\xb6\x24\x6c\xa0\xb1\xd7\x2a\xf8\xac\x24\x9f\x77\x09\xdb" - "\x2b\x73\x43\xf6\x9d\xc5\x4a\x6e\x76\x6f\x85\x9d\x2a\xf5\x6d\x41" - "\x84\xca\xb9\x5d\xbc\xb7\x8b\x79\xd3\x40\x6e\x33\xe0\x60\xfe\x53" - "\x3c\x49\x8d\xe7\x0a\x76\xbf\x6b\x3b\x46\xdb\xd0\x26\xd9\x36\xb4" - "\x51\xb6\x4d\xff\xbe\xd4\x29\x6a\x18\x29\xd7\xcb\xaf\xae\x3d\x2a" - "\xbe\x8c\xaf\x32\x97\xbf\x9d\x7b\x8a\x1a\xdf\x95\x67\x60\xd0\x27" - "\x6a\x1f\xa4\xa1\x44\x0c\x7e\x61\xf0\xd5\xc1\x6c\xc8\x55\x30\x77" - "\x16\xbf\xc4\xb1\x28\xf5\x6f\xd4\x01\xf6\x6b\xa2\x7a\x67\xb1\x3c" - "\x63\x88\xfa\xf8\x1b\x9f\x7d\x7a\xa8\x71\x14\xf7\xd5\xf8\xfd\x94" - "\xab\xf8\xb0\xf1\x0b\xbc\xd6\xac\xe6\x79\x0d\x47\xa1\x7b\xb7\xa9" - "\x39\x95\xe1\x47\x9e\x26\xfd\xc8\xe3\x75\xec\x55\xe2\x28\xf5\x9d" - "\xc8\xdc\x82\x39\x64\xc3\x21\x79\x56\x12\xf8\xae\x8f\x1a\xfa\xaf" - "\xe1\x10\xfb\x24\xf5\xfa\x03\x6c\x00\xaf\x94\xa9\x73\xe4\xdd\xde" - "\xc6\x3c\xc3\x46\x91\xdf\x24\xf3\x8a\xa3\x9c\x6f\xee\x86\x73\xd2" - "\x5f\xa0\x4a\xc6\x3c\x38\xad\x9f\xb3\x6b\x7c\x4a\x5f\xd7\x70\xb1" - "\x0f\x3f\xca\xd6\x06\xe9\x03\x79\x26\x90\x69\xc0\x75\x4b\xdc\xe5" - "\x77\xc1\x1a\x0f\xf4\xed\xfb\x34\xc8\xef\xa6\x2b\xbf\xd6\xc6\xa3" - "\x06\x8f\xa0\xbd\x03\x55\x6c\xd0\x86\xdb\x8e\x8c\x25\xc9\x03\x5d" - "\xc2\x31\xf8\x2b\xf5\xcc\x93\x8d\xa1\x78\x3a\xcd\x8d\x6a\x1e\xa5" - "\x83\x1a\xda\x84\x94\xf5\x86\xb6\xcf\xb6\x27\xf6\x4c\x37\x6c\x11" - "\x45\x67\x1b\xf4\xcb\xeb\x36\x49\x6b\x9f\xad\x8d\x63\xb4\x6c\x2a" - "\xe3\x98\x53\xaf\x0d\xe0\xd8\x5e\x51\x9f\x2d\x12\xe3\x33\x99\x18" - "\x67\x35\x9f\xdd\x72\xaa\x98\x4c\x05\xc5\xbc\xd7\xb5\xe8\x18\xcf" - "\xaf\x84\x07\xb6\x40\x26\xec\x13\xc8\xf9\xe6\x95\x64\x5d\x54\x08" - "\xd8\x1e\x57\x16\xc7\xde\xe2\xb8\x5b\x1c\x3b\x2f\xe6\x71\x65\xe2" - "\x7e\x38\xec\x39\x9b\xb0\xd9\x3a\xd8\x5f\x26\xe6\x15\xd0\xc7\x27" - "\x38\xfe\x97\x29\x10\x8a\xd0\xe6\x33\x64\xe1\xd8\x5e\xd1\xea\x45" - "\x1d\xad\xe1\x8f\xe4\xdc\x62\x68\x31\xec\x69\x4d\x9e\xcb\x71\x68" - "\xf6\x45\xc7\x42\xf6\x45\xc7\x55\xbb\xcf\x09\xd5\x6e\x85\x37\xe3" - "\xaf\x74\xdc\x30\x4b\x99\xc4\xfd\xdf\x7e\x14\x05\x7c\xcd\xe7\x30" - "\xc7\x7c\x0e\x52\x67\x39\x9b\xa9\xac\x44\x74\x04\x60\x1b\xb3\xff" - "\x26\x9f\xd7\x65\x7f\x1c\x6e\x23\xb7\x8f\xeb\xfe\xfd\xf9\x33\x32" - "\x56\x59\x14\xcf\x9e\x22\xbd\x4c\x27\xca\x74\x36\xd3\x25\x9f\x43" - "\xb6\xbd\x35\xac\xca\x16\xc8\x7b\x2e\x1f\x47\x07\xbd\xcd\xbd\x74" - "\x40\xdb\xb9\x7d\xdc\xfe\x28\xd3\x04\x34\xd0\xdb\xea\xe8\xd1\xdb" - "\xc9\x6d\xfc\x1d\x46\x9d\x9d\x68\x27\xda\x2a\xdb\xd9\x83\x76\x1e" - "\x2d\x24\x8a\xd4\x54\xce\xfb\x34\xd3\x41\x3c\x3f\xf4\xfc\x01\x76" - "\x74\xa9\x8f\x30\x0f\x34\xff\xb4\xcc\x67\xfa\x3e\x6c\x93\xb2\x10" - "\xe6\x83\x21\xd1\xc1\xf6\x7e\xa0\x18\xbf\x68\xbd\xb4\x71\xa4\x7d" - "\xcc\xdf\x88\x7d\x1a\x6d\xd2\x3e\xa1\xb2\x0e\xd1\x01\xdb\x34\x12" - "\x88\x22\x4f\x21\xda\x8f\xf9\xe3\x29\x1d\x7f\xce\xbb\xf9\x9f\xaa" - "\x5d\xd6\x22\xca\x7a\xff\xd1\x4a\x53\xa0\xad\x92\x8c\xb6\x2c\x46" - "\x3e\xb4\xc7\x01\x58\x43\xe4\x77\x19\xd0\xce\x5d\xc0\x33\x12\xd7" - "\xa6\x96\xce\x08\x60\xfe\x89\x06\xcf\xa3\xb4\x9d\x67\xd1\x8e\xb3" - "\xe4\xf0\x95\xc1\xfe\x7a\x88\xed\xc5\xd7\x3e\xbe\x36\x8f\x46\x05" - "\x69\x4f\x87\xe2\x3b\x19\x37\xe8\xba\xd3\xf4\xfa\x35\xbd\xb1\x81" - "\x38\xde\x9a\x7d\x51\x27\xf3\x91\x8c\x11\xc4\x63\x46\x37\x78\x86" - "\x7d\x69\xd6\xa3\x8e\x6e\xd7\x70\x89\x8f\x77\x22\xe1\x39\x03\xcf" - "\xfc\xcd\xa8\x2c\x5e\x13\x40\xb9\x0e\x01\x9a\x31\x7c\x51\xbd\xe8" - "\x38\x5f\x99\x86\x29\xcf\x9a\xfc\x8c\x72\x50\xc7\x21\x9e\xfb\x1e" - "\x28\x0b\x99\x9e\xfd\x19\x8d\xbd\x3a\x9d\xf2\x7a\x4e\x7f\xfa\x9b" - "\xf7\x2d\x18\x1e\xda\x96\x79\x9a\xf6\xde\x98\x28\x63\x4e\xa9\xcb" - "\x94\x1e\x7c\xbd\x9d\xf7\x0a\xae\xb2\x5e\xa9\xff\xd8\xe7\xe9\x2a" - "\xcb\x75\x18\x78\xe0\x7e\x6f\x7f\xb8\x5f\x3d\x1d\xf6\xe6\xf6\x07" - "\x6b\xfb\xcb\x32\x5e\x9c\x67\xc7\xcb\xec\x8f\x58\x99\x73\xc4\xc1" - "\x31\xbc\x31\x76\xee\x0d\xd3\xda\xdd\x64\xf1\x9c\xe1\x35\x99\xd9" - "\x74\xa4\x3e\x9b\x1a\x30\x27\x17\x5d\xae\xcc\x17\xcf\xb3\xef\x83" - "\xd2\x21\x6c\x93\xf2\x59\x4a\xb1\xd6\x65\xab\x7a\xd9\xb0\xe1\xdf" - "\xb8\xa6\xf4\x02\x99\xd4\x37\x52\xde\xb0\x4c\x73\x8a\x68\xad\x49" - "\x2b\xac\xe7\x98\x57\x99\x5e\xde\xb3\x2f\x34\xe2\x48\x49\xdb\xc7" - "\x0d\x99\xeb\x72\x0c\xde\xbe\x86\xc6\x72\xec\x3b\x6b\x48\xd9\x72" - "\x6a\xbc\x7e\x83\xc7\x14\x9b\xbe\xdf\x6f\x53\xb1\xa5\x5e\x2f\x6f" - "\x3c\x8f\xba\xd4\xfb\x95\x31\xcc\x61\x24\xdc\x35\x34\xaa\xfe\x3c" - "\xb9\xd8\x0e\x2a\xf8\x44\xd9\x6c\x3c\x2f\x9c\xdd\x69\x15\xb1\xff" - "\x72\xd1\xee\xd3\x7d\xb1\xf1\x42\x6b\x39\x9e\x9e\x70\xf4\xb7\x57" - "\x52\x35\x5c\xfa\xfc\xc8\x78\x2c\xea\x1b\x7a\x44\xb5\x35\x64\xe6" - "\x6f\xc6\xf2\x5a\x1e\xaf\x0d\xf3\xb9\x1f\x35\x86\xbc\xd1\x66\xc4" - "\x0c\xeb\x77\x1f\xd1\xa7\xe6\x3b\xda\x40\xcc\xbf\x42\xdd\x7e\xff" - "\x3a\x1e\x33\x7e\xe0\xe4\xb3\x46\x7d\x73\x9c\x1f\xa4\xf1\x3b\x4e" - "\x63\x5f\xf8\x5c\x49\xcb\x1f\xcc\xe0\x79\x8f\x3e\x67\x7c\xdf\xd9" - "\x9b\xa6\x6c\x18\x1e\xcb\x18\x87\x46\xb5\x8e\x3c\xb4\xdb\xfb\x83" - "\x65\xc6\x78\xc6\xe3\xba\xfa\x5e\xed\x0f\xdc\x41\x53\xf3\xac\x2b" - "\xe0\x67\xd3\xbf\xf7\xcc\xb1\x11\x72\x91\x7f\x9f\x31\xbe\xc9\xef" - "\x91\x54\xdc\x70\xef\xda\x0d\x34\x62\xfe\x17\x2c\x32\xf6\x06\x7f" - "\x77\x54\x8d\xbb\x3f\x38\xd6\xb7\x9f\x96\x2b\xe9\x2d\xbf\x35\xc8" - "\x73\x0c\x13\xc6\x60\x15\xff\xae\x53\x8d\xbf\xc6\x39\xf7\x1f\x9c" - "\xe9\xab\xe7\x87\xb6\xde\x71\x14\x75\xb0\x5f\x07\xc3\x57\xb6\xc9" - "\x0f\x9a\xb8\x0e\x9e\x5b\xa9\xf1\xf5\x07\x4d\x57\xb0\xc5\x5c\x4c" - "\x5f\x4d\x9f\x4f\x06\x3a\xff\xae\xe8\xeb\xa6\xf4\x09\xb5\xe4\x78" - "\xbf\x2c\x68\x1e\xaa\xe2\x38\x59\x4f\xd2\x0f\x97\xf2\x7b\xe6\x75" - "\xff\x78\x5e\x8b\xfb\xe1\x7b\x01\x1e\xb7\x7b\xf2\x32\xe6\xf0\x5c" - "\x5f\xda\xe2\x3f\xdc\x3f\x0e\xe5\x90\x96\xf9\xeb\xb3\x11\x73\xd5" - "\x46\x1a\xcb\xdf\xf4\x44\xba\x5c\x27\x08\x5d\xff\x64\xf7\x57\xb2" - "\xc8\xf1\x95\x5a\x3e\x0f\xf0\xc3\xe3\x98\x5f\xca\xb3\xe9\xb2\xfe" - "\x9a\x86\x3d\x1c\xfb\xef\xcd\x4b\xc1\x01\xaa\xaf\xf6\x3d\x8d\x67" - "\x57\xdc\xf3\x10\x63\x2d\x3f\x48\xfb\x8a\xe5\xde\x25\xfb\x3c\xaf" - "\xe2\xf1\xba\xc2\xd9\xe7\x27\xb4\xef\x69\x85\xcb\xbe\xa7\x8f\x14" - "\x13\xaf\x55\x1f\x6f\x90\x71\xbc\xf6\x4d\x0b\xd2\x0f\xb6\xea\xeb" - "\x31\xc7\x24\x5f\xb1\xbd\xfb\x1c\xcf\xc1\xfe\xee\xdf\x8e\x7c\x3c" - "\x4e\x14\xb8\x29\x57\xd9\xf0\x15\x39\x1a\xf8\x27\xae\xfd\x1f\xf1" - "\x5a\x5f\x4a\x9d\xb8\x93\x48\x96\xa9\xf6\x16\x4b\x9f\xb3\xea\xd7" - "\x78\x9e\x64\x11\xd5\x5b\x9d\xb8\x66\x80\xe7\xb2\x71\xe5\x31\xdc" - "\x85\x6b\x96\xa8\x6e\x08\x32\x5f\x62\x0e\xeb\xc0\x3c\xc1\xd2\x65" - "\xf7\x16\xf6\x77\x56\x91\x69\x13\xd8\xfa\x6d\x52\x3e\xb4\x3f\x5a" - "\xd0\x12\x82\x7d\xb6\x9b\x68\x6d\x54\x5c\x72\x7e\x89\xcf\x04\xfd" - "\x68\x81\x67\x37\xfb\xae\xfc\xc8\x95\xe8\xbb\xf2\xa3\x19\xf8\x55" - "\xe2\x77\x82\xe8\xc7\x19\xb8\x2e\xe8\xfb\xfd\x78\x46\xb7\xf7\x47" - "\x0b\x40\x47\x69\x63\x5d\x9d\x4e\xe4\xf2\xe8\x07\x9e\x17\xd9\x1f" - "\xb3\xa9\xf6\xee\x9c\x87\x67\x8b\xb0\x37\xf8\xf4\xf6\xe6\xe2\xd9" - "\xe6\xf4\x60\x5c\xb3\x83\x26\x37\xa0\xcd\xf6\xd7\x88\xdb\xcb\xf8" - "\x76\xd9\xb7\x3a\xe3\xcf\x69\x32\x4c\x6e\x7f\xc8\x8e\x72\xa0\xa5" - "\x18\x3f\xda\x6f\xd0\x53\xa7\x13\xef\x1b\x99\xba\x00\x43\xd9\x41" - "\xc8\x0f\x18\x46\xfe\x5e\xda\xdf\xc0\xdf\xd7\x40\x9f\x22\x1f\xe6" - "\xc4\x16\xe3\x0c\x68\xb7\xf7\xc7\xb9\x1f\x14\xa9\xfd\x03\x2e\x1b" - "\x8e\x2b\xcb\x31\x2f\x52\x95\x47\x9d\x16\x55\xe7\x56\xe7\x29\xfa" - "\xd1\xc3\xaa\xde\x1f\x4f\xec\x4f\x96\xca\x46\xc2\xbe\xab\x0f\x72" - "\x5c\x0c\xb6\x87\x26\x05\x46\x84\x29\x50\xaf\x61\xcc\xaf\x98\x97" - "\x5b\x26\xfc\xa7\xe8\xc7\x17\x5a\x23\x1d\x57\x39\x1e\xfe\x58\xfa" - "\x64\x89\x4b\xe5\x14\x28\xbd\x5d\x7e\xcb\xfa\x2c\xed\x1f\x1d\x08" - "\xc9\x98\xf0\x7c\x2f\x63\x8b\xb2\x9f\x06\x8f\x0d\x98\x63\xf7\xc6" - "\x54\xd4\x90\xb7\x81\xd3\x91\x16\x08\x87\x64\xec\xc5\x3e\x3f\x72" - "\xaf\x4b\xc9\xd4\x4f\x3e\x92\xf1\x17\x18\xdf\xe8\xfd\x7e\xc6\x59" - "\xf3\x79\x5d\xdc\x06\x0f\xe6\x7f\x81\x68\xb7\x9f\x65\xc2\xb9\x8e" - "\xd7\x0a\x7f\xf2\x2e\xf8\x4e\x68\xd5\x5e\xd7\xd5\xb5\xe1\x27\xf2" - "\x3c\x90\x27\x2a\xce\x86\xec\x5e\x17\xdb\x24\x55\x65\x03\x2c\x53" - "\xeb\x85\xbf\x2b\xb3\x62\x5e\xb7\xf7\x27\x27\x3e\x70\xab\xbe\xb9" - "\x4a\xb8\x27\x8c\xb6\x37\xe8\x6d\x47\x9a\xdc\x9b\x9b\x50\xa7\x62" - "\x4d\x06\x69\x7f\x56\xbf\x6b\x56\xe8\x67\xb6\x07\xd8\xc7\x55\xd1" - "\x62\xff\xb2\xde\xb1\xe1\xaa\xf0\xd8\xbf\xec\x73\xd4\xd1\xa3\xd7" - "\x71\xf4\xbf\x59\xc7\xd1\x2b\xd5\x01\xdd\x70\xe3\x69\xfa\xe9\x82" - "\xab\x9f\x3b\xfe\xd4\x29\x79\xc5\x57\x91\xab\x74\xe6\xcf\x3e\x8c" - "\x61\xfe\x16\xb5\xed\x9c\x27\xbf\x3b\x65\xa2\x72\x8e\xbb\x19\xf5" - "\x3d\x66\x6b\x71\x5f\x22\xff\xba\x3f\x52\x3b\xfd\x54\xc6\xba\x6b" - "\x29\xe1\x39\x5b\x83\xaf\xa7\xa6\x62\x4f\x8f\x69\xff\x5e\xa6\xf7" - "\x6e\xf4\xc3\xae\x38\x3e\x6b\x0d\xff\x91\x02\x4b\x78\x7d\xf5\x18" - "\xaf\x6b\xfb\x84\x7d\xe7\x3c\x0d\xba\x01\x36\x7a\x4c\xd2\x03\xf6" - "\x8b\x9a\x6f\x55\xe6\xc8\xf9\x56\x48\x9e\x4f\x1c\x22\xe3\x69\x7a" - "\x57\x87\x79\xed\x3b\xd6\x93\xe7\xec\xf6\xd2\x3c\x8e\xb3\xc9\xeb" - "\xce\xc2\xe6\xac\x9d\x1b\x4d\x17\x72\x3e\x05\xdb\x9f\xe3\x6c\x06" - "\xc2\x41\x8a\xc1\x8e\xae\xbf\x48\x59\xf5\xb0\x3d\xa1\xb3\x6d\xac" - "\xd7\x1b\xf5\x58\x9b\xdb\x2f\xf6\xc5\xda\x6c\xe0\xb5\x9e\x36\xdc" - "\x5f\x24\x73\xac\xba\x32\x67\xd7\x45\x1a\xb5\x7b\x1d\xb9\x76\xf1" - "\x5a\xde\x3f\x94\xed\xc3\x76\x85\x8c\xbb\xb9\xda\xc5\xeb\xf9\x7d" - "\xb6\xcf\x7a\x8e\x0b\xdc\xab\xb7\xcc\x72\x0d\xe4\xaa\xe8\xfd\x33" - "\x39\x0e\x46\x7d\xde\xe2\xa8\xed\x35\xea\xa9\xd9\xea\x44\x1f\x34" - "\x81\x7e\xb9\xa9\xfa\xd6\xf0\xc3\xaa\x8d\x8b\x95\xfa\xc1\x28\xa5" - "\xdf\x83\xf4\xa6\xa5\x3f\x9e\x88\xed\xca\xa3\x09\x9d\x94\xad\x7c" - "\x1a\xae\xc1\x98\xf8\x66\x11\xef\x9f\x97\x3d\x45\x8e\xd8\xae\xfc" - "\x34\xcf\x6b\x94\xce\xdf\x39\xe7\x5f\xd9\x3f\x45\xc7\x84\x22\xca" - "\xe6\xfd\x07\xf6\x7b\x70\x6e\x92\xf9\x27\x8f\x2a\xa5\xec\x78\xd8" - "\x33\x94\x63\xd4\x5d\xce\x99\xab\x1e\x5f\xfd\x54\xf1\xd2\x92\x95" - "\x8f\xad\x2c\x5a\x59\xb2\x41\x86\x50\x18\x2b\xff\xdd\x37\x7a\xd9" - "\x02\xb9\xe9\x1c\x67\x5f\x8c\xea\x5b\x8f\x7b\xf3\x42\x94\xd7\x0f" - "\xae\x8a\x5e\x6f\x4a\xfd\x57\x0f\x5b\xaa\x5e\xfa\xee\x1c\xb0\x04" - "\x4d\xbf\x97\xe7\x62\xb7\x21\x6d\x9b\xee\x63\x73\x4a\xcf\xa7\xf9" - "\x1a\x82\xe0\xe3\x49\x27\xe9\xe7\x51\xde\x0f\x41\x5f\x65\x07\x4a" - "\x4f\xf3\x5c\x72\x12\xaf\xf1\xb7\xf0\x5a\xc6\x1a\xce\x7f\x60\x33" - "\xfb\x30\xb0\x3f\x14\xf8\x70\xef\x49\xfd\x59\xff\x66\xfa\xae\xe8" - "\x6a\xc7\xde\xe8\x39\xc7\x0f\x84\xc8\xdb\x29\x56\x17\xee\x12\xe7" - "\x0a\x77\xc6\xc5\x7f\x1b\x88\xf2\xd5\x90\x93\x6f\xe0\x77\xbd\xf0" - "\xd9\x5d\x90\xbf\x11\xa7\xe9\xc0\x1b\x8c\xc3\xec\x42\x71\xae\x2f" - "\x16\xc2\x81\x77\xf1\xdc\x83\x9f\x26\x7c\x99\x33\xe2\xf6\xd7\xf8" - "\xdd\x47\x9c\xbf\x78\x05\xfb\x84\x1d\x38\xc3\x78\x89\x9a\xcc\xfb" - "\x43\x9e\xc2\x74\xe4\x8f\x29\x3c\xdf\xba\x26\xb0\xb5\x95\x9c\x8f" - "\xc9\x7b\x8b\xff\x09\xb6\xe7\xde\x7a\x4d\x98\x3c\x82\xf7\xe0\x02" - "\x1d\x51\x52\xe7\xd5\xde\x74\xb3\x0f\x42\x03\xec\xed\xfa\x4c\xb2" - "\xf9\x32\x29\xa3\xdb\xfb\xd6\xc4\x5e\xff\x0b\x9b\x1a\x6f\x79\xcc" - "\xe3\xd8\xd9\xd0\x47\xdd\x3c\x7e\x32\x1e\xcc\xc3\x80\xb9\x84\xf7" - "\xe7\xd4\xf9\xa8\xb7\x8a\x60\x5b\x3a\xae\x5e\x1f\xbf\x25\xbf\xa7" - "\x32\x61\x1b\x2d\xe1\x35\x6d\xde\x77\xe6\xd8\xd2\x90\xd7\x4a\x35" - "\xdf\xf8\xf9\x9f\xe4\xbe\x3a\x74\x0a\xef\x97\x34\x96\xc1\x4e\xb0" - "\x39\xb7\xb1\x7d\x13\xf5\x52\x39\xef\x6d\x6a\x17\xcf\x1c\xe0\xfd" - "\x68\x79\xb6\x50\xc6\x64\xff\x1d\x35\x5e\x20\x73\x3b\xbd\xc5\xdf" - "\xea\xb6\xf5\xd1\xf5\xe7\x77\x32\x0c\x51\x63\xf5\x5b\x4b\x4d\x95" - "\x0c\x43\xbb\x78\x36\xc7\x28\x07\xda\x0d\xe2\x72\xe0\x83\x1b\x65" - "\x39\xce\x2b\x63\xa2\xd8\xf2\x85\xcd\x5b\x2c\xeb\x54\xcf\xf3\x04" - "\xe4\x30\x7a\x31\x76\x00\xf7\x0b\x98\x4e\xb8\xe6\xc9\xb5\x5f\xcc" - "\xd7\x65\x2c\x1e\xdb\x62\x0a\x04\xff\xee\x97\xf8\xb0\x2f\x6e\x09" - "\x74\x96\xb4\x07\x7f\xfe\x74\xc3\x27\x64\x2e\x7e\x82\xfb\xef\x17" - "\x72\xdd\x1f\xfc\xb4\x4f\xe1\xf7\x8b\x01\x5d\x35\x0e\xea\xb2\x55" - "\x64\x87\x4d\x16\x3a\xe2\xe0\xb3\x03\x0d\xc1\x23\x8e\x4b\x98\x53" - "\xfc\xbc\x39\x68\xb6\xea\x67\x2d\x54\x39\xde\x27\x86\x9d\xda\x91" - "\xee\xb0\x79\xf0\xbe\xd3\xf0\xbb\x80\x4d\xda\xb1\x1d\xef\x40\xdb" - "\x26\xa6\x5b\x90\x0e\xe4\xb6\x16\xa9\xb3\x19\x78\x1e\xc8\xe7\xed" - "\x25\xad\x2b\x9e\xec\xb0\x6e\xf1\xf3\xf9\xcf\x1c\x6b\x34\xd7\xc4" - "\xfb\xc0\x7c\xee\x9f\x63\x21\xf0\xd9\x7f\x5e\xcb\xd3\xdf\x67\x27" - "\xbd\x1f\x6b\xbc\xef\xf6\xfe\x62\x99\x71\x66\x9f\x63\x2a\xb1\x8f" - "\x41\x4c\xf7\x15\x94\xb1\x86\xce\xab\x7d\x54\xf6\x15\xe4\x75\x44" - "\x3e\xf3\xc8\x7b\x9d\x28\x57\xdf\xeb\xbb\x29\xcf\xfa\xfc\x62\xbf" - "\xe1\x1b\x85\xfb\x43\xbd\x7e\x3d\xa0\x45\x97\xaf\xc2\x15\xb6\x35" - "\x04\xc3\x3e\x6f\x21\xde\x1d\x87\x3e\xec\x37\x16\x91\x9c\xfb\x71" - "\x4c\xe6\x67\xc8\xa4\x65\x3a\x0f\x71\x8c\x8e\x23\x61\xd2\xcf\x39" - "\x1f\xbc\x43\x3f\x13\x9f\x7e\x96\x7e\xf1\xcf\xbe\x3d\xc7\x98\xbe" - "\x5e\x76\x30\x5f\xd9\x6b\x07\xf3\xe5\x7a\x59\x4d\x85\xed\xf5\x8d" - "\x11\xd3\x81\x8d\x41\x93\x3a\xfb\x70\x70\x5e\x90\x0e\x6f\x35\xfc" - "\x56\x90\xcf\xd6\x5f\xec\x35\xe1\x1b\xb3\x4d\xc1\x7c\x5b\xae\x27" - "\xf6\xcd\x7f\xde\x96\xbe\x41\xbc\x3f\xa8\xf1\x58\x99\xf9\x98\x53" - "\xfa\x60\x14\x9f\xe7\x75\xb3\x81\x6a\x2e\xf6\xb6\xfe\x2d\x29\xe9" - "\xeb\x39\xec\x74\xe2\x73\x26\x3f\x2b\x9a\x1d\x0c\x1a\x6b\xf0\x3b" - "\x4c\x1a\xc7\xe5\x16\x9e\x3d\x22\x1c\x28\x0e\x13\xec\xb0\x50\x00" - "\x63\x2f\xea\x10\xc5\x6b\x38\x6e\xfe\xdb\xd7\x31\xed\x95\x4c\xbd" - "\xfd\xbc\xc4\xc9\x7b\x8f\xf0\xb0\xfd\x19\x62\x1f\x90\xf3\x84\x7c" - "\x76\xe4\x9b\xd2\x54\xda\xc9\x7e\x2c\xe5\x1c\xf3\xb0\x5d\xaf\x3b" - "\x64\x1f\xb3\xed\x2b\x19\xb4\xa4\xdb\xfb\x36\xec\xff\xe7\x72\xaf" - "\x5e\xce\xdf\x5e\x70\x25\x5b\x44\x8d\x8d\xb9\xd4\xdf\x7c\x86\xe7" - "\xab\xe3\x51\xff\x6c\xc1\xf8\xff\x72\x4a\xd4\x14\xa1\x1e\xd3\x20" - "\xf1\xd5\x72\x37\xf4\xc0\x20\x11\xdb\x88\xfe\xea\x72\xc0\xde\x6d" - "\xa6\xd6\x68\x93\xf4\x11\x81\x0c\x5b\xcb\xc2\xe2\x7c\x20\x7a\x50" - "\xfa\xf7\xaa\x73\xf0\xbf\xbc\x33\x10\x7d\x8f\x5a\x8b\x43\xe4\x5f" - "\xf3\x47\x8c\x59\xbf\x1c\xcd\x78\x8d\x2f\x2e\xa7\x71\x67\xf9\xfd" - "\xdb\xed\x6a\x9c\xfc\x65\xae\x7e\xb5\x71\x6c\xcc\x78\x9c\xee\x7b" - "\x66\xd5\xe3\x25\x2b\x57\xaf\x1a\x37\x6b\xf9\xba\xe5\x45\xce\x87" - "\x94\xcb\x5d\xc2\xf8\x65\xe9\x8b\xff\xfd\x4e\x06\x8f\x29\x6c\xab" - "\x70\x1c\xf0\x2b\xc5\x00\x37\xe2\x7f\xc3\x6e\x18\xc5\xeb\x7b\xff" - "\x9b\x31\xc0\x0d\x5b\x84\xe3\x7f\xf7\xad\x75\xbf\xd3\xdc\x2b\x03" - "\xda\xfb\xdd\xfc\xcc\x67\x3f\x35\xef\x2f\x67\xb1\x1c\x35\x48\xff" - "\xb4\x77\xa6\xc5\xc7\x4a\x62\x5f\x3c\x5e\x1f\x41\x7a\xbe\x71\xce" - "\x16\xbc\x88\x71\xe3\x9d\xa2\xbe\x73\x3f\xef\xb8\xd1\xdf\x87\x94" - "\xfc\xca\xbc\x95\xc6\x9e\xb0\xfe\xdd\x35\xb9\x87\xad\x79\x7b\x72" - "\xd5\x3a\xcc\x3b\xdb\x1b\xb4\x41\x16\xb5\x07\xf0\xce\x41\xe3\x4c" - "\x99\x92\xcd\xf7\x75\xd9\x7c\xa7\xf9\x4a\xfb\xf6\x7d\xb2\x71\xc8" - "\xd2\x27\xd7\x7f\xd5\xcb\x1e\xb2\x7c\xd6\x9e\xbf\x6e\x0f\x5f\x77" - "\x9a\xfe\xfd\x46\x5e\x9b\xc1\xfd\x97\x71\x3f\x40\x8e\xb5\xd2\xbf" - "\xfe\xdd\x8f\xf5\x7b\xd4\xf1\xee\x6f\xf5\xfb\x2f\xe2\xfe\x2d\xfd" - "\xfe\x06\xdc\xbf\xaa\xdf\x43\x66\xdf\xdd\xa2\xdf\x67\xe1\x7e\xa5" - "\x7e\x0f\x9d\xff\xee\x83\xfa\xfd\x70\xdc\xdf\xa9\xdf\x7f\x01\xf7" - "\x23\xf5\x7b\xc8\xe0\xbb\xd7\xe8\xfb\xa7\x16\xe0\x7e\xe1\xea\xed" - "\xf3\x43\x7e\xb5\x47\xf7\x2e\xc1\x16\xda\xab\xc6\x8c\xde\xb4\x2c" - "\xf0\xf4\x32\x83\xbe\x48\xe7\x98\x81\x16\xa4\x8f\x0d\xd2\x1b\xed" - "\x71\xe9\xfb\xf4\xfc\xd3\x30\xde\x04\xe3\xd2\xeb\xf5\xf4\x7c\xd8" - "\xa0\x96\xb8\x74\x9f\x9e\x5e\x02\xbd\x58\x18\x97\xae\xc7\x75\x78" - "\x77\x5b\x90\xf6\x38\xe2\xd2\xdd\x7a\xfa\x5e\xc3\x5f\x41\x4f\x2f" - "\xd2\xd3\x0f\x23\xfd\x68\x5c\xfa\x12\x3d\x1d\xfa\xff\x9d\xb6\xb8" - "\x74\xb5\xae\x20\xcf\xa2\x59\xc5\x91\x52\x96\xad\x77\x23\x41\xda" - "\x7d\x28\x2e\xcf\x0c\x55\xf6\xdf\x6d\x41\xaa\x8f\x6f\xcb\x24\x3d" - "\xdd\x15\xa4\x7f\xec\x89\x4b\xcf\xee\x4f\x57\xa5\xd5\xd1\x92\xfe" - "\xd6\x30\xf9\x3b\x55\xd2\x4f\x52\xda\x96\xbf\x5a\xce\xe7\xd4\xac" - "\xbb\xc5\x49\x67\x99\x10\x27\xe9\x57\xb3\x74\xff\xc0\x52\xf6\xd7" - "\x52\xe7\xfd\x7e\x35\x51\x9e\x01\x63\x9f\x73\x3e\x03\xb8\x91\xd3" - "\xfe\x5d\xc6\x3e\x99\xe0\x2e\x57\x31\x39\x95\xff\x69\xa7\x9c\xcb" - "\xeb\xfb\x9c\xc8\xf3\x31\xaf\x6d\x32\x1c\x5e\xef\x0b\x94\x5c\x92" - "\x3e\x91\x3c\x97\xe2\x34\x9e\xd3\xca\x73\x61\x71\x73\x2a\xa5\xf7" - "\x7f\xb5\x5c\xe3\x73\xfb\x5e\x35\xef\x67\x59\xe4\xfc\xec\x9b\x13" - "\x9f\x37\x48\xbf\x92\x73\xd3\x74\x87\xfd\xff\x74\x7b\x7f\x35\xad" - "\xef\xac\xd2\xbf\xd7\xeb\xe9\x7f\x42\x7a\x7e\x5c\x7a\x65\xff\xba" - "\x1d\xfa\xce\x66\xb3\xf4\x5c\x14\xe1\xe8\x45\x11\xd9\xf1\x17\xe0" - "\xbd\x42\x9e\xbb\xf9\x52\xcc\x67\x73\xe8\x31\x30\x3e\x8e\xae\x13" - "\x21\xe8\x6c\xfe\xc6\xc4\xb5\x73\xc2\x21\x9a\x53\xdc\x2d\xb6\x3f" - "\xc6\x7e\x76\x17\x64\x3c\x28\x4f\x27\xc7\xdf\x66\xdf\xad\x30\xef" - "\x0f\x65\xb4\x62\x8c\x6b\x58\xc1\xef\x3f\xa2\xd9\x85\x21\x6a\x29" - "\x8c\x51\x03\x60\xef\x7e\xcc\xf0\x9b\xfc\x55\x6f\xfc\x1f\xc6\x81" - "\xeb\xf3\xc8\x6f\xc5\x1c\x1e\xc7\xb8\xf2\xb7\xf0\x44\xf5\x6b\x36" - "\xf1\x1b\xb6\x65\xbd\xd9\xd6\x2d\x84\x39\xd5\xe1\x1c\xdc\x3b\xd5" - "\x0f\xef\x90\xde\x5f\x9b\x94\x2c\x1f\xd6\xfd\x31\x6d\x95\x4a\x5f" - "\x1c\x2e\x11\xff\xc6\xe7\x8e\x0e\xf3\xf9\x27\x0b\xec\xe6\x94\xfe" - "\x57\x9b\x77\x93\xa9\xa7\x06\xb6\xc9\xd9\x43\x26\xa5\x9f\xde\x5b" - "\xa6\x99\x2c\x5b\x78\x5d\x51\x7e\x27\xa2\xc6\x79\x74\xff\xaa\x88" - "\xa9\x65\x63\x3b\x6d\xfa\x02\x39\xf2\x23\xec\x4b\x7e\xf8\x93\xa1" - "\x25\x1c\x5b\xb4\xc2\x06\x3b\xd4\xf4\x0b\xbc\xff\xf5\xaa\x43\xa6" - "\xa8\xb4\x57\xde\x5b\x26\xd7\xa2\x7c\xce\x7a\x1e\x43\x02\x6d\x31" - "\x3e\x7b\x24\xed\x64\xe8\x7f\x4b\x6c\x7d\x61\x66\x74\x6d\xe1\xb5" - "\xbb\xd7\x50\x46\x6c\xad\x2b\xeb\xc5\x8b\x94\x63\x8c\x3f\x98\xc3" - "\x66\x8b\x6e\xc7\xe0\x2a\x8c\x29\x3c\xc7\x1d\x9a\x66\x93\x7b\x6e" - "\x7c\xaf\x99\x5e\x1f\xd5\xb0\xee\xca\xdf\xbc\x89\x61\x6e\xcb\xb1" - "\xa7\x19\x97\x54\x6d\xdd\xb6\x13\xf3\x65\xfd\x9c\x6c\xd9\x27\x34" - "\x1c\xf3\x16\xd3\xd0\x0b\xc2\x7f\xba\x88\x4c\xfc\x9d\x90\xb2\xe5" - "\x72\x1d\x69\x40\x4b\x61\x94\x02\xee\x3f\x53\xd9\x1a\xee\xa3\xf7" - "\xde\x65\x3b\x8d\xfd\x26\x91\xdf\x76\x9a\xde\xfb\xad\x35\x82\x31" - "\x23\x02\x5b\xfa\x09\x9e\x13\xbe\xf7\x51\x58\xc6\xbe\xfd\xb5\x93" - "\x7d\xc7\xfd\x6b\xee\xe5\xb4\x4f\x3d\x9f\x48\x1f\x89\x72\x25\x5b" - "\xef\x1d\xe7\x67\x0f\x9f\xdb\xcd\x1c\xdd\xf4\xb3\x4b\x91\x01\x6a" - "\xad\xe2\xff\x63\xef\x7b\xe0\x9a\xb8\xb2\xfd\x6f\x02\x5a\x6a\x51" - "\x02\x8d\x94\x2a\x6d\x63\xd7\x3f\xa9\xff\x4a\xf7\xd9\xb7\x6e\xab" - "\x5b\x6a\x75\xd7\xf6\xf9\xaf\x5d\xed\xc6\xfa\x0f\x2d\x6c\xd1\xf5" - "\x4f\x44\x44\x44\x04\x8c\x96\x47\xbb\x8a\xd1\xa2\x8b\x16\x11\xf7" - "\xe9\x2e\xed\xfa\x87\xdd\x67\xdf\xd2\xae\xd5\xd8\x62\x0b\x16\x08" - "\xb5\xd8\xa2\x05\x9b\x52\xb4\xc8\xa2\x8d\x10\x25\x60\x32\xf3\x3b" - "\xe7\xde\x99\x4c\x26\x24\x60\xac\xd6\xee\xef\x3d\x3e\x1f\x3e\x93" - "\x3b\x73\xe7\xce\x9d\x7b\xce\xfd\xde\x73\xce\x9c\x7b\xce\xfb\xa7" - "\x85\xf5\x81\x30\xfd\xeb\xfd\x6a\x5f\xbc\xcb\x19\xd5\x5a\x1e\x63" - "\xa3\xe7\x39\xc8\x14\x1b\x6f\xa1\xdf\x33\x31\x5e\x41\xf2\x53\x26" - "\xfe\x9a\x91\xb0\x3d\x76\x47\x77\x70\x5b\xd4\x5a\x16\xaf\xf2\xe8" - "\x16\xc2\x7c\x91\x60\x8d\x54\x8f\x66\xb6\x5c\xf5\x44\x66\xdb\x54" - "\xeb\xd6\xf7\x43\x5f\xe5\xa3\xb9\xad\xa1\xea\x78\x38\x2e\x6e\x0d" - "\x1b\x3a\xcd\xf7\x7a\x14\xaa\xd3\x3c\x48\xd4\x68\x53\x47\xbf\xe3" - "\xdd\xcc\xdf\x18\x9e\x71\x2c\x8f\xdf\x42\xaf\x3d\x54\xaf\x27\x01" - "\x4c\xdf\x3b\x7a\xf1\xd1\x3c\xa2\x81\xbe\xf6\xe6\x55\xea\x20\xea" - "\xe3\x65\x54\x47\x98\x9b\x79\x13\xfa\x16\xb2\x6f\x1f\xc7\x0a\xf9" - "\x50\x75\x10\xab\x7f\xec\xe7\x95\xcd\xf0\x0e\xaa\x7b\x6b\xcc\xf6" - "\x4b\x82\x4c\x78\x0c\x78\xff\xde\x1a\xde\x78\x6f\x23\xdb\xff\x7e" - "\xec\x35\x11\x57\x19\x8f\x1e\x5b\xcb\xc6\x2d\x54\xc7\xc6\xed\x58" - "\xa1\xb0\x5e\x3d\x84\xbf\x61\xed\x8e\x62\xdf\xea\x8f\x25\x8a\x32" - "\xb2\x45\xa8\x83\xf7\xc0\x6f\x1d\xc3\xda\x63\x39\xf0\xee\xc2\x1e" - "\x86\x63\xf4\x7b\x21\xbc\x1f\xac\x59\x47\xab\xf0\xbd\x7c\x61\x2b" - "\x1d\x8b\x54\x12\x00\x7d\xc6\x3d\xfa\xe8\x8b\x6c\x33\xdb\x9e\x32" - "\xb1\x5c\x96\xc7\x1f\xa3\xfb\x80\xe1\x39\x40\x1f\x25\xe2\x26\xee" - "\x5b\xc6\xf6\xa4\xfe\x9b\xfa\x8a\x7d\xc1\xe7\xe1\x35\x78\x57\xcc" - "\x89\x07\x63\x75\x2f\xd5\xad\x91\xae\x17\xf4\x68\xe3\xb8\x0a\x63" - "\x86\xfe\x42\xc7\xa3\x71\x4c\xd8\x98\x1d\x77\xe5\x3c\x67\xe3\x75" - "\x3c\x54\x3e\x1e\xac\xcc\xa9\x00\x1b\x12\xd0\x6f\xe4\x78\xb4\x30" - "\x7e\xcd\xc2\xf3\x69\x1e\x4e\x76\xcd\xb4\xcf\xed\xde\x07\x5c\x75" - "\x59\xde\x54\x25\x7e\x83\x45\x9b\x3c\xe3\x57\x53\x95\xdb\x7d\x55" - "\xf3\xae\xa0\x8c\x1c\x52\x83\x79\x2e\x71\xcc\xdb\x0c\xa6\x06\x69" - "\xbc\x59\x3b\x5e\x9e\xf1\xa0\xf8\x0c\x0b\x31\xed\x15\xfb\x09\xbf" - "\x85\x35\xf8\xb8\x56\xa2\x89\x69\xa2\x78\x5f\x3e\xdd\x4b\x74\xcc" - "\x86\x7b\x20\xbd\xe2\x20\x7e\xfb\x81\x51\xa9\x74\x3c\x65\xa2\xfc" - "\x48\x8e\x17\xa0\x4f\x2c\x8c\xab\x9d\xf1\xd0\xf1\x0d\x6c\x2d\x3c" - "\x5e\x80\x6d\xe2\x77\x15\x16\xef\xf4\x78\x2e\xb4\x2b\xe4\xea\x3e" - "\xbe\x5f\xe8\x03\xe8\x7f\x47\xf7\x7a\xea\x75\xe3\xe6\xc7\xd2\xcd" - "\xbe\x23\x56\xea\x3d\xf7\x15\x05\x49\xfb\x3a\x8f\x37\xba\xed\x8b" - "\x2d\x62\xe3\xfd\xc1\x28\xd0\x53\x0f\x67\xb3\xb8\xb8\xc5\xd9\x40" - "\xb3\xf4\xab\xa4\x1f\xe6\x87\x49\xd3\xf3\x4d\x95\x7a\xd0\xad\x55" - "\x1a\xcc\x6f\xd4\x98\x76\x95\xf4\x42\x9f\x0b\xc4\x1b\xb4\xf7\xf0" - "\xa1\x70\x7e\x8b\xa6\x51\xda\x7b\x57\x62\x01\xdd\xb6\x70\x13\xe8" - "\xb2\xe9\x97\x48\x3f\xe6\x43\xf1\xc1\x72\xc1\xee\xb3\x93\x33\x6a" - "\x9a\x71\x5f\x67\x25\x68\x84\x7c\x7a\xfc\x4e\x6e\x8b\x06\x78\x51" - "\xe3\x48\x5f\x42\xc2\x70\x7d\x43\x5f\x5d\xc6\x33\x25\x26\x68\x17" - "\xf7\xeb\x16\x70\xbc\x4e\xc1\xab\x06\x44\x73\xaa\xc1\x59\x9b\x38" - "\x42\x7d\xc4\x81\xcf\x94\xf5\xe4\x83\xe3\x7c\xe8\x80\x68\xcc\x5b" - "\x89\x36\x1f\xb3\x1d\xfa\xb9\x65\x40\x34\x5c\xeb\x03\xd7\xd0\xde" - "\xc3\x61\xfc\x35\x8c\xe7\x0e\xed\xd3\xf5\x93\x37\x0e\x88\x66\x7d" - "\xb7\xd2\xba\xf5\xe4\xc3\x01\x58\x47\x8c\xeb\xc6\xa5\xeb\x02\xf0" - "\x3a\xee\x13\x76\x62\x5e\x04\x90\xce\xd9\x3d\x35\xae\x7b\x04\xf9" - "\x19\xe6\x72\xc9\xbb\xfc\xd6\xa1\xf1\x50\xb7\x18\x7d\x52\x99\x2c" - "\x5b\x72\x58\x98\xeb\x20\x1f\x97\xbc\x23\xfc\x0e\x76\xd5\x4d\xd7" - "\x91\xb4\x76\x12\x41\xbf\xab\xae\x0a\x00\xec\x2d\x09\xc6\x1c\x0b" - "\x6e\x6d\x7e\x8d\xed\x6d\xc4\x78\x71\x71\x24\x18\x70\xf9\x1e\xe8" - "\x37\xe6\x47\xf9\x1a\x6d\xb5\xc2\xd8\x58\x80\x4e\x45\x9b\x59\x4c" - "\xc0\xc3\x9b\x80\xf7\xd3\xd6\x82\x3c\xb0\x96\x04\xaf\x75\x92\x48" - "\x7c\x4f\xa0\x5b\x23\xfa\x55\xa3\xee\x86\x63\xc3\x68\x38\x60\x36" - "\xbc\x4b\xec\xda\x78\xbe\x61\x6d\x33\xdf\x58\x11\x5f\x43\x60\x9d" - "\x09\xab\xd4\x57\x61\x6c\xf2\xaf\xf1\x5d\xd1\x46\x09\x63\x0a\xf2" - "\x0a\x3c\x63\xcb\x80\x58\xdc\x2b\x43\xed\x04\xca\xe3\xc5\xe2\xbe" - "\xa2\x7c\xba\xf7\xa8\x24\xca\x65\xfb\x4a\xe2\x4b\x84\xbe\x94\x72" - "\xf8\x3b\x89\xee\x4f\xec\x85\xfa\x0f\xda\x34\xe6\xad\x2e\x70\xed" - "\xd1\x60\xb6\x81\x92\xc5\x6e\x71\xb9\xe8\xbd\x68\x23\xc0\x7b\xa7" - "\x3a\xf8\xab\x9b\x85\xba\x78\xef\xd4\xd5\xf3\x78\xbc\x17\xee\x29" - "\x70\xdd\x23\xdb\xe3\xf3\x21\x93\x2b\x60\x6c\xf1\xb7\x15\xc6\x52" - "\xf0\xa1\xd2\xb0\xef\xdf\x25\x35\xe2\x37\x67\x0b\xf9\xc0\x88\xfc" - "\xe4\x3d\x9e\xf8\x09\x22\x8f\x91\x74\xa2\x0a\xe3\x37\xc1\xf9\x08" - "\x31\x96\x11\xfc\x1e\x08\x6d\x31\x39\xdb\x2d\x46\x59\xb6\x5b\xbc" - "\xc3\x74\x2b\xff\x0d\xf2\x09\xe0\x4a\x40\x13\x39\xa1\xe7\xb7\x0c" - "\xce\x62\xfb\xa4\x4e\x1c\xc7\x7e\xd6\x93\x13\xb8\x17\x3d\x84\xc5" - "\x52\x38\xb1\x4e\xc0\x8f\xe4\xa9\x4e\x47\x88\x05\x9e\x89\x7b\x7e" - "\xdc\xca\xc9\x80\x27\x2a\xa8\xf7\x57\x16\x0f\xf0\x84\xde\xa3\x3e" - "\x5e\xcf\xf0\x28\x47\x7b\x94\x35\x36\x98\x37\xbe\xbe\xad\x6f\xea" - "\x47\xed\x87\x79\x7d\xd6\x11\x7d\xfa\x45\x12\x00\xbc\x72\x1e\xfb" - "\x56\xd9\xd8\x8c\xef\x14\xc2\x1b\xa2\x08\xda\x40\xa9\x6c\x09\x6b" - "\x7a\xfd\x40\xa8\x73\x91\x84\xa3\xdf\x37\xe6\x48\x81\xfa\x4d\x2c" - "\x8e\xf9\xc7\x33\x67\xaf\xec\x45\xb8\x57\x74\xf7\xf0\xca\xe7\x73" - "\xf1\xdb\xde\x81\x0e\x4b\x0f\xfc\xce\x95\xb6\x03\x78\xd2\x49\xc2" - "\x81\xc7\x1a\x30\x1f\x1d\xdc\xd3\xfc\x5f\x1d\x8d\x3d\xcc\x8e\xb3" - "\x44\xbf\x88\x28\x9b\xc8\xc7\x93\x02\x53\x49\xe0\xe6\x0b\x44\x05" - "\x74\x75\x7c\xe8\x18\x4d\xc4\x58\x08\x79\x61\x6c\x1f\x77\x1e\xe0" - "\xeb\x8a\x08\xde\xde\x66\xf8\xa8\x10\x74\xaf\x1c\x51\xc7\xde\xc8" - "\xf2\xa0\x04\xc2\xf3\xfb\x2a\x85\xb8\x0f\x6c\x6c\x3f\x3a\xcf\xf6" - "\x59\xa9\x5f\x81\x7b\x6a\x25\xf9\xfb\x63\x96\x6b\xdc\x38\x78\x3f" - "\xc3\xbe\x8f\xe3\x3f\x04\x09\x7e\x03\xf3\x51\x50\xb7\x19\x3e\x0e" - "\x72\xf9\x28\x50\xbb\xd5\xc7\xf1\x40\xc3\xfd\x4c\x36\x1f\xbc\x7f" - "\x9e\x33\x48\x98\x83\x78\x3e\xa4\x06\xef\x85\xfb\x42\x6c\xd4\xc6" - "\xf4\xf1\x78\x89\xd7\x3e\x0e\x46\xcc\x87\x77\x0a\xb6\x90\x8f\x32" - "\xf0\xbd\x70\x4c\xa0\x5e\x20\x94\x37\x7c\xb8\xd7\x47\x5c\x58\x95" - "\x2a\xcb\x41\x6d\x20\xeb\x83\x80\x9f\x2e\x01\x0d\xee\xc5\xd8\x4f" - "\x66\x78\x4e\x45\x7e\x07\xa9\x88\x68\x25\x95\xf0\x1b\x7d\x91\x4d" - "\x8b\xbe\x21\x0d\x1a\xef\xeb\x0d\x07\x7a\x04\xc8\xda\x11\xd8\x16" - "\x62\x01\xfa\x6f\x99\x53\x61\xfd\xb1\x42\x5b\x0d\x84\xb6\x51\xc1" - "\x35\x92\x8a\x64\xd4\xb3\xf6\xa8\x2a\xf3\xcf\x92\xca\x88\xcf\xe8" - "\x73\x50\x26\x34\x25\xb4\x76\xd5\xb6\x16\xda\x1e\x2d\xb4\xdd\x0c" - "\x6d\xab\x7d\xb7\x6d\x88\xf2\xb3\x6d\x3f\xfa\x6d\xd0\xf8\xd3\x36" - "\xac\x33\x1b\x31\xcf\x0d\xee\xeb\x4a\xbb\x9f\xf4\x76\x5e\xc3\xb8" - "\x9f\x0f\xf1\xcc\x1f\xb6\x6c\x2c\xdd\xfb\x65\xa0\xfe\xc6\x59\x74" - "\x0f\xd8\x65\x42\x7d\x1a\xd9\xbe\xaf\xf3\x04\xfd\x21\xda\x0c\x65" - "\x5a\x49\x57\x72\x7d\xa7\x02\x59\xb5\x6c\x12\xf3\x7b\xd4\x64\x31" - "\xbe\x2a\xc3\xb8\x91\x3e\xf4\xbc\x01\x87\x99\xff\x6c\xd9\xab\xa2" - "\xfd\xa5\x35\x74\xc0\x61\xa1\x2d\x8d\xa7\x5d\x4f\x4c\x48\x1b\x97" - "\x9c\x28\xe6\xb6\x4d\x14\xb6\x9f\xbe\x10\xf7\x72\xdc\xc2\xa4\xb8" - "\x58\xcd\xf4\x95\x09\x4b\x47\x2c\xfb\xed\x6f\x35\x93\xe3\x56\xac" - "\x98\xff\x4a\x5c\x2f\x32\x3d\x61\xfe\xd2\x15\x0b\xd1\xf6\xa6\xd1" - "\x8c\xff\xb7\x79\xf1\xcb\x12\x47\xfc\x62\x7c\x94\x87\xed\x0d\xf7" - "\x2a\xd6\xa2\x0c\x0e\x6b\x47\x78\x9a\x93\x84\x62\x1c\x9f\x90\xd5" - "\xbc\x69\x0d\xe8\x7f\xc0\x7f\x4d\xb8\x4e\xe1\xda\x80\xba\x01\xc6" - "\x10\x04\xfc\x2e\x7f\x73\x3b\x5f\x75\x81\x7c\xe9\x04\xb9\xb2\x66" - "\x37\x8b\x87\x57\x0b\x3a\xb9\x95\xe5\x5b\xfc\xf2\x0c\xc6\xba\xfb" - "\x3d\x9c\xb3\x86\x0e\xde\xbf\xf9\x1c\x09\x84\x75\x0d\xf4\x92\x93" - "\xb9\xbc\xf2\x2e\x7e\x63\x38\x5f\xc2\x7f\x13\x41\x84\x18\xe2\x4a" - "\xb3\xc5\x8e\xdf\xf3\x83\xa6\x3a\xd2\x79\xc4\x53\x36\xb7\x4e\xee" - "\x60\xe3\xa2\xd6\x32\xbf\xe2\x2f\xdf\x45\x1d\x66\x3d\xcd\x87\x79" - "\x12\xe6\xff\xfb\x7a\x09\xa7\x3f\x2b\x11\x64\x47\x8c\x4d\xb8\xaa" - "\x1e\xca\x2c\xce\xc8\xc9\x6a\xb9\xaf\x46\x39\xac\xcb\x5f\x34\xb2" - "\x7f\xbc\xa7\x26\x88\xfd\xe3\x6f\xf7\xff\x2f\xf3\xd8\xbf\xe7\xf9" - "\xef\xfb\x2f\x3e\xff\x66\xef\xaf\x4e\xed\xfa\xff\x46\x9e\x8f\xc7" - "\x3b\xf9\xfe\xdf\xe7\xfe\xea\x0d\x5d\xfd\x23\xbf\x01\x6f\xd5\xfe" - "\xfe\x1c\x09\x02\xfe\xcc\xd9\xb4\x00\x78\xba\x8e\x44\xa4\x3a\xf8" - "\x86\xf4\x39\x24\x32\xed\x22\xc1\x7c\x84\x8d\x89\xc9\x7c\x43\xda" - "\x35\x94\x49\xab\x67\x00\xff\x16\x67\xd7\x93\xe0\x4d\xf5\x44\x55" - "\x99\x88\xb9\x8a\x31\xd6\x17\xe0\x4c\x33\xfc\x43\xb9\x3c\xc9\x4e" - "\x3e\xb1\x5e\x41\xff\x26\x53\x65\x0c\xe0\x4e\x2d\x21\xc8\xbf\xc1" - "\x31\x44\x9d\x17\xce\x1f\xe1\x0d\xcb\x60\x3d\x5b\x86\x79\x09\xab" - "\x0f\x71\xd1\x3d\x0e\xa5\x94\xf6\xd0\x2c\xc0\x35\xbe\x62\xa6\xc0" - "\x9b\x27\xd8\x9e\xa2\xcf\xe8\x7e\x06\x98\x27\xd5\xcc\xae\x5e\xfd" - "\x34\x5b\xcf\xab\x43\x05\x7b\x13\xfc\xfe\x8c\xca\x8a\xf0\x1e\xc5" - "\x98\xbf\x15\xdb\x3c\xc8\x15\xd3\xfc\xad\x87\x52\xa2\x7b\xa4\xce" - "\x27\xca\x4a\x4b\x13\xc1\xdc\x4e\x98\x0b\x14\xe6\xdd\x7e\x98\x67" - "\x45\xbb\xc2\x79\x23\xf4\x6f\x63\x7e\x38\x9f\x05\x7d\x2a\x6c\x33" - "\x54\x94\xc2\xda\x73\x44\xf8\xee\x62\x82\x79\xb1\x7f\x13\xd4\x99" - "\xba\x92\x3c\xb4\x09\xea\x65\x43\x3d\x94\x93\x59\xff\x3e\xdd\x04" - "\x63\x70\x18\x9e\x59\xa5\x99\x8b\x65\x33\xf5\xbd\xc1\x67\xc3\x7b" - "\x68\xea\x89\x39\x02\xd6\xb6\x40\x7c\x86\xf8\xdc\x36\x43\x25\xe0" - "\x5f\x69\x22\xfd\x76\x06\xe7\x59\x3b\x95\xd3\xd9\x7c\x1d\x80\xb1" - "\x01\xc4\xfc\xba\xc1\x9b\x52\x60\x4d\xef\xa0\x31\x30\x73\xd0\xde" - "\x82\x32\x06\x95\x2b\x9c\x24\x84\xd9\x07\x40\xb6\x88\x07\x1c\x00" - "\x79\x82\xfa\x42\x83\x2c\x01\x7d\xc9\xc1\x3c\x8f\x78\x1d\xf4\xb6" - "\xc3\xb0\x2e\x17\xa1\x1c\x30\xf7\xea\x73\x04\x6d\xec\x98\xa3\x75" - "\xc5\x6c\xde\xce\x72\xe6\x54\x1e\x16\x65\x01\xc4\x20\x5c\xff\x41" - "\x16\x0e\xbc\x0e\x34\x04\x1e\x28\x05\xd9\x22\xb4\x89\xae\x1c\x74" - "\xec\x4b\xe9\x9a\x9f\x44\x63\x36\x07\x30\x8c\xae\x74\xc2\xfb\x05" - "\xc3\x33\x60\xcc\x6a\xa9\x2d\x9c\x61\x8c\x39\x58\x5c\xc7\x51\xe7" - "\xb5\x40\x1b\x3c\x60\x99\x70\x0d\xde\xff\x84\x98\xeb\x0e\xe4\x8a" - "\xca\x23\xc2\x98\x95\xb3\x6f\xc8\x66\xaa\xfb\x83\xcc\xb5\x5f\x18" - "\x9b\x52\x94\x2b\x84\x7b\x5d\xfe\x8f\xa8\x97\x73\x20\x57\xe0\x78" - "\xe1\x38\x41\x3b\xa5\x02\x8e\x55\x33\xf9\xe5\xd3\x95\xc2\x77\x4b" - "\x23\xd0\x7a\x83\x34\xfe\xe6\x42\xf7\xf1\x87\xfb\x05\xbd\xf1\xd3" - "\x01\x6e\xb4\x03\xdd\xa8\xca\x8e\x76\x52\xe8\xe3\x11\x66\xe3\x31" - "\x7f\x8d\xb1\xd2\x30\x36\x33\x8c\xf1\x91\x8d\x18\x07\x18\xb0\x79" - "\xfd\x39\x82\xdf\xbe\x41\x7e\xaa\xfa\x9a\xc9\xa7\x55\x19\xc8\xc3" - "\x50\xa6\x76\xf8\x06\xe8\x17\xb6\x07\xe5\xe7\xe1\x08\x72\x6c\xd5" - "\xb3\xee\xf9\x94\xa5\x5c\xca\x55\xd1\xd2\x7e\x04\xf3\x62\xa6\x3f" - "\x9b\x17\xa3\x0d\x8c\xd6\xbf\x1e\x8f\x7d\xab\xc5\x79\x29\xbe\x2b" - "\xe6\x55\x86\xf3\x28\xfb\xd7\x22\xdd\xc4\xf3\x18\x43\x18\xe8\x14" - "\x0c\xcf\x3a\x23\xf4\xe9\x30\x94\x83\xa0\x3c\x90\xda\xf7\xaf\xd3" - "\xfd\xe6\xb5\x9b\xd2\xa4\x7b\x70\xde\x00\x0f\x87\x40\x9d\x4f\xe1" - "\xc8\x8b\x75\x59\xee\xe5\x2a\xdd\x1b\x1d\x68\x03\xab\xd2\x8b\xb9" - "\x97\x31\xef\x32\x62\xc6\xa6\xb9\xb2\xb1\xc7\xb1\x41\x3a\x53\xbe" - "\xfb\xd0\x51\x0c\xe3\xfd\x29\xc8\xff\xef\xe9\xd8\x7b\x55\xe9\x84" - "\xfe\x99\x58\xfc\x94\x32\x23\x8d\xf7\x4b\xf5\xa1\x4f\xa3\x5d\xfa" - "\x90\x4b\xb6\xac\xd2\x21\x4f\x42\x5b\xe5\x48\x7f\x94\x13\xa1\x5e" - "\xbc\x8b\xb7\xe8\x7e\xdf\xaa\x46\x94\x2f\x85\xfe\x23\xbf\x94\x09" - "\x63\x67\x74\x9f\x77\xee\xf3\x1c\xda\x00\xfd\xff\x63\x17\x0f\x88" - "\xf3\x9a\xf1\xc1\x29\x21\xf7\xd3\x7a\xcc\xbd\x56\x05\xed\x9a\x50" - "\x06\x67\xeb\xea\xa9\xc3\x1f\xd6\x3a\xd0\x86\x5e\x0d\x65\x98\xdf" - "\xa7\x8c\xad\x61\x43\xf5\x1b\x28\x6e\x9c\x82\xf1\x79\x94\xe6\x2a" - "\xc1\x71\x11\xe7\xeb\xe6\xb9\xa8\xfb\x45\xb1\x39\x9b\x0c\xdc\x60" - "\x6f\x26\x82\xaf\x3f\xcc\xd9\xf3\xf8\xed\xb4\x09\x78\x28\x08\xe7" - "\x2f\xd0\x17\xf9\x19\x31\xa7\x6a\xc3\x76\x3a\x6f\x83\x71\xde\x5e" - "\xc7\x18\x12\xf0\x9c\x92\x98\x68\xf2\x61\xb2\x89\xce\x63\x8c\x1f" - "\xf2\x26\x8c\x1d\xe6\x39\x86\x67\xa7\x8a\x3e\xca\xc8\x23\x18\x2f" - "\x44\xe0\x93\x12\x9c\xcb\xc2\xd8\x05\x42\xbd\xbd\xe2\xdc\x73\xa3" - "\x3f\xad\xe3\x31\xdf\x42\xd8\x7c\x3b\x55\x2d\x8e\xb5\x83\xce\xe3" - "\x2a\xbd\x03\xe6\xb1\xfb\x98\xe2\x78\xe2\xb8\xb6\x19\x3e\x83\xf7" - "\x2f\x8d\x10\xc7\x54\x1a\xcf\xcf\x96\x0b\x34\xaf\x62\x36\xa6\xcf" - "\x46\x09\xf6\x27\xd7\x18\x0a\xfc\x87\xeb\x40\xf1\x7a\x7c\x77\x58" - "\x1b\xf0\xf9\xc8\x23\x6f\x0a\x98\x55\x62\x45\x1e\xf9\x0c\xe6\xff" - "\xaf\xb5\x12\x76\x54\x25\x52\x9d\x05\xe8\xc4\xe8\xf3\xd9\x2e\x1a" - "\x6f\xc3\x0b\x76\x58\xc8\xa7\xb3\x25\x7c\xfa\x6c\xbf\x38\x0e\x22" - "\x4f\x8a\xf3\x1e\xda\x68\x97\xe3\xcf\x67\x75\xd0\x46\x18\xe2\x9b" - "\x24\x43\x7d\xd6\x2c\xc7\xb7\xcf\xaa\x11\xdf\x90\xaf\xf5\x49\x68" - "\x63\x63\xeb\x95\x85\x54\xa4\xca\x31\xa9\x62\x39\xf3\x0d\x60\x32" - "\x17\xf2\x96\x7e\x2e\xab\x8f\x6b\x18\xd4\xa7\xba\xb8\xb0\xe6\x95" - "\xe0\x1a\x07\xe7\xe2\x85\xf1\xaa\x85\xfa\x25\xb8\x6f\x12\x63\x25" - "\xdc\x53\xcb\x74\x3d\xc0\xe9\x23\x18\xbf\x1b\xea\x69\x2b\xe1\x69" - "\xd7\x33\x19\x76\x8b\x58\xc1\xbf\xac\xbb\x67\x55\x23\xb9\x5b\xff" - "\x0b\xfe\x9b\x0b\xe4\x34\xee\x67\xb5\x63\x0c\x49\x68\x5b\x73\x81" - "\x7c\xf1\x29\x3c\x57\x2d\x1c\x23\xe0\xf8\x2e\x1c\xef\x87\xe3\x1e" - "\x38\xf6\x87\xe3\x6b\x50\x9f\x13\xea\x47\x41\x79\x39\x9c\xff\x37" - "\xe1\x08\x7d\x3c\x8d\xf2\xe6\x34\x41\x76\xc4\xf3\x13\xb0\x0c\xc7" - "\xc7\x05\x9a\x97\x33\x9a\x9f\x1e\x01\xed\x24\x43\xff\x6b\xcc\xb5" - "\xb4\x2d\xfd\x05\xf2\xf9\x55\x6c\x1b\xf7\x31\xc3\xef\xb7\xdc\x64" - "\x50\x68\xe7\xf4\x69\x38\x8e\x82\xe3\x0e\x38\x26\xc2\x71\x89\x30" - "\x06\x55\x88\x0d\xb1\xc9\x74\xcc\xa9\x9e\xc0\x9e\xc7\xe6\x3c\xae" - "\xc3\x12\x76\x54\x96\xc6\xce\x66\xf4\xb6\x90\x53\x94\x0f\xa0\xee" - "\xd3\x58\x17\x8e\xcf\x08\xc7\x68\xe1\x38\x41\x38\xfe\x4a\x38\x8e" - "\x17\x8e\x13\x2d\xe4\xb4\x5e\x90\x31\x60\x5c\x4e\xd3\x7d\x86\x30" - "\xb7\x4b\xd8\x33\x3e\x37\xa2\x8e\x0c\x38\xfe\x38\xb4\x1f\xd0\x66" - "\xf8\x3c\x50\xb4\x8f\xa2\xcd\xe7\xba\xa1\xec\x2f\x6f\xd2\xef\xda" - "\x9f\x47\xba\x61\x5b\x6a\xb0\x22\x9a\x80\x0c\xd4\x37\x4f\xc9\x0b" - "\x71\xf5\x3e\x4f\x54\x0a\xdf\x85\x85\xdc\x00\x01\x18\x2f\x8f\xea" - "\x43\xa1\x3b\x93\x71\xae\x52\xdb\x31\xc6\x76\x0b\x1d\x9c\x01\xff" - "\x1b\x41\x37\x30\x8a\xf8\x8d\x7a\x0f\xd3\xd5\xef\xfa\x0c\x9e\x95" - "\x25\xe9\xea\x9f\x8f\x66\xdf\xd0\xee\x5b\x0e\xe7\x0b\xa4\xf3\xa7" - "\x71\x3f\xc0\xe3\x30\x9e\x35\xf0\x3e\xa3\xea\xc9\xe7\x18\xc3\xff" - "\xa7\x0d\xec\x9d\xa3\xc4\x77\x16\xe8\xa1\x17\xc7\xb7\x81\x9c\x4e" - "\x06\x2c\x4c\x40\x1e\xae\x77\xe1\xec\x69\x6a\xd7\x15\x78\x04\x68" - "\x79\xfa\x31\xa4\xa9\xdb\x1c\x74\xc7\x20\x75\x9b\xe1\x0b\xad\x1c" - "\x53\xcc\x5a\xc4\x14\xe4\x0d\xc0\x6f\xa4\x75\x90\xc7\xfc\xab\xc6" - "\xf9\xc7\xe6\xdd\x17\xb1\xf2\x7b\x3f\xab\x76\xb0\x79\x57\x03\x7c" - "\x06\xfc\x59\x8d\xf9\x21\x00\x87\xbe\x18\x2f\xcc\xe9\x1a\x98\xd3" - "\x8f\xc3\xf9\x2a\xd6\x57\x76\x5e\x78\x16\xf0\x59\x35\xbe\x77\x7f" - "\xf1\xbc\xf0\xbe\xd8\x0e\xc6\xfc\xbf\x5f\x3c\x2f\xb4\x0f\xfc\x58" - "\x5d\x8c\xf3\x44\x3c\x2f\xbc\x13\xc8\x51\x5f\x38\x44\x3c\xd9\xc8" - "\xf8\x6d\x83\x78\x1f\xd2\x0d\xe3\x63\x31\x1b\xff\x17\xb8\xb7\xa2" - "\x00\xd7\x87\xf5\x73\x49\xf0\xaa\x5c\xd2\x9b\xcd\xcb\x2f\x1a\xe5" - "\x18\x79\xb6\x8c\x37\x84\x38\x78\xd5\xe0\xe4\x0a\xc7\x28\x51\x5e" - "\xcd\x6b\x33\xd4\xc4\x8a\x79\xbe\xa5\x3c\x03\x35\x3b\x2a\x0a\x5c" - "\xe3\x0b\x7d\xa9\xc9\x12\xfb\xe2\xb6\x3e\x53\x1a\x60\xdf\xb0\xad" - "\xf5\x20\xaf\xdb\x00\x17\x18\x6e\xd7\x14\x5b\xc8\x3d\xa2\xbc\x4b" - "\xd7\xad\x10\x05\xd1\x67\x27\xd1\xef\xa3\x21\xb8\x36\xa2\x8f\x0f" - "\x87\x76\xac\x64\x27\xa9\xd4\x83\x2e\x9f\x7c\x9e\xcc\x5b\xdd\x0b" - "\x63\xaf\xe8\xa0\xaf\x07\xa0\x6f\x7b\x9d\x68\xfb\x5f\x8a\x7a\xea" - "\xd9\xf9\xce\x24\xde\x2e\x8c\x19\xcc\xa3\xb3\x13\x84\xb1\x45\xfc" - "\xda\x8b\x98\xbe\x3e\x8d\xe5\x0c\x42\x5b\x0e\xce\x8f\x37\x70\x1d" - "\x8b\xe0\xed\x25\x79\x38\x57\xce\x4c\x14\x65\x52\xe8\x6f\x01\x93" - "\x09\x4f\xed\xa3\xb1\x89\x8c\x83\x93\x99\x2d\xf0\xcc\x69\xf6\xee" - "\x67\x8e\xb0\xef\xdc\x34\x46\x26\x96\x0b\x03\x22\xc2\xbf\x60\x7e" - "\x59\x65\x1f\x31\x9f\x92\x33\xb9\x2e\x9f\x12\x49\x56\x34\xb1\xb8" - "\x51\x67\x0e\x4b\x73\xe2\xcc\x06\xbc\x0f\xee\x6f\x82\xf3\xe5\xd2" - "\xf9\x53\x7b\x05\x7b\x57\x6a\x9f\x75\xd1\xe8\x5b\xd6\x17\x63\x6d" - "\xb3\xe7\x9d\x1d\x4e\x9f\x4f\x6d\x1e\x30\x37\x85\xf9\x8b\xe3\x8c" - "\x6b\x36\x9d\xc3\x30\x7f\x71\x1e\x5f\xdf\x32\x38\x03\xfe\xd9\xbc" - "\x65\x6b\x33\xdd\x3f\xc0\xe6\xec\xd9\x31\x6e\xfd\xb0\x51\xbb\x17" - "\xd2\x73\x4d\x44\x30\x5c\xd3\xc1\xba\x5a\x25\x5c\x63\x39\x25\x9a" - "\x68\x8c\x3c\x2b\x7e\xdb\xc6\x6f\x9d\xb8\x47\x2b\x04\xb8\x1b\x63" - "\x82\x88\xdf\xaa\x27\x37\xa7\xf3\x4e\xfc\xee\x74\x8d\xb7\x19\x5d" - "\xb1\xfe\xcf\xee\x95\xe2\xfb\x9c\x09\x14\xde\x2b\x19\x9e\x95\xc7" - "\x7c\xc1\x6a\xae\x32\x99\xaa\xc6\x86\x7c\x6a\x06\xde\x83\x63\x2e" - "\xcb\xcb\x7c\xd6\x22\xf2\x1e\xcc\xcb\xd8\x0b\xe4\xcb\xe5\x39\xe1" - "\x7c\x2e\xd0\x34\x17\xe6\xd2\x62\x28\xcf\x81\x63\x2c\x3b\x2a\x54" - "\x78\x14\xe6\x48\x6e\x9b\xe1\xcb\x48\x31\x1f\x3d\x8e\x8d\x2d\xd4" - "\x90\x81\x7c\x96\x0d\xe3\x80\xbc\x46\xbf\x23\x43\xbf\x91\xbf\x90" - "\xcf\x90\xc7\x42\xd6\x3d\x47\xf9\x8c\xc6\x1f\x80\xf3\xd8\x5f\xe4" - "\x33\x68\x2b\x5e\x8c\xf3\x6b\x21\x5f\x06\xb3\xef\x39\x5f\xa6\x8a" - "\x3e\xb7\xf8\x2d\x29\x71\x00\xe9\x0b\xed\x02\x48\xd3\x58\x9a\x5f" - "\x99\x1d\x13\x08\xd6\xc5\xef\x70\x0c\x27\xef\x2b\x81\x7b\x8a\xa4" - "\x31\x37\xd3\xdc\xcc\x1f\xce\xa6\xb6\xc8\x7b\xe1\x5a\xb9\xbb\x9e" - "\x61\x21\x27\x73\x51\xd7\x40\xdf\xbe\x9f\xa8\x09\x7e\x07\x06\x1c" - "\xfb\xd2\x2a\xca\xb5\x8f\xaa\xf1\x7b\xfe\xc9\xf1\xd0\x3f\xd4\xa1" - "\xab\xe0\x77\x14\xe8\x92\xa5\x3e\x6c\xc6\xa3\xd0\xd6\x23\xe4\xe7" - "\xa9\x45\x3b\x16\xe6\x33\xb8\x40\xbe\x5a\x5e\x81\xb1\x40\x96\x75" - "\x8e\xf3\x9c\x96\xcc\x5f\xc5\x58\xcf\x9a\x04\x72\x6f\x3d\xf9\x6a" - "\x3a\xda\x8d\xd2\xaf\xa0\x8d\xa6\x36\x59\x6e\xa3\xa9\x2d\x15\xfe" - "\x41\xd3\xae\x8b\x76\xfb\xaf\x12\x8e\x93\xba\xf9\x6f\x14\xea\xc2" - "\x9b\x9e\x13\xd6\x94\x08\x98\x27\xb5\x2e\xfb\x2f\xf2\x25\xce\x6d" - "\xf4\xe3\x40\x9b\x93\xc2\x41\x30\xf6\x08\xd0\x09\xfa\xbd\x7e\xe8" - "\x0b\xa6\x14\xe4\xa3\x3a\xba\x0f\x0a\x63\x10\xfb\xe7\x4b\x54\x47" - "\xe9\xc9\xe2\x81\xd6\x56\xc1\xb3\xd5\x9b\x2f\x93\x40\x7d\x02\x79" - "\x00\xed\xdf\x21\x4e\xde\x84\x3a\xae\x10\x53\xb0\xaa\x89\xd4\x7d" - "\x9a\xb8\x96\x28\xe1\xfa\x43\xf0\xdb\x24\xca\x49\x70\x8f\x2a\xc0" - "\x4e\xd4\x28\x1f\x3d\xb3\x96\x3c\xd4\x66\xa8\xcb\x13\x69\x85\x32" - "\x04\xda\xe1\x04\x5b\x02\xf4\xb5\x96\xfa\x38\x63\x9c\x7a\x0b\x1d" - "\x37\x8a\xc3\xd8\x06\xe8\xb0\x75\x59\x01\x36\xa2\x62\x6b\x4f\x1d" - "\xf0\x7f\x99\x20\x33\xd6\xed\x05\xde\xaf\x76\xeb\xe7\x2f\xdd\x7e" - "\x67\xe2\xfd\x21\x36\x94\xcf\x7c\x8d\xcf\xb9\x11\xe2\xf8\xa0\xbf" - "\x6a\x08\xe8\x09\x94\xde\x0e\xbe\x19\xfa\x56\xae\x4f\x21\x41\x4d" - "\xe4\xab\x07\x76\x6f\xa7\xfb\xec\x4a\x99\x7d\xfe\xab\x50\x51\x0f" - "\x67\xfd\x3e\x57\x17\xb2\x2e\x80\xa0\x5d\x1d\xe3\x9d\x51\x5f\xbf" - "\xef\x22\xa8\x2d\xdd\xec\x18\x43\x4c\x69\x4f\x60\x1d\x51\xae\xaa" - "\x6d\x4d\x8f\x20\x1f\x46\x8c\x81\x79\x7c\xae\x10\xe6\x4a\x89\xff" - "\x3e\x95\xe7\x0a\x85\xf1\x2d\x67\xbe\x08\xe7\x56\xe3\x5a\x82\xba" - "\x3f\xac\x23\x25\xb8\x46\xb7\x19\xbe\x0a\x14\xe7\x0d\xac\x1b\x25" - "\x70\x8f\x10\x0f\x1b\xbf\xff\x9e\x4b\xc4\x18\x10\x54\x6f\x60\xf5" - "\x83\x99\xcd\xff\xab\xd1\x2e\x59\x1a\xea\xe1\x7d\xcc\x47\xed\xdc" - "\xa4\x79\x4e\x05\x8c\xe9\xb9\x49\xf8\x6e\x02\x2f\xc2\x7a\xf5\x55" - "\xbc\x34\x6f\xeb\x28\x36\x7f\xd8\xec\x3e\x2f\xbf\xca\x92\xf4\xcd" - "\xda\x31\x23\x72\x88\xd7\xf8\x9d\xfa\x3e\xb8\x56\x7d\xd5\xbe\x79" - "\x33\x5f\x60\x54\x72\xe3\xd6\x67\x93\x60\xc5\x46\x18\x36\x9c\x67" - "\x49\x31\x7d\x2f\x10\xcb\xdd\x21\xc1\xf7\x4d\x7b\x26\xf1\x2e\x3e" - "\x2d\x82\x28\x37\xb5\xdc\x15\x34\xc0\x7e\x5f\x01\x1f\x30\xf4\x85" - "\xc9\x89\x76\xa2\x59\x64\x24\xdf\x2e\x26\x01\xcf\x38\xe1\xd9\xc1" - "\x44\x6f\x21\xf5\x6a\xdc\x33\xfa\x61\x30\xca\x1f\xf5\x6a\x6c\x33" - "\x35\x8f\x04\xa5\x36\xf0\x8d\x1b\x7f\xdb\x23\x08\xd6\x03\xd5\x9b" - "\xc0\x63\xf7\x04\xdf\x57\x70\x1d\xda\x38\x1e\x43\xef\x2b\xf2\xdd" - "\x37\xcb\x36\xef\x7d\xd3\x87\x43\xdf\xf6\xf9\xd7\xb7\x6f\x0e\x4b" - "\x7d\xfb\xe6\xf0\xf7\xef\xdb\xd7\x8f\xb9\xf5\x4d\x25\xf5\x2d\x1e" - "\xfa\xf6\xf5\xd3\xfe\xf5\xed\xfc\x74\xa9\x6f\xe7\xa7\xdf\x60\xdf" - "\xf6\x77\xd1\xb7\x0a\xef\x7d\x4b\xbe\x0f\xfa\x56\xe7\x5f\xdf\x2e" - "\xd8\xa4\xbe\x5d\xb0\x7d\x9f\xbe\xa1\x2e\x9f\x16\xc9\x9f\xa7\xf1" - "\xe4\x13\x58\xbc\xd6\x0b\xe4\x9b\xb1\x69\x79\xb4\x1c\x76\x81\xd4" - "\xb7\x0b\xf3\xdb\x9a\x6e\xe3\xbf\x61\x72\x4e\x7d\xdc\x48\x3d\xfa" - "\xbb\xd6\xcf\x06\x5e\x56\x33\x9e\xfe\x86\xfa\x37\xa4\x5b\x79\xc1" - "\xdf\xb4\xfe\xd5\x7c\xea\x8f\x32\x2c\x42\x28\x97\xb6\x86\x0d\x3e" - "\x8c\xbe\x20\x1c\xcc\x67\x3e\x6c\xb0\x09\xf3\x77\x1e\x4a\xb0\x2a" - "\x79\x03\xc6\x0e\xc3\x78\x7f\x81\x84\xdf\x3a\xb8\xea\x50\x82\x9d" - "\xe6\x0e\x5f\x4f\xf7\xfb\xd6\x9b\xc4\x3d\x6e\xe2\x33\xac\xa1\xc3" - "\x22\xe0\x7c\x8d\x98\x07\x96\x57\xa2\x3c\x33\xb8\x18\xdb\x87\xf3" - "\x56\x31\x37\x2b\xf0\xfb\x06\x01\x1b\x6c\x21\xf6\xae\x70\xef\x9b" - "\x41\x22\xee\x3d\x93\x48\x42\x30\x2f\xe5\xe6\xb4\xbb\xf0\x9b\x23" - "\xb4\x55\x7f\x18\xc7\x7d\xaa\xed\x2e\x3e\x24\x95\x04\xe0\xde\x3e" - "\xf4\xd1\x33\x47\x58\xc9\xc0\x54\xd2\x63\x6a\x32\xb4\x69\x27\x31" - "\x21\xc9\xd0\x1e\x8c\x35\xd3\x0d\xbe\xa1\x36\xbe\x1c\x68\x0f\xbf" - "\x7f\x07\x24\x92\xe0\x67\x22\xd2\xf9\xf5\x3b\x48\x20\xee\x03\xc4" - "\xfd\x7c\x6c\x2f\x5f\xcf\xa0\x36\xc3\x37\x05\xe2\xfb\xdd\x00\x7d" - "\xfa\x30\xfa\x34\xd4\x49\xf4\x69\xd8\xd1\x99\x3e\x0d\x3d\x18\x7d" - "\xbe\x71\x48\xf4\x39\x1f\x2d\xa7\x4f\xc3\x20\x39\x7d\x1a\xe2\x6f" - "\x8e\x3e\x0d\x31\x12\x7d\xd8\x33\x18\x7d\x1a\x92\xbd\xd3\xa7\xc1" - "\x28\xd1\xa7\x61\xe0\x8d\xd1\xa7\xe1\x84\x6f\xfa\x34\x4c\xef\x82" - "\x3e\x3d\xbd\xd3\xe7\x7c\xdf\x1b\xa7\xcf\xf9\x68\x3f\xe8\xd3\x9b" - "\xd1\xe7\xc2\x5a\x89\x3e\x17\x7e\xde\x99\x3e\xe7\xf7\x31\xfa\x9c" - "\xcf\x93\xe8\x73\xc1\x22\xa7\xcf\xf9\x13\x72\xfa\x5c\x08\xba\x39" - "\xfa\x5c\x20\x12\x7d\xd8\x33\x18\x7d\x2e\x44\x78\xa7\xcf\x85\x28" - "\x89\x3e\xe7\x4b\x6e\x8c\x3e\x17\xe2\x7c\xd3\xe7\xbc\xcd\x7f\xfa" - "\x5c\x78\xc7\x83\x3e\x2a\xdf\xf4\xb9\x60\xf1\x83\x3e\x21\x8c\x3e" - "\x8d\x0f\x48\xf4\xf9\xf6\x4c\x67\xfa\x7c\x3b\x81\xd1\xe7\xdb\x31" - "\x12\x7d\x1a\x33\xe4\xf4\xf9\x36\x4e\x4e\x9f\x6f\x0b\x6f\x8e\x3e" - "\xdf\x16\x48\xf4\x61\xcf\x60\xf4\xf9\xb6\xd8\x3b\x7d\xbe\xad\x92" - "\xe8\xf3\x6d\xec\x8d\xd1\xa7\xb1\x87\x6f\xfa\x7c\x9b\xd3\x05\x7d" - "\xee\xf2\x4e\x9f\xc6\x19\x37\x4e\x9f\xc6\x8c\xae\xe8\xe3\x9f\xac" - "\xd7\x98\x83\xcf\xbd\x05\xed\xd4\xfa\x6a\x07\xc7\x0e\xfd\x0f\x39" - "\x43\x63\x6d\x3e\xd7\x33\x88\xed\xd1\x68\xcc\xd1\xa4\x90\xa7\xea" - "\xc9\xc5\x47\xf2\xb9\x1e\x41\xbc\xa1\x10\xf4\xa4\xb7\x73\xf9\x75" - "\x3d\x03\xb9\x75\x77\x05\xe2\xde\x6c\xdf\xf9\xdb\x2f\xbe\x16\x70" - "\x3f\x79\x10\xf7\xd1\xad\x07\x79\x19\x7f\xb7\x19\x2e\xe6\x80\x2c" - "\x18\xdd\xd5\xfe\x2d\xf4\x75\xfa\x70\x03\xea\xb7\x17\x4d\xae\xb8" - "\x18\x06\x3e\x19\xe3\x8b\xe9\x1f\xc6\x7d\x16\x17\x1b\x73\x68\xbc" - "\xaa\x01\xe3\xa3\x1f\xe6\xbf\x42\xdd\xe3\x02\x69\x3a\xcf\x6f\x19" - "\x30\x1e\xf9\x01\x64\xf5\x7b\x9b\x48\x53\x94\xcb\x3f\x8f\xd7\xed" - "\x14\x6c\x84\x56\x56\xb7\x79\x06\xbf\x45\x63\xc5\x3c\xa4\x2b\xd2" - "\x30\xbf\x66\xf3\x58\x90\x7d\x07\xe3\x33\x30\x76\xd2\x6e\x38\xa2" - "\x9f\x0c\xf3\xcd\x6c\x9a\x46\xe5\xe5\xf5\xfd\x77\x32\x5f\xb8\xe6" - "\x41\x22\xdf\xc1\x73\x7a\x41\xb9\xb7\x20\xcf\x63\xfd\x7b\x9a\xc8" - "\x3f\xaf\xba\x5d\x0f\x86\xf2\x19\x68\x3b\x54\xb8\xde\x1b\xca\xef" - "\xa3\x9c\x4d\xe3\x7c\x64\x67\x08\x3e\xc4\xff\x2c\x80\x73\x2a\xa1" - "\x4e\x28\xd4\x79\x15\x65\x77\xa1\x8d\x30\x28\x2f\x44\x1d\x58\xb8" - "\xae\x86\xf2\x64\xfc\x76\x20\x5c\xef\x0b\xe5\xc7\xa0\x3c\x84\xed" - "\x79\xb9\x2e\xcc\xd1\x26\xc7\xcd\xed\x19\x6f\xa2\x39\x35\x91\x06" - "\x4c\x17\xf8\xa7\x9b\xff\x4f\x53\x83\xc7\xb5\x18\xb7\x6b\xd5\xe2" - "\x35\xe6\xa3\xf6\xcf\x54\xb7\x6b\x25\x1e\xd7\x72\xdd\xae\x1d\xf6" - "\x68\xf3\xb0\xdb\xb5\xbd\x1e\xf7\x55\xb9\x5d\x33\x7a\x5c\x6b\x76" - "\xbb\x96\x21\x5c\x0b\x68\x33\x34\x07\x4a\xdf\xf0\x9a\xf4\xc2\x79" - "\x25\x9c\x8f\x74\x3b\x1f\x23\x9c\x87\xe7\x37\x8f\xb2\x90\x37\xad" - "\xc2\x79\x4a\x7b\xd6\x7e\xf3\x24\xb7\xf6\xa3\x98\x8d\xa3\x39\xc6" - "\xe5\x3b\x17\x36\x44\xc5\x5d\xd7\xed\x84\x6b\x11\xc8\x57\xee\xbc" - "\xbd\x34\x49\xb3\x60\xe5\x2b\x9a\x84\xb8\x44\x74\x5f\x59\xb2\x30" - "\x51\xb3\x64\x59\x6c\x9c\x2c\xce\xba\x1a\x63\x0e\x62\x4e\x35\x8c" - "\xdd\x42\xf3\x17\x6c\xe7\x1b\x5d\x39\x3f\x00\x57\xe1\x59\xe5\x16" - "\x32\x81\x3e\x2b\x87\xc5\x23\x2f\xc5\xd8\x2f\x2c\xce\x0b\x79\xae" - "\x9e\x34\x7f\x2a\xc4\x79\x31\x41\x5d\xbb\xef\x38\x2f\x97\xab\x69" - "\x7c\x43\xa8\xc7\xe2\xbc\x5c\xae\x81\x79\xfe\x0c\xdf\x8b\xe5\xf0" - "\x60\xb9\xcd\x2e\x89\xb2\x89\x75\x5e\x3b\x8d\x11\x98\xc1\x6c\x19" - "\x9e\xf1\x5a\x07\x0c\xc4\xfb\x84\xef\xa5\x03\xdd\xee\x8f\x65\xd7" - "\xc5\xf5\x41\x78\xa6\x71\x00\xc6\x8f\xe8\x55\x0f\x65\x6a\xbf\xa7" - "\xd7\x2e\x31\x5b\xde\x96\x01\xc3\xf1\x9d\xf0\xbd\xe5\xef\xa6\xfc" - "\x4d\x3d\xb9\x74\x40\x7a\xb7\x4b\xd5\x6e\xb1\xe0\x84\x77\xb8\xe4" - "\x60\x73\xb4\xd3\xbb\x52\xff\x44\x5e\x35\x60\x38\x3e\x1b\xf1\x8c" - "\xed\x65\x80\xf2\x96\x01\x5a\xb1\x3f\x6e\xfd\x1b\x8e\x7a\x3d\xf4" - "\xef\x0c\x1d\x13\xa0\x29\x0f\x34\x15\xde\x61\x07\x6f\x68\x4e\x65" - "\xb9\x0c\x60\x3d\xc1\x9c\x2c\x74\xad\xba\x1c\x2b\xda\x32\x71\x8d" - "\x62\x36\xcc\xcb\x92\xfc\x87\x31\xba\xb6\x88\xeb\xd7\x65\x37\xf9" - "\x8f\x3d\x13\xce\xed\x75\xe7\x21\xb7\xe7\x7d\x8a\xcf\x83\x7a\x93" - "\xd8\x7e\x80\x01\x5a\x9c\xef\x50\x56\xa1\x2f\x26\xde\x8b\x7d\xf4" - "\x95\x87\xcf\x57\x0c\x45\x69\x1c\xbf\x8b\x14\xc7\x31\x87\xee\x91" - "\xff\x6e\xb8\x68\xaf\x13\x72\x60\x98\x72\x5c\x79\xa9\xbf\xd3\xd1" - "\xdc\x6e\xc6\xfc\xc6\x47\x83\x49\x0c\x1b\xdb\xef\xe6\x23\xc6\xe3" - "\x9c\x61\x58\xff\x9d\x89\xd1\x7c\xa8\x95\xf5\xff\xbb\xd7\xf0\xbc" - "\xe4\x7f\xff\x9d\x45\xac\x27\xe2\x32\xfb\x5e\xf5\xdd\xbb\xb4\x1e" - "\xcd\xdd\x35\xd4\xce\x68\x3e\x44\x55\x4f\xbe\x2b\x17\xea\x5f\xa4" - "\xbc\x48\xe3\xf7\x7c\xd7\xc8\x6f\x19\x6a\x87\xbe\x82\xfe\xd3\x2c" - "\xe4\xac\x60\xcf\x85\x63\x39\xf6\x05\xc7\x08\xf7\x92\xf3\x5b\xf2" - "\x1b\xf9\xd0\xa1\xde\x73\x5e\x33\xbf\xee\x87\x9a\xc8\x15\x26\x43" - "\x28\x79\x3b\xda\x58\xd9\xbb\x5e\x89\x73\xf3\x7d\x0e\x16\xeb\x30" - "\xec\xa6\xd7\xa8\x4f\xb9\x3e\x09\xed\x41\xc2\xb5\x24\xdc\x5f\xeb" - "\xfa\xdd\xd3\xed\x77\x0f\xfc\x4d\xfd\x9a\x53\xe8\xda\x1a\x28\xed" - "\xe3\xbf\x12\x0b\xe5\x60\x8f\xb2\x5a\x56\x5e\xcd\xfc\x9e\x41\x36" - "\x6b\xa0\x3e\xe4\xc2\x79\xa1\xed\xbb\x69\x7f\x92\xf8\xd1\xc0\x1b" - "\xa3\x71\x4f\xb7\x30\x0f\x47\xe3\x9e\xed\x10\xc7\x1c\xba\x5f\x1b" - "\xae\x8f\x12\x8e\x51\xc2\x71\x38\xcb\xd3\x7a\x25\x52\xca\xb5\x8e" - "\x36\x9a\x2b\xc3\x7d\xe5\x7e\xc7\xfd\xe0\xc2\x31\x4a\x38\x0e\x17" - "\x72\xd5\xce\x86\xfb\x5c\xfb\xbf\xbd\xfb\x20\x5f\xd9\x20\xee\xe5" - "\x76\x1a\x35\xb5\x9c\x71\x48\x29\xe6\x05\xc5\x38\x61\xe9\xcd\x18" - "\x2b\xc6\x46\xcc\xa4\x83\x98\x13\xdb\x32\x30\x37\x68\x25\xcb\x09" - "\x8a\x7b\x60\x15\x68\x37\x47\xd9\xb1\x52\x7f\x89\xe6\x05\x5d\xd5" - "\x2c\xe6\x3d\xb9\xd2\xe8\xdc\xa2\xa9\x15\xe6\xcb\x0e\xe6\xa3\xdf" - "\x42\xed\xc5\x34\xaf\x75\x33\xfd\xee\x15\x74\x81\xb4\x24\x8b\x75" - "\xd8\xd8\xb5\x50\xdb\xd7\x6e\x83\x98\xfb\xb1\x45\x23\xe6\x9a\xb6" - "\x90\x96\xd4\xab\xa1\x73\x80\xb7\x5a\x46\xc9\x7d\xa6\x5b\x26\x63" - "\x9b\xd8\x77\x0b\xb9\x62\xc5\xb6\xa1\x8e\xce\x35\x67\xe1\xfc\x2a" - "\x07\xe9\x07\xfd\xba\x20\xb6\x0f\xd7\x61\xfe\x5b\xe9\x58\x62\x9b" - "\x57\xb7\x6c\xd0\xc2\xb9\x8d\x96\x80\xd6\x52\xe6\x73\xdd\x02\xeb" - "\xdf\x9f\xc7\x77\x25\x03\xf1\xaa\x61\x80\x4f\xc3\xa2\x38\xe3\x30" - "\x0d\x8b\xe5\x3d\x4c\xcb\x6c\x8c\x2d\xe7\xd1\x3b\x7c\xf3\x35\x12" - "\x88\x3e\x10\x8c\x67\x5b\x59\x0c\x64\x38\x07\x58\x5d\xc8\x6f\x19" - "\x46\xd7\x27\xff\xd6\xfd\x16\x1b\x6d\xa3\x1f\x8b\x6d\x86\x7b\x97" - "\xda\x0c\xad\xd1\xae\xfc\x09\xae\x79\xdc\xba\x10\xbf\x3d\xc0\xfc" - "\xa0\x7d\xf4\xec\x03\xf6\x17\xda\x6a\xf0\x29\x63\xaa\x86\x69\xe8" - "\xf7\x99\xad\x83\x2d\xcc\x47\xb5\xf5\xaf\x01\x11\xfd\x1b\xe1\x59" - "\xfb\x5d\x79\x23\xa0\x4e\x36\xfa\xde\x43\xfb\xae\xf7\x4c\xa0\xcf" - "\xa8\x66\x73\xbd\xb5\x91\xdb\x32\x4c\xb3\xb9\x83\x04\x0a\xe7\x1b" - "\x2b\x1d\x76\xcc\x3d\xe0\x35\xce\x16\xcd\x9d\x87\x3e\xe1\x5b\x87" - "\x69\x70\xdf\xd0\xa3\x76\xb1\xcf\xb6\x46\xdc\xaf\x82\x7d\x66\x63" - "\x6b\xab\x13\xc7\x71\x53\x0b\xb4\x9d\x76\x96\x34\x10\x5b\x1c\xfa" - "\xcd\xd1\x31\x49\x11\x7d\x39\x6d\x54\xe7\xa3\xcf\x67\x75\xa8\xee" - "\x4f\xf3\x18\x41\xfb\xf9\x34\x17\x1b\xbc\x03\xd0\xc2\x94\x86\x7b" - "\xfe\x6d\x34\x2f\xc0\x7a\x1a\xab\x03\xde\x9b\xfa\xc9\x5e\x15\xbe" - "\x93\xd8\xf6\x8a\x6b\x85\x45\x38\xb7\x19\x9f\x9d\xd4\x41\x2e\x13" - "\xdb\xab\x98\x63\x1d\xc6\x23\x0a\xe3\xd3\x55\xda\x60\x9e\x24\x77" - "\x20\x2f\x44\x61\xee\x4e\x0b\xb1\x6d\x60\xeb\x1b\x8e\xb9\x2d\x1e" - "\x9f\x8f\x63\x0b\xba\x99\x15\xc6\xf4\x5a\x9b\xe1\xaa\x2b\xff\x63" - "\x76\x38\xea\x3b\xb6\x2e\xe3\xeb\x3a\xa1\xcf\x95\xb9\xb0\x76\xf6" - "\x3b\x8b\xfd\x2b\xe3\xc2\x86\x69\xd0\x27\x1b\x7e\x2f\x11\xd6\x73" - "\x4a\x3b\xc6\x07\x57\xf7\x04\x44\x44\x0e\xa8\x64\xbc\x40\x63\xa8" - "\xc1\xb9\x89\xc2\xf8\xd1\x7c\x12\xc6\x24\x36\x0e\x42\x7d\x07\xb3" - "\x17\x47\x0e\x81\x7e\xb9\xe5\xbf\xbb\x4a\xd7\x6e\x8c\x7d\x9f\x4f" - "\x75\xc2\xab\x87\xdd\xfa\x6c\xa3\xfb\x5f\x5b\xd0\xd6\x77\x75\x36" - "\x3e\x6b\x13\xc6\x0f\x43\xbe\x68\x72\xe7\xff\xab\x63\xb1\x9f\xe8" - "\xf3\xeb\x0c\x1d\x6c\x81\xf5\xb6\x01\xc7\x19\xee\x49\x84\xb9\xe0" - "\x33\x57\x14\xae\x17\x98\x4f\xa4\xcd\x70\x4d\x2b\xae\x85\xa0\x5f" - "\xc0\xba\xd0\x36\x80\xea\x9d\x20\x4f\x9b\x39\x94\x67\xda\x28\xdf" - "\x00\xce\x6a\x04\x8c\xd5\xc0\x3d\xb3\xc5\x6f\x5e\x4e\xdc\x37\x71" - "\x99\x7e\xef\xb5\x89\xf9\xe4\x58\xbc\xbe\x6b\x19\xd2\x3e\x8b\x6b" - "\x1b\x3b\xed\xb3\xc0\xbd\x3f\xdb\x69\xde\xb1\xfd\xb8\xa6\x54\x34" - "\x37\xe0\x1a\x41\xef\xc7\xbd\x17\x69\xa0\x93\xb3\xfd\x43\x0d\x68" - "\x9f\xa7\x39\x4f\xb0\x2f\x2c\xf7\x44\x3d\xfd\x0d\x7c\x1b\x88\x47" - "\xc6\x4b\xd7\xac\xae\x9c\xe9\x40\x6f\xfc\xd6\xf6\x61\xe0\x2f\x89" - "\xe9\x61\x5c\xaf\xdb\x06\x60\xfe\xef\x36\x43\x9b\x5a\xcc\xfd\x4d" - "\x73\x7d\xb3\xf7\x51\xfb\x8c\xcb\x38\x92\x44\x61\xbc\x00\xdc\x5f" - "\x47\xc7\x40\x95\x9f\x85\xb1\x9e\x31\x6e\xa5\x29\x05\x73\xb2\xb4" - "\x7d\xfa\x46\x38\xdd\xa3\x6c\x33\x8d\x6c\x41\x3f\xac\xe6\x0b\xa9" - "\x34\x1e\x53\xd0\xd4\x64\x07\x8f\xf7\x51\x79\x22\x34\x3f\x0b\xaf" - "\xd1\x5c\x07\xd8\xe6\x4d\xc7\x2d\x6e\xcb\x13\x64\xd3\x66\xd0\x7d" - "\xee\x03\x5a\x51\xd9\x1d\x7e\x87\x37\x11\x7b\x3b\xcb\x41\xcb\x62" - "\xef\x0b\xfe\xd8\x3d\x59\x8c\x0d\x18\x33\x1a\xf3\xc0\xbe\x44\x33" - "\x14\xf3\x35\xdb\x97\xd3\x38\xd8\xc6\x01\x51\xc2\x18\x44\x6d\x66" - "\xfd\x0a\x99\x97\xac\xa4\x7d\xc4\xfe\xf9\xd7\x37\xfb\x68\x41\x8f" - "\xe8\xd9\x66\xb0\xa7\x8a\xb1\x39\x98\x3c\xc5\xe2\x63\x33\x5a\xd8" - "\x2f\x0a\xf2\xf3\x28\xe1\xd9\xa3\x6e\xc1\xb3\x0f\x0b\x6d\x06\xb1" - "\x18\xe1\x6d\x20\x03\x0d\x00\x0c\x6f\x0f\x14\xf5\x19\x61\x0f\xd1" - "\x70\xa6\x67\xb5\x47\x4a\xfa\x0c\x1b\x43\xd9\xbe\xbb\x65\xcb\x12" - "\x35\xb1\x0b\x57\xe8\xe7\x27\xbe\x1c\xaf\x89\x4b\x48\x58\x96\xa0" - "\xc1\x20\x4d\xee\xf3\x87\xe5\x31\x6a\x8f\x12\xf2\x13\x16\x4a\xf9" - "\x09\xdb\x93\xdd\x73\x7a\x5a\x48\x7b\xea\xad\xb1\x5d\xb4\xe7\xfa" - "\x6a\xc7\xa8\xe4\x8a\xe0\xbf\x18\xfe\x4d\xf0\x8f\x32\x06\x99\x67" - "\x27\xd1\xb0\xd6\x53\x3f\x13\x29\xe6\x44\xfb\x34\xf4\x31\xaa\x27" - "\xed\x57\xf3\xb9\x40\xd4\x83\x30\x6f\x78\x11\xd6\xdf\x0d\xf7\xc3" - "\xbf\x09\xfe\x4b\xe1\x9f\xde\xc7\x7d\x40\xf7\xcb\x17\xb9\x5f\x63" - "\xfe\x23\xeb\xf6\x63\x1d\x7e\x1d\x7e\xb2\xc7\xfc\xeb\xac\x9e\x47" - "\x1f\x94\xbc\xa1\x45\xac\x47\xbf\xed\xf7\x59\x47\x34\x5e\xea\x05" - "\xf0\x86\x8b\x85\x42\x3d\xea\x6b\x23\xbe\x0f\xe6\x1a\x80\xfa\x62" - "\xbd\x40\xde\xd0\x36\x4a\xa8\x47\xd7\x0a\xce\xa0\xf4\xf6\xdc\x1e" - "\xbc\xa1\x38\x52\xa8\xa7\x72\x6f\xcf\xad\x4e\x4f\xce\xf0\xd5\x5e" - "\xac\xc3\xad\x0b\x54\x33\xd9\xa9\x3d\x17\xea\x7b\x8d\xd1\xea\x1f" - "\x9d\xae\x47\x7b\xd2\x49\xff\xf2\xc2\xb8\x27\x16\x2e\x4d\xc2\x4c" - "\x53\x89\xcb\x56\x26\xe2\x71\xe9\xfc\xdf\xd1\xc3\xb2\x79\xbf\x7d" - "\x99\xfd\x48\x5c\x1c\x85\x3f\x16\x03\xbf\xe1\x31\x76\xa5\x1e\x0f" - "\x2f\x2f\xc3\x62\x72\xfc\xf0\x95\x2f\xe3\xc1\x73\x1f\x28\xc8\x56" - "\xd7\x1b\x81\x37\x6a\x18\xce\x5e\x07\x1d\xe9\x62\x24\x95\x63\xd7" - "\x59\xc8\x09\xad\x83\x88\x76\x2d\x79\xcc\x11\x87\x02\x63\x8e\x84" - "\xac\xd3\xbf\x1c\xe2\x58\x18\xc7\x6f\x19\x02\x32\xb0\x23\xca\x42" - "\x16\x11\x01\x1b\xa3\x69\x9c\x53\xc3\xf5\x0c\xc1\xb7\x33\x90\x33" - "\x6a\x6c\x18\xbf\x1f\xca\x34\xcf\x36\x07\xeb\x01\xd4\x1b\x03\x65" - "\xcc\xaf\xad\x86\xeb\x78\xdf\x78\x28\x47\x40\x39\x92\x33\xaa\x83" - "\x70\x8f\x31\x94\x35\x50\x1e\x08\xed\x1b\xc5\x79\xe1\x5d\x56\x76" - "\x14\x89\xb9\xbf\x59\x9e\x6f\x87\xc9\x95\xe7\x1b\xf3\x39\xa5\xa9" - "\x66\xd3\xf5\x97\xca\x20\x8e\x86\x80\x88\x07\x92\xa0\x4e\x83\xb8" - "\x5e\x32\x7b\x87\xc3\x26\xc6\x4f\x61\xf6\x0c\x67\xa0\x5b\xbe\x74" - "\x2c\xab\xc5\x7c\xe9\x68\xef\xa2\xf9\x1a\xe1\xc8\x1b\x30\x9e\x2c" - "\x5f\xe8\xd5\x96\x47\xf3\x7c\x3a\x57\x63\x6c\x5e\x6b\x7a\xac\xe2" - "\x27\xf9\x68\x43\x83\x32\x8b\x2d\xc9\x5f\x26\x4e\x9a\x1f\x4a\x8c" - "\x3b\xe7\x1e\x4b\xc2\xeb\x7e\xa8\x53\x20\x33\xd0\x7c\x57\x8b\x97" - "\x85\x38\xe6\xc7\x31\x39\xd0\x79\x86\xe1\xd7\x10\x21\xa6\xb1\xb3" - "\x84\x7f\x81\xe5\x44\xb1\x10\x6e\x22\x8b\x3d\xb5\x78\x19\x0f\xf7" - "\x86\x24\xcf\x8f\xa3\xe7\xa0\xde\x7a\x90\xd5\x84\xfe\xbd\x65\x8e" - "\xc4\x3d\xae\x9c\x10\x23\xc3\x59\x38\xf7\x81\x0c\x7c\x4e\x10\x95" - "\x43\x4e\x91\x60\xcc\xb7\x89\x7d\xcb\x77\x8b\x8b\xb7\x19\xce\xa1" - "\x0f\x69\xeb\x0b\x24\x18\xe3\x00\x0b\x7d\x29\x64\xf9\xc3\xb8\x68" - "\x31\xd6\x94\x05\xce\x79\xbe\xcf\x0b\xbf\xa6\x5c\x39\xe8\xe5\xe1" - "\xd3\x26\xc0\xaf\xe1\x42\xca\x6a\x77\xde\x8c\x6c\x0d\xd3\x5a\x5b" - "\x0f\x0e\xfa\x98\xe5\x25\xe5\x40\xff\x77\x52\x5d\x88\x43\x1d\xb8" - "\x4d\x97\xcb\x7c\x50\xb9\x32\x8c\xbb\xcb\x19\x50\x9e\xc4\x7d\xd3" - "\x1c\xcd\xa9\xc3\xab\x86\x04\xed\x5e\x8b\x31\x9e\x15\x30\xc6\xdc" - "\x01\xbc\x26\xc4\xf0\x52\xd2\x18\x57\x4e\x12\x41\xf7\x08\x83\x8c" - "\x82\x7b\x50\x2f\x28\x14\x15\x28\x77\xa0\x3d\x89\x33\x70\xd3\x91" - "\x6f\x81\xc6\x18\x43\xc4\xc6\x87\x69\x2c\x7c\xe8\x90\xfd\xc8\xc7" - "\x28\xeb\x9a\x55\x38\x66\x3c\xc6\x0c\x78\x06\xfe\x7f\xc3\x72\xcf" - "\xcc\x6a\x14\xdb\x84\x72\x30\xe8\xe9\x6a\x38\xaa\xda\x0c\xfc\x44" - "\xb7\x9c\x7c\xc2\x9e\x68\x7e\x21\xc6\x7e\xc3\xb6\xa9\xec\xac\x50" - "\xbc\xcb\x64\x10\x3e\xd1\x42\x54\xa3\xd8\x5c\xc4\x5c\xa3\xaf\x67" - "\x09\xbf\x41\xfe\xf9\xa9\xd5\xa3\x8d\xd3\xa2\xad\x94\xf1\x34\xac" - "\x79\x4a\xf2\x0c\xfc\xff\x06\xea\x1f\xb1\x90\x7f\xa7\xf5\xd7\x2b" - "\xe9\x3e\xc9\x0b\x01\x11\xb8\xdf\x9d\xaf\x16\xcf\xf7\x50\x44\xc3" - "\x98\x62\x4e\x37\x36\xf7\x5b\xc3\x06\x37\x43\xd9\x26\xda\x58\xa8" - "\xcd\x25\x13\xfd\xba\x5c\x65\x3b\x94\xd5\x62\x19\x7e\x6b\x44\xac" - "\x40\x9b\x44\x6b\xba\x6e\x07\xea\x9d\x2f\x47\x80\x5c\x08\xf2\x0d" - "\x5c\x07\xfa\xbf\x3e\x91\xdd\x6b\x88\x6e\x35\x6c\xd2\xdb\xc2\x76" - "\x66\xd8\x00\xff\xe0\x1a\xc8\x7f\x8b\x6b\x85\x76\xe2\x2d\x01\x57" - "\x33\xc4\x77\xe3\x0c\x01\x21\xdc\x96\x21\xa5\xf4\x1d\x15\x8a\xbd" - "\xf0\xbb\xdc\x1a\xaa\x29\x80\x7a\x40\x7f\x87\xb0\xbf\xf8\x52\xc1" - "\xc6\x0e\xd5\x74\x33\x48\xf0\xa6\xdf\x76\xe0\xf8\x51\x9f\xec\x4d" - "\x29\xaa\x69\x28\x77\x62\x1c\x10\x9a\x13\x0d\xe3\x5b\x3a\x48\x4f" - "\x9a\x53\x60\xcb\xfa\xd1\x34\x96\xfe\x2a\x6d\xb0\x18\xdb\x12\xf0" - "\x28\x87\x57\x2e\xb3\x61\xbc\x4b\x9a\x3b\xa4\x4d\xdb\x87\xc6\xb8" - "\x14\x62\x5b\xee\x4a\x22\xea\x3c\x8e\xc5\xb6\xa4\x31\x42\x7a\x82" - "\x9e\x92\xe4\x3d\xbe\x25\x6f\xd8\x3f\x51\x8c\x6f\xc9\x5f\x73\xda" - "\xe1\xf7\x40\x18\x0f\xcc\xff\xae\xa5\x65\x29\xde\x54\xa0\xd7\x78" - "\x97\x4a\xc0\x3d\x25\x8b\x77\xe9\xd7\x7a\xa1\x50\x50\xbb\x6c\x5b" - "\xa6\x02\xf0\x6f\x0d\xf5\x83\x71\x3b\x57\x02\x6f\x22\xc4\x37\xe0" - "\xe3\x85\x73\x35\x16\xf2\x9a\x18\x93\xca\x8a\x3a\x7e\x0e\xb5\x8d" - "\x71\xcd\xfc\xf5\xf8\x1d\xde\x30\xa7\x25\x6c\x0f\xf4\x03\xe6\x74" - "\xa6\x32\xc2\xa2\x50\xa6\xe2\xbd\x54\x97\x54\x28\x23\x3c\xe7\xf5" - "\x82\x97\x97\xc5\xc6\xcd\x5b\xb4\x44\xaf\x79\x61\xfa\x33\x34\x51" - "\xe2\x70\xcd\xc2\xc4\x38\xba\x24\x69\x5e\x98\x30\x6e\xea\xd4\xe9" - "\xf3\x7e\x3d\xfd\xe9\xe9\x33\x7e\x3d\x96\xed\x58\x9c\x9e\xb0\x1a" - "\x93\x6d\x26\x2e\xd3\xe0\x4d\x0b\x84\x6c\xe2\x29\x71\x09\xcb\x3c" - "\xf1\x40\x4d\xed\x5c\x4a\x6a\xd3\xb5\xe1\x6f\x6a\x4b\x53\x28\x0f" - "\x8b\x36\x2e\x8a\x7d\x0a\xe5\x3e\x1c\x5b\x9a\x6b\x3c\x53\x39\x1c" - "\xe5\x2b\x21\xcf\x3b\xae\x3b\x81\x38\xa7\x71\xfd\x81\x77\xb1\xb8" - "\xc7\xe6\x62\xf7\x06\x04\x2a\xf1\x3e\x61\x2e\x0b\xe7\xee\xe7\xfb" - "\xf5\x4b\xa7\xf1\xb5\x32\x03\xd4\xa2\xdd\x1b\xcf\x89\x7d\xa8\xc7" - "\x3a\x99\xca\x39\xae\x7c\xc2\x99\x01\x63\xa4\x3c\x94\xf4\x4f\x36" - "\x46\x84\xa0\x38\xd3\x03\x64\x95\x9e\xf0\x7f\x17\xfe\x4f\x74\xe1" - "\x7b\x12\x5f\x83\x3a\x5b\x88\x02\xd6\xe0\xe4\x00\x96\xc7\x2a\xb3" - "\x9a\xe6\x5e\x98\xea\x74\x04\xcc\x73\x2a\xe1\x18\xc0\xcf\x73\x06" - "\x52\x3d\x91\x4f\xe2\xab\xe9\x5e\xfb\x24\xbe\x0a\xf3\xb5\x01\x1f" - "\x67\x4d\x75\xa4\x65\x4d\x75\xf2\x8e\x79\x20\xbf\xc3\xf1\x5b\xdc" - "\x33\x3e\xd5\xf9\x2d\x4f\x73\xd6\xe0\xde\x7a\x16\x67\xb0\x14\x7d" - "\x28\xe7\x02\x0f\xe7\xb7\xb0\x9c\xc4\x53\x57\x7f\xf7\xd5\xbc\xd5" - "\x16\x96\x93\xf8\x32\xcb\xe3\xcd\x72\x9d\x93\x34\x68\xa7\x6c\x9e" - "\x33\x40\x33\xd5\x79\x9d\xa7\xfb\x5e\x33\x03\x35\x5d\xe5\x19\xf6" - "\x6a\xbf\xc8\x1e\x19\xcc\x6f\x1b\x9a\xc3\x67\x47\x35\xf2\xdb\x86" - "\xa9\x61\xbd\xaa\x45\x0c\xe7\xb3\xff\xad\x04\xca\x70\xfe\xdf\x0b" - "\xf8\x6d\xc3\xd5\x7c\xf6\xcf\x53\xe1\x08\xe5\x31\x3a\x7e\xdb\x08" - "\x28\xf7\x19\x0f\xf7\x19\xf9\xec\x90\xc3\x50\x4f\xc5\x67\x87\x0e" - "\x84\x23\x94\xc3\x72\xa0\x1e\x94\xd5\x81\x70\x84\x72\xdf\xc4\x0b" - "\x8a\xc0\x06\xb8\x07\xce\x3d\x35\x8a\x3d\x6b\x5c\x34\x7d\x56\xf6" - "\x84\x49\xec\x19\x13\x75\xec\x19\xff\x11\xcb\x9e\x31\x45\xcf\x9e" - "\x11\x0e\xf7\x0d\xcd\xe5\xb3\x23\xaa\xa0\x5e\x04\x9f\xdd\xef\x08" - "\x1c\xa1\x1c\x59\x08\xf5\xa0\xfc\x20\x3e\x0b\xca\x9a\x0c\xa8\x0f" - "\xe5\x87\x17\x43\xfd\x3c\x3e\x7b\xe0\x6c\xa8\x17\xc9\x67\x0f\xc6" - "\xf6\xa1\xac\x1d\x03\xf5\xa0\x3c\x74\x38\x1c\xa1\x0c\xbf\xb7\x8d" - "\x80\xf2\xf3\xf0\x4e\x43\x0b\xf8\xec\x5f\x47\x41\x3d\x0d\x9f\x3d" - "\x1d\x9e\x37\x0c\xca\x2f\xe6\x42\x3d\x28\xeb\xe0\xfe\xe1\x50\x7e" - "\x89\x40\x7d\x28\xcf\x82\x77\x1d\xba\x97\xcf\x9e\x03\xcf\x19\x36" - "\x90\xcf\x9e\x87\xef\x0c\xe5\x98\x5a\xa8\x07\xe5\x05\xd8\x1f\x28" - "\xc7\xc2\x7d\x23\xa0\xfc\x5b\x18\x83\xa1\x85\x7c\x76\x7c\x35\xd4" - "\xd3\xf2\xd9\xbf\xdb\x0b\x47\x28\x2f\x4d\x84\x7a\x50\x5e\x0e\x63" - "\x38\x1c\xca\x89\x6a\xa8\x0f\xe5\x24\x7c\xdf\xfd\x7c\xf6\xea\x62" - "\xa8\x37\x9c\xcf\x4e\xdd\x08\x47\x28\xa7\xc7\x40\x3d\x28\x1b\x60" - "\xfc\x86\x43\xf9\xd5\x20\xa8\x3f\xdc\x3b\x3d\xb3\x32\xf8\x75\x3d" - "\x09\x9f\xfd\x86\x83\x5f\x77\x17\x1c\xb7\xed\xe7\xd7\xf5\x80\xb6" - "\x77\xcc\x86\xf3\x70\xdc\x0e\x32\x71\x8f\xe1\x42\x19\x8e\x7f\xd8" - "\x00\xe5\x28\xa1\x0c\xc7\x5c\x3d\x94\x47\x09\x65\x38\xee\xc2\xf2" - "\x68\x3e\x3b\x1f\x8e\x3d\xe1\xb8\xcb\x0a\xe5\x31\x42\x19\x8e\x05" - "\x63\xe0\xe8\xe0\xb3\xdf\xd4\xc2\xf9\x68\x38\x36\x42\x19\x8e\x79" - "\x85\x50\x1e\x0f\xf5\x83\xa1\x3c\xde\x3a\xa8\x1f\xca\x03\x84\x0f" - "\xbb\x32\x8d\x0b\x7f\x54\x95\x7e\x95\x28\x31\x26\x52\x51\x9a\x05" - "\xe3\xc2\x3c\x54\xaf\xe8\x79\x1c\x73\x74\x60\x1d\xe7\xf6\xa1\x46" - "\x2e\x7c\x18\xc6\xa2\xec\x09\xf5\xee\xba\xa0\xb8\xeb\x34\x62\x8c" - "\x39\xd5\x42\x73\x03\x0a\x31\x2f\x7b\xc2\x3d\x17\x41\x66\xc2\xfc" - "\x0e\x4a\x18\xb7\x72\xde\xd0\xa3\x05\xc6\x6b\x12\x6f\xb8\xa7\x1e" - "\x8e\x50\x0e\x3d\x05\xe3\x05\xe5\x7f\x7f\x1d\x8e\x50\x9e\x35\x0e" - "\xc6\x6d\x52\x5b\xe6\x5d\x13\x2d\x8a\x40\xfa\xcd\x96\x3f\x38\xc8" - "\x14\xe2\xe0\xf9\xa9\x80\x9e\xfc\x9e\x99\xd1\x21\x0e\x13\xd0\x7a" - "\x2c\xc6\x07\x25\xfc\xbe\xfe\xd1\x7c\x58\x47\x0c\xed\xb7\x01\x74" - "\xeb\xeb\x03\x95\xec\xd9\xf7\xf0\xf5\x8a\xbb\x56\x62\x3e\x09\x3e" - "\x3c\xcc\xd7\xf5\x6d\xf4\xfa\xc3\x33\x4d\xec\xba\x8a\x48\xd7\x7f" - "\x83\xd7\xdf\x09\xc1\xb8\xec\x83\xef\x36\x59\x14\x77\xd5\x62\x1d" - "\x8b\xa2\xa7\x9d\x37\x04\x10\xb3\xad\x51\x78\xc7\xbb\xb0\x5e\x1d" - "\xde\xe7\xcb\xe6\xc3\xe5\x8c\x2b\xde\x04\x98\x87\x3a\x30\xac\x7d" - "\x4a\x4d\xda\xc0\xe2\x7a\xc5\xdd\xfb\x77\xa1\x8c\xa4\xd6\x65\x30" - "\x2c\x0c\x5a\x7e\x7d\xab\x56\xad\x49\x09\x81\xf6\xee\x3e\x90\x6e" - "\xe7\x6d\xa6\xb4\x71\x80\xa3\xf4\xfc\x34\xba\x5f\x88\xfd\x1e\x43" - "\xfd\x40\xd9\x6f\x2d\xb5\x39\x43\x5b\x78\xaf\xbb\xce\xe1\xcc\x2c" - "\x4d\xe4\xc2\x75\x46\xfa\x1d\x5d\x11\xb4\xf2\x7d\xce\xa2\x0c\x49" - "\x24\x3d\x34\x29\xc7\xa0\xfd\xa0\x23\x32\xfd\xd4\x55\x97\x5e\xdb" - "\x73\x14\xea\xbe\x89\xb6\xa4\xcc\xa0\x72\x57\x3e\x65\x78\x87\xdf" - "\xe3\xba\xa7\x24\xd1\xb8\x16\x53\x79\x57\x71\xf7\x24\xdc\xd9\xe4" - "\x50\x3f\x59\xe0\x30\x5e\x89\x76\xe6\xe8\x32\xf8\xed\x3a\x63\x1f" - "\x87\x82\xc5\x01\x56\xdc\xbd\xee\x51\x3b\xca\x97\x27\xb1\xee\xcf" - "\xb9\x9e\xa7\x46\x8f\x4c\x26\x4a\x53\xc2\x59\x2c\xaf\xe6\x33\xeb" - "\x86\x9b\x9b\x6b\x88\x29\x81\xb6\x95\xcc\x67\xb6\x9a\xb8\x9e\x8d" - "\xa3\xf3\x51\x4e\x4f\x46\x3b\xdb\x29\x1c\x17\x27\x8c\x33\xac\x21" - "\x77\xeb\xc4\xbe\xe0\xfa\xb1\x09\xc6\x0e\x65\x68\x8c\x7d\x31\xcf" - "\xe9\xc4\x58\x72\x59\x16\x18\x07\xb6\xbe\xde\x8d\x31\x29\x89\xf0" - "\xdc\x2d\x5c\x98\x96\x54\xce\xc6\x6f\x86\x2a\x8c\xcd\x65\xa3\xfb" - "\xe5\x31\xd3\x31\x87\x6b\x3e\xab\xeb\x4e\xbb\x85\x42\x9c\x80\x85" - "\x4b\x13\x13\x96\x6b\x56\x2c\x4c\x89\x1b\x3b\x68\xe5\x70\x4d\x42" - "\xb2\x26\x01\x97\x5c\x76\x02\x96\xe5\x15\x8b\x97\x25\x6a\x30\x03" - "\x79\xe7\xfc\xc5\x11\x20\x47\xd7\x50\xf9\x52\x11\x42\x65\x7e\xbe" - "\x60\xe6\xe8\xc4\x54\x9e\xd3\x3c\x7c\x17\x7f\x59\xd1\x6b\x52\x7b" - "\xcf\xbb\x8b\x71\xad\xe5\x0c\x1a\xaa\xe7\xc1\x3a\x1b\xbc\x23\x8c" - "\xe0\x9e\xbe\xa0\xb6\xcc\x5e\xae\xf8\x97\x16\x45\xc8\x46\x6a\x3b" - "\xc9\xec\xa5\x03\x1e\x74\x08\xdf\xce\x58\xbc\x3f\xe1\x1a\xfd\xb6" - "\x9c\xd9\x2b\x19\xf4\xc8\xfd\x94\x56\x05\x54\xc6\x87\xeb\xbd\x58" - "\x2c\x2c\xcd\xcc\xd1\xfc\xde\xfe\xd1\x20\xc7\x29\xe8\x77\x3c\xc7" - "\x43\xbc\x99\xb4\xd0\xd8\x01\xfc\xb6\x31\x45\x18\xb3\xc3\xb9\x7d" - "\x64\x14\x17\x3e\xa6\x88\xfb\x53\x24\x49\xdf\x43\x94\x87\x60\xce" - "\x07\x6a\x80\xbf\x1f\x26\x0f\x1d\x4b\x6b\x54\x42\x9f\xdf\x3d\x96" - "\x56\xa3\xe4\x73\x1e\x0d\x6a\x1d\xf8\x80\xc6\x2e\xe4\xb9\x36\x3b" - "\xec\xe4\xe3\xf1\x04\xf5\xb8\x62\x5b\xdf\x09\x13\x6d\x7d\x47\x46" - "\xd8\xb7\x4d\x2e\x32\x3d\xfc\x53\x32\xe1\x11\xfe\xbb\x8f\x4a\x08" - "\x69\x56\x84\x24\x7e\x34\x9e\xea\x16\x55\x76\xd5\x90\x6a\xdb\xf6" - "\x31\x51\x18\x2f\xab\x7d\xfb\x14\xd2\x11\x1e\x65\xfc\x10\xea\x9c" - "\x04\xdd\xe7\x13\x0d\xf0\xef\x00\xa2\x6c\x1f\xdc\xcf\x78\xa8\xc3" - "\xa8\x2c\x2d\x19\xc3\xec\xbe\x31\x30\x67\x28\x3f\xdd\x33\xe7\xa3" - "\xc3\x25\x04\x9e\x4d\x0e\x75\x4c\x54\x7e\x3c\xba\xd3\xf5\xb5\x1f" - "\x45\x95\x90\x36\x8c\xb1\x0c\xba\xe5\xd1\xb3\xb9\x84\xdf\xfe\x8c" - "\xfe\x40\x8a\x5d\x09\x82\xb3\xb2\xa2\x26\x97\xa4\x9e\x27\xbd\x1d" - "\xdf\x69\x03\xff\x02\xf7\xb7\x63\x0c\xd4\x4f\x22\x68\x2c\xc4\x34" - "\x13\xcd\x61\x1b\x52\x09\xf2\x02\xf7\x9d\xb6\x67\xe5\x74\x13\x81" - "\xeb\xd9\x8e\xff\x88\x20\x15\xf1\x56\x62\xd6\x15\x90\x76\x65\x34" - "\x79\xf7\xa5\x02\xf2\x26\xe8\x29\x6f\x5e\x26\xc1\x54\xf6\xbd\xae" - "\xed\xe9\xb8\xae\x0d\x74\xac\xd1\x62\x6c\x2a\x9e\xff\x4e\xdb\x0b" - "\x65\x61\xc7\x32\x6d\x50\xa5\xb5\x80\x3c\xda\x48\xb4\xed\x4a\x12" - "\xd2\xbe\x46\xdb\xab\x52\x9f\x0b\x6d\x81\x70\x0b\xe3\x8a\x71\xf1" - "\x30\x5e\x1e\x8e\xd3\x3d\x3a\x32\xbd\x59\x71\xcf\xe3\xbd\xaa\x49" - "\x5f\x8c\xcb\x8a\xf2\x25\xc6\x74\xe6\xd4\xcf\xe8\x9d\xea\x31\x51" - "\x69\x57\xa1\x5f\x18\x77\xe8\xe0\xa0\x02\x94\xcf\x41\xf6\x50\xe0" - "\x3b\x73\xbc\xb6\xd7\x3c\x3c\x6e\xd5\x64\xa3\x8c\xce\xb5\x45\x60" - "\x7e\xa8\x20\xec\x27\xe6\x6a\x5e\xfb\x35\x8c\x65\xba\x36\x10\xea" - "\x05\xc3\xf9\x3e\xe6\x66\x3b\x71\x8e\x18\x54\x34\x52\x4f\x73\xf0" - "\xaa\xf3\xd3\x88\xca\x98\x46\xd4\x9a\x7f\xa7\xbc\x34\xc3\x79\x60" - "\x50\x01\x9f\x19\x39\x10\xed\x31\xec\x5c\x9f\xc7\x35\xbf\x24\x44" - "\xf3\x53\xfc\xdd\xbb\x4e\xf3\x04\xd0\x50\x3d\xae\x8a\xea\x0f\xa8" - "\xb3\x2a\x7a\x7f\xca\x78\xbc\x77\x59\x7b\xcf\xdf\xc6\x73\x99\x3b" - "\x36\x70\xeb\x02\x23\x31\x3f\xf7\x65\x45\xef\x03\x7c\xf6\xdb\xfb" - "\xf9\x9c\xc9\x94\x17\xa1\xfc\x56\x7b\xcf\xfb\xca\xf9\xec\xbf\xa8" - "\xa0\xfd\x31\xed\x8a\xc0\x6a\xf8\x17\xe6\x48\xef\x02\x7c\x6f\xe7" - "\xde\xfe\x11\xf8\xde\x34\xa7\x10\xbc\xd7\x3c\xa0\x19\x1f\x3e\x2e" - "\x83\xc6\xd9\xbf\x0e\xe3\x2b\xe4\x5c\xc5\xf1\xc0\x31\xe0\xae\x6b" - "\x7b\xd1\x77\xbd\xae\x0d\x86\xf1\xc5\x18\xcc\x21\x69\xf3\xe1\x9e" - "\xed\xe3\x72\xe0\x5a\x9f\x76\xf5\xb8\x52\xcc\xed\x65\xd6\x5b\x89" - "\x73\xdb\x38\x23\xc6\x18\xdc\x91\x02\x73\xae\xef\x38\x90\x45\xc6" - "\xe5\x09\x73\x8b\x60\x3f\xb9\xec\xbf\xcc\x6e\xc7\xbd\x75\xd0\x37" - "\xe8\x5f\x35\xfc\xd7\x58\x14\xbd\x07\xb6\x0f\xea\xaf\xb5\x28\x82" - "\xed\xd0\xd7\x48\x3e\x73\xd4\x74\xfc\x0d\xd7\x22\x61\x6c\x7a\xe3" - "\x38\xe0\x78\xb0\xb1\xe8\xd3\x43\x1a\x8b\x18\x23\xd4\xb3\x71\x99" - "\x39\x70\x6f\xef\x6a\x3e\xf3\x51\xb5\x5b\xbd\x11\x52\xbd\xc5\xa3" - "\x58\xbd\xfc\x1a\x56\xef\xe7\x1b\xe1\x7a\x19\x1b\xef\x3e\xcb\x3b" - "\x8f\x77\x9f\x85\xd2\xbd\xd3\x6b\xd9\xbd\xaf\xc5\xb3\x7b\x07\xe2" - "\xbd\x7b\x3c\xfa\xb4\x43\xaa\x3f\x55\xc5\xea\x6f\x88\x60\xf5\x1f" - "\xd2\xb9\xd5\x3b\x2e\xd5\x7b\x29\x8f\xd5\xcb\x2e\x62\xf5\x1e\x29" - "\x86\xeb\x4e\x2f\x7d\xb9\x2a\xdd\x93\xac\x61\xf7\xbc\x55\xce\xee" - "\x19\x3f\x11\xf8\x69\x84\xbc\x2f\x21\x83\xa4\xfa\x09\xc2\x7b\xef" - "\x9d\xcd\xea\xff\xc2\xe6\x56\x6f\x32\xab\x87\xd7\x0f\x41\xbd\xde" - "\xa5\xed\x3d\xd3\x02\x59\xbd\x67\x73\x90\x1f\xa1\xce\x12\x2e\xf3" - "\x81\xc3\xed\x3d\xfb\x15\x40\x3b\x47\x80\x36\x11\x78\x04\xda\x45" - "\x70\xc6\x21\x55\xf0\x7b\x14\x7e\xd7\x41\xcc\xb5\x28\x7a\xa9\x01" - "\x77\x9d\x5e\x6d\x5f\x99\x21\xfb\x5d\xb6\x37\x0e\x64\x83\x6d\x43" - "\x7d\xc5\x59\x0d\xa4\x31\xfa\xb7\x0f\x2d\x32\x72\x2c\x37\x3c\xf0" - "\x28\xc8\x36\x21\xa7\x61\x2d\xcc\xa0\xb1\x96\x73\xc6\x46\x71\x03" - "\xfb\x63\x0c\xb5\x00\x73\x6a\x23\x29\xe2\x1a\x95\xc6\x0e\x12\x58" - "\x09\xeb\x0c\xd6\x2f\x82\x35\x55\xb3\x34\x00\xd6\xd7\x90\x4b\xc6" - "\x6b\x42\x7b\x05\x33\xa3\xd3\x97\xb0\x7c\xd8\x28\x57\x21\x36\xc3" - "\x7c\x0c\xa6\x79\xda\x96\xa2\x5c\xa1\x1a\x00\xbf\x31\xb6\x22\x69" - "\x1f\x7c\xbf\xa9\xfd\x8f\x33\xa3\x3b\xc2\x1f\x35\x76\xfc\x29\xb2" - "\xe0\x7a\xf8\xd8\xa8\xeb\xdb\x9f\x2c\x72\xfc\x51\x57\xe4\x18\xdc" - "\x3f\xda\x19\x1e\xa5\x82\x67\x03\x6e\xe7\x2a\x0f\x72\x45\xca\x83" - "\x69\x26\x25\xb6\x7b\x2c\xad\x40\x79\x34\xad\x4a\x79\x94\x2b\x56" - "\x1e\x4b\x33\xc2\xb1\x10\x73\x76\x81\x2c\xa7\x5a\x7e\x34\xad\x14" - "\xd6\x0d\x15\xd0\x39\x24\x57\xb4\x5d\xf2\xe3\x1c\xa4\xb2\xd0\x41" - "\x4e\x24\x5e\x25\xd6\xd0\x21\x35\xf0\x5f\x6b\xed\x3b\xae\xd8\xda" - "\x77\x72\x11\xed\x73\xf8\x78\xfa\x8e\xb8\x37\xf5\x28\xc7\xfa\x2c" - "\x8c\x07\xb6\x79\x26\x1f\xbf\xd1\x8a\x71\xa8\x15\xa1\x39\x9d\xe2" - "\x50\x2b\x59\xbe\x38\x57\x2c\xea\x1f\x22\x0e\xb5\x60\x23\xa0\x71" - "\xa8\x41\xdf\xa3\x7a\x1f\xac\x5f\x34\xc7\xa4\x03\xe4\xb3\x6d\x4f" - "\xaa\x50\xbf\x43\x79\xac\x2d\x33\xd4\x24\xea\x67\x28\x63\x38\xb7" - "\x0c\x69\x84\xff\x06\x38\x0f\x73\xf4\x9d\x28\xf1\x3c\xbf\xb5\x65" - "\x1a\xda\xd0\x9d\x7c\xfc\x2f\xda\x70\xbf\x25\x1f\xff\x94\x73\xdb" - "\x48\x8d\x73\xdb\x64\x23\x9c\x1b\x03\xff\x63\x9d\x5b\x5a\xa6\xc3" - "\xbf\x0e\xfe\x67\xc3\x7f\x0c\xfc\xc7\xc2\x7f\x3c\xfc\xeb\xe1\x3f" - "\x11\xfe\x93\xe1\x3f\x15\xfe\x33\xe0\x7f\x03\x1f\xda\xb2\x18\xe3" - "\x68\x42\xdb\x46\xa0\x7b\x84\xd8\xae\x34\xbe\x61\x63\xe1\x7d\x31" - "\x6e\x5e\x15\x97\xfd\x36\xfd\x26\x80\x3c\xcf\xef\xeb\x37\x11\x71" - "\x97\x1f\xf4\x80\xc6\x3a\x60\x66\x94\x75\x80\x2e\xd7\x1a\x3a\xcb" - "\x04\xff\xa5\xf0\x5f\x65\xdd\x36\xae\x0a\xe8\x97\x6b\xed\xfb\x4c" - "\x4c\x5b\x66\x18\xcc\x99\xfb\x53\x99\x0d\x29\x6c\x3f\xfc\xce\x13" - "\x7e\x17\x5b\x14\xe1\xd4\x7f\xc0\xda\x77\xbc\x06\xca\xa5\x16\xc5" - "\x7d\xb4\x5e\x6b\xf8\x38\x8b\xb0\x4f\x33\x03\xce\x83\xfe\xdf\xa7" - "\x98\xd5\x7b\x52\x16\x03\x6e\xc9\xcb\xfa\x79\x4b\xe6\x27\xcf\x5b" - "\xb1\x78\xe1\xcb\x71\x2b\x9e\xd0\x0c\x8a\xd5\x68\x17\x26\x2c\x9f" - "\xb7\x7c\x65\xdc\xca\x38\x2a\x36\xc1\xa9\x47\xe4\x3e\x68\x98\x67" - "\xc3\x01\xf2\x7d\x9f\x06\x9e\xc7\xf5\x6a\x92\x0d\x78\xec\xe1\x99" - "\xd1\x47\x2e\x5b\x95\x4e\x90\x5b\x82\x1b\x32\x60\xde\x8d\x8d\x3a" - "\x72\xd9\xae\x0c\x6e\xd0\x10\x1e\x78\x1d\xaf\x99\x1b\xaa\x04\x39" - "\xe6\x14\x29\x47\x39\x06\xea\x1c\x5c\x6a\x57\x4e\xc1\xfb\xff\xd4" - "\x3f\xfa\x10\xfc\xe6\xb7\x8f\x29\xc2\xfb\x78\x90\x6d\xe8\x11\x64" - "\x1b\x56\x7e\xd4\x78\x94\x1e\x9f\x2c\x3a\x4a\xeb\x45\xa9\x8e\xe1" - "\xf1\xda\x5a\xbe\x1c\xda\x45\xdb\x18\xff\xa7\xfb\x4d\x47\xd9\x3d" - "\x05\xb4\x0e\xcc\xb3\x7a\x85\x3a\x11\xeb\x51\x5d\x01\xfa\x78\x08" - "\xfa\x91\xbe\x92\x04\x8a\x73\x17\xf5\x01\xd7\xfc\x4d\x42\x39\xef" - "\xde\x3a\x9c\xbf\xd8\x1f\x1e\xe6\xeb\x01\xb8\xf7\xe0\x52\xa6\x3f" - "\x81\xce\x14\x80\xba\x12\x62\x04\x62\x83\x39\xb5\x8a\xde\x5f\xc4" - "\x55\x81\xae\x15\x00\xf7\xaa\x1f\xc0\x6b\x34\x9f\x08\x95\xc5\xd5" - "\x2e\xf9\x57\xcc\x27\x12\x1c\x03\x7c\xb1\x80\x3c\x04\xcf\x79\x0c" - "\xc7\x0f\xc7\x0b\xbf\x9f\xf2\x99\x61\x56\x8c\x95\xb0\x2b\x8c\x04" - "\x39\xfa\xea\xb2\x98\x6d\x45\xed\xda\xff\x6a\x53\xeb\x64\x71\xec" - "\x18\xbd\x34\x71\x4b\xe7\x2f\x58\x1c\x17\x4b\x3f\xb9\xcd\x5f\xb1" - "\x62\xe5\x92\x38\x4d\xdc\xfc\x97\xe3\x35\xf4\xb2\x66\xe5\x0a\xa8" - "\xb2\x30\x71\x85\x66\xd9\xaa\xa5\x9a\x25\x2b\x16\xa2\x74\x1c\x97" - "\x90\xb0\x52\x9f\xd8\x8b\xb0\x3b\x35\x4b\x56\x2e\x4e\x5c\xa8\x87" - "\x1f\x2b\xe2\x96\xc6\x6a\x28\xd5\x57\x40\x53\x8b\x17\x6b\x84\x27" - "\xac\x88\x9f\x9f\x80\x8c\xb0\xf4\x15\xa8\xe4\x76\xbf\x5c\x76\x0e" - "\xc6\x78\x78\xe8\x87\x75\x59\xd1\xb7\xbd\x24\x10\xc6\x3a\x47\x97" - "\x85\xfe\x0b\x50\xb6\x53\x7d\x2a\x53\x5d\x88\x76\xe6\x37\xe0\x1d" - "\x5b\x81\xe7\xdb\x32\xfb\x26\x8a\xef\x46\xed\xce\x18\x23\x14\xe3" - "\xcf\x2a\xfa\x9e\xa7\xfb\x85\x81\xff\xa9\x7f\x4b\xa6\xfa\x1f\x6c" - "\x2c\xfa\xee\x75\xb7\x61\x31\x9b\x69\xdf\xf7\xd1\x8f\xce\x02\xcf" - "\x40\x99\x40\xc8\xe9\xa0\x80\x7b\x2e\xe2\x3d\xdc\xb6\xc9\xb9\x70" - "\x5f\xad\x24\x97\xf7\xa5\x7e\x77\xb4\x5e\x66\xdf\x9e\x7c\xdf\x71" - "\xb0\xee\xf4\xcd\xc5\x7e\xf9\x58\x43\x34\xd7\xa0\xdd\x4f\x8a\x08" - "\x19\xa6\x26\xda\x6b\x5b\x87\x45\xb7\x85\x0d\xb1\x76\x18\xc8\x5d" - "\x1d\x30\x8f\xed\x4a\xf2\x50\x3b\xf0\xc5\xea\xc7\x48\xc0\xda\xc9" - "\x44\x59\xb4\xa8\x08\x63\x1c\x93\xf2\x89\xb9\xc4\x1c\x03\x3a\xb5" - "\x7d\x3f\x29\x37\xd5\x93\x0a\xc7\xdb\x2c\x6f\x48\x0a\xca\xd5\xf7" - "\xcd\xc1\x98\x76\xe9\x6b\x79\xe7\xa1\xf7\xac\x3d\x0e\x36\x15\x61" - "\xbe\x8f\x87\xcc\x8e\xaf\x4c\xe6\xd4\xbd\xc4\x9c\x6c\x36\x61\x3c" - "\x91\xcb\x8a\xf0\x67\x8f\xc2\xb5\xbb\xcb\xe1\xbe\x29\xe4\x2e\x28" - "\x8f\xc5\x67\x64\x6d\xe7\x6b\x5e\x0b\xe7\x6b\x5f\xdb\xce\x5b\x80" - "\xa7\x1a\x36\x0a\x39\x3c\xd0\x3f\x00\xfd\x20\x90\x4f\xf5\x49\x24" - "\xa2\x49\x11\x5e\x4d\x75\xfb\xf1\xb4\x7c\x3f\x94\xa9\xaf\x8d\x39" - "\x79\x3b\x96\xfb\x41\xd9\xc6\xca\xf9\x58\xee\xdf\xa4\xb8\x2f\x90" - "\x95\x3f\xc2\x72\x24\x94\xd5\xac\x5c\x49\x68\x5c\x0c\xc5\x7d\x03" - "\x59\xf9\x73\x2c\xc3\xd8\xdf\x37\xca\x94\x84\xfd\x3d\x07\x34\xbb" - "\xef\xe9\xf4\x3a\xd0\xcf\x92\x2f\xd0\xf9\x70\x2c\x2d\x1e\x6d\x0f" - "\x30\x1f\xc2\x4f\xdc\x53\x8b\xba\xdd\x7d\xb1\x3d\xa3\xf0\x18\x1e" - "\x1f\x62\x27\x77\x81\xac\x74\x0f\x5c\x7b\x1c\xc7\xce\xab\xad\xe5" - "\xe0\x03\xcb\xa6\x3a\x78\x13\xbf\xaf\xff\x68\x7e\xdb\xd8\x22\x7e" - "\x5f\x64\x06\x4f\xd7\xb1\xa1\xfa\xa2\x14\x3b\x8d\x33\x0d\xf2\x29" - "\xcc\xa1\xfb\xf6\x60\x9f\xac\x20\xef\xf9\x88\x3b\xab\xe2\xb7\x8d" - "\x2c\x02\x3d\x4a\x3b\x59\xeb\x40\x7f\x67\x90\x71\x23\x1e\x3f\x11" - "\x8f\x72\xc1\xf8\x9f\x70\x7b\x23\x33\xb8\x74\x1d\xe1\x07\xf6\x1f" - "\x3d\x39\x9e\x37\xc1\x1a\xa5\x60\xb6\x6a\xfe\x2b\x78\xfe\x57\xf4" - "\xb9\x83\xfa\x8f\xe6\x56\xc5\x63\x9e\x28\x8a\x2f\x69\xb8\x5e\x27" - "\x01\x9e\xac\xd1\x85\x38\xb7\x8d\xd7\x9c\x88\x3f\xef\x5f\xce\x21" - "\x45\x84\xcf\x1c\x6f\xd8\x27\x8c\xbb\xea\x80\xe7\x38\xe0\x5d\x51" - "\x36\x38\xc8\x95\x2a\x41\x46\x19\x7d\x60\x41\x4d\x0f\x7e\x95\x2e" - "\x04\xde\xe9\x31\xb3\xf6\x2a\xa9\xec\xc0\xb9\x12\x61\x3b\x91\x4c" - "\xc8\x84\x64\x87\x29\xc4\x4a\xe3\x63\xab\x30\x5f\x0c\xdf\x77\x64" - "\x51\x93\xe2\xfe\xf1\x53\x52\xe1\x1d\xe0\xdd\x8f\xd6\xd7\x04\x72" - "\xf0\x1e\x8f\xb2\x71\x83\xfb\xee\xd7\xc2\xd8\x6a\x45\xb9\xde\xcf" - "\xfe\x53\xbe\xe1\x56\xe8\x08\xee\x63\x3e\x04\xf2\x08\x77\x5d\x17" - "\xc2\xc1\xfa\x83\xd7\x4e\x68\x2f\x11\x7c\xa6\x30\xd6\xd4\xc7\x9d" - "\x1f\x08\xe3\x0c\xcf\xc7\xb8\xdc\xe2\xb8\xc2\x1a\xa6\x75\x5e\x8f" - "\xf7\x4e\xff\xed\xcf\x58\xa1\x7f\x1a\x7e\x4b\x8b\xd7\xbc\x55\xb0" - "\xd6\x3e\xc4\xf8\xa3\x9f\x0e\xfe\xe3\xf9\x3d\xba\x02\xeb\xa0\x7e" - "\xc9\x34\x8f\xe7\xf6\x27\x35\xa2\x8d\x04\xe6\x1b\xf0\xc8\xfd\x27" - "\x8a\x40\x17\xf6\x1e\x8b\xd0\xc0\xf2\xa7\xf5\xf8\x8a\x0f\x71\x62" - "\x5e\xe0\xab\x18\xe3\x7d\xf4\x09\xad\xcd\x4f\x9a\xf6\xf3\x99\x2b" - "\x0b\xdb\x07\x9d\xfa\xba\x9f\xed\xe9\x7c\xf2\xc8\x5e\x18\x17\x55" - "\x4b\x74\x07\x3f\x5e\xc1\x64\xef\xfe\x4e\x1c\x2b\x07\xac\x23\x29" - "\xa7\x89\xd2\x0e\xeb\xe5\xdb\x2f\x66\x29\x87\xc3\x3a\xe3\x84\xb5" - "\xbf\xac\xaa\x84\x4c\x9d\x44\xd2\x2b\xe2\x5b\x88\x98\x17\x8d\x0f" - "\x1f\x53\xf4\xd6\x8b\x56\x25\x7e\x33\xc2\x3c\x68\x54\x4f\xdd\xfe" - "\xb4\xf5\x2f\x9f\xdb\x51\x77\xb3\x1c\xf8\xdc\xaa\x74\xb4\xea\x34" - "\x34\xc6\x3c\xe8\xe4\xe9\xf1\x3c\xe7\xfa\x8e\x84\x79\x48\x8c\x9a" - "\x1c\xcc\x33\xfd\xc9\xb4\x2a\xba\xef\xff\x13\x5d\x09\xf9\xa4\x36" - "\x97\x94\x37\xd4\xe1\x7e\xe8\x3d\x9f\xe8\x8c\x28\x2f\xf6\x71\x80" - "\x4c\xf8\x26\xc8\x84\x30\x5f\xef\xe6\x54\x86\xd1\xe2\xb7\x24\xcc" - "\x9b\x26\xca\x83\x0e\x98\xa3\x79\x42\x6e\x34\x47\xe6\xfd\xcd\x79" - "\xc2\x77\x25\xcc\x99\xb6\x33\x89\x0c\xdc\xa9\xe4\x74\xde\xbe\x21" - "\xf5\x59\x4e\x7d\xa6\x23\xb8\x50\xc3\x68\x31\x77\xda\x94\xe5\x1a" - "\xf2\x0f\x78\xf7\x13\x5a\x7f\xe7\x64\x7f\x1a\x03\xcb\x01\x7c\xe7" - "\x00\x9e\x73\xc0\x78\x02\x0d\x8a\x81\x6e\x5e\x75\x10\x91\x06\xd7" - "\xd3\x45\x1a\x3c\xb0\x89\xd2\x00\x74\x97\x35\x33\x05\x1a\x9c\x05" - "\x1a\x34\x00\x0d\x0c\x24\xe3\xe4\xf4\x72\x32\x75\x1a\xd0\xa0\xb9" - "\x05\xf3\x13\xb0\xdc\x74\x89\x6c\xec\x29\x2d\xce\x5a\x95\x95\x36" - "\x46\x83\xfd\x2f\x31\x1a\x1c\x7c\xc9\x0a\x72\x4c\x3f\xe3\x5b\x50" - "\x76\xae\xd2\x69\x30\x67\x14\x6f\x88\xc1\x3c\xda\x8c\x16\xd7\x81" - "\x16\xd7\x19\x2d\xd2\x96\x03\x2d\xaa\x6b\x68\x6c\xaa\x4f\x6a\xcb" - "\x49\x79\x4c\x01\xa9\x00\x5c\x02\x5a\xcc\x47\xba\xa0\x5e\xed\x5c" - "\xa3\x0d\x03\x3d\x5a\x9d\x97\x42\x22\x44\x7a\x80\xde\xde\x6b\x53" - "\x0a\x41\x3f\xdf\x28\x98\x9b\x22\x3d\xd4\x94\x1e\x97\x04\x7a\x74" - "\xa0\xaf\x1c\xd0\xa3\x03\xe8\xd1\x01\xf4\x30\x30\x7a\x20\xce\x4f" - "\xb1\x85\xf0\xdc\x3f\xb5\x18\xbb\xa2\x33\x3d\xd6\x08\xf4\x38\x7b" - "\x33\xf4\x78\x40\xd7\x99\x1e\x91\x63\xba\xa3\x87\x34\x27\x1e\x7a" - "\x0c\xe9\x71\xbd\x40\x98\x13\x83\x71\x4e\x64\x28\x87\xc1\x5a\x84" - "\x63\x5a\x56\x75\x84\xce\x09\xcc\x0b\xf6\xd6\x8b\x76\x65\x79\x03" - "\xd0\x25\x16\xe8\x92\x22\xd1\x85\xd1\x63\x4c\x51\xe1\xe7\x6c\xfc" - "\x35\xcf\xe1\x9a\x81\x73\x03\xe9\x03\x74\x82\xf9\xe3\x2d\xaf\xa0" - "\xfb\xf7\x56\x68\x93\xc3\x79\x82\x73\x04\xe7\x43\x45\x7c\x1d\xcd" - "\xd3\xfe\xc9\xb4\x52\x82\xdf\x5d\x3f\xd1\x1d\x01\x5a\xe5\x12\xe7" - "\x2a\xa0\x4d\x12\xee\xed\x20\x03\x30\xbf\xe0\x27\xba\x2c\x94\x17" - "\x54\xc0\xf3\x77\x3b\x81\x4e\xce\xb6\x88\x5e\x1b\x41\x87\xc2\xef" - "\xb1\xee\xdf\x61\x31\x97\x32\xdf\xf3\xfe\x66\x38\x1f\xe8\x00\x1a" - "\xc1\xdc\x91\xcd\x19\x57\x8e\xe5\x6f\xb4\x64\x57\x3d\x09\xea\xbd" - "\x90\xd1\xc8\xe9\x36\x67\x26\x2f\xc4\x39\x93\x01\x34\x3a\xed\x27" - "\x8d\x1e\x64\x7b\x29\xc2\x01\xab\x43\x5b\xa2\x61\x9d\x04\x1a\x3d" - "\x50\xee\x8b\x46\xce\xbd\xfd\x74\x4e\xd5\x90\x6a\xcc\x93\xc0\x2d" - "\x9b\xae\xe0\x40\x5f\xea\x00\xbd\xf4\x13\xab\x83\xa4\xce\x21\xca" - "\x94\x3a\xd2\xd3\x3c\xfd\x14\x31\x5b\x8a\x69\x8c\x73\xb4\xf7\x62" - "\xee\x11\xb3\xa3\x18\xf0\x6a\x8a\x0a\xcb\xbb\x68\xd9\x4a\xd6\xcc" - "\x21\x01\x34\xef\xa8\xae\x80\x6c\x04\xfe\x3c\xf0\x52\x81\x92\xcb" - "\x79\x34\x88\x57\x61\xce\x24\x62\xaa\xd4\x3b\x30\x46\x5b\x70\x45" - "\x7c\x39\xc6\xb5\xfc\x0a\x63\x88\x57\xda\xa0\x4d\x2b\xdf\xe1\x84" - "\x35\x23\xdf\xc0\x17\x63\x1e\x89\x47\x71\x8d\xc0\xb8\x73\x0a\x4d" - "\x6f\x94\x45\xd0\xee\x65\x4a\xdb\x09\xb2\x97\x86\xc6\x6b\x80\x73" - "\x8a\x8a\x45\x36\xb8\xfe\x93\x75\xd8\x2f\x66\x83\x66\xc7\x47\x31" - "\x1e\x78\xf8\x94\x5f\xbf\x9f\x66\x0d\x34\x82\xbe\x0b\x32\x1a\xb6" - "\x33\x87\x67\xba\x60\x96\xb9\xda\x4e\xed\x8f\xd6\xf4\xf8\x9e\xc6" - "\x14\xf4\xc7\xc2\x9c\x14\xb8\x66\xff\xe4\x31\xf4\xe1\xe0\xf7\xc2" - "\x7a\x15\xfe\xa4\xa6\x68\x81\x55\x29\xad\xcb\x9a\x2c\x58\xcf\x92" - "\x27\x68\xf9\x74\xcc\xdd\x71\x14\xde\x0b\xf5\xa0\xb7\xeb\xed\x14" - "\x53\xfe\xb2\x20\x4b\x89\xf6\x11\x3b\xe0\x43\xf9\xe7\x7f\xa3\xb9" - "\x60\x2f\x28\x06\xec\x38\xa9\x73\x10\x7c\xfe\x8c\x47\xf0\x1b\x83" - "\xa6\xbc\x5d\xb9\x77\x54\x7b\xcf\x7e\x13\xd3\x1b\xa4\x3c\x98\xee" - "\xf9\x2e\x11\x67\x0e\x2c\x80\x36\x11\x67\xea\x33\x94\x0c\x5b\xa2" - "\xd1\x46\x17\xe4\x89\x2d\x15\xcd\x97\x48\x1a\xf0\x71\x45\x7c\x01" - "\xcd\xaf\xd2\x07\xf0\x9d\x5b\x03\x78\x72\x1d\xf4\x7d\xc0\x13\xc4" - "\x81\x7c\xc0\x0f\x6e\x0d\xe8\xf9\x1d\xa0\xe7\x0b\x38\x82\xb2\x17" - "\x1e\xe7\x00\x8f\x86\x94\xc2\x39\xa0\x13\x07\xb8\x0e\x78\xa2\x7d" - "\x33\x85\x0c\x7c\x13\x78\x74\x17\xe2\x08\xc8\xc5\x53\xf4\x80\x23" - "\xab\x00\x47\x92\x68\x3e\xe2\x88\x7c\x25\xc3\x8f\xf7\xea\xb3\x94" - "\x46\x31\x1f\x39\x1d\xdf\x87\x47\x54\x22\x7f\xc4\x64\x60\x5f\x95" - "\x4e\x5c\x9f\xd6\xe8\x02\x2a\x6d\xc0\x23\xdb\xa7\xd0\x73\x74\xde" - "\xae\x8a\xef\xc5\x31\x5e\x8b\xc6\x31\xd9\x7d\x99\x44\xd1\x9c\x9d" - "\xdf\x45\xf4\xda\xbc\x94\x0c\xcf\xbf\x4c\x06\xe6\x2f\x25\x5a\x98" - "\xaf\xca\x7c\xe8\xc3\xdc\xe5\x2a\x42\xf3\x98\xf4\xec\x37\x0d\xce" - "\x7b\xcd\x63\x02\x72\x75\x44\x3e\xce\x99\x65\x5a\x57\x9f\x1c\xc6" - "\x39\x55\x4e\x18\x3b\x1a\xf3\x4d\xf1\x30\x8b\x67\xac\xba\x37\x88" - "\xc9\xf9\x0f\x17\x33\x3f\xa5\x88\x60\xd0\x55\xee\x6a\x52\x3c\xbc" - "\x84\xdf\xaa\x21\xfa\x14\xa2\x68\x12\xaf\x81\xec\xc9\x01\xad\x46" - "\x66\x90\x0c\x2e\x34\x4b\x67\x4e\xbe\x84\x79\x01\xfc\x9c\x87\x0f" - "\x53\xdf\x6e\xa7\x71\x0e\x7d\x5f\x6e\xeb\x9c\xda\xdd\x4d\x24\x8a" - "\xff\x1d\xd0\x63\x11\xbc\x6b\x13\x19\x98\xd7\x04\xef\xba\x8a\xbd" - "\xab\x98\x7f\x9d\x33\xec\x1d\x03\xd7\xba\xcc\x01\x66\xfd\x1d\xe6" - "\x00\x0b\xa9\x01\x0c\xbb\x97\x7f\x18\xfd\x8e\x69\x4c\x9e\x36\xb3" - "\xa3\x8e\xe0\x73\xd1\x36\x64\x6e\xa1\x3c\x3d\x1f\x79\x99\x2b\xd0" - "\x15\xcc\xab\x05\xde\x6e\x8b\x27\x3c\xfc\x3e\x5a\x6f\xc5\x18\x38" - "\x54\xe6\xb3\x28\x34\x46\x94\xd3\x8e\xc1\x39\xe4\x7d\x37\x9e\x37" - "\x22\xcf\xe3\x75\xca\xf7\x70\x9f\xb9\xf6\x3c\xc1\xf6\xdc\xdb\x41" - "\xfa\x8b\x6d\x5d\x50\x0c\x9c\x80\x6d\x21\x2f\xa0\x4d\x07\xe7\x1a" - "\xa3\x7d\x31\xfa\x98\x47\xf0\xe1\x51\x46\x56\xb6\x62\x7e\x1b\x15" - "\xf2\x00\xe5\x15\xc0\x6f\x8c\xb9\xcc\xf3\xba\x00\xe0\x33\xec\x67" - "\x2f\xa0\x77\x94\xc8\x17\x70\x4e\xed\xc9\x1b\x7d\xd6\xa9\x50\xa7" - "\x51\xe3\xef\x1b\xe5\x0f\xff\xe8\x37\x70\xbc\x4f\xff\xb7\x81\xfd" - "\x70\x1e\x3d\x84\xb8\xe9\x6c\x75\xc3\xcc\x66\x86\x99\x88\x49\x22" - "\x6e\x52\x6c\xa2\xb9\x1d\x8a\xd1\x3f\x35\x9e\xf6\xd1\x4f\xdc\xac" - "\x68\x96\x70\x73\x8a\xde\x0d\x37\x9b\xf9\x0e\x6e\x90\x37\xdc\x1c" - "\x34\x41\x8e\x9b\x83\x9e\x95\xe3\xa6\xf6\x80\x27\x6e\x76\xc6\xcc" - "\x41\xaf\x79\xc3\x4b\xd0\x63\x1e\x6a\x52\x68\x67\xfb\xc6\xca\x41" - "\x87\xfd\xc7\xca\xc1\x27\xe4\x58\x39\xc8\xfe\xff\x2f\x56\x0e\x99" - "\x29\xc3\x4a\xd5\x0d\x62\x65\x13\xc5\x4a\x35\xff\x4f\x98\x13\x02" - "\x7e\xe4\x2f\xf2\x81\x95\x8b\xba\x99\x0b\xbf\xf3\x85\x95\x43\xfe" - "\x2a\xc7\xca\x21\x0d\x72\xac\x1c\xb2\x43\xc2\x4a\xe1\xda\x2d\xc1" - "\xca\x21\x45\x77\x06\x2b\x87\x14\x51\xac\xbc\x8c\x58\xa9\xdd\xd4" - "\x3d\x56\x0e\x3a\xe2\x1d\x2b\xe1\x3c\xc5\xca\x41\x47\x24\xac\xac" - "\xeb\x06\x2b\x1f\x59\xee\x07\x56\xaa\x29\x56\xaa\x7c\x60\xe5\x22" - "\x18\x2b\x81\x2f\x28\xef\x79\xf0\x86\x80\x95\x11\x2e\xac\xbc\x01" - "\xfe\xf0\x8f\x7e\x8f\xe8\xbb\xc2\x4a\xce\xc8\xe4\x4b\xc4\x4a\x3e" - "\x4c\xc0\xca\xc5\x0e\x92\x72\x06\x30\xb2\xba\x89\xe6\xb0\xa1\x7e" - "\xbd\xf0\x9f\x3a\x13\xb1\x68\x4c\xd4\x41\x18\x2f\xb3\xa5\x88\x62" - "\x13\xf5\x4f\x9d\x84\x58\x55\x04\x75\x73\x5d\x72\x27\xc5\xce\x33" - "\x02\x76\xce\x16\xb0\x73\xee\xf7\xc0\xce\x97\x90\x96\x43\xd7\xb5" - "\x2b\x45\xec\xdc\x0a\xd8\x39\x94\xca\x0f\xf8\x3d\x93\x61\xe7\x08" - "\xa7\xd8\x2f\xb4\x69\x9a\x13\x77\x12\xd6\xaf\x96\xce\x38\xfa\x1c" - "\x6d\xef\xb4\x69\x51\x33\x71\x61\xe9\x6c\x09\x4b\xa1\xad\x03\xbe" - "\x71\x74\xa8\xc3\x85\xa3\x06\xc0\xd1\x73\x6e\x38\x0a\x7a\xd3\x5f" - "\x10\xf3\x00\x47\xdb\x28\x8e\xbe\x27\xe0\xe8\xf0\xde\x27\x67\x03" - "\x8e\x3e\x27\xe2\xe8\xb0\x68\xbb\x61\xef\x28\x7b\x66\xf7\x38\xda" - "\x46\x71\x54\x7f\xfb\x71\xb4\xc4\x03\x47\x41\x77\xc5\x1c\xec\x5e" - "\x71\x54\xe4\x47\x8a\xa3\x19\x12\x8e\xd2\x71\x1d\xfe\x56\x65\x0c" - "\x8c\x7b\x8c\x9e\xea\x6e\x2e\x1c\xd5\x17\x31\x1c\x85\x73\xd4\x7e" - "\xb2\x02\x70\x14\xf8\x2f\xbd\x02\x63\xfb\x91\x68\xe8\xa3\x0a\xf1" - "\x75\x37\xcc\x19\x1c\x23\x17\x9e\x2e\x82\x39\x83\x18\xd3\x0a\x73" - "\x06\x70\x74\xee\x55\x15\xa1\xf3\x25\x13\xe6\x4b\x93\x8f\x1c\x7a" - "\xa2\xbf\xac\x4f\x3c\x1d\xa1\x90\xe3\xe9\x88\x51\x72\x3c\x1d\x7e" - "\x51\xc2\x53\xe1\x1a\xe2\x29\xd0\x0c\xc6\x47\x87\x98\x7a\x73\x78" - "\x3a\x82\xb8\xf0\x54\x29\xe0\xe9\xa2\xee\xf1\x94\x7e\xf7\xf3\x81" - "\xa7\xee\xd8\xe0\x1b\x4f\x47\x10\x09\x4f\x47\xd4\xb9\xf0\xb4\xc6" - "\x17\x9e\x0e\x0b\xf4\x8e\xa7\x70\x9e\xe2\xe9\xb0\x40\x17\x9e\xd6" - "\x78\xc1\xd3\xe7\xdc\xf1\x74\x64\x05\xc3\xd3\x22\x8a\xa3\x88\xa9" - "\x95\x36\xe0\x0f\x9c\x73\x89\xb9\x14\x53\x39\xc0\x54\xcc\x2b\x8c" - "\x39\xa5\xd0\x2f\xde\x1b\xa6\x32\xcc\xb5\x10\xc4\x55\x9c\x9b\xe9" - "\x93\x41\xdf\x85\xb5\x08\xc6\x84\xae\xbd\xe2\xf8\xed\x76\xc3\xd7" - "\x79\xab\x55\x28\xdb\xc9\x78\x85\x13\x79\xa5\x55\x8b\x3e\xb2\x32" - "\x5e\xf1\x8f\x96\x23\xcb\x7d\x61\xab\x2f\xdd\xfd\x24\xea\xee\x33" - "\x88\x72\xcd\x0c\xc0\x57\x1d\xea\xee\x85\x1e\xba\x7b\x61\x67\xdd" - "\xfd\x74\xd7\x38\xea\x97\xee\xfe\x22\xd2\xf0\xd1\x32\x39\x8e\x3e" - "\x5a\x21\xc7\xd1\x7f\x7b\x16\xfb\xc5\x70\xbc\xd0\xbb\xee\x4e\xe7" - "\x79\xd4\xfd\x2e\xdd\xbd\x46\x8e\x9f\x92\xee\xfe\xd3\x76\xdf\x38" - "\x1a\x35\x5e\x26\x8f\xce\x15\x70\x74\x81\x80\xa3\x0b\x24\x1c\xfd" - "\xe4\x94\x28\x8f\x3e\x36\xbf\xac\xc6\x1d\x47\xa3\xb2\x5c\x38\x5a" - "\xdb\x19\x47\x45\x0c\x45\x3c\xc5\x76\xd0\x96\xb5\x1f\x70\xfa\xd0" - "\x02\xbd\x92\xd9\x6a\x63\x70\xec\x82\x3c\x6d\xb5\x15\xcd\x57\x49" - "\xda\x6c\xc4\xd3\x5c\x8a\xa7\x21\x0a\x32\x1f\xb0\xaf\x0f\xfa\xfd" - "\xe7\xe1\x37\xfb\x24\x96\x93\x0d\xed\x4b\xdc\x2a\x96\xe3\x53\xb4" - "\x33\xc1\xfb\xd2\x6f\xf5\x73\xea\x04\x4c\xbd\x06\xe3\x01\x3c\xf7" - "\xe6\x35\xc0\xd4\x24\x2f\xb2\xe9\x1a\xc0\xd4\x14\x37\xd9\x14\xe6" - "\xfe\x7b\x0b\x3c\x31\xf5\xb1\xab\x95\xc8\x2b\x88\xa9\x32\x3d\xbe" - "\xf0\x47\xa0\xc7\xff\x74\xb2\x1c\x4b\x7f\x9a\x21\xc7\xd2\x9f\x3e" - "\x2e\x61\xa9\x70\xed\x96\xc8\xa6\x3f\x9d\x74\x67\x64\xd3\x9f\x4e" - "\x92\xf4\xf8\x7f\x7b\xc4\x85\xa5\xd5\xbe\xb0\x34\x6a\x92\x77\x2c" - "\x85\xf3\x14\x4b\xa3\x26\xb9\xb0\xb4\xda\x8b\x1e\x2f\xc3\xd2\x51" - "\xbd\x19\x96\x16\x32\xd9\xb4\x46\x94\x4d\x0b\xff\x05\xf5\xf8\x51" - "\xc1\xfe\xea\xf1\x27\x9b\x19\x7e\x22\x3e\x89\x18\x2a\xe9\xf1\x85" - "\xbe\xf5\xf8\x6e\x30\xd4\x2f\x59\x94\x62\xe8\xe3\xbd\xe5\x18\xfa" - "\x78\xa8\x1c\x43\x47\xaf\xf3\xc4\xd0\xce\xf8\xf9\xf8\xf3\xde\xb0" - "\x93\xe9\xf1\xa3\xa3\x7c\xe3\xe6\xe3\xa9\xfe\xe3\xe6\xbf\xef\x90" - "\xe3\xe6\xe3\xa6\xff\x1d\xb8\xf9\xb3\x11\x32\xdc\x54\xdd\x20\x6e" - "\xfe\x20\x3a\xfd\xcf\x3c\xec\x9f\x3f\xf3\xb0\x7f\xfe\xcc\xcd\xfe" - "\xf9\xb3\x5b\x68\xff\xfc\xd9\x1d\xb2\x7f\xfe\x6c\x83\x24\x83\x8e" - "\x9e\xdf\x3d\x6e\x3e\xbe\xc1\x3b\x6e\xc2\x79\x8a\x9b\x8f\x6f\x90" - "\x70\xb3\x3b\x19\xf4\xe7\x13\xfc\xc0\xcd\x1f\xb9\x4e\xff\xf3\x2e" - "\xed\x9f\xde\x74\x7a\xc4\x4d\x8a\x97\x35\x1e\x3a\xfd\x0c\x77\x9d" - "\xbe\x50\xd2\xe9\x27\x32\xdc\x32\x3b\x8c\x72\x9d\xfe\x96\xe3\xe8" - "\x13\x33\xec\x2e\x7b\xe8\xeb\x80\xa3\x4f\xcc\xc4\x77\xb3\xbb\xec" - "\xa1\x63\xeb\xc4\x7e\x31\x9d\x7e\x2b\x61\xfd\xf2\xa2\xd3\x53\x9f" - "\xd9\x27\xde\x72\xe9\xf4\x35\x9e\x3a\xfd\xd8\x4d\xbe\x31\xf5\x89" - "\x2a\xaf\x3a\x3d\xea\xdf\x14\x53\xf5\x14\x53\xaf\x6d\x77\xc7\xd4" - "\x27\x2f\x51\x4c\xfd\xa5\x88\xa9\x4f\xaa\xed\x30\x37\xed\x3d\xbb" - "\xc7\x54\x6c\x47\xc2\xd4\xf8\x1f\x06\x53\x4d\x37\x8e\xa9\xee\xfb" - "\x4d\xdf\x83\x77\x77\x61\x2a\x1d\xe3\x31\xaf\x55\xc6\x20\xa6\xc6" - "\x7b\xe8\xf7\x85\xde\xf5\xfb\x32\xa2\xc4\xf1\x11\xf5\x7b\xa4\x01" - "\xc5\x9b\xdb\xaa\xdf\x8f\xf9\x5a\x8e\xad\x63\xd5\x72\x6c\x1d\x53" - "\x26\x61\xab\x70\xed\x96\xe8\xf7\x63\x2c\x77\x46\xbf\x1f\x63\x91" - "\xb0\x75\xec\xfb\xdd\x63\xeb\x13\x35\xde\xb1\x15\xce\x53\x6c\x7d" - "\xa2\xa6\x4b\x6c\xfd\xa5\x3b\xb6\xfe\xe2\x80\x88\xad\x92\x7e\x0f" - "\xfc\x81\xf3\x2f\xd1\x78\xf3\xfa\xfd\xb3\x77\x5a\xbf\xff\xc5\x7e" - "\xbf\xf4\xfb\xed\x80\xb3\xa0\x8b\xaf\xf9\x14\xf4\xfb\xe7\x05\xfd" - "\xbe\xb6\xc0\x43\xbf\x2f\xe8\xa4\xdf\xa7\x3e\x2f\x60\x2a\xcc\x29" - "\x8a\xa9\x0b\x0a\x6f\x5e\xbf\x7f\x01\x69\xf8\xd4\x5b\x72\x4c\x7d" - "\xea\x80\x1c\x53\x9f\x19\x8b\xfd\x62\x98\x5e\xe0\x5d\xbf\xa7\xf3" - "\xfc\xa9\x76\x99\x7e\x0f\xfd\xeb\xac\xdf\x8f\xbb\x24\xc3\xd4\xb9" - "\xee\x98\x1a\x3d\x50\x26\xa7\xc2\x7b\x21\xa6\xbe\x75\x8e\x61\xea" - "\xdb\xe7\xdc\x30\x75\xca\xdb\x02\xa6\x3e\x3d\xa3\x6c\xba\x3b\xa6" - "\x46\xc7\x8b\x98\x4a\xf1\x72\xae\x5d\x99\xae\xeb\xec\x77\x42\xfd" - "\x7d\xd0\x17\x08\xda\xc6\x3d\x52\xd8\xe6\x81\x73\xf1\xdd\xfb\x9b" - "\xe8\xbc\xfb\x9b\x98\x13\x2d\xa4\xbc\xc1\x48\xfd\x4c\xf2\xd0\xcf" - "\x64\x1d\x19\x90\xd7\xc1\xf6\xfa\xd3\x7c\x1c\xd7\xbc\xef\xf3\x9f" - "\x33\x53\xc2\x59\xf4\xc9\x7a\x13\x7d\xb2\xae\x31\x1f\x20\xa0\x77" - "\xe7\x7d\xfd\xa2\xdc\x04\x78\xf0\xee\x39\x4f\x9c\x7d\xfa\x62\x25" - "\xf2\xcf\xec\x78\x0f\x9d\xbf\xe0\x47\xa0\xf3\x8f\x7b\x5a\x8e\xaf" - "\xe3\x12\xe5\xf8\x3a\xee\x11\x09\x5f\x85\x6b\xb7\x44\x76\x1d\x17" - "\x7d\x67\x64\xd7\x71\xd1\x92\xce\xff\xcc\x03\x2e\x7c\xad\x72\xc3" - "\xd7\x73\xee\xf8\x1a\x3d\x9c\xe2\xeb\x39\x4f\x7c\x85\xf3\x14\x5f" - "\xa3\x87\xbb\xf0\xb5\xca\x43\xe7\x3f\xe7\x89\xaf\xe3\x15\x14\x5f" - "\x81\x17\xe4\xb2\x6b\x41\xf7\x3a\x7f\xed\x8f\x4d\xe7\x1f\x4f\xfc" - "\xd2\xf9\x11\x53\x17\x33\x4c\x45\xcc\x12\x71\x55\xd2\xf9\x0b\x7c" - "\xea\xfc\xdd\xe1\xaa\x5f\xb2\x2a\xc5\xd5\x09\x0a\x39\xae\x4e\xe8" - "\x21\xc7\xd5\x89\xaf\x79\xe2\x6a\x67\x4c\x9d\x30\xc1\x1b\x9e\x32" - "\x9d\x7f\xe2\x68\xdf\x58\x3a\x41\xef\x3f\x96\xfe\x72\x8f\x1c\x4b" - "\x27\x1c\xfe\xdf\x8b\xa5\xbf\x7a\x5c\x86\xa5\xaa\x1b\xc4\xd2\x1f" - "\xc4\x0e\xf0\xab\x4d\x72\x2c\xfd\x95\x49\x8e\xa5\xbf\x5a\x29\x61" - "\xa9\x70\xed\x96\x60\xe9\xaf\x36\xde\x19\x2c\xfd\xd5\x46\x49\x56" - "\x9d\xb8\xb0\x7b\x2c\x9d\x90\xec\x1d\x4b\xe1\x3c\xc5\xd2\x09\xc9" - "\x12\x96\xd6\x75\x83\xa5\xcf\x4e\xf6\x03\x4b\xe5\x76\x00\x4f\x2c" - "\xbd\xe3\x76\x80\x67\x27\xf9\x65\x07\x10\xb1\xf4\xf9\xce\x76\x00" - "\xc4\x57\x6a\x07\x80\xf1\x12\x31\x8c\xda\x01\xc6\x33\x2c\x33\x3b" - "\xb2\x64\x76\x80\x5b\x8f\xad\xcf\xcd\xb1\xbb\xec\xa9\x06\xc0\xd6" - "\xe7\xe6\x53\x6c\x75\xd9\x53\x27\xb7\x8b\xfd\x62\x76\x80\xd7\x09" - "\xeb\x97\x17\x3b\xc0\x38\xda\xde\x5f\x65\x76\x00\x37\xac\x85\xb6" - "\xde\xf2\x8d\xb3\xcf\xd5\xc8\xec\x00\xf5\x12\xce\x5e\x43\x1f\x75" - "\xc0\x41\x8a\xb3\xe1\xee\x38\x3b\xe9\x6e\x8a\xb3\xe3\x44\x9c\xfd" - "\x8f\xc8\x36\x98\x9b\x6d\xfe\xe2\x2c\xee\x23\x38\x17\x73\x67\x70" - "\xb6\xd8\x0f\x9c\x75\xb3\x0d\xbc\x0b\xe3\xe1\xc2\x59\x3a\xee\x93" - "\xf6\x55\xce\x46\x9c\x8d\xf1\xb0\x0d\x14\x78\xb7\x0d\x9c\xb8\x13" - "\xb6\x81\x49\x4e\x39\xde\x4e\x8e\x92\xe3\xed\xa4\xf3\x12\xde\x0a" - "\xd7\x6e\x89\x6d\x60\x92\xe3\xce\xd8\x06\x26\x39\x24\xbc\x9d\x7c" - "\xa6\x7b\xbc\x7d\xce\xe2\x1d\x6f\xe1\x3c\xc5\xdb\xe7\x2c\x5d\xe2" - "\xed\x38\x77\xbc\x9d\x52\x26\xe2\xad\x64\x1b\x28\x10\x6c\x03\x59" - "\xdd\xdb\x06\x6a\x7d\xd8\x06\x26\xdc\x69\xdb\xc0\x94\x52\x7f\x6c" - "\x03\xed\xdb\x99\xdf\xfe\x1a\xf4\xdb\x9f\x03\xf8\x3b\xed\x14\x8c" - "\x41\xf7\x7e\xfb\xa9\xa2\xff\x69\x4c\xae\x80\xb3\xb9\x5e\x6d\x03" - "\x27\x1b\x7d\xdb\x06\x4e\x56\xbb\xfb\x9f\x4e\x3d\x21\xff\x6e\x35" - "\xb5\x4c\xfc\x6e\x75\xf2\x73\xc4\xd9\x5f\x7f\x8a\x65\x2e\xe7\x99" - "\x18\x16\x7b\xf0\xd7\x55\xd8\x4f\x6f\x7e\xfc\xef\x71\xee\xdf\xb2" - "\xa6\x0d\x72\xd9\x0a\xaa\x10\x6f\x73\x09\xc7\xc7\xf7\xc4\xb8\xe1" - "\xd4\x56\xf0\x22\xf2\xde\xaf\xd7\xb9\xe3\xee\xd1\xb3\xee\xb8\x3b" - "\x6d\x9a\x88\xbb\x4e\xc0\xdd\xf7\xeb\x73\x99\xfd\xf5\x25\xe6\x9b" - "\xba\xff\x25\x37\xdf\xd4\x53\x1f\x08\xb8\xfb\xfc\xe4\x32\x0b\xbc" - "\x7f\x57\xfe\x53\x70\xff\xc1\xb3\x37\xea\x83\x9a\xeb\xd5\x77\x4a" - "\xc0\x27\xaf\xfe\x53\xd0\x57\xd5\x2e\x61\xae\x3a\x61\x9e\xee\x72" - "\xf3\x9f\xca\x4b\x81\xf9\x2c\xec\x2b\xe9\xd2\x0f\xf5\x25\xc9\x0f" - "\x95\xcf\x19\x97\x87\xeb\x1b\xb7\xed\x99\x98\x0e\x3e\x3e\x80\x57" - "\x8f\xcb\xc3\xe7\x5f\xbf\x0e\xeb\xce\x33\xba\x00\x41\xaf\xcb\x00" - "\xec\xe9\xc3\xc6\xfd\xf9\x2c\x27\xac\x35\x4e\x58\x6b\xb8\x9c\x71" - "\x19\x0e\x94\x4d\xb6\x8f\xdb\x90\x07\x7a\x9e\xc3\x40\xf3\xab\xf6" - "\xca\x06\x5d\x6f\x37\xea\x79\x97\x61\x6e\xa4\x6b\x95\xd8\x1f\x11" - "\x47\x43\x1a\xe1\x3d\x2e\x77\x2d\xcb\x39\xbe\x93\x70\xd4\xf4\xdc" - "\x49\x78\xe6\x0b\x6b\x2b\x91\x77\x75\xd2\x9e\x02\x2a\x33\xfb\xf0" - "\x95\xc5\xbe\xb0\x18\x89\xc0\x0b\xb7\xc0\x26\xe1\xde\x1f\x39\xae" - "\xbf\x70\x5a\x8e\xeb\xbf\x0e\x92\xe3\xfa\x0b\xef\x4b\xb8\x2e\x5c" - "\x03\x5c\x07\xba\x51\x39\x1a\xd6\xbe\x9b\x94\xa3\x5f\xa8\x16\x71" - "\x9d\x13\x70\x3d\xff\x06\x70\xbd\x4b\x39\xda\x0d\x97\x7c\xe3\xfa" - "\x0b\xd5\x92\x4d\xe2\xd7\x7f\xf5\xea\x23\x7b\xd6\x1d\xd7\xa7\xe9" - "\x28\xae\x9f\xf5\xc4\xf5\x69\x3a\x86\xeb\xd3\x74\x3e\xf7\x13\x9c" - "\xf5\xfc\x9e\x36\x7d\x1b\xc5\xf5\x1a\xc1\x47\xb6\xca\x8f\xfd\x04" - "\x35\x0c\xd3\x45\x2c\x47\x7b\xd5\x9d\xb5\x49\x4c\xf7\x99\xff\xcb" - "\x9b\x4d\x82\x62\x79\x33\xc3\x72\xc4\x46\x11\xcf\x6f\x64\x3f\x41" - "\x77\x78\x2e\xca\xcd\x88\xe7\xbe\xe4\x66\x39\x9e\xcf\xd8\x26\xc7" - "\xf3\x19\x3b\xe4\x78\x3e\x73\x9b\x1c\xcf\x67\xe6\x78\xe2\x79\x67" - "\x2c\x9f\x71\xd1\x1b\x8e\xeb\x5f\x44\x1b\xc5\xcc\xf1\xbe\x31\xfc" - "\x45\xb5\xff\x18\xfe\x9b\xd0\xff\x75\x18\xae\xf2\xc4\xf0\xdf\x4c" - "\x42\x0c\x72\x66\x7a\x60\xf8\x22\x01\xc3\x05\x1c\xd9\xdd\x24\xc8" - "\xc2\x9e\x18\xde\x0c\xef\xd1\x8d\x3e\xee\xf8\xa7\x27\x86\xeb\x9e" - "\x96\x61\xb8\xaa\x1b\x0c\x5f\xc4\xec\x20\x32\xbf\x5c\x1f\xb6\x10" - "\x78\x8f\x69\xbb\x7c\xc8\xe6\xe2\x98\xb9\xf7\x47\x8e\xe1\xba\x1d" - "\x72\x0c\xd7\x95\xcb\x31\x5c\xb7\x4e\xc2\x70\xe1\xda\x2d\x91\xcd" - "\x75\xb9\xb7\x5c\x36\x17\xf9\xa3\x4b\x0c\xd7\xe5\x4a\xb2\xf9\xcc" - "\x95\xdd\x63\xf8\x8b\x91\xde\x31\x1c\xce\x53\x0c\x7f\x31\xd2\xe7" - "\x3e\x87\x4e\x18\xfe\xd2\x0c\x3f\x30\x5c\x6e\x0b\x11\x31\x5c\xb0" - "\x85\xec\x76\xb3\x85\x38\x0d\xcc\x16\xb2\xab\x89\xf1\x46\x1f\x05" - "\xe3\x53\xe0\x9f\x88\x7c\x65\xd7\xba\xdb\xae\x9b\xb2\x83\xbc\x34" - "\xdd\x1f\x3b\x08\xc5\x6f\xdc\xe3\x30\x13\x70\xbb\xea\x06\xf7\x38" - "\x4c\x14\xf7\x38\x18\x7d\xec\x71\x10\xf0\x7c\xee\xf7\xc0\x73\xba" - "\xc7\x61\x56\x9c\xdc\xc6\x3c\x6b\xa1\x68\x63\x66\x78\x3e\x6f\xb5" - "\x1c\xcf\xe7\x25\xbb\xf6\x3c\x00\xe6\x9b\xf5\x5b\x3b\xed\x79\x70" - "\x61\x3b\xb5\x83\xce\x2a\x33\xbd\xd8\x40\x5c\xf8\x3e\x5b\xc2\x77" - "\x68\xeb\x11\x19\xb6\xd7\xbb\x63\xfb\x2c\xab\x0c\xdb\xcf\xe5\xca" - "\xfd\x23\xea\xf5\x6e\xd8\x2e\xee\x79\x98\x7d\xa9\xac\xb6\x1b\x6c" - "\x87\xfb\x6f\x7c\x8f\xd8\xad\xc5\x76\x71\x7f\x83\x57\x6c\x77\xdf" - "\xdf\xe0\xe6\xff\x80\xd8\x4e\x73\x54\xf4\xf5\xc0\xf6\x35\xf1\x4a" - "\xe7\x87\x30\x1f\x00\xd7\x71\x8e\x38\x79\xc0\x76\x3a\xde\x73\xb4" - "\xee\xd8\x7e\xdd\xc0\xb0\xfd\xcd\xa6\xef\x8f\xed\x2e\x79\xd8\x1d" - "\xdb\x7f\x89\xd8\x3e\x77\x10\xdb\x7f\x91\x71\x63\xfb\x2f\x3c\xfc" - "\x33\xde\xbc\x01\xfb\x4b\x97\x18\xef\xa5\x5f\x72\x8c\x9f\xbb\x56" - "\x8e\xf1\x73\x8b\xe4\x18\x3f\x37\x4e\xc2\x78\xe1\xda\x2d\x91\xd3" - "\xe7\xa6\xde\x19\xfb\xcb\xdc\x54\x09\xe3\xe7\xcd\xec\x7e\xef\xc5" - "\x2c\xbb\x77\xdf\x0c\x38\x4f\x31\x7e\x96\xbd\xcb\xbd\x17\x32\x7b" - "\x77\xcc\xb3\x5e\xf7\x5e\x54\xfd\x70\xbe\x19\xee\xbc\xe2\x69\x7f" - "\xb9\x79\xdb\x77\xcc\x44\x7f\xed\x2f\xb8\xf7\x62\xcd\x69\xb7\xbd" - "\x17\xb5\xdd\xef\xbd\x48\x9d\x71\x83\xf6\x97\x2e\x7c\x33\x4e\x4e" - "\x73\xf7\x77\x9b\x3f\x41\x8e\xef\xf3\x9f\x75\xe1\xfb\x0b\x88\xef" - "\x71\x73\xe4\xf8\x1e\x37\x1b\xfb\xe9\x6d\x2f\xc6\x7b\xb2\xef\x8a" - "\xf3\xf7\xc9\x7d\x35\x3c\xec\x2f\x2f\x20\xef\xc5\xf5\x96\xe1\xfb" - "\x39\x77\x7c\x9f\x5f\xe5\x4d\x76\x47\xbb\x37\xf5\x29\x9e\xeb\xb6" - "\xa7\x6d\x8a\xe8\xff\xb6\xe0\x4c\x99\x0e\xde\xdf\xe2\xc3\xd7\x6d" - "\x2e\xf3\x75\xa3\xbe\x6d\x68\x07\x87\xb6\x0e\xcd\xd5\x2b\xd3\x62" - "\x78\x0e\x7d\xdd\x3c\xfd\xdc\xd0\xf7\x0d\x7d\xdd\x2a\xe2\x8d\x3e" - "\xfd\xdc\x90\x37\x7d\xf9\xba\x41\xbf\xd5\x14\xeb\xbf\x16\xb0\x5e" - "\xf0\x75\xcb\x4b\x92\x7c\xdd\x64\x58\xef\xc5\x7f\xf8\xdd\x73\x19" - "\xde\xe5\xf8\x74\x09\xeb\x3b\x50\x8e\x7f\xd2\xc3\x16\x43\x69\xf0" - "\xb2\xfa\x07\xb5\xc5\x50\xac\x8f\xbd\xbb\x12\xf9\x78\xb6\xde\x8b" - "\x2d\xa6\xb3\x8f\xf3\x0f\x67\x8b\x89\x9d\x2f\xc7\xf8\xd8\x1c\x39" - "\xc6\xc7\x3e\x2b\x61\xbc\x70\xed\x96\x60\x7c\x6c\xcc\x9d\xb1\xc5" - "\xc4\xc6\x48\xb6\x98\xb8\xb1\x5e\xfd\xef\x64\x36\xf6\xf9\x35\xde" - "\x6d\xec\xf3\x05\xff\xbb\xf9\x35\x3e\xf7\x84\x74\xfa\xa6\xf9\xdb" - "\x01\xcc\xc6\x7e\x13\x7b\x42\x6a\x7f\x6c\xb6\x98\xdf\x6a\xfc\xb5" - "\xc5\x50\xdf\xe6\xd3\xe8\x1f\xe2\xdf\x9e\x90\xee\xb0\xdd\x25\xbb" - "\x77\xf1\x0d\x53\x8e\xed\xaf\x0c\x90\x63\xfb\x2b\x83\xe4\xd8\xfe" - "\xbb\x11\x72\x6c\xff\xdd\x70\x4f\x6c\xef\x8c\xeb\xaf\xac\xf4\x86" - "\xe9\xfa\x17\xd0\x16\xb3\xa8\xd6\x37\x9e\xbf\x52\xe0\x3f\x9e\xc7" - "\xbf\xf5\xbf\x1a\xcf\x55\x9e\x78\x1e\xdf\xf0\x83\xda\x65\x28\x9e" - "\x2f\x3c\x23\xc3\x73\x55\x37\x78\xfe\x83\xd9\x65\x16\x3d\x26\xc7" - "\xf3\x45\xb1\x72\x3c\x5f\x74\xbf\x84\xe7\xc2\xb5\x5b\x62\x97\x59" - "\x14\x75\x67\xec\x32\x8b\xa2\x24\x99\xfd\x77\xbd\xbb\xc7\xf3\x57" - "\x0a\xbd\xe3\x39\x9c\xa7\x78\xfe\x4a\xa1\x4f\x7f\xea\x4e\x78\xfe" - "\xbb\x4b\x7e\xe0\xb9\x57\x1f\x95\x1f\x87\x5d\xe6\x77\xcd\xfe\xda" - "\x65\x7c\xed\x53\x41\x7c\x97\xfc\x53\xdc\xf6\xa9\x44\x8b\xfb\x54" - "\x32\xe4\xfe\x29\xb7\x1c\xdb\x17\x3b\xe5\xd8\xbe\x44\x21\xc7\xf6" - "\xe5\x0f\xc8\xb1\x7d\x79\xa4\xd8\x4f\x66\x97\x31\x74\xda\xb7\x22" - "\xc7\xf9\x25\xf3\x4d\x2f\x34\x10\x6f\x58\x7f\x41\xa1\xaf\xf0\x8d" - "\xf3\x4b\xb2\x7c\xe1\x3c\xfa\xab\xfc\x65\x6e\xbc\x17\x9c\x5f\xba" - "\xe5\xff\x07\x9c\xf7\xe5\x87\x42\xf5\x20\xc0\x78\xc4\x7b\x8a\xef" - "\x02\xd6\x23\xce\x3b\xff\xe1\xcd\x46\xb3\xb4\xfc\x76\xe1\xbc\x6f" - "\x1b\xcd\xb2\xb2\xca\xd9\x02\xce\xdf\xc8\x1e\x9a\xe3\x72\x1b\x4d" - "\xde\xa2\xdb\x6d\xa3\xd1\x0f\x90\xe3\xbd\x7e\xba\x1c\xef\xf5\x77" - "\x4b\x78\x2f\x5c\xbb\x25\xf2\xbb\x5e\x73\x67\x6c\x34\x7a\x8d\x84" - "\xf7\x7a\x67\xf7\x78\xbf\xc4\xe8\x1d\xef\x97\x08\xb1\xd9\x96\x18" - "\x6f\x1c\xef\x97\xbb\xf0\xbe\xf3\xfe\x99\x8c\x9b\xf7\x91\x79\xfa" - "\x4e\xdb\x68\x96\xfb\xc4\xff\xae\xe2\x63\xdc\xbc\x8d\x46\xd8\x93" - "\xb8\xc0\x7b\x7c\x8c\xb2\x2e\x7c\x64\xca\xca\xdd\xb1\x3e\xe1\xa2" - "\xdc\x17\x31\xe1\x92\xe8\x8b\x58\x56\x89\x58\xbf\xaa\xaf\x1c\xeb" - "\x57\xa9\x7d\xd9\x68\xde\xe5\xdc\x7d\x12\x57\x3c\x2b\xb7\xd1\x14" - "\xc8\x6d\x34\x53\x90\xf7\x92\x4e\xf8\xc6\xfa\x15\x89\x72\x1f\x70" - "\xb6\x47\xf1\xad\xb9\x82\x0f\xf8\x5c\x37\x1f\xf0\xe7\xfe\x28\x60" - "\x7d\xe2\x96\xd2\x2a\x07\xf1\xc7\x0f\xf1\xfb\xfb\x7a\x67\x79\xf5" - "\x41\xa4\x6b\x40\x17\x7e\x88\xf3\xce\xa8\xd0\xa7\x79\x4c\x7e\x92" - "\x9b\x1f\x62\x17\xf1\x8c\x65\xf8\x3f\x57\xef\x13\xff\xdb\x79\x09" - "\xff\xb9\x9f\x49\x76\x1b\x0e\xe5\x7c\x4a\x97\xc4\xf2\xdb\x65\xb7" - "\xf1\x66\x27\x31\x8d\x43\xfc\x5f\x79\x9c\xc9\xf9\xf1\x3f\x32\xbb" - "\x4d\xd2\xfd\x72\xdc\x4f\x9a\x24\xc7\xfd\x24\x85\x84\xfb\xc2\xb5" - "\x5b\xe2\x8b\x9e\x14\x71\x67\xe4\xfc\xa4\x08\xc9\x6e\x93\x74\xb5" - "\x7b\xdc\x5f\x91\xea\x1d\xf7\x57\xa4\x32\xdc\x5f\x91\xda\xa5\xdd" - "\x46\xe6\x1b\xb9\xea\xcc\xf7\xb6\xdb\x88\x72\xfe\x1d\xdf\xd7\xb3" - "\xaa\xc6\x1f\xbb\x8d\x6b\x4f\xfa\xf7\xb2\xdb\x78\xc7\x7b\x51\xb6" - "\x2f\xeb\xe2\x9b\xab\x1c\xef\x93\xcf\xc8\xf1\x3e\xb9\x4e\x8e\xf7" - "\xa9\xed\x72\xbc\x4f\xb5\x7b\xb3\xdb\xc8\xb1\x7e\xf5\x08\x6f\x38" - "\xaf\x9f\x82\x76\x9b\xd4\x42\xdf\x18\xbf\x5a\xe7\x3f\xc6\xa7\xac" - "\xfc\x3f\x8c\xf7\xc0\x78\x95\x27\xc6\xa7\x14\xfd\xa0\x32\x3e\xc5" - "\xf8\x35\xfb\x64\x18\x7f\x0b\x6d\x39\x37\xb2\x9f\xc4\xb7\x6c\xbf" - "\xc6\xc3\xff\x3d\xd5\xc3\xff\x7d\x8d\x9b\xff\x7b\x6a\xd4\xad\xc3" - "\xf8\x35\xb7\xde\xff\xfd\x86\x30\x7e\x8d\x9b\xff\x7b\xea\x99\xee" - "\x31\x7e\x75\x8c\x77\x8c\x87\xf3\x14\xe3\x57\xc7\x74\x29\xdb\xcb" - "\x30\x7e\xed\xfb\xb7\xc3\x96\x73\x67\xf6\x1b\xad\x3d\xe2\x8f\x3d" - "\xa7\xab\xb8\x23\x3e\xed\x39\xa3\x45\x7b\x8e\xde\x87\x3d\xe7\x56" - "\x61\x7e\x5a\x85\x1c\xf3\xd3\x3e\x95\x63\xfe\x7a\x85\x1c\xf3\xd7" - "\x13\xb9\x3d\x27\xa1\x93\x3d\x47\x8e\xff\xe9\x8f\x99\xa6\xb8\xdb" - "\x73\x0a\xdc\xec\x39\x86\xbf\xfa\xc6\xff\x74\x9f\xf8\x7f\x8d\xe2" - "\x7f\x8c\x17\xfc\xcf\xf8\x5f\x82\xff\x31\xdf\x03\xff\x33\xee\x00" - "\xfe\xaf\x3b\xc0\x6c\x3c\x37\x18\x27\xe5\x5d\xff\x6d\x3c\xdf\x6f" - "\x1d\x30\xf4\x90\xaf\x03\x86\xd1\xf2\x75\x60\xdd\x25\x69\x1d\x10" - "\xae\xdd\x92\x75\xc0\x10\x78\x67\xd6\x01\x43\xa0\xb4\x0e\x18\xbe" - "\xee\x7e\x1d\x48\xf7\xb1\x0e\xa4\x0b\xeb\x40\xba\x1f\xeb\xc0\xfa" - "\x4f\x7d\xdb\x78\xf4\x37\x6f\xe3\xf9\xf9\x9d\xde\x07\xb5\xbe\xca" - "\x2f\x1b\xcf\xf6\xf1\xd1\xe5\x18\x23\xe5\x6b\xa2\x5c\x33\x5f\xb4" - "\xf1\x98\x3c\x6c\x3c\xa6\x4e\x36\x9e\xd5\x5f\x0b\xf8\x3f\x49\xd8" - "\x6f\x3a\xe5\x7b\xc4\x48\xa1\x39\x94\x37\x54\xc8\xfd\xe6\x37\x50" - "\xfc\x97\xe2\xf7\x65\xcd\xc1\x7e\xb1\xf5\xc7\xd4\x45\x0c\xd4\x57" - "\x1f\x90\xd9\x74\x26\x79\x8b\x91\x92\x25\xf3\xbb\x91\xef\x37\x7d" - "\x75\xa2\x0c\xef\xa7\xb0\xfd\xa6\x6f\x7b\xfb\x4e\xeb\x8a\xc9\x9f" - "\x39\x93\xc6\xe4\x77\xc5\xf2\x7b\x75\xe3\x0d\xc5\x92\x9e\x2b\xc4" - "\x92\x3e\x77\x07\x62\x49\xdf\x68\x4c\xfe\x73\x9e\xf1\xfb\x32\xaf" - "\x9a\xcb\x4d\xa4\x12\x79\x64\xb6\x67\xec\x53\x93\xf7\xbd\xfb\x4a" - "\x61\xef\xfe\xd2\xdb\x13\x07\x05\xfb\x43\xd7\xfc\xb0\xac\x69\x07" - "\xd2\xac\xb4\x3f\x98\xaf\xfa\x82\xe2\x3f\x57\x97\x03\xaf\x72\x88" - "\xa7\x09\x88\xa7\xff\xb9\x9f\xd6\xfd\x1a\x78\x21\x2c\x82\xca\x3f" - "\xd9\x1c\x09\xd6\x27\x21\xb6\xfe\x27\xf5\xfb\x02\x31\x02\xb0\x95" - "\xd5\x5b\xfb\x35\xef\x74\x86\x69\x30\xa7\xf5\x5d\x07\x97\x56\xf5" - "\xa8\xb4\xd8\x60\x5e\x34\xe1\x9e\x58\x85\xd9\xd1\x66\x42\x5a\x1c" - "\x5d\x5a\x15\xc8\x03\xfe\xee\xfe\x2d\x09\xf2\x6f\x9e\xfe\x67\x32" - "\x95\x67\x70\xdd\x0b\xcb\x9a\x8d\x71\x40\x44\xd9\x8a\xfb\x4e\xb2" - "\x6f\xed\x82\xf1\xe1\x78\xb6\xf6\xcd\x5b\xc8\x70\x03\x9e\x37\x06" - "\xc6\x92\xfa\xd8\x22\x6e\xd0\x1c\x56\x80\x1b\xf9\x2d\xd2\x77\x6c" - "\x6c\x1f\xc7\x88\xd9\x51\xb2\x24\xff\x17\x8b\x2f\x6c\x7d\x75\x9a" - "\x77\x6c\x7d\x75\x1a\xc3\xd6\x57\xa7\xb9\xb0\xd5\xe2\xc5\x8e\x22" - "\xf3\x63\x7f\x4d\xf0\x7f\x31\x79\xc8\xd8\xa6\x7f\xc1\xf8\x28\xaf" - "\xf9\xe5\xff\x42\xf1\x74\x31\xc3\x53\xc4\x2b\x11\x53\x25\x3b\x8a" - "\xc9\xa7\x1d\xa5\x3b\x4c\xf5\x6b\x0f\x3f\xc5\xd4\xd7\x07\xc8\x31" - "\xf5\xf5\x41\x72\x4c\xdd\xb4\xcf\x13\x53\x3b\xe3\xe9\xeb\x71\xde" - "\xb0\x94\xc5\x47\xd9\x34\xdd\x37\x8e\xbe\x6e\xf4\x85\xa3\xd4\x3f" - "\x7d\xae\x9b\x7f\xba\x0b\x47\x7f\xbf\x47\x8e\xa3\xaf\x57\xdf\x28" - "\x8e\xd2\xdc\x26\xe7\x7e\x80\xdc\x26\x37\x8d\xa3\x7a\x0f\x1c\xdd" - "\x38\x56\xc2\x51\xcf\xfc\x26\xdd\xe0\xe8\xa2\xdb\x13\x03\x45\x86" - "\xa3\x9c\x95\xf6\x47\xb3\x94\xf6\xf5\xb8\x1c\x47\x37\xda\x7c\xe3" - "\xe8\xc6\x2d\x12\x8e\xb2\x7a\xb7\x17\x47\x37\x9a\x64\x38\xba\xc8" - "\x0d\x47\xff\x29\xe9\x10\xe8\x63\xe1\xc2\xd1\x25\x6e\x38\xba\xa8" - "\x3b\x1c\xdd\x68\xc2\x31\x62\x32\xea\xa6\x57\xbb\xc7\xd1\xd7\x73" - "\xbd\xe3\x28\x9c\xa7\x38\xfa\x7a\xae\x84\xa3\x5e\x64\x54\x19\x8e" - "\x66\x2f\xf4\x03\x47\x7f\xe4\xb1\x51\xb2\xe3\xfd\xb2\x55\x48\x7b" - "\x3a\x3b\xc7\x48\x9d\xe3\xbe\x27\xa8\xd8\x23\xef\x49\x71\xa7\xbc" - "\x27\xab\xc5\x3d\x9e\x13\x05\x5c\x7d\xee\x7b\xe0\x2a\xdd\xe3\xb9" - "\x79\xb5\xdc\xf7\x64\xf3\x5a\xd1\xf7\x84\xe1\xea\x1b\xa1\x62\xbf" - "\xa4\xbc\x27\xc5\x5d\xc4\x48\xdd\x5c\x21\x8b\x8d\x32\xd1\x3d\x36" - "\xca\xd6\xe3\xbe\x63\xa4\x6e\xb6\xc9\x62\xa3\x9c\x2c\x74\xe5\x3d" - "\xf1\x8c\x91\x2a\x61\xec\x96\x1e\x14\x63\x5d\x31\xa8\x8c\xa3\x5d" - "\x31\x52\xbb\xd9\x17\x84\xed\x1c\xac\x8f\xbf\xfd\x18\x6b\xf2\x03" - "\x63\x65\x79\x4f\x3c\x63\x4c\x6d\x79\xcb\x5c\x5a\x4c\x2a\x63\x8a" - "\xbd\xc4\x46\x2d\xbe\xa3\xb9\x4f\xb0\x5f\xde\xb1\x76\xeb\x08\x39" - "\xd6\x6e\x8d\xa1\x75\xeb\xbc\x61\xed\x16\xa7\x84\xb5\xac\xde\xda" - "\x3a\x0f\xac\xad\xf5\x81\xb5\xb0\xae\xee\xbe\xe0\x2f\xd6\x6e\x1d" - "\x4e\xb1\xd6\x20\x60\x6d\xd3\xad\xc6\xda\xad\xc3\x25\xac\xdd\x7a" - "\xa5\xfb\x1c\x53\x9b\x1d\xde\xf7\xe5\x6c\x76\x30\xac\xdd\xec\xe8" - "\x32\xc7\x94\xcc\xe7\xe3\x8d\xaf\xc5\x1c\x53\x92\x3d\xa0\x58\xb0" - "\x07\xfc\x2b\xe7\x44\x79\xc3\xe2\xaf\x3d\xe0\x13\xd0\xdd\x71\xdf" - "\xe5\x1a\xcc\x39\x35\x1b\x73\xa2\x14\x79\xd8\x03\x8a\x3a\xdb\x03" - "\x66\x76\x8d\xb1\x7e\xd9\x03\xe8\xbe\xcb\x9c\x3a\x39\xc6\xe6\x7c" - "\x2d\xc7\xd8\xdc\xd5\xe2\x3e\x4b\xec\x8f\xef\x98\xa9\xdb\x46\xb8" - "\xec\x01\xb5\x72\x6c\x95\xec\x01\xb9\x8f\xf8\xc6\xd8\x6d\x72\xfb" - "\xef\x73\x85\xb2\x7d\x96\x6f\xd7\xbb\xc7\xa1\x16\xe3\x4f\x6d\x5f" - "\x59\x56\xed\x8e\xb1\xdb\xf2\xfe\x95\xe2\x50\xbb\x62\x4d\x75\xe3" - "\xcb\xdd\x39\x0e\xf5\x1f\x42\xcd\xa5\x45\x04\xf7\xb6\x51\xbc\x95" - "\xd9\x06\x8a\xee\x8c\x6d\xa0\xb4\xc8\x87\x6d\xe0\x0f\xdb\xe4\x38" - "\xfb\x87\x52\x5a\xf7\x8c\x37\x9c\xfd\x43\x9c\x84\xb3\xac\xde\xda" - "\x33\x1e\x38\x5b\x73\x2b\x65\xda\x3f\xe4\xdc\x5e\xdb\xc0\x1f\x72" - "\x24\xdb\x40\xee\x0d\xec\x7f\xdc\x16\xe3\x1d\x67\xb7\x09\x76\xd7" - "\x6d\x92\xdd\xb5\xc6\x4b\xbe\x14\x19\xce\xee\x18\x2b\xee\x7f\xa4" - "\x32\x6d\xad\x28\xd3\x16\xfd\x0b\xe6\x4b\xd9\x31\xc6\x5f\xdb\x00" - "\xee\x73\x47\x6c\x45\xec\x12\xf1\x55\xb2\x0d\x14\xf9\xb6\x0d\x74" - "\x83\xaf\xfe\xe7\xee\xdb\x39\x56\x8e\xaf\x3b\x9f\x96\xe3\xeb\xae" - "\x0a\x4f\x7c\xed\x8c\xad\x3b\xd7\x79\xc3\x55\x66\x1b\xd8\x95\xea" - "\x1b\x53\x77\xee\xf7\x85\xa9\x34\xa6\x5f\xbd\xe4\x23\x2d\x61\xea" - "\x9b\x65\x72\x4c\xdd\x69\xbd\x51\x4c\xbd\x23\xf9\x52\x6e\x1a\x53" - "\xe3\x3d\x30\x35\x2f\x4e\xc2\x54\xcf\x9c\x29\xdd\x60\xea\xed\xb2" - "\x13\xb8\x63\xaa\x4c\x76\xcd\xbb\x28\xc7\xd4\x5d\x91\xbe\x31\x35" - "\xef\x5d\x09\x53\x59\xbd\xdb\x8b\xa9\x79\x8d\xb7\xd7\x4e\x90\xd7" - "\x28\xc9\xae\xbb\x0e\x74\x8f\xa9\x3b\x0f\x7b\xc7\xd4\x9d\x87\x19" - "\xa6\xee\x3c\x7c\xe3\x7b\xca\xf3\xb7\xf8\x81\xa9\x3f\xf2\x5c\x2a" - "\xf9\x46\xbf\xed\x04\x68\x6f\x45\x2c\xad\xfd\x7e\xb1\x43\x92\xc5" - "\xd8\x21\xe3\x05\x8c\xfd\xe5\xf7\xc5\xd8\xdd\x7b\xe4\x3e\x0d\xbb" - "\xf7\x89\x3e\x0d\x0c\x63\xff\x6b\x82\x3c\x3f\x6a\xe7\x58\x21\xf2" - "\x18\xaa\xbb\xaf\xba\xec\x04\x88\xb9\xe3\xdd\xed\x04\x7f\xbc\xea" - "\x1b\x6f\x0b\x22\x65\x76\x82\x8f\xbc\xe3\xed\x35\x19\xde\xee\xf9" - "\x39\xc5\x5b\x57\x0c\xd5\x82\x18\x31\x86\x6a\xb7\x32\xac\x0c\x6f" - "\x63\x7e\x18\xbc\x2d\xbe\x71\xbc\x95\xe7\x52\xf1\x8c\x97\xba\xa7" - "\xce\x5c\x02\x78\x4b\xe3\x75\x78\xc6\x4c\xbd\xb1\x78\x1d\xb7\x2b" - "\x66\x2a\xf6\xcb\x3b\xee\xfe\x71\xbe\x1c\x77\xff\x98\x43\xeb\x7a" - "\xc5\xdd\x3f\x3e\x26\xe1\x2e\xab\x77\xc3\xb8\x7b\x53\x36\x83\x3f" - "\xc6\xdc\x5e\x9b\xc1\x1f\x63\x24\xdc\xfd\xaf\x41\xdd\xe3\x6e\xc1" - "\x40\xef\xb8\x5b\x30\x90\xe1\x6e\xc1\xc0\x2e\x71\x57\xe6\x43\xb0" - "\xb7\xaf\xd7\x58\x1e\xb5\xff\xea\x79\x56\xf6\xaa\x6f\xc6\x66\x00" - "\x18\xac\x4c\xc5\x18\x4e\x31\xe8\x43\xd0\xbd\xcd\xa0\x3b\xbc\xf5" - "\xdf\x66\xb0\x2f\x54\x8e\xb7\xfb\xfa\xca\xf1\xb6\xf0\x38\xf6\xab" - "\x4b\x9b\x01\xc5\x80\x7d\xf3\x5d\x36\x03\x8b\x1c\x67\x25\x9b\x41" - "\xe1\x72\xdf\xdf\xbe\xf6\x6d\x94\xc9\xb7\xbf\xf4\x88\x59\x3d\x57" - "\xc2\xdb\x93\x95\xa2\xcf\xd8\x9f\xde\x2f\x9b\xe6\x8e\xb7\xfb\xaa" - "\x3a\xc5\xac\x9e\x7e\x0b\x63\x56\x4f\xbf\xc5\x31\xab\x67\xc8\x63" - "\x56\xef\xbc\x26\xf9\x91\xf9\x1f\xb3\xfa\xcf\x33\x29\x06\x23\x0f" - "\x61\xdc\xea\x1b\xb1\x23\xdc\xe6\x5c\x2b\x32\xec\x95\xd9\x11\xfe" - "\x5c\x27\xc7\xde\x42\x95\x6f\xec\xfd\xf3\x01\x09\x7b\x59\xbd\xdb" - "\x2b\xf3\xfe\xb9\xf6\xf6\xda\x11\xfe\x5c\x2b\xd9\x11\x0a\xf7\x78" - "\xc5\x5e\xd9\xb7\xb1\x7d\x39\xde\xbf\x8d\xc1\x79\x8a\xbd\xfb\x72" - "\x7c\xda\x11\x3a\xf9\x6f\xbd\xf5\x2a\xfb\x36\x26\xc8\xbc\x16\x3f" - "\xec\x08\x3f\x3a\x1f\x83\xb7\x36\xdc\x8c\x1d\x01\xf1\x16\xf1\x4c" - "\xc4\xdc\x1b\xb1\x23\xdc\x7a\x19\xf7\xed\x57\xe5\x98\xfb\xf6\x6b" - "\x72\xcc\x3d\xf8\x88\x27\xe6\x76\xc6\xdb\xb7\xcb\xbc\x61\x2d\xb3" - "\x23\x1c\xa8\xf1\x8d\xb3\x6f\xdb\x7c\xe2\xac\x87\x6f\xae\x84\xb3" - "\xfb\x07\xc9\x71\xf6\x2f\xa3\x6f\x0a\x67\x6f\x34\x07\xcb\x8f\x0a" - "\x67\x63\x3c\x70\x76\xff\x71\x09\x67\x3d\xf3\xb0\x74\x83\xb3\xb7" - "\x29\x0f\x8b\x6f\x19\xf7\xc0\x04\x39\xce\x1e\x48\xf6\x8d\xb3\x07" - "\xfa\x4a\x38\xcb\xea\xdd\x5e\x9c\x3d\x30\xfe\xf6\xda\x16\x0e\x8c" - "\x97\x64\xdc\x83\x77\x77\x8f\xb3\x6f\x3b\xbc\xe3\xec\xdb\xc2\x77" - "\xb1\xb7\x1d\x3e\x65\xdc\x4e\x38\x7b\xf0\x92\x1f\x38\xfb\x23\xf7" - "\x41\x38\xe8\x57\xfc\x0b\x37\x7b\x6d\x4f\xb3\xc5\x63\xbf\xc4\x19" - "\xf7\xfd\x12\x6e\xb6\x85\xf1\xa2\x6d\x41\x9e\x9f\x25\x59\xb4\xdf" - "\x46\x0b\xb8\x3b\xee\xfb\xe2\xee\x21\x67\x9b\x0b\x77\x13\x00\x77" - "\x8b\xe8\xfe\x88\x36\x17\xee\xfe\xf7\x3b\x62\xbf\xa4\xfc\x2c\x3e" - "\x6c\x0b\x4f\x60\x7b\x45\xcf\xbb\x6c\x0b\x88\xc3\xd1\xee\xb6\x85" - "\xff\x8e\xf3\x8d\xc1\x45\xc9\x32\xdb\xc2\x07\xde\x31\xd8\x26\xc3" - "\xe0\xbf\xbe\x45\x31\xf8\x09\x11\x83\x8b\x8e\x5c\x03\xdd\xf2\x5a" - "\xa6\x7f\x18\x6c\xa3\x18\x3c\xf1\xce\x60\xf0\xe1\x5b\x80\xc1\x74" - "\xdc\xff\x36\xd9\x6c\x02\x0c\x9e\x8d\x18\x3c\xf1\xc6\xec\x0d\x3f" - "\x50\x8e\x16\xec\x97\x77\x2c\xfe\xdb\xa7\x72\x2c\xfe\xef\x40\x5a" - "\xd7\x2b\x16\xff\x6d\x8f\x84\xc5\xac\xde\xed\xb5\x37\xfc\xad\xea" - "\xf6\xda\x1b\xfe\x56\x25\x61\xf1\x7f\x6f\xeb\x1e\x8b\x8b\x32\xbc" - "\x63\x31\x9c\xa7\x58\x5c\x94\xd1\x25\x16\x3f\xe1\x8e\xc5\x87\x5d" - "\x32\xaf\xcc\xde\x60\xf9\x57\xcf\xdd\x72\xd8\xa7\xfc\xab\x79\x90" - "\x64\xd4\x2b\x0e\xd7\x99\xf3\x08\x69\x35\x90\x0c\xb3\xe3\x09\x02" - "\xe7\x60\xfc\xde\xe9\x61\x8e\x18\x4d\xb8\xad\x5a\x8a\xc7\x6f\xe0" - "\x3f\xc8\xb8\x46\xa5\x30\xb7\xe8\x18\xbf\x43\xfd\x5d\xf1\x3c\x62" - "\xef\x6e\xb7\xeb\xde\x9e\xc5\x1b\x87\x34\x08\xf7\xc5\xb0\x7d\x37" - "\x43\x1a\xc5\x32\xf2\xa6\x45\xf1\x4e\x2c\xbf\x65\x88\xc5\x1a\x3a" - "\xc4\xe2\xed\xfe\x87\x55\x24\xa8\xcf\x3a\x9e\xcf\xdf\xce\xdb\x5a" - "\x07\x3f\x10\xd5\xfa\x3a\x21\xc6\xed\xbc\xb5\x2d\xf3\x9d\x3c\x78" - "\xc7\x92\x3f\x40\xbd\xd6\xb0\x3d\x51\xad\x86\x69\x04\xce\x15\x89" - "\xe7\x60\xdc\x08\x67\x08\xe0\x39\xb8\xc6\x6f\xbd\x12\xb9\x3b\x0d" - "\xb0\x2a\x95\x90\x91\xd7\x70\xce\xbc\x63\x02\x9e\x51\x67\x43\x9b" - "\x9b\xa1\x2d\xfe\xbe\xfe\x36\xe0\xc7\xc0\x4a\x18\x31\x78\xef\x2c" - "\x78\xaf\x82\x6c\x1c\xfb\x80\xa1\xb9\xbc\x32\x90\x70\xfb\x22\xb3" - "\xf8\xbe\x13\xa2\x81\x1e\xc4\x98\x40\x68\x4e\x8d\xcd\x50\x8f\x57" - "\xa6\xf3\xdc\xa0\xfe\x2a\xb3\xc3\xc6\xe6\x34\xf4\xef\x28\xe8\xb1" - "\x3c\x3c\x37\x3f\x81\xa8\xe0\x3f\x98\xdf\x36\x21\xba\x2d\xf3\x7f" - "\x26\xc2\x7b\x46\x61\xbf\x7c\xbd\xe3\xe6\x9d\xb0\xee\xf4\x8f\xc0" - "\xb5\x83\x3e\x1f\x9f\x4d\x9f\xa3\xe4\xb2\x9c\x70\x9e\x37\xa4\xf3" - "\xe6\x64\x07\x09\x81\xb1\xd8\x0d\xfd\x46\x7e\xe4\xfe\xf4\x40\xd4" - "\xfa\x7e\x84\x1c\x4c\x69\x54\x9a\xa1\xef\xce\x3f\xf4\xb7\x99\xd2" - "\x7e\x4a\xe0\xba\x15\x75\x96\x0b\x8a\xbf\x4f\x98\x7a\x91\x10\xc4" - "\x13\xf8\xfd\xbc\x0d\xd6\xb1\xc9\x50\xde\x0c\xef\xc1\xb5\x46\x04" - "\x62\xdd\x0b\x8a\xff\x71\x9a\x92\xce\x92\x10\x3d\x09\xca\x86\x77" - "\x63\x75\xff\xa7\x1c\xeb\x5a\x14\x7f\x9f\x86\x7d\x80\xb2\x05\xca" - "\x78\x1f\xfa\x90\x11\x7e\x6f\x64\x16\xe5\xcd\x9c\x09\xd1\xdc\xa0" - "\xc8\x2c\x8a\x7d\xf0\x9e\x9b\xe1\x9d\xa1\x4e\x30\xd4\x09\xa6\xc7" - "\x34\xa2\xca\x81\x73\xd8\x0e\x1c\x83\x4d\x4b\x3b\xb0\xed\x23\xd8" - "\xb6\x8f\x71\x08\xe4\xd5\x13\xa2\x79\xe0\x6d\x5c\x53\x35\x69\x8a" - "\x4f\xeb\x15\x7f\xb7\x86\x28\x78\x9e\xdf\xdb\x5f\xb5\x3e\x8d\x04" - "\x1b\x39\x42\x4c\xfd\xb0\x9d\xbf\x97\x41\xfb\x81\x38\x16\x6d\x99" - "\x7f\x2f\xb4\x28\xfe\x67\x3a\x8e\x2f\xd0\xd3\xa6\x79\x18\xdf\xa1" - "\x98\xe0\x73\xf0\x1e\xa1\x3e\x1d\x4f\xec\xb3\x26\x2d\x80\x87\xf2" - "\xc5\x00\xc5\xd7\x24\x20\xa2\xf7\x40\xb8\xbf\xd1\x42\x96\xd2\xfb" - "\x2d\xec\x3e\xe0\xa5\xbf\xc3\xef\x77\xf4\x78\x0e\xcb\x3e\xfa\x1b" - "\x2c\xd2\xad\x22\x02\x78\xc3\x93\x76\x22\x8f\x00\x5f\x88\x3c\x82" - "\xfd\x3d\x94\x66\x51\xd2\x75\x58\x51\x4c\xf5\xba\x6c\xa0\xa1\xf3" - "\xcd\x88\xc0\xcd\x30\xb6\xdc\x75\xa4\x4b\x3d\x5c\x7b\xf7\x69\xa4" - "\xcb\xe6\x14\x12\x24\xd4\x8d\x95\xfa\x8f\xe5\x77\x29\x3d\x39\xa0" - "\x05\xdb\xbb\xf9\x6e\x5f\x7c\x9f\xcd\xd7\x80\x8e\xe1\xbc\xad\x24" - "\x19\xfa\x85\x7c\x0b\x3c\x72\x30\xc1\xae\x44\xbf\x3e\x3c\x7f\xb4" - "\xc5\xae\xdc\xdc\x44\x50\xae\x24\x9b\x00\x97\x77\x25\xc1\x98\x43" - "\x9b\xfc\xc0\xfe\xaa\x47\x45\x3a\xa6\x00\xed\x92\x80\x77\x61\xcc" - "\x37\xc3\xf8\xe5\x03\xe6\xe1\xef\x7c\x58\x7f\x38\xa8\x67\x51\xbc" - "\x3b\x0d\xda\x53\xed\x0a\xe7\xad\xbb\xc3\xf9\x66\x18\xc3\xd1\x6d" - "\x99\xef\x0e\x17\xc7\x10\xfb\xb4\x19\xce\x6f\x82\xeb\x30\x9e\x85" - "\x8c\x87\x8a\x93\xc5\x77\xf6\x35\x9e\x1b\x0f\x92\xd1\x9b\x0e\x92" - "\xc8\xd7\x0f\x92\x31\x6b\x1a\x60\x5e\x1a\x9e\xe2\x3f\x99\xed\x80" - "\x35\xd1\x30\xba\x23\x7c\x64\x14\x7e\x7b\xe2\xd6\xf7\x2f\x78\xf5" - "\x20\x19\x8e\x7b\x63\xa7\x82\xe4\x89\x6b\xf8\xd4\x1e\x5f\xf1\x66" - "\xfd\x55\xc2\x85\x1a\x46\x3b\xd7\x0f\x0d\x9b\x72\x95\x90\x13\x5a" - "\x1b\x49\x4b\x84\xb5\xbc\xa5\x91\xa4\xd9\x78\x6b\x65\xc6\x45\x02" - "\xd8\x53\xc3\xc6\xee\xbd\xe6\xa9\x71\x84\xe0\x9e\x41\xee\x9f\x5a" - "\xd2\x3b\x9e\x04\xa6\x9e\x21\x11\xe9\x0d\x7c\xa3\x73\xfb\x93\x9a" - "\xb4\xb5\x44\x79\xb0\xa5\x86\xc9\x9e\x8a\xf7\xde\x7f\x1f\xf7\xa7" - "\xb6\xe9\xc8\x3c\x87\xb0\x1e\xe5\x4c\x98\x98\xbe\x90\xdc\x8f\xef" - "\x13\x42\x65\xaf\xf7\x66\xc2\xb8\x4d\xf4\x0f\x9f\xdf\x1b\x48\xe9" - "\xb9\x7d\x4c\xd1\xc1\x05\x76\x90\xb7\x5a\xa2\xd3\xe3\xf8\x46\x94" - "\xeb\x60\x7d\xa1\xb2\xa0\xb9\xd1\x01\xb2\x55\x2c\xac\xdf\x16\x72" - "\xac\xbe\x40\xc9\x6d\x69\x89\xf6\xf3\x19\x59\x74\xdd\xc6\xb5\x14" - "\xfa\x3e\x43\x4b\x32\x68\xff\x61\xcd\x0c\x49\x44\x79\x8a\xff\x0a" - "\xfb\x7f\x14\xde\x95\x1f\xa0\x2b\x80\xfa\xc1\xb8\x7e\x4e\xad\x35" - "\x91\x72\xbb\x93\xec\x6c\xa2\x63\xd4\x13\xc6\x28\x10\x68\x6e\x81" - "\x71\x0a\xf2\x46\x37\xa4\x19\x67\x34\x8c\xe6\x02\x18\x6d\x28\x5d" - "\x6c\x8c\x2e\x53\x96\x13\x58\x47\x81\x36\x5b\x18\x6d\xb8\xbe\xe3" - "\xa3\x90\x36\xfe\xbd\xc7\x3f\xa6\xf9\x5a\x5f\xf0\xd9\x3c\xf0\x07" - "\xf2\x05\xa7\x1e\x1f\x85\xcf\xc6\x3e\xe0\xf7\x33\xe4\x83\xa9\xaf" - "\x7e\xc5\x57\xea\x1b\x89\x19\xde\x87\x0f\x75\xef\x83\xc3\xdf\x3e" - "\x54\xfb\xea\xc3\xc6\x91\xc0\xb7\x23\x81\x6f\x47\x02\xdf\x5a\x18" - "\xdf\x9e\xac\x65\x7c\xeb\x84\x7e\xb5\x83\xec\xbe\x66\x06\x51\x62" - "\xbf\xf6\x9f\xc5\x18\x7d\xd0\xcf\x46\x89\x77\x27\x5f\x82\x31\x12" - "\xf9\x37\x60\x68\x18\x8e\x4f\xa5\xad\x86\xa4\x23\xff\x76\x78\xe3" - "\xdf\xf7\xf7\x4f\x9d\x0f\xb4\x79\x05\xf8\xf7\x5b\x2d\x09\x6e\x20" - "\x81\x6b\x67\x00\xff\x36\x7a\xe3\xdf\xf7\xd7\x1e\x81\x67\x76\xe2" - "\xdf\x38\x77\xfe\x7d\xff\x7e\xff\xf9\xf7\x48\x83\x8b\x7f\x5f\x12" - "\xf8\x77\xa1\x07\xff\x36\xb8\xf1\x2f\xbe\xb7\xdf\xfc\xfb\xfe\x44" - "\xff\xf8\xf7\x48\xb9\x8b\x7f\x41\x2f\xd9\xf9\x5b\x3a\x46\x3d\x61" - "\x8c\x80\x7f\x8f\x14\xc0\x38\x79\xe5\xdf\x1f\x9e\x7e\xc7\x16\xdf" - "\x38\xfd\x8e\x8d\xed\x9e\x7e\x47\xcf\xf8\x4f\xbf\xa3\x7b\x6f\x3f" - "\xfd\x8e\x05\xf9\x47\xbf\xa3\x1b\x7d\xd3\xef\x68\xcc\x8f\x87\x7e" - "\xc7\x87\xdf\x38\xfd\x4c\xce\xee\xe9\x67\xda\xe1\x3f\xfd\x4c\xb1" - "\xb7\x9f\x7e\xa6\x52\xff\xe8\x67\x9a\xe4\x9b\x7e\x26\x8d\x2f\xfa" - "\x3d\x73\x3f\xc7\x73\xe8\x37\x17\x3e\xd4\x88\x32\x10\x93\xd7\x8e" - "\xb7\xa3\xce\x08\xe5\x40\xb1\x4c\x65\x2a\xd0\xab\x3d\xca\xc1\x1e" - "\x65\x95\x47\x59\xed\x51\x8e\xf0\x28\x47\x8a\x65\xa0\x57\x8f\xcb" - "\x8a\xe3\x0b\x41\x67\xcb\xb0\x28\x3e\x08\x14\xae\x0f\x9c\xe7\xd4" - "\xa0\xde\x37\xd0\x5b\xdf\x37\x1b\x78\xbb\x3e\x8d\xf4\x6f\x52\x7c" - "\xa0\xa7\xf4\x58\xdf\x4f\xcb\xa7\x64\x10\xa0\x47\xe2\x94\xb5\xc8" - "\x57\x56\xc2\x5f\x8f\xe8\x09\xe3\x74\x1f\xe8\x9b\x56\xe4\x39\x4d" - "\xc2\x31\xbe\x5e\xf1\xc1\x1c\x7c\xbf\x91\x7a\x13\xe1\x02\x86\x6a" - "\x51\x17\x02\xfa\x24\x5a\x03\x86\xf6\xe3\xf7\xcc\x8c\xca\x56\x72" - "\x41\xd9\x06\x4e\xb3\xd6\xca\x5b\x27\x5d\x81\x75\x0c\xd6\x32\x73" - "\xb3\x1d\x78\x92\xb7\x9a\x12\x2e\x41\x7f\x3f\x38\x51\x91\x0a\x6d" - "\xc3\x73\xe0\x59\x7a\x5e\xd5\x32\xdd\xec\xa8\x22\x3c\xb4\x51\x69" - "\x2b\x05\xdd\xbf\x86\x08\x6d\xea\xf9\xd0\x96\xe9\xd8\xa6\x57\xfd" - "\x2c\x67\x68\x09\x3c\xf3\x89\x19\xda\x40\xc2\xaf\x0b\x54\xfb\xc7" - "\x1f\x1f\x34\xfa\xd4\xfb\x72\x86\x8d\x67\xed\x06\xdd\x44\xbb\x1f" - "\x46\x77\xd1\xae\xd0\x5f\xd5\xcd\xb4\x9b\xeb\xbb\xdd\xe1\x42\x7f" - "\x35\x37\xd3\xae\xb5\x8b\x76\x85\xfe\x46\xdf\x44\xbb\x25\x3e\xf3" - "\x7f\xf0\x39\x23\x84\xfe\x66\xdc\x4c\xbb\x05\xbe\xdb\x1d\x5a\x72" - "\x73\xbc\x50\x62\xeb\x8a\x17\x6e\x8e\x0f\x4e\x74\xf1\xfe\xc3\x4a" - "\x6e\x8e\x07\x4e\xe4\x75\xc5\x03\x37\x47\xff\x13\x5d\xd2\xff\xe6" - "\x68\xff\xd1\xf8\xae\x68\x7f\x73\x74\xff\xc8\x27\xff\xa3\x2e\x0b" - "\xb4\x8f\xe1\xc3\x75\x46\x6e\x6b\x47\x0c\x17\x3e\x74\xc1\x7a\x2e" - "\x9a\x3c\x03\x18\x16\x92\x4b\x42\xa3\xa9\x7d\xe8\xe3\xe1\x6b\xf3" - "\x88\xd2\xa8\xe4\x94\x07\x52\x6a\x94\x66\xc7\x68\x92\xee\xe0\x9d" - "\x7b\x93\xec\x8a\x9f\xc0\xf9\xe3\xf1\x84\xd8\x56\x68\x09\x6d\x27" - "\xac\x23\x26\x3b\x2d\x9a\x4c\x75\x12\xb4\x47\xd8\x3e\x4c\x05\x0c" - "\x03\x1c\x33\xe7\xda\x71\xcd\x0b\x85\xfb\x1c\xc0\xbf\xd0\x86\x9d" - "\x1c\xe2\xac\x8a\xe8\x04\x5a\xcf\x0a\x7a\xa3\x95\xdf\x3e\x74\x01" - "\x9f\xae\x25\x1b\xe0\x37\x3c\x73\x5b\x80\x95\x28\xf3\x41\x9f\x6c" - "\xcb\xfc\xd8\x68\x51\x94\x2e\x46\x1d\x13\x74\xd9\xe6\xf4\x2b\x68" - "\x73\xd7\x19\xd7\x83\x5e\x8b\x75\x0f\x72\x56\xe5\x48\x3d\x51\xe2" - "\x6c\x84\xba\x47\x8e\x27\x12\xd2\x85\xcd\x25\x90\x53\x8f\xdb\x8b" - "\xf7\x63\x3b\x68\xcb\xdc\xcc\xc1\xd8\xaa\x27\x4c\xc4\xfe\xf2\x39" - "\x23\x23\x4c\x29\xb8\x2e\x94\x8e\x9f\xf0\x08\xdf\x26\xe0\x7c\xbf" - "\x26\x28\x53\x9d\xdd\xc0\x57\xf1\xaa\x2b\x13\xf9\xec\xde\xd1\x95" - "\xb6\x16\x62\x4a\xea\x20\xf5\x8a\xd2\x09\xf8\xec\x56\xf5\xb8\x02" - "\x9b\x7a\x5c\x61\x5b\x66\x69\xb4\xd8\x5f\x7c\x96\x78\x1e\x6d\x14" - "\xac\x8f\xa5\x31\xc7\x53\x7d\xf7\x11\xd6\x92\xb0\xa9\x11\xbc\x15" - "\xc7\xd0\x94\xd6\x02\x7d\x29\x3b\x8d\xe3\xcc\xe7\x8c\xd3\xdb\xd2" - "\xb5\x0f\x32\x9b\x5d\xa9\x03\x6d\x3f\xb0\x0e\xc4\x52\x3b\xcc\x96" - "\x96\x58\xea\x67\x03\x78\x0f\x3a\xbb\x16\xe5\x95\xcb\x8a\x52\x9a" - "\xff\x78\x86\x56\xe9\xa7\xce\x53\x4a\xd7\x7f\xd3\x83\x38\x0e\x65" - "\xef\xc3\xf3\x9e\xac\x57\x94\x69\x98\x1d\xaf\x25\x19\x9f\x07\x75" - "\xf6\xc3\x33\x93\x79\xe3\x95\x68\xac\x07\xd7\xa3\x85\xeb\x19\x6e" - "\xd7\x33\xa0\xcf\xc5\xc2\x75\xc1\x0e\xd8\xb2\xc1\xed\xfa\x06\xfd" - "\x83\x68\x97\x2b\xcb\xc2\x77\x82\xb5\x2c\x06\xd7\x35\xb4\xf9\x33" - "\xbb\x7a\x4b\x8c\x50\x2f\xb1\x59\x51\xb6\xa7\x15\xf8\x0a\xae\xa7" - "\xba\xdd\x9f\xfa\x61\x72\x14\x79\x66\x17\x8e\x69\xd9\x61\x4b\xc0" - "\xd5\x1a\x66\xcb\x29\x2d\xa2\x63\xa1\x6a\xd1\xb9\xb7\x67\x51\x94" - "\x65\x40\x9b\x3a\x1b\xc8\x7a\x50\x27\x17\x9f\xe9\x3e\xfe\x71\x09" - "\x09\xcb\x12\x34\x83\x62\x35\xb1\x4b\xe6\x6b\x5e\x5e\xb6\x72\x69" - "\xe2\xd8\x41\xb1\xbd\x08\x71\xe3\x1d\x15\x6f\x08\xe1\xb9\x9c\xb1" - "\x8d\xe6\x5c\x90\xb1\x94\x2a\x58\x6f\x3b\x48\x0e\xd0\xd5\xb1\x7d" - "\xb2\xc9\x19\x3e\x79\x9a\x73\xfb\x48\x53\xfa\x55\xa2\x4c\x8b\xe0" - "\xbf\x36\xa5\x8c\x03\x1a\x9c\x9c\x8c\xeb\xbd\x19\x46\x6f\x23\xf0" - "\xab\x29\xe5\x03\x3c\x47\xf7\xc0\x98\x63\xd8\xb9\xff\x4e\x2b\x55" - "\x1e\x4b\xab\x51\x96\xc7\xb4\x90\x0f\x23\xac\xa4\x44\xd3\x42\xf2" - "\xf0\x3c\x57\x45\xbf\xcd\x40\xfd\x77\xf0\x59\x68\xdf\xc2\xdf\xcc" - "\x56\x77\xf2\xe7\xf8\x1c\x4d\x3f\xfc\x66\x70\x72\x2c\x3e\xcf\xa2" - "\x38\x39\x26\x20\x8f\x28\x40\x9e\x09\x86\x7a\xed\xdc\xb6\xb1\x8d" - "\x74\x7e\x67\x96\x35\x3b\x94\x61\x23\xf2\xb7\x92\xa0\xdd\x5b\x09" - "\xc9\x0b\x23\x81\x6d\x99\x27\x1b\x2c\x81\xc1\x79\x38\x5e\xd0\x74" - "\x70\xab\x92\x3c\x05\xe7\xec\x16\xb2\xa4\x19\xcf\xc1\xbc\xb2\xf9" - "\xc2\x0b\xfc\x56\x66\xdf\xdb\x6f\x1a\xa7\x1e\x5b\xc3\xc3\x58\xd8" - "\x07\xf6\xcb\x08\xd1\x03\xbf\xc0\xbc\xe1\xfb\x8e\xad\x69\x56\x94" - "\xdb\x3e\x2a\x26\x24\x0d\xe7\x29\x8c\xc7\x5f\xae\xd9\x61\xbe\x4e" - "\x36\xed\xbf\x66\x85\xf2\xe4\x69\x6f\x25\xd9\x95\x27\xc7\x17\x13" - "\xcd\x0b\x28\x0f\x7d\xb2\xe4\x3f\x62\x79\xc7\xd0\x69\x20\x3b\x36" - "\xfc\x8d\x7c\x52\x5b\x4a\x82\x67\x93\x00\x57\xfc\xf6\x44\xa2\x9c" - "\x6a\x81\xf2\x4a\xa2\xac\x04\x5d\x1e\xed\xed\x69\x4f\xa3\xcd\xbd" - "\x82\xa0\x1d\x9e\x57\x2e\xb3\x1d\x68\xb1\x03\x2e\x35\xf6\xc0\xfd" - "\xde\x9c\x2a\x6b\x34\xde\x33\xcf\x26\x7c\xbf\x6a\x15\xbe\x5f\xb5" - "\xd2\xef\x57\xb9\xf8\xed\x0a\xbf\x59\xa5\xc6\xf0\x9c\x73\x85\x36" - "\x6c\x6a\x4c\x00\x8f\x6d\xe2\xf7\xac\xde\x20\xf7\xf3\x2b\xb4\x7d" - "\x76\x24\x10\x75\xa5\xb5\x91\x98\x1b\x4b\xc9\x9b\x49\x44\xcd\xb7" - "\xc6\xdf\x5d\x5e\x72\x92\xf0\x5b\x37\x44\x1d\x4a\x33\xf5\x70\xa2" - "\xcd\xa3\x35\xa2\x57\xc8\x3a\x05\xda\xee\xfb\x6c\x4c\x20\xc3\x77" - "\xb7\x90\xa8\x79\xe7\x33\x68\x2c\x27\xcc\xbb\xe7\x68\xd5\x6a\xae" - "\xb7\x6a\x1f\xee\x58\xa1\x7d\x30\xc4\xca\xbe\x77\xcd\x59\xa8\x22" - "\xf8\x4d\x8b\xcf\xfc\x47\xee\x6e\xb4\x3b\xdb\xac\xc4\x11\x9a\x35" - "\x1a\xf9\x13\x9e\x1b\x89\xdf\x48\xd2\x57\x13\x15\xf7\x8d\x96\x54" - "\x34\xb7\x90\x47\x81\x6f\xf0\x7b\x40\x7e\x3d\xfb\x1e\xe0\xdc\x62" - "\x18\x8d\xdf\x04\xda\x56\x68\x95\x93\x2f\xc1\x7a\x95\xf9\x89\xaa" - "\x63\x50\xbf\x69\x27\xb4\x75\xb8\x26\xb8\xcd\xfb\xf2\xe3\x37\x37" - "\xef\xcb\x4d\x78\x1f\x7e\x23\x03\x3a\x99\xf6\xb7\x20\xdd\x80\x7e" - "\x2d\x56\xe5\x73\x0d\xbc\xa3\xa2\xe1\x6d\xa0\x4f\x8d\x8c\x3e\x94" - "\x9e\x09\x76\xe5\x85\x58\xa0\xcb\x79\x46\xab\x72\x1b\xd0\xe9\x38" - "\xb6\x31\xce\x72\x00\x68\x0d\x3a\x8f\xb2\xdc\x5e\x47\x63\x51\x20" - "\xbd\xf6\x77\x94\xf6\xe8\x50\x0f\x8d\xc1\x6f\x8d\x6d\x03\xfb\xe9" - "\xdb\x73\xc6\x16\x5f\x57\x8f\x2d\xed\xe2\xbb\x63\x2e\xd2\x6b\xed" - "\x42\x12\x54\xde\x70\x9a\x50\x9a\x2d\x17\x68\x86\xfe\x69\xab\xb4" - "\x7d\x1c\x6d\xda\xb0\x1d\x40\xab\xca\x44\x0b\xd9\xd9\x42\xd4\xe6" - "\xc6\x1a\xfc\x26\x73\xf7\x73\xcf\x13\xf2\xdc\x5b\x3c\x57\x51\x72" - "\x96\xd2\xef\x20\xd0\xcf\x01\xf4\xc3\x6f\x91\x2e\xfa\x25\x01\xfd" - "\xae\x01\xfd\x2e\x49\xf4\x73\xb6\x01\xfd\xda\x80\x7e\xab\x80\x7e" - "\x36\x4f\xfa\x1d\x89\xc4\xef\x95\xf8\x5d\x08\xe9\x87\x3e\xd1\xdc" - "\x2a\x6d\x24\xfd\x4e\xf9\xb2\x96\xec\x5e\x40\x82\x46\xd8\x89\x22" - "\xfd\x38\x51\x41\x3f\x55\x43\x60\x7c\xa1\x3d\xe0\xef\x7a\x62\x2e" - "\x76\x92\x35\x33\xc9\x83\x48\x4f\x87\x40\x4f\xb3\xe3\x1d\x72\xad" - "\x4d\xab\x84\x36\x47\xef\xb8\x46\xc6\x4c\x3a\xaf\x21\x27\xa6\x57" - "\x10\xa0\xc7\x7e\x6e\xdb\x38\xfd\xcd\xcf\xc3\xaa\xd4\x1b\x9f\x87" - "\x95\x57\xff\x6f\x1e\xde\xec\x3c\xac\xcc\xf5\x3e\x0f\xab\x9e\xbd" - "\xb9\x79\x58\x35\xf1\xff\xe6\xe1\x8f\x69\x1e\x56\x8d\xf2\x9c\x87" - "\x2e\x59\x21\x21\x6e\xc9\xfc\x85\x4b\x17\x2e\x7d\x45\xb3\x60\x75" - "\x62\xdc\x0a\x26\x31\xc8\x64\x06\xad\x93\x8b\x56\xbe\x01\xeb\xe9" - "\x27\x11\x35\xe4\x50\xbf\x1a\x25\x37\x2b\x22\x90\x37\xe6\x67\x70" - "\xc6\x3d\x41\x6f\x80\xec\x8b\xf3\x35\x07\xe4\xda\x0b\x8a\x5a\xdd" - "\xc7\x91\x20\xf3\x25\x34\x11\xfc\xcd\xe4\xa5\x59\xa5\xb8\xb7\x30" - "\x77\x3b\xdf\x88\x7b\x0b\x4f\x8e\xc7\xb5\xff\xd4\x99\x7b\x74\xb0" - "\xae\xcf\x8a\x20\xed\xb3\x74\xca\xd7\xcf\x92\xa0\x90\x1a\x32\x89" - "\xe3\x78\xde\x94\xd6\x04\xb2\xd6\x99\x02\xd3\x4b\x4d\x44\x93\x12" - "\x04\x75\x6b\x14\x9a\x94\x75\x70\xfc\xe2\xbc\x26\x25\xf3\x2b\x38" - "\xd2\x7d\x33\x20\x6f\x37\xf2\xdb\xc7\x46\x39\xff\x14\x59\x80\xdf" - "\x14\x77\x87\xf3\x0d\x07\x41\xb6\x3f\xd8\x61\x57\xae\x4f\x40\xdf" - "\xec\x87\x78\xfc\x36\x88\xdf\x1e\xd7\xb7\x80\xfc\xbe\x41\xb4\xcf" - "\x7c\x11\x8a\xf3\x65\xe3\x76\xbe\xe1\xe8\x85\x1a\x25\xce\x1f\x9b" - "\xea\x4a\xf4\x06\x78\x0f\xe8\xa3\x65\x67\x38\x5f\x6b\xed\x3b\xb6" - "\x31\x50\x43\x94\x6d\x99\x9f\x4d\x04\x99\x24\x10\xe5\x89\x2c\xb8" - "\xf6\x3a\x5c\x63\xdf\xe8\x3e\x2f\xe7\x7b\x9e\x8a\x40\xcc\x02\xde" - "\x55\x5c\x56\x7c\xb6\xad\x1d\xde\x71\x23\xd3\x03\x1a\xed\xdb\xc6" - "\x96\x3a\xf6\xf5\xd3\x3b\x50\x86\x1b\xd4\x2f\xa3\xa3\xef\xd8\x62" - "\xc7\xb6\xb1\x35\x33\x1e\xa1\xdf\xa2\xa1\xfe\xe9\xe7\xf1\x1d\xae" - "\xab\x47\x9a\xa0\xbe\xad\x55\x3d\xd9\xd4\x9a\x33\x79\xda\xc9\xe4" - "\x22\x01\xcb\x3e\x3b\xfe\x5c\xae\x80\x65\xb9\x30\x57\x74\x80\x65" - "\xba\xce\x58\xc6\xbe\xdd\x3b\x09\xc3\xb4\x0a\x02\x6d\x35\xe0\x5c" - "\x41\xb9\xf0\x00\x8c\x03\xce\x03\xe4\x77\x8a\x6d\x80\x6b\xe2\x9c" - "\xc0\xf9\x82\xf8\x45\xe7\xa7\xc7\xfc\xc0\x39\x71\x8f\x95\xa8\x70" - "\x4e\x20\xbe\xe1\x9c\x40\x9f\x98\x37\xae\xb1\x39\x11\x52\x4b\x54" - "\x74\x5e\x38\x4a\xe9\xbc\x40\x9d\xa0\xdc\xe1\x81\x69\x6e\x73\x62" - "\x93\x38\x27\x44\x4c\x03\xbe\x77\xe0\x9c\x58\x25\x9f\x13\xb3\xea" - "\x54\x84\xe2\x5d\xe6\x3f\x22\xf3\x60\x4e\x54\xea\xad\xc4\x29\x62" - "\x1a\xcc\x09\xdc\xb3\x43\x31\xed\x77\x02\xa6\x59\xe1\x3c\xcc\x85" - "\xfc\x45\x72\x4c\x6b\x6f\xeb\x4e\xb6\x38\xfd\xc0\xcd\x61\xda\xe9" - "\x48\xbc\x0f\x69\x85\x74\x43\x7a\x21\x8d\xfe\x95\xe8\x83\x98\xe5" - "\x54\xf9\xc0\x2c\x2f\xf4\x01\x7e\x6e\x86\xdf\x9d\x68\xc4\x67\xbe" - "\x1b\xeb\x8e\x5b\x88\x57\x88\x5d\x88\x59\x88\x5f\x38\x0f\x10\xb7" - "\x28\x66\x01\x9e\x43\xb9\xb1\x22\xbe\x9e\xe2\x59\xfa\x79\xa2\x4a" - "\x9f\x40\x1e\x44\xfc\x32\x3b\xae\x12\xc4\x33\x4a\xbf\x50\x89\x7e" - "\x88\x5f\x3b\x93\xc8\x98\xc9\x0b\x35\x04\x71\x0b\xc6\x3e\xe8\x84" - "\xf6\x34\xa1\xba\x80\x41\x7d\xff\xee\x30\xd0\xb9\xb7\x92\xc0\x9c" - "\x30\x12\xd4\x96\xf9\x79\x73\x67\x3d\xe0\x0b\x22\xea\x01\x38\x67" - "\x71\xee\x5a\x14\x9f\xcd\x66\xdf\xa1\x9f\x54\x31\x5b\x78\xdd\xdd" - "\xb4\x0c\x7a\xb3\xa4\x33\x7f\xf1\x34\xfb\xfe\x0d\x3a\x72\xdf\x91" - "\x11\xfc\x96\x2b\x13\x71\xfc\xf0\x7d\xe6\x3d\x02\x7c\xb6\x6d\x5c" - "\xc1\x66\x1c\x93\x6d\xa0\x7f\x6f\x1b\x57\x28\xf1\xd4\x17\xcb\x4f" - "\x24\x13\x32\x23\xd9\x5f\x9e\xfa\x82\xd9\x5e\xbf\xd4\xdd\xcb\xcf" - "\xd2\x05\x72\x5f\xea\x7a\x00\xfd\x23\x96\x39\x33\xc8\x35\xe3\x2c" - "\x53\xba\x83\x6f\xd4\xa4\x90\xa1\xd0\xaf\x4f\x4f\x82\xbe\x7d\x32" - "\x11\x70\x6c\xda\x62\xa0\xe5\xac\xe8\x43\x9c\x35\xd0\xa2\x38\x55" - "\x03\x3a\x7f\x23\x60\x69\xa0\x3b\x96\x32\xdc\x3c\x45\x63\xfe\xdb" - "\x8d\xb3\xaa\xb0\xad\xa9\xa5\x24\x44\xf3\x4b\xf4\xaf\x3b\xb3\x7c" - "\xf5\x5a\x82\x7b\x46\x7b\xc0\xef\xb1\xed\x5b\x87\x45\xc3\xfd\x7d" - "\xf8\x2f\xa7\x2b\xf4\xbf\x84\xf5\x64\xd6\x74\x05\x7e\xef\x7f\x3b" - "\x2d\x57\xc9\xc1\x39\xe6\x3f\x94\x4b\xf0\xfa\xc6\x8e\x40\x2a\x37" - "\x71\x50\xa7\xd2\x96\x4b\x36\x26\x05\x11\xac\xcf\x7c\xd2\x72\x09" - "\xd6\xdf\x94\xa0\xa2\xfe\x02\xf4\x3e\x47\x2e\xc1\x7b\x9d\x70\xfe" - "\xf7\x5c\x30\xc9\x4e\x51\x93\x93\xd3\x2a\x69\x1b\x27\xa7\x7d\x44" - "\xb0\x0d\xe0\x73\xf8\x7d\x94\x6c\x4e\x8a\x80\x79\x9d\x0b\xd7\x3f" - "\x27\x9b\x2f\x47\xc2\xf1\x02\xfc\x5f\x23\x4d\x8a\x1a\xcb\xc9\x69" - "\x1c\x09\x59\xf7\x14\x0f\xfc\xca\x9b\x71\x1f\x62\x1a\xe9\x09\xeb" - "\xc2\x45\x73\x8d\x11\xd6\xb6\x2f\xaa\x70\x9f\x3a\x9f\x3e\xab\x99" - "\xe3\x67\x5d\xe2\xd2\x67\x5d\xc6\x67\x3b\xf9\x59\xdf\xe1\xb3\x37" - "\xa5\x68\x04\x1f\xd5\x5c\xea\x3b\xb7\xf1\xda\x40\x82\x7d\xc5\xe7" - "\xe2\xf3\x36\x27\x68\x85\x67\x0e\xa7\x7d\xc3\x67\x62\x9b\xee\xcf" - "\xc4\x1c\xf0\x9a\x17\xf1\x99\x67\xe6\xc0\x31\x14\xe8\x51\x8d\x74" - "\xc0\xe7\x73\xbc\xae\x07\x9f\xae\x0b\xa0\xf7\x24\x37\x7a\xbb\x67" - "\x8b\x70\x0f\xf5\x45\xc3\x7b\x3a\x58\x7d\xda\x06\xac\x75\x74\x1f" - "\xc8\x30\x9d\x89\x74\xa6\xe1\xd9\x67\xd9\xda\x77\xf6\x7e\xb6\xf6" - "\x31\x9a\x52\x5e\x99\xa5\xeb\x01\x74\x53\xe1\x3a\x09\x6d\x5c\x71" - "\xb5\xf1\xa5\x2e\x00\xe9\x8d\x7c\x23\xf2\x12\xf2\x91\xc8\x43\xb4" - "\x9f\xc0\x75\xee\x3c\x03\xbf\x83\x58\x3b\x67\x7f\x2e\xb6\x03\x7d" - "\x20\x22\x1f\x0d\x83\xeb\x9d\xf9\xa8\x36\x54\xe2\xa3\x2f\xff\x6a" - "\x4f\xe3\x79\xe4\x23\xd3\x4b\x06\x6c\x67\x9d\xd4\x9f\xe9\x0a\xe4" - "\xb1\x7f\x31\xde\xb2\x20\x9d\x86\xa5\x12\x35\x7b\x9f\x2f\xe9\x7a" - "\x3d\x2c\xd5\xa4\xc6\xbe\x8a\xef\x81\x7d\xc8\xe6\x34\x44\x7c\x8f" - "\xcd\x1d\x03\xa1\xdd\xcb\x44\xb8\xe7\x55\x6c\x5b\x1c\x03\xa0\x19" - "\x11\xef\x11\xeb\x67\x73\x5a\xe8\xf7\x70\x7a\x0f\xe3\xb9\x0b\x5e" - "\xf8\xe7\xcb\x4f\x3d\x79\xee\x9e\x54\x02\x82\x2b\xc8\x4a\x2f\xb5" - "\xe0\x73\x2e\xb1\xbe\x1d\x73\x76\xc0\x33\x80\x06\x4a\x76\xbe\xb6" - "\x87\x1b\x4f\x08\xed\xdb\xbd\xb4\x5f\xfb\x98\xac\x7d\x1d\xb4\x9f" - "\x0c\xed\xa3\x2c\xf6\x12\xda\xbd\x6a\x27\xd3\x76\x92\x59\xfb\x22" - "\xdf\xf2\xc6\x21\x16\x7d\x0a\xfa\x74\xd6\xda\x18\x9e\x9e\xa2\x34" - "\xa7\xbe\x44\x4a\xae\x80\xf3\xf0\x25\x72\xf7\x35\x3b\x94\x66\x15" - "\xfc\x88\x6a\x4f\x63\x1d\xc0\x57\x1b\xca\x94\x07\x40\x1e\x93\x7c" - "\x89\xce\xe2\xf5\x3a\x53\x52\xbd\x9b\x2f\x51\x2d\xcd\x37\x6f\x51" - "\xd4\x05\x81\xee\xa8\x84\x72\x09\x3b\x7f\x2a\xc3\xfd\xbc\xe4\xab" - "\xc7\xce\xa3\x1f\xb4\x60\x6b\x6d\xfe\xb0\x18\x6d\x6d\x75\x1a\xd1" - "\xbe\xe9\x43\x37\xf5\x43\xe6\xfd\x36\x56\x92\x79\xbf\x8d\xf5\x2d" - "\xf3\xd6\x55\x74\x2d\xf3\x36\xec\x97\x64\xde\x6f\x7a\xb3\x79\x5f" - "\x7f\x85\xcd\xfb\xfa\xbf\x52\xdb\x2d\xb4\xe7\xf8\xa3\xae\x88\xff" - "\x53\xff\x68\xe4\xf3\x7c\x90\x61\x0f\x25\x95\x2a\x0f\x82\x6e\xe4" - "\x04\x79\x77\x7d\x0a\x09\xc4\x18\x6a\xeb\x61\x0c\xcd\x8e\x5a\x52" - "\x11\x88\x32\xef\x29\x6c\xe7\x81\x4a\xab\x9d\xc0\x3a\xa7\x61\xe3" - "\x72\xee\x11\xa0\x45\x80\xd9\x6e\xa7\xf5\xf0\x1a\xac\x6b\x0d\x28" - "\xf7\x1e\xe5\x4a\x95\xbb\xa0\x1d\x9b\x5a\x97\xe1\x2e\x13\xb7\x65" - "\x9e\x9b\xee\x5d\x16\xfe\xba\xc6\x91\xe9\x2e\x0b\x9f\xdb\x83\xb2" - "\x30\xda\xc3\x71\xdd\xe7\x98\x0c\xac\x07\x79\x38\x03\xe5\x62\x94" - "\x85\x39\x99\x2c\x6c\x99\xd3\xb5\x2c\x7c\xae\xe2\xff\x64\xe1\xef" - "\x2b\x0b\xfb\xd2\xef\x2d\x8f\xdc\x9c\x2c\x6c\xd1\xfe\x9f\x2c\x7c" - "\xa7\x64\x61\x8b\x5a\x94\x85\x39\x83\xba\x67\xde\x56\x42\xf2\x5d" - "\xb2\xf0\xd7\xf6\xce\xb2\x70\x7d\x70\x67\x59\xf8\x5c\xbc\x5c\x16" - "\x6e\xec\xdb\x59\x16\xae\x9f\xec\x4b\x16\x06\x1c\x6a\x46\x59\x18" - "\xf9\x08\xe5\x62\x94\x87\xa1\x6f\x85\x8c\xa7\xea\xd7\xde\x9c\x2c" - "\x5c\x9f\x7a\x63\xb2\x70\x7d\x9d\x77\x59\xb8\xae\xdc\xb7\x2c\x5c" - "\x57\xee\x5d\x16\x6e\x58\x2b\xc9\x30\x0d\xcf\xfe\xf8\x65\xe1\x6f" - "\x9a\xbd\xcb\x2b\xdf\x5c\xfd\x7f\xec\x7d\x7d\x5c\x14\xd5\xfe\xff" - "\x61\x16\x15\x0d\x64\x31\xf0\x22\xa9\xad\x25\x89\xb0\x24\x95\xd6" - "\x76\xd3\x42\xc3\xc2\x7b\x45\xb0\xac\x8b\xcf\x68\x60\x68\xa8\xf8" - "\x18\x1a\x22\x98\x76\xd1\x00\x97\x02\xaf\x1a\xf8\x70\xc3\x7e\x7a" - "\x53\xc3\xd2\xef\xc5\xae\x16\x16\xf6\xc3\x42\xc0\xbe\x76\x2f\x76" - "\xf1\xb6\x79\xd1\xd0\xd0\x56\x04\x79\xda\xdd\xf9\x7d\xce\x9c\x59" - "\x66\x67\x77\x66\xd9\x99\x45\x82\x7e\xfe\xb1\x2f\x74\xe6\xcc\x99" - "\x99\xcf\xfb\x7d\xce\x79\xbf\xcf\x9c\x07\xa2\x85\x2f\x55\x77\xbe" - "\x16\xbe\x54\x2d\xac\x85\x6b\x16\x12\xdd\x70\x49\x67\xab\x85\xe1" - "\x1a\x41\x2d\x5c\x93\xcf\x5e\x53\xcd\xd7\xc2\x24\x0f\x68\x03\x8f" - "\x8b\x6b\xe1\xcb\x2f\x91\x36\xf1\xb2\x3f\x69\x13\x09\xa6\xb6\x5a" - "\xb8\xc6\xd8\xb1\x16\x26\x1c\x62\x9e\x53\x54\x0b\x5f\x9e\x68\xab" - "\x85\x2f\x96\x09\x6b\xe1\x9f\x86\x70\x3c\xba\x72\x92\xaf\x85\x2f" - "\x67\xf6\x0c\x2d\x2c\xca\xad\x3a\xbe\x16\xbe\x32\x5b\xba\x16\xbe" - "\x92\x2d\x4d\x0b\x63\xce\x09\x69\xe1\x2b\x17\xad\x39\xc7\xd7\xc2" - "\x57\x5a\x84\xb5\xf0\x4f\x5e\x7c\x2d\x8c\xf3\x17\xd2\xc2\x3f\x8d" - "\xe3\xe5\x6f\xa3\x85\x7f\x9a\xce\xd7\xc2\x24\x1d\xa7\x85\x6b\x11" - "\xdb\xb7\xb0\x4a\xba\x16\xfe\xe9\x47\xfb\x5a\xf8\xa7\xab\x7c\x2d" - "\xfc\xd3\x09\xa2\x79\x6b\xbd\x89\x16\xfe\xa9\x92\x1c\xbf\xb8\xd2" - "\xf2\x38\xa7\x85\xc9\x71\x5b\x2d\x5c\xab\xee\x40\x0b\x6b\x1c\xd7" - "\xc2\xf5\x75\xa5\xed\x5a\xb8\xbe\xce\xac\x85\x4d\x14\xb4\x51\xd0" - "\xde\xc3\xaf\x16\xcf\x11\xc0\x65\x0e\xda\x9c\x8b\xf6\xf5\xb0\x3e" - "\x80\xd3\xc3\x37\xd6\x90\xb2\x7f\x63\x36\x29\xfb\x37\x86\xb4\xf7" - "\x01\x83\x16\xc6\x9a\x98\xed\x03\x3e\x9f\x05\xbf\x8f\xd6\x96\x32" - "\x7a\xf8\x70\x7d\x33\x85\x35\xf1\x66\x88\x23\xd6\xc5\x5f\xb2\x9a" - "\xb8\xa2\x41\xc3\xea\xe2\xeb\x9b\xa1\xcd\xd0\x65\xa5\x30\x73\x98" - "\xdc\xe0\xf9\xaa\x18\x3d\xbc\xb2\x19\xbd\x7f\x5b\x43\x41\x7b\x57" - "\x55\x9c\x42\xd2\xc1\x7b\x56\x73\xfa\xf9\xea\x42\x9e\x7e\x5e\xc9" - "\xe8\xe7\xf3\x58\x3f\x7f\x09\xb5\xd2\x67\x29\x44\x43\x63\xfd\x8c" - "\x75\x34\xe8\xe7\xca\xfc\x81\x74\x59\xd3\x5b\x57\xb7\x9b\x35\x74" - "\x26\xfc\x1f\xb0\xd6\xe1\x11\x4d\xf9\x0b\x90\x2b\x60\x52\xf5\x26" - "\xdc\x03\xa7\x87\x74\xc5\xe6\x74\xd0\x66\x57\x12\x9d\x7d\x3d\xdc" - "\xc4\xeb\x73\xbe\xe6\x81\xd7\xf3\x67\xda\x63\x88\x03\xd6\x53\xe6" - "\x3e\x67\x93\xbf\x5f\x2a\xed\x43\xb4\x36\xbf\xdf\xf9\xe7\x33\x66" - "\xad\x9d\xc5\x6a\xed\x16\xac\xb5\x13\xcd\x5a\xfb\xda\x93\x32\xb5" - "\xf6\x79\x46\xcb\x4d\xe9\x7c\x2d\xb7\xa3\x1b\x68\x6d\xac\xb3\xb1" - "\xb6\xc6\x3a\x1b\xeb\x6e\xac\xb5\xb1\xee\x36\xb1\x5a\x1b\xaf\xd7" - "\xd7\xf2\x3a\xab\xb5\x7b\x5b\x68\x6d\x17\x4b\xad\xfd\x73\xae\x3c" - "\xad\xfd\x73\x8e\xa5\xd6\xc6\xfc\x96\xaa\xb5\x31\xc6\x36\xdf\x38" - "\x01\x2b\x8c\x13\xc6\xc4\xee\xb7\x32\x16\x2f\x8c\x0f\xc6\x06\x63" - "\xe4\x10\x3e\xc0\xaf\xb2\xe6\x5f\x4f\x6b\x07\x58\x69\x6d\xac\xad" - "\x21\x76\x35\x58\x73\x57\x14\x43\x6c\x96\x81\xee\x06\xcd\xcd\xd3" - "\xdb\xaf\x0b\xe9\xed\x9f\x53\xdb\xfb\x9e\x29\xef\xde\xbb\x70\xdf" - "\xf3\x00\xb3\xde\xbe\x1e\x6f\xab\xb7\xaf\x27\x5b\xe8\xed\x4a\x9d" - "\xcb\xd5\x4a\xbe\xd6\xbe\x95\x6f\xab\xb5\xaf\x1f\x17\xd5\xda\x03" - "\x05\xb4\xb6\x8f\x59\x6b\x5f\xbf\x2a\x4f\x6b\x5f\xaf\x15\xd3\xda" - "\x4d\x4a\x4b\xad\x7d\x63\x12\xa7\xb5\x57\x5a\x68\xed\xda\x6a\x71" - "\xad\x5d\xcb\x68\x3b\x5a\x39\xb3\x12\xe7\x85\x35\x12\xfe\x36\xa7" - "\x62\xe6\x8e\xff\xd2\x82\x75\x12\xee\x6b\x80\xe7\x07\xad\xf4\xcb" - "\x69\x4b\xcd\x8d\xbf\xc9\xd9\xd3\x45\x89\x0b\xd0\x50\xac\x8d\xb0" - "\x2e\x32\xeb\x58\x9c\x1e\xeb\xa3\x3b\xab\x8d\x7e\x89\x15\xd6\x46" - "\xbf\x2c\x63\x74\x2f\x33\xe7\xf0\x46\x38\x6e\xe3\x3a\x57\x7b\xdf" - "\x08\x17\xd6\xde\xbf\x5c\x26\x3a\xe5\xc6\x64\x8c\x0b\x5f\x7b\xc3" - "\x35\x82\xda\x5b\x3f\x88\xbd\x26\x9c\xaf\xbd\x49\x1e\xd0\xde\x8e" - "\x11\xd7\xde\xfa\x73\xa4\xfd\xd5\xef\x25\xed\x2f\x8b\xb1\x8d\xf6" - "\xd6\xaf\xb1\xd4\xde\x18\x7f\x5b\xed\x4d\x38\xc5\x3c\xa7\xa8\xf6" - "\xd6\x9f\xb2\xd5\xde\xb5\xd5\x58\x7b\x0b\xf3\xaa\x7e\x1f\x9f\x57" - "\xf5\x13\x9b\x4d\x66\x0d\xbe\x05\xf2\xbb\xe9\x65\xad\xc1\x7b\x20" - "\xd7\x62\x39\x1d\xce\xbc\xd3\x65\x69\x3a\x1c\x5f\x53\x3f\x48\x9a" - "\x0e\xc7\xfc\x13\xd2\xe1\xf5\x71\xd6\xfc\xe3\xeb\xf0\xfa\x34\x61" - "\x1d\x5e\xbf\x83\xaf\xc3\x71\xfe\x42\x3a\xbc\xfe\x34\x2f\x7f\x1b" - "\x1d\x5e\xff\x23\x5f\x87\x93\x74\x9c\x0e\xbf\x95\xce\xf6\x6b\xc8" - "\xe8\x93\xbe\xb5\xd0\xbe\x0e\xbf\xb5\x8c\xaf\xc3\x6f\x85\x11\xbd" - "\x7d\x2b\xaf\x99\xd1\xe1\xb7\xa2\xc9\xf1\xda\x54\xcb\xe3\x9c\x0e" - "\x27\xc7\x9b\x2d\x75\x78\x31\xd6\xe1\xb7\x8e\x76\xa0\xc3\x43\x1d" - "\xd7\xe1\xa6\x13\x9c\x0e\x37\x9d\xb0\xaf\xc3\x1b\xe2\xec\xeb\xf0" - "\xb6\x66\x4e\x87\xb7\xb2\xdf\xa3\x5a\x83\x49\x3d\xd0\x72\xdd\xdc" - "\x2f\x8d\x75\xb8\xf1\x81\xe8\x42\xb6\x5f\xba\xf4\xf0\xea\x4a\xea" - "\x23\x73\xbf\xf4\x72\xd0\xd7\x7a\xe4\xb6\xb9\x1e\x21\xac\xc1\xf1" - "\x58\x8c\xb2\x66\x0d\x3b\x1e\xa3\x65\x7a\x1e\xd6\xe0\x57\x20\x4d" - "\x0d\x68\x70\xd0\xd1\xef\xb7\x6a\x28\x78\x9f\x2a\x5e\xda\xd5\xed" - "\x69\xab\xcd\x69\xb1\xf6\x86\xf4\x65\xe5\xa0\xc3\xf1\x35\x50\xfe" - "\xcb\xca\xf0\x38\x8f\x94\xaf\x99\xb4\x90\x47\x25\xa7\xd9\x1b\x87" - "\x30\x9a\x5d\xcf\x6a\x76\xb8\x06\x34\x4a\x69\xbb\x66\x6f\xad\xa4" - "\xb4\xf5\x3c\xcd\x5e\xd2\xf4\x56\x63\xfb\xf8\x8f\xad\xac\x56\xd7" - "\x9a\x18\xad\x7e\x1e\xb4\x7a\x15\xd1\xea\x8d\x09\xe6\x34\xc0\x99" - "\x6a\x26\xcd\x15\x26\x4d\x19\xa4\xa9\x64\xd3\x68\x2d\xf4\x7c\x09" - "\xd1\xf3\x2d\xbe\x7c\x3d\xdf\x78\x11\xeb\x79\x73\xbf\x39\xd6\x2a" - "\x96\x7d\xe7\x26\x1f\xa1\xbe\xf3\xa6\x1d\xd6\x7d\xe7\x2d\xbc\xbe" - "\xf3\xdb\x7d\xa5\xe8\x79\xb8\x67\xa9\x59\x33\xfe\x9a\x7a\xb1\x3b" - "\xe9\x79\x93\x45\xdf\xb9\x89\xd7\x77\xde\x14\x27\x4f\xcf\x37\xc5" - "\x5a\xea\xf9\x16\x79\x7d\xe7\xa5\xbf\xa6\xdf\xea\xd9\x7a\xbe\x29" - "\xca\xb2\xff\x1c\xeb\x79\xae\xff\xbc\x45\x63\xab\xe7\x5b\x26\x5b" - "\xe8\xf9\x12\x9d\x4b\xe3\x1e\xbe\x9e\xa7\x17\xdb\xea\xf9\x96\xcd" - "\xf2\xf4\x7c\xcb\x71\x79\x7a\xbe\xa5\xc8\x31\x3d\xdf\x3a\x48\x58" - "\xcf\x37\xc4\x8a\xeb\xf9\x06\x86\xaf\x26\x2d\xa7\xbb\xf0\x77\x47" - "\xd5\x6a\xac\xbb\xda\xce\x30\xba\x8b\xe8\x30\xd0\x5d\x6d\xb9\x3d" - "\x43\xcf\xb7\x8d\x16\xd6\x58\x6d\xe3\x39\x3d\xdf\xea\xdb\xf9\x7a" - "\xbe\xd5\x57\x58\xcf\xb7\x1d\x23\x7a\xa7\x75\xb0\xad\x9e\x87\x6b" - "\x04\xf5\x7c\xdb\x55\xf6\x1a\x5f\xbe\x9e\x27\x79\x5c\x72\x31\x70" - "\xdf\xff\x6d\x30\x35\xec\x25\xed\xb8\x61\x19\x69\xc7\x09\xc6\xb6" - "\x7a\xde\x30\xa9\x63\x3d\x4f\x38\xc5\x3c\xa7\xa8\x9e\x37\x64\xdb" - "\xea\xf9\x86\x58\xac\xe7\x85\x79\x65\x5a\xc5\xe7\x95\xc9\x87\xaf" - "\xe7\x0d\x3f\xf6\x1c\x3d\x2f\xca\xb5\xd1\x7c\x3d\x6f\x3c\x26\x5d" - "\xcf\x1b\xaf\x4a\xd3\xf3\x98\x7f\x42\x7a\xde\x34\xc6\x9a\x7f\x7c" - "\x3d\x6f\x9a\x2a\xac\xe7\x4d\x0b\xf9\x7a\x1e\xe7\x2f\xa4\xe7\x4d" - "\xb9\xbc\xfc\x6d\xf4\xbc\xe9\x08\x5f\xcf\x93\x74\x9c\x9e\xa7\xa3" - "\x49\x5d\xdb\xd0\x57\xba\x9e\xa7\x9f\xb4\xaf\xe7\xe9\xf1\x7c\x3d" - "\x4f\x7b\x13\xdd\x4e\x27\x10\x3d\x4f\x07\x90\xe3\x0d\x6e\x96\xc7" - "\x39\x3d\x4f\x8e\xdb\xea\x79\x7a\x63\x07\x7a\xde\xdd\x50\xe0\x97" - "\xd8\x3a\xdc\x2f\xb5\xcd\x3b\x62\x4f\x50\xcd\x33\xc6\xf6\xb5\xf4" - "\x63\xa0\xdd\xaf\x06\x1d\x30\x0f\x51\x78\x3e\x7a\xca\x39\x68\xdf" - "\xe7\x91\x71\xf0\xb8\x8d\xc7\xe3\x3d\x0e\xad\x2d\xee\x85\xd7\xfe" - "\x6b\xcd\x09\x8c\x31\xa8\x87\x68\x71\x5b\xdf\x52\xe0\x17\xd5\x9c" - "\x33\xae\xa8\x05\x8f\x81\x4f\x40\xd4\xdc\x3a\x61\x9d\xf6\x46\x35" - "\x6d\x02\xce\xbb\x45\xce\x22\x1a\xed\x6c\xfc\x65\x86\xc7\xb8\xfd" - "\xc7\xf3\x14\x2a\x1a\xaa\x18\x3d\xe0\x1e\x13\x8a\xf2\x52\x90\xb7" - "\x47\x1d\x52\x7a\xb8\xb8\xf4\xfe\xc3\x77\x08\x19\x41\x0b\x4c\x1c" - "\x49\x9b\x82\x62\x43\xf1\xfa\x33\xfd\x89\x1e\x28\xea\x65\x60\xf5" - "\xc0\xdb\xb7\x91\x3a\x7f\x35\xe8\x80\xb3\x9c\x0e\x68\x31\xeb\x34" - "\x0b\x0d\x30\xfb\xba\x12\xe5\x6f\xe0\x8f\x81\x6f\xcb\xe6\x34\x00" - "\x6e\xff\xe9\xb9\x01\x68\x54\x33\x19\xdb\xb0\x76\x2a\x19\x03\xaf" - "\xae\x41\xd4\xee\x39\xc8\xad\x2c\xe6\x12\x9e\x27\xee\x5b\x56\xb3" - "\x0f\xad\x99\x84\x86\x1a\x70\x9b\xbf\x81\x2e\x2c\xab\xc9\x45\x78" - "\x6d\x3d\xd0\x7e\x9a\xed\xb7\xd1\x58\xdc\xce\x4e\x9e\x47\xda\x7e" - "\xa6\x8d\xa5\x5c\x86\x9c\x0e\x38\x8d\x24\xeb\x36\xca\x85\x19\xff" - "\x2b\x3a\x07\xb5\xc0\x2f\xd5\x30\xdc\x2f\xca\x08\x58\x92\x35\x15" - "\x27\xe8\x4c\x7f\x9d\x5e\x7c\x18\x78\xf8\xe1\xa5\x5a\x17\xbc\x3e" - "\x34\xde\x2b\xd1\x74\x70\x88\x96\x87\x4d\x1b\x8b\x4d\x1b\xc1\x06" - "\xe3\x32\x27\x11\xe1\xb5\xf8\xfa\x63\x4c\x2a\x9a\xab\x90\xe9\x0d" - "\xf3\x7e\x89\x21\x68\x97\x89\xe0\x61\x6c\x8b\xef\x6b\x82\xd8\xe3" - "\x35\xa7\x80\x0f\x8c\x1e\xcb\xc0\x7b\x28\xa6\xb9\x78\x60\x3d\x06" - "\xfc\xee\xb7\xbb\x15\x70\xf8\x91\xe0\x40\x6f\x50\x32\x7f\x0d\x6f" - "\x04\xa8\x20\xef\x07\xda\xda\x00\x8b\x66\x6b\x2c\xfe\xb1\x1d\xef" - "\xb5\x88\xd7\x83\x33\x64\x93\x35\xef\x18\x2c\xde\x08\x18\x8c\xd7" - "\x8b\x60\xe6\x91\xb4\x05\xe0\xfa\x52\xb9\xeb\x0a\x9e\xff\x42\x30" - "\x30\xb2\xb1\xc7\xfb\x2e\xe2\x78\x63\xad\x55\x01\x1a\x8b\x99\xd7" - "\xf1\x16\xbd\xbd\x6d\x9f\x5f\x14\x1e\x77\x72\x83\xa2\x76\xc8\xd2" - "\x37\x14\x65\x7f\xfe\x6f\x97\xc4\x5e\xd5\xf3\x62\xbf\xc5\x25\x96" - "\x8b\xbd\xab\x8f\xbc\xd8\xbb\x8a\xae\xff\xdf\x75\xb1\x57\xf6\xc0" - "\xd8\x53\x3a\x2e\xf6\xbd\xb2\xe5\xc5\xbe\x97\xe8\xfe\x37\x38\xf6" - "\xb8\x3f\xc8\xdc\x17\x64\xee\x07\xc2\x6d\x1c\xe3\x41\x28\x8f\xf0" - "\xf6\x71\x89\xf0\x6f\xcb\x71\x89\xdf\x94\xe0\x3e\x12\x76\x5c\x22" - "\xd5\xdb\x7e\xff\x0f\xd5\x4f\xdb\xde\xff\x43\xb9\xdd\x64\x74\x23" - "\xe5\xf6\x1d\xa3\x1b\x29\x37\xe6\x9b\xd6\xba\x8b\x88\x32\x3c\x34" - "\x78\xcf\xe1\x25\xc5\x14\x9e\x93\x73\xf8\x46\x33\x95\x51\x0f\x3a" - "\x90\xba\x9f\xc6\xfd\x3e\x99\xcb\xf1\x78\xc4\x06\x04\x1a\xec\xfe" - "\x6b\x94\x9b\x07\x5e\x63\xeb\xb3\x1b\xc5\x4c\x7f\x0b\xfd\xc0\xf4" - "\xe2\x83\x7e\x7a\x17\xdc\xb6\x1d\x5e\xd2\x4c\x99\xf9\x62\x9e\x7b" - "\x07\x31\x4c\x35\xfa\x44\xec\xb9\xb5\xcf\x2f\xd1\x3c\x7e\xd0\x70" - "\x68\x88\x56\x90\x43\x78\x4e\x1f\xf0\x08\x73\x06\xcf\xc1\x33\xf3" - "\x09\xf3\xa8\xbc\xb9\x16\xe1\x3d\x64\x3c\x6b\xc1\xef\x03\x87\x66" - "\x1e\x00\x7c\x2d\x79\xa4\x15\xe1\xd1\x0e\x3e\x8f\x6e\xb1\x3c\x02" - "\x3e\x71\x3c\xe2\xe6\xe3\x0d\x96\xc4\xa3\x3a\x96\x47\xd9\x56\x3c" - "\xba\xae\x42\xdf\x54\x5f\x64\x79\xe4\x3a\xcb\xe0\x6f\xe6\x51\x9f" - "\x0b\xa7\x67\x01\x8f\x66\x49\xe5\x51\x9f\x2a\x9e\x67\xa5\x3c\x1a" - "\x6d\x3c\x2b\xe5\x36\xce\xda\xb3\x9a\x3d\xea\x2d\x9f\x09\x7b\x6e" - "\x81\x4f\x6d\x30\xfb\x54\xca\x6d\x9e\x3c\x3e\xbb\xc5\x38\x34\xc6" - "\x8b\x72\x3b\x65\x3d\xc6\xeb\x43\xec\x53\xa9\xde\xf1\x98\x6b\x82" - "\x3e\x95\x3d\x67\x33\x36\x87\xea\x37\xaf\x7d\x6c\x0e\xd5\x2f\xb8" - "\xdb\x8f\xf1\xa2\xfa\x56\x0a\xfa\x05\xaa\xef\x05\x66\x8c\x17\xe5" - "\x56\xdc\xe9\x63\xbc\x20\x4f\x41\x5f\x4a\xf5\x8b\x60\x74\x3b\xe5" - "\x56\x62\x33\xc6\x0b\x5f\x23\xe4\x4b\xa9\x7e\x69\xec\x35\xc5\x3c" - "\x5f\xca\xe6\x01\xf5\x49\xbe\xa8\x2f\xa5\xee\x79\x92\xd4\x2f\xf7" - "\xf4\x25\xf5\x0b\xc1\xd4\xc6\x97\x52\xfd\x7e\xb4\xf4\xa5\x82\x63" - "\xbc\x58\x0e\x31\xcf\x29\xe6\x4b\xa9\x7b\x46\xda\xf8\x52\xaa\x77" - "\xac\xe0\x18\x2f\xca\xc3\x85\xe3\x91\xfb\x5e\xde\x18\x2f\xea\x9e" - "\x65\x3d\x62\x8c\x97\x38\xb7\x2a\x79\x63\xbc\x28\xf7\xf1\x92\xc7" - "\x78\x51\xee\xab\x24\x79\x51\x86\x73\x02\x5e\x94\x72\x3f\x65\xcd" - "\x39\x9e\x17\xa5\xdc\x2f\x0a\x7a\x51\xca\xbd\x91\xe7\x45\x99\xfc" - "\x05\xbc\x28\xe5\x31\x8c\x97\xbf\xb5\x17\xa5\x3c\xc6\xf1\xbc\x28" - "\x9b\xae\xdd\x8b\x52\x1e\x3a\x52\x87\xf6\xf6\x90\xec\x45\x29\x0f" - "\xe6\xbb\xe6\xa1\x9d\xe4\xdb\x0d\xcf\x87\x52\x1e\x67\x78\x3e\x94" - "\xf2\x60\xd6\xfb\xd1\x51\x1e\x0d\xcc\xf8\x2e\xca\xa3\x90\x1c\xef" - "\xed\x6e\x79\xbc\xdd\x87\xb2\xc7\xf1\xf8\x2e\x66\x5c\xd7\x96\xfe" - "\xae\xd2\xfc\xe7\xa8\x6e\xe8\x3f\x43\xec\xf8\xcf\x90\x1e\xea\x3f" - "\x3d\xf3\xe5\xf9\x4f\x4f\xd1\xf5\x9f\xee\x7a\x20\x7b\x3a\xbc\xbf" - "\x2f\xa7\xc3\xbd\x06\xc9\xd3\x2d\x5e\xbe\xbf\x7e\xec\x7b\xa2\x07" - "\xf2\xac\xe1\x62\x3f\x20\x57\x5e\xec\x07\xe4\xc8\xf7\x40\x7e\x93" - "\x39\x0f\xe4\x37\x59\xdc\x03\xdd\xbb\xd0\xbe\x07\xfa\x5d\x0e\xe7" - "\x81\x7c\x1a\x89\x46\xf1\xb9\x40\x34\x8a\xcf\x0e\xe9\x1e\xc8\xc7" - "\xeb\xae\x07\x92\xe2\x81\xbc\x62\x38\x0f\xe4\x7d\x51\x9e\x07\xf2" - "\xae\xe6\x7b\x20\xbf\x16\x5b\x0f\xe4\x63\x33\xff\x5b\xdc\x03\xf9" - "\xc4\xc9\xe3\xb3\x4f\xac\x63\x1e\xc8\xe7\xb4\xb0\x07\xba\x37\x41" - "\xdc\x03\x91\x73\xb6\xda\xf5\x77\x71\x9c\x76\xfd\xdd\x23\xdd\xdf" - "\x03\x0d\x3c\x2f\xac\x53\x07\x5e\x24\x1e\xc8\xa7\xa4\xf3\x3d\x90" - "\x4f\x89\xb0\x07\xfa\xdd\x54\xa2\x17\x7d\x4a\x6d\x3d\x10\x5c\x23" - "\xe8\x81\x7e\xb7\x89\xbd\xa6\x84\xef\x81\x48\x1e\x50\x9f\xec\x15" - "\xf7\x40\xbe\xe3\x48\xfd\xe2\xeb\x41\xea\x17\x82\xa9\xad\x07\xfa" - "\xdd\xe5\x8e\x3d\x10\xe1\x10\xf3\x9c\xa2\x1e\xc8\x37\xd8\xd6\x03" - "\xdd\x1b\x2f\xec\x81\xfc\x7a\x71\x3c\x1a\xb4\x8f\xef\x81\x7c\x57" - "\xf5\x0c\x0f\x24\xca\xad\xf3\x7c\x0f\x34\x68\xa2\x74\x0f\x34\x68" - "\x8d\x34\x0f\x84\x39\x27\xe4\x81\x06\x9d\xb6\xe6\x1c\xdf\x03\x0d" - "\xfa\x51\xd8\x03\x0d\x6a\xe1\x7b\x20\x9c\xbf\x90\x07\xf2\xf3\xe7" - "\xe5\x6f\xe3\x81\xfc\xc6\xf3\x3d\x10\x49\xc7\x79\x20\x3f\xb2\x37" - "\x0a\x75\xaf\x97\x74\x0f\xe4\x77\x5a\xdc\x03\xf9\x9d\xe5\x7b\x20" - "\xbf\x3d\xc4\xeb\xf8\x35\x13\x0f\xe4\x77\x94\x1c\xbf\x57\x69\x79" - "\x9c\xf3\x40\xe4\x38\xe7\x81\xee\x73\x93\xe6\x81\xee\xef\x86\x1e" - "\x48\x65\xc7\x03\xa9\x7a\xa8\x07\x1a\xbc\x57\x9e\x07\x1a\xbc\xe7" - "\xae\x0e\x97\xa3\xc3\xef\x1b\xcc\xe9\xf0\xa1\x43\xe4\xe9\x96\xa1" - "\x76\xbf\x7f\xda\xd7\xe1\xfe\xe7\x39\x1d\xee\x7f\x5e\x5c\x87\x0f" - "\xbd\x69\x5f\x87\x3f\x38\x98\xd3\xe1\xc3\xd6\x91\x76\x72\xd8\x3c" - "\xd2\x4e\x0e\x1b\x26\x5d\x87\xab\x76\xdc\xd5\xe1\x52\x74\xf8\xe0" - "\x5a\x4e\x87\xab\xe2\xe4\xe9\x70\x55\x2c\x5f\x87\x3f\x94\x66\xab" - "\xc3\x55\x67\x1c\xd7\xe1\xaa\xeb\xf2\xf8\xac\xaa\x73\x4c\x87\x0f" - "\x8b\x10\xd6\xe1\x43\x1b\xc4\x75\x38\x39\x67\xab\x9f\x1e\xb8\xce" - "\xe9\xa7\x07\x8e\x77\x7f\x1d\xfe\xc0\x2c\x61\xad\xf4\x40\x1c\xd1" - "\xe1\xc3\x26\x77\xbe\x0e\x1f\x36\x59\x58\x87\x3f\x70\x81\x68\x96" - "\x61\x51\xb6\x3a\x1c\xae\x11\xd4\xe1\x0f\x7a\xb0\xd7\x4c\xe6\xeb" - "\x70\x92\x07\xd4\x27\x23\xc5\x75\xf8\x83\xa7\x49\xfd\xf2\x60\x2e" - "\xa9\x5f\x08\xa6\xb6\x3a\xfc\xc1\xc5\x1d\xeb\x70\xc2\x21\xe6\x39" - "\x45\x75\xf8\x83\xc7\x6c\x75\xf8\x50\xbd\xb0\x0e\xf7\xcf\xe4\x78" - "\xe4\x1f\xcc\xd7\xe1\x0f\x1a\x7b\x86\x0e\x17\xe5\xd6\x2c\xbe\x0e" - "\x1f\x7e\x56\xba\x0e\xf7\x77\x91\xa6\xc3\x31\xe7\x84\x74\xb8\x7f" - "\x84\x35\xe7\xf8\x3a\xdc\x7f\xa1\xb0\x0e\xf7\x4f\xe3\xeb\x70\x9c" - "\xbf\x90\x0e\xf7\x3f\xc4\xcb\xdf\x46\x87\xfb\x9f\xe1\xeb\x70\x92" - "\x8e\xd3\xe1\x0f\x25\x90\x3a\x74\xe8\x0e\xe9\x3a\xfc\xa1\x08\x71" - "\x1d\xfe\xd0\x4b\x7c\x1d\xfe\x50\x00\xd1\xdb\x0f\xa5\x12\x1d\xfe" - "\xd0\x58\x72\x7c\xe8\x76\xcb\xe3\x9c\x0e\x27\xc7\x39\x1d\xfe\x90" - "\x56\x9a\x0e\xf7\xec\x86\x3a\x5c\x69\x47\x87\x2b\x7b\xa8\x0e\x0f" - "\x18\x29\x4f\x87\x07\x04\xc8\xd7\x82\xa3\x74\x9c\x16\x1c\xa5\x13" - "\xd7\x82\x01\x46\xfb\x5a\x30\x98\x5b\x1f\x80\x0a\xda\x4c\xea\xea" - "\xa0\xc5\xa4\xae\x0e\x0a\x96\xae\x05\x03\xf7\xdd\xd5\x82\x52\xb4" - "\xe0\x43\x05\x9c\x16\x0c\x5c\x26\x4f\x0b\x06\x26\xf2\xb5\x60\x48" - "\xa6\xad\x16\x0c\xfc\xce\x71\x2d\x18\xd8\x22\x4f\x0b\x06\x36\x3b" - "\xa6\x05\x83\xa6\x0b\x6b\xc1\x91\x48\x5c\x0b\x92\x73\xb6\x6d\xb8" - "\xba\x85\x6b\xc3\xd5\xa7\xbb\xbf\x16\x54\xc7\x0b\xb7\xd7\xea\x65" - "\x44\x0b\x06\x45\x77\xbe\x16\x0c\x8a\x16\xd6\x82\x6a\x32\xff\x99" - "\x0a\x9a\x65\xab\x05\xe1\x1a\x41\x2d\x18\x3c\x88\xbd\x26\x9a\xaf" - "\x05\x49\x1e\x50\x9f\x88\xcf\x7f\xa6\x82\xc9\xfc\x67\x2a\x98\xcc" - "\x7f\x66\x31\xb5\xd5\x82\xc1\x6b\x3a\xd6\x82\x84\x43\xcc\x73\x8a" - "\x6a\xc1\x60\xdb\xf9\xcf\x54\x80\x41\x58\x0b\x8e\xda\xc1\xf1\x68" - "\xd4\x93\x7c\x2d\xf8\x70\xdf\x9e\xa1\x05\x45\xb9\x15\xcf\xd7\x82" - "\x0f\x5f\x90\xae\x05\x47\x79\x48\xd3\x82\x98\x73\x42\x5a\x70\xd4" - "\x74\x6b\xce\xf1\xb5\xe0\xa8\x55\xc2\x5a\x70\x54\x26\x5f\x0b\xe2" - "\xfc\x85\xb4\xe0\xa8\xe3\xbc\xfc\x6d\xb4\xe0\xa8\xef\xf8\x5a\x90" - "\xa4\xe3\xb4\x60\x48\x12\xa9\x43\x03\xf6\x49\xd7\x82\x21\xd3\xc5" - "\xb5\x60\xc8\x3c\xbe\x16\x0c\x19\x4d\x34\x5f\x48\x06\xd1\x82\x21" - "\xe1\xe4\x78\x40\x81\xe5\x71\x4e\x0b\x92\xe3\x9c\x16\x0c\xc9\xeb" - "\x48\x0b\xda\xd7\x0f\x1a\x0d\xa7\x1f\x34\x1a\x4b\xfd\x70\x86\xa7" - "\x1f\x1e\x19\x67\x5f\x3f\x8c\x49\xe5\xf4\xc3\x63\x3f\x92\xf2\xfd" - "\xd8\x69\x52\xbe\x1f\xdb\xc4\xe8\x87\x08\x68\xe7\x41\x3f\x1c\xba" - "\x56\x48\xf4\xc3\xb5\x66\xea\xed\x1b\xac\x7e\xa8\x43\x6e\x19\x4b" - "\x58\xfd\x30\x07\xeb\x87\x47\x8d\x58\x3f\xb8\xe7\x81\x56\xad\x61" - "\xb5\x6b\x22\x68\xd7\x1a\xf8\x3f\x94\x9d\xcf\x20\x8f\x72\xd0\x97" - "\x5a\x7c\x3d\xde\xcf\x00\xf2\x62\xe6\x65\x32\x73\x36\x75\xbd\xf0" - "\x3e\x39\x58\x5b\xe0\x7d\x27\x3a\xdc\x73\xa2\x86\xdd\x73\x22\x96" - "\xbf\xe7\x04\xde\x6b\x02\xef\x3b\x91\xb7\x1c\x79\xbf\xc7\x6a\x8a" - "\xfe\x69\x2e\xfd\xf1\xbe\x13\xfd\x1b\x88\x3e\x3d\x64\x2a\x25\xfa" - "\x74\x85\x6f\x3f\xd0\x42\xea\x5d\xf5\x9c\x96\x78\x17\xeb\x88\x15" - "\x01\xaa\x86\x15\x01\x43\x6f\xdd\x0a\x78\xc0\x76\xbf\x89\xe3\xb1" - "\x78\xbd\x7c\xbc\x47\x9f\x81\xd5\xa7\xf4\xab\x01\x68\xf7\x02\xe4" - "\x06\xba\xd8\xe5\x61\xd0\xa7\x23\x06\xc3\xb3\x9f\x45\x4a\xe3\xad" - "\x80\xc1\x96\x6b\x1b\xc2\xb3\x2b\x4d\xb7\x02\x50\x59\xcc\xf7\xcc" - "\x1c\x4d\x03\x3b\x47\x53\xbf\x22\x00\xaf\xc1\xaf\xd9\xb9\xdc\x42" - "\x9f\xfa\x98\xf5\xe9\xa3\x67\xe4\xe9\xd3\x47\x4b\xf9\xba\x42\x73" - "\xd9\x56\x57\x3c\x16\xec\xb8\xae\x78\x6c\xaa\x3c\x5d\xf1\x58\x94" - "\x63\xba\xe2\xb1\x23\xd6\xba\xe2\x00\xa3\x2b\x1e\x09\xc5\x1c\x14" - "\xd6\x15\xe4\x9c\x6d\x7b\x30\x66\x2a\xd7\x1e\x8c\x19\xd2\xfd\x75" - "\xc5\xe8\x62\xe1\xba\x7f\xf4\x19\xa2\x2b\x1e\x2b\xec\x7c\x5d\xf1" - "\x58\xa1\xb0\xae\x18\x43\xd6\x7f\xa3\x1e\x3b\x6a\xab\x2b\xe0\x1a" - "\x41\x5d\x31\x66\x19\x7b\x4d\x21\x5f\x57\x90\x3c\xa0\x9e\xc9\x14" - "\xd7\x15\x8f\x8f\x24\xf5\xce\x98\x16\x52\xef\x10\x4c\x6d\x75\xc5" - "\x98\x73\x1d\xeb\x0a\xc2\x21\xe6\x39\x45\x75\xc5\xe3\x83\x6c\x75" - "\xc5\x23\x63\x85\x75\xc5\x13\x37\x39\x1e\x3d\x91\xcd\xd7\x15\x8f" - "\xcf\xeb\x19\xba\x42\x94\x5b\xc5\x7c\x5d\xf1\xc4\x23\xd2\x75\xc5" - "\x13\x71\xd2\x74\x05\xe6\x9c\x90\xae\x78\xe2\x88\x35\xe7\xf8\xba" - "\xe2\x89\xb3\xc2\xba\xe2\x89\xcb\x7c\x5d\x81\xf3\x17\xd2\x15\x1a" - "\x2f\x5e\xfe\x36\xba\x42\x13\xcc\xd7\x15\x24\x1d\xa7\x2b\x34\x95" - "\xac\x37\xbb\x2c\x5d\x57\x68\x8e\x88\xeb\x0a\xcd\x71\xbe\xae\xd0" - "\x64\x10\xfd\xa0\xa9\x21\xba\x42\xb3\x87\xd5\x1b\x35\x96\xc7\x39" - "\x5d\x41\x8e\x73\xba\x42\xd3\x70\x77\xbe\x65\x77\xec\x63\xfa\x7d" - "\xa6\xbc\x36\xfc\xf7\x19\xbf\xfe\xb7\xde\x1e\x38\xdf\x72\xcb\x93" - "\x6e\xdc\xb7\xde\xb1\x7d\xe5\xe9\x96\xb1\x6e\xbf\x7e\xec\x7b\xe2" - "\x58\xe3\xdf\x9f\xe7\x62\x3f\x6e\x93\xbc\xd8\x8f\xdb\xf8\xeb\xc7" - "\xbe\x27\x8e\x71\x18\x1b\xc5\xc5\xfe\x19\x17\x79\xb1\x7f\x06\xc9" - "\xef\xd7\x7e\xce\x62\x8c\xc3\x73\xe7\xc5\x7d\xe9\x33\xdf\xd9\xf7" - "\xa5\x61\x16\x63\x1c\x26\xb0\x63\x1c\x26\xb0\x63\x1c\x26\x30\x63" - "\x1c\x52\xb0\x2f\xfd\x6b\x74\xe1\x47\xcb\x8b\x28\xbc\xee\xd6\xa1" - "\xe5\xcd\x14\x60\xe2\x6a\xc0\xbe\x14\x62\x9d\xc9\xec\xff\x50\xc2" - "\xf6\x6b\x8f\xdf\x51\x5e\x6b\xb1\xf7\x03\x15\xea\xcf\xad\x5d\x5b" - "\x82\xf0\xb9\xcf\xea\x8b\x28\x6d\xab\x55\x9f\x37\xe4\xa9\x5a\xc2" - "\xef\xf3\xc6\x7d\xdd\x2d\x16\xfb\x38\x18\x73\x23\xf6\x74\xd4\xe7" - "\x6d\xdd\xdf\x9d\xdf\x8a\xbc\x7b\x6e\x9f\xf7\xb8\x32\xae\xcf\x7b" - "\xbc\xcc\xf1\x0f\xe3\xad\xc6\x3f\x3c\x2f\x30\xfe\x61\xbc\x84\xf1" - "\x0f\xe3\x65\x8e\x7f\x18\xef\xe0\xf8\x87\x09\x36\xe3\x1f\x88\x37" - "\x7d\xa6\x2a\x45\xd4\x9b\x92\x73\xb6\x9e\xe2\x59\x8b\xf1\x0f\xcf" - "\xf6\x80\xf1\x0f\xcf\x8a\x7c\xa3\x7e\x96\x1d\xff\x30\xe1\x0e\x8c" - "\x7f\x98\x20\x32\xfe\xe1\x59\x76\xfc\xc3\x04\x81\xf1\x0f\x13\x44" - "\xc6\x3f\x84\xb1\xe3\x1f\x26\x58\x8d\x7f\x98\xc0\x8e\x7f\x08\xb3" - "\x33\xfe\x21\x8c\x1d\xff\x10\xc6\x8e\x7f\x20\x98\xda\x7a\xd3\x30" - "\x07\xc6\x3f\x4c\x60\xc7\x3f\x4c\xb0\x33\xfe\x21\x4c\x60\xfc\xc3" - "\x33\xe7\x85\xbd\xe9\x73\x16\xe3\x1f\x9e\xb3\x1a\xff\x10\xd6\x43" - "\xc6\x3f\x88\x72\xcb\x6a\xfc\xc3\x44\x19\xe3\x1f\x9e\x93\x38\xfe" - "\x61\x82\xc8\xf8\x87\xe7\x22\xac\x39\xc7\xf7\xa6\xcf\x89\x8c\x7f" - "\x78\xce\x6a\xfc\xc3\x04\x91\xf1\x0f\xcf\x1d\xe2\xe5\x6f\xe3\x4d" - "\x9f\xb3\x1a\xff\x30\xc1\x6a\xfc\xc3\xf3\xec\xf8\x87\x67\xd6\x49" - "\xf7\xa6\xcf\xdb\x19\xff\xf0\xbc\xd5\xf8\x87\xe7\xd9\xf1\x0f\xcf" - "\xb3\xe3\x1f\x9e\x67\xc7\x3f\x3c\x93\x6c\x79\x9c\xf3\xa6\xe4\x38" - "\xe7\x4d\x9f\x97\x38\xfe\xe1\xee\x5c\xcc\xae\xf1\xa6\x93\x64\x8e" - "\x7f\x98\x64\x77\xfc\xc3\x5d\x7f\x24\xa6\xd1\x9f\x2f\xe0\x34\xfa" - "\x1f\xf6\xc9\xd3\x2d\x7f\x28\xf8\xf5\x63\xdf\x13\xfd\xd1\xa4\x44" - "\x2e\xf6\x93\x87\xc9\x8b\xfd\x64\x95\x7c\x7f\xf4\x62\x03\xe7\x8f" - "\x5e\x6c\x10\xf7\x47\x93\x1b\xed\xfb\xa3\xa9\x63\x39\x7f\x14\x99" - "\x4f\x34\x4a\x64\x1a\xd1\x28\x91\xe3\xa5\xfb\xa3\x29\xc7\xf9\xfe" - "\x28\x62\xe2\x5d\x7f\x24\xd7\x1f\xfd\xa1\x8e\xf3\x47\x53\x36\xc9" - "\xf3\x47\x53\x36\xf2\xfd\xd1\xb4\xbd\xb6\xfe\x68\xca\x55\xc7\xfd" - "\x51\xa4\x87\x3c\xae\x47\xba\x3b\xe6\x8f\x22\x17\x0b\xfb\xa3\xc9" - "\xcd\xe2\xfe\x88\x9c\xb3\xd5\xb5\x53\x3d\x38\x5d\x1b\x75\xa1\xfb" - "\xfb\xa3\xa8\x64\x61\x0d\x1b\xb5\x89\xf8\xa3\xc8\x84\xce\xf7\x47" - "\x91\x09\xc2\xfe\x28\xaa\x85\x68\xc9\xc8\x44\x5b\x7f\x04\xd7\x08" - "\xfa\xa3\xa9\xc1\xec\x35\x09\x7c\x7f\x44\xf2\x80\xba\x66\x92\xb8" - "\x3f\x9a\x7a\x99\xd4\x3d\x53\x8f\x91\xba\x87\x60\x6a\xeb\x8f\xa6" - "\x66\x76\xec\x8f\x08\x87\x98\xe7\x14\xf5\x47\x53\xbf\xb3\xf5\x47" - "\x93\x1b\x84\xfd\xd1\x8b\x87\x38\x1e\xbd\x18\xc1\xf7\x47\x2f\x0c" - "\xe9\x19\xfe\x48\x94\x5b\xc9\x7c\x7f\xf4\xc2\x75\xe9\xfe\xe8\xc5" - "\x61\xd2\xfc\x11\xe6\x9c\x90\x3f\x7a\x71\xb1\x35\xe7\xf8\xfe\xe8" - "\xc5\xcd\xc2\xfe\xe8\xc5\xbd\x7c\x7f\x84\xf3\x17\xf2\x47\x2f\x9e" - "\xe5\xe5\x6f\xe3\x8f\x5e\xbc\xca\xf7\x47\x24\x1d\xe7\x8f\xa6\x65" - "\x90\x3a\x74\x72\xbe\x74\x7f\x34\x6d\xb1\xb8\x3f\x9a\xb6\x8a\xef" - "\x8f\xa6\x85\x13\x1f\x34\x6d\x0f\xf1\x47\xd3\x66\x91\xe3\x93\xf3" - "\x2c\x8f\x73\xfe\x88\x1c\xe7\xfc\xd1\xb4\xc2\xbb\xf3\x34\xbb\xa3" - "\x3f\x7a\x79\x92\x3c\x7f\xf4\x72\xf8\x5d\x8d\x2e\x47\xa3\x4f\x2b" - "\xe1\x34\xfa\x9f\x4e\xcb\xd3\x2d\x7f\x2a\x91\xaf\xd1\xe7\x6e\xe7" - "\x34\xfa\xdc\xed\xe2\x1a\x3d\x7a\x87\x7d\x8d\x3e\x4b\xc7\x69\xf4" - "\x99\xe3\x49\x3b\x39\x93\xec\xdb\x49\xcd\xb8\x2c\x5d\xa3\xcf\x98" - "\xcd\xd7\xe8\xd1\x57\xef\x6a\x74\xb9\x1a\xfd\x65\x2d\xa7\xd1\x67" - "\x8c\x94\xa7\xd1\x67\x04\xf0\x35\x7a\xcc\x44\x5b\x8d\x3e\x23\xd3" - "\x71\x8d\x3e\xe3\x88\x3c\xae\xcf\x28\x74\x4c\xa3\xcf\xf4\x12\xd6" - "\xe8\xd1\x79\xe2\x1a\x9d\x9c\xb3\xd5\x56\xb3\x8e\x70\xda\x6a\xd6" - "\xba\xee\xaf\xd1\x67\xa9\x84\x75\xd4\xac\x91\x44\xa3\xcf\x54\x76" - "\xbe\x46\x9f\xa9\x14\xd6\xe8\xb3\xc8\xfe\xbf\xd4\x4c\x6f\x5b\x8d" - "\x0e\xd7\x08\x6a\xf4\x59\xe7\xd8\x6b\x94\x7c\x8d\x4e\xf2\x80\xba" - "\xe6\xba\xb8\x46\x9f\xcd\xce\x0b\x9a\x3d\x9d\xd4\x3d\x04\x53\x5b" - "\x8d\x3e\xfb\x91\x8e\x35\x3a\xe1\x10\xf3\x9c\xa2\x1a\x7d\xf6\x1a" - "\x5b\x8d\x1e\xbd\x5d\x58\xa3\xcf\xb5\x18\xa7\x39\xe7\x26\x5f\xa3" - "\xcf\x3e\xd5\x33\x34\xba\x28\xb7\x54\x7c\x8d\x3e\x27\x5b\xba\x46" - "\x9f\x73\x5a\x9a\x46\xc7\x9c\x13\xd2\xe8\x73\xbd\xac\x39\xc7\xd7" - "\xe8\x73\x83\x85\x35\xfa\xdc\x89\x7c\x8d\x8e\xf3\x17\xd2\xe8\x73" - "\x97\xf1\xf2\xb7\xd1\xe8\x73\x33\xf9\x1a\x9d\xa4\xe3\x34\x7a\x4c" - "\x08\xdb\xa6\x8d\x97\xae\xd1\x63\xbc\xc4\x35\x7a\xcc\x20\xbe\x46" - "\x9f\x5b\x47\xb4\x78\x4c\x18\xd1\xe8\x31\x88\x1c\x8f\x0e\xb5\x3c" - "\xce\x69\x74\x72\x9c\xd3\xe8\x31\xd3\xee\xce\xe1\xec\x8e\x1a\x7d" - "\xde\x75\x79\x1a\x7d\x5e\x9d\x7c\x9d\xb8\xb0\x98\xd3\x89\x0b\x8b" - "\xc5\x75\xe2\xfc\x53\xf6\x75\xe2\xab\x6e\x9c\x4e\x8c\x5b\x48\xea" - "\xea\xb8\x08\x52\x57\xc7\x79\x48\xd7\x89\xb1\x9b\xf8\x3a\xf1\x15" - "\xaf\xbb\x3a\x51\xae\x4e\x8c\x89\xe7\x74\x62\xec\x54\x79\x3a\x31" - "\x36\x8a\xaf\x13\x17\xd9\xee\x95\x45\xc5\x1e\x73\x5c\x27\xc6\x5e" - "\x90\xa7\x13\x63\xab\x1c\xd3\x89\x71\x4f\x0a\xeb\xc4\xf9\x25\xe2" - "\x3a\x91\x9c\xb3\x6d\xdf\x17\x5c\xe0\xda\xf7\x05\xfb\xba\xbf\x4e" - "\x5c\x10\x2e\xdc\x96\x2f\x98\x4a\x74\x62\x9c\xa6\xf3\x75\x62\x9c" - "\x46\x58\x27\x2e\x60\xd7\x3f\x8b\x1b\x6b\xab\x13\xe1\x1a\x41\x9d" - "\xb8\x80\xed\xff\x8d\xd3\xf0\x75\x22\xc9\x03\xea\x1a\x1f\x71\x9d" - "\xf8\xea\x11\x52\xf7\xbc\xca\x7e\x47\x22\x98\xda\xea\xc4\x57\xa7" - "\x77\xac\x13\x09\x87\x98\xe7\x14\xd5\x89\xaf\xee\xb5\xd5\x89\xf3" - "\x8b\x85\x75\xe2\xc2\x35\x1c\x8f\x16\x0e\xe2\xeb\xc4\x57\xaf\xf6" - "\x0c\x9d\x28\xca\xad\x70\xbe\x4e\x8c\x3f\x2e\x5d\x27\xc6\x5f\x97" - "\xa6\x13\x31\xe7\x84\x74\xe2\xc2\x27\xad\x39\xc7\xd7\x89\x0b\x5f" - "\x12\xd6\x89\x0b\x17\xf3\x75\x22\xce\x5f\x48\x27\x2e\xdc\xc1\xcb" - "\xdf\x46\x27\x2e\x3c\xc6\xd7\x89\x24\x1d\xa7\x13\x17\x91\x3d\xb0" - "\xa8\xf9\x0b\xa5\xeb\xc4\x45\x4f\x8a\xeb\xc4\x45\xfc\xfd\xaf\xa8" - "\x45\x64\xff\x2b\x6a\x51\x02\xd1\x89\x8b\xc8\xfe\x57\xd4\xfc\x78" - "\xcb\xe3\x9c\x4e\x24\xc7\x39\x9d\xb8\x28\xd9\xb9\xf9\x9d\xcb\x47" - "\x73\xda\x62\xf9\x68\x71\x6d\xf1\xda\x10\xfb\xda\x62\x69\x32\xa7" - "\x2d\x16\x5f\x24\xe5\x7b\xf1\x29\x52\xbe\x17\x33\xe3\x93\xd6\x9d" - "\x05\x6d\xf1\x40\x74\xe1\xe1\x1b\x85\x8c\xb6\xf8\x68\x49\x33\x05" - "\x7a\xcf\xd5\x84\xb5\x05\xe8\xba\x8c\xd5\x58\x5b\xd4\xb0\xf3\x3b" - "\x13\x5a\xce\x26\x59\x6a\x8b\xd7\x96\x31\x73\x3d\xb1\xbe\x68\x68" - "\x66\xd2\xe1\xf3\x42\x73\x3f\x4f\x2e\x61\xe7\x7e\x42\xde\x96\x73" - "\x3e\x99\x79\xa0\x37\x40\x7b\xcc\x07\x3c\x2c\xb4\xc7\xdd\xb9\x9f" - "\xb8\xad\x4f\x38\x2d\x4f\xd7\x26\x94\xf0\x35\xc7\xf2\x1f\x6d\x35" - "\xc7\xe2\x91\x8e\x6b\x8e\xc5\x11\xf2\x34\xc7\xe2\xc9\x8e\x69\x8e" - "\xc5\x87\x84\x35\xc7\x6b\x2a\xcc\x4f\x61\xcd\x41\xce\xd9\xb6\x15" - "\x4b\x23\xb8\xb6\x62\xe9\xa0\xee\xaf\x39\x96\x9c\x10\x6e\x17\x96" - "\x9c\x26\x9a\x63\xf1\xc1\xce\xd7\x1c\x8b\x0f\x0a\x6b\x8e\xa5\x6c" - "\xfd\xbf\xb8\xd0\x56\x73\xc0\x35\x82\x9a\x63\x29\xfb\xfd\x6f\xf1" - "\x41\xbe\xe6\x20\x79\x40\x1d\xb4\x59\x5c\x73\x24\xfa\x93\x3a\x69" - "\x69\x23\xa9\x93\x08\xa6\xb6\x9a\x63\xe9\xd9\x8e\x35\x07\xe1\x10" - "\xf3\x9c\xa2\x9a\x23\xd1\xc7\x56\x73\xbc\x36\x58\x58\x73\x2c\xb3" - "\x18\xa7\xbd\x2c\x93\xaf\x39\x12\x67\xf7\x0c\xcd\x21\xca\xad\x13" - "\x7c\xcd\xb1\x2c\x58\xba\xe6\x58\x36\x4f\x9a\xe6\xc0\x9c\x13\xd2" - "\x1c\xcb\x0e\x59\x73\x8e\xaf\x39\x96\x9d\x11\xd6\x1c\xcb\x7e\xe4" - "\x6b\x0e\x9c\xbf\x90\xe6\x58\xee\xc1\xcb\xdf\x46\x73\x2c\x1f\xc9" - "\xd7\x1c\x24\x1d\xa7\x39\x96\x97\xb1\xbe\xed\xb4\x74\xcd\xb1\xfc" - "\x90\xb8\xe6\x58\x7e\x8c\xaf\x39\x96\xa7\x13\x6d\xb1\x5c\x47\x34" - "\xc7\xf2\x3c\x56\x8b\x94\x58\x1e\xe7\x34\x07\x39\xce\x69\x8e\xe5" - "\x7a\x09\x7d\x53\x05\x52\xe6\x7e\x1e\xba\xcd\xef\x9b\x32\xf7\x4b" - "\x19\xd4\x43\x72\xda\xfb\xa6\xa0\xad\x17\xdb\x13\x1d\xf7\x4d\xe1" - "\xb6\x9b\xeb\x9b\xba\xc8\xd4\x55\x5c\xdf\x94\x8e\xe9\x9b\xc2\xfd" - "\x52\xe0\xd9\xdb\xfb\xa5\x4c\xaf\xdb\xce\xfb\x3c\x64\x92\xde\x2f" - "\x35\x67\x99\x12\xed\x62\xda\xef\x93\xd5\xa4\x5f\xaa\xaa\xbd\x5f" - "\x0a\xb7\xdb\xc6\x26\xdb\x7e\x29\xdc\x5e\x73\xfd\x52\xdf\xcb\xec" - "\x97\x5a\xb9\x49\x5e\xfb\xbd\xb2\x1b\xcc\x7f\xeb\x89\xf3\x3e\x57" - "\xb8\x72\xdf\x8e\x57\xcb\x9c\xff\xb6\xda\xee\xfc\xb7\xbb\xe3\x9a" - "\xc5\x62\xbf\xb2\x8c\x8b\xfd\xeb\xeb\xe4\xc5\xfe\xf5\xe4\x5f\x3f" - "\xf6\x3d\x71\xcc\xc4\xea\x70\x2e\xf6\x49\x32\xd7\x7f\x4b\x6a\x96" - "\xdf\x17\x9e\xaa\xe7\xfc\x6a\xaa\xde\xd2\xaf\x96\x86\x59\xfa\xd5" - "\x35\x67\xed\xfb\xd5\x14\x0d\xe7\x57\x93\x77\x10\x6d\x98\xbc\x8e" - "\x68\xc3\x64\x66\x4f\xb2\x75\xe3\x11\xe3\x53\x0d\xd8\xb3\x2e\x6a" - "\xa6\x0e\x5f\x2b\xa6\x0c\x1b\x88\x57\xad\x30\x94\xa1\xb3\xfa\x66" - "\xf4\xf6\x6a\xe4\xba\xf9\x06\x72\xfd\x5b\x7d\x33\xe5\x99\x80\xdc" - "\xa0\x9d\x00\x2d\x55\x06\xda\x22\x1f\x25\xa6\x60\x1f\xfb\xc6\xb1" - "\x8a\x44\xbd\x85\x8f\x5d\x3b\x86\xf3\xb0\x90\x2e\xb1\x19\x7d\xbe" - "\xa8\x98\xc2\x5e\xb5\x2d\x37\x62\x4f\x5b\xf0\x10\x2d\xb3\x66\x91" - "\x65\x7f\x39\xdc\x5b\x35\x87\xdf\x5f\xde\x9a\x1b\x51\xd0\x72\x68" - "\x48\x0e\xb3\x1e\xa2\x3f\xd7\x6f\xee\x68\x7f\xf9\x7b\xad\xc8\xdb" - "\xbc\x1e\x22\x6e\x17\x7b\x5e\x7f\xf9\xeb\x25\x5c\x7f\xf9\x1b\x69" - "\xf2\xfa\xcb\xdf\x48\xe5\x7b\xd7\xb4\x7c\x5b\xef\xfa\xc6\x65\xc7" - "\xbd\x6b\xb2\xcc\xf9\xff\xc9\x6e\x8e\x79\xd7\xe4\x85\xd6\xde\x75" - "\x7f\x0a\xf6\xae\x6b\x2a\x31\x57\x85\xbd\x2b\x39\x67\xeb\x39\x52" - "\xfa\x72\x9e\x63\xdd\x77\xdd\xdf\xbb\xae\x4b\x12\xf6\x17\xeb\xd2" - "\x88\x77\x4d\x8e\xef\x7c\xef\x9a\x1c\x2f\xec\x5d\xd7\x35\x12\x9d" - "\x9f\x1c\x6f\xf6\xa1\x9c\x77\x85\x6b\x04\xbd\x6b\xca\x48\xeb\x6b" - "\x88\x77\x4d\x4e\x20\xde\x35\x65\xa2\xb8\x77\x4d\x61\xd7\x4b\x4b" - "\x39\x42\xea\x27\x82\xa9\xad\x77\x4d\xd9\xdc\xb1\x77\x25\x1c\x62" - "\x9e\x53\xd4\xbb\xa6\x9c\xb3\xf5\xae\x6b\xca\x84\xbd\x6b\xea\x01" - "\x8e\x47\xa9\x93\xf8\xde\x75\xfd\xa0\x9e\xe1\x5d\x45\xb9\x95\xc4" - "\xf7\xae\xeb\xaf\x4a\xf7\xae\xa9\x43\xa4\x79\x57\xcc\x39\x21\xef" - "\x9a\xba\x90\xe5\x4f\x82\xb0\x77\x4d\xdd\x24\xec\x5d\x53\xf3\xf9" - "\xde\x15\xe7\x2f\xe4\x5d\x53\xcf\xf0\xf2\xb7\xf1\xae\xa9\x97\xf9" - "\xde\x95\xa4\xe3\xbc\x6b\x5a\x3a\xa9\x43\xd7\xac\x92\xee\x5d\xd3" - "\x16\x8a\x7b\xd7\xb4\x65\x7c\xef\x9a\x16\x46\x3c\x6a\x5a\x1e\xf1" - "\xae\x69\xd1\xe4\xf8\x9a\x95\x96\xc7\x39\xef\x4a\x8e\x73\xde\x35" - "\xed\xa0\x04\xef\xba\xbf\x93\xbc\xeb\xf6\x9e\xe5\x5d\x3f\xcf\xeb" - "\x5a\xef\xfa\xe6\x78\x79\xde\xf5\xcd\x50\x07\x35\x7c\x41\x07\x1a" - "\x3e\xe7\xff\x2f\x0d\x9f\x56\xcc\x69\xf8\x8d\x27\xe5\x69\x96\x8d" - "\x27\x7e\xed\xd8\xf7\xbc\xb8\xbf\x99\xce\xc5\xfd\xad\x31\xf2\xe2" - "\xfe\xd6\xe8\xbb\xbe\x55\x4e\xec\x37\x59\xf4\xd7\xfc\x59\xe6\xf8" - "\xe7\x3f\x17\xca\xf7\xad\x5b\xcb\x38\xdf\xba\xb5\xcc\xd2\xb7\x7e" - "\xc5\xfb\xce\x9a\xbe\xc9\xbe\x6f\xcd\xf4\xe6\x7c\xeb\xdb\xab\x88" - "\x2e\x7c\x9b\x1d\x6f\xfb\x36\xa3\xb7\x92\x8f\x11\xdf\x7a\x1b\xfb" - "\xd6\x2b\xe0\x5b\x17\xc4\x50\x06\x76\x0d\x7e\x3c\x2e\xeb\x2c\x78" - "\x4f\xec\x55\x2b\x92\xe0\xdf\x2b\xf5\xe8\xed\xe5\xc8\x75\x0b\x78" - "\xce\x03\xd0\x7e\x1d\x58\xad\xa7\xd2\x17\x41\xdd\x5f\x75\x08\x79" - "\xc6\x83\x9f\xad\xc7\x7e\xb6\x04\xbc\xea\x26\xd6\xcf\x6e\xc9\xae" - "\x58\x69\xe9\x67\x37\xf7\x62\xfc\xac\x9e\x8c\xf9\xaa\x58\x09\x7e" - "\x16\xee\x87\xd7\xf4\xb7\xf4\xb3\x2d\xe0\x57\x5b\xc1\xaf\x6a\xaf" - "\x59\x79\xdb\x05\xb6\xde\xb6\xc5\x27\x62\x7f\x73\xf0\x90\xed\xd8" - "\xdb\xde\xde\xf7\xff\xa3\xb7\x7d\x2b\x99\xf3\xb6\x5b\x66\xcb\xf3" - "\xb6\x5b\x66\xf1\xbd\xad\x76\x8d\xad\xb7\xdd\x72\xca\x71\x6f\xbb" - "\xe5\xb2\xbc\x32\xb3\xa5\xc6\x31\x6f\xfb\xf6\x44\x6b\x6f\xfb\x01" - "\xf3\x5d\x36\x3d\x1d\xf3\x59\xd8\xdb\x92\x73\xb6\x9e\x24\xe3\x32" - "\xe7\x49\x32\x8e\x74\x7f\x6f\x9b\x31\x4d\xd8\x7f\x64\xcc\x26\xde" - "\xf6\xed\xb0\xce\xf7\xb6\x6f\x87\x09\x7b\xdb\x0c\x76\xfc\xff\xdb" - "\x61\xb6\xde\x16\xae\x11\xf4\xb6\x99\xbd\xac\xaf\x21\xde\xf6\xed" - "\x70\xe2\x6d\x33\x87\x89\x7b\xdb\xcc\x93\xa4\x0e\xcb\xcc\x24\x75" - "\x18\xc1\xd4\xd6\xdb\x66\xc6\x75\xec\x6d\x09\x87\x98\xe7\x14\xf5" - "\xb6\x99\x87\x6c\xbd\x6d\xfa\x46\x61\x6f\xbb\x75\x13\xc7\xa3\xad" - "\xfe\x7c\x6f\x9b\xd9\xd8\x33\xbc\xad\x28\xb7\xa6\xf1\xbd\x6d\xd6" - "\x69\xe9\xde\x36\xab\x45\x9a\xb7\xc5\x9c\x13\xf2\xb6\x5b\x27\xb2" - "\xfc\x09\x17\xf6\xb6\x5b\xe7\x09\x7b\xdb\xad\x6b\xf8\xde\x16\xe7" - "\x2f\xe4\x6d\xb7\xee\xe3\xe5\x6f\xe3\x6d\xb7\x9e\xe2\x7b\x5b\x92" - "\x8e\xf3\xb6\xda\x58\x52\x87\xa6\x07\x4b\xf7\xb6\xda\x89\xe2\xde" - "\x56\x1b\xc1\xf7\xb6\x5a\x15\xf1\xb0\xda\x24\xe2\x6d\xb5\xa3\xc9" - "\xf1\x74\xb5\xe5\x71\xce\xdb\x92\xe3\x9c\xb7\xd5\xa6\x4b\xfb\x2e" - "\xeb\xd4\xba\x47\x39\x5d\x3f\x67\xa0\xb3\xd6\x3d\x32\x7f\x9b\xed" - "\xaa\x39\x03\xef\x0c\x93\xe7\x6f\xdf\x51\xdd\xf5\x58\x52\x75\xbe" - "\x36\x8f\xd3\xf9\xef\xee\x90\xa7\x59\xde\xdd\x7e\xd7\x63\xc9\x89" - "\xfd\x3b\xf1\x5c\xec\x73\x7d\xe4\xc5\x3e\xd7\x5b\xbe\xc7\xca\x77" - "\xe7\x3c\x56\xbe\xbb\xf8\xb7\xc1\xdc\xab\xf6\x3d\xd6\xce\x69\x9c" - "\xc7\xda\x7e\x8c\xe8\x93\xed\x3b\x88\x3e\xd9\x3e\xbd\xf3\xbe\x0d" - "\xfe\xe5\x1c\xff\xdb\xe0\xb6\xa9\x77\xbf\x0d\x76\x86\x7f\x7a\x57" - "\xc7\xf9\xa7\xbf\xe4\xcb\xf3\x4f\x7f\xc9\xe3\xfb\xa7\xfc\xe3\xb6" - "\xfe\x69\xbb\x8b\xe3\xfe\x69\xbb\xbf\xbc\xf2\xb0\x7d\xb8\x63\xfe" - "\x69\xfb\x26\xe1\x6f\x83\xb9\x75\xe2\xdf\x06\xc9\x39\x5b\xdd\xbb" - "\xd3\x9f\xd3\xbd\x3b\x6e\x76\x7f\xff\xb4\x23\x47\x58\xe3\xee\xc8" - "\x27\xfe\x69\xfb\xc6\xce\xf7\x4f\xdb\x37\x0a\xfb\xa7\x9d\xec\xfc" - "\xd7\xed\x1b\x6d\xfd\x13\x5c\x23\xe8\x9f\x76\x4e\xb4\xbe\x86\xf8" - "\xa7\xed\xe9\xc4\x3f\xed\x9c\x27\xee\x9f\x76\x1a\x49\xfd\xb4\xf3" - "\x2c\xa9\x9f\x08\xa6\xb6\xfe\x69\xe7\xbe\x8e\xfd\x13\xe1\x10\xf3" - "\x9c\xa2\xfe\x69\xe7\x75\x5b\xff\x94\x5b\x2b\xec\x9f\xf2\x4e\x73" - "\x3c\xca\x8b\xe3\xfb\xa7\xf7\xc6\xf4\x0c\xff\x24\xca\xad\x1c\xbe" - "\x7f\xca\xeb\x25\xdd\x3f\xe5\x3d\x29\xcd\x3f\x61\xce\x09\xf9\xa7" - "\xbc\x4d\x2c\x7f\xd2\x85\xfd\x53\xde\x5e\x61\xff\x94\x77\x9c\xef" - "\x9f\x70\xfe\x42\xfe\x29\xef\x32\x2f\x7f\x1b\xff\x94\xef\xc2\xf7" - "\x4f\x24\x1d\xe7\x9f\xf2\x0b\x48\x1d\x9a\x9b\x2d\xdd\x3f\xe5\x6f" - "\x12\xf7\x4f\xf9\x99\x7c\xff\x94\x1f\x43\x7c\x52\x7e\x11\xf1\x4f" - "\xf9\x2b\xc9\xf1\x5c\xad\xe5\x71\xce\x3f\x91\xe3\x9c\x7f\xca\x2f" - "\x95\xe6\x9f\x1c\x5f\x17\xe9\xd7\x1f\xd7\xaa\xea\xa1\xe3\x5a\x77" - "\xcf\x96\xe7\x9d\x76\xcf\xba\xab\xe1\xe5\x68\xf8\xfc\x6a\x4e\xc3" - "\xef\x91\x39\xff\x77\x4f\x95\x7c\x0d\xbf\xbf\x92\xd3\xf0\xfb\x2b" - "\xc5\x35\xfc\xde\x43\xf6\x35\xfc\x07\xbe\x9c\x86\x2f\x58\x43\xda" - "\xc8\x82\xd9\xa4\x8d\x2c\x18\xd2\x79\x1a\xfe\xfd\x5c\xbe\x86\xff" - "\xab\xcf\x5d\x0d\xdf\x19\x1a\x7e\xb7\xc5\x7e\xc7\xef\xcf\x93\xa7" - "\xe1\xdf\x8f\xe1\x6b\xf8\x03\xeb\x6c\x35\xfc\xfb\xa7\x1d\xd7\xf0" - "\xef\x5f\x95\x57\x1e\xde\xaf\x75\x4c\xc3\x17\x4c\x12\xd6\xf0\x7b" - "\x0b\xc5\x35\x3c\x39\x67\xab\xbd\xf6\x5d\xe5\xb4\xd7\xbe\x63\xdd" - "\x5f\xc3\xef\x8b\x16\xd6\x59\xfb\xe6\x11\x0d\x5f\x10\xde\xf9\x1a" - "\xbe\x20\x5c\x58\xc3\xef\xfb\x8e\xe8\x9d\x82\x70\x5b\x0d\x0f\xd7" - "\x08\x6a\xf8\x0f\xfa\x5a\x5f\x43\x34\x7c\xc1\x64\xa2\xe1\x3f\xf0" - "\x17\xd7\xf0\x1f\x9c\x22\xf5\xd3\x07\xd9\xa4\x7e\x22\x98\xda\x6a" - "\xf8\x0f\x16\x76\xac\xe1\x09\x87\x98\xe7\x14\xd5\xf0\x1f\x1c\xb1" - "\xd5\xf0\x7b\x0f\x0a\x6b\xf8\xfd\x9b\x39\x1e\xed\x1f\xc9\xd7\xf0" - "\x1f\xb4\xf4\x0c\x0d\x2f\xca\xad\x68\xbe\x86\xff\x3f\x67\xa4\x6b" - "\xf8\xff\x63\x94\xa6\xe1\x31\xe7\x84\x34\xfc\xfe\x49\x2c\x7f\x26" - "\x0b\x6b\xf8\xfd\x71\xc2\x1a\x7e\xff\x3a\xbe\x86\xc7\xf9\x0b\x69" - "\xf8\xfd\x07\x78\xf9\xdb\x68\xf8\xfd\xa7\xf9\x1a\x9e\xa4\xe3\x34" - "\xfc\x81\x78\x52\x87\xee\x7d\x49\xba\x86\x3f\x30\x49\x5c\xc3\x1f" - "\x98\xca\xd7\xf0\x07\x86\x13\xad\x7e\x20\x99\x68\xf8\x03\x1a\x72" - "\x7c\xef\x34\xcb\xe3\x9c\x86\x27\xc7\x39\x0d\x7f\x20\xe3\xee\xba" - "\x49\xdd\x71\xdd\xa4\x0f\xfd\xe5\xe9\xf8\x0f\x87\xcb\xd7\x92\x1f" - "\x37\x73\x5a\xf2\xe3\x66\x4b\x2d\xc9\x5f\xdb\xe0\xc3\x16\xfb\x5a" - "\xb2\x30\x94\xd3\x92\x87\xf7\x92\xba\xfa\xf0\x26\x52\x57\x1f\x66" - "\xbe\xef\x49\x5b\x37\xe9\xd0\x49\xfe\xba\x49\x07\x27\xdd\x5d\x37" - "\x49\xae\x4e\x3c\xb0\x87\xd3\x89\x87\x36\xcb\xd3\x89\x87\xd2\xf9" - "\x3a\xf1\x93\x7d\xb6\x3a\xf1\xd0\x75\xc7\x75\xe2\x61\x2f\x79\x3a" - "\xf1\xb0\xd2\x31\x9d\x78\x78\x99\xf0\x1a\x06\x1f\x1a\xc4\xd7\x4d" - "\x22\xe7\x6c\xdb\xf7\x42\x2f\xae\x7d\xff\xe8\x62\xf7\xd7\x89\x1f" - "\xa5\x0a\xb7\xe5\x1f\x6d\x26\x3a\xf1\x70\x62\xe7\xeb\xc4\xc3\x89" - "\xc2\x3a\xf1\x23\x23\x69\x53\x0f\xaf\xb4\x5d\xc3\x00\xae\x11\xd4" - "\x89\x85\x8f\xb0\xd7\x24\xf2\x75\x22\xc9\x03\xea\x9a\x08\x71\x9d" - "\x58\x78\x95\xd4\x3d\x85\xc7\x49\xdd\x43\x30\xb5\xd5\x89\x85\xd9" - "\x1d\xeb\x44\xc2\x21\xe6\x39\x45\x75\x62\xe1\x05\x5b\x9d\xf8\x61" - "\xb3\xb0\x4e\xfc\xd8\x62\x9d\xd6\x8f\xa7\xf2\x75\xe2\x91\x61\x3d" - "\x43\x27\x8a\x72\x2b\x95\xaf\x13\x8f\xdc\x94\xae\x13\x3f\xf6\x97" - "\xa6\x13\x31\xe7\x84\x74\xe2\xc7\xcb\xac\x39\xc7\xd7\x89\x1f\x67" - "\x0a\xeb\xc4\x8f\xf7\xf1\x75\x22\xce\x5f\x48\x27\x7e\x7c\x8e\x97" - "\xbf\x8d\x4e\xfc\xf8\x3a\x5f\x27\x92\x74\x9c\x4e\xfc\x44\x4b\xea" - "\xd0\x0f\xf7\x4a\xd7\x89\x9f\x2c\x13\xd7\x89\x9f\xac\xe1\xeb\xc4" - "\x4f\x26\x13\x3d\xf8\x49\x01\xd1\x89\x9f\xc4\x90\xe3\x1f\xee\xb1" - "\x3c\xce\xe9\x44\x72\x9c\xd3\x89\x9f\x1c\x95\x36\x0f\xa4\x53\xfa" - "\x7a\xbb\x68\x1e\x48\x67\xf5\xf5\x76\xf5\x3c\x90\x63\x32\xd7\xbf" - "\x3f\xe6\xe8\xfa\xf7\x77\xc7\xc9\xb4\xf7\xf3\x7e\x52\xca\xf5\xf3" - "\xfe\xcf\x29\x79\x7a\xe5\x7f\x8a\xe5\x6b\xf3\xcf\x2c\xf6\xef\xfd" - "\x8c\xb7\x7f\x2f\x7f\x3c\xfc\xdf\x73\xed\x6b\xf3\x13\x16\xfb\xf7" - "\x7e\xca\xee\xdf\xfb\x29\xbb\x7f\xef\xa7\xc3\xe4\x8c\x87\xdf\x52" - "\x8f\x5c\xdf\xb6\x1e\x0f\x7f\xfe\x24\x19\x0f\xbf\xdc\x7a\x3c\xfc" - "\xf1\x1d\xfc\xf1\xf0\x45\x3e\x62\xe3\xe1\x71\xbf\x6f\xdb\xa1\x21" - "\x39\x78\x2c\xbc\xe0\x38\xf8\x19\x9d\x3b\x0e\x1e\x73\xf3\xbd\xb5" - "\x44\xdb\xef\xec\x91\xda\xfe\x98\xc5\xda\xf9\xc7\x65\xee\xff\x7b" - "\xdc\x6a\xff\xdf\xcf\x05\xf6\xff\x3d\x2e\x61\xff\xdf\xe3\x32\xf7" - "\xff\x3d\xee\xe0\xfe\xbf\x9f\xda\xec\xff\x4b\xc6\xc1\xff\x7d\xbb" - "\xf8\x38\x78\x72\xce\x56\x93\xfd\xc3\x62\x5d\xa9\x7f\xf4\x80\xfd" - "\x7f\xff\x21\xb2\x47\xeb\x3f\xd8\xfd\x7f\x3f\xbd\x03\xfb\xff\x7e" - "\x2a\xb2\xff\xef\x3f\xd8\xfd\x7f\x3f\x6d\xdf\xcb\x97\xd3\xf6\x9f" - "\x8a\xec\xff\x7b\xc2\xc3\xfa\x1a\xa2\xed\x3f\x65\xf7\xff\x3d\x61" - "\x67\xff\xdf\x13\xec\xfe\xbf\x27\xd8\xfd\x7f\x09\xa6\xb6\xda\xfe" - "\x84\x03\xfb\xff\x7e\xca\xee\xff\xfb\xa9\x9d\xfd\x7f\x4f\x08\xec" - "\xff\xfb\xf7\x1c\x61\x6d\xff\x99\xc5\xfe\xbf\x9f\x59\xed\xff\x7b" - "\xa2\x87\xec\xff\x2b\xca\x2d\xab\xfd\x7f\x4f\xca\xd8\xff\xf7\x33" - "\x89\xfb\xff\x7e\x2a\xb2\xff\xef\x67\xec\xfe\xbf\x9f\x8a\xec\xff" - "\xfb\x99\xc8\xfe\xbf\x9f\x59\xed\xff\xfb\xa9\xc8\xfe\xbf\x9f\x1d" - "\xe2\xe5\x6f\xa3\xed\x3f\xb3\xda\xff\xf7\x53\xab\xfd\x7f\x3f\x67" - "\xf7\xff\xfd\xfb\x38\xe9\xda\xfe\x73\x3b\xfb\xff\x7e\x6e\xb5\xff" - "\xef\xe7\xec\xfe\xbf\x9f\xb3\xfb\xff\x7e\xce\xee\xff\xfb\xf7\xb1" - "\x96\xc7\x39\x6d\x4f\x8e\x73\xda\xfe\x73\x29\xfb\xff\x16\x48\xe9" - "\x03\xfe\xf5\xc7\x71\x28\x7b\xe8\x38\x8e\x53\x32\xfb\x7f\x4f\x39" - "\xd1\xff\x7b\xc6\x9b\xd3\x98\x67\xbc\xc5\xc7\x12\x9c\xea\xa0\xff" - "\xf7\xab\x59\x9c\xc6\x2c\x61\xe7\x2b\x95\xec\x25\xf5\x74\xc9\x3c" - "\x47\xc7\x12\x6c\xb9\xcd\xea\x4a\xf3\x58\x82\xd5\xec\x58\x02\xd0" - "\x96\x44\x4b\x7e\x79\x81\x3f\x96\xe0\x8b\x79\x62\x63\x09\x04\xc7" - "\x10\x58\xe9\x47\xb3\xd6\x94\x3b\x86\xa0\xe7\xeb\xc7\xcf\x2d\xc6" - "\x10\x7c\xb9\x4f\x9e\x7e\xfc\xb2\x80\xaf\x1f\xcf\x9c\xb2\xd5\x8f" - "\x25\x7d\x1d\xd7\x8f\x25\xc1\xf2\xf4\x63\x89\xda\x31\xfd\x58\x92" - "\x29\x3c\x86\xe0\x94\x41\x7c\x0c\x01\x39\x67\xdb\xee\x7f\x15\xcc" - "\xb5\xfb\xa7\x5b\xba\xbf\x7e\x3c\x9d\x27\xdc\xc6\x9f\xde\x47\xf4" - "\x63\x49\x46\xe7\xeb\xc7\x92\x0c\x61\xfd\xf8\xd5\x20\xd2\xd6\x96" - "\x64\xd8\xea\x47\xb8\x46\x50\x3f\x7e\x15\x61\x7d\x0d\xd1\x8f\x25" - "\x5a\xa2\x1f\xbf\x5a\x28\xae\x1f\xff\x6f\x2f\x52\x2f\x7d\xf5\x1d" - "\xa9\x97\x08\xa6\xb6\xfa\xf1\xab\x43\x1d\xeb\x47\xc2\x21\xe6\x39" - "\x45\xf5\xe3\x57\x8d\xb6\xfa\xf1\x94\x48\xdf\x70\xe9\x59\x8e\x47" - "\xa5\x8b\xf9\xfa\xf1\xff\x8e\xeb\x19\xfa\x51\x94\x5b\x79\x7c\xfd" - "\x58\xea\x21\x5d\x3f\x96\x8e\x97\xa6\x1f\x31\xe7\x84\xf4\x63\x69" - "\x26\xcb\x1f\xad\xb0\x7e\x2c\x3d\x20\xac\x1f\x4b\x4f\xf1\xf5\x23" - "\xce\x5f\x48\x3f\x96\x5e\xe7\xe5\x6f\xa3\x1f\xcf\xf4\xe5\xeb\x47" - "\x92\x8e\xd3\x8f\x67\x0e\x92\x3a\xf4\x94\x8c\xbe\xe1\x33\x99\xe2" - "\xfa\xf1\x4c\x2e\x5f\x3f\x9e\x61\xd7\xce\x3f\x53\x4c\xf4\xe3\x99" - "\x64\x72\xfc\xd4\x1e\xcb\xe3\x9c\x7e\x3c\x65\xd5\x37\x7c\xa6\xd2" - "\x9e\x7e\xa4\xb5\xf5\xe9\x5a\xca\x54\x08\x3f\xdc\x96\x0e\x82\x76" - "\xac\x18\xfe\x5d\x0a\xed\x91\x12\xfe\x5d\x29\xa6\x57\xf4\x5e\xf5" - "\xe9\x26\xd0\x1e\x26\xb8\x4f\x85\xfe\x97\xe2\x62\x3f\x03\xdc\xfb" - "\x6b\xb2\x67\x0b\xe4\xe9\x69\xe8\x13\x6e\xa2\xe3\xa1\x0d\x87\x7f" - "\x27\xc1\x31\x48\xdf\x1f\xda\x3d\xd5\x6a\xd4\xff\x06\xf5\x75\xa2" - "\x39\x1d\x3c\x73\xff\x4b\xd4\xd7\xc1\x38\x8f\xa6\x2d\x5f\x27\xc3" - "\xfb\x54\x8b\x3e\x2b\xe4\x15\x79\x60\x28\x5a\x67\xa0\x7f\x2a\x5e" - "\x52\x8f\x6a\xa8\xaf\x4f\x7b\xd6\xf5\x09\x87\x7a\x08\x61\xbd\x57" - "\xe8\xa7\x77\xc5\x79\x16\x2f\x69\xc5\xe7\xf6\xe3\x73\x46\x78\xc6" - "\x94\xc5\x88\xca\xaa\xef\xe3\x06\xba\xaa\xd7\xfa\x06\xba\x76\xa9" - "\x01\x9e\x39\xc9\x80\x3e\x1f\x5a\xe5\xfa\xd1\xce\x2a\xa6\xed\x29" - "\x6f\x30\x32\x79\xa8\x96\x30\xcf\x73\x66\x17\xa4\x17\x7a\x86\x4d" - "\x87\x91\xba\xd7\x48\x5a\x27\xad\xbd\xfb\x66\xb0\x58\x1c\x3d\xd3" - "\x86\xa2\xe2\x40\x88\x9d\x0a\x51\x42\xe7\x25\xde\xc7\xde\xfa\xb7" - "\x6e\xef\x0e\xa4\x1b\xd6\xef\x40\xd4\x56\x53\x1f\xb7\x2f\xa1\x4e" - "\xdc\xbd\x8d\xd6\x37\x6d\xf9\x46\xaf\x73\x39\x35\x0d\xc7\xfc\x4d" - "\x38\xbf\x75\x20\xad\xbf\xb5\x01\xf3\xa6\xcc\xed\x14\xb4\xed\xd6" - "\x58\x2c\x8f\x5d\x3c\x4f\xb5\x72\xe1\xe2\xb8\xa5\xab\x56\xaa\xfc" - "\x63\xfb\xa1\x69\x4b\x97\xaa\x16\xcf\x5b\xb2\x46\x65\x79\xe6\xf7" - "\xaa\xd8\x85\x2b\xe6\xcd\x4f\x88\x0b\x5e\xfc\x4a\x62\x3f\x78\x26" - "\x64\xf1\x1c\xde\xf8\x59\x4c\x5b\xca\xbc\x77\xbd\x83\xd0\xbb\x03" - "\x90\x2b\x7e\x2e\xb8\x5f\x92\xce\xd5\x3d\x0f\xdf\x2f\x6b\x1b\xdd" - "\x40\x41\x9a\xf5\x50\xa7\x6d\x4d\xe9\x03\x69\xbf\xd9\xb8\x1b\x9e" - "\x6b\x17\x3c\x37\x3c\x23\x3c\x73\x59\x81\xf9\x99\xcd\x9c\x58\x8f" - "\x39\x91\x52\x0f\x1c\x2c\x3b\xed\xd9\xdc\xe7\x79\x9a\x8e\xc6\xef" - "\xd7\x00\x65\xc5\xe5\x0a\x75\x76\x36\xe3\x01\xb2\xeb\xd3\xe1\x5a" - "\x9d\x99\x63\xa6\x9c\xa7\x54\xf4\x3b\xf5\x51\xa0\x1d\x5d\x9a\xe8" - "\xf8\xa7\x81\x9b\x70\xfd\xd9\xe0\x51\x08\xa5\xd2\x4d\xd1\xcc\xfe" - "\x03\x74\x13\x70\x98\xf0\x14\xce\x95\xa3\x5b\x14\x7a\xa6\x69\xcb" - "\xd9\xe1\x3a\xb4\xb8\x0e\xe7\xa1\x83\x63\x38\xe6\xa6\x3d\xd1\x7b" - "\x5e\x0a\x40\xa9\x23\x52\x51\x6a\x13\xbe\xa6\xc0\x2f\xc9\x73\x25" - "\x72\x89\x4c\xa2\x7f\x80\x7a\xc7\x85\x1e\x16\xbd\x87\xde\xe7\x97" - "\xa4\xa3\xce\xba\x99\x72\x9f\x52\xc1\xfb\xd4\x41\x3e\x09\x3a\xd4" - "\x56\x89\xf3\xd9\xba\x8d\x89\x7d\x1d\x7e\x77\x88\x0f\x78\x19\xba" - "\x98\xde\xc0\x96\x21\xad\x67\x95\x49\x3b\x07\x55\xb8\xde\x46\x91" - "\x06\xba\x8d\xce\xf6\xac\x2a\x6f\x68\x80\x3a\x2d\xf1\x15\xba\x5f" - "\x99\xbf\xa7\x61\x61\xdc\xee\x01\x50\x16\xb3\xe7\x20\x3a\x7b\x84" - "\xf7\x4b\x23\x91\x12\xf2\x2e\x35\xc7\x13\x62\xe9\x2a\x8d\x47\x67" - "\x99\x35\x5d\x30\x1f\xe0\x79\x58\x3e\x94\xfb\x9e\x5a\x69\xcb\x87" - "\xf6\xb2\xb9\x2d\x50\x6b\xa0\xa3\x9f\x6f\xcb\x09\x2c\xa5\xbd\x03" - "\x8f\xa6\x5c\x46\xbd\x71\x6c\xcb\x41\xef\x67\xad\x46\xbe\x99\x73" - "\x90\x6a\xee\x1a\x25\xd2\xe7\x06\x16\x7a\xa6\xa5\xba\x40\x4c\x28" - "\xa8\x5f\x42\xa0\xce\x0c\x69\x1b\xf8\x94\x2a\x39\x0e\x51\x87\x2e" - "\x15\x52\x58\x27\xe3\x71\x21\x10\xeb\x0b\xbb\xe0\x3a\xfa\x97\x68" - "\x84\xf1\x60\xb0\xf8\x25\x1e\x45\x80\x6a\xc0\xdf\x38\xae\x50\x15" - "\x1e\xf9\x90\xa7\xb4\xf7\x2a\x67\xf4\xaf\x11\xb0\x1a\x05\x38\x55" - "\xd4\x18\x99\x3c\x19\xac\x12\x38\xac\x4e\xc2\x73\x70\x78\x95\xe7" - "\x60\x5c\x85\xdf\x39\x48\x49\xde\x39\x28\x9c\xf6\x0e\x1a\x2d\xfe" - "\xce\x41\x21\xe4\x9d\x7b\xd5\xdb\x7f\xe7\x8a\xb3\xf6\xdf\xb9\xd2" - "\x45\xfa\x3b\x57\x6c\x97\xfe\xce\x15\xe9\x76\xde\x99\xc5\x39\x08" - "\x70\x0e\xb2\x83\x73\x10\x8b\xf3\x3d\x97\xec\xbf\x73\xe5\xa9\x0e" - "\xde\xb9\x51\xfa\x3b\x57\x66\x48\x7f\xe7\xca\x64\xf1\x77\x56\xb3" - "\x38\xab\x01\x67\xb5\x1d\x9c\xd5\x2c\xce\x5e\xdf\xda\x7f\xe7\x73" - "\xc7\xec\xbf\xf3\xb9\xab\xd2\xdf\xf9\x5c\xaa\xf4\x77\x3e\x97\x68" - "\xe7\x9d\x59\x9c\xd5\x80\xb3\xda\x0e\xce\x6a\x16\xe7\xc7\xb7\xd8" - "\x7f\xe7\x6f\x0f\xd8\x7f\xe7\x6f\x2f\x4a\x7f\xe7\x6f\x57\x4a\x7f" - "\xe7\x6f\x63\xc5\xdf\x39\x98\xc5\x39\x18\x70\x0e\xb6\x83\x73\x30" - "\x8b\xf3\xcc\x09\xf6\xdf\xf9\x7f\xf3\xed\xbf\xf3\xff\x9e\x93\xfe" - "\xce\xff\x1b\x2f\xfd\x9d\xff\x37\x5a\xec\x9d\x5b\xa1\xde\x76\x87" - "\x77\x69\xfb\x57\xf4\xf3\x46\xef\xc0\x13\xee\x35\x88\xca\xdb\x60" - "\x8a\xf7\xac\x45\x7d\xe1\xdd\xe2\xe9\x6d\xe3\xf4\xf8\xaf\xc9\x3b" - "\xb0\xa8\xd5\x3b\xb0\xb4\x65\x40\x7d\xd4\x1b\xb3\x51\x6f\xac\xc7" - "\x37\x9b\x90\xaf\x29\x27\xf0\x68\xc6\x0b\x48\xb5\x5e\x8f\x94\xe5" - "\x29\x3a\x94\x92\x48\xeb\xcb\xd1\x8f\xc8\xa3\x16\x7b\xcf\xef\x51" - "\x59\x5d\x29\x5a\xb2\x9c\xa6\xaf\x50\xdf\x0d\xc1\xdf\x80\x41\x27" - "\xa7\x6a\xff\x89\x54\x70\x8f\x90\x5d\xf0\xc3\xf9\x78\x4e\x86\xf6" - "\x73\xdb\xb8\xfa\xdd\x29\xc8\xf7\xb3\x45\xb5\x08\x1f\xcf\x87\x9f" - "\x71\xdb\x53\xaa\x94\xd9\x88\x3a\x5c\x5f\x45\x91\xb6\xf9\xfc\x55" - "\xeb\xb6\x79\xf2\x3c\x88\xe5\x7c\x7c\xee\xbb\x31\x79\x2f\x48\x8d" - "\xe5\xf9\xa3\xe6\xb6\x9b\x89\x65\xb5\x91\xb4\xf7\x56\x6d\xf7\x67" - "\x70\x7f\x2e\x96\xe7\x0b\x70\x2c\xe9\x9c\xc0\xca\x8a\xda\x56\xec" - "\x9b\x94\x57\x92\x10\x05\xc7\xa7\x95\x27\xd6\x23\xe1\x18\x07\x29" - "\xb9\x18\x07\x8d\x75\xaf\xe9\x55\x2f\x1c\xe3\x20\x4d\xab\x77\x50" - "\xb8\x6d\x8c\x83\x46\x3b\x16\xe3\x7f\xa6\x39\x1f\xe3\x7f\x46\x88" - "\xc7\xf8\x9f\x3b\xa4\xc7\xf8\x9f\xbe\xd2\x63\xfc\x4f\x37\x12\xe3" - "\xa0\x28\x7e\x8c\xbf\x2b\xb2\x13\x63\x0b\x1e\x07\x01\x8f\xef\xb9" - "\x24\x12\x63\xe0\x71\x90\x00\x8f\x83\x1c\xe4\xf1\xbf\x2e\x3b\x1f" - "\xe3\x7f\x1d\x11\x8f\xf1\xbf\x8c\xd2\x63\xfc\xaf\x64\xe9\x31\xfe" - "\x57\x02\x1b\x63\x2b\x1e\xff\x6b\xb0\x78\x8c\xd5\x16\x3c\x56\x03" - "\x8f\xbd\xbe\x15\x8e\xb1\x1a\x78\xac\x16\xe0\xb1\xda\x41\x1e\x5f" - "\x98\xe4\x7c\x8c\x2f\xf8\x88\xc7\xf8\xc2\x3c\xe9\x31\xae\xd2\x49" - "\x8f\x71\x55\x25\x89\xb1\xda\x8a\xc7\x55\xa9\x76\x62\x6c\xc1\x63" - "\x35\xf0\xf8\xf1\x2d\x22\x31\x06\x1e\xab\x05\x78\xac\x76\x90\xc7" - "\xdf\x1f\x72\x3e\xc6\xdf\xaf\x11\x8f\xf1\xf7\xa7\xa5\xc7\xf8\xfb" - "\x30\xe9\x31\xfe\x7e\x34\x1b\x63\x2b\x1e\x5f\xa8\x11\x8f\x71\xb0" - "\x05\x8f\x83\x81\xc7\x33\x27\x08\xc7\x38\x18\x78\x1c\x2c\xc0\xe3" - "\x60\x07\x79\x5c\xed\xe5\x7c\x8c\xff\x7d\x51\x3c\xc6\xd5\x23\xa5" - "\xc7\xf8\xdf\xfb\xa5\xc7\xf8\xdf\xdb\x49\x8c\x83\xad\x78\xfc\xef" - "\x70\xb1\x18\xb7\x81\x07\xf4\x80\x18\x7b\xd4\x21\x2a\x1f\xc7\xb6" - "\x8a\xc4\xd6\x38\x70\x9c\x3e\x9f\x32\xc5\xe3\x98\x30\x7d\x40\x3f" - "\xfb\xf6\x37\xe6\x04\x9e\xa0\x29\x78\xa7\x14\xdc\xef\x5a\x9d\x6d" - "\xd8\x80\xfa\xab\x52\x70\xff\xef\x7f\x98\xf1\x01\xaa\x94\xb7\x2e" - "\xc2\xfd\x14\xb8\xdf\xcb\x90\x7d\x33\xc4\x08\x25\xfb\x0a\x75\xf1" - "\x0c\xed\x3f\x58\x0b\x7e\xb3\x92\x7e\xcd\xd7\xbb\xa2\xae\x10\xe2" - "\xf3\x35\x2a\xaf\xfa\x14\x99\x06\x8e\xab\x1f\x65\x40\x01\xf4\xcf" - "\x01\xde\x65\x2b\x75\xc8\xf8\x8a\xaf\x7b\x45\x52\x29\xaa\x48\xfa" - "\x18\x45\xd6\xd2\xb7\xe9\xff\x06\xb8\xb7\xf9\x84\x69\x8c\x3e\xe3" - "\x2a\x8d\xb9\x11\x45\x06\x9f\xb0\x80\x43\xab\x75\x94\x7b\x33\x0a" - "\x48\xa8\xa1\xe9\xac\xf9\xc8\x35\xeb\x12\x72\xdb\x3a\x1f\xb9\x6f" - "\xbd\x84\x94\x65\x35\x55\xe8\xec\xb5\x52\x74\xb6\xfe\x02\x3a\x7b" - "\x1b\x7e\xad\xf0\x33\xc1\x2f\xf5\x02\x60\x8d\x50\xc4\x75\x84\xf7" - "\x6e\xd4\x07\x55\x23\xef\x32\x43\x15\xc2\xf3\x5f\x6f\x50\x17\xe3" - "\xdc\x63\x90\x37\xfd\x5f\x5f\x44\xbf\xe2\x4b\xc1\x39\x57\x7c\xbc" - "\xc2\xa0\x47\x65\x35\xcd\xf8\x7c\x18\x9c\x77\x5d\x5f\x03\xf9\x9b" - "\x4a\xf1\xde\x8c\xfa\xb2\xd4\x33\xf0\x7e\x7b\x55\x34\xf6\xd0\x03" - "\x03\xb5\x5a\x08\xb5\x89\xf6\x7d\x80\xf0\xe0\x3f\xeb\x76\x99\xa4" - "\x62\x7d\x31\x87\x89\xf1\x6b\xbe\x03\x20\xce\x7e\xa6\xd7\xa2\x95" - "\x53\x2e\xfc\x40\x97\x37\x54\x31\x7d\x09\xe5\x0d\x5f\xa3\x8a\x8d" - "\x26\x14\xb9\x06\xa1\xc9\x46\x84\x70\x2c\x2a\x92\x6a\xd1\x94\x44" - "\xe4\x89\xfb\x9f\x4d\x3f\x07\x0c\xa8\xa8\xd1\xa3\x75\x06\x78\xc6" - "\x1b\xcd\xed\xcf\x58\xbe\xb1\x1c\xc1\x39\xbf\xf2\x78\x1d\x72\x4f" - "\x44\x4a\x1c\x5f\x43\x4e\x60\xd1\x14\x28\x3f\x4b\x1a\x68\x1a\xc7" - "\x16\xc7\x14\xc7\x17\xe7\x67\x8e\x79\x45\xac\x1e\xad\x6f\x46\xca" - "\x8a\x14\xf8\x9b\x44\xeb\x2b\xd0\x4d\x04\xcf\x98\x44\x7b\xed\x55" - "\x01\x2f\x1a\x30\x17\x74\x54\x75\x3a\xe0\x3f\x40\x98\x53\x41\xa3" - "\x09\xa7\x7a\xd5\x77\xcc\xa9\xa0\xb1\x1c\xa7\xfe\x73\x99\xe3\x94" - "\xee\x94\x38\xa7\x74\x43\x08\xa7\x82\xa2\xba\x27\xa7\x7e\x38\x6e" - "\x9f\x53\x3f\x6c\x17\xe7\x54\x50\x38\x3d\x30\x48\xc9\xe7\x94\xee" - "\x9c\x74\x4e\xfd\x50\xdb\x75\x9c\x0a\xd2\xc8\xe3\xd4\x0f\x65\x7c" - "\x4e\xfd\xa7\xda\x0e\xa7\xd8\x7a\xea\x9e\x4b\x0e\x70\xca\xa2\x9e" - "\xfa\xf1\x49\x8e\x53\xff\xf5\x11\xe7\xd4\xa5\x65\x2c\xa7\xba\x69" - "\x3d\x75\xc9\xc3\x3e\xa7\x7e\xac\xb3\xc3\x29\xa8\xa7\x82\xac\xea" - "\xa9\xff\xfa\x4b\xe7\xd4\xa5\xb1\x5d\xc8\x29\x99\xf5\xd4\x25\x15" - "\x9f\x53\x3f\x86\x88\x73\x4a\xcd\xd6\x53\x5e\xdf\x76\xcc\x29\xb5" - "\x45\x3d\xf5\xdf\x4c\x8e\x53\x97\x17\x8a\x73\xaa\xe6\x34\xe1\x94" - "\xba\x9b\xd6\x53\x35\xf3\xec\x73\xaa\x26\x54\x9c\x53\x6a\xa8\xa7" - "\xd4\x56\xf5\xd4\xe5\x35\xd2\x39\x55\xa3\xed\x3a\x4e\xa9\x65\xd6" - "\x53\x35\x2b\xf9\x9c\xfa\xef\x46\x3b\x9c\x62\xeb\xa9\xc7\xb7\x38" - "\xc0\x29\x8b\x7a\xea\xf2\x8f\x1c\xa7\x7e\x3a\x29\xce\xa9\x9f\x06" - "\xb1\x9c\xea\xa6\xf5\xd4\x95\x63\xf6\x39\x75\x25\xc7\x0e\xa7\xa0" - "\x9e\x52\x5b\xd5\x53\x3f\x9d\x95\xce\xa9\x2b\x35\x5d\xc8\x29\x99" - "\xf5\xd4\x95\x52\x3e\xa7\x2e\x57\x89\x73\x2a\x98\xad\xa7\x66\x4e" - "\xe8\x98\x53\xc1\x16\xf5\x54\xed\x18\x8e\x53\xd7\xbc\xc4\x39\x75" - "\x75\x31\xe1\x54\x70\x37\xad\xa7\xae\xf6\xb5\xcf\xa9\xda\x5a\x71" - "\x4e\x05\x43\x3d\x15\x6c\x55\x4f\x5d\x1b\x26\x9d\x53\x57\x35\x5d" - "\xc7\xa9\x60\x99\xf5\xd4\xd5\xc1\x7c\x4e\xd5\xaa\xc5\x38\xd5\x8a" - "\x7d\x9f\x0b\x70\x2a\x1e\x7c\x1f\x70\xc8\xb3\x92\x70\xaa\x0d\x38" - "\xf5\x9e\x25\xa7\xfe\x6d\xed\xfb\xae\x6d\x36\xb5\x73\xaa\x2e\xd7" - "\x9a\x53\x26\xe0\x54\x1b\xc3\xa9\x9f\x0f\x99\x7d\x5f\x45\xdd\x1e" - "\xc0\xea\x1a\xaa\x88\x02\x3e\x6d\x63\xf9\xf4\x6f\xe0\x13\xbc\x8f" - "\x09\xde\xb7\xac\xba\x0a\x45\xea\xc9\x7b\xb5\xc2\xfb\x9a\x2c\xb9" - "\xd4\x5a\x4b\x61\x0e\x61\xee\x98\x79\x74\x76\x09\xf0\x67\xf9\x39" - "\x74\x76\x35\xfc\xd6\xc2\x2f\x05\x7e\xe8\x1c\x2a\x03\xc5\x8b\xfb" - "\xec\x39\xfe\x54\xb2\xfc\xf9\x79\x92\x7d\xfe\xfc\x1c\x20\xcd\xe3" - "\xd5\xed\x93\xce\x9f\x9f\x93\xd8\xb1\x74\xca\xc8\xa9\x3f\xd0\x78" - "\x0c\x2c\xe1\xc8\x35\x14\x69\x40\x9e\xf4\xcc\x80\x01\xee\xd1\x48" - "\xf9\x86\x11\x51\x99\xf3\x91\x32\xf3\x7b\x78\x5f\x73\xd9\xb9\x84" - "\xdc\xbf\x6e\xfe\x14\x95\xd5\x57\xa1\xb2\xdb\x67\x50\x99\x09\x7e" - "\xd7\xe0\x07\xcf\x18\x19\x67\xf9\xbe\x7a\xf6\x7d\xeb\x9e\x84\xbc" - "\x86\x8b\xbf\x6f\x9d\x2f\xf3\xbe\xb1\xf0\xbe\xad\xdc\xfb\x56\x00" - "\x17\x01\x17\x3f\x13\xeb\x13\x23\xf5\xa8\xef\x52\x03\x4d\xb7\xb2" - "\x1c\xc4\xb8\x7c\x7d\xbe\x19\x45\x26\x02\x56\xaf\x00\x07\x6b\xf6" - "\xa3\xf5\xc9\xc0\xc1\xd6\x66\xfc\x5d\x5f\x5f\x91\xda\x02\x1c\xfc" - "\x79\x16\x0d\x71\x6b\xc3\x1c\xfc\x37\xe6\xe0\xb5\x54\x93\x28\x07" - "\xc1\x27\x32\x1c\x04\x9f\xd8\x21\x07\x2d\x7d\xe2\x75\x0f\x8e\x83" - "\xbf\x0c\x12\xe7\xe0\x8d\x47\xcc\x3e\xf1\xd7\xe7\xe0\xf5\xb3\xf6" - "\x39\x78\xfd\xa0\x34\x4f\xf8\xcb\x48\xe9\x1c\xbc\x6e\xe8\x3a\x0e" - "\xde\x38\x69\x9f\x83\x37\xf2\x3a\xe6\x60\x90\x46\x1e\x07\xaf\xeb" - "\xf8\x1c\xbc\xee\x6a\x87\x83\x6c\x3d\x08\xbe\xb2\x63\x0e\x5a\xd4" - "\x83\xbf\x64\x73\x1c\xbc\x99\x2f\xce\x41\xfd\x31\xb3\xaf\xfc\xf5" - "\x39\xa8\x9f\x6a\x9f\x83\xfa\x10\x69\x1e\xf2\xe6\x21\xe9\x1c\xd4" - "\xa7\x76\x1d\x07\x6f\x8e\xb7\xcf\xc1\x9b\x2a\x07\x38\x28\xb3\x1e" - "\xd4\xc7\xf2\x39\xf8\x4b\xba\x38\x07\xd5\x6c\x3d\x08\x3e\xb4\x43" - "\x0e\x5a\xfa\xd0\x7a\x1f\x8e\x83\x0d\xc3\xc4\x39\x78\xeb\x49\xb3" - "\x0f\xfd\xf5\x39\x58\xff\x9d\x7d\x0e\xd6\x1f\x95\xe6\x39\x1b\x1e" - "\x91\xce\xc1\x5b\xae\x5d\xc7\xc1\x5b\xa7\xed\x73\xf0\x56\x41\xc7" - "\x1c\x54\xcb\xac\x07\xeb\x6b\xf9\x1c\xac\x77\xb7\xc3\x41\xb6\x1e" - "\x04\xdf\xda\x31\x07\x2d\xea\xc1\x86\x1d\x1c\x07\x6f\xef\x13\xe7" - "\x60\xe3\x49\xb3\x6f\xfd\xf5\x39\xd8\x38\xdd\x3e\x07\x1b\x35\xd2" - "\x3c\xea\xed\x63\xd2\x39\xd8\x98\xde\x75\x1c\xbc\x3d\xc9\x3e\x07" - "\x6f\x07\x38\xc0\x41\x99\xf5\x60\x63\x02\x9f\x83\x0d\x5a\x71\x0e" - "\x06\xb3\xf5\x20\xf8\xdc\x0e\x39\x68\xe9\x73\x9b\x86\x70\x1c\x6c" - "\x19\x29\xce\xc1\xe6\xf1\x66\x9f\xfb\xeb\x73\xb0\xe9\xa2\x7d\x0e" - "\x36\x9d\x90\xe6\x69\x5b\x9e\x94\xce\xc1\x66\xf7\xae\xe3\x60\xf3" - "\x59\xfb\x1c\x6c\x3e\xd8\x31\x07\x83\x65\xd6\x83\x4d\x7a\x3e\x07" - "\x9b\xbc\xc5\x38\x68\x02\x5f\xdc\x56\x30\x58\x6b\xca\x09\xd3\x78" - "\xba\xa8\x90\xc1\x7b\x14\xaa\x58\xd9\x80\xa6\x34\x42\x7c\x12\x1b" - "\xd1\x9c\x46\x25\x32\xe6\x84\x05\x80\x2f\x2c\xb2\xf0\xcf\xcc\xd8" - "\x32\x83\x76\xaf\x6a\xeb\x12\xe4\x0a\xfe\x1b\xfb\x99\x90\x8a\x2b" - "\xcd\x08\xdf\x7f\x1d\x7e\x9e\x6b\xdc\xf3\xe0\x7e\x02\xfa\x97\x00" - "\x25\xf3\x8d\xb9\x55\x87\x6a\xc6\x22\x45\x59\x8d\x0e\xe2\xb0\x96" - "\xc1\x17\xc7\xe5\x0a\xd5\xea\xbe\xfb\x06\x72\x35\xfc\xd7\xd7\x0f" - "\xe2\xed\xed\xf1\x3a\x72\x19\x5c\x43\x9b\x70\x5c\x71\xbc\x70\x8c" - "\x55\x6b\xf1\xb7\xeb\xd6\xd9\xe5\xc0\x31\xc3\x7f\x03\xfc\x76\x41" - "\x3a\x61\xbf\xda\x1a\x27\x9d\x1b\xad\xec\x7c\xd8\x56\xd7\xb2\x6a" - "\x24\xf8\xed\xd8\x04\xfe\xcd\xb1\x58\x05\x69\x2c\x7c\xde\x1d\x88" - "\x55\x9b\xc6\xb1\x58\xb5\x6d\xe6\xc7\x4a\xc8\x57\xb5\x65\x4b\x8f" - "\x55\x1b\xbb\x4e\x64\x5b\x88\x9d\x58\x39\xc8\xab\xa0\x22\x0b\x3f" - "\x72\x07\x62\x65\x88\x75\x2c\x56\x86\x63\x56\xb1\x12\xd0\xff\x86" - "\x93\xd2\x63\x65\x48\x25\xb1\x32\xcc\x12\x8f\x95\xda\x41\x5e\xa9" - "\x35\x16\xba\xf9\x0e\xc4\xca\xa8\x75\x2c\x56\xc6\x1f\xf9\xb1\x12" - "\xd2\xa9\xc6\xab\xd2\x63\x65\x3c\x48\x62\x65\x4c\xb7\x13\x2b\x07" - "\x79\xa5\x2e\xb2\xd0\x77\x77\x20\x56\xa6\x13\x8e\xc5\x8a\xf6\xb0" - "\x8a\x95\x80\x9e\xa2\x7d\xa4\xc7\xca\x54\x45\x62\x65\x3a\x2a\x1e" - "\xab\x60\x07\x79\x15\xac\xb1\xd0\x21\x77\x20\x56\x74\xad\x43\xb1" - "\x52\xa0\x27\xf9\xb1\x12\x68\xf7\x15\x68\xbc\xe4\x58\x29\x90\x2b" - "\x89\x15\xad\x13\x8b\x95\x31\x27\xf0\xa8\x27\xc4\xa0\x65\x5b\xa0" - "\xd6\x33\x09\x51\xad\xc3\x21\x6e\xde\x10\xb7\x34\x15\x6a\xcb\x81" - "\xb8\xe9\x0d\x68\xca\xb2\x1f\xe8\xf2\x3a\x23\x6a\x85\x98\xb5\x78" - "\x07\x16\x55\xe8\x6b\xf1\x98\xa3\xa7\x2e\x29\xa8\x61\x33\x97\x29" - "\x11\x8e\x1b\x8e\x03\x8e\x1d\x0d\x71\x63\xe2\xe8\x1d\x51\x64\xf4" - "\x1e\x57\x19\x71\xfd\x07\x7a\xa9\x8e\xa6\xf1\xfb\xd2\xca\x9b\x21" - "\xf8\xbb\x40\x64\x2d\xea\xab\x7a\x01\xbf\x93\xcb\x39\x7c\xbc\x42" - "\x5f\x05\xfa\xa0\x1e\x31\xda\xec\x87\x00\x6f\xe3\x9f\x02\xdc\x8d" - "\x15\xd1\xcf\xd3\x03\xea\xa3\x0c\x03\x9f\x52\xad\xbf\x8e\x7a\x63" - "\xfd\x90\x65\x42\xbe\xeb\x16\x23\xea\xf0\xa2\x62\x8a\x99\xbb\xb6" - "\x9c\xc9\x23\x1f\xe2\xe2\x4b\xdf\xb2\x18\xd3\x7d\x2b\x1e\x55\x5c" - "\xd1\x32\xb8\x59\x6b\x04\x06\xb7\x7f\x05\x28\x41\x67\x86\xd0\xde" - "\x81\xa5\xda\x72\xa4\xa2\xdb\x20\xc6\x78\x3e\x91\x82\xda\xbc\xbb" - "\x55\x6a\x8c\x5d\x98\xf1\xdf\x26\x15\x3b\x7e\x0b\xe2\x84\xef\xcf" - "\x8c\xdf\x4a\xb4\x18\xbf\x05\xcf\xdc\x3e\x7e\x4b\xe1\xa2\xc6\xe3" - "\xb7\x4c\x3f\xf8\xfa\x99\xdf\x7d\x69\x02\x4d\xc3\xbb\x0f\x28\x6f" - "\xd0\x23\xfc\xfe\xe5\x0d\xc5\x68\xfd\x4a\xa4\x2c\x6f\xad\x45\x29" - "\x0d\xb4\xbe\x3c\xf5\x2a\x8a\x6c\xc4\x3a\x18\xf3\x85\x62\xfa\x42" - "\x01\xdf\x3a\xd3\x0f\x01\x7e\x3a\x05\xa5\x2c\xaf\x44\xc8\x62\x1e" - "\x4f\x3c\x68\x66\x37\xc0\x21\xbe\x22\xf5\x12\xa2\x07\x3e\x1d\x55" - "\x61\xf8\x1e\xe3\x14\x0f\xe7\xc7\xb6\xeb\xeb\x81\x4f\xbf\x80\x8f" - "\x61\xcc\xf0\xf7\x26\xbc\x3e\xc0\x6e\x0b\xfd\x8d\x79\xe1\x99\x94" - "\x8a\x2a\x92\x5a\x51\xb9\x01\x21\xb8\xdf\xf6\x6f\xa2\xab\x44\x78" - "\x14\x34\x9a\xf0\x28\x48\xe9\x99\xd4\xab\xbe\x63\x1e\x05\x69\x38" - "\x1e\xb9\x2e\x74\x8e\x47\xae\x83\x9c\xe7\x91\xe2\xb2\x7c\x1e\x05" - "\x85\xf3\x79\xe4\x7a\x4e\x3a\x8f\x14\x85\xd2\x79\xa4\x58\xe9\x1c" - "\x8f\x5c\xe7\x11\x1e\x29\x46\x13\x1e\xb9\x46\x73\x3c\x62\xe6\x46" - "\xdd\x21\x1e\x51\x3a\x3b\x3c\x62\xeb\xa3\x20\xa8\x8f\xee\xb9\xe4" - "\x00\x8f\x2c\xea\xa3\xde\x47\x9c\xe3\x51\xef\x79\xce\xf3\xa8\x77" - "\xb0\x13\x3c\xb2\xaa\x8f\xfa\x0c\x92\xce\xa3\x5e\xcd\xd2\x79\xd4" - "\xeb\x84\x73\x3c\xea\x7d\x80\xf0\xa8\x57\x32\xe1\x51\xef\x3d\x1c" - "\x8f\x98\xf9\x66\x77\x88\x47\xbd\x02\xc4\x79\xa4\x66\xeb\x23\x35" - "\xd4\x47\x5e\xdf\x76\xcc\x23\xb5\x45\x7d\xe4\xd6\xe2\x1c\x8f\xdc" - "\x0e\x38\xcf\x23\xb7\x55\xf2\x79\xa4\xb6\xaa\x8f\xfa\xce\x93\xce" - "\x23\xb7\x50\xe9\x3c\x72\x73\x75\x8e\x47\x6e\x37\x09\x8f\xfa\x94" - "\x10\x1e\xb9\xd5\x72\x3c\x62\xe6\xf0\xdd\x21\x1e\xf5\x49\xb4\xc3" - "\x23\xb6\x3e\x52\x43\x7d\xf4\xf8\x16\x07\x78\x64\x51\x1f\xdd\x33" - "\xde\x39\x1e\xf5\xbb\xe9\x3c\x8f\xfa\x9d\x74\x82\x47\x56\xf5\xd1" - "\x3d\x07\xa4\xf3\xa8\x5f\xba\x74\x1e\xf5\x9b\xec\x1c\x8f\xee\x79" - "\x92\xf0\xa8\x9f\x3b\xe1\xd1\x3d\x21\x1c\x8f\x98\x79\x91\x77\x88" - "\x47\x7d\x8b\xc4\x79\x14\xcc\xd6\x47\xc1\x50\x1f\xcd\x9c\xd0\x31" - "\x8f\x82\x2d\xea\x23\x8f\xcd\xce\xf1\xc8\xe3\x49\xe7\x79\xe4\xd1" - "\x4b\x3e\x8f\x82\xad\xea\x23\x8f\x9b\xd2\x79\xe4\x5e\x29\x9d\x47" - "\xee\x39\xce\xf1\xc8\x23\x8d\xf0\xc8\x7d\x1a\xe1\x91\x47\x12\xc7" - "\x23\x66\xae\xe9\x1d\xe2\x91\x3b\x12\xe3\x11\x5e\x8b\xe0\x5d\xb2" - "\x2e\x44\xc3\xd6\xb5\x48\xb3\x1b\xff\x6d\x45\x21\x4d\x59\xfd\x03" - "\x4e\x25\x93\xf5\x00\x74\x8a\xfe\x4c\x7f\xaf\xd0\xf5\xf7\x1c\x00" - "\x5c\xbc\x03\x0b\x23\x2f\x92\x35\x1a\xf0\xba\x20\xb7\xd6\xc7\xa3" - "\x51\x78\x5d\x06\x85\x67\x0c\x5e\xc7\xaa\x7d\xed\x00\x6f\x91\xb5" - "\x03\x66\x88\xaf\x1d\xd0\xba\xcd\x3c\xef\x76\x3f\x37\xef\x56\xe1" - "\x19\x6c\x77\xde\xad\xc2\xd3\x27\x7f\x86\x54\x3e\xf4\xd7\xe1\x77" - "\xbc\x35\x30\x50\xdb\x94\xe5\x39\x1c\xb0\x31\x90\x77\xf7\xdc\x83" - "\x1c\x9a\x8f\xbb\xdf\x82\x27\xfd\x2b\x5f\x9a\x85\x52\xe9\x2d\xe5" - "\xc3\x69\x9f\xc0\x42\x3a\x37\xb0\x58\xda\xb3\x40\xce\x76\xe3\x1d" - "\x14\x22\x1c\x6f\x65\x25\x89\x37\xbb\x6e\x81\xb7\xc8\xba\x05\x33" - "\xc4\xd7\x2d\x10\x8e\xb7\xd2\xfe\x3c\x67\x85\x72\x93\xf4\x78\x2b" - "\xa3\x48\xbc\x83\x94\x4d\x59\xca\x1c\x2e\xde\x5e\x4a\xe9\xf1\x56" - "\x86\x92\x78\x57\xf8\xd2\x3e\x41\x21\x74\x6e\x50\xa8\xc4\x67\xa9" - "\xee\x20\xde\x22\xfc\x1e\x10\xca\xc6\x9b\xe5\xb7\xc8\x9a\x09\x33" - "\xc4\xd7\x4c\x10\x8e\xf7\x00\x0f\xfb\xf1\xf6\x6a\x94\x1e\x6f\xaf" - "\x62\x36\xde\xc0\xef\x01\xae\x5c\xbc\x07\xa4\x4a\x8f\xb7\x57\x21" - "\x89\x77\xa5\x3b\xc4\x1b\xf8\x1d\x24\x91\xdf\x03\x26\xdb\x8f\xb7" - "\x5a\x84\xdf\xf7\x16\x92\x78\xb3\xeb\x35\x78\x8b\xac\xd7\x30\x43" - "\x7c\xbd\x06\xe1\x78\xdf\xbb\xce\x7e\xbc\xef\x8d\x93\x1e\xef\x7b" - "\x43\x48\xbc\xd5\xc0\xef\x7b\x57\x72\xf1\xbe\x57\x2f\x3d\xde\xf7" - "\xaa\x48\xbc\xcf\x21\xda\x47\x0d\xfc\x56\x4b\xe4\xf7\xbd\x27\x3a" - "\x88\xb7\x08\xbf\x7d\x54\x6c\xbc\x59\x7e\x8b\xac\x15\x31\x43\x7c" - "\xad\x08\xe1\x78\x7b\x5f\xb7\x1f\x6f\xef\xef\xa4\xc7\xdb\x7b\x0f" - "\x1b\x6f\xe0\xb7\x77\x0d\x17\x6f\x9f\x18\xe9\xf1\xf6\xd6\xb2\xf1" - "\x6e\x80\x78\x03\xbf\xd5\x12\xf9\xed\xa3\xb6\x1f\xef\x60\x11\x7e" - "\x0f\xd4\x92\x78\xb3\xeb\x54\x78\x8b\xac\x53\x31\x43\x7c\x9d\x0a" - "\xe1\x78\x0f\x9c\x6d\x3f\xde\x03\x27\x4a\x8f\xf7\x40\x25\x89\x77" - "\x30\xf0\x7b\xe0\x34\x2e\xde\x03\x2b\xa5\xc7\x7b\x20\x22\xf1\xfe" - "\xb6\x96\xf6\x09\x06\x7e\x07\x4b\xe4\xf7\xc0\x3c\xb1\x78\x7b\x42" - "\xbc\x4f\x83\x8e\x01\xdd\x51\x64\xca\x01\x9d\x62\xe4\xc7\xbd\x22" - "\x49\x83\x1e\xbe\x8d\x63\xef\x9b\x0c\x6d\x75\x51\x97\xad\x97\xa1" - "\xf0\x8d\x73\x7a\xee\xb0\xc2\xf7\x11\xd1\xb9\xc3\x0a\xdf\x41\x92" - "\xe7\x0e\x2b\x7e\x57\xc3\x69\x20\xdf\x00\x0e\x53\x5f\xa6\xfe\x90" - "\x34\xa7\x58\xf1\xbb\xf3\x82\xeb\x68\x28\x7e\xb7\x11\xcf\x29\xa6" - "\xb7\xfc\x6f\xb5\x29\x57\x8e\x36\xf2\x4d\xef\x18\xeb\x20\x8d\x29" - "\x07\x34\x92\x28\xd6\x7e\xf1\xd0\x6e\x69\xba\x6c\xdd\x0e\x85\xdf" - "\x54\xe7\xb1\xf6\x1b\x22\x8e\xb5\x5f\x2f\xe9\x58\x0f\xaa\xe4\xf4" - "\x97\x9f\x37\x87\xb5\x9f\xf4\xf9\xe3\x8a\x41\xc5\x82\xeb\x79\x28" - "\x06\x25\x12\xac\xbf\x0b\x35\xe5\xca\xd1\x65\x7e\x2b\x1d\xc0\x1a" - "\xca\x75\x90\x9d\x72\x3d\x78\x1a\x60\x5d\xd4\x65\xeb\x87\x28\x06" - "\x8f\x73\x1e\xeb\xc1\x7d\xc5\xb1\xbe\xef\xa6\x74\xac\xef\x3b\xc1" - "\x69\xbf\xc1\x88\xc3\x7a\x70\x8e\x74\xac\xef\x3b\x28\xb8\xae\x88" - "\xe2\xbe\x59\x04\xeb\x7f\x16\x00\xd6\x32\x34\xe1\xe0\x98\x8e\xb1" - "\x56\x43\xb9\x56\xdb\x29\xd7\x43\x43\xa1\xbd\xd6\x74\xd9\x3a\x26" - "\x8a\xa1\x23\x9d\xc7\x7a\x48\xa3\x38\xd6\x43\x2e\x4a\xc7\x7a\xc8" - "\x7e\x4e\x77\x0e\xa9\xe3\xb0\x1e\x9a\x2a\x1d\xeb\x21\xdb\x05\xd7" - "\x37\x51\x0c\x09\x27\x58\x57\xb9\x99\x72\xe5\xe8\xd1\xa1\xa2\xfa" - "\xdf\x02\x6b\x28\xd7\x6a\x3b\xe5\x5a\xa5\x06\xac\x8b\xba\x6c\x3d" - "\x15\x85\xca\xc7\x79\xac\xef\xff\x51\x1c\xeb\xfb\xcf\x48\xc7\xfa" - "\xfe\x1c\x4e\xf3\xde\x5f\xc5\x61\xad\x4a\x90\x8e\xf5\xfd\x1b\x05" - "\xd7\x59\x51\xdc\x3f\x9a\x60\x7d\x21\x01\xb0\x96\xa1\x85\x55\x9a" - "\x8e\xb1\x0e\x86\x72\x1d\x6c\xa7\x5c\x3f\x00\xbe\x3e\x58\xd3\x65" - "\xeb\xba\x28\x1e\x70\x71\x1e\xeb\x61\x67\xc5\xb1\x1e\x76\x4c\x3a" - "\xd6\xc3\x52\x39\xbd\x3d\xac\x84\xc3\xfa\x81\x68\xe9\x58\x0f\x4b" - "\x14\x5c\xef\x45\x31\x4c\x45\xb0\xfe\xbe\xd2\x94\x2b\x47\x87\x3f" - "\x20\xba\xff\x81\x3d\x1d\xbe\x22\x1f\xb9\xf1\xf1\x1e\xee\xd6\xb5" - "\x5a\xfc\xc1\x9b\xce\xe3\xfd\xe0\x49\x71\xbc\x1f\xdc\x27\x1d\xef" - "\x07\x13\x39\x2d\xfe\xe0\x51\x0e\xef\xe1\xe1\xd2\xf1\x7e\x30\x46" - "\x58\x8b\x3f\xa8\x74\x4e\x8b\x0f\xf7\x96\xa3\xc5\x6d\xf1\xf6\x6f" - "\xee\x5a\x3d\xee\xff\xa3\xf3\x78\xfb\x1f\x12\xc7\xdb\x3f\x57\x3a" - "\xde\xfe\x31\x9c\x1e\xf7\x2f\xe0\xf0\x7e\x48\x23\x1d\x6f\xff\x28" - "\x61\x3d\xee\x8f\x9c\xd3\xe3\x0f\xb9\xca\xd1\xe3\xb6\x78\x8f\xa8" - "\xed\x5a\x4d\x3e\xe2\x9c\xf3\x78\x8f\xc8\x17\xc7\x7b\xc4\x26\xe9" - "\x78\x8f\x88\xe2\x34\xf9\x08\x8b\xfe\xef\x80\x00\xe9\x78\x8f\x08" - "\x15\xd6\xe4\x0f\xe9\x9d\xd3\xe4\x23\x1a\xe4\x68\x72\x5b\xbc\x47" - "\x56\x75\xad\x2e\x1f\x79\xca\x79\xbc\x47\x66\x8a\xe3\x3d\x72\x95" - "\x74\xbc\x47\x86\x72\xba\x7c\xe4\x46\x0e\xef\x40\xe9\xeb\x67\x2a" - "\x46\x86\x08\xeb\xf2\x00\x9d\x73\xba\x7c\x64\x8d\x1c\x5d\x6e\x8b" - "\x77\x50\x69\xd7\x6a\xf3\xa0\x23\xce\xe3\x1d\xb4\x4e\x1c\xef\xa0" - "\x38\xe9\x78\x07\x85\x70\xda\x3c\xc8\xa2\xff\x5f\xed\x26\x1d\xef" - "\x20\x95\xb0\x36\x0f\xac\x74\x4e\x9b\x07\x9d\x97\xa3\xcd\x6d\xf1" - "\x0e\x2e\xea\x5a\x7d\x1e\xbc\xd7\x79\xbc\x83\x17\x8b\xe3\x1d\xfc" - "\x92\x74\xbc\x83\x55\x9c\x3e\x0f\x8e\xe5\xf0\x0e\x6e\x96\x8e\x77" - "\xb0\x52\x58\x9f\xab\x8b\x9d\xd3\xe7\xc1\x25\xce\xf7\x93\x87\xe4" - "\x60\x6d\x2e\x75\xfd\xc7\x8a\x95\xec\x9c\x3b\xc5\xc3\xdc\xfa\x8f" - "\x8a\x90\x4d\x48\x6c\x6d\x19\xc5\xa8\x1f\xbb\xf5\xfa\x8f\x8a\x51" - "\xf6\xd7\x7f\x54\x8c\x92\xb6\xfe\xa3\x62\xd4\x19\xe9\xe3\xf1\x47" - "\xe5\x70\x1e\x61\x94\x85\xff\x0f\x21\x7b\x14\x77\xe7\x75\x21\x15" - "\xa3\xf8\xeb\x42\x2a\x1e\x66\xd6\x85\xa4\xb7\x54\x8f\x96\xe7\x45" - "\x42\xf6\x38\xff\x5d\xe0\xb1\x44\xec\x43\xa4\xae\x43\xc9\x71\xfb" - "\x91\xc5\x1c\xb7\x1f\x9b\x27\xce\xed\x47\x4f\x76\xeb\x75\x28\x15" - "\x8f\x8e\xb7\xcf\xed\x47\x55\x92\xd6\x1c\x51\x3c\x2a\x7d\xdd\x1b" - "\xc5\xa3\x89\x9c\x1f\x7a\xd4\xc2\xff\x3e\x56\xd8\x75\xdc\x96\xb9" - "\x3e\xa5\xe2\xd1\x69\x7c\x6e\x3f\x12\x4b\xb8\xfd\x9f\x74\x79\xbe" - "\xeb\xb1\x64\xe7\xbf\x83\x3c\x3e\x19\x7b\x2e\xa9\xeb\x61\x72\xdc" - "\x1e\x3d\x89\xe3\xf6\xe3\xe3\xc4\xb9\x3d\x66\x47\xb7\x5e\x0f\x53" - "\x31\x66\x88\x7d\x6e\x8f\x36\x48\x5a\xcb\x44\x31\x26\x4d\x3a\xb7" - "\xc7\x4c\xe6\xbc\xdf\x18\x2d\xc7\xed\xc7\x33\xba\x90\xdb\x32\xeb" - "\xed\x31\x21\x7c\x6e\x8f\x0e\x25\xdc\xd6\x55\xcb\xf3\x98\x8f\x47" - "\x3b\xff\xdd\xe7\xc9\x00\xec\x2f\xa5\xae\xcb\xc9\x71\xfb\x09\x7f" - "\x8e\xdb\x4f\xda\xac\x0b\xc5\x71\x5b\xb3\xaa\x5b\xaf\xcb\xa9\x78" - "\xa2\xc5\x3e\xb7\x9f\xa8\x92\xb4\x46\x8a\x42\x33\x5b\x3a\xb7\x35" - "\x01\x9c\xcf\xd5\x24\x70\xdc\x7e\x32\xbe\xeb\xb8\x2d\x73\xbd\x4e" - "\x85\xc6\x9d\xcf\xed\x27\x06\x13\x6e\xff\x37\x44\x9e\x9f\x7e\x72" - "\xb4\xf3\xdf\xb9\xc6\xba\x62\x2f\x2d\x75\x7d\x50\x8e\xdb\xbf\x77" - "\xe1\xb8\xfd\x54\xa3\x38\xb7\x9f\x9a\xda\xad\xd7\x07\x55\xfc\xde" - "\xfe\xfa\x3f\x8a\xdf\xdb\x5b\xff\xc7\x76\xae\xb0\xe2\x29\xe9\xeb" - "\x5e\x28\x9e\x72\xe5\x3c\xfd\x53\xe1\x1c\xb7\xc7\x86\x75\x21\xb7" - "\x65\xd6\xdb\xbf\xaf\xe5\x73\xfb\xc9\x66\xc2\xed\xcb\x1b\xe5\xf5" - "\x1d\x8c\x55\x3a\xff\x5d\xef\x69\x1d\xee\x37\x90\xba\x4e\x29\xc7" - "\xed\xb1\x17\x39\x6e\x3f\x7d\x4e\x9c\xdb\x4f\x07\x77\xeb\x75\x4a" - "\x15\xe3\x8e\xd8\xe7\xf6\x38\xad\xa4\x35\x5d\x14\x4f\x4b\x9f\x07" - "\xaf\x18\xa7\xe3\xfa\x2f\x9e\xb6\x18\xff\xfe\x8c\xaa\xeb\xb8\x2d" - "\x73\xfd\x52\xc5\xb8\x12\x3e\xb7\xc7\x9e\x27\xdc\xfe\xa9\x4a\x5e" - "\x3f\xc9\xd3\x75\xce\xf7\x93\x8c\xaf\x63\xbe\x61\x4a\x5c\x2f\x95" - "\xe3\xf6\x33\xc7\xdb\xd7\x26\x52\x8c\xbf\x68\xcd\xed\xf6\xb5\x89" - "\x14\xa1\x8d\xdd\x66\xbd\x54\x45\xe8\x1a\xfb\x3c\x0e\x8d\x96\xd6" - "\x27\x12\x7a\x51\x3a\x8f\x43\xf7\x73\x7d\x22\xa1\x16\xe3\x5f\x26" - "\x98\xf7\x24\xbf\xf3\x6b\x16\x29\xc6\xa7\xd9\x5d\xb3\x48\x31\x3e" - "\xe6\x8e\xad\xa3\xaa\x08\xcd\xe0\xad\x59\xa4\x78\xa6\xd0\xc4\x94" - "\x85\x6b\x6a\x79\xfd\x2a\xe3\x9b\x9d\xef\x57\x09\x23\xdf\x77\x25" - "\xae\xdb\xca\x95\x85\x09\xa7\xb9\xb2\x10\x76\x55\xbc\x2c\x84\xb9" - "\x74\x9b\x75\x5b\x15\xcf\x6e\xb2\x5f\x16\x9e\x8d\x95\xd6\x87\xf2" - "\xac\xf4\x75\x60\x14\xcf\x1e\xe5\xfa\x50\x9e\x6d\xe6\xca\xc2\x44" - "\x4d\xd7\x95\x85\xb0\x4c\xfb\x65\x21\x2c\xe1\x8e\xad\xe7\xaa\x78" - "\x76\x3b\xbf\x2c\x4c\x38\x41\xca\x42\x5d\xa1\xbc\x7e\x98\x89\xb2" - "\xbe\x7f\xf3\xcb\x42\xb8\x2b\xf3\xed\x5b\xe2\xfa\xb1\x5c\x59\x98" - "\x78\x8e\x2b\x0b\xcf\xdb\xe8\x79\xae\x2c\x3c\xef\xd1\x6d\xd6\x8f" - "\x55\x3c\x97\x6d\xbf\x2c\x3c\x97\x28\xad\xcf\xe5\xb9\x46\xe9\x65" - "\xe1\x39\x8b\xf9\x4f\xcf\x5b\xcc\x7f\x0a\x0f\xeb\xba\xb2\xf0\xfc" - "\x0e\xfb\x65\xe1\xf9\xa4\x3b\xb6\xae\xac\xe2\xb9\x02\x7e\x59\x98" - "\x58\x4a\xca\xc2\x2f\xa3\xe5\xf5\xdb\x84\x3b\xa0\xff\x3b\xea\xb7" - "\xf9\xa3\x92\x19\x17\x20\x71\x1d\x5b\xae\x2c\x84\x5f\xe4\xca\xc2" - "\x1f\x5d\xc4\xcb\xc2\x1f\x06\x75\x9b\x75\x6c\x15\x93\xf2\xed\x97" - "\x85\x49\xc9\xd2\xfa\x68\xfe\xe0\x22\xbd\x2c\x4c\x2a\xe3\xfa\x68" - "\xfe\xa0\xe4\xca\xc2\x1f\xa3\xba\xae\x2c\xfc\x61\x9f\xfd\xb2\xf0" - "\x87\x8d\x77\x6c\x7d\x5b\xc5\xa4\x42\x7e\x59\x08\x3f\x4f\xca\xc2" - "\xcd\x22\x79\xfd\x3c\x7f\x1c\xec\x7c\x3f\xcf\x94\xc1\xcc\x98\x09" - "\x89\xeb\xe9\x72\x65\xe1\x8f\x57\xb9\xb2\x30\xc5\x43\xbc\x2c\x44" - "\xf8\x77\x9b\xf5\x74\x15\x93\x0f\xd8\x2f\x0b\x93\xd3\xa5\xf5\xe9" - "\x44\x78\x48\x2f\x0b\x93\xab\xb8\x3e\x9d\x88\xc1\x5c\x59\x98\x32" - "\xab\xeb\xca\x42\xc4\x11\xfb\x65\x21\x42\x7b\xc7\xd6\xd9\x55\x4c" - "\x3e\xc1\x2f\x0b\x7f\xd4\x91\xb2\xd0\x30\x56\x5e\xbf\xd0\x94\x00" - "\xe7\xfb\x85\xa6\x06\x30\xe3\x49\x24\xae\xeb\xcb\x95\x85\x29\x8d" - "\x5c\x59\x98\x2a\xbe\xcf\x83\x22\xea\x91\x6e\xb3\xae\xaf\x22\xd2" - "\xfe\xfe\x47\x8a\x48\x3b\xfb\x1f\x09\xf5\x01\x45\x0d\x92\x5e\x16" - "\x22\x6b\xb8\x3e\xa0\x28\x8b\xf9\x7f\x53\xe3\xbb\xae\x2c\x44\xd9" - "\xdf\xff\x41\x11\xe5\xc0\xfe\x0f\x32\xd7\xfb\x55\x44\x96\xf2\xcb" - "\xc2\x94\x3a\x52\x16\x6e\x17\xcb\xeb\x47\x9a\xda\x61\xff\x3f\xf6" - "\xf9\x6d\xde\xb6\xfd\x48\x65\x35\x1a\x14\x34\x03\x97\x85\x17\xaa" - "\x0d\xb9\x81\x45\x78\x7d\x61\xe3\x70\x76\x0d\xca\x34\x76\x8d\x97" - "\x06\x03\x59\x83\x52\x6f\x6c\x5f\x83\x92\xac\xfd\x81\x28\x3c\x17" - "\x18\xcf\x09\x36\x28\xc9\xfa\x93\x34\x1e\x13\x85\xc7\x48\x5d\x2a" - "\x65\xd6\x57\x49\x36\xc0\xbb\x5f\xe9\x60\xfd\xc9\x18\x1d\x2a\x8b" - "\x59\x8b\x0c\x5e\x7b\x55\x64\x9e\xf0\x0b\x09\xcc\xfa\x93\x73\x7d" - "\xfd\xb2\xfe\x83\xbc\x3d\xf1\xfa\x93\x31\xb4\x69\xbd\x8e\xd6\x97" - "\x37\x23\x48\x0b\xf1\x9d\x67\x5e\x83\xf2\x85\xef\xf0\xbb\x1b\xe6" - "\x06\xf8\xed\xfa\x8f\xc8\xfa\xc2\x8a\x17\xa4\xaf\x03\xab\x78\x21" - "\x9d\xeb\xdf\x79\xa1\x8c\xe3\xe8\x8b\x4c\x1b\x0c\xe7\x63\xcb\xa2" - "\xa1\x8e\xd9\xd2\x12\xd6\x26\x6b\xed\x8d\x17\x6a\x3b\xc6\x8c\x19" - "\x23\x62\x53\x7f\x71\x98\x4d\xd3\x1a\x72\x83\x34\x78\x9d\x63\xc7" - "\x31\xeb\x55\x7f\x67\x30\x9b\xa6\x72\x1c\xb3\x69\x9b\xf9\x98\x09" - "\xf5\x43\x4c\x5b\x26\x1d\xb3\x69\x63\xb9\x7e\x88\x69\xa9\x1c\x66" - "\xd3\x2a\x09\x66\xd3\x7c\x09\x66\xad\x89\x6d\xb2\xd6\xef\x98\xd6" - "\xe1\xfc\x6f\xec\x9b\xda\xbc\x6d\x7d\x39\x87\xd9\xcb\x61\x80\x59" - "\x11\x5e\x6f\xd9\x71\xcc\xee\xb9\x74\x67\x30\x7b\xe9\xbc\xe3\x98" - "\xbd\x3c\xce\x0a\x33\x01\xbf\xfc\xb2\xf4\x3d\x3b\x15\x2f\xe9\x39" - "\xbf\xfc\xf2\x68\x0e\xb3\x97\x37\x12\xcc\x5e\x2a\x23\x98\xb5\xe5" - "\xb5\xc9\x5a\x03\xe4\xe5\xa8\x8e\x31\x63\xbe\xe9\xdb\x29\x67\x7f" - "\x6a\x36\xe4\x82\xc7\x04\xff\xe8\x38\x66\x5e\xdf\xde\x19\xcc\xfe" - "\x94\xee\x38\x66\x7f\xba\xc9\xc7\x4c\xc8\xd7\xfd\xe9\x82\x74\xcc" - "\xfe\x54\xc0\xf9\xba\x3f\xd5\x72\x98\x45\x6b\x08\x66\x7f\x4a\x25" - "\x98\x19\x4a\xdb\x64\xad\x23\x12\xdd\x61\xff\x17\xd6\xa1\x6d\xde" - "\xb6\x3e\x87\xc3\x6c\xfa\x41\xc0\xac\x08\xaf\x3f\xed\x38\x66\x8f" - "\x6f\xb9\x33\x98\x4d\x1f\xeb\x38\x66\xd3\xf7\x59\x61\x26\xe0\x3f" - "\xa6\x67\x4a\xc7\x6c\x7a\x34\xe7\x3f\xa6\xe7\x71\x98\x4d\xaf\x23" - "\x98\x4d\x1f\x4d\x30\x33\x36\xb4\xc9\x5a\x8b\x64\x7a\x51\xc7\x98" - "\x31\xdf\x60\xed\x94\xb3\x99\x31\x86\x5c\xd0\xec\xa0\xc7\x1d\xc7" - "\x6c\xe6\x84\x3b\x83\xd9\x0c\xbd\xe3\x98\xcd\x9c\xce\xc7\x4c\x48" - "\x27\xcf\x94\xb1\x0e\xf6\x4c\x77\x4e\x27\xcf\x8c\xe2\x30\x9b\xb9" - "\x87\x60\x36\xa3\x96\x60\x46\xab\xda\x64\xad\x67\x32\x53\x74\xfd" - "\x2f\x7b\xba\xd1\x3c\x2e\x9f\xc3\x6d\xb6\x6f\xf7\xd1\x8e\xb3\xf6" - "\x3b\x8e\xdb\x6c\xaf\x8e\xb5\xe3\xac\x16\xe9\xb8\xcd\x2a\xe1\xb4" - "\xe3\x6c\x37\x0e\xb7\xd9\xd1\x04\xb7\x59\x7b\x9c\xd3\x8e\xb3\x3b" - "\x9c\xff\x2a\xa4\x1d\x6d\x71\x9b\x53\xd9\x7d\xf4\xe3\x9c\x18\xc7" - "\x71\x9b\x73\xa6\x63\xfd\x38\xe7\x88\x74\xdc\xe6\x24\x73\xfa\x71" - "\x4e\x31\x87\xdb\x5c\x25\xc1\x6d\x4e\xb4\x73\xfa\x71\x8e\xe8\xfa" - "\x6f\xf6\xf4\xa3\x2d\x6e\x31\xe9\xdd\x47\x43\xc6\xf8\x3a\x8e\x5b" - "\x4c\x5a\xc7\x1a\x32\x66\xa1\x74\xdc\x62\x46\x73\x1a\x32\x26\x89" - "\xc3\x2d\xa6\x94\xe0\x16\xa3\x74\x4e\x43\xc6\xe4\xc8\xd1\x90\xb6" - "\xb8\xcd\x0f\xed\x3e\x3a\x72\x5e\xa5\xe3\xb8\xcd\x7f\xb2\x63\x1d" - "\x39\x5f\xfa\x9e\xc5\x8a\x79\x75\x9c\x8e\x9c\x1f\xc2\xe1\x36\x3f" - "\x95\xe0\x36\xaf\xd4\x39\x1d\x39\xbf\xc3\xf5\x3f\x84\x74\xa4\x2d" - "\x6e\xaf\x34\x77\x1f\x2d\xf9\x8a\x04\xfd\xff\x8a\xb5\xfe\x17\xd0" - "\x92\xaf\xc8\xd0\xff\xaf\x98\xf5\x3f\x94\xb7\x57\x2c\xf4\x7f\x2c" - "\xab\xff\x5f\x49\x75\x4e\x4b\xc6\x3a\xa0\xff\x6d\xb5\xa4\x2d\x6e" - "\x71\x85\xdd\x47\x4f\xc6\x85\x3a\x8e\x5b\xdc\x81\x8e\xf5\x64\x9c" - "\xf4\x7d\xa0\x14\x71\xb3\x38\x3d\x19\xb7\x87\xc3\x2d\x4e\x4f\x70" - "\x8b\xd3\x38\xa7\x27\xe3\x44\xd7\x7f\x34\xe3\x66\xf4\x0e\x2c\xa2" - "\x05\xfa\x21\xcf\xc6\x6b\xd8\xb5\x09\xe3\x53\x8d\x3e\x81\x45\x52" - "\xf7\x77\x31\xaf\x39\x7d\x26\x1e\xa1\x4b\x8a\xf8\x41\xce\xad\x3b" - "\xfd\xea\x19\xe7\xd7\x9d\x7e\x35\xb7\xf3\xf6\x77\x79\x75\x9d\xf4" - "\x75\xa7\x5f\x0d\xe7\x34\xe8\xab\x19\x1c\xd6\xf1\xcc\xf8\x04\x69" - "\xeb\x51\xbf\xea\xee\xdc\x7a\xd4\xf1\x5e\x84\x5f\x0b\xca\xc8\x7a" - "\xd4\xf1\x6e\x5d\xb3\xef\xcb\x82\x24\xbc\x1e\x35\x9d\x85\x26\xcb" - "\x5b\x1f\x39\x3e\xa3\x63\x3e\x07\x69\x68\x81\x3e\x5a\x8e\xcf\xaf" - "\x45\x19\x7d\x82\x34\x52\xf7\x99\xe1\xf3\x79\xd1\x55\xe7\xf8\xbc" - "\x68\x87\xf3\x7c\x5e\x14\xd7\x79\xfb\xcc\x2c\x8a\x90\xce\xe7\x45" - "\xbe\x9c\x36\x5f\x34\x8b\xe3\xf3\x6b\x5a\xe9\x7c\x5e\x58\xed\x1c" - "\x9f\x17\xfd\x48\xf8\xbc\x30\x8f\xf0\x79\x51\x55\xd7\xec\x3f\xb3" - "\x30\x9c\xf0\x99\xca\x91\xb7\xfe\xf4\x6b\xb3\x1c\xe0\x73\x11\x2d" - "\xd0\x7f\xcd\xf1\x79\x89\x0a\xf8\x5c\x24\x75\xbf\x1b\x3e\x9f\x17" - "\x1f\x77\x8e\xcf\x8b\x17\x3a\xcf\xe7\xc5\x63\x3a\x6f\xbf\x9b\xc5" - "\x43\xa4\xf3\x39\xa1\x96\xf3\x2c\x8b\xd5\x1c\x9f\x97\xc4\x48\xe7" - "\x73\xc2\x41\xe7\xf8\xbc\xf8\x08\xe1\x73\x42\x02\xe1\xf3\xe2\xfd" - "\x5d\xb3\x0f\x4e\x82\x2f\xe1\xb3\x6b\xb5\xbc\xf5\xbd\x97\x88\xae" - "\x7f\xcc\xf1\x59\xad\xa1\x05\xfa\xf6\x39\x3e\x27\xea\x8d\x3e\x6a" - "\x8d\xd4\x7d\x77\xf8\x7c\x4e\x74\x72\x9f\x8b\xc4\x4e\xd8\xe7\x22" - "\xd1\x89\x7d\x2e\xac\xf7\xdd\x59\x7a\x5d\x3a\x9f\x97\x16\x71\x5e" - "\x6e\xa9\x81\xe3\xf3\xb2\x10\xe9\x7c\x5e\x9a\xec\x1c\x9f\x13\xd9" - "\xfd\x2f\x96\x8e\x25\x7c\x4e\x4c\xea\x9a\xfd\x78\x96\xd4\x12\x3e" - "\xf7\x19\x2e\x6f\xfd\xf4\x44\x83\x03\x7c\x2e\xa2\x05\xbe\x7b\x70" - "\x7c\x5e\x51\x0c\x7c\x2e\x92\xba\xff\x0f\x9f\xcf\x2b\xa6\x3b\xc7" - "\xe7\x15\x7d\x9d\xe7\xf3\xf2\xef\x3a\x6f\xff\x9f\xe5\x27\xa5\xf3" - "\x79\x79\x3a\xe7\x71\x97\x5b\x7c\xff\xc7\x4b\x05\x4b\xe5\xf3\x72" - "\x27\xf7\x05\x5a\x31\x95\xf0\x79\x39\xbb\x2f\xd0\x8a\xf0\xae\xd9" - "\x17\x68\x59\x11\xe1\x73\xdf\x04\x79\xeb\xd3\xaf\x28\xeb\x98\xcf" - "\xc1\x1a\x5a\xe0\x9b\x10\xc7\xe7\xd5\x5a\xa3\x4f\xb0\x46\xea\x3e" - "\x44\x7c\x3e\xaf\x1e\xe9\x1c\x9f\x57\x5d\x70\x9e\xcf\xab\xf6\x75" - "\xde\x3e\x44\xab\x32\xa5\xf3\x79\x55\x34\xe7\xfd\x57\x59\x7c\xff" - "\x5b\x2d\x63\x7f\xa2\x55\x83\x9d\xe3\xf3\xea\x61\x84\xcf\x2b\xab" - "\x09\x9f\x57\xfb\x76\xcd\xfe\x44\x2b\xd3\x09\x9f\xef\x39\x2a\x6f" - "\xfd\xff\xd5\x1d\x8e\xff\x10\xea\xdf\x30\xf7\x4b\x71\x9c\x5e\x13" - "\xeb\x7c\x1f\x47\x92\xd1\x39\x4e\x27\x1d\x72\x9e\xd3\x49\x6b\x3a" - "\xaf\x8f\x23\x49\xc6\x5e\x7f\x49\x6a\xae\x8f\x23\x29\x91\xe3\xf4" - "\x9a\x02\xe9\x9c\x7e\x5d\xef\x1c\xa7\x93\x1a\x09\xa7\x5f\x2f\x24" - "\x9c\x4e\xaa\xeb\x9a\x3e\x8e\xd7\x67\x39\xd7\xc7\xb1\x26\x51\x4e" - "\x1f\x87\x2d\xa7\x93\x35\xce\xf7\x73\xbc\x71\xce\x39\x4e\xbf\x91" - "\xe6\x3c\xa7\xdf\x88\xe8\xbc\x7e\x8e\x37\xc6\x48\xe7\xf4\x1b\x88" - "\xeb\xe7\x78\x23\x8c\xe3\x74\x72\x92\x74\x4e\xaf\x2d\x71\x8e\xd3" - "\x6f\x9c\x21\x9c\x5e\xbb\x91\x70\xfa\x8d\xe2\xae\xe9\xe7\x58\x1b" - "\xe2\x5c\x3f\x47\x72\x98\x9c\x7e\x0e\x5b\x4e\xaf\x77\x77\xbe\xaf" - "\x23\x65\x9f\x73\x9c\x4e\x79\xc9\x79\x4e\xa7\x0c\xeb\xbc\xbe\x8e" - "\x94\xbe\xd2\x39\xbd\xee\x3c\xd7\xd7\x91\xe2\xcb\x71\x7a\xfd\x64" - "\xe9\x9c\x5e\xb7\xdd\x39\x4e\xa7\xe4\x13\x4e\xaf\x8b\x26\x9c\x4e" - "\xc9\xe9\x9a\xbe\x8e\x75\xae\xce\xf5\x75\xac\xf7\x95\xd3\xd7\x61" - "\xcb\xe9\x34\x9d\xf3\xfd\x1d\x69\x6b\x9c\xe3\x74\xda\x48\xe7\x39" - "\x9d\xda\xd8\x79\xfd\x1d\xa9\x17\xa5\x73\x3a\xd5\x62\xff\x8b\x54" - "\x8b\xf9\xff\x1b\x54\xd2\x39\x9d\x9a\xe0\x1c\xa7\xd3\x96\x11\x4e" - "\xa7\xaa\x09\xa7\xd3\xe2\xbb\xa6\xbf\x63\x7d\x95\x73\xfd\x1d\x69" - "\x1d\xae\x7f\x21\xd4\xdf\x61\xcb\xe9\x8d\x47\x9d\xef\xf3\xd8\x18" - "\xe1\x1c\xa7\xdf\x34\x3a\xcf\xe9\x37\xcf\x74\x5e\x9f\xc7\x9b\x47" - "\xa4\x73\xfa\xcd\x64\xae\xcf\xe3\x4d\x8b\xf1\x4f\x1b\x1b\xa4\x73" - "\xfa\xcd\x50\xe7\x38\xbd\x71\x22\xe1\xf4\x9b\x88\x70\x7a\xe3\xd8" - "\xae\xe9\xf3\xd8\x70\xd0\xb9\x3e\x8f\x8d\xc5\x72\xfa\x3c\x6c\x39" - "\xfd\xe7\x74\xe7\xfb\x3d\xfe\x3c\xcc\x39\x4e\xbf\x75\xce\x79\x4e" - "\xbf\x95\xdf\x79\xfd\x1e\x6f\x6d\x92\xce\xe9\xb7\xa2\xb8\x7e\x8f" - "\xb7\x2c\xd6\xbf\xff\x73\xa9\x74\x4e\xbf\xe5\xed\x1c\xa7\xff\x3c" - "\x88\x70\x7a\xd3\x79\xc2\xe9\x3f\x2b\xbb\xa6\xdf\x63\x53\xaa\x73" - "\xfd\x1e\x7f\xb6\x19\xff\xb6\x22\x6e\x49\xac\x6a\xe9\x82\x05\x2b" - "\xe2\x56\xaa\x56\x24\x2c\x7c\x25\x6e\x9c\xbf\xf9\xff\xe3\x42\x92" - "\xfc\x93\xfa\xa1\xd8\xc5\xf3\xe6\xae\x7e\x94\x3b\x99\x10\xb7\x04" - "\xfe\xf4\x43\xf1\xf3\x56\xc4\xab\x56\xae\x49\x8c\x53\xe1\xff\x2d" - "\x7e\x25\x11\x92\x2c\x5d\xc9\x1d\x79\x21\x2e\x61\x5e\xd2\xc2\x25" - "\xaf\xaa\xe6\x25\x2c\x7c\x75\xc9\xe2\xb8\x25\x2b\x55\xcb\xe3\x96" - "\xad\x5a\xb8\x3c\x0e\xff\x7b\x85\x6a\xc1\xd2\xe5\x70\xe0\x95\xb8" - "\x85\xab\xe3\x54\xf3\x57\x2d\x58\x10\xb7\x7c\x45\x3f\x14\xb1\x2a" - "\x61\xe5\xc2\xc4\x84\x38\x55\x58\xc4\xf8\xe0\x69\x13\x5f\x9c\xf6" - "\xcc\x33\xfd\x90\xc5\xde\xd3\x2a\x3a\x27\xa2\x10\x38\xe4\x7a\x45" - "\xf1\xee\xa1\x72\x50\x52\x99\xc0\xcd\xad\xcb\x91\x72\xcb\x72\xe4" - "\xba\xb9\x1e\xb9\x65\xd6\x23\x77\xd3\x3b\x37\x35\xaa\x45\x28\x94" - "\xf6\x9a\xaf\xdc\x5a\x8f\xbc\x4d\xd9\xbb\xb4\x74\xf6\xce\x28\xbd" - "\xd7\x9b\xa1\x38\x2d\xed\xb5\x21\x11\x1f\x07\x2c\x5c\xe9\xec\xbd" - "\x50\xbe\xde\x4d\xd0\x7b\x6d\x54\xad\xbf\x8a\x28\xba\x7f\x7a\xc3" - "\x61\x93\x9e\x3a\xc5\x74\x0f\x23\x17\xa4\xd8\xe2\x8e\x14\x9b\x9b" - "\xe1\xef\x7e\xf8\x15\x21\xc5\xdb\xae\xf0\x53\xc3\x6f\x34\xfc\xf6" - "\xc0\xaf\x06\x29\x32\xbc\xe1\xa7\x82\x1f\x1c\xcb\x08\x87\x5f\x14" - "\xfc\xe0\x78\x26\xa4\xcd\x84\x73\x99\x6a\x92\x4f\x26\x9c\xcf\x3c" - "\x0a\xbf\x6a\xf8\x35\x20\x45\x16\xe4\x99\x55\x8a\x14\x5b\xa7\xc1" - "\x5f\x1d\xfc\xea\xe0\x07\xc7\xb7\x2a\xe1\x87\xd3\x6a\xc8\x39\x2d" - "\x82\xdf\x58\xf8\xcd\x82\x5f\x12\xfc\x0e\xc2\xaf\x18\x7e\x65\xf0" - "\x3b\x0f\x3f\x78\xbe\x6c\x48\x93\x0d\xf7\xca\x86\x73\xd9\x70\x8f" - "\xec\x2a\xa4\x78\x27\x04\x7e\x39\xf0\xab\x45\xf0\x8e\xec\x2f\xc4" - "\xe2\xdf\xf8\x17\x6b\xf5\x7f\xeb\xdf\x46\xcf\xb4\xfb\x75\xc5\x81" - "\x06\x28\xb7\x5b\x16\xd2\x1b\x90\x82\xce\xde\xa8\x4a\x0c\x44\x2e" - "\xd7\x14\x5b\xc6\x54\x6c\x44\x50\xdf\xec\x8c\x2a\x5e\xdb\x8a\xcf" - "\x8f\xc1\x31\x6b\xca\xda\x32\x5a\x87\x12\x7d\x71\xf9\x94\xc6\xcf" - "\x2d\xa3\xd9\xeb\x57\xea\x5c\x3c\x8b\xf1\xf5\xf4\x3b\x23\x94\xf4" - "\xfa\xe8\xf7\xf0\x3c\x5c\xc8\xdf\x1d\xcf\xd3\xa5\xb5\x0f\xa5\xd3" - "\xca\x61\x83\x71\x1d\x53\xbc\x96\x79\x2e\x0f\x52\x1e\xe1\x3c\x3c" - "\x9b\xde\xeb\xa6\x06\xca\x9f\x2b\xfe\x3f\x0d\x98\xd3\x7b\xa2\xb7" - "\x93\x7a\x67\x0b\xe3\x5f\x5a\x7d\xc6\xeb\xf1\xb9\x96\x7d\x7e\x5a" - "\xba\x60\x88\xaa\x78\x49\x2b\xaa\x51\x6c\xe9\x0b\xef\x46\x41\x1d" - "\x48\xd1\x0f\xf9\x69\x4d\xdb\xc6\xeb\x8f\x03\x0f\x70\xba\x4f\x53" - "\x6a\xf1\x5f\x37\x7c\x9e\xce\x99\x50\x84\xfb\x81\x8a\x53\xfe\x0a" - "\xbc\xd9\xe2\xd1\xea\x13\x9d\xaa\x7a\xc1\x93\xbe\x44\x9e\x0d\xa7" - "\xdb\x63\x7e\x96\x56\xaf\x9b\xa1\x38\x7f\x5a\x35\x3d\x14\xce\xb9" - "\x9a\xb2\xdf\x0c\x85\xe7\x70\xb9\x01\xd7\xd1\xf0\x8c\xc5\x2f\xe0" - "\xfb\xbe\xbd\x03\x9e\x95\x5a\x3f\x15\xf2\xfe\xeb\xf4\xd0\x8f\xd6" - "\x36\x53\xf8\x9c\x49\x7b\x53\x03\x7c\x77\xa7\xb3\xfe\x7c\x7e\xe7" - "\x00\xe4\xba\xfb\x1d\x84\x76\xbd\x83\xdc\x9a\xb2\xde\xd6\xea\x5c" - "\xdd\xf3\x48\xdd\xb7\xc5\x9d\x82\x34\x3a\xc5\xdb\x09\x34\xf0\x97" - "\xb9\x97\xf7\xb8\x10\x3b\xf7\xba\xd8\x7e\xaf\x6d\xe3\x42\xf0\xbd" - "\x48\x8c\x6e\x6a\xc8\x5f\x92\x87\xa9\xe0\xbe\x50\x1c\x3f\x1c\x3b" - "\x73\x1e\xa6\x6c\x73\x1e\x5b\x8c\xf8\x7a\xb8\x67\x25\xfd\xc1\x7d" - "\xa1\xa6\x6d\x61\xa1\x70\xed\x41\x7c\xde\x33\x0d\x35\xd0\xf0\x17" - "\xdf\x9f\x60\x01\xb1\xa7\x52\x11\xce\x9f\x66\x8f\xd1\x70\x4c\xa7" - "\xc8\xf0\x35\x81\xbc\xc6\x6d\x53\x9d\x22\x83\xe9\x9b\xa0\x95\x23" - "\xaa\x08\xc6\x19\xcb\xd6\x54\xd2\x26\xf8\x19\x47\x55\x22\x97\xe2" - "\x17\x30\xbe\x19\x5a\xd5\x94\x3e\x10\xe3\x8c\xec\xf6\xd8\x0e\x9b" - "\x8e\xe3\xa3\xdc\x3d\x00\xca\xfb\x5b\x7d\x8b\x68\x4a\x85\x30\x3e" - "\x38\x56\x10\x27\x04\xc7\xdd\x30\x4f\x9b\xb2\x32\x8a\xad\xe2\xa5" - "\xfc\xc3\xd4\xf5\xb4\x45\xde\x9b\x69\x82\x9b\x3b\x9b\x5e\xaf\x73" - "\xe9\xab\xc7\xe9\x55\x0f\x30\x9c\xf1\x60\x71\x65\xb8\x85\xe3\x47" - "\xfb\x44\x14\xe2\xff\xbf\x34\x12\x29\x3d\x2b\x11\xa5\x4a\x19\x5e" - "\x44\xb8\x30\xa1\xc8\xcc\x13\xe6\x1d\xb7\x8d\x72\x33\x6e\x80\xb6" - "\xb6\x9d\x7f\x99\x09\xc6\xec\x11\x95\xad\x3e\xcf\x26\xb6\xe4\x8e" - "\x0d\xa1\xb5\x23\x2a\xf1\xfc\xf3\x4b\x8a\xcc\x38\x26\x06\x1b\xdc" - "\x10\x79\x8e\x11\xe7\x53\x12\x68\x7d\xca\x4d\xb8\xd7\xc0\x67\x13" - "\x3f\x5d\xad\x07\xbc\xc6\x86\x60\x3e\x1c\xbf\xdd\x4c\xe1\x35\x01" - "\xe9\xfe\x7f\xbe\xbd\x0b\xde\x35\x1f\x38\x01\xef\x8a\x70\xbe\x4d" - "\x59\x99\x07\xb9\x77\xcd\x8c\xc2\xdc\x80\x7b\xd4\xb2\xdc\x77\x87" - "\xe7\x72\x81\xbc\x6b\x21\xdd\x79\x9d\xcb\xb1\x10\x73\x4c\x98\x7b" - "\x73\xe9\xd8\xb2\x94\x59\xaa\xf7\x1a\x51\xdb\xb6\x9a\xae\xdc\xfa" - "\x3d\xe4\xbf\x01\xd1\xad\xb7\xe9\xb2\xe4\x28\xba\x39\xeb\x65\x3c" - "\xce\xb1\x1a\xad\x9f\x87\x06\xdf\x93\x46\xeb\x23\x8d\xc8\xf3\x9e" - "\x6a\x4f\xfa\x6c\x54\x35\xb3\x37\x42\x72\x25\x5d\x5b\x9e\x78\x02" - "\x25\x5f\x46\xee\xeb\x16\x22\xef\xf5\x51\xf0\x2e\x65\x74\x73\x45" - "\x52\x35\x2a\x6f\x80\x5f\xe2\x59\x48\xf7\x1d\xfc\x4e\xa0\xf5\x6b" - "\x90\xeb\x14\x68\xf7\x52\x1a\x91\x7b\x79\x62\x23\x1c\xbb\x8e\x92" - "\x63\x68\xc3\xd9\x32\x9c\xee\x34\x8a\x34\xe8\x3d\xd7\x5d\x07\x4c" - "\x5f\xc6\x73\xba\x2f\xa2\xdd\xf0\x2c\xad\x5e\xbb\x52\x5b\xb2\xf7" - "\xba\xdd\x5a\x4d\x1b\x9a\xb2\xb2\xf6\xe8\xd0\x53\xc5\xbc\x77\xc1" - "\xcf\xdc\x8a\x10\xe0\xe6\x82\xd3\x98\x72\x9f\x52\xce\x35\xe0\xfa" - "\x25\x2b\x07\x74\x07\x32\x9f\xc7\xe7\xf4\x3e\x4f\x29\xe1\x78\x71" - "\xa4\x81\x6e\xc2\xf1\xc1\xef\x0d\x31\xaa\x61\xdf\xbf\x46\x91\x88" - "\x5c\x9b\xb2\xb6\xba\xea\x5c\x8a\xdc\xf1\x3d\x20\xcf\xde\x70\x9f" - "\xed\x98\x1b\xec\x39\x95\xce\xe5\x7f\xa6\x71\x7c\x79\xbb\x1a\x38" - "\xd2\xdb\xfc\x2c\x70\x3e\x54\xe7\xf2\xf7\x59\x16\x7c\xc2\xfc\x68" - "\x3f\xcf\xb6\x67\xf8\xf8\x1e\x13\xae\x5b\x95\x2a\xbd\xd1\x67\x42" - "\x31\x94\x99\x4a\xfa\x96\xaf\x3b\x4d\xd1\xcd\x53\x0c\x74\xb3\x29" - "\xf7\x61\xdc\x96\xb9\x57\x18\x1a\x10\x49\xbf\xf5\x32\x94\xb5\x2a" - "\x32\x86\x74\xeb\x59\x9c\x27\x68\x9b\x98\xac\x7a\xa4\x8c\xac\xa4" - "\x9b\x71\xf9\x35\x65\xb7\x46\x65\x2d\x47\xde\x74\xee\x84\x42\x93" - "\xcf\xb8\xe2\x96\xbd\xd1\x5a\x5c\xc7\x62\xfe\xd2\x5a\xb8\x96\xcd" - "\x07\xee\xdb\x4b\xa7\xd8\x5a\x60\x82\xeb\xe9\x9c\x87\x95\xec\xf3" - "\x30\xf5\x21\xa9\x47\xb7\x16\xd0\xfe\x70\x4e\xab\x6a\x80\x73\xbd" - "\x2e\x29\xb4\x21\x70\x1c\xd1\xda\x61\xea\xe2\x94\x7a\x48\xab\x1d" - "\x43\x38\xa4\xd2\xf3\xfe\x4f\xe1\x78\x66\x04\xe0\xf2\x4f\x74\xa8" - "\xf6\x25\xae\xdc\x31\xef\xcb\x94\xab\x56\x9f\x87\xa1\xdc\x69\xe3" - "\x75\x2e\xf7\xfa\xb2\x31\x76\x69\x20\x75\xd2\x41\xd3\xde\xe8\xed" - "\x5f\x82\xf2\xfb\xb2\x0c\x21\x48\x93\xa1\x73\xf1\x51\x73\xb1\xd4" - "\xee\xc3\x69\x99\xe7\x84\xb2\x69\xda\xc0\xb6\x01\x70\x0d\x94\x9b" - "\x18\x5c\xe7\x90\xba\x4d\xbb\x07\xd7\x3b\x50\x3e\x4b\x49\xbd\x7f" - "\x9f\x2f\x3c\x97\x86\x1e\x30\x33\x14\x9e\x2b\xf5\x12\xfb\x2c\x96" - "\xcf\x66\xae\x67\xe8\xec\x99\xc5\x24\xed\x08\x7d\x53\x56\xb6\xbb" - "\xce\x65\xa0\xab\x25\xd7\xc8\x7b\x65\xa7\x8d\x2a\x83\x7f\x83\x2e" - "\x31\xe7\x05\x65\xd5\x0d\xb4\x44\x7f\xcc\x29\x5c\x3e\x77\xbc\x83" - "\xb5\xc6\xcc\xd2\x96\xec\x99\x50\x4e\xb3\xa7\x99\xcb\xa9\x69\x35" - "\x5d\x05\xb8\x22\xd3\x6d\xfa\xfc\x56\xc0\x32\xd2\xa8\xa0\xe7\x1a" - "\xd5\x08\x74\xab\x61\x37\x1c\xdf\xbd\x1a\xeb\xbe\x2c\x2d\x94\x65" - "\x37\xe1\xb4\xae\x08\xa7\x63\xd2\xb3\x69\x5b\xbd\x66\x96\x32\xcf" - "\x4c\x29\x4c\xf0\x7c\x2e\xe6\x67\x6a\xf5\x1a\x51\x0d\xf7\xae\xd4" - "\xb9\xb8\x86\xf2\xca\xcb\x3b\x2a\x25\x4d\x47\x63\x5e\x29\xe0\x5d" - "\x1a\xe1\x6f\x1f\x96\xc7\xf7\x7c\x09\xba\x36\x2c\x02\xca\x0a\xe0" - "\xbd\x73\x20\x0d\x31\x78\x47\xa9\x43\x73\x73\xf0\xf5\x5b\xe0\xff" - "\xf8\x38\x4e\x03\xc7\x03\x74\x28\x66\x23\xc9\x37\x63\x2c\xc6\x8f" - "\x9f\xef\x3b\x11\x24\x5f\xe6\x59\xee\xc1\x79\xe2\xeb\x70\x9e\xf9" - "\xdb\xe8\x3a\x9c\x0f\xe4\x91\x60\xce\x3b\x13\x8e\x99\xf3\x0f\x5b" - "\xdc\x7e\x8f\x0c\xb8\x87\xbb\xe5\xb3\xef\xd8\x46\x37\xb0\xcf\xb5" - "\x5f\x87\xe2\x63\xf1\xb9\xcd\x70\x0c\x5f\x4b\x38\xf2\xce\x69\xcc" - "\x1f\x1d\x79\x1f\x05\xe1\xd1\x3b\xe7\x75\x68\x41\x9d\x65\x1d\x0f" - "\x38\x79\x98\xdb\x00\x36\xbf\x66\x73\x7e\x5c\x5e\x24\x0f\x5a\x3b" - "\xab\x88\x2d\x23\xb8\x2c\xbb\xe3\xfc\x9b\xb2\xde\x85\xf7\x9f\x3f" - "\x9a\x7d\xff\x80\x06\xc2\x79\x88\x3d\x73\x0d\xe1\x43\x56\xfa\x60" - "\x73\x5b\x0e\x58\x54\xc1\x35\xb3\xac\xda\x26\x37\xd2\x6e\x4c\xd0" - "\x61\xde\xb0\xf7\x18\x83\x9f\xc9\xfc\xbe\x90\x8f\x2b\xe4\xf3\x30" - "\xe6\x3a\xce\x07\xea\xb6\x3d\x90\x4f\x81\x55\x3e\xae\x38\x9d\x29" - "\x2b\xfd\x15\xdc\x16\xbe\x3b\x90\x86\x3a\xff\xdd\x52\x73\x1a\x7c" - "\x1e\xe2\xfa\x34\x1c\xab\xd6\xa1\xc5\x4c\x1c\xb2\x20\x8d\x4e\x91" - "\x2e\x3a\x3f\x26\x65\x18\xa2\x2a\xf2\x74\xd8\x3b\xe2\x72\x3d\xb6" - "\x62\x70\x03\xaa\xc8\x33\x21\xd3\x07\xf7\x15\x87\xa6\xd0\xc5\x57" - "\x14\x39\xd3\xcb\x9b\x6b\x91\x34\xbd\x97\xc3\xcc\x7f\xa3\x5b\xc1" - "\xe3\x24\x3f\x8a\x70\xfb\x7f\x43\x91\xbb\xb9\x42\x5f\xcf\xd4\x71" - "\xf0\xef\x55\xf8\xfc\xbb\xe0\x89\xb0\x2f\x02\xef\x1b\xaf\xa5\x88" - "\x37\x32\x41\xda\x5d\xf8\x38\xf6\x4d\xe0\xd9\x76\x5b\x9c\xa3\x3f" - "\xf0\x0b\x25\xb1\xcb\x1d\xcf\xb4\x79\xf8\x79\x0d\xcf\x17\xe3\x67" - "\x36\x15\xf8\x85\xe2\x77\x58\x9f\x44\x9b\x2a\x0c\x4d\xc5\xe5\x0d" - "\x46\xa4\x5a\x8d\x3d\x5d\xee\x90\xc8\x7c\x44\x43\x1d\x28\xd1\x53" - "\xe5\x30\xe3\xff\xc0\xf7\xde\xd0\xfb\xfb\x85\xae\x37\x22\x6a\x6b" - "\x4a\x2f\xb7\x67\xf3\xe8\xe2\x5b\x0f\xdd\x57\xdc\x94\x95\x1b\x7a" - "\x2a\x09\x21\xe9\x5a\x38\x37\xd4\xfc\xee\xbb\xd8\x77\x87\x7b\x31" - "\xf5\xd2\xa8\xed\xa9\xcc\xfb\x42\x9a\x24\x31\xbc\xe8\x0d\x9e\xf4" - "\x97\x79\x06\xb4\x22\x8f\x6e\x5d\x91\x8f\x28\xe3\xb6\x51\xda\x8f" - "\x76\x55\xe1\xfa\x3c\xd4\x1c\x4f\x26\x76\xe0\xf7\x13\x53\x90\xf2" - "\x9a\x62\xdb\xb0\xc8\xe4\x54\x66\x8f\xa4\xcf\x21\x9d\xc4\x67\x65" - "\xfa\xff\xca\xc1\x47\x47\x1a\xd6\xd3\xa4\x4d\xda\x36\x69\x0a\x9b" - "\x1f\x3e\x67\xc6\x6f\x17\xeb\x6f\xa5\xdf\x63\x9b\xe8\xfc\x7f\x3b" - "\xef\xaa\x14\x7e\xd7\xbf\x78\xc8\x7f\xd7\x6d\x55\xb6\xef\xfa\x97" - "\x31\x9d\xfb\xae\x7f\x19\x2b\xe3\x5d\x55\x22\xef\xda\x22\xff\x5d" - "\xff\x52\x62\xfb\xae\xdb\x87\x75\xee\xbb\x6e\x17\x5d\xff\xc9\xce" - "\xbb\x86\x08\xbf\xeb\xf6\xcb\xf2\xdf\x75\x7b\xa1\xed\xbb\xee\xf0" - "\xe8\xdc\x77\xdd\x21\xba\xff\x29\x4d\x79\xd2\xb8\x7e\x82\x7a\xa9" - "\x35\xa5\x05\xb4\xdc\xb6\x89\x51\xeb\xf6\x22\xaa\xac\xa1\x19\x95" - "\x0f\xae\xc2\x3a\x99\x7a\x38\x11\xea\xbd\x0d\x68\x2c\xfd\xce\xcd" - "\xa8\xf2\xbc\x3a\x38\x7e\x05\x9d\x4d\x6a\x46\xa1\xcb\x71\xfd\xbb" - "\xe3\x42\x45\xac\xd4\xfa\x77\x47\x41\x7b\xfd\x6b\x78\x94\xad\x73" - "\xdf\xeb\x55\x5e\xd7\x8a\xf0\xfb\xdf\x50\xec\xbc\xd9\x5e\xff\x6e" - "\x20\xf1\xb6\xae\x7f\x71\x3c\x2a\x9a\x9b\x79\xf5\x2f\x99\x27\xb5" - "\xf3\xa4\x75\xdd\x9b\x75\x0d\x21\xe1\xba\x77\xe7\x0e\x5c\xf7\xee" - "\x82\xf3\xd2\x9e\x7f\x67\xac\xb9\xee\xd5\xc2\x3d\x2d\xeb\xde\x2f" - "\x63\x71\x9b\xbc\xf3\x84\xbc\xba\x77\xe7\x09\xf3\x7b\xe7\xb3\xef" - "\x0d\xc7\x54\xfc\xba\x77\xa7\xe8\x5e\x97\x96\xbc\xa5\xb7\x05\x26" - "\x7e\x34\xb4\xb9\x97\xa9\x60\x70\x2a\x6e\xdf\x9a\x20\x26\x7f\xdf" - "\xd5\xec\x7a\x45\xf1\xde\x4a\xa6\x3f\xb3\x29\xd6\x85\x2e\xb8\x2f" - "\x20\x72\x25\xfd\x03\xed\x3f\x38\x15\xf7\x55\x62\xcf\x0d\xe7\x0f" - "\xd0\xfb\xee\x0b\x90\xf6\xdc\x24\x4f\xfa\x83\x41\xc5\x29\x50\x5e" - "\x3e\x5a\xdd\x4c\x99\xde\x88\xf6\x04\x1c\x94\x74\xee\xc3\x85\xf4" - "\x5b\xbe\xc9\xb7\x72\xc3\x54\xa7\x03\x2e\x23\x9c\x96\x4e\x73\x1d" - "\x2b\xff\xf9\xf3\x46\xdb\x7f\xfe\xbc\x85\xd2\x9f\x9f\xe4\xe9\xd8" - "\xf3\xe7\x8d\x76\xe8\xf9\x07\xc2\xf3\xb7\x6a\x7a\x81\xff\xa3\x3e" - "\x6f\xd5\xb8\x4a\x7c\x1e\xd1\xfd\xef\x3a\xef\x1e\xf9\x0e\xd7\x7f" - "\xf4\xc0\xa7\x0a\x3f\xda\xa5\xa7\xa0\x0e\x60\xda\x70\x5c\xf6\x48" - "\xfd\x57\x0b\x75\xd6\x0f\x34\xa9\x93\xf4\x12\xeb\xa4\xfc\xfd\x8e" - "\xdf\x3f\x44\xd9\xf9\xf7\xdf\x25\xfe\xfe\xd6\x75\xe2\xe1\x21\x7b" - "\x44\xeb\xc4\x6d\xa3\x94\xb6\x75\xe2\xae\xeb\xd2\xeb\xc4\x5d\x45" - "\xb6\x75\xe2\x9e\x41\x5c\x9d\xb8\xa7\x97\xfc\x3a\x71\xf7\x39\xc7" - "\xeb\xc4\xdd\x87\xe4\xd5\x89\xbb\x93\xec\xd7\x89\xbb\x2b\xe5\xd5" - "\x89\xbb\x2b\x6d\xeb\xc4\xdd\xa3\xf9\x75\xe2\x1e\x37\x51\x2c\xb5" - "\x9e\x55\xd0\x46\xbb\x5f\x53\xec\xa9\x32\x6c\x00\xdf\xa2\x4d\xd7" - "\x44\x1a\xe9\x26\x3a\xdb\xb3\xca\x44\x8d\xc6\xf5\x4a\x68\x53\x53" - "\xbc\x9b\xe9\xf5\x00\x77\x7a\x80\x6a\x17\xdd\xe6\x8b\x20\x4e\xc3" - "\xe1\xf9\x3d\xe9\xa6\x80\xfe\xf4\xeb\x01\x03\xf2\x6e\x23\x6f\xf8" - "\xf9\xe6\xb1\xed\x31\xfc\x3b\x84\x7e\xdd\xb7\x5f\xd6\x6a\xa4\xf6" - "\x6c\x40\x6e\xf0\x0c\xd1\x9e\x69\x4a\x04\x75\x90\x37\xfe\x37\xbd" - "\xa1\x60\xec\xee\xdb\xc8\xd5\x33\x09\xb0\xf1\x82\xfb\x25\x79\xd2" - "\xf4\x8a\x00\xb4\x7b\x39\x78\x69\x0a\xf9\xee\xa2\xe8\x42\x43\x53" - "\x00\x65\xf4\x9e\x50\x49\xf0\xd9\x9b\x41\x0f\x04\xef\x95\x33\x21" - "\xcf\x34\x70\xc2\x46\xe3\xfa\x78\x05\xfd\x46\xb4\x02\x3f\xab\x31" - "\x67\x42\x2a\xbd\x0d\x7e\xeb\xe3\xfb\x63\x0d\x0d\x5e\x3b\x84\x6e" - "\xf2\xed\x07\x3e\x5c\xbd\x6b\x35\x1a\x9e\x7f\x1b\x05\xd0\xb7\x02" - "\x28\xc0\x3f\x1a\xef\x35\x0a\x31\x8a\x36\x51\x05\x63\xe1\x9c\x2b" - "\xae\x13\x69\x7c\x7f\x03\xdc\xbf\x0d\xee\xdf\x8a\xb9\x8d\x7c\x77" - "\xc3\xfd\x8d\xaf\x07\x48\x2c\x2f\x7b\x99\xf1\xbf\xe6\xe7\x32\xa9" - "\xfd\xf7\xd0\x87\xe1\x87\x9f\x0b\x62\xb8\x1b\xc7\xe4\x61\xff\x02" - "\xfc\x6c\x99\xb7\x91\x1a\x9e\x73\x38\x3c\x43\x00\xdc\x17\xaf\xd3" - "\x12\x3d\x67\x99\x12\x73\x94\xf7\x6c\xc6\x6c\xf6\xd9\x7e\x81\x67" - "\xbb\xc1\x3d\x1b\xbe\x17\x8e\x8f\xd8\x37\xd0\xc8\x75\x43\x71\xd9" - "\xfc\xc9\x33\xa9\x4f\x38\xfe\x1e\x7a\xeb\x8d\x78\x89\x5c\xfd\xab" - "\xe8\xfa\x27\x5b\x0f\xa3\xc1\xb4\x72\x83\x66\xca\xa6\x1f\xe8\x48" - "\x03\x42\x9b\x0e\x23\x75\x05\x94\xeb\xf2\xe6\xeb\x88\xf6\xda\xa0" - "\x39\x1d\x50\x27\xf5\x5e\x5a\xb1\x7b\x6d\xd9\x40\x57\x9a\xbc\x27" - "\x14\xd3\xde\x61\xbe\x5b\x37\xd0\x49\x6d\xc3\xfd\x62\x5a\x87\xdf" - "\x17\x32\xd7\xa0\x04\x5e\xd3\x49\xaa\xe5\x48\x75\x45\xb1\xff\xbb" - "\xaf\xcf\x83\x2f\x9d\x81\xdc\x2e\x29\x0e\xb8\xaf\xbf\x80\xbf\x15" - "\xbd\xaf\xe2\x7f\x2b\x7a\x3f\x0c\x29\x0a\x8e\x22\xc5\xbe\x12\xa4" - "\xf8\xa0\x16\x41\x3a\xfe\x6f\xbf\x2b\xc9\xab\x20\x3b\xf2\xc0\x50" - "\x94\x62\xa0\x7f\xa2\xb5\xf5\xe9\x59\x14\xdd\x1c\x39\xd2\x45\x57" - "\xbc\x1a\x7f\x43\x29\xd8\x0c\x31\xfd\x19\xda\x5a\x4f\xf8\xf7\x4b" - "\x80\x29\x4a\x5c\x8e\xee\xbd\xa6\x28\x98\x86\xcb\x8d\x67\x43\x9f" - "\x70\xe3\xfa\x68\x64\x50\x45\x6b\xdb\x72\x26\x14\x1a\x73\x1e\x56" - "\x9a\x94\xe9\x9a\xf5\x57\xd1\x60\xfc\xed\x13\xca\x46\xf4\x5c\xa3" - "\x1b\x2e\x8f\xd1\xc5\xf3\xbf\x46\x57\x56\x22\x6a\x7d\x23\xf2\x00" - "\x6e\xb6\x97\xab\x88\x3a\xcf\xe6\x75\x75\xb4\x09\x97\x2d\xdc\xa7" - "\x0a\xe7\xfa\xa7\x34\x82\xbf\xd7\xd7\xa2\xbc\xe5\xc8\xdb\xb8\x22" - "\x7e\x80\xfe\x56\xfc\xbd\xef\x99\x90\x77\xff\x06\xa4\xcc\xab\x07" - "\x4e\xad\x00\x3e\xd5\x43\x39\xd3\x93\x72\x86\xe7\xda\xef\xc2\x65" - "\x6c\xcb\x37\xde\xbb\xeb\x49\x19\x63\x78\x84\xcb\xd8\x52\xe0\xd1" - "\x12\xdc\x7e\x00\x8f\x36\x40\x19\x83\x72\x41\x67\xfd\xd5\x35\x6f" - "\x03\x8d\xd6\x2d\x44\xd4\xee\x6b\x7d\xf0\x39\x97\x5e\x23\x29\xd5" - "\xd7\x51\xcd\x88\xeb\xeb\x38\xe0\xd1\xea\x7f\x5f\x88\xea\x05\xfa" - "\x97\x4b\x8a\x82\x54\x38\xee\xa6\x7a\x79\x84\x12\xe2\xcd\xf6\x49" - "\x1f\x70\xc7\x7d\x9c\x3a\x88\x05\x8e\x8b\xea\x05\x34\xe2\x92\xe2" - "\xfd\x97\x70\x1c\x5f\xdf\x8f\x14\x89\x4f\xd3\x35\x10\xb3\x59\xa4" - "\x1f\xf7\xfd\x69\xcc\x37\xd4\x34\x15\xfa\x86\xf9\x76\x45\xae\x31" - "\x42\xdc\x0c\xca\x9b\x55\x80\xb7\xae\x78\x51\x2b\x53\x0f\xe1\x38" - "\x5e\x49\x40\xd4\xdc\x3a\x88\x95\x11\x62\xd5\x14\xe0\x0e\xf5\x51" - "\x14\xae\x8f\x68\xad\x6a\x7b\xb2\x8e\x36\x45\xc6\x2a\xe8\x94\x65" - "\xc8\xad\x22\xc9\x88\xe6\x24\x22\x7a\xdd\x75\x88\x57\x43\x15\x82" - "\x7a\xa9\x3f\xd4\x59\x03\xf2\x57\x23\x6f\x1c\x2f\x8f\x3a\xd0\x2a" - "\xef\x6c\x0c\x39\x9c\x52\xda\xcb\x08\xfc\xc5\xf5\x93\x67\x9a\x4b" - "\x5f\x28\x67\xfd\x33\x70\x79\x84\xf2\xe9\x99\xc6\xd4\x97\xd1\x79" - "\x50\x0e\x0d\xaf\x07\x3c\xd0\xf6\x7a\x80\x0a\x7e\x43\xcd\x75\x98" - "\xb9\xfe\x80\x98\x25\xe0\xfa\xab\x22\x49\x87\x0c\x10\xdb\xfe\xb8" - "\xad\x7b\x3d\x60\x30\x13\xe3\x57\x03\xd0\xa8\x66\xe4\x02\xcf\xa4" - "\x84\xe7\x45\xbb\x17\x20\xb7\xb3\xf1\x97\x90\x11\xca\x86\x39\xee" - "\x11\x0b\x55\x08\xf2\xa5\x4e\x07\x7c\x87\xd8\x98\xb9\x88\xf3\xee" - "\x83\x1f\x39\xde\x7d\xc0\xcc\x8b\x25\xbc\xfb\x40\xf7\x5b\xe4\xdd" - "\x37\xd1\x0c\xef\x14\x6d\xfe\x0c\x9f\x66\x55\x18\x3e\x86\x18\x7d" - "\x50\x86\x39\x82\x39\x73\xe6\x6f\x98\x33\xff\xa7\xa1\xbb\x72\xa6" - "\xa5\x29\x40\x05\xbf\x3b\xc2\x19\xc8\x97\xe1\x0c\x8e\xd5\x37\xd1" - "\xad\xc8\x1c\x23\xa6\xac\x6a\x37\x68\x54\xeb\xd1\x33\x50\x56\xdd" - "\x3d\xd3\x86\xa2\xb3\x4c\x9c\x0e\xb8\xab\x5e\xa6\x4d\x97\x14\xfb" - "\x83\xd7\x9f\x43\xca\xd6\x0d\x34\x5d\x61\x38\x84\x4c\xde\xe3\x8a" - "\x99\xef\x81\xda\xd6\x28\xf0\xac\x1a\x1a\x7f\x87\xdf\x00\x98\x25" - "\xe2\xbe\xf0\x37\x43\x8d\xb9\x11\x85\xa6\xec\x0d\x89\xb4\xd7\x5e" - "\x64\x84\x72\x6d\xca\x9e\xaf\x34\x79\xed\x8c\x6a\xca\xda\xbf\x52" - "\x87\x4e\x95\x32\xdf\x7f\x73\x26\x14\x43\xdd\x80\xeb\x5f\x66\xbc" - "\x27\xfe\x4e\x0f\xe7\x73\xcc\xdf\x97\x71\x9d\xc0\x7e\x7b\x60\xbf" - "\x4d\xec\xc7\x18\xf6\xc3\xdf\x26\x48\x9d\xb2\x7f\x93\xf9\xdb\x84" - "\xf9\xff\xf8\xbc\x4e\xb1\x3f\x1d\xf7\xab\x72\xd7\x1d\x70\x25\xe9" - "\xcc\xd7\xbd\xdf\x17\xd7\xf5\xdc\x75\xe4\xff\x50\xaf\xb8\xb6\x51" - "\xc8\x4d\x50\xe3\x78\x47\x14\x42\xf9\x01\x6f\xf4\xb7\x4d\xf0\x97" - "\x82\xb8\xec\x83\xbf\x0a\xf8\xcb\xf4\x63\x4a\x6b\xaf\x0e\x84\x92" - "\xef\x43\x61\x61\x6c\xdd\x38\x9e\x29\x93\x81\xc8\xe3\x1a\xfb\xef" - "\xa6\xac\x03\x79\xe6\xef\xe4\xed\xe9\x39\x7c\x34\xf8\xde\x80\x91" - "\x2b\xf9\x76\x4f\xfe\x8f\xc7\xc5\xb0\xf9\x31\xff\x37\x0d\x1f\xa2" - "\x2a\x4e\xb9\x84\xea\x14\x7f\x73\xab\x80\x36\xdc\xb4\x2d\x2c\x6c" - "\xeb\x6d\x28\x03\x49\xed\x75\xf2\x78\x28\x8b\x6e\xc5\x6b\x71\x9a" - "\x03\xcc\x5e\x3a\xa6\x9c\xa7\x54\xf4\x3b\xf5\x51\xd8\x0b\x36\xd1" - "\xf1\x4f\xb3\x7f\xc7\xe1\xf2\x44\xfa\x4d\xfe\xf6\x12\x0d\xd8\xe2" - "\xbd\xd2\xdb\xc7\x0a\xe1\x3d\xcc\x53\x5d\x07\x9f\x4a\x26\x6d\xa5" - "\xf9\x79\xf1\x3e\xe7\x78\x2c\xce\x88\x54\x94\xda\x24\xb0\xcf\x39" - "\x37\x66\xe7\x6f\xa1\xa6\xdc\xa7\x00\xfb\xbf\x69\xa1\x2d\xaf\xb4" - "\x7c\x67\x21\x2c\x20\xfd\x41\xb1\x73\xd2\x70\xf8\x5b\xa9\x58\x3e" - "\x13\x03\x8c\xb4\xb4\xbc\x3e\x14\xef\xff\x19\x3e\xa8\x38\x72\xbf" - "\xb1\xd8\xd4\x16\xed\x79\x3a\xf9\xba\x44\x6d\xf3\xa1\xe8\xfa\x7f" - "\xc6\x9c\x71\xba\xb6\x87\x06\x15\xe3\xef\x14\xc6\xa5\xd1\xcf\x97" - "\xef\x37\xa0\x03\x4b\x6a\x29\x5c\x1f\x1e\xbc\x56\x48\x45\x8e\x64" - "\x35\x5c\x0d\x52\xe2\x7e\x2f\xac\xe5\xb2\x6e\xa0\xe1\xad\xeb\xa3" - "\x3d\x5b\xdb\xa2\xd1\xdb\x37\xd0\x58\xd3\xab\xbe\xfd\x32\x16\x20" - "\xd7\x16\xa8\x0b\x5b\x7e\x8a\xf7\xfc\xa6\xba\x16\x7d\x0e\xd7\x96" - "\x37\xe8\xd0\x2e\x48\x4b\xff\x14\xdd\xff\x8f\x31\x74\x73\x59\xcc" - "\xc7\x28\x32\xc0\x58\x9c\xf2\x23\xf2\x80\x3a\x51\x59\x91\xb4\x8f" - "\xf9\x9e\xdb\x6b\x0d\xa5\xaa\x30\x5c\x46\x99\x0b\xa0\x2e\x85\xba" - "\x73\xfd\x4b\xd0\x66\x00\x27\xde\xb3\x6c\x33\x16\xed\xe4\xda\x8c" - "\x5f\xa0\xcd\x78\x07\xda\x8c\xf5\xbe\xa8\x3c\xb1\x18\x41\x1d\xd6" - "\x67\x4a\xa2\x67\x73\x4a\x22\xb4\x1d\x6b\xa0\xed\x48\xba\x8c\x98" - "\x76\xa3\xae\x16\x41\x9d\xdf\x3f\x7f\x09\xf2\x6e\xfd\x05\xda\x8e" - "\x5f\xa0\xed\x48\x21\x6d\xc7\x8e\x1b\xd0\x76\x2c\x05\x6f\xb0\x04" - "\xda\x8e\x3a\x81\xb6\xe3\x86\xb0\x2f\x30\xd7\x83\x2d\xbf\x04\x50" - "\x3b\xa0\xdd\x58\xfb\x1d\xa2\x76\xbc\xdc\x47\x22\x67\x0e\x8a\xce" - "\xff\xa5\xb7\x85\x3d\x68\xa2\xa3\x11\x8e\xfb\xda\x66\x68\x87\x01" - "\x97\x8a\x00\x03\xf2\x3c\xdf\x27\xbc\x05\x8e\xb7\x0d\x0c\xd4\xee" - "\xff\x5e\x4f\xd1\x39\x0f\x17\xb6\x00\x6e\x6b\x57\x21\xaa\x0d\x30" - "\x3c\xf8\x82\x96\xc2\x3e\xd1\x94\x1b\x78\x9e\x78\xd2\x8f\x7c\x70" - "\x9f\x88\xa7\x8e\xe0\x66\xa0\xa3\x3d\xe9\x57\xa2\x3d\x32\xe7\x23" - "\x57\xe3\x7f\x7d\xfb\x99\x5e\xf1\x75\x4b\xf9\x0e\x29\xf5\xaf\xc4" - "\x43\xbc\xae\xa3\xcf\xbf\xd5\x52\xbb\x67\x20\x15\x5e\x17\x91\x7e" - "\xeb\x8b\xaa\xdd\x73\x90\x66\xf7\x7f\xd0\xe8\x5d\x33\x90\x3a\xff" - "\x7b\xbc\x7e\x3a\x60\x58\x4b\x37\x9f\x8d\xff\x14\x7f\x63\x0f\xa5" - "\xb7\x05\x6b\x69\x9f\x71\x3a\xf8\xb7\x46\x3b\x03\xfc\x03\x9c\x8f" - "\x0c\x68\x29\xae\x48\x3a\x8b\x32\x2e\x21\x94\x72\x95\xc5\xb8\x1d" - "\xdf\x8b\xc8\x40\x41\xfd\x81\x35\x41\x04\xc1\x17\x7f\xf7\xc2\x9e" - "\xa3\x1d\xe3\x05\x5f\xf0\x75\x01\x8b\xf1\xd9\xba\x4a\x04\x6d\x60" - "\x9f\x76\x7d\xc0\x60\x7c\x11\x99\xb5\x01\x60\xd3\x1f\xb4\x80\x77" - "\xcb\x2d\x2b\x7d\xb0\x5c\xa6\x3e\x60\xfd\x8d\x61\x45\x00\x95\x47" - "\xd1\x68\xfd\x59\x44\x6d\x37\x49\xc5\xf8\xb0\x8e\xa9\x6f\x0b\xee" - "\x0b\x20\x63\x64\x0e\xed\xc0\x58\xe8\x14\x87\xb6\xbf\x14\xe0\x82" - "\xe4\x61\x1f\xa4\xb4\x8f\x7d\xd0\x34\x82\xfd\x11\x2f\x79\xd8\x07" - "\x29\xe9\xb7\xbe\x0c\x91\x87\x7d\xa3\x44\xec\x99\xf5\x25\x7f\xa3" - "\xd8\x17\x56\xf3\xb1\xff\x28\x97\x60\xff\x51\x8e\x13\xd8\x77\x50" - "\xee\x83\xd8\x72\xff\x89\x87\x4c\xec\xa1\xdc\x7f\x99\x2e\x0f\xfb" - "\xeb\x12\xb1\x67\xd6\xa8\xfc\x8d\x62\xff\x71\x15\x1f\xfb\x23\xd9" - "\x04\xfb\x23\x5a\xf9\xd8\xab\x3b\x28\xf7\x6a\xb6\xdc\x1f\xeb\x2b" - "\x0f\x7b\x35\x2e\xf7\x3a\x79\xd8\x5f\x94\x88\x3d\xb3\xce\xe5\x6f" - "\x14\xfb\xa3\xe7\xf9\xd8\x7f\x92\x49\xb0\xff\x24\xc3\x09\xec\x3b" - "\x28\xf7\x6a\xb6\xdc\xff\xbd\x97\x4c\xec\xa1\xdc\x97\x68\xe4\x61" - "\x7f\x52\x22\xf6\xcc\x5a\x99\xbf\x51\xec\xff\xa7\x92\x8f\xfd\xb1" - "\xcd\x04\xfb\x63\xe9\xf2\xb1\x0f\xee\xa0\xdc\x07\xb3\xe5\xfe\xb8" - "\x8b\x3c\xec\x83\xa1\xdc\x97\x68\xe5\x61\xbf\x4e\x22\xf6\xcc\x7a" - "\x9b\xbf\x51\xec\x8b\xca\xf8\xd8\xff\x7d\x13\xc1\xfe\xef\x1b\x1d" - "\xc1\xfe\x0d\x4b\xec\xab\xfb\x84\x83\xb7\x62\x74\xfe\x81\x19\x2c" - "\xf6\x1f\x00\xf6\xf0\xfe\x07\x5f\xde\x6e\xa5\xf1\x3f\x6d\x64\x70" - "\x8f\x01\xdc\x93\x00\x77\xf0\x86\x66\xcc\x01\x23\x0f\x8c\x3b\xc6" - "\x3c\xe5\x22\x52\x7e\x0e\xd7\x62\x7c\x30\xc6\x80\xa3\x8a\xc1\xb9" - "\xf7\x17\x55\xb4\x8b\xab\x37\xc6\x13\xeb\x7e\x8c\x79\x47\xda\x1e" - "\x73\xa2\x43\xcc\xa7\xde\x19\x7d\xdf\x6a\xdd\xff\xd7\x59\x98\x9f" - "\x03\x0f\x97\x22\x15\xf3\x4f\x8b\xf9\x98\x1f\x5f\x87\x71\xd0\x29" - "\x8e\x27\xcb\xc7\x5c\xad\x14\xc7\xdc\xdc\xc6\x9f\xb8\xea\x1c\xe6" - "\x5f\xea\x38\xcc\xd5\x4a\xfb\x98\x5f\x94\x81\x79\xe7\xb6\xef\xdd" - "\x0b\xf3\x13\x47\xf9\x98\xff\x63\x19\xc1\xfc\x1f\x89\x62\x98\x9b" - "\xa0\xbe\xc6\x7d\xea\x78\xfe\x9f\xb1\x29\xfa\xf9\x36\xc0\x15\xcf" - "\x03\xc4\x7d\xbd\x87\x96\x14\x51\x6d\x80\xfb\xd6\xd5\x68\x78\xc6" - "\x6a\x34\xd6\xb3\x96\xd4\xdf\xad\x50\x7f\x6f\xbe\x8d\x5c\x4d\xaf" - "\xf9\xf6\xcb\xb8\x86\x5c\x5b\x21\xc6\xad\xaf\xc5\x7b\x96\xc5\xe8" - "\xd1\xe7\x37\x8a\x28\xdc\x77\x8b\xbf\xdb\xd1\x3f\x47\xf7\x9f\x14" - "\x4b\x37\x97\xd5\xbc\x43\xfa\x55\x2e\x9b\xfb\x55\x0e\xf1\xfa\x55" - "\xde\xbe\xc6\xf6\xab\x4c\x27\x18\xe5\x59\xe2\x33\xe7\xaf\x22\xfd" - "\x2a\xa5\x1d\xf6\xab\x30\xfd\x29\x37\x90\x77\xdb\xd2\xf8\x01\x3b" - "\xd8\x7e\x95\x9d\x4b\x9c\xeb\x57\x69\x5d\x1a\x40\xed\x04\x7c\xde" - "\x98\x0e\xf8\x7c\x2f\x15\x9f\xcf\xa6\x39\xda\xaf\x62\x6e\x63\xcd" - "\xed\x2a\x2e\x73\xb8\x6d\x6d\xce\x09\xcc\xb1\xee\x4b\xc1\xe5\xed" - "\x86\xa2\x38\x0e\xd7\xc9\xf2\xfa\x53\x4a\x6a\x7b\x5a\x7f\x0a\x2e" - "\x73\xe6\x76\xb6\x7b\xb4\xb1\xc5\x21\xfc\xb2\xf7\xd9\x55\xd2\xc6" - "\x7e\x56\xeb\xa8\xbe\x12\xc7\x3c\xc8\xdb\xba\x0f\x85\x60\xfe\xc5" - "\x74\xdc\xe7\x22\xaf\x1f\xe5\xf4\xd8\x9e\xd6\x8f\xd2\xfd\x30\xff" - "\x62\x38\x1f\xf3\xe2\x8b\x04\xf3\xe2\xea\x4e\xc0\x3c\xc7\xba\xef" - "\x84\x60\x5e\x12\x81\xfb\x5a\xe4\xf5\x9f\x9c\x96\xa9\xa5\x7f\xbd" - "\xfe\x93\xee\x87\x79\x89\x2f\x1f\xf3\x2f\xce\x11\xcc\xbf\xa8\x74" - "\x1e\x73\xb5\xb7\x75\x9f\x09\xc1\xfc\xab\xf1\x58\x7b\xc9\xeb\x37" - "\x39\x5d\xd3\xd3\xfa\x4d\xba\x1f\xe6\x5f\xb9\xf3\x31\x2f\x39\x4d" - "\x30\x2f\x29\xe9\x04\xcc\x73\xac\xfb\x4a\x08\xe6\xa5\x63\x70\xdf" - "\x8a\xbc\xfe\x92\xaf\x7a\x5c\x7f\x49\xf7\xc3\xbc\x14\xf1\x31\xff" - "\xea\x38\xc1\xfc\xab\x22\xe7\x31\x0f\xf6\xb6\xee\x23\x21\x98\x7f" - "\x3d\x12\xf7\xa9\xc8\xeb\x27\xf9\x2a\xa3\xa7\xf5\x93\x74\x3f\xcc" - "\xcf\x34\xf0\x31\x2f\x3d\x44\x30\x2f\x3d\xe8\xa8\x67\x36\x7b\x65" - "\xb3\x3f\x66\xbc\xb2\x37\x68\x76\xab\xbe\x11\x82\x77\x99\x0f\xa3" - "\xd9\x65\x7b\xe5\x92\xda\x9e\xd2\x3f\x62\xc6\x1a\xfb\xe5\xee\xe1" - "\x95\xbf\xb1\xfa\xfe\xf9\x75\x3e\xf1\xca\x5f\xe7\x89\x61\x2d\x34" - "\x16\xa1\x1c\xbc\xa6\x79\x2c\xc2\xe6\xd5\x80\x23\xf0\x00\x8f\x45" - "\xc0\x63\x12\x84\xc6\x23\xe0\x71\x08\xe6\x31\x09\x96\xe3\x11\xc2" - "\x75\x74\x33\x1e\x93\x80\x7d\x72\x59\xcc\x16\x64\x1e\x9b\x80\xc7" - "\x20\xac\xff\x11\x79\x60\x8c\xf0\xf8\x03\xec\x97\xef\xf4\x18\x84" - "\xed\xa6\xee\x30\x06\xe1\x6c\x6a\x47\x5e\x39\xe2\xc0\x50\x04\x7c" - "\x6b\xef\xa7\x6a\xdb\x16\xa8\xc5\x65\x0e\x63\xe4\x59\x47\xca\xe1" - "\xa1\x97\x0b\xa9\x8a\xa4\x22\xb4\x79\x2d\x52\x9a\xfb\x2f\x70\x19" - "\x84\x7a\xd9\xd3\x00\x78\x66\x2c\x22\xfd\x18\xa6\x9f\xa3\x3d\xf4" - "\xaf\xc5\xe3\xb9\xfa\xca\xcf\xff\x59\x48\xe1\xbe\xc7\xdd\x0b\xd0" - "\xe8\xf7\xae\x20\x4d\x79\xc3\x45\xc4\x94\xa9\xdc\xc0\x52\xb8\xb6" - "\xb0\x2d\x77\x9c\xce\xe4\x13\x78\x54\xef\x13\x58\x84\x71\xcb\xb8" - "\x86\x10\x2e\x5f\x18\xb7\x8a\xa4\xfc\x76\xbc\x18\xac\x28\xb6\x6f" - "\x43\xb4\x4c\x7d\x2b\x1b\xb3\xbc\x1b\x80\xd9\x52\x3e\x66\xf9\x72" - "\xfb\x37\xcc\xe3\xb9\x97\x06\x50\xf9\x50\xa6\xd6\x4e\x05\xcc\x5e" - "\x90\x8a\x59\x85\xe8\xfe\xef\xe2\x98\x05\x29\x1d\xc3\x2c\x68\x5a" - "\xc7\x98\x7d\x19\x62\x8b\x59\x50\x38\x5c\x1b\x42\x30\x0b\x1a\xad" - "\xf7\x09\xd2\x70\x98\x35\x3a\x88\x99\xb5\x87\xfd\x2d\x61\x56\x29" - "\xba\xff\xbb\x1d\xcc\x1c\x2c\x67\x41\x0e\x94\xb3\x2f\xd3\x05\x30" - "\x83\x72\x16\xc4\x96\xb3\x20\x28\x67\x41\x16\xe5\xec\xba\x83\x98" - "\x59\x7b\xd0\xdf\x12\x66\xdf\x8a\xae\xff\x2d\x8e\x99\xda\xc1\x72" - "\xa6\x76\xa4\x9c\xe9\x6c\x31\x53\x43\x39\x53\xb3\xe5\x4c\x0d\xe5" - "\x4c\x6d\x51\xce\x2e\x3a\x88\x99\xb5\x87\xfc\x2d\x61\x76\x5e\x7c" - "\xfe\xb7\x38\x66\x0e\x96\x33\xb5\x03\xe5\xac\x44\x23\x80\x19\x94" - "\x33\x35\x5b\xce\xd4\x50\xce\xd4\x16\xe5\xec\xa4\x83\x98\x59\x7b" - "\xc0\xdf\x12\x66\xff\x14\xdd\xff\x51\x1c\xb3\x60\x07\xcb\x59\xb0" - "\x03\xe5\xac\x44\x6b\x8b\x59\x30\x94\xb3\x60\xb6\x9c\x05\x43\x39" - "\x0b\xb6\x28\x67\xeb\x1c\xc4\xcc\xda\xc3\xfd\x96\x30\xfb\x97\xe8" - "\xfe\xef\x62\x98\x31\x78\x81\x76\x14\xc4\xac\x95\xaf\x1b\x0d\xa0" - "\xe3\xf1\x37\x2f\x41\xbc\xde\xfa\xa2\x8a\x4e\x73\xf5\xc6\x58\x61" - "\x3d\x88\xf1\xaa\x48\x3a\x8d\x84\x74\x23\xfe\x2e\x06\xb8\x23\xfc" - "\x6d\x6c\xfd\x65\x09\x7a\x71\xbe\x18\x56\x1d\x7f\x0f\xcb\x5b\xc2" - "\x61\x65\xfe\x1e\xd6\xa9\x58\x7d\x2b\x15\xab\x0b\xb1\xf2\xb0\x52" - "\x2b\x3b\xc6\x4a\x3d\xcd\x3e\x56\x5f\xea\x38\xac\x2e\x5a\x60\x65" - "\xdb\x8e\x39\x8e\x95\x55\xfb\xf5\x9b\xc2\xea\xdf\x4a\x31\xac\x0c" - "\xde\xe3\x74\x78\xce\xfb\x14\xf0\xbe\xf4\x2b\xd1\xcf\x67\x5d\x42" - "\xc3\xb7\x5c\x42\x63\xf1\xfc\xe6\x43\x6b\x9b\x29\x78\xc7\x9f\xbe" - "\x3e\x5f\x8b\xda\x7e\xf6\xed\x87\xe7\xcf\x30\xf5\xe4\x6b\xbe\x6e" - "\x15\x31\x7a\xa6\x4e\xcc\x04\x8c\xca\x1b\x8a\x20\x26\x7d\xc2\xcb" - "\x1b\x3e\x46\xad\x2b\xa2\xd1\x37\xd5\xd7\x00\x17\xba\xad\xa2\xae" - "\x08\xed\x86\xf3\xc5\xab\x3f\x46\xa6\x9f\x03\xfa\xcd\x4d\x42\xd4" - "\x0d\xc5\xbf\xcf\x63\xef\x3c\x2a\x09\x29\x27\xd7\xd1\xcd\xe5\x75" - "\x5f\xa3\xf7\xe6\xa3\xe1\xa7\x93\x10\xc2\xb1\x66\xbc\xf2\x22\xec" - "\x95\x4f\xf2\xf0\xd9\x69\xe1\x95\x99\xf9\xb2\x89\x80\xcd\x4d\x2b" - "\x6c\xc0\x8b\x43\xac\xfb\x4c\x69\x00\x6c\x1a\xcc\xd8\x5c\x47\x29" - "\xcb\x30\x36\x3a\xce\x2b\xb3\xd8\xe4\xe1\x3a\x2f\xd1\xc2\x2b\xdf" - "\xb0\xc0\x86\x9d\xab\xca\xc3\xc6\xdc\x97\xf1\x7a\x00\xfe\x46\x6e" - "\xe3\x95\xe5\xf5\x65\x54\x8b\xce\x15\x61\xca\x11\x94\x91\x29\x50" - "\x8e\x92\x57\x32\xe5\x88\xc4\x7f\x60\x20\xf0\xbd\x10\x79\xea\xfa" - "\x84\x6f\x01\x0c\x5a\xa1\xac\xe1\xb6\x68\x3d\xbc\x27\xc6\x12\xe3" - "\x36\x65\x7f\x5b\xdb\x9c\x06\x44\x41\x9d\x75\x1e\x63\x67\xfc\xd9" - "\xd7\x2d\x0b\xda\xaa\x8a\x59\xdf\x03\x3e\xf5\xa8\x42\xcf\x62\xb3" - "\xf6\x7b\x74\x43\x71\x31\x9e\x7e\x2d\xa0\xdf\xc3\xc0\x53\x68\x7b" - "\xf0\x7a\x75\x2e\x50\xef\x15\xbe\xb7\x00\x69\x26\x27\xd2\xcd\xcc" - "\x58\x1e\x28\x63\xb8\x3d\xc3\xf5\x61\x79\xe2\x17\xc8\x98\x1b\x78" - "\xb4\xcd\x67\x9c\xee\xf4\x4a\x84\x70\x9d\x88\xb1\xe8\xb5\x8a\xc3" - "\x0e\xcf\xdb\xb3\xec\xeb\xb0\xa9\x0b\x17\x7d\x2d\x5c\xbe\x66\xe9" - "\x24\xf5\x77\xe4\xb1\xe5\x2b\x4f\x6e\x7f\x87\xb9\x3f\x0a\x30\xc4" - "\x73\xf5\xd6\x7f\x87\xa8\x9d\x92\x31\xfc\x8f\xe8\xfe\x27\xe2\x18" - "\x06\x29\x3b\xc6\xb0\x89\xc5\x30\x68\x5a\xc7\x18\xfe\xa0\xb6\xc5" - "\x30\x28\x84\xc3\xf0\xcb\x10\x0e\xc3\xa0\x70\x82\x61\xd0\x68\x0e" - "\xc3\x20\x4d\xc7\x18\x5a\x79\xe9\xdf\x14\x86\x3a\xfb\xfd\x1f\xc2" - "\x18\x3a\x50\x0e\x7f\x31\x63\xe8\x40\x39\xd4\xe9\x05\x30\xb4\x28" - "\x87\x5f\xa6\x5b\x60\xc8\x96\xc3\x20\x8b\x72\x18\xe4\x40\x39\xb4" - "\xf2\xd6\xbf\x29\x0c\x7f\x6c\x96\x8e\xa1\xda\x81\x72\xf8\x03\x8b" - "\xa1\xda\x81\x72\x78\xe9\xa8\x2d\x86\x6a\xcb\x72\xa8\xe3\x30\x54" - "\xb3\xe5\x50\x6d\x51\x0e\xd5\x0e\x94\x43\x2b\xad\xf2\x9b\xc2\xf0" - "\xbf\xa2\xfb\xbf\xdb\xc1\xd0\x81\x72\xf8\xb9\x19\x43\x07\xca\x61" - "\x4d\x92\x00\x86\x16\xe5\xb0\x44\x63\x81\x21\x5b\x0e\xd5\x16\xe5" - "\x50\xed\x40\x39\xb4\xf2\xde\xbf\x29\x0c\x2f\xdb\xef\xff\x17\xc4" - "\x30\xd8\x81\x72\xb8\x9e\xc5\x30\xd8\x81\x72\x78\x65\xac\x2d\x86" - "\xc1\x16\xe5\xb0\x44\xcb\x61\x18\xcc\x96\xc3\x60\x8b\x72\x18\xec" - "\x40\x39\xb4\xf2\xe2\xbf\x29\x0c\x7f\x12\xdd\xff\xca\x12\x43\xd0" - "\xd9\xb6\xba\xb4\x81\xc3\xd0\x12\x3f\x6b\x2d\x1a\x09\x1a\x15\x63" - "\x37\xcb\x80\x28\x5b\xfc\x7e\x32\x60\xfc\xd4\xf8\x7b\x5c\x23\xa7" - "\x49\x19\xec\xd8\xef\x39\x18\xb3\xd3\xe0\x42\xb1\x3e\x35\xeb\x51" - "\xfc\x4d\xb5\x5d\x8f\xc6\xfd\xff\xaa\x47\xaf\x22\xe9\xd8\xb1\xed" - "\xa0\x28\x76\xfc\xb6\x2f\x12\xda\x44\x71\xec\xae\x16\xd9\x62\xa7" - "\x0e\xe1\xb0\x23\xed\x1e\xc1\xee\x4b\x9d\xb9\xfd\x23\xd8\xb1\xed" - "\x9f\x5d\xec\x7e\xcb\xed\xdf\x35\xd1\xf6\xcf\xb8\x01\x51\xf9\x1b" - "\x4c\x85\x5a\xca\x54\x04\xbf\x62\xf8\x95\xc2\xb1\x5e\x70\x8c\x99" - "\x1f\x04\xff\x67\xce\x99\xfa\x31\x6b\x81\x15\x7b\xba\xc4\xe0\x3d" - "\x3d\x70\x9a\xde\xe6\x34\x9e\x69\x28\x74\x37\x9b\x07\x1c\x4f\x85" - "\xe3\xc5\xfd\x5d\x42\x7b\x43\xfa\x52\x3a\xeb\x6f\x38\x6d\x1f\x9c" - "\x96\x4e\x73\x25\x63\xe5\x28\x0a\xe7\x61\x7d\x4f\x37\x36\xcd\x60" - "\xcb\xfb\x7a\xa4\x85\xe2\x75\x40\xcc\x69\xfa\x9a\xa8\x1f\x0a\x70" - "\x3a\x93\x8b\x2b\x5e\x1f\x5b\x65\x99\x96\x9e\x80\x70\xbe\xe6\xb4" - "\xfd\xd8\xfc\x86\x5b\xa6\x31\xfe\x15\xa1\xfe\x2e\x2a\x26\xcf\xfe" - "\x89\x14\x7e\x27\x9c\xf6\x1e\xba\xff\x01\x15\x93\xde\xc5\x35\x80" - "\x97\xfe\x2d\xc4\xa4\x65\xd3\xb9\xd3\xbd\xff\x6f\x25\x9b\x8e\xd9" - "\xe3\x13\x8e\xb9\x5a\xc6\x8f\x4d\xe7\x61\x8e\x0d\x5e\x6f\xdc\xf2" - "\x5d\x8d\x1b\x28\x9c\x1f\x4e\xd3\xdf\xd4\xfb\x2b\x1d\xfb\x2e\xa3" - "\x2d\xef\x89\xd3\xc1\x75\x8f\xb0\x71\xf6\x84\x77\xd0\xb4\xe7\xa7" - "\xad\x4f\x37\xa7\x5b\x6f\x44\x83\x76\x73\xb1\x51\xd2\x59\x1f\xce" - "\xc2\x6b\x08\x5a\x63\xd7\xdf\xc5\x45\x87\xb1\xab\xa8\x43\x08\xa7" - "\xa5\xfb\x7f\xa8\x84\xf4\x5e\xec\x7b\x84\x92\xf7\x60\xd6\x5b\x21" - "\x58\x53\x86\x7b\x77\x31\xcf\xea\xa2\x62\x9f\x75\x00\xa4\x0b\x33" - "\xe7\x6b\xa2\x98\x7e\x0c\x36\xad\x2b\x93\xb6\x3c\x01\xaf\xa9\xdf" - "\x9e\xfe\x5e\x9c\xd6\x98\x75\x5c\x6d\x4c\x73\x0d\xb7\xce\xdf\xb8" - "\xc1\x0d\x9f\xb7\xcc\xdf\x9b\xa4\x3f\x14\x06\xe9\x27\xdb\xa6\x57" - "\x5a\xa7\xf7\x21\xe9\x3f\x0a\x85\xf4\x51\xb6\xe9\x0d\x03\xac\xd2" - "\x0f\x24\xe9\x8f\x8c\x85\xf4\xd3\x6c\xd3\xab\xac\xd3\xff\x8e\xa4" - "\xff\x87\x0a\xd2\x47\xdb\xa6\x0f\xb5\x4e\xef\x4b\xd2\x7f\xa2\x81" - "\xf4\xb3\x6c\xd3\xa7\x5a\xa7\x1f\x44\xd2\x1f\x1b\x0d\xe9\x63\xac" - "\xd3\xef\x66\xd2\xa2\x07\xd8\xb4\x7e\x24\xed\xdf\x43\x20\x6d\xac" - "\xc0\xbb\x2a\xd8\xbc\x43\xd8\xf4\xf7\x91\xf4\x1f\x1e\x85\xf4\xf1" - "\xb6\xe9\x5d\xad\xd3\x0f\x26\xe9\xbf\x9e\x06\xe9\x13\x04\xb0\xb2" - "\x4e\x3f\x84\xa4\xff\x2c\x0f\xd2\x27\x0a\x60\x65\x9d\x7e\x28\x49" - "\x5f\xac\x85\xf4\x2b\x05\x62\x6f\x9d\xfe\x7e\x92\xfe\x8b\x8d\x90" - "\x3e\x49\x20\xf6\xfc\xf4\x59\x25\x49\x90\x2e\x79\x17\xcb\x4d\xab" - "\xb8\x5b\xe7\x3d\x8c\xe4\xfd\x55\x02\x5c\x93\x6a\x9b\x1e\xb9\x90" - "\xf4\xe8\x51\x36\xfd\x03\x24\x7d\x69\x0c\xa4\xdf\x28\x10\xfb\x07" - "\x71\xfa\xdd\x24\xed\x83\x24\xed\x49\x6f\x48\x9b\x2e\x10\x77\xcb" - "\xb4\xc3\x49\xda\x2a\x04\x69\x33\x04\x62\x6e\x99\xd6\x9f\xa4\x3d" - "\x5b\x0a\x69\xb5\x02\xf1\xb6\x4c\xfb\x10\x49\x5b\x91\x0c\x69\x73" - "\x04\x9e\xf7\x01\x8b\xb4\x23\x48\xda\x73\x98\x57\xdb\x05\x70\xb1" - "\x4c\x1b\x40\xd2\x5e\x38\x08\x69\xf3\x04\x30\xb1\x4c\x3b\x92\xa4" - "\xfd\xb6\x06\xd2\xee\x11\xc0\xc4\x32\x6d\x20\x9d\x75\x7e\x3b\x5b" - "\x4f\x17\x58\xa7\xdd\xc5\xd5\xbb\x41\xa6\xfe\xff\x9c\xcc\xd6\x95" - "\xcc\xfa\x9e\xf4\x06\xbc\x96\x5d\xfb\x7b\x3d\x66\x6e\x23\x4c\x14" - "\x52\xd3\x59\x65\xa1\x70\x1d\xce\xf3\xa0\x6d\xdd\xe6\xfa\xd8\x2e" - "\xae\x8d\x08\xa6\xb3\x7e\xca\x60\xef\x5f\x68\x9b\xd6\xcd\x32\xed" - "\xc3\x74\x56\x75\x03\x9b\xf6\xa8\x6d\x5a\xa5\x65\xda\x51\x74\xd6" - "\x7f\x8a\xd8\xb4\x45\x02\xf5\xeb\xa3\x16\x69\x43\xe8\x2c\x5d\x32" - "\xa4\x3b\x21\x54\xbf\xd2\x1b\x54\x8f\xe2\xfa\xc0\x5c\x77\x43\xfa" - "\x47\x48\x7c\xaf\x86\x43\x7c\x99\x39\x7d\xe6\xb4\x80\xc3\xa3\x16" - "\x6d\xe5\xa3\xa6\xfe\x97\x42\xd9\x98\x95\xd8\x3e\x43\xaa\xe5\x33" - "\x3c\x46\xf2\xac\x71\x85\x3c\x4b\xad\x9f\x81\xad\x8f\xb0\x4e\xc0" - "\xf1\x1d\x6d\xcc\xba\x5c\x8a\xe3\x0b\x69\xcb\x78\x1a\x81\x72\x51" - "\xe0\x3c\x59\x6c\xc7\xd0\x59\xff\x8e\x66\x63\xc0\x6b\x8f\xa0\x3c" - "\x32\xf5\x21\xe0\x5b\x4a\xbf\xf5\xbb\x32\x48\xfb\x38\x9b\xee\xbc" - "\x75\x3b\xc8\x3e\xdf\x13\x70\xae\xaa\xbd\x0d\x74\x71\xad\x16\xd2" - "\x32\x89\x81\xe8\x9e\x6b\x8a\x06\xa2\x31\xda\xf7\xd5\x6a\x64\xea" - "\x1c\x53\x81\x5f\x4c\x64\x03\x6d\xb0\x3c\xb6\x95\xa2\x2b\x47\x35" - "\x20\x57\xbc\x06\x1f\xed\x13\xe6\xab\x83\xe3\x7a\xff\xfb\x42\x9a" - "\xb2\x1a\x86\xeb\x5c\xbe\x50\xe2\x35\x99\xe0\xdf\x21\x3a\xf4\x1a" - "\xb3\x1f\xca\xd6\x0d\x74\x33\xde\xa7\xc0\xf8\x4e\x7d\x54\x85\xa9" - "\x0e\xaf\xa5\xd8\x0c\x79\x34\x5f\x49\x44\x0a\xbc\xa7\x1c\x5e\xd7" - "\xb5\x22\xa9\x0e\x5d\x51\x34\xac\xa2\x97\xc6\x8f\x85\x67\xd0\xc2" - "\xfd\x62\x2f\xc1\xff\x49\x4c\x41\xfb\x6a\xeb\x13\x8a\x97\xe3\xf5" - "\xe9\x1a\x4e\xea\x7d\x22\xb4\xf4\x9b\x33\x6b\x13\x53\xd0\xfd\xf0" - "\xdc\x27\xcc\x6b\x51\x31\xeb\x4f\xfd\x12\xff\x34\x59\x7b\xaa\x71" - "\xa2\xc9\xab\x3e\xc1\x66\xed\xa9\x3d\xd3\x43\xc8\x7a\x56\x8d\x4c" - "\xde\xf0\x6c\x95\xf4\x70\xbf\x70\x53\xeb\xc6\x54\xbc\xff\x5b\x71" - "\xca\x35\x74\x89\x3d\x87\xf3\x64\xf3\xf2\xc1\x79\xe0\xbc\xcc\xf9" - "\xe0\xeb\xf4\xc3\xa6\x87\xe0\x77\x87\x38\x84\x3b\xbe\x7e\x55\xa3" - "\x2b\x5e\xbf\xca\xf1\xf4\x0d\x27\x70\x7a\xe1\x75\x79\x41\xe3\x64" - "\xd7\xa7\x37\x65\x35\xe6\x81\x56\x35\x90\xb8\x37\xee\xd7\xb9\x28" - "\x62\xd9\x7f\x1f\xd5\xb9\xf4\x66\xf1\x68\x2c\xd6\xb9\x1c\x4b\x64" - "\xff\x5d\x66\x5e\x2f\x4c\x30\x5f\x65\xfd\x2c\x88\xf7\x4a\xd3\x7b" - "\xd1\x6e\x58\x5b\x93\x75\x4b\xeb\x67\xa9\x86\xe2\xf5\x9c\x6f\x47" - "\xc1\x3d\x57\x92\xb8\xdc\x1e\x09\x7f\x3d\xd9\xbf\x7a\xf6\x2f\x8d" - "\xd3\x30\x5c\xf2\x9e\x18\x4e\x6b\x83\x34\x64\x2f\x98\xdb\xcc\x5a" - "\x65\x0c\x76\x80\x2f\xed\x15\xa4\x61\xf2\xcd\x8d\xd0\x5a\x3e\x03" - "\x36\x4b\x21\x8f\x3c\xfa\xd8\xe8\x31\x8f\x3f\xa1\x79\x72\xde\xfc" - "\x57\x62\xe3\x16\xbc\x1a\xbf\xf0\xff\xb1\xf7\x3e\x70\x51\x56\xd9" - "\xc3\xf8\x99\x3f\xc8\xa8\x28\x03\x91\xa1\x99\x8d\x86\x85\x25\x3a" - "\xb5\xb6\x6b\x2e\x26\x25\x16\x26\x08\x29\x15\x25\x0a\x24\x28\x24" - "\xea\x04\xa8\x68\x28\x38\x6a\xd9\xa6\x32\x10\x19\x26\x02\x16\xbb" - "\x6b\xad\xfb\xcd\xfd\x7e\xdd\x77\xdd\xf7\x63\xdb\x14\x64\xd4\x0a" - "\xc3\xee\xd7\x3e\x2f\xbb\xaf\xbb\x4d\x7e\xc9\x25\xbf\xa8\x53\x8c" - "\xce\x24\x33\x73\xdf\x73\xee\x7d\x1e\x66\xe6\x61\xb0\x7a\xb7\xf7" - "\xfd\xfe\x3e\xbf\xb7\xd1\x87\xe7\x79\xee\x3d\xf7\xdc\x73\xcf\x39" - "\xf7\xdc\x73\xef\x73\xff\x3c\xb3\xa6\x78\xed\xba\xf5\xa6\x67\x4b" - "\x4a\xcb\x36\x6c\xdc\x54\xbe\x79\x0b\xc1\x0d\xd2\x7b\x30\x59\xe5" - "\x54\x03\xca\xee\x41\xca\xe7\xb7\x3c\x6f\x0c\x13\x72\xbe\xda\xa2" - "\x35\x84\xf6\xe1\x6d\xa8\xf1\x74\x9e\x47\x9f\xc6\xa5\xa2\xf3\x45" - "\x50\xcf\x54\xb6\x86\x87\xad\x74\x86\x59\x8f\xe6\xaa\xb3\xd3\xf1" - "\xb0\x95\xce\xdc\x6b\x8d\xed\x85\xb8\x29\x74\xce\xd9\x55\x3b\xc5" - "\x37\xdd\x0e\x40\xab\x57\x42\xe1\x9c\xa2\x87\xd8\x97\xc7\x31\x47" - "\xdd\x38\xd6\x47\xf8\xeb\xf6\xb3\x5e\xc7\x73\x85\xb0\x0f\xdf\x51" - "\xd7\xf5\xe7\x35\xae\xdf\xb6\x4e\xe4\x67\x12\x4d\x6c\xdc\xcf\x7a" - "\x76\x8e\x63\x3d\x3b\xf6\xb3\xbe\xa6\x71\xcc\x1e\x57\x07\x11\xae" - "\x7d\xae\x42\xbb\xe6\x2a\x97\x4d\x35\xc6\xfb\xc6\x5e\xcd\xad\xc6" - "\xb8\x99\x1e\xd0\x34\xe1\x3b\x86\x39\x5b\x0d\x82\xee\xb7\xbf\x72" - "\x87\x21\xbe\x54\x36\x50\xac\xda\x87\xf9\x08\x99\xb8\xfe\xd2\x86" - "\xad\x3f\xe6\xe7\xb0\xb9\xcf\x81\x5d\xe3\xea\x6e\xba\xca\xf3\x8b" - "\xb4\xd5\xf7\x01\xe1\xfb\x97\x12\x77\x58\xe9\x04\xe6\x41\xd8\x13" - "\xbe\xe7\x8a\x55\x08\x53\x87\xb8\x9d\x81\xe5\x89\x5f\xb5\xb6\xcc" - "\xb0\x6e\x43\x71\xf1\xb4\x51\x10\xcf\xef\x10\x78\xfe\x5e\x19\xe2" - "\x83\x97\xf7\xb3\x36\x2c\xa7\x15\xcb\xdb\xde\x81\xbd\x05\xd4\x0f" - "\xc0\x32\x59\xce\x6b\xdc\x09\x18\x7e\x12\x9f\x4f\x22\xed\xed\xfc" - "\x3c\x2f\xed\xc8\x27\xd9\x3e\x57\x0f\xd2\xd9\x4e\x67\x14\xd0\x7e" - "\x8a\xfd\x9b\x32\x55\x58\xee\x3a\x84\x6b\x37\x4c\x80\xa9\x98\xee" - "\xb7\x48\x47\x0b\x3e\x13\x7c\x1e\xc9\x11\xe1\xdb\x78\xb9\xb4\x23" - "\x17\xd2\x3b\xf2\xca\x7a\x68\x1c\xdb\xe3\xda\xe7\xb6\xd0\x7e\xab" - "\xfc\x8c\x18\x7c\x47\xbe\xb4\x23\xac\xa5\xbf\x32\x53\x45\x67\x55" - "\x36\xf9\x71\xe6\x12\x4d\x44\x07\xf5\x5d\xff\x88\x9e\xa0\x6f\x20" - "\x0b\x12\xdc\xa0\xfa\x63\x0f\x40\xc3\x7e\xd6\x8c\x57\x03\x5e\xf5" - "\x1f\x63\xdc\x47\x78\xb5\x63\xf8\x69\xbc\x7f\x8c\xf7\x8f\x7a\xf8" - "\xb7\xd0\x58\xa2\xbb\xb4\x82\xf5\xce\xac\x87\xdb\xf8\x59\x98\xdb" - "\xe0\x89\x73\x5a\xdd\x31\xa2\x9d\xf6\x56\x66\x63\xbf\x8e\x0b\xde" - "\x03\xf6\x5a\x3d\x60\x3c\xde\x8f\xf2\x7b\xe0\xa5\xb9\xe6\x04\xcd" - "\x40\x8c\x78\x1e\xc8\xc6\xf7\x9d\xd2\x33\x5a\xc4\x81\x8a\x6f\xbc" - "\x94\xf8\x86\xbb\x34\x03\xbd\xdf\x1a\xf6\x5b\x5d\x23\xe3\xbe\x5d" - "\xbe\xde\x66\xd0\x60\x5d\xd6\x82\x31\x38\x0e\x74\x22\x0c\xdb\x2b" - "\xfe\xae\xb5\x8b\x7b\x58\x04\x5e\xc8\xa7\x11\x88\x7f\x44\x8a\x08" - "\x1b\x91\x89\xf7\x06\xbc\x8e\x04\xe7\x3f\x12\xd3\x8f\x4c\x24\x79" - "\x0e\xa0\xbd\x27\x59\xda\x35\x6e\x27\xc9\xa8\x5a\xe8\x96\x8a\xe6" - "\x3b\x60\x98\x03\x75\xab\x61\x50\x7f\x34\xd7\x3e\x0f\xd6\x9f\x6b" - "\x5d\x0a\xfd\xb1\x90\x3d\xc2\x74\x89\x4d\x42\x5f\x4e\xf6\x3f\x97" - "\x8f\xef\xd7\xce\x20\x9e\x93\x86\x15\x84\x63\x80\xf7\xc9\xaa\x2f" - "\x00\x8c\x29\x04\x2d\xd9\x97\x3e\xcd\xc0\x54\xd2\x59\xca\x5b\xca" - "\x57\xd0\x82\xf4\x61\x58\x33\xd1\xb7\x1e\xf1\xe2\x7b\x0b\xc2\x35" - "\xdb\xe0\x2b\x99\x36\x9e\xe6\x67\xcf\xa0\x3e\x4a\xf4\x12\x4e\x4a" - "\xc7\xfc\xe5\x72\x50\x1a\x29\xef\xbf\x60\xb8\x11\x6d\x14\x54\x7e" - "\x09\x1a\x9b\xc7\x0e\xa4\x93\x74\xb7\x79\x8c\x58\x97\x52\xc0\x47" - "\x6d\x5d\x2c\x18\xb1\xbe\x8d\x3c\xa7\x19\x38\x39\xa3\x02\x8c\x84" - "\x8f\x6c\xb8\x5d\x33\x50\xd5\x44\x75\x51\xe0\xfa\x13\xf0\xbd\x17" - "\xdd\x8e\x8f\x4d\xc0\xf3\x69\x24\x7a\x30\x3e\x20\xdf\x3a\x1b\xf6" - "\x82\xaa\xb7\x88\xb2\x62\x5e\x2d\x98\xfe\x18\x95\x9d\xf8\x89\xf1" - "\x27\xce\x6b\x3c\xb1\x14\x47\xe7\xab\x48\xe5\x69\xa1\xb5\x19\xc4" - "\x0f\x82\xa7\x33\x21\xc5\x9e\xb2\xee\xb9\x9c\x6f\x98\x9e\xe4\xc1" - "\x30\x0f\xc2\x51\xe9\x61\x1e\x86\xf6\xe8\x8d\x2d\x74\x8e\x80\xb7" - "\x26\x58\x3e\x1e\x53\xa0\x7c\x30\xdd\x31\x4c\xdf\x46\x6d\x30\xd9" - "\x13\xcc\x33\x92\xce\x40\xc3\x30\x8b\x6f\x1f\xe2\xd8\xe8\xe6\xe3" - "\x40\x88\x67\x3b\xd2\x62\x21\x3c\x48\x4f\x9b\x84\xeb\x24\xed\x37" - "\x19\x28\x6b\x09\x5f\x0b\xc9\x9c\xd7\xe7\x2d\xbc\x4c\x68\xbb\xbc" - "\x8f\x36\x8a\xb8\x13\x08\x73\x82\xa1\xc8\xd9\x73\x59\xd2\x59\x6b" - "\x3c\xee\x78\xe5\xd7\x5c\xbe\x6d\xe2\x9c\x42\xef\xb3\xa5\x5b\x59" - "\xaf\x9f\x6e\x6f\xbc\xbc\xaf\xba\x44\xf7\x71\xca\x8f\x6d\xca\xe6" - "\xed\x28\xe5\x41\xe9\x25\x7c\x5a\xc2\x27\xf3\x6a\x06\xd2\x21\xf8" - "\xe5\x99\x8d\xe1\x2d\xa4\x8b\x9c\x6f\x68\x47\xfb\x2b\x49\x17\xbd" - "\xd3\x31\xfd\xc9\x7d\xf4\xbe\x89\xde\x3d\x56\x6e\x63\x07\xe3\x3d" - "\x65\x14\x6f\xeb\x45\xb9\xad\x41\x5d\xf2\x01\xdc\x16\x03\x46\xa7" - "\x99\x97\xed\xa8\xf3\xb9\x64\x55\xab\x07\x80\xe8\x44\x1e\x9d\x40" - "\x5a\xcf\xa0\xed\x8f\x21\x5a\xd1\x5e\x1f\x67\x6f\x64\x01\xd1\x8c" - "\xf6\x4c\xa2\xcf\xb7\x40\x92\xfd\x71\x2a\x23\xf1\x73\x86\xb0\x7d" - "\x18\xc7\xbe\x20\xda\xfd\xe5\xf6\x19\x02\x79\xcc\xcb\x8d\x72\x20" - "\x79\x91\x5c\xfc\x38\xbd\xa4\xfb\x16\xc4\x75\x54\xbc\x0b\xdd\x20" - "\x5e\x5b\xc6\xb1\xd3\x04\xef\x87\x65\x4f\x52\xdc\x36\xcc\x7b\xa6" - "\x89\x9f\xef\xa6\xa2\xbd\xf1\x11\xef\x51\x3a\xef\x13\x71\xd0\x19" - "\x9c\x28\x73\xf6\x6b\xd2\x47\x7c\x3f\x2d\xd1\x7d\x14\xdb\xf3\xe9" - "\x78\x25\xfa\xeb\x3f\x3b\x14\xac\x5f\x3e\x65\xfd\x27\x79\x5b\x7c" - "\x95\x29\x20\x9d\x75\x6c\xb8\xa4\x61\xf7\x49\x6d\x87\x24\x6b\xb6" - "\xb7\x15\xeb\x8b\x1f\x07\x8b\x51\xc8\xfa\x04\xd7\xc7\x4d\xa9\x2a" - "\x2a\x33\xa6\x3d\x21\xf0\xf8\x78\x99\xb9\x3e\x99\xb9\x0e\x9c\x66" - "\x9b\xb0\x9c\x83\x7a\xe0\x33\x49\x72\x3e\xad\xe0\x89\x6c\xbb\x4e" - "\xd2\x39\x5d\x64\x93\xd0\xc7\xbd\xdf\x35\xe0\xb7\x4b\x24\x7b\x1f" - "\x97\x3d\x8b\x6d\x12\xed\xad\x64\xb7\x7c\x22\x7e\x5c\x90\x0e\x53" - "\x99\xd2\xb8\xfe\x12\x2d\x95\xd9\x44\xcb\x09\x4e\x47\xa5\x01\x30" - "\xae\x8d\xf2\x47\x5c\x19\x52\x7d\x95\x71\xc5\x11\xae\x1d\x68\xab" - "\x88\x26\xcc\xfb\x18\xb7\x7f\x0f\x51\xbb\x0c\x53\x25\xda\xdb\xdd" - "\x66\x4a\x3b\x10\xfb\xb5\x9a\xa7\x6d\x47\xb8\x3d\x6e\x71\xce\xc1" - "\x28\x4c\x7f\xc4\xf0\x34\xc1\x6b\x77\x92\x8d\x36\x3c\xc5\x9f\xd7" - "\x1a\x1e\x47\x5d\xbd\x00\x5a\xc4\xa7\x23\x1d\x95\xf5\xa2\x4f\xab" - "\x5d\x4e\x7d\x06\xe4\xf5\x51\xf4\x91\x8e\x10\xbf\x49\x97\xd1\x47" - "\x9a\xe5\xaa\x85\x3d\xb2\xde\x62\x3e\x0d\xc4\x7b\xe1\x63\xc0\x9f" - "\x50\x8f\x4f\x0c\xea\x16\xbe\x4b\x7c\x3c\x82\x7c\xd4\x61\x7e\x8f" - "\x4a\xe5\x3a\x82\xf0\x7a\x7c\x7f\x40\xa2\xbd\x5e\x82\xbf\x28\xcb" - "\x41\xaa\xab\xa7\xf7\x91\xfd\xe5\xfe\x87\x6a\xa7\x94\xb6\x45\xe4" - "\xa5\xda\x25\xc3\x92\x8f\xc8\xcf\x2c\xc3\x30\xb2\x83\x33\x51\xf6" - "\xdc\xf6\xd1\x59\xb8\x52\x18\xd5\x1d\x91\x87\x36\x81\xeb\x21\xfa" - "\x3d\x83\x7a\x54\xab\xca\x56\xd8\x27\xb2\xc5\x96\xce\x9d\xe2\x4c" - "\x08\xd2\x25\xb2\xa9\xd4\x37\x41\x7c\xb3\xa4\xfa\x23\xd1\xac\xfa" - "\x28\xd8\x4f\xd2\x8e\x47\x5d\x49\x08\xc0\x7d\x22\x54\x3b\xd7\x24" - "\x6c\x60\x83\x48\xa3\x1e\x29\x95\xed\xa8\x28\x9b\xf4\x4e\x7c\xdb" - "\x46\x7c\xd3\x74\x04\xf0\x11\xf9\xa6\xb9\x4f\x82\x3f\x41\xb6\x7c" - "\xb0\xbe\x6a\xd5\x1b\xe4\xba\x3c\xc4\x5e\x68\x35\xd3\xa8\x3e\xf8" - "\xe9\x52\x67\x28\xec\xc5\x89\x90\xf6\x42\xab\x36\x48\xe5\x6d\x56" - "\xd4\x8d\x16\x51\x37\xa4\xb6\x05\xe5\xd0\xe9\x94\xcf\xe6\x70\xcf" - "\x25\xfb\x49\x79\x07\xb6\x41\x8d\x82\xaf\xa2\x2e\x6b\x35\x37\x0e" - "\x95\x83\xba\x27\xb0\x3e\x93\xac\xc9\x26\x10\x0e\x92\x29\xf7\x2b" - "\x31\x4c\xc8\x55\x4d\xfe\xad\x25\xd0\x46\x23\x6c\x9d\x8f\x61\x7d" - "\xd1\xaa\x7b\x83\xea\xa2\x56\x9d\x29\xd5\x45\x39\xef\xdf\xa3\x8c" - "\x8c\xfe\x7c\x35\xd9\x8a\x7c\x49\x36\x6d\x7c\xef\x65\x2e\x1f\xcd" - "\xcf\xe5\x36\x8d\xe0\x31\x6d\x39\xa6\xb1\x28\xda\x47\x0b\xd1\x87" - "\x79\xe9\xb8\xcd\xda\xcf\x6d\x45\xb9\x8b\xd3\xa3\xa9\x6b\x92\xda" - "\x09\x0c\x33\x4a\x61\xb9\x52\x5b\x22\xeb\x4d\x98\x82\x26\x47\x48" - "\xff\x08\xf1\xcb\xfe\x11\xc7\x35\xc0\x71\x39\xa5\xf2\x51\x58\x82" - "\x08\x53\x9d\xa4\xb0\x7d\x82\x0f\x75\x6c\x13\x0f\xcb\x95\xda\x2b" - "\xaa\x5f\x6a\xbb\x16\xba\xa8\x8e\xd1\xbb\x5d\xab\x4d\x21\xfc\xb6" - "\xaa\x6b\xd4\x87\xa8\xc7\xb8\x62\xb2\x07\x64\x2f\x0c\xab\x84\xdd" - "\x30\x2c\xe6\xf7\x57\xc8\xee\x90\x1f\x42\xf1\x08\x97\x4d\xb6\x08" - "\xc3\xdf\x34\x3c\x82\x7e\xc1\x7f\xea\x10\xaf\x76\x8f\x94\xf6\x1d" - "\xee\x2b\xfc\x67\x8a\x46\x0e\x93\xd3\x61\x5d\x5f\x4b\xe9\x28\xbd" - "\x6c\xbf\xc8\x76\x79\xc8\x36\xf1\xfc\xc2\x54\x92\x8e\xf3\x7e\x83" - "\xec\x17\x0d\xa8\x03\x60\xe9\xbc\x02\x6e\xd3\xc2\x52\x85\x3d\x0b" - "\x9b\x4b\x69\xb9\xfc\xd0\x56\x6e\xfb\x9a\x7d\xd6\x54\x02\xda\xc6" - "\xaf\xb8\x8f\x95\x28\xe8\x0c\xab\x17\xe5\x08\xcb\xe3\xe5\x10\x36" - "\xd5\xc2\x69\x41\x98\xc6\x6b\x3c\x6e\x2b\x95\x85\xe2\xaa\x03\xe2" - "\xe8\xcc\x10\x8c\x3b\xc0\xe9\x52\xa4\xf3\x0d\x14\x0e\x81\x6f\x12" - "\x67\xdf\x92\x3e\x48\xb6\x77\x44\xac\x44\xe7\x27\xb2\xdd\x45\xbe" - "\xe4\x93\xed\xe5\x71\xab\x24\x98\xc5\xd2\x9d\xdb\xf7\x11\x61\x82" - "\xaf\xb1\x6a\x89\xdf\xc5\xa2\x1c\x23\xc6\xf3\x7e\xf6\x7f\x66\x21" - "\x6f\xc3\x3c\x32\x6f\x03\x9f\xa9\xfe\x60\xfe\x7a\x7a\xe7\x7a\x5f" - "\xc1\xfb\xb0\x0d\x04\x43\x34\xf1\x36\x42\xab\x75\x2a\x7d\xea\xf3" - "\x5a\x5d\x0d\xb5\x4b\xdc\x57\xd5\xea\x9e\x95\xc6\x80\xc0\x5a\xf2" - "\x3a\xb6\x0b\x23\x4e\xca\x36\x86\xb9\x52\x80\xf6\x2c\x47\x5a\xde" - "\xa1\x30\xda\xe3\x3e\x10\x86\xec\xd3\xdb\xd7\xec\x12\xce\x11\xf5" - "\xb2\xdd\x20\x5b\xd2\xe9\x3c\x27\x7c\x3a\x6d\x78\x4a\xa3\x64\x4b" - "\x2e\x69\xc3\x17\x06\xf9\x61\xf8\x1e\x6c\x33\x74\xcb\x95\x36\x03" - "\xfd\xe6\x9d\xae\xda\xf0\x89\x41\x7e\x00\x86\x5d\xdf\x76\x8c\x70" - "\x50\x1d\xa5\x33\x8b\xb8\x7d\x2a\xe1\x79\xfd\x46\xa6\x99\xec\x66" - "\xff\x73\xd2\xf8\x85\x56\x97\x46\xbe\x9a\x22\xbf\x3d\x41\xb6\x93" - "\xf2\x93\xf1\x69\x81\xce\xbd\x41\x3e\x7c\x45\x38\xb3\x25\x3b\xdf" - "\x1c\x64\x2b\xa5\x36\x8c\xec\x64\x50\x5b\x85\xef\xc1\x6d\x95\xee" - "\xbe\xa1\x36\x52\xa7\xfb\xf6\x6d\x55\xb8\x9d\xec\x96\x6c\x23\x83" - "\x6d\x81\x2e\xa2\x31\xd0\x97\xd5\x86\xd7\xc9\xbe\xac\xdf\x8e\x86" - "\xc7\x91\x8d\xc2\xfc\x4f\x48\x79\xef\xb4\x6b\xae\xee\x96\xf3\xb6" - "\xa3\x9c\x3b\x0d\xa8\x9b\xfb\x5c\x0e\x7c\x2e\x94\x7c\x40\x5e\x37" - "\xaf\xd1\xd9\x1f\xda\xb0\x63\xa8\x7f\xa3\x48\xcf\xac\xeb\xbe\x82" - "\x1e\x7f\x5b\xd1\xd6\xbf\x5e\xe6\xef\xc8\x1b\x03\xfd\xc2\x43\xfb" - "\xd9\x6e\xcc\xa7\x2f\xb0\x8c\x7b\x31\xac\x5a\x1a\x43\xe0\xbc\x25" - "\x5c\x5a\x9d\xb5\x69\x7f\x70\xd9\x44\x39\x74\x4e\x2a\x07\xf5\x89" - "\x30\xff\xe3\xe4\xf7\xd0\xb9\x65\x58\x6f\x66\x37\xc9\x3a\x8f\x7e" - "\xd1\xd7\xe6\x40\xff\xca\x5d\x47\xb6\x52\xea\x7b\xb6\xa3\xbf\x13" - "\x34\x26\x96\x36\x3f\xc3\x60\x2a\x29\x5a\x57\xb6\xea\x1e\x43\xd1" - "\xba\xa2\xb2\xa2\xbc\xe2\xa2\x2d\x79\x65\x45\xeb\xd7\x4d\x5f\x9b" - "\xb7\xba\x68\xa5\x61\x53\x5e\xa9\xc1\x58\x3e\xb5\x7c\x14\xf8\x41" - "\xe7\x18\xf2\x4a\x4b\x37\xac\x2d\xc8\x37\xac\x2b\x5a\x99\x50\x52" - "\x50\x5a\x50\x66\xc8\x2b\x59\xbf\x61\x5d\xbe\x61\x6a\xfe\x8c\xa9" - "\xc6\x1f\xe7\x8f\x0a\x1c\x43\x9b\xa2\x87\x3e\xdf\xd5\x2f\x7a\xab" - "\xaf\x82\x2e\x52\x65\x2a\x89\x2c\x2f\x5a\xc7\xc7\xed\xb4\xa3\x96" - "\xcf\xac\x03\x13\x9d\x39\x4e\xe7\xcc\xb2\xda\x91\x26\xbc\x6b\x09" - "\x0e\xcb\x69\x68\xa2\x73\xc7\xc7\xb1\x89\xae\xda\x51\x06\xbb\x76" - "\xac\x8e\x9f\x21\x8b\xe1\x58\xb6\x89\xec\xea\x47\xbd\xe8\xb3\x99" - "\x68\x7e\x76\xd3\x55\x88\xb1\x6c\x04\x2d\x5e\x11\x78\xe9\xe9\x4c" - "\x72\x4c\x93\x69\xd7\x8e\xe6\x63\x92\x76\xed\x28\xa7\x23\x2a\xbe" - "\x97\x59\xe2\xc5\xf9\xe3\xda\x51\x5f\xca\x63\xcd\xe9\xbb\x20\x9d" - "\xf4\xf3\x9c\x76\x94\x83\xcb\x0a\x75\x99\xc6\x5f\xfb\xff\xf0\x60" - "\x12\xfa\x83\x67\xad\x13\x78\xdc\x97\x4e\x35\x44\x20\x5d\xda\xd6" - "\x0a\x23\xbc\x8c\x79\x95\xc6\x32\x86\x79\x9c\x90\xc7\xd3\xe8\x9c" - "\x78\x2c\x4b\xb7\x54\x8e\x83\xbc\x1c\xfb\x59\x5c\x5d\x34\xd2\x57" - "\xcb\xe9\xe9\x91\xcb\x80\x74\x77\x23\x4d\x29\x74\x4e\x3c\xd1\x15" - "\x6a\xac\x8f\xc6\xbb\xce\x6b\x47\x27\xf8\x36\x22\xdf\x26\x89\x73" - "\x8f\xaa\x1b\x45\xfd\xc3\x72\xe5\x37\xe1\xf3\xbe\xaf\x20\x62\x2f" - "\x9d\xbd\x6d\xbe\x95\x75\x38\x3d\x60\x2b\xec\x86\xc8\xcd\xcc\xc1" - "\xfe\xdb\x17\xbd\xa2\x4c\xa3\xb3\xc8\x36\xfc\xdb\x33\xdd\x5a\x2a" - "\x13\xb6\x15\x11\x74\x8e\xf3\x30\x63\x8b\xda\x97\xc7\x31\x27\x3b" - "\x18\xe8\x73\x8d\x7e\x8f\x78\x42\xfe\x56\x3f\xb6\x53\xae\xda\xd1" - "\x47\x30\x6f\x90\x7c\x63\x27\x1b\xc8\x0e\xf0\xa5\x46\x93\x9e\x39" - "\x87\xc1\xad\x93\x71\xd3\x99\xde\x94\x46\xc8\x3f\x22\x01\xd3\x38" - "\xfc\xf8\x23\x74\x4a\xfc\x84\x13\x9f\x1d\x72\x3e\xbc\x1f\xae\x1d" - "\x4d\x3e\x81\x03\x75\xd9\x31\x4c\x7e\x71\xb5\xfb\xd9\x19\x1b\x86" - "\x57\x7f\x0d\x5a\x84\x3d\xd3\xb4\x9f\xe3\x2f\xb4\x6b\x47\x9e\x26" - "\xfc\x3b\xc6\x01\xec\x44\x98\xfe\xda\xd1\x40\xe3\xbb\x18\x87\xf5" - "\xdf\xe5\x56\x8e\x5b\x4b\xfa\x3c\x47\xa1\xcf\x49\xb5\xe4\x13\xd6" - "\x21\x7e\xd4\xa1\xea\x2b\x40\x7d\xed\xd3\x33\xea\x20\x9e\xf2\xc1" - "\xe7\x2e\x1a\x0f\x41\x9c\xdd\x72\x7e\x0c\xf5\x7f\x9f\x4f\x8c\xc1" - "\x48\xba\x35\xdd\x56\xde\x4b\xdf\x27\x58\x2b\xda\x77\xa2\x91\x74" - "\xcc\x55\x3b\x26\x42\xd6\x29\xd4\xf5\x33\x5c\xaf\x62\x20\x9e\xd5" - "\x46\x58\xe8\x8c\x6f\xd2\xab\x46\xd4\x27\xd2\x2b\x84\x9d\x2d\xeb" - "\x14\xea\x5a\x17\xc1\x21\x0d\xa3\x8e\x6d\x49\xd2\x92\x8d\xec\xd1" - "\x8e\xf9\x35\xe9\x18\x7b\x75\x51\x37\xbb\x69\x99\x38\x8b\x1d\xc3" - "\x6c\x6e\x21\x03\x3f\xdf\xc7\x54\x05\xf0\xbd\x0b\xf5\x78\x14\xf1" - "\x99\x8f\x55\x23\x3c\xd2\xd6\xc5\x7d\xf1\xad\x28\x03\xde\x56\x8d" - "\x29\xa6\xf4\x12\x0f\x4f\xfb\x79\x38\xa6\x3d\x14\x0f\x15\xbc\xe3" - "\xe7\x46\xb3\xda\x31\x67\xa8\xae\x60\x1a\x8f\x7c\x66\x74\x28\x59" - "\x62\x1e\x5a\x6d\x1d\xe8\x28\x8f\xb6\x18\x82\x1f\x3b\x5d\xce\xa3" - "\x1a\x79\xed\xa8\x2c\xbc\xae\x3e\xb7\x35\x03\xd0\x98\x38\xa5\x8f" - "\x8b\x21\xfe\x8e\x2d\xf6\xa7\x67\x4e\x65\xfa\xa9\x2b\x83\x68\xe5" - "\x17\xab\x1d\x5b\xf5\xb2\x74\xa6\x36\xa6\x3f\x7a\x3d\x7a\xe3\x0c" - "\xa2\x9d\xb4\x4e\x21\xfd\x1e\xfb\xb9\x0d\x3d\x03\x0a\x93\xde\xcf" - "\xf4\x63\xdb\xa3\x1c\xdf\x1f\xf6\x7b\x83\x36\x72\x6a\xd0\xf7\x06" - "\x6d\x64\xcc\x70\xdf\x1b\x82\xf3\x8d\xcc\xa3\x7c\x7d\x4d\x99\x2a" - "\x7f\xde\x91\xa9\xbe\x10\x79\xcb\xe9\x67\x34\x07\xf4\x67\xb4\x91" - "\xbf\x21\x1a\x3a\xb1\x9d\x62\x37\x67\xaa\x18\xe2\x69\xe3\xbe\x45" - "\xe4\x31\xe1\xbf\x90\x5f\x14\x69\x21\x18\x65\x39\x06\x7f\xba\x18" - "\xb2\x1d\xf0\x35\x7f\x09\x7b\x08\x68\x65\x12\x18\x0a\xe5\x68\x75" - "\x10\x30\xb0\x10\x2f\x11\x00\x93\x39\x3c\xc3\x9f\x08\x92\xde\x1d" - "\xfc\x45\x3b\x08\x3f\x18\xff\x4f\xfc\x46\x0a\x7a\x39\x3e\x37\xa8" - "\xa4\xfc\x76\x07\x40\x24\x5f\x27\x35\x03\x39\x49\xa8\x1f\x79\x99" - "\x55\x99\x61\x88\xef\x08\x07\x66\xcc\x23\xe1\x97\xdf\x59\xe0\x3b" - "\x85\x04\xbf\xe3\x4f\x93\x1d\x90\xc1\xad\x9a\x7c\x3e\xcd\x2a\xce" - "\x3e\x18\xa4\x6e\xd6\x07\x66\xa9\x87\xaa\x30\xfe\x10\x49\x7f\xdc" - "\x88\x2f\x1e\xe3\x27\xb7\x0f\x02\xdc\xe0\xdc\x1e\x00\xfe\x47\x41" - "\xfe\x6d\xb1\xd7\x29\xe3\x77\xfd\x4d\x0a\x78\xbe\x55\xdc\xa6\x74" - "\x7f\x8f\xf8\xaf\xff\x33\x74\x8d\x94\x1f\xfd\xea\x71\x5b\x6e\x28" - "\x50\x3f\xff\x6f\xb3\xca\x41\x81\x1a\xea\x8f\xbf\x23\x31\xf8\x3d" - "\xde\x1d\xfc\x7e\x57\xca\x3f\x4f\x38\xd6\x41\xfa\x53\x69\x8f\x02" - "\xb8\x33\x66\x30\x30\x52\x51\x65\x22\x2d\x8a\x2a\xe4\xff\x49\xd4" - "\x68\x90\x9e\x86\x80\x60\x6d\x68\xe8\xff\x33\xbf\x09\xdb\xa5\x0a" - "\x71\xab\x43\x3f\x24\x72\x9e\x22\x8c\xde\x47\x18\xa4\xb0\xbb\xdf" - "\x1b\x02\xcf\xc3\x0c\x01\xef\xaa\x24\xfc\xd3\x0c\x30\xb5\xf8\xfb" - "\xa0\xf5\x87\xdf\xff\x83\x3f\x15\xd5\x8f\x1f\x7e\xff\x87\x7e\x4c" - "\xb4\xe2\x68\x89\xf8\x8d\xfe\xb1\x41\x43\xc9\xa4\x08\x26\x05\x30" - "\xe9\xe1\x7b\x69\xc7\x7f\xf8\xfd\xf0\xfb\xe1\xf7\xc3\xef\x87\xdf" - "\x0f\xbf\x1f\x7e\xff\x3f\xf8\xa9\x78\x3f\x82\x49\xbf\xc1\xe7\xc1" - "\x78\xea\x06\x15\x36\x30\xb5\x0a\x58\x40\x44\xd5\xbd\xa0\xd2\xc1" - "\x08\xed\xf7\xe7\xe5\x19\x06\x09\xfa\x96\x09\xe8\xac\x81\xbb\xf1" - "\xfa\x11\x5e\x37\x07\x84\x4f\xf9\xbe\x28\xfa\xa7\x7f\x2a\x64\x9e" - "\x06\xfb\x85\x61\x30\x02\xc2\x41\x07\x23\x61\x14\x8c\x86\x08\x18" - "\x03\x63\xb1\xbf\xa9\x87\x28\x88\x86\x1b\x20\x06\x6e\x84\x71\x70" - "\x13\xc4\xc2\x78\x98\x80\x25\x99\x08\xb7\x60\xdf\xfe\x56\x64\xc8" - "\xe4\xd0\x65\xa9\x82\xa4\x58\xfc\x83\xff\x33\x20\x89\xbf\xe7\xfe" - "\x10\xfe\x7f\x35\xdc\x2a\x85\x77\x49\xe1\xf6\x1f\xc2\xff\xaf\x86" - "\x1b\xfe\x8b\xef\x93\xff\x4b\xef\x2a\x34\xd9\xc2\x6a\xab\x42\xda" - "\x4a\x65\xa8\x4a\xfa\x0d\xbe\xc3\x37\xa4\x1f\x82\x2f\x38\xbd\xf2" - "\x97\x84\xd7\x2c\xf1\x58\x09\x20\xc6\x79\x59\xe0\xcf\x33\x5c\x4a" - "\xf9\xb7\xbd\x07\x2f\x07\x5e\x08\xb9\x1d\x5b\x18\xf3\x68\xbc\x6e" - "\x94\xf1\x08\x18\x1d\x5e\x97\x30\xfe\xd3\x16\x00\xfb\x59\xbc\x30" - "\xdb\xcf\xca\x01\xce\x45\x00\x7c\x9e\x0a\xf0\x1f\x47\x01\xce\xf7" - "\xf9\x71\xf6\x57\xf9\xa9\xfb\xd2\x24\x9e\x0d\x78\x5d\x25\x44\x60" - "\x57\x0d\x0e\xef\x59\x17\x64\xa6\x18\xee\x9e\x31\x6b\xc6\xbd\x3f" - "\xca\x33\x24\x24\x18\xee\x31\xde\x7d\xf7\x4c\xe3\x8f\x67\xde\xfd" - "\x13\xc3\x3d\xf7\xcc\xb9\xdb\x38\xc7\x68\x34\xac\xdd\x5c\x52\x74" - "\xb7\x71\x75\x81\x61\x5d\x7e\x51\xa9\x61\x55\x51\xc9\xda\x4d\x79" - "\x25\x05\xdf\x54\xac\xef\xfa\x23\xf2\x6e\xf1\x01\x97\x40\x30\xb7" - "\xe7\x01\x2d\x23\xd6\xc6\x3b\x60\xa8\x78\xe2\xa5\x2b\xe4\x6f\xed" - "\x53\x8f\xff\x75\xea\xb2\xb1\xef\x3f\xb0\x7a\xea\xdc\xf9\x6f\x54" - "\x1f\x03\xb5\x11\xaf\x78\x13\xa8\x27\xe5\x83\x3a\xfa\x2c\xa8\xc3" - "\xba\x41\xfd\x8c\x05\xd4\x4f\xcf\x02\x75\x56\x04\xa8\x53\x0b\x41" - "\x3d\x2f\x65\x68\xd8\xe6\x24\x11\xf6\xab\x62\x50\x1f\x36\x80\xfa" - "\x95\x6c\x50\xbf\xe0\x16\x61\xef\x61\xd8\xef\x74\xdf\x2f\x33\xfe" - "\xe9\xdf\xb7\xf5\x23\x86\xfc\xec\x5c\xd7\x30\xbd\xb6\xe0\x4c\x88" - "\xc1\xd2\x1f\x7e\x3f\xfc\x7e\xf8\xfd\xf0\xfb\xe1\xf7\xc3\xef\x87" - "\xdf\xff\xc7\x7f\x0e\x15\xcc\xfa\x4a\xad\x85\xf7\x2d\x00\x2e\xb3" - "\x6e\xa2\x5d\x75\xdf\x2c\x9a\x5b\x02\xb4\x86\x0a\x74\x7c\xdf\x15" - "\x71\x69\xf1\x16\x86\x0d\xff\x08\xbc\xc2\x75\x81\x73\x54\x68\x0e" - "\x52\x6b\xac\x11\x34\xb1\x20\xe6\x4b\x99\x59\x97\x58\x6f\x7c\x0f" - "\xf4\x81\x8e\xef\x39\x40\xeb\x46\x11\x7f\xb9\x1d\xde\x6a\x96\xe7" - "\x57\xc9\x70\x34\xbf\x8a\xe6\x63\x21\xec\x5a\x82\x1d\x66\x3e\x8d" - "\x9e\xbd\x1a\xab\x9e\x7f\x08\x80\xd6\x9f\xbe\xbc\x9f\x39\xda\x2a" - "\x00\x5a\x5b\xc4\x3a\x54\x9a\x6b\x83\xf8\xbb\xed\xb0\xbb\x45\xcc" - "\xaf\x62\xce\x1d\x18\x8e\x61\x7d\x76\x78\xb1\x4e\xca\xb3\x4f\x0e" - "\xb7\xed\xbc\x0a\x6d\x06\xbe\xce\xc6\xd1\x66\xf0\x42\xf2\x64\x2a" - "\xff\xc8\x58\x84\x9d\x38\xdc\xdc\x1a\x79\x1e\x19\xe5\x2d\xc1\xa7" - "\x28\xf2\xc3\x32\x8e\xcc\x96\xf3\x1b\x06\x47\x04\xa5\x95\xf1\x20" - "\xed\x7d\x98\xc6\x22\xe3\x41\x7a\x64\x1a\x1d\xc9\x5b\x79\x1e\x47" - "\x43\xd1\x64\xf8\x20\x31\xac\xe0\xc7\x33\x7b\x12\xcf\xac\x8a\x33" - "\xdc\x78\xf7\x82\x82\xb8\x3b\x98\x31\x72\xfa\x4b\xc6\xd1\x49\x23" - "\x93\xc6\xce\x5c\x62\x54\xeb\xd5\x53\xd4\xc6\x68\xbd\xfa\xf6\xa7" - "\xe9\x6f\xd7\xa4\x78\x7e\x37\x68\x13\x77\xe6\xff\xd8\x10\x3e\xef" - "\x85\xe7\x37\x26\xfd\xee\x97\x0f\x25\x3d\xfc\x78\xe9\xb4\xf7\x8d" - "\xea\x1b\xfe\xfc\xd2\x3b\xf1\x5f\x11\xc4\xe4\x29\xf4\x37\xbb\x55" - "\x13\x33\xcd\x4c\x58\xba\xc6\x1b\xde\xa7\x90\x3b\xb5\x89\x65\xf9" - "\xf7\xce\x6c\xa1\x1c\x1f\x5b\x99\x60\xa6\x34\x0f\xa5\x89\x34\x02" - "\x62\xe6\xf1\xc0\xb8\x19\xff\x4a\xa9\x0d\x9c\x06\xd0\x0a\x5c\x83" - "\xb8\x6f\x12\x14\x8a\xd0\x29\x1d\xc6\x5b\xa4\xbc\x5f\xa7\xbf\x4f" - "\xbd\x31\x43\x8d\x18\xa2\x13\x1e\xa4\xd8\x99\x2e\xa3\xcb\xd0\x96" - "\xa8\x5d\x1d\x17\x1f\x7e\xf7\x2f\xf1\x29\x6e\x75\x9c\x5e\x8d\xcf" - "\x2f\x88\x67\xe2\x41\xfe\x4f\x04\x84\x5e\x3d\x35\x26\x31\x3f\xff" - "\xc7\x9f\x3a\xf3\x7f\xac\x57\x27\xb5\xe4\x27\x26\x8d\xdb\x53\x7c" - "\x57\x5c\x62\x5c\xfe\xbd\x7a\x35\xbf\xcf\x49\x9a\xfa\xb3\xa7\xf4" - "\xea\x3b\xde\x33\x46\xe9\x55\x1f\x36\xab\xe0\x03\xf5\xd2\xa3\x1f" - "\x68\x3e\xf9\xe4\x14\xdc\xb9\xf6\x94\xea\xce\xd4\x53\x6a\x55\xd4" - "\xa9\x88\x27\xe1\x43\x7d\x38\x7c\x18\x8b\x97\xe1\x61\x68\x57\x55" - "\x66\xb4\xab\x37\xe5\xb6\x6b\x2a\x3b\xdb\xb5\x4f\x40\x7b\x58\x4e" - "\x54\xfb\x88\x87\x1f\x6d\x0f\x7f\xe2\xb3\x76\xdd\x1d\xd0\x3e\x12" - "\xa0\x7d\x32\xa8\xdb\xa7\x40\x4c\xfb\x3d\x51\xcf\xb7\x3f\x3c\x49" - "\x6d\xbd\xa1\xff\x01\xeb\x04\xed\x43\xd6\x38\x3d\x58\xa7\x8e\x02" - "\xeb\xed\x11\x11\xd6\x3b\xf0\x9a\x06\xcd\x56\x23\xbe\x27\xc2\x44" - "\x6b\xd8\x96\x11\x00\x82\x96\x53\x06\x80\x53\x93\x61\xde\xa9\x29" - "\x78\xbf\x0d\xaf\x38\xbc\xa6\xe2\x75\x07\x5e\xd8\x7f\x39\x45\x7b" - "\x0b\x41\xfc\x88\xc4\xff\xf6\x5e\x5e\xde\xac\xbc\x7b\x33\xe7\x6b" - "\x34\x05\x71\x30\x1a\xb9\xa6\x4d\x8c\x9b\x1c\x36\x3b\xac\x20\xee" - "\x53\x67\x12\xfe\xd5\xab\x97\xff\xbb\x66\xc4\x4c\xd7\x6c\x57\xee" - "\xef\x3e\xf5\xc2\x28\xe4\x3f\x28\x75\xb8\xdf\x0c\x2a\x27\xd2\xe8" - "\x34\xf7\x3f\xe0\x32\x47\xe8\xed\x30\xb2\x50\xd6\x63\x11\xf7\xbe" - "\xde\x69\xae\x42\xfd\x8b\x98\x1e\x3a\x6e\x3b\xc5\xa5\x5c\x27\x5d" - "\x7e\xe8\x38\xd2\xe9\x88\x2a\x39\xae\x5f\xdd\x9a\x81\xef\xa8\xff" - "\xba\xd9\xc1\xb0\x56\x8d\xd3\xac\xda\x8e\x71\x47\x87\xe2\xb1\x22" - "\x9e\xe4\x9f\x61\x5c\x7b\x88\xb8\x47\x9c\xe6\x25\x94\x47\x8f\x22" - "\x0f\xa7\x9c\x07\xad\xef\x6e\xc4\xfa\x45\x76\xc7\x67\x1e\x79\x82" - "\xd2\xda\xdc\x0e\x68\xf1\xf5\xaa\xb4\xe5\xa7\x81\xf0\xb8\xcc\x63" - "\xe2\xe4\xf4\x04\x47\xfb\x11\xd0\xba\x3c\x3e\xff\x13\xc6\x3c\x46" - "\xf3\x3f\xf7\x21\x0e\xc3\x46\xd5\x4d\xe7\x20\xc2\x4b\x69\xec\x30" - "\xa6\xd0\xa9\xfe\x18\xf3\x1e\x93\x2b\xdb\x39\x0c\xe3\x73\xa8\x29" - "\x0f\x2c\x7b\x15\xc6\x55\x0c\xa5\xf9\xe3\x68\xc1\x97\x31\xf5\x72" - "\xdc\xf5\xe6\x14\x8a\x34\x8c\x39\xcd\x1f\xfb\x30\xcd\xe9\xa1\xf8" - "\x58\x95\xd3\xac\x7e\x1e\xe3\x7a\x43\xc4\x6d\x17\x79\x8d\xd5\x86" - "\x88\x33\x63\x9c\x1a\xe3\x0c\xc3\xc4\x69\x30\x2e\x31\x54\x5c\x5b" - "\x03\xc7\x99\x35\xc8\xf3\xb1\x63\x92\xf0\xbd\x50\xe6\xf9\x37\x97" - "\x87\xe4\x7d\x37\xf2\x7d\x6c\x83\x12\x3f\xe1\x76\xaa\x3b\x08\xdf" - "\x89\xa1\x79\x9f\x56\x39\xcd\x29\xa8\x0b\x63\xcf\x0c\x8d\xfb\xe3" - "\xcd\xc8\x07\xa2\xcb\x11\x22\x6e\x22\x96\x07\xed\x75\x64\x44\x08" - "\x9c\x23\x30\xce\x8e\x71\xf1\xdf\x20\x0f\x3d\xb7\xe1\xb4\xff\xc1" - "\x24\x08\x3b\x0f\xd1\x73\xa9\x3c\x42\x2f\x60\xc4\x79\x88\xea\xe8" - "\x17\x73\xe1\x1d\x86\x2d\xa0\xc1\xf7\xc3\xcc\x6c\xbd\x11\xe3\xfb" - "\x50\x9f\x74\xb6\xab\x1e\x38\x0f\x91\x7b\x10\x46\x43\x6b\x57\xa9" - "\x7d\xc2\x70\x8d\xcd\xed\xa1\xf5\x1b\xa8\x67\x91\xbf\xc1\xbb\x1a" - "\xd3\xf1\x75\x31\x4b\x1b\x20\x8e\x68\xe4\xf3\x57\xcd\x56\x15\xcd" - "\x07\xa5\xf6\xd0\xa9\x86\x3b\x9c\x5c\x67\x23\xb1\xfd\xd3\x35\x4b" - "\x73\x77\x89\x06\x2d\xa6\xdd\xaa\xd6\xf3\xb9\xe0\x0e\xc4\x45\x34" - "\x3c\xea\x33\x5b\xd5\x83\x78\xd4\xd6\xd1\x34\xaf\xb7\xdf\xac\x5e" - "\xe8\x54\x47\x32\x81\x47\x6f\x90\xf1\x10\x1c\xe6\xc5\xe7\xc7\xf7" - "\x9b\xb5\xb5\x01\x30\xc9\x81\x79\xcd\x74\x82\x86\x68\x3e\x07\xfa" - "\x06\xca\x4f\x2a\x23\x9f\x6b\x6b\xdb\xe8\x01\x1b\xfa\x17\xe7\x41" - "\x5f\x8e\x65\x35\xb4\xba\x69\x8d\xb3\x35\xaa\x69\x1b\x00\xaf\x17" - "\x6a\x30\x48\x38\xeb\x65\x9c\x84\x23\xa0\xac\xd1\x22\x7f\x2a\xab" - "\x0e\x24\xd8\xb6\x40\x1a\x09\x2f\x96\xeb\xa6\x46\x84\x6b\x43\xaf" - "\x45\x82\xe9\x95\x61\x02\x64\x30\x59\xa2\x8f\xf8\x43\x32\xcb\x96" - "\xeb\xa7\xcb\x1c\x85\xed\xff\xe8\x5e\x51\x6f\xfd\xe1\x12\x0d\xb1" - "\x82\x06\x15\xd2\xa0\xb2\x0a\xfc\x51\x29\x32\x7e\x3b\xe8\xdd\x81" - "\x34\x37\x72\x58\xfd\x48\x51\x4f\x39\x6c\x99\x1f\x36\x32\x08\x16" - "\x79\xa1\x16\x32\x00\xb5\x1d\xa2\xf2\x91\x1f\x1a\x84\x39\x86\xf2" - "\x36\xc8\x30\x52\xf9\x63\x31\x6e\x9e\x84\xaf\x2d\x00\x5f\x19\xe1" - "\xa3\xf9\xb0\xc2\xf6\x46\xd9\xfd\xb6\x0f\xda\xf1\xdd\x31\xd4\xbe" - "\x52\x7d\x8d\xd6\x21\x5c\x1c\x85\x9b\xa6\x80\xfe\x02\x44\x7d\xde" - "\xaf\xd6\xf4\x0a\x5e\x44\xa3\xfd\x1b\x33\xe8\xdb\xe0\xfb\x2c\x3b" - "\x18\xdc\x52\x7e\xf9\xc4\x1b\xbf\xbd\xa5\x3c\xa3\x33\xe5\x3c\xe5" - "\xf8\xc0\x3a\x93\x34\x72\x26\xfa\x27\x49\x6f\x25\x4d\x4c\x9a\x24" - "\xfb\x2e\x73\xdb\x56\xc5\xcd\x74\xce\x6d\x33\xdc\x6b\xfc\x79\x41" - "\xdc\x74\xde\xf6\xdf\x71\xce\x38\x05\x5b\xf7\x3f\xf3\xbf\xb5\x14" - "\x12\xc7\x43\x30\x9c\x9e\xa7\xd0\xb3\xe4\x2f\xe0\xd3\x63\x4b\x35" - "\xe1\x53\x4b\xe8\x49\x78\x0e\x49\xe3\x56\xac\xd4\x24\x4b\xcf\x63" - "\x45\xcc\x5d\xdc\xe7\x88\x7f\x90\x9e\x6f\xe7\xb8\x66\xb6\x50\xce" - "\x33\x5e\x32\xfe\xf4\xf1\x7f\xd3\x9c\x7a\x7e\x4d\x52\xc4\x1d\x66" - "\x82\x99\xbe\xc8\x78\x10\x43\x5a\x29\x64\xca\xeb\x9c\x82\xc0\x54" - "\xc7\x29\x95\x14\x3f\x71\xfa\x02\xe3\x2b\xcb\x96\xde\xf6\x67\x63" - "\xf4\x0d\xef\x67\xb7\x52\xfa\x1b\xa2\x83\x72\x9a\xe2\xa7\xea\xe9" - "\xea\x69\xbb\x7e\xf4\x73\x81\xe5\xf1\xa5\x9a\x3f\x27\x4d\x5a\x5f" - "\x42\xa1\xb7\x71\x5f\x8c\x7c\x95\x99\x57\x8c\x61\xcf\x3f\xfe\xe9" - "\x7f\x7f\xfc\x8d\xae\xa7\xa6\x61\x49\x6f\xa8\xed\x7a\xea\xf1\x37" - "\x3e\xfd\xef\x9a\x1d\x04\x79\x67\xbe\x31\xc6\x10\x36\x77\x43\xdb" - "\xa3\xd3\x38\x55\x37\xed\x89\xad\x1f\xdf\x32\xe1\xd8\xcd\x27\x27" - "\xb6\xdf\xf2\xef\x93\xfe\x7e\xeb\x17\x06\xe7\x64\x86\x7e\xc4\x03" - "\xc6\xc9\x83\x7e\x04\xa0\x1f\x71\x0e\xfd\x88\x4a\xf4\x23\x3a\x03" - "\xfd\x88\x8f\x46\xcd\xa9\x10\xbe\x84\x80\x17\xfe\xcf\xf4\x7f\x47" - "\xff\x67\x1d\xfa\x3f\xd3\x4f\x85\x3d\xf6\xc4\xa9\x88\x4c\xe1\xff" - "\x44\x45\x8e\xe0\x3e\xd0\x78\xbc\xa3\x1f\xf4\xe1\x64\xbc\xc7\xe3" - "\xfb\xb4\xe8\xf0\x60\x9f\x68\xc9\xd8\xf6\xb0\x6c\xf4\x89\x12\xd1" - "\x27\x4a\xca\x6b\xd7\x2d\x7c\xaf\x7d\xe4\xec\xa4\xf6\x51\x83\x7e" - "\xd1\x43\xed\xc9\xb1\x33\xdb\x17\x6a\xa1\xfd\x11\x10\xbe\xd1\x4e" - "\x30\x7e\xa4\x8d\x51\xfd\x31\x02\xb4\x7f\x1c\xdb\x3c\xea\x8f\x91" - "\x56\xeb\x1f\xf5\x78\x45\x41\xf3\x1f\xa3\x21\xfc\xfd\x07\x9a\xe1" - "\xfd\xf9\x95\xf6\x53\x5a\x18\x7b\x6a\x24\x5c\x39\x15\x85\xf7\xdc" - "\xfd\x70\xea\x05\xd0\x9e\x1a\xa5\xbd\xe2\x2f\x6f\xcc\xe7\xa7\x26" - "\x7f\x30\xf7\xd4\x94\xc4\x3f\x9c\xba\x2d\x79\xc9\xa9\xb8\x0f\x3e" - "\x38\x35\xd5\x3e\x29\xd0\x6f\xa2\x32\x03\xdc\xb5\x93\x3c\x58\xe4" - "\xf7\xbd\xf1\x23\x8c\x23\x76\x15\x70\x7f\xf0\xc7\x92\x5f\xf8\xe3" - "\xa4\x05\xcf\x3f\xfe\xf8\x4a\x8d\x3a\x69\x12\xf7\x2e\x25\x4f\xd3" - "\xef\x7d\x06\xfb\x9c\x73\xdb\xfc\x3e\x67\x9c\xd3\xef\x73\x1a\x46" - "\xcc\xdd\x18\xe4\x9f\x0d\x60\xd8\x99\xc4\x38\xc3\x54\x23\xf7\xcc" - "\xba\xc6\x2b\xbd\xb5\x19\x7b\x8d\x73\xe3\x74\xf7\x76\xa3\xcf\x16" - "\xbe\xfb\x85\x95\xbf\xa4\x0b\xbd\xb6\xaf\xf5\xea\xe7\x9f\xc9\x9b" - "\x9d\xb5\xe3\x4e\x94\xf9\x0d\xe4\x05\x87\xbf\xb0\xeb\xc4\x0b\x2f" - "\x3c\x7f\xe2\xd4\x53\x4b\xa7\xfd\x2b\x86\xbd\x1f\x57\x86\xfa\xf3" - "\x3f\xf2\xff\xc7\xcc\x2b\x89\x61\x2f\x3c\x71\xe2\xf9\x57\x57\xaf" - "\x6e\x23\x7d\x21\xd9\xca\x6d\x54\xbf\x39\x1a\x7d\x12\xd5\xef\x5c" - "\xe6\x1b\xd1\xff\x19\xdf\xae\x6c\xcb\x7e\xa8\x97\x3f\xd4\xcb\x1f" - "\xea\xe5\x7f\x45\xbd\x1c\x07\xa2\x5e\x8e\xdf\x13\xaa\x5e\x2e\x5c" - "\xfc\x50\xfa\x1c\xc3\x86\x95\x06\x53\xc9\xfa\xd5\x25\x79\x6b\x0d" - "\xc5\xeb\xf3\xf2\x0b\xf2\x47\xc1\x60\x44\xde\xca\xb2\xa2\x8d\x79" - "\x65\x05\x43\xd6\x3a\xc6\xca\x3e\xe9\x50\xdf\x7a\xbc\x7b\x78\xdf" - "\x7a\x42\x4c\xe8\x7e\x89\x0a\xdb\xf6\x09\xc6\x10\x71\x53\xa4\xb8" - "\xd4\x10\x71\x0f\x4a\x71\x85\x21\xfa\x80\x63\x44\x1f\x63\xc2\xce" - "\x50\x71\x18\xde\x20\xfb\x24\xd8\x4f\x53\xb7\x4d\xe9\x03\xf2\x49" - "\xce\xc3\x84\x0f\xb0\x4c\xbd\x18\x7f\x52\xf6\x65\xec\x30\x61\xa7" - "\xec\xa3\x49\xfd\x90\x78\xa7\x39\x09\xcb\x39\xc1\x1e\xa2\x8f\x72" - "\xa7\x94\xaf\xc7\xef\x1b\x2d\x36\xb8\xcc\x37\x47\x0c\xf5\x8d\xba" - "\x40\xf4\x21\x6f\x8e\x57\xc0\xce\x96\x61\xd1\x9f\xa4\x3d\x20\xfa" - "\x68\x8d\x5a\x1f\xdc\x7c\x92\x99\xc7\xd7\x93\x4f\x49\xfd\x48\xc2" - "\x23\xfa\x92\xdd\xbc\x2f\x89\x7d\xc5\x1e\x4c\x5b\x16\xd0\x9f\xec" - "\x41\xdf\x38\x9c\xfa\x93\xe7\xe1\xe6\xc3\xd4\xa7\xdc\xc7\x71\x5d" - "\x20\x5c\x69\x84\xcb\x0e\x37\x5b\xb9\xdf\x27\xd2\x1e\x0b\x18\x37" - "\xc3\x7e\xed\xcd\x7c\x2f\x51\xd9\x2f\xc4\xf8\x2e\xbb\x36\x65\xd0" - "\x57\x23\x5f\x50\x2a\x47\x95\x90\xc3\xcd\x21\xfa\x3f\x5d\xb5\xa2" - "\x1f\x38\x71\xb0\xff\x43\xf8\x7c\xe6\xf1\xbf\x69\xe4\x38\x27\xc6" - "\xc9\x38\x03\xf5\x72\xe5\xfa\x75\xab\x8a\x56\x6f\x28\x29\x30\x94" - "\xa6\xa6\x1a\xd6\xae\xcf\x2f\x98\x31\x63\xc6\xa8\x20\xfd\x8b\x10" - "\x3e\xed\xc7\x49\xa4\x87\xe4\xd7\x4a\x7a\x98\x84\x3e\xa7\xe4\x37" - "\x4f\xac\x0a\xee\x5f\x7c\x9c\x24\xf9\xb7\x7a\x84\x31\x4a\x30\x2d" - "\x41\x30\x88\x4f\xf2\x91\xc9\xcf\x1d\x2b\xc1\xb4\x2b\xf1\x60\x1c" - "\xef\x17\xd1\xba\xbb\x7e\x51\xbe\x3e\x05\x9e\x07\xa4\xfe\x0e\xea" - "\xfd\x08\xa9\x9f\x70\x8b\x5e\x81\xe7\x01\x7f\x7f\x43\x25\xc3\xcc" - "\x0a\xec\x9b\xe0\x7b\xb2\x2c\x13\xbf\x1f\xdf\xda\x2b\x70\xab\xf4" - "\x7e\xbf\xff\x96\x62\x45\x5f\x6a\x9c\x1f\x37\xe8\x25\x18\x4b\x30" - "\x8d\xad\x17\xa4\xb2\xea\x02\xf0\x1c\x0f\xc6\xd3\xfa\x9f\x12\x1e" - "\x4d\x00\x4c\xb7\x82\xc6\xde\xa1\x34\x5a\xc7\x0a\xdc\xcd\x98\xbf" - "\x5d\x2a\xdb\x24\x45\xf9\x11\x86\xe3\x8e\x41\x98\x89\x32\xcc\xac" - "\xc0\xbe\x14\xf5\xe7\xf8\x5a\x4c\x98\x94\x4a\xfa\x84\xd7\x08\xa4" - "\xfb\x1f\x01\x7d\xba\x70\x29\x9d\xb2\xfc\x63\xfa\xb1\xbf\xd0\x14" - "\xd4\x4f\x9b\xa4\x28\x3f\xf6\x0d\xa3\x65\x1e\x69\x65\x18\x65\xf9" - "\xed\x82\xc6\xa8\x28\x7f\xf9\x27\x75\x2b\xf0\x8c\x23\x9d\x22\x5c" - "\x01\x79\x79\x14\x78\xce\x49\x7c\x0c\xe0\xf5\xad\x06\x85\x3c\xfe" - "\x43\xa2\x27\x80\xd7\xb7\x26\x2b\xf0\x5c\xa6\xf8\xe0\x72\xdd\x5a" - "\xa8\xc0\x73\xd9\x5f\x2e\xd4\x63\x01\xb3\x47\xd1\x8f\x55\x33\xf3" - "\xfb\x63\x14\x78\x8e\xc9\x30\xfd\x23\x9e\x6f\x16\xb2\xbd\xb5\x4d" - "\xb6\x45\x42\xae\x13\x8d\x84\x1b\xc3\xcf\x06\xda\x02\xa4\xab\x77" - "\x28\x9f\x0c\xa0\xe4\x53\x00\x5d\x52\x5f\xdc\x10\xa7\x28\xdf\x05" - "\x89\x4f\xa3\x02\xf0\xa4\x28\xca\xf7\x9f\x12\x9e\xb0\x00\x18\x85" - "\xfc\x5b\xfb\x24\x3c\xda\x00\x18\xa5\xfe\x5f\x94\xf0\x04\xe6\x75" - "\xfc\x9b\xf9\x64\x08\xd2\x7f\xe2\x15\x86\xf5\x7d\xc3\x18\x94\x4e" - "\x7c\x3b\x98\x8c\xed\xdf\x1b\x7c\x5d\x2d\x8b\x5e\x91\x4c\x7b\x4a" - "\xa1\x8d\x4e\xe2\x63\x83\xd7\xc8\x4e\x4f\x2e\x6f\x42\x7b\x26\xca" - "\x00\x46\x61\xbb\x27\xf3\x7d\x1c\x31\x6d\x86\x1d\xc6\x96\x05\x7e" - "\x07\xb0\xc3\xe4\x3d\x52\x1c\x96\xff\xc6\x6e\x39\x8e\xc2\xc5\xf8" - "\xe2\x64\x6c\xff\xc6\x8b\xfd\x01\x60\x72\xb1\x04\x8b\x76\x7f\x62" - "\x4a\xa8\xf5\xcb\xc3\x7d\x7f\x29\x8d\x65\xbe\xca\xf1\xb4\x9e\x79" - "\x51\xbb\xcf\xcc\xc0\x56\xee\x06\xc3\x04\xa8\x3c\x07\x53\x74\xd4" - "\xc7\xdf\xb7\x05\x74\x95\x26\xe6\xa6\x3d\x68\x3b\x1d\x7d\x50\xe9" - "\x60\xbd\xb4\xcf\xeb\xb6\x2b\xa0\xb3\x79\xf8\x99\x75\xb1\x6d\x15" - "\x9f\x87\x5c\x93\xeb\x53\x33\xa8\x9c\x48\x69\x7b\xa0\xb3\xa1\x07" - "\x2a\x1b\x82\xd3\x56\xde\x02\xb1\x1d\xb4\x67\xac\x19\x22\x89\x0e" - "\xfa\x9e\xe2\x89\x5e\xd4\x5e\x71\x00\xb4\x95\xe8\x5d\x76\xe4\x5b" - "\x65\x5a\xba\x88\x96\x9d\x17\x40\xf7\xc6\x2a\xab\x7a\xc7\x05\xa2" - "\x77\x69\xfb\xdb\x5b\xdc\xea\xd6\xd8\x54\x68\x8d\x3d\x0b\x6d\xb1" - "\x73\xa1\xad\x3c\x19\xf6\x5d\x80\x88\x56\x77\x22\xb4\x69\x1f\x82" - "\xb6\xb8\x64\xb0\xf5\xe1\xb3\xc1\x8b\x30\x4e\xbe\xff\xd1\x79\x98" - "\x62\xad\x7b\x06\x74\x76\x81\x13\x79\x36\xe5\xb4\xbc\x97\x0f\xbd" - "\x87\x2a\x47\xe9\x78\x88\x45\xfa\x7a\x91\x96\xfb\xce\xc1\x6d\x61" - "\x71\xb1\x60\xa4\xf6\xd7\x56\xef\x01\x6d\x05\x8c\x1c\x46\x2f\x62" - "\xf8\x3e\xa0\xe8\x47\x35\xee\xc7\xb6\x1e\xef\xfd\xa8\x13\x2e\xf3" - "\x6d\x89\x98\xf7\x59\x69\xdc\xab\xaf\xf2\x30\xea\xd9\xa6\x2c\xda" - "\x17\x04\xdb\xe9\xdb\xb2\xe4\x38\xda\xdf\x94\xf6\x2d\x9d\x19\x03" - "\x7a\x9b\x27\x09\xde\xbd\xd6\x4b\x6b\xef\xfb\x68\x3f\x04\xc2\x87" - "\x6d\xbe\x86\xc6\x9f\x90\x9e\x69\xd8\xc6\xf7\xdd\x86\x70\x98\x1e" - "\xe5\xdf\xc5\xf7\x15\x66\x37\x2d\x73\xfa\x6e\x5a\x76\xc5\xf7\xea" - "\xb2\x7e\xf6\xea\xb2\xaf\xbc\xaf\x2e\xfb\xb2\x72\x33\xe8\xbc\x37" - "\x2d\x73\x74\x9a\xb8\x0c\xf4\x9d\xa6\x8b\xb4\x8e\x5e\x47\xe7\x55" - "\xae\x78\x16\x65\xef\xf9\x1b\x6c\x2d\x82\x58\x5f\xd4\x92\x2a\x9b" - "\xe7\x13\x58\x51\x01\x0c\x9f\x2d\xa1\xca\xd7\x1f\x9d\xa9\x93\xc7" - "\xd3\x5c\xe6\x38\xbd\x5d\xfb\x08\x5f\xf3\xef\x88\xca\xd6\xe1\x15" - "\x81\x97\x1e\xaf\x18\x16\x9d\x19\x83\xbc\xaa\x1c\xbb\x5d\x05\xb4" - "\x7f\xcf\x4c\x1f\xa8\x2e\x40\xdc\x74\xa4\x5f\x3f\x0c\xdf\x26\xfa" - "\x6a\x0f\x1a\xee\xa8\x82\x6d\xb4\xf7\x2f\xf9\x00\x54\xbf\xc8\x1f" - "\xc5\x7c\xca\xed\xda\x45\x5c\x56\x58\x47\x9c\x2c\xfa\xa0\x81\x7c" - "\x3a\xe7\x73\x85\x2a\xc7\x73\x85\xea\xfe\xe8\x83\xb7\x21\x4c\x03" - "\xc2\xcc\x96\x78\xd8\x4b\xb8\xb0\xde\x38\xc6\x78\x40\x83\x38\x4d" - "\xbf\xbb\xda\xad\x3d\xb4\x9f\x9d\x45\xb8\xb6\x41\x5c\x88\xbb\x8e" - "\xfb\x49\x71\xdd\x72\x18\xf9\x49\x7b\x11\x8e\xd2\xdb\xdc\x49\xf4" - "\xcd\xd0\x6e\x2b\xee\xa5\xfd\x2b\x46\xb1\x01\x91\x1f\xf9\x70\x54" - "\x57\xc7\xb8\x61\x84\xcb\x0c\x19\x84\x9b\xd2\xd1\x99\x1d\x98\xee" - "\x36\x56\x59\x88\xfe\x22\x2c\x76\xb1\x42\x15\xed\x65\xdb\x8a\xe9" - "\x45\xde\x53\x93\x64\x1a\x29\x0f\xbe\x97\x2d\xd1\x89\xfa\xd0\x5a" - "\xec\x86\x31\xf5\x34\x4e\x0e\x4b\x09\x1f\xe1\x42\x3d\xb0\x63\x59" - "\x6f\x6b\x2d\x76\x80\x8f\x05\xe1\xb4\x4b\xf8\x2c\x41\xf8\x30\x9c" - "\x21\x3e\xd2\xbf\x36\x4c\x33\xa6\x99\xe3\x5b\xf2\x3b\x1f\xe1\x73" - "\x83\xd6\xc0\xe9\x7d\x9c\x70\xf0\x7d\xa1\x11\xa7\x75\xe3\x83\xe8" - "\x3b\x4e\x75\x3b\x2a\x0b\x35\x7c\xdd\x3c\xa6\x7f\x7b\x5b\x6f\x18" - "\xeb\xcf\xd2\x8c\xe5\x6b\xe6\x1f\x04\xfa\xd6\x8a\x30\x7f\x61\xfd" - "\x85\x9a\x31\x7d\xe8\xeb\x21\x0c\xed\xa3\x45\x74\x06\xca\x72\xc9" - "\x82\xc7\xe7\xc2\xe3\xc9\x0b\x93\xe7\x42\xda\x03\xf3\xe7\x82\xf1" - "\xbe\x04\xe3\xac\x1f\xfd\xe4\x47\xfc\xe1\x47\x3f\x99\xfd\x23\xc8" - "\x78\x62\xc9\x5c\xc8\x58\x3c\x17\x96\xe2\x95\xb1\x74\xc1\x92\xe4" - "\x05\x4b\xe7\x42\xd6\x43\x0b\xf1\x6d\xfe\xdc\xbb\x8d\x0f\x27\x64" - "\xcc\x5f\xb8\x00\x1e\xcd\xbc\xc7\x78\xcf\x3d\xf0\xc0\x82\xd4\xbb" - "\x8d\x46\xe9\x7e\xb7\x91\x40\x9e\x9a\xbd\x60\x69\x42\x46\xc9\xfa" - "\xb2\xf5\x09\x8b\x17\xce\xa7\x10\x58\xb0\x60\x6e\x46\x90\x1f\x19" - "\xef\xbd\xea\x25\x7e\x3b\xd9\xe5\x14\xda\xbf\x18\x1a\x51\x0f\xf0" - "\xea\xe3\xfb\x22\xc1\x1d\x7f\x6a\x24\xf9\xf1\xb6\xe0\xf6\x18\x6a" - "\x4f\x5d\xe6\xdb\x49\xfe\xe5\xc4\x47\xda\x43\xf8\x3c\xcc\x98\x8b" - "\x71\xe3\x25\x7f\x24\x0c\xe3\xdd\xc1\xf1\xd3\xb2\x31\xfe\x56\xda" - "\x67\xc7\x86\x17\xf2\xde\x89\xf6\x10\x79\xec\x80\xfe\xca\xac\x30" - "\xbe\xcf\x21\xca\x9d\xf6\x9f\x70\x99\xef\x98\x15\x50\xef\x7b\x68" - "\x9f\x0a\x1a\x4f\xbe\x04\x77\x8c\xe9\x2c\x4b\xa2\xbd\xa8\xc0\x56" - "\x26\xe1\xb8\x32\x88\x63\x94\xb4\x57\xa2\xbd\x91\xf6\x00\x11\x78" - "\x2a\x02\x6c\x84\x9d\xf0\xec\xc3\x38\x09\xd7\xa3\x9d\x68\x2b\xd0" - "\x96\xff\xd9\x57\x19\x0f\x2c\x7a\x51\x97\x6f\x20\x1e\xc4\xf8\xeb" - "\x1d\xc7\x03\x74\xdb\xd9\x56\x8e\x70\x6f\xa4\xa8\x68\x3f\x06\xbe" - "\x37\x03\xdc\x6e\x45\x1d\x77\x7a\x6b\xb3\xc7\xb3\xcb\x7c\x3f\xc4" - "\x11\x58\xbe\x04\x2c\x5f\x9c\xaf\x36\x3b\x96\xef\x2d\xca\xe1\xe2" - "\x63\x18\xbd\x47\x23\xdc\xc0\x60\xd8\x8d\x14\xe6\xa2\xef\x3b\xb4" - "\x5f\x37\xe3\xe1\x1a\x0c\xff\x04\xed\x5a\x37\xc2\xc6\x12\xec\x4c" - "\x0f\x84\xf3\x7d\x50\x2a\x55\x70\x0e\xe2\xb3\x7d\xd1\xd9\x13\x02" - "\xf2\x23\x3c\xd9\xa2\x1d\x43\x59\x5c\x46\x3c\xfd\x3c\x5c\x8d\xe1" - "\xbf\x47\xfc\x37\x93\xbd\x14\x36\x7c\x06\xdf\x6b\x4a\x1a\x93\xf7" - "\xbf\xd3\x3e\xcf\xdb\xc4\x7b\x2b\xf2\x92\xbe\x13\xd0\x37\x7e\x97" - "\x39\x1e\xfd\x9f\xb8\x14\xd1\x56\xce\xe0\x79\xd0\xbe\xb2\x4c\xff" - "\xf7\x0c\xc4\x3b\xd1\xba\xa5\x8f\x9f\xd3\x6a\x87\xf8\x62\x5f\x65" - "\x21\x28\x68\x8a\x27\xfa\xc9\x86\x20\x2f\x12\x50\x0f\x46\xba\xcc" - "\xd3\x40\xa1\x07\x13\x11\xcf\x78\xa4\xaf\x1b\xcb\x34\x1e\xf1\xc4" - "\xf9\xfa\x0b\x31\x5f\xec\x2f\xb2\x42\xf4\x95\xfc\x38\xa4\xf4\x49" - "\xc1\xe9\xef\xe8\xa1\x74\x08\x1f\xe6\xea\x27\xf8\x3b\x7a\x89\xe7" - "\x92\xde\xa1\x5e\x4e\x33\x29\xf4\x72\x32\xd2\xf2\xe3\x80\x78\x8b" - "\x22\x3e\x0c\xe3\x7f\x2a\xc5\x63\xdd\x9f\x76\x4c\x41\xef\x69\x8c" - "\x9f\x87\xf4\x3a\xb1\x6e\x6b\x30\xbf\x96\x46\xc9\x37\x91\xe0\xed" - "\x0a\x78\x0f\xc2\xcf\x27\xbd\xa1\x76\x87\xe0\x9b\xa4\xba\x83\xf0" - "\x3a\x97\xf9\x4e\x7d\x30\x7c\xc2\xe7\x08\x9f\xea\xa7\xef\x4e\x63" - "\x70\xfc\x9d\x6e\x8c\x7f\x94\x74\x1d\xef\xcb\xc9\xd7\x27\x7b\x42" - "\xb6\xac\xb5\x98\xe4\x75\x67\xae\x02\xbe\x0a\xe1\xf2\x25\x1e\xa9" - "\x25\x1e\xb5\x48\x7d\xf7\xb3\x12\x0d\x75\x8a\x34\xc7\x31\x4d\x31" - "\xf2\x71\xbc\xac\x97\x21\xd2\xb4\x2b\xd2\xf4\x92\x1c\x99\xc8\x47" - "\xeb\x1a\xf0\xa7\x91\xec\x64\x20\x0e\x2a\xdb\x68\x97\xf9\xae\x08" - "\x45\xd9\x93\x31\xdf\xb2\xbd\xc2\xee\x8c\x46\x1d\xba\x07\xc3\xee" - "\x45\x9c\xb7\x50\x1d\xd8\x47\xfe\xa0\xc3\x0d\xac\x32\x25\x42\xe8" - "\xee\x5d\x6b\xc7\x7a\x80\x9e\x13\xe8\x99\x70\x33\x57\xaa\x54\x27" - "\xef\x5a\x8b\x77\x0a\xe7\xe7\xcb\x90\x1d\x66\xae\x45\x3e\x81\xf3" - "\xae\x1a\x3a\x1b\x0c\xdf\xbd\x52\x1e\x09\xb4\x77\x28\xd2\x3f\x01" - "\xdb\x1d\x60\x9b\x10\x6e\x0b\xcc\xc7\xf0\x5b\x78\x5d\x15\x70\xfc" - "\x5d\xe4\x91\x42\xfa\x3d\x0b\xdf\x6f\x94\xd2\x8f\x21\x7c\xf8\x7c" - "\xb7\xf4\xac\xf2\x12\xae\xcb\x72\x1d\x4c\x08\xe3\xe9\xb0\x1e\x72" - "\xfc\x98\x9e\xf6\x69\x15\x38\xa7\x7f\x89\xf7\x85\x78\xff\x1b\xde" - "\x1f\xc5\xfb\xef\x69\xdf\xd4\x4a\x2f\xaf\x8f\xf4\xfe\x73\xbc\x2f" - "\xc1\x7b\x0d\xde\x97\xe2\x7d\x2b\xde\x1f\xc4\xfb\x93\x54\x2f\x68" - "\x0f\x78\xda\xcb\x06\xdb\x56\xa1\x5b\xf4\xed\xcf\x95\x42\x3c\x58" - "\x80\x30\xc9\xbc\xbe\x0a\xfb\xa2\x13\x72\x9c\xce\xf7\x9a\x46\x7d" - "\xa0\xb0\x70\xa1\x0f\x22\xcc\x2b\xdb\xa1\xcb\xfe\x30\xc9\x36\x49" - "\x75\x51\x0a\x13\xf8\x33\x10\xff\x44\xa2\x95\x09\x5c\x61\x42\xe6" - "\x12\x7e\x91\x4e\x1b\x22\x4f\x55\x60\x9e\x76\xb8\xcb\x41\xfb\x20" - "\xe1\xfd\x2c\xdf\x67\x12\x12\x22\x18\xd7\x7b\x6c\x67\x39\xbe\xbb" - "\x4e\x48\x70\x16\xe2\x31\x4f\x2f\xc2\xa7\x07\xe8\x52\xb4\xcb\x9c" - "\x90\xa5\xd0\x25\xf4\xf5\x6f\x7f\x9e\x74\x86\xf8\x4e\x65\x1b\x6b" - "\xe2\x6d\x39\x2f\x0b\xc7\x7f\x59\xe8\x64\xa3\x34\x37\x49\xd4\xdf" - "\x84\x66\x05\x9e\x93\x88\xe7\x67\x8a\xfa\xde\xe7\x6f\xd7\x12\xba" - "\x14\xf6\xa8\x05\xf3\xc3\x7e\xe5\x9d\xbd\x92\x5d\x75\x6a\x2a\xa8" - "\xbe\x24\xb8\xed\x70\x81\xef\xd7\x84\xf1\x93\x08\x8f\xb3\x92\xef" - "\xdf\xef\xd4\x98\xa8\xbc\x33\x62\xe5\x78\x1e\x17\x75\xb0\x99\xea" - "\x81\xa6\x98\xc7\x61\xfb\x77\x9b\x5e\x8e\x03\xb1\x2f\x9c\x53\x53" - "\xc6\xe3\x32\xfc\x78\x17\x39\x24\xbc\x9a\x90\xe7\x2f\x58\x16\xd9" - "\x13\x00\xd4\x77\x56\x41\x98\xcd\x73\x06\xd2\x3d\xcc\x9b\x50\x05" - "\x23\x6d\x9e\xa3\x30\x0d\x20\xca\xe6\x39\x0b\x77\x02\x4c\xb6\x79" - "\xea\xd0\x5f\x69\xa1\xf8\x77\xef\x00\x95\x0a\xef\x95\xb7\x57\xa9" - "\x55\x36\x4f\x19\xc4\x55\x69\xf1\x5e\x0c\x0f\x85\x31\x97\xcd\x93" - "\x8a\x70\xf9\x90\xee\x65\x97\x93\xc3\xd8\xa7\x39\x5e\xd0\xa7\xee" - "\x62\x95\x36\x0f\xf6\x1d\x3c\xa7\x31\xdc\xc7\xd2\xbd\x5f\xe3\xe5" - "\x62\x3e\xcb\x22\x47\xba\xf7\x32\x9b\xbf\xeb\x5d\x7c\xff\x94\xa1" - "\x2c\x99\xcd\x93\x08\x9d\x4e\x27\xc2\x55\x32\x56\xb3\xc8\xbe\xe2" - "\x8a\x1a\x06\xe8\xbc\x84\x9a\x45\x0e\x56\x9b\x0a\x03\x58\x0e\x6c" - "\x87\xd9\xc0\x73\x78\xaf\x5d\xe4\xe3\xef\x96\x54\x3d\xd3\xa7\xc2" - "\x0c\xec\x88\x51\x19\x6c\x9e\x1e\xc8\xc1\xae\x44\xfa\x66\x07\x23" - "\xfa\xc7\x6e\xa7\x7e\x58\x22\xed\xb5\x1c\x99\xbe\xb9\x92\x61\x9c" - "\x8e\x45\x11\x9d\x7d\xc0\x6a\x30\x6d\x74\xea\x18\x8e\xcf\x92\x6a" - "\x44\x58\x07\xc1\x05\xe2\x21\x1c\x04\x9b\xee\xa5\x33\x30\x52\x8d" - "\x03\x51\xa9\x06\xbc\x92\xf0\x32\x61\x5a\x33\x33\xc7\xbc\x47\xfb" - "\x65\x62\x7a\x0b\xbe\x37\xbb\xe9\x6c\x07\xe2\xa5\x17\xc2\x11\xde" - "\x82\x7a\x95\x8c\xfa\x89\xf4\xa6\x5a\x39\xbd\xb5\xa9\xef\xba\x79" - "\x39\x52\xff\x20\xca\x91\xfa\x0e\x85\xf7\xa3\xee\xe0\xb3\xbd\x5f" - "\xc4\x7d\x8a\xe9\x32\x79\x3a\x4b\xaa\x1d\xcb\xe7\x70\x63\x3d\x44" - "\xbe\x56\x11\x1f\x91\xaf\x55\xc4\x4b\xc4\x6f\xb7\x95\xef\x01\x2c" - "\x8f\x63\x20\x2a\x0d\x7d\x95\xb4\xe8\x01\xee\xab\xa4\x19\xdc\x1c" - "\x77\xda\xad\x88\x27\x1b\xf5\x5b\xc3\xf4\x69\x06\x66\x49\x33\x0e" - "\x98\x0d\x90\xbe\x99\xb9\xd3\x3d\xdb\x3d\x39\x9b\x41\x33\x1d\xaa" - "\x54\x74\xde\x9e\xad\x3c\x1f\xcb\xd9\x86\xf7\x64\x8c\x87\x1b\x30" - "\xaf\x77\x59\x54\x9a\x81\xf2\x63\x35\x69\x46\xc4\x99\x80\xb8\xf2" - "\x89\xa6\xaf\xe9\x2c\xb3\xe8\xb4\xa4\xaf\x39\x7d\x69\xb9\x3e\x4b" - "\x5a\x95\x4f\x9f\x66\x92\x75\x88\xf4\x47\xf0\xad\x0e\x16\x3b\x99" - "\xc7\xe6\x39\x84\xad\x0e\xf6\x91\x9c\x67\x29\x1e\xfb\x4a\x47\x51" - "\xce\xa4\x53\x65\x78\x6f\x01\xd2\x9f\x4e\xd3\x2e\x82\x7d\x97\x74" - "\x68\xb1\xc9\xb9\x3d\x01\x4c\x2a\x7c\xaf\xcc\xf1\xe8\x60\x85\x49" - "\x5b\xe5\xb5\xa4\x65\x74\x9a\x48\x2e\x67\x30\x0d\xa5\x2b\x86\x48" - "\x15\xf6\x17\x54\xcc\x13\x59\xee\xd0\x8e\x29\xac\x64\x9d\xce\x54" - "\x84\x35\xf1\xf3\x03\x49\x8f\x08\x3e\xad\x8f\xd9\xbd\xfa\xc5\xbc" - "\x6c\x6c\x6c\x15\x74\xf4\xdd\x0b\xd4\x67\xeb\xe8\x6b\x21\x3d\xf5" - "\x21\x5f\xba\x50\x47\x07\xd2\xfa\xaa\xc2\x56\x5c\x01\x15\x86\x79" - "\x3b\x0a\x8f\x62\x7c\x1b\xc2\x9d\xe6\x7a\xbb\xf8\x8a\x27\xd2\xa3" - "\x4f\x4b\xf2\x58\xd2\xec\x8b\xaf\x0c\xb0\x8e\xc2\x3a\x58\xde\x57" - "\x85\xbc\x3a\x0a\x69\x17\x3d\x9a\x4e\x53\x3e\xc2\xb8\x30\xbc\x85" - "\xeb\x7f\xda\xc5\x7e\xb6\xf8\x59\x76\x79\xf1\x95\x4f\x59\x5a\x21" - "\x7b\x37\xa7\x1c\xc6\x8e\xde\xce\x7c\x54\x2f\x4e\xf7\x1c\x85\xd1" - "\x67\x69\x2f\xfd\x64\x48\xcd\xf3\xb1\xb4\x8b\x97\xd9\x8a\x67\x89" - "\x37\x89\xd0\x51\x88\x7a\x59\x5e\x47\xfc\xce\xed\x28\x3c\x89\xf9" - "\x27\x23\xde\x4a\x66\x2b\x3f\x84\xb0\xd6\xc8\xe5\x17\xf5\x70\xba" - "\xa7\x0e\x3c\x51\x69\x49\xde\x9a\xb4\x0c\x5f\x54\x9a\xc9\x57\x93" - "\x56\x85\x72\xea\xf2\xd4\xa4\xd9\xbd\x51\x8b\x51\x07\x16\x67\xa0" - "\x9c\x46\x92\xcc\xaf\x99\xc1\x80\xef\x8b\xaf\x91\xfc\x2d\x8b\x73" - "\x99\x7e\x71\x15\xfa\xc6\x4c\xe8\xfe\xe2\x5c\x1a\x87\x60\x51\x8b" - "\xab\x06\xa2\x16\x9b\x10\xae\x4a\xd4\xaf\xc5\x16\xd2\x4b\x1a\xef" - "\xc7\xb0\x6a\xec\x23\x69\x30\xbe\x19\xaf\x63\x78\x59\x59\x6d\x3a" - "\xf6\x8d\x21\x8a\xeb\x94\x25\x5d\xcf\xee\xb7\xa0\xaf\x7d\x05\xf1" - "\xa4\x1b\xd3\xbd\xf3\x18\xf2\x10\xeb\x49\xba\xde\x57\x93\x6e\x60" - "\xd1\xe9\x19\x6e\xae\xfb\xe9\xe9\x84\x7b\xe0\xb9\x78\x1a\x9f\xd0" - "\x62\x7c\x2e\x86\xfd\xd9\x4d\xba\xaa\x4f\xef\xf2\xe9\x33\x8c\x88" - "\xcb\xbe\x68\x17\x73\x78\x2d\x19\xe0\xb3\xa4\x3b\x3c\x23\xd0\x87" - "\x2f\x3f\x09\x64\x9f\x3c\x7f\x60\xc8\x83\x0f\x90\x1f\x2d\x5c\xfe" - "\xb6\x72\xac\x03\x9b\x27\x54\x75\xf4\xa1\x2e\x98\x7e\xcd\x6d\x53" - "\xa7\xf3\x0c\xe7\x29\xd2\xd1\x45\x3a\x45\xf2\x5d\x61\x82\x2a\xcc" - "\xcb\x8e\xb4\x38\xbc\x35\x88\x37\x0a\xf3\x89\x5e\x52\xe2\xe6\xf5" - "\x75\x09\xea\xeb\x49\x4c\xf3\x01\x08\x1d\x5f\x62\x1a\xce\x46\x92" - "\xad\x22\xfb\x94\xee\x71\x93\xce\xfc\x83\xec\x9a\xb0\x53\x90\x23" - "\xdb\x29\xb2\x51\xd4\x2f\x22\x3b\xe5\x93\xec\x94\x4f\xb2\x53\xfc" - "\x5d\x8f\xb6\xc6\x92\xca\xed\x51\x7a\xb9\xb0\x33\xe9\x5e\x23\x43" - "\xdd\x88\xc0\x7a\x0c\x42\x16\x08\x53\x9b\x3a\x86\xc3\x73\x3e\xa5" - "\x1a\x7d\x68\x6f\xf0\x4a\xf2\x09\x7b\x53\x25\xd9\x1b\xb5\x6c\x6f" - "\xe8\x4c\x34\xac\x53\xbe\x50\xf6\xc6\x27\xd9\x1b\x2f\x13\xf6\xc6" - "\x27\xd9\x1b\x0a\xf7\x4a\xf6\xc6\x1b\xc2\xde\xf8\x2c\xa9\x54\x5e" - "\x8d\x64\x67\xaa\xc8\xce\x50\x79\x7d\x35\xa9\x0e\x9f\xb0\x33\x7a" - "\xec\x13\xa9\xc9\xce\x78\x31\x8d\x4f\xb6\x33\x2e\x6e\x0f\x8c\x64" - "\x6b\x06\x9e\x07\xb4\x9f\x06\x20\x1b\xc3\xed\x89\x67\xb2\x87\xec" - "\x09\xf2\x6f\x9e\xd2\x9e\x20\xbe\x24\x7c\xd6\x4b\x76\xca\x14\xb9" - "\x9d\x79\xd0\x9e\x64\xa4\x97\x3b\x91\x2f\x7f\x83\x48\x0f\xda\xed" - "\xf2\xb2\x2a\x5b\xb9\x07\xd0\x0e\x54\xb1\xce\x2a\xd4\x91\x34\xd4" - "\x5f\x2f\xda\x0a\x00\xac\x97\x5d\x1e\xac\xe3\x98\xb7\xbd\xd3\xf4" - "\x09\x78\xb1\xae\xa6\xf5\xf5\xdb\x56\x38\xe3\xf5\x69\x17\x99\x03" - "\xf9\x63\x5f\x61\xaa\x42\xfb\x12\xef\xe8\xe8\x7b\x07\x52\x7b\x98" - "\x2f\x35\xd7\x6e\x40\x3a\xec\x69\x45\xd6\xc8\x15\xcf\xea\xb1\x9e" - "\x31\x2b\xda\xc5\x7f\x4f\xbb\xa8\x8f\xcc\xee\x81\x49\xa9\x79\xcc" - "\xe7\xc5\x7a\x86\xe5\xcd\xc0\x3a\x96\x8b\xb4\x9b\xb0\xce\x55\x61" - "\x3d\xeb\xf2\x28\xea\x19\xd6\x99\xc5\xf8\x6c\x10\xfc\x5b\x5c\x85" - "\xf5\x2c\xd7\xc7\xdb\xb3\x1e\xde\x17\xc5\xba\x56\x45\xe3\x76\x58" - "\xd7\x72\x7d\x35\xa2\xae\xf9\x44\x3a\x8b\x8f\xf8\xa7\x96\xea\x1a" - "\xca\x02\xe3\x9b\xf1\x3a\x86\x57\xe8\xba\x66\x0a\xa8\x6b\xcf\x4a" - "\x75\x2d\x4a\xd4\x35\x94\xa9\xc6\xfb\x9c\xa8\x6f\x84\x9f\xfa\xab" - "\x83\xf5\x2d\x3a\xbd\x8b\xce\x04\x10\xba\x43\x75\x2e\x1d\xdb\x95" - "\x0c\xe4\x67\xba\xc3\x67\xc9\x40\x7c\xcc\x41\x76\x13\x75\xf3\xef" - "\xd4\xd6\x21\x95\x7f\xcf\xf1\x4e\x40\xdb\x92\x01\x68\xcb\x3e\x45" - "\x3b\xfa\xf7\x15\x4e\x68\x46\x5c\x5d\x98\x9f\xdd\x8b\x75\xca\x57" - "\xc3\xeb\x93\xc9\xfb\x1c\xe1\x5c\x62\x1a\xc4\xc1\xdb\xca\xe0\xfa" - "\x74\xbd\x71\x53\x97\xf9\x27\x5a\x3b\x7c\x2d\xce\x8c\x32\xff\x44" - "\x6f\x87\x6b\xc9\xd2\xf3\x44\x3b\xfc\x4f\x2d\xf7\x65\xb0\x1e\x9a" - "\xb6\xc1\x8d\x17\xe0\x27\x5d\xa8\xf3\x80\xcf\x11\xf8\x7c\x26\x7d" - "\xda\xbb\xe8\x4b\x7c\xb8\x1b\xf3\x76\x51\x5d\x64\xe6\x59\xe4\xcb" - "\x25\xa1\x2e\xea\x98\x2b\x3e\x82\x45\xe7\xdc\xc9\x06\x62\x69\x6c" - "\x2e\x12\xdf\xc7\x22\x0f\xe2\xf0\x1e\x7d\xe8\x2a\xc4\xe0\x45\xe7" - "\x42\x56\x91\xff\x84\xcf\x46\xb6\x29\x76\xd4\xbe\x8d\x30\x3d\xd2" - "\x29\xce\x7f\x8d\xdc\xae\xa7\x31\xaa\x18\x7a\x66\xe6\x4f\xe3\x9b" - "\xae\xca\x67\xc0\x62\x7e\x81\x67\xc0\x9a\x21\xb6\xc9\xcc\x8e\x79" - "\x5d\xc4\x87\x45\x76\x99\x16\xa2\x0d\xe9\xbc\x05\xe9\xec\x79\x6c" - "\x73\x12\x7c\x50\x1e\x7a\xbf\x45\x97\x79\xf6\x60\xf9\x87\x89\x8f" - "\x93\x79\x32\x4c\x7c\xb2\xcc\xa7\xe1\xe6\x76\x52\x3b\xed\xdd\xc8" - "\xfa\x68\xef\x6e\x1a\x37\xa8\xf4\xb0\xff\xa0\xb3\x60\xb7\x79\x41" - "\x97\x5e\xee\x66\xb6\x3e\x66\xb5\x95\x5f\x84\x26\xda\x4f\xbc\x82" - "\xf9\x7c\x51\x39\x68\x97\x72\x74\xfd\x1b\x99\x87\xc6\x7d\x30\x8f" - "\x23\x76\x58\xd6\x2c\x64\x91\x96\xcb\xfb\x9b\xfa\x1c\x1d\xe2\x8a" - "\x22\x5c\x1d\x98\xde\x5b\x93\x83\xfa\x3a\xbb\xcb\xae\xd2\x9d\xe0" - "\x70\xfa\xb4\x5c\xd3\x16\xb8\xf9\x02\xdc\xa7\xe3\xfd\x04\x4b\x8e" - "\x81\x6c\x02\x86\xe9\x31\x2c\x06\xf1\xc7\xb9\xcc\xf7\xa1\xcf\xdd" - "\x5f\x27\x7c\xd9\xfb\x62\x64\x38\x3b\xcc\xee\x55\xce\x5b\x93\x56" - "\x49\x56\x05\xed\xff\xa6\x82\xe0\xdd\xec\x68\xe7\xb8\xa4\xd0\xd1" - "\x7e\x9b\x9e\x66\xa7\x73\xb8\x2a\xb7\xc2\x44\x94\x0f\xd1\xf7\x22" - "\xf6\x39\xce\x33\xf3\x7d\x86\x37\xb6\xb8\xb1\x4f\x71\x5f\x9d\x1d" - "\x3e\x1e\x96\x9f\xbe\xab\xac\x07\x71\x54\x55\x6f\x04\x20\xfe\x10" - "\x3f\xb1\xde\xf8\x90\x0f\x9f\x91\x4d\x6a\xda\x48\xfd\xee\xfb\xba" - "\x65\x7e\x0d\x2f\x93\x9c\x89\xa2\x6f\x3a\x67\x36\x33\x33\xb0\x4e" - "\xa2\xef\x18\x73\xee\x13\x3c\x58\x6c\xea\x47\x3b\x42\x63\xca\x74" - "\x66\x56\x69\x2c\x73\xbb\xcc\x73\xa6\xdb\xe1\xc1\x76\x69\xbc\xca" - "\x69\xf3\x2c\x20\xdb\x12\xb2\xdd\xe2\x7b\x95\x0e\xe2\xff\x69\x56" - "\xe7\x44\xb4\x43\xdc\x36\x1d\xec\xd9\x26\xe4\xef\x26\xbc\xb4\xd6" - "\xa3\x07\xe3\x4b\x9d\xac\x97\x59\x0e\x76\x53\x3f\x82\xf6\xfd\xc4" - "\xb0\x27\x51\xaf\x99\xb5\x84\x68\xfa\xe9\x93\xd6\x49\xd7\xe0\x7c" - "\x39\x68\x9a\x06\xc7\x89\x7e\x9a\x4c\xe3\x42\x62\x3c\x6c\x4e\x9b" - "\x1d\x16\xe4\xcb\x74\x91\x8f\x81\xbc\xd5\x91\xcf\x41\xbe\x06\x7d" - "\xa7\x28\xad\x60\x6e\xf2\x39\x10\xd6\x21\x97\x81\xca\x27\xca\xf5" - "\x53\x6d\x60\xb9\xe8\xdb\x7d\x64\x85\xe0\x41\xe9\x66\xd0\xf1\x33" - "\x7c\xbc\xf4\x9d\x63\x01\x2f\x0b\x95\x99\x97\x85\xdb\x58\x6c\x23" - "\x3c\xf7\xa2\x0e\xf1\xf0\x2a\xc4\x85\xfd\x9f\xf9\x5d\x42\x9f\xe6" - "\xb4\x0d\xb7\x86\x05\x75\xd3\x88\x7d\xd5\x49\x95\x3e\x76\x0e\x71" - "\xfe\x4d\x8c\xb1\xfd\xf4\x6f\x3e\xf2\xb3\xdd\xa4\xbb\x05\x13\xa9" - "\x4d\xb6\x55\x90\xbd\xe5\xb0\x37\x20\x6c\x0f\xc2\x74\x48\xb0\x1d" - "\xfc\xac\x42\x71\x0f\xa7\x3b\xb6\x63\x09\x48\x47\x8f\x83\xb7\xf7" - "\x07\x9b\xe5\x77\xec\xe3\x63\x3f\xf1\xa7\x0d\xac\xa6\x60\x62\x68" - "\x5a\x32\x8c\xd4\x9e\x79\xaf\xb2\x3e\xcc\xe7\x26\xd2\xa3\xca\xcd" - "\x30\x1e\x75\xf2\xb3\x6d\x5b\xe1\x46\xd2\x31\x16\x95\x13\x2f\xf8" - "\x9e\x68\x64\x66\xf4\x3d\xd1\xa2\x9a\x36\xc2\xcd\x58\x87\x0c\x17" - "\x20\x71\x41\x4e\x85\x01\x69\x05\xa8\xbe\x04\xe4\xa3\x7c\x8a\xf0" - "\x71\x36\xcf\xe7\xd0\x74\x89\x74\x31\x31\x5f\xd6\x45\x7c\x36\x5d" - "\xcf\x56\x20\x5f\x8f\x89\x31\x8a\xc4\xbf\xd1\x37\x89\x73\x90\xd8" - "\x4e\xe5\x15\x73\xa0\x13\x7f\xcf\xae\xb2\x89\x4c\xb4\x69\xcd\x76" - "\x48\x74\xe2\xfd\x18\xbf\xd0\x96\x48\xef\xcd\x08\x77\x84\x5d\xf5" - "\x12\xcc\x31\x0c\xb3\x32\xb3\x8a\xea\x49\x03\xe6\xdd\x67\x87\x15" - "\x27\x84\x6c\x12\x4f\x10\xae\x61\x68\x68\x66\x7c\xdf\xdb\xaf\xb0" - "\xbc\x73\x1f\x33\x6c\xa3\x31\xce\xb9\xd3\x78\xbd\x40\x5c\x4d\x6a" - "\x61\xb3\x7d\x48\x6b\xa3\xd9\x57\x88\xf6\xb9\xd0\x57\xbb\xba\x97" - "\x3f\x4b\x71\x4c\x6a\x47\x43\xe3\x3f\xd8\x43\x7b\x79\xf7\xc0\xdc" - "\x63\x02\xcf\xc1\x6e\xeb\x84\x0b\xf4\xce\xf7\xc6\x77\xea\x0b\x7b" - "\x6d\xf5\x49\xe2\x8c\x46\x84\x11\xfd\xf8\xb9\xbf\xe9\xc7\x3c\x5c" - "\xe6\xb9\x58\xa6\x87\x9a\xc5\xf7\x99\xc2\x90\xfb\x75\xf3\xf5\x51" - "\x58\x07\xa8\xce\x89\x3a\x3d\x6f\x57\x47\x33\xaf\x7f\x16\xd4\xf9" - "\x63\x92\xfd\xa5\xf1\x9c\x88\x73\x30\x6f\x67\x47\x2c\xd7\x6f\x35" - "\x53\xdf\xaf\x0f\x3a\xdb\x0d\xe3\x86\x5e\xf7\x27\xe3\x95\x89\x57" - "\xae\xf4\x5e\x8c\x17\x96\xf9\xfe\x2e\x7c\x2f\xe3\xbc\x3b\x98\xaf" - "\xb2\x63\x5c\x3f\xfa\xec\xf4\x6e\x87\xfb\x53\xd9\xc1\x38\xb5\xfc" - "\xdc\x74\x80\xc6\x09\xee\x2f\xb7\xc3\x5c\x10\xb2\x98\xc7\xe7\xee" - "\x20\x6d\xc4\x77\x56\x59\xcf\xdc\x6d\xdb\x9c\x48\xf7\xfd\x47\xda" - "\xea\x9d\x60\xb8\x9d\xca\x7f\xff\x51\x2a\x13\xcd\x61\xa1\x7b\x69" - "\x3d\x73\xb4\x36\x78\x80\xbe\xe5\x21\x2e\xac\xff\x4d\x71\x62\xcc" - "\xa1\x41\x4f\xf8\x24\x9d\x60\x72\xf9\x05\x9f\x0b\x7b\x0d\x1b\x55" - "\xf4\x1e\xd5\xb8\x9f\x8f\xc3\xec\x61\x95\x59\xd2\xdc\x85\x79\x23" - "\xb1\x9e\xcf\xa3\x73\x1e\x2f\xc1\xbc\x34\x86\xbc\x6e\x2d\xe4\x67" - "\x48\x39\xb0\xfd\xe9\x6b\xe4\xf3\x8d\xe6\xa1\xfd\x9b\x9b\xcb\xbf" - "\xcd\x60\x38\xb7\x35\x88\x73\x1f\xc6\x61\x7b\xd4\xd7\x51\xe8\x06" - "\x2f\x95\x19\xd3\xbe\x73\xd5\xad\xa5\x73\x2e\xb7\xd1\xf9\xf3\x48" - "\x07\x43\x59\x09\x5b\x76\xbf\x7d\xeb\x45\xe6\x96\xcb\xdc\xda\x4c" - "\xf5\x63\xde\x4e\x3b\xbc\x79\x66\xd8\x3a\x31\x58\x8e\xa4\xc3\xad" - "\x71\x42\x8e\x3e\xe4\x55\xb0\x1c\x93\x9a\x85\x0c\xe7\x9d\x09\x96" - "\x61\x12\xe6\x90\x84\x9a\x90\x34\x0b\xaf\x64\xe9\x3d\xf0\xd2\x05" - "\x3c\xa3\x5c\x93\xf6\xb8\xcc\x49\x31\x58\x3f\x2a\x84\x6c\x28\x1c" - "\xf5\x99\xf4\xe6\x4b\x6c\x7b\x06\xe8\x6c\xd0\x8b\x40\xe1\xa4\xe3" - "\x14\xee\x43\xff\x06\xdf\xe3\x31\x5e\x4f\xf5\x97\xce\xe3\x0a\x8c" - "\x1f\x3c\x77\x01\x92\x36\x13\xae\xc8\xed\xbb\x77\x93\xee\x22\xcc" - "\xf4\x48\xcf\xee\xdd\x98\xdf\x4e\x99\xaf\x18\x56\x4c\xf1\xa4\xa7" - "\x18\xde\x60\x87\xb7\xf8\xf9\x47\x4e\xec\x03\x86\xf6\x3d\x92\xac" - "\x83\x3e\x9a\x3e\x5d\x4f\xb2\xec\x83\x07\x4e\xa3\x1d\x43\xfb\xbd" - "\xda\x2e\xda\x9f\x07\x3a\xe8\x1d\xed\xe7\x67\xf8\xdc\xde\x81\x76" - "\xea\x5a\x6d\xb6\x6e\x40\x0d\xe1\xd7\xd4\x90\xe4\xa9\xfd\xf0\xa8" - "\x27\x3a\x33\xc6\xd6\x7b\x1c\x3a\x3d\xff\x0a\x86\x67\x38\x8e\xf7" - "\xe8\x5c\xb8\xca\xcd\xcc\xfb\xf6\xb5\x23\x5a\x9b\xe7\xb2\x95\x9f" - "\xc3\x0a\x0f\x70\x7e\xbc\x74\x0e\xbd\x80\x15\x1c\xb7\xc4\x9f\x0f" - "\x77\xef\x5b\xc5\x3c\xfb\xce\xd3\x5e\xf1\xb1\xa3\xf6\x5e\x83\xe9" - "\xaf\x6d\x01\x63\xc3\x35\x88\x6b\xbc\x06\xf1\xec\x1f\xf1\xea\x06" - "\xf4\xe3\x56\x5c\xd1\x03\xda\x89\xac\xb1\x26\xd0\x35\x6e\x41\x7f" - "\xce\x03\x2a\x6f\x0d\xfa\x73\x1e\xf4\xe7\x2e\xc7\x93\xbd\x1c\xf4" - "\xe7\x06\xb8\xaf\x9c\x53\xc7\xcf\x0f\xad\xc9\xa9\x1b\x53\x08\xaa" - "\x88\x5c\xd0\x23\x7d\x95\x97\xe0\x01\x55\x44\x0f\xfa\x92\x58\x66" - "\xbb\x54\x5e\xbc\xc7\x44\x16\x42\x38\x2f\x2b\xda\x70\x56\xb3\xda" - "\x3e\x6c\xdb\xac\x26\x9d\x72\x52\x5d\xc2\x32\x3c\x38\x9e\xbe\x39" - "\x1f\x9f\xe0\xd6\x96\x36\x30\x37\x85\x97\x4d\x66\x6e\x0c\xe7\x7b" - "\xfc\x1f\xc3\x70\x97\xf9\xc1\x78\xbb\xf6\xe1\x61\x75\x14\xfb\x4c" - "\x92\xad\x79\xf0\x4d\xa6\xae\x42\x1d\x4d\xcf\xd8\xea\x41\x7f\xfc" - "\x12\xd5\xe3\x07\x8f\xa4\x17\x33\x8f\x61\x1d\x7d\xff\x7f\xb0\x9e" - "\xe6\x26\xd0\x37\xc9\x7f\x41\x5f\xe7\x9b\xe6\x23\x50\x1b\x42\xfd" - "\x87\xc8\x62\xc4\x59\x9b\x9e\xc1\xb0\xcf\xfe\x6d\xfd\x7a\x9a\x7f" - "\x26\xd6\x9a\x3e\xd8\x63\x87\x75\xfc\x9b\x2a\x5f\x9f\xc3\xed\xe9" - "\xfc\x36\x27\xf2\x20\xd8\x06\xcc\xaf\xa7\x7d\xcb\xfb\x2d\xd9\x75" - "\xd6\x49\x64\xfb\xe7\xd7\x08\x5f\x28\xdb\x22\xda\x82\xf9\xcf\x8a" - "\xef\x07\xf3\x67\xd9\x61\x09\x6f\xe3\x4d\x53\x48\x27\xe6\x17\xb3" - "\xe8\xec\x97\x09\x6e\x46\x15\x54\xad\xf7\x40\x2e\xab\xc9\xb6\x30" - "\x5e\x57\x2e\x01\x7b\x75\x8d\x8b\xd6\xdc\x38\x6f\x5a\xe6\x42\xdf" - "\xa0\x0d\xe3\xea\x28\x0f\x07\xc2\x20\xdf\x47\x8a\xb9\x0b\xf3\x77" - "\xdb\xe1\x51\xc9\x1e\xce\xcf\x16\x63\xcc\xf3\xb3\xfb\x31\x2d\xfa" - "\x8a\x37\x60\x3c\xfa\xbf\x6b\x22\xa4\x6f\xdc\x8e\x1d\x7c\xad\xe8" - "\xfc\x93\x76\x28\xce\xa0\xb0\xb2\xc9\x10\x5b\x66\x60\xc3\xb5\x07" - "\xda\xe0\x72\x2e\x78\x80\xcf\xc3\x53\xc3\x4d\x2e\x73\x32\xc8\x78" - "\xb1\xbd\x7d\xab\x5f\xfd\xd8\x63\x18\x16\x23\xe3\x45\x98\x1b\xf1" - "\x3d\x6e\x10\x46\xa4\x99\x15\x90\xe6\xb1\x7e\xf5\x9d\x6f\x61\x58" - "\x8a\x22\x4d\x96\x22\x4d\x61\x40\x9a\x2a\x29\x9f\x0a\x45\x9a\x3d" - "\x8a\x34\x0d\x21\x68\x3b\xa6\x48\x63\x55\xa4\xe9\x0a\x41\x5b\x8f" - "\x22\x8d\x33\x38\xcd\x02\x6d\x00\x6f\x69\x3e\x91\x11\xc3\x62\x83" - "\xd3\x2c\x88\x57\xa4\x99\x2d\xbf\xa3\xef\x99\x25\x7c\x03\xd4\x27" - "\x94\x29\xca\xb5\x0e\xe3\xb1\xfc\x8f\x15\x5f\xc7\xff\xc6\xbe\x61" - "\xf6\x9e\xca\x43\xe2\x1c\x5d\xb2\xab\x34\xff\x80\xec\x39\x7d\x33" - "\x21\x9d\x20\xbf\x93\xf2\x3a\x0f\x0f\xed\x22\x1d\x42\x9c\x47\x87" - "\xf2\x63\x81\x55\x41\x67\x97\x82\x4e\xfb\x50\x7e\x2c\x70\x06\xa7" - "\x79\x48\x1b\x9c\xe6\xa1\x98\x80\x34\xcd\x22\x9f\x87\xe2\x15\x69" - "\x66\x2b\xd2\xa4\x0c\xd5\xcf\x87\xb2\x15\x69\x8a\x15\x69\x2a\xfc" - "\x3c\x7c\x88\xaf\x0d\xa7\xfa\x80\xe1\xd8\xff\x59\x7a\xf2\x3a\xbc" - "\xd3\xcb\xfa\x2c\xaf\x9d\x16\x7a\xfd\xf0\xf8\x3a\xb1\x6e\x8e\x9f" - "\x59\xd0\x03\x0f\x27\xc8\xdf\x96\xdf\xb8\xe6\x0e\xa3\x6f\x9e\xc8" - "\xdb\xde\xd6\x72\x37\xb6\xb9\x0f\x61\x1b\x9c\x66\x94\xe7\x96\xd0" - "\x7c\x1c\x7e\xe6\x0d\xef\x8f\x3c\xd4\x2d\xea\xdf\xc3\xf2\x37\x1d" - "\x2a\x0f\xf6\x33\x1e\x9e\xfe\xbf\x49\x57\x07\xd1\x45\x67\x3f\x20" - "\x0e\xd3\x60\x5f\x63\x90\x56\xca\xf3\xe1\xbf\xc8\xb4\x36\x89\x39" - "\x41\x34\x57\xd8\x41\xe7\x71\x60\x9a\x96\x80\xfe\x09\xd1\xea\x3c" - "\xbe\xc5\xad\x0d\xa6\xf9\xe1\x9d\x12\xcd\xdd\xc2\x46\x3d\xdc\x2d" - "\xdb\x93\x61\xf5\xcf\x72\xb0\xbd\xb3\x01\x80\xe6\x3c\x74\x34\xa0" - "\xbf\x89\x7d\x2c\xa2\xfb\x1c\xa4\x18\xb8\xff\xbb\xee\x1a\xd0\xb3" - "\xad\x62\x0e\x9f\x13\x21\xca\x92\x92\x45\xe7\x2e\x93\xef\xd3\x66" - "\xfa\x8a\xe6\xe5\x31\x7e\x06\x13\xa4\xec\x6a\xad\x70\x20\xad\x29" - "\x19\xf2\xfc\x21\x3b\xa4\x08\xbf\xce\x72\xd0\x4a\xf3\x35\x68\x6e" - "\x53\xab\x73\x36\xc1\x94\x21\x9d\xf2\xdc\xe9\x3e\x3a\xc3\x19\x61" - "\xa7\x0f\xd7\x57\x0a\xe4\xab\xa0\xe1\x91\x2f\x85\xfe\xa4\x9c\x0c" - "\xae\x0f\x61\xa8\xa7\x29\x5d\xc1\x3a\x97\x62\x0f\xd6\xb9\x14\x47" - "\x70\x7d\x50\x63\x7d\x58\xa8\x0d\x4e\xb3\x30\x26\x38\xcd\xc2\xb8" - "\x80\x34\x16\x91\xcf\xc2\xd9\x8a\x34\x29\x8a\x34\x81\xf6\x0f\xcb" - "\xbc\xb0\x70\xb0\xdf\xc9\xed\xfd\xc2\xf2\x80\x77\x75\x1d\x6f\xa7" - "\x16\xee\x91\xc3\xa4\x75\xc9\x7c\xae\x94\x84\xef\x88\xc2\x46\x11" - "\xfc\x49\x05\x0d\xa7\x15\x34\x9c\x95\xdf\xa5\xf9\x15\xef\x23\xef" - "\x26\x4b\x7a\xe6\x8c\xdc\x0e\x8f\x46\x7a\x96\x3c\x49\xbe\x19\xb5" - "\x4f\x7c\x0e\xdb\x56\xf4\x29\xaf\x80\x9e\xe6\x0e\x9e\x2f\x03\x0d" - "\x9d\x0b\x63\x87\x45\x99\xd8\x9f\xa3\xb3\xf6\xfa\xd0\x9f\x4a\x3f" - "\x0f\x0b\xfb\x30\xff\x7a\xcc\x03\x79\xf7\x48\x52\x30\x0d\x8f\x64" - "\x04\xd3\xf0\x48\x6e\xc0\xbb\x1e\xdf\x4d\x01\xe5\xd6\xd3\x3e\x11" - "\x2f\x73\xdf\xfa\x91\xdd\x72\x38\x8d\x01\x60\x19\x7b\x2b\xb9\x1f" - "\x90\x44\xf3\x06\xa3\xcf\xc1\x23\x1b\x68\xbc\x40\xc2\x79\x3c\x90" - "\xb7\x82\x17\x8f\xb4\x2b\xe8\xe8\x56\xd0\xd1\xeb\xb7\x35\x0b\xfb" - "\x44\x1d\x79\x04\x9f\x1f\x8f\xa7\x30\xe4\x85\x21\xd2\x63\xb8\xc1" - "\x3a\x85\xfc\xd4\x45\x0b\x9d\x58\x5e\xf6\xbc\x3a\x5a\x7a\x4f\x63" - "\x53\xc8\xef\xce\xb1\xa0\x7d\xa6\xb5\xb3\xb7\x62\x58\xa6\x90\xeb" - "\x22\x2c\xff\xd2\x24\x81\x77\x11\xff\xb6\x4f\xb0\xf8\x6c\x60\x51" - "\x07\xbb\x87\xd3\xe7\xfe\xe8\x83\x5d\xf2\x1c\x5b\xc4\xb1\x53\xae" - "\x0f\xbe\xda\x83\x5d\xbe\x9a\x55\xe8\x13\x2f\xaa\xc7\x3a\x61\x11" - "\x7d\x9a\x82\x33\xa8\xfb\xf5\x28\x3f\xec\x03\xa7\x4a\x7d\x99\x83" - "\x3d\x34\x77\x90\xf6\xaf\x40\x9b\x19\x21\xe6\x66\x2c\x3a\x1d\x50" - "\xaf\x9c\x86\x2d\xf3\xd8\x39\x48\xad\x21\xdf\x8e\xec\x06\xcd\x41" - "\x6c\xf5\x38\x80\xc6\x59\x6c\x9e\x0b\xdc\x27\xc7\x78\x8b\x48\x9b" - "\xaa\x0b\x48\xeb\x90\xc6\x41\x7a\x29\x6e\xa6\x07\xb4\xad\x4e\x07" - "\x9d\xb1\x1b\x23\xfc\xf8\xd4\x9a\x56\xb4\x17\x98\x26\x51\x4e\x43" - "\x63\x26\xfc\xbb\x7f\x19\x68\x67\x54\x80\xd6\xba\xe5\x1c\xc7\x2d" - "\x7d\x73\xe6\xfd\x23\x5b\x45\x2f\xd8\x9c\xdd\xe4\x53\x6a\xc5\xbc" - "\xad\x54\x8b\xc6\x0d\xba\xfe\x9a\x83\xd8\x86\xa5\x5a\xbc\x35\x07" - "\xdb\x91\x36\xac\xaf\x8b\x8e\x93\x0d\x0c\xe4\xdd\x82\x05\x19\x4b" - "\xd2\xd3\x12\x9e\x58\xb2\x30\x73\xc1\x1c\x43\x66\xd1\xda\x82\xfc" - "\x84\xf5\x1b\xca\x0c\x9b\x4a\x8a\xca\x8a\xd6\xad\xe6\xc7\x82\x19" - "\xf2\xca\xc4\x3d\xbe\x38\xaf\xb4\x6c\x2e\x3d\x4e\x37\x98\x4a\x0a" - "\x36\xf2\xc7\x69\xa3\x20\x18\x49\x51\x59\x41\x89\x61\x6a\xfe\x74" - "\xc3\x43\x79\x45\xc5\xb4\x8a\x21\x14\xae\x39\x86\x92\x82\x92\x82" - "\xbc\x7c\xc3\x5c\x83\x91\x30\x07\xa2\x0b\x90\xa7\x51\xb6\x4f\xa5" - "\xd8\x9e\xa3\x0f\xdd\x4b\x76\x8a\xda\xf5\xf3\x90\xbe\x81\x7c\x38" - "\x7e\x8e\x17\xea\x21\xb6\x09\x76\x97\x39\xad\x6c\x68\x3b\x9e\xb6" - "\x3b\x58\x7f\xd3\xea\x83\xf5\x37\xed\xc8\xd0\x76\x3c\x4d\x51\xff" - "\xd3\x14\xf5\x3f\xed\xec\xd0\x76\x3c\xcd\x11\x9c\x66\x31\x04\xa7" - "\x59\xac\x1f\xb4\x33\x48\xeb\x0e\x6e\x97\x16\xc7\x29\xd2\xcc\x52" - "\xa4\x49\x56\xbc\x67\x06\xbc\xa3\xef\xba\x38\x3f\xd0\x37\xc0\xf7" - "\x32\xb9\xae\xfb\xed\xdb\xe2\xdd\x32\x0c\xb5\x3d\xb4\xd6\x45\x82" - "\x6d\x0e\x80\xed\x95\x60\x07\xeb\x3f\xd9\x24\x9a\xbb\x29\xfc\xf3" - "\xf4\xa9\x92\x6d\xeb\xa9\xf6\xb7\xa1\x3d\x28\x8b\x5b\x2f\xc1\x62" - "\x3a\x6b\x91\x60\x1d\x34\x9f\x97\xbd\xba\xcc\xd5\x14\x0d\x3a\x4a" - "\x4b\xe7\x58\x31\x73\x6a\x03\xcd\x1f\xc7\xb0\x08\xbc\xd0\x4e\xa5" - "\xc7\xca\x73\xe7\x77\x22\x8c\x1d\xd2\xb9\x2e\x53\xba\x9d\x7c\xde" - "\x21\xcf\xaf\x86\xd6\x58\xd1\xd9\x70\xd5\x62\x0f\x89\x1e\x3a\x5f" - "\x8d\xf2\x46\x1c\x5a\xa6\x4e\xfd\x4c\x3a\x27\x4b\x8f\x57\x0c\xe2" - "\x2c\x96\x71\x22\xbe\x58\x10\xe7\xf1\xd1\x3c\x32\xc9\xef\x49\xdf" - "\x23\xfb\x17\xd4\x57\x08\x65\x3b\x42\xcf\xcd\x86\xc8\x6a\xb3\xaf" - "\xdb\xba\xad\x87\x68\x3a\x49\x7e\xa8\x2d\xd6\x03\x9d\x0d\x1e\xec" - "\xbf\x82\x9e\xf7\xa7\xca\x2f\x82\xad\xd9\x03\x34\x3e\x9c\x53\x0e" - "\x55\x4d\x6a\x5f\x37\x1b\x4c\x47\x7d\xb4\x74\x7e\x3e\xe5\x4e\x0a" - "\xc7\xf4\xd8\x97\x70\xd0\x1c\xee\x61\xc6\x23\x22\x09\xce\x3a\x85" - "\xfa\x7b\x19\xd3\x25\xdf\x77\x77\x13\xe2\x0a\x39\xbf\x58\x0d\x36" - "\x97\x39\x03\xdb\xbf\x4d\x5d\xb2\xcd\x6e\xad\xe7\xb6\x4f\x8d\xe1" - "\x55\xc8\x8b\x63\xc3\xf9\x29\x92\x7d\x37\xd1\xbc\x32\x84\x3d\x7a" - "\x3d\x58\xa2\xbb\x15\xcb\x8d\x75\xb1\xfe\x8d\x6d\xc6\x30\xc9\xbe" - "\xea\x30\x5d\x8f\x9c\xee\xdb\x94\x8f\x7c\x23\x6a\x8f\xb1\xae\x3a" - "\x45\x5f\x71\xc9\x93\x2f\xf3\x39\xcb\x8f\xa2\xff\x97\x21\xd7\x83" - "\xd1\xf8\x8e\xf6\x2f\x83\x8f\x27\xf2\x79\x3d\xd8\x9f\x2c\x35\xa1" - "\xcf\x16\xeb\x44\xdb\xf8\x68\x96\x1c\xc7\xc7\x89\x28\xae\x82\xb9" - "\x5b\x63\x7b\x28\xae\x6c\x30\x4e\xac\x21\x60\xad\xe5\x1e\x0a\xdf" - "\x23\x87\x8b\xb6\xe5\xd1\x06\xc5\xfb\x51\xf9\x1d\x9f\x4f\xe0\xb3" - "\x41\xc2\xef\x40\x9b\xab\x12\x7b\x2e\x2c\x19\xdf\xc8\xeb\xcd\xa3" - "\xdd\x72\x3c\x1f\x53\x3b\x4c\xdf\xc6\x9c\xe0\x8b\xce\xae\xe7\x3e" - "\x17\xa6\x79\xfb\x2b\x77\x18\xf6\x31\x54\x8c\xce\x54\xc5\x30\xc2" - "\x43\x75\x86\x9f\x6d\x8f\xef\xe7\xe0\xd1\xd3\xb4\xce\x81\x74\x64" - "\x93\x07\x26\x9a\xee\xa7\xf1\xe7\x25\x5c\x6f\x29\x8c\xf0\x12\x3e" - "\x6a\x13\x09\x37\xe1\xdb\x47\x3e\x2d\x9f\x2f\xb9\x84\xca\xbf\x67" - "\x38\x59\x61\x7c\x79\x00\x2f\xc3\xf0\x7d\x77\x70\x59\x97\xd4\x2b" - "\xde\x8f\xc8\xef\x34\xd6\x2b\x74\x6f\x49\x83\x14\xd7\x76\xbd\xbc" - "\xa6\xf0\x35\x32\x4b\x7a\x15\xf9\xb9\x83\xf1\x2f\xd5\x29\xde\x63" - "\xe5\xf7\x3a\xfe\x8d\x61\x69\xbc\x9c\x47\xb5\x98\xc3\x55\xdf\xb2" - "\xcd\x11\x76\xbd\xbd\x4c\x30\x4d\x76\x40\x9e\x23\xf0\xbd\xd8\x2f" - "\xbf\xa5\xe5\x32\x3e\x7c\xde\x19\x00\x87\x7e\xc9\xd2\x3a\x19\x4e" - "\x7c\xdf\x58\xda\x12\x90\xee\xd8\x37\x94\x55\xa1\xbb\x99\x5e\xa1" - "\xbb\x4b\x7b\x15\xb4\xb8\xfd\x38\x33\xb5\x7e\x5a\x32\xf5\x01\x70" - "\x58\x3f\x33\x0d\x4a\x5d\x2d\x2d\x27\x1d\x27\x7d\xcd\x4c\x0c\x11" - "\xe7\x96\xe2\xb2\x42\xeb\x78\xa6\x29\x20\x5c\xea\x1f\x65\x7e\x22" - "\xf9\x09\x64\x9f\x9d\xfd\x95\x99\xf2\xf9\xaa\x5c\x27\x69\x1f\xb1" - "\x99\xe2\x2c\x6f\xd4\xeb\xcc\x63\x4a\xbc\x62\xfd\x8d\x84\xc3\x8f" - "\xb3\x4a\xf8\x78\x99\xf6\x80\xb2\xf5\xd9\x61\x89\xfc\x9d\xc8\x21" - "\xc6\x06\x97\x9e\x1d\xae\xdf\xe1\x32\x3f\x36\x31\x98\x67\x8f\x4d" - "\xf7\xf3\xec\xb1\xd9\x7e\xbc\x8f\x25\x07\xc0\x7d\x88\xef\x99\x01" - "\x70\xb9\xdf\xa4\x9b\x42\x57\x1e\xdb\xad\xc8\xab\x3e\x00\x47\x4b" - "\x40\x5e\xc7\x02\xe0\xba\xf1\xdd\x3a\xbc\x7c\x1e\x3b\x3b\xbc\x7c" - "\x1e\x73\x87\x96\xcf\xe3\x7a\x7f\xbe\x8f\x4f\xfc\xe6\x7a\xf5\x78" - "\x52\x00\x3d\x4d\xf8\x9e\x11\x5c\x8f\x1e\xcf\x55\xbc\x0f\xca\x9f" - "\xa1\xed\x68\xd9\x92\x44\xe7\x71\x43\xd9\x64\xd0\x8b\x7a\xf6\xb8" - "\x25\x30\xfe\xed\x6b\x22\x9e\x68\xe4\xdf\xe0\xe8\xfb\xa6\x80\x3b" - "\xa1\x84\x23\x98\x80\xf8\x6e\x99\x76\x6c\xaf\x43\x9e\x05\x2a\xb7" - "\x7f\x36\x1f\xb5\x7f\x8f\x3b\xc5\x77\x9b\xe5\xa7\x99\xf9\xdd\xac" - "\xe1\xda\x32\x97\xf9\x09\x23\xf6\x19\x7a\x05\x7f\x9e\x40\xfd\x5f" - "\xc7\x7d\x13\x66\x59\x7e\x1a\xf5\xe9\xda\x79\x78\xe2\x13\xbc\x0f" - "\xe0\xfd\xf7\xc1\xed\xeb\x13\x99\xcc\xac\x5a\xda\x64\x56\xb6\xbb" - "\x4f\x14\x63\xdf\xe3\x5a\xa4\xa7\x2a\x2b\x44\xdc\x6e\x66\xd6\x2c" - "\x09\x11\xde\x8c\xf2\xba\x66\x87\x27\xce\x10\xbd\x01\xe1\x27\x98" - "\x79\x6c\x26\xc1\xdb\x29\x3f\x4c\x33\x9c\xdc\xe4\x75\x50\x42\xf7" - "\xb2\xb4\x8a\x72\x7c\x7d\x1e\xb2\xb6\x8b\x72\x64\xfd\x2d\x38\xef" - "\xac\x89\xa1\xcb\x91\x35\x0b\xcb\xf1\x75\xe8\x72\x64\x65\x70\xde" - "\xaa\xb1\x2c\x43\xfc\x8e\xac\x62\x2c\xcb\xd7\x9c\xef\xc1\xe1\x3b" - "\xe5\x7e\x6a\xe5\xd7\xd8\xff\x57\x03\x4f\xbb\xb4\xc2\x2f\x37\x09" - "\xee\x68\x64\x3d\x64\x84\xc8\xb3\x8d\x99\xc3\x97\xda\x21\xcb\x23" - "\xb7\x57\x52\xf8\x59\x41\x0b\xf2\x49\x4d\x7c\xc2\xf2\x60\xba\xe1" - "\xe4\x2d\xd7\x4f\xf1\x9d\xe9\x49\xac\xff\x4f\xd8\xe5\x36\x1d\xdb" - "\x73\x87\xcc\x47\x8c\x4b\x51\xc4\xb9\x03\xe2\xf2\x83\xe2\xb6\x0e" - "\x86\x57\xc8\xe1\xdf\x4e\x4e\x4f\x1e\x55\xc8\x09\xe5\xf3\xd4\xdc" - "\xe0\x72\x3f\x79\x52\x94\x0f\x65\x34\x84\xd7\x4f\x76\xa3\x8c\x06" - "\x42\xcb\xe8\x49\x67\x68\x5d\x7b\x2a\x82\xe3\x8b\x86\x10\xf8\x9e" - "\x8a\x47\xd9\x0d\x70\x1d\x94\xe4\x34\x54\x3e\x4f\xa5\xca\xf2\xf9" - "\x76\x65\x7c\xca\xa2\x28\xa3\xf7\x3c\x2c\x1b\x23\xca\xba\x6c\xb9" - "\x02\xf7\x91\xd0\xba\xf8\x94\x15\xcb\xe9\x0d\x5d\xce\xa7\xce\x0e" - "\xaf\x8b\x4f\xd1\xb7\x3a\xef\x50\x5d\x5c\xa6\x17\x69\x20\x44\x9a" - "\x65\xd3\x99\x39\x54\x3e\xcb\x92\xc9\x2f\xb2\xc3\xb2\x0a\xfa\x4e" - "\x17\x10\x9e\x1d\xac\x7f\x58\x06\x4a\x47\xfc\xf3\x88\x7e\x0c\xc9" - "\xe1\xbc\x01\xd4\xdf\xa4\x93\x2e\xf3\xb2\x93\x0a\x5e\x5d\x3e\x0f" - "\xd9\x73\xfb\xd5\xea\x87\x04\xbf\x96\xab\x14\x34\x75\x87\xe6\xd7" - "\x32\x07\xf2\xeb\x72\x68\x7e\x65\x47\x0c\xcf\xaf\x6c\x92\xff\xe5" - "\xa1\xfc\xca\x4e\x0a\xe4\x97\xcf\x2c\xca\x77\x5b\x2c\xea\xc6\x40" - "\x0e\x6b\x12\xb6\x5c\x1f\x89\xba\x22\xd2\xf4\x51\x9a\xb2\x48\xb7" - "\xd0\x13\xc3\x04\xd0\x5d\x82\xec\x6c\xb9\xfe\x8f\xad\x87\x70\x36" - "\xb0\x8c\xe6\x68\xd3\x19\xcf\x7a\x5b\xf9\x65\xab\xcd\x63\x04\x1a" - "\x6f\x54\xe4\x7b\x22\xb4\x2d\xc8\xee\x42\x9e\xd6\x86\x08\xef\x15" - "\x63\xa6\xcb\x0d\xc1\x36\x62\x39\x04\xcb\x68\x19\x4f\x07\x83\xfb" - "\x9f\x5e\xff\xba\xbe\xcc\x96\x9b\x86\xca\x6c\x45\x94\x24\xaf\x2f" - "\x83\xe9\x5b\xbe\x3b\xb4\xbc\x96\x37\x0f\x2f\xaf\xe5\x27\x87\x97" - "\xd7\x72\xea\xfb\x5c\xb6\xc3\x0a\x7d\x70\xbb\xb1\xdc\x11\x5c\x5e" - "\xcc\x17\xd3\x31\xf5\x88\x1b\xe8\xfd\xdb\x96\x5b\xbe\xc8\xc6\x91" - "\xac\x68\xfd\x3f\xd2\x3f\x99\x68\xfc\xae\x38\x86\xc5\x8d\x3c\xb4" - "\x6c\x19\xf6\xdc\xf0\x88\x4e\xec\x57\xd2\xfc\x3c\xc3\x24\x1a\x2b" - "\x5b\xf1\xb9\x4f\xad\x9a\x83\xcf\xea\xf3\x90\xfb\x1b\x9f\x5a\x53" - "\x45\x73\xc9\xf8\xda\x41\xfe\x7d\x62\x85\x27\x50\x16\x34\xa7\x6c" - "\x9f\xd8\xcb\x91\xc6\x39\x3f\x3d\x0f\x39\xbb\x84\x5c\x72\x6b\x82" - "\xf9\x98\x63\x08\x2d\x97\x9c\xd9\x28\x97\x4f\x43\xcb\x25\x27\x73" - "\x78\xb9\xe4\x98\x50\x2e\x9f\x0e\xad\x47\x39\xbb\xa5\x7a\xb4\x83" - "\xd2\x18\xd6\x91\xbf\x9a\xf3\x35\xc1\xe0\x33\xd6\x91\x9c\xcf\x28" - "\x3e\xa1\x4f\xae\x47\x3c\x0d\xf5\xff\x79\xfe\x12\xcc\x09\x09\x47" - "\x20\x5e\x7b\x64\x5f\xa8\x7a\x92\x43\xdf\x53\x55\x33\x4c\xa0\x43" - "\x1e\x66\x1d\x22\x1c\x25\x00\x97\x20\x37\x8d\xe0\x28\x9c\xce\x5c" - "\xf6\xc3\xe7\xc6\xcb\x70\x7c\x5c\x54\xc0\x1a\x98\xab\x10\x08\x2e" - "\x18\x77\xae\x54\xfe\x70\xde\x8e\x10\x3c\xc1\x29\x60\xca\x45\x7d" - "\xcc\x3d\x19\x5c\x1f\x73\x2d\xc1\xfa\x99\x43\xdf\x27\x22\x7d\x68" - "\xe7\x50\x97\x7b\xbc\x66\xd5\x9c\xef\xa7\x6e\xe6\x45\x28\xea\x26" - "\xea\x40\xde\xaf\x85\x0e\xe4\xed\x0d\xa6\x35\x2f\x2e\xb4\x0e\xe4" - "\x25\x0e\xaf\x03\x79\x59\xc3\xeb\x40\x5e\x19\xe9\x80\x1d\xf2\x8e" - "\x06\xd7\xcd\xbc\x3d\xc1\x65\xc7\x7c\x79\xdd\x84\xa8\xef\x52\x37" - "\xd1\x17\xba\x61\xb8\x7a\x28\xf9\xff\xaa\xa6\x6b\x00\xdf\x81\x67" - "\x3a\xac\x57\x48\xdf\xd3\x49\xf4\x0d\x09\x6d\x7c\x21\xf1\xb0\x91" - "\xf7\xd1\x9e\xce\x0c\xe4\xe3\x3e\xd1\xd7\xaa\x44\xd8\xbf\xd0\x9c" - "\x3d\xc1\xcf\x95\x87\x83\xcb\xff\x74\x59\x68\x7e\x3e\xbd\x07\xf9" - "\x59\x19\x9a\x9f\x4f\x1f\x19\x9e\x9f\x4f\xb7\xd1\x5a\xf5\xa1\x75" - "\xea\xe9\xb3\x86\x8d\xdc\x47\xe1\x69\x2e\xc1\xca\x7b\xbf\x5d\xfb" - "\xb4\x32\x26\xb8\x7d\x7a\xda\xf3\xdd\xdb\xa7\x95\x59\xa1\xdb\xa7" - "\x95\xa6\xd0\xed\xd3\xca\xdd\xa2\x3e\xac\xb4\x06\xd7\x87\x95\xcd" - "\xc1\x3a\x81\xbc\xfb\xde\xda\xa7\x7c\xbd\xa2\x0e\x54\x9f\x87\xfc" - "\x1a\xf4\x29\x24\x5b\x58\xf0\x58\x30\x8d\xf9\xd3\x43\xcb\x2d\x3f" - "\x19\xe5\x56\x1d\x5a\x6e\xf9\xb9\xc3\xcb\x2d\xbf\x02\xe5\x56\x3d" - "\x54\x6e\xf9\x75\xdf\xdd\xa7\xc8\x6f\x0f\x96\x59\xfe\xb1\xef\x2e" - "\xb3\x82\x88\xd0\x32\x2b\x88\x0b\x2d\xb3\x82\x44\x21\xb3\x82\xb2" - "\x60\x99\x15\x64\x06\xcb\x0c\xf9\xf6\xbd\xc9\xac\xa0\x4d\x21\xb3" - "\xf5\xe7\x61\xd5\x02\x94\x59\x97\x90\xd9\xea\x91\x0a\x1a\xed\xa1" - "\x65\x56\xe0\x46\x99\xad\x0f\x2d\xb3\x55\x31\xc3\xcb\x6c\x15\xed" - "\xa1\xb1\x7e\xa8\xcc\x56\xa5\x7c\x77\x99\xad\xaa\x08\x96\xd9\xaa" - "\xfc\xef\x2e\xb3\x55\xd6\xd0\x32\x5b\xd5\x1d\x5a\x66\xab\x1c\x42" - "\x66\xab\xe3\x83\x65\xb6\x5a\x17\x2c\x33\xe4\xdb\x3f\x29\x33\x94" - "\x4f\x97\x98\xaf\xbb\xfa\xc5\x7e\x3e\xa6\xbd\xba\xca\x0e\x85\xd2" - "\x7a\xf6\x42\xae\x3b\x92\x0c\xdf\x46\x98\xb2\xa1\x6d\xf7\xea\x06" - "\x29\xec\x89\xa1\x72\x58\x7d\x02\xdb\xd5\xbe\xb6\x0a\x3e\xaf\x4b" - "\xc8\x90\x78\x8e\x70\x62\x8c\x6c\x35\xb7\xff\x28\x63\x46\xfb\x0a" - "\x53\x5b\x8c\xf0\x4e\xc2\x43\xfb\xaa\x04\xe3\x2a\xd4\x7e\x17\xbf" - "\x6c\xf8\x39\xe6\xcb\xbb\x68\xef\xff\xf3\x50\x34\x5e\xe8\x6a\xa1" - "\xd2\xff\x6d\xc2\xbc\x2e\x0a\x3d\x7d\x46\x31\x66\x52\x38\x8c\xff" - "\x5b\x48\xfe\x6f\x53\x68\x3d\x2d\xbc\x8e\xff\x5b\x48\xfc\x68\x0a" - "\xe8\xaf\x46\xa3\x07\xa8\xe8\xaf\x16\x7a\x22\x9d\x42\x77\xb8\x1f" - "\x5b\xb3\xbc\xcb\x65\x2e\x8a\x53\xd0\x8c\xb2\x29\x3a\x2c\xd1\x7c" - "\x20\x38\x7d\x51\x62\x68\x9a\x8b\x32\x91\xe6\xb7\x43\xd3\x5c\x64" - "\x1a\x9e\xe6\xa2\x3d\x48\xf3\xdb\x43\xeb\x56\x51\x8b\xa4\x07\x21" - "\xfa\xe5\x45\xd6\xd0\xf2\x2f\x52\xc8\x1f\xb2\xca\x2a\x98\x83\xa7" - "\x0f\x82\x7b\x06\x02\xe1\x68\xae\x3e\xc1\x92\x8e\x84\x80\x9d\xae" - "\xc4\x39\x0c\x5c\xe6\x10\xdd\xa3\xb5\x05\x21\x75\xef\x99\x2a\x51" - "\x1f\x9f\xe9\x0e\xae\x8f\xcf\xd4\x07\xd7\x47\xe4\x75\x70\xba\x13" - "\xc1\xf1\x85\xbb\xbf\x3f\x1b\xbb\x26\x5e\xa1\x03\xef\x9e\x87\x35" - "\x3f\x17\x3a\xb0\xc6\x1b\x4c\xc7\x9a\xa4\xd0\x3a\xb0\x26\x0b\xcb" - "\xff\x6e\x68\x1d\x58\x53\x36\xbc\x0e\xac\xb1\x20\x2f\xdf\x0d\xd4" - "\xdb\xa5\x15\x49\xe1\x0a\x98\xe3\xa1\x6d\xde\x9a\xd3\xa1\xc7\x75" - "\xd6\xf4\x08\x1e\x17\x4f\x0c\xe6\xf1\x1a\x4f\x30\x0f\xb1\x2c\xff" - "\x3c\x0f\x07\xcf\xca\x70\x99\x8b\x95\xf5\xdf\x76\x1e\x8a\xa5\xfa" - "\xbf\xf6\xf3\x60\x1a\x8b\xa5\xfe\x4f\xa8\xb1\xac\xe2\x16\xe4\xa5" - "\x2d\x34\x2f\x8b\xad\xa1\xcb\x5c\x4c\x6d\x90\xcd\x37\xa4\x2e\x15" - "\x3b\x30\x7c\x29\x7d\x3b\xa0\x31\xac\x46\x0c\x5f\xea\x01\x1d\x6f" - "\xaf\x06\xdb\xa5\xb5\xb4\xf7\x11\xe3\x63\xcc\xa8\xbf\x91\x13\x21" - "\x83\xda\x20\xa2\x2b\xa7\x42\xf9\x4d\x74\x6d\x12\xd1\x4d\xf3\x58" - "\x68\x5d\x4d\x64\x39\x64\xd8\x9c\x1e\x90\xf5\x9d\xe0\x15\xb8\x4d" - "\x54\x2f\x08\x5e\x86\x15\x63\x9d\x55\x0a\xdb\xb4\xb6\x3e\xb4\x8c" - "\xd7\x1e\x1b\x5e\x77\xd6\x9e\x16\x72\x5e\x07\xc1\x72\x5e\xdb\xe3" - "\x33\x8f\xcd\xa4\xb2\xa2\x0e\x7c\xa7\x7a\x42\xdf\x4e\x87\xb5\xf7" - "\x3b\x96\x75\x9b\xb6\xc1\xa4\x0b\xb0\xae\x90\xe7\xa7\x66\xe8\x53" - "\xa8\xa0\x8d\xdb\x80\x75\xef\x70\x3a\x11\x26\xc7\x03\x6a\xb6\x63" - "\x4d\x37\xc5\x35\x99\x99\x9b\xce\x8d\x91\xcf\x80\x41\x5d\xb8\xe1" - "\x1c\xac\xdb\x1e\x94\x1e\x5b\x23\x9b\xc0\x71\x52\x8c\xef\xaf\x3b" - "\x21\x8f\xc3\x0f\x37\xbe\x8f\x30\x67\xe5\x79\xbf\xe2\x5b\xd8\xba" - "\xae\x61\xdb\x65\xa4\x89\xd6\x8e\x13\x4d\xd7\xb7\x03\xeb\x8d\xb2" - "\xfe\x8a\x6f\x73\xeb\x93\xfc\x6b\x5b\xd6\xa7\x62\x9c\xf3\x3a\xe3" - "\xb9\x01\xf5\x60\x7d\x79\x20\x1e\x71\x5e\xcc\xfa\x3d\xf2\xfa\x14" - "\x7c\xae\xff\x06\x5c\x32\x3d\x56\x05\x3d\x5d\xd8\x5f\x70\x4a\x38" - "\xce\x7e\x03\x8e\x18\x5b\xcb\x1c\x98\xe1\x03\xcd\x05\x28\x99\x46" - "\xe7\xcf\xd8\x1a\x7a\x21\xc2\x03\x5a\xd1\xb7\x33\xdd\x4d\x6b\x43" - "\xa8\x6f\x68\xf3\xcc\xb3\xd2\x37\x38\x3e\x87\x20\x76\x9e\xb5\xa3" - "\xdc\x2b\xed\xc1\x66\x7a\x80\x78\xda\x51\x78\xd9\xda\xb0\x9f\xf5" - "\x1e\xe2\x7b\x6f\x99\x82\xfa\x7f\x7b\x68\xfe\x0f\xcd\xc3\xd8\x06" - "\xf3\x10\xfe\x2f\xa2\xae\x97\x28\x7c\x52\xd3\x30\xfd\x3f\x13\xf5" - "\xff\xe6\x85\xae\xe7\xa6\xeb\xf4\xff\x4c\xd4\xff\x9b\x17\xd8\x6e" - "\x8a\xef\x3c\xa6\xb3\x81\x3e\x29\xed\x8f\x65\x58\x45\x7e\xe6\xb3" - "\x8f\xde\x55\x07\x7a\x0f\x7d\xd3\xc6\xba\x69\xeb\x6d\xa3\xfa\xaa" - "\xef\x70\x9c\xa0\x7d\x18\x74\x63\x4d\xa4\x8b\xd4\x96\x51\x7d\x7d" - "\xd6\xc0\xdb\x32\x8f\xa8\x8b\x95\xe5\xcc\x31\xbd\x07\x75\x68\x7d" - "\xa1\x8c\x2b\x62\x6b\xa1\x58\xf7\x31\xb6\x07\xc2\x6d\xbd\xbc\x5d" - "\x54\x91\xbf\xca\xfd\x56\xcf\x15\x20\xbc\xad\x15\x1d\x40\x78\x7d" - "\x83\xed\x24\xc7\x5d\x41\x75\x9c\x70\x12\xee\x4e\x84\x23\xbc\x04" - "\x27\x97\x43\xac\x8d\x79\xb6\x25\xb0\xec\x7c\xfc\x05\xf3\xc6\xf0" - "\xcf\x68\x5c\xc5\x46\xe9\x2a\x97\xb1\x19\x3d\xf4\xcd\xec\xb2\x95" - "\x55\xae\x61\x33\x4a\x68\x4c\xac\x84\xce\x81\x56\xbd\xfd\x77\x7b" - "\x58\xd9\x64\xd0\x89\xb0\x67\xfb\xda\x0c\x6e\xb0\x43\x89\x31\xd8" - "\x46\x94\x28\xfc\x5f\x13\xef\x67\xe2\x5d\x4b\xf3\x13\xa5\xf9\xab" - "\x64\x0f\x98\xcd\xe3\xe2\xfa\x71\xbd\x39\x15\xf4\x4d\x9a\xe6\x44" - "\x89\xfd\xdf\x4a\xca\x15\x63\x6f\x8e\x7d\x7c\x5e\xcd\x5f\x31\xdf" - "\xd2\x30\xa1\x23\x65\x61\xc1\x32\x2d\xa9\xaf\xbc\x48\xdf\x82\x44" - "\x7b\xb0\xc2\xa3\xb4\x8f\x25\x27\x64\xdf\x4d\x11\xde\x25\xb7\x07" - "\x86\x75\x84\xb7\x54\xd1\xce\x94\x70\xff\xdf\x3b\xa4\x5d\x28\x25" - "\xbb\x1e\xa4\x93\x9d\x5c\x87\x4a\x0d\x1d\x4e\xd4\x9b\x12\xd2\xff" - "\xd2\x03\x08\xb3\x9d\xd6\x1c\xe2\x7b\xf8\x25\x28\xcd\xf0\x9a\x41" - "\xd7\xe1\xe0\x6b\xaa\xf4\xa8\x23\x5c\x6f\xa9\xdd\x98\x29\xe6\x23" - "\x39\x15\x79\x14\xcb\x3c\x27\x98\xce\x92\xbf\x82\x98\x4f\x41\xba" - "\x50\x9a\x44\x73\x33\xc6\xf6\xf1\xbd\xb6\xf4\xb2\x0e\xd9\x3c\xdd" - "\xd0\xe9\x51\xf6\x79\x4a\x8f\x87\x2e\x7b\x29\xb5\xff\xb5\x76\x28" - "\x8b\x0b\x96\x6d\x29\x6f\xff\xe5\xef\x3a\x28\x7b\x47\x70\xba\x32" - "\x6d\xb0\xec\x4b\xea\x29\x7e\xd8\x39\x3e\x96\xe5\x67\xb0\x3f\x93" - "\xe3\xe4\xf3\xbd\xca\xb0\xfe\x97\x64\x5e\xcf\x0e\x32\xfd\xf2\x33" - "\x3e\x84\x95\xe6\x05\xa3\xdd\x2a\xdb\x1d\x34\x66\x34\x8e\x8f\x19" - "\xe5\x9c\x87\x0d\xd2\xb7\x9f\x0d\x1d\x0a\xfa\x5a\x86\xf7\x0d\xca" - "\xe8\xfb\x4f\x4e\x68\x9b\x51\x76\x36\xb4\x6f\x50\xe6\x94\xec\x42" - "\x0e\x8b\x52\xea\xc1\x06\x5a\x4f\xc7\xd3\xc8\x7d\x58\x1a\x0b\x1d" - "\xbe\x0f\xbb\x21\x69\xb0\x0f\x5b\x42\xf6\x60\x43\xfc\x60\x1f\xd6" - "\x11\xaa\x0f\x6b\x0f\x21\xcf\x0d\x3b\x43\xcb\x73\x43\x43\xe8\x3e" - "\xec\x86\xe3\xa2\x9d\xdf\xd0\x1b\x2c\xe7\x0d\xa7\xfd\xdf\x84\xcb" - "\x5a\xbe\x3f\x7f\x78\xe3\xec\xa1\xfe\xf0\xc6\xdf\x0a\x59\x6d\xbc" - "\x12\x4c\xdb\xc6\x8c\xd0\xb6\x7d\x63\xe1\xf0\xfe\xf0\xc6\x9d\xc3" - "\xdb\xf6\x8d\xcd\x43\xfd\x61\xc3\x08\x05\x4c\xdb\xa0\xaf\x14\xe4" - "\x9b\x6d\x3c\x2b\xf8\xb4\x89\xfc\x39\x4d\x00\xbc\x33\x58\xdf\x91" - "\x66\xc4\x87\xb6\xed\x02\xd9\x34\x59\x67\x86\xe3\x09\xed\xbd\x74" - "\x5b\x1d\x8c\xc4\x3a\xf0\xae\xcb\xbc\x69\x50\xff\x69\x1e\x1f\xe5" - "\x43\x36\x72\xd8\xf9\x74\x6a\x99\x3e\xa2\x63\x53\xc5\xf5\xbe\x97" - "\x6a\x62\x21\xe3\xe5\x21\xfc\xd8\xc4\xfd\x3f\xc2\x71\x7d\x99\x6d" - "\xea\x53\xd4\x31\xa7\x98\x87\x5b\xfe\x7b\x21\xb7\x72\x45\x5f\xb6" - "\x5c\xc7\xd7\xf4\x0d\x6b\x6f\xcb\xe3\x43\xeb\x68\x79\xd2\xa0\xbd" - "\x2d\xe1\x78\x37\x2b\xe2\x73\x85\x0c\xca\x4f\xf8\xa2\x02\xc7\xba" - "\xcb\xcb\x83\x6d\x52\x79\xae\x22\x9d\xa2\xff\x57\xce\xe9\xf9\x76" - "\xed\x4d\x79\xef\xf0\xed\xcd\xe6\x0d\xa2\xfc\x5b\x14\xdf\x97\x37" - "\xeb\xae\xdf\xde\x6c\x1e\xa6\xfc\x9b\x93\x82\xdb\x9b\x2d\x8a\x6f" - "\xf4\x9b\x73\x43\xb7\x37\x9b\xcb\x65\x3b\x23\xec\xc6\xe6\x3f\x7d" - "\x3b\x7b\xb3\xf9\x58\xb0\xbd\xd9\x5c\xff\x4d\xf6\xa6\x75\x88\xbd" - "\xd9\xec\x8c\x6c\x08\x55\x96\x2d\x11\xa1\xed\xcd\x96\x38\x21\xc3" - "\x2d\x15\xc1\xf6\x66\x4b\x62\xb0\x0c\x37\x2b\x64\xb8\x45\xf1\xfd" - "\x7b\xb3\xee\x7f\xd7\x26\x69\x34\x1a\xb5\x46\xa5\x56\x69\x30\x0a" - "\x8b\x07\xe1\x1a\xad\x26\x0c\xaf\x11\xd2\x3d\x5c\xad\x51\x6b\xf1" - "\x0a\x93\xee\x23\x14\xef\xe1\x94\x16\x2f\xad\x74\x0f\x53\xbc\x8f" - "\xf8\x86\xf8\x70\x29\x5f\x39\x7f\xad\xe2\x3d\xec\x1b\xe2\x47\xfc" - "\x93\xe9\x61\xc8\x7b\xf0\x3a\xc8\x85\xeb\x36\xe6\x15\x17\xe5\xf3" - "\x79\xed\x05\x86\xbc\x95\x2b\x0b\x4a\x4b\x0d\x65\xeb\x0d\x0f\x3e" - "\xb0\xe4\x9e\x39\x06\x31\x3d\xbe\x78\xee\xd4\xfc\x51\x90\xb6\xa9" - "\x84\x22\xd2\x96\x2e\xcc\x32\x64\x3c\xf8\x40\x70\xa4\x8c\x86\x4f" - "\x83\xbf\x1e\x96\x80\xba\x97\xf4\xe2\x38\x80\x3d\xfb\xb9\xdd\xe9" - "\xa1\xb5\xe7\xa2\x3f\x51\xf5\x97\xd3\xb4\x7e\xf9\x5a\x25\xa3\x75" - "\x15\xe7\xa0\x62\x2b\x15\x22\xa1\xb9\x0a\x4c\x4f\xd3\x7e\x2a\x15" - "\x07\xd8\x1f\x1c\x60\x78\x04\xd4\xe7\x60\xd7\x17\x6d\x29\x08\x8b" - "\xef\x36\xbb\x07\x0c\x95\xe4\xdb\x56\xbd\x88\x71\x2a\x76\xbf\x0f" - "\xc3\x9c\xd2\xfa\xfc\xca\x03\x3c\xec\x0f\x55\x32\x5c\xe4\x79\xd8" - "\x3a\x97\xfd\x81\xf1\x77\xda\xb3\x46\xc0\x6d\x8d\x62\xea\xe7\xba" - "\xc8\x2e\x34\x44\x83\x96\xe6\x65\x1f\x88\x06\xdd\x81\x71\xb4\xe7" - "\xee\x56\xad\x3c\x2f\xfb\x45\x7c\xb7\xc3\xae\x5e\xca\x9b\x60\x7d" - "\xea\xe7\xae\x11\x7c\x63\x30\xfc\x2c\xff\x3c\xee\xad\x5a\x35\xc2" - "\xa5\x7f\x06\x91\x91\x5e\xf6\xa5\x3b\x3a\x53\x37\x23\x05\xfd\x34" - "\x14\xc5\x69\x4f\x15\x88\xb5\x51\x5b\xb7\x6e\xf6\x32\x0f\xed\x99" - "\x90\xd6\x57\xc9\xaa\xd7\x82\x16\xeb\xb3\xca\x5a\x42\x6b\x29\xb6" - "\xe6\x37\x15\x80\x16\xcb\x3f\xf1\x02\x6c\xab\x33\x2c\x46\xbf\x31" - "\x0d\xb4\x1f\x97\xd3\x7a\xd7\x9c\x3b\xf7\xfd\x19\xb4\xbf\xba\x56" - "\xa5\xbe\xc6\x62\xa1\xa2\x8c\xf5\x32\xda\x87\xdb\xc9\xdc\x34\xdf" - "\xf6\x74\xae\x97\x60\x26\xb8\x2a\x63\xa1\x13\xdd\x97\xad\x67\x99" - "\x7b\xf7\x9f\xc5\x7e\x15\x1d\x7d\x4e\x5a\x3f\xab\xdb\x9a\x06\x9a" - "\xf3\x59\xa0\xee\x28\xac\x07\x5b\xb6\x13\x2a\xce\xb2\xde\xd3\xb9" - "\x9f\x43\x67\xe1\x31\xc8\xe9\x06\xf5\xe9\x9e\xbf\x01\xdf\x4b\xba" - "\xf6\xc3\xe6\x6d\x57\x20\x76\x6b\x11\x85\x5d\x81\x2d\x5b\x61\xcc" - "\x96\x4f\xa8\x1f\xd4\x8d\xf9\x5c\x84\xa7\xce\x80\x0a\xf1\xa9\x9f" - "\xfb\x1b\xc4\x3e\xf7\x24\xad\x33\x4f\x82\x86\x6d\x10\xcb\x2a\xe3" - "\x23\xae\x55\xc6\xeb\xaf\xb1\xf8\x68\x57\x65\x7c\x4c\xa7\x09\xe1" - "\x7b\xde\x81\xb1\xdd\x10\xf3\x87\x0b\xdd\xea\xfa\xaf\x60\x22\x95" - "\xe9\x3c\x96\xad\xe1\x2b\x84\xaf\x3d\x64\xf0\x61\xda\xc0\x34\x9e" - "\xa8\x43\xb3\x6d\x59\x6e\xf0\x21\xae\xfa\x6b\x30\xb1\xe1\x1a\xc4" - "\xfa\x6a\x0e\x19\x28\x5d\x1f\x54\xd6\xd8\x4e\x03\x6a\x0a\xf3\x0e" - "\xd4\x66\xd3\xb8\x49\xf8\xdb\x4f\x9f\xd0\xda\x4e\xf7\x41\x87\xf3" - "\x1a\x74\xc2\x5f\xc1\x56\xfe\x0f\xeb\xaf\x9e\x3e\x11\x86\xfe\xa4" - "\xca\xba\x85\xe6\xc0\x0b\xdd\xa9\xec\xa0\xfd\xf3\xaa\xa0\x7a\x1b" - "\x44\x98\xb6\x40\xf8\x05\x0c\xe7\xb6\xc7\x92\x8e\x7d\xb0\x7f\x58" - "\xb7\xf0\xf5\xe0\xbb\x7a\xb7\x75\x80\xa6\xd3\x59\x4f\xeb\x8e\xd5" - "\xde\xe8\x0f\x9b\x6d\xce\x2e\xb0\x99\x3e\xb5\xfa\xf4\x1f\xee\xde" - "\xe3\x03\xdd\xaf\xaf\x76\xa9\x6d\xda\xab\x60\xcb\x72\xc2\xbb\x98" - "\x37\xab\xfd\xf0\x28\xda\xac\xa4\x4e\xa7\x9b\xf6\xdf\x31\xb2\xfe" - "\xd8\x51\xd5\x25\x30\xbd\xf1\x2b\x88\x3b\xf4\x15\xc4\x33\x57\xbc" - "\x9a\xd6\x78\xd3\x7e\x69\x87\xf0\x1e\x81\x7d\x30\x2c\x3b\x5f\xeb" - "\xcd\xa2\xa4\xb5\xde\x03\xf1\xd0\x74\xcd\xbf\xd6\xfb\x5a\xbf\x7f" - "\xad\x37\xea\x94\x8e\xd6\x7b\xdb\x61\x5b\x43\xe4\x69\x08\xc7\x7a" - "\x62\x25\xfd\xae\xbe\x04\xda\x1d\x97\x00\x66\x54\xa9\xa9\x9f\xa9" - "\xc5\xfa\xb0\xd5\x86\xb2\xa1\xe7\x73\x50\x35\x0b\xef\x11\x78\x61" - "\x7f\xae\x8a\xef\x55\xd1\x23\xe9\x31\x86\xa9\x31\xec\x16\xbc\x6b" - "\xf0\x7e\x63\x65\x03\x73\x60\x5e\xb4\x96\x62\x14\xe9\xb3\xb4\xbe" - "\xbc\xd7\x65\xae\x8a\xb0\xc3\xd1\x62\x59\xaf\x85\x7d\xdf\xaa\x7b" - "\xf7\xdc\x45\xda\xef\xdd\xc1\xe9\x1a\x28\x54\xd1\xde\xef\x52\x38" - "\xd1\xb0\x81\xf2\xc5\xfc\xb3\xf0\x1e\x29\xfa\xa0\x95\x7d\x72\xda" - "\xfe\x81\x42\xca\x73\x2d\x86\x33\x39\x1c\xcb\xad\xa5\xb8\x7f\x3b" - "\x77\x51\x2d\x60\xe2\xd5\x88\xd3\x2d\xe1\xc7\xba\x5f\x71\x94\xea" - "\x78\xbf\x3a\x92\xb5\xe6\xce\x82\x86\xfd\xec\xf4\xa1\xfd\xac\x4d" - "\xd4\xbd\xaa\x63\x76\xf8\x17\xbe\xf7\x24\xb6\xe1\x6d\x7b\x30\xae" - "\x15\x7b\xe3\xc4\x97\xb6\x7c\x9a\x5f\x5a\xd5\x65\x87\x29\x31\x81" - "\x65\x60\xe6\x2d\xc7\xa8\x1d\xfd\x97\x6d\xed\xd8\x9f\x7c\xee\x58" - "\x67\x4f\x1f\xfc\xea\x5a\x6f\x58\xe5\x47\xa0\xb6\x79\xce\xc1\xcc" - "\x18\x71\x4e\x4e\xd3\x7e\x66\x7f\x99\xce\x0f\xde\xcf\xfa\x50\x5f" - "\x6e\xb9\x00\xdb\x6f\xb9\x2b\x06\x62\xfe\x88\x5e\x89\xb0\x4f\xdb" - "\xef\x0d\xb0\x4f\xef\x74\xd8\x4f\x04\xd8\xa6\x5d\x6b\x87\xda\xa6" - "\x9d\x45\xc2\x36\x61\xdd\xe7\xb6\xc8\x6b\x97\xc2\x1f\x53\x84\x4b" - "\xeb\x57\x76\xde\xa7\x08\x77\x4b\xe1\x53\x15\xe1\x0e\x11\xbe\xa3" - "\x40\xb6\x7d\x9d\x44\xc7\x26\xb2\x7d\x3b\x16\x92\xed\xeb\xcc\x95" - "\x6c\x1f\xb7\x3f\x3b\x12\xd8\xeb\x68\x8b\x36\x92\xbd\xd9\x11\x46" - "\xf4\xb3\x3f\x80\x4c\xfb\xc8\xf3\x60\xfe\x80\xc2\x2c\x7f\x05\x2d" - "\x5e\x92\xdd\xab\xb8\x89\xec\x1e\xd9\x3c\xb2\x7d\x07\xc7\xb1\xee" - "\x83\xfb\xd9\x99\x06\xbe\x6f\xb5\x79\xd0\xfe\xbd\x84\x61\x7b\x30" - "\xec\x25\x8c\x27\x3b\x48\x3c\xe9\xc8\x3a\x01\xfc\x5c\x1b\x4b\x4e" - "\xbc\x4f\x6d\x84\x7d\x28\x6f\xda\xff\x6a\x27\xf2\x37\x52\x05\x26" - "\x5b\x99\x93\xaf\x43\xa1\xbd\xd2\x3b\xcb\x7a\xa8\xde\x8d\xdb\xe1" - "\xa3\x71\x8a\xcf\x61\x9b\x93\x5d\xa0\xb5\x2a\x44\x43\xce\xe6\x47" - "\x68\xaf\x6f\x55\x5b\x21\x00\xed\x4b\x40\x36\x1b\x69\xd1\x5a\x90" - "\x26\xb1\xb7\xb0\xf9\xa4\x1d\x3e\x95\xf4\x75\x17\xad\x55\xc3\x36" - "\x05\x3b\xe2\x66\xb4\x8f\x58\xb6\x48\x6f\x15\xd0\xde\x2c\x74\xbe" - "\x26\xdd\x0f\xaa\x7d\x85\x16\x79\x7f\x16\x33\xda\x06\x84\xb1\x75" - "\xbb\x81\x68\xb6\x83\x39\xb5\xa3\xe2\x04\xa6\xdf\xee\x20\xde\x30" - "\x73\xa5\x8c\x43\xc5\x71\xa8\xf9\xd8\x6d\x21\xc2\xd9\x85\x7f\x93" - "\xad\xeb\xc8\x76\x00\xd9\x7d\x5b\x2f\xe2\xa8\x38\x27\x70\x20\x2e" - "\x86\x6d\x40\x50\x9c\x84\x7f\xcc\x56\xf6\x25\xe2\x3f\x49\xf2\xa2" - "\x7d\xba\x68\x9e\x12\xf2\x25\x82\xf6\x6a\x10\x7e\xa8\x79\x41\xd3" - "\x5f\x01\xa4\xbd\xc6\x50\xdf\xcc\xc9\xb4\x97\x17\xed\x2f\x76\xbd" - "\xbd\xc5\x90\x47\x71\xf2\xfe\x62\xbe\x4d\xdf\xef\xde\x62\x88\x3b" - "\xb6\x51\xcd\xb0\xce\x99\x93\x69\x7f\x31\xa4\xbf\x85\xf4\x50\x2a" - "\x53\xca\x2b\x4f\x11\xcf\xb7\xef\xa1\xb0\x6a\x33\x6b\x97\xe5\x4f" - "\xe5\xa5\xb2\x60\x9c\x49\xf8\x87\x0c\xeb\xe5\xce\x14\x8a\xc7\xb0" - "\x6c\x82\x9f\x89\x76\xcc\x86\x6d\xd8\xdb\xe7\xbc\xea\xea\x2d\xa0" - "\x15\x36\x6d\x57\x1e\xa5\x17\x36\x6d\x57\xac\xdf\xa6\xed\x1a\x23" - "\x6c\x9a\xe0\xb1\xb0\x69\xbb\x54\xc2\xa6\xed\xfc\x9a\xcf\x27\x42" - "\x9b\x46\x71\x64\xd7\x64\x9b\x76\x68\x1c\x6b\x27\xdb\xe1\x32\xef" - "\xec\x95\x6d\xdb\x5e\x0c\x23\xdb\x41\x34\x0a\x3b\xb5\x23\x89\xfd" - "\xcf\x78\x10\xf3\x35\xe9\xb9\x90\xf6\xcf\xe8\x95\x9e\xa9\x3d\x79" - "\x52\xd8\xb8\x5d\x89\x7e\x1b\xb7\xd3\xea\x4f\x4b\x36\x6e\xd7\xa3" - "\xc2\xc6\x89\xf0\xa6\xa7\xc8\xc6\xed\x48\x22\x1e\x48\xf8\xd5\xf4" - "\x1d\x4d\x82\x27\x3e\xa6\x04\xda\xb8\xe0\xfa\xb5\xab\x4e\xb6\x71" - "\x64\xdb\xf0\xbd\xc5\x0e\x93\xf9\xb8\x30\xd5\xb3\x3a\xe4\xb9\x5c" - "\xef\x48\x06\x54\x66\x3a\x3f\x80\xf8\x36\xff\x22\x84\x4b\xfb\xd6" - "\x48\xe5\xde\x65\x97\xd7\x68\x22\xff\x87\xee\x69\x06\xfe\x7d\xc9" - "\x50\xd6\xb7\xd2\x7e\x8e\xb6\xaa\x73\x60\xab\x67\x55\x9d\x9e\xb3" - "\xe0\xdb\xb1\xe6\x33\x92\x2b\xf6\x37\x7e\x4a\x77\xb2\x3b\x17\xe0" - "\xf9\xc9\x39\x4e\x3e\x7e\xff\x59\xb5\x1a\xe3\xca\x83\xe2\xe6\x52" - "\x1e\x34\xae\x88\xcf\xba\xe1\xc6\x11\xbe\x43\x5e\x7b\xaf\x93\xd7" - "\x9b\x3c\x2f\xf4\xa5\xb0\xdf\x13\x75\x09\x9e\xe7\xdf\xd0\xf8\x9e" - "\xcc\xa1\x71\xfd\x45\x8a\xd7\x0c\x13\xff\xf5\xf5\xd3\xbf\x30\xfe" - "\xfa\xe9\x5f\xb8\x8f\x6c\x10\xad\xc7\xf3\x9a\x83\xf1\x8c\xf5\xc8" - "\x70\x17\x08\x2e\x4f\xfa\x0e\xf2\x59\xe5\x64\xde\x2f\x8b\x95\x71" - "\x92\xde\xed\x43\x38\xbe\x7f\x2d\xda\xc8\xe4\xcd\x40\x7b\x07\x07" - "\xa6\x3d\xe4\xe7\xef\x0b\x19\xd7\x19\xa7\x89\xb0\x61\x2f\x90\xce" - "\x97\x6f\xc5\x56\x90\xd6\xd2\xd4\x0d\x7e\x7b\x78\xc1\x89\xf6\x92" - "\x9f\xdf\x2a\xad\xdb\xed\x43\xfb\x76\x2b\xed\xb1\x49\x7e\xa5\xb4" - "\xd6\xe2\x26\xb4\xcb\xd1\xb4\x0f\x0b\x8d\x57\xe7\x78\x33\xd4\xad" - "\x7c\xff\xfd\xdd\x46\x39\xed\x70\x63\x7b\x94\xaf\x94\x27\x5f\x87" - "\x84\x69\xf2\xe5\x34\x84\x9b\xd6\xde\x60\x7b\x7c\x2b\xdf\xdf\xcc" - "\xd3\x47\x36\xf0\x26\xf4\x41\xa3\x45\x3e\xb9\x20\xe5\x53\x6f\x87" - "\xe7\xf3\xaf\xb7\xce\x69\xf8\xf2\xed\x3e\xf3\xdd\xcb\x07\x52\xf9" - "\x5e\xd4\x7f\x43\xf9\xae\x93\xef\x8b\xa9\xdf\x3d\x5f\xbd\x9c\xef" - "\xee\xef\xce\xd7\x17\x4f\x7e\x7b\xbe\x1a\x25\xbe\xbe\xe8\xf8\x06" - "\xbe\x86\xc8\xe7\x67\x71\xdf\x3e\x1f\x83\x94\xcf\xcf\xb2\x42\xe5" - "\x03\xfc\x37\xec\x7e\x3d\x3a\xf9\x8c\x18\xe9\x5c\xe2\x91\x88\xa7" - "\xd9\x0e\xbb\x07\xcf\xb0\x12\xe7\x25\xfd\xec\xb8\x1d\x5e\xac\x0b" - "\x5e\xc7\xf5\xb3\x3f\xe5\x34\x53\xbb\xce\x7c\x76\xf8\xd9\x19\x1a" - "\x6b\x4b\xde\x2a\xf6\x07\x94\xd2\xa0\x3d\x7f\x71\xe2\xf5\xbe\xa7" - "\xf1\xb3\x30\xa4\xbd\x3b\x68\x7d\x2a\xab\x6d\x80\xfe\xca\x42\x10" - "\x67\x45\xbf\x74\x37\xad\x43\xc2\xe7\x70\x7c\x16\xe3\x50\x74\xbe" - "\x80\xd8\x93\x62\x04\x86\x6d\xa7\xf3\x27\xc4\xfa\xbd\x97\x32\x91" - "\x06\xbe\x07\xbb\xd8\x63\x9f\xef\xed\xe2\x44\x38\x35\xa5\x15\x7b" - "\x7a\xbc\x54\x2e\xc3\xd8\x65\x7c\x83\xfb\x5b\xbc\xb4\x50\xb4\x2d" - "\x2f\xa5\xf4\x0f\x73\x8e\x11\xed\x73\xd6\xb2\xcd\x18\xb4\xfe\x70" - "\x41\x49\xc9\xfa\x92\x39\x86\xd2\xb5\x4f\x27\x94\x96\xe5\x95\x6d" - "\x28\xe5\x0b\xd5\x47\x01\x06\x18\xca\x8a\xd6\x16\xac\xdf\x50\x16" - "\xbf\x29\xaf\x48\x2c\x6c\x9f\x86\x80\x81\x40\x10\x7c\x6e\x24\xda" - "\xa0\x2e\xa6\xe6\x7b\x50\xf0\xb3\x23\x69\x2f\x12\x79\xdd\x6e\x5b" - "\x2c\x3f\x63\x0b\x6d\xd6\x9e\x44\x3b\xac\xef\x95\xe5\x40\xfb\x23" - "\xa2\xdf\x12\x7b\x01\xf6\x3c\x49\xba\x93\x8e\x2e\x68\x93\xd8\x57" - "\x82\xef\x0d\x60\x2b\xc3\x80\x4e\xd0\x59\x37\xd2\x38\xec\x9e\x2e" - "\x9f\xf9\x25\x2b\xdf\xef\x71\xcb\x05\x7a\xbf\x22\xfb\x09\xf4\x5d" - "\x49\x7c\x07\xbe\x75\xde\x39\xd8\x33\x95\xf2\xa5\x7a\xd7\x58\x2b" - "\xce\xea\x66\xe6\x97\xba\x69\xad\x36\xbe\xeb\x90\x06\xab\xec\x8b" - "\x22\xbd\x11\x2c\xaa\x41\x67\x87\x3d\xce\xf7\xf5\x0e\x90\xd6\x7a" - "\xeb\x1a\xc5\xba\x6e\x2d\xc2\xf6\x0d\xc2\x9a\x69\xdf\xe3\x06\x1d" - "\xb6\x9b\x21\xbf\x65\xb3\xe8\x22\xda\xeb\x2c\x2c\xb0\xcc\xd8\xaf" - "\x46\xf9\xed\xfd\x39\x96\x3d\x46\xd6\x15\x21\xfb\xbd\x7b\xc5\xde" - "\xcb\x45\x3a\x0c\x1b\x81\x77\x43\x3f\xc6\xd1\x1e\x08\x18\x97\x4b" - "\xdf\xc8\x3a\x2b\x2e\x5b\x5b\x63\xcf\xa1\xdc\xf7\x9a\xec\xb0\x71" - "\xa2\x58\xb7\x86\xf0\x98\x87\xad\xea\x1a\xb4\x19\x98\x95\xc6\xe8" - "\xec\xb0\xf7\x64\x9b\xc1\x09\x4c\xb3\xec\x33\x4a\x87\xf5\x2a\xb6" - "\xb2\x9c\x7c\x11\x0c\xe7\xeb\xf3\xf6\x1e\x93\x79\x5e\x66\x60\x17" - "\x09\x66\xb8\x71\x65\x6a\x2f\xab\x79\x5b\xf2\x15\xd0\x1c\xac\x1e" - "\xd8\x7b\x46\xd9\x5e\x4c\xcd\x9f\x63\xc8\xcf\x2b\x33\x14\x17\xad" - "\x2b\x30\xe4\x17\xe5\x1b\xd6\xad\x2f\x33\xac\x5e\x4f\x03\x3c\x34" - "\xa4\x13\xa4\x13\x3e\x2a\xdf\xa6\xac\x30\xf9\x1b\x76\xff\xa6\xc2" - "\x11\x42\xa7\xab\x13\xfa\x5d\x85\xe1\xc1\x3c\xa9\x8e\x12\x6d\xe5" - "\xbe\x5c\xa4\x5d\x2b\xd6\xff\x69\xb0\x8f\xb9\x0f\xcb\xbf\xb7\x3d" - "\xb8\xee\x56\x2f\x97\x60\xf7\xc8\xb0\x5c\x2f\xa6\x5c\x18\x8c\xab" - "\x96\xf4\xb1\x49\xac\x53\xe6\xfb\xde\x34\xf1\x39\xfc\xfb\xac\xc3" - "\xa6\xa1\xbd\xbe\xb6\xc0\xca\x4b\xb0\xef\x4d\x66\xde\xeb\x94\x74" - "\x48\xe7\xb3\x14\xc5\x4a\xfa\x83\x3a\x51\x0d\x43\xf5\xa7\x3a\x9b" - "\xf4\x87\xb9\xb2\x74\x7c\xbe\x87\xc7\x8d\x76\x0e\xdf\xb1\x7d\xb6" - "\xc3\xbe\x7c\x2a\x87\x73\x53\x96\xae\xf2\x00\xdf\x7f\xef\x0b\xfa" - "\x76\x4a\xe7\xd3\xa0\xae\x8c\x14\xe7\x68\x56\x67\xca\x32\x92\xe1" - "\x43\xd7\x61\xae\x2f\xc1\x3a\x26\xf8\xf9\x6b\xae\x63\xe8\x1f\x20" - "\x4d\x6a\x79\x9f\x3f\x6a\x43\x90\xb6\xb6\xb2\xad\x8c\x61\x1e\x27" - "\x02\xf4\xe0\x52\x28\x3d\x40\xd9\xae\x2c\x5e\xbf\x72\x0d\x56\xf4" - "\x92\x82\xb2\x95\x85\xb4\xb7\x05\xd9\x01\xbe\x71\xc6\xd4\x7c\xc3" - "\x86\xd2\x82\x95\xa3\x20\x14\xd4\x60\x64\xa0\xfc\xf5\x3e\xd4\xd7" - "\xfe\xfe\xac\x30\x5a\x63\x21\xd6\x54\xd4\x6c\xed\x2f\xc5\xbe\x48" - "\x90\xdc\x6b\x9e\xb5\xc5\x1a\xd1\xa7\x33\xf2\xbd\xe3\x88\x67\x62" - "\x9e\x40\xcd\x6f\x89\x0f\xfd\x6a\x15\xb6\x27\x96\x32\x59\x07\xf0" - "\xb9\x0a\xcb\x54\xe8\x9f\xa3\x51\x73\xbc\x5f\x1d\x76\x96\xec\x8f" - "\x98\x0f\x72\x01\xed\x40\x64\xd3\x39\xb0\xf0\xb9\x60\x8d\xbc\x3d" - "\xb2\x1c\x97\xd3\xec\x1b\x5c\xe7\x5c\x33\x51\xd6\x93\x80\x34\x3f" - "\xa7\x30\xbe\xd7\x91\xb9\xba\x8b\x64\xce\x84\xec\xb5\x32\x1c\xf2" - "\x95\x35\x71\x3b\x52\xa3\x53\xda\x86\xf7\xf5\xf4\x4d\x5c\xd0\xc3" - "\xf5\x4f\x5f\xe8\xe0\xfb\xa6\xa0\xaf\x77\x0e\x6a\x6e\x94\xe6\xa7" - "\xf0\x31\x45\x5b\x39\xe2\x72\x0b\x5c\x98\xd7\x55\x39\x2f\x16\x55" - "\xe8\x68\xe2\x7a\x56\x53\xe8\x1f\x33\xac\x89\xa1\xbe\x32\xeb\xcf" - "\x1a\x61\x07\x4b\x26\xd7\x2d\x7c\x2e\x1b\x2f\xf6\x70\x23\x7d\xa3" - "\x72\x92\x5e\xf9\x75\xaa\xe6\x88\x2c\x6f\x2a\x33\xa6\xcb\x36\xf0" - "\x7d\x7e\x6b\xac\x32\x2f\x87\xdb\x6b\x86\xd7\x5b\x7d\x11\x9d\xfb" - "\xc4\xeb\x2e\xef\xe7\x89\xfd\x85\x68\x9d\x8b\x86\x45\x15\xc5\x9e" - "\x87\xda\x3f\xd1\xdc\xfd\x48\x37\xf5\x9b\x8a\x62\x69\xef\x04\xd1" - "\x96\xd5\x1a\x50\x87\x63\xfc\x6b\xd3\x6b\xd1\xff\xb3\xc4\x08\xd9" - "\xd5\x26\x06\xd4\x3d\x87\x34\x1f\x20\x9c\x78\x44\xf6\xcc\x56\xbe" - "\x80\xd7\x57\xb1\xee\xb7\xb6\x50\x4e\xc7\xf7\x19\x40\xdd\xa0\x79" - "\xb0\x97\xa0\x76\x37\xb5\x11\x44\x9f\x1d\x6a\x75\x94\x3f\x95\x8f" - "\xda\x6c\xae\x37\xb1\x74\x06\x4a\x6d\x8b\x82\x86\xe3\x32\x2e\x09" - "\x77\x9b\xfc\x4e\xfb\x8e\xd9\xa1\x2e\x83\xce\x81\x6c\x75\xf2\x32" - "\x8c\x6e\xc3\x5e\x41\x9b\x93\xc3\xf5\xc9\x3c\xc4\xf0\x2a\x7c\x47" - "\x59\xec\x01\xf1\x4d\xa8\x41\x27\x6c\x51\x1d\x9d\x61\xca\x2a\x0d" - "\xb4\x2f\x61\xa2\xb0\x37\x7c\x2f\x1d\x1e\x37\x52\xaa\xb3\x23\x69" - "\x8d\x10\x9f\x17\xe3\xf4\x70\xdb\x20\xf6\x5e\xc0\x78\xac\x23\x2e" - "\x3a\xd3\x65\xa0\x70\xa4\xa0\xed\xe5\xdc\xc1\x3c\xe8\x7c\x4a\xfe" - "\x0d\xf2\xe5\x0c\xb1\x97\x49\x38\xf6\xf5\x5e\xae\x92\xe5\xb7\x73" - "\x3f\x86\xd1\xf9\xa9\x6a\xd0\xb5\xf1\xbd\xc2\x5e\x6e\x90\xe9\x95" - "\xe2\xd4\x5c\x1f\x38\x0f\x5e\x1e\xac\xff\xfd\xfc\xac\xcf\x97\xdb" - "\xe5\x7c\x38\x2c\xc2\x11\x7c\x5b\x1c\x8f\xeb\x19\xc4\x23\xf6\x50" - "\xd1\xf1\xf3\x9e\x9b\x29\xae\x0e\xfc\xb6\xaa\x96\xef\x57\xcc\xe7" - "\xad\x61\x39\x1c\xcf\x15\x8e\xe4\x32\x30\x00\x9d\x0f\x42\xe7\x08" - "\xab\x85\x2e\xd6\xcd\x92\xd3\x68\x54\xc4\xc7\xba\x64\x39\x6f\x19" - "\x07\xd1\x7f\x5d\x9b\x27\xca\xa2\xa5\x3a\x22\x9d\xd9\xc9\xed\x85" - "\xf0\xb5\xea\x3a\xb8\x0e\xf2\x72\xd6\x35\x07\xca\x5a\xf8\x72\x75" - "\xc7\x03\xf4\x81\xe8\x19\x94\x3f\xca\xde\x29\xda\x92\xba\xee\x00" - "\x1a\x93\xf0\xbd\xd7\x2f\x07\x2e\x23\x3a\x03\x2a\xe4\x79\x8f\xbc" - "\xae\x20\x8c\x8f\x71\x3a\x49\x1e\xd8\x17\x9b\x0d\x6d\xe4\x13\x62" - "\x5d\x41\x9e\x20\x8d\xaf\xac\x25\xbd\x72\x99\x5f\x49\x0a\xd6\xcd" - "\x57\x32\x02\xe8\x55\x91\x5d\xc7\xb0\x7c\x19\xc6\x0e\xaf\xf0\xb5" - "\x4c\x32\x3f\x31\xae\x6a\x50\x8e\xf7\x70\x58\x8b\x4c\xe7\x37\xb4" - "\x19\x12\xaf\x5e\xf9\x48\xca\xa3\x5d\xce\x03\x9f\xb1\xff\x53\x97" - "\xad\xc4\xf1\xf4\xe6\xb2\x02\xb1\xb9\x11\x35\xf2\x79\x2b\xd7\x14" - "\xe4\x4f\x37\xe4\xad\xa2\x6d\x90\x4a\x8b\x0b\x0a\x4c\xfc\x23\x4e" - "\xb0\x1f\x18\xc3\xf3\x43\x3e\x88\x3d\xa7\x5f\x7d\xf4\x65\x31\x7f" - "\x85\xea\x05\xd5\x77\x07\xd5\xf7\xd6\x8a\xaf\x78\xdf\xc6\x56\x75" - "\x0f\xd8\xdc\xac\x8a\xfc\x7f\x6e\xfb\xa8\xfc\xb1\x4e\xd1\x0e\xa0" - "\x3c\xa9\x8d\x74\x99\xf7\x9b\x82\xf9\xb5\xbf\x2a\xb8\x2e\xef\xb7" - "\x84\xb6\x13\xfb\xef\xe6\x76\xc2\x22\xf4\x82\xec\x13\xcd\xfd\x27" - "\xbc\x98\xa6\x4d\x81\xf3\x8c\xdf\x46\xed\xb7\xcb\x36\x4a\xb4\x13" - "\xaf\x6a\xb1\x0d\xb2\x48\x79\x79\xfc\x7a\xf3\x6a\x85\xd0\x9b\x57" - "\xb1\xff\xf7\xeb\x9d\x72\x5f\x47\xb4\x1d\xaf\xd8\xc9\x7f\x14\xe7" - "\x6b\xbf\x6a\x94\xf1\xd5\x45\x53\xbb\xf1\x6a\xd2\x50\xff\x61\x7f" - "\x1f\xf9\x0f\x34\x2f\x91\x78\xc1\xcf\x13\xe6\xf5\xe6\xd5\xe2\x00" - "\xfb\xa3\xc7\xf7\x8a\x50\xb2\x7e\x9a\x9a\xe3\x04\xfa\xdc\x96\xb0" - "\x72\x5d\xd9\x5c\xda\xa2\xaa\xa0\xdc\x54\xb0\xb2\xac\x20\x5f\xf9" - "\x9d\x2d\x5e\xf6\xc5\xe8\x1b\x77\x1d\xd6\x7b\x47\x14\xf1\xe3\x55" - "\x2c\xff\x01\x8f\x5c\x06\x6e\xa7\xd0\x77\x94\x6c\x5c\xc4\x79\x38" - "\xf0\x91\x38\x4b\xfc\x55\x8f\xac\x27\x04\x37\xbf\x9c\xf9\x5c\xe6" - "\x7a\x2c\xff\x7e\x9d\xd4\xdf\xc2\x3e\x6d\xbd\x41\x7e\xf7\xa7\xaf" - "\x2f\xe0\x6d\xdf\x7e\x3e\xa7\x0f\x79\x5a\xdf\x13\xe0\x6f\xd1\xfb" - "\x49\xe9\x9d\xef\xc3\x24\xce\x45\xaf\xdf\x2c\xf8\x5b\x8f\xf2\x7f" - "\x45\xb2\x15\x07\xda\x05\x1e\x80\x37\xb6\x39\xc2\x9a\xf8\xf8\x7e" - "\xbd\x45\xce\x0f\xd3\x9f\x0d\xcc\x93\xda\x2d\x25\x3e\x3b\xd4\xf3" - "\xf5\x21\x3b\xf8\x1e\x72\xf5\xa7\x43\xd0\x9a\x11\x08\x87\x30\xd8" - "\xff\x7d\xa5\x41\x2e\xf3\xd2\x72\x0a\x3b\xa0\xbd\x4e\x19\xfb\x44" - "\x19\x0f\x54\x91\x6e\x51\xfe\xa4\xff\x12\x0d\xf9\xd2\xbe\x24\x76" - "\x3a\xbf\x91\xe8\xe7\xfb\xa3\xc5\x52\xbd\x3e\x80\xfd\xdf\x9a\xd3" - "\x72\x39\xa8\x8c\xc7\xb7\x39\xb4\xf2\xbe\x54\x22\xfd\x81\xb9\xc1" - "\xb4\x1d\xd8\x13\x90\xa6\xd7\x3a\x85\xc6\xee\x0f\x4c\x65\xe6\x57" - "\x77\x93\x1e\xd2\x7e\x55\x75\x83\x7a\x78\xe0\xc4\x50\xbd\x3b\x10" - "\x47\x7a\x17\xa8\x4b\x45\xf7\xac\x44\x4d\x2a\x2d\x28\x9b\xc3\xbd" - "\x7b\x74\xec\x68\xdb\xb3\xbc\xb2\xa2\xf5\xeb\x4a\xa7\x1b\x4a\xf3" - "\xf3\xa4\x4a\x1f\x54\xe7\xcd\xbc\xef\xef\x94\xeb\x99\xcb\xfc\x5a" - "\x9c\xdf\xb6\xbc\xe6\xd7\x7f\x9a\xa3\x35\x85\xc6\x66\x5f\xdb\x2c" - "\xea\xd3\x6b\xa9\x01\x75\x97\xa7\xa7\x3a\xda\xc4\x7d\xb6\xd7\x02" - "\xdb\x7f\x27\xf2\x74\xe4\x25\x78\xed\x46\x89\xa7\x4e\xc1\xe3\xd7" - "\xde\xe3\xe5\xe4\xfb\x71\x1d\x38\x43\xe5\xe4\xfb\xbf\x70\xff\xec" - "\xb5\x23\x72\x79\xfd\xfd\x86\xd7\xac\xdc\x8f\x92\xfc\xb5\x6f\xea" - "\xd7\x0b\xff\xf4\x60\xb6\x34\xf6\xd6\x2d\xf7\xf1\x64\xff\x1a\x69" - "\xc9\x17\xbe\xea\xc1\x1b\xd3\x2b\xd8\x40\x4e\x39\xed\x53\x47\x32" - "\x38\xf8\x80\xec\x5b\xf2\xf9\x7b\x35\x85\x6e\x97\xf9\xe0\xec\x40" - "\x3b\xc1\x34\x6b\xba\x25\x1f\xd1\x2d\xfa\xae\xa3\x7f\x77\x0e\xf3" - "\xa2\x6f\x0f\xd7\xa1\x0d\xcb\x75\x10\xed\xdf\xdb\xc7\x09\x0f\xf9" - "\xd7\xac\x3f\x56\x3a\xab\xb2\x81\x7f\xc3\x6b\x44\xdc\x0e\x94\x2d" - "\xc2\xa1\xff\xf7\x1a\xd7\x0d\x1f\xea\x28\xcd\xdd\x71\xca\x3e\x12" - "\x1c\xfc\x84\xda\x22\x7c\x46\xbd\x6d\x88\x17\x3a\xd5\x10\xef\x28" - "\x8d\x87\xfe\xfe\x58\x75\x7f\x69\x96\x96\xc6\x0b\x88\x17\xb6\x06" - "\x37\x08\xfd\x39\xe8\x46\x9b\x77\x24\x10\x9f\x84\x8b\x78\xaa\x25" - "\x3a\x58\x69\xac\x9a\xf4\x9b\xf4\x95\xf5\xc7\xa3\x9f\x70\xd0\xca" - "\x4a\xe3\xd5\xc3\xec\xbd\x75\xbd\x72\x46\xd0\x79\x8f\x74\x06\x28" - "\xd9\x2b\xb1\xbf\xff\xa1\x5d\x2f\x8b\xb1\x01\x29\xdf\x86\x17\x99" - "\xfa\x30\x6f\x57\xf6\xf1\x76\x85\x81\xd8\x2f\xbd\xe1\x08\x9f\x47" - "\x6b\x3a\xcc\xcf\x7c\x95\xd6\x67\x3b\xda\x4c\x1e\x7e\x56\x5d\x65" - "\x19\xf9\x69\x1e\xfa\x6e\xc4\xd7\x1f\xb7\x96\x79\x60\xa9\x9b\x74" - "\xb2\xa1\x9b\xf6\x8a\x17\x67\x81\x37\xf4\xc8\xfb\xc3\xd3\x19\x92" - "\x74\xfe\x29\x96\x4b\xe3\x3f\xbf\xf4\xd0\x49\x1a\xb7\x15\xfd\xf1" - "\x58\xd8\x87\x3e\xbd\x90\xc1\xa1\x04\x3a\x8b\x4f\xf4\x15\xce\xa1" - "\x5c\x34\xff\x40\xd8\x05\xe2\x1b\xb2\x6c\x27\x0e\xbd\x43\x73\xd3" - "\xed\x12\x0e\x97\xf9\x10\xb6\xff\x07\x0b\x45\x5e\x88\xcf\x25\xcb" - "\xf3\x50\xc2\xd0\xf1\x0d\x3f\x3e\x4c\x3f\x5d\xf2\x0b\x40\x8c\x7d" - "\xbd\x4f\xb8\x1a\xe4\xb1\x2f\xbf\xef\x73\xe8\x98\x3c\xf6\x25\xf6" - "\x9e\x6e\x28\xa3\xfc\x87\x1b\x23\x62\x95\x4f\x92\xde\xeb\xc8\x87" - "\x1b\xd6\x9f\xc0\xf6\x9d\x68\x97\xfd\x42\x21\x9f\xc6\x85\xe4\x1f" - "\xd2\x99\xab\xb2\x2f\x29\x7c\x80\xc6\x4c\xd1\x96\x35\xce\x96\xdb" - "\x32\x4c\x7b\x5c\xb2\x15\x52\x3b\xd7\x38\xd8\xff\x0d\x3d\x2f\xbf" - "\xb1\x4c\xe6\x91\xcc\x73\xc1\xa3\xc6\x8e\xfe\xe8\x15\x29\x7e\xde" - "\x36\x76\x70\x5e\x0f\xc6\x37\x85\x05\xf0\x9e\xde\xb5\xc2\x6e\x36" - "\x62\xfb\xdf\x30\x4b\xb4\x29\x22\x8c\x45\x37\x8c\xe6\xe7\xb6\x73" - "\x1e\x14\xf1\xb1\x19\x47\x65\x3c\xd1\xe6\xb0\xab\x8c\x06\x61\xcb" - "\x1a\x11\xfe\x50\x9f\x48\xd7\x58\x4f\xb4\x04\xd2\xfb\xd8\xba\x35" - "\xeb\xd6\x6f\x5a\x47\x03\x6a\x1b\x4a\x0d\x2b\xd7\xe7\x17\x8c\x0a" - "\x31\x1e\x12\x4b\xe7\x5a\x3b\xeb\x06\xf7\x9d\x7a\x5d\x47\xf3\xe8" - "\xc5\x99\x05\xaf\x8f\x34\xdc\x4e\xfa\xd5\xb4\x96\xc6\x0a\xf8\xd9" - "\x11\xb4\xc7\xaa\x18\x37\xe8\xa5\xf4\x82\xd7\x87\xaf\xf4\x6f\x2a" - "\x94\x7c\xac\xc3\xbf\x21\x3e\x4a\x7d\x0e\x86\x65\xfc\x42\x6e\x87" - "\x88\x3e\xee\x9b\x0f\xc4\x73\xbb\xe8\x1b\x28\xd4\x72\x7e\x0d\xc4" - "\x63\x7b\xd3\xd4\x6e\x57\xcd\xf0\x88\x72\x35\x9d\x91\xf9\x41\xe5" - "\x77\xd1\x59\x9b\xac\x08\x75\xf4\x75\x9d\x84\x8b\xec\x27\xe1\x6e" - "\x90\xe7\x71\xd3\x5e\xa2\xd6\x8d\xb4\x8f\x70\xf3\x27\xbe\x1a\xb2" - "\x37\xcd\xb1\xb2\x5d\xa2\xb6\xc8\x87\x78\xde\xbe\xea\x08\xc3\x7a" - "\xf3\x00\xa6\x1d\x77\x0e\x0e\xe7\x8b\xf3\x06\x9a\x93\x83\xcf\x1b" - "\x38\x6c\xc0\x2b\x5f\xba\x76\x06\x3c\x5f\xef\x92\xd3\x64\xf8\xc3" - "\x9a\x9b\x15\x30\x3b\x91\xa6\xa3\x83\xfe\x8a\xd8\xcf\x54\xda\xff" - "\x98\xce\xce\x68\xfe\x82\xf6\x0c\xf5\xeb\x46\xf3\x18\xc9\x07\xe9" - "\x25\xde\x51\x7b\xdb\x03\x87\xc5\x5e\x26\xb5\xa8\x1b\x2c\x0b\xa8" - "\x4c\xcc\x55\x84\x3a\x71\x58\xeb\xd7\x03\xc1\x23\x0c\x8b\xf5\xfb" - "\x29\xcd\x7d\x94\x26\x90\x0f\x98\xc7\x03\xa2\x6f\x7a\x38\x49\x6e" - "\xb3\x69\xbf\x54\x71\xfe\x44\xf3\xd1\xe3\xdb\x7a\xb1\xcf\x7f\x38" - "\x3b\x00\xc7\x51\x69\x2c\x42\xcb\xd4\x4d\xfa\x26\xde\x67\x3b\x5c" - "\xe1\x1f\x13\x68\x3e\x4a\x76\x97\xe3\x88\x6e\xd0\xdb\x9c\xfc\xcc" - "\x68\x95\x7c\x46\x3c\xc2\x1e\x91\x7d\x14\x19\x57\x9b\x18\x73\xe2" - "\x7b\x5c\x62\x1d\xb4\x20\xcc\xe9\xc1\xf1\x58\x0c\x1b\xec\x03\x96" - "\x63\x3d\xe6\xbe\xf7\xe1\x3e\x7f\x5f\xaf\x89\xef\x2b\xc0\xfb\x81" - "\x02\x0f\xfa\x0f\x87\xed\xca\x7e\x1b\xfa\x0f\x86\xa2\x75\x45\xe8" - "\x3e\xac\x36\xad\x9f\x8b\x5d\x87\xd5\xa6\xa2\xb9\x34\xe5\x2b\x2d" - "\x79\x21\xbf\x63\xe5\x98\x1b\x62\xfc\x98\xc6\xbd\xf9\xb9\xcc\x34" - "\x66\x84\xfd\x5c\x1a\x3b\x75\x89\xb3\x52\xc3\xa5\xbb\x4e\xba\x8f" - "\xc0\x76\xcf\x80\x75\x65\x2f\x9d\x7d\x83\xfc\x6f\xf6\x99\xc5\x39" - "\xaf\x52\x9b\x8d\xb6\xfc\xf5\x5d\xf2\xf7\x32\x3e\x07\x9e\xf6\x31" - "\xec\x2f\xe4\xe3\x71\x2e\xf3\xeb\x83\xe3\x1f\x62\x7c\x51\x7c\x73" - "\xc3\xf0\x6e\x39\x5c\x1e\x8f\xc5\xb0\x3e\x79\xec\x55\xc0\xbe\xee" - "\xf1\xa7\x0d\x1a\xdb\x8e\x91\xbf\xc7\xb9\xcc\x6f\x18\x64\x9e\xc9" - "\x78\x2a\x0d\xec\x92\xe4\x27\x69\xb8\x5f\x6d\x7e\x3d\x86\xef\x1d" - "\x4a\xbe\x38\x1f\x67\x7e\x23\x53\xce\x87\xfa\x08\x44\xb7\xf4\xed" - "\x87\xd7\x7b\xda\x23\x54\xec\x31\xfa\xc6\xa0\xfc\x15\x3c\x8f\xff" - "\xd1\x34\x3e\x2e\x1f\x5f\x8a\xfe\xd9\x34\xc5\x38\x1c\xe9\xd0\xcc" - "\x3a\x18\xc9\xc7\x98\x44\x3f\x3d\x8c\x7c\x04\x2c\xc3\x61\x94\xa7" - "\x86\x6c\xb9\x68\xf7\xde\x38\x3b\xd8\xc6\xeb\x1b\x74\x2c\x7a\x45" - "\x32\xed\x33\x2f\xd6\x2d\xbc\xf1\x35\xe9\x9b\xe3\xa6\x35\x2e\x46" - "\x73\x94\x5f\x5d\xe6\x12\xe3\xf0\x2d\xf7\xfa\xc7\xcc\xde\xd8\x2d" - "\xed\x89\x4a\xf3\xdf\x50\x5e\x2d\xd3\x07\x7d\x4e\x84\xe7\xbe\x17" - "\xe2\xa4\x35\x0a\x94\xff\x77\xf8\xce\x83\xfd\xfe\xf7\x8e\x88\x7a" - "\xda\x62\xe5\x38\xd0\x56\x8b\x75\x00\x2d\xe8\xff\xbf\xd1\x20\xda" - "\x06\xc2\x9d\x05\xfd\xd1\xef\x59\xfa\xcd\x1f\x4f\x27\x1e\x3a\xa3" - "\xff\xd2\x25\xf6\x20\x6e\x79\xcf\x69\xd6\xa2\x4c\x5b\x50\xfe\xbf" - "\x1a\xd2\xd7\x95\xf3\x1a\xd8\xc8\xda\x3c\x57\xd9\x89\x7d\x7f\x45" - "\x3b\xb7\x0a\xc0\xb3\x91\x1d\x1b\xb8\xca\x8e\xf3\x33\xc8\x9f\x06" - "\xd8\xfb\x77\x00\xaf\x66\xd9\x17\xd7\x50\x57\x17\x5f\xf1\x5d\xa2" - "\xf3\x02\x9b\x10\x6e\xb1\xf3\x32\x6b\xc4\x34\x8b\x4d\xec\x52\x23" - "\xc2\xa5\x5d\xbc\xc4\x0e\x21\x6c\x5a\x21\xea\xca\x46\xe6\xf1\x6a" - "\xd6\x7c\x61\x78\x9c\x6c\xf7\xcf\x93\x1d\x35\x05\x99\xcc\xac\xae" - "\x66\x3b\xee\xba\xd3\x65\xfe\x79\xc6\xe0\x39\x65\x88\x97\xf4\x2a" - "\xbd\x9c\x9e\xd7\x7c\x81\x7a\xf0\x45\x0e\xfa\x1d\xa8\xb7\x5f\x20" - "\x1c\x7d\xff\xe1\x6b\xb3\x1c\x9a\x3b\xa3\xf1\x8a\x0f\x49\xff\x55" - "\xd6\xe6\xdd\xc8\x4e\x54\xaf\x40\xfa\x2f\x20\xfd\x57\xd9\x31\x2c" - "\xc3\xf1\x7d\xe7\x01\x88\x7e\x2f\xe1\xf4\x82\x26\x67\xb3\x2a\xaa" - "\x09\xe3\x73\xca\xf5\xd0\x84\xb0\x2b\x9c\x10\xd5\x88\x30\x2b\x9e" - "\x8d\x02\x4e\x7f\x1f\xd2\x1d\x55\x90\xe9\xc5\xbc\x89\x7e\xcc\xdf" - "\x2d\xd3\x29\xe7\x4f\xf4\xca\xf5\x36\x87\xc6\x08\xa3\x57\xec\x21" - "\xba\xc5\x77\x8f\x5f\xe4\x39\x4a\x51\xce\x9a\xbb\xee\x14\x7d\xec" - "\x5f\xcc\x96\xe9\x0f\xfe\x0e\xf6\x8b\x2a\x61\x3f\x7f\x81\xfd\x9f" - "\x16\xe9\x4c\x17\x11\x46\xe5\x77\x60\xbd\x95\xd6\xfe\x7d\x21\xf3" - "\x0c\xe3\xa7\x2b\xbf\x73\x65\xac\x2f\xe1\x63\xd4\x79\x2b\xcb\x8a" - "\x36\xe6\x61\xcf\x77\x14\x98\x28\x88\xf7\x8d\x0b\xf2\x0d\xeb\xd7" - "\x19\x56\xe5\x15\x15\xaf\xdf\x58\x50\x32\x9d\x0f\x67\x94\x16\xac" - "\xcb\xa7\xa1\xeb\x92\xbc\x12\xd3\x28\x45\x7f\xc6\x52\x90\xd9\x49" - "\x67\xd0\x6c\x23\xfd\x7e\xf3\x23\x69\xdc\xd6\xcd\xcc\x49\xbc\x5f" - "\x2c\x6c\xcc\x2f\xef\x35\x6c\x49\xa2\xf8\x77\x44\x3b\xfe\x66\x3b" - "\xab\x5d\xb1\x97\x31\x7e\xb6\xb6\xea\x12\xbc\xf9\x5b\xce\x8f\xfe" - "\x14\x19\x0f\xef\xbb\x92\xce\x9a\xb6\x90\x1f\xf6\xcb\x6c\x46\xf1" - "\x41\xbc\x78\x73\xaf\xf0\x45\x30\x7c\x20\x05\xfc\xf3\xed\xdf\xfc" - "\x88\xa9\xb1\xec\xc8\x4b\xd1\x67\x28\x8a\x97\xd6\x3d\x7e\x78\x0e" - "\xde\xa4\xbe\x14\x7d\xb7\xe9\xe2\x3e\x39\x5f\x9f\xf5\x66\x11\xab" - "\x29\x8a\x67\xe6\x11\x11\xc4\xaf\x7d\xa2\x4f\xaf\x8e\x54\xd1\xd9" - "\xb9\xe7\x68\xad\xa8\x91\xbe\xef\x36\x99\x7d\x46\xff\xfc\xa6\x5f" - "\xec\xa1\xfe\x05\xff\xce\xc1\x6d\xd2\x2f\x7b\xe5\xba\xab\xa6\xf5" - "\x37\x3b\x26\xcc\x11\xf5\xef\x97\x17\x09\x1e\xe5\x3f\x47\x94\x8f" - "\x9f\x03\x8e\xbe\xc1\x9b\x61\x58\xfe\x7d\xac\x32\x45\xfa\x26\xf9" - "\x66\x98\x2f\xfa\x6f\x5d\xde\x52\xec\x17\xe8\xff\x9e\x81\x71\xbf" - "\xf0\xd5\xae\xd8\xef\x45\x9f\xca\x87\xfd\x04\x56\xfb\xf7\xa5\xde" - "\xda\x15\x16\xdf\xa6\x78\x35\xb5\xad\x95\xe5\xc8\xdf\xf5\x85\xa3" - "\xd8\xe5\xc2\xd1\xde\x4d\xf1\xe8\x7f\xad\xa8\x67\x0c\xd3\x46\xaf" - "\x38\xc2\xcf\x2b\xae\x5d\xf1\x9a\xf4\xfe\x16\xbd\xfb\xd0\x4f\xc6" - "\xb0\x63\xf8\xfe\xaf\x3e\x16\x00\x1f\x0c\x7b\x9c\xde\x23\x55\x7c" - "\x5e\xa5\x11\xfb\x25\x89\x54\x76\xb9\xcc\xbc\x7f\x46\x63\x44\x83" - "\x65\x7b\x13\xe4\x70\xea\x37\x08\x1f\x1e\x56\x22\x8f\xc5\x5e\x16" - "\x83\x70\x47\xfe\x22\xf3\x40\x9c\xcf\xbd\x02\xfb\xe1\x6f\xb6\xfb" - "\xe8\x6c\xf4\x1d\x37\xdf\xc9\xd4\xbf\x68\x22\x9b\x95\xee\xe5\xb6" - "\x10\xc4\x77\xa7\x37\x67\xcb\xfc\xa4\x75\x04\x64\x4b\x51\x6e\xf1" - "\x39\x0e\x18\x25\xec\xc0\x9b\x59\x01\xfd\xc3\x3e\x92\xb5\x1d\x8e" - "\x48\xfb\x6c\xe9\x76\x88\xf7\x5f\x1e\x11\x75\xe5\xcd\x9d\x32\x2c" - "\x86\x89\xfd\x7e\x2c\x39\xc5\x9b\x3c\x30\xc1\x74\x3f\x3b\x8f\x32" - "\xca\x92\xe0\x8e\xfa\xeb\x94\xd0\x37\xbc\xcf\xa6\xfe\x35\x7d\x7f" - "\xa4\xe7\xc6\x61\xd6\xc2\x6e\x6b\x60\x8c\xda\x2b\x6a\x3f\x0d\x13" - "\x00\x3a\x9d\xd4\xb7\x7a\x4b\xd7\xda\xe0\x04\x2e\xe7\xe8\x15\x7b" - "\xfb\x59\x21\xa0\x4f\x19\xb2\x2f\x41\x69\x10\x3e\x99\xf7\x93\xb0" - "\x5e\xf8\xb0\x5e\x60\x9a\x7d\xa4\xd7\xdb\xae\x50\xff\xe5\xad\x9d" - "\x6d\x15\xbd\xb4\x57\x3f\xea\xeb\x5b\x3b\x89\x87\x54\x0f\xf6\x99" - "\xf9\x3a\x48\xde\x4e\x5a\x37\xce\x22\x1c\xcf\x8e\x75\x83\xb6\x13" - "\x5b\x08\x94\x8b\xdb\xb4\x0d\xa2\x2e\x20\xbc\xb6\x0c\x74\xd4\x87" - "\x0d\x6e\x43\x42\xb7\x1f\xfd\xfa\xa2\xac\xfe\xda\x22\xa3\xcb\xfc" - "\xd6\x49\xb4\xfd\xc3\xee\x9f\xb8\x63\x1c\xfa\x35\x08\x67\x99\x40" - "\xdf\xaa\xdf\xea\xbd\x1e\xac\xbc\x36\x97\x74\x65\x66\x2c\x8d\xa7" - "\x14\x65\xf1\x6f\xde\xd1\x45\x46\x31\x6e\xf9\xab\x78\x39\x3d\x8d" - "\x7b\xd2\xbc\x82\xea\x6b\x10\x5b\x3d\xd8\x57\xfc\x55\x86\x90\xd1" - "\xaf\x32\xe4\xfe\x45\xa8\x7c\xca\x5a\x98\xaf\x72\x2a\xa8\x6d\x06" - "\x07\xcc\x70\x43\x44\xe3\x6b\x00\x96\xff\x45\xdc\xdb\x80\x47\x55" - "\x5d\xfb\xc3\xfb\x4c\x86\x10\x30\x64\x26\x31\xe0\x88\x41\x06\x0d" - "\x36\x6a\x80\xa8\xd8\xa2\x7f\xac\x51\xa0\xc5\x0a\x26\xb5\xd8\xc6" - "\x16\x3b\x41\x12\x4c\x90\x8f\x31\x04\x18\x62\xc8\x17\xdc\xfc\x53" - "\x0b\x61\xc0\xc0\x45\x09\x10\x7b\xb1\x2f\xde\x8b\x10\x5b\x6c\x63" - "\x8b\x30\x40\xd4\xa8\x21\x93\xda\x68\x83\x17\x75\x88\x01\x23\x0d" - "\x30\x92\x81\x0c\xc9\xcc\xd9\xef\x6f\xed\x7d\x4e\x66\x82\x09\x2d" - "\xbd\xf7\x79\xdf\x3c\xcf\xe4\x9c\xbd\xcf\xfe\x5c\x7b\xef\xb5\xd7" - "\x5a\x7b\xed\xb5\x0a\xb8\xff\xc5\x02\xcc\x23\xc0\x98\x1b\xfe\xb3" - "\x81\xf4\x2f\x76\x62\x8f\xae\x54\x19\x8b\x40\x5b\x5e\xbc\x84\x3a" - "\x8b\x64\x3a\x2e\xed\xaa\x59\x90\xce\x87\x67\x3c\xf0\x08\xab\x2a" - "\x62\x51\x55\x2a\x33\x3a\x8b\x58\x02\xe2\x40\x57\xfc\x57\x8b\xce" - "\x0b\x0c\x78\x2e\xbc\x03\xf8\x11\xf5\x96\x16\xf1\xc0\x11\xf0\x77" - "\x65\x2a\xf7\xff\x33\x70\xf7\xb0\x3d\x93\x65\x1f\xf7\x4c\xd6\x79" - "\x03\xbc\xa7\xf6\xbf\x63\xbd\x27\xe9\xca\x33\xe6\xa7\x97\x2e\xcd" - "\xb7\xe5\x65\xd3\x23\x69\xfc\xf2\xdb\xaf\xa4\x15\xa3\xa5\x3f\xaa" - "\x3d\x19\xb4\xb6\x88\x7e\x92\x77\x95\xf6\x6c\x0d\x93\xf7\x90\xcc" - "\xf9\x41\xa2\xfb\x48\xd7\x04\xdf\xf6\x1f\x16\x57\x07\x98\x72\x32" - "\x8a\x19\xae\xac\x6f\xc1\xbc\xfc\x79\x8b\xee\x97\x6a\x0d\x03\xd4" - "\xd3\xd0\xbf\x9e\xd7\xfb\xce\x7f\x35\xde\xdc\x27\xf0\xe3\xc6\xcf" - "\x53\x79\xec\x11\x8f\xdc\xeb\x5e\x4f\xd4\x75\x07\x07\xb6\xe9\x62" - "\x33\x06\x37\x6d\xcf\xa4\x35\x52\xbc\x9a\x19\x7e\x5f\xd0\x6a\x20" - "\xbe\xa4\x08\xef\xa4\xcb\x25\xe4\xdf\x9a\xaf\xc8\x83\x17\x5a\xb1" - "\x97\xbe\xee\xe0\x1b\x6d\xe0\x39\x5e\xb7\x0f\xa6\xbf\x15\x7e\x1f" - "\x5e\x9e\xdd\xbf\xee\xbc\x8a\xae\x97\x48\xaf\xeb\x69\xf4\xcf\xb7" - "\x77\x88\x1c\xb3\xd7\x31\xff\xff\xb3\x46\x9f\xbf\x7a\x9a\x0d\xa3" - "\x74\x1f\x9c\xaf\x0f\x6a\x07\x99\x3b\x73\x33\xe5\x1c\xdf\x3b\x43" - "\x9c\x51\x8f\x66\xff\xb7\x8d\xed\x7d\xc8\x68\x61\x16\xbc\xff\x3f" - "\x78\x17\x32\x0c\xfa\xd6\x6f\x1e\x8d\xe9\xac\x31\x02\xe3\x00\xf3" - "\x28\x5c\xfe\x81\xf0\x93\x7f\x11\xf8\x19\xb8\x22\x6e\xad\x44\x60" - "\x04\x87\x46\x1a\x99\x29\x26\x3a\x6a\xec\xcd\x09\x96\x07\xbf\x3f" - "\x75\x4a\x71\x51\xa1\x83\xab\x01\xbf\x89\x87\xfb\x4d\x3d\x52\xf1" - "\xc4\xed\x25\x92\x7e\xd8\x78\xa4\x62\xa0\xb6\xae\x2f\xe3\x76\xe2" - "\x69\xd5\xb8\xe3\xb5\xc5\xcb\x99\x61\x5f\x8f\xc7\x40\x3c\x14\xd1" - "\x30\xee\xc0\x67\xe0\xc5\xf7\xfe\xe5\x10\xe2\x00\x2f\x07\x77\x1e" - "\xaf\x95\x77\x92\xf6\xc5\xaa\x9b\x8e\xd7\x86\xca\x37\x32\x2a\x1f" - "\x7c\xba\x61\x57\x51\x87\xc1\x6d\xfc\x3e\x73\x5b\x7d\xec\x10\xde" - "\x07\x1c\x2b\xd4\x49\x32\x61\x2a\x03\x7b\x70\x45\xf1\x65\xec\xcd" - "\x0e\x71\x3e\x63\x38\xc7\xf6\x3d\x52\x3b\x48\x3e\x71\xc6\x1a\x97" - "\x1d\xd9\x5d\xb6\x0f\xf8\xff\xe9\x44\x8d\x0f\x01\x9f\xb4\xaf\x4a" - "\xdf\x0f\xf0\x7d\x88\x3c\x27\xda\xb7\x5b\x4f\x33\xe0\x18\xbd\x40" - "\xba\xce\xdc\x45\xf3\x80\x5f\xea\xe8\x20\xdb\x8b\x83\xcc\x95\xe9" - "\xa0\x51\xc6\x10\x6e\x1e\x51\x6a\x8e\x8c\x29\x4d\x59\xdc\x08\xda" - "\x68\x44\xe7\x48\x16\xe3\x7b\x8a\xda\x4c\xfa\xf6\xcd\xdb\xc1\x73" - "\xd2\xf9\xb0\x49\x49\xc9\x35\x95\xa6\xcc\x0b\x96\x4d\xbd\x87\x68" - "\x28\x93\xe3\x11\xc5\x14\x78\x48\x09\x94\x4d\xbe\x67\xa7\xf4\x55" - "\xe4\x73\x8e\xe2\xad\xc8\x73\x02\x79\x3c\xf8\x91\x5f\x92\xc6\xd3" - "\xac\x36\x17\xcf\x06\x93\xc2\x77\x9a\x30\x92\x93\x4a\x84\xef\x56" - "\xda\x9f\x1b\x79\x1c\x78\xbb\x5e\x21\x83\x1b\x12\x92\xc1\xd5\xae" - "\xc3\xb8\x45\xce\xfa\x37\x7e\x08\x65\x35\x04\x2f\xa9\x0d\x3b\xce" - "\x11\x3e\x14\x7c\x55\x0b\x70\x40\x4b\x72\x15\xb3\x68\x3a\xd3\x86" - "\xc6\x40\x03\xed\xc3\x64\x73\xa0\x1e\x75\x1e\xc0\xaf\xce\xba\x84" - "\x45\x9c\x63\xb5\x9f\xe9\x3a\x57\x92\xae\xfb\xdd\x13\x9a\x1c\xc0" - "\x35\x11\xf9\x57\x2f\xa6\x39\xd1\x61\x08\xa0\x7c\xf0\xda\x0d\xee" - "\x9c\x06\xa1\xc3\x46\x77\x12\x28\x0d\xea\x48\x72\xfb\x1b\x98\xca" - "\x2d\x06\x84\xeb\xe8\x7e\x01\x47\xda\x26\x47\x2b\x6b\xb2\xfb\xb1" - "\x6f\x36\x82\xf7\x4c\x4a\x44\x7b\x44\x79\xf8\xde\xb2\x0f\xe3\x6b" - "\x05\xcf\x80\xf2\x9a\x49\x27\x8e\xee\xee\xf3\x65\x49\xb7\x21\x7f" - "\x3d\xef\xb5\x18\xa8\xfc\x73\xec\x8d\x53\xbc\x2b\x29\x69\x52\xa7" - "\xf4\x65\xda\xc6\xde\x38\x80\x76\xde\x1c\xd6\xce\x19\x68\xbf\x11" - "\x7b\xa5\x0b\x65\x1e\xe0\x2b\x50\x67\x3b\xea\xf4\x79\x49\xff\x33" - "\x91\xaf\xb4\x18\xa9\xcd\x4d\xd4\x5e\x47\x90\xf1\x95\x49\xc6\x0d" - "\x17\x98\x11\x6b\xc1\xb5\x13\x4f\xf4\x7f\x3f\xe8\xfa\x84\xee\xb2" - "\x37\xfa\xec\x3f\x10\x1d\x89\xb0\x47\x9f\x4b\xeb\x91\x06\x6d\xac" - "\x43\xbb\x0e\x8c\xe8\x64\x24\x5b\x18\x82\x79\x3a\x04\xf5\x0e\xc5" - "\x58\xd5\x01\x76\x87\x01\xeb\x03\xd4\x27\xf5\x92\xda\xa1\xa2\xbc" - "\x0d\x97\xd0\xa6\x65\x16\x63\x74\x3b\xf9\x79\xef\xe6\x80\x77\x4b" - "\x9a\xa3\x9b\x93\xbe\x38\xe9\x5e\x23\xcf\x76\xf4\x15\xb8\xec\x77" - "\x85\xc4\xe7\x9f\x66\x6f\xac\x95\xbe\x58\xdf\xa8\xd0\xce\x92\x5b" - "\xa4\x7c\xb7\xf6\x33\x82\x3d\xf5\x2b\xba\xd4\x5c\xee\xee\xf0\xb2" - "\xe8\xf6\x91\xa0\x59\xde\x60\xd5\x2a\xd1\xa7\xbf\xab\xd0\xdb\x39" - "\xc8\x1a\xf3\xbb\x81\x5f\xd4\x4b\xbc\x83\xf8\x17\xa9\x67\xf6\xbb" - "\x03\x36\x47\x44\x2a\x78\x15\x03\xda\x49\xf7\x98\x46\x81\x46\x7b" - "\x90\xf4\x10\xd1\x3e\xec\xd9\xbf\x3b\x71\x35\x1f\xc8\x80\x0f\xe8" - "\x82\xdf\xa3\x0d\xbf\x13\xf2\x54\xf2\x11\x2b\x65\xac\xbf\x8f\xd7" - "\xed\x70\xf0\x4b\xbc\x90\xf6\x5e\xd4\x5b\xb2\x76\x85\xa8\x83\xfc" - "\xe2\x76\xe4\x5b\xf9\xc9\x7a\xab\x77\x50\x5b\x07\x61\xfa\x73\x5e" - "\xcd\xd7\x9e\xd0\x25\xe8\xaf\x3f\xf7\xfb\xc2\x30\x79\x0d\xe9\x13" - "\x94\x90\xce\x84\xb4\x97\xf4\x7b\xa1\x13\x98\xe6\x90\x76\x61\xdc" - "\xfe\x4e\x8d\xef\xf8\xfd\xfb\xc2\xff\x16\xd1\xb4\x42\xe7\xee\x8c" - "\xa6\x27\xf7\xfb\x79\x54\x47\xfd\x15\x3e\xbe\xb3\x97\xcc\x7b\x7a" - "\x51\xb6\x14\x61\x4e\x58\x98\x3f\xef\x99\xfe\xbc\x91\x51\xf0\xe2" - "\x65\xbf\x6f\x91\x67\x02\xfb\xa3\xc3\x78\x04\x63\x9f\x4c\xd7\xc0" - "\xf6\x4b\xb9\xee\xfe\xe4\x81\xe4\xba\x8f\x3c\xb3\x64\x69\x9e\xa8" - "\x43\xa8\x14\x66\xcb\x5b\x81\xc3\xd9\x13\xd3\x1f\x99\x3e\x61\x59" - "\x76\xbe\x70\xaa\x23\x85\xa8\xf3\xb2\xb2\xf2\x34\x85\xc3\x5c\xca" - "\x45\x5f\x16\xac\x14\x59\xed\xcf\xe6\x4b\x55\xc5\x65\x8b\xe6\xad" - "\xc8\xd6\x8a\x08\x6f\x6b\x02\xe1\xcb\xfa\x6a\x21\xab\x1a\x2e\xf5" - "\x23\xf6\x1f\x08\x3b\x4f\x0d\x97\xdf\xdc\x88\x6f\x7d\xe7\xff\xf6" - "\x5b\x68\xae\xbc\x99\xdb\x54\x23\x6c\x99\x18\x8f\xfe\x86\xe0\xfb" - "\xe6\x0c\xf2\x03\x81\xbd\xad\x84\xfc\x16\x6b\xba\x07\xc0\xd7\x6f" - "\x8e\x03\xaf\x55\x02\xf8\x3a\xd2\x82\x2a\x07\x4e\x05\x9f\xfe\x56" - "\xbc\x26\x13\x89\x52\x0d\xfb\xa7\x90\xde\xd8\x0e\x21\xbf\x7b\x73" - "\x6a\x48\x7e\xf7\x16\xe9\xf4\x44\x61\xbc\xdb\xa9\x6d\xd4\x4e\x7c" - "\x9f\x1b\xa6\xb3\xd3\xee\x01\x18\xa9\x1c\xd2\x2d\x11\x3e\x5a\x40" - "\x13\x6b\xf6\x20\x0c\x4d\xbf\xa1\x7d\xe8\x8f\x6b\x09\xe7\xaa\xce" - "\x5c\x87\x5c\x33\x7f\xd8\xce\x37\x65\x0f\x9d\xe4\x63\xf1\x12\x67" - "\xbc\x49\xbc\xf8\xf5\x68\x63\x3d\xe2\xa3\x80\x77\x86\x10\x6d\x24" - "\xcf\xa8\xde\xfc\x5a\x93\xe7\x11\x7c\x86\x84\xb5\xc1\x13\x92\xf9" - "\xbd\x15\xef\x8d\xcd\x75\xac\x95\x3a\x39\x42\xff\x40\xea\x80\xfc" - "\xc1\xd8\x27\xe3\x42\xdd\xda\x99\x7b\xfc\x69\xa4\x07\x2c\x1c\xda" - "\x39\x38\xf5\x3d\x9d\xfa\x2d\x75\x29\xff\xd0\x8f\xff\x91\x3e\x31" - "\xb2\x87\xaa\x52\x5f\x96\xda\x9e\x2d\xe8\x28\x92\x2f\xf6\x10\xbc" - "\xff\xb0\x0a\xdf\xb1\xd7\xfd\xc1\xee\x61\xbf\xef\x6b\x0f\xb5\x39" - "\xdf\x01\x62\x00\xf9\x68\xef\x43\x9b\x86\x22\x4d\x55\xa8\xcd\x7f" - "\x10\x67\xa3\xc4\x53\x4a\x1a\xe4\x8f\x51\x52\xce\x9b\x5b\x11\x36" - "\x6e\xc6\x73\xec\x0f\x5f\xa3\xad\x15\x6b\xa4\xee\xcb\x10\x5d\xa7" - "\x04\x65\xf5\xeb\x7f\x48\x06\xbb\x7f\x89\x94\xc1\xfe\x91\x85\xc6" - "\xf0\x0f\xf5\x34\xef\x49\x6f\x48\xd7\x19\xa2\xf1\x94\xfe\x42\xfe" - "\x98\xa4\x97\xa3\xc6\xe5\xe6\x10\x9f\x5c\x29\xcf\xbf\x31\x2e\x7f" - "\xcc\x8d\x50\x4e\x0a\x5a\x6a\x92\x9f\xd5\x20\x2e\x12\x71\x4f\x51" - "\x3a\xaa\x53\xc8\x2a\x01\x1b\xea\x8b\x0a\x1e\x2b\xc2\x12\x99\x86" - "\xf2\x30\xaf\xf6\xb4\x84\xe6\xc6\x1f\x53\x05\xbe\xd4\x60\xcd\xcb" - "\xf6\xaf\x09\xf1\xee\x7f\xdc\xd5\x27\x77\x43\x39\xa1\x3d\xe3\x8f" - "\xef\x13\x8c\x37\xf4\xc9\x20\xea\x02\xa2\x1d\xf2\x3c\xf5\xc8\x69" - "\x56\x77\x96\x83\xbe\xa0\xbd\x96\xf8\x43\x1a\x7b\x41\xef\x09\xf9" - "\x59\xdd\xab\x3b\xe4\x99\xc5\x16\xbc\xbf\xa6\x1a\x06\x9a\x3b\x75" - "\x09\xe1\xfa\xbd\x12\xfe\x75\x59\x2a\x95\x89\xfe\x53\x59\xd8\x7f" - "\x14\x5d\xae\xa9\x95\xfb\x04\xca\xfc\xf7\xd3\x1a\xac\xc5\x59\xde" - "\x26\x0d\x0e\x34\xc6\x02\xe6\x75\xf9\x98\x03\xc2\x67\x5a\x71\x0d" - "\x3f\xbb\x14\x65\x48\xdf\xba\x75\x55\x9c\x60\xab\xa5\xf7\x12\xff" - "\x8d\xb6\xcb\x3b\x91\x98\x8b\xe0\x4d\xa9\x9d\xea\xa6\x5c\x3b\xb5" - "\x9d\xce\xf1\x42\x32\x95\xba\xf7\x29\xaf\xf7\x79\x99\x67\x83\x3c" - "\x67\xc4\xd8\xd4\x29\x7c\x65\x0e\xd3\xce\xb7\x30\xcf\xff\x40\x7e" - "\xd7\x0c\x54\x8e\x4f\xf0\xcc\x75\x1e\x15\x70\xc1\x98\xc4\x75\x97" - "\xbd\x15\xad\x8f\x09\xc6\xa3\xe1\x2a\xf4\x36\xc6\xe4\xad\x29\xba" - "\x6d\x25\xda\x9b\xb0\x86\x4b\x24\x2d\xf9\xd6\x65\x53\xe9\x83\xdc" - "\x14\xb8\xe7\x1e\xa2\x8d\x76\x1a\x84\x2c\x54\xd7\x5f\x1d\x0b\x38" - "\x9d\xd7\xef\x02\xa8\x6b\x7e\xd1\x4a\xba\xbf\x6e\xbf\xd4\xfd\xa5" - "\xf8\xc7\x7c\x5c\x6d\xf2\x05\xe9\x2e\x4c\x2b\xea\xa8\xd6\xf9\x2c" - "\xc2\x6f\x11\xa5\x0a\x60\xf7\x16\xdd\x7f\x3c\xa0\xe1\xb5\xa1\x67" - "\xd8\x5b\xc7\xb5\xf2\xc3\xdb\x30\x47\x9e\x29\xbe\xe5\x97\xb4\xff" - "\x5b\x84\x7b\xaa\x24\xbf\xf6\x96\x57\x6f\x37\xbe\x1f\xb8\xb2\x8f" - "\xe9\xd3\x1e\xc9\xb6\x2e\x22\x14\x9d\x72\xb7\xc3\x9a\x34\x3e\x6b" - "\x92\x50\x16\xb7\xfe\x60\xda\xfd\xd6\xf4\x07\xc6\x3b\x72\x92\x1f" - "\x93\x8f\x69\xe9\xb3\xe8\x79\x85\xee\x80\xb5\xbb\xec\x4f\xe9\xfd" - "\xf9\xc1\x43\x5a\x1b\xfe\x94\xe3\x51\x7e\x24\x64\x17\xdc\x6c\x4b" - "\xe5\xce\xd9\x25\xd8\x53\x3b\x89\x4e\x4e\x0b\x7e\xc1\xf9\xc6\xd9" - "\x25\x3c\xd6\x96\xea\x8d\x3d\x52\x81\x5f\xba\x37\x36\x3b\x79\x03" - "\x70\xa0\xa9\x94\xfb\x4d\x81\xa1\x12\x57\x22\x0c\x9a\xa4\x03\x74" - "\x0f\x8d\x25\x9b\x71\x7b\x31\x4f\x0b\x72\x37\xe8\x1f\xc0\xe5\x4f" - "\x0d\xfa\x3e\x2e\xe4\x98\x4e\x5b\x6a\x9a\x83\xf7\xd2\xdc\x01\x7d" - "\x40\xf7\x69\x53\x49\x96\x89\x74\xe8\xff\xbe\x14\x09\x8b\x3f\x11" - "\x0c\xac\x1a\x7c\xd3\xbb\xcb\xfe\x8c\xf1\x4f\x13\xb2\x67\xb5\xcc" - "\x22\xf6\x0a\x75\xcd\x1d\x8f\x83\x17\x48\xd7\xcb\x44\x59\xd1\xda" - "\xdd\x32\x51\x1e\x0b\xb3\x4d\x70\xb5\x9f\xba\x29\x73\x0e\xc9\xad" - "\xe8\x5e\xb0\xc9\xa1\x90\xff\xad\x8c\x3e\x59\x1d\xbe\xc5\x94\x9a" - "\x49\x7e\x97\x11\xe3\x53\x4a\x28\x4d\x48\xa6\xa5\x7a\x36\x18\x54" - "\x3f\xe8\x09\x33\xcd\x0f\x41\xab\x0a\x7d\x8a\x3f\xd7\xf5\x9d\xcf" - "\xf5\x1b\xfb\x3f\x8b\xf9\x70\xa1\xcc\x88\xb9\xfd\xa7\xd4\x5b\xe2" - "\x25\xed\xa4\x96\x29\x4c\xda\x8a\xf8\xf3\xeb\x62\x5d\x6a\xf3\x11" - "\xf0\xf5\xd2\xd9\xb9\x29\xc0\xbd\x74\x4f\x45\x8d\xc0\x9c\x64\x67" - "\x98\xbb\xb0\xbb\x84\xee\xab\xf7\xcd\x4b\x3b\xe6\xa5\x1d\xf3\x92" - "\xf4\x1c\x50\xbf\x37\xe2\x8e\x4c\xac\x59\xe5\x0c\xfb\x73\x21\xb5" - "\x9f\x60\x03\xfa\x3d\x5a\x05\xac\x84\x3e\x2b\xc1\x27\x6e\x5e\x0b" - "\xdd\x33\xa4\xbe\x9a\x02\xe8\x73\x78\xbf\x0c\xaa\xa7\xb2\x0c\xfd" - "\x32\xa0\x5f\x8e\xb3\x42\x16\x44\xf7\x3f\x81\x4b\x46\x85\x7c\xb8" - "\x1c\xa8\x0e\xef\xa3\x4a\x7e\x9f\x44\x1f\x0e\xbc\x3d\x50\x1f\xb9" - "\x81\xfa\x48\x30\x38\xb0\x51\x3b\xe7\x14\xed\x24\xbc\xd5\xc9\x0e" - "\xa4\xc7\x94\xd2\xbd\x4b\x5b\x2a\xe8\xde\x69\x34\x86\x3b\xca\xb8" - "\x93\xda\x39\xd0\x78\x51\x79\xb2\xac\xb7\xe7\x9a\x4a\x4b\x32\xbb" - "\xcb\xde\x4e\x1a\x18\xde\x6f\x3f\x72\x75\x78\xbf\x3d\x86\xf2\x53" - "\x3b\xe8\x0e\xa9\x89\x0c\x8c\x61\x7e\x83\xae\xa8\x18\xa8\xde\x98" - "\xd2\x1a\x6a\xd7\x80\xdf\x30\xf7\x3b\x37\xe4\xf5\x5f\x13\xea\x0e" - "\x3f\x23\xf8\x91\xbc\x48\xca\xf5\xdf\x6e\xee\x3b\x7f\x70\xda\x72" - "\x4c\x8a\x35\x82\xd6\x98\xa0\x89\xd1\xdf\x81\xca\x35\x29\x4e\xb2" - "\x51\x38\x0d\xb8\x6a\xc0\xef\x58\x07\x56\xbe\xe6\xce\x5b\x50\x5e" - "\x72\x4c\xa9\xc2\xbd\x11\x77\x0e\x8f\xf1\x05\x12\x09\xae\x68\xab" - "\x03\x6b\xfc\x94\xd8\xbb\x85\xac\xe4\x20\xd6\xff\x87\xc2\xef\x8e" - "\x37\xd6\x96\x2c\xf5\x82\x0e\x66\x79\xd8\x5f\xc3\x7c\xa1\x1e\xcc" - "\xf7\x28\xdf\xa9\x90\x6b\xf5\xa6\x97\xf9\xa6\xac\x76\xb5\xcc\xc4" - "\xad\x05\x26\x8e\xb2\x46\xa8\x3c\xc9\xc0\xe3\xb2\xda\x43\x73\x47" - "\xde\x53\xd5\xe7\x0e\xf2\xef\x1f\x78\x5e\x1c\xfc\xf8\xea\xf3\xe2" - "\xe0\x6b\x9a\x9c\x37\x53\xea\xde\x1e\x0c\xe8\x3c\x07\x5f\x73\xd3" - "\xcb\xd6\x22\xaa\xff\xa0\x53\xd6\x0d\x98\x04\x52\x09\xcf\xcc\x02" - "\xdc\x4a\xba\xcb\x0e\x25\xe9\xb8\x81\xe6\x90\x29\x48\xfc\x10\x13" - "\xf3\x1c\xdf\xa6\x03\xf7\x68\x67\x84\xd9\x2d\x44\xab\xaa\x65\x7f" - "\x32\x62\xff\xda\x46\x77\x4f\x7c\xb1\xb6\x3d\x48\x03\xfc\x67\x9c" - "\xa9\xe1\xbf\x5d\x28\x63\x77\x95\xb4\x43\x11\x25\x7c\x06\x62\x9d" - "\x93\x9f\x40\x5a\xeb\x88\x8b\x47\xbb\xc9\x67\x20\x78\x84\x43\x35" - "\xfa\xde\xaf\x96\xa5\x12\xbc\x85\xcc\xd8\x40\xf4\x30\x60\xb7\xd9" - "\xa0\xee\xbe\x34\xc9\xc2\xa8\xcf\x97\xd6\x8c\xde\xfd\x7f\x27\x32" - "\xe3\xbb\x96\xa7\x99\xfd\x6e\x16\x5f\xfa\x5d\x23\xfb\xfb\x14\x66" - "\x20\x38\x78\xd8\xa1\x5a\x09\xbb\x43\x5e\x7d\x7c\x3c\xec\x60\x06" - "\x8d\x07\x9d\xcb\xa4\x05\x78\x97\x3c\x97\x72\x99\xb1\x07\x5a\xe4" - "\xf7\x3f\xcd\x1d\x60\x7f\x98\x61\xcd\x5d\x66\xcd\x5a\xba\x72\xc9" - "\xb8\x71\xc3\x07\xe0\x25\x5c\x89\x92\x97\x70\x65\x84\xf3\x12\x08" - "\x63\x4f\xff\xd3\x94\x2b\x79\x87\x59\x36\xcd\xbc\x88\x2d\x85\x85" - "\xde\xef\x62\xb3\xee\x0a\x0b\xde\xc3\x66\xdd\x7d\x8f\xed\xf1\xec" - "\x79\x59\xab\xc2\x62\xef\x0d\x97\x23\x6e\x78\x19\x75\x47\x8c\x7e" - "\x18\xf8\x43\x79\xec\x79\xda\x77\x0e\xcf\x2e\x0a\xf0\xaf\x30\x77" - "\xa7\x90\x4d\xaf\x63\xf9\x01\x76\x0c\xf8\x8d\xdf\x44\x78\x7d\xa8" - "\xb4\x6b\x1b\x64\x24\xa7\x33\xa1\xef\x5e\xf0\x74\x17\xe5\xdd\x8b" - "\xc3\xcf\x35\x6d\xf5\x03\x4f\x64\x4f\x96\xf4\xce\xe1\x64\xc4\xc7" - "\xe2\xf9\x84\x3c\xd3\x39\xfc\x24\xf8\xe5\x54\x61\xc3\x64\x05\xd9" - "\x30\x39\x2c\x74\xc3\x26\xfa\x4a\x98\xb4\xa5\xe7\x6a\x27\x1b\xf7" - "\x1e\x76\xb8\x8a\xe8\x0b\x4a\x8b\x3c\x13\xac\x0b\x59\x0a\x3d\x89" - "\x1e\xc6\xb7\x64\xbe\x31\x7b\x32\xdf\x96\x41\x3a\x35\x89\x88\xdf" - "\x48\x74\x5b\x84\x25\x2a\xba\xbb\xec\xb0\x53\xa7\x41\x7c\x83\xdc" - "\xfd\x22\x38\xeb\xfb\x60\x0c\xf0\x77\x8c\xcf\xc4\x6d\x64\x13\x48" - "\x61\x89\xb4\x3f\x98\x1c\xe9\xe2\x6e\x21\xed\x8b\x84\x13\x76\x08" - "\x5c\x7a\xb8\x43\xc7\x0b\x95\x92\x1f\x1d\x4e\xf9\xb1\x7f\x9e\x97" - "\xfb\xe7\x91\x28\x7d\x2d\xe0\x3d\x5e\x9f\xab\xfd\xee\x97\x2d\xc9" - "\xcf\xce\xcb\xce\xb2\x8e\x5f\x36\x9c\x85\x79\x60\xcd\xc9\x5e\x62" - "\xcd\xcb\x7e\x6e\x79\xf6\x32\xc1\xe8\xd1\xd7\xfe\xe7\x6f\xc0\x41" - "\x21\x7f\xd8\xa3\x09\xc6\x47\x56\x11\x2f\x6c\x2a\x1d\x27\xce\x52" - "\xe4\x19\xd8\xf1\x06\xb5\x72\x44\xaa\x94\x5b\x9e\x01\x5c\x8f\x4a" - "\x7b\x5c\xce\x6c\xc2\x33\x80\xeb\xd1\xf5\x52\x57\xe6\xc8\x3b\x1a" - "\xac\xaa\xd0\xce\x03\x21\x7a\xad\x5e\xd8\x1d\x92\x3a\xab\x47\x5a" - "\x3c\xcc\xb5\x3f\x44\x83\xd4\x3f\x40\x78\x50\xe0\xc3\x7f\x80\x0b" - "\x35\xda\x19\xf5\x1c\x2d\xe5\x2b\x78\xfb\x86\x1e\x26\xe4\x81\xe4" - "\x1b\x41\xe2\xd7\xa3\x29\x3a\x1c\x41\xbf\xb4\x93\xdc\x41\xe7\x8f" - "\xd2\x02\x97\x79\xd1\x2a\x66\x20\xd9\x03\xe8\xee\x29\x7b\xf3\xbc" - "\x06\x5e\x76\xc4\x0a\x5a\x26\x91\xd2\xec\xd0\x74\x37\x79\x6c\x36" - "\xe8\xa4\xa3\x8e\x10\xdf\x51\x3f\x55\xd0\xf1\x3d\x34\x6f\x8e\x26" - "\xd8\x68\x8f\x90\xb8\xfb\xba\x7f\xd4\x5e\x3e\x5c\x9e\xa3\x48\xfc" - "\x76\xb4\x4e\xeb\x43\x27\xe1\x2c\x4d\xf7\xd7\x20\xe7\x75\xfd\x54" - "\xcc\xb9\x44\x1a\x0b\xe0\xf9\x0a\x1d\x5e\xd4\x5f\x6a\x3b\xc9\xad" - "\x81\xbb\xa6\xec\x2b\xf0\x1b\xa4\xef\xd2\x23\xc9\x92\x3f\xaa\xb7" - "\x86\x9f\x1b\x4a\x5e\xa8\x7e\x72\xc8\x4e\xc8\x91\xaa\x2b\x71\xc4" - "\xd2\x25\x74\x9d\xec\x59\xdb\xca\x79\xcf\x66\xdb\x96\xdb\x93\xad" - "\xcb\x97\x88\x63\x5b\x21\x06\xc8\x5f\x3e\xff\x59\x2b\x61\x11\xdb" - "\xf4\x59\xb3\x6c\x0f\x3f\xf1\x93\x27\x87\xb3\x87\xe7\x21\x2e\x7f" - "\xa9\x75\x56\x4a\xb2\xfc\xf4\xf8\x8c\x69\x3f\xb5\x4d\x4b\x7b\xe2" - "\xb1\x39\x03\xe8\xa4\x47\x63\x4e\x58\x31\x46\x43\xda\xd8\xbb\xeb" - "\xa4\x0e\x52\x7d\x43\x7f\x1d\xa4\x7a\x0f\x7e\xc0\xce\xef\x58\x18" - "\x7b\x17\xb1\xef\xae\xc3\xaf\x44\xce\x9b\x61\x66\xb4\xdf\x17\x9a" - "\x37\xef\x8a\xf3\x36\x92\x1d\x48\xd9\xeb\x3b\xc0\x7f\x47\x66\x85" - "\x7f\x0b\xe1\x82\x77\x82\x02\x5f\x6a\xf3\x82\xe6\x83\x2d\x10\x25" - "\xe6\x86\xa4\x57\xde\x99\xa5\xcf\x8d\x0d\xf2\x7c\x88\x91\xcc\x8c" - "\xbe\x63\x7e\xef\x27\xf9\x32\xe6\x82\x95\xce\xd6\x29\x9e\xc7\x1e" - "\xdf\xaf\x95\xbb\x96\xe4\xcd\x44\xcf\x6a\x67\x62\x31\x67\xd8\x3b" - "\x87\x79\x59\xfd\x4c\xc9\x0b\xd6\xaf\x12\xf3\x66\xcd\xe8\x87\xc5" - "\x19\xa4\xb8\x4f\xf4\x4e\x5d\x68\xfe\xbc\xbb\x8e\xc6\x86\xf0\x82" - "\xc4\xbd\xef\xb4\x5c\x21\xc7\x89\x40\x5c\x87\x6e\x67\x3e\x7f\x1c" - "\x33\x18\xc7\x39\x59\x95\x81\x97\x78\xd8\x3b\x5b\xa5\x1e\xea\xbb" - "\x51\x3a\xfd\x8c\xf7\x78\x0f\xe3\xad\x57\xca\xbf\x2a\xc3\xe4\x5f" - "\x45\x76\x7e\xb2\xc9\xee\x25\x1a\xd9\xe5\xf6\x0a\xfb\xa6\x0f\x36" - "\xd9\x7d\xa4\x5b\x32\xfc\x34\x7b\xf7\xa9\xe2\x20\xef\xc1\xfb\x68" - "\xf4\x4d\xec\x21\x93\xa4\x4c\x01\xfc\xd8\xbb\xeb\x25\x6f\x22\xe3" - "\x09\xee\x78\xa7\x36\x1a\x69\x7c\x30\x2f\x3b\x30\x46\x69\x03\xe1" - "\xbd\x98\x52\x83\x66\x47\xea\xdd\x93\xc4\xa3\x12\xac\x5e\x34\xa8" - "\x39\x2f\x96\xe1\x87\x27\xe1\xbe\x10\x7d\xc9\xfd\x12\xb6\xef\x7a" - "\xea\x1d\x9d\xb4\x6f\xfa\x07\xc3\xa5\x18\xcf\x13\xfa\x78\xa6\x05" - "\xbd\x0f\xd2\x78\x75\x97\xbd\x67\xd1\xc7\xb2\x6b\xe2\x7c\xf0\x5e" - "\xcc\x7a\xb4\xfa\x6e\x8a\xc7\xfa\x7f\x77\xab\xd0\xed\xa1\xf5\x75" - "\x45\x5e\xe0\xe1\x54\x2d\x7f\x86\x9e\xff\x4a\xfb\xc4\xe2\x82\x2e" - "\x09\xb9\xee\x97\x3a\x3e\x9a\x3b\xe9\x7e\x3a\x3e\x74\x06\x58\x2f" - "\xe7\xa4\x2e\x83\x33\xcb\xfe\x34\xfc\x58\xdd\x04\xfe\x7b\xd3\xdc" - "\xd1\x9a\x1c\x00\x6b\xfb\xbd\x8b\x13\x19\x5b\xe4\x5b\x99\xd1\x27" - "\x43\x21\xd9\x07\xd9\x1c\x44\x3b\x3c\x61\x32\xb2\x3e\x1d\x4d\x0f" - "\x6b\x48\x27\x9d\x31\xba\xb3\x4c\xe5\xd0\xba\x92\x72\x9b\x06\xb3" - "\x1b\x98\x17\xe5\x2d\x11\xe7\xdf\x65\xef\xe5\x88\xb9\x07\x5e\x5b" - "\xf0\xf9\x85\xfc\x2b\x4d\x87\x49\xd0\x2e\xf2\x3e\x5e\xc3\xf4\x3e" - "\x59\x90\xb8\x9b\xf6\x9e\xd0\xcb\x46\xfc\xdc\x81\xe4\x85\xc0\x0f" - "\x39\xf3\x96\x64\x2d\x5d\xb0\xe0\x1f\xa3\x86\xf0\x33\x2e\x67\x99" - "\x5a\x81\x32\xc1\xff\xee\xcb\x91\xf3\xb4\x01\xf8\xff\x37\xa9\x92" - "\x7e\xfb\xc5\xd7\x58\x37\x63\xce\xb0\xf7\x2d\x3a\xfd\x2e\xd7\xd1" - "\xfb\x89\xbc\xac\x21\x27\xb4\x36\x1a\xbc\xdf\x5e\x1b\xef\x1b\x07" - "\x5e\x1b\xef\x27\x61\x9f\x3d\x81\xef\x89\xa8\xf3\x84\xc0\xf9\x34" - "\xde\x92\x06\x77\x99\x02\x0f\x0a\x1a\xdc\xb6\x8a\x29\x44\x7f\x93" - "\x6c\x9a\xf6\x83\x20\xf8\xda\x20\x70\x84\x2d\xc0\xcc\xb4\x17\x6c" - "\x58\x42\x72\xc7\xb1\x3c\x70\x89\x7b\x6c\xab\x80\x2f\x10\xae\x3c" - "\x23\xcf\xe0\x7f\x79\x11\x7c\x08\xde\x37\x9c\x26\x5c\xa1\x92\x33" - "\x04\x26\xf7\xeb\xf7\xb7\xea\x34\xae\xa9\xd4\x2a\x6c\x64\xd3\xbe" - "\x1d\x94\xfa\x4c\xb5\xb4\x77\xa3\x9e\xfd\x02\x07\x05\x4d\x74\x06" - "\xc0\x36\x2c\x44\xb9\xa4\x17\xb4\x84\xda\x17\x71\x8f\x29\x90\x22" - "\xce\x0a\x76\x2e\x14\xfa\x40\xf7\x48\x7d\xa0\x7b\xd8\x8e\x25\x04" - "\x87\xf7\xfd\x57\x95\x8d\xc7\x1e\xb1\x87\xc7\x3b\x16\xe4\xda\xec" - "\x39\xab\x6c\xa4\x0b\x78\xc5\xfe\x2e\xd7\x50\xd9\x07\x09\x12\xbe" - "\x1f\xa4\x87\x64\x55\x52\x87\x8f\x70\xe6\x24\xbf\xb0\x61\xab\x9d" - "\xf5\x7c\x38\x99\x60\x5f\x7c\x99\xc2\x51\x98\x73\x1f\x4e\xa0\xb3" - "\x9f\x2e\xd2\x9d\xd9\x99\xc1\x9c\x65\xdc\x45\x32\x34\xc4\x8f\xd4" - "\xef\xd4\x77\x21\x1e\x6b\x9f\xe2\x86\x89\xb3\xc6\x7c\x21\x9b\x03" - "\x9c\x3e\x70\x79\x98\x49\xd3\x75\x9d\x7b\x13\xe9\xe7\x09\x9d\x72" - "\x41\x67\x7c\x70\x56\xde\xd1\xfa\xa0\x5d\x87\x25\x68\xdf\x29\x74" - "\xaf\x9f\xf4\x74\xba\x38\xe9\x04\x7e\xc8\xf4\xfc\x1e\xf6\x81\xb8" - "\x63\xfa\x98\x4f\xbc\xef\xf9\xa5\x2f\xfc\x4e\xfe\x07\x5b\x25\xde" - "\xfa\xa0\x1a\xf1\xc0\x95\x1f\x94\xa0\xcd\x31\xd2\x46\x80\x28\x67" - "\xa6\xae\x0f\x15\x0e\xb7\x69\xf3\xec\x20\x96\x73\x17\x2c\xc8\xce" - "\x5b\xa6\xfb\x94\x4f\x5a\xba\x28\xeb\x01\xed\x0e\xfe\x92\xec\x95" - "\xb6\xdc\x2c\x71\xc7\x07\xb1\xf2\xf5\x0a\xf8\x26\x13\x7f\x23\xf4" - "\xe6\x45\x9f\x9a\xc7\xef\xd0\xe8\xa8\x36\xd6\xb8\x5f\xea\x5b\x34" - "\x2e\x96\x7b\xdb\x75\xff\x81\x76\x34\xeb\x7b\x1b\xc9\x58\xba\xd8" - "\x7d\x56\x3a\x33\x23\xbb\x0c\x74\x36\x47\x72\x16\xa4\xc1\x1a\xfd" - "\xa0\xef\xce\xf4\x7a\xc4\xd3\x99\xb0\x6b\x09\x9d\x03\x37\xcf\x50" - "\x37\xda\x12\x78\xdc\xa3\x0d\xc0\x6b\xd1\x34\x76\x74\x56\x24\x7d" - "\x78\x34\xa6\x12\xbe\x26\x59\xa0\x6b\x09\xe9\xd3\x36\x9a\x41\x9f" - "\x60\xbf\x6c\x9e\x09\x5e\x2f\x61\x6d\x01\x8b\xa2\x3a\xb0\x17\x7a" - "\xa4\x5c\xb9\x71\xee\xe1\x42\xc6\xb4\xfd\xd0\xb3\x5e\xc8\x39\x1b" - "\x93\xe4\x9e\x6a\x4b\xd1\xe4\x28\x29\x48\xb7\xd6\xc3\x6e\xf5\xca" - "\x36\x3f\xea\x15\xf3\x44\xe0\xba\xc6\xdd\x7c\xd3\xac\x12\xa1\xf3" - "\xbc\xe9\x51\xaf\xca\x73\x22\x28\x8c\xbd\x66\x38\xc6\xb1\x99\x17" - "\x27\x31\x4d\x4f\x3a\xe2\x34\x3b\x76\x17\xc9\x81\x31\x3f\x5c\x04" - "\x0b\x94\x3f\x55\x2b\x7f\x2a\xca\x47\xbd\xf7\x68\xfe\x73\x1b\xbd" - "\x7a\x5d\x58\xaf\x5e\xec\xc7\x09\xb4\x27\xa3\xfd\xf1\xf8\x59\xa4" - "\xcc\xc9\x0f\xde\x6f\x6c\x9f\xcc\x49\xd2\x7d\xc7\x92\xf4\xf5\x42" - "\x75\x6b\x7d\x98\xa2\x96\x09\xfb\xad\x8a\x56\xd7\x14\x92\x7f\xe8" - "\x65\x72\x94\xc9\x2f\x75\xd6\x60\xff\x8c\x02\xde\xf0\xc6\x94\x62" - "\x9f\xa4\x3a\x88\x6e\xf7\x8d\xe5\xd8\x47\x83\xb6\xa0\x51\xda\xd0" - "\x58\xc5\x46\x84\xd3\xec\xa8\x6f\x6b\x88\xce\x44\x19\x97\x80\x9f" - "\x8b\x58\x49\x3b\x3b\xf6\x06\xd5\x4d\x7a\x4e\x34\xae\x3d\x18\x27" - "\x8c\x55\x33\xea\xa9\x05\xaf\x31\x02\x70\xf8\x98\xc6\x8b\x74\x47" - "\x76\xf4\x08\xfe\xc3\x84\xb6\x19\xdb\xd8\xb1\xc3\x34\x56\x54\x16" - "\x77\xce\xaa\x09\x74\x67\xfc\x90\x6c\xd8\x11\xac\x57\x17\xf2\x0e" - "\x3a\xbf\x3c\xcd\xdc\x33\x88\x2e\x07\xaf\x22\xde\x8b\xb3\xb8\x2a" - "\xc6\x5a\xe8\x4e\xbb\x67\xac\xee\xe0\xea\xe5\x32\xc6\x1b\xb0\x3f" - "\x5c\x36\xb0\x80\x1f\x7c\x35\xda\x6d\x28\x3e\x4b\x76\xf6\x6a\x80" - "\x6b\x2a\x48\x67\x25\xaa\xb2\x80\x99\xc9\x46\x61\xb1\x9d\xfb\x9b" - "\x7c\xd5\xac\xc9\x5e\xcd\x3e\x08\x54\x31\xd7\x0a\x92\xd3\xba\x3b" - "\x3f\x74\x54\xd1\x5d\x95\x61\x78\x7f\xdd\xfa\x53\xaa\xab\x69\xed" - "\x87\x2d\x1f\x61\xe4\x3e\x62\xd6\x9f\x8b\x70\x55\x63\xc6\x07\x98" - "\x6d\x1f\xb0\xe2\x76\xae\x12\x8d\x57\xb4\x98\xea\xa8\x40\x59\x35" - "\x64\xcf\xcf\xac\x76\x59\x86\xa3\xff\xc6\x34\x07\x13\x67\xa4\xae" - "\x25\x7f\xa2\x36\x8e\xdc\x71\x81\x45\xb9\x96\x1c\x11\xef\x42\x66" - "\x82\xfe\xba\xb3\x5a\x85\x0e\x26\xd9\x32\x74\x3b\x3a\xe8\xce\xb7" - "\xba\x81\xda\x18\x94\xed\x06\xbc\x8c\x7a\xfe\x9d\x45\x7a\xfe\x26" - "\x81\x0b\xb6\x13\x3c\xd0\xa6\x63\x73\x24\x4c\x1a\x11\x2b\xdb\x0c" - "\xf8\x64\x84\xc3\xa7\x69\x32\xc1\x87\x74\xd2\xd5\x15\x9d\x35\x68" - "\x5b\x2a\x60\xa0\xea\x75\xd0\x1c\xa0\xb3\x3c\x2a\xbf\xf2\x02\x8b" - "\x76\x2d\x21\x9d\x75\xf7\x4b\xa6\x74\x63\x94\x7a\xe9\x6c\xed\x86" - "\x8b\xcc\x48\xe3\x46\xb4\xc3\x06\xf1\x5d\xc0\xbc\x90\xc6\xcc\x1b" - "\x3b\x37\x0a\xbf\x68\xfc\xcc\x34\xf7\xf0\x8c\xc7\x78\x55\xa0\x0d" - "\xf1\x18\xab\x1a\x7a\xca\xf9\x38\x9b\xc6\xd3\x4c\xfb\x33\xe6\x4a" - "\x28\x7e\xd3\xec\x07\x03\x58\x3b\xaa\xe0\x3d\xdd\xf1\xea\xc6\xdc" - "\x4c\xa9\xbf\xfc\xe1\x9c\xed\xa0\xf5\xab\x37\x09\x1b\x19\xd1\xe0" - "\x4f\x48\xe6\xc0\x5e\x16\x77\xe9\x9a\x2d\x3a\x1e\x7f\x61\x14\xd9" - "\x9f\x70\x4f\x37\x08\x5d\x4a\xdb\x64\x6d\xae\x4f\x46\x9a\xa9\x1e" - "\x36\x31\x47\xae\x89\x46\x71\x07\x90\xf0\xc0\x60\x74\x16\xf6\xae" - "\x46\xd2\x61\xe5\x37\x65\xb0\x68\x85\x7b\xa3\x33\x4d\xdc\x1d\xa8" - "\xa7\x39\x14\x2d\xe6\xbe\xfc\x06\xda\xd8\x6b\xc2\xde\xd6\x8c\x78" - "\xa3\x1e\x4f\x7b\xa8\x0a\x7e\x99\x78\xf5\xb4\x55\x26\x5e\x74\x91" - "\x25\x08\xb9\x97\x1e\xbf\xca\x6b\x6a\xc2\xce\x5f\x04\xdc\x4d\xb6" - "\x75\x28\x0f\xe2\x23\xb0\x57\x1e\x40\xbd\x2e\xa4\x8f\xd7\xd3\xf3" - "\xae\x0c\xa3\xdb\x51\x2f\xd6\x19\xd9\x5f\x13\x7b\xa4\x8c\x1f\x92" - "\xe6\xf0\x9a\xc4\x98\xe9\x71\xcb\x32\xc4\xde\x4c\x76\x38\x40\x7b" - "\x73\xd1\x9e\xd3\x22\x5e\x01\xef\x4c\xf1\xe6\xb0\x38\x03\xd9\x3c" - "\x21\x7b\x9a\x61\x71\x11\x68\x33\xeb\x0b\xa3\x6e\xda\xa7\x69\xdd" - "\xa5\xad\xa2\x33\x40\xb9\x3f\x8b\xba\x57\x71\x26\x6d\xf4\xca\x38" - "\x49\x07\xfc\xa5\x26\x9c\x6f\xa7\x73\x17\xaa\x5b\xed\xca\x30\x04" - "\xbb\x32\x22\xa8\x7e\x2a\x8b\x64\xae\xe8\x23\xea\xed\x60\x64\x1f" - "\x9e\x6f\xfc\xac\x99\xd3\xbd\x2f\x94\x2b\xda\xe3\xf0\x03\xf7\x7c" - "\x9e\x3e\xb0\x7e\xcf\x7b\x15\xae\xa2\x9f\x63\x4e\x7f\xb4\x9b\x70" - "\x4a\xd0\x9c\x39\xdd\xba\x90\xf6\xe9\x8f\xc6\xd1\x98\x06\xb1\xce" - "\x83\xb1\x99\xd3\x27\x75\x30\xa5\x08\x6b\x47\x9e\x4d\x7e\xf4\x10" - "\xd1\x89\xc5\x2a\xe7\x78\x9f\x4c\x73\xd7\xd4\x49\x7a\x39\x99\x33" - "\x85\x2e\x4c\xdc\xd1\x12\xb7\xbf\x83\x35\x96\x7c\xca\x1a\x03\xee" - "\x92\x03\x17\xbc\x46\xa9\x13\x63\xa4\x72\x9f\xa0\x6f\xc5\x58\x2f" - "\xb6\x60\xcd\xe0\xbc\x2d\xf8\x25\xc0\xee\x0b\xb9\x17\x7c\xb4\x5b" - "\xe7\x91\xae\xde\x87\xbf\x0a\x9b\xa8\xa4\x2f\xaa\x6e\x7a\x85\xf6" - "\x8a\x62\xde\x9d\xc4\x26\x15\x90\xac\xfa\xa3\xd6\x18\x1f\x4b\xd5" - "\xca\x3d\x2f\xcb\xfd\x2b\xbb\x5a\xb9\x34\x6f\x1b\xb7\x4a\x3d\x14" - "\x35\xee\x15\x7b\x10\x65\x07\xe3\x5e\xa9\xc5\x5e\x53\x0c\xfa\x05" - "\xf4\x48\xcb\x0c\xd4\x63\x6f\x0a\x34\x33\xb2\xab\xbc\x43\xc5\x7e" - "\x7d\xde\xc2\x34\xfd\x9f\xe2\x73\xec\xaf\x77\xa9\x3c\xc9\x0c\xde" - "\x8d\xe4\xbf\xc5\x84\x67\x49\x9e\x5e\x14\x64\x91\xee\x7c\x70\x59" - "\xb1\xef\x61\x1d\xb7\xdc\xf7\x0e\xc9\xda\x81\xab\x82\xdc\x62\x78" - "\xfb\x92\x87\x6d\x00\xfe\x16\xf6\x41\xd7\xdc\xf4\x72\x4c\x29\x7b" - "\x90\x1b\x4c\x42\x7f\x4c\xdd\x78\xb8\x02\x63\xdb\x2a\xf5\x8d\x6c" - "\xd3\xc3\x74\x8d\x22\x50\xd7\x9b\xa4\x6b\xc4\xcd\xb6\xa8\x6a\xda" - "\x33\x31\x66\xdd\x65\x7f\x05\xfd\xff\x17\xb1\xdf\xad\x23\xba\x48" - "\xe0\xf9\x96\xd9\xde\xd8\xed\x64\xdf\x9c\x7c\xa5\x2a\xea\x8a\x40" - "\xed\x86\x6f\x98\x51\xc2\xa3\x65\x42\x53\x67\xb7\x8b\x3b\xb7\xa7" - "\xd3\x3a\xd2\xca\x36\xa1\xec\x20\xdf\x48\x77\xdb\x5a\x66\xc9\xb1" - "\x11\xef\x16\xfa\x1e\xe8\xa5\xbb\x81\x7f\xad\xaa\xee\x21\xba\xe8" - "\xaf\xa9\xa0\x75\x5d\x5d\xe6\xed\xe9\x3f\xb1\x94\x80\x06\x68\xc9" - "\xf4\x44\x0c\x11\xe7\x2d\xba\xad\xd3\xc1\xce\xd5\xf8\x36\xcb\x70" - "\x37\x0a\x01\xdd\x1e\x7f\x86\x7d\xf2\x97\x9e\x32\x66\xe8\xc5\xde" - "\xda\x03\xde\x87\x6f\xcb\x88\xae\x1c\xcd\x52\xf0\x6d\xf4\x19\xd6" - "\xf2\x66\xc0\xc0\xe2\xf1\x33\x7b\x6f\xca\x19\x86\x72\x53\x49\xa6" - "\x7b\xec\x02\x9d\x33\x7f\x2c\xed\x72\xbc\xcc\x12\x55\x94\x47\xb2" - "\xe4\x0d\xa3\x59\x22\xc9\x91\x11\x97\x64\x0b\xca\x73\x16\x9d\x4f" - "\x5c\x33\x9a\x25\xf7\xaf\xb7\xa5\x5a\xd2\x79\x9f\x88\x3d\x7e\xa5" - "\x97\xdd\x6c\xff\x3e\x6f\x43\xb9\x4e\x5e\x16\xc1\xf9\x4d\x16\x83" - "\xa4\x07\x3f\x5e\x65\xda\x2a\xe7\x9d\x38\x57\xc0\x7c\xa3\x73\x1b" - "\x4d\x5e\xad\x08\x1b\xaf\x71\x59\x2d\x74\x37\x4b\xc4\x29\x66\x82" - "\xa5\x59\xb4\x43\xb3\xcb\x18\x5c\x73\x47\x26\x95\x41\xed\xb1\xcd" - "\x93\xb2\x6e\xb2\xd9\x08\xb8\x0a\x3d\xe1\x75\x2f\xb3\xe8\x5f\xbf" - "\xcc\xcc\xc7\x16\x88\x7e\xed\x96\x6b\xd1\xc8\xa8\xbd\xaa\x93\xd6" - "\x19\xe6\x04\xda\x4d\xf5\xd1\xdc\x68\x0a\x9c\x77\x15\xe7\x73\xd5" - "\xb5\x90\xec\x93\x7c\xfc\xb5\x2b\x6f\x0f\x4b\x6b\x0f\x48\x3b\x63" - "\x73\x99\x77\x27\xca\xdb\x39\x9a\x99\x51\xd6\x45\xf7\x22\xc2\xb5" - "\x96\x5b\x5c\x79\xfb\x51\xf6\x27\xc3\x68\x3f\x5a\x0f\xf8\xc8\x7d" - "\xe9\x93\x03\x6e\x7f\x2b\x23\x1f\x17\x8f\xd9\x79\x90\xca\x41\x9a" - "\x87\x44\x7f\xb7\x59\xac\x36\x69\x57\x53\xf4\xb5\xef\x0c\x41\xeb" - "\x87\xfb\x82\x28\x6f\x8e\x3b\x13\x34\xa7\xd6\x27\x1d\xd6\x72\x7e" - "\x7d\xb2\xd1\x95\xb7\x8b\xd1\xf8\x50\x7a\x84\x4b\xdc\x9d\x48\x7b" - "\xb6\xff\xb8\x50\x1a\x7c\x7b\x03\xe5\x7e\x2f\x74\x36\x46\x67\x36" - "\xa1\x34\xd5\xe8\x0f\x60\xe5\xdb\x06\x18\x49\x99\xe1\x27\x63\xa8" - "\xad\x18\xbb\x04\x77\xfe\xa7\x03\xdf\x89\xc4\xda\xc7\xbc\x2f\x6d" - "\x12\xf2\xb2\xbf\x8d\x78\x2c\xa0\x72\x89\xcf\xfe\xe6\x02\xed\x56" - "\xe1\xc1\x93\x70\x81\xc0\x27\x13\xe9\x3c\xfb\x6f\x87\x4d\x8a\x1c" - "\x5f\xea\x0b\xd1\x4c\x03\x8d\x71\xd8\x59\x85\x99\xda\xaa\x8f\x31" - "\x37\xbf\x57\xa1\xd2\x19\x14\xe9\xf6\xf6\x5a\x98\x9c\x7f\xdc\x89" - "\x72\xdf\xd0\x68\xc8\x0a\x6d\x3f\xad\xe8\x8a\xcd\x4c\xe7\xcf\x5b" - "\x98\xae\x87\x88\xf5\x3b\xcb\x26\x75\x47\x2d\x84\xa3\x76\x1a\xe4" - "\xda\xa1\x36\x6a\x79\xd7\xca\xb3\xf1\xbf\x95\x20\xff\xda\x01\xfb" - "\x1b\x31\x9a\xec\x4f\x15\x93\x0d\x51\x71\x57\x09\xb8\x0a\xfb\x41" - "\xa4\xdb\xd7\xc3\xe4\x79\x7d\xeb\x03\xa0\xf1\x23\xe9\x9e\xaa\xde" - "\xb6\x6b\x3b\x57\x68\xd5\xee\xcb\xb5\xce\xd4\x79\x68\x6e\x06\x8c" - "\xcb\x4c\xc2\xdf\x01\xe8\x2e\xd5\x17\xfb\x9e\xd3\x1b\x7b\xdc\x25" - "\xd7\x4d\xab\x9d\xc7\x4a\x7c\x6b\xf3\xb3\x12\xea\x97\x26\x97\x88" - "\xa4\x3e\xa3\x1c\xa7\x7e\xbe\xad\x97\x3d\xa8\x0f\x11\xbd\x6f\xe8" - "\x93\xb4\x6f\xf0\x5e\x85\xe8\x1b\xd9\xe8\x11\x7d\x3b\x2e\xee\x00" - "\x5e\x63\x7f\x5a\x25\x6c\xdf\x73\xba\x46\x53\x19\x9f\xbe\x4a\xed" - "\xa3\x31\x01\x7e\xb8\xe1\x0c\x3b\x9e\xc9\x87\xff\x7a\xf8\xb5\x95" - "\x79\x3c\x59\x96\x79\xdc\xb5\x19\x38\x58\xde\x59\x24\x9d\x9d\x4f" - "\xd7\xf3\x8d\xc7\x5d\xc4\xc3\x74\xa1\x3e\xcc\x8f\x30\x3c\xf4\xa9" - "\x99\xc6\x6a\xe2\x1e\x96\x2a\xe7\xe1\xa7\x43\x88\xdf\x95\x3e\x9e" - "\x8e\xef\xc7\xbc\x97\xf6\xe5\xfa\x74\x56\x15\xb1\x8f\x85\xe3\xd8" - "\x6b\x6c\xa3\xe4\x69\xe2\x0e\xa7\xe0\x7d\x97\xd0\x4b\x42\x7b\x57" - "\x06\x74\xfc\x77\x7c\x17\x27\x79\x77\x91\x26\xf7\x24\x5c\x56\x24" - "\x6d\x04\x76\x97\x7d\x3a\xbd\x4f\xee\x49\x77\xba\xcb\x78\x03\xa5" - "\xc3\xd8\x9f\xa7\x34\xd2\x06\xd9\x19\xed\xbe\xf3\xa7\x4f\x6a\x77" - "\x99\x93\x48\x57\x0b\x79\x81\xef\xb8\x90\xb7\x12\x0c\xa8\x6e\xd1" - "\x76\x03\xc9\x38\x3f\xad\x0e\xc9\x99\x8f\x0b\xdf\x10\xd2\x1e\xc1" - "\xa7\xfb\xf5\x39\x82\xfe\x46\x4a\xbf\x1e\xc7\xc7\x1c\x4d\x66\x62" - "\x0e\x74\x71\xcb\xf0\x5b\xab\x69\x4e\x7e\x7a\x22\x1c\x4e\x69\x01" - "\xb5\x58\xe2\xa0\xe3\xf5\x5c\xac\xf5\xe3\xf5\xff\x98\x9e\xf8\xef" - "\xbb\x74\x5a\x44\xc2\xd9\x0c\xfc\xf2\x59\x40\xc0\xda\x39\xcb\x43" - "\x76\x77\x9f\x2f\x22\x3b\xe2\xff\xfd\x0d\xd9\x6b\x0f\x38\x67\xb3" - "\x60\xb1\x85\xec\xd3\x32\xd5\x39\xdb\x7c\xda\xce\x0c\x36\x3b\xc9" - "\xd6\xb7\x5b\x89\xc7\x03\xcf\x6a\xe6\x71\xa0\x4f\xb0\xce\x57\xe7" - "\x32\xd3\x53\x39\x24\x63\x48\x8a\x27\x7b\xea\x64\x4b\x9d\x7c\x21" - "\x04\x8b\x93\xe2\xf0\x3e\x0a\xf4\x9c\x99\x9b\x67\x89\xf3\xf9\x60" - "\x19\x07\x3e\x3e\x41\x36\xdd\x0d\x6e\xaf\x9f\xad\x3e\xcb\xa2\xc8" - "\x5e\x7b\x60\xe3\xf6\x29\x4d\xbe\xcf\x04\x7f\x13\x63\x67\xf1\xa0" - "\x3f\xe8\x0e\x80\x45\x8d\xdd\x0e\x9e\x76\x7b\xa2\xec\xf7\x79\x2e" - "\xfb\x2d\xdb\x4d\xed\x97\x38\x2e\xcd\x5c\x24\xda\xfe\xd9\xe6\x00" - "\xca\x57\x9d\x73\xa2\x83\xce\x39\x51\xf2\x4e\x7d\x23\x2b\xca\xe7" - "\x1d\x6e\x5f\x23\x78\xae\x8b\xc2\x77\x1d\x9d\xff\x53\x1f\xa9\x7f" - "\x54\xf7\x87\x17\xce\x0a\x5a\x2b\x80\x70\xf1\x22\x2d\x4f\x27\xf2" - "\x74\x36\xb2\x1e\xe7\x1c\xd1\xf7\x26\x9f\xcc\x6b\x13\xef\x94\x3f" - "\x0c\x0e\x5a\x9f\xfb\xe0\x80\xbe\x53\xff\xa8\xff\x01\x82\x09\x60" - "\xa0\xf5\xd5\xd2\xab\xf5\x93\xfa\xf8\x01\x76\x9d\x97\xd1\x4f\xf4" - "\x55\xf4\xb3\x17\xfd\x6c\xc8\x61\xcc\xbf\xe9\xbd\x9a\xcb\x71\x73" - "\xa2\x88\x47\x2d\xfe\x0b\x68\xf8\x42\x27\x03\x2f\x6a\x7c\xbd\xc8" - "\x69\x78\x01\xb4\x49\x91\x17\x3c\xa9\x97\x77\x90\x0e\xaf\xdb\x8e" - "\x5f\xa0\x9a\x11\x8d\xa3\xd3\xeb\xa8\xdb\xf2\xa1\x7a\x8a\x15\x75" - "\xf0\x0e\xd0\xa6\x7e\x77\x00\x69\x72\xd0\x7f\xf0\xb0\xa7\xb5\xf6" - "\x53\xda\xd5\xdf\xc8\x7e\x99\x16\xb1\xf8\x43\x3f\xaf\x30\xb8\x5b" - "\x2b\x98\xde\x97\x5f\x22\x1d\xfa\x63\x41\x59\x23\xa8\x3f\x2a\xfa" - "\xb9\x0d\xed\xf4\x87\xf5\xe9\x58\x27\xe9\x11\x7f\xcc\x86\xa7\x33" - "\xe5\xe5\x73\xe8\xc7\x39\x66\x71\x16\x81\xfe\x7a\x9c\xe8\xc5\x13" - "\xc7\xae\xcb\x60\x89\x1e\xf6\xdf\x2d\x72\xde\x09\x5b\xd0\x23\xcf" - "\xb0\xcf\x2e\xf6\xd9\x7b\x26\x1b\xfa\xb1\xdb\xa7\xd2\x3c\x12\x76" - "\x9f\x69\xcf\xe8\xc6\x9c\xa1\x73\xfa\x95\xa8\xa3\x3b\x69\x94\x68" - "\x4f\xd9\x64\xd2\x13\x8e\x46\x98\x7c\x47\xd1\x7d\x55\x05\xf9\xa6" - "\x70\xc0\x8c\xca\x07\x3d\x27\xea\x21\x18\x0e\xa8\x73\xbb\x97\x4d" - "\x41\x1d\xd3\x89\xff\xae\x2d\xf2\x1a\xfe\x6d\x2f\x4b\xbe\x36\x9c" - "\xf2\x79\xe2\x60\xf8\x9b\xe4\xb3\x54\x1e\xfa\x16\x77\x86\x7d\x31" - "\xac\xff\x1a\xb3\x0a\x5c\x26\xf1\xe0\xe7\xcd\x24\xff\xbc\xc6\x7a" - "\x05\x0d\x47\x3a\x16\xd7\x98\xaf\x45\x6f\x07\xde\x07\xbd\x6f\x71" - "\xed\x70\xf8\x22\x79\xb0\xb2\xd6\x6f\x11\x3a\x92\xc5\x95\x5b\x80" - "\x2f\x40\x2b\x1c\xb5\xd0\x59\x0a\xf6\xce\x5d\x3e\xb6\x6c\x3b\x23" - "\xff\x33\x23\xdc\x81\xd9\xec\x68\x75\x0a\xdb\x71\x81\x6c\xc6\x25" - "\xc5\xbd\x78\x01\x63\xa9\xe1\x10\xa2\x49\x49\x8e\xcc\x97\x25\x99" - "\x37\x6c\xd1\x69\xf8\x2f\x2e\x16\x5e\x64\x06\xeb\x12\xf1\xee\x9b" - "\x6e\xe5\x81\x2a\x83\x9a\x53\x4d\x76\xcc\xe3\x0e\x37\x93\x1d\x73" - "\xdd\x36\xb8\xa0\x7d\x1c\x58\x73\x5d\x96\xe1\xeb\xf3\x58\x32\xf9" - "\x33\x30\x79\x25\x2d\x27\xf7\x6b\x4f\x22\xda\x67\xd6\xec\x85\x9b" - "\xa5\xbd\xf0\xcf\x17\x91\xce\xb9\xf6\xfd\x89\x20\x78\x18\x51\x6e" - "\x1e\x4b\xac\xbe\xc0\x92\x88\x0e\xb2\x9d\x92\x34\x1b\xf1\x85\xb3" - "\x3b\x4d\x3c\xf8\xf7\x24\xb6\xfd\x4c\xc8\xdf\x81\x77\x19\xf9\x48" - "\xe0\x96\xc1\xf4\xa7\x37\x8c\x12\xfa\x04\xc2\xd6\x2e\x9d\x33\x20" - "\xcc\xaa\x36\x31\xe3\x51\xd2\x4d\xac\x91\xf7\xf0\x8e\x06\xa4\xbe" - "\x6f\x77\x99\xa7\x5e\xb7\x03\x3f\xe8\x79\xb9\x53\xf2\x3b\x6a\x24" - "\xf8\x2f\x6f\xb7\x4b\xda\x20\x3d\x19\xed\x5e\xab\x86\xf1\x38\x9e" - "\xb3\xf4\x8d\xe2\xc8\xae\x5b\xaa\x80\xe5\xc9\xc9\xc4\xf7\x68\x3c" - "\xe3\x21\x6b\x5f\x9c\xa4\x61\x84\xce\xb5\x45\x9e\xff\x61\x6f\x8a" - "\xe9\x2e\x3b\x99\xae\xef\x67\xb4\xaf\x4b\x5b\xaf\x27\xb3\x3c\x11" - "\x43\x73\xae\xd2\x3e\xb3\xa6\x23\x4e\x67\x37\xa9\x48\x5f\xa5\xef" - "\x6f\xe2\x0c\x77\xcd\xe8\x87\x97\xad\x62\x09\x3f\xb9\x31\x8a\xd1" - "\xf9\x1f\xd2\x76\xc8\x7d\xf7\xe4\x81\xd0\x19\x41\xaa\x80\x37\xd9" - "\x28\x10\x3c\x06\xd9\xfe\x94\x3e\x0d\x3a\x75\x1b\xa0\x72\xff\x3d" - "\x79\x3c\xac\x9e\x40\xdf\x3e\x8a\x3a\x48\x07\x9d\xca\x97\xb4\xc9" - "\xc9\x5a\x71\x97\x12\xe9\xe4\xfe\x7a\x72\x50\xbe\x8d\xec\x50\x11" - "\x7c\x55\x8d\x9f\x74\x77\x7e\x25\xe1\xeb\x60\x11\x93\xaa\x98\xe5" - "\x50\x91\xc7\x18\x23\x6d\x74\x9b\xda\x58\xdb\x6c\xfa\x4e\x73\xdd" - "\x35\x91\xe4\x81\x6d\xaf\xb9\x69\xdf\xee\xcd\x88\x7e\x8c\x78\x7d" - "\x41\x8b\xb7\x6d\x9d\x80\x7c\x88\x8b\x3b\x78\xce\x6f\xdc\x50\xc0" - "\x92\xa5\x2d\xd5\x36\x61\xa3\x8b\xee\xac\xdf\x1a\xcf\x2c\xb7\x56" - "\xb1\xa4\xee\xb2\x36\x17\xf8\x4b\xa9\x1f\x43\xf5\x6f\xfa\xcc\x4b" - "\xfe\x1c\xf6\xf5\x78\x86\xc8\xb1\xfa\xf2\x29\x84\x93\x42\xe1\xb6" - "\xcb\xda\xf9\x50\xb3\x87\x7d\x39\x77\xe7\x39\xa9\x4b\x2f\xe4\x4b" - "\xce\x23\xf6\x90\xfe\xc1\x97\x4f\xc9\xb6\x7c\xf9\xd4\x51\x3b\x23" - "\xd9\x79\xcb\x0e\x61\x9b\xfd\x4b\xd0\x47\x27\xed\x9a\x3c\xa6\x59" - "\xcc\x2b\xa2\x77\xcb\x89\x07\xfb\xca\xb5\x1e\xe9\x68\x9f\x00\x7d" - "\x94\x2a\x69\xf8\x23\x15\x2a\xe6\x4f\x58\xff\xdf\x27\x79\xe3\x80" - "\x38\xf1\x65\xc6\x44\x9e\x8d\x87\x5d\x42\x9f\x65\xe3\xe7\x33\xf1" - "\x8c\xe2\x1b\x8f\xda\xf1\x8c\xc6\x9c\x2b\xc1\xd3\x8c\xa7\x03\xcf" - "\x78\x7c\x4f\xa1\x79\x09\x1e\xd6\x42\x3e\x2a\xbb\x62\x0f\xd7\x0d" - "\x76\x2f\x8a\x60\xe3\x5e\xfb\x53\x26\x75\xf6\xda\x53\xc9\x3f\x61" - "\xda\x76\xc6\x96\x05\x78\x8f\xf5\x66\xf2\x31\xd2\x9e\x5a\xbc\x9d" - "\xce\xd2\xdb\xe3\xfb\x9f\xa5\xb7\x4f\xc6\x0f\xa1\xf6\x06\xfc\xfc" - "\xf8\xa5\x86\x7e\xa7\x26\x77\x97\xb5\xa7\x02\x8e\x82\xc6\xba\x36" - "\x9c\x48\xf9\x31\x0e\xc4\x17\xc5\xbe\x92\x29\xfb\x7b\xbc\x06\xe1" - "\x28\x1e\xfb\x99\x47\xeb\xaf\x13\x61\xb3\xb5\x18\xfb\x5a\x2c\x60" - "\x32\x1a\x7d\x8e\xfd\x7c\x26\xf5\x97\xda\xdb\x15\x7b\xd4\x1e\x7e" - "\x27\x8c\xca\xa4\xfe\x7b\x63\x91\x0f\xb0\xe4\x13\xe7\xf7\xc1\x53" - "\x83\x13\xdd\x97\x31\x74\xa1\x0c\x49\x07\x21\x3d\xca\xd0\xd3\xf7" - "\xc1\x7e\x34\xd9\x27\xc0\x98\x22\x1d\x78\xe2\x28\xfd\xbe\x59\x77" - "\xd9\xa9\xe4\xc3\x8b\x98\x66\xcf\xa3\x3d\xd5\x17\x96\x97\x6c\x2a" - "\x0c\x94\x1f\x75\x46\xc9\x3a\x8f\xda\x4f\xb3\xf6\x87\x64\xbd\xa7" - "\xac\x83\xad\xa5\xa2\x71\xa0\xef\x40\xf5\x4e\x92\x7c\xdf\x54\x77" - "\x82\x8f\xb9\xab\x55\xec\xf9\x47\x6a\x52\x8b\xb8\xeb\x34\x3b\x75" - "\xb2\xc9\xdf\x71\x8d\xfb\xe1\x29\x61\x2f\x84\xf7\x94\x30\x77\xe1" - "\xdd\xe2\x3c\xeb\x1c\xfb\x2a\xd6\xed\x15\x77\xce\xf1\x7e\x3a\x48" - "\xdf\xe9\x0c\x9d\xf6\x06\xf0\xd8\x7d\x7e\x32\x54\xa4\xdd\x41\xf1" - "\x88\x23\x9b\x24\x3b\xc3\xbe\xf1\x4d\x87\x1d\x72\x4d\x9d\x7e\x9f" - "\x68\x0b\xd1\xde\xc0\x0f\x5d\xd4\x66\xd5\x79\xd8\x41\x7d\x28\x06" - "\xff\x47\xbe\x41\x69\x4d\x58\x57\x90\xac\xf0\xf4\xab\x98\x77\x5c" - "\xdd\x78\xd8\x71\x6d\x7d\x38\x2d\xee\x4a\x16\x07\xf8\x39\x6f\xec" - "\x61\x07\xd1\x24\x1b\x8a\x86\x44\x4d\xab\xe6\xae\xae\xb8\x23\x35" - "\xdd\x65\xa7\x1b\x0e\x3b\xe4\xd8\x5c\x63\xb9\x0d\x7a\xdf\x77\x68" - "\x7d\x47\x9c\x38\xa3\x9a\xb4\x55\xfa\x0f\xf1\xb0\xaf\xd8\xa0\x32" - "\x2b\x8c\x33\xd1\x03\xd8\x1b\x2e\x4b\x58\x7c\x95\xde\xb7\x37\x5c" - "\x53\x3b\xbe\x1a\xd4\x96\x7f\x58\x1d\xbd\x5a\x1d\xfb\xff\xc5\x3a" - "\xf6\x5f\xad\x0e\x79\x7e\xde\x91\x7a\xed\xbc\x63\x87\xb0\xab\x03" - "\xfc\xe9\x94\x38\xf3\xeb\x37\x82\xe0\xdf\x02\xe6\xe3\xe4\xa7\xb1" - "\x98\x74\x65\xc9\x97\x4a\xc0\xf9\x4a\xe6\x31\x47\x0f\x73\xad\xf8" - "\x88\xb5\xb3\x0e\x61\xbf\xef\x58\x3e\xf1\x6c\x9f\x79\x7a\x37\x1d" - "\xf1\xf6\x1a\xbe\x72\x12\xbc\xb7\x63\x1c\xb6\x85\xcd\xb3\x26\xdf" - "\x47\xcc\x9d\x49\xf2\xd5\x66\x92\x6b\x7b\x78\xec\xf1\x1a\x15\xb8" - "\x01\x34\x7a\x50\xc0\x03\xf4\x8b\xe4\xb7\xde\xab\x10\xfc\x96\x57" - "\xd8\x4c\x1e\x21\x7c\xa4\x94\xed\xcd\x27\xd9\x77\xb0\x37\xc3\xda" - "\x5d\xc6\xd2\xc9\x77\x0a\xc9\x9d\xb9\xd9\x66\x4d\x0b\x44\x70\xc1" - "\x4f\x81\xf6\x27\xdf\x29\x6e\x9f\x87\x05\x41\x47\x57\x5f\x62\xf1" - "\xd5\xa0\x3d\x81\xb3\xcd\x84\xd7\x77\x6a\xfe\x53\xd6\x5f\x0a\xf9" - "\x4f\xd9\x41\xb2\x9e\x56\xbc\x5f\x62\xc6\xe0\xc6\xf7\x2a\xb6\x5d" - "\x62\x89\xdb\x57\xb0\xa4\x6d\x24\xcb\xfb\x5a\xd2\x3e\x42\xb7\x9d" - "\x7c\xa9\x2c\x4d\xa2\xb3\x84\x10\xed\x43\x36\x12\x42\x78\xcb\x28" - "\x64\x20\xd7\x04\xef\xaf\xc5\x3e\x18\x70\x1e\x76\x05\xcc\x9f\xcf" - "\xec\xdd\x74\xd4\x8e\x31\xa8\x05\xfc\x92\x07\x1a\x5b\x5d\x47\xa6" - "\x2a\xcc\xff\xcd\xe1\x44\x89\xdf\x51\x96\x6f\xb0\x39\x11\xdc\x96" - "\xc1\x26\x75\xb2\x14\x79\x6e\x3f\x0c\x7b\xe2\x99\x0c\xd2\x69\x2c" - "\x5a\xcc\x2c\xc1\x6d\x73\x95\xe2\x57\x58\x84\x3b\x90\xca\xe8\x57" - "\xf4\x0d\xef\x98\xb4\x88\xa5\xd0\xf9\x03\x9d\x95\x58\x9f\x17\xe9" - "\x6f\x4f\x2c\x64\x29\xe1\x65\x2f\x5e\x95\x97\x7b\x57\xca\x33\xd9" - "\xd6\x05\xb9\x79\x8b\x57\xce\xcb\xcb\x66\x33\xa5\x2a\x88\x30\x47" - "\xbf\x8a\xf4\x40\x56\xe6\xe6\xe7\x58\xe7\x2f\xcf\xcb\xcb\x5e\x92" - "\x6f\x9d\x3d\x2d\xfd\xdb\x36\x49\xb7\x59\x76\xd1\x59\x8f\xd4\x0b" - "\xec\x1c\xc6\xff\xfd\xce\x4b\x95\xe4\x5f\xab\x74\xc6\x1c\x53\x60" - "\xa6\x55\xfa\x39\xea\x9c\x4b\xba\xb8\xbc\x38\x63\xab\xa4\x53\x3b" - "\x9f\x92\xb4\x7d\x76\xab\xbc\x47\xd7\x29\xed\x00\x76\xcd\x4c\x90" - "\x6b\xea\xef\x0f\x44\xd8\x19\xbd\x2f\xa6\x77\x93\x9d\x55\xb8\x46" - "\xd3\x79\xf8\xdf\x85\x8d\x46\xbe\x6d\x96\xa2\xa7\xd3\xd3\x68\xdf" - "\x85\xdd\xe9\x1d\x64\x57\xb7\xec\x4c\x16\xe0\x13\xd7\x5d\xf6\xf7" - "\x39\x1e\xe3\xa3\x0e\x8d\x46\xe8\x90\x3a\x88\x9d\x73\xc9\x46\x27" - "\xff\xf7\x9b\x2e\x69\xe5\xac\x43\x7d\xd7\x21\x6d\x89\x87\x9d\x89" - "\xd2\x74\x15\xc7\xb6\x69\xed\x92\x3a\x15\x67\x56\x48\x9d\x8a\xbf" - "\xef\x0a\xbb\x0b\x2f\x6c\x4d\xd0\xde\xa8\xd1\xa4\xdd\x5a\x79\x0d" - "\x3a\x4e\x40\xfa\x16\xd0\x75\x5b\xaf\x1d\x17\xfe\x5d\xf2\x3f\xfd" - "\x6c\x2f\x75\xce\xe8\x6f\xd3\x44\x87\x9b\xe5\xb7\x52\x16\x2f\xe1" - "\x8a\x3e\x1c\x90\x70\x12\xf1\x09\x67\x10\xa6\x7c\x1e\xd6\x99\x70" - "\xe5\xfc\xea\x1b\xf1\x47\x96\xcc\x5f\xba\xd8\x3e\x2f\x3f\xf7\xe9" - "\xdc\x45\xb9\xf9\xab\xc4\x95\xfd\x64\xf1\xef\x07\xe3\xb3\xe6\x5c" - "\x69\x7f\x3e\x89\x64\x32\x9a\xdd\x6a\x1f\xe9\x40\x48\xb9\x58\xe7" - "\x37\x81\x32\xf6\xe0\xb5\xf5\xb3\x53\xb4\xb5\x5a\xd8\xf1\x38\xcb" - "\x3c\x11\x91\x0e\xed\x7c\xa4\x53\x1b\x2b\xf1\xbd\xcb\xfc\x79\x8a" - "\x75\x34\x9b\xda\xc6\xbc\xfb\xe9\x5c\x0c\xf0\x2e\xa1\xfd\x73\x7d" - "\x01\xed\x73\xcd\xec\x58\x00\x7b\xa9\x38\x2b\x3f\x37\x82\x60\x46" - "\x34\x24\x60\xb4\xab\x8d\x9d\x5d\x2e\x60\x71\xde\xb2\x4b\xd8\xe6" - "\x38\x6f\xf9\x2d\xcd\x45\x6a\xb3\xca\x33\xb6\x71\x9e\xf1\xb2\x7a" - "\x3e\x67\x1b\x3f\x9f\xf3\x72\xc8\xf6\xe5\x59\x0f\xf2\xee\x41\xde" - "\x53\xe4\xdb\xaa\xf2\x1c\xdb\x43\x78\x92\xc2\xa6\x7c\x33\x78\xc3" - "\x23\x0e\x6a\x8f\xdb\x9b\xc2\xe4\x7d\xfd\xb3\x1e\xb7\xef\x6e\x06" - "\xda\x53\xe8\x47\xc8\xf3\x3d\xd0\x87\xc8\xe7\x46\xbb\xdc\xde\x1e" - "\xe2\xa1\x1d\x2a\x68\x44\x0f\x3b\x6b\xc6\x7e\x5b\x47\xe5\x52\x9f" - "\xb7\x63\x4e\x92\x9e\x06\xfa\x0e\x3a\xe6\x4c\xb5\x76\x37\xb8\x7d" - "\x3d\xe2\x09\x06\xfd\xc7\xff\xdc\x38\x1a\x47\xc0\xf8\x7b\xa1\x39" - "\x70\x4e\xd8\x88\x9a\xd5\xce\xbf\xe0\xce\xd9\x29\x72\xbc\xcf\x3d" - "\xa2\xc5\x9d\x0f\xd9\x0b\x38\xf7\x14\xc2\xbd\xf8\xa9\xdc\xf9\x58" - "\x7a\xd8\xd9\x34\x7d\x13\x36\xbd\x48\xef\xc4\x5e\xc0\x6e\x46\xfe" - "\x8d\x72\xee\x3d\x96\xe6\x2d\xce\x89\x40\x9e\x20\xdd\x6f\xd5\xe0" - "\xfb\x86\x7b\xed\x39\x5d\xd7\x03\x6d\x3a\xff\x63\xd7\x82\x00\x13" - "\xfe\xeb\xdb\x03\x42\x1f\x52\xb3\x11\xa1\xa8\x65\x9d\xa4\xaf\x46" - "\xf6\xd5\xa2\xb7\xc7\x49\xdf\x0f\xdd\x65\xe7\xda\xfb\x74\x92\xcc" - "\x92\x66\x24\xba\x8d\x7c\xfa\xd1\xfa\x21\x1a\x90\xda\x44\xeb\x07" - "\x65\x9b\xe9\x9c\x5b\xae\xa3\xf3\x09\xff\xda\x3a\x3a\x2f\xe6\x3c" - "\xda\x5d\xcb\x0d\xc5\x7c\xd2\x3a\x96\x29\xf4\x10\x02\x3e\xba\x97" - "\x6c\xc4\xde\x13\x2f\x71\x92\x77\xbd\xd0\x55\x59\xd1\x49\xfb\x64" - "\xc9\xce\x1e\x16\xad\x3a\x6d\x16\xa2\xd5\x8f\x15\x0a\xfd\x8d\x28" - "\xe4\xab\x25\xfd\x0e\xd2\x31\x8c\x11\x3e\x23\x3f\x62\x3b\x2f\x32" - "\x63\x3b\x3b\x5f\x4d\xe7\x49\x21\x58\x9f\xff\x86\xce\x0f\xf9\xa6" - "\x47\x1b\x4c\x85\x86\x0a\x2a\x43\xbd\x74\x76\x8a\x9e\x8f\x7c\x93" - "\x53\xbe\x36\x76\xfe\x63\x91\x8f\xd2\x0a\x5b\x22\xe6\xb9\xa0\xd5" - "\x5c\x94\x3e\x80\xf0\x0e\xd5\x0c\x7e\xe6\xf3\x99\xc1\x15\x81\x5a" - "\x7c\x9b\xa3\x3a\x8f\xda\x11\x97\x21\xce\x31\x7a\x2d\x74\xbe\x89" - "\x39\xb7\x3d\xdd\xed\xf9\xca\x25\xda\x43\x77\x95\xf3\xb1\xff\x0a" - "\xde\xc6\x7b\xfb\x8e\xaf\x99\xd1\xbe\x80\xc6\xd3\x2b\x6d\x00\x9f" - "\x63\x9a\x9d\x2f\xef\xdb\x5d\x9b\xe6\x44\x75\x61\xbe\xfa\x0c\x51" - "\xec\xa8\x85\x74\xec\x3f\x4f\x39\x6a\xe9\xc1\xf8\x78\xd7\x02\x5f" - "\x6a\x3e\xaa\xbc\x7d\x6b\x93\xe6\x68\x84\xc5\x5c\x8c\xef\xbb\x74" - "\x9d\x26\x9a\xa7\xeb\x84\x8d\xf7\xf3\x85\x04\x37\xcc\xed\xc9\xc7" - "\x16\x85\x6c\x2c\x77\xc9\x7b\x7d\x66\xe4\xe9\xbb\xff\x1b\xbc\xa4" - "\x36\xa2\x1d\x64\x8b\xc6\x11\x5c\xa1\x9e\xa0\xf3\xf7\xc7\x2e\xaa" - "\x9c\xee\x3c\xd0\xfd\x15\xe2\x9d\xd2\x1c\xbc\x8b\x78\x41\xba\x2b" - "\x46\x67\xef\x74\x97\x3e\xb4\x4e\xbe\x49\xd4\xef\xd4\xd3\x1a\xa1" - "\x36\xd0\x7d\xb0\xca\x85\x62\x9d\x92\x0e\x6c\xb4\x38\x7f\x88\x78" - "\xf6\xeb\xc7\x7c\x28\xf3\x9c\x38\x37\xeb\xda\xa1\x95\x43\x36\xb3" - "\x50\x46\x8e\x5e\x86\x4a\xfa\xc3\x79\x42\x7f\xcf\x23\xf3\x4b\x5d" - "\xa3\xc7\x7c\xaa\xb8\xc7\x43\xf9\xa5\x0e\xd0\x37\xd5\x7d\x3a\xa8" - "\xe2\x6e\xcd\x37\x7b\x74\x1d\x33\xbc\xf7\xdd\xff\x22\x98\x76\x39" - "\x8f\x38\x7c\xc0\x0f\x3e\xe7\xe1\x3a\x7c\x03\xfe\xff\xba\xf9\xaa" - "\xf2\x10\xb2\xa3\xb0\x9c\x19\xd4\x38\xdb\x74\xb2\x91\x41\xda\xf6" - "\x52\xef\xfd\xc2\xbd\x9a\xbd\x8c\x88\x73\xec\x9b\x6f\x42\xe7\xf0" - "\x41\x4d\x86\x7c\x61\xae\xe4\x61\x2e\xcc\x15\x32\xe4\x4d\x47\x32" - "\xff\xa3\xc0\x6f\xa8\x2d\xf0\x18\xa4\x3e\xde\x85\x74\x0f\xeb\x59" - "\x1b\xd2\x05\xbd\x60\xa6\xb2\x06\xa6\x39\xb3\x53\x64\x99\x5d\xc2" - "\x7e\x48\x48\x26\xd0\x25\xee\x3f\xd1\x99\xb9\x4a\xf4\x63\xdc\x2b" - "\x76\xd2\x91\x72\xdb\x2f\x90\x2c\x39\x52\xca\x27\x64\x1a\x4d\xcf" - "\xf3\xfa\x33\xfd\xc3\x71\x14\x96\x30\xbb\xe0\xd1\xcf\xa5\x2a\x0d" - "\x2a\xf9\x1f\xe4\xc5\x35\xc0\x97\x76\x9f\xb0\xd3\xe0\x06\x3d\x8a" - "\x3a\xb8\x3d\x8f\xee\x52\x76\x8d\x24\xfb\x0d\x72\x6d\x76\xfd\x4a" - "\xb4\xa9\xec\x41\x5e\x4c\x3c\x99\x97\x7c\x1d\x5d\x60\x48\x17\x8b" - "\x74\x0f\xd5\x17\x76\x92\x8e\x59\x34\xf9\xb1\x6d\xd7\xea\xf6\xc6" - "\x66\xa7\xdc\x1a\xcd\x32\xbb\xcb\xba\xe6\x78\x58\x7d\xf5\xb5\xe3" - "\x8d\xae\x39\x57\xa3\xcf\x25\xbd\x98\xca\x06\xe3\xf1\x49\x86\x33" - "\x11\xf5\xcf\xe6\xd4\x7e\xdf\x43\x01\x83\x9f\xf5\x1a\x86\xf2\x3b" - "\x4b\x1c\x2c\x50\x36\x94\x07\x0b\x30\x5e\x5d\x16\xf0\x80\x8d\xac" - "\x49\xea\xdd\x90\xee\x80\xa9\xc8\xc7\x2f\xb8\x03\xfb\xe9\x0c\xc1" - "\x8b\xb1\x02\xde\xf2\xdd\xe7\x0e\xbc\xcd\x48\xbf\x9b\xf0\x4d\x1b" - "\xf3\x8d\xa7\x76\x4d\xb4\x97\xb0\x09\xe7\xe8\x7b\x57\xbb\xdc\xf3" - "\x7d\xa9\xda\xd3\x4c\xf6\x81\xc3\xdb\xf4\x83\xe5\x4b\xe6\x93\x91" - "\xe9\x09\xb3\xb2\x57\x64\x2f\xb2\x3e\x4e\x26\xa8\xaf\xd4\x1b\x0d" - "\xf9\x39\xbc\x18\x4d\xfb\x2b\xd1\xef\xe4\xef\xf0\x6a\xbe\x0e\x75" - "\x3f\x87\x58\x73\x89\x24\xf3\xfe\xdf\xf4\x75\xa8\xd3\xe7\xe4\xe7" - "\x30\x74\xfe\x73\xb1\xb1\x6f\x0d\xa8\x87\xba\x29\x2c\xf6\xf4\x32" - "\xdf\x2c\x5a\x47\x72\x7f\xb9\x38\x3d\xdc\x56\x91\xa4\xcf\xb6\xa7" - "\x23\x7e\xae\x7e\xe7\x15\x73\x31\x1a\xe1\x45\xa1\x3b\x36\x17\x1d" - "\x18\xef\x3a\xb9\x7e\x45\xda\x0a\x5d\x4f\x42\xf3\x69\x2f\xf4\x3a" - "\xd4\xf2\x7b\x0b\xa5\x6c\xf2\xe2\xfa\x1d\xea\xd0\x28\x79\x2e\x76" - "\x71\xbf\x7e\x87\x4b\xae\xcd\x43\xda\xda\xbc\xd8\x78\x35\x5d\x96" - "\xd0\xda\xb8\x14\x15\x5a\xd7\x5f\x68\x79\x2f\x45\xfd\x23\x3d\x18" - "\x8d\x47\x1c\x79\x86\xf9\xc7\x90\xbc\x52\xde\xd9\xf6\x0b\xfb\x42" - "\xd2\x1e\x47\xf7\x49\xed\x1d\x75\x74\xbf\xaf\xbd\xdf\x84\xf7\x37" - "\xb4\x77\xd0\x8b\xdd\x2f\x69\xef\x58\xb3\xdd\xa5\xda\x7b\x3c\xde" - "\x73\xb5\x77\xec\x1d\xdd\x3f\xd6\xde\x47\xe1\xfd\x3e\xed\xfd\x46" - "\xbc\x8f\xd3\xde\xb1\x06\xbb\xc5\x99\x01\xda\x1e\x85\xb6\x5f\xbc" - "\x76\x9e\xf5\x92\x4b\x9e\x5b\x77\x33\xd0\x83\x55\x72\xef\xe9\x8b" - "\x8b\xc7\x9c\xce\xd2\xe1\x8b\xf8\x3a\xaa\x07\xf1\xc9\x1e\xe6\x69" - "\x0e\x8b\xd7\xec\xb7\x75\x4f\xf7\xb0\x6f\x3c\x61\xf1\xd5\x5a\xfc" - "\x5c\xf0\xdc\xbe\xb0\x78\xa7\x16\x9f\x0f\xbc\x98\x13\x16\xbf\x56" - "\x8b\x5f\xe7\x61\xff\x6d\x0c\x8b\x77\x68\xf1\xbb\x74\x1d\x1e\x2d" - "\x7e\x91\x16\x7f\xc0\xc3\x3e\xda\x1f\x16\x9f\xa9\xc5\x03\xff\x5f" - "\x6c\x0d\x8b\x17\x78\x45\xda\x64\x37\xf1\xa3\x85\xb4\xb6\xba\xfd" - "\x1e\xd6\xba\x2b\x2c\xcd\x4c\x99\xd7\x6f\xf6\xb0\xbf\x35\x86\xc5" - "\x4f\xd5\xe2\x93\x3c\xca\x77\xc2\xcb\x4c\x19\x0c\x57\x29\x5b\x59" - "\xe6\x60\x72\x7d\xe2\x81\x84\x2e\xb3\xa0\xb3\x2f\x67\xd3\x9d\x30" - "\xd3\x76\xde\x66\x2d\xe2\xbc\x8d\x5d\x9e\xa5\xe9\xee\x92\x9d\xe3" - "\x4e\x79\xbf\xee\xf2\x64\xcd\xb6\x82\x57\xdc\xb9\x2b\xa0\x38\xff" - "\x5b\x42\x3e\xe3\x28\x91\xf6\xc2\x75\xdf\x33\x24\xdf\xd2\xce\xfe" - "\x91\x86\x6c\xc5\x92\x2e\x78\x27\xc9\xc0\xdd\xf9\x3d\xd2\x96\x3c" - "\xf8\x60\x8a\x23\x39\x0f\xc1\x23\x5c\x9e\x25\xf1\xfe\xe5\x6c\xb5" - "\x87\xee\xb5\x4a\x59\x18\xad\x45\x4a\x4f\xfa\x6a\xe1\x69\x3d\xec" - "\xb2\xb0\x4b\x11\x61\x89\xfd\xa4\xbb\xec\xf2\xf4\xd0\x7d\x22\x7f" - "\xb5\x16\xff\x31\xe2\xe7\x86\xc5\x57\x0c\x8e\xdb\x81\xef\xcc\xb3" - "\xcc\xbd\x97\xb8\x2f\x70\x89\xfb\x2b\x3f\x47\xbb\x17\x08\x1d\xc1" - "\x9b\x83\xce\x59\x56\xba\x6f\x43\x3e\x62\x03\x2b\xb8\x97\x74\x22" - "\x11\x7f\xdd\x63\x3e\x2f\x68\x8c\x6e\xbe\xfe\x69\xd2\x7f\xbd\xc8" - "\xe8\x6c\xb6\xb8\x93\xfc\x0d\x9a\x38\xdd\xe3\x5e\x7d\x96\x45\xd3" - "\x7d\x9c\x1d\x0b\xe8\xfb\x67\x6c\x76\x8e\x97\x1d\xcb\x09\xb2\x1d" - "\x28\x7b\xfb\xd3\x3a\x7d\x71\x39\x10\xba\x2b\xfc\x28\x9d\x65\xdf" - "\x5c\x2c\x7c\x62\xf7\x08\x5b\xe5\xa6\x52\xd2\x29\xf8\x3c\x83\x1f" - "\x21\xda\xf8\x70\x89\xa9\x94\x59\xb1\xb7\x4f\xc1\xbb\x5d\xfe\xf0" - "\x0d\xf1\x83\xf5\x49\xae\xe5\x9e\x7c\x89\x6b\x66\x39\x25\xbe\xe8" - "\xc9\xe7\xbf\xa1\xfb\x27\x3d\x0e\xe0\x9b\x0c\xd0\xe1\x19\x03\xe5" - "\x5f\xbd\x9d\x19\x7a\x37\x81\x36\x39\x57\x67\x90\xf8\xa9\x37\x4b" - "\x35\x44\x95\x92\xac\x5d\xf8\xc3\xdd\x64\x9b\xb3\x67\x89\xdf\x70" - "\xac\xa0\x9d\x3d\x7f\x23\xb3\xcc\xf5\x1b\x90\xa6\xe7\x54\x4c\x3e" - "\xd9\x34\x3f\x92\x09\x7a\xd6\xf0\x7b\x7c\x3f\xb8\xa4\xce\x10\x10" - "\xf4\x4a\x6f\x96\x90\xcf\x3a\x6d\x49\xb4\x87\xb8\x5b\x83\x44\x8b" - "\x47\x83\x16\xb7\x00\xff\x47\x05\x57\xe6\xc4\x05\x96\xe5\x5c\xb7" - "\x3d\x8f\x45\x07\x97\x25\xc5\xbf\x78\x89\x4d\xd1\xf7\x9f\xed\x2b" - "\xb0\xa7\x74\x5b\x86\x6f\xc0\x9e\x42\x72\x9f\x18\xc5\x2c\xce\xa1" - "\xe9\x5d\x35\x7c\x6e\xde\xb1\xe2\xea\xbe\xbd\x83\x2b\x93\x84\xbd" - "\x09\x6a\xcb\x40\x7d\x5d\xf7\x32\x33\x06\xb5\x7b\xa9\x45\xa7\xd8" - "\x28\xd0\xcf\x86\x98\x8b\xdc\x75\x66\x11\x33\x90\x3f\xe4\xa2\x6c" - "\x21\x5b\x1d\x72\x2c\x27\xc0\xdc\x8e\x4f\x59\x51\x1e\x8d\x51\xef" - "\x5b\x44\xa7\x91\x3e\x33\xd2\x9b\xcf\xb0\xde\xf7\x4d\x7e\xec\x19" - "\x7e\xd0\xe4\x0b\x89\x2f\xee\xfd\x4c\xda\xb7\x08\x58\xe9\x1e\xa9" - "\x2b\xef\x61\x8a\xbb\x5c\x7c\x4a\xe8\x0d\x45\xcb\xb5\xd5\xdb\x42" - "\xe1\x62\xba\x27\x1b\x97\x35\x67\x6f\x8f\x7f\x88\x94\xdf\xf5\x7e" - "\xac\xed\x0f\xe9\x92\xb7\xeb\x6d\x19\x6c\xee\xaa\xce\xf4\x14\x4e" - "\xbe\x20\xab\x89\x7e\xe5\x1e\x71\xc6\x4f\x36\x03\x1c\x0f\xba\x38" - "\xd0\x9d\xb4\x65\x14\x78\x49\xdd\x98\x9e\x22\x6d\x48\x06\xe4\xdd" - "\x7c\x21\xef\x4f\x4f\x95\xe7\x1b\xe9\xe9\x52\xde\x9f\x9e\xb9\x66" - "\x34\xdd\x27\x08\x6c\xed\x8a\x4d\xb7\xe3\xb9\xa8\x2b\x2e\xd7\x39" - "\xf8\x7e\x34\x3b\xd3\x7a\x33\x8b\xa7\x73\x26\x5b\x50\xda\x62\x95" - "\x6b\x38\x58\xcd\x37\x8a\x6f\x63\xdb\xec\x2c\x42\xda\x3b\x0e\x7c" - "\x3d\xa9\x9a\x59\xd1\xd6\x11\xdc\x9c\x6e\x16\x7a\x8f\xce\x74\xab" - "\xbb\x93\xfc\x54\x05\x99\x3c\x0f\x0c\xee\xe6\xb1\xe9\x66\x99\x3e" - "\x78\x5f\x53\x27\xfa\x60\x4e\xf3\xb8\xfd\x67\x35\x9a\x30\x88\xb9" - "\x9f\xe6\xe1\xce\x34\xaf\xbc\x6f\x1e\xfc\x95\x8e\x57\xe5\x1c\x0d" - "\xae\x96\x70\x9b\x9d\x29\xe1\x16\xdc\xad\xed\x57\x63\xe9\x1d\x7b" - "\x77\x8a\xd4\x5f\x09\xe6\xeb\x34\xb2\x47\x4b\x43\x79\xf0\xae\xd9" - "\xf9\x0c\x56\xa1\xef\xc9\xda\xf7\x29\x14\x87\xfe\x61\xcf\x0a\x34" - "\x53\xbf\x06\xc3\xad\x02\x16\x85\x2c\x02\xfd\x23\x9a\x96\xee\x08" - "\xf8\xdc\xbe\x07\x5d\x6e\x31\x06\xfc\x2e\xd2\xed\xa7\x7a\xc8\xde" - "\x10\xe1\x4d\x94\x69\xa4\xf2\x42\xed\x57\x47\xea\x6d\xa1\xfa\xe8" - "\x1b\xfa\xea\x11\x7c\x35\xfa\x4c\x69\x68\x5c\x4f\xdb\x49\xee\x77" - "\x11\x30\x23\x1d\x3a\x9e\x4a\x30\x91\x30\xe3\x09\x1a\x4f\xaf\x8d" - "\x03\x8f\xed\x0f\x0f\x19\x56\xcd\xc0\x0d\x79\xa4\x4b\xc5\x53\x35" - "\xf8\x69\x3e\x56\x54\x61\x8b\x56\x7e\x53\x5f\x0d\xcb\x3b\xa6\x2f" - "\x2d\xda\x4d\xb4\x11\xe9\x25\xd0\x39\x95\x9c\xaf\x6a\x73\x58\xbe" - "\x66\xdb\x37\x44\x23\x3f\xea\x59\xb3\x45\xf8\xac\x4c\xe9\x2e\x53" - "\xdb\x43\xf0\x96\xe5\x0c\x50\xc7\xcd\x7a\x1d\x1e\xa6\xee\xd2\xdb" - "\x89\x77\x6d\x0f\xe6\x49\xa1\x31\x51\x67\xea\xf9\x48\xa6\x83\x31" - "\xf2\x91\xff\xd8\x41\xfc\x62\x28\x6e\x40\xa5\x29\xf0\xa0\x4b\xcc" - "\x47\xc6\x6b\x48\x76\xc9\x9d\xe9\x9a\x7d\x08\xbe\x56\xee\x85\xbc" - "\x86\xca\xa4\xb3\x46\x69\x6f\x94\x6f\x45\xb9\xda\x9d\x25\xbe\x47" - "\x6b\x03\xf8\xbf\xc0\xb7\xec\x85\x3f\x3c\x2f\xcb\x9a\x7e\x97\xb8" - "\x73\x3b\x61\xb9\x9d\xae\xd3\x66\x85\x02\xfd\x69\x6e\x73\xc8\xc6" - "\x19\xf9\xa2\xd6\x6c\x9c\x39\xb3\xe7\x08\xf8\x2b\x6c\x3a\xbf\xc4" - "\xab\xe8\xee\x08\x5f\xc1\xb7\x56\x62\x0c\x8b\x2f\xb2\x1b\xc8\x2f" - "\x76\x91\x9d\x7f\x45\xf6\xef\x80\x2f\xf3\x81\x3f\x1c\x45\x17\xd9" - "\x50\xd2\x4b\x22\xfc\x43\x7a\xcf\x3c\x16\xf1\x1b\x6d\x8e\xbe\x7b" - "\x78\x8a\x71\x2a\xdd\x1d\xe5\xc5\x19\xa0\xa5\x6d\xeb\x68\x3e\x90" - "\x8e\xfa\x69\xc5\x98\x80\x74\xeb\xf0\x2d\x7f\xbd\x90\x25\xd8\x9a" - "\x83\xe6\xec\xe4\xe2\xb3\x2c\x52\xf8\x38\x74\xf8\x49\xa6\x66\x68" - "\x53\xd8\xab\x28\xb3\x19\xf1\x31\x22\xde\xef\x27\x5b\x0b\xcd\xf8" - "\x16\x83\x6f\x27\xf1\x54\x51\x86\xa3\x12\xed\x2e\x3a\xcb\x6e\x46" - "\x5b\x3a\x50\x4f\x33\xda\x79\xba\x78\x31\x1b\xd5\x64\xef\x20\xfe" - "\x0e\xe5\x79\x98\x66\x8f\xa4\xb9\x4d\x51\xee\x45\xbf\x1c\x24\x13" - "\xc1\xb3\x70\x3d\x9e\x45\x41\x16\x53\xb4\x1a\xfb\xde\x6a\xd4\x4f" - "\xf7\x5a\x51\x0e\xd9\x20\x91\x6d\x41\xdf\x48\xae\x86\x72\x57\x77" - "\xf2\xd3\x28\xbb\xe3\x58\x27\xca\x73\xb4\xf6\x95\xa9\xd1\xd4\x63" - "\xd1\xdf\x91\x7c\x53\xee\x6e\xb4\x69\x2b\xe9\x6e\x23\xce\x8c\x38" - "\x73\x1f\x3d\xac\x18\x63\xb5\xf7\x61\x7d\x69\x8b\x33\x58\xd1\x65" - "\x26\x74\xa8\xad\x2b\x23\x58\x9b\x12\x51\x43\x76\xb0\x42\x65\x1a" - "\xc6\x50\x79\xeb\x50\x5e\x71\x36\x1b\x06\x5c\x1d\x85\x36\x92\x8f" - "\xe8\x93\x02\x4e\xb4\xc6\x14\x43\x02\xfa\xe2\xa4\x3e\xa9\x18\xbb" - "\xf5\x58\x0f\xe8\x8f\x82\xfe\x0c\x5b\x1d\xec\xbb\xab\x4b\x7d\x8a" - "\x25\x7e\x8e\xfa\xa5\x8d\x23\x70\x81\xcd\xb7\x3a\x87\x9f\x44\xdf" - "\x3a\x8e\xe5\xb4\x32\xec\x3d\xa6\x26\x7b\x33\xdd\xa1\x38\x29\xe1" - "\xd6\x41\xe3\xda\x89\x7e\xfa\xfa\x6c\xf5\x2a\x11\x2f\xa1\xed\xb5" - "\x68\xd7\x3a\xad\x9f\x14\x57\xd5\x47\xd3\x2b\x11\x9b\xb5\xf7\xe1" - "\x7d\x69\xbf\xdd\xcf\xa8\xb0\x7e\x22\xbf\xf1\x01\x2a\x4f\xeb\xe7" - "\x70\xf4\x73\xd8\xb7\xfb\x89\xf9\xb4\x82\xaf\xd5\xfa\x59\xa1\xf5" - "\xd3\x80\x7e\x0e\x47\x3f\x47\x87\xf5\x33\xee\x8a\x7e\x92\x5f\x78" - "\x3f\xfa\xd9\x16\xd6\x4f\xf3\x00\xfd\xf4\x7a\xa8\x8e\x8d\x36\xbf" - "\xb4\x0f\xc6\xeb\xc4\xfd\xf7\xf2\x88\xbe\xfb\xef\x2a\xdd\xbb\xbc" - "\x24\x6c\x10\xed\x27\xf9\x0d\xc9\x8d\x88\xd7\xa3\x3b\x9e\xb6\x55" - "\x15\x25\x42\x76\x33\x4a\xca\xa6\x05\x7d\x55\x1e\x31\xb7\xef\xee" - "\xc6\x16\xe1\xbb\xc6\x47\xf1\xc2\x66\x40\x1e\x13\xb2\xc7\xb4\x55" - "\x2b\x8b\x29\x3f\xe5\x45\xfa\x75\x7d\x77\xcc\x14\x83\x5d\xca\x43" - "\x73\x6b\xe9\x9d\x6c\x61\xc9\x33\x01\xde\x20\xce\x04\xca\x23\x42" - "\xfe\x9f\x56\xf0\x7a\x82\x8b\xb8\xcf\x2a\xee\x83\xb2\x0a\x5b\xa0" - "\x42\xbf\x97\xde\x89\xb4\xed\x61\xf7\xd2\x3b\x45\x1b\x7a\x84\xed" - "\x87\x95\x69\x81\x95\xe2\x7e\x7a\x77\xb9\x31\x2a\x54\xb7\x52\xa1" - "\xd5\xbd\x9b\xde\xbd\xd2\x36\x1b\xc9\xd8\xac\x42\xdf\xa6\xdc\x38" - "\x59\xd7\x71\xf1\x28\xcc\x4e\x6b\x79\x40\x3f\x2f\xe5\xc6\xb9\xfd" - "\x6c\x41\x29\x43\xc8\x1e\x0c\xc5\xe7\xf7\xdd\x35\x2f\x37\x96\xfc" - "\xa3\xbb\xe6\xc5\x5e\x8c\x13\xd6\x9b\x9d\x7c\x9e\x2b\x46\xf0\xb8" - "\xd9\xc9\xc2\x57\x8a\x32\x64\x0c\xb5\xb3\x4d\x31\xd2\xfe\x61\x12" - "\xe7\x41\x8a\xf1\x33\x0d\x37\x97\xa4\x05\x03\x26\x0f\xea\x14\xb6" - "\xa5\xfa\xc2\xc6\x16\xb2\x95\x81\xbc\x23\x84\x9d\x73\x94\xd7\x3f" - "\xbd\xf8\x7e\x65\xfa\xd4\x2b\xc2\x56\x1f\x70\xd6\x60\xba\x3c\xeb" - "\x47\x0b\x19\x6f\x52\x4c\x29\xb3\x17\x7f\xcd\x22\x30\x17\x4f\x51" - "\xdb\x9a\x3a\xc4\x3d\x3f\x13\x2f\x4b\x61\xee\x8e\x80\xa4\xdb\x41" - "\x2f\xb5\x25\x22\xcd\xd7\x6c\x14\xdd\x33\x21\x5f\x32\x48\x7f\x46" - "\xf8\x8f\x51\x22\xdf\x9c\xbb\x7c\x38\x53\x9f\xc9\xb8\x8e\x1b\x0a" - "\x6a\x49\x97\xe0\xf5\x1e\x0f\xf9\x60\x51\x8a\x5e\x62\x09\x84\xa7" - "\x30\x87\xdb\xb9\xe1\xf9\x5a\xe4\xe9\xfc\x8f\x9e\x8e\x21\xee\xc0" - "\xa7\xcc\x0e\xfc\x79\x46\x89\xdc\x6d\x2c\x64\xc6\x0d\xa7\x99\x19" - "\xf3\x2c\x70\x34\x30\x85\xe9\xb6\x1e\xaa\xe3\xa4\x0d\x81\x6a\xcc" - "\xc9\x65\x16\xee\xef\x2e\x8f\x34\x82\xaf\x2d\xd1\xe5\x17\xeb\xa4" - "\xad\x37\x23\xea\x7f\x4e\xd8\xa5\x90\xf4\x01\x60\x1b\xf9\x90\xbc" - "\x67\x1a\xff\x0c\xf2\x4c\xe9\xe3\x6d\x94\xc8\x7a\xed\x6c\x2d\x5d" - "\xee\x23\x91\xf5\x47\xc1\x1d\xad\x95\x3a\x51\xf1\x48\x9b\xd5\xa7" - "\x13\x45\x32\x41\x7c\xc7\x18\xa6\x4b\xbe\x27\x3b\xdd\x16\x8c\xd2" - "\xd6\x38\xc5\x3f\xea\xa1\xbc\xc8\x67\x12\x7e\x2e\xcb\x23\x6b\x42" - "\x73\x2d\x32\x87\xf6\x53\xf4\x29\x1a\xe3\x7a\x82\xfa\x45\x30\xf1" - "\x91\x5d\x37\x65\x88\xe7\xe8\xae\x41\xfc\x20\x99\x67\x39\x03\x42" - "\xbe\x74\x24\x03\xf3\xe9\x2c\xc6\xe0\x7a\xb2\x6d\xe5\x46\x3d\xc7" - "\x76\xf4\xb0\x63\x96\x2e\xd6\x84\x77\xba\xfb\xe0\x5a\xf8\x25\x6b" - "\xb7\x0e\xbc\x97\xab\xe0\xd1\xc0\xc7\x58\xa9\x2c\xc2\x35\xa4\x2f" - "\x4a\x36\x08\x9b\xbc\x28\xab\x9d\x89\x32\x8e\xa9\x1d\xec\x98\x83" - "\x78\xd8\xcf\x33\x9a\x76\x7c\xca\x9a\x2c\x7f\x15\xf5\x10\xbd\xed" - "\xca\xeb\xba\x5a\xd9\x29\x28\x3b\x55\x2b\xbb\x13\x65\xc7\x0f\x5e" - "\xf6\xe1\x92\x6b\x2c\xfb\x1a\xda\x7d\xd8\x7e\x2d\x65\x17\x6f\xe5" - "\x41\xe0\xe1\x11\xc0\xb1\x16\xb2\xcf\x4a\x77\x5c\x83\x97\xc8\x26" - "\xcd\x58\xc1\xab\x9f\x56\xa2\xb6\x13\xbe\x11\xfa\x21\x1b\x6d\xf1" - "\xe2\xfe\x2b\xc9\xd9\xb5\x7b\xaf\xee\xc0\x29\x46\x72\xf7\xee\xf2" - "\xa8\x8a\x10\x2f\xda\x77\x36\x6e\xf6\x28\x51\x7b\xa4\xae\xb5\x2d" - "\x5e\xce\xad\xa8\x79\x54\xd6\xc0\x3c\x67\xe6\x74\xa1\xb3\xaf\x44" - "\x9d\xd2\xe5\x5b\x5d\xb1\x99\xd3\xb5\xb2\xac\x57\xca\x4d\x35\x43" - "\x42\xd6\x6c\x47\xbe\x75\x65\x5e\x6e\x7e\xb6\x7e\x41\x7b\x38\x7b" - "\x3c\x7b\x7e\x76\xee\x8a\xec\x2c\xeb\x9c\xe5\x79\x4b\x26\x2c\x5d" - "\xb0\xc0\x3a\x3b\x7b\xd9\xb2\x79\xcf\x64\x0f\x67\x73\xf2\xe6\x2d" - "\x59\x96\x4b\xb2\x4d\xab\x75\xfa\x3d\xb6\x9c\xa5\xf9\x13\xbe\x3f" - "\x3d\xe5\x0a\xd9\x26\xdd\xd7\x3e\x41\x3c\x0e\xf6\xa7\x51\xa0\x31" - "\x62\xc9\x2e\x91\x69\x15\x77\x3d\x0f\xfe\x1a\x73\xf0\x0c\xed\x85" - "\xb4\xff\x10\xef\x45\xf6\x8d\xc9\x66\xf2\xb6\x2d\xbc\xf9\xb4\x72" - "\xd3\x76\xd0\xed\xad\x88\x23\xfb\xc4\x27\x78\x4f\xb1\x57\x9c\x67" - "\x2b\x37\xad\x42\x9a\xfa\x5f\x23\xce\x1b\x9b\x9d\xbe\xe1\x73\x66" - "\x94\x34\xc6\x30\x3f\x37\x0c\xe5\xeb\xc8\xd6\xf0\x97\x16\xa6\xd9" - "\x48\x37\xb8\x3d\x7e\xd2\x21\x8a\x4a\x0b\x14\x73\xc2\xa9\x72\x7d" - "\x0d\xbb\x2c\xe1\x92\x9e\x22\xee\x32\x28\x37\x3d\x49\x3c\xe2\x1a" - "\xf2\xbb\x58\x3e\x1c\xf8\xbf\xd7\x1e\xc2\xd5\xd7\xeb\xb4\x79\x2b" - "\xe0\xbe\xb2\x0d\x61\x61\x6b\x25\x72\xf8\xe4\x7e\xfa\x61\x4a\x74" - "\x3c\x53\x6e\x28\x94\x3f\xe4\x51\x6e\xa8\x90\x3f\x7a\x0f\xff\xdd" - "\x34\x55\xfe\xae\x8c\xff\x9f\xfe\xf4\xfa\xff\xe5\x32\xfc\xff\xe0" - "\xf7\x4f\xd4\x2f\xfa\xfd\xff\x63\xff\xff\x27\xf9\xb1\x18\xae\xf2" - "\xa3\xf9\x86\xb9\x75\xe2\xd7\x9f\xb3\x28\xcc\xcf\xaa\xf5\x4f\x63" - "\x4e\x7f\xc6\x2c\x85\x01\xde\x5e\xfc\x14\x4b\x28\xfa\x1a\x34\x18" - "\x68\xad\x7c\x07\x6f\x2f\xba\xc4\x4f\x62\xde\xfc\x05\xf3\xb7\xae" - "\xb2\x8d\x45\xaf\x6f\x03\x9d\x95\x2f\x7d\xcf\xd0\x79\x13\xdd\xf3" - "\x72\x23\xdc\xb8\xc2\xcf\x3e\xf4\x7e\x43\x3a\x95\xae\xa6\x4c\xe0" - "\x9e\x13\x8c\xd1\xfc\x8d\xce\x64\xf1\xd5\xa3\xf8\x01\x5e\xb6\x37" - "\x8b\x1b\xf6\xce\x41\x5c\xcb\x3e\x35\x75\xc8\xbe\x82\x86\x21\xd6" - "\xa7\x69\x9f\x8f\x7e\x4b\x9b\x9b\x0f\x89\x7b\x8c\x78\xd2\x1c\xd4" - "\x6c\x4c\x63\x7f\xba\xfe\x6d\xb9\xa7\x5f\xbf\x5e\x93\xe7\xd1\xbb" - "\xb8\xbf\x81\x7e\xd4\xf1\xb2\x82\x5a\x2a\x73\xaf\x5a\x37\x84\xf6" - "\xcc\x7d\x05\xa9\x43\x0a\xe7\x31\x43\x93\xe7\x0c\x3b\x0a\x5c\x48" - "\xe7\xe3\x58\x77\x7b\xb0\xce\x6a\xb7\x8f\xe2\x4e\xb4\x6f\x1d\xe8" - "\xb9\x0a\xb4\x69\x77\x77\xf9\x88\x24\x8f\x32\xd4\xa2\xd1\x72\x2e" - "\xac\x8b\x3d\xeb\x91\x26\x6d\x39\x1b\xbb\x1e\xe9\x40\xdb\x55\x10" - "\x8f\x22\xdb\x17\x3b\x0e\x30\xd8\x8f\x3a\x9b\xad\xbf\xa4\x70\x8c" - "\xa0\x31\xa8\x6e\xf4\xc3\xda\xa6\xc4\x08\x9e\x9f\xea\xd0\xeb\x45" - "\xf9\x15\x28\xbf\x59\x3b\x63\x74\xca\x72\x46\xec\x97\xeb\xd5\x56" - "\x4d\x3e\x44\xb5\x7b\x62\xd5\xeb\x0b\xb0\xaf\xf7\x30\xb2\x83\x5b" - "\x85\x3a\x5c\xa6\x52\xc6\x4d\x74\xc7\xf8\x44\x00\x7c\x8d\x2a\xf5" - "\x77\x95\x98\x97\xb4\xbc\x82\x0e\x11\xb4\x47\x10\xf4\xbd\x90\xcf" - "\x80\xfe\xc8\x01\x9e\x00\xcd\x21\xee\x67\x80\xde\xa0\x78\xd4\x51" - "\x85\x7e\x35\x83\x6f\xde\x8f\xbd\xbb\x96\x68\x85\x5f\x5e\xfc\x11" - "\xa3\x33\x0e\xa2\x17\x96\x39\xb8\x5f\xf8\x95\x2a\x8f\x99\xac\xd3" - "\x0b\x34\x3f\x88\x46\x58\xff\x4b\x66\xec\xc5\x18\x63\x8e\x34\x80" - "\xfe\x00\x4d\x1f\x63\xd7\xc6\xa6\x41\xd0\x05\x9a\x1f\x69\x89\xc3" - "\x63\x56\x63\x7f\x8f\x46\x1d\x0d\x1e\xe5\x26\x01\x0b\x89\x83\x62" - "\xd6\xe9\x7b\x3d\xc9\x1c\x3c\x28\x83\x03\xd7\x01\x6e\xfb\x93\x33" - "\x15\xe6\x51\x46\xb4\x60\x2c\xf6\x53\x5a\xe4\x37\x22\xfd\x01\xec" - "\xfb\x53\xb5\x31\x39\x01\x9e\x00\x74\x40\xcc\x74\x6a\x07\xf2\x34" - "\x02\xd6\xa8\xcb\xec\xd3\xf0\x58\x8b\xa4\x61\xcc\x9f\xe9\xb0\xc7" - "\x58\xaf\x0d\xc1\xdf\x14\x15\x0e\x7f\xc0\x42\xf2\xe5\x8a\xf9\x57" - "\x61\x63\x07\xbe\xd4\x9c\x49\x72\x68\xd4\x77\x40\xc8\xd0\x14\xd3" - "\x43\x64\xfb\x0d\x73\xe6\x00\x60\x71\x00\xe9\xea\x08\x37\xaf\xf9" - "\x1c\x38\xf7\x69\xa2\xa1\xcc\x8f\x48\x1a\xd5\xd4\x41\x73\xf8\xb4" - "\x62\xfa\x0b\x85\xdb\x95\x98\x99\x54\x1e\xc2\x6f\xe1\x09\x5a\xd6" - "\xf4\x46\x71\x35\xf9\x37\xb6\x91\xfd\xe2\xe1\xda\x58\x77\xa0\x5d" - "\x35\xfa\x1d\x28\x9a\x03\x34\xf6\xe8\xa3\x90\x3f\x78\x14\x53\x0d" - "\xc9\x1a\x45\xbe\xde\x1c\x6a\xe3\x09\x5a\x9f\xfa\x77\xc4\x77\x90" - "\xcd\xdc\x30\xd8\xcc\xd4\xc6\xa4\x4e\xf8\x0a\x55\xcc\x0f\xc9\xb6" - "\x99\x13\x10\x8e\x42\x1b\xc4\x39\x44\x57\x6f\x4e\xc4\x06\xca\x53" - "\x14\xca\x43\xeb\x07\x73\xd9\x84\x3c\xf7\xe1\xc9\xf5\xb4\x64\x37" - "\x1f\xed\x70\xbd\x48\xb6\xcb\x14\x53\x6b\x57\x6f\x92\x01\xf5\xfa" - "\x51\xaf\x81\xe6\x06\xcd\x0b\xbd\x8c\x0d\x12\x46\x7b\x30\x7e\x62" - "\x7e\x1d\x0d\xd4\x01\xee\x66\xd0\xff\xfe\x0c\x49\xdf\x99\x5c\x5a" - "\xfb\x5c\xe2\x7c\x30\x32\xca\xbb\x43\xda\x19\xa2\x74\x7d\xfe\x5f" - "\x43\x74\xa6\x89\xec\x0c\x45\xa1\xac\x46\x6d\x4e\x98\x90\xae\xb9" - "\x6f\x0e\x91\xbd\x03\xc5\x9c\x4e\xb4\xa6\xd6\x7e\x9a\x7b\x8f\x48" - "\xd8\xc5\x78\x69\x0e\x80\x8e\x4f\x97\xe3\x1c\x33\x93\x68\x55\x39" - "\x0f\x63\xe3\xf5\x32\x84\xcd\x04\xc0\x59\x45\x19\xfa\x5c\x09\xc7" - "\x0d\x48\x9b\x0a\xba\xb4\x6f\xde\xe8\xb8\x40\x96\x19\xb7\x4a\xa3" - "\x43\x32\x30\x36\x64\xaf\xdd\x25\xec\x60\x89\x79\x19\x37\xeb\xa8" - "\x2f\x40\xf8\xb5\x05\xed\x02\x4e\x88\x7d\xad\x2b\x2e\xb7\x2e\x34" - "\xb7\x63\xb7\xea\x73\x3b\x6c\x5c\xc5\xdc\x5e\x2b\xf0\x51\x6c\x9d" - "\x87\xfd\xb0\x5d\x9f\xfb\xb4\xce\x55\xac\xeb\x0d\x2b\xc4\xf9\x80" - "\x89\xe4\x81\x62\xdd\xfb\x3b\x05\x8f\x41\xe3\xd9\xe4\x68\x17\x36" - "\xf2\xd7\xa8\x2c\xaa\xc9\x77\x8a\xe4\x23\x67\x68\xfd\xeb\x6b\x9c" - "\xc6\x06\x75\xb9\xc8\x8f\xc1\x5a\xe0\x40\x5a\x83\x3e\xb4\x09\xdf" - "\xa2\xc8\x26\x5c\xfd\xdc\x54\xb6\x0c\x63\x7b\x34\x93\xc6\x2d\x6e" - "\x8a\x7e\xe7\x62\x83\xc4\x01\xd1\xda\x7c\x11\x6d\xbc\x02\xae\x26" - "\x09\xd7\xb8\x45\xfd\xd7\xb7\x39\x9a\xd6\x77\x38\x5c\x09\xa6\x04" - "\x5b\xa4\x45\xff\x87\xe6\xeb\x70\x0d\xc1\xf4\xfa\x61\xda\x7c\xd4" - "\x70\x6b\xdc\x80\xb8\x75\x83\xf4\x19\x51\xb7\x86\xfa\x82\x3d\x85" - "\xea\x17\xfe\xb0\x34\xde\xa7\xde\x4b\x73\x2a\x2e\xe0\x61\x85\xa9" - "\x3a\x1e\x43\x7b\xe6\xd0\x7c\xa2\xb1\xd2\x71\x07\xc9\xca\x64\xdb" - "\xaf\x4f\xd2\xc7\x83\xda\x1d\x8e\x13\xd0\x26\xa1\xef\x15\xea\xf3" - "\xf5\x4f\x22\x5f\x1c\xe1\xb6\x10\x7d\x75\x7d\x4e\xff\xbe\x5f\x9f" - "\x4e\x7d\xa7\x39\x61\x5f\x41\xf2\x32\xb9\x97\x79\x94\xe8\x13\xfd" - "\xf1\x55\xf4\x5f\x84\x5e\x86\x46\x8f\x11\xbe\xb7\xff\x52\xa6\xa7" - "\xfd\x0d\xe9\x85\x6c\x5e\xdb\x0f\x53\x69\xff\x43\x5c\x83\x06\x83" - "\x13\x48\x5f\x4f\xf7\xb8\xc9\x96\xcf\x75\x27\x24\x2f\x08\x1c\x7d" - "\x80\x7c\x67\x20\x5d\x45\x13\xf8\x80\x40\x24\x63\xd5\x1a\xbd\x49" - "\x78\x82\xaf\xcc\xb8\x6e\x65\x07\x1b\x66\xff\x3e\xff\xf2\xb4\x12" - "\xff\x6f\x58\x47\x7e\xb2\x97\x89\xb2\xad\xa7\x95\x1b\xb2\x51\x6f" - "\xbc\xf6\xb4\xe0\x39\x1b\xcf\x1b\xf1\xbc\x17\xcf\x9b\xf0\x1c\x83" - "\xf4\xaa\x96\x3e\x05\xe1\x21\x88\xbf\x47\x7b\xa2\x8d\xf1\x74\x9e" - "\x4d\xeb\xb1\x15\xe3\x87\xf8\x51\xc7\x29\x8c\xe7\xfb\x5a\xbf\x1b" - "\xe5\xda\x8e\x7f\x0d\xe5\x38\x28\x1d\xed\x6b\x88\xb3\x23\xcd\x7a" - "\x2a\x9b\xec\x2a\xe0\xfd\xa1\x30\xfa\x14\xe5\x8c\x5c\x8c\xe7\x64" - "\x3c\xef\xc2\x33\x1f\xf9\xc9\x9e\x67\x3a\x60\xd0\x1c\xc2\x17\x31" - "\x33\xb3\x1c\x72\x3c\x31\x86\xf5\xb4\xde\x75\x7c\x40\xf3\xa9\x5f" - "\xba\xb9\x32\x9d\xe4\x5f\x47\x26\xea\x63\x17\x10\x63\x67\x6a\x0d" - "\x60\xec\x50\xfe\x43\x94\x1f\xcf\x69\xda\x33\x55\x7b\xce\xd0\x9e" - "\x3f\xd4\x9e\xd3\xb5\xe7\x4c\x8f\x12\xef\xd3\x68\x13\xc0\x2c\x5e" - "\xc8\xc9\xb1\x76\xb5\x7a\x47\x25\x11\x7f\x0d\xfc\x7f\x2f\xf9\x71" - "\x44\xbd\xd5\xba\xdc\x9a\x64\x3f\xbd\xe5\xc3\xae\xdb\x26\x64\x3f" - "\x23\xf7\x87\xe1\x42\x6b\xb4\x92\xca\x40\x3b\x45\x56\x1b\x40\x37" - "\xc8\x72\xa2\x0d\xda\x79\x3d\xf9\x83\x21\xbf\x9a\x64\xa7\x50\xf0" - "\x51\xb1\xc7\xe9\x5e\xd0\x09\x21\xd3\xdf\x48\x36\x8a\xb2\x13\xf1" - "\x4b\x01\x4f\x31\x59\xc7\xf7\xc4\x2f\x49\x3e\x7f\xe8\x5f\xbb\xcb" - "\x47\x59\x43\x7c\xfe\xc8\x66\x79\xb6\x79\xc3\x73\x88\x0f\xe3\xff" - "\x47\xae\xa3\x36\x03\xd6\xad\xe8\xcf\xe4\x36\x65\x54\x26\x9e\x77" - "\xb7\xcb\x3e\xa7\xe8\x7d\xd6\xc6\xca\xae\xc3\xbc\x5d\x89\x0f\x00" - "\x1f\xe6\xd1\xfc\x6e\xeb\xc3\xcb\xf1\x01\x7a\x6a\xf3\x07\xe3\x1c" - "\xff\x3a\x8d\x77\x18\x3e\x49\x0d\xe1\xe9\x51\x07\xfa\x8f\x4b\xcc" - "\x81\x80\xa4\x17\x5a\xb1\x2e\x69\x0e\xac\xbd\x62\x5d\xa6\xd3\xba" - "\xd4\xf2\xfa\xfb\xe3\xf8\xeb\xd3\x09\xc7\x6b\x6d\xc4\xbc\x8d\xcf" - "\xa2\xb1\xf1\x28\xa3\x5a\xb5\x3d\xa9\x15\x7b\xe4\xbd\x88\x9f\x25" - "\xdb\x29\xe3\xb5\xba\x30\xff\xe2\xa7\xd3\xfc\xd7\xe3\xb5\xf9\x4d" - "\xe5\x4c\xa5\xb1\xd6\xe3\xb5\xf2\x31\x4f\xe3\x27\xd3\xfa\xd1\xe3" - "\xe5\x9c\x8c\x5d\x47\xf8\x86\xf2\x06\x84\x2e\x23\xf8\xef\x5f\xd6" - "\xa3\xdd\x37\xd4\x81\xbe\xa8\xa1\xf5\xbc\xa6\x80\x45\xaf\xdc\xca" - "\x46\xc8\xb5\x79\xc3\x71\x3d\xaf\x90\xe9\x97\xdf\xd0\xa8\xe3\xa8" - "\x0d\x02\x9f\xc5\xa5\xf6\xc7\x95\xa3\x73\x79\x99\x29\x10\x30\x67" - "\x27\x1c\x0b\x4c\x16\x38\x17\xeb\xbe\xba\xbb\xdc\x62\xf4\xb0\xbd" - "\x66\x6d\x2f\x69\x14\xb4\x9a\x62\xb9\xef\x58\x8d\xc4\x5d\xb2\x6c" - "\x4b\x1f\xfe\x0b\xa3\x43\x04\xae\xa7\xba\xa8\x2c\xec\x2b\x66\x5f" - "\x71\xc6\x75\x12\x7f\x5b\x32\x3c\xec\x96\x78\x1d\xb7\xd2\xfe\x64" - "\x52\x98\xbd\xf2\x97\x72\x7f\x52\x49\x06\x66\xf7\x09\xfb\x74\x4d" - "\xf6\x4e\x46\xfb\x26\xd9\xff\xb6\xad\x1a\x4e\x36\xab\x32\xd0\xd6" - "\xd9\xa0\xcf\x76\x69\x67\x33\xe0\x73\x6f\x0c\x12\x2f\xab\xc1\x15" - "\xeb\xe9\xc6\x93\xda\xb8\x9c\x40\x7b\x76\x11\x6e\x5f\xb3\x42\xfa" - "\x54\x22\x79\x90\xf0\xf1\x45\x34\xab\x85\xfb\x85\x2f\x83\x72\x4b" - "\x47\x98\x8c\xab\x46\xae\x93\x1b\x8e\x09\x1f\x15\xce\xec\x04\x29" - "\x4f\xbc\x71\xb9\x8c\xbf\x31\x43\xea\x21\x08\x3b\xa3\x14\x9e\x1e" - "\x61\x19\xf5\x37\x21\x7f\x8d\x1c\x76\x9b\xa4\x47\x6e\x9c\x12\xa6" - "\xf3\x23\x60\x2d\xec\x1c\x97\xdf\x98\x1e\x5a\x17\x37\x26\x52\x1e" - "\xe4\x3d\x83\xf8\x1c\x3d\x5e\xee\x35\x31\x53\x35\x99\x99\xf5\xba" - "\xd2\x54\x06\xdc\x1c\xb9\xad\x4c\x5f\xbf\x37\x36\xc8\xfa\xe5\xfa" - "\xa5\x3e\xd2\x7c\xa0\x35\x1c\x10\x76\xc5\x8e\x0b\x5d\x6f\xbc\x27" - "\x06\xf4\xb5\x2b\xe9\x3b\x71\xe7\x4c\xae\xdb\x1b\x5b\xc3\xda\xe1" - "\xd4\xe6\xea\x89\xae\xf9\x96\x68\x7c\xf3\x79\x94\x28\x79\x96\xa5" - "\x58\x24\x8f\xb1\x71\x76\xa6\x7a\x89\xfb\x49\x36\x4d\xf2\x04\x92" - "\xd9\x68\xfa\xaa\x74\x56\xe2\x23\x5b\x69\x4e\xac\x87\x90\x7d\x34" - "\x33\xd3\xed\xa3\x75\x97\x8f\x9e\x1e\x92\x1d\x5b\x76\x69\xfd\x4a" - "\x40\x7d\xd5\xae\xa2\x23\x34\x97\x36\xcb\x35\x66\xa9\xa2\x79\xec" - "\xc6\xdc\xc3\xfe\xb3\xf5\x68\xa1\xc8\x5b\xa2\xcf\x3d\xac\xd1\xac" - "\xd3\xca\x4d\xb1\x55\xa3\xf8\x56\x8c\x29\xe9\xed\x2f\xc2\x3c\x08" - "\xe2\x99\x25\x9f\x8a\x99\x9e\xda\x9c\xdf\x8a\xbc\x58\xff\xe3\xea" - "\xf4\x31\xf0\xc5\x1e\x6e\x16\x73\xac\x88\xf4\x1b\x53\xc4\x59\x3f" - "\xcd\x31\x9a\x5f\xe2\xcc\x1f\x73\xcd\x54\xfa\x23\x46\xf3\x4c\xd8" - "\x4c\x41\x98\xda\x4b\xf3\xac\xbb\xfc\xa6\x28\xdd\xe6\xb1\x47\x19" - "\x2d\xcf\xdb\xca\x6f\x4a\xd0\x75\xc3\x69\x1e\xe6\x8f\x63\x23\x51" - "\xbe\xb5\xde\xea\x23\xd9\xf9\x17\xee\xc0\x0c\x46\x69\x09\x76\x12" - "\x5f\xde\x50\x8f\x3c\x61\xe3\x1f\x23\x74\x59\x8f\xce\x15\xf2\xcc" - "\xeb\xf1\x6d\x51\x7f\x9c\x33\xcc\x2f\xe8\x4a\x60\xc7\x5b\xe3\x19" - "\x9d\xd3\x63\xaf\xb9\xc9\xa9\xd3\xc3\x93\x10\x87\x34\xd4\x3e\xe2" - "\xc1\x9b\xf1\xee\xa4\x7d\x7a\x10\xb9\xf3\x64\x92\x15\x11\xce\x20" - "\xd9\x13\xc9\xc1\x00\xeb\x96\xd3\xca\xd8\xd8\x63\x64\xbf\x68\xe9" - "\xb7\xed\x5e\x17\x39\xf8\x45\xb2\xa7\x65\xcd\x63\xd7\xb7\x29\x37" - "\xfb\x48\xee\x54\xfc\x0d\xc9\x78\x12\x2c\xfd\x65\x3c\x09\x39\xda" - "\xaf\x10\x3f\x4f\xe8\x37\xc6\xae\xbd\x77\x5e\xfd\x37\xa6\x42\xa6" - "\x1d\x53\x85\x5f\x8d\x84\x95\x05\x6b\x25\xa1\x50\x87\x15\xe1\x14" - "\xc2\xb1\xa4\x67\x43\xeb\x5c\x09\x30\x3a\xa7\xc6\x38\xa1\xdd\x6b" - "\xee\x78\xdc\x55\x40\x3c\x6d\x82\xf0\x5d\x40\xf6\x8b\xaf\x49\xd7" - "\x4b\x49\x10\xe3\x29\xec\xcb\x2a\x09\x76\xd4\x1d\xbf\xe1\x1c\x33" - "\xda\xf3\xd8\x18\x92\xa1\x9b\x82\xdc\x45\x3c\x30\xcd\x09\xc0\xa0" - "\xf9\x8c\x32\xe6\xb9\xfc\xd5\xcc\x80\xef\x63\xf1\x9e\xa9\xd3\x52" - "\xc8\x63\x8e\xf0\xb3\x78\xa2\xa1\xa6\xad\x66\x63\xbb\xcb\xc7\x4c" - "\xd5\xc7\x8a\xe8\x0c\x92\xe3\xf5\xf9\xbb\x52\x12\x84\x2e\x00\xd9" - "\xf2\xf7\x10\xdc\x74\x5c\x75\x8e\x64\xd7\x63\x92\x22\x7c\xcc\x2c" - "\xf7\xa1\x31\x25\x18\xd7\x54\x39\x5f\xc6\x4c\xc7\xdc\x6f\x09\x6b" - "\xe7\x0f\xc2\xde\xcb\x29\xbf\xc9\x47\x34\xdc\x60\xf0\x19\x73\x4c" - "\x87\xcf\x06\x61\x03\x94\xd9\xc5\x78\x07\x78\x27\xda\xd6\x68\x2f" - "\x60\x51\x67\x94\x9b\xdf\x46\x1f\x89\x06\x68\x90\x32\xfe\x9b\xdf" - "\xd0\xf9\x74\xd9\xee\x9b\x57\x9b\x4a\x23\x18\xc9\xe6\xc9\x66\xa4" - "\xd0\xc5\x3c\x6f\x11\xf2\x78\x77\x60\x2a\x73\x15\xdd\x4f\x69\x1e" - "\xd1\xf6\xb2\x13\x5d\xc5\x16\x76\xd4\x32\x15\xeb\xf8\xe6\x99\x58" - "\x2b\x9e\x6b\xd6\x79\x55\x6e\x9e\xa9\xc1\xb7\x51\xe8\x8a\x28\x37" - "\xdf\x48\x7b\x09\xc9\x06\xb0\x8f\x10\x8d\x16\x87\xb2\x77\xe9\xeb" - "\x06\xfb\x44\x3d\xf2\x58\x24\x8e\x79\xd4\x83\xf7\x78\xb2\x5b\x23" - "\xf8\x07\x99\x3e\x5a\x9e\x1b\xdc\xdc\xda\x47\x6f\x23\x1d\xe5\x13" - "\x3a\x84\xca\x98\x4e\x5b\x90\x64\x09\x63\x3a\xa9\x6f\xda\x5c\xc4" - "\x7e\x35\x36\x2a\xb4\x6e\xc7\x4c\x17\xeb\xb6\x33\x7c\x5d\x8e\x4d" - "\x0a\xf1\xa9\x37\x9d\x98\x50\xc5\x06\xb4\x99\x60\x8f\xa1\xbd\x6a" - "\xec\x4b\x1b\x36\xf0\x1a\xa7\x41\x7d\x78\x4d\x25\x8b\x56\xd6\x01" - "\x6c\xb4\xce\x56\x64\x8e\xc4\x7a\x7c\xcd\x14\x7d\x43\xfa\xb4\xfc" - "\xa1\xbc\xc8\xc2\x0c\xeb\x2f\x0c\x8d\x1a\xe7\xbf\xa1\x86\x47\xdc" - "\xf1\xf8\xec\x7c\x3a\xfb\x76\xb2\xaf\x16\xb1\x88\x69\xc0\x72\xb7" - "\x46\x33\xbb\x47\x19\xb7\x9f\xee\xb9\x1f\x8d\x26\x5a\x64\xdc\x7e" - "\x2a\xb3\xb0\x9a\x45\x15\xb6\xf3\x8e\x75\x0b\x86\x44\x61\xff\x35" - "\x63\xdf\xa8\xb8\x2e\xfa\x86\x9a\x5e\x94\x71\x38\x53\xe4\xab\x1d" - "\xbc\x6d\xd6\x7b\x07\x6e\x9b\x7d\xd4\x69\xc5\x3a\xe3\xda\xda\x76" - "\x8b\x2f\xd4\xb6\x5b\x7c\xff\x0b\x6d\xfb\x4b\x58\xdb\xcc\xa1\xb6" - "\xe5\x50\xdb\x4e\x5e\x5b\xdb\x12\x27\x87\xda\x96\x38\xf9\x9f\x6c" - "\xdb\x9e\xc1\xdb\x36\x6e\xf1\xc0\x6d\x73\xdc\x70\x5a\x19\xb7\xfa" - "\xda\xda\x36\x3e\x3f\xd4\xb6\xf1\xf9\xff\x93\xb6\x15\x55\xf3\x53" - "\x4d\x09\x8c\xec\x69\x46\x13\x9e\x3f\xad\xdc\x52\xba\x3a\x41\xe8" - "\x71\xc7\xe1\xfd\xde\xe2\x6a\xfe\xa5\xa4\x6d\xc6\x5d\x96\x7b\xda" - "\x38\x2f\xe6\xaf\xd4\x2b\x51\x6e\xf1\x08\x3d\x97\x88\xd1\xbb\x79" - "\x19\x0f\x4c\xf4\x91\xce\x60\x80\x6c\xbb\x90\x2d\xf8\x8c\x7d\x97" - "\xfc\x06\x1e\x97\x9d\xb3\xf3\x82\x91\xed\xbb\xe4\x35\x74\x97\xdf" - "\x92\xac\xdb\x73\xd5\xf3\x9a\xb6\x5e\x0d\x1f\xdd\x32\x6f\x5a\x0e" - "\x33\x11\x3e\xa2\x27\xf9\xd3\xdc\x50\x34\x34\x6a\xda\x37\xb4\xef" - "\xdf\xe2\xd0\xef\xeb\xea\x65\xa5\x75\x0c\xe5\xa6\x42\x16\x41\x77" - "\x86\x85\xed\x47\x8b\x97\x25\x16\xb2\x21\x69\x0e\x94\xef\x67\x99" - "\x26\x07\xca\x06\x3c\x24\x2d\x7f\xcb\xdb\x11\x8b\x58\x74\x15\xca" - "\xa6\xe7\x34\x4b\x31\x5f\xf3\x12\x33\xd2\xdd\x62\xba\x23\x2c\xef" - "\x07\x47\x46\xa1\x1e\x8f\x5e\xcf\x3f\x80\x5f\x8c\x84\xdf\xad\x87" - "\x43\xf0\xbb\x75\x79\x08\x7e\xb7\xde\x27\xe1\x77\x6b\x4a\x08\x7e" - "\x89\xd6\x6b\x83\xdf\xad\x8b\x42\xf0\x93\x79\xaf\x0e\xbf\x5b\x5f" - "\x19\x1c\x7e\xb7\xd6\x85\xe0\x27\xcb\x1a\x04\x7e\x91\x03\xc3\xef" - "\xd6\xe0\x3f\x07\xbf\x44\xeb\x3f\x09\xbf\x11\x12\x7e\xe3\x95\x10" - "\xfc\x12\xdf\x0c\xc1\x2f\x71\x95\x84\x5f\xa2\x3d\x04\xbf\xf1\x99" - "\xd7\x06\xbf\xc4\x3d\x21\xf8\xc9\xbc\x57\x87\x5f\xe2\xc9\xc1\xe1" - "\x97\xe8\x0f\xc1\x4f\x96\x75\x6d\xf0\x1b\xff\x00\xe0\x66\xd6\xe0" - "\x67\x1e\x1c\x7e\xe3\x33\xff\x49\xf8\x99\x24\xfc\x6e\x7b\x28\x04" - "\xbf\xf1\x17\x43\xf0\x1b\xff\x96\x84\xdf\xf8\xda\x10\xfc\x6e\xab" - "\xb9\x36\xf8\x8d\xef\x0c\xc1\x4f\xe6\xbd\x3a\xfc\x6e\x1b\x37\x38" - "\xfc\x6e\x9b\x12\x82\x9f\x2c\x6b\x10\xf8\x0d\x1d\x18\x7e\xb7\xad" - "\xfe\xe7\xe0\x77\x5b\xcd\xd5\xe0\x77\x6d\xb4\xc6\x6d\x83\xde\x7f" - "\xbf\xc6\x72\x02\x83\x95\x43\x30\x24\xfd\x44\xb5\xfc\xb6\xc0\x0e" - "\x35\x32\x4a\xde\xe1\xb8\x6d\x3f\x78\x98\x07\xdb\x94\xef\x3c\xb2" - "\x43\x1d\x12\xc5\xcb\xbe\x3c\xa1\x96\x9d\x5a\xcb\x4b\x23\x8d\x6a" - "\xe9\x50\x23\xd9\x33\x18\xd4\xe7\xba\xf2\x9d\xd7\x22\x6e\x64\x37" - "\xd3\x7d\xbd\x35\xa0\xd7\xe8\xbd\xbb\xfc\x3b\xfb\x41\x8b\xa4\x5e" - "\x09\x93\xac\xdc\x65\xc2\xd9\x67\x5e\x76\xd6\xf2\x25\x59\xf3\x96" - "\xe4\x5b\xe7\xcd\x7f\x76\x59\x7f\x1b\xfa\xc2\x4f\xe6\x5a\x1a\xbf" - "\xef\xf8\xfb\x6c\xcc\x94\x71\x07\xd9\xea\xb3\xdf\x42\xba\x69\x49" - "\x53\x84\x5f\x83\xb8\xec\x16\xde\x9b\xf1\x72\xea\xad\xfc\x90\xb0" - "\x41\xd8\x9b\xf3\x32\xf8\xa9\x42\xb2\x2b\xa3\x9d\x4d\x14\x9e\x56" - "\xee\xf8\x31\x8f\x5d\x98\x41\x3a\x1d\xe2\x6e\x87\x92\xa4\xdf\xc1" - "\x6a\xe0\x66\x5b\x8b\xea\x5c\x98\xc1\x37\x2e\x4c\x27\x18\x34\x91" - "\xfd\xb7\x15\x11\x63\xdb\x94\x64\xd2\x01\x68\x41\x59\xad\x5a\x39" - "\xad\xa4\x2f\x9a\x5a\xc0\xbf\xa0\xf2\x34\x5a\x90\xfc\x96\xb8\x24" - "\x3d\x98\x74\xcc\x54\x6a\x8d\xa0\xb4\x64\x87\x91\xec\x13\xea\xbe" - "\xaa\xa8\xdd\x94\x16\xf4\xf8\x83\xc8\xff\x20\xf9\xea\xec\x2b\x43" - "\xb6\xe9\xfa\x33\xca\xed\x46\xd1\x17\xa7\xad\xa4\xeb\xf9\x8c\x97" - "\x85\xbf\x48\x01\xd7\x3b\x2f\xa3\x6e\xe9\xe7\x33\x70\x5e\xf8\xf9" - "\xd4\xf2\x8c\x41\x1e\x81\x4f\xc9\xf6\xaa\x2c\xe3\xce\x93\x7a\xbb" - "\x40\x43\x0f\x47\xf8\xfd\xb0\x3a\xae\x43\xf8\x8d\xb0\xef\xd1\x08" - "\x6f\x06\x1d\x1a\xab\x7d\x1f\x81\xf0\x2a\xa2\x4b\x45\xbf\x2a\x4b" - "\xa4\x4e\xb4\x72\xe7\x5c\xc4\x99\xb5\x34\xb1\x48\xf3\x10\xd1\xba" - "\x5a\x19\x71\x08\x8f\x27\x9e\x51\xfb\x1e\x8f\xf0\x30\x3a\x17\xd0" - "\xbe\x8f\x3c\xa3\xdc\x71\x16\xe1\xef\x68\xdf\x41\xd7\xdf\x21\x6c" - "\x6d\x01\xee\x8d\xd4\x27\xc0\x7e\x0a\xc1\x1d\xb0\x6e\x44\x5c\x21" - "\xf8\xd5\x62\x1a\x47\xea\xa7\xab\xe0\x0c\x6b\x53\xee\xb8\x91\xee" - "\xe5\xc9\xb1\x5a\x98\x21\xed\x03\x19\x32\x10\x6f\xa1\x78\xd2\x2d" - "\x57\x37\x2e\x9c\x42\xef\x80\xe9\x1b\x04\x43\xad\x2e\xf0\x44\x77" - "\xa4\x6a\xe3\x0c\xd8\x91\x0d\x5f\x56\xb2\x53\x1b\x0b\xb4\x6d\x28" - "\xbe\x6f\xd7\xce\x3d\x2a\xd2\x02\xbd\xf2\x7e\x91\x72\x47\xce\xbf" - "\x64\xb3\x02\xf9\x24\xde\xbb\x63\xb7\xee\xc3\x10\x71\xc2\x56\x06" - "\xcd\x4f\x92\xaf\x78\x63\x6d\x39\xc2\x46\x0b\xe6\xa8\x3e\x57\x68" - "\x9e\xf0\xc8\xef\xb8\xa4\xac\xe6\x8e\xbe\xfb\xbf\xc8\x6b\xd5\xfc" - "\x3e\x30\xc9\x27\xdc\xc9\x42\xfa\x45\xb7\x0b\xfc\x10\xf6\x2d\x21" - "\xec\x9b\x6e\x97\x50\xda\x9c\x2a\xbf\x73\x4a\xd8\xb7\xaa\x2b\xbe" - "\xcd\x09\xfb\xb6\xf6\x8a\x32\xed\x61\xdf\xf2\xaf\xc8\xb7\x2e\xec" - "\x5b\xe6\x15\xdf\x76\x87\x7d\x4b\xd7\xbe\x45\x20\xde\xd5\x67\x23" - "\x51\xb9\x3d\x55\x8b\x07\xae\xbf\xb3\x35\x2c\x3e\x45\x8b\xa7\xfa" - "\xbd\x1e\xf6\xc9\x09\x2d\x5e\xcc\x73\xcc\xa3\xdb\x64\x1d\xc9\xd1" - "\x61\x75\x30\x39\x86\xb6\x1c\x39\x7e\x49\x0e\x93\x62\x1d\x4a\x73" - "\xca\x54\x5a\x42\x3e\x84\x9c\xd2\x1e\x98\x5c\x87\xc2\x0f\x35\xf9" - "\xca\x45\xba\xc1\x70\xe3\xc0\x3a\x82\xc9\x25\xfa\x3d\xd6\xa0\xd3" - "\xb6\x48\x75\x2e\x58\x47\x7e\x09\xc9\x6e\x58\x71\x27\xd9\x8e\xd1" - "\x7d\x12\xf6\x30\x77\x7e\x77\x49\x93\x5f\xdc\xb7\xa5\xfb\x10\x31" - "\x64\xf7\xac\x49\xc8\x77\xce\x4a\xbf\x84\x74\xbf\x77\xa3\x6d\xd1" - "\xca\x4e\x96\x60\xff\x3e\x6f\x27\x3e\x4f\xe2\x84\x64\xc2\x27\x26" - "\x0d\xa7\xbd\x24\x74\xbd\x95\x09\x74\x6f\xc1\xe4\xee\x14\x72\xe6" - "\xa8\xd3\xca\x84\x12\xfd\xbb\xec\xef\x84\x12\xc1\x4b\x6b\xf7\x0a" - "\xbb\xcb\x27\x24\xf5\xf9\xcd\x54\x26\xac\xbd\x18\xbb\x7d\x26\xe2" - "\xa6\xf6\xd7\x6f\x9c\xf0\x04\x95\x49\xfd\xf0\x28\xc9\x7e\x2a\x1b" - "\x69\x32\xfb\xf4\x1b\x11\xbf\x32\xc0\x46\xa3\x6d\xa7\xf5\xf2\xf1" - "\x1d\xfc\x7f\xb2\xe0\x2b\xa9\xcc\x8b\x1b\x8f\x3a\x10\x57\xe5\x31" - "\x4e\xda\x2d\xf5\x23\x27\xd4\x78\x58\x5b\xca\x60\xfb\x9f\x90\x49" - "\x9a\x17\xda\xb9\x73\x21\xad\xf9\x1c\x69\x07\x60\xa1\x5d\xf2\xf2" - "\x13\xce\x92\x2f\x32\xf2\xe1\x4d\xe7\x8e\x12\xef\x4c\x14\xfa\x10" - "\x14\x07\xd8\xec\x06\x7e\x96\x76\x35\xaf\x69\x4d\x4e\x10\xfb\x1f" - "\xd9\x6e\xa2\x3b\x17\x74\x87\xa3\xbb\x7c\xe2\xcc\x3e\x5f\x0f\xfa" - "\x7d\x02\x65\xe2\x73\x24\xe3\xdb\xa0\xca\x36\x5e\xd9\x06\x6a\x2f" - "\xca\xea\x1c\x74\x2f\x35\x2f\xcc\x11\x72\xd0\x4d\xd9\x0e\xa9\x4b" - "\x36\xf1\xad\x08\xcb\x4d\x1d\xa8\x6b\x7f\x9f\x8f\x0b\xa4\xa9\x24" - "\x9d\x60\x94\xdf\xd7\xcf\x3c\x51\xc7\x09\x29\xa7\x9f\xe8\x05\x1e" - "\xcb\xd9\xd0\xc3\x8c\x5a\xbc\xb7\x29\xe0\xa7\xbb\xf5\x03\xda\xe0" - "\xa2\x3d\x52\xd8\x6f\xda\xb4\x30\x87\xee\x4f\x4c\xf2\xeb\x6d\x9e" - "\xe4\x25\xbd\x7d\x6a\xb3\x84\xed\xa4\x53\x3a\x1c\xd7\x5f\x40\xd9" - "\x45\x9f\xb2\x76\x65\xd2\x62\xd2\x6f\x11\x30\x29\xd0\x75\xae\x26" - "\x2d\x16\xe9\x7a\xfa\xd2\x08\x79\x07\xe9\xfb\x12\x9c\x76\x90\xdd" - "\x01\x94\x59\x89\xb1\x10\x7e\x6c\x95\x49\x6f\x0a\xf9\x26\xbe\x8b" - "\x7e\x0b\x7d\xb6\x94\x78\x39\x57\x26\xed\xf1\x28\x29\x56\x39\x07" - "\x65\x1c\xf9\x80\x27\x3d\x84\x73\xca\xa4\xf5\xe4\x4b\x16\xf0\x70" - "\x90\xed\xba\x26\x1f\xd6\x8b\xa3\x87\xe6\x82\x83\x7c\x06\x7a\x94" - "\x49\xd2\x97\x95\x99\x60\x3e\xc9\x4e\xf5\x13\x6c\xc9\x8f\x2e\x60" - "\x7a\xa9\xbb\x3c\xa5\x4f\xfe\x41\x3e\x7b\x91\x66\x50\xdb\x8d\x04" - "\xa3\x20\xda\xdc\x04\x7a\xd5\x35\xfa\x53\x6a\xdf\x5f\xd4\xb8\x85" - "\x39\xa4\x3f\x89\x77\x69\xfb\xc2\x29\xc7\x4e\xce\x83\x94\xd7\x22" - "\x2c\x09\xe3\x9a\xe4\x5c\x90\x7e\xcc\x95\x94\x74\x0d\x7e\xc2\xe7" - "\x85\x73\x85\x84\x83\x4c\x7f\x97\x51\xca\x65\x12\xbe\x83\x76\xd5" - "\x84\xe4\x32\x77\x19\x85\x4c\x4d\xd3\xb1\xc6\xb7\x03\x61\x6d\xf6" - "\x89\x7b\x80\x17\x88\xa7\x4e\xc9\xa2\xba\xd6\x93\x6d\x31\x9a\x17" - "\x67\xc2\xe7\x7f\xca\x0c\x6a\x27\xe9\xe6\x05\x63\xb3\x1d\x7c\x63" - "\x76\x21\xc1\x19\x79\x0a\xb1\x16\x72\x06\xf1\x13\x2f\xfc\x54\x75" - "\x97\xdf\x95\x1c\xe6\x7b\x17\xfb\xe0\x5d\x4f\xe9\xfb\x1c\xed\xd1" - "\x64\xe7\xa1\x2f\x6e\xe3\xe7\x53\xb0\xde\x6b\x35\x1a\x67\x40\x99" - "\x87\xb0\x73\x38\x91\xa5\xd0\x5d\x63\xd2\xd3\xa6\xf9\xc6\xcd\x9f" - "\xb5\x92\xed\x64\xb2\x03\xe9\x2a\xb8\x1b\xed\xbd\x7b\xc4\x8b\xa3" - "\xc4\xfd\x46\x9f\x6b\xe2\x05\xd2\xd1\xe9\x3c\x5d\x28\xec\x1b\x45" - "\xa5\x39\x02\x7c\xa7\xf4\xbd\xed\xe5\xb1\x9f\x11\x1d\xd5\x29\x7c" - "\x07\x50\x99\xff\xaa\x1d\x60\xe5\xae\x56\x8d\x96\xe9\xc4\x5e\x7e" - "\x03\xfa\x23\xee\x33\xe2\x7d\xd4\x19\xe5\x9e\x7b\xa5\xbf\x48\x69" - "\xcb\x5e\xd3\x35\x8c\x94\xf7\xf3\xbd\x4c\xdc\x97\x56\xee\x7e\xcd" - "\x7a\x07\x63\x9d\xca\xdd\xaf\x0b\xbb\xd2\x4e\x9b\x4b\x83\x81\x6b" - "\x83\x6c\x97\xc9\xe6\x30\x88\x36\x52\xfb\xae\xad\x6d\x77\xeb\xfb" - "\x65\x64\x77\xf9\xdd\x75\xfa\xbd\x7e\xd1\x7f\xcd\xde\xb4\xeb\x16" - "\xe2\x5b\xee\x19\xaf\xed\x5d\xf5\x5a\xdd\xf5\xff\x0b\x75\x7b\xb5" - "\x32\xb7\x0a\x9b\xdb\x80\x0b\xca\xdd\xda\x5d\x7e\x4f\xaa\xbe\x9f" - "\x6a\x3a\xf2\xc9\x72\x9f\xbf\x27\x23\xb4\x97\x4a\x18\xf6\xbb\xb3" - "\xb3\x74\x69\xbe\x15\x04\xbb\x7d\x5e\xfe\xfc\x1c\x6b\x76\x5e\xde" - "\xd2\x3c\x2b\x19\xbc\xb9\xc2\xaf\x52\x14\x2f\xbf\x67\x91\xe6\xfb" - "\x6d\x77\x9f\xef\xb7\xf2\x7b\xf6\x87\xfb\xe4\xf3\x28\xf7\xd4\xfd" - "\xef\xf0\x35\xf7\x0c\x7a\xcf\xcf\x69\x50\x6b\xf1\xab\xc3\xcf\x85" - "\x5f\x03\xf1\x39\x36\x3f\x4b\xc5\xfe\x28\xce\x84\x43\xf7\xd5\xef" - "\xa1\xbb\x3e\xa9\x6d\xca\xe4\xbb\x76\xa8\x46\x26\xec\x9a\x94\xa9" - "\xa4\x4b\x42\xf6\xd1\xeb\xf0\x73\xe1\xd7\x80\x9f\xc8\xa7\x1e\x11" - "\x77\x6d\x6b\xc3\xbf\xd1\xd9\x34\x2f\x73\x4d\xa5\x34\xbc\xd4\x28" - "\xe8\x10\x75\x93\x4c\x77\x45\x1b\x0c\xbc\x7c\xc2\x7e\x2d\x9d\xc0" - "\x0d\x31\xa5\xcc\x3a\x40\xba\x08\x5e\xfe\x1d\x8f\x96\x4e\xdc\x7d" - "\xd7\xfb\x43\xb6\xfb\x91\x5e\x4f\x67\xe4\xe5\x77\xd9\xb5\x74\xd2" - "\xa6\x59\x99\x61\xa0\x7a\x87\xf0\xb2\x4b\x09\x5a\x3a\x73\x78\x79" - "\x61\x69\x22\xd5\xf2\xb1\xd3\x29\x8d\x5a\x6a\x94\x7e\x58\xca\xef" - "\x69\x41\xfa\x01\x6d\x9e\x5e\xdb\x38\xdd\x5b\x78\xe5\x38\xd9\xe7" - "\xe7\x66\xdf\x9f\xbb\x64\x05\x79\x92\xca\x5f\xba\x3c\x9f\x9e\x4b" - "\xe6\x3d\x2b\x1e\x4b\x6d\x0b\xe6\xcb\x97\xfc\x45\x29\xf4\xb2\x08" - "\xf3\x8d\x9e\x59\xcb\xed\xf4\x98\xbf\x94\x82\x8e\x9c\xe4\xe5\xf3" - "\x75\x97\xde\xfd\xec\x2e\x75\x97\x7f\x37\xd1\xa3\x4c\x8e\x97\xf4" - "\xc8\x77\x53\x3c\xca\x77\xc4\x39\xb0\xa9\xd4\xc3\xde\x49\x12\xbe" - "\xff\xd8\xb7\xec\x15\x28\xdf\x7d\x80\xec\x15\x98\x4a\xed\xf3\x4d" - "\x81\xdc\x6c\xe0\xd9\x56\xe4\x5d\xe4\x61\xbb\xb4\xbb\xe5\xb6\x66" - "\x61\x37\xb4\xfc\xde\x03\xba\x7e\xa1\xea\xb4\xad\x25\x7b\xf8\x42" - "\xdf\x68\x93\xb0\x85\x53\x8b\x70\xe3\x8e\x4d\xc2\x2f\x4d\x3c\xc2" - "\xeb\x10\x6e\x41\xd8\x82\x70\x82\xea\x4c\x37\xd3\xfd\x44\x84\xad" - "\x08\x27\xa2\xfc\x46\x7d\x5d\x84\xc3\x46\x73\x36\x77\xff\x80\xfc" - "\x71\x7f\x1b\x53\x58\x5b\xdf\x33\xeb\xbe\x7c\x85\xdf\xde\xf2\xef" - "\x59\xfb\xfc\xf6\x0a\x5f\x4e\xe6\xb9\x62\x5f\x13\x7b\xfb\xf7\xb6" - "\x47\x58\xc6\xac\x90\x74\xf8\xf7\x66\xea\x36\x19\x24\x9d\xfd\xbd" - "\x8c\x30\x9f\xc7\x14\xce\xe9\xf3\x79\x2c\xed\x92\xbd\x2c\xec\x1e" - "\x29\xdf\xab\xe5\xe5\xdf\x6d\xed\xf3\x4f\x57\xfe\x3d\x67\xb8\x7f" - "\x3a\x0f\xbe\x13\x7f\x83\xf8\xdd\xa1\x7d\xf0\x7b\x53\xa9\xce\x81" - "\xfc\x3b\x83\x3f\x77\xd8\x56\x81\x16\xc7\x53\xd0\xe5\x1a\x0d\x4c" - "\xf1\xbc\x2c\x95\xec\xdb\x58\xe9\x1b\xd1\x7e\x03\xca\x1c\xc8\xbf" - "\xa2\x32\xe5\x21\xb2\xbb\xeb\x2d\xce\x52\x6e\xdd\x41\x3a\x48\x08" - "\x4b\xbb\x91\xfc\x9c\x32\x45\xdc\x63\xd3\x6d\xca\x85\xdf\x89\x1f" - "\xf0\xee\xc1\x47\xfa\x99\xf1\xa2\xa5\xa6\xc0\xbc\x6c\x49\xc7\x4d" - "\x79\x45\xe2\xd2\xec\x6a\xb9\xdf\x4f\x59\xc7\x1f\x97\xfe\x4e\x3c" - "\xca\x7d\x66\xba\x8f\x64\x52\x16\x2d\xe5\xc8\x6b\x72\xcc\xcb\x16" - "\x71\x48\xb7\x06\xb4\x96\xd6\xbe\xe7\xdc\x09\x1d\x8c\x5f\x0a\xca" - "\xbb\xfe\xca\x14\xfb\x2f\xc7\x94\x50\x3d\x51\x82\x8e\xf8\x88\x45" - "\x93\xaf\x40\x6a\xdb\x8e\x30\x9b\x77\x1b\x10\x47\xfa\x58\x5d\x8f" - "\x33\x61\xf7\x57\x6b\x8b\x5d\xf8\x2a\x2b\xbf\x2f\x4a\xb7\x99\xe3" - "\x41\xdc\x95\xfd\x79\xfc\x27\x62\x85\x8c\x9f\x9f\x9c\x3e\x03\x6f" - "\xc9\x9a\x9b\xdb\xf0\xb9\x93\xd0\x15\xf7\x8c\xa7\x6b\xef\xfc\xa1" - "\xc2\x4f\x64\xf9\x7d\x19\x18\xa7\x80\x18\xef\x35\xbf\xf8\x9a\x70" - "\x8b\xf0\x9f\x48\xf7\x0a\x55\x1f\xea\x9d\xfa\x88\xb0\xaf\x6b\x90" - "\xf4\xa2\xb0\x6b\x57\x7e\x5f\x02\x8f\xb3\xd9\xa5\x8f\xd8\x05\x76" - "\x8c\x9f\xd8\xf7\x69\x6d\x88\xfb\x93\x66\xea\xfb\x7d\xb5\xc0\xa9" - "\xd3\xf0\xfb\x99\xf4\x0f\xf3\x8b\xaf\xf5\x72\xc9\x7e\x14\xe6\x56" - "\x2b\x9e\x66\xd4\xdf\xda\xa7\x23\xd4\x77\x27\xf3\xbe\xcb\x64\xdb" - "\xaa\xef\x7e\xae\x32\xf5\x5e\x49\x57\xde\x6f\xf4\xb0\xdb\x9c\x72" - "\x7d\xdf\x8f\xf9\xdf\xa0\xdd\xcd\xba\x1f\xfc\xef\xa3\x99\xfd\xcb" - "\xb8\x3f\x5b\x97\x7d\xc8\xb1\xbb\x3f\x15\x73\x71\x1a\x7e\x3f\x43" - "\xfa\x59\xba\x8f\xec\x35\x06\x71\xb7\xe8\x74\x84\x85\xa5\x20\x3e" - "\x4b\x8f\x1f\xa2\xa4\x02\x36\xf7\xe7\xeb\xf8\xa4\x2b\x2e\x7b\x2d" - "\xc2\x6b\x41\xa7\x07\xb4\xb0\x13\xe1\x2a\x3d\x8c\xf7\x1a\x1d\xdf" - "\x10\x7f\xd6\xf5\x7c\xc6\x4b\xc4\xff\xcd\xb7\x80\x26\xb3\x10\x7f" - "\x75\x3f\xf8\xdf\xf7\x4a\x64\xde\xc3\xce\xae\xb2\x0f\x92\x7d\x71" - "\xc7\x9b\x7d\xc0\xa1\xf8\x76\xc2\xc3\xfe\x6b\xae\x56\x4e\x87\xc7" - "\x78\x57\x45\x68\x3c\x22\x4c\x80\xf1\x3a\xd9\xa7\xa9\x56\xbc\x3b" - "\xc9\x5f\x79\x77\xf9\xff\x31\x7b\x94\xef\xfa\x45\xba\x15\x9d\x35" - "\xeb\x7a\xcc\x73\xdc\xe0\xe0\x5d\x0b\x68\xae\xfc\x1f\x71\x3f\x79" - "\x7d\x81\x59\xd8\x83\x26\x3b\x04\xc2\x3e\x19\xd9\x9c\x0c\xb0\x48" - "\x61\xe7\x7f\xe3\x91\x0a\x61\xdf\x7e\x65\x52\xb4\x6e\x6f\x12\xeb" - "\xd4\xca\x0d\x7b\xf3\xc9\x06\xa5\x90\xa5\x75\x27\xc5\x08\xbb\x93" - "\x9a\xbd\xc9\xed\x2b\x58\x7c\xb5\x2a\xed\x4d\x0a\x1b\x05\x57\xb1" - "\x39\xc9\xcb\xbe\x9a\xac\xdb\x9c\x04\x1c\xe8\xee\x61\x12\xbf\x14" - "\xf0\xe3\x99\x18\x66\xeb\xc6\x38\xa0\xfd\x49\x03\xf0\xa6\x41\xda" - "\x9f\xbc\xb6\xfd\xe6\xff\x74\xca\x79\x32\x35\x59\xf7\xe1\x1d\x16" - "\x97\x8a\xf5\xa2\xd1\x39\xf7\xf9\xb5\xb8\x39\x1e\xf6\x6e\x67\x1f" - "\x6d\x06\x7c\x47\x32\x45\x7c\x2f\xe4\xc5\x39\x2f\x85\xaf\x2b\x26" - "\xfe\x68\xeb\x1e\x82\x7d\x39\x12\xbf\xa1\xf4\x9b\xd9\x87\x3f\x2e" - "\xf1\x56\xe2\x11\x4c\x0a\xf6\x1b\x47\x04\x4f\x0b\x04\x22\x6c\x01" - "\xa5\x85\x68\x4f\xba\x73\x9d\x16\x0c\xd0\xdd\x7f\x63\x5a\xb0\x8b" - "\xfc\x6b\xb6\xd0\x5d\xb2\x0d\x0b\xe8\x6e\xe3\x58\x4e\x7e\x6a\xd2" - "\x82\xe7\xf9\x4e\x79\x67\xb3\x59\xf3\x99\xd9\x18\x5c\xc1\x1b\x30" - "\x0e\xd1\xc4\x77\x90\xfd\xad\x18\xc5\xcf\x62\xec\x11\x87\x1e\xbb" - "\x78\x88\x93\xed\x2d\xf2\x51\xa6\x96\xfb\x81\x2b\xad\x8a\x2d\x10" - "\x51\xe2\x0e\xb4\x0b\x3f\x01\x69\xc1\xa1\x3c\xcd\xf1\x00\x17\xbe" - "\xc5\x56\xf0\x7a\xe0\xd9\x08\xe1\x43\x7b\x15\xef\xc2\x7b\x54\xda" - "\xaa\x2e\x4e\xfe\x3d\x51\x76\x43\x5a\x40\xed\x49\x73\xa8\xc5\x36" - "\x87\x82\x7c\x5f\x22\xdf\x97\x68\x4f\x0a\xca\x34\x23\xfc\x20\xdf" - "\xb9\x80\xee\x40\x95\x08\xde\x07\x7d\x74\x69\xf7\x4a\xeb\xc8\xa7" - "\x27\xd9\x19\xb7\x05\x5c\x25\x3b\xb5\x7b\xa2\xc2\xb7\xac\xa3\x97" - "\x6b\xf5\x4c\x49\x5b\xc5\x1e\xb4\xad\x1a\x2b\xee\x9b\xd2\x5d\xaa" - "\xb4\x80\x15\x75\x96\x10\x3c\xa2\x85\x3f\x6f\x71\x9f\xea\x81\xd6" - "\xab\xf9\xf7\x1c\x90\xdf\xae\xcc\x4d\xe2\x9b\x9f\x69\xe1\x95\x8b" - "\x8c\x7c\x73\xce\x1c\xee\x5c\x40\x7a\x52\x0a\xaf\x5c\xe2\x41\x18" - "\xf1\xcf\x1d\xe0\x9b\x73\xe7\xf0\xca\xfc\xad\x78\x22\xbc\x32\x9f" - "\x6f\x5e\x88\xf0\x23\x99\xc8\xd7\xcc\x2b\x7f\xd4\x8c\x74\xe9\xbc" - "\x72\x56\x2a\x9e\x08\xcf\xae\x45\x3a\x84\xd3\xac\x78\x22\x9c\xee" - "\x3c\xad\x7c\xbf\x1a\x79\x10\x57\x90\x2e\xeb\x5a\x3d\x57\xd4\x55" - "\x59\x92\x23\xeb\x58\x93\x2f\xeb\x28\x2f\x91\x75\xfc\x6a\x9d\xac" - "\xe3\x71\x86\xf4\xad\xbc\xf2\x27\x9d\x48\x97\xc1\x2b\x9f\x68\xc5" - "\x13\xe1\x9f\xd5\x23\x1d\xc2\x4f\x52\x5d\x08\xff\x82\xca\x47\xf8" - "\xa9\x0a\xa4\x3f\xc1\x2b\x6d\x0e\xa4\x9b\xcb\x2b\xe7\x51\xf9\x08" - "\xcf\xcf\x40\x3a\x84\xb3\x67\xe2\x89\xf0\x33\x53\x90\x1e\xe1\x75" - "\xe8\xd3\x33\x1e\x5e\x59\x39\x0b\xe9\x32\x79\xa5\x13\xf5\xe5\x20" - "\xbc\x71\x3f\xd2\x21\xfc\x22\xf2\xe7\x22\xbc\x39\x01\xe9\x11\xde" - "\x82\xbe\x3e\xd3\xce\x2b\xb7\xa2\x9e\x9c\x2c\x5e\xf9\x32\xf5\x19" - "\xe1\x6d\x7e\xa4\x43\x78\x3b\xb5\x07\xe1\x9d\xc8\xb7\x10\xe1\x57" - "\x00\x83\x67\x3a\x78\xe5\x7f\x78\x91\x2e\x87\x57\xfe\xd6\x85\x27" - "\xc2\xaf\x39\x91\x0e\xe1\x3d\x80\x61\x2e\xc2\xfb\x52\x90\x1e\xe1" - "\xdf\x51\x7f\x3b\x79\xe5\xfe\x16\xa4\x5b\xc4\x2b\xff\xb8\x1b\x4f" - "\x84\xff\x54\x88\x74\x08\xbf\x0d\xf8\xe5\x22\xec\x4a\x44\xfa\x45" - "\x03\x8f\xe7\xd1\x6a\x5e\x1a\xc9\x78\xa5\xbb\x96\x97\x0e\xc5\xf3" - "\x2f\x99\xbc\x74\x48\x12\xaf\xfc\xd8\x8c\x78\x3c\x3f\x9a\x85\x70" - "\xb2\x16\xc6\xf3\xaf\x53\x10\x4e\xd1\xc2\x78\xb6\x24\x22\x3c\x59" - "\x0b\xe3\x79\x9c\xc2\x53\x78\xe5\xa7\x78\x46\xe2\x79\x7c\x17\xc2" - "\x53\xb5\x30\x9e\xff\xed\xc5\x33\xc0\x2b\x3f\x39\x81\xf8\x54\x5e" - "\xf9\x37\xaa\x1f\xcf\xd6\xb9\x08\x4f\xc7\xd3\x85\xf0\x74\xef\xf8" - "\x9f\x91\xef\x54\xc6\x47\x4d\x74\xaa\xa3\x16\xa5\x17\x5f\x64\x06" - "\x92\x37\xd7\x16\x79\xc8\x9e\xc3\xd8\x36\x25\x75\x15\xf9\x9b\xa0" - "\x34\xc1\x2d\xcf\x34\xab\xa3\x72\xe8\xfe\x48\x24\xd2\x0d\x3d\xad" - "\x3c\xb4\x9e\xf6\x4c\x77\xa1\x47\xf8\xb9\xd3\x6c\xd5\x45\x22\xcf" - "\x2b\xa0\x11\xa6\x90\xbf\x73\xc0\x29\x9a\x97\x0d\xb9\x80\xe7\x3a" - "\x5e\x76\x5d\x1b\xe0\x84\x70\xec\x47\x78\x22\xfc\xdd\x17\x00\x2f" - "\x84\x7f\xf1\x30\x9e\xeb\xba\xcb\x1f\x62\x1e\xe5\x01\x89\xef\xf7" - "\xce\x07\xee\xe4\xc0\x31\x68\xdb\x2b\x5b\x4a\x4c\x01\x17\xc6\xa0" - "\xc0\x6e\x22\x9b\x6b\xaf\x66\x94\xf0\x51\xdf\xab\x11\xed\x2e\x03" - "\x5f\xdb\x9b\x68\x90\x75\x5f\xc7\xdb\x94\x87\x26\x90\x2c\x94\x8f" - "\x4a\x1b\xec\xfb\x6c\xf1\xfd\x96\x7f\x67\xf2\xbb\x99\x85\xbe\xff" - "\x8c\xbe\x2f\x36\x91\xfc\xfa\xb6\x1f\xa2\x2d\x0f\x55\x51\x1a\x8f" - "\x92\x8a\x7d\x3e\x82\xb9\x7d\x1d\x5a\x1f\x87\x52\xba\xcd\x94\x6f" - "\x30\x99\x8c\x5a\x55\xec\x5f\x5f\xc6\x9b\x89\xff\xc4\x9e\x61\xb0" - "\x16\x25\xd6\xb5\x29\xd3\xb2\xb6\x93\x5c\x21\x7e\xb3\x8b\xee\x05" - "\xb5\x29\x0f\xdf\xde\xbb\x69\x41\x8b\xb5\xc0\x84\xf2\xa6\x65\x17" - "\xfb\xb9\xcf\x55\xf4\x30\xf6\x36\x8a\x7f\xc6\x2c\x75\xcd\x45\x9a" - "\x80\xd4\x0f\x12\xef\x1d\x52\x46\x3a\x2d\x8b\xf2\x86\xd3\xfb\xc1" - "\x17\x22\x30\x86\x9b\x9b\xe5\xf9\xd6\xc3\x13\xde\x56\x3d\x06\x53" - "\x3e\x1b\x62\x2d\x38\x84\xf2\x1f\xce\xef\xc7\x1b\xf6\xa5\x15\xdf" - "\x9e\x3c\x88\xb4\xdb\x84\x1c\xe7\xe1\xb5\xba\x0c\x98\xa3\x0f\xbf" - "\x96\x74\x51\x2a\xed\x63\x92\xbe\x9b\x66\x24\x7b\x98\x81\x78\x87" - "\x27\x50\x35\xb1\x24\x58\xb5\xd9\xc5\xb7\x6c\x6e\x8e\x09\x28\x4c" - "\xea\xe9\x4f\xbb\x6f\x92\x9f\xe4\x6b\x1f\x50\xff\xbe\x51\x87\x8f" - "\x98\x33\xd1\xc1\x0c\xae\xbc\x4f\x29\xef\x5d\xfc\x05\xcb\x4c\x77" - "\x67\x2b\x73\xe5\x89\xb2\x52\xf8\x0b\x13\x4f\xa8\xc3\x6f\x9d\xb3" - "\x83\xe8\x52\x07\xc9\x85\x3e\xa2\x7c\x6f\x02\xce\xa0\xff\xa7\x99" - "\xf5\xb6\x90\x5f\x80\xf5\x80\x1d\xd1\x8c\x74\xaf\xda\x16\x0c\x92" - "\x0d\xa8\x0a\x0f\xe0\x20\x65\x8b\x0f\xfb\x08\x47\xcb\x7a\xa7\x3d" - "\xa2\xc6\x2d\x70\x35\xcd\xa5\x33\x54\x33\xd9\xd4\xf1\x89\x7b\x98" - "\x01\xf2\xe5\x47\x7b\xa3\x4c\x1b\x3e\x76\xb9\xda\xfd\xd3\xdc\x25" - "\xf9\x79\xcf\x59\x97\xe5\x16\x64\x3f\x30\x7e\x79\xb2\x35\xcf\x61" - "\xcd\x13\xfe\xb0\x45\x44\x56\xb2\x75\xd9\xa2\xa5\xf9\xd6\xfc\x55" - "\xf6\xec\x6f\xfb\x06\xb6\x70\xf3\x82\x6a\x49\xcb\x3d\x22\xec\xc4" - "\xf0\x9a\x2d\x8e\xfc\x42\xae\x5a\x6f\x19\x0a\x5a\x7d\xba\xf1\x72" - "\xe4\x34\x3b\xdd\x49\x57\xcb\xac\x4c\xf3\xd9\x1d\xfd\x52\x1c\xa3" - "\xfb\x1e\x51\xe8\x6b\x20\x74\x2e\xf2\xc8\x74\x29\xb7\x98\x0e\xfa" - "\xe7\x21\xd1\xff\x2a\xdd\x4e\x97\xf6\x4d\x9e\x2b\x4c\x4f\xf1\xb0" - "\x57\xa5\xed\xb9\x9a\xcd\xad\x92\x06\x9c\x2e\xce\x2a\xb8\x75\x8b" - "\x83\xef\xca\x28\x01\xfd\xa3\x90\x3c\x48\xf8\xd0\x65\x17\xc4\x9d" - "\x54\xbe\x79\x95\x97\xee\x83\x07\xb7\x3c\x6b\x57\x47\xad\xf2\xaa" - "\xbf\x7d\x32\xb5\xf8\x15\x66\xd8\x87\x35\x6f\xb4\x62\x7e\xdf\xc2" - "\xc6\x1e\x2a\xea\x30\xa0\xcd\xcf\x1d\x2a\x6a\x35\xf0\xaa\x45\x33" - "\xbb\x12\x7f\x9e\xe9\x2f\x13\xf6\x3c\x51\x86\x9f\xbd\x37\x9d\x11" - "\x2f\x53\xe7\x1b\x59\x56\xe1\x1b\xf9\x6c\x86\x7f\xf3\x0b\x5e\xd7" - "\x2d\x77\xb3\x19\xb7\xf3\xf3\xef\xd6\x93\xcc\xe9\x91\xe4\x77\xa7" - "\x93\xcc\x6f\x41\x95\xdf\xbc\x60\xab\x6f\xcb\x2a\x3b\xd9\xb9\xb9" - "\xbc\xe5\xd7\xa9\x3d\xa3\x16\x37\x1f\x45\x9a\x0f\x40\xeb\x7f\x68" - "\xc5\xfc\x1d\xc7\x0c\x97\x6f\xfb\x59\xf3\xbe\x1e\xa7\xa1\xa1\x7e" - "\xaa\x94\x53\x66\x62\xcd\x88\xf9\x34\x63\xe4\xbb\xfb\xeb\x19\xea" - "\x66\xfb\x7a\x66\x1a\xde\x9b\xf2\xad\xef\xf7\xbe\x9b\x52\xcf\xba" - "\xc9\xc6\x2a\x78\xaa\x83\x9f\x6e\x65\x7c\x4b\x49\xed\xeb\x05\x7e" - "\xc3\x5c\x0f\x33\x1c\x6b\xdd\xca\x0a\x4f\xb1\x11\x81\xf3\x49\xc6" - "\xff\x42\xfe\xcb\x64\xbb\xf0\x43\x8b\xb0\x61\x56\xe4\x12\x3e\x61" - "\x4d\x4d\xa0\x27\xd4\xf3\x49\x91\x4d\x73\x5c\x0c\xdf\x47\x07\x1e" - "\xb5\xb0\x63\x39\x5e\xe6\xce\xa8\x61\x97\x0d\xa9\xec\xad\x9f\xd7" - "\xb0\x6d\xa0\xe7\xb7\x9d\x63\xd1\xf2\xfc\x35\x29\x32\xd0\x9b\x64" - "\x0c\x3c\x9f\x44\x36\x65\x38\x3f\x9f\x34\x9c\x68\xc8\xc0\xd2\xa4" - "\xa8\x26\x6f\x0d\x9b\xd4\xc1\x92\x2e\x1b\x98\xe9\xf2\xf3\x49\xc3" - "\x9b\xec\x5b\x51\x16\x88\x43\xc0\x95\xec\x59\x91\x9d\x2b\x82\xd3" - "\x75\x19\x6c\x4e\xa7\x32\xfd\xec\xf0\x16\x36\x92\xec\x29\x92\x3d" - "\x34\xb2\xe9\xaa\xc6\x97\xd4\x06\xe3\x57\xd9\x8b\x2e\x92\xfd\x0f" - "\x3f\xe3\x7b\x9f\xf6\x58\xa5\xcf\x70\x85\xfa\xac\xf2\xa4\xe1\x36" - "\x7a\x6e\xb2\x8d\x26\xda\x56\xed\xb6\x90\xaf\xa3\x28\x6a\x27\xd6" - "\x69\xd4\xea\x93\x80\x65\x71\x92\x11\xe9\xa2\x11\x1f\xe3\xee\xf4" - "\xb3\xe0\x84\xa7\xbd\x13\xed\xc2\xa7\x6d\xfc\x8e\x22\x66\x76\x16" - "\xb1\x78\xeb\x77\xc5\x5c\x1a\x11\x7c\xfd\x69\x0f\x2f\xff\x69\x3b" - "\x2f\x35\x26\xc8\xb8\x1f\x9e\xb5\xfe\x80\x31\xeb\xdd\xe2\x7d\xb3" - "\xf5\x7e\x8c\x61\x7c\x89\x59\xd0\xdd\x82\x47\xfb\xe1\xaf\xe4\x1c" - "\xff\x61\xe9\xe5\xc8\x57\x92\xd4\xf2\x96\xe9\x6a\xa9\xd1\x4a\xbe" - "\xaf\xcf\x29\x3f\xcc\xe6\x95\xa7\x33\x79\xd5\x0b\x62\x2e\x22\x3c" - "\xef\x72\xe4\xe3\xeb\x10\x57\x8f\xf2\x53\x2f\x2b\xc6\x56\xfc\x4e" - "\x68\xf9\x33\xa8\xdf\xc1\x5d\x19\x19\xd4\x6f\xe1\x1f\x07\xfd\xb2" - "\x61\xcc\xf8\xa8\x62\x97\xb0\x19\xdf\x0b\xf8\x6a\xfe\x43\x09\x1e" - "\x04\x03\xb5\x37\x69\xb8\xe8\x6b\x6f\x52\x34\xe0\x4b\xb6\x53\x4d" - "\x45\xf3\x90\x67\x4b\x71\x0b\xbe\xc5\x5c\x8e\x2f\x89\x22\x3f\x55" - "\x6e\xbb\x97\x05\x37\x17\x37\x93\x6d\xb0\x97\x0a\xb0\xe6\x46\x16" - "\x63\x8f\x2f\x3e\xa1\xad\x2d\x46\xed\x54\x2b\xbf\x32\x5f\x26\xdd" - "\x7e\xb4\x0d\xed\x6b\xc5\x0f\xdf\x7f\x70\xe2\xf2\xf8\x8c\x1c\x3c" - "\x6b\xd1\x56\x2b\x2f\x5f\x1a\x4f\xef\xf8\x66\x45\x9b\xdf\x21\x38" - "\x10\x3c\x34\x58\xbc\x1d\x82\xc5\xb6\x74\xa4\xdb\xa3\x96\x37\x75" - "\x78\x94\x1f\xae\xe3\xe5\xa0\x97\x42\xe9\x4e\x85\xd2\xfd\xd6\x27" - "\xd3\x1d\xdf\x2a\xd3\xe5\xcf\x3a\xad\xcc\x2c\x95\xf0\x9e\x79\xfb" - "\xb7\xe1\x3d\x73\x5c\x28\xef\x86\x6a\x99\xb7\x3e\x49\xe6\xb5\x51" - "\xde\x27\xfb\xb7\x69\xe6\x8f\x43\xe9\x7f\xd5\x2c\xd3\x1f\x6c\x95" - "\xe9\x7f\x6e\x09\x4b\xb7\x2a\x94\x6e\xf3\x5c\x99\xee\x7d\xbb\x4c" - "\x97\xe5\xc0\xf7\x37\x07\x68\xcb\xeb\xa1\x3c\xbf\xf3\xc8\x3c\xed" - "\xeb\x64\x9e\x62\xec\x49\x33\x4f\x5d\xd1\x96\xcf\x42\xe9\xf7\x68" - "\xfd\xfe\x22\x41\xa6\x5f\xb5\x3f\x94\xee\x11\xed\x3e\x12\x7d\xff" - "\x1a\xe9\x7e\x58\x72\x39\xb2\xae\x5e\xa6\x5b\x3b\x87\xe6\x23\xd2" - "\x8c\x57\xcb\x33\xf2\x2f\x47\x3e\x91\x89\x72\xf2\x31\x36\x09\xf4" - "\xc4\xd8\x25\xa8\xce\x05\xe0\x51\x67\x74\xd2\x39\x04\xe1\x5c\xec" - "\x09\x8d\xc0\xbb\xc1\x81\xcf\x38\x1f\xc9\xea\x93\x7b\xa9\xa0\x0d" - "\x36\x3f\x53\x33\x20\xbd\xb6\xe9\x97\xeb\x48\x37\x81\x70\x0a\xea" - "\xfe\x98\x6c\xc6\xf1\xe2\x99\x9a\xac\xe9\x11\x71\xaf\x8d\x6c\x36" - "\x90\x3c\x52\x8b\x13\xfa\xe5\x2a\xe6\x26\x78\xc3\x3a\xb2\xd3\x47" - "\xf2\x47\xec\x51\x0d\x98\x73\x1d\xc0\x13\x43\x5e\x34\xa8\xb5\xf8" - "\xd5\xe1\xe7\x7a\x91\xe4\x92\x65\x6c\x86\x2e\xb3\x1d\xb8\xad\x3f" - "\xc2\xfe\xf7\xdb\xc6\x90\xdc\xea\x47\x56\x94\x75\xed\xfe\x5d\x94" - "\x1f\x59\xaf\x72\x7e\x64\x14\xf6\xd4\xb7\x3c\xe3\x75\xaa\xd2\xbf" - "\x3c\xd6\x22\x68\xb8\x1f\x2d\xc7\x9e\x5f\x22\x6c\xc1\x56\x15\xd8" - "\xd5\x44\xec\x25\x67\x59\x84\xbb\xb0\x83\xd5\xaa\x1d\x06\x67\x0f" - "\x33\x36\x61\x3f\xa5\xf4\xb5\xa0\x1d\xac\x4b\x22\x40\x47\xfc\x68" - "\xbd\xf3\x92\x56\x5e\xcd\x96\x92\xe2\xc5\xd2\x8f\x36\xd1\x8f\xb4" - "\x07\x01\xef\x44\x0b\xdf\x6a\x4b\x88\x7e\xfa\xd1\x61\xbc\x47\x51" - "\x5a\xe0\x7e\x76\xf9\x37\x5b\x4a\x7a\xb6\x2c\x6a\xee\xb9\xed\x49" - "\x4f\xef\xa8\x02\x7b\xef\x16\x87\x37\xf0\x9b\xcd\xde\xc0\x6d\x19" - "\x25\xc1\x51\x8b\xd3\x51\x37\xf6\xa7\xad\x86\xbd\x6a\xad\x61\x6f" - "\x91\xcb\x40\xe5\x1e\x2a\xda\x6d\x38\x58\xd4\x6c\x38\xa8\xd6\x19" - "\x0e\x15\x39\xf1\xac\x21\x3f\x5b\xa0\x59\x1f\x8d\x3d\x58\xd4\x80" - "\xfd\xf1\x51\xac\xc9\x47\xd2\x75\xf9\x28\x7f\x38\xc0\x9a\x76\x07" - "\xd8\x3b\xf9\x17\x99\x37\x76\x41\x35\x7e\x35\xde\x91\xc5\x7e\xef" - "\xc8\x17\x84\xff\x76\x3e\xaa\x54\xf4\x91\xee\x68\x1d\x54\x65\x9b" - "\x35\x78\x50\x99\xab\x76\xd0\xd9\xa9\x6e\x27\x57\x99\x35\xf9\x5b" - "\x76\x72\x0d\xd2\xc7\x5b\x9f\xad\xdc\xff\x2f\xec\xe4\x6a\x72\x04" - "\xb2\x93\x0b\xde\xb5\x59\xe3\x5d\x5d\x9a\x4d\xa4\x68\xe2\x57\x85" - "\x4d\x24\x87\x4b\xd8\x35\x12\xe7\xf5\x9b\x1d\xe9\x44\x87\x76\x97" - "\xcf\xb2\xeb\x7c\x29\xd1\x56\xc1\x8d\x0b\xf6\xe0\xb7\x1b\xf1\xa0" - "\xab\xce\x7b\xf5\x78\xbe\x65\x92\x93\x60\x12\xe4\x39\xdf\xef\xa6" - "\xfb\x47\x3c\xe7\xc1\xe0\xe6\x67\x33\x83\x9b\x5f\x68\x46\xdc\x54" - "\xfc\x1e\x08\x6e\x9e\x54\x85\xdf\x56\xfc\xaa\xf1\xab\xc1\x6f\x17" - "\x7e\xbb\xf1\xab\xc5\x6f\x3f\x7e\x75\xf8\x1d\xc0\xcf\x85\x5f\xbd" - "\xba\x79\xd2\x1e\xb2\xfb\x87\xb2\x9b\x31\x0f\x2c\x7a\xb9\x21\x78" - "\xcf\x3a\x8b\xfe\xa7\x12\xdd\xc7\x63\x4e\x17\x72\xb2\x55\xf6\xea" - "\xcf\x2a\x44\xfb\x09\x2f\xbf\xfa\xf3\x4c\xef\xb8\x2d\x76\xef\xb8" - "\xcd\xad\xde\xd8\x6d\x51\xf8\x99\xf1\xb3\x78\x37\x97\x98\x31\x9e" - "\xad\xde\x91\x25\x35\xdd\xe5\xb3\x31\xfe\x73\xa6\x4a\x99\xd3\x6c" - "\xe0\xb8\x39\x9a\xfc\x69\x36\xf0\x7b\x7a\x3d\xbd\x7b\x47\x96\x66" - "\x22\x0c\x9c\xf1\xb8\x48\xd7\x35\xaa\xc4\xaa\xdd\x5b\x2a\x41\xbc" - "\xd3\x63\xfc\x91\x4b\xa6\x73\x78\xe8\x4c\x09\x71\xbb\xf4\x35\xd8" - "\xcf\x97\xc6\x7c\xbb\x6d\xf1\x3c\x87\x6d\xd9\xa2\xdc\xf9\xd9\xcb" - "\xee\xb7\x8e\xcf\xb2\x26\xe5\xe6\x3d\x67\x7b\x6e\x79\xf6\xf2\x6c" - "\x41\x3e\x22\xea\xf6\x7e\x67\x4a\xe4\x33\x99\x05\xc0\xe7\xc4\xb4" - "\x73\x4e\xfb\xf6\x2c\x1f\xc6\xe7\x96\x2d\x25\x07\xce\x79\x0d\x41" - "\xd0\x6f\xd1\xed\x25\x58\x97\x05\xf6\x03\xe7\xfc\x86\xe8\x76\x2b" - "\xe3\x58\x0b\xf4\xcd\xdd\xde\xac\xd1\x73\x1f\xb1\x46\xa2\xe7\x90" - "\x66\xef\x12\xbf\xe1\x31\xca\xff\xdb\x8c\x92\x7d\x78\xe7\x5b\x56" - "\x79\x29\x1f\x07\x8d\x27\x9e\xa0\xf1\x64\x78\x51\xf3\x41\xf1\x74" - "\x78\x0f\x8a\x74\x8b\xd3\x0f\xd1\xf3\x52\x21\x6f\x44\xb9\x24\x5b" - "\xe3\xbf\xfd\x19\x3b\x28\xf3\x78\x44\x1a\xac\xc3\x36\x25\x6d\x32" - "\xa5\x13\x3c\x13\xda\xb8\x0f\xed\x28\x5e\xce\x8c\xfa\xda\x26\xbe" - "\xa8\x6f\x7d\xaf\x20\x7a\xf7\xb1\xed\xb4\xbe\xa9\x3d\x1c\xeb\xf9" - "\x75\xe4\xdd\xbb\x44\xf2\x91\xe0\x1d\x23\x88\x67\x24\x1c\x42\xb8" - "\xc3\x5d\xd8\x2c\xf2\xd7\xaa\xcd\xe0\x39\x23\x28\xef\x67\xf4\xad" - "\x1a\x34\x6a\xb5\xe0\x49\xd2\x2c\x3a\x1f\xb0\x6e\x94\xb4\x89\x14" - "\x9d\xc9\xe8\xee\xf6\xd8\x73\xca\xec\x6f\x08\x7e\x04\x2f\x3a\xc3" - "\xe5\xe5\xb3\x6b\xab\xe3\x98\x91\xfc\x0d\x04\x46\x6e\xd6\xec\x73" - "\xa5\x65\xe8\xb4\xb5\x2f\x7e\x73\xbf\x3b\x3b\x72\xbc\xac\xd9\x4b" - "\xe8\x34\x22\x4b\x1c\xfb\xcd\x5b\xb6\x6c\xf9\xe2\x6c\x6b\xf6\xbc" - "\xf9\x39\x56\xf1\xd9\xba\x7c\x19\x92\xe4\xe6\x2f\xb3\x2e\x5d\xb9" - "\xc4\xba\x78\x59\x2e\x71\x09\xd9\x79\x79\xcb\xed\xf9\xc3\x99\xcc" - "\x69\x5d\xbc\x7c\x51\x7e\xae\x1d\x2f\xcb\xb2\x97\x64\x59\xc5\xa8" - "\x2f\x43\x51\x8b\x16\x59\xb5\x1a\x96\xe5\xcc\xcb\xa3\x89\xb0\xe4" - "\x19\x24\x0a\xcb\xdf\x9f\x87\x88\x26\x9b\x53\xb4\xef\x9c\x53\xd2" - "\xdf\xaa\x37\x02\xd6\x55\x9b\x1b\x48\xef\x00\xe1\x3a\xc1\x57\x96" - "\xa7\xe5\xd0\x19\xcd\x8b\xe8\x63\xd7\xf8\x9f\x63\xee\xa6\x4f\xd6" - "\xfb\x46\x36\xde\x85\x8d\x43\xb2\x9f\xa9\xa4\xbf\x2a\xee\xd3\x61" - "\x3d\x08\xbd\x94\xf2\xb4\xe7\x25\x2c\xd2\xb3\xc2\xed\x63\x4b\xfd" - "\x9b\xf4\xd5\xf2\x7c\x23\xbd\x8e\x68\x23\xcd\x26\xbd\x82\x3c\xaf" - "\x51\x1e\x75\xf3\x0b\xad\xc8\x57\x1d\xe2\x4f\xd2\xf3\x29\xbd\x48" - "\x57\x9e\xf6\x2e\x1f\x59\x02\x3e\x25\x3d\x83\xda\x35\xc8\x1e\x63" - "\xbd\x84\x72\x3f\xac\x65\xec\xce\x78\x96\x74\x69\xd3\xc2\x8a\xee" - "\xb8\x05\xb5\x3d\x65\x6c\x68\x0f\xf6\x35\xbf\x81\x8d\xbd\x8c\x79" - "\xb1\xea\x2e\x16\xb1\x7a\x36\x33\xd4\x2e\xac\x25\x1b\xad\xac\x71" - "\xe6\x56\xe6\xce\xf4\x30\xb7\x7f\x0f\x6b\x74\xb5\xb1\x63\x81\xff" - "\x94\xfe\x13\x0a\x88\xbf\x78\x7c\x0c\xd9\x8d\x2a\x5e\xcd\x83\xfb" - "\xfe\xe4\x1d\xb2\xf7\x4c\x2d\xf9\x3d\x18\xeb\x0e\x7c\xe1\x72\x17" - "\xee\x62\x6e\x87\xdb\x45\xf7\xe9\xcf\x29\x3f\x1e\x76\x10\xdf\x86" - "\x35\x22\xdf\x63\x6c\x28\xe0\x18\xa4\x3a\x2a\xb6\xf0\xd6\x5f\x8d" - "\xe2\x27\x7e\xb5\x85\x7b\x30\xa7\xc8\x8f\x41\xc7\xfa\x51\xbc\x73" - "\xbd\x66\x1b\x8e\xe6\xa9\x7d\x05\xb3\x9c\x51\x7e\x5c\x25\x64\x1c" - "\xd3\x45\xf8\x46\x84\x85\xee\x99\xdb\xb1\x85\xc2\xa3\x11\xde\x2f" - "\xc3\x3b\x28\x7c\x13\xc2\xf5\x32\xfc\x2e\x85\x13\x10\x6e\x91\xe1" - "\x26\x26\xef\x96\xff\xb8\x5d\x86\x3f\xa1\x30\x60\xff\x63\x9f\x6b" - "\x05\xb5\xf7\x73\x8c\xd9\xe3\x4a\xf1\x67\xe0\x53\x1d\xa7\xc5\x7a" - "\x38\x54\x94\x43\x32\x18\xac\x87\x1f\xff\xdb\x75\x27\x88\xc7\x7d" - "\x3c\x31\x32\x85\x9e\x3f\x4e\x32\xf9\xd9\x50\xd0\x8c\xd7\xa1\x3f" - "\x17\x09\x76\x03\xd2\x30\x7b\x7f\xbe\x2f\x2d\xc0\x5d\xfc\xd5\x0c" - "\x07\xdf\x5c\xe0\xe5\xaf\x3e\xe9\xe2\x62\x9f\x7b\xa6\xb6\xb6\xc0" - "\x2f\xec\xe4\x82\x4e\xc7\x1a\x7a\x7c\x1e\xb5\xc9\x0b\xba\x77\x10" - "\xbb\x99\x66\xbe\xf9\x59\x2f\xf8\xc9\x9c\xd9\x49\x01\xd2\x21\x04" - "\xad\xff\xf8\xc5\x77\x72\x88\x6e\x28\x9d\xaf\xee\x7a\xd2\xa5\x16" - "\x67\x30\x9e\x98\xe1\x98\x9d\xc3\x5d\xd8\xc3\x14\x29\xef\xe6\x5f" - "\xa0\xfe\x2f\x44\xbd\xe3\x33\x1c\xea\xca\x1c\xf2\xfd\x24\xf0\x4b" - "\x11\xed\xe7\x2b\x80\x4f\x9e\xcf\x30\x05\x37\x97\x66\xbe\x93\x73" - "\xea\xda\xfc\xa8\x29\x8f\x0f\xea\x2b\x89\xda\x14\xe4\x19\x2c\x80" - "\x7a\x02\xe8\x2b\xd1\x0e\x7b\xd5\x06\x03\x68\x18\xc7\xeb\x4f\xb7" - "\x0e\xe1\x2b\x33\x4c\xe8\xd3\x5d\xee\xa4\x8b\xac\xa9\x87\xd6\xca" - "\x4f\xf6\xbf\xe3\x60\x6c\x86\x23\xe0\x32\x79\x85\x3e\x9b\xd9\xbe" - "\x90\xdd\xcc\x47\x3e\xeb\x3d\xa3\xcc\x31\x3e\x56\x88\x3e\xa0\xef" - "\x07\xdb\x5a\x8d\x2a\xfa\x31\x49\xc2\x8d\xf2\x75\x00\xb6\x39\x3a" - "\x7f\x73\x6d\xed\xff\x89\x98\x37\xea\xb2\x0c\x46\xf7\xfc\xf6\x81" - "\x5e\x51\x7b\x33\x4c\x2a\xf6\x23\xfa\xf6\x4e\xd2\x59\x46\x75\x4a" - "\x58\xff\x44\xe8\x21\xf1\x44\xc0\x19\xf5\x93\x5d\x61\x1d\xae\x48" - "\xdb\x11\xec\xcd\x19\x78\xfc\xb7\x94\xa6\xa0\x7d\x99\x7c\xf3\xa4" - "\x81\xed\x42\x6f\x99\x64\x93\xf3\xe3\x67\x5b\xf1\xdb\xcd\x5f\xd9" - "\xec\xf1\x8e\xff\x59\x9d\xf0\xcd\xb9\xc5\x91\xa9\xcb\x8a\xb0\xde" - "\x30\x47\xe6\xfc\x5b\x6d\x51\xc7\xc0\x76\x55\x9d\x87\xa5\x4f\xb4" - "\x21\x5f\x70\x53\x90\x7c\xfd\x5e\x24\x1b\xd5\x15\xef\x24\xf9\xae" - "\x71\x4c\xe7\x34\x0c\x36\xa6\x54\xfe\x8c\xdb\x79\xef\xb5\x95\xf7" - "\x84\x65\xd0\x39\xb2\x0b\x70\x89\x9f\x54\xd2\xc3\xa7\x2b\x92\x07" - "\xf9\xe9\xdb\x04\xab\x00\xf6\x91\x82\x8f\x99\xc1\x8f\xfd\xf2\x3f" - "\x7f\x5a\x61\x48\xc6\x3e\x13\x04\x2d\xf0\x7e\x73\x3d\x4b\x9b\xc5" - "\x8a\x8f\xe5\x5c\x60\xba\xaf\x33\x3e\x6a\x95\xf7\xb5\x9f\x7a\x0d" - "\x74\xe6\x44\xbe\xcd\x04\xbf\xbe\xa5\x38\xe5\xbf\x3e\xc1\x9e\x09" - "\x3a\xe2\xf5\x4f\xbc\x86\x40\x57\x86\x55\xd8\xc8\x06\x1f\x51\x9c" - "\xc3\xd5\xbe\x73\x28\xf2\xa3\xe0\xb4\x59\xc9\x77\xf4\x87\xe9\xcd" - "\xe2\xee\xf5\x87\x19\xf5\xec\xc3\x13\x5b\x59\x63\xfb\x67\x74\x5f" - "\xf0\x95\x0f\x33\x9c\x44\x4f\xc6\x04\x40\x33\x6e\x03\xcd\x88\xf5" - "\x3a\x4c\x35\x1f\xae\xd0\xcf\xa2\xe8\x5c\x4a\xa7\x17\x03\x58\xa3" - "\xd5\x9a\xbf\xb3\x40\xf9\x9c\x3d\xd5\xda\xb9\x14\xf9\x41\x7b\x79" - "\x05\x4b\x7c\xd9\xa0\x66\x0c\x74\x0e\x15\xf3\x9c\xb0\xcd\x62\x51" - "\x63\x0f\x57\xe8\xfe\xd0\x1e\x7b\xce\xca\xfe\x8c\xbe\xbf\x93\x74" - "\xad\x6b\xf2\xa7\x42\xe7\x3c\x80\x79\x17\xc0\x9c\x0b\x00\x9e\x18" - "\x03\x07\xc6\x6d\x40\x5e\x4c\x1f\x83\xde\x62\x7d\x0c\x32\x66\x8b" - "\x31\x00\x0f\xf7\xfc\x93\xda\x18\x7c\x8a\x31\x68\xc7\x18\x94\xb1" - "\x92\x0f\xe6\x34\xb2\xb4\x74\x8c\x41\xe7\x05\xb2\xaf\x2e\xfd\xcd" - "\xe5\x4b\xd8\x8b\xb1\xf8\xd4\x6b\x68\xf2\xc9\x31\xd8\xf3\x73\x39" - "\x06\x7b\x7f\xee\x05\x1d\xf3\xb3\xe6\xd7\x10\x0e\xae\xcc\xb0\x92" - "\xef\x1c\x5e\x96\x49\xbe\xb1\xe5\x58\xf4\x62\x2c\x7a\xe5\x58\x14" - "\x3d\x87\xb1\x68\x69\x15\x36\x5a\x3e\x3c\xd1\xc8\x1a\x33\x6b\xd8" - "\x31\xe0\x25\x8c\xc5\x3c\x1a\x17\x92\x2f\x04\x9f\x4f\x8a\x7b\xa9" - "\x80\xc5\x57\x17\x30\x8b\x3e\x1e\x6a\x2f\xc6\xa3\x00\xe3\xd1\x83" - "\xf1\xf0\xf7\x8d\x47\xbc\x18\x8f\xb3\xda\x78\xf4\x90\x8e\x1b\xc6" - "\xa3\x07\xe3\xd1\x83\xf1\x28\x93\xe3\x41\x78\xfe\x31\x9f\x89\xab" - "\x7f\x4f\x62\x3b\xce\x0c\x30\x1e\xcf\x6b\xe3\xf1\xe9\xbf\x32\x1e" - "\x19\x96\x6f\x8f\xc7\x4f\x03\xff\x68\x3c\x42\x6b\xe2\xc9\x6f\x68" - "\x3c\x7a\x6b\xb4\x35\x71\x1b\xad\x89\x12\xc3\x9d\xff\x2f\x7b\x5f" - "\x1f\x17\x55\x95\xff\x7f\x18\xa0\xb0\x50\x47\x17\x0c\x4b\x0b\x4d" - "\x77\xb1\x7c\xaa\xaf\x96\xb6\xf6\x4d\x4b\x4b\x5b\x1f\xb0\x24\x51" - "\xd1\xd0\x7c\x18\x48\x8d\x14\x0d\x1f\x78\x4c\x5b\x24\x1f\xb0\xc0" - "\x50\x41\xb1\x2f\xee\x17\x4b\x8c\xf6\xab\x1b\xb6\x5a\xb8\x69\xa1" - "\xf1\x64\xe9\x86\x2e\xea\x68\xe8\xa2\xa1\x4d\x88\x32\xe0\xcc\xdc" - "\xdf\xe7\x73\xcf\x1d\xee\x3d\x33\xf7\xce\xcc\x1d\x51\xe4\xb7\xfe" - "\xc1\x4b\xe7\xde\x3b\x67\xce\xfd\x7c\xde\xf7\x7d\xde\x9f\xcf\xfd" - "\x9c\x73\x60\x2c\x42\x9b\x1e\x2e\xdf\xc7\x3f\x13\x70\xaf\x09\x3b" - "\x5e\x33\x6a\x8a\xab\xc0\x2f\x33\x39\x33\x1f\x0f\x0b\x7e\xa1\xfe" - "\x58\x62\xc8\xfd\x27\xb5\x7f\xe0\xcb\x38\x66\xe0\xb3\x81\xfe\x01" - "\x3f\xc1\xf3\x23\xb7\x57\xa0\xf4\x7d\x2d\xb4\x69\xc1\xe7\x04\x9f" - "\x11\x7c\x1e\x4a\x74\xa7\xf8\xbd\xd7\xbf\x0f\x2e\x22\xf8\xde\xf6" - "\xfb\xd0\x7d\xe0\xab\x0c\x62\x7e\x07\x7c\xb3\x18\x9e\x13\x0f\xd2" - "\x0d\xf7\x0c\xfc\x3e\x34\x19\xf5\x82\x16\x30\xdf\xc6\x0c\x7e\x32" - "\xd7\x07\xdc\xb7\x1a\x62\xac\xad\x8b\xc5\xe7\x66\x8b\xb0\x3f\x32" - "\x77\xcf\x84\x9d\x70\xdc\xcb\x04\x3e\x82\x67\x87\x79\x66\x9a\xf6" - "\x4d\xfe\x39\x88\x64\x9d\x23\x3e\x6d\x23\xa8\x8f\xcc\x92\x67\x66" - "\x4c\x04\x3e\x33\x09\xe0\xa3\xe3\x2a\x7d\x34\x89\xee\xd5\xd6\x09" - "\xb8\xda\xbf\x5f\x02\x8c\x93\xe0\xa3\xd0\xd5\x4a\x3e\x32\xe7\x4c" - "\xcc\x30\x6b\x67\x67\xe0\x3a\xef\x96\xb7\x26\x78\x58\x20\x7e\x6a" - "\x84\xb8\xf5\x7b\x83\x89\x2c\x9f\x4a\x34\x4b\x4f\x91\x7b\xca\x26" - "\xfc\x40\xca\xf4\x05\x04\xd7\x4c\xc6\xbc\x37\xee\x9d\x50\x66\x2a" - "\x00\xbe\x7a\x1f\xf7\xfd\xd2\x64\xf1\x9f\x0d\x64\xd9\x54\xe2\xc9" - "\xef\x25\x1a\x9a\x4d\x56\x03\x3e\xf3\x26\x67\x6b\x2c\x69\x73\x47" - "\x72\x5a\xdc\xf3\x85\x14\xe2\xfc\xa5\xf8\x25\xc4\xb7\x44\x57\x8c" - "\xeb\xc6\x9d\xc1\x75\x80\x4b\xeb\xa0\x4d\x03\xd7\x68\x86\x31\x63" - "\x4b\x12\x57\x80\xeb\xe0\xf7\xc3\x31\x82\x5f\xd3\x62\x72\x09\x6a" - "\x11\xcc\xff\x15\xc6\x6d\x02\xed\x35\x99\x5f\x5f\x0b\x8e\x79\x94" - "\x44\x62\x9d\xc5\xb4\x61\xd8\x2f\x9a\x8b\xa7\xff\xf6\xc3\x3d\x17" - "\x3b\xbd\xff\xe1\xfe\x38\x83\x57\x2a\xc4\xc3\xa0\xd1\xe0\xba\x29" - "\x5d\x39\x1a\x1b\x16\x95\x1d\x33\xf2\x79\x58\x43\xbc\xee\x9e\xd4" - "\xa5\xb8\xe6\x2e\xae\xa9\x8f\x63\xf6\xd4\xdf\x70\x3f\x64\x2e\x07" - "\xc6\xab\x4e\x31\xe1\xf9\x33\x0c\x1a\x71\x5c\x9e\x32\x12\xc6\xb3" - "\x82\x11\x41\x5c\x3c\xee\x3d\xf0\x15\xdc\x17\xc6\x41\x9f\x9c\x33" - "\xf2\x9c\xf2\xe9\x8c\x64\x0d\xe6\x89\x8c\xc0\x0f\xc5\xff\xfc\x2b" - "\xbf\xbf\xeb\x05\x8f\xb0\x49\x47\x42\x4d\x04\x7f\x3f\xa4\x17\xbe" - "\x6b\x99\xb2\xba\x41\x73\x26\xb0\xe1\x9e\x10\x9f\xf8\x2a\x71\x6f" - "\x4b\xe9\x1e\x96\xc8\x33\x79\x33\xa0\x4d\xe4\x99\x73\x09\x1a\xca" - "\x2d\x43\x31\x57\xe9\x63\xcb\x2d\x25\x35\x97\x49\x1c\xe0\xb8\x44" - "\x97\xcd\xef\x0f\xd1\x0e\xf8\xdd\xb2\x0c\xf8\xe4\x46\x50\xc7\x2c" - "\xe0\x13\xe4\x81\x2d\xc0\x1f\x96\x65\x01\xf7\xad\x6d\x24\xbd\xad" - "\x3c\x82\xda\x0b\xff\x9d\x0a\x18\x6d\x5f\x04\xc7\xc0\x4f\x16\xe0" - "\x75\xe0\x93\xa0\xcd\x4b\x49\x8f\xcd\x80\xd1\x2c\xe4\x11\xd0\xc5" - "\x63\xa3\x80\x47\xde\x01\x1e\x59\xcc\xef\x31\x1c\xb0\x45\x43\xf9" - "\xe3\xcb\x73\xc9\x9a\x54\xeb\x1e\xe3\xbc\x7d\xc3\x2e\x97\x22\x3e" - "\xc2\x13\xf8\xf9\x69\x66\x1c\x9f\x96\x85\x7a\x96\xd6\x01\x46\x36" - "\xbc\x3f\x14\x8f\xf1\xcf\xed\x3b\xba\xfb\x2c\x14\x6b\x43\xd1\x26" - "\x5b\xaf\x90\xfe\xfc\x3e\x9c\xbf\x06\xdc\xb7\x6e\x3e\xe9\xbd\xe5" - "\x0a\xe9\xb1\x65\x3e\x09\x82\xe7\x55\xb3\x05\xfa\x30\xed\x6d\x2d" - "\xe1\xf7\x61\xb8\x27\x44\x0b\xc7\x65\xf7\x61\x00\x5d\x1d\xb0\x05" - "\x9f\x99\xb7\x82\x9a\xfa\x64\x4a\xcd\x0a\x34\x83\xed\xe8\xba\x49" - "\x53\x47\xd0\xda\xe8\x71\x5a\xaa\xf3\xa7\xc6\xd0\xfa\xa4\x09\x7e" - "\x10\xab\xdc\x7b\xc9\x63\x6a\x1f\xee\x83\x30\x9f\xa8\xa5\xb8\xfe" - "\xb0\x70\x0e\xb4\xa7\x05\x7c\xd5\x37\x81\x24\x58\x3a\x7c\x97\x5b" - "\x16\x03\xda\x09\xd7\x49\x56\xf5\x1c\x4e\xe5\xe7\x99\x9b\x53\xb3" - "\x70\x8f\xf5\xa1\x96\x0f\xb2\x7a\x6f\xbd\x44\xfa\x73\x6f\x82\x3f" - "\x22\xe1\x5e\x2f\x91\x1e\x99\x97\xe0\x5e\xdf\xa1\xf7\x6a\xdd\x53" - "\xdd\x92\x74\x26\x08\xce\x39\xdc\xc3\xc8\xf0\x26\xee\x61\xf4\x27" - "\x3d\x70\xd8\xef\xb8\xee\x84\x94\xd4\xf0\x6b\x56\xd4\x97\x99\x4e" - "\x11\xfc\x5d\xcc\x1d\x95\xd5\x22\xa6\xa7\x75\x43\x2c\x5b\xb2\xd3" - "\xf5\xaf\x57\x02\xb6\xeb\x75\x84\x83\xff\x7f\x75\xce\x80\x6b\x44" - "\xf0\x9a\x4f\xef\x31\x25\x18\x75\xda\xd7\x70\x0c\xb1\x2f\xc1\x7c" - "\x30\x62\x1e\xcf\xf3\xb8\x87\xef\x95\x55\x9e\x27\xd8\x9e\xb4\x1d" - "\xf4\xbf\xb5\xad\x0b\x1e\xaf\x7b\x63\x5b\x88\x05\xcc\xf1\xe0\xb3" - "\x46\x7d\x5f\x80\xb5\xe1\x01\x5c\xa7\x79\xe5\xf4\xb3\x01\xd7\x1e" - "\xd1\x22\x06\x78\xac\x00\x7f\xe3\x9a\xa6\x1c\x17\xea\x09\x38\xc3" - "\x7e\xde\x07\xfe\xee\x6f\xc5\x05\x1c\xf3\xb3\xc5\x46\xbb\x44\x2d" - "\xc6\x34\x7e\xf8\x7f\x57\xf1\xa1\xce\x7f\xaf\x7b\x29\xd6\xbd\xf5" - "\x98\xc8\xf3\x25\xf2\xa6\xf9\xaa\x84\x33\x6b\x28\x67\x22\x27\x59" - "\x79\x93\xe7\x26\x7e\x1d\xfd\x02\xac\x91\xd5\xf1\x7d\x54\xc9\x9b" - "\x25\x35\x22\x6f\x8e\x8d\x92\xf0\x66\x0d\xd7\x68\xe9\x29\xc7\x9b" - "\xe1\xde\x2c\x6f\x86\xb7\x61\x79\xf3\x8d\x79\xb6\xbc\x69\xcf\x99" - "\xe1\xa3\xe4\xf8\x12\xe2\x98\x47\x2e\x79\xbc\xd1\x45\x99\x2b\xc3" - "\xa3\xd5\x73\xe5\xf4\x95\x2c\x57\x86\x17\xfc\xff\xcb\x95\x33\x3a" - "\x33\x5c\xa9\x75\x91\x2b\x2f\xf1\x5c\xe9\xc7\xfd\x02\xcf\x84\xc0" - "\x1f\x5b\x22\x15\xb8\x32\xd2\xc9\xb3\xf0\xa6\x12\x57\xce\x78\x9b" - "\xe5\xca\x19\x39\x2c\x57\xce\x98\x24\x72\xa5\x70\xae\x59\xb8\x72" - "\x46\x54\xcb\x70\xe5\x8c\x28\x9e\x2b\xaf\x20\x57\xbe\x31\xc6\x39" - "\x57\x86\x2f\x97\xe7\x4a\x38\xce\x73\x65\xf8\x72\x91\x2b\x4f\x39" - "\xe1\xca\x99\x4f\xa8\xe0\x4a\x3f\x9e\x2b\xb5\x0a\x5c\x19\x09\xb6" - "\x12\x70\xc1\x63\xcf\x06\x1b\x02\x57\x06\x34\x71\xa5\x0b\xf8\x50" - "\xe7\xbf\x99\x8a\xfb\x85\x21\x57\x5a\x52\xa9\xbe\x44\xae\xe4\x3a" - "\x09\x5c\x39\xd7\x44\x96\x9e\x00\x8e\x3c\x76\x89\xdf\x6f\x83\xaf" - "\xe7\x85\xbf\xe5\x93\x90\x8b\x96\x44\xed\x02\x7b\x95\xe9\xf3\x79" - "\x6e\xe2\xe7\x64\x8d\x46\xae\xca\x87\x6b\x33\x9a\x74\x27\xcf\x9d" - "\x27\x04\xee\x0c\x13\xb8\x73\xda\x4d\x70\xe7\x64\xf4\xe5\xac\x61" - "\x0d\x1a\x2b\x77\x7e\x00\xdc\x39\x8b\xd7\x0f\xf8\x5e\x97\x72\xa7" - "\x6e\xbf\xb5\x5f\x98\xd3\x2c\x8b\xde\x44\x68\xbf\x6a\xed\x79\xf4" - "\x65\xbe\xbd\xf4\xc2\xc8\x1a\xd2\xc4\xa5\x61\x22\x97\x42\x5b\xf3" - "\x94\x79\x74\xd6\xbe\x26\x1e\x4d\x02\x1e\x3d\x2d\xe1\x51\x88\x9b" - "\x3e\x45\xce\x03\x1e\xad\xe7\x79\xf4\x4b\x81\x47\x67\x97\x1c\x09" - "\x03\x1e\x7d\xd9\xca\xa3\xb3\x89\x31\xe9\x4c\xa0\xf1\x3d\xe7\x3c" - "\x5a\xcf\xf3\x68\xd4\xad\xe7\xd1\x83\x36\x3c\x0a\xb1\x2b\xee\xab" - "\x2e\xcb\xa3\x56\x3c\xf2\x3c\x9a\x20\xf2\x28\x6f\xd7\x39\x11\xa5" - "\xe1\x60\xf7\xf0\x28\x3e\x76\x6b\xe2\xd1\xa8\x7c\xca\xa3\x70\x8c" - "\xcf\x9f\x2c\x04\x1e\x05\xfc\xc5\x97\xc0\x7d\xc3\xf3\x02\x7d\xd4" - "\x22\xbf\x6e\x85\x67\x06\x6d\xd4\xc4\xa7\x91\xf0\xcc\x20\xc7\x5c" - "\x85\x67\x06\x78\x74\xda\x35\x2d\xe1\x9f\x97\xf7\xe0\x79\xb9\xa4" - "\xb0\x07\x98\xb5\xe6\x56\x91\x4f\xe7\x1c\x60\xf9\x74\x4e\x1d\xcb" - "\xa7\x73\x76\x88\x7c\x2a\x9c\x43\x3e\x05\x9f\x81\x7d\x72\x91\x53" - "\xdd\xe3\xd3\x39\x85\x4d\x7c\xaa\x11\xf8\x34\xd2\x39\x9f\xf2\xef" - "\x05\x15\xf8\x54\xca\x0d\xca\x7c\x3a\xa7\x50\xe4\x53\x5d\x56\x13" - "\x9f\x56\x28\xf1\xe9\xac\x83\xf2\x7c\x0a\xc7\x79\x3e\x9d\x75\xb0" - "\x89\x4f\x2b\x64\xf8\xf4\x65\x29\x9f\x46\xac\xa1\x7c\x9a\x4f\xd7" - "\xc8\x00\x4e\x2d\xad\x03\x7c\xe0\x33\x17\x9d\xc1\x73\xaa\x05\x38" - "\x15\xf7\x45\xc5\x7d\x61\xb0\x8e\x5e\x8e\x53\x29\xe7\xea\x09\xf2" - "\x2a\x3e\x9b\xf1\x63\x20\xde\x85\xb1\x08\x6c\xc2\x8f\xbd\x56\xfb" - "\x6d\x95\xf0\xeb\xeb\x4b\xb4\xa8\xed\x18\xac\x58\xac\x58\xb9\x1a" - "\x84\x75\xc0\x0c\x56\xd4\xf9\x32\x62\xb5\x12\xb7\x2a\xc5\xee\x47" - "\x30\x76\x0f\x21\x9a\x65\x21\xc0\xaf\xa1\x18\xbb\xe7\xda\xc4\xee" - "\xb9\xf6\xb1\xfb\x71\xc7\x3c\xaa\x2a\x76\x7f\x0d\x7d\x18\xb9\x8a" - "\xe5\xd1\xc8\x35\x2c\x8f\xce\x6f\x83\xfd\xa2\x3c\x9e\x2b\x1f\xbb" - "\xf3\xcf\x79\xe4\x89\xa6\xd8\xbd\x82\xe5\x4f\x31\x76\x9f\xb7\x57" - "\x99\x47\xdf\xf4\x62\xf4\xe8\x34\x81\x47\x67\x08\x3c\x3a\x43\xe4" - "\xd1\xef\x7f\xb0\xea\xd1\xb9\xdd\x0e\x57\x48\x79\xf4\xcd\x91\x4d" - "\x3c\x5a\x69\xcf\xa3\x56\x0e\x45\x3e\xc5\x76\x30\x97\xb5\x13\x78" - "\xfa\xb3\x19\x51\x1a\x9a\xab\x0d\x47\xdb\xf9\xd8\xe6\x6a\x4b\x6a" - "\xae\x91\xb8\x30\xe4\xd3\x0c\x9e\x4f\xdb\x7b\x90\xe9\xc0\x7d\xed" - "\x70\xde\x40\x26\xbe\xd3\x5f\x4c\xf7\x55\xc2\xfc\x92\xe5\x1d\xba" - "\x47\xa1\x35\xcf\x04\xf7\xcb\xbf\xcb\x9f\x7a\x4a\xe0\x54\xdc\x7b" - "\x1c\x30\xb7\xf9\x3a\x70\xea\x62\x19\x6d\xba\x0c\x38\x75\xa9\x44" - "\x9b\xc2\xb3\xff\xe5\x0c\x5b\x4e\x9d\xbb\xa7\x14\xb1\x82\x9c\xca" - "\xc4\xf1\xb9\x77\x40\x1c\x3f\xaf\x2d\xcb\xa5\xf3\x86\xb2\x5c\x3a" - "\xf7\x9a\xc8\xa5\xc2\xb9\x66\xd1\xa6\xf3\x7c\x5b\x46\x9b\xce\xf3" - "\x15\xe3\xf8\x79\x17\x9b\xb8\xf4\x98\x12\x97\xbe\xe9\x2b\xcf\xa5" - "\x70\x9c\xe7\xd2\x37\x7d\x9b\xb8\xf4\x98\x4c\x1c\xcf\x70\xe9\xfc" - "\x12\xca\xa5\xb9\x54\x9b\x56\x58\xb5\x69\x6e\x2b\x8c\xe3\xe7\x17" - "\xab\x8d\xe3\x8f\xd4\x50\xfe\x44\x7e\xb2\x72\xa8\x18\xc7\xe7\x2a" - "\xc7\xf1\x4e\x38\x54\x95\x16\xe5\x39\xf4\xad\x12\x96\x43\xdf\x3a" - "\xca\x72\xe8\xc2\x61\xb6\x1c\x6a\xcf\x9f\x51\x1d\xe4\xb8\x93\xc6" - "\xf1\x0b\x0c\xca\xbc\x19\x35\x44\x3d\x6f\xbe\x3d\x89\xe5\xcd\xa8" - "\x84\xff\x0c\xde\x7c\xfb\x32\xc3\x9b\x5a\x17\x79\xf3\xb6\xc4\xf4" - "\x0b\x6c\xf2\x9f\x0b\x6c\xf2\x9f\x0b\x24\xf9\xcf\x05\xcd\x98\xff" - "\x5c\xd0\x42\xf9\xcf\x05\xc3\x45\x0d\xba\xb0\x9b\x73\xde\x8c\x1a" - "\x2e\xcf\x9b\x70\x9c\xe7\xcd\xa8\xe1\x22\x6f\x3a\xd3\xa0\xd1\xde" - "\x2a\x78\xf3\x0e\x8f\xe9\xa3\x1d\xe6\x3f\xe5\x62\x7a\xe4\x4d\x9e" - "\x2f\x2b\x6c\x62\xfa\x10\x69\x4c\x9f\x2b\xc6\xf4\x23\x29\x6f\x95" - "\x99\x52\xd9\x98\xbe\xd9\x79\x74\x91\xbf\xb1\x29\x1f\x9a\x02\x3c" - "\xba\xa8\x33\xde\x9b\xb1\x29\x1f\x1a\x93\x65\xed\x17\x8d\xe9\x3f" - "\x20\xb4\x5f\x32\x31\x3d\x5f\x3b\xbc\x28\xa2\x29\xa6\xaf\xb0\x8d" - "\xe9\x63\xc6\x28\x73\xea\xa2\x54\xd9\x98\x1e\xe3\x6f\x9e\x53\xa3" - "\x78\x4e\xbd\xbe\x41\xca\xa9\x8b\xf3\x78\x4e\x7d\xd1\xca\xa9\x8b" - "\x8e\x19\xe1\xd9\x34\xde\xe3\x9c\x53\xb1\x1d\x91\x53\x75\xb7\x87" - "\x53\x0b\x5d\xe7\x54\xe9\x9c\xd5\x2f\xe1\xde\x9b\x38\x95\xb7\xf1" - "\x3b\xa3\x4a\xc3\x91\x53\x75\x36\xf1\x7d\xae\x7c\x7c\x7f\x98\x68" - "\xd0\x3e\xd6\xf8\x1e\x7d\xc0\xf3\xcd\x2d\x8d\xef\xdf\xd9\xc6\x72" - "\xeb\x3b\xc7\x58\x6e\x7d\x67\x95\xc8\xad\xc2\xb9\x66\x89\xef\xdf" - "\xc9\x6e\x99\xf8\xfe\x9d\x6c\x91\x5b\x63\x62\x9d\x73\xeb\xa2\x0c" - "\x79\x6e\x5d\x94\x41\xb9\x75\x51\x86\x43\x6e\x7d\x51\xca\xad\x4b" - "\xe6\x59\xb9\x55\x8c\xef\x01\x1f\xf8\xfc\x45\xa7\xba\x1f\xdf\x8f" - "\x6a\xe9\xf8\x7e\xc9\x5c\x55\xf1\xfd\x06\xe0\x59\x88\xc5\x97\x1d" - "\x85\xf8\x7e\xbc\x10\xdf\x57\x66\xdb\xc4\xf7\xd9\x76\xf1\xfd\xf2" - "\xf1\x02\xa7\xc2\x33\xc5\x73\xea\x8c\x5c\xf7\xe3\xfb\x57\xd0\x87" - "\x4b\x23\x58\x4e\x5d\x3a\x8f\xe5\xd4\x58\x33\xf6\x8b\x72\x7a\xb6" - "\x7c\x7c\xcf\x3f\xe7\x4b\xf7\x32\xf1\x3d\xf4\xcf\x3e\xbe\x8f\xcd" - "\x63\x38\x75\x9a\x94\x53\x97\x56\x31\x3a\x15\xee\x0b\x39\x75\xc7" - "\x69\xca\xa9\x9f\x9c\x96\x70\xea\xd8\x4f\x04\x4e\x5d\xee\x7f\x78" - "\x82\x94\x53\x97\x05\x59\x39\x95\xe7\xcb\x69\x46\x4d\x7c\xa8\x7d" - "\xdd\x09\x5f\xef\x83\xb5\x40\xd0\x36\xce\x15\xc3\x36\xf3\x4e\xeb" - "\x9c\xd7\x9b\x84\xca\xd7\x9b\x94\x45\xeb\x49\x71\x55\x2a\x5f\x67" - "\x92\x89\x75\x26\x89\xa4\x5b\x66\x23\x5d\x2b\x80\x5f\xe7\x50\x61" - "\x9d\x80\xa9\x93\x44\x9e\xc5\x9a\xac\xcd\x58\x93\x75\x9d\xd6\x00" - "\x81\xbf\xed\xd7\x06\xb0\xea\x26\xe0\x83\xbd\xa7\x6d\x79\x76\xf9" - "\x8e\x52\xc4\x4f\x98\xce\x26\xe6\xcf\xbe\x03\x62\xfe\x58\x0f\x96" - "\x5f\x63\x07\xb0\xfc\xba\xfc\xa2\xc8\xaf\xc2\xb9\x66\xd1\xae\xb8" - "\xbc\x7f\x4b\x68\xd7\x58\x22\xc6\xfc\xb1\xa7\x9a\xf8\xb5\x5c\xc2" - "\xaf\xa7\xa5\xfc\xba\xb4\x86\xe7\xd7\xd3\xb6\xfc\x0a\xc7\x79\x7e" - "\x5d\x5a\xd3\xc4\xaf\xe5\x36\x31\xff\x69\x5b\x7e\x8d\x3b\xc0\xf3" - "\x6b\x65\xb6\x8d\x76\xcd\x76\x1e\xf3\x57\xde\x69\x31\x7f\x5c\xa1" - "\xaa\x98\x1f\x39\x75\x2e\xe5\x54\xe4\x2c\x2b\xaf\x8a\x31\x7f\xb6" - "\x62\xcc\xef\x8c\x57\x55\x69\x55\x9e\x57\xe3\x0f\xb0\xbc\x1a\x7f" - "\x88\xe5\xd5\x77\x47\xd9\xf2\xaa\x3d\xa7\x26\x78\xcb\xf1\x29\x8d" - "\xf9\x93\x8c\xca\x5c\x9a\xd0\x5f\x3d\x97\x26\x4e\x67\xb9\x34\x21" - "\xfa\x3f\x97\x4b\x13\xaf\x31\x5c\xaa\x75\x91\x4b\x6f\x4b\x1e\x20" - "\x69\x0c\xcb\xa5\x49\x09\x2c\x97\x26\x0d\x14\xb9\x54\x38\xd7\x2c" - "\x5c\x9a\x34\xba\x65\xb8\x34\x69\xb4\xa8\x55\xdf\xed\xe5\x9c\x4b" - "\x13\x06\xc9\x73\x29\x1c\xe7\xb9\x34\x61\x90\xc8\xa5\xa7\x9c\x70" - "\xe9\x8a\xb6\x2a\xb8\x94\xcd\x03\xd8\x72\x69\x8b\xe7\x01\x56\xf8" - "\xaa\xca\x03\x58\xb9\x74\xbc\x7d\x1e\x00\xf9\x95\xcf\x03\x80\xbd" - "\xac\x1c\xc6\xe7\x01\x86\x53\x2e\x2b\x33\x25\x33\x79\x80\xe6\xe7" - "\xd6\x95\x5d\x8d\x4d\xf9\xd4\x24\xe0\xd6\x95\xdd\x78\x6e\x6d\xca" - "\xa7\x26\xef\xb5\xf6\x8b\xe6\x01\x52\x08\xed\x97\x4c\x1e\xe0\x79" - "\xbe\xbd\xb7\x99\x3c\x80\x84\x6b\xa1\xad\x08\x65\x9e\x5d\x99\xc1" - "\xe4\x01\xce\x89\x3c\x7b\x1d\x6b\xd4\x81\x07\x79\x9e\xed\x24\xe5" - "\xd9\xf7\x0e\xf3\x3c\xfb\xbc\x95\x67\x57\x56\xd6\xc3\xb3\x59\xaf" - "\x96\x67\x71\x1e\xc1\xe9\xf0\x96\xe1\xd9\x02\x15\x3c\x2b\xc9\x0d" - "\xec\x05\x7b\x34\xf1\x2c\x6f\xf7\x3f\xcf\x2a\x0d\x43\x9e\x0d\xb7" - "\xc9\x0d\x64\xcb\xe7\x06\x0e\xb5\x44\x6e\xe0\xcf\xfb\x59\xbe\xfd" - "\xb3\x81\xe5\xdb\x3f\x6f\x17\xf9\x56\x38\xd7\x2c\xb9\x81\x3f\xef" - "\x6b\x99\xdc\xc0\x9f\xf7\x89\x7c\x9b\xbc\xd1\x39\xdf\xae\xcc\x96" - "\xe7\x5b\x38\xce\xf3\xed\xca\x6c\x87\x7c\xfb\xbc\x94\x6f\x57\xad" - "\xb2\xf2\xad\x98\x1b\xc8\x16\x72\x03\xc9\xce\x73\x03\x95\x0a\xb9" - "\x81\x11\x2d\x9d\x1b\x58\x95\xac\x26\x37\xd0\xb0\x81\xd6\xed\x2f" - "\xc3\xba\xfd\xa9\xc0\xbf\xc1\x3f\x80\x0d\x9c\xd7\xed\x2f\xb7\xd6" - "\x9f\x86\x67\x08\x3c\x9b\x21\x9b\x1b\x38\x52\xad\x9c\x1b\x38\x72" - "\x4c\x5a\x7f\x9a\xb2\x92\x7d\x6f\x95\xb2\xca\xfa\xde\xea\xc8\x3f" - "\x91\x67\xd7\xae\xc7\xcf\x96\xb4\x84\x6c\xba\xde\xf6\xda\x54\xec" - "\xa7\x5c\x1d\xff\x97\x16\xe9\xbb\xac\x94\xf3\x4d\xb9\x82\x72\xe4" - "\xdb\x0c\x62\xe1\x74\xf7\xe0\x7a\xdf\x7c\xae\xe0\x35\xc4\xde\xda" - "\x61\x52\xde\xfd\xea\xa4\x94\x77\xdf\xd7\x5a\x79\xd7\x0c\xbc\xbb" - "\xff\x5c\x06\xcd\xbf\x4e\xa6\xb5\xa9\x3b\x27\x4b\x6a\x53\x7f\xf8" - "\x87\xc0\xbb\xab\xdb\x1e\xd6\xc3\xfd\x3b\xaa\x9f\x82\xef\xef\x3a" - "\xe9\x6a\x0d\x6a\x86\x6c\xed\x94\xc0\x4f\xb2\xf5\x53\xd0\x57\x6d" - "\x96\xf0\xac\x9a\xe1\x39\xcd\x92\xd4\x4f\x65\x2e\x85\xe7\x59\x98" - "\x57\xe2\xb0\x0e\x75\xb2\x58\x87\xca\xa5\xc5\x57\xe2\xf8\x66\x49" - "\x4f\xc8\x6e\xe4\x74\x9e\x9c\x5f\x7c\x25\xfe\xfe\x8d\x1b\x30\xee" - "\xbc\x10\xea\x49\xe3\xba\xf8\x42\xe0\x9e\x76\xd4\xee\xab\x47\x9a" - "\x61\xac\x31\xc3\x58\x63\x49\x8b\x2f\x34\xa1\x36\xd9\x10\x7f\x30" - "\x13\xe2\x3c\x53\x12\xbf\xff\xe0\x7d\x6b\x21\xd6\xdb\x8a\x71\xde" - "\x15\x78\x36\xe2\x83\x34\xd8\x1f\x2b\x8f\xb6\xaf\x86\xfb\xb8\xe2" - "\x58\xcb\x99\x7e\x15\x79\xb4\xf0\xe5\x23\xf0\x9b\x6b\x9e\x2d\x45" - "\xec\x86\x8a\x73\x0a\x78\xcd\xac\x50\x2b\x8b\x7d\xa1\x6b\x2c\x02" - "\x16\x9a\x21\x27\x21\xed\x0f\xcb\xeb\x6b\xd2\x59\x5e\x5f\x53\xc4" - "\xf2\xfa\x9a\x58\x91\xd7\x85\x73\xc0\xeb\xe0\x37\x5e\x47\xc3\xd8" - "\xe7\xa6\x8e\x5e\x93\x66\xe5\x75\x8b\xc0\xeb\x5b\x5c\xe0\x75\x87" - "\x3a\x5a\xc2\x4b\xca\xbc\xbe\x26\x4d\xcc\x49\xac\x7d\x5b\xb6\x46" - "\xf6\xa4\x94\xd7\xdf\x0f\xe0\x79\xfd\xa4\x2d\xaf\xc3\x71\x9e\xd7" - "\xdf\x0f\x50\x9c\x4f\x70\xd2\xf6\x7d\xda\xba\x10\x9e\xd7\x2b\x84" - "\x1a\xd9\x72\x15\xf3\x09\x2a\x28\xa7\x5b\xb9\x1c\xf3\x55\x2d\x9b" - "\x93\x58\x37\x41\x4d\x4e\x82\xe7\xf2\x1a\xca\xe5\xc8\x8d\x56\x3e" - "\x77\x65\x3e\x81\x33\x3e\xb7\xea\x66\xe4\x73\x25\xdd\xcc\xf2\x79" - "\x6a\x08\xcb\xe7\xa9\x93\x58\x3e\x4f\x0b\x61\xf9\x3c\x6d\x82\x2d" - "\x9f\xdb\x73\x79\xea\x0e\x39\x1e\x8f\x7a\x0d\x73\x14\x69\x5e\xca" - "\x1c\x9e\x7a\x4c\x3d\x87\xaf\x3f\xfa\x1f\xc7\xe1\x5a\x5b\x0e\xff" - "\xc0\x17\x39\xc8\xfc\x9e\x0d\x87\x47\x0a\x1c\x2e\xf0\xc8\xd6\x4b" - "\x82\x16\xb6\xe5\xf0\x1a\xb8\x0f\x27\xf1\xb8\xe9\x17\x5b\x0e\xff" - "\xd0\x83\xe1\x70\xad\x13\x0e\x8f\xa4\x79\x10\xa6\x2e\x57\x21\x17" - "\x02\xf7\xa1\xcd\x52\xd0\xe6\x56\x9b\x49\xfb\xc3\x72\xf8\x87\x93" - "\x58\x0e\xff\x70\x35\xcb\xe1\x1f\x0e\x13\x39\x5c\x38\xd7\x2c\xda" - "\xfc\xc3\xd0\x66\xd7\xe6\x56\x7c\x38\xe4\xf0\x0f\x43\x45\x6d\x9e" - "\x36\xd0\x39\x87\xa7\x56\xca\x73\x38\x1c\xe7\x39\x3c\xb5\x52\x71" - "\x9e\x83\x1d\x87\xa7\xfb\xab\xe0\x70\x36\x17\x62\xe5\x70\x21\x17" - "\xb2\x55\x92\x0b\x31\x27\xd1\x5c\x48\xd6\x25\x8a\x8d\x76\x1e\x14" - "\xa7\x80\x9f\x80\x2d\x1a\xc7\xb1\x5b\x96\x5b\x79\x90\x74\x3f\x35" - "\x79\x10\x9e\xbf\x71\x8e\xc3\x24\xe0\xed\x72\x17\xe7\x38\x8c\xb4" - "\xce\x71\x48\x55\x98\xe3\x20\xf0\xf9\xb4\x9b\xe0\x73\x7e\x8e\xc3" - "\x86\x9e\x6c\x8e\x79\x43\x2f\x6b\x8e\x99\xf2\xf9\xa6\xc1\x2c\x9f" - "\x6f\x1a\xd4\x34\xe7\x01\x38\xbf\x2c\xea\x03\xbb\x39\x0f\x4d\xdc" - "\xce\xe7\x41\x37\xac\x2a\x7c\xad\x8a\x34\xf1\x7b\x98\xc8\xef\x17" - "\x3c\x36\x5e\x64\xb8\xfd\x9c\x94\xdb\x37\xe4\x33\xdc\x7e\x3a\x83" - "\xad\x8f\x38\x17\x25\xe1\x76\xeb\x9c\x87\x8f\xf2\x0e\x57\x3a\xe1" - "\x76\xf8\xbe\xeb\x73\xc4\x9a\x97\xdb\xad\xf3\x1b\x64\xb9\x5d\x3a" - "\xbf\x41\x52\xff\x80\xdc\xce\xef\x93\xe1\x6f\xc3\xed\xcb\x74\x1a" - "\xf3\x37\xf0\x3c\x00\xaf\xe3\x33\x62\xe6\x80\xdb\x79\x7b\x7f\x54" - "\x2d\xe5\xf6\x1b\x49\x94\xdb\x37\x5f\xba\x79\x6e\x6f\xd2\xc3\x52" - "\x6e\x7f\x11\xb9\x3d\xe3\x3c\x9d\x7f\x91\xe0\xda\xfc\x0b\x9b\xfa" - "\x8c\xcd\x2e\xe4\x5f\x1c\x72\xbc\x4c\xbf\x58\x8e\xdf\xf8\x2c\xcb" - "\xf1\x1b\xa3\x58\x8e\xdf\xd8\x53\xe4\x78\xe1\x5c\xb3\xe8\xf4\x8d" - "\x43\x5a\x26\xff\xb2\x71\x88\xc8\xf1\x9b\x3a\x3b\x9f\x7b\xb1\xa1" - "\x40\xbe\x36\x03\x8e\xf3\x1c\xbf\xa1\xc0\xe1\xdc\x0b\x26\xdf\xbd" - "\xb9\x8d\xec\xdc\x8b\xf2\xdb\x57\x9b\x21\xc5\x8a\x6d\xfe\xc5\xfd" - "\xdc\xf7\x66\x1f\xb5\xf9\x17\x9c\x7b\xb1\xec\xb8\x64\xee\x45\xa5" - "\xf3\xb9\x17\xcb\x43\x5c\xcc\xbf\x38\xa8\xcd\x38\x12\x2c\xad\x77" - "\xcb\xf4\x66\xf9\x3d\xb3\x4d\x13\xbf\xbf\x82\xfc\x9e\xdd\x95\xe5" - "\xf7\xec\x2e\xd8\x4f\xb9\xb9\x18\x5f\x32\xef\x15\x33\x67\xb1\xb5" - "\x1a\x36\xf9\x97\x57\x10\x7b\x5b\x4b\x18\x7e\x3f\x2d\xe5\xf7\xcc" - "\x54\x39\xed\x8e\x79\x6f\xbe\xa6\x78\x9a\x64\x4e\xdb\x58\x6b\xfd" - "\x5b\xd6\xc6\xc3\xa1\x70\xff\x7a\x85\x5a\xb7\x69\xb4\xd6\x8d\xaf" - "\x6d\xc3\x3c\x38\xb4\xf5\xd9\xb4\x28\x4d\x5c\x38\x67\xc1\x5a\x37" - "\xdb\x3a\x37\xac\x7d\xc3\x5a\xb7\x12\x5d\xaa\x62\x9d\x1b\x62\x53" - "\xa9\xd6\x0d\xfa\xed\xc7\x73\xfd\x59\x81\xeb\x85\x5a\xb7\xcc\xc5" - "\x62\xad\x1b\xc3\xf5\x32\xf5\xc3\x7b\x4f\x27\xc8\xeb\xf8\x78\x91" - "\xeb\x1b\x51\xc7\xff\xd1\x26\x17\xc3\xfb\x20\xeb\xd8\x6d\xcd\xc5" - "\xf0\x5c\xbf\xe5\x70\x29\xe2\x38\x2c\x4a\x26\x17\x63\x5f\xe3\x7c" - "\xfb\x72\x31\x5b\xbb\xb1\x1c\xbf\x75\x02\xcb\xf1\x5b\xdb\x88\x1c" - "\x2f\x9c\x6b\x16\x8e\xdf\x1a\xd8\x32\xb9\x98\xad\x81\x62\x2e\x66" - "\xab\x59\xb6\xfe\x8e\xc9\xb1\x67\x66\xc8\xe7\xd8\x33\x85\xfa\xbb" - "\xcc\x0c\xc5\x39\x21\x76\xef\x34\xb3\xcf\xd2\x1c\xbb\x1b\x73\x42" - "\x2a\xef\xb4\x5c\x4c\xb6\x5e\x6d\x2e\x86\xaf\x6d\x3e\x8e\xf5\x21" - "\xea\xe6\x84\x38\xe3\xf6\x26\xed\xee\xe0\x1d\x26\xcb\xed\xdb\xce" - "\xb2\xdc\xbe\xed\x3c\xcb\xed\xdb\x2f\xb3\xdc\xbe\xbd\xc6\x96\xdb" - "\xed\x79\xfd\xe3\x81\x72\x9c\x1e\xf5\x0a\xe6\x62\xb6\x67\x2a\xf3" - "\xf9\xc7\xe1\xea\xf9\xfc\x7f\x22\xfe\xa3\xf9\x5c\x6b\xcb\xe7\xff" - "\x93\x73\x5b\xf3\x32\x3c\x9f\xe7\x6c\x64\xf8\x5c\xeb\x84\xcf\x6f" - "\x5b\x5e\x26\xe7\x37\x96\xcf\xb7\xf7\x60\xf9\x3c\xe7\x84\xc8\xe7" - "\xc2\xb9\x66\xc9\xcb\xe4\x18\x5a\x26\x2f\x93\x63\x10\x35\xfb\xf6" - "\x12\xe7\x7c\xfe\xb1\x4e\x9e\xcf\xe1\x38\xcf\xe7\x1f\xeb\x14\xeb" - "\xa9\xed\xf8\xfc\x2f\x79\x2a\xf8\x5c\xb6\x46\xe5\xce\xc8\xcb\xfc" - "\x65\xa7\xda\xbc\x8c\xd2\x3c\x15\xe4\x77\xb1\x3e\x45\x32\x4f\x65" - "\xa8\x75\x9e\x4a\x02\x5b\x9f\xd2\xec\xdc\xfe\xbf\xfb\x59\x6e\xff" - "\xdf\x03\x2c\xb7\x7f\x7a\x8a\xe5\xf6\x4f\x2b\xad\xfd\xa4\x79\x99" - "\x24\xbb\x79\x2b\x2c\xcf\xe7\x76\x2b\x7c\xa5\x8a\xc8\x71\x3d\xb4" - "\xb5\x46\x99\xe7\x73\x47\x2a\xf1\x3c\xd6\xab\x7c\x3a\x4d\x27\xc3" - "\xf3\x3b\xc6\xff\xff\xc0\xf3\x4a\x75\x28\x7c\x1c\x04\x1c\x8f\x7c" - "\xcf\xf3\xbb\xc0\xf5\xc8\xf3\xe6\xbf\xcb\xe5\x68\x76\xac\xbe\x55" - "\x3c\xaf\x9c\xa3\xf9\x64\x55\x69\x98\xc0\xf3\xae\xcc\xa1\x39\xc0" - "\xe6\x68\x32\x23\x6f\x75\x8e\xe6\x93\xb3\x2c\xdf\x7f\xea\xc7\xf2" - "\xfd\x27\x87\x45\xbe\x17\xce\x35\x8b\x7e\xff\x44\xdf\x32\x39\x9a" - "\x4f\xf4\x22\xdf\x7f\xba\xdf\x39\xdf\xe7\x06\xcb\xf3\x7d\xae\xb0" - "\x36\x5b\x6e\xb0\xeb\x7c\xbf\xb3\x89\xef\xed\xe7\xcf\x24\xb8\x5f" - "\x23\x33\xac\xa5\x73\x34\x3b\x15\xf9\xdf\xd1\xfa\x18\xee\xe7\x68" - "\x84\x39\x89\x33\xe4\xd7\xc7\x38\xec\xa0\x46\xe6\x70\xb1\x94\xeb" - "\xf3\x76\xb0\xb5\x88\x79\x79\xd6\x5a\xc4\xc3\xa5\xc8\xf5\x9f\x1f" - "\x67\xb9\xfe\xf3\x63\x4a\x39\x9a\xbd\x16\x69\x4d\xe2\xae\x36\x6c" - "\x8e\x26\x9b\xcd\xd1\x8c\x45\xec\x7d\xbe\x52\x99\xeb\x77\x0d\x60" - "\x6b\xc0\xe9\x1c\xc5\x1d\xd3\x84\x1a\xf0\x69\x92\x1a\xf0\x97\x3f" - "\x16\xb8\xfe\xb3\xf1\x45\xe5\x26\xa2\xa6\x0e\xf1\xe6\x6b\xbd\x93" - "\x65\x6b\x10\xf9\x31\xc0\x41\x1d\xe2\xeb\x27\xb4\x58\xd3\x1c\xb4" - "\x65\xb1\xa4\x0e\xd1\xc1\x7a\xc6\x0c\xff\x4f\x8b\x52\xe4\xff\x06" - "\x4e\xe4\x7f\xcb\xd3\x62\xde\xc6\x82\x3a\x9f\xf7\xcb\x67\xab\x6f" - "\x55\xde\x46\x2e\x4f\x52\xf8\x3c\xf2\x7f\x7e\x22\xd5\xf9\xba\x3b" - "\x2c\x6f\x93\x7f\x82\xe5\xfd\xcf\x7d\x59\xde\xcf\x3f\x20\xf2\xbe" - "\x70\xae\x59\x6a\xd1\xf3\x2b\x5a\x46\xe7\xe7\x57\x88\x79\x9b\xcf" - "\xf7\x38\xe7\xfd\x5d\x43\xe4\x79\x7f\xd7\x10\xca\xfb\xbb\x86\x38" - "\xcc\xdb\x30\xb5\x91\x7f\xdd\x78\xd3\x79\x1b\xab\xce\x6f\xf1\x79" - "\x3d\x7f\xcd\x50\x93\xb7\x69\x9a\x93\x7e\x53\x79\x1b\x79\xbe\xb7" - "\x6a\xfb\xc3\x0e\xde\xb9\xb2\x7c\xff\x7f\x1b\x59\xbe\xff\xbf\x2c" - "\x96\xef\xbf\xd8\xcb\xf2\xfd\x17\x05\x72\x79\x1b\x96\xeb\xff\xef" - "\xb2\x1c\xcf\x47\x8d\xc5\xbc\xcd\x17\x3a\x65\x8e\xdf\x1d\xa0\x9e" - "\xe3\xf7\x0c\xbc\xcb\xf1\x36\x1c\xaf\xb5\xe5\xf8\x3d\x51\xb7\x55" - "\xe3\xf3\x1c\xff\xb7\x59\x0c\xc7\x37\x63\x2e\xc7\x95\xf9\x24\xca" - "\xda\xfe\x6f\x36\xf5\xef\x7f\xb3\xa9\x7f\xff\x9b\xa4\xfe\xfd\x6f" - "\x86\xe6\xe3\xf8\xbf\x35\x7f\xfd\xbb\x4b\x1c\xff\x37\x49\xfd\xfb" - "\x17\x1b\x9d\x73\xfc\xee\x40\x79\x8e\x87\xe3\x3c\xc7\xef\x0e\x74" - "\xa8\xed\x19\x8e\x2f\x88\xbd\x15\xb9\x9c\x96\x99\x6f\x54\xb0\x5c" - "\x4d\x3e\xc7\xd1\xba\x23\x8a\xf9\x9c\x41\xd6\x7c\x4e\x94\x42\x3e" - "\xa7\xb9\x38\x7f\xef\x1a\x96\xf3\xf7\xae\x67\x39\x7f\xff\x01\x96" - "\xf3\xf7\x17\xb2\xf9\x9c\x05\x76\xf9\x1c\x96\xff\xf7\xfe\x56\x38" - "\x56\x9a\xcf\xc9\x96\xe4\x73\xf6\xbf\xad\xcc\xff\x5f\x2a\xf2\xff" - "\x75\x9e\xff\xc3\x65\xf8\xff\xef\xff\x21\xfc\x1f\x7e\x13\xfc\xff" - "\xf7\x16\xe0\xff\x7d\xf3\x68\x8e\xc7\xc5\x75\x52\xf6\xaa\xcf\xf1" - "\xdc\xdc\x38\xb0\xef\x10\x3b\x0e\xec\x33\xb2\xe3\xc0\xbe\x3c\x71" - "\x1c\x10\xce\x35\xcb\x38\xb0\xef\x60\xcb\x8c\x03\xfb\x0e\x8a\xe3" - "\xc0\xfe\x6d\xce\xc7\x81\x2f\x15\xc6\x81\x2f\x85\x71\xe0\x4b\x15" - "\xe3\xc0\x57\xeb\x95\x73\x3c\x51\xee\xe7\x78\x06\xb7\xf4\x3c\xa8" - "\xaf\x52\x55\xe5\x78\x36\x24\x26\x14\xe3\x1a\x29\x67\x89\x66\xd9" - "\x74\x6b\x8e\xa7\xd0\x26\xc7\x53\x68\x97\xe3\x59\x72\x56\xe0\xff" - "\xd1\xc2\x7c\xd3\xb1\x37\xb1\x46\x0a\xbf\x97\xf4\xd7\x6b\xd8\xba" - "\xf9\xaf\x79\xfe\x17\xd7\xef\xfb\xa6\x2b\xf6\x8b\x8e\x3f\x85\x0e" - "\xd6\x40\xfd\xfa\x14\x93\xd3\x19\x2d\xb7\x46\xca\x3f\x98\xba\x1b" - "\x76\xbe\x69\xa1\x0f\xc3\xf7\x63\xe9\x7c\xd3\x4f\xe4\xde\xd3\x36" - "\xad\xc9\x7f\xa0\x33\xbf\x26\x7f\xd3\x5a\x7e\x85\xa3\x5d\x5a\x4b" - "\x7a\x9a\xb0\x96\xf4\xe9\x16\x58\x4b\xda\xd5\x35\xf9\x4f\xdb\xae" - "\xdf\x77\x60\x4f\x59\x71\x21\x29\x45\x8c\x84\xd9\xae\x7d\x5a\x28" - "\x3f\x77\x5f\x23\xcc\xdd\x9f\x7f\x6b\xd6\x41\xc1\xfe\xf0\x63\x7e" - "\xc7\xef\xb2\xf3\xe2\x0c\x7c\x7f\x70\xdf\x6e\xf0\xf3\xe0\x62\xc0" - "\xaa\x05\xf9\x74\x01\xf2\xe9\x3f\xe6\xf2\xd7\x9e\x05\x2c\x74\x9c" - "\xe0\x83\x38\x5e\x6b\x21\xbe\x51\x8b\x91\x5b\xff\xc1\xd7\x7d\x81" - "\x8c\x00\x6e\xa5\xd7\xc5\x9e\xe5\xcc\xe6\x8e\x61\xf8\x2c\xde\xbb" - "\x6b\x7e\xb9\x77\xa9\xbe\x0e\x9e\x8b\x4b\xfc\x3e\xae\x65\xa6\xfa" - "\x42\xf4\xc5\x57\xf3\xcb\xbd\x38\xe0\xdf\xad\xb3\x89\x8f\xba\xe7" - "\xf4\x1f\xfc\x3e\xf5\xfc\xdc\xf5\x8e\xdf\xed\xc4\x75\x40\xac\xda" - "\xca\xf2\xab\x98\xdf\xca\x02\xfb\x58\x38\x3a\xf6\xbd\x1e\x41\x79" - "\x03\x7e\x2f\x08\x6c\xc9\xd7\xd8\x22\x6f\xf0\x7b\x58\x01\x6f\x6c" - "\xa9\x15\xdf\x63\x63\xfb\x68\x23\x9a\x47\xf9\x87\x58\xff\xa2\x57" - "\xe2\xd6\x42\xad\x3c\xb7\x16\x6a\x29\xb7\x16\x6a\x9b\xb8\x55\x2f" - "\x93\x47\x61\xea\xd8\xbf\x11\xea\x5f\x0a\x6d\x34\x76\x61\x2b\x5c" - "\x1f\xe5\x1b\x55\xf5\x2f\x3c\x9f\xce\xa5\x7c\x8a\x7c\x65\xe5\x54" - "\x31\x8f\x52\xa8\x98\x47\x71\xc6\xa9\xaa\xe6\xf0\xf3\x9c\x7a\xf0" - "\x2c\xcb\xa9\x07\xcf\xb3\x9c\x5a\x34\xcb\x96\x53\xed\xf9\xf4\x50" - "\x4f\x39\x2e\xa5\xeb\xa3\x14\xf9\x29\xf3\xe8\xa1\x60\x25\x1e\xe5" - "\xeb\xd3\xa7\x49\xea\xd3\x9b\x78\xf4\xdb\xe9\x2c\x8f\x1e\x4a\x73" - "\x95\x47\xf9\xbd\x4d\x4e\xdf\x86\xbd\x4d\xdc\xe6\xd1\x28\x1b\x1e" - "\xfd\xd6\x2c\xf2\xa8\xed\xfe\x26\x4e\x78\x34\xf2\xd6\xac\x81\xc2" - "\xf0\xa8\xc5\xc0\xf7\x27\x70\x3e\xf6\xf5\xbb\x44\x96\x47\xbf\xdb" - "\xad\xcc\xa3\xdf\x8d\x17\x79\x94\x5e\x77\x6b\x79\xf4\xbb\x04\x86" - "\x47\x23\x25\x3c\xfa\x8b\x18\x43\x60\x8d\x45\x13\x8f\xce\x93\xf0" - "\x68\xa4\x33\x1e\xfd\x2e\x01\x6d\x44\x35\x6a\xd1\x08\xe7\x3c\x7a" - "\x28\x54\x9e\x47\xe1\x38\xcf\xa3\x87\x42\x45\x1e\x95\xd1\xa8\x0c" - "\x8f\x1e\xee\xa5\x82\x47\xef\xf0\xb5\x51\x0e\x07\xa9\xca\x55\x88" - "\x73\x3a\xed\xd7\x48\x9d\x2a\x9d\x13\x54\x60\xb3\xef\x49\x81\xdd" - "\xbe\x27\x4b\xac\x73\x3c\x47\x0a\xbc\xfa\xf2\x4d\xf0\x2a\x3f\xc7" - "\xf3\xc8\x60\xb6\xf6\xe4\xc8\xb3\xd6\xda\x13\xca\xab\x25\x47\xad" - "\xfd\x12\xf7\x3d\x29\x70\xb0\x46\xea\x91\x35\xcc\xda\x28\x23\xa5" - "\x6b\xa3\x94\x24\x2a\xaf\x91\x7a\x64\x37\xb3\x36\xca\x91\xdc\xa6" - "\x7d\x4f\x6c\xd7\x48\x15\x39\xf6\xfb\x43\x3c\xc7\x36\xad\x41\x75" - "\xc4\xd8\xb4\x46\xaa\x93\x79\x41\xd8\xce\xae\x73\xba\x5b\xcf\xb1" - "\x85\x2a\x38\x96\xd9\xf7\xc4\x76\x8d\xa9\xe2\x88\xb2\xa2\x02\x52" - "\x1a\x5e\x20\xb3\x36\x6a\x41\x8b\xee\x7d\x82\xfd\x92\xe7\xda\xe2" - "\xcb\x2c\xd7\x96\x04\xf2\xd7\x9e\x92\xe3\xda\xe2\xfd\x22\xd7\xd2" - "\xeb\x62\x4f\xd9\x70\x6d\xa5\x02\xd7\xc2\xb8\xba\xf5\x82\x5a\xae" - "\x2d\xae\xe1\xb9\x36\x49\xe0\xda\x4b\xcd\xcd\xb5\xc5\x35\x22\xd7" - "\x96\x7c\xee\x7c\x8f\xa9\x23\xfb\xe4\xe7\xe5\x1c\xd9\x47\xb9\xf6" - "\xc8\x3e\x87\x7b\x4c\x31\x35\x1f\xa5\xdb\xac\x7b\x4c\x89\xf9\x80" - "\x02\x21\x1f\xd0\x9a\xf7\x44\x29\xcd\x56\x9b\x0f\xf8\x1e\x62\x77" - "\x9c\x77\xb9\x0c\xf7\x9c\x0a\xc3\x3d\x51\xf2\x6d\xf2\x01\xf9\xf6" - "\xf9\x80\x49\x8e\x39\x56\x55\x3e\x80\x9f\x77\x59\x96\xc5\x72\x6c" - "\xd9\x36\x96\x63\x7f\x1c\x6c\x9d\x67\x89\xfd\x51\x5e\x33\xb5\xec" - "\x72\x53\x3e\xa0\x92\xe5\x56\x31\x1f\xf0\xc3\x45\x65\x8e\x2d\x67" - "\xf3\xbf\x2f\xe7\x32\xf3\x2c\x3f\x39\x27\x5d\x87\xda\xba\xfe\xd4" - "\xd1\x81\x87\x8f\x49\x39\xb6\x3c\xac\x35\xad\x43\xdd\xb4\xd6\x94" - "\x93\x5a\x6e\xfb\x75\xa8\x8f\x1e\x2d\x2b\xca\x27\x38\xb7\x8d\xe7" - "\x5b\x26\x37\x90\xdf\x32\xb9\x81\xa2\x7c\x85\xdc\xc0\x0f\x21\x2c" - "\xcf\xfe\x90\xcc\x5f\x7b\x42\x8e\x67\x7f\xe8\x29\xf2\x2c\xbd\x2e" - "\xf6\x84\x0d\xcf\x56\x34\xa7\xa6\xfd\x61\xc2\xad\xcd\x0d\xfc\x30" - "\x41\xcc\x0d\xfc\xe8\xc2\xfc\xc7\xf2\x40\x79\x9e\x2d\x17\xf2\xae" - "\xe5\x62\xde\xb5\x42\x66\xbf\x14\x86\x67\x7f\x34\x5b\xe7\x3f\xf2" - "\x9a\xb6\xd2\xaa\x69\xf3\x5b\xe1\x7e\x29\x3f\x9a\xd4\xe6\x06\x70" - "\x9e\x3b\x72\x2b\x72\x97\x95\x5f\xc5\xdc\x40\xbe\x72\x6e\xc0\x09" - "\xbf\xaa\xdf\xbb\xef\x98\x99\xe5\xd7\xe3\x1e\x2c\xbf\x56\xac\xb1" - "\xe5\x57\x7b\x6e\x3d\x3e\x4c\x8e\x57\x69\x6e\xa0\x62\x88\x32\xa7" - "\x1e\x9f\xab\xc4\xa9\xfc\x9a\x7e\xe7\xc4\x1a\x69\x91\x53\xff\xb9" - "\x8a\xe5\xd4\xe3\xf9\xae\x72\x6a\x8b\xec\x97\xe2\x36\xa7\xea\x6c" - "\x38\xf5\xa7\x9e\x22\xa7\xda\xee\x99\xe2\x84\x53\x6f\x55\x9e\x40" - "\xca\xa9\x8c\x76\xfd\x69\x07\xcb\xa9\x3f\x55\x2a\x73\xea\x4f\x4b" - "\x44\x4e\xa5\xd7\xdd\x5a\x4e\xfd\x29\xf7\xd6\xe6\x09\x7e\xca\x15" - "\xb5\x6b\xc5\x3c\xe7\x9c\x7a\x3c\x5a\x9e\x53\x8f\x47\x53\x4e\x3d" - "\x1e\xed\xfa\x9c\xf2\x13\xe3\x55\x70\xea\x1d\xbe\x97\xca\x89\x60" - "\xd5\x79\x02\xcc\xb7\x22\x97\x56\xde\xdc\xda\x21\x31\xd6\xb5\x43" - "\x86\x0b\x1c\xfb\xe2\xcd\x72\xec\xc9\xe9\x6c\x4d\xc3\xc9\x59\xd6" - "\x9a\x06\xca\xb1\xa7\xbd\xd9\xfd\x51\xed\xd7\x0a\x61\xd7\x50\x3d" - "\xb9\xa7\x29\x4f\x80\x9c\x3b\x5c\x9a\x27\x38\xb5\x47\x99\x6f\x4f" - "\x56\x32\x79\x82\x6f\xe5\xf9\xf6\x3a\xc3\xb7\xff\x6a\xe0\xf9\xb6" - "\x69\x0d\xd5\x7f\x05\x5a\xd7\x50\x75\xaa\x61\x19\xbe\x0d\xbf\x3d" - "\x7c\x5b\xe0\x3a\xdf\xb2\x7b\xa9\xd8\xae\x97\x5a\x99\x55\x76\x10" - "\xf8\x96\x5f\xaf\xc3\x76\xcd\x54\xd7\xd6\xeb\xb8\x55\x6b\xa6\x62" - "\xbf\xe4\x79\xf7\x54\x37\x96\x77\x4f\x4d\xe0\xaf\x95\xe5\xdd\xca" - "\xdf\x44\xde\xa5\xd7\xb9\xcc\xbb\x6e\xe5\x0c\x4e\x05\xde\xda\x9c" - "\xc1\xa9\x40\x91\x77\x4f\x9d\x77\xce\xbb\x27\xab\xe4\x79\xf7\x64" - "\x15\xe5\xdd\x93\x55\x0e\x79\x97\xa9\x21\x38\x7d\x5c\x76\x2d\x8f" - "\xca\xd6\xbe\xcf\xca\xe9\x63\xee\xe4\x0c\x80\x83\x35\xcb\x71\x0d" - "\xa7\x70\xac\x21\x70\x9e\x33\x70\xc6\xb7\xea\x73\x06\x67\x8e\xb2" - "\x7c\x7b\xe6\x38\xcb\xb7\x3f\x27\x62\xbf\x1c\xe6\x0c\x78\x0e\xd0" - "\x77\x6b\xca\x19\xe8\x59\x9e\x15\x73\x06\x3f\x3f\xa1\xfc\xee\x4b" - "\x3f\x9a\xd1\xb7\x2f\xda\xac\x59\x3d\x4d\xe4\xdb\x23\xa5\xd6\x9a" - "\xb1\xb3\xb1\x87\x83\xa5\x7c\xab\x4f\xb5\x5b\xb3\x7a\x42\x33\xae" - "\x59\x3d\xa1\x99\xd7\xac\x0e\x61\xd7\xac\xde\x74\x5d\xac\x23\x53" - "\xbf\x66\xf5\xb9\xce\x3c\x07\x23\x86\x70\xdd\x6a\x57\xf2\x08\xb7" - "\x78\xaf\x15\x86\x7b\x99\x3c\xc2\xb9\x2c\x96\x7b\xcf\x95\x2b\x73" - "\xef\xb9\x79\x22\xf7\xd2\xeb\x6e\xad\xe6\x3d\x97\x79\x6b\xf3\x08" - "\xe7\x32\xc5\x3c\xc2\xcf\xd3\x65\xb9\x97\x79\x37\xa6\x9f\x20\xff" - "\x6e\x0c\x8e\xf3\xdc\xab\x9f\xa0\x98\x47\xb0\xab\xdf\xaa\x1a\x41" - "\xdf\x8d\x09\x9a\x57\xaf\x22\x8f\x70\xc7\xd5\x18\x54\x0d\x77\x27" - "\x8f\x80\x7c\x8b\x7c\x66\xe5\x5c\x57\xf2\x08\xcd\xaf\x71\xcf\x8f" - "\x60\x39\xf7\xfc\x28\x96\x73\xab\x2f\xda\x72\xae\x3d\xdf\x9e\x5f" - "\x25\xc7\xb5\x34\x8f\x50\x9d\xa1\xcc\xb3\xe7\x77\x2b\xf2\xac\x4d" - "\x6d\xae\xc8\xb3\x17\xce\xb3\x3c\x7b\xde\xe8\x16\xcf\xba\xba\x07" - "\xcb\x1d\xc5\xb3\xe1\x36\x3c\xfb\xef\x44\x91\x67\x6d\xf7\x61\x71" - "\xc2\xb3\xb7\x68\x1f\x16\x65\x8d\x5b\xed\xcd\xf2\x6c\xf5\x20\x65" - "\x9e\xfd\xf7\x71\x91\x67\xe9\x75\xb7\x96\x67\xab\xbd\x6e\x6d\x6e" - "\xa1\xda\x4b\xd4\xb8\xd5\x87\x9d\xf3\xec\xf9\x7d\xf2\x3c\x7b\x5e" - "\x78\x2f\x76\x7e\x9f\xa2\xc6\xb5\xe3\xd9\x8b\x79\x2a\x78\xf6\x0e" - "\xaf\x41\xb8\xa8\x6a\xfd\x0b\x49\xbe\xf6\x9e\x32\xbd\xcd\x7c\x89" - "\x13\xd2\xf9\x12\x92\xdc\xc2\x70\x6b\x6e\x81\xdd\x9f\x25\xc6\x9a" - "\xbf\x1d\x2a\xf0\xee\xf3\x37\xcb\xbb\x97\xf6\xd7\x37\xf1\xee\x02" - "\xe0\xdd\x4b\xfc\xfc\x88\xfa\x26\xde\xbd\xb2\xc8\xda\x2f\x71\x7f" - "\x16\x85\xdc\xc2\x33\xd8\xde\x2f\x1d\x9a\x72\x0b\xc8\xc3\x43\xa5" - "\xb9\x85\x2b\x3d\x95\x39\xf8\x97\x41\x4c\x6e\xe1\x1f\xf2\x1c\x5c" - "\xc7\x70\x70\x4d\x04\xcf\xc1\xcf\x58\x39\xf8\x97\xe5\xd7\x21\xb6" - "\xbc\xfe\x9e\x3a\x0e\xae\xe3\x39\x78\x64\xcb\x70\xf0\xee\x66\xe0" - "\x60\xde\xee\x97\xdb\x96\x15\x02\x07\x87\x21\x07\x8f\x74\x2d\xdf" - "\x70\x9b\xf6\x68\xc1\x7e\xc9\x73\xf1\xe5\xf5\x2c\x17\x5f\x3e\xc8" - "\x5f\x2b\xcb\xc5\x97\xa7\x8b\x5c\x4c\xaf\xbb\xb5\xf9\x86\xcb\xa9" - "\xb7\x36\xdf\x70\x39\x55\xe4\xe2\x2b\x21\xce\xb9\xf8\x97\xa1\xf2" - "\x5c\x0c\xc7\x79\x2e\xfe\x65\xa8\x43\x2e\x7e\x46\xca\xc5\xbf\x36" - "\x69\x5e\x26\xdf\xa0\x6f\xed\x7b\xb7\xfc\xaa\xa8\x7f\x03\x1f\x26" - "\x09\xe7\x3c\x7e\xcd\x2a\x83\x48\xe6\x6a\x12\x49\x28\x33\x3d\x43" - "\xe0\x18\xd8\xef\xd7\x43\x65\x01\x83\x88\xe5\x83\x39\x41\xc8\xc7" - "\x1f\xe2\x1f\x68\xdc\x54\x8d\xf0\x6c\xf1\x36\xfe\x95\xaf\x77\xc5" - "\xe3\xc8\xbd\x5b\x25\xe7\xe5\x7e\x8b\x4b\x9d\x9d\x4b\xbf\x67\x08" - "\xa4\xf3\x6e\x66\xef\xb4\x7e\x46\x6c\xea\x3d\x0c\x3d\xb8\xf5\xb3" - "\x73\x0c\x1d\x66\xe7\xc8\x7d\xbf\xbb\x96\xf8\xb4\x4b\xe4\xb8\x2d" - "\x1b\xb8\xba\xab\xbf\x9f\x1c\x75\x35\x85\x90\xd4\x0d\x9c\xa1\xfe" - "\x3d\x43\x18\xdc\xe3\x8a\x8f\xe0\xba\xab\x1d\x4f\x47\x5d\x4d\x0a" - "\x26\x70\x2c\xca\x7a\x0c\xec\x46\x2c\x49\x9e\x9c\x05\xce\x71\x1b" - "\xfa\x86\x6d\x8d\x03\xae\x5a\x4e\x48\xdf\xeb\xf8\xcc\x18\x12\x00" - "\x33\x7e\x6b\xa1\xcd\x75\xd0\x16\xf7\xc0\x43\x75\x80\x47\xaf\xd2" - "\x15\x04\x9f\xe9\x64\xb8\xaf\xec\xb5\x68\x7b\xcf\xc7\x32\x38\x8d" - "\x17\xb1\x6c\x9f\x54\xc4\xf9\x27\x25\x80\x3f\x48\xea\x02\xc2\xaf" - "\xc9\xba\x0e\xae\xe3\x34\xf1\x9c\xa5\x67\x68\x70\x99\xa9\x8e\x3e" - "\xd3\xd0\xbf\xaf\x20\x8e\xe5\xe0\x77\xb7\x2c\x20\x5a\xf8\xf3\xe5" - "\xd2\x93\x12\xea\xdf\xfb\x0d\xfd\x61\xc0\x7e\x29\xdd\xe3\xba\x4d" - "\x30\xee\x3c\x14\x80\x63\x07\xff\xfb\xf8\xdb\xfc\xef\x68\x2c\xc9" - "\x66\x38\xce\x25\xc5\x73\x65\x31\x26\xd2\x1e\x6c\xb1\x15\xfa\x8d" - "\x78\xb4\xfc\x65\x72\xd4\xbb\x0f\x12\xb2\x6b\x69\xb5\xa6\x0c\xfa" - "\x6e\xfe\xe8\xa1\xba\xc2\xb8\x27\x09\x9c\x37\x60\xcc\x72\xc1\xa3" - "\xd6\x7b\xdc\x45\x42\x90\x4f\xe0\xff\x1d\xea\x60\x1c\x1b\x03\x9f" - "\xd7\xc1\x7d\x58\xae\x06\x78\xe1\xb5\x17\x3c\x7e\xdb\x5f\xb8\xf8" - "\x24\x69\x1f\x45\x7c\xd6\xc2\xbd\xd1\x6b\x7f\x5b\x8d\xd7\xea\x3d" - "\x6a\xb5\xd8\x07\xf8\x9c\x0d\x9f\xf1\x7b\x58\x43\x46\xb8\x9c\x49" - "\x45\x3c\x36\xd3\x92\x12\x2c\x3d\x27\x15\xf1\xdc\x07\xf7\xb9\x0e" - "\xee\x19\xae\xf1\x85\x6b\x7c\xf9\x7f\xe3\x88\x36\x0d\x8e\x61\x3b" - "\xf0\xaf\x6f\xe1\xfc\x46\x6c\x7b\x39\xb6\xad\x60\x07\x2f\xce\x2f" - "\x29\x81\x03\x6c\xe3\x98\x1a\x18\xe7\x71\xf4\x9c\x47\x6d\x7e\x7b" - "\x0f\x8e\xe3\x72\x42\x83\xdf\x8d\x23\xbe\xa9\x16\x42\x0a\x1f\xc4" - "\x76\x6a\x57\x41\xfb\x5e\x68\x8b\xfa\xf7\x6a\x75\x7a\x8f\xdf\xfc" - "\xd0\xbe\xe0\xcf\xba\xc0\xee\xfc\xfd\x16\xe2\xef\xe0\x77\x84\xeb" - "\xf9\xb5\xef\xb1\xcf\x81\x71\x9e\x1c\x7c\xde\xe1\xe9\x71\x96\x78" - "\x06\xb4\xed\x01\xdf\xcf\xd5\x93\x9d\xc7\xf0\xfb\x7a\xfa\x3d\xc0" - "\x52\xed\x3e\xc0\x66\x7f\x3c\x86\x9f\x15\xfa\xeb\x6b\xf5\x5b\x49" - "\x00\x60\xc3\xd6\x77\x56\x8c\x00\x2e\xac\x18\xc1\xfe\x7e\x16\xa7" - "\xd7\xf0\xe3\xb0\xc7\x55\x3e\xae\x5b\x0b\x3e\x34\x6f\x0e\xf0\x5a" - "\x07\xb6\xb5\xdc\x40\xbf\x9c\x83\x73\x75\x1e\xe8\x97\x75\x4b\xc1" - "\x27\xf4\xda\x1e\x62\xff\xf1\x73\x1d\xef\x4f\x0b\xf8\x82\xce\xdd" - "\xbc\x7a\x1c\xef\x67\xdd\x75\xf0\x63\x27\xae\xee\x60\x0c\xf4\x0b" - "\x71\x0b\x18\xd9\xb5\xc0\xa8\xc1\xba\x3e\x3c\xfe\x55\xad\x51\xb3" - "\xee\x12\x41\x5d\x49\xd6\x00\x2f\x67\x2d\x06\x9b\x43\x9b\x5c\x8f" - "\xd0\xe0\x7e\x56\x3f\x2e\x05\xdf\x2d\x06\xec\x82\xcd\xd7\x81\xfd" - "\xb6\x00\xe7\xe1\xff\xb7\xc0\xf8\x63\x81\xeb\xf4\x1e\x75\x5a\x68" - "\x4f\x9b\xd5\x89\x33\x6c\xed\xc4\xd5\x80\x0d\x07\xd5\xbf\x77\xb5" - "\xc6\x6a\x43\xec\xd3\x3a\x38\xbe\x06\xce\xeb\x3d\xae\xea\x28\x86" - "\xae\x0e\xb2\xde\xb3\x92\x3d\x57\xef\x22\x83\xd6\xec\x22\x5d\x52" - "\x76\x91\x21\xcb\xaa\xe0\xb9\x4c\x7a\x8e\xfb\x3e\xcc\x04\x63\xe2" - "\x81\xe4\xc6\x4e\x6f\x46\xe1\xbb\x27\xcb\xbb\x0f\x65\xaf\xdc\x45" - "\x7a\xe3\xdc\xd8\x71\x35\x84\xe0\x18\x3e\xce\xfb\x0c\x57\x16\x75" - "\x8d\x58\x3a\x1c\x48\x36\xbf\xfb\x58\xc7\xb1\xd7\x08\x39\x14\x54" - "\x47\xe2\xa2\x61\x2c\xaf\xad\x26\x71\x75\x9c\xa1\x34\xe1\x22\x01" - "\xee\xc9\xa4\xb6\xbb\xb6\x73\xdc\x2c\x42\x70\xce\xa0\xe5\x97\x20" - "\xd2\x56\x47\xbc\x96\x9f\x20\x01\xf1\x55\x5c\xb5\x79\x43\x4c\x78" - "\x5c\x2c\xd1\xec\xaa\xad\xa0\xda\xd3\xe3\x5a\xec\x7e\x9c\x9f\x5a" - "\x1f\x4a\x5e\x37\x09\xe3\x51\x5a\x52\x72\x7c\x04\xe9\x8c\xf7\xd3" - "\x9e\xd7\x5e\xd7\x3a\x83\xdd\x92\xd5\xf1\x73\x5d\x15\xef\xcf\x0d" - "\x4b\x0c\xbb\x66\x18\x41\xb7\xf6\x4b\x88\x9f\xc5\x55\xa3\xae\x83" - "\xf1\x85\xd7\x82\x65\xd5\x26\xd0\x56\x33\x61\xfc\xd6\x93\xaf\xcf" - "\x65\x6b\x2c\xe9\xfd\x12\xd4\xfd\xc6\xb5\x91\xfc\xb8\x8d\x63\x29" - "\xf4\x3d\x24\x88\x24\xf0\xfd\x87\x31\xb3\x7d\x34\xea\x29\xee\x0c" - "\xf6\xff\x2b\xb8\x57\xae\x5b\xba\x1e\xfa\x54\x8c\xe3\xe7\xb8\xca" - "\x42\x52\x6c\x34\x93\x4d\x97\x78\x1b\xdd\x03\x36\xf2\x82\x73\xd9" - "\x60\x27\x1f\x39\xbf\xa1\xcf\x2c\xa9\x07\x92\x2d\x9e\xd4\x37\xbc" - "\x5f\xea\xa8\x5f\xc6\xbe\x4d\x60\x1c\x05\xdf\xac\xa7\xbe\xb1\xf8" - "\x27\x46\xa1\x6f\xd4\xdd\xc7\x75\xad\xd2\xf8\x82\xbf\xcd\x01\x3e" - "\x10\x17\x16\xbf\xc4\x28\xfc\x6d\xec\x03\xbe\x3f\x43\x1c\x8c\x5b" - "\x79\x86\x2b\x8d\xaa\x26\x65\x70\x3f\x5c\x07\x69\x1f\x4c\x6a\xfb" - "\x90\xa6\xd4\x87\xd5\x7d\x01\xb7\x7d\x01\xb7\x7d\x01\xb7\x7a\x8a" - "\xdb\x23\x95\x14\xb7\x66\xe8\x57\x03\x68\xf7\x65\x21\x44\x83\xfd" - "\xda\x79\x12\xd7\xe8\x83\x7e\x56\x8b\xd8\x1d\x73\x19\x6c\x64\xc5" - "\xaf\xe7\x63\x1d\xd1\x3e\xa5\x75\x15\x24\x1e\xf1\xdb\x28\x87\x5f" - "\xe3\xdc\x71\xa0\x00\x4d\x73\x00\xbf\xff\x0e\x22\xbe\x55\xc4\x2b" - "\x36\x04\xf0\x5b\x2d\x87\x5f\xe3\xb3\xfb\xe0\x37\xed\xf0\x3b\x4b" - "\x8a\xdf\xfa\x13\xea\xf1\x5b\x9f\xd3\x84\xdf\xc9\x02\x7e\x23\x6c" - "\xf0\x5b\x25\xc1\x2f\xde\xb7\x6a\xfc\x1a\x7d\xd4\xe1\xb7\x7e\x75" - "\x13\x7e\x21\x2e\xd9\x34\x9b\xb7\xd1\x3d\x60\x23\xc0\x6f\x7d\x38" - "\xd8\x49\x16\xbf\xb7\xdf\x7f\x8d\xbd\x5d\xf7\x5f\x83\xd9\xb9\xff" - "\x1a\x36\xaa\xf7\x5f\xc3\xcc\x5b\xef\xbf\x86\x22\x75\xfe\x6b\x18" - "\xad\xec\xbf\x86\xc0\x3b\xc7\x7f\x37\x6a\x5c\xf7\xdf\x8d\xfd\xce" - "\xfd\x77\x63\x92\x7a\xff\xdd\xe8\x71\xeb\xfd\x77\x23\x59\x9d\xff" - "\x6e\xf8\x2a\xfb\xaf\x51\xaf\xe4\xbf\x17\x3a\x5b\x38\x0b\xd6\xcd" - "\x75\x9a\x53\x8e\x1a\x88\xea\x35\xd3\x5e\x8c\x19\xe1\xb3\x97\xf5" - "\x33\xaf\xa9\x20\xae\xb6\xf9\xec\x6b\xf3\x59\x6b\xf3\xd9\xcf\xe6" - "\x73\x80\xcd\xe7\x2e\xd6\xcf\xe0\x2f\xef\x2b\x1e\xa6\x5e\x10\xb3" - "\x25\xe8\x3d\x4c\x07\x85\xf3\x3d\x5e\x37\x07\x62\xdc\xd7\x43\xae" - "\xef\xeb\x92\x38\x63\x5b\x0f\xc2\xdd\xd0\x70\x24\x2a\x8e\x3c\x74" - "\xc9\xc3\x3c\xa8\x31\x09\x42\x42\xcf\x07\x83\xb8\xc6\x04\x02\x7e" - "\xd9\x3d\x76\x09\xe0\xcb\x00\x71\x62\x7c\xc0\x3d\xd0\xf6\x03\x60" - "\x37\x43\x69\x94\x01\x74\xf9\xd7\xdc\x39\x0f\x73\x4f\xbc\xcf\xbe" - "\x51\x85\xc4\xe2\xf9\x58\x10\xc7\xaf\xdd\xdc\x6f\xb7\xc1\xf3\xb1" - "\x07\xb9\x6d\x1b\xa2\xd6\x24\x59\x7c\xca\x6a\x8e\x91\xb5\x1a\x4b" - "\xe0\xf2\xe5\xa0\xeb\x6b\x76\x93\x65\x35\x5c\xf5\x72\x13\x67\x2c" - "\x0b\x2b\xc4\xf7\xb6\xd5\x65\x31\x45\xa4\xd4\x70\x8c\xe0\x98\x87" - "\x58\x2d\x33\xec\xa6\xef\x89\xf1\x1a\x38\x56\x6a\xd8\x49\x4a\xe0" - "\x73\xe1\xfc\xf3\x70\x9f\xe6\xe3\x65\x35\x3b\x89\x39\xad\x5f\xbe" - "\xc5\xaf\x5f\x1a\xe7\xd7\x2f\xa3\xa4\x06\xfa\x96\xd6\x2f\x13\xfb" - "\x5a\x0a\xfd\xe0\xf7\xe8\x4c\xef\x97\xc9\xb7\x5b\x57\xce\xe7\x10" - "\xcc\xe9\x70\xbd\x3f\x5c\xef\xdf\x2f\x03\xfb\x87\x7d\x93\x8d\xf7" - "\xd2\x74\x5e\xd0\xf7\x67\x42\x82\xbc\x08\x97\xe8\x15\xa0\x0e\x6f" - "\x66\xa3\x62\x1c\x99\xa6\x5b\x41\xdb\xf5\x71\xa3\x5d\x8b\x62\xfd" - "\x13\x97\x16\x21\xf4\x57\xeb\x4e\xbb\xb9\x0e\xda\x15\xfa\x1b\xe8" - "\x46\xbb\x1c\x51\x6e\x37\x52\xe8\xef\x50\x77\xda\x0d\x75\xd0\xae" - "\xd0\xdf\x04\x77\xda\xcd\x77\xe0\x37\x2f\xb7\xb0\xa0\x21\x5e\x8e" - "\xb0\xe0\x16\x0e\x34\xc4\xc1\xfd\x47\x78\xb9\x85\x01\x0d\x51\xcc" - "\x7f\x23\x06\xdc\xf2\xbf\xc6\xc3\xa1\xff\xdd\xf2\xbd\xc6\x43\x71" - "\xff\x47\xf4\xbd\x5b\x7e\xd7\x78\x28\xe2\x1f\x63\x63\x2e\x6d\x4e" - "\x36\xd7\x29\xbd\xdc\xb2\xe1\xe9\x6c\x4b\xa7\x39\x1f\xbf\x6b\x19" - "\x4a\x5e\x88\x85\x31\x2f\x83\x74\x78\x21\xeb\x0c\x37\x14\x73\x4e" - "\x1a\xcd\xd0\xd8\x4c\xa2\x49\xd5\x58\x34\x79\x4b\x2b\x34\x65\xa6" - "\x41\xc8\x5b\xe6\x9c\xc5\x46\x8f\x47\xe1\xf8\x01\x88\x1e\xeb\x16" - "\x06\x11\xda\xd6\xd3\xd9\x6b\xe3\x86\x92\x71\x66\x82\x39\x8e\xba" - "\xb1\x6f\x9f\xe1\xbe\x59\x0e\x1a\xff\x37\xe0\xd7\x0c\x23\x8e\xa5" - "\x1d\xe0\xbb\x26\xc0\x31\xb4\x63\x24\x9f\x59\x0c\x1e\x63\x0d\xfc" - "\xb5\x06\x88\x47\x0d\xdc\x86\x39\x1f\xe3\x98\xcc\xc5\x07\x91\x15" - "\xf0\x19\x7e\xfb\x73\x4f\x03\xd1\x6c\x81\x58\xb5\x3e\x45\xb3\x53" - "\xaf\xf1\x4c\xc6\xf8\x15\xe2\xe4\x9a\xf8\xdf\x30\x9f\x9f\x5e\xbe" - "\xcb\x62\xd0\xbc\x0b\x71\x33\x5e\xdf\x37\x8a\x68\xbe\x81\xf6\xe0" - "\xda\x8a\x03\xd1\x84\x38\xc8\xe7\x78\x59\xfc\x20\x9a\x84\xef\x63" - "\x3b\x98\x27\x5d\x67\x01\x3b\xfb\x25\x25\x63\xbf\xb9\xb4\x37\x43" - "\x0b\x97\xc2\x98\xa3\xf1\x0c\x1f\xd1\x8b\xab\xc7\x31\x04\xc6\x8e" - "\x07\x2f\xc1\x67\x3e\x1f\x90\xc4\x95\x73\x7e\x7d\x93\xb9\xb5\x6d" - "\x87\x96\xd6\xd5\x92\xc2\xc5\x8d\xe4\x9c\xc6\x73\x3a\xfe\xf6\x55" - "\xbf\x78\x7d\x9d\x5f\x7c\x75\x7d\x8a\x67\x98\xb5\xbf\xf8\x5b\xd6" - "\xe3\x98\xff\xa0\x7d\xf4\x5c\x7e\x60\xb9\x72\x1f\xb9\x77\x1f\xec" - "\x38\x2e\x80\x33\xa0\x2d\x0b\xe3\x6a\xa1\x2f\x5e\xbf\xa1\xbd\xb9" - "\xb4\xf8\xfc\xba\xf8\xa0\x87\xf9\x7c\xa0\xc6\x2b\x00\xf3\x4a\x30" - "\x36\xe4\xd0\x1c\x4f\xbf\x1c\xbe\x86\x07\xb8\x9f\xcb\x09\xd5\xa1" - "\x16\xba\xa2\xf1\xe4\xf3\x81\x21\x41\x1a\x75\xf1\x94\xc6\x93\x8f" - "\x7f\x0b\x1f\x46\x3b\x78\x9d\x80\xdf\xfb\xe3\x39\x8d\xd7\x10\x9a" - "\xe3\xe8\x57\x80\xbf\x07\xd7\x14\xc1\x6f\x16\x70\x69\x7d\x13\xf0" - "\x3a\x38\x1f\x26\x9c\x2f\x94\x9c\x2f\x84\x3e\x1b\x85\xf3\xcb\x85" - "\xf3\x07\x25\xe7\x0f\x46\x3d\x4c\x3c\x2e\x69\xbc\x72\xf0\x9e\x60" - "\xbc\xcb\x86\xf3\xbb\xf1\x7d\x02\x7f\x4f\xfe\xfd\xb2\x85\xeb\x76" - "\xd7\x68\xbc\xf6\x5f\x05\x7c\xc1\xf9\x7d\x92\xef\xef\xfb\x26\xa6" - "\x3f\x79\x21\x0b\x6d\xea\x55\xae\xf7\x7a\x42\xcf\xe7\x89\x34\x9e" - "\xc5\xbc\x2d\x60\xfc\x94\xb6\xa7\xd7\x78\x65\xe2\x18\x59\x07\x3a" - "\x12\xae\xd9\x8d\xbf\x29\xb5\xff\xac\x05\x0b\xde\x5a\x10\xd8\x73" - "\x66\xe0\xcc\x79\xd3\x03\xdf\x78\x6b\xd1\xfc\xe8\x67\x7b\xce\xbc" - "\x8f\x10\x09\x76\xb4\x5c\x52\x7b\xce\x92\xb6\x2c\xa8\x2c\x03\xf4" - "\x9b\x46\x0b\x63\x79\x23\x49\x03\xbf\x9a\x36\xbc\x4f\xcc\x9d\x52" - "\x52\xcd\x1b\xe6\x92\xf8\x6b\x44\x13\x17\xc0\x9d\x2d\x5c\xfa\x3c" - "\xf8\xc0\x3b\x02\x35\x44\x59\x20\x21\xab\x01\xab\x85\x4b\xff\x81" - "\xc7\x12\xf9\xf7\x0d\xe1\xf4\xd8\xff\xc5\x15\x69\xbe\x8e\xab\xd0" - "\x14\x87\xd7\x92\x6f\x02\x0c\xe4\x60\x60\x2d\xc9\xc4\xe3\x96\x72" - "\xfe\xbd\x0f\x5c\x7f\x14\x7f\x0b\x73\x67\xf8\x7f\x3e\x0f\xa8\xf1" - "\x0e\xc1\xdf\x09\x7c\x90\x90\x1a\x8d\xf7\x24\xfc\x3d\xbd\xc6\x3b" - "\xd4\x33\x93\x78\xc0\x73\xe4\x7b\x45\x73\x8f\xbf\x25\x7d\x59\x10" - "\xff\xac\xa7\x78\xfb\x98\x34\x1d\xfb\x6c\xf9\x80\xf8\x6c\xfd\x80" - "\x90\xcc\x8e\xc4\xab\x3e\xe5\x1e\xa2\xf7\x1a\x99\x83\xf6\x82\xa6" - "\x7d\xaf\x6a\xc8\x73\x70\xcc\x4f\x4f\x76\xce\xc5\x63\xf0\x4c\xd5" - "\x29\x71\x07\xbe\x87\x33\xe6\x4c\x4c\xb5\xf8\x2d\x0b\xe0\xc0\x16" - "\xc6\x1e\x13\x0b\xdb\x47\x01\x5e\xe0\xb9\xe1\xfc\x97\x05\xd4\x68" - "\x7c\xb4\xdf\x16\x10\x12\x87\xcf\x29\xd8\xe3\xd3\xeb\x46\x7c\xff" - "\x46\x76\x5e\x37\xc0\xe7\x94\xd4\x1d\x8b\x8d\x9a\x23\xc3\x0b\x48" - "\xe0\x2b\xa0\xb1\x34\xf7\xac\xfa\xd3\x4c\xce\xf4\x58\x30\xe8\xd2" - "\xaa\xbf\x92\xef\x2b\x8b\x88\x6f\x18\xf1\x6c\x5a\x1b\x3e\x9a\x68" - "\xc6\xe9\xe1\xf3\x22\xa2\x29\x35\x9a\xf9\xf7\x00\x71\xc3\x30\x9f" - "\x5f\x42\x30\xc7\xcf\x69\x76\x45\xe7\xd5\x1a\x81\x9f\xaa\xbd\x71" - "\x2e\xb9\x45\xfb\x5d\x32\x7e\xe7\xf5\x3a\xe1\xdd\xd8\x55\xe1\xdd" - "\xd8\x55\xfe\xdd\x58\x0f\x7c\x2f\x86\xef\xc3\x96\x87\x73\x16\xf3" - "\xc2\xa0\x8e\xe3\xc2\x3d\x39\x6c\x13\xdf\x95\xb5\x85\x98\x82\x5b" - "\x18\xd4\x6e\xe3\x02\xe2\x57\x6a\xa8\x26\x65\xd5\x45\x64\xf3\x62" - "\xe2\xc7\x5d\xd5\xb5\x29\x3e\x78\x84\x70\x1f\x7c\x93\xf0\x59\x5c" - "\xa1\xb7\x19\xf3\x29\x57\x03\xee\x6b\x9f\xe8\x81\xef\x05\xda\xad" - "\x5e\x40\x7a\x6f\xad\x25\xfd\x5f\x3f\x9f\xc0\xaf\x13\x85\x7b\xfa" - "\x99\xae\x06\x05\xde\xb8\x1a\xd4\xbd\x71\x61\xd0\xc3\xed\x0d\xf4" - "\x5d\xda\xd4\x08\x2d\xc1\xf7\x65\xdc\x7b\xd7\x43\xb7\x62\x4e\xbb" - "\xce\x40\x4c\x1d\xbe\x4b\x46\x7c\xc2\xef\x76\xc1\xf7\x2f\xf1\x4b" - "\x88\xd6\xf2\x73\x10\x29\xa9\xa9\x25\xfd\x00\x37\xf8\xae\x61\xcb" - "\x39\xfa\xae\xc1\xbc\xfe\x40\x32\xbe\x6f\xa8\x5f\x18\xa4\x19\x73" - "\x19\xc6\xae\x94\x7b\x7a\x37\xf6\x9c\x98\x7a\x28\xe8\x14\x8e\x0f" - "\x03\xc4\xe7\xfe\xde\x53\xee\x3d\xf7\xf7\x56\xe2\xf7\xf0\xfd\x1b" - "\x07\x78\xde\x59\x8b\x7e\x03\xff\xd5\x1a\x34\x2f\x57\x71\xa6\x92" - "\xaa\x4f\xc0\x3f\x15\x8c\x7f\x78\x7f\x2e\x30\x6a\x2e\xcc\x04\xbf" - "\x9c\xa7\xbe\x2a\xae\x03\x3f\x1d\xc0\x36\x12\x02\xf3\xc0\xd7\x10" - "\x4f\x69\x8a\x8d\xa7\xf8\x75\x2e\xd0\x5f\x3b\x1b\x8b\xbc\x1b\xfd" - "\xe6\x64\xe3\x7b\xcc\xfa\x1e\x13\xf3\x1b\xd2\x96\x1a\x6f\xf8\x2d" - "\xf3\x71\xf0\x4e\xb3\x07\xfa\x2b\x36\x82\xf8\x14\x57\x1d\x27\xbc" - "\xcf\xde\x16\x7c\x86\xb5\x6f\xef\x04\xb5\x33\xd5\x07\x75\xdc\x08" - "\xbe\x2a\x8d\xd6\x93\x4d\xb5\xc4\xaf\xac\xba\x02\xdf\xf7\xb4\x79" - "\x79\x3c\x21\x2f\xef\xe0\x2c\x25\x07\x4f\xf2\xfe\xdb\x05\xfe\x33" - "\x81\xff\xf0\x3d\x67\x93\xff\x16\x83\xff\xae\x83\xff\x2e\x8b\xfe" - "\x33\xd7\x83\xff\xea\xc1\x7f\xef\x80\xff\xea\xec\xfc\x57\x89\xef" - "\x42\xf1\x9d\x13\xfa\x0f\xeb\xad\x2d\xef\x04\x75\xe1\xdf\x81\xbe" - "\x11\x44\xb6\xce\x20\x3e\x7d\x8c\xc4\x23\xfe\x00\xd1\x42\x3f\xb5" - "\x7f\x00\xfb\x42\x7b\x80\xef\x73\xa4\xac\xc0\x4c\x96\x4d\x22\x0f" - "\xa3\x3f\x4d\x82\x3f\xcb\x4c\x7b\xc8\xf5\xfa\x20\x0d\xb4\x39\x68" - "\xe3\x75\x32\x64\xf4\xf9\x40\x72\x68\x42\x09\x01\x7f\x14\x59\xd2" - "\xe3\xf3\xdd\x7f\x0e\xef\xcf\x70\xfd\x39\xbc\xaf\xc3\xdd\xe7\xd0" - "\xdd\xe7\xb0\xcd\x6e\xf9\xe7\xf0\xfe\x59\xee\x3d\x87\xf7\xcf\xbc" - "\xfb\x1c\xde\x49\xcf\xe1\xfd\xc1\xb6\xcf\x61\x93\x56\x58\x30\x6b" - "\xde\xf4\x88\xf9\x11\xf3\xe7\x04\xce\x58\x12\x3d\x6b\x21\x55\x0c" - "\x8c\x66\x08\x32\x5b\x86\x6a\x3e\x84\xf1\xf4\xfb\x80\x0a\xf2\xd9" - "\x83\x15\x1a\xcb\x94\x00\x2f\x2e\xf5\x54\xb9\x25\xf5\x74\xf0\x87" - "\xa0\x7f\xf1\x79\x4d\x03\x5d\x7b\x41\xf3\x40\xf4\x77\x5d\x40\xf3" - "\x2d\xb8\x44\xf0\xff\xf4\x9d\xec\x66\x2d\xce\x5b\xcc\xd8\xc0\x55" - "\xe3\xbc\xc5\x23\xc3\x71\xec\x6f\x7b\xed\xfe\x50\x18\xd7\xa7\x04" - "\x90\x86\x29\xa1\x9a\x94\x93\xc4\xa7\x7d\x05\x19\x6d\xb1\x70\x5c" - "\x61\xdc\x25\xd0\x5a\x7e\xfb\x0a\x27\x5f\x22\x81\x4b\x7d\xe0\xda" - "\xdf\x75\x0d\x5c\x9a\x88\xff\x7a\x04\x2e\x7d\xef\xcc\x05\x4d\x47" - "\xbe\x6e\x06\x34\x77\x35\xb7\x61\x69\x94\xf9\x2f\x93\xf4\xf8\xbe" - "\x72\x6b\x27\xae\x6a\x17\x68\xfc\x5d\x8d\x46\xcd\xbb\x0b\xb0\xee" - "\xfb\x11\x0e\xdf\x3b\xe2\x7b\xcd\x77\x6b\x41\xc3\xaf\x10\x72\x3f" - "\xa0\x23\xf0\x79\x59\xbd\x81\xab\xfa\xea\x42\x85\x06\x9f\x9f\x3a" - "\xbf\xbe\x09\x2b\xe0\x3e\xa0\x8f\xfa\x4d\x9d\xb8\x4a\x83\xff\xb2" - "\x20\xaf\x40\xa2\xa9\x4f\x69\x37\x13\x34\x49\x20\xea\x89\x64\x38" - "\x97\x02\xe7\xf8\xf7\x7f\x9a\x0e\xd5\xdc\x7d\x6d\x07\x20\x67\x01" - "\x76\x3d\xae\x68\xda\x7d\xde\x00\xf7\xb8\x9a\xc6\x02\xd5\xc6\xf4" - "\x65\x3e\xa6\xed\x13\xf3\x4d\xa8\xe1\x7a\x4e\x2c\x6c\xf4\x5f\x6a" - "\x34\xa5\x2f\xc3\x3d\x5c\x3c\xe8\xf5\x5a\xbe\xae\xf8\x86\xdf\x5c" - "\x02\xd7\xd7\x5d\xf5\x7b\x9f\x5c\x4d\x4b\x49\x3d\x12\x93\x2f\x70" - "\x59\xbb\x53\x2f\x67\x08\x5c\x96\x01\xcf\x4a\x28\x70\x59\xa8\x3d" - "\x97\xd1\xba\x00\x33\xa1\x9c\x56\x82\x6d\x55\xe1\xb3\x82\xba\x30" - "\x0f\xec\x80\xcf\x01\xe2\x9d\xe7\x36\xe0\x35\xeb\x33\x81\xcf\x0b" - "\xf2\x17\xff\x7c\xda\x3c\x1f\xf8\x4c\xdc\x6f\x20\x5a\x7c\x26\x90" - "\xdf\xf0\x99\xc0\x7a\x9b\x0f\xaf\xd3\x67\xa2\x7d\x25\xd1\xf2\xcf" - "\x85\xa9\x88\x7f\x2e\x30\x26\x28\x36\xd9\x70\x9a\xe4\x99\x58\x63" - "\x7d\x26\xac\x9c\x06\xb8\x37\xe1\x33\xf1\x0e\xfb\x4c\x4c\x39\xa5" - "\x25\x3c\xdf\xbd\x77\xad\x32\x13\x9e\x09\xcc\x61\x99\xad\x9c\x06" - "\xcf\x04\xce\x07\xe2\x39\xed\x4d\x81\xd3\x0c\x70\x1c\x9e\x85\x2d" - "\x91\x2c\xa7\x35\xd4\x3b\xd3\x16\xda\xc1\xee\x71\x9a\x96\x5f\xff" - "\x0d\x7d\x85\x7e\x43\x7f\xa1\x8f\x5a\x93\x7f\x90\xb3\xcc\x5a\x05" - "\xce\x92\xf1\x0f\xe0\xb9\x06\xfe\x6f\xe7\x23\xee\xbd\xba\x1e\x52" - "\xde\x42\xbe\x42\xee\x42\xce\x42\xfe\xc2\xe7\x00\x79\x8b\xe7\x2c" - "\xe0\x73\xf8\x5c\x5d\xa2\x3b\xc7\xf3\x59\xfc\x79\xa2\x8d\x1f\x41" - "\x1e\x46\xfe\x2a\x33\x5d\x23\xc8\x67\xbc\xff\x3a\x88\xfe\x43\xfe" - "\xda\xb4\x98\x0c\x19\x13\x11\x48\x90\xb7\xc0\xf6\x3d\x0e\x05\x1d" - "\x27\x7c\x2c\x90\xe4\xd7\x79\x6b\x47\x88\xbb\x3f\x20\x5e\x69\x1d" - "\x89\x4f\x7d\x4a\x47\x1f\xfb\x38\xa0\x63\x17\x6b\x1c\x80\xcf\x2c" - "\x3e\xbb\x7a\x4d\xbb\x18\x1a\xbf\xc5\x04\xf3\x3e\xd2\x04\xf0\x6b" - "\x04\x60\xdc\x2c\xc6\xcc\x1d\xa7\xd2\x77\xeb\x10\x23\xfb\xbf\x19" - "\xca\xa5\xf7\x4d\x46\xfb\xe1\xfd\xbc\xde\x0b\x70\x96\x1e\xaf\x5f" - "\x87\x36\x49\x87\xf8\x3b\x3d\xbe\x5a\xc4\x54\xc7\x35\x87\xa0\xf5" - "\x90\x18\xb5\x98\xea\xb8\x9a\xef\xc3\xbf\x42\x7f\xc7\x4d\x09\xf5" - "\xb2\xfc\x2b\xd4\x1b\xfc\x1f\xf0\x96\x39\x81\x5c\x4f\xdd\xec\x13" - "\x6f\xe2\xaa\x03\x97\x92\xc7\xa0\x5f\x97\x8f\x40\xf4\x79\x04\x18" - "\xb5\x2c\x78\x2e\xf8\x72\x53\xf2\x67\x16\x83\x97\x5e\xd3\xb6\x0e" - "\x62\xfe\x6a\xe0\x52\x2f\x29\x97\x52\xde\x6c\x5b\xc7\xd7\x75\xa7" - "\x6e\x0e\xc0\xb6\xc6\x15\x91\xf6\x81\x2f\x12\xaf\x0b\x1a\xbf\x35" - "\x4b\x62\x09\xce\x47\xf5\x86\xff\x4f\x6a\xf8\x20\x32\x19\xbe\xdf" - "\x8e\xfb\xd7\x04\x8f\xa8\x17\x61\x3c\x99\x32\xc1\x03\x6b\x09\x3e" - "\x89\xcb\xd0\x58\xe0\x18\xad\x4d\xca\x20\x78\x7e\x75\xa3\x17\xaf" - "\x9b\x2c\x70\x4d\x69\x5d\x06\x59\xbd\xd8\x87\xe0\xf5\xb4\xde\x2d" - "\x83\xe0\xf5\x6b\x16\x68\xf9\x5a\x04\xfe\x7b\xa6\x0c\x82\xdf\x35" - "\xc3\xf1\xf7\x2d\xbe\x64\xed\x52\x3f\x72\x24\xb8\x94\x6f\xe3\x48" - "\xf0\xb7\x04\xdb\x00\x9c\xc3\xff\xbf\x22\xeb\x16\x07\xc0\x73\x9d" - "\x01\xe7\xff\x49\xd6\x5d\xe9\x02\xff\x5e\x80\xbf\xeb\xe4\x92\xe6" - "\x77\xa6\x23\xc1\x16\xd2\x3e\xf1\x39\x0e\xf0\xca\x95\xe1\x1c\xc7" - "\x38\x72\x0f\xf4\xdd\xbb\xac\x22\x15\xc6\xb6\x8e\x35\x38\x07\x9e" - "\x8b\x9f\x52\x63\xe1\xa6\x5c\xb6\xc4\x4f\xb9\x82\xbf\x6d\xe6\xa6" - "\xfc\x8a\xbf\xbd\x66\x69\xa0\x50\xff\x9a\xc1\xd7\xea\xad\xbe\xde" - "\x83\x60\x5f\xf1\x77\xf1\xf7\xd6\x2d\x08\x12\x7e\xb3\x37\xdf\x37" - "\xfc\x4d\x6c\x53\xfa\x9b\xb8\xbf\x7c\xe0\x6b\xfc\x6f\x2e\x81\x7f" - "\x3b\x80\x3f\x0c\xe8\x07\xfc\x7d\x0b\x17\xea\xcd\xc5\x87\x7a\xf2" - "\xdf\x89\xa9\x96\xfb\x4e\x9e\xf0\x1d\x7e\x2d\x1e\xfc\x4e\x23\xbd" - "\x9e\x6f\x03\xc6\xba\xc3\x78\xfc\xf1\xd0\x42\x62\xef\x43\xff\x59" - "\x74\xec\xf3\x1f\x48\xc7\x3e\xea\x53\x1e\x2b\x53\x42\xbd\xc1\x6f" - "\x5a\x1c\x27\xcf\x69\xfc\xdb\x36\xb5\xf1\xaf\x50\x4f\xf4\x37\xe2" - "\xc6\x8a\x25\xc4\x91\x15\x43\x7c\x3f\xa3\x08\x91\x62\x06\xfe\xef" - "\x23\xb4\x13\x62\x6d\x07\xfa\x40\xac\x38\x7a\x1c\xce\xdb\xe3\xe8" - "\x81\x3e\x22\x8e\x3a\x95\x18\xe3\x38\x0e\x71\x54\x38\x39\x09\xdb" - "\xc9\x12\xfb\x33\xc1\x03\x31\xd6\xba\xb0\xf5\x3b\x13\xfa\xe9\xf1" - "\xe5\xc4\x8f\xde\x4f\x27\x7e\xbc\x7e\x7c\x79\xa1\x1f\xf6\xd5\x7a" - "\x1f\xd8\x87\xb5\x96\x40\x62\xbd\x8f\x75\x8d\x3d\xa0\xdd\x2b\x44" - "\xf8\xce\x36\x6c\xdb\x6a\x03\xf0\x19\xb1\x7e\xc7\x7a\xfd\x5a\x4b" - "\x10\xf4\xbb\x37\xff\x1d\x8a\xb9\x0b\x32\xf8\xe9\x74\xd9\x16\x73" - "\xf7\x2f\x27\x20\x5c\x41\x2b\x4d\xae\x85\xdf\x79\xa0\x0d\xed\xdb" - "\xd7\xe6\x46\xf8\x0d\xf0\x81\x46\x38\xde\x4d\x82\x09\xa1\x7d\xa3" - "\x4c\xfb\x0f\x8c\x61\xda\x0f\x85\xf6\x63\xa0\x7d\xd4\x62\x93\x31" - "\xef\xf5\x40\x04\xdf\x4e\x0c\x6d\xdf\x8a\x5b\x2e\x75\x76\x4e\xd4" - "\x52\x72\xef\x25\x4d\x80\x96\xf2\x69\x5b\xde\xe7\x7c\x9d\x92\xc6" - "\x92\x6d\xb1\xa9\x53\x92\xd6\xb1\x7d\x16\x67\xa0\x35\x4a\x9a\x07" - "\xf8\xb9\xad\xc0\xaf\x75\xa8\x29\xf3\x40\x8f\x89\x75\x4a\x27\xf1" - "\x7c\x43\xe1\xe2\x73\x62\x9d\x92\xe6\x81\x62\xbc\x5e\xaf\x09\xe8" - "\x01\xb1\xa3\x06\x3e\xeb\xe9\xf1\xb6\x99\xd2\xe3\x4d\x75\x80\xc2" - "\x71\xac\xb1\x16\xf2\xac\x35\xdf\x14\x60\xae\x2d\x60\x88\x35\xbf" - "\xa9\x10\x9b\xaa\xd0\xbc\xdd\x13\x44\xcd\xdb\x3d\x41\x59\xf3\x06" - "\x5c\x74\xac\x79\x1f\x29\x12\x35\xef\xc3\xbd\xe8\x73\xff\x70\x5b" - "\xfa\xdc\x77\x2d\xe1\x73\xb7\xd0\x9e\xe9\xe3\x74\x03\xf7\x97\xd0" - "\x04\xc4\xf9\x16\xd0\xb0\x9f\x2d\x2e\xd2\xec\x82\xd8\xc8\x0c\x7a" - "\xf7\xdd\xa5\xc4\x0b\xd7\x67\x7b\x17\x6c\x58\x66\xaa\x24\x25\x5e" - "\xa8\x79\x7f\x80\x76\xba\x0e\x2e\xc5\x77\x84\x69\x6f\x86\x53\xbb" - "\x74\x1e\x01\xbe\xf0\x2c\x33\x1a\xf9\xeb\xf0\x1c\x8c\x6b\x55\xa8" - "\x7b\xbf\xb2\x14\x69\xb2\x96\xa2\x26\x4e\x2f\x94\x6a\xe2\xfa\x94" - "\xce\x51\xf2\x5a\xb8\x4b\x9d\x29\x45\xaa\x85\x3b\xef\x47\x2d\x8c" - "\x39\x71\x1c\xf7\x2d\x54\x03\xe7\x83\x1e\x2e\x44\x5d\x8c\x5a\xd8" - "\xc2\x68\xe1\x87\x96\x38\xd6\xc2\x9d\x2f\xde\xd5\xc2\x37\xab\x85" - "\x95\xe2\xfb\x87\x46\xb8\xa7\x85\x1f\x1a\x7e\x57\x0b\xb7\x94\x16" - "\x7e\xa8\xbf\x55\x0b\x5b\x92\xfc\xee\xc9\xfc\x80\x90\x2d\x4d\x5a" - "\xb8\xab\x9f\xbd\x16\xee\x1a\x64\xaf\x85\x3b\xaf\x60\xb5\xf0\xa3" - "\x4f\xd8\x6b\xe1\xae\x11\x4a\x5a\x18\x78\xa8\x06\xb5\x30\xe2\x08" - "\x75\x31\xea\x61\xe8\x5b\x35\xc5\x54\xd7\x8d\xee\x69\xe1\xae\x19" - "\xae\x69\xe1\xae\x0d\xf2\x5a\x38\xa0\x5a\x59\x0b\x07\x54\xcb\x6b" - "\xe1\x47\x36\x8a\x1a\xe6\x91\x59\x77\xbe\x16\x7e\xc4\x47\x5e\xaf" - "\x3c\xd2\x81\x6a\xe1\xae\xc6\xe6\xd7\xc2\x5d\x8d\xf2\x5a\xf8\x91" - "\x95\x54\x37\x74\x35\xd9\x6b\x61\xf8\x8e\xac\x16\x7e\x64\xaf\xf0" - "\x1d\x23\xab\x85\x69\x1b\x30\x06\x1e\x57\xd6\xc2\x81\x6f\xd3\x31" - "\x31\x70\x18\x1d\x13\xa9\x4f\xed\xb5\x70\x60\x67\xe7\x5a\x98\x62" - "\x88\xef\xa7\xa2\x16\x0e\x9c\x6e\xaf\x85\x03\xaa\xe5\xb5\x70\xf7" - "\xc1\x22\x8e\xba\x9d\x60\xb5\x70\xe0\x8e\xd6\xa1\x85\x15\xb1\xe5" - "\xc3\x6a\xe1\x6e\x4b\xd4\x6b\xe1\x6e\x79\xea\xb4\x30\x62\x4e\x4e" - "\x0b\x77\x6b\xb0\xc5\x1c\xab\x85\xbb\xfb\xcb\x6b\xe1\xee\x7d\x58" - "\x2d\x8c\xed\xcb\x69\xe1\xee\x93\x98\xf6\xed\xb4\x70\xf7\x45\xac" - "\x16\xa6\xd7\x89\x5a\xf8\xd1\x2e\x42\x6e\x61\xbd\x7a\x2d\xdc\xdd" - "\xec\x58\x0b\x3f\xea\xcd\x6a\xe1\xee\x15\x54\xf3\x3e\xda\x9f\x6a" - "\xe1\xee\x35\xf4\x78\x40\xaa\xf4\xb8\xa8\x85\xe9\x71\x7b\x2d\xfc" - "\xe8\x48\x27\x5a\x78\x90\xeb\x5a\xb8\xaf\x4f\x51\x93\x16\xee\xeb" - "\x63\xd5\xc2\x16\x0d\x8c\x51\x30\xde\xc3\x5f\x35\xce\x3f\xc0\x67" - "\x0e\xee\xa7\xc1\xb1\x1e\x7e\x7c\xb8\xa8\x87\x7b\xa5\xd3\x67\xbf" - "\xd7\x12\xfa\xec\xf7\x1a\xdc\x94\x03\x06\x2d\x8c\x9a\x58\xc8\x01" - "\x1f\x5b\x0b\x7f\x9f\x2d\x2d\xe2\xf5\xf0\xae\x5a\xa3\x06\x35\xf1" - "\x2a\xb0\x23\xea\xe2\x6f\x04\x4d\x5c\x56\x37\x48\xd0\xc5\x41\xdb" - "\x61\xcc\xd0\xaf\x8d\xe3\xe7\x47\xf9\x40\xff\x2a\x78\x3d\x1c\x6d" - "\x24\xff\x73\x7d\x90\x06\xc6\xbb\x8a\xc2\x38\x7a\x1d\xdc\x67\xa5" - "\xa8\x9f\x7b\xac\x64\xf4\x73\x34\xaf\x9f\x8f\xa1\x7e\xfe\x06\x22" - "\x94\xaf\xe2\xa8\x86\x46\xfd\x8c\x3a\x1a\xf4\x73\x79\x56\x27\xae" - "\xb8\x3e\xa5\xc7\x6e\xab\x86\x5e\x03\x9f\xc1\xd7\xfa\x83\xd9\x84" - "\x64\xcd\x26\x5e\xe0\x93\x8a\x77\xe1\x37\xf0\x7a\xb8\xae\xd2\x7a" - "\x1d\x8c\xd9\xe5\x54\x67\x07\xcd\xb4\x30\x39\xe7\x9e\xbd\x70\xaf" - "\x00\x7e\x3c\x06\x3b\xa0\x9e\xb2\xe6\x9c\x2d\x3d\x27\x16\x72\xfe" - "\x54\x6b\xb3\x79\xe7\xdf\x9f\xb7\x6a\xed\xb5\x82\xd6\x6e\x40\xad" - "\x1d\x65\xd5\xda\x3d\x43\xdc\xd4\xda\xc7\x78\x2d\x37\xb6\xf9\xb5" - "\xdc\xc6\x3b\x40\x6b\xa3\xce\x46\x6d\x8d\x3a\x1b\x75\x37\x6a\x6d" - "\xd4\xdd\x16\x41\x6b\xe3\x5a\x80\x0d\xef\x08\x5a\xfb\x3e\x89\xd6" - "\xf6\x90\x6a\xed\xdf\x7f\xee\x9e\xd6\xfe\x7d\xbe\x54\x6b\x23\xbe" - "\xd5\x6a\x6d\xf4\xb1\xdd\x3b\x4e\xf0\x15\xfa\x09\x7d\xe2\xf0\x5d" - "\x99\xe0\x2f\xf4\x0f\xfa\x06\x7d\xe4\x92\x7f\x00\x5f\xc5\xc6\x96" - "\xd3\xda\x41\x36\x5a\x1b\xb5\x35\xd8\xae\x0a\x35\x77\x59\x21\xd8" - "\xe6\x6d\xd0\xdd\xa0\xb9\x19\xbd\xfd\x8e\x9c\xde\xfe\x7d\x66\x53" - "\xee\x59\xe3\x77\xcf\x16\xcc\x3d\x77\xb4\xea\xed\xa0\x15\xf6\x7a" - "\x3b\x28\x43\xa2\xb7\xcb\xf5\x9a\x1e\x35\xac\xd6\xee\xbb\xd7\x5e" - "\x6b\x07\x1d\x57\xd4\xda\x9d\x64\xb4\xb6\xbf\x55\x6b\xf7\xf2\x76" - "\x4f\x6b\xf7\xf2\x52\xd2\xda\xf5\x5a\xa9\xd6\xee\x35\x4b\xd4\xda" - "\xd1\x12\xad\xfd\xa8\x51\x59\x6b\x3f\x4a\xf7\x39\xd3\x6e\x0e\xc0" - "\xb6\x50\x23\xe1\xbb\xb9\x40\x9c\x97\xae\x79\xdc\x1f\x75\x12\xe6" - "\x1a\xa0\xff\xa0\x95\x1e\x3b\x2b\xd5\xdc\xf8\x4e\xce\x91\x2e\x8a" - "\x9a\x4d\x1e\x46\x6d\x84\xba\xc8\xaa\x63\xf1\x7a\xd4\x47\xb7\x56" - "\x1b\x3d\x96\x20\xaf\x8d\x1e\x5b\xc3\xeb\x5e\x9c\xcf\xa8\xe9\x35" - "\x13\xc7\xb8\xe6\xd5\xde\xbd\x66\xca\x6b\xef\xc7\x3d\xa8\x4e\xe9" - "\xa5\x43\xbf\xb0\xda\x1b\xbe\x23\xab\xbd\x1f\x1f\x28\x7c\x67\x26" - "\xab\xbd\x69\x1b\x30\xde\x8e\x57\xd6\xde\x8f\x5f\xa6\xe3\xef\xe3" - "\xfb\xe9\xf8\x2b\xf8\xd8\x4e\x7b\x3f\x9e\x2e\xd5\xde\xe8\x7f\x7b" - "\xed\x4d\x31\xc5\xf7\x53\x51\x7b\x3f\x7e\xca\x5e\x7b\x3f\x6a\x44" - "\xed\x2d\x8f\xab\x3e\x07\x58\x5c\xf5\x99\x6e\xb4\x58\x35\x78\x0a" - "\xb4\xd7\xbb\x8f\xad\x06\x6f\x85\x58\x4b\x10\x75\x38\xde\x53\x1f" - "\x0f\x75\x3a\x9c\xff\xce\x40\x75\x3a\x1c\xf1\x27\xa7\xc3\xfb\x24" - "\xda\xe2\x8f\xd5\xe1\x7d\xb2\xe4\x75\x78\x9f\x3d\xac\x0e\xc7\xf6" - "\xe5\x74\x78\x9f\xb3\x4c\xfb\x76\x3a\xbc\x8f\x99\xd5\xe1\xf4\x3a" - "\x51\x87\xf7\xcd\x11\xf2\x1a\x6e\xe4\xa4\xfb\xae\x74\xac\xc3\xfb" - "\xae\x61\x75\x78\xdf\x70\xaa\xb7\xfb\x16\x18\x79\x1d\xde\x37\x9a" - "\x1e\x7f\x34\x53\x7a\x5c\xd4\xe1\xf4\xb8\x51\xaa\xc3\x0b\x51\x87" - "\xf7\x2d\x77\xa2\xc3\x87\xba\xae\xc3\x07\x57\x88\x3a\x7c\x70\x85" - "\x63\x1d\xde\x2f\xd1\xb1\x0e\x7f\xda\x4f\xd4\xe1\x03\x85\xf7\x51" - "\x03\x47\x51\x1e\x18\xd8\xc6\x9a\x97\x46\x1d\x6e\xee\x9e\x6e\x10" - "\xf2\xd2\x45\xbb\x16\x97\x6b\x3e\xb3\xe6\xa5\x17\x80\xbe\x36\x10" - "\x9f\x55\xb5\x84\xa0\x06\xc7\x5a\x8c\x62\xe3\x20\xa1\x1e\x63\xc0" - "\xa2\x4c\xd4\xe0\x17\xe0\x9a\x2a\xd0\xe0\xa0\xa3\xff\xa7\x71\x90" - "\x06\xee\xa7\x82\xb9\x76\x71\xd3\xb5\x95\xd6\x6b\x51\x7b\xc3\xf5" - "\xc5\xa5\xa0\xc3\xf1\x3b\xf0\xfc\x17\x17\x63\x9d\x47\xdc\x11\xfe" - "\x5a\x68\xa3\x5c\xd4\xec\xfd\x07\xf3\x9a\xdd\x20\x68\x76\xf8\x0e" - "\x68\x94\xa2\x26\xcd\xde\x58\xae\x49\xad\x65\x34\xfb\xc1\xfa\x94" - "\xfe\x4d\xf5\x1f\xeb\x04\xad\x9e\x6a\xe1\xb5\xfa\x31\xd0\xea\x15" - "\x54\xab\xf7\x4f\xb6\x5e\x03\x98\xa9\xe4\xaf\xb9\xc0\x5f\x53\x0c" - "\xd7\x94\x0b\xd7\xec\x94\xe8\xf9\x83\x54\xcf\x0f\x18\xc0\xea\xf9" - "\xfe\x0d\xa8\xe7\xad\x79\x73\xd4\x2a\xd2\xdc\xb9\xc5\x5f\x2e\x77" - "\xfe\xe4\x1e\xdb\xdc\x79\x03\x93\x3b\x7f\xa2\xa7\x1a\x3d\x0f\xbf" - "\x59\x64\xd5\x8c\x2d\xa9\x17\xef\x24\x3d\x6f\x91\xe4\xce\x2d\x4c" - "\xee\xfc\xc9\x44\xf7\xf4\xfc\x93\x09\x52\x3d\xdf\xe0\x5e\xee\xbc" - "\xa8\x25\xe3\xad\xd6\xad\xe7\x9f\x9c\x2b\xcd\x9f\xa3\x9e\x17\xf3" - "\xe7\x03\x26\xd8\xeb\xf9\x01\x3a\x89\x9e\x3f\xa8\xd7\xf4\xdf\xc7" - "\xea\xf9\x67\x56\xd9\xeb\xf9\x01\xdb\xdd\xd3\xf3\x03\x8e\xbb\xa7" - "\xe7\x07\x1c\x73\x4d\xcf\x0f\x1c\x28\xaf\xe7\xfb\x25\x28\xeb\xf9" - "\x7e\x3c\x5e\x2d\xa9\xa2\xee\xc2\xf7\x8e\x81\x8b\x51\x77\x3d\x75" - "\x9e\xd7\x5d\x54\x87\x81\xee\x7a\xea\xf3\xd6\xa1\xe7\x9f\x0a\x96" - "\xd7\x58\x4f\x4d\x15\xf5\xfc\xc0\x01\xcd\xaf\xe7\x07\x0e\x90\xd7" - "\xf3\x4f\x1d\xa5\x7a\x67\xe0\x20\x7b\x3d\x0f\xdf\x91\xd5\xf3\x4f" - "\x7b\x0b\xdf\x19\xc0\xea\x79\xda\x06\x8c\xdb\xe2\xfb\x7f\x3b\x9f" - "\x3e\xbd\x9f\x8e\xe3\x4f\xaf\xa1\xe3\x38\xf5\xb1\xbd\x9e\x7f\x7a" - "\x96\x73\x3d\x4f\x31\xc5\xf7\x53\x51\xcf\x3f\x9d\x67\xaf\xe7\xfb" - "\x25\xa0\x9e\x97\xc7\xd5\xe0\xf5\x2c\xae\x06\x3f\xc1\xea\xf9\xa7" - "\xcd\xad\x47\xcf\x2b\x62\x2d\x98\xd5\xf3\x83\x8e\xaa\xd7\xf3\x83" - "\xbd\xd5\xe9\x79\xc4\x9f\x9c\x9e\x1f\x3c\xde\x16\x7f\xac\x9e\x1f" - "\x3c\x4f\x5e\xcf\x0f\x5e\xc9\xea\x79\x6c\x5f\x4e\xcf\x0f\xfe\x9c" - "\x69\xdf\x4e\xcf\x0f\x2e\x61\xf5\x3c\xbd\x4e\xd4\xf3\xcf\x44\x53" - "\xae\xed\xd7\x53\xbd\x9e\x7f\x26\xc4\xb1\x9e\x7f\x66\x2a\xab\xe7" - "\x9f\xe9\x4f\x75\xfb\x33\xc9\x54\xcf\x3f\x33\x9c\x1e\xef\xd7\x43" - "\x7a\x5c\xd4\xf3\xf4\xb8\xbd\x9e\x7f\x26\xdb\x89\x9e\xf7\x35\xe5" - "\x4c\xcc\x6f\xec\x31\xb1\xf0\x86\x5f\x8a\xfe\xf1\xaa\xe7\xcc\x4d" - "\xeb\xf4\x87\xc3\xb8\x5f\x09\x3a\x60\x3a\xd1\xe0\x5c\xf7\xb8\xa3" - "\x30\xbe\x4f\xa7\x75\xf0\x38\xc6\x63\xbd\x47\xde\xd2\x42\x6f\x5c" - "\x57\xb0\x31\x6d\x4e\xb6\xa9\xf7\xe4\x72\x1c\xeb\x1b\x72\x26\xa6" - "\x1a\xd3\x96\x1a\x1b\xb0\x06\x7e\x2e\xd1\xbc\x5e\x23\xaf\xd3\x96" - "\x55\x72\x16\xc0\xbc\xcf\xb8\x30\xaa\xd1\x4a\x74\xe7\x79\x1c\xe3" - "\xf8\x8f\xf3\x14\xca\xea\x2a\x78\x3d\xe0\x1b\x3e\x94\x64\xc6\x11" - "\xbf\xb6\x35\x44\xdb\xd6\xc3\xe3\x9e\x97\x8f\x13\x62\x06\x2d\x30" - "\xa2\x17\x67\x79\x7c\xe6\x50\x5c\xdb\xa6\x1d\xd5\x03\x05\xde\x26" - "\x41\x0f\xbc\x7f\x9d\xf4\xce\x5a\x0c\x3a\xa0\x44\xd4\x01\x0d\x56" - "\x9d\x26\xd1\x00\x53\x2f\x6b\x49\x56\x12\x5b\x03\x7f\x63\xbd\xa8" - "\x01\x70\xfc\xe7\x5e\x0f\x22\xfd\x8c\xb4\xb6\x61\xe9\x78\x5a\x03" - "\xdf\xbb\x8a\x68\xb6\x4e\x23\x3e\xc5\xe1\xe7\x70\xee\x78\x40\x71" - "\xd5\x76\xb2\x64\x14\x79\xd8\x84\x63\x7e\x12\x97\x5f\x5c\x95\x4e" - "\x70\xdd\x3e\xd0\x7e\x83\x32\xae\x93\x21\x38\xce\x8e\x9e\x4e\xc7" - "\x7e\x3a\xc6\x0e\x19\x7c\x28\xe8\x10\x51\xaf\xdb\x86\xf0\xf5\xbf" - "\x8a\xf3\x51\x73\x26\x16\x9a\x7a\x4c\x4c\x35\x83\x2f\xe9\x7a\x8d" - "\x09\x81\x96\x8f\x3f\x22\xbb\x00\x87\x9f\x9e\xab\xf6\xc0\xb5\xa7" - "\x71\x1f\x46\xcb\xce\xc9\xe5\x8c\x6f\x6e\x08\xbe\xb9\x41\x7d\x83" - "\x7e\x99\x16\x45\x70\x9d\xbf\x76\xe8\x93\x32\x63\x05\xb1\x2c\xb3" - "\xee\xc5\xd8\x9f\x6c\xb1\x50\x7f\x98\x6f\xe8\xda\x58\xc0\xf6\xb8" - "\x9e\x15\xe0\x81\xd7\x63\xab\x71\x7f\xc6\x44\x8f\xb6\xa8\xc7\x00" - "\xdf\xf7\x6d\x6d\x04\x3f\x9c\xa5\x7e\xe0\x92\xb4\xfc\xbf\x26\x08" - "\x37\xa0\xed\xee\x37\x6e\x80\x2f\x8c\x76\xbe\x08\xc5\x7d\x1c\x71" - "\xad\x39\xd3\x7a\xba\x9e\x1e\xef\x8b\x65\x41\x5d\x70\x2d\x0a\x7e" - "\x1e\xc9\x8d\x20\xe4\x4b\xed\x96\x0b\x38\xff\x85\xfa\xc0\x2c\xd8" - "\x1e\xf7\x74\x44\x7b\xa3\xd6\x2a\x03\x8d\xc5\xcf\xeb\x48\x79\x66" - "\xf7\x8d\xed\x13\x53\xb1\xee\xe4\x8a\xe6\xd9\x3d\xee\xe9\x9b\x67" - "\x77\xb7\xbc\xed\x03\x5b\xa1\xed\x87\x24\x88\xb6\x7f\xee\x09\xf7" - "\x6c\xff\x5c\xff\x96\xb7\xbd\xb6\x15\xda\xfe\x59\x93\x68\xfb\xa1" - "\x79\xee\xd9\x7e\xa8\xe2\xfc\x7f\xb4\x3d\xe6\x83\xac\xb9\x20\x6b" - "\x1e\x08\xc7\x38\x1a\x83\x8c\x9c\x29\xd6\x25\x8e\x9c\x29\xad\x4b" - "\xfc\xfe\x20\xe6\x48\xac\x75\x89\xc3\x9c\xe4\x7f\x46\xec\x14\xf3" - "\x3f\xc3\xdb\x52\xdd\xf8\xc2\x6f\x54\x37\xbe\xc0\xbf\xd3\x8a\x3d" - "\x45\x34\xa6\xdf\x4f\xd2\xef\x9a\x5f\xa8\xc1\x39\x39\xbb\xae\x18" - "\x35\xab\x6b\x41\x07\x6a\x1e\xe1\x30\xef\xb3\x66\x01\xd6\x23\xd6" - "\x11\xd0\x60\x8f\x5c\xd2\xbc\xd0\x0b\xd7\xef\xfa\xea\x4a\x21\x9f" - "\x6f\xe1\xba\x7f\x44\x76\x3e\x68\xf0\xc0\xb1\x6d\xd7\x7c\xa3\xc6" - "\x8a\x17\xeb\xdc\x3b\xb0\x61\xa1\xd9\x3f\x45\x7f\x75\xfb\xc4\x7c" - "\x6b\xfd\xa0\x29\x6f\x72\xb9\x2c\x86\x70\x4e\x1f\xe0\x08\x31\x83" - "\x73\xf0\xac\x78\x42\x1c\x95\x1a\xab\x09\xee\x4f\xd3\xbe\x1a\xe2" - "\x7d\xc0\xd0\x94\x1d\xe0\x5f\x29\x8e\x52\x15\x70\xb4\x91\xc5\xd1" - "\x55\x01\x47\x80\x27\x11\x47\x4d\xf3\xb9\xae\x55\xaa\xc2\x51\x8d" - "\x80\xa3\xf5\x36\x38\xba\x1c\x48\xbe\xaf\x3c\x25\xe0\xe8\xb9\x18" - "\x53\x4f\x2b\x8e\x9e\xbf\x76\x28\x0c\x70\x14\xa6\x16\x47\xcf\xd7" - "\xb1\x31\xeb\xa8\x0e\xf6\x31\xeb\x0b\x93\x6c\x63\x56\x6b\x8c\x7a" - "\xd5\x3f\x5e\x7f\x15\xe2\xd4\xba\xa6\x38\xf5\x85\x58\xf7\xf0\xfc" - "\xc2\x72\xd7\x6a\xbc\x5e\x38\x65\x5b\xe3\xf5\x29\x1f\xa7\x0e\x5b" - "\x81\x58\x93\x8f\x53\xe9\x39\xfb\xda\x9c\x11\xb1\x62\x6d\xce\x88" - "\x51\x77\x7e\x8d\xd7\xf0\x1a\xf9\x78\x61\xf8\x35\x5a\xe3\xf5\x42" - "\x65\xf3\xd7\x78\xbd\x50\x29\x1f\x97\x8e\x88\xa0\xba\xfd\x05\xbd" - "\x7d\x8d\x17\x7c\x47\x36\x2e\x1d\x91\x25\x7c\xa7\x92\x8d\x4b\x69" - "\x1b\xc0\x27\x7b\x95\xe3\xd2\x17\x43\x28\xbf\xbc\xd8\x93\xf2\x0b" - "\xf5\xa9\x7d\x5c\x3a\xc2\x2c\x8d\x4b\xe5\x6b\xbc\x28\x86\xf8\x7e" - "\x2a\xc6\xa5\x2f\x8e\xb0\x8f\x4b\x87\x25\xc8\xd7\x78\x8d\xec\x2a" - "\xe2\xe8\xa5\xfd\x6c\x8d\xd7\x8b\x6b\x5a\x47\x8d\x97\x22\xb6\x6a" - "\xd8\x1a\xaf\x97\xa6\xaa\xaf\xf1\x7a\x69\xbd\xba\x58\x14\x31\x27" - "\x17\x8b\xbe\x74\xca\x16\x73\x6c\x2c\xfa\x52\x83\x7c\x2c\x3a\xb2" - "\x03\x1b\x8b\x62\xfb\x72\xb1\xe8\xc8\x67\x99\xf6\xed\x62\xd1\x91" - "\x93\xd8\x58\x94\x5e\x27\xc6\xa2\x23\x4d\x94\x43\x87\xf5\x52\x1f" - "\x8b\x8e\xe4\xdf\x6b\xe6\x6d\xa2\xef\x6e\xd8\x38\x74\xe4\x79\x36" - "\x0e\x1d\x59\x40\xe3\xcd\x51\x5a\x5a\xdf\x35\xb2\x98\x1e\x1f\x16" - "\x24\x3d\x2e\xc6\xa1\xf4\x38\xd6\x77\xd1\xba\xae\x51\x81\xea\xe2" - "\xcf\x7e\x77\x60\xfc\xd9\xdf\x41\xfc\xd9\xbf\x95\xc6\x9f\x2f\xef" - "\x75\x2f\xfe\x7c\xb9\xa0\xe5\x75\x78\x6b\x8c\x81\x46\x0d\x10\x75" - "\xf8\xe8\x81\xee\xe9\x96\xd1\x03\x5a\xde\xf6\xad\x31\x06\xfa\x13" - "\x11\x6d\x3f\xe6\x73\xf7\x6c\x3f\x46\x71\xfd\x37\xe7\x31\x50\x88" - "\x4e\x8c\x81\x42\x74\xca\x31\xd0\xd8\x95\x8e\x63\xa0\x57\xf2\xc5" - "\x18\x68\x7c\x07\xaa\x51\x82\xaf\x51\x8d\x12\xbc\x47\x7d\x0c\x14" - "\xdc\xe7\x6e\x0c\xa4\x26\x06\x1a\xbd\x5c\x8c\x81\xc6\x35\xb8\x17" - "\x03\x8d\x33\xb2\x31\xd0\x6b\xfe\xf6\x31\x50\xb0\xdd\xfc\x6f\xe5" - "\x18\x28\x38\xd1\x3d\x3c\x07\x27\xb8\x16\x03\x05\x9f\x95\x8f\x81" - "\xc6\x26\x2b\xc7\x40\xf4\x9c\xbd\x76\x7d\x25\x51\xd4\xae\xaf\x8c" - "\xb9\xf3\x63\xa0\xf1\x06\x79\x9d\x3a\xbe\x81\xc6\x40\xc1\xfa\xe6" - "\x8f\x81\x82\xf5\xf2\x31\xd0\x2b\xf3\xa8\x5e\x0c\xae\xb2\x8f\x81" - "\xe0\x3b\xb2\x31\xd0\x2b\xdb\x84\xef\xe8\xd9\x18\x88\xb6\x01\x7c" - "\xb2\x5f\x39\x06\x7a\x75\x12\xe5\x97\x57\x7b\x51\x7e\xa1\x3e\xb5" - "\x8f\x81\x5e\xf5\x70\x1e\x03\x51\x0c\xf1\xfd\x54\x8c\x81\x5e\x1d" - "\x65\x1f\x03\x8d\x5d\x21\x1f\x03\x85\x74\x13\x71\x34\xe1\x00\x1b" - "\x03\xbd\xba\xbe\x75\xc4\x40\x8a\xd8\x32\xb0\x31\xd0\x84\xe9\xea" - "\x63\xa0\x09\xe9\xea\x62\x20\xc4\x9c\x5c\x0c\x34\xe1\xac\x2d\xe6" - "\xd8\x18\x68\x82\x59\x3e\x06\x0a\xf1\x67\x63\x20\x6c\x5f\x2e\x06" - "\x0a\x19\xc6\xb4\x6f\x17\x03\x85\x4c\x65\x63\x20\x7a\x9d\x18\x03" - "\xbd\x46\x28\x87\x8e\xed\xa3\x3e\x06\x0a\x39\xab\x1c\x03\x85\x5c" - "\x64\x63\xa0\x90\x7d\x34\xd6\x79\xcd\x8f\xc6\x40\x21\xe5\xf4\xf8" - "\xd8\xde\xd2\xe3\x62\x0c\x44\x8f\x8b\x31\xd0\x6b\x3d\xd4\xc5\x40" - "\x8f\xdc\x81\x31\x50\xa0\x83\x18\x28\xb0\x95\xc6\x40\x13\xf7\xbb" - "\x17\x03\x4d\xdc\x77\x57\x87\xbb\xa3\xc3\x5f\x1b\x24\xea\xf0\x49" - "\x83\xdd\xd3\x2d\x93\x1c\xbe\xff\x74\xac\xc3\xc3\x0d\xa2\x0e\x0f" - "\x37\x28\xeb\xf0\xc9\x6d\x1d\xeb\xf0\x69\x83\x44\x1d\x1e\xb6\x91" - "\x8e\x93\x61\xb1\x74\x9c\x0c\x7b\x56\xbd\x0e\x9f\xb2\xe7\xae\x0e" - "\x57\xa3\xc3\x43\xbd\x44\x1d\x3e\x25\xd1\x3d\x1d\x3e\x25\x81\xd5" - "\xe1\xd3\xb3\xec\x75\xf8\x94\xf3\xae\xeb\xf0\xb0\x36\xee\xe1\x39" - "\xcc\xc7\x35\x1d\x1e\x16\x21\xaf\xc3\x27\x6b\x95\x75\x38\x3d\x67" - "\xaf\x9f\xa6\xb5\x11\xf5\xd3\xd4\xe3\x77\xbe\x0e\x9f\x1a\x23\xaf" - "\x95\xa6\x26\x52\x1d\x1e\xa6\x6b\x7e\x1d\x1e\xa6\x93\xd7\xe1\x53" - "\xaf\x51\xcd\x12\x36\xd7\x5e\x87\xc3\x77\x64\x75\xf8\xb4\x5e\xc2" - "\x77\x74\xac\x0e\xa7\x6d\x00\x9f\x8c\x50\xd6\xe1\xd3\xce\x52\x7e" - "\x99\xf6\x39\xe5\x17\xea\x53\x7b\x1d\x3e\x6d\x95\x73\x1d\x4e\x31" - "\xc4\xf7\x53\x51\x87\x4f\x3b\x6a\xaf\xc3\x27\xfb\xca\xeb\xf0\xf0" - "\x1d\x22\x8e\xc2\x47\xb1\x3a\xfc\xf5\xce\xad\x43\x87\x2b\x62\x2b" - "\x86\xd5\xe1\xaf\x5f\x54\xaf\xc3\xc3\xbb\xaa\xd3\xe1\x88\x39\x39" - "\x1d\x1e\x1e\x61\x8b\x39\x56\x87\x87\xaf\x94\xd7\xe1\xe1\x59\xac" - "\x0e\xc7\xf6\xe5\x74\x78\xf8\x61\xa6\x7d\x3b\x1d\x1e\x7e\x9e\xd5" - "\xe1\xf4\x3a\x51\x87\x4f\x4f\xa6\x1c\x3a\x69\x8f\x7a\x1d\x3e\x3d" - "\x42\x59\x87\x4f\x7f\x9b\xd5\xe1\xd3\x87\x53\xbd\x3d\x3d\x93\xea" - "\xf0\xe9\xa1\xf4\xf8\xa4\xdd\xd2\xe3\xa2\x0e\xa7\xc7\x45\x1d\x3e" - "\x7d\xa7\x3a\x1d\xde\xfe\x0e\xd4\xe1\x5a\x07\x3a\x5c\xdb\x4a\x75" - "\xf8\x1b\x23\xdc\xd3\xe1\x6f\x28\xee\xff\xe9\x5c\x0b\x46\x9a\x44" - "\x2d\x18\x69\x52\xd6\x82\x33\x3b\x3b\xd6\x82\x3a\xc9\xfa\x00\xb3" - "\xb7\x53\xae\x9e\xbd\x8a\x72\xf5\xec\x51\xea\xb5\xe0\xac\x03\x77" - "\xb5\xa0\x1a\x2d\x38\xbd\x50\xd4\x82\xb3\xd6\xb8\xa7\x05\x67\xad" - "\x66\xb5\xe0\x9b\x3b\xec\xb5\xe0\xac\xdf\x5c\xd7\x82\xb3\xfd\xdd" - "\xd3\x82\xb3\xfd\x5c\xd3\x82\xb3\x17\xc9\x6b\xc1\x99\x5d\x94\xb5" - "\x20\x3d\x67\x3f\x86\xeb\xfc\xc5\x31\x7c\xce\xd9\x3b\x5f\x0b\xce" - "\x59\x21\x3f\x5e\xcf\x59\x43\xb5\xe0\xec\xe8\xe6\xd7\x82\xb3\xa3" - "\xe5\xb5\xa0\x4e\x98\xff\x3c\x3b\xc6\x5e\x0b\xc2\x77\x64\xb5\xa0" - "\x4e\x98\xff\x3c\x3b\x9a\xd5\x82\xb4\x0d\xe0\x13\x07\xf3\x9f\x75" - "\xc2\xfc\x67\x9d\x30\xff\x99\xfa\xd4\x5e\x0b\xea\xd2\x9d\x6b\x41" - "\x8a\x21\xbe\x9f\x8a\x5a\x50\x27\x33\xff\x79\x66\x80\xbc\x16\x8c" - "\xdc\x23\xe2\x28\x32\x84\xd5\x82\x11\x3d\x5b\x87\x16\x54\xc4\xd6" - "\x0a\x56\x0b\x46\x5c\x53\xaf\x05\x23\x7b\xa9\xd3\x82\x88\x39\x39" - "\x2d\x18\xb9\xc8\x16\x73\xac\x16\x8c\x5c\x2f\xaf\x05\x23\x77\xb0" - "\x5a\x10\xdb\x97\xd3\x82\x91\xc7\x99\xf6\xed\xb4\x60\xe4\x6f\xac" - "\x16\xa4\xd7\x89\x5a\xf0\xcd\x34\xca\xa1\x6f\x1c\x50\xaf\x05\xdf" - "\x5c\xa4\xac\x05\xdf\x8c\x65\xb5\xe0\x9b\xc1\x54\xf3\xbd\x99\x4b" - "\xb5\xe0\x9b\x33\xe9\xf1\x37\x0a\xa5\xc7\x45\x2d\x48\x8f\x8b\x5a" - "\xf0\xcd\x02\x67\x5a\xd0\xb1\x7e\x58\x38\x41\xd4\x0f\x0b\x27\x48" - "\xf5\xc3\x61\x46\x3f\xcc\x9d\xe4\x58\x3f\x44\x65\x8a\xfa\x61\xbe" - "\x99\x3e\xdf\xf3\xcf\xd2\xe7\x7b\xfe\x36\x5e\x3f\x8c\x81\x71\x1e" - "\xf4\x43\xde\xa5\x7c\xaa\x1f\x2e\x19\x35\xef\x5f\x11\xf4\x43\x0d" - "\xf1\x59\x3d\x5f\xd0\x0f\xd3\x50\x3f\xcc\xef\x8c\xfa\xc1\x37\x13" - "\xb4\x6a\x95\xa0\x5d\xa3\x40\xbb\x56\xc1\x67\x78\x76\xbe\x82\x36" - "\x4a\x41\x5f\xa6\xe2\xf7\x71\x3f\x03\x68\x8b\x9f\x97\xc9\xcf\xd9" - "\xd4\x7b\xe3\x3e\x39\xa8\x2d\x70\xdf\x09\xa7\x7b\x4e\x54\x09\x7b" - "\x4e\xcc\x64\xf7\x9c\xc0\xbd\x26\x70\xdf\x89\xcc\x05\xc4\x6f\xb3" - "\xa0\x29\xda\x25\x7a\xb4\xc3\x7d\x27\xda\xd5\x51\x7d\x9a\x67\x29" - "\xa2\xfa\x74\x61\xc0\x7d\xa0\x85\x7a\x6f\xa9\x15\xb5\xc4\x87\xa8" - "\x23\x16\x06\x05\xd6\x2d\x0c\x7a\xf8\xea\xd5\xa0\xee\xf6\xfb\x4d" - "\xd4\xf5\xc0\xf5\xf2\xcb\x62\x2a\x78\x1d\xc1\xef\x53\x30\x27\x88" - "\x6c\x9d\x4d\x7c\x40\x17\x7b\xf4\x05\x7d\xfa\x87\x2e\xd0\xf7\x12" - "\xa2\x35\x5f\x0d\xea\x22\x5d\xdb\x10\xfa\xae\xb5\x5c\x0d\x22\xc5" - "\xe1\x27\xf9\x39\x9a\x26\x61\x8e\xa6\x61\x61\x10\xae\xc1\x3f\x68" - "\xd3\x02\x89\x3e\xf5\xb7\xea\xd3\x79\xe7\xdd\xd3\xa7\xf3\xaa\x58" - "\x5d\x11\xed\x61\xaf\x2b\xe6\x8f\x72\x5d\x57\xcc\x9f\xe7\x9e\xae" - "\x98\x3f\xd7\x35\x5d\x31\xbf\xc4\x56\x57\xec\xe0\x75\xc5\xdc\x30" - "\xc4\xa0\xbc\xae\xa0\xe7\xec\xc7\x83\xa8\x79\xe2\x78\x10\x35\xf8" - "\xce\xd7\x15\x6f\x55\xca\x73\xff\x5b\xe7\xa9\xae\x98\x5f\xdc\xfc" - "\xba\x62\x7e\xb1\xbc\xae\x88\x12\xd6\x7f\x9b\x5f\x6e\xaf\x2b\xe0" - "\x3b\xb2\xba\x22\x6a\x8d\xf0\x9d\x62\x56\x57\xd0\x36\x80\x67\x76" - "\x28\xeb\x8a\xb7\x47\x50\xde\x79\xdb\x9f\xf2\x0e\xf5\xa9\xbd\xae" - "\x88\xba\xec\x5c\x57\x50\x0c\xf1\xfd\x54\xd4\x15\x6f\x0f\xb4\xd7" - "\x15\x73\x43\xe5\x75\xc5\xc2\xb6\x22\x8e\x16\xe4\xb1\xba\xe2\xed" - "\xd8\xd6\xa1\x2b\x14\xb1\x55\xc9\xea\x8a\x05\x63\xd4\xeb\x8a\x05" - "\x89\xea\x74\x05\x62\x4e\x4e\x57\x2c\x28\xb1\xc5\x1c\xab\x2b\x16" - "\x5c\x94\xd7\x15\x0b\x3d\x58\x5d\x81\xed\xcb\xe9\x8a\x85\x7d\x98" - "\xf6\xed\x74\xc5\xc2\x51\xac\xae\xa0\xd7\x89\xba\x62\x61\x0d\xe5" - "\xd0\xb9\x1e\xea\x75\xc5\xc2\x12\x65\x5d\xb1\xf0\x38\xab\x2b\x16" - "\xe6\x52\xfd\x10\x4d\xa8\xae\x58\xb8\x8f\x1e\x47\x0a\x15\x8f\x8b" - "\xba\x82\x1e\x17\x75\x45\xb4\xf6\xee\x7c\xcb\x3b\x31\xc7\xb4\x68" - "\x87\x7b\x63\xf8\x22\xc7\xfb\x7f\xde\x9d\x6f\xa9\xf0\xae\x37\xba" - "\x87\xf8\xae\xf7\x9d\x9e\xee\xe9\x96\x77\x7a\xb4\xbc\xed\x5b\x63" - "\xad\xf1\x22\x83\x68\xfb\x98\x6d\xee\xd9\x3e\x26\xbb\xe5\x6d\xdf" - "\x1a\x6b\x1c\xde\x99\x2b\xda\x7e\x69\x57\xf7\x6c\xbf\xb4\x8b\xfb" - "\x79\xed\x44\x49\x8d\x43\xa2\x41\x39\x2e\x5d\xfa\x9b\xe3\xb8\x34" - "\x5e\x52\xe3\x10\x2b\xd4\x38\xc4\x0a\x35\x0e\xb1\x7c\x8d\x43\x1c" - "\xc6\xa5\x1f\xa7\x1b\x3e\x5b\x50\xa0\xc1\x75\xb7\xf2\x16\x18\x35" - "\xe0\x13\x2f\x13\xc6\xa5\x60\xeb\x35\xfc\xfe\x0f\x07\x85\xbc\xf6" - "\xf2\x3d\xa5\xd5\xd2\xbd\x1f\x96\x0d\x13\xd7\xae\x3d\x48\xf0\xdc" - "\x57\xb5\x05\x9a\xd4\x46\x9b\x9c\x37\xb4\x19\x38\x9f\xcd\x79\x63" - "\xae\xbb\x41\xb2\x8f\x83\x39\x3d\x45\xef\x2c\xe7\x6d\x9b\xef\xce" - "\x6a\x24\x7e\xad\x37\xe7\x1d\x53\x2d\xe6\xbc\x97\xbb\x59\xff\xb0" - "\xdc\xa6\xfe\x21\x49\xa6\xfe\x61\xb9\x8a\xfa\x87\x58\x37\xeb\x1f" - "\x62\x5d\xac\x7f\x88\xb5\xab\x7f\xa0\xb1\xe9\xd2\xba\x38\xc5\xd8" - "\x94\x9e\xb3\x8f\x29\xe2\x25\xf5\x0f\x71\xad\xa0\xfe\x21\x4e\xe1" - "\x1d\x75\x9c\x50\xff\x10\x7b\x0b\xea\x1f\x62\x15\xea\x1f\xe2\x84" - "\xfa\x87\x58\x99\xfa\x87\x58\x85\xfa\x87\x78\xa1\xfe\x21\xd6\xa6" - "\xfe\x21\x56\xa8\x7f\x88\x77\x50\xff\x10\x2f\xd4\x3f\xc4\x0b\xf5" - "\x0f\xd4\xa7\xf6\xb1\x69\xbc\x0b\xf5\x0f\xb1\x42\xfd\x43\xac\x83" - "\xfa\x87\x78\x99\xfa\x87\xa5\x06\xf9\xd8\x34\x51\x52\xff\x90\x68" - "\x53\xff\x90\xd0\x4a\xea\x1f\x14\xb1\x65\x53\xff\x90\xe0\x46\xfd" - "\x43\xa2\xca\xfa\x87\x58\x85\xfa\x87\xc4\x08\x5b\xcc\xb1\xb1\x69" - "\xa2\x42\xfd\x43\xa2\x4d\xfd\x43\xac\x42\xfd\x43\xe2\x61\xa6\x7d" - "\xbb\xd8\x34\xd1\xa6\xfe\x21\xd6\xa6\xfe\x21\x49\xa8\x7f\x58\xba" - "\x51\x7d\x6c\x9a\xe4\xa0\xfe\x21\xc9\xa6\xfe\x21\x49\xa8\x7f\x48" - "\x12\xea\x1f\x92\x84\xfa\x87\xa5\x19\xd2\xe3\x62\x6c\x4a\x8f\x8b" - "\xb1\x69\x92\xca\xfa\x87\xbb\x73\x31\x6f\x4f\x6c\xba\xc2\xcd\xfa" - "\x87\x15\x0e\xeb\x1f\xee\xc6\x47\x4a\x1a\x3d\xa9\x50\xd4\xe8\x2b" - "\x0f\xb8\xa7\x5b\x56\x16\xb6\xbc\xed\x5b\x63\x7c\xb4\x62\xb5\x68" - "\xfb\x3f\x3f\xeb\x9e\xed\xff\x3c\xc4\xfd\xf8\x68\x9d\x56\x8c\x8f" - "\xd6\x69\x95\xe3\xa3\xe4\x0e\x8e\xe3\xa3\xd5\xa1\x62\x7c\x94\xb2" - "\x97\x6a\x94\x94\x2c\xaa\x51\x52\xa6\xaa\x8f\x8f\x56\x1d\x67\xe3" - "\xa3\xe4\xe9\x77\xe3\x23\x77\xe3\xa3\xf7\x7c\xc4\xf8\x68\xd5\x36" - "\xf7\xe2\xa3\x55\xd9\x6c\x7c\xb4\x6e\xbf\x7d\x7c\x94\xe2\xed\x7a" - "\x7c\x94\xd2\xcb\x3d\xac\xa7\x04\xb9\x16\x1f\xa5\xac\x92\x8f\x8f" - "\x92\xfd\x94\xe3\x23\x7a\xce\x5e\xd7\xae\xee\x25\xea\xda\xf7\xaf" - "\xdd\xf9\xf1\xd1\xfb\x19\xf2\x1a\xf6\xfd\x6d\x34\x3e\x4a\x49\x6e" - "\xfe\xf8\x28\x25\x59\x3e\x3e\x5a\xed\x4f\xb5\x64\xca\x6a\xfb\xf8" - "\x08\xbe\x23\x1b\x1f\xad\x1e\x25\x7c\x27\x99\x8d\x8f\x68\x1b\xc0" - "\x35\xb3\x94\xe3\xa3\x35\x1e\x94\x7b\x56\x1f\xa5\xdc\x43\x7d\x6a" - "\x1f\x1f\xad\xde\xe1\x3c\x3e\xa2\x18\xe2\xfb\xa9\x18\x1f\xad\xfe" - "\xcd\x3e\x3e\x4a\xd6\xca\xc7\x47\x6b\x0f\x8b\x38\x5a\x1b\xc1\xc6" - "\x47\x6b\x06\xb7\x8e\xf8\x48\x11\x5b\x19\x6c\x7c\xb4\xb6\x8d\xfa" - "\xf8\x68\xed\xb3\xea\xe2\x23\xc4\x9c\x5c\x7c\xb4\x76\x95\x2d\xe6" - "\xd8\xf8\x68\xed\x76\xf9\xf8\x68\xed\x7e\x36\x3e\xc2\xf6\xe5\xe2" - "\xa3\xb5\x17\x99\xf6\xed\xe2\xa3\x75\xde\x6c\x7c\x44\xaf\x13\xe3" - "\xa3\x75\xb9\x94\x43\xff\xbc\x57\x7d\x7c\xb4\x6e\x95\x72\x7c\xb4" - "\x6e\x3d\x1b\x1f\xad\x9b\x49\xe3\xa0\x75\xfb\x68\x7c\xb4\x2e\x86" - "\x1e\xff\x73\x81\xf4\xb8\x18\x1f\xd1\xe3\x62\x7c\xb4\xae\xf8\xee" - "\x3c\xcd\x3b\x31\x3e\x5a\x3f\xcb\xbd\xf8\x68\xfd\xcc\xbb\x1a\xdd" - "\x1d\x8d\xbe\x4e\x2f\x6a\xf4\x0f\xce\xba\xa7\x5b\x3e\xd0\xbb\xaf" - "\xd1\x37\xed\x16\x35\xfa\xa6\xdd\xca\x1a\xfd\xc3\x3d\x8e\x35\xfa" - "\x47\x26\x51\xa3\x6f\x98\x4a\xc7\xc9\x0d\xc2\xbe\x9d\x1b\x3c\xd4" - "\x6b\xf4\xf4\x25\xac\x46\x4f\xf3\xbe\xab\xd1\xdd\xd5\xe8\xeb\x77" - "\x8a\x1a\x3d\x7d\x84\x7b\x1a\x3d\x7d\x38\xab\xd1\x37\x4f\xb7\xd7" - "\xe8\xe9\x3b\x5c\xd7\xe8\xe9\x25\xee\x61\x3d\xbd\xd8\x35\x8d\xbe" - "\xa1\x8f\xbc\x46\xff\xb0\x40\x59\xa3\xd3\x73\xf6\xda\xea\xa3\x12" - "\x51\x5b\x7d\xb4\xf1\xce\xd7\xe8\x1f\x0d\x91\xd7\x51\x1f\x8d\xa0" - "\x1a\x7d\x43\xef\xe6\xd7\xe8\x1b\x7a\xcb\x6b\xf4\x8f\x84\xfd\x7f" - "\x37\xf4\xb7\xd7\xe8\xf0\x1d\x59\x8d\xfe\xd1\x65\xe1\x3b\xbd\x59" - "\x8d\x4e\xdb\x38\xa7\xc9\x68\xa3\xac\xd1\x33\x84\x79\x41\x19\x8b" - "\x28\xf7\x50\x9f\xda\x6b\xf4\x8c\x31\xce\x35\x3a\xc5\x10\xdf\x4f" - "\x45\x8d\x9e\x91\x6e\xaf\xd1\x3f\xdc\x2d\xaf\xd1\x37\x49\xea\x34" - "\x37\xb5\x65\x35\x7a\xc6\xa9\xd6\xa1\xd1\x15\xb1\x35\x84\xd5\xe8" - "\x1b\xf3\xd4\x6b\xf4\x8d\x67\xd5\x69\x74\xc4\x9c\x9c\x46\xdf\xd4" - "\xc7\x16\x73\xac\x46\xdf\x34\x4a\x5e\xa3\x6f\x9a\xce\x6a\x74\x6c" - "\x5f\x4e\xa3\x6f\x5a\xc3\xb4\x6f\xa7\xd1\x37\xed\x60\x35\x3a\xbd" - "\x4e\xd4\xe8\x9b\x47\x53\x0e\xfd\x70\xaa\x7a\x8d\xbe\xb9\x8f\xb2" - "\x46\xdf\x3c\x90\xd5\xe8\x9b\x7d\xa8\x16\xdf\x1c\x4e\x35\xfa\xe6" - "\x2e\xf4\xf8\x87\x61\xd2\xe3\xa2\x46\xa7\xc7\x45\x8d\xbe\x39\xea" - "\xee\x1c\xce\x3b\x51\xa3\x67\xb5\x71\x4f\xa3\x67\xf9\xb8\xaf\x13" - "\x73\x2a\x45\x9d\x98\x53\xa9\xac\x13\xb3\x4e\x39\xd6\x89\x1f\xf7" - "\x10\x75\x62\xf6\x4a\xca\xd5\xd9\x11\x94\xab\xb3\x7b\xa9\xd7\x89" - "\x5b\xb7\xb1\x3a\x71\x4b\x9f\xbb\x3a\xd1\x5d\x9d\xb8\x79\x85\xa8" - "\x13\xb7\xce\x73\x4f\x27\x6e\x9d\xcb\xea\xc4\xed\x32\x7b\x65\x6d" - "\x3d\xea\xba\x4e\xdc\x7a\xcd\x3d\x9d\xb8\xb5\xce\x35\x9d\x98\x1d" - "\x22\xaf\x13\xb3\xf4\xca\x3a\x91\x9e\xb3\x1f\xdf\xb7\x5d\x13\xc7" - "\xf7\x6d\x07\xee\x7c\x9d\xb8\x6d\xa6\xfc\x58\xbe\x6d\x1e\xd5\x89" - "\xd9\x13\x9a\x5f\x27\x66\x4f\x90\xd7\x89\xdb\x84\xf5\xcf\xb2\x43" - "\xed\x75\x22\x7c\x47\x56\x27\x7e\x2c\xe4\x7f\xb3\x27\xb0\x3a\x91" - "\xb6\x01\x5c\xf3\x84\xb2\x4e\xfc\xb8\x84\x72\xcf\xc7\xc2\x7b\x24" - "\xea\x53\x7b\x9d\xf8\xf1\x22\xe7\x3a\x91\x62\x88\xef\xa7\xa2\x4e" - "\xfc\x78\xbf\xbd\x4e\xcc\xaa\x94\xd7\x89\x39\xe9\x22\x8e\x72\x06" - "\xb2\x3a\xf1\x7f\xbc\x5b\x87\x4e\x54\xc4\xd6\x4c\x56\x27\xfe\xcf" - "\x71\xf5\x3a\x31\xa7\x8d\x3a\x9d\x88\x98\x93\xd3\x89\x39\x21\xb6" - "\x98\x63\x75\x62\xce\xdb\xf2\x3a\x31\x67\x15\xab\x13\xb1\x7d\x39" - "\x9d\x98\xb3\x87\x69\xdf\x4e\x27\xe6\x1c\x65\x75\x22\xbd\x4e\xd4" - "\x89\xdb\x85\x3d\xb0\xb2\x56\xaa\xd7\x89\xdb\x43\x94\x75\xe2\x76" - "\x9b\xfd\xaf\xb6\x0b\xfb\x5f\x6d\x4f\xa6\x3a\x71\xbb\xb0\xff\x55" - "\xd6\x0a\xe9\x71\x51\x27\xd2\xe3\xa2\x4e\xdc\x9e\x71\x73\xf3\x3b" - "\xf3\x82\x45\x6d\x91\x17\xac\xac\x2d\xfe\x32\xd8\xb1\xb6\xf8\x24" - "\x43\xd4\x16\xb9\x0d\xf4\xf9\xce\x3d\x45\x9f\xef\x5c\xbe\x3e\x29" - "\xb6\x04\xb4\x45\xf7\x74\xc3\xae\x2b\xf9\xbc\xb6\xf8\x6c\xbe\x51" - "\x03\x7a\xcf\xcb\x82\xda\x02\x74\xdd\xea\xc5\xa8\x2d\xaa\x84\xf9" - "\x9d\xb9\xfe\x25\x31\x52\x6d\xf1\x97\x35\xfc\x5c\x4f\xd4\x17\x75" - "\x46\xfe\x3a\x3c\x2f\x37\xf7\x73\xff\x7c\x61\xee\x27\xb4\x2d\x9d" - "\xf3\xc9\xcf\x03\xbd\x02\xda\x63\x06\xf8\x43\xa2\x3d\xee\xce\xfd" - "\xc4\xb1\xfe\x7f\xcf\xba\xa7\x6b\xff\x57\xcf\x6a\x8e\x3c\xb3\xbd" - "\xe6\xc8\x1d\xe1\xba\xe6\xc8\x8d\x70\x4f\x73\xe4\xea\x5c\xd3\x1c" - "\xb9\x87\xe5\x35\xc7\x5f\x86\x20\x3e\xe5\x35\x07\x3d\x67\x3f\x56" - "\x7c\x12\x21\x8e\x15\x9f\x0c\xbc\xf3\x35\xc7\x8e\x0a\xf9\x71\x61" - "\xc7\x59\xaa\x39\x72\x8b\x9a\x5f\x73\xe4\x16\xc9\x6b\x8e\x4f\x04" - "\xfe\xcf\x2d\xb6\xd7\x1c\xf0\x1d\x59\xcd\xf1\x89\xf0\xfe\x2f\xb7" - "\x88\xd5\x1c\xb4\x0d\xe0\xa0\xed\xca\x9a\xe3\xd3\x61\x94\x93\x3e" - "\xed\x40\x39\x89\xfa\xd4\x5e\x73\x7c\x72\xd1\xb9\xe6\xa0\x18\xe2" - "\xfb\xa9\xa8\x39\x3e\x7d\xc2\x5e\x73\xfc\x65\x90\xbc\xe6\xc8\x93" - "\xd4\x69\xef\xdc\xc1\x6a\x8e\x4f\x97\xb4\x0e\xcd\xa1\x88\xad\x0a" - "\x56\x73\xec\x1c\xa5\x5e\x73\xec\x8c\x55\xa7\x39\x10\x73\x72\x9a" - "\x63\xe7\x61\x5b\xcc\xb1\x9a\x63\xe7\x79\x79\xcd\xb1\xd3\xcc\x6a" - "\x0e\x6c\x5f\x4e\x73\xe4\xf5\x62\xda\xb7\xd3\x1c\x79\x23\x58\xcd" - "\x41\xaf\x13\x35\x47\x5e\xb5\x10\xb7\x9d\x55\xaf\x39\xf2\x0e\x2b" - "\x6b\x8e\xbc\xa3\xac\xe6\xc8\xcb\xa1\xda\x22\xcf\x44\x35\x47\x5e" - "\x81\xa0\x45\xf4\xd2\xe3\xa2\xe6\xa0\xc7\x45\xcd\xb1\xcb\x57\x45" - "\x6e\xaa\x4a\xcd\xdc\xcf\xbc\xeb\x6c\x6e\xca\x9a\x97\x32\xf5\x9e" - "\x7c\xac\x29\x37\x05\x63\xbd\xd2\x9e\xe8\x98\x9b\xc2\xb1\x5b\xcc" - "\x4d\x9d\xe2\xb9\x4a\xcc\x4d\xe9\xf9\xdc\x14\xe6\xa5\x20\x66\x6f" - "\xca\x4b\x59\xde\xb1\x9f\xf7\x99\x67\x51\x9f\x97\x9a\xf6\xb6\x96" - "\x6c\xe1\xc7\x6f\x63\x26\xcd\x4b\x55\x34\xe5\xa5\x70\xdc\x36\xd7" - "\xdb\xe7\xa5\x70\xbc\x16\xf3\x52\x27\xdd\xcc\x4b\x7d\xb6\xcd\xbd" - "\xf1\xfb\xb3\x3b\x60\xfe\x5b\x6b\x9c\xf7\xb9\x2b\x50\x7c\x77\xfc" - "\xb9\x9b\xf3\xdf\x3e\x77\x38\xff\xed\x6e\x5d\xb3\x92\xed\x3f\xab" - "\x16\x6d\xff\xd7\x8d\xee\xd9\xfe\xaf\x19\x2d\x6f\xfb\xd6\x58\x33" - "\xf1\xf9\x4c\xd1\xf6\xbb\xdd\x5c\xff\x6d\xb7\x9f\xfb\xb9\xf0\x7d" - "\xbe\x62\xbc\xba\xcf\x57\x1a\xaf\x16\x0d\x97\xc6\xab\xbb\x2f\x3a" - "\x8e\x57\xf7\x4e\x10\xe3\xd5\x2f\xf6\x50\x6d\xf8\xc5\x46\xaa\x0d" - "\xbf\xe0\xf7\x24\x8b\x1d\x46\xf8\x38\xd5\x84\x31\x6b\xa4\x51\xb3" - "\xeb\x52\xa1\xc6\x94\x44\x63\xd5\x32\x53\x31\x29\x31\x18\xc9\xfb" - "\x8b\x89\xd7\xaa\x2b\xc4\xeb\x93\x5a\xa3\xa6\xfd\x5c\xe2\x03\xe3" - "\x04\x68\xa9\x62\xd0\x16\x59\x24\x2a\x0e\xe3\xd8\xbf\x1d\x2d\x8b" - "\x32\x48\xe2\xd8\x3d\xe3\xc5\x18\x16\xae\x8b\x32\x92\xaf\x23\x0b" - "\x35\x18\xab\xde\x48\x4f\xd1\xdf\xe8\x33\xb9\x9c\x5f\xb3\x48\x9a" - "\x2f\x87\xdf\x0e\x9c\xc6\xe6\xcb\x1b\xd3\x53\xaa\x1a\xf2\x26\x1f" - "\xe3\xd7\x43\xec\x29\xe6\xcd\x5d\xcd\x97\x6f\x6e\x24\x7e\xd6\xf5" - "\x10\x71\x5c\x6c\x7d\xf9\xf2\xbf\xea\xc5\x7c\xf9\xdf\xb2\xdc\xcb" - "\x97\xff\x2d\x93\x8d\x5d\xf7\xed\xb5\x8f\x5d\xbf\xf0\x70\x3d\x76" - "\xfd\xc2\xcd\xf9\xff\x5f\xf4\x70\x2d\x76\xfd\x62\xa5\x6d\xec\x9a" - "\x1b\x87\xb1\xeb\xee\x1a\xc4\xaa\x7c\xec\x4a\xcf\xd9\xc7\x1c\x7b" - "\x7b\x8a\x31\x47\xc1\x6f\x77\x7e\xec\x5a\x90\x26\x1f\x5f\x14\x64" - "\xd1\xd8\xf5\x8b\x15\xcd\x1f\xbb\x7e\xb1\x42\x3e\x76\xdd\xdb\x81" - "\xea\xfc\x2f\x56\x58\xe3\x50\x31\x76\x85\xef\xc8\xc6\xae\x7b\x47" - "\xd8\x7e\x87\xc6\xae\x5f\x24\xd3\xd8\x75\xef\x74\xe5\xd8\x75\xaf" - "\xb0\x5e\xda\xde\x12\xca\x4f\xd4\xa7\xf6\xb1\xeb\xde\xed\xce\x63" - "\x57\x8a\x21\xbe\x9f\x8a\xb1\xeb\xde\xcb\xf6\xb1\xeb\xee\x6a\xf9" - "\xd8\xf5\xef\x87\x44\x1c\xfd\x7d\x16\x1b\xbb\x7e\x39\xb0\x75\xc4" - "\xae\x8a\xd8\x4a\x63\x63\xd7\xbf\x7b\xab\x8f\x5d\xff\x3e\x58\x5d" - "\xec\x8a\x98\x93\x8b\x5d\xff\xbe\x52\xc0\x4f\xb2\x7c\xec\xfa\xf7" - "\x6d\xf2\xb1\xeb\xdf\xf7\xb2\xb1\x2b\xb6\x2f\x17\xbb\xfe\xfd\x3c" - "\xd3\xbe\x5d\xec\xba\xcf\x83\x8d\x5d\xe9\x75\x62\xec\xba\x2f\x87" - "\x72\xe8\xee\xf5\xea\x63\xd7\x7d\x2b\x95\x63\xd7\x7d\x6b\xd8\xd8" - "\x75\x5f\x38\x8d\x51\xf7\x15\xd0\xd8\x75\x5f\x34\x3d\xbe\x3b\x55" - "\x7a\x5c\x8c\x5d\xe9\x71\x31\x76\xdd\x57\xa4\x22\x76\xad\x6e\xa6" - "\xd8\xb5\xa2\x75\xc5\xae\x8d\x61\xb7\x37\x76\xfd\x6a\xaa\x7b\xb1" - "\xeb\x57\x61\x2e\x6a\xf8\x2a\x27\x1a\xfe\xd8\x7f\x96\x86\xdf\x57" - "\x29\x6a\xf8\xaf\x4f\xb8\xa7\x59\xbe\xae\x68\x69\xdb\xb7\x3e\xbb" - "\x7f\x95\x23\xda\xfd\xc0\x78\xf7\xec\x7e\x20\xf8\x6e\xdc\xea\x8e" - "\xed\x0b\x25\xf9\x9a\x7f\xb8\x59\xff\xfc\x8f\x62\xf7\xe3\xd6\x23" - "\xd5\x62\xdc\x7a\xa4\x5a\x1a\xb7\x7e\xcb\xbc\x67\xfd\x66\x9b\xe3" - "\xb8\xb5\xa8\xbf\x18\xb7\x7e\xbb\x9e\xea\xc2\x6f\x85\x7a\xdb\x6f" - "\x79\xbd\xb5\x7c\x0f\x8d\x5b\xaf\x63\xdc\x7a\x01\xe2\xd6\xd9\xe1" - "\x1a\x93\xb0\x06\x3f\xd6\x65\x95\x40\xec\x89\xb1\x6a\x59\x0c\xfc" - "\x3f\xda\x40\xde\x5f\x40\xbc\x52\x20\xe6\xdc\x01\xe3\xd7\x8e\xc5" - "\x06\x4d\x72\x24\x70\x7f\x45\x1e\x69\xaf\x83\x78\xb6\x16\xe3\xd9" - "\x83\x10\xab\xae\x14\xe2\xd9\x43\x79\x65\xd1\xd2\x78\xf6\x60\x37" - "\x3e\x9e\x35\xd0\x9a\xaf\xb2\x68\x88\x67\xe1\xf7\x70\x4d\x7f\x69" - "\x3c\xdb\x00\xf1\x6a\x23\xc4\xab\xa9\x97\x6c\x62\xdb\xd9\xf6\xb1" - "\x6d\x83\x7f\x4a\xb5\xb1\xcf\xe4\x0a\x8c\x6d\xaf\x6f\xff\x4f\x8c" - "\x6d\x0f\x64\x88\xb1\xed\xa1\x25\xee\xc5\xb6\x88\x70\x69\x6c\xfb" - "\x7d\xba\x7d\x6c\x7b\xe8\x94\xeb\xb1\xed\xb7\x1e\xee\x3d\x33\xdf" - "\x12\xd7\x62\xdb\x6f\xa7\xdb\xc6\xb6\x7f\xe1\xdf\xcb\x7e\x93\x83" - "\x78\x96\x8f\x6d\xe9\x39\xfb\x98\xa4\xc8\x43\x8c\x49\xbe\x2b\xb9" - "\xf3\x63\xdb\xef\xa2\xe4\xe3\x8f\xef\x96\xd0\xd8\xf6\xdb\xf0\xe6" - "\x8f\x6d\xbf\x0d\x97\x8f\x6d\xbf\x13\xea\xff\xbf\x0d\xb7\x8f\x6d" - "\xe1\x3b\xb2\xb1\x6d\x51\x37\xdb\xef\xd0\xd8\xf6\xdb\x99\x34\xb6" - "\x2d\x7a\x56\x39\xb6\x2d\x3a\x41\x39\xac\x68\x07\xe5\x30\xea\x53" - "\xfb\xd8\xb6\x28\xd1\x79\x6c\x4b\x31\xc4\xf7\x53\x31\xb6\x2d\x3a" - "\x6c\x1f\xdb\x7e\x93\x2d\x1f\xdb\x1e\xd9\x26\xe2\xe8\xc8\x30\x36" - "\xb6\x3d\xdc\xa1\x75\xc4\xb6\x8a\xd8\x8a\x62\x63\xdb\xc3\x67\xd5" - "\xc7\xb6\x47\xfc\xd5\xc5\xb6\x88\x39\xb9\xd8\xf6\xc8\x74\x01\x3f" - "\x33\xe5\x63\xdb\x23\xb1\xf2\xb1\xed\x91\x74\x36\xb6\xc5\xf6\xe5" - "\x62\xdb\x23\x07\x98\xf6\xed\x62\xdb\x23\xa7\xd8\xd8\x96\x5e\x27" - "\xc6\xb6\xdf\x27\x50\x0e\xfd\x66\x94\xfa\xd8\xf6\xfb\xe9\xca\xb1" - "\xed\xf7\x11\x6c\x6c\xfb\xfd\x10\x1a\xc3\x7e\x9f\x46\x63\xdb\xef" - "\x83\xe9\xf1\x6f\x46\x4a\x8f\x8b\xb1\x2d\x3d\x2e\xc6\xb6\xdf\xe7" - "\xa8\x7b\x2f\x7b\x53\xeb\x1e\x1d\xbb\xfd\x73\x06\x9a\x6b\xdd\x23" - "\xeb\xbb\xd9\xdb\x35\x67\xa0\xe4\x59\xf7\xe2\xdb\x12\x87\xeb\xbf" - "\xdc\x8d\xb1\xe4\x74\xfe\xf7\x05\xa2\xce\x2f\xdd\xe3\x9e\x66\x29" - "\xdd\x7d\x37\xc6\x72\xc7\xf6\x25\x2b\x44\xdb\x97\x3f\xe1\x9e\xed" - "\xcb\xfb\xbb\x1f\x63\x55\x04\x89\x31\x56\x45\x90\xf2\xbb\xc1\xa3" - "\xde\x8e\x63\xac\xe3\x51\x62\x8c\xf5\xe3\x51\xaa\x4f\x7e\xdc\x43" - "\xf5\xc9\x8f\x8b\x9a\xef\xdd\xe0\x0f\x97\xd9\x77\x83\x47\xe7\xdd" - "\x7d\x37\xd8\x1c\xf1\x53\xa9\x49\x8c\x9f\x7e\xd8\xeb\x5e\xfc\xf4" - "\x43\x01\x1b\x3f\x55\x1c\xb7\x8f\x9f\x7e\xec\xea\x7a\xfc\xf4\xe3" - "\x30\xf7\x9e\x87\x1f\x87\xba\x16\x3f\xfd\xb8\x4d\xfe\xdd\xe0\x51" - "\x1f\xe5\x77\x83\xf4\x9c\xbd\xee\x3d\x3e\x4c\xd4\xbd\xc7\xdb\xde" - "\xf9\xf1\xd3\xb1\x7c\x79\x8d\x7b\x6c\x2f\x8d\x9f\x7e\xcc\x6e\xfe" - "\xf8\xe9\xc7\x6c\xf9\xf8\xe9\xb8\x30\xff\xf5\xc7\x6c\xfb\xf8\x09" - "\xbe\x23\x1b\x3f\x1d\x9f\x6e\xfb\x1d\x1a\x3f\xfd\x98\x43\xe3\xa7" - "\xe3\xb1\xca\xf1\xd3\x3f\x3b\x53\x7e\x3a\x7e\x91\xf2\x13\xf5\xa9" - "\x7d\xfc\x74\xfc\x80\xf3\xf8\x89\x62\x88\xef\xa7\x62\xfc\xf4\xcf" - "\x36\xf6\xf1\xd3\x51\x2f\xf9\xf8\xe9\xa7\xb3\x22\x8e\x7e\x4a\x64" - "\xe3\xa7\x7f\x8e\x6f\x1d\xf1\x93\x22\xb6\xf2\xd9\xf8\xe9\xa7\x6e" - "\xea\xe3\xa7\x9f\x42\xd4\xc5\x4f\x88\x39\xb9\xf8\xe9\xa7\x6d\x02" - "\x7e\x72\xe4\xe3\xa7\x9f\xf6\xcb\xc7\x4f\x3f\x1d\x67\xe3\x27\x6c" - "\x5f\x2e\x7e\xaa\xf0\x60\xda\xb7\x8b\x9f\x2a\xba\xb2\xf1\x13\xbd" - "\x4e\x8c\x9f\x2a\x0a\x29\x87\x96\xe7\xa9\x8f\x9f\x2a\xb6\x29\xc7" - "\x4f\x15\x3b\xd8\xf8\xa9\x62\x39\x8d\x93\x2a\x8e\xd1\xf8\xa9\x22" - "\x95\x1e\x2f\xdf\x29\x3d\x2e\xc6\x4f\xf4\xb8\x18\x3f\x55\x54\xa9" - "\x8b\x9f\x5c\x5f\x17\xa9\xe5\xeb\x5a\x03\x5b\x69\x5d\xeb\xc9\x25" - "\xee\xc5\x4e\x27\x63\xee\x6a\x78\x77\x34\x7c\x85\x51\xd4\xf0\xff" - "\x72\x73\xfe\xef\xbf\xea\xdc\xd7\xf0\x3f\xd7\x88\x1a\xfe\xe7\x1a" - "\x65\x0d\x5f\x79\xd8\xb1\x86\x3f\x3b\x40\xd4\xf0\x67\xd2\xe9\x18" - "\x79\x66\x09\x1d\x23\xcf\x0c\x6e\x3e\x0d\x7f\xfa\x73\x56\xc3\x9f" - "\x7a\xe2\xae\x86\x6f\x0e\x0d\x7f\x52\xb2\xdf\xf1\xe9\x58\xf7\x34" - "\xfc\xe9\xe5\xac\x86\xaf\xda\x68\xaf\xe1\x4f\x9f\x75\x5d\xc3\x9f" - "\xf1\x76\xef\x79\x38\xe3\xe5\x9a\x86\x3f\x33\x4b\x5e\xc3\x57\x16" - "\x2b\x6b\x78\x7a\xce\x5e\x7b\x9d\xf5\x16\xb5\x97\xfe\xe8\x9d\xaf" - "\xe1\xf5\xd1\xf2\x3a\x4b\x1f\x4b\x35\xfc\x99\x99\xcd\xaf\xe1\xcf" - "\xcc\x94\xd7\xf0\xfa\xdf\xa8\xde\x39\x33\xd3\x5e\xc3\xc3\x77\x64" - "\x35\xfc\xd9\x9e\xb6\xdf\xa1\x1a\xfe\x8c\x8e\x6a\xf8\xb3\xc3\x94" - "\x35\xfc\xd9\x53\x94\x9f\xce\xe6\x51\x7e\xa2\x3e\xb5\xd7\xf0\x67" - "\x57\x3a\xd7\xf0\x14\x43\x7c\x3f\x15\x35\xfc\xd9\x12\x7b\x0d\x5f" - "\x59\x24\xaf\xe1\x7f\xde\x2e\xe2\xe8\xe7\x11\xac\x86\x3f\xe7\xdf" - "\x3a\x34\xbc\x22\xb6\xa2\x59\x0d\x7f\xee\xbc\x7a\x0d\xff\x73\x67" - "\x75\x1a\x1e\x31\x27\xa7\xe1\x7f\x9e\x25\xe0\x47\x27\xaf\xe1\x7f" - "\x4e\x94\xd7\xf0\x3f\x6f\x64\x35\x3c\xb6\x2f\xa7\xe1\x7f\x3e\xc4" - "\xb4\x6f\xa7\xe1\x7f\x3e\xcb\x6a\x78\x7a\x9d\xa8\xe1\xab\x56\x50" - "\x0e\xad\x7c\x5b\xbd\x86\xaf\x9a\xa5\xac\xe1\xab\xe6\xb1\x1a\xbe" - "\x6a\x28\xd5\xea\x55\x19\x54\xc3\x57\x4d\xa0\xc7\x2b\xa3\xa4\xc7" - "\x45\x0d\x4f\x8f\x8b\x1a\xbe\x2a\xf7\xee\xba\x49\x77\xe2\xba\x49" - "\x17\x86\xb9\xa7\xe3\x2f\x0c\x75\x5f\x4b\x5e\xf1\x13\xb5\xe4\x15" - "\x3f\xa9\x96\x64\xd7\x36\xf8\xb7\xbf\x63\x2d\xf9\x4b\x98\xa8\x25" - "\x2f\xee\xa7\x5c\x7d\x71\x1b\xe5\xea\x8b\xfc\xfb\x3d\x75\xeb\x26" - "\x55\x9f\x60\xd7\x4d\xfa\xf7\xac\xbb\xeb\x26\xb9\xab\x13\xab\xf6" - "\x89\x3a\xb1\x7a\xbb\x7b\x3a\xb1\x3a\x87\xd5\x89\x57\x0e\xd8\xeb" - "\xc4\x8b\x6d\x5c\xd7\x89\x17\xfb\xb8\xa7\x13\x2f\xf6\x76\x4d\x27" - "\x5e\x5c\x23\xbf\x86\xc1\xbf\x03\x94\xd7\x4d\xa2\xe7\xec\xc7\xf7" - "\x5f\xfa\x88\xe3\xfb\xa5\x86\x3b\x5f\x27\x5e\xca\x94\x1f\xcb\x2f" - "\x6d\xa7\x3a\xf1\xe2\xea\xe6\xd7\x89\x17\x57\xcb\xeb\xc4\x5f\x3a" - "\xd3\x31\xf5\x62\xaa\xfd\x1a\x06\xf0\x1d\x59\x9d\xf8\xcb\x18\xe1" - "\x3b\xab\x59\x9d\x48\xdb\x00\xae\x89\x50\xd6\x89\x35\xde\x94\x7b" - "\x7e\x39\x4e\xb9\x87\xfa\xd4\x5e\x27\xfe\x92\xe7\x5c\x27\x52\x0c" - "\xf1\xfd\x54\xd4\x89\xbf\x5c\xb3\xd7\x89\xff\xf6\x93\xd7\x89\x97" - "\x25\xeb\xb4\x5e\x9e\xc7\xea\xc4\x9a\x67\x5b\x87\x4e\x54\xc4\x56" - "\x26\xab\x13\x2f\xb7\x55\xaf\x13\x2f\x0f\x53\xa7\x13\x11\x73\x72" - "\x3a\xf1\xf2\x1a\x5b\xcc\xb1\x3a\xf1\xf2\x0e\x79\x9d\x78\xf9\x00" - "\xab\x13\xb1\x7d\x39\x9d\x78\xf9\x32\xd3\xbe\x9d\x4e\xbc\xd2\x86" - "\xd5\x89\xf4\x3a\x51\x27\x5e\x11\x74\xd9\x85\xfd\xea\x75\xe2\x95" - "\x35\xca\x3a\xf1\x4a\x3a\xab\x13\xaf\xe8\xa8\x1e\xbc\x52\x48\x75" - "\xe2\x95\xe5\xf4\xf8\x85\x7d\xd2\xe3\xa2\x4e\xa4\xc7\x45\x9d\x78" - "\xa5\x5c\xdd\x3c\x90\x66\xc9\xf5\xde\xa6\x79\x20\xcd\x95\xeb\xbd" - "\xdd\xf3\x40\x0c\x6e\xae\x7f\x6f\x70\x75\xfd\xfb\xbb\x75\x32\x4d" - "\x79\xde\x2b\x55\x62\x9e\xf7\xb7\x53\xee\xe9\x95\xdf\x2a\xdd\xd7" - "\xe6\x0d\x92\xfd\x7b\x1b\x98\xfd\x7b\xd9\x7a\xf8\xda\xcf\x1d\x6b" - "\xf3\x7a\xc9\xfe\xbd\xd7\x84\xfd\x7b\xaf\x09\xfb\xf7\x5e\x7b\xd6" - "\x9d\x7a\xf8\x94\x5a\xe2\xf5\xbe\x6d\x3d\xfc\xb1\xfd\xb4\x1e\x7e" - "\x81\x6d\x3d\x7c\xdd\x1e\xb6\x1e\xfe\xea\x13\x4a\xf5\xf0\x98\xf7" - "\xbd\x91\x37\xf9\x18\xd6\xc2\xcb\xd6\xc1\x4f\x6e\xde\x3a\x78\xc4" - "\xe6\xe6\xa5\x54\xdb\x6f\x6a\x95\xda\xde\x20\x59\x3b\xbf\xce\xcd" - "\xfd\x7f\xeb\x12\x58\x6d\xdf\x28\xb3\xff\x6f\x9d\x8a\xfd\x7f\xaf" - "\xb9\xb9\xff\xef\x35\x17\xf7\xff\xbd\x66\xb7\xff\x2f\xad\x83\xaf" - "\xdd\xad\x5c\x07\x4f\xcf\xd9\x6b\xb2\x7a\xc9\xba\x52\xd7\x5b\xc1" - "\xfe\xbf\xd7\x15\xf6\x68\xbd\x2e\xec\xff\x7b\xed\x16\xec\xff\x7b" - "\x4d\x61\xff\xdf\xeb\xc2\xfe\xbf\xd7\x9a\xf6\xf2\x15\xb5\xfd\x35" - "\x85\xfd\x7f\xeb\x7b\xd9\x7e\x87\x6a\xfb\x6b\xc2\xfe\xbf\xf5\x0e" - "\xf6\xff\xad\x17\xf6\xff\xad\x17\xf6\xff\xa5\x3e\xb5\xd7\xf6\xf5" - "\x2e\xec\xff\x7b\x4d\xd8\xff\xf7\x9a\x83\xfd\x7f\xeb\x65\xf6\xff" - "\xad\xcd\x97\xd7\xf6\x0d\x92\xfd\x7f\x1b\x6c\xf6\xff\x35\xb6\x92" - "\xfd\x7f\x15\xb1\x65\xb3\xff\xaf\xd1\x8d\xfd\x7f\x1b\x54\xee\xff" - "\x7b\x4d\x61\xff\xdf\x06\x61\xff\xdf\x6b\x0a\xfb\xff\x36\x28\xec" - "\xff\xdb\x60\xb3\xff\xef\x35\x85\xfd\x7f\x1b\x0e\x33\xed\xdb\x69" - "\xfb\x06\x9b\xfd\x7f\xaf\xd9\xec\xff\xdb\x28\xec\xff\x5b\x3b\x49" - "\xbd\xb6\x6f\x74\xb0\xff\x6f\xa3\xcd\xfe\xbf\x8d\xc2\xfe\xbf\x8d" - "\xc2\xfe\xbf\x8d\xc2\xfe\xbf\xb5\xa1\xd2\xe3\xa2\xb6\xa7\xc7\x45" - "\x6d\xdf\xa8\x66\xff\xdf\x2a\x35\x39\xe0\x96\xaf\xe3\xd0\xb6\xd2" - "\x3a\x0e\x93\x9b\xf9\x5f\x93\xfb\xf9\x5f\x4f\xaf\xfe\x4d\x1a\x13" - "\xfe\xaf\x5c\x4b\x60\x76\x9c\xff\xf5\xf4\x88\x11\x35\x26\x27\xcc" - "\x57\xe2\xf6\x53\x9e\xe6\x62\x5d\xad\x25\x48\xb9\x2e\xe8\x4a\x6b" - "\x2d\xc1\x62\xa1\x96\x00\xb4\x25\xd5\x92\x96\x6b\x6c\x2d\x81\x39" - "\x56\xa9\x96\x40\xb6\x86\xc0\x46\x3f\x5a\xb5\xa6\xbb\x35\x04\xad" - "\x5f\x3f\x36\x4a\x6a\x08\x2c\x07\xdc\xd3\x8f\x96\x42\x46\x3f\x7a" - "\x7a\x9d\xb2\xd7\x8f\x5c\x4f\xd7\xf5\x23\x37\xca\x3d\xfd\xc8\x8d" - "\x74\x4d\x3f\x72\x3b\xe4\x6b\x08\xcc\x01\xca\x35\x04\xf4\x9c\xdd" - "\xb8\xef\xe9\x31\xaa\x69\xdc\xf7\xf4\xf0\xbf\xe3\xf5\xa3\x27\x29" - "\x90\x1d\xe3\x3d\xc9\x01\xaa\x1f\xb9\xdc\xe6\xd7\x8f\x5c\xae\xac" - "\x7e\xf4\xf4\x18\x48\xc7\x5a\x2e\xd7\x5e\x3f\xc2\x77\xe4\xf4\xa3" - "\xa7\x47\x84\xed\x77\xa8\x7e\xe4\x76\xf2\xfa\xd1\xd3\x63\xa5\xa2" - "\x7e\xf4\xd4\x74\xe3\x79\xc9\xd3\xe3\x37\xca\x4b\xd4\xa7\x76\xfa" - "\xd1\xd3\xe3\xb0\x73\xfd\x48\x31\xc4\xf7\x53\x49\x3f\x7a\x6a\x3a" - "\xd8\xeb\x47\xb3\x7c\x6e\xd8\xd3\xf3\xa2\x88\x23\xcf\x55\x8c\x7e" - "\xf4\xd4\x4c\x6a\x15\xfa\x51\x19\x5b\x05\x8c\x7e\xf4\xf4\xec\xa5" - "\x5a\x3f\x7a\x7a\x4e\x55\xa7\x1f\x11\x73\x32\xfa\xd1\xd3\x73\x87" - "\x80\x9f\x9d\xb2\xfa\xd1\xd3\xf3\x90\xac\x7e\xf4\xf4\x3c\xc5\xea" - "\x47\x6c\x5f\x46\x3f\x7a\x7a\xb5\x61\xda\xb7\xd5\x8f\x9e\x5e\x3d" - "\x59\xfd\x48\xaf\x6b\xd2\x8f\x9e\x5e\x45\x74\x5c\x33\xa9\xcf\x0d" - "\x7b\x7a\xed\x50\xd4\x8f\x9e\x5e\x9f\x33\xfa\xd1\xd3\x8b\xae\x9d" - "\xef\xe9\x55\xc9\xeb\x47\x4f\xaf\x0c\xaa\x1f\x4d\xfb\xa4\xc7\x45" - "\xfd\x68\x62\x73\xc3\x6b\xbd\x6a\x1c\xe9\x47\x2e\xad\x5f\x51\xaa" - "\xc6\x92\x0f\x7f\x05\xd0\xcf\xce\x30\x8e\x15\xc2\xff\x8b\x60\x3c" - "\xea\x00\xff\x2f\x57\xd2\x2b\x06\xff\x7e\x45\x16\xd0\x1e\x16\xf8" - "\x9d\x32\xc3\xaf\x85\x85\x0f\x9a\xa0\xaf\xde\xc2\x9e\x2d\xfd\x8a" - "\xda\x9b\xee\x1d\x69\xe1\x74\x84\xf3\x83\xff\xc7\xc0\x31\xb8\xbe" - "\x1d\x8c\x7b\x81\x8b\x49\xbb\x2b\x9e\xde\xab\xad\xd7\x41\x9f\xdb" - "\x9d\xf3\xf4\x1e\x85\x6d\xd4\xaf\xf5\xce\x80\xfb\x31\x2a\xf6\x15" - "\xda\x1a\xb7\xe3\x61\x12\x6b\xe2\xfe\x5d\x38\xbf\x96\x54\x79\x7a" - "\x9f\x6d\x5f\x73\xef\x48\xe0\x21\x82\x7a\x2f\xff\x41\x83\x17\xb6" - "\x59\x38\xbf\x11\xcf\x1d\xc4\x73\x66\xe8\x63\xdc\x3c\xa2\x59\x5b" - "\x7b\xaf\x0f\xe8\x2a\xef\xf8\x3a\xae\xfa\x2d\x13\xf4\x39\xc6\x44" - "\xbe\x7e\xb8\xc2\xeb\xb3\x4d\x15\xfc\xd8\x53\x5a\x67\xe6\xdb\x08" - "\x9c\xcf\xf7\xe7\xfc\x16\xb8\x5e\xae\x0f\x2b\x77\x91\xde\xde\xbd" - "\x38\xbd\xaa\xf1\xce\xf3\x9e\x41\x4a\x76\x6c\x9f\xf8\x30\x29\x7c" - "\x0c\x6c\x17\x48\x34\x72\xe7\x55\xfe\x4e\xb6\x03\x7d\xe9\xf3\x61" - "\x27\xae\x2e\x7e\x23\xd1\xac\xb3\xdc\xeb\xf3\x0d\x70\xe2\xd6\x0d" - "\x9c\xa1\x7e\xed\xbd\xbe\x7a\x0f\x93\x1f\xda\xfc\x5d\x38\xbf\xae" - "\x13\x67\xb8\x9a\x84\xb8\xb9\xb7\xc7\x01\x18\xdb\x6d\x7d\xb1\x60" - "\xe6\xbc\xe9\x81\xd1\x11\xf3\x66\xbd\xb5\x28\x3a\xb0\xe7\xcc\xfb" - "\xc8\x84\xb7\xde\x0a\x9c\x37\x7d\xfe\x92\x40\xe9\x99\x67\x02\x67" - "\x46\x2c\x9c\x3e\x63\xee\xac\x3e\xf3\xde\x88\xba\x0f\xfa\x44\x24" - "\xfd\xf0\xc3\xbe\x58\xd6\xde\xdb\x7f\xcb\x07\x84\x7c\xd8\x91\x78" - "\x61\xbf\xe0\xf7\xd2\xf4\x5e\x23\x73\xf0\xf7\xd6\x6e\xe0\xea\x34" - "\x70\x4d\x3c\x70\xda\xba\xb8\x7b\xe1\xda\x7b\xb2\xb7\x42\xbf\xb6" - "\x40\xbf\xa1\x8f\xd8\xe7\x42\x6b\x9f\xad\x98\x88\x47\x4c\xc4\xd5" - "\x02\x06\xef\x3d\xdb\xde\x78\xef\x4b\x1c\x17\x8a\xf7\x57\x07\xcf" - "\x8a\xc7\x05\x4f\x9f\x25\x7c\x0c\x90\xde\xaf\x08\xbe\x6b\xb2\x62" - "\xcc\x92\x16\x13\xce\x6d\xe8\x97\x0a\xda\xd1\xa3\x9e\xd3\xfd\x37" - "\x60\x13\xbe\xef\x33\xaa\x1f\x21\x09\x5c\x7d\x28\xbf\xff\x00\x57" - "\x0f\x18\xa6\x38\x85\x73\x6d\xba\x5c\xd5\x90\xe7\xea\xd7\xfa\x0c" - "\xd5\x93\x9d\x73\xb1\x0d\x3d\x1c\x43\x9b\x5b\xb2\xd3\xf5\x21\x41" - "\x24\xe1\x0f\x09\x24\xa1\x1e\xbf\x93\x33\xb1\xa0\x7d\x34\xf1\x18" - "\x17\xc3\x9d\x01\xde\xf1\xe0\xba\xa5\xeb\xb9\xed\x13\x0b\xf4\x9e" - "\x3e\x3d\x2c\xe9\x31\xe1\x70\x3f\x35\xd0\x4e\xb2\xde\xe3\x29\x5f" - "\x6c\x67\xdd\x06\xde\xf6\x35\x78\xef\x60\x1f\x88\x65\xb8\x42\x2e" - "\x49\x78\x86\x52\xff\xa4\xb7\xa4\x66\x05\x97\x79\x5d\x27\xe3\x4c" - "\xdc\x0d\x6e\xfd\x9f\xf4\xa5\x75\x75\xc0\x69\x51\x6f\x70\xed\xee" - "\x1d\xd6\xde\x14\x31\x6b\x6b\x47\x78\x16\xd7\x67\x05\x73\xeb\x67" - "\x55\x84\xf4\x22\x5a\x68\xbb\xca\x6a\x4f\xb0\xa5\x97\x3a\x1c\xf9" - "\xf0\x6b\xba\x20\x1e\xa0\x3f\x02\x1e\xda\x0c\x38\x10\x6d\x8f\x87" - "\xa6\x67\x73\xc3\x9c\x72\x13\x17\xfa\xd2\x8d\x34\xd0\xe0\x7e\x73" - "\xea\xe2\xce\x93\x7b\xd0\xb6\xa5\xa0\xf7\xd7\x2e\x26\x01\x6b\xa6" - "\x91\xc0\xd7\x97\x68\x89\x21\x7d\x8e\xa1\x7d\x62\x82\x07\xd8\x44" - "\x03\xfc\xd2\x1f\x38\xb3\xff\x8d\x4e\x31\xe1\xcb\x67\x11\x4d\xde" - "\xb9\x7c\x0d\xea\x64\xac\x0b\x01\x5b\x5f\xdb\x02\xdf\xe3\x7e\x0d" - "\x25\xe8\x0f\xde\x17\xbf\xea\xc8\x18\x88\xbc\xf1\x1d\xc7\x05\xcf" - "\xfb\x7a\x65\x41\x9b\xea\xee\xab\x0d\xaf\x7f\xcd\xe0\xab\x7e\xe0" - "\xa7\xb2\x2a\x33\xdf\x26\xef\xab\xb9\xa2\xaf\xf6\x43\x3f\x44\x7f" - "\xb5\xc9\x47\xbf\xca\xdf\xb3\x2e\x58\xb8\xe7\x64\xce\x4f\x17\xad" - "\x7c\xcf\xba\x28\x7a\xcf\xde\xb5\x8e\xef\xf9\xbe\x8b\x8e\xef\xf9" - "\xfe\xae\xea\xef\xf9\xbe\xdd\xea\xef\xf9\xbe\x1c\x07\xf7\x2c\xf8" - "\x39\x02\xfc\xac\x73\xe0\x67\x9d\xe0\xe7\xfb\xcf\x39\xbe\xe7\xfb" - "\x4f\x39\xbe\x67\xdf\x0e\xea\xef\xf9\xfe\x5c\xf5\xf7\x7c\x7f\x86" - "\xf2\x3d\x47\x08\x7e\x8e\x00\x3f\x47\x38\xf0\x73\x84\xe0\xe7\x0e" - "\x3f\x38\xbe\x67\xdf\xa3\x8e\xef\xb9\xad\xb7\xfa\x7b\xf6\xcd\x54" - "\x7f\xcf\xbe\xab\x1d\xdc\xb3\xe0\xe7\x48\xf0\x73\x84\x03\x3f\x47" - "\x08\x7e\x7e\x2a\xc5\xf1\x3d\xb7\x3d\xe4\xe4\x9e\x1b\xd4\xdf\x73" - "\xdb\x54\xf5\xf7\xdc\x36\x41\xf9\x9e\x23\x05\x3f\x47\x82\x9f\x23" - "\x1d\xf8\x39\x52\xf0\xf3\x94\xe7\x1d\xdf\x73\xbb\xbd\x8e\xef\xb9" - "\xdd\x65\xf5\xf7\xdc\x6e\x85\xfa\x7b\x6e\x17\xad\x74\xcf\x8d\xc0" - "\xdb\xbe\x70\x2f\x37\x7e\x0a\x7d\xc9\xec\x37\xc7\xe4\x5b\x45\x34" - "\x99\x49\x16\x5d\xfb\x6a\xd2\x06\xee\x4d\xc7\x6d\x58\xd6\x1f\xff" - "\xb5\xf8\xcd\x31\x36\xfa\xe9\x7c\x1a\x3a\xf5\x4b\x5d\x36\x95\xdc" - "\x83\x7a\x7c\x95\x85\x04\x58\xd2\xe6\xd4\xad\x7e\x85\x04\xc6\x1b" - "\x88\xb6\x34\x4e\x4f\xe2\xa2\x38\x43\x29\x39\x4b\xda\x56\x63\xec" - "\x79\x92\x14\xd7\x14\x91\xf9\x0b\x38\xee\x82\xa7\x76\x30\xbe\x03" - "\x06\x9d\x9c\x90\xfa\x4f\x12\x08\xbf\xd1\x7f\x0b\xfc\x61\x3b\xed" - "\x47\xc3\xf8\xb9\x61\xd9\x93\x5b\xe3\x48\xc0\x57\x91\xd5\x04\x8f" - "\x67\xc1\x9f\x79\x43\x4c\x78\xdc\x54\xa2\xd9\x55\x5b\xa1\xa1\x63" - "\xb3\xd6\xdb\x76\x6c\x1e\x3d\x1d\x6c\x39\x83\x3f\x37\x3e\xf3\x15" - "\xb5\xb6\x6c\x5f\x6e\x1d\xbb\x79\x5b\x56\x9a\xe9\x78\x6f\x33\x76" - "\x7f\x05\xbf\x2f\xda\xb2\x7d\x21\xda\x92\x4b\xd3\x69\xcb\xaa\x1b" - "\x31\x6e\xd2\x5e\x88\x21\x1a\x38\x1e\x55\x1a\x55\x4b\xe4\x6d\xac" - "\x0b\x16\x6d\xac\x5b\xee\x5b\xe5\x5d\x2b\x6f\x63\x5d\x0c\xd8\x38" - "\xd9\xde\xc6\xba\x68\xd7\x6c\xdc\x21\xeb\xe6\x6d\xdc\x21\x42\xd9" - "\xc6\x1d\xf6\xa8\xb7\x71\x87\x01\xea\x6d\xdc\xa1\x87\x60\xe3\x54" - "\xd6\xc6\xda\x63\x0e\x6c\x2c\xc1\xb1\x0e\x70\x7c\xff\x39\x05\x1b" - "\x03\x8e\x23\x64\x70\xac\x73\x11\xc7\xbf\xf3\xb8\x79\x1b\x77\x2c" - "\x51\xb6\xf1\xef\x3a\xab\xb7\x71\xc7\x0c\xf5\x36\xee\x98\x4c\x6d" - "\x1c\x61\x83\xe3\x8e\x83\x94\x6d\x1c\x21\xc1\x71\x04\xe0\xb8\xc3" - "\x0f\xf2\x36\x8e\x00\x1c\x47\xc8\xe0\x38\xc2\x45\x1c\xfb\xcd\xba" - "\x79\x1b\xfb\x3d\xa1\x6c\x63\xbf\x58\xf5\x36\xfe\x9d\x49\xbd\x8d" - "\x7f\x57\x23\xd8\xd8\x06\xc7\xbf\xcb\x74\x60\x63\x09\x8e\x23\x00" - "\xc7\x4f\xa5\x28\xd8\x18\x70\x1c\x29\x83\xe3\x08\x17\x71\xec\x7f" - "\xf8\xe6\x6d\xec\x9f\xae\x6c\x63\xff\xb3\xea\x6d\xec\x1f\xae\xde" - "\xc6\xfe\xc1\xd4\xc6\x91\x36\x38\xf6\x27\xca\x36\x8e\x94\xe0\x38" - "\x12\x70\x3c\xe5\x79\x79\x1b\x47\x02\x8e\x23\x65\x70\x1c\xe9\x22" - "\x8e\x1f\xe8\x73\xf3\x36\xee\xd4\xa0\x6c\xe3\x07\x46\xa8\xb7\x71" - "\xa7\x83\xea\x6d\xdc\x69\xb7\x60\x63\x1b\x1c\x77\x9a\xa9\x64\xe3" - "\x1b\x10\x03\xb6\x05\x1b\xb7\xad\x21\x9a\x2c\xb4\x6d\x05\xb5\xad" - "\xb9\xd3\xb2\xfe\x59\x1a\x8b\x0e\x6d\xc2\xe7\x80\x7e\x09\x68\x67" - "\x4e\x9b\x63\xe2\x34\x70\x4f\x71\x98\xfb\x7d\x20\xcf\x94\x44\xda" - "\x05\xc6\x61\xfe\xb7\x33\x5f\x1f\x10\x18\xf7\xde\x29\xf8\x3d\x4f" - "\xcc\x7b\x99\xd2\xfb\x46\x99\xfd\xe7\x0e\xbd\xe0\x19\x70\x9e\xeb" - "\x39\xa9\x1c\x62\x2f\x2d\xf7\x66\x80\x5f\x59\x4d\x3e\xd8\xe7\x08" - "\x29\xad\xf8\x92\x58\x3a\x2d\x7b\xb2\x9f\x89\x04\x71\xbf\x04\xf9" - "\x15\x47\xeb\x89\xf9\x8d\x00\xdf\xb2\x98\x22\x52\x16\xf3\x57\x32" - "\xae\x9a\xbb\xce\xfd\x1c\xe4\x7b\xc3\x3f\x31\xc6\xec\xbf\x4c\x6b" - "\x4e\x4f\x31\x9a\xfc\x13\x75\x79\x8b\xf5\x1a\x5f\x23\x09\x9a\x5b" - "\xc5\x71\x6b\x67\x10\xaf\xb5\xe7\x88\xcf\xba\x19\xc4\x77\xdd\x39" - "\xa2\x2d\xae\xaa\x20\x25\x97\x8a\x48\x49\xed\x09\x52\x72\x1d\xfe" - "\x1a\xe1\xcf\x02\x7f\x09\x27\xc0\xd7\x84\x8c\xb9\x4c\x70\xef\x46" - "\xc3\xe3\x95\xc4\xaf\xd8\x54\x41\x70\xfe\xeb\x15\xcf\x80\x44\xdf" - "\x70\xe2\xc7\xfd\x1c\x40\xb8\x37\x02\x34\x70\xce\x0b\x8f\x97\x99" - "\x0c\xa4\xb8\xca\x88\xe7\xc3\xe1\xbc\x57\x7c\x15\xb4\x6f\x29\xc2" - "\xbd\x19\x0d\xc5\x09\x87\x89\x69\xfd\xe9\x70\x0e\x63\xe8\x4e\x73" - "\xca\x53\xc1\xd4\x16\x2e\xa0\x3b\xc5\x41\xe7\x8d\x5b\x2c\x6a\x7d" - "\x1d\x90\xcf\xdb\xf8\xcd\x80\x8e\x60\xe7\x07\x2d\x6f\x86\x6a\xc7" - "\x9e\x38\xc3\x95\xd6\x55\x10\xcc\x25\x94\xd6\x1d\x21\x65\x2b\x2c" - "\x64\xdc\x12\x42\x46\x9b\x09\x41\x5b\x94\xc5\x54\x93\xb1\x51\xa4" - "\x3d\xe6\x9f\x2d\xbf\x04\x75\x2c\xab\x32\x90\x58\x13\xf4\xf1\x8a" - "\xb1\xa9\x8f\xa5\x2b\x4a\x09\x9c\x7b\xb0\x54\xa7\x27\xbe\x51\x44" - "\x8b\xf6\x35\xa5\xcd\x31\x8e\x85\xe7\x67\x7e\x1d\xc7\xa1\x6d\xd1" - "\xa6\x68\x5f\x6c\xcf\x6a\xf3\xb2\x99\x06\x12\x6f\x24\xda\xb2\x38" - "\xf8\x37\x86\x33\x94\x91\xdf\x08\xf4\x31\x8d\xeb\x70\x3a\x1c\x70" - "\x31\x00\xb1\xa0\xf7\x7c\x20\x07\xfc\xdf\x51\x1e\x53\xba\x68\x8a" - "\x29\xef\x5a\xe7\x98\xd2\x2d\x17\x31\xf5\xa0\x87\x88\xa9\x87\x4e" - "\x29\x63\xea\xa1\xc1\x02\xa6\x52\xef\x4c\x4c\x3d\x78\xdc\x31\xa6" - "\x1e\xdc\xed\x00\x53\xc9\x5c\x27\x5d\x30\x8b\xa9\x87\x2e\xab\xc7" - "\xd4\x43\x5e\xb7\x0f\x53\xba\x18\xf7\x30\xf5\x60\x35\x8b\xa9\xce" - "\x46\x07\x98\x12\x78\xea\xfe\x73\x2e\x60\x4a\xc2\x53\x5d\x42\x44" - "\x4c\x3d\xfc\x84\x32\xa6\xba\xae\xa1\x98\x8a\xb8\x43\x79\xaa\x6b" - "\x2f\xc7\x98\xea\xea\xa3\x8c\xa9\x08\xe0\x29\x9d\x0d\x4f\x3d\x3c" - "\x4c\x3d\xa6\xba\x86\xde\x46\x4c\xb9\xc9\x53\x5d\x87\xb0\x98\xea" - "\x32\x5a\x19\x53\x11\x02\x4f\x75\xf8\xc1\x39\xa6\x22\x24\x3c\xf5" - "\xf0\x0e\x11\x53\x81\x2b\x95\x31\xf5\xc8\x59\x01\x53\x77\x28\x4f" - "\x3d\x12\xeb\x18\x53\x8f\x84\x39\xc0\x14\xf0\x54\x84\x0d\x4f\x05" - "\xa6\xab\xc7\xd4\x23\x3b\x6f\x1f\xa6\x22\xdc\xe4\xa9\x47\x52\x59" - "\x4c\x3d\x9c\xed\x00\x53\x02\x4f\x3d\x95\xe2\x02\xa6\x24\x3c\x15" - "\x68\x16\x31\xd5\xfd\x84\x32\xa6\xba\x0f\xa4\x98\x8a\xbc\x43\x79" - "\xaa\xdb\x51\xc7\x98\xea\x96\xaf\x8c\xa9\x48\xe0\xa9\x08\x1b\x9e" - "\xea\x7e\x51\x3d\xa6\xba\x93\xdb\x88\x29\x37\x79\xaa\x5b\x15\x8b" - "\xa9\xc0\x3a\x65\x4c\x45\x0a\x3c\x35\xe5\x79\xe7\x98\x8a\x94\xf0" - "\xd4\xa3\xe3\x45\x4c\xf5\xec\xa3\x8c\xa9\x1e\xab\x04\x4c\xdd\xa1" - "\x3c\xd5\xa3\xa7\x63\x4c\xf5\xf0\x72\x80\x29\xe0\xa9\x48\x1b\x9e" - "\xea\xf9\xac\x7a\x4c\xf5\x98\x70\xfb\x30\x15\xe9\x26\x4f\xf5\x18" - "\xc4\x62\xea\xd1\x91\x4a\x98\x6a\xc4\xb8\xcf\x03\x30\xa5\x83\xb8" - "\x0f\x30\xd4\xbe\x9c\x62\xea\x06\x60\x6a\xb3\x14\x53\xff\xb2\x8d" - "\xfb\x7a\x6e\xb7\x34\x61\xea\x0f\x9f\xdb\x62\xca\x02\x98\xba\xc1" - "\x63\xea\xf7\x87\xad\x71\x5f\x59\x4d\x36\xf8\xea\x12\x29\x0b\x06" - "\x3c\x6d\x10\xf0\xf4\x2f\xc0\x13\xdc\x8f\x05\xee\xb7\xb8\xb2\x82" - "\x8c\x33\xd0\xfb\x6a\x84\xfb\xb5\x48\xb1\xd4\x58\xad\x41\x0c\x21" - "\x76\xac\x38\x2a\x99\x0f\xf8\x59\x70\x94\x94\x2c\x86\xbf\xa5\xf0" - "\x17\x07\x7f\xe4\x28\x29\xae\x26\x7c\xce\x5e\xc4\x4f\xb9\x80\x9f" - "\xdf\xcf\x72\x8c\x9f\xdf\x0f\x57\x17\xe3\xfd\xe1\x80\x7a\xfc\xfc" - "\x3e\x4d\xa8\xa5\xd3\x8e\x1b\x7f\x86\xc3\x1a\x58\x8a\x91\x4b\x64" - "\x9c\x89\xb4\xe7\xa6\x04\x75\xf4\x0d\x25\xda\x65\x66\xa2\x59\x33" - "\x83\x68\xd7\x9c\x84\xfb\xb5\x3e\x3b\xe7\x88\xef\x11\xe3\x97\xa4" - "\xb8\xb6\x82\x14\x5f\x3f\x4c\x8a\x2d\xf0\x77\x09\xfe\xa0\x8f\xe3" - "\x66\x49\xef\xd7\x20\xdc\xef\x1f\x42\xa0\xad\x1e\xca\xf7\xfb\x87" - "\x01\xfc\xfd\xce\x84\xfb\x6d\x14\xef\xb7\x0c\xb0\x08\x7e\x79\xd0" - "\x22\xc4\x89\xe3\x0c\xa4\xcd\x5b\x26\x8e\x6b\x14\x30\x88\x7e\x39" - "\x72\xcc\x48\xc6\x45\x81\xaf\xde\x00\x0c\x56\xe5\x92\xf8\xe5\x80" - "\xc1\x46\x23\xbe\xd7\x37\x94\x25\x34\x00\x06\x7f\x1f\xc3\x81\xdd" - "\x6e\x20\x06\xff\x85\x18\xec\x99\x69\x51\xc4\x20\xc4\x89\x3c\x06" - "\x21\x4e\x74\x8a\x41\x69\x9c\x18\xd4\x4b\xc4\xe0\x63\x03\x95\x31" - "\xd8\x6b\x8c\x35\x4e\x6c\x79\x0c\x06\x5d\x74\x8c\xc1\xa0\x22\x75" - "\x31\xe1\x63\x23\xd4\x63\xb0\x57\xc0\xed\xc3\x60\xaf\x13\x8e\x31" - "\xd8\xab\xc0\x39\x06\x75\x31\xee\x61\x30\xc8\xc4\x62\x30\x28\xd0" - "\x01\x06\x05\x1e\x84\xb8\xd2\x39\x06\x25\x3c\xf8\x58\x9e\x88\xc1" - "\xde\x7b\x95\x31\xf8\xf8\x51\x6b\x5c\xd9\xf2\x18\x7c\x7c\x9e\x63" - "\x0c\x3e\x3e\x5a\x5d\x0c\xd9\xfb\xb0\x7a\x0c\x3e\x9e\x79\xfb\x30" - "\xd8\x7b\xaa\x63\x0c\xf6\x1e\xe2\x02\x06\xdd\xe4\xc1\xc7\x13\x58" - "\x0c\x3e\x96\xa3\x8c\xc1\x08\x81\x07\x21\x0e\x75\x8a\x41\x69\x1c" - "\xda\xe7\x09\x11\x83\xfd\x9e\x55\xc6\x60\xdf\x10\x6b\x1c\xda\xf2" - "\x18\xec\xf3\x9b\x63\x0c\xf6\x29\x57\x17\x73\xf6\x1b\xa3\x1e\x83" - "\x7d\x03\x6f\x1f\x06\xfb\x9e\x75\x8c\xc1\xbe\x85\xce\x31\x18\xe1" - "\x26\x0f\xf6\xf5\x62\x31\xd8\x27\xc8\x01\x06\x05\x1e\x84\xb8\xd5" - "\x39\x06\x25\x3c\xd8\x6f\x8f\x88\xc1\x27\x0e\x28\x63\xb0\xff\x09" - "\x6b\xdc\xda\xf2\x18\xec\xbf\xc8\x31\x06\xfb\x4f\x50\x17\xa3\x3e" - "\x71\x54\x3d\x06\xfb\xe7\xdc\x3e\x0c\x3e\x31\xcb\x31\x06\x9f\x18" - "\xee\x02\x06\xdd\xe4\xc1\xfe\xc9\x2c\x06\xfb\xed\x54\xc6\x60\xa4" - "\xc0\x83\x10\xe7\x3a\xc5\xa0\x34\xce\x7d\x72\xb0\x88\xc1\x01\x23" - "\x94\x31\xf8\x5f\x53\xad\x71\x6e\xcb\x63\xf0\xc9\x06\xc7\x18\x7c" - "\xb2\x42\x5d\x4c\x3b\x20\x44\x3d\x06\xff\x2b\xe8\xf6\x61\xf0\xbf" - "\x2e\x3a\xc6\xe0\x7f\x15\x39\xc7\x60\xa4\x9b\x3c\xf8\x5f\xbe\x2c" - "\x06\x9f\xec\xaf\x84\x41\x0b\xc4\xc5\x37\x72\x26\x95\x5b\xd2\x12" - "\x63\xda\x7b\x04\x12\x93\xdf\xdc\xa1\x65\xd1\x75\x64\xec\x35\xb0" - "\x4f\xd4\x35\x32\xed\x9a\x96\x98\xd3\x12\x75\x1c\xc4\x47\x92\xf8" - "\x99\xaf\x2d\x33\xa5\x9e\x0e\x5f\x37\x9f\x78\x41\xfc\xfd\x24\x1e" - "\x2b\xbb\x60\x24\xf8\xfb\xb1\xd8\x9f\x4b\x62\x7f\x30\x4f\xc0\xfd" - "\x1a\xa4\xe5\xdf\x31\x37\xea\x49\xd5\x10\xe2\x59\x5c\xa5\x07\x3b" - "\x2c\xe5\xfd\x8b\x76\xb9\xe0\x39\x30\x68\xeb\x15\xe2\x65\xfa\x39" - "\xe0\x41\xb0\xb7\x5f\xdb\x77\x88\x47\x97\x2a\xce\x82\x76\x45\x7b" - "\xa1\x8d\x03\x97\xe2\xbb\xeb\x81\x4b\x4a\x01\x63\xa6\x9f\x83\x1e" - "\xdc\x02\xd7\xc9\xc7\xab\x03\x13\xd5\x63\x63\x20\x9d\x0f\xeb\x39" - "\x30\xb0\xb8\x92\xc8\xbe\x3b\xb6\x40\xfc\xe6\x9a\xad\x74\x31\x92" - "\x38\xef\x16\xd8\xea\xa9\x09\xae\xd9\xea\xa9\xed\x36\xb6\x92\x89" - "\xab\x9e\xca\x53\x6f\xab\xa7\xe8\x3a\x91\x9e\x4f\x8d\x76\x60\x2b" - "\x17\x71\xa5\x33\x4a\xe2\x91\x5b\x60\xab\xa7\x13\x5c\xb3\xd5\xd3" - "\x47\x59\x5b\xc9\xe9\xff\xa7\x4f\xa8\xb7\xd5\xd3\x99\xd4\x56\x4f" - "\xc7\x28\xdb\x2a\xc2\x45\x5c\x45\xc4\x48\x74\xf3\x2d\xb0\xd5\xa0" - "\x9d\xae\xd9\x6a\x90\xd9\xc6\x56\x32\x3a\x75\xb0\xb7\x7a\x5b\x0d" - "\x2a\xa2\xb6\x1a\x94\xe3\xc0\x56\x2e\xe2\x2a\xc2\x28\xd1\x77\xb7" - "\xc0\x56\x83\x2b\x5c\xb3\xd5\x33\xbd\x58\x5b\xc9\xe9\xa9\x67\x9e" - "\x50\x6f\xab\xc1\x75\xd4\x56\x83\xcb\x95\x6d\x15\xe9\x22\xae\x22" - "\x63\x24\x3a\xe4\x16\xd8\xea\x8f\x5e\xae\xd9\xea\x8f\x21\x36\xb6" - "\x92\x19\xf7\xff\x38\x55\xbd\xad\xfe\x18\x48\x6d\xf5\x8c\x49\xc9" - "\x56\xe6\xb4\x39\x75\xed\xc1\x06\x0d\x1b\xe6\x94\xb7\x8f\x21\x9a" - "\xc6\x1e\x60\x37\x3f\xb0\x5b\x62\x20\xb9\x91\x06\x76\x33\x98\xc8" - "\xd8\xb7\xcf\x70\xa5\x35\x66\xd2\x08\x36\x6b\xf0\x9b\x63\x2c\x33" - "\x54\x63\xcd\xd1\x1f\xcf\x79\x3e\xfb\xec\x94\xb7\xb5\x04\xed\x86" - "\x76\x40\xdb\x71\x60\x37\xde\x8e\x7e\x29\x46\xb3\xdf\x32\xed\x98" - "\xcb\x67\xb8\xb7\xf4\x1c\x87\xf7\xcb\xf9\xf5\x8d\xc2\xf7\x02\xe3" - "\xaa\x49\x9b\xc0\x57\xf0\x9e\x86\x5c\xc6\xe3\x65\x86\x0a\xd0\x07" - "\xb5\x84\xd7\x66\x67\x82\xfc\xcc\x13\x83\x7c\xcd\x65\xa1\x2f\x71" - "\x9d\xfa\xa5\x9a\x3a\xc5\x84\xc7\x5f\x26\xf7\xa0\x7e\x58\x6b\x21" - "\x01\xb1\xf3\x88\x66\x57\x64\xa1\x86\x9f\xbb\xb6\x80\x6f\x63\x2f" - "\xd8\x25\x80\xbb\x2a\xa9\xe9\xbe\xaa\x23\x65\x17\x52\x79\xbf\xd9" - "\x6a\x04\xde\x6f\x3f\x05\x69\x41\x67\xf6\xe7\xfc\x74\x3e\xa9\xa5" - "\x24\x90\xbb\x01\x36\xe6\xe7\x13\x3d\xbb\x7d\x6b\xa3\x5a\x1b\x0f" - "\xe1\xeb\xbf\x2d\x81\x42\xfd\x16\xd8\x09\x7f\x9f\xaf\xdf\x8a\x92" - "\xd4\x6f\x41\x9f\xc5\xfa\xad\x21\x23\xb1\x7e\xcb\x72\x26\xe0\x41" - "\xeb\xbd\xbf\x35\x97\xe3\xe0\xde\x3b\x96\xd6\x19\x08\xde\x7f\x69" - "\x5d\x21\x89\x8f\x26\xda\xd2\xc6\x6a\x12\x57\xc7\x19\x4a\x13\x2e" - "\x92\x71\xd7\x50\x07\x23\x5e\x9e\x1d\x48\xfd\x3a\xc4\xc7\x72\x26" - "\xe8\x41\xbd\xe7\xb3\xbd\x4b\xcb\x09\x91\xcc\xe3\xd1\x81\x66\xf6" - "\x01\x3f\xe8\xca\x12\xce\x11\xf0\x49\x6a\x99\xe9\x24\xfa\x49\x07" - "\xe7\x87\x34\xe9\xeb\x4e\xcb\x3e\xc0\x63\xe8\x33\x7c\xdf\x84\xeb" - "\x03\x6c\x95\xe8\x6f\xc4\x45\xfb\x98\x04\x52\x16\xd3\x48\x4a\x4d" - "\x04\xf4\xd5\x1f\x77\x7f\x1f\x5a\xa1\x80\x23\x5d\x34\xc5\x91\x2e" - "\xb8\x7d\x8c\x77\xad\x73\x1c\xe9\x62\x44\x1c\x3d\xb7\xf2\xe6\x70" - "\xf4\xdc\xc0\x9b\xc7\xd1\x73\x1e\x37\x81\xa3\x64\x16\x47\xcf\x5d" - "\x56\x8f\xa3\xff\x2e\x56\x8f\xa3\xff\x4e\xbd\x39\x1c\x3d\x17\x4b" - "\x71\xf4\xdf\xc1\x14\x47\xcf\x45\x8b\x38\xe2\xe7\x46\xdd\x22\x1c" - "\x3d\x6b\x72\x80\x23\x81\x8f\x74\xc0\x47\xf7\x9f\x73\x01\x47\x12" - "\x3e\x1a\x56\x72\x73\x38\x1a\x16\x7b\xf3\x38\x1a\x36\xca\x7d\x1c" - "\x45\xd8\xf0\xd1\xf3\x03\xd5\xe3\x68\x98\x9f\x7a\x1c\x0d\xad\xb8" - "\x39\x1c\x0d\x3b\x44\x71\x34\x34\x83\xe2\x68\xd8\x3e\x11\x47\xfc" - "\x7c\xb3\x5b\x84\xa3\xa1\xc3\x95\x71\x14\x21\xf0\x51\x04\xf0\x51" - "\x87\x1f\x9c\xe3\x28\x42\xc2\x47\xc3\xfd\x6f\x0e\x47\x2f\x1c\xba" - "\x79\x1c\xbd\xb0\xfe\x26\x70\x64\xc3\x47\xc3\x63\xd5\xe3\xe8\x85" - "\x30\xf5\x38\x7a\x21\xf0\xe6\x70\x34\xbc\x2d\xc5\xd1\xf3\x7a\x8a" - "\xa3\xe1\x5e\x22\x8e\xf8\x39\x7c\xb7\x08\x47\xcf\xaf\x76\x80\x23" - "\x81\x8f\x22\x80\x8f\x9e\x4a\x71\x01\x47\x12\x3e\x7a\x71\xea\xcd" - "\xe1\xe8\xc5\xb6\x37\x8f\xa3\x11\x27\xdc\xc7\x51\xa4\x0d\x1f\xbd" - "\x78\x48\x3d\x8e\x46\xe4\xa8\xc7\xd1\x08\xdd\xcd\xe1\xe8\xc5\x10" - "\x8a\xa3\x11\x41\x14\x47\x2f\x8e\x16\x71\xc4\xcf\x8b\xbc\x45\x38" - "\x1a\x7e\x4c\x19\x47\x91\x02\x1f\x45\x02\x1f\x4d\x79\xde\x39\x8e" - "\x22\x25\x7c\x34\x72\xfb\xcd\xe1\x68\x64\xc8\xcd\xe3\x68\x64\xb7" - "\x9b\xc0\x91\x0d\x1f\x8d\x6a\xab\x1e\x47\x2f\xd5\xa8\xc7\xd1\x4b" - "\xf9\x37\x87\xa3\x91\x59\x14\x47\x2f\x45\x51\x1c\x8d\x4c\x13\x71" - "\xc4\xcf\x35\xbd\x45\x38\x7a\xa9\x8b\x12\x8e\x70\x2d\x82\x0f\xe9" - "\xba\x10\x75\xeb\x96\x92\x41\x5b\xf1\xdf\x46\xd2\xbf\x7e\xed\xa8" - "\xe1\x07\x96\xd3\xf5\x00\xf4\x9e\xa3\xf8\x7c\xaf\xdc\xf7\xef\xdf" - "\x01\x7e\xf1\x9b\x63\x18\x77\x8a\xae\xd1\x80\xeb\x82\x5c\x8d\xd7" - "\x91\x7e\xfc\xba\x0c\x2f\x2f\xc7\x75\xac\x9a\xd6\x0e\xf0\x53\x58" - "\x3b\x60\xb2\xf2\xda\x01\x8d\x1b\xac\xf3\x6e\x73\x25\xf3\x6e\x5f" - "\x1e\xe5\x78\xde\xed\xcb\x4f\x64\x4d\x56\x8b\x87\x51\xfc\xfc\xaf" - "\xab\x9d\xe6\x94\xd7\xaf\x7d\x79\x28\x7c\x0e\xa0\xf7\xfe\x32\xbf" - "\xde\x8a\xf3\xf9\xb8\xb9\x12\x9c\x8c\xaa\x09\x09\x23\x09\xdc\xda" - "\x36\x43\x39\xff\x39\x06\x2e\x5d\xa7\x6e\xfd\x2c\xcf\x97\x93\x1d" - "\xdb\x5b\x17\x25\x6f\xef\x3f\xd5\x50\x7b\x0b\xeb\x16\xf8\x29\xac" - "\x5b\x30\x59\x79\xdd\x02\x79\x7b\xff\xc9\xc9\x3c\xe7\x3f\x6d\x53" - "\x6f\xef\x3f\xcd\xa5\xf6\xd6\x05\xd7\xaf\xfd\x53\xbe\x68\xef\xd1" - "\xbd\xd5\xdb\xfb\x4f\x61\xd4\xde\xf7\x0d\xe0\xfc\x75\x51\x60\xef" - "\x04\x95\x7d\x31\x3a\xb1\xb7\x02\xbe\xc7\x84\x09\xf6\x16\xf0\xad" - "\xb0\x66\xc2\x64\xe5\x35\x13\xe4\xed\x3d\xa6\x97\x63\x7b\x8f\xe9" - "\xa0\xde\xde\xa3\x2b\x05\x7b\x03\xbe\xc7\x04\x8a\xf6\x1e\xe3\xe2" - "\xba\x02\x52\x7b\x8f\x2e\xa6\xf6\xbe\x3f\x08\xec\x0d\xf8\x8e\x50" - "\x89\xef\x31\x3a\xc7\xf6\x8e\x50\xc0\xf7\xd8\x62\x6a\x6f\x61\xbd" - "\x06\x3f\x85\xf5\x1a\x26\x2b\xaf\xd7\x20\x6f\xef\xb1\x1b\x1d\xdb" - "\x7b\x6c\xa2\x7a\x7b\x8f\x1d\x4d\xed\x1d\x01\xf8\x1e\x9b\x2a\xda" - "\x7b\x9c\xaf\x7a\x7b\x8f\x1d\x42\xed\xed\xdb\x85\xf3\x8f\x00\x7c" - "\x47\xa8\xc4\xf7\xd8\x0a\x27\xf6\x56\xc0\x77\xf0\x10\xc1\xde\x02" - "\xbe\x15\xd6\x8a\x98\xac\xbc\x56\x84\xbc\xbd\x83\xdb\x38\xb6\xf7" - "\xb8\xdf\xd4\xdb\x7b\xdc\x3e\xc1\xde\x80\xef\x60\x22\xda\x3b\x78" - "\xb9\x7a\x7b\x8f\xdb\x49\xed\xdd\x56\x0b\xf6\x06\x7c\x47\xaa\xc4" - "\x77\xf0\x48\xc7\xf6\x8e\x54\xc0\xf7\xf8\x9d\xd4\xde\xc2\x3a\x15" - "\x7e\x0a\xeb\x54\x4c\x56\x5e\xa7\x42\xde\xde\xe3\x97\x38\xb6\xf7" - "\xf8\xe9\xea\xed\x3d\xbe\x37\xb5\x77\x24\xe0\x7b\x7c\x94\x68\xef" - "\xf1\x35\xea\xed\x3d\xbe\x0b\xb5\x77\x3b\x2f\xce\x3f\x12\xf0\x1d" - "\xa9\x12\xdf\xe3\x0b\x94\xec\xdd\x1e\xec\x7d\x08\x10\x00\xba\xc3" - "\x68\x49\x03\x9d\x62\x66\xed\x5e\x16\x33\x88\xf4\xbd\x8e\xb6\x7f" - "\x35\x03\xc6\x6a\xe3\xed\x5b\x2f\xe3\xd5\xc4\x9b\x9f\x3b\xfc\xea" - "\x18\xe5\xb9\xc3\xaf\x0e\x54\x3f\x77\xf8\x55\x22\x6a\xa0\x57\x87" - "\x8b\x3e\x7d\x95\xe7\x0f\x75\x73\x8a\x5f\x31\xc8\xaf\xa3\xf1\x4a" - "\x36\xce\x29\x06\x5f\x1b\x2d\xe9\xee\x68\xa3\x57\x73\x9c\xfb\x5a" - "\x17\x63\x49\x03\x8d\xa4\xe8\xeb\x90\x15\x30\x6e\xc5\xdc\xbe\x75" - "\x3b\x42\xe6\xdd\xbc\xaf\x43\x06\x2b\xfb\x3a\xa4\x9b\x7a\x5f\x4f" - "\xa8\x11\xf5\x57\x48\x7f\xd1\xd7\x21\x6e\xcc\x1f\x9f\x50\x29\xbf" - "\x9e\xc7\x84\xd5\xd4\xd7\xda\x30\x4b\xba\x3b\xba\x2c\x24\xd5\x05" - "\x5f\xc3\x73\xad\x73\xf0\x5c\x4f\x8c\x02\x5f\x1b\x6f\xdf\xfa\x21" - "\x13\x27\xdd\xbc\xaf\x27\xf6\x54\xf6\xf5\xc4\xb6\xea\x7d\xfd\x5a" - "\x85\xa8\xfd\x26\x76\x11\x7d\x3d\x31\x5f\xbd\xaf\x5f\x2b\x92\x5f" - "\x57\xe4\xb5\x18\xea\xeb\x0e\x85\xe0\x6b\x37\x34\xe1\xc4\xe5\xce" - "\x7d\x1d\x01\xcf\x75\x84\x83\xe7\x7a\x52\x18\x8c\xd7\x31\xb7\x6f" - "\x1d\x93\x49\x23\x6e\xde\xd7\x93\x3a\x28\xfb\x3a\xb4\x41\xbd\xaf" - "\x43\x0f\x8a\xba\x73\x92\x8f\xe8\xeb\x49\x99\xea\x7d\x1d\xba\x5b" - "\x7e\x7d\x93\xd0\x99\xd4\xd7\xbf\xeb\x61\x49\x77\x47\x8f\x4e\x52" - "\xd4\xff\x12\x5f\xc3\x73\x1d\xe1\xe0\xb9\x9e\x32\x12\x7c\x6d\xbc" - "\x7d\xeb\xa9\x4c\x79\xe2\xe6\x7d\x3d\xd9\xac\xec\xeb\xc9\xe7\xd5" - "\xfb\x7a\x72\xbe\xa8\x79\x27\xd7\x89\xbe\x9e\x92\xac\xde\xd7\x93" - "\xb3\xe5\xd7\x59\x99\x1c\x4c\x7d\xed\x97\x0c\xbe\x76\x43\x0b\x4f" - "\x99\xe0\xdc\xd7\x91\xf0\x5c\x47\x3a\x78\xae\xa7\x42\x5c\x1f\x19" - "\x73\xfb\xd6\x75\x99\xda\xf5\xe6\x7d\x1d\x76\x51\xd9\xd7\x61\x47" - "\xd5\xfb\x3a\x2c\x53\xd4\xdb\x61\x7a\xd1\xd7\x53\xa3\xd5\xfb\x3a" - "\x6c\xb5\xfc\x7a\x2f\x61\x43\xa8\xaf\xfd\x6b\x2c\xe9\xee\xe8\xf0" - "\xa9\x43\xdd\xd1\xe1\x0b\xb3\x88\x0f\xeb\xef\xd7\xff\x5f\x7b\xdf" - "\x03\x10\x55\x95\xfd\x7f\xe7\x8f\x89\x86\x32\x1a\xb8\xd4\x5a\x4d" - "\x2d\xee\x52\x5f\x52\x34\x4a\x2c\x4d\x54\x4c\x2c\x4d\xda\xaf\x5b" - "\xd4\xba\x89\x8a\x38\x83\xa8\xa8\xa8\xa3\x22\x20\x69\x4b\x86\x80" - "\x04\x2c\x26\xff\x2c\x6c\x69\xc3\xa2\xcd\x5a\xdc\xb5\x1a\x15\x37" - "\x54\x04\x6a\xad\xaf\x95\xd6\xe4\xa2\x91\xa1\x4d\x8a\x32\xc0\xcc" - "\xdc\xdf\x39\xef\xbe\xc7\x9b\xbf\x30\x7f\x94\x75\xfd\x35\xfa\x98" - "\x79\xf7\x9d\xfb\xf7\x73\xce\xb9\xe7\x9e\xf7\xde\xb9\x41\x7d\x6b" - "\x8b\xcf\x1d\xe4\x3d\xde\xcf\x7d\xe1\x1c\xef\xe7\xf6\xbb\x8f\xf7" - "\x73\x59\xa2\x2d\xfe\x5c\x93\x88\xf7\xdc\x38\xf7\xf1\x7e\x2e\xc5" - "\xb1\x2d\xfe\x5c\x88\x77\xb6\xf8\xdc\x50\x4f\x6c\x71\x7b\xbc\xe7" - "\xf9\xf7\xad\x3d\x1e\x6b\xf2\x1e\xef\xd8\xc3\xce\xf1\x8e\x7d\xc7" - "\x7d\xbc\x63\x53\x44\x7b\x3c\x56\x2b\xe2\x3d\x6f\xb6\xfb\x78\xc7" - "\x26\x3a\xb6\xc7\x63\x87\x7b\x67\x8f\xcf\x53\x7a\x62\x8f\xdb\xe3" - "\xbd\x40\xde\xb7\x36\xf9\xfc\xf3\xde\xe3\x3d\x7f\xaf\x73\xbc\xe7" - "\xef\x74\x1f\xef\xf9\x89\xa2\x4d\x3e\xdf\xc2\xff\xbd\x20\xd2\x7d" - "\xbc\xe7\xcf\x71\x6c\x93\xcf\xf7\xf5\xce\x26\x5f\xa0\xf0\xc4\x26" - "\xb7\xc7\x3b\xae\xad\x6f\xed\xf2\xb8\x53\xde\xe3\x1d\xf7\x86\x73" - "\xbc\xe3\xb6\xb9\x8f\x77\xdc\x1c\xd1\x2e\x8f\x2b\x17\xf1\x5e\xe8" - "\x41\xfc\xcc\xb8\x19\x8e\xed\xf2\x05\x46\xef\xec\xf2\x85\xc4\x13" - "\xbb\xdc\x1e\xef\xf8\xe6\xbe\xb5\xcd\xe3\x8f\x79\x8f\x77\xfc\x76" - "\xe7\x78\xc7\x6f\x74\x1f\xef\xf8\x19\xa2\x6d\x1e\x6f\xe1\xff\x5f" - "\x14\xe4\x3e\xde\xf1\xe3\x1d\xdb\xe6\x0b\x5b\xbd\xb3\xcd\xe3\xf5" - "\x9e\xd8\xe6\xf6\x78\xab\x8e\xf7\xad\x7d\xae\xfa\xc0\x7b\xbc\x55" - "\x2f\x3a\xc7\x5b\xb5\xdc\x7d\xbc\x55\xe3\x45\xfb\x5c\x95\x2e\xe2" - "\xad\xf6\x77\x1f\x6f\x55\x88\x63\xfb\x7c\xd1\x49\xef\xec\x73\x95" - "\xce\x7b\x3f\xf9\xe2\x6a\xb4\xcd\xdd\x8d\xff\xd8\x98\x2c\xbc\x73" - "\xa7\xb6\x88\xff\xb8\x78\x27\x71\x1a\x5b\x26\xc1\x74\x7d\xc7\x7f" - "\x4c\xe8\x25\xfe\x63\x82\x9b\xf1\x1f\x13\xce\xb8\xff\x3c\x7e\x42" - "\xb5\xb8\x46\x48\xb0\x58\xff\x2f\x66\x7b\x14\x5f\xd7\x71\x21\x13" - "\x6c\xe2\x42\xaa\xb9\xb8\x90\x34\xfb\x17\xd1\x9e\xad\x45\x16\xef" - "\xf3\xfe\xbe\xc0\xd2\x2c\x5c\x87\xb8\x1b\x87\x52\xe4\xed\xc4\x17" - "\x45\xde\x5e\xba\xc1\x39\x6f\x2f\xf9\xe2\xfa\x8e\x43\xb9\xe4\x0f" - "\x3d\xf3\xf6\x92\xf1\xee\xc5\x1c\x59\xe2\x41\xdc\x9b\x25\x59\xe2" - "\x7a\x68\x89\xc5\xfa\x77\x69\x7d\xdf\xf1\xb6\xa7\xf1\x29\x97\x24" - "\x59\xf3\x76\x62\x3a\xe3\xed\x5b\x2b\x3c\x5b\x77\x2d\x2d\xf2\xfe" - "\x3e\xc8\x72\x15\xae\xb9\xdc\x8d\x87\x29\xf2\xf6\xb2\x85\x22\x6f" - "\x2f\x7f\xc6\x39\x6f\x27\xbd\x77\x7d\xc7\xc3\x4c\x1a\xd7\x33\x6f" - "\x27\x05\xba\x17\xcb\x24\xa9\xc4\x7d\xde\x4e\x52\x89\x6b\xbf\xa4" - "\x2a\x91\xb7\x97\x57\xf6\x21\x6f\x7b\xa8\xb7\x93\x66\x58\xf3\xf6" - "\xb2\x39\x8c\xb7\x7f\x69\xf0\x6c\x8d\xb9\x3c\xd9\xfb\xfb\x3e\xc9" - "\x91\xb8\xbe\x74\x37\x2e\xa7\xc8\xdb\x2b\x26\x89\xbc\x9d\x6c\x17" - "\x17\x4a\xe4\xed\x95\xdb\xae\xef\xb8\x9c\x2b\x03\x7a\xe6\xed\x15" - "\x6d\xee\xc5\x48\x59\xb9\xd6\x7d\xde\x5e\x19\x29\xae\x73\x57\x66" - "\x8a\xbc\x9d\xbc\xa9\xef\x78\xdb\xd3\x78\x9d\x2b\x83\xad\x79\x7b" - "\x45\x38\xe3\xed\x3b\x66\x78\xb6\x9e\x4e\x8e\xf6\xfe\x3e\xd7\x1a" - "\x25\xae\xa5\xdd\x8d\x0f\x2a\xf2\xf6\xaa\xdb\x45\xde\x5e\x33\xc4" - "\x39\x6f\xaf\x5e\x72\x7d\xc7\x07\x5d\xd5\x4b\xfc\x9f\x55\x3d\xc4" - "\xff\x71\xf4\xae\xf0\x6a\x0f\xe2\x5e\xac\x56\x8a\x6b\xfa\xd5\x71" - "\x22\x6f\xaf\x89\xed\x43\xde\xf6\x50\x6f\xaf\x96\x5b\xf3\xf6\x2a" - "\x7f\xc6\xdb\xca\x72\xcf\x7c\x07\x6b\x42\xbc\xbf\xaf\xb7\xd6\x88" - "\x7e\x03\x77\xe3\x94\x8a\xbc\xbd\xa6\x43\xe4\xed\xb5\xe7\x9d\xf3" - "\xf6\xda\xe9\xd7\x77\x9c\x52\xcd\xb1\x9e\x79\x5b\x53\xe5\x5e\x4c" - "\x97\xb5\x1e\xbc\x07\xaf\x31\x8a\xfe\x8b\xb5\x16\xcf\xbf\xaf\x1b" - "\xdf\x77\xbc\xed\x69\xfc\x52\x8d\xce\x9a\xb7\xd7\xe8\x19\x6f\xdf" - "\xdd\xe6\x99\x9f\x64\x9d\x8f\xf7\x7e\x92\x0d\x3e\xdc\x3d\x4c\x37" - "\xe3\xa5\x8a\xbc\xbd\xee\x33\x31\x36\x51\x4a\x87\x2d\x6f\x8b\xb1" - "\x89\x52\x86\x5c\x3f\xf1\x52\xd7\x17\xf4\xcc\xc7\xeb\x93\xdd\xf3" - "\x89\xac\xef\x70\x9f\x8f\xd7\xd7\x8a\x3e\x91\x14\x8b\xe7\x5f\x36" - "\x08\x7b\x92\xf7\x41\xcc\xa2\x94\x92\x9e\x63\x16\xa5\xa4\x5c\xbb" - "\x38\xaa\xeb\x2b\xad\x63\x16\xad\xab\x37\x73\xb2\x30\x22\xca\x33" - "\xbf\xca\x06\x7f\xef\xfd\x2a\xe9\xec\xfe\xae\x9b\x71\x5b\x45\x59" - "\xd8\xf0\xad\x28\x0b\xe9\xfd\x9c\xcb\x42\xda\xed\xd7\x4f\xdc\xd6" - "\xd4\x9d\x3d\xcb\x42\x6a\xba\x7b\x3e\x94\x34\x0f\xe2\xc0\xa4\x36" - "\x89\x3e\x94\x34\x7f\x51\x16\xd2\x67\xf7\x9d\x2c\xa4\xbd\xd1\xb3" - "\x2c\xa4\x65\x5e\xbb\x78\xae\xa9\x7b\xac\x65\x61\xc3\x09\x26\x0b" - "\xbf\xa9\xf7\xcc\x0f\x93\xee\xd1\xfd\x6f\x6b\x59\x78\x5e\xc9\xdd" - "\xfb\x76\x33\x7e\xac\x28\x0b\xe9\xe7\x45\x59\x78\xde\xce\x9e\x17" - "\x65\x21\xe3\x9e\xeb\x27\x7e\xec\xc6\xdd\x3d\xcb\xc2\xc6\x2c\xf7" - "\x7c\x2e\x19\x43\xdc\x97\x85\x8d\x16\xef\x3f\x65\x58\xbc\xff\xf4" - "\x7c\x6c\xdf\xc9\x42\xc6\x7b\x3d\xcb\x42\x46\xfe\xb5\x8b\x2b\xbb" - "\x51\x6b\x2d\x0b\xe9\xcd\x4c\x16\xee\x8d\xf6\xcc\x6f\xf3\xbc\x0b" - "\xf6\x7f\x6f\x7e\x9b\x17\x42\xb8\xe7\x02\xdc\x8c\x63\x2b\xca\xc2" - "\xf3\x1d\xa2\x2c\xbc\x70\xbb\x73\x59\xd8\xfc\xc0\xf5\x13\xc7\x76" - "\xd3\xde\x9e\x65\x61\x53\x91\x7b\x3e\x9a\xcd\xb7\xbb\x2f\x0b\x9b" - "\x5a\x44\x1f\xcd\xe6\x10\x51\x16\x5e\x48\xec\x3b\x59\xd8\xbc\xbf" - "\x67\x59\xd8\x5c\x7e\xed\xe2\xdb\x6e\xaa\xb7\x96\x85\xe7\xf5\x4c" - "\x16\x42\x8e\x7b\xe6\xe7\x79\x21\xdc\x7b\x3f\xcf\x8b\xe1\xdc\x33" - "\x13\x6e\xc6\xd3\x15\x65\xe1\x8f\xfd\x44\x59\x78\xf1\x1e\xe7\xb2" - "\x90\x39\xe9\xfa\x89\xa7\xfb\xc7\x43\x3d\xcb\xc2\x1f\x2b\xdc\xf3" - "\xe9\x64\xde\xe3\xbe\x2c\xfc\xb1\x4d\xf4\xe9\x64\x86\x8b\xb2\xf0" - "\xa2\xa6\xef\x64\x21\xf3\x58\xcf\xb2\x90\x59\x75\xed\xe2\xec\xfe" - "\xf1\x84\xb5\x2c\xbc\x60\x64\xb2\x30\x2a\xc6\x33\xbf\xd0\x8b\x91" - "\xde\xfb\x85\xb2\x22\xb9\xe7\x49\xdc\x8c\xeb\x2b\xca\xc2\x96\x21" - "\xa2\x2c\x64\xf5\xb0\xcf\xc3\x4b\x33\xaf\x9f\xb8\xbe\x5b\x7a\xd9" - "\xff\x68\x4b\x4f\xfb\x1f\x39\xf0\x01\xbd\xf4\x80\xfb\xb2\xf0\x12" - "\x11\x7d\x40\x2f\x59\xbc\xff\x97\xb5\xa9\xef\x64\xe1\xa5\x5e\xf6" - "\x7f\x78\xc9\x85\xfd\x1f\x3c\x8d\xf7\xbb\xa5\xd9\x5a\x16\xb6\xf8" - "\x30\x59\x18\x7d\xd2\x33\x3f\x52\x56\xaf\xfe\x7f\x5c\xe7\x77\xf9" - "\xdb\xfb\x91\xea\x9b\xc3\xc9\xff\x3c\x8b\xb2\xb0\xd5\x60\x2c\x58" - "\x64\xc0\xf8\xc2\xa6\x20\x3e\x06\xe5\x46\x3e\xc6\x4b\x9b\x91\xc5" - "\xa0\xd4\x9b\xba\x63\x50\xb2\xd8\x1f\x44\x8a\xef\x02\xe3\x3b\xc1" - "\x46\x05\x8b\x3f\x49\xf1\x99\x28\x7c\x46\xea\x74\x1d\x17\x5f\x25" - "\xc5\x08\x7d\x3f\xdb\x4b\xfc\xc9\x58\x1d\xa9\x8f\x5d\x47\x8c\x43" - "\xbe\x8e\x65\xef\x09\x6f\xcd\xe4\xe2\x4f\xce\x0d\xbc\x2d\xfb\x6b" - "\xe2\xef\x87\xf1\x27\x63\xa9\x39\x4d\x47\xf5\x0d\x06\x02\xb4\x30" - "\xbe\xf3\x84\x18\x94\x5b\x7f\xc2\xbe\x1b\xe7\x06\xdf\x56\xfa\xb5" - "\xb3\xf8\xc2\x5b\x3d\x88\x03\xbb\xb5\x42\xf4\xef\x6c\x6d\x11\x79" - "\x34\x9b\x9b\x83\xe1\x7a\x7a\x7d\x0c\xe8\x98\xec\xb0\xd8\x2e\x8f" - "\x62\x6f\x64\xcb\x7b\xc7\x8c\x7b\x46\xc4\x4e\x7f\x89\x98\xe5\x54" - "\x19\x0b\x54\x1a\x8c\x73\xec\x3a\x66\xfd\x2e\x5e\x1b\xcc\x72\xc6" - "\xbb\x8e\x59\xce\x2e\x1b\xcc\x1c\xf8\x21\x72\xb6\xba\x8f\x59\x4e" - "\x8c\xe8\x87\xc8\x29\x16\x31\xcb\x69\x65\x98\xe5\x84\x31\xcc\x1e" - "\xc8\xea\xf2\x28\x7e\x47\x4e\xaf\xef\x7f\xe3\xba\xa9\xcb\xdf\x7e" - "\x5d\x2e\x62\xb6\x2d\x16\x30\x33\x60\xbc\x65\xd7\x31\xbb\xf9\xf4" - "\xb5\xc1\x2c\x57\xef\x3a\x66\xdb\x9e\xb1\xc6\xcc\xd1\x7a\x79\x9b" - "\x07\x7b\x76\x6e\xf3\x15\xd7\xcb\xdb\xa2\x45\xcc\xb6\x95\x33\xcc" - "\x72\x5b\x18\x66\x0f\xd6\x74\x79\x14\x03\x64\x5b\x62\xef\x98\x71" - "\xf7\xf4\x7b\x90\xb3\x97\xfd\x8d\x05\xb0\xc6\x84\xf5\xa3\xeb\x98" - "\x0d\xf9\xf4\xda\x60\x96\x57\xe1\x3a\x66\x2f\x0f\xb2\xc1\xcc\xc1" - "\xba\x2e\xef\xb2\xfb\x98\xe5\x69\xc5\x75\xdd\xcb\x72\x11\xb3\x97" - "\x67\x33\xcc\xf2\x8a\x19\x66\x63\x9b\xbb\x3c\x8a\x23\xf2\x72\xaf" - "\xfe\x2f\xb4\x43\xbb\xfc\xed\xd7\x39\x22\x66\xf9\x75\x80\x99\x01" - "\xe3\x4f\xbb\x8e\xd9\x83\x5b\xae\x0d\x66\xf9\x31\xae\x63\x96\xbf" - "\xdf\x1a\x33\x47\xeb\x8f\xfc\x37\xdc\xc7\x2c\x3f\x59\x5c\x7f\xe4" - "\xd7\x88\x98\x15\xf8\x30\xcc\xf2\xa3\x19\x66\xe3\x14\x5d\x1e\xc5" - "\x22\xc9\x3f\xde\x3b\x66\xdc\x3d\xd8\x1e\xe4\xac\x30\xc5\x58\x00" - "\x36\x3b\xd8\xe3\xae\x63\xf6\xfb\xc9\xd7\x06\xb3\x42\x5f\xd7\x31" - "\x2b\x5c\x65\x83\x99\x03\x3b\xb9\xd0\x83\x38\xd8\x85\xc1\xa2\x9d" - "\x5c\x98\x28\x62\x56\xb8\x8f\x61\x56\x28\x67\x98\x3d\x34\xbe\xcb" - "\xa3\x78\x26\x85\x4e\xe3\x7f\xf5\x64\x37\x0a\xcf\xe5\x8b\xb8\x15" - "\x85\x5d\x3f\xb6\xe3\x9f\x6a\x5d\xc7\xad\xe8\xbe\xde\x6d\xc7\xa2" - "\x00\xf7\x71\xfb\x93\x4e\xb4\x1d\x8b\x82\x44\xdc\x8a\x92\x19\x6e" - "\x7f\xda\xe7\x9d\xed\x58\x14\xe1\x89\xed\x68\x8f\xdb\xf6\xd6\xeb" - "\xc7\x7e\xdc\x9e\xe2\x3a\x6e\xdb\xcf\xf4\x6e\x3f\x6e\x3f\xe6\x3e" - "\x6e\xdb\x8b\x44\xfb\x71\xfb\x49\x11\xb7\x57\x42\x18\x6e\xdb\x93" - "\xbd\xb3\x1f\xb7\x3b\x8d\xff\xd6\x93\xfd\x68\x8f\xdb\x8e\x8a\xeb" - "\xc7\x86\xdc\x11\xe6\x3a\x6e\x3b\x4a\x7a\xb7\x21\x77\x6c\x76\x1f" - "\xb7\x1d\xd1\xa2\x0d\xb9\x23\x5f\xc4\x6d\x47\x33\xc3\x6d\x47\x88" - "\x77\x36\xe4\x8e\x6a\x4f\x6c\x48\x7b\xdc\x4a\xe6\x5c\x3f\x76\x64" - "\x71\xab\xeb\xb8\x95\xfc\xae\x77\x3b\xb2\xc4\x83\x3d\x8b\x4b\x7c" - "\x44\x3b\xb2\x64\x86\x88\x5b\x09\xbf\x07\x4b\x71\xb3\x77\x76\x64" - "\x49\xaf\xf1\x3f\x1c\xd9\x91\xf6\xb8\x95\xf9\x5f\x3f\xb6\x64\xa9" - "\x1b\xf6\x7f\xd9\xa0\xde\x6d\xc9\x52\x0f\xec\xff\x52\xc1\xfe\x07" - "\x79\x2b\xb3\xb0\xff\xcb\x78\xfb\xbf\xb4\xd8\x3b\x5b\xb2\xcc\x05" - "\xfb\xdf\xde\x96\xb4\xc7\xad\xbc\xfe\xfa\xb1\x27\xcb\xe7\xb8\x8e" - "\x5b\xf9\xa1\xde\xed\xc9\x72\x0f\xf6\x81\x2a\xd7\x88\xf6\x64\xf9" - "\x3e\x11\xb7\x9d\xbe\x0c\xb7\xf2\xd9\xde\xd9\x93\xe5\x4e\xe3\x3f" - "\x0a\xb8\x99\xfc\x17\x19\xa8\x03\x3f\xe4\x31\x55\x38\x1f\x9b\xf0" - "\xb5\x62\x53\xc0\x22\x83\xbb\xfb\xbb\x08\x31\xa7\x0f\x83\xc4\x9f" - "\x96\xbd\xf6\x80\x77\x71\xa7\x5f\x3d\xe3\x7d\xdc\xe9\x57\xdf\xb9" - "\x7a\xfb\xbb\xbc\xba\xdd\xfd\xb8\xd3\xaf\xc6\x89\x36\xe8\xab\x95" - "\x22\xd6\xaf\x71\xcf\x27\xb8\x17\x8f\xfa\xd5\x60\xef\xe2\x51\xbf" - "\x76\x1f\xe3\xaf\x9d\x2d\x2c\x1e\xf5\x6b\x41\x7d\xb3\xef\xcb\xce" - "\x7c\x8c\x47\x4d\xb3\x1f\x56\x79\x16\x1f\xf9\xb5\xca\xde\xf9\x59" - "\xa5\xa1\x0e\x7c\xb4\x22\x3f\xbf\x9e\x68\x0a\x50\x69\xdc\xdd\x67" - "\xc6\x9a\x9f\x5f\xef\xe7\x1d\x3f\xef\x7a\xcf\x7b\x7e\xde\xb5\xf1" - "\xea\xed\x33\xb3\x4b\xed\x3e\x3f\xef\x0a\x13\x6d\xf3\x5d\x1a\x91" - "\x9f\x5f\xaf\x72\x9f\x9f\x2b\x0c\xde\xf1\xf3\x2e\x13\xe3\xe7\x8a" - "\x1a\xc6\xcf\xbb\xda\xfa\x66\xff\x99\x8a\x38\xc6\xcf\x13\xaa\x3d" - "\x8b\x3f\xfd\xba\xc6\x05\x7e\x36\x50\x07\xfe\x6b\x91\x9f\xdf\x18" - "\x0f\xfc\x6c\x70\x77\xbf\x1b\x6b\x7e\xae\xfc\xcc\x3b\x7e\xae\xdc" - "\xec\x3d\x3f\x57\x3e\x79\xf5\xf6\xbb\xa9\x1c\xe7\x3e\x3f\x57\xca" - "\xc5\x35\x4b\x65\x94\xc8\xcf\x6f\xa4\xb8\xcf\xcf\x7f\xae\xf3\x8e" - "\x9f\x2b\x8f\x31\x7e\xfe\x73\x26\xe3\xe7\xca\xda\xbe\xd9\x07\xe7" - "\xcf\x61\x8c\x9f\x27\x1a\x3c\x8b\xef\xfd\x86\xd3\xf8\xc7\x22\x3f" - "\xab\x35\xd4\x81\x6f\x5f\xe4\xe7\x2a\x5f\x53\x80\x5a\xe3\xee\xbe" - "\x3b\xd6\xfc\xfc\xa6\x97\xfb\x5c\xbc\x79\x15\xf6\xb9\x78\xd3\x8b" - "\x7d\x2e\x6c\xf7\xdd\x79\x73\x80\xfb\xfc\xfc\x97\xe3\xe2\x5a\xee" - "\xcd\x40\x91\x9f\xab\x66\xb8\xcf\xcf\x7f\x29\xf2\x8e\x9f\xdf\xe4" - "\xf7\xbf\xf8\x4b\x0c\xe3\xe7\x37\xf3\xfb\x66\x3f\x9e\xbf\xc8\x19" - "\x3f\x4f\x8e\xf0\x2c\x7e\x7a\x55\xa0\x0b\xfc\x6c\xa0\x0e\xee\x7b" - "\x88\xfc\xfc\xd6\x49\xe0\x67\x83\xbb\xfb\xff\x58\xf3\xf3\x5b\xab" - "\xbc\xe3\xe7\xb7\x46\x78\xcf\xcf\xbb\x7f\xba\x7a\xfb\xff\xec\xfe" - "\xc2\x7d\x7e\xde\x5d\x21\xae\x71\x77\x5b\xdc\xff\x7f\x7b\xb8\xfb" - "\xfc\xbc\xdb\xcb\x7d\x81\xde\x5a\xc2\xf8\x79\x37\xbf\x2f\xd0\x5b" - "\x71\x7d\xb3\x2f\x50\xd5\x71\xc6\xcf\x91\x99\x9e\xc5\xa7\x7f\xab" - "\xa5\x77\x7e\x4e\xd0\x50\x07\xf7\x84\x44\x7e\x7e\xa7\xca\x14\x90" - "\xa0\x71\x77\x1f\x22\x6b\x7e\x7e\x67\xaa\x77\xfc\x5c\x7d\xd9\x7b" - "\x7e\xae\xde\x7f\xf5\xf6\x21\xaa\x7e\xc3\x7d\x7e\xae\x4e\x16\xd7" - "\xfe\xd5\x16\xf7\xff\xde\xf1\x60\x7f\xa2\xea\x70\xef\xf8\xf9\x9d" - "\x09\x8c\x9f\xdf\x36\x30\x7e\x7e\x27\xac\x6f\xf6\x27\x7a\xbb\x82" - "\xf1\xf3\xa3\x4d\x9e\xc5\xff\x7f\xa7\xd7\xe7\x3f\x1c\xf9\x37\x04" - "\xbf\x94\xc8\xd3\x7b\xd2\xbd\xf7\x71\xec\xb9\xd5\x3b\x9e\x7e\xf7" - "\xb0\xf7\x3c\xfd\x6e\xc1\xd5\xf3\x71\xbc\xeb\xc1\x5e\x7f\xef\x46" - "\x89\x3e\x8e\x77\xb3\x44\x9e\xde\xa3\x75\x9f\xa7\xdf\xf5\xf5\x8e" - "\xa7\xf7\x0c\x61\x3c\xfd\xd7\x7a\xc6\xd3\x7b\x7c\xfa\xc6\xc7\xf1" - "\x57\x8d\x77\x3e\x8e\x3d\x59\x9e\xf8\x38\xec\x79\xfa\x6f\xb3\xbd" - "\xf7\x73\xbc\x7f\xde\x3b\x9e\x7e\xbf\xc4\x7b\x9e\x7e\x5f\x7d\xf5" - "\xfc\x1c\xef\x3f\xe9\x3e\x4f\xbf\x3f\x5c\xf4\x73\xbc\x1f\x2b\xf2" - "\xf4\xdf\xf2\xdd\xe7\xe9\xf7\x74\xde\xf1\xf4\xfb\x67\x18\x4f\xbf" - "\x57\xce\x78\xfa\xfd\x93\x7d\xe3\xe7\x78\x6f\x86\x77\x7e\x8e\xbf" - "\xc5\x7a\xe2\xe7\xb0\xe7\xe9\xbf\x07\x7b\xef\xeb\xd8\xbb\xdf\x3b" - "\x9e\xde\xbb\xdc\x7b\x9e\xde\x3b\xe1\xea\xf9\x3a\xf6\x8e\x70\x9f" - "\xa7\x6b\xf4\xa2\xaf\x63\x6f\x98\xc8\xd3\x7f\x57\xb9\xcf\xd3\x35" - "\x7b\xbc\xe3\xe9\xbd\x7b\x19\x4f\xd7\x24\x33\x9e\xde\x5b\xdd\x37" - "\xbe\x8e\x1a\xa5\x77\xbe\x8e\xbf\x87\x79\xe2\xeb\xb0\xe7\xe9\x7d" - "\x46\xef\xfd\x1d\xfb\x0a\xbc\xe3\xe9\x7d\x53\xbd\xe7\xe9\x7d\x43" - "\xae\x9e\xbf\xe3\x1f\x1d\xee\xf3\xf4\x3f\x2c\xf6\xbf\xd8\x67\xf1" - "\xfe\xff\x07\xe3\xdd\xe7\xe9\x7f\x64\x7a\xc7\xd3\xfb\xb6\x32\x9e" - "\xfe\x47\x14\xe3\xe9\x7d\x9b\xfa\xc6\xdf\xf1\xf7\x36\xef\xfc\x1d" - "\x1f\xf4\x1a\xff\xc2\x91\xbf\xc3\x9e\xa7\x3f\x6a\xf2\xde\xe7\xf1" - "\x91\xda\x3b\x9e\xfe\xe8\x56\xef\x79\xfa\xc3\x33\x57\xcf\xe7\xf1" - "\xe1\x31\xf7\x79\xfa\xc3\x22\xd1\xe7\xf1\xa1\xc5\xf3\x4f\x5a\x85" - "\xfb\x3c\xfd\xe1\x1c\xef\x78\xfa\xa3\x79\x8c\xa7\x3f\x1c\xce\x78" - "\xfa\xa3\x98\xbe\xf1\x79\x7c\x50\xe7\x9d\xcf\xe3\xa3\x93\x9e\xf8" - "\x3c\xec\x79\xfa\x40\x85\xf7\x7e\x8f\x03\x13\xbc\xe3\xe9\xfd\xe7" - "\xbd\xe7\xe9\xfd\x7b\xaf\x9e\xdf\x63\xff\x4e\xf7\x79\x7a\x7f\xa2" - "\xe8\xf7\xd8\x6f\x11\xff\xfe\x40\xb3\xfb\x3c\xbd\x3f\xd4\x3b\x9e" - "\x3e\xf0\x00\xe3\x69\xad\x9e\xf1\xf4\x81\x90\xbe\xf1\x7b\x68\x8b" - "\xbd\xf3\x7b\x1c\xb0\x7b\xfe\x6d\xe5\xc2\xa5\x71\xca\x65\xf1\xf1" - "\x2b\x17\x26\x2b\x57\x26\xaa\x17\x2c\x9c\x30\x42\x38\x9f\x10\xaa" - "\x19\xa1\x19\x48\xe2\x96\xcc\x9b\xbb\x7a\x8c\x78\x31\x71\xe1\x52" - "\xf8\x1a\x48\x54\xf3\x56\xaa\x94\xc9\x6b\x93\x16\x2a\xf1\x6c\xc9" - "\x82\x24\x20\x59\x96\x2c\xa6\xfc\x76\x61\xe2\x3c\x8d\x7a\xe9\x22" - "\xe5\xbc\x44\xf5\xa2\xa5\x4b\x16\x2e\x4d\x56\xae\x58\xb8\x7c\x95" - "\x7a\xc5\x42\xfc\xbd\x52\x19\xbf\x6c\x05\x24\x2c\x58\xa8\x5e\xbd" - "\x50\x39\x7f\x55\x7c\xfc\xc2\x15\x2b\x07\x92\x99\xab\x12\x93\xd5" - "\x49\x89\x0b\x95\x91\x33\x27\xdd\x37\x7b\xea\xff\xce\x9e\x38\x71" - "\x20\xb1\xd8\x7b\x5a\x49\xf3\xb7\xe8\x81\x87\xe4\x67\x65\x8d\xf3" - "\x1a\x02\x09\xd9\x0a\xbc\x99\xb3\x82\x28\x5e\x5c\x41\xe4\x99\x17" - "\x89\xcf\xd6\x8b\xc4\x57\x99\x40\x22\xe8\x90\x9d\xb1\x39\x17\x89" - "\x3f\x1d\x36\x52\x43\xb7\x7d\x51\x4e\x87\x9c\xd2\xe9\x87\x1c\xc8" - "\x85\x34\x05\xdd\xb6\x5f\x8b\xd7\x00\x0b\x39\xdd\xf6\x75\xd4\x69" - "\x59\xa3\x52\x3f\xe4\x60\x52\xda\xf7\x44\x4a\x07\xd7\x2a\xde\x32" - "\xeb\xa5\xfb\xd1\xcb\x06\x63\x45\x64\x87\x82\xe1\xf0\x87\xa3\x16" - "\x8e\xe3\x44\xf6\xcf\xe1\x70\x44\xc2\x31\x03\x8e\x1a\x22\xfb\x98" - "\xc0\x11\x0a\x07\xa4\x7d\x1c\x03\x47\x1c\x1c\x89\x44\x56\x07\xe9" - "\x75\x4a\x38\xe0\x5a\x5d\x14\x2b\xa7\x2e\x1a\x8e\x26\x22\x3b\x1c" - "\x08\x07\xe4\x3f\x02\xe9\x47\x92\x89\xec\x28\xd0\x1d\xc9\x87\xa3" - "\x1a\x0e\x28\xf3\xc8\x49\x48\xc3\xfc\xb3\xd9\xb5\xa3\xf5\x44\x56" - "\xef\x03\x07\x94\x51\x0f\xf5\xd4\x6b\xe0\xc8\x82\xa3\x08\x8e\x72" - "\x38\xa0\x6d\xf5\x48\xa3\x23\xb2\x63\xd0\x86\x63\xb1\x70\x6c\x82" - "\x03\xca\x69\x80\x3a\x1a\x8a\x09\xf4\x91\x1d\x0d\xcd\xe2\x6f\xee" - "\x08\xb4\x39\xb7\x3d\xc2\xfd\x36\xde\xa9\xd3\xde\x6b\x04\xb9\x3d" - "\xb4\xd9\x94\x41\x64\xa6\x6d\x07\x93\x92\xee\x25\x92\x73\xb2\x43" - "\x4f\x36\x6e\x22\x84\x2a\xbe\x28\xd7\xae\xeb\xc4\xeb\x4f\xe2\x98" - "\xb5\x67\x1f\x8a\xd6\x91\xb7\x8a\x50\x3e\xdd\xe3\xcf\x43\xd1\x7c" - "\xfe\x5c\x9d\xe4\xb1\x58\xcc\x4f\xf3\x16\x1e\xa7\x69\x31\x3b\xf0" - "\x3d\xdc\xb3\x38\x86\x28\x37\xb9\x0b\x43\xa8\x62\x6e\x15\xea\x18" - "\xed\x3a\xae\x5d\xf7\x80\xbc\x0d\x86\xfc\xc1\x14\x70\xd4\x07\x00" - "\xe6\x19\x44\xce\x9d\x6f\x3b\x90\x4b\xcb\x0b\x4e\x30\xbd\x73\x88" - "\x5b\xbf\x74\x04\xa4\x85\xe2\x35\xc3\xae\xa7\x9b\x68\xc5\xb3\xb1" - "\xda\xa5\x9d\xa4\x59\xf6\xcf\x00\xd0\x7f\x52\xfa\xeb\xa7\x9b\xcc" - "\x85\x69\xa1\x35\xc0\x03\x48\xb3\x37\xb5\x05\xbf\x83\xa0\xdf\x52" - "\x9a\x9f\x66\x40\x1f\x90\x36\x35\x0f\x74\xf2\xa1\x7b\x3a\x02\x0a" - "\xb4\xca\xc7\xfc\xe8\x69\xac\x47\x8a\xf1\xd6\x0f\xf1\xcf\xf3\x1f" - "\x0a\xee\x08\x18\x99\x8e\x65\x9b\xca\x0b\xd3\xe1\x9a\x9c\x02\xef" - "\x41\x1b\x24\x17\x20\x9f\xa9\x60\xa4\x46\xfb\x18\x57\xe7\x3b\xd0" - "\x4e\x69\xda\x74\x28\xfb\xd5\xc2\xf4\xb7\xd7\x19\xa4\x14\xdb\xee" - "\x3f\x52\x03\xbc\xee\x6b\xca\x3e\xa0\xdf\x3e\x94\xc8\x4b\xf2\x08" - "\x29\x1b\x4a\x7c\xda\xb3\xff\x59\xa9\x93\x47\x55\x30\xbd\x77\x28" - "\x58\x0a\x34\x3a\xd9\x3f\x37\x51\xc0\x83\xab\x2b\x7f\x5d\x52\x0f" - "\x75\x75\x74\xd7\x55\xb8\x2e\x09\xeb\xe2\xc6\x87\x8d\x15\xfb\x2d" - "\x94\x53\x11\xd3\x53\x9b\x2f\x63\x19\x50\x6f\x0b\x7d\x3d\x26\xdd" - "\x54\xb8\x31\x1d\xaf\x21\x3d\x1b\xff\x03\xb9\x7e\x1b\x49\x1b\x85" - "\x34\x13\x8f\x81\x09\x31\x90\xa6\x83\xfe\x3a\x54\x87\xf5\xe9\x64" - "\x1f\x87\x99\x32\x94\x44\xf9\x18\x21\xad\xb2\x8f\x39\xdf\x04\x55" - "\xc4\x17\x33\x8c\x3f\xde\xaa\xa9\xa3\x66\x38\x4c\xa3\xea\x88\x44" - "\xfb\x18\xe2\xfb\x71\x95\xf2\xd1\xfe\x30\xce\x1f\xef\xee\x1e\xdf" - "\xbb\x0a\x71\x8c\x14\x30\x2e\xbe\xa6\x17\xa6\x40\xbf\x95\x04\xfb" - "\x61\x39\x5e\xd8\x9f\xf6\xec\x8f\x4f\xda\x8c\x99\x62\xfa\xf4\x34" - "\x6a\x51\xf6\x2e\xcb\xfe\xb7\x67\xd7\xf9\xea\x24\x53\x2a\x91\x5e" - "\x79\x37\xc7\x33\xf7\x98\xf8\xeb\xc8\xf7\x88\x33\x0d\xd8\xa2\xc7" - "\xf3\xdf\xdd\x43\x14\x7e\x75\x44\xaa\x4c\x0d\xaa\x61\xfc\x90\x66" - "\x80\x71\x31\xb0\xf2\xa0\x8f\x85\x89\x51\x90\x37\x58\xe4\xbf\xba" - "\x4c\xd3\xb6\xf8\xfc\x8e\x80\xf4\x6a\x43\xc1\xda\x24\x9a\x1b\x9f" - "\x8f\xef\x9f\x9f\x96\xd5\x6d\xe4\xc6\x20\xc3\x87\xb0\x76\xc4\x17" - "\xa5\x26\x52\x7d\xea\x4f\x50\xd7\xb0\xf4\xea\xbd\xab\xf5\x80\xd9" - "\xda\x24\xe4\x89\x9a\x2b\x06\x29\xc6\x04\xa4\x83\x0f\x0e\x2d\x65" - "\x7d\xf5\x81\xbe\x12\x2c\x17\xda\x5e\x27\xf6\xb5\x2e\x11\xf9\x03" - "\xea\xa8\xe2\x79\x3f\x18\xda\x25\x81\xb2\xab\x80\x4e\xaf\x93\xfc" - "\xa8\xe7\xe4\x6b\x35\x3d\x9e\xd3\x49\xc8\xa5\xd5\xd4\x38\xcb\xf8" - "\x8d\x19\xe6\x65\xd2\x9e\x7d\x58\xa1\x23\xbf\x2f\x17\xc6\x8c\xc9" - "\x5c\x77\x39\x5c\xac\x08\xfd\x10\x2c\xe7\x70\xb8\xa3\x72\x74\xb2" - "\xc3\x64\xae\x51\x29\xe9\xbc\x42\x9b\x72\x9e\x82\xb6\x65\x10\xda" - "\xb9\x9a\xd6\x6f\x88\xa2\x86\xec\x4f\x09\xd8\x46\x27\x09\xe8\xda" - "\xe1\x83\x25\x54\x3f\x6b\x2d\xf1\x1b\x9c\xe4\x47\x0f\xd7\x9d\x24" - "\xeb\xa3\x68\x4b\xa3\xc6\x44\x1a\xda\x9a\x49\xca\x17\xc4\x37\xed" - "\x18\xf1\x4f\x89\xa2\xfa\xfa\xd8\x93\x84\xa5\x1f\x23\x69\xdf\x12" - "\xf9\xfa\x5a\x6a\x78\x02\xe6\xe9\xa3\x27\x31\xbd\x19\xd2\x4d\x24" - "\xad\x85\x1a\x53\xff\x40\x7c\xf1\xf7\xb1\x5a\x4c\x3f\x43\x40\x9e" - "\xe5\xb3\x34\x7a\xbf\x52\xa8\x13\xf3\x97\x41\x5b\xcc\x57\xe8\xbe" - "\x9c\x2b\x84\xac\x7f\x86\x04\xa6\xcc\x23\x8a\x59\x60\x2e\x34\x1a" - "\xdf\x23\xb3\x4c\x14\xec\x80\x43\x64\x83\x9a\xf8\xcc\x32\xe2\xfb" - "\xe3\x9f\xc1\x51\x42\xca\x80\x16\xfa\xa6\xc5\xbe\xad\x3f\x05\x76" - "\xd1\x79\x21\xcf\x07\x7c\x9e\x53\x04\xc7\xac\x63\xc8\xa9\x26\xc3" - "\xb6\xaf\xa3\xa1\xef\x72\x1c\x03\xa8\xa7\xc9\x8c\xf9\xae\x70\xf3" - "\x13\x8e\x81\x64\xae\x11\x78\xb5\x40\x13\x3d\x57\xa3\xe5\xca\xd5" - "\xc9\x8e\x44\x94\xad\xe0\xda\x64\x45\x3b\xcb\x48\x2f\xe9\x03\x34" - "\x50\xd6\x11\xd5\x2c\xcd\x44\xca\xe3\x56\xd9\x9e\x7d\xa4\x52\x18" - "\x6f\x01\x17\xa0\x29\x06\x2c\x2a\x65\x49\x44\x0e\xd7\xeb\x74\x92" - "\x8b\xf5\x16\xbc\x8b\x7a\xeb\x26\x81\x96\xa7\x69\xd5\x49\x7e\xf2" - "\xb7\xa0\xd9\x07\x3c\xdd\x4d\xd3\x9e\x7d\x14\xf8\xff\xe2\x70\xf1" - "\x3a\xc7\xcf\xdd\xd7\xf9\xf9\x57\x28\x5b\x06\x7a\x38\xdd\x14\x90" - "\x4e\x68\xc0\x28\x05\xbd\x14\xe8\x4b\xa5\x80\x8d\x91\x1a\xcc\x05" - "\x8b\xa3\x61\x8e\xf5\x6d\x34\xb6\x11\x46\x7f\xf4\x1d\x5a\x30\x2a" - "\x90\x3d\xf3\x7a\x74\x3b\x96\x09\xb6\x58\x39\xcc\xd7\x8a\x59\x75" - "\xd4\x80\xfa\xc3\x54\x30\x36\x37\x7b\x05\xcc\xd9\x05\x69\x7a\x73" - "\xc0\x7a\x62\xd8\x59\xd0\x84\x73\x02\xca\x1b\xcd\x87\xbc\x7c\x39" - "\x50\x6f\x3f\x9d\xec\x68\x92\x09\xf2\xd3\xfc\xc5\xd1\x2c\x9d\xe9" - "\x37\xa6\x87\x8e\x26\xd1\x11\x70\x2d\x77\xee\x26\xb8\xd6\xef\xb4" - "\xec\xa8\x11\xd2\x09\x9c\xef\xd3\xa6\x5e\x04\xda\x7a\x09\xe3\xe9" - "\xb9\xe9\x56\xe7\x52\x1c\xcf\x8f\x67\xa0\x8e\x42\xdd\x04\xe9\x77" - "\x89\x7a\x82\xcd\x01\x4c\xb7\x2f\x8e\x6d\xcf\xae\x0f\xd3\x49\x66" - "\x9e\xc0\x71\x42\x6c\xdb\x98\x5e\x0b\x37\xed\x2c\x38\x71\x30\x8a" - "\x90\x83\xb5\x28\x47\xf5\x31\x3a\xc9\xac\x56\x71\x2c\xeb\x97\x23" - "\x2d\xd7\x4e\xd0\x25\xf8\x9b\xd3\x2b\x90\x07\xe4\xbc\x1c\xe7\x2c" - "\xa6\x1f\xeb\x13\x71\xde\x02\x3d\xe1\xc3\xe6\xa9\x98\x18\x28\x7b" - "\x0e\x1d\xfa\x4a\x26\xb4\x2b\xfd\x34\xdf\x16\xcb\xb6\x09\x7a\x91" - "\x6e\xdb\xe1\xc3\x68\xe3\xab\xa1\xfe\x13\x3a\x49\x74\xad\x25\xbf" - "\xb0\x7e\x1d\x9b\x04\x3c\x7d\x62\x54\x2d\x9c\x83\x2d\x25\x94\x07" - "\xfa\xc5\x07\xf4\xca\xbd\xc8\x6f\xa8\x53\x8a\xf2\xd0\x3e\xda\xa1" - "\x30\x6c\xdb\x11\xd8\x9e\x7d\x2c\x48\xd0\x2d\x98\x17\xe5\x01\xf4" - "\x8b\x0f\xa7\x37\x4c\x46\x19\x27\xf3\x26\x12\xd2\xad\x4b\x20\xad" - "\x63\xc8\x0e\x05\x9f\x2e\xe7\xda\x24\x95\x99\xa1\x7e\x89\x50\x5f" - "\xc7\x90\xf8\x72\x28\x37\x45\x27\x99\x60\xb0\xd2\x35\x79\x73\x02" - "\x29\x8d\x41\xbe\x91\x41\x5b\x77\xc2\x77\x7f\x9e\x4f\x6f\x3e\x08" - "\x66\x55\xe4\x54\xa8\x03\xf0\xdc\x3e\x8c\xea\x21\xff\x3e\x1d\xc9" - "\xe4\xda\xf5\x22\x9c\x63\x3a\xd2\x40\xfa\x71\x1d\x79\x31\x9f\x2f" - "\xb7\x0e\xf1\xb1\x2e\xb7\x41\xc2\xca\x6d\xe8\x87\xe5\xf1\x73\xfc" - "\xcd\xf8\x1b\xf3\x63\xd9\x25\x85\xb4\x15\xcb\x6b\xcf\x6e\x50\x0a" - "\x75\x6c\x85\x34\xa1\x9e\xc8\x25\x42\x5d\x0d\x11\x50\xd7\x70\xcb" - "\x3e\x14\x15\xd2\x36\xd6\xbe\x86\x39\x3a\x52\x52\x87\xd7\x32\x21" - "\x0d\xf3\x32\x5e\x68\x58\x8b\x7c\xa2\x63\xfd\x92\x31\x7e\x69\xc8" - "\xd4\x91\xe2\x68\xcb\xb9\x07\xb0\x18\x24\xcc\x4d\x7c\x79\x55\x42" - "\x79\x62\x59\xac\x0c\x9a\x5b\xec\xc3\xcb\x02\xca\xac\x2f\x96\x0f" - "\xf4\x27\x75\xe4\x25\x7e\x4e\xf8\x78\x46\x1b\xe3\x6d\xc4\x00\xf3" - "\x30\xcc\xb3\x0f\x86\xe3\xbc\x59\x96\x87\x7a\x2c\xbe\xb8\x3d\xbb" - "\x51\x61\x33\x67\xfa\xb0\xf9\x2c\x5d\x89\xbc\xc1\xcb\xff\x93\xd8" - "\x26\xa1\xbf\x50\x8e\x1c\xca\x79\x0c\x79\x1a\xcb\x01\x3d\xa7\x83" - "\x72\x62\x6c\xca\x91\x23\x9d\x29\xfb\x60\x1a\xce\xd1\x2f\x0f\xa3" - "\x2d\x40\x93\x22\xd0\xe0\x75\x18\xd7\x47\x20\x2d\x57\x47\xaa\x12" - "\x31\x2d\x1b\x68\x74\xb2\x83\x4e\xdf\xdb\x49\xbd\x8b\x48\x1b\x8b" - "\x75\xb8\xa6\x45\xf9\x1d\xdf\x38\xbc\x8d\x34\x16\x9b\x89\xf9\xf5" - "\x67\x48\x44\x2a\xd5\x9e\x95\x35\x0d\x6a\x30\xb4\xb8\xb9\xf6\x6f" - "\xe4\x9e\x7f\xa7\x9d\xb0\xf6\x4a\x19\x43\xd0\x2e\xb9\x20\xfb\x64" - "\x42\xa3\xfe\x22\xa7\xcb\xe0\x37\x37\x07\xbe\x0c\x6b\x35\x5c\xaf" - "\xc1\x9a\x5c\x95\x2b\x65\x6b\x36\x33\xd0\x96\x62\x3a\xae\xe7\x60" - "\x8e\x2a\xb3\xb8\x46\x5f\x7f\x3a\x9d\x8d\x5d\xd3\x65\x4e\xa7\x63" - "\x7b\x8d\xd3\xb4\xd8\x66\x73\xc5\xd3\xe9\xd8\x87\x34\x0d\x35\x37" - "\x1a\xdb\xb5\x38\x8f\x29\x57\xe3\x5a\xb3\xe9\x93\x59\x25\x84\x9a" - "\x77\x3d\xed\xe6\x5a\xaf\x89\x7b\xf7\x06\xd6\xe3\x17\xf4\x23\x9e" - "\x4e\x4f\x33\x11\x69\x4e\x6a\x3f\x9f\x29\xc5\x54\x7b\xe9\xd7\xcf" - "\x00\x5f\x34\xb5\xed\xd7\x10\xe2\xbe\x8d\xde\xd4\x26\xf4\xbd\x94" - "\xef\x3b\xa4\x71\xef\x8b\x8c\x2a\x4a\xe7\xfa\xab\x93\x7d\xe2\x34" - "\xd6\x1b\xcd\xf0\xa3\x07\x8b\x8d\x64\x65\x31\xed\x5c\x59\x42\xa4" - "\x60\x23\x35\xbd\x5d\x7a\x02\xf5\x76\x84\x30\x9e\xdc\xd8\x19\xf5" - "\x24\x29\x95\x28\xce\xc9\x3e\xf9\x6c\x56\x4a\x3a\xb7\x77\xd3\x47" - "\x40\xe7\x5e\x5b\x3f\x29\xc7\x76\x34\xc0\xfa\x7e\x96\x31\x8d\xb2" - "\xb9\xe7\x13\xd3\x13\x7c\x79\x78\x4d\xc0\xaf\x94\x5f\x77\xbb\x5f" - "\xc7\xa7\x4e\xe3\x7f\xf4\xd0\x57\x85\xe3\xbe\x7e\xba\xdf\xf3\xbe" - "\x7e\x9a\x65\xdf\xd7\x4f\xbf\xbf\xca\x7d\x75\xba\xff\x57\x0f\x7d" - "\x55\x3a\xee\xeb\xbf\x76\x7b\xde\xd7\x7f\x69\xec\xfb\xfa\xaf\xcf" - "\xae\x6e\x5f\xff\xe5\xd4\xff\xd7\x43\x5f\x43\x1d\xf7\xf5\xf8\x76" - "\xcf\xfb\x7a\x3c\xce\xbe\xaf\xc7\xf7\x5f\xdd\xbe\x1e\xaf\x73\xda" - "\x57\xa9\x1f\x45\xfd\x04\x7a\xa9\x33\xb5\x03\x6c\xb6\xc2\x8c\xdc" - "\x0d\x3b\x89\xb4\xbe\xcd\x40\x1a\x86\x9f\x20\x69\x6b\x89\x74\x64" - "\x12\xe8\xbd\x0c\x32\x9e\x16\x8e\xcc\x6d\x28\x6e\x85\xf4\xb3\xe4" - "\x98\xc6\x40\x22\x56\xa0\xfe\xfd\x6c\x6b\x63\x9c\xbb\xfa\xf7\xb3" - "\x98\x6e\xfd\x6b\x1c\xc3\xeb\xdc\xcf\xf7\x36\xb4\x76\x12\xec\x3f" - "\xfc\xde\xd5\xad\x7f\x33\xd8\x78\xdb\xea\x5f\x1c\x8f\x46\x83\xc1" - "\x4a\xff\xb2\xf7\xb7\x3e\x5f\x6e\xab\x7b\xb3\xcf\x11\xe2\x58\xf7" - "\x7e\x3e\x13\x75\x6f\x29\x5c\x77\xaf\xfd\x9f\x07\x0a\xba\x37\x17" - "\xea\xb4\xd4\xbd\x07\xe3\x70\x4e\xfe\x3c\xc9\x33\xdd\xfb\x79\x92" - "\xd0\xef\x12\xbe\xdf\x30\x56\xc7\xad\x75\xef\xe7\x4e\xdf\x75\xb1" - "\xe4\x5b\x5a\xb8\xa8\xfa\xed\x3b\x0c\xfd\xcc\x15\xcf\x68\x71\x7e" - "\x6b\x87\x31\xf9\x5b\xa9\x41\x7e\x56\xf6\x7f\x2c\x56\x41\x7b\x9c" - "\x84\x56\xc4\xa8\x66\x25\xd3\x6f\xe8\x88\x67\xb4\xe8\x43\x45\x5f" - "\x00\x5c\xff\x03\xdd\x15\xa3\x72\xaf\xdd\xac\x4c\x98\xff\x48\x2a" - "\xc8\xcb\xdb\xab\x0d\x52\xf3\xfa\x18\x3f\xc0\x41\x41\x0b\x16\xeb" - "\xe9\x0b\xff\x3b\xfe\x52\xc1\xc6\xd8\x43\xc1\x67\x08\xd2\xd2\x8d" - "\xf2\x08\x2f\xda\xdf\xd2\x73\xfb\x4f\xdc\xee\x41\xfb\x5b\xdc\x68" - "\x7f\x8b\x4b\xed\x1f\x06\xed\xef\x0c\xef\x07\x6b\x42\xe9\x47\x9d" - "\xe1\x72\xf7\xda\x73\xc2\xe9\xfb\x1f\x57\xb1\x0e\x97\xf5\x1f\x1d" - "\xa6\xd1\xbf\x5d\xaa\x97\x82\x0e\xe0\xe6\x70\x94\x3d\xa6\xff\x5a" - "\x40\x67\x7d\x43\x99\x4e\xd2\xbb\xa9\x93\xbe\x98\xe3\x7a\xfd\x4b" - "\xa2\xaf\x41\xfd\xce\xfb\x6f\xab\x13\xdf\x7a\x56\xe7\x5c\x27\x26" - "\x46\xdb\xeb\xc4\x2f\x77\xba\xaf\x13\xbf\x4c\xb4\xd7\x89\x5f\x1d" - "\x13\x75\xe2\x57\x7b\x3d\xd7\x89\x5f\x6d\x76\x5d\x27\x7e\x35\xcf" - "\x33\x9d\xf8\x55\x48\xcf\x3a\xf1\xab\x4d\x9e\xe9\xc4\xaf\x36\xd9" - "\xeb\xc4\x2f\x5b\xac\x75\xe2\x57\x4e\xf7\xfa\xa3\xb9\x8f\xeb\x60" - "\x8e\xf6\x3d\x27\x3b\x99\x65\xcc\x20\xc4\x9c\xfb\x71\xe6\x2c\x13" - "\x6d\xa7\xdb\x1e\xd7\x99\xa5\x61\xa8\x57\x22\xda\xdb\x55\x3e\xe6" - "\x35\xc1\xbe\x74\xe8\xdc\x7b\x69\x57\x20\x81\x71\x0a\x82\xf6\xfb" - "\xd1\xf6\xe0\xc1\x74\x4d\xf0\xd0\xe2\x2b\xc4\x1f\x8e\xc0\x62\x7e" - "\x3e\x86\xdf\xa1\x74\x4d\xe0\xc0\xec\xd5\x24\xc4\xaf\x8d\xf8\x40" - "\x1b\x62\xfc\x36\x2a\x08\xe8\x20\x7f\xfc\x4d\x33\xbe\x09\x2e\xbb" - "\x42\xe4\x7e\x1a\xc0\x66\x08\xd4\xa7\xf1\xa3\x74\x65\x30\x29\x5b" - "\x41\x7c\xcc\x52\x12\x58\x2a\xa5\xd5\xc6\xf6\x60\xa9\xc9\x3f\x5d" - "\xc1\xf0\x39\x15\x41\x87\xc1\xda\x2b\x3f\xed\xa4\x79\x58\x5a\xad" - "\x29\x4d\x25\xa3\xeb\x63\x64\xd8\x56\x53\x7e\x9a\x96\x16\xc2\x91" - "\xa6\x1a\x8c\x36\x74\xd9\x6a\xa8\xbb\x3d\x70\x60\x0e\xd4\x5d\xba" - "\x9a\x04\x95\x5c\x21\xc1\xf4\x52\xb0\x14\xf0\x8f\xc1\x3d\x50\x61" - "\x8c\x62\xcc\xd2\x6f\x82\xe1\x9a\x1c\x75\x22\xc5\xfa\x8d\x50\x7f" - "\x57\x30\xfa\xb1\x80\xb7\x49\x60\x19\xd4\x6f\x5a\x13\xec\xa6\xbc" - "\x9c\xe2\xde\x3d\x16\xda\x65\x0e\x99\xaf\xa3\x6f\xc1\x81\xed\x82" - "\x31\x2c\xc3\x31\x19\x39\xbf\x19\xdb\xb6\xf5\x0a\x09\x81\x76\x06" - "\x41\x1b\x82\xa1\x5e\x8c\x1f\x13\xf3\xdc\x72\x05\xf2\xa8\x55\xdb" - "\x4c\xdb\xf8\xb6\xfd\x08\x6d\xbb\x20\xb6\x0d\xeb\xc2\xf1\x71\x76" - "\x6f\x76\xd6\x86\x3b\x50\x36\xbf\xf3\xd3\xf4\x8f\xc2\xfb\xb4\x97" - "\xd6\xbb\xfb\x2c\xe5\x29\xa7\xef\x3f\xe7\xbc\x45\x86\x53\xc5\xfe" - "\xcc\x27\x36\x7f\x43\xd1\x4f\xb8\xf9\x2d\x12\xd2\x08\x72\xdd\x60" - "\x38\x4f\xe8\x90\xfd\x99\x87\x82\x5b\xdd\xac\xeb\x6b\xa7\xf1\x4f" - "\xb7\x64\xd0\x26\xb3\x7f\x3a\xa1\xfe\x1b\x63\x72\x32\xa8\xa6\x2b" - "\xe8\xe9\xf2\xce\xa0\x98\xa4\xb9\x46\x05\xf0\x35\xd5\x28\x57\x10" - "\xe5\x59\x59\xf3\x8b\x47\x8e\xc3\xba\xf4\x59\xe2\x73\x5a\xd6\xac" - "\x4d\xfb\x02\xef\x61\x7d\x7d\xdc\xfa\x1e\xd6\xd7\x06\x22\xd3\xa9" - "\x88\xec\x5b\x0d\x91\x9d\x2e\x26\x40\x67\x7d\xfc\xbb\x86\x95\xa5" - "\x9b\x3a\xeb\x8d\x3b\x48\xaa\x91\x7e\x47\xf3\x47\xd5\x65\x4b\xa9" - "\x61\xd6\x3d\x12\x9d\x76\x35\xde\xdb\xd1\x4d\x80\x31\xfd\x01\xe6" - "\x5a\x3f\xf8\x3d\x00\x30\x25\x49\x2b\xc8\x2d\xe7\x64\x3a\x1f\x94" - "\x1b\xbf\xb6\xfe\x51\xa6\xb4\x18\x62\x54\x16\x34\x75\xe5\xa7\xe9" - "\x4d\xf9\x8b\xa3\xcd\x8a\x8f\x33\xd1\xcf\x8b\xf7\x64\x41\x36\x62" - "\xe6\x9a\x7c\x50\x1e\x63\xb4\xf3\x8f\x90\xb3\xc9\x44\x9a\x76\x99" - "\x0c\x02\xde\xec\x96\xab\x99\xad\x7e\x86\x0d\xad\xd4\x8c\xb2\x85" - "\x7e\x55\xb8\x36\x38\xf5\x32\xac\xef\xf5\x2d\xa4\x78\x05\xf1\x37" - "\xad\x54\x0d\xd5\x5f\x52\xdd\xb2\xc3\x4c\xfc\x07\xb7\x11\x45\xf1" - "\x45\xe0\xa9\x95\xc0\x4f\x17\x41\xce\xf4\x4c\xce\x30\x06\x40\x29" - "\xca\x58\xf6\x4d\xa1\x65\x17\x99\x8c\x71\x7c\x84\x32\xb6\x0c\xf8" - "\x68\x29\xce\x1f\xc0\x47\x19\x20\x63\x20\x17\x34\xfb\x54\x4d\x71" - "\x06\x45\xbf\xaf\xb4\xec\x5c\x7f\xbc\x26\xe9\x77\x8f\x54\x79\x24" - "\xda\x40\x44\x5f\x47\xf3\xfe\xce\x11\x31\x49\xca\xdf\xd2\x1f\x4f" - "\xcb\x74\x61\x90\xee\xa3\x7c\xea\x37\x0a\x18\xef\xfd\xcc\xef\xd6" - "\xac\x45\x5f\xa6\x0e\xc6\x02\xc7\x45\xf9\x5b\xf2\x9b\xd3\xb2\x6f" - "\x06\xe0\x38\xae\xa9\x24\xb2\xa4\x47\x68\x33\x8c\x99\x82\x72\xfe" - "\xbe\x6f\xb8\x67\x65\xf0\xbe\xff\x51\xee\x9e\x1a\xcb\x63\x82\x71" - "\x33\xfa\x8f\x0a\x04\xbc\x95\xda\x84\x4e\x4e\x0f\xe1\x38\x9e\x4d" - "\x24\xd2\xb9\xad\x30\x56\x26\x18\xab\xf6\x60\x5f\xd0\x47\xd1\xa8" - "\x8f\x68\xee\xdc\xa0\x14\x1d\x35\xcf\x8a\x93\xd1\xd4\xe5\xc4\x07" - "\xfd\xdb\xcf\x25\x11\xba\xe1\x3c\x8c\x57\xdb\x09\x02\x7a\x69\x30" - "\xe8\xac\xa1\x25\xab\x89\x3f\x8e\xd7\xa0\x56\xb0\x55\xf2\x0e\xa6" - "\xbf\x95\x5a\xd7\xcf\x04\xfc\x8b\xfa\xc9\x6f\xa3\x64\x00\xc8\xd9" - "\xe0\x2c\x94\x47\x90\x4f\xbf\x8d\x9c\xbe\x8c\x29\x06\x39\x34\xae" - "\x09\xbe\xbb\x6b\x4d\xb0\x12\x8e\x3b\x04\x1d\x26\xe8\x0f\x9a\xfd" - "\xb5\x12\xf5\x57\xa3\x46\x47\x8c\x30\xb6\x83\x71\xae\x5b\x13\x3c" - "\x9c\x1b\xe3\x45\xc1\x64\x94\x81\x48\xa0\x4d\x0a\x68\x2f\x29\x8b" - "\x27\x3e\xc7\x54\xa7\x89\x09\x64\x43\x18\xf7\x99\x6a\x25\x81\x72" - "\xa5\x87\x82\x3f\x23\xfc\x98\x49\x9c\xf3\xdd\xe9\x02\x91\xef\x4e" - "\x17\xe0\xd8\x31\xbe\x3b\x9d\x7f\x23\xf2\xdd\xd1\x18\x8e\xef\x64" - "\x5d\x23\x38\x7e\x52\x34\x1a\xff\x0a\x63\x74\x3a\x1d\x79\x04\x79" - "\xe6\xf0\x5f\x90\x67\xfe\x5d\x79\xbd\xf2\x4c\x47\x7b\xb0\x12\x8e" - "\x6b\xc2\x33\x50\x2e\xc7\x33\x38\x56\x47\x63\x3a\x89\x30\x46\x9c" - "\xac\xe6\xee\xcf\x54\xa6\x91\x89\x20\xab\x5a\xbf\x8d\x77\x90\x63" - "\xdc\x38\x35\x6b\x95\x4f\x51\xf3\x69\xd9\xbf\xbf\x4d\xfb\x84\x28" - "\x3a\x33\x28\x6d\x34\xee\x26\x66\xff\xf5\x04\xef\x4f\x9a\xf3\xc7" - "\xe6\xc2\x9a\x55\x43\xb7\x9d\xd2\xa1\xef\xdd\x2f\x09\xfd\xdd\x07" - "\x72\x4d\x05\x5b\xf4\xe6\x6d\xfb\xb5\x74\xc8\xd7\x51\x78\x8f\xc1" - "\xbc\x6d\x67\xac\x79\xc8\x17\xe5\xed\xd9\xcd\xc1\x3a\x42\x39\x9f" - "\x3f\xcd\x4f\x47\x1b\x0c\xf5\xef\x93\xec\x7e\x18\xde\x3b\x6c\x8e" - "\x12\xee\x7b\xa3\x4e\xe0\xef\x31\xf0\xf7\x20\x9a\x11\xc3\x81\x78" - "\x0f\x82\xd7\x29\xe3\x84\x7b\x10\xc2\x39\x5e\x87\x7c\xe3\xb9\xfb" - "\xb0\x62\xbe\x1a\x9e\x8e\xcf\xf7\xf5\x07\xa8\xeb\xc5\x7c\xec\x1c" - "\xe6\x91\x9a\x2e\x29\xf1\x71\x68\xe3\xf8\x6f\xd1\x83\xfc\xc0\xda" - "\xe8\xec\x38\xf8\x96\x9e\x95\x9d\x79\x06\xbe\x65\xf0\xcd\xf9\x31" - "\xdd\x9b\xaf\x9a\xdb\xd8\x7d\xa0\x8d\x9b\xf8\x76\x5f\xe6\x64\xf2" - "\x5e\x32\xe8\x1c\xff\xbb\x3d\xfb\x4c\xb4\x70\xff\xbe\x9b\x5e\xc4" - "\xa7\x15\xeb\x06\x8c\xe4\xec\x99\x02\x76\x8e\xcf\xeb\xf0\xe5\x71" - "\xe7\xe6\xa0\x67\x63\xb5\xa9\xa7\x49\xab\xec\xcc\xbe\x46\x98\xc3" - "\xcd\x85\x1b\x37\xe1\xfd\x31\x94\x2b\xa1\x5e\x90\x45\x1f\xed\x3a" - "\x8e\x86\x7b\x4f\xd4\x9c\xaf\x89\xa5\x85\xa3\x72\x71\x2d\xd8\x4e" - "\x55\x8f\xf0\xdf\x13\x50\x9e\x98\xdf\xe4\xec\x00\x0a\xd8\xe2\x1e" - "\xee\xdd\xcf\x30\xe1\xde\xea\xe9\x72\xe5\xfe\x14\x36\x57\x0a\xed" - "\xc5\xfd\xd7\xf1\x19\xa1\xdf\xa4\x93\xf4\x76\x07\xfb\xaf\x8b\xcf" - "\x12\x9d\x69\x33\x17\x68\x62\xdb\xb3\xcf\x46\x02\x06\x9b\x2c\xfb" - "\xec\x08\x0b\x9d\xec\x6c\xac\xb3\x6b\xee\xe1\x70\x36\xc5\x59\x39" - "\x53\x83\x4d\xd4\xcd\xb2\x9c\xfb\x7f\x82\x9e\x26\xb3\x2a\x4d\x5a" - "\x73\x57\x8c\xdf\xa1\x94\xf3\x6e\xda\x36\xdf\x29\x9d\x95\x6b\xca" - "\x5f\xaf\xec\xfa\xf5\xd3\x28\xcb\xbe\xa6\x65\x31\xd3\x1a\x2a\x8d" - "\xe4\x8d\xa5\x2d\x52\xd4\x87\x55\xe7\xaa\xa5\xb3\xee\xe1\x6d\xb8" - "\x66\xa2\x40\xbf\x17\xda\x72\xd9\x17\x48\x50\x67\x5a\x8c\x5f\x67" - "\x57\x0c\x79\xe9\x02\x19\x6f\x5e\x14\x38\x30\x2b\x9e\xc8\x3b\x40" - "\x17\x76\x7c\xa7\xf2\x3b\x7a\xb2\x85\x7c\x04\x79\x1b\xda\x74\xa4" - "\x14\x68\xe9\x77\x31\x83\x1f\x8f\xa5\x86\xfa\xd8\xbf\x92\x59\xc1" - "\x26\x6d\xea\xb7\x64\x10\xe8\x44\x45\xa3\x66\x17\xac\xa1\xce\x93" - "\x7e\x6b\xa5\xca\x46\xe3\x19\xb2\x35\x1e\x74\x29\xe8\xce\xb4\xdf" - "\xc1\x9c\x01\x3c\xb1\xc3\x72\xce\x48\x78\x45\x9c\x33\x7e\x84\x39" - "\x23\x0f\xe6\x8c\xb4\x40\xd2\x90\xa4\x25\xa0\xc3\xfa\x3f\x91\xe4" - "\x67\x48\x4d\x82\xb9\x63\x2d\xcc\x1d\x9a\x33\x84\x9b\x37\x5a\x5b" - "\x08\xe8\xfc\xc1\x25\x4b\x89\x7f\xe7\x8f\x30\x77\xfc\x08\x73\x47" - "\x2a\x9b\x3b\xb6\x5f\x80\xb9\x63\x19\xac\x0d\x96\xc2\xdc\xd1\xea" - "\x60\xee\xb8\xe0\x78\x5d\x20\xe8\xc1\x8e\x1f\x83\xa5\xdb\x61\xde" - "\x58\xf7\x19\x91\x6e\x7f\xaa\xbf\x9b\x3c\xd3\xe2\xf4\x3e\x0a\x2d" - "\xdc\xb8\xc0\x4c\x63\x08\x8e\xfb\x3a\x03\xcc\xc3\x80\x4b\x63\xb0" - "\x91\xf8\x1d\xef\x1f\xd5\x01\xe9\x5d\xc3\x16\x35\x55\x7e\xa9\x97" - "\xd2\xfc\xc5\xfa\x0e\xc0\x6d\xdd\x2a\x22\xed\x02\x0c\xab\x7e\x9b" - "\x2b\xc5\x75\xa2\xb9\x40\xe5\xcf\xd6\xa4\xe7\x0e\xa3\x4f\xc4\x4f" - "\xc7\x70\x33\xd2\x18\x3f\xba\x20\x66\xd0\xd6\xf9\x44\x6e\xfa\x77" - "\xe0\x40\xf3\x82\x40\x9f\xd4\xcf\x88\x42\xbf\x40\x05\xe3\x75\x9e" - "\x7c\xf4\x69\xae\xb4\xec\x59\xa2\xc4\x78\x8d\xf4\x05\x53\x4b\xd9" - "\x73\x24\xbc\xec\x6b\x12\x56\xfa\x2c\x09\x29\xf9\x12\xe3\xba\x03" - "\x86\x2d\xd4\x70\x4c\xf5\x77\x52\xf6\x25\x89\xa0\x85\x09\x4d\x34" - "\x60\xbd\x12\x7e\x87\xe7\x3e\x0b\xeb\x07\xb8\x3e\x2b\xb8\x43\xdb" - "\xa8\x39\x46\xb2\x4e\x13\x92\xfa\x3d\x8f\x71\x37\xbe\xa7\x88\x51" - "\x0a\xfa\x03\x6d\x82\x99\x0c\x5f\xbc\xef\x85\x6b\x8e\x6e\x8c\xe3" - "\x0f\x58\xdb\x05\x3c\xc6\xc7\x5a\x9b\x08\xcc\x81\xfd\xbb\xed\x03" - "\x0e\xe3\x53\x44\xb0\x0d\x00\x9b\xc1\x60\x0b\xf8\x77\x5c\xb2\xb1" - "\x0f\x56\x78\x68\x1f\xf0\xeb\x1b\xe3\xca\x60\x69\xb1\x94\x92\xb4" - "\x63\x44\x5a\x64\x76\x17\xe3\x73\xdc\xfb\x45\xe8\xfb\x62\xcf\xee" - "\x7c\x3f\x13\xb1\xd0\xc9\xbe\x9f\xf1\xbb\x60\x09\xf1\x0c\x7b\x55" - "\x74\x2f\xd8\xe7\x33\xec\x5b\x0f\x79\x86\xbd\x2a\x9a\xbe\x60\x8e" - "\xf0\x0c\xfb\xcb\x6e\x62\xcf\xc5\xbd\xbc\x41\xb1\x6f\xcd\xb5\xc6" - "\xfe\x87\xe9\x0c\xfb\x1f\xa2\xbc\xc0\xbe\x17\xb9\x57\xf3\x72\x7f" - "\x61\xbf\x87\xd8\x83\xdc\x9b\x8b\x3c\xc3\xfe\xbc\x9b\xd8\x73\xb1" - "\x33\x6f\x50\xec\x2f\x64\x59\x63\x7f\x7e\x2a\xc3\xfe\x7c\xa4\xe7" - "\xd8\xab\x7b\x91\x7b\x35\x2f\xf7\xfa\x0f\x3c\xc3\x5e\x8d\x72\xaf" - "\xf7\x0c\xfb\x53\x6e\x62\xcf\xc5\xdf\xbc\x41\xb1\xd7\x67\x5a\x63" - "\xff\xe3\x24\x86\xfd\x8f\x11\x5e\x60\xdf\x8b\xdc\x27\xf0\x72\x7f" - "\x71\xaf\x87\xd8\x83\xdc\xd3\x28\xcf\xb0\xff\xc0\x4d\xec\xb9\x18" - "\x9e\x37\x28\xf6\x17\x37\x59\x63\xff\xd3\x04\x86\xfd\x4f\xe3\x3d" - "\xc7\x3e\xa1\x17\xb9\x4f\xe0\xe5\xbe\xed\x3d\xcf\xb0\x4f\x00\xb9" - "\xa7\xe5\x9e\x61\xbf\xc1\x4d\xec\xb9\x38\xa0\x37\x28\xf6\x6d\xe9" - "\xd6\xd8\x5f\x1a\xc7\xb0\xbf\x14\xee\x0a\xf6\xeb\x2d\xb1\x3f\xd9" - "\x3f\x0a\xd6\x56\x9c\x9d\xff\xc6\xb3\x3c\xf6\xaf\x03\xf6\xd0\xff" - "\xaa\xa7\x8a\x6c\x6c\xfc\x2b\x6f\x70\xb8\xc7\x02\xee\x1a\xc0\x1d" - "\xd6\x86\x02\xe6\x80\xd1\x20\xc4\x1d\x31\x4f\x3d\x45\x14\x1f\x41" - "\x5e\xc4\x07\x31\x06\x1c\x95\x1c\xce\x37\x99\x5a\xa8\x44\x1e\x88" - "\x78\xa2\xdd\x8f\x98\xf7\x66\xdb\x23\x4f\xf4\x8a\xf9\x93\xd7\xc6" - "\xbe\xef\xb4\xf5\xff\x5d\x2d\xcc\x3f\x81\x35\x5c\xaa\xbb\x98\x5f" - "\x49\xb6\xc6\xfc\xf2\x68\xc4\x41\x27\xbb\x1c\xea\x39\xe6\xea\x68" - "\xe7\x98\x0b\x73\xbc\xa1\xc4\x3b\xcc\xcd\x7a\x11\x73\x75\x74\xcf" - "\x98\x9f\xf2\x00\xf3\xab\x3b\xbf\x5f\x5f\x98\x1b\x54\xd6\x98\xb7" - "\x8f\x60\x98\xb7\x07\x39\xc3\xdc\x0c\xfa\x1a\x7d\xea\xf8\x5e\xa2" - "\xa9\x3d\x66\x5a\x17\xe0\x8a\xef\x27\xa2\xaf\x77\xf7\xd2\x1a\x69" - "\x17\xe0\x9e\xb3\x9a\x04\x65\xad\x26\xe3\xfd\x5a\x98\xfe\xee\x04" - "\xfd\xfd\xe2\x15\x22\x37\x2f\x0e\x1c\x98\x75\x8e\xc8\x3b\x61\x8c" - "\x3b\x17\xab\xfc\xea\x63\xf5\xe4\xa3\x0b\x35\x52\xf4\xdd\xe2\x7d" - "\x3b\xfa\x43\xcc\xe0\xe9\x71\xd4\x50\xdf\x9c\xc7\xfc\x2a\x67\x04" - "\xbf\xca\x6e\x2b\xbf\xca\x4b\xe7\x78\xbf\xca\x33\x0c\xa3\x62\x4b" - "\x7c\x9e\x7b\xd5\x89\x5f\xa5\xae\x57\xbf\x0a\xe7\x4f\xb9\x40\xfc" - "\xbb\x96\xa9\x86\x6e\xe7\xfd\x2a\xaf\x2c\xf5\xce\xaf\xd2\xb9\x2c" - "\x58\xfa\x0a\xe0\xb3\xfe\x19\xc0\xe7\x4b\x77\xf1\xe9\x74\xfa\xfe" - "\xb3\xed\x5c\x2b\xcc\xb1\xc2\xbc\x8a\x32\x87\x73\xab\x21\x7f\xd1" - "\x71\x5b\x5f\x0a\xca\xdb\x05\x99\xf1\x56\xd4\xc9\x9e\xf9\x53\x40" - "\xc6\xfe\xcb\xfc\x29\x28\x73\xc2\x3c\x7b\x7d\xcc\xb1\x5d\xcd\xd6" - "\xb2\xd7\x59\xc2\xe6\xd8\xce\x62\x57\xed\x2b\xe7\x98\xab\x66\xdb" - "\xfa\x50\x18\xe6\xe6\x41\xe8\x73\xf1\xc8\x8f\xb2\x85\xcc\xf8\x6f" - "\xf3\xa3\x5c\x7f\x98\x9b\x4e\x58\x63\x6e\xdc\xc6\x30\x37\xe6\x5e" - "\x05\xcc\x8f\xdb\xfa\x4e\x38\xcc\xe5\x44\x82\xbe\x16\x8f\xfc\x27" - "\x5b\x88\x87\xb6\xf4\x7f\xce\x7f\x72\xfd\x61\x4e\xeb\xad\x31\x37" - "\x6f\x66\x98\x9b\x37\x79\x8f\xb9\x7a\xb6\xad\xcf\x84\x61\x2e\xb9" - "\x8c\xb6\x97\x47\x7e\x93\x2d\xa4\xed\xbf\xcd\x6f\x72\xdd\x61\x2e" - "\x97\x68\xad\x30\x97\x93\xb5\x1c\xe6\x72\xa2\xb9\x0a\x98\x1f\xb7" - "\xf5\x95\x30\xcc\x65\xdf\xa3\x6f\xc5\x23\x7f\xc9\x16\xc9\x7f\x9d" - "\xbf\xe4\xfa\xc3\x5c\xb6\xc7\x1a\x73\xe9\x12\x86\xb9\x34\xd1\x7b" - "\xcc\x13\x66\xdb\xfa\x48\x18\xe6\xfd\x4e\xa1\x4f\xc5\x23\x3f\xc9" - "\x16\x49\xf1\x7f\x9b\x9f\xe4\xfa\xc3\xbc\x5f\xa5\x35\xe6\xf2\x79" - "\x0c\x73\x79\xac\xab\x6b\x66\x61\xad\x2c\xac\x8f\xb9\xb5\xb2\x3f" - "\xd8\xec\x36\xbe\x11\x86\x77\xff\xc3\x9c\xcd\xee\xf1\x5a\x99\x1a" - "\xfe\x5b\xfc\x23\x02\xd6\xb8\x5e\xbe\x2e\xd6\xca\xf2\xfe\xd6\xf7" - "\x3f\xe5\x37\x3d\xc9\xad\x95\xe5\x37\x45\x3b\xc3\xda\xd1\xb3\x08" - "\x0d\xb0\xd6\x14\x9e\x45\x78\x71\x35\xe0\x08\x7c\x80\xcf\x22\xe0" - "\x33\x09\x8e\x9e\x47\xc0\xe7\x10\x84\x67\x12\x2c\x9f\x47\x88\xd2" - "\x51\x03\x3e\x93\x80\xeb\xe4\xfa\xd8\x2d\x44\x78\x36\x01\x9f\x41" - "\x48\xfb\x96\x0c\x42\x8c\xf0\xf9\x03\x5c\x2f\x5f\xeb\x67\x10\x8a" - "\xcc\xd7\xc1\x33\x08\xf2\x01\x4e\xe3\xdf\x09\x32\x37\xf3\x8d\x3b" - "\x08\xf0\x5b\xb7\x9f\xaa\xab\x70\x51\x13\xca\x1c\x62\xe4\xd7\xca" - "\xe4\x70\xf7\x53\xd5\xd2\x46\x4d\x0d\x79\x71\x1d\x51\x08\xfe\x0b" - "\x94\x41\xd0\xcb\x7e\x46\xc0\x33\x2b\x81\xf9\x31\xcc\x3f\xc4\x0c" - "\xd2\x2f\x56\xf9\xe1\x7b\xfb\x1f\x7d\x5e\x2d\x45\xdf\x63\x59\x3c" - "\x09\xdb\x71\x96\x84\x37\xb4\x9d\x22\x9c\x4c\x15\xa8\x7c\xcc\x05" - "\x8b\xf4\x5d\x05\xeb\x95\xe6\x80\x45\x6d\xfa\x80\x45\x06\xc4\x2d" - "\xeb\x1c\x21\x28\x5f\x88\x5b\xa3\xa6\xa4\x1b\x2f\x0e\x2b\x29\xef" - "\xdb\x70\x2a\x53\x9f\x7a\x8c\x59\xf1\x05\xc0\x6c\x99\x35\x66\x25" - "\x9e\xfa\x37\x84\xe7\xb9\x97\x05\x4b\x4b\x40\xa6\xd6\x3d\x09\x98" - "\xfd\xd6\x5d\xcc\x06\x3a\x8d\xff\xed\x1c\x33\x55\xb4\x8b\x98\xe5" - "\xf7\x8e\x99\x39\xc2\x01\x66\x99\x90\x37\x89\x61\xa6\x4a\xd6\x07" - "\xa8\x34\x22\x66\x97\x5d\xc4\xcc\x76\x0d\x7b\x23\x61\xe6\x5b\xec" - "\x01\x66\x2e\xca\x99\xda\x05\x39\x33\x17\xd9\x63\xa6\x06\x39\x53" - "\xf1\x72\xa6\x02\x39\x53\x59\xc8\xd9\x79\x17\x31\xb3\x5d\x83\xde" - "\x48\x98\x0d\x8e\x76\x1f\x33\xb5\x8b\x72\xa6\x76\x45\xce\xf4\x0e" - "\x30\x03\x39\x53\xf3\x72\xa6\x06\x39\x53\x5b\xc8\xd9\x29\x17\x31" - "\xb3\x5d\x43\xde\x48\x98\x29\x9c\xbf\xff\xed\x1c\x33\x17\xe5\x2c" - "\xc1\x05\x39\xa3\x51\xf6\x98\x25\x80\x9c\xa9\x79\x39\x53\x83\x9c" - "\xa9\x2d\xe4\xec\x03\x17\x31\xb3\x5d\x03\xde\x48\x98\x0d\x71\x1a" - "\xff\xdf\x39\x66\x09\x2e\xca\x59\x82\x0b\x72\x46\xcb\x1d\x60\x06" - "\x72\x96\xc0\xcb\x59\x02\xc8\x59\x82\x85\x9c\x6d\x70\x11\x33\xdb" - "\x35\xdc\x8d\x84\xd9\x2d\x89\xee\x62\xc6\xe1\x05\xb6\xa3\x43\xcc" - "\x3a\xad\xed\x46\x23\xd8\xf1\x78\xcf\xcb\x21\x5e\x2f\x98\xf0\x9d" - "\xde\x40\xc4\x0a\xed\x41\xc4\xab\x51\x73\x88\x38\xb2\x1b\xf1\xbe" - "\x18\xe0\x4e\xf0\xde\x58\xda\x19\x37\xec\xc5\xf9\xce\xb0\xea\xfd" - "\x7e\x58\xf1\x52\x11\x2b\xe1\x7e\xd8\x55\xc5\xea\x53\x77\xb1\x0a" - "\x70\xba\xff\x51\xcf\x58\xa9\xa3\x7b\xc7\x4a\x9d\xdf\x33\x56\x66" - "\xbd\x88\xd5\x29\x0b\xac\xec\xe7\x31\xd7\xb1\xb2\x99\xbf\x6e\x28" - "\xac\x86\xd5\x3a\xc3\xca\xe8\xbf\x5e\x89\xef\xbc\x3f\x01\x6b\x5f" - "\xba\x20\x66\x5a\xf6\x69\x12\xb4\xe5\x34\x19\x8f\xef\x37\xef\x5e" - "\x67\x90\x42\x1f\xbf\x3b\x72\xbc\x85\x74\xfd\x10\x38\x10\xdf\x9f" - "\xe1\xf4\xe4\xe2\x40\x9f\xc6\x58\x3d\xa7\x13\xb7\x02\x46\x0d\x6d" - "\x35\x30\x26\xfd\xa3\x1a\xda\xfe\x4a\x3a\x57\xc6\x90\xa3\x27\xcf" - "\x01\x2e\xb4\xab\xb1\xb5\x86\x94\xc1\x75\xed\xea\xbf\x12\xf3\x0f" - "\xc1\x03\xe7\x6a\x88\xf4\x82\xfc\x17\x99\xb8\x76\x1e\xa5\x21\x8a" - "\x19\xad\xd4\xd0\xd0\x7a\x84\xec\x98\x4f\x82\x0e\x69\x08\xc1\xb1" - "\xe6\xd6\xca\x09\xb8\x56\xfe\xc0\x0a\x9f\x57\x2c\xd6\xca\xdc\xfb" - "\xb2\x49\x80\xcd\x4f\x36\xd8\xc0\x5a\x1c\xc6\xba\xff\x13\x6d\x80" - "\x4d\x9b\x80\xcd\x79\x92\xba\x1c\xb1\xd1\x89\x6b\x65\x1e\x9b\x62" - "\xd4\x79\x49\x16\x6b\xe5\x0b\x16\xd8\xf0\xef\xaa\x5a\x61\x23\xf8" - "\x32\xd6\x04\xe3\x3d\x72\xbb\xb5\xb2\x67\xbe\x8c\x40\xa7\xef\x8a" - "\x70\x72\x04\x32\xf2\x04\xc8\x51\x4a\x32\x27\x47\x6c\xfc\x87\x2d" - "\x02\x7e\xaf\x26\x7e\xba\xfe\x51\x5b\x00\x83\x4e\x90\x35\x9c\x8b" - "\xd2\xa0\x9f\x88\x25\xe2\xf6\x44\x65\x57\xd7\x73\x6d\x44\x0a\x36" - "\xb8\x3f\x62\x67\xfa\x21\xd0\x27\x1b\xe6\xaa\xc6\x39\x5f\x02\x3e" - "\x17\x49\xa3\x9e\xc7\x66\xdd\x97\xe4\x82\xfc\xd6\xe1\x74\x71\xf0" - "\xc0\x91\xc0\xa7\x30\xf7\x28\xe6\xe2\xbb\x2f\xa0\xf3\x76\xc4\x93" - "\xf0\x19\x49\xd4\xc0\x3d\xcb\x03\x32\x86\xf3\x19\xea\xc3\x86\xa4" - "\x03\xc4\x54\xb0\xa8\xad\x2b\x60\xbd\xf2\x50\x32\x21\xa8\x13\x11" - "\x8b\x7e\xab\x44\xec\xf0\xbd\x3d\x4b\x5f\x87\x9d\x2e\x4c\x38\xe2" - "\x58\xbe\xe6\xe8\xdc\xf2\x77\x14\xf3\xf2\x55\xec\xa9\xbf\x43\xf0" - "\x47\x01\x86\xf8\xae\x5e\xda\x67\x44\xfa\x8a\xdb\x18\xde\x16\xe4" - "\x3e\x86\xaa\xe8\xde\x31\x6c\x17\x30\xcc\xef\x1d\xc3\xdb\x74\xf6" - "\x18\xaa\x92\x44\x0c\xcd\x11\x16\x18\x66\x32\x0c\x55\xc9\x22\x86" - "\x2a\x4d\xef\x18\xda\xac\xa5\x6f\x28\x0c\x7f\xd9\xb3\xff\xc3\x31" - "\x86\x2e\xc8\xe1\x8f\x3c\x86\x6a\x17\xe4\x70\x78\x85\x03\x0c\x2d" - "\xe4\xd0\x5c\x24\x62\xa8\xe6\xe5\x50\x65\x21\x87\x2a\x17\xe4\xd0" - "\x66\x6d\x7d\x43\x61\x78\x7b\x95\xfb\x18\xaa\x5d\x90\xc3\x6f\x04" - "\x0c\x5d\x90\xc3\x3b\x54\xf6\x18\xaa\x2d\xe5\x50\x6f\x81\x21\x2f" - "\x87\x6a\x0b\x39\x54\xbb\x20\x87\x36\xb6\xca\x0d\x85\xe1\x9d\x49" - "\x1e\x60\xe8\x82\x1c\x7e\xc4\x63\x98\xe0\x82\x1c\x2a\x43\x1c\x60" - "\x68\x21\x87\x34\x4a\xc4\x30\x81\x97\x43\xb5\x85\x1c\xaa\x5d\x90" - "\x43\x9b\xb5\xf7\x0d\x85\xe1\x5d\x3d\xfb\xff\x1d\x62\x98\xe0\x82" - "\x1c\xa6\x09\x18\xba\x20\x87\x77\xe9\xed\x31\x4c\xb0\x90\x43\x5a" - "\x6e\x81\x21\x2f\x87\x09\x16\x72\x98\xe0\x82\x1c\xda\xac\xc5\x6f" - "\x28\x0c\xef\x36\xb8\x82\x21\xd8\xd9\xf6\x76\x69\x9b\x88\xa1\x25" - "\x7e\xb6\xb6\xe8\x2c\xb0\x51\x11\xbb\x39\x46\x22\xb5\xc7\xef\x57" - "\xd5\x88\x5f\x08\xde\x8f\xbb\x2c\xda\xa4\x1c\x76\xfc\xfd\x1c\xc4" - "\xec\x50\x1c\x21\x68\x9f\x0a\xf6\x28\xde\x53\xed\xb6\x47\x17\xfe" - "\xff\x6a\x8f\x06\xed\x71\x1f\x3b\x7e\x1e\x74\x8a\x9d\xf5\xdc\x37" - "\x0b\xe6\x44\xe7\xd8\x8d\x48\xb4\xc7\x4e\x9d\x24\x62\xc7\xe6\x3d" - "\x86\x9d\x59\x2f\xcc\x7f\x0c\x3b\x7e\xfe\xeb\x11\xbb\x1b\x79\xfe" - "\xfb\xb5\xd3\xf9\x2f\x57\x6a\xae\x86\xa3\x06\x0e\x2d\x1c\x75\x26" - "\x29\x99\x5a\x22\x35\x37\x11\x16\xd7\x1a\xf9\xd9\xf6\xfa\x4d\xf4" - "\x85\xc7\xe4\x48\x43\x37\xca\xfd\x91\x4e\x28\xc3\x34\x90\x10\x48" - "\xd7\xfa\x49\x62\x71\x3f\x12\xa4\xed\x2f\x94\xe5\xb7\x91\x44\x40" - "\x9f\x19\x9d\x94\xa4\x33\xba\x88\x9b\x90\x8e\x66\x9f\x4d\x81\x34" - "\x1f\xbe\x4c\x6e\xff\x43\x93\x54\x8a\x65\xd9\xd6\x3d\x80\xa7\x51" - "\x9a\x32\x88\xd2\xb2\x6e\x28\x0b\xeb\x14\xe8\x06\x22\x9d\xe9\xa6" - "\x3b\x23\x4d\x12\x79\x90\x25\x1d\x9d\x4c\x2c\xe9\x6e\xe6\xcb\x0b" - "\xb6\xea\xc7\xdd\x84\xf8\x49\x94\xac\x2f\x1a\xa9\xd0\x17\x5f\xae" - "\xcc\xc1\xcd\xc7\xa1\xcc\x10\xab\x32\x6f\x22\x64\x10\xd0\x63\xb9" - "\x83\x54\x5c\xbb\x91\x7e\x10\x1d\x28\x6d\xe5\xca\x97\xc8\x43\xcd" - "\x52\x12\xca\xfa\x45\xe4\x25\xdd\x6d\x56\x92\x5c\xeb\x3a\x06\x0b" - "\xe3\x65\x49\x87\x34\x54\xda\x4d\xe3\xc7\xb5\x63\xa0\x44\x0f\xed" - "\x08\xb7\x6c\x07\xa3\x23\xa3\x79\x3a\x05\xf4\x6b\x7c\x37\x96\xf9" - "\xa3\xea\x04\xba\x34\x13\xb9\x15\xb0\xd0\x36\xaa\x08\xe1\xc7\x61" - "\x08\xcd\xfe\x4e\xc1\x8f\x45\x84\x65\x99\x83\x24\x12\x5d\x09\x3f" - "\x5e\xe6\xec\xb3\xb5\x40\x3b\xd4\xbc\x51\x1e\xd9\x5d\x6e\x06\xc6" - "\x94\xe2\xc7\x21\xc3\x78\x0b\x57\x2e\xac\x7a\x4c\x52\x89\x92\x1f" - "\x87\x5b\x90\x16\xf2\x44\xb1\x7e\x29\xba\x71\x35\x49\xe5\x78\x4d" - "\x6b\x41\xeb\xcf\xc6\xb8\x4d\x07\x7d\x9b\x61\x4f\xef\x63\x4b\x1f" - "\xc0\xe8\x5b\x0c\x40\x1f\x6d\x4f\xaf\xb0\xa5\x1f\xc6\xe8\xcf\xb5" - "\x01\xfd\x6c\x7b\x7a\xe3\x50\x1b\xfa\x5f\x30\xfa\x56\x1c\xeb\x18" - "\x7b\x7a\xa5\x2d\x7d\x20\xa3\xbf\x82\x3c\x32\xc7\x9e\x3e\xc2\x96" - "\xfe\x56\x46\x7f\xa1\x15\xe8\x63\xed\xe9\xd3\x6d\xe9\x6f\x63\xf4" - "\xfa\x16\xa0\x8f\xb3\xa5\x2f\xe3\x68\xc9\xdd\x3c\xed\x2f\x19\xed" - "\xc5\x66\xa0\x55\x39\xe8\xab\x8c\x2f\x3b\x94\xa7\x1f\xce\xe8\xbf" - "\x53\x01\x7d\xa2\x03\xac\x6c\xe9\x6f\xe7\xe8\x87\xde\xe4\x03\xf4" - "\x49\x0e\xb0\xb2\xa5\xbf\x83\x95\xdf\x19\x0d\xf4\xc9\x0e\xb0\xb2" - "\xa5\xbf\x93\xd1\x1b\x51\x86\x35\x0e\xc6\xde\x9a\x7e\xb0\x39\x1c" - "\xe8\x52\x4a\x32\x04\xf9\xb1\x1a\x77\xdb\xb2\xef\x62\x6d\x27\x21" - "\x90\x27\xdd\xc1\xb8\xdb\xd2\xdf\xcd\xe8\xa5\x4a\xa0\xdf\x64\x4f" - "\x4f\x24\x8c\x9e\x8c\xe1\xe9\x7f\xc5\xe8\xe5\xfe\x40\x9f\xe9\x60" - "\xec\xf1\xba\x96\x97\xd3\x20\xd6\x4f\x43\x1d\xd0\x66\x39\x18\x77" - "\x4b\xda\x11\xac\xdc\x5b\xf6\x00\x6d\xae\x83\x31\xb7\xa4\xfd\x35" - "\xa3\x1d\x90\x02\xb4\xf9\x0e\xc6\xdb\x92\xf6\x37\x8c\xf6\xe6\x50" - "\xa0\x2d\x72\xd0\xde\xbb\x2d\x68\x83\x19\xad\x2f\xf2\x55\xb1\x03" - "\x5c\x2c\x69\xef\x61\xb4\x01\xb1\x40\x5b\xee\x00\x17\x4b\xda\x7b" - "\x19\xed\xe0\x22\xa0\xad\x70\x80\x89\x25\xed\xff\xd0\xa1\x8a\x19" - "\xbc\x6e\xad\xb4\xa5\x05\x1e\xd0\x82\x1e\xaa\x03\x5d\x18\x42\xf3" - "\x86\xa2\xde\x44\xbd\xc6\xad\xe3\x05\x1a\x2a\x35\xde\x6f\x31\x0f" - "\xdc\x47\xf3\xfa\xb7\xf1\xfa\xaf\xda\xb6\x3c\x2a\x95\x5b\xd2\x8e" - "\xa4\x79\xbf\x8a\xe0\x69\xf7\xd8\xd3\xfa\x58\xd2\x8e\xa2\x79\x81" - "\x95\x3c\x6d\x8d\x3d\xad\xa2\x9b\x96\xe6\xdd\x96\x08\x34\xfb\x4a" - "\x79\xbd\x6a\xd1\xce\x31\x16\xe5\x8d\xa6\x79\xc3\x43\xf9\xf2\xb4" - "\xf6\xe5\x29\x2d\x69\xc7\xd0\xbc\x20\x23\x4f\x5b\x6b\x4f\x1b\x61" - "\x49\x7b\x3f\xcd\xbb\x5d\xe8\x7f\x9d\x3d\x6d\xba\x25\x6d\x18\xcd" - "\xbb\xb3\x86\xa7\xad\xb7\xa5\x2d\x65\x73\x90\x94\xc7\xe9\x01\x9a" - "\x77\x57\x0a\x4f\xdb\x64\x35\xc7\x4a\x25\x9c\x8c\x95\x32\xba\x07" - "\xe9\xd0\x5f\xf8\xf2\x78\x1e\xb7\x9a\x5b\x33\x24\x43\x71\x4e\x29" - "\x41\x3c\x5f\xf8\x6d\x16\xd0\x8e\xe5\xcb\x3b\x61\x3b\xf7\xf1\xed" - "\x0b\x87\x6b\x27\x85\xf9\x09\xe6\x1d\x9d\x23\xbb\x27\xe9\x5e\x72" - "\xf3\x39\xf9\x28\x03\x9b\x1b\xf9\xbd\xc1\xe4\xa3\xb9\xd8\x48\xe6" - "\x8a\xa7\xcb\x67\xb5\x51\xa3\x65\x5a\x8e\x94\x36\x8d\x6a\x23\x72" - "\x8c\xd7\x47\x03\x36\xc6\xe8\x20\x5d\x3f\x22\x26\xa9\x3d\x2f\x54" - "\xae\x93\x18\x9b\x30\x7e\x13\xfc\x56\xe8\xc8\xeb\xdc\x3e\x2a\x39" - "\x19\xb8\x37\x49\x84\xc4\x54\x38\x2a\x17\xf7\x32\x29\x83\xf3\x6c" - "\x38\xb8\x7d\x43\x92\xc0\x06\x7e\x81\x44\x68\x57\x1b\xc9\x59\x0d" - "\x91\x72\xfb\xe4\xc9\x43\xff\x40\x97\xa9\xc6\x43\x5b\x9a\xa0\xde" - "\xb8\xd3\x70\xce\xb5\x05\xf7\x0d\xca\x1f\x55\xa5\x5d\xd1\x89\x34" - "\xef\xe8\x03\xb6\x34\xd1\xe7\x7f\xff\x7d\x52\x2a\xb9\xf3\x9c\x3c" - "\xb4\x5a\x88\x5f\xc5\xc5\xac\xfa\x51\xf5\x08\x17\xaf\x4a\x3e\x7a" - "\xa6\x39\x60\x54\x95\x6d\xbc\x2a\x56\xcf\xe8\xf0\x4b\xa0\xaf\x68" - "\x79\x61\x12\x17\x0f\x4b\x3e\x7a\x03\xd7\xbf\x0c\xda\x44\x83\x9e" - "\xce\x34\x77\x6e\x4a\xc7\x7d\xed\xb4\xa9\xe7\xc8\x69\xfe\x1a\x96" - "\xcf\x97\x3b\x00\xcb\xc3\x72\x85\x32\x31\x9f\xfe\xae\xc2\x24\x1c" - "\x0f\x18\x9b\x4c\x97\xe3\x5f\xc9\x43\x0d\x5c\xfc\xab\xbc\xd1\x91" - "\x3a\xc9\x74\x0d\x17\xff\x4a\xe8\x8f\xeb\x65\x54\x60\x19\x8e\x63" - "\xfd\x12\x3f\x5a\x30\xaa\x0e\xca\xaf\x00\xfb\xb7\x9a\xe1\x33\xba" - "\x5a\x27\x19\x9f\xc5\xff\xde\xa7\x93\x4c\xac\xe3\x7f\xd7\xe9\x24" - "\xfa\x50\xfe\xf7\x71\x21\x06\x99\xe3\x98\x68\xa3\x8a\x01\x8f\x3d" - "\xe6\x1d\x31\x3e\x68\xaf\x73\xed\x09\x18\x55\xac\xbc\x83\x48\xce" - "\xca\xc7\xc4\x40\x9d\x7b\xd8\x58\x8d\x19\x0d\xdf\x7e\xfc\xb7\x9e" - "\xff\xa6\x48\xc3\xf1\x9c\x7f\x46\x26\xcd\x4d\x60\xfb\xc8\xc8\xc7" - "\x4c\xc7\x34\x0e\x5b\xc0\x9f\x0e\x49\x48\xe7\xca\x2d\xd8\xd2\x64" - "\xd9\x06\x0c\x34\x16\x3a\x7a\xcc\xfd\x61\x0f\x3c\x38\x36\x7c\xdc" - "\xbc\xf9\x0b\xe2\x16\xc6\x2f\x52\xa9\x13\x16\x27\x2e\x59\xba\x2c" - "\x69\xf9\x8a\x95\xc9\xab\x56\xaf\xd1\xac\x5d\x87\x74\xdd\xed\xdd" - "\x11\x29\x69\x93\x12\xc0\x73\x32\xd6\xf3\x01\x57\x37\xa4\x31\xec" - "\xc7\x54\xc9\x95\x8e\xd7\x05\x8d\x81\x84\xe0\x1e\x21\xad\xf2\xfb" - "\x07\xe0\x9e\x25\xc0\x87\x92\xc6\xe2\x69\x5a\xdc\xaf\xad\x59\x3e" - "\xc6\xd8\xa0\x9f\xa6\xc5\xfd\x05\x0f\x06\xb6\x90\xa0\xbb\x89\xe4" - "\x9c\x7c\x4c\x0b\x5e\x2f\xfb\x35\x21\xb5\x90\xd7\x51\x99\x77\x2b" - "\x48\xe0\xcb\xc3\xa8\x3e\x7f\x18\x6d\xc5\xf2\xf3\x0b\x69\x8b\x7e" - "\xbd\x8a\x64\xc3\x39\xf0\xa6\xe2\xac\xfc\xfe\x0f\x0e\x82\xf5\x6f" - "\xce\x20\xc3\x4b\x0b\x69\xf3\xa6\x61\xb4\xf9\xf9\x42\xda\x5a\x36" - "\x8c\xea\x82\xf2\x89\x6f\x7b\xde\xfd\xc0\x67\x63\x38\xcc\x72\xe0" - "\xba\x79\xe8\x18\x55\x0e\x5c\x1b\x65\x24\xb2\x32\x38\x87\xb4\xb6" - "\x83\x4a\xd6\xee\xb7\x2f\x1a\xfa\x41\x79\xb3\x69\x57\xa2\x24\x1b" - "\xea\x61\x98\xdc\xff\x6d\x2d\x58\x12\x50\x9f\xbe\xd1\x70\x9a\xe8" - "\xe4\xf7\xeb\x70\x3f\x25\xa8\xcf\xaf\xb1\xa8\x95\x60\x79\x6f\xad" - "\x30\xf4\x5b\x79\x1b\x35\x02\xad\xd6\xbc\x3e\x51\x02\x34\xc5\x50" - "\x76\x9b\x65\x7f\x82\xe3\x97\x24\x2b\x97\xae\x4a\x4c\xbc\x67\x20" - "\x09\xe6\xbe\x89\xe5\x5e\x83\xc9\x50\x1e\x79\xb9\x90\xd6\x42\x3f" - "\xb5\xd0\xdf\xba\x63\xb0\x02\x01\xfe\x20\xd0\xa7\xdc\xb3\xf2\xb0" - "\x07\x20\x7d\x1f\xfc\xde\x07\x6d\xaf\xe3\xf6\x2e\x93\x4f\x9d\x47" - "\xf3\xee\x6f\x85\x76\xe2\x9c\x85\x7b\xa5\x90\x4b\x6b\x66\x4b\xa0" - "\xdf\xf9\x40\x57\xa7\xbc\x8d\x8c\x80\x7c\x1f\x40\x3b\x2a\xe0\x37" - "\xd2\xab\x11\x47\xa0\xaf\x65\xfd\x9a\xca\xc5\x12\x84\xb1\xd2\x96" - "\x0c\xa3\x59\xed\x79\x61\x45\x18\xc3\x95\xdb\x77\x06\xce\x61\x5c" - "\xea\x80\x36\xf7\x52\xda\x6c\x09\xee\xcb\x59\x26\x96\xa9\xc2\x36" - "\x61\x3b\x70\x3d\x7c\x14\x2c\x4a\x73\x57\x0c\xb9\xcf\x40\x24\x47" - "\x9b\x09\x29\x2e\xa4\xe5\x70\x14\xc3\x51\x74\x04\xae\x1d\x86\xa3" - "\x0e\xd2\xeb\xe1\xfb\x08\x7c\x1f\x6e\xe6\xee\xaf\x06\x62\xbb\x57" - "\xa6\xd0\x96\x51\x45\xe4\x57\xdc\xbe\x9f\xa9\xe4\xe9\xd3\xf2\xc8" - "\x1a\x6c\x3b\xc6\x6b\xa6\x43\x1f\x08\xb1\x8a\x2b\x2b\x7f\xb0\x9c" - "\xc0\x75\xf8\xde\xc3\xbe\x2d\x8f\x07\x8d\x44\x3e\x76\x38\xfb\x3d" - "\x36\x0e\xce\xb3\xf8\xdf\x1a\x38\x36\xf5\x7e\xd8\x96\xe7\xec\x18" - "\xab\x77\x9d\xd6\x95\x63\x6a\x88\x6b\x74\xe3\x2a\x89\x7c\x3c\x81" - "\x23\xdc\x3a\x7d\xbc\x82\xa5\x45\x9c\x64\xe7\x11\x2d\xec\x7b\x92" - "\x3f\x1c\x30\x4e\x93\xa1\xfc\xc9\xd1\x2c\x6d\xf2\x1c\xf8\xae\x80" - "\xa3\xda\xba\xfe\xa9\x90\x7f\x6a\x24\xe2\xd9\x05\xf3\x01\x62\xa9" - "\x93\x87\x19\x11\xa3\x1c\xc6\x5b\x12\x7c\x86\x02\xd2\x0c\xc0\x5b" - "\xc5\x22\xff\x3c\x78\xde\x9a\x7f\x1e\x3c\x61\xc3\x3f\xb9\xa8\x8f" - "\x20\x5f\x64\x19\xe3\x97\x7d\x97\xd6\xc7\xc1\xf9\x83\x27\xa1\x9c" - "\x7d\xca\xe7\xb0\x8c\xb1\xdc\xfa\x2b\xe7\x1c\xac\x85\x55\x44\x8e" - "\xfa\xa5\x55\x3e\xf6\x3e\xe4\x59\xac\x9b\xaf\x97\xb5\x05\xda\x07" - "\x69\xe5\xd8\xbe\x65\x50\x2e\x9c\x57\x00\x5d\x79\x23\xb9\x28\xb4" - "\x8d\xcb\xb3\x25\x01\xf8\x91\x6f\x2f\x96\x89\xf9\xa8\xd8\x2f\x03" - "\xe6\xe1\xeb\xfe\x16\xd2\x71\x8d\x4d\xd2\x7e\x22\xb2\x46\xa3\x8e" - "\x20\x4f\xe2\x77\xa3\x31\x14\x64\x29\x8a\x98\x71\x2e\x0c\x24\xa1" - "\x20\x6f\x03\x4e\xcb\xc7\xd6\x8e\x4c\x21\xa1\x58\x1e\xea\x70\x9d" - "\x7c\x6c\x66\x19\xca\x22\x2b\xeb\x0b\xec\x07\x96\x7f\x04\x56\x35" - "\xf8\x5d\x8a\xed\x81\xeb\x16\xf5\xe6\xe3\xda\x39\x67\x1d\xeb\x2b" - "\xd4\x55\x01\xf9\xab\xb1\xef\x38\x9e\x70\xbd\xe6\xac\x3c\x5c\x89" - "\xd7\x70\xcf\x16\xbe\x3f\x15\xf8\xbe\x07\x8e\x07\xd2\xe3\xfe\x97" - "\x5c\x9c\x5a\x79\xd8\x54\x6e\xdc\x20\x3f\xe2\x41\xa1\x0e\x2c\x23" - "\xcd\x48\x8d\x14\xf4\xd1\x6b\xeb\x0c\x60\x83\x8c\xdb\x6e\x8d\x4f" - "\xb8\xc6\x12\x1f\xc8\x57\x0d\xf9\x6b\x71\x5e\x46\x7d\x02\x75\xfa" - "\xa1\xcd\x01\x69\xb9\xe6\x3c\x28\x63\xb5\x81\xf3\x2d\x41\x39\x2f" - "\x42\x5b\x72\xb1\x1c\x68\x4f\x2d\x5f\x56\x2d\xc6\xb0\xb4\xc4\x9a" - "\x2f\xaf\x02\x31\xe7\xe4\x79\x1d\xd7\x27\xd0\x5d\xe3\x9e\x29\x65" - "\xd7\x6a\x80\xa6\x86\x76\x45\x11\xba\x3e\x86\xed\xd3\xc6\xae\xed" - "\x49\xeb\xe0\xf0\xad\x65\x7a\x6d\xdc\xda\x95\x1b\x68\x8b\xd8\xee" - "\x71\xa1\x42\xac\x76\xbe\xdd\x7b\xb0\x3e\xba\x66\x0e\x37\x8f\x62" - "\x1d\x98\x9f\x2f\xcf\x17\xcb\x13\xc6\x6a\x24\xb4\x83\x8d\x57\x78" - "\x04\xa4\x57\x20\x2f\x72\xe3\x06\x7a\xf4\x52\x1a\xf2\xe2\xb8\x30" - "\xc8\xbf\x2f\x1b\xcf\xd7\xe0\x79\x78\x1d\xa7\x63\xbb\xaf\x87\xa7" - "\xe0\x75\xf4\x4d\xe4\x2c\x06\x5e\x32\x13\xf2\x2b\x7f\x12\xda\x96" - "\xc1\xf5\xad\xaa\x6d\x7d\xa4\xe4\xa0\x91\x10\x6c\x27\x8c\x51\x0d" - "\xb4\xf5\x24\xe8\x7e\x6e\x6f\x2e\xd0\xd7\x7b\xe8\x6b\x31\x04\xdb" - "\x0c\xfa\x8c\x6f\xdf\x43\x33\x79\xec\xf7\x60\x1f\x71\x3c\x47\x32" - "\xdd\x07\xd7\x1e\xfe\x09\xdb\x2e\xf6\xfb\xa1\x60\xcb\x31\xe6\xfa" - "\x0d\x38\x20\x5e\x88\x8b\x58\xe6\x38\xe4\xfd\x5c\x28\x8b\xed\x99" - "\xc8\xf3\x06\x8e\x75\xee\x30\x5a\x8f\xf4\x22\xed\xc3\xdc\xfe\xd8" - "\xa9\x50\xf7\xa8\x24\x6e\x6f\x38\x09\xc6\xdb\x87\x72\xab\x70\x6f" - "\x53\x28\xa3\x06\xc7\x14\xe8\xde\x43\x7e\x84\xf3\x7a\xbe\xdd\x7b" - "\x60\x3e\x0f\x81\x63\xbc\x28\xff\x0f\xef\xb2\xe6\xaf\x87\x6c\xe5" - "\x1f\xf1\xce\x35\xa7\x45\x11\x7e\x5f\x67\xe5\x05\xf9\xc3\x93\xf8" - "\xb9\x83\xc7\xfa\xe1\x82\x83\x20\x2f\x62\x19\x0f\x0f\xb7\xc1\xba" - "\x86\xe3\xc7\x35\x33\x24\xd8\x67\xc8\x5b\xc3\xca\x79\x88\xeb\x33" - "\xc7\x4f\x19\x1c\x0f\xd4\xd3\x35\xd0\xcf\x6e\x3e\x78\x48\xc3\xe3" - "\x5c\x6f\x33\x26\x82\xee\xaa\xc5\xbd\xbf\x50\x27\x81\x0d\xfc\x48" - "\x7b\x97\xa8\x97\x10\x7b\x33\x87\xfd\xc3\xca\x32\x36\xdf\xf2\x7a" - "\xeb\x21\x76\x7d\x98\x15\x0f\x63\x9f\x7e\xc7\xf1\x2f\xb6\x25\x6d" - "\x0e\xb6\xa5\x86\x6b\x47\x9a\x92\xc0\x35\xae\x7e\x28\x2b\x86\x97" - "\x57\xa1\xac\x10\x2c\xeb\x79\xd0\x55\xd8\x26\xa8\xbb\x86\xd3\x7f" - "\x8f\x62\xdb\xc6\xdf\xc7\xb7\xbd\xce\x90\x81\x79\xc7\x2a\x3b\xa4" - "\x5c\xde\x3a\xa0\xcb\x37\xb0\xbd\x13\x06\x42\xfe\x4a\xe5\x7c\xa4" - "\x8f\xc8\x42\x1d\xad\x7c\x96\xfb\xbd\x4a\xf9\x14\xf0\xea\x39\x22" - "\x87\xf2\x7c\x90\x47\x05\xbe\x68\x95\x47\x2c\x04\x1b\x03\xf1\xaa" - "\x02\x1b\xa9\x12\xc7\x1b\x79\x19\x6c\xa4\xb0\xf6\xbc\xf1\xf9\x02" - "\xdf\x42\x3d\xc5\x38\xf6\x0c\x9f\xf1\x5f\x00\x1f\xd7\x88\xbc\x35" - "\xfe\x0b\x7e\x1c\x2b\x61\x1c\x7d\xa0\xbe\x67\xf8\x7e\x55\x02\x3d" - "\xd8\x62\x11\xd3\xf9\xb6\x17\xf1\xf4\x97\x05\x1c\x78\x59\xad\xcf" - "\x46\xfd\xcb\x61\x30\x21\x8b\xcf\x5b\xc1\xea\x9a\xb0\x55\xa0\x45" - "\x1b\x91\xdb\x07\x0d\xd2\x50\x0f\x8e\x02\xec\x39\xdd\x87\xfb\xfe" - "\xf2\x69\x28\x3b\xac\x8e\x08\x6e\x7f\xec\xe7\xc1\xee\x11\xf9\x68" - "\x42\x9c\x8d\x7e\x42\x5d\x9c\xdb\xb0\x89\xed\x33\x81\xbc\x84\x3a" - "\x15\xd7\x2b\x50\xde\x78\x5e\x7e\xf8\x36\x4f\xf8\xc4\x9a\x57\x22" - "\xee\x02\x5e\xb9\xcf\xa2\x6c\xad\xa3\x79\xae\x8c\xe9\xc0\x62\x96" - "\xe7\x91\x21\x7c\xdf\xaa\x58\xdf\xf8\x73\x1c\xb7\x54\x1c\xb7\x89" - "\x9f\x59\x8c\x23\x8c\xdb\xc4\x49\x3c\x7d\x0d\xea\x72\x51\x5e\x1f" - "\xd9\x20\xc8\xb2\xbd\xbe\x98\x38\x1a\xe5\x41\x6c\xd7\x23\x31\x36" - "\xfa\xa2\xc6\xb1\xbe\x78\x24\x98\xef\x6f\xb9\x8d\x6c\x54\xb0\xb6" - "\xf3\x73\x0b\xe0\xd0\xd0\xc6\xef\xf7\x01\x69\xa8\x3f\xb1\x6e\xcb" - "\x39\xa8\x94\x8d\x2b\x2f\xcb\x13\x6f\xb7\xc7\xe1\x91\x56\x4b\x79" - "\x46\xac\x51\x27\x60\x19\x88\x29\x67\x57\x42\x1a\xc3\xf5\x91\x5a" - "\xd4\x0d\x96\x3a\x1a\x68\xf3\xcd\x14\xe5\xe5\x11\xbd\xb5\x2c\x3e" - "\x32\x87\x97\x45\xa1\xee\xfd\x80\x51\xa8\x58\xef\xc4\x38\x9b\x7a" - "\x11\x9b\x5a\x2e\x9e\x33\xd7\xc7\x89\xbb\x85\x39\x0d\xe9\x21\xaf" - "\x06\xf2\x14\xd9\xcc\x8f\xb9\xd8\x3e\xa8\x4b\xc1\xe9\xac\x42\x4e" - "\x57\x68\xda\xb9\xf6\x4c\x2c\x2e\xe3\xe7\x09\x48\x0b\xe5\xd3\x54" - "\xfc\x5c\x22\xf0\xcd\x20\x9b\x36\x19\x1c\xdb\x47\x8f\x28\x04\xfb" - "\x88\x2b\x8b\xd3\x45\x13\x8d\x7c\xff\x30\xed\x3e\x96\x36\xa1\x16" - "\xd3\xb2\xd9\x38\xe4\x53\x6e\xbe\x9a\xa0\xe2\xe7\x2b\x94\x2f\xa9" - "\x4e\x3e\xfe\x04\xca\x18\x9e\xeb\xe4\x11\xd1\x58\x7e\x63\x7a\x27" - "\xae\x21\x8a\xe0\x5a\x32\xea\x03\xd4\x17\xca\x78\xa6\x37\x94\x4f" - "\x70\xdf\x25\xa8\x77\xd0\x0e\xc1\xeb\x40\x17\x87\xba\x08\xd2\xdf" - "\xc1\xfd\x3b\xe9\x0f\x3e\x50\x6e\x44\x3e\x9f\xf7\x10\x67\x2b\xfc" - "\x10\x25\x13\xd2\x84\x7c\x20\xeb\xab\x30\x1f\xe6\x17\xf4\x17\xea" - "\x2e\x23\xea\x26\xae\xbe\x49\x03\x78\x1e\xe7\xd6\x0d\x82\x5d\xd4" - "\x25\xb5\xa0\xc5\x3d\x10\x38\x9d\x36\x69\x36\xd3\x67\x93\xa6\x62" - "\x5e\x0e\x3f\xd0\x95\xa9\x1d\xf4\xdb\xb2\x15\x44\x5e\x7a\x91\xb3" - "\xb1\x22\x59\x3b\x27\x95\xb3\x7e\x4c\x52\x73\xfd\x60\x3a\x35\x97" - "\xb5\x25\x2c\xb2\xb4\x93\xbb\xb6\x19\xfb\x82\xd7\x72\x2c\xae\xe1" - "\x3e\x24\x70\x6d\x27\xd7\x2e\x9b\x7c\xe6\x2e\x95\x1d\x3d\xee\xbd" - "\x0b\x3a\xd4\xa7\xb4\x50\xd0\xbd\x93\x95\x7c\x3b\x4f\x09\x7a\x17" - "\xc6\x25\x11\x75\x2f\x77\x2d\x9e\xa7\x79\x82\xff\xe6\xf4\xfb\xe4" - "\x41\x6c\x5c\x03\xa5\xfc\x78\x27\xb3\x7e\x4c\xbe\x8b\x5b\x67\xff" - "\x10\x03\x63\x3b\x59\x2e\x8c\xad\xe5\x6f\x94\x1f\xa8\x1f\xf9\x85" - "\xe9\x95\x14\x6e\x0d\x5b\x8c\x34\xd8\x26\x36\x47\x44\x18\x6d\x6d" - "\xea\xb3\xf2\xc8\xed\x38\x2f\x31\x5b\x35\x72\x2d\xef\x23\x22\xda" - "\x15\xaf\xc2\xbc\x30\xb9\x56\xd0\x31\xb4\x3d\x8a\x60\x1c\x74\x68" - "\xcb\x21\x4c\xc3\xb8\xf9\x96\x34\xa8\x9f\xde\xee\xd4\xf1\x65\x4e" - "\x2e\x17\xf4\x06\xea\x92\x86\xb6\xd3\xbc\x4d\x37\x25\xba\x94\xd7" - "\x25\x17\xe4\x53\x9e\xb4\xb6\xc3\xa6\x3c\x69\xad\x33\x22\x17\xda" - "\xea\x0c\xb0\x9b\x37\xb5\xe7\x4d\x09\xb2\xb2\x03\x20\xad\x67\xdd" - "\x31\xd9\x80\x32\x8a\xfb\x20\x71\xfa\x89\xf3\x7b\x4d\xd9\x2b\xb4" - "\x19\xf5\xe6\xa5\xf5\x82\xff\x22\xf2\x77\x68\xab\xd9\xd4\x97\x6f" - "\xa5\x3b\xb1\x3e\xa1\x3c\x39\xc1\xbd\x74\x60\x1c\xd0\xe7\x32\x25" - "\x8e\xd7\xf3\xe5\x56\xba\x92\x9f\xc3\x50\x4f\x5a\xcf\x55\x61\x53" - "\xad\xe7\xaa\xc8\x49\xf6\x3a\x32\x52\xe1\xfa\x5c\x35\xa5\x05\xf5" - "\x96\xa0\x23\xad\x75\x41\xa4\x7f\xa9\x95\x2d\x3b\xa5\x58\xb0\x65" - "\x45\x3d\x3a\x25\x04\x75\x14\xd4\x5f\xc3\xd7\x9d\xa5\x93\x8f\xc9" - "\x15\xea\x06\x3e\xaa\x6d\x50\x02\x6f\xe6\xdd\x6f\x80\xdf\x49\xbc" - "\x0d\xc8\xc9\x66\x27\xee\x27\x22\x9f\x54\x03\xfc\x37\x10\xf9\x4c" - "\xbb\xf4\x22\x69\x16\xe7\x8a\xda\x4b\xcb\x84\xf1\x9d\x7a\xbb\xa5" - "\x5d\x58\x52\x48\x33\xa1\x9e\x36\xcb\x3e\x6e\x85\xb4\x1c\xde\x87" - "\xc0\x8d\x2d\x57\x56\x64\x5d\x59\xa1\x75\xdf\x58\x3f\x22\x8d\xd8" - "\x0f\x5c\x13\x41\xfd\xfb\xd0\xee\xc1\xbd\xd0\x40\x6e\x22\xca\xba" - "\x79\xfe\xc1\xfc\x8e\x0c\x4b\xfb\x2a\xac\x18\x75\x25\xbf\xf6\xac" - "\x03\x7b\x27\xd7\xd2\x17\x33\x73\x4a\xb4\x32\x69\x85\x7a\x69\x72" - "\xfc\x18\xa5\x7a\xa9\x3a\x59\x3d\x2f\x51\xbd\x6e\x5e\xb2\x7a\xd9" - "\xd2\x90\x25\xf3\x16\xa9\x17\x28\xd7\xcc\x5b\xa9\x0c\xd5\x8c\xd0" - "\x0c\x24\x22\xe9\x43\xca\x79\x2b\x57\xae\x5a\xb2\x30\x4e\xb9\x54" - "\xbd\xe0\xbe\x15\x0b\x57\x2e\x4c\x56\xce\x5b\xb1\x6c\xd5\xd2\x38" - "\xe5\x88\xb8\x91\x23\x42\x1f\x8c\x1b\x68\xe9\x43\xbb\x5b\x41\x5a" - "\xcd\x57\x5a\x5a\x72\xae\x10\x1f\x3f\x49\xd2\x0a\x3f\x8d\x7a\x29" - "\xf3\xdb\x3d\xba\x70\x54\x3e\xe1\xf6\x57\xc7\xbd\x6b\x69\xde\x54" - "\x0d\x7c\xcb\x91\x0e\xfa\xa9\x2c\xc3\x3d\xd6\x87\xd1\xe1\xed\x79" - "\x8f\x06\xeb\xe4\x8f\x29\xb8\x7d\x69\x21\x1d\xfa\x36\x9c\x5e\xa9" - "\x6b\x01\x9b\x2d\x09\x9f\xf9\x2e\xbb\x42\xfc\x73\x57\x13\x39\x1c" - "\xbe\x70\x28\x70\xff\x75\xc8\x33\x47\x27\x9f\xc6\xfb\x45\x1f\x35" - "\xea\x87\x2c\x3a\x49\x73\x17\x9d\x64\xb8\x3c\xda\x21\xf8\xa4\x67" - "\x6d\x26\xb3\x90\x3f\x4f\xcb\x1f\xe5\x7c\xd9\xcf\x03\x2f\xa3\x4f" - "\xf6\xd2\x87\x93\x23\xc0\x1e\x3c\xa9\xbd\x8d\xbb\xd6\xd1\x26\x25" - "\xbe\xd0\x2e\xf9\xc1\x94\x50\xf2\x32\xd4\xb5\x32\x90\x52\xa8\x43" - "\x2b\xf8\xd3\xa0\x0f\x0a\xe8\xcb\x09\xbe\x1f\xaf\x71\xfd\x28\xa4" - "\x41\xf9\x43\xa1\x7d\x79\x5c\x7b\x5a\x85\x3e\x40\xbb\x4f\x40\x9b" - "\xa2\xa1\x9d\x0a\x6c\x97\x23\x5f\x1f\xfa\xbb\xce\xca\xa7\x3d\x60" - "\x5e\x0d\xe3\x76\x07\xdb\x4b\x29\xa7\x94\xc9\x1f\xf4\x2b\xb1\x0c" - "\x7e\x67\x5f\x24\xbe\x5b\x71\xdf\xee\x8c\x3b\xe9\xb1\x36\x23\x69" - "\x54\x9d\x20\x7e\x6b\xa9\x9e\xbe\xdf\xd2\xc2\xfa\x34\x2d\x16\x75" - "\xc3\xbb\x09\x27\xe4\xd8\x27\x98\x2b\x7c\xcb\x2e\x3a\xf5\x2d\xca" - "\x5f\x1e\x46\xdb\xe8\x0e\x4b\x9b\x6b\xda\x61\x1c\x13\xb4\xb7\x2e" - "\xc1\x3c\xd5\x9e\x37\xad\x1a\xea\xf6\xe1\x6d\xe3\x36\xda\x35\xc7" - "\xc2\x96\x9a\x86\x7c\xd6\xe6\xa4\x6c\x1f\xa1\x6c\xdc\x0f\x1c\xf3" - "\x30\xfc\xa3\x1e\x80\x3c\x7a\xb1\xfc\x28\x85\x6d\xf9\x58\x26\xfc" - "\xd6\x0b\xf5\xb0\x75\xf8\x34\xb4\x09\xf4\xc0\xcb\x7a\x27\xf5\x05" - "\xe5\x15\xd2\xe3\x8d\x90\x9e\xd3\x41\xe4\x40\x7b\xbc\xac\x90\x2b" - "\x3f\x49\x27\x9f\x7a\x1c\xcb\x7f\x7e\x18\x21\x9b\x80\xe6\x52\xde" - "\x34\x1f\xf4\xef\xc2\x35\x90\xf9\x30\x62\xeb\xb7\xe6\xf9\xf9\x21" - "\x1b\x7e\x8e\xc8\x43\x9b\x30\x1f\xca\x07\x1e\xca\xb9\x4c\x70\xce" - "\xa9\x1f\x99\x4f\x82\xb1\x1e\xf8\xdd\x84\xfe\x10\x28\x53\x27\xd4" - "\x47\x81\xff\xb3\xcd\xcc\x07\xc3\xf3\x56\x48\xa3\xa6\x05\xf7\x5a" - "\xa0\x07\x41\xbf\x63\x1b\x91\xc7\xda\xf3\xa6\xfb\x0b\x3c\x05\xbc" - "\x7e\x9c\xe3\x2b\x7f\x12\x4c\xf3\xa2\x8a\x70\x6f\x70\xe4\xab\x52" - "\xe0\x27\xe4\x2b\xa0\x8d\x10\x78\x0a\x78\xad\x09\xe9\xa0\x0d\x03" - "\xab\xd7\x45\xc8\x51\x47\x36\xcb\xa7\xbf\x87\x3c\x46\xff\xf4\xf8" - "\x09\xfa\x8b\xdf\x9f\x60\x38\x4d\x7f\xaf\xd1\xc0\x30\x10\xc7\x7d" - "\x7a\xa6\xc5\xb8\x37\x01\x1f\x0f\xc4\x71\x66\xbe\xea\xe9\xef\x41" - "\xdb\x9a\x38\x5b\x7c\x03\x60\xc0\xcd\x55\xd3\x93\x31\x3f\x3f\x86" - "\xf5\xe2\x18\x4e\x6f\x72\x34\x86\x36\x63\xc7\xed\x45\x4d\xf3\xa6" - "\x9f\x44\x59\x69\xcf\x7b\x4c\x2e\xec\x43\xed\x08\x4b\xa8\x43\x2e" - "\xcf\x27\x3e\x58\x47\xad\x3f\x47\x1f\x26\xd4\x91\x03\x63\xad\x4f" - "\x53\xf5\xc8\xcf\xb5\x30\x33\xa3\x4f\x1c\xf3\x07\xf9\xe3\xf8\x3e" - "\x96\x2c\xe6\xa7\x6d\xb6\xf9\x47\x2c\xb0\x6a\x2b\x77\xd0\xbc\xc7" - "\x32\x5f\xe6\xf7\xe9\x86\xfc\x7b\x7a\x6a\x6f\x90\x92\xcd\x93\xda" - "\xbb\x91\xbf\x1f\x3b\xdf\x58\x44\x08\xa6\xf1\xe7\x27\x2f\xc1\xdc" - "\x63\xeb\xdf\x77\x7e\xbf\xe1\xf1\xfb\xac\xef\x37\x3c\x3e\xdc\xd9" - "\xfd\x06\xeb\x7a\x1f\x57\x63\xbd\xe6\xb2\xd9\x12\xb1\xee\xc7\x67" - "\x9b\x1d\xd4\x2d\xe4\x1f\x59\x6e\xb9\x9e\x79\x7c\x2f\xb6\xa1\x01" - "\xe6\x29\xfa\xcb\xd9\x12\x0a\xe5\xd4\x72\x73\xf8\xe3\x35\xcc\x7e" - "\x41\xbb\xe8\xf1\x22\xa4\xb1\xed\x47\xf7\xc7\xc7\x1f\xf7\xe8\x22" - "\x1d\xdc\x49\xbf\x47\x89\x02\xbf\x1f\xd4\x0b\x97\xa5\x56\xc4\x84" - "\x3a\x38\xf1\x25\x64\x2c\x47\x4f\xe1\xc3\x92\xf8\x73\x56\x8a\xbc" - "\x9b\xbe\xfb\xba\x17\x9f\x01\xac\xbd\x5c\x79\x06\x22\x61\xbf\xc2" - "\x15\x16\x14\x91\x3d\xe4\xa6\x44\xc8\xe2\xe8\xb3\x1c\x8e\xf4\xd9" - "\xfd\xa0\xbc\x50\x8e\x98\x52\x23\x5f\xbe\x70\x4e\x2d\xcf\x31\xc5" - "\xfa\x1c\x3e\xb2\x39\x16\x15\xdc\x29\x8b\xe3\x1e\xdf\x7a\x38\xae" - "\x3b\x49\x5a\x6e\xd9\x56\x18\xee\xf4\x7e\xdc\x0f\x3f\xfc\x63\x80" - "\xf2\x82\xe1\x7a\x78\x74\x37\xc1\x2d\x6d\x1b\x2d\xc8\x8f\xb2\xe6" - "\x8f\x2b\xef\xa1\x8f\xee\x7e\xee\xb0\xf8\x7d\x27\xfb\x1a\x17\x7b" - "\x15\xcb\xef\xf9\xa3\x6c\x1a\x20\xfc\x14\xd9\x63\x5c\xb3\x23\x52" - "\x71\xfc\x1f\x12\x30\xa6\x96\x1c\x2a\x5e\x9f\xa0\xb5\x3e\x9f\x98" - "\x6b\x7d\x3e\x49\x77\x15\x5a\x4e\xb8\x4a\xd2\x74\x43\x08\x89\xa8" - "\xea\x4e\xf4\xb3\x11\x19\xbf\x5c\x1b\x11\x12\x3f\x7c\x6b\x64\x84" - "\x4c\x0e\xb3\x48\x96\x3b\xa6\xbe\x36\x9f\xdb\x36\xf2\x02\x71\xa7" - "\x5e\x61\x77\x71\xa2\x4d\x1a\x9e\xdf\xa4\xe4\xd3\x46\xef\xb7\xa3" - "\xe7\xd2\x94\x16\xe7\x92\x08\xf8\x53\x0e\xfc\xaf\xb7\xa7\xfd\xf9" - "\xf3\xf3\xc7\x85\x8f\x04\xe5\xe3\xe7\xcf\x35\xfa\x50\x36\x8b\x83" - "\x26\xe2\xbe\xf0\x1f\xed\x56\x94\x94\xbf\x40\xf9\x04\xca\xff\xb8" - "\x2a\xf3\xf8\xcf\x9f\x9f\x3f\x3f\x7f\x7e\xfe\xfc\xfc\xf9\xf9\xf3" - "\xf3\xe7\x06\xf8\x48\x2c\x17\xd6\xb8\xdf\x43\x7f\xfe\xdb\x72\xfd" - "\x23\xe1\x0f\xcb\x34\xa9\x37\xf9\x28\xff\x21\xe9\x11\x5a\x65\x79" - "\xac\x4e\x91\x1b\xdd\x14\x5a\x9d\xa4\xf7\xc9\x8c\xaa\x0b\xae\x54" - "\xb5\x04\x16\xc5\x9c\x08\xaf\xd1\x18\xe4\x9b\x22\x6b\x83\x2a\xe2" - "\x9a\xfd\xf3\x67\x1f\x0f\xdb\x93\xdc\xe6\x9b\x35\xa3\x3e\xa4\x2a" - "\xb1\x75\x78\xf1\x9c\x93\xe3\xf7\xa5\x18\xa5\x19\x93\x0f\xdc\xfd" - "\xea\xfc\xd3\x43\xf3\x7e\xfb\xe9\x98\xbf\xae\xb8\x38\x70\xcb\x63" - "\x47\xee\xfd\x4b\xc2\xb9\xdb\x5e\x79\xf6\xcb\x87\xfe\xbe\xae\xf3" - "\xa6\x17\x1e\xfd\xe7\xaf\x5f\x8f\x3f\x3b\xac\xf0\xa9\xcf\x1f\x7c" - "\x7f\xf5\x95\xc1\xd9\x4f\x34\x8c\x7c\x6b\xe9\x85\x3b\x4a\x9f\xfb" - "\xfa\x91\x0f\x53\xcd\x92\x8d\x93\xf6\xdf\xb5\x73\xde\xb7\x43\xb6" - "\x3d\xf9\xc9\xe8\x77\x96\xff\x34\xe0\xc5\xe9\x87\xef\x79\x43\xfd" - "\xfd\xad\xdb\x9f\xf9\x62\xdc\xde\xb5\x1d\xfd\x36\x4f\x3d\x34\x62" - "\xd7\xc2\x33\x01\x05\xbf\xfb\xec\x81\xf7\x56\x5d\x1e\xb4\x75\xe6" - "\xb1\xfb\x76\x2f\x39\x7f\x7b\xc9\x1f\x4e\x4d\xf8\x60\x83\x49\xf6" - "\xfc\x94\x83\xbf\x7a\x6d\xc1\xbf\x6f\x79\xf9\x7f\xff\x75\xff\xbb" - "\x2b\x2f\xdd\xfc\xd2\xe3\x47\xff\xe7\xcd\xc5\x3f\xfc\x72\xc7\xef" - "\xbf\x7a\xf8\x1f\xeb\xbb\xfa\xff\x71\xda\xc7\xbf\xf9\xf3\xa2\xef" - "\x7e\xf1\xa7\xa7\xff\x6f\xec\xdf\xd6\xb4\xfb\xe5\xcc\x6a\x1c\xf5" - "\xf6\xb2\x1f\xef\x2c\x9b\xfb\xcd\xc4\x8f\xd2\xa8\x37\xe3\x47\xe4" - "\x3b\x2e\xf5\x25\x6e\xa2\xf1\x88\xc9\xa5\xb1\x1e\x97\x23\x95\xf0" - "\xf8\xb3\x84\xf4\x07\x88\xc4\x87\xdc\x24\xf7\x60\xc5\xe0\x69\xbf" - "\x9d\x7c\x94\x96\xf9\x5d\xf9\xa0\xff\x68\x34\x1c\xf7\xc3\xf1\x4b" - "\x2e\x45\xf4\x02\xdc\xed\x62\x19\xd7\xfe\x23\x81\xbe\xcb\xa0\x65" - "\xfd\xc8\x4d\x30\x5a\x3e\x64\x00\x19\x48\x6e\x26\xbe\x64\x10\x19" - "\x4c\xfc\x88\x82\x0c\x21\x43\xc9\x2d\xc4\x9f\x04\x90\x61\xe4\x17" - "\x24\x90\xdc\x4a\x6e\x83\xde\x0c\x27\xb7\x93\x3b\xc8\x9d\x30\x28" - "\x77\x39\xee\x4b\x3a\x89\x08\x84\x3f\xf0\x3f\x9a\x44\x70\xe7\xb1" - "\x3f\xa7\xf7\x69\xba\x96\x4f\x6f\xe2\xd3\x75\x3f\xa7\xf7\x69\xba" - "\xf2\x3f\xfc\x7d\xd7\x7f\xf4\x5b\x02\xa6\x03\xb3\x1e\xac\x6c\x88" - "\xee\x8f\x6d\xaa\x84\xff\x74\x9f\x93\x5e\xf2\xdb\x95\x67\x9d\xdf" - "\xf6\x13\x01\x07\xef\x90\x4d\x23\x84\xdd\x6f\xa0\x96\x1f\x63\xa1" - "\xe4\x80\x7c\x48\x3a\xde\x3a\xf1\x21\xfe\xdc\xdf\xde\x3f\xda\x64" - "\x38\xd2\xe1\xc8\x82\x23\x07\x8e\x1d\x70\xec\x12\xca\x26\x92\x3b" - "\x23\x89\x44\x99\x02\xdf\x3a\x22\xb9\x2b\x10\x8e\x2a\x22\x09\x0a" - "\x21\x92\xbb\x5b\x89\x64\x44\xa2\xd8\xf8\x91\x99\xdd\xad\x94\x84" - "\xf0\xe9\x4a\xf8\x3d\xda\xd2\x57\xeb\xee\x7c\xa6\x9d\x3a\x3b\x4a" - "\x39\x7a\x64\xd8\xc8\x07\xee\x9f\xa7\xbc\xef\x3e\xe5\x98\xd0\xd1" - "\xa3\x47\x85\x3e\x38\x6a\xf4\x58\xe5\x98\x31\x0f\x8d\x0e\x7d\x28" - "\x34\x54\xb9\x64\xed\x0a\xf5\xe8\xd0\x45\x0b\x95\x4b\xe3\xd4\x2b" - "\x95\xf1\xea\x15\x4b\xd6\xcc\x5b\xb1\xd0\x85\x9e\xbb\xf5\x81\xae" - "\x90\xdb\x4d\xac\x99\x96\x08\x49\xc8\x44\x22\x9f\xed\x43\xe4\x8b" - "\x74\xc4\x1e\xd2\x60\xfe\xb0\xfb\x2c\x79\xf6\xa9\x2f\x47\xfc\x7e" - "\xf0\x81\x49\x8b\x46\x4c\x98\xf2\x5a\x4e\x35\x91\x2e\xae\x27\xd2" - "\x05\x59\x44\xfa\x4c\x3a\x91\xce\x34\x10\x69\x44\x1b\x91\xee\xaa" - "\x22\xd2\x92\x68\x22\x7d\x39\x98\x48\xff\xb8\x89\x48\xd7\xc5\xd9" - "\xa7\xed\x99\xc3\xd2\xce\x66\x12\xe9\xc9\xf1\x44\xda\xa4\x21\xd2" - "\x83\xfe\x2c\xcd\x08\x69\x17\x83\xae\xf6\x50\x5c\x85\x8f\xbb\x7c" - "\x20\xf9\x7f\xee\x2b\xa9\x0f" +static unsigned int rss_eth_z8e_uncompressed_length = 534724 ; +static unsigned int rss_eth_z8e_length = 151912 ; +static unsigned char rss_eth_z8e[151912 + 1] = + "\x78\x9c\xec\xbd\x7f\x7c\x94\xc5\xd5\x37\x7c\xb2\x59\x24\x60\x92" + "\x0d\x18\x71\x4b\xb1\xae\x16\x74\xb1\xfc\x08\x8a\x95\x5a\xd0\x28" + "\xa0\x51\x81\x44\x49\xdb\xa8\x68\x40\x01\x03\x46\x88\x10\x61\x81" + "\x90\x0d\x0b\xb6\xb1\xe6\x17\x3f\xc4\x08\x81\xc4\xa7\xd8\xd2\x16" + "\x6b\x6c\x69\x8b\x2d\x6a\x2c\xe9\xfb\xd0\x36\xc9\xd2\xbe\xf4\x79" + "\x72\xd7\x20\x6b\x8c\x31\x37\x2e\xb0\x92\x85\xac\xc9\xee\x35\xef" + "\xf7\xcc\x5c\x57\xb2\xbb\x6c\x50\xee\xfb\xfe\x7c\xde\x7f\x9a\xcf" + "\x67\x73\x5d\xd7\xfc\x38\x33\x73\xe6\x9c\x33\x67\x66\xce\x9c\x21" + "\xba\xfc\x3f\x0f\x25\xf0\x23\x8e\xe2\xcf\x1d\x7d\xff\xbf\x90\xff" + "\xdf\x7f\xff\xfe\xfb\xf7\xdf\xbf\xff\xfe\xfd\xf7\xef\xbf\x7f\xff" + "\xfd\xff\xfb\xe7\x8b\xa3\xa9\xe7\x4c\x66\xfa\x53\x15\x51\x8f\x2b" + "\x61\x8c\x27\x2e\x6e\xce\x2b\xdb\x45\x10\x51\x71\x18\xe7\xc7\xf0" + "\x93\x7f\xdb\x10\x66\xaa\xa2\x84\x1b\x52\x28\x45\xbc\x62\x35\xcd" + "\xdc\x43\xb4\x63\x94\xf0\x6e\xdf\x29\x7c\x8d\x45\x44\x47\xf6\xe1" + "\x7b\xa7\xe8\xda\x3e\x4a\xf8\x01\x67\xa1\x87\x16\x9a\x19\xce\x66" + "\x7c\x6f\x46\x38\xc2\x0a\x11\xe6\xe7\xb0\x4a\xe4\x33\xc2\xdd\x5b" + "\x2e\x50\xa3\x2d\x48\x95\x0c\xc7\x16\xa2\x59\xd7\xcb\x7a\xd4\x21" + "\x6d\x11\xa7\xdd\x34\x0a\xe5\xa6\x12\xb9\x76\x8a\x40\x58\x1d\x12" + "\xb8\x1c\x2e\x5b\x4f\x7f\x2c\xaa\x3c\x1f\xc2\x3a\x8c\xf2\x06\x81" + "\x91\xc2\xf9\xb9\x0d\xb6\x6f\x50\x7c\x27\x5d\x79\x35\xc3\xe4\xba" + "\x09\x17\x25\xb8\x7b\x83\xd4\x49\xc3\xec\xdd\x2e\x8a\x3f\x02\x6c" + "\x54\xec\x94\xe1\xf1\x6e\x7f\x90\x6c\xc5\x14\x87\xb8\xb9\x78\x9a" + "\x90\x2f\x89\xf1\x33\xbf\x86\xc6\x72\xd9\x80\x6b\x16\xa6\x86\xb8" + "\xda\x91\x44\x8c\x23\xbf\x89\x6e\xf2\xbb\x28\xae\xc7\x35\x0c\xed" + "\x4f\xb0\xcb\xf6\xa3\x5c\xe4\x35\x77\xd2\xf0\xcf\x4d\x48\x8f\x32" + "\x7d\xb6\xf5\x5c\x87\xe1\x7f\x16\xae\x06\x93\x01\x47\x73\x35\x5c" + "\xb9\x77\x1b\x51\xb7\xcb\x74\xbf\xdf\x64\x11\x3a\x9c\xc3\x06\x1c" + "\x4e\x87\xb2\x12\xb9\xac\x6e\x97\x79\x5b\x58\x1a\x8f\x91\x06\xf5" + "\xf6\x4d\xf6\x53\x3c\xd7\xb9\x9d\x86\x4f\xe3\xf2\xf4\xb6\x98\xb9" + "\x0c\xf7\x9a\x20\xb9\xd1\xf7\x28\x3b\x15\x6d\xb5\x1d\x09\x10\x01" + "\xe6\x88\xda\x62\x22\x86\x8f\xfa\xdb\x14\xcc\xe1\x53\x0d\x98\x0c" + "\xa3\xbf\xad\xae\x86\x91\xb5\xb2\x8e\xdc\xd6\x04\xd2\xd3\x2e\x0c" + "\xaf\x23\xc3\x45\x5b\xae\xe1\xb6\x34\x82\xa2\xf4\x34\x5b\xfa\xf1" + "\xd1\xdf\xfe\x2b\xd3\xa3\x60\x5b\x15\xec\x38\xc0\x8e\x6b\xd0\xf3" + "\xf5\xb7\xdf\x13\x95\x5e\xa5\x4d\x19\xe6\x37\x09\x1d\x0f\xc3\xbb" + "\x06\xd2\x0e\xdb\x11\x9e\x16\xf5\x31\x29\xdc\x92\xc9\x43\xc3\x5b" + "\xd1\xce\x78\xa4\x99\x83\x7e\xb4\xe9\xf1\x57\xeb\xf1\x56\xc4\xdd" + "\xa5\xe0\x5d\x39\x2d\x0c\x5e\x0a\xc3\x0b\xa7\x2d\xc5\x51\x66\xfc" + "\x86\x40\x41\xbe\x02\xbf\xa1\x09\x06\xbd\xad\xb6\x0a\xcd\xf9\x35" + "\xb4\xa9\xe2\x83\x85\x9a\x4b\x90\xdb\x11\x20\xdb\x68\x72\xb6\xd3" + "\x95\xf5\x80\x4f\x15\xeb\x29\xc1\x59\x20\x02\x6e\x87\x97\x5a\x7c" + "\x5e\x72\xfa\xc0\x1b\xc1\xf3\x54\x7c\x1e\xb4\x18\x3c\x4d\xc5\xcf" + "\x91\xb5\xb1\xe8\x13\x8a\x45\xcb\x9a\x49\x90\x73\x0c\xe7\xed\xa0" + "\x96\x9a\x0e\x72\xd6\x44\xe6\x75\x5e\x4b\xd6\x66\x7c\xa3\xcf\x2d" + "\x5c\x0f\xe6\xb7\x60\xf2\x07\x0b\x8b\x5e\x25\xb3\xf3\x7a\x32\x35" + "\x2f\x6e\xd0\xeb\x92\xe8\xe0\xba\x6c\x39\x45\x09\x3f\x59\x0a\x3a" + "\x3c\xc5\xf5\xfd\x78\xe1\x9b\xeb\x03\xa6\x23\xd6\x39\x74\xc4\xda" + "\x46\x8d\xd6\x19\xd4\xe8\x98\x45\x15\xa7\x28\xf1\x48\x60\x3a\x35" + "\x9a\xef\xa5\xc6\xb1\xb3\xc8\xed\xc5\x3b\xf8\xf7\x88\xd5\x4f\xb6" + "\x35\x4c\x4f\x89\x79\x3b\x96\x53\x82\x47\xc1\x04\xee\x12\x0b\xdf" + "\x2f\x24\x62\xdc\xf1\x77\xac\x76\xac\xfe\x1a\x59\x51\xbf\x2e\xd4" + "\xe5\x3b\xa8\xcb\x1b\x63\xad\x94\x86\x3a\x0f\x75\x57\x07\xc9\x5c" + "\x44\xc3\x06\xe1\xe3\x54\x0d\xb4\x07\xde\xf5\xee\x85\x3c\x61\xfe" + "\xed\xde\x90\x03\x99\x90\x08\xfe\x4f\xdc\xa2\xf3\x80\xd7\xf9\x1a" + "\x99\xbb\xd7\xe6\xc4\xd5\xee\x14\x1d\x3d\xae\x24\x32\xe2\xc0\x8b" + "\x1d\x88\xef\x9a\x9c\x4a\x29\xee\x60\x3a\xbd\xd7\xdb\xc5\xfc\xe8" + "\x4d\xf6\x53\x1c\xc3\xb3\x38\xc0\x3b\x6b\x68\x08\xea\xf3\xf7\x5a" + "\x84\x7f\x13\xe9\x90\x3f\xdd\x43\x3b\xeb\x39\xbf\xb8\xe6\x31\xbf" + "\x76\xcd\x63\xe7\xb5\x57\x1e\xeb\x16\xaf\x3c\x76\x2e\xf4\xca\x63" + "\x9f\x3b\xd7\x51\x42\xe8\x9a\xc7\x7c\x2d\x05\xb2\x0f\x52\x5a\x0a" + "\xd0\x07\x21\x4a\xd8\x78\x9a\x52\x9e\x78\x0e\x7d\x1f\x3c\x41\x1b" + "\x97\x91\x55\x4b\x6a\xb7\xba\x83\xff\xa4\x27\x8a\x48\xe0\xdd\x1e" + "\xab\x7d\xdd\xc9\x1f\xd7\x19\xbc\x85\x72\x0f\x79\xe2\xff\x95\xc3" + "\xe5\xfa\x92\x3e\xab\xc3\x6f\x1f\x7e\xfb\xf1\x3b\x20\x92\x3f\x3e" + "\x00\x5c\x39\x93\x37\xc5\xd1\xde\x5e\xa2\xc9\x1a\xc5\x9d\xa2\xa4" + "\xe3\xa8\x7f\xca\x20\x78\x1b\xa3\x6d\xbb\xa9\xea\xa6\x12\x2a\xee" + "\xe9\xc9\x23\x96\x85\x2c\xff\x58\x1e\xf6\xb8\x92\x6d\x28\xa7\x5a" + "\xf2\xef\x4e\xc8\x98\x91\x37\x55\x21\xbc\xcb\xbf\x21\x2f\xce\xb7" + "\x21\xcf\xd4\x3d\xf2\xa6\xed\x48\x33\x0b\x69\x8e\xe9\x38\xec\x62" + "\x58\xe0\x2d\x5f\x52\x90\xe2\x01\xb3\xe0\xf7\x17\x5a\xcd\x7b\x76" + "\x8a\x36\xa4\xcb\xef\x87\x05\xd8\x80\x03\xfc\x27\x97\x18\x61\xc0" + "\x75\x47\x39\xd2\x71\x7e\x77\x20\x9d\xc7\x14\x8f\x3b\xbf\x8b\x2c" + "\x41\x1a\x2e\xfa\x54\x79\x48\xd3\xc5\x32\x3d\x29\x40\x57\xf4\xb8" + "\x28\x8b\x61\x73\x3e\xb7\xb7\x8b\x90\x6f\xbb\x70\xe6\x99\x10\x3e" + "\xaf\x47\xe4\xc5\x6d\x41\xf8\x11\xe4\xd7\xcb\xee\x32\xea\xc8\x65" + "\x70\x5f\xcb\x7a\x82\x1e\x8e\xe4\x07\x28\xa9\x9a\xe2\x91\x6f\x3e" + "\xc3\x63\x58\xa0\x03\x0f\xda\xba\xfd\x48\xbe\x8f\x34\x11\x01\xd3" + "\xa3\xe0\x59\xa6\x45\xc0\x43\xb8\x00\x3c\xa6\xbf\x46\xe4\x49\xaa" + "\x93\xf0\x1e\xfe\xbd\xc6\xf0\x02\x64\xb6\xc9\xfa\x7e\x9f\x61\xf4" + "\xb0\xfc\x00\xcc\x86\x35\xf7\x90\x97\x2c\x75\x3e\x67\x5e\x7c\x0b" + "\xc6\x4d\xce\xff\x66\x71\xd7\x10\xd1\x9d\x13\xcf\x34\xc7\xf1\xee" + "\xe0\x39\x4e\xb3\x49\x74\xe7\xc5\x27\x79\x21\x8b\x90\x06\xf9\x1d" + "\x5c\xcf\xf0\xbe\x7c\x78\xf6\xf7\x67\xd0\xf7\x67\xdd\x3f\x6b\x06" + "\xcd\xbd\x7b\xe6\x0c\x4a\xfb\xce\xc4\xb4\xa9\xb7\xde\x7e\xab\x7c" + "\xb9\xf5\xf6\x69\xb7\x52\xd6\x0f\x1e\x9e\x41\x59\xf3\x66\xd0\x7c" + "\xfc\xb2\xe6\xcf\x7e\x78\xd6\xec\xf9\x33\x28\xe7\xde\xfb\xf1\x35" + "\x73\xc6\x94\xb4\xfb\x26\x66\xcd\xbc\x7f\x36\x3d\x94\x7d\x4b\xda" + "\x2d\xb7\xd0\xdd\xb3\xe7\x4c\x49\x4b\xd3\x9f\x53\xd2\x38\xc9\xa3" + "\xd3\x66\xcf\x9f\x98\xb5\x6a\x65\xe1\xca\x89\xf3\xee\x9f\xc9\x21" + "\x90\x6e\x61\x34\x64\x0f\x5d\xd0\x18\xd7\x7e\x71\x36\x83\x34\xc8" + "\x8e\xbd\xa0\x01\xfc\xbc\x0d\xc5\xed\x90\x01\x23\x9e\xdf\xcb\x7d" + "\x27\xc7\x00\xcb\x61\xf0\xbd\xb9\xc7\x95\x52\xe4\x89\xff\x20\x85" + "\x71\x68\xbb\x81\xe5\x84\x75\x08\xe2\xde\xd7\xc7\x9a\x21\x88\xaf" + "\x89\x8c\xbf\x0a\x32\xd8\xf2\xbf\x5b\x6c\x44\x6e\xfc\x80\x77\x3f" + "\x64\x21\xf0\xeb\xa3\x6e\x67\xce\x10\xd0\x77\x1c\xca\xe8\x00\x6f" + "\x1e\x43\xde\xd6\x30\x9e\xef\x40\xff\x1c\xe3\x71\xe5\x0c\xa5\xbc" + "\xd5\x52\x98\x4e\xdc\x4f\xee\x42\x1d\xc6\xf9\x7e\x18\xc3\x25\x0c" + "\xf4\x3d\xe0\x1c\x57\x70\x46\xd8\xc2\xe4\x83\x87\xe1\x54\x20\x4e" + "\x87\x75\xbe\x05\x72\x02\x72\x7c\xb9\xe6\xb4\x93\x48\xfe\x20\x4f" + "\xeb\xb3\xcb\xb1\x12\xf9\x72\xc2\xe8\xda\xdf\xe8\x40\xba\x9f\x64" + "\xc4\x81\x0e\xe2\x30\xfe\xa2\x2d\x29\x8b\x41\xdf\xfe\x50\xc5\x67" + "\x6f\x89\xb3\x39\xac\x47\x5c\xd1\x49\x23\xff\x8e\xf6\x35\x69\x15" + "\x9f\xd5\x8b\x1e\x19\xc6\x78\x3b\x24\xf8\x3b\x19\xe9\xfa\xfa\xc3" + "\xde\xe6\x30\xd0\x41\x3c\xf3\xab\x10\x32\x1c\x63\xe6\xc8\x75\x90" + "\x69\xad\x48\x5b\xcf\x69\x27\x07\x69\x28\x64\x8d\xd5\xe6\x8c\xa3" + "\x76\x1a\x49\x5a\xf2\x67\xbf\x0e\x2b\x0f\x70\x46\xf2\x20\xc5\xf4" + "\x68\xee\x39\x0b\x38\xdd\x32\x1c\x7a\xcc\xc8\xc7\x01\xff\x37\x2c" + "\x2b\x95\xfc\xb6\x8e\xe3\x74\xfa\xd8\x3c\xf0\x0d\x5e\x57\x70\xac" + "\xe3\x8e\x00\x97\xac\x2f\xb0\xfe\xd7\xe3\x1a\x99\xed\xa1\x24\x9f" + "\x1a\x1b\xad\x63\x39\xad\x86\x3a\x8a\x94\x7c\x6e\xcb\xc1\x86\xf5" + "\x5e\xea\x2c\xe0\xb1\x76\x64\x8a\xe6\xcc\xa3\xc8\x3a\x8d\x68\xe2" + "\xfa\xb3\xfc\x00\x2e\xfe\x09\x3a\x18\x06\x78\xfb\x22\xe9\x60\x64" + "\x03\xe0\xbc\x85\xfa\xb5\xa2\x4d\x6f\x79\x68\xc4\x51\xad\x3b\x0f" + "\xe5\x92\x09\x7c\x05\x79\x3e\x00\x43\xcf\xdf\x11\x99\x7f\x44\x29" + "\xe7\x43\xfa\x21\x3d\xdd\x32\x7d\x19\xe3\x5c\xa7\x3b\xd0\xe5\x55" + "\xa9\x91\xe9\xaf\xf9\x4f\xd4\xe5\xc3\xb0\xf8\xa9\x51\xf1\xcd\x88" + "\xff\x58\x8f\x07\xdf\x5f\x95\x1d\x45\xb7\x05\x88\xff\x14\xf5\xf5" + "\x83\xaf\xa1\x5b\x8c\xc8\x00\x8d\xf9\xc2\xd2\x6f\x89\x4a\x0f\x39" + "\x6f\xf9\x8c\xe9\x86\xc7\x1c\x4e\x5f\xab\xf3\x0e\xd2\x27\x20\xfd" + "\xc1\xa8\xf2\xdf\x40\x7a\x7f\x58\xfd\x8e\x47\xc6\xa7\xd6\x20\xfe" + "\x0b\xa6\x75\xe8\x44\x43\x90\x66\x28\xcb\x12\x96\x63\x47\xf2\xb9" + "\xbf\x52\xcd\x51\xe9\xc7\x22\x5d\xa2\x8e\x23\x93\x8e\xa3\x0c\xee" + "\x47\x94\xd1\xa6\xea\x90\x3a\x2d\x2a\x4f\x0e\xf2\xa4\x02\x8f\x6f" + "\x19\x74\x19\x23\x4f\x7e\x54\x9e\x32\xee\x47\xa1\xca\x31\xf7\xf4" + "\x0d\xe4\xd1\x65\x64\x38\x0c\x6e\xdb\x95\x80\x51\x1f\xd5\xf6\xa9" + "\x28\x77\x4c\xb9\x92\x3b\x57\x82\x86\x6e\x41\xd8\x38\xc0\xfc\x2d" + "\xf3\x00\x78\xd5\xef\xf6\x05\x48\x38\x33\x12\x15\xed\x5e\x3d\x22" + "\x39\x48\xfc\x3e\x91\xdf\x19\xb6\xe8\x99\xa3\xf3\xe4\xd5\x23\xf0" + "\x44\x78\x2a\xeb\x6f\x71\x2c\x83\x45\xcf\x83\x9a\x82\x79\xf5\x6d" + "\xc2\x44\x26\x7c\x87\xf4\x32\xae\xc5\x77\x1c\xea\xff\x6b\x8c\x39" + "\x24\xd6\x22\xdd\x7a\x9a\x89\x70\x0e\xfb\x9d\x9e\x6e\xe0\x7b\xed" + "\x83\x41\x15\x3f\xea\xef\xaa\xcc\x0c\xa6\xf7\xa9\xf8\xfe\x8b\x82" + "\x37\xea\x7d\x86\x8f\xf7\x29\xfa\x7b\x5c\x88\x61\x9f\x35\x78\x72" + "\xd4\xdb\x32\x1f\xf8\x52\x96\x87\xfc\x62\xad\x8c\x63\x98\xaf\xe3" + "\x79\x3f\x9e\x5b\xf1\x7c\x08\xcf\x67\x9d\x5f\x90\xd5\x19\x92\xfc" + "\xc9\xdf\x8f\xe0\xf9\x30\x9e\xb3\xf1\x9c\x8f\xe7\x14\x3c\xef\xc1" + "\x33\x89\xf9\x04\xe3\x2a\xcf\xb9\xfc\x18\x67\x15\xad\xf1\x9c\xa0" + "\x27\x83\x71\x32\x1b\xed\x96\xb8\xd0\x94\xbc\x49\x50\xfd\x7a\xb5" + "\x9c\x13\x82\x3e\x38\x6c\xa8\xa2\x0f\x15\x16\x32\xe4\xd2\xd9\x81" + "\x30\x5d\x56\xe9\xbc\xa9\x87\x29\xf8\x59\x80\x7f\x8c\xeb\x2a\x14" + "\xac\x21\x8a\x06\x74\xf8\x2a\x9f\x39\x46\x99\x71\xe1\x65\xe2\xb9" + "\xcf\xe9\x10\x02\xcf\x2a\xee\x33\x0f\x8d\x6a\x00\xfe\xcc\x1a\xf7" + "\xc9\x2a\x9a\x83\x32\xf2\xb9\x0f\x0c\x9a\x12\x8a\x46\xaf\xe0\x77" + "\x6d\xed\x33\x90\x51\x88\x5f\xfb\x8c\xa6\xd3\xa1\x4c\x23\xe3\x55" + "\x5d\x16\xe8\x65\x4c\xe5\xfe\x91\xf1\x32\x3c\xf5\x58\x18\x5d\x8e" + "\xec\x71\x5d\x93\x11\x45\x97\x45\xa0\xcb\x49\x4c\x7f\xdc\x67\x8c" + "\x97\xe4\x02\xa9\x13\x98\xfa\xe1\x9f\x55\xf4\xbd\x57\x9f\x03\x2b" + "\x59\x70\x4d\x55\x94\xac\x92\xf4\x1f\x25\x3b\xbc\xdc\x5f\xf1\x45" + "\xcc\x53\xd7\x34\x78\xe8\x4d\x8f\xd4\x3f\x2b\x3e\xfb\x3d\xc7\xfb" + "\x41\x1f\x5c\x6e\x7c\x01\xcb\x82\x6b\x3c\x46\xbc\x8c\x1b\x61\x4f" + "\x61\x5e\x89\xcf\x97\x71\x08\x4b\x3c\x64\xc4\x19\xe5\xc4\x17\x72" + "\x9c\xd5\x3a\x00\xf7\x83\x52\x1d\x6e\x7c\x2c\xfd\x51\x94\x7d\xe0" + "\x98\x48\x64\xba\xb9\x84\x86\xb8\x83\xc7\x29\x33\x28\x42\xdf\x2a" + "\xa1\x61\xee\xe0\x01\x1a\x4f\x34\xc2\x1d\x3c\x4c\x76\xa2\xeb\xdd" + "\xc1\x1d\xd0\x67\xb6\x70\xfc\x7b\xe3\x4b\xe2\xe2\xf0\x74\xde\x44" + "\xa6\x38\x77\xb0\x86\x6e\x24\x33\x9e\x85\x74\xef\x0b\xa2\xc7\x1d" + "\x5c\x8c\x74\xf9\x94\x19\x12\x67\x67\x0d\x11\x27\x73\x43\x94\x32" + "\xe7\x05\xe1\x74\x07\x31\xb7\x08\x36\x21\x5c\x13\x99\xa1\x2f\xf0" + "\xeb\x11\x5a\xd9\x07\xa5\x99\xa1\xb3\x62\xe6\x0b\xef\xe1\xfb\xa4" + "\x98\x39\xc4\x29\xd0\x4f\xc2\x1d\x9c\x4e\x2d\x7e\x3f\xd2\x4f\x25" + "\x51\xfe\x81\xe3\x89\xf3\x26\xea\x83\x4e\xa2\x95\x7f\x50\x8a\xf6" + "\x54\xf7\xa1\x2d\x18\xaf\x5f\xe9\xdb\x80\x67\xc5\x07\x3b\xe5\x77" + "\xe2\x07\xfb\xd1\x96\xea\x89\x25\x98\x67\x38\xd0\x8e\x90\x4f\x40" + "\x8f\x31\xbb\x1d\x6d\x94\xbc\x89\x75\xf5\xe9\x98\xab\x7d\x42\xe8" + "\x07\x8b\x0e\xb7\x9a\xe7\x68\x22\x09\xf9\x2a\x3e\x78\x5d\xc2\x28" + "\xfb\xe0\xa8\x25\x4e\xf8\x20\xb7\x2d\x8c\x0b\x77\xb0\x0d\xbf\x4f" + "\x88\x71\xe0\x0e\xfa\x01\x93\x2c\xc8\x77\xb4\x2f\xe9\x83\x43\xf8" + "\xb5\xf6\x25\xb5\x25\x88\xe4\xb6\xd1\xc2\x95\xfa\xbe\x80\xee\x20" + "\xca\xda\xec\xf8\x9e\xc6\x73\x4c\x89\xcb\x10\x0d\x15\xe5\x6d\x76" + "\xd0\xcb\x2c\xd0\x1d\xea\xda\x96\x23\xcb\xa9\x68\xfb\x81\x5f\x70" + "\x1b\xda\xbe\xaf\xda\xd0\xf6\x3d\xd5\xa6\x36\x87\xce\x47\x1c\xb6" + "\x16\xef\xd9\x3d\x9c\xae\xac\xcd\x21\x12\xdb\x4a\x03\xe0\x4d\xe0" + "\xb5\x84\xf1\x08\xbc\x96\x30\x2e\x01\xdf\xe1\x76\x94\xa1\x1d\x6d" + "\xa5\xa8\x4f\x35\xf2\xfd\xa2\x4f\xea\x33\x6d\x87\xfc\x0a\xce\xef" + "\x01\x67\x81\x84\x93\xd8\x76\x08\xb0\x8e\x86\x5c\x36\xca\x5c\x27" + "\x02\x99\xc1\x4d\xc1\xdc\x75\x14\x3f\x81\x4a\xe2\x78\x2e\xe3\x76" + "\xe4\xa3\x9d\x8d\x78\xce\x42\x3c\x5d\x85\xb2\xde\x03\xdc\x43\x5c" + "\x1e\xca\x39\x0a\x98\x7f\x06\xac\xc5\x5c\xbf\x5e\x13\xa5\xe0\xbb" + "\xb5\x77\x83\xac\x5f\x40\x24\x9e\xb0\x6a\x89\x27\x12\x0c\x1a\x62" + "\xfa\x51\x78\x63\xba\x79\x9d\x40\x5f\x29\x99\x0e\x11\x44\x5c\x8a" + "\xdb\xc1\xe1\x35\xd4\x52\x80\x34\x0e\x8e\x2f\xc4\xfb\x5c\xbc\x6f" + "\x21\xa6\x9f\x79\x05\xfe\x4d\x93\x4a\x0a\xe2\x90\xfe\xbd\xdc\x60" + "\x02\x3d\x51\x60\x2e\x69\x29\xf0\x22\xce\x4b\x08\x73\xba\x1d\x35" + "\x72\xee\x85\x7e\x0d\x86\x12\x4f\x54\x87\xca\xda\xba\x92\xfd\x4e" + "\xe1\x76\x14\x22\x6d\x01\x8d\x2f\x49\x88\x93\xe9\x1d\x8b\x65\x7b" + "\xb4\x8a\x12\xe2\x3c\xcd\x79\x07\x88\xe7\x70\x68\xbb\xaf\xd9\xbb" + "\x85\x69\x54\xd3\xca\x4e\xe4\x81\x3e\xfb\x9a\xf3\x76\xd0\x5c\x6f" + "\xc9\x50\xe0\x23\x0e\xe1\xa1\x66\x6f\x23\xd2\x36\x29\x9a\x5d\x17" + "\xb4\x34\xe7\x6d\xa1\x60\x62\x5b\x6b\xb0\xec\x84\x23\x73\x5d\x9f" + "\x98\x9b\x27\xde\x7b\xdc\x5b\x02\x3a\x3d\x40\x73\x4f\x07\xe3\x5b" + "\x0a\x40\xf3\xeb\x7a\x10\x1e\x94\xf4\x3f\xf7\x74\xb7\x98\xf7\x9c" + "\x38\x9b\xb9\xee\xa4\x68\xce\x5b\x4c\x4f\xf8\x29\xf9\xca\x4d\x42" + "\x63\xbe\x68\xea\x38\x40\x57\xb6\x75\x11\xf3\xc4\x9c\x45\x9a\x98" + "\x7b\xfa\xac\x78\xe2\x39\xcc\x5b\x1d\xd3\x51\x47\xe0\xc5\xbf\x83" + "\xf1\x1d\x68\xce\x3b\x8c\x3a\x80\x6f\x1c\x53\x11\xf6\x3a\xd2\x36" + "\x58\x1e\x3f\x9d\x42\x4d\x1d\x3b\x28\x98\xd4\xd6\x1a\x2a\x6f\xeb" + "\xd2\x92\x4e\x24\x88\x24\xe0\xbe\xfc\x44\x5e\x28\xe9\x44\x75\xb0" + "\xfc\x84\x43\x54\x9c\xe8\x42\x3f\x0d\xe3\x3e\xef\x75\x91\x0d\xdf" + "\x9d\xbd\x92\x8e\x4e\xa0\x9f\x3e\xb4\x42\x7f\x16\x8c\x4b\x51\x7e" + "\x22\xa0\x78\xe0\x43\x6b\x5f\xd2\x87\x09\xa2\x02\x4f\x49\x87\x1f" + "\xda\x99\x2e\x43\x90\x77\x08\xbb\x29\x84\xbc\x88\x9f\x86\x5f\x06" + "\x7e\x39\x08\xdb\x0f\xf8\x23\x18\xbe\x56\xf6\xe1\x21\xc0\x3c\x3a" + "\x89\x28\xa1\xc5\xdf\x41\xbc\x76\x21\xe7\xfa\x8e\x13\xa8\x33\xd3" + "\x54\x10\xcf\x20\x78\xe3\xc3\xfd\xda\x9d\x55\x92\x07\x51\xde\xd1" + "\xcc\xd0\x5d\xe2\x89\xf3\xcc\x4f\x08\x2f\x07\x8c\xe4\x0f\xbb\x02" + "\x92\x5e\x3f\xfc\x94\xeb\xd0\xb7\xc1\xce\x70\xcc\x88\x0f\x88\x8a" + "\x93\xcb\xfd\xc2\x4e\x5a\xd9\xc9\x3c\x2d\xf1\xe4\x51\x51\x76\x12" + "\xfc\x70\xb2\x34\x54\x76\xb2\xfa\xc1\x21\xc2\xc7\xf2\xab\xef\x87" + "\x84\x72\x0e\x52\xf0\x4e\x21\x5a\x0a\xb6\xe0\xfd\x1d\x92\x3c\xec" + "\x38\x2e\xe9\xaa\xd9\x7b\x1c\xb8\x7c\x03\xe1\x8d\x52\x8e\x31\xee" + "\x45\xd2\xc9\xd2\x27\xce\x8f\x2e\x61\x5a\x78\xa2\x80\x4a\x44\xf9" + "\x49\x87\x56\x7e\x32\x2f\x54\x7e\xb2\x5a\x4b\x42\x39\xc9\xed\xc3" + "\x03\x92\xaf\xdb\x41\xd7\x07\x91\xe7\x1d\x49\x4f\xa2\xbc\x3d\x61" + "\x30\x59\xca\x32\x8d\x65\x58\x66\x30\xc0\xf4\xf5\x29\xcb\x3f\x96" + "\x65\x90\x05\xb9\x86\x2c\x63\x39\xc6\x73\x2c\x96\x65\x9a\x2e\xcb" + "\x34\x5d\x96\x69\x61\xb2\x0c\xf8\x37\x83\xde\x03\x52\x7e\x01\x9f" + "\x2c\xbb\x32\x43\x69\x22\x5a\x76\x71\x9e\x10\xe4\x92\x06\xb9\x84" + "\x5f\xab\xa6\xe4\x92\x55\x97\x4b\x26\x43\x2e\x01\x1e\xcb\x6d\x2d" + "\x96\x5c\xd2\x74\xb9\x14\xd2\xe5\x92\xa6\xcb\x25\xed\x52\x72\x29" + "\xb1\x0d\xed\x6d\x2b\xe5\xf5\x54\xf0\x4d\x09\xf7\x73\xe6\x3a\xad" + "\x04\x32\x03\x78\x6c\x2b\xd5\x94\x3c\xda\x8f\xf9\x95\x89\xe5\x51" + "\x08\xf9\x35\x43\x1e\xf5\x48\xb9\x71\x94\x65\x12\xf7\x5d\x6e\xd0" + "\x46\x2c\x8b\xa4\xdc\x09\x5e\x1f\x64\xb9\x03\xfc\xdd\x15\x2d\x77" + "\x00\xaf\x15\xef\x29\xaa\xfc\x13\x09\x98\x5d\x07\x2d\x41\xa7\xc8" + "\x74\xf8\x25\x8e\x72\x1d\x85\x25\x4c\x73\xa1\xb2\x13\x56\xd1\x52" + "\x42\x5a\x22\x78\x04\xf2\xc9\xed\x08\x11\x78\x37\x2f\x08\x79\x01" + "\x3e\x70\x84\xc0\xcb\x73\xbd\xdd\xee\x79\x05\x34\xf4\x09\xbf\x3d" + "\x65\xee\x69\xe1\x03\x6e\x3c\x4f\x14\x94\xd0\x3c\xbf\x1d\xf2\xe1" + "\x1d\x9a\xd3\x21\xb4\x39\x0b\x3d\x36\xf0\x89\x63\xee\xb2\x06\xcb" + "\x13\xcf\xa5\xd0\xbc\xf3\xa2\x01\xf2\xe3\xff\x9d\x7b\x3a\xc5\xb2" + "\xa0\x83\xbe\x31\x67\x91\xd0\x42\xe0\x45\xb4\xb5\x0b\x6d\x0e\x80" + "\x17\x13\x42\xe5\x27\xac\xe0\xc3\xbc\x20\xf8\x31\x9c\x17\x45\xf2" + "\x89\x4e\xbc\xdb\x64\x3b\xca\x3e\xb4\xa2\xfe\x01\x4d\x8e\x77\x1d" + "\x72\x4e\x0b\x5a\xb7\x4a\xfe\x49\x42\x78\xb9\xe2\x47\x4d\x28\x7e" + "\xd4\x18\x77\x26\xc5\x8f\xdc\x27\x88\x9f\x86\x5f\x06\x7e\x11\xfc" + "\xc8\x7c\x26\x98\xcf\x0a\xce\x0f\xf0\xd9\x73\x3a\x9f\x25\x29\x3e" + "\x0b\x41\x57\x09\x6d\x50\xbc\xc6\xf0\x79\xde\xdb\xcf\x6b\xc9\x27" + "\xf3\xf0\x1e\xa7\xe8\x46\xf2\x1b\xf3\x1a\x64\xec\xc9\x52\xf0\x1f" + "\xe0\x09\x1f\xf3\x01\xe8\xf2\x43\x1e\x0f\xe7\x15\x88\x0f\x73\x43" + "\xa3\xd1\xe7\x27\xab\x21\xef\x4e\xce\xf5\x8a\x0f\x21\xeb\xea\xc0" + "\x4b\x79\xe0\x21\x07\x78\xa9\x14\x3c\xc5\xbc\x94\x10\xda\xc0\x30" + "\xdb\x13\xfa\x61\xc8\xf1\x34\x92\x97\x06\x5b\x77\xed\x71\xd9\xbc" + "\x1e\x7a\xa7\x89\x75\x1a\xbc\x07\x3c\xf4\x6e\x9d\x7a\xbf\xde\xec" + "\xa1\xba\x36\xa9\xeb\x80\xff\x0a\x8a\xe9\xea\x53\x74\xfd\x21\xd0" + "\x3a\xe1\x3d\x11\xef\x87\x33\xc7\xbf\x27\xb4\xaa\xf9\x5d\x28\xb7" + "\x87\x79\x50\xb8\xa6\xb2\x0e\x97\x0e\x1a\x4c\x10\x3d\xf6\x44\x91" + "\xec\xbd\x53\xf4\x59\x79\x6d\xcf\x82\xef\x64\xb4\x7f\x2c\x9e\x23" + "\xf7\x5c\xa0\x54\xfc\xac\x7b\x5c\x5a\x09\xeb\x57\x78\x4f\x13\x6b" + "\xad\xc3\x2b\xd6\xd0\x04\x8b\x9f\x12\x6a\x5d\x5a\x8e\x65\x53\x0a" + "\xaf\x71\xa5\xf2\xbb\x70\xbd\x4e\xb5\x17\xc8\xcc\xeb\x10\xda\x08" + "\x94\xe7\xb0\x08\xb1\xda\x4e\xb5\xab\x20\x1b\x5c\x64\xad\x75\x89" + "\xfa\x50\x0f\xe3\xe0\x03\x87\x51\x17\xae\x1b\xea\x79\x2d\xea\xd9" + "\xf4\xbd\x75\xe9\xf4\x67\x07\xc5\x5c\x1b\x46\x3b\xfb\xdb\x1f\x3b" + "\xfe\x86\x44\x03\x27\x83\xc4\x4f\x30\xf0\x34\xc8\x3a\xa2\x99\xc7" + "\xf1\xd0\x1a\xe1\xab\x5c\x4e\x8c\x0b\xab\x33\x28\x3e\x06\x1e\x4b" + "\x8a\x43\x74\x6d\xe6\xba\xeb\x84\xdb\x2b\x1a\xdc\x8e\xd3\x54\x8b" + "\xf8\xe2\x22\x8c\x9d\x49\x5e\xf0\x86\x77\x4c\xf7\x1a\x11\xe4\xb5" + "\x23\x94\x51\xe5\xa1\xe9\x69\xaa\x2f\xda\x02\x72\xce\x9a\xe8\x1d" + "\x03\x58\x23\x18\x56\x33\xf2\x87\xca\xbd\x63\x91\xee\x90\x87\xfe" + "\x76\x50\xa6\x4b\x6c\x0b\x14\xac\xa7\xaf\x9f\xa2\x1b\x7c\x72\x6e" + "\x51\xe6\x9d\xca\xb2\x00\x61\x29\x08\x0b\x02\xfe\x34\xa4\xef\xf2" + "\xd0\xef\xf5\x35\x89\x1b\x82\x46\x3a\xbc\x4b\x3d\x3e\x82\x7e\xe2" + "\xe4\xe2\x3d\xfa\xcb\x36\xb0\x39\x16\xa7\x2f\xe7\x1b\x7f\x29\xf8" + "\xa5\xc7\x8e\x1e\x90\xe5\x27\x1c\xdd\x90\xd1\xce\x8d\x34\x06\xfd" + "\x83\xfa\x7d\xf3\x39\xcc\x53\x3a\x85\xeb\x9b\x09\x3f\x59\x1f\xc0" + "\x5c\xe2\x9b\x45\x1e\x2a\x9b\x3e\x18\x3e\x91\xdf\xaa\x5d\x10\x5d" + "\x95\x6b\xfa\x71\xf9\x11\x64\xa3\xe0\x77\x96\x45\xb5\x08\x67\xbc" + "\x01\x4e\xa3\x81\xb3\xc1\xfb\xc5\x9b\xa6\xe6\xb8\x63\xc7\x0a\x97" + "\xa0\x86\x6f\xf0\x9e\xd6\xd8\x71\x0a\x0f\x1f\x26\x74\x43\x8e\xf0" + "\xba\x34\xe6\x7e\xfe\xd5\x56\x11\xe8\x71\x8d\x85\xfe\x3f\xa1\x4e" + "\x5f\xf7\xf2\xbb\x83\xb3\x59\xb6\xc4\x1c\xb3\x78\x0f\x6e\x00\xfe" + "\xb8\x59\x2d\x63\x88\xa4\x6c\x4a\xb1\x67\x17\xab\x7a\x07\x18\x6e" + "\x43\xf1\x39\xea\x40\xfc\x6a\xbf\xe8\x12\x55\xf6\x0c\x9e\x6b\x34" + "\xac\xe9\xe5\xb0\xd9\xa0\x6d\xd1\xb0\x8a\xeb\x34\x6e\x76\xc3\x37" + "\x7a\xa9\xd3\x41\xf1\xb5\xfd\xeb\x4d\xe3\xd2\x78\x7d\x49\xad\xab" + "\x8d\xad\xf7\xd0\xa4\x3c\xa3\x5e\xac\x87\x00\xbf\x8c\xab\x00\xeb" + "\x23\xbc\xd7\xb1\xba\x48\x04\x58\x2f\x41\xda\x36\xa3\x0d\xdc\x3e" + "\xbd\x5d\xbe\xf0\x76\xf1\x9e\x98\xa5\x48\xe1\x60\xf5\x3a\x4a\xb0" + "\x29\x5c\x27\x70\x7b\xb9\x2d\xdc\x66\xd9\x16\x29\x63\x79\x3e\x71" + "\x1b\xe6\x6c\x32\xdc\xda\xe3\x1a\x37\xdd\x43\x13\xcd\x8a\xa6\xc6" + "\xd6\x47\xd3\x51\x7f\x3f\x26\xb6\x1d\xc5\x1c\xf7\x1b\x4e\x4d\xb4" + "\x03\xe6\x5f\xd4\x5a\xdd\xb8\xbf\x68\xac\x8b\x07\x98\x7e\xcf\x4d" + "\xe5\xb1\xd8\x5d\xc4\xf2\x56\xa6\xbd\x0a\x69\x3b\x90\xe6\x6d\x3d" + "\xed\xdb\x6a\x8f\x50\x3e\x87\xf2\x13\x63\xd8\x9f\x51\x8f\x63\xbc" + "\x76\x0c\x3c\xa7\x18\xdf\x02\xdf\x78\x96\x8a\xf2\x73\x53\x63\xd7" + "\xe5\xe4\x51\x1e\xcb\x42\x17\x84\x17\xe5\x5c\xc3\x34\xe5\x5c\x47" + "\x5f\x03\x5d\x7e\x54\xbc\x91\xae\x62\x7a\x12\x49\xde\xe9\x0a\xef" + "\x37\x8e\x11\x2e\xe8\xbd\x90\xa8\x05\x6b\xe8\xeb\xe0\xa3\xa9\xa7" + "\xe8\xc6\x29\xb9\x45\x36\xd4\x95\xa8\xf2\x0c\x91\x94\x41\x49\xde" + "\x69\x3c\xc7\xa9\x3d\xc3\x6b\x49\x37\x66\x19\xb4\x88\xf7\x05\x97" + "\x92\x17\xc0\x6b\x86\x5a\xdb\xb8\xf1\x2f\xbc\xaf\xd1\x4e\x37\x1e" + "\xe4\xf6\xaa\x3d\xd5\x1b\x5f\x17\x17\xc4\x02\xa1\xc6\xb4\x69\x1e" + "\xba\xd1\x83\x67\x86\xfc\xb9\x68\xa1\xfe\x3d\x0d\xe9\x76\x88\x0b" + "\x1a\xa7\xc9\x40\xd8\x01\xe1\x8a\x63\x9e\x38\x8c\xb2\x5b\x3d\x74" + "\x57\x86\xea\x9b\x1b\xf7\x31\xac\x41\xea\x30\x0d\x7d\x4b\x4c\x9b" + "\x9d\x74\xd3\xdd\xb6\x62\x5e\x2b\xbd\xe9\x6a\xc9\x17\x80\x55\x6b" + "\x52\x72\x1b\x3a\x6a\xc6\x5e\x97\x96\x07\x19\x9d\xa7\x55\xf8\xeb" + "\xe5\xbb\x1e\x27\xf4\x71\x34\x26\xfc\x2a\x7b\x76\xc3\x68\xa6\xf1" + "\x9b\x6a\x24\x1c\xd0\x7d\xc3\xe8\x53\xfc\xbd\x87\xbf\xfd\x89\xe7" + "\xeb\xdd\xd5\xe9\x28\xff\x14\x97\x5b\xa3\xe6\xfc\x37\xed\xe9\x46" + "\x19\x3d\xae\x9b\x6a\x3c\x34\xb9\x50\xed\xf1\x9c\xaf\x1f\x6c\xef" + "\x9a\x79\x87\x79\x4e\xf1\xf4\xf8\xc7\x9b\xeb\x24\xff\xd9\xbb\x13" + "\x3f\xcc\xd0\xe5\x06\xaf\x03\x25\xb6\xd3\xf8\x05\xcd\x56\x49\xdf" + "\x26\x61\xba\x29\xf8\x2b\xcd\x67\xe2\x7d\x38\x25\xbe\xc6\x2f\xb8" + "\xf8\x67\x4f\xc3\x0f\x52\xce\x3e\x47\xff\xce\xc1\x2f\x1f\xbf\xc3" + "\xf8\x9e\x23\x71\xb7\x7b\x71\x9c\x07\x71\xdd\xd0\xeb\xf9\xdb\x43" + "\x76\x84\x8d\x35\x41\x9f\x97\xef\xb5\x5f\xe3\xb5\x04\xfb\x62\xf4" + "\x81\x57\xf5\xc5\x78\xb9\x9e\x82\xba\x31\xde\x85\xb3\x5a\x04\x1a" + "\x8b\xfd\xa8\xb7\x7d\x47\x63\xb5\x9f\x6c\x37\x72\xfb\xed\xd5\xdc" + "\x26\x3f\xf0\xcf\xcf\xd5\xd5\xc2\x77\xa4\x26\x48\xbc\x1f\x08\x58" + "\xe0\xff\x65\x8d\x52\xee\x6f\xb3\x17\x30\x3c\x9d\x26\x84\xd1\x7e" + "\x25\xd3\xce\xd7\x73\x5f\x02\xd6\x27\x68\xbb\xe5\x0c\x8d\x1f\x27" + "\x92\xfd\xf5\x47\xf2\x88\xf6\x40\x8e\x60\xac\x91\x7b\x13\xb5\xd2" + "\x1e\x61\x3c\xc6\xff\x9b\xe6\x18\xfb\x57\xe5\x88\xaf\x40\x1c\xc6" + "\x1e\x5f\x73\x5e\x80\x18\x56\x88\xdb\x87\xfc\xef\x68\x3e\x33\xc6" + "\x6a\xf4\xf9\xf9\xfa\xe2\x02\xc8\x99\x7e\xb9\x65\x6f\xda\x78\x5a" + "\x04\x8c\xf6\x1d\xa9\x63\x5e\x18\x0f\xfa\x7f\xc6\x33\x28\xfd\xf7" + "\xd7\xf9\xe6\x75\x47\xc6\xaa\x3e\xd3\x80\x97\xc8\x3e\xbb\xd9\xa1" + "\xfa\x6b\xfc\x81\xc8\xfe\xba\x19\xa3\xfc\x78\x3f\x9e\x89\xf8\x8d" + "\x51\xdf\xe1\xbf\xf1\x9e\xb0\xef\x09\xf8\x2d\x46\x7d\x30\xfe\xdf" + "\x98\xa7\xfa\x81\xc3\xd1\x0e\xa6\x91\xcf\x29\x41\xeb\xcb\x21\xde" + "\x1f\xe6\x70\xa6\x67\x0e\xd7\xa0\xcf\xe0\x9b\x10\x9f\xc2\xbc\x5a" + "\xa9\x51\x44\xbc\x7b\x0b\x68\x6e\x7d\x2f\xd7\xff\x21\x86\x65\xd9" + "\x54\x5a\xca\x74\x8a\x34\xc0\x51\x69\x69\x8f\xeb\xe6\x05\x06\x5e" + "\x11\x36\x8b\xe3\x99\x26\x11\x5e\xe8\xa1\x7c\x9b\xdc\xff\xc5\x9c" + "\x30\xb6\xae\x71\x73\x75\xbf\x4e\x96\xf8\xe1\x7e\x96\x47\x5e\xfa" + "\xd6\x3e\xc8\x2c\xf4\xad\x7f\xbf\x1a\x6b\xbe\xf5\x3a\x7f\x43\x56" + "\x7e\x84\xf7\xba\x66\xc8\xa4\xde\x8a\xcf\xea\xfa\x4c\x34\xb4\xd7" + "\x44\xe9\xc1\x6d\xd9\x89\xc1\xe4\x8f\x0f\xb8\xbb\x0e\x52\x4b\xf0" + "\xd7\x64\x5b\x2e\x61\xbc\xea\x06\x0d\x38\xd7\x89\xd0\x9b\xbd\xfb" + "\xcd\xee\xe0\xd9\x06\x8c\xcd\xd7\x9d\xa2\x6f\x49\x7c\xbc\xd4\x8e" + "\x51\xff\x09\x09\x5b\xe1\x27\x65\x7e\x57\xc5\x52\x11\xac\xe8\x14" + "\x7e\xe8\x77\xc3\xcb\x7b\x69\xc2\xae\xf5\x94\x56\xd3\x4b\x63\xf7" + "\xf6\x92\x5d\x7c\x6a\x37\xd5\x40\x6f\x7b\xe2\x7c\x0a\x41\x26\xe4" + "\x24\x17\x50\xc2\xde\xf5\x24\x69\x24\xb4\x15\xfa\x5b\x10\xfa\xdb" + "\x59\x3b\xcb\xc6\x7e\xfd\xad\x4f\xea\xc5\xde\x7d\x8a\x8e\xbc\xfb" + "\x92\xf2\x28\x2e\x71\x21\xa5\xa0\x7e\xce\x33\x74\xf3\x7f\x24\x76" + "\x40\x77\x44\x9b\x3d\x7a\x7b\x81\x3b\xaf\x25\x8f\x86\xca\xb6\x42" + "\x5e\x8b\x72\xff\xfe\x41\xc7\x61\x13\xd3\x94\x9f\xf9\x86\xdb\xf0" + "\x39\xef\x51\x1f\x1c\x1d\x30\xaf\xae\x11\x01\x0e\x2f\xbc\x5e\x04" + "\x10\xde\xca\x65\xd7\x23\xbc\xc7\x35\x81\x3c\xf1\xff\x37\x7f\x30" + "\x1a\xc5\xdc\x48\x97\x2b\x13\x36\x09\x53\x09\xd3\x68\xd7\xc6\x20" + "\x74\xef\x33\xcc\xb3\x13\x4a\x32\xf3\x45\xd0\xb6\x82\xed\x05\x26" + "\x14\xb0\x2d\x03\xef\x61\xfe\x0a\xba\xcd\x97\xd9\x2f\xf0\x78\xc1" + "\x73\x05\x4b\x3e\x60\x56\x7c\xd8\x25\x9c\x76\xfa\xaa\xf6\x13\x68" + "\x67\xe2\xf6\x51\x6c\xd7\x33\xe1\xb0\x87\xe6\xa6\x72\xdd\xa5\xed" + "\x0e\x64\x27\xf4\xad\xab\x50\xaf\x80\x1f\x78\x40\x3c\xc6\xff\xfb" + "\xbb\xf4\xfd\x66\x1f\xef\xf5\x22\x0c\xe3\xff\x83\x13\x38\xac\xf0" + "\x7a\xb2\x16\xda\x44\xd7\x60\x3a\x13\xef\x81\x03\xde\x35\x3d\xae" + "\x89\x63\x0d\x38\x18\xa7\x7e\xd1\x6d\xfa\xde\xf7\x10\x36\xcd\x80" + "\x83\x34\x57\xe3\x3b\xa3\x3f\x8d\xca\x93\x13\x96\xe7\x7b\xdd\xa6" + "\x9b\x7f\x81\xb0\xfc\xa8\x3c\x45\x51\x79\xca\xc2\xf2\x94\xe8\xe5" + "\xd4\x45\xe5\xa9\x8f\xca\xd3\x10\xa3\x6e\xc7\xa3\xf2\x74\x44\xe5" + "\xf1\x5f\x5c\xb7\x49\x09\x91\x79\x26\x59\x23\xf3\x4c\xb2\x87\xe1" + "\x92\xed\x78\xd2\x10\x36\x3d\x2a\xcf\x9c\xa8\x3c\x0b\x8c\xef\x41" + "\x70\x9c\xb8\x7a\x0f\x59\x41\x9b\x6c\x2b\xe6\xdb\x8e\xfe\xe9\x7e" + "\xe5\x99\x1e\x3d\x6f\xf5\xc5\xed\x9a\x74\x20\xaa\xbc\xc3\x51\xe5" + "\x35\xc5\x68\x97\x27\x2a\x8f\x2f\x32\xcf\x64\x0a\xcb\x53\xa7\xca" + "\x99\x9c\x1a\x99\x67\xf2\xd8\xa8\x3c\x53\x2f\xa6\xab\xc9\x19\x51" + "\x79\x72\xa2\xf2\xe4\x7d\x09\x2e\x78\x1c\x57\x76\x74\xa3\x58\x57" + "\xbe\x07\x3a\xc2\xe4\xbf\xb3\x2d\x06\xef\xbb\xfe\xa4\x37\x30\x84" + "\xf7\x03\x79\xbc\x3a\xe2\x08\x60\x6c\x99\x8c\xf9\xcf\x6d\x69\xc6" + "\x98\xc5\x76\x2a\xcc\xd3\x4a\xc7\x9e\x5c\x3d\x98\x2e\x2a\x6d\xdd" + "\x74\x7b\x39\x2e\xeb\xc8\x18\x1e\xa7\xd2\xcc\xfd\x3a\xb1\xb2\x79" + "\x23\x05\x27\xed\x11\x63\xdf\xb7\x56\xd9\xbf\xc4\xb1\x4e\x7e\xc4" + "\x21\xf3\x4c\x0b\xd3\xa3\xb9\x7c\xff\xc1\xf5\x01\x73\x64\x3d\xd2" + "\xac\x97\xa8\x47\x22\x74\xa3\x69\x2d\xd0\x8a\x78\x3f\xbf\xb9\x06" + "\x3a\x10\xf4\x7e\xae\x5b\x3b\xa5\xd5\x49\x9d\x6c\x45\x2f\xf1\xbb" + "\xbb\xe8\x0e\xb9\xdf\xaf\x74\xd2\xb4\xd6\x46\x94\xcf\xba\x7b\x63" + "\xc1\x39\xb6\xc9\xc2\xf8\xcb\xba\xdb\x94\x21\x47\x8a\x7c\x5c\xaf" + "\x63\x86\x5d\x8c\x87\xa6\x98\xa5\xae\x51\x65\x4f\x63\x5b\x04\xb6" + "\xd9\x39\xe2\x9f\xc6\x69\x40\xff\x93\xdb\x8c\xf6\x62\xac\x07\x4d" + "\xa4\x1d\xb8\x14\xce\x54\x1f\x4e\x99\x10\x49\x93\x43\x40\x2b\x53" + "\xd2\x23\xfb\x7d\x4a\x56\x64\xbf\x4f\x59\x18\x49\x93\x26\xd0\xe4" + "\x94\xc2\xa8\x3c\x5b\xa2\xf2\xec\x08\xcb\x53\xa5\x97\xb3\x3f\x2a" + "\xcf\xa1\xa8\x3c\x47\xc3\xbe\xd1\xc6\x29\xad\xfd\x73\x1f\x69\x73" + "\x35\xa5\x2b\xec\xdb\xb4\x43\xca\xcf\x29\x41\x23\x8c\xd7\x8e\xf6" + "\xee\x54\x36\x3f\x0a\xde\x2d\xd6\x28\x7e\x47\xfa\x5b\x26\x44\xd6" + "\xe1\x96\xe9\x91\x75\xb8\xa5\x9f\xff\x75\x5b\x81\x3f\x75\xd2\xad" + "\x63\x75\x5b\x01\x2f\xc6\xec\x4c\xfe\x06\xac\x6a\xa4\x07\x1e\x6e" + "\x29\x8a\x82\x57\x16\x05\xaf\x26\xec\x3b\x05\xdf\x07\xc2\xda\x90" + "\x12\x6f\xa5\x38\xd0\x0b\xf4\xb7\x5b\x1a\x8d\x70\x9e\x53\xa2\xbe" + "\x5d\x4e\x39\xd6\xa4\xb3\x2d\xdb\xc8\x76\xba\xe5\x2d\x9e\x7f\xea" + "\x30\xc3\xf9\x9f\x54\xbb\x6e\x35\x47\xd6\xe3\xd6\xd4\xc8\x7a\xdc" + "\x3a\x36\xac\x5d\x7e\xcb\x26\x7a\xc8\x12\x7c\xf8\x11\xd6\x7d\xd8" + "\x7e\x53\xda\x94\x6d\x84\xce\x76\x9e\xd7\xdf\x03\xd4\x59\x48\xf1" + "\x6e\x47\x17\xe6\x72\xde\xba\x41\xe9\x69\xa4\x3d\x5d\xd9\x72\x91" + "\x0d\xf0\xb7\x18\xf4\xa8\x6d\xb3\xa7\x6b\xe5\xdd\x45\x08\x83\xfc" + "\x9b\x92\xa2\xf6\xdf\xce\x1d\x15\xce\x9c\x6a\xe0\x13\xf3\xa2\xa9" + "\x2f\xe8\xf3\x88\x6c\xb6\x49\x63\xbb\x59\x8c\xf1\x89\x6a\xdf\xff" + "\xd6\xa6\x30\xba\xf6\xdb\xd6\xdf\x25\xda\x69\xea\x56\xd6\x01\x98" + "\x47\xd9\xb6\xed\x48\xd0\x47\x3c\xf7\x76\x07\x4f\x49\xdd\x0d\xf1" + "\x55\x2a\xef\xd4\x84\xb0\xbc\x3e\x7d\x6e\xdc\xc5\x71\x93\x83\x64" + "\x3e\xe2\xf7\x11\xe0\xa4\x2a\x7d\x6f\xea\xd6\x23\xe0\x57\xe4\x99" + "\x6e\xe4\xe1\x79\xb4\xdc\x43\x2e\x24\xf3\xa4\x22\x32\x37\xac\x6f" + "\x97\xb0\x0d\x3b\x11\xe8\xd2\x5e\x77\x51\x17\xb9\xfd\xad\xbc\xd6" + "\x65\x56\x36\x41\x53\xab\xe2\x03\x94\xd0\xbd\xd5\x9e\xe6\xc1\x7b" + "\x68\x2b\xe6\x0e\x55\x76\xf0\xcf\xad\x07\x59\xde\x84\xe3\x6e\xf6" + "\xec\xac\x87\x33\xe7\x4e\xfc\xc1\xc3\xf7\x67\xcf\xbe\xc3\x96\xbd" + "\xec\xd9\x25\x8b\x27\xae\x7c\xbe\xd0\xb6\x76\xd5\xb2\xc2\x65\x2b" + "\x9e\xb6\xa5\x39\xc6\x39\x6c\x8b\x0a\xd5\xd3\x9e\xbf\x68\x75\xe1" + "\x0c\x7e\x9d\x60\x2b\x58\xb5\x64\x8d\x7c\x1d\x3f\x9c\x22\x81\x2c" + "\x2b\x5c\xb2\xca\x36\x6e\xf1\x04\xdb\xbd\x8b\x96\xe5\x3f\xbf\x6a" + "\x49\x4c\x58\x77\xd8\x56\x2d\x59\xb5\x64\xd1\x62\xdb\x0c\x5b\x1a" + "\x43\x0e\x07\x17\xd6\x9f\x69\xc6\x38\xc6\xe3\x57\xa5\x4b\x1c\xd3" + "\xc7\x33\x8f\xa2\x9f\xdb\x16\x5f\x3c\x96\xdd\xe6\x88\xa4\xb9\xdb" + "\x4a\x23\x69\xee\xb6\xea\x8b\xc7\xb2\xdb\xa2\xc6\xbf\xdb\xa2\xc6" + "\xbf\xdb\x9a\x2e\x1e\xcb\x6e\x8b\x1a\xff\x6e\x8b\x1a\xff\xbe\xdd" + "\x3f\xfe\x81\x96\x3c\x9b\xa5\x5c\xf8\x76\xd4\xf8\xf7\xed\xa8\xf1" + "\xef\xdb\x53\xa3\xbe\x67\x85\x7d\x5f\x85\xef\xec\xf0\xf1\x11\xdf" + "\x8b\x0d\xfe\x1c\x90\x2f\xdf\x76\x18\x69\x58\xd6\x43\x36\x77\xe8" + "\x69\xab\xc2\xd2\x76\xe9\x69\xf7\xf5\xf3\x1f\xef\x7d\x23\x5c\xcd" + "\xd7\x6f\x1f\xc6\x32\x9d\xed\xff\x78\x6c\x02\x7f\x5c\x77\x86\xbe" + "\xbd\x89\x61\x31\x0d\xb3\x3d\xa8\x78\xe5\xb1\x9e\xda\x91\x94\xc0" + "\x79\x6a\xb7\xb1\x1d\xf1\xd4\x1a\xb6\x0d\x46\x18\xdb\x4a\x43\xa6" + "\xdc\x0e\xfd\xb7\x75\xba\x1a\x2f\x6e\xcf\x92\x3a\x3f\xf2\xe8\xf0" + "\xe5\xbc\x06\x70\xd8\xf6\x38\xa1\x52\x8d\xc5\x1d\x78\x4f\x64\x9a" + "\x46\x7e\xb3\x30\x4d\xfd\x88\x6d\xae\x11\x96\x82\x5f\x2a\xe0\x65" + "\x19\xf0\xb6\x8c\x8a\xad\x5b\x46\xeb\xb9\xfd\xf3\x41\x13\x59\x2a" + "\x5d\x5a\xab\x5b\x63\xdd\xfa\xf6\x2d\x6a\x6d\xe1\xb3\x06\xe1\x7a" + "\x2f\xa7\x16\xe1\xb1\xe7\x49\xb7\x43\xff\xbb\xdd\xa1\xd6\x5b\x6e" + "\x47\xff\xcf\xdd\xa7\xd6\x4e\x3f\x6b\x80\xbc\xed\xed\xa4\x69\x4b" + "\xf0\xec\xc3\xf3\x7e\x03\x7e\x83\x9c\x6f\xdf\xde\x21\x5c\x71\xf3" + "\x19\x6e\x54\x78\x10\xf2\xad\xd7\x12\x2c\xc9\xb9\x38\x6e\x9a\x55" + "\xb8\xe2\x1f\x8e\x11\xce\xb6\xb9\xbd\x1e\x9a\xb6\x98\xeb\x1b\x16" + "\x8e\x79\x79\x72\x36\xa7\xf7\x70\x79\xc8\x33\x98\xae\x6d\xd8\xfb" + "\xaa\x33\x03\xd3\x76\x44\xb5\xe3\x8b\x4e\xfa\xce\x08\xd5\x8e\xef" + "\x3c\x1b\x55\xf6\x81\xd8\xed\x98\xd6\x88\x76\x7c\x31\x48\x3b\x3c" + "\x12\xb7\x26\xb4\xc5\x74\x51\x5c\x10\x6d\xf9\x42\xe2\x3d\x22\xfc" + "\x3b\xa9\xba\x2e\xe4\xc7\x3c\x2c\x05\x71\x32\xef\xfc\xa2\x81\x7e" + "\xd3\xd3\x4d\xb7\x54\x53\xd6\xc5\x65\x7e\x27\x5b\xb8\x86\xce\xf7" + "\xd0\x77\xca\x24\x9c\x81\xf0\x7c\x55\x17\xe0\xc9\xc4\x78\x42\x7b" + "\x90\x6f\xb0\xfe\x36\xe6\x25\x6a\x2d\xe4\x3b\xe0\xff\x69\x05\xc6" + "\x5a\xe6\xea\x22\xe1\x33\xf0\x88\xb8\xd6\xa8\xb8\x40\x58\x9c\x3f" + "\x22\x6e\xa3\x11\x7e\x47\xa2\x11\xfe\xd5\xfa\xe9\x8e\xe9\x51\xfd" + "\x84\xfe\xb9\xa3\x39\xb2\xdd\x77\xcc\x51\xed\x43\x1f\x5d\x84\xeb" + "\x3b\xf2\xd0\x47\x7d\xb1\xfb\xe8\x8e\x2d\xb1\x69\xed\x0e\xb9\x8e" + "\x26\x46\x52\x2c\x78\x87\xd0\x77\x7d\x92\x06\xf5\x7e\xba\xb8\x7f" + "\xee\x68\x33\xfa\xe7\xab\xb5\xf1\xbb\xb6\xa8\x36\x86\x3a\xe9\xbb" + "\x7b\x54\x5b\xbf\x7b\x3a\x12\xf6\x77\xa7\xc5\xa6\xc5\xef\x66\xa1" + "\x9d\xa1\xd8\xed\xfc\x6e\xfe\xe0\xb4\xf8\x5d\xde\x17\x0d\x5d\x4c" + "\x8b\xdf\xad\x53\x79\x28\x56\x9e\xc3\xc2\x15\xb3\x9c\xe3\xce\x20" + "\xeb\xb9\xd3\x13\x79\x7d\x29\x2c\xdc\x1b\x49\x7f\xdf\x9d\x26\xf3" + "\x31\xfe\x82\x4a\xce\x72\x3f\x74\xda\xc8\xf4\x65\x34\xd9\xe3\x9a" + "\x3e\x27\x0a\x57\x67\x3b\x69\x7a\x73\xb7\x29\x6e\x9f\xc2\xd7\x8c" + "\xad\x91\x75\x9a\x9e\x17\x1b\x5f\xd3\x4b\x80\xaf\xb3\xb1\xf1\x35" + "\xbd\x66\x70\x7c\x4d\xe7\xfe\x3f\x7b\x31\xbe\xa6\x1f\x0b\xc7\x17" + "\x74\x5d\xd9\xbe\x6f\x5a\x41\x1b\x7d\xb9\xa2\x96\xdb\x1a\xa2\x14" + "\x0b\x68\x45\xe5\xf1\x22\xcf\x0c\xb3\x25\xa0\xe8\x04\x3a\x64\xc2" + "\x19\x9a\xee\x35\xf8\x3f\xb9\x9a\x86\x8a\xbe\xc7\xd8\xce\x28\x8e" + "\xf3\xb9\x1d\x67\x1b\xdc\xc1\x34\xe2\xf9\x47\x64\xb9\x33\x32\x62" + "\xcb\x82\x19\x0b\x81\xd3\x6d\x31\xc2\x1d\xca\xd6\x6c\x46\x7d\xa4" + "\x8c\x98\x51\x15\xd9\x47\xc0\x1b\xf2\xe9\xdb\x4e\x5f\xfa\xbb\x74" + "\x9f\xdd\x49\x17\xf7\xd9\x9d\xaf\xa9\xfe\xba\x73\x53\x64\xfd\xee" + "\xb4\xc6\xee\xaf\x3b\xd3\x06\xef\xaf\x3b\xe7\x0c\xde\x5f\x77\xf2" + "\x3e\xf1\x59\x0f\xdd\x59\x17\x39\x6e\xdc\x59\x12\xd9\xde\x3b\x79" + "\xff\xc5\x22\x4c\x57\x5c\xc5\xdf\x5f\xb5\xdd\xc6\x8f\x65\x1c\xf7" + "\x15\x9f\x63\x42\xfd\xaf\xe7\x3a\x5e\x2e\x8c\x41\x61\x03\x87\x55" + "\xeb\x63\xef\xb7\xf2\x1c\xb7\x05\x33\x71\xde\x47\xb6\x7d\x83\x75" + "\xf7\xbb\x9e\xd7\x4c\xd4\x8a\x77\x53\x27\xdd\x7d\xb7\x66\x32\x15" + "\xf1\x9e\xa7\xb4\x93\x97\x6b\x08\x77\x95\x85\xf7\x05\xef\x7d\xf2" + "\xdc\xb4\x42\xcd\x9d\x4e\x76\x52\xfa\xd5\xaa\x5f\xee\xbe\x3e\x12" + "\x8f\x77\xd5\xc7\xee\x97\xbb\x8e\xa2\x5f\x4e\xc6\xee\x97\xbb\x3a" + "\x06\xef\x97\x74\x5e\x3f\x3c\x79\x31\x1f\xa5\x5b\x75\x3e\xda\xcc" + "\x79\x6c\x2b\x78\x3e\x9e\xfe\x22\xa7\xc1\x3b\x78\x24\xfd\x39\x8e" + "\x9f\xe8\x35\xf8\x48\xe6\x99\x03\x58\xb2\x7c\x3d\x4d\x86\x0e\x23" + "\x1c\x6e\x81\xc5\x1b\x8b\x4f\xd2\x4b\x39\xed\xa4\x02\x4a\x00\x0e" + "\x73\xf6\x30\x8c\x55\x44\x80\x71\x82\xd3\x71\xf8\x24\x7f\x38\x9f" + "\xa4\x1f\x32\xd2\xb1\xac\xd3\xd3\xd6\x8b\x9e\x3c\xe2\x74\x51\xb0" + "\xf5\xf6\x0f\x95\xe3\x08\xa7\xe7\x74\x91\x69\xee\x4e\x50\xfc\x78" + "\xf7\x9c\x48\x7e\xbc\xdb\x16\x49\x9f\xc0\x3f\xf2\x69\x90\x73\x78" + "\x2f\x44\x1d\xbe\x32\x7d\x5d\x9a\x37\xef\xae\x89\xe2\x4d\xd0\xc0" + "\x3d\x33\x14\x0d\xdc\x73\x6d\x54\x5d\x0f\xc6\xa6\x81\xbb\x9b\x06" + "\xa7\x81\xbb\xbb\x06\xa7\x81\x7b\xcc\x4c\x03\x1e\xba\x67\x7a\x24" + "\x6f\xde\x33\x26\xb2\xed\x28\x57\xf2\x26\x8d\xb8\x1c\xde\x84\x2e" + "\x74\xd5\x60\x7c\xc8\x3c\xc5\xf6\x23\xb5\xbd\xc6\x5e\xc7\x57\xc2" + "\x59\x02\xf8\x8a\xeb\x77\x8c\xd7\x94\x20\xe3\xa7\x31\x0e\xf7\xca" + "\xf3\x9f\xf7\x74\x84\xe3\xb1\x42\x9d\xb9\x74\x76\xd2\xcc\x65\xbc" + "\xaf\xac\xf0\x39\x6b\x4a\x64\xfb\x67\x9a\x63\xe3\x73\xe6\x18\xe0" + "\xd3\x19\x1b\x9f\x33\xa7\x0d\x8e\xcf\x99\xd9\x7c\x26\xeb\x62\x9e" + "\x9a\x99\x6f\x5b\x23\x75\x14\x99\xe7\x0c\xcd\xfc\xf3\x57\x1b\x9f" + "\x66\xee\x8b\x1c\x9f\x66\x96\x5d\xfe\xf8\x34\xb3\x2b\xf6\xf8\x34" + "\x8b\x62\x8f\x4f\xb3\xac\x8a\x1f\x66\x65\x45\xf2\xc3\xac\xb4\x48" + "\x9a\x00\xee\xfe\xc7\xc6\xa7\x59\x75\x51\x3c\x50\xd9\x49\xb3\xaf" + "\x87\x4e\x51\xa2\xfa\x6d\xf6\x27\x51\x75\x3c\x1c\xbb\xdf\x66\x1d" + "\x47\xbf\x55\xc6\xee\xb7\x59\xbe\xc1\xfb\x6d\x76\x22\xfa\xad\xf2" + "\xe2\x7e\x9b\x3d\xf6\xf2\x75\x8a\xd9\x39\x91\x7d\x36\x3b\xfd\xf2" + "\xfb\x6c\x76\x4d\xec\x3e\x9b\x7d\x30\x76\x9f\xcd\x6e\x52\x7d\x76" + "\xaf\x39\xb2\xcf\x66\x77\x44\xf6\x19\xf0\xf6\xdf\xec\x33\xf4\x4f" + "\xa3\xb2\x4f\xb8\x77\x09\xe6\xed\x43\x7b\x5c\xf7\x2e\xf0\xd0\x7d" + "\x63\xd5\xdc\xfa\x3e\x35\x76\xa8\x3e\x7c\x13\x69\xb2\x2e\x1e\x07" + "\xee\x75\xe8\x61\x3f\xb8\xb8\x1f\xee\xdd\x01\x19\xed\x6d\x2c\x92" + "\x7b\x5b\xaa\x0f\x19\xe7\x48\xd7\xb0\x9e\xf7\xa7\xee\x3d\xc8\x79" + "\xd1\xc7\xc2\x1d\x08\x12\xcb\x75\xa4\xf7\x33\x1c\x3e\x8b\x1a\x05" + "\xcb\x73\x39\x63\xfc\xe0\x36\x35\x9f\x35\x36\x14\xdf\x02\x78\xf7" + "\x9d\x57\xb4\x7a\x5f\xb4\xfe\x5b\x8b\xb8\xbf\x28\x3a\xbd\xff\xe5" + "\xc8\x3a\xdc\xb7\x38\x36\x9d\xde\x57\x84\x36\xd4\xc6\xa6\xd3\xfb" + "\xaa\x07\xa7\xd3\xfb\xd0\xff\x54\x1b\x36\xf7\x19\xf9\x44\xd0\x13" + "\x35\xf7\xb9\xaf\xd5\xe2\x57\xb4\x23\x75\xa2\xf2\xcf\x1a\x7b\x5c" + "\x19\xd1\xfa\x1f\xfa\x26\x63\xa3\x5e\xe7\xe7\x23\xf3\x67\x0c\xa2" + "\xff\x65\xb0\xfe\xf7\x66\xec\x3a\x67\x5c\x42\xff\xcb\x60\xfd\xef" + "\xcd\x8b\x79\x2b\x43\xd7\xff\x62\xcd\xf1\x32\x6a\x62\xf7\x7f\x46" + "\x54\xff\x53\x4e\x21\xe6\xc3\x32\x7f\x64\xba\xb6\xf0\x74\x6c\x9b" + "\xc4\x69\x99\x46\x2e\x4e\x7b\x7f\x42\x34\xcc\x41\xd2\xa5\x5d\x44" + "\x7b\x6c\x4b\x15\x93\xf6\xee\xd7\xcf\x93\xdc\x7f\x30\x92\x1f\xef" + "\x2f\x8c\xe4\xc7\x0c\x6b\x54\xbe\x1d\x91\xf1\xa0\x9f\xff\x31\x19" + "\xfb\x80\x39\x8a\x06\xde\xeb\xa4\x07\x36\x29\x1a\x78\xe0\x3f\x22" + "\xeb\xf1\xc0\x98\xd8\x34\xf0\xc0\x54\xb4\xff\xbd\xd8\x34\xf0\x40" + "\xd6\xe0\x34\xf0\x40\x3e\x70\xf9\x5e\x38\xdd\xce\x2f\x4a\x1f\x1a" + "\x95\xa6\x2a\xb6\xcc\x7b\x60\x7f\xec\x35\x82\x07\x1a\x14\x8e\x1f" + "\x08\x44\xe2\xf8\x81\xd6\x48\x1c\xa2\x2d\xff\x7d\x1c\xf6\xfb\x9f" + "\xe8\x71\x3d\x18\xcd\xff\xee\x4e\x7a\x50\xe7\xff\x39\xef\x47\xd6" + "\xf1\xc1\xc5\xaa\x2e\xb1\xd6\x45\x1e\xe4\xf9\xaf\x3b\x36\x2e\x1f" + "\xac\x89\xdd\xe6\x07\x0f\x62\x0c\x72\x6b\x17\xf1\xd2\x83\x4d\x08" + "\x9f\xcf\xeb\xa1\xbc\x1e\xb2\x17\xe1\xf3\x83\x94\x20\xc7\xab\xfe" + "\x71\xe9\x41\x1f\xdb\xa2\x30\xfe\x99\x7e\x2d\x63\x28\x8b\xc7\x20" + "\xae\x57\x6e\x91\xb4\x5b\xb0\x6c\x61\x5a\xbf\x81\x69\x7d\x8e\xd4" + "\xff\x78\x9f\x85\xed\x08\x2d\x0e\xca\x62\x3f\x18\x06\xbd\x73\xfa" + "\x48\xd8\x73\xe6\x30\x5f\x70\x7a\x23\xad\x5a\x37\x2b\x89\x92\x4d" + "\x73\x0a\x63\xf7\xf1\x9c\xb2\xc1\x69\x67\xce\x7e\xd5\xcf\x73\xda" + "\x22\xfb\x79\x4e\x83\xe6\x4a\xce\xe6\xb6\x7a\x80\xe7\xcb\xe9\xe3" + "\x42\x9b\xf0\x0d\x2a\xef\x37\x3f\xd6\x5a\x50\x4c\xdf\x38\x45\x73" + "\x67\xc9\xf2\x4c\x22\x60\xd9\x14\x47\x8d\x52\x06\xcc\x7d\x55\xd6" + "\x13\x69\x72\x83\x64\x12\x9b\x9f\x69\xe5\xb8\x5a\x97\x08\x20\xdd" + "\x31\xde\x13\xe0\xb3\xdc\xa0\x85\xab\xda\x69\xee\xe3\x11\xf9\x31" + "\x32\xbb\x15\x8c\xea\x5a\xc9\x8f\x73\x77\x18\x6b\xba\x5b\xf0\x1d" + "\x7b\xdd\x77\xee\x21\xc3\xf6\x41\xd9\x8c\xcd\x1d\x74\xff\x92\xeb" + "\xc4\xe7\x69\xb8\x4e\x97\x96\x03\xf3\x12\x0d\xfa\x55\xb6\x96\xf3" + "\xc6\x0c\xd8\xf2\xcd\xb3\x23\xee\xd8\x25\xd6\x06\xc3\xf8\x60\x5e" + "\x76\x38\x1c\xe5\x83\x65\x5e\x9e\x61\x8f\x87\xf7\xc2\x2f\x81\x65" + "\xd4\xa7\x26\xaa\x3e\x07\xa0\xa7\x6c\xd1\x61\x1c\xba\x14\x0c\xee" + "\x73\x45\xb3\x4c\x0f\xf3\x8e\x5d\x6a\xcd\x2f\xde\x4a\x59\xdb\x2f" + "\xa2\xad\x4c\xa9\x2f\x31\x8c\x4b\xd7\x31\x33\x3d\x62\x6e\x21\xf7" + "\xee\x79\x6f\x2b\x2b\x49\xf1\x7d\x66\xd4\x1a\x61\xe6\x02\x69\x4f" + "\xa5\xf3\xfd\x13\xc1\x68\x3e\xc8\x2c\x32\xc6\xe8\xa8\xf0\x1d\x06" + "\xdf\x63\x5e\xcb\x70\xa3\xd6\x59\x33\x0f\x2a\x5e\xc8\x4a\xd4\x92" + "\xc2\xe7\x6b\x99\x52\xff\x33\xd6\x4b\x3d\x48\x17\x95\x2f\x6a\xfd" + "\x2f\x73\x81\x18\x7c\x9d\x3e\x11\xfd\xeb\xe7\xbd\x2d\xe5\x1b\x22" + "\x6b\x7a\xd4\x7a\x85\xaf\x42\x9e\xf7\xff\x17\xb7\x5f\x97\x7b\x0f" + "\xbd\x15\x59\x5e\xd6\x02\xe7\xe9\x4b\xb5\x3f\x6b\x90\xf6\x67\x0d" + "\xb4\x7f\x85\x84\x1b\xb5\x96\x98\x25\xdb\x1f\xba\x48\xfe\x65\x35" + "\x41\x7e\x19\x78\x83\xce\xfd\xd0\x38\x43\x57\xe7\xf5\x83\xc1\x75" + "\xf5\x87\x06\xd6\xff\x64\xbe\xac\x81\xf5\x3f\x5f\x2c\x5d\xdd\x43" + "\x72\x6f\x35\xa2\xec\x87\x32\x2c\x35\xb1\xda\xf2\xd0\x20\xeb\x7f" + "\x0f\xe9\xeb\x7f\x0f\x1d\x8b\x94\x67\x0f\x55\x45\xf6\x61\x56\x54" + "\x1f\x3e\x54\x1f\xd9\x87\x59\x0b\xfe\xab\xe3\x1a\xbe\x29\x3e\x3e" + "\xde\x14\x1f\x67\x8a\x8b\x47\x34\x9a\x48\x43\xe3\xcd\xf1\x43\xf0" + "\xbb\x42\x7f\x0e\x35\xc5\x9b\xcc\xf8\x0d\xd1\x9f\x57\x44\x7d\x0f" + "\xe5\xbc\xf8\x99\xf5\xe7\x90\xa8\xef\x2b\xbe\x24\x7e\xa8\x5e\xae" + "\x51\xbe\x39\xea\x7b\xc8\x97\xc4\x5f\xf1\xdf\xcc\x4f\x17\x7d\x47" + "\xda\xa1\xdd\xbf\x62\xcd\xa2\xfc\x65\x8b\xe5\x7e\xf1\x12\xdb\xa2" + "\xa7\x9e\x5a\xb2\x7a\xb5\xad\x70\xa5\xed\x9e\xbb\x1f\xbe\xe5\x0e" + "\x9b\xda\x76\xce\x9f\x31\x6e\xf1\x70\x9a\xbb\x76\x15\x47\xcc\x9d" + "\x7f\x7f\x8e\x2d\xeb\x9e\xbb\x23\x23\x0d\x30\x72\x7b\xf9\x52\x50" + "\xc2\xf8\x2f\xfd\xc5\x51\x44\x65\x3b\xa5\xec\xe9\x60\x3b\x5f\xb5" + "\xe6\x91\x33\xa5\x89\xed\x47\x7b\x9d\xa2\xe1\x06\xde\xd3\x9f\xff" + "\x4f\x6e\xc4\xc4\xba\x12\x2a\x78\x92\xcf\xaf\xcc\xff\x5c\xbc\xeb" + "\x23\xdb\x03\x64\x6a\xa7\xc7\xef\x6e\xcc\x40\x5a\x7c\xbb\x3d\x41" + "\xb2\x39\x29\xa1\x93\x7e\xf0\x11\xe2\xe2\xc4\x9d\x1a\xc2\xfc\xba" + "\x2d\xf4\xf7\x3f\x97\x61\xef\x96\x18\xe9\x2c\x9d\x94\xfd\xb2\x78" + "\x57\xc8\x6f\x3e\x1f\xa4\xd2\x65\x2f\x13\xa6\xf9\x76\x96\x0d\x35" + "\x23\xc9\xcc\x7b\xa1\xaf\x8e\xa4\x84\x57\x47\xb1\x8f\x94\xec\x05" + "\xc6\x5e\xe8\x8b\xf8\xf6\xd0\xe3\xe9\x5c\x36\xa7\xd5\x4c\xf3\x1f" + "\xe6\xf4\x7b\x23\xd3\x97\x0d\xec\xc5\x66\x2f\x30\x21\x5d\xe6\x47" + "\x64\xb1\x84\xc4\xe7\x81\xe4\x8f\xeb\x26\x65\x50\x9c\x1b\x5d\xd1" + "\x14\x2c\x21\x65\xf3\x93\xfd\xcf\x75\x21\x11\x64\xfb\xf4\xb9\x5e" + "\xa7\xa8\x7c\x96\xcc\xe0\xe9\xb8\x86\x55\x6c\xa3\x90\x7d\xb8\x76" + "\x09\x99\xd1\xfe\x31\xa7\xe8\x7b\x5e\xdb\x3c\x22\xe7\x5c\x32\xff" + "\xd5\xc1\xf6\x86\xde\x3b\x2b\xfe\x41\xe6\x5f\xf6\x96\x98\x7a\x85" + "\x95\x8a\x0a\x45\x97\x60\xbf\x49\x7e\x11\x60\x1b\xff\xa6\x85\x21" + "\x4e\x33\xa9\xc7\x69\xa5\x96\x42\x3f\x6d\x6c\x13\x81\xd2\x7f\xa8" + "\xb3\x01\xcd\x5e\x3f\xdb\x2f\x26\x6c\x9c\x4b\xf1\x9d\x39\x64\x6a" + "\xce\xab\x26\xf7\x02\x3f\x15\xb5\x89\xae\xa6\x85\x9f\x50\x4b\x5e" + "\x3d\xe5\xb6\x92\xa9\xa9\xe3\x04\x49\xdf\x3f\xdb\xb2\xd9\xee\xd1" + "\xba\x71\x19\x87\x9d\xa7\xf5\x1b\x29\x69\xfd\x3f\xc9\xe2\xee\x6a" + "\x45\x39\xa7\xe9\xd1\xe3\x14\x07\x78\xa6\x0d\x27\xc8\xba\xe1\x11" + "\xb6\xf3\x4d\xa7\x9a\x62\xb2\x0a\xa7\x3d\xb1\xd7\x69\x4f\xe9\x15" + "\xf6\x91\x3d\x4e\x7b\x6a\x4b\x01\xd2\x77\xbc\x43\xc9\xad\x94\xfa" + "\xee\xa9\x56\x53\xf5\x39\x1a\xc3\x6d\xea\x44\xdb\x6a\xce\x21\xfd" + "\xb6\xf1\x25\x1a\xf2\x86\xe7\x09\x8e\x18\x5f\xed\xce\x09\x90\x06" + "\x58\xd5\xbd\x34\xa6\xa6\x97\xac\xda\xd6\xf1\x25\x9c\xcf\x4b\xdf" + "\xff\x4f\x37\x46\x86\xa2\x8d\x22\xd4\x57\xf1\x59\x1d\x64\xe2\xd0" + "\x37\x9f\x3c\x64\x76\x37\x79\xa9\xd9\xdf\x4b\x2d\xf4\x2f\x72\x3b" + "\x3e\x6d\xf8\xe5\x93\x87\x86\x68\x60\x82\x86\xf5\x1d\x28\x4b\xd1" + "\x8e\xb3\x99\xcc\x6e\xf4\x41\x65\x31\x25\x16\xac\xa7\xa1\xa7\x10" + "\xae\xe6\xf6\x1f\xee\x77\x07\x3f\x6d\x58\x2f\xed\x71\x1f\x4f\x2f" + "\x6e\xa6\xf8\x16\x7f\x35\xb7\xdf\x14\x1a\x99\x4d\x6e\xff\x31\x72" + "\x17\x9c\x6c\xd0\x52\xe6\x77\x95\x69\x94\xf0\xc6\x85\x63\x26\xb7" + "\xf9\x02\xb9\x73\xfc\xf4\x1e\xca\x16\xdb\xb2\x13\x21\xb7\xd2\x5b" + "\xfc\x01\x3e\xef\x94\x26\xba\xad\xc3\x2b\x57\xd1\x84\xbd\xe7\x68" + "\xec\x9e\x73\x64\x17\x3d\x76\x13\xdb\xd8\xf2\xf9\xd5\x3d\x78\x26" + "\x76\x50\x02\xda\xae\xec\xb1\x47\xe8\xb6\xb6\x7d\x76\xaa\xed\x1d" + "\xb0\xb5\xed\xed\x1e\xb0\xb5\x05\x4d\x2d\x64\x7b\x5b\x0f\x7d\xcf" + "\x6f\x69\xa2\xa1\xed\x94\x6d\x65\xfa\xae\x3c\x43\xe6\xcd\x67\x88" + "\x26\x95\x98\xc8\xb6\x94\xcf\x59\xfc\xe0\x9f\x6e\xf4\x0d\xbf\xb7" + "\xd3\x0f\xca\xf0\x4c\xc4\x2f\x0e\xe1\x9b\xb8\x9d\x1d\x3a\x1d\x23" + "\xcc\x84\xb0\xe7\xf1\x8c\xc7\xf3\x59\x67\x8d\xf0\xa1\xac\x40\xb7" + "\x89\x86\x33\x3d\xeb\xf6\xbd\x81\x1e\xd7\x0f\x16\x7b\x68\xc5\x62" + "\x83\xae\x95\x8c\xcf\x5e\xf8\x5e\xfb\x69\xf6\xcf\xe5\x93\xf5\xea" + "\xcb\x8b\x63\x5f\x5d\x7a\x38\xd7\xa1\x99\xcb\x45\xf9\xf5\x78\x5a" + "\xf0\x63\x3e\x9d\x65\xe4\xed\xee\xcb\xe3\x32\xff\x8c\x70\x61\x84" + "\xa3\xdd\x66\x8e\xfb\x4d\xfb\x69\x93\x4a\x63\x37\x01\x66\x40\x87" + "\x0f\xde\xcf\x36\x33\x8f\x77\x9b\x2c\xe2\xc8\xc2\xa9\x54\xb3\x53" + "\x34\xed\xd9\x29\x1a\x15\xef\xe5\x24\x78\xa8\x20\x81\xeb\x88\x71" + "\xbc\xb1\x0c\x71\x47\x6c\x44\x8c\x97\xc6\xc5\x6c\x4f\x96\x03\xfd" + "\xef\xca\xc3\xe1\x6d\x10\xae\x87\xa5\xae\xff\xab\xe2\xa3\x43\x20" + "\x03\x12\x5a\x3a\xbc\xf4\xcb\xde\xae\x21\xce\xbf\x90\xc9\x1d\x6c" + "\xa7\xc9\xa9\x64\x65\x7d\xb0\x76\xa7\xf0\x6c\x67\x7f\x80\x3b\x85" + "\x17\xf4\x72\xed\x29\xca\x79\xfe\x5b\xa9\x94\xfa\x37\x8c\x76\x4a" + "\x3e\xe5\x94\x87\xc9\xa7\xab\x9b\x3d\x87\xc2\x64\xd3\x82\x3f\x5f" + "\x2c\x9b\x1e\x7b\x5f\xc9\x26\xf0\xbe\x94\x45\x21\x8f\x1e\xfe\x46" + "\x54\xb8\x6e\x27\xf2\xd8\xd6\xa8\xf0\x80\x1e\xbe\x31\x2a\xdc\xa7" + "\xc2\x1f\x7d\xc7\x90\x7d\x2d\x5c\x8f\xb5\x2c\xfb\x1e\x7d\x8d\x65" + "\x5f\xcb\x42\x5d\xf6\x49\xf9\xf3\xe8\x0b\xe2\x7f\x41\x16\xad\x61" + "\x79\xf3\xe8\xe3\x5c\x7f\xf1\x2e\x19\x75\x1f\x86\xb0\x6b\x39\xac" + "\xea\x5f\x64\xc6\xcf\x90\x7b\x2b\x59\xee\xb1\xcc\x63\xd9\xb7\x7b" + "\x94\x68\xdd\xbd\x53\x1c\xaf\x91\xbe\x86\x1e\xe9\x97\x7f\x2f\x21" + "\xac\x0c\x61\x2f\x21\x9e\xe5\x20\xe3\xa4\x39\xe7\x10\xb1\xfd\x09" + "\x68\x6c\xba\x66\x4a\xa3\x0a\xf4\x37\x9f\x37\xdc\x02\xfc\x5a\xe2" + "\xa8\xc0\x5d\xc8\xe7\x57\x43\x6c\x93\xd6\xd1\x52\xd8\xc1\x7c\x37" + "\x6a\x33\xf8\x8c\xcf\x4b\x17\xfb\xc5\x29\x3e\x77\xc7\x75\xc8\x5d" + "\xf7\x00\xfb\x67\x8a\x6b\xcc\x23\x62\xbb\x70\x96\xd9\xa8\x8b\xb9" + "\x0a\x75\x52\xfe\x60\x1e\x4d\xf5\xd0\xeb\xb3\x54\x5f\x3f\x9e\xce" + "\x7e\xe0\xda\xe9\x91\x1c\xcc\xf7\x02\xdc\x36\x4b\xa8\x84\xf8\x1c" + "\x0c\xfb\x46\xe4\xe7\x6e\x93\x96\x57\x65\x9c\x85\x71\x41\x36\x20" + "\x8d\xbb\x35\x40\x5c\x67\x0f\x3d\xb2\xaf\xb9\xe8\x10\xe7\xcf\x60" + "\xdc\x08\x97\xd3\x80\x11\x27\x61\x98\xe4\xbc\x11\x73\x83\x47\xd5" + "\xda\x79\xf2\x67\x75\xcd\x0b\x7c\xc4\x72\xdf\xdd\x05\x18\x45\xed" + "\x0a\x06\x60\x09\x8c\x01\x11\x71\x3a\xfc\xa4\x8d\xe2\x73\xc0\x4f" + "\xe5\xfe\xe2\x73\x91\xbc\xdf\x06\xbc\x24\xb2\xad\xbc\xd2\x45\x1f" + "\xd9\x53\xfb\x2f\x22\xfd\x6c\x27\xe8\xed\x91\x1a\x3e\xb7\xc4\xe7" + "\x39\x2f\x75\x96\x13\x38\x1a\x6b\x9c\xe7\xd4\xd6\xfe\xcf\x9e\xe5" + "\x04\x6c\xeb\x5e\x93\xa8\x47\xfd\x6b\xf8\x3c\x67\x3b\xe5\x04\x99" + "\x0e\xf5\x36\xd5\xbd\xfc\x28\xe3\x3c\xa7\x83\xc3\x30\x77\x3c\x6a" + "\xf4\x3f\xb7\x97\xdb\x82\xb8\xa3\x4a\x47\x14\xc7\x3c\xf4\x58\x1d" + "\xc7\x23\xec\x20\xa7\x9f\x0c\x39\xe6\xc6\x18\xf6\x66\x7b\xc8\x54" + "\xb9\x9e\xcc\x4a\xa6\x2d\x78\x9b\xf3\x2b\x99\xb6\xa0\x60\x40\xa6" + "\x2d\x58\xa2\x64\x9a\xc2\xb1\x92\x69\x0b\x1e\x51\x32\x6d\xc1\x43" + "\x72\x5f\x0c\x32\x8d\xe3\x58\xae\x19\x32\x6d\xcf\x28\x71\x94\x65" + "\x47\x8f\x6b\x41\xba\x21\xdb\xca\x11\xc6\xb2\x83\xeb\xa8\xe4\xd4" + "\xa3\xd5\xe2\x03\x3b\x29\xbb\x03\x7e\xcf\xe3\xf3\x0b\x5d\xfa\x3b" + "\xfa\x65\xc1\x5b\x4a\xc6\x2d\xd8\x31\x20\xe3\x16\x58\x07\xf2\xb2" + "\x8c\x5b\xf0\x73\x25\xe3\x54\x78\xed\xa3\x2c\xe3\x1e\xad\x66\x1c" + "\xe8\xf0\x4d\xbc\x86\xa7\xa7\x67\x3c\xd6\x85\xcb\xb8\x48\xfe\x5a" + "\xe0\x35\x64\x1c\xcb\x36\x7c\xb3\xdf\xc8\x85\x92\xdf\x90\x6e\x07" + "\x70\x6e\xf0\x1d\xf7\x01\xb7\x99\xfd\xbd\x31\xde\x66\x9e\xa6\xa1" + "\xfa\xd9\x21\xbd\xdd\x8f\x4f\x33\x6c\x1f\x3d\xb4\x20\x3d\x96\x1e" + "\x3d\xe0\x93\x91\xae\xe3\x73\xf3\xee\x92\x76\x72\x57\x8b\x92\x96" + "\x60\x1b\xe5\x16\x42\x56\xc4\x3f\xf3\x11\xf7\x2d\xe6\x1d\xdf\xe5" + "\x27\xcb\x1e\x8c\xa5\x1b\x73\xfd\x74\x05\xe6\xea\x1f\x55\x9a\x10" + "\xe7\x88\x88\x93\x6b\x0c\x93\x56\xb1\x3f\xbf\xc7\x17\x0e\x36\xdf" + "\xbf\xcc\xf2\x4e\x0f\x5e\xde\x13\xc3\x64\x79\xd0\xa9\x30\x07\x1a" + "\x71\x86\x1e\x97\xf3\x12\xe9\x03\x67\x73\x2c\x58\x4f\x7c\x47\x8f" + "\x1f\x32\x48\xfc\x23\x5f\x92\x7f\xdd\x97\xe4\x7f\x95\x65\x11\xda" + "\x67\x09\xb9\x22\xe1\x24\x07\x8d\x74\xa7\x38\xdd\xfb\xfa\x5a\xcc" + "\x47\xce\xeb\xe5\x1c\xcd\x6a\xc0\x64\xfa\xab\x40\x3a\xe9\x97\x05" + "\xb2\x72\x16\x4a\x4c\xf6\x47\xe4\x0d\x0d\xe0\xf8\x89\x41\xcf\x74" + "\xb2\x1c\x75\x57\x93\xf4\x51\x7b\x04\x3a\x29\xfb\x4c\xda\xd1\xbf" + "\xfe\x91\x9b\x0d\xb9\x99\x15\x66\x17\xeb\x85\x9c\xbb\x4e\xf9\xa3" + "\xf1\x53\xa5\x9a\x6f\x5e\x03\xf9\x3c\x92\xcf\xc3\xf0\xd9\x98\xdc" + "\x50\x96\xe9\x88\xf4\x9d\x96\x5b\x65\xe4\x1d\x6c\x9d\x85\xcb\xd5" + "\xcb\x64\x1b\x53\x3f\xf2\x34\x1a\x79\x18\x36\xdb\x29\x62\x5c\xbe" + "\x4e\x9e\x29\x0d\x7a\x59\x16\x5e\x03\x5d\x74\xa4\x2a\x67\x21\xe9" + "\xe5\x80\x67\x1e\x6f\xb8\xd4\xd9\x8c\xc1\xdb\xb7\x70\xea\xe5\xb7" + "\x8f\xf4\xf6\x2d\x2c\xf8\x92\xf6\x5d\xaa\xdc\x03\x97\x5f\x6e\x8a" + "\x51\x6e\xd7\xe5\xe3\x75\xd1\x98\xaf\x8e\xd7\x34\x1d\xaf\x8b\xb2" + "\xbe\x04\xaf\xb1\xca\xd9\xf2\xd5\xcb\xb1\x19\xe5\x1c\x8a\x55\x0e" + "\xc9\xbf\x41\xcf\x4d\x25\x18\xbe\x3d\xbb\xc1\x3b\xca\x37\xde\x93" + "\x14\xee\x2f\xb9\x5b\xf2\xd5\x93\xa9\xfd\xfe\x99\xd5\x5e\x39\x64" + "\xf5\x93\x53\x72\xeb\x78\x7c\x17\x9a\x87\x9e\x9c\xca\x7e\x63\x67" + "\x6d\x54\x67\xb2\xf5\x3c\x19\x97\xf2\xd3\xcc\x3e\xc0\xd8\x07\xa0" + "\x1b\x52\xfc\x48\x35\xfb\xba\xb4\x2f\x64\xfb\x7b\xcc\xa9\x20\xe3" + "\x9f\x7c\x99\x7d\x9a\xe1\x7d\x28\xbf\xf3\x7e\x38\x9e\x75\x4a\x16" + "\x3c\x59\xe7\xa1\x45\xad\x83\xc2\xdd\x66\x2f\xd8\x57\x9c\x36\x64" + "\x30\x3b\x7b\xe4\xf7\x78\xe8\xb9\x03\xd2\xb6\x3e\xf9\x7c\x03\xe6" + "\x14\xba\x9f\xc1\x25\x8f\x4b\xdf\x73\xce\x1c\x3e\x57\x82\xf1\x71" + "\xf1\x0b\xfa\x79\x00\xe0\xa5\x04\xf8\x7d\xca\x6a\xe0\xc5\x08\x47" + "\xd8\x04\x03\x2f\xd0\x73\x12\xdd\x75\x41\x3e\xaf\xe3\x57\x67\xb3" + "\x9f\x7a\x48\x6c\xb5\xe7\x29\xd8\x4f\x29\x1b\x35\x2e\xaf\x2f\xc7" + "\x2c\xe7\x4f\xc5\x3c\x7f\x5a\x3c\xd5\x37\xc2\x9e\x67\xd4\x43\xac" + "\xb6\x9a\xf8\x0c\xf8\x64\x8c\xa9\x15\xca\xd7\x5f\x1c\x9f\x97\x93" + "\xf1\xab\xed\x26\x85\x9b\xa7\x7e\x2b\xba\xed\x6c\xb3\xcf\xb0\x13" + "\x51\xef\x05\x0c\xd7\x83\xa7\x6f\x83\x9d\xfd\x5f\xe8\xed\x79\x6a" + "\x8f\x56\x71\xbe\x41\xeb\xb1\x9a\x8c\xfa\xee\x95\x67\x5b\x9f\x42" + "\xfb\x17\x2d\x90\x75\x96\xf5\xb1\x9a\xd8\xae\x5f\x1b\x69\x2f\x10" + "\x1b\xac\x74\x70\x55\x97\x9c\x3f\x71\x99\x93\x51\xbe\xe0\xf9\x12" + "\x74\x94\x1e\xd7\x62\x6b\x3f\xde\x00\x57\xf4\x18\x78\x7b\xaa\x51" + "\x8d\xcf\xaa\x8d\xfe\x0d\x56\xd3\x11\x9f\x3c\x77\x47\x63\x6d\xce" + "\x2f\x94\x0f\xee\xc5\xd9\x06\xee\xfa\xeb\x84\xfa\x70\x1a\x65\xe7" + "\xb4\xb8\xd0\xa8\x93\xe4\xe1\x91\x7c\x8e\xf7\xa9\x3c\x3e\x3f\xa4" + "\xf0\x7f\x24\x11\x69\xaa\x2f\xc6\xff\xe2\x03\x61\xf8\x8f\x67\x1a" + "\x64\xfc\xf3\x9a\x07\x70\xfb\x4f\xe0\x32\x41\x9d\x7b\x60\xbd\x66" + "\xf1\x09\x7c\x27\x72\x3d\xb5\xad\x06\xce\x73\xcc\x6a\xbd\x6c\x49" + "\x4a\x58\x3f\xa0\xbd\x56\xd6\xd9\xe2\x8c\xf6\x73\x1e\xc6\x01\xfb" + "\xb3\xe4\xb2\x51\x9f\x2b\x7b\x5c\x4b\xec\xd1\x6d\xda\xac\xce\x94" + "\x90\xb2\x31\x59\x92\x11\xe6\xd3\xdc\x57\x68\x13\x01\x75\x3e\x79" + "\xb1\xef\x60\xb1\xcf\x3c\x98\x2c\x60\x1a\x94\xbe\x31\x4d\x72\x7d" + "\x01\xba\xd7\xd3\x33\x04\xea\xa6\xfa\xfe\xe9\xab\x55\xd8\xd2\x45" + "\x78\x82\xc6\x96\xbc\x2d\x50\xb6\xcf\x29\x7d\xad\xa0\x6d\x4f\xe7" + "\x30\xcd\x19\x74\xc6\xeb\x91\xca\x76\x7c\xe9\xb5\x2c\x5b\x0c\x9c" + "\xa3\xfe\xc3\x51\xbf\x2e\xa3\xfe\x46\x7a\xee\x3b\x4e\xc3\x7b\x37" + "\x8d\xb6\x80\x94\xb9\xea\xec\xd0\xd2\x54\x83\x97\xb9\x0c\xee\x67" + "\x96\x39\x8c\x0f\x85\x8b\xa5\x53\x23\x61\x59\x4d\xca\x5f\x27\xaf" + "\x51\x82\x1f\xd7\x07\x86\x20\x4d\xce\x00\x8c\x25\xc7\x65\xdc\x40" + "\x3d\xd9\xde\x5f\xda\xe4\xa9\xfe\x58\xfa\x3e\xb7\x6b\xa0\xbe\xcc" + "\x7f\x4b\xfb\xfb\x9f\xe3\xfc\x4e\x2b\xfb\xfe\x95\xb2\xa6\xf0\x7a" + "\xae\xaf\x8f\x7d\xea\x4a\x5a\xf7\xd0\xd2\x04\xae\x3b\xa7\x31\xfa" + "\x6c\x80\x16\x97\x7a\xc2\xe1\x08\xa7\xac\xab\x84\xa3\x64\x87\x0f" + "\x73\x57\xb2\xa9\x7d\x97\xa7\x13\x07\xea\xbc\x74\x8b\x51\x9f\x01" + "\x99\xf0\xf4\x84\x68\x9a\xe4\xb2\xd9\x6f\x9f\x0e\x9b\x65\x49\x4a" + "\x3b\x3d\x6d\x55\xf5\x5a\x52\xc5\xfd\x38\xd8\x38\xc7\xfe\x35\xd9" + "\xe7\xea\x76\x25\x43\xd0\xcf\x79\xaf\x6e\x57\xe7\x89\xfc\xca\xef" + "\xea\xd3\x7b\x84\xe9\x35\xc6\x15\xaf\xab\xfb\xa4\xdf\x0e\x79\xd6" + "\xfc\xe9\xc3\xbc\x5f\x97\x5c\xf0\x9a\xf4\xb1\xab\xdb\x08\xfa\x1a" + "\x0b\x82\xd2\xef\x9f\xb3\x90\xcf\xde\x06\x79\xce\x27\x6d\xe0\x8e" + "\x14\x06\x69\x7e\x80\x79\xe2\x69\x2f\x9f\xa9\x57\xfe\xcb\x9f\x0e" + "\x18\xe7\xe8\xd9\x67\x27\xfb\x9b\x85\x1c\x8a\x1f\xf0\x17\x9b\x77" + "\x8c\x75\x2d\xbd\x7f\xa9\xc2\x24\x8e\x29\xfe\xcf\xbb\x9b\xcf\xcd" + "\xab\xfd\xac\x76\xc8\x84\xf8\x4f\x91\x56\xea\x75\x03\x32\x2a\xef" + "\xef\xbc\xa7\xe5\xd1\x61\xf4\xb8\xf2\x16\x63\xcc\x38\x7a\xb1\x2c" + "\xc9\xbb\xdb\x98\xc3\xf0\x39\x3c\xb5\x3f\x36\x00\x0f\xf9\xa5\x5e" + "\x3d\xd0\x07\x7f\x62\x58\xf5\x17\xcb\x85\xbc\x46\x83\xf7\x0a\x6e" + "\xe0\xb3\xdc\x4f\x97\x72\xf9\x83\x8d\x17\xc2\xf9\x08\xf7\x53\x42" + "\xa7\x2d\x76\xdf\xc4\xde\x6f\x5b\x66\x37\xda\x60\xe0\x44\xb5\x61" + "\xd9\xa6\xee\xe4\xcf\x9a\x06\xda\xbe\x4c\xae\x11\x85\xc5\xbf\x1d" + "\x86\x1b\xfe\x3e\xa4\xc6\xb5\x65\x0e\xd0\x87\x7e\x16\x5f\x85\x81" + "\x77\x9e\x11\x1b\x72\x48\xd5\x71\x19\x19\xbc\x8e\xb4\xfb\x3c\xd4" + "\x13\x50\xfb\x5e\xcb\xd8\xff\x01\xe9\xf9\xe6\x70\x5d\x62\xb6\x33" + "\xa2\x8e\xcb\xd3\x58\xe7\x50\xbe\x15\x96\x4f\xe1\xfa\xda\x6e\xe4" + "\x3e\x5e\x26\x75\x5d\xe9\x67\xa1\x2f\x6f\x88\xbf\xcf\x4e\xdd\x7d" + "\x79\x90\x0b\x76\x53\x8f\x6b\x39\xe4\xff\x85\xe3\xaa\xcc\xe5\x63" + "\x8d\xba\x72\xdd\xa4\x1f\x50\xb1\x2c\x36\x7e\xb9\x5c\xe9\xfb\x29" + "\x6f\x28\x7e\x09\xf8\x5d\xf1\x55\xf5\x13\xe8\xeb\x5d\xbe\xf2\x73" + "\xf9\xda\x1a\x71\x94\x7d\x8c\x61\x4e\xd2\x55\x09\xfa\x4d\xde\xd4" + "\x00\x1d\xfd\x71\x53\xee\x3a\x4a\xc7\xdc\x99\xc4\x05\x31\x6d\xaf" + "\x86\xe7\x1a\x31\x95\xfd\x9b\xe3\x3b\x4d\xff\x9e\xc0\xdf\xdd\x6b" + "\xc4\x02\xd4\xb9\xd5\xd8\x2b\x54\x3e\x72\x96\x77\xf5\xfb\x15\x8a" + "\x7f\x8c\xcf\x15\xb1\xff\x29\x0d\x73\xa2\x2e\x2e\x37\x97\xe7\xb5" + "\x28\xaf\xc7\xf5\x4c\x0a\xfa\x39\x9b\xd3\xf9\xe2\x6f\x1e\x89\x5f" + "\x4c\x5f\xec\x9c\x87\xeb\xd5\x9d\x74\x2e\xdf\xa8\x6b\xb2\x3f\xdd" + "\xf4\xd5\xea\xf6\x4c\xa1\x51\x37\x84\x1f\xad\x54\xe1\x41\xf6\x95" + "\xc8\x36\x8f\x88\xdf\x61\xd4\xd5\xa8\x03\x97\xc7\xe7\x38\x45\xf2" + "\x67\xad\xec\x83\x86\xcb\x63\xbf\xad\x48\xdb\x60\xd4\xf7\xab\xd2" + "\x72\x71\x8d\x10\x3c\x7e\xb2\xfc\xb5\x8d\x26\xe9\x5b\xaf\x93\xf2" + "\x53\x8f\xd4\xf8\xd9\x37\xea\xbf\x50\xc6\x7f\x74\xb3\x6f\xd4\xbe" + "\xbc\x98\x7d\xcc\x79\x90\x3e\x4b\xca\x87\x8a\xcf\xfe\x43\x13\x19" + "\x90\x13\xc8\xd7\x97\xc1\x6b\x4e\xe0\xdb\xfc\xa2\xc6\xa2\x2e\x3e" + "\x7b\x09\x99\x93\x5f\x84\x34\xad\xac\x67\x61\xde\x15\x90\xf7\x66" + "\x40\x36\x35\xac\x99\xca\x30\x36\x9a\x1d\x64\x6e\x8c\xf2\x57\x35" + "\x18\x7d\x74\x27\x9e\x0f\x74\x57\x9c\xc7\x3c\x3e\xff\xa0\x87\x9e" + "\x1d\x54\x27\xdc\x3c\x0a\xf8\x44\xba\xaa\xd1\x3c\xef\xcb\xf7\x5c" + "\x2a\xad\xb1\x6f\xcd\x32\x68\xb2\x95\x12\x45\xd2\xf9\x00\xcb\xdb" + "\xee\xe4\xf3\xc7\x78\x2c\xe9\x71\x3d\x6b\x33\xf2\xf3\xb8\xce\x63" + "\x07\xfa\xcb\x5a\xd9\x2f\x0f\x9f\xd5\xfd\x15\x3f\x9b\x61\xf0\x68" + "\xac\x72\x0a\xf7\x09\xcd\x39\x8e\x4c\x6e\x8c\x5b\x93\x02\x94\xb8" + "\x77\x17\x51\xd5\x7a\x11\xd8\xbe\x1e\x73\x99\xd1\x7c\xcf\x46\x7e" + "\x03\xf3\x28\xd3\x77\x05\xe8\x25\x1e\x75\xd9\x7e\x01\x65\x16\xab" + "\x74\xba\xfd\xba\x15\xe9\xbc\x78\xa6\x0a\x93\x89\x76\x14\x53\xc2" + "\x0e\x8d\xcc\x55\xc5\x34\x06\x61\xd0\x75\x9f\x6d\x32\x78\x36\x56" + "\x1d\x2a\xf7\x12\x6d\x43\xb9\x9b\x8a\x45\xf0\x4f\x18\xcf\x5d\x9a" + "\x08\x7c\x15\xbc\x7b\x68\xc5\x04\xd5\xc6\x15\x13\x0c\x9d\x10\xef" + "\xd3\x22\xed\x0f\x56\xd8\xa2\xe7\xca\x4f\xae\x5c\x59\x98\xbb\x6a" + "\x09\x3f\xec\xe3\x9e\x1f\x3f\x3c\x7c\x4d\x84\xc7\x3f\xe5\xaf\x62" + "\x45\x16\xaf\x3f\x6e\x1f\x69\xec\xa7\xaf\xa8\x32\xd6\x40\x75\xbb" + "\xfd\xbb\x78\x6e\xc7\x73\x20\xc4\x1d\x78\xbf\x68\x23\x83\x89\xfb" + "\x28\x81\x4c\xd1\xe5\x2d\x5d\x54\xb8\x28\xff\x0e\xde\x39\x1b\x1e" + "\xab\x9c\x86\xa8\x72\x02\xfd\xe5\xa8\xf1\xc7\x6f\xe2\x74\x5b\x97" + "\xd7\x89\x11\x99\xe9\xea\xcc\xf4\xca\x31\xc6\xda\x56\x6c\x7b\x47" + "\xaf\x35\xb4\x6d\x7c\x03\xf3\x83\x73\x23\x99\x7e\xb3\xbe\xd5\xc4" + "\x7a\x64\x31\xde\x79\x8d\x41\xae\x95\xe9\x7e\xa3\xde\x3d\xd7\x8a" + "\xf1\x7d\x65\x81\x28\xf7\x42\xae\xae\xcc\x1b\x6c\x5d\x21\xdc\x56" + "\x84\x6d\x0b\x3b\x68\x65\xe9\xa5\x6c\x8f\x38\x3d\xb7\x87\x69\x36" + "\x2a\x5f\x48\xf5\xd9\x4a\xd0\x7f\xbe\xe1\x87\xbe\x3f\x4d\xe5\x28" + "\xc3\x1f\xd7\xca\xe3\x83\xda\x8d\x94\x5d\xd0\xc7\x8f\x82\x19\x8d" + "\x98\xb7\xa1\x9d\x3f\x6a\xa7\x82\xef\x98\xad\xd0\x11\x46\xd3\xcf" + "\xf0\xce\x57\x00\xc4\x71\x5c\x04\x1d\x5d\x7b\xba\xce\x0c\xe9\x02" + "\x29\x13\x27\xd4\x1f\x99\xf5\x97\x78\xfc\x4c\x22\x4e\xee\xaa\xc6" + "\xa3\x07\x87\x5e\x61\x26\x4b\x72\x62\xc2\x75\xdf\x18\x63\xbd\xeb" + "\xce\xe9\xd3\x9c\xc5\x45\x90\xca\xc1\x80\x45\x84\x9d\x8b\xac\x9a" + "\xd7\xf5\xbd\xf1\x25\x24\xed\x6a\xb6\xce\x8b\x79\xa6\xb2\xdc\x25" + "\x0a\xf8\x0c\xbb\x36\x72\x69\x8a\xf3\x79\x32\xbd\xd9\xeb\x31\xb1" + "\x2f\x68\xd6\x9f\xd9\xcf\x2b\xea\xfa\x97\xf7\x10\x06\x7c\x39\x44" + "\xd5\xd2\x14\xa5\x77\x3e\x37\x4c\xdb\xb6\x34\x65\x00\xbe\x99\x18" + "\xbe\xf3\x55\x32\xed\x2b\xee\x32\xb9\xcd\x77\x92\xdb\xe6\xa7\xf7" + "\xf0\x1e\xb3\xaf\x50\x26\xeb\xb2\x0c\xa3\xd6\xa5\x95\x3a\xbf\x20" + "\x93\x7e\x0e\xd5\x74\x86\x9e\xbb\xbb\x7e\x90\x7c\x7c\xee\xbb\x3b" + "\xf9\xdc\x37\x7b\x5c\xcf\x15\x79\xe8\x9e\x83\xba\x2e\x83\x31\xf7" + "\xb9\x32\xd0\x86\xd4\x3f\x11\x7f\x03\xdf\x47\x83\xb0\x3a\x23\x4d" + "\xcc\x3e\xfa\x31\xaf\xc5\x8b\x06\xa6\x03\x71\xe1\x3f\xbb\xf8\x8c" + "\xcb\x20\xf6\x30\x43\xdd\x8e\x5b\x78\x4f\x72\x48\x32\xe4\x8f\xf3" + "\xbc\xe8\x0b\xb9\x28\x15\xec\x64\x0a\x99\xe8\xba\xe0\x05\x91\xd3" + "\xec\x3d\x87\xb1\xe0\x38\xcf\x45\xe2\x7e\xb5\xf4\x4f\x26\x77\xe0" + "\x6c\x83\x7b\x8b\x46\x2d\xd0\x2b\xdd\x35\x67\x1b\x94\xff\xd3\x10" + "\x35\xd3\xbf\xa8\xd9\xf1\x7f\x4b\xdc\x25\xff\x42\xb8\x28\x61\x3c" + "\xf7\x5d\x10\xd9\x6e\xf3\xff\x21\xbe\x1f\x89\xc7\x38\xe0\xdd\x76" + "\x86\x56\x2d\x7b\x17\x70\xde\xfc\x10\xb0\xa4\xef\xb4\x19\xf4\x1e" + "\xde\x7b\x5c\xab\xfa\xc7\xbf\x98\x3e\x67\xe2\x1a\xca\x2d\x8e\xc7" + "\x4d\x1a\xc6\x52\xf6\x71\x87\x31\x74\x2a\xb7\x0b\xdf\x69\xfc\x8d" + "\xe7\x04\x7e\x5a\x36\x35\xec\xb1\x04\x1f\xe7\xb1\x35\x87\xc7\x4d" + "\x84\x67\xd7\x5e\x90\x63\x6d\x96\xfe\x3d\x47\xff\xce\xd0\xbf\x67" + "\xe9\xdf\xe9\xfa\xf7\x74\xfe\x56\x63\xf2\xea\x84\x7e\x7d\xc1\x34" + "\x14\x63\xcc\x6a\xab\xd1\x17\xa8\x4f\x92\xc5\xb1\x51\x8e\xed\x7a" + "\x3d\xa6\xea\xf5\x4a\xd3\xbf\x8d\xfa\x5c\x6b\x09\x6e\xfc\x9f\xaa" + "\x4f\x75\x54\x7d\xf6\x87\xd5\x87\x2c\x8e\xf4\xaf\x52\x9f\x14\x0b" + "\xdf\x4f\xf1\xdf\xa8\x0f\xd7\x85\xc3\x7a\x5c\x85\xf6\xc8\xfa\x14" + "\x4e\x33\xea\x13\x93\xde\xd6\x88\x2e\xd6\x6b\x56\x7f\x4d\xfa\x80" + "\x1e\xca\x3a\x4b\x6d\xaf\xe1\xaf\xb0\xb0\xf0\x52\xfe\x0a\xc1\x0b" + "\x18\xb7\x0b\xd1\xfe\xc2\x59\xba\xfe\x76\x58\xe9\xf9\x85\x07\x0c" + "\x1b\x32\xb4\x75\x7f\xa5\x6a\xeb\x81\x2d\xec\xb3\x6f\x1d\x7d\xdd" + "\xe9\x10\x5d\x98\x77\x7f\xcc\x73\xc3\x70\xb8\xf9\x85\xab\x57\x3f" + "\x7b\x87\x2d\x7f\xd1\x8a\x25\xb6\x71\x8b\x6d\xab\xf3\x96\x2d\x2d" + "\x5c\x12\x69\x57\x91\xa2\xdf\x1b\x24\xcf\x8b\xf0\x5c\x4a\xce\xa5" + "\x41\xff\x52\x4e\x4a\xdb\xbc\xe7\x9f\x15\xae\xc2\x56\x96\xb9\x7b" + "\xb7\xa9\xfb\xa5\x7a\x5c\xcf\x4f\x37\xc6\x10\x63\xfe\xcb\x63\x08" + "\xc2\xb3\x31\x4e\x1e\x0f\x0b\xe7\xb4\x79\x46\x18\xc3\xd7\x65\xd3" + "\xd0\x76\x7a\x7e\x18\x97\x19\x13\x87\x17\x44\x1d\xf4\x26\xbe\x3b" + "\xc3\x04\x99\x22\xd8\xff\x16\x9f\xc3\x44\x3e\x81\xfa\xc8\x79\x45" + "\x36\xbe\xd5\x9c\x4d\x70\x1d\x9b\x91\x67\x1f\xc2\xcc\xac\x43\x60" + "\x1e\xd8\xc5\xf9\x10\xfe\x09\xfb\xc3\x40\x78\x82\xee\x57\x8c\xc3" + "\xbe\x60\x7f\x15\x08\x4b\x19\x08\x5b\x93\x84\x30\x2b\xc2\x6c\x0a" + "\xde\x9a\x6b\x19\xcf\xf8\x4e\xd7\xd7\xc9\x38\xcd\x14\xbd\xdc\x92" + "\xf0\x3a\xf3\xdd\x31\xb7\x4c\x4a\xb3\x65\xcf\xff\xf6\x8c\x3b\x9f" + "\x5a\xb9\x62\xe9\x70\x92\x68\xb7\x63\x38\x4e\xbb\xc5\x31\xfe\x0e" + "\x5b\xc1\x92\x25\xab\x6c\x6b\x97\xac\x28\xb4\x2d\x5a\xbb\x68\xdd" + "\x70\x5a\xba\x72\xd5\x53\xec\x6d\x81\xbb\x65\x75\xee\x53\x4b\x9f" + "\x66\xe3\x17\x95\x7a\x78\x84\x9e\x90\xcd\xb2\x4d\xf7\x4f\x72\xb4" + "\x92\x75\xc8\xa4\x0b\x47\xf1\xce\x7e\xbb\xac\x78\x36\xe2\x77\x18" + "\xbf\x43\xf8\x1d\xc7\xef\xd8\x29\xda\x10\xc4\xf3\x60\x8f\x6b\x4d" + "\x9b\xa1\xaf\x0c\xd0\xd0\x1a\x9f\x41\x43\xd0\x2f\x0e\xaa\xf1\x6d" + "\xad\xad\x25\x28\xf9\xa7\x9f\xa6\x2a\x2f\x0c\xd0\x14\xfb\x1d\x6d" + "\x61\xdb\xae\x35\x88\xef\x95\x6b\x96\xbc\x66\x32\x8c\xf1\xd6\x49" + "\xeb\xaf\xae\xdd\x29\xd8\xc6\x8c\xd7\x73\x1b\x41\x2f\x4d\xca\x4f" + "\xcd\xda\x1a\xa4\xbb\x1e\x65\x1c\xd6\xcb\x50\xdf\xa3\xc4\x51\xbe" + "\x3b\xa6\x5d\xff\x66\x58\x9d\xb4\xee\x0d\x7e\xe7\xa7\xbe\x87\x6a" + "\xd1\xef\x96\x33\x0d\xc4\x39\x66\xeb\x65\x34\x00\x17\x25\x7b\x5d" + "\x22\x60\xcc\x9d\x79\xad\xd8\x12\x77\x97\x40\x7d\xce\x6a\xf1\x8f" + "\xb5\x4a\x3f\x98\x25\xbd\x90\x11\xb7\xde\xea\x76\xc8\xf4\x71\xbc" + "\x96\x3c\xaf\x40\x68\x7c\x0f\x95\x16\xff\x4c\x2b\xe7\x13\x89\x17" + "\x8e\x6a\x15\x49\xe9\x4a\x67\x60\xff\x83\x0e\x9b\x0e\x33\xc0\xb8" + "\x3d\x45\x6b\xfe\xae\xe6\xe1\x1b\x82\x4a\x97\x70\x4c\x30\x6c\x2e" + "\xc1\xa3\x76\x7c\x4f\x37\x64\x80\x87\x1c\x09\xba\x7d\x5c\x83\x6a" + "\xbf\xa3\x50\xff\x3e\xa4\xd7\x31\x8e\x7d\xa2\xa0\xfe\xc7\xb8\xef" + "\xa0\xaf\x1c\xc2\xfb\x71\xe0\xa7\x49\xe1\xc7\x21\xed\x7c\xa1\x37" + "\x71\xfc\x71\xbe\x67\x07\x71\xc7\x95\xbf\x91\xb5\x07\xb8\xcd\x03" + "\x36\xb4\x35\xe9\xc0\xdf\x1b\xbc\xd7\x0c\x5e\x3a\xe4\xbe\xc0\xfc" + "\xb9\x76\x3f\xe0\xd5\x1b\x72\x87\xe5\x4c\x6e\x08\x7c\x2a\xe7\x53" + "\x8e\x0e\x43\xde\x0c\xd0\x81\x23\x10\x4b\x96\xc4\xea\x77\xbd\x6f" + "\x16\x09\xd7\x9a\xe9\xa8\x53\xbd\xec\x03\xf6\xcb\x7a\xa1\x7f\xde" + "\xd6\xa7\x64\xe4\xba\x39\xfd\x73\x4c\xbd\x1e\xec\x07\xde\xc3\x75" + "\xeb\x95\xfb\xff\xba\xdc\x58\x57\x68\xc8\x0d\x03\x8e\x25\x4e\x68" + "\x16\x07\xfe\x95\x79\x0f\xf1\x5e\x09\x8f\x97\x52\x1f\x01\x9c\xe4" + "\xf3\xea\x2c\x9c\x56\xee\x3d\xe4\xa1\x75\x13\xf8\xae\x39\xa9\xd3" + "\xba\xd6\x64\x0e\xc8\xa2\x75\x47\xc3\x61\x8a\x44\xef\x21\x86\xcb" + "\xf2\x88\x75\x92\xdc\x90\x99\xfd\xd1\x1c\xd2\xc7\x17\xc8\xe0\x75" + "\x01\xa3\xae\xc0\xe1\x51\xa3\xbe\xfa\x5d\x67\x47\x51\x4e\x4e\x66" + "\xa8\x8f\x6d\xc2\x1b\x55\x7f\x6e\x90\xf2\x06\x71\x07\x7a\x5c\xeb" + "\xa7\x7a\xe8\xf9\x52\x9d\x87\x9a\x90\xff\xc0\x91\xe2\x59\x48\xb3" + "\x3e\x4b\xb7\x6b\x3e\x86\xfe\x3d\x1e\x46\xfb\xb3\xc3\xd6\x79\x8e" + "\xab\x3e\xbc\xb3\xa4\x9d\xd6\x57\x85\x85\xeb\x7d\x7b\x24\xab\x9d" + "\x36\xcc\x56\xf6\x44\x5e\x87\xca\xbf\x5e\xea\xa8\x46\x1d\x59\x16" + "\xf0\xb9\x3d\xe6\x71\x89\x7b\xd9\xc7\xeb\x8f\x1a\xe3\x05\x60\x1d" + "\x94\x38\x1f\x25\x0e\x33\x9e\x94\xdf\x8f\x35\x2b\x14\x9e\xd6\xfb" + "\x22\x70\xcf\xe3\x26\xca\x61\x3c\x25\x6f\x12\x5a\xb2\x3f\x4e\xe4" + "\xae\x33\x13\xf3\x0b\xf3\x38\xef\x11\x82\x3e\xa4\x5e\xa5\xf0\xb6" + "\x21\xcd\xc0\x9b\xd1\x77\x8c\x27\x0f\xad\xaf\x63\xdc\x46\xb6\x71" + "\xe8\xb1\x76\xa3\xed\xc0\x29\xfb\x36\xc5\xf7\x2c\x9d\x2f\x9a\x1a" + "\x46\xb3\x0d\xc9\xda\xfb\x8f\x98\xbf\x4d\x47\x1c\x53\x49\xe1\x76" + "\x43\x15\xda\xe1\x0b\x9b\x97\x1c\x65\xfc\x32\xaf\xa0\x9e\x07\x75" + "\x1f\x5c\x47\x95\x3d\xd3\xda\x59\x98\x4f\x1c\x94\xbc\xbc\x46\xfa" + "\x4a\x61\xff\xbd\xc7\x18\x47\x2c\x17\x99\x97\x98\x07\x98\x9f\x14" + "\x8e\x36\x78\xc3\x70\xd4\xc8\xf8\xd1\xf1\x74\x30\x4a\x96\x2f\xb1" + "\xe5\xcf\x50\xb2\xd8\x66\x1f\xb7\x78\xb2\x74\x78\x63\xbb\x77\xe6" + "\x1d\xb6\xac\x19\xe3\x1c\x79\x13\xe6\xa9\xc7\xcc\xac\x39\xfc\x1c" + "\x1e\x39\xaf\xb3\xf5\xb8\x8a\xb2\x23\xe7\x86\x9b\x3c\x4a\x7e\x14" + "\xe5\x7b\xe2\x46\xca\xb5\x0a\xf6\x3f\x5b\xb9\x82\x28\x84\x7a\x57" + "\x9c\x42\x9f\x26\x7a\xb3\xd9\xdf\x71\xa6\x83\xd8\x3f\xfa\x17\xb5" + "\x88\xdb\x8b\xf0\xe4\x02\xbe\x4b\xe1\xa4\xd0\x92\xbc\xd9\xbc\x66" + "\x23\xca\x4f\x58\x7d\x23\xe6\x75\xe1\x57\xef\x4b\x3a\x37\x6b\xf6" + "\x78\xa7\x00\xdc\x46\xa3\x5d\xbc\xb6\x03\x3c\x65\x67\x3a\x44\x88" + "\x71\x94\xeb\x60\x9f\xe4\x80\x1d\xcf\x6b\x3b\x45\x68\xff\x73\x76" + "\x35\x7f\x2d\x02\xfd\xaf\x29\xd3\x65\x59\x56\x8f\x6b\x23\xf4\xbf" + "\xdb\xa5\x2d\x80\xe6\xb2\x4a\x5f\xe6\xda\xe6\x9b\x1f\xc6\x7c\xa0" + "\xde\x80\x09\x58\x57\xe8\xf6\x0f\x12\xde\x57\xb5\xaf\xd5\x2a\x4e" + "\x17\x58\xe2\x94\x7f\x48\xf0\x78\x49\xad\x49\xcb\xe9\xb7\x97\x41" + "\x5c\xf2\xa6\x14\xb6\xa7\xc9\x01\xed\x95\x70\x1a\x23\xae\xd2\xa5" + "\x79\x2a\x4d\x5a\x00\xfd\x98\xa2\xf4\x67\x2f\xcb\x4f\xcc\x5d\x37" + "\x1e\x34\xc6\x35\x39\x1e\x9a\xa8\x44\xcd\x67\x36\x4a\xbb\xcf\x73" + "\x2e\x33\x79\xa8\x68\xd6\x0d\xa9\x72\x8e\x12\xd0\x5c\x71\xa4\x6c" + "\x9a\x37\xfe\xdc\x90\xb1\xbc\x6f\x6a\xd9\x24\x7c\xbc\x46\x6c\x09" + "\x0a\x1f\xef\xa1\xca\xb1\x83\x4e\x91\xbb\xa8\xa7\xc4\x2d\xef\xfe" + "\xe4\x3b\x48\xfc\xfa\xb8\x11\x52\xe3\x06\xca\xf7\xc5\xdf\xbc\x10" + "\xe3\x43\xdc\x29\xda\xe8\xe0\xfa\x33\x6e\x78\xaf\x45\x03\xae\xdc" + "\x3c\x4e\x32\x7e\x92\xcf\xf8\xd8\x16\x86\xdb\x6a\x09\xa2\xcd\xe1" + "\xed\x32\x69\x9e\x0a\x17\xda\x65\xe2\x7b\x3c\x4e\x33\xcf\x04\xd8" + "\x46\x09\xfc\x36\x4a\xfa\xb5\x96\xf3\xf3\xe2\xea\xf0\x36\xb2\xfc" + "\x57\x6d\x28\x7e\x3b\x56\x1b\x85\x89\xdb\xc8\x38\x28\x2e\xd7\xf9" + "\x4d\xd6\x93\xe5\x87\x97\x8a\xe7\x24\x6f\x62\xdb\x20\x6f\x36\xe4" + "\xdb\x4c\xee\x43\x8c\x9f\x55\x5c\xcf\x58\xfd\xc5\xf0\x14\x2c\x67" + "\x8e\x65\x53\xc9\xc2\x1e\x97\x73\x6c\x6c\x7c\x3b\x67\x5f\x1a\xdf" + "\xce\xaf\x71\x7e\xae\x07\xef\xef\x58\x82\x26\x12\xa0\x5b\xcc\xd7" + "\x4a\x63\x95\x9b\xbc\xa9\x8e\xeb\x15\x33\x4e\x30\xbf\xe8\x32\x08" + "\x74\x28\xc0\x27\x82\x65\x12\xea\xd6\x60\xc8\x23\x4b\x9c\x2d\x5e" + "\xca\x07\x93\xa8\x8a\x05\xc3\xb2\xa9\x8a\xf7\xb9\x66\xa2\xfc\x98" + "\xf1\x1a\xdf\xf3\x51\xe6\x4d\xd7\x36\x7f\xeb\x06\x4b\x1c\xdd\xe5" + "\x8b\xff\xd6\x70\x8b\x23\x38\x96\x71\x08\x98\x0e\xf0\x71\x33\xcf" + "\x53\xd5\xda\x48\x09\xf4\xff\xad\xfb\xe5\x1a\x65\x92\x37\x5d\xed" + "\x1b\x95\x60\xfc\xab\xee\x30\xd6\xe6\xf1\xbd\xc0\x43\x9f\x29\x5f" + "\xbd\xf1\x5f\xdf\x25\x2a\xce\x41\x76\x5b\x84\x6d\xbd\x05\x7a\x64" + "\xc9\x79\x4d\xf0\x9d\x0e\xe7\x68\x80\x4e\x94\xdd\x94\x41\x27\xc8" + "\x5f\x13\x9b\x06\x4a\xde\xb9\x34\x0d\x94\x6c\xe5\x78\xc6\xbb\x9a" + "\xab\x94\x74\x18\x7a\x8a\xd8\xfc\xf5\x5d\xb6\x62\x59\xbe\x43\x95" + "\xcd\x38\x49\xe7\x3d\xa3\x39\xc0\x4b\x49\x8f\x6b\x53\x8a\x21\x07" + "\x98\x5e\x2c\x21\xbe\xef\x82\x24\x4d\x23\x0e\xfa\x4f\x61\x89\xda" + "\x4b\x3a\x77\x54\xde\x9b\xe9\x2a\x4a\xf0\x39\xf3\x76\xf3\xfd\xb0" + "\xfe\x24\xef\x61\xa4\xc9\xf2\xd0\xff\x56\x7a\x45\xa2\xf7\x20\x60" + "\x1c\xda\xa1\xec\xa2\x13\xa4\xdf\x28\xf0\x34\xfb\x8a\x62\xbe\x46" + "\x58\x2a\xea\xcd\x7e\xa3\x30\xdf\xd9\x54\xda\x3f\x2e\xb9\xd2\x21" + "\x2b\x84\x3c\xdb\x84\x71\x69\x4c\x37\x70\xf7\xb2\x49\xdb\x7f\x61" + "\xb2\x95\xb8\xcd\x17\x36\x8f\xde\xff\xa3\x49\x64\xfe\x7f\xac\x4f" + "\x52\xc1\x2d\x94\xba\xe9\xdb\x66\xfa\x6c\x1a\x99\x18\x0f\x1e\xda" + "\x54\xad\x70\xb7\xa9\xd5\xe8\x1f\x0f\x95\xc8\xfe\xe1\x35\xe4\xcc" + "\xa0\xf8\x42\xad\x73\x6f\x82\xfc\x5b\x91\xa2\xe2\x8b\x16\x46\xaf" + "\x01\xb1\x3e\x6f\x5b\xb6\xda\xb6\x78\xe5\xda\x15\xd7\x5f\x1f\x31" + "\x57\x32\xab\xfb\x78\x5d\x89\x6a\x3c\x75\xa5\x1b\xf5\x66\xbd\x04" + "\xdf\x68\x7f\xd1\x45\x3e\xed\xe7\xe4\xea\xe6\xee\xb9\x69\x34\xf0" + "\x3e\x85\xe6\x4c\x09\xfb\xbc\x95\xe6\xdc\x72\x6b\xee\xc3\x4b\x16" + "\x2d\x5e\x17\x16\x7a\x5b\xf8\xba\x61\xe5\x2e\x94\x1d\x3f\xfa\x1e" + "\xc8\x8a\xb8\x79\x1b\x78\x6c\xd9\x7c\x5b\x71\x50\x7c\x0a\x79\xcd" + "\x7e\x6b\x72\x9b\x0b\x83\xd4\x0c\x59\x26\xbe\xce\x32\x7c\xa8\x3a" + "\xe3\x09\x7d\x0a\xb4\x65\x41\xdb\x7d\xd0\xeb\xce\xf3\xfa\x0c\xf2" + "\x3d\xd2\x52\xcd\xbe\x9d\xcf\xcd\x51\x3a\xc6\xe6\x54\x84\x8f\xc0" + "\x73\x06\x9e\x57\xe0\x79\xb7\x6d\x05\xe6\x3d\x6c\x53\xbf\x86\x6d" + "\xea\x37\x8f\x97\x76\x41\xfe\x12\x62\xdb\xa0\x4e\x72\x35\xb1\x0e" + "\xe2\xa1\xcd\x45\xbc\x0e\xce\x69\x91\xe7\x6a\xdb\x72\x4a\xe3\xa7" + "\x90\x7b\x83\x9b\x53\x45\xf9\xb9\x39\x62\x77\x0e\xdf\xeb\x36\x16" + "\xe1\xeb\xe2\xe3\x3e\xa2\x78\x6b\xc2\xb0\x1e\xd7\x66\x07\xf0\x2f" + "\xef\x62\x18\xec\x0e\x5c\x79\xf7\x70\x94\x7e\x38\xa0\x1b\xfe\x98" + "\xa4\x7e\xab\xeb\x73\x7b\xe5\xb8\xb0\xb9\x29\x4c\xa7\xe3\xbd\xe9" + "\xe1\x4a\x3f\x11\x21\xa5\x9f\x6e\xf6\x1a\x7c\x80\xf7\x80\x41\xa7" + "\x11\x7e\xf6\x56\x14\x2e\x59\xb5\x64\xb1\x6d\xdc\xea\xe1\x14\xe6" + "\x65\x2f\x6f\xc9\x0a\xdb\xaa\x25\xcf\x3d\xbf\x64\xb5\xf4\x90\xc7" + "\xb1\x11\x63\x7e\xaa\x48\xf6\x15\x18\xe7\xbf\x6c\xa3\x19\xbf\x5b" + "\x1e\x67\xdf\x6c\xa2\xc2\xc7\xf6\xbf\x72\xbf\x50\xa4\x2c\xb5\x47" + "\xce\x37\x5e\xd0\xef\x6b\x38\x37\x5d\xcd\x75\x5e\x90\xbe\x0d\x11" + "\x9e\x30\xe0\x07\x7e\xcb\xdb\xc0\xa5\x49\xc7\xdb\xb9\x1e\xd7\x96" + "\x7a\x03\x6f\x1e\xfa\xe1\x34\x5d\x97\xf2\x4a\xf9\x81\x31\x16\xf2" + "\x2f\x62\x7c\x55\x77\xdf\x6e\x39\x04\xda\x88\x97\xeb\xc9\x49\xe7" + "\xd2\xb9\x2c\x86\xd9\x89\xfc\xe8\x9f\xe9\x90\x9b\x2c\xdf\x4a\x0d" + "\x78\x28\xb3\x8e\xcb\xd3\xe7\x41\xd7\x9c\xa2\x17\xe4\xb9\x1c\xad" + "\xec\x5c\x3a\xcb\x14\xf6\x25\xa2\x95\x03\x8e\xdc\xa3\xfd\xe1\x34" + "\xb9\x0e\xcb\x77\x11\x00\x16\xaf\x03\x43\x36\x64\xf1\x3d\xc9\x1c" + "\xa6\x7c\xc4\x6d\x91\xe7\x22\x50\xd6\xb4\x1e\xd7\x0b\x05\x03\x67" + "\x1c\x7e\xc8\x77\x70\x27\x30\x5c\x0f\xbd\x30\x95\xe1\x29\x1f\x78" + "\x2f\xec\xf0\x90\xab\x66\x40\x7f\x7a\xa1\x35\x6c\x5e\x86\xfa\xa8" + "\x7a\xfa\x51\x17\xe9\x6f\x55\xd9\x9c\xca\x76\xb3\xfc\xdc\xa1\xb7" + "\xdd\x68\x0f\xe0\x41\xfe\x6d\x2e\x35\xec\x26\x3c\x7a\xbb\xb9\x7e" + "\x5c\xf7\xf0\x3a\xeb\xf5\x4d\xe1\xfa\xf6\xb8\x7e\x38\x26\x8c\xb7" + "\x79\x5d\x66\x08\xc2\xd2\x06\x6c\xd9\xb7\x38\xa2\xe5\xc6\xca\x15" + "\xb6\xfc\x65\x2b\x9e\xc9\x5d\xbb\xe8\x99\x25\xb9\xcf\x17\x4c\xb0" + "\x3d\xbf\xe2\xc9\xfc\x95\x4f\x3d\xc3\x54\xb3\xba\xf0\xf9\xa7\x9e" + "\xb1\xb1\x64\xc9\x9d\x35\x67\x4e\xee\x3d\xdf\x9b\xff\xc8\x70\xba" + "\x67\x11\xc2\x30\xf3\x9f\x93\x36\x41\x45\x3d\x3c\x7b\xe6\xf7\x73" + "\x67\x66\x7e\x6f\x5e\xb6\x3c\xfc\xd2\x1f\x3f\x6b\x45\xec\x04\x11" + "\x74\x98\x02\x5a\x9a\x86\xfe\x1d\xd2\x4e\x2f\x1e\x54\x7e\xd3\x7f" + "\xd8\x11\xe9\x37\xfd\x87\x90\xe6\x3f\xb2\xe2\x37\x95\xa8\x34\x0f" + "\x3f\xc4\xbc\xb8\x5f\xd1\xd7\xb0\xc7\x7a\x5c\x3f\x4a\x19\xa0\xaf" + "\x17\xe5\x99\x32\xb6\x57\x52\xeb\xb3\x3f\x82\xfc\xdf\x92\x16\x1e" + "\x37\x30\x9f\xfc\x51\x46\xff\x7c\xb2\x5f\xa6\xfc\xa8\xd0\x98\x5b" + "\x22\x6c\x16\xe6\x95\xc3\x78\x5e\xa9\xd6\x93\x5e\xfc\xad\xa4\xa9" + "\x41\xf9\x3b\x81\x8c\x79\x25\xf3\xb6\xdc\x93\x92\xf3\x8f\x1f\xd5" + "\x87\xf3\xb8\x5c\xd3\xd7\x79\x9c\xf3\xc9\xf5\xbb\x94\xa5\xa9\xbc" + "\xa6\x0d\xfd\x78\x1a\x74\x05\x8c\x5f\x3d\x42\x8c\x58\x9a\xaa\xd7" + "\xc9\xc7\x6b\xdc\xac\x37\xeb\xf4\x94\x7c\x8a\x4a\x27\x0a\xd7\x0f" + "\x67\xa9\x39\xe5\x0f\x9f\x67\xb9\x2e\x36\x8f\xbe\x87\x6d\x8b\x78" + "\xee\xd4\xe3\x2a\x1d\x3b\x40\xb3\x2f\x1e\x64\x5a\x18\x98\xcb\x96" + "\x46\xc8\xff\x6e\x79\x87\x61\x69\xb6\xe1\xf7\xa1\xf0\x7a\x32\x99" + "\xaf\xaf\xa2\x1d\x26\x51\xe2\xa1\x52\x39\x6f\x65\x7c\x7a\xe8\x47" + "\x36\xa4\x35\x0f\xe0\xaf\xb4\xb4\x1f\x7f\xfa\x3a\x8b\xb1\xc6\xa2" + "\xea\xfd\xe2\x6f\x07\xc3\x55\x6c\x3c\x95\xb6\x7e\x29\x9e\x5c\x34" + "\x84\x79\xd2\xc0\xd7\xc5\xb8\x7a\x71\xcc\xc5\xb8\x7a\xf1\xd9\x30" + "\x5c\xbd\x7c\x31\xae\x5e\xcc\x0a\xdb\x57\xd2\xd7\x51\x5e\xfc\x2d" + "\xe3\x8c\x69\x0c\xed\x36\x83\xce\x5e\x1e\xc0\xdf\x8b\x25\x17\xe3" + "\xef\xc5\x1d\xb1\xf1\xf7\x62\xda\x0d\x91\x70\x76\xc7\x1a\x37\x92" + "\x37\x99\xf4\x73\x61\x3f\x1e\xd6\x38\x46\xce\x49\x03\xdb\x4d\x5a" + "\xde\x76\x17\x7e\x78\xf2\x3c\x62\x40\x17\x17\x01\xd5\xd6\x1f\x27" + "\x34\x62\xce\xcb\xeb\x4a\x97\x18\x8b\xda\x8c\x35\x0f\xbc\xb7\xf2" + "\xdc\x99\xef\x86\xe2\x70\xc6\x27\xe6\x5c\x3e\xd0\x7b\xab\xd2\x4b" + "\x7f\x9c\xd3\xbf\xe6\x72\xb3\xaf\x2e\x7e\x13\xd9\x8e\xd4\xdc\xc2" + "\xe1\x05\x68\x87\xb4\x5b\x64\xdb\xad\xc1\x60\xe6\x86\xd2\x69\x10" + "\xb8\xfd\xf4\x3f\xd8\xd9\xe8\x28\x79\x94\xb7\x68\xc5\xe2\x95\x4b" + "\x97\x7e\xb9\x28\x0a\xdf\x57\xab\x72\x69\xa5\x3d\x7c\x47\xe7\xe6" + "\xe5\xeb\x7b\x5c\x2f\xb1\xfe\xbf\x50\x8d\x9b\x2f\x41\xfe\x2d\x9f" + "\xae\x74\xc9\xc7\xba\xd4\x79\xf0\x97\xca\xc2\xe4\x33\x68\xe4\xa5" + "\x6a\xe1\xfa\xf1\xf1\x81\x3e\x7e\x69\xf1\xc5\x7d\xfc\x92\x23\x76" + "\x1f\xbf\x54\xa3\xad\xe1\xf3\x38\x2f\x61\xfe\xb3\x4a\xea\x9a\xfc" + "\xcd\x76\x10\x98\x33\x77\x61\xbe\xec\xcd\x5c\xd7\x70\x57\xee\xba" + "\x38\xb9\x57\xcc\x77\xb0\x04\x2f\x88\x0e\xb6\x45\xe0\xfd\x31\xbe" + "\x83\x85\xef\x5e\xe2\xbb\x42\x65\x1a\xbc\x57\x76\x92\x9c\x3b\x22" + "\xde\x56\xdb\x29\xef\xe5\x86\xae\xf0\x52\xc0\xd0\xad\x2d\x9b\x6c" + "\xf2\x9c\x7a\x85\xea\x8f\x56\xee\x0b\x2e\x2f\x77\x5d\x83\x2a\xe3" + "\x02\xdf\xad\x46\x16\xa5\x43\x94\xa5\x5d\x72\xed\x7e\xc4\xbc\x63" + "\x83\xdf\x4d\x50\x32\xb4\x7f\xaf\x52\xbf\xff\x98\x79\x9f\xed\x48" + "\x01\xb7\x34\xda\x0e\x55\xd9\x0e\x95\xd5\x19\x36\x59\x95\xd2\x06" + "\x8a\x2c\x2c\x3f\x79\x9e\xd3\x49\x65\xbc\x86\x81\xf1\xb2\xac\x31" + "\x7c\x8f\xd3\xb6\x7e\xd3\x15\x67\xa8\xec\xd9\x4b\xec\x9b\x26\x0e" + "\xd8\xc0\x96\x0c\xed\x71\x95\x9b\xfb\x6d\xc4\x5c\x25\x43\x6b\xc3" + "\xea\x86\x38\x5b\x98\xad\xa2\x8f\xc7\x63\x9e\x3f\xd6\xaa\x3b\x58" + "\x7d\x9d\x54\x3e\x1b\x61\x98\x4f\x94\xcb\x33\x0f\x6b\x83\x34\xa6" + "\xe0\x4e\xbe\xbb\xa7\xfc\x59\x7d\x1e\xea\xb5\x15\x73\x7d\xca\x93" + "\x18\xae\x07\xe9\x84\xdc\x0f\x28\x77\xf4\xd7\x39\xac\x3c\x03\xb6" + "\xc2\x49\x79\x8d\x51\x2f\xe4\x93\x73\x55\xbe\x5f\x3b\xbc\x4d\x8e" + "\xa5\xcb\x72\x0b\xf2\xd6\xe5\x2e\x5b\xb1\xac\x70\x38\x39\x16\x3d" + "\xbf\x6c\x32\x82\x6c\x4f\xe5\x2d\x2b\xc8\x5d\x26\xbd\x16\x4b\x87" + "\xc8\x85\xeb\x0a\x78\xef\xe3\xa2\x3d\xf8\x14\xa9\xcb\x9b\xca\x0f" + "\xaa\xf1\xbe\x22\xd1\xa0\x53\x79\xe7\xb8\xc8\xa1\x01\xdb\x2b\x79" + "\x37\x71\x7c\x27\x55\x7c\x87\x69\x58\xf9\xf9\xa9\xcc\x52\xfa\x45" + "\xc5\xac\x8b\x6d\xb2\x2a\x72\x0c\x9b\x2c\xd0\x77\x0a\xf3\x7a\x18" + "\x2c\xd0\x7f\x85\x23\x46\x9e\xb2\x7e\xfb\x4e\xfd\xbe\x73\xee\x2b" + "\xe9\xf7\x7e\x1b\xcb\xdb\xf2\x3f\xb9\x1d\xb3\xd9\x77\xaf\xce\x57" + "\x15\x87\xc3\xea\x2b\x6d\x79\x19\x16\x9f\x97\x9a\x1c\x08\xb7\x65" + "\xab\x9c\x81\xb1\xd7\x6a\x94\x63\xdb\x60\x82\xbc\xab\x1c\xe1\x37" + "\x35\xc4\x4b\x3b\x64\xe4\xeb\x71\x55\x26\x18\x76\x34\x9e\xfe\x76" + "\x55\x8e\x89\xae\x23\xea\x7e\x3d\xc2\xa7\x0e\xd8\x09\x56\xb0\x9d" + "\xe7\x42\x84\x61\xfc\xaf\xdc\x17\x1e\x16\xde\x4f\x77\xcf\x9e\x03" + "\x05\x7a\xf5\x12\x74\xd2\xcc\x45\xf9\xf9\x2c\x83\x16\x2d\xc9\x7f" + "\x7e\xd5\xca\xd5\x7a\xd7\xdd\xbd\x94\xdd\x51\xcb\x24\x77\xe8\x31" + "\xb6\x15\x4b\x96\x2c\x56\x41\x7a\x47\x46\xee\x59\x29\x3b\x86\x4a" + "\xcc\xff\xcb\x3c\x03\xba\x62\x95\x55\x98\x2a\x17\xe0\xf7\xb4\x94" + "\x3f\xb2\x5f\x2b\x3b\x22\xe7\x68\x95\x7e\x83\xf7\x65\x3f\xa3\xfd" + "\x8c\xbf\x6e\x21\xf7\x78\xd0\xaf\x5b\xef\x47\x3b\x87\x60\xfe\x98" + "\xc1\x73\x93\x01\x38\x55\x13\xfa\xf1\xbd\xf9\xb1\xd6\xcd\xca\x66" + "\xc2\x0c\xd9\x60\x66\xdf\x12\x88\xc7\xfc\xbf\x2c\x5b\xc9\xc9\xaa" + "\x9c\xfe\xbd\x17\x53\x3c\xe6\x9b\x55\x79\x98\x7b\xec\xbf\x98\xbf" + "\xab\x4a\x2e\xe6\x7b\xb6\xb5\xac\xaa\x36\x70\x6c\xd0\x82\xa2\xbf" + "\xad\xb7\x19\x6b\xc6\xb5\xfa\xdd\x08\xfc\xce\x79\x79\x5e\x21\x92" + "\x93\xee\x62\xbb\x86\x76\xda\x6a\x56\x34\x55\xe5\x09\xb3\x0d\x4c" + "\x39\x45\x5b\x49\xf5\x6d\x55\xc0\xe0\x3f\x0f\x55\x49\x5d\x8e\x61" + "\xa8\x71\xbd\x72\xa3\xa2\xaf\xad\x63\x0c\xdc\xf2\x1c\x1e\xdf\x13" + "\x06\xf4\xa0\xca\x26\x69\x2f\xa2\x7c\x6b\xf4\x71\xfb\x01\xe7\x80" + "\x01\x07\x69\xd1\xfe\x04\x9f\x81\x2b\x23\x4d\x38\x4d\xcc\x5c\x54" + "\x80\x09\xf6\xb2\xa5\x4b\x97\xac\x5a\x6d\xf8\x1b\xb7\xaf\xcc\x5f" + "\xac\xfc\x8b\xdf\x81\xee\x5f\x0b\x1e\x9e\xc1\x2e\xca\x11\xaa\x5e" + "\xa3\xf4\xdd\x09\xbc\x26\x22\xed\x47\xe5\x9c\x6b\xe7\xa6\xbd\xfa" + "\xfc\xab\x9d\xb6\xa7\x2a\xfb\xab\x6d\x2f\x2a\xdd\xf6\xca\x9f\xa2" + "\x4e\x5e\x43\xb7\xe5\xb5\xd6\x6e\xfa\x26\xfb\x55\x94\x67\x0a\xf6" + "\xec\x14\x1d\xbc\xb6\xda\xe3\xda\x96\x62\xdc\x49\xc7\x7a\x53\xf9" + "\x4e\xe5\x4b\xbb\x61\x05\xdb\x8a\xec\x7c\x4d\x2b\xf7\xa6\x89\xe4" + "\x0f\x16\x42\x3f\x4b\x64\x9e\x48\xf2\xb2\x0d\x2f\xfb\xc0\xda\xb6" + "\x80\xf5\x3a\x96\x65\x7c\x6f\x43\x07\x6d\x9b\x00\x19\x0d\x58\x3b" + "\xf7\xf9\x92\xbc\x69\x5b\xd6\x53\x02\x97\x01\x79\xed\x69\xac\x63" + "\xdc\x6e\x73\xbc\x0f\x59\xa6\xcb\x6c\x0f\x97\xe3\xa1\x6d\xb3\xf4" + "\x75\xff\x59\x22\xb1\xdb\xc1\xb2\x50\x9d\x17\xdd\x76\x40\x94\x23" + "\xac\xec\x83\xfd\xc0\x23\xdf\x79\xb8\x5f\xdd\xf7\xb7\xad\x51\xa5" + "\x6f\xe3\x75\x8d\x80\x28\x6f\xeb\x42\xf8\x18\x84\x7b\x54\xf8\x87" + "\xfb\x33\x43\x01\x9e\x27\x5f\xc7\x77\x57\xa2\x4c\xb4\x3f\xa9\x5a" + "\xd1\x7d\xdb\xff\xbd\xa9\x84\x1c\x7c\xdf\xa5\xf2\x85\x75\x81\xef" + "\x5e\x6e\xe5\x7b\x25\x91\x1e\x73\xa7\xad\x5e\xc0\x6b\xd5\xed\xc9" + "\x41\x77\xdb\xb7\xaa\x73\x02\x5b\xdb\x18\x9f\xa8\x63\x96\xbe\x16" + "\x9c\xd5\xe3\xda\x0e\xf9\x77\xad\x3e\xaf\xde\x9e\x65\x94\x81\xb1" + "\xd4\x07\x1d\x7c\x2a\xeb\xe1\xc0\x81\x1d\xbf\x09\x95\x72\x5f\xde" + "\x83\x31\xc4\x22\xd8\x0e\x6e\xe0\x0e\xbf\xed\xa5\xc6\xb8\xca\x65" + "\xeb\x78\x98\xc3\xeb\x86\xbc\x66\xa8\x97\xc5\xbe\x34\xe3\x0c\x98" + "\xf8\xb6\x6b\x17\x4e\xd7\x01\x66\x02\x74\x04\x9f\x7e\x77\xdb\x84" + "\xca\x73\x6c\x33\xe9\x81\x0e\x70\x9d\xc8\x0d\xa6\xf0\x7e\x56\x92" + "\x71\x37\x5e\xed\x39\xc6\xfd\x76\xff\xc0\x3e\x15\xf2\xa3\x2f\xc1" + "\x5b\x25\x1d\xb4\x23\x89\xcb\x65\xbe\x62\xba\xe8\x45\x3f\xa3\xaf" + "\xf3\xc4\x85\xd3\xf5\xb6\x15\x94\xd4\x49\x3b\xa6\x70\x7f\xf3\xde" + "\x32\xdb\x32\x22\xcc\xc2\xbe\xfc\xdb\x69\xc7\xb5\xdc\xd7\x5c\x17" + "\xe0\x70\x5a\xb0\x27\xe7\x3e\x3e\xc7\xcd\xf2\x77\x63\x11\xf4\xf7" + "\xa5\x2c\x97\x5e\x7e\x8d\xd7\x03\xf8\x0e\x26\x7e\x77\x2e\x16\x9a" + "\xa4\x95\xf5\x4c\x2b\x2f\xbf\xb6\xb1\x4b\x68\x5f\xb8\x48\x1c\xf5" + "\x13\x7d\x61\xa2\x60\xc0\x14\xc7\xf5\x36\x39\x4f\xf3\x59\xf3\x3a" + "\x72\x3b\x4a\xd9\x2e\x2e\xa1\x62\x3d\xa5\xf0\x39\x7d\xbe\x5f\xa8" + "\xc5\xcf\xf7\x3f\xd7\xd0\x5f\x83\x3b\xa8\x61\x0d\xfb\x5c\xd9\x99" + "\xf1\x37\xc7\x0e\xde\xaf\x1b\x86\xf7\x61\xb6\xef\x73\x59\x3b\x3c" + "\x7f\x3b\xfe\x0f\xfa\x5b\xc3\x3f\xc8\xf6\xa8\xfc\xf6\x35\xe5\xfc" + "\x95\x9a\xd2\xff\x4a\xce\x0e\xa1\xf1\x1c\xb1\xf8\x59\x2e\xa3\x14" + "\xb0\xea\xf8\x4c\x7b\x8a\xd6\x6d\x1d\xae\xee\xcd\x65\xdb\x48\x1f" + "\x35\xac\xf8\x03\xd7\xf1\xb9\xbd\xe7\x28\xa1\x61\xc5\x9f\xe4\xbb" + "\x9a\xbb\x9d\xae\x73\x2f\x6e\x65\xfd\x34\xc8\xe7\xf9\x79\x7f\x13" + "\xf3\x15\xad\x92\xeb\x18\x52\xf5\x06\xbe\xcc\x46\x7e\xe8\xaf\x46" + "\xfe\xa9\x9c\x7f\x0f\xe3\x03\x75\x6a\xce\x56\x38\x69\xc2\x2c\x5f" + "\xd5\x19\xf8\xc9\x09\xc7\xcf\x8e\x2a\xc6\x0f\xfb\x81\xd5\xd0\x5f" + "\xa8\x5b\x3a\x70\xa0\x19\x65\xa0\xce\x09\xfa\x7a\x70\x42\xc5\x39" + "\x4a\x6c\x58\xc1\xf7\xcb\xbd\x7c\xde\x92\x65\x4e\xd0\x2e\x9c\xa9" + "\xaf\x3c\x4f\x66\xee\x37\xde\x03\xaa\x94\xf1\x12\xe7\xad\xdc\x67" + "\xbe\xa4\xcf\xea\xf0\x03\x8f\x7e\xb6\x9f\xe9\x0e\xcf\x03\xe8\xaf" + "\x52\xd4\xa1\x00\x7d\x55\xc7\x4f\x9d\xc7\x5a\xd9\xd7\x89\x3e\x1f" + "\x1b\x08\x07\x1f\x05\xf9\xfe\x57\xb9\xde\xf5\x72\x81\x06\x3e\xe2" + "\xf5\xa0\xbd\xdb\x28\x51\x73\x6d\x2d\xd8\x03\xb9\x59\xb3\x4d\x9e" + "\x75\x4e\xe1\x35\xd2\x5d\xf2\xbe\x8e\x9d\xfd\xfb\x9f\x3f\x1e\xc5" + "\xe7\x41\x5f\xae\x33\xf1\x1a\x52\x99\x37\x43\xa7\xf3\x0c\xa4\x81" + "\xfc\xb7\xea\xfc\xb0\x5d\xca\x05\x96\x23\x83\xcd\x4d\xa0\x17\x37" + "\x89\xdd\x39\xc4\x7b\x49\x89\x9b\x84\x2f\xb1\xc3\x22\x5a\xfc\x4d" + "\xf2\x1c\x70\x8b\x3f\x24\xf7\x92\x10\x1f\x37\xcf\xef\xb3\x40\x8f" + "\x3e\xc6\xb8\x33\xc2\x79\x1f\x8a\xd7\xe8\xe6\xf9\x85\x2f\x73\x9d" + "\x85\xef\xd7\x1c\x23\xf7\x21\xf4\xf0\x16\x2b\xe6\x20\xeb\x7c\x16" + "\xb4\x3d\xd8\x0f\xab\x3b\x27\x9e\xf9\x0d\x69\x53\xfb\xd3\x76\xe7" + "\x98\xdd\x0e\x55\x66\x58\xd8\x90\x4c\x07\xf2\x72\x5f\xe9\x61\x4a" + "\xff\x7e\xc5\xd1\x3f\x3f\xe5\xb3\x10\xdd\x18\x83\x57\xe7\xc4\x69" + "\xdd\x39\xa6\x10\x60\x83\xf6\x53\xe4\x3d\x9f\x41\x9f\x7e\x6f\x16" + "\xdf\xf5\xdd\x4a\x62\xeb\xf2\x34\xa4\x33\x33\x5c\xf6\x2f\xc1\xf7" + "\x8d\x88\x11\xf9\x87\x62\xdf\x3d\x38\xbf\xab\xa1\xf8\x51\xd0\x53" + "\x75\x09\xf3\x73\x28\xf1\xf4\x42\xdb\x72\xd6\x87\x5e\xf9\x82\xf1" + "\x19\x02\x8f\x85\x92\x4e\x2f\x9c\xdc\x45\x71\xc5\xa0\x5b\xb5\x9e" + "\x55\xfd\x35\x37\x78\xd0\xa9\x09\xe8\xb4\xd5\x89\x4c\x37\x16\x2f" + "\x99\x44\xf9\xe9\xc5\xd2\xd6\x6d\x64\xa6\xc7\x1d\xe8\xa2\xa6\x92" + "\x7f\x51\x53\xd0\x5d\x72\xf8\x9c\xcf\xac\x6c\xde\xcc\x80\x5b\x3d" + "\x91\xe3\x9c\xa0\xd5\xdc\x50\x1d\x0d\xb6\xcf\xc0\x73\x6d\xc8\xeb" + "\x93\x6a\xde\x59\x5d\x62\xcc\xb1\xbf\xa4\x0d\xad\xec\x93\x43\x08" + "\x2b\x69\xdb\x26\x7a\x50\x17\xa7\xe8\xb1\xd3\xe4\xf5\xbc\xbe\x57" + "\x5d\x8f\xf9\x4e\xba\x0e\xf7\xac\x0e\xb7\xf5\x52\x70\x99\x66\x9a" + "\xaa\xe5\x1e\x17\xda\x34\xf1\x58\x08\xb0\x43\x23\x27\xa5\x40\xc6" + "\x3b\x9d\x5f\xf0\xfa\xef\xae\x6b\x51\xce\xb1\x96\xe0\x31\x62\xdf" + "\x3e\x7b\x35\x8c\xb5\x67\xad\xa4\xdb\xf7\x39\xcf\xd0\xab\xc3\x34" + "\x61\x4f\xc1\xdc\x9f\xf7\x76\x9c\x2c\xe3\x78\x5d\xa1\x38\x44\x57" + "\xb8\x0b\x3d\xc4\xfe\x28\x00\x63\xc4\x9f\x79\x1f\x0d\x72\x22\x24" + "\xac\xa6\x77\x2e\x40\x6b\x80\xec\x94\xfe\x29\x36\x7f\x7d\x57\xf2" + "\x26\xba\x4b\x98\x2c\xd2\x3e\x54\xdb\x3a\xb7\x0b\x7d\x2b\xef\xa2" + "\xd4\x2a\xbc\x39\x61\xb6\x84\xf1\x28\xab\x9c\x6d\x09\x45\xa2\x77" + "\x4c\x8d\x5c\xc3\x3c\x0d\x7d\xf3\xd5\x43\x1e\x7a\x45\x9e\x47\x28" + "\xe3\xf3\x22\x52\xc6\xee\x1a\xe7\x1b\x31\x9e\x7d\x11\xb3\xcf\xe9" + "\x38\x6d\x4d\xa8\xbe\xf2\x73\xa9\xab\x73\xdc\x90\x16\x6f\x4f\x83" + "\xa8\x1a\x5f\xcf\x67\x23\x75\xd8\x16\xc0\xfe\xa7\xd8\x3a\x1e\x73" + "\xea\x5d\xca\x9f\x69\x15\xbf\xbf\xea\xe3\xf8\x60\x9f\x9d\xf0\x9e" + "\x5f\xd3\xcb\xfb\x0a\xaf\x5a\x85\xeb\xba\x86\xee\x94\xf1\xf5\xf3" + "\xad\xac\x9f\xed\x9a\xe6\x31\xed\x9c\xaa\xaf\x29\x4a\x5f\x1b\x83" + "\xcd\xb7\xc4\x6e\xeb\x70\x37\x80\x60\x6e\x9c\x7a\x8a\x6a\x7e\xde" + "\xeb\x22\x53\x1f\xf4\xca\x5e\x13\xa5\x80\xbf\x12\x2b\x46\x53\x1a" + "\xe2\x46\x9f\xa2\x5d\xe5\x41\x13\xa5\xe2\x97\xe2\xfb\x7a\xde\x30" + "\xc0\x95\xeb\xad\xcd\xe7\x78\xbd\x6c\xd7\x69\xa9\xf7\xed\xa2\xb1" + "\x1a\xe0\xf1\xde\x51\xe5\x68\x1a\xcb\x6b\x9e\x08\xb3\xe7\x86\xd4" + "\x1e\xaa\xb1\xae\xb1\x79\x34\x4d\x88\x2c\x77\x57\xa1\x5a\x13\xad" + "\x91\xfb\x2a\x6b\x7d\xf4\x0d\xcc\xd3\xda\x3b\x69\x77\x9e\x70\xc5" + "\x0b\xf1\x75\xab\x49\xd9\x39\xec\x7e\xc8\x52\xad\xe8\x4e\xee\x19" + "\x82\xde\x78\x4f\x56\xdf\x9f\x8a\x93\x3e\x46\x92\x3f\xf7\xf1\xdd" + "\xd6\x61\x6b\xce\x29\xb2\x1e\xba\x5f\x80\xd0\xe6\x9b\x17\x32\x0c" + "\xae\x4f\xee\x22\xb5\xb7\xc5\x3e\x03\x80\x63\x79\x66\xbf\x6c\x17" + "\x25\xbe\xb4\x8b\x52\x9a\x97\x72\xbb\x76\xab\x3c\x26\x33\x71\x7d" + "\xb5\x32\xe6\x33\xd0\x04\xea\xcd\xe5\x31\x6d\xb4\x04\xcf\x36\x38" + "\x0b\x85\xd6\xb0\x9c\xf5\xda\xdd\xef\x37\xac\x3a\x40\x99\x1d\x41" + "\x75\xbe\x75\x01\xf9\x6a\x01\xaf\x76\x34\xa5\x00\x56\xb3\x3b\x9f" + "\x78\xef\xe3\x86\x86\x55\x07\x19\xf6\x47\x3c\x16\x94\x03\x3f\x6a" + "\x4c\xa8\xd9\xe1\x0e\xb4\x52\x33\xf8\x7b\x5e\x81\x08\x31\x9c\x4e" + "\xaa\xf9\x9a\x6c\xef\x6e\xab\x2d\x57\xf9\x75\x90\x6d\xed\xdf\x33" + "\xd4\xdb\xe1\x3e\xc7\xf0\x6a\x26\xb8\x17\x42\x5f\xd4\xdb\x64\xe0" + "\x5a\xd1\x57\xcd\xb2\x86\x55\xfb\x88\xfb\x87\xd3\xe3\x3b\xc7\x0d" + "\x2d\x26\xf7\x74\x64\xbf\x70\x1a\xc4\xbd\x08\xb8\xb7\x0f\xec\x7b" + "\xf3\x7e\xec\x40\x9a\x9a\x5d\x7c\xb6\x6d\x57\xd3\x6e\xe0\x48\xed" + "\x13\xec\x3e\xcf\x75\xf5\xd0\x6e\xbf\xbb\xf0\x5f\xb1\xed\x5b\xc1" + "\xfb\xa0\xfb\x4d\x2d\x72\xff\xaf\xe6\x93\x79\x41\x4d\x28\x79\xb6" + "\xa7\x5a\x83\x1c\xf0\xe0\xc9\xb2\x40\xca\x93\x49\x6c\x53\xb4\xe7" + "\x55\x4b\x9c\xea\x5f\x6e\x0b\xeb\x2b\xb1\xfa\x38\x6c\x6f\x92\x6d" + "\x7c\xfb\xfb\x98\xef\x85\xd4\x78\x7f\x99\x6d\xf7\xfb\xac\xa4\xe8" + "\x4f\x54\x01\xee\x8b\xba\xee\x56\xad\x8f\x65\xd5\xdd\x49\xa7\xf3" + "\xf9\xac\xa5\x61\x67\x0c\xfe\xcd\xcb\x55\xb6\xe1\x56\x96\x51\xb5" + "\x26\xc5\x3b\x5c\x47\x3d\xef\x0e\x65\xdf\xb1\x27\x07\xf9\x77\xc4" + "\x6c\x6f\x3c\xe4\x8e\x0b\x62\x1a\xed\x61\x3d\x52\x40\x56\x61\x3c" + "\xb8\xc2\xed\xef\xd5\xef\xe4\xdc\x7b\x35\xf4\xf3\x2b\xf8\xac\x95" + "\x51\xb7\xcb\xdb\x47\xdc\xe3\x51\xf3\xa4\xbd\x36\x63\x9d\x4a\xa4" + "\x00\xc7\x2e\x8b\xe0\x73\x97\x7c\x76\xc6\x3f\x62\xbe\xcf\x37\x62" + "\xa9\x4d\xf1\xcd\xde\x0c\xe8\xa9\x52\xde\xe6\x06\x48\xca\x74\xde" + "\x27\xc6\x1c\xec\x0a\x6e\x33\xe0\x60\xfe\x57\x70\x50\x8d\xe7\x0a" + "\xf6\xa0\xeb\x44\x46\xdb\xd0\x26\xd9\x36\xb4\x51\xb6\x4d\xbf\xb3" + "\x0a\x65\x7d\x22\xd7\xde\x2f\xab\x3d\x7b\x95\x8f\xb4\xaa\xf9\x3e" + "\xbe\x8f\xb7\x93\xea\x36\xca\xf3\x34\xe8\x13\xb5\xa7\x52\x3b\x4d" + "\x0c\x7f\x69\xf8\xe5\xc1\xac\x35\x2b\x98\x4b\x6d\x2f\xb3\x7f\x4b" + "\xfd\xde\x3b\xc0\x5e\x22\xb6\x2e\xb5\xc9\xf3\x8a\x28\x8f\xef\x0d" + "\x1d\x90\x43\xb5\x5d\xdc\x57\x93\x0e\x50\xba\xa2\xc3\xda\x13\xbc" + "\x6e\xad\xe6\x8c\xb5\x65\xa0\x7b\x79\x0e\x7c\xc0\x26\x3d\x4e\xda" + "\xa4\x87\xcb\xd8\xcb\xac\xa3\x94\x77\x62\xe4\xdc\x2a\xbc\x17\xc9" + "\x73\x97\xa8\xef\xda\xa0\x21\xff\x6a\x8b\xd8\xbe\xa9\xdf\xb6\x60" + "\x1d\x68\xa5\x58\x9d\x4d\xef\x71\xd5\xf5\xfb\x7f\x94\xf7\x9c\xb9" + "\xc4\x51\x4e\x97\xb9\xee\xac\xb4\x3d\xa8\x94\x7e\x14\x4e\xe9\x67" + "\xf6\xea\xa6\xe8\x6b\x24\x76\x3e\x0f\x80\xbc\x98\xff\x1e\x91\xf3" + "\x7d\xc6\x01\x97\x2d\xeb\x2e\xef\x1a\xab\x2b\x1c\xd8\x43\xaa\x95" + "\x6b\x2d\xca\x46\xb6\xae\xcc\xa0\x11\xb4\xf7\x0a\xe5\x6f\x74\xef" + "\xf9\x23\x13\x48\xd2\x40\xb7\xb0\x0e\xff\x66\x0d\xd3\x64\xdd\xc1" + "\x70\x3c\x65\x06\x35\xa7\x92\x41\xb5\x35\x42\xf2\x7a\x6d\xcd\x97" + "\xeb\x13\xaf\x0d\x33\x74\x11\x85\xe7\x14\xc8\x97\x9f\x1c\x97\xb8" + "\x2e\x6b\xe3\x3b\x77\x2d\x1b\x8a\xd9\x8f\xd5\x6b\x7f\x61\x7f\x61" + "\xc1\xb2\xb6\xea\x10\x9f\xef\xc4\x38\xab\x95\xb5\xed\xef\x2c\x20" + "\x53\x2e\x7e\xec\x77\x8b\xe7\x57\xc2\x09\x5d\x20\x19\xfa\x09\xf8" + "\x7c\xe3\x32\xb2\x3c\x9e\x07\xd8\x4e\x7b\x2a\xfb\xf3\x62\x5f\x5e" + "\xec\x8f\x2f\xe4\xb4\x8f\xc4\xfb\x28\xe8\x73\x29\x22\xb1\xad\x94" + "\x6d\x6f\x42\x2e\x01\x79\xdc\xc6\x3e\xc5\x4c\x6e\x5f\x80\x36\x9e" + "\xa6\x04\xf6\x17\x16\xdc\x3a\xbe\xba\xc5\x7f\x42\xce\x2d\x92\x0b" + "\xa0\x4f\x6b\xf2\x8c\x8f\x55\x1b\x31\xbe\x04\x63\xfc\x16\xd5\xee" + "\xb3\x42\xb5\x5b\xd5\x9b\xeb\x2f\x65\x1c\xe6\xbd\xc5\xb2\xee\x3f" + "\x79\x36\x08\xf8\x5a\xd9\xc7\xfb\x42\x65\x1f\xd7\xa9\x73\xa1\x4d" + "\x54\x5c\x28\xba\xdc\xd0\x8d\xd9\x16\x94\xcf\xfe\xb2\x6d\x0f\xb7" + "\x91\xdb\xc7\x65\xff\xed\xdc\x69\xe9\xff\x2c\x88\x6f\x67\xbe\x9e" + "\xc7\x8b\x3c\xde\x26\xea\x2d\xfb\x58\xb6\xbd\xc5\xaf\xf2\xe6\xca" + "\x77\xe4\x0f\xc7\x83\xde\xe6\x7e\x3c\xa0\xed\xdc\x3e\x6e\x7f\x90" + "\x71\x02\x1c\xe8\x6d\xb5\xf6\xe9\xed\xe4\x36\xfe\x15\xa3\xce\x2e" + "\xb4\x13\x6d\x95\xed\xec\x43\x3b\x8f\xe6\x11\x05\xb6\x65\xd3\x17" + "\xc9\x1f\xd7\xf1\xfc\xd0\xf9\x77\xe8\xd1\x45\x55\x84\x79\xa0\xf9" + "\x8d\xe2\x2a\xd3\x8f\xa1\x9b\x14\xfb\x30\x1f\xf4\x89\x2e\xd6\xf7" + "\xdd\x05\xf8\x05\x6b\xe4\x5d\xc6\x52\x3f\xe6\x7b\x67\x9f\x43\x9b" + "\xb4\x4f\xa8\xb8\x4b\x74\x41\x37\x0d\xb8\x83\x48\x93\x87\xf6\x63" + "\xfe\xd8\xa9\xd7\x9f\xd3\x6e\xfc\x5c\xb5\xcb\x92\x4f\xa9\xef\x3d" + "\x5a\x6a\x72\xb7\x96\x92\xd1\x96\x27\x90\x0e\xed\xb1\x02\x56\x92" + "\xbc\xeb\x01\xed\xdc\x8d\x7a\x06\xc2\xda\xd4\xec\x0d\x00\xe6\x3f" + "\x69\x78\x16\xc5\xed\x3a\x83\x76\x9c\x21\x6b\x55\x31\xf4\xaf\x87" + "\x59\x5f\xfc\x5f\xaf\x5f\x99\x43\x63\x3d\xf4\xda\x01\x25\xe3\xa5" + "\x2f\xa2\xab\x4f\xd1\x4f\x9a\xfb\xfd\x0d\xb1\x0f\xb7\x11\xe3\x6b" + "\x98\x8e\xa4\xdf\x21\x1e\x33\x7a\x40\x33\x6c\x97\xb3\x16\x65\xf4" + "\xd8\x47\xc9\xfa\xb8\xa6\x12\xbe\x13\xf1\xcd\xf7\x50\xa5\xf2\x9a" + "\x00\xf2\x55\x0b\xe0\x8c\xe1\x43\x9f\xdb\xc2\x4f\xc6\x61\xcc\x73" + "\x2b\xbf\xa2\x69\x28\x23\x87\xe7\xbe\xf5\xc5\x3e\xd3\x0b\xbf\xa2" + "\x09\x97\x27\x53\x7e\x12\x1c\x4c\x7e\xf3\x1e\x08\xc3\x43\xdb\x46" + "\x9e\xa2\x7d\x1f\x45\xf2\x98\x4d\xca\x32\x25\x07\xf7\xed\xe7\x7d" + "\x87\xcb\x2b\x77\x9f\xd4\xe1\xd8\x7e\xea\x32\xf3\x1d\x30\xea\x81" + "\xf7\x41\xcf\x5e\x5d\x3e\x1e\x5e\x37\x0f\x06\xab\x7c\xa7\xf4\x41" + "\xe7\xac\xd8\x09\x79\x01\x5d\xe1\x88\x95\xfd\x82\x63\xec\xdc\xe7" + "\xa7\xd5\x7b\x28\xc1\x79\x9a\xd7\x64\xe6\xd2\x91\x9a\x34\xda\x8b" + "\x39\xb9\xe8\xb6\x8f\xdc\x7e\x8e\xed\x28\x94\x0c\x61\x9d\x94\xcf" + "\x65\x8a\xd5\xf6\x94\xca\x9d\x86\x0e\xff\x7a\x73\xd1\x79\x32\xa9" + "\x7b\x57\x5e\x6f\x9a\x65\x13\xc1\x1d\x26\x2d\xaf\x86\xfd\x68\x8d" + "\x9c\x97\xc6\x7e\xb4\x0c\xdf\x54\x52\xf7\x71\x80\xe7\xba\xad\xc3" + "\xcb\x57\xd1\x04\xf6\xa7\x67\xf1\x29\x5d\x4e\x8d\xd7\xaf\xb3\x8c" + "\x4d\xd1\x6d\x07\x52\x94\xbf\xaa\x7d\xb3\x6a\xcf\xa1\x2c\x19\xff" + "\xd3\x89\x21\xcc\x61\x24\xdc\x55\x34\xb6\xe6\x1c\xd9\x59\x0f\xca" + "\xfd\x44\xe9\x6c\x3c\x2f\x9c\xeb\xb5\x88\xd0\x67\x76\xda\x73\x6a" + "\xc0\xdf\x9e\x6f\x35\xfb\xe8\x13\xd6\xc1\xf6\x5d\x2a\x47\x49\xfb" + "\x21\xe9\xe3\x45\xdd\xcb\x47\xb4\x63\x1b\x99\xf9\x1e\x5a\x5e\x17" + "\xe4\x75\x66\x3e\x43\xa4\xc6\x90\x9f\xd6\x18\x7e\xc8\x06\xdd\x93" + "\xac\x52\xf3\x1d\xed\x0a\xcc\xbf\x7c\x3d\x0d\x0d\x6b\x78\xcc\xf8" + "\x69\x07\x9f\x5b\x1a\x98\xe3\xfc\xf4\xcf\x1c\xc7\x61\x6c\x57\x9f" + "\x2e\x71\xf9\xb3\x44\x9e\xf7\xe8\x73\xc6\xf7\x6c\xfd\x61\x4a\x87" + "\xe1\xb1\x8c\xeb\x50\xab\xd6\xa4\x93\x7b\x5c\x3f\xb3\x1b\xe3\x19" + "\x8f\xeb\xea\x0e\xdc\x9f\x4d\xf7\x98\xaa\x07\xbd\x3b\xdb\x58\xa3" + "\x97\x36\x73\xec\x5f\xcc\xf5\xb3\x7c\x63\x7c\x93\x77\x9c\x6c\x1e" + "\x7d\xcf\xea\x75\x34\x66\xfe\xd7\x12\xa4\x1f\x0f\xbe\xcb\x54\x8d" + "\xbb\x3f\xdb\x31\xb0\x37\x97\x2e\xf1\x2d\xef\x2f\xe4\x39\x86\x09" + "\x63\xb0\xf2\xa9\xe7\x55\xe3\xaf\x71\x66\xfe\x67\x6f\x85\x95\x73" + "\xbc\x7f\x1c\x45\x19\x6c\x23\xc2\xf0\x95\x6e\xf2\xb3\x52\x2e\x83" + "\xe7\x56\x6a\x7c\xfd\xd9\xa5\xce\x17\xda\x19\xbf\x9a\x3e\x9f\x74" + "\x7b\x3f\x55\xf8\x75\x50\xfc\xe4\x1d\x64\x7d\xaf\xd8\x63\x4e\x56" + "\xbe\xa1\x2c\xed\xb4\x7f\x1c\xc7\x33\xad\x37\x4c\xe2\xb5\xb8\xfd" + "\x9b\xdc\x3c\x6e\xf7\xe5\x24\xce\xe3\xb9\xbe\xd4\xc5\xf7\x17\x4c" + "\x44\x3e\x84\x8d\x7c\xf7\x4c\xc0\x5c\xb9\x9e\x26\xf0\x3d\xa1\x08" + "\x97\x7b\x5b\xbe\x6b\x9e\xe9\xf9\x66\x2a\x59\xbf\xb9\x83\xcf\x16" + "\xec\xaf\xc6\xfc\x52\xe2\x5b\x96\xbf\x6d\x79\x16\xfb\x13\x7c\xb3" + "\xd7\x33\x44\xf5\xd5\xcf\x6f\xc3\xb7\x7d\xe0\x7b\xff\xdf\x8d\x7d" + "\x01\x0f\xfd\x7c\xaa\xdc\x07\x65\xfb\x69\xf0\x8a\x56\x35\xef\xd8" + "\x80\xcd\xd1\xcf\x6f\x53\x75\xf9\xf9\x6d\x47\x0a\x88\xd7\xbd\x8f" + "\xef\x95\xbe\xc1\x7e\x0e\x7e\xfe\x59\x86\xbe\x1e\x73\x4c\xd2\x15" + "\xeb\xbb\x3f\xe4\x39\xd8\xa7\xec\xdb\xf8\x38\x8f\x13\xb9\x0e\x4a" + "\x97\x3a\x3c\x74\x5d\x0d\xf4\x13\xd6\xfe\xd7\x78\xad\x2f\xa6\x4c" + "\xdc\x45\x24\xf3\x6c\x9d\x67\x93\xf6\x6b\x5b\xf3\xeb\xf1\x4c\x10" + "\x5b\x33\x8f\xe1\xc9\x34\xe7\xc1\x33\x05\xcf\x56\x3c\x53\xc5\xd6" + "\xe5\x55\x4c\x97\x98\xc3\x5a\x31\x4f\xe0\x3d\x55\xeb\x60\xe7\x1e" + "\x19\x37\xee\x2d\xdf\x27\x65\x8f\xfb\x0b\x6b\xb3\x0f\xfa\xd9\x1e" + "\xa2\xd5\x41\xd1\x6b\xfb\x06\x9f\x2f\xfa\x85\xd5\xb9\x87\xed\x60" + "\x7e\xee\x8d\xb4\x83\xf9\x45\x22\x7e\x73\xf0\x03\xd7\xfd\xe2\x18" + "\x7e\xd6\x81\xdf\x2f\x13\x7b\x5c\xbf\xb0\x02\x8f\x52\xc7\xba\x3c" + "\x99\xf8\x0b\xe9\xa7\xad\x92\xe7\x45\x23\x26\x36\xa8\xf6\x2e\x25" + "\x7c\x27\x88\x11\xcb\xd3\xf5\xf6\xfa\xf0\x9d\x62\x73\x62\x5c\x1b" + "\x01\x9c\x8c\x46\x9b\x47\xe4\xd7\x73\x7b\xb9\xbe\xdd\x23\x32\x8f" + "\x85\x9f\xf9\x64\x98\xdc\x7e\xdf\x08\xe4\x03\x2e\xc5\xcd\xbe\x3a" + "\x03\x9f\x3a\x9e\x78\x0f\xca\xd4\x0d\x18\x4a\x0f\x42\x7a\xc0\x30" + "\xd2\xf7\xe3\x1e\xe9\xe4\x3c\x11\xe9\x30\x27\x4e\x30\xce\x93\xf6" + "\xb8\x7e\x69\x7e\x3f\x9f\x74\x9f\x0a\xbf\xb0\xfa\xc3\xf2\xb2\xff" + "\x8c\x58\xf9\x51\x66\x82\x2a\x33\xf3\x58\x27\xfd\xe2\x6b\x7a\xb9" + "\x81\xc1\x78\xa9\xf8\x7a\xe8\x77\x90\x66\x93\xd5\xbc\x6f\xba\x7b" + "\x8c\x9f\xdc\x35\x1a\xc6\xfc\x4c\xc8\x23\xd1\xd0\x49\xbf\x7c\xbb" + "\x25\xd0\x75\x99\xe3\xe1\x2f\xd5\x1d\xa1\xbd\x25\xe4\x2e\xba\x45" + "\xde\x8f\x7d\x86\x0e\xfc\xa7\xdb\x27\xfd\xcc\xf3\xbb\xb4\x07\x67" + "\x9b\x0f\x1e\x1b\x30\xc7\xee\xf7\xd3\xa8\x21\xed\x5e\x0e\x47\x98" + "\xdb\xef\x93\xfe\x1c\xfb\x6d\xd2\xb7\xcd\x6d\x55\x3c\x75\xe0\x35" + "\xe9\xcb\x81\xeb\x1b\xbc\xaf\x81\xeb\xac\x55\xcd\x6d\xe5\x36\x38" + "\x31\xff\x73\x07\x7b\x1a\x98\x27\x6c\x6b\x78\xad\xf0\xc0\x46\xd0" + "\x9d\xd0\xb6\xce\x6d\xbd\xbc\x36\x1c\x90\xe7\xe7\x9d\x41\x71\xc6" + "\x37\x62\x2e\xaf\x31\x9b\x2a\x8b\x87\x24\xcc\xac\x11\x0d\xdd\x23" + "\x33\x21\x63\x0f\xd4\xbd\xef\x50\x7d\x73\x99\x70\xeb\x8c\xb6\xef" + "\xd5\xdb\x8e\x30\x49\xfb\x93\xab\x95\xff\x4a\x7c\xb7\x0e\xba\x66" + "\x85\x7e\x66\x7d\x80\xed\x65\x15\x2e\xde\xb0\xf7\x8f\x0d\x97\x55" + "\x8f\x37\xec\x5f\xa1\x8c\x3e\xbd\x8c\xb2\xff\x62\x19\x65\x97\x2a" + "\x03\xb2\xe1\xda\x53\xf4\x2b\xeb\xe5\xcf\x1d\xdf\x90\x77\x04\x41" + "\x7e\xfa\x94\xcc\x7c\xf3\xc5\x10\xe6\x6f\xc1\x94\xa5\x24\xef\xb2" + "\x32\x51\x09\xfb\xf2\x0c\x56\x4d\x6c\x68\x76\xf4\x52\xc3\x9a\x7f" + "\x50\x07\xfd\x4a\xde\x99\xdb\x5c\xc8\x73\xb6\xe5\xe9\x7d\xdb\x32" + "\xb3\xfa\x4c\x6f\x48\x3a\xdb\x83\x7e\xd8\x1d\x46\x67\x2d\xfe\x7f" + "\x90\x7b\x21\xaf\xaf\x1e\xe3\x75\xed\x74\x31\x62\x29\x69\x90\x0d" + "\xd0\xd1\x43\x12\x1f\xd0\x5f\xe4\x7c\x0b\x73\x36\x39\xdf\xf2\xc9" + "\xb3\x8e\x49\xd2\x47\xa7\xab\x20\x9f\xd7\xbe\x43\x7d\x39\xb6\x1e" + "\x17\x65\xb1\xef\x4e\x5e\x77\x16\x89\xde\xa9\x99\xc1\x78\x21\xe7" + "\x53\xd0\xfd\xd9\x77\xa7\xdb\xef\xa1\x10\xf4\xe8\x9a\x0b\x94\x5a" + "\x03\xdd\x13\x32\x3b\x85\xe5\x7a\xad\xee\xbf\xb3\xfc\xc2\x80\xff" + "\xce\xbd\xbc\xd6\xd3\x8a\xf7\x0b\x64\x0e\x6d\x9d\xdf\xb5\xfb\x02" + "\x8d\xdd\xb3\x86\xec\xbb\x79\x2d\xef\x3f\x95\xee\xc3\x7a\x85\xf4" + "\xe5\xb9\xd2\xce\xeb\xf9\x03\xba\xcf\x5a\xbb\x29\x4c\x6e\x99\xe5" + "\x1a\xc8\x65\xe1\xfb\x4d\x39\x0e\x06\xab\xe6\xd9\x82\x29\xf9\xf5" + "\xc0\x1d\xc6\xb2\x5f\x95\x02\x7f\x31\xc7\x15\xc3\xa6\x6b\x47\x98" + "\xff\xd5\xf7\xc7\x2a\xf9\x0e\x58\x4d\x83\xd1\x44\x68\x77\x0e\x4d" + "\xf6\x52\x9a\xb2\x8f\x18\x86\x31\xb1\x3e\x8d\xf7\xe2\x8b\x9f\x25" + "\x6b\x68\xf7\x82\x38\xe7\x6b\x14\xcf\x77\xa7\xf3\xaf\xf8\x73\xd1" + "\x35\x39\x9f\xd2\x78\xff\x81\x6d\x28\x6c\x1b\x64\xfa\xb8\xb1\x45" + "\x14\xb1\x17\x93\xa1\x8c\xac\xee\xb0\xad\x2e\x5c\xb4\x8e\xad\x1b" + "\xd6\x2e\x2b\xcc\xb3\x3d\xf5\xfc\xaa\x55\x7c\xe2\x73\xee\xcc\xac" + "\xc8\x33\x9d\xe6\x0a\x8c\x0b\x96\x4d\xb3\xb3\x2d\xc1\x0c\x9b\xf2" + "\x9f\xfb\x56\x75\xd8\x3d\xe7\xfc\xad\xee\xd3\x28\x3b\xd7\xc4\xe3" + "\x36\xc7\xab\xef\x6e\x87\xb2\xb9\xaa\x97\xe3\xbd\xb6\xdb\xba\x4f" + "\x9d\xa1\x7c\xeb\x7e\xb6\x65\x50\x74\xaa\xf2\x2a\x3b\xf5\xfa\xe9" + "\x6a\x2f\xbf\xbe\xab\xdf\x76\xa1\x4a\x8d\x25\x6c\xbb\xc0\xfb\xc9" + "\x8a\xf7\xde\x4a\x30\x78\xaf\xc7\xf5\x56\x2a\xf4\xa7\xaa\xcb\x97" + "\x39\x6f\xa5\xca\x3a\xaa\xb3\xb2\x5c\xa7\x4d\x61\x3e\xe6\xae\xe8" + "\x6f\xc3\x6e\xeb\x4f\xd5\x7a\xf7\x5b\xaf\x72\x7d\x3d\x54\x7f\x34" + "\x2c\x7c\x0c\xda\x76\x54\x85\xbf\x95\xc3\xf9\x63\xe2\xf9\xfe\x15" + "\x4f\xad\x7c\xb6\x60\x51\xe1\xb2\x27\x97\xe5\x2f\x2b\x5c\x27\xdd" + "\x5e\x4c\x90\xff\xee\x1d\xb7\x38\x5b\x1a\x0a\x84\xeb\x71\xbc\xee" + "\x61\xf8\xdd\x52\xeb\x4e\xbf\x1e\x2f\x6d\x25\x2f\xaf\x7d\x7e\xb5" + "\x26\xf8\xeb\xa9\x1e\xd3\x2b\x45\x03\x36\x27\x2a\xbc\x3b\x65\x79" + "\x95\x6d\x34\x4d\x6f\xa7\xdf\xe6\xf0\x7e\x13\xf0\xec\xe1\x71\xa9" + "\xa2\x97\xc7\x8f\x2e\x6a\x0e\xde\x42\xaa\x7f\x7e\xfd\x3a\xfb\x19" + "\x66\xdb\x35\xe0\x7e\x5f\x3b\xbe\x65\xfb\xcf\x5a\xf7\xf1\xf9\x26" + "\xb1\xd2\xfa\x53\xa6\x05\xae\x1f\x70\xb7\x5b\x88\x9c\x5d\x62\x65" + "\xde\x6e\x71\x36\x6f\x17\xf4\xb5\xae\xbd\x3b\x45\x07\xea\x70\x08" + "\x78\x5b\x18\x6e\xfb\x53\xae\xee\xb8\xef\x50\xb8\xfe\xf5\x7f\x40" + "\x56\xdd\x8e\xdf\x35\xa2\xac\xed\xa8\xc2\xeb\xaf\xe5\x1e\xc2\xdc" + "\x3c\x71\x76\xc0\xb7\xc5\x6f\xf8\xbb\x0f\x3f\x4d\x94\x9d\xe8\x0a" + "\xdb\xe3\xe4\xb8\x89\xa2\xe2\xc4\xa7\xac\x6f\x2b\x9a\xfb\xcd\x6d" + "\x6a\xcf\xf3\xc4\xa7\x3e\x67\x5e\x3c\xf2\x84\xa4\xbd\x99\x6c\xd3" + "\x6f\x16\xb9\xb7\x5c\x60\xfb\x07\xbf\x9e\x77\x21\x7f\x37\x2c\x67" + "\x1d\xfb\x37\x21\x61\x72\x0a\xde\x17\x75\x77\x05\x49\xb7\x67\x02" + "\x6d\xbe\xb5\x8f\xef\x20\x67\xfa\xdc\xbb\x8d\x12\xaa\x46\x12\xf4" + "\xae\xdf\xf4\xfb\x3f\x11\x29\x4a\x0f\x62\x5a\x65\x3f\xe9\xd2\xf6" + "\x01\xfa\x06\xc3\x67\x5a\x05\xdc\xc3\xbc\x6f\xaa\x68\xf6\x37\x47" + "\xff\x6b\x34\xfb\x1b\x49\x7b\x93\xcb\x68\x21\xef\x35\xb0\x3d\x00" + "\xfb\x11\x87\x1c\xb5\x2b\x3e\xfc\xed\x14\x69\xef\x00\x59\xcf\xfb" + "\x58\xb5\xc5\xd0\xdf\x12\xbd\x13\x58\xef\x0c\xba\xa8\x84\xf7\x9c" + "\xb5\x0b\xa7\xeb\xd9\x4e\x40\x9e\x1f\x95\xfe\xf7\xff\x4a\xb5\xe7" + "\xc9\xdc\x41\x07\xd3\x79\x6f\x64\x00\xd7\x07\x5f\x66\x18\xa2\xe2" + "\x83\x85\x96\x22\x53\x29\xc3\xd0\x2e\x9c\x99\x66\xe4\x83\xae\x35" + "\x94\xf3\xb5\xd3\xc1\x75\x32\x1f\xa7\x95\x7e\x6f\x52\x16\x40\x17" + "\xb7\xc9\x32\xd5\x77\x96\x80\x7c\x0c\x5e\x08\xd5\xe3\x3d\x9b\xf1" + "\x84\x67\x8e\x5c\x93\xef\xb3\x92\xf4\xb7\x94\x32\xbe\xde\xed\xf9" + "\xb4\x41\xd6\x87\xed\xad\x0b\x31\x96\x48\x3d\xfd\x60\xf3\xde\x4f" + "\xc8\x5c\xb0\x9c\xfb\xf3\xb7\x0b\xa5\xae\x7a\x86\xf6\xab\xfa\xfd" + "\x76\x51\x77\xc5\xc7\x75\xdd\x29\xf3\x3c\x7e\x53\x02\x1d\xb1\x06" + "\x78\x0c\xab\x3a\x62\xed\x85\xfc\xf8\xad\xdd\x13\xff\xaf\x63\x4a" + "\x47\x54\xf9\x78\xff\x9e\xe9\x31\xde\x9a\xe2\x44\x7c\x86\x61\x5b" + "\xc3\x74\x58\x8e\x38\x0f\x1d\xb4\x31\xde\x3c\xf4\xeb\xc5\x2d\x5e" + "\x75\xfe\x06\xdf\x57\xb0\x4f\x05\x89\xeb\xcd\xcf\x74\x59\x36\x35" + "\xf0\x19\xdf\x69\x96\x60\xba\x89\xf7\xe7\xd9\xb7\x03\xfb\xbb\x60" + "\xff\x0e\xbc\xc6\xaa\xc7\xa7\x45\xc5\x4f\x30\xe2\x51\x6e\x83\xe1" + "\x97\x81\xfd\x66\xb1\xed\x47\x48\xb7\x07\x95\xfe\xa4\xce\xa9\xfd" + "\x6d\xb6\x07\xe5\xf5\x5d\x3e\xd7\xca\x7b\xd0\xc8\xd7\x7f\xfe\x57" + "\x9d\xe7\xfa\x5d\xbf\xfd\x1b\xde\x53\xfb\x6d\xb7\x80\x8b\xee\xaa" + "\x79\xad\x7e\xf0\xb6\xbf\x6a\x9e\x15\x71\x69\x18\x5b\xf6\x5f\x72" + "\x4e\xce\xfe\xb7\x9f\x27\x93\x96\xec\xcd\x61\x3f\x2c\x47\xfc\xa4" + "\x9f\x65\xff\xdd\x56\xdd\xef\x41\xfc\x19\xfa\xdd\xdc\x81\xbd\xe0" + "\x90\xbe\x8e\xf9\xbb\x43\x4a\x8f\xfe\xdd\x21\xb9\x8e\xb9\x6d\x5e" + "\xc3\x4f\xd6\x07\x4c\xf5\xeb\x3d\x26\x75\xbe\xe5\x77\x07\x3c\xf4" + "\xae\xc7\xb0\x4d\x42\xba\xfc\xc1\xfc\xeb\x61\xdc\xc8\x50\x30\x7f" + "\xff\x9a\x1c\x27\xfa\xe7\xa5\xbf\x57\xf7\x1e\x6e\x1e\xbd\x50\x63" + "\x1d\x66\xe4\xc4\x63\xd2\x36\xa6\xe0\x1c\xaf\x67\x5e\xa1\xe6\xc8" + "\x2a\x8d\x6e\xcf\x7b\xd5\xa9\xc8\xef\x91\xfc\xad\x70\xf6\xfb\xe9" + "\xc6\xde\x48\x85\x49\x63\x1f\xec\xc2\x59\x27\xfc\xee\x02\x3f\x41" + "\x3f\xf6\xb9\xa1\x13\xa1\x0c\x51\xb0\x8a\xef\x48\xf8\xfd\x73\x8c" + "\x7b\xc5\x53\xbf\x97\xfb\x17\x9a\xeb\x2e\xe1\xe4\x79\x81\x8f\x6d" + "\x73\xce\x11\xd2\x8d\x40\xba\x3d\x8d\x45\x5e\xb6\x2f\xb2\xb1\x5f" + "\xcb\x0e\xbd\x6c\x5f\xd2\xb9\x8c\x6f\x26\xd2\x42\x94\x59\xef\xa1" + "\x1f\x1e\xba\x7c\x3e\xff\xfd\xe0\xfb\xb3\xfd\x3a\x4b\x3a\x0d\x36" + "\xcf\xe4\x75\x84\x49\x28\x7f\xae\xe0\xfa\x1f\xda\x13\x34\x05\xa8" + "\xcf\x34\x54\x7c\xab\xc4\x01\x39\x30\x54\x84\xd6\xa3\xbf\xba\xad" + "\x98\x87\x34\x51\x4b\xb0\x51\xda\xee\x80\x87\x2d\xc5\x7e\x71\xce" + "\x1d\x3c\x28\x6d\xb8\xd5\x38\x7d\xe8\x65\x77\xf0\x1d\x6a\x29\xf0" + "\x51\xc3\xaa\x7f\x40\x97\x38\x24\xfd\xe5\x4d\x2a\x28\xa1\x89\x67" + "\x64\x7c\xba\xd2\x5f\x0e\xd5\xe8\xcf\x7c\xf6\x7f\x1a\x5e\xa7\x7b" + "\x9f\x5f\xf1\x54\xe1\xb2\x95\x2b\x26\xce\x59\xb2\x66\x49\xbe\xed" + "\x61\x65\x56\x19\x31\xde\x25\x0c\xf8\x7a\x7f\x3b\x8f\xc7\x22\xd6" + "\x21\xd9\xe7\xfb\xa5\xfc\xbd\x1b\xbe\xde\xa1\xcf\x8d\xe5\x75\xd7" + "\xff\x49\x7f\xef\x86\x8e\xc8\xbe\xde\x07\xf6\x20\xfe\x60\xef\xe7" + "\x01\xed\xbd\x1e\xfe\xe6\xf1\x4f\x73\x1d\xda\xcf\x7c\xb4\x57\xea" + "\x2d\x6f\xd7\x85\xfb\xc3\x62\x9d\x85\xd7\xad\x10\x7e\xc8\x38\x4b" + "\x0d\x5a\xc4\xb8\xf1\xf6\xd1\x81\xb3\x5d\x6f\x1f\x07\xde\x52\x15" + "\xff\xca\xb4\x1d\xc6\x5e\xbd\x7e\xc7\x9e\xb4\x2d\xd0\x5c\x9a\x4d" + "\xad\x8f\xbd\xfd\x9f\x7b\xb5\xa1\x09\x6a\x6f\xe6\x0f\x29\xc6\xb9" + "\x41\xc5\x9b\xef\xe9\xbc\xf9\x07\xfb\xa5\xec\x29\x06\x78\xe3\x0f" + "\x8b\x07\xf8\xfa\xa4\x91\x77\xf1\x97\xd9\x62\xe8\xf3\x94\xab\x4f" + "\xd1\xe1\x75\xbc\x66\x86\xf7\xeb\xf0\xbe\x88\x61\xa9\x33\x14\x87" + "\x67\xe8\xef\x28\xe3\xf0\x38\xfd\xfd\xeb\x78\x4f\xd2\xdf\xa1\x4f" + "\xfd\xf1\xbc\xfe\x0e\x9e\xfd\xe3\x09\xfd\x3d\x15\xef\x7f\xd6\xdf" + "\x21\xf3\xff\xf8\x86\xfe\x3e\x0a\xef\x2f\xeb\xef\x5f\xc3\xfb\x46" + "\xfd\x1d\x3c\xf8\xc7\x25\xfa\xbe\x76\x42\x27\xfd\xf1\xa1\xcb\x9f" + "\x37\xfd\x71\x8c\xd2\x93\xfe\xb8\x00\x3a\x93\x3e\x66\xf4\x87\x15" + "\xa0\x6f\x1a\x0c\xfc\x22\x9c\xcf\x9a\x24\x20\xbc\xd4\x43\x3f\xdd" + "\x1f\x16\x6e\xd6\xd3\xd7\x41\xce\x4d\x1f\x08\xff\x43\x40\x0f\x87" + "\xfe\xf3\x46\x53\x58\xb8\x57\x0f\xc7\x9c\xe1\x77\x8d\x61\xe1\xfa" + "\x3e\xee\x1f\xf1\x5e\xd7\x16\x16\x7e\x5c\x85\x1f\x26\xc3\x8e\x44" + "\x0f\x3f\xaa\x87\x5b\x3d\x54\x5d\x16\x16\x7e\x58\x0f\x87\xfc\xff" + "\xc3\xd4\xb0\x70\x75\x57\xbd\x3c\x6f\x68\x11\x47\x8a\x98\xb7\x0e" + "\x67\x7b\x68\x6f\x51\x58\x9a\x7d\x7a\xde\x7c\x0f\xed\xd9\x17\x16" + "\xae\x9f\x55\x3d\xbc\xc5\x43\x9f\x05\xc3\xc2\x07\x9d\xcf\xc6\x55" + "\xd3\xc2\xc1\xd6\x96\xf9\x4e\x32\x69\x0b\x2b\x75\xd2\x77\xde\xe7" + "\xb3\x88\x96\x3d\xa2\xdd\x56\x2c\x44\x3b\xbd\xb3\x5f\xb7\xdb\x1c" + "\xc3\x76\x74\xea\x4c\xe7\x3b\x55\xf2\x9c\x1f\xeb\x99\x7c\xce\x73" + "\xbd\x0c\xbb\x5a\xea\x43\x8e\x12\xe5\x77\x55\xd9\x18\x7b\xe5\x1a" + "\x8b\xbe\xff\x8c\x34\x33\x58\x97\x66\x38\xbc\x0e\xeb\x2e\xec\x95" + "\x76\xaf\x3c\xc7\xe5\x30\x5e\x6b\x90\x67\xff\xc2\xe6\xba\x4a\xee" + "\xbf\xf3\xbe\xc6\xbe\x19\x5c\x6a\x3d\x86\x79\x91\xd3\xb3\xcd\x54" + "\x78\x5a\x0f\xbd\xd3\xc0\xcf\x78\xeb\x88\xff\xd3\xe3\x7a\xa7\x6e" + "\xe0\x3c\xda\xe1\x80\x1e\xfe\x4f\x84\x1f\x0a\x0b\xef\x18\x54\xb6" + "\x43\x0e\x8a\xc4\x0f\xf6\xf7\x5d\x10\xfe\xe0\x05\x11\xa8\xf8\x10" + "\xf5\x5e\x2a\xcf\x56\x7d\x23\x54\xf6\xc1\x21\xdd\xcf\xc9\x47\xc1" + "\x35\xc2\x07\x99\xcd\xf7\x89\x5c\x39\xcf\xef\xa3\x79\x05\x10\x95" + "\x4f\xb2\xfd\xe3\x79\xe9\xf3\xcb\xe9\x65\x5f\xeb\x6c\x53\xe7\xe7" + "\x7d\xbb\xc4\x16\x8c\x71\x7b\x97\x72\xfc\x09\x9a\x9b\xe7\xa3\xe6" + "\xbc\x10\xed\x05\xec\x3d\x4f\x1a\xf6\xac\xef\xf6\x9f\xff\xe1\x3a" + "\x70\x79\x4e\x79\x2f\xd0\xbb\xd2\x3e\x82\xef\x3d\x14\x5b\xf3\x1b" + "\xc4\x9f\x58\x97\x9d\xeb\xf9\xff\xd8\xfb\x1e\xb8\xa8\xaa\x6d\xff" + "\x3d\xc3\xa0\x64\xfc\x19\xb9\x68\x53\x59\x8d\x46\xef\x4e\x65\x45" + "\xf7\xda\xbb\xd6\xb3\x17\x95\xf6\xac\xeb\x1f\xea\x69\x97\x8a\x14" + "\x4d\x0a\xbd\xa8\x93\x22\x21\x22\x20\x1a\xd7\xbc\xfc\xd3\x8b\x5e" + "\x2c\xd4\xb1\x57\xef\x51\xf9\x87\xde\xb3\x77\xa9\xeb\x9f\x31\xb1" + "\x50\xf9\xa7\x69\xa1\xa1\x8e\x04\x88\x34\xda\x08\x23\x0c\x30\x73" + "\xce\x6f\xad\xbd\xcf\x99\x33\x67\x98\x01\x86\x34\xeb\xf7\x2e\x9f" + "\x0f\x9f\x33\xfb\x9c\x7d\xf6\xd9\x67\xaf\xb5\xbf\x7b\xad\x75\xd6" + "\x5e\x2b\x64\x05\xd1\xc2\xda\x5e\x00\xbf\x6b\xd8\x3f\x5c\x83\xf3" + "\xde\xde\x89\xcd\xe5\xbd\x35\x4c\x27\xac\xd3\x31\xbc\xd8\x5b\xc3" + "\xbf\x8b\x7a\xd3\x5e\xfc\x1e\x5a\x0a\x72\xb3\x47\xbf\xb8\xe5\x9b" + "\x88\xb2\x3b\x17\x64\x93\x4b\xa5\x4a\x86\x4f\xfb\x8c\x9c\x32\x60" + "\x05\xda\x7b\x69\x4e\x90\x5c\x73\xfc\xb6\x05\x36\x65\x65\x4a\x03" + "\x59\x76\x33\xd1\xc4\xd8\x70\xbf\xc0\xbe\xc7\x83\x13\x31\x7e\xec" + "\x14\xa8\x4b\x94\xff\x03\xd7\xf7\x2e\x28\x55\xda\xa9\xbc\xb2\xcf" + "\x48\x6d\x84\xd9\xe6\x71\xb8\x86\x54\xd7\x3a\x70\x1d\xa0\x72\x32" + "\xe0\x7f\x80\xe3\x8d\xf8\x50\xfb\xe2\xf8\x1b\x37\x2d\x22\x81\x8e" + "\xc5\xba\xb0\xbf\xb4\x93\xb1\xe2\xfa\xb3\x29\x09\xd6\x94\x0e\xcd" + "\x90\x3c\x58\x53\xd0\xf6\x10\xac\x50\xd3\x6f\xa1\xf8\x9b\x53\xfe" + "\x47\xf3\xe6\xa4\xde\xf3\x1b\x39\xde\xd0\x29\x31\xbe\x38\xf6\xc5" + "\xd3\xbb\x66\x83\x9e\xed\x10\xf6\x42\xa7\x35\x92\xe1\xfa\x57\x89" + "\x32\xf8\x0a\x6f\x6c\x49\x20\x4a\xcc\x09\x93\x16\x47\xed\x7b\xfe" + "\x95\xf1\x76\x52\x9d\x7c\x8a\xa4\x2d\x42\x1a\x19\x87\xa1\x9c\x86" + "\xfe\xac\x50\x5f\x0d\x5c\x7f\x57\x88\x0d\xd6\x0c\x1b\xc8\xd2\xf3" + "\x50\x77\x34\x3e\x6c\xa5\xf1\x8d\x8d\xb8\xf7\x19\xe4\xfd\x27\xf0" + "\xdc\xf4\xf4\x46\xea\xbb\xa2\x65\x73\xcb\x18\x81\xe5\x74\xdc\x9b" + "\x1d\x7c\x59\xbf\xa3\xcb\xe6\xcf\xf4\x24\xe3\x83\xc2\xfa\x50\xc2" + "\x74\x32\x63\x84\x37\xde\xe5\xb2\xcf\x96\xf3\x18\x07\xbf\xc8\x4e" + "\xa6\x58\x79\x13\xfd\xce\x8c\x31\x29\x92\x1f\x33\xf2\xed\xf9\x84" + "\xed\xa3\x34\x5e\xe1\x72\xce\x96\xb3\x98\xa4\x46\xd1\x47\x4c\xc5" + "\xe7\x9c\xad\xa5\x36\xf6\x9c\xb3\xcd\xd4\xe6\x9c\x73\xd6\xb6\xf2" + "\x16\xf4\x47\x37\x5a\xdb\x82\x4c\x80\xd1\xc6\xf2\xb6\xe0\x76\x8f" + "\xf1\x51\x59\x6e\xe7\x3a\x9b\xf6\x76\x12\x86\xdf\x3a\xd0\x1f\x7c" + "\x0b\xf3\x03\x87\x67\xec\x47\x3f\x73\xbc\x76\x47\xbd\x9e\xf8\xa1" + "\x7d\x18\xce\x4d\x78\xa0\x88\x68\xa1\xaf\x41\x7c\xe0\xd9\x62\xea" + "\x7b\x97\x7d\xb6\xb4\xda\xcc\x1b\xd1\xe7\x93\x7d\x93\xfa\x5c\xc5" + "\x07\x9d\x2d\x16\xea\xaf\xaf\x32\xc3\x3b\x04\x9e\x4d\xae\xb6\x5d" + "\x14\x64\xc2\xfd\x05\xd0\xc7\x64\x3e\xfb\xec\x6a\x16\xe3\x60\x7f" + "\xa3\x88\xab\x8c\x47\xf7\x9f\x14\x78\xdd\xc6\xc6\xed\x73\x95\xb0" + "\x5e\xdd\x81\xbf\x61\xed\x8e\x60\x3e\x14\xfb\x6b\x44\x19\xd9\x24" + "\xd4\xc1\x7b\x4c\x64\xff\x2e\x86\xb5\xfb\x2d\xf0\xee\xab\xd9\xf5" + "\xfd\x05\x78\x0e\xde\x0f\xc6\x63\xff\x68\x7c\x2f\x6f\xd8\x4a\xc7" + "\x22\x95\xf8\x41\x9f\x0b\xd1\xd7\x17\xe5\x94\x6a\xeb\x63\x46\x96" + "\xb7\xf4\x40\x0e\xdd\xeb\x0d\xcf\x01\xfa\x28\x11\x37\x71\x6f\x3a" + "\xb6\x27\xf5\xff\xf3\xd7\xc5\xbe\xe0\xf3\xf0\x1a\xbc\x6b\x32\xd2" + "\x13\xc6\x6a\x35\xd6\x41\xba\x36\xe9\xd1\xf6\x74\x05\xc6\x0c\xfd" + "\xb8\x0e\x14\xe1\x98\xb0\x31\x3b\x40\xf7\x1a\xe7\x39\xe9\x70\x60" + "\xbe\x7c\x3c\x58\x99\x0b\x04\x6c\x58\x84\xfe\x3c\x07\x8a\x84\xf1" + "\x33\xb3\xe7\x1f\x78\x9a\x8e\x17\xbb\xa6\x70\xb9\xf7\x36\x67\x5d" + "\x96\x23\x57\x89\xdf\xc6\xf1\x5b\x09\xe3\xd7\x03\xa3\x5d\xee\x1b" + "\x3d\xf3\x32\xc8\xc8\x20\x43\x62\x4e\x53\x1c\xf3\x8e\xcc\x03\x91" + "\xd2\x78\xb3\x76\x3c\x3c\xe3\x76\xf1\x19\x50\x87\x88\xfd\x04\xfa" + "\x08\x6b\xf0\x81\x55\x12\x4d\x3e\x7f\x4f\xbc\x6f\x33\xdd\x2f\xf6" + "\x79\x14\xee\x73\xf5\x88\x83\xf8\x4d\x0e\xa4\x8a\x2a\xfb\x63\x46" + "\xca\x8f\xe4\x80\x1d\x7d\x95\x61\x5c\x0b\x19\x0f\x1d\x30\xb1\xb5" + "\xf0\x00\xfd\x5e\x8f\xdf\xbb\x58\x4c\xdb\x03\xa0\x3b\x7d\x2e\xc4" + "\x7e\x28\x0b\x60\x7d\x28\x43\x1e\x20\xee\x7a\xdd\x13\xb3\xe6\xd0" + "\x0d\xdd\xf7\x2d\xd1\xbb\xef\x1d\x0b\x90\xf6\xee\x96\x8d\x77\xd9" + "\xfb\x9c\xc0\xc6\xbb\x2c\x1f\xf4\xd4\x5d\xb9\x2c\xf6\x71\x69\x2e" + "\xd0\x2c\xfd\x0a\xb9\x05\x73\x01\xa5\xe9\xf9\x96\x2a\x3d\xe8\xd6" + "\x81\xe6\x55\x80\x17\xab\xd3\xae\x90\x21\xe8\x0b\x83\x78\x83\xbe" + "\xb6\x7c\x10\x9c\xcf\x31\xaf\x96\xf6\x57\x7e\x39\x0e\x74\xdb\xe2" + "\x1c\xd0\x65\xd3\x2f\x92\x5b\x98\x6f\x4b\x59\xa5\x60\x2f\x7c\x9b" + "\xcb\x36\x67\xe3\xde\xdd\x2a\x78\x2b\x3e\x3d\xfe\x6d\x2e\xc7\x9c" + "\x0d\xed\x16\xa5\xcf\x27\xa1\xb8\xbe\xa1\x0f\x35\xe3\x99\x2f\x47" + "\x40\xbb\x45\x18\x57\x8f\xe3\xa3\x15\xf0\x7c\x13\x17\xd8\x3a\x3e" + "\x87\x23\xd4\x77\x1f\xf8\x4c\x59\x4f\x0e\xde\x06\xcf\x37\x61\x8e" + "\x52\xb4\x03\x55\xdb\x6c\x18\xfb\xc3\x04\xd7\x82\xe1\xda\xd3\x70" + "\xe4\x30\xc6\x1e\xc6\xec\x87\xf6\x35\xd8\x3e\x3c\xcb\xc4\xfa\x4e" + "\x63\xdf\x98\xa0\xde\x72\xac\x23\xc6\xee\xe3\xd2\xa3\xfd\xf0\x3a" + "\xee\x05\x77\x60\x0e\x0c\xa0\x3c\xbb\xa7\xd6\x79\x8f\x20\x3f\xc3" + "\x5c\xfe\x72\x18\x9f\xdb\xae\x85\xba\xa5\xe8\x2b\xcc\x64\xd9\x2f" + "\xd5\xc2\x5c\x07\xf9\xf8\xcb\xa1\xc2\xef\x40\x67\xdd\xf4\x68\x92" + "\xd6\x49\x34\xf4\x7b\xf7\x1b\x7e\x80\xbd\x5f\xc4\x63\x3e\x0d\x97" + "\x36\x1f\xc5\xf6\xb2\x31\x26\x60\x1c\x09\x04\x5c\xbe\x11\xfa\x8d" + "\xb9\x70\xce\xa1\x0d\x5d\x18\x9b\x71\x40\xa7\x92\x3c\x16\xf7\x71" + "\x57\x0e\xf0\x7e\xda\x72\x90\x07\x96\x93\xc0\xe5\x0e\x32\x02\xdf" + "\x13\xe8\x86\xf6\xb1\x30\xd4\xdd\x70\x6c\x04\x1a\x02\xcd\x2f\xaa" + "\x96\xc7\xf3\x0d\xcb\xcd\x7c\x73\x65\x7c\x2d\x81\x75\x26\xb4\x4a" + "\x5f\x83\xf1\xe7\xcf\xe1\xbb\xa2\xed\x0f\xc6\x14\x28\x0b\xcf\xc8" + "\xb9\x48\xf3\x28\x53\x3b\x81\xb2\x2c\x4c\xdc\x3b\xb6\x99\xee\x2f" + "\xfb\xc2\x99\xff\x0c\xfa\x52\x26\xf4\xa5\x9c\xc3\xdf\x49\x74\x0f" + "\xea\x10\xd4\x7f\xd0\xa6\x31\x73\xa9\xc1\xb9\x77\x86\xd9\x06\xbe" + "\x28\x77\x89\xbd\x46\xef\x45\x1b\x01\xde\x3b\xd5\xce\x5f\xc9\x13" + "\xea\xe2\xbd\x53\x97\xce\xe4\xf1\x5e\xb8\xc7\xee\xbc\x47\xb6\x8f" + "\xeb\x20\x93\x2b\x60\x6c\xf1\xb7\x05\xc6\x52\xf0\x6d\xd3\x32\xbf" + "\x84\x2f\xc7\x88\xbe\x00\x30\x7f\xcc\xc8\x4f\x9e\x63\xc6\x7f\x19" + "\x23\x8f\x83\x55\x3e\x1a\x63\x74\xc1\xf9\x44\x31\x5e\x15\xfc\xce" + "\x80\x36\x98\x7f\xa5\x4b\x1c\xba\x5c\x97\x98\x96\xe9\x16\xfe\x3b" + "\xe4\x13\xc0\x15\x3f\xa0\x65\x05\x9f\xd3\x3a\x9e\xed\x85\x2b\xbf" + "\x0d\xfb\x59\x4f\xbe\x44\x8c\x0b\x61\xf1\x32\xbe\x3c\xcd\xf0\xe3" + "\xb4\x66\xaa\xc3\x1e\x62\x82\x67\xe2\xbe\x2e\xa9\xfc\xe5\x71\xc0" + "\x13\x35\xdc\x1b\xc4\x62\x3e\x7e\x59\x21\xaf\x4f\xaf\x67\xb8\x95" + "\x23\xdd\xca\x5a\x2b\xcc\x1b\x6f\x3e\x0f\x39\xb7\x50\xfb\xe1\xb8" + "\xe0\x15\x44\x9f\x7e\x81\xf8\x01\xaf\x34\x62\xdf\xaa\x9a\xcd\xf8" + "\x4e\x21\x7c\x66\x04\x41\x3b\x28\x95\x2d\x61\x4d\xaf\x0f\x87\x3a" + "\x17\xc8\x70\xf4\xc7\xc7\x7c\x38\x50\xbf\x85\xc5\xaa\x3f\xf4\x49" + "\xcc\x92\x21\x84\x7b\x2d\xfa\x46\x5e\xf9\x5c\x00\x7e\x73\xdd\xde" + "\x65\xf2\xc7\xef\x8f\x69\x1b\x81\x27\x1d\x64\x38\xf0\x58\x03\xe6" + "\x1e\x84\x7b\xcc\xff\xd1\xd5\xec\x5f\x6d\x3f\x45\xf4\xf3\x88\xb2" + "\x85\x1c\x2a\x56\xa5\x12\x55\x5e\x13\x51\x03\x5d\xed\x07\xec\x63" + "\x89\x18\xef\xa2\x28\x94\xed\xd5\x2f\x02\x7c\x5d\xac\xe1\x6d\x1d" + "\x99\x87\x54\xa0\x7b\x45\x8b\x3a\x76\x36\xcb\x79\xa3\x82\xe7\xbf" + "\xae\x14\x62\x7b\xb0\xb1\x3d\xf4\x38\xdb\x4b\x17\xf6\x1a\xdc\x33" + "\x56\x92\xbf\x0f\x09\xfb\xd0\x5a\x85\x18\xff\x87\xca\x0e\x80\x16" + "\xbc\x8a\xf9\x8e\x84\x41\xdd\x39\x4e\xdf\x11\x6a\xb7\x3a\x54\x06" + "\x34\x8c\x67\xb2\x79\x6b\xfc\x4c\x47\x80\x30\x07\xf1\xfc\xb7\xc9" + "\x78\x2f\xdc\x17\x62\xa5\x36\xa6\x43\x06\x89\xd7\x0e\x61\xce\x3d" + "\x05\xbc\x53\x20\xd0\xb5\x0e\xdf\x0b\xc7\x04\xea\x41\xff\xcb\x4d" + "\x07\xde\xf3\x12\xfb\x37\xb0\x4e\x67\xa7\x36\x90\x29\x28\xef\x5f" + "\x04\x1a\xfc\x0a\xe3\x7b\x55\xc3\x73\x2a\x37\x77\x91\x4a\x4d\x1b" + "\xa9\x82\xdf\xe8\x23\x6e\x9c\xf7\x1d\x69\xd0\x7a\x5e\x6f\x60\xcd" + "\x2a\x86\x3e\x97\x62\x5b\x88\x05\xe8\x57\x57\x9d\x0a\xeb\x8f\x05" + "\xda\x02\x0d\x04\xdb\xa8\xe4\x9a\x49\x65\x32\xe8\x59\xf9\x09\xc6" + "\xaa\xcd\xa7\x48\x95\xe6\x2b\xfa\x1c\x94\x09\x8d\x8b\xda\x7a\x6b" + "\xbb\x1c\xda\xae\x15\xda\x36\x43\xdb\x61\xde\xdb\x9e\x6c\xf2\xb1" + "\x6d\x1f\xfa\x3d\xb9\xc6\x97\xb6\x01\xc7\x47\x63\x4e\x23\xdc\x6f" + "\x97\x76\x33\x09\x72\xb4\x63\x6c\xd7\x3b\x78\xe6\xa7\x7c\x64\x23" + "\xdd\x93\x97\x49\xfd\xc0\x75\x74\x6f\xde\x25\x42\x7d\x4d\xd9\x7e" + "\xbc\x46\x82\x7e\x2a\x1d\x99\x47\x56\x39\x71\x48\xfa\x7e\x08\xb2" + "\xea\x91\x62\xe6\x8f\x6a\xd6\x31\xbe\x3a\xf2\x32\xb6\xe5\xb9\x1f" + "\x17\x63\x99\x5f\xf3\x11\xa7\xcf\x5d\x5b\xd0\xc5\x58\xa1\x2d\xad" + "\xbb\x5d\x4f\x4c\x3e\x1c\x97\x9c\x28\xe6\x31\x4e\x14\xb6\x18\x3f" + "\x17\xf7\x4a\xdc\xdc\xa4\xb8\x39\xda\x69\x4b\x16\x2d\xb8\x6f\xe1" + "\xab\xaf\x6a\x27\xc7\x2d\x5e\x3c\xeb\xb5\xb8\x21\x64\xda\xa2\x59" + "\x0b\x16\xcf\x45\xdb\x9b\x56\x3b\xfe\xb7\x33\xe3\x17\x26\xde\xf7" + "\xaf\xe3\x23\xdc\x6c\x6f\xb8\x1f\xb5\x0e\x65\x70\x58\x3b\x86\xa7" + "\x39\xc8\x50\x8c\xd5\x14\xb2\x94\x37\x2e\x03\xfd\x0f\xf8\xaf\x05" + "\xd7\x29\x5c\x1b\x50\x37\xc0\x38\x91\x80\xdf\x15\xef\x6c\xe0\x6b" + "\x9a\xc8\x99\x17\x40\xae\xac\xdd\xc2\x62\x1e\xd6\x81\x4e\x6e\x61" + "\xdf\x06\xcf\x3c\x84\xf1\x0c\xff\x0c\xe7\x2c\x41\xad\xf1\x79\x67" + "\x88\x0a\xd6\x35\xd0\x4b\x2a\xac\xbc\x72\x30\x9f\x3d\x9c\x2f\xe3" + "\xbf\xd3\x10\x21\x4e\xbc\xb2\xda\x64\x43\x3f\x8b\x80\xa9\xf6\x74" + "\x1e\xf1\x94\xcd\xad\x8a\x2b\x6c\x8e\x9e\x2d\x67\xfe\xde\x67\x86" + "\xa1\x0e\xb3\x92\xe6\x3e\xad\x84\xf9\xb3\xaf\x42\xc2\xe9\xaf\xb5" + "\x82\xec\x88\x7e\x10\x6f\xd4\x43\x99\xc5\x92\xa9\x8c\x90\xfb\xd0" + "\x54\xc3\xba\x7c\x6a\x3c\xfb\xc7\x7b\x4e\xcd\x61\xff\xf8\xdb\xf5" + "\xff\xb4\x8d\xfd\xbb\x9f\xff\xb1\xff\xe2\xf3\x07\xdc\x46\x6d\x1f" + "\xff\xfd\x78\x3e\x7d\xef\xeb\xf8\xfe\x3f\xaa\x0d\x53\x6f\xff\xc8" + "\x6f\xc0\x5b\x75\x7f\x3e\x43\x02\x80\x3f\x0b\x72\x66\x03\x4f\x9f" + "\x26\x9a\x54\x3b\xdf\x90\xfe\x32\x19\x91\x76\x81\x60\xee\xc9\xe6" + "\xc4\x64\xbe\x21\xad\x1d\x65\xd2\xaf\x3f\x06\xfe\x2d\xcd\xad\x27" + "\x81\x39\xf5\x44\x5d\x95\x88\x79\xa9\x31\x9e\x1b\xf4\xd4\x0c\xff" + "\x50\xae\x48\xb2\x91\x23\x96\xcb\xe8\x77\x66\xac\x8a\x05\xdc\xa9" + "\x23\x04\xf9\x37\x30\x96\x84\x15\x0d\xe7\x77\xf3\x99\xfa\x18\x5e" + "\xa9\x9f\x04\xe7\x8e\xef\xe4\x22\xfd\x77\xa6\x94\xfb\x6b\x67\xe3" + "\x1a\x5f\xfd\x89\xc0\x9b\x23\xd9\x5e\xaf\xaf\x47\x22\x0f\xc2\x3c" + "\x39\xce\xec\xea\x5f\x6f\x62\xeb\xf9\xd7\x54\x0f\x62\xb1\x9a\xbf" + "\xa6\xb2\x22\xbc\x47\x29\xe6\xea\xc5\x36\x77\x70\xa5\x34\x57\xef" + "\xce\x94\x48\xff\xd4\x59\x44\x59\x65\x02\xcd\x04\x70\x10\xbf\xc7" + "\xc2\xbc\xdb\x06\xf3\xac\x64\xd3\x70\x3e\x1f\xfa\x97\xbd\x79\x38" + "\xbf\x1a\xfa\x54\xdc\x91\x59\x13\x6e\x22\x87\x35\xc2\x77\x17\x23" + "\xcc\x8b\x6d\x39\x50\x67\xea\x12\x72\x47\x0e\xd4\xcb\x85\x7a\x28" + "\x27\xb3\xfe\x7d\x75\x01\xc6\x60\x17\x3c\xb3\x46\x3b\x03\xcb\x47" + "\xe9\x1e\x40\x7c\x36\xbc\x87\xb6\x9e\x1c\x4d\x84\xb5\x4d\x85\xcf" + "\x10\x9f\x0b\xed\x03\xfe\x1d\xa6\x76\x52\x6c\x97\xb5\x53\xc3\xf6" + "\x6b\x64\x9b\xb7\xe5\x49\xb9\x94\xb7\xe5\xa4\xc0\x9a\xde\x45\xe3" + "\x9c\x16\xa0\xbd\x05\x65\x0c\x2a\x57\x38\x48\x08\xb3\x0f\x80\x6c" + "\x11\x0f\x38\x00\xf2\x04\xf5\x51\x07\x59\x02\xfa\x52\x80\x39\x3d" + "\xf1\x3a\xe8\x6d\xbb\x60\x5d\x2e\x41\x39\x60\xc6\x95\x67\xf0\xbb" + "\x2b\xc1\x7c\xbc\x8b\x63\x78\x1b\xcb\x8b\x74\x54\x2d\xca\x02\x88" + "\x41\xb8\xfe\x83\x2c\xac\xea\x06\x1a\x02\x0f\x94\x83\x6c\x31\xb4" + "\x85\x1c\x9d\x24\x8c\x7d\x39\x5d\xf3\x93\x68\x5c\x6e\x3f\x86\xd1" + "\x47\x5f\x80\xf7\x0b\x84\x67\x80\x3c\x7a\x86\xda\xc2\x19\xc6\x1c" + "\x8d\x17\xd7\x71\xd4\x79\x4d\xd0\x06\x0f\x58\x26\x5c\x83\xf7\x2f" + "\x17\xf7\xdc\xd7\xc1\x35\x8d\x30\x66\x15\x30\x66\xd8\x26\xd5\xfd" + "\x41\xe6\x8a\x67\x63\x73\x34\x1c\xe5\x0a\xe1\x5e\xa3\xd8\x2e\xea" + "\xe5\x1c\xc8\x15\x38\x5e\x38\x4e\xd0\x4e\xb8\x80\x63\xc7\x99\xfc" + "\xf2\x15\xf5\x99\xc0\xb1\x07\x5a\xaf\x92\xc6\xff\x98\xca\x75\xfc" + "\xe1\xfe\x55\x02\x2d\x97\xbb\xd0\x0e\x74\xa3\xaf\xa6\xa1\x9d\x14" + "\xfa\xb8\x9b\xd9\x78\x8e\x3d\x8a\xf1\xf0\x30\xfe\x36\x8c\xf1\xee" + "\x6c\x8c\xf5\x0c\xd8\xbc\xf2\x0c\x60\xee\x6c\x94\x9f\xbe\x7a\x94" + "\xc9\xa7\xc7\xea\x90\x87\x9b\xc8\x31\x6a\x87\x6f\x80\x7e\x61\x7b" + "\x50\xde\x0e\x47\x90\x63\x8f\xbd\xef\x9a\x3b\x5b\xca\x9b\x7d\xac" + "\x48\xda\x27\x72\x94\xda\xa5\xf1\x88\x36\x30\x5a\xbf\x3b\x1e\xfb" + "\x56\x87\xf3\x52\x7c\x57\xcc\xa1\x0d\xe7\x51\xf6\xaf\x43\xba\x89" + "\xe7\x31\x4e\x34\xd0\x29\x10\xfa\xf4\x10\xeb\xd3\x57\x6a\x96\x67" + "\xf0\x58\x06\x96\x31\x9f\x76\x1e\xde\x93\x26\xdd\x83\xf3\x06\x78" + "\x38\x04\xee\xb9\x0f\x8e\xbc\x58\x97\xe5\xd9\x3e\xb6\xeb\x2f\x5d" + "\x68\x03\x3b\x56\x21\xe6\xd9\xc6\x1c\xdb\x88\x19\x39\x33\x64\x63" + "\x8f\x63\xb3\x0d\x68\x45\xf9\xee\x80\xbd\x14\xc6\xfb\x2b\x90\xff" + "\x77\x0b\x7b\xa1\x8e\xed\x12\xfa\x67\x64\x31\x72\x8e\x98\x69\x4c" + "\x67\xaa\x0f\x7d\x55\xe4\xd4\x87\x9c\xb2\xe5\x31\x1a\x7f\x0b\xda" + "\xaa\x40\xfa\xa3\x9c\x08\xf5\xca\x9c\xbc\x45\xf7\x61\x7f\x35\x1e" + "\xe5\x4b\xa1\xff\xc8\x2f\x77\x09\x63\x67\x76\x9d\x77\xae\xf3\xbc" + "\x23\xf3\x38\xe8\xff\x87\x9c\x3c\x20\xce\x6b\xc6\x07\x27\x28\x1d" + "\x41\xa6\x28\xc5\x38\xcd\xd0\xae\x11\x65\x70\xb6\xae\x9e\x50\x1f" + "\xa8\xa3\x3e\x0d\xc7\xa1\x0c\xf3\xfb\xb8\xb9\x2d\xb8\x5d\xb7\x8a" + "\xe2\xc6\x71\xd0\x7f\x22\x28\xfd\x70\x5c\xc4\xf9\x9a\x37\x03\x75" + "\xbf\x08\x36\x67\x93\x1b\x48\x95\xcd\x4c\x84\x3d\x18\x30\x67\x1b" + "\xf1\xdb\x69\x0b\xf0\x50\x00\xce\x5f\xa0\x2f\xce\x7f\xc4\x9c\x9a" + "\x55\x1b\xe8\xbc\x0d\xc4\x79\xdb\x8d\x71\x42\xe0\x39\x65\xb1\x91" + "\xe4\x40\xb2\x91\xce\x63\x8c\x11\xf3\x0e\x8c\x1d\xe6\xb4\x86\x67" + "\xd7\x8a\xbe\xe3\xc8\x23\x18\x13\x46\xe0\x13\x2d\xce\x65\x61\xec" + "\x54\x1d\x99\x27\x88\x38\xf7\x5c\xe8\x4f\xeb\xb8\xcd\xb7\x10\x36" + "\xdf\x4e\x44\x88\x63\x6d\xa7\xf3\xf8\x58\x85\x1d\xe6\xb1\xeb\x98" + "\xe2\x78\xe2\xb8\x42\x5d\x78\xff\xc3\x89\xe2\x98\xba\x8c\x67\xa5" + "\x40\xf3\x1a\x66\x63\x3a\xc1\xe2\x60\xbb\x8c\xa1\xc0\x7f\x98\x8b" + "\xb8\x74\x25\xbe\x3b\xac\x0d\xf8\x7c\xe4\x91\x77\x04\xcc\x2a\xb3" + "\x20\x8f\x9c\x80\xf9\xff\xef\x85\x12\x76\x1c\xab\xa1\x3a\x0b\xd0" + "\x49\xa0\x4f\x27\x8d\xa9\xe2\x01\x3b\x80\x4f\x4a\x25\x7c\xfa\x3a" + "\x40\x1c\x07\x91\x27\xc5\x79\x0f\xeb\xc8\x74\x39\xfe\x7c\xfd\x30" + "\xb4\x11\x8a\xf8\x26\xc9\x50\x5f\x4f\x94\xe3\xdb\xd7\x11\x88\x6f" + "\xc8\xd7\xfa\x24\xb4\xb1\xb1\xf5\xca\x44\xaa\x6b\xe5\x98\x54\x5d" + "\xc9\x7c\x03\x98\xcc\x85\xbc\xa5\x9f\xc1\xea\xe3\x1a\x06\xf5\xa9" + "\x2e\x2e\xac\x79\x5a\x5c\xe3\xe0\x5c\x99\x30\x5e\x75\x50\xbf\x0c" + "\xf7\xb3\x62\x0c\x8b\x1b\xeb\x98\xae\x07\x38\xbd\x1b\x63\xb4\x43" + "\xbd\x55\x55\x20\xe7\x77\x67\x31\xec\x16\xb1\x82\x7f\x25\xfa\xc6" + "\x37\x9a\xc9\x0d\xfa\x7f\xe5\xbf\x6b\x22\xdf\xc4\xc1\x9c\xb1\x61" + "\x9c\x50\x68\x5b\xdb\x44\x4e\xdd\x07\xcf\x0d\x13\x8e\x1a\x38\x0e" + "\x83\xe3\xcd\x4d\xe4\xa4\x03\x8e\xb7\xc2\xb1\x11\xea\x73\x42\xfd" + "\x08\x28\x57\xc2\xf9\xdf\x0a\x47\xe8\xe3\x37\x31\x70\x8c\x12\x64" + "\x47\x3c\xbf\x15\xcb\x70\x5c\x2b\xd0\xbc\x82\xd1\xfc\x9b\xb7\xa0" + "\x9d\x64\xe8\x7f\x6d\x75\x1d\x6d\x4b\x0f\x75\x9e\xc5\xb6\x71\x7f" + "\x39\xfc\xf6\x27\x92\x0c\x0a\xed\xd4\x3e\x08\xc7\x31\x70\xdf\x15" + "\x38\x26\xc2\xf1\x90\x30\x06\x35\x88\x0d\x73\x92\x71\x6c\x4f\x34" + "\x68\x99\xbc\x1b\x25\xce\x79\x5c\x87\x25\xec\x38\x1a\x3e\x27\x86" + "\xd1\x1b\xea\x52\x3e\x80\xba\x8f\x63\x5d\x38\x3e\x29\x1c\x23\x85" + "\xe3\x04\xe1\xf8\x6f\xc2\x71\xbc\x70\x04\x3a\x7f\x53\x21\xc8\x18" + "\x30\x2e\xdf\xd0\x7c\x07\x30\xb7\xe7\xb0\x67\xd4\x9a\x51\x47\x06" + "\x1c\x7f\x08\xda\xf7\xeb\xc8\xac\x8d\x15\xed\xa3\x68\xf3\xe9\xce" + "\xac\x18\xfc\x0e\xfd\xae\x5d\x9b\xec\x82\x6d\x63\x03\x15\x91\x04" + "\x64\xa0\x61\x45\x4a\x58\xff\x59\x3b\x35\x4a\xe1\xbb\xb0\x90\xff" + "\xc1\x0f\x63\x22\x52\x7d\x68\xe8\xab\x3a\x9c\xab\xd4\x76\x8c\xf1" + "\xfb\x82\x5a\xc7\xc1\xff\x44\xd0\x0d\x26\x89\xf8\x8d\x7a\x0f\xd3" + "\xd5\x31\xfe\x6f\x6d\x83\xa4\xab\xd7\x52\x9b\xb7\x9f\xe6\xa6\xd7" + "\xe1\xbc\xdd\xe5\x7c\x14\xf6\x19\xc6\xb3\x16\xde\x67\x4c\x3d\x39" + "\x19\x0e\xc7\xdf\x34\xb0\x77\x8e\x10\xdf\x59\xa0\x87\x5e\x1c\xdf" + "\x06\xf2\xcd\x71\xc0\xc2\x45\xc8\xc3\xf5\x4e\x9c\xfd\x86\xda\x75" + "\x05\x1e\x01\x5a\x7e\x93\x83\x34\x75\x99\x83\xae\x18\x14\xd6\x91" + "\x79\x72\x95\x1c\x53\x8e\xae\x42\x4c\x41\xde\x00\xfc\x46\x5a\xcf" + "\x71\x9b\x7f\x68\xeb\x0f\x65\xf3\xee\xa4\x51\x7e\xef\xd7\x11\x76" + "\x36\xef\x6a\x81\xcf\x80\x3f\xbf\x19\x8f\xf4\x31\x91\x93\x06\x61" + "\x4e\xd7\xc2\x9c\x7e\x08\xce\x8f\x66\x7d\x65\xe7\x85\x67\x01\x9f" + "\x7d\x83\xef\x7d\xab\x78\x5e\x78\x5f\x6c\x67\x04\xd2\x5b\x3c\x2f" + "\xb4\x8f\xfc\x88\x3c\xa4\x11\xcf\x0b\xef\x04\x72\xd4\xa9\x68\x11" + "\x4f\xb2\x29\xbf\x1d\x37\x89\xf7\x21\xdd\x30\x06\x1a\xb3\xf1\x9f" + "\x1a\x0f\x73\xd5\x80\xeb\xc3\xca\x19\x24\xf0\x8d\x42\x12\xc4\xe6" + "\xe5\xa9\xf1\x72\x8c\x3c\x7d\x17\x9f\x19\x62\xe7\x03\x5b\xc7\x54" + "\xda\xc7\x88\xf2\x6a\x11\x3c\xc7\x28\xe6\x74\x97\x72\x49\x9c\xba" + "\x52\x69\x70\x8e\x2f\xf6\xa5\x41\xec\x8b\xcb\xfa\x4c\x69\x80\x7d" + "\xc3\xb6\x56\x82\xbc\x6e\x05\x5c\x60\xb8\xfd\x6d\x98\x89\xdc\xb8" + "\x5b\xc4\x54\x5c\xb7\x42\x14\x44\x9f\x9b\x44\xbf\x8f\x86\xe0\xda" + "\x88\x3e\x3e\x1c\xda\xb1\x92\x1d\xa4\x4a\x0f\xba\x7c\x72\x23\x99" + "\xb9\x74\x08\xc6\xc4\x89\x86\xbe\xde\x00\x7d\x7b\xcf\x81\xb6\xff" + "\x05\xa8\xa7\xd6\xed\x71\x24\xf1\x36\x61\xcc\x60\x1e\xd5\x6d\x15" + "\xc6\x16\xf1\xeb\x3d\xc4\xf4\x95\x69\x2c\x2f\x14\xda\x72\x70\x7e" + "\xfc\x05\xd7\x31\x0d\x6f\x2b\x2b\xc2\xb9\xf2\xed\x7b\xa2\x4c\x0a" + "\xfd\x35\x30\x99\xf0\x04\xcd\x35\x03\x73\x67\x0c\xb3\x05\xd6\x3d" + "\xc8\xde\xbd\x4e\xc3\xbe\x73\xd3\x38\xa8\x58\x56\xf9\x69\x86\x7f" + "\xc3\xfc\xb2\x2a\x46\x31\x9f\x92\x6f\xad\x4e\x9f\x12\x49\x56\x1c" + "\xc1\x62\x83\xd5\xb9\xc4\x3f\xfd\xd6\x84\xf7\xc1\xfd\x2d\x70\x5e" + "\x27\x9d\xc7\x6d\x05\xd4\xde\x35\x36\x78\x45\x24\xfa\x96\x0d\xc3" + "\x78\xea\xc2\xf3\x56\xd3\xe7\x53\x9b\x07\xcc\x4d\x61\xfe\xe2\x38" + "\xe3\x9a\x4d\xe7\x30\xcc\x5f\x9c\xc7\xdd\x39\xad\xe3\xe0\x9f\xcd" + "\x5b\xb6\x36\x8f\xa0\xf3\x96\xce\xd9\xba\x42\xe9\x79\x75\x51\xd4" + "\xee\x85\xf4\x5c\xa6\x09\x84\x6b\xbb\x4c\xe4\xc8\x68\xa1\x8f\x34" + "\x0e\x0d\xc6\x7d\xb1\xb7\xf3\x16\xfc\xb6\x8d\xdf\x3a\x71\xef\x5c" + "\x08\x70\x37\xc6\x6a\x11\xbf\x55\x4f\x36\xa7\xf3\x0e\xfc\xee\xd4" + "\xce\x5b\xf3\x9d\xf9\x1c\x4e\x13\x29\xee\xd2\xb7\xb1\xc2\x7b\x8d" + "\x81\x67\x15\x31\x5f\xb0\x6f\x9f\x65\x32\xd5\xb7\x51\xc8\xa7\xd5" + "\xc0\x7b\x70\x2c\x64\x39\xb8\x4f\x8f\x13\x79\x0f\xe6\xe5\x1c\xa0" + "\x7b\x65\xc1\x70\xbe\x10\x68\x5a\x08\x73\x29\x01\xca\x9f\xc2\x71" + "\x0e\x3b\x2a\xd4\x78\x14\xe6\x48\x21\xdc\x9b\x0c\x3c\x16\x2b\xce" + "\x0f\xeb\xd0\x29\x11\xc8\x67\xb9\x30\x0e\xc8\x6b\xf4\x3b\x32\xf4" + "\x1b\xf9\x0b\xf9\x0c\x79\x2c\x64\xc5\x33\x94\xcf\x68\x5c\x08\x38" + "\x8f\xfd\x45\x3e\x83\xb6\xca\xc4\x58\xce\x26\x72\x9a\xee\x6f\x84" + "\x73\xb5\xa2\x8f\x2e\x7e\x4b\x4a\x1c\x49\x86\x41\xbb\xda\x32\x2d" + "\x8d\x97\x7a\xb6\xda\x3e\x81\x60\x5d\xfc\x0e\xc7\x70\xf2\xa6\xb2" + "\x8e\xcc\x33\x81\xd2\x98\x1f\xa5\x7b\x4b\x0e\xc4\x50\x5b\xe4\xaf" + "\xe0\x9a\xce\x55\xcf\x30\x91\x0a\x8c\x77\x1c\x8f\xbe\x7d\x77\x86" + "\x11\x2d\xf0\x2d\xe0\xd8\x99\x49\xa2\x5c\xfb\x40\x18\x7e\xcf\xaf" + "\x30\x40\xff\x50\x87\xae\x81\xdf\xd9\xa0\x4b\x96\x7b\xb1\x19\x8f" + "\x41\x5b\x8f\x90\x83\xa9\x0e\xed\x58\x98\xb3\xa2\x89\x9c\xab\xac" + "\xc4\x18\x2d\x0b\x7b\xc6\xf2\x4e\x4b\xe6\xaf\x60\x3c\x6f\xed\x22" + "\xf2\xab\x7a\x72\x0e\x73\xb2\xd4\xa6\x5f\x46\x1b\xcd\x99\xe3\x72" + "\x1b\xcd\xd9\x70\xe1\x7f\x2c\xfc\x17\x49\xff\xa6\xd1\xc2\xef\xe2" + "\xde\xff\x4d\xe3\x59\x5d\x53\x14\xfc\xc7\xb0\xb1\xd2\xc0\x3c\x39" + "\xeb\xb4\xff\x22\x5f\xe2\xdc\x46\x3f\x0e\xb4\x39\x29\xec\x04\x63" + "\xc2\x00\x9d\xa0\xdf\x2b\xef\x79\xce\x98\x82\x7c\x74\x76\x2e\xd5" + "\x1d\x94\xbe\xee\x5d\x3d\x4b\xe9\xc9\x62\xbe\x9e\x1d\x0d\xcf\x0e" + "\xcb\xbb\x44\x54\xfa\x45\xe4\x36\xb4\x7f\x87\x38\x78\x23\xea\xb8" + "\x42\xdc\xc8\x9a\x16\x62\xba\x2f\x71\x39\x51\xc2\xf5\x3b\xe0\xf7" + "\x08\x51\x4e\x82\x7b\xd4\x7e\x36\x12\x86\xf2\xd1\x93\xcb\xc9\x1d" + "\xd0\x7f\x9b\x48\x2b\x94\x21\xd0\x0e\x27\xd8\x12\xb0\xaf\x0f\xe3" + "\x7d\x98\x8b\xc0\x44\xc7\x8d\xe2\x30\xb6\x01\xfc\x71\xb6\xc1\xcf" + "\x4a\xd4\x6c\xed\x31\x01\xff\x57\x08\x32\xa3\x09\x73\x71\x1f\x77" + "\xe9\xe7\x53\x2e\xbf\xb3\xf0\xfe\x10\x2b\xca\x67\xde\xc6\xc7\xf4" + "\x96\x38\x3e\xe8\xaf\x1a\x02\x7a\x02\xa5\xb7\x9d\x37\x43\xdf\x2a" + "\xf4\x29\x24\xa0\x85\x9c\x5b\xba\x65\x03\xdd\xff\x58\xce\xec\xf3" + "\xe7\xe6\x8b\x7a\x38\xeb\xf7\xb9\x87\x43\x56\xf8\x11\xb4\xab\x63" + "\x4c\x3b\xea\xeb\xf7\x83\x86\xda\xd2\xab\xed\xe3\x88\x31\xed\x11" + "\xac\x23\xca\x55\x75\x6d\xe9\x1a\x72\x40\x33\x0e\xe6\xf1\x39\x15" + "\xcc\x95\x06\xdf\x7d\x2a\xcf\xa9\x84\xf1\xad\x60\xbe\x08\xa6\x13" + "\xb8\x96\xa0\xee\x0f\xeb\x48\x19\xae\xd1\xd0\x76\xac\x38\x6f\x60" + "\xdd\x80\x79\x6a\x62\xb9\x6c\xb2\xf1\xfb\xaf\xa9\x06\x63\x73\x50" + "\xbd\x81\xd5\x0f\x64\x36\xff\x73\x05\x4e\x59\x1a\xea\xe1\x7d\xcc" + "\x47\xcd\x54\x3c\xd3\xa1\x80\x31\x35\x15\xe3\xbb\x09\xbc\x08\xeb" + "\xd5\xb9\x32\x69\xde\x9a\x28\xdf\x1f\x30\xbb\xce\xcb\x73\x0d\x92" + "\xbe\x79\xa6\xf0\xbe\x02\xa2\xf5\x34\x0f\xf5\xc1\xb8\x56\xd5\x4f" + "\xcf\xcb\xe3\x0d\xf9\x4a\xee\x89\x95\xb9\x24\x50\x91\x0d\xc3\x86" + "\xf3\x2c\x29\x76\x58\x13\xa9\x8f\x0b\x09\xbc\x29\xea\xc9\xc4\xc1" + "\x7c\x9a\x86\x28\x73\x5a\x07\x07\x8c\xb4\xdd\x64\xe0\xfd\xee\x79" + "\x6e\x72\xa2\x8d\x68\xe7\xe5\x93\xf3\x09\xc4\xef\x49\x07\x3c\x3b" + "\x90\xe8\x4d\xa4\x41\x8f\x5f\x9e\x0f\x04\xa2\xfc\xd1\xa0\xc7\x36" + "\x53\x8b\x48\x40\x6a\x03\xdf\x9c\xfd\xaa\x7f\x00\xac\x07\xea\x77" + "\x80\xc7\x6e\x0c\xbc\xc9\xd0\x0d\x6d\xec\x8f\xa5\xf7\x95\xf4\xd2" + "\xb7\xcb\x9e\xfb\xa6\x1f\xde\x44\xbe\x53\xf8\xd6\xb7\x26\xb5\xd4" + "\xb7\x26\xf5\x8f\xef\xdb\x77\x39\x2e\x7d\x53\x4b\x7d\x8b\xc7\xbe" + "\x6d\xf2\xad\x6f\xe7\x4b\xa4\xbe\x9d\x2f\xe9\x67\xdf\xb6\x79\xef" + "\x5b\xc3\xdd\x9e\xfb\x96\x7c\x53\x13\x69\x78\xd8\xb7\xbe\x5d\x88" + "\x92\xfa\x76\x21\xea\xc7\xf4\x0d\x75\xf9\xb4\x11\x7c\x23\xcd\x19" + "\xb0\x88\xc5\xe4\x6d\x22\x8d\x1b\xd3\x8a\x68\x39\x14\x7e\x4f\x17" + "\xe6\xb7\x25\xdd\xca\x7f\xc7\xe4\x9c\x86\xfd\xf7\xeb\xd1\xdf\xb5" + "\xa1\x14\x78\x59\xcf\x78\xba\x91\xfa\x37\xa4\x5b\x78\xc1\xdf\xb4" + "\xe1\xdc\x66\xea\x8f\xd2\x2e\xe4\xe8\x6d\x0c\x6f\x0b\x6e\xd5\xa3" + "\x2f\x08\x07\xf3\x99\x0f\x6e\x4d\xc5\x1c\xad\x3b\x17\x59\x94\x7c" + "\x26\xc6\x74\xc3\x38\x8c\x2a\xc2\xe7\xb6\x66\xef\x5c\x64\xa3\xf9" + "\xe1\x57\xd2\x7d\xd8\x8d\x23\xc4\xbd\x87\xe2\x33\x2c\x41\xed\x20" + "\x9b\x34\x8e\x11\x73\xfd\xf2\x4a\x90\x67\x82\x5a\x13\xb1\x7d\x38" + "\x3f\x49\xcc\xbf\x0b\xfc\x6e\x12\xb0\xc1\x1a\x62\xeb\x0d\xf7\x1a" + "\x57\x88\xb8\xf7\x64\x22\x09\xc1\xdc\xa3\x79\x69\x83\xf1\x9b\xa3" + "\x05\x9e\xa9\xc6\x71\x9f\x6a\x1d\xcc\x87\xa4\x12\x3f\xdc\x73\x89" + "\x3e\x7a\xd5\x1a\x0b\x09\x4f\x25\xfe\x53\x93\xa1\x4d\x1b\x89\x0d" + "\x49\x86\xf6\x60\xac\x99\x6e\xd0\x48\x6d\x7c\x05\xd0\x1e\x7e\xff" + "\xf6\x4b\x24\x81\x4f\x6a\xd2\xf9\x95\x1b\x89\x0a\xf7\x67\xe2\x3e" + "\x4b\xb6\xc7\x72\x50\x00\xf4\xd7\x2e\xbe\x5f\x3f\xe8\x13\xcc\xe8" + "\x73\xfe\x61\x89\x3e\x4d\x57\x7a\xd2\xa7\x69\x16\xa3\x4f\x53\xb4" + "\x44\x9f\xf3\x45\x72\xfa\x34\xad\x90\xd3\xa7\xa9\x6c\x60\xf4\x69" + "\xda\x2d\xd1\x87\x3d\x83\xd1\xa7\xe9\xb8\x67\xfa\x34\x99\x25\xfa" + "\x34\x65\xf4\x8f\x3e\xe7\x47\x7a\xa7\x4f\x53\x49\x2f\xf4\x19\xe4" + "\x99\x3e\xe7\x5f\xef\x3f\x7d\xce\x17\xf9\x40\x9f\x20\x46\x9f\xe6" + "\x93\x12\x7d\x9a\xd7\xf7\xa4\x4f\xb3\x82\xd1\xe7\xbc\x4d\xa2\xcf" + "\x85\x71\x72\xfa\x34\x8f\x94\xd3\xa7\x79\xce\xc0\xe8\xd3\x1c\x23" + "\xd1\x87\x3d\x83\xd1\xa7\x39\xd1\x33\x7d\x9a\xb3\x25\xfa\x34\x6b" + "\xfb\x47\x9f\xe6\xfd\xde\xe9\xd3\x1c\xe5\x3b\x7d\x2e\x0c\x75\xa3" + "\x8f\xda\x3b\x7d\x2e\x8c\xf3\x81\x3e\x21\x8c\x3e\x2d\x4b\x25\xfa" + "\xb4\x3c\xd4\x93\x3e\x17\xb6\x32\xfa\x5c\x28\x94\xe8\xd3\x52\x27" + "\xa7\xcf\x85\xfd\x72\xfa\xb4\xa8\x06\x46\x9f\x0b\x76\x89\x3e\xec" + "\x19\x8c\x3e\x2d\x61\x9e\xe9\xd3\x32\x5a\xa2\xcf\x05\x63\xff\xe8" + "\xd3\x32\xcb\x3b\x7d\x2e\x58\x7a\xa1\xcf\x60\xcf\xf4\x69\xf9\xb8" + "\xff\xf4\x69\xa9\xeb\x8d\x3e\xbe\xc9\x7a\x2d\x34\x57\xcd\x8f\x6f" + "\xe7\xfb\xb1\xde\xda\xc1\xb1\x43\xff\x43\x2e\xf3\xfb\xb1\x9b\xb9" + "\x41\x01\x6c\x8f\x46\x8b\x45\x9b\x42\x1e\xab\x27\xdf\xbf\xb9\x99" + "\xf3\x0f\xe0\x33\x3f\xd8\xc5\x65\x7e\x14\xc3\xaf\x18\xa4\xe2\x56" + "\x0c\x56\xe1\x9e\x79\x4f\x6d\x31\x7f\xd8\xef\x1b\xfd\x6e\x26\xb7" + "\xe3\x3e\xba\x95\x20\x2f\xe3\xef\x8e\xcc\xef\x61\xdc\x77\x17\xf5" + "\xb6\x7f\x0b\x7d\x9d\x0e\xac\x42\xfd\xd6\x3c\xc2\x19\xaf\x24\x93" + "\x4f\xc6\xb8\x6f\xfa\x51\xb8\xcf\xc2\x3c\x1e\xe3\xb9\x83\xbe\xda" + "\x10\x39\x8a\x3f\x8b\xba\x47\x13\xb9\xf8\x38\x9f\x63\xc6\x58\xd1" + "\x56\x90\xd5\x7f\x05\x75\xb2\x9d\xfe\x79\x7c\xf4\xdb\x82\x8d\x30" + "\x9f\xd5\xbd\xf4\x31\xd4\xcd\xc7\x5c\xb3\x8b\xd3\x30\x87\xea\xa5" + "\x8d\x20\xfb\xfe\x13\x3e\x03\x63\x5a\x6d\x81\x23\xfa\xc9\x30\xdf" + "\x4c\x33\x8b\xdd\xb3\xf2\xd6\xb7\x99\x2f\xdc\xa5\x15\x22\xdf\xc1" + "\x73\x86\x40\x79\xae\x20\xcf\x63\xfd\x1b\xa1\xfc\xac\xcb\xf5\x40" + "\x28\xa3\x1d\x72\xa8\x70\x3d\x08\xca\x37\xa3\x9c\x4d\xe3\xaf\xe4" + "\x66\x08\x3e\xc4\x17\xed\x70\x4e\x2d\xd4\x19\xda\x42\x2e\x9e\x43" + "\xd9\x5d\x68\x23\x14\xca\x07\x51\x07\x16\xae\x87\x41\xf9\x03\xfc" + "\x76\x20\x5c\x1f\x06\xe5\x1c\x28\xff\x9a\xed\x79\xe9\x16\xe6\xe8" + "\xc5\xe8\x81\xed\xe5\xbf\x48\x63\x2f\x22\x0d\x98\x2e\x70\xd1\xc5" + "\xff\xe7\x62\xa4\xdb\xb5\xdd\x2e\xd7\x22\xc4\x6b\xcc\x47\xed\x62" + "\xad\xcb\x35\xad\xdb\x35\xab\xcb\x35\xb5\xbc\xcd\x4b\x6a\x97\x6b" + "\x44\x7e\xdf\xa5\xd1\xd2\x35\xb3\xd9\xed\xda\x44\x97\x6b\x75\xc2" + "\x35\x3f\x38\x1f\x2b\x7d\xc3\x33\x57\x08\xe7\x95\x70\x3e\xd9\xe5" + "\xfc\x6e\xe1\x3c\x3e\x3f\xdf\x44\x8a\x04\x5d\x85\xd1\x5e\x68\xbf" + "\xd8\xa5\xfd\x6c\x66\xe3\xb8\xb4\xdb\xe9\x3b\x17\xdc\x5a\xce\x75" + "\x47\xbf\x0d\xd7\x12\x91\xaf\x5c\x79\x7b\x41\x92\x76\xf6\x92\xd7" + "\xb4\x8b\xe2\x12\xd1\x7d\x65\xfe\xdc\x44\xed\xfc\x85\x73\xe2\x64" + "\xb1\xf4\xc3\x30\x16\x24\xe6\xcd\xc3\x98\x3a\x34\x47\xc5\x06\xbe" + "\xd9\x99\xd7\x05\x70\xb5\x23\xf3\x07\x9d\x89\x3c\x35\x16\x9f\x55" + "\xc0\x62\xce\x97\x63\x4c\x1e\x16\x7f\x87\x3c\x53\x4f\x7e\xb8\x4f" + "\x88\xbf\x63\x84\xba\xd3\xbc\xc7\xdf\xb9\x1c\x41\xe3\x4e\x42\x3d" + "\x16\x7f\xe7\xf2\x18\x98\xe7\x4f\xf2\x43\x58\x9e\x16\x96\xbf\xee" + "\x07\x51\x36\xb1\xcc\xec\xa4\xb1\x1b\x33\x98\x2d\xc3\x2d\x8e\x6e" + "\xb6\xb9\x0c\xef\x13\xbe\x97\x96\xb9\xdc\x6f\x64\xd7\xc5\xf5\x41" + "\x78\x66\xb6\x19\xf5\xe6\x21\xf5\x50\xa6\xf6\x7b\x7a\xcd\xc2\x6c" + "\x79\x39\xe6\x0a\x7c\x27\x7c\x6f\xf9\xbb\x29\xff\x50\x4f\x2c\x37" + "\x48\xef\x66\x89\x70\x89\xd1\x27\xbc\x83\x25\x9a\xcd\xd1\x1e\xef" + "\x4a\xfd\x13\xf9\x40\x73\x05\x3e\x1b\xf1\x8c\xf6\x35\x08\xca\x39" + "\xe6\x72\xb1\x3f\x2e\xfd\x43\xfb\xad\x0a\xfa\xf7\x10\x1d\x13\xa0" + "\x29\x0f\x34\x15\xfa\x79\x85\xcf\xbc\x54\xcb\xf2\x55\xc0\x7a\x82" + "\x79\x77\xe8\x5a\x65\x31\x8a\xb6\x4c\x5c\xa3\x98\x0d\xd3\x22\xc9" + "\x7f\x18\x3b\x2d\x47\x5c\xbf\x2c\x2e\xf2\x1f\x7b\x66\x47\xe6\x65" + "\xe2\xca\x43\xd2\xf3\x2e\xdf\x87\xcf\x33\x11\x4b\x31\xdb\x0f\x60" + "\xc6\x31\x81\x79\x63\x49\x40\x5f\x4c\xbc\x17\xfb\xe8\x2d\xd7\xa2" + "\xb7\xd8\x96\xd2\x38\x5e\x4e\x16\xc7\xb1\x80\xe6\x30\xb9\xbc\x5a" + "\xb4\xd7\x09\x79\x4e\x8c\x05\xce\xdc\xe3\x97\x77\xd1\xfc\x7d\xf9" + "\xf3\x0a\x1f\x08\x24\xb1\xc2\xd8\xee\x41\x8c\xc7\x39\xc3\xb0\xbe" + "\x75\x84\x40\x73\x61\x2f\xf3\xe5\x46\x3c\x2f\xf9\xdf\xb7\x8e\x13" + "\xeb\x89\xb8\xcc\xbe\x57\xb5\x0e\xa3\xf5\x58\x3e\xe8\x12\x46\xf3" + "\x5f\xab\xeb\x49\xab\x4e\xa8\xef\xcc\xdd\x6b\x22\xad\xe3\xf9\x9c" + "\xf6\x92\x8e\xcc\x56\xd0\x7f\x2e\x59\xd8\x38\xb2\xe7\xc2\x51\x87" + "\x7d\xc1\x31\xc2\xbd\xe4\xfc\xda\x79\x85\x40\x9f\x62\xcf\x7b\x49" + "\xa9\x5f\xf7\x1d\x2d\xa4\x8d\xc9\x10\x4a\xde\x86\x36\x56\xf6\xae" + "\x6d\xfb\x5d\x7c\x9f\x03\xc5\x3a\x0c\xbb\xe9\x35\xea\x53\xae\x4f" + "\x42\x7b\x90\x70\x2d\x09\xf7\xd7\x3a\x7f\x0f\x72\xf9\xed\x8f\xbf" + "\xa9\x5f\x73\x0a\x5d\x5b\x55\xd2\xde\xfe\x36\x23\x94\x03\xdd\xca" + "\x61\xb2\xf2\x52\xe6\xf7\x0c\xb2\x59\x03\xf5\x21\x17\xce\x0b\x6d" + "\xdf\x40\xfb\x93\xc4\x8f\x05\xde\xc0\x9c\x39\x31\xc2\x3c\xac\xc5" + "\x3d\xdb\x21\xf6\x97\xe9\x7e\x6d\xb8\x3e\x46\x38\x46\x08\xc7\xd1" + "\x2c\x17\x6f\x5b\xb2\xb8\x6f\xbb\x8d\xda\x68\xda\x56\x8b\xfb\x37" + "\x71\x8f\x37\xee\xef\x86\x77\x1d\x8b\x7b\xbc\x71\x3f\xb8\x70\x8c" + "\x10\x8e\xa3\x85\x7c\xc4\x31\x70\x9f\x73\xff\xb7\xb7\xf5\x1c\xea" + "\x34\x88\xfb\xb9\x1d\xd9\xe6\x54\x2e\xbb\x2d\x03\xf3\xbf\x62\x0c" + "\xb7\x74\x33\xcf\xb1\x9c\xe1\x56\x52\x4d\xba\x48\x75\x62\x47\x06" + "\xd0\x22\xb8\x4a\x6f\xa7\x36\xfc\x2a\x9b\x9d\x54\xe9\x2f\xd2\xdc" + "\xaf\x6f\x98\xc5\xdc\x36\xd6\xf1\x8e\x1c\x73\xaa\x30\x5f\x36\x32" + "\x1f\x7d\x2b\x8b\x45\x84\xb6\x36\x33\xfd\xee\x15\xd0\x44\xae\x44" + "\x8b\x75\xd8\xd8\x5d\xa1\x38\xb1\x25\x53\xcc\xef\x69\x4d\x15\xf3" + "\x89\x9b\xc8\x95\x98\x2b\x43\xef\x2e\x86\x73\xf9\x72\x9f\x69\xeb" + "\x07\xd8\x26\xf6\xdb\x44\xac\x93\xb0\x6d\xa8\xb3\xcb\x39\x67\x03" + "\xa1\x1f\x99\xe4\x31\xb6\x0f\xe5\x4a\x34\xcb\x1d\x6b\x85\xf9\xdf" + "\x1a\x2b\xf8\x82\x97\xf0\xe8\x4f\x8d\xfe\xe0\x38\x76\xc1\xad\x61" + "\xe9\x97\x49\x58\x5b\x77\x34\xfa\xa7\x37\xd0\xfd\x08\xaf\x63\x2c" + "\x78\x1b\x99\xa2\x27\x42\xde\xac\x2b\x0f\xe3\x5e\x82\x95\x34\xa7" + "\xdf\x45\x35\x60\xc7\xa8\x8e\xcc\x2b\x80\xff\x4f\x48\xb1\xdb\x72" + "\x5b\x41\x46\x86\xf7\x4b\x8f\x27\x50\x27\x10\xea\x44\x40\x9d\x49" + "\x62\x1d\xbc\xde\x81\xdf\x9e\xf8\x78\x82\xef\x75\x65\xed\xd4\x5a" + "\xb8\x9e\x60\xf2\xdb\x97\xc0\xfc\xbe\xaf\x00\xfd\x8b\x03\x7a\xa3" + "\x1b\xcc\x47\x13\xcc\xe7\x66\x2e\xbb\xbd\x96\xc6\x79\x0f\x6a\x37" + "\x31\x3b\xe7\x95\x83\x98\x7b\x32\xaf\x9d\xa8\xd0\x0f\x83\xcd\x9b" + "\x76\x1a\xcf\x14\xcf\xc1\x7a\x51\x0c\xf3\x94\xe6\x27\xf6\x4d\xf6" + "\xb8\x42\x6d\x93\x18\xbb\x0b\xc7\x11\xf7\x4f\x75\x64\xb6\x6b\x9d" + "\x79\x3a\x9c\x58\xd2\xfe\x34\x7e\xff\x80\x39\x4a\xfb\xe8\xde\x07" + "\xec\x2f\xb4\x55\xe6\x55\xce\x0d\x6c\xaf\xa5\xdf\x88\x72\x5b\x8b" + "\x98\x9f\x6c\xfb\x5a\x3f\xcd\xad\xed\xf0\xac\x6c\x67\x7e\x12\xa8" + "\x83\x34\xe3\xa0\x7d\xe7\x7b\x2e\xa2\xcf\xd8\xc5\xf0\xa6\xbd\x9c" + "\xcb\x69\xaf\xcd\xeb\x22\x2a\xe1\x7c\x79\x95\xdd\x86\x79\x29\x3c" + "\xc6\xca\xa1\x39\x1a\xd1\x2f\x3d\xb7\xbd\x16\xf7\x2e\x3d\x60\x13" + "\xfb\xdc\x51\x8e\x7b\x66\xb0\xcf\x6c\x6c\x3b\xf6\x88\xe3\x98\xd3" + "\x0a\x6d\xa7\x9d\x22\x0d\xa4\x63\x02\xfa\xee\xd1\x31\x49\x11\xfd" + "\x49\x3b\x18\x2e\x76\x39\xeb\x50\x19\x8b\xe6\xcb\x82\xf6\x37\xd3" + "\x9c\x7f\xf0\x0e\x40\x0b\x63\x1a\xc6\x1d\xe8\xa0\x79\x89\x57\xc2" + "\x75\xfa\xde\xd4\x57\xb7\x43\xd8\xb3\xdb\xb1\x4a\x5c\xaf\x4c\xc2" + "\xb9\x3c\x7c\x76\x52\x17\xb9\x44\x3a\xe2\xaa\x33\xba\x08\x8c\x47" + "\x33\xc6\x2e\xac\xb2\xc2\x1c\x4d\xee\x42\x5e\x68\xc6\x1c\xb1\x50" + "\x9f\xed\xb7\x0e\xc4\x31\xef\x98\x88\xcf\xc7\xb1\x05\xfd\xd0\xe2" + "\xa7\x19\x01\x73\xbf\xc3\x24\x8e\x69\xee\x70\xd4\xb9\xda\xbd\xc6" + "\xee\xc4\x31\x72\x40\x9f\xab\x0a\x61\xfd\xbe\xe5\x14\xf4\xcf\xf6" + "\x01\x17\xdc\x5e\x8b\x7e\xe1\xf0\x7b\xb2\xb0\xbe\x50\xda\x31\x3e" + "\xb0\xad\x80\x67\x3c\x50\xc5\x78\x81\xb0\x38\x3d\x36\x9d\x30\x7e" + "\x34\xd7\x48\x7e\x12\x1b\x07\xa1\x7e\x1d\xb3\x59\x8f\x78\xa8\x23" + "\xd3\x96\x2c\xd9\xac\x6d\x54\x5e\xc4\xbc\x08\x9b\xa9\x5e\x6a\x2b" + "\x70\xe9\xb3\x95\xee\xc1\x6d\x45\x7b\xa3\x6d\x1c\x3e\x2b\x07\x63" + "\xcb\x21\x5f\xb4\xb8\xf2\xbf\xed\x36\xec\x27\xfa\x1d\x3b\x82\x5a" + "\x8b\x60\xcd\x37\xe0\x38\xc3\x3d\xd3\x60\x2e\x78\xd4\x91\x84\xf5" + "\x98\xe6\x77\xec\xc8\xec\x0c\x10\xd7\x63\xd0\x71\x60\x6d\xea\x52" + "\x50\xdd\x17\x64\xfa\x6a\x0e\x65\xaa\x2e\x9a\x7b\x1b\xb0\xde\x28" + "\xe0\x3c\xac\xe1\x9d\xe3\xc4\xef\x6e\x0e\xdc\xbb\x71\x89\x7e\x73" + "\xb6\x8a\x79\x0b\x59\x2c\xc7\xce\x58\x69\xaf\x47\x67\x42\x8f\xbd" + "\x1e\xb8\xff\x68\x03\xcd\x6f\xb7\x0d\xd7\xb5\x4a\x73\x03\xae\x53" + "\xf4\x7e\xdc\xff\x01\x18\xf5\x1d\xdb\xc3\xd4\x80\xdf\x08\x68\x6e" + "\x1d\xec\x0b\xcb\x4b\x52\x4f\x7f\x03\xdf\xaa\xf0\xc8\x78\xa9\x13" + "\xd6\xe9\x25\xab\x45\x39\x02\xbf\xf7\x1d\x50\x3d\x45\x8c\xa3\x50" + "\x66\xe8\x52\x60\x9e\x79\xa8\x63\x15\x73\xcc\xd3\x9c\xf2\xec\x7d" + "\x76\x79\xb3\x61\xe4\xdd\x4f\x22\x30\x66\x01\xee\xf1\xa3\x63\xa0" + "\x9e\x37\x16\xe3\x80\x63\x4c\x53\x63\x0a\xe6\xfe\xe9\xfa\xf8\x2f" + "\xc3\xe9\x3e\x69\xab\xf1\xfe\x56\xf4\x05\x33\x37\xa5\xd2\x58\x5d" + "\x01\x53\x93\xed\x3c\xde\x47\x65\x9a\xa1\xf3\xc6\xe2\x35\x9a\x07" + "\x03\xdb\x1c\x70\x4c\xeb\xae\x54\x41\x3e\x36\x83\xfe\x75\x13\xd0" + "\x8a\xea\x45\xf0\x7b\x78\x0b\xe9\x3e\xc9\x72\x1d\xb3\xbc\x0c\x82" + "\x4f\xf8\x20\x16\xe7\x03\xc6\x8c\xc6\x5d\xe8\x9e\xac\xbd\x07\xf3" + "\x82\x77\x3f\x4b\x63\xa4\x67\x9b\x6b\x84\x31\xa8\xc9\x63\xfd\x0a" + "\x99\x99\xac\xa4\x7d\xc4\xfe\xf9\xd6\xb7\x6e\x8d\xa0\xcb\x0c\xea" + "\xc8\xec\x8e\x11\xe3\x83\x30\x99\x8e\xc5\x4e\x67\xb4\xe8\x3e\x24" + "\xc8\xf0\xc7\x85\x67\x1f\xbf\x0a\xcf\x2e\x10\xda\x2c\x66\xf1\xe3" + "\xbb\x22\xa1\x5d\x58\x53\xbb\x1b\x44\x9d\x4a\xd8\xc7\x34\x9a\xe9" + "\x7a\xdd\x76\x49\xa7\x62\x63\x28\xdb\xfb\xb7\x70\x61\xa2\x76\xce" + "\xdc\xc5\xfa\x59\x89\xaf\xc4\x6b\xe3\x16\x2d\x5a\xb8\x48\x8b\x81" + "\xa5\x5c\xe7\x0f\xcb\x97\x65\x57\x0b\x79\x30\x8b\xa5\x3c\x98\xf6" + "\x68\xd7\xdc\xb1\x26\x62\x8f\xb9\x3a\xf6\x13\x7b\x8f\x9c\xb3\x62" + "\x3b\xf9\x4a\x0e\xbf\x95\x94\xc2\xbf\x11\xfe\xcb\xd1\x9e\x32\xd3" + "\x46\x22\x41\xde\xa0\x3e\x64\x52\xdc\x0b\x7b\x04\xfa\x39\xd5\x13" + "\xfb\x89\xcd\x9c\x0a\xe5\x1c\xcc\x4f\x4f\xe3\xc8\x6e\x81\xfb\xe1" + "\xdf\x08\xff\xe5\xf0\x4f\xef\xe3\x3e\xa7\x7b\xf6\x4b\x5c\xaf\x31" + "\x1f\x96\x4c\xcc\x3f\x51\xc3\xaf\x50\xd1\xb9\xc7\xad\x63\xf5\xdc" + "\xfa\xa0\xe4\x33\xaf\x64\x0b\xf5\xe8\xf7\xc2\xe0\x15\x44\xeb\xa1" + "\x9e\x1f\x9f\x69\x56\x09\xf5\xe8\x9e\x4c\xf1\x7d\x30\x0f\x05\xd4" + "\x17\xeb\xa9\xf8\xcc\xae\x30\xa1\x5e\x20\x7d\x6e\xa6\xd2\xd3\x73" + "\xfd\xf9\xcc\xcf\x92\x85\x7a\x6a\xd7\xf6\x5c\xea\x0c\xe2\x32\xeb" + "\xf1\x9d\x6b\xb8\x15\x2a\x16\xbb\x2c\xd3\x9e\x0c\xf5\x3d\xc6\xef" + "\xf5\x8d\x4e\x9c\xd6\x9d\x4e\xfa\x57\xe6\xc6\x3d\x32\x77\x41\x12" + "\x66\x34\x4b\x5c\xb8\x24\x11\x8f\x0b\x66\xfd\x91\x1e\x16\xce\x7c" + "\xf5\x15\xf6\x23\x31\x21\x02\x7f\x24\x00\xbf\xe1\x71\xce\x12\x3d" + "\x1e\x5e\x59\x88\xc5\xe4\xf8\xd1\x4b\x5e\xc1\x83\xfb\x5e\x54\x5d" + "\x47\x26\x57\x0e\xbc\x51\xca\x70\x96\x03\xf9\xef\xfb\x64\x2a\x4b" + "\xaf\x30\x91\x83\x3a\x3b\x11\x6d\x6b\xf2\xb8\x27\xdc\x39\x8c\x7b" + "\x12\xb2\x42\xff\x4a\x88\x7d\x6e\x1c\xac\x19\x15\x1d\x99\xbc\xda" + "\x44\xe6\x25\x0b\xd8\x68\xa2\x31\x70\x33\xb9\x58\xc1\xbf\x54\xc5" + "\x65\x9b\xd1\xef\xbc\x10\xe3\x75\x61\x3e\x77\x28\x1b\xa1\x5c\x07" + "\x65\x9c\x03\x61\x50\x2e\x42\xbb\x18\x94\x35\x50\x1e\xc1\x65\x9f" + "\x2d\xc6\x7d\xce\x50\xd6\x42\x39\x1c\xda\x77\xe6\x7f\xf6\xbc\x67" + "\x90\xcf\x17\x73\xcc\xb3\x7c\xf2\xbc\xc1\x99\x4f\x1e\x73\x7d\xa5" + "\xa9\xa9\x0f\x02\x93\x41\xf8\x32\x3f\xcd\x6d\xab\xa0\x8e\xf3\xfb" + "\x2f\xb3\xb9\xf0\xc7\xc5\x18\x2e\xcc\xa6\x82\xb9\xd5\x0a\x1b\x5c" + "\xca\x80\xff\xdf\x97\x89\x76\x3d\x9a\x17\x14\x8e\x7c\x26\xc6\x1a" + "\xe6\x3d\xea\x6c\x54\x2e\x56\x90\x17\x30\x6e\xb3\x25\x7d\x8e\xe2" + "\xce\xcd\x44\x41\xcb\x2c\xee\x28\x7f\x49\x41\x68\x7e\x74\x31\x26" + "\xa1\x6b\x3c\x0b\x8f\x7b\xb2\x8e\x81\xcc\x40\x73\xa1\x25\x2c\x0c" + "\xb1\xcf\x8a\xa3\x72\xa0\x82\x7c\xca\xf0\xab\xd5\x48\xe5\x05\x05" + "\x79\x8f\x7f\x8e\xe5\xcb\x31\x29\x14\x3a\x16\xff\x2a\x61\x21\x0f" + "\xf7\x86\x24\xcf\x8a\xa3\xe7\xa0\xde\x4a\x90\xd5\x84\xfe\xbd\x55" + "\x3d\x02\xf7\xd9\x72\x2c\x4e\x87\x82\xac\x9e\x71\x5b\x06\x3e\x27" + "\x80\xca\x21\xc7\x48\x20\xe6\x75\xc5\xbe\x6d\x76\x89\x99\x98\x07" + "\xe7\xd0\x8f\xb5\xed\x39\x12\x88\x31\xa2\x85\xbe\xac\xa6\x79\xea" + "\xb2\x14\x5a\x31\xde\x95\x09\xce\xb9\xbf\xcf\x73\xff\x4e\xb9\xf2" + "\xae\x57\x46\x47\x4d\x80\x5f\xa3\x85\xd4\xe8\xae\xbc\x39\xa2\x2d" + "\xd8\x5a\xdc\xf6\xa1\xe5\xbf\x68\xfe\xdb\x2c\x85\x1e\xda\xa1\xfa" + "\x0d\x87\x7a\x78\x47\x74\x21\xf5\x83\x55\x28\x50\xcf\x89\xe4\x32" + "\x51\x9e\x34\xc3\xf3\x15\x85\xc8\xb3\x7c\x60\x6b\xd9\x96\xe5\x18" + "\xff\x5b\x01\x63\xac\xc8\xc1\x6b\x42\x1c\x31\x25\x8d\xb3\xe5\x20" + "\x1a\xba\x4f\x19\x64\x14\xdc\x07\xdb\xa4\x50\x6d\x47\xb9\x03\x6d" + "\x5a\x5c\x96\x62\x0c\xf2\x2d\xd0\x18\xe3\x98\x58\xf9\x60\x73\x06" + "\x1f\xd4\x36\x07\xf9\x18\x65\x5d\xdc\x3d\xd3\xa4\x50\x22\xfe\x3d" + "\x09\xff\x7f\x60\x79\x89\x5e\x6a\x16\xdb\x84\x72\x20\xc8\x50\x15" + "\x70\x54\x77\x64\x29\x75\x2e\xb9\x1f\xd9\xbe\x6c\x85\xf2\x69\x8c" + "\x3f\x87\x6d\x53\xd9\x59\xa1\xa2\x71\x17\xa1\xee\x34\x13\x51\xd3" + "\x18\x31\xf0\x1b\xe4\x9f\x3f\x13\xe1\x37\xc8\x3f\xbf\x8d\x75\x6b" + "\xe3\x13\xd1\x5e\x4b\x79\x5a\xa1\xcc\x07\x1e\x7d\x12\xfe\xff\x00" + "\xf5\x41\x7e\xfb\x1d\xad\xbf\x52\x49\xf7\x6a\x36\xf9\x69\x48\x04" + "\x9c\xdf\x25\x9e\xf7\x57\x44\xc2\x98\x2a\xcb\xc4\xb9\x0f\x7a\x58" + "\x31\x94\x8f\x8b\x76\x1e\x6a\xf7\xc9\x52\x36\xb8\x94\x77\x41\xd9" + "\x2a\x96\x3b\xb2\xfc\x88\x88\x15\x68\x17\x69\x4b\x8f\xde\x88\x7a" + "\xef\x2b\x1a\x90\x0b\x41\xbe\x81\xeb\x40\xff\x35\x34\x5e\x4f\x5b" + "\xe8\x64\x4b\x5b\x66\x4e\xb3\x35\xf4\xd5\x08\x2b\xe0\x1f\x5c\x03" + "\xf9\x6f\xfe\x34\xa1\x9d\x89\x26\xbf\xfd\xe1\xe2\xbb\x71\x99\x7e" + "\x21\x5c\x4e\x5b\x06\x7b\x47\xd5\x2a\xf8\xbd\xca\x12\x64\x8e\x84" + "\x7a\x7a\x13\xe1\x99\x5f\x56\xd2\x45\x43\x76\x97\x7a\x5a\x35\x68" + "\xce\xc6\x57\x91\xe7\x54\xd4\x76\x9d\x93\xa2\x8e\x42\xb9\x13\x63" + "\x91\xd0\x7c\x79\x18\xfb\xd4\x4e\x06\xd1\x7c\x13\x6b\xa7\x34\xd3" + "\x3c\x0b\x6f\xe8\x02\xc5\xb8\xa7\x80\x37\x63\x78\xa5\x3e\x01\x63" + "\xa1\xd2\xbc\x32\x1d\xba\x60\x1a\xff\x54\x88\x7b\xba\x29\x89\x84" + "\x15\x71\x2c\xee\x29\x8d\x53\x32\x08\xf4\x94\x24\xcf\xb1\x4f\xf9" + "\xcc\xed\x81\x62\xec\x53\xbe\xdd\x61\x83\xdf\xe1\x30\x1e\x2a\x38" + "\xea\x68\x59\x8a\x79\xa5\xf2\x18\x0b\x55\x09\xb8\xa7\x64\xb1\x50" + "\x7d\x5a\x2f\x14\x2a\x96\x73\x35\x4b\x05\xf8\x97\xca\x7c\x8a\xa4" + "\x73\xef\xc1\x9c\x61\xb6\x62\x85\x72\xa2\x70\xae\x14\xe8\x12\x26" + "\xe8\xa5\x16\xb4\x33\xa0\xbd\x0c\x30\xa1\x82\xef\x8e\xdf\xe8\x09" + "\x73\x5a\x43\x13\x4a\x5a\x31\x46\x46\x96\xca\x66\x52\xf8\xd3\x9c" + "\xbe\x54\x97\x54\xa8\x7a\xc4\x6d\x9e\xfd\xca\xc2\x39\x71\x33\xe7" + "\xcd\xd7\x6b\x9f\x9b\xf6\x24\x4d\xc8\x39\x5a\x3b\x37\x31\x8e\x2e" + "\x49\xda\xe7\x26\x3c\x31\x75\xea\xb4\x99\xff\x3e\xed\xf1\x69\xd3" + "\xff\xfd\x51\xb6\x6b\x72\xda\x22\x1a\xf6\x34\x71\xa1\x16\x6f\x9a" + "\x2d\x64\xad\x4f\x89\x5b\xb4\xd0\x1d\x0f\xc2\xa8\xad\x4d\x49\xed" + "\xca\x56\xfc\x4d\xed\x79\x0a\xff\x02\xd1\xce\xc6\xb0\xcf\xff\x4d" + "\x1c\x5b\x9a\xd3\x3e\xcb\x3f\x10\xe5\x2b\x1a\x53\x28\x94\xae\x3b" + "\x2a\x9c\xd3\xb8\xfe\x74\x64\xf9\x1b\x5d\xe3\x83\x09\xf7\x36\x28" + "\xf1\x3e\x61\x2e\x0b\xe7\x3a\xf9\x5b\x6e\x49\xa7\x31\xbe\xb2\xfc" + "\xad\xa2\xed\x1d\xcf\x89\x7d\xa8\xc7\x3a\x59\xfe\x8f\x3a\xf3\x56" + "\x67\x0d\x1a\x21\xe5\x3b\xa5\x7f\xb2\x31\x22\x04\xc5\x19\x7f\x90" + "\x55\x06\xc1\xff\x60\xfc\x9f\xe8\xc4\xf7\x24\xbe\x16\x75\xb6\x10" + "\x05\xac\xc1\xc9\x7e\x2c\xc7\x59\xd6\x71\x9a\x97\x63\xaa\xc3\xee" + "\x37\xd3\xa1\x84\xa3\x1f\x3f\xd3\xa1\xa2\x7a\x22\x9f\xc4\x1f\xa7" + "\xfb\xfd\x93\xf8\x1a\xcc\xe5\x07\x7c\xbc\x7a\xaa\x3d\x6d\xf5\x54" + "\x07\x6f\x9f\x09\xf2\x3b\x1c\xcf\xe3\xbe\xf5\xa9\x8e\xf3\x3c\xcd" + "\x67\x84\xf6\x1c\x16\xeb\xb0\x1c\xfd\x38\x67\x00\x0f\x6f\x6e\x65" + "\xb9\xaf\xa7\x2e\xfd\xe1\xec\xcc\xa5\x26\x96\xfb\xfa\x12\xcb\x17" + "\x8f\xcf\x87\x36\xd3\xa0\x9d\x43\x33\x1d\x7e\xda\xa9\x8e\x6e\x9e" + "\xee\xbd\xcd\x1a\x4c\x7a\xcb\x67\xed\xd1\x7e\xb1\xa6\x6b\x34\xbf" + "\xb6\x7d\x1a\xbf\xc6\x11\x00\xc7\xe3\x7c\x76\x5b\x01\x62\x38\xbf" + "\x86\x6f\xe0\xd7\x76\x4c\xe3\x73\x95\x46\x38\x1e\xe7\x73\xfd\x8b" + "\xf8\xb5\xa0\x7f\xe6\x06\x24\xc3\xf1\x38\xbf\xe6\xd4\x1c\xa8\x1f" + "\xc5\xaf\xf9\xf6\x38\x1c\x6b\xf8\x35\xa7\xc7\x43\x3d\x28\x9f\xd9" + "\x05\x47\x28\x9b\xc2\xa1\x1e\x94\xcf\x15\x34\x29\x06\x97\xc1\xef" + "\x1a\x3e\xf7\xc6\x69\xf4\x59\xb9\xc1\xb1\xf4\x59\xb9\x43\x13\xd8" + "\x33\xc2\x92\xd9\x33\x6e\x5a\xc5\x9e\x71\x4b\x3e\x7b\xc6\x77\x2a" + "\xa8\x17\xcd\xaf\x69\xb0\xc0\xb1\x96\x5f\xd3\x54\x07\xf5\xa0\xdc" + "\x5c\x0e\x47\x28\xb7\xc0\xb3\x6c\x50\x36\x1b\xe0\x08\xe5\x4b\xd9" + "\x50\x2f\x86\x5f\x63\x49\x85\x63\x1d\xbf\xa6\x15\xdb\x87\xb2\x35" + "\x06\x8e\x50\x6e\x9f\x04\xf5\xa0\x6c\x1b\x07\xc7\x3a\x3e\xf7\x36" + "\x78\xa7\xf6\x58\x3e\xf7\x8e\x28\x38\x9a\xf8\xdc\x91\xf0\xbc\x0e" + "\x28\x8f\x2a\x85\x23\x94\xc3\xe1\x7e\x1b\x94\xff\x49\x0b\x47\x28" + "\xff\x1a\xdf\x75\x0e\x9f\x7b\x37\x3e\xa7\x81\xcf\xbd\x17\xdf\x19" + "\xca\xa3\xed\x70\x84\xf2\xfd\xd8\x1f\x28\x47\xe0\x7d\x50\xfe\x0d" + "\x8c\x41\x7b\x3c\x9f\x3b\xc6\x0a\xc7\x66\x3e\xf7\x77\x30\x0e\x1d" + "\x50\x7e\xa4\x00\x8e\x50\x7e\x14\xc6\xd0\x06\xe5\xc8\x31\x70\x84" + "\xf2\x93\xf8\xbe\x09\x7c\xee\x84\x5a\x38\x9a\xf9\xdc\x89\xdb\xa0" + "\x1e\x94\x7f\x9f\x01\x47\x28\x4f\x81\xf1\xb3\x41\xf9\x59\x1d\x1c" + "\xcd\x1e\xe9\x99\x3b\x2d\x81\x5f\x31\x88\xf0\xb9\x33\x0d\xfc\x8a" + "\xc1\x70\x9c\x15\xc5\xaf\xf0\xd7\xf1\xb9\x71\x04\xce\xc3\x71\xf6" + "\x38\x28\x8f\x16\xca\x70\x7c\x45\x07\xe5\x08\xa1\x0c\xc7\x39\x61" + "\x50\x1e\x23\x94\xe1\x38\x17\xcb\x63\xf9\xdc\x79\x70\x1c\x04\xc7" + "\xb9\x05\x50\x1e\x27\x94\xe1\xf8\x47\x13\x1c\x61\xbd\x79\xb5\x02" + "\xce\x47\xf2\xb9\xaf\x65\x43\x19\x8e\xf1\x93\xa0\x3c\x1e\x8e\x25" + "\x50\x1e\x6f\x19\xd9\xa8\xc5\x35\x9e\x0f\xdd\xa3\xe6\x42\xbb\xf0" + "\x7b\xa9\x12\xe3\x32\x95\xa4\x99\x30\x36\xcd\x1d\xf5\x8a\x1b\xb6" + "\x62\xfe\x16\xac\xe3\x58\xd7\x1e\xc5\x85\xb6\xa3\xaf\xfc\x20\xa8" + "\x37\xb8\x49\x31\xe4\x13\xc4\x98\xea\x54\x13\xcd\x1b\x29\xc4\xdd" + "\x1c\x04\xf7\x1c\x02\x99\x09\xf4\x77\x5c\x4b\xda\xb3\xf9\x4c\xff" + "\x56\x18\xa7\x40\x3e\xf3\xc6\x7a\x38\x42\x79\xe8\x31\x18\x27\x28" + "\xff\xf3\x1a\x38\x42\xf9\xa5\x27\xf8\xb5\x9d\x80\x33\x43\x74\x26" + "\xc5\x60\x2d\xc5\x8c\x0f\x2d\x86\x10\x3b\xcf\x4f\x05\xf4\xe4\xb7" + "\x86\x6b\x43\xec\x46\xc2\xaf\x0f\x80\x73\x91\x50\x6e\xd2\xf2\xa1" + "\x5f\xb0\x7e\x67\x82\x6e\xdd\x1d\xae\x64\xcf\xbe\x91\xaf\x57\x0c" + "\x99\x8e\xb9\x46\xf8\xd0\x33\xde\xae\x2f\xa1\xd7\x47\x85\x1b\xd8" + "\x75\x35\x91\xae\xff\x01\xaf\xaf\x0f\xc1\x98\xfd\xa3\x8e\x1b\x4c" + "\x8a\x21\xbb\xb1\x8e\x49\x71\x43\x2d\x9f\xe9\x47\xaa\xad\xcd\xc2" + "\x3b\x0e\xc6\x7a\x7b\xf0\x3e\x6f\x36\x1f\x2e\x2c\x58\x93\x03\x98" + "\x87\x3a\x70\x88\x05\xf3\x9a\x87\x97\xd6\x2b\x02\x23\x36\xa1\x8c" + "\x14\x76\x67\x2c\xc3\xc2\x1b\x9f\xb5\xe7\xb6\x55\x68\x53\x42\xa0" + "\xbd\xc0\x07\xd3\x6d\xbc\xd5\x98\xf6\x04\xe0\x28\x9e\xb7\x06\xd0" + "\x3d\x4b\xac\x8e\x95\xfa\xa2\xb2\xdf\x26\x6a\xf7\x86\xb6\xf0\x5e" + "\x2a\x9f\x09\x34\x73\x64\x1d\x51\xf3\xc3\xef\xd4\x03\x0d\x1e\x83" + "\xb6\xa7\xef\xe1\x2c\xca\x60\x0b\xf1\xd7\x26\xed\x83\xf6\x6f\x64" + "\xfe\x51\x42\x5d\x7e\xd0\x11\x35\x47\xeb\xd2\x6b\x2b\xf6\x01\xbd" + "\x31\x56\x45\x47\xd6\x8d\xdb\x9c\x79\xbb\x0b\x82\x35\x18\xa7\x02" + "\x9e\x11\x89\x6b\x31\xdd\x8f\xa9\x08\x0c\xac\x04\x9a\x38\xd4\x7b" + "\xc8\x03\x89\x44\x15\x62\x53\x2b\xd2\x96\xd0\x3d\xca\x56\x63\xca" + "\x31\xea\x3b\x8d\xed\x43\x9b\x57\xf8\xe0\xb6\x52\x8c\x6f\x80\x36" + "\x91\x3c\x0e\xda\x83\xe7\x19\x93\x4e\xe1\x7b\x57\xee\x6b\xb5\x28" + "\x3b\xb2\x02\x35\xe2\xb3\x70\x7d\xc8\x81\xb1\x41\x19\x19\xe3\x6b" + "\xcc\x74\x38\x30\x5e\xdd\x6a\xd7\xf1\x9d\x2b\xc4\x13\x98\xbb\x20" + "\x71\xd1\xeb\xda\xc5\x73\x53\xe2\x1e\xbd\x6b\xc9\x68\xed\xa2\x64" + "\xed\x22\x5c\x16\xd9\x09\x58\x3a\x17\x27\x2c\x4c\xd4\x62\x36\xfa" + "\x9e\xb9\xac\x35\x5c\x60\x5b\x3e\x8d\xf5\xa4\x08\xa5\xba\x28\x67" + "\x08\xd7\x24\x26\xf2\x1c\xbf\x2e\xa1\x96\x4f\x9f\xc8\x74\x1e\x45" + "\xe0\x27\xda\x51\x83\x41\x16\x1e\x7a\xa1\x73\x50\xe0\x38\xe8\xa7" + "\x11\x78\xa1\x4e\xf8\x8e\xc6\x62\xff\x29\x42\xd1\xef\x95\x7d\x67" + "\xce\x0a\x34\x99\xc8\x1f\x99\x5c\x66\xb8\x33\x99\xad\x85\x41\x54" + "\x1f\xe6\xb5\xe1\x1a\xde\xd0\xa4\x05\x79\x4a\x41\xbf\xe9\xd9\xef" + "\xe0\xab\x49\x2b\x8d\x23\x00\xfc\xac\xc5\xf8\x1d\x8e\x75\x9d\x16" + "\x6e\x78\x80\x96\x7b\xb7\xc9\x94\xbe\x95\x28\x77\x02\x2d\x54\x5a" + "\xe0\xb3\x51\xe4\x8e\x7d\x69\xcd\xca\x4b\x8a\xa0\x91\xfb\xd2\x6a" + "\x95\x7c\x7e\x57\x46\x9b\xb6\x99\xd8\x84\xbc\xe6\xd5\x76\x1b\xf9" + "\x72\x3c\x41\x7d\xaa\xd4\x3a\x4c\x5d\x6c\x1d\xda\x59\x6b\x5b\xaf" + "\xa9\x31\x8e\xfa\x0d\x99\x70\x37\xff\xc3\x17\x65\x84\x98\x15\x43" + "\xeb\xbe\x18\x8f\x32\x7e\xdb\x6a\x5b\x60\x5b\xb6\x75\xc3\x60\xf4" + "\x97\xb7\x74\x6e\xd0\x98\xba\x42\xed\xea\x03\x50\xe7\x30\xe8\x20" + "\x47\x40\x93\xc6\x38\xb1\x9d\xa3\x1a\xf5\x3b\xbb\xf2\x95\xe5\x65" + "\xe3\x98\xfd\x35\x16\x78\x77\x36\x7d\x9f\x83\x5f\xec\x2a\xc3\x67" + "\x93\x9d\x5d\x13\x95\x5f\x8e\xed\x71\xbd\xf1\x8b\x88\x32\xd2\x81" + "\xf1\x96\x41\xc7\xdb\x7b\xaa\x90\xf0\x1b\x82\x6b\xb6\xa7\xd8\x94" + "\x31\x26\xa2\xac\xac\x2d\x24\xa9\x8d\x24\xc8\xfe\x83\x4e\xf5\x11" + "\xdc\xdf\x89\xf1\x50\x8f\x68\x68\x5c\xc4\x34\x23\xcd\x33\x1c\x52" + "\x05\xeb\x36\xf7\x83\x6e\x50\xd5\x34\x23\x81\xeb\xf7\xdb\x7f\xaf" + "\x21\x95\xf1\x16\x52\x1d\x6d\x20\x9d\xca\x48\xf2\xe9\x8b\x06\xf2" + "\x0e\xe8\x0b\xef\x5c\x22\x81\x54\x06\xed\xd6\x0d\xb2\x77\xeb\x54" + "\xf6\x65\x3a\x8c\x53\xc5\xf3\x3f\xe8\x86\xa0\x4c\x6a\x5f\xa8\x0b" + "\xa8\xb2\x18\xc8\x03\xcd\x44\xd7\xa9\x24\x21\x9d\xcb\x74\x43\xaa" + "\xf4\x85\xd0\x16\x08\x99\x30\xae\x18\x23\x0f\x63\xe7\xe1\x38\xdd" + "\x18\x4d\xa6\x99\x15\x41\x9b\x86\x1c\x27\xc3\x30\x46\x2b\xca\x79" + "\x18\xdf\x19\xe6\x6f\x8d\x23\x6c\xb0\x21\xed\x0a\xf4\x0b\x63\x10" + "\x7d\x68\xc9\x40\x39\x19\x64\x00\x05\xbe\x33\xc7\xeb\x86\xcc\xc4" + "\x63\xae\xf9\x7e\x94\x95\xb9\x0e\x0d\xe6\xf0\x0a\xc0\x7e\x62\x3e" + "\xed\xe5\xe7\x60\x2c\xd3\x75\x2a\xa8\x17\x08\xe7\x83\xab\xcd\x36" + "\xe2\xb8\xdb\x92\x7f\xbf\x9e\xe6\x49\x0e\xdb\x9c\x46\xd4\xf9\x69" + "\x24\x4c\xfb\xcf\x38\x76\x43\xf7\x38\x3e\xb0\x64\xf0\x59\xb7\x1b" + "\xd1\x2e\xc2\xce\xa9\x37\x69\x9f\x22\x44\xfb\x1b\xfa\x7b\x82\xf6" + "\x11\xa0\x61\x58\x70\x04\x95\xe3\xa9\xee\xa8\x7e\x98\xf1\xaa\xfa" + "\xc1\xce\x41\x73\x55\x5c\x56\x91\x96\x5b\xa1\x1a\x81\xf9\xd8\x2f" + "\x29\xd4\xc3\xf8\xdc\xa4\x28\xbe\x40\x53\x4a\x73\x74\x28\xd4\x43" + "\x3b\x07\xdd\x02\xeb\x59\xd2\x2e\x68\x7f\x5c\xa7\x42\x75\x1c\xfe" + "\x6b\x85\xfb\x03\xf0\xbd\x1d\x86\x46\x1b\xbe\x37\xcd\xfb\x04\xef" + "\x35\x13\x68\xc6\x0f\x0f\x32\xd1\x5c\x08\xdd\x30\xbe\x42\x5e\x5c" + "\x1c\x0f\x1c\x03\xae\x5b\x37\x84\xbe\x6b\xb7\x2e\x10\xc6\x17\xe3" + "\x31\x87\xa4\xcd\x82\x7b\x36\x04\x59\xe1\x5a\x70\x67\x58\xb0\x0e" + "\xf3\xaf\x55\xeb\x2d\xc4\xb1\x3e\xc8\x82\xf1\x06\x37\xa6\x10\x35" + "\x37\x2c\xc8\xc4\xaf\x0f\x02\x19\x9b\xce\x1f\x82\xfd\xe4\x72\xdf" + "\xc0\x7c\xdc\x0a\xe8\x3f\xac\x81\xaa\xe3\xf0\x5f\x6b\x52\x84\x64" + "\x77\x8e\x6c\x02\x99\x3d\x24\x16\xfa\x3a\x82\xcf\xfa\x67\x0b\xfe" + "\x86\x6b\x23\xa0\xcf\x4b\x70\x1c\x70\x3c\x84\xb1\x98\x2f\x8d\xc5" + "\x2b\xa3\xa1\x5e\x0c\x97\xb5\xa1\xcc\xa4\x50\x8f\xe3\xb3\x1e\x2c" + "\x71\xa9\xb7\x5e\xaa\xb7\xa0\x86\xd5\xdb\x9a\xc8\xea\x8d\xd3\x01" + "\x1d\x1e\x14\xc6\xfb\xa4\x87\xf1\x3e\x2a\xdd\xfb\x87\x64\x76\x6f" + "\xb6\x8a\xdd\xfb\x6b\xbc\xf7\x06\x79\x9f\x86\x2a\xa4\xfa\xcf\x6e" + "\x63\xf5\xb3\x76\xb1\xfa\x23\xad\x2e\xf5\xee\x96\xea\xbd\x3c\x96" + "\xd5\x5b\x3b\x89\xd5\x1b\x3d\x0d\xae\xc7\xf5\xec\xcb\xd0\x97\xa5" + "\x7b\x52\x76\xb3\x7b\xb6\xc5\xb3\x7b\x9e\x6a\x80\xeb\xeb\xdd\xfa" + "\x92\x23\xd5\x4f\x14\xde\xfb\x3f\x6d\xac\xfe\xe3\xf9\x2e\xf5\x3e" + "\x61\xf5\xf0\xfa\xc7\x50\x4f\x1d\xd1\x39\x28\xc3\xc0\xea\x4d\x8a" + "\x40\x7e\x84\x3a\x27\xb8\x2c\x6d\x54\xe7\xa0\xdb\xc6\x41\x3b\xe1" + "\x40\x1b\x0d\x1e\x81\x76\x1a\x2e\xbb\x6d\xb5\x49\x11\x5c\xb4\x99" + "\xd9\x06\x30\x17\x37\xf0\x85\x96\x6c\x0e\x25\x81\x1b\x43\x59\xfc" + "\xf9\x8e\xac\xd0\x40\xa7\xbc\x2f\x60\x28\x62\xb0\x49\x11\x58\x08" + "\x38\xec\xf0\x68\xaf\xca\x0a\x8d\x74\xda\xcb\x38\x58\xcf\xd7\xb6" + "\x7b\xdc\x5b\x40\x73\x74\xe3\x9a\xbe\xae\x5d\x9f\xcf\x11\xcc\x8b" + "\xae\x00\x7e\x06\x79\x24\x74\x2e\xac\x5f\x34\x3f\x35\x57\x10\x60" + "\xe0\xb4\x80\xc7\x17\x89\x5f\x75\x6a\x33\x29\xe1\x9a\x95\xf9\x5d" + "\x44\x55\x05\xda\x07\xd6\x2f\xe1\x40\xee\x59\xe0\x07\x6b\x62\xe8" + "\x8a\xfc\x76\xa1\x3d\x43\xb8\x36\x7d\x3e\xcb\x6f\x8e\xb2\x10\xe2" + "\x38\xcc\xdd\x40\x9a\x77\x6f\x01\xca\x02\xa1\x9f\xc0\xef\x00\xac" + "\xdb\x39\xaa\xc1\xd0\xf9\x6e\xb8\xb6\x2b\xb4\x5b\xdd\xf5\xee\xf9" + "\x8c\xee\xe1\x01\x86\xee\x0d\x83\xb5\xf6\x77\xef\xcc\xb7\x8f\x6a" + "\xd2\x3a\x42\xbb\xf3\xe1\xd9\x80\xf1\x85\xca\x1d\x5c\x89\x72\x47" + "\x9a\x51\x89\xed\xee\x4b\x33\x28\xf7\xa6\xd5\x28\xf7\x72\xa5\xca" + "\x7d\x69\xf9\x70\x2c\xc6\x1c\x6c\x20\x7f\xfd\xca\x7f\x6f\x5a\x39" + "\xac\x31\xbf\x1a\x0f\xe3\x35\x5a\xb4\x37\xf2\x4f\xd8\x49\x55\xb1" + "\x9d\x1c\x4c\xbc\x42\x2c\x41\x6d\xf9\xf0\x5f\x60\x19\x16\xac\xb1" + "\x0c\xd3\xd4\xd0\x3e\x0f\x0f\x31\xe0\x3b\xe2\x9e\xd6\xbd\x1c\xeb" + "\xb3\x30\x1e\xd8\xe6\xfc\xcd\xf8\x5d\x55\x8c\x5f\xad\x08\xd3\xf5" + "\x88\x5f\xad\x64\xf9\xff\x9c\x31\xac\x7f\x8a\xf8\xd5\x82\x5e\x4f" + "\xe3\x57\x83\x8e\x46\x75\x35\x58\xeb\x68\xce\x50\x3b\xc8\x54\xeb" + "\x07\xe5\xa3\x4e\x86\x32\x54\x47\x56\xd8\x34\x51\xa7\x42\xb9\xc1" + "\x91\xd3\x66\x80\xff\x22\x38\x9f\x60\x52\xfc\x4d\x8c\x91\x6f\xe5" + "\xd7\xed\xc5\xfc\x85\x7e\x0e\x3e\xfe\x5f\x85\x6f\xe5\x8f\x39\xd6" + "\x76\x9a\x1c\xeb\x35\x25\x70\x6e\x1c\xfc\x3f\xea\x58\xbb\x37\x0c" + "\xfe\x35\xf0\x3f\x02\xfe\xb5\xf0\x1f\x0e\xff\x3a\xf8\x8f\x80\xff" + "\x31\xf0\x3f\x16\xfe\xc7\xc1\x7f\x24\xfc\x8f\xe7\x87\xee\x1d\x8d" + "\xf1\x37\xa1\xed\x28\xa0\xbb\x46\x6c\x57\x1a\xdf\xb0\xa3\xf0\xbe" + "\x91\x28\xd3\x70\xb9\x49\x09\xd4\x8e\xbf\xb5\x51\x47\xe7\x08\xe0" + "\x17\x3f\xb2\x99\x58\x46\x86\xab\x2d\x23\xef\x4c\xb6\x0c\xfd\x35" + "\xfe\x67\xc0\xff\x6a\xcb\xfa\xe0\x08\xa0\x5f\x29\xd0\xd1\xd8\x91" + "\x35\x6c\x8c\x49\x31\x42\xc3\xec\x3e\xc3\x22\xe1\xf7\x58\xe1\x37" + "\x60\x83\xc6\x80\xbf\x2d\xc3\x42\x32\xa0\x1c\x63\x52\xdc\x42\xeb" + "\xb5\x0d\x0f\x8e\x14\xf6\x77\xe2\xf9\x44\x93\xdf\x29\xba\x9f\x13" + "\x65\x1b\xd1\x4f\xc0\x75\xde\xcc\x7f\x45\x3f\x73\xfe\xac\xe4\x99" + "\x8b\x13\xe6\xbe\x12\xb7\xf8\x11\xed\x5d\x73\xb4\xba\xb9\x8b\x5e" + "\x9f\xf9\xfa\x92\xb8\x25\x71\x54\x9c\x82\x53\x77\xcb\x7d\xd8\x70" + "\x3f\xab\x1d\x64\xf3\xe0\x39\x3c\xbf\xfc\x65\xa2\x9c\x64\x01\x5e" + "\x1b\x15\xae\x0d\x6a\xd8\xc2\xef\x6e\xb1\x28\x27\x99\x4d\xc4\x8e" + "\x32\xcf\x86\x00\x43\x70\xc3\x63\x70\xce\xa6\x9c\x84\x31\x13\x81" + "\xf7\xab\x1b\x8c\x04\xeb\x30\x19\xe8\x73\x52\x81\x32\xd0\x86\x00" + "\x2d\xd6\xe1\x41\xf6\xa1\xc7\xd0\x4e\xcb\x64\x68\x83\x87\x39\x83" + "\x75\xf7\xc0\x39\xf4\x99\xe0\x61\x3e\xf1\xed\xcb\xf9\x0a\x68\x63" + "\xef\x3c\x8b\x12\x6d\x59\x53\xb0\x5d\x98\x4f\xfc\xbb\x0d\x86\xbd" + "\x50\x77\xef\x3c\xb8\x7f\xd4\xf9\x0c\x1e\xe6\xda\x1e\x28\xd7\x2b" + "\x6e\x52\xef\x85\xfb\xa9\x9c\x0f\x7d\xdc\x09\xe7\xd2\x97\x10\x95" + "\x38\x87\x51\x4e\x75\xce\xe3\x24\x94\xf7\x86\x2f\xc5\x79\x0c\x7d" + "\xd1\xf2\x30\x6f\xb7\xc3\xbd\x3b\xe6\x31\xdd\x07\xe4\x66\x3f\xd4" + "\x73\x10\x2b\x10\x23\xaa\x53\x99\xbe\x53\xc2\xd5\x82\x9e\xe4\x87" + "\xf7\x7e\x8a\xd7\xde\x01\x9e\x63\x72\xf4\x70\xab\x28\xdb\xfe\x59" + "\x88\xf7\x76\x63\x1d\xf0\xc7\x0c\x72\xc7\x25\xc5\xb0\x4a\x1c\x3f" + "\x1c\x27\xfc\xf6\xc9\x67\x0d\xcb\xc6\x98\x12\x45\xa1\x24\xa0\x7b" + "\xfd\x9d\xf1\xcc\x2e\x72\xd3\x18\x11\x27\xad\x61\x77\xc6\xbb\xd2" + "\x8d\xd1\x4b\x1b\xb7\x60\xd6\xec\x84\xb8\x39\xf4\x73\xd9\xac\xc5" + "\x8b\x97\xcc\x8f\xd3\xc6\xcd\x7a\x25\x5e\x4b\x2f\x6b\x97\x2c\x86" + "\x2a\x73\x13\x17\x6b\x17\xbe\xb1\x40\x3b\x7f\xf1\x5c\x94\x9a\xe3" + "\x16\x2d\x5a\xa2\x4f\x1c\x42\xd8\x9d\xda\xf9\x4b\x12\x12\xe7\xea" + "\xe1\xc7\xe2\xb8\x05\x73\xb4\x94\xea\x8b\xa1\xa9\x84\x04\xad\xf0" + "\x84\xc5\xf1\xb3\x16\x21\x23\x2c\x78\x0d\x2a\xb9\xdc\x2f\x97\xa9" + "\x03\x31\x9e\x1e\xfa\x71\x5d\x52\x68\xd6\x97\xa9\x60\xac\x0b\xee" + "\x8c\x47\xdf\x03\x28\x17\x50\x5d\x28\xeb\xa6\xf1\x68\x23\xfe\x4b" + "\x28\x51\xb5\x01\xef\x77\x64\x69\xd4\xe2\xbb\x51\x9b\x31\xc6\x18" + "\xc5\xf8\xb5\x0a\xcd\x0a\xba\xdf\x18\xe6\x01\xf5\x4d\xc9\xba\xe9" + "\x0f\x6c\x2c\x34\x91\xae\xf6\x27\x66\xef\xd4\xbc\x80\x7e\x78\x30" + "\x17\x0a\x50\x8e\x10\x72\x42\x28\xe0\x9e\x37\xf1\x1e\x6e\xbd\xa6" + "\x14\xee\x4b\x96\xd6\x1a\x4d\x14\xd6\xa7\xf5\xb2\x6e\x7a\x97\x1f" + "\x16\x1c\x01\xe7\xa8\xed\xda\xcb\x5a\xa2\x6d\x87\x76\x8f\x94\x10" + "\x72\x6f\x18\xd1\xb5\xe7\xb6\xdb\x3a\x82\xdb\x8a\xbb\x32\xc9\xe0" + "\x2e\x98\xcf\x36\x25\xb9\xa3\x13\xf8\x62\xe9\x83\xc4\x6f\xf9\x64" + "\xa2\x2c\x99\x57\x82\x31\x92\x49\xc5\xc4\x42\x52\x1d\x0b\xfa\xb0" + "\x6d\x1b\xa9\x30\xd6\x93\x4a\xfb\x87\x2c\xef\x48\x0a\xca\xe2\x37" + "\x77\x62\x4c\xbc\xf4\xe5\xbc\x63\xe7\x67\x16\xff\x1d\x2d\x25\x98" + "\x2f\xe4\x8e\x6a\xfb\x59\x63\x75\xea\x7b\xa4\x3a\xb9\xda\x88\xf1" + "\x48\x60\xdc\x1a\xf7\xc2\xb5\x1b\x2a\xe0\xbe\x29\x64\x30\x94\x4f" + "\xe2\x33\x56\x6f\xe0\x6b\xdf\x1a\xce\xd7\xbd\xb5\x81\x37\x65\x0f" + "\xe7\x1b\xb2\x85\x1c\x20\xf8\x6d\x1f\x7d\x18\x90\x4f\xf5\x49\x44" + "\xd3\xa2\xb8\x59\x4f\xf5\xf2\xf1\xb4\x7c\x33\x94\x29\x36\x57\x27" + "\x6f\xc0\xf2\x2d\x50\xce\x67\xe5\xcd\x58\xbe\x15\xca\x06\x56\xfe" + "\x02\xcb\x23\xa0\x5c\xc2\xca\x55\x84\xc6\xd5\x50\xdc\x6c\x64\xe5" + "\xaf\xb1\x0c\x63\x7f\x73\x8d\x31\x09\xfb\x7b\x06\x68\x76\xf3\xe9" + "\xf4\xd3\x44\x59\x9d\xdc\x44\xe7\xc3\xbe\xb4\x78\xb4\x1b\xc0\x7c" + "\xb8\x79\x16\xf2\x3b\x60\x13\x19\x14\x81\xc7\x9b\x41\x57\x24\x83" + "\x41\xbe\xba\x11\xde\xe7\x28\x8e\x9d\x47\x3b\xc9\x87\xcd\x53\xa7" + "\xda\x79\x23\xe8\xf8\x1a\x7e\xfd\x0d\x5a\x7e\xeb\x79\xcc\xd3\x0d" + "\xf3\xbc\x3d\xa2\x24\xc5\x46\xe3\x54\x83\x4c\x0b\x73\xe8\x16\x1a" + "\x2f\xc6\x02\x32\xa2\x97\xb8\xb5\x6a\x7e\x6d\x97\x1e\x74\xaf\x80" + "\xc9\x3a\x3b\xfa\x4b\x83\x5c\x7c\xcb\xd1\x83\xf1\xd0\xd6\x86\x90" + "\x95\x9c\xe1\x7c\x2c\x97\x1e\x4d\x78\x6d\x93\x66\x72\x3c\x6f\x84" + "\xb5\x4a\xc1\xec\xcc\xfc\x59\x78\xfe\x59\xfa\xdc\x91\x4d\x1a\xee" + "\x8d\x78\xcc\xff\x45\x10\x63\xd2\x70\xdd\x4e\x02\x3c\x59\x16\x1d" + "\xe2\x58\x1f\x92\x71\x30\xbe\xd1\xb7\x5c\x7a\x8a\x5b\x6a\xbc\xfa" + "\x2b\x41\x9f\x30\x6e\xab\x1d\x9e\x63\x87\x77\x45\x19\x61\x07\x57" + "\xae\x04\x59\x45\xb3\x7d\x76\xad\x3f\xff\x46\x74\x08\xbc\xd3\x83" + "\xd5\xba\x2b\xa4\xaa\x0b\xe7\xca\xad\xf9\x07\x93\x09\x99\x90\x6c" + "\x37\x86\x58\x68\x7c\x6d\x35\xe6\x9b\xe1\x87\x76\xe9\x5b\x14\xb7" + "\x9a\xa6\xa4\xc2\x3b\xc0\xbb\xef\xad\xaf\x55\x71\xf0\x1e\x0f\xb0" + "\x71\xc3\xfb\xca\x60\x6c\x03\x44\x5d\xc0\xb7\xfe\xdf\x4a\xf9\x86" + "\x5b\x1c\x4d\x70\x1f\xf4\x4e\x90\x4b\xb8\xee\xe8\x10\x0e\xd6\x21" + "\xbc\x76\x50\x77\x91\xe0\x33\xd9\x58\xdf\xba\x96\xe9\xbf\x30\xce" + "\xf0\x7c\x8c\xeb\x2d\x8e\x2b\xd4\x2d\x73\x74\xc7\x7b\xa6\xff\x86" + "\x90\x28\xe8\x1f\xe1\xd7\xee\xf5\x7c\x7d\xdd\x9e\xb3\x8c\x3f\x1a" + "\xc7\xc2\xff\x44\x7e\xeb\x9d\x19\x96\x91\x8d\xd1\x34\x3f\xeb\x86" + "\x41\x06\xf1\xfb\x2b\xcc\x37\xe0\x91\x11\xb3\x4a\x40\x7f\xf6\x9c" + "\x8f\x64\x32\xcb\x8b\xe7\x7f\x96\x0f\x71\x60\xbe\xe7\x2b\x18\x23" + "\xbe\xf9\xa0\xce\xea\x23\x4d\x47\xbc\xe7\x8d\xa6\xd8\x3e\xe8\xe1" + "\xdd\x3e\xb6\x67\xf5\xca\x23\x06\x18\x17\xf5\x5e\xd2\xc5\x8f\x57" + "\x30\x79\xfd\xf6\x8d\x38\x56\xb8\x8e\xa4\x9c\x20\x4a\x1b\xac\xa1" + "\x1f\x3e\xbf\x5a\x39\x3a\x96\x28\x1c\x20\x03\x1c\xaa\x29\x23\x53" + "\x27\x91\xf4\xca\xf8\x56\x22\xe6\xbb\x83\x75\x4d\xfb\xc1\xf3\x16" + "\x25\x7e\xef\xc1\xfc\x76\x54\xb7\xdd\x10\x14\xf5\xd1\xd7\xb0\x76" + "\x82\xfc\xb0\xfd\x6b\x8b\xd2\xde\x16\xad\xa5\x31\xea\x41\x8f\x4f" + "\x8f\xe7\x39\xe7\x37\x20\xcc\x63\x92\x6d\x1e\x83\xf9\xc3\x8f\x44" + "\xd5\xd0\xb8\x01\x47\xa2\xcb\xc8\x91\xba\x42\x52\xd1\x70\x1a\xf7" + "\x53\x6f\x3d\x12\x9d\x8f\x72\x63\xb0\x1d\x64\xc3\x77\x40\x36\x84" + "\xf9\x7a\x03\xa7\x9e\xdc\x2c\x7e\x07\xc2\x7c\x78\xa2\x5c\x68\x87" + "\x39\x5a\x24\xe4\xbc\xb3\x67\x8d\x58\x5d\x24\x7c\x13\xc2\x5c\x78" + "\x6f\x27\x91\xf0\xb7\x95\x5c\xb4\xa7\xef\x3f\xc1\xaf\x53\x9f\x6b" + "\x0d\x37\x74\x72\xb3\x98\x13\x6f\xca\xeb\x5a\xf2\x77\x78\xf7\x83" + "\x3a\x5f\xe7\xe4\xed\xd4\xb7\xcd\x0e\x7c\x67\x07\x9e\xb3\xc3\x78" + "\x9a\x14\xb7\x4d\x03\xba\x79\xd4\x45\x44\x1a\x74\xa7\x8b\x34\xd0" + "\xde\x4d\x69\x00\x3a\xcc\xb2\x17\x04\x1a\x9c\x02\x1a\x34\x00\x0d" + "\x32\x49\xc6\xe1\x69\x15\x64\x6a\x14\xd0\xc0\xdc\x8a\xf9\x0d\x58" + "\xce\xc1\x44\x36\xf6\x94\x16\xa7\x2c\x4a\xf4\x0b\x45\x1a\x6c\x7b" + "\x91\xd1\x60\xc7\x8b\x16\x90\x87\x1a\xf5\x1f\x40\xd9\xf1\x46\xb4" + "\x16\x73\x4e\xf1\x99\xb1\x98\x1f\x9d\xd1\xa2\x1b\x68\xd1\xcd\x68" + "\x91\xf6\x3a\xd0\xe2\x78\x2d\x8d\x6d\x75\xa4\xae\x82\x54\xc4\x1a" + "\x48\x25\xe0\x12\xd0\x62\x16\xd2\x05\x75\x71\xc7\x32\x5d\x28\xe8" + "\xde\x61\x45\x29\x44\x23\xd2\x03\x74\xfd\x21\x39\x29\x04\xfd\x84" + "\x23\x60\x6e\x8a\xf4\x08\xa3\xf4\xb8\x28\xd0\x03\xe4\x19\xcc\xcf" + "\xbc\xa9\x0b\xe8\xd1\x05\xf4\xc8\x64\xf4\x40\x9c\x9f\x62\x0d\xe1" + "\xb9\xef\x75\x18\xfb\xa2\x27\x3d\x96\x09\xf4\x38\x35\x10\x7a\xdc" + "\x61\xed\x49\x8f\xdb\x6b\xfb\xa2\x87\x34\x27\x46\x56\x22\x3d\xba" + "\x0d\xc2\x9c\x18\x85\x73\x22\x43\x79\x2f\xac\x45\x38\xa6\x87\x6a" + "\x76\xd3\x39\x81\x79\xc5\x3e\x78\xde\xa6\xac\x68\x00\xba\xcc\xe1" + "\x1d\x54\xef\x15\xe8\xc2\xe8\x11\xa0\x2d\xfe\x9a\x8d\xbf\xf6\x19" + "\x5c\x33\x70\x6e\x20\x7d\x80\x4e\x30\x7f\x3c\xe5\x8b\x74\xfd\x56" + "\x0a\x6d\x72\x38\x4f\x70\x8e\xe0\x7c\xa8\x8c\x3f\x8d\x39\xe2\x95" + "\x47\xa2\xca\x09\x7e\x33\x3d\x12\xbd\x1b\x68\x55\x48\x1c\x6f\x00" + "\x6d\x92\x70\x6f\x08\x19\x89\x79\x23\x8f\x44\xaf\x46\x79\x41\x0d" + "\x3c\x7f\x83\x03\xe8\xe4\xe8\xd0\x0c\xc9\x06\x5d\x0a\xbf\xa5\xba" + "\x7e\x43\xc5\x1c\xd9\xfc\xa0\x11\xab\xe1\xbc\xca\x0e\x34\x82\xb9" + "\x23\x9b\x33\xce\xdc\xd9\xdf\xe9\xc8\xa6\x7a\x12\x10\x34\x97\xd1" + "\xc8\xe1\x32\x67\x26\xcf\xc5\x39\x93\x01\x34\x3a\xe1\x23\x8d\x46" + "\xb2\x1c\x83\xc3\x01\xab\x87\xee\x25\xb0\x4e\x02\x8d\xb4\xf1\xde" + "\x68\xe4\x30\x34\x8e\x75\x04\xb6\x65\x63\x9e\x05\x6e\xe1\x34\x05" + "\x07\x7a\x53\x17\xe8\xa7\x47\x2c\x76\x92\x0a\x3a\x44\xca\x69\x32" + "\xa8\x7a\xda\x31\x52\x6d\x2a\xa5\x31\xd2\xd1\x86\x8c\xb9\x4b\xaa" + "\xed\xa5\x80\x57\x1a\x0b\x96\x37\xd1\xb2\x85\x2c\x7b\x99\xf8\xd1" + "\x7c\xb2\xd1\x06\x92\x0d\xfc\xb9\xfd\x45\x03\xd0\xa2\x2b\x83\x0f" + "\xc4\x9c\x4b\xc4\x88\x3e\xe5\xe9\x4b\x49\x60\x65\x7c\x05\xc6\xc5" + "\x3c\x8b\x31\xc8\xab\xac\xd0\xa6\x85\xef\x72\xc0\x9a\xb1\x39\x93" + "\x2f\xc5\x3c\x14\x0f\x24\x53\x59\x1c\xf8\x65\xd4\x07\x28\x8b\xa0" + "\xad\xcc\x98\xf6\x36\xc8\x5e\xa3\x68\xee\x1e\x38\xa7\xa8\x9c\x67" + "\x85\xeb\xff\x74\x1b\xf6\x8b\xc6\x7c\xb5\xb3\xe3\x03\x18\x4f\x7c" + "\xf8\xcd\xbf\xdd\x93\x66\x51\xe5\x83\xde\x0b\x32\x1a\xb6\xd3\xc9" + "\x33\x9d\x70\x62\xf5\x71\x1b\xb5\x59\x5a\xd2\xe3\x07\xe5\xa7\xa0" + "\x2f\x15\xe6\xb4\xc0\x35\xfb\xae\x4a\xf4\xbf\xe0\x0d\xb0\x5e\x0d" + "\x1f\x64\x28\x99\x6d\x51\x4a\xeb\xf2\x9d\xe1\xb0\x9e\x45\x4f\xd0" + "\xf1\xe9\x98\xfb\x63\x2f\xbc\x17\xbf\xae\xd3\xf2\x61\xbd\x8d\x62" + "\xca\x47\xb3\x57\x2b\x79\xe0\x69\x1b\xe0\x43\xc5\xd7\xff\x4d\x73" + "\xfc\x36\x29\xc2\x1f\x3a\x1c\x6d\x27\xf8\xfc\xe9\x77\xe3\xf7\x81" + "\x3b\xe3\x3b\x95\xef\xd9\x3a\x07\x8d\x68\x48\x6f\x90\xf2\x9b\xba" + "\xe6\x31\x45\x9c\xd9\x3e\x1b\xda\x44\x9c\xa9\xcf\x50\x32\x6c\x89" + "\x44\xbb\x5e\x80\x3b\xb6\x54\x9a\x2f\x92\x34\xe0\xe3\xca\x78\x03" + "\xcd\xcf\x12\x0c\xf8\xce\x2d\x03\x3c\xe9\x06\xbd\x1f\xf0\x04\x71" + "\x60\x33\xe0\x07\xb7\x0c\xf4\xfd\x2e\xd0\xf7\x05\x1c\x41\xd9\x0b" + "\x8f\x2f\x03\x8f\x86\x94\xc3\x39\xa0\x13\x07\xb8\x0e\x78\xa2\x7b" + "\x27\x85\x84\xbf\x03\x3c\xba\x09\x71\x04\xe4\xe2\x29\x7a\xc0\x91" + "\x37\x00\x47\x92\x68\x9e\x69\xcd\x66\x25\xc3\x8f\xcf\xea\x57\x2b" + "\xf3\xc5\x3c\xf3\x74\x7c\xc3\x0f\x55\x21\x7f\xc4\x66\x60\x5f\x95" + "\x0e\x5c\x9f\x96\x45\xfb\x55\x59\x81\x47\x36\x68\x4c\x78\x8e\xce" + "\xdb\x37\xe2\x87\x70\x8c\xd7\x22\x71\x4c\xb6\x5c\x22\x11\x34\x17" + "\xeb\x0f\x9a\x21\x79\x0b\xc8\xe8\xcd\x97\x48\xf8\xe6\x05\x44\x07" + "\xf3\x55\xb9\x19\xfa\x30\xe3\x75\x35\xa1\x79\x50\x06\x8d\x30\xc3" + "\x79\x8f\x79\x50\x40\xae\xd6\x6c\xc6\x39\xb3\x50\xe7\xec\x93\x3d" + "\xff\xee\x0c\x07\x8c\x1d\x8d\x19\xa7\xb8\x6b\x24\xf3\x8f\x3e\x53" + "\xcc\xe4\xfc\xbb\xa6\x31\x1f\xa3\xef\xb6\x81\xae\x32\xb8\x45\x71" + "\xd7\x0d\x7c\xee\xf7\x06\x7d\x0a\x51\xb4\x88\xd7\x40\xf6\xe4\x80" + "\x56\xf7\x67\x90\x0c\x6e\xe8\x34\xc0\x89\x8b\x98\x57\xc0\xc7\x79" + "\x78\x17\xf5\x7f\x73\xe4\xdf\xbd\x8a\xfa\xf5\xac\xbb\x3b\x7b\x4b" + "\x0b\x89\xe0\xff\x08\xf4\x98\x07\xef\xda\x42\xc2\x8b\x5a\xe0\x5d" + "\xdf\x60\xef\x8a\x98\x81\x74\xe1\x32\xdf\x47\xdc\xee\x35\x87\x98" + "\xe5\x8f\x3a\x25\xda\x87\x00\xc3\x7e\xc5\x8f\x42\x9f\x61\x1a\xd3" + "\xa7\xa3\xda\x7e\x9a\xe0\x73\xd1\x46\x54\xdd\x4a\x79\xda\x81\xbc" + "\xcc\x19\xee\xcc\x98\x59\x07\xbc\xdd\x11\x0f\x32\xe0\x9d\x19\x7b" + "\xeb\x51\xcf\x67\x32\x9f\x49\x71\xe7\x68\x94\xd3\xf6\xc1\x39\xe4" + "\x7d\x17\x9e\x1f\x8d\x3c\x8f\xd7\x29\xdf\xc3\x7d\xd5\x75\x8d\x04" + "\xdb\x73\x6d\x07\xe9\x2f\xb6\x05\xf3\xf1\x1c\xb6\x85\xbc\x80\xb6" + "\x1d\x9c\x6b\x8c\xf6\xa5\xe8\x1f\xae\xe1\x43\xed\x6a\x56\xb6\xa0" + "\x9d\x49\x8d\x3c\x40\x79\x05\xf0\x1b\x63\x36\xf3\x7c\xb4\x1f\xf0" + "\x19\xf6\x73\x08\xd0\x3b\x42\xe4\x0b\x38\x17\xe6\xce\x1b\xc1\x2b" + "\xd4\xa8\xd3\x84\xe1\xef\xfe\xf2\x87\x6f\xf4\xfb\x27\x93\x57\xdf" + "\x35\x6d\x23\x7e\x3f\xbd\x03\x71\xd3\xd1\xe6\x82\x99\x66\x86\x99" + "\x88\x49\x22\x6e\x52\x6c\xa2\xb9\x21\x4a\xd1\xcf\x32\x9e\xf6\xd1" + "\x47\xdc\xac\x34\x4b\xb8\x39\x45\xef\x82\x9b\x66\xbe\x8b\x1b\xe9" + "\x09\x37\x7f\x7d\x4e\x8e\x9b\xbf\x6e\x94\xe3\xe6\xbd\x4f\xbb\xe3" + "\x66\x4f\xcc\xd4\xdd\xe5\x09\x2f\x41\x8f\xb9\xa3\x45\x71\x8f\xcd" + "\x3b\x56\xea\xa2\x7c\xc7\xca\xbb\x67\xc9\xb1\x52\x57\xf0\xff\x2f" + "\x56\xde\x7d\x45\x86\x95\xea\x7e\x62\x65\x0b\xc5\xca\x30\xfe\x7b" + "\x98\x13\x02\x7e\x6c\x9e\xe7\x05\x2b\xe7\xf5\x31\x17\xfe\xe8\x0d" + "\x2b\xef\x99\x2c\xc7\xca\x7b\x32\xe4\x58\x79\xcf\x43\x12\x56\x0a" + "\xd7\xae\x0a\x56\xde\x33\xe9\xfa\x60\xe5\x3d\x93\x28\x56\x5e\x42" + "\xac\xbc\xf7\xee\xbe\xb1\x52\x17\xed\x19\x2b\xf1\x3c\x62\xa5\x2e" + "\x5a\xc2\xca\xd3\x7d\x60\xe5\xe8\x20\x1f\xb0\x32\x8c\x62\xa5\xda" + "\x0b\x56\xce\x83\xb1\x12\xf8\x82\xf2\x9e\x1b\x6f\x08\x58\xa9\x71" + "\x62\x65\x3f\xf8\xc3\x37\xfa\x8d\x0e\xec\x0d\x2b\xb9\x6c\x26\x5f" + "\x22\x56\xf2\xa1\x02\x56\x26\xd8\x49\xca\x49\xc0\xc8\xe3\x2d\xd4" + "\x07\x81\xfa\xe4\xc2\x7f\xea\x0b\x88\x45\x83\x0d\x3b\x60\xbc\xaa" + "\x4d\x25\x14\x9b\xa8\x6f\xe9\x24\xc4\xaa\x12\xa8\x5b\xe8\x94\x3b" + "\x29\x76\x9e\x14\xb0\x33\x46\xc0\xce\x19\x3f\x02\x3b\x5f\x44\x5a" + "\xde\x77\x5b\xa7\x52\xc4\xce\x75\x80\x9d\xf7\x51\xf9\x01\xbf\x81" + "\x32\xec\x8c\xd8\x28\xf6\x0b\x6d\x9a\xd5\x89\x6f\x13\xd6\xaf\xd6" + "\x9e\x38\xfa\x0c\x6d\xef\x75\xe3\x3c\x33\x71\x62\x69\x8c\x84\xa5" + "\xd0\xd6\xd3\xde\x71\xf4\xbe\x42\x27\x8e\x66\x02\x8e\x9e\x71\xc1" + "\x51\xd0\x9b\x3e\x42\xcc\x03\x1c\xed\xa0\x38\xfa\x99\x80\xa3\xf7" + "\x7f\x70\x38\x06\x70\xf4\x19\x11\x47\xef\xab\xb3\x65\xbe\x67\xb3" + "\x65\xf5\x8d\xa3\x1d\x14\x47\xf5\xd7\x1e\x47\xcb\xdc\x70\x14\x74" + "\xd7\x77\x32\xbd\xe0\xa8\xc8\x8f\x14\x47\x33\x24\x1c\xa5\xe3\xfa" + "\xc0\x84\xaa\x58\x18\xf7\x58\x3d\xd5\xdd\x9c\x38\xaa\x2f\x61\x38" + "\x0a\xe7\xa8\xfd\x64\x31\xe0\x28\xf0\x5f\x7a\x25\xc6\x06\x24\x91" + "\xd0\x47\x35\xe2\xeb\x16\x98\x33\x38\x46\x4e\x3c\x9d\x07\x73\x06" + "\x31\xa6\x0d\xe6\x0c\xe0\xe8\x8c\x2b\x6a\x42\xe7\x4b\x16\xcc\x97" + "\x16\x2f\x39\xf8\x44\x5f\x57\xaf\x78\xfa\xc0\x26\x39\x9e\x3e\x50" + "\x23\xc7\xd3\x07\xde\x94\xf0\x54\xb8\x86\x78\x0a\x34\xe3\xd6\x4e" + "\x0b\x40\x4c\x1d\x18\x9e\x3e\x50\xe4\xc4\x53\xa5\x80\xa7\xf3\xfa" + "\xc6\x53\xfa\xfd\xcf\x0b\x9e\xba\x62\x83\x77\x3c\x7d\xa0\x48\xc2" + "\xd3\x88\xa5\x4e\x3c\xad\xf5\x86\xa7\xf7\x19\x3c\xe3\x29\x9e\x47" + "\x3c\xbd\xcf\xe0\xc4\xd3\x5a\x0f\x78\xfa\x8c\x2b\x9e\x3e\x38\x97" + "\xe1\x69\x09\xc5\x51\xc4\xd4\x2a\x2b\xf0\x07\xce\xb9\xc4\x42\x8a" + "\xa9\x1c\x60\x2a\xe6\x25\xc6\x9c\x54\xe8\xd3\xee\x09\x53\x19\xe6" + "\x9a\x08\xe2\x2a\xce\xcd\xf4\xc9\xa0\xef\xc2\x5a\x04\x63\x42\xd7" + "\x5e\x71\xfc\xb6\xb8\xe0\xeb\xcc\xa5\x6a\x94\xed\x64\xbc\xc2\x89" + "\xbc\xd2\xa6\x43\xff\x56\x19\xaf\xf8\x46\xcb\x07\xe3\xbd\x61\xab" + "\x37\xdd\xfd\x30\xea\xee\xd3\x89\x72\xd9\x74\xc0\xd7\x68\xd4\xdd" + "\x8b\xdd\x74\xf7\xe2\x9e\xba\xfb\x89\xde\x71\xd4\x27\xdd\xfd\x79" + "\xa4\xe1\x6f\xe2\xe4\x38\xfa\x9b\xb9\x72\x1c\x7d\xa8\x11\xfb\xc5" + "\x70\xbc\xd8\xb3\xee\x4e\xe7\xf9\x6f\x3e\x71\xea\xee\xb5\x72\xfc" + "\x94\x74\xf7\x87\xd6\x7b\xc7\xd1\xdf\x98\x64\xf2\xe8\x0c\x01\x47" + "\x67\x0b\x38\x3a\x5b\xc2\xd1\x23\xc7\x44\x79\xf4\xb7\x8e\x43\xb5" + "\xae\x38\xfa\xdb\x70\x27\x8e\xd6\xf5\xc4\x51\x11\x43\x11\x4f\xb1" + "\x1d\xb4\x65\x6d\x03\x9c\xde\x39\x5b\xaf\x64\xb6\xda\x58\x1c\xbb" + "\x00\x77\x5b\x6d\xa5\xf9\x0a\x49\x8b\x41\x3c\x2d\xa4\x78\x1a\xa2" + "\x20\xb3\x00\xfb\x82\xd1\x67\xbf\x08\xbf\xdd\x27\xb1\x9c\x6e\x68" + "\x5f\xe2\xde\x60\x39\x42\x45\x3b\x13\xbc\x2f\xfd\x66\xff\xf2\x69" + "\x01\x53\xdb\x61\x3c\x80\xe7\xde\x69\x07\x4c\x4d\xf2\x20\x9b\x2e" + "\x03\x4c\x4d\x71\x91\x4d\x61\xee\x7f\x36\xdb\x1d\x53\xc7\xac\xad" + "\x42\x5e\x41\x4c\x95\xe9\xf1\xc5\x3f\x03\x3d\x7e\xcc\x05\x39\x96" + "\x3e\x34\x42\x8e\xa5\x63\x8e\x4a\x58\x2a\x5c\xbb\x2a\xb2\xe9\x98" + "\xe6\xeb\x23\x9b\x8e\x69\x96\xf4\xf8\x87\x0e\x3a\xb1\xf4\xb8\x37" + "\x2c\xfd\x4d\xb3\x67\x2c\xc5\xf3\x88\xa5\xbf\x69\x76\x62\xe9\x71" + "\x0f\x7a\xbc\x0c\x4b\xff\xf9\x03\x86\xa5\xc5\x4c\x36\xad\x15\x65" + "\xd3\xe2\x5f\xa0\x1e\xff\xcf\xc5\xbe\xea\xf1\x87\xcd\x0c\x3f\x11" + "\x9f\x44\x0c\x95\xf4\xf8\x62\xef\x7a\x7c\x1f\x18\xea\x93\x2c\x4a" + "\x31\xf4\x77\x1f\xc8\x31\xf4\x77\xdb\xe5\x18\xfa\x2f\xb7\xb9\x63" + "\x68\x4f\xfc\xfc\xdd\x45\x4f\xd8\xc9\xf4\xf8\x47\x2a\xbc\xe3\xe6" + "\x58\x8d\xef\xb8\xf9\xf0\x43\x72\xdc\x1c\x1b\xf3\x7f\x03\x37\x1f" + "\x3e\x24\xc3\x4d\x75\x3f\x71\xf3\x27\xd1\xe9\x1f\x71\xb3\x7f\x3e" + "\xe2\x66\xff\x7c\xc4\xc5\xfe\xf9\xc8\x55\xb4\x7f\x3e\x72\x9d\xec" + "\x9f\x8f\x68\x25\x19\xf4\x11\x47\xdf\xb8\x39\x56\xeb\x19\x37\xf1" + "\x3c\xe2\xe6\x58\xad\x84\x9b\x7d\xc9\xa0\xff\x72\xce\x07\xdc\xfc" + "\x99\xeb\xf4\xff\xd2\xab\xfd\xd3\x93\x4e\x8f\xb8\x49\xf1\xb2\xd6" + "\x4d\xa7\x9f\xee\xaa\xd3\x17\x4b\x3a\xfd\x44\x86\x5b\xd5\xf6\x7c" + "\xb9\x4e\x7f\xd5\x71\x74\xdc\x65\x9b\xd3\x1e\xba\x06\x70\x74\x1c" + "\x8d\x5b\x6b\x73\xda\x43\x23\x97\x8a\xfd\x62\x3a\xfd\x3a\xc2\xfa" + "\xe5\x41\xa7\xa7\x7e\xb6\x8f\x4e\x70\xea\xf4\xb5\xee\x3a\x7d\xe4" + "\xdd\xde\x31\xf5\xd1\x04\x8f\x3a\x3d\xea\xdf\x14\x53\xf5\x14\x53" + "\xdb\x37\xb8\x62\xea\xbf\xbe\x45\x31\xf5\x29\x11\x53\x1f\x2d\xb1" + "\xc1\xdc\xb4\x0d\xea\x1b\x53\xb1\x1d\x09\x53\xe3\x7f\x1a\x4c\x35" + "\xf6\x1f\x53\x5d\xf7\x8a\x7e\x06\xef\xee\xc4\x54\x3a\xc6\x8f\xdd" + "\x55\x15\x8b\x98\x1a\xef\xa6\xdf\x17\x7b\xd6\xef\x0f\x11\x25\x8e" + "\x8f\xa8\xdf\x23\x0d\x28\xde\x5c\x53\xfd\xfe\xb1\xe5\x72\x6c\x7d" + "\xac\x44\x8e\xad\x8f\xc5\x49\xd8\x2a\x5c\xbb\x2a\xfa\xfd\x63\xa9" + "\xd7\x47\xbf\x7f\x2c\x55\xc2\xd6\xc8\x17\xfa\xc6\xd6\x47\x13\x3d" + "\x63\x2b\x9e\x47\x6c\x7d\x34\xb1\x57\x6c\x7d\xca\x15\x5b\x1f\x7f" + "\x5a\xc4\x56\x49\xbf\x07\xfe\xc0\xf9\x97\x98\x3f\x70\xfd\xfe\xe9" + "\xeb\xad\xdf\x3f\x3e\xd1\x27\xfd\x7e\x03\xe0\x2c\xe8\xe2\xcb\x8e" + "\x82\x7e\xff\xac\xa0\xdf\xd7\x19\xdc\xf4\x7b\x43\x0f\xfd\x3e\xf5" + "\x59\x01\x53\x61\x4e\x51\x4c\x9d\x5d\x3c\x70\xfd\xfe\x39\xa4\xe1" + "\x13\x13\xe4\x98\xfa\xc4\xd3\x72\x4c\x9d\x70\x12\xfb\xc5\x30\xdd" + "\xe0\x59\xbf\xa7\xf3\xfc\x89\xf5\x32\xfd\x1e\xfa\xd7\x53\xbf\x9f" + "\xf0\x96\x0c\x53\x67\xb8\x62\xea\x13\x46\x99\x9c\x0a\xef\x85\x98" + "\xfa\xc1\x19\x86\xa9\x1f\x9e\x71\xc1\xd4\x29\x1f\x0a\x98\xfa\xe4" + "\xe5\x43\xd3\x5c\x31\xf5\x49\x95\x88\xa9\x14\x2f\x67\xd8\x94\xe9" + "\xd1\x3d\xfd\x4e\xa8\xbf\x0f\xfa\x02\x41\xdb\xb8\xaf\x0a\xdb\xdc" + "\x7e\x26\xbe\x6f\x7f\x93\x68\xcf\xfe\x26\xd5\x89\x26\x52\xd1\x90" + "\x4f\xfd\x4c\x8a\xd0\xcf\x64\x05\x19\x59\xd4\xc5\xf6\xe9\xd3\x7c" + "\x1e\xed\x9e\xf7\xe8\xbf\xfc\x82\x84\xb3\xe8\x93\xf5\x0e\xfa\x64" + "\xb5\x33\x1f\x20\xa0\x77\xcf\x3d\xf9\xa2\xdc\x04\x78\xf0\xe9\x19" + "\x77\x9c\x1d\xff\x66\x15\xf2\x4f\x4c\xbc\x9b\xce\x6f\xf8\x19\xe8" + "\xfc\xe3\x4f\xcb\xf1\x75\x82\x5a\x8e\xaf\xe3\x0f\x4a\xf8\x2a\x5c" + "\xbb\x2a\xb2\xeb\xf8\xba\xeb\x23\xbb\x8e\xaf\x93\x74\xfe\x09\x9f" + "\x3a\xf1\xb5\xc6\x05\x5f\xcf\xb8\xe2\xeb\x13\xe5\x14\x5f\xcf\xb8" + "\xe3\x2b\x9e\x47\x7c\x7d\xa2\xdc\x89\xaf\x35\x6e\x3a\xff\x19\x77" + "\x7c\x7d\x6a\x13\xc5\x57\xe0\x05\xb9\xec\x6a\xe8\x5b\xe7\xaf\xfb" + "\xb9\xe9\xfc\x4f\x15\xf9\xa4\xf3\x23\xa6\x26\x30\x4c\x45\xcc\x12" + "\x71\x55\xd2\xf9\x0d\x5e\x75\xfe\xbe\x70\xd5\x27\x59\x95\xe2\xea" + "\xbf\x6d\x92\xe3\xea\xbf\x6d\x95\xe3\xea\xef\xef\x72\xc7\xd5\x9e" + "\x98\xfa\x6f\xe7\x3c\xe1\x29\xd3\xf9\x9f\x39\xee\x1d\x4b\x27\x06" + "\xfa\x8e\xa5\x4f\x3f\x2a\xc7\xd2\x89\x51\xff\x77\xb1\xf4\xe9\xa3" + "\x32\x2c\x55\xf7\x13\x4b\x7f\x12\x3b\xc0\x33\x77\xcb\xb1\xf4\x99" + "\x18\x39\x96\x3e\x33\x54\xc2\x52\xe1\xda\x55\xc1\xd2\x67\x74\xd7" + "\x07\x4b\x9f\xd1\x49\xb2\xea\xef\xfd\xfb\xc6\xd2\x89\x61\x9e\xb1" + "\x14\xcf\x23\x96\x4e\x0c\x93\xb0\xf4\x74\x1f\x58\xfa\xfb\x0b\x3e" + "\x60\xa9\xdc\x0e\xe0\x8e\xa5\xd7\xdd\x0e\xf0\xfb\x66\x9f\xec\x00" + "\x22\x96\x3e\xdb\xd3\x0e\x80\xf8\x4a\xed\x00\x30\x5e\x22\x86\x51" + "\x3b\xc0\x78\x86\x65\xd5\xf6\xd5\x32\x3b\xc0\xd5\xc7\xd6\x49\x9d" + "\x36\xa7\x3d\x35\x13\xb0\x75\x92\x83\x62\xab\xd3\x9e\x1a\xb5\x5e" + "\xec\x17\xb3\x03\xac\x21\xac\x5f\x1e\xec\x00\x4f\x60\x7b\x93\x27" + "\xcb\xec\x00\x2e\x58\x0b\x6d\x4d\xf0\x8e\xb3\x93\x13\x65\x76\x80" + "\x7a\x09\x67\xdb\xd1\x47\x1d\x70\x90\xe2\xec\x70\x57\x9c\x9d\xf2" + "\x3e\xc5\xd9\x27\x44\x9c\x9d\x5c\xda\x01\x73\xb3\xc3\x57\x9c\xc5" + "\x7d\x04\x67\x62\xaf\x0f\xce\x96\xfa\x80\xb3\x2e\xb6\x81\x4f\x61" + "\x3c\x9c\x38\x4b\xc7\x7d\xea\xe3\x55\x31\x88\xb3\xb1\x6e\xb6\x01" + "\x83\x67\xdb\xc0\xc1\xeb\x61\x1b\x98\xba\x51\x8e\xb7\x53\x2b\xe4" + "\x78\x3b\x75\x85\x84\xb7\xc2\xb5\xab\x62\x1b\x98\x5a\x78\x7d\x6c" + "\x03\x53\x0b\x25\xbc\x8d\x5a\xd2\x37\xde\x4e\x4e\xf5\x8c\xb7\x78" + "\x1e\xf1\x76\x72\x6a\xaf\x78\xfb\x84\x2b\xde\x3e\x1b\x27\xe2\xad" + "\x64\x1b\x30\x08\xb6\x81\xd5\x7d\xdb\x06\xea\xbc\xd8\x06\x26\x5c" + "\x6f\xdb\xc0\xb3\x73\x7c\xb1\x0d\x74\x6e\x60\x7e\xfb\xcb\xd0\x6f" + "\xff\x65\xc0\xdf\xa8\x63\x30\x06\x7d\xfb\xed\xa7\x8a\xfe\xa7\xb1" + "\x85\x02\xce\x16\x7a\xb4\x0d\x1c\x6e\xf6\x6e\x1b\x38\x7c\xdc\xd5" + "\xff\xf4\xb9\x59\xf2\xef\x56\xcf\xc5\x89\xdf\xad\x0e\x7f\x8d\x38" + "\xfb\x3c\xcd\xdb\xc8\x15\x04\x1b\x59\xdc\xc0\xe7\x13\xb0\x9f\x9e" + "\xfc\xf8\x3f\xe3\x5c\xbf\x65\x3d\xb7\xdf\x69\x2b\xa8\x41\xbc\x2d" + "\x24\x1c\x1f\x3f\x08\x63\x7e\x53\x5b\xc1\xf3\xc8\x7b\xcf\xdf\xe6" + "\x8a\xbb\x7b\x4f\xb9\xe2\xee\x73\x66\x11\x77\x1d\x80\xbb\x7b\xea" + "\x0b\x99\xfd\xf5\x45\xe6\x9b\xba\xed\x45\x17\xdf\xd4\x63\x9f\x0b" + "\xb8\xfb\xef\x17\x0e\x99\xe0\xfd\x7b\xf3\x9f\x82\xfb\x77\x9c\xea" + "\xaf\x0f\x6a\xa1\x47\xdf\x29\x01\x9f\x3c\xfa\x4f\x41\x5f\xd5\x9b" + "\x84\xb9\xea\x80\x79\xba\xc9\xc5\x7f\xaa\x28\x05\xe6\xb3\xb0\xaf" + "\xa4\x57\x3f\xd4\x17\x25\x3f\x54\xbe\x20\x88\xe6\x70\xe5\xd6\x07" + "\x1b\xbb\xf8\x78\x3f\x3e\x2c\xc8\x8e\xcf\xef\xee\x86\x75\xe7\xc9" + "\x68\x3f\xa6\xd7\x05\x99\x00\x7b\x82\xd9\xb8\x4f\x0b\x77\xc0\x5a" + "\xe3\x80\xb5\x86\x2b\x08\x32\xd9\x51\x36\xd9\x10\xd4\x50\x04\x7a" + "\x9e\x3d\x93\xe6\x67\x1d\x92\x0b\xba\xde\x16\xd4\xf3\x2e\xc1\xdc" + "\x48\xd7\x29\xb1\x3f\x22\x8e\x86\x34\xc3\x7b\x5c\xea\x5d\x96\xb3" + "\xff\x20\xe1\xa8\xf1\x99\xc3\xf0\xcc\xe9\x37\x57\x21\xef\x46\x4b" + "\x7b\x0a\xa8\xcc\xec\xc5\x57\x16\xfb\xc2\xe2\x1b\x02\x2f\x5c\x05" + "\x9b\x84\x6b\x7f\xe4\xb8\x3e\xfd\x75\x39\xae\x4f\x7f\x4f\x8e\xeb" + "\xd3\x5f\x90\x70\x5d\xb8\x06\xb8\xee\xc8\x64\x72\xb4\x63\xed\x40" + "\xe5\xe8\xe9\x7a\x11\xd7\x39\x01\xd7\x37\xf7\x03\xd7\x7b\x95\xa3" + "\x5d\x70\xc9\x3b\xae\x4f\xd7\x4b\x36\x89\xe7\x27\x7b\xf4\x91\x3d" + "\xe5\x8a\xeb\xcf\x59\x29\xae\x9f\x72\xc7\x75\x3c\x8f\xb8\xfe\x9c" + "\xd5\xeb\x7e\x82\x53\xee\xdf\xd3\xfe\xf0\x20\xc5\xf5\x5a\xc1\x47" + "\xb6\xc6\x87\xfd\x04\xb5\x0c\xd3\x45\x2c\x47\x7b\xd5\xf5\xb5\x49" + "\xfc\x21\xc2\x17\x9b\x04\xc5\x72\x33\xc3\x72\xc4\x46\x11\xcf\xfb" + "\xb3\x9f\xa0\x2f\x3c\x17\xe5\x66\xc4\x73\x6f\x72\xb3\x1c\xcf\xa3" + "\x1f\x94\xe3\x79\xf4\x43\x72\x3c\x8f\x79\x50\x8e\xe7\x31\x11\xee" + "\x78\xde\x13\xcb\xa3\xdf\xf4\x84\xe3\xfa\xe7\xd1\x46\xf1\x92\xc9" + "\x3b\x86\x47\x97\xf8\x8e\xe1\x2f\x6c\xff\x3f\x87\xe1\x6a\x77\x0c" + "\x7f\xa1\x19\x31\xc8\x91\xe5\x86\xe1\xf3\x04\x0c\x17\x70\x64\x4b" + "\x8b\x20\x0b\xbb\x63\xb8\x19\xde\xa3\x0f\x7d\xdc\xfe\xbd\x3b\x86" + "\xbf\x78\x5a\x86\xe1\xea\x3e\x30\x7c\x1e\xb3\x83\xc8\xfc\x72\xbd" + "\xd8\x42\xe0\x3d\xcc\x9b\xbc\xc8\xe6\xe2\x98\xb9\xf6\x47\x8e\xe1" + "\x2f\x3d\x24\xc7\xf0\x97\xe2\xe5\x18\xfe\xd2\x6d\x12\x86\x0b\xd7" + "\xae\x8a\x6c\xfe\xd2\x98\xab\x2e\x9b\x8b\xfc\xd1\x2b\x86\xbf\x34" + "\x46\x92\xcd\x63\x86\xf6\x8d\xe1\xd1\xa5\x9e\x31\x1c\xcf\x23\x86" + "\x47\x97\x7a\xdd\xe7\xd0\x03\xc3\x63\x2e\xfb\x80\xe1\x72\x5b\x88" + "\x88\xe1\x82\x2d\x64\x8b\x8b\x2d\xc4\x91\xc9\x6c\x21\x9b\x5a\x18" + "\x6f\x04\x2b\x18\x9f\x02\xff\x68\x36\x2b\x7b\xd7\xdd\x36\x0d\xc8" + "\x0e\x12\xe3\x35\xff\xa3\x27\x3b\x08\xc5\x6f\xdc\xe3\xf0\x02\xe0" + "\x76\x4d\x3f\xf7\x38\x4c\x14\xf7\x38\xe4\x7b\xd9\xe3\x20\xe0\xf9" + "\x8c\x1f\x81\xe7\x74\x8f\xc3\x0c\x85\xdc\xc6\x3c\xc3\x5f\xb4\x31" + "\x33\x3c\x9f\x3d\x4c\x8e\xe7\xb3\xc3\x9c\x7b\x1e\x00\xf3\xab\xf5" + "\xeb\x7a\xec\x79\x70\x62\x3b\xb5\x83\xce\x88\x33\x3e\xdf\x40\x9c" + "\xf8\x1e\x23\xe1\x7b\x93\x62\xd6\x41\x19\xb6\xd7\xbb\x62\xfb\x8c" + "\x6c\x19\xb6\x9f\x29\x94\xfb\x47\xd4\xeb\x5d\xb0\x5d\xdc\xf3\x30" + "\xf3\xad\x43\x75\x7d\x60\x3b\xdc\xdf\xff\x3d\x62\x57\x17\xdb\xc5" + "\xfd\x0d\x1e\xb1\xdd\x75\x7f\x83\x8b\xff\x03\x62\x3b\x8d\x4b\x35" + "\xcc\x0d\xdb\x97\xc5\x2b\x1d\x07\x60\x3e\x00\xae\xe3\x1c\x71\xf0" + "\x80\xed\x74\xbc\x67\x96\xb9\x62\x7b\x77\x26\xc3\xf6\x77\x5a\x7e" + "\x3c\xb6\x3b\xe5\x61\x57\x6c\x7f\x0a\xb1\x3d\x76\x3f\xdb\x7f\x91" + "\xd1\xbf\xfd\x17\x6e\xfe\x19\xef\xf4\xc3\xfe\xd2\x2b\xc6\x7b\xe8" + "\x97\x1c\xe3\x67\xdd\x2c\xc7\xf8\x59\x93\xe4\x18\x3f\x4b\x21\x61" + "\xbc\x70\xed\xaa\xc8\xe9\xb3\x34\xd7\xc7\xfe\x32\x4b\x23\x61\xfc" + "\xac\x2b\x7d\xef\xbd\x98\x51\xe0\xd9\x37\x03\xcf\x23\xc6\xcf\x28" + "\xe8\x75\xef\x85\xcc\xde\x3d\xbb\xd1\xe3\xde\x8b\x9a\x9f\xce\x37" + "\xc3\x95\x57\xdc\xed\x2f\x03\xb7\x7d\xcf\x6e\xf0\xd5\xfe\x82\x7b" + "\x2f\x96\x9d\x70\xd9\x7b\x51\xd7\xf7\xde\x8b\xd4\xe9\xfd\xb4\xbf" + "\xf4\xe2\x9b\x71\x38\xca\xd5\xdf\xed\x95\x73\x72\x7c\x7f\xa5\xd1" + "\x89\xef\xcf\x21\xbe\xbf\xd6\x29\xc7\xf7\xd7\x6c\xd8\x4f\x4f\x7b" + "\x31\x3e\x93\x7d\x57\x9c\xf3\xb8\xdc\x57\xc3\xcd\xfe\xf2\x1c\xf2" + "\xde\x6b\x1f\xc8\xf0\xfd\x8c\x2b\xbe\xcf\x49\xf0\x24\xbb\xa3\xdd" + "\x9b\xfa\x14\xcf\x70\xd9\xd3\x36\x45\xf4\x7f\x8b\x5b\x72\x28\x1a" + "\xde\xdf\xe4\xc5\xd7\x6d\x06\xf3\x75\xa3\xbe\x6d\x68\x07\x87\xb6" + "\x76\xce\xd0\x2b\xd3\x62\x79\x0e\x7d\xdd\xdc\xfd\xdc\xd0\xf7\x0d" + "\x7d\xdd\x2a\xe3\xf3\xbd\xfa\xb9\x21\x6f\x7a\xf3\x75\x83\x7e\x87" + "\x51\xac\x3f\x27\x60\xbd\xe0\xeb\x56\x94\x24\xf9\xba\xc9\xb0\xde" + "\x83\xff\xf0\xa7\x67\x32\x3c\xcb\xf1\xe9\x12\xd6\x77\xa1\x1c\xff" + "\x2f\x6e\xb6\x18\x4a\x83\xb8\x92\x9f\xd4\x16\x43\xb1\xfe\xd5\xf7" + "\xab\x90\x8f\x63\xf4\x1e\x6c\x31\x3d\x7d\x9c\x7f\x3a\x5b\xcc\xab" + "\x0e\x39\xc6\xbf\x16\x21\xc7\xf8\x57\x1b\x25\x8c\x17\xae\x5d\x15" + "\x8c\x7f\xd5\x7e\x7d\x6c\x31\xaf\xda\x25\x5b\xcc\x6b\x27\x3d\xfa" + "\xdf\xc9\x6c\xec\x73\x12\x3d\xdb\xd8\xe7\x08\xfe\x77\x73\x12\xbd" + "\xee\x09\xe9\xf1\x4d\x33\x7e\x0f\xb3\xb1\x0f\x60\x4f\x48\xdd\xcf" + "\xcd\x16\x13\xbf\xdb\x57\x5b\x0c\xf5\x6d\x3e\x81\xfe\x21\xbe\xed" + "\x09\xe9\x0b\xdb\x9d\xb2\x7b\x2f\xdf\x30\xe5\xd8\x3e\x77\x8f\x1c" + "\xdb\xe7\xee\x97\x63\xfb\xfc\x43\x72\x6c\x9f\x5f\xee\x8e\xed\x3d" + "\x71\x7d\xde\x50\x4f\x98\xae\x7f\x0e\x6d\x31\xf3\x93\xbd\xe3\xf9" + "\xbc\x71\xbe\xe3\xf9\x1f\x27\xfc\x9f\xc6\x73\xb5\x3b\x9e\xff\x31" + "\xe3\x27\xb5\xcb\x50\x3c\x4f\x58\x22\xc3\x73\x75\x1f\x78\xfe\x93" + "\xd9\x65\x12\x2a\xe5\x78\x8e\x9f\x89\x5c\xf1\x3c\xe1\x13\x09\xcf" + "\x85\x6b\x57\xc5\x2e\x93\x50\x71\x7d\xec\x32\x09\x15\x92\xcc\x3e" + "\xff\x83\xbe\xf1\x7c\xde\x78\xcf\x78\x8e\xe7\x11\xcf\xe7\x8d\xf7" + "\xea\x4f\xdd\x03\xcf\x17\xbc\xe5\x03\x9e\x7b\xf4\x51\xf9\x79\xd8" + "\x65\x16\xf4\xc8\xc9\xd6\x97\x5d\xc6\xdb\x3e\x15\xc4\x77\xc9\x3f" + "\xc5\x65\x9f\x4a\xa4\xb8\x4f\x25\x43\xee\x9f\x72\xd5\xb1\x7d\xe1" + "\x46\x39\xb6\x2f\xdc\x24\xc7\xf6\xc5\x9f\xca\xb1\x7d\x71\xa9\xd8" + "\x4f\x66\x97\xc9\xec\xb1\x6f\x45\x8e\xf3\x0b\x1d\xc6\xe7\x1a\x88" + "\x27\xac\x87\xb6\xe6\x7a\xc7\x79\x7d\xb8\x37\x9c\x47\x7f\x95\x8f" + "\x66\xc4\x7b\xc0\xf9\xd7\xef\xfb\xff\x01\xe7\xbd\xf9\xa1\x50\x3d" + "\x08\x30\x1e\xf1\x9e\xe2\xbb\x80\xf5\x88\xf3\x8e\xbf\x7b\xb2\xd1" + "\xbc\x1e\x7f\xad\x70\xde\xbb\x8d\x66\x51\x5c\x55\x8c\x80\xf3\xfd" + "\xd9\x43\xb3\x5f\x6e\xa3\x29\x9a\x77\xad\x6d\x34\x8b\xf6\xc8\xf1" + "\x7e\x91\x45\x8e\xf7\x8b\xde\x97\xf0\x5e\xb8\x76\x55\xe4\xf7\x45" + "\xbb\xaf\x8f\x8d\x66\xd1\x6e\x09\xef\x17\x6f\xec\x1b\xef\xf5\xa3" + "\x3d\xe3\xbd\x5e\x88\xcd\xa6\x1f\xdd\x7f\xbc\x4f\x74\xe2\x7d\xcf" + "\xfd\x33\x19\x03\xf7\x91\x79\xfc\x7a\xdb\x68\x12\xbd\xe2\x7f\x6f" + "\xf1\x31\x06\x6e\xa3\x11\xf6\x24\xce\xf6\x1c\x1f\xe3\x50\x2f\x3e" + "\x32\x87\x2a\x5c\xb1\x7e\xc9\x9b\x72\x5f\xc4\x25\x6f\x89\xbe\x88" + "\x87\xaa\x10\xeb\x97\x7e\x2c\xc7\xfa\xa5\x25\xde\x6c\x34\x9f\x72" + "\xae\x3e\x89\x4b\x1a\xe5\x36\x1a\x83\xdc\x46\x33\x05\x79\x6f\xe9" + "\x2c\xef\x58\x9f\xa4\x96\xfb\x80\xb3\x3d\x8a\x1f\xcc\x10\x7c\xc0" + "\x67\xb8\xf8\x80\x3f\xf3\xae\x80\xf5\x6f\xdc\x57\x5e\x63\x27\xbe" + "\xf8\x21\xfe\x78\x5f\xef\xd5\x1e\x7d\x10\xe9\x1a\xd0\x8b\x1f\xe2" + "\xcc\x93\x6a\xc2\x29\xdf\x47\xfb\xbb\xe4\x87\xd8\x4b\x3c\x63\x19" + "\xfe\xcf\xd0\x7b\xc5\xff\x4e\x5e\xc2\x7f\xee\x77\x92\xdd\x86\x43" + "\x39\x9f\xd2\xe5\x8d\xf8\x6b\x65\xb7\xf1\x64\x27\x31\x3e\x81\xf8" + "\x9f\xfc\x32\x93\xf3\xe3\x7f\x66\x76\x9b\xe4\x4f\xe4\xb8\x9f\xdc" + "\x2c\xc7\xfd\xe4\x4d\x12\xee\x0b\xd7\xae\x8a\x2f\x7a\xf2\xae\xeb" + "\x23\xe7\x27\xef\x92\xec\x36\x4b\xd7\xf6\x8d\xfb\x49\x1a\xcf\xb8" + "\x9f\xa4\x61\xb8\x9f\xa4\xe9\xd5\x6e\x23\xf3\x8d\x4c\x59\xf2\xa3" + "\xed\x36\xa2\x9c\x7f\xdd\xf7\xf5\xa4\x24\xfa\x62\xb7\x71\xee\x49" + "\xff\x51\x76\x1b\xcf\x78\x2f\xca\xf6\x87\x7a\xf9\xe6\x2a\xc7\xfb" + "\x65\x4b\xe4\x78\xbf\x6c\xa9\x1c\xef\xd3\xd7\xcb\xf1\x3e\xbd\xc0" + "\x93\xdd\x46\x8e\xf5\xcb\x0e\x79\xc2\x79\xfd\x14\xb4\xdb\xa4\x8f" + "\xf7\x8e\xf1\xcb\xac\xbe\x63\xfc\xf2\xa1\xff\xc0\x78\x37\x8c\x57" + "\xbb\x63\xfc\xf2\x49\x3f\xa9\x8c\x4f\x31\x3e\xed\x71\x19\xc6\x5f" + "\x45\x5b\x4e\x7f\xf6\x93\x78\x97\xed\xd3\xdc\xfc\xdf\xd3\xdc\xfc" + "\xdf\xd3\x5c\xfc\xdf\xd3\x2a\xae\x1e\xc6\xa7\x5d\x7d\xff\xf7\x7e" + "\x61\x7c\x9a\x8b\xff\x7b\xfa\x92\xbe\x31\x7e\x99\xdd\x33\xc6\xe3" + "\x79\xc4\xf8\x65\xf6\x5e\x65\x7b\x19\xc6\x67\xbc\x70\x2d\x6c\x39" + "\xd7\x67\xbf\x51\x46\xb4\x2f\xf6\x9c\xde\xe2\x8e\x78\xb5\xe7\x8c" + "\x15\xed\x39\x7a\x2f\xf6\x9c\xab\x85\xf9\x2b\xe6\xca\x31\x7f\xc5" + "\x7c\x39\xe6\xbf\xb9\x49\x8e\xf9\x6f\x16\xc9\xed\x39\x8b\x7a\xd8" + "\x73\xe4\xf8\xbf\xa2\xd2\x38\xc5\xd5\x9e\x63\x70\xb1\xe7\xbc\x39" + "\xd9\x3b\xfe\xaf\xf0\x8a\xff\xed\x14\xff\x63\x3d\xe0\xff\xca\xff" + "\x23\xf8\x1f\xfb\x23\xf0\x7f\xe5\x75\xc0\xff\x55\x4f\x33\x1b\x4f" + "\x3f\xe3\xa4\x7c\xea\xbb\x8d\xe7\xc7\xad\x03\xab\xb6\xca\xd7\x81" + "\x55\xc7\xe5\xeb\xc0\xaa\xb7\xa4\x75\x40\xb8\x76\x55\xd6\x81\x55" + "\x86\xeb\xb3\x0e\xac\x32\x48\xeb\xc0\x9b\xcb\xfb\x5e\x07\x56\x78" + "\x59\x07\x56\x08\xeb\xc0\x0a\x1f\xd6\x81\xac\xf9\xde\x6d\x3c\xfa" + "\x81\xdb\x78\x1e\xbe\xde\xfb\xa0\xb2\x12\x7c\xb2\xf1\x6c\x08\x31" + "\x54\x60\x8c\x94\x73\x44\xb9\x6c\x96\x68\xe3\x31\xba\xd9\x78\x8c" + "\x3d\x6c\x3c\x4b\xcf\x09\xf8\x3f\x49\xd8\x6f\x3a\xe5\x47\xc4\x48" + "\xa1\x79\x97\xff\x34\x57\xee\x37\xff\x27\x8a\xff\x52\xfc\xbe\x35" + "\x9d\xd8\x2f\xb6\xfe\x18\x7b\x89\x81\xfa\xa7\x4f\x65\x36\x9d\x49" + "\x9e\x62\xa4\xac\x91\xf9\xdd\xc8\xf7\x9b\xfe\xa9\x41\x86\xf7\x53" + "\xd8\x7e\xd3\x0f\x3d\x7d\xa7\x75\xc6\xe4\x5f\x7d\x85\xc6\xe4\x77" + "\xc6\xf2\x5b\xad\xeb\x57\x2c\xe9\x19\x42\x2c\xe9\x33\xd7\x21\x96" + "\x74\x7f\x63\xf2\x9f\x71\x8f\xdf\xf7\xd6\xda\xea\x0a\x23\xa9\x42" + "\x1e\x89\x71\x8f\x7d\x6a\xf4\xbc\x77\x5f\x29\xec\xdd\x5f\x70\x6d" + "\xe2\xa0\x60\x7f\xe8\x9a\x1f\x3a\x8d\x6c\x4f\xb3\xd0\xfe\x60\x8e" + "\x6b\xa0\xf3\xb0\x0a\xe0\x55\x0e\xf1\x74\x11\xe2\xe9\x9a\x89\xb4" + "\xee\x39\xe0\x85\xe0\xef\x0c\xc8\xc7\xb9\x1c\x09\xd4\x27\x21\xb6" + "\xbe\x45\xfd\xbe\x40\x8c\x00\x6c\x65\xf5\x96\x9f\xe3\x1d\x8e\xe0" + "\xef\x0d\xd0\xff\xc1\x3b\x16\xd4\xf8\x57\x99\xac\x30\x2f\x5a\x70" + "\x4f\xac\xa2\xda\xde\x61\x44\x5a\xec\x5d\x50\xa3\xe2\x01\x7f\xb7" + "\xbc\x4a\x02\x7c\x9b\xa7\x6b\x58\xde\x76\x5c\xf7\x42\xa7\x05\x62" + "\x1c\x10\x51\xb6\xe2\x7e\x90\xec\x5b\x9b\x60\x7c\x38\x9e\xad\x7d" + "\x33\xe7\x32\xdc\xe0\x61\xbd\x86\xb1\xa4\x3e\xb6\x88\x1b\x34\x87" + "\x15\xe0\xc6\xe6\x56\xe9\x3b\x36\xb6\x8f\x63\xc4\xec\x28\x6b\x24" + "\xff\x17\x93\x37\x6c\xfd\x93\xd9\x33\xb6\xfe\xc9\xcc\xb0\xf5\x4f" + "\x66\x27\xb6\x9a\x3c\xd8\x51\x64\x7e\xec\x7f\x16\xfc\x5f\x8c\x6e" + "\x32\xb6\xf1\x17\x18\x1f\xe5\xcf\x3e\xf9\xbf\x50\x3c\x4d\x60\x78" + "\x8a\x78\x25\x62\xaa\x64\x47\x31\x7a\xb5\xa3\xf4\x85\xa9\x3e\xed" + "\xe1\xa7\x98\x9a\xbd\x47\x8e\xa9\xd9\xfb\xe5\x98\x9a\xff\xb8\x3b" + "\xa6\xf6\xc4\xd3\x1c\x8f\x58\xca\xe2\xa3\xe4\x59\xbc\xe3\x68\xce" + "\x68\x6f\x38\x4a\xfd\xd3\x67\xb8\xf8\xa7\x3b\x71\x34\xf7\x51\x39" + "\x8e\xe6\xe8\xfb\x8b\xa3\x34\xb7\xc9\x99\x9f\x20\xb7\xc9\x80\x71" + "\x54\xef\x86\xa3\xb9\x27\x25\x1c\x75\xcf\x6f\xd2\x07\x8e\xce\xbb" + "\x36\x31\x50\x64\x38\xca\x59\x68\x7f\xb4\x0b\xb0\xaf\x79\x2f\xcb" + "\x71\x34\x2f\xdf\x3b\x8e\xe6\xdd\x27\xe1\x28\xab\x77\x6d\x71\x34" + "\x2f\x46\x86\xa3\xf3\x5c\x70\xf4\x7b\x49\x87\x40\x1f\x0b\x27\x8e" + "\xce\x77\xc1\xd1\x79\x7d\xe1\x68\x5e\x0c\x8e\x11\x93\x51\xf3\x47" + "\xf6\x8d\xa3\x39\x63\x3c\xe3\x28\x9e\x47\x1c\xcd\x19\x23\xe1\xa8" + "\x07\x19\x55\x86\xa3\x6b\xfd\x7d\xc0\xd1\x9f\x79\x6c\x94\xb5\x2a" + "\x9f\x6c\x15\xd2\x9e\xce\x9e\x31\x52\x5f\x76\xdd\x13\x54\xea\x96" + "\xf7\xa4\xb4\x47\xde\x93\xa5\xe2\x1e\xcf\x89\x02\xae\x3e\xf3\x23" + "\x70\x95\xee\xf1\x5c\x37\x4c\xee\x7b\xb2\xee\x66\xd1\xf7\x84\xe1" + "\xea\xfa\xed\x62\xbf\xa4\xbc\x27\xa5\xbd\xc4\x48\x5d\x37\x57\x16" + "\x1b\x65\xa2\x6b\x6c\x94\xf5\x2f\x7b\x8f\x91\xba\x2e\x5f\x16\x1b" + "\xe5\x70\xb1\x33\xef\x89\x7b\x8c\x54\x09\x63\xff\xb2\x95\x62\xac" + "\x33\x06\xd5\xba\xe3\xce\x18\xa9\x7d\xec\x0b\xc2\x76\x76\xd4\xc7" + "\x5f\x7b\x8c\x35\xfa\x80\xb1\xb2\xbc\x27\xee\x31\xa6\x0a\x26\x54" + "\x97\x97\x92\xaa\xd8\x52\x0f\xb1\x51\x4b\xaf\x6b\xee\x13\xec\x97" + "\x67\xac\x2d\x38\x24\xc7\xda\x02\x3b\xad\x7b\xda\x13\xd6\x16\x6c" + "\x94\xb0\x96\xd5\x5b\x7e\xda\x0d\x6b\xeb\xbc\x60\x2d\xac\xab\x5b" + "\x9a\x7c\xc5\xda\x82\x72\x8a\xb5\x99\x02\xd6\xb6\x5c\x6d\xac\x2d" + "\x28\x97\xb0\x76\x7d\x4e\xdf\x39\xa6\xd6\x15\x7a\xde\x97\xb3\xae" + "\x90\x61\xed\xba\xc2\x5e\x73\x4c\xc9\x7c\x3e\x36\x2c\x17\x73\x4c" + "\x49\xf6\x80\x52\xc1\x1e\xf0\x4b\xce\x89\xb2\x21\xd5\x57\x7b\xc0" + "\x11\xd0\xdd\x71\xdf\xe5\x32\xcc\x39\x15\x83\x39\x51\x4a\xdc\xec" + "\x01\x25\x3d\xed\x01\x2f\xf4\x8e\xb1\x3e\xd9\x03\xe8\xbe\xcb\xbf" + "\x2e\x95\x63\xec\x5f\x97\xcb\x31\xf6\x9d\x61\xe2\x3e\x4b\xec\x8f" + "\xf7\x98\xa9\x7f\x3d\xe4\xb4\x07\xd4\xc9\xb1\x55\xb2\x07\xbc\x7d" + "\xd0\x3b\xc6\xfe\x55\x6e\xff\x7d\xa6\x58\xb6\xcf\xf2\xc3\x7a\xd7" + "\x38\xd4\x62\xfc\xa9\x8d\x43\x0f\x1d\x77\xc5\xd8\xc2\xb1\xbf\xa4" + "\x38\xd4\xce\x58\x53\x7d\xf8\x72\xf7\x8c\x43\xbd\x71\x7b\x75\x79" + "\x09\xc1\xbd\x6d\x14\x6f\x65\xb6\x81\x92\xeb\x63\x1b\x28\x2f\xf1" + "\x62\x1b\x78\xfb\x41\x39\xce\xbe\x3d\x87\xd6\x3d\xe9\x09\x67\xdf" + "\x56\x48\x38\xcb\xea\x2d\x3f\xe9\x86\xb3\xb5\x57\x53\xa6\x7d\x3b" + "\xe2\xda\xda\x06\xde\x8e\x90\x6c\x03\x6f\xf7\x63\xff\xe3\x5f\xed" + "\x9e\x71\xf6\xaf\x82\xdd\xf5\xaf\x92\xdd\xb5\xd6\x43\xbe\x14\x19" + "\xce\xbe\x73\x52\xdc\xff\x48\x65\xda\x3a\x51\xa6\x2d\xf9\x05\xe6" + "\x4b\x79\xa7\xd6\x57\xdb\x00\xee\x73\x47\x6c\x45\xec\x12\xf1\x55" + "\xb2\x0d\x94\x78\xb7\x0d\xf4\x81\xaf\xbe\xe7\xee\x2b\x3a\x29\xc7" + "\xd7\xa2\xd3\x72\x7c\x35\xcc\x75\xc7\xd7\x9e\xd8\xba\xe9\x36\x4f" + "\xb8\xca\x6c\x03\x06\x8d\x77\x4c\xdd\x34\xd1\x1b\xa6\xd2\x98\x7e" + "\xf5\x92\x8f\xb4\x84\xa9\x9b\xe3\xe4\x98\xba\x29\xbb\xbf\x98\x7a" + "\x5d\xf2\xa5\x0c\x18\x53\xe3\xdd\x30\x75\x8b\x42\xc2\x54\xf7\x9c" + "\x29\x7d\x60\xea\xb5\xb2\x13\xb8\x62\xaa\x4c\x76\xdd\xf2\xa6\x1c" + "\x53\xb7\x94\x7a\xc7\xd4\x2d\xd3\x25\x4c\x65\xf5\xae\x2d\xa6\x6e" + "\x59\x75\x6d\xed\x04\x5b\x56\x49\xb2\xab\xe1\xe9\xbe\x31\x75\x53" + "\x94\x67\x4c\xdd\x14\xc5\x30\x75\x53\x54\xff\xf7\x94\x6f\xbd\xcf" + "\x07\x4c\xfd\x99\xe7\x52\xd9\x3a\xda\x67\x3b\x01\xda\x5b\x11\x4b" + "\xeb\x7e\x5c\xec\x90\x64\x31\x76\xc8\x78\x01\x63\x9f\xfa\xb1\x18" + "\xfb\xee\xa3\x72\x9f\x86\x77\x1f\x17\x7d\x1a\x18\xc6\xbe\x7f\x4e" + "\x9e\x1f\xb5\x67\xac\x10\x79\x0c\xd5\x77\xd7\x3a\xed\x04\x88\xb9" + "\xe3\x5d\xed\x04\xef\xaf\xf5\x8e\xb7\xef\x96\xca\xec\x04\x5f\x78" + "\xc6\xdb\x76\x19\xde\xfe\xc7\x09\x8a\xb7\xce\x18\xaa\xef\xda\xc5" + "\x18\xaa\x7d\xca\xb0\x32\xbc\x8d\xfd\x69\xf0\xb6\xb4\xff\x78\x2b" + "\xcf\xa5\xe2\x1e\x2f\xf5\xbd\xa5\xd5\x65\x80\xb7\x34\x5e\x87\x7b" + "\xcc\xd4\xfe\xc5\xeb\xb8\x56\x31\x53\xb1\x5f\x9e\x71\xf7\x3d\x87" + "\x1c\x77\xdf\x8f\xa0\x75\x3d\xe2\xee\x7b\x95\x12\xee\xb2\x7a\xfd" + "\xc6\xdd\x01\xd9\x0c\xde\xb3\x5f\x5b\x9b\xc1\x7b\x76\x09\x77\xdf" + "\xdf\xdf\x37\xee\xbe\x6b\xf4\x8c\xbb\xef\x1a\x19\xee\xbe\x6b\xec" + "\x15\x77\x65\x3e\x04\xff\xf9\xb1\xc7\x58\x1e\x75\xbf\xf4\x3c\x2b" + "\xff\x59\x32\x10\x9b\x01\x60\xb0\x32\x15\x63\x38\xc5\xa2\x0f\x41" + "\xdf\x36\x83\xbe\xf0\xd6\x77\x9b\xc1\x7f\x6d\x97\xe3\xed\x7f\x7d" + "\x2c\xc7\xdb\x8f\x5e\xc6\x7e\xf5\x6a\x33\xa0\x18\xf0\x5f\x0e\xa7" + "\xcd\xc0\x24\xc7\x59\xc9\x66\xf0\x51\x90\xf7\x6f\x5f\xc5\x3a\x99" + "\x7c\xfb\x94\x5b\xcc\xea\x19\x12\xde\x1e\xae\x12\x7d\xc6\x3e\x78" + "\xe1\x50\x94\x2b\xde\x16\x27\xf4\x88\x59\x3d\xed\x2a\xc6\xac\x9e" + "\x76\x95\x63\x56\x4f\x97\xc7\xac\x7e\xbb\x5d\xf2\x23\xf3\x3d\x66" + "\xf5\x07\x57\x28\x06\x23\x0f\x61\xdc\xea\xfe\xd8\x11\xae\x71\xae" + "\x15\x19\xf6\xca\xec\x08\x1f\x2e\x95\x63\xef\x87\xdb\xbc\x63\xef" + "\x87\x4f\x4b\xd8\xcb\xea\x5d\x5b\x99\xf7\xc3\xe4\x6b\x6b\x47\xf8" + "\x30\x59\xb2\x23\x7c\xf4\xa8\x47\xec\x95\x7d\x1b\x2b\x8e\xf0\xfc" + "\x6d\x0c\xcf\x23\xf6\x16\x47\x78\xb5\x23\xf4\xf0\xdf\xda\x36\x92" + "\x7d\x1b\x13\x64\x5e\x93\x0f\x76\x84\x9f\x9d\x8f\xc1\x36\xed\x40" + "\xec\x08\x88\xb7\x88\x67\x22\xe6\xf6\xc7\x8e\x70\xf5\x65\xdc\xed" + "\x23\xe5\x98\xbb\xfd\x2e\x39\xe6\x96\x1c\x74\xc7\xdc\x9e\x78\xbb" + "\x3d\xce\x13\xd6\x32\x3b\x42\x49\xa2\x77\x9c\xdd\x9e\xef\x15\x67" + "\xdd\x7c\x73\x25\x9c\xdd\xb1\x5f\x8e\xb3\xdb\x8f\x0f\x08\x67\xfb" + "\x9b\x83\xe5\x67\x85\xb3\xb1\x6e\x38\xbb\xf3\x65\x09\x67\xdd\xf3" + "\xb0\xf4\x81\xb3\xd7\x28\x0f\x8b\x77\x19\x77\xe7\x39\x39\xce\x96" + "\x84\x79\xc7\xd9\x9d\x1f\x4b\x38\xcb\xea\x5d\x5b\x9c\xdd\x69\xba" + "\xb6\xb6\x85\x9d\x26\x49\xc6\x2d\x79\xbf\x6f\x9c\xdd\x5e\xe8\x19" + "\x67\xb7\x0b\xdf\xc5\xb6\x17\x7a\x95\x71\x7b\xe0\xec\xc7\x6f\xf9" + "\x80\xb3\x3f\x73\x1f\x84\x8f\x7d\x8a\x7f\xe1\x62\xaf\x1d\x54\x6d" + "\x72\xdb\x2f\x71\xd2\x75\xbf\x84\x8b\x6d\x61\xbc\x68\x5b\x90\xe7" + "\x67\x49\x16\xed\xb7\x91\x02\xee\x3e\xf1\x63\x71\xf7\xbf\x37\x76" + "\x38\x71\x77\x11\xe0\xee\x7f\xd3\xfd\x11\x1d\x4e\xdc\xfd\xdf\x67" + "\xc5\x7e\x49\xf9\x59\xbc\xd8\x16\x1e\xa1\xed\x5d\x74\xda\x16\x10" + "\x87\x23\x5d\x6d\x0b\xff\xab\xf0\x8e\xc1\xff\x13\x26\xb3\x2d\x7c" + "\xee\x19\x83\xad\x32\x0c\xde\x35\x81\x62\xf0\x23\x22\x06\xff\x4f" + "\x74\x3b\xe8\x96\xed\x59\xbe\x61\xb0\x95\x62\xf0\xc4\xeb\x83\xc1" + "\xbb\xae\x02\x06\xd3\x71\xdf\x75\xa1\xda\x08\x18\x1c\x83\x18\x3c" + "\xb1\x7f\xf6\x86\x9f\x28\x47\x0b\xf6\xcb\x33\x16\x7f\x32\x5f\x8e" + "\xc5\x9f\x18\x68\x5d\x8f\x58\xfc\xc9\xa3\x12\x16\xb3\x7a\xd7\xd6" + "\xde\xf0\x49\xc2\xb5\xb5\x37\x7c\x92\x20\x61\xf1\xff\x3e\xd8\x37" + "\x16\xff\xcf\x08\xcf\x58\x8c\xe7\x11\x8b\xff\x67\x44\xaf\x58\xfc" + "\x88\x2b\x16\xff\xcd\x29\xf3\xca\xec\x0d\xa6\x5f\x7a\xee\x96\xbf" + "\x79\x95\x7f\xb5\xb7\x93\x8c\x7a\xc5\xdf\x96\x56\x17\x11\xd2\x96" + "\x49\x32\xaa\xed\x8f\x10\x38\x07\xe3\xf7\xb7\xad\xd5\x9a\xb1\x84" + "\xcb\xb5\x6a\x11\x8f\xff\x82\xff\x20\xe3\xe6\x2b\x85\xb9\x45\xc7" + "\xf8\x6f\xd4\xdf\x15\xcf\x23\xf6\x6e\x71\xb9\xee\xe9\x59\x7c\x76" + "\x5b\x91\x70\x9f\x9d\xed\xbb\x69\x33\x88\x65\xe4\x4d\x93\xa2\x94" + "\xf0\x39\x6d\x85\x96\xa0\xb6\x42\x4f\xf7\x8f\x52\x93\x80\xe0\x15" + "\x3c\xbf\x79\x03\x6f\x6d\x1b\xd5\xac\x6e\x5b\x43\x48\xfe\x06\xde" + "\xd2\x91\x55\x3a\x16\xde\x31\xf6\xaf\x50\xaf\x2d\x34\xc1\xd2\x96" + "\x19\x45\xe0\xdc\x24\xf1\x1c\x8c\x1b\xe1\x32\xfd\x78\x0e\xae\xf1" + "\xeb\x76\xd7\x6d\x49\x03\xac\x4a\x25\xe4\xfe\x76\x9c\x33\xa5\x31" + "\xc0\x33\x61\xb9\xd0\x66\x1e\xb4\xc5\xdf\x74\xab\x15\xf8\x51\x55" + "\xb5\x8a\xe0\x9c\x5e\x0d\xef\x65\xc8\xc5\xb1\xf7\xbb\xa7\x90\x57" + "\xaa\x08\xb7\xf5\x7c\x3c\x3f\x4c\x6d\x00\x7a\x90\xfc\x45\x24\x00" + "\xdf\x23\x0f\xea\xf1\xca\x74\x1e\xd6\x11\x4b\xb5\xdd\xca\xe6\x34" + "\xf4\x6f\x2f\xe8\xb1\x3c\x3c\x77\xf3\x22\xa2\x86\xff\x40\x7e\xbd" + "\xda\x00\xfd\x6a\x80\x7e\x55\x60\xbf\xbc\xbd\x63\xde\xdb\xb0\xee" + "\xdc\xaa\xc1\xb5\x83\x3e\x1f\x9f\x4d\x9f\xa3\xe4\x56\x3b\xe0\x3c" + "\x9f\x99\xce\x57\x27\xdb\x49\x08\x8c\xc5\x16\xe8\x37\xf2\x23\xf7" + "\x6e\xb3\x7a\xe5\x2d\x84\xec\x48\x69\x56\x56\x43\xdf\x1d\x7f\xbd" + "\xd5\x6a\x4c\xfb\x0d\x81\xeb\x16\xd4\x59\x9a\x14\x9f\x9e\x9b\x7a" + "\x81\x10\xc4\x13\xf8\x7d\xd1\x0a\xeb\xd8\x64\x28\xe7\xc1\x7b\x70" + "\x6d\x1a\x15\xd6\x85\xf3\x1b\x8d\x49\xa7\x48\x88\x9e\x04\xe4\xc2" + "\xbb\x09\x75\xe3\xb1\xae\x49\xf1\xa9\x19\xfb\x00\xe5\x54\x28\xe3" + "\x7d\xe8\x43\x06\xf3\xe8\x7c\x3c\xe5\xcd\x02\xb5\x81\x1b\x79\x9e" + "\xe9\x44\xf0\x9e\x79\xf0\xce\x50\x27\x10\xea\x04\xd2\x63\x1a\x51" + "\x17\xc0\x39\x6c\x07\x8e\x81\xc6\x05\x5d\xd8\x76\x34\xb6\xed\x65" + "\x1c\x54\x7c\x98\xda\xc0\x03\x6f\xe3\x9a\xaa\x4d\x53\x1c\xad\x57" + "\x7c\x96\x1d\xa2\xe0\x79\x98\xe7\x96\x95\x69\x24\x30\x9f\x23\xc4" + "\x78\x0b\xb6\xf3\x59\x1c\xb4\xaf\xc2\xb1\xe8\xc8\xfa\x6c\x3c\xf0" + "\x91\x05\xc7\x17\xe8\x69\xd5\x8e\xc2\x77\xf8\xac\x08\x9f\x83\xf7" + "\x08\xf5\x69\xec\x7b\xec\xb3\x36\xcd\x8f\x87\xf2\x9b\x7e\x8a\x73" + "\xc4\x4f\x13\xb4\x13\xee\x5f\x65\x22\x0b\x28\x7d\x4c\xec\x3e\xe0" + "\xa5\xcf\x0a\xa1\xcd\x40\x3c\x87\x65\x2f\xfd\x0d\x14\xe9\x56\xa9" + "\x01\xde\x70\xa7\x9d\xc8\x23\xc0\x17\x22\x8f\x60\x7f\x77\xa6\x99" + "\x94\x74\x1d\x56\xfc\x9d\xea\x75\xb9\x40\x43\xc7\x3b\x1a\x55\x1e" + "\x8c\x2d\xd7\x8d\x74\xa9\xc7\x6b\xa7\x91\x2e\x79\x29\x40\x13\x56" + "\x97\x48\xfd\xa7\x65\x4a\x4f\x0e\x68\xc1\xf6\x6e\xfe\xfd\x63\x7c" + "\x9f\xbc\x76\xa0\xe3\x70\xde\x5a\x96\x0c\xfd\x42\xbe\x05\x1e\xd9" + "\xb1\xc8\xa6\x44\xbf\x3e\x3c\xbf\xb7\xd5\xa6\xcc\x6b\x21\x28\x57" + "\x92\x1c\xc0\xe5\x4d\x49\x30\xe6\xd0\x26\xaf\x6d\xb4\x3c\x20\xd2" + "\x31\x05\x68\x97\x04\xbc\x0b\x63\x9e\x07\xe3\xb7\x19\x30\x0f\x7f" + "\x6f\x86\xf5\x07\x64\x3a\x8b\x49\xf1\x77\x33\xb4\xa7\xde\x34\x9c" + "\xb7\x6c\x19\xce\x9b\x61\x0c\x0f\x74\x64\xfd\xbd\x5c\x1c\x43\xec" + "\x53\x1e\x9c\xcf\x81\xeb\x50\x77\x3c\xe3\xa1\xbf\x87\x89\xef\xec" + "\x6d\x3c\xb3\x77\x90\xb1\x39\x3b\xc8\x88\x35\x3b\xc8\xb8\x65\x0d" + "\x30\x2f\x33\x1f\xe3\x8f\xc4\xd8\x09\xa7\x9e\xdc\xdc\x15\xda\x69" + "\xc1\x6f\x4f\xdc\xca\x5b\x0d\x6f\xee\x20\xa3\x71\x6f\xec\x54\xe0" + "\x4e\x5c\xc3\xa7\xfa\x9f\xe5\xab\xf5\x57\x08\x37\x74\x72\xb3\x63" + "\xe5\x3d\xa1\x53\xae\x10\x72\x50\x67\x25\x69\x89\xb0\x96\xb7\x36" + "\x93\x34\x2b\x6f\xa9\xca\xb8\x40\x00\x7b\xf2\xd9\xd8\xed\x59\x3d" + "\x35\x8e\x10\xdc\x33\xc8\x7d\xaf\x23\x41\xf1\x44\x95\x7a\x92\x68" + "\xd2\x1b\xf8\x66\xc7\x86\x41\x86\xb4\xe5\x44\xb9\xa3\xb5\x96\xc9" + "\x9e\x8a\x3d\x2f\xec\xc1\xfd\xa9\x1d\xd1\x64\xa6\x5d\x58\x8f\x0a" + "\xd4\xc5\xe9\x73\xc9\xcd\xf8\x3e\x21\x54\xf6\xda\x7d\x05\xc6\xad" + "\xd8\x37\x7c\xde\x6d\xa4\xf4\xdc\x10\xa0\xdd\x31\xdb\x06\xf2\xd6" + "\x5e\x92\x1e\xc7\x37\xa3\x5c\x07\xeb\x0b\x95\x05\xab\x9b\xed\x20" + "\x5b\xcd\x81\xf5\xdb\x44\xf6\xd5\x1b\x94\xdc\xda\xbd\x3e\xee\x41" + "\xdc\x13\x4e\xd7\x6d\x5c\x4b\xa1\xef\xd3\x75\x24\x83\xad\x83\x8d" + "\xd1\x21\x89\x28\x4f\xf1\x67\xb1\xff\x7b\xe1\x5d\xf9\x91\x77\x66" + "\x40\x9f\x8a\x71\xfd\x9c\x5a\x67\x24\x15\x36\x07\x79\xbb\x85\x8e" + "\xd1\x20\x18\x23\x15\x5c\x4b\x85\x71\x0a\xf0\x44\x37\xa4\x19\x97" + "\x3f\xb9\x99\xf3\x63\xb4\xa1\x74\xb1\x32\xba\x4c\x79\x9d\xc0\x3a" + "\x0a\xb4\x59\xcb\x68\xc3\x0d\x0b\xc9\x47\xda\xf8\xf8\x1e\x66\x6f" + "\xeb\x0b\x3e\x9b\x07\xfe\x40\xbe\xe0\xc2\x42\xf2\xf1\xd9\xd8\x07" + "\xfc\x7e\x86\x7c\x30\xf5\xcd\xb3\x7c\x95\xbe\x99\x54\xc3\xfb\xf0" + "\x43\x5d\xfb\x60\xf7\xb1\x0f\x7b\xf5\xde\xfa\x90\x7d\x3f\xf0\xed" + "\xfd\xc0\xb7\xf7\x03\xdf\x9a\x18\xdf\x1e\xae\x63\x7c\xeb\x80\x7e" + "\x75\x82\xec\xbe\x6c\x3a\x51\x62\xbf\xb6\x9d\x2a\x54\x72\x05\xd0" + "\xcf\x66\x89\x77\x27\x5f\x84\x31\x12\xf9\xd7\xef\x9e\x50\x1c\x9f" + "\x2a\x6b\x2d\x49\x47\xfe\xed\xf2\xc4\xbf\xc6\x89\x53\x67\x01\x6d" + "\x5e\x03\xfe\x3d\xaf\x23\x81\x0d\x44\xb5\x7c\x3a\xf0\x6f\xb3\x27" + "\xfe\x35\xde\xbc\x1b\x9e\xd9\x83\x7f\xe3\x5c\xf9\x77\xdf\x27\xbe" + "\xf3\xef\xbe\x0c\x27\xff\xbe\x28\xf0\xef\x5c\x37\xfe\x6d\x70\xe1" + "\x5f\x7c\x6f\x9f\xf9\x77\x5f\x83\x6f\xfc\xbb\x2f\xde\xc9\xbf\xa0" + "\x97\xbc\xfd\x2a\x1d\xa3\x41\x30\x46\xc0\xbf\xfb\xc6\xc1\x38\x79" + "\xe4\xdf\x9f\x9e\x7e\x9f\x07\xf4\x9f\x7e\xfb\x4f\xf6\x4d\xbf\xfd" + "\x4b\x7c\xa7\xdf\xfe\xc8\x6b\x4f\xbf\xfd\xef\xf9\x46\xbf\xfd\x3a" + "\xef\xf4\x33\xda\x7f\x3e\xf4\x3b\x50\xde\x7f\xfa\x1d\xd8\xd8\x37" + "\xfd\x0e\x3c\xe4\x3b\xfd\x0e\x90\x6b\x4f\xbf\x03\x73\x7c\xa3\xdf" + "\xe7\xcd\xde\xe9\xf7\xf9\x6e\x6f\xf4\x7b\xf2\x66\x8e\xe7\xd0\x6f" + "\x2e\xb4\x3d\x0a\x65\x20\x26\xaf\x95\xad\x47\x9d\x11\xca\x2a\xb1" + "\x4c\x65\x2a\xd0\xab\xdd\xca\x81\x6e\x65\xb5\x5b\x39\xcc\xad\xac" + "\x71\x2b\x8f\x10\xcb\x40\x2f\xff\x4b\x8a\x32\x7f\xd0\xd9\xe0\x5d" + "\xca\x0c\xc2\xf5\xf0\x99\x0e\x2d\xea\x7d\xe1\x9e\xfa\x9e\x97\xc9" + "\xdb\xf4\x69\xe4\xd6\x16\xc5\xc1\x40\x4a\x8f\x95\xb7\xe8\xf8\x94" + "\x0c\x02\xf4\x18\x33\x65\x39\xf2\x95\x85\xf0\xdd\x9a\x41\x30\x4e" + "\x37\x81\xbe\x69\x41\x9e\xd3\x2e\xda\xc7\xd7\x2b\xca\x3a\xf1\xfd" + "\xee\xd7\x1b\x09\xe7\x77\x8f\x0e\x75\x21\xa0\xcf\x18\x8b\xdf\x3d" + "\xb7\xf0\x5b\xc3\xd5\xb9\x4a\x2e\x20\x37\x93\xd3\x2e\xb7\xf0\x96" + "\x49\x97\x61\x1d\x83\xb5\xac\xda\x6c\x03\x9e\xe4\x2d\xc6\x45\x17" + "\xa1\xbf\x07\x67\x55\xa6\x42\xdb\xf0\x1c\x78\x56\x04\xaf\xde\x1b" + "\x56\x6d\xaf\x21\x3c\xb4\x51\x65\x2d\x07\xdd\xbf\x96\x08\x6d\x46" + "\xf0\x43\xf7\x86\x61\x9b\x1e\xf5\xb3\xfc\xf6\x55\xf0\xcc\x47\xa6" + "\xeb\x54\x84\x5f\xa1\x0a\xf3\x8d\x3f\x0e\xae\xf2\xaa\xf7\xe5\x77" + "\xa8\x58\xbb\x01\x03\x69\xb7\xae\x97\x76\x85\xfe\xaa\x07\xd0\xee" + "\x17\x63\xbc\xb7\x6b\x13\xfa\xab\x1d\x48\xbb\xd9\xbd\xb4\x2b\xf4" + "\x37\x72\x20\xed\x7a\xcd\xff\xc1\xe7\x77\x0a\xfd\xcd\x18\x40\xbb" + "\x5f\x8e\xf3\xde\x6e\xfb\xaa\x81\xf1\xc2\x97\xf9\xbd\xf1\xc2\xc0" + "\xf8\xe0\xcb\x5e\xde\xbf\x63\xd5\xc0\x78\xa0\x7c\x6c\x6f\x3c\x30" + "\x30\xfa\x97\xf7\x4a\xff\x81\xd1\xbe\xdc\xd4\x1b\xed\x07\x46\xf7" + "\x43\x5e\xf9\x1f\x75\x59\xa0\xbd\x96\x1f\x7e\xa7\x9e\x5b\xf7\x85" + "\x96\x0b\x6d\x1f\xb5\x92\x8b\x24\x4f\x02\x86\x85\x14\x92\xa1\x91" + "\xd4\x3e\x74\xa8\x7c\x79\x11\x51\xe6\x2b\x39\xe5\xf6\x94\x5a\x65" + "\xb5\x7d\x2c\x49\xb7\xf3\x8e\xf7\x92\x6c\x8a\x3b\xe1\xfc\xfe\x78" + "\x42\xac\x8b\x75\x84\xb6\x13\xfa\x85\x36\x37\x2d\x92\x4c\x75\x10" + "\xb4\x47\x58\x0f\xa4\x02\x86\x01\x8e\x55\x17\xda\x70\xcd\x1b\x0a" + "\xf7\xd9\x81\x7f\xa1\x0d\x1b\xd9\xc9\x59\x14\x91\x8b\x68\x3d\x0b" + "\xe8\x8d\x16\x7e\x5d\xfb\x28\x3e\x5d\x47\x56\xc1\xef\x26\xc5\xe1" + "\x07\xfd\x2c\x44\xb9\x19\xf4\xc9\x8e\xac\xc3\xa3\x4d\x8a\x23\x01" + "\xa8\x63\x82\x2e\x6b\x4e\xbf\x8c\x36\xf7\x3b\xf5\x2b\x41\xaf\xc5" + "\xba\x3b\x38\x8b\xf2\x7e\x3d\x51\x1e\xb0\xa0\xfe\x7e\x38\x7a\x7f" + "\x22\x21\xbd\xd8\x5c\x54\x5c\x58\xb0\x0a\xef\xc7\x76\xd0\x96\x99" + "\xc7\xc1\xd8\x86\xa9\x8b\xb1\xbf\x30\xc6\xb5\xc6\x14\x5c\x17\x0e" + "\x9b\x26\xdc\xcd\x77\x08\x38\x7f\x4b\x0b\x94\xa9\xce\x9e\xc9\xd7" + "\xf0\xea\x3d\x01\x7c\x6e\x50\x64\x95\xb5\x95\x18\x93\xba\x48\xbd" + "\xe2\xf0\x39\x7c\x76\x5b\x58\x30\xb1\x86\x05\x07\x40\x1f\xea\xc4" + "\xfe\xe2\xb3\xc4\xf3\x68\xa3\x10\xfa\x68\xdf\x9f\xea\xbd\x8f\xb0" + "\x96\x84\x4e\xd5\xf0\x16\x1c\x43\x63\x5a\x2b\xf4\xa5\xe2\x75\x1c" + "\x67\xbe\x20\xa8\xc6\x9a\xae\xbb\x9d\xd9\xec\x8e\x14\xa2\xed\x07" + "\xd6\x81\x70\x6a\x87\x59\xbb\x37\x9c\xfa\xd9\x00\xde\xf3\x86\xa6" + "\x00\x94\x57\x2e\x29\x8e\xd0\xfc\xc7\xd3\x75\x4a\x1f\xd7\xff\x23" + "\x74\xfd\x37\xde\x8e\xe3\x50\xf1\x02\x3c\xef\x5f\xea\x15\x47\xe8" + "\xde\x7d\x78\xde\x58\x7c\x1e\xd4\x99\x08\xcf\x1c\xcb\xe7\xef\x21" + "\x58\x0f\xae\xd7\x09\xd7\x23\x5d\xae\x47\xf2\x05\xc1\x1a\xe1\xba" + "\x5d\xb8\x3e\xde\xe5\xfa\x78\xfd\xed\x68\x97\xab\x08\xc7\x77\x82" + "\xb5\x4c\x8b\xeb\x1a\xda\xfc\x99\x5d\x7d\xaf\x56\xa8\x37\xc6\xac" + "\xa8\x78\xb4\x0d\xf8\x0a\xae\x8f\x73\xb9\x7f\xdc\x81\xe4\x08\xf2" + "\xe4\x26\x1c\xd3\x8a\x28\x93\xdf\xfe\x54\x66\xcb\x39\x32\x89\x8e" + "\x85\x7a\xaf\xc6\xb5\x3d\x93\xa2\x62\x04\xb4\xa9\xb1\x82\xac\x07" + "\x75\xc6\xe0\x33\x3d\x8d\xbf\xdd\xd0\x18\xd5\xa5\x6d\x8c\xed\x0e" + "\xd3\x18\xef\x6d\x78\xcc\xe1\xf4\xd1\x8c\x25\xca\xa9\x75\xc4\x2f" + "\x7d\x16\x51\xa2\x9c\x93\x76\x94\x28\x53\xe1\x37\xda\x83\x79\xa5" + "\x3e\x61\x47\x92\x0d\xe6\x87\xd1\x1f\xbf\x29\x75\xc1\x5c\xb0\xeb" + "\x9a\xf5\xf8\x3d\xa5\xd3\xd0\x18\x61\x2b\xb8\x41\xd7\x19\x76\xc3" + "\xd8\xa6\x04\xa2\x9c\x69\xf6\xf8\x6d\x65\xec\xb2\x3a\x9e\x4b\x7b" + "\x9d\x04\x4c\x8d\xf1\xe3\xf1\xfb\x4a\x65\x7c\x23\x59\x7e\x91\x28" + "\xf1\x9b\xca\x3b\x49\x24\xac\x1a\x64\x53\xfc\xe6\x12\x18\x1b\x49" + "\x8a\xd2\x48\x58\x90\x99\xa8\x83\x14\x8a\x41\xcf\x9c\x20\xc4\xd1" + "\x11\x7f\x03\xf0\x2b\x77\xef\x9c\x48\xb4\x6b\x04\xf3\xeb\xa6\x9a" + "\x76\xa4\x95\xfa\xdb\x41\x16\xc6\xef\x2e\x7f\x6e\x27\xa3\x37\x25" + "\x91\x88\x99\x95\x19\x34\xde\x10\xee\x01\xed\xec\xd0\x69\xbb\xdf" + "\xd0\x8d\xea\xea\xd0\xdd\x2e\x7e\x93\x79\xf9\xa2\x9a\xa0\x9f\x27" + "\x9f\xb5\xb7\x14\xbf\xc9\xa0\xed\xbb\x7b\x2d\x8b\x47\x84\xbe\x9f" + "\xdc\x1b\xba\x11\xfc\x4c\x1d\x79\xc0\x06\xe3\xdb\xa1\x23\x29\xcf" + "\x12\x35\xf4\x59\x3d\xba\x81\x28\xb7\xcc\x20\x01\x15\xb1\xf5\x28" + "\x7f\x68\x2a\x1a\xde\x27\x4b\x9f\x26\xb7\xdb\x41\xb6\x46\x5b\x7f" + "\x45\xc3\x7a\x82\xdf\x6c\x8a\xda\xc9\xd8\xc2\x76\x32\x0e\x79\x74" + "\xd2\x2c\x2d\xe1\xd6\x07\xd5\x30\x5e\xad\x1a\x7a\x50\x77\x90\xf8" + "\xce\xab\x55\x6a\xaf\x78\x69\x68\x8c\xb5\x6b\x1b\x23\x1c\x40\x47" + "\xf6\x9d\x2e\x38\x92\x7b\x37\xdc\xb0\x23\xcd\xa2\xfc\xa8\xbe\x59" + "\x81\x3e\x47\xb8\xff\x96\x2b\x6e\xd6\xcb\xe8\xd2\x2d\xd0\xa5\x9b" + "\xd1\x05\x69\x32\x43\x4f\xf0\xfb\x4e\x30\xd2\xa3\xda\x56\x4b\xb8" + "\x65\xe2\x1e\xdc\x08\xb2\x99\x63\xb4\x70\x74\xc7\xdf\xc0\xc1\xb8" + "\xa3\x1d\x13\x78\xc1\xdf\x01\x63\x9f\x8d\xfb\x72\x57\x28\x82\x80" + "\xff\x82\xb9\x6e\xcd\x10\x90\x27\x23\x66\x9e\xcb\x10\x62\x3e\xb1" + "\xd8\x4f\xf6\x65\x3a\x2d\xb4\x3d\xaa\xbb\x1b\xe8\x60\xeb\x41\x87" + "\x31\xb8\x7f\x17\xbf\x31\xd8\xd7\xb2\xef\x28\x94\x0e\xcb\x74\x23" + "\x50\x07\x79\x00\x64\x49\xfc\xee\x84\x34\xd8\xdc\x44\x02\x2a\xe3" + "\xd9\xf8\x3b\x84\x71\xc7\xbd\xbc\x38\xd6\x93\xe7\x6a\x49\xb5\xee" + "\x04\xc1\xb1\xe6\xb3\x2a\xf2\xbb\xb7\x36\x46\xc0\x3a\x12\x71\x49" + "\x51\xfd\xd6\xc1\x64\x42\xa6\x27\xfb\x3a\xee\xd5\x5e\xbf\xff\xfe" + "\x34\xe3\xae\xfd\x05\x8e\x7b\x55\xb4\x34\xee\x47\x15\x03\x1b\xf7" + "\xa3\xe4\xfa\x8e\xbb\xfa\x17\x38\xee\xd5\x35\xd2\xb8\x1f\x5b\x3a" + "\xb0\x71\x3f\x96\xec\xd5\x8f\x97\x8b\x54\x1e\xd1\xd4\x92\x9d\xb7" + "\x80\x3e\x9c\x3f\x2f\x82\xcb\x4f\x28\xe5\x5e\xd2\xa8\x98\x1c\x71" + "\x6a\xf4\x97\x23\x60\x1d\x5f\xd4\x42\x7f\xb3\x35\xf0\xd7\x19\xb8" + "\x5f\xec\x48\x19\xae\xef\x6b\xc8\xe1\xf1\xb8\x9e\x7f\xf5\xf4\x8d" + "\xd1\x20\x8b\xbd\xa4\x21\x9d\x2f\x45\x2b\xd7\x9c\x22\x01\x21\xb5" + "\x64\x12\xc7\xf1\xbc\x31\xad\x05\xd6\xcf\x6f\x12\x8d\x2f\xb6\x10" + "\x6d\x4a\x00\xd4\x3d\x71\x42\x9b\xb2\x02\x8f\x9f\x6a\x53\xb2\xce" + "\xc2\x91\xc6\xf4\x5d\x7e\x9a\x28\xed\xa3\xce\x67\xec\x58\x60\x84" + "\x35\x29\xc0\xb0\xe3\x92\x4d\x99\xdd\x4a\x54\xbc\xf2\x0e\x3e\xc4" + "\x42\x02\x72\x40\xd6\xc2\xef\x11\xfa\x57\xd1\x17\xec\xf8\x65\xb4" + "\xd5\xee\xbd\x64\x54\xe6\x63\x9d\x51\xe1\x86\x6d\xb7\x58\x14\xb8" + "\x96\xed\x58\x60\x53\x8a\xbc\x82\x3e\x03\x33\xad\x44\x09\xe3\x17" + "\xeb\x18\xa6\x31\xb6\x6d\x6d\x8c\xb2\xad\xbf\x61\x6c\xd7\xb0\x1b" + "\x74\xf6\x0f\x9a\xf5\x1e\xf9\xe7\x0a\x51\x22\x0f\x21\xbf\x04\x25" + "\x12\xb5\xc8\x4b\xc8\x43\x55\xb6\x66\x82\x7b\x11\x42\x9a\x89\x9a" + "\x07\xfe\x79\xe9\x03\xa0\xad\x2b\x0f\xe5\x7b\xe1\xa1\x8d\x72\x1e" + "\x6a\x13\x78\x08\x78\x49\xe2\xa1\xb9\xc0\x43\xf8\xed\x39\x6b\x4f" + "\xa9\x4f\x3c\x64\x16\x78\x68\xad\x1b\x0f\x5d\xd4\x92\x23\x75\xa7" + "\x05\x1e\x3a\x3a\xd1\x3e\x52\xe4\xa1\xe3\x7b\x0e\xc6\x00\x0f\xc5" + "\xf8\xca\x43\xc7\x99\x0c\x55\x30\x48\xb0\x27\x9d\x3a\x49\xcb\x20" + "\x7b\x4a\x72\xe7\x89\x91\xec\x1b\x12\xc8\x99\x43\x3b\x6b\xf9\xb5" + "\x20\x6b\x42\x5f\x66\xde\x4d\x02\xda\x86\x05\x93\xb6\xf5\xc1\x2a" + "\xeb\xb0\x60\x41\xbe\x3b\x31\x61\x60\xbc\x7c\x82\x7e\x9b\xe1\xbf" + "\x8d\xfe\x15\xff\x52\xb4\x8a\xfb\x36\xda\x1f\xe8\xa8\x59\xe8\xc8" + "\x20\xed\xf9\xbf\x4e\x06\x19\xbd\x59\x9b\x42\xee\x81\xbe\xbc\x7f" + "\x18\xe4\xd4\xc3\x20\x4f\x57\x47\x25\x10\x7e\xdd\x3f\xd9\x3e\xe2" + "\x2c\x2a\x93\xe2\xab\x49\xc8\x6b\xc0\xaf\x2a\x57\x7e\x65\xbc\xc9" + "\xae\xd9\xf2\x7f\xbd\x1a\xdb\x9a\x5a\x4e\x42\xb4\x4f\xa1\x5f\xca" + "\x37\x13\x96\x2e\x27\xb8\xd7\xca\x1f\x7e\x0f\xed\xcc\x6d\xb7\xc1" + "\xfd\xc1\xfc\xb7\xd3\x14\xfa\xa7\xc8\xed\xfc\x4b\xd3\x14\x88\x59" + "\x1f\xa6\x15\x2a\x39\x38\xc7\xbe\xbb\x17\x12\xbc\x9e\xdd\xa5\xa2" + "\xdf\xe8\x39\xa8\x53\x65\x2d\x24\xd9\x49\xa0\x53\xc2\x6f\xe6\xcb" + "\x51\x48\xb0\x7e\xce\x22\x35\xfd\xce\x46\xef\xb3\x17\x12\xbc\xd7" + "\x01\xe7\xff\xcc\x05\x92\xdc\x94\x30\x72\x38\xaa\x8a\xb6\x71\x38" + "\xea\x0b\x82\x6d\x20\xae\x1d\x8e\xda\x4b\xf2\x92\x34\xa4\xd2\x5c" + "\x08\xd7\xbf\x26\x79\x97\x46\xc0\xb1\x09\xfe\xdb\x49\x8b\xe2\xeb" + "\x5d\x87\xa3\x38\x12\xb2\xe2\x31\x1e\xf8\x90\xaf\xc6\xfd\x3b\x69" + "\x64\x50\x93\xe2\xeb\x3d\xd5\xb5\xf9\x04\xc6\xf0\x3d\xdc\xdf\xc9" + "\xa7\xbf\x64\xe6\xf8\x97\x2e\x72\xe9\x2f\x5d\xc2\x67\x3b\xf8\x97" + "\x7e\xc0\x67\xe7\xa4\x68\x05\xdf\xae\x42\xea\x87\x92\xdd\x1e\x4e" + "\xb0\xaf\xf8\x5c\x7c\x5e\xde\x22\x9d\xf0\xcc\xd1\xb4\x6f\xf8\x4c" + "\x6c\xd3\xf5\x99\x98\x3b\x59\xfb\x3c\x3e\xf3\x9b\x07\xe1\x38\x14" + "\xe8\x51\x8c\x74\xc0\xe7\x73\x7c\xb4\x3f\x9f\x1e\xed\x47\xef\x49" + "\x6e\xf6\x74\x4f\x9c\x70\x0f\xb5\xc5\xe2\x3d\x5d\xac\x3e\x6d\x03" + "\xf0\x64\x05\x9e\xbf\x37\xda\x48\x7a\xd2\xb0\xf6\x36\x86\x2f\xdf" + "\x5c\x64\xf8\xc2\x68\x4a\x79\xe5\xa5\x68\x7f\xa0\x9b\x1a\xb1\x08" + "\xda\x38\xe8\x6c\xe3\xdb\x68\x3f\xa4\x37\xf2\x8d\xc8\x4b\xc8\x47" + "\x22\x0f\xd1\x7e\xea\x09\x71\xe5\x19\xf8\x1d\xc0\xda\xa9\x0d\x12" + "\xdb\x81\x3e\x08\x18\xf7\xd5\xc4\x7b\xe1\x7a\x4f\x3e\x3a\xd9\x28" + "\xf1\xd1\xc9\x37\x6d\x69\x3c\x8f\x7c\x64\x7c\x31\x13\xdb\x99\x2e" + "\xf5\x67\x9a\x02\x79\xec\x17\xc6\x5b\xbb\x90\x4e\xf7\xa6\x92\x30" + "\xf6\x3e\x27\xe9\x77\xe2\x7b\x53\x8d\x61\xd8\x57\xf1\x3d\xb0\x0f" + "\xb9\x9c\x96\x88\xef\x91\xd7\x15\x0e\xed\x5e\x22\xc2\x3d\x2f\x60" + "\xdb\xe2\x18\x00\xcd\x88\x78\x8f\x58\x3f\x97\xd3\x41\xbf\x47\xd3" + "\x7b\x18\xcf\x35\x79\xe0\x9f\x93\xef\xbb\xf3\xdc\x8d\xa9\xc4\x8f" + "\x87\xf1\x36\xbe\xd8\x8a\xcf\xd9\xcf\xfa\xb6\xcf\xd1\x05\xcf\x00" + "\x1a\x28\x85\xf3\x27\x5d\x78\x42\x68\xdf\xe6\xa1\xfd\x53\xfe\xb2" + "\xf6\xa3\xa1\xfd\x64\x68\x1f\xd7\xbb\x17\x51\x5f\x3c\x45\x71\xf0" + "\xde\x64\xd6\xbe\xc8\xb7\x7c\x76\x5b\xa1\x3e\x05\x7d\xa1\x4e\x95" + "\x31\x0c\x3d\x76\x19\xeb\xd1\x6f\xf0\x4a\xce\xc0\xb9\x7d\x83\x77" + "\xf5\xd1\xd8\x09\x72\x10\xfb\x16\x7d\xea\x7d\xac\xb3\xfd\xed\x5a" + "\x25\xae\xd3\xd2\xf7\xf7\x53\x78\x6d\xbb\x31\xa9\xde\xe5\xfb\xfb" + "\x29\xfa\xbd\xcb\xa4\x38\x55\xdb\xa1\x24\x4a\x28\x17\xb0\xf3\xc7" + "\x2c\xae\xe7\x25\xff\x16\x76\x1e\x7d\x07\x0f\x94\xa2\x5e\x7a\xaa" + "\x59\xb4\x05\xf4\xad\x6b\x3e\xf0\x33\xd4\x35\x23\x7a\xd1\x35\x23" + "\x7e\xa1\xba\x66\xdd\xf2\x81\xe9\x9a\x75\x5e\xe3\xbf\xfc\x43\xe7" + "\xf1\x26\x7b\x9f\xb2\x4b\xb2\xf7\xe9\x2b\x03\x93\x57\x4e\x5b\xff" + "\xa1\xf3\xf8\x3a\xee\x75\x65\xd2\xb8\x9f\x9d\x3f\xb0\x71\x3f\xeb" + "\x3d\xfe\x71\xaf\x3a\xcf\x79\xad\xa4\xf3\x9c\xd7\x7a\xd7\x79\x4c" + "\x8f\xf6\xae\xf3\x34\xc4\x4b\x3a\x4f\xfd\x21\x26\x93\xd4\x6f\x67" + "\x32\x49\xfd\x7c\xdf\x75\x9e\x73\x8d\xff\xd0\x79\x7c\xd1\x79\xce" + "\x8c\x93\x74\x9e\x73\x1f\x0f\x4c\xe7\x39\x57\x22\xd7\x79\xce\x57" + "\xf6\xd4\x79\xea\x87\xf5\x5f\xe7\xa9\x7f\x78\x60\xbc\x5c\x3f\xb6" + "\x7f\x3a\x4f\xfd\x46\xcf\x3a\x8f\x29\xd2\xbb\xce\xc3\xae\xf5\x94" + "\x55\x1b\x1e\x96\x64\xd5\x06\xff\x9f\xbf\xce\xf3\x5d\xb1\x67\xb9" + "\xf4\xbb\x8f\x99\xce\x53\x5f\x78\xf5\x75\x9e\xfa\x42\xcf\x3a\x4f" + "\xc3\x5d\x4c\x3e\xac\x2f\xea\xa9\xf3\xc0\x3d\x1e\x75\x9e\x86\x17" + "\x84\x7b\x0a\xe5\x3a\x0f\x6b\x03\xf0\x64\x89\x77\x9d\xa7\x71\x28" + "\xc3\x97\x86\x73\x0c\x5f\x18\x4d\x7b\xea\x3c\x0d\x9f\xf6\xad\xf3" + "\x30\x1e\xa2\xfd\xf4\xaa\xf3\x34\x2a\x7a\xea\x3c\xa6\x71\x9e\x75" + "\x9e\xa6\x93\x12\x1f\x35\x2d\x95\xeb\x3c\x8d\x4f\xff\x32\x74\x1e" + "\xaf\xbc\x55\x2c\xd7\x79\x9a\x6e\xf6\x5d\xe7\x69\x9a\xec\x9b\xce" + "\x83\x3c\xe7\x49\xe7\x69\xda\xe8\xce\x73\x72\x9d\xa7\xe9\x13\xcf" + "\x3a\x4f\x53\xa5\x5c\xe7\xc1\xf6\x3d\xe9\x3c\x4d\x9d\xb2\xf6\x7b" + "\xe8\x3c\xe7\x87\xc9\x75\x1e\x56\x4f\xd2\x79\xce\x97\x32\x0c\x3d" + "\xdb\xe8\xbb\xce\x73\x7e\xa3\x77\x9d\xe7\xfc\x56\xb9\xce\x73\x3e" + "\x91\xe9\x36\xe7\x2b\x98\xce\x73\x7e\x35\x3b\x7f\xb6\xc1\xf5\xbc" + "\xa4\xf3\xb0\xf3\x92\xce\x73\xbe\xae\xff\x3a\xcf\x1d\x3f\x43\x9d" + "\x47\xdb\x8b\xce\xa3\xfd\x85\xea\x3c\x17\x5e\x1f\x98\xce\x73\xc1" + "\xab\xff\xeb\x3f\x64\x6f\x6f\xb2\xf7\x79\x8b\x24\x7b\xb7\x5c\x18" + "\x98\xbc\xd2\xd2\x3c\x30\xd9\xbb\xb5\x48\x92\xbd\x5b\x8b\xbc\xcb" + "\xde\xdf\x7f\xda\xbb\xec\xfd\x43\x83\x24\x7b\x5f\x9a\xc0\xd6\xc6" + "\x4b\x77\xb3\xb5\xf1\xe2\x05\xdf\x65\xef\x8b\xb3\xfe\x21\x7b\xfb" + "\x22\x7b\x5f\x28\x95\x64\xef\x8b\xf7\x0d\x4c\xf6\xbe\x38\x5a\x2e" + "\x7b\xb7\x3d\xdd\x53\xf6\xbe\xb8\xb6\xff\xb2\xf7\xc5\x4f\x06\xc6" + "\xcb\x17\x77\xf5\x4f\xf6\xbe\x34\xcc\xb3\xec\xfd\xfd\x6e\xef\xb2" + "\x37\xbb\xd6\x53\x66\xfa\xe1\x13\x49\x66\xfa\x61\xc5\xcf\x5f\xf6" + "\xfe\x21\xdc\xb3\x7c\xf4\xc3\x7d\x4c\xf6\xbe\x14\x76\xf5\x65\xef" + "\x4b\x61\x9e\x65\xef\x1f\xb6\x32\x39\xe5\x92\xa6\xa7\xec\x0d\xf7" + "\x78\x94\xbd\x7f\x38\x21\xdc\x13\x26\x97\xbd\x59\x1b\x80\x27\x97" + "\xbd\xcb\xde\x96\x1c\x86\x2f\x96\x97\x19\xbe\x30\x9a\xf6\x94\xbd" + "\x2d\x0f\xf5\x2d\x7b\x33\x1e\xa2\xfd\xf4\x2a\x7b\x5b\x96\xf7\x94" + "\xbd\xbf\x2f\xf5\x2c\x7b\xb7\x4e\x97\xf8\xe8\xf2\x15\xb9\xec\x6d" + "\x39\xf8\xcb\x90\xbd\xbd\xf2\x56\xb8\x5c\xf6\xbe\xbc\xde\x77\xd9" + "\xfb\xf2\x21\xdf\x64\x6f\xe4\x39\x4f\xb2\x77\xeb\x30\x77\x9e\x93" + "\xcb\xde\xad\x0f\x7a\x96\xbd\x5b\x9f\x96\xcb\xde\xd8\xfe\xff\x63" + "\xef\x7b\xe0\x63\x38\xf3\xff\x9f\xcc\x2c\x42\x23\xd9\x68\xb8\x68" + "\x71\x4b\xe3\x44\x1b\x15\x2d\x4a\x4b\xab\x3d\xae\xd1\x13\x89\x1e" + "\x15\xa4\x6d\xb4\xe1\x42\x83\x45\xb0\x34\x92\x50\x7a\xaa\x11\x1b" + "\x0d\x47\x1b\x12\x3d\xee\x1b\xfd\xd2\xa6\x77\x7a\x17\xf7\x45\xa3" + "\x42\x43\xf3\x8f\x72\x17\x2d\xd7\xad\x0b\x0d\x0d\x5d\xb2\xb2\x9b" + "\x64\x77\xe7\xf7\x79\xe6\x99\xcd\xec\xec\xce\x6c\x76\x66\xc9\x45" + "\x7f\xbc\x5e\xf3\x8a\x9d\x79\xe6\x99\xe7\xf9\xbc\xdf\xcf\xe7\x79" + "\x7f\x9e\x79\xe6\x79\xc4\xb4\xf7\xcd\x25\x82\xfc\xdd\xb4\xf7\xcd" + "\x6c\xa1\xf6\x26\xe9\x78\xed\x5d\x3f\x94\xf8\xd0\x1f\x67\xca\xd7" + "\xde\xf5\xdd\xa5\xb5\x77\x7d\x6f\xa1\xf6\xbe\xc9\xbd\x57\xa8\x8f" + "\x22\xda\xbb\x5e\x45\xce\xff\x98\xe0\x7c\x9e\xd7\xde\xe4\x3c\xaf" + "\xbd\xeb\xe3\xbc\xd7\xde\x41\xed\x50\x7b\xab\x3d\x68\x6f\xf5\x5d" + "\xaa\xbd\x4d\xd7\x94\x69\x6f\x93\xe4\xf7\x6f\x9e\x35\xa0\x35\x9f" + "\xd7\x80\xd6\x7c\x69\x0d\x78\xeb\x90\x67\x0d\xd8\x58\xcb\x6b\x40" + "\xcb\x78\xe2\xa3\x2d\x83\x88\x8f\x36\x5f\x93\xaf\x01\xcd\xb3\xee" + "\x69\x40\x39\x1a\xb0\x3e\x99\xd7\x80\xe6\x21\xca\x34\xa0\x39\x52" + "\xa8\x01\x6d\xd1\xee\x1a\xd0\xbc\xd9\x7b\x0d\x68\x3e\xa0\x4c\x03" + "\x9a\x8b\xbc\xd3\x80\x96\x9e\xe2\x1a\xf0\x56\xb1\xb4\x06\x24\xd7" + "\xdc\xfb\xee\xc6\x03\x7c\xdf\xdd\xb8\xb6\xfd\x6b\xc0\xc6\x70\xf1" + "\x7e\xba\x71\x08\xd1\x80\x96\xd0\xdb\xaf\x01\x2d\xa1\xe2\x1a\xb0" + "\x91\x7b\xff\x6f\xe9\xe5\xae\x01\xe1\x1e\x51\x0d\xd8\x78\x8e\xbb" + "\x27\x54\xa8\x01\x49\x1e\xe0\x4f\x6e\x49\x6b\xc0\xa6\x6c\xe2\x5f" + "\x9a\x66\x12\xff\x42\x30\x75\xd7\x80\x4d\x23\x5b\xd7\x80\x84\x43" + "\x6c\x39\x25\x35\x60\xd3\x2a\x77\x0d\x78\xeb\xa0\xb8\x06\xb4\x4e" + "\xe3\x79\xd4\xdc\x28\xd4\x80\x4d\x27\xee\x0e\x0d\x28\xc9\xad\x70" + "\xa1\x06\x6c\xde\x26\x5f\x03\x36\x97\xcb\xd3\x80\x98\x73\x62\x1a" + "\xd0\xda\xd3\x95\x73\x42\x0d\x68\x1d\x26\xae\x01\xad\xd1\x42\x0d" + "\x88\xf3\x17\xd3\x80\xd6\xe5\x82\xfc\xdd\x34\xa0\x75\xb3\x50\x03" + "\x92\x74\xbc\x06\xb4\x8d\x20\x3e\xf4\xd6\x2c\xf9\x1a\xd0\xd6\x53" + "\x5a\x03\xda\xfa\x0a\x35\xa0\xd5\x44\xb4\x9e\x6d\x02\xd1\x80\x36" + "\xee\xfc\xad\x44\xe7\xf3\xbc\x06\x24\xe7\x79\x0d\x68\x8b\xf7\xa4" + "\x01\x3d\x6a\x07\x4a\x65\x6a\xd1\x0e\xf0\x7f\x67\xed\x70\x42\xa0" + "\x1d\x6c\x8d\x1e\xb5\x03\x45\x8d\x6a\xd1\x0e\x14\xda\xce\xb6\x6d" + "\x0a\xad\x62\xdb\x36\x85\xd8\xb5\xbb\x57\x46\x43\x1f\x0f\xda\x61" + "\xdf\xd5\x42\xa2\x1d\xae\x5a\xa8\x77\xaf\x73\xda\xa1\x0e\xf9\x67" + "\xce\xe7\xb4\xc3\x2b\x58\x3b\x30\x07\xb0\x76\x08\xc8\x05\x8d\xea" + "\xd8\x5b\x4b\x0b\x9a\xb5\x06\x7e\x43\xbb\x39\x0c\x79\x54\x80\xae" + "\xd4\xe3\xfb\xf1\x5a\x56\x90\x17\x6e\x4f\x58\xbb\xee\x5b\x61\xe8" + "\xc0\xee\xe1\x08\xba\xc2\x0e\xfa\x02\x6b\x0b\x56\x43\xd4\x73\x1a" + "\xa2\x9e\x68\x08\xbc\xae\x15\x5e\xcf\x2a\xb5\x86\xb1\xdb\x16\x87" + "\x77\x8b\x49\x04\xea\xdd\xc2\xfc\x85\xc4\xf8\x9b\x60\x63\x2d\x62" + "\x16\x87\x07\xe6\x2e\x42\x21\x1f\x70\x7a\x22\x70\x95\x5f\x20\x53" + "\x9f\xd4\x39\xd0\x44\x74\xe9\x3e\x7b\x29\xd1\xa5\x8b\x43\xbb\x80" + "\x0e\x8a\xd8\x71\x93\xd7\x11\xef\x61\x0d\xb1\x38\x5c\x63\x5a\x1c" + "\xde\xa7\xbe\x3e\xbc\x1f\xd6\x47\x42\x0d\x71\x10\xaf\xfd\xa3\xc2" + "\xdf\x70\x5a\x39\x5d\xca\xfc\x3e\x1c\xe1\x35\xf4\x40\x0f\xfb\x3d" + "\x0a\xba\x74\x40\x2f\x28\x7b\x39\x52\xdb\xea\xc3\x7b\xa5\x8f\x43" + "\x7d\x2a\x8b\x6c\x60\xa3\x5b\xb8\xfd\xab\xf1\xfa\x4a\x65\x09\xdf" + "\x20\xbc\x76\x10\xab\x4d\xf1\xfa\x41\x8b\xc3\x29\xc8\x73\xc4\xfb" + "\x8b\x9c\x74\x69\x77\x87\x2e\x65\xd6\x2a\xd3\xa5\xcc\x1a\x81\xa6" + "\xa0\x3a\xec\x74\xd7\x14\xcc\x15\xaf\x35\x05\x85\xba\x2a\xd2\x14" + "\x14\x0a\xf0\x4a\x53\x50\x68\x9e\xab\xa6\xd8\xc3\x6a\x0a\x9b\x15" + "\x73\x50\x5c\x53\x90\x6b\x6e\x7d\x01\x45\x75\x6d\xe9\x0b\x28\xbf" + "\x73\xed\x5e\x53\x50\x7e\xa9\xa2\x7e\x9f\xf2\x5b\xcb\x6a\x0a\x0a" + "\x25\xdf\x76\x4d\x01\x79\x8a\x6a\x0a\xca\x8f\xbc\xff\xa2\x90\xd6" + "\x4d\x53\xe0\x7b\xc4\x34\x05\x45\x0d\xe2\xee\x49\x16\x68\x0a\x2e" + "\x0f\xf0\x33\xe3\x25\x35\x05\x45\x5d\x22\x7e\x87\xfa\x8c\x68\x0a" + "\x82\xa9\x9b\xa6\xa0\xa8\x0d\xad\x6a\x0a\x8e\x43\x6c\x39\xa5\x34" + "\x05\x45\x9d\x75\xd7\x14\x36\x8b\xa8\xa6\xa0\x54\xfb\x78\x1e\xa9" + "\xa2\x05\x9a\x82\xa2\x7b\xdf\x15\x9a\x42\x9a\x5b\xa9\x02\x4d\x41" + "\xd1\xd7\x64\x6b\x0a\x4a\xd5\x57\x96\xa6\x60\x39\x27\xa2\x29\x28" + "\xd5\x3c\x57\xce\x09\x34\x05\xa5\x7a\x47\x54\x53\x50\xaa\x9d\x02" + "\x4d\xc1\xe6\x2f\xa2\x29\x28\x55\xb9\x20\x7f\x57\x4d\x41\xa9\xae" + "\x08\x34\x05\x97\xae\x45\x53\x50\x1d\x32\xb9\xb8\x6c\xa7\x6c\x4d" + "\x41\x75\x98\x27\xa9\x29\xa8\x0e\x4b\x04\x9a\x82\xea\x10\xc5\x6a" + "\x07\xaa\x43\x3e\xab\x29\xa8\x0e\xf1\x9c\x2e\xc9\x77\x3e\xcf\x6b" + "\x0a\x72\xbe\x45\x53\xac\xef\x50\xe8\xfd\xb8\xd2\xbd\x6f\x26\xdb" + "\x64\x5c\x89\xea\x34\x4e\x51\xff\x4d\x75\x1a\x7b\xef\x9b\x49\x99" + "\xef\x74\xd7\x77\xe0\xe7\x53\x52\xfe\x87\x94\xe9\x15\x7f\xc9\xfd" + "\xcf\xef\xcd\x1f\x96\xb2\x7b\xa7\x4c\xde\xee\x5d\x86\x29\xb3\x7b" + "\x17\xe9\xf5\x3f\xee\xcd\x61\x90\xb0\x7b\x67\x15\x6f\xf7\xfb\xf6" + "\x29\xb3\xfb\x7d\x7b\x15\x8d\x5f\x53\xf7\xa7\xf2\x31\xe8\xfd\xa9" + "\x92\x31\x28\x15\xb0\xd2\x73\x0c\xaa\x2e\xe1\x63\xd0\xa0\xfe\x44" + "\x0b\x06\x75\x26\x31\x68\x20\x3b\x6e\x93\x86\x63\xd0\x0f\x1f\xd2" + "\x7f\xb2\xa8\x88\x62\x3e\xbc\xac\xd9\xb7\xc8\x42\xe1\x35\xa5\xad" + "\x38\x06\x05\x3b\x6f\x68\xc2\x31\x68\x09\x19\xbf\xa6\x02\x9f\xad" + "\xa8\xb5\x20\x88\x71\x0c\x24\xee\x09\x28\x07\x2e\xd0\x95\x16\x0b" + "\x9b\x06\x5f\x3b\x7c\xb3\x88\xd2\x37\xb9\x8c\x6d\x43\x9e\x78\xad" + "\x5f\xe7\xb1\x6d\x3c\xa6\xdd\xb8\xf3\x52\x82\x63\x5c\xdb\xb6\x39" + "\xb4\xb8\xb5\xb1\x6d\xd7\x71\xed\xed\x4d\x28\xe4\xae\x1d\xdb\x5e" + "\xdf\x25\xb5\x65\x6c\x9b\x0a\xec\xaa\x68\x6c\x9b\x0a\x0c\x10\xc6" + "\xa1\x21\x03\xdd\xe2\x50\x2a\x70\xa1\xf7\x71\x68\xe0\x66\x65\x3c" + "\x0f\xcc\xf1\x2e\x0e\x0d\xbc\x25\x1a\x87\x52\x01\x19\x69\x52\x71" + "\x28\x77\xcd\x3d\x7e\x50\x6f\xe6\xe3\x07\xf5\xcc\xf6\x1f\x87\xaa" + "\x55\xe2\xb1\x82\xba\x2b\x89\x43\x03\x4d\xb7\x3f\x0e\x0d\x34\x89" + "\xc7\xa1\xea\x55\x44\xb3\x07\x5a\xdc\xe3\x50\xb8\x47\x34\x0e\x55" + "\x7f\xc6\xdd\x63\x12\xc6\xa1\x24\x0f\xf0\x35\xa7\xa4\xe3\xd0\xe0" + "\x79\xc4\xf7\x04\x8f\x26\xbe\x87\x60\xea\x1e\x87\x06\x77\x6f\x3d" + "\x0e\x25\x1c\x62\xcb\x29\x19\x87\x06\xbf\xec\x16\x87\x52\x01\xa9" + "\xe2\x71\xe8\xfd\xc3\x78\x1e\x75\x3b\x2b\x8c\x43\x83\x77\xdf\x1d" + "\x71\xa8\x24\xb7\x54\xc2\x38\xb4\xdb\x12\xf9\x71\x68\xb7\x3d\xf2" + "\xe2\x50\xcc\x39\xb1\x38\xb4\xdb\x2d\x57\xce\x09\xe3\xd0\xfb\x83" + "\xc5\xe3\xd0\xfb\x07\x0a\xe3\x50\x9c\xbf\x58\x1c\x7a\xff\x14\x41" + "\xfe\x6e\x71\xe8\xfd\x0b\x85\x71\x28\x49\xc7\xc7\xa1\x21\x21\x5c" + "\x9f\xd6\x5f\x7e\x1c\x7a\xff\x2d\xe9\x38\xf4\x7e\x9b\x30\x0e\xbd" + "\xbf\x8a\xc4\x9b\x21\xe1\x24\x0e\xbd\xbf\x86\x9c\x0f\x08\x73\x3e" + "\xdf\x12\x87\x72\xe7\xf9\x38\x34\x64\xc4\xbd\xef\x29\xdb\x5b\x1c" + "\xda\xbd\x5c\x59\x1c\xda\xbd\xec\x5e\x3c\x24\x57\x97\x87\x4c\xe0" + "\x75\xf9\x2f\x94\xad\xff\x40\xfd\xe2\xbf\x1c\xff\xdf\x8d\xf1\x50" + "\x8f\x10\xde\xee\xa1\x0a\xe3\xff\x50\xc9\xf8\xdf\x73\x3c\xa4\xc9" + "\xe4\xe3\x21\x4d\xa6\x74\x3c\xd4\x73\x83\xe7\x78\xa8\xf7\x19\x3e" + "\x1e\xea\x35\x8c\x68\x92\x5e\x3d\x89\x26\x79\xf0\x9c\xfc\x78\xe8" + "\xc1\x49\xc2\x78\xa8\xe7\x85\x7b\xf1\x90\xd2\x78\xe8\x17\x99\x7c" + "\x3c\xf4\x60\x6f\x65\xf1\xd0\x83\xbd\x84\xf1\x50\xdf\x91\xee\xf1" + "\xd0\x83\xab\xbc\x8f\x87\x1e\xdc\xad\x8c\xe7\x0f\xee\xf2\x2e\x1e" + "\xea\xd5\x41\x3c\x1e\xea\xa9\x97\x8e\x87\xc8\x35\x77\x1d\xdb\x7b" + "\x37\xaf\x63\x7b\x2f\x6c\xff\xf1\x50\xef\x10\x71\xcd\xda\xbb\x37" + "\x89\x87\x7a\xa9\x6e\x7f\x3c\xd4\x4b\x25\x1e\x0f\xf5\xce\x26\xda" + "\xb1\x97\xbf\x7b\x3c\x04\xf7\x88\xc6\x43\xbd\x8f\x71\xf7\xa8\x84" + "\xf1\x10\xc9\x03\x7c\xcd\xf7\xd2\xf1\x50\x9f\x95\xc4\xf7\xf4\x89" + "\x26\xbe\x87\x60\xea\x1e\x0f\xf5\xe9\xdf\x7a\x3c\x44\x38\xc4\x96" + "\x53\x32\x1e\xea\x33\xcf\x3d\x1e\xea\x99\x29\x1e\x0f\x69\xf8\x75" + "\x8a\xa8\x5f\x5e\x12\xc6\x43\x7d\x3e\xbb\x3b\xe2\x21\x49\x6e\x85" + "\x08\xe3\xa1\x5f\xae\x95\x1f\x0f\xfd\xf2\x80\xbc\x78\x08\x73\x4e" + "\x2c\x1e\xd2\x74\x70\xe5\x9c\x30\x1e\xd2\xf4\x15\x8f\x87\x34\x23" + "\x85\xf1\x10\xce\x5f\x2c\x1e\xd2\xcc\x12\xe4\xef\x16\x0f\x69\x56" + "\x09\xe3\x21\x92\x8e\x8f\x87\xfa\x86\x71\x7d\xda\x30\xf9\xf1\x50" + "\xdf\x0e\xd2\xf1\x50\xdf\xae\xc2\x78\x48\x63\x20\x71\x4f\xdf\x11" + "\x24\x1e\xd2\x98\xc8\xf9\x9e\x43\x9d\xcf\xf3\xf1\x10\x39\xcf\xc7" + "\x43\x7d\xa3\xee\x7d\x6b\xd9\xde\xe2\xa1\x7e\x17\x94\xc5\x43\xfd" + "\xa4\xd7\x3f\xbf\xa7\xcb\x25\x74\x79\xdf\x78\x5e\x97\x87\x4d\x51" + "\xa6\x57\xc2\x26\x2b\xd3\xe5\x11\x61\xbc\x2e\x8f\x08\x93\xd6\xe5" + "\xfd\xfb\x7b\xd6\xe5\x03\x93\x79\x5d\x3e\xa0\x9c\xf4\x8d\x03\x3e" + "\x25\x7d\xe3\x80\x85\xf2\x75\xf9\xaf\xae\x08\x75\x79\xff\x25\xf7" + "\x74\xb9\x52\x5d\xfe\x50\x18\xaf\xcb\x7f\xf5\x99\x32\x5d\xfe\xab" + "\xfd\x42\x5d\x1e\x71\xca\x5d\x97\x0f\xe8\xe9\xbd\x2e\x1f\x30\x5a" + "\x19\xcf\x07\x8c\xf2\x4e\x97\x0f\xd8\x2e\xae\xcb\xfb\x87\x4b\xeb" + "\x72\x72\xcd\x5d\x4f\x0d\x1c\xcd\xeb\xa9\x81\x9d\xdb\xbf\x2e\x0f" + "\xdf\x2b\xae\x9d\xc2\x3f\x23\xba\x7c\x40\xee\xed\xd7\xe5\x03\x72" + "\xc5\x75\xf9\xc0\x81\x44\xc3\x0c\xc8\x77\xd7\xe5\x70\x8f\xa8\x2e" + "\x1f\xf8\x32\x77\x4f\xae\x50\x97\x93\x3c\xc0\xd7\x2c\x97\xd6\xe5" + "\x0f\x77\x27\xbe\x67\xe0\x25\xe2\x7b\x08\xa6\xee\xba\x7c\xe0\xa1" + "\xd6\x75\x39\xe1\x10\x5b\x4e\x49\x5d\xfe\x70\x07\x77\x5d\xde\x3f" + "\x4c\x5c\x97\x3f\x72\x81\xe7\xd1\x23\x2b\x85\xba\xfc\xe1\xe8\xbb" + "\x43\x97\x4b\x72\x6b\xaf\x50\x97\x3f\xd2\x5b\xbe\x2e\x7f\x64\x92" + "\x3c\x5d\x8e\x39\x27\xa6\xcb\x1f\xd9\xee\xca\x39\xa1\x2e\x7f\xe4" + "\x80\xb8\x2e\x7f\xe4\x94\x50\x97\xe3\xfc\xc5\x74\xf9\x23\x36\x41" + "\xfe\x6e\xba\x3c\xa2\xa7\x50\x97\x93\x74\xbc\x2e\x8f\x38\x48\x7c" + "\x68\x58\xb9\x7c\x5d\x1e\xb1\x5d\x5a\x97\x47\xec\x16\xea\xf2\x08" + "\x1d\xd1\xdf\x11\x55\x44\x97\x47\x64\x92\xf3\x61\x65\xce\xe7\x79" + "\x5d\x4e\xce\xf3\xba\x3c\xc2\x70\xef\x3b\xcc\xf6\xa6\xcb\x1f\x5d" + "\xa2\x4c\x97\x3f\x9a\xa2\x4c\x1f\x0e\x1f\xcb\xeb\xc3\xe1\x63\xa5" + "\xf5\xe1\xe0\x71\x9e\xf5\xe1\xe3\x99\xbc\x3e\x1c\x72\x8d\xf8\xe8" + "\x21\xa7\x88\x8f\x1e\x92\x2d\x5f\x1f\x0e\xe9\x2c\xd4\x87\x83\x37" + "\xdf\xd3\x87\x4a\xf5\x61\x84\x89\xd7\x87\x91\x67\x95\xe9\xc3\xc8" + "\x33\x42\x7d\x38\xfc\x86\xbb\x3e\x1c\x32\xd2\x7b\x7d\x38\xe4\x65" + "\x65\xfa\x70\x48\xbc\x77\xfa\x70\xc8\x21\x71\x7d\x38\x38\x4a\x5a" + "\x1f\x92\x6b\xee\xfd\xfa\xe3\x2f\xf3\xfd\xfa\xe3\x03\xdb\xbf\x3e" + "\x7c\xac\x4c\xbc\x0f\x7f\xec\x2c\xd1\x87\x43\x0e\xde\x7e\x7d\x38" + "\xe4\xa0\xb8\x3e\x7c\x7c\x3c\xe9\x4b\x87\x14\xbb\xeb\x43\xb8\x47" + "\x54\x1f\x3e\xbe\x92\xbb\xe7\xa0\x50\x1f\x92\x3c\xc0\xd7\x6c\x93" + "\xd6\x87\x43\xb9\x77\x46\x43\x3b\x10\xdf\x43\x30\x75\xd7\x87\x8f" + "\x5f\x68\x5d\x1f\x12\x0e\xb1\xe5\x94\xd4\x87\x43\xfb\xbb\xeb\xc3" + "\xc1\x63\xc5\xf5\xe1\x30\x1b\xcf\xa3\x61\xdb\x85\xfa\x70\xe8\xbc" + "\xbb\x43\x1f\x4a\x72\xab\x4c\xa8\x0f\x87\x8d\x96\xaf\x0f\x87\x2d" + "\x94\xa7\x0f\x31\xe7\xc4\xf4\xe1\xb0\x43\xae\x9c\x13\xea\xc3\x61" + "\xe7\xc4\xf5\xe1\xb0\x1b\x42\x7d\x88\xf3\x17\xd3\x87\xc3\x7b\x0b" + "\xf2\x77\xd3\x87\xc3\x47\x0a\xf5\x21\x49\xc7\xeb\xc3\xe1\xe7\x89" + "\x0f\x7d\xf4\x9a\x7c\x7d\x38\xfc\x90\xb4\x3e\x1c\x7e\x4c\xa8\x0f" + "\x87\x6f\x25\x3a\x70\xb8\x91\xe8\xc3\xe1\x7b\xc9\xf9\x47\xeb\x9c" + "\xcf\xf3\xfa\x90\x9c\xe7\xf5\xe1\x13\x48\xf9\x37\x9a\x4f\xef\xe7" + "\x75\xc5\xd3\xfb\xa5\x75\xc5\x13\xdb\x3d\xeb\x8a\xa7\xac\xbc\xae" + "\x78\xf2\x65\xd2\xb6\x9f\x7c\x96\xb4\xed\x27\xd9\xf5\x29\x57\x96" + "\xe3\x6f\x34\x1f\xd2\x7f\x7c\xbd\x90\xd5\x15\x9f\xcc\xb7\x50\xa0" + "\xf3\x54\x76\xac\x2b\x40\xcf\x65\x2e\xc5\xba\xa2\x86\x7c\xa3\x49" + "\x8d\x5c\x5e\xae\x73\xd6\x15\x4f\xdc\x60\xbf\xd7\xc4\xda\xc2\x64" + "\x61\xd3\xe1\xeb\x62\xdf\x6f\x1e\x9a\xcf\x7d\xbf\x09\x79\x3b\x7f" + "\xb7\xc9\x7e\xcb\x79\x1d\x74\xc7\x6b\x80\x85\x93\xee\xb8\xf7\xfd" + "\x26\xee\xe7\x47\x2a\xfc\xfe\x63\xe4\x58\xa1\xde\x78\x66\xa6\xbb" + "\xde\x18\xb9\xc7\x7b\xbd\x31\xb2\x5c\x99\xde\x18\x59\xe6\x9d\xde" + "\x78\x72\x90\xb8\xde\x78\x22\x1f\xf3\x53\x5c\x6f\x90\x6b\xee\xfd" + "\xc4\x53\xe5\x7c\x3f\xf1\xd4\xb6\xf6\xaf\x37\x9e\x1a\x25\xde\x27" + "\x3c\x35\x8e\xe8\x8d\x27\x23\x6e\xbf\xde\x78\x32\x42\x5c\x6f\x3c" + "\x75\x80\xf8\xe6\x27\x23\xdd\xf5\x06\xdc\x23\xaa\x37\x9e\xba\xc6" + "\xdd\x13\x21\xd4\x1b\x24\x8f\x8b\xd4\xa8\xce\xd2\x7a\x63\xd4\x6e" + "\xe2\x93\x46\x2d\x21\x3e\x89\x60\xea\xae\x37\x46\x45\xb7\xae\x37" + "\x08\x87\xd8\x72\x4a\xea\x8d\x51\x9b\xdd\xf5\xc6\x13\xb9\xe2\x7a" + "\xe3\xe9\x79\x3c\x8f\x9e\xee\x2a\xd4\x1b\xa3\x2e\xdc\x1d\x7a\x43" + "\x92\x5b\xa3\x84\x7a\x63\xf4\x3e\xf9\x7a\x63\xf4\xf7\xf2\xf4\x06" + "\xe6\x9c\x98\xde\x78\x7a\x90\x2b\xe7\x84\x7a\xe3\xe9\xf1\xe2\x7a" + "\xe3\xe9\x99\x42\xbd\x81\xf3\x17\xd3\x1b\x4f\x6f\x10\xe4\xef\xa6" + "\x37\x9e\xde\x23\xd4\x1b\x24\x1d\xaf\x37\x9e\x99\xc0\xf5\x75\xe3" + "\xe4\xeb\x8d\x67\x06\x49\xeb\x8d\x67\x86\x09\xf5\xc6\x33\xfe\x44" + "\x57\x3c\x93\x40\xf4\xc6\x33\xbd\xc8\xf9\x27\xc6\x3a\x9f\xe7\xf5" + "\x06\x39\xcf\xeb\x8d\x67\xb4\x5e\x8e\x47\x95\xc8\xf9\x7e\x73\x5f" + "\x83\x70\x3c\xca\x31\x16\x65\x0d\xaf\x4d\x69\x19\x8f\x82\x7e\xfe" + "\x55\xa3\xf4\x78\x14\xee\xb7\xf9\xf1\xa8\x0b\xac\x9f\xe2\xc7\xa3" + "\x0c\xec\x78\x14\x1e\x8b\x82\x58\xbd\x65\x2c\xca\xbe\xcc\xfd\xdb" + "\xcd\x7d\x76\xf9\x63\x51\xaf\x2c\x54\xa3\x1d\x6c\xdf\x5d\xac\x23" + "\x63\x51\xd5\x2d\x63\x51\xb8\xcf\xb6\x99\xdd\xc7\xa2\x70\x5f\xcd" + "\x8f\x45\x7d\xa3\x70\x2c\xea\x59\x3f\x65\x7d\x37\x5e\x3a\xe3\xde" + "\xb7\x9b\xf2\xde\x11\x3f\xb3\x86\x7f\x47\xfc\x9c\xb2\xfd\xff\xa8" + "\xe7\x24\xf7\xff\xbb\x37\x57\x59\xca\xee\xcf\x46\xf1\x76\xff\xf5" + "\x0d\x65\x76\xff\xb5\xf1\xde\x9c\x08\xb9\x76\x7f\xae\x98\xb7\xfb" + "\xb8\x39\xca\xec\x3e\x2e\x49\xd9\x98\x77\x74\x3c\x1f\x9b\x46\xc7" + "\x3b\xc7\xa6\xa5\x63\x9d\x63\xd3\xdf\x8c\xf4\x1c\x9b\xbe\xb0\x8b" + "\x8f\x4d\xc7\x77\x20\x3a\x30\xea\x0a\xd1\x81\x51\x6c\x9f\xbc\xf2" + "\x59\xc4\xc6\xa4\x56\x1c\x9f\xce\xb5\x50\x1f\x5f\x2d\xa6\xac\xab" + "\x49\x5c\x5a\x69\x2d\x43\xe5\x46\x0b\x7a\x77\x29\x52\xbd\x73\x1d" + "\xa9\x3e\xba\x69\xa1\x82\x92\x91\x3f\xf4\x0b\xa0\x9b\xca\x40\x47" + "\x6c\x47\xda\x34\x1c\xb3\x46\xf5\xad\xd4\x1a\x9d\x62\xd6\xdf\xec" + "\xe4\xe3\x55\x48\xa7\xb5\xa0\xcf\xe7\x16\x53\x38\x2e\x6d\xde\x1c" + "\x5a\xdc\x3c\xb0\x56\xcb\xae\x31\xe4\x3c\x2e\x0e\xcf\xd6\xbc\x22" + "\x1c\x17\x6f\xda\x1c\x5a\xd2\xb8\xa7\x36\x85\x5d\xbb\xb0\x2f\x3f" + "\x3e\xee\xed\xb8\xf8\x07\x4d\x28\xc4\xb1\x76\x21\xee\x07\xef\xbe" + "\x71\xf1\xb1\x23\xf8\x71\xf1\xe7\xaf\x29\x1b\x17\x7f\xbe\x4e\x18" + "\xa7\x4e\xec\xec\x1e\xa7\x46\x4d\xf2\x3e\x4e\x8d\x5a\xa2\xac\x2d" + "\x44\xa5\x78\x17\xa7\x46\x9d\x75\x8d\x53\x0b\xd2\x70\x9c\xfa\x9b" + "\x51\x98\xab\xe2\x71\x2a\xb9\xe6\x1e\x5f\xbc\xb0\x84\x8f\x2f\x5e" + "\x78\xb6\xfd\xc7\xa9\xe3\x6b\xc4\x63\x89\xf1\xd7\x48\x9c\x1a\x75" + "\xe6\xf6\xc7\xa9\x51\x67\xc4\xe3\xd4\x17\x66\x12\x4d\x1f\x75\xc6" + "\x11\x73\xf2\x71\x2a\xdc\x23\x1a\xa7\xbe\xb0\xd9\xf5\x1e\x12\xa7" + "\x46\x55\x93\x38\xf5\x85\x4f\xa5\xe3\xd4\xdf\x46\x13\xff\xf4\xdb" + "\xde\xc4\x3f\x11\x4c\xdd\xe3\xd4\x17\x6e\xb5\x1e\xa7\x12\x0e\xb1" + "\xe5\x94\x8c\x53\x7f\x3b\xda\x3d\x4e\xfd\xcd\x08\xf1\x38\x35\xba" + "\x3b\xcf\xa3\x09\x9f\x09\xe3\xd4\xdf\xae\xbd\x3b\xe2\x54\x49\x6e" + "\xd5\x08\xe3\xd4\x09\x53\xe4\xc7\xa9\x13\xde\x91\x17\xa7\x62\xce" + "\x89\xc5\xa9\x13\xce\x72\xfc\xa9\x16\x8f\x53\x27\xdc\x10\x8f\x53" + "\xa3\x3b\x0b\xe3\x54\x9c\xbf\x58\x9c\x1a\x3d\x4c\x90\xbf\x5b\x9c" + "\x1a\x3d\x49\x18\xa7\x92\x74\x7c\x9c\x1a\x6d\x22\x3e\x74\xdc\xf7" + "\xf2\xe3\xd4\xe8\xb3\xd2\x71\x6a\xf4\x05\x61\x9c\x1a\x5d\x48\xe2" + "\xd1\x89\xfe\x24\x4e\x8d\x2e\x21\xe7\xc7\x19\x9c\xcf\xf3\x71\x2a" + "\x39\xcf\xc7\xa9\x13\x43\xbd\x8c\x53\x4b\x6f\x53\x9c\xaa\xbb\xbb" + "\xe2\xd4\x2f\x46\xb4\x6d\x9c\x1a\xb3\x47\x59\x9c\x1a\x53\xe0\x85" + "\x6e\x2f\x69\x45\xb7\xa7\xfc\xff\xa5\xdb\x27\x46\xf0\xba\x7d\x52" + "\x5f\x65\x5a\x65\x92\xe6\xbf\x69\xf7\xbb\xcf\xe6\x31\xfc\x5e\x3d" + "\xd4\x8b\x0a\xd7\xff\x78\x31\xe7\x5e\x8c\x2a\xd7\xee\x93\x92\x78" + "\xbb\x4f\x56\xb8\xfe\xe7\xe4\x00\x65\x31\x6a\xbc\xd3\xbc\xfd\x78" + "\xc1\xbc\xfd\xe3\x82\xf7\xa7\x93\x2f\x78\x8e\x51\xa7\x39\xcd\xdb" + "\x9f\xca\xcd\xdb\x9f\xca\xcd\xdb\x9f\xca\xce\xdb\x4f\xfd\x8c\xc4" + "\xa8\x0d\x38\x46\xbd\x0c\x31\xea\xec\x04\xca\xca\xad\x8d\x8f\xe7" + "\x5a\x95\x43\x9c\x89\xe3\xd2\x4a\x1d\xfc\x3f\xc5\x88\xde\x5d\x84" + "\x54\xeb\x21\xbe\xdc\x03\xfd\xd5\x9e\xa5\x46\x6a\xdd\x5c\xf0\xf5" + "\xd5\xfb\x50\x50\x12\xc4\xae\x37\x71\xec\x5a\x02\x71\xe9\x5a\x2e" + "\x76\x7d\xe9\x4a\x65\x8a\x73\xec\x3a\xe5\x65\x36\x76\x35\x92\x79" + "\x5c\x95\x29\x10\xbb\xc2\xf3\xf0\x5a\xfb\xce\xb1\x6b\x23\xc4\xa6" + "\x4d\x10\x9b\xea\xaf\xba\xc4\xb1\xb3\xdd\xe3\xd8\xc6\xee\xa1\xa5" + "\x96\x81\xb5\x3a\x1c\xc7\x36\xec\xfc\xff\x31\x8e\x7d\xf1\x3c\x1f" + "\xc7\xbe\xa4\x70\xfe\xff\x4b\x2e\xf3\xff\xe3\x45\xe6\xff\x4f\x95" + "\x31\xff\x7f\xaa\xc2\xf9\xff\x53\xbd\x9c\xff\x3f\xd5\x6d\xfe\xff" + "\x9f\xd9\xf7\xad\x93\x0d\x98\xcf\xe2\x71\x2c\xb9\xe6\x1e\x7f\x4c" + "\x73\x9a\xff\x3f\xed\x2e\x98\xff\x1f\x27\x31\x47\x3b\x8e\x9b\xff" + "\x3f\xf5\x0e\xcc\xff\x9f\x2a\x31\xff\x7f\x1a\x37\xff\x7f\x6a\xae" + "\x7b\x1c\x3b\x55\x62\xfe\xff\xb4\x97\x5d\xef\x21\x71\xec\x54\x6e" + "\xfe\xff\x34\x0f\xf3\xff\xa7\x73\xf3\xff\xa7\x71\xf3\xff\x09\xa6" + "\xee\x71\xec\x34\x2f\xe6\xff\x4f\xe5\xe6\xff\x4f\xf5\x30\xff\x7f" + "\xba\xc8\xfc\xff\xc9\xe7\xc5\xe3\xd8\x19\x4e\xf3\xff\x67\xb8\xcc" + "\xff\x9f\x7e\x97\xcc\xff\x97\xe4\x96\xcb\xfc\xff\x19\x0a\xe6\xff" + "\xcf\x90\x39\xff\x7f\xaa\xc4\xfc\xff\x19\xdc\xfc\xff\xa9\x12\xf3" + "\xff\x67\x48\xcc\xff\x9f\xe1\x32\xff\x7f\xaa\xc4\xfc\xff\x19\x36" + "\x41\xfe\x6e\x71\x6c\xbc\xcb\xfc\xff\xa9\x2e\xf3\xff\xe3\xb9\xf9" + "\xff\x93\xd7\xca\x8f\x63\xe3\x3d\xcc\xff\x8f\x77\x99\xff\x1f\xcf" + "\xcd\xff\x8f\xe7\xe6\xff\xc7\x73\xf3\xff\x27\xaf\x71\x3e\xcf\xc7" + "\xb1\xe4\x3c\x1f\xc7\xc6\x7b\x3b\xff\xbf\xc4\xc7\x75\x8a\x52\xda" + "\x7e\xfe\xff\xed\x5a\xa7\xc8\xf1\xce\xb5\xad\xe6\xff\xbf\xa2\x70" + "\xfe\xff\x2b\x92\xf3\xff\xef\xc5\x54\x62\xda\x3e\xde\xc4\x6b\xfb" + "\x57\x95\xed\x7f\x4a\xbd\x2a\xb9\xff\xe9\xbd\x98\x4a\xca\xee\xaf" + "\x1c\xe4\xed\x3e\x73\xa6\x32\xbb\xcf\x4c\x50\x16\x53\xcd\x99\xcc" + "\xc7\x54\x73\x26\x4b\xbf\xf7\x7b\x6d\x88\xe7\x98\x6a\x76\x2e\x1f" + "\x53\x25\xda\x88\x1e\x49\x24\x7b\xb2\x53\x89\x3b\x6f\xdf\x7b\xbf" + "\xc4\x9e\xc2\xf7\x7e\xaf\x6d\xbb\xf7\xde\xef\x76\xc4\x4b\x09\x91" + "\x7c\xbc\xf4\xfa\x25\x65\xf1\xd2\xeb\x35\xc2\x78\x69\xae\x9f\x7b" + "\xbc\x94\x38\xde\xfb\x78\x29\x71\x9e\xb2\xb6\x90\x98\xec\x5d\xbc" + "\x94\x58\x2e\xfe\xde\xef\xb5\xa1\xd2\xef\xfd\xc8\x35\x77\x9d\x3b" + "\xdb\x69\x5e\xe1\xec\x91\xed\x3f\x5e\x9a\x75\x5e\x5c\xd3\xce\xba" + "\x44\xe2\xa5\xc4\xb2\xdb\x1f\x2f\x25\x96\x89\xc7\x4b\xb3\xa7\x11" + "\x6d\x99\x58\xe6\x1e\x2f\xc1\x3d\xa2\xf1\xd2\xec\x0d\xae\xf7\x90" + "\x78\x29\xb1\x8a\xc4\x4b\xb3\xf7\x48\xc7\x4b\xbf\x27\xfb\x62\x53" + "\xbf\xef\x4e\xfc\x13\xc1\xd4\x3d\x5e\x9a\x7d\xad\xf5\x78\x89\x70" + "\x88\x2d\xa7\x64\xbc\xf4\xfb\x61\xee\xf1\xd2\x6b\x91\xe2\xf1\xd2" + "\x1c\xa7\x7d\x6a\x92\xf6\x09\xe3\xa5\xdf\xaf\xbc\x3b\xe2\x25\x49" + "\x6e\x9d\x17\xc6\x4b\x49\xd1\xf2\xe3\xa5\xa4\x55\xf2\xe2\x25\xcc" + "\x39\xb1\x78\x29\x89\xdb\xff\x83\xf0\xc5\x3d\x5e\x4a\xba\x22\x1e" + "\x2f\xcd\xf1\x13\xc6\x4b\x38\x7f\xb1\x78\x69\xce\x20\x41\xfe\x6e" + "\xf1\xd2\x9c\xf1\xc2\x78\x89\xa4\xe3\xe3\xa5\x39\x75\xc4\x87\xce" + "\x3c\x27\x3f\x5e\x9a\x53\x2e\x1d\x2f\xcd\x39\x2b\x8c\x97\xe6\x14" + "\x90\xb8\x68\x2e\x22\xf1\xd2\x9c\x83\xe4\xfc\xcc\x6a\xe7\xf3\x7c" + "\xbc\x44\xce\xf3\xf1\xd2\x5c\xb5\xf7\xf1\x92\xf7\xeb\x18\xfd\xf7" + "\xe7\xa7\x6a\xee\xd2\xf9\xa9\x6f\xec\x54\x16\x2b\xbd\x91\x7f\x4f" + "\xb7\xcb\xd5\xed\x73\xc3\x78\xdd\x3e\xaf\xa7\x32\xad\x32\x2f\x54" + "\x99\x6e\x5f\x12\xc0\xeb\xf6\x25\x01\xd2\xba\x7d\xde\x15\xcf\xba" + "\x7d\xd1\x64\x5e\xb7\x6b\x3f\x23\xfd\xa2\x76\x1b\xe9\x17\xb5\xd3" + "\x6e\x9f\x6e\x5f\x70\x4a\xa8\xdb\xe7\x4f\xba\xa7\xdb\x6f\x87\x6e" + "\x7f\xa3\x96\xd7\xed\x0b\xb6\x2b\xd3\xed\x0b\x72\x85\xba\x7d\xc9" + "\x01\x77\xdd\xae\xf5\xf3\x5e\xb7\x6b\xfb\x2b\x6b\x0b\xda\x30\xef" + "\x74\xbb\x76\xad\xb8\x6e\x9f\x57\x27\xad\xdb\xc9\x35\x77\xbd\xb5" + "\xa8\x3f\xaf\xb7\x16\xde\x68\xff\xba\x7d\x61\x8e\xb8\xb6\x5a\xb8" + "\x9d\xe8\x76\xed\x9a\xdb\xaf\xdb\xb5\x6b\xc4\x75\xfb\xa2\x60\xa2" + "\x71\xb4\x6b\xdc\x75\x3b\xdc\x23\xaa\xdb\x17\x8d\x73\xbd\x87\xe8" + "\x76\xed\x3a\xa2\xdb\x17\xcd\x94\xd6\xed\x8b\xb8\x71\x85\x45\xe5" + "\xc4\x3f\x11\x4c\xdd\x75\xfb\xa2\xdd\xad\xeb\x76\xc2\x21\xb6\x9c" + "\x92\xba\x7d\xd1\x35\x77\xdd\x3e\xaf\x56\x5c\xb7\xa7\x1c\xe3\x79" + "\x94\x32\x4b\xa8\xdb\x17\x0f\xbb\x3b\x74\xbb\x24\xb7\x72\x84\xba" + "\x3d\xa5\x83\x7c\xdd\x9e\x32\x52\x9e\x6e\xc7\x9c\x13\xd3\xed\x29" + "\x6b\x39\xfe\xac\x13\xd7\xed\x29\x3b\xc5\x75\x7b\xca\x01\xa1\x6e" + "\xc7\xf9\x8b\xe9\xf6\x94\x4b\x82\xfc\xdd\x74\xfb\x12\x3f\xa1\x6e" + "\x27\xe9\x78\xdd\xbe\x64\x17\xf1\xa1\xf3\xb2\xe5\xeb\xf6\x25\x6b" + "\xa5\x75\xfb\x92\x0d\x42\xdd\xbe\x24\x81\xe8\xf3\x25\x45\x44\xb7" + "\x2f\x49\x21\xe7\xe7\xe9\x9d\xcf\xf3\xba\x9d\x9c\xe7\x75\xfb\x92" + "\xd2\x7b\xeb\x1c\xb5\xb7\x75\x8e\x96\xbd\xac\x4c\xbb\x2f\x8b\x57" + "\xa6\x21\xd3\x23\x78\x0d\x99\x1e\xe1\xac\x21\x85\xeb\x11\xe8\x06" + "\x79\xd6\x90\xa9\x29\xbc\x86\x5c\x71\x96\xf8\xe8\x15\x07\x88\x8f" + "\x5e\xc1\xbe\xb7\x96\xb7\xce\xd1\xf2\x1b\xc2\x75\x8e\x74\x2b\xef" + "\xad\x73\xa4\x54\x1f\x2e\x71\x9a\x07\xb3\xfc\x90\x32\x7d\xb8\xfc" + "\xa0\x50\x1f\xa6\x9f\x73\xd7\x87\x2b\xfa\x7a\xaf\x0f\x57\x28\xdc" + "\xff\x62\xc5\x58\xef\xf4\xe1\x8a\xdd\xe2\xeb\x0e\xe8\x22\xa5\xd7" + "\x39\x22\xd7\xdc\xfb\xf5\x54\xa7\x75\xc5\x53\x83\xdb\xbf\x3e\x7c" + "\x73\xbf\x78\x1f\xfe\xe6\x21\xa2\x0f\x57\xec\xba\xfd\xfa\x70\xc5" + "\x2e\x71\x7d\x98\x3a\x84\xf4\xa5\x2b\x0a\xdc\xd7\x1d\x80\x7b\x44" + "\xf5\x61\x2a\xb7\xfe\xf7\x8a\x5d\x42\x7d\x48\xf2\x00\x5f\xb3\x4a" + "\x5a\x1f\xae\xec\x4d\x7c\x4f\xea\x35\xe2\x7b\x08\xa6\xee\xfa\x30" + "\xf5\x58\xeb\xfa\x90\x70\x88\x2d\xa7\xa4\x3e\x5c\xd9\xd5\x5d\x1f" + "\xea\x22\xc4\xf5\x61\xda\x25\x9e\x47\x69\x6b\x85\xfa\x70\xe5\x94" + "\xbb\x43\x1f\x4a\x72\x6b\xbf\x50\x1f\xa6\xf5\x97\xaf\x0f\xd3\xa6" + "\xc9\xd3\x87\x98\x73\x62\xfa\x30\x6d\xb7\x2b\xe7\x84\xfa\x30\xed" + "\x88\xb8\x3e\x4c\x3b\x27\xd4\x87\x38\x7f\x31\x7d\x98\xde\x41\x90" + "\xbf\x9b\x3e\x4c\xef\x2b\xd4\x87\x24\x1d\xaf\x0f\xd3\x4b\x88\x0f" + "\x5d\x76\x56\xbe\x3e\x4c\xdf\x2d\xad\x0f\xd3\xf7\x09\xf5\x61\x7a" + "\x06\xd1\x81\xe9\xd5\x44\x1f\xa6\xe7\x90\xf3\xcb\xce\x38\x9f\xe7" + "\xf5\x21\x39\xcf\xeb\xc3\xf4\x5a\xef\xbf\xe7\xb8\x2d\xe3\xba\x6d" + "\xf4\x3d\xc7\xed\x1a\xd7\x6d\xeb\xef\x39\x56\x2d\x57\xa6\x0d\x57" + "\x79\xf3\xfd\xfb\xbd\x39\x30\x2d\x63\xba\xe9\x56\x7e\x4c\x77\xf5" + "\x35\x65\x3a\x65\x75\x9d\x32\x3d\xbe\xde\xca\xeb\xf1\xf5\x56\xe9" + "\xf9\xed\x6f\x1d\xf2\xac\xc7\xd7\x8d\xe5\xf5\xf8\xdb\xdc\x5a\x3c" + "\x6f\xbf\x43\xfa\xc4\xb7\xc7\x2b\x99\xdf\xbe\xfe\x26\x52\xbd\xeb" + "\x3a\xbf\xfd\xcc\x21\x32\xbf\x7d\x91\xeb\xfc\xf6\xb5\x47\x84\xf3" + "\xdb\xd7\x8c\x96\x9a\xdf\x8e\xc7\x78\x9b\xf7\xd4\xa6\xe0\xb9\xed" + "\xa2\xf3\xda\xa7\xdf\xde\x79\xed\x98\x97\x1f\xac\x20\x7a\xfe\xfd" + "\xbb\x52\xcf\xaf\x2a\xe6\xf5\xfc\xda\x0d\xca\xf4\xfc\xda\x4c\xa1" + "\x9e\x7f\x77\x8f\xbb\x9e\x5f\x7b\xc3\x7b\x3d\xff\x76\x77\x65\xed" + "\xe4\xed\x10\xef\xf4\xfc\xdb\x4b\xc4\xe7\xb5\xbf\x55\x2c\x3d\xaf" + "\x9d\x5c\x73\xd7\x61\xeb\x9c\xbe\xab\xfd\xc3\xf7\xed\x5f\xcf\xff" + "\x61\x8d\xb8\xe6\xfa\xc3\x06\xa2\xe7\xdf\x4e\xb9\xfd\x7a\xfe\xed" + "\x14\x71\x3d\xbf\xce\x8f\x68\x9f\xb7\x53\xdc\xc7\x7b\xe1\x1e\x51" + "\x3d\xbf\x6e\x98\xeb\x3d\x44\xcf\xbf\xad\x23\x7a\x7e\xdd\x24\x69" + "\x3d\xbf\x8e\x5b\x33\x79\xdd\x21\xe2\xbb\x08\xa6\xee\x7a\x7e\xdd" + "\xe6\xd6\xf5\x3c\xe1\x10\x5b\x4e\x49\x3d\xbf\xee\x82\xbb\x9e\x7f" + "\xeb\xa0\xb8\x9e\x5f\xff\x19\xcf\xa3\xf5\x53\x84\x7a\xfe\x9d\xfe" + "\x77\x87\x9e\x97\xe4\xd6\x1a\xa1\x9e\x7f\xe7\x96\x7c\x3d\xbf\x7e" + "\xa0\x3c\x3d\x8f\x39\x27\xa6\xe7\xd7\x2f\xe1\xf8\xa3\x13\xd7\xf3" + "\xeb\xb3\xc5\xf5\xfc\xfa\x3d\x42\x3d\x8f\xf3\x17\xd3\xf3\xeb\xcf" + "\x0a\xf2\x77\xd3\xf3\xeb\x6f\x08\xf5\x3c\x49\xc7\xeb\xf9\x77\x73" + "\x88\x0f\x7d\x6b\x96\x7c\x3d\xff\xee\x12\x69\x3d\xff\xee\x4a\xa1" + "\x9e\x7f\x37\x96\xe8\xf6\x77\x0b\x88\x9e\x7f\x37\x91\x9c\x7f\x2b" + "\xd1\xf9\x3c\xaf\xe7\xc9\x79\x5e\xcf\xbf\x5b\xe4\xfd\x3c\x0d\xef" + "\xc7\x7b\xff\xfb\xf3\x34\xd4\x77\xe9\x3c\x8d\x0d\xe3\x95\xe9\xf9" + "\x0d\x51\xca\xb4\xe5\xe6\xa1\xbc\xb6\xdc\x3c\x54\x7a\xbe\x40\x56" + "\x4f\xcf\xda\x72\x53\x2a\xaf\x2d\xf5\x17\x88\x7f\xd6\x1f\x21\xfe" + "\x59\xbf\xca\xdb\xf9\x02\xeb\x1b\x38\x3d\xe9\x98\x2f\xb0\x94\x9b" + "\x2f\x00\x9a\x92\x68\xc8\x8d\x8d\xc2\xf9\x02\x59\xab\xa4\xe6\x0b" + "\x88\xce\x13\x70\xd1\x8d\x0e\x8d\xa9\x74\x9e\xc0\xdd\xaf\x1b\xdf" + "\x2d\xe3\x75\xe3\xc6\x63\xca\x74\xe3\xc6\x12\xa1\x6e\xdc\xfc\xbd" + "\xbb\x6e\xd4\x0f\xf4\x5e\x37\xea\xa3\x95\xe9\x46\xfd\x04\xef\x74" + "\xa3\x7e\x9f\xf8\x3c\x81\xac\x5e\xd2\xf3\x04\xc8\x35\xf7\xfe\x7e" + "\x53\x34\xdf\xdf\x6f\xea\xd9\xfe\x75\x63\xf6\x41\xf1\xbe\x3d\xfb" + "\x18\xd1\x8d\xfa\xbd\xb7\x5f\x37\xea\xf7\x8a\xeb\xc6\x4d\x23\x49" + "\x1f\xab\xdf\xeb\xae\x1b\xe1\x1e\x51\xdd\xb8\x69\x9e\xeb\x3d\x44" + "\x37\xea\x0b\x89\x6e\xdc\xf4\x8e\xb4\x6e\x7c\xaf\x3f\xf1\x4b\x9b" + "\x6e\x11\xbf\x44\x30\x75\xd7\x8d\x9b\xca\x5b\xd7\x8d\x84\x43\x6c" + "\x39\x25\x75\xe3\x7b\xdd\xdd\x75\x63\x56\xa8\xb8\x6e\xcc\xb9\xc6" + "\xf3\x28\x67\x83\x50\x37\xbe\xf7\xf2\xdd\xa1\x1b\x25\xb9\x75\x50" + "\xa8\x1b\x73\x06\xc9\xd7\x8d\x39\x33\xe5\xe9\x46\xcc\x39\x31\xdd" + "\x98\xb3\x8f\xe3\x4f\xa1\xb8\x6e\xcc\x39\x21\xae\x1b\x73\xbe\x17" + "\xea\x46\x9c\xbf\x98\x6e\xdc\xdc\x55\x90\xbf\x9b\x6e\xdc\x3c\x50" + "\xa8\x1b\x49\x3a\x5e\x37\x6e\x2e\x23\x3e\x74\xc3\x11\xf9\xba\x71" + "\xf3\x3e\x69\xdd\xb8\xf9\x33\xa1\x6e\xdc\xbc\x8e\xe8\xc3\xcd\x06" + "\xa2\x1b\x37\xe7\x92\xf3\x1b\x8a\x9d\xcf\xf3\xba\x91\x9c\xe7\x75" + "\xe3\x66\xa3\x27\xdd\xc8\xe8\x0f\x47\xe9\x29\x7b\x21\x1c\x45\x50" + "\xce\x9e\xd0\x8f\x15\xc3\xff\x4b\xa1\x3f\x52\xc3\xff\xab\xa4\xb4" + "\x8a\x31\xf8\x70\x94\x1d\xb4\x87\x1d\x9e\x53\x69\xfc\xa9\xb8\xf8" + "\x01\x2b\x3c\x7b\x8b\x96\xe8\x92\xc3\x51\x41\xd6\x4e\x51\x76\x26" + "\x09\xfa\x70\xf8\xbf\x0e\xce\x41\xfa\x40\xe8\xf7\x34\x4b\x51\xe0" + "\x75\x6a\x8b\xde\x91\x0e\xca\x1c\x78\x91\xda\x12\x8d\xf3\x30\xaf" + "\xdf\x92\x0b\xf5\xb1\x4a\x96\x15\xf2\x8a\xd9\xd3\x07\xad\xb4\x32" + "\x3f\x14\xcf\xbf\x89\x6a\xa8\x2d\x97\x82\xea\x3a\x45\x81\x1f\x42" + "\x58\xeb\x15\x3e\x60\x54\xe1\x3c\x8b\xe7\x37\xe1\x6b\xa5\xf8\x9a" + "\x0d\xca\x98\x36\x0f\x51\x59\x37\x3b\xf9\x83\xae\xea\x90\x6e\x62" + "\x6a\x17\x58\xa1\xcc\x3a\x2b\xfa\xbc\x4f\xb5\xea\x93\xf7\xab\xd9" + "\xbe\xa7\xc2\x64\x63\xf3\xd0\xcc\x67\xcb\x73\x65\x07\xa4\x17\x2b" + "\xc3\xda\x8f\x51\x44\x87\x81\x8c\x41\x5e\x7f\xf7\xc7\x51\x52\x76" + "\x0c\x5a\xd5\x07\x15\x3f\x0c\xb6\xd3\x20\x4a\xec\xba\xcc\xe7\xec" + "\x92\x7a\x4e\x3f\x35\xf2\x7f\xaf\x07\x63\x4a\xdf\x86\xa8\x8d\xf6" + "\x4e\xfe\x47\xc1\x27\xe6\x6d\x61\x8c\xe6\xf5\x5b\xd5\x06\xbf\xa3" + "\x46\x6c\xf3\xb7\xe0\xfa\xc6\x1e\x8c\xb1\x7e\x35\xe6\xcd\xd6\xf0" + "\x23\xd0\xb7\xbb\x62\xb1\x28\x71\xde\x4c\x4d\xca\x9c\x79\xb3\x16" + "\x2c\x49\xd1\xf4\x4f\xec\x82\x26\x2f\x58\xa0\x99\x37\x73\xfe\x72" + "\x8d\xf3\x95\x27\x35\x89\x73\x16\xcf\x7c\x2d\x79\xd6\xa0\x79\xaf" + "\x6b\xbb\x40\x99\x90\x53\x39\x42\x70\x59\xec\xeb\xb7\x0e\xdd\xb1" + "\x09\xa1\xf7\xba\x21\x15\x2e\x17\x3c\x6f\xab\x81\xae\x1e\x85\x9f" + "\x97\xb5\x85\x31\x51\x90\x26\x1d\x7c\xda\xc6\xb4\x4e\x90\xf6\x8f" + "\xbb\xf2\xa0\x5c\x3b\xa0\xdc\x50\x46\x5c\xe6\x12\x47\x99\x1d\x9c" + "\x48\xc7\x9c\x48\xbb\x09\x1c\xdc\x7a\x29\xc8\xd2\xe9\x79\x86\x89" + "\xc3\xf5\xc3\x7b\xfa\xfa\x5d\xa6\xb6\xad\x64\xf5\x7f\xf6\xe1\x28" + "\xf3\xfa\x6d\xc8\xc1\x31\x7b\x4e\xc7\x7c\x66\xd3\x61\x35\x68\x47" + "\x3f\x33\x93\xf4\x34\x70\x13\xee\xdf\x16\x3d\x18\xa1\x0c\xc6\x1c" + "\xc7\xee\x0f\xc0\x98\x81\xc3\x84\xa7\x70\xed\x7d\x4d\x3d\x85\x9e" + "\x81\x3c\xc6\x1a\xd0\xfc\x44\x9c\x87\x01\xce\x61\x9b\xdb\xf3\x1f" + "\xca\x98\x12\x8e\x32\x06\x64\xa0\x0c\x33\xbe\x27\xff\x52\x5c\x50" + "\x0a\xf2\x8b\xd1\x31\xdf\x81\xdf\xf1\x63\xfa\x3e\x94\xc1\xec\xbc" + "\x14\x67\xa0\xb6\x85\xdb\x37\x77\xcc\x87\xfa\xd4\x41\x3e\x99\x06" + "\x64\x2f\xc4\xf9\x6c\xdc\xc2\xda\xbe\x0e\xd7\x1d\xec\x03\x71\x0c" + "\x53\xcc\xac\xe6\xda\x50\xe6\xb7\x3a\xbb\x7e\x60\x61\xa5\xaa\x01" + "\xc5\x58\x99\x66\x66\xc3\xb7\xba\x0a\x93\x09\x7c\x9a\xf6\x75\xa6" + "\xcb\xd6\x71\x41\xd6\x39\xb3\xf2\xba\x41\x5b\xcc\x1e\x58\xc8\x6c" + "\xb8\x59\x36\x65\x20\x52\x43\xde\xb5\x0e\x7b\x82\x2d\x55\xf2\x78" + "\xb4\x8d\x1d\xff\xc6\x7c\x80\xf2\x70\x7c\x78\x7f\xc4\x91\x14\x77" + "\x3e\xb4\xb4\xcd\x4d\x0d\xb1\x56\x26\xee\xf9\x66\x7d\xc3\x3a\x46" + "\xdd\x90\x92\x76\x09\x75\xc4\xb6\xad\x00\xbd\x9f\xb5\x14\x85\x6e" + "\x78\x05\x69\x5e\x5d\xae\x46\xc6\xec\x06\x6d\xd0\xaa\x0c\x3f\xb0" + "\x09\x05\xfe\x25\x12\x7c\x66\x64\x73\x8f\x8e\xf9\xa9\xb3\x10\xb5" + "\xef\x62\x21\x85\x75\x32\x9e\x03\x02\xb6\x6e\xdc\x01\xf7\x31\x3f" + "\xc5\x21\x8c\x07\x8b\xc5\x4f\x49\x28\x7a\x0e\xf4\xcf\x73\xf1\xf5" + "\x0f\x06\x6d\x87\x3c\xe5\xd5\xeb\x7d\x56\xff\xda\x00\xab\xc1\x80" + "\x53\x65\x8d\x8d\xcd\x93\xc5\x2a\x99\xc7\xea\x10\x94\x83\xc7\xeb" + "\xfd\xfd\x18\x57\x89\x3a\x57\x91\x3a\x9b\xc1\x37\x35\x98\x3c\xd4" + "\xd9\x48\xea\xdc\xe1\xa6\xe7\x3a\x7f\x70\xcd\x73\x9d\x73\xfb\xca" + "\xaf\xf3\x07\x45\xf2\xeb\xfc\x41\x81\x74\x9d\xcd\x1c\xce\x66\xc0" + "\xd9\xec\x01\x67\x33\x87\xf3\x7d\x17\x3d\xd7\x39\xf7\x7b\xcf\x75" + "\xde\xde\x5d\x7e\x9d\x73\xf7\xca\xaf\x73\x6e\xae\x87\x3a\x73\x38" + "\x5b\x00\x67\xb3\x07\x9c\xcd\x1c\xce\xc1\xa7\x3d\xd7\x79\xfb\x59" + "\xcf\x75\xde\xd1\x59\x7e\x9d\xb7\xe7\xcb\xaf\xf3\x76\xbd\x74\x9d" + "\x2d\x1c\xce\x16\xc0\xd9\xe2\x01\x67\x0b\x87\xf3\xf0\xf5\x9e\xeb" + "\xbc\xe3\x44\x2b\x75\xb6\xc9\xaf\xf3\x8e\x1c\xf9\x75\xde\xb1\xc6" + "\x43\x9d\x39\x9c\x1b\x01\x67\x8b\x07\x9c\x2d\x1c\xce\x33\x9e\xf3" + "\x5c\xe7\xbc\x43\x9e\xeb\x9c\x77\x43\x7e\x9d\xf3\xd6\xc9\xaf\x73" + "\x9e\x4e\xaa\xce\x4d\xe0\xb7\x03\xa0\x2e\xcd\xff\x8a\x7b\xde\xa6" + "\x6e\x48\x0d\xa8\x41\x54\xee\x6a\x7b\x52\x50\x2d\xea\x0c\x75\x4b" + "\x62\xb6\x74\x8e\xc5\x7f\xed\xea\x06\x5d\x93\xba\x61\x5d\x63\xb7" + "\xc3\xea\x37\x5f\x46\x1d\xb1\x1e\x7f\xc7\x8e\x42\xed\xfa\x86\x94" + "\xcc\x17\x91\x26\xdd\x88\xd4\x15\x69\x06\x94\xa6\x65\x8c\x15\xe8" + "\x7b\xd4\xb5\x16\xc7\x9e\xdf\xa0\xb2\xba\x52\x34\x7f\x11\xc3\x5c" + "\xa6\x76\x8e\xc6\xef\x7d\x41\x27\x67\xe8\xff\x89\x34\xf0\x8c\xc8" + "\x1d\x70\xe0\x7c\x82\x26\x40\xff\xb9\xa5\xf3\x8b\x79\x69\x28\xf4" + "\xf0\xdc\x5a\x84\xcf\x6f\x87\xc3\xb6\xa5\x63\x7e\xda\xcb\x88\xfa" + "\xf8\x66\x35\x45\xfa\xe6\x9d\x9d\x5d\xfb\xe6\x09\x33\xc1\x96\xaf" + "\xb1\xd7\xa6\xe4\xbe\x28\xd7\x96\xf9\x67\x1c\x7d\x37\x6b\xcb\xf3" + "\x36\xd2\xdf\xbb\xf4\xdd\x87\xe1\xf9\xbc\x2d\xf3\x4b\xb0\x2d\x19" + "\x7d\x83\xbe\xb2\xb6\x09\xc7\x4d\xea\xcb\x3a\x44\xc1\xf9\x94\x0a" + "\xed\x4d\x24\x61\xe3\x2a\x27\x1b\x5b\x03\x6a\x3a\xdc\x94\xb0\xb1" + "\xa5\x49\x6d\xf6\x17\xb1\xb1\xc9\x3b\x1b\x7f\xb8\xd3\x77\x1b\x7f" + "\x38\x4f\xda\xc6\x1f\x1e\x90\x6f\xe3\x0f\x47\xc8\xb7\xf1\x87\xe1" + "\xc4\xc6\x66\xb5\xd0\xc6\x3b\xab\xa5\x6d\x6c\x76\xe2\xb1\x19\x78" + "\x7c\xdf\x45\x71\x1b\x9b\x81\xc7\x66\x11\x1e\x9b\xbd\xe4\xf1\xae" + "\x0e\xbe\xdb\xf8\x4f\xa7\xa4\x6d\xbc\xab\xb7\x7c\x1b\xff\x29\x57" + "\xbe\x8d\xff\x94\xc9\xd9\xd8\x85\xc7\x7f\x1a\xe5\xc1\xc6\x4e\x3c" + "\x36\x03\x8f\x83\x4f\x4b\xd8\x18\x78\x6c\x11\xe1\xb1\xd9\x4b\x1e" + "\xef\x9e\xe3\xbb\x8d\x77\x0f\x93\xb6\xf1\xee\x55\xf2\x6d\x8c\xa7" + "\x6e\xc9\xb5\xf1\x2e\x23\xb1\xb1\xc5\x85\xc7\xbb\xf2\xa5\x6d\x6c" + "\x71\xe2\xb1\x05\x78\x3c\x7c\xbd\xb8\x8d\x2d\xc0\x63\x8b\x08\x8f" + "\x2d\x5e\xf2\xf8\xcf\xe5\xbe\xdb\xf8\xcf\xdb\xa4\x6d\xfc\xe7\x4b" + "\xf2\x6d\xfc\xe7\x44\xf9\x36\xfe\xf3\x64\xce\xc6\x2e\x3c\xfe\xb3" + "\xca\x83\x8d\x9d\x78\x6c\x01\x1e\xcf\x78\x4e\xc2\xc6\xc0\xe3\x46" + "\x11\x1e\x5b\xbc\xe4\x71\xc1\x10\xdf\x6d\xfc\x3f\x36\x69\x1b\x17" + "\x8c\x97\x6f\xe3\xff\x29\x95\x6f\xe3\xff\x29\x22\x36\x6e\x74\xe1" + "\xf1\xff\x24\x49\xd9\xb8\x19\x62\xc0\xae\x60\xe3\xae\x75\x88\xda" + "\x8e\x6d\x5b\x4d\x6c\x6b\xeb\xd1\x39\x76\x3b\x65\x4f\xc2\x36\x61" + "\xc7\x80\x7e\x0c\x0d\xb4\xe9\x1b\x52\x19\x0a\xea\x94\x86\xc7\x5d" + "\x0b\x3e\xb5\xae\x46\x81\x9a\x34\x3c\xfe\xfb\xd1\x06\x9c\x46\x93" + "\xf6\xf6\x05\x78\x1e\x8d\xc7\xbd\xac\xd9\x07\x8d\xb6\xe0\x26\xdd" + "\x65\x6a\xcf\x15\xa6\xef\x0f\x5a\x88\x37\xf5\xcc\x1b\xa1\x21\x95" + "\x75\x85\x60\x9f\x93\xa8\xa2\xfa\x1f\xc8\xde\xa3\xf3\x8b\x83\xad" + "\x28\x9c\xf9\x31\x3c\xa4\x2c\xc5\x80\x6c\xaf\x87\x06\x54\xea\x4a" + "\x51\xa5\xee\x2f\x28\xa6\x96\x69\x60\xfe\x13\x1e\xd0\xdc\x3d\x68" + "\xab\xad\x7b\xe7\x31\xb6\xcd\xa1\xd5\xd6\xee\x41\xeb\xf6\x2d\x35" + "\x50\x01\x16\x14\x9e\x5c\xc3\x30\x59\xaf\x21\x55\xd6\x45\xe4\xbf" + "\xf1\x35\x14\xb0\xf1\x22\x52\x97\xd5\x54\xa3\xf2\xab\xa5\xa8\xfc" + "\xe6\x39\x54\xde\x00\x47\x13\x1c\x76\x38\x32\xce\x01\xd6\x08\x45" + "\x5f\x43\x78\x6f\x45\xe3\x23\xe7\x51\x48\x99\xb5\x1a\xe1\x6f\x5c" + "\xaf\x53\x7b\xd6\x06\x24\xa0\x10\xe6\x3f\xa1\x88\x79\x3d\x94\x82" + "\x6b\x2a\x7c\xbe\xd2\x6a\x44\x65\x35\x16\x7c\x3d\x11\xae\xab\xd2" + "\x6b\x20\x7f\x7b\x29\xde\x3b\xd1\x58\x96\x71\x02\xea\x97\x5c\xc5" + "\xe0\x18\xba\x5b\x43\xac\x1e\x4c\x6d\x67\x42\xfb\x11\x1e\x7c\xb4" + "\x7d\x87\x5d\x2e\xd6\x7b\xc8\xfa\x97\x6f\x84\x76\x03\x3b\x3f\x60" + "\x7f\x23\x4e\x3d\xf1\xdc\x77\x4c\x85\xa9\x1a\xe1\xb1\x84\x0a\xd3" + "\x49\x54\xb9\xc6\x8e\x62\x96\x23\x34\xc1\x86\x10\xb6\x45\xa5\xae" + "\x16\x4d\xd4\xa2\x20\x3c\xfe\x6c\xff\x31\xbc\x5b\x65\x8d\x11\xad" + "\xb4\x42\x19\xaf\x5b\x5a\xca\x58\xb1\xa6\x02\xc1\xb5\x07\x2a\x92" + "\x0c\x28\x40\x8b\xd4\xd8\xbe\x56\x7d\x83\x6e\x22\xb4\x9f\xf9\x26" + "\x86\xc1\xb6\xc5\x36\xc5\xf6\xc5\xf9\x39\x6c\x5e\x99\x68\x44\xe9" + "\x16\xa4\xae\x4c\x83\xbf\x3a\xc6\x58\x89\x6e\x20\x28\xe3\x56\x26" + "\x38\xb9\x0a\x78\x31\x19\x73\xc1\x40\x15\x14\x00\xfe\xdd\x24\x38" + "\x65\x22\x9c\xea\x70\xd3\x0b\x4e\x59\x79\x4e\xfd\x6f\x07\x9e\x53" + "\x7b\xbf\x97\xe6\xd4\xde\xd1\x84\x53\x66\x75\xfb\xe4\xd4\xff\x9e" + "\xf3\xcc\xa9\xff\x2d\x92\xe6\x94\xd9\x1f\x38\x55\x25\xe4\xd4\xde" + "\x1b\xf2\x39\xb5\xd7\xbf\x0d\x39\x65\x51\xc6\xa9\xff\xad\x13\x72" + "\xea\x23\xab\x34\xa7\xcc\x9c\x9f\xba\xef\x62\xeb\x9c\x32\x3b\xf9" + "\xa9\x7d\xd3\x78\x4e\x7d\x32\x4c\x9a\x53\x1f\x67\x73\x9c\x6a\xa7" + "\x7e\xea\xe3\x41\x9e\x39\xf5\x71\x80\x07\x4e\x81\x9f\x32\xbb\xf8" + "\xa9\x4f\xc6\xc9\xe7\xd4\xc7\xf1\x6d\xc7\x29\xb3\x42\x3f\xf5\xf1" + "\x18\x21\xa7\xf6\xc5\x7a\xe0\x14\xe7\xa7\x82\x4f\x7b\xc1\x29\x27" + "\x3f\xf5\xc9\x3e\x9e\x53\x9f\xbe\x23\xcd\xa9\xc2\x4b\x84\x53\x96" + "\x76\xea\xa7\x0a\x57\x79\xe6\x54\x61\x82\x34\xa7\x2c\xe0\xa7\xcc" + "\x2e\x7e\xea\xd3\x6d\xf2\x39\x55\x58\xd8\x86\x9c\x52\xe8\xa7\x0a" + "\x73\x84\x9c\xfa\x64\x97\x34\xa7\x2c\x9c\x9f\x1a\xbe\xbe\x75\x4e" + "\x59\x9c\xfc\xd4\x5f\xfc\x78\x4e\xfd\xf5\x82\x34\xa7\xfe\x3a\x92" + "\xe3\x54\x3b\xf5\x53\x7f\x39\xeb\x99\x53\x7f\xd9\xef\x81\x53\xe0" + "\xa7\x2c\x2e\x7e\xea\xaf\xd7\xe4\x73\xea\xaf\xaa\xb6\xe3\x94\x45" + "\xa1\x9f\xfa\x4b\xad\x90\x53\x9f\x5a\x3c\x70\x8a\xf3\x53\x33\x9e" + "\xf3\x82\x53\x4e\x7e\x6a\xff\x14\x9e\x53\x7f\x1b\x22\xcd\xa9\xcf" + "\x36\x10\x4e\x35\xb6\x53\x3f\xf5\xd9\x40\xcf\x9c\xfa\xcc\x5f\x9a" + "\x53\x8d\xe0\xa7\x2c\x2e\x7e\xea\x6f\xcf\xca\xe7\xd4\x67\x71\x6d" + "\xc8\x29\x85\x7e\xea\xb3\x51\x42\x4e\xed\x9f\x20\xc5\xa9\x26\x1c" + "\xf7\xf9\x01\xa7\x92\x20\xee\x03\x0e\x05\x55\x11\x4e\x35\x03\xa7" + "\x3e\x70\xe6\xd4\xb7\xae\x71\xdf\xdf\xf6\xd8\x5b\x38\x55\xf4\x99" + "\x2b\xa7\xec\xc0\xa9\x66\x96\x53\x7f\x2f\x77\xc4\x7d\x95\x75\xf9" + "\x80\xd5\x55\x54\x19\x0b\x7c\xda\xc2\xf1\xe9\x5b\xe0\x13\xd4\xc7" + "\x0e\xf5\x2d\x3b\x5f\x8d\x62\x8c\xa4\x5e\x4d\x50\x5f\xbb\x33\x97" + "\x9a\x6a\x29\xcc\x21\xcc\x1d\x07\x8f\xca\xe7\x03\x7f\x16\x9d\x42" + "\xe5\x4b\xe1\x58\x01\x47\x1a\x1c\xe8\x14\x2a\xab\x45\xec\x98\x3d" + "\xcf\x9f\x2a\x8e\x3f\x7f\x9f\xe3\x99\x3f\x7f\x8f\x92\x17\xe3\x15" + "\x1d\x93\xcf\x9f\xbf\x6f\xe5\xe6\xd2\xa9\x63\x26\x7d\xc7\xe0\xf9" + "\xaf\x84\x23\x57\x51\x8c\x15\x05\x31\x33\xc2\xbb\x05\xc4\x21\xf5" + "\x9b\x36\x44\x6d\x78\x0d\xa9\x37\x7c\x03\xf5\x75\xb4\x9d\x8b\x28" + "\xe0\xa4\xe5\x1f\xa8\xec\x66\x35\x2a\x6b\x38\x81\xca\xec\x70\x5c" + "\x85\x03\xca\x18\x33\xcb\xb9\xbe\x46\xae\xbe\x45\xd3\x20\xaf\x30" + "\xe9\xfa\x16\x8d\x60\xeb\x9b\x08\xf5\x6d\xe2\xeb\x5b\x09\x5c\x04" + "\x5c\x1e\xb0\x73\x71\x62\x8c\x11\x75\x5e\x60\x65\x98\x26\x8e\x83" + "\x18\x97\x93\x67\x2c\x28\x46\x0b\x58\xbd\x0e\x1c\xac\x29\x40\xe9" + "\xa9\xc0\xc1\x26\x0b\x7e\xaf\x6f\xac\xcc\x68\x04\x0e\xfe\x3d\x95" + "\x01\xbb\x35\x63\x0e\x7e\x8b\x39\xf8\xb7\x7c\xbb\x34\x07\x4d\x84" + "\x83\x10\x27\xb6\xce\x41\x27\xbf\x76\x60\x10\xcf\xc1\xff\x1b\x29" + "\xcd\xc1\x7f\x4c\x72\xc4\x89\xff\x7d\x0e\x1e\xb8\xe6\x99\x83\x07" + "\xca\xe4\xc5\x84\xff\x37\x5e\x3e\x07\xff\xd1\xab\xed\x38\xf8\x8f" + "\x0b\x9e\x39\xf8\x8f\x83\x5e\x70\xd0\xa2\x8c\x83\xff\x40\x42\x0e" + "\x1e\x08\x93\xe6\xa0\x99\xf3\x83\x10\x57\xb6\xca\x41\xe7\xb8\xf2" + "\xff\x3e\xe5\x39\x78\xe8\x90\x34\x07\x0f\x9e\x75\xc4\x95\xff\x7d" + "\x0e\x1e\x5c\xe8\x99\x83\x07\x63\xe5\xc5\x90\x87\xca\xe5\x73\xf0" + "\x60\x7e\xdb\x71\xf0\xd0\x4c\xcf\x1c\x3c\x34\xa6\x75\x0e\x9a\x15" + "\xfa\xc1\x83\x6b\x84\x1c\xfc\xbf\x02\x0f\x1c\xe4\xfc\x20\xc4\xa1" + "\xad\x73\xd0\xc9\x0f\x1e\x1e\xc6\x73\xb0\xf8\x59\x69\x0e\x7e\x3e" + "\xcd\x11\x87\xfe\xf7\x39\x78\xf8\x96\x67\x0e\x1e\x3e\x23\x2f\xe6" + "\x2c\x9e\x24\x9f\x83\x9f\x87\xb5\x1d\x07\x3f\xbf\xe4\x99\x83\x9f" + "\x97\x78\xc1\x41\x85\x7e\xf0\x73\x7f\x21\x07\x0f\x47\x48\x73\xd0" + "\xc2\xf9\x41\x88\x5b\x5b\xe5\xa0\x73\xdc\x5a\x7c\x80\xe7\xe0\x17" + "\xc7\xa4\x39\x78\xe4\x82\x23\x6e\xfd\xef\x73\xf0\xc8\x72\xcf\x1c" + "\x3c\x12\x27\x2f\x46\xfd\xe2\xac\x7c\x0e\x1e\x29\x68\x3b\x0e\x7e" + "\x31\xc7\x33\x07\xbf\x88\x6a\x9d\x83\x16\x85\x7e\xf0\x48\xa6\x90" + "\x83\xc5\x85\x1e\x38\xc8\xf9\x41\x88\x73\x5b\xe7\xa0\x93\x1f\x3c" + "\x3a\x9a\xe7\xe0\xb1\xf1\xd2\x1c\x2c\x99\xe9\x88\x73\xff\xfb\x1c" + "\x3c\x6a\xf3\xcc\xc1\xa3\xe7\xe5\xc5\xb4\xc7\xa6\xc9\xe7\x60\x49" + "\x44\xdb\x71\xb0\xe4\x9a\x67\x0e\x96\x94\x79\xc1\x41\x85\x7e\xb0" + "\x44\x2d\xe4\xe0\xd1\xa1\x52\x1c\xb4\x43\x5c\xdc\x9c\xff\x83\xd6" + "\x9e\x13\xb4\x35\xc8\x4f\x83\xac\xea\x26\x5d\x65\x8a\x09\x4d\xbc" + "\x05\xf6\xd1\xde\x42\xaf\xdc\x52\x23\x5b\x4e\xd0\x3a\x88\x0b\x75" + "\x4e\xf1\x33\x3b\xb7\xcc\xaa\x4f\xae\xda\x38\x1f\xa9\x20\xfe\x7e" + "\x11\x9f\xab\xbc\x6c\x41\xf8\xf9\x2b\x71\x79\xae\xf2\xe5\xc1\xe3" + "\x04\xcc\x4f\xe1\x6a\xf6\x1d\x73\x93\x01\xd5\x8c\x42\x74\x59\x8d" + "\x01\xec\xb0\x82\xc5\x17\xdb\xe5\x32\x75\x3c\x22\xef\x3a\x52\x59" + "\xff\x13\xfa\x00\xd8\x3b\xa4\xeb\x32\xe4\xd7\xab\x86\xb1\x63\xbb" + "\x62\x7b\x61\x1b\x6b\x56\xe0\x77\xd7\xc7\x57\x56\x00\xc7\xac\xff" + "\x09\x7f\x60\x07\xa4\x13\x8f\x57\x8f\xaf\x95\xcf\x8d\xe3\x51\xe4" + "\xbb\x85\xe3\x61\x65\xe7\x91\xe8\xbb\x63\xb0\x95\xc9\x4b\x5b\x59" + "\x9c\xe2\xbc\x3b\x60\xab\x2f\xe3\xbc\xb3\xd5\x97\x7b\x84\xb6\x12" + "\x8b\xab\xbe\xfc\x54\xbe\xad\xbe\x4c\x21\xb6\xfa\x32\x56\xda\x56" + "\x66\x2f\x79\x65\xd6\x39\xc5\x23\x77\xc0\x56\xa5\x6b\xbc\xb3\x55" + "\xe9\x59\x17\x5b\x89\xe8\xff\xd2\x0b\xf2\x6d\x55\x9a\x4f\x6c\x55" + "\x9a\xea\xc1\x56\x5e\xf2\xca\x6c\x71\xd2\xcd\x77\xc0\x56\x27\x0a" + "\xbd\xb3\xd5\x49\x3f\xa1\xad\xc4\x74\xea\xc9\xce\xf2\x6d\x75\xa2" + "\x8c\xd8\xea\x44\x81\xb4\xad\x2c\x5e\xf2\xca\xa2\x73\xd2\x77\x77" + "\xc0\x56\x27\xcf\x7b\x67\xab\xaf\x06\xb9\xd8\x4a\x44\x4f\x7d\x35" + "\x4c\xbe\xad\x4e\x5a\x88\xad\x4e\x9e\xf1\x60\x2b\x2f\x79\x65\xb1" + "\x38\xe9\x90\x3b\x60\xab\x32\x7f\xef\x6c\x55\x36\x4d\x68\x2b\xb1" + "\x7e\xbf\x6c\xa6\x7c\x5b\x95\x85\x11\x5b\x95\x21\x29\x5b\xd9\xf4" + "\x0d\x29\x41\x60\x83\xc6\x4d\x0d\xb1\x41\x3a\x44\x35\x69\xc0\x6e" + "\x21\x60\xb7\x55\x1a\xd4\xac\x07\xbb\x19\xad\x68\xe2\xc2\xef\x98" + "\x8a\x3a\x1b\x6a\x02\x9b\x35\xaa\x1b\xe0\x5c\x2d\x9e\x73\xf4\xd4" + "\x45\xaa\xe2\xd9\x19\x0b\xd5\x08\xdb\x0d\xdb\x01\xdb\x8e\x01\xbb" + "\xb1\x76\x0c\x09\xad\xb6\x85\x74\x1e\x13\x7d\xed\x3b\x66\x81\x81" + "\x61\x70\x7d\x19\xf5\x41\x23\x7e\x2f\x10\x53\x8b\x3a\x6b\x5e\xc4" + "\x75\x2a\xbf\x81\xcf\x57\x1a\xab\x41\x1f\xdc\x44\xac\x36\xfb\x2e" + "\x3c\xc4\x36\x35\x3c\xc0\x56\x19\xf7\x3c\xd3\xed\xb0\xda\xda\xa3" + "\x63\x7e\xfa\x35\xd4\x11\xeb\x87\x2c\x3b\x0a\x5d\x39\x0f\x51\x1f" + "\xcf\x2d\xa6\xd8\x6f\xd7\x16\xb1\x79\x1c\x02\xbb\x84\x32\xf5\x4e" + "\x73\xba\xeb\x93\x50\xe5\x65\x3d\x8b\x9b\xab\x46\x60\x71\xfb\x57" + "\xb8\x1a\x74\x66\x24\xa3\x6e\x58\xa7\xaf\x40\x1a\xa6\x19\x6c\xcc" + "\x7e\x4f\x54\xb1\x27\xaf\x49\xae\x8d\xcb\xd9\xf9\xdf\x76\x0d\x37" + "\x7f\x0b\xec\x84\x9f\xcf\xce\xdf\xd2\x3a\xcd\xdf\x82\x32\xf3\xf3" + "\xb7\xca\x27\xe0\xf9\x5b\xf6\xef\x42\x1f\x70\xd4\x7d\x41\x32\xc3" + "\x40\xdd\xbb\x55\x98\x8c\x08\xd7\xbf\xc2\x54\x8c\xd2\x53\x90\xba" + "\xa2\xa9\x16\xa5\x99\x18\x63\x45\xc6\x15\x14\x73\x0b\xeb\x60\xcc" + "\x97\x8a\x91\x04\xd7\xf2\x00\xfb\x77\xe1\x0f\x18\xa8\x8a\xc8\x8a" + "\x2a\x84\x9c\xbe\xe3\x49\x02\xcd\xec\x0f\x38\x24\x55\x66\x5c\x44" + "\x80\x49\x61\xa5\xf5\x1b\x8c\x53\x12\x5c\x1f\xd5\xa2\xaf\x7b\x74" + "\xfe\x0b\x3e\x87\x31\xc3\xef\x9b\xf0\xfa\x00\x79\x4e\xfa\x1b\xf3" + "\x22\x48\x97\x81\x2a\x75\x4d\xa8\xc2\x8a\xbf\xd9\x2d\x2b\xfa\x2a" + "\xae\x5a\x8a\x47\x26\x8e\x47\x55\x41\xba\x0e\x37\xbd\xe0\x91\x85" + "\xe7\x51\xd5\x3b\xbe\xf1\xa8\x6a\xa4\xef\x3c\xaa\xea\xa0\x9c\x47" + "\x66\x7f\x21\x8f\xaa\x6e\xc8\xe7\x51\x65\x95\x7c\x1e\x55\xe6\xf8" + "\xc6\xa3\xaa\x55\x84\x47\x95\x93\x09\x8f\xaa\x74\x3c\x8f\xd8\x6f" + "\xa3\xee\x10\x8f\x2a\x91\x34\x8f\xcc\x9c\x3f\x32\x83\x3f\xba\xef" + "\x62\xeb\x3c\x32\x3b\xf9\xa3\xd3\xa7\x7c\xe3\xd1\xe9\x55\xbe\xf3" + "\xe8\x74\xb4\x0f\x3c\x72\xf1\x47\x5f\x8f\x94\xcf\xa3\xd3\xa1\xf2" + "\x79\x74\xea\xbc\x6f\x3c\x3a\x7d\x82\xf0\xe8\x54\x2e\xe1\xd1\xe9" + "\x62\x9e\x47\xec\xf7\x66\x77\x88\x47\xa7\xa2\x3c\xf0\x88\xf3\x47" + "\x66\xf0\x47\xc1\xa7\xbd\xe0\x91\x93\x3f\x3a\xdb\xd3\x37\x1e\x9d" + "\x39\xe1\x3b\x8f\xce\x6c\x56\xce\x23\x8b\x8b\x3f\x3a\xbb\x4a\x3e" + "\x8f\xce\x24\xc8\xe7\xd1\x99\x30\xdf\x78\x74\x36\x98\xf0\xe8\xeb" + "\x1a\xc2\xa3\xb3\xfe\x3c\x8f\xd8\x6f\xf8\xee\x10\x8f\xbe\xd6\x4b" + "\xf3\xc8\xc2\xf9\x23\x0b\xf8\xa3\xe1\xeb\x5b\xe7\x91\xc5\xc9\x1f" + "\xfd\x6b\xa6\x6f\x3c\xfa\x57\xb0\xef\x3c\xfa\xe7\x05\x1f\x78\xe4" + "\xe2\x8f\xfe\x75\x42\x3e\x8f\xfe\x59\x20\x9f\x47\xff\x4c\xf6\x8d" + "\x47\xff\x9a\x46\x78\xf4\xcf\x08\xc2\xa3\x7f\xc5\xf2\x3c\x62\xbf" + "\x8b\xbc\x43\x3c\x3a\x5b\xed\x81\x47\x9c\x3f\xb2\x80\x3f\x9a\xf1" + "\x9c\x17\x3c\x72\xf2\x47\xe7\xf6\xf8\xc6\xa3\x73\xd3\x7c\xe7\xd1" + "\xb9\xfe\xca\x79\xd4\xe8\xe2\x8f\xbe\x09\x96\xcf\xa3\x6a\xa3\x7c" + "\x1e\x55\xef\xf7\x8d\x47\xe7\x76\x12\x1e\x55\xa7\x10\x1e\x9d\xdb" + "\xca\xf3\x88\xfd\xd6\xf4\x0e\xf1\xa8\x5a\x23\xc5\x23\xbc\x16\xc1" + "\x7b\x64\x5d\x08\xd3\xc6\x15\x68\x44\x1e\xfe\xdb\x84\x22\xcd\xeb" + "\xbf\x89\x3a\x92\x4a\xd6\x03\x30\x50\xdf\xb0\xe3\xbd\x62\xf7\xdf" + "\xb7\x07\x70\x51\x37\x68\x63\x2e\x90\x35\x1a\xf0\xba\x20\xf5\xe9" + "\x49\x68\x30\xbb\x2e\xc3\xb7\x19\x78\x1d\xab\x96\xb5\x03\xd4\x12" + "\x6b\x07\x4c\x97\x5e\x3b\xa0\x69\x8b\xe3\xbb\xdb\x02\xa7\xef\x6e" + "\xbf\x8d\xf6\xfc\xdd\xed\xb7\xc3\xb6\x4f\x97\xcb\x87\x6f\x11\xae" + "\x63\x7d\xb7\x86\x58\xf3\xfa\x6f\xc7\x42\x9d\x7b\x91\xba\x7f\x5b" + "\x8c\xbc\xfa\x1e\xb7\xc0\x89\x27\xdf\x18\xa7\xc4\xa3\x0c\x66\xfd" + "\xfb\x63\x99\xe0\x06\x2d\x93\xdd\x90\x21\xb3\x2c\x99\xad\xd8\xdb" + "\x28\x6e\xef\xf3\x46\xce\xde\xe4\x3b\x67\xb5\xc4\xba\x05\xd3\xa5" + "\xd7\x2d\x10\xb7\xf7\xf9\x56\xbe\x73\x3e\xbf\x5b\xbe\xbd\xcf\x6b" + "\x39\x7b\x57\x99\xd7\x9f\xdf\xcf\xdb\xfb\x42\xa4\x7c\x7b\x9f\x4f" + "\x20\xf6\xfe\x60\x04\xd8\xdb\xc8\x64\x9b\x65\xae\x57\x76\xde\xea" + "\xd9\xde\x66\x09\x7e\xff\x3b\x81\xd8\x9b\x5b\x33\x41\x2d\xb1\x66" + "\xc2\x74\xe9\x35\x13\xc4\xed\xfd\xef\x41\x9e\xed\xfd\xef\xee\xf2" + "\xed\x7d\xc1\x40\xec\x6d\x06\x7e\xff\x3b\x8c\xb7\xf7\xbf\xf3\xe5" + "\xdb\xfb\x42\x15\xb1\x77\x6e\x04\x13\x6c\x06\x7e\x9b\x65\xf2\xfb" + "\xdf\xc9\xad\xd8\x5b\x82\xdf\xdf\x55\x71\xf6\xe6\xf8\x2d\xb1\x5e" + "\xc3\x74\xe9\xf5\x1a\xc4\xed\xfd\xdd\x76\xcf\xf6\xfe\x6e\xad\x7c" + "\x7b\x7f\x17\xcb\xd9\x1b\xf8\xfd\x5d\x0e\x6f\x6f\x83\x5a\xbe\xbd" + "\xbf\x1b\x43\xec\xbd\x5d\x03\xf6\x06\x7e\x5b\x64\xf2\xfb\xbb\xf3" + "\x9e\xed\x6d\x91\xe0\xf7\xf7\x63\x88\xbd\xb9\xb5\x22\xd4\x12\x6b" + "\x45\x4c\x97\x5e\x2b\x42\xdc\xde\xdf\x77\xf5\x6c\x6f\xc3\x2d\xf9" + "\xf6\x36\x14\x13\x7b\x5b\x80\xdf\xdf\xab\x78\x7b\x7f\x9f\x21\xdf" + "\xde\x86\x42\x62\xef\x1d\x21\x4c\xb0\x05\xf8\x6d\x91\xc9\xef\xef" + "\x27\xb4\x62\x6f\x09\x7e\x5f\x2c\xe4\xec\xcd\xf1\x5b\x62\x9d\x8a" + "\xe9\xd2\xeb\x54\x88\xdb\xfb\xe2\x4a\xcf\xf6\xbe\x38\x4b\xbe\xbd" + "\x2f\x46\x72\xf6\x06\x7e\x5f\x4c\xe1\xed\x7d\xd1\x28\xdf\xde\x17" + "\x35\xc4\xde\x79\xfe\x60\x6f\xe0\x77\xa3\x4c\x7e\x5f\x3c\x28\x65" + "\xef\x20\xb0\xf7\xb1\x54\xbc\xd6\x68\x83\xce\xae\x07\x9d\x62\x13" + "\xda\xbd\x52\x37\x02\x3d\xda\x80\x6d\x5f\x93\x0b\x7d\x87\xae\xed" + "\xd6\xcb\xa8\x59\xeb\xfb\xb7\xc3\x35\x93\xa4\xbf\x1d\xae\x19\x29" + "\xff\xdb\xe1\x1a\x15\xaf\x81\x6a\xa2\x78\x4c\x6b\x58\xff\x21\xef" + "\x9b\xe2\xff\x98\xc4\xd7\xd1\xf8\xcf\x2e\xfc\x4d\x31\x60\x6d\xb5" + "\x67\x2b\xd1\x46\x35\x05\x5e\x60\x6d\x01\x1c\x8c\xd2\x58\x5f\x5e" + "\x07\x58\x5b\xda\x6e\xdd\x8e\xcb\x0b\x7d\xc7\xfa\xf2\x68\x69\xac" + "\x2f\xf7\x97\x8f\xf5\x25\x23\xaf\xbf\x2e\x0f\xe5\xb1\xbe\xac\xe0" + "\xfb\xf1\x4b\x06\xf1\xf5\x3c\x2e\xe9\x09\xd6\x3b\x13\x00\x6b\x05" + "\xba\xec\x72\x4e\xeb\x58\x9b\xa1\x5d\x9b\x3d\xb4\xeb\xda\x14\xe8" + "\x33\x75\x6d\xb7\x7e\x48\xed\xcb\xbe\x63\x5d\x3b\x50\x1a\xeb\xda" + "\x60\xf9\x58\xff\x70\x9e\xd7\x7e\xb5\x1a\x1e\xeb\xda\xfd\xf2\xb1" + "\xfe\xa1\x4c\x7c\x5d\x91\x1f\x52\x09\xd6\x1f\x96\xd8\xb3\x95\x68" + "\xc2\xda\x0c\x2f\xb0\x86\x76\x6d\xf6\xd0\xae\xaf\x26\x00\xd6\x96" + "\xb6\x5b\xc7\xe4\xea\x78\xdf\xb1\xbe\xda\x5d\x1a\xeb\x2b\x36\xf9" + "\x58\x5f\x29\xe5\x75\xe7\xd5\x00\x1e\xeb\xab\xf9\xf2\xb1\xbe\x52" + "\x24\xbe\xbe\xc9\x95\x24\x82\xf5\xae\x70\xc0\x5a\x81\x1e\xbd\x2a" + "\xa9\xff\x79\xac\x2d\xd0\xae\x2d\x1e\xda\x75\xdd\x04\xd0\x0a\xba" + "\xb6\x5b\x4f\xa5\x6e\x98\xef\x58\xd7\xf9\x49\x63\xfd\xe3\x15\xf9" + "\x58\xff\xb8\x9f\xd7\xbc\x3f\x5a\x78\xac\xeb\x32\xe5\x63\xfd\xe3" + "\x2e\xf1\x75\x56\x7e\x9c\x4c\xb0\xde\x9d\x69\xcf\x56\xa2\x85\xeb" + "\xe2\xbc\xc0\x1a\xda\xb5\xc5\x43\xbb\xbe\x0e\x71\xbd\xc5\xd2\x76" + "\xeb\xba\x5c\xef\xeb\x3b\xd6\xd7\xae\x49\x63\x7d\xed\xac\x7c\xac" + "\xaf\xe5\xf3\x7a\xfb\x5a\x0d\x8f\xf5\x75\x9d\x7c\xac\xaf\xe9\xc5" + "\xd7\x7b\xb9\x36\x86\x60\xfd\x67\x23\x60\xad\x40\x87\x5f\x1f\xab" + "\x44\x87\x2f\xde\x8e\xfc\x85\x78\x1b\xc3\xdb\x56\x8b\x1b\x83\x7d" + "\xc7\xfb\xa7\x0b\xd2\x78\xff\x74\x4c\x3e\xde\x3f\xe9\x79\x2d\xfe" + "\xd3\x19\x1e\x6f\x63\x92\x7c\xbc\x7f\xca\x10\xd7\xe2\x3f\x45\xfa" + "\xa6\xc5\x8d\x43\x95\x68\x71\x77\xbc\x6f\x86\xb6\xad\x1e\xbf\xe9" + "\xe7\x3b\xde\x37\xca\xa5\xf1\xbe\xf1\x99\x7c\xbc\x6f\x64\xf0\x7a" + "\xfc\x46\x09\x8f\xf7\xcd\x38\xf9\x78\xdf\xd0\x8a\xeb\xf1\x1b\x1a" + "\xdf\xf4\xf8\xcd\x30\x25\x7a\xdc\x1d\x6f\x93\x7f\xdb\x6a\xf2\xfa" + "\x1b\xbe\xe3\x5d\x7f\x48\x1a\xef\xfa\xdd\xf2\xf1\xae\xd7\xf2\x9a" + "\xbc\xde\x69\xfc\xdb\x14\x25\x1f\xef\xfa\x04\x71\x4d\x5e\xaf\xf6" + "\x4d\x93\x9b\x42\x94\x68\x72\x77\xbc\x6f\x59\xda\x56\x97\xdf\xfa" + "\xde\x77\xbc\x6f\xed\x93\xc6\xfb\xd6\x66\xf9\x78\xdf\x4a\xe0\x75" + "\xf9\xad\x5d\x3c\xde\x0d\x0a\xd6\xcf\xbc\x15\x2b\xae\xcb\x6f\x21" + "\xdf\x74\x79\x83\x4a\x89\x2e\x77\xc7\xdb\x5c\xdb\xb6\xda\xdc\x7c" + "\xca\x77\xbc\xcd\xdb\xa5\xf1\x36\xaf\x95\x8f\xb7\x39\x96\xd7\xe6" + "\x66\xa7\xf1\x7f\x4b\xb8\x7c\xbc\xcd\x63\xc4\xb5\x79\x83\xd1\x37" + "\x6d\x6e\x36\x29\xd1\xe6\xee\x78\x37\x56\xb7\xad\x3e\x6f\x3c\xe2" + "\x3b\xde\x8d\x1b\xa4\xf1\x6e\x5c\x22\x1f\xef\xc6\x31\xbc\x3e\x6f" + "\x5c\xc3\xe3\xdd\x14\x2a\x1f\xef\xc6\x48\x71\x7d\x6e\x31\xf8\xa6" + "\xcf\x1b\x6b\x7c\x1f\x27\xb7\xee\xc7\xda\x5c\xee\xfa\x8f\x95\x29" + "\x8e\x6f\xee\x9a\x9c\xd6\x7f\xb4\xb2\xfb\x65\x8b\xaf\x2d\x63\xf5" + "\x6b\xdf\xeb\x3f\x36\xb7\xb2\xfe\x63\xb3\xcc\xf5\x1f\x9b\xaf\xc8" + "\x9f\x8f\xdf\xbc\x9f\x8f\x11\x9a\x9d\xe2\x7f\x2b\xdb\xae\xdb\xf7" + "\xba\x90\xcd\x2e\xeb\x42\x36\xb1\xeb\x42\x32\xeb\x0b\x26\x2b\x8b" + "\x45\xac\xc5\xbe\xbf\x17\x60\xf4\x38\x0e\x91\xbb\x0e\x25\xcf\x6d" + "\xdb\x06\x9e\xdb\xcc\x2a\x69\x6e\xdb\x2f\xb4\xef\x75\x28\xed\x33" + "\x3d\x73\xdb\x3e\x46\xde\x9a\x23\x76\x05\xeb\xde\xd8\xf5\x7c\x3c" + "\x64\x77\x8a\x7f\x99\xaa\x36\xe4\xb6\xc2\xf5\x94\xec\x29\x42\x6e" + "\xdb\xd6\x10\x6e\x7f\x54\xa0\x2c\xee\x62\x72\x7d\x7e\x0f\x42\x53" + "\xc9\x38\xe6\x92\xbb\x1e\x66\x0b\xb7\x69\x34\xa7\x85\xdb\x34\xf5" + "\xb2\x24\xb7\x69\xbf\x03\xed\x7a\x3d\x4c\xda\x6f\xb4\x47\x6e\xd3" + "\x7e\xbd\x64\xad\x65\x42\xfb\xed\x94\xcd\x6d\xda\x2f\xb9\x25\xf6" + "\xcb\xf2\x2b\x6c\xe1\x36\x4d\xed\x6d\x3b\x6e\x2b\x5c\x27\x93\xf6" + "\x8b\x15\x70\x9b\x46\x09\x84\xdb\x7b\xad\x8a\x62\x4c\x9a\xd2\xf9" + "\xfc\xde\x87\xee\x10\x85\xe3\x4b\xb9\xeb\x72\xf2\xdc\xa6\xc7\xf1" + "\xdc\xee\xe0\xb6\x2e\x14\xcf\x6d\xd5\xe6\x76\xbd\x2e\x27\xad\xea" + "\xe9\x99\xdb\xb4\x45\xd6\x1a\x29\xb4\x6a\xa5\x7c\x6e\xab\xa2\x5a" + "\xe2\xdc\x2c\x55\x26\xcf\xed\x0e\xeb\xda\x90\xdb\xca\xfc\x36\xad" + "\x8a\x10\x72\x9b\x1e\x45\xb8\xfd\x49\xac\xa2\x78\x9a\xee\x30\xd9" + "\xe7\xf7\x5c\xb4\x7f\x18\x8e\xa5\xe5\xae\x0f\xca\x73\xbb\x63\x5f" + "\x9e\xdb\xfe\xdd\xa5\xb9\xdd\x69\x61\xbb\x5e\x1f\x94\xee\xe8\x79" + "\xfd\x1f\xba\xa3\xa7\xf5\x7f\xdc\xbf\x15\xa6\x3b\xc9\x5f\xf7\x82" + "\xee\x14\xd6\x12\xd3\x67\x75\x4a\xe2\xb9\xed\x9f\xd8\x76\xdc\x56" + "\xb8\x6e\x28\xdd\xc9\x5f\xc8\xed\x8e\xa1\x84\xdb\x9f\xee\x52\x34" + "\x76\x40\xfb\x47\xfa\xfc\x5e\x8f\xbe\x0f\xe1\x71\x03\xb9\xeb\x94" + "\xf2\xdc\xf6\xb7\xf1\xdc\xee\x72\x43\x9a\xdb\x5d\xa2\xdb\xf5\x3a" + "\xa5\x74\xe7\x53\x9e\xb9\xdd\xb9\x50\xd6\x9a\x2e\x74\x17\xf9\xdf" + "\xc1\xd3\x5d\x50\xcb\xf8\x45\x56\x17\x7e\xfe\x3b\x7d\xdf\x98\x36" + "\xe4\xb6\x42\xbf\xdd\xb9\x46\xc8\x6d\x7f\x13\xe1\xf6\x5f\x2d\x8a" + "\xc6\x49\xe8\xfb\x02\x7c\x1e\x27\xa1\x03\x03\xd8\x77\x98\x32\xd7" + "\x4b\xe5\xb9\x7d\xdf\xb9\x96\xb5\x89\xe8\xae\x36\x57\x6e\xb7\xac" + "\x4d\x44\x77\xed\xde\x6e\xd6\x4b\xa5\x03\xb6\x79\xe6\x71\x80\x4e" + "\xd6\x98\x08\x1d\x60\x93\xcf\xe3\x80\xd2\x96\x31\x91\xac\xae\xfc" + "\xfc\x17\x3a\xd0\xb1\x27\xf9\x9d\x5f\xb3\x88\xee\xba\xd3\xe3\x9a" + "\x45\x74\xd7\x8c\x3b\xb6\x8e\x2a\x1d\xb0\x57\xb0\x66\x11\x7d\x5f" + "\x95\x9d\x6d\x0b\x7f\x9b\xa0\x68\x5c\x85\x0e\x0c\xf5\x79\x5c\x85" + "\x0e\x26\xef\x77\x65\xae\xdb\xca\xb7\x85\xc0\x4b\x7c\x5b\x08\xee" + "\x2c\xdd\x16\xd4\x7d\xdb\xcd\xba\xad\x74\xd0\x6e\xcf\x6d\x21\x68" + "\x8d\xac\x31\x14\x5a\x2d\x7f\x1d\x18\x3a\xe8\x4c\xcb\x18\x4a\x96" + "\x3a\x94\x6f\x0b\xc1\x71\x6d\xd7\x16\xd4\xfb\x3c\xb7\x05\x75\xe6" + "\x1d\x5b\xcf\x95\x0e\x2a\x12\xb6\x85\xc0\xf3\xa4\x2d\x14\x55\x29" + "\x1a\x87\xa1\x83\x15\xbd\xff\x16\xb6\x85\x90\x30\xf6\xdd\xb7\xcc" + "\xf5\x63\xf9\xb6\x10\x7c\x83\x6f\x0b\x21\x6e\x7a\x9e\x6f\x0b\xf7" + "\x0f\x6a\x37\xeb\xc7\xd2\xdd\x3e\xf5\xdc\x16\xba\xe9\xe5\x8d\xb9" + "\xdc\xdf\x5d\x7e\x5b\xe8\xc6\x7f\xff\x94\x75\x3f\xff\xfd\x13\x1d" + "\x92\xd8\x76\x6d\xe1\xfe\x03\x9e\xdb\xc2\xfd\x5b\xef\xd8\xba\xb2" + "\x74\xb7\x12\x61\x5b\x08\xae\x25\x6d\xe1\xff\x26\x2b\x1b\xb7\x09" + "\xf1\x42\xff\xb7\x36\x6e\xf3\x8b\x48\x76\x5e\x80\xcc\x75\x6c\xf9" + "\xb6\x10\x62\xe3\xdb\xc2\x2f\xfa\x4a\xb7\x85\x1e\x23\xdb\xcd\x3a" + "\xb6\x74\xf7\x43\x9e\xdb\x42\xf7\x5c\x79\x63\x34\x3d\xfa\xca\x6f" + "\x0b\xdd\xeb\xf8\x31\x9a\x1e\x91\x7c\x5b\xf8\x85\xb6\xed\xda\x42" + "\x8f\x63\x9e\xdb\x42\x8f\x5d\x77\x6c\x7d\x5b\xba\x7b\x95\xb0\x2d" + "\x84\x98\x48\x5b\x38\x54\xad\x6c\x9c\xe7\x17\xa3\x7c\x1f\xe7\x79" + "\x60\x14\x3b\x67\x42\xe6\x7a\xba\x7c\x5b\x08\xed\xcc\xb7\x85\x07" + "\x06\x49\xb7\x85\x9e\xe3\xda\xcd\x7a\xba\x74\xe8\x09\xcf\x6d\x21" + "\xb4\x40\xde\x98\x4e\xcf\x41\xf2\xdb\x42\xa8\x85\x1f\xd3\xe9\x39" + "\x8a\x6f\x0b\x0f\xa4\xb6\x5d\x5b\xe8\x79\xca\x73\x5b\xe8\x59\x78" + "\xc7\xd6\xd9\xa5\x43\xcf\x0b\xdb\x42\x28\x22\x6d\xa1\x38\x5e\xd9" + "\xb8\xd0\x03\x51\xbe\x8f\x0b\xf5\x8e\x62\xe7\x93\xc8\x5c\xd7\x97" + "\x6f\x0b\x0f\x76\xe7\xdb\x42\x6f\xe9\x7d\x1e\xe8\x5e\x93\xda\xcd" + "\xba\xbe\xf4\x83\x9e\xf7\x3f\xa2\x1f\xf4\xb0\xff\x91\xd8\x18\x50" + "\xaf\x91\xf2\xdb\x42\x2f\x15\x3f\x06\xd4\x8b\xff\xfe\x8f\xee\xbd" + "\xae\xed\xda\x42\x2f\xcf\xfb\x3f\xd0\xbd\xbc\xd8\xff\x41\xe1\x7a" + "\xbf\xf4\x83\xb5\xc2\xb6\xf0\x60\x00\x69\x0b\x5f\x18\x94\x8d\x23" + "\xf5\x6e\x75\xfc\x1f\xc7\xf9\xcd\x6a\xf7\x71\xa4\xb2\x9a\x11\xe8" + "\x91\xe9\xb8\x2d\xf4\xb1\x5a\xb3\x1b\x74\x78\x7d\x61\x9b\x86\x5b" + "\x83\x72\x15\xb7\xc6\x8b\xc9\x4a\xd6\xa0\x34\xda\x5a\xd6\xa0\x24" + "\x6b\x7f\x20\x0a\x7f\x0b\x8c\xbf\x09\xb6\xaa\xc9\xfa\x93\x0c\x9e" + "\x13\x85\xe7\x48\x5d\x2c\x65\xd7\x57\x49\xb5\x42\xdd\x2f\xb7\xb2" + "\xfe\x64\x82\x01\x95\x25\xac\x40\xd6\xe0\xe4\x2a\xf6\x3b\x61\xba" + "\x4f\x26\xbb\xfe\xe4\xab\xa1\x0f\x64\xfd\x1b\x85\x04\xe1\xf5\x27" + "\x13\x18\x7b\xba\x81\x31\x56\x80\x17\x2d\x4b\x00\xfb\xce\xe4\xd6" + "\xa0\xa4\xfb\xdc\xc2\x75\xb7\xbe\x1a\xfe\xc0\x8e\x7f\x4b\xac\x2f" + "\x4c\xf7\x91\xbf\x0e\x2c\xdd\xa7\x80\x1f\xdf\xe9\x53\xc7\x73\xf4" + "\x97\x6c\x1f\x0c\xd7\xd7\x94\x41\x74\xcb\xac\x3f\x96\xd8\xac\x64" + "\xed\x0d\xfa\x97\xfe\x5e\x60\x86\xe7\x88\xb8\xf9\x2f\x1e\x33\x4d" + "\x21\x60\x66\xc1\xeb\x1c\x7b\x8f\x59\x87\x9b\x77\x06\x33\xcd\x18" + "\xef\x31\xd3\xec\x11\x62\x26\x36\x0e\xa1\xc9\x96\x8f\x99\x26\x9e" + "\x1f\x87\xd0\xe4\xf3\x98\x69\x8c\x04\x33\xcd\x08\x82\xd9\x71\x7d" + "\xb3\x92\xf5\x3b\x68\x4d\xab\xdf\x7f\xe3\xb8\xa9\x59\xed\x1e\x97" + "\xf3\x98\xf5\x4b\xb4\x66\x43\xec\x0e\x71\xb9\xf7\x98\xdd\x77\xf1" + "\xce\x60\xd6\xd7\xe4\x3d\x66\xfd\x5e\x76\xc1\x4c\x24\x5e\xee\x27" + "\x7f\xcf\x4e\xba\x9f\x9a\x8f\x97\xfb\x4d\xe6\x31\xeb\xb7\x8b\x60" + "\xd6\xb7\x8e\x60\xf6\xe5\xc1\x66\x25\x6b\x80\xd0\xfd\xb4\x5e\x60" + "\x86\xdf\xe9\x7b\x68\x67\x61\xa1\x80\x99\x05\xaf\xfb\xec\x3d\x66" + "\xc1\xa7\xef\x0c\x66\x0f\x15\x78\x8f\x59\x58\xb0\x10\x33\xb1\xb8" + "\xee\xa1\x46\xf9\x98\x3d\x54\xc2\xc7\x75\x61\xfe\x3c\x66\x61\x71" + "\x04\xb3\x87\xf2\x09\x66\xa5\xb5\xcd\x4a\xd6\x11\xa1\xc3\x5a\x1d" + "\xff\xc2\x3a\xb4\x59\xed\x1e\xe7\xf0\x98\xf5\x2f\xb3\x66\x43\x2c" + "\x04\x71\x8e\xf7\x98\x0d\x5f\x7f\x67\x30\xeb\x1f\xef\x3d\x66\xfd" + "\x8f\xb9\x60\x26\x12\x7f\xf4\xdf\x27\x1f\xb3\xfe\x3a\x3e\xfe\xe8" + "\x7f\x90\xc7\xec\x57\x01\x04\xb3\xfe\x93\x09\x66\x27\x43\x9a\x95" + "\xac\x45\x42\xf7\xaf\xf6\x02\x33\xfc\x0e\xd6\x43\x3b\x1b\x90\x01" + "\x98\x59\xf0\x3a\xd8\xde\x63\x36\xe3\xb9\x3b\x83\xd9\x00\xb5\xf7" + "\x98\x0d\x58\x2e\xc4\x4c\x4c\x27\x0f\x90\xbf\x0e\x36\x3d\x20\x82" + "\xd7\xc9\x03\xb4\x3c\x66\x03\x8a\x09\x66\x03\xfc\x09\x66\x5f\x8d" + "\x69\x56\xb2\x9e\x09\x3d\x40\x72\xfd\x2f\x4f\xba\xd1\x31\x2f\x9f" + "\xc7\x6d\xe0\x88\xf6\xa3\x1d\xc3\x4b\xbd\xc7\x6d\xe0\x90\xd6\xb5" + "\xe3\xc0\x9e\xf2\x71\x0b\xaf\xe1\xb5\xe3\xc0\x70\x1e\xb7\x81\x3a" + "\x82\x5b\x78\xb1\x6f\xda\x71\x60\xab\xdf\xbf\x8a\x69\x47\x77\xdc" + "\x1e\x36\xb6\x1f\xfd\xf8\x70\x86\xf7\xb8\x3d\x7c\xa5\x75\xfd\xf8" + "\xf0\x29\xf9\xb8\x3d\x9c\xcb\xeb\xc7\x87\x0d\x3c\x6e\x8f\x44\x12" + "\xdc\x1e\xd6\xf9\xa6\x1f\x1f\x96\x5c\xff\xcd\x93\x7e\x74\xc7\x2d" + "\xa2\xa0\xfd\x68\xc8\x88\x11\xde\xe3\x16\xb1\xb3\x75\x0d\x19\xf1" + "\x8e\x7c\xdc\x22\x26\xf3\x1a\x32\x62\x2b\x8f\x5b\x44\x2d\xc1\x2d" + "\x22\xd2\x37\x0d\x19\xb1\x5f\x89\x86\x74\xc7\xed\xd1\x84\xf6\xa3" + "\x23\x07\x19\xbd\xc7\xed\xd1\x69\xad\xeb\xc8\x47\xe5\xef\x59\x4c" + "\x3f\x1a\xc0\xeb\xc8\x47\x63\x79\xdc\x1e\xcd\x27\xb8\x0d\xaa\xf5" + "\x4d\x47\x3e\xda\xea\xfa\x1f\x62\x3a\xd2\x1d\xb7\xc8\xd0\xf6\xa3" + "\x25\x07\xcb\xd0\xff\x91\xae\xfa\x5f\x44\x4b\x0e\x56\xa0\xff\x07" + "\x97\xf0\x5a\x32\xd2\x49\xff\x47\x72\xfa\x7f\x70\xbe\x6f\x5a\x32" + "\xd2\x1b\xfd\xef\xa6\x25\xdd\x71\x1b\x52\xd5\x7e\xf4\xe4\x90\x04" + "\xef\x71\x1b\x72\xa2\x75\x3d\x39\x44\xfe\x3e\x50\xf4\x90\x54\x5e" + "\x4f\x0e\x29\xe6\x71\x7b\x4c\x4d\x70\x1b\x12\xe7\x9b\x9e\x1c\x22" + "\xb9\xfe\xa3\x03\x37\x9b\xba\x41\xc7\x88\x8c\x43\x96\x27\x8d\x20" + "\x6b\x13\xd2\x43\xf3\x6d\xc1\x0d\x3a\xb9\xfb\xbb\x38\xd6\x9c\x3e" + "\x91\x84\xd0\x45\x7a\xe8\x48\x9f\xd6\x9d\xa6\x1f\xbf\xe2\xf3\xba" + "\xd3\xf4\xe3\x9f\xdd\xb6\xfd\x5d\xe8\xc7\xb7\xcb\x5e\x77\x9a\x7e" + "\x3c\x89\xd7\xa0\x8f\xef\xe5\xb1\x1e\xca\xce\x4f\x90\xb5\x1e\x35" + "\xfd\x78\x84\x4f\xeb\x51\xd3\x43\x87\x10\x7e\x3d\x56\xc7\xae\x47" + "\x4d\x0f\x0d\x6f\x93\x7d\x5f\xe8\xc7\xb6\xe2\xf5\xa8\x99\xf5\x65" + "\xc9\x8a\xd6\x47\xa6\x87\xee\xf5\x82\xcf\x16\x46\x64\x8c\x96\xe7" + "\xf3\x13\x5a\xe0\xb3\x45\xee\x3e\x33\x42\x3e\x3f\xd1\xd9\x37\x3e" + "\x0f\x3f\xe0\x3b\x9f\x87\xaf\xbd\x6d\xfb\xcc\xd0\xc3\xe7\xc9\xe7" + "\xf3\xf0\x11\xbc\x36\x1f\x9e\xca\xf3\xf9\x89\x42\xf9\x7c\x1e\x66" + "\xf5\x8d\xcf\x4f\xf8\x11\x3e\x0f\x3b\x48\xf8\x3c\xdc\xd2\x26\xfb" + "\xcf\xd0\xc3\x92\x08\x9f\x2b\xf6\x2b\x5a\x7f\x9a\x7e\x22\xb5\x75" + "\x3e\x9b\x75\x8c\xc8\xf8\x35\xcf\xe7\x27\xc7\xd8\x82\xcd\x3a\xb9" + "\xfb\xdd\x08\xf9\x3c\xf2\x9c\x6f\x7c\x1e\xf9\x8e\xef\x7c\x1e\x39" + "\xe5\xb6\xed\x77\x43\x8f\x1c\x2d\x9f\xcf\x23\xfd\xf9\x98\x65\xe4" + "\x04\x9e\xcf\x4f\x66\xc8\xe7\xf3\x88\x32\xdf\xf8\x3c\xf2\x14\xe1" + "\xf3\x88\x4c\xc2\xe7\x91\xa5\x6d\xb2\x0f\x0e\x3d\x62\x04\xe1\x73" + "\x95\x55\xd1\xfa\xde\xf4\x93\x92\xeb\x1f\x3b\xf1\xd9\xc2\x88\x8c" + "\xed\xf3\x7c\x1e\xad\x06\x3e\x5b\xe4\xee\xbb\x23\xe4\xf3\x28\xdf" + "\xf6\xb9\xa0\x47\xf9\xbe\xcf\x05\x3d\xca\x87\x7d\x2e\x5c\xf6\xdd" + "\xa1\x47\x75\x95\xcf\xe7\xa7\xaa\xf9\x58\x6e\x54\x2f\x9e\xcf\xa3" + "\x63\xe5\xf3\xf9\xa9\x5c\xdf\xf8\x3c\x8a\xec\x7f\x41\x3f\x15\x4f" + "\xf8\x3c\x6a\x6b\x9b\xec\xc7\x43\x3f\xe5\x4f\xf8\xfc\xf5\x58\x45" + "\xeb\xa7\xd3\xa3\x7b\xb5\xce\x67\x8b\x8e\x11\x79\xef\xc1\xf3\xf9" + "\x19\x83\x2d\xd8\xa2\x93\xbb\xff\x8f\x90\xcf\xcf\x2c\xf7\x8d\xcf" + "\xcf\x0c\xf4\x9d\xcf\x4f\xdf\xba\x6d\xfb\xff\xd0\x4f\x5f\x90\xcf" + "\xe7\xa7\x0b\xf8\x18\xf7\x69\xa7\xf7\xff\x63\x34\xf2\xf9\xfc\xb4" + "\x6f\xfb\x02\xd1\xcf\x2c\x24\x7c\x7e\x9a\xec\x0b\x44\x3f\x93\xd4" + "\x26\xfb\x02\xd1\xa3\xab\x09\x9f\xcf\x66\x2a\x5a\x9f\x9e\x7e\xa6" + "\xce\x0b\x3e\x5b\x18\x91\x77\x42\x3c\x9f\x9f\x2b\x04\x3e\x5b\xe4" + "\xee\x43\x24\xe4\xf3\x73\xe3\x7d\xe3\xf3\xb3\x8d\xbe\xf3\xf9\xd9" + "\x63\xb7\x6d\x1f\x22\xfa\xd9\x7d\xf2\xf9\xfc\xac\xe3\xfd\x1f\xf8" + "\xe7\x67\x9d\xde\xff\x3d\x27\x7f\x7f\x22\xfa\xd9\x51\xbe\xf1\xf9" + "\xb9\x67\x09\x9f\xc7\x58\x09\x9f\x9f\x1b\xd1\x26\xfb\x13\xd1\x63" + "\x0a\x08\x9f\xff\x75\x46\xd1\xfa\xff\xf4\x73\xad\xce\xff\x10\x1b" + "\xdf\x70\x8c\x4b\xf1\x9c\x1e\xb7\xc6\xf7\x31\x8e\x71\xbd\x7d\xe3" + "\xf4\xd8\x72\xdf\x39\x3d\x76\xdb\xed\x1b\xe3\x18\x2b\x7f\xaf\x3f" + "\x7a\xec\x04\x7e\x8c\x63\xac\x9e\xe7\xf4\xb8\x12\xf9\x9c\x1e\xab" + "\xf6\x8d\xd3\xe3\xba\x13\x4e\xff\xba\x8a\x70\x7a\x5c\x40\xdb\x8c" + "\x71\xfc\x3a\xd5\xb7\x31\x8e\x71\x7a\x25\x63\x1c\xee\x9c\x8e\x8a" + "\xf3\x7d\x9c\xe3\xf9\x1b\xbe\x71\xfa\xf9\x9d\xbe\x73\xfa\xf9\x79" + "\xb7\x6f\x9c\xe3\xf9\x29\xf2\x39\xfd\xbc\x86\x1f\xe7\x78\x3e\x91" + "\xe7\x74\xd4\x56\xf9\x9c\xfe\x4d\x8d\x6f\x9c\x7e\xfe\x0a\xe1\xf4" + "\x6f\x76\x11\x4e\x3f\x6f\x68\x9b\x71\x8e\xdf\xc4\xfa\x36\xce\x11" + "\x95\xa8\x64\x9c\xc3\x9d\xd3\xbf\x8d\xf0\x7d\xac\xe3\x85\x63\xbe" + "\x71\xfa\x85\x25\xbe\x73\xfa\x85\x67\x6f\xdf\x58\xc7\x0b\x03\xe5" + "\x73\x7a\xbc\x89\x1f\xeb\x78\x61\x04\xcf\xe9\xdf\x26\xcb\xe7\xf4" + "\xf8\x22\xdf\x38\xfd\xc2\x21\xc2\xe9\xf1\x3a\xc2\xe9\x17\xf6\xb7" + "\xcd\x58\xc7\xf8\x30\xdf\xc6\x3a\x7e\x3b\x42\xc9\x58\x87\x3b\xa7" + "\x27\x22\xdf\xc7\x3b\xa2\xb7\xf9\xc6\xe9\xe8\xf1\xbe\x73\x3a\xba" + "\xfb\xed\x1b\xef\x98\x60\x93\xcf\xe9\x09\xfc\xfe\x17\x59\xd1\x4e" + "\xdf\xff\x4f\x1c\x23\x9f\xd3\x13\x32\x7d\xe3\x74\x74\x36\xe1\xf4" + "\x84\x09\x84\xd3\xd1\xeb\xda\x66\xbc\xe3\xb7\x16\xdf\xc6\x3b\x26" + "\xb6\xba\xfe\x85\xd8\x78\x87\x3b\xa7\x63\xcf\xf8\x3e\xe6\x11\x3b" + "\xcf\x37\x4e\xc7\xf6\xf6\x9d\xd3\x31\x57\x6e\xdf\x98\x47\xcc\x29" + "\xf9\x9c\x8e\xc9\xe5\xc7\x3c\x62\x9c\xe6\x3f\x4d\x0a\x91\xcf\xe9" + "\x98\x04\xdf\x38\x1d\x3b\x8b\x70\x3a\x46\x43\x38\x1d\x1b\xdf\x36" + "\x63\x1e\x13\xcb\x7c\x1b\xf3\x88\x35\x28\x19\xf3\x70\xe7\xf4\xef" + "\x0a\x7c\x1f\xf7\xf8\xdd\xb3\xbe\x71\xfa\xc5\x1b\xbe\x73\xfa\xc5" + "\x43\xb7\x6f\xdc\xe3\xc5\xdd\xf2\x39\xfd\xa2\x96\x1f\xf7\x78\x91" + "\x5f\xff\x9e\xfe\x5d\xad\x7c\x4e\xbf\x38\xd4\x37\x4e\xff\x6e\x24" + "\xe1\xf4\x24\x13\xe1\xf4\xef\x22\xdb\x66\xdc\x63\x52\xbe\x6f\xe3" + "\x1e\xbf\x73\x9b\xff\xb6\x78\xd6\xfc\x44\xcd\x82\xd9\xb3\x17\xcf" + "\x4a\xd1\x2c\x4e\x9e\xf3\xfa\xac\xd1\xfd\x1d\xbf\x47\x47\xea\xfa" + "\xeb\xba\xa0\xc4\x79\x33\x5f\x5d\xfa\x18\x7f\x31\x79\xd6\x7c\xf8" + "\xd3\x05\x25\xcd\x5c\x9c\xa4\x49\x59\xae\x9d\xa5\xc1\xbf\xe6\xbd" + "\xae\x85\x24\x0b\x52\xf8\x33\xd1\x4b\x92\x53\xe6\x68\x93\x67\x69" + "\xc6\x46\x3f\x3b\x68\xf2\xb8\xdf\x4d\x7e\xe6\x99\x2e\x08\x39\xed" + "\x23\xad\x61\x72\x42\xab\x80\x0f\xaa\xcb\xf4\xab\x93\x2a\x42\x11" + "\xda\x00\x3c\xdb\xb8\x08\xa9\xd7\x2f\x42\xaa\x77\x6e\x22\xff\x0d" + "\x37\x51\x80\x7d\xd3\x41\x8b\x66\x2e\x1a\xc1\x04\x0f\x2a\xde\x78" + "\x13\x85\xd8\xb3\xe7\x8e\x61\xb2\x67\x23\x63\xf0\x44\x23\x4e\xcb" + "\x04\x4f\xd4\xe0\xf3\x60\x57\x15\x93\x9d\x5c\x78\x91\x7e\x35\xd2" + "\x18\x1c\x53\x95\x7e\x05\x51\x4c\xe0\x64\xc3\xc7\x76\x23\x75\x24" + "\x05\xe1\x7f\x7e\x88\x9e\x52\x0d\x47\x09\xa2\x5f\x4a\x81\x63\x0d" + "\x1c\x55\x70\x58\x10\x3d\x15\xc1\x91\x0c\x47\x21\x1c\x06\x38\xea" + "\x10\x1d\x07\xe7\xe2\x42\xe0\xe8\x05\x07\x9c\x8f\x83\xb4\x71\x70" + "\x2d\xce\x42\xf2\x99\x06\xd7\xa7\x65\xc0\x51\x00\x47\x31\xa2\xa7" + "\x43\x9e\xd3\x73\x10\x3d\x43\x03\x7f\xf7\xc2\x51\x04\x07\x3e\x7f" + "\x1e\xce\xe1\xb4\x2a\x72\x6d\x46\x19\xa2\xe3\xfd\xe1\x08\x87\x63" + "\x2c\x1c\x3a\x38\x32\xe1\xd8\x0a\x47\x3e\x1c\x50\xbe\x78\x9c\x06" + "\x9e\xf5\x32\x5c\x7b\x19\x9e\xf1\xf2\x2e\x38\xac\x88\x7e\x25\x01" + "\x8e\xfd\x08\xea\x48\x8e\x57\xac\xfc\xff\xd9\x23\x2a\x68\xd5\x2f" + "\x0d\xc5\x0f\x5b\xa1\x8d\xbd\x34\x8c\x59\x8d\x68\x26\x3b\xa6\x4a" + "\xfb\x30\xf2\xbb\x4a\xbf\xe4\x57\xb9\x06\x7f\x4b\x3b\x1b\x15\xaf" + "\x68\xc2\xd7\xd9\x77\xdf\xe6\xac\x97\x90\x01\x69\xf5\xb8\x2d\xc9" + "\xe3\xd2\x4b\x88\xbb\x7f\x8c\xc1\xaf\xdb\x64\x7c\x3f\x93\x75\xb3" + "\x94\x49\x8f\xfb\x00\x7f\x33\x7b\x19\x6c\x84\xbf\xa9\x65\x32\x6f" + "\x8e\x65\x02\xea\x0e\x62\x7f\x50\xbc\x02\x97\x6b\xca\x39\xd2\x76" + "\xe0\x3a\x94\xcd\x18\x7c\xd0\x02\x6d\x45\x85\x7f\x03\x96\x46\x26" + "\xff\x21\x1d\xf1\x11\x2f\xe5\xe3\x74\x4d\xdd\xbb\xc6\xe2\x6b\x8d" + "\x3b\x2f\x69\x99\xfc\x5a\x54\x3c\xbf\x09\xd5\xd0\x53\xce\x42\xdd" + "\x28\xf0\x57\x14\xd3\xef\x92\xd6\xbe\xa5\x6b\xec\x01\xc0\x19\xa7" + "\xfb\x47\x5a\x2d\xfe\x7b\x06\x5f\x67\x72\x02\x43\xf1\x98\x4d\x71" + "\xda\x87\xe0\x43\xa7\x9c\x6b\xea\xfe\x50\x82\xe6\xc5\x20\xe6\x22" + "\x29\x1b\xa4\x7b\x29\xd9\x51\x96\xa6\xe0\x43\x08\xe7\xcf\x68\xc2" + "\x34\x70\x4d\x65\xcf\x9e\x68\x84\x72\xf8\x5d\x87\xfb\x18\x28\x63" + "\xf1\x8b\xf8\xb9\x53\x67\x41\x59\xa9\xf4\x49\x90\xf7\x87\x61\x9a" + "\x4f\x56\x58\x28\x7c\xcd\xae\x3f\x68\x01\x3e\x07\x30\x59\xbf\x33" + "\xbd\xdf\x0d\xa9\xf2\x36\x21\xb4\x63\x13\xf2\x37\x67\x4d\x8d\x37" + "\xd0\xd5\xa3\x88\x9f\x9a\x52\x4d\x41\x1a\x03\x3d\x15\xb8\x1c\x53" + "\xc5\x3e\x2b\xc4\x3f\xdf\xc3\xb3\xf6\xb4\x3c\x6b\x8b\x7f\x3e\x7e" + "\x16\xb1\xd1\x41\x0b\xf9\x4b\xf2\xb0\xe7\x5f\xd6\x60\xfb\x61\xdb" + "\x39\xf2\xb0\x67\x3b\xf2\x78\xe9\x04\xbe\x1f\x9e\x99\xcb\x7c\x78" + "\x59\x63\xdf\x12\x94\x0f\x75\xd6\xe1\xeb\x41\xab\x90\x89\x81\xbf" + "\xf8\xf9\x04\x0b\xb0\x3d\x95\x81\x70\xfe\x0c\x77\x8e\x81\x73\x70" + "\x6f\x8d\x7d\xb5\x06\xe1\x7e\xa4\x8e\x8e\xdb\xcc\x6c\x4a\xae\x66" + "\x02\xea\xf5\x04\xe3\xb8\xd1\xcb\xab\x18\x3b\x1c\xb6\xc1\x55\xc8" + "\xaf\xf8\x45\x8c\x6f\x5c\xbc\x66\x62\x27\xb0\x71\xdc\xcb\x2d\xb6" + "\xed\x1b\x16\x0a\xf6\x51\xe7\x75\x83\xf6\xfc\x76\xc0\x28\x86\xd2" + "\x20\x8c\x0f\xb6\x15\xd8\x09\xc1\x79\x7f\xcc\x53\x73\x56\x5c\xa6" + "\x8b\xbd\xd4\x2f\x4c\x4a\x67\x06\xc7\xe2\xbc\x4d\x38\xef\x29\x46" + "\xe8\x5b\x1d\xf8\x42\xfa\x83\x06\xbf\x80\x14\x9c\x5e\xd3\x8f\xe5" + "\xdc\x39\x82\x2b\xe1\x16\xb6\x1f\xd3\x3d\xb4\x0a\xff\x9e\x32\x10" + "\xa9\x83\xaa\x10\xa5\x49\x0b\x2b\x22\x5c\x08\x0c\x75\xe4\xc3\xd6" + "\x71\x53\x53\x86\x6d\x35\xf4\x8b\x2d\xfc\x9b\x36\xc2\xb6\xa1\x7e" + "\x1d\xa4\xab\x6a\xdc\xdc\x29\x9f\xc9\xac\x5f\x87\xbf\x15\xbf\x48" + "\x4f\x63\xe7\x40\x31\xab\xfd\x11\x6b\xa3\x0d\xf5\x99\x69\xc9\x8c" + "\x31\xed\x06\x3c\xab\x47\x60\xd5\x3f\x96\x1a\x01\xaf\x4e\xf9\x98" + "\x0f\x07\x1a\x2c\x14\x5e\xbf\x0f\xfc\x50\x8f\x1d\x50\xd7\xed\xc0" + "\x09\xa8\x2b\xc2\xf9\x9a\xb3\xa6\xe9\xf8\xba\x4e\xeb\x85\xb9\x01" + "\xcf\xc8\x27\xcf\x86\x7c\x57\xc3\x33\x36\xd4\xe7\x43\xba\x7c\x83" + "\xdf\xdf\xcb\x1c\x36\x61\x9f\xcd\xa7\xe3\xda\xd2\xb4\x1c\x63\xd7" + "\xfa\xfc\xe6\xa5\x4c\xd5\xc6\x6f\x20\xff\xd5\x88\x69\x6a\x60\xca" + "\x52\x63\x19\x0b\x34\x6f\x54\x96\x70\x1e\xa5\xcf\x44\xbd\xee\x5b" + "\xc5\x80\x56\x41\x41\xf7\x9d\x0f\x62\xca\x63\xcf\xb3\xfb\x18\xa4" + "\x56\x31\xb5\x15\xda\x83\x28\xf5\x12\x0a\x58\x39\x07\x85\xa4\xc7" + "\x42\x5d\xca\x18\x4b\xa5\xee\x3c\xaa\x30\xc1\xa1\x2d\x87\x74\x67" + "\xe1\x38\x88\xd2\x97\x23\xd5\x44\xe8\xa3\xd2\x6e\xa1\x80\x0a\xed" + "\x2d\x38\x77\x0d\xa5\x26\x30\xd6\xf2\x32\x9c\xee\x18\x8a\xb1\x1a" + "\x83\x56\x5e\x03\x4c\x5f\xc2\xdf\x5f\x5f\x40\x79\x50\x96\xa6\xe0" + "\xb9\x91\x8d\xd9\xc9\x45\xf5\x4b\x19\xab\x39\x6b\x7a\xb2\x01\x8d" + "\x8a\x14\xd4\x05\x97\xb9\x09\xe1\x35\x04\xfc\x70\x1a\xfb\xe6\x8e" + "\xfa\x57\xad\xd8\xbf\x4c\x4f\x00\x8d\x80\x1c\xd7\xf1\x35\x63\xf7" + "\x8e\x7a\x38\x9f\x19\x63\x65\xcc\xd8\x3e\xb8\xde\x60\xa3\x5c\xae" + "\xfe\xb9\xb4\x16\xa9\xe0\x19\x55\x06\xbf\x7f\x14\xe0\x67\x40\x9e" + "\x1d\x81\xef\x89\x98\x1b\xdc\xb5\x3a\x83\x5f\x91\x91\xe7\xcb\xd4" + "\x02\xe0\x48\x47\x47\x59\xcc\x59\x33\x02\x0c\x7e\x07\x2c\x4e\x7c" + "\xc2\xfc\x68\xb9\xce\xf5\x57\xd8\x37\x25\xdb\xb1\x6f\x0d\xa8\xd3" + "\xdb\xba\x07\x6a\x98\xe0\x43\x7a\xa6\x3e\x34\x80\xa1\x18\xcb\x44" + "\x2b\x63\xb1\x67\x37\x56\x41\x9f\x14\x50\x69\x35\x21\x92\x7e\xc6" + "\xa7\x4c\xf6\xa1\xad\x64\xbe\xe7\x8c\x6d\x38\x4f\xd0\x21\x63\xb2" + "\x6e\x22\x35\xb0\x94\xf5\x7f\xf6\xec\xe3\xea\xac\x45\x28\x84\xd9" + "\x1c\xa8\xb6\x77\xef\x1c\xd9\xb8\xf3\x21\x2d\xf6\xb1\x98\xbf\x8c" + "\x1e\xee\xe5\xf2\x81\xe7\x76\x30\xd0\x33\xb4\x76\xb8\x9f\xd1\x37" + "\x72\xe5\x21\xfe\x90\xf8\xd1\x19\x5a\xa6\x2f\x5c\xcb\xac\xcb\x81" + "\x6b\x1d\x2e\xd2\x33\xac\x70\x1e\xc1\xef\xb2\xe2\xb4\x9b\x90\x36" + "\xde\x8f\x70\xa8\x4e\x2f\xf8\x4d\x61\x7b\x4e\x35\xe1\xf6\x4f\x34" + "\x63\x7c\x5f\xbe\x4d\xb3\xf5\xa5\x88\x9f\x6c\x34\x98\xb3\xe2\x87" + "\x1a\xfc\xba\xef\xe7\x6c\xec\x67\x62\x7d\x12\xf8\x95\x9d\x0f\xe9" + "\x8e\xc6\x22\x74\xb4\x0c\x21\x48\x13\x67\xf0\xfb\x45\x29\x6f\xcb" + "\xf8\x85\x38\x2d\x5b\x4e\x68\x9b\xf6\xd5\x5c\x1f\x00\xf7\x40\xbb" + "\x29\xc6\x3e\x87\xf8\xb6\xf8\x64\xec\x77\xa0\xdd\x85\x73\x7e\x1f" + "\xce\xc5\xa9\x98\x6e\xbf\xc2\xe5\xca\xb8\xc8\x95\xc5\xb9\x6c\x0e" + "\x3f\xc3\x64\x0f\xd0\xb1\x69\x03\xeb\x0b\xe0\xf9\xd5\x06\xbf\xd0" + "\x7c\x67\xae\x91\x7a\xbd\x1c\x3d\xb8\x0c\xfe\x0f\xba\xc3\x91\x17" + "\xb4\x55\x7f\x68\xa3\x8f\x62\x4e\xe1\xf6\xb9\x6d\x13\xd6\x12\x03" + "\x32\x1a\xb3\x07\x40\x3b\x7d\x59\xe3\x68\xa7\xf6\xa5\x4c\x35\xe0" + "\x8a\xec\x0d\xcc\x99\x8d\x80\x65\x8c\x8d\x66\x5e\xb5\x45\x20\xd0" + "\x98\xd6\x3c\x38\x9f\xb7\x14\x6b\xb4\xe9\xf1\xd0\x96\xfd\xc5\xd3" + "\xaa\x10\x4e\xc7\xa6\xe7\xd2\x36\x05\x0f\xc8\x60\xcb\x4c\xd1\x76" + "\x28\x9f\x9f\xa3\x4c\x4d\x5d\xeb\x73\xe0\xd9\xb9\x06\xbf\x4e\x1a" + "\x41\x7b\xc9\xfa\xb1\x90\x61\xe2\x30\xaf\x68\xa8\xcb\x11\xf8\xdb" + "\x89\xe3\xf1\x7d\x47\x41\x83\x8e\x8d\x86\xb6\x02\x78\xbf\xdf\x83" + "\x31\xc2\xfd\xe7\x0d\x28\x41\x85\xef\x5f\x0f\xbf\xf1\x79\x9c\x06" + "\xce\x9b\xe0\xbc\x89\xe4\x1b\xe7\x8f\xf1\x13\xe6\xfb\x4a\x4f\x92" + "\x2f\x5b\x96\xfb\x70\x9e\xf8\x3e\x9c\xe7\xf6\x2d\x4c\x1d\xce\xc7" + "\x9c\xf5\xca\x08\x47\xde\x1b\xe0\x9c\x23\xff\xb1\xf3\x1c\xcf\x78" + "\x05\xc4\x52\x42\xaa\x73\xd9\xb7\x6d\x61\x4c\xa4\x5c\xaf\xa4\x18" + "\x50\xd2\x79\x7c\xed\x1d\x38\x87\xef\x25\x1c\x79\x25\x1b\xf3\xc7" + "\x40\xea\x43\x13\x1e\xbd\x92\x6f\x40\xbf\x4f\x74\xf6\xf1\x80\x53" + "\x57\x82\x77\x4c\x15\x97\x5f\x89\x23\x3f\x3e\x2f\x92\x07\xa3\x0f" + "\x4f\xe2\xda\x08\x6e\xcb\x01\x38\x7f\x48\x0f\xf5\x7f\x6d\x2f\x29" + "\xdb\x54\x93\x89\x70\x1e\x6c\xcf\xde\x43\xf8\x90\x35\x79\x94\xa3" + "\x2f\x07\x2c\xf4\xe6\xac\x57\xc3\x5d\xfa\x26\x7f\xcc\x17\xce\x1f" + "\xf8\xe1\xb2\x38\xea\xc9\xf6\x27\x5b\x02\xc7\x40\x3e\x2a\x7b\xd6" + "\xe4\x89\xb8\x8f\x7b\xaf\x07\x53\x0b\x79\x24\x3b\xf2\x80\xfb\x55" + "\x60\xaf\xa7\xe1\x5c\x86\x01\xcd\x67\xeb\x97\x05\x69\x0c\xf4\xe4" + "\x0c\xa9\xb8\x33\xad\x2f\xa2\x2a\x73\x0d\x38\x7e\xc3\xed\x75\x54" + "\x65\x2f\x13\xaa\xcc\xb5\x23\xfb\x87\x97\xf3\xc7\xa4\x31\xc5\xa0" + "\xa3\x6d\x15\x96\x5a\x99\x31\xc1\xab\xec\xf8\x17\xd3\x04\x71\x46" + "\xea\x63\x08\xf7\xeb\xd7\xe9\x99\x83\x2a\x8d\x37\x59\xdf\x05\xff" + "\xef\x89\xaf\xbf\x07\x71\x09\x8e\x4d\x20\xfe\x4c\xd2\x53\x24\x3e" + "\xb1\x43\xda\x1d\xf8\x3c\x8e\x5d\x20\x6e\xca\x73\xba\xc6\x7c\x78" + "\x49\x43\x6c\x93\x70\x89\xed\xcb\x70\x79\xad\xcf\x17\xe3\x32\xdb" + "\xf3\x2f\x69\x70\x1d\xd2\x75\x8c\xbd\xd2\x6a\x2e\xae\x30\xd9\x90" + "\x66\x29\x8e\xab\x12\x8e\xc4\x6c\x47\x0c\xf8\x36\x99\xb1\x61\x02" + "\xfb\xfd\x23\xc4\x9e\xd7\x8d\x7d\x2f\x69\xd2\x6d\x88\xda\x98\xd6" + "\xc1\xff\xd7\xb9\x4c\x71\x7d\xbf\xcb\xd0\x87\x26\xd4\x1c\xd1\x21" + "\x24\x5f\xe3\x26\xd4\x38\xea\xbe\x83\xab\x3b\x9c\x63\xbf\xd9\x1b" + "\xbc\x35\x83\xad\xaf\x81\x9e\x29\x39\xd7\x87\x59\x1d\xc4\x1c\xcd" + "\xb5\xa2\xc5\xb9\x4c\xd3\xe2\xed\x88\xb2\x6d\x6a\x56\x7f\xb2\xa3" + "\x1a\xfb\xe9\x31\x0e\x7b\xb2\xb6\x83\x98\x5b\x9b\x86\xd4\x57\xe9" + "\x99\xc7\x62\x52\x33\xd8\x7d\x8a\x3e\x87\x74\xf2\xca\x3a\x93\x7d" + "\xff\x57\x01\xb1\x6c\x8c\x35\x9d\x21\x7d\xcd\xcc\x6b\x13\xb9\xfc" + "\xf0\x35\x07\x7e\x3b\xb8\x18\x53\xc1\x33\x24\xf7\x7f\xf2\x50\x57" + "\xb5\x78\x5d\x5f\xfb\x54\x79\x5d\x5f\x4b\x75\xaf\xeb\x6b\xe7\x6e" + "\x6f\x5d\x5f\x93\x1c\xff\xf1\x50\x57\x8d\x78\x5d\x5f\xdf\xae\xbc" + "\xae\xaf\x27\xb9\xd7\xf5\xf5\x63\xb7\xb7\xae\xaf\x97\x29\xa8\x6b" + "\xa4\x78\x5d\x13\xdf\x51\x5e\xd7\xc4\xc9\xee\x75\x4d\xfc\xf4\xf6" + "\xd6\x35\xb1\x48\xb2\xae\x54\x10\x83\xfd\x13\xf8\xa5\xa6\xb4\x46" + "\xd0\x68\x5b\xd4\x85\x2b\x77\x22\xaa\xcc\x64\x41\x15\xbd\xaa\xb1" + "\xfe\xa5\x1e\xd5\x82\xdf\x5b\x8d\x46\x31\x9b\x0e\xa9\x2b\x72\xeb" + "\xe0\xfc\x65\x54\xae\xb3\xa0\x31\x8b\xb0\xff\x9d\xb5\xb2\x32\x51" + "\xae\xff\x9d\x15\xd5\xe2\x7f\xad\x8f\x71\x3e\x77\xf6\x9e\x8a\xba" + "\x26\x84\xeb\x0f\xff\xdf\xdc\xe2\x7f\x57\x13\x7b\xbb\xfa\x5f\x6c" + "\x8f\x4a\x8b\x45\xe0\x7f\xc9\xb7\x4a\xb3\x67\xba\xfa\xde\xac\xab" + "\x08\x89\xfb\xde\xd9\xa3\xb1\xef\xdd\x01\xd7\xe5\x95\x7f\xb6\xbf" + "\xc3\xf7\xea\xe1\x99\xce\xbe\xf7\x68\x22\xee\x6b\x67\x27\x28\xf3" + "\xbd\xb3\x13\x1c\xf5\xde\xce\xd5\x1b\x6c\x55\x22\xf4\xbd\xb3\xb7" + "\x7a\xc3\x5b\x66\x53\x43\xe4\x27\x7d\x2c\x1d\xec\xf9\x3f\x24\xe0" + "\xfe\xcd\x0c\x36\xf9\xfb\x0e\x8b\xea\x32\xfd\x7b\x76\xad\xe2\x7a" + "\x73\xa2\x1f\x93\x7f\xd9\x3f\x26\x85\xf9\x8e\xe9\xfb\x43\x02\x1e" + "\x2f\xc4\xb1\x34\x5c\x8f\x66\x76\x5e\xf6\x97\x57\x6e\x92\x27\xf3" + "\x61\x4d\x7e\x1a\xb4\x97\x4f\x96\x5a\x28\xfb\x9b\x71\x41\x80\x83" + "\x9a\xc9\x6e\xd2\x32\x6f\x3f\x18\x5a\xbf\x39\x28\xe3\x58\xf8\x25" + "\x84\xd3\x32\xab\x54\xa3\x7c\x28\x7f\xb5\xe7\xf2\x27\x75\x55\x50" + "\xfe\x6a\x19\xe5\xaf\xf6\xaa\xfc\xdd\xa0\xfc\x4d\x23\x3a\x40\x5c" + "\x47\x7d\xde\x34\x42\x25\xaf\x3c\x49\x49\x5e\x61\xec\xdb\x33\xbc" + "\xf6\x7f\x4c\x8f\x4e\x9a\x4f\x76\x18\x29\xf0\x01\x6c\x1f\x8e\xdb" + "\x1e\xf1\x7f\xb5\xe0\xb3\xbe\x63\x88\x4f\x32\xca\xf4\x49\x73\x24" + "\xe7\xbf\xbb\x3d\xbf\x5b\xb3\xfe\x0e\x3c\x5f\xba\xfe\xae\x3e\xf1" + "\xa3\xda\x0c\x69\x9f\xd8\xa4\x77\xf7\x89\x73\xb3\xe5\xfb\xc4\xb9" + "\xf1\xee\x3e\xf1\x8d\x43\xbc\x4f\x7c\x63\x8f\x72\x9f\xf8\xc6\x12" + "\xef\x7d\xe2\x1b\x93\x94\xf9\xc4\x37\x7a\x79\xf6\x89\x6f\xa4\x28" + "\xf3\x89\x6f\xa4\xb8\xfb\xc4\xb9\xd5\x42\x9f\xf8\x86\xe4\xb7\x6e" + "\x4c\xe6\xb7\x3a\xe8\xa3\x03\xae\xd2\xc9\xa9\xd6\xd5\x10\x9b\xea" + "\x7f\x57\x1b\x63\x63\xcc\xcc\x86\x6f\x75\x76\x6a\x28\xf6\x2b\x63" + "\xcc\xe6\x24\x7f\xfb\xb2\xf0\x00\x26\xb0\xee\x69\xa6\x39\x14\x81" + "\x9d\xc2\xa0\xfc\x41\x8c\x39\x3c\x90\x59\x16\xde\x2d\xb7\x01\x85" + "\xc0\x11\x9a\xcb\xf5\xc7\xf0\xff\x48\x66\x59\x68\x97\xac\xa5\x28" + "\x22\xc8\x84\xfc\xa1\x0c\x71\x41\xab\xd4\x08\x7c\x50\x08\xfe\x3f" + "\xb3\x7a\x37\xca\x6b\x40\xaa\x20\x1d\x60\x13\x0c\xcf\xd3\x05\x31" + "\xcc\xe2\x70\x94\xb7\x08\x62\x64\x0a\x85\xee\xa0\x98\x42\xab\x39" + "\x9c\xb2\x85\x04\x46\x12\x7c\xe6\x45\x32\x3d\x02\xc7\x30\x39\x5d" + "\xad\xf6\x1e\x5d\x6b\x6c\xe9\x49\x34\xf3\x66\x1c\x8d\xcb\x6a\xcb" + "\xe9\x6a\x60\xb6\xc0\x91\x9e\x14\x88\x35\x34\xc4\xd0\x91\x8c\x39" + "\xb4\x0b\xc4\xd7\x11\x3b\x96\xa2\xb0\xed\x0d\x28\x9c\xa9\x0f\xa7" + "\x00\xff\x38\xbc\xdf\x27\xd8\x28\xce\x4e\xed\x46\x70\x4d\x85\x7d" + "\x22\x83\x9f\x6f\x85\xe7\x37\xc3\xf3\x9b\x30\xb7\x51\x68\x1e\x3c" + "\xdf\xb6\x2c\x5c\x66\x7b\x49\x66\xd7\x7f\x70\x94\xcb\x1e\x6e\xcc" + "\x60\x3e\x82\x03\x97\x0b\x6c\x98\x87\x6d\xf2\xb0\x71\x0d\x2e\xdb" + "\x86\x06\x14\x01\xe5\x0c\x83\x32\x84\xc3\x73\xf1\x5a\x29\x71\xaf" + "\x2c\x54\x63\x8e\x0a\xca\x66\xcb\xe6\xca\xf6\x13\x94\xed\x3a\x5f" + "\x36\xfc\x2c\x6c\x1f\xa9\xf7\x90\x31\x2b\xfb\xe0\xb6\xf9\x43\x90" + "\xae\x53\x14\x7e\x27\x59\xff\x66\x92\x4c\xae\xce\x2b\x95\xe2\xcb" + "\xc6\x8f\x51\x2f\x46\x1d\x5d\x3b\x71\xed\x77\x4c\x0c\xd4\x78\xed" + "\xc7\x28\xa2\x12\xda\x75\x85\xe5\x1a\x62\x82\xa3\x6b\x8f\x85\xd7" + "\xc9\x7c\xd6\x7c\xc9\xfd\xdf\xd7\xaf\x66\xaa\xec\x21\x81\x1a\x26" + "\x24\x48\xb7\x71\x35\xa3\x6b\xd6\x5c\x1a\xd3\xa4\xb9\xac\x7e\xd5" + "\xaa\x06\x5e\x33\x3a\xcd\x22\xa4\xb9\x4c\xa7\x2c\x3f\x79\x06\xe2" + "\xd2\xe9\xc8\xff\x22\x9d\x52\x98\x7e\x0e\xbf\xe3\x99\x5f\x22\x7c" + "\xc7\x33\xbf\x16\xd1\xda\x38\x44\x2f\x4c\x42\xf4\xa2\x4c\x04\xe9" + "\x84\xc7\xe2\x02\x92\x97\x76\x58\xcc\x9e\x3e\x28\xcd\xca\xfc\xc0" + "\xe8\x0f\x47\x65\x51\x8c\x25\x66\xa0\x9f\xa1\x78\x29\x7e\x37\xa2" + "\x1d\x04\x36\xfd\x11\xfa\xda\xa0\xcb\xf4\x82\x46\xc0\x14\x69\x17" + "\xa1\xfb\xaf\xd2\x0b\x2c\xb8\xdd\x04\x99\x3a\x45\xd9\xd2\xe3\x90" + "\x55\xf3\x90\xb6\x39\x27\x50\x6d\xd3\x37\x56\xd9\xd5\xbf\xab\x4d" + "\xbf\x82\x7a\xe1\xf7\x8f\xd0\x36\xe2\x5e\xb5\xf9\xe3\xf6\x18\x57" + "\xfc\xda\x49\x74\x39\x05\x51\xe9\xb7\x50\x57\xe0\x66\x4b\xbb\x8a" + "\xae\x0b\xb2\xac\xac\x63\xec\xb8\x6d\xe1\xb1\x52\xb8\x16\x98\x76" + "\x0b\xe2\x7b\x63\x2d\xca\x5d\x84\x42\x6c\x8b\x93\xba\x19\xeb\x93" + "\xee\xff\xc0\x8e\x42\x02\x4d\x48\x9d\x7b\x13\x38\xb5\x18\xf8\x74" + "\x13\xda\x99\x91\xb4\x33\xfc\xbd\xfb\x0e\xdc\xc6\xd6\xff\x71\x68" + "\xde\x4d\xd2\xc6\x58\x1e\xe1\x36\xb6\x00\x78\x34\x9f\x1d\xa3\x08" + "\x05\xfb\x15\x5a\xa1\x5d\x30\x59\xf3\x0a\x72\x57\x33\x68\xe5\x1c" + "\x44\xe5\x5d\xed\xc4\x8e\x5f\x74\x18\x48\x69\x4e\xc6\x5a\x10\x3f" + "\x96\x91\xf2\x69\x53\xdf\xcb\x6a\xcd\x8b\xcc\x4f\x17\x69\x6d\x18" + "\x9c\xf7\xd7\xbc\x34\x40\x0d\xf6\xfe\x94\x8c\x6d\xa4\x14\xe2\xb1" + "\x4b\x03\xd8\x02\xdb\x45\xf3\x22\x1a\x70\x91\x9e\xdf\x88\xed\xb8" + "\xac\x00\x2c\xff\x34\x53\x03\xf6\x43\x64\x7c\x76\x3e\xbb\x56\x2e" + "\x7e\xc7\xfd\x15\xfb\x4e\x8a\xdc\x63\x03\xbb\x59\xd5\x87\xb6\x02" + "\xde\x63\x8a\xe7\x36\xb1\x7e\x08\xdb\xf1\x72\x32\xa2\x5e\xad\x03" + "\x5b\xd9\xc0\x56\xe6\xf0\x00\xf0\x47\xb1\xd8\x1f\x31\x99\x75\x23" + "\x52\x0d\x8c\x3d\x26\x91\x66\xd2\x16\x22\xff\x4a\x9d\x0d\xbd\x02" + "\x8f\x58\x79\x0d\xec\x65\xaa\x46\xe0\x97\x02\xc1\x67\x75\xdb\xbe" + "\x14\x85\x60\x7b\x75\xad\x03\xad\xb2\x29\xc6\xf0\x71\x5a\x69\x07" + "\x1b\xf0\x17\xfb\xa7\xa0\x55\x7e\x9d\xa1\x9d\x05\x66\xe2\xf6\x08" + "\xed\x33\x68\x15\xeb\x2f\xe3\x72\xa1\x1d\x5a\x97\x85\xf7\x6b\x5e" + "\x16\xae\x81\xa3\x8f\xc3\x87\x39\xfc\x07\x93\x35\x5f\x8d\xfd\x57" + "\xa5\xce\x80\xac\x60\xdb\x40\xdc\xd7\x2d\x0b\xef\xc5\xda\xf8\xf7" + "\xe1\x68\xb0\x05\xf9\x41\x99\xd4\x50\x5e\x94\x37\x1b\xf9\x97\x27" + "\x5d\x44\x36\x68\x1b\x0e\xbb\x47\xcf\xd1\x20\xc8\x97\x3a\x16\x7e" + "\x16\x71\x36\xf3\x93\xe6\xdd\xa2\xb5\x3c\xef\x16\xad\xc5\xb6\x23" + "\xbc\x5b\xb4\xe6\xe7\xc8\xbb\xaf\xe2\x58\xde\xd1\xcd\x7d\x31\x9f" + "\xb4\xd0\xd7\xff\x05\x6c\xb4\x48\x8b\x39\x82\x39\x73\xe2\x23\xcc" + "\x99\xc5\x5b\xdb\x2b\x67\x1a\xcd\xe1\x1a\x38\xee\x08\x67\x20\x5f" + "\x96\x33\xd8\x56\x5f\xc5\x35\x21\x87\x8d\xd8\xb6\xaa\x8f\xae\xd5" + "\xa4\xa3\x67\xa0\xad\x16\x06\xad\xea\x83\xca\x59\x3b\xa5\x14\x6a" + "\x5e\x62\xec\x17\xe9\xc5\xa7\xd2\x4f\x21\x75\xd3\x6a\x86\xa9\xb4" + "\xee\x43\xf6\x90\xce\x91\xec\x7b\x3e\xfd\x71\xa8\xdf\x41\x0b\x83" + "\xdf\x9f\xaf\x06\xcc\xb4\x78\x8c\x7b\xa2\xd1\xb6\x39\xb4\xca\x9e" + "\x3d\x51\xc3\x04\x27\x17\xda\xa0\x5d\xdb\xb3\x07\x15\xdb\x83\x67" + "\x83\x46\x49\x09\x35\xa0\x92\x30\xf6\xbd\x6e\x4e\x20\x1e\xcb\xc3" + "\xfe\x97\xfd\xde\x03\xbf\x5f\x87\xeb\x23\x1c\xef\x8d\xb1\x4f\xe0" + "\xde\x29\x70\xef\x1c\x52\x30\x86\x5d\xf0\x3b\x07\xce\xa7\x0c\x74" + "\xbc\x73\x70\xfc\xc6\xd7\xe1\xbe\x08\x3c\x6e\xea\x74\x5f\x01\x97" + "\x8e\xbb\x6f\xfe\x3e\xec\xeb\xf9\xfb\xc8\x6f\xf0\x2b\x05\xcd\x14" + "\xf2\x17\xd5\x38\x21\xa1\x55\xd0\x7e\x20\x36\x5a\x3a\x10\xfe\x52" + "\x97\xe9\x25\xe3\xe1\x2f\x0d\x7f\xd9\x71\x4c\x79\xfd\x55\x4a\x0d" + "\x79\xef\x13\xb4\x8b\x2b\xf7\x25\xb6\x4d\x3e\x8c\xba\x5e\xe5\xfe" + "\x6f\xce\x5a\xd2\xf2\xfe\xbb\x25\x3d\x8f\xcf\x79\xfc\x6c\xc0\x48" + "\x45\xde\xc9\x93\xdf\x78\x6e\x0a\x97\x1f\xfb\xdb\xae\xa9\x45\xc5" + "\x69\x17\x51\x1d\xbd\x64\x6f\x25\xf4\xe1\xf6\x2d\x41\xbb\x36\x36" + "\x40\x1b\xd0\xb5\xf8\xe4\x4b\xd0\x16\xfd\x8b\x57\xb0\x69\x36\xb0" + "\x3a\x37\xa7\x63\x3e\xb3\xe9\xb0\x1a\xc7\x82\x66\x26\xe9\x69\xee" + "\xef\x68\xdc\x9e\xc8\xb8\xc9\x92\x46\x06\xb0\xc5\xfb\x95\xb7\xcc" + "\xd7\xc1\xfb\x88\x67\xa8\x7a\x1d\x49\x25\x7d\xa5\xa3\xbc\x78\xaf" + "\x71\x3c\x1f\x66\x40\x06\xca\x30\x8b\xec\x35\xce\xcf\x9b\x59\x52" + "\x63\xdf\xdc\x31\xdf\x9c\xb5\x74\x28\x60\x90\xe2\x5c\x67\x31\x2c" + "\x0c\xf4\xd2\x58\xa9\x6b\xf2\x70\x58\x2a\xb9\xfe\xcf\xb8\x70\x1b" + "\x23\x33\x2f\xe9\xf1\x1f\x4d\x4d\x7e\x4c\x81\xad\xd8\xde\x1c\x17" + "\x74\x2c\xf5\x9a\x4c\x6d\xb3\x4c\x2d\x95\xaf\x2d\xa7\x73\x54\x73" + "\xbf\x9a\x7c\xfc\xfe\xc1\xb6\x20\xee\xf9\x8a\x02\x2b\xda\x33\xbf" + "\x96\xc2\xfe\x70\xef\xd5\x42\x2a\x66\x20\xa7\xe1\x6a\x90\x1a\x8f" + "\x7b\x61\x2d\x97\x75\x1d\x85\x35\xa5\xc7\x05\x35\x35\xc7\xa1\x77" + "\xaf\xa3\x51\xf6\xdf\x87\x76\xc9\x9c\x8d\x54\x8d\xe0\x0b\x1b\x7f" + "\x48\x0a\xfa\xea\x7c\x2d\xfa\x1c\xee\xad\x30\x19\xd0\x0e\x48\xcb" + "\xfc\x10\x17\xf8\xdb\x04\xc6\x52\x96\xf0\x17\x14\x13\x6e\x2b\x4e" + "\xfb\x1e\x75\x05\x9f\xa8\xae\xd4\xed\x66\xdf\xd3\x76\x58\x4e\x69" + "\x2a\xad\x97\xd0\x86\xd9\xe0\x4b\xc1\x77\xa6\x4f\x81\x3e\x03\x38" + "\xf1\x81\x73\x9f\x31\xf7\x7d\xbe\xcf\xf8\x09\xfa\x8c\x2c\xe8\x33" + "\xd2\x43\x51\x85\xb6\x18\x81\x0f\xeb\x34\x51\x1b\x64\x49\xd3\x42" + "\xdf\xb1\x1c\xfa\x0e\xdd\x25\xc4\xf6\x1b\x75\xb5\x08\x7c\x7e\xe0" + "\xf6\xf9\x28\xa4\xe9\x27\xe8\x3b\x7e\x82\xbe\x23\x8d\xf4\x1d\xdb" + "\xae\x43\xdf\xb1\x00\x62\x83\xf9\xd0\x77\xd4\x89\xf4\x1d\xd7\xc5" + "\xe3\x02\x87\x1f\x6c\xfc\x29\x9c\xda\x06\xfd\xc6\x8a\xb3\x88\xda" + "\xf6\x52\x27\x99\x9c\xd1\xe5\x4b\xe2\xbc\x25\xe8\x2d\x3b\x13\x87" + "\xb0\xdd\x57\x58\xa0\x1f\x06\x5c\x2a\xc3\xad\x28\xe8\x4c\xa7\xa8" + "\x46\x38\xdf\xdc\xad\x21\xb6\xe0\x1b\x23\xc5\xe8\x9b\xb4\x8d\x80" + "\xdb\x8a\x25\x88\x6a\x06\x0c\xf7\xbe\xa8\xa7\x70\x9c\x68\xcf\x6e" + "\xc8\x21\x31\xe9\x8a\x03\x78\x4c\x24\xc8\x40\x70\xb3\x32\x71\x41" + "\xcc\xeb\x71\x5d\x37\xbc\x86\x54\xb6\xff\x84\x76\xb1\xbf\x1e\xea" + "\x9f\x76\x16\xa9\x8d\xaf\x27\x81\xbd\xae\xa1\xcf\x4f\xeb\xa9\xbc" + "\xe9\x48\x83\xd7\x26\x64\xde\x3e\x96\x92\xf7\x0a\x1a\x91\xf7\x6f" + "\x34\x74\xc7\x74\x14\xb1\xfd\x1b\xbc\x86\x39\x60\x58\xcb\x58\xca" + "\x93\xfe\x81\xdf\x9d\x8f\x61\x36\x35\xc6\x32\xdd\x3b\x47\xc1\xff" + "\x47\xe8\xa7\x43\xfc\x00\xd7\x63\xc2\x1b\x8b\x2b\x75\xe5\x28\xf3" + "\x22\x42\x69\x57\x38\x8c\x5b\xf0\xbd\x80\xac\x14\xf8\x0f\xac\x09" + "\xa2\x09\xbe\xf8\x7d\x16\x8e\x39\x5a\x30\x9e\xfd\x85\x50\x17\x70" + "\x18\x97\xd7\x55\x21\xe8\x03\x3b\xb5\xe8\x03\x16\xe3\x0b\xc8\xa1" + "\x0d\x00\x9b\x40\xd0\x02\x21\x8d\xf5\x2e\xfa\x60\x91\x42\x7d\xc0" + "\xc5\x37\xd6\xc5\xe1\x54\x2e\xc5\xa0\xf4\x72\x44\x6d\xb5\xcb\xc5" + "\x78\xc5\x1a\xd6\xdf\xe6\x5f\xf6\x27\x73\x5f\x96\x8f\xc6\x58\x18" + "\xe8\xe5\xa3\xa6\x84\xfb\x21\x85\xd8\x57\x79\xc6\xde\x1c\x42\xb0" + "\x4f\xfd\x4c\x21\xf6\x55\x80\x7d\x99\x32\xec\x6f\xc9\xc4\x9e\x5d" + "\xe3\xf1\x67\x8a\x7d\x6a\x86\x10\xfb\x37\x47\x12\xec\xdf\x1c\xa1" + "\x1c\x7b\x73\x2b\xed\xde\xcc\xb5\xfb\xb4\x4f\x95\x61\x6f\x86\x76" + "\x7f\x3c\x4c\x19\xf6\xd7\x64\x62\xcf\xae\x13\xf9\x33\xc5\x3e\x2d" + "\x55\x88\xfd\xca\x61\x04\xfb\x95\x43\x7d\xc0\xbe\x95\x76\x6f\xe1" + "\xda\x7d\xc6\x3e\x85\xd8\x43\xbb\x3f\x9e\xaa\x0c\xfb\x0b\x32\xb1" + "\x67\xd7\x9a\xfc\x99\x62\x9f\xa1\x13\x62\x9f\x3e\x84\x60\x9f\x1e" + "\xa9\x1c\x7b\x4b\x2b\xed\xde\xc2\xb5\xfb\xd5\x7b\x94\x61\x6f\xc1" + "\xed\xfe\x8c\x32\xec\x0f\xc9\xc4\x9e\x5d\xaf\xf2\x67\x8a\xfd\xea" + "\x14\x21\xf6\xab\x06\x11\xec\x57\x45\xf8\x80\x7d\x2b\xed\xbe\x91" + "\x6b\xf7\x6b\x76\x2b\xc4\x1e\xda\xfd\x97\x11\xca\xb0\x5f\x29\x13" + "\x7b\x76\xcd\xcb\x9f\x29\xf6\x6b\xb4\x42\xec\xdf\x1a\x48\xb0\x7f" + "\x2b\xdc\x1b\xec\xdf\x74\xc6\xfe\x7c\xa7\x28\x88\xad\x58\x9d\xbf" + "\x67\x3a\x87\xfd\x87\x80\x3d\xd4\x7f\xef\x4b\x5b\x5d\x34\xfe\xdb" + "\xdb\x58\xdc\x13\x00\x77\x1d\xe0\x0e\xb1\xa1\x03\x73\xc0\xa8\x2b" + "\xc6\x1d\x63\x9e\x76\x01\xa9\x3f\x87\x7b\x31\x3e\x18\x63\xc0\x51" + "\xc3\xe2\xdc\xf1\x58\x0a\xe3\xa7\x0a\xc1\x78\x62\xdd\x8f\x31\x6f" + "\x4d\xdb\x63\x4e\xb4\x8a\xf9\xa4\x3b\xa3\xef\x9b\x5c\xc7\xff\x6e" + "\x17\xe6\xa7\x20\x86\x4b\x93\x8b\xf9\xdb\x89\x42\xcc\xd7\xf6\xc5" + "\x38\x18\xe8\xb5\x1a\xe5\x98\x9b\xab\xa4\x31\x77\xf4\xf1\xeb\x36" + "\xf8\x86\xf9\xf1\x54\x1e\x73\x73\x95\x67\xcc\x2f\x28\xc0\xfc\xf6" + "\xf6\xef\xed\x0b\xf3\x75\x71\x42\xcc\xff\xd0\x9d\x60\xfe\x87\x10" + "\x29\xcc\xed\xe0\xaf\xf1\x98\x3a\xfe\x06\xcf\x66\x8e\x7b\xbe\x19" + "\x70\xc5\xdf\xe2\xe1\xb1\xde\x7d\xf3\x8b\xa8\x66\xc0\x7d\xe3\x52" + "\x14\x96\xb9\x14\x8d\x0a\xaa\x25\xfe\xbb\x09\xfc\xf7\x3b\x0d\x48" + "\x65\x7f\x23\xb4\x4b\xe6\x55\xa4\x6a\x02\x1b\x37\xbd\x91\x14\x54" + "\x96\x60\x44\x9f\x5f\x2f\xa2\xf0\xd8\x2d\x7e\x6f\xc7\xfc\x18\x17" + "\x38\x3e\x91\xb1\x94\xd5\x6c\x22\xe3\x2a\x97\x1c\xe3\x2a\xfb\x04" + "\xe3\x2a\xef\x5e\xe5\xc6\x55\xa6\x11\x8c\x72\x9d\xf1\x79\xe5\x43" + "\x89\x71\x95\xd2\x56\xc7\x55\xd8\xf1\x94\xeb\x28\xa4\x79\x41\x52" + "\xb7\x6d\xdc\xb8\xca\xfb\xf3\x7d\x1b\x57\x69\x5a\x10\x4e\xbd\x0f" + "\xf8\xbc\x39\x0d\xf0\xf9\x46\x2e\x3e\xef\x58\xbc\x1d\x57\x71\xf4" + "\xb1\x8e\x7e\x15\xb7\x39\xdc\xb7\x5a\xf4\x0d\x93\x5d\xc7\x52\x70" + "\x7b\xbb\x4e\x67\x76\xc6\x3e\x59\xd9\x78\xca\x97\x6b\xee\xb6\xf1" + "\x14\xdc\xe6\x1c\xfd\x6c\xfb\xe8\x63\xdf\x3d\x23\x6c\x7b\xeb\x37" + "\x90\x3e\x76\x7d\xa6\xb7\xfa\xca\x03\xe6\x67\x5c\xc7\x50\x08\xe6" + "\x1b\x6c\x78\xcc\x45\xd9\x38\xca\x97\xd5\x77\xdb\x38\x4a\xfb\xc3" + "\x7c\x43\xa9\x10\xf3\xcc\x55\x04\xf3\xcc\x0c\xdf\x31\x37\x4f\x76" + "\x1d\x3b\x21\x98\x6f\xbc\x81\xc7\x5a\x94\x8d\x9f\x94\x2a\xd4\xd2" + "\xff\xbd\xf1\x93\xf6\x87\xf9\xc6\x83\x42\xcc\xb3\x96\x10\xcc\xb3" + "\x52\x6e\x03\xe6\x67\x5c\xc7\x4c\x08\xe6\xd9\x97\xb0\xf6\x52\x36" + "\x6e\x52\x9a\x71\xb7\x8d\x9b\xb4\x3f\xcc\xb3\x0b\x85\x98\xeb\xe7" + "\x10\xcc\xf5\x49\xbe\x63\x6e\x99\xec\x3a\x56\x42\x30\x7f\xef\x1c" + "\x1e\x5b\x51\x36\x5e\x52\x7a\xd7\x8d\x97\xb4\x3f\xcc\xdf\xdb\x25" + "\xc4\x7c\xd3\xcb\x04\xf3\x4d\xf1\xb7\x01\xf3\x33\xae\x63\x24\x04" + "\xf3\xcd\xe5\x78\x4c\x45\xd9\x38\xc9\x89\xf0\xbb\x6d\x9c\xa4\xfd" + "\x61\xbe\x79\xab\x10\xf3\x9c\x49\x04\xf3\x9c\x58\x6f\x63\x66\x47" + "\xac\xec\x88\x8f\xd9\x58\x59\x0d\x9a\xdd\x65\x6c\x84\xe0\xfd\xc7" + "\x03\xac\x66\x57\x1c\x2b\x7f\xb9\xe6\x6e\x19\x1f\x71\x60\x8d\xe3" + "\xe5\xf6\x11\x2b\xff\xd1\xe5\xfd\xe7\x96\x67\x49\xac\xbc\x65\x8c" + "\x14\xd6\x62\x73\x11\x2a\x20\xd6\x74\xcc\x45\x78\x67\x29\xe0\x08" + "\x3c\xc0\x73\x11\xf0\x9c\x04\xb1\xf9\x08\x78\x1e\x82\x63\x4e\x82" + "\xf3\x7c\x84\x28\x03\x63\xc1\x73\x12\x70\x9c\x5c\x96\xb0\x1e\x39" + "\xe6\x26\xe0\x39\x08\xe9\xdf\xa3\xae\x18\x23\x3c\xff\x00\xc7\xcb" + "\x77\x7a\x0e\xc2\x56\x7b\x7b\x98\x83\xb0\x4d\x72\xff\x23\x47\x9b" + "\x8b\xde\xd3\x07\x01\xdf\x5a\xc6\xa9\x9a\x37\x35\xc4\xe2\x36\x87" + "\x31\x0a\xaa\x23\xed\x70\xdf\x4b\x85\x54\xa5\xae\x08\xbd\xb3\x02" + "\xa9\x1d\xe3\x17\xb8\x0d\x82\x5f\x0e\xb2\x02\x9e\x99\x73\xc9\x38" + "\x86\xfd\xc7\xb8\xae\xc6\x37\x92\xf0\x37\xf8\xea\xcf\xff\x59\x48" + "\xe1\xb1\xc7\xbc\xd9\x68\xe8\x07\x97\xd1\x88\x0a\xd3\x05\xc4\xb6" + "\xa9\xec\x86\x75\x70\xaf\xb6\x79\x73\xe7\x28\x7b\x70\x43\x8a\x31" + "\xb8\x41\x87\x71\xcb\xbc\x8a\x10\x6e\x5f\x18\xb7\x4a\xdd\xf6\x16" + "\xbc\x58\xac\x28\x6e\x6c\x43\xb2\x4d\x9d\x56\x8c\x59\xee\x75\xc0" + "\x6c\x81\x10\xb3\xed\x4a\xc7\x37\x1c\xf3\xb9\x17\x84\x53\xdb\xa1" + "\x4d\xad\x98\x04\x98\xbd\x28\x17\xb3\xf7\x25\xf7\x3f\xf5\x80\x59" + "\x95\x77\x98\x99\x43\xbc\xc0\xac\xcc\x1d\x33\xb3\x3f\x60\x66\xe4" + "\x30\x33\x01\x66\x16\x1e\xb3\x5b\x5e\x62\xe6\x1a\xc3\xfe\x9c\x30" + "\xcb\x95\xdc\xff\x54\x1a\x33\xb3\x97\xed\xcc\xec\x45\x3b\x3b\x1e" + "\x26\x82\x19\xb4\x33\x33\xd7\xce\xcc\xd0\xce\xcc\x4e\xed\xec\x9a" + "\x97\x98\xb9\xc6\xa0\x3f\x27\xcc\x76\x8c\x51\x80\x99\x97\xed\xcc" + "\xe2\x45\x3b\x3b\x9e\xea\x8e\x99\x05\xda\x99\x99\x6b\x67\x66\x68" + "\x67\x66\xa7\x76\x76\xc1\x4b\xcc\x5c\x63\xc8\x9f\x13\x66\x79\xd2" + "\xdf\x7f\x4b\x62\x66\xf1\xb2\x9d\x59\xbc\x69\x67\x67\x44\x30\x83" + "\x76\x66\xe1\xda\x99\x05\xda\x99\xc5\xa9\x9d\x1d\xf2\x12\x33\xd7" + "\x18\xf0\xe7\x84\xd9\xce\x02\x05\x98\x79\xd9\xce\x1a\xbd\x68\x67" + "\x5f\x46\xb8\x63\xd6\x08\xed\xcc\xc2\xb5\x33\x0b\xb4\x33\x8b\x53" + "\x3b\x5b\xe9\x25\x66\xae\x31\xdc\xcf\x09\xb3\x3f\xc5\xcb\xc5\x8c" + "\xc5\x0b\xb4\xa3\x28\x66\x4d\x42\xdd\x68\x05\x1d\x8f\xdf\x79\x89" + "\xe2\xf5\xf6\xb1\x14\x66\x95\x2a\x04\x63\x85\xf5\x20\xc6\xab\x52" + "\x77\x0c\x89\xe9\x46\xfc\x5e\x0c\x70\x47\xf8\xdd\x58\xfa\x25\x19" + "\x7a\xf1\x35\x29\xac\x5a\x7f\x1f\x96\x3b\x9f\xc7\xca\xf1\x3e\xec" + "\xb6\x62\x75\x5a\x2e\x56\xbb\xfd\x95\x61\x65\xae\x6a\x1d\x2b\x4b" + "\x88\x67\xac\x8e\xa7\xf2\x58\x5d\x70\xc2\xca\xbd\x1f\xf3\x1e\x2b" + "\x97\xfe\xeb\x67\x85\xd5\x9f\x25\xf7\x7f\xb6\x86\x74\x8e\xc2\xdf" + "\xbc\x4f\x84\xd8\x97\x79\x3d\xee\xf9\xac\x8b\x28\x6c\xfd\x45\x34" + "\x0a\x7f\xdf\xbc\x6f\x85\x85\x82\x3a\xfe\x70\xf2\x4c\x2d\x6a\xfe" + "\x31\xb4\x0b\xfe\x7e\x86\xf5\x93\x6f\x84\xfa\x57\x26\x18\x59\x9f" + "\xb8\x01\x30\xaa\x30\x15\x81\x4d\x3a\x45\x55\x98\xfe\x82\x9a\x16" + "\xc7\xa1\xaf\xce\x5f\x05\x5c\x98\xe6\xca\xba\x22\x94\x07\xd7\x8b" + "\x97\xfe\x05\xd9\x7f\x0c\xef\xf2\xaa\x0e\x51\xd7\xe9\xff\xd1\xe1" + "\xd8\x79\xb0\x0e\xa9\x27\xd4\x31\x96\x8a\xba\x93\xe8\x83\xd7\x50" + "\xd8\x31\x1d\x42\xd8\xd6\x6c\xac\x3c\x17\xc7\xca\x87\x04\xf8\xbc" + "\xef\x14\x2b\xb3\xdf\xcb\x6a\x01\x9b\x1b\x2e\xd8\x40\x2c\x0e\xb6" + "\xee\x34\xd1\x04\xd8\x98\x1c\xd8\x5c\x43\x69\x0b\x31\x36\x06\x3e" + "\x56\xe6\xb0\xc9\xc5\x3e\x4f\xeb\x14\x2b\x5f\x77\xc2\x86\xfb\x56" + "\x55\x80\x8d\x63\x2c\x63\x59\x38\x7e\x47\xee\x16\x2b\x2b\x1b\xcb" + "\x28\x90\xfc\x56\x84\x6d\x47\xd0\x46\x26\x42\x3b\x4a\x4d\x61\xdb" + "\x11\xb1\x7f\xb7\x06\xe0\x7b\x21\x0a\x32\x74\x8a\x5a\x0f\x18\x34" + "\x41\x5b\xc3\x7d\x51\xfa\x42\xbc\x3e\x63\x4d\x3e\xc6\x6d\x62\x41" + "\x73\xf3\x2b\x26\x44\x81\xcf\xca\xc1\xd8\xd9\x7e\x0c\xf5\xcf\x82" + "\xbe\xaa\x32\xfe\x1b\xc0\xe7\x26\xaa\x34\x72\xd8\xac\xf8\x06\x5d" + "\xa7\xf7\x04\x30\x6f\x84\x77\x79\x14\x78\x0a\x7d\x8f\xfa\x55\xfc" + "\xed\x0b\xf8\xbc\x0f\x66\xa3\x11\x13\xb4\x8c\x85\x9d\xcb\x03\x6d" + "\x0c\xf7\x67\xd8\x1f\x56\x68\xbf\x40\xb6\xec\x86\x94\xe6\xee\x9d" + "\xa3\x8e\xa5\x20\x84\x7d\x22\xc6\xa2\xc3\x12\x1e\x3b\xfc\xdd\x9e" + "\xf3\x58\x87\x9b\x2f\x9c\x7b\x52\xbc\x7d\xc5\x1b\x64\x8d\x77\xe4" + "\x72\xed\x2b\x57\xe9\x78\x87\x63\x3c\x0a\x30\xc4\xdf\xea\xa5\x9f" + "\x45\xd4\xfb\xb2\x31\xfc\x28\x44\x01\x86\x55\xad\x63\x68\xe6\x30" + "\x34\x87\xb4\x8e\xe1\x47\x55\x22\x18\x1a\x9d\x30\x2c\xe3\x31\x34" + "\xfb\x73\x18\x9a\x9c\x30\xb4\xb4\x8e\xa1\x4b\x2c\xfd\xb3\xc2\xf0" + "\x7f\x3d\x8f\x7f\x88\x62\x68\xf6\xa2\x1d\xfe\xe4\xc0\xd0\x8b\x76" + "\xb8\x37\xc7\x1d\x43\xb3\x53\x3b\x3c\x1e\xe6\x84\x21\xd7\x0e\xcd" + "\x4e\xed\xd0\xec\x45\x3b\x74\x89\xad\x7f\x56\x18\xee\xcb\x55\x80" + "\xa1\x17\xed\xf0\x3b\x0e\x43\x8b\x17\xed\xf0\xe3\x38\x11\x0c\x9d" + "\xda\x21\x68\x97\x16\x0c\x2d\x5c\x3b\x34\x3b\xb5\x43\xb3\x17\xed" + "\xd0\x45\xab\xfc\xac\x30\xfc\x24\x41\x3e\x86\x16\x2f\xda\xe1\xe7" + "\x0e\x0c\xbd\x68\x87\x85\xbd\xdc\x31\xb4\x38\xb7\xc3\x33\x4e\x18" + "\x72\xed\xd0\xe2\xd4\x0e\x2d\x5e\xb4\x43\x97\xd8\xfb\x67\x85\xe1" + "\xa7\x9e\xc7\xff\xc5\x31\xf4\xa2\x1d\xa6\x73\x18\x36\x7a\xd1\x0e" + "\x3f\x35\x88\x60\xe8\xd4\x0e\xbf\x8c\xe0\x31\x6c\xe4\xda\xa1\xc5" + "\xa9\x1d\x5a\xbc\x68\x87\x2e\xb1\xf8\xcf\x0a\xc3\xbf\xd4\x7a\x83" + "\x21\xe8\x6c\x77\x5d\x6a\xe2\x31\x74\xc6\xcf\x55\x8b\xc6\x80\x46" + "\xc5\xd8\xc5\x5b\x11\xe5\x8e\xdf\x5f\xf3\x31\x7e\x11\xf8\x7d\xdc" + "\x2d\x5e\x93\xb2\xd8\x71\xef\x73\x30\x66\xc7\x12\x11\xc2\xfa\xd4" + "\xa1\x47\xf1\x3b\xd5\x16\x3d\x3a\xeb\xff\x57\x3d\xba\x7f\x97\x7c" + "\xec\xb8\x7e\x50\x12\x3b\x61\xdf\x17\x03\x7d\xa2\x34\x76\x9f\xc5" + "\xbb\x63\x67\x36\xf2\xd8\x91\x7e\x8f\x60\x77\x3c\xd5\xd1\xff\x11" + "\xec\xb8\xfe\xcf\x23\x76\x3f\xe7\xfe\xef\x6f\x92\xfd\x9f\x6d\x35" + "\xa2\xb6\xaf\xb6\x17\xea\x29\x7b\x11\x1c\xc5\x70\x94\xc2\xb9\x0e" + "\x70\xae\x0a\xdf\x03\xbf\xd9\x6b\xf6\x2e\xec\x5a\x60\xc5\x41\x7e" + "\x09\x78\x5f\x0d\x9c\xa6\xa3\x23\x4d\xd0\x2a\x34\x26\x8f\xcb\x03" + "\xce\x67\xc0\xf9\xe2\x40\xbf\x31\x1d\x21\x7d\x29\x93\xb5\x34\x19" + "\xce\x75\xc2\x69\x99\x55\x2a\xb2\x9e\x1f\x45\xe1\x3c\x5c\x9f\xe9" + "\xcf\xa5\xe9\xe5\xfc\xdc\xae\xab\xc6\xe0\x75\x40\x1c\x69\x3a\xdb" + "\xa9\x8b\xf8\x77\x95\xdd\x4f\x85\xf7\x16\xd0\x38\xa7\x65\x9e\x43" + "\x38\x5f\x47\xda\x2e\x5c\x7e\x61\xce\x69\x6c\x1f\x22\x14\xe8\xa7" + "\x61\xf3\x0c\xd4\x52\xb8\x4e\x38\xed\x7d\x4c\x60\x4a\x09\x9b\xde" + "\x4f\x15\x2e\x48\xff\x36\x62\xd3\x72\xe9\x02\x98\x8e\x27\x93\xb9" + "\x74\x11\x38\x1d\x9c\x53\x39\xdb\x8f\x4b\xd7\xd5\x61\x1b\xbc\x8e" + "\xb8\x73\x5d\x6d\xab\x29\x9c\x1f\x4e\x13\x68\xef\x78\x22\x95\xab" + "\xcb\x50\xe7\x67\xe2\x74\x70\xdf\x10\xce\xce\x41\x50\x87\x11\x2d" + "\xf9\xe9\x0f\x47\x39\xd2\xa5\xdb\x50\xcf\x3c\xde\x36\x6a\x26\x6b" + "\x19\xc2\x6b\x08\xba\x62\x17\xe8\xe7\x67\xc0\xd8\x55\xd6\x21\x84" + "\xd3\x32\x81\x4b\xf7\x43\xfa\x60\xae\x1e\x63\x48\x3d\xd8\xf5\x56" + "\x08\xd6\x94\xf5\xfe\x1d\x6c\x59\xfd\x34\x5c\x59\xbb\x41\xba\xb1" + "\x8e\x7c\xed\x14\x3b\x8e\xc1\xa5\x55\xb1\x69\x2b\x92\xf1\x5a\xf9" + "\x2d\xe9\xef\xc7\x69\x6d\x59\x6b\xaa\x6c\xab\x54\x51\xae\xf9\xdb" + "\x56\xfb\xe3\xeb\xce\xf9\x87\x90\xf4\xba\x5a\x48\x3f\xc1\x3d\xbd" + "\xda\x35\x7d\x77\x92\x7e\x45\x0d\xa4\x8f\x75\x4f\x6f\xed\xe6\x92" + "\xbe\x07\x49\x9f\x6a\x80\xf4\x93\xdd\xd3\x6b\x5c\xd3\xff\x82\xa4" + "\x7f\xbb\x04\xd2\xc7\xb9\xa7\x1f\xe3\x9a\x3e\x94\xa4\x4f\x3b\x0f" + "\xe9\xe3\xdd\xd3\x67\xb8\xa6\xef\x49\xd2\x67\x54\x43\xfa\x04\xd7" + "\xf4\x79\x6c\x5a\xd4\x8f\x4b\xfb\x00\x49\xbb\xfa\x0c\xa4\x4d\x14" + "\xa9\x2b\xcd\xe5\x1d\xc9\xa5\x7f\x90\xa4\x5f\x16\x07\xe9\x93\xdc" + "\xd3\xab\x5c\xd3\xf7\x22\xe9\x37\x5b\x20\x7d\xb2\x08\x56\xae\xe9" + "\x7b\x93\xf4\xeb\xc7\x40\x7a\xad\x08\x56\xae\xe9\xfb\x90\xf4\x99" + "\x43\x21\x7d\x8a\x88\xed\x5d\xd3\xff\x92\xa4\xcf\x0a\x87\xf4\x3a" + "\x11\xdb\x0b\xd3\x67\xe9\x7b\x41\xba\xd4\x1d\x1c\x37\x5d\xec\xee" + "\x9a\x77\x5f\x92\xf7\x26\x35\xdc\x93\xe1\x9e\x1e\xf9\x91\xf4\xe8" + "\x31\x2e\x7d\x3f\x92\x3e\x47\x05\xe9\xd7\x88\xd8\xfe\x21\x9c\x3e" + "\x8f\xa4\x7d\x88\xa4\x5d\x57\x04\x69\xd7\x89\xd8\xdd\x39\x6d\x18" + "\x49\xfb\xa7\x5d\x90\x36\x53\xc4\xe6\xce\x69\xfb\x93\xb4\xdb\x92" + "\x21\xad\x5e\xc4\xde\xce\x69\x7f\x45\xd2\x7e\xa0\x81\xb4\x39\x22" + "\xe5\xed\xe7\x94\x76\x00\x49\x9b\x8b\x79\xb5\x55\x04\x17\xe7\xb4" + "\xe1\x24\xed\xee\x58\x48\x9b\x2b\x82\x89\x73\xda\x81\x24\xed\x8e" + "\x75\x90\x36\x5f\x04\x13\xe7\xb4\x0f\x33\x59\xf9\xa3\x38\x3f\xbd" + "\xcb\x35\xed\x0e\xde\xef\x3e\x62\x0f\xdc\x69\xe4\x7c\x25\x59\xd7" + "\x68\x35\x5e\xcb\xae\xa5\x5e\x8f\x3b\xfa\x08\x3b\x85\x22\x98\xac" + "\x3f\xd6\xc0\x7d\x38\xcf\xbd\xee\xbe\x4d\xf5\xf8\x0e\xbe\x8f\x18" + "\xc4\x64\xfd\x35\x92\x7b\x7e\xa1\x7b\x5a\x7f\xe7\xb4\x8f\x32\x59" + "\x05\x5b\xb9\xb4\xfb\xdd\xd3\xaa\x9d\xd3\x0e\x66\xb2\x3e\x8a\xe7" + "\xd2\x16\x89\xf8\xd7\xc7\x9c\xd2\x46\x32\x59\x7b\x35\x90\xee\xa0" + "\x98\x7f\x65\x56\x6b\x1e\xc3\xfe\xc0\xe1\xbb\x21\xfd\x10\x62\xdf" + "\xfd\x75\x60\xdf\x62\x9c\xde\x91\x16\x70\x78\xcc\xa9\xaf\x7c\xcc" + "\x1e\xb8\xaf\x86\xb3\x59\x89\x7b\x19\x32\x9c\xcb\xf0\x38\xc9\xf3" + "\x93\x02\xc8\xb3\xd4\xb5\x0c\x9c\x3f\xc2\x3a\x01\xdb\x77\xa8\x2d" + "\xeb\xd3\x64\x6c\x5f\x48\x5b\x26\xd0\x08\x94\x1f\x8d\xf3\xe4\xb0" + "\x1d\xc6\x64\xfd\xd9\xca\xd9\x40\xd0\x1f\x41\x7b\x64\xfd\x21\xe0" + "\x5b\xca\xbc\xfd\x40\x12\xa4\x1d\xce\xa5\x3b\xe3\xda\x0f\x72\xe5" + "\x7b\x02\xae\x55\xb7\xf4\x81\x7e\xaa\xf3\x62\x5a\x46\xfb\x30\xba" + "\xef\x2a\xfd\x39\x99\x8f\xdf\xb2\x1f\xd6\x91\x50\xb2\x2e\xd3\xa5" + "\x31\x31\x26\xc6\xea\x7c\x6e\x23\xc5\x54\x0d\x36\x21\x15\x5e\x83" + "\x8f\xe9\x1e\xa4\x33\xc0\x79\x63\xdf\xcb\x6a\x73\xd6\xe7\xa5\x06" + "\xbf\x12\x76\x4f\x03\xf8\xff\x19\x03\x7a\x83\xdd\x33\x66\xe3\x6a" + "\x06\xef\xf1\xe3\x67\xdb\x74\x58\x5d\x69\xaf\xc3\x6b\x29\x5a\x20" + "\x0f\xcb\x65\x2d\xa2\xf1\xbe\x6e\x78\x5d\xd7\x4a\x5d\x1d\xba\x4c" + "\x17\xf7\x64\x16\x24\x8d\x82\x32\x14\xc2\xf3\x12\x2f\xc2\x6f\x62" + "\x53\x3c\xff\xf3\x70\x44\xf1\x22\xbc\x3e\x5d\xf1\x4c\x63\xf7\xd0" + "\x42\xe6\xad\x19\xb5\xda\x34\xf4\xcb\xab\x74\x71\x82\x63\x2d\x2a" + "\x76\xfd\xa9\x9f\x92\x9e\x26\x6b\x4f\x15\x5f\xb1\x07\x1f\x8e\x70" + "\x5b\x7b\x2a\x3f\x4c\x4d\xd6\xb3\x3a\xc2\xe6\x0d\x65\xab\x62\x34" + "\x97\xc2\xed\x4d\x6b\x32\xf0\x1e\x6c\xc5\x69\x57\xd1\x45\xee\x1a" + "\xce\x93\xcb\xeb\x00\xce\x03\xe7\xe5\xc8\x07\xdf\x67\xec\x1b\xa6" + "\xc6\x75\x07\x3b\x84\x7b\xbf\x7e\x55\x71\x01\x5e\xbf\x4a\x46\xfa" + "\x04\x9c\x5e\x7c\x5d\x5e\xd0\x38\xd9\x87\xa3\xcc\x59\x47\xc6\x80" + "\x56\xcd\x27\x76\x3f\x32\xc1\xe0\xd7\x71\x2c\xf7\xff\x38\x83\x9f" + "\xbf\x91\xfb\x7f\xa2\xc1\xaf\x28\x80\xfb\xbf\xd6\xb1\x5e\x98\x68" + "\xbe\xea\xc3\xbd\xc0\xde\x43\xed\x1f\xc4\xf9\x63\x6d\x4d\xd6\x2d" + "\x3d\xdc\x4b\xd3\x07\xaf\xe7\x7c\xc4\x04\xcf\x1c\x4a\xec\x72\xa4" + "\x1c\xfe\x06\x71\x7f\x8d\xdc\x5f\x06\xa7\x61\xb9\x14\xa2\x2e\x60" + "\x32\x1b\x8c\x64\x8f\x97\x23\xec\x5a\x65\x2c\x76\x80\x2f\xd3\xb5" + "\xc1\xc8\xe6\xbb\x39\xb4\xd0\xb9\x0c\x91\x43\x1e\x7b\x7c\xe8\xb0" + "\xe1\x4f\x8c\x18\x39\xf3\xb5\xd7\x13\x67\xcd\xfe\x7d\xd2\x9c\xb9" + "\x6f\x24\xcf\x9b\xbf\x40\xbb\x70\xd1\xe2\x94\x25\x4b\x97\xe9\x96" + "\xaf\xc0\x0b\x87\xb5\x94\xf5\x83\xb1\x7e\x26\x0a\x01\x6e\xcf\xc1" + "\x33\xbe\x98\xc2\x3e\x17\xce\x11\x8c\xbf\x18\xab\xd2\x88\xeb\xf7" + "\x4a\x60\x32\xde\xa3\xa3\x8e\xfe\x62\x27\xde\x33\x04\x38\xe6\x57" + "\x99\xfb\x7c\x31\xde\x97\xac\x86\xfe\x22\xa7\xc2\xf8\x7c\x31\xde" + "\xf3\xee\x68\x68\x2d\x0a\xeb\x87\xf7\x2e\xfb\x22\x03\x5f\xcf\xfb" + "\x15\x42\x25\x70\xaf\x58\x9e\xfd\xd4\x28\xf4\xbd\x1e\x8c\x31\xa7" + "\x07\x53\x87\xf3\xcf\xd9\xc2\xd4\x1a\xdf\x4c\x42\x59\xf0\x1b\x78" + "\xae\xbe\x4c\x1f\x9d\x72\xb4\x17\xbb\xcf\x50\xaf\x1d\x5b\x98\x9a" + "\x35\x3d\x98\x9a\xb7\xb6\x30\x75\x79\x3d\x18\x43\x58\x0e\x0a\x30" + "\x67\x1d\x85\x98\xe3\x8b\x04\xb6\xcd\xc0\x75\x7b\xe0\x17\x68\x23" + "\x5c\x1b\x6c\x45\x74\x1e\xfc\x86\x73\xa6\xa3\x1a\x52\xee\x4f\x6e" + "\x5a\x3a\x40\xfd\xea\x98\xe6\x64\xbf\x2c\x78\x0e\xc1\xe3\xe8\xf2" + "\x12\xe8\xf9\xe1\x79\xc6\x4a\xcb\x45\x64\xa0\x8f\xea\xf2\x1a\xd8" + "\xe7\x05\x55\x6e\xad\x43\x38\xbf\x8f\x17\x59\x3a\x2c\x7e\x80\xb1" + "\x42\xda\x38\xfb\x9b\xc9\x7e\x90\x66\x28\xe4\x6d\x72\xae\x4f\xf8" + "\xec\x79\x29\x9a\xf9\x4b\x92\x93\x07\x76\x41\xe1\xec\x5f\xc1\x9e" + "\x79\x29\x90\x1f\x7a\x6f\x0b\x53\x02\xf5\x2c\x86\xfa\x96\x96\x43" + "\xa4\x00\xdc\x40\x50\x27\x3d\xe4\x5b\x0e\xe7\x0f\xc2\xff\x0f\x42" + "\xd9\x4b\xc9\x1e\x5d\x67\x1a\x99\xac\xa3\x6b\xa0\x9c\xa5\x78\x7f" + "\x02\xbc\x96\x62\xfd\xb2\xc9\x7e\x50\xef\x1c\x48\x57\xaa\x79\x00" + "\xf5\xbf\x4c\x97\x4c\x81\x72\xec\x82\xff\x43\xfa\xb3\xec\x7e\x40" + "\x90\xbe\x84\xd4\xeb\x0c\xbb\x77\x38\xd8\xaa\x78\x7b\x0f\x26\xd3" + "\x9c\x55\x12\x89\xd7\x5a\x65\xf7\x7d\x81\xdf\x60\x97\x52\x48\xab" + "\xaf\x4f\x9f\xec\x87\xf7\x8a\xcc\xe3\xf3\x64\xcb\x84\xcb\x81\xe3" + "\xd6\xaf\x40\x05\xda\x9b\xe3\xd0\x20\x0b\xf2\xfb\xaa\x06\xa1\xdc" + "\x2d\x4c\x3e\x1c\xb9\x70\x6c\x3d\x09\xd7\x4e\xc0\x51\x0a\xe7\xcb" + "\xe0\xef\x49\xf8\x7b\xa2\x86\x7d\x0f\x1a\x8a\xcb\xbd\x38\x95\xa9" + "\x1d\xbc\x15\x3d\xc4\xee\x45\x99\x86\xa6\x5e\xa4\xcf\xc4\xe2\xb2" + "\xe3\x75\x95\x99\xc0\x12\x97\xf5\x5f\x8f\x8f\x40\x70\x1d\xfe\x4e" + "\x20\x7f\x9d\x8f\xe3\x39\x70\xec\xe7\xfe\x0f\xc8\x1e\x0f\x23\xff" + "\xff\x52\x0d\x47\xaf\xd6\x0f\xd7\xfc\xa4\x8e\x2f\xd7\x79\x9f\xd6" + "\xab\xa3\xc4\xbb\x74\x27\xc6\x20\xfa\xab\xad\x70\x54\x09\xcf\x7f" + "\x55\x40\xce\x55\xa5\x90\xdf\x55\x19\xdc\xdf\xbd\x88\x3e\x05\x76" + "\x3a\x05\xf9\x9f\xaa\x25\xe7\x4e\x99\xe0\xef\x28\x38\xa2\x5c\x9e" + "\x8f\xf3\x3c\x8f\xf1\x6c\x06\x5f\x8f\xb1\x34\xd0\x25\x39\x18\xa3" + "\x8d\x84\x5b\x7e\x78\xae\x03\x9c\xd3\x03\xb7\x72\x79\xfe\x1c\x5f" + "\x2b\xe4\xcf\x71\xad\x0b\x7f\xf4\xd8\x17\x41\x5b\x38\x9f\x47\xf8" + "\x72\xb0\xfe\xcd\x44\xf8\x7d\x3c\x05\xf2\x39\xa8\x79\x85\xcd\x83" + "\x1d\x83\xdb\x78\x15\xa1\xae\x49\x48\x85\xfd\x4b\x1d\x7d\xfc\x18" + "\xe6\x2c\x7e\x36\xf7\x5c\x52\x16\x28\x1f\x9c\xcb\xc7\xe5\x5b\x00" + "\xf9\xc2\xef\x5d\x90\x2e\xbf\x12\xdd\x74\x94\x8d\xbd\x67\xfd\x5c" + "\xe0\x23\x57\x5e\x9c\x27\xbe\x8f\xe1\xeb\xa5\xc7\xf7\x90\x67\x7f" + "\xb9\x1c\xce\x47\x82\x8f\x42\xe9\x37\x10\x5d\x69\x35\x20\xcc\x49" + "\xfc\xb7\xd2\x1a\x09\x6d\x29\x0a\xd9\x71\x3f\x17\x8a\x22\xa1\xbd" + "\x75\xbe\x48\x7f\x19\xff\x68\x2a\x8a\xc4\xf9\x61\xff\x6d\xa0\xbf" + "\xd4\xe4\xe1\xb6\x48\xf2\x5a\x48\xd6\x5d\x2c\xd1\x9f\xd4\x22\xf6" + "\x39\x3b\x70\x79\xe0\xba\xd3\x73\x73\x2a\x21\x02\xda\xb8\x82\xd4" + "\x15\x9e\xb5\x0b\xee\x2f\xc4\x75\xc7\xf6\x84\xeb\x45\x90\x4f\x11" + "\xbe\x86\xf7\x56\xe1\xea\xb3\x0b\x7f\x97\x81\xed\x81\xd3\xe3\x7d" + "\x1e\xc9\x7a\xb2\x47\x2f\xb0\x76\x83\xfb\x31\x1e\x0c\x3c\x03\xe7" + "\x91\x6e\x65\xac\x0c\xf8\xa3\x3f\xad\xc0\x7b\x08\x9c\x18\x22\xc4" + "\xa7\x54\xed\x8c\x0f\xdc\x57\x08\xf7\x97\xe0\xfe\x17\xfb\x13\x78" + "\x66\x10\xde\xd7\x0c\xce\xe9\xed\x59\x90\xc7\x52\x0b\x3b\x06\x04" + "\xf9\xf4\x85\xb2\xe8\x71\x3e\x50\x9e\x12\x2e\xaf\x78\xbc\xd6\xa4" + "\x33\xd6\x5c\x7e\xbb\x30\xe6\x6c\x7b\x5e\xc1\xd6\x09\x7c\x57\xe9" + "\x8d\x1d\xe4\x5a\x11\xa4\x29\x62\x9a\xa3\x10\xf3\x66\x1c\xb7\x7f" + "\x1a\x7b\x6d\x7f\x7a\x23\x8b\x6f\x09\xf1\x6b\x27\x82\x17\xaf\x64" + "\x6a\x9d\xca\x5d\xea\x58\x53\x9d\x2b\xf7\x7e\xfc\x3c\x66\x59\x3c" + "\xdb\x87\xe2\x67\xe0\xfb\xb9\xfc\x76\xe1\xfc\x1c\xb6\x7a\x14\xca" + "\x41\xec\xf5\x65\x35\x9c\xdf\x85\xb9\xc8\xda\x0d\xfc\x68\x7d\x3a" + "\xe6\x62\x69\x19\xdc\x7f\x30\x0b\xff\x5e\xc6\xfe\x4e\x60\x7d\x2c" + "\x7f\x3d\x04\x5f\xaf\x04\x96\x6e\x7c\x03\xb8\x64\x47\xe8\xa1\x10" + "\x14\x69\x5a\xcd\xd6\x6d\xaf\xe9\xcd\xb1\x7e\x47\xad\x08\xe1\x72" + "\x82\x8d\x8a\xcc\x59\x27\x52\xa0\xaf\x61\xf7\x4f\x03\x7f\xbd\x9f" + "\xf9\x53\x1c\xc2\x65\x06\x7f\xc6\x95\xef\xc4\x25\x0e\xfb\xfd\xb8" + "\x8e\xd8\x9e\x8f\x12\xdf\x07\xd7\xbe\x7a\x07\x97\x9d\xaf\xf7\x89" + "\x62\x67\x1b\xb3\xf5\x06\x1c\x30\x5e\x18\x17\xa7\x3c\x31\xf7\xf5" + "\x90\xd7\x5e\xf2\x9b\x70\x03\xdb\x5a\xdf\x83\x29\xc3\xe9\xf9\xb4" + "\x27\x1b\xf1\xb5\x34\x78\xf6\x60\x2d\xbb\x67\x9b\x1f\x5e\x17\x1f" + "\xf2\xdd\x8b\xf7\xf0\x84\x3c\x8a\xb0\x4d\xa1\x2c\xd1\x98\x8f\xf0" + "\x9b\x5b\xaf\xf5\xe4\x04\xe8\xcf\x23\xe0\x18\xc5\xb7\xff\xaf\x46" + "\x0b\xf9\x75\xd2\xb5\xfd\x63\xbc\xf5\xf6\xf4\x28\xc4\xed\x35\xac" + "\xb9\x4e\x9f\x3c\xc7\xf5\x1d\x1c\xd6\x5f\x0d\x3a\x0a\xed\xc5\x29" + "\x8f\xfd\x2e\x58\x17\xb1\x7c\x5c\x36\xc1\x0f\xd7\x19\xee\x2d\xe2" + "\xf2\x61\xeb\xcc\xf2\x69\x35\xcb\x81\x32\x66\x19\xd4\xb3\x85\x07" + "\x27\xd5\x1c\xce\x65\x2e\x36\x71\xf8\xae\x78\xbc\x47\x17\xf6\x49" + "\xa0\x6f\x9f\x36\x37\xf3\x7e\x09\x63\x6f\x67\xb1\x3f\x59\x94\x47" + "\xfa\x5b\xce\x6f\x9d\x24\xd7\x7b\x08\x38\x8c\xcb\x72\x8d\xe5\x2f" + "\x2e\x4b\x7a\x3c\x2e\x4b\x11\x5b\x8e\x74\x0d\xba\x4e\x7f\x95\x88" + "\x9f\x0f\xf7\x1a\xb9\xf6\xca\xe5\x75\xa2\x04\xe7\xf5\x16\xf8\x2a" + "\x5c\x26\x78\x76\x2c\xeb\xff\x7e\xc3\xda\xe4\x18\x57\xf6\x52\xcb" + "\x6a\x7c\xef\xf1\xa2\x46\x8a\xbd\xb7\x14\xfe\x1f\x61\x21\x7b\x1c" + "\x74\x81\xfb\x0b\x34\xaf\xe1\xf4\x55\x61\xd8\x47\x6b\xa6\xb3\xff" + "\xef\xaa\x79\x09\xb8\x7a\x15\xa9\x20\x3f\x7f\xcc\x51\x07\x2f\xea" + "\xe8\x4a\x1b\x8e\x17\xc0\xd6\x7b\x41\x23\x15\x60\x7b\x63\x2e\x83" + "\x46\x1a\x6a\xce\x2a\x8b\x70\xf0\x16\x9e\x93\x8b\x6d\x4f\xf0\x29" + "\x5b\x08\x3c\x2e\xe2\xb9\x55\xb6\x90\xb3\x63\x01\xd8\xd1\xff\x32" + "\x5d\x79\x83\xab\x57\x01\xa4\x07\x2d\x56\xf9\x3d\x57\x76\x6e\x5f" + "\xc3\xb2\x0d\x0e\x1c\xb8\xb6\x5a\x96\x85\xfd\x2f\x8b\x41\x79\x18" + "\x77\xef\x2e\xf2\xac\xf2\xfe\x8e\xb4\x58\x23\x92\xfd\xca\xca\xfb" + "\x63\x3f\x38\x18\xb0\x67\x7d\x1f\xbb\xbf\x2d\x39\x87\xdb\x0e\x79" + "\x46\x65\x39\xcb\x43\xd0\x3d\x3c\x8f\xca\xac\x2e\xfe\x09\xfb\x62" + "\x7d\xc5\x1a\xb2\x1f\x04\xe6\x12\xf6\xa9\x38\x2e\x81\x32\x9e\xe1" + "\xda\x0f\x57\xe6\xf2\x39\x42\xae\x54\x1e\x00\xae\x0c\xe2\xf3\x2e" + "\x8f\x13\xeb\xe7\xf2\x88\x0f\xcc\xe5\xea\xb6\x87\xab\xdb\x5e\xae" + "\x6e\x7b\xb8\xba\x15\xc0\x33\xb0\xdd\xe6\x39\xd9\x11\xec\x56\x71" + "\x8e\x4b\x5f\x84\x7d\x39\xdf\x5e\x2b\xba\x3b\xda\xb2\xbb\xbf\xa8" + "\x38\x81\xdb\x83\x53\xb9\x8c\x2e\xfe\xa2\x48\xdc\x5f\x94\x17\x73" + "\xf5\xcd\x77\x69\x1b\xbb\x38\xbd\x7b\xc1\x81\x43\x85\xc9\xb1\x2f" + "\xc7\xd1\x0b\xd8\x7f\xe2\x67\x3b\xf7\x41\x3b\x88\x5d\xb9\xb6\x5c" + "\xf1\x99\x3b\x0e\x15\x6b\x9c\xdb\x33\xc6\x1a\xfb\x04\x9c\x07\xc6" + "\x94\xd5\x95\x70\x8e\xe0\x5a\x11\x8f\x7d\x83\xb3\x8f\x86\xb4\x39" + "\x76\x06\xb7\x97\x8a\x75\xc2\xb6\x58\x6e\xe2\xda\x22\xf7\xec\xca" + "\x69\x80\x51\xa4\xd3\x73\xad\x2e\xcf\xc5\xd8\x94\xb0\xeb\x2e\x13" + "\x4c\xc7\x39\xfa\x34\x9c\x1e\xee\xd5\x99\xb3\x2a\x23\x5d\xfa\x47" + "\x3d\x2e\x1f\x3c\xab\x80\xf5\x59\x5b\x58\x5f\xa1\x33\xb3\xe5\xa9" + "\x1c\x9a\xc7\xf5\x13\x70\x2e\x92\x3b\x87\xb8\xbe\xc4\xc1\x9b\xdd" + "\xc2\x32\x55\xea\xc5\xf5\x51\x79\x81\x43\x1f\xb1\x79\xb1\xbe\xa8" + "\x32\x87\xab\x1f\x3e\x37\x88\x9c\x2b\x8f\xc7\xe7\xb2\x88\x1d\x72" + "\x18\xb6\xbf\x2a\x47\x5c\x7f\x85\xdb\x17\x65\xa0\xcb\xb4\xb8\x8d" + "\xe1\xdf\x90\x47\x2d\xce\xbf\x32\xa3\x09\xa7\xd9\x0a\xd7\x02\xb0" + "\x3f\xc0\xfe\x42\x33\x9b\xf8\x0d\xcd\x44\xf6\xef\x30\xec\x77\xb0" + "\x0e\xc1\xd7\x0d\xf4\x57\x56\xec\x8b\xe0\xfc\x78\xcd\x0b\xa0\x0b" + "\x7e\xf4\x87\x7c\xab\x22\xb8\x7b\x5f\x66\xb5\xc2\x8f\x51\xb4\xe3" + "\x9c\xe3\x3e\x68\x47\x5d\xf1\x7d\xf8\x7e\x87\xff\xc2\xbe\xcb\x8a" + "\x7d\x13\x79\xde\x4e\x8e\xe3\x6c\xdc\xe0\xd0\x45\xcd\x94\x53\x5a" + "\xbc\x57\x01\xf1\x69\x75\x9c\x3f\xbb\x80\xef\x65\xf1\x03\x5f\x99" + "\xd6\xc8\x7c\x9f\xb7\x08\xa9\x76\xdc\xc4\x7e\xf1\xe8\x79\x52\xce" + "\x53\x23\x48\x3d\x4e\xf9\xb1\xf5\x20\x3e\x55\x4f\xca\x72\xf4\xfc" + "\x8e\x26\xf6\x5a\x6f\x5c\x17\x7c\x6d\xa3\xd3\x35\xbc\x5f\x08\x5c" + "\x63\xf7\x7c\x77\xbd\xcf\xde\x9c\xe4\x96\x3e\x8f\xec\x67\xeb\xbf" + "\x63\x8b\xc3\xf7\x9e\x2a\x22\xe5\x3c\xb5\xc4\xe1\x77\xc1\x2e\xac" + "\xef\x65\xaf\xcd\xe6\xd2\x4c\xe4\xfe\xb2\xfe\xfd\xd4\x6e\x62\xd7" + "\x50\x8a\xd8\xbb\x2c\x80\xab\xc7\x01\x36\xce\xfe\x31\x0e\x6c\x7b" + "\x2a\xd7\x61\x5b\xe7\xff\xe3\xf6\x03\xcf\x57\xe3\xdf\x2c\xef\x53" + "\xd9\x18\x36\x17\xa7\xc1\x65\x22\x7d\x44\x55\x8e\xab\xa6\x86\x58" + "\x6f\x08\xee\x97\x88\x56\x3d\x13\xcc\x8d\xff\xa0\xe2\x45\x1f\x42" + "\xbf\x70\x3a\xde\xe1\x63\x18\x73\x14\xbb\x5e\xf9\x65\xfa\x34\xbb" + "\xc7\x33\x5e\xdf\xde\x39\x0d\xf6\x4f\x9f\x34\x19\xb8\x3c\x4f\x8f" + "\x70\xf8\x0d\xec\x4b\x2a\x4c\x17\x39\x4d\x77\xba\x76\x07\xe7\x4b" + "\xae\xd3\xa7\xaf\x08\x75\xd8\xe9\x2b\x42\x9f\xf1\xb5\xcd\xd5\x67" + "\x80\x6e\x5e\x63\xce\x3a\x7d\x50\xa0\x03\xe0\x9c\x67\xdf\x71\x5a" + "\x8f\xdb\x28\xde\xaf\x88\xf5\x4f\xec\x98\xd6\xd7\x93\x1c\x65\xc6" + "\x7e\xb3\xfe\x4d\xc7\xf8\xc5\xd7\xd7\xb0\x56\x13\x3e\xef\xeb\x08" + "\x81\xef\xc4\xcf\x73\xe4\xa7\x42\x78\xcf\x1b\xb0\x03\x1e\x6f\x39" + "\x6d\xe5\xfc\x7c\xbe\xc0\x57\x72\x7d\x18\xf6\x93\xc2\xbe\xea\xe8" + "\x05\x61\x5f\xf5\xf5\x39\x77\x1f\xf9\x75\x81\xf7\x7d\xd5\xd7\x19" + "\xd8\x6f\x39\x7c\xa4\xd0\x17\x7c\xbd\x77\x87\x40\xcb\x7e\x3d\xd4" + "\xa1\x65\x79\x3f\x7a\xba\x04\xfb\x28\x78\x7e\x11\x79\xf6\x99\x30" + "\xe8\xf7\xc3\x1d\xcf\x86\xeb\xf1\x15\x1a\xe0\x66\xd6\x51\x78\xc6" + "\x69\x7f\x4e\x03\xb2\x6d\xb3\x89\xdd\xf7\xe3\x54\x2c\xf0\xaf\x0b" + "\xe6\x59\xf1\xfc\x9b\xa8\x86\xef\x2b\x4a\xea\x17\x38\xec\x7b\xe6" + "\x33\x67\x5d\xb8\x7d\x0b\xb3\x0e\x9e\x93\xe9\x5c\xc7\x0d\x70\x6e" + "\x23\x37\x86\xc0\xda\x96\xcd\xeb\x4c\x42\xde\x16\x61\xdd\x48\x3d" + "\xce\xe0\xf1\x8c\x83\x38\x26\x82\xe7\x4f\xc6\xba\x07\xef\x59\x06" + "\x7e\xa6\x3a\xaf\x85\xf3\xc7\x23\x1a\x57\x3b\xeb\xab\x92\xa1\xd8" + "\x57\x72\xb1\x67\x29\xe8\x1d\xbd\xf3\x58\x4c\xf4\xaf\x63\x35\xda" + "\x45\x73\xe6\xa7\xcc\x7e\x4c\x33\x67\xfe\x9c\x94\x39\x33\x93\xe7" + "\xac\x98\x99\x32\x67\xc1\xfc\x88\x79\x33\x7f\x3f\xe7\x75\xcd\xb2" + "\x99\x8b\x35\x91\xba\xfe\xba\x2e\x88\x4f\xfa\xa4\x66\xe6\xe2\xc5" + "\x4b\xe6\xcd\x4a\xd4\xcc\x9f\xf3\xfa\xa0\x45\xb3\x16\xcf\x4a\xd1" + "\xcc\x5c\xb4\x60\xc9\xfc\x44\x4d\xff\xc4\x47\xfb\x47\x0e\x4f\xec" + "\xe2\x3c\x86\xd6\x4f\x8d\xea\xec\x0d\x57\x6a\x37\x36\x20\xff\x20" + "\x3f\xed\xa2\x20\xdd\x9c\xf9\x64\xcc\xee\xac\x6d\x70\x0e\xd2\xe2" + "\x7d\xc4\xf1\x1e\xb4\x4c\xd6\x59\x35\xfc\x55\xe1\x74\x50\x4f\x4d" + "\x1e\xde\x4b\xbc\x07\xd3\xcb\x9c\x75\xb6\xd8\x40\x9f\x63\xf7\xbb" + "\x06\x5b\x68\xa0\x6e\xbd\x98\x86\x13\xb5\xa0\xd9\xb4\x78\x6e\x76" + "\x5e\x03\x0a\xd1\x2f\x45\x2a\x38\x02\xe0\x50\xe3\x7d\xc6\xe1\x1e" + "\x93\x81\xfe\x97\x9a\xac\xdf\xff\xcf\x1c\x63\x57\x53\x3e\x93\x69" + "\xe2\xfa\xf9\x7f\x66\x3b\xc6\x99\x63\xd6\xa2\x18\xcc\xcf\x8b\xf4" + "\x3f\xd9\x77\x38\x6f\x01\x97\xf1\xd8\x6b\xfd\xe1\xe7\xc6\x80\x1e" + "\x3c\x5f\xfc\x00\x7b\x2d\xdb\x44\xa1\x00\x28\x97\xea\x68\x6a\x24" + "\x7a\x0f\x9e\xb5\x38\x94\x61\xcc\x59\xff\x8c\x73\x8c\xa7\xe1\xbd" + "\xdf\xa1\x2e\xd5\x5c\x3d\x9e\x62\xeb\xb1\x85\x09\xcb\xe9\x06\xe5" + "\xdb\x84\xcb\xf3\xcf\x35\x8e\x3a\x40\xb9\xab\x0d\xf4\xd9\x5a\xbc" + "\xf7\x3b\x2e\x97\xd8\x58\x1f\x1e\xef\x82\x72\x96\xdb\x97\x82\xdd" + "\xfa\x90\x3d\x8f\x36\xee\x20\xed\x0f\xea\xa5\xca\x83\xff\x67\xdd" + "\x44\x01\x1b\xf0\x7e\xda\xab\x7f\xc9\x94\x9b\xac\xa8\x32\xa9\x1a" + "\x05\x2d\x67\x8c\xcc\xdf\xae\xd4\x72\x75\xb2\x60\xdf\xf0\xd7\xff" + "\xc7\xde\xfb\xc0\x37\x59\x25\x0b\xc3\x93\x34\xa5\x01\x0b\x4d\x6b" + "\x95\x14\x2a\x06\x2c\x6b\x80\x02\x45\x61\x17\xd9\x22\x45\x40\x8b" + "\xf2\xa7\xf2\xcf\x2a\x08\x54\x5a\x48\xa5\x40\x6d\x03\x04\xb6\xd0" + "\x12\x40\x71\x05\x5a\x0a\x42\xd5\xd2\x16\xc5\x5d\x54\x5c\xbb\x2e" + "\xae\x75\x17\xb5\xda\xca\x76\x77\xa1\xe1\xee\x65\xdf\xed\x7a\xd9" + "\x35\x72\x6b\xb7\x72\x0b\x44\x1b\x48\x84\x24\xe7\x9b\x39\xe7\x79" + "\x92\x27\x69\x02\xfa\x5e\xdf\xf7\x7e\xbf\xef\xb3\x1a\x9e\xe7\x39" + "\x67\xce\x9c\x39\x33\x73\xe6\xcc\xf9\xff\x64\x9b\x86\xca\x84\x6d" + "\x45\x2c\xdd\xcd\x1c\x61\x6c\x51\xb3\xf7\x56\xe6\x64\x2f\x29\x7d" + "\xae\xbf\xe5\x10\x4f\xc8\xdf\xea\xb6\xd2\x9d\x5e\x7f\xcb\x44\x5e" + "\xd6\x49\xbe\xb1\x93\x5d\x5b\xa4\xf0\xa5\xfe\x46\x7a\xe6\x8c\x80" + "\x5b\x2b\xe3\xa6\x7b\xba\x29\x8d\x90\xff\xdf\x4e\x61\x1a\x87\x02" + "\xff\x91\x50\xfc\x84\x13\xdf\x1d\x72\x3e\xa2\x1f\xfe\x37\xf2\x09" + "\x1c\xa8\xcb\x8e\x08\xf9\xa5\x54\xee\x67\x67\x6c\x18\x5e\xfe\x0d" + "\x68\x10\xf6\x4c\xed\x7e\xc2\xdf\xa6\x45\xbe\x17\x10\xfe\xad\xb7" + "\x02\x6c\x43\x98\xee\xdd\xff\xab\xce\xc9\xef\x7a\x6e\xc3\xfa\xdf" + "\x54\x15\x3a\x66\x2d\xe9\xf3\x84\x10\x7d\xce\xa8\x24\x9f\x10\x5b" + "\x17\xd2\xa1\xf2\xcb\xd8\x0e\xe3\xf7\xa8\x7d\x60\xa4\x7c\xf0\xfd" + "\x34\x8d\x87\x20\x4e\x8b\x9c\x1f\x43\xfd\xdf\xed\x13\x63\x30\x92" + "\x6e\xa5\xda\x2c\x9d\x34\x37\xc1\x9a\xd0\xbe\x13\x8d\xa4\x63\x98" + "\xe6\xa8\xac\x53\xa8\xeb\x67\xb8\x5e\x25\x82\x91\xed\x6e\x4b\xa3" + "\x7b\xbb\x49\xaf\x6a\x50\x9f\x48\xaf\x10\xb6\x4d\xd6\x29\xd4\xb5" + "\xd3\x04\x87\x34\xf4\xa9\xdf\x98\xa1\x21\x1b\xd9\x1e\xf5\xf7\x99" + "\xa4\x63\xec\xc0\x43\x6d\xac\xff\xc2\x36\x21\xa7\xbf\xcf\xb4\xb9" + "\x85\x0c\x02\x7c\xff\xbb\x41\xc1\xf7\xd3\xa8\xc7\x7d\x88\xcf\x62" + "\xac\xfa\xef\x33\x91\xb6\xd3\xdc\x17\xdf\x84\x32\xe0\x6d\xd5\xdf" + "\x63\x29\xbd\xc4\xc3\x93\x01\x1e\xfe\xdd\x14\x8e\x87\x21\xbc\xd3" + "\xd0\x8f\xed\xfe\xbb\x99\xea\x0a\xa6\xa9\x96\xef\x8b\x0e\x27\x4b" + "\xcc\x43\xa3\xd9\x07\x5a\xca\xa3\x39\x91\xc3\x9f\x94\xf3\x28\x47" + "\x5e\x3b\x4a\x4d\xd7\xd5\xe7\xe6\x3a\x00\x1a\x13\xa7\xf4\x29\x89" + "\xc4\xdf\x4f\x63\x03\xe9\x99\x33\x34\xfd\xd0\x65\x41\xb4\x6a\xc5" + "\x3d\xd9\x9f\x1a\xf6\x4a\xf7\x64\x63\xfa\x19\xd7\xa3\x37\xc5\x20" + "\xda\xc9\xc6\x21\xa4\xdf\x9f\x6e\xb7\x55\x01\x50\x98\xf4\x6d\xee" + "\xc6\xb6\x27\x74\x7c\x3f\xf2\x7c\xc3\xa7\x9f\x04\xcf\x37\x7c\x7a" + "\x2c\xd2\x7c\x43\x70\xbe\xff\xa1\xa2\x7c\x7d\xb5\xf3\x54\x8a\xbc" + "\xbb\x7c\x61\xf2\x96\xd3\x8f\xaa\x53\xf6\x67\xfe\xe3\x61\xa2\xa1" + "\x15\xdb\x29\x36\x70\x9e\x8a\x21\x9e\x66\xde\x86\xff\x47\x96\xf0" + "\x5f\xc8\x2f\xfa\x8f\x34\x82\x09\x2d\x87\xff\x4f\x9b\xf8\x11\x3d" + "\xbe\xe1\x1f\xd1\xf7\x03\x8d\x42\x80\xa1\x4d\x8e\x56\x07\x01\x03" + "\x0b\xf3\x11\x0b\x30\x98\xc3\x33\xfc\x13\x41\xd2\xb7\x83\x7f\x68" + "\xfc\xf0\xfe\xf8\xff\xc6\x5f\x6f\x41\x2f\xc7\xe7\x06\x95\x94\x9f" + "\xb2\x4c\x53\xaf\x93\x9a\x81\x9c\x24\xdc\x1f\x8d\x14\x94\xcd\x8b" + "\x06\x18\xa2\xe7\xc0\x8c\x79\x44\x84\xff\x9b\x29\xbf\x29\x24\xf8" + "\x1b\xff\xa2\x16\x29\x32\xb8\x3d\x2a\x97\x2f\xb1\x1a\x9a\xe5\x0f" + "\x52\xd7\xe9\x94\x59\xea\xa0\x2c\x9a\xbf\xc4\xd1\x3f\x6e\xc4\x67" + "\xc4\xf8\x21\xe3\xfd\x00\x37\x3b\xb7\x28\xc0\xff\x2c\xc8\xbf\x63" + "\xc7\x75\xca\xf8\x5d\xff\x06\x29\xde\x6f\x17\x8f\x3b\x32\xbf\x47" + "\xfc\xd7\xff\x33\x9c\xee\x2d\xbf\x06\xd4\xe3\x8e\xd3\xe1\x40\x03" + "\xfc\x4f\x49\x93\x83\x94\x1a\x1a\x88\xbf\xf3\x68\xf0\xf7\x30\x53" + "\xf0\xf7\x88\x86\xef\x83\xf4\x46\xfa\xa7\xd4\x8e\x7d\x93\xe1\xdb" + "\xfc\x81\x71\x21\x55\x26\xae\x22\xa4\x0a\x05\xfe\x24\x6a\xa2\x00" + "\x52\x63\x15\xc1\x9a\xf0\xd0\xff\x67\xfe\x06\x6c\x91\x2a\xc4\xed" + "\x0e\x5d\x8f\xc8\x49\x21\x61\xf4\xdd\xcb\x20\x85\x8d\xf9\xa8\x07" + "\x3c\x0f\x33\x28\xbe\x55\x19\xf8\x4f\x1d\xea\xff\xd9\xef\x83\xd6" + "\x1f\xfe\xfe\x7f\xf8\xa7\xa2\xfa\xf1\xc3\xdf\xff\xa1\x3f\x26\x5a" + "\x71\xb4\x44\xfc\x41\xff\x31\xbf\xa1\x64\x52\x04\x93\x02\x98\xf4" + "\xf2\xbd\xb4\xe3\x3f\xfc\xfd\xf0\xf7\xc3\xdf\x0f\x7f\x3f\xfc\xfd" + "\xf0\xf7\xc3\xdf\xff\x07\xfe\x54\xbc\x1f\xc1\xa4\x3f\xff\xbb\x3f" + "\x9e\xba\x41\xf9\x89\x4c\xad\x02\xa6\x88\x28\x1b\x07\x2a\x2d\xf4" + "\xd2\x7c\x7f\x5e\x9e\xc1\x4f\xd0\xb7\x4c\x40\x7d\x49\x5a\x77\x74" + "\x37\xfe\x06\x2a\xc2\x53\xbe\x2f\x8a\xbe\xb7\x3f\x15\x32\x31\x0a" + "\xfb\x87\xd1\xd0\x0b\x62\x40\x0b\xbd\xa1\x0f\xdc\x04\xb1\xd0\x17" + "\xfa\x61\xbf\x53\x07\xf1\x90\x00\x37\x43\x22\xdc\x02\xb7\x42\x7f" + "\xd0\x43\x12\x0c\xc0\x12\x25\xc3\x6d\xd8\xc7\xbf\x1d\x19\x33\x18" + "\x86\xc0\x1d\xe1\xcb\x55\x06\x19\x7a\xfc\x07\xff\xcf\x82\x0c\xfe" + "\xbd\xf4\x87\xf0\xff\xab\xe1\x8d\x52\xf8\x69\x29\xdc\xfe\x43\xf8" + "\xff\xd5\x70\xc3\xff\xf0\x73\xf0\xff\xe8\x53\x85\xe6\x5b\x58\x70" + "\x55\x58\xbb\x19\x1a\xaa\x92\xfe\xfc\xdf\x70\x83\xf4\x3d\xf0\x05" + "\xa7\x0f\xfd\xcb\xc0\xdf\x58\xf1\x5a\x0a\x20\x8d\xf9\x32\xe5\x9f" + "\xe7\x62\xd0\x5f\x24\x44\xfe\x3f\xeb\x22\xfc\x99\xf0\x67\xc6\xdf" + "\x7a\xfc\x6d\xc5\xdf\x2e\x19\xad\x80\xa1\xe3\xd3\xbe\xca\x06\x38" + "\x87\xcf\xff\x1c\x8f\xcf\x6a\x7c\x9e\x01\x68\xc7\x74\xff\x3a\x02" + "\xd0\x81\x00\x5f\x2a\xc6\x46\xaf\x2c\x0d\x50\xdb\x7d\x52\xbc\x1b" + "\xf0\xe7\xa6\x35\xc2\x60\x57\x69\xec\xf8\x68\x9c\x36\x2f\xd3\x30" + "\x66\xd4\xd8\x51\xe3\xc6\x19\x46\x8e\x34\xdc\x95\x36\xe6\xae\xd1" + "\x69\x63\x47\xdf\x35\xc6\x90\x36\x66\xc2\xd8\xf1\x13\xee\x1e\x6b" + "\x58\xb5\xa1\x28\x7f\x4c\xda\x8a\x3c\xc3\xea\xdc\xfc\x62\xc3\xf2" + "\xfc\xa2\x55\xeb\x73\x8a\xf2\x6e\x58\xa4\xef\xfa\x47\xa4\xdd\xe6" + "\x03\x2e\x8d\x60\xce\x4f\x82\xa8\xff\xac\x83\x28\xe7\x11\xe8\x29" + "\x2a\xa3\xf4\x0b\xfb\xb7\xea\xb1\x05\x9f\x0e\x5d\xd8\xef\xe3\xc9" + "\x2b\x86\x4e\x9c\xf2\x4a\x79\x3d\xa8\xbc\x85\xa0\xba\x3c\x16\x54" + "\xff\x95\x06\xaa\xcf\x8e\x81\xea\x2f\x8d\xa0\xfe\x49\x22\xa8\x47" + "\x1d\x07\x75\x4a\x35\xa8\x93\x34\xa0\xbe\xc9\xd9\x33\x6c\x5a\xbd" + "\x08\x5b\x7f\x18\xd4\xab\x96\x82\x3a\xe7\x08\xa8\xe7\xcd\x13\x61" + "\xbb\x2a\x40\xbd\x75\xec\xf7\xcc\x8d\xff\xee\xdf\xb7\xf5\x2f\x7a" + "\xfc\xd9\xb9\x9e\x61\x7a\xcd\x5d\xb1\x61\x06\x51\x7f\xf8\xfb\xe1" + "\xef\x87\xbf\x1f\xfe\x7e\xf8\xfb\xe1\xef\x87\xbf\xff\x97\xff\x39" + "\x54\x30\xf6\x6b\xb5\x06\x3e\xae\x00\x70\x59\xb5\xc9\x76\x55\xfa" + "\x4e\x5a\x73\x02\xb4\xb7\x0a\xb4\xfc\x2c\x16\xf1\xd3\xe0\x23\x1a" + "\x1b\xfe\x5e\xf8\x8b\xd1\x2a\xd7\xae\xd0\xda\xa4\x26\x7d\x1a\x44" + "\xe9\x41\xac\xa3\xb2\xb2\xd3\x62\x0f\xf2\x5d\xd0\x05\x5a\xbe\x36" + "\x96\xf6\x93\x22\x7e\x8b\x1d\xde\xd0\xcb\xeb\xae\x64\x38\x5a\x77" + "\x45\xeb\xb4\x10\x96\xaf\xd1\x8f\xb0\xce\x46\xc7\x0e\xe8\xd5\x53" + "\x0e\x02\xd0\xbe\xd4\xbd\xfb\x99\xa3\xb9\x04\xa0\xe9\xb0\xd8\x9f" + "\x4a\x6b\x70\x10\x7f\x9b\x1d\x9e\x4d\x14\xeb\xae\x98\x73\x2b\x86" + "\x63\x58\x97\x1d\x7e\xae\x91\xf2\xec\x92\xc3\x6d\xdb\xae\x40\xb3" + "\x81\xef\xbf\x71\x34\x1b\xbc\x30\x75\x30\x95\xbf\xb7\x1e\xd3\xef" + "\x8c\xb4\xe6\x46\x5e\x5f\x46\x79\x4b\xf0\x99\x21\xf9\x61\x19\x7b" + "\x2f\x92\xf3\x8b\x80\x23\x96\xd2\xca\x78\x90\xf6\x2e\x4c\x53\x21" + "\xe3\x41\x7a\x64\x1a\x1d\x53\x37\xf1\x3c\x8e\x86\xa3\xc9\xf0\x49" + "\x7a\x74\xde\x8f\x47\xb7\xa7\x9f\x59\x9e\x62\xb8\x65\xcc\xb4\xbc" + "\x94\x3b\x59\x5a\x5c\xea\x73\x69\x37\x65\xf4\xce\xe8\x37\x7a\x4e" + "\x9a\x5a\xa7\x1e\xa2\x4e\x4b\xd0\xa9\x7f\xf4\x04\xfd\x7b\x7a\x90" + "\x91\x3f\x0d\x9a\xf4\x6d\xb9\x3f\x36\xc4\x4c\x7a\xe6\xe9\x75\x19" + "\xef\xfe\xf2\xfe\x8c\x07\x16\x14\x0f\xfb\x38\x4d\x7d\xf3\x5f\x9e" + "\x7b\xdf\xf8\x35\x41\x0c\x1e\x42\xff\x2e\x6a\x8a\x4a\x1c\x66\x25" + "\x2c\xa7\x93\x0c\x1f\x53\xc8\x70\x4d\xba\x39\x77\xdc\xe8\xc3\x94" + "\xe3\xfc\x65\x23\xad\x94\xe6\xfe\x99\x22\x8d\x80\x18\x7d\x4c\x19" + "\x37\xea\x6d\x4a\x6d\xe0\x34\x80\x46\xe0\xf2\xe3\xee\x2f\x28\x14" + "\xa1\x43\x4e\xa5\xdd\x26\xe5\xfd\x32\xfd\xfb\xd8\x2b\xa3\xd4\x88" + "\x21\x61\xe4\x7d\x14\x3b\xda\x95\xe6\x32\x34\xa7\x6b\x56\xa4\x18" + "\x63\xc6\xfc\x12\xdf\x52\x56\xa4\xe8\xd4\xf8\xfe\x8c\x78\x27\x1e" + "\xe4\xfe\x44\x40\xe8\xd4\x43\x13\xd3\x73\x73\x7f\xfc\x99\x33\xf7" + "\xc7\x3a\x75\xc6\xe1\xdc\xf4\x8c\x5b\x77\x16\x8c\x48\x49\x4f\xc9" + "\x1d\xa7\x53\xf3\xe7\x84\x8c\xa1\x3f\x7f\x4c\xa7\xbe\xf3\xa3\xb4" + "\x78\x9d\xea\x0f\x75\x2a\xf8\x44\x3d\xf7\xe8\x27\x51\x7f\xfd\xeb" + "\x09\x18\xbe\xea\x84\x6a\xf8\x8c\x13\x6a\x55\xfc\x89\xd8\x47\xe1" + "\x0f\xba\x18\xf8\x83\x1e\x7f\x86\x07\xa0\x45\x55\x9a\xd5\xa2\x5e" + "\xbf\xb4\x25\xaa\xb4\xb5\x45\xf3\x08\xb4\x44\x2f\x89\x6f\xe9\xf5" + "\xc0\xc3\x2d\x31\x8f\x7c\xde\xa2\xbd\x13\x5a\x7a\x03\xb4\x0c\x06" + "\x75\xcb\x10\x48\x6c\xb9\x2b\xfe\xe9\x96\x07\x06\xa9\x1b\x6f\xee" + "\x9e\xdc\x38\x40\x73\x7f\x63\x8a\x0e\x1a\x87\xf6\x81\xc6\x1f\xc5" + "\xc6\x36\xde\x89\xbf\x61\x50\xd7\x98\x86\xdf\xe9\x90\xdc\x18\xbd" + "\xb1\x17\x80\xa0\xe5\x84\x01\xe0\xc4\x60\x98\x74\x62\x08\x3e\xef" + "\xc0\x5f\x0a\xfe\x86\xe2\xef\x4e\xfc\x61\xff\xe5\x04\x9d\x37\x04" + "\xc6\x5e\xe9\xbf\xfd\x28\x27\x67\x6c\xce\xb8\x79\x53\xa2\xa2\xf2" + "\x52\xe0\x26\xe4\x9a\x26\x3d\x65\x70\xf4\xf8\xe8\xbc\x94\xcf\x9c" + "\x19\xf8\xaf\x4e\xfd\xf8\xbf\x47\xf5\x1a\xed\x1a\xef\x5a\xfa\xee" + "\x67\x5e\xe8\x83\xfc\x87\x50\x1d\xee\xb6\x82\xca\x89\x34\x3a\xad" + "\xdd\x93\x5d\xd6\x58\x9d\x1d\x7a\x9b\x64\x3d\x16\x71\x1f\xeb\x9c" + "\xd6\x32\xd4\xbf\xd8\xd4\xf0\x71\x5b\x28\x2e\xf3\x3a\xe9\x72\xc3" + "\xc7\x91\x4e\xc7\x96\xc9\x71\xdd\xea\xa6\x2c\xfc\x46\xfd\xd7\x8e" + "\x0f\x86\x6d\x8c\x72\x5a\x55\x5b\x30\xee\x68\x4f\x3c\x8d\x88\x67" + "\xea\xcf\x31\xae\x25\x4c\xdc\x83\x4e\xeb\x1c\xca\xa3\x3d\x24\x0f" + "\xa7\x9c\x07\xed\xfb\xae\xc1\xfa\x45\x76\xc7\x67\xed\xdd\x40\x69" + "\x6d\x6e\x07\x1c\xf6\x75\xaa\x34\x96\x93\x40\x78\x5c\xd6\xbe\x29" + "\x72\x7a\x82\xa3\x33\x0a\x68\xbf\x1e\x5f\x17\x0a\x7d\xe7\xd3\xba" + "\xd0\xdd\x88\xc3\xb0\x4e\xd5\xff\x1c\xc4\x7a\x29\x8d\x1d\xfa\x9a" + "\x9c\xea\x3f\x61\xde\x7d\x97\xca\x76\x0e\xc3\xd2\x41\xac\x3f\x77" + "\x62\xd9\xcb\x30\xae\xa4\x27\xcd\x7f\x4a\x10\x7c\xe9\x5b\x25\xc7" + "\x5d\x6f\xad\xa1\x48\xc3\x98\xd3\xfa\x27\x1f\xa6\x39\xd9\x13\x1f" + "\x2b\x73\x5a\xd5\x4f\x63\x5c\x67\x98\xb8\x2d\x22\xaf\x7e\x9a\x30" + "\x71\x56\x8c\x53\x63\x9c\x21\x42\x5c\x14\xc6\xa5\x87\x8b\x6b\xae" + "\xe6\x38\xb3\xfd\x3c\xef\xd7\x37\x03\xbf\x4d\x32\xcf\x6f\x5c\x1e" + "\x92\xf7\x18\xe4\x7b\xbf\xea\x50\xfc\x84\xdb\xa9\x3e\x45\xf8\x1a" + "\x7a\xe6\x7d\x52\xe5\xb4\x66\xa2\x2e\xf4\x3b\xd3\x33\xee\xcf\x03" + "\x91\x0f\x44\x97\x23\x4c\x5c\x32\x96\x07\xed\x75\x5c\x6c\x18\x9c" + "\xbd\x30\xce\x8e\x71\xc6\x1b\xc8\x43\xc7\x6d\x38\x9d\x8b\x30\x08" + "\xa2\x3b\x20\x61\x22\x95\x47\xe8\x05\xf4\xea\x80\xf8\x53\xdd\x62" + "\x8d\xbc\xc3\xb0\x11\xa2\xf0\xfb\x10\xb3\x36\xde\x82\xf1\x5d\xa8" + "\x4f\x5a\xdb\x15\x0f\x74\x40\xdc\x4e\x84\x89\xa2\x3d\xad\xd4\x3e" + "\x61\x78\x94\xcd\xed\xa1\x7d\x1d\xa8\x67\x71\xbf\xc6\xa7\x1a\xd3" + "\xbd\x40\x3a\x34\xb7\x1a\x52\x88\x46\xbe\xae\xd5\xda\xa8\xa2\x75" + "\xa2\xd4\x1e\x3a\xd5\x70\xa7\x93\xeb\x6c\x1c\xb6\x7f\xda\x3a\x69" + "\x4d\x2f\xd1\xa0\xc1\xb4\x9b\xd4\x3a\xbe\x46\xdc\x81\xb8\x88\x86" + "\x87\x7d\xd6\x46\xb5\x1f\x8f\xba\xf1\x26\x5a\xef\xdb\x6d\x55\x4f" + "\x77\xaa\xe3\x98\xc0\xa3\x33\xc8\x78\x08\x0e\xf3\xe2\xeb\xe6\xbb" + "\xad\x9a\x4a\x05\xcc\x54\x65\x5e\xa3\x9d\x10\x45\x34\x9f\x03\x5d" + "\x35\xe5\x27\x95\x91\xaf\xc1\xb5\xad\xf3\x80\x0d\xfd\x8b\x0e\xd0" + "\x59\xb0\xac\x86\x26\x37\xed\x7d\x6e\x8c\xaf\xdd\x0c\xc0\xeb\x85" + "\x1a\x0c\x12\xce\x2a\x19\x27\xe1\x50\x94\x35\x41\xe4\x4f\x65\xd5" + "\x82\x04\xdb\xac\xa4\x91\xf0\x62\xb9\xfa\xd7\x20\x5c\x33\x7a\x2d" + "\x12\x4c\xa7\x0c\xa3\x90\xc1\x60\x89\x3e\xe2\x0f\xc9\x6c\x91\x5c" + "\x3f\x5d\xd6\x78\x6c\xff\x6f\xea\x14\xf5\x36\x10\x2e\xd1\xa0\x17" + "\x34\xa8\x90\x06\x55\xa3\xc0\x1f\x9f\x29\xe3\xb7\x83\xce\xad\xa4" + "\xb9\x86\xc3\xea\x7a\x8b\x7a\xca\x61\xcd\x01\xd8\xb8\x20\x58\xe4" + "\x85\x5a\xc8\x00\xd4\x76\x88\xcf\x45\x7e\x44\x21\x4c\x3d\xca\xdb" + "\x20\xc3\x48\xe5\xd7\x63\xdc\x24\x09\x5f\xb3\x02\x9f\x99\xf0\xd1" + "\x3a\x59\x61\x7b\xe3\xed\x01\xdb\x07\x2d\xf8\xed\xe8\x69\x5f\xa9" + "\xbe\x26\x68\x11\x2e\x85\xc2\x0b\x87\x80\xee\x3c\xc4\x7f\xd1\xad" + "\x8e\xea\x14\xbc\x48\x40\xfb\xd7\xf7\xb0\x9c\x06\xbf\xc7\xda\xc1" + "\xe0\x96\xf2\xcb\x25\xde\x04\xec\x2d\xe5\x99\x30\x4f\xce\x53\x8e" + "\x57\xd6\x99\x8c\xde\xa3\xd1\x3f\xc9\x78\x3d\x23\x39\x63\x90\xec" + "\xbb\x4c\x6c\x5e\x9e\x32\xda\x39\xb1\xd9\x30\x2e\xed\xd5\xbc\x94" + "\x54\xde\xf6\xdf\x79\x2e\x6d\x08\xb6\xee\x7f\xe1\xff\x56\x52\x48" + "\x0a\x0f\xc1\x70\x7a\x1f\x42\xef\x92\xbf\x80\x6f\xf3\xe7\x46\xc5" + "\x0c\x2d\xa2\x37\xe1\x39\x64\xdc\xba\x78\x59\xd4\x54\xe9\xbd\x9f" + "\x88\x19\xc1\x7d\x0e\xe3\x7d\xf4\xfe\x23\x8e\x6b\xf4\x61\xca\x79" + "\xd4\x73\x69\x3f\x5d\xf0\x9b\xa8\x13\x4f\xaf\xcc\x88\xbd\xd3\x4a" + "\x30\xa9\x0f\xa5\xbd\x84\x21\x4d\x14\x32\xe4\x65\x4e\x81\x32\xd5" + "\x31\x4a\x25\xc5\x27\xa7\x4e\x4b\x7b\x7e\xe1\xdc\x3b\xfe\x92\x96" + "\x70\xf3\xc7\x8b\x9a\x28\xfd\xcd\x09\x41\x39\x0d\x09\x50\xf5\x44" + "\xf9\xb0\xed\x77\xbf\x2a\xb0\x2c\x98\x1b\xf5\x97\x8c\x41\x6b\x8a" + "\x28\xf4\x0e\xee\x8b\x91\xaf\x32\xfa\x72\x5a\xf4\xd3\x0b\x3e\xfb" + "\xdd\x82\x57\x4e\x3f\x36\x0c\x4b\x7a\x73\xe5\xe9\xc7\x16\xbc\xf2" + "\xd9\xef\xa2\xb6\x12\xe4\xf0\xdc\xb4\x44\x43\xf4\xc4\xb5\xcd\x0f" + "\x0f\xe3\x54\xf5\xdf\xa9\xaf\x4a\x3a\x3c\xa0\x7e\xe0\xf1\xe4\x96" + "\xdb\xfe\x7d\xd0\x3f\x6f\xff\xd2\xe0\x1c\xcc\xd0\x8f\x98\x9c\x36" + "\xd8\xef\x47\x00\xfa\x11\xe7\xd0\x8f\x28\x45\x3f\xa2\x55\xe9\x47" + "\xfc\xb1\xcf\x84\x12\xe1\x4b\x08\x78\xe1\xff\xa4\xfe\x3b\xfa\x3f" + "\xab\xd1\xff\x49\x3d\x11\x3d\xff\x91\x13\xb1\xf3\x84\xff\x13\x1f" + "\xd7\x8b\xfb\x40\x49\xf8\x44\x3f\xe8\x0f\x83\xf1\x69\xc4\xef\x61" + "\x09\x31\xc1\x3e\xd1\x9c\x7e\x2d\xd1\x8b\xd0\x27\x4a\x47\x9f\x28" + "\x23\xa7\x45\x3b\xfd\xa3\x96\xde\xe3\x33\x5a\xfa\xf8\xfd\xa2\xfb" + "\x5b\xa6\xea\x47\xb7\x4c\xd7\x40\xcb\x83\x20\x7c\xa3\x6d\x90\xf6" + "\x47\x4d\xa2\xea\xcf\xb1\xa0\xf9\x73\xbf\xba\x3e\x7f\x8e\x6b\x6c" + "\xfc\xb3\x0e\x7f\xf1\x50\xf7\xe7\x04\x88\xf9\x78\x72\x1d\x7c\x3c" + "\xa5\xd4\x7e\x42\x03\xfd\x4e\xf4\x86\xcb\x27\xe2\xf1\xb9\x74\x3f" + "\x9c\x78\x06\x34\x27\xfa\x68\x2e\x07\xca\x9b\xf8\xc5\x89\xc1\x9f" + "\x4c\x3c\x31\x24\xfd\x83\x13\x77\x4c\x9d\x73\x22\xe5\x93\x4f\x4e" + "\x0c\xb5\x0f\x52\xfa\x4d\x54\x66\x80\x11\xdb\xc8\x83\x45\x7e\x8f" + "\x33\xf6\x4a\xeb\xb5\x3d\x8f\xfb\x83\x3f\x96\xfc\xc2\x1f\x67\x4c" + "\x7b\x7a\xc1\x82\x65\x51\xea\x8c\x41\xdc\xbb\x94\x3c\xcd\x80\xf7" + "\x19\xec\x73\x4e\x6c\x0e\xf8\x9c\x29\xce\x80\xcf\x69\xe8\x35\x71" + "\x5d\x90\x7f\x76\x0d\xc3\xce\xa4\xa7\x18\x86\xa6\x71\xcf\xec\x74" + "\x52\xa8\xb7\x36\x6a\x57\xda\xc4\x14\xed\xb8\x36\xf4\xd9\x62\x76" + "\x3c\xb3\xec\x97\xf4\x43\xaf\xed\x1b\x9d\xfa\xe9\x27\x73\xc6\x67" + "\x6f\x1d\x8e\x32\xbf\x99\xbc\xe0\x98\x67\xb6\x37\x3c\xf3\xcc\xd3" + "\x0d\x27\x1e\x9b\x3b\xec\x6d\x0c\xfb\x38\xc5\x8c\xfa\xf3\xb7\xdc" + "\xbf\x8d\xbe\x9c\x1e\xfd\xcc\x23\x0d\x4f\x1f\x58\xb1\xa2\x99\xf4" + "\x85\x64\x2b\xb7\x51\xdd\xd6\x04\xf4\x49\x54\xef\xba\xac\xb7\xa0" + "\xff\x93\xd4\x12\xda\x96\xfd\x50\x2f\x7f\xa8\x97\x3f\xd4\xcb\xff" + "\x89\x7a\x79\x2b\x88\x7a\x99\xb4\x33\x5c\xbd\x9c\x3e\xeb\xfe\xd9" + "\x13\x0c\x6b\x97\x19\x0a\x8b\xd6\xac\x28\xca\x59\x65\x28\x58\x93" + "\x93\x9b\x97\xdb\x07\xfc\x11\x39\xcb\xcc\xf9\xeb\x72\xcc\x79\x3d" + "\xf6\x40\xea\x65\x9f\xb4\xa7\x6f\x9d\xe4\x8e\xec\x5b\x0f\x48\x0c" + "\xdf\x2f\x51\x61\xdb\x3e\x20\x2d\x4c\xdc\x10\x29\x6e\x46\x98\xb8" + "\xfb\xa4\x38\x53\x98\x3e\x60\x5f\xd1\xc7\x18\xb0\x2d\x5c\x1c\x86" + "\x57\xcb\x3e\x09\xf6\xd3\xd4\xcd\x43\xba\x80\x7c\x92\x0e\x18\xf0" + "\x09\x96\xa9\x13\xe3\x8f\xcb\xbe\x8c\x1d\x06\x6c\x93\x7d\x34\xa9" + "\x1f\x62\x74\x5a\x33\xb0\x9c\x03\xec\x61\xfa\x28\xc3\xa5\x7c\x3d" + "\x01\xdf\x68\x96\xc1\x65\x1d\x18\xdb\xd3\x37\x3a\x0d\xa2\x0f\x39" + "\xd0\x18\x02\x3b\x5e\x86\x45\x7f\x92\xce\x86\xe8\xa2\xbd\x6b\x5d" + "\x30\xf0\x38\xb3\x26\x55\x91\x4f\x49\xfd\x48\xc2\x23\xfa\x92\x6d" + "\xbc\x2f\x89\x7d\xc5\x76\x4c\x6b\x56\xf4\x27\xdb\xd1\x37\x8e\xa1" + "\xfe\x64\x07\x0c\x3c\x44\x7d\xca\xdd\x1c\xd7\x79\xc2\x35\x93\x70" + "\xd9\x61\x60\x23\xf7\xfb\x44\xda\x7a\xc5\xb8\x19\xf6\x6b\x07\xf2" + "\xf3\x45\x65\xbf\x10\xe3\x4f\xdb\x35\x89\xc7\xe5\x32\x90\x2f\x28" + "\x95\xa3\x4c\xc8\x61\x60\x98\xfe\xcf\xe9\x4a\xd1\x0f\x4c\xf6\xf7" + "\x7f\x08\x9f\xcf\x9a\xf4\xeb\x1a\x8e\x33\x39\x45\xc6\xa9\xd4\xcb" + "\x65\x6b\x56\x2f\xcf\x5f\xb1\xb6\x28\xcf\x50\x3c\x63\x86\x61\xd5" + "\x9a\xdc\xbc\x51\xa3\x46\xf5\x09\xd2\xbf\x58\xe1\xd3\xfe\x29\x83" + "\xf4\x90\xfc\x5a\x49\x0f\x33\xd0\xe7\x94\xfc\xe6\xe4\xb2\xe0\xfe" + "\xc5\x9f\x32\x24\xff\x56\x87\x30\x69\x12\xcc\xe1\x20\x18\xc4\x27" + "\xf9\xc8\xe4\xe7\xf6\x93\x60\x5a\x42\xf1\x60\x1c\xef\x17\xd1\x7e" + "\xbc\x6e\x51\xbe\xae\x10\x3c\x93\xa5\xfe\x0e\xea\x7d\x2f\xa9\x9f" + "\x70\x9b\x2e\x04\xcf\xe4\x40\x7f\x43\x25\xc3\x8c\x55\xf6\x4d\xf0" + "\x7b\xaa\x2c\x93\x80\x1f\xdf\xd4\x29\x70\xab\x74\x01\xbf\xff\xb6" + "\x82\x90\xbe\xd4\xad\x01\xdc\xa0\x93\x60\x2a\x82\x69\x6c\x3a\x2f" + "\x95\x55\xab\xc0\x73\x2c\x18\x4f\xd3\x7f\x49\x78\xa2\x14\x30\x6d" + "\x21\x34\x76\xf6\xa4\xb1\xb1\x9f\xc0\x5d\x87\xf9\xdb\xa5\xb2\x0d" + "\x0a\x29\x3f\xc2\x70\xdc\x89\x08\x93\x2c\xc3\x8c\x55\xf6\xa5\xa8" + "\x3f\xc7\xf7\x68\xc2\xa0\x19\xa4\x4f\xf8\xeb\x85\x74\xff\x4b\xd1" + "\xa7\x8b\x91\xd2\x85\x96\xbf\x6f\x37\xf6\x17\x6a\x83\xfa\x69\x83" + "\x42\xca\x8f\x7d\xc3\x04\x99\x47\x1a\x19\x26\xb4\xfc\x76\x41\x63" + "\x7c\x7c\xa0\xfc\x83\xda\x42\xf0\xdc\x4a\x3a\x45\xb8\x14\x79\x79" + "\x42\xf0\x9c\x93\xf8\xa8\xe0\xf5\xed\x86\x10\x79\xfc\xa7\x44\x8f" + "\x82\xd7\xb7\x4f\x0d\xc1\x73\x89\xe2\x83\xcb\x75\xbb\x29\x04\xcf" + "\xa5\x40\xb9\x50\x8f\x05\xcc\xce\x90\x7e\xac\x9a\x59\x3f\xee\x1b" + "\x82\xa7\x5e\x86\xe9\xee\xf5\x74\x9d\x90\xed\xed\xcd\xb2\x2d\x12" + "\x72\x4d\xe6\xfb\x76\x31\xfc\xac\xd2\x16\x20\x5d\x9d\x3d\xf9\x64" + "\x80\x50\x3e\x29\xe8\x92\xfa\xe2\x86\x94\x90\xf2\x9d\x97\xf8\xd4" + "\x47\x81\x27\x33\xa4\x7c\xff\x25\xe1\x89\x56\xc0\x84\xc8\xbf\xa9" + "\x4b\xc2\xa3\x51\xc0\x84\xea\xff\x05\x09\x8f\x32\xaf\x63\x37\xe6" + "\x93\x21\x48\xff\x89\x57\x18\xd6\x75\x83\x31\x28\xad\x98\x3b\x18" + "\x8c\xed\xdf\x61\x3e\x06\xcf\x12\x86\x2f\xa2\xb3\xa6\xd0\x46\x67" + "\xf0\xb1\xc1\xab\x64\xa7\x07\x5b\x6a\xd1\x9e\x89\x32\x40\x9a\xb0" + "\xdd\x83\xf9\xbe\x75\x4c\x9b\x65\x87\x7e\x66\xe5\x3c\x80\x1d\x06" + "\xef\x94\xe2\xb0\xfc\xb7\xb4\xc9\x71\x14\x2e\xc6\x17\x07\x63\xfb" + "\x97\x54\x28\xda\xb1\xc1\x05\x12\x2c\xda\xfd\xe4\xcc\x70\xfb\x9a" + "\x23\xcd\xbf\x14\xeb\x99\xaf\x34\x09\xe5\x5f\xd9\xdf\xee\xb3\x32" + "\xb0\x59\xdc\x60\x18\x00\xa5\xe7\x60\x88\x96\xfa\xf8\xbb\x37\x82" + "\xb6\xb4\x90\xb9\xe9\x5c\xda\x56\x47\x17\x94\x3a\x58\x27\x9d\xfd" + "\xba\xf9\x32\x68\x6d\x1e\x7e\x8f\x9d\xbe\xb9\xe4\x8b\xb0\x7b\x75" + "\x7d\x6a\x06\xa5\xc9\x94\xb6\x1d\x5a\xab\xdb\xa1\xb4\x3a\x38\x6d" + "\xe9\x6d\xa0\x3f\x45\xe7\xc8\x5a\x21\x8e\xe8\xa0\xf9\x14\x4f\x42" + "\x7f\x7b\xc9\x0b\xa0\x29\x45\xef\xf2\x54\x6e\xa3\x4c\xcb\x69\xa2" + "\x65\xdb\x79\xd0\xbe\xb2\xbc\x51\xbd\xf5\x3c\xd1\x7b\xbb\xfd\xad" + "\x8d\x6e\x75\x93\x7e\x06\x34\xe9\xcf\x42\xb3\x7e\x22\x34\x5b\xa6" + "\xc2\xee\xf3\x10\xdb\xe4\x4e\x87\x66\xcd\xfd\xd0\x9c\x32\x15\x6c" + "\x5d\xf8\x6e\xf0\x22\x8c\x93\x9f\x8b\xd4\x01\x43\x1a\xf7\x3d\x09" + "\x5a\xbb\xc0\x89\x3c\x1b\x72\x52\x3e\xe3\x87\xbe\xc3\x95\xa3\x38" + "\x09\xf4\x48\x5f\x27\xd2\x72\xcf\x39\xb8\x23\x3a\x45\x0f\x69\xd4" + "\xfe\xda\xaa\x3c\xa0\x29\x81\xde\x11\xf4\x22\x91\x9f\x0f\x8a\x7e" + "\x54\xcd\x7e\x6c\xeb\xf1\xd9\x8d\x3a\xe1\xb2\xde\x91\x8e\x79\x9f" + "\x95\xc6\xbd\xba\x4a\x0f\xa1\x9e\xad\xcf\xa6\xf3\x42\xb0\x9d\xbe" + "\x23\x5b\x8e\xa3\x73\x4f\xe9\x3c\xd3\xd1\x89\xa0\xb3\x79\x32\xe0" + "\xc3\xab\x9d\xb4\x27\xbf\x8b\xce\x49\x20\x7c\xd8\xe6\x47\xd1\xf8" + "\x13\xd2\x33\x0c\xdb\xf8\xae\x3b\x10\x0e\xd3\xa3\xfc\xff\x9d\x8f" + "\xb9\xb0\xfe\x0b\x9d\xbe\xfe\x0b\x2f\xfb\x0e\x2c\xec\x66\x07\x16" + "\x7e\xed\x3d\xb0\xf0\xab\xd2\x0d\xa0\xf5\xf6\x5f\xe8\x68\x2d\xe4" + "\x32\xd0\xb5\x16\x5e\xa0\xfd\xf5\x5a\xba\xc3\x72\xf1\x53\x28\x7b" + "\xcf\x3f\x60\x53\x3e\xe8\x7d\xf1\x83\xaa\x6c\x9e\xbf\xc2\xe2\x12" + "\x60\xf8\x7e\x24\x5c\xf9\xba\x13\x0c\x06\x79\x3c\xcd\x65\x4d\xd1" + "\xd9\x35\xb7\x72\x1d\x75\xc4\x1b\x0d\xf8\x4b\xc1\x9f\x11\x7f\xa9" + "\x2c\xc1\x90\x8a\xbc\x2a\xed\xb7\x45\x05\x74\xae\xcf\x68\x1f\xa8" + "\xce\x43\x4a\x2a\xd2\xaf\x8b\xc0\xb7\x64\x5f\xe5\x8a\xa5\x77\x96" + "\xc1\x66\x3a\x0f\x98\x7c\x00\xaa\x5f\xe4\x8f\x62\x3e\x16\xbb\xa6" + "\xbf\x68\x8f\xf6\x63\x3d\x4a\x58\xb1\x94\x7c\x3a\xe7\xcf\x4c\x2a" + "\xc7\xcf\x4c\xea\xee\x84\x15\xcb\x10\xa6\x1a\x61\xb2\x24\x1e\x76" + "\x12\x2e\xac\x37\x8e\xbe\x1e\x88\x42\x9c\x85\xef\x5e\x69\xd3\x1c" + "\xdc\xcf\xce\x22\x5c\xb3\x1f\x17\xe2\xde\xc7\xfd\xa4\x94\x36\x39" + "\x8c\xfc\xa4\x5d\x08\x47\xe9\x6d\xee\x0c\x9a\x33\xb4\xdb\x0a\x3a" + "\xe9\x5c\x8b\x3e\xec\x9a\xc8\x8f\x7c\x38\xaa\xab\x7d\xdd\xd0\xcb" + "\x65\x85\x2c\xc2\x4d\xe9\xe8\x1e\x0f\x4c\xb7\x8c\x95\x9a\xd0\x5f" + "\x84\x59\x2e\x66\x52\xd1\x19\xb7\x4d\x98\x5e\xe4\x3d\x34\x43\xa6" + "\x91\xf2\xe0\x67\xdc\x12\x9d\xa8\x0f\x4d\x05\x6e\xe8\x5b\x45\xe3" + "\xe4\x30\x97\xf0\x11\x2e\xd4\x03\x3b\x96\x75\x59\x53\x81\x03\x7c" + "\x2c\x08\xa7\x5d\xc2\x57\x11\x84\x0f\xc3\x19\xe2\x23\xfd\x6b\xc6" + "\x34\x7d\xeb\x38\xbe\x39\xef\xfa\x08\x9f\x1b\x34\x06\x4e\xef\x02" + "\xc2\xc1\xcf\x8a\x46\x9c\x8d\xeb\xee\x43\xdf\x71\xa8\xdb\x51\x6a" + "\x8a\xe2\xfb\xe9\x31\xfd\x5b\x9b\x3b\xa3\x59\x77\x76\x54\x3f\xbe" + "\x97\xfe\x3e\xa0\xb9\x56\x84\xf9\x3b\xeb\x36\x45\xf5\xed\x42\x5f" + "\x0f\x61\xe8\x7c\x2d\xa2\x53\x29\xcb\x39\xd3\x16\x4c\x84\x05\x53" + "\xa7\x4f\x9d\x08\x33\x27\x4f\x99\x08\x69\xf7\x8c\x4c\x1b\x7b\xf7" + "\x4f\xee\xe6\x2f\x77\xff\x64\xfc\xdd\x90\xf5\xc8\x9c\x89\x90\x35" + "\x6b\x22\xcc\xc5\x5f\xd6\xdc\x69\x73\xa6\x4e\x9b\x3b\x11\xb2\xef" + "\x9f\x8e\x5f\x53\x26\x8e\x49\x7b\x60\x64\xd6\x94\xe9\xd3\xe0\xe1" + "\x79\x77\xa5\xdd\x75\x17\x4c\x9e\x36\x63\x4c\x5a\x9a\xf4\x1c\x93" + "\x46\x20\x8f\x8d\x9f\x36\x77\x64\x56\xd1\x1a\xf3\x9a\x91\xb3\xa6" + "\x4f\xa1\x10\x98\x36\x6d\x62\x56\x90\x1f\x69\xf4\x5e\xf1\x12\xbf" + "\x9d\xec\x52\x26\x9d\x6b\x0c\x35\xa8\x07\xf8\xeb\xe2\xe7\x25\xc1" + "\x9d\xff\x56\x43\xf2\xe3\x6d\xc1\x8f\x12\xa9\x3d\x75\x59\x7f\x44" + "\xf2\xaf\x20\x3e\xd2\xd9\xc2\x1d\x30\xea\x59\x8c\x4b\x92\xfc\x91" + "\x68\x8c\x77\x07\xc7\x0f\x5b\x84\xf1\xb7\xd3\xf9\x3b\x36\xfc\x21" + "\xef\x9d\x68\x0f\x91\xc7\x0e\xe8\x2e\xcd\x8e\xe6\xe7\x1f\xa2\xdc" + "\xe9\x5c\x0a\x97\xf5\xce\xb1\x8a\x7a\xdf\x4e\xe7\x57\xd0\x78\xf2" + "\x45\xb8\xb3\x6f\xab\x39\x83\xce\xa8\x02\x9b\x59\xc2\x71\xd9\x8f" + "\xa3\x8f\x74\x86\xa2\xbd\x86\xce\x06\x11\x78\x4a\x14\x36\xc2\x4e" + "\x78\x76\x63\x9c\x84\xeb\xe1\x56\xb4\x15\x68\xcb\xcf\xfb\x4a\x8d" + "\xc0\x12\xfa\x77\xfa\xae\x19\x41\x8c\xbf\xde\x79\x4c\xa1\xdb\xce" + "\x66\x0b\xc2\xbd\x92\xa9\xa2\x73\x1a\xf8\x99\x0d\xf0\xa3\x46\xd4" + "\x71\xa7\xb7\xd2\x38\x86\x5d\xe2\xe7\x24\xf6\xc2\xf2\x8d\xc4\xf2" + "\xa5\xf8\x2a\x8d\x69\xfc\xcc\x51\x0e\x67\x4c\x64\xf4\x9d\x80\x70" + "\xd7\xfc\x61\xb7\x50\x98\x8b\xe6\x77\xe8\x0c\x6f\xc6\xc3\xa3\x30" + "\xfc\xaf\x68\xd7\xda\x10\x36\x8d\x60\x47\x7b\x20\x86\x9f\x8f\x52" + "\xaa\x82\x73\x60\x5c\xe4\x4b\x30\xde\xa5\xc8\x8f\xf0\x2c\x12\xed" + "\x18\xca\xe2\x12\xe2\xe9\xe6\xe1\x6a\x0c\x7f\x0f\xf1\xdf\x4d\xf6" + "\x52\xd8\xf0\x51\xf2\x59\x7d\x0e\xe1\x43\x8e\x92\xcf\xea\xeb\x14" + "\x78\x46\xbd\xd6\x84\xbc\xa4\x79\x02\x9a\xe3\x77\x59\x8d\xe8\xff" + "\xa4\x64\x8a\xb6\x72\x14\x5f\xe3\x49\xe7\xcd\x32\xdd\xeb\x15\x88" + "\x77\x6c\xe3\xc6\x2e\x7e\x77\xab\x1d\x8c\x05\xbe\x52\x13\x84\xd0" + "\x64\x24\xfa\xc9\x86\x20\x2f\x46\xa2\x1e\xf4\x76\x59\x87\x41\x88" + "\x1e\x24\x23\x9e\x31\x48\x5f\x1b\x96\x69\x0c\xe2\x49\xf1\x75\x9b" + "\x30\x5f\xec\x2f\x32\x13\xfa\x4a\x01\x1c\x52\xfa\x8c\xe0\xf4\x77" + "\xb6\x53\x3a\x84\x8f\x76\x75\x13\xfc\x9d\x9d\xc4\x73\x49\xef\x50" + "\x2f\x87\x15\x86\xe8\xe5\x2a\xa4\xe5\xc7\x8a\xf8\x8a\x90\xf8\x87" + "\x31\xfe\xa7\x52\x3c\xd6\xfd\x61\xf5\x21\xf4\x9e\xc4\xf8\x49\x48" + "\xaf\x13\xeb\x76\x14\xe6\x47\x67\xb0\x3a\x14\xf0\xf6\x10\x78\x0f" + "\xc2\x4f\x21\xbd\xa1\x76\x87\xe0\x6b\xa5\xba\x83\xf0\x5a\x97\x75" + "\xb8\x2e\x24\xff\x31\x08\x3f\x23\x40\xdf\xf0\xb4\xe0\xf8\xe1\x6e" + "\x8c\x7f\x98\x74\x1d\x9f\x8f\x93\xaf\x4f\xf6\x84\x6c\x59\x53\x01" + "\xc9\x6b\xf8\xd2\x10\xf8\x32\x84\xcb\x95\x78\xa4\x96\x78\x74\x58" + "\xea\xbb\x9f\x95\x68\xd8\x17\x92\xe6\x18\xa6\x29\x40\x3e\x8e\x91" + "\xf5\x32\x4c\x9a\x96\x90\x34\x9d\x24\x47\x26\xf2\xd1\xb8\xae\x05" + "\xd2\x48\x76\x52\x89\x83\xca\x76\x93\xcb\x3a\x22\x36\x18\xc7\xc8" + "\x0a\xcc\xd7\xbc\x4b\xd8\x9d\x9b\x50\x87\xee\xc2\xb0\x2d\x88\x73" + "\x1c\xd5\x81\xdd\xe4\x0f\x3a\xdc\xc0\x4a\x33\x63\x85\xee\x8e\x58" + "\xd5\xcf\x03\xf4\x3e\x92\xde\x09\x37\x73\xcd\x90\xea\xe4\x88\x55" + "\xf8\xa4\x70\x7e\xe7\x0c\xd9\x61\xe6\x7a\xc8\x27\x70\x8e\xd8\x43" + "\xf7\x85\xe1\xb7\x57\xca\x63\x03\x9d\x29\x8a\xf4\xdf\x85\xed\x0e" + "\xb0\xf5\x08\xb7\x11\xa6\x60\xf8\xe3\x18\xf6\x63\x09\x2e\xf0\xbd" + "\xfe\x21\x8f\x14\x3f\x52\xe4\x99\x49\xfa\x3e\x16\xbf\x87\x4a\xf8" + "\x6e\x23\xfc\xf8\x3e\x46\x7a\x57\x79\x09\xf7\x25\xb9\x4e\x8e\xe4" + "\xe7\x5c\x52\xbd\xe4\xf9\x61\x7a\x3a\xcf\x55\xca\x83\xe8\x9f\xde" + "\x01\xa9\x17\xf0\xf9\x30\x3e\xff\x48\xe7\xab\x96\x7a\x79\xfd\xa4" + "\xef\x77\xf0\x39\x07\x9f\x87\xf0\x39\x17\x9f\xbb\xf0\x79\x1f\x3e" + "\xf3\xa9\x9e\xd0\x59\xf1\x74\xe6\x0d\xb6\xb5\x42\xd7\x68\x2e\xd0" + "\x95\x49\x38\xa7\x21\x0c\xe7\x85\x4f\xd8\x1b\xad\x90\x6b\x2a\xbf" + "\x63\x07\xf5\x83\xc2\x62\x84\x7e\x88\x30\xaf\x6c\x97\x2e\x05\xc2" + "\x24\x5b\x25\xd5\x4d\x29\x4c\xe0\xcf\x42\xfc\xa9\x44\x2b\x13\xb8" + "\xa2\x85\x0e\x48\xf8\x45\x3a\x4d\x98\x3c\x55\xca\x3c\xf1\xc9\xcf" + "\x4b\xb2\xc3\x08\xee\xaf\xd9\x61\x64\x32\xdd\xe3\xe4\x23\x99\x14" + "\xc1\x0c\x94\x5d\x0b\xc9\x40\xd6\x29\x26\x74\xb4\x17\xbd\xfb\xd6" + "\xaf\x44\x1b\x85\xf1\xeb\x57\xfa\x24\x3d\xe4\x30\x3c\x9e\xd3\xc2" + "\xcf\xee\x40\x9c\x23\x2a\x48\x3e\x3c\x5e\x84\xa7\x2a\xf4\x32\xc1" + "\x65\x1d\x79\x38\x44\x2f\xdb\x50\x2f\x9f\x26\xfd\x23\x99\x11\x5f" + "\xfa\x15\x72\xbf\x40\xed\xc7\x7f\x49\xe8\x77\x8d\xb4\xce\x49\xd8" + "\x82\x91\x5d\x21\x75\x5b\x8b\x78\x7e\x1e\x62\x3b\xba\x02\x6d\xe4" + "\xa8\xe4\x10\xdb\x76\x18\xf3\x3b\x6c\xc7\xba\x25\xd9\x68\x67\x54" + "\x09\xd5\xbd\x51\xd8\xff\xbd\x90\xcd\x7d\xd5\x4a\xe3\x4f\x08\x8f" + "\xb3\x94\xdf\x11\xe0\x8c\x2a\x24\x9b\x31\x2a\x57\x8e\xe7\x71\xf1" + "\x2b\xec\x54\xa7\xa2\x0a\x78\x5c\x99\x1d\xee\xd0\xc9\x71\x20\xce" + "\x9e\x73\x46\x99\x79\x5c\x75\x00\xaf\x5e\x2b\xe1\x8d\x0a\x7b\xbf" + "\x43\x45\x7f\x37\x2a\xbf\x7a\x78\x19\x44\xdb\x3c\x67\x60\xb6\x87" + "\x79\x47\x94\x41\x6f\x9b\xe7\x28\x0c\x03\x88\xb7\x79\x8e\xd3\xc2" + "\xff\xc1\x36\xcf\x3e\xf4\x7d\xb6\x51\xfc\x87\xc3\xca\x54\x2a\x7c" + "\x96\xde\x09\x6a\x95\xcd\x53\x0d\x3f\x02\x0d\x3e\xcd\x70\xff\x76" + "\xe6\xb2\x79\x72\x11\xae\x00\x66\x7b\xd9\xa5\xa9\xd1\xec\xb3\x25" + "\x5e\xd0\xcd\xd8\xce\x4a\x6d\x1e\xec\x87\x78\x4e\x62\xb8\x8f\xcd" + "\xf6\x7e\x83\x3f\x17\xf3\x55\xe8\xb5\xb3\xbd\x97\xd8\x94\xed\x1f" + "\xe2\xf7\x67\x6c\x4a\x74\x29\x43\x79\x32\x9b\x27\x1d\x5a\x9d\x4e" + "\x84\x1f\x0b\x6c\x4f\x7f\xf7\xe2\xcb\x6a\xb8\x46\xf7\x32\xec\xd1" + "\x6b\xb1\x3c\xfa\x6b\x58\x16\x96\xa0\xef\x7f\xed\x67\xf8\xac\xd4" + "\xdf\xca\xbf\x75\x7a\x23\xab\xd0\xeb\x47\x96\x61\x9f\xc4\x82\xe5" + "\xf0\x3a\x18\xfa\x3b\x1a\x9b\xe5\x2c\xf4\xdb\x42\x7e\x7d\x3a\xd0" + "\x1d\x73\x28\xaf\x38\x81\x57\xaf\xa7\xfe\x1c\x8b\xc7\x74\x95\xfa" + "\xa1\x1c\x47\x85\x3e\x33\x4e\xc5\x1c\x68\xdf\xe3\x88\x17\x36\xcf" + "\x59\xa0\x3b\xe9\x89\x07\x74\xc6\xf8\x6c\x2f\xdd\xb1\xa1\xcf\xbc" + "\x16\xaf\x1f\x8f\xbf\x6c\xfc\xed\x40\x3a\x5e\x64\xd6\xc4\x8f\xe8" + "\x4c\x4e\x4c\x7f\x04\xbf\x1b\x9c\xfc\x7c\x6a\xa2\x01\x62\x10\xfe" + "\x08\xea\xd5\x54\xd4\x4f\xa2\xb5\x8d\xe7\x53\xa9\xff\x9b\x93\xf1" + "\x32\xfc\x2f\xa9\x0c\x7f\x95\xca\xe4\x96\xea\x1b\x85\xb9\xf0\x7d" + "\x9e\x8b\x71\xba\xdc\x4c\x97\xa4\x75\x63\x1d\x46\xbe\x96\x11\x1f" + "\x91\xaf\x65\xc4\x4b\xc4\x8f\x7d\xcb\x9d\x58\x8e\x24\xed\xb5\xf8" + "\x24\x3d\xab\x4c\x1a\x7e\x8d\xfb\x3d\x49\xe3\x9d\x1c\x4f\xd2\x4f" + "\x10\xcf\x22\x8e\x47\x97\x34\x9e\x55\x24\x65\x7a\xad\x06\x98\xbd" + "\x81\xb9\x67\x7b\xb6\x78\x96\x6c\x80\xa8\x54\x28\x53\x51\xbf\xc7" + "\x66\x29\xc0\x72\x36\xe3\x73\x2a\xc6\xc3\xcd\x98\xd7\x87\x88\x77" + "\x3c\xe5\xc7\xf6\x24\x65\x22\xce\x69\x88\x2b\x97\xe8\xbb\xaa\x06" + "\x1d\x7e\x67\x5f\x25\xfa\x2b\x92\x2c\x88\xbb\xca\xa7\x4b\xda\x21" + "\xeb\x10\xe9\x8f\xe0\x1b\xe9\xcd\xab\xd8\x7a\x81\x6e\xb6\x85\x79" + "\x30\x4e\x67\xb3\x50\x78\x35\xb4\x16\x22\x8c\x85\xe2\xcd\xf8\x3e" + "\x13\xdf\xb7\x01\xe9\xcf\xac\x42\xe7\x96\x51\x65\x85\x74\xff\xc9" + "\x87\x4b\x3c\x5a\x58\x5c\xa8\x29\x6b\x2d\xec\xc2\xb8\x2e\xc0\xb0" + "\x52\x9b\xa5\x9a\xf7\xd3\x50\xae\x1e\xaf\x6e\x80\xde\x5b\x91\x64" + "\xea\xe7\x2c\x65\x36\x8b\x19\x61\x0b\x61\x58\x99\x56\xc5\xe1\x2d" + "\xb9\xbc\x3c\xbe\xdd\x65\x40\x69\x4e\x99\x8e\x02\xf5\xf7\xb0\xec" + "\x8e\x53\x5d\xdb\x48\x47\x7d\xbe\x8a\xa4\x4e\xd4\xcf\x6b\xa7\x4c" + "\xfb\x60\x66\x57\x59\x0c\xf2\x43\x85\xe1\xde\x53\x5d\xcd\x08\x7b" + "\x52\xe8\xec\x06\x4f\xdc\x29\xd3\x36\xf0\xe8\x92\xb2\x3d\x15\x49" + "\xee\xd9\x1b\xae\xb1\x99\x26\xf6\xe1\xe3\x5d\x65\xa8\xa7\x47\x61" + "\xe6\x05\x4f\x54\x6b\x21\xea\xfc\x06\x17\x86\x7b\xb8\xfe\xcf\xbc" + "\xd0\xcd\x66\x3d\xc5\x2e\xcd\xde\xf0\x19\x3b\x65\xca\x85\xc5\x4e" + "\xe8\x77\xd3\x16\xe6\xa3\x7a\x71\xb2\xfd\x28\xdc\x74\xb6\x13\xa8" + "\x4e\xcc\xc8\xf1\xb1\x99\x17\x2e\xb1\xc5\x4f\x61\x1f\xd7\x92\x8e" + "\x34\x22\x5f\x9c\xfb\x88\xdf\x96\x53\xa6\xe3\x48\x03\xd6\x1b\xcb" + "\x58\x0c\x7b\x15\x61\x1b\xe3\x1e\xbf\xa0\x83\x93\xed\xfb\xc0\x13" + "\x9f\x94\xed\xdd\x93\x64\xf2\xc5\x27\xed\x40\x19\x55\xf9\xf6\x24" + "\x75\x7a\xe3\x07\xe8\x3d\x7b\x92\xdc\xac\x72\x80\x09\xe5\xd4\x9b" + "\x64\x7e\xd5\x0a\x06\xfc\x5e\x7e\x95\xeb\xd1\x00\x94\xd3\x80\x2a" + "\xf4\xb3\x19\xf1\x92\xed\x19\x60\x11\x75\x60\x40\xd5\xb5\xf8\x01" + "\x3b\x10\xae\x4a\xe8\xe1\x80\x23\xa4\x97\x74\x5f\x11\x86\xfd\xd2" + "\x8b\x69\x31\xbe\x01\x7f\x2d\xf8\x6b\x63\x95\x03\x8d\x88\x3f\x9e" + "\xf0\xfb\x2a\x06\x8e\x67\xba\x81\x99\xa3\x00\xb4\xad\xce\x76\xa0" + "\x71\x0e\x3e\x2e\x60\xf9\x07\xd2\x4c\x3a\xe5\xc1\xa7\x07\xeb\xc6" + "\x40\xa3\xef\xde\x0a\x5e\x07\x59\xfc\xc0\xcc\xd9\xde\x49\x6c\xf1" + "\x65\xaa\x4f\x18\xbe\x07\x71\x24\x0c\x34\xb9\xb9\xbe\x0e\x5c\x41" + "\x34\x5c\xfb\x99\x91\xf0\x68\x30\xde\x82\x61\xe7\x9d\xcc\x08\x98" + "\x57\xa7\x4f\x97\x9c\x89\xb8\xb0\x3e\x24\x6b\xbd\x15\xc9\xfa\x87" + "\xa2\x99\x83\xec\xd7\xb5\xa7\x01\xf3\x39\x06\x9e\x7b\x19\x6b\x2d" + "\xdc\x86\xef\xef\x03\xaf\xc3\x96\x33\x5c\xaf\x4e\x75\x9d\x41\x5e" + "\xbe\x89\xe1\xcd\xdc\x8e\x11\xef\x59\x7c\xb2\x76\xf1\xe5\x01\x65" + "\xa4\x0b\x8b\x0b\xa1\x0c\xf3\x72\x23\x2d\x9d\xde\x3d\xc9\xd8\xff" + "\xc7\x7c\x12\x06\xfd\xdc\xcd\xeb\xf5\x20\xd4\xeb\x63\xfc\xce\x4b" + "\xd2\x27\xb6\x67\xd0\x8e\x48\xb6\x94\x6c\x1a\xd9\xb0\xd9\x1e\x37" + "\xe9\xd7\xbf\xc8\xfe\x91\x2d\x43\x5b\xb0\x44\xb6\x65\x64\xc7\xa8" + "\x2f\x46\xb6\xcc\x27\xd9\x32\x9f\x64\xcb\x7c\x0a\x5b\x46\xf7\x22" + "\xa2\xbe\xbb\xb9\xfd\x42\x7e\x92\xed\x9a\xed\x4d\x63\xa1\xb6\x8b" + "\xd2\x78\xd1\x2e\xf9\xd0\x2e\xe1\x2f\xdb\x27\xec\x52\x95\x64\x97" + "\xd4\xb2\x5d\xa2\xbb\xd9\xb0\xfe\xf9\xc2\xd9\x25\x9f\x64\x97\xbc" + "\x92\x5d\x92\xe8\xf9\xab\xef\x7a\x76\x49\xa7\xc7\xf2\x26\xd1\xdd" + "\x43\x51\x58\x6f\xca\x48\xce\xb3\x37\xf8\xca\x90\x2e\xe4\x63\x92" + "\xd6\x27\xec\x91\x11\xfb\x61\x6a\xb2\x47\x5e\x4c\xef\x93\xed\x91" + "\x8b\xdb\x8d\x4c\xb2\x49\x24\xbb\x25\x1e\x03\x90\x2d\xe2\x76\xc7" + "\x33\xd8\x43\x76\x07\xf9\x37\x29\xd4\xee\x20\xbe\x6c\x7c\xd7\x49" + "\xf6\x6c\x47\x1c\xda\x80\x38\x4f\x29\x9b\x6d\x71\x72\x1e\x2d\xb1" + "\x98\xcb\x48\xe7\xd0\x26\x54\xb1\xd6\x32\x40\x9b\x64\x42\x1a\x51" + "\xcf\xbd\x80\x75\xb7\xd3\x83\xf6\x02\xf3\x75\x7b\xb1\x2e\xcf\xec" + "\xea\xb6\xcd\x2a\x84\x98\xc5\x4e\xa3\x6e\xe6\x05\xe6\x40\xde\xd8" + "\x17\x17\x96\xc1\x2c\xa7\x11\xed\xc3\xfb\x30\xa3\x9d\xf9\x66\x2c" + "\xb5\x1b\x90\x06\xf7\xcc\xfc\xc6\xb8\xc5\x4f\xe9\x60\xd6\x65\xd6" + "\x88\xf6\xe3\xdf\x67\x5e\xd0\xc5\x2d\x6a\x87\x41\x33\x72\x98\xcf" + "\x8b\x75\x11\xcb\x6a\xc2\x32\x5b\x90\xee\x1d\x58\x2f\xab\xb0\x1e" + "\x76\x7a\xb0\x3e\x2a\xeb\x22\xd6\xab\xe5\xf8\x6e\xe0\xe5\xa8\x18" + "\x50\x85\x75\xd1\xe2\xe3\xed\x5d\x3b\xef\xfb\x62\x7d\xac\xe2\xf5" + "\x27\x1e\xc3\xf7\x88\xfa\xe8\x13\xe9\x8e\xf8\x88\x77\x6a\x51\x1f" + "\x49\x26\x18\xdf\x80\xbf\x16\xfc\x05\xd5\x47\xaa\x67\x8c\xea\x59" + "\xe1\xe5\x40\x3d\x7b\x4a\xaa\x67\xf1\xa2\x9e\x79\xd1\xa7\xf1\xfe" + "\x4c\xd4\x35\xc2\x4f\xfd\x63\x7f\x5d\x4b\x18\xd8\x49\x77\x13\x08" + "\xbd\xa1\xfa\xc6\xeb\x1a\xda\xd8\x64\xad\xaf\x22\x19\xf1\x31\x07" + "\xd5\x03\xd4\xcb\x7f\x52\x7b\x38\xab\x90\xfd\x73\x89\x77\x00\xca" + "\x3c\x59\x8f\xf6\xee\xb3\x99\x5d\xec\x9f\x68\xeb\xea\x10\x57\x27" + "\xe6\xe7\xc6\xba\xa4\xf5\xed\xe1\x75\x69\x87\xf7\x67\x84\x73\xd0" + "\x0e\x3f\x0e\xde\x9e\x06\xd7\xa5\xeb\x8d\xd3\xba\xac\x3f\x31\xdb" + "\xc1\x23\xee\xb3\xb2\xfe\x04\xfd\x1f\xaf\x5e\x7a\xdf\x69\x87\x7f" + "\xf2\x3b\xac\xa8\x0e\x16\x6e\x86\x5b\xce\xc3\xf8\x0c\xd4\x77\xc0" + "\xf7\x58\x7c\x9f\x3a\x7b\xd8\x87\xe8\x6f\xec\x6d\xc1\xbc\x5d\x54" + "\x0f\x99\x75\x2c\xf9\x7b\x19\xa8\x87\x5a\xe6\x32\xc6\xb2\x84\x11" + "\xf7\xb1\x6b\x7a\x1a\x0b\x8c\xc3\xef\x7e\xc8\x83\x14\x7c\x26\x1c" + "\xbc\x02\x89\xf8\xa3\xbb\x29\xcb\xc8\xc7\xc2\xf7\x34\xb6\x5e\xdf" + "\x67\xf7\x3a\x48\x8d\x73\x8a\x3b\x68\xe3\xb6\xe8\x68\x4c\x2c\x91" + "\xde\x99\xf5\x1c\xdd\xb3\x24\xdd\x43\x8b\xf9\x29\xef\xa1\xb5\x82" + "\xbe\xd6\xca\xea\xbd\x2e\xe2\x43\x7f\xb7\x4c\x0b\xd1\x86\x74\xde" + "\x86\x74\xce\x9b\xbf\x21\x03\x3e\xb1\x84\x3f\xf7\xd1\x65\x1d\xef" + "\x2f\x7f\x84\xf8\x7d\x32\x4f\x22\xc4\x1f\x93\xf9\x14\x69\x2d\x29" + "\xb5\xe5\xde\x75\xac\x8b\xce\x10\xa7\x71\x8a\x52\x0f\xfb\x4f\xba" + "\x8f\x76\xb3\x17\xb4\xb3\x2d\x6e\x66\xeb\x62\x8d\x36\xcb\x05\xa8" + "\xa5\x73\xcd\x4b\xb0\xfd\x8c\x1f\x91\xc2\xf6\x8c\x30\x74\xaf\x63" + "\x1e\x1a\x67\x72\x59\xef\xd1\xdb\x61\x91\x4e\xc8\x22\xc9\xc2\xfb" + "\xb7\xba\x11\x06\xc4\x15\x4f\xb8\x4e\x61\x7a\xef\x9e\x11\xa8\xaf" + "\xf7\x64\xd8\x55\x37\xf1\x35\xf9\x58\x8f\x2d\x85\x1b\x61\xe0\x79" + "\xb8\x87\xdf\x55\xc9\x2a\x46\x8c\x27\x7b\x80\x61\x3a\x0c\xdb\x86" + "\xf8\xd3\x11\xbe\xd0\x0e\x57\xa4\xb5\x71\xf7\x6c\x93\xe1\xf0\x3d" + "\x3b\x74\x9d\x9c\xb4\x2b\xb3\x2c\xe8\x1c\x3a\x15\x04\x9f\xaa\x47" + "\x27\xd8\x65\x84\x8f\x0e\xd8\xf3\x24\x37\xdd\x07\x56\xba\x09\x92" + "\x51\x3e\x44\xdf\x37\xd8\xa7\xe9\x60\xd6\x7b\x2a\x5e\xd9\xe8\xc6" + "\x7e\xc7\x04\x8d\x1d\x4e\x69\x23\xf1\xd3\x77\x85\xb5\x23\x8e\xaa" + "\xf2\x75\x00\xc4\x1f\xe2\x27\xd6\x1b\x1f\xf2\xe1\x73\xb2\x47\xb5" + "\xeb\xa8\x9f\x3f\x21\x53\xe6\x57\x64\x99\x8c\x18\x2b\xfa\xc2\x13" + "\x8e\x30\x2b\x83\xc6\x41\x34\x6f\x32\xe1\x35\xc1\x83\x01\x3b\xba" + "\xd1\x8e\xd0\x18\x36\xdd\xdd\x55\xac\x67\x68\xab\x27\xa0\xff\x3f" + "\x65\xbc\x34\x3e\xe6\xb4\x79\xa6\x91\x6d\x09\xdb\x66\xf1\x33\x53" + "\xfd\xf8\x7f\xda\xd2\x9a\x8c\x76\x88\xdb\x26\x53\xca\x66\x21\x7f" + "\x37\xe1\xa5\xbd\x25\xed\x18\x5f\xec\x64\x9d\xac\xc2\x44\xf7\x60" + "\x39\xe9\xfc\x51\x0c\xfb\x23\xea\x35\x6b\x2c\x22\x9a\x7e\xfa\xc7" + "\xc6\x41\x57\xa1\xc3\x02\x51\xb5\xfe\x71\xa9\x9f\x1e\xa3\x71\x28" + "\x31\xfe\xf6\xd3\xb1\x76\x98\x76\x46\xa6\x8b\xfc\x10\xe4\xad\x96" + "\xfc\x12\xf2\x47\x68\x5e\xa4\xb8\x84\xb9\xc9\x2f\x41\xd8\xa5\x72" + "\x19\xa8\x7c\xa2\x5c\x3f\x35\x2b\xcb\x45\x6b\x05\xe2\x4a\x04\x0f" + "\x8a\x37\x80\x96\xdf\x25\xe4\xa5\x79\x95\x69\xbc\x2c\x54\x66\x5e" + "\x16\x6e\x63\xa9\x3f\x31\x0e\xfb\x76\x3c\xbc\x0a\x71\x35\xda\x61" + "\x6a\x86\xd0\xa7\x9f\x8e\x8d\xb4\x67\x06\x75\x33\x13\xfb\xc2\x83" + "\x4a\x7d\xec\x5c\x07\xa4\xcf\x14\x63\x7a\xe9\x33\x7d\xe4\x8b\xbb" + "\x49\x77\xc7\x64\x51\x5b\x6c\x2b\x21\x7b\xcb\x61\x6f\x46\xd8\x76" + "\x84\x99\x28\xc1\x4e\xe4\xf7\x25\x8a\x67\x0c\x3d\xb1\x0d\x9b\x66" + "\x87\xf4\x79\x0e\xde\xd6\xaf\xb0\xcb\xdf\x0c\xbf\xf1\x19\xcb\xf6" + "\x8c\xc9\x0a\x4f\x4b\x72\x26\xb5\x65\xde\x2b\xac\x0b\xf3\xe9\x4f" + "\x7a\x54\xba\x01\x92\x50\x27\x3f\xdf\xbc\x09\x6e\x21\x1d\x63\xf1" + "\x23\x32\x04\xdf\xd3\xeb\x98\x15\xfd\x5e\xb4\xa8\x85\xeb\x60\x20" + "\xd6\xa1\xf1\xe7\x21\xfd\x9d\x25\x25\x06\xa4\x15\xa0\xfc\x22\x90" + "\x7f\xf2\x19\xc2\xa7\x53\x1f\xa7\xf6\x22\xe9\x62\xfa\x19\x59\x17" + "\xf1\xdd\x7e\x3d\x5b\x81\x7c\x6d\x11\x63\x20\x13\x67\xd2\x1c\xc8" + "\x39\x98\x38\x9e\xca\x2b\xd6\x5c\x4f\x1c\xc6\xae\xb0\x64\x26\xda" + "\xb4\x06\x3b\x4c\xcc\xc5\x67\x0b\xff\xa1\x2d\x91\xbe\x1b\x10\x4e" + "\xcf\xae\x78\x09\xa6\x05\xc3\xd2\x98\x55\x45\xf5\xa4\xda\x65\x9d" + "\xb8\xc8\x0e\x4b\x8c\x42\x36\x13\x8d\x84\x2b\x02\x0d\x0d\x8c\x9f" + "\xbf\xfb\x35\x96\x77\xe2\x27\x86\xcd\x34\xa6\x3a\x91\xaf\xf3\x26" + "\x5c\xb5\x6a\x61\xb3\x7d\x48\x6b\x8d\xd5\x67\x42\xfb\x6c\xf2\x55" + "\x8e\x35\xf0\x77\x29\x8e\x49\xed\x68\x78\xfc\xa6\x14\x3a\x53\xbc" + "\x1d\xee\x35\x08\x3c\x26\x7d\xe3\x80\xf3\xf4\x4d\x07\x26\xa8\x9c" + "\xba\x71\x06\x5b\x55\x86\xb8\x27\x12\x61\x44\x5f\xff\xde\xc1\xdd" + "\x98\x87\xcb\x7a\xaf\xc1\x0e\x0f\xe8\xc4\x7c\xd0\x38\x43\xc4\xfd" + "\x58\x58\x07\xa8\xce\x89\x3a\x3d\xe9\xf2\xa9\x3a\x5e\xff\x8e\xa0" + "\xce\xb7\x48\xf6\x97\xc6\x8b\x62\xcf\xc1\x24\xe7\x29\x3d\xd7\x6f" + "\x35\x53\xdf\x5b\x16\x74\xc7\x1c\xc6\xf5\xfc\xdd\x7b\x0c\x7f\xcd" + "\xf8\x3b\x2d\x7d\x9f\xc5\x9f\x03\xdf\xd1\xea\x4d\x6a\xe7\xbc\x7b" + "\x29\x57\x65\xc7\xb8\x6e\xf4\xeb\xe9\xdb\x0e\xf7\x1e\x67\x2f\xa5" + "\xa8\xe5\xf7\xda\x17\x68\x2c\xe1\xde\x4e\x94\x81\x34\xc7\x3a\x89" + "\xdf\xe5\x88\xb4\x11\xdf\x59\x69\x15\x73\x37\x6f\x76\x12\xdd\xfa" + "\xe6\x2a\x27\x18\x7e\x44\xe5\x9f\x44\x72\x67\xb4\x66\x86\x9e\xc5" + "\x55\xcc\xd1\x54\xed\x01\x9a\x3b\x74\x59\x27\x61\xfd\xaf\xad\x16" + "\xe3\x12\xa6\x2c\xc2\x27\xe9\x04\x93\xcb\x2f\xf8\x3c\xce\x60\x58" + "\xa7\xa2\xef\x2d\x35\xfb\xf9\x58\xcd\x61\x56\x9a\x2d\xad\x95\x98" + "\xb4\x01\xeb\xf9\x24\xba\x6b\xf2\x22\x4c\x7a\x9f\x21\xaf\x9b\x4c" + "\xfc\x2e\x2b\x07\xb6\x3f\x5d\x35\x7c\x7d\xd3\x24\xb4\x7f\x13\x4f" + "\xf3\xb9\x20\x0c\xe7\xb6\x06\x71\xee\xc6\x38\x6c\x8f\xba\x4e\x99" + "\xdc\xe0\xa5\x32\x63\xda\xf7\xaf\xb8\x35\x74\xd7\xe6\xe6\x42\xb4" + "\x3b\x48\x07\x43\x59\x09\x5b\x36\x29\x6b\xd3\x05\xe6\x96\xcb\xdc" + "\x54\x47\xf5\x63\x92\xd3\x0e\xaf\xcf\x88\x58\x27\xfc\xe5\x98\x1c" + "\xdf\x94\x22\xe4\xe8\x43\x5e\x05\xcb\x71\xb2\x4e\xc8\x30\x63\x6a" + "\xb0\x0c\x27\x63\x8b\x94\xb1\x13\x7f\x87\xf1\x77\x4c\x7c\x2b\x7f" + "\x19\x16\xc5\x3b\xca\x35\x03\xeb\x68\xc6\x36\xb4\x17\x5d\x42\x36" + "\x93\xf9\xdd\x51\x8c\xf4\xe6\x2b\x6c\x7b\xae\xd1\xfd\xa4\x17\x80" + "\xc2\x49\xc7\x29\xdc\x87\xfe\x8d\x1d\x32\xaa\x30\x5e\x47\xf5\x97" + "\xee\x05\x53\xc6\xfb\xef\x7f\x80\x0c\x7e\xc7\x62\xdc\x96\x1d\x3b" + "\x48\x77\x31\x4d\x75\x9c\x67\xc7\x0e\xcc\xcf\x29\xf3\x15\xc3\xce" + "\x52\x3c\xe9\xa9\xcb\x3a\x39\x16\xf9\xc2\xdb\x72\x27\xf6\x13\xc3" + "\xfb\x1e\x93\xd3\xfc\x3e\x9a\x6e\xa0\x91\x64\xd9\x05\xf7\xa5\xa3" + "\x1d\x43\xfb\x3d\x56\x9c\x4b\x0f\xf7\x4d\xa4\x6f\xb4\x9f\x9f\xe3" + "\xfb\xf8\x53\x68\xa7\xae\x56\x1a\x0d\xd7\xd4\x10\x73\x55\x8d\x05" + "\xae\xdc\xdb\xe5\x49\x30\xa4\xda\x3a\x8f\x41\xab\xe7\x6d\x30\x3c" + "\xc9\x71\x8c\xa1\xfb\xe9\x4a\x37\x30\xef\x5b\x57\x8f\x68\x6c\x9e" + "\x4b\x8d\xfc\x2e\x58\xb8\x8f\xf3\xe3\xb9\x73\xe8\x05\x2c\xe6\xb8" + "\x25\xfe\xec\x6d\xd9\xbd\x9c\x79\x76\x77\xd0\x99\xf5\xfa\x3e\xbb" + "\xae\x42\xea\x8b\x1b\x21\xad\xfa\x2a\xa4\xd4\x5c\x05\x23\xfb\x97" + "\x51\x5d\x8d\x7e\xdc\xe2\xcb\x3a\x40\x3b\x91\xdd\xaf\x10\xb4\x35" + "\x1b\xd1\x9f\xf3\x80\xca\xbb\x07\xfd\x39\x0f\xfa\x73\x97\x8c\x64" + "\x2f\xfd\xfe\xdc\x35\xee\x2b\x8f\x38\xca\xef\x30\xdd\x33\xe2\x68" + "\x5f\x13\xa8\x62\x97\x82\x0e\xe9\x2b\xbd\x08\x93\x9f\x8a\x6d\x47" + "\x5f\x52\x47\xeb\xe0\x44\x79\x91\xe7\xdb\xe2\x4c\x10\xc3\xcb\x8a" + "\x36\x9c\xed\x19\xab\x8f\xd8\x36\xab\x49\xa7\x9c\x54\x97\xa8\x0c" + "\xcf\xd2\x1c\xf7\xb1\x01\x6e\x4d\x71\x35\x73\x53\xb8\x79\x30\x73" + "\x63\x78\x21\xe5\x5d\x8f\xe1\x2e\xeb\x7d\x55\x76\xcd\xcd\x5d\x91" + "\x74\x14\xfb\x4b\x92\xad\x99\x92\xc4\xd4\x65\xd4\x2f\x37\x6d\xf2" + "\xa0\x3f\x7e\x91\xea\xf1\x14\xfd\xec\x02\xe6\x31\xac\xa6\xf5\x06" + "\x53\xb4\xb4\x16\x82\xe6\x40\x7f\x85\xbe\xce\x8d\xd6\x3f\x50\x1b" + "\x42\xfd\x87\xb8\x02\xc4\x59\x39\xd0\xc4\x4a\x8d\x61\xce\x1b\x8f" + "\xb8\xff\x35\x56\xec\x6d\x9d\x32\xcf\x0e\xab\xf9\x19\xf9\x7c\x3f" + "\x10\xb7\xa7\x53\xc7\x3a\x91\x07\xc1\x36\x60\xaa\x96\xce\x4f\xef" + "\xae\x30\x1e\x6d\x1c\x44\xb6\x7f\xaa\x4a\xf8\x42\xc6\x23\xa2\x2d" + "\x98\xf2\xb9\x98\xaf\x98\x72\xd8\x0e\x73\x79\x1b\x5f\x38\x84\x74" + "\x62\xca\x59\x96\x60\x7c\x83\xe0\x46\x95\x41\xd9\x1a\x0f\x2c\x65" + "\x7b\x8c\x47\x18\xaf\x2b\x17\x81\x1d\x58\xe9\xa2\x3d\x3e\xce\xfe" + "\x0b\x5d\xe8\x1b\x8c\xc5\xb8\xa3\x94\x87\x03\x61\x90\xef\xbd\xc5" + "\x5a\x89\x29\x68\x13\x1e\x96\xec\xe1\x94\x93\x62\x1c\x7a\xca\xc9" + "\x6e\x4c\x8b\xbe\xe2\xcd\x2e\xeb\x54\xf4\x7f\x57\x96\x48\x73\xea" + "\x8e\xad\x7c\x6f\xea\xd4\x54\x3b\x14\x34\x52\x98\x79\x30\xe8\xcd" + "\x06\xd6\x19\xd1\xd7\x0b\x2a\xe7\xb4\x5f\xf3\x75\x7f\x6a\xe8\x8f" + "\x38\x0a\x65\xbc\xd8\xde\xbe\xde\xad\x9e\x3f\x1f\xc3\xb6\xc9\x78" + "\x11\xe6\x16\xfc\xde\xe7\x87\x11\x69\x0e\x2b\xd2\xcc\xef\x56\x0f" + "\x7f\x1d\xc3\x1a\x42\xd2\xb4\x84\xa4\x69\x53\xa4\x29\x93\xf2\xe9" + "\x0a\x49\xe3\x09\x4e\x33\x2d\xb6\x27\x6d\xd3\x0c\xc1\x69\xa6\xa5" + "\x85\xa4\xc9\xe8\x49\xdb\xb4\x79\x21\x69\x72\x43\xd2\x98\x15\xbc" + "\xa5\xf5\x4b\x69\x18\xb6\x23\x24\x4d\x55\x48\x9a\x23\xf2\x37\xfa" + "\x9e\x2d\xc2\x37\x40\x7d\x42\x99\xa2\x5c\x8f\x62\x3c\x96\x7f\xfe" + "\xd9\xeb\xf8\xdf\xd8\x37\x34\x1e\x2e\x3d\x28\xee\xf3\x25\xbb\x4a" + "\xeb\x1d\xc8\x9e\xd3\x9c\x0c\xe9\x04\xf9\x9d\x94\x57\x07\xdc\x7f" + "\x99\x74\xc8\x65\xbd\x3f\xb9\x27\x3f\xee\x4f\x0b\xa6\xf3\xfe\x8c" + "\x60\x3a\xef\xcf\xea\xc9\x8f\xfb\x73\x43\xd2\x98\x43\xd2\x6c\x53" + "\xa4\xa9\x93\xf2\xa9\x0a\x49\x73\x24\x24\x4d\x43\x4f\xfd\xbc\xff" + "\x64\x48\x9a\xb3\x21\x69\xba\x02\x3c\x7c\x80\x2a\xb1\x8a\xea\x83" + "\xcb\xfa\x00\xf6\x7f\xe6\xa5\x5e\x87\x77\x3a\x59\x9f\xe5\xbd\xda" + "\x42\xaf\x1f\x78\x76\x9f\xd8\xa7\xc7\xef\x4e\x68\x87\x07\x0e\xca" + "\x73\xd9\xaf\x5c\x75\x47\xd3\x1c\x2b\xf2\xb6\xb3\xc9\xe2\xc6\x36" + "\xf7\x01\x93\x1d\x66\xd6\xc9\x6b\x59\x68\xfd\x0f\xbf\x7b\x87\xf7" + "\x47\x1e\xc8\x14\xf5\xef\x81\x6a\x69\xde\x87\xca\x83\xfd\x8c\x07" + "\xaa\xff\xf7\xe8\xca\x9c\x48\x74\xd1\x1d\x14\x88\xc3\xee\xef\x6b" + "\xf8\x69\xa5\x3c\x33\xa7\xcb\xb4\xd6\x8a\x35\x48\xb4\x36\xd9\x41" + "\xf7\x82\xb8\xac\x99\x89\x8a\xfe\x09\xd1\xea\x3c\xb6\xd1\xad\x09" + "\xa1\xd9\x29\x68\xce\xcc\x14\x36\x2a\x33\x53\xb6\x27\x11\xf5\xaf" + "\xc2\xa4\x6d\xc5\x12\xd2\x1a\x8b\x53\xd5\xe8\x6f\x62\x1f\x8b\xe8" + "\x3e\x07\x99\x15\xdc\xff\x5d\x7d\x15\xe8\xdd\x56\x32\x81\xaf\xc1" + "\x90\xca\xd2\x42\xf7\x3f\x93\xef\xd3\x5c\xf8\x35\xad\x03\x64\xfc" + "\x2e\x28\xc8\xbc\xdc\x54\xe2\x20\x5a\x1b\xe5\xf5\x4a\x48\x8b\xf0" + "\xeb\x2a\x4c\x7c\x7d\x08\xad\xa5\x6a\x72\x8e\x27\x98\x76\xe4\xed" + "\x11\x99\x07\x74\x97\x34\xc2\x56\x47\xea\x2b\x29\xf9\x2a\x68\x78" + "\x28\x47\xe8\xcf\xf4\xd4\xe0\xfa\x10\x8d\x7a\x3a\x3d\x23\x58\xe7" + "\xa6\x67\x05\xeb\xdc\xf4\xa5\xc1\xf5\x41\x8d\xf5\x61\xba\x39\x24" + "\xcd\xb6\x90\x34\xfb\x14\x69\x2a\xa4\x7c\x8e\x84\xa4\x69\x08\x49" + "\xa3\xb4\x7f\x58\xe6\xe9\x6d\xfe\x7e\x27\xb7\xf7\xd3\x3b\x15\xdf" + "\xea\x7d\xbc\x9d\x9a\xee\x91\xc3\xa4\x7d\xd0\x7c\x6d\x96\xc0\xf7" + "\xa0\x3e\xc4\x46\x21\xfc\x83\xa9\xc1\x34\x3c\x98\x1e\x4c\xc3\x83" + "\x33\xe4\x6f\x69\x3d\xc7\xc7\x1d\xf0\xe0\x1e\x49\xcf\x9c\x71\x5b" + "\xe0\xe1\x38\xcf\x9c\x47\xc9\x37\xa3\xf6\x89\xaf\x99\xdb\x84\x3e" + "\xe5\x65\x9a\x33\x70\x43\x87\x19\xa2\xe8\x7e\x1a\x3b\x3c\xd4\x8c" + "\xfd\xb9\x23\xb4\xa6\x1e\xfd\xa9\xd9\x88\x63\x11\xe6\x5f\x85\x79" + "\x20\xef\x1e\xac\x0f\xa1\xa1\x31\x84\x86\xd3\x8a\x6f\x1d\x7e\xdb" + "\x15\xe5\xd6\xd1\xb9\x14\x7b\xb9\x6f\xfd\xa0\x5b\x0e\xa7\x31\x00" + "\x2c\x63\x67\x29\xf7\x03\x32\x68\x9d\x62\xc2\x39\x78\xf0\x0b\x1a" + "\x2f\x10\x38\x1f\x4a\x51\xf2\x56\xf0\xe2\xa1\xf1\xc1\x74\x3c\x94" + "\x19\x4c\xc7\x43\xd9\x01\x5b\xf3\xa0\xb4\x16\xe6\xa1\x02\x3b\x2c" + "\xe0\xf7\xc0\x20\x2f\x0c\x71\x1e\xc3\xcd\x8d\x43\xc8\x4f\x7d\xe8" + "\x3d\x27\x96\x97\x3d\xad\x4e\x90\xbe\xdf\x67\x43\xc8\xef\x1e\x71" + "\x04\xed\x33\xed\xd5\xbd\x1d\xc3\x9a\x85\x5c\x1f\xc2\xf2\xcf\xad" + "\x17\x78\x1f\x6a\xe6\xed\xc0\x10\xf2\x7f\x1f\xaa\x60\xf1\xa6\x48" + "\xfe\x97\xae\x3b\xc1\xa4\x93\xd7\xf4\x22\x0e\xa7\x5c\x1f\x7c\x95" + "\x26\x9d\x6f\xcf\x5d\x8d\x2e\xeb\x0c\xad\x1d\xa6\x83\xe8\xd3\xdc" + "\x15\x8b\xba\x5f\x85\xf2\xc3\x3e\xf0\x0c\xa9\x2f\x63\x4a\xa1\xb5" + "\x8a\x74\x5e\x06\xda\xcc\x58\xb1\x16\x64\x46\xba\xa2\x5e\x39\x0d" + "\x1b\x27\xb1\x73\x30\x93\x6c\xaa\x8e\xec\x06\xad\x79\x6c\xf2\x38" + "\x80\xc6\x59\x6c\x9e\xf3\xdc\x27\xc7\x78\x90\xd2\x5a\x14\x69\x1d" + "\xd2\x38\x48\x27\xc5\x8d\xf6\x80\xa6\xc9\xe9\xa0\xbb\x7e\x13\x85" + "\x1f\x3f\x53\xd5\x84\xf6\x02\xd3\x1c\x95\xd3\xd0\x98\x09\x5f\x57" + "\x60\x06\xcd\xa8\x12\xd0\x34\x6e\x3c\xc7\x71\xcb\x6b\x87\xa8\x7f" + "\x64\x2b\xe9\x04\x9b\xb3\x8d\xc6\x34\x35\x62\x9d\xd8\x4c\x88\x72" + "\x83\xb6\x7b\x0f\xcd\x8d\xcf\x04\xef\x1e\x13\xf5\x8d\xb1\x7d\x9f" + "\x91\x42\x36\x50\xc9\xbb\x69\xd3\xb2\xe6\xcc\x9e\x39\xf2\x91\x39" + "\xd3\xe7\x4d\x9b\x60\x98\x97\xbf\x2a\x2f\x77\xe4\x9a\xb5\x66\xc3" + "\xfa\xa2\x7c\x73\xfe\xea\x15\xfc\x7a\x32\x43\x8e\x59\x3c\x8d\x05" + "\x39\xc5\xe6\x89\xf4\x9a\x6a\x28\x2c\xca\x5b\xc7\x5f\x87\xf5\x81" + "\x60\x24\xf9\xe6\xbc\x22\xc3\xd0\xdc\x54\xc3\xfd\x39\xf9\x05\xb4" + "\x6b\x22\x1c\xae\x09\x86\xa2\xbc\xa2\xbc\x9c\x5c\xc3\x44\x43\x1a" + "\x61\x56\xa2\x53\xc8\x33\x4d\xb6\x4f\xc5\xd8\x9e\xa3\x0f\xdd\x49" + "\x76\x8a\xda\xf5\x0e\x98\xfd\x05\xf9\x70\xfc\x3e\x31\xd4\x43\x6c" + "\x13\xec\x2e\xeb\xcc\xf6\x9e\xed\xf8\x4c\x77\xb0\xfe\xce\xd2\x06" + "\xeb\xef\x2c\x7d\xcf\x76\x7c\x56\x48\xfd\x9f\x15\x52\xff\x67\xcd" + "\xe8\xd9\x8e\xcf\x5a\x1a\x92\xa6\x30\x24\x4d\x99\xdf\xce\x20\xad" + "\x5b\xb9\x5d\x9a\xb5\x2f\x24\xcd\xe1\x90\x34\xc7\x42\xbe\x9b\x15" + "\xdf\xe8\xbb\xce\x3a\xa3\xf4\x0d\xf0\xbb\x5d\xae\xeb\x01\xfb\x36" + "\xcb\x2d\xc3\x50\xdb\x43\x7b\x6b\x04\xec\x6c\x9d\x02\xb6\x53\xc0" + "\xce\xf6\xd7\x7f\xb2\x49\xb4\x56\x54\xf8\xe7\xb3\x9f\x97\x6c\x5b" + "\x7b\x79\xa0\x0d\x6d\x47\x59\xdc\x7e\x11\x66\xd3\x3a\x60\x82\x75" + "\xd0\xfa\x61\x76\x60\xa1\xab\x36\x01\xb4\x94\x96\xee\xd3\x62\xd6" + "\x99\x7c\x1f\x3d\x86\xc5\xe2\x0f\xed\xd4\xec\x1d\xf2\x5a\xfd\x6d" + "\x08\x63\x07\x7e\xcd\x8e\x8a\xd2\x6d\xe3\xeb\x1c\x29\xbf\x2c\xda" + "\xe7\x43\x7b\xcf\xb5\xe5\xe2\xcc\x8a\x76\xba\xe7\x8d\xf2\x46\x1c" + "\x1a\xa6\x9e\xf9\xb0\x74\x5f\x17\xdd\x69\x97\x88\x38\xfd\xeb\xff" + "\xed\x30\x9b\xef\x13\x22\x9f\x8f\x7c\x3d\xe1\xf7\xcc\xf6\xc8\xfe" + "\x05\xf5\x15\xc2\xd9\x8e\xf0\x6b\xc1\x21\xae\xdc\xea\x6b\x6b\xdc" + "\xdc\x4e\x34\xd1\x9a\x60\x66\xd3\x7b\xa0\xb5\xda\x83\xfd\x57\xd0" + "\xf1\xfe\x94\xe5\x02\xd8\xea\x3c\x40\xe3\xc3\x4b\x2c\x50\x56\xab" + "\xf6\xb5\x31\x7f\x3a\xea\xa3\x65\xf1\x7d\xe1\xdb\x28\x1c\xd3\x63" + "\x5f\xc2\x41\x6b\xc6\x23\x8c\x47\xc4\x11\x5c\xe3\x10\xea\xef\x65" + "\x55\x4b\xbe\xef\x8e\x5a\xc4\x15\x76\x3d\xb3\x1a\x6c\x2e\x6b\x16" + "\xb6\x7f\x96\x0c\xd9\x66\x37\x55\x71\xdb\xa7\xc6\x70\x6c\xfb\xb3" + "\x0c\x91\xfc\x14\xc9\xbe\x17\xd2\x3a\x36\x97\xf5\xe1\xe4\xeb\xc1" + "\x12\xdd\x4d\x58\x6e\xac\x8b\xf5\xaf\x6c\x4e\x8b\x96\xec\xab\x16" + "\xd3\xcd\x93\xd3\x7d\x9b\xf2\x91\x6f\x44\xed\x31\xd6\x55\xa7\xe8" + "\x2b\xce\xf9\xe3\x5e\xbe\x46\xfa\x61\xf4\xff\xb2\xe4\x7a\x70\x13" + "\x7e\xa3\xfd\x7b\x98\x8f\x27\xf2\xb5\x3f\xd8\x9f\x2c\x2e\x44\x9f" + "\x4d\xef\x44\xdb\xf8\x70\x8b\x1c\xc7\xc7\x89\x28\xae\x84\xb9\x9b" + "\xf4\xed\x14\xd7\xee\x8f\x13\x7b\x16\x58\x93\xc5\x43\xe1\x1e\x39" + "\x5c\xb4\x2d\x73\x62\x43\xbe\x93\xe5\x6f\x7c\xc7\x7e\x7f\x56\x85" + "\x84\xdf\x81\x36\x57\x25\xce\x78\x98\xf3\x6c\x0d\xaf\x37\x73\x32" + "\xe5\x78\x3e\xa6\x76\x88\xe6\xc6\x9c\xe0\x4b\x30\xd6\x73\x9f\x0b" + "\xd3\xbc\xf5\xb5\x3b\x1a\xfb\x18\x2a\x46\x77\xbb\x62\x18\xe1\xa1" + "\x3a\x43\xf7\x6c\x92\xaf\x86\xb8\xd2\x69\x5f\x05\xe9\xc8\x7a\x0f" + "\x24\x17\xde\x4b\xe3\xcf\x73\xb8\xde\x52\x18\xe1\x25\x7c\xd4\x26" + "\x12\x6e\xc2\xb7\x9b\x7c\x5a\xbe\x3e\x73\x0e\x96\x3f\xcb\x13\x49" + "\x56\x18\xdf\xa9\xe0\x65\x34\x7e\xbb\x83\xcb\x3a\x57\x1b\xf2\xad" + "\x97\xbf\x69\xac\x57\xe8\xde\xdc\x58\x29\x6e\xec\xf5\xf2\x1a\xc2" + "\xf7\xe4\xcc\xcd\x0e\xce\x6f\xae\x29\x04\xbf\x25\xe4\x7b\x87\xfc" + "\xbd\x8f\xcf\x31\xcc\xad\x92\xf3\x28\x17\xeb\xbc\xea\x0f\x6f\x76" + "\x44\x5f\xef\xec\x14\x4c\x73\x52\x91\x67\x2f\xfc\x3e\x1b\x90\xdf" + "\xdc\x4e\x19\x1f\xbe\x3b\x15\x70\xe8\x97\xcc\xd3\xc8\x70\x62\x7e" + "\x63\x5e\x62\x20\xdd\x3c\xc3\x0d\xca\x1a\xa2\xbb\xf3\x57\x09\xdd" + "\x9d\x97\x1d\x4c\xcb\x3c\x93\x02\xa7\x39\x40\xcb\xbc\x32\x05\x1c" + "\xd6\xcf\x79\x15\xa1\xba\x5a\x6c\x21\x1d\x27\x7d\x9d\x77\x34\x4c" + "\x9c\x5b\x8a\x6b\x09\xaf\xe3\xf3\xec\x8a\x70\xa9\x7f\x34\x7f\x9a" + "\xe4\x27\x90\x7d\x76\x76\x97\xce\x93\xef\x79\xe5\x3a\x49\xe7\x96" + "\x8d\x16\x77\x8a\xa3\x5e\xcf\x37\x84\xe2\x15\xfb\x7d\x24\x1c\x7e" + "\x9c\xf3\x1c\xc2\xc7\x9b\x9f\x15\x28\xdb\xfc\x45\x76\x98\x23\xcf" + "\x13\x39\xc4\xd8\xe0\xbc\x19\x91\xfa\x1d\x08\xbf\x33\x98\x67\xf3" + "\xab\x03\x3c\x9b\x7f\x44\x81\xf7\x98\x02\xee\x0f\xf8\xdd\xac\x80" + "\x3b\x7d\x23\xdd\x14\xba\x32\xdf\x1d\x9c\xd7\x02\x6d\x00\xc7\x82" + "\xc4\x40\x5e\x0b\x0c\x0a\xb8\x36\xfc\x4e\x8b\x2c\x9f\x05\x33\x22" + "\xcb\x67\x81\x29\xbc\x7c\x16\x94\x29\xf2\xdd\x79\xe3\x7a\xb5\xa0" + "\x5e\x41\x4f\x2d\x7e\x37\x06\xd7\xa3\x05\xa7\x43\xbe\xfd\xf2\x67" + "\x68\x3b\x0e\x6f\xcc\x88\xa6\x70\xf3\x60\xd0\x89\x7a\xf6\x08\x28" + "\xe3\xdf\xba\x2a\xe2\x89\x46\x3e\x07\x47\xf3\x9b\x02\xce\x18\x0a" + "\x47\x30\x8a\xf8\x4c\x99\x76\x6c\xaf\xc3\xde\x49\x2a\xb7\x7f\x36" + "\x1f\xb5\x7f\x8f\xe4\x8a\x79\x9b\x61\xed\xcc\xfa\x61\x76\xa4\xb6" + "\x0c\xf1\xd6\xd9\xe1\x91\x6c\xc1\x9f\x47\x50\xff\xd7\x70\xdf\x84" + "\x55\x0c\x6b\x47\x7d\xba\xda\x01\xd9\xd3\xf0\x79\x0d\x9f\xc3\x82" + "\xdb\xd7\x47\x9a\x99\x55\x35\xb7\xd6\x1a\xda\xee\x3e\x72\x16\xfb" + "\x1e\x57\xe3\x3c\x65\xd9\x61\xe2\xdc\xcc\x1a\x35\xa7\x67\x78\x36" + "\xcd\xef\x5c\xb5\x43\xf6\x54\xa2\x57\x11\x6e\x64\xd6\x7e\xf3\x08" + "\xde\x4e\xf9\x61\x9a\x48\x72\x93\xf7\x5d\x09\xdd\xcb\x36\x87\x94" + "\xe3\x1b\xc4\xf5\x95\x28\xc7\xa3\x33\x43\xf2\xde\x19\xbe\x1c\xd9" + "\x87\xb1\x1c\xdf\x84\x2f\x47\x76\x23\xe7\xad\x1a\xcb\xd2\xc3\xef" + "\xc8\x3e\x8b\x65\xf9\x86\xf3\x3d\x38\xdc\x29\xf7\x53\x4b\xbf\xc1" + "\xfe\xbf\x1a\x78\xda\xb9\x25\x01\xb9\x09\xb8\x47\x93\xe3\xaa\x20" + "\xab\x67\x9e\x8f\x8e\x65\xd6\x98\xb9\x76\x78\xb4\x40\x6e\xaf\xa4" + "\xf0\x19\x82\x16\xe4\x93\x9a\xf8\x84\xe5\xc1\x74\x91\xe4\x2d\xd7" + "\x4f\x31\xcf\xf4\x28\xd6\xff\x6c\x79\xff\x93\x13\xdb\x73\x87\xcc" + "\x47\x8c\x6b\x08\x89\x73\x2b\xe2\xce\x04\xc5\x6d\xf2\x87\x77\xc9" + "\xe1\xdf\x4e\x4e\x8f\x25\x87\xc8\x09\xe5\xf3\xd8\x9b\xc1\xe5\x7e" + "\x2c\x55\x94\x0f\x65\xd4\x83\xd7\x8f\x65\xa2\x8c\xae\x85\x97\xd1" + "\x63\xb9\xe1\x75\xed\xb1\x12\x8e\x2f\x01\xc2\xe1\xab\x42\xd9\x5d" + "\xe3\x3a\x28\xc9\xa9\xa7\x7c\x1e\x3b\x2e\xcb\xe7\xdb\x95\x71\x21" + "\x84\x94\xd1\xdb\x01\x0b\x37\x89\xb2\x2e\x3c\x15\x8c\x7b\xa1\x3e" + "\xbc\x2e\x2e\x4c\xc3\x72\x7a\xc3\x97\x73\xe1\x8c\xc8\xba\xb8\xd0" + "\x84\xe5\xf1\xf6\xd4\xc5\x85\x62\x4e\x57\xd2\xc1\x90\xb8\x6a\x66" + "\x0d\x9b\xcf\x31\xf2\x8b\xec\xb0\xb0\x8b\xe6\xe9\x14\xe1\x27\x83" + "\xf5\x0f\xcb\x40\xe9\x88\x7f\x1e\xd1\x8f\x21\x39\x74\x18\x40\x7d" + "\x23\x9d\x74\x59\x17\xa5\x86\xf0\xea\x52\x07\x2c\x7a\xb3\x5b\xad" + "\xbe\x5f\xf0\xeb\xf1\xa7\x82\x69\x5a\x94\x19\x9e\x5f\x8b\x96\x22" + "\xbf\x2e\x85\xe7\xd7\xa2\x92\xc8\xfc\x5a\x44\xf2\xbf\xd4\x93\x5f" + "\x8b\xea\x95\xfc\xf2\x59\x45\xf9\xee\xd0\xa3\x6e\x5c\x5b\xc2\x6a" + "\x85\x2d\xd7\xc5\xa1\xae\x88\x34\x5d\x94\xa6\x3d\xce\x2d\xf4\xc4" + "\x30\x00\xb4\x17\x61\xd1\x49\xb9\xfe\xf7\xab\x82\x18\x76\x6d\x21" + "\xad\xe1\xa6\xbb\xa6\x75\x36\xcb\xa5\x46\x9b\x27\x0d\x68\xbc\x31" + "\x38\xdf\xc7\x8d\xe1\x6d\xc1\xe3\x19\xc8\xd3\xca\x30\xe1\xd2\x9e" + "\x82\xc7\x2b\x82\x6d\xc4\xe3\x85\xc1\x32\x42\xbe\xa9\xf9\x2d\xaa" + "\xaa\x6f\xf3\xbb\xbe\xcc\x1e\xb7\xf7\x94\xd9\xe2\x2d\x42\x5e\x8b" + "\x73\x42\xe8\x73\x87\x97\xd7\x62\x5d\x64\x79\x2d\x4e\x8d\x2c\xaf" + "\xc5\x99\x24\x2f\x3b\x2c\x2e\x0b\x6e\x37\x16\x2f\x0d\x2e\x2f\xe6" + "\x8b\xe9\x98\xba\xd7\xcd\xf4\xfd\x6d\xcb\x2d\xff\xc8\xc6\x91\xac" + "\xe8\xbc\x01\xa4\x7f\x30\xd1\xf8\x5d\x71\x44\xc4\x8d\x3c\xac\xd8" + "\x18\xf1\xfe\xf2\xd8\x56\xec\x57\xd2\xfa\x3c\xc3\x20\x1a\x2b\x5b" + "\x32\xdf\xa7\x56\x4d\xc0\x77\x75\x07\xe4\x0c\xf6\xa9\xa3\xca\x68" + "\x2d\x19\xdf\xab\xc8\xe7\x27\x96\x14\x28\x65\x41\x6b\xca\x76\x8b" + "\xb3\x23\x69\x9c\xf3\x33\x4c\x7f\x59\xc8\x25\x47\x15\xcc\xc7\x25" + "\x15\xe1\xe5\xb2\xe4\x08\xca\xe5\xb3\xf0\x72\x59\xd2\x1c\x59\x2e" + "\x4b\xec\x28\x97\xcf\x7a\xd6\xa3\x25\x6e\xa9\x1e\x6d\xa5\x34\x86" + "\xd5\xe4\xaf\x2e\xcd\x27\x18\x7c\xc7\x3a\xb2\xf4\x61\x8a\x1f\xd9" + "\x25\xd7\x23\x4a\xb3\x94\xfa\xff\x3c\x7f\x09\xc6\x28\xe1\x50\xe0" + "\x5d\x9a\x15\xd7\x15\xae\x9e\x2c\xa5\xbb\x6c\x55\xa3\x0a\x41\x8b" + "\x3c\xcc\x3e\x48\x38\x8a\x00\x10\xc7\xfb\x04\x47\xe1\x74\xf7\xb3" + "\x02\xbe\x4a\x86\xe3\xe3\xa2\x02\xb6\x82\xb9\x4c\x40\x70\x21\xb8" + "\xa5\xf2\xc7\xf0\x76\x84\xe0\x09\x2e\x04\xa6\x53\xd4\xc7\x9c\xd4" + "\xe0\xfa\x98\x03\xc1\xfa\xb9\x84\xe6\x27\xe2\x7c\x68\xe7\xf0\x7d" + "\x9e\xd7\xaa\x9a\xf0\xfd\xd4\xcd\x9c\x92\x90\xba\x89\x3a\xf0\xc4" + "\x6d\x92\x0e\x78\x83\x69\xcd\xd9\x17\x5e\x07\x72\x8e\x46\xd6\x81" + "\x9c\x96\xc8\x3a\x90\x43\xe7\xce\x7c\x66\x87\x27\x92\x83\xeb\x66" + "\x8e\x27\xb8\xec\x98\x2f\xaf\x9b\x10\xff\x5d\xea\x26\xfa\x42\x37" + "\x47\xaa\x87\x92\xff\xaf\xaa\xbd\x0a\xf0\x1d\x78\xa6\xc5\x7a\x85" + "\xf4\x3d\x51\x4f\x73\x48\x68\xe3\x4d\xc4\xc3\x1a\xde\x47\x7b\xa2" + "\x59\xc9\xc7\xdd\xa2\xaf\x55\xda\x01\xcb\xa6\xd3\x9a\x3d\xc1\xcf" + "\xdc\xf8\xe0\xf2\x3f\xd1\x1e\x9e\x9f\x4f\xd0\xd8\x7c\x69\x78\x7e" + "\x2e\xd3\x47\xe6\xe7\xb2\xb1\xb4\x37\xbe\x67\x9d\x5a\x36\xc3\xb0" + "\x8e\xfb\x28\x3c\xcd\x45\x58\xf6\xea\xb7\x6b\x9f\x96\x6d\x0b\x6e" + "\x9f\x96\x15\x7c\xf7\xf6\x69\x59\x4b\xf8\xf6\x69\x99\x3d\x7c\xfb" + "\xb4\xcc\x2d\xea\x43\x6e\x5a\x70\x7d\xc8\xd5\x05\xeb\xc4\x13\xed" + "\xdf\x5f\xfb\x94\x5b\x16\x52\x07\xca\x3b\x20\x4f\x85\x3e\xc5\x76" + "\x21\xb7\xbc\x4f\x82\x69\xcc\xad\x0e\x2f\xb7\xdc\x63\x28\xb7\xf2" + "\xf0\x72\xcb\x3d\x1d\x59\x6e\xb9\x34\x27\x5a\xde\x53\x6e\x79\x9a" + "\xef\xee\x53\xe4\x8d\x0f\x96\x59\x9e\xe1\xbb\xcb\x2c\xaf\x24\xbc" + "\xcc\xf2\xf6\x85\x97\x59\xde\x51\x21\xb3\xbc\xf6\x60\x99\xe5\x35" + "\x07\xcb\x0c\xf9\xf6\xbd\xc9\x6c\xf9\xd8\x10\x99\xad\xe9\x80\xe5" + "\xef\xa0\xcc\x4e\x0b\x99\xad\xd8\x10\x4c\xe3\xf2\xac\xf0\x32\x5b" + "\x6e\x42\x99\xad\x09\x2f\xb3\xe5\xdb\x22\xcb\x6c\x79\x1d\xca\x6c" + "\x4d\x4f\x99\x2d\x6f\xf8\xee\x32\x5b\xde\x15\x2c\xb3\xe5\x67\xbe" + "\xbb\xcc\x56\xa4\x85\x97\xd9\x8a\xcc\xf0\x32\x5b\xb1\x54\xc8\x6c" + "\x45\x55\xb0\xcc\x56\x58\x82\x65\x86\x7c\xfb\x6f\xca\x0c\xe5\xd3" + "\x29\xd6\xeb\xae\xf8\xa6\x9b\x8f\x69\xaf\xc0\x3e\x82\xa9\x41\xcc" + "\x09\x98\xb8\xee\x48\x32\x7c\x0b\x61\xda\x7b\xb6\xdd\xa6\x58\x29" + "\xec\x91\x9e\x72\x30\x19\xb1\x5d\xed\x6a\x2e\xe1\xeb\xba\x84\x0c" + "\x89\xe7\x08\x27\xc6\xc8\x4c\x7c\x6d\x00\xca\x98\xd1\x39\xc6\xd4" + "\x16\x23\xbc\x93\xf0\xd0\x39\x2e\x21\xb8\xcc\xdf\xc5\x2f\x8b\xbc" + "\xc6\x7c\x58\x27\xdd\x35\xd0\x01\xf9\xcf\x0a\x5d\x35\x85\xfa\xbf" + "\xb5\x18\xf7\xb8\xd0\xd3\x95\x21\x63\x26\xa6\x08\xfe\x6f\x3e\xf9" + "\xbf\xb5\xe1\xf5\x34\xff\x3a\xfe\x6f\x3e\xf9\xbf\xb5\x8a\xfe\x6a" + "\xc2\x62\x8f\x3d\xa4\xbf\x9a\x5f\x10\xe7\x14\xba\xc3\xfd\xd8\x3d" + "\xc3\xb0\x9f\x9e\xbf\x2f\x84\x66\x94\xcd\x93\xf1\x12\xcd\xbd\x43" + "\xd2\x1f\x8d\x40\x73\x33\xd2\xfc\x56\x04\x9a\xed\xd7\xa1\x99\xc6" + "\xbb\xdf\xea\x59\xb7\x9e\x4c\x94\xf4\x20\x4c\xbf\xfc\xc9\xb4\xf0" + "\xf2\x7f\x32\x44\xfe\x90\x6d\x2e\x61\x0e\x9e\x3e\x18\xae\x50\x09" + "\x47\x6b\xf5\x09\x96\x74\x24\x0c\x6c\x75\x28\xce\x08\x70\xcd\x3d" + "\x74\x8f\xf6\x16\x84\xd5\xbd\x27\x1d\xa2\x3e\xae\xcc\x0c\xae\x8f" + "\x2b\xb5\xc1\xf5\x11\x79\x1d\x94\x6e\xa5\x31\x38\xde\xe4\xfe\xfe" + "\x6c\xec\xca\xaa\x10\x1d\xf8\xb0\x03\x0a\x6e\x11\x3a\x50\xb0\x2a" + "\x84\x8e\xfa\xf0\x3a\xb0\xb2\x05\xcb\xff\x61\x78\x1d\x58\xd9\x1e" + "\x59\x07\x0a\xa8\x3e\x7f\xa8\xd4\xdb\xb9\x25\x19\x31\x21\x30\x29" + "\xe1\x6d\x5e\x41\x7a\xf8\x71\x9d\x82\x79\x82\xc7\x05\x3b\x83\x79" + "\x5c\x50\x10\xcc\x43\x2c\xcb\x7f\x9f\x87\xfe\xbb\x39\x5c\xd6\x82" + "\xd0\xfa\x6f\xeb\x80\x55\x52\xfd\x5f\x3d\x3f\x84\x46\xa9\xff\x13" + "\x6e\x2c\x6b\x55\x22\xf2\xd2\x16\x9e\x97\xab\xd2\xc2\x97\x79\x55" + "\x26\xb6\x41\x36\x5f\x8f\xba\xb4\x8a\xce\xf3\x99\x4b\x73\x07\x34" + "\x86\x55\x83\xe1\x73\x3d\xa0\xe5\xed\x95\xbf\x5d\x5a\xb5\x8d\xc6" + "\xc8\xf9\x18\x33\xea\x6f\x5c\x32\x64\x51\x1b\x44\x74\x2d\x29\x09" + "\x9d\x13\x5d\xc5\xc7\x3f\x68\x1d\x0b\xed\xab\x89\xb3\x40\x96\xcd" + "\xe9\x01\x59\xdf\x09\x3e\x04\xb7\x9d\xea\x05\xc1\xcb\xb0\x62\xac" + "\xb3\x2c\xc4\x36\xad\xd6\x86\x97\xf1\x6a\x43\x64\xdd\x59\x9d\x2e" + "\xe4\xbc\xba\x30\x58\xce\xab\xe7\xf9\xac\xfd\xe6\x51\x59\x51\x07" + "\xbe\x53\x3d\xa1\xb9\xd3\x88\xf6\x7e\xeb\xc2\xb6\xc2\xcd\x30\xe8" + "\x3c\xac\xe6\x7d\x8d\x72\x35\x73\xc7\x6d\x51\x41\x33\xb7\x01\x6b" + "\xc4\x79\x18\x08\xb3\xc4\x03\x6a\xb6\x75\x65\x1b\xc5\xd5\x5a\x99" + "\x9b\xee\xa9\x91\xef\x9c\x41\x5d\xb8\xf9\x1c\xac\xfe\x2a\x28\x3d" + "\x7a\x7f\x36\x81\x23\x55\x8c\xef\xaf\x31\xca\xe3\xf0\x91\xc6\xf7" + "\x11\x66\x86\xbc\xee\x57\xcc\x85\xad\xc9\x88\xd8\x2e\x23\x4d\xb4" + "\xbf\x9c\x68\xba\xbe\x1d\x58\x53\x27\xeb\xaf\x98\x9b\x5b\x53\x1f" + "\xd8\xdb\xb2\xe6\x38\xc6\xe5\x5e\x67\x3c\x57\x51\x0f\xd6\x74\x2a" + "\xf1\x88\xfb\x69\xd6\x78\xe4\xfd\x29\x2e\x6b\xa1\xf6\x06\xb8\x24" + "\x7a\x0a\xd3\x82\xe9\x29\xcc\x40\xdf\x32\x57\xc2\x31\xe3\x06\x38" + "\x12\x6d\x87\x27\xc0\x28\x1f\x44\x9d\x87\xa2\x17\xe8\xbe\x1b\x5b" + "\x75\x27\xc4\x7a\x40\x23\xfa\x76\x85\x87\x68\x6f\x08\xe3\xe7\x0e" + "\x4c\x6a\xa4\x39\x38\xbe\x86\x40\x3f\xa9\xf1\x94\xc5\x2b\x9d\xf9" + "\x56\xf8\x6b\xe2\xe9\x29\xd3\xa5\xc6\xea\xfd\xac\xf3\x20\x3f\xeb" + "\xab\x30\xa8\xff\xb7\x93\xd6\xff\xd0\x3a\x8c\xcd\x30\xa9\x03\x9e" + "\x9a\x2e\xea\x7a\x51\x88\x4f\x5a\x18\xa1\xff\x57\x48\xfd\xbf\x49" + "\xe1\xeb\xf9\x53\xd7\xe9\xff\x3d\x45\xfd\xbf\x49\xca\x76\x53\xcc" + "\xf3\x3c\x35\x43\xe9\x93\xd2\x79\x5c\x86\xe5\xe4\x67\x3e\xf5\xd1" + "\x88\x7d\xa0\xf3\xd0\x9c\x36\xd6\x4d\x5b\x67\x33\xd5\x57\xdd\x29" + "\x47\x03\xa0\xae\x6a\xfb\x15\x92\x2e\x52\x5b\x46\xf5\xf5\x29\x3e" + "\x5e\x18\xe7\x11\x75\xb1\xd4\xc2\x1c\xa9\xed\xa8\x43\x6b\x4c\x32" + "\xae\x92\x4d\x26\xb1\xef\xa3\x5f\x3b\xc4\xd8\x3a\x79\xbb\xa8\x22" + "\x7f\x95\xfb\xad\x9e\xcb\x40\x78\x9b\x4a\x4e\x01\xe1\xf5\xf9\xdb" + "\x49\x8e\xbb\x8b\xea\x38\xe1\x24\xdc\xad\x08\x47\x78\x09\x4e\x2e" + "\x87\xd8\x1b\x53\x94\xa8\x2c\x3b\x1f\x7f\xc1\xbc\x31\xfc\x61\x1a" + "\x57\xb1\x51\xba\xd2\x85\x6c\x54\x3b\xcd\x99\x5d\x6a\x64\xa5\x2b" + "\xd9\xa8\x22\x1a\x13\x2b\x3a\x44\xe9\xde\xfa\xa7\x3d\xda\x3c\x18" + "\xb4\x52\xd8\xa2\x66\x83\x1b\xec\x50\x54\x17\x6c\x23\x8a\x42\xfc" + "\xdf\x42\xce\x4b\x7c\x9a\x69\x7d\xa2\xb4\x7e\x95\xec\x01\xb3\x79" + "\x5c\x5c\x3f\xae\xb7\xa6\x82\xe6\xa4\x69\x4d\x94\x38\x6f\xae\xa8" + "\x33\x64\xec\xcd\xb1\x9b\xaf\xab\xf9\x14\xf3\x2d\x5e\x2b\x74\xc4" + "\xbc\x36\x58\xa6\xc5\xda\xd2\x0b\x34\x17\x24\xda\x83\xc5\x9e\x50" + "\xfb\x58\x6c\x94\x7d\xb7\x90\xf0\x0c\xb9\x3d\x30\xac\xe6\x78\x43" + "\xda\x99\x62\xee\xff\x7b\x7b\xb4\x0b\xc5\x16\x2c\x5f\x90\x4e\xb6" + "\x72\x1d\x2a\xae\x38\xe5\x44\xbd\x29\x22\xfd\x37\xf7\x46\x98\x2d" + "\xb4\xe7\x10\xbf\x63\x2e\x42\x71\xa3\xd7\x0a\xda\x53\x0e\xbe\xa7" + "\x4a\x87\x3a\xc2\xf5\x96\xda\x8d\xd1\x62\x3d\x92\x33\x24\x8f\xb3" + "\x32\xcf\x09\xa6\xb5\xe8\x53\x10\xeb\x29\x48\x17\x8a\xeb\x69\x6d" + "\x46\xbf\x2e\x7e\xb6\x97\x4e\xd6\x21\x9b\xa7\x0d\x5a\x3d\xa1\x7d" + "\x1e\x73\x4a\xf8\xb2\x9b\xa9\xfd\xaf\xb4\x83\x79\x5f\xb0\x6c\xcd" + "\xbc\xfd\x97\xe7\x75\xec\xc8\x83\x90\x74\xe6\x60\xd9\x17\x73\x5e" + "\x47\x5c\xe3\x53\x31\x8c\xd6\x71\x2d\x71\xf2\xf5\x5e\x66\xac\xff" + "\x45\xcd\xd7\xb3\x83\x4c\x37\xac\xcb\x87\xb0\xd2\xba\x60\xb4\x5b" + "\x66\x77\xd0\x98\xd1\xad\x7c\xcc\x68\x49\x07\xac\x95\xe6\x7e\xd6" + "\x4d\x0c\xa6\x6f\x6d\x62\x64\xdf\x60\x2d\xcd\xff\x2c\x09\x6f\x33" + "\xd6\xce\x08\xef\x1b\xac\xcd\x95\xec\xc2\x12\x16\x1f\xaa\x07\x6b" + "\xcb\x50\xc6\x3c\x8d\xdc\x87\xa5\xb1\xd0\xc8\x7d\xd8\xb5\xf5\xfe" + "\x3e\x6c\x11\xd9\x83\xb5\x55\xfe\x3e\xac\x23\x5c\x1f\xd6\x1e\x46" + "\x9e\x6b\x9d\xe1\xe5\xb9\x2e\x36\x7c\x1f\x76\x5d\x8a\x68\xe7\xd7" + "\x65\x07\xcb\x79\x5d\x7a\x60\x4e\x78\x6d\xe2\xf7\xe7\x0f\xaf\x3b" + "\xd2\xd3\x1f\x5e\x3f\x54\xc8\x6a\x7d\x5e\x08\x6d\x8d\xe1\x6d\xfb" + "\xba\xb6\xc8\xfe\xf0\x3a\x67\x64\xdb\xbe\x5e\xd7\xd3\x1f\x36\xf4" + "\x0a\x81\x19\xeb\xf7\x95\x82\x7c\xb3\xf5\x33\x04\x9f\xd6\x93\x3f" + "\x17\xa5\x80\xcf\x0d\xd6\x77\xa4\x19\xf1\xa1\x6d\x3b\x4f\x36\x4d" + "\xd6\x99\x48\x3c\xa1\xf3\x99\xee\xd8\x07\xbd\xb1\x0e\x7c\xe8\xb2" + "\xae\xf7\xeb\x3f\xad\xe3\xa3\x7c\xc8\x46\x46\x5c\x4f\xa7\x96\xe9" + "\xe3\x74\x74\x5d\x6f\xbe\x34\x4a\x0f\x59\x7b\x7b\xf0\xc3\xc2\xfd" + "\x3f\xc2\x71\x7d\x99\x59\x16\x85\xd4\x31\xa7\x58\x87\xbb\x61\x98" + "\x90\xdb\x86\x90\xbe\xac\xc5\xc2\xf7\xf4\x45\xb4\xb7\x96\xaa\xf0" + "\x3a\x6a\xa9\xf7\xdb\xdb\x22\xc2\x6b\xf9\x32\x24\xfe\xb4\x90\xc1" + "\x06\xa3\x2f\x5e\x39\xd6\x6d\xe9\x0c\xb6\x49\x96\xd3\xc1\xe9\x36" + "\x84\xf4\xff\x2c\x16\x8a\xff\x76\xed\xcd\x86\xec\xc8\xed\xcd\x86" + "\x2f\x44\xf9\x37\x86\xcc\x2f\x6f\xb0\x5c\xbf\xbd\xd9\x10\xa1\xfc" + "\x1b\xea\x83\xdb\x9b\x8d\x21\x73\xf4\x1b\x4e\x87\x6f\x6f\x36\x74" + "\xca\x76\x46\xd8\x8d\x8d\x93\xbf\x9d\xbd\xd9\x68\x08\xb6\x37\x1b" + "\xb5\x37\xb2\x37\x4d\x3d\xec\xcd\xc6\xdc\xb8\xea\x70\x65\xd9\x58" + "\x12\xde\xde\x6c\xdc\x27\x64\x88\x4e\x4b\x90\xbd\xd9\x78\x34\x58" + "\x86\x1b\x42\x64\xb8\x31\x64\xfe\x7b\x83\xe5\x7f\xd7\x26\x45\x45" + "\x45\xa9\xa3\x54\x6a\x55\x14\x46\x61\xf1\x20\x26\x4a\x13\x15\x8d" + "\xbf\x5e\xd2\x33\x46\x1d\xa5\xd6\xe0\x2f\x5a\x7a\xf6\x0a\xf9\x8e" + "\xa1\xb4\xf8\xd3\x48\xcf\xe8\x90\xef\x5e\x37\x88\x8f\x91\xf2\x95" + "\xf3\xd7\x84\x7c\x47\xdf\x20\xbe\xd7\x7f\x33\x3d\xf4\xf8\x0e\xde" + "\x07\x39\x7d\xf5\xba\x9c\x82\xfc\x5c\xbe\xae\x3d\xcf\x90\xb3\x6c" + "\x59\x5e\x71\xb1\xc1\xbc\xc6\x70\xdf\xe4\x39\x77\x4d\x30\x88\xe5" + "\xf1\x05\x13\x87\xe6\xf6\x81\x99\xeb\x8b\x28\x62\xe6\xdc\xe9\xd9" + "\x86\xac\xfb\x26\x07\x47\xca\x68\xf8\x32\xf8\xeb\x61\x51\xd4\xbd" + "\x8c\x67\x6f\x05\xd8\xb9\x9f\xdb\x9d\x76\xda\x7b\x2e\xfa\x13\x5b" + "\xa6\x9f\xa4\xfd\xcb\x57\x4b\x19\xed\xab\x38\x07\x25\x17\xa8\x10" + "\x23\xeb\xca\xa0\xf0\x09\x3a\x4f\x65\x53\x6f\xf6\x81\x03\x0c\x0f" + "\x82\xfa\x1c\x3c\xfd\x68\x73\x26\xc2\xe2\xb7\xcd\xee\x01\x43\x29" + "\xf9\xb6\x65\xdf\x60\x9c\x8a\xdd\xeb\xc3\x30\xa7\xb4\x3f\xbf\xac" + "\x37\x0f\xfb\xa0\x4c\x86\x8b\xeb\x80\x4d\x6f\xb2\x0f\x18\xff\xa6" + "\x33\x6b\x04\xdc\xa6\x2d\x4c\x5d\x92\x41\x76\xa1\x3a\x01\x34\xb4" + "\x2e\xfb\x85\x04\xd0\xbe\x70\x2b\x9d\xf1\xbb\xc9\x2c\xaf\xcb\x7e" + "\x16\xbf\xed\xf0\x74\x36\xe5\x4d\xb0\x3e\x75\xc9\x93\x04\x5f\x13" + "\x0c\x7f\x38\xb0\x8e\x7b\x13\xdd\xef\x15\x3b\xfb\x73\x88\x8b\xf3" + "\xb2\xaf\xdc\x09\x06\xc3\xa8\x4c\xf4\xd3\x50\x14\x27\x3d\x65\x20" + "\xf6\x46\x6d\xba\xb0\xc1\xcb\x3c\x74\x66\xc2\xcc\xae\x52\x56\xbe" + "\x0a\x34\x58\x9f\x55\x8d\x45\xb4\x97\x62\xd3\x99\xda\x3c\xd0\x60" + "\xf9\x93\xcf\x43\xa9\xc6\x30\x0b\xfd\xc6\x99\xa0\xf9\x93\x85\xf6" + "\xbb\x8e\xb8\x6f\xf7\x5f\x40\xf3\xc6\xd5\x32\xf5\x55\xa6\x87\x12" + "\x33\xeb\x64\x74\xee\xb7\x93\xb9\x69\xbd\xed\xc9\xa5\x5e\x82\xb9" + "\xcb\x55\xaa\x87\x56\xb3\x13\x36\x9d\x65\xee\x1d\x7f\x11\xe7\x55" + "\x9c\xea\x72\xd2\xfe\x59\xed\xa6\x99\x10\xd5\x91\x0d\xea\x53\xa6" + "\x2a\xb0\x2d\x72\x42\xc9\x59\xd6\x79\x72\xe9\x17\xd0\x6a\xaa\x87" + "\x25\x6d\xa0\x3e\xd9\xfe\x0f\xe0\x67\x57\x57\xee\xb5\x6f\xbe\x0c" + "\xfa\x4d\xf9\x14\x76\x19\x36\x6e\x82\xbe\x1b\xff\x4a\xfd\xa0\x36" + "\xcc\xe7\x02\x3c\x76\x06\x54\x88\x4f\xfd\xb3\x7f\x80\xfe\x67\x8f" + "\xf2\x7d\xe6\x50\xbd\x19\xf4\xac\xd4\x18\x7b\xb5\xd4\xa8\xbb\xca" + "\x8c\x09\xae\x52\x63\x62\x6b\x21\xc2\xb7\xbf\x0f\xfd\xda\x20\xf1" + "\x83\xf3\x6d\xea\xaa\xaf\x21\x99\xca\xd4\x81\x65\xab\xfe\x1a\xe1" + "\x2b\xf3\x97\xfa\x30\xad\x32\x8d\x27\x3e\xdf\x62\xcb\x76\x83\x0f" + "\x71\x55\x5d\x85\xe4\xea\xab\xa0\xf7\xed\xc9\x5f\x4a\xe9\xba\xe8" + "\x0c\x39\xb4\x18\x25\x9b\x98\xf7\x5a\xa5\xd1\x80\xf6\x30\xe6\xad" + "\x27\x1a\x34\xb6\x93\x5d\x70\xca\x79\x15\x5a\xe1\x53\xb0\x59\xfe" + "\xd5\xf8\xc6\x13\x0d\xd1\xe8\x4f\xaa\x1a\x37\xd2\x1a\x78\xa1\x3b" + "\xa5\xa7\x40\x63\x43\x19\x94\x6f\x86\xd8\xc2\x8d\x10\x73\x1e\xc3" + "\xb9\xed\xa9\x18\x68\xb4\x79\xfe\xd5\xb8\x91\xef\x07\x7f\x3a\x7b" + "\xf3\x29\x88\x6a\x75\x56\xd1\xbe\x63\xb5\x37\x61\xaf\xdd\xe6\x3c" + "\x0d\xb6\xc2\xcf\x1a\x7d\xba\xbd\x2d\x3b\x7d\xa0\x7d\xf3\xca\x69" + "\xb5\x4d\x73\x05\x6c\xd9\x4e\xf8\x10\xf3\x66\x95\x7b\xbb\xd0\x66" + "\x65\xb4\x3a\xdd\x74\xfe\x4e\x1a\xeb\xd6\xf7\x29\x2f\x82\xd4\x9a" + "\xaf\x21\xe5\xe0\xd7\x60\x64\x2e\xa3\x9a\xf6\x78\xd3\x99\x6a\x07" + "\xf1\x19\x8b\x7d\x30\x2c\x3b\xdf\xeb\xcd\xe2\xa5\xbd\xde\xd7\x8c" + "\x50\x7b\x35\xb0\xd7\xfb\x6a\x77\x60\xaf\x37\xea\x94\x85\xf6\x7b" + "\xdb\xa1\x34\x36\xee\x24\xc4\x9c\x83\x4d\x69\xa4\xdf\xe5\x17\x41" + "\xb3\xf5\x22\xc0\xa8\x32\x35\xf5\x33\x35\xa8\xfb\x17\x6c\x28\x1b" + "\x7a\x3f\x07\x65\x87\xf1\x19\x8b\x3f\xec\xcf\x95\xf1\xb3\x2a\xda" + "\x25\x3d\xc6\x30\x35\x86\xed\xc2\x67\x14\x3e\xb7\x97\x56\x33\x07" + "\xab\x48\xa5\xbd\xa5\x7d\x48\x9f\xc5\xfe\xf2\x54\x70\x59\xcb\x4a" + "\xec\x70\xb4\x5d\xd6\x6b\x61\xdf\x37\x59\x3e\x3c\x77\x81\xce\x97" + "\x77\x70\xba\xae\x99\x54\x74\xd6\xbc\x14\x4e\x34\x7c\x41\xf9\x62" + "\xfe\x2d\xf8\x8c\x13\x7d\xd0\xb2\x45\x72\xda\xee\x6b\x26\xca\xf3" + "\x1f\x18\xce\xe4\x70\x2c\xb7\x86\xe2\x7e\x73\xee\x82\x5a\xc0\x18" + "\xd5\x88\xd3\x2d\xe1\xc7\xba\xbf\x29\x99\xea\x78\xb7\x3a\x8e\x35" + "\x2d\x1d\x0b\xd5\xfb\xd9\xc9\x83\xfb\x59\xb3\xa8\x7b\x5b\x0c\x76" + "\xf8\xd5\x0e\xa2\x11\xdb\xf0\xe6\x9d\x18\xd7\x84\xde\x0f\xf1\xa5" + "\x39\x97\xd6\x97\x6e\xc9\xb0\xc3\x90\x44\x65\x19\x98\xf5\x67\xa4" + "\x37\x71\xbf\xda\xdc\x12\x8d\x36\xc0\xd0\xda\xde\x05\x6f\x5c\xed" + "\x8c\x2e\xfd\x23\xa8\x6d\x9e\x73\x30\x3a\x51\xdc\xcb\x53\xbb\x9f" + "\xd9\xf7\xd2\x7d\xc5\xfb\x59\x17\xea\xcb\x6d\xe7\x61\xcb\xae\x11" + "\x89\x90\xf8\x67\xec\x05\x0b\xfb\xb4\xe5\x55\x85\x7d\x1a\x79\xca" + "\xde\xa0\xb0\x4d\xdb\xff\xd1\xd3\x36\x6d\xfb\xbb\xb0\x4d\x58\xf7" + "\xb9\x2d\xf2\xda\xa5\xf0\x4f\x42\xc2\xa5\xfd\x2b\xdb\x5e\x0b\x09" + "\x77\x4b\xe1\xcf\x87\x84\x3b\x44\xf8\xd6\xbf\xca\xb6\xaf\x95\xe8" + "\x58\x4f\xb6\x6f\xeb\x7b\x64\xfb\x5a\x97\x4a\xb6\x8f\xdb\x9f\xad" + "\x07\xd9\xcb\x68\x8b\xd6\x91\xbd\xd9\xba\x96\xe8\x67\x1f\x80\x4c" + "\x7b\x6f\x0c\x1b\x47\x61\x15\x9f\x82\x06\x7f\xb2\xdd\x7b\x86\xec" + "\x1e\xd9\x3c\xb2\x7d\x2f\xdd\xca\xda\x5e\xda\xcf\xce\x54\xf3\x73" + "\xb2\xad\x7e\xfb\xf7\x1c\x86\xed\xc4\xb0\xe7\x30\x9e\xec\x20\xf1" + "\xe4\x54\x76\x03\xf0\x7b\x74\x2a\x46\x64\xf8\xd4\x69\xb0\x1b\xe5" + "\x4d\xe7\x5f\x6d\x43\xfe\xc6\xa9\xa0\xd0\x66\x76\xf2\x7d\x28\x74" + "\x36\x7b\xab\xb9\x9d\xea\xdd\xad\x5b\x7d\x34\x4e\xf1\x05\x6c\x76" + "\xb2\xf3\xb4\x57\x85\x68\x58\xb2\xe1\x41\x3a\x5b\x5c\xd5\x6c\x02" + "\xa0\x73\x09\xc8\x66\x23\x2d\x9a\x0a\xa4\x49\x9c\x65\xbc\x35\xd5" + "\x0e\xe7\x24\x3b\xfc\x74\x36\xdd\x63\x70\x0e\xac\x85\xcc\x8a\xf6" + "\x11\xcb\x16\xe7\x2d\x03\x3a\x9b\x85\xee\xf3\xa4\xe7\x4b\x6a\x9f" + "\xa9\x42\x3e\x9f\xc5\x8a\xb6\x01\x61\x6c\x6d\x6e\x20\x9a\xed\x60" + "\x3d\x7e\xaa\xa4\x81\xd2\x2f\x25\xde\x30\x6b\xa9\x8c\x43\xc5\x71" + "\xa8\xf9\xd8\xad\xc9\x0e\x5b\xb3\x84\x7f\x63\x34\x9c\x5a\xe4\x00" + "\xb2\xfb\xb6\x4e\xc4\x51\x72\x4e\xe0\x40\x5c\x0c\xdb\x80\xa0\x38" + "\x09\x7f\xdf\x4d\xec\x2b\xc4\x9f\x4a\xf2\xa2\x73\xba\x68\x9d\x12" + "\xf2\x25\x96\xce\x6a\x10\x7e\xa8\xf5\x9d\xda\x4f\x01\xa4\xb3\xc6" + "\x50\xdf\xac\xc7\xe8\x2c\x2f\x3a\x5f\xec\x7a\x67\x8b\x21\x8f\x52" + "\xe4\xf3\xc5\x7c\xeb\xbf\xdf\xb3\xc5\x10\xb7\xbe\x46\xcd\xea\x91" + "\xfe\x63\x74\xbe\x18\xd2\x9f\x48\x7a\x28\x95\xa9\xe1\xf9\xc7\x88" + "\xe7\x5b\x3c\x14\x56\x6e\x65\x2d\xb2\xfc\xa9\xbc\x54\x16\x8c\xb3" + "\x0b\xff\x90\x9d\xb6\xc3\xb6\x06\x8a\xc7\xb0\x93\x04\x3f\x1a\xed" + "\x98\x0d\xdb\xb0\xb7\xce\x79\xd5\xe5\x1b\x41\x23\x6c\xda\xf6\x7f" + "\xa3\xf4\xc2\xa6\x6d\xdf\x11\xb0\x69\xdb\x37\x09\x9b\x26\x78\x2c" + "\x6c\xda\xf6\xa7\x84\x4d\xdb\x9e\xcf\xd7\x13\xa1\x4d\xa3\x38\xb2" + "\x6b\xb2\x4d\x3b\x78\x2b\x6b\x21\xdb\xe1\xb2\x6e\xcf\x96\x6d\xdb" + "\x2e\x0c\x23\xdb\x41\x34\x0a\x3b\xb5\xb5\x9e\xfd\x87\x11\xc4\x7a" + "\x4d\x7a\x37\xd1\xf9\x19\x9d\xd2\x3b\xca\x65\xfb\x1f\x85\x8d\xdb" + "\x7e\x34\x60\xe3\xb6\xa7\x05\xd2\x92\x8d\xdb\xfe\x91\xb0\x71\x22" + "\xbc\xf6\x31\xb2\x71\x5b\xeb\x89\x07\x12\x7e\x35\xcd\xa3\x49\xf0" + "\xc8\xc7\x2d\x0d\x4a\x1b\x17\x5c\xbf\x9e\xd6\xc8\x36\x8e\x6c\x1b" + "\x7e\x27\xda\x61\x30\x9f\x23\xa6\x7a\xb6\x0f\x79\x2e\xd7\x3b\x92" + "\x01\x95\x99\xee\x2b\x20\xbe\x4d\xb9\x00\x31\xd2\xb9\x35\x52\xb9" + "\x9f\xce\x92\xf7\x68\xda\x61\x7b\xcf\x33\xcd\x20\x70\x2e\x19\xca" + "\xfa\x76\x3a\xcb\xd1\x56\x76\x0e\x6c\x55\xac\xac\xd5\x73\x16\x7c" + "\x5b\x57\x7e\x4e\x72\xc5\xfe\xc6\x4f\xe9\x49\x76\x07\xdb\xd1\x3d" + "\x4b\x9c\x7c\xfc\xfe\xf3\x72\x35\xc6\x59\x82\xe2\xde\xa4\x3c\x68" + "\x5c\x11\xdf\x2d\x91\xc6\x11\xbe\x43\x5e\xde\xc8\x79\x3d\x93\xc4" + "\xf3\x42\x5f\x0a\xfb\x3d\xf1\x17\xe1\x69\x3e\x87\xc6\xcf\x6d\x0e" + "\x8b\xeb\x99\xe9\x52\x7c\x54\x84\xf8\xfc\x1b\xa4\x7f\xf6\x06\xe9" + "\x5f\x23\x1b\x44\xfb\xf1\xbc\xd6\x60\x3c\xfd\x3c\x32\xdc\x79\x82" + "\xfb\x37\x69\x1e\xe4\xf3\xd2\xc1\xbc\x5f\xa6\x97\x71\x92\xde\xed" + "\x46\x38\x7e\x46\x30\xda\xc8\xa9\x1b\x80\xce\xe7\x54\xa4\xdd\xd1" + "\x37\xc0\xdf\x67\x1a\xaf\x33\x4e\x13\x6b\xab\x02\xa0\xfb\xec\x9b" + "\xd0\x17\xa5\xbd\x34\xfb\xfc\x73\x0f\x3b\x72\xd1\x5e\xf2\x33\xef" + "\xa4\x7d\xbb\xe4\xcf\xdc\x2e\xce\x46\x76\xca\x7b\x2d\xfa\xa3\x5d" + "\x4e\xa0\x73\x58\x68\xbc\x7a\x89\x37\x4b\xdd\xc4\xcf\xfb\xdf\x51" + "\x27\xa7\x8d\x34\xb6\x47\xf9\x4a\x79\xf2\x7d\x48\x98\xe6\x8c\x9c" + "\x86\x70\xd3\xde\x1b\x6c\x8f\x6f\xe7\xe7\x9b\x79\xba\xc8\x06\xf6" + "\x47\x1f\x34\x41\xe4\xb3\x14\x44\x3e\xcf\x6a\x31\xcd\x99\xeb\xed" + "\x73\x8a\x5c\xbe\x67\xa7\x7e\xf7\xf2\x81\x54\xbe\x67\xcb\x6e\x50" + "\xbe\xeb\xe5\x7b\xfc\xbb\xe7\xab\x93\xf3\x75\x7f\x77\xbe\xfe\x3c" + "\xf5\xdb\xf3\x35\x4d\xe2\xeb\xcf\x97\xde\x80\xaf\xe1\xf2\xd9\xf7" + "\xed\xf3\x31\xc8\xf9\xb4\x84\xcb\x07\xf8\x5f\xc4\xf3\x7a\xb4\xf2" + "\x9d\x34\xd2\x3d\xc8\xbd\x5d\xd6\xe7\x74\x76\x78\x36\x51\x9e\xdf" + "\x12\xf7\x33\x3d\x97\x62\x87\x9f\x6b\x82\xf7\x71\x3d\x37\x79\x49" + "\x1d\xb5\xeb\xcc\x67\x87\xe7\xa6\xd2\x58\xdb\xd4\x4d\xe2\x7c\x40" + "\x29\x0d\xda\xff\x67\x77\x5e\x6f\x3e\x8d\xdf\xbd\x21\x9d\xdd\x41" + "\xfb\x53\x59\xa5\x29\xa3\xbb\xd4\x04\xe2\x6e\xea\xe7\x5e\xa3\x7d" + "\x48\xf8\x1e\x43\xef\xf8\xc4\x36\x60\xa7\x58\x87\x47\xf7\x1a\x88" + "\xb3\x29\x7a\x61\xdc\x37\x74\xef\x85\xd8\xc7\xf7\xdc\x49\xa4\x93" + "\xdf\x59\x2d\xce\xf2\xe7\x67\xbc\x38\x11\x4e\x4d\x69\xc5\xd9\x1e" + "\xcf\x39\x64\x18\xbb\x8c\xcf\x7f\xce\xc5\x73\x1f\x89\x36\xe6\xb9" + "\xc6\xee\x08\xf7\x27\xd1\x79\x67\x87\x37\xa7\x05\xed\x43\x9c\x56" + "\x54\xb4\xa6\x68\x82\xa1\x78\xd5\x13\x23\x8b\xcd\x39\xe6\xb5\xc5" + "\x7c\xc3\x7a\x1f\xc0\x00\x83\x39\x7f\x55\xde\x9a\xb5\x66\xe3\xfa" + "\x9c\x7c\xb1\xc1\x7d\x18\x02\x2a\x81\x20\xf8\xbe\x4a\xb4\x45\x34" + "\x7e\x43\x67\x51\xf0\x3b\x2b\xe9\x4c\x12\x79\xff\x6e\xb3\x9e\xdf" + "\xed\x85\xb6\x6b\xe7\x31\x3b\x14\x66\xcb\xf2\xa0\x73\x12\xd1\x7f" + "\xd1\x9f\x87\x9d\xff\x46\x3a\x34\x1b\x5d\xd1\x5a\x71\xbe\x04\x3f" + "\x23\xc0\x66\xc6\x80\x56\xd0\x36\xae\xa3\xf1\xd8\x5d\x99\x3e\xeb" + "\xce\xf1\xfc\xdc\xc7\x8d\xe7\xe9\x7b\x95\xec\x2f\xd0\xfc\x92\x98" + "\x0f\xbe\x7d\xd2\x39\xd8\x79\x90\xf2\xa5\xfa\x57\x53\x29\xee\x08" + "\x67\xd6\x9d\x59\xb4\x67\x1b\xbf\xb5\x2e\xeb\xae\xf1\xb2\x4f\x8a" + "\xf4\xc6\xb2\x78\x53\xa6\x1d\x76\x15\x7c\xac\x73\x80\xb4\xe7\x5b" + "\x5b\x23\xf6\x77\x6b\x10\x36\xd7\x0f\x6b\x45\xd8\x3d\xa6\x4c\x6c" + "\x3f\xc3\xce\x69\xb3\x84\x71\x19\xbe\x6b\xd9\xd1\xca\x32\x63\xff" + "\x1a\xe5\xb7\xfb\x36\x2c\x7b\xa2\xac\x33\x42\xf6\xbb\xa3\xc5\xf9" + "\xcb\xe3\x32\x30\xac\x17\x3e\xb3\xbb\x31\x8e\xce\x42\xc0\x72\xd1" + "\x38\xb4\xaa\xb5\xe4\x52\x63\x93\xfe\x1c\xca\x7d\x17\xfa\x17\xeb" + "\xc4\x39\xa5\x98\x07\xc3\x3c\x6c\x65\x57\xa1\xd9\xc0\x68\xdc\x19" + "\x65\xbe\x7b\x6c\xb3\xc1\x09\x2c\x6a\xe1\xe7\x94\x0e\xeb\x97\xbe" + "\xd4\x42\x3e\x09\x86\xf3\x7d\x7a\xbb\x8d\x32\xcf\xcd\x06\x76\x81" + "\x60\x22\x8d\x2f\x53\xbb\x59\xce\xdb\x94\xaf\x81\xd6\x62\xb5\xc3" + "\xee\x1e\x7b\x1e\x87\xe6\x4e\x30\xe4\xe6\x98\x0d\x05\xf9\xab\xf3" + "\x0c\xb9\xf9\xb9\x86\xd5\x6b\xcc\x86\x15\x6b\x68\xa0\x87\x86\x76" + "\x82\x74\xc2\x47\xe5\x5b\x9f\x1d\x2d\xcf\x65\x77\xaf\x37\xf5\x12" + "\x3a\x5d\xfe\x6a\xb7\xcb\x14\x13\xcc\x93\x72\xa9\xcd\xdc\xdd\x86" + "\xf2\x90\xce\x04\x88\xea\xc4\x6f\x2a\x4b\x46\x70\x1d\x2e\xff\xab" + "\x80\x2d\xd7\xc8\xb0\x5c\x2f\x86\x9c\xf7\xc7\x95\x4b\xfa\x58\x2b" + "\xf6\x2b\xf3\xf3\x6f\x6a\xf9\x5a\xfe\xf2\xf1\x11\xd3\xd0\x99\x5f" + "\x1b\x61\xd9\x45\x28\x1f\xcc\xac\xbb\x0b\x24\x1d\xd2\xfa\x2a\xc6" + "\xc9\xfa\x83\x3a\x51\x6e\xe9\xa9\x3f\xe5\x67\x48\x7f\x98\x2b\x5b" + "\xcb\xd7\x7d\x78\xdc\x68\xef\xf0\x1b\xdb\x69\xa4\xfd\x2c\x95\xc3" + "\xb9\x3e\x5b\x5b\xfa\x02\x3f\x87\xef\x4b\x9a\x43\xa5\x7b\x71\x50" + "\x57\x7a\x8b\xfb\x3b\xcb\x4f\xca\x32\x92\xe1\xc3\xd7\x61\xae\x2f" + "\xc1\x3a\xc6\xf9\x59\x31\x94\xeb\x18\xfa\x09\x48\x93\x5a\x3e\xef" + "\x8f\xda\x12\x3b\x54\xa4\x9b\x37\x31\xe6\xb2\x56\xa4\x29\xf4\xe0" + "\x62\x38\x3d\x40\xd9\x2e\x2b\x58\xb3\x6c\x25\x56\xf4\xa2\x3c\xf3" + "\x32\x13\x9d\x71\x41\x76\x80\x1f\xa0\x31\x34\xd7\xb0\xb6\x38\x6f" + "\x59\x1f\x08\x07\xe5\x8f\x54\xca\x5f\xe7\x43\x7d\xed\xee\xce\x8e" + "\xa6\xbd\x16\x62\x6f\xc5\x9e\xcb\xdd\xc5\xd8\x27\x09\x92\xfb\x9e" + "\x2f\x6d\xfa\x34\xf4\xed\xd2\x80\xfb\xe2\xc8\x33\xb1\x5e\xa0\x72" + "\x24\xf1\xa1\x5b\xad\xc2\x76\xa5\xa2\x4b\xd6\x01\x7c\xc7\xf6\xaf" + "\xdc\x1e\x58\xab\x51\x99\xda\xad\x8e\x3e\x4b\xf6\x47\xac\x0b\x39" + "\x8f\x76\x20\xae\xf6\x1c\xec\xe1\xfd\xaf\x1a\xde\x2e\xed\x49\x95" + "\xd3\xec\xf6\xef\x77\xde\xb3\x4f\xd6\x13\x45\x9a\xdb\x28\x8c\x9f" + "\x79\x64\xad\xc8\x24\x99\x33\x21\x7b\x8d\x0c\x87\x7c\x65\xb5\xdc" + "\x8e\xec\x29\x0b\xb5\x0d\x1f\xeb\x68\x6e\x5c\xd0\xc3\xf5\x4f\x37" + "\xce\xc8\xcf\x4f\x41\x9f\x0f\x71\xef\x92\xd6\xa9\x9c\xe6\xbe\x81" + "\x05\x71\xb9\x05\x2e\xcc\x6b\xb5\x9c\x17\x8b\x1f\x67\xac\xe5\x7a" + "\xb6\xc7\x1e\x18\x3b\xdc\xb3\x93\xfa\xcc\xac\x3b\xbb\x17\xca\xf3" + "\x24\xd7\x2d\x7c\x37\x27\x89\xb3\xdc\x48\xdf\xa8\x9c\xa4\x57\x01" + "\x9d\xaa\x34\xc8\xf2\xa6\x32\x63\xba\x33\x06\x7e\xde\x6f\xe5\x78" + "\x99\x97\x91\xce\x9c\xe1\xf5\x56\x87\xb4\xb8\x44\xdd\xe5\xfd\x3d" + "\x71\xce\x10\xed\x77\x89\x42\x1a\xb3\x3a\x60\xef\x74\x5a\xc3\x1f" + "\xe7\xa6\xfe\xd3\xb8\x2c\x3a\x43\x41\xb4\x65\x95\x55\x88\x7f\x67" + "\x60\x8f\x7a\xe5\x11\xcc\x7b\xa7\x90\x5d\xe5\x31\x45\xdd\x73\x48" + "\xeb\x02\x62\x88\x47\x64\xcf\x6c\x96\x69\xbc\xbe\x8a\xfd\xbf\x95" + "\x76\x39\x1d\x3f\x6f\x00\x75\x83\xd6\xc3\x5e\x84\xbd\xdc\xdf\x20" + "\xfa\x90\xd7\x65\x94\x3f\x95\x8f\xda\x6e\xae\x37\x7a\xba\x2f\x65" + "\x6f\x72\x30\x0d\x7b\x53\x65\x5c\x02\xf7\xde\x74\xf9\x9b\xce\x1f" + "\xb3\xc3\xbe\x16\xba\x7f\xb2\xc9\xc9\xcb\x70\x53\xb3\x19\xeb\x96" + "\x93\xc3\xe5\xca\x3c\xc4\xf0\x32\xfc\x36\x63\xdb\x6b\x11\x73\x43" + "\xa6\x4c\x61\x8b\xf6\x35\xd3\xd9\x56\xa5\x06\x3a\x9f\x30\x5d\xd8" + "\x1b\x7e\xa6\x0e\x8f\xdb\x22\xd5\xd9\xde\xb4\x57\x88\xaf\x8f\x71" + "\x7a\xb8\x6d\x10\x67\x30\x60\x3c\xd6\x11\x17\xdd\xff\x72\xcd\xd4" + "\x5b\xa2\xad\xcd\x9f\x07\xdd\x8b\xc9\xe7\x22\xf7\xb6\x88\x33\x4d" + "\x62\xb0\xcf\xb7\xd7\x2d\xcb\x6f\xdb\x7e\x0c\xa3\x7b\x5b\xd5\xa0" + "\x6d\xe6\x67\x86\xed\x4b\x94\xe9\x95\xe2\xd4\x5c\x1f\x38\x0f\xf6" + "\xf9\xeb\x7f\x37\xbf\x63\x74\x5f\x86\x9c\x0f\x87\x45\x38\x82\x6f" + "\x4e\xe1\x71\x8b\xfc\x78\xc4\x59\x2a\x5a\x7e\xcf\x74\x1d\x8f\xb3" + "\x04\x6c\xd5\x5e\xbe\x66\x8c\xaf\x5f\xc3\x72\x38\x7e\x66\xea\xcd" + "\x65\x60\x80\x28\x4c\x43\xf7\x17\xab\x85\x2e\xee\x3b\x2a\xa7\x89" + "\x52\x11\x1f\xf7\x1d\x97\xf3\x96\x71\x10\xfd\xd7\xb5\x79\xa2\x2c" + "\x1a\xaa\x23\xd2\x5d\xa1\xdc\x5e\x08\x9f\xeb\xf9\x69\x5c\x07\x79" + "\x39\x9f\xd7\x2b\x65\x2d\x7c\xba\xe7\x53\x15\xfa\x80\xf4\x3c\xef" + "\x97\xbf\x1d\x9e\x97\xee\xed\x7c\x3e\x4b\x41\x23\xca\xe4\xf9\xa5" + "\x01\x39\x70\x19\xd1\x1d\x40\x61\xef\x99\xe4\x75\x05\x61\x7c\x8c" + "\xd3\x49\xf2\xc0\x3e\xd9\x78\x68\x26\xdf\x10\xeb\x0a\xf2\x84\x68" + "\xfc\x82\xf4\x0a\xf1\x36\x04\xeb\xe6\xf3\x2d\x0a\x7a\x55\x64\xd7" + "\x31\xec\xac\x0c\x63\x87\xfd\x7c\x8e\x4e\xe6\x27\xc6\xb9\xfd\x72" + "\xbc\x8b\x60\xf7\x6b\x65\x3a\x6f\xd0\x66\x48\xbc\xda\x3f\x59\xe4" + "\xb1\x3f\x43\xce\x03\xdf\x67\x60\x1d\xe8\xe1\x83\x3f\xb1\xc1\x9c" + "\x27\x0e\x39\xa2\x46\x3e\x67\xd9\xca\xbc\xdc\x54\x43\xce\x72\x3a" + "\x0e\xa9\xb8\x20\x2f\xaf\x90\x4f\xe6\x04\xfb\x81\x89\x3c\x3f\xe4" + "\x83\x38\x7b\xfa\x00\x9d\x87\xe2\x94\xda\x61\xaa\xef\x0e\xaa\xef" + "\x4d\x25\x5f\xf3\x3e\x8e\xad\xec\x2e\xb0\xb9\x59\x19\xf5\x03\xb8" + "\xed\xa3\xf2\xeb\x9d\xa2\x1d\x40\x79\x52\x1b\x89\xb4\x75\x06\xf3" + "\x6b\xbf\x3b\xb8\x2e\x1f\xd0\x86\xb7\x13\xfb\x5f\xe3\x76\xa2\x42" + "\xe8\x05\xd9\x27\xda\x03\x40\x78\x31\x4d\x7a\x30\xce\x03\x33\x02" + "\x36\xea\x40\xb6\x6c\xa3\x44\x3b\x71\xa0\x04\xdb\xa0\x0a\x29\x2f" + "\x73\x40\x6f\x0e\x38\x85\xde\x1c\xd8\x61\x87\x37\xfd\xe7\x7d\x88" + "\xb6\x63\x7f\x36\xf9\x8f\xe2\x5e\xef\x03\x47\x64\x7c\xfb\x12\xa8" + "\xdd\x38\xd0\xd0\xd3\x7f\x38\x90\x4b\xfe\x03\xad\x4f\x24\x5e\xf0" + "\x7b\x8c\x79\xbd\x39\xd0\xae\xb0\x3f\x3a\xfc\x76\x86\x93\xf5\x13" + "\xd4\x1c\x8f\xa4\x69\xb7\x91\xcb\x56\x9b\x27\xd2\x51\x55\x79\x96" + "\xc2\xbc\x65\xe6\xbc\xdc\xd0\xf9\x36\xa3\xec\x8b\xd1\x5c\xf7\x3e" + "\xac\xf7\x8e\x78\xe2\x47\x15\x96\xff\x45\xb3\x5c\x06\x6e\xa7\x2c" + "\x74\x67\x0a\xb7\x71\xb1\x1d\xf0\xe2\x64\x71\x87\x79\x95\x59\xd6" + "\x13\x82\x9b\x62\x61\x3e\x0c\xc3\xf2\xef\x2f\x93\xfa\x5d\xd8\xb7" + "\xad\xaa\x92\xbf\x03\xe9\xab\xfe\xc1\xdb\xbe\xfd\x7c\x6d\x1f\xf2" + "\xf4\x85\x45\x0a\x7f\x8b\xbe\xc7\x4a\xdf\xfc\x3c\x26\x71\x1f\x7b" + "\xd5\x57\x82\xbf\x55\x28\xff\xe7\x25\x5b\xf1\x62\x86\xc0\x03\xf0" + "\xca\x66\x47\x74\x2d\x1f\xe7\x7f\x41\x2b\xe7\x87\xe9\xcf\x2a\xf3" + "\xa4\x76\x2b\x14\x9f\x1d\xaa\xf8\x3a\xaa\xad\xfc\x2c\xb9\x17\xa6" + "\x86\xa1\xb5\x45\x09\x87\x30\x26\x84\x49\x94\xcb\x3c\xd7\xc2\xc3" + "\x4a\xae\x53\xc6\x2e\xa9\x8c\x74\x76\x3f\xcf\x9f\xf4\x5f\xa2\xe1" + "\xac\x74\x3e\x89\x9d\xee\x8d\x24\xfa\xf9\x39\x69\x7a\xaa\xd7\x2f" + "\x9c\xc6\xf6\x6c\xaa\x5c\x0e\x2a\xe3\xb1\xcd\x0e\x8d\x7c\x3e\x95" + "\x48\xff\xc2\x3b\xc1\xb4\xbd\xa8\x51\xa4\xe9\x6c\x1c\x42\x63\xf8" + "\x2f\x1c\x64\xd6\x2a\xde\xff\xa1\x73\xab\xf6\xf9\xf5\xf0\xc5\xb4" + "\x9e\x7a\xf7\x42\x35\xe9\x9d\x52\x97\xf2\xef\x5a\x86\x9a\x54\x9c" + "\x67\x9e\xc0\xbd\x7b\x74\xec\xe8\xf8\xb3\x1c\x73\xfe\x9a\xd5\xc5" + "\xa9\x86\xe2\xdc\x1c\xa9\xd2\x07\xd5\x79\x2b\x1f\x03\x70\xca\xf5" + "\x0c\xf3\xaa\x0e\xd8\x96\x17\x03\xfa\x4f\x6b\xb5\x86\xd0\x18\xed" + "\x8b\x5f\x89\xfa\xf4\x62\xb3\xa2\xee\xf2\xf4\x54\x47\x6b\xb9\xcf" + "\xf6\xa2\xb2\xfd\x77\x22\x4f\x7b\x5f\x84\x17\x77\x49\x3c\x75\x0a" + "\x1e\xbf\x74\x0f\x2f\x27\x3f\x97\xeb\xc5\x19\x54\x4e\x7e\x0e\x0c" + "\xf7\xcf\x5e\x32\xc8\xe5\x0d\xf4\x1b\x5e\x1a\xcf\xfd\x28\xc9\x5f" + "\xbb\x51\xff\x5e\xf8\xa7\x2f\x9d\x91\xc6\xe0\xda\xe4\x3e\x9e\xec" + "\x5f\x23\x2d\xb9\xc2\x57\x7d\x69\xd7\xec\x12\x76\x6d\x89\x85\xce" + "\xab\x23\x19\xbc\xf4\x9e\xec\x5b\xf2\x75\x7c\x7b\xc6\xa5\x21\x3d" + "\xf5\x4a\x3b\xc1\xa2\x56\xb6\x49\x3e\x62\x9a\xe8\xbb\xde\xf4\xee" + "\x39\xcc\x8b\xe6\x20\xae\x43\x1b\x95\x0b\xed\x5f\x3d\x3f\xfb\x8b" + "\xfc\x6b\xd6\xad\x97\xee\xc8\xac\xe6\xeb\x35\x6b\x10\xb7\x03\x65" + "\xeb\xb2\x56\xa3\xff\xf7\x12\xd7\x0d\x1f\xea\x28\xad\xe1\x71\xca" + "\x3e\x12\x54\xcf\xa4\xb6\x08\xdf\x51\x6f\xab\xeb\x84\x4e\x55\xd7" + "\x39\x8a\x8d\xd0\xdd\xad\x57\x77\x17\x67\x6b\x68\xbc\x80\x78\x61" + "\xab\x76\x83\xd0\x9f\xea\x42\xd4\x3b\x83\x12\x9f\x84\x8b\x78\xaa" + "\x21\x3a\x58\xb1\x5e\x4d\xfa\x4d\xfa\xca\xba\x8d\xe8\x0b\x57\x8f" + "\x67\xc5\x46\x75\x84\x33\xb8\xae\x57\xce\x58\xba\x67\x92\xee\x1e" + "\x25\x7b\x25\xce\xf9\x3f\xe8\xdd\x2b\xc6\x06\xa4\x7c\x0f\xaa\x98" + "\xfa\x10\x6f\x57\x76\xf3\x76\x85\x81\x38\x37\xfd\xa0\x81\xaf\xa7" + "\x2d\x3c\xc4\xcf\x12\x95\xf6\x69\x3b\x9a\x0b\x3d\xfc\x5e\xbb\x52" + "\x33\xf9\x69\x1e\x9a\x3f\xe2\xfb\x90\x9b\xcc\x1e\x98\xeb\x26\x9d" + "\x3c\x98\x45\x67\xc6\x8b\x3b\xc8\x0f\x2e\x92\xcf\x89\xa7\xbb\x2b" + "\xe9\xde\x55\x2c\x57\x54\xe0\xde\xd4\x1a\x3a\x13\x1a\x44\x7f\x5c" + "\x0f\xbb\xd1\xa7\x17\x32\x38\xf8\x2a\xdd\xdb\x27\xfa\x0a\xe7\x50" + "\x2e\x51\xff\x3a\x07\x07\xdf\x17\x73\xc9\xb2\x9d\xa8\x19\x47\x6b" + "\xd4\xed\x12\x0e\xcc\x0b\xdb\xff\x97\xec\x22\x2f\xc4\xe7\x92\xe5" + "\x79\xf0\xd5\x9e\xe3\x1b\x01\x7c\x76\x38\x78\x58\xf2\x0b\x40\x8c" + "\x81\x7d\x8c\xb8\x6a\x12\xe5\x31\xb0\x80\xef\x53\x63\x94\xc7\xc0" + "\xc4\x19\xd4\xd5\x5d\x94\x7f\xa4\x31\x22\x56\xfa\x28\xf0\x31\x2b" + "\xf4\xe1\x22\xfa\x13\xd8\xbe\x13\xed\xb2\x5f\x28\xe4\x53\xf3\x11" + "\xf9\x87\x74\xd7\xab\xec\x4b\x0a\x1f\xa0\xe6\xa4\x68\xcb\x6a\xea" + "\xe5\xb6\x0c\xd3\x1e\x93\x6c\x85\xd4\xce\xd5\xf8\xfb\xbf\xe1\xd7" + "\xe7\xd7\x74\xc9\x3c\x92\x79\x2e\x78\x54\x3b\xad\x3b\x61\xf8\xd2" + "\x00\x6f\x6b\xf9\xd9\x4e\x8a\xf8\x4d\x0a\xde\xd3\x77\x89\xb0\x9b" + "\xb5\xd8\xfe\x57\x1f\x15\x6d\x4a\xad\x74\x6e\x89\xe9\x21\x7e\x5f" + "\x3c\xe7\x41\x3e\x1f\x9b\x71\x94\x1a\x91\xb6\x5a\x93\x5d\x75\xb7" + "\x45\xd8\xb2\x5a\x6c\xff\x6a\x72\xa5\x74\x3a\xa2\x45\x49\xef\xfc" + "\xd5\x2b\x57\xaf\x59\xbf\x9a\x06\xd4\xd6\x16\x1b\x96\xad\xc9\xcd" + "\xeb\x13\x66\x3c\x44\x4f\xf7\x69\x3b\xf7\xf9\xcf\x9f\x7a\xb9\x8c" + "\xd6\xd3\x8b\xbb\x0b\x5e\xde\x62\xf8\x11\xe9\x57\xed\x17\x34\x56" + "\xc0\xef\x90\xa0\xb3\x56\xc5\xb8\x41\x27\xa5\x17\xbc\x7e\x79\x55" + "\xf7\x7a\x93\xe4\x63\xbd\x3c\x8c\xf8\x28\xf5\x39\x58\x07\xd4\xe5" + "\xc8\xed\x10\xd1\xc7\x7d\xf3\x6b\x46\x6e\x17\x7d\xd7\x4c\x1a\xce" + "\xaf\x6b\x46\x6c\x6f\xea\x32\xec\xaa\xbb\xe6\x89\x72\xd5\xcd\x90" + "\xf9\x41\xe5\x77\xd1\x9d\x9e\x2c\x1f\x75\xf4\xe5\x32\x09\x17\xd9" + "\x4f\xc2\x9d\x28\xaf\xe7\xa6\x33\x45\x1b\xd7\xd1\x79\xc2\x87\x66" + "\xfa\xf6\x90\xbd\xa9\xab\x90\xed\x12\xb5\x45\x3e\xc4\xf3\xd6\x15" + "\x47\x34\xd6\x9b\xc9\x98\xf6\xd6\x73\x70\xe8\xac\xb8\x77\xa0\xee" + "\x78\xf0\xbd\x03\x87\xd0\x1b\x3d\x74\x56\xfa\x79\x14\xef\xd7\xfb" + "\xc9\x69\x5a\x14\x61\xfa\x10\x18\x2c\xd7\xa1\x14\xbf\xbf\x22\xce" + "\x35\x95\xce\x41\xa6\x3b\x34\x0e\xe5\xd0\xd9\xa1\x01\xdd\xa8\xdb" + "\x2e\xf9\x20\x9d\xc4\x3b\x6a\x6f\x11\x46\xec\x65\xad\x44\xdd\x60" + "\xd9\x40\x65\x62\xae\x7c\xd4\x89\x43\x25\x01\x3d\x10\x3c\xc2\xb0" + "\x8a\x80\x9f\x72\x28\x97\xd2\x28\xf9\x80\x79\x4c\x16\x7d\xd3\x43" + "\x0d\x72\x9b\x4d\xe7\xa6\x8a\x7b\x28\x0e\xa5\x1c\xdb\xdc\x89\x7d" + "\xfe\x43\x67\x14\x38\x52\xa4\xb1\x08\x0d\x53\xd7\xee\xa8\xe5\x7d" + "\xb6\x43\xce\xc0\x98\xc0\xa1\x14\xb2\xbb\x1c\x47\x82\x29\xcb\xe6" + "\xe4\x77\x55\xab\xe4\xbb\xe9\x5d\xd6\x97\x0d\xb2\x8f\x22\xe3\x6a" + "\x16\x63\x4e\xfc\xac\x4b\xac\x83\x15\x08\x33\xd5\x3f\x1e\x8b\x61" + "\xfe\x3e\xa0\x05\xeb\x31\xf7\xbd\x5f\xce\x0d\xf4\xf5\xea\xf8\xbe" + "\x6a\xde\x0f\x14\x78\xd0\xef\x7a\x39\x3b\xb4\xdf\x86\xfe\x83\x21" + "\x7f\x75\x3e\xba\x0f\x2b\x0a\xd7\x4c\xc4\xae\xc3\x8a\xc2\xfc\x89" + "\xb4\xf4\x6b\xe6\xd4\xe9\xfc\x89\x95\x63\x62\x98\xf1\x63\x1a\xf7" + "\xe6\xf7\x41\xd3\x98\x11\xf6\x73\x69\xec\xd4\x25\xee\x55\x8d\x91" + "\x9e\x5a\xe9\xd9\x0b\xdb\xbd\xec\x0e\x78\x25\x9a\xee\xc0\xb1\xc3" + "\x2b\x7a\x9f\x55\xdc\x27\x2b\xb5\xd9\x68\xcb\x5f\xf6\xca\xf3\x66" + "\x7c\x2d\x3c\x9d\x67\xd8\x6d\xe2\xe3\x71\x2e\xeb\x2b\xfe\xf1\x0f" + "\x31\xbe\x28\xe6\xde\x30\x3c\x4b\x0e\x97\xc7\x63\x31\x2c\x57\x1e" + "\x7b\x15\xb0\xaf\x98\x03\x69\x83\xc6\xb6\x13\xe5\x79\x39\x84\xa9" + "\x92\x79\x26\xe3\x29\x35\xb0\x8b\x92\x9f\x14\xc5\xfd\x6a\xeb\xcb" + "\x3b\xf9\x19\xa2\xe4\x8b\xf3\x71\xe6\x57\x4e\xca\xf9\x50\x1f\x81" + "\xe8\x96\xe6\x80\x78\xbd\xa7\xb3\x42\xc5\x59\xa3\xaf\xf8\xe5\x1f" + "\xc2\x73\xe3\xdd\xc3\xf8\xb8\xbc\xb1\x18\xfd\xb3\x61\x21\xe3\x70" + "\xa4\x43\xa3\xf7\x41\x6f\x3e\xc6\x24\xfa\xe9\xd1\xe4\x23\x60\x19" + "\x0e\xa1\x3c\xa3\xc8\x96\x8b\x76\xef\xf0\x3c\x7f\x1b\xaf\x33\x65" + "\xb2\x84\xe1\x8b\xe8\xbc\x79\xb1\x7f\xe1\xf0\x53\xa4\x6f\x8e\xfe" + "\x2b\x5d\x8c\xd6\x2a\x1f\x58\xe8\x12\xe3\xf0\x87\xdf\x0c\x8c\x99" + "\x1d\x06\xe9\x6c\x54\x5a\x07\x87\xf2\x3a\xec\x5f\xff\x41\xf0\xdc" + "\xf7\x42\x9c\xb4\x57\x81\xf2\xff\x0e\xf3\x3d\xd8\xef\xdf\x25\xdd" + "\x2b\xfe\xea\x78\x8e\x03\x6d\xb5\xd8\x0f\xf0\x2a\xea\xe1\xe1\x44" + "\xd1\x36\x10\xee\x6c\xe8\x4e\xd8\x75\xba\xdb\x7a\x2a\x8d\x78\xe8" + "\x4c\xf8\x85\x4e\x9c\x45\xfc\xea\x3d\x4e\xab\x06\x65\xfa\x2a\xca" + "\xff\x8d\x88\xf3\x5a\xd7\xd6\xb1\x66\xcf\x15\xd6\xb0\xfb\x53\xb4" + "\x73\xcb\x01\x3c\xeb\x58\xfd\xb5\x2b\xec\x18\xbf\xfb\xfc\x09\x80" + "\x5d\xff\x04\xf0\x46\x2d\xfc\xf2\x2a\xea\xea\xac\xcb\xbe\x8b\x74" + "\x67\x60\x2d\xc2\xcd\x72\x5e\x62\x35\x98\x66\x56\x21\xbb\x58\x83" + "\x70\x33\x2f\x5c\x64\x07\x11\x76\xa6\x09\x75\x65\x1d\xf3\x78\xa3" + "\x56\x7e\x69\x58\x40\xb6\xfb\xd5\xe3\x8e\x3d\x63\x76\x30\xab\xba" + "\x9c\x6d\x1d\x31\x1c\xe9\x69\xf1\xdf\x57\x86\x78\x49\xaf\xe8\x9e" + "\x52\xf4\x0f\xbf\x44\x3d\xf8\x72\x09\xfa\x1d\xa8\xb7\x5f\x22\x9c" + "\xc3\x0e\xcf\x71\x9b\xe3\x88\x1a\x9e\x80\x3f\x63\x58\xfa\xaf\xb0" + "\x66\xef\x3a\xd6\x50\xbe\x18\xe9\x3f\x8f\xf4\x5f\x61\xf5\x58\x86" + "\x63\xbb\x3b\x00\x88\x7e\x2f\xe1\xf4\xd2\x7d\x89\xaa\xf8\x5a\x8c" + "\x5f\x62\xd1\x41\x2d\xc2\x2e\x76\x42\x7c\x0d\xc2\x2c\x7e\x2a\x1e" + "\x38\xfd\x5d\x48\x77\xfc\x98\x1d\x5e\xcc\x9b\xe8\x77\x59\x7f\x51" + "\x28\xd3\x29\xe7\x4f\xf4\xca\xf5\x76\x09\x8d\x11\x26\x0c\x3f\x4c" + "\x74\x8b\x79\x8f\x5f\xfc\xdd\x51\x8c\x72\x8e\x1a\x31\x5c\xf4\xb1" + "\x7f\x51\x2f\xd3\x1f\x3c\x0f\xf6\x0b\xb7\xb0\x9f\xbf\xc0\xfe\xcf" + "\x61\xe9\x3c\x78\x11\x46\xe5\x77\x60\xbd\x95\xf6\x00\x7e\x29\xf3" + "\x0c\xe3\x0f\x87\xce\x73\x65\xad\x29\xe2\x63\xd4\x39\xcb\xcc\xf9" + "\xeb\x72\xb0\xe7\xdb\x07\x0a\x29\x88\xf7\x8d\xf3\x72\x0d\x6b\x56" + "\x1b\x96\xe7\xe4\x17\xac\x59\x97\x57\x94\xca\x87\x33\x8a\xf3\x56" + "\xe7\xd2\xd0\x75\x51\x4e\x51\x61\x9f\x90\xfe\x4c\xc5\x98\x1d\xad" + "\x74\x17\xcd\x66\xd2\xef\xd7\x27\x4b\xe3\xb6\x6e\x66\xcd\xe0\xfd" + "\x62\x61\x63\x7e\xf9\xa6\x61\x63\x06\xc5\x8f\x13\xed\xf8\xeb\x19" + "\xac\x72\xf8\xab\x8c\xf1\x3b\xbc\x55\x17\xe1\xf5\x91\x9c\x1f\xdd" + "\x99\x32\x1e\xde\x77\x25\x9d\x2d\xdc\x48\x7e\xd8\x2f\xcf\x30\x8a" + "\x0f\xe2\xc5\xeb\xd1\xc2\x17\xc1\xf0\x6b\x99\x10\x58\x77\xff\xfa" + "\x64\xa6\xc6\xb2\x23\x2f\xa5\x3e\xc3\x52\x69\xff\xe3\x1f\xce\xc1" + "\x6b\xd4\x97\xa2\x79\x9b\xd3\xdc\x27\xe7\xfb\xb4\x5e\xfb\x1c\xfb" + "\x1c\x4b\x99\xb5\x57\x2c\xf1\x6b\xb7\xe8\xd3\xab\xe3\x54\x74\xcf" + "\xee\x39\xda\x33\x9a\x46\xf3\xbc\xb5\x56\x5f\x5a\x60\x9d\xd3\x2f" + "\x35\xd4\xbf\xe0\xf3\x1c\xdc\x26\x1d\x59\x2a\xd7\x5d\x35\xed\xc3" + "\xd9\x3a\x60\x82\xa8\x7f\x47\xf2\x08\x1e\xe5\x3f\x41\x94\x8f\xdf" + "\x37\x8e\xbe\xc1\x6b\x9b\xb0\xfc\xbf\x60\xa5\x99\xd2\x9c\xe4\x6b" + "\x9b\x7c\x09\xaf\xeb\xbc\xc5\xd8\x2f\xd0\xbd\x5e\x81\x71\x1f\xf8" + "\x2a\x87\xff\xca\x8b\x3e\x95\x0f\xfb\x09\xac\xf2\xf5\xbd\xde\xca" + "\xe1\x47\x7c\xeb\x8d\x6a\x6a\x5b\x4b\x2d\xc8\xdf\x35\xa6\x3e\xec" + "\x92\xe9\x26\xef\x7a\x23\xfa\x5f\xc3\xeb\x19\xc3\xb4\x09\xc3\x1b" + "\xf9\xdd\xc6\x95\xc3\xdf\x96\xbe\x3f\xa6\x6f\x1f\xfa\xc9\x18\xd6" + "\x82\xdf\x7f\xf2\x31\x05\x7c\x30\xec\x49\xfa\x8e\x53\xf1\xf5\x95" + "\x69\xd8\x2f\x49\xa7\xb2\xcb\x65\xe6\xfd\x33\x1a\x23\xf2\x97\xed" + "\x35\x8b\x1c\x4e\xfd\x06\xe1\xc3\xc3\x32\xe4\xf1\x4e\xa1\x8f\x7e" + "\xb8\x87\x65\x1e\x88\xbb\xbc\x87\x1f\xb6\xa3\x7c\x7d\x74\x07\xfb" + "\xd6\x81\xc3\x99\xfa\x97\xfd\xc9\x66\xcd\xf6\x72\x5b\x08\x62\xde" + "\xe9\xb5\x7a\x99\x9f\xb4\x9f\x80\x6c\x29\xca\xcd\xb8\xc4\x01\x7d" + "\x84\x1d\x78\xed\xb4\xa2\x7f\xd8\x45\xb2\xb6\xc3\x6b\xfc\x9c\x25" + "\xa6\xd6\x6e\x15\xdf\x47\x0c\xa2\xae\xbc\xe6\x91\x61\x31\x4c\x9c" + "\x77\x52\x31\x62\xdb\x7a\x0f\x0c\x28\xbc\x97\x75\xa0\x6e\x9e\x16" + "\x70\xaf\xa7\x04\xea\x94\xd0\x37\x7c\xd6\x53\xff\x9a\xe6\x1f\xe9" + "\xbd\x26\xc2\x9e\xd8\xcd\xd5\x8c\x51\x7b\x45\xed\xa7\x61\x00\xf0" + "\x3b\x74\x51\x0f\xcb\x9a\xaa\x9d\xc0\xe5\x9c\x30\xfc\xd5\x6e\xba" + "\x2b\x1d\x6d\x79\xb8\xf4\x94\x06\xe1\x8f\xf3\x7e\x12\xd6\x0b\x1f" + "\xd6\x0b\x4c\xf3\x0b\xd2\xeb\xcd\x97\xa9\xff\xf2\xba\xa7\xb9\xa4" + "\x93\xce\xec\x47\x7d\x7d\xdd\x43\x3c\xa4\x7a\xb0\xdb\xca\xf7\x43" + "\xf2\x76\xb2\x71\xdd\x58\xc2\xf1\x65\x3f\x37\x68\x5a\xd1\x22\xa0" + "\x5c\x68\xbd\x5b\xfc\x79\x84\xd7\x98\x41\x4b\x7d\xd8\xe0\x36\x24" + "\x7c\xfb\xd1\xad\x1b\x57\xd1\x5d\x39\xce\xe4\xb2\xbe\x31\xd6\x0e" + "\x47\x23\xf6\x33\xb6\xde\x8a\x7e\x0d\xc2\x55\x0c\xa0\xb9\xea\x37" + "\x96\x5e\x0f\x56\xde\xa3\x4b\xba\x32\x5a\x4f\xe3\x29\xe3\x2a\xf8" + "\x9c\x77\xc2\x38\x93\x18\xb7\x7c\xa3\x4e\x4e\x4f\xe3\x9e\xb4\xbe" + "\xa0\xfc\x2a\xe8\xcb\xfd\x7d\xc5\x37\x5a\x84\x8c\xde\x68\x91\xfb" + "\x17\xe1\xf2\x31\x1f\x66\xbe\xd2\xa1\xa0\xb6\x19\x1c\x30\xca\x0d" + "\xb1\x35\x2f\x02\x54\x6c\x64\xee\xbd\x1b\x51\x8f\x90\xc7\x4c\xfd" + "\x46\x06\xad\xc3\xa8\xc5\x36\x7a\xb7\x0f\x20\x0a\x69\xd9\x7b\x05" + "\xf3\xdc\x2c\xe0\x98\x38\x5f\x4d\x8f\x70\x05\xf8\x4c\x44\x3b\x02" + "\xfb\x36\x83\x76\x9f\x0f\x34\x15\x9b\x21\x19\xc3\xd0\xaf\x38\x3a" + "\x43\xee\x0b\x84\x9d\x17\xae\x41\xfb\x88\xf9\x6e\xd9\xcc\x3c\x1f" + "\x63\x6f\xc9\xea\x63\xee\x6f\xc3\x77\x2c\xff\x51\x51\xc6\xa3\x47" + "\xe5\xbe\x01\xbe\x37\x04\xef\xb5\x3e\x5a\x17\x3a\xc7\xfc\xc4\x9a" + "\x35\xe6\x25\x45\x79\xf4\x30\x0e\x5d\x3b\x2c\xd4\x57\x8c\x15\xf7" + "\x52\x1d\x3d\x4d\x75\x8b\xfc\x27\xb1\x67\xe9\x4d\x9d\x62\xbc\x87" + "\xc6\x9c\x27\x91\xdf\x47\x6b\x4e\x30\x2e\xf5\xa3\x92\x4d\xbc\xbf" + "\xf1\xb9\x16\xd4\xa1\xf9\x2d\xcf\x31\xe7\x14\x4c\x10\xcb\x1a\x7a" + "\xe6\xf3\x66\x46\x48\x3e\xfe\xf9\x5f\xa9\x6f\xee\xe4\xf6\x71\xcf" + "\xeb\x65\x2c\xbe\xdc\x20\xda\xba\x37\xab\xe5\x35\x84\xe1\xcf\x76" + "\x19\x91\xec\xad\xcc\xaf\xa3\x3a\x52\xba\x09\xd4\xbf\xd9\xd8\xa6" + "\xa6\x7e\xc9\x66\x7c\xa7\x35\x5d\x7c\xfc\x5b\xba\x33\xf2\x83\xaf" + "\xdb\xb0\x2d\x7d\xd3\xc1\xf6\x8c\x48\xc6\x3a\xdf\x19\x69\x1d\x97" + "\x72\x5f\xbc\x98\xbb\xff\x95\xf6\x3a\x6b\xbe\x38\xbc\xbc\x4e\x23" + "\x24\xdd\x26\x21\xb3\x5f\xa1\xfe\xbf\xa1\x97\xf5\x57\x86\x29\xbf" + "\x55\xbe\x8b\xf3\x57\xf3\x22\xe1\x67\x15\xe3\xaa\x84\x8e\xff\xea" + "\x7d\x3e\x47\x3d\x00\x9e\x39\x07\xbf\x7a\x4f\xa3\x07\x3d\xbe\xff" + "\x12\xdf\xf9\x18\x06\xc5\x05\xe9\xd1\x6d\x5d\x75\x1a\xb4\x38\x68" + "\x79\x54\x4c\xfc\xa1\xe3\x27\xfe\xa2\xf0\xa7\x66\x2a\xbe\x7b\x25" + "\x0a\x25\x18\xd3\x4b\x03\x71\xfd\x62\xb5\xb7\x0f\x4a\xd6\x4f\xba" + "\x37\x7d\x7c\xe9\xe6\x12\x0b\xf3\x79\xdc\x71\x4c\x79\x7f\xea\xee" + "\x96\xf9\xc3\xca\x84\xff\xb0\x67\x77\xd8\x3b\x16\x77\x59\x59\x21" + "\xf5\x69\x7d\x09\xaf\x3a\x4a\xd7\x82\xfa\xad\xab\x76\x35\xf5\xa1" + "\xc8\x87\xa1\x3b\xde\xcf\xc1\x5b\xd3\x3f\xc4\x30\xe4\x97\x85\x55" + "\xbc\xea\x10\x7b\x93\xde\x7a\xd6\x57\xf9\xaa\x23\x80\x5f\x03\x84" + "\x1f\xfb\xe9\xea\xc3\x9b\x3b\xd5\x36\xcd\xbd\x60\x33\x38\xe1\x43" + "\x7c\x0f\x2b\x2b\xcc\x93\xc6\x84\x09\x07\xb6\xc1\x3b\x4a\xbf\xc1" + "\xb6\xd9\xc2\xe7\x67\xd4\x17\xe1\xad\x8f\xea\x23\xa4\xe3\x73\xac" + "\x09\x63\x46\xb8\xac\x6f\xa1\x3d\x7f\x62\x9f\xd4\x0f\xc1\x7e\x52" + "\x7d\xac\xdc\x1e\x60\xfc\x70\x31\x4f\x54\x6f\x90\x61\xc2\xca\xe8" + "\xe7\xb4\xe6\x99\x35\x92\x1e\xb0\x2b\x9d\x9d\x74\x06\x63\xa4\xb1" + "\x38\x5a\x73\x5f\xac\x67\x3e\x76\x60\xa5\x73\x73\x15\x73\x6f\x4e" + "\x66\x9d\xa5\xc9\x7c\xad\x0c\xf5\x2b\x74\xdd\xfd\x57\x7e\xd5\x7d" + "\x60\x65\xb7\xef\xc0\xca\xaf\x59\xff\x95\x97\x7d\xfd\x57\x5e\x11" + "\x63\x86\x10\xe7\x3a\xb0\xd2\x81\xf4\x4c\x41\x3a\x2f\xd2\x3c\x24" + "\xf6\x33\xb0\x3f\x57\x7f\x5c\xee\x67\x04\xf5\x63\x72\xcd\x4b\x68" + "\x51\x41\xce\xaa\x85\x69\x8f\x4b\xd7\x72\x3c\xb5\x36\x67\x65\xde" + "\x12\xec\xe1\x2c\x91\x56\x1f\xd1\xf0\x33\x3a\x73\x04\x4b\x33\x1e" + "\x13\x0c\xeb\xf3\x8a\x8a\x46\xae\x59\x3d\xc1\x40\x97\x79\xf0\x70" + "\xb1\x8f\xc9\x94\x93\xcb\x5d\xbe\xbc\x1e\xe3\xd5\x54\x16\xba\x3b" + "\x12\xcb\xf3\xb5\xb2\x0c\x12\xcd\xb7\x73\x9a\x91\x5e\xa2\x5b\xa2" + "\x19\xfb\xed\xbf\xf6\x8f\x7f\x06\xc6\x0c\x7e\xed\xa6\x76\x5c\xc6" + "\x41\xe9\x31\xdd\x25\x45\x3a\x2c\xeb\xaf\x8f\x28\xc7\x4d\xc5\xd8" + "\xe5\xdb\x59\x7c\xcc\xf4\xc0\x42\x07\xdd\xa3\x83\xfe\xa0\xea\x3c" + "\xbc\xcd\xfd\x26\xea\xf3\x71\x9e\x7b\xe4\xfb\x26\xea\x5b\x68\x0d" + "\x8a\xa0\xed\xd7\x4e\x85\x4f\x86\x32\x7f\x7b\x11\x8d\xe5\x75\xc1" + "\xdb\xe3\x10\xee\x2b\xc4\xe7\xf4\x1d\x58\xd8\x8d\xfd\x33\x94\xc1" + "\xc2\x2b\x74\x8e\x08\xed\x3d\xa1\xbb\x1d\x5a\x9d\x0e\x7e\x4f\x1e" + "\x4f\x83\xbd\x58\xa2\x59\xe0\x7c\x3b\x33\x30\xa6\xf0\xb6\x56\xa6" + "\xcb\x0e\xbf\x3e\x4d\xb4\x28\xe5\x33\x7d\xea\xbc\x91\xab\xd7\x8c" + "\x5c\xb6\xd6\x3c\xd2\x6c\x2a\x5a\xb3\x76\x85\x29\xc8\x5e\x66\x7a" + "\x2a\x8d\xe3\xd8\xbf\xb2\xa1\xdf\x16\x5d\xaf\x38\x55\xda\xaa\x53" + "\xdb\x68\x4d\xea\x2d\x10\x67\x79\x9c\xc6\x08\xe1\xe0\x7e\x76\x9a" + "\xc6\x26\x68\x8e\x3c\x6e\x4b\x5a\x7e\xec\x96\xb4\x1c\x9f\x35\xfd" + "\x6e\xda\x03\x15\xe7\x99\xae\x8a\x6d\x9f\xac\xf2\x5a\xc7\xde\x4d" + "\x3e\x59\x35\xda\xf0\x8a\x5b\x59\x1b\xa6\x39\x8b\x69\xec\xf8\x6b" + "\xc7\x74\x27\x3b\xe0\x37\xbd\xf1\xd9\x12\xb7\x85\xd5\xc6\x79\x98" + "\x2f\xb5\x0c\xfb\x5f\x88\x97\xf6\x7e\xb0\x04\x63\x1a\xf5\xff\x46" + "\x7b\x20\x3a\x30\x56\xfb\x9b\x54\xac\x6b\xbd\x66\x6e\x67\x1f\x22" + "\xae\x16\xdf\x15\x5f\x0b\xdd\x7b\x2c\xcd\x59\x9c\xd9\x89\xbf\x51" + "\xfb\x80\xee\xba\x87\x92\x2f\x40\xdd\xda\xde\x49\xfb\x48\x1a\x31" + "\xbf\x66\x84\x3f\x8e\xbf\x06\xc3\x6a\x88\xba\x08\xbf\xd9\x24\xaf" + "\xcd\x13\xfe\xff\x3b\xdc\x0f\xc6\xf4\x8d\xb4\x2f\x64\xd3\x2a\xb4" + "\x1d\x1d\x0e\x35\xe1\xc7\xb0\x16\x9b\xa9\x13\x6c\x9e\x93\xb4\x77" + "\x87\xc6\x68\x08\xc6\xe8\xc1\x38\x1a\xa7\xf1\x31\xbd\x1a\xed\xe8" + "\x49\x6c\xa7\x1a\x68\xcd\x67\x6b\x49\x1b\xb4\x16\xb6\x80\xaf\xdb" + "\x98\xc2\xf1\x21\x3d\x98\xe6\xcc\x5b\xcb\xdd\x6a\xd2\x17\x84\x3b" + "\x4d\xfe\x10\x9d\xf5\xc0\x8a\x8d\x3f\x42\x98\x66\x8c\x3f\xcd\xfe" + "\xa5\x57\xd3\xba\xca\x8b\x70\x6c\x3b\xeb\x36\x1a\x47\x77\x89\xfb" + "\x6f\xcf\xc1\xb1\x45\x48\xeb\x4f\x14\xb4\xce\xc7\x32\xa0\x2e\x41" + "\x23\xe6\x7b\x9c\xe8\x68\x35\xb5\x40\xab\x1b\xf3\x75\xb6\xd0\xba" + "\xe1\x14\xb6\x5e\xaf\xa1\x75\xc4\x6c\xbd\x51\x53\xfe\x35\x68\xd0" + "\x66\x36\xd6\xe2\x13\xcb\x7f\x0c\xfb\x7f\xc9\x2e\xeb\xb1\x42\xf9" + "\xbc\x10\xea\x6f\xe0\x77\x99\x6c\x73\x76\x21\x0c\xd2\xd3\x40\xb8" + "\xfb\x76\x01\x8d\x41\x45\xa3\x3d\x8b\xc6\x3c\x63\x90\x8f\x0d\xc8" + "\xbb\x1c\x94\xd9\x71\xe2\x35\xf2\xa7\xd3\x87\xf8\xca\xaf\x20\x3d" + "\xc5\x7a\x4d\x6c\x3b\xa8\x66\x7b\x5c\x0c\x79\x7e\x66\xb6\xc5\xc5" + "\x68\x7f\x01\xad\xd5\xc7\x34\x13\xb1\xac\x1a\xb1\xe6\xe1\x58\x97" + "\x9c\x97\x97\x74\xec\x52\xb6\x34\xbe\xfb\xce\x2e\x5a\x43\x19\x58" + "\x07\xf9\xce\x4e\xfc\xfe\xb1\xf2\x9b\xf4\xdc\x67\x7d\xdb\x54\xc3" + "\x75\xfd\x9d\xb1\xa8\xeb\x8b\xa4\xfa\x83\xb8\x35\x9a\x6e\xeb\x52" + "\x0a\x9f\x81\xfe\xc9\x3c\x51\x07\xde\xe1\xbe\x7e\x07\x1c\x33\x8a" + "\xbb\x82\x8f\xa5\x4a\xe3\x82\x67\x04\xce\xdf\x6c\x22\x59\x13\x0f" + "\x51\xcf\x9f\xb6\x75\xb6\x70\x1d\xb7\xc3\x6f\xea\x6a\xd0\xa7\x8a" + "\x60\xef\xdd\x36\x6c\xeb\x7c\x57\x58\x27\xf5\xa5\xc5\x9a\xc7\x77" + "\x1a\x97\x58\xa2\x32\xb0\xdf\xac\x46\x5e\x50\x1d\xbd\x15\xfb\x0b" + "\x93\x68\x6d\x2c\xf2\x80\x68\xb2\x5f\xef\x5e\x6e\x94\x01\xfa\xa8" + "\xbf\xd5\x20\xbd\xfc\x5e\x2a\xba\xb7\x58\x8c\xf7\xff\x56\x2f\x9f" + "\x0d\xc3\xae\xb0\x12\xf2\x03\x31\xdf\xb2\x6d\xeb\x78\x1e\x74\x57" + "\x73\xa7\xd9\xc0\x3e\x6f\x36\x38\x22\xda\x7b\xc5\x5a\x4e\x87\x74" + "\xff\x23\x5f\xd7\x12\xbc\x96\xf3\xb7\x65\x8a\xb1\x43\x5a\xdb\x52" + "\x46\xeb\x77\xc4\x19\x5e\xbf\xe5\x67\x7d\xcd\xb6\x88\xb3\x8a\x6c" + "\xee\x2e\xa9\x0f\xfc\xdb\x53\xfc\x4e\x38\xea\x5f\xf1\xf5\x9f\xe7" + "\xa5\x35\x9b\xbf\xcd\xa3\x3c\x9a\x43\xee\x9d\xcf\x5b\x9d\xf3\x44" + "\x41\x9e\x18\x4e\x1f\xf9\xa4\x39\x67\x45\x70\x3f\x9d\xdb\x5d\x66" + "\xfd\x6d\x9b\xb0\x63\xef\xea\x14\xb6\x51\xe3\x9f\x5f\x50\xc3\x31" + "\x31\xc7\xf0\x6e\x5a\xb8\x39\x86\xe9\x2b\x56\xaf\x29\xe2\x79\xf0" + "\xe5\xad\x79\x62\xa7\x6a\x1f\x98\x3f\x75\xfa\xd4\x91\xc5\x79\x66" + "\x7e\xd1\x93\x18\xd0\xcf\xc9\xcd\x2d\x92\x16\xbf\xe6\x53\x2a\x8a" + "\x59\xbe\x9e\x27\x2d\x5c\x69\x16\xcb\x66\x8b\x0b\x72\xd6\xe5\x49" + "\x28\x94\xb4\x26\x53\xdb\xdd\x5c\xcd\xdb\x87\x3e\x62\xad\xce\xbb" + "\x8d\x8a\xb9\x7d\xe5\x58\x62\x12\xc6\x9d\x95\xe3\x0a\x87\x90\xae" + "\x34\xac\x6a\xad\xe3\x36\x4b\xd3\xf4\x32\xf1\xb7\x61\x3a\xdd\x4d" + "\x82\x7e\x56\x03\xdd\xa5\x2d\xad\x83\x41\xdf\xa1\x61\x28\xf6\xfb" + "\x1b\x90\xbf\x96\xd9\x5e\x1f\xc3\xf6\xdd\x62\x87\xe3\x7a\x69\x7c" + "\x4e\xeb\x53\xbf\x9b\x4e\x6b\x18\x6b\xf8\x58\x72\x43\x46\xc0\xee" + "\x1f\xd7\x93\x0f\x4b\x36\x96\x68\x23\x3a\x31\x7e\xa9\x62\xfd\x58" + "\xbb\x1d\xde\xe5\x63\x32\xb4\xce\x89\xdf\x1b\x84\xf6\x48\x3a\xa3" + "\x44\xdd\xfa\x32\xf9\x44\xbf\xdb\x41\xeb\xc3\x7c\x15\xe3\xea\x45" + "\x1b\xf7\xde\x21\x56\x39\x66\xc2\x68\x27\x24\x0a\x9b\xd4\x70\x01" + "\xc3\x6f\x46\x1a\x5b\x30\xfc\xa7\x6f\x6d\xee\x8c\x26\x3f\x5d\xcc" + "\x97\x36\x5c\x90\xc6\x96\x89\x3f\xd1\x0a\x1a\xda\x03\xe3\xcf\xc7" + "\xf5\x8e\xf8\x71\xf5\xdb\xc4\xfa\x30\xbe\x16\x46\xac\x47\x7a\x4f" + "\xeb\x1f\x6f\xc5\xbc\xa5\xf5\x1f\x89\x1d\x08\x8f\xbc\xa8\x97\xd6" + "\x64\x50\xd9\xe7\x51\xb9\xc5\xba\xde\xf7\xd2\x95\x7d\x71\x71\x4f" + "\xcb\x98\x09\x3e\xb1\x86\x9b\x68\xcf\xe7\x3e\x3d\x8d\x75\x5f\x25" + "\x7e\xbf\x87\xb6\x7f\xcc\x3d\x98\x0e\x5b\xce\xdf\x76\xc9\xf4\x10" + "\xcd\x66\x0b\x3a\xa6\x98\x8e\xfc\xb0\x6e\xde\xde\xbf\x57\x15\xa0" + "\xf9\x3d\xd1\x7f\x67\xb2\xbd\xfa\x5d\xac\x98\x73\x18\xd7\xa8\x90" + "\x9b\xe6\x22\xbc\x77\x01\x69\x6d\xdc\x2a\xd6\x61\x45\xcb\xeb\x9b" + "\x10\x57\x50\xf9\x03\xf3\x01\xef\x16\x89\xf9\x80\xdf\x69\x02\x32" + "\x7c\xaf\x85\xf4\x9e\xd6\xb0\xc9\xeb\xd7\x48\x9e\xe2\x0e\x9b\xdf" + "\xa5\xca\x78\x7c\x09\xe3\xea\x68\xcc\x66\xb7\x58\x8b\x81\x72\xf9" + "\xdd\xaa\x28\xd5\xe7\xdc\xaf\x1f\xed\x86\x3a\x0c\xeb\x85\x61\x39" + "\x04\x47\x79\xf2\x71\x73\xe4\x0d\x95\xc5\x87\xfd\xfd\x28\x7d\xaf" + "\x19\x88\xaf\x04\xed\xf1\x8c\x80\x6e\xfc\x6e\x2a\x5f\x07\x26\xf1" + "\x9a\x59\xdf\x7d\x26\x30\x8e\xf4\xbb\x23\xfe\x31\x60\xc4\x13\x68" + "\x93\x7e\x77\x8a\x78\x5c\xee\x1f\x0f\x3b\x0e\x9c\x0e\x31\xb7\xff" + "\x71\x07\xfc\xfe\x2b\x96\x30\xe6\x1e\x6a\xcf\x69\xac\x82\x64\xcf" + "\xfb\x1e\x7c\x2c\xf7\xf7\xaf\xd5\x88\xf9\xb3\xfd\xf8\xfe\xa6\x4f" + "\x1d\x4e\x77\x7e\x6f\x50\xae\x35\x17\xfc\xff\xbd\xc9\x47\x38\xb1" + "\xfc\x84\x0b\xdb\x38\x95\x3c\xc6\x2e\xe1\x7d\x14\x71\x1e\xe8\x90" + "\x78\xcd\xe7\x95\x2b\x25\x3e\x90\x8c\x39\xcf\x7f\x8f\x75\xea\xb7" + "\x7c\xfe\xa6\xb4\x8e\x5d\x58\x83\x38\xc4\x7d\xcf\xbf\xaf\x62\xc4" + "\x5b\x09\xde\x41\x63\x41\x48\xbb\xd8\xa7\x8b\xba\x78\xcd\xc4\xf7" + "\x28\xfa\x2a\xc7\x1d\x21\xda\x69\x4e\x39\x30\xbe\xf7\xfb\x53\x94" + "\xd6\xf1\x33\x91\xa6\x5c\xcc\x79\xa3\x6c\x7e\x1f\xcd\xd6\x9b\x40" + "\x9a\x6b\x45\x5b\xff\xde\x19\xd2\x7b\xc2\xe3\xe4\xe3\x37\xbf\x6f" + "\xf7\x21\x5f\x50\x26\x71\x2e\xeb\x71\x9d\x2c\x13\x94\xc7\xc9\xeb" + "\xf4\xfd\x50\x26\xc7\xd3\xe5\xf3\xbe\xa8\x6d\xc2\x3a\x5c\x26\xfa" + "\x35\xc7\xbd\x71\x5b\x26\xb1\x38\xcf\xdd\xe4\x83\x39\x6b\xd5\x7c" + "\x5c\x5e\x5e\x4b\x7d\x3b\xf2\xe9\x92\xbc\x3f\xc5\xb7\x75\x61\x1b" + "\xad\x43\xb7\xb9\xc5\x3a\x74\x0a\x9f\xe5\x64\xbe\x56\xa7\x97\xf6" + "\x67\xb5\x61\x1e\x75\x72\x9f\x9f\xec\x5b\xd4\x16\x15\xf2\xee\xf8" + "\x31\x3b\xbc\x35\x56\xb2\x6b\x31\x28\xf3\x7f\x48\xf8\x95\x34\x48" + "\x67\xed\x1f\xf7\x88\x7e\xe8\xf1\x4e\xb4\x3d\x55\x62\xec\xe0\xb8" + "\x53\xa6\x1b\xe3\x1b\x43\xcb\x98\x35\x65\x7a\x9e\xa1\x80\x4c\x74" + "\xda\x5d\x16\x83\x71\x68\xee\x68\xbe\x71\xc1\x70\xff\x94\x09\x86" + "\xac\x89\x43\x2d\xa6\xd4\x59\xe2\x31\x25\x6b\x06\x3d\x43\xfa\x05" + "\x06\x97\xf5\xfd\x79\xc1\x63\x13\x1f\x4b\x34\xbc\x5f\x60\x57\xcd" + "\x2c\xe0\x3a\xac\x1b\x91\xcd\x2a\x92\xaa\xb0\x4d\xed\xa2\x3e\xdb" + "\x6c\xef\x67\x8c\xed\x49\xaa\x62\xf1\x23\xb2\x1d\xf1\xbb\x5b\xf0" + "\x57\xe1\x88\x1f\xb3\xb4\x1c\x6d\x20\xfa\xa8\xee\x38\x4f\x8c\xb0" + "\x95\xf8\x8d\x7e\x4f\x27\xfa\x56\x24\x4b\x98\x36\xac\x94\xcd\xf6" + "\x32\x1b\xfa\x58\xc8\x97\xf7\x4f\xca\xed\x38\x1f\x53\xaf\x18\x91" + "\x3d\xdb\xc2\xae\x91\xee\xa0\x7f\xa0\xc5\xbe\x7f\x36\x8d\xab\x23" + "\x1c\x96\xff\xad\x23\x82\x17\x1f\xa0\xfc\x8f\xa7\x48\xfc\xcd\xc2" + "\x6f\x94\x7f\x56\x2c\xaf\xe3\x56\x3d\x6f\x2b\x7c\x5b\x87\xcf\xc1" + "\x7e\x69\x85\x8c\x13\x71\xc5\x4a\x77\x84\x73\x7c\x62\xfe\xf5\xc6" + "\x3f\x5f\x65\xaa\x85\xc6\x50\x69\xaf\x7a\x9c\x45\x45\x77\xc2\x65" + "\xfb\xc7\x8d\x31\x0e\xfd\x20\x1a\x4b\xce\xee\xe7\x54\x95\x11\x4c" + "\x60\x7c\xd5\x67\x2f\x57\xfb\xdc\xe8\x4f\xe8\x48\x3f\xc8\x57\x15" + "\x6b\x7b\x3e\x38\xee\x9f\x2b\x0e\x92\xfd\x07\x5c\x1f\xbe\xb6\x6a" + "\xb0\x6c\xef\x4f\x1d\x92\x28\x7c\x27\x9f\x55\x05\xe2\xfc\x92\x0f" + "\xf8\x19\x72\x92\x7f\x72\x3b\xf2\xd7\x41\xeb\x38\xb0\x1f\xe0\x20" + "\x3f\xda\x17\x85\x3a\x09\xe7\xc1\x56\xe2\x2a\xa3\x33\x14\xfc\x7a" + "\x59\x88\x7a\x59\x88\x7a\xf9\xff\x90\xf7\x3e\x60\x51\x56\x69\xff" + "\xf8\x79\x06\x44\x54\x72\x06\x42\x1c\x95\x72\x2c\x6c\xa7\x20\x45" + "\x33\xb3\xd6\x56\xb6\xb4\x75\x4b\x93\x2d\x6b\x69\xd7\x04\x52\x5b" + "\x74\x51\x27\x45\x45\x44\x40\x34\x5e\xf6\x5d\x81\xc1\xd4\x8b\x12" + "\x91\xde\xd7\xfa\xb9\xbd\x56\xec\xfb\x75\xaf\xcb\xdd\xaf\xd5\xb4" + "\x6a\x61\x02\x43\xad\xdb\xb2\x2d\xd6\xc4\xa2\x11\x8b\x3a\x09\xca" + "\x08\x33\xcf\xf9\x7d\xee\x73\x9e\x67\x66\x20\xb0\xd8\x77\xbf\xef" + "\xbe\xdf\xdf\x8f\xeb\x1a\x9e\xe7\x9c\xe7\xfc\xbd\xcf\x39\xf7\xb9" + "\xef\xfb\xdc\xe7\xbe\x49\xe7\x06\xf5\xbb\x43\xee\x48\xc3\x9a\x05" + "\xcf\xf5\x76\x01\xb5\x9f\x60\xa3\x16\xb2\x08\x15\xb0\x12\xba\xd5" + "\x04\x9f\xa8\x3b\x3d\x74\xf7\x95\xfa\x6a\xf4\xa2\xcf\xc1\xfd\x32" + "\xa8\xae\xd2\x42\xf4\xcb\x80\x7e\x65\x5f\x10\x72\x49\xba\x93\x0c" + "\x5c\x12\x13\xf0\x2b\xf4\x4e\x75\x70\x1f\x55\xf2\x45\x26\xfa\xf0" + "\xce\xbb\x03\xf5\x91\x1b\xa8\x8f\x04\x83\x77\xf6\x68\x67\xee\xa2" + "\x9d\x84\xb7\x3a\xd8\x3b\x8b\x47\x6f\xa3\xbb\xc0\xf1\x80\x31\x7b" + "\x90\xc6\xb0\xaa\x90\xdb\xa9\x9d\x03\x8d\x17\x95\x27\xcb\x72\xa4" + "\x19\xb7\x15\xa4\x75\x17\x3a\x12\x06\x86\xb7\x63\xe1\xf5\xe1\xed" + "\x98\x44\xf9\xa9\x1d\x74\xaf\xd9\x48\x46\xef\x30\xbf\x41\x57\x14" + "\x0f\x54\xef\xe8\x6d\xd5\xd4\xae\x01\xbf\x61\xee\x77\x94\xad\xeb" + "\xbb\x26\xd4\x2a\x0f\x23\xf8\x91\xec\x52\x9e\x31\x39\xce\xf8\xcf" + "\xc2\xec\xf1\x05\x46\xc5\x12\x42\x6b\x4c\xd0\xc4\xe8\xef\x40\xe5" + "\x1a\x15\x3b\xd9\xcd\x7c\x10\xb8\x6a\xc0\xef\x58\x07\x16\xbe\x3d" + "\xfe\x16\x94\x37\x77\xf4\x36\x85\xbb\x43\xe2\x47\x8e\xee\xf2\xc6" + "\x11\x5c\xd1\xd6\x6c\xac\xf1\x2f\xc5\xde\x2d\xe4\x76\xef\x62\xfd" + "\x37\x08\x5f\x78\xee\xc8\xf8\xb9\x52\x47\xed\xdd\x0c\x17\xfb\x78" + "\x89\x8e\xc7\x10\xce\x76\x29\x77\x2c\x91\x6b\x75\xc2\x4b\xd8\xd3" + "\xc2\xd5\x42\x23\xb7\xe4\x18\x39\xca\x8a\x54\xb9\xd5\x80\x7d\x2b" + "\x3c\x30\x77\xe4\xdd\x69\x7d\xee\x20\xff\xd1\x81\xe7\xc5\xbb\x7f" + "\xbe\xfe\xbc\x78\xf7\x75\xed\xcc\x21\x4d\xf2\x44\xbf\x67\x3a\x4f" + "\xc4\xb7\x4f\x78\xc9\x92\x47\xf5\xbf\xbb\x5b\xd6\x0d\x98\x78\x93" + "\x08\xcf\x2c\x00\xdc\x0a\x90\x36\x41\xc7\x0d\x34\x87\x8c\x3e\xe2" + "\xb9\x98\x98\xe7\xf8\x36\x1f\xb8\xa7\x43\xee\xcf\xd3\x49\xe6\x19" + "\xab\x16\xbe\x15\x8e\xfd\x6b\x1f\xf1\x4c\x5d\x91\xf1\x27\x90\x06" + "\xf8\x6f\x78\xac\x86\xff\x8e\xa1\x0c\xc7\x6e\x69\x1b\x25\x5c\xf8" + "\xb1\xc4\x3a\x27\xdf\x95\xb4\xd6\x11\x17\x8d\x76\x93\x2c\x04\x3c" + "\xc2\xef\xfd\xe7\xbf\x6a\x61\x12\xc1\xfb\x10\xf5\xc1\x40\xf4\x30" + "\x60\xb7\xc7\xa0\x1e\xba\x3a\xd5\xcc\xa8\xcf\x57\xb7\x8f\x3f\xf4" + "\x2f\x53\x58\xe8\x7b\xe6\x67\x98\x6d\x3a\x8b\xde\x36\x33\x94\xfd" + "\x6d\x16\x33\x10\x1c\x5c\xec\xf7\x47\x24\xec\x7e\xdf\xa5\x8f\x8f" + "\x8b\xbd\xbb\x84\xc6\x83\xce\x08\x17\x79\x79\xa7\x3c\x23\x3d\x1e" + "\xed\x62\x87\xb5\xef\x6f\xa5\x0d\xb0\x3f\xcc\xb3\xac\x5c\x6f\x59" + "\xbe\x76\xd3\x9a\x49\x93\x46\x0e\xc0\x4b\x1c\xb7\x4a\x5e\xe2\xf8" + "\x92\x60\x5e\x02\xe1\x4c\x94\x37\xbb\x3f\xef\xb0\x20\x55\x33\x79" + "\x93\x9a\xc8\x02\xef\xd3\xd8\x82\x69\x41\xc1\xbb\xd8\x82\xe9\x77" + "\xa5\x3e\xb6\x22\x7d\xf9\xe6\xa0\xd8\xbb\x83\x65\xda\x65\x2f\xa1" + "\xee\x90\xf1\x0f\x00\x7f\x28\x8f\x6e\xa1\x7d\xe7\xc4\x8f\xf2\xbc" + "\xfc\x0b\xcc\xdd\x59\x64\x67\xae\x3e\xcb\xcb\xea\x81\xdf\xf8\x04" + "\xc2\xeb\xc3\xa5\xad\x65\x1f\x23\x99\xb1\x11\x7d\x77\x83\xa7\xbb" + "\x22\xef\x01\x9d\xd8\xd0\x50\xe1\x01\x9e\x98\x96\x21\xe9\x9d\x13" + "\x89\x88\x8f\xc4\xf3\x29\x79\xbe\x78\xe2\x69\xf0\xe4\x49\xc2\xae" + "\xce\x46\xb2\xab\x73\x42\xe8\x4b\x4d\xe9\x2a\x60\xd2\xbe\xe3\xf1" + "\x36\xf2\xbb\xe0\x62\x27\x2a\x88\xbe\xa0\xb4\xc8\x33\xcd\xb2\x8a" + "\x25\xd2\x93\xe8\x61\x7c\x4b\xe4\xe5\xd3\x32\xf8\xbe\x14\xd2\xef" + "\x8a\x43\xfc\x1e\xa2\xdb\x42\xcc\xe1\x23\xba\x0b\x4f\xec\xd6\x69" + "\x90\xae\x41\xee\x21\x0a\x7e\x5c\xdb\x07\x47\x03\x7f\x8f\xee\x32" + "\xf2\x54\xb2\x53\xa5\xb0\x38\xda\x1f\x8c\xd9\xc9\xe2\xbe\x2b\xed" + "\x8b\x84\x13\xaa\x04\x2e\x3d\xd1\xa1\xe3\x85\x52\xc9\x8f\x8e\xa4" + "\xfc\xd8\x3f\x2f\xc9\xfd\xf3\xa4\x5f\xfe\x89\x77\xb3\x3e\x57\xfb" + "\xdc\x75\x5c\x93\xb5\x62\xdd\x8a\xe5\x96\xc9\xeb\x47\xb2\x20\xaf" + "\xc0\x19\x2b\xd6\x58\xd6\xad\x78\x6e\xc3\x8a\xf5\x82\xd1\xa3\xaf" + "\x7d\x65\x85\xc0\x41\x01\x1f\xed\xe3\x09\xc6\x27\xb7\x4a\xf9\xd5" + "\x24\x71\xae\x27\xcf\x63\x5f\x0d\x57\x4b\x6f\x48\x92\x32\xf4\x76" + "\xc0\xf5\x3d\x79\x7e\x6d\x9f\x96\x42\x74\xdc\x79\xf6\x5e\xb9\xd4" + "\xdb\x3a\x79\x4a\x83\x55\x39\xda\xe9\x08\xd0\x6b\xef\x8b\xb3\x61" + "\xa9\x3f\x7d\xb2\xc9\xc5\x8e\x1f\x0d\xd0\x20\xef\x7f\x9f\xf0\xa0" + "\xc0\x87\xdf\x80\x0b\x35\xda\x19\xf5\xbc\xf7\x3c\xdf\xc8\x5b\xcb" + "\x7a\x98\x90\x4d\x93\xbf\x0e\x89\x5f\xdf\x9b\xa1\xc3\x11\xf4\x4b" + "\x2b\xc9\x1d\x74\xfe\x68\x91\xf7\x1a\xcf\xdb\xcc\x0c\x24\x7b\x00" + "\x0e\xc9\x7c\x63\x9d\xdb\xc0\x0b\x4f\xc6\x81\x96\x49\xa1\x34\x55" + "\x9a\x1e\x31\x8f\x9c\xb6\x18\xe5\xe4\x06\xf8\x8e\xf7\x93\x04\x1d" + "\xdf\x43\xf3\xe6\x3d\x4b\x2a\xed\x11\x12\x77\x8f\xfa\xa6\xf6\xf2" + "\x91\xf2\x4c\x4f\xe2\xb7\xf7\x8e\x69\x7d\xe8\x20\x9c\xa5\xe9\xa1" + "\x1b\xe4\xbc\x7e\x3f\x09\x73\x2e\x85\xc6\x02\x78\xbe\x58\x87\x17" + "\xf5\x97\xda\x4e\x67\x28\xc0\xc3\x99\x6f\xe6\x78\x0c\xd2\x9f\xee" + "\xc9\x44\xc9\x1f\xbd\x1f\x17\x7c\x86\x2d\x79\xa1\xf7\x67\x05\x6c" + "\xd7\x9c\xac\xe8\x8f\x23\xd6\xae\xa1\xab\x8d\x3f\x4f\xdd\x44\x62" + "\xe7\x0d\xb6\x04\xcb\x86\x35\x42\x85\x40\x88\x01\xb2\x36\x2c\xfb" + "\xb9\x85\xb0\x48\xea\xdc\x05\x0b\x52\x1f\x78\xe2\xf1\xa7\x46\xb2" + "\x07\xd2\x11\x97\xb5\xd6\xb2\x20\x31\x41\x7e\x7a\x6c\xde\x83\x4f" + "\xa6\x3e\xb8\xe8\x89\x47\x17\x0f\x70\x3f\x22\x02\x73\x62\x31\xc6" + "\x68\x58\x0b\x3b\x65\x97\xfa\x70\xef\xd7\xf5\xd5\x87\x7b\xbf\x95" + "\x31\x3a\x1a\xac\x05\x27\x73\x2a\x1b\x3f\xc0\xee\xd4\x0e\x39\x6f" + "\x46\xdc\x80\xf6\x7b\x02\xf3\xe6\x94\x80\x2b\xc9\x0e\xe4\x39\x40" + "\x2d\xf0\xdf\xc9\xe4\xe0\x6f\x01\x5c\x70\x4a\xe8\x8a\xea\xf3\x82" + "\xe6\x43\xaa\x37\x5c\xcc\x0d\x49\xaf\xd4\x26\xeb\x73\xa3\x4c\x9e" + "\x55\x32\x92\xcb\xd1\x77\x6e\x7a\xa5\x8b\xce\x3a\x30\x17\x16\x93" + "\x9e\x07\xc5\xf3\xc8\x57\x34\x1d\xec\xda\x62\x3a\xfb\x20\x7a\x56" + "\x3b\x9f\x1d\xdd\xce\x6a\x4f\xf2\xc2\xf7\x17\x48\x5e\xf0\xfd\xad" + "\x62\xde\x6c\x1f\xff\x80\x38\x0f\x17\x77\xdb\x6a\x8f\x05\xe6\xcf" + "\x29\x3b\x8d\x4d\x40\x1e\x5d\xdb\xd4\x4f\x8e\x13\x82\xb8\x0e\xdd" + "\xf7\x41\xd6\x24\x66\x08\x9d\x64\x67\xbb\x0d\xbc\xc0\xc5\x6a\x2b" + "\xa5\x4e\xf4\xa9\x08\x9d\x7e\xc6\x3b\xd6\xbf\xe1\x70\x7f\xf9\x57" + "\x69\x90\xfc\x2b\xcf\xc6\x3f\x6f\xb0\xb9\x89\x46\x76\x38\xdd\xc2" + "\xe6\xee\x9c\x06\x5b\x17\xe9\x39\x8d\x04\x9c\xd2\xf3\x7d\xbc\x07" + "\xef\xe3\xd1\x37\xb1\x87\x4c\x95\x32\x05\xf0\x63\xa7\xca\x25\x6f" + "\x22\xe3\x09\xee\x78\xa7\x79\x15\x4a\xe3\x83\x79\xd9\x81\x31\x5a" + "\x30\x10\xde\x1b\xbd\xcd\xa0\xd9\x36\x3b\x75\x8e\x78\x54\x82\xd5" + "\x0b\x06\x35\xe3\x85\x42\xfc\xf0\x24\xdc\x17\xa0\x2f\xb9\x47\x1b" + "\xb3\xd6\x13\xd9\x1d\xb4\x6f\x7a\x06\xc3\xa5\x18\xcf\x66\x7d\x3c" + "\x17\xf9\xdc\x73\x68\xbc\xba\x0b\x3f\x88\xd5\xc7\xb2\x73\xca\x14" + "\x5b\xc8\x36\x66\x39\x5e\x39\x9d\xe2\xb1\xfe\x4f\x09\xbd\x66\xb2" + "\x45\xd0\x3f\x2f\xf0\x70\x92\x96\x7f\x89\x9e\xbf\xbf\xcd\x6c\x71" + "\x59\x9c\x84\x5c\xf7\x49\x7d\x33\xcd\xc5\x79\x1f\x7d\x33\x3a\x8f" + "\x3e\x21\xe7\xa4\x2e\x83\x33\xc9\xfe\x9c\x7e\x42\xdd\x05\xfe\x7b" + "\x97\x75\xba\x26\x07\xc0\xda\xfe\xe0\xda\x14\xc6\x32\xbb\x36\xa5" + "\xf8\x65\x28\x24\xfb\x20\x3b\x98\x68\x47\xf0\xfd\x17\xbf\xbe\xb0" + "\x8b\x9d\x5e\x4c\xfa\x8b\xba\xec\x97\xd6\x95\x94\xdb\x9c\x8e\x76" + "\x76\x31\x86\xf2\xd6\x08\x5d\x8c\xc2\x0f\x32\xc5\xdc\x03\xaf\x2d" + "\xf8\xfc\x5c\xfe\x85\x7e\xae\x42\xb4\x8b\xbc\x1b\x7a\xda\x7f\xfe" + "\x21\xef\x49\x7e\x70\x82\xce\x56\x10\x9f\x36\x90\xbc\x10\xf8\x21" + "\x23\x7d\xcd\xf2\xb5\xcf\x3e\xfb\xcd\xa8\x21\xf8\xbc\xd5\x5e\xa8" + "\x16\xa3\x4c\xe2\x7f\x5d\x72\x9e\x9e\x06\xfe\xff\xb7\xa3\x92\x7e" + "\xfb\xe9\x97\x58\x37\x37\xb5\xb3\xba\x58\x9d\x7e\x97\xeb\xa8\xce" + "\xca\x0b\x4f\x67\x06\xd6\xc6\xe9\xae\xaf\xaf\x8d\xba\xf0\x81\xd7" + "\x46\x5d\x02\xf6\xd9\x66\x7c\xb7\xba\xd8\x7f\x8a\xfb\x17\x14\xd6" + "\x68\x70\x87\xd1\x3b\x47\xd0\xe0\xa9\x9b\x99\x42\xf4\x37\xc9\xa6" + "\x69\x3f\xf0\x81\xaf\xf5\x01\x47\xa4\x7a\x99\x89\xf6\x82\xb2\x35" + "\x24\x77\x9c\xc8\xbd\x57\xb9\x2b\x75\x33\xf0\x05\xc2\xa5\xed\x52" + "\x1f\x64\xe9\x15\xf0\x21\x78\x2f\x3b\x4f\xb8\x42\x25\x07\x1d\x4c" + "\xee\xd7\x75\x95\x3a\x8d\x6b\xdc\x66\x11\x76\xdb\x69\xdf\xf6\x49" + "\xdd\xba\x1a\xda\xbb\x51\xcf\x11\x81\x83\x7c\x46\x3a\x67\x60\x65" + "\xab\x50\x2e\xe9\xa8\xad\xa1\xf6\x85\xdc\x65\xf4\x26\x0a\xbb\x26" + "\x07\x56\x09\xdd\xb4\xbb\xa4\x6e\xda\x5d\xac\x6a\x0d\xc1\xa1\xce" + "\x7b\x5d\xd9\x78\x64\x69\x4d\x70\x7c\xf6\xb3\x2b\x53\x6d\x19\x9b" + "\x53\x49\x2f\xb5\xdf\xfe\x2e\xd7\x50\x61\xbd\x45\xc2\xb7\x7e\x71" + "\x40\x56\x25\xf5\x49\x09\x67\x4e\xf5\x08\xbb\xca\xda\x79\x52\x83" + "\xb8\xef\x90\x7f\x8d\xc2\xe1\x98\x73\x0d\xd3\x40\xc3\x87\x75\x92" + "\x1e\xd7\x81\x14\x66\x2f\xe4\x0e\x92\xa1\x21\x7e\x9c\x6e\xdf\xa1" + "\x13\xf1\x58\xfb\x14\x27\x6c\xb2\x90\x7c\x4e\xce\xbd\xfa\x13\x2e" + "\x66\x9c\xa1\xd5\x77\x17\xe9\x8a\x8a\xfb\x0d\x82\xce\xa8\xff\x4a" + "\xde\x17\xac\x6f\xd3\x61\x09\xda\x77\x36\xd9\x9a\x20\x9d\xb1\x4e" + "\x4e\xfa\xa9\x0d\xa1\x7a\x7e\x17\xab\x17\x77\x82\x1e\xed\x12\xef" + "\x35\x4b\xbb\x82\xed\x43\xd4\x57\x4a\xbc\x55\x5f\x8d\x78\xcc\x97" + "\xfa\x1d\x68\xf3\x68\x69\xb7\x42\x94\xb3\x40\xd7\xcd\x0b\x86\xdb" + "\x83\xe9\x36\x10\xcb\x2b\x9f\x7d\x76\xc5\xba\xf5\x96\x74\x69\x06" + "\xc2\xba\x36\x73\xf9\xfd\x9a\x3d\x88\x35\x2b\x36\xa5\xae\x5c\x2e" + "\xee\x9b\x21\x56\xbe\xf6\x83\x6f\x02\xf1\x37\xe2\x0e\x87\xe8\xd3" + "\x1f\x36\x54\x69\x74\x54\x0b\x6b\x0c\x95\xba\x3f\xce\xe7\xe4\xde" + "\x36\xea\x55\xb4\xe3\x8c\xbe\xb7\x91\x8c\xa5\x93\xdd\x6b\xa7\x73" + "\x39\xb2\x15\xb2\x7f\x2f\x6f\x25\x39\x0b\xd2\x60\xff\xab\x0f\xd7" + "\xd7\x6b\x09\xe2\x49\x3f\xc1\xb1\x86\x74\x12\xfe\xb0\x47\x2d\x8f" + "\x9f\xc1\xa3\xc6\xba\x80\xd7\x84\xcf\x6f\x3a\x8f\x92\x7e\x65\x9c" + "\x73\x09\x5f\x93\x2c\xd0\xb1\x86\x74\xbb\x9d\xd1\xa0\x4f\x4c\x2e" + "\xf6\x87\x0a\xf0\x7a\x33\x76\xe4\xb0\xf0\xfd\xf2\x8c\xd1\x25\xe5" + "\xca\xce\xb4\x77\x73\x19\xd3\xf6\x43\x57\x89\x90\x73\x3a\xa5\xcf" + "\x18\x7b\xfc\x7c\x6e\x9a\x7e\x8c\xf8\x70\x69\xff\xcd\xb9\x1b\xbc" + "\xd4\x7c\x6e\x37\x5b\x41\x8f\x77\xf3\x72\xb3\x15\xf1\x13\x10\xaf" + "\xf9\xe9\x19\x97\xb1\x88\x7c\xa3\x94\x8f\xcb\x40\x7c\x2c\xe2\xa5" + "\x7f\x37\xfb\x04\xeb\x22\x9f\x87\x6c\xca\x4c\xe4\xe5\x13\xac\xa8" + "\x13\xfd\xbf\xd5\x2d\xfb\x6f\x0e\x17\x73\x4e\xe0\x4d\xa7\x87\xef" + "\x32\x57\x08\x5d\xfe\x5d\xe6\x70\x95\x67\x84\x50\x18\xfb\xd6\x48" + "\xcc\x89\x33\x3c\xdf\xca\x34\xfd\xff\x90\xf3\xac\x71\x1b\xc9\x94" + "\x31\xd7\x4e\x10\x5c\xd1\xd6\xc5\x9a\xcc\x07\x74\x5b\x23\xf0\xff" + "\x0c\x26\xf1\x4f\x63\x92\x5e\x17\xd6\xbe\x1b\x7b\x7b\x32\xed\xef" + "\x80\x45\x02\x7e\x89\x52\x7e\xe5\x01\x1f\x39\xd1\x2f\xbf\x92\x34" + "\x64\x63\xb6\xbe\xf6\xa8\x6e\x0d\x1e\xc9\x6a\xa1\xb0\x4f\xac\x68" + "\x75\x25\x93\x2c\x45\x2f\x93\xa3\x4c\x7e\xb5\xa3\x1a\x7b\x71\x38" + "\x70\x90\x7b\xf4\x36\xec\xb9\x54\x07\xf1\x00\x5d\x13\x39\xf6\x64" + "\x5f\xaa\x2f\x54\xda\x88\xd9\xcc\x6e\x08\xa6\xff\x51\x5f\x5b\x80" + "\x66\x45\x19\x57\x81\xeb\xf3\x58\x41\x2b\xfb\x50\xd0\x90\x74\x56" + "\x4c\x73\xa4\x07\x63\x8e\x71\x6f\x43\x3d\x35\xe0\x5b\x6e\x38\xcf" + "\x3e\x9c\x4c\x63\x4f\x3a\x51\x55\x3d\x82\x97\x31\xa2\x6d\xa1\x2d" + "\xec\xc3\x48\x1a\x77\x2a\x0b\x30\x3e\xea\xed\x4e\xf9\x01\xd9\x68" + "\x24\x58\x6f\xcd\xe5\x6d\x96\x67\x09\xde\x1f\xed\x21\x1a\x1f\x7c" + "\x8f\x78\xcf\x5f\xce\x55\x31\x6f\xc4\x9d\x80\x8f\xf6\x6c\x6d\xe3" + "\xea\xb5\x42\xc6\x6b\xb1\xd7\x5c\x33\x30\xaf\x07\x3c\x3a\xda\x6d" + "\xc8\xbf\x40\x76\x24\xab\x81\xb7\x8a\x49\x17\x2b\xbc\x34\x87\x99" + "\xc8\x06\x67\xbe\x8d\x7b\x1a\xba\x2a\x59\x83\xad\x92\x7d\xe0\xdd" + "\xcd\x1c\x1b\x49\xe6\xfb\x87\xd9\xa7\xb3\x77\xd3\x1d\xac\x11\xa8" + "\xc3\x67\x79\x92\xea\xfa\xf0\xcc\xe9\x33\x1f\xb1\xd3\x8e\x8f\x98" + "\xe5\x27\x22\xdc\x5a\x97\xf2\x01\xab\x4b\xfa\x80\xe5\xb7\x72\x95" + "\xe8\xc5\xbc\xd5\x54\x47\x31\xca\xaa\x26\x7b\x95\x26\xb5\xd3\x3c" + "\x12\xfd\x0f\x5d\x94\x4d\x38\xd9\xcd\x1c\x6b\x7e\x47\x6d\x5c\x51" + "\x75\x99\x85\x3b\xd6\xfc\x5e\xbc\x0b\xf9\x0b\xfa\xeb\x5c\xde\x24" + "\x74\x8b\xc9\x56\xa7\x33\xbb\x8d\x6c\x19\xa8\x65\xd4\x46\x9f\x6c" + "\x37\xe0\x15\xaa\xe7\x3f\x90\xe7\xcf\x2f\x7c\xe5\xec\x27\x78\xa0" + "\x4d\xf5\x8b\x25\x4c\xea\x9a\x00\xd3\x27\x35\xf8\xa4\x04\xc3\xe7" + "\xc3\x1d\x04\x1f\xba\x6b\xa1\x6e\xec\xa8\x46\xdb\x92\x00\x03\x55" + "\xaf\x83\xe6\x00\x9d\x0b\x52\xf9\xa5\x97\x59\x84\x63\x0d\xdd\xc5" + "\xf8\xe8\x4b\x63\x72\x68\xb8\x7a\xf5\x42\x4d\xd9\x15\x16\x4a\xe3" + "\x46\x74\x48\x99\xf8\x2e\x60\x5e\x47\x63\xe6\x8e\xb4\x5a\xf0\x03" + "\x4f\x62\xb5\xd2\xdc\xc3\x33\x01\xe3\x55\x8c\x36\x2c\xc7\x58\x55" + "\xd3\x53\x5b\x6f\x29\x64\xc3\x98\xf6\x7a\xcc\x95\x40\xfc\xae\x71" + "\x3f\xf6\x62\xed\xa8\x82\x8f\xfd\x68\xb9\x5a\x7e\x77\x85\xd4\xcb" + "\x6f\x48\xd9\x0f\xbe\xa1\x72\x97\xb0\xfd\x12\x01\x5e\x47\xe8\x72" + "\xbc\x24\xee\x88\xfe\x21\x43\xdf\x13\xfe\x35\x86\xec\xaa\x7c\xb4" + "\xdb\x20\x74\x84\xe3\x17\x68\x73\x7d\x01\xd2\xec\x74\xb1\x29\x47" + "\xe4\x9a\x68\x14\x77\x59\x09\xa7\x0c\x46\xb3\x61\x1f\xac\x23\xdd" + "\x6c\x3e\x21\x85\x45\x28\xdc\x1d\x91\x66\xe4\x4e\xef\x09\x9a\x43" + "\x11\x62\xee\xcb\x6f\xa0\xb3\xdd\x46\xec\x93\x8d\x88\x0f\xd5\xe3" + "\x69\x3f\x56\xc1\x7b\x13\xdf\xbf\x68\xb3\x91\xe7\x5d\x61\xb1\x42" + "\x86\xa6\xc7\x6f\x76\x1b\x1b\xcc\x8c\xee\xb7\x79\xc9\x76\x14\xe5" + "\x41\x7c\x08\xf6\xdd\x63\xa8\xd7\x81\xf4\xd1\x7a\x7a\xde\x99\x12" + "\xea\xcc\x3e\x21\xd6\x19\xd9\x17\x14\xfb\xad\x8c\x1f\xb6\x28\xdb" + "\x6d\x14\x63\xa6\xc7\xad\x4f\x11\xfb\x3c\xd9\x97\x01\x1d\xcf\x45" + "\x7b\xce\x8b\x78\x05\x7c\xb8\xd0\x31\x09\x8a\x33\x90\x2d\x1f\xb2" + "\x17\x1b\x14\x17\x82\x36\x33\x7f\x18\x75\xd3\x9e\x4f\xeb\x6e\xd1" + "\x66\x3a\x4f\x94\x7b\xbd\xa8\x7b\x33\x67\xd2\x06\xb5\x8c\x93\x34" + "\xc5\x19\x77\xb0\x0c\x80\xce\x70\xa8\x6e\xb5\x33\xc5\xe0\xeb\x4c" + "\x09\xa1\xfa\xa9\x2c\x92\xdf\xa2\x8f\xa8\x97\xf4\x2f\x9a\x18\x2f" + "\x7f\xcd\xc4\xe9\x3e\x23\xca\x15\xed\xc9\xf6\x00\xf7\xbc\x66\x1f" + "\x58\x6f\xed\x85\x5a\x47\xde\x4f\x30\xa7\xff\x28\x6c\x2e\xfa\x4c" + "\x09\x19\x96\x55\xb4\xe7\xff\xf1\x39\x1a\x53\x1f\xd6\xb9\x2f\x32" + "\x21\x63\x6a\x1b\x53\xf2\xb0\x76\xe4\x39\xe7\x1f\xcb\x89\xe6\xcc" + "\x57\x39\xc7\xfb\x0e\x9a\xbb\xc6\x0e\xd2\x37\x4b\xc8\x14\x3a\x5e" + "\x51\x65\x0e\xa7\xa7\x8d\xd5\x15\x7c\xc2\xea\xbc\xce\x82\x63\x97" + "\xdd\xa1\x52\xd7\x2b\x94\xca\x7d\x85\xbe\xe5\x63\xbd\xa4\xfa\xaa" + "\x07\xe7\x93\xc1\x7b\x01\x76\x9f\xc9\xbd\xe0\x8f\x1e\x9d\xdf\xba" + "\x7e\x1f\x3e\x4e\x26\x9b\xbf\xa4\x07\xad\xee\x5a\x4d\x67\x34\xf9" + "\xbc\xdb\xca\xa6\x0a\x5d\xa3\x8f\xad\xa3\xbb\x58\x92\x56\xee\x25" + "\x59\x2e\xd2\x5f\xa7\x5c\x9a\xb7\x75\x15\x42\xa6\x8e\x3e\xad\xae" + "\xf1\xa1\x6c\x5f\xd4\x6a\x3a\x83\xcb\x07\x2d\x04\xda\xe6\x4f\x7b" + "\x50\x4f\x4d\x83\xb7\x91\x91\xdd\xf0\x2a\x15\x7b\xff\x25\x33\xd3" + "\xf4\xda\xf2\x2f\xb2\x8f\xb7\xa9\xdc\x6a\x02\x1f\x48\xb2\xe4\x7c" + "\xc2\xb3\x24\x9b\xcf\xf3\xb1\x30\x67\x96\x8b\x91\xbd\x5b\x94\xf1" + "\x8b\x93\x24\xb7\x07\xae\xf2\x71\xb3\xe1\xad\xab\x2e\x56\x06\xfc" + "\x2d\xec\xdf\x6e\x9f\xf0\xd2\xe8\x6d\x6c\x0e\x37\x18\x85\x5e\xa4" + "\x5a\x5e\x52\x8b\xb1\x35\x4b\x3d\xba\xf8\x25\x41\x3a\x74\x21\x17" + "\xd9\x9f\x86\x91\x0e\x1d\x37\xc5\x5b\x48\x8f\x88\x63\xcc\xba\x0b" + "\xff\x94\xe8\x62\x7f\x14\x77\x77\x76\x12\x8d\x25\xf0\xfc\x9f\xf6" + "\xbb\x23\x57\x92\x8f\x58\xf2\x05\xac\xa8\x1b\xbd\x35\x65\x5f\xb1" + "\x50\x09\x8f\x3f\x6d\x6d\xe8\xe8\x76\x70\xfb\x4a\x3b\xad\x23\xad" + "\x6c\x23\xca\x5e\xc8\xcb\x57\xda\x5d\xec\x4f\x95\x72\x6c\xc4\x7b" + "\x06\x7d\xf7\xf6\xd2\x9d\xd7\x8f\x5b\x2b\x7b\x88\xc6\xfa\xd8\x0e" + "\xba\xd9\xd1\x69\x5a\x69\x7f\xdc\x5c\x00\x7a\xe2\x4f\x35\x2e\xc3" + "\x87\xb5\x62\x6f\xd7\x6c\xf9\xf6\x97\x3d\xf8\xc7\x70\x9f\x79\xa4" + "\x13\x85\x80\x07\x88\x6e\x67\x9f\x4c\xea\x29\x64\x86\x5e\xec\xad" + "\x3d\xe0\xa3\xf8\xbe\x94\x88\xd2\xf1\x2c\x11\xdf\xc6\xb7\xb3\xa6" + "\x61\x5e\x03\x8b\xc6\xcf\xe4\x9e\x90\x41\xfe\x45\x92\x48\x3e\x5c" + "\x7f\x99\xce\xac\x9b\x04\xde\x2f\x7b\x89\xc5\xa9\x28\x8f\xe4\xd2" + "\x65\xe3\x59\x1c\xc9\xa4\x11\x67\x4d\xf5\xc9\x33\x1b\x9d\xe7\xdc" + "\x3e\x9e\x25\xf4\xad\xf7\x4f\x1d\x92\x66\xfc\xc4\x42\xcf\x4d\x6e" + "\x76\xb3\xed\x7b\xbc\x05\xe5\x92\x0f\x52\xce\x27\x98\x0d\x92\xb6" + "\x6c\x3a\x65\xac\x90\xf3\x4e\x9c\x51\x60\xbe\xd1\x19\x90\x26\xfb" + "\x56\x84\x0d\xe3\xa8\x44\x0f\xdd\x39\x14\x71\x8a\x89\x60\x69\x12" + "\xed\xd0\xec\x8e\xfa\xb6\xdf\x91\x46\x65\x50\x7b\x52\xd3\xa5\xdc" + "\x9c\x6c\x92\xba\x58\x93\x90\xf3\xec\x7c\x89\x45\xfc\xf2\x25\x66" + "\xaa\x7f\x56\xf4\xcb\x23\xd7\x62\x28\xa3\xf6\xaa\x76\x5a\x67\x98" + "\x13\x68\x37\xd5\x47\x73\xa3\xc1\x7b\xc9\x91\x9f\xc5\x55\xc7\x2a" + "\xb2\xbb\xf3\xe7\x7b\x1d\xeb\x0e\xb3\x45\xad\x5e\x69\x47\x6f\x09" + "\x73\x1f\x40\x79\x07\xc6\x33\xd3\x79\xf6\xe7\x79\xce\x4c\xc2\xb5" + "\xe6\x5b\x1c\xeb\x8e\xa0\xec\x3f\x3f\x45\xfb\x51\x09\xe0\x23\xf7" + "\xa5\x4f\x22\x9c\x9e\x26\x46\x3e\x5c\x1e\xb5\x71\x1f\x95\x83\x34" + "\xe5\xa2\xbf\xfb\xcc\x96\x54\x69\x37\x56\xf4\xd5\x7f\x1e\xa1\xf5" + "\xc3\x79\x59\x94\x77\xd0\x99\x06\xfa\x55\xeb\x93\x0e\x6b\x39\xbf" + "\xfe\xfc\xb9\x63\xdd\x41\x46\xe3\x43\xe9\x11\x6e\x74\x02\xe2\xa9" + "\x17\xfa\x8e\x0b\xa5\x39\xcf\x3e\xa1\x72\xef\x09\x9c\xb3\xd1\xf9" + "\x4f\x20\x4d\xe5\x4b\xa4\x0b\xd8\x34\x77\x1f\x60\x24\xe5\x8f\x7f" + "\x5e\x4d\x6d\x75\xb1\x3f\x67\x3a\xb3\x3e\x19\xf8\xae\x2f\xd6\x3e" + "\xe6\xfd\xb6\x06\x21\x7b\xfb\xe4\xe9\x47\xbd\x2a\x97\xf8\xec\x2f" + "\x26\xd0\x6e\xb5\x2e\x3c\x09\x17\x08\x7c\x32\x85\xce\xc6\xff\x12" + "\x69\x54\xe4\xf8\x52\x5f\x88\x66\x1a\x68\x8c\x83\xce\x3d\x4c\xd4" + "\x56\x7d\x8c\xb9\xe9\x85\x5a\x95\xce\xb3\x48\x67\xbd\xd7\xcc\xe4" + "\xfc\xe3\x76\x94\xab\xe1\xb8\xf8\x6a\x6d\x3f\xad\xee\x8c\x4c\xc8" + "\xe2\x5b\xcc\x4c\xd7\xaf\xc5\xfa\xb5\xa5\x4a\x9d\x68\x33\xe1\xa8" + "\x03\x06\xb9\x76\xa8\x8d\x5a\xde\x4a\x79\xce\xfe\x49\x23\xf2\x57" + "\x0e\xd8\xdf\x10\xe0\x9d\x42\xa0\x69\xf4\x47\xdc\xc1\x03\xae\xc2" + "\x7e\x10\xe6\xec\xea\x61\xf2\xec\xff\x2f\x64\x5b\x20\x8c\xee\x5f" + "\xeb\x6d\x1b\xda\x19\xc5\x5f\x52\xe4\x19\xc5\x5f\x2a\x74\x7e\x9c" + "\x9b\x00\xe3\x42\xa3\xf0\xe7\x01\xba\x4b\xed\x8a\x7c\xa1\xd1\x1d" + "\xf9\xaa\xc6\x93\xfd\xc5\xc1\x23\x25\xbe\x4d\xf5\xb0\x02\xea\x97" + "\x26\xe3\x08\xa3\x3e\xa3\x1c\x97\x7e\x56\xae\x97\x3d\xa8\x8f\x1c" + "\xbd\x6f\xe8\x93\xb4\xdb\xf1\x42\xad\xe8\x1b\xd9\x9e\x12\x7d\x6b" + "\x7e\x9a\xf2\x0f\xad\x3f\xcd\xd2\x47\xa2\xfd\x85\x46\xc7\x78\x2a" + "\xe3\xec\x15\x6a\x1f\x8d\x09\xf0\xc3\xd8\x76\xd6\x5c\xc3\x47\xfe" + "\x72\xe4\x10\xcb\x94\x77\xad\xed\xaf\xb2\x3d\xc0\xc1\xf2\x2e\x2e" + "\xe9\xff\x9c\x3d\xcb\xcb\x5f\x15\x3c\x4c\x27\xea\xc3\xfc\x08\xc2" + "\x43\x67\xd3\x68\xac\xa6\x1c\x66\x49\x72\x1e\x9e\x7d\x82\x78\x67" + "\xe9\xc3\xec\x2c\xf8\xdf\x3f\x49\x9c\xea\xd7\xc5\x56\x84\x2e\x76" + "\x30\x8e\x1d\x5a\x1b\xcf\x0a\x7c\xc7\xa3\x4a\x6c\x68\x6f\x97\xd0" + "\x71\x42\x7b\x37\x79\x75\xfc\xd7\xdc\xc5\x49\x76\x9e\xa7\xc9\x50" + "\x09\x97\xe5\x49\x1b\x98\x68\xcf\x6e\xbf\x0c\x95\x6c\x15\x14\xf2" + "\x5a\x4a\x87\xb1\xbf\x44\x69\xa4\x6d\xbd\x76\xed\x1e\xff\xd9\x5f" + "\x69\x77\xf4\xad\xa4\xf7\x85\xbc\x8d\x2e\xc5\x20\xf4\x84\x09\x06" + "\x54\xb7\x68\xbb\x81\xe4\xa5\x67\x3b\x02\x32\xeb\x66\xc1\x3b\x4a" + "\x3b\x1b\x9f\x86\xea\x73\x04\xfd\x0d\x93\x7e\x6b\x9a\x57\x1f\x4f" + "\x60\x62\x0e\x74\x72\xf3\xc8\x5b\x2b\x69\x4e\x7e\x9a\x10\x0c\xa7" + "\x45\x5e\x35\x5f\xe2\xa0\xb3\xd1\x5c\xac\xf5\xb3\xd1\xdf\x4c\x4f" + "\x7c\xba\x4d\xa7\x45\x24\x9c\x4d\xc0\x2f\x9f\x2f\x10\xb0\xb6\x9b" + "\x3d\x64\x57\x7a\x4b\x1e\xd9\xc9\xff\xec\xfb\xe4\x8f\xc0\x6b\x1f" + "\x67\xf6\xe5\x9b\xc9\xfe\x32\x53\xed\xe3\xac\xe7\x6d\xcc\x90\x6a" + "\x23\x39\xfd\xca\x34\xe2\xf1\xc0\xb3\x9a\x78\x14\xe8\x13\xac\xf3" + "\xad\x2b\x99\xf1\xe9\x0c\x92\x57\x58\xa3\xc9\x5f\x00\xf9\x0a\x20" + "\x5f\x1f\xbe\x7c\x6b\x14\xde\x63\x40\xcf\x99\xb8\x69\x5c\x38\x9d" + "\xf5\xfb\x0a\x39\xf0\x71\x33\xe9\x32\x1b\x9c\x6e\x0f\xdb\x7a\x81" + "\x85\x93\x3f\x02\x6f\xf9\xca\xec\x86\xae\xb3\x82\xbf\x19\x6d\x63" + "\xd1\xa0\x3f\xe8\x6e\x8b\x59\x8d\x5c\x99\x86\x3d\x7e\xb9\xec\xf7" + "\x25\x2e\xfb\x2d\xdb\x4d\xed\x97\x38\x6e\x82\x35\x4f\xb4\xdd\x75" + "\xce\x8b\xf2\x55\xbb\x25\xce\x67\xb7\x58\xa4\xad\x88\x3a\x96\x97" + "\xc5\xdb\x9c\x5d\x75\xe0\xb9\xae\x08\xdf\x8c\xa4\x4b\x40\x7d\xa4" + "\xfe\x51\xdd\xa7\x2f\x5f\x10\xfe\x15\xbc\x08\xe7\x67\x6a\x79\x3a" + "\x90\xa7\xa3\x8e\xf5\xd8\x2d\xa2\xef\x0d\x5d\x32\x6f\xaa\x78\xa7" + "\xfc\x41\x70\xd0\xfa\xec\x87\x03\xfa\x4e\xfd\xa3\xfe\x7b\x09\x26" + "\x80\x81\xd6\x57\x73\xaf\xd6\x4f\xea\xe3\x07\xc0\x0a\x2f\xa1\x9f" + "\xe8\xab\xe8\x67\x2f\xfa\x59\x9b\xc1\x18\x06\xcf\x75\x2d\xca\x62" + "\x21\x1e\x35\xff\x43\xd0\xf0\xb9\x76\x06\x5e\x34\xf4\xf5\x3c\xbb" + "\xe1\x5f\x41\x9b\xe4\xb9\xc1\x93\xba\x79\x5b\x03\xfa\xe4\xb4\xe1" + "\xe7\xad\x64\x44\xe3\xe8\xf4\x3a\xe9\x89\x9f\x56\xcf\xb1\xbc\x36" + "\xde\x06\xda\xd4\x43\x7a\xcc\xce\x0c\xf4\x1f\x3c\xec\x79\xad\xfd" + "\x94\x76\xeb\x57\xb2\x5f\xc6\x4c\x16\xfd\xce\x4f\x8a\x0d\xce\xa6" + "\x62\xa6\xf7\x65\x29\xd2\xa1\x3f\x66\x94\x75\x03\xf5\x47\x45\x3f" + "\xf7\xa1\x9d\x9e\xa0\x3e\xd5\x77\x78\x50\xe6\x1f\xd9\xc8\x64\xa6" + "\xbc\x74\x11\xfd\xb8\xc8\xcc\xf6\x3c\xd0\x5f\x8f\x11\xbd\xe8\xba" + "\x69\x54\x0a\x8b\x73\xb1\xcf\xe2\xe4\xbc\x13\xb6\xce\xc7\xb4\xb3" + "\xcf\xe7\xf9\xed\x99\x93\x8f\x88\xc8\x95\xb9\x34\x8f\x84\x5d\x73" + "\xda\x33\xba\x31\x67\xe8\xcc\x7f\x13\xea\xe8\xb6\xc6\x88\xf6\x14" + "\xce\x20\xbd\xe6\x08\x84\xc9\x37\x1a\xdd\xc3\x56\x90\x2f\x9b\x03" + "\x66\x54\x3e\xe8\xb9\xe5\xf4\x24\x18\x0e\xa8\xbf\xfb\x06\x9b\x85" + "\x3a\x96\x10\xff\x5d\x93\xe7\x36\x3c\xff\x06\x4b\x18\x1a\x4e\xf9" + "\x3c\x6b\x30\xfc\x4d\xb2\x5e\x2a\x0f\x7d\x8b\xc2\xce\xfd\x54\xdf" + "\x35\x66\x11\xb8\x4c\xe2\xc1\x16\x0b\xc9\x52\x87\x58\xaf\xa0\xe1" + "\x48\x5f\x63\x68\xf9\x5a\xe2\xf4\x76\xa0\x0c\xd7\x60\x6d\x1f\x3a" + "\x1c\x5a\x72\x07\x2b\xab\x64\xaf\xd0\xb7\xcc\x2f\xdd\x0b\x7c\x01" + "\x5a\xe1\xb8\x99\xce\x65\xb0\x77\x1e\xec\x62\xeb\xf7\x33\xf2\xe7" + "\x77\x83\xd3\xbb\x90\x1d\xaf\x4c\x64\x55\x97\xc9\x16\xa2\x35\xea" + "\x85\xcb\x18\x4b\x0d\x87\x10\x4d\x4a\x32\x69\xbe\xde\x6a\x2a\xdb" + "\xab\xd3\xf0\x7f\x9d\x97\x7b\x85\x19\x2c\x6b\xc4\xfb\xdc\xb9\x16" + "\xee\xdd\x6d\x50\x33\x2a\xc9\x4e\x7f\x54\x29\xd1\xa0\x19\xba\xed" + "\x7b\x41\xfb\x64\x63\xcd\x75\x9a\x47\x96\xac\x63\x09\xe4\xaf\xc3" + "\xe8\x96\xb4\x9c\xdc\xaf\xff\x9a\x85\xf6\x99\x34\x7b\xf8\x26\x69" + "\x0f\xff\xf3\x63\xa4\x23\xaf\x7d\x7f\xc5\x07\x1e\x46\x94\xbb\x8e" + "\xc5\x55\x5e\x66\x56\xa2\x83\x52\xcf\x49\x9a\x8d\xf8\xc2\x85\x1d" + "\x46\xee\xfb\x9b\x95\xed\x6f\x0f\xf8\xf3\x70\xaf\x27\x1f\x20\xdc" + "\x3c\x98\x2e\x76\x59\x8c\xd0\x4d\x10\xb6\xa4\xe9\xcc\x02\x61\xb6" + "\x7b\x17\x0b\x3d\x4e\x7a\x8e\xd5\xf2\x7e\xe9\x71\xaf\xd4\x1d\xee" + "\x2e\x6c\x8d\xd6\xfd\x1c\x0c\x7a\xf6\x6e\x97\xfc\x8e\x1a\x06\xfe" + "\xcb\xdd\xed\x90\xb6\x75\x5b\x97\x38\x77\xa8\x41\x3c\x4e\xeb\xfd" + "\xf4\x8d\xe2\xc8\x5e\x61\x92\x80\x65\xeb\x0e\xe2\x7b\x34\x9e\xf1" + "\x1d\x8b\x3f\x4e\xd2\x30\x42\x7f\xdb\x2c\xcf\x12\xb1\x37\x8d\x46" + "\x5b\xaa\xf5\xfd\x8c\xf6\x75\x69\xc3\xb8\xf5\x88\xcb\x70\x86\x5d" + "\xa7\x7d\x26\x4d\xdf\x9c\xce\x81\x92\x90\xbe\x55\xdf\xdf\xc4\x79" + "\xf0\xf6\xf1\x0f\xac\xdf\xcc\x62\x1f\x1f\x17\xce\xe8\x2c\x11\x69" + "\xdb\xe4\xbe\x7b\x2e\x22\x70\xde\x90\x24\xe0\x4d\xb6\x37\x04\x8f" + "\x41\x36\x6d\xa5\xcf\x8e\x0e\xdd\xb6\xad\xdc\x7f\xcf\xdd\x1e\xa8" + "\xe7\xdc\x02\xff\x3e\x8a\x3a\x48\x9f\x9d\xca\x97\xb4\xc9\x39\x69" + "\x6f\x12\xe9\xe4\xfe\x7a\x8e\x5d\x87\x16\xb3\x12\x7c\x55\x8d\x9f" + "\x74\x76\x7c\x21\xe1\x9b\xcd\x42\xe8\x4e\xc7\x3b\x79\xae\xd0\xd1" + "\xd2\x06\xbd\x11\xf5\xef\xa7\xef\x34\xd7\x1d\x53\x48\x1e\x78\xee" + "\x1a\x49\x97\x79\x6f\x4a\xc4\xa3\xc4\xeb\x0b\x5a\xfc\x5c\xdb\x9d" + "\xc8\x87\xb8\xa8\xb7\x2f\x7a\x42\xcb\x72\x58\x82\xb4\x11\x7c\x4e" + "\xe8\x77\x92\x2d\x86\x5b\xa3\x99\xf9\xd6\xdd\xcc\xda\x5d\x78\xde" + "\xe4\x32\x7c\x24\x74\x54\x44\xfd\xbb\x5e\x4b\xa4\x7b\x29\x6f\xf6" + "\xb8\x86\xc9\xb1\x3a\xff\x3a\xdd\x41\x09\x0a\xff\x50\x3b\x6b\x02" + "\xad\x71\xfe\xf0\x81\x8b\x52\x2f\x5f\xc8\x97\xec\xa5\x35\x01\x5d" + "\x86\xf3\xaf\xcb\xb6\x9c\x7f\xfd\xb8\x4d\xdc\xe1\x39\x53\x25\x7c" + "\x0f\x9c\x07\x7f\xd6\xea\xd0\xe4\x31\x8d\x62\x5e\x11\xbd\x5b\x44" + "\x3c\xd8\x17\x8e\x12\xa4\xa3\x7d\x02\xf4\x51\x92\xa4\xe1\x4b\x6b" + "\x55\xcc\x9f\x40\xff\xcf\x8f\x23\x79\xe3\x80\x38\xf1\x25\xc6\x44" + "\x9e\xf2\x52\x26\x74\x63\xca\x5f\x2b\xc6\x33\x9c\x97\x97\xd5\xe0" + "\x19\x81\x78\x07\x9e\x26\x3c\x8f\xe2\x09\x1a\xe6\x35\x1b\xcd\x4b" + "\xf0\xb0\x66\xf2\xc1\xda\x19\x59\xe2\x19\xec\xbe\x1f\xc1\xc6\xb9" + "\xe3\x49\x26\xf5\xff\xbe\xb0\x93\xff\xcd\x45\xfb\x19\x5b\xef\xe5" + "\x3d\x96\x9b\xc9\x87\xce\x17\xf6\xfc\xfd\x74\x2e\xff\xc5\xf2\xbe" + "\xe7\xf2\x5f\xec\xc0\xef\x04\x63\x6d\x98\xe5\x6d\xf3\xf1\x6e\x0f" + "\xfc\xda\x76\x74\x17\x7e\x61\x07\x1c\x05\x8d\x35\x34\x9c\xf8\x85" + "\x90\xf9\x94\x11\x5f\x14\xb9\xba\x5a\xf6\xf7\x15\x17\xc2\xe1\x3c" + "\xf2\x35\x8b\xd6\xdf\x46\x84\x4d\x96\x7c\xec\x6b\x91\x80\xc9\x78" + "\xf4\x39\xf2\xb5\x62\xea\x2f\xb5\xb7\x33\xb2\xac\x26\xf8\xae\x23" + "\x95\x49\xfd\x77\x47\x22\x1f\x60\xc9\xa7\x4c\xb1\xe9\xf0\xd4\xe0" + "\x44\xf7\x7b\x0c\x9d\x28\x43\xd2\x41\x48\x8f\x32\xf4\xf4\x7e\xd8" + "\x8f\x27\xbb\x1b\x18\x53\xa4\x03\x4f\x1c\xae\xdf\xa3\xec\x2e\x6c" + "\xcb\x7d\x37\x53\x9e\x8d\x50\xde\xae\xa0\xbc\x64\x2b\x64\xa0\xfc" + "\xa8\x33\x5c\xd6\x59\x56\x73\x9e\x7d\x51\x2e\xeb\x6d\xb3\x0d\xb6" + "\x96\xf2\x26\x81\xbe\xab\x74\xd1\x5d\x2e\xa2\x87\x66\x3b\x63\xbb" + "\x98\xb3\x52\xc5\x9e\x5f\xea\x4a\xca\xe3\x8e\xf3\xec\xcb\x69\x0d" + "\x9e\xb6\x21\xee\x87\x6d\x42\x9f\x97\xf7\x14\x30\x67\xee\x74\xc1" + "\x87\x5d\x64\xed\xe9\x4e\xb7\xb0\xa5\x40\xef\x42\x1f\x92\xce\xe3" + "\x69\x6f\x00\x8f\xed\xf7\x03\xa3\x22\x6d\x15\xc5\x23\x8e\xee\x70" + "\x1d\x08\xfa\xc6\x77\x95\x1c\x95\x6b\xaa\x7d\x1c\xd1\x16\xa2\xbd" + "\xde\x1f\x38\xa8\xcd\xaa\xbd\xe4\x28\xf5\x21\x1f\xfc\x1f\xf9\xbe" + "\xa5\x35\x61\xd9\x48\xb2\xc2\x2f\xaf\x60\xde\x71\xb5\xbc\xe4\xe8" + "\xd0\xfa\xf0\xa5\x83\xea\xcc\xf7\xf2\x8b\xee\xc8\x92\xa3\x44\x93" + "\x94\xe5\x0d\x0b\x7f\xb0\x92\x3b\x3a\xa3\x4a\x5d\xdd\x85\xed\xe6" + "\x77\xb3\xe5\xd8\x0c\xad\xdc\x76\xb3\xde\xf7\x2a\xad\xef\xa8\x4b" + "\xd8\x43\x98\x5a\x21\xfd\xe3\x20\x4d\xf2\xa0\x32\x2b\x8c\x33\xd1" + "\x03\xd8\x1b\xae\x69\xb0\xa8\xf6\xef\x0d\x43\x6b\x47\xf5\xb7\xa8" + "\xa3\x57\xd6\xf1\xb7\xd0\xbf\xaf\x8e\xbf\x85\x5e\xaf\x0e\x79\x16" + "\xff\x37\xfb\xd0\x79\xc7\xbf\x09\xbb\x96\xc0\x9f\x8d\x12\x67\x5e" + "\x50\x7c\xe0\xdf\xbc\xa6\x57\x5c\x44\xdb\x90\xde\x2d\xf9\x0a\xf2" + "\xda\x57\x57\xd7\x67\xf7\x30\xc7\xc6\x8f\x58\x2b\xfb\xdb\x29\xca" + "\x53\x9f\x45\x3c\xdb\x6b\x96\xde\x5d\x65\x89\xbd\x86\x76\x17\xc1" + "\x7b\x3f\xc6\x61\x5f\xd0\x3c\x6b\xe8\xfa\x88\x39\xd3\x48\xbe\xda" + "\x48\x72\x6d\xe0\x82\x57\x5c\x2a\x70\x03\x68\x74\x9f\x80\x07\xe8" + "\x17\xc9\x6f\xbd\x50\x2b\xf8\x2d\xb7\xb0\x05\x7e\x83\xf0\x01\x54" + "\xf8\x46\x07\xc9\xbe\x7d\xbd\x29\x96\xee\x42\x96\x4c\xbe\x81\x48" + "\xee\xcc\x4d\xf1\xb3\x16\x79\x43\xb8\xe0\xa7\x40\xfb\x93\x6f\x20" + "\x67\x97\x8b\xf9\x40\x47\x57\x5e\x65\xd1\x95\xa0\x3d\x81\xb3\x4d" + "\x84\xd7\x0f\x68\xfe\x81\x4a\xae\x06\xfc\x03\x55\x91\xac\xa7\x09" + "\xef\x57\x59\xa8\xaf\xfc\x85\xda\x7d\x57\x59\xdc\xfe\x8d\xcc\xba" + "\x8f\x64\x79\x5f\x4a\xda\x47\xe8\xc9\x93\xaf\xa0\xb5\x56\x3a\x4b" + "\x08\xd0\x3e\x64\xfb\x23\x80\xb7\xc4\x58\x0e\x0d\xde\x1d\x62\x1f" + "\xf4\xda\x4b\x99\xd7\xf4\x5a\x31\x60\x57\x83\x38\x06\xf8\xe5\x0e" + "\x34\xb6\xba\xbe\xcd\xee\x20\xff\x4e\xef\xc6\x49\xfc\xee\x62\x17" + "\xe6\x0e\x36\x27\x7c\xfb\x52\xd8\xd4\x0e\x96\x28\x75\x00\x46\x60" + "\x4f\xbc\x70\x88\xf4\x23\xf3\x56\x33\xb3\x6f\xdf\x12\x25\xff\x65" + "\x16\xe2\xf4\x26\x31\xfa\xe5\x7d\xc5\xdb\xa6\x66\xb2\x44\x3a\x7f" + "\xa0\xb3\x12\xcb\x16\x91\x7e\x73\x5c\x2e\x4b\x0c\x2e\x7b\xbe\x54" + "\x22\x11\x4e\x15\x36\x93\x06\xc9\xa6\x95\x59\x19\x96\x65\x1b\xd6" + "\xad\x5b\xb1\x26\xcb\xb2\xf0\xc1\xe4\x7e\x77\xdd\x4a\xb1\x2f\x18" + "\xb7\xcd\x5b\x6c\xf4\xce\xb7\x48\xff\x5c\x97\x12\x49\x5f\x97\xe7" + "\xa7\x54\x48\xfa\xf3\xd2\x34\x49\xb3\x4f\x37\xc9\xbb\x76\x97\x12" + "\xb5\xf0\x31\xcc\xe7\x9b\xdb\xd9\x45\xb1\xdf\xab\xfb\xcc\x07\x31" + "\x37\x95\xf3\xec\xe2\xe7\xa4\xe3\x20\xe7\xe9\xc5\x77\xc9\x6e\x84" + "\xd4\x85\xb8\x70\x44\xea\x42\x5c\xf4\xdb\x7f\x91\xba\x5f\xa5\x8d" + "\xa4\xf7\x40\xe7\xdb\x72\xed\x5d\x2c\xd0\xd7\x1e\xd2\xee\x04\xfd" + "\x64\x1a\x3a\xce\xb9\xb8\x53\xca\xcc\x2e\xd6\x01\xfe\x29\x9a\xce" + "\xe3\xc4\x16\xb4\x9d\xda\x82\xef\xc9\xd4\x9e\xc0\x9d\xa1\x4b\xe3" + "\xfa\xda\xcb\xd1\xfa\xb8\xcf\xfc\xaa\x94\x87\x5f\x9a\x46\xfd\x41" + "\xbe\xa4\xa0\xf8\x58\xf4\x3d\x49\x8b\x77\x53\xfe\x01\xc7\xe1\x87" + "\x6b\x96\xad\x5d\x6d\x4b\xcf\x5a\xf9\xcc\xca\xcc\x95\x59\x9b\x85" + "\x39\x88\x04\xf1\xef\xa1\xc9\xcb\x17\xf7\xf7\x6d\x60\x25\xb9\x88" + "\x66\x13\xbd\x8b\x74\x1a\xa4\x6c\xea\xd2\x49\x6f\x21\x9b\x33\x34" + "\x18\x5c\x12\x78\xa6\x52\xd8\x88\xb9\x74\xc6\x65\xf8\x83\x49\x3b" + "\xa3\xe8\x90\xfa\x9f\xf2\x7b\xa7\xe9\x35\x9b\x65\x3c\x9b\xdd\xc2" + "\x3a\x8b\xe9\x6c\x0a\x63\xe2\xa0\x3d\xac\x24\x87\xf6\x9a\x46\x56" + "\xef\xc5\x7e\x26\xce\xab\xdd\xbf\x25\x9f\x67\x44\xc7\x01\x46\x07" + "\x5b\x98\x5b\x8c\x3b\xbf\x64\x3e\x28\xec\xbe\x5c\x32\xbf\x4a\xf3" + "\x86\xda\xac\xf2\x94\x7d\x9c\xa7\xbc\xa4\x5e\xca\xd8\xc7\x2f\x65" + "\xbc\x14\xb0\xab\xea\x3e\x82\xbc\x87\x5b\xb4\xb2\x4a\x2f\xb2\xc3" + "\x84\xab\x28\x6c\xcc\x32\x81\x3f\x2b\x3d\x4a\xed\x71\xba\x13\x99" + "\xb4\x05\xe1\x3e\xe2\xec\x9a\xce\x40\xff\x39\xc4\x7d\x4f\x71\xc6" + "\x06\x1a\x0d\xf9\x9c\x68\x97\xd3\xdd\x43\xf4\xc0\x51\x15\x74\x1a" + "\xfa\xdb\x8a\x3d\xcf\x43\xe5\x52\x9f\xf7\x83\x4e\x27\xbd\x8b\xee" + "\x42\x37\xe8\xd0\x0b\x4d\xc1\xba\x37\x04\x83\x12\x7c\x27\xdd\x0b" + "\x39\xfe\xee\x2b\x34\x7e\x80\xf1\x3d\x81\x39\xf0\xd5\x08\xea\xdf" + "\x82\x56\xfe\x19\xb7\x8f\x9b\x2f\xc7\xfb\xab\x9b\xb4\xb8\x4b\x01" + "\x5b\x14\x5f\x4d\x43\xb8\x17\x3f\x95\xdb\xc7\x67\x04\x9d\x0f\xd3" + "\x37\xc1\x77\x93\x1e\x89\x2d\x87\xd6\xca\x57\x2b\xe4\xbe\x3e\xfe" + "\x67\xee\xfc\x8c\x10\xe4\xf1\xd1\x7d\x55\x09\xdf\xaf\x9e\x77\xee" + "\xb8\xa8\xeb\x5b\xa0\x4d\x97\x27\x3b\x9e\xf5\x92\x0e\x5a\xb4\xb3" + "\xd5\x2b\xf4\x1b\x35\xfb\x23\x8a\x5a\x78\x69\x36\xe9\xc5\x83\x47" + "\x8b\xd8\x1f\x25\xfd\x8a\x74\x17\x7e\x15\xb0\xff\x6c\x92\x74\x1b" + "\xad\x2d\xf2\x1b\x29\x74\x47\x40\x1f\x51\x9b\x68\x6d\xa1\xae\x56" + "\x3a\x6b\x96\x6b\xec\x2b\xf7\xdf\xb7\xc6\xbe\x72\x53\x5f\x50\xd6" + "\x0e\x6e\xc8\xe7\x53\x77\xb2\x34\xa1\x0b\xe0\xed\xa2\x7b\xc6\xa1" + "\xc0\xff\x09\x12\x7f\x74\xa6\x0b\x7d\x91\x8d\x1d\xd5\x74\x97\xf7" + "\x40\x0f\x8b\x50\xed\xf1\x89\x44\x2f\xd7\xe7\x0a\x1d\x8a\x70\xe4" + "\xab\x21\x1d\x0b\xd2\x19\x1c\x2d\xfc\x92\x7e\xc4\x0e\x5c\x61\xa1" + "\xad\xec\xb2\x8d\xce\x74\x02\xb0\xbe\x7c\x92\xce\xf0\xf8\xae\xb1" + "\x2e\x63\xae\xa1\x98\xca\x50\xaf\x5e\x98\xa5\xe7\x03\x8d\x38\x9c" + "\xf2\xb5\xb0\xcb\xbf\x12\xf9\x28\xad\xb0\x53\x63\x5a\x82\xbd\x53" + "\xdc\xf7\xf3\x22\x5c\xa5\x9a\x92\x39\xf0\xba\x6f\xa3\xb7\x06\xdf" + "\x16\xab\xf6\xb2\x1a\xc4\xa5\x88\xb3\x84\x5e\x33\x9d\x31\x62\xce" + "\xad\xb4\x3b\x5d\x5f\x38\x44\x7b\xe8\xee\x71\x16\xf6\x40\xc1\x5f" + "\x5c\xf6\x55\x7d\xc9\x42\x6d\xcf\xd2\x78\x76\x4a\x1a\xfb\x22\x3b" + "\x24\xdb\xd7\x59\xde\xb9\xcb\x62\xe9\xc4\x7c\xed\x32\x84\xb3\xe3" + "\x66\xd2\x99\x7f\xcd\x76\xdc\xdc\x83\xf1\xe9\x4c\x71\x85\x8e\xd5" + "\x74\x68\x3b\xfd\x6b\x93\xe6\x68\x88\xd9\x94\x8f\xef\xd9\xba\x8e" + "\x12\xcd\xcb\x9d\xc2\x7f\xc0\xe5\x64\x82\x9b\x8b\xb9\xc3\xeb\x33" + "\x03\xf6\xbb\x3b\xe5\x3d\x3d\x13\xf2\xf8\xed\xdf\xfb\xae\xaa\x75" + "\x68\x07\xd9\x39\xca\xf6\x6d\x54\x9b\xe9\x0c\xfc\xd1\x2b\x2a\xa7" + "\x3b\x0c\x74\x1f\x85\xf8\x97\x45\xd9\xbc\x93\xf8\x31\xba\xfb\x45" + "\xe7\xdf\x74\xff\x3e\xb0\x4e\x3a\x3d\xfa\x3d\x7c\x7d\x6d\xd0\xfd" + "\xae\xd2\x55\x62\x9d\x92\x4e\x6b\x84\x38\x03\x08\xf9\xf9\x97\x8f" + "\x76\xa1\xcc\x8b\xe2\xec\xaa\xb3\x4a\x2b\x87\xec\xb1\x75\x17\x76" + "\xcd\xd6\xcb\x50\x49\x1f\x78\x9d\xd0\xc7\x73\xc9\xfc\x52\xdf\xe7" + "\xd1\x2e\x55\xdc\xcb\xa1\xfc\x52\x0f\xa7\xcb\x6f\xff\x4d\xde\x95" + "\xe9\x2a\xd0\x75\xc6\xf0\xbe\xd3\x7f\xd7\x0f\x30\xed\xb4\x97\x1e" + "\xed\x02\x7e\xe8\xb2\x97\x78\xf0\xed\x10\xd6\xf5\xd7\x6c\x7d\xf4" + "\x91\x49\x90\x7f\xc3\x0d\xcc\xa0\x46\xc5\x2f\x21\xfb\x2b\x74\x87" + "\x55\xea\xb1\x5f\x19\xa1\xd9\x62\x09\xb9\xc8\xba\x4e\x06\xce\xc2" + "\x7d\x9a\x1c\xf7\x4a\xa2\xe4\x23\xae\x24\x0a\x39\xee\xae\xd2\xea" + "\x7f\xcf\xf1\x18\x6a\x72\x5c\x06\xa9\x5f\x77\x25\x0e\x94\x4c\x90" + "\x0f\x8c\xae\x56\x2a\x6b\x60\xba\x6f\xda\x72\x59\xe6\x55\xe1\x2b" + "\x2e\xc0\x97\x5f\x15\x34\x1d\x9d\x5b\xab\x44\xc3\x45\xad\xae\x21" + "\x3d\x25\xa7\xed\x32\xc9\x73\xc3\xa4\x8c\x40\xa6\xd1\xf4\x36\x6f" + "\x6c\xef\x1b\x8e\xa2\xb0\x84\xd9\x95\x23\xfa\xd9\x50\xa9\x41\x25" + "\x1f\x97\x3c\xbf\x1a\xf8\xd2\xd6\x25\x6c\x3b\x38\x41\x13\xa2\x0e" + "\x6e\x5b\x47\x77\x23\xaf\x7c\x49\x7e\xb3\xe4\xda\xbc\x2a\xce\x6f" + "\xd4\xc2\x39\x3c\x9f\xf8\x22\x37\xf9\xd3\xba\xcc\x90\x2e\x12\x65" + "\x8f\x39\x91\xdb\x41\x7a\x5e\x71\xe4\x2b\xb9\x55\xab\xdb\x1d\x39" + "\x6d\xf9\xad\x11\x2c\xad\xbb\xf0\xaa\xd5\xc5\xde\xaf\x1e\x3a\xde" + "\xb8\x6a\xbd\x1e\x8d\x2c\x69\xb6\x24\x36\x18\x9f\x4d\x72\x94\x29" + "\xa8\x7f\x21\xa7\xf6\x77\x8f\xf1\x1a\x3c\xa0\xcb\x86\xf3\xf8\x82" + "\x6c\xe6\x2d\x1c\xce\x7d\x39\x18\xaf\x4e\x33\xf8\xb0\x3a\xd6\x20" + "\x75\x5f\xe8\xfc\xde\x98\xd7\xc5\x2f\x3b\xbd\x47\x48\x8e\xef\x96" + "\x74\x4a\xf7\x0d\x4e\xef\x5b\x8c\xf4\xb5\x09\xdf\xb4\xb0\xab\xd7" + "\xa8\x5d\x53\x6c\x05\xec\xce\x8b\xf4\xfd\xea\x51\x49\xbf\x75\x47" + "\xcb\xe7\xd5\x56\xb2\x3d\x1d\xdc\xa6\x87\x36\xac\x59\x46\x06\xcc" + "\xef\x5c\xb0\x62\xe3\x8a\x4c\xcb\x63\x64\xde\xbc\xbf\x1e\x68\xc0" + "\x97\x66\xb7\x8b\xf6\x57\xa2\xa1\xc9\xa7\xe6\xf5\xfc\x69\xea\xbe" + "\x34\xb1\xe6\xe2\x48\xee\xfc\x8f\xf4\xa7\xa9\xd3\xc8\xe4\x4b\x33" + "\x70\x06\xe3\xa9\xf6\xaf\x01\xf5\x9d\x6e\x0a\x8b\x3d\xbd\xb0\xdb" + "\x42\xeb\x48\xee\x2f\x1e\x73\xb0\x1d\x2c\x61\xcf\xa5\x7c\xa5\x1d" + "\xf1\x89\xfa\x1d\x56\xcc\xc5\x08\x84\x93\x02\x77\x66\x3c\x0b\x00" + "\x37\x69\xe7\xd4\x24\xd2\x2e\xd1\x75\x15\x84\x1d\x52\x4d\xb7\x42" + "\x2d\x9a\x75\x46\xca\x07\x3d\xe9\x55\xea\xf0\x70\x79\x36\xe5\x29" + "\xd6\xef\x64\xc9\xb5\xf9\x8e\xb6\x36\x3d\xd5\xd7\xd3\x27\x09\xac" + "\x0d\x4f\x73\x60\x5d\x7f\xa6\xe7\x6d\xfe\x26\x5d\x14\x8d\x4f\x1b" + "\xd3\xce\x7a\xbe\x22\x99\xa1\xbc\x83\xdd\x23\xee\xd0\x49\xfb\x1a" + "\x3d\xbf\xd1\xde\x51\x47\xcf\x7e\xed\x7d\x02\xde\x9f\xd7\xde\x41" + "\x2f\xf6\xac\xd6\xde\xb1\x66\x7b\x9e\xd0\xde\xa3\xf1\x7e\xbf\xf6" + "\x8e\xbd\xa3\x67\xb2\xf6\x1e\x83\xf7\x1b\xb4\xf7\x71\xed\xec\xda" + "\x15\xed\x1d\x6b\xf0\xda\x59\xed\x5c\x3f\xfc\x3c\xbb\x76\x6a\xe8" + "\x7c\xe3\xb5\xdd\x92\x0e\xbe\x76\x06\xf4\x51\x86\xdc\x7b\xfc\x71" + "\x6d\x98\xdb\xb3\x74\xf8\x22\x7e\x27\xd5\xd3\x5d\xd8\x03\x7a\xb6" + "\xd5\x12\x14\xaf\xd9\xb6\xee\x31\x03\xcf\x1d\x09\x8a\xb7\x69\xf1" + "\x89\xe0\x4f\xe7\x06\xc5\x2f\xd7\xe2\xe7\x03\x7f\xce\x0e\x8a\xd7" + "\xce\xb1\x7b\xd2\x5c\xec\xd3\xc5\x41\xf1\x0b\xb4\xf8\x6c\x5d\x8f" + "\x46\x8b\x4f\xd2\xe2\xed\x2e\xf6\x71\x68\x50\xfc\x0c\x2d\x1e\xf8" + "\xdf\x73\x38\x28\x5e\xe0\x15\x69\xef\xdf\xc8\x8f\xe7\xd2\xda\xea" + "\x01\xfd\xff\x97\xae\xa0\x34\xb1\x5a\xde\x56\xc4\xc7\x06\xc5\x9b" + "\xb4\x78\xaf\x4b\xb9\x23\xb8\xcc\x41\xf9\x79\xa5\x82\x0d\x78\xa6" + "\x43\x32\x75\xf2\x81\x21\x74\x93\x05\x9d\xed\xbd\x97\xee\x78\x19" + "\xf7\xf3\x16\x4b\x1e\xe7\x2d\xcc\x6b\xd1\xf4\x67\x2d\xa4\xcb\x28" + "\xef\xcb\x79\xc3\x35\x5b\x09\x6e\x71\x87\x2e\x87\xe2\x7a\x85\x5f" + "\xa7\xa9\xd9\x05\xd2\x16\xbd\xee\xd7\x88\x64\x4c\xda\xf9\x3b\xd2" + "\xfc\x86\x64\xee\x54\x0e\xc9\xa1\x9d\x59\x3d\xd2\x4f\x01\x78\x51" + "\x8a\x23\x59\x0b\xc1\x23\x58\xa6\x24\xf1\xbe\xf7\x5e\xb5\x87\xee" + "\xa9\x4a\x79\x14\xad\x45\x4a\x4f\x3a\x63\xc1\x69\x5d\xcc\x3b\x8b" + "\x9e\x21\xe6\xc8\x8f\xbb\x0b\xbd\xe6\xc0\xfd\xa0\x5e\x9b\x16\xff" + "\x47\xc4\x27\x06\xc5\x2f\x19\x1c\xb7\x03\xdf\x99\xcc\xd6\xde\xab" + "\xbc\xcb\x7b\x95\x7b\x4a\x3f\x45\xbb\x9f\x15\x7a\x7a\x37\xfb\xec" + "\xe6\x59\x74\x7f\x86\xfc\x10\x7b\x37\x72\x37\xe9\x25\x22\x7e\xd4" + "\xa3\x5d\x6e\xd0\x18\xdd\xbc\xe4\x19\xd2\x41\xbd\xc2\xe8\x7c\x34" + "\xbf\x83\x7c\x5a\x1a\x39\xdd\xcb\xde\x7a\x81\x45\xd0\xfd\x9a\xaa" + "\x67\xe9\xfb\x59\xb6\x30\xc3\xcd\xea\x33\x7c\xac\x0a\x65\xef\x7f" + "\x46\xa7\x2f\xbc\x8d\x81\xbb\xbf\x63\xe9\x3c\xf9\xe6\x7c\xe1\x77" + "\xdd\x27\xf5\x6a\xb6\xd1\xb9\xfe\x6b\x15\xfc\xf7\x44\x1b\x97\x38" + "\x8c\xdb\x98\x05\x7b\x7b\x04\xde\x6b\xe4\x0f\xdf\x10\x3f\x58\x9f" + "\xe4\x5a\xf6\xcd\x97\xb8\xc6\x7c\x48\xe2\x0b\xdf\x7c\xfe\x6f\xc4" + "\x17\xfa\xe8\x3c\xb8\x02\x74\x78\xc5\x40\xf9\xb7\xee\x67\x86\xde" + "\x5d\xa0\x4d\x2e\x1e\x35\x48\xfc\xa4\xce\x52\x0d\xe1\xdb\x48\xde" + "\x2d\x7c\x2e\xef\x8a\xcf\x3c\xbc\xc6\x63\xa8\xcf\x69\x65\x5b\xc6" + "\x31\xf3\x12\x8f\x01\x69\x7c\xbf\x1d\x9d\x45\xf6\xf2\x4b\xab\x41" + "\xcf\x1a\xfe\x17\xbe\xbf\xbd\xe6\xa8\xc1\x2b\xe8\x15\x75\x96\x90" + "\x91\xda\xe3\x49\xef\xd8\xe8\x6c\xf2\x11\x2d\x1e\x01\x5a\x3c\x11" + "\xf8\x3f\xdc\xb7\x29\x23\xca\xbb\x3e\x63\xd4\xfe\x75\x2c\xc2\xb7" + "\xde\x1a\xfd\xc2\x55\x36\x4b\xdf\x7f\xf6\x6f\xc4\x9e\xd2\x6d\x1e" + "\x59\x86\x3d\x85\x64\x2f\xa3\x15\x93\x38\x0b\xa6\x77\xd5\xf0\x79" + "\x5a\xd5\xc6\xeb\xfb\x8f\xf7\x6d\xb2\x0a\xfb\x11\xd4\x96\x81\xfa" + "\xba\xf3\x25\x16\xea\xd3\xee\x99\xe6\x9d\x63\x31\xa0\x9f\x0d\xa3" + "\xaf\x70\x47\x7b\x26\x33\x90\xcf\xed\xbc\x15\x42\xbe\x39\xac\x3e" + "\xc3\xcb\x9c\xd9\x9f\xb0\xbc\x75\x34\x46\x6a\x09\xd1\x69\xa4\x53" + "\x8c\xf4\xa6\x76\xa6\xee\x37\x7a\xb0\x67\x78\x40\x93\xaf\x22\xbe" + "\x58\xfd\xb5\xb4\x57\xa1\x76\xd1\xbd\x50\xc7\xba\x07\x28\xae\x3e" + "\xff\x9c\xd0\xdd\x89\x93\x6b\x4b\x3d\x44\xe1\x7c\xba\xf7\x1a\x95" + "\x98\xfd\x46\x8f\x67\x98\x94\x4d\xa8\xbf\xd2\xf6\x07\xbb\xe4\xed" + "\xd4\x43\x83\xcd\x5d\xd5\x1e\x3b\x9f\x93\xbf\xd1\x4a\xa2\x5f\xb9" + "\x4b\x9c\xb3\x93\x0d\x80\xec\x39\x0e\x7e\xd5\xae\xd9\x26\xe2\xab" + "\xd5\xf2\xd8\xf9\xd2\x3e\x29\xd7\x75\xe4\xb0\x47\xc6\xa6\xc8\x33" + "\x86\xd8\x0c\x29\x73\x8f\xcd\xde\x3e\x9e\xee\x07\xf0\xcc\xce\xc8" + "\x58\xec\x71\x3c\xa9\x33\xea\xee\x01\x69\x1d\xb9\x1f\x8d\xcb\xb6" + "\xdc\xcc\xa2\xe9\xac\x27\xd5\x27\xed\xfc\x8a\x35\xac\x30\x1b\x2f" + "\x17\xdf\x26\xb6\xd8\x58\x88\xb4\xa5\xcd\xdf\x9a\x5a\xc9\xc8\x4f" + "\xc5\x0d\xdc\x14\x6b\x15\xba\x87\xf6\xd8\x59\xce\x0e\xf2\x81\xe6" + "\x63\xe2\xcc\x48\x61\xb9\x3c\x32\xd6\x2a\xd2\x2b\xec\x86\x86\x0e" + "\xf4\xc1\x34\xc1\xe3\xf4\x5c\x60\x5a\xb9\x68\xe3\x04\x0f\xb7\xc7" + "\x86\x8b\xfb\xe3\x0a\x7b\x5a\xc7\xab\x62\x8e\x2a\xec\x47\x12\x6e" + "\xe3\xb2\x05\xdc\x50\x9e\xb6\x5f\x4d\xa4\x77\xec\xdd\x89\x42\x87" + "\xa4\x88\xcd\xd7\x69\x64\x97\x96\x86\xf2\xe0\x5d\xdc\x75\xc0\xf7" + "\x0c\xf4\x9d\x69\xdf\x23\x28\x0e\xfd\xc3\x9e\xc5\x0f\x52\xbf\x06" + "\xc3\xad\x02\x16\xb9\x2c\x04\xfd\x13\xf6\xd9\x89\x4e\x71\x76\xcd" + "\x71\x38\x69\x0c\x14\x03\xf9\xee\xe9\xa0\x7a\xc8\x7e\x10\xe1\x4d" + "\x94\x19\x4a\xe5\x05\xb5\xff\x4b\xbd\x2d\x54\x1f\x7d\xe3\xf6\x09" + "\xc2\x9e\x29\x60\x15\x4e\x69\x68\x5c\xcf\xdb\x48\xf6\x76\x05\x30" + "\xeb\xa2\x72\xa3\x09\x26\x12\x66\x8a\x5b\xe3\xe9\xb5\x71\x50\xce" + "\xf5\x85\x87\x0c\xab\x26\xe0\x86\x75\x6c\x6c\xbb\x62\x88\xd6\xe0" + "\x27\xfd\xf7\x28\x8a\xb0\xd3\x20\xbf\x29\x9b\x83\xf2\xde\xe4\x4f" + "\x8b\x76\x13\x6d\x44\xba\x01\x74\x56\x24\xe6\xab\xa2\x1c\x0c\xca" + "\x77\x30\xf5\x2b\xa2\x91\xc7\x7a\xb6\xef\x15\xfe\x50\x13\xbb\x8b" + "\x94\xa3\x01\x78\xcb\x72\x06\xa8\xe3\x66\xbd\x0e\x97\xa2\x64\xeb" + "\xed\xc4\xbb\xdc\x83\x8b\x14\x6f\x60\x4c\x94\x58\x3d\x1f\xc9\x74" + "\x30\x46\xb5\xe4\xa3\x78\x10\x9f\x2b\x8a\x13\xa9\x1b\xbc\x73\x1c" + "\x62\x3e\x2a\x86\x2c\xd2\x15\xc7\x1c\x32\xcb\x39\x64\x48\x11\x7b" + "\x21\xe2\xa9\x4c\x3a\xef\x13\xb6\x6c\x8b\x0c\x99\x28\xb7\x58\x6b" + "\x73\x81\x6c\x83\x01\xfc\x1f\xff\x9a\xdd\xda\x07\xd2\x97\x5b\x92" + "\xa7\x89\x3b\xb4\x77\x6e\xb0\xd1\xf5\xd8\xe5\x81\x40\x5f\x9a\xdb" + "\xe4\xb7\x59\x56\x64\xa8\xf3\xdb\x2c\xb3\x4f\x2b\x96\xf0\x0f\x31" + "\xf3\xab\x7c\x37\xdd\xdf\xe0\x1b\x79\x45\x29\xd9\x46\xbc\xc2\xc6" + "\x92\xef\xf5\x3c\x1b\xff\xa2\xc1\x06\x9e\xdd\x14\xbf\x13\xf8\xc3" + "\x9e\x77\x85\x0d\x27\xdd\x20\xc2\x3f\xa4\x7b\xcc\x23\x11\x5f\x1e" + "\x6f\xf7\xdf\xab\x53\x86\x9b\xe8\x2e\x28\xcf\x4f\x01\x2d\x1d\x7f" + "\x90\xe6\x03\xe9\x89\x9f\x57\xc2\xc8\xae\xea\x41\x7c\xcb\x2a\x11" + "\xb2\x84\xf8\x36\x9f\x69\x5a\x5a\xfe\x05\x16\x26\xfc\x67\x66\x7b" + "\x48\xa6\x66\x68\x51\x42\x36\xa3\xcc\x36\xc4\x8f\x16\xf1\x1e\x0f" + "\xd9\x4e\x68\xc3\xb7\xd1\xf8\xf6\x1b\x3c\x55\x94\x91\x5d\x8a\x76" + "\xe7\x5d\x60\x37\xa3\x2d\x6d\xa8\x87\xee\x99\x9e\xcf\x5f\xcd\x62" + "\x1a\x6c\x6d\xc4\xdf\xa1\x3c\x17\xd3\xec\x8b\xb4\xb5\x28\xa1\x23" + "\xd0\xaf\x6c\x92\x89\xe0\x99\x5b\x82\x67\x9e\x8f\x8d\xce\xdb\x8a" + "\x7d\x6f\x2b\xea\xa7\x7b\xaa\x28\x87\x6c\x8a\xc8\xb6\xa0\x6f\x24" + "\x57\x43\xb9\x5b\x3b\xf8\x79\x94\xdd\x56\xdf\x81\xf2\xb2\x9b\xfc" + "\x65\x6a\x34\x35\xd6\x77\xd8\x97\x7c\xd7\xdd\x2e\xb4\xa9\x82\xf4" + "\xa7\x11\x67\x42\x5c\xab\x9f\x1e\x56\xc2\xce\x69\xef\x23\xfc\x69" + "\xf3\x53\x58\xde\x35\x66\x16\x3a\x00\x9b\x42\x58\x8b\x12\x96\x45" + "\x76\xad\x02\x65\x86\x7e\x45\xe5\xed\x44\x79\xf9\x2b\xd8\x08\xe0" + "\xea\x70\xb4\x91\xfc\x90\x7f\x2e\xe0\x24\xd6\x58\xa8\x1b\x7d\xb1" + "\x53\x9f\x54\x8c\x5d\x09\xd6\x03\xfa\xa3\xa0\x3f\x23\xb6\xfa\xfc" + "\x77\x6f\xa9\x4f\x91\xc4\xcf\x51\xbf\xe4\x38\x26\x00\x7f\x26\x44" + "\x6c\xcd\xe0\x9f\xa3\x6f\x6d\xf5\x19\x4d\x0c\x7b\x8f\xb1\xc1\xd6" + "\x48\xf7\x18\x3e\x97\x70\x6b\x23\x3d\x50\xe0\x88\x84\x08\xbf\x1d" + "\x68\x25\x6c\x35\xda\xde\x86\x76\xed\xd4\xfa\x49\x71\x19\x7e\x9a" + "\x5e\x09\x5b\xa9\xbd\x8f\xf4\xa7\xfd\x5a\x3f\x87\x35\x07\xf5\x13" + "\xf9\x87\x47\x52\x79\x5a\x3f\x47\xa2\x9f\x23\xbe\xde\x4f\xcc\xa7" + "\x8d\x7c\x87\xd6\xcf\x62\xad\x9f\x06\xf4\x73\x24\xfa\x39\x3e\xa8" + "\x9f\x51\xfd\xfa\x09\x5a\x24\xc1\x84\x7e\xb6\x04\xf5\xd3\x34\x40" + "\x3f\xc3\x5d\x54\x47\x79\x82\xf0\xdd\xc0\xc3\x0c\x3b\xc5\x7d\xf6" + "\xa2\x61\xfe\xfb\x9f\x2a\xdd\xa3\xbc\x2a\x6c\x0a\x1d\x21\xf9\x0d" + "\xc9\x8d\x88\xd7\xa3\x3b\x9b\xa9\x9b\x8b\x0b\x84\xec\x26\x46\xca" + "\xa6\x05\x7d\x55\x14\x96\xe8\xbf\x3f\xb1\x57\xf8\x45\xea\xa2\x78" + "\x61\x03\x60\x1d\x13\xb2\xc7\x45\x9b\x37\xe5\x53\x7e\xca\x8b\xf4" + "\x69\xfe\x7b\x5e\xca\xb0\xb9\x52\x1e\x7a\x77\x1b\xbd\x93\x6d\x2b" + "\xd1\xae\x22\x43\xa5\x38\x2b\x28\x0a\xdb\xe9\x97\x69\x6e\xe4\x27" + "\x08\x2e\xe2\x7e\xaa\xb8\xdf\xc9\x8a\x53\xbd\xc5\xfa\x3d\xf3\x0e" + "\xa4\x3d\x1a\x74\xcf\xbc\x43\xb4\xa1\x47\xd8\x72\xd8\xb4\xc8\xbb" + "\x49\xdc\x37\x47\x9a\xe6\x40\xdd\xa1\x4b\xb4\xba\x5d\xf4\xee\x96" + "\xb6\xd6\x48\xc6\x66\x11\x3a\x2f\x45\xc3\xc3\x75\x3d\x13\x97\x12" + "\x32\x97\xd6\xf2\x80\x3e\x84\x8a\x86\x27\xf6\xb1\xed\xa4\x84\x0b" + "\x1f\x26\x88\x9f\xef\xbf\x3b\x5e\x34\x7c\xf1\x37\xdd\x1d\xcf\x77" + "\x63\x9c\xb0\xde\x80\xb3\x15\xcc\x15\xf0\xb8\xd3\xd2\x84\x1f\x1e" + "\x65\xb8\xf0\x2f\xd7\xa2\x0c\xa7\xfb\x9f\x46\x61\xf7\x41\x19\xfe" + "\x6b\x0d\x37\x57\x2c\xf2\x79\x8d\x2e\xd4\x29\x6c\x45\xf9\xc3\xc3" + "\x0f\x91\xed\x0b\xa4\xfb\x5c\xd8\xd0\x47\x79\x7d\xd3\x8b\xef\x05" + "\xfd\xc2\x49\xfd\xc2\x96\x2e\xe0\xac\xc1\xf4\x69\x4a\xc6\x0b\x19" + "\x6f\xd2\xe8\x6d\xcc\x96\xff\x25\x0b\xc1\x5c\x3c\x47\x6d\x6b\x68" + "\x13\x77\xed\x8c\xbc\x30\x91\x39\xdb\xbc\x92\x6e\x07\xbd\xd4\x12" + "\x87\x34\x5f\xb2\x18\xba\xeb\x41\x7e\x8a\x90\xbe\x5d\xf8\x26\x52" + "\x46\xfc\x62\xc9\x86\x91\x4c\xfd\x59\xca\x28\x6e\xd8\x62\xa1\xf3" + "\xfc\xd7\x7b\x5c\xe4\xdf\x47\xc9\x7b\x91\xc5\x12\x9e\xc2\x1c\x6e" + "\xe5\x86\x5c\x0b\xf2\x74\xfc\x7b\x4f\xdb\x30\xa7\xf7\x13\x66\x03" + "\xfe\x6c\x57\x46\xe4\x86\xe6\xb2\xd0\xb2\xf3\xcc\x84\x79\xe6\x3d" + "\x0e\x76\x45\xb7\xdd\x50\x19\x25\x6d\x02\x54\x62\x4e\xae\x37\x73" + "\x4f\x77\x51\x78\x93\x8b\xfd\xb5\x51\x97\x5f\xec\x94\xb6\xdb\x42" + "\x51\xff\x3c\x61\x67\x42\xd2\x07\x80\xed\x88\x31\xf2\xde\x68\xf4" + "\xcf\xba\x8b\x46\x44\xf8\x79\x1b\x65\x44\x85\x84\xe1\xb4\x1d\x72" + "\x1f\x19\x51\x71\x1c\x9c\xee\x0e\xa9\x97\x14\x8d\xb4\xb3\xfc\x7a" + "\x49\x24\x13\xc4\x77\x8c\xe1\x0e\xc9\xf7\x4c\xdb\x91\xea\x0b\xd7" + "\xd6\x38\xc5\x8f\xf5\x50\x5e\xe4\x33\x0a\x1f\xaa\x45\x23\xb2\x02" + "\x73\x6d\xc4\x6c\xda\x4f\xd1\xa7\x08\x8c\x6b\x0d\xf5\x8b\x60\xd2" + "\x45\x76\xda\x94\xf0\x23\xc7\x0f\x0e\xe2\x63\xcb\x64\x3e\xe4\x15" + "\xf2\xa5\xd2\x0a\xcc\xa7\x0b\x18\x83\x1b\xc9\x56\x95\x13\xf5\xd4" + "\x57\xf5\xb0\x7a\x73\x27\x6b\xc0\x3b\xdd\x3f\x70\xac\xfa\x2b\x38" + "\xfc\x81\xf7\x72\x15\x3c\x1a\xf8\x98\x59\x54\x16\xe1\x1a\xd2\xd9" + "\x24\x9b\x82\x0d\xa0\x7a\x9c\xc0\xf4\x54\x46\xbd\xda\xc6\xea\xb3" + "\x89\x87\x7d\xad\xa2\xa1\xea\x13\xd6\x60\xfe\x83\xa8\x87\xe8\x6d" + "\xc7\xba\xce\xeb\x95\x4d\x77\x59\x53\xb4\xb2\x3b\x50\x76\xf4\xe0" + "\x65\x97\x38\x86\x58\xf6\x10\xda\x5d\x52\x33\x94\xb2\xf3\x2b\xb8" + "\x0f\x78\xf8\x06\xec\x91\x89\x64\x6f\x95\xee\x99\xfa\xae\x92\x8d" + "\x99\x89\x82\x57\x3f\xaf\x8c\x7a\x8e\xf0\x8d\xd0\xd1\x28\x8f\x4f" + "\x10\x77\x50\x49\xce\xae\xdd\x3d\x75\x7a\xcf\x31\x92\xbb\x77\x17" + "\x8d\x5a\x12\xe0\x45\xfd\xe7\xd3\x26\x97\x32\xaa\x40\xea\x3b\xc7" + "\x27\xc8\xb9\x35\xea\x6e\x2a\x6b\x60\x9e\x33\x21\x43\xe8\xcd\x2b" + "\xa3\x7e\xab\xcb\xb7\x3a\x23\x13\x32\xb4\xb2\x2c\xfd\xe5\xa6\x9a" + "\x61\x20\xcb\x8a\xec\x2c\x8b\xb4\x5f\xad\x5d\xb8\x1e\xc9\x1e\x5b" + "\xb1\x6c\xc5\xca\x8d\x2b\x96\x5b\x16\x6f\x58\xb7\xe6\xce\xb5\xcf" + "\x3e\x6b\x59\xb8\x62\xfd\xfa\xf4\x9f\xad\x18\xc9\x16\xaf\x4b\x5f" + "\xb3\x7e\x25\xc9\x36\x2d\x96\xb9\x77\xa5\x66\xac\xcd\xba\xf3\x7b" + "\x73\x13\xfb\xc9\x36\xe9\xfe\x75\x33\xf1\x38\xd8\x9f\x62\x40\x63" + "\x44\x92\x9d\x21\xe3\x66\xee\xd8\x02\xfe\x1a\x73\xb0\x9d\xf6\x42" + "\xda\x7f\x88\xf7\x02\x8e\x3e\x83\x3d\xa3\x6e\xdf\x5e\xde\x78\x5e" + "\xb9\xf9\x39\xd0\xed\x4d\x64\x6f\x19\x7b\x46\x33\xef\xc9\x77\x8b" + "\xb3\x67\xe5\xe6\x85\x64\x1f\xf9\x97\x88\x73\x47\x4e\xdb\x51\xf6" + "\x29\x0b\x95\x34\x46\x44\x1d\x37\x0c\xe7\x3b\x63\xf8\x09\xfe\x57" + "\x33\xd3\xec\xef\x1b\x9c\x2e\x0f\xe9\xf1\x84\x2f\xf2\xe6\x73\xc2" + "\xa9\x72\x7d\x45\xd4\x4b\xb8\xc4\xce\x17\xf7\x09\x94\x9b\xef\x24" + "\x1e\x71\x3b\xf9\xf4\x2c\x8a\x00\xfe\x57\xe7\x06\x70\x75\x8c\x4e" + "\x9b\x37\x01\xee\x9b\x5a\x10\x16\xb6\x53\xc2\x6e\x08\xef\xa3\xa3" + "\xa5\x8c\x6e\x63\xca\xf8\x64\xf9\x43\x1e\x65\xfc\x12\xf9\xa3\xf7" + "\xe0\xdf\xcd\x26\xf9\xeb\x1f\xff\x5f\xfd\xe9\xf5\xff\xdd\x65\xd4" + "\x7d\xc3\xef\x5b\xd4\x2f\xfa\xfd\x4f\xec\xff\x7f\xa9\x8c\x33\xd7" + "\xfb\xd1\x7c\xc3\xdc\x6a\xfe\xe5\xa7\x2c\x1c\xf3\x73\x77\xc9\x33" + "\x98\xd3\x67\x99\x39\xd7\xcb\x5b\xf3\x9f\x66\xb1\x79\x5f\x82\x06" + "\x03\xad\x95\x95\xcd\x5b\xf3\xae\xf2\xcf\x31\x6f\x5e\xc1\xfc\x3d" + "\x5a\xda\xc2\x22\x4a\x5a\x40\x67\x65\x49\xbf\x46\x74\xde\x44\x77" + "\xad\x9c\x08\xd7\x6d\xf4\xb0\xd3\xee\xaf\x48\xaf\xd1\xd1\x90\xc6" + "\x84\x15\x05\x9a\xbf\x11\x69\x2c\xba\x32\x86\x1f\xe3\x85\x6f\x34" + "\x73\xc3\x1b\x75\x88\x3b\xf3\xa6\x9a\x34\xec\xcd\x9c\xda\x61\x96" + "\x67\x68\x9f\x37\x96\x68\x73\x73\x8c\xb8\x4b\x88\x27\xcd\x41\xb2" + "\xdb\x2d\xce\x2d\x94\x98\x72\xb9\xa7\xc7\xa4\x6b\xf2\x3c\x7a\x17" + "\xfe\x7d\xd0\x8f\xa3\xbc\x70\x8b\x85\xca\x7c\x43\x3d\x3a\x8c\xf6" + "\xcc\x37\x73\x92\x86\xe5\xa6\x33\x43\x83\xab\x9d\x1d\x07\x2e\xa4" + "\xf3\x71\xac\xbb\xc3\x58\x67\x35\xfb\x63\xb8\x1d\xed\xdb\x09\x7a" + "\xae\x18\x6d\x3a\xd4\x5d\x64\xa4\xfd\xa7\x43\xa3\xe5\x1c\x58\x17" + "\x87\x4b\x90\x66\xd1\x06\x36\xb1\x04\xe9\x40\xdb\x15\x13\x8f\x22" + "\xdb\x77\xe3\x15\xc0\xe0\x08\xea\x6c\xb4\x2c\xa5\x70\xa4\xa0\x31" + "\xa8\x6e\xf4\xc3\xd2\xa2\x44\x0a\x9e\x9f\xea\xd0\xeb\xed\x2e\x32" + "\x2d\x71\x29\x23\x0f\x6a\x67\x8c\x76\x59\x8e\xa9\x58\xae\xd7\xf8" + "\x23\xe4\x9f\x56\xbb\xab\x75\xa4\x24\x07\xfb\x7a\x0f\x0b\x47\x1d" + "\xbb\x51\x07\xc9\xe5\xb8\x91\xee\xf9\x36\x7b\xc1\xd7\xa8\x52\x87" + "\x56\x89\x5c\xad\xe5\x15\x74\x88\xa0\x3d\x7c\xa0\xef\x85\x7c\x06" + "\xf4\x47\x06\xf0\x04\x68\x0e\x71\x47\x02\xf4\x06\xc5\xa3\x8e\xdd" + "\x64\xf7\x1c\x7c\xf3\x11\xec\xdd\x35\x44\x2b\x2c\xbd\xf2\x30\xa3" + "\x33\x0e\xa2\x17\xd6\x67\x73\x8f\xf0\x59\x56\x14\x19\xae\xd3\x0b" + "\x34\x3f\x88\x46\x28\x59\xca\x42\x7b\x31\xc6\x98\x23\xb5\xa0\x3f" + "\x40\xd3\x47\xce\xd5\xc6\xa6\x56\xd0\x05\x9a\x8f\x72\x89\xc3\x23" + "\x7f\x84\xfd\x3d\x02\x75\xd4\xba\x94\x9b\x05\x2c\x24\x0e\x8a\x4c" + "\xd3\xf7\x7a\x92\x39\xb8\x50\x06\x07\xae\x03\xdc\x8e\x24\xa4\x29" + "\xcc\xa5\x98\x0e\x61\x2c\x8e\x50\x5a\xe4\x0f\x45\x7a\x3b\xf6\x7d" + "\x9d\xbe\x6e\x06\x4f\x00\x3a\x20\xd2\x4c\xed\x40\x9e\x3a\xc0\x9a" + "\xc6\xa2\x56\xc3\x63\x67\x24\x0d\x73\xe3\xaf\x75\xd8\x63\xac\x77" + "\x04\xe0\x1f\xd9\x1c\x0c\x7f\xc0\x62\x87\x36\x96\x4f\x07\x8d\x1d" + "\xf8\xd2\x1b\x67\x90\x1c\x1a\xf5\x1d\x13\x32\x34\x25\x6a\x0c\xd9" + "\x72\xc3\x9c\x39\x06\x58\x1c\x43\xba\xa3\x84\x9b\xb7\x7f\x0a\x9c" + "\xfb\x0c\xd1\x50\x37\xde\x24\x69\xd4\xa8\x63\x34\x87\xcf\x2b\x51" + "\xc2\xc7\x68\xab\x12\x19\x4b\xe5\x21\x5c\x82\x27\x68\xd9\xa8\xe7" + "\xf3\x2b\xc9\x77\x76\x82\xb0\x57\x2d\xc7\x3a\x01\xed\x8a\xca\xd2" + "\xef\x21\xd1\x1c\xa0\xb1\x47\x1f\x63\xa5\x9c\x22\x2a\x8b\x64\x8d" + "\x22\x5f\x6f\x06\xb5\xb1\x99\xd6\xa7\xfe\x1d\xf1\x6d\x64\x03\x37" + "\x08\x36\xb1\xda\x98\x1c\x15\x7e\x68\x95\x1b\xc7\x68\x6d\xa3\x73" + "\xbf\x70\xb4\x41\x9c\x43\x74\xf6\x66\x84\x94\x51\x9e\xbc\x40\x1e" + "\x5a\x3f\x98\xcb\x46\xe4\xb9\x01\x4f\xae\xa7\x25\x5b\xfb\x68\xc7" + "\xee\x17\xc8\x16\x99\x12\x75\xb8\xb3\xd7\x6a\x20\xdf\x15\xa8\xd7" + "\x40\x73\x83\xe6\x85\x5e\x46\x99\x84\xd1\x61\x8c\x9f\x98\x5f\xc7" + "\xbd\x47\xd1\xbf\x1b\x17\xbb\x58\xaf\xb4\xb5\x82\x72\xb4\xf6\x39" + "\xc4\xf9\x60\xd8\xa8\x13\x55\xd2\x6e\x10\xa5\xcb\x0d\xe8\x46\xe9" + "\x74\x66\x14\xd9\x05\x08\x47\x59\x75\xda\x9c\x30\x22\xdd\x41\xff" + "\x1c\x22\x9b\x03\xca\x8d\x71\x44\x6b\x6a\xed\xa7\xb9\x77\x93\x84" + "\x5d\xe4\x09\x9a\x03\xa0\xe3\xb5\x71\x8e\x24\x7b\xe1\xd1\x72\x1e" + "\xde\xd8\xa6\x97\x21\xec\x16\x00\xce\x2a\xca\xd0\xe7\x4a\x30\x6e" + "\xe8\x2e\x8a\x8e\x06\x5e\xf0\xcf\x1b\x1d\x17\xc8\x32\xc7\x2c\xd4" + "\xe8\x90\x0a\x8c\x4d\xa3\xf0\x49\x40\x76\xad\xc4\xbc\x1c\x63\x39" + "\xde\xe5\x65\xbf\xa4\x79\xb9\x94\x70\x42\xf4\xd6\xce\xa8\xbb\xdd" + "\x81\xb9\x1d\x9d\xa9\xcf\xed\xa0\x71\x15\x73\x7b\x87\xc0\x47\xd1" + "\x3b\x5d\x6c\xfe\x62\x7d\xee\xd3\x3a\x57\xb1\xae\xcb\x36\x8a\xf3" + "\x01\x23\xc9\x03\xc5\xba\xf7\x74\x08\x1e\x83\xc6\xb3\x21\xbb\x55" + "\xd8\xbc\xdf\xae\x92\x8f\x8a\x73\x24\x1f\x69\xa7\xf5\xaf\xaf\x71" + "\x1a\x1b\xd4\x45\xfa\x44\x8d\x3b\x80\x03\x69\x0d\x76\xa1\x4d\xc2" + "\x17\x46\x14\x0b\x3d\xb1\x24\x89\xad\xc7\xd8\x1e\x4f\xa3\x71\x1b" + "\x13\xa1\xdf\x7b\x28\x93\x38\x20\x42\x9b\x2f\xa2\x8d\xfd\xe0\x6a" + "\x94\x70\x1d\x93\xd4\x77\x7d\x47\xb9\x68\x7d\x07\xc3\x95\x60\x4a" + "\xb0\x45\x5a\xf4\x7f\xe4\x7c\x1d\xae\x41\x30\x3d\xab\xcd\x47\x0d" + "\xb7\x8e\x19\x10\xb7\x92\xef\x00\xf2\xf5\xb0\x9d\xfa\x82\x3d\x85" + "\xea\x17\xbe\xd6\x34\xde\xe7\x84\x9b\xe6\xd4\x98\x46\x17\xcb\xad" + "\xd1\xf1\x18\xe6\x8a\x95\xe6\x13\x8d\x95\x8e\x3b\x48\x56\xa6\xb5" + "\xdd\xab\x8f\x07\xb5\x3b\x18\x27\x60\x8f\x11\xfa\x5e\x81\x3e\xc7" + "\xdc\x89\x7c\x51\x84\xdb\x02\xf4\x55\xcc\xec\xbe\x7d\x8f\x89\xa3" + "\xbe\xd3\x9c\xb0\x6d\x24\x79\x99\xdc\xcb\x5c\x8a\xb1\xa6\x2f\xbe" + "\x32\xbe\x22\xf4\x32\x34\x7a\x8c\xf0\xbd\x6d\xa9\x4c\x4f\xfb\x1b" + "\xd2\x0b\xd9\xbc\xb6\x1f\x92\xdd\x77\x8a\xab\xd4\x60\xd0\x8c\xf4" + "\x27\xe8\x2e\x35\xd9\xe6\x19\xd5\x2c\x79\x41\xe0\xe8\x63\xd8\x3b" + "\x1c\x48\xb7\xa4\x01\xd0\xf2\x86\x31\x56\xa9\xd1\x9b\x84\x27\xf8" + "\xa6\x94\x51\x9b\xda\xd8\x08\xdb\xf7\xf8\x5f\xcf\x2b\x63\x9f\xc2" + "\x3a\xf2\x90\xfd\x4b\x94\x6d\x39\xaf\x8c\xbf\x17\xf5\x46\x6b\x4f" + "\x33\x9e\x93\xf0\x1c\x87\xe7\x08\x3c\x27\x9c\x57\xc6\x7d\x85\xf4" + "\xaa\x96\x3e\x11\xe1\x3f\x23\xfe\x2e\xed\x89\x36\x8e\x4d\xc6\x33" + "\xf9\x97\x44\x57\x2e\x15\xf1\xaf\x53\x18\xcf\xfd\x5a\xbf\xeb\xe4" + "\xda\x1e\xbb\x15\xe5\x64\x53\x3a\xda\xd7\x10\x67\x43\x9a\x74\x2a" + "\x9b\x6c\x1b\xe0\x7d\x4c\x10\x7d\x8a\x72\xcc\xe4\xf3\x76\x06\x9e" + "\x74\xd7\x22\x0b\xf9\x4f\x51\xb9\x80\x41\x63\x00\x5f\x44\xc6\x2e" + "\xcf\x96\xe3\x89\xb1\xae\xa0\xf5\xae\xe3\x03\x9a\x4f\x7d\xd2\x2d" + "\x91\xe9\x24\xff\x4a\x72\x60\x39\x76\x5e\x39\x6f\x0f\x7b\x31\x76" + "\x28\xff\xfb\x94\x1f\xcf\x07\xb5\x67\x92\xf6\x9c\xa7\x3d\x7f\xa0" + "\x3d\xe7\x6a\xcf\xf9\x2e\x65\x6c\xad\x46\x9b\x00\x66\x63\x6b\x09" + "\x26\x58\xbb\xd2\x5e\xa0\x62\xf6\x12\x7f\x0d\xfc\x7f\x37\xf9\x08" + "\xed\x2e\x32\xdb\x74\xb9\x35\xc9\x7e\x7a\x8b\x46\x7d\xb6\x4f\xc8" + "\x7e\xcc\xc5\x41\xb8\x70\x71\x84\x92\xc4\x40\x3b\x85\x55\x1a\x40" + "\x37\xc8\x72\x5c\x06\xed\xbc\x9e\x7c\x0d\x91\xcf\x56\xb2\x3b\x28" + "\xf8\xa8\xc8\x57\x89\x9f\x6f\x16\x32\xfd\x72\xb2\x13\x34\x2d\x05" + "\xbf\xe5\xe0\x29\x32\x74\x7c\x4f\xfc\x92\xe4\xf3\x87\x37\xa2\xae" + "\xae\x00\x9f\x6f\x3e\x28\xcf\x36\xc7\x3e\xd7\x5d\x34\x2e\x88\xff" + "\x37\xa7\x51\x9b\x01\xeb\x26\xf4\x67\x46\x8b\x32\x6e\x06\x9e\xd3" + "\x5b\x65\x9f\x13\xf5\x3e\x6b\x63\x65\xd3\x61\xde\xaa\x8c\x6d\x04" + "\x3e\x5c\x47\xf3\xbb\xc5\x8f\x97\xc7\x0a\x3f\x7a\xda\xfc\xc1\x38" + "\x8f\x25\xdb\x4a\xf9\x41\xf8\x24\x3a\x80\xa7\xc7\xd9\xfb\x8e\x4b" + "\xa4\xdd\x2b\xe9\x85\x26\xac\x4b\x9a\x03\x29\xfd\xd6\x65\x1c\xad" + "\x4b\x2d\x6f\x5d\x5f\x1c\x1f\x13\x47\x38\x5e\x6b\x23\xe6\xed\xd8" + "\x59\x34\x36\x2e\x65\xdc\x61\x6d\x4f\x6a\xc2\x1e\x79\x37\xe2\x2d" + "\xb2\x9d\x32\x5e\xab\x0b\xf3\x6f\xac\x99\xe6\xbf\x1e\xaf\xcd\x6f" + "\x2a\xc7\x44\x63\xad\xc7\x6b\xe5\x63\x9e\x8e\x0d\xa7\xf5\xa3\xc7" + "\xcb\x39\x19\x9d\x46\xf8\x86\xf2\x7a\x85\x2e\x23\xf8\xef\xa5\x27" + "\xd0\xee\xf1\x3b\x41\x5f\x54\xd3\x7a\xde\x9e\xc3\x22\x36\x55\xb0" + "\x1b\xe4\xda\x1c\xff\xba\x9e\x57\xca\xf4\xc7\x57\xeb\x38\xaa\x4c" + "\xe0\xb3\x31\xd1\x7d\x71\xe5\x4d\xf7\xf3\x42\xa3\xd7\x6b\x9a\x96" + "\x5c\xef\x9d\x21\x70\x2e\xd6\x7d\x25\xf2\x35\xb9\xd8\x1b\xc5\xda" + "\x5e\x52\x27\xcf\x54\x26\xdc\x50\x5f\x2d\x71\x97\x56\xb6\x1f\xff" + "\x05\xd1\x21\x02\xd7\x53\x5d\x54\x16\xf6\x15\x53\x57\x7e\xca\x28" + "\x89\xbf\x27\x24\xb8\xd8\x2d\xd1\x3a\x6e\xa5\xfd\xc9\xa8\x30\x5b" + "\xe9\x52\xb9\x3f\xa9\x24\x03\xb3\x75\x09\x7b\x73\x0d\xb6\x0e\x46" + "\xfb\x26\xd9\xf3\x4e\xdd\x3c\x92\xec\x46\xa5\xa0\xad\x93\x40\x9f" + "\x1d\xd4\xce\x66\xc0\xe7\xc6\x7e\x48\xbc\xac\x06\x57\xac\xa7\xd8" + "\xdf\x68\xe3\xd2\x8c\xf6\x1c\x24\xdc\xbe\x7d\xa3\xf4\xd7\x45\xf2" + "\x20\xe1\x3f\x8e\x68\x56\x33\xf7\x08\xdf\x04\x45\x13\x8e\x05\xc9" + "\xb8\xaa\xe5\x3a\x19\xff\xb2\xf0\x39\x61\x9f\x96\x2c\xe5\x89\xb1" + "\x3f\x94\xf1\xb1\x09\x52\x0f\x41\xd8\x0d\xa5\xb0\x39\xc4\x1c\xf3" + "\x27\x29\x17\x1e\xd5\x23\xe9\x91\xd8\x88\x20\x9d\x1f\x01\x6b\x61" + "\xb7\xb8\x28\x36\x2e\xb0\x2e\x26\x78\x28\x0f\xf2\xb6\x23\x7e\xb6" + "\x1e\x2f\xf7\x9a\x48\xcd\x8e\xc2\xb4\xc5\xa3\xb6\x25\x31\xe0\xe6" + "\xb0\x7d\x85\xfa\xfa\x8d\xad\x94\xf5\xcb\xf5\x4b\x7d\xa4\xf9\x40" + "\x6b\xd8\x2b\x6c\x7b\xbd\x1a\x4e\x6b\x19\xef\x29\x5e\x7d\xed\x4a" + "\xfa\x2e\x5a\xac\x5d\xb1\x6e\x63\x0f\x07\xda\x11\xbb\x5c\x9b\xab" + "\xcd\x9d\xcb\xcc\x11\xf8\x06\xba\x7b\x94\x76\x96\x35\x41\xf2\x18" + "\xe5\xe3\xb2\xd5\xab\xdc\x43\xb2\x69\x92\x27\x90\xcc\x46\xd3\x57" + "\xa5\xb3\x92\x2e\xb2\x57\x66\xc7\x7a\x08\xd8\x28\x33\x31\xdd\x46" + "\x59\x77\xd1\x4d\xe6\x80\xec\x78\x42\xb6\xd6\xaf\x64\xd4\x57\xe9" + "\xc8\xfb\x3d\xcd\xa5\x95\x72\x8d\x4d\xc8\xa0\x79\xec\xc4\xdc\xc3" + "\xfe\x53\x71\x3c\x57\xe4\x5d\xac\xcf\x3d\xac\xd1\xe5\x18\xf7\x73" + "\xbb\x63\x78\x05\xc6\x94\x74\xec\x33\x11\xfe\x10\xcf\xe5\xf2\xa9" + "\x98\xe8\xa9\xcd\xf9\x0a\xe4\xb5\xbb\xd8\xa4\xa3\xfa\x18\x74\x45" + "\x96\x9a\xc4\x1c\xcb\x23\xfd\xc6\x44\x71\xd6\x4f\x73\x8c\xe6\x97" + "\x38\xf3\xc7\x5c\x33\x6e\x7b\x98\xd1\x3c\x13\x76\x4b\x10\xa6\xf6" + "\xd2\x3c\x43\x59\xcd\xba\x0d\x63\x97\x72\x93\x76\xde\x76\x93\x5b" + "\xd7\x0d\xa7\x79\x98\x35\x89\x8d\x41\xf9\x96\x13\x96\x2e\x92\x9d" + "\x7f\xe6\xf4\xce\x63\x94\x96\x60\x27\xf1\xe5\xd8\x13\xdd\x45\x37" + "\x07\x8d\x7f\xa4\xb4\x15\xbb\x44\xc8\x33\x6f\xc4\xb7\xa4\xbe\x38" + "\x27\xa2\x4e\xd0\x95\xd8\x9f\x6f\x8d\x66\x16\xcc\x5b\xec\x35\x37" + "\x2f\xd7\xe9\xe1\xa9\x88\x43\x1a\x6a\x1f\xf1\xe0\x8d\x78\x5f\x4e" + "\xfb\xf4\x20\x72\x67\xe2\x4b\xdc\x84\x33\x48\xf6\x44\x72\x30\xc0" + "\xfa\xcc\x79\x65\xd2\xb9\x7a\xb2\x21\xb4\xf6\xeb\x76\xac\xf3\xb2" + "\xf9\x15\xb2\x69\x65\x59\xc7\x6e\x6c\x51\x26\xd5\x92\xdc\x29\xff" + "\x2b\x92\xf1\xdc\xdc\xd1\x57\xc6\x33\x71\xb6\xf6\x4b\xc6\xef\x48" + "\xe0\x67\x99\xab\xbd\x3b\xae\xff\xb3\x2c\x91\x69\x2d\x19\xf8\x65" + "\x49\x58\x99\xb1\x56\x26\x26\xeb\xb0\x22\x9c\x42\x38\x96\xf4\x6c" + "\x68\x9d\x2b\x5e\x46\x36\x8b\x30\x4e\x68\xf7\xf6\x3b\x1e\x73\xe4" + "\x10\x4f\x3b\x51\xd8\x43\x20\x7b\xc4\x43\xd2\xf5\x52\x26\x8a\xf1" + "\x14\xf6\x62\x95\x89\x73\x51\x77\x74\xd9\x45\x16\x6a\x5b\xc7\x6e" + "\x22\x19\xba\xd1\xc7\x1d\xc4\x03\xd3\x9c\x20\xbf\x66\xed\x8a\x65" + "\x5e\xd6\x56\x66\xc0\xf7\x89\x78\x9f\xa1\xd3\x52\xc8\x63\x0a\xf1" + "\xb0\x68\xa2\xa1\x1e\xdc\xca\x26\x76\x17\x59\x4c\xfa\x58\x11\x9d" + "\x41\x72\x3c\x4d\x16\x41\x6d\x15\xba\x00\x64\x9b\xdf\x45\x70\xd3" + "\x71\xd5\x45\x92\x5d\x4f\xf4\x86\x74\x31\x93\xdc\x87\x2c\x8b\x31" + "\xae\xd1\x72\xbe\x58\xcc\x98\xfb\x67\x82\xda\xf9\x50\xd0\x7b\x11" + "\xe5\x37\x76\x11\x0d\x37\x18\x7c\x2c\x2f\xeb\xf0\x29\x13\x36\x3d" + "\x99\x4d\x8c\xb7\x97\x77\x90\x1f\x37\x5b\x0e\x0b\x6f\x57\x26\x95" + "\xa3\x8f\x74\x3f\xb7\x56\xca\xf8\x27\x3d\xaf\xf3\xe9\xb2\xdd\x93" + "\x7e\x64\xdc\x16\xc2\x48\x36\x4f\x36\x20\x85\x2e\xe6\x25\xb3\x90" + "\xc7\x3b\xbd\xb3\x99\x23\xef\x3e\x4a\x73\x93\xb6\x97\x35\x77\xe6" + "\x9b\xd9\x71\xf3\x6c\xac\xe3\x49\xb1\x58\x2b\xd9\x43\xd6\x79\x55" + "\x26\xc5\x6a\xf0\xad\x13\xba\x22\x8a\xe5\x02\xed\x25\x24\x1b\xc0" + "\x3e\x72\x82\xf6\x6b\x94\x9d\xad\xaf\x1b\xec\x13\x27\x00\xa7\x0e" + "\x89\x63\x88\x2e\xb3\xb4\x91\xed\x18\xc1\x3f\xc8\xf4\x11\xf2\xdc" + "\x60\xd2\x61\x3f\xbd\x8d\x74\x94\x4f\xe8\x10\x2a\x16\x47\xaa\x8f" + "\x64\x09\x16\x07\xf5\x4d\x9b\x8b\xd8\xaf\x26\x35\x07\xd6\xad\x45" + "\xdc\xcb\x3b\xde\x11\xbc\x2e\x27\x79\x03\x7c\xea\xcd\x35\x77\xee" + "\x66\x96\x81\xd6\xa1\x6d\x34\xed\x55\xb7\xac\x2e\x2b\xe3\xd5\x76" + "\x83\xfa\xc0\xf6\x52\x16\xa1\xec\x04\xd8\x68\x9d\x6d\x4c\x1b\x73" + "\x5e\xb9\x65\xab\x31\x62\x6c\xf2\x83\x59\xc3\x79\x9e\x99\x19\x4a" + "\x2e\x0f\x0f\x9f\xe4\x19\x5b\xcd\x43\xee\x78\x6c\x61\x16\x9d\x7d" + "\xdb\xd9\x17\x99\x2c\xe4\x41\x1f\xea\x8e\x60\x36\x97\x12\x57\x4c" + "\x77\xcd\x8f\x47\x10\x2d\x12\x57\x4c\x65\xe6\x56\xb2\xf0\xdc\x56" + "\xde\xb6\xf3\xd9\x61\xe1\xd8\x7f\x4d\xd8\x37\x8a\x47\x45\x8c\xad" + "\xee\x45\x19\xef\xa6\x89\x7c\x35\x83\xb7\xed\xd6\x11\x03\xb7\xcd" + "\x16\x73\x5e\xb9\x75\xdc\xd0\xda\x36\xb9\x36\xd0\xb6\xc9\xb5\xff" + "\x80\xb6\xbd\x12\xd4\x36\x53\xa0\x6d\x19\xd4\xb6\xdf\x0c\xad\x6d" + "\xdf\x09\x0f\xb4\xed\x3b\xe1\xdf\xb2\x6d\x87\x07\x6f\x5b\xdc\xf7" + "\x07\x6e\x5b\xf6\xd8\xf3\x4a\xdc\x8f\x86\xd6\x36\xeb\xfc\x40\xdb" + "\xac\xf3\xff\x2b\x6d\xcb\xab\xe4\xe7\x1a\xb0\x82\x48\x9e\x43\x78" + "\xfe\xbc\x32\xf9\x89\xad\xb1\x42\x8f\x3b\x0a\xef\x23\xf2\x2b\xf9" + "\x5f\x25\x6d\x13\x57\x2f\xf7\xb4\x38\xac\x9f\x9b\x35\xbd\x92\xc9" + "\xc2\xc7\x83\x1a\x32\xfe\x10\x2f\xe4\xde\x29\x5d\xa4\x33\xe8\x25" + "\xfb\x2a\x64\xdb\x7d\xe7\x9b\x57\x3d\xe4\x57\xa3\xf2\xc0\xe5\x50" + "\xf6\xe6\x55\xb7\xa1\xbb\x68\x32\xd3\xed\xb3\xea\x79\x8d\x15\xd7" + "\xc3\x47\x93\xef\x7e\x30\x83\x19\x09\x1f\xd1\x93\x7c\xb5\x96\xe5" + "\x0d\x0f\x7f\xf0\x2b\xda\xf7\x27\x2f\xd0\xef\xcc\xea\x65\x2d\x6a" + "\x1b\xce\x8d\xb9\x2c\x84\xee\xed\x0a\xfb\x8b\x66\x37\x8b\xcb\x65" + "\xc3\x16\x65\xa3\x7c\x0f\x4b\x33\x66\xa3\x6c\xc0\x43\xd2\xf2\x93" + "\xcb\x43\x32\x59\xc4\x6e\x94\x4d\xcf\x07\xcd\xf9\x7c\xfb\x8b\x2c" + "\x94\xee\xf7\xd2\x3d\x5d\x79\x47\x37\x2c\x1c\xf5\x1c\xd1\xeb\xf9" + "\x06\xf8\x8d\x96\xf0\xbb\x6d\x4f\x00\x7e\xb7\xfd\x30\x00\xbf\xdb" + "\x6e\x90\xf0\xbb\x2d\x34\x00\xbf\xdb\xba\x86\x06\xbf\xdb\x92\x02" + "\xf0\x93\x79\xaf\x0f\xbf\xdb\x36\x0c\x0e\xbf\xdb\x76\x06\xe0\x27" + "\xcb\x1a\x04\x7e\x61\x03\xc3\xef\xb6\x0f\xbf\x1d\xfc\x6e\xeb\xfa" + "\x96\xf0\xbb\x41\xc2\xef\x3b\x7f\x0c\xc0\xef\x3b\xbf\x08\xc0\xef" + "\x3b\x0b\x25\xfc\xbe\x33\x37\x00\x3f\xeb\x8c\xa1\xc1\xef\x3b\x05" + "\x01\xf8\xc9\xbc\xd7\x87\xdf\x77\x7e\x33\x38\xfc\xbe\x53\x17\x80" + "\x9f\x2c\x6b\x68\xf0\xb3\x46\x02\x6e\x26\x0d\x7e\xa6\xc1\xe1\x67" + "\x9d\xf1\x2d\xe1\x67\x94\xf0\xbb\x7d\x4c\x00\x7e\xd6\x53\x01\xf8" + "\x59\x4b\x24\xfc\xac\x3b\x02\xf0\xbb\x3d\x6b\x68\xf0\xb3\x3a\x02" + "\xf0\x93\x79\xaf\x0f\x3f\xeb\x95\xc1\xe1\x77\x7b\x44\x00\x7e\xb2" + "\xac\x41\xe0\x37\x7c\x60\xf8\xdd\xfe\xa3\x6f\x07\xbf\xdb\xb3\xae" + "\x07\xbf\xa1\xd1\x1a\xb7\x0b\x5e\xe7\x1f\x50\x4e\xe3\x60\xe5\x10" + "\x0c\x49\x3f\x51\x2d\xba\xbd\xb1\x4a\x0d\x0b\x97\x77\x38\x6e\x2f" + "\x06\x0f\x33\xa7\x45\xb9\xe3\xa6\x2a\x75\x58\x38\x2f\xfc\x22\x41" + "\x2d\x6c\x3b\xc3\xb7\x85\x85\xaa\xdb\x86\x87\x92\x4d\x81\x81\xca" + "\x12\xfa\xb2\xca\x1d\x5b\x43\xc6\xb1\x9b\xe9\xbe\xde\x76\xd0\x6b" + "\xf4\xde\x5d\x74\x47\x31\x68\x91\xe8\xfe\x30\x59\xbe\x72\xbd\x70" + "\xde\xb9\x6e\xc5\xf2\x0d\x6b\x96\xa7\xaf\xc9\xb2\xa4\x2f\xfb\xf9" + "\xfa\xbe\x36\xf1\x85\xdf\xcb\x1d\x34\x7e\x77\xd4\xf9\xed\xbc\x14" + "\xf2\x6c\xb2\x97\x67\xbb\x85\x74\xd3\xe2\x23\x84\x9f\x82\xa8\xe9" + "\x11\xbc\x37\xe5\xa5\xa4\x5b\xf9\x3b\xc2\x0e\x60\x6f\xc6\x4b\xe0" + "\xa7\x76\x93\x6d\x17\xed\x1c\x6a\xf7\x79\xe5\xce\xc9\x3c\x72\xa6" + "\x9d\x74\x3a\xc4\xdd\x0e\x25\x5e\xbf\x83\x55\xcb\x4d\xf1\x1d\xaa" + "\x7d\xa6\x9d\x97\xcf\x2c\x26\x18\x34\x90\x0d\xb6\x8d\x21\x13\x5b" + "\x94\x29\x6d\x3c\x32\xbe\x03\x65\xb9\xb5\x72\x48\x77\xbf\x2b\x29" + "\x87\x7f\x46\xe5\x69\xb4\x20\xf9\x21\x71\x48\x7a\x30\xfe\x65\xe3" + "\x36\x4b\x08\xa5\x25\x5b\x88\x64\x23\x50\xf7\x3d\x45\xed\xa6\xb4" + "\xa0\xc7\xe7\x20\xff\x1c\xf2\xbd\xe9\x2f\x43\xb6\xe9\x46\xb4\xa9" + "\x49\xf4\xc5\x1e\x5f\xd1\xb9\x25\xe5\x25\xe1\xff\x51\xc0\x75\x4a" + "\x3d\xea\xae\x10\x7e\x3b\xbd\x97\x84\xdf\x4e\x2d\xcf\x4d\xc8\x23" + "\xf0\x29\xd9\x3f\x95\x65\x4c\xf9\x8d\xde\x2e\xd0\xd0\x23\x11\xde" + "\x1f\x54\xc7\x28\x84\x9f\x0f\xfa\x1e\x81\xf0\x4a\xd0\xa1\x91\xda" + "\xf7\x1b\x10\x5e\x48\x74\xa9\xe8\x57\x69\x81\xd4\x89\x56\xa6\x90" + "\x2e\xb0\x49\x4b\x13\x89\x34\x63\x88\xd6\xd5\xca\x88\x6a\x57\xee" + "\xbc\x46\x3c\xa3\xf6\x3d\x1a\xe1\xb3\x74\x2e\xa0\x7d\x1f\x83\xf0" + "\xbb\x08\x7f\x47\xfb\x0e\xba\x3e\x41\xfa\xbf\x31\xc5\xb7\x52\x9f" + "\x00\x7b\xba\x1f\xaa\x00\xd6\xad\x88\xdb\x0d\x7e\x35\x9f\xc6\x91" + "\xfa\xe9\xc8\x69\x67\x2d\x4a\x02\xf9\x06\x0d\x91\x63\x35\xd3\x2e" + "\x6d\xf4\x18\x52\x10\xdf\x41\xf1\xa4\x5b\xae\x96\xcf\xb4\xd1\x3b" + "\x60\xfa\x3c\xc1\x50\xab\x0b\x3c\xd1\x9d\xd1\xda\x38\x03\x76\x64" + "\x47\x97\x15\x1c\xd0\xc6\x02\x6d\x1b\x8e\xef\xcf\x69\xe7\x1e\xb5" + "\x8b\xbc\xbd\xf2\x7e\x91\x72\xe7\xec\xbf\xcb\x6e\x04\xf2\x49\xbc" + "\x77\x67\xae\xee\x93\x10\x71\xd2\x56\x16\xe6\x27\xc9\x57\xdc\x91" + "\xf1\x05\xc2\x4e\x0a\xe6\xa8\x3e\x57\x68\x9e\xf0\xb0\x3b\x76\x4b" + "\x59\xcd\x9d\xfe\xfb\xbf\x2e\x25\xa1\x4b\xf3\xe3\xc0\x24\x9f\x70" + "\xe7\x99\x80\x7e\x51\x82\xc0\x0f\x41\xdf\xdc\x41\xdf\xb2\xf5\x6f" + "\x52\x07\x6e\x4a\x44\xd0\xb7\x8c\x7e\xdf\xac\x41\xdf\x52\xfa\x96" + "\x39\x65\x6e\xd0\xb7\xf9\xfd\xf2\xa5\x05\x7d\x9b\xd1\xef\x5b\x6e" + "\xd0\xb7\x38\xed\x5b\x08\xe2\x77\xfb\xed\x14\x2a\x09\xd1\x5a\x3c" + "\x70\xfd\x94\xc3\x41\xf1\xa1\x5a\x3c\xd5\x7f\xc2\xc5\x3e\xd1\xf8" + "\x18\x39\xcf\x31\x8f\x6e\xd3\xea\x70\x05\xea\x88\xd7\xed\xcc\x17" + "\xc8\xf1\x8b\x5f\x60\x54\x2c\xc3\x69\x4e\x19\xb7\x15\x90\x4f\x20" + "\xbb\xb4\xc9\x25\xd7\xa1\xf0\x5d\x4d\xbe\x6f\x91\x6e\x30\xdc\x38" + "\xa8\x6f\xcc\xa2\xa9\x29\xfa\x5d\x56\x9f\x3d\x7e\x87\x6a\x9f\x7e" + "\x82\x7c\x0d\x92\xfd\xae\xfc\x0e\xae\x0a\x1f\x83\xe4\xcb\x90\xf5" + "\x30\x67\x56\x77\x01\x70\xc3\x68\xda\xe7\xe8\x7c\xaf\x01\xfc\x6d" + "\x83\xed\x82\xf4\x33\x48\xf7\x7b\xcb\xe3\x77\x6c\xea\x60\xb1\xb6" + "\xef\xf1\x56\xe2\xf3\x24\x4e\x98\x4a\xb6\x29\x8d\x1a\x4e\x7b\x51" + "\xea\x7a\x27\x92\x6f\x6e\xa3\xb3\x43\xc8\x99\xc3\xcf\x2b\x89\x4d" + "\xfa\x77\xd9\xdf\xc4\x26\xc1\x4b\x6b\xf7\x0a\xd1\x46\xaf\xdf\x0f" + "\xa6\x92\xd8\x7c\x25\x72\x65\x71\x77\x51\xa2\xa9\xaf\x7e\x63\xe2" + "\xed\x54\x26\xf5\xc1\xa5\x4c\xad\xa3\xb2\x91\x66\x86\x5f\xbf\xd1" + "\x14\xbf\x03\xdf\xe7\x48\x7d\xfc\xc4\x26\xe1\x03\xa8\x28\x11\xfc" + "\xff\xd4\x04\x4d\x8f\x73\x07\x27\xdd\xc7\x1e\xc6\x48\xaf\x19\x7b" + "\x77\x6c\xfe\x57\x2c\xaa\xb3\x37\x85\x74\x55\x5b\x84\x1e\xf6\x73" + "\x64\xff\xcf\xc3\x1e\xb5\x31\xe9\xdb\x46\x49\xfc\x6d\x43\x97\x8b" + "\x6d\xa7\x3b\x89\xe5\x09\xe6\xce\xa8\x69\x77\xa0\xcc\x43\x2e\xf6" + "\xcc\x6e\x4d\x2e\x41\x7e\x76\x63\x5d\xd4\xbf\xfc\x0c\x86\x34\xd1" + "\x48\x33\x0b\x69\xea\xf4\x34\xf4\xbd\x9b\x64\xbc\x3c\x83\x51\xbf" + "\xae\x94\x97\x1d\xc5\xf7\x0e\x57\x48\xef\x09\xa9\xa3\x99\xe8\x71" + "\xb1\x73\x05\x83\xed\xc1\x42\x2e\x6a\x9a\x79\x88\xdb\x67\xd6\x00" + "\xef\x54\x4b\x5b\x04\x33\x0f\x49\x79\xc2\xb4\x79\xe4\xdf\x8c\x7c" + "\x8f\xd3\xd9\xa7\xc4\x7d\xd3\x7e\x21\xf0\x07\xe2\x30\x3e\x87\xb0" + "\x47\x0c\xdd\x66\xa8\x32\x6d\xb1\x28\x63\xbc\xb4\x7f\x46\xf7\x48" + "\xba\x8b\xa6\x55\xfb\xfd\x47\xf8\xef\x34\x4c\x3b\x45\x72\xc6\x32" + "\x55\xb6\xb1\x7f\x1b\xa8\xbd\x28\x6b\x50\x3b\x24\xc8\x53\x2d\x64" + "\xb1\xbb\xa6\x1d\x96\xfa\x6c\xd3\x23\x43\xcc\x13\xae\x76\x17\x4d" + "\xf7\x9f\x7f\x50\x1a\x1a\x33\x15\xe5\xfb\xfb\xb9\x8e\xea\x98\x3e" + "\x43\x9e\x15\x4c\x9f\x0f\x5c\x5a\x5d\xd6\xc3\x42\xb5\xf8\xf9\x0d" + "\x5e\x0f\xdd\xef\x1f\xd0\x16\x17\xed\xd3\xc2\x8e\xd3\xae\x99\xe2" + "\xae\xe9\x54\x8f\xde\xe6\xbb\xe6\xd3\xdd\x01\x6a\xb3\x84\xed\x5d" + "\xf7\xeb\x70\x2c\xb9\x8c\xb2\xf3\x3e\x61\xad\xca\xf4\x93\xa4\x63" + "\x23\x60\x92\xa3\xeb\x7d\x4d\x17\xf7\xb8\x45\xfd\x32\x8d\x38\x33" + "\x25\x9d\x63\x82\x53\x15\xcd\x35\x94\x59\x8a\xb1\x10\xbe\x71\x95" + "\xbb\x04\xaf\xb3\x1d\xdf\x45\xbf\x85\x4e\xdd\x5d\x99\x72\x1d\xdc" + "\x05\xfe\xe7\xae\x6c\xb9\x0e\x64\x1c\xf9\xae\x27\x5d\x88\x8b\xca" + "\xf4\x73\xe4\x9f\x16\xf0\xa8\x21\x1b\x76\x0d\x5d\x58\xaf\xd9\x3d" + "\x34\x17\x6a\xc8\x0f\x21\xe0\xd0\x2a\xf7\x28\x82\xf9\xf4\x5a\xaa" + "\x9f\x60\x4b\xbe\x79\x43\xcc\xb1\xc0\x03\x77\xa5\xf9\x7d\x1c\xc7" + "\xd0\xbd\x8a\xe9\x83\xda\x2e\x24\x18\xf9\xd0\xe6\x06\xd0\xcc\x8e" + "\xf1\x9f\xa0\x7d\x33\x6e\x57\xa3\x66\x56\x93\x0e\x27\xda\xaa\xe9" + "\xb9\xc9\xb1\x93\xf3\x60\x86\x82\x3a\xa6\x36\xc8\xb9\x20\x7d\xa3" + "\x2b\x77\x1d\xd2\xe0\x27\x7c\x5f\xd8\x37\x4a\x38\x68\xe9\x97\x48" + "\xd9\x50\xec\xdd\x68\x57\xc0\xff\x17\xe2\x85\x5c\x4f\xd3\xf3\xee" + "\x2e\x9a\x11\x1d\xd4\xe6\x2e\x71\x17\xf1\x32\xf1\xf5\x77\x1d\xa3" + "\xba\x4a\xc8\xc6\x18\xcd\x8b\xf6\xe0\xf9\x7f\xd7\x7e\x6a\x27\xe9" + "\x07\xfa\x22\xa7\x1d\xe6\xe5\xd3\x6a\x08\xce\xc8\x73\x06\x6b\xa1" + "\x7a\x10\xdf\xf3\xc2\xf7\x15\xea\xdb\x11\xe4\xcf\x17\x7b\xf1\x8c" + "\xdf\xe8\x7b\x2d\xd1\x09\x64\x6b\xc2\x1f\x57\xfe\x1a\xf9\x59\xd5" + "\xe9\xb5\xc1\xe4\xc6\x11\x65\x53\x58\x22\xdd\x77\x26\x5d\x71\x9a" + "\x6f\xdc\xf4\x9a\x99\x6c\x28\x93\x3d\x48\x47\xce\x74\xb4\xf7\xee" + "\x15\x2f\xc4\x88\x3b\x96\x5d\x8e\x29\x97\x49\x4f\xa8\xe3\x7c\xae" + "\xb0\x73\x14\xbe\x28\xdb\xcb\x0f\x48\x7f\xde\x6e\x1e\xf9\x9a\x99" + "\xbe\x09\x1f\x02\x54\xe6\xdf\x6b\x0f\x58\xb9\x3b\x51\xa3\xa7\x3a" + "\x40\x4f\x8c\x45\x7f\xc4\x3e\x85\xf7\x98\x76\x65\x66\x89\xf4\x41" + "\x29\x6d\xda\x6b\xfa\x8e\x61\xd2\x46\x80\x9b\x89\x3b\xdb\xca\x4c" + "\xc5\x72\x07\x63\x1d\xca\xcc\x61\xc2\xbe\xb4\x3d\xbe\x49\x83\x41" + "\x53\x99\x6c\x97\x31\x35\xdb\x20\xda\x48\xed\x1b\x62\xdb\xea\xb4" + "\xbd\x34\xac\xbb\x68\xa6\x49\xb7\x2d\x20\xfa\xaf\xd9\x9d\x76\xdc" + "\x42\xbc\xd3\xcc\xad\xda\xfe\xa9\xeb\x6d\x35\xff\xd7\xeb\x9e\xa9" + "\xdd\xa5\x8c\x17\x3e\xd7\x31\x17\xbb\x50\x6e\x0d\xda\x51\xa1\xef" + "\xe9\x9a\x9e\x7e\x82\xa4\x35\x66\xd6\x04\xf6\x73\x09\xc3\x3e\xf7" + "\x86\xd6\xae\xcd\xb2\x80\x69\xb0\xa5\x67\x2d\xcb\xb0\xac\x58\xb7" + "\x6e\xed\x3a\x0b\x19\xdd\xe9\xe7\xab\x29\x9c\x17\xcd\x3c\xa1\xf9" + "\x93\x3b\xe4\xf7\x27\x57\x74\x4f\x44\xb0\x9f\x3f\x97\x72\x8f\xe9" + "\x1f\xc3\x5b\xdd\x93\x30\x58\x39\x76\x83\x5a\x83\xdf\x51\xfc\x1c" + "\xf8\x91\x2d\x75\x96\xea\x61\x49\xd8\xa3\x05\x3f\x16\xb8\x33\x3f" + "\x93\x6c\xd7\x24\xb5\x28\xf7\xfc\xa2\x4a\x0d\x65\xc2\xb6\x4a\xa1" + "\x4a\xfa\x2c\x64\x27\xfd\x28\x7e\x0e\xfc\x6a\xf1\x13\xf9\xd4\xdf" + "\x8b\xfb\xbe\x35\xc1\xdf\xe8\x7c\x9c\x17\x1e\x27\x7b\xeb\x8d\x7c" + "\x5b\xa8\x38\x07\x51\x77\xc9\x74\xfd\xda\x60\xe0\x45\xd3\x22\xb4" + "\x74\x82\xce\x1a\xbd\x8d\x59\x06\x48\x17\xc2\x8b\xee\x38\xa2\xa5" + "\x0b\xa7\x74\x7a\x7f\xc8\x86\x3f\xd2\xeb\xe9\x42\x79\xd1\x8c\x5a" + "\x2d\x9d\xb8\xfb\xa7\x16\x1a\x06\xaa\x77\x18\x2f\xf4\xb8\xb5\x74" + "\xa6\xe0\xf2\x82\xd2\x84\xa9\x45\xb7\x98\x29\x8d\xba\x2d\x54\xd0" + "\x86\xbc\xe8\x9e\x04\xa4\x1f\xd0\xf6\xe9\xd0\xc6\x69\xd6\x99\xfe" + "\xe3\x64\x5b\xb6\x72\xc5\x7d\x2b\xd7\x6c\x24\xef\x54\x59\x6b\x37" + "\x64\xd1\x73\x4d\xfa\xcf\xc5\x63\x6d\xea\xb3\xcb\xe4\x4b\x56\x66" + "\x22\xbd\x64\x62\xbe\xd1\x73\xf9\x06\x1b\x3d\x96\xad\xa5\x60\x76" + "\x46\xc2\x86\x65\xba\x9b\xf0\x3e\xb6\x9f\xba\x8b\xee\x05\xfd\x7b" + "\x4f\xa6\xa4\x47\xee\x2d\x76\x29\x77\x88\x73\x39\xe3\x36\x17\x3b" + "\x69\x15\xfe\x04\xd9\xd7\x6c\x26\x28\xf7\xee\x21\x9b\x09\xc6\x6d" + "\xb6\x65\x46\xef\xca\x15\xbc\x7c\xba\x09\x79\x41\xff\xbe\xa2\xdd" + "\xc9\x8f\x6f\x13\xf6\x43\x8b\xee\x8d\xd6\x75\x1c\x55\x7b\x7c\x25" + "\xd9\xc5\x17\x3a\x4f\xbb\x84\x3d\x1e\xd2\x3d\x6f\xad\xda\x25\xfc" + "\xd3\x44\x23\x7c\x10\xe1\x0e\x84\xcd\x08\xc7\xaa\xf6\x58\x2b\xdd" + "\x91\x44\x98\xfc\x99\xc5\x75\x17\xdd\xe7\xf7\x7f\x19\x0c\x1b\xcd" + "\x81\xdd\x7d\x03\xf2\xe8\xfd\xec\x8e\xa1\x8c\x0c\xdd\x3f\xb0\xf0" + "\x05\x5c\x74\x5f\xb6\xdf\x17\xb0\xf0\xe9\x64\x12\x7b\x93\xdc\xdb" + "\xef\xbb\x12\x62\xbe\x69\x87\xe4\x05\xee\xab\xd6\xed\x42\x48\x5a" + "\xff\xbe\x9a\x20\x3f\xca\x14\x76\xf8\xfd\x28\x4b\x3b\x66\x2f\x09" + "\xdb\x4b\xca\x77\xb1\xc6\xef\x4b\xf4\xfb\xbc\x2b\xba\xaf\x2d\xd8" + "\xe7\x9d\x0b\xdf\x89\xc7\xea\x2e\xfa\x2e\x0b\xec\x83\xf7\xed\xa6" + "\x3a\x07\xf2\x19\x5d\x66\x00\x3f\xb0\x19\xfc\x00\x9e\x82\x37\xd0" + "\xe8\x70\x8a\xe7\x85\x49\x64\x63\xc7\x42\xdf\x88\xf6\x1b\x50\xee" + "\x21\xe8\xda\xef\xbe\x48\xf6\x77\xdd\xf9\xcb\x95\x5b\xab\x48\x0f" + "\x0a\x61\x69\x3f\x92\x5f\x54\xbe\x2b\xee\x98\xe9\xb6\xe5\x82\xef" + "\xe5\x0f\x78\xff\xe1\x23\xfd\xdc\x3a\x73\xad\xd1\x9b\xbe\x42\xd2" + "\x71\xdf\xbd\xa6\x9d\x53\x37\xca\xfd\xfe\xbb\xad\xfc\x31\xe9\xf7" + "\xc4\xa5\xcc\xce\xa0\x3b\x51\x46\x25\x73\x2d\x47\x5e\x63\x76\xfa" + "\x0a\x11\x87\x74\xdb\x41\x6b\x69\xed\x3b\xe5\x8c\x6d\x63\xfc\xaa" + "\x4f\xda\x1b\x50\xbe\x5b\xbb\xf4\xa6\x02\xaa\x27\x5c\xd0\x11\x1f" + "\xb1\x08\xf2\x3f\x48\x6d\xab\x0a\xb2\x7d\x57\x86\x38\xd2\x09\xeb" + "\x7c\x8c\x45\x90\xad\x5f\xad\x2d\xb5\xc2\xff\x59\xd1\xec\x34\xdd" + "\x6e\x0f\x60\x5e\xdb\xbf\x3f\x8f\x3d\x2e\x56\xc8\xe4\x65\x09\xc9" + "\xf3\xf0\x96\xa0\xb9\xce\x0d\x9e\x3b\xb1\x9d\x51\x33\xcc\x9d\x6f" + "\x4c\xd9\x24\x7c\x4f\x16\xcd\x06\xfe\xff\xae\xb4\x27\xb1\xfd\xa7" + "\x5f\x12\x6e\x11\x3e\x19\xe9\x6e\xa3\x4a\x77\x77\xe7\xbc\x2c\xec" + "\xec\x1a\x24\xbd\x28\xfc\x32\x15\xcd\xce\xe2\x51\xf1\xc5\xd2\xef" + "\xec\xf4\x43\x18\x3f\xb1\xef\xd3\xda\x10\x77\x38\x4d\xd4\xf7\xfb" + "\xe9\x5e\xeb\x83\xf8\xfd\x58\xfa\x89\xf9\xe9\x97\x7a\xb9\x64\xc3" + "\x0a\x73\xcb\x84\x27\xd6\xda\xfd\x89\x7e\x3d\x25\xff\xbd\xd0\xfb" + "\x7f\x44\xf6\xb5\x02\x77\x84\xe7\x68\x72\xcd\xfb\x97\xb8\xd8\x6d" + "\x76\xb9\xbe\xef\xc7\xfc\x3f\xad\xdd\x0f\xbb\x3f\xcb\xc5\x1e\x69" + "\xec\x57\xc6\x5b\xba\xfc\x45\x8e\xdd\xfd\x15\x98\x8b\x0f\xe2\xf7" + "\x63\xa4\x3f\xa8\xfb\xdd\xde\x6e\x10\xf7\x9b\xce\x87\x98\xe9\x0e" + "\xf0\xfd\xc7\xf4\xf8\x61\x4a\x12\x60\x73\x7f\x9d\x8e\x4f\xc0\x0f" + "\x81\xdf\xb9\xbf\x19\xf4\xe6\x62\x2d\x8c\x35\x77\x7f\x87\x1e\xc6" + "\xbb\x47\xc7\x37\xc4\x23\x76\x6e\x49\x79\x91\x78\xcf\x65\x66\xd0" + "\x64\x66\xe2\xf1\xbe\x67\x76\xb1\x0f\x76\xc8\xbc\x25\x8d\x9d\x85" + "\xf5\x89\x5d\x51\xaf\x9a\xba\x80\x43\xf1\x6d\x86\x8b\xfd\xc7\x19" + "\x59\xce\xf7\x92\x5c\x21\xbe\x83\x81\xf1\x08\x31\x02\xc6\x27\x64" + "\x9f\xe6\x64\xe3\xbd\x96\x7c\xa0\x23\x5d\x06\xd6\x57\xb2\xe4\x09" + "\x3b\xaa\x77\xf6\x98\x16\x3b\x77\x80\x66\x7d\x96\xe6\xca\x1c\xe1" + "\x3f\xba\x24\xc7\x94\x4c\x34\x1f\xd9\x42\x10\x36\xd2\xc8\xf6\xa4" + "\x97\x85\x09\x7b\xff\xe5\xa5\xb5\xc2\xce\xfd\x26\x6b\x84\x6e\x77" + "\x12\xeb\x74\x16\x37\xbc\xd1\x41\xb6\x28\x85\x3c\xaf\xdb\x3a\x5a" + "\xd8\x9f\xd4\xec\x4e\xee\xdf\xc8\xa2\x2b\x55\x69\x77\x52\xd8\x49" + "\xb8\x8e\xed\x49\x5e\xd8\xbe\x43\xb7\x3d\x09\x38\xd0\xfd\x47\x2b" + "\xbf\xea\xf5\xe0\x19\x17\x64\x6f\x27\x74\x40\x3b\x94\x06\xe0\x4d" + "\x83\xb4\x43\x39\xb4\xfd\x66\xce\x5c\x39\x4f\xe6\xec\xd0\xfd\x82" + "\x07\xc5\x55\x60\x9e\x1f\x94\x71\xf7\x27\x6b\x71\x87\x5d\xec\x94" + "\xdb\x4f\x9b\x01\xdf\x91\x5c\x13\xeb\xf8\x0c\xf8\xe0\x17\x83\xd7" + "\x15\x13\x7f\xb4\x75\x0f\xc3\xbe\x1c\x86\xdf\x70\xfa\xcd\xf7\xe3" + "\x8f\xab\xbc\x89\x78\x04\xa3\x82\xfd\x26\x3b\x84\x2f\xf2\x7a\x43" + "\x52\xbd\xca\x19\xa2\x3d\xe9\xde\xf7\x22\x9f\x97\xec\x0f\x84\x2e" + "\xf2\x75\x92\xcf\xce\x33\x74\x9f\xad\xec\x59\xba\x5f\x39\x91\x93" + "\xbf\x9a\x45\xbe\x4b\xfc\x80\xbc\x37\xda\xa8\xf9\xe1\xac\xf3\x6d" + "\xe4\xb5\x18\x87\x08\xe2\x3b\xc8\x06\xd8\x68\xc5\xc3\x46\xdb\x42" + "\xde\x79\xf4\xca\x3b\x9c\xec\x7f\x91\xaf\x32\xb5\xc8\x03\x5c\x69" + "\x51\x52\xbd\x21\x05\x4e\x6f\xab\xf0\x17\xb0\xc8\x37\x9c\x2f\xca" + "\xbe\x9f\x0b\x1f\x63\x1b\xf9\x09\xe0\xd9\x10\xe1\x97\x7b\x33\xef" + "\xc4\x7b\xf8\xa2\xcd\x9d\x9c\x7c\x86\xa2\x6c\xf2\x39\xd1\xb3\x28" + "\x5b\xcd\x4f\xcd\x56\x90\xef\xaf\xc8\xf7\x57\xb4\x27\x11\x65\x9a" + "\x10\x9e\xc3\x0f\x3c\x4b\xf7\xb0\x0a\x04\xef\x83\x3e\x3a\xb4\xbb" + "\xad\x47\xc9\x4f\x28\xd9\x1b\x4f\xf5\x3a\x0a\x0e\x68\x77\x55\x85" + "\xbf\xda\xec\x5e\xae\xd5\x33\x6b\xd1\x66\x36\x27\x75\xf3\x44\x71" + "\xe7\x95\xee\x73\x2d\xf2\x5a\x50\x67\x01\xc1\x23\x42\xf8\x08\x17" + "\x77\xba\xbe\x9f\x78\x3d\x9f\xa1\x03\xf2\xdb\xa5\x77\x3b\xf8\x9e" + "\x19\x71\xbc\x74\x56\x25\x9e\xd8\x6b\xa7\x93\xbe\x9c\xc2\x4b\xbf" + "\x9b\xcd\xf7\xdc\x8d\xf8\xef\x2d\xc6\xf3\x20\x2f\xfd\x7e\x22\xdf" + "\x33\x13\xe1\xb9\x11\x78\x22\x3c\xc6\x83\xf4\x16\x5e\x3a\x36\x03" + "\xcf\x6a\x5e\x6a\x6e\x42\x3a\x84\xc7\xcf\xc7\x13\xe1\x09\x47\x91" + "\x0e\xe1\x9b\xac\xe7\x95\xef\x77\xe1\x1d\x71\x0f\xb5\xc9\xba\x7e" + "\xd8\x25\xea\x2a\x5d\xc8\x64\x1d\xc9\x11\xb2\x8e\xc7\xcd\xb2\x8e" + "\x27\xe3\x64\x1d\x37\x57\x20\x9d\x95\x97\x5a\x76\xe0\x79\x88\x97" + "\xde\x62\x43\x3a\x84\xe3\x96\xe0\x89\xf0\x6d\xa8\x6b\x26\xc2\xd6" + "\x19\x78\x22\x7c\x87\x05\xe9\x12\x78\x69\x82\x09\xcf\xc3\xbc\x74" + "\x0a\x95\x8f\xf0\x54\x37\x9e\x08\x4f\x73\x21\x1d\xc2\x77\x35\xe2" + "\x89\xf0\x53\xe8\xd3\x8c\x44\x5e\xfa\x93\x56\x3c\x6b\x78\xe9\x12" + "\xd4\x77\x37\xc2\x4b\x17\xe0\x89\x70\x1a\xf2\xcf\x44\x38\xfd\x08" + "\x9e\x08\x2f\xa3\xbe\xce\xe0\xa5\x2b\xa8\x9e\x23\xbc\xf4\x59\xea" + "\x33\xc2\x19\x76\x3c\x11\x5e\x45\xed\x41\x38\x93\xf2\x21\xbc\x1a" + "\x30\x98\x31\x8b\x97\xda\x8a\xf1\x3c\xca\x4b\xd7\xa7\x20\x1d\xc2" + "\x1b\xad\x78\x22\x9c\x0d\x18\xce\x44\x78\x4b\x2d\x9e\x08\xe7\x51" + "\x7f\x67\xf3\xd2\x6d\x99\x78\x1e\xe3\xa5\x3b\x92\x90\x0e\xe1\x7f" + "\x89\xc6\x13\xe1\x5f\x00\x7e\x33\x11\xde\x79\x0c\xcf\x63\x03\x8f" + "\xa7\x9d\xf1\x6d\x61\x8c\x97\xee\xab\xe3\xdb\x86\xe3\xb9\x3f\x97" + "\x6f\x1b\x06\x18\xbd\x0c\x3a\x34\x0c\xcf\xaa\x0c\x84\x13\xb4\x30" + "\x9e\x07\x16\x23\x9c\xa8\x85\xf1\xac\x4e\x42\x78\x86\x16\xc6\xf3" + "\x15\x0a\xa3\x8d\xaf\xe2\x19\x86\xe7\x2b\x0e\x84\x67\x6b\x61\x3c" + "\x0f\x45\xe0\xe9\xe5\xa5\xff\xe6\x41\x7c\x12\x2f\xfd\xf7\xa3\x08" + "\xe3\x79\x30\x1b\xe1\xb9\x78\x36\x23\x3c\xd7\x3d\xf9\x16\xa1\x2b" + "\xc5\xa3\x7a\x5c\x6a\xcc\xac\xb4\xfc\x2b\xcc\x40\x32\xef\x9a\x3c" + "\x17\xd9\x94\x98\xd8\xa2\x3c\xf8\x21\xf9\x9d\xa0\x34\xbe\xbd\x33" + "\x2c\x6a\xcc\x0c\x92\xb9\x84\x21\xdd\xf0\xf3\xca\xdc\x73\xb4\x67" + "\x3a\x73\x5d\xc2\xdf\x9d\x66\x2f\x2f\x0c\x79\xae\x81\x46\x98\x45" + "\x3e\xd4\x01\xaf\x25\xbc\x70\xd8\x65\x3c\x9b\x79\xe1\xa8\x16\xc0" + "\x0b\xe1\xc8\x8f\xf0\x44\x78\xe6\xbf\x02\x5e\x08\xff\xf4\x01\x3c" + "\x9b\xbb\x8b\xe6\xa6\xb8\x94\xef\x4b\x7c\xff\xc6\x14\x9b\xd1\xcb" + "\x81\x63\xd0\xb6\x97\xd3\xdd\x46\xaf\x03\x63\xf7\x10\xe2\x92\x18" + "\x7f\xe5\x56\x37\x8f\x09\x91\xed\x2e\x04\x5f\xdb\x1b\x67\x90\x75" + "\x8f\xe2\x2d\xca\xdc\xe7\x49\x1e\xcb\x63\x26\x0c\xf6\xfd\x15\xf1" + "\xfd\x96\x67\x6c\xf2\xbb\x89\x05\xbe\xff\x98\xbe\x9f\x34\x92\x0c" + "\xfd\xb6\x28\x9b\x4b\x99\xdb\x41\x69\xf0\xc4\x3e\x1f\xc2\x9c\x5d" + "\x6d\x5a\x1f\x87\x53\xba\x0b\x94\x6f\x30\x99\x8c\x1a\xfd\x48\x5b" + "\x49\x21\x6f\x24\xfe\xd3\xe8\x66\x06\x4b\x5e\xdc\xd1\x16\xe5\xa1" + "\xb4\xfd\x24\x57\x88\x4e\x4f\xa4\xbb\x49\x2d\xca\xbc\x6d\xde\x5d" + "\x77\x45\x58\x72\x8c\x28\xef\xa1\xf4\x7c\x0f\xef\x72\xe4\x3d\x80" + "\xbd\x4d\xc4\xcf\x97\xfa\xee\xe2\x7d\x86\xd4\x51\x12\xef\x16\x29" + "\xa7\x7d\x28\x8d\xf2\x0a\xfb\x85\xda\x98\xf9\xfe\x35\xec\x20\x8f" + "\x49\x27\x7b\xb3\x73\x50\xf6\xf3\x6f\xa9\x6e\xc3\x68\x37\x1b\x66" + "\xd9\xf8\x0e\xca\x9f\x27\xf8\x75\x3d\x2d\x1f\x19\x76\x50\x15\x69" + "\xc5\xb7\x5f\xbf\x83\xf1\xae\x14\x72\x9c\x79\xcd\xba\x0c\x9a\xef" + "\x7e\xa4\x8d\xee\x40\xa3\x8e\x24\xda\xc7\xe4\x3d\x9f\x87\x66\xd7" + "\x7b\xc9\x3f\x61\x4f\xe3\xd4\x2c\x16\x6a\xf4\x98\x94\xbc\x0d\xe2" + "\xee\x5b\x97\x23\xe7\x23\xa1\x53\x47\xe5\x23\xdd\x64\xd0\x08\x1e" + "\xba\x3b\x4b\xf2\x88\x32\x15\xe5\xa1\x3e\xc7\xc6\x4f\xa8\xdf\xbe" + "\x77\x2e\xd3\x39\xec\x43\xf3\xf5\xba\xc8\xfe\x7f\x09\x60\x43\x34" + "\x21\xdd\xdd\x4e\xf5\xf9\xc8\xce\x54\x71\x30\x7c\x57\x6a\xf7\x54" + "\x57\xae\xc9\x5a\xf7\x9c\x65\xfd\xca\x9c\x15\xf7\x4f\xde\x90\x60" + "\x59\x97\x6d\x59\x27\xfc\x60\x8b\x88\xe5\x09\x96\xf5\x99\xe0\xe7" + "\xb3\x36\xdb\x56\x7c\xdd\x27\xb0\x59\x35\x4d\x3f\x23\x6d\xb4\x2c" + "\x10\x7b\xa6\x5a\x9d\xde\x96\x95\xc5\x55\xbe\xeb\xb5\x43\x3c\x7f" + "\xbe\xc6\x4b\x3c\x74\xce\x72\xcb\x70\xd0\xd7\x0b\xc6\x5d\x0b\x7b" + "\x28\x13\xed\x74\xbb\x94\x79\x82\x66\xda\xad\xdb\xec\x52\x16\x24" + "\xd3\xd8\xca\x33\x86\x1f\x98\x5c\xec\x55\x69\x7f\xac\x3a\x7d\xbe" + "\xa4\xc5\x7e\x90\x24\xe8\x6a\x4b\x7a\x1b\x3f\x78\x2b\xd9\xab\x52" + "\x08\x0e\xc2\xa7\x2d\xbb\x2c\xee\xa7\xf2\x3d\xf3\xdc\x74\x37\xdc" + "\xb7\xf7\x1e\x87\x1a\x33\xcf\xad\xbe\x1a\x57\x93\xff\x32\x33\xbc" + "\x89\xb1\x08\xb5\x60\x9e\xdd\xc2\x26\xbe\x93\xd7\x66\xb8\xa8\xfc" + "\xe0\x47\xef\xe4\x35\x19\xf8\xee\x59\xc9\x9d\x71\x93\x1b\x3d\x85" + "\xc2\xb6\x27\xca\xf0\xb0\xf7\xd1\x0b\xf0\x0f\x47\xbb\xc6\x3c\x9a" + "\xdd\x35\xe6\x9e\x43\x9e\x3d\x4f\x56\x3b\x6e\x99\xce\xe6\xdd\xce" + "\x2f\xbd\x77\x82\x64\x3f\x0b\x22\xde\x9b\x4b\xb2\xb7\xe9\x75\x1e" + "\xd3\xf4\xc6\xae\xbd\xf3\x6c\x64\xf3\xe6\xda\xde\x27\x6b\x7a\x62" + "\xee\x75\x1d\x47\x9a\x0f\x40\x73\x9f\xb6\x60\x1e\x4d\x62\x86\x6b" + "\xb7\xdd\x9a\xf4\x66\x8f\xdd\x50\x7b\x62\xb6\x94\x17\xa6\x61\xee" + "\x8a\x3b\x20\x3f\xb8\xf2\xde\x91\x13\x0c\x75\xb3\x37\x7b\xe6\x1b" + "\xde\x9f\xd5\xff\xfb\xfc\x31\xef\x25\x9e\x60\xdd\x64\x6f\x15\xbc" + "\xcd\xdb\x9f\x54\x30\xbe\x77\x41\xf5\xeb\x39\x1e\x03\x08\x5a\x43" + "\x7d\x53\x05\xcb\x3d\xc7\x6e\xf0\x5e\xb2\x86\xfe\x07\xf2\x5f\x23" + "\x3b\x86\xa7\xcd\xc2\x9e\x59\x9e\x43\xf8\x68\x35\x36\x60\x5f\x57" + "\x2f\x59\xc3\x1a\x16\x3b\x18\xbe\x4f\xf7\x3e\x62\x66\xf5\x19\x6e" + "\xe6\x4c\xa9\x66\xd7\x0c\x49\xec\xb7\x3f\xa9\x66\xfb\x40\x57\xef" + "\xbb\xc8\x22\xe4\x59\xac\x35\xcc\xdb\x6b\x0d\xf5\x6e\xb1\x12\x1d" + "\xce\xf9\x25\xeb\x48\xa2\xe5\xbc\x6b\xad\xe1\x0d\xee\x6a\x36\xb5" + "\x8d\x59\xaf\x19\x98\xf1\xda\x16\xeb\xc8\x06\x5b\x05\xca\x02\x91" + "\x06\xb8\x92\x6d\x2b\xb2\x79\x45\x70\x1a\x95\xc2\x16\x77\x28\x3f" + "\xa8\x1f\x79\x86\x8d\x21\xdb\x8a\x64\x1b\x8d\xec\xbb\xaa\xd1\x0b" + "\xaa\x7d\xd1\xf3\x6c\x79\x57\xc8\x16\x88\x87\x01\x1f\x25\x5b\xa4" + "\x3f\x70\x85\xfa\xac\x72\xeb\xc8\x54\x7a\xee\x8a\x9f\x4e\x34\xa6" + "\xda\x6d\x26\xdf\x43\xe1\xd4\x4e\xe0\xc4\xf0\xad\x9f\x03\x96\xf9" + "\xd6\x50\xa4\x03\x7f\x69\x1d\xed\xec\xf0\x30\xdf\x9d\x53\xd2\xa6" + "\xd8\x84\x8f\xd9\xe8\xaa\x3c\x66\xb2\xe7\xb1\x68\xcb\x4c\x82\xdd" + "\x23\x17\x7c\xaf\x4f\x49\xe6\x45\x4f\x01\x57\x87\xc6\xca\xb8\x87" + "\xeb\x2d\x0f\x31\x66\x99\x2e\xde\x37\x58\xee\xc3\x18\x46\x2f\x60" + "\x82\xfe\x15\xbc\xd2\xc3\x2b\xe5\x5c\x7d\x38\xfd\x5a\xd8\xc1\xd9" + "\x6a\xd1\x9f\x52\xd4\x6d\xa1\x16\xf2\x6b\x7d\x51\x79\x78\x1e\x2f" + "\xfd\xcf\x5c\xbe\xfb\x49\x61\xcf\x06\xe1\xef\x5f\x0b\x7b\x02\xfb" + "\xfc\x7f\xba\x50\x7e\xd2\x35\x25\xb4\x09\xbf\x66\x2d\x3f\xf9\x17" + "\x7a\xc0\x77\xf0\x56\x61\xd7\x56\xf8\xab\x41\xbf\x52\x31\x66\x3c" + "\xe6\x91\x1a\x61\xc3\xbd\x17\xf0\xd5\xfc\x79\x12\x3c\x08\x06\x6a" + "\xaf\x75\xa4\xe8\x6b\xaf\x35\x02\xf0\x25\x3b\xaa\xc6\xbc\x74\xe4" + "\xd9\xfb\xc8\x09\x7c\x1b\x7d\x2d\xfa\x11\x0f\xf9\x8d\x72\xda\xdc" + "\xcc\xb7\xe7\x11\xb2\x91\x1b\xfd\x62\x0e\x33\xa9\x63\x1e\xa9\xe1" + "\x7b\x1e\x01\xcf\x21\xd6\x0f\xa3\x76\xaa\xa5\xff\x2b\xe1\x1a\xe9" + "\xf9\xa3\x6d\x68\x5f\x13\x7e\xe0\x41\x7e\x78\xec\xda\xe4\x5b\x9b" + "\xf0\xb4\xa3\xad\x16\x5e\xb4\xce\x4a\xef\xf8\x66\x41\x9b\x5f\x21" + "\x38\x10\x3c\x34\x58\xec\x0f\xc0\xa2\x6a\x39\xd2\xed\x54\x8b\x3e" + "\x04\x0d\xfc\x70\x26\x2f\xca\x6c\x0b\x4a\x77\x32\x90\xee\xb5\x70" + "\x99\xae\xf9\xb0\x4c\xb7\x29\x0d\xe3\x90\x2e\xe1\xfd\xc8\x88\xaf" + "\xc3\xfb\x11\x25\x90\x77\x57\x8d\xcc\xfb\xfe\x6c\x99\xf7\x19\xca" + "\x7b\x6f\xdf\x36\x3d\x32\x2d\x90\x7e\x67\xab\x4c\xff\x6e\x87\x4c" + "\xff\x74\x42\x50\xba\xa7\x02\xe9\x2a\x6c\x32\x5d\xdd\x0e\x99\xee" + "\x67\x3b\xf1\x7d\xcf\x00\x6d\x29\x09\xe4\xf9\x4d\x97\xcc\xf3\x45" + "\xb5\xcc\x53\x18\x8b\xef\x27\xfb\xb5\xe5\xad\x40\xfa\x1a\xad\xdf" + "\x2d\x89\x32\x7d\x6e\x6d\x50\xba\x73\x32\x1d\x7d\xbf\x80\x74\x0f" + "\xa7\x5d\x0b\xfb\xdf\x4d\x32\xdd\xbf\x64\xd0\x7c\x04\xde\x1b\xa6" + "\x16\xfd\xb4\xf8\x5a\x58\x4a\x16\xca\x59\x8c\xb1\x89\xa5\x27\xc6" + "\x2e\x56\xb5\x4f\xc7\xb8\xce\xaf\xa3\xf3\x00\xb2\xff\x41\x77\x16" + "\xd5\x42\x0b\xab\x8a\x62\x11\x2f\x46\x31\xba\x5b\x17\xde\x5d\xb4" + "\x60\x76\xe0\x0c\x5a\xe2\x50\xc2\xc1\x2e\xe5\xa1\x5a\xe0\x61\xdf" + "\xc0\xf6\x53\x16\xd8\xfc\xb2\x2a\x15\xfb\xf9\x9e\xbb\xdc\x03\xd2" + "\x58\xbb\xee\x38\x48\x3a\x0d\x84\x7f\xd0\xce\xcf\xc9\xd6\x5c\x00" + "\xa7\x2f\x10\xba\x75\x64\xeb\x81\x64\x88\x5a\x9c\x90\x2d\xa8\x98" + "\xc7\xe0\xe7\x8e\x92\x7d\x3f\x92\x19\x62\xdf\xa9\x45\xdb\x48\xf7" + "\x62\xd8\x0b\x06\xb5\x06\xbf\xa3\xf8\x39\x5e\x20\x59\x62\x21\x9b" + "\xa7\xcb\x59\x07\x6e\xeb\xc2\x58\x17\xfb\x7f\xe6\x06\x64\x4d\x0b" + "\x13\x50\xd6\x8e\xa1\xeb\x03\x2f\x1c\x54\xfe\x2b\xfc\x38\x13\xed" + "\xb2\x77\x46\x92\x5d\x95\x7e\xe6\xb1\x6e\x41\x77\x2d\xdc\x86\x7d" + "\xba\x40\xd8\x90\xdd\xfd\x90\x4d\x8d\xc3\xbe\x73\x81\x85\x38\x73" + "\xdb\x58\x8d\xda\x66\xb0\xf7\xb0\xd0\x06\xaf\x4b\xa4\xaf\x51\x41" + "\xdf\xad\x09\xc1\xde\xbf\xf0\x45\xfb\x55\xad\xbc\xea\x74\x77\xfe" + "\x6a\xe9\x03\x9b\x68\x3e\xda\xaf\x80\xa3\x22\x84\x5f\xb4\x35\x44" + "\xf3\x2c\xac\xc7\x7b\x38\xa5\xbd\x76\xdb\x2d\xb6\x6b\xff\x96\xee" + "\xee\xd9\x3b\xcb\xd5\x73\xdb\xe4\xe4\xde\x98\x87\x6c\xbd\x7b\xe7" + "\xba\xbd\xff\x96\x9e\xe6\xbd\xed\x56\xb7\x2f\xe6\x5e\xb2\x65\x85" + "\xbd\xac\xc2\xf0\x86\x5a\x63\x78\x23\xcf\x61\xa0\x72\xdf\xc9\x3b" + "\x64\x78\x3b\xaf\xd1\xf0\xb6\x7a\xd4\xf0\x4e\x9e\x1d\xcf\x6a\xf2" + "\x91\x05\x3a\xf3\xd1\x9b\xde\xce\xab\xc5\x5e\xfa\xe8\x12\xc0\x6b" + "\x89\x2e\xd3\xe4\x0f\x78\x59\xc3\x21\x2f\x3b\x99\x75\x85\xb9\x23" + "\xa7\x9f\xc1\xaf\xc9\x3d\xe6\x91\x36\xf7\x98\x27\xab\x45\x9b\x63" + "\x16\xda\xa8\x8f\x74\xb7\xeb\x6d\x55\xb6\x59\x83\x07\x95\xf9\x7c" + "\x15\x9d\x77\xea\xf6\x75\x95\x45\x49\x5f\xb3\xaf\x6b\x90\xfe\xd9" + "\xfc\x36\x76\xff\x3b\xec\xeb\x6a\xbc\x3f\xd9\xd7\x05\xbf\xd9\xa8" + "\xf1\x9b\x0e\xcd\x96\x52\x04\xf1\x98\xc2\x96\x52\xb6\x43\xd8\x43" + "\x12\x36\x43\xf6\xcc\x15\xb4\x63\x77\xd1\xa2\x5c\x9d\x97\x24\x7a" + "\xc9\x57\x3e\xbd\x15\x3f\x17\xe2\x77\xbb\x94\xce\x50\x3d\x9e\xef" + "\xea\x75\x11\x4c\x7c\x3c\xe3\x7b\xda\x99\xf6\x1c\xdf\x9e\x7b\x6a" + "\x7c\x7b\x9e\x2c\x40\xdc\x6c\xfc\xee\xf7\x95\xf7\x22\x6f\x6f\x1b" + "\x7e\x1d\xf8\xb9\xf1\x43\x79\xbd\x1e\x5f\xb9\x97\xe1\x17\x8a\x5f" + "\x38\x7e\x11\xf8\x99\xf0\x8b\x56\xcb\x7b\xbd\x64\x2f\x90\xef\xf2" + "\x5a\x30\x0f\xcc\x7a\xb9\x01\x78\x2f\xba\x86\xfe\x27\x11\x2d\xc7" + "\x47\xff\x67\x05\x07\x6e\xe0\xaf\xdc\xe2\x11\xed\x7f\x65\x72\x23" + "\xc2\x16\xf7\xa4\x74\x17\x7e\xf3\xdd\x91\x3f\x4b\xc2\x8f\x9e\xc9" + "\xee\x3d\x0b\x18\xc6\xb3\xd8\x3d\x66\x81\xbd\xbb\x28\x19\xe3\xff" + "\xe3\x64\x29\x27\x4a\xce\xc0\xbb\x4d\x7b\x07\xbe\x79\x5c\xd8\xe8" + "\x77\x8f\x59\x98\x8c\x30\x70\xe4\x13\x22\x5d\x67\xcc\x02\x93\x76" + "\xdf\xa9\x00\xf1\x95\xae\xd0\x98\x26\xfd\x0c\x08\xe1\xc3\xfa\xfa" + "\x23\x1a\x4f\x3f\xdf\x0f\x5e\x57\xab\x97\xd9\x52\x57\xa7\x67\xa7" + "\xae\xcf\x5c\xb9\x6c\xc5\xfa\xfb\x2c\x93\x97\x5b\xac\x2b\xd7\x3d" + "\x97\xfa\xdc\x86\x15\x1b\x56\x08\xb2\x12\x51\xb7\xf7\x39\x0f\x8a" + "\xa6\xfb\x5e\x5e\xf0\x28\xa3\x97\x73\xbe\xf5\x69\x66\x58\x00\xbc" + "\xc2\x6f\x49\x77\xdf\xd0\x7a\x80\x1f\x6b\x77\x1b\x16\x74\xb8\x98" + "\x97\x68\xbf\xbd\x0f\xd9\x46\xb7\xce\x41\x9c\xc7\xb0\xa0\x0b\xf3" + "\x19\x6b\xc3\xd9\xea\x60\x94\x46\xd2\x82\xbf\x67\x75\x44\x0b\xee" + "\x9d\xe7\xa6\x34\x1c\x34\xa0\x78\xc6\xdc\xe3\x58\x88\x32\x38\xd6" + "\x14\xa5\x7d\x0b\x71\xa4\xeb\xc0\x63\x66\xb9\xf8\xd5\x5c\x5e\x87" + "\x32\xde\x5e\xe5\x36\x90\x2c\xec\x51\x2a\x17\xeb\x8d\xbf\x7a\x8b" + "\xed\x6d\xa4\x7d\x7b\x15\xf2\x63\x4d\x72\xac\xc5\xb7\x10\x6e\x51" + "\x1e\x9b\xff\x36\xf2\x0b\x7e\x07\x6d\x7c\x13\x71\xf9\x1b\x58\xa8" + "\xbe\xc6\x89\x5e\xf7\xaf\xf3\x8d\x44\xf7\xfe\xe8\xd7\xb4\xce\xf9" + "\xab\xc4\x67\x3d\x64\x7b\x1d\x79\xdf\x58\x25\x79\x40\xf0\x0f\x21" + "\xc4\xef\x11\x2e\x21\x1c\xe2\xcc\x95\x7c\x5f\x8d\xda\x04\x7e\x31" + "\x84\xf2\x7e\x45\xdf\xf6\x61\x0e\x4a\x7e\xe2\xb1\x04\x9d\xc6\xff" + "\xa5\x66\x53\x69\x54\x33\xe6\xcb\x52\x36\x11\x69\x87\x11\xfc\x08" + "\x4e\x74\xfe\xca\x8b\x92\x4f\xec\x23\x7b\x4c\x51\x2c\xbc\x77\x4f" + "\xfa\x2c\x29\x83\x7f\x2c\x53\xdf\x2f\xba\xa2\xd3\x67\x05\x8f\x9b" + "\x1c\x2f\xcb\x8a\x35\x74\x92\xb0\x5c\x1c\xd9\xa5\xaf\x5f\xbf\x61" + "\xf5\x0a\xcb\x8a\xf4\x65\x19\x16\xf1\xd9\xb2\x61\x3d\x92\xac\xcc" + "\x5a\x6f\x59\xbb\x69\x8d\x65\xf5\xfa\x95\xc4\x3d\xac\x58\xb7\x6e" + "\x83\x2d\x6b\x24\x93\x39\x2d\xab\x37\x64\x66\xad\xb4\xe1\x65\xfd" + "\x8a\x35\xcb\x2d\x62\xd4\xd7\xa3\xa8\xcc\x4c\x8b\x56\xc3\xfa\x8c" + "\xf4\x75\x34\x11\xd6\xfc\x0c\x89\x82\xf2\xf7\xe5\x2d\x22\xc8\x66" + "\x15\xed\x3f\x17\x95\xc7\xeb\x4f\x84\x02\xd6\xbb\xd3\x67\x91\xce" + "\x00\xc2\x75\x82\x27\x2c\x7a\x2c\x97\xce\x57\x5e\x88\x62\xa1\x9d" + "\x93\x27\x37\x76\x17\x3d\x3e\x5f\xef\x1b\xd9\x88\x17\x36\x12\x85" + "\xfd\xcd\xc7\x7f\x2b\xee\xe3\x61\x5d\x48\x5b\x67\x8f\x95\x49\x58" + "\x3c\x9e\x1d\x6c\x5f\x5b\xea\xef\x3c\x5e\x2e\xcf\x26\x1e\xaf\x23" + "\x7a\x4a\xb3\x69\xaf\x20\xcf\x5b\x94\x47\xdd\xf3\x64\x31\xf2\xd5" + "\x04\xf6\xdc\xc7\x8b\x29\xbd\x48\x57\xf4\xd8\x27\x7c\xcc\x02\xf0" + "\xb7\x8f\x67\x52\xbb\x06\xd9\x6b\x2c\x57\x51\xee\xe9\x1a\xc6\xe2" + "\xa3\x99\xf5\xea\xae\x99\x8e\xee\xa8\xe9\x6d\x3d\x85\x6c\x78\x0f" + "\xf6\x37\x8f\x81\x4d\xbc\x86\x79\xb1\x79\x1a\x0b\xd9\xba\x90\x19" + "\x6a\x56\xd5\x90\x8d\x57\x56\x37\xbf\x82\x39\xd3\x5c\xcc\xe9\x39" + "\xcc\xea\x1c\x2d\xac\xde\xfb\x9a\xf4\xbf\x90\x43\x3c\xc9\x13\xd3" + "\xc8\xee\x54\xfe\x56\xee\x7b\xf3\x77\xee\x61\x6f\xb4\xd7\x90\xdf" + "\x84\x89\x4e\xef\x67\x0e\x67\xee\x41\xe6\xcc\x76\x3a\xe8\x3e\xfe" + "\x45\x65\xf1\x4d\x6f\xe3\xdb\x88\x3a\xe4\x7b\x94\x0d\x47\x38\x92" + "\xea\x28\xde\xcb\x9b\x7e\x11\xc3\x9b\x7f\xb1\x97\xbb\x76\xc6\x08" + "\x3f\x08\x6d\x25\x31\xbc\xa3\x44\xb3\x2d\x47\xf3\xd4\xb6\x91\x99" + "\xdb\x95\xc5\x87\x84\x7c\x62\xae\x08\x8f\x43\x58\xd8\x6b\x77\x66" + "\xef\xa5\xf0\x78\x84\x6b\x65\xb8\x8a\xc2\x13\x10\x6e\x92\xe1\xf7" + "\x28\x1c\x8b\x70\x9b\x0c\x37\x30\x79\x37\x7d\xb1\x47\x86\x3f\xa6" + "\x30\x60\xff\x44\xb8\x63\x23\xb5\xf7\x53\x8c\xd9\x13\x63\xf2\xcf" + "\x32\x83\x33\xfb\xbc\x58\x0f\xef\xe4\x65\x90\xfc\x04\xeb\x61\xf1" + "\x8b\x34\xdf\x81\xab\x66\x85\x25\xd2\x73\xf1\x6c\xa3\x87\x0d\x07" + "\x9d\x39\x0a\xdf\x46\x10\xec\x06\xa4\x65\xde\xb8\x6d\xe2\x22\x2f" + "\x77\xf0\x57\x6e\x6d\xe3\x7b\x1e\x72\x03\x7f\xd2\x99\x39\xd6\xf9" + "\x0c\x56\x93\xe3\x11\x76\x76\x41\xdb\x63\x0d\x3d\xb1\x81\xda\xe4" + "\x06\xad\x3c\x88\xdd\x4d\x13\xdf\x33\x2b\x09\x3c\x68\xd3\x42\xab" + "\x97\x74\x10\xc1\x1f\x3c\x39\xe2\x64\x06\xd1\x0f\x0b\x1f\x57\x0f" + "\x4e\x4e\x54\xf3\x53\x18\x8f\xbb\xb5\x6d\x61\x06\x77\x60\x2f\x53" + "\xa4\xac\x9a\x7f\x86\xfa\x3f\x13\xf5\x4e\xbe\xb5\x4d\xdd\x94\x41" + "\xfe\x9b\x18\xe1\x98\x3c\xda\xd7\x37\x02\x9f\x6c\x49\x31\xfa\xf6" + "\x2c\x4c\x3e\x99\x71\x6e\x68\xbe\xd0\x94\x27\xc3\x07\xd5\x33\x42" + "\x9b\x7c\x3c\x85\x79\x51\x8f\x17\x7d\x25\x1a\xe2\x0d\xb5\xd6\x00" + "\x5a\xa6\xed\xf5\x67\x9a\x86\xf1\x4d\x29\x46\xf4\x69\x9a\xd3\x7a" + "\x85\x35\xf4\xd0\x5a\x79\xb2\xf6\x64\x36\x63\xf3\xb2\xbd\x0e\xa3" + "\x5b\xd8\x07\x36\xd9\x56\xb1\x9b\xf9\x98\x59\x49\xed\xca\x8f\xcd" + "\x8f\xe6\xa2\x0f\xe8\xfb\xdb\x2d\x4d\xa1\x2a\xfa\x31\x55\xc2\x8d" + "\xf2\x79\x01\xdb\x26\x9d\x27\x1a\x62\xfb\x25\xdd\xb8\x3e\x85\xd1" + "\x3d\xc1\x37\x41\xb7\xa8\xbd\x29\x46\x15\xfb\x12\x7d\x3b\x69\xbd" + "\xc0\xa8\x4e\x0d\xd6\xc2\x26\x3b\x8f\x03\x9c\x51\x3f\xd9\x25\xd6" + "\xe1\x8a\xb4\x5e\x5f\x6f\xc6\xc0\xe3\xbf\x77\xa1\x05\xed\x6b\xe4" + "\xe5\xbd\x8d\x03\xd3\xba\xbd\x6f\x6a\xf3\x23\x1c\x3f\x33\x7f\x39" + "\x3d\x19\x73\xc0\x2a\xfc\x6b\xee\x9d\x6b\xd3\xcf\x80\xb1\xde\x30" + "\x47\x7e\xfc\x62\x4d\x5e\xdb\xc0\x76\x59\xed\x25\xd2\xaf\xd9\xb0" + "\xcf\xb8\xd1\x47\xfe\x7a\xaf\x90\x8d\x6b\xf4\xa1\x6b\x88\x63\xfa" + "\xe3\xe6\xc1\xc6\x94\xca\x9f\x77\x3b\xef\x1d\x5a\x79\x29\x83\xd2" + "\xbf\x80\x6d\x23\x37\xf5\x36\xf6\xf0\xb9\x8a\xe4\x5b\x9e\xfa\x90" + "\x60\x45\xfb\x48\xce\x1f\x99\xc1\x83\x3d\xf4\xb5\x27\x8b\x0d\x09" + "\x69\x8c\x7c\xa0\x15\x9c\x6a\x3c\xc1\x16\x2d\x60\xf9\xf5\x19\x97" + "\x99\xee\xaf\x8c\xc7\xcc\x73\xff\xea\x49\xb7\x81\xce\x8b\xc8\x3f" + "\x99\xe0\xf1\xf7\x3e\x62\xf9\x8f\x8f\x69\xef\x5d\x60\x7a\xfd\x63" + "\xb7\xc1\xdb\x99\x62\x11\x36\xb6\xc1\x4f\xe4\x67\x70\xd5\x7f\x86" + "\x44\x7e\x18\xec\xf1\xb3\xc8\xff\xf3\xe9\xe4\x46\x71\x77\xfb\x74" + "\xca\x09\x76\xba\xb9\x82\xd5\xb5\x9e\xa5\xfb\x86\x2f\x9f\x4e\xb1" + "\x13\x5d\x39\xda\x0b\xda\x71\x1f\x68\x47\xac\xd7\x11\xaa\xa9\xa4" + "\x56\x3f\x47\xa2\x33\x25\x9d\x6e\xf4\x62\x8d\x56\x6a\x3e\xcb\xbc" + "\x45\x3f\x76\x54\x6a\x67\x4a\xe4\xcb\xec\xa5\x8d\x2c\xee\x25\x83" + "\x9a\x32\xd0\x19\xd2\xe8\xe7\x84\x6d\x17\xb3\x1a\x59\x52\xab\xfb" + "\x34\x7b\xf4\x39\x0b\xfb\xdf\xe8\xfb\x49\xeb\x50\xd7\xe4\x53\xc2" + "\x56\x86\x17\xf3\xce\x8b\x39\xe7\x05\x3c\x31\x06\x3b\x31\x6e\x03" + "\xf2\x64\xfa\x18\xf4\xe6\xeb\x63\xf0\xd3\x74\x31\x06\xe0\xe5\xb6" + "\x3c\xa5\x8d\xc1\x27\x18\x83\x56\x8c\x41\x21\x2b\xf8\x60\x71\x1d" + "\x5b\x94\x8c\x31\xe8\xb8\x4c\xf6\xd9\xa5\xcf\xb8\x2c\x09\x7b\x31" + "\x16\x9f\xb8\x85\x3e\x27\x8d\xc1\xe1\x9f\xc8\x31\x78\xe3\x27\x6e" + "\xd0\x43\xb7\x26\xfd\x0a\x61\xdf\xa6\x14\x0b\xf9\xde\xe1\x85\x69" + "\xe4\xdf\x5a\x8e\x45\x2f\xc6\xa2\x57\x8e\x45\xde\x73\x18\x8b\x33" + "\x4d\xc2\xc6\xcb\xe9\xe6\x3a\x56\x97\x56\xcd\xea\x81\x97\x30\x16" + "\xe9\x34\x2e\x24\x93\xf0\x6d\xb1\x46\xbd\x98\xc3\xa2\x2b\x73\x98" + "\x59\x1f\x0f\xb5\x17\xe3\x91\x83\xf1\xe8\xc1\x78\x78\xfc\xe3\x11" + "\x2d\xc6\xe3\x82\x36\x1e\x3d\xa4\x9f\x86\xf1\xe8\xc1\x78\xf4\x60" + "\x3c\x0a\xe5\x78\x10\x9e\x7f\xb4\xcb\xc8\xd5\xbf\x59\x59\x55\xfb" + "\x00\xe3\xb1\x45\x1b\x8f\x4f\xfe\x9e\xf1\xf8\x69\xc2\xd7\xc7\xe3" + "\x27\xa6\x6f\x1a\x8f\xc0\x9a\x78\x7a\x18\x8d\x47\x6f\xb5\xb6\x26" + "\x6e\xa3\x35\x51\x60\x88\xc7\x5e\x44\x30\x3d\xd5\x78\x4c\xac\x09" + "\xf4\xb5\xe0\x57\x4f\x7a\x0c\x75\xad\x18\x97\xe5\x18\x97\x9c\xc0" + "\xb8\xc8\xf1\x98\xe7\x3e\xf4\xb1\x84\xbf\xe5\x61\xda\x33\x68\x6d" + "\xd0\xf8\x60\x9c\xb0\x7e\x06\xf2\xf7\x17\x7c\xd6\x8a\x32\x55\x5a" + "\x27\xb4\x46\x68\x3d\xd4\x67\x9c\x15\xfe\xd3\x4f\x27\xd7\x32\x3a" + "\x73\x3d\x9d\x72\x0c\x63\x55\xc1\x7c\x9b\x30\x36\x1b\xb1\x4e\x14" + "\x36\x89\xfc\xfe\x9d\x4e\x29\x26\x7a\xc1\x84\x39\x3f\xc2\x87\x71" + "\xf2\x75\x9b\x47\xee\x04\xaf\x75\x60\x63\x60\xdd\x54\x69\x3e\x8e" + "\x79\xd8\x8f\x1d\x88\x0f\xf5\x62\x8c\xb0\x76\xfa\xac\x19\xbf\xef" + "\xe3\xbf\x5a\xd9\xfe\x16\x16\x7e\xc3\x4a\x39\x46\xbe\xa0\x35\xb3" + "\x70\x25\xad\x99\x02\x8c\xd1\x1f\x87\x38\x46\x4b\x84\x1c\x00\x3c" + "\xa8\x85\x47\xf6\x36\x62\x9f\xc4\x18\xfd\xb4\x7a\xb0\x31\xf2\x1d" + "\xbc\x35\xdc\x67\x9a\xde\x48\x76\xe2\xd5\xb5\x8b\x15\x15\x7c\x54" + "\x0f\xf8\xd7\xd3\x6e\x2f\xcb\x05\x0f\x91\x73\x96\x85\x39\x17\x7f" + "\xc4\x9c\xae\xa3\x8c\x6c\x2e\x93\x2c\x9d\x7c\x2f\x38\xbd\x47\x81" + "\xaf\x9e\x74\x50\x78\xbf\x08\xbb\xd9\x96\xa7\x59\x88\xf0\x07\x9a" + "\x52\xcd\x76\x62\x7e\xbe\xfe\x93\x6a\x83\xba\x7b\x56\x32\x37\x91" + "\xcf\x18\xe6\x20\xbd\xf0\xfc\xcd\x2c\xa2\x3e\xa3\x8e\xec\xce\x7d" + "\x46\x76\x84\x1b\xba\x50\xa6\x9b\xf7\xf8\xb0\x67\x54\x15\xf2\xa3" + "\x64\x47\x7f\x6a\xb6\xa0\xc5\x69\xbe\x7c\x4e\xb4\x08\xc9\x0c\x1d" + "\x79\x2f\x81\xf6\x7a\x5a\xd8\x69\x46\x9c\x52\xbf\x8a\x74\x24\xd2" + "\x9f\xa0\x76\x09\x9b\x8a\x5e\xf9\x9c\x4a\x7e\x13\x63\x7e\x1c\xf2" + "\x56\x9e\x3b\xd4\x0e\xbe\x18\x34\x1a\xd2\x2d\x9d\xc6\x25\x8f\x68" + "\x76\x9e\xf1\x08\xd9\xad\x3b\x3f\x23\xcc\x9e\x43\xfe\xfd\xc8\x26" + "\x3f\xed\xd9\xe9\xc3\xc8\xa7\x31\xe6\xac\x95\xc7\xcc\xb5\xd5\x3c" + "\xe3\x36\x04\xf6\xe5\xa5\x4b\x30\x6f\xad\xf3\xac\x3c\x9f\x7c\x17" + "\xbc\x8d\x7e\xf1\xbd\xf7\x38\x5e\x6b\xf1\x08\x9c\xf2\x1f\xcf\x14" + "\x1b\x38\xe6\xb4\x07\xf8\xa1\xee\xe3\xff\x14\x3e\x5a\xcf\x2b\xa9" + "\xab\x3f\x48\xf1\x32\xaa\xff\x89\xdb\xe9\x9c\x64\x69\xf5\x35\x43" + "\x8b\xed\x5a\x58\x4a\x6c\x7e\x6b\xc0\x3f\x65\xb0\x1f\x4a\xc2\x33" + "\xaf\x3f\x83\x32\x09\xcf\xb4\x14\x18\x24\x6e\x49\x22\xf9\x66\x78" + "\x7f\xdc\x52\xdf\x71\x81\xe5\x61\x1e\xd7\x67\x54\x0b\xff\x12\xa3" + "\x81\xdf\xd5\x2d\xc0\x27\xbd\xd6\xa8\xfd\xc0\x27\x84\x07\xaa\x80" + "\x3f\xd4\x2d\xe6\x91\xa5\x3d\x2c\x41\xc7\x23\x44\x7b\xd1\xf3\x69" + "\xcc\x51\x63\x2d\xe2\x30\x4e\x2a\xf0\x3a\xf0\x89\x75\x5f\x0e\x8b" + "\xdb\x87\x39\xba\x9f\xf0\x08\xe8\xe2\x47\x6d\xc0\x23\x9b\x80\x47" + "\x36\x0a\x3f\xc1\xe6\x2a\x83\xc4\x1f\xbf\x6b\x29\x36\xd8\x75\x3f" + "\xe1\x02\xbe\x69\x4a\x03\xcd\x8f\xb4\x02\x71\xbf\xcd\x47\xfb\xd3" + "\x96\x94\x90\x86\x2e\xcc\x91\xbd\x4f\xd6\x50\x9c\x58\xb7\x9b\x32" + "\x46\xaa\x72\xae\x25\x11\x4c\x0e\x5c\x64\x89\xc2\x97\xe6\x25\xf3" + "\xc8\xb2\x35\x2c\xa1\xea\x22\x8b\xab\x5a\xc3\xac\x58\xaf\x86\x2a" + "\xb4\x61\xe9\x73\x26\x26\xfc\x38\x84\xa5\x50\xfc\x80\x7e\x1c\x40" + "\x57\x9b\xab\x68\xcd\xac\xb5\xfa\xdb\xe4\xb5\xaf\x4c\xf3\x01\x76" + "\xd2\xee\x52\x9a\xf4\x21\x6f\x9a\x60\x95\x74\x7e\xda\x4e\xa9\x5b" + "\x64\x21\x1f\xf3\xc3\xdb\x95\xb4\xef\xf3\x5d\x56\x8b\x2d\x87\xec" + "\x17\x6b\xdf\x40\x7b\xaa\x18\xab\x29\x05\xac\x40\x8d\x7c\xa1\xcd" + "\x99\x0d\xda\x89\xec\x2c\x0f\x69\x1d\xa6\x89\xbb\x25\x3e\xfb\xca" + "\xe5\xd4\x5f\x75\xd7\xca\xcc\x03\xed\x2c\x91\xff\x1c\xe3\xb1\x0a" + "\x7d\x6d\x67\x71\x95\xed\xe8\xeb\x26\xd9\x57\xdd\x2f\xba\x5a\xd8" + "\x92\x8d\x6f\xd7\xf5\x81\xe4\xfe\x39\xf9\x40\x1a\xeb\x01\x0e\xbb" + "\x91\xdf\xc2\x58\x7d\x87\xb0\x79\xd1\xed\xf4\x9e\x65\x54\x2f\xc9" + "\x90\x9c\x97\xc5\x9c\xbe\x9b\xe6\xb2\x5a\x9d\x9e\x9c\xda\x8c\xb9" + "\xdd\x9d\x41\xf2\xb4\xe4\xb7\x5b\x88\xcf\x97\x34\x9f\x4b\x59\xba" + "\x9c\xe8\xb4\x77\x10\x47\x73\x3f\x68\xce\x2f\xa7\x39\x4f\xdf\xc5" + "\xbc\x47\x3e\x67\xf3\x39\x46\xe5\x05\x97\x43\xe3\xaf\x97\x75\x5e" + "\x79\x66\x1c\x95\x45\x73\x81\x64\x3d\xb4\xd6\xe4\xd8\x1f\x25\xbd" + "\x6e\x33\x8f\xb9\xd7\x25\xc3\x6e\xb2\x5d\x62\xa2\x39\x20\xe6\x0a" + "\xf0\x37\xd9\x44\xe5\x3c\x25\x04\xf3\x8c\xda\x39\x12\xe3\x9d\xa8" + "\xcf\x0b\xc4\x45\xf7\x9f\x1b\xa3\xb7\x99\x88\xa7\x89\xa6\xf7\x6f" + "\x3b\x3f\x86\x36\x7e\xcf\x98\x07\xd5\x59\x8b\xbb\x95\xc6\x62\x22" + "\xe1\x4d\x5f\x67\x10\xce\xec\x90\x38\x93\x70\x92\x8e\x37\x05\x6e" + "\x12\x76\xf8\x8f\x92\x7e\x6b\x86\x68\xe3\x10\xf1\x66\x7d\x47\x00" + "\x6f\x3e\x6a\x0b\xc2\x9b\x1d\xbc\x07\xf4\xfb\x00\x78\x73\xd9\xb8" + "\xbe\x78\x73\xd9\x4d\x7d\xf1\xe6\xb3\xdb\xfa\xe3\xcd\xaf\xe3\xcc" + "\x65\x4f\x0f\x84\x2f\xc1\xc7\x4c\x6c\x57\x9e\x4d\x1c\x1c\x57\x2e" + "\x2b\x1e\x3a\xae\x5c\xfe\x62\x5f\x5c\xb9\xac\xee\xff\xbb\xb8\x72" + "\xc5\x9d\x7d\x70\xa5\xe9\x5b\xe2\xca\x76\x81\x2b\xa3\xf9\xdf\xb0" + "\x26\x34\xfc\x51\xb5\x6a\x10\x5c\xb9\xea\x1b\xd6\xc2\xcf\x07\xc3" + "\x95\x2b\x9e\xef\x8b\x2b\x57\x1c\xed\x8b\x2b\x57\xac\x0e\xe0\x4a" + "\xed\xdb\x3f\x04\x57\xae\xd8\xf1\xcf\xc1\x95\x2b\x76\x08\x5c\x79" + "\x91\x70\xe5\xb3\xe9\xdf\x8c\x2b\x97\xd9\x07\xc6\x95\x88\x17\xb8" + "\x72\x99\x3d\x80\x2b\xcf\x7e\x03\xae\xfc\xd9\xbc\x21\xe0\xca\x68" + "\x81\x2b\x4d\x83\xe0\xca\x55\x80\x95\x36\x2f\xc4\xdc\xeb\x37\x37" + "\x34\x5c\x69\xf6\xe3\xca\x6f\x31\x3f\x86\x36\x7e\x3f\x1b\xf4\x8e" + "\x16\xe1\x4a\xd5\x2e\xe9\x4b\xc2\x95\x3c\x4a\xc3\x95\x99\x5e\x96" + "\xf3\x67\xe0\xc8\x33\xed\x42\x17\x43\xe8\xe2\xe2\x97\xfb\x14\xe1" + "\xa2\x79\xb6\x37\x00\x2f\xa7\xab\x46\xe0\x26\x71\x9f\x6a\x01\xe1" + "\xaa\x1a\xa4\xad\xf0\xd3\x9d\x02\x77\xfe\x59\xc3\x9d\x4b\x34\xdc" + "\xb9\xf4\xbf\x80\x3b\x7f\x42\x63\x99\xf1\xc4\x35\x83\x8e\x3b\x77" + "\x01\x77\x66\x08\xfa\x81\xce\x82\x25\xee\xfc\xf9\x87\x7a\xbb\x48" + "\xa6\xe9\xcc\x7a\x89\xc9\x76\x5d\xfe\x3a\x1e\x7d\x58\x94\xf7\x2b" + "\xc7\xaa\x0e\xe6\xc7\xa5\x4b\x02\xb8\x14\x65\x6d\x1b\x1c\x8f\x66" + "\x34\xfa\xf1\x68\x21\xf0\xe8\xa7\x41\x78\x14\x7c\xd3\x7f\x10\xce" + "\x03\x1e\xed\x16\x78\xf4\x77\x1a\x1e\x5d\xf9\xf9\x07\x4b\x80\x47" + "\x1f\xd6\xf1\xe8\xca\x68\x4f\x61\x8b\xcd\x53\xf4\xcd\x78\xb4\x5b" + "\xe0\x51\xdb\xff\x79\x3c\x7a\xa2\x1f\x1e\x05\xef\x4a\xbe\xd1\x07" + "\xc4\xa3\xfa\x7c\x14\x78\xb4\x20\x80\x47\x05\x5c\x57\x6d\x6d\x48" + "\x03\xdc\xd3\x6c\x82\x77\xf3\xe3\x51\x5b\x8d\xc4\xa3\x74\x17\x93" + "\xe4\x27\xeb\x81\x47\x31\xff\xf2\xeb\xd1\x6f\xac\x17\xb4\xd1\x44" + "\xf8\xf5\x00\xd6\x0c\xc1\xc8\x8f\x4f\x57\x61\xcd\x10\x8e\xe9\xc4" + "\x9a\x01\x1e\x5d\x7a\xc5\xc4\xc4\x7a\x29\x4a\x89\x13\x38\x66\x20" + "\x1f\x62\xba\xbe\xec\xa0\xf8\x74\xd5\x1f\xfb\xe2\xd3\x9f\x87\xf7" + "\xc5\xa7\xab\xde\x0a\xe0\x53\xed\x1b\xe1\x53\x8c\x19\xe0\xd3\x46" + "\x38\xf5\xef\xc3\xa7\xab\xce\xf8\xf1\xa9\x41\xc3\xa7\xab\xbe\x19" + "\x9f\x8a\xf3\xc1\x41\xf0\x69\x30\x6e\x18\x1c\x9f\xae\x3a\x13\xc0" + "\xa7\x3f\xff\xb5\x1f\x9f\x36\x0d\x86\x4f\x33\x9a\x06\xc6\xa7\x88" + "\x17\xf8\x34\xa3\xc9\x8f\x4f\x9b\x06\xc0\xa7\x0f\x07\xe3\xd3\xcc" + "\x97\x25\x3e\xad\xd1\x6c\x6c\xf4\xba\x1a\xba\x30\x3f\x68\xcd\x65" + "\x55\x08\x9c\xaa\x02\xa7\x92\x5f\x55\xf2\x2b\x43\x3a\xf0\x03\xe1" + "\x54\x89\x73\x5d\x8c\xf0\x2a\xad\xcd\xfc\x85\xe0\x77\xb1\x17\x01" + "\x26\x62\xef\xd5\xe1\x77\x20\x08\xbf\xa6\x6e\x36\x11\x6d\xd7\x67" + "\xae\xa8\xfa\x5c\xe9\xb4\x92\x0e\x6f\x9f\xb9\x32\xb4\xb1\xcc\xac" + "\x1e\x0c\xb7\x0e\xc6\xbb\x7f\x40\xbc\xfb\x13\xcc\xb0\xe5\x09\xe0" + "\xd7\x14\xe2\xdd\x0f\xf5\xe3\xdd\x0f\x7d\x9d\x77\xff\xe3\xf5\xf1" + "\xe8\x90\x78\xf7\x27\x69\x0c\x57\xef\xef\x8b\x47\x57\xbf\xdc\x17" + "\x8f\x3e\x77\x13\xb5\x4b\xe2\xf1\x43\x03\xf3\xee\x62\x9d\xaf\xbe" + "\xe0\xe7\xdd\x9b\xfa\xe2\xcf\x00\xef\x6e\xab\x1f\x1c\x8f\xae\x31" + "\xf7\xa1\x47\x97\x6a\x78\xf4\x19\x0d\x8f\x3e\x13\xc0\xa3\xa7\x3f" + "\xd2\xe9\xd1\xb5\x77\x9f\x6a\x0a\xc6\xa3\x6b\x96\xf8\xf1\x68\xf3" + "\xd7\xf1\xa8\x8e\x43\x09\x9f\x52\x39\x24\xcb\x3a\x0c\x3c\xfd\xe6" + "\x33\x36\x83\x94\xd5\xa6\x11\xec\xc2\xfb\xcb\x6a\xeb\x3b\xae\xb0" + "\xbc\x25\x84\x4f\x2b\x04\x3e\x35\x2a\x2c\x1d\xb8\x6f\x34\xe9\xfc" + "\x57\xd2\xd9\xfe\x46\xe9\x97\x89\xe4\x4b\xea\x26\xe9\xe3\x50\x97" + "\x33\xa1\xbf\xe2\x4c\xff\xe9\xb3\x1a\x4e\x25\xdf\xe5\x98\x73\xfb" + "\xae\x02\xa7\x6e\x1c\x80\x36\xdd\x02\x9c\x9a\x13\x44\x9b\x62\xed" + "\xff\xee\x99\xfe\x38\x75\xed\xa9\x06\x9a\x2b\x84\x53\xfb\xf0\xf1" + "\x87\xfe\x07\xf0\xf1\xb6\x49\x7d\x71\xa9\x6d\x71\x5f\x5c\x6a\x1b" + "\x11\xc0\xa5\xda\xb7\x7f\x08\x6d\x6a\xb3\xfc\x73\x68\x53\x9b\x25" + "\xc0\xc7\xdb\x7c\x7e\x5c\x7a\x66\x30\x5c\xba\xc6\x32\x30\x2e\x5d" + "\x63\x91\xb8\x74\x8d\xc5\x8f\x4b\xcf\x0c\xc0\xc7\xf7\xc1\xa5\xcf" + "\x7d\x2e\x71\xe9\x21\x49\x9b\x36\xe9\xb4\xe9\xa1\xff\x0b\xf9\xf8" + "\xe7\x5c\x43\xe5\xe3\x3f\xe8\x90\xf8\x93\xf0\x93\x8e\x43\x03\x7c" + "\xfc\xa1\xc1\xf9\xf8\x6f\xc0\xa1\x43\xa2\x45\x05\x0e\x5d\xf7\x79" + "\x5f\x1c\xba\xee\x5c\x5f\x1c\xba\xf1\x89\xfe\x38\xf4\xeb\xf8\x73" + "\xfd\xe4\x81\x70\xa7\xe4\xe3\x37\x86\x0e\x8e\x37\xd7\x27\x0f\x1d" + "\x6f\x66\xad\xee\x8b\x37\xd7\xef\xfe\xff\x07\xde\xdc\xa0\xf4\xc1" + "\x9b\xa6\x6f\x89\x37\xff\x5b\x78\xfa\x0d\xfd\xe4\x9f\x1b\xfa\xc9" + "\x3f\x37\x04\xc9\x3f\x37\xfc\x03\xe5\x9f\x1b\xfe\x49\xf2\xcf\x0d" + "\x29\x01\x1a\x74\xe3\xdd\xdf\x8c\x37\xd7\xa7\x0c\x8c\x37\x11\x2f" + "\xf0\xe6\xfa\x94\x00\xde\xfc\x26\x1a\x74\xd3\xb8\x21\xe0\xcd\xff" + "\xe1\x3c\xfd\xa6\xeb\xca\x3f\x07\xe2\xe9\x09\x6f\x0a\x7c\xd9\xd4" + "\x8f\xa7\x7f\x22\x98\xa7\x3f\x14\xe0\xe9\xe7\x4b\xbc\xe5\xf4\xda" + "\xfb\xf2\xf4\xff\x70\x3c\x9a\x7d\xbb\xc7\x2f\x0f\xfd\x57\xe0\xd1" + "\xec\x3b\xa9\x6f\x1e\xbf\x3c\x74\xcb\xaf\xf5\x76\x49\x9e\x7e\x17" + "\x93\xed\x1a\x80\xa7\x17\xfa\xc6\xd9\x5b\xfd\x3c\x7d\x53\x7f\x9e" + "\x7e\x4b\xfa\xe0\x38\x35\xfb\xe0\x80\x3c\x3d\xf1\xdf\x02\xa7\xda" + "\x04\x4e\xbd\xba\x37\x18\xa7\x6e\x7e\x57\xe0\xd4\x87\x74\x9c\x9a" + "\xdd\xe6\xc1\xda\xf4\x84\x7d\x33\x4e\xa5\x72\x02\x38\x35\xe3\xbf" + "\x07\xa7\x3a\xbe\x3d\x4e\x0d\xbe\x6f\xfa\x3b\xf4\xdd\x8f\x53\x05" + "\x8c\x73\x9e\x6e\x48\x23\x9c\x9a\xd1\x8f\xbf\x3f\x34\x30\x7f\x7f" + "\x8a\x19\x08\x3e\x3a\x7f\x4f\x63\x20\xf0\xcd\xff\x51\xfe\x3e\xe7" + "\x37\x7d\x71\x6b\x4e\x5b\x5f\xdc\x9a\xb3\x3f\x80\x5b\xb5\x6f\xff" + "\x10\xfe\x3e\xe7\xc8\x3f\x87\xbf\xcf\x39\x12\xc0\xad\x5b\xca\xbf" + "\x19\xb7\x66\x1f\x1e\x18\xb7\x22\x5e\xe0\xd6\xec\xc3\xd7\xc5\xad" + "\x0f\x05\xe3\xd6\xdc\x6d\x3a\x6e\x0d\xf0\xf7\x98\x1f\xb4\xfe\xb2" + "\xec\x7f\x3f\x7f\xff\xc3\x7f\x36\x7f\x9f\x5b\x30\x24\xfe\x7e\x2f" + "\xf0\x2c\x78\xf1\x2d\x1f\x82\xbf\xff\x91\xc6\xdf\x37\x57\xf7\xe3" + "\xef\xab\xbf\xc6\xdf\xe7\xfe\x48\xc3\xa9\x58\x53\x02\xa7\x3e\x73" + "\xe8\xef\xe7\xef\x1f\xa3\x31\xdc\xba\xb5\x2f\x4e\xdd\xba\xad\x2f" + "\x4e\xdd\x16\x49\xed\x92\x38\xbd\x7a\x60\xfe\x5e\xac\xf3\xad\xf5" + "\x7d\xf8\x7b\xb4\xef\xeb\xfc\x7d\xc1\xbb\x7d\x70\xea\xd2\x60\x9c" + "\xba\xd5\xd3\x87\x4e\x45\xbf\x08\xa7\xfe\xea\x53\x89\x53\x5f\xfb" + "\x34\x08\xa7\x3e\xfa\x9a\x86\x53\xf3\x6f\x3f\xb5\x38\x18\xa7\xe6" + "\xcd\xd6\x71\xaa\xc0\x97\x4b\x3d\x86\xfc\x94\xaf\xeb\x9d\x08\x7d" + "\x1f\xd2\x05\x42\xd9\x74\xbf\x8c\xca\x7c\xfd\xd3\x8c\x6f\xd6\x37" + "\x49\x19\x58\xdf\xc4\x99\xe5\x62\x75\xad\x76\xa1\x67\x52\x49\x7a" + "\x26\xdb\xd8\xa4\xca\x1e\x79\xcf\x5f\xd8\x49\x1c\xe4\x8e\xff\xd3" + "\x4f\x05\xf0\x2c\xe9\x64\xed\x23\x9d\xac\xab\x52\x07\x08\xe3\xfd" + "\xf5\x7b\xfd\x3a\xdd\x04\x7c\xf0\xdb\x4f\xfb\xe3\xd9\xfc\xb7\x1a" + "\x68\xfe\x2c\xc9\xe8\xc7\xf3\x57\xff\x0f\xe0\xf9\x0b\xc6\xf4\xc5" + "\xaf\x05\xf3\xfb\xe2\xd7\x7c\x5f\x00\xbf\x6a\xdf\xfe\x21\xb4\x6b" + "\x41\xf4\x3f\x87\x76\x2d\x88\x0e\xf0\xfc\x05\x5f\xf9\xf1\x6b\x63" + "\x10\x7e\xfd\x34\x18\xbf\xe6\x31\x81\x5f\x3f\xed\x8f\x5f\xf3\x98" + "\xc4\xaf\x79\xcc\x8f\x5f\x1b\xfb\xf1\xfc\x9f\xf6\xc7\xaf\xdb\xfe" + "\x5f\xf6\xbe\x3e\x2e\xaa\x2a\xff\xff\x30\x83\x86\x85\x32\xb8\xe0" + "\xa2\xa9\x8d\x4f\x85\xf9\x10\x1a\x10\x6e\x5a\x58\x58\x98\x28\xd8" + "\x6a\xe1\x33\x14\x16\x96\x0f\xa8\x68\xa8\x3c\xf9\xb8\x68\x8a\xa0" + "\x60\x58\xa0\xe8\xea\xae\x96\x18\x7e\x57\x77\xb1\xb4\xc6\xd4\x16" + "\x8d\x27\x5b\xdd\x45\xc3\x1c\x0d\x5d\x34\xb4\x51\x51\x10\x66\xe6" + "\xfe\x3e\xe7\x9e\x3b\x9c\xb9\x33\xf7\x0e\x73\xef\x20\xe2\x6f\xfd" + "\x63\x5e\xca\x7d\x38\xf7\xdc\xcf\xe7\x7d\xdf\xe7\xfd\xf9\xdc\x73" + "\x3e\xf7\x0c\xcb\xaf\x80\x05\xbe\x76\xcd\x6d\x3a\xe6\xaf\x68\x6d" + "\x31\xff\x52\xab\xfa\x47\x36\x63\x7e\xcc\xa9\x33\x09\xa7\x62\xce" + "\x32\xf1\x2a\x8d\xf9\x73\x45\x63\xfe\xa6\x78\x55\x92\x56\x65\x79" + "\x75\xd9\x19\x3e\xaf\x2e\x3b\xcb\xe7\xd5\x55\x53\x2c\x79\xd5\x9a" + "\x53\x97\x77\x16\xe2\x53\x12\xf3\xaf\x72\x15\xe7\xd2\xe5\x41\xd2" + "\xb9\x74\xc5\x02\x3e\x97\x2e\x4f\xf9\xdf\xe5\xd2\x95\xed\x78\x5c" + "\xaa\xb2\x93\x4b\x5b\x24\x0f\xb0\x32\x92\xcf\xa5\x2b\x33\xf8\x5c" + "\xba\x72\x24\xe5\x52\x6e\x5f\xb3\x70\xe9\xca\x88\x07\xc3\xa5\x2b" + "\x23\xa8\x56\x5d\x35\xac\x69\x2e\x5d\x1e\x22\xcc\xa5\xb0\x9d\xe5" + "\xd2\xe5\x21\x94\x4b\xcf\x37\xc1\xa5\x7f\xea\x21\x81\x4b\xf9\x79" + "\x00\x4b\x2e\x7d\xe0\x79\x80\x3f\xa9\x25\xe5\x01\x4c\x5c\x3a\xd6" + "\x3a\x0f\x80\xf9\x95\xcd\x03\x80\xbd\x4c\x1c\xc6\xe6\x01\x82\x08" + "\x97\x95\xea\x53\x78\x79\x80\xe6\xe7\xd6\x94\x41\x75\x8d\xf9\xd4" + "\x65\xc0\xad\x29\x7e\x2c\xb7\x36\xe6\x53\x3f\x2e\x36\xf5\x8b\xe4" + "\x01\xd6\x20\xd2\x2f\x81\x3c\xc0\x2b\x6c\x7b\x2b\x79\x79\x00\x33" + "\xae\x85\xb6\x12\xc4\x79\x36\x65\x0f\x2f\x0f\x70\x89\xf2\xec\x5d" + "\x3c\x47\x1d\x78\x90\xe5\xd9\x4e\xe6\x3c\xbb\xfa\x3c\xcb\xb3\xaf" + "\x98\x78\x36\x45\x57\x0b\xcf\x66\xad\x54\x9e\xc5\xeb\x08\x7e\x8e" + "\x78\x30\x3c\x5b\x20\x81\x67\xcd\x72\x03\x07\xc1\x1e\x8d\x3c\xcb" + "\xda\x7d\xcd\xa2\x92\xc9\x98\x67\x23\x2c\x72\x03\xb9\xc2\xb9\x81" + "\xe3\x0f\x22\x37\xb0\xe6\x14\x9f\x6f\x3f\x76\xe6\xf3\xed\x9a\x83" + "\x94\x6f\xb9\x7d\xcd\x92\x1b\x58\x53\xf6\x60\x72\x03\x6b\xca\x28" + "\xdf\x7e\x9c\xd7\x34\xdf\xa6\xec\x17\xe6\x5b\xd8\xce\xf2\x6d\xca" + "\x7e\x9b\x7c\xfb\x8a\x39\xdf\xae\xcd\x31\xf1\x2d\xcd\x0d\xe4\x72" + "\xb9\x81\x94\xa6\x73\x03\x15\x22\xb9\x81\x11\x0f\x3a\x37\xb0\x36" + "\x5b\x4a\x6e\xe0\xde\x26\x32\x6f\x7f\x09\x9e\xb7\x3f\x05\xf8\x37" + "\xec\x47\xb0\x41\xd3\xf3\xf6\xe3\x4d\xf3\x4f\x23\xb2\x38\x9e\xcd" + "\x12\xcc\x0d\x9c\xac\x12\xcf\x0d\x9c\x3c\x6d\x3e\xff\x74\xdd\x66" + "\xfe\x7b\xab\x75\x39\xa6\xf7\x56\x27\xff\x8d\x79\x36\x9d\xfd\xce" + "\xb6\x31\x23\x24\x8d\xd4\xca\x4e\xdf\x81\xfb\x29\x34\x8f\xff\x2b" + "\xa3\xf9\xbb\xac\x75\xf7\x1a\x73\x05\x65\x98\x6f\xb3\x90\x91\x89" + "\x6e\x8b\x6b\x75\xb3\xb9\x82\xb7\x30\xf6\xd2\xc7\x9b\xf3\xee\x37" + "\xe7\xcc\x79\x37\xb5\xb7\x89\x77\x0d\xc0\xbb\x87\x2f\x65\x91\xfc" + "\xeb\x44\x32\x37\x75\xcf\x44\xb3\xb9\xa9\x3f\x7e\xc7\xf1\xee\xfa" + "\x1e\x27\xb4\x70\xff\xb6\xe6\x4f\xc1\xf9\x7b\xcf\xd9\x3b\x07\x35" + "\x4b\x70\xee\x14\xc7\x4f\x82\xf3\xa7\xa0\xaf\xaa\x1c\xee\x59\x35" + "\xc0\x73\x9a\x63\x36\x7f\x2a\x7b\x31\x3c\xcf\xdc\xba\x12\x9b\xf3" + "\x50\x27\xd2\x79\xa8\x4c\xc6\xa8\x22\x3c\xbe\x19\x33\x43\xd2\xea" + "\x99\x68\x25\xe3\x31\xaa\x08\x5f\xbf\xa1\x01\xc6\x9d\x57\xc3\x95" + "\x24\xae\x1b\x95\x0f\xdc\xd3\x81\xd8\x7d\xfd\x64\x03\x8c\x35\x06" + "\x18\x6b\x8c\x19\xa3\xf2\xf5\x58\x9b\x6c\x1a\xb5\x3f\x1b\xe2\x3c" + "\xfd\x32\xf6\xfb\x85\x8f\xa7\x42\xac\xb7\x15\xc7\x79\x37\xe0\xd9" + "\x48\xf2\x56\xe0\xfe\x98\x78\xd4\xad\x0a\xee\xe3\x86\x6d\x2d\xa7" + "\xff\x8d\xf2\xa8\xe6\x8d\x93\x70\xcd\xb4\xb1\x25\x18\xbb\xe1\x74" + "\x4d\x01\xab\x99\x45\xe6\xca\xe2\xbe\x90\xfa\x88\x80\x85\x66\xc8" + "\x49\x98\xf7\x87\xcf\xeb\x69\xbb\xf9\xbc\x9e\x56\xc1\xe7\xf5\xb4" + "\x74\xca\xeb\xdc\x3e\xe0\x75\xf0\x1b\xab\xa3\x61\xec\x93\xa9\xa3" + "\xd3\x76\x99\x78\xdd\xc8\xf1\xfa\x16\x3b\x78\xdd\xa6\x8e\x36\xe3" + "\x25\x71\x5e\x4f\xdb\x45\x73\x12\xe9\x2b\x05\xe7\xc8\x9e\x33\xe7" + "\xf5\xd4\xfe\x2c\xaf\x9f\xb3\xe4\x75\xd8\xce\xf2\x7a\x6a\x7f\xd1" + "\xf5\x04\xe7\x2c\xdf\xa7\x6d\x98\xc1\xf2\x7a\x39\x37\x47\xb6\x4c" + "\xc2\x7a\x82\x72\xc2\xe9\x26\x2e\xc7\xf9\xaa\x07\x9b\x93\xd8\x10" + "\x2d\x25\x27\xc1\x72\x79\x35\xe1\x72\xcc\x8d\x26\x3e\xb7\x67\x3d" + "\x41\x53\x7c\x6e\xd2\xcd\x98\xcf\xc5\x74\x33\x9f\xcf\x37\xce\xe0" + "\xf3\xf9\xc6\x59\x7c\x3e\xff\x64\x06\x9f\xcf\x3f\x89\xb6\xe4\x73" + "\x6b\x2e\xdf\x78\x58\x88\xc7\x63\xde\xc2\x39\x8a\x4f\xbc\xc4\x39" + "\x7c\x63\x95\x74\x0e\xcf\xb8\xfc\x3f\xc7\xe1\x2a\x4b\x0e\xcf\x54" + "\x63\x0e\x32\xac\xb2\xe0\xf0\x0f\x38\x0e\xe7\x78\x64\xeb\x35\x4e" + "\x0b\x5b\x72\x78\x35\xdc\x47\x13\xf1\xb8\xfe\x57\x4b\x0e\xdf\xe4" + "\xc9\xe3\x70\x55\x13\x1c\xfe\x01\xc9\x83\xf0\xe6\xe5\x8a\xe4\x42" + "\xe0\x3e\x7a\xe7\x88\x68\x73\x93\xcd\xcc\xfb\xc3\xe7\xf0\x4d\xb3" + "\xf8\x1c\xbe\x29\x97\xcf\xe1\x9b\xc6\x53\x0e\xe7\xf6\x35\x8b\x36" + "\xdf\x34\xb3\xd9\xb5\xb9\x09\x1f\x36\x39\x7c\xd3\x4c\xaa\xcd\x3f" + "\x19\xd9\x34\x87\x6f\xd4\x09\x73\x38\x6c\x67\x39\x7c\xa3\x4e\x74" + "\x9d\x83\x15\x87\x67\xf5\x95\xc0\xe1\xfc\x5c\x88\x89\xc3\xb9\x5c" + "\xc8\x56\xb3\x5c\x88\x61\x19\xc9\x85\xe4\x5c\x23\xd8\xe8\xe0\x44" + "\x70\x0a\xf8\xf1\xda\xa2\xb0\x1d\xbb\xe5\xc8\xca\x83\x64\x79\x4b" + "\xc9\x83\xb0\xfc\x8d\xd7\x38\x4c\x00\xde\x2e\xb3\x73\x8d\x43\xb0" + "\x69\x8d\x43\x9a\xc8\x1a\x07\x8e\xcf\xa7\x3a\xc0\xe7\xec\x1a\x87" + "\xcd\x43\xf8\x39\xe6\xcd\xc3\x4c\x39\x66\xc2\xe7\x39\xa3\xf9\x7c" + "\x9e\x13\xd2\xb8\xe6\x01\x38\xbf\x34\x66\x83\xd5\x9a\x87\x46\x6e" + "\x67\xf3\xa0\x9b\x73\x34\x6f\x55\xa2\x46\x7e\x9f\x4c\xf9\xfd\x8a" + "\x53\xb6\x81\xc7\xed\x97\xcc\xb9\x7d\xf3\x31\x1e\xb7\xff\x9c\xc5" + "\x9f\x1f\x71\x29\xc6\x8c\xdb\x4d\x6b\x1e\x3e\x3d\x72\xa2\xa2\x09" + "\x6e\x87\xf3\xed\x5f\x23\xd6\xbc\xdc\x6e\x5a\xdf\x20\xc8\xed\xe6" + "\xeb\x1b\xcc\xe6\x3f\x60\x6e\x67\xbf\x71\xe1\x69\xc1\xed\x4b\xa2" + "\x15\x86\xa3\xf0\x3c\x00\xaf\xe3\x67\xc4\xc0\x00\xb7\xb3\xf6\xfe" + "\x54\x6f\xce\xed\x0d\xcb\x08\xb7\x7f\x76\xcd\x71\x6e\x6f\xd4\xc3" + "\xe6\xdc\xfe\x1a\xe6\xf6\xcf\xee\x91\xf5\x17\xc9\xf6\xad\xbf\xb0" + "\x98\x9f\xf1\x99\x1d\xf9\x17\x9b\x1c\x2f\xd0\x2f\x3e\xc7\x67\x8f" + "\xe5\x73\x7c\xf6\x0a\x3e\xc7\x67\x0f\xa1\x1c\xcf\xed\x6b\x16\x9d" + "\x9e\x1d\xf6\x60\xf2\x2f\xd9\x61\x94\xe3\x73\x06\x34\xbd\xf6\x62" + "\x73\x91\xf0\xdc\x0c\xd8\xce\x72\xfc\xe6\x22\x9b\x6b\x2f\x78\xf9" + "\xee\x2d\xdd\x04\xd7\x5e\x94\xb5\xdc\xdc\x0c\x73\xac\x58\xe6\x5f" + "\xe4\xe7\xbe\xb7\x74\x95\x9a\x7f\xc1\x6b\x2f\x96\x9c\x31\x5b\x7b" + "\x51\xd1\xf4\xda\x8b\xf8\xf1\x76\xe6\x5f\x6c\xcc\xcd\x38\x19\x66" + "\x3e\xdf\x6d\x6b\x67\x3e\xbf\x6f\xed\xd6\xc8\xef\x6f\x62\x7e\xff" + "\xf3\x20\x3e\xbf\xff\xd9\x07\xf7\x53\x68\x2d\xc6\x57\xbc\xf7\x8a" + "\x5b\x17\xf1\xe7\x6a\x58\xe4\x5f\xde\xc4\xd8\xdb\x7e\x91\xc7\xef" + "\x3f\x9b\xf3\xfb\xd6\x1d\x42\xda\x1d\xe7\xbd\xd9\x39\xc5\x53\xcd" + "\xd6\xb4\x8d\x31\xcd\x7f\xcb\xcd\x3b\x11\x0e\xf7\xaf\x15\x99\xeb" + "\x36\x95\xcc\x75\x63\xe7\xb6\xe1\x3c\x38\xb4\xf5\xe5\xd4\x18\x45" + "\x62\x04\x63\xc4\x73\xdd\x2c\xe7\xb9\xe1\xb9\x6f\x78\xae\x5b\x71" + "\x74\x9a\xe8\x3c\x37\x8c\x4d\xb1\xb9\x6e\xd0\x6f\x0f\x96\xeb\x2f" + "\x72\x5c\xcf\xcd\x75\xcb\x5e\x48\xe7\xba\xf1\xb8\x5e\x60\xfe\xf0" + "\xc1\x9f\x93\x85\x75\x7c\x12\xe5\xfa\x7a\xac\xe3\x5f\xb4\xc8\xc5" + "\xb0\x3e\xc8\xad\x6a\xd1\x5c\x0c\xcb\xf5\xdb\xce\x97\x60\x1c\x4f" + "\x8e\x11\xc8\xc5\x58\xcf\x71\x6e\xb9\x5c\xcc\x76\x3f\x3e\xc7\x6f" + "\x8f\xe6\x73\xfc\xf6\x6e\x94\xe3\xb9\x7d\xcd\xc2\xf1\xdb\x7d\x1f" + "\x4c\x2e\x66\xbb\x2f\xcd\xc5\xfc\xd9\x5d\x70\xfe\x1d\x2f\xc7\xbe" + "\x75\x8f\x70\x8e\x7d\x2b\x37\xff\x6e\xeb\x1e\xd1\x35\x21\x56\xef" + "\x34\xff\x7c\x87\xe4\xd8\x65\xac\x09\xa9\x68\x6d\xb9\x98\x3f\x5b" + "\x7d\x6f\xad\xa9\x5c\x0c\x3b\xb7\xf9\x0c\x9e\x1f\x22\x6d\x4d\x48" + "\x53\xdc\xde\xa8\xdd\x6d\xbc\xc3\xe4\x73\xfb\x8e\x3b\x7c\x6e\xdf" + "\x71\x8f\xcf\xed\xbb\x9d\xf8\xdc\xbe\x1b\x59\x72\xbb\x35\xaf\xef" + "\x1c\x29\xc4\xe9\x31\x6f\xe2\x5c\xcc\xae\x7c\x71\x3e\xdf\x19\x2b" + "\x9d\xcf\xff\x92\xf0\x3f\xcd\xe7\x2a\x4b\x3e\xff\x4b\x41\x8b\xe6" + "\x65\x58\x3e\xff\x6b\x1e\x8f\xcf\x55\x4d\xf0\x79\x8b\xe5\x65\x76" + "\xb5\xe1\xf3\xf9\xae\x00\x3e\x9f\xff\xf5\x3a\xe5\x73\x6e\x5f\xb3" + "\xe4\x65\x76\x39\x3f\x98\xbc\xcc\x2e\x67\xaa\xd9\x77\x5d\x6c\x9a" + "\xcf\x77\xc6\x0b\xf3\x39\x6c\x67\xf9\x7c\x67\xbc\xe8\x7c\x6a\x2b" + "\x3e\xdf\x7d\x44\x02\x9f\x0b\xce\x51\x69\x1d\x79\x99\xdd\x1a\xa9" + "\x79\x19\xb1\x75\x2a\x98\xdf\xe9\xfc\x14\xb3\x75\x2a\x81\xa6\x75" + "\x2a\xc9\xfc\xf9\x29\xcd\xce\xed\x9f\x9f\xe2\x73\xfb\xe7\x67\xf8" + "\xdc\xbe\xf7\x26\x9f\xdb\xf7\xea\x4c\xfd\x24\x79\x99\x65\x56\xeb" + "\x56\xf8\x3c\xff\x85\x9f\xe6\xcd\x4a\x24\xc4\xf5\xd0\xd6\x36\x71" + "\x9e\xff\x62\xb2\x18\xcf\xe3\xf9\x2a\x5f\x4c\x8d\x16\xe0\xf9\x3d" + "\xd3\xff\x7f\xe0\x79\xb1\x79\x28\x6c\x1c\x04\x1c\x8f\xf9\x9e\xe5" + "\x77\x8e\xeb\x31\xcf\x1b\xbe\x16\xca\xd1\xec\xc9\xbd\x5f\x3c\x2f" + "\x9e\xa3\xc9\xcb\x29\x99\xcc\xf1\xbc\x3d\x6b\x68\x8e\xf0\x73\x34" + "\xd9\x1f\xdc\xef\x1c\x4d\xde\x1d\x3e\xdf\xef\xf5\xe6\xf3\x7d\xde" + "\x79\xca\xf7\xdc\xbe\x66\xd1\xef\x79\x35\x0f\x26\x47\x93\x57\x43" + "\xf9\x7e\xef\xa9\xa6\xf9\xfe\x8b\x28\x61\xbe\xff\x82\xab\xcd\xf6" + "\x45\x94\xfd\x7c\xff\x65\x23\xdf\x5b\xaf\x9f\x49\x96\x3f\x47\x66" + "\xf8\x83\xce\xd1\x7c\x29\xca\xff\xb6\xea\x63\xc8\xcf\xd1\x70\x6b" + "\x12\xdf\x11\xae\x8f\x71\xc2\xc6\x1c\x99\x13\x45\xe6\x5c\x9f\x7f" + "\x98\x3f\x17\x31\xff\x88\x69\x2e\xe2\x89\x12\xcc\xf5\xfb\xaf\xf2" + "\xb9\x7e\x7f\x95\x58\x8e\xe6\xa0\xd1\x7c\x4e\xe2\xbe\x6e\xfc\x1c" + "\x4d\x2e\x3f\x47\x33\x06\x63\x6f\xff\x66\x71\xae\xdf\x17\xcc\x9f" + "\x03\x4e\xd6\x28\xee\x9e\xca\xcd\x01\x9f\x6a\x36\x07\xfc\x8d\xed" + "\x1c\xd7\xff\xdf\xf4\xc2\x32\x3d\x92\x32\x0f\xd1\xf1\xb9\xde\x29" + "\x82\x73\x10\xd9\x31\xc0\xc6\x3c\xc4\x69\x67\x55\x78\x4e\x73\xdc" + "\x96\x85\x66\xf3\x10\x6d\xd4\x33\xe6\xf1\xff\xd4\x18\x51\xfe\xbf" + "\xc7\x50\xfe\x37\xbe\x40\xf3\x36\x46\xac\xf3\x59\xbf\xfc\x5f\xee" + "\xfd\xca\xdb\x08\xe5\x49\x34\xaf\x60\xfe\xff\x5b\x26\xd1\xf9\xd1" + "\xad\x2c\x6f\xf3\xb7\xeb\x7c\xde\xdf\xaf\xe6\xf3\xfe\xdf\xce\x50" + "\xde\xe7\xf6\x35\xcb\x5c\xf4\xbf\x55\x3f\x18\x9d\xff\xb7\x6a\x9a" + "\xb7\xd9\x7f\xa2\x69\xde\xdf\x17\x26\xcc\xfb\xfb\xc2\x08\xef\xef" + "\x0b\xb3\x99\xb7\xe1\xcd\x8d\x3c\x90\xe7\x70\xde\xc6\xa4\xf3\x1f" + "\xf8\xba\x9e\x03\x7b\xa4\xe4\x6d\x1a\xd7\xa4\x3b\x94\xb7\x11\xe6" + "\x7b\x93\xb6\x3f\x61\xe3\x9d\x2b\x9f\xef\xff\x9e\xc7\xe7\xfb\xbf" + "\xef\xe3\xf3\xfd\x57\xc5\x7c\xbe\xff\xaa\x48\x28\x6f\xc3\xe7\xfa" + "\x7f\x08\xf2\x7c\xcc\x18\x9c\xb7\xf9\x2a\x5e\x9c\xe3\xff\xd1\x5f" + "\x3a\xc7\x17\x8c\x7c\xc4\xf1\x16\x1c\xaf\xb2\xe4\xf8\x82\x15\x2d" + "\xaa\xf1\x59\x8e\x3f\xb8\x88\xc7\xf1\xcd\x98\xcb\xb1\x67\x3d\x89" + "\xb8\xb6\x3f\x68\x31\xff\xfd\x2b\x8b\xf9\xef\x07\xcd\xe6\xbf\x7f" + "\xe5\xdc\x7c\x1c\x7f\xb0\xf9\xe7\xbf\xdb\xc5\xf1\x07\xcd\xe6\xbf" + "\x7f\x95\xd7\x34\xc7\xff\xc3\x57\x98\xe3\x61\x3b\xcb\xf1\xff\xf0" + "\xb5\xa9\xed\x79\x1c\xff\x75\xfa\xfd\xc8\xe5\x3c\x98\xf5\x46\x5f" + "\xa7\x49\xc9\xe7\xd8\xaa\x3b\x22\x9a\xcf\x09\x30\xe5\x73\x62\x44" + "\xf2\x39\xcd\xc5\xf9\x87\xb6\xf1\x39\xff\xd0\x4e\x3e\xe7\x6b\xce" + "\xf0\x39\x5f\x73\x9a\x9f\xcf\x99\x67\x95\xcf\xe1\xf3\xff\xe1\x36" + "\x9a\x31\xe6\xf9\x9c\x5c\xb3\x7c\x8e\x66\xa5\x38\xff\x1f\x16\xe5" + "\xff\xbb\x2c\xff\x47\x08\xf0\xff\x37\xff\x23\xfc\x1f\xe1\x00\xff" + "\x7f\xf3\x00\xf8\xff\xdb\xa5\x24\xc7\x63\x67\x9d\x94\x83\xd2\x73" + "\x3c\x8e\x8d\x03\xdf\x9e\xe5\x8f\x03\x1a\x57\xfe\x38\xf0\xed\x11" + "\x3a\x0e\x70\xfb\x9a\x65\x1c\xf8\xb6\xfc\xc1\x8c\x03\xdf\x96\xd3" + "\x71\x40\x73\xa0\xe9\x71\xe0\xb0\xc8\x38\x70\x98\x1b\x07\x0e\x4b" + "\x18\x07\x8e\xec\x14\xcf\xf1\xc4\xc8\xcf\xf1\x0c\x79\xd0\xeb\xa0" + "\x8e\xec\x90\x94\xe3\xd9\x34\x3a\xa6\x08\xd7\x48\xb9\x88\x14\x4b" + "\x22\x4d\x39\x1e\x8d\x45\x8e\x47\x63\x95\xe3\x59\x74\x91\xe3\xff" + "\x10\x6e\xbd\xe9\x18\x07\x6a\xa4\xb0\xdf\x9f\xfe\x6e\x1b\x7f\xde" + "\xfc\x77\x2c\xff\xd3\xfa\x7d\xdf\x0f\xc2\xfd\x22\xe3\x8f\xc6\x46" + "\x0d\xd4\xef\x6e\xf2\x72\x3a\x21\x42\x35\x52\x8e\xf3\xe6\xdd\xf0" + "\xd7\x9b\x1e\xed\xca\xe3\xfb\x31\x64\xbd\xe9\xe7\x42\xef\x69\x1b" + "\x6b\xf2\x1f\x1b\xc0\xd6\xe4\x6f\xac\xe5\x77\x34\xc2\xae\x5a\xd2" + "\x53\xb9\x5a\xd2\x3f\x3f\x80\x5a\xd2\xf6\xd6\xe4\xff\xd9\xb2\x7e" + "\xdf\xb1\x13\xa5\x45\x1a\x54\x82\x31\x32\xd9\xb2\xf6\xa9\x46\x78" + "\xed\xbe\x82\x5b\xbb\x3f\xfb\xfe\xd4\x41\xc1\xfd\x61\xc7\xfc\x8e" + "\x1b\xb5\x79\x89\x3a\xb6\x3f\xf8\x5b\xdf\xe0\xe7\xd1\x45\x80\x55" + "\x23\xe6\xd3\x79\x98\x4f\x8f\x27\xb3\xc7\x5e\x04\x2c\x74\x54\xab" + "\x31\x8e\x53\x8d\xc8\x35\x66\x21\xe6\xd6\xe3\xec\xbc\x2f\x90\x11" + "\xc0\xad\xe4\xb8\x84\x8b\x8c\xc1\xd0\xd1\x5b\x0d\xfd\x7f\x6c\xef" + "\xec\xb2\x36\x25\xda\x1a\x78\x2e\xae\xb1\xdf\x73\x2d\xd5\xd7\x6a" + "\xb0\x2f\xbe\x99\x5d\xe6\xcc\x00\xff\x6e\x7d\x0f\xb9\x48\x7b\x4e" + "\x8f\x87\xb0\x7a\x06\x8f\x7b\x1d\x37\x56\xe3\x3a\x20\x26\x6d\x65" + "\xfc\x8d\xe6\xb7\x72\xc0\x3e\x46\x86\x8c\x7d\xd3\x66\x10\xde\x80" + "\xeb\xc5\x81\x2d\xd9\x39\xb6\x98\x37\xd8\x6f\x58\x01\x6f\x6c\xb9" + "\x45\xdf\x63\xe3\xf6\xb1\x8d\x48\x1e\xe5\x7b\x3a\xff\x45\x2b\xc6" + "\xad\x47\x7b\x0b\x73\xeb\xd1\xde\x84\x5b\x8f\xf6\x6e\xe4\x56\xad" + "\x40\x1e\x85\x37\x8f\xfd\x7b\x6e\xfe\x8b\xc6\x42\x63\x6b\x1e\xc2" + "\xfa\x28\xdf\x4b\x9a\xff\xc2\xf2\xe9\x4c\xc2\xa7\x98\xaf\x4c\x9c" + "\x4a\xf3\x28\x1a\xd1\x3c\x4a\x53\x9c\x2a\x69\x0d\x3f\xcb\xa9\xff" + "\xbc\xc3\xe7\xd4\x7f\xde\xe3\x73\xea\x0f\x8b\x2c\x39\xd5\x9a\x4f" + "\x0b\x87\x08\x71\x29\xa9\x8f\xf2\x83\xb7\x38\x8f\x16\x46\x89\xf1" + "\x28\x3b\x3f\x7d\xaa\xd9\xfc\xf4\x46\x1e\x3d\xb1\x80\xcf\xa3\x85" + "\xbb\xec\xe5\x51\xf6\xdb\x26\x3f\xb7\xc0\xb7\x4d\x64\xf3\x68\x8c" + "\x05\x8f\x9e\x74\xa7\x3c\x6a\xf9\x7d\x93\x26\x78\xf4\x83\xfb\x53" + "\x03\x85\xc7\xa3\x46\x1d\xdb\x1f\xf5\x6c\xb6\xaf\x99\x7c\x1e\x3d" + "\x59\x28\xce\xa3\x27\xa7\x53\x1e\x25\xc7\xdd\x5f\x1e\x3d\x99\xc1" + "\xe3\xd1\x0f\xcc\x78\xf4\x57\x1a\x43\xe0\x39\x16\x8d\x3c\x3a\xcb" + "\x8c\x47\x3f\x68\x8a\x47\x4f\x66\x60\x1b\x11\x8d\xfa\xc3\x84\xa6" + "\x79\xb4\x70\xa6\x30\x8f\xc2\x76\x96\x47\x0b\x67\x52\x1e\x15\xd0" + "\xa8\x3c\x1e\x2d\x1a\x26\x81\x47\x5b\x79\x6d\x94\xa2\xa1\x92\x72" + "\x15\x74\x4d\xa7\x75\x8d\xd4\x29\xe6\x6b\x82\x0a\x2c\xbe\x7b\x52" + "\x60\xf5\xdd\x93\x45\xa6\x35\x9e\xc1\x1c\xaf\xbe\xe1\x00\xaf\xb2" + "\x6b\x3c\x8b\x47\xf3\xe7\x9e\x14\x8f\x35\xcd\x3d\x21\xbc\x5a\x76" + "\xd9\xd4\x2f\xfa\xdd\x93\x02\x1b\x35\x52\x8b\xb7\xf1\x6a\xa3\x04" + "\x9b\xd7\x46\x29\xcb\x14\xaf\x91\x5a\x5c\xc8\xab\x8d\x72\x72\x57" + "\xe3\x77\x4f\x2c\x6b\xa4\x52\x8e\x2d\x39\xcb\x72\x6c\x63\x0d\xaa" + "\x12\xd7\xc6\x1a\xa9\x4d\xac\x0b\xc2\xed\xec\xbd\x14\x7d\xff\x39" + "\x56\x23\x81\x63\x79\xdf\x3d\xb1\xac\x31\x55\x9a\x50\x5a\x58\x80" + "\x4a\x22\x0a\x04\x6a\xa3\x16\x3c\xd0\x6f\x9f\xe0\x7e\x09\x73\x6d" + "\x99\x13\x9f\x6b\xcb\x7c\xd9\x63\xcf\x0b\x71\x6d\xe9\x29\xca\xb5" + "\xe4\xb8\x84\xf3\x16\x5c\x5b\x21\xc2\xb5\x30\xae\x6e\xbd\x22\x95" + "\x6b\x71\xba\x18\xb8\x72\x19\xc7\xb5\xd7\x9a\x9b\x6b\xcb\x10\xe5" + "\xda\xb2\xe3\x4d\x7f\x63\xaa\xb8\x4c\x78\x5d\x4e\x71\x19\xe1\xda" + "\xe2\x32\x9b\xdf\x98\xe2\xcd\xf9\x38\x75\xc0\xf4\x8d\x29\x9a\x0f" + "\x28\xe0\xf2\x01\x0f\xf3\x37\x51\x4e\xed\x97\x9a\x0f\xf8\x01\x62" + "\x77\xbc\xee\x72\x09\xfe\xe6\xd4\x64\xfc\x4d\x94\x7c\x8b\x7c\x40" + "\xbe\x75\x3e\x60\x82\x6d\x8e\x95\x94\x0f\x60\xd7\x5d\xfe\xb8\x8f" + "\xcf\xb1\x3f\x1e\xe0\x73\xec\xbf\x47\x9b\xd6\x59\xe2\xfe\x88\xd7" + "\x4c\xfd\x97\x53\x63\x3e\xa0\x82\xcf\xad\x34\x1f\x70\xc6\x20\xce" + "\xb1\xff\xe2\xe7\x7f\xdf\xd8\xc5\x5b\x67\xf9\xf9\x25\xf3\x3a\xd4" + "\xa6\xfa\x53\xa7\x47\x9e\x38\x6d\xce\xb1\xff\x8a\x79\x98\xea\x50" + "\x37\xd6\x9a\x6a\x62\x2e\xb7\x75\x1d\xea\xd3\x97\x4b\x0b\xf3\x11" + "\x5e\xdb\xc6\xf2\x2d\x2f\x37\x90\xff\x60\x72\x03\x85\xf9\x22\xb9" + "\x81\x33\x33\xf8\x3c\x7b\x26\x9b\x3d\xf6\xac\x10\xcf\x9e\x19\x42" + "\x79\x96\x1c\x97\x70\xd6\x82\x67\xcb\x9b\x53\xd3\x9e\x89\xbe\xbf" + "\xb9\x81\x33\xd1\x34\x37\xf0\x6f\x3b\xd6\x3f\xfe\xcb\x57\x98\x67" + "\xff\xc5\xe5\x5d\xff\x45\xf3\xae\xe5\x02\xdf\x4b\xe1\xf1\xec\x7f" + "\xdc\x4d\xeb\x1f\x59\x4d\x5b\x61\xd2\xb4\xf9\x0f\xe1\xf7\x52\xfe" + "\xa3\x92\x9a\x1b\xc0\xeb\xdc\x31\xb7\x62\xee\x32\xf1\x2b\xcd\x0d" + "\xe4\x8b\xe7\x06\x9a\xe0\x57\xe9\xdf\xee\x2b\x77\xe7\xf3\x6b\xb9" + "\x27\x9f\x5f\x7f\xda\x66\xc9\xaf\xd6\xdc\x5a\x3e\x5e\x88\x57\x49" + "\x6e\xe0\xa7\x30\x71\x4e\x2d\x4f\x16\xe3\x54\xb6\xa6\xdf\x25\x3a" + "\x47\x9a\x72\xea\xd9\x1c\x3e\xa7\x96\x1f\xb3\x97\x53\x1f\xc8\xf7" + "\x52\x64\x73\x6a\xb4\x05\xa7\x9e\x1b\x42\x39\xd5\xf2\x9b\x29\x4d" + "\x70\xea\xfd\xca\x13\x98\x73\x2a\x4f\xbb\x9e\x3b\xcc\xe7\xd4\x73" + "\x3a\x71\x4e\x3d\xb7\x8e\x72\x2a\x39\xee\xfe\x72\xea\xb9\x43\xf7" + "\x37\x4f\x70\xee\x10\xd5\xae\x3f\x2d\x6d\x9a\x53\xcb\x53\x84\x39" + "\xb5\x3c\x85\x70\x6a\x79\x8a\xfd\x6b\xca\x2b\xa6\x4b\xe0\xd4\x56" + "\xfe\x2d\x95\x8a\x28\xc9\x79\x02\x9c\x6f\xc5\x5c\x5a\xe1\x58\xed" + "\x90\x38\x53\xed\x90\x20\x8e\x63\x5f\x73\x94\x63\xcf\x2f\xe0\xcf" + "\x69\x38\xbf\xc8\x34\xa7\x81\x70\xec\xc5\xce\xfc\xef\xa3\x5a\xd7" + "\x0a\xe1\xd7\x50\x3d\x7f\xa2\x31\x4f\x80\x39\x37\xc8\x3c\x4f\xa0" + "\x3d\x21\xce\xb7\xe7\x75\xbc\x3c\xc1\xf7\xc2\x7c\x7b\x97\xc7\xb7" + "\x17\xda\xb3\x7c\xdb\x58\x43\xf5\x67\x5f\x53\x0d\xd5\x26\x35\x2c" + "\x8f\x6f\x23\x5a\x86\x6f\x0b\xec\xe7\x5b\xfe\xb7\x54\x2c\xeb\xa5" + "\x5e\xd8\x57\x7a\x0c\xf8\x96\xad\xd7\x61\x59\x33\xd5\xbe\x7a\x1d" + "\xf7\xab\x66\x2a\xee\x97\x30\xef\x6a\xfd\xf8\xbc\xab\x8d\x66\x8f" + "\x15\xe4\x5d\x6d\x1b\xca\xbb\xe4\x38\xbb\x79\x57\x56\xce\x40\xeb" + "\x7b\x7f\x73\x06\x5a\x5f\xca\xbb\xda\x7b\x4d\xf3\xee\xf9\x3a\x61" + "\xde\x3d\x5f\x47\x78\xf7\x7c\x9d\x4d\xde\xe5\xcd\x21\xb8\x78\x55" + "\xb0\x96\x47\xc5\xc3\xfe\x9d\x95\x8b\x55\x72\x72\x06\xc0\xc1\x8a" + "\x78\x5c\xc3\x29\x02\xcf\x21\x68\x3a\x67\xd0\x14\xdf\x4a\xcf\x19" + "\x5c\xba\xcc\xe7\xdb\x4b\x57\xf9\x7c\x7b\x25\x13\xf7\xcb\x66\xce" + "\x80\xe5\x80\x5f\xfc\x1a\x73\x06\x5a\x3e\xcf\xd2\x9c\xc1\x95\x11" + "\xe2\xef\xbe\x7e\x89\xe0\xe9\xdb\xd7\x2c\x6a\x56\x4f\xa5\x7c\x7b" + "\xb2\xc4\x34\x67\xac\x32\xfd\x44\x98\x39\xdf\xfe\xb2\xc3\xaa\x66" + "\xf5\xb8\x66\xac\x59\x3d\xae\x99\x6b\x56\x8f\xe7\xd7\xac\xfe\xf4" + "\x2e\x9d\x47\x26\xbd\x66\xf5\xe5\x01\x2c\x07\x63\x0c\xe1\xba\xd5" + "\xf6\xe4\x11\xee\xf3\xb7\x56\x78\xdc\xcb\xcb\x23\x5c\xde\xc7\xe7" + "\xde\xcb\x95\xe2\xdc\x7b\x79\x29\xe5\x5e\x72\xdc\xfd\xd5\xbc\x97" + "\xf3\xef\x6f\x1e\xe1\x72\x3e\xcd\x23\x5c\x59\x20\xc8\xbd\xbc\x77" + "\x63\xbf\x44\x0b\xbf\x1b\x83\xed\x2c\xf7\xfe\x12\x2d\x9a\x47\xb0" + "\x9a\xbf\xf5\xdf\x09\xe4\xdd\x18\xa7\x79\xb5\x12\xf2\x08\xad\x6e" + "\x8e\xc1\x7f\xc3\xe5\xe4\x11\x30\xdf\x62\x3e\x33\x71\xae\x3d\x79" + "\x84\xe6\xd7\xb8\x55\x13\xf8\x9c\x5b\x35\x85\xcf\xb9\xbf\x1a\x2c" + "\x39\xd7\x9a\x6f\xab\x72\x84\xb8\x96\xe4\x11\x7e\xdd\x23\xce\xb3" + "\x55\x85\xa2\x3c\x6b\x31\x37\x97\xf2\xec\xd5\x7b\x7c\x9e\xbd\xea" + "\x2a\x8b\x67\xed\xfd\x06\x4b\xab\xe2\xd9\x08\x0b\x9e\xbd\x96\x49" + "\x79\xd6\xf2\x3b\x2c\x4d\xf0\xec\x7d\xfa\x0e\x8b\xb8\xc6\xfd\xb5" + "\x33\x9f\x67\x7f\x0d\x11\xe7\xd9\x6b\x57\x29\xcf\x92\xe3\xee\x2f" + "\xcf\xfe\xea\x75\x7f\x73\x0b\xbf\x7a\x51\x8d\xfb\xeb\xf9\xa6\x79" + "\xb6\xaa\x4c\x98\x67\xab\xb8\xf7\x62\x55\x65\xa2\x1a\xd7\x8a\x67" + "\xab\x8f\x48\xe0\xd9\x56\x3e\x07\xa1\x5a\x23\x27\xb7\xc0\xf2\xab" + "\xd6\x62\xbd\xc4\x59\xf3\xf5\x12\x66\xb9\x85\x20\x53\x6e\x81\xff" + "\x7d\x96\x38\x53\xfe\x36\x90\xe3\xdd\x57\x1c\xe5\xdd\xeb\xa7\x6a" + "\x1b\x79\x77\x1e\xf0\xee\x75\x76\x7d\x44\x6d\x23\xef\xde\x5c\x6d" + "\xea\x17\xfd\x3e\x8b\x48\x6e\xe1\x0f\xb8\xbd\x1b\x7d\x1a\x73\x0b" + "\x98\x87\x03\xcd\x73\x0b\x37\x87\x88\x73\xf0\x8d\x10\x5e\x6e\xe1" + "\x3b\x61\x0e\xae\xe1\x71\xf0\x6f\x09\x2c\x07\xff\xc1\xc4\xc1\x37" + "\xd2\xee\x42\x6c\x79\x77\x95\x34\x0e\xae\x61\x39\x38\xf8\xc1\x70" + "\xf0\xfe\x66\xe0\x60\xd6\xee\xba\x1e\xa5\x1a\xe0\xe0\xc9\x98\x83" + "\x83\xed\xcb\x37\xb4\xd0\x37\x5a\x70\xbf\x84\xb9\x58\xb7\x93\xcf" + "\xc5\xba\x72\xf6\x58\x41\x2e\xd6\x2d\xa0\x5c\x4c\x8e\xbb\xbf\xf9" + "\x06\xdd\x8e\xfb\x9b\x6f\xd0\xed\xa0\x5c\x7c\x73\x46\xd3\x5c\x7c" + "\x63\x9c\x30\x17\xc3\x76\x96\x8b\x6f\x8c\xb3\xc9\xc5\x7f\x30\xe7" + "\xe2\x5b\x8d\x9a\x97\x97\x6f\xd0\x3e\xec\xdf\x6e\xb9\x25\xaa\x7f" + "\xd5\xdd\x51\xf2\x25\xa7\x5b\xfb\x4a\xb3\x11\xba\xbd\x0c\x25\x97" + "\xea\xff\x80\x60\x1b\xd8\xef\xd6\xd9\x52\xaf\x00\x64\xdc\xf0\x7c" + "\x04\xe6\xe3\x8d\xf8\x07\x1a\x37\x4d\xc1\x3d\x5b\xac\x8d\x6f\xb1" + "\xf3\x5d\xf1\x76\xcc\xbd\x5b\xcd\xf6\x0b\x5d\x8b\x49\x1b\xac\x25" + "\xe7\xdd\xf6\x25\xeb\x6e\x06\x57\x9a\xfe\xc6\xd8\xd4\x3a\xdd\x0e" + "\x60\xd2\x07\x57\xe8\xdc\x07\x57\x08\x9d\xdf\x53\x85\x5c\x3a\x2c" + "\x65\x98\x2d\x9b\x98\x9a\xdb\x4f\xf7\xd1\xde\x5e\x83\x50\xda\x26" + "\x46\x57\xbb\xea\x76\x0c\xdc\x63\xd6\x27\x70\xdc\xed\x8e\x9f\x6b" + "\x6e\x2f\x0b\x43\xb0\x6d\x85\x69\x1b\xd8\x0d\x19\x97\x29\x19\x23" + "\xec\x63\x36\xd4\xef\xd9\x9a\x08\x5c\x15\x8f\xd0\xc0\xbb\xf8\x99" + "\xb9\x9d\x01\x98\xf1\x48\x85\x36\xd7\x43\x5b\xcc\xef\x9f\xac\x01" + "\x3c\x3a\x97\xac\x40\xf8\x99\x4e\x81\xfb\xca\x4d\xc5\xb6\x57\x3e" + "\x9b\xc5\x28\x9c\x91\x71\x67\x9f\x00\xc6\x73\x4c\x0c\xf8\x03\xa5" + "\xcd\x43\x2e\xf8\x3e\xd6\xc3\x71\x8c\x22\x89\x81\x71\x44\x53\xaa" + "\xaf\x21\xcf\x34\xf4\xef\x1b\x88\x63\x19\xb8\xee\x96\x79\x48\x05" + "\x3f\x57\x26\x73\x4c\x4c\xed\xaa\x9a\xae\x70\x9f\xce\xb8\x5f\x62" + "\xf7\xb8\xfe\x53\x18\x77\x9e\xf4\xc2\x63\x07\x7b\x7d\x7c\x6d\xf6" + "\x3a\x0a\x63\x8a\x01\xb6\x33\xcb\x92\x98\xd2\x38\x3d\x72\x03\x5b" + "\x6c\x85\x7e\x63\x3c\x1a\xff\xd2\x47\xbb\xbc\x0b\x42\x7b\x17\x57" + "\x29\x4a\xa1\xef\x86\x4f\x9e\xac\xd1\x24\x0e\x46\xb0\x5f\x87\x63" + "\x96\x2b\x4e\x77\x3a\x87\x82\x6a\xc3\x7c\x02\xff\xef\x53\x03\xe3" + "\xd8\x68\xf8\x7b\x3d\xdc\x87\xf1\xb6\x97\x33\x3e\xf6\x8a\x53\xcd" + "\x29\xcd\xc2\x73\xc8\x2d\x06\xb9\xa4\xc2\xbd\x91\x63\x6b\x72\xf1" + "\xb1\x5a\xa7\x3b\xbd\x71\x1f\xe0\xef\xfd\xf0\x37\x3e\x0f\xcf\x21" + "\x43\xcc\x8e\x3e\x01\x2c\x36\x33\xc6\xc4\x18\xfb\xf4\x09\x60\xb9" + "\x0f\xee\x73\x3d\xdc\x33\x1c\xe3\x0a\xc7\xb8\xb2\xff\x26\x22\x55" + "\x06\x6c\xc3\xed\xc0\xbf\xae\x9a\xd9\xf5\xb8\xed\x34\xdc\xb6\x88" + "\x1d\x9c\x19\x0f\x18\xa9\x01\xdb\x78\x4c\x55\x27\x3a\x9d\xba\xe4" + "\x74\xe7\x98\x9b\x13\xc3\xc0\x73\xae\x59\x9e\x88\x5c\xd3\x8c\x08" + "\x69\xba\xe0\x76\xee\xe4\x40\xfb\xce\xd8\x16\xb5\xab\xee\xc4\x6b" + "\x9d\x6a\xbc\xb1\x7d\xc1\x9f\x35\xea\x9e\xec\xfd\x9e\xc6\xd7\xc1" + "\xe7\x70\xc7\xb3\xb5\xef\x71\x9f\xd5\x89\x4a\x06\xfe\x3e\xac\x74" + "\xba\x88\x94\x5e\xed\xbf\x84\xf3\x0f\x69\x51\x5e\x08\x3e\x5f\x4b" + "\xce\x03\x2c\xdd\x29\x03\x9f\x05\xe1\x6d\xf8\x6f\x91\xfe\xba\x9a" + "\xfc\x56\x0c\x6a\xd5\xca\x77\x26\x8c\x00\x2e\x4c\x18\xc1\xfd\xfd" + "\x32\x51\xab\x60\xc7\x61\xa7\xbb\x6c\x5c\x97\x0a\x3e\x34\x7c\xe6" + "\xe5\xbc\x1e\x6c\x6b\x6c\xc0\x7e\xb9\x04\xfb\x6a\x3d\xb1\x5f\xd6" + "\x2f\x06\x9f\x90\x63\x03\x68\xff\xf1\xdf\xb5\xac\x3f\x8d\xe0\x0b" + "\xb2\x76\xf3\xee\x55\x7c\x3f\xeb\xef\x82\x1f\x3b\x31\x35\xc7\xe2" + "\xa0\x5f\x18\xb7\x80\x91\xbd\xf3\xea\x14\x78\x5e\x1f\xde\xfe\xcd" + "\xad\x3a\xc5\xfa\x6b\x08\xeb\x4a\xb4\x0e\x78\x39\x67\x21\xd8\x1c" + "\xda\x64\x7a\xf7\xd2\x3c\x67\xf2\xe3\x62\xf0\xdd\x42\xc0\x2e\xd8" + "\x7c\x3d\xd8\x6f\x0b\x70\x1e\xfe\xff\x16\x18\x7f\x40\xd3\x69\xb4" + "\x4e\xb5\xbd\xa1\x3d\x55\x4e\x27\x46\xb7\xb5\x13\x53\x0d\x36\x3c" + "\x5a\xbb\xaa\x16\x99\x6c\x88\xfb\xb4\x1e\xb6\xaf\x83\xfd\x5a\xa7" + "\xbb\xf1\x04\x43\x77\x43\x4c\xf7\x2c\x66\xcf\xb5\x7b\x51\xc0\xba" + "\xbd\xa8\xeb\x9a\xbd\x68\xe8\x92\x4a\x78\x2e\x97\xbd\xcc\xfc\x30" + "\x59\x0f\x63\xe2\xba\xc2\xfa\x4e\x2f\x68\xf0\xbb\x27\xe3\xf2\x27" + "\x73\x57\xee\x45\xfd\xf1\xda\xd8\xd0\x6a\x84\xf0\x18\x1e\xda\xe6" + "\x02\x53\x1a\x73\x07\x19\xdd\xd7\x15\x1a\x96\x3f\xdb\x71\xcc\x1d" + "\x84\x8e\x7b\xd7\xa0\xc4\x58\x18\xcb\x6f\x55\xa1\xc4\x1a\x46\x57" + "\x92\x7c\x15\x01\xf7\x9c\x26\xb6\xab\xd3\x84\x4e\x47\x08\xaf\x19" + "\x34\xfe\xea\x8d\xda\x47\x23\xe7\xf8\xb3\xc8\x2b\xa9\x92\xa9\x32" + "\x6c\x0a\x8a\x49\x4c\x40\x8a\xbd\xb7\xca\x89\xf6\x74\xaa\x4b\x3f" + "\x8c\xd7\xa7\xd6\x86\xa3\x69\x7a\x6e\x3c\xca\x18\x13\x97\x34\x03" + "\x75\xc6\xf7\xe3\xc6\x6a\xaf\xba\x01\x60\xb7\x38\x69\xfc\x5c\x5b" + "\xc7\xfa\x73\xd3\x08\xdd\xde\x77\xea\x40\x6f\x35\x94\x25\x4d\x67" + "\xaa\xb0\xae\x83\xf1\x85\xd5\x82\xa5\x55\x7a\xd0\x56\x51\x30\x7e" + "\x6b\xd1\xb7\x97\x72\x15\xc6\xf4\x86\x32\x69\xd7\xa8\x9b\xcc\x8e" + "\xdb\x78\x2c\x85\xbe\x8f\xf7\x46\xc9\x6c\xff\x61\xcc\x74\x8b\xc5" + "\x7a\x8a\xb9\x80\xfb\xff\x0d\xdc\x2b\xd3\x23\x32\x0c\xfa\xa4\xc5" + "\xe3\x67\x68\x85\x06\x15\xd5\x19\xd0\xa7\xd7\x58\x1b\xb5\x05\x1b" + "\x39\xc3\xbe\xfd\x60\x27\x17\x21\xbf\x61\x9f\x19\xd3\xd6\x15\x1a" + "\x95\xc4\x37\xac\x5f\x6a\x88\x5f\xc6\xcc\x45\x30\x8e\x82\x6f\xd2" + "\x89\x6f\x8c\x9e\xa3\x23\xb0\x6f\xa4\xdd\xc7\xbd\xde\x62\xe3\x0b" + "\xbe\x36\x03\xf8\xc0\xb8\x30\x7a\x8c\x8e\xc0\xd7\xc6\x7d\xc0\xef" + "\xcf\x30\x0e\x42\x57\x5e\x60\x4a\x62\xaa\x50\x29\xdc\x0f\xe3\x6e" + "\xde\x07\xbd\xd4\x3e\xec\x12\xeb\xc3\xda\x81\x80\xdb\x81\x80\xdb" + "\x81\x80\x5b\x2d\xc1\xed\xc9\x0a\x82\x5b\x03\xf4\xeb\x1e\x68\xf7" + "\x25\xe3\x91\x02\xf7\x6b\xcf\x39\x5c\xa3\x0f\xfa\x59\x45\xb1\x3b" + "\xfa\x3a\xd8\xc8\x84\x5f\xe5\xb3\x1d\xb1\x7d\x4a\x6a\xca\x51\x12" + "\xc6\x6f\xbd\x10\x7e\x1b\x92\x43\x23\xc1\x37\xef\x03\x7e\xff\xeb" + "\x8d\x5c\x2b\x91\x73\xc2\x78\xc0\x6f\x95\x10\x7e\x1b\xc6\x1e\x82" + "\x6b\x5a\xe1\x77\xba\x39\x7e\xeb\xaf\x4b\xc7\x6f\x7d\x41\x23\x7e" + "\x27\x72\xf8\x9d\x61\x81\xdf\x4a\x33\xfc\xe2\xfb\x96\x8c\xdf\x86" + "\xae\xd2\xf0\x5b\x9f\xdb\x88\x5f\x88\x4b\x3e\x7d\x8f\xb5\x51\x5b" + "\xb0\x11\xe0\xb7\x3e\x16\xec\x24\x88\xdf\x96\xf7\x9f\x21\xd0\x7e" + "\xff\x19\xdc\x9b\xf6\x9f\x3e\x4f\xba\xff\xf4\x71\xf7\xdf\x7f\xfa" + "\x0a\x69\xfe\xd3\x47\x88\xfb\x4f\xef\xdb\x7a\xfc\xc7\x20\xfb\xfd" + "\x67\x3c\xd5\xb4\xff\x8c\xb3\xa4\xfb\xcf\x18\x70\xff\xfd\x67\xcc" + "\x96\xe6\x3f\xa3\x5a\xdc\x7f\x86\x1a\x31\xff\xbd\xda\xd9\xc8\x18" + "\xf1\xbc\xb9\x4e\xbe\x6a\xac\x81\x88\x5e\x63\x8a\x71\xcc\x08\x7f" + "\x3b\x9b\xfe\x66\x35\x15\xc4\xd5\x16\x7f\xbb\x5a\xfc\xad\xb2\xf8" + "\xdb\xc3\xe2\x6f\x2f\x8b\xbf\xbb\x9a\xfe\x06\x7f\xb5\xb9\xe1\xc4" + "\x0c\x83\x98\x2d\x59\xeb\xc4\x94\x73\xfb\x7b\x4f\x33\xa8\x71\xdc" + "\xd7\x5b\xa8\xef\xeb\x97\x31\x75\xed\x9d\x10\xd3\xa0\x60\x50\x4c" + "\x22\x7a\xf2\x9a\x02\x85\xd4\x2f\x83\x90\x50\xd9\xc5\x9b\xa9\x4f" + "\x46\xc6\x34\xbd\xf3\x98\x45\x80\x2f\x1d\xc4\x89\x49\x5e\x6d\xa1" + "\xed\xdf\x83\xdd\x74\x25\x31\x3a\xd0\xe5\xdf\x32\x97\x14\x68\x08" + "\xbe\xcf\x81\x31\x1a\x64\x54\x3e\x8b\xd7\xfe\x39\x19\xd3\xf5\xce" + "\x3a\xe5\xb3\x5d\x20\x2e\xd5\xae\x5b\x66\x74\x29\xad\x3e\x8d\x52" + "\x15\x46\x75\x7c\x3c\xe8\xfa\xea\xfd\x68\x49\x35\x53\x15\xaf\x67" + "\xea\x4a\x27\x6b\xf0\x7b\xdb\xaa\xd2\xb8\x42\x54\xa2\x3b\x8d\xf0" + "\x98\x87\xb1\x5a\xaa\xdb\x4f\xde\x13\xe3\x63\x60\x5b\x89\x6e\x0f" + "\x2a\x86\xbf\x35\xb3\x2f\xa3\x2b\x0a\x74\xb5\xb4\x7a\x0f\x32\xa4" + "\xe1\xe7\xa3\xa1\x92\x51\x35\x54\x15\x57\x43\xdf\xd2\x1a\xaa\x71" + "\x5f\x4b\xa0\x1f\xec\x37\x3a\xd3\x1b\xaa\xd9\x76\x6b\xca\xd8\x1c" + "\x82\x21\x1d\x8e\x77\x87\xe3\xdd\x1b\xaa\x70\xff\x70\xdf\x04\xe3" + "\xbd\x0c\xdf\x71\xd0\xf7\x3f\x8c\xf7\x76\x46\xcc\x52\x67\x2f\x49" + "\x78\x53\x38\xb9\x8a\xc6\x91\x19\xbe\xa7\x49\xbb\x2e\x72\xda\x15" + "\x9d\xff\xc4\x64\xf8\x71\xfd\x55\xc9\x69\xf7\x90\x8d\x76\xb9\xfe" + "\xaa\x65\xb4\x8b\x5b\x13\x6b\xd7\x9f\xeb\x6f\xa0\x9c\x76\x67\xda" + "\x68\x97\xeb\x6f\xb2\x9c\x76\x8f\xd9\xf0\xdb\x38\x79\x58\x50\x7a" + "\xd9\xc2\x82\x3c\x1c\x28\x6d\xdc\xbf\xdf\x38\x79\x18\x50\x8a\xe6" + "\xbf\x31\x06\xe4\xf9\xdf\xd9\xa6\xff\xe5\xf9\xde\x59\xf4\xfb\x8f" + "\xd8\xf7\xf2\xfc\xee\x2c\x8a\x7f\x1c\x1b\x33\x19\xcf\xeb\x98\x4e" + "\x91\x81\xc6\x4d\x4a\x9d\xb1\xd3\xf3\xb7\x96\x1b\x03\xd1\xab\x09" + "\x30\xe6\x65\x21\xf7\x57\x73\x2e\x30\x81\x38\xe7\xa4\x68\x33\x2e" + "\x21\x1b\x29\xd2\x14\x46\x45\xde\xe2\x72\x45\xa9\x3e\x00\xf3\x96" + "\x61\xc7\xc2\x3a\xa7\x5e\xb0\xfd\x08\xf4\xba\x66\xbe\x37\x22\x6d" + "\x29\x75\xa9\x89\x81\x28\xd4\x80\x70\x8e\xa3\x66\xcc\xdc\x0b\xcc" + "\x51\x88\x2e\x43\x6f\x02\xbf\x66\xd5\xe1\xb1\xd4\x1d\xce\xd5\x03" + "\x8e\xa1\x9d\x3a\xf4\xa5\x51\xe7\x34\x46\xc7\x1e\xab\x83\x78\x54" + "\xc7\x6c\x7a\xfe\x16\x1e\x93\x99\x24\x6f\xb4\x02\xfe\x86\x6b\x1f" + "\x57\xea\x90\x62\x0b\xc4\xaa\xb5\x6b\xda\x68\xb4\x8a\xb6\xd9\x38" + "\x7e\x85\x38\xb9\x3a\xe9\x26\xce\xe7\x47\x06\xee\x35\xea\x14\xcb" + "\x21\x6e\xc6\xc7\x0f\x8c\x41\x8a\xa3\xd0\x1e\x1c\x5b\x7d\x24\x16" + "\x21\x1b\xf9\x1c\x67\xa3\xc7\xa8\xd3\xf8\x7c\xdc\x0e\xce\x93\xae" + "\x37\x82\x9d\x3d\xc6\xc4\xe1\x7e\x33\x19\x2f\xec\xd2\x2c\x86\x31" + "\x47\xd1\x36\x76\x44\x5f\xa6\x16\x8f\x21\x30\x76\x74\xb9\x06\x7f" + "\xb3\xf9\x80\x65\x4c\x19\xa3\xaa\x2f\x67\x52\xdb\x07\x96\xd4\xdc" + "\x42\x9a\x85\xf5\xe8\x92\xa2\xed\x02\x7c\xed\xdb\x1e\xa3\xca\x6a" + "\x3c\x46\x95\xd7\xae\x69\x1b\x63\xea\x2f\xbe\x96\x69\x3b\xce\x7f" + "\x90\x3e\xb6\x4d\x3b\x12\x2f\xde\x47\x66\x79\x97\x8e\xa1\x5e\x8c" + "\x0e\xdb\x52\x93\x78\x0b\xfa\xe2\xd2\x06\xdb\x9b\xc9\x18\x95\x5b" + "\x93\xe4\xdd\x9d\xcd\x07\x2a\x1e\xeb\x8f\xf3\x4a\x30\x36\xd4\xb0" + "\x39\x9e\xf4\x86\x1a\x76\x0e\x0f\x70\x3f\x68\x80\x72\xac\x85\x6e" + "\x28\xda\xb2\xf9\xc0\xf1\xde\x0a\x69\xf1\x94\xa2\x2d\x1b\xff\x6a" + "\xba\x63\x3b\x3c\x76\x1d\xae\xf7\xe2\x25\xc5\x63\x61\x24\x47\xa8" + "\x77\xc1\xd7\x83\x63\x2a\x98\x74\xbd\x0b\x93\x56\x5f\x86\x8f\x83" + "\xfd\x31\xdc\x7e\x95\xd9\x7e\x15\xf4\xb9\x8a\xdb\x9f\xc6\xed\xf7" + "\x30\xdb\xef\x11\xd3\x1d\x39\x5d\x53\x3c\x56\x80\xef\x09\xc6\x3b" + "\x1d\xec\x67\xeb\xeb\x90\x9c\x7d\x83\x8e\x3b\xce\xb9\x5a\xf1\xd8" + "\xa9\xdb\x80\x2f\xd8\xef\x6a\x76\xbe\xeb\xd1\x38\x1f\xf4\x6a\x0e" + "\xb6\xe9\x63\x95\x5a\xa5\x41\xcf\xe6\x89\x14\x6d\xb5\xac\x2d\x60" + "\xfc\x34\x6f\x4f\xab\x78\x2c\x1f\x8f\x91\x35\xa0\x23\xe1\x98\x42" + "\x7c\x4d\x21\xfb\xeb\x77\xf4\x52\xd7\xf7\xee\xe5\xd3\xe0\xf1\x56" + "\x5a\xbf\xca\x97\x0d\x8d\xf3\x3f\x23\x90\x22\xb4\x02\x29\x93\x22" + "\x91\x02\x6b\xa8\xc4\x53\x48\x11\x0f\xff\xc7\xb9\x66\x46\xb1\xb7" + "\x7a\xef\xc2\x3a\x78\x4e\x34\x6d\xf0\xfb\xaa\x7a\x78\x26\xf4\xfd" + "\x9f\x0e\xc4\xef\x6a\xee\xed\xe8\x85\xea\x32\x5e\xab\xbb\xe7\xf1" + "\xba\xcb\x95\x99\x48\x31\xad\x5a\xf0\xbd\xcd\xd0\x25\x15\x8c\x31" + "\x71\x2e\x72\x09\x9d\xac\x64\xf0\xbb\x9b\xe2\xe8\xcb\x28\xe1\x3a" + "\x52\xe0\xf7\x35\x9f\x2d\x44\x1e\xa5\xa0\x7b\xf1\xfb\x1c\xd7\x88" + "\x40\x94\x9d\x88\x3c\xda\x57\x23\x55\x7b\x27\xa7\xb6\x6f\x9c\x41" + "\xc8\x50\x1b\xdd\x0e\xf0\x6a\xec\x17\x15\x88\x73\x26\x1d\x98\x0d" + "\xeb\x35\x7b\x13\x0b\xda\xe8\x41\x67\xe3\x77\x3a\x1f\xdf\x45\xfd" + "\x73\x16\x22\x9f\x69\xc5\xc9\x6c\x2d\x23\xbc\xbe\xf4\x5e\xad\xb7" + "\xba\xe1\x23\xef\x9e\xf5\xb5\xde\xdd\x4d\xef\x7b\xa6\x5c\x57\x21" + "\x3c\x87\x94\x59\x75\x4f\x87\xdf\xf7\xe0\xbc\x7a\x43\x3a\xa9\x75" + "\x84\xe7\x95\x1a\x3f\xf2\xee\xca\x4c\xf3\x46\xcf\xd5\x81\x7d\x6b" + "\xbd\xd1\xe2\xb1\x48\x05\x7d\x56\xf5\xaf\x44\x8a\xad\x53\x91\x4b" + "\x51\xc4\x25\xac\x49\xbc\x8a\x2a\x77\xa2\x45\x23\x51\x77\x3d\xe8" + "\x76\xfc\x1e\xa1\xa8\x32\x13\xe1\xf7\x41\xd9\x77\x51\x40\xd6\x5d" + "\x34\x14\x63\x34\x24\x52\x8d\x8c\x99\xa3\x72\x09\x56\xdb\xed\x3c" + "\xee\x7d\x1c\x49\xc7\x6a\x3b\xd1\xfa\x3f\x70\x0d\x1f\x7d\xef\x5e" + "\xc8\x00\x7e\x24\xef\x00\x43\x54\xc6\xed\xef\xc4\xec\x4d\xd4\x29" + "\xbe\xb8\x54\xe5\x84\xe7\x33\xe1\xb5\xbd\xc6\x3d\x4f\x07\xf2\xfc" + "\xd2\xc0\xf9\xa5\x81\xf8\x05\xfb\x64\x6a\x0c\xc2\xef\x8e\x3a\x60" + "\x7f\x94\xd6\x95\x23\xe3\x12\xd3\xfa\x5e\x1f\xb4\xc5\x48\x7c\x61" + "\x68\x88\x6e\x67\x04\xbb\xe3\x1c\x29\x60\xa1\x8d\x01\x6c\xbf\x16" + "\xaf\xf9\x5d\xea\xd4\x1e\xf0\xd7\xc1\xd8\xe0\xf5\x38\x68\x55\x9f" + "\x69\x17\x93\xb9\x7a\x52\xa4\xae\x94\x7e\x89\xb7\x1a\xda\xee\xd9" + "\xd0\x00\x7e\xa8\xb3\xf2\xc3\x4c\xbc\x36\x18\xbf\xbf\xd0\xa7\x93" + "\x77\x34\xac\x1f\x96\x78\x77\xc5\xf1\xcd\x73\xa0\x4f\xf1\x3b\x2d" + "\xec\x83\x2d\x57\x90\x4b\x71\x34\xb1\xbf\x81\xb3\x3b\x5e\x27\x8c" + "\x6d\x3d\x7a\x86\x1a\x95\x7a\x9f\x41\xd8\xd6\xcc\x1a\x97\xde\x0d" + "\x3b\x7b\xe1\x31\xc5\xf7\x86\xe2\x89\x6e\xc7\x21\xda\x1c\x1f\x27" + "\xd5\xee\x4f\x88\x7e\xff\xac\x65\xec\xae\x7e\x08\xed\xde\xae\x9a" + "\xda\xdd\x35\x53\x9e\xdd\x5d\x33\x1e\xac\xdd\x55\x0f\xa1\xdd\x9f" + "\x88\xa2\x76\xef\xd0\x5e\x9e\xdd\x3b\x88\xc6\x3f\x06\x63\xa0\xe2" + "\x07\xaf\x72\xf4\x65\x17\x88\xb5\xd3\x3e\x57\x19\xd3\x3e\x4f\x33" + "\x4e\xf2\x72\x26\x3a\xc2\x53\xf3\x4f\x78\x52\x34\xf3\xae\xb1\xff" + "\x27\x63\xe0\xfb\xc1\x78\x2d\xda\x0f\xc7\xf0\xf8\xbe\x06\x9d\x0c" + "\xc2\xe3\x79\x87\xf3\x4f\x84\x83\x2e\x9b\xe4\x85\xee\x4d\x0a\x57" + "\xac\x39\x87\x5c\xdc\xca\x51\x88\xd1\xc8\x30\x9a\xc4\x6b\x30\x7e" + "\xfe\xce\x45\x33\xf1\x1a\x52\x2f\x76\x81\x63\xdd\x67\xa8\x17\x2f" + "\xc5\xff\x8e\x56\x2f\x5e\x75\x01\xfe\x6d\x8f\xdb\x4d\x38\x8f\x14" + "\xfa\xa7\xfb\x84\xed\x9d\xad\x81\x31\xe9\xb5\x98\xbd\x37\xea\x14" + "\x6b\x6f\x21\x67\x46\xf1\x14\xe3\xa6\x43\x2e\xeb\xe6\x81\x16\xd3" + "\xd7\xa0\x98\xf7\xd0\x53\xd7\x14\xaa\x95\x38\x0f\xfc\xcd\x0d\x8d" + "\x22\x0d\x1f\xd3\xf3\x9d\x98\x3d\x5d\x74\x4e\x78\x2c\xdb\x3b\xbb" + "\x4e\x61\xc2\x0a\x9e\x8f\x30\xad\x06\x29\xc0\x7e\x3e\x06\xcf\xb7" + "\xd2\x6e\xef\xec\xa5\xae\xcb\x7c\xdd\xa5\xde\xf3\xb5\x3a\x7d\xde" + "\xd3\x81\x82\xf8\xb9\x83\x14\x18\x43\x18\x2f\xed\x63\x91\xca\x84" + "\x25\x8c\xa1\x92\xba\x2a\x84\xd7\x39\xb8\x55\x21\x15\x03\xf8\x99" + "\xb4\x1b\x7c\x6b\x8e\xa1\x34\x11\x0c\x6d\xe6\x63\xe8\x36\x87\x21" + "\xc0\x12\xc5\xd0\x0c\xc0\x10\x7e\xaf\xbd\xaa\x4e\x27\x09\x43\xd5" + "\x1c\x86\xd2\x2d\x30\x74\x5d\x8d\x7e\xa8\x38\xcf\x61\xc8\xb5\x42" + "\xdf\xc7\x84\x21\xd5\xd8\xe3\x93\x01\x43\x93\xa5\x62\x48\x45\x34" + "\x54\x46\x50\x04\xab\x27\x14\x9d\xc8\xb7\xa6\x41\x7b\x52\xdd\xa9" + "\x3a\x40\xde\x4f\x81\xce\xf4\x7c\x61\x17\x93\x0e\x5a\x13\xfa\x32" + "\xad\x2f\x72\xb9\xed\x39\xaa\xec\x76\xe6\xa8\xd3\x35\x9e\xa3\x38" + "\x7d\xa7\x3a\x2b\x0f\xcb\x2a\x36\x7f\xc2\xfc\x14\xfe\x3b\x66\x52" + "\xb8\xb3\xf1\xa7\xf0\x36\xe0\x47\xaf\x39\x86\x64\x74\x37\xed\xfd" + "\x40\xd0\xe9\x55\xea\xc5\xe8\x59\xc0\xd5\x90\x93\xa0\x53\x4f\x82" + "\xf2\x2d\x0d\x9b\x89\x98\x0d\xef\x69\xbe\x30\xea\x9c\xe1\x59\xd0" + "\x62\xac\x01\x5e\x9d\xcd\xf1\x4a\xb0\x49\xf6\xd5\xa5\xbd\x1f\x86" + "\xdb\x0a\x2d\x44\x6e\xea\xd7\x90\xf3\x15\x45\xc7\xb3\x8b\x12\x10" + "\x5e\xc7\xd5\x06\xfe\xbf\xf3\xde\x06\x7f\x0d\x9c\xdf\x81\xf9\x69" + "\x9c\x53\xcc\x6b\xa8\x3b\x33\x69\x9c\x13\xe6\xac\xcf\x13\xb3\x14" + "\x46\xd8\x46\xde\xe9\x67\x21\xbc\x7f\x6d\xbd\x33\xfb\xfe\xdf\x08" + "\xc7\x94\xd4\x64\xa1\xb5\x0b\x21\xbe\x84\xff\x93\x79\x22\x59\x08" + "\x1f\xbf\x6e\x9e\x8a\x7d\x87\xc7\x9e\xa7\xcf\x42\xf8\x5c\x03\x6c" + "\xff\xd8\xe8\x8a\x52\x17\x7b\xa0\x93\x61\x25\x6c\x1b\x27\xc3\xbe" + "\x47\xb8\x0d\xcc\x6b\x27\xc3\xbe\x41\xeb\x17\x7a\xa1\xe2\xea\x2c" + "\xd8\xff\x6f\xb4\xfe\x46\x57\xf8\xf7\x0a\xfc\xee\xa2\x6b\x8a\x8e" + "\xc1\x27\xc3\x8c\xc8\x6d\xe9\xcb\x0c\xe0\x90\x29\xc5\x6b\x83\x12" + "\x51\x5b\xe8\xfb\xd8\xd2\xf2\x34\xa4\x55\xb8\x07\xe0\xb5\xa3\x4c" + "\xd2\xa4\x6a\x23\x33\xe9\xba\x31\x69\xd2\x0d\x7c\x6d\x03\x33\xe9" + "\x37\x7c\xed\x75\x8b\xd5\xdc\xbc\xb1\x2c\x76\x8e\xcb\xda\xbb\xbd" + "\x11\xee\x2b\xbe\x2e\xbe\xde\xfa\x79\xde\xdc\x35\xfb\xb3\x7d\xc3" + "\xd7\xc4\x6d\x9a\x5f\x13\x7f\x97\x59\xfd\x16\x7b\xcd\xe3\xf0\xaf" + "\x3b\xf8\x63\x28\xf6\x03\xbe\xbe\x91\x09\x6f\xc3\x24\x85\x2b\xd9" + "\x73\xe2\xaa\x84\xce\xb9\xc7\x9d\xc3\xe6\x22\xf1\x39\xf5\xe4\x78" + "\xb6\x0d\xe0\x13\x76\xfd\x6b\xbf\x70\x0d\xb2\xf6\xe1\xef\xf6\x11" + "\x7e\xf9\xdd\x52\xc2\x2f\xc4\xa7\x2c\x56\x26\x85\xb7\x01\xbf\xa9" + "\x30\x17\x41\x1b\x13\x1a\xdb\xf8\x29\x5c\x89\xfd\x8d\x71\x63\xc2" + "\x12\xc6\x91\x09\x43\x6c\x3f\x21\x42\x30\xc7\x0c\xfc\xdf\x85\x6b" + "\x67\x9b\xa9\x1d\xe8\x03\xc7\x71\x1d\x2a\xfa\xc1\x7e\x6b\x1c\x79" + "\x2e\xa2\x38\xf2\xec\x5c\x97\xc8\x30\x18\x47\x9a\x89\xcb\x70\x3b" + "\x57\x69\x7f\xc6\x39\x61\x8c\x3d\x64\xd8\x0a\xc6\x7e\xea\x17\x8f" + "\x3c\xc8\xfd\x78\x1c\x64\xef\x27\x5e\xe3\x81\xfb\x6a\xba\x0f\xdc" + "\x87\x54\xa3\x1a\x99\xee\x63\x7d\x7d\x6f\x68\xf7\x06\xe2\xce\xb9" + "\x8e\xdb\x36\xd9\x00\x7c\x86\x4c\xe7\x98\x8e\x4f\x35\x7a\x43\xbf" + "\xfb\xb3\xe7\x10\xcc\x5d\x11\xc0\x8f\xe7\x10\x4b\xcc\x3d\x11\x8f" + "\x94\x0c\xd8\x5b\x33\xf1\x16\x5c\xc7\x73\x3c\xe9\xdb\xb7\x86\x7a" + "\xb8\x06\xf8\x40\xc1\x6d\x9f\x65\x86\x09\xae\xfd\x3a\xa1\xf6\x37" + "\xf3\xda\x0f\x87\xf6\xe3\xa0\x7d\x3c\xde\x4d\xc4\xf1\xa2\x27\xcb" + "\x83\xfd\xe2\x48\xfb\x26\xdc\x32\x69\x83\x2b\x62\x16\xa3\xc7\xae" + "\x29\x3a\x85\x13\x0e\xed\xb0\x12\x1f\xc7\xbe\xdf\x57\x18\x73\x8d" + "\x16\xef\xf7\xcd\xe7\x7f\x7c\x09\x3a\x88\x7d\xcf\xad\xe8\xc4\xd6" + "\x37\xc8\xfb\xb4\x5c\x81\xc7\x69\xfa\x6e\xff\x1c\xde\x37\x5c\xb3" + "\xf0\x12\x7d\xb7\xaf\xe8\xc4\xe6\x7b\xb4\x8a\x4e\x33\x6b\x15\x48" + "\x01\x7f\x7b\x93\xed\x1d\x56\x98\x6f\x6f\x9c\x3b\xc3\x6d\xc7\xf3" + "\x12\x8f\x16\xe0\xb8\xb4\x53\xbc\x29\x17\xd0\x74\xac\xf9\x5c\x2b" + "\x8c\x35\x7d\x6c\xc4\x9a\x3e\x0f\x69\xac\xe9\xe5\x2e\x2f\xd6\xf4" + "\x12\xad\x7f\xf0\x28\xe6\x11\xd3\xde\x9d\xd2\xa8\xf6\xee\xbc\x5a" + "\x9e\x5e\xe9\x9c\xf2\x28\xe6\x91\x6a\x77\xaf\x70\x6a\xf7\x27\x9d" + "\xe4\xd9\xfd\x49\x24\x2f\xe6\xe9\xb9\x9f\xc6\x3c\x3d\xf7\x8b\xc7" + "\x3c\x4f\x9e\xb2\x1d\xf3\x3c\xa5\xa7\x31\x4f\xf7\x29\x44\x93\x74" + "\x1f\x4e\x34\x49\x77\x27\xe9\x31\x4f\xb7\x45\x8f\x62\x1e\x29\x31" + "\x4f\xe7\x32\x1a\xf3\x74\x1b\x21\x2f\xe6\xe9\x16\xc4\x8f\x79\x7a" + "\x45\x5a\xc7\x3c\xdd\x76\xdb\x1f\xf3\x74\x2b\x96\x87\xe5\x6e\x45" + "\xf6\xc5\x3c\xdd\x07\x08\xc7\x3c\x4f\x9e\x16\x8f\x79\xc8\x3e\x6b" + "\xad\xfa\x54\x31\xd5\xaa\x4f\x6d\x6e\xfd\x31\xcf\x53\x43\x85\x75" + "\xe9\x53\x23\x48\xcc\xd3\xbd\x7f\xf3\xc7\x3c\xdd\xfb\x0b\xc7\x3c" + "\x4f\x1d\x24\xfa\xb0\xbb\x8f\x75\xcc\x03\xe7\x08\xc6\x3c\x4f\x5d" + "\xe7\xce\xe9\xcf\x8f\x79\x48\x1b\x97\x14\xea\x76\xe2\x31\x8f\x7a" + "\x27\xe1\x17\xf5\x02\xc2\x2f\xc4\xa7\xd6\x31\x8f\x7a\x74\xd3\x31" + "\x0f\xc1\x10\xdb\x4f\xd1\x98\x47\x9d\x69\x1d\xf3\x3c\x59\x26\x1c" + "\xf3\xf4\x9c\x45\x71\xd4\xb3\x3d\x3f\xe6\x51\x9f\x7f\x38\x62\x1e" + "\x51\x6c\x0d\xe5\xc7\x3c\x3d\xf2\xa4\xc7\x3c\x3d\x2e\x4a\x8b\x79" + "\x30\xe6\x84\x62\x9e\x9e\x03\x2c\x31\xc7\x8f\x79\x7a\x8e\x14\x8e" + "\x79\x7a\x46\xf2\x63\x1e\xdc\xbe\x50\xcc\xd3\x73\x1d\xaf\x7d\xab" + "\x98\xa7\xe7\x6e\x7e\xcc\x43\x8e\xa3\x31\x4f\xaf\x10\xc2\xa1\x4f" + "\x2e\x92\x1e\xf3\xf4\x1a\x20\x1e\xf3\xf4\xf2\xe3\xc7\x3c\xbd\x5c" + "\x48\x6c\xd3\x2b\x82\xc4\x3c\xbd\xba\x92\xed\x4f\xc6\x99\x6f\xa7" + "\x31\x0f\xd9\x4e\x63\x9e\x5e\x31\xf6\xc7\x3c\x4f\xb5\xc2\x98\x47" + "\x6d\x23\xe6\x51\x3f\xa4\x31\x4f\x9f\x36\xf2\x62\x9e\x3e\xce\x8f" + "\xb4\xb7\x54\xed\xdd\x6b\x05\xd5\xde\x4f\x27\xc8\xd3\x2b\x4f\xc7" + "\xcb\xd3\xde\x03\x7d\xa8\xf6\x1e\xe8\x23\xae\xbd\x9f\x19\x6d\x5b" + "\x7b\xf7\x8b\xa3\xda\xbb\xef\x59\x32\x36\xf6\x3d\x4c\xc6\xc6\xbe" + "\x09\xd2\xb5\xb7\xf7\x9d\x47\xda\x5b\x8a\xf6\xee\x13\x42\xb5\xb7" + "\xf7\x11\x79\xda\xdb\x5b\xc3\xd7\xde\x03\xcf\x5b\x6b\xef\xbe\x7d" + "\xec\xd7\xde\x7d\x47\xca\xc3\x72\xdf\x60\xfb\xb4\x77\xdf\xdd\xc2" + "\xda\xfb\x99\x30\x71\xed\x4d\xf6\x59\x6b\xa6\x7e\x23\xa9\x66\xea" + "\xe7\xd9\xfa\xb5\xf7\xb3\x05\xc2\xfa\xe8\xd9\x23\x44\x7b\xf7\xdd" + "\xd5\xfc\xda\xbb\xef\x2e\x61\xed\xdd\xcf\x8f\xe8\x94\xbe\x7b\xac" + "\xb5\x37\x9c\x23\xa8\xbd\xfb\xcd\xe0\xce\xd9\xc5\xd7\xde\xa4\x0d" + "\xe0\x93\x95\xe2\xda\xbb\x7f\x0f\xc2\x2f\xfd\x6e\x12\x7e\x21\x3e" + "\xb5\xd6\xde\xfd\x4e\x34\xad\xbd\x09\x86\xd8\x7e\x8a\x6a\xef\xfe" + "\xee\xd6\xda\xfb\x99\x10\x61\xed\x3d\xe0\x2a\xc5\xd1\x80\xd5\x7c" + "\xed\xdd\x7f\xc2\xc3\xa1\xbd\x45\xb1\x55\xc0\xd7\xde\x03\xfa\x4a" + "\xd7\xde\x03\xa6\x48\xd3\xde\x18\x73\x42\xda\x7b\xc0\x6e\x4b\xcc" + "\xf1\xb5\xf7\x80\xe3\xc2\xda\x7b\xc0\x79\xbe\xf6\xc6\xed\x0b\x69" + "\xef\x81\xed\x78\xed\x5b\x69\xef\x81\x7d\xf8\xda\x9b\x1c\x47\xb5" + "\xf7\xc0\x42\xc2\xa1\x4f\xdf\x91\xae\xbd\x07\xee\x16\xd7\xde\x03" + "\xf7\xf1\xb5\xf7\x40\xee\xbd\xc2\xc0\x0a\xa2\xbd\x07\x66\x91\xed" + "\x4f\xd7\x98\x6f\xa7\xda\x9b\x6c\xa7\xda\x7b\x60\xb5\xfd\xda\xdb" + "\xad\x15\x6a\x6f\x95\x0d\xed\xad\x7a\x48\xb5\xb7\xcf\x52\x79\xda" + "\xdb\x47\x74\xed\xb6\x6d\x0d\x18\xe0\x4b\x35\x60\x80\xaf\xb8\x06" + "\x1c\x34\xd6\xb6\x06\xf4\x8b\xa7\x1a\xf0\xf9\xf3\x84\xa3\x9f\x3f" + "\x42\x38\xfa\xf9\xa5\xd2\x35\xe0\xe0\x7b\x8f\x34\xa0\x14\x0d\xf8" + "\x1c\xa2\x1a\x70\xf0\x71\x79\x1a\x70\xf0\x31\xbe\x06\x0c\xb8\x68" + "\xad\x01\x9f\xef\x6b\xbf\x06\x7c\x7e\xb4\x3c\x0d\xf8\x7c\x88\x7d" + "\x1a\xf0\xf9\x3c\x61\x0d\x38\x68\x9c\xb8\x06\x24\xfb\xac\xc7\x6e" + "\xbf\xd1\x74\xec\xf6\xeb\xdc\xfa\x35\xa0\xef\x21\xe1\x71\xda\xf7" + "\x38\xd1\x80\xcf\xef\x69\x7e\x0d\xf8\xfc\x1e\x61\x0d\xe8\xc7\xbd" + "\xff\x7f\x3e\xdf\x5a\x03\xc2\x39\x82\x1a\xd0\x6f\x16\x77\xce\x1e" + "\xbe\x06\x24\x6d\x00\x9f\xac\x16\xd7\x80\xfe\x7d\x08\xbf\xf8\xdd" + "\x21\xfc\x42\x7c\x6a\xad\x01\xfd\x8a\x9b\xd6\x80\x04\x43\x6c\x3f" + "\x45\x35\xa0\xbf\xa7\xb5\x06\x1c\x14\x26\xac\x01\x5f\xb8\x4e\x71" + "\xf4\xc2\x3a\xbe\x06\xf4\x9f\xf2\x70\x68\x40\x51\x6c\x1d\xe2\x6b" + "\xc0\x17\x06\x48\xd7\x80\x2f\x44\x4a\xd3\x80\x18\x73\x42\x1a\xf0" + "\x85\x3c\x4b\xcc\xf1\x35\xe0\x0b\x27\x84\x35\xe0\x0b\x17\xf9\x1a" + "\x10\xb7\x2f\xa4\x01\x03\xda\xf3\xda\xb7\xd2\x80\x01\x7d\xf9\x1a" + "\x90\x1c\x47\x35\x60\x40\x11\xe1\x50\x9f\x7b\xd2\x35\x60\x40\x9e" + "\xb8\x06\x0c\x38\xc0\xd7\x80\x01\x29\x44\xeb\x05\x68\x89\x06\x0c" + "\xc8\x26\xdb\x7d\xea\xcc\xb7\x53\x0d\x48\xb6\x53\x0d\x18\xa0\xb3" + "\xa5\x01\x6d\x6b\x87\xc0\x14\xaa\x1d\x02\x53\xcc\xb5\xc3\x09\x9e" + "\x76\x18\xb2\xce\xb6\x76\x18\x56\x46\xb5\xc3\xd0\x41\xe4\xd9\x1e" + "\xea\x49\x9e\xed\x17\xd9\xda\x5d\x09\xa3\x61\x8c\x07\xed\x90\x77" + "\x2d\x9f\x68\x87\x6b\x75\x8a\x8f\x6f\x70\xda\xa1\x1a\xb9\xac\x9d" + "\xcd\x69\x87\xa9\x58\x3b\xbc\x38\x1a\x6b\x07\xd7\x6c\xd0\xa8\xa6" + "\xef\x76\xc5\x80\x66\xad\x84\xbf\xe1\xb9\xf9\x06\xda\x28\x01\x5d" + "\x99\x86\xcf\xc7\x75\xb2\xa0\x2d\xfc\x3c\x61\xed\x9a\xb7\x58\xdb" + "\x86\xfd\x3e\x24\xe8\x0a\x23\xe8\x0b\xac\x2d\x58\x0d\x71\x9b\xd3" + "\x10\xb7\x89\x86\xc0\x35\xb3\x70\xad\xac\xf8\x4a\xc6\x68\x98\xef" + "\xdd\x31\x34\x0a\xa0\x77\x07\xe3\x17\x0e\xc6\xeb\x8d\x75\x55\x88" + "\x99\xef\xdd\x21\x7b\x1e\xf2\xf8\x8c\xd3\x13\x1d\x96\x3a\x75\x60" + "\x6e\x47\xb7\xeb\x50\x43\x74\x69\x9e\xb1\x90\xe8\xd2\xf9\x5e\x8f" + "\x83\x0e\xea\xbf\xe5\x16\xd5\x11\x1b\xb1\x86\x98\xef\xad\xae\x99" + "\xef\xdd\xfd\xf6\x6d\xef\x9e\x58\x1f\xf1\x35\x44\x2d\xae\xdd\x02" + "\xba\xb4\x9c\xd5\x10\x6c\x4d\xad\xf7\xbd\x11\xae\xcf\x07\x7a\xd8" + "\x69\x20\xe8\xd2\x67\xba\x42\xdf\x8b\x91\xca\x70\xdb\xbb\x6b\xd2" + "\x08\xd4\xbd\xb4\xc0\x00\x36\xba\x83\x9f\x7f\x15\xae\xdd\x54\x14" + "\x71\x0e\xe1\xba\x44\xac\x36\xc5\xb5\x89\xe6\x7b\x2b\xa0\xcd\x80" + "\x4f\xe7\x99\xe9\x52\x4f\x93\x2e\x7d\xb1\xb3\x3c\x5d\xfa\xa2\x17" + "\x5f\x53\x0c\xf7\xb3\xd6\x14\x2f\x26\xd8\xaf\x29\x5e\xdc\x26\x4f" + "\x53\xbc\x98\x6b\x9f\xa6\x18\xea\x64\xa9\x29\x76\xb3\x9a\x62\x48" + "\x1a\xc6\xa0\xb0\xa6\x20\xfb\xac\xc7\x82\x61\xdb\xe8\x58\x30\x6c" + "\x56\xeb\xd7\x14\xc3\x54\xc2\xbc\x3f\xac\x33\xd1\x14\x43\x51\xf3" + "\x6b\x8a\xa1\x48\x58\x53\x0c\xe3\xde\x7f\x0d\x75\xb6\xd6\x14\x70" + "\x8e\xa0\xa6\x18\x76\x84\x3b\x07\xf1\x35\x05\x69\x03\x78\xe6\xbc" + "\xb8\xa6\x78\x69\x11\xe1\x9d\x97\x46\x12\xde\x21\x3e\xb5\xd6\x14" + "\x2f\xf5\x68\x5a\x53\x10\x0c\xb1\xfd\x14\xd5\x14\x2f\xcd\xb0\xd6" + "\x14\x43\xd6\x0a\x6b\x8a\xc0\xe1\x14\x47\x2f\x5f\xe4\x6b\x8a\x97" + "\xf6\x3d\x1c\x9a\x42\x14\x5b\x2a\xbe\xa6\x78\x79\xa9\x74\x4d\xf1" + "\xf2\x01\x69\x9a\x62\x28\x12\xd6\x14\x81\x4e\x96\x98\xe3\x6b\x8a" + "\xc0\x6e\xc2\x9a\x22\xd0\x8f\xaf\x29\x70\xfb\x42\x9a\x22\x30\x92" + "\xd7\xbe\x95\xa6\x08\x4c\xe0\x6b\x0a\x72\x1c\xd5\x14\xc3\xd5\x84" + "\x43\x87\xf8\x49\xd7\x14\xc3\x9d\xc4\x35\xc5\xf0\x76\x7c\x4d\x11" + "\x58\x41\xb4\xc3\x70\x5f\xa2\x29\x02\x75\x64\xfb\x10\x5f\xf3\xed" + "\x54\x53\x90\xed\x54\x53\x0c\x0f\xb2\x3f\xaf\xf4\x68\xcd\x64\xcb" + "\xe4\x95\x5e\x39\x2b\x6f\xfc\x7e\xa5\xfc\xd1\x9a\x49\xa9\xef\x74" + "\x87\x9b\xcd\xa7\x0c\x1a\x2b\x4f\xaf\x04\x85\x3d\x9a\x3f\x2c\xd5" + "\xee\xaf\xaa\xa9\xdd\x47\x9c\x90\x67\xf7\x11\x85\x8f\xe6\x30\x48" + "\xb5\x7b\x50\x16\xb5\xfb\xeb\xc3\xe5\xd9\xfd\xf5\x40\x79\xf9\xeb" + "\x50\x15\x8d\x41\x43\x55\xe2\x31\x68\xb0\xbb\xed\x18\x34\x24\x9c" + "\xc6\xa0\x6f\x1c\x24\x5a\xf0\x8d\x1c\xa2\x05\xdf\x60\xf3\x36\x89" + "\x38\x06\xdd\x1e\x19\xf1\xe5\xbc\x02\x05\xf3\x97\x5e\xba\xbc\x79" + "\x75\x0a\x5c\xaf\x5a\x8f\x63\x50\xb0\xf3\xba\x7a\x1c\x83\x1e\xe3" + "\xf2\xd7\x23\xcf\x94\x54\xd5\x21\x88\x71\xf2\xc9\x18\x19\x1c\x09" + "\x58\x50\x96\xd6\xd5\xb1\xc7\xe0\x7d\xdf\xdc\x2a\x50\xa4\xd5\x5b" + "\xe4\xb6\xa1\x4d\x5c\x47\xd8\x3c\xb7\x8d\x73\xda\xf7\x76\xf6\xf2" + "\x31\xe5\xb5\x0d\x99\x6f\xa5\x35\x95\xdb\xb6\xcc\x6b\xe7\xd4\x23" + "\x8f\x87\x37\xb7\xfd\x9a\x8a\xe6\xb6\x47\x6e\x93\x97\xdb\x1e\x99" + "\xcb\x8f\x43\x43\x0f\x5b\xc7\xa1\x6f\xb4\xb1\x3f\x0e\x7d\xa3\xaf" + "\x3c\x9c\xbf\xe1\x6d\x5f\x1c\xfa\xc6\x6a\xe1\x38\x34\xd8\x23\x51" + "\x34\x0e\x25\xfb\xac\xe3\x87\x90\xbe\x34\x7e\x18\x75\xa7\xf5\xc7" + "\xa1\xa3\xb2\x84\x63\x85\x51\xdb\x48\x1c\xfa\x46\x4a\xf3\xc7\xa1" + "\x6f\xa4\x08\xc7\xa1\x21\x9e\x44\xb3\xbf\xb1\xd6\x3a\x0e\x85\x73" + "\x04\xe3\xd0\x90\x91\xdc\x39\x29\xfc\x38\x94\xb4\x01\x5c\x33\x5d" + "\x3c\x0e\x1d\xed\x44\xb8\x27\xe4\x14\xe1\x1e\xe2\x53\xeb\x38\x34" + "\x64\x77\xd3\x71\x28\xc1\x10\xdb\x4f\xd1\x38\x34\xe4\xa6\x75\x1c" + "\x1a\xac\x12\x8e\x43\xc7\x9c\xa0\x38\x1a\x33\x83\x1f\x87\x8e\x1e" + "\xf2\x70\xc4\xa1\xa2\xd8\xca\xe2\xc7\xa1\x63\xda\x49\x8f\x43\xc7" + "\x0c\x93\x16\x87\x62\xcc\x09\xc5\xa1\x63\x56\x5b\x62\x8e\x1f\x87" + "\x8e\xd9\x29\x1c\x87\x8e\x39\xcc\x8f\x43\x71\xfb\x42\x71\xe8\x98" + "\xab\xbc\xf6\xad\xe2\xd0\xd0\x36\xfc\x38\x94\x1c\x47\xe3\xd0\xd0" + "\x5d\x84\x43\x5f\x3f\x28\x3d\x0e\x0d\x5d\x2d\x1e\x87\x86\xa6\xf3" + "\xe3\xd0\xd0\x28\x12\x6f\x86\x1e\x22\x71\x68\x68\x1c\xd9\xfe\x7a" + "\x81\xf9\x76\x1a\x87\x92\xed\x34\x0e\x0d\x2d\x7a\xb4\x9e\xb2\xb5" + "\xc5\xa1\x63\x23\xe5\xc5\xa1\x63\x23\x1e\xc5\x43\x52\x75\x79\xa8" + "\x96\xea\xf2\x37\x65\xd6\x7f\x78\xf3\x01\xc7\xff\x0f\x63\x3c\x34" + "\x76\x17\xb5\xfb\x38\x99\xf1\xff\x38\xd1\xf8\xdf\x76\x3c\x34\x59" + "\x4d\xe3\xa1\xc9\x6a\xf1\x78\x68\x7c\x0f\xdb\xf1\xd0\x84\x68\x1a" + "\x0f\xbd\x7d\x82\x68\x92\xb7\xf3\x88\x26\x79\x7b\x96\xf4\x78\xe8" + "\xad\xcb\xfc\x78\x68\xfc\xdc\x47\xf1\x90\xdc\x78\xe8\x8f\x6a\x1a" + "\x0f\xbd\xb5\x4f\x5e\x3c\xf4\x56\x3e\x3f\x1e\x9a\x5c\x6c\x1d\x0f" + "\xbd\xed\x69\x7f\x3c\xf4\xf6\x10\x79\x38\x7f\x3b\xc0\xbe\x78\xe8" + "\xed\xcd\xc2\xf1\xd0\xf8\xde\xe2\xf1\x10\xd9\x67\xad\x63\x27\x0c" + "\xa1\x3a\x76\x42\x9b\xd6\x1f\x0f\x85\xef\x12\xd6\xac\xe1\xfb\x48" + "\x3c\xf4\x76\x56\xf3\xc7\x43\x6f\x67\x09\xc7\x43\x13\xfa\x10\xed" + "\xf8\x76\xb6\x75\x3c\x04\xe7\x08\xc6\x43\x13\x26\x70\xe7\x64\xf1" + "\xe3\x21\xd2\x06\x70\xcd\x02\xf1\x78\x68\xa2\x3b\xe1\x9e\x09\x17" + "\x09\xf7\x10\x9f\x5a\xc7\x43\x13\x0e\x36\x1d\x0f\x11\x0c\xb1\xfd" + "\x14\x8d\x87\x26\x3a\x59\xc7\x43\xe3\xd5\xc2\xf1\xd0\x24\xb3\x3a" + "\x45\x93\x16\xf1\xe3\xa1\x89\x23\x1f\x8e\x78\x48\x14\x5b\xbb\xf8" + "\xf1\xd0\xa4\xce\xd2\xe3\xa1\x49\xa3\xa5\xc5\x43\x18\x73\x42\xf1" + "\xd0\xa4\xcd\x96\x98\xe3\xc7\x43\x93\x0e\x08\xc7\x43\x93\x8a\xf9" + "\xf1\x10\x6e\x5f\x28\x1e\x9a\x74\x8f\xd7\xbe\x55\x3c\x34\xd9\x93" + "\x1f\x0f\x91\xe3\x68\x3c\x34\xb9\x80\x70\xe8\xb8\x13\xd2\xe3\xa1" + "\xc9\x9b\xc5\xe3\xa1\xc9\xdb\xf8\xf1\xd0\xe4\x58\x12\xf7\x4c\x2e" + "\x22\xf1\xd0\xe4\x14\xb2\x7d\x5c\xa1\xf9\x76\x1a\x0f\x91\xed\x34" + "\x1e\x9a\x5c\xf1\x68\xad\x65\x6b\x8b\x87\xa6\xce\x95\x17\x0f\x4d" + "\x8d\x79\xa4\xcb\xa5\xea\xf2\xc9\x3a\xaa\xcb\xa7\x5d\x95\xa7\x57" + "\xa6\x89\x7f\xff\xdd\xa6\x2e\x7f\xbf\x80\xea\xf2\xf7\x0b\xc4\x75" + "\x79\xc4\x41\xdb\xba\x7c\x3a\xa2\xba\xfc\xdd\x48\x32\x36\xbe\x3b" + "\x82\x8c\x8d\xef\xb6\x91\xae\xcb\xdf\x49\xe0\xeb\xf2\xc8\x76\x8f" + "\x74\xb9\x5c\x5d\x3e\xb5\x80\xea\xf2\x77\x46\xca\xd3\xe5\xef\x04" + "\xf3\x75\x79\xf4\x74\x6b\x5d\xfe\x4e\x9e\xfd\xba\xfc\x9d\x53\xf2" + "\x70\xfe\x4e\x99\x7d\xba\xfc\xdd\x41\xc2\xba\x3c\xe2\x90\xb8\x2e" + "\x27\xfb\xac\xf5\x54\xd4\x29\xaa\xa7\xa2\x72\x5a\xbf\x2e\x8f\x0a" + "\x14\xd6\x4e\x51\x23\x89\x2e\x7f\xd7\xa7\xf9\x75\xf9\xbb\x3e\xc2" + "\xba\x3c\xea\x30\xd1\x30\xef\xfa\x5a\xeb\x72\x38\x47\x50\x97\x47" + "\xdd\xe4\xce\xf1\xe1\xeb\x72\xd2\x06\x70\x4d\x7b\x71\x5d\x3e\x7d" + "\x37\xe1\x9e\xe9\x8b\x08\xf7\x10\x9f\x5a\xeb\xf2\xe9\x63\x9b\xd6" + "\xe5\x04\x43\x6c\x3f\x45\x75\xf9\xf4\xcd\xd6\xba\x3c\xa2\x40\x58" + "\x97\xbf\x3f\x97\xe2\xe8\x7d\x77\xbe\x2e\x9f\x7e\xf1\xe1\xd0\xe5" + "\xa2\xd8\x0a\xe4\xeb\xf2\xf7\xf6\x49\xd7\xe5\xef\x5d\x96\xa6\xcb" + "\x31\xe6\x84\x74\xf9\xfb\x83\x2c\x31\xc7\xd7\xe5\xef\x8f\x16\xd6" + "\xe5\xef\x4f\xe7\xeb\x72\xdc\xbe\x90\x2e\x7f\x3f\x9d\xd7\xbe\x95" + "\x2e\x7f\x3f\x8f\xaf\xcb\xc9\x71\x54\x97\x47\x87\x11\x0e\x8d\x88" + "\x94\xae\xcb\xa3\x07\x89\xeb\xf2\xe8\x21\x7c\x5d\x1e\xed\x4a\xf4" + "\x77\x74\x14\xd1\xe5\xd1\x6a\xb2\x3d\x22\xc2\x7c\x3b\xd5\xe5\x64" + "\x3b\xd5\xe5\xd1\xb1\x8f\xd6\x61\xb6\x36\x5d\xfe\x41\x3b\x79\xba" + "\xfc\x03\x17\x79\xfa\x70\x6e\x39\xd5\x87\x73\xcb\xc5\xf5\xe1\x07" + "\x67\x6d\xeb\xc3\x39\x6a\xaa\x0f\x67\x2d\x25\x1c\x3d\x6b\x3a\xe1" + "\xe8\x59\x7d\xa4\xeb\xc3\x99\x39\x7c\x7d\xf8\x61\xdf\x47\xfa\x50" + "\xae\x3e\x8c\x4e\xa1\xfa\x70\xe6\x0c\x79\xfa\x70\x66\x34\x5f\x1f" + "\xce\x5b\x69\xad\x0f\x67\x16\xdb\xaf\x0f\x67\xde\x94\xa7\x0f\x67" + "\xea\xec\xd3\x87\xb3\xc6\x0a\xeb\xc3\x0f\x2a\xc4\xf5\x21\xd9\x67" + "\x3d\xae\xcf\xbe\x49\xc7\xf5\xd9\x87\x5b\xbf\x3e\x9c\x1d\x21\x3c" + "\x86\xcf\x9e\x41\xf4\xe1\xac\xb0\xe6\xd7\x87\xb3\xc2\x84\xf5\xe1" + "\xec\xf3\x64\x2c\x9d\x35\xce\x5a\x1f\xc2\x39\x82\xfa\x70\x8e\x3b" + "\x77\x4e\x18\x5f\x1f\x92\x36\x80\x6b\x06\x88\xeb\xc3\x39\xdc\x3b" + "\xa3\x39\x9b\x09\xf7\x10\x9f\x5a\xeb\xc3\x39\x73\x9b\xd6\x87\x04" + "\x43\x6c\x3f\x45\xf5\xe1\x9c\x83\xd6\xfa\xf0\x83\x72\x61\x7d\x38" + "\x37\x9d\xe2\x68\xee\x20\xbe\x3e\x8c\x71\x7a\x38\xf4\xa1\x28\xb6" + "\x22\xf8\xfa\x30\xe6\x94\x74\x7d\x38\xb7\x8d\x34\x7d\x88\x31\x27" + "\xa4\x0f\xe7\x8e\xb5\xc4\x1c\x5f\x1f\xce\x9d\x25\xac\x0f\xe7\xae" + "\xe4\xeb\x43\xdc\xbe\x90\x3e\x9c\xbb\x8f\xd7\xbe\x95\x3e\x9c\x5b" + "\xcc\xd7\x87\xe4\x38\xaa\x0f\xe7\x91\x6f\x70\x2b\x3e\x58\x2a\x5d" + "\x1f\xce\x1b\x2b\xae\x0f\xe7\x4d\xe0\xeb\xc3\x79\xfd\x89\x0e\x9c" + "\xb7\x82\xe8\xc3\x79\x81\x64\xfb\x07\xc9\xe6\xdb\xa9\x3e\x24\xdb" + "\xa9\x3e\x9c\x97\x21\x7f\x8d\xe6\xe2\x60\xaa\x2b\x16\x07\x8b\xeb" + "\x8a\xf9\x83\x6c\xeb\x8a\x8f\xd2\xa8\xae\x58\x70\x93\x3c\xdb\x0b" + "\xce\x90\x67\x7b\x01\x5b\x9f\x32\xa1\x18\x74\x45\xcf\xc8\x88\xbd" + "\x37\xf2\x59\x5d\xf1\xe5\xec\x3a\x05\xe8\x3c\x67\x23\xd6\x15\xa0" + "\xe7\xd6\x2e\xc4\xba\xa2\x92\x5b\xa3\xb9\xa0\x7d\x71\x9c\xb9\xae" + "\x98\xbf\x92\x5d\xaf\x89\xb5\x45\x4d\x1d\x7b\x1c\xde\x2f\xb4\x7e" + "\xf3\xf0\x6c\x6e\xfd\x26\xb4\x6d\xbe\x6e\x93\x5d\xcb\x79\x03\x74" + "\xc7\x3b\xe0\x0b\x33\xdd\xf1\x68\xfd\x26\x1e\xe7\x63\x65\xae\xff" + "\x88\x2d\xe7\xeb\x8d\xc5\x77\xac\xf5\xc6\x82\x61\xf6\xeb\x8d\x05" + "\x91\xf2\xf4\xc6\x82\x08\xfb\xf4\xc6\x82\x23\xc2\x7a\x63\xbe\x2f" + "\xc6\xa7\xb0\xde\x20\xfb\xac\xc7\x89\x8f\x22\xe9\x38\xf1\xd1\x80" + "\xd6\xaf\x37\x16\x96\x09\x8f\x09\x0b\xcf\x12\xbd\xb1\x40\xd3\xfc" + "\x7a\x63\x81\x46\x58\x6f\x7c\x34\x9a\x70\xf3\x82\x63\xd6\x7a\x03" + "\xce\x11\xd4\x1b\x1f\x2d\xe5\xce\xd1\xf0\xf5\x06\x69\x03\x38\x28" + "\x47\x5c\x6f\xc4\x0d\x21\x9c\x14\xd7\x8e\x70\x12\xf1\xa9\xb5\xde" + "\xf8\xe8\x62\xd3\x7a\x83\x60\x88\xed\xa7\xa8\xde\x88\xeb\x6b\xad" + "\x37\xe6\xfb\x08\xeb\x8d\xc5\x4e\x14\x47\x8b\xb6\xf1\xf5\x46\xdc" + "\xdc\x87\x43\x6f\x88\x62\xab\x8c\xaf\x37\x16\x0d\x97\xae\x37\x16" + "\x2d\x90\xa6\x37\x30\xe6\x84\xf4\xc6\xa2\x23\x96\x98\xe3\xeb\x8d" + "\x45\xe7\x85\xf5\xc6\xa2\x3b\x7c\xbd\x81\xdb\x17\xd2\x1b\x8b\x7b" + "\xf0\xda\xb7\xd2\x1b\x8b\x87\xf1\xf5\x06\x39\x8e\xea\x8d\xc5\x5a" + "\x2e\x66\x3b\x2b\x5d\x6f\x2c\x3e\x22\xae\x37\x16\x9f\xe0\xeb\x8d" + "\xc5\xd9\x44\x57\x2c\xae\x21\x7a\x63\x71\x3e\xa7\x43\xca\xcd\xb7" + "\x53\xbd\x41\xb6\x53\xbd\xb1\xc4\xd9\xce\x7c\x54\x86\x94\xf5\x9b" + "\x79\x77\xf9\xf9\x28\x53\x2e\x4a\xdf\xff\xe9\xa0\xc6\x7c\x14\x8c" + "\xf3\xd3\x74\xe2\xf9\x28\x3c\x6e\xd3\x7c\xd4\x79\x96\xa7\x68\x3e" + "\x4a\xcb\xe6\xa3\x70\x2e\x0a\x62\xf5\xc6\x5c\x94\xf1\x23\xeb\xb5" + "\x9b\x79\x46\xe9\xb9\xa8\xa9\x73\x55\x68\x0b\x3b\x76\x37\xe4\x93" + "\x5c\x54\x79\x63\x2e\x0a\x8f\xd9\x86\x5a\xeb\x5c\x14\x1e\xab\x69" + "\x2e\xea\x9c\xcc\x5c\x54\x7c\xa6\xbc\xb1\x3b\xfe\x01\x7f\xff\xef" + "\x61\x5c\xbb\xb9\xc4\x8b\xbe\x23\x4e\x94\xf9\xfd\xbf\x44\xf1\xef" + "\x9f\x3f\x9a\xab\x2c\x62\xf7\xf8\x0a\x6a\xf7\xa4\x95\xf2\xec\x9e" + "\xb4\xe2\xd1\x9c\x08\xa9\x76\x4f\x1c\x47\xed\x9e\x6c\x90\x67\xf7" + "\x64\xbd\xbc\x9c\x77\x8a\x8e\xc6\xa6\x29\x3a\xf3\xd8\xb4\x30\xc8" + "\x3c\x36\x5d\x5a\x6c\x3b\x36\x5d\x15\x40\x63\xd3\x15\x9b\x89\x0e" + "\x5c\x91\x40\x74\xe0\x0a\x76\x4c\x4e\x18\x8e\xd8\x98\x54\x8f\xe3" + "\xd3\x0f\xea\x14\x7b\xaf\x69\x14\xfa\x65\x24\x2e\x2d\xd5\x17\xa1" + "\x62\x5d\x1d\xfa\x78\x21\x72\x5e\x7d\x03\x39\x7f\x7e\xab\x4e\xe1" + "\x36\x13\xb9\xc0\xb8\x00\xba\xa9\x08\x74\x44\x0e\x8a\x49\xc4\x31" + "\xeb\xf2\x03\xa5\x31\x3a\xb3\x98\x75\x99\x1f\x8d\x57\xe1\xb8\x98" + "\x3a\xf4\xed\x07\x1a\x05\x8e\x4b\x1b\x32\xdf\x4a\x6b\x18\xf0\x74" + "\x20\x5b\x63\xc8\x3c\x2f\x0e\xd7\x56\x4f\xe5\xe7\xc5\xeb\x33\xdf" + "\xca\xb8\x97\xf7\x74\x10\x5b\xbb\xb0\x0f\xcd\x8f\xdb\x9b\x17\xff" + "\xac\x1e\x79\x98\x6a\x17\xe2\x71\xf0\xe1\xcb\x8b\x27\x15\xd1\xbc" + "\xf8\xf2\xa5\xf2\xf2\xe2\xcb\x93\xf9\x71\xea\xea\x1c\xeb\x38\x75" + "\xf9\x65\xfb\xe3\xd4\x15\xed\xe4\x3d\x0b\x2b\x5c\xec\x8b\x53\x57" + "\xcc\xb0\x8c\x53\x77\x25\xe2\x38\x75\x69\x19\xc6\xaa\x70\x9c\x4a" + "\xf6\x59\xc7\x17\xab\xda\xd1\xf8\x62\xe5\x99\xd6\x1f\xa7\xae\x8c" + "\x13\x8e\x25\x56\x2e\x25\x71\xea\x8a\xe8\xe6\x8f\x53\x57\x44\x0b" + "\xc7\xa9\x2b\xef\x10\x4d\xbf\x22\xda\x14\x73\xd2\x38\x15\xce\x11" + "\x8c\x53\x57\xf5\xb5\x3c\x87\xc4\xa9\x2b\x66\x92\x38\x75\xd5\x08" + "\xf1\x38\x75\xd5\x45\xc2\x4f\xab\xf6\x11\x7e\x22\x3e\xb5\x8e\x53" + "\x57\xad\x6e\x3a\x4e\x25\x18\x62\xfb\x29\x1a\xa7\xae\x3a\x65\x1d" + "\xa7\x2e\x2d\x12\x8e\x53\x53\x76\x53\x1c\xa5\x8c\xe4\xc7\xa9\x7f" + "\xea\xfc\x70\xc4\xa9\xa2\xd8\x8a\xe3\xc7\xa9\x7f\xba\x2a\x3d\x4e" + "\x4d\xe9\x26\x2d\x4e\xc5\x98\x13\x8a\x53\x53\xb8\xfa\xe7\x04\x2f" + "\xd6\x71\x6a\xca\x4a\xe1\x38\x35\x25\x87\x1f\xa7\xe2\xf6\x85\xe2" + "\xd4\x94\x13\xbc\xf6\xad\xe2\xd4\x94\xcb\xfc\x38\x95\x1c\x47\xe3" + "\xd4\xd5\x29\x84\x43\x97\x2e\x90\x1e\xa7\xae\x9e\x21\x1e\xa7\xae" + "\x9e\xcb\x8f\x53\x57\x07\x91\x78\x74\x75\x36\x89\x53\x57\x87\x93" + "\xed\x4b\x63\xcd\xb7\xd3\x38\x95\x6c\xa7\x71\xea\xea\x3d\x76\xc6" + "\xa9\x59\xcd\x14\xa7\x06\x3f\x5c\x71\xaa\x21\xa6\x65\xe3\xd4\x8f" + "\x87\xc9\x8b\x53\x3f\x1e\x6a\x87\x6e\xcf\x68\x42\xb7\x07\xfd\x6f" + "\xe9\xf6\xd5\x1a\xaa\xdb\xd7\x1e\x90\xa7\x55\xd6\xee\x7f\x90\x76" + "\x7f\xf8\x6c\xfe\xb1\xd9\xb7\x7a\x52\x65\xd6\xff\x48\xf5\x7e\x14" + "\xa3\x4a\xb5\xfb\x5a\x3d\xb5\xfb\x7a\x99\xf5\x3f\xd7\xe7\xca\x8b" + "\x51\x3f\x31\x9b\xb7\xff\x09\x6f\xde\xfe\xf7\xbc\xf7\xa7\x69\x73" + "\x6d\xc7\xa8\x99\x66\xf3\xf6\x37\x72\xf3\xf6\x37\x72\xf3\xf6\x37" + "\xb2\xf3\xf6\xe3\x0f\x90\x18\xf5\x2e\x8e\x51\xaf\x40\x8c\xfa\x5e" + "\x84\x42\xcf\xd5\xc6\xc7\x73\xad\x8a\x21\xce\xc4\x71\x69\x69\x1c" + "\xfc\x3f\x56\x87\x3e\x9e\x87\x9c\xd7\x40\x7c\xb9\x1b\xc6\xab\xdd" + "\x0b\x75\x8a\x94\x0f\x80\xeb\xcb\xf3\x90\x5b\x34\xc4\xae\xb7\x70" + "\xec\x7a\x0c\xe2\xd2\x95\x5c\xec\xba\x21\xa1\x34\xd6\x3c\x76\x4d" + "\xbb\xc9\xc6\xae\x3a\x32\x8f\xab\x34\x16\x62\x57\xb8\x1e\xae\xb5" + "\x6f\x1e\xbb\xde\x83\xd8\xb4\x1e\x62\xd3\xb4\x6b\x16\x71\xec\x7b" + "\xd6\x71\xec\x3d\xcf\xb7\xb2\xea\x06\x3c\x1d\x8c\xe3\xd8\xbb\x3b" + "\xff\x17\xe3\xd8\xd4\x18\x1a\xc7\x6e\x90\x39\xff\x7f\x83\xc5\xfc" + "\xff\x2c\x81\xf9\xff\x1b\x24\xcc\xff\xdf\x20\x73\xfe\xff\x06\x3b" + "\xe7\xff\x6f\xb4\x9a\xff\xff\x17\xf6\x7d\x6b\x5a\x2c\xc6\xb3\x70" + "\x1c\x4b\xf6\x59\xc7\x1f\x19\x66\xf3\xff\x33\x1e\x82\xf9\xff\x19" + "\x22\x73\xb4\x33\xb8\xf9\xff\x1b\xef\xc3\xfc\xff\x8d\x22\xf3\xff" + "\x33\xb8\xf9\xff\x1b\x7d\xac\xe3\xd8\x8d\x22\xf3\xff\x33\x6e\x5a" + "\x9e\x43\xe2\xd8\x8d\xdc\xfc\xff\x4c\x1b\xf3\xff\x33\xb9\xf9\xff" + "\x99\xdc\xfc\x7f\xe2\x53\xeb\x38\x36\xd3\x8e\xf9\xff\x1b\xb9\xf9" + "\xff\x1b\x6d\xcc\xff\xcf\x14\x98\xff\x9f\x16\x23\x1c\xc7\x7e\x62" + "\x36\xff\xff\x13\x8b\xf9\xff\x99\x0f\xc9\xfc\x7f\x51\x6c\x59\xcc" + "\xff\xdf\x24\x63\xfe\xff\x26\x89\xf3\xff\x37\x8a\xcc\xff\xff\x84" + "\x9b\xff\xbf\x51\x64\xfe\xff\x27\x22\xf3\xff\x3f\xb1\x98\xff\xbf" + "\x51\x64\xfe\xff\x27\xe9\xbc\xf6\xad\xe2\xd8\x4f\x2c\xe6\xff\x6f" + "\xb4\x98\xff\x9f\xc5\xcd\xff\x4f\xeb\x2c\x3d\x8e\xcd\xb2\x31\xff" + "\x3f\xcb\x62\xfe\x7f\x16\x37\xff\x3f\x8b\x9b\xff\x9f\xc5\xcd\xff" + "\x4f\xf3\x32\xdf\x4e\xe3\x58\xb2\x9d\xc6\xb1\x59\xf6\xce\xff\xcf" + "\x70\xb0\x4e\x51\x50\xcb\xcf\xff\x6f\xae\x3a\x45\xa6\x77\xae\x2d" + "\x35\xff\xff\x53\x99\xf3\xff\x3f\x15\x9d\xff\xff\x28\xa6\x12\xd2" + "\xf6\x59\x29\x54\xdb\x7f\x26\xf3\xfb\xa7\x9f\x89\x7e\xff\xf4\x51" + "\x4c\x25\x66\xf7\x4f\xc3\xa8\xdd\xb3\xef\xc8\xb3\x7b\x76\x8d\xbc" + "\x98\x6a\x47\x15\x8d\xa9\x76\x54\x89\xbf\xf7\xcb\x39\x6e\x3b\xa6" + "\xda\xee\x43\x63\xaa\xdc\x74\xa2\x47\x72\xb9\x6f\xb2\xe7\xfa\x35" + "\xdf\x7b\xbf\xad\x79\xfc\xf7\x7e\x5b\x06\x3c\x7a\xef\xd7\x1c\xf1" + "\xd2\x67\xc7\x68\xbc\xb4\x75\x91\xbc\x78\x69\x6b\x1c\x3f\x5e\xda" + "\x99\x69\x1d\x2f\x6d\x3d\x6f\x7f\xbc\x94\xeb\x24\xef\x59\xc0\xe9" + "\x05\x7b\xe2\xa5\xdc\x48\xe1\xf7\x7e\x39\x85\xe2\xef\xfd\xc8\x3e" + "\x6b\x9d\xbb\xdd\x6c\x5e\xe1\xb6\xe2\xd6\x1f\x2f\x6d\x8b\x11\xd6" + "\xb4\xdb\x16\x91\x78\x29\x37\xa2\xf9\xe3\xa5\xdc\x08\xe1\x78\x69" + "\xdb\x75\xa2\x2d\x73\x23\xac\xe3\x25\x38\x47\x30\x5e\xda\xde\xc3" + "\xf2\x1c\x12\x2f\xe5\x46\x91\x78\x69\xfb\x30\xf1\x78\x69\x3b\xf7" + "\x5d\xec\xed\xbb\x09\x3f\x11\x9f\x5a\xc7\x4b\xdb\x97\x36\x1d\x2f" + "\x11\x0c\xb1\xfd\x14\x8d\x97\xb6\x9f\xb0\x8e\x97\x72\x8e\x09\xc7" + "\x4b\x3b\xcc\xbe\x53\xb3\x63\x38\x3f\x5e\xfa\xb3\xfb\xc3\x11\x2f" + "\x89\x62\x2b\x86\x1f\x2f\xfd\xf9\xa2\xf4\x78\x69\x87\xa7\xb4\x78" + "\x09\x63\x4e\x28\x5e\xda\xc1\x7d\xff\x83\xe0\xc5\x3a\x5e\xda\x91" + "\x20\x1c\x2f\xed\xc8\xe4\xc7\x4b\xb8\x7d\xa1\x78\x69\xc7\x11\x5e" + "\xfb\x56\xf1\xd2\x8e\xf3\xfc\x78\x89\x1c\x47\xe3\xa5\x9d\xc9\x84" + "\x43\x73\x66\x49\x8f\x97\x76\x46\x8a\xc7\x4b\x3b\x67\xf0\xe3\xa5" + "\x9d\x43\x49\x5c\xb4\x33\x83\xc4\x4b\x3b\xc3\xc8\xf6\x9c\x99\xe6" + "\xdb\x69\xbc\x44\xb6\xd3\x78\x69\xe7\x0e\xfb\xe3\x25\xfb\xeb\x18" + "\x3d\xf8\xf9\xa9\xea\x87\x74\x7e\xea\x5f\xfd\xe4\xc5\x4a\x7f\xf5" + "\x7d\xa4\xdb\xa5\xea\xf6\x9d\x05\x54\xb7\xef\xca\x93\xa7\x55\x76" + "\xed\x91\xa7\xdb\xf3\x73\xa9\x6e\xcf\xcf\x15\xd7\xed\xbb\x13\x6c" + "\xeb\xf6\xbc\x2a\xaa\xdb\xf7\x8c\x24\xe3\xe2\x9e\x01\x64\x5c\xfc" + "\xe2\x7a\xf3\xe9\xf6\x2f\xa6\xf3\x75\xfb\xee\xcb\x8f\x74\x7b\x73" + "\xe8\xf6\xbf\xc6\x53\xdd\xfe\xc5\x20\x79\xba\xfd\x0b\x1f\xbe\x6e" + "\xdf\x37\xda\x5a\xb7\x7f\x91\x69\xbf\x6e\xff\xe2\xa0\xbc\x67\xe1" + "\x8b\x02\xfb\x74\xfb\x9e\xce\xc2\xba\x7d\x77\xb2\xb8\x6e\x27\xfb" + "\xac\xf5\x56\xde\x41\xaa\xb7\xf2\x56\xb6\x7e\xdd\x9e\xe7\x2d\xac" + "\xad\xf2\x06\x11\xdd\xbe\xc7\xab\xf9\x75\xfb\x1e\x2f\x61\xdd\x9e" + "\xb7\x93\x68\x9c\x3d\x5e\xd6\xba\x1d\xce\x11\xd4\xed\x79\x67\x2d" + "\xcf\x21\xba\x7d\x4f\x57\xa2\xdb\xf3\xee\x88\xeb\xf6\xbd\x5c\x5e" + "\x61\x6f\x24\xe1\x27\xe2\x53\x6b\xdd\xbe\x77\x48\xd3\xba\x9d\x60" + "\x88\xed\xa7\xa8\x6e\xdf\xbb\xd4\x5a\xb7\xef\x8e\x17\xd6\xed\xf9" + "\x13\x28\x8e\xbe\xbc\xc7\xd7\xed\x7b\x4f\x3c\x1c\xba\x5d\x14\x5b" + "\xde\x7c\xdd\xfe\xe5\x66\xe9\xba\xfd\xcb\x62\x69\xba\x1d\x63\x4e" + "\x48\xb7\xe7\x77\xe6\xf0\xd3\x55\x58\xb7\xe7\xfb\x09\xeb\xf6\xfc" + "\xd1\x7c\xdd\x8e\xdb\x17\xd2\xed\xf9\x8b\x78\xed\x5b\xe9\xf6\xfc" + "\x4c\xbe\x6e\x27\xc7\x51\xdd\xbe\x2f\x80\x1b\xdf\xfa\x48\xd7\xed" + "\xfb\x3a\x8b\xeb\xf6\x7d\x3d\xf8\xba\x3d\xbf\x86\xe8\xf3\x7d\x21" + "\x44\xb7\xef\xe3\xb6\xef\xee\x6d\xbe\x9d\xea\x76\xb2\x9d\xea\xf6" + "\x7d\x93\x1f\xd5\x39\x6a\x6d\x75\x8e\xfe\xef\xa6\x3c\xed\xfe\x7f" + "\x3a\x79\x1a\xf2\x2b\x0d\xd5\x90\x5f\x69\xcc\x35\x24\xbf\x1e\xc1" + "\xdf\x8e\xd8\xd6\x90\x05\x2e\x54\x43\xfe\x7d\x06\xe1\xe8\xbf\x8f" + "\x26\x1c\xfd\x77\xf6\xbd\xb5\xb4\x3a\x47\x07\x56\xf2\xeb\x1c\xed" + "\x77\x7f\x54\xe7\x48\xae\x3e\xdc\x67\x36\x0f\xe6\xc0\x58\x79\xfa" + "\xf0\x40\x18\x5f\x1f\x7e\x3d\xcb\x5a\x1f\x1e\x38\x60\xbf\x3e\x3c" + "\x20\xf3\xfb\x17\x07\xca\xed\xd3\x87\x7f\x1f\x22\x5c\x77\xe0\x6f" + "\xc7\xc4\xeb\x1c\x91\x7d\xd6\xe3\xfa\x3f\xcc\xea\x8a\xff\x63\x67" + "\xeb\xd7\x87\xff\x08\x16\x1e\xc3\xff\x31\x96\xe8\xc3\xbf\x07\x34" + "\xbf\x3e\xfc\x7b\x80\xb0\x3e\xfc\xc7\x71\x32\x96\xfe\x7d\xa8\x75" + "\xdd\x01\x38\x47\x50\x1f\xfe\x83\xab\xff\xfd\xf7\x00\xbe\x3e\x24" + "\x6d\x00\xd7\x78\x8a\xeb\xc3\x82\x7d\x84\x7b\x0a\x96\x12\xee\x21" + "\x3e\xb5\xd6\x87\x05\x13\x9a\xd6\x87\x04\x43\x6c\x3f\x45\xf5\x61" + "\xc1\x36\x6b\x7d\xf8\x37\x8d\xb0\x3e\xfc\x6a\x11\xc5\xd1\x57\x9d" + "\xf9\xfa\xb0\xe0\xea\xc3\xa1\x0f\x45\xb1\x15\xcc\xd7\x87\x07\x0f" + "\x4a\xd7\x87\x07\xaf\x4b\xd3\x87\x18\x73\x42\xfa\xf0\xab\x21\x96" + "\x98\xe3\xeb\xc3\xaf\xc6\x0b\xeb\xc3\xaf\x66\xf1\xf5\x21\x6e\x5f" + "\x48\x1f\x7e\xb5\x99\xd7\xbe\x95\x3e\xfc\xea\x00\x5f\x1f\x92\xe3" + "\xa8\x3e\xfc\x3a\x9c\x70\xe8\xdf\x66\x48\xd7\x87\x5f\x0f\x11\xd7" + "\x87\x5f\x0f\xe7\xeb\xc3\xaf\x3d\x88\x0e\xfc\x7a\x26\xd1\x87\x5f" + "\x7b\x93\xed\x7f\x8b\x36\xdf\x4e\xf5\x21\xd9\x4e\xf5\xe1\xd7\xf1" + "\xf6\xaf\xe7\x68\x96\xbc\x6e\x0b\xad\xe7\x68\xae\xbc\x6e\x4b\xaf" + "\xe7\x38\xdc\x5e\x9e\x36\x3c\x6c\xcf\xfa\xf7\x47\x73\x60\x1a\x73" + "\xba\x5f\xa7\xd1\x9c\xee\x37\x4b\xe5\xe9\x94\x6f\x92\xe5\xe9\xf1" + "\xef\xd3\xa8\x1e\xff\x3e\x4d\x7c\x7e\xfb\xb7\x63\x6d\xeb\xf1\xa3" + "\xe5\x54\x8f\x7f\xc7\xd5\xe2\xf9\xae\x1b\x19\x13\x8f\x9c\x97\x33" + "\xbf\x7d\xcd\x2d\xe4\xfc\xb1\xe5\xfc\xf6\xd3\x87\xc9\xfc\xf6\x79" + "\x96\xf3\xdb\x8f\x8c\xe7\xcf\x6f\xff\xf6\x94\xd8\xfc\x76\x9c\xe3" + "\x6d\xc8\x7b\x3a\x08\xcf\x6d\x17\x9c\xd7\x3e\xb1\x79\xe7\xb5\x63" + "\x5c\x7e\xb6\x98\xe8\xf9\x4f\x1f\x4a\x3d\x7f\x78\x1c\xd5\xf3\x47" + "\x7a\xc8\xd3\xf3\x47\xd4\x7c\x3d\xff\xcf\x61\xd6\x7a\xfe\xc8\x4a" + "\xfb\xf5\xfc\x91\xdd\xf2\x9e\x93\x23\xbb\xec\xd3\xf3\xdf\xb5\x13" + "\x9e\xd7\xfe\xed\x38\xf1\x79\xed\x64\x9f\xb5\x0e\x3b\x6a\xb6\xae" + "\xf6\xe8\x82\xd6\xaf\xe7\x8f\x7a\x09\x6b\xae\xa3\x3d\x88\x9e\xff" + "\xce\xa5\xf9\xf5\xfc\x77\x2e\xc2\x7a\xfe\x68\x26\xd1\x3e\xdf\xb9" + "\x58\xe7\x7b\xe1\x1c\x41\x3d\x7f\xf4\x84\xe5\x39\x44\xcf\x7f\xe7" + "\x4a\xf4\xfc\xd1\xcb\xe2\x7a\xfe\x18\x57\x33\xf9\xd8\x58\xc2\x5d" + "\xc4\xa7\xd6\x7a\xfe\x58\xdf\xa6\xf5\x3c\xc1\x10\xdb\x4f\x51\x3d" + "\x7f\x6c\xae\xb5\x9e\xff\x36\x4c\x58\xcf\x7f\x3f\x92\xe2\xe8\xf8" + "\x55\xbe\x9e\x3f\x76\xf0\xe1\xd0\xf3\xa2\xd8\xf2\xe2\xeb\xf9\xe3" + "\xab\xa5\xeb\xf9\xe3\x87\xa5\xe9\x79\x8c\x39\x21\x3d\xff\x7d\x3b" + "\x0e\x3f\xae\xc2\x7a\xfe\xfb\x3e\xc2\x7a\xfe\xfb\x61\x7c\x3d\x8f" + "\xdb\x17\xd2\xf3\xdf\xcf\xe0\xb5\x6f\xa5\xe7\xbf\x5f\xc9\xd7\xf3" + "\xe4\x38\xaa\xe7\xff\xe9\x4d\x38\xf4\x9b\x7b\xd2\xf5\xfc\x3f\xdb" + "\x89\xeb\xf9\x7f\xba\xf3\xf5\xfc\xf7\x95\x44\xb7\xff\x73\x28\xd1" + "\xf3\xdf\xd7\x91\xed\xdf\xd4\x99\x6f\xa7\x7a\x9e\x6c\xa7\x7a\xfe" + "\x9f\x21\xf6\xcf\xd3\xb0\x3f\xdf\xfb\xe0\xe7\x69\xa8\x1e\xd2\x79" + "\x1a\x85\xe7\xe5\xe9\xf9\xc2\x0a\x79\xda\xb2\xac\x90\x6a\xcb\xb2" + "\x42\xf1\xf9\x02\x27\xf2\x6c\x6b\xcb\x12\x15\xd5\x96\x45\x73\x09" + "\x3f\x17\x8d\x27\xfc\x5c\xe4\x69\xef\x7c\x81\x35\x77\x39\x3d\x69" + "\x9a\x2f\xb0\x90\x9b\x2f\x00\x9a\x92\x68\xc8\x1f\xd6\xf1\xe7\x0b" + "\x9c\xf4\x14\x9b\x2f\x20\x38\x4f\xc0\x42\x37\x9a\x34\xa6\xdc\x79" + "\x02\x0f\xbf\x6e\xfc\x67\x04\xd5\x8d\x3f\x4c\x90\xa7\x1b\x7f\x08" + "\xe7\xeb\xc6\x53\x0b\xac\x75\xe3\x0f\x87\xed\xd7\x8d\x3f\x5c\x94" + "\xa7\x1b\x7f\xd0\xda\xa7\x1b\x8b\x86\x0b\xcf\x13\x38\x91\x2f\x3e" + "\x4f\x80\xec\xb3\x1e\xef\x8b\x2f\xd2\xf1\xbe\x38\xaf\xf5\xeb\xc6" + "\xe2\x30\xe1\xb1\xbd\x78\x02\xd1\x8d\x45\x81\xcd\xaf\x1b\x8b\x02" + "\x85\x75\x63\x71\x31\x19\x63\x8b\x02\xad\x75\x23\x9c\x23\xa8\x1b" + "\x4b\x9c\x2c\xcf\x21\xba\xb1\x28\x88\xe8\xc6\x92\x6e\xe2\xba\xb1" + "\xe4\x20\xe1\xa5\x92\xd5\x84\x97\x88\x4f\xad\x75\x63\x49\x64\xd3" + "\xba\x91\x60\x88\xed\xa7\xa8\x6e\x2c\xd9\x6d\xad\x1b\x4f\xec\x11" + "\xd6\x8d\x65\x4b\x29\x8e\xca\x7a\xf0\x75\x63\xc9\xcd\x87\x43\x37" + "\x8a\x62\x2b\x8c\xaf\x1b\x4b\x8f\x48\xd7\x8d\xa5\x77\xa4\xe9\x46" + "\x8c\x39\x21\xdd\x58\x36\x9c\xc3\x4f\x90\xb0\x6e\x2c\x9b\x22\xac" + "\x1b\xcb\x16\xf0\x75\x23\x6e\x5f\x48\x37\x96\x6d\xe3\xb5\x6f\xa5" + "\x1b\xcb\x0e\xf3\x75\x23\x39\x8e\xea\xc6\x53\x1c\x87\x9e\x18\x2f" + "\x5d\x37\x9e\x1a\x2e\xae\x1b\x4f\x8d\xe4\xeb\xc6\x53\x5d\x89\x3e" + "\x3c\x15\x4b\x74\xe3\x29\x1f\xb2\xfd\xc4\x38\xf3\xed\x54\x37\x92" + "\xed\x54\x37\x9e\x5a\x61\x4b\x37\x32\x69\x7a\xaf\x34\x85\x31\x1f" + "\x7e\x05\xd0\xcf\xce\x30\x8e\x69\xe0\xff\x85\x30\x1e\xb9\xc3\xff" + "\xcb\xc4\xb4\x8a\xce\x5d\xef\x65\x04\xed\x61\x84\xeb\x94\xea\x7e" + "\xd3\x68\xba\xe8\xe1\xda\x3f\x3a\x13\x5d\xa2\xf7\x72\xd3\x3f\x16" + "\x6c\x64\xa2\x61\x0c\x87\xff\xc7\xc1\x36\x38\xbe\x03\x8c\x7b\xea" + "\x85\xa8\xc3\x0d\xc5\x8f\xbd\x4d\xc7\x41\x9f\x3b\x5c\x52\x9c\xba" + "\x88\xdb\xa8\x5d\xf3\xa3\x0f\xdc\x4f\x9a\x68\x5f\xa1\xad\xd0\xdd" + "\xdd\x51\x82\x9e\xf9\xaf\x66\xf6\x2d\x54\xa9\xf8\x71\x91\x5b\xf5" + "\x63\xc1\xc0\x43\x08\x6b\xbd\xfc\x2e\x3a\x67\xdc\xa6\x66\x76\x3d" + "\xde\x37\x19\xef\x33\x40\x1f\x13\x67\x21\x45\xea\xad\xc7\x5c\x40" + "\x57\xb5\x49\xaa\x61\xaa\xe6\xe8\xa1\xcf\x71\x7a\xf4\x6d\xf7\x72" + "\xe7\x2f\x3f\x2d\x67\xc7\x9e\x92\x1a\x03\xdb\x86\x7a\x36\xee\xcf" + "\x8f\x09\x5b\xe0\x78\xa1\x3e\xac\xdc\x8b\xfa\xb7\xe9\xcb\x68\xa5" + "\x8d\x77\x3f\x8a\xda\xd1\x6d\x69\x77\xa4\x79\x16\x6c\xa7\x46\x0a" + "\xa1\xfd\xd2\xae\xf3\xaf\x00\xb1\xeb\xf4\x54\x21\x97\x8d\x9d\x98" + "\x9a\xa4\xcd\x48\xb1\xde\xf8\x98\xcb\x51\xe0\xc4\xad\x9b\x18\x5d" + "\xed\x9a\x7f\xed\xd0\x3a\x31\xde\xd8\xe6\xcb\x61\xff\xfa\x4e\x8c" + "\xee\xf6\x32\x8c\x9b\x7f\x1d\x3a\x02\x63\xbb\xa5\x2f\xe6\x45\xcd" + "\x8a\x54\xc7\xce\x98\x35\x7d\xce\x82\x58\x75\x9f\xa8\xc7\xd1\xb8" + "\x39\x73\xd4\xb3\x22\x67\x2f\x52\x9b\xef\xf9\x83\x3a\x6a\xc6\xfc" + "\xc8\x77\x66\x4e\x1f\x30\xeb\xdd\x98\xc7\xa1\x4f\xc8\xac\x1f\x1e" + "\xb8\x2f\xc6\x35\xff\x2a\xdc\xb2\x01\xa1\x8d\x1d\x91\x33\xee\x57" + "\xed\x9a\xd3\xfd\xb5\xce\x1e\x87\xf0\xf5\x52\x37\x31\x35\x0a\x38" + "\x26\x09\x38\x6d\x7d\xe2\x63\xf8\xd8\x80\xad\xd0\xaf\x2d\xd0\x6f" + "\xe8\x23\xf4\xf9\x74\xb8\xa9\xcf\x26\x4c\x24\x61\x4c\x24\xde\x02" + "\x0c\x9e\x5e\xe4\x56\xf7\xd8\xeb\x0c\x13\x8e\xef\xaf\x06\x9e\x15" + "\xa7\x2b\x8a\x33\xee\xac\xfe\x4f\xd7\x7b\xc1\xb9\x19\x26\x8c\x19" + "\x33\x82\x62\x98\x0d\x0d\x5a\xd0\x8e\x4e\xb5\x4c\xf4\x4b\x80\x4d" + "\x7c\xfe\xc5\xe7\x10\x4a\x66\x6a\xc3\xd9\xef\x03\x30\xb5\x80\x61" + "\x82\x53\xd8\x77\x66\xff\x6d\x05\x7a\x19\xda\x28\xd7\xa2\x3d\x95" + "\xb8\x0d\x2d\x6c\xc3\x36\x37\xe6\x46\x86\x8d\xf7\x46\xc9\xcf\x24" + "\xa3\xe4\x5a\x7c\xce\x8e\x5e\xde\x6e\xb1\xc8\x29\x34\x8e\xb9\x00" + "\xbc\xe3\xc4\xf4\x88\x0c\x63\x76\xf6\xf2\xd6\x2a\x4e\x1f\x32\x66" + "\x06\xc5\xc0\xfd\x54\xd7\xae\x39\xa3\xd6\x3a\x0d\x89\xc2\xed\xac" + "\xdf\xc4\xda\xbe\x1a\xdf\x3b\xd8\x07\xe2\x18\x06\x34\x29\xf7\x0c" + "\xa5\xfd\xbe\xce\x98\x36\x23\xad\xd4\xf9\x2e\x0a\xd5\x33\x0d\x4c" + "\xfa\xef\xeb\x4a\x6a\x6a\x80\xd3\x62\xde\x65\x1e\xff\xd7\x59\x37" + "\xfd\x8c\xe9\x5b\x3b\xc2\xb3\x98\x3e\x23\x8d\x49\x1f\xac\x1a\xdf" + "\x17\xa9\xa0\xed\x78\x93\x3d\xc1\x96\xce\xd2\x70\x74\x86\xcd\x7f" + "\x63\x3c\x40\x7f\x38\x3c\x9c\x29\x3a\x12\x6b\x8d\x87\xc6\x67\x73" + "\x93\xaf\x5a\xcf\x84\xbf\xde\x90\xe1\x1b\xce\x78\xf8\x06\x25\x5e" + "\x46\x6d\xb1\x6d\x4b\x40\xef\xa7\x2e\x44\x5e\xeb\xa6\x22\xf5\xb4" + "\x45\x2a\xa4\xcb\xf4\x0d\x74\x5b\x9a\xec\x04\x36\x51\x00\xbf\xf8" + "\x00\x67\xfa\x34\x74\x0a\x8a\x89\x9f\x8e\x14\x79\x97\xf2\x15\x58" + "\x27\xe3\x39\x20\x57\x14\xff\x5e\xb7\x05\xce\x63\x7e\x0b\x47\xd8" + "\x1f\xac\x2f\x7e\x8b\x46\xa3\x67\xc0\xf8\xfc\x01\xbb\xff\x48\x0e" + "\xb4\x29\xed\xbe\xfe\xcd\xea\x5f\x03\xf8\xea\x39\xf0\x53\x69\xa5" + "\x81\x6d\x93\xf5\xd5\x4c\xea\xab\xc3\xd0\x0f\xea\xaf\x7f\x07\x63" + "\xbf\x8a\xdc\x73\x2e\x77\xcf\xe5\x70\xcf\xc7\x6c\xdc\xb3\x86\xdc" + "\x73\x9b\x5b\xb6\xef\xf9\x3f\x4b\x6d\xdf\xf3\x7f\x0e\x48\xbf\xe7" + "\xff\x84\x48\xbf\xe7\xff\x0c\x15\xbf\x67\x3f\xce\xcf\x7e\xe0\x67" + "\x3f\x1b\x7e\xf6\xe3\xfc\xfc\xc4\x25\xdb\xf7\x5c\xbe\xc0\xf6\x3d" + "\x97\xef\x96\x7e\xcf\xe5\x81\xd2\xef\xb9\xdc\xc7\xc6\x3d\x73\x7e" + "\xf6\x03\x3f\xfb\xd9\xf0\xb3\x1f\xe7\x67\xf7\x1f\x6d\xdf\xf3\xd9" + "\x19\xb6\xef\xf9\x6c\x8e\xf4\x7b\x3e\xeb\x2b\xfd\x9e\xcf\xf6\x16" + "\xbf\x67\x7f\xce\xcf\xfe\xe0\x67\x7f\x1b\x7e\xf6\xe7\xfc\xec\xbf" + "\xc6\xf6\x3d\x9f\x9b\x62\xfb\x9e\xcf\xa5\x4b\xbf\xe7\x73\xde\xd2" + "\xef\xf9\x9c\x97\x8d\x7b\xe6\xfc\xec\x0f\x7e\xf6\xb7\xe1\x67\x7f" + "\xce\xcf\x93\x5e\xb1\x7d\xcf\x3f\x8d\xb5\x7d\xcf\x3f\xad\x94\x7e" + "\xcf\x3f\x75\x95\x7e\xcf\x3f\xb9\x8a\xdd\x73\x3d\xf0\xb6\x2b\xdc" + "\x4b\xc3\x7f\xc2\x5f\x37\x78\xf8\x86\xb8\x56\x22\x45\xf6\x32\x63" + "\xb4\x5b\x15\x6a\x07\xf7\x16\xcd\x6c\x7a\x5d\x8d\xff\x35\x7a\xf8" + "\x06\xd7\x7b\xf8\x86\xdf\xeb\xd8\xa0\x5d\x32\x05\xb5\xc5\x7a\x7c" + "\xb5\x11\x79\x19\x33\x7c\x83\xd6\xbe\x89\xd4\x49\x3a\xa4\x2a\x49" + "\xd4\xa2\xc4\x18\x46\x57\x82\x2e\xa2\xf6\x55\x38\xf6\x3c\x87\x8a" + "\xaa\x0b\xd1\xec\x79\x0c\x73\x45\x51\x71\x0a\xbf\xf7\x05\x9d\x9c" + "\x9c\xf6\x6f\xa4\x86\x6b\xf8\x6c\x81\x1f\x6e\xc7\x2d\x04\xc6\xcf" + "\x4d\xaf\xf7\xdc\x9a\x88\xbc\xbe\xf9\xa0\x0a\xe1\xed\x39\xf0\x33" + "\x6c\x0a\x8a\x49\x9c\x82\x14\x7b\x6f\x95\x2b\xc8\xd8\x5c\x91\x63" + "\x39\x36\x87\x40\x04\x88\xbf\x51\x04\xfb\xae\x66\xbf\x29\xd5\x96" + "\x15\xd1\xa6\xb1\x9b\xb5\x65\x85\x81\x8c\xf7\x16\x63\xf7\x37\x70" + "\x7d\x6a\xcb\x8a\x70\x6c\x4b\x26\xc3\x37\xa2\xb4\xaa\x1e\xc7\x4d" + "\xaa\x2b\x71\x48\x01\xdb\x5d\x4a\x62\x6e\x21\x11\x1b\xe7\x9a\xd9" + "\xb8\xc8\xb5\xb2\xcd\x2d\x11\x1b\x17\x82\x8d\xcb\x05\x6c\x7c\xcc" + "\x3e\x1b\xff\xec\xe7\xb8\x8d\x7f\x76\x12\xb7\xf1\xcf\xa3\xa5\xdb" + "\xf8\x7c\x91\x74\x1b\x9f\x3f\xc4\xd9\x58\xcb\xb7\xf1\xf9\x99\xe2" + "\x36\xf6\x33\xc3\xb1\x1f\xe0\xf8\x89\x4b\xc2\x36\xf6\x03\x1c\xfb" + "\x09\xe0\xd8\xcf\x4e\x1c\x5f\xd8\xec\xb8\x8d\x2f\x4c\x17\xb7\xf1" + "\x85\x7d\xd2\x6d\x7c\xc1\x47\xba\x8d\x2f\xa8\x89\x8d\xfd\x2c\x70" + "\xfc\x73\x99\x0d\x1b\x9b\xe1\xd8\x0f\x70\xec\xfe\xa3\x88\x8d\x01" + "\xc7\x7e\x02\x38\xf6\xb3\x13\xc7\x5a\x83\xe3\x36\xd6\x9e\x10\xb7" + "\xf1\x45\x4f\xe9\x36\xd6\x66\x48\xb7\xb1\x76\x05\x67\x63\x0b\x1c" + "\x6b\x7d\xc5\x6d\xec\x6f\x86\x63\x7f\xc0\xb1\xff\x1a\x61\x1b\xfb" + "\x03\x8e\xfd\x05\x70\xec\x6f\x27\x8e\x2f\x45\x3a\x6e\xe3\x4b\x03" + "\xc4\x6d\x7c\x69\x91\x74\x1b\x5f\xac\x93\x6e\xe3\x8b\x55\xc4\xc6" + "\xfe\x16\x38\xbe\x98\x65\xc3\xc6\x66\x38\xf6\x07\x1c\x4f\x7a\x45" + "\xc4\xc6\x80\x63\x7f\x01\x1c\xfb\xdb\x89\xe3\x5f\x8e\x3b\x6e\xe3" + "\x5f\xd2\xc5\x6d\xfc\xcb\x79\xe9\x36\xfe\x65\xb2\x74\x1b\xff\x12" + "\xc2\xd9\xd8\x02\xc7\x97\xf4\x62\x36\x6e\x80\x18\xb0\x3d\xd8\xb8" + "\x7d\x35\x52\xe4\x60\xdb\x96\x13\xdb\x1a\x3a\xbd\xae\xce\x51\x18" + "\xa3\xb1\x4d\xd8\x1c\xd0\xaf\x5e\x1d\x0c\x19\xbe\x21\x8c\x02\xee" + "\x29\x11\xe7\x5d\x2b\x47\xe8\x97\xa1\x0e\xea\x44\x9c\xff\xbd\xd2" + "\x03\x1f\xa3\x4e\x5c\x75\x1e\xae\xa7\xc4\x79\x2f\x7d\x7a\xbd\xc6" + "\xe0\x19\x10\x7c\x45\x71\x39\x81\xe9\xd3\x27\x10\x62\xaf\x08\xe6" + "\x43\x2f\x8f\xd2\xea\x7c\xb0\xcf\x49\x54\x52\xfe\x15\x32\x76\x7a" + "\xbd\xe7\x73\x7a\xe4\xcd\xfc\xea\xed\x51\x14\xab\x45\x86\x77\xbd" + "\x5c\x4b\xe3\x0a\x51\x69\xdc\xff\xa1\xd0\x2a\xe6\x2e\xf3\x8b\xb7" + "\x6b\x83\xe7\xe8\x68\x83\xe7\xeb\x2a\x43\xe6\x5b\xbb\xf4\x9e\xa3" + "\xc3\xf3\x16\x6a\x15\xae\x75\xc8\x7b\x66\x25\xc3\xa4\xbe\x83\x9c" + "\x53\x2f\x21\x97\xf5\xef\x20\xd7\xf5\x97\x90\xaa\xa8\xb2\x1c\x15" + "\x5f\x2b\x44\xc5\xb7\xce\xa2\xe2\xbb\xf0\xab\x87\x9f\x11\x7e\xc9" + "\x67\xc1\xd7\x08\x8d\xbe\x8e\xf0\xb7\x15\x75\xfd\x2a\x90\x47\x91" + "\xbe\x1c\xe1\x35\xae\x37\x14\x97\x3b\xbb\x46\x20\x0f\xe6\x17\x2f" + "\xc4\xbc\xeb\xa5\x80\x7d\xce\x78\x7b\xa9\x5e\x87\x8a\x2a\xeb\x60" + "\x7f\x65\x1d\xec\x77\x4e\xaa\x84\xf6\x8d\x85\xf8\xdb\x89\xba\xa2" + "\xe4\x13\x70\x7f\x9f\xe7\x32\x38\x86\xee\xe4\xab\x4e\x03\x53\x1b" + "\x19\xaf\x9e\x04\x07\x57\x06\x6d\x31\x4a\xf5\xf5\x65\x52\xff\xf2" + "\x43\xaf\x8e\x60\xe7\x2e\xc6\x0f\xc3\x55\x63\xce\x5e\x60\x4a\x6a" + "\xca\x11\xce\x25\x94\xd4\x9c\x44\xa5\x2b\x8c\x28\x74\x11\x42\x21" + "\x06\x84\xb0\x2d\x4a\xe3\xaa\xd0\x98\x18\xe4\x86\xf3\xcf\xc6\x5f" + "\xbd\x3b\x96\x56\xea\x50\x82\x1e\xfa\x78\xa3\xae\xb1\x8f\x25\x2b" + "\x4a\x10\xec\xeb\x52\x12\xad\x45\xae\x31\x48\x85\xed\xab\xcf\xf0" + "\x0d\x1e\x03\xcf\xcf\xec\x1a\x86\xc1\xb6\xc5\x36\xc5\xf6\xc5\xed" + "\x99\x6c\x5e\x1a\xa5\x43\x49\x75\x48\x55\x9a\x08\xff\xc6\x31\xba" + "\x52\x74\x13\x41\x1f\xfb\x33\xee\x9f\xe7\x02\x2e\x7a\x63\x2c\x68" + "\x15\x95\x43\xc1\xff\x1d\x45\x30\x75\x8c\x60\xaa\xcd\x2d\x3b\x30" + "\x55\x44\x31\x75\x65\x33\xc5\x54\xd5\x02\x71\x4c\xfd\xf7\x14\x87" + "\x29\x6d\xeb\xc4\xd4\x7f\x67\xd9\xc6\xd4\x7f\x43\x6c\x60\xaa\x1c" + "\x30\x95\xcb\xc7\x54\xd5\x4a\xe9\x98\xfa\x6f\x76\x0b\x62\xaa\x50" + "\x1e\xa6\xfe\x9b\xcc\xc7\xd4\x95\x34\x71\x4c\xf9\x71\x3c\xf5\xc4" + "\xa5\xa6\x31\xe5\x67\xc6\x53\x55\xd7\x29\xa6\xae\x9d\x10\xc7\xd4" + "\xb5\x3e\x04\x53\x7e\xad\x94\xa7\xae\x1e\xb1\x8d\xa9\xab\xb9\xe2" + "\x98\xf2\x03\x9e\xf2\xb3\xe0\xa9\x6b\x67\xa5\x63\xea\xaa\xae\xe5" + "\x30\xe5\x27\x93\xa7\xae\x9e\xe6\x63\xaa\xaa\xd2\x06\xa6\x38\x9e" + "\x72\xff\xd1\x0e\x4c\x99\xf1\xd4\xaf\xc3\x29\xa6\xae\x77\x13\xc7" + "\x54\xf5\x22\x0e\x53\xad\x94\xa7\xaa\x3d\x6d\x63\xea\xd7\x1a\x1b" + "\x98\x02\x9e\xf2\xb3\xe0\xa9\xeb\x03\xa4\x63\xaa\x3a\xa8\x05\x31" + "\x25\x93\xa7\xaa\xbd\xf9\x98\xfa\x35\x40\x1c\x53\xfe\x1c\x4f\xf9" + "\xaf\x69\x1a\x53\xfe\x66\x3c\x75\x3d\x93\x62\xea\xb7\xb9\xe2\x98" + "\xba\x51\x4c\x30\xe5\xdf\x4a\x79\xea\xc6\x0c\xdb\x98\xba\x11\x2c" + "\x8e\x29\x7f\xe0\x29\x7f\x0b\x9e\xfa\x6d\xa9\x74\x4c\xdd\xc8\x6a" + "\x39\x4c\xf9\xcb\xe4\xa9\x1b\xf1\x7c\x4c\x5d\x5f\x6b\x03\x53\x1c" + "\x4f\x4d\x7a\xc5\x0e\x4c\x99\xf1\xd4\x6f\x57\x29\xa6\x6e\x1e\x17" + "\xc7\xd4\xcd\x1e\x1c\xa6\x5a\x29\x4f\xe9\x0e\xdb\xc6\x94\x2e\xdb" + "\x06\xa6\x80\xa7\xfc\x2d\x78\xea\xe6\x19\xe9\x98\xd2\x55\xb7\x20" + "\xa6\x64\xf2\x94\xae\x8c\x8f\xa9\xdf\xb4\x62\x98\xaa\xc7\x71\x9f" + "\x13\x60\x2a\x1a\xe2\x3e\xc0\x90\x5b\x19\xc1\x54\x03\x60\xea\x33" + "\x73\x4c\xfd\x64\x19\xf7\xdd\x1a\x66\x6c\xc4\x54\xcd\x48\x4b\x4c" + "\x19\x01\x53\x0d\x2c\xa6\x6e\x47\x9a\xe2\xbe\xd2\xea\x5c\xf0\xd5" + "\x35\x54\x1a\x06\x78\xda\xc4\xe1\xe9\x27\xc0\x13\xdc\x8f\x11\xee" + "\xb7\xa8\xa2\x1c\x85\xea\xc8\x7d\xd5\xc3\xfd\x1a\xcd\xb1\x54\x5f" + "\xa5\xc0\x18\xc2\xd8\x31\xe1\xa8\x78\x36\xe0\x67\xde\x29\x54\xbc" + "\x10\x7e\x8b\xe1\x97\x08\x3f\x74\x0a\x15\x55\x21\x36\x67\x4f\xf1" + "\x53\xc6\xe1\xe7\x96\xc1\x36\x7e\x6e\x55\x48\x8b\xf1\x6a\x26\x48" + "\xc7\xcf\xed\xfe\xdc\x5c\x3a\x55\xe8\xd8\x0b\x0c\x9e\xff\x4a\x30" + "\x72\x0d\x85\xea\x91\x1b\x33\xc9\xbb\xa3\x6b\x38\x52\x2d\x31\x20" + "\xc5\xba\x77\x90\x6a\xdd\x39\xb8\x5f\xd3\xb3\x73\x09\xb9\x9e\xac" + "\xfb\x0a\x15\xdd\x2a\x47\x45\x77\x4f\xa0\x22\x23\xfc\x40\xca\xe2" + "\x3e\x86\x4e\x37\xbf\x5f\x1d\x77\xbf\xb7\xaf\x43\x5b\xbd\xc5\xef" + "\xf7\x76\x11\x7b\xbf\x51\x70\xbf\xf5\xf4\x7e\x4b\x01\x8b\xe0\x97" + "\x2e\x46\x2e\x4e\x0c\xd5\xa1\x76\x73\xf4\x0c\x53\xcf\x61\x10\xfb" + "\xe5\xe4\xe9\x3a\x14\x1a\x03\xbe\x7a\x17\x30\x58\xb9\x0b\x25\xc5" + "\x03\x06\xeb\xeb\xf0\x7b\x7d\x5d\x69\xf2\x3d\xc0\xe0\x6d\x15\x03" + "\x76\x6b\xc0\x18\xfc\x09\x63\xf0\x96\xaf\x51\x1c\x83\xc7\x08\x06" + "\x21\x4e\x6c\x1a\x83\x66\xbc\x56\x73\x84\x62\xf0\x6e\xb1\x38\x06" + "\xef\x5c\x36\xc5\x89\x0f\x1e\x83\x77\x96\xda\xc6\xe0\x9d\x08\x69" + "\x31\xe1\xdd\xf3\xd2\x31\x78\x27\xbf\xe5\x30\x78\x77\xae\x6d\x0c" + "\xde\x0d\xb3\x03\x83\x85\xf2\x30\x78\x27\x83\x8f\xc1\x9a\x02\x71" + "\x0c\xfa\x71\x3c\x08\x71\x65\x93\x18\x34\x8f\x2b\x6b\x47\x50\x0c" + "\xde\x1b\x2b\x8e\xc1\xba\x19\xa6\xb8\xf2\xc1\x63\xb0\xae\x8d\x6d" + "\x0c\xd6\x56\x4a\x8b\x21\xef\x45\x4a\xc7\x60\x9d\x6f\xcb\x61\xb0" + "\xee\x8e\x6d\x0c\xd6\x9d\x6e\x1a\x83\x7e\x32\x79\xb0\xce\x8b\x8f" + "\xc1\xda\xa1\x36\x30\xc8\xf1\x20\xc4\xa1\x4d\x63\xd0\x8c\x07\xef" + "\x9d\xa0\x18\x6c\x38\x23\x8e\xc1\xfa\xeb\xa6\x38\xf4\xc1\x63\xb0" + "\x7e\xb5\x6d\x0c\xd6\x47\x4b\x8b\x39\x1b\x2e\x4b\xc7\x60\x7d\x41" + "\xcb\x61\xb0\x61\x91\x6d\x0c\x36\x84\xdb\x81\x41\x99\x3c\x58\x9f" + "\xcd\xc7\xe0\x3d\x8d\x38\x06\xfd\x39\x1e\x84\xb8\xb5\x49\x0c\x9a" + "\xc7\xad\xfa\xd1\x14\x83\xc6\x09\xe2\x18\x34\xcc\x35\xc5\xad\x0f" + "\x1e\x83\x86\xf6\xb6\x31\xa8\xaf\x96\x16\xa3\x1a\x67\x48\xc7\xa0" + "\x61\x68\xcb\x61\xd0\x60\xb0\x8d\x41\x43\x45\xd3\x18\xf4\x97\xc9" + "\x83\x06\x35\x1f\x83\xfa\x20\x1b\x18\xe4\x78\x10\xe2\xdc\xa6\x31" + "\x68\xc6\x83\xc6\x53\x8d\x18\x54\xa2\xf3\xe2\x18\x64\xee\x98\xe2" + "\xdc\x07\x8f\x41\x26\xdd\x36\x06\x99\x18\x49\x31\xad\x12\x5d\x97" + "\x8e\x41\x46\xd3\x62\x18\x54\xa2\xa5\x36\x31\xa8\x44\x11\x76\x60" + "\x50\x26\x0f\x32\x3b\xf8\x18\x34\x16\x8a\x61\xd0\x08\x71\x71\xc3" + "\x8e\x3e\x81\xc6\x8c\xd1\xd1\x6e\x4e\x6a\xa4\xf7\x08\x08\x2e\x8d" + "\xad\x41\x63\xee\x80\x7d\x62\xee\xa0\xa9\x77\x54\xc8\x90\x31\x3a" + "\x1c\x34\x79\xb0\x59\xfc\xcc\xce\x2d\xd3\xa7\x7d\x9e\xbb\x7e\x36" + "\x72\x86\xf8\xbb\x27\xde\x56\x7a\xa5\x0e\xe1\xeb\x27\xe0\xfe\x5c" + "\xa3\xfd\xc1\x79\x02\xe6\x37\x6f\x15\xfb\x8e\xb9\x5e\x8b\x2a\x87" + "\x22\x65\x51\xa5\x16\xec\xb0\x98\xf5\x2f\xb6\xcb\x15\xa5\x93\x66" + "\xeb\x0d\xe4\xac\xff\xc5\xab\x0b\xd8\xdb\xa3\xfd\x47\xc8\xa9\x6b" + "\x25\x63\xc4\x76\xc5\xf6\xc2\x36\x56\x2f\x66\x98\x2b\x4a\x85\x7b" + "\x09\x60\x4c\xff\x8b\x77\x97\x2d\x70\x9c\x60\xbc\xaa\x54\x74\x96" + "\x8c\x0d\xa5\x13\xbb\xfe\x11\xfe\x2d\x28\x82\xff\x89\xd8\xea\x98" + "\x9d\xb6\x2a\x34\x8b\xf3\xee\x83\xad\x14\xd5\xf6\xd9\x4a\x39\xcc" + "\xc2\x56\xd6\x71\x95\x52\x39\x42\xba\xad\x94\x2e\xc4\x56\x8a\x4a" + "\x71\x5b\xf9\xd9\x89\x2b\xbf\x60\xb3\x78\xe4\x3e\xd8\xca\xd9\xcb" + "\x3e\x5b\x39\xcf\xe0\xdb\x4a\x40\xff\x2b\x9d\xe7\x4a\xb7\x95\xb3" + "\x2f\xb1\x95\xb3\xca\x86\xad\xec\xc4\x95\x5f\xa1\x99\x6e\xbe\x0f" + "\xb6\x6a\x13\x64\x9f\xad\xda\x64\x5a\xd8\xca\x5a\xa7\x2a\xdb\xe4" + "\x48\xb7\x55\x9b\x08\x62\xab\x36\x43\xc5\x6d\xe5\x6f\x27\xae\xfc" + "\x83\xcd\xf4\xdd\x7d\xb0\x55\xdb\x18\xfb\x6c\xd5\xf6\x08\xdf\x56" + "\x02\x7a\x4a\xd9\xf6\x84\x74\x5b\xb5\x5d\x4b\x6c\xd5\x36\xda\x86" + "\xad\xec\xc4\x95\x7f\xa1\x99\x0e\xb9\x0f\xb6\x7a\x2c\xdb\x3e\x5b" + "\x3d\x76\xdd\xc2\x56\x02\xe3\xfe\x63\x77\xa4\xdb\xea\xb1\x02\x62" + "\xab\xc7\x32\xc4\x6c\x65\xc8\xf0\x0d\x72\x03\x1b\xdc\xdb\xe4\xab" + "\x76\x8b\x43\x8a\xfa\xde\x60\x37\x0f\xb0\xdb\x52\x35\x6a\xc8\x00" + "\xbb\xe9\xf4\x68\xcc\xdc\x0b\x4c\x49\xb5\x01\xd5\x83\xcd\xee\x79" + "\xf8\xc2\xb6\x2a\x3c\xe7\xe8\xc5\x4b\xca\x76\x67\x26\xcd\x55\x21" + "\x6c\x37\x6c\x07\x6c\x3b\x06\xec\xc6\xda\xd1\xe3\xad\x5d\x06\x8f" + "\xd7\x55\xa3\xaf\x5f\x60\xe6\x68\x19\x06\xdf\x2f\xa3\xaa\xd7\xe0" + "\xf7\x02\xa1\x55\xa8\x9d\xfa\x4d\x7c\x4f\xed\x56\xe2\xed\xa5\xba" + "\x72\xd0\x07\xb7\x10\xab\xcd\x2e\x78\x7b\x18\xde\xf6\x76\x35\x94" + "\x86\xbf\xce\x74\x6c\xd0\xea\x3b\x05\xc5\x24\x5d\x47\x6d\xb1\x7e" + "\x48\x35\x22\xaf\x84\x59\x48\xb1\xf7\x03\x8d\x82\x5d\xbb\x36\x8f" + "\x6d\x63\x2c\xd8\xc5\x8b\xb9\x6d\x36\xa7\xfb\x76\x34\x2a\xbd\x92" + "\xc6\xfa\xcd\x52\x23\xb0\x7e\xfb\x8f\xb7\x0a\x74\xa6\x0f\xe3\xe1" + "\x1b\x9e\x56\x82\xd4\x4c\x03\xd8\x18\xaf\x27\x52\x3e\x3e\x6c\x6b" + "\xbd\x54\x1b\xb7\x63\xe7\x7f\x1b\xd5\xdc\xfc\x2d\xb0\x13\xbe\x3e" + "\x3b\x7f\x2b\xc6\x6c\xfe\x16\xf4\xb9\x71\xfe\x96\xd2\x45\x8b\xe7" + "\x6f\x19\x2f\x78\x75\x31\xdd\xfb\x9c\x99\x0c\x03\xf7\xde\xb1\xa4" + "\x46\x87\xf0\xfd\x97\xd4\x68\x50\x52\x2c\x52\x95\xd4\x57\xa1\xc4" + "\x1a\x46\x57\x92\x7c\x15\x85\xde\xc1\x3a\x18\xe3\xa5\x5d\x31\xf1" + "\xab\x4b\xae\xf1\x82\x77\x17\xe8\xc3\xb1\x92\x32\x84\xcc\xd6\xf1" + "\x44\x83\x66\x76\x01\x3f\x44\x97\x26\x5f\x42\xe0\x13\xb0\xcb\x39" + "\xec\xa7\x68\xd8\x3f\xb4\x51\x5f\x77\x7a\x7d\x19\xde\x86\x7d\x86" + "\xdf\x37\xe1\xfa\x00\x5b\xcd\xf4\x37\xc6\x85\x5b\x5c\x32\x2a\x8d" + "\xab\x47\x25\x7a\x84\xe0\x7a\x21\x3f\x84\x97\x8b\xe1\xe8\x18\x87" + "\xa3\x5c\xb7\xb8\x36\xb7\xec\xc0\x51\x21\xc5\x91\x6b\x37\xc7\x70" + "\xf4\x44\xb1\xe3\x38\x7a\x62\xb3\x03\x38\x2a\xe7\xe3\xc8\x75\xa5" + "\x74\x1c\x3d\x11\x25\x1d\x47\x4f\x78\x3b\x86\x23\x57\x4f\x82\xa3" + "\xc7\xab\x08\x8e\x5c\x5d\x29\x8e\xd8\xb5\x51\xf7\x09\x47\x8f\x67" + "\x88\xe3\xc8\x8f\xe3\x23\x3f\xe0\xa3\x27\x2e\x35\x8d\x23\x3f\x33" + "\x3e\xea\x30\xdd\x31\x1c\x75\xf0\x74\x1c\x47\xed\x2f\xca\xc7\x91" + "\x9f\x05\x1f\x75\x28\x96\x8e\xa3\xf6\x7b\xa4\xe3\xa8\x7d\x8c\x63" + "\x38\xea\x30\x85\xe0\xa8\xbd\x0f\xc1\x51\x87\x71\x14\x47\xec\x7a" + "\xb3\xfb\x84\x23\xd7\x0a\x1b\x38\xe2\xf8\xc8\x0f\xf8\xc8\xfd\x47" + "\x3b\x70\x64\xc6\x47\xaa\x3c\xc7\x70\xa4\x9a\xe2\x38\x8e\x54\x7d" + "\x1d\xc0\x91\x05\x1f\xb9\x7b\x4a\xc7\x91\x5b\x8d\x74\x1c\xb9\x15" + "\x38\x86\x23\xd5\x4e\x82\x23\xb7\x38\x82\x23\x55\x36\xc5\x11\xbb" + "\x86\xef\x3e\xe1\xc8\xad\xb7\x38\x8e\xfc\x39\x3e\xf2\x07\x3e\xf2" + "\x5f\xd3\x34\x8e\xfc\xcd\xf8\xa8\xe3\x1d\xc7\x70\xd4\x71\xa7\xe3" + "\x38\xea\x38\x57\x3e\x8e\xfc\x2d\xf8\xe8\x77\x53\xa4\xe3\xa8\xe3" + "\x50\xe9\x38\xea\x88\x1c\xc3\x51\xc7\xeb\x04\x47\xee\x1a\x82\xa3" + "\x8e\x95\x14\x47\xec\xba\xc8\xfb\x84\x23\xf7\x99\x36\x70\xc4\xf1" + "\x91\x3f\xf0\xd1\xa4\x57\xec\xc0\x91\x19\x1f\x79\x0e\x73\x0c\x47" + "\x1e\xd7\x1d\xc7\x91\xc7\x41\x07\x70\x64\xc1\x47\x9e\x3b\xa5\xe3" + "\xc8\x63\x85\x74\x1c\x79\x04\x3b\x86\x23\x4f\x3f\x82\x23\x0f\x17" + "\x82\x23\xcf\xfe\x14\x47\xec\x5a\xd3\xfb\x84\xa3\xdf\xed\x17\xc3" + "\x11\xae\x45\xb0\x91\xd4\x85\xa8\x59\xbf\x18\xe1\x3a\x0c\x35\xeb" + "\xeb\x91\x4f\x6d\xaa\x67\xc5\x91\x78\x52\x0f\x00\xfa\xc9\xe6\x7b" + "\x85\xce\x7f\x62\x37\xf8\xc5\xc3\x37\x30\xf4\x3c\xa9\xd1\x80\xeb" + "\x82\xdc\x4e\x8a\x46\xcf\xe1\xba\x0c\xca\xdf\x7b\xe0\x3a\x56\x8d" + "\xb5\x03\x3c\x44\x6a\x07\x4c\x14\xaf\x1d\x50\xbf\xc9\xb4\xee\x76" + "\x17\x5d\x77\xab\xec\x74\xd1\xe6\xba\x5b\x65\xa7\x13\x39\x13\xa5" + "\xe2\xa1\x13\xbb\xfe\xeb\x76\x27\x5f\x75\x6d\x6a\xa7\x72\xb8\xe7" + "\x7c\x72\xef\xbf\x67\xeb\xad\x34\xbd\x1e\x77\x97\x19\x4e\x3a\xad" + "\x18\x3f\x19\x25\x33\x6b\xce\x94\x33\x9e\xbe\x81\x4c\xa6\x6f\x98" + "\xb4\xbe\xfc\x5e\xdd\x84\xbd\x35\xc2\xf6\xf6\x5a\xc1\xd9\x3b\x97" + "\xb3\xb7\x70\xdd\x82\x89\xe2\x75\x0b\x84\xed\xed\x65\x7b\x9d\xb3" + "\xd2\x6b\x88\x74\x7b\x7b\x39\x73\xf6\xce\xad\x4d\xf5\x0a\xa6\xf6" + "\xf6\x3a\x26\xdd\xde\xbf\xaf\x21\xf6\xfe\x77\x11\xd8\x5b\x03\xf6" + "\x2e\x93\xd8\x97\x34\xdb\xf6\xf6\x13\xc1\x77\xe7\x1a\x62\x6f\xae" + "\x66\x82\x87\x48\xcd\x84\x89\xe2\x35\x13\x84\xed\xdd\xf9\x88\x6d" + "\x7b\x77\xde\x2d\xdd\xde\x9d\x63\x89\xbd\xfd\x00\xdf\x9d\x0b\xa8" + "\xbd\xbb\xd8\x59\x57\xc0\xdc\xde\x9d\xa3\x88\xbd\xff\xa3\x61\x3c" + "\xfd\x00\xdf\x7e\x12\xf1\xdd\x05\x35\x61\x6f\x11\x7c\x3f\x19\xc5" + "\xd9\x9b\xc3\xb7\x48\xbd\x86\x89\xe2\xf5\x1a\x84\xed\xfd\xe4\x20" + "\xdb\xf6\x7e\xb2\xb3\x74\x7b\x77\xa9\xe4\xec\x0d\xf8\x7e\xd2\x9b" + "\xda\xfb\xc9\x1d\xd2\xed\xdd\xe5\x34\xb1\x77\xf9\x7e\xb0\x37\xe0" + "\xdb\x4f\x22\xbe\x9f\x8c\xb1\x6d\x6f\x7f\x11\x7c\x77\x3d\x4d\xec" + "\xcd\xd5\x8a\xf0\x10\xa9\x15\x31\x51\xbc\x56\x84\xb0\xbd\xbb\x6e" + "\xb3\x6d\xef\xae\xab\xa5\xdb\xbb\xeb\x38\x62\x6f\x7f\xc0\x77\xd7" + "\x2c\x6a\xef\x6e\x1e\xd2\xed\xdd\x35\x88\xd8\xfb\xec\x2e\xc6\xd3" + "\x1f\xf0\xed\x2f\x11\xdf\x5d\xb5\x4d\xd8\x5b\x04\xdf\xdd\x83\x38" + "\x7b\x73\xf8\x16\xa9\x53\x31\x51\xbc\x4e\x85\xb0\xbd\xbb\xbb\xdb" + "\xb6\x77\xb7\x7b\xd2\xed\xdd\xed\x18\x67\x6f\xc0\x77\x77\x17\x6a" + "\xef\xee\x2b\xa4\xdb\xbb\xdb\x7e\x62\xef\x73\xd9\x60\x6f\xc0\xb7" + "\xbf\x44\x7c\x77\x0f\x13\xb3\xb7\x1b\xd8\xfb\x38\xe8\x18\x18\x07" + "\x83\x8d\x19\xa0\x53\x0c\x7c\xbb\x97\xc6\x05\xa0\x81\x77\xb1\xed" + "\xd5\x3e\x30\x76\x04\xb7\x58\xbd\x0c\xa5\xba\xb3\xc3\x6b\x87\x95" + "\x4f\x5d\x16\x5d\x3b\xac\x7c\xaa\x58\xf2\xda\x61\xe5\x53\x59\x54" + "\x03\x3d\x55\x41\x7d\xaa\x66\xf9\x43\xd2\x9a\x62\xe5\x53\x29\x82" + "\x75\x34\x94\x4f\x05\xe0\x35\xc5\xcc\x9a\x9f\xd2\x8c\x99\x72\xb4" + "\x91\x7a\xa8\x1d\xbe\x2e\x04\x3f\x68\xc4\x7d\xdd\xb3\x2b\xf8\xba" + "\xb0\xc5\xea\x76\x28\x7b\xb6\x71\xdc\xd7\x3d\x4e\x89\xfb\xba\xc7" + "\x41\xe9\xbe\xee\xb1\x82\xea\xaf\x1e\x85\xd4\xd7\x3d\xa5\xaf\x1f" + "\x57\xf6\x88\x15\xac\xe7\xa1\xec\xd1\x9b\xf8\xba\xa2\x06\x7c\x2d" + "\x43\x97\xf5\xf4\x6e\xda\xd7\x7e\xf0\x5c\xfb\xd9\x78\xae\x7b\xbb" + "\xc0\x98\x19\xdc\x62\xf5\x43\x94\xbd\x6e\x3a\xee\xeb\x5e\x87\xc5" + "\x7d\xdd\x6b\xa7\x74\x5f\xf7\x8a\xa1\xda\xaf\xd7\x7e\xea\xeb\xde" + "\xc1\xd2\x7d\xdd\x2b\x42\xb0\xae\x88\xb2\x97\x8a\xf8\xfa\xe7\x70" + "\x63\xa6\x1c\x4d\xd8\xdb\xc3\x0e\x5f\xc3\x73\xed\x67\xe3\xb9\xee" + "\x53\x03\xbe\x2e\x6c\xb1\x3a\x26\xca\x3e\xe7\x1d\xf7\x75\x9f\xdd" + "\xe2\xbe\xee\x93\x2e\xdd\xd7\x7d\x26\x53\xdd\xd9\x27\x97\xfa\xfa" + "\x69\x5f\xe9\xbe\xee\x13\x22\x58\xdf\x44\xd9\x5b\x4f\x7c\x7d\xe1" + "\x10\xf8\x5a\x86\x1e\x7d\x5a\x54\xff\x53\x5f\xfb\xc3\x73\xed\x6f" + "\xe3\xb9\x7e\x46\x0b\x5a\x21\xb8\xc5\xea\xa9\x28\x9f\x39\xe1\xb8" + "\xaf\x9f\xc9\x14\xf7\xf5\x33\x09\xd2\x7d\xfd\x4c\x30\xd5\xbc\xcf" + "\xac\xa5\xbe\xf6\x56\x4b\xf7\xf5\x33\x01\x82\x75\x56\x94\x4f\x57" + "\x11\x5f\x5f\x54\x1b\x33\xe5\x68\xe1\x67\xaa\xed\xf0\x35\x3c\xd7" + "\xfe\x36\x9e\xeb\xbe\x10\xd7\xfb\x17\xb6\x58\x5d\x17\x65\xdf\x03" + "\x8e\xfb\xba\xef\x52\x71\x5f\xf7\x9d\x21\xdd\xd7\x7d\x7d\xa9\xde" + "\xee\x1b\x47\x7d\xfd\xac\xab\x74\x5f\xf7\xed\x2d\x58\xef\x45\xe9" + "\x7d\x9a\xf8\xfa\xd2\x0a\xf0\xb5\x0c\x1d\xde\xb7\x5c\x8e\x0e\x9f" + "\x9f\x83\x5c\xf8\xfe\xee\x77\xa8\x65\xb5\x78\xbf\x9d\x8e\xfb\xbb" + "\xdf\x5c\x71\x7f\xf7\x9b\x20\xdd\xdf\xfd\x7a\x53\x2d\xde\x2f\x9a" + "\xfa\xbb\x9f\x5e\xba\xbf\xfb\x79\x08\x6b\xf1\x67\x8f\x39\xa6\xc5" + "\xfb\x15\xca\xd1\xe2\xd6\xfe\x1e\xb0\xa7\x65\xf5\xf8\x80\x4c\xc7" + "\xfd\x3d\x20\x52\xdc\xdf\x03\x46\x4a\xf7\xf7\x00\x0f\xaa\xc7\x07" + "\x84\x53\x7f\x0f\xa8\x96\xee\xef\x01\xce\xc2\x7a\xbc\xff\x7e\xc7" + "\xf4\xf8\x80\x02\x39\x7a\xdc\xda\xdf\xcf\x65\xb7\xac\x26\x7f\x6e" + "\xa5\xe3\xfe\x7e\x6e\xac\xb8\xbf\x9f\x1b\x22\xdd\xdf\xcf\x39\x53" + "\x4d\xfe\x9c\x59\xfe\xfb\xb9\x0a\xe9\xfe\x1e\x58\x23\xac\xc9\x07" + "\xee\x70\x4c\x93\x3f\xb7\x4b\x8e\x26\xb7\xf6\xf7\xa0\xb5\x2d\xab" + "\xcb\x07\x2d\x70\xdc\xdf\x83\x86\x8b\xfb\x7b\x50\x5f\xe9\xfe\xf6" + "\xa9\xa1\xba\x7c\x50\x00\xf5\xf7\x20\xe9\xf5\x33\x95\x3e\x95\xc2" + "\xba\xdc\x27\xc3\x31\x5d\x3e\x28\x4b\x8e\x2e\xb7\xf6\xf7\xf3\xf1" + "\x2d\xab\xcd\x9f\x9f\xee\xb8\xbf\x9f\x1f\x24\xee\xef\xe7\x3b\x4b" + "\xf7\xf7\xe0\x4a\xaa\xcd\x9f\x37\xcb\xff\x3f\x7f\x48\xba\xbf\x07" + "\x9f\x16\xd6\xe6\x83\x57\x38\xa6\xcd\x9f\x4f\x91\xa3\xcd\xad\xfd" + "\xed\x37\xb3\x65\xf5\xb9\xdf\x78\xc7\xfd\xed\xd7\x43\xdc\xdf\x7e" + "\xed\xa4\xfb\xdb\xf7\x34\xd5\xe7\x7e\x5e\xd4\xdf\x7e\x7b\xa4\xfb" + "\xdb\xf7\x98\xb0\x3e\xf7\x8d\x75\x4c\x9f\xfb\xc5\x39\x9e\x27\x0f" + "\x08\xc6\xda\x5c\x6a\xfd\xc7\xd2\x58\x6e\xcd\x9d\xd2\x9f\xd6\x7f" + "\x54\x06\xb0\xdf\xcb\x16\xac\x2d\xa3\x7c\x21\xb3\x55\xd7\x7f\x54" + "\xbe\x60\xbb\xfe\xa3\xd2\x5f\x5a\xfd\x47\xe5\x0b\x09\xd2\xe7\xe3" + "\xbf\x10\x4c\x63\x84\x17\xcc\xe2\xff\x00\xf6\xb9\x6e\xd5\x75\x21" + "\x95\x2f\xf0\xeb\x42\x2a\xfd\xd9\xba\x90\xcc\x9a\x5f\xaa\xe4\xc5" + "\x22\x01\xe3\x1c\x7f\x2f\xf0\x62\x6f\x1c\x87\x48\xad\x43\x49\xb1" + "\x3d\xa4\x07\xc5\xf6\x8b\x9e\xe2\xd8\xfe\xc3\xdc\x56\x5d\x87\x52" + "\x39\xe4\x8e\x6d\x6c\x0f\x39\x2d\xa9\xe6\x88\xf2\x0f\xd2\xeb\xde" + "\x28\xff\xd0\x9b\xc6\x43\x7f\x30\x8b\x7f\x5f\x8c\x6a\x41\x6c\xcb" + "\xab\xa7\xa4\xfc\x83\x0b\x1f\xdb\x43\xbc\x08\xb6\xaf\x0c\x95\x17" + "\x77\xbd\xe8\xe3\xf8\x7b\x90\x97\x10\x8e\xb9\xa4\xd6\xc3\xa4\xd8" + "\x7e\xd1\x40\xb1\x3d\xec\xa6\x38\xb6\x87\x8d\x6e\xd5\xf5\x30\x95" + "\x43\x4f\xd9\xc6\xf6\xd0\x7c\x49\xb5\x4c\x94\xc3\xfc\xa4\x63\x7b" + "\x18\xa2\xb1\xdf\xb0\x20\x8a\xed\x97\x02\x5b\x0e\xdb\x32\xeb\x64" + "\x2a\x87\x56\xf2\xb1\xfd\x62\x0d\xc1\x76\x55\x9a\xbc\x18\xf3\x25" + "\x57\xc7\xdf\xfb\x04\x56\xe0\xf8\x52\x6a\x5d\x4e\x8a\xed\x97\xce" + "\x52\x6c\x07\x5a\xd5\x85\xa2\xd8\x0e\xec\xdb\xaa\xeb\x72\x2a\x5f" + "\xce\xb3\x8d\xed\x97\xd7\x4a\xaa\x91\xa2\x0c\x74\x97\x8e\xed\x97" + "\x2b\x68\x9c\x1b\xa8\xa6\xd8\x1e\xde\xb5\x05\xb1\x2d\x93\xb7\x5f" + "\xd6\xf0\xb1\xfd\x52\x19\xc1\xf6\xb5\x4a\x79\xf1\x74\x60\x95\xe3" + "\xef\xb9\x5e\x2d\xc0\xb1\xb4\xd4\xfa\xa0\x14\xdb\xc3\x0f\x50\x6c" + "\xbf\xba\x5b\x1c\xdb\xaf\xb6\x69\xd5\xf5\x41\x95\xaf\xd8\xae\xff" + "\xa3\x7c\xc5\x46\xfd\x1f\xa1\xb5\xc2\xaf\x48\xaf\x7b\xa1\x7c\xa5" + "\x80\xc6\xf4\xaf\xe8\x29\xb6\x5f\xad\x6b\x39\x6c\xcb\xac\x1b\xaa" + "\x7c\x25\x9b\x8f\xed\xe1\x7b\x08\xb6\xaf\x07\xc8\xcb\x1d\xbc\x7a" + "\xcc\xf1\xf7\x7a\xaf\x65\xe0\xbc\x81\xd4\x3a\xa5\x14\xdb\x41\xe9" + "\x14\xdb\xaf\xad\x14\xc7\xf6\x88\x8b\xad\xba\x4e\xa9\x72\xc4\x74" + "\xdb\xd8\x1e\x11\x24\xad\xa6\xcb\x08\x19\xeb\xe0\x47\x64\xd0\xfc" + "\xc5\x08\xb3\xf9\xef\xaf\x9d\x6e\x41\x6c\xcb\xe4\xed\x11\x71\x7c" + "\x6c\x07\xa5\x10\x6c\xff\xb6\x56\x5e\x9e\xe4\xb5\x5c\xc7\xf3\x24" + "\x23\x73\xd9\x77\x98\x12\xeb\xa5\x52\x6c\xbf\x3e\x8b\xd6\x26\x1a" + "\x99\x6e\x89\xed\xc6\xda\x44\xca\xe0\xdd\xad\xa6\x5e\xaa\x32\x78" + "\x80\x6d\x1c\x07\xbb\x4a\xcb\x89\x04\xa7\x4b\xc7\x71\xf0\x64\x9a" + "\x13\x09\x36\x9b\xff\x32\x52\x8b\x5a\xac\x66\xd1\x48\x3f\xdb\x35" + "\x8b\x46\x7a\xdc\xb7\x3a\xaa\xca\xe0\x40\x5e\xcd\x22\xe5\xeb\x51" + "\x46\xf6\x59\xb8\xa9\x95\x97\x57\x19\xb9\xc7\xf1\xbc\x4a\x08\x79" + "\xbf\x2b\xb1\x6e\x2b\x7d\x16\xde\x58\x44\x9f\x85\x90\x1c\xf1\x67" + "\x61\xd4\x81\x56\x53\xb7\x55\x39\x6a\x88\xed\x67\x61\x94\x97\xb4" + "\x1c\xca\x28\x19\x75\x60\x46\x45\xd3\x1c\xca\xa8\x3d\xf4\x59\x08" + "\xa9\x6e\xb9\x67\x21\x64\xb8\xed\x67\x21\x44\x7d\xdf\xea\xb9\x2a" + "\x47\x85\xf0\x9f\x85\x37\x62\xc8\xb3\x50\x13\x25\x2f\x0f\x13\x22" + "\xeb\xfd\x37\xff\x59\x08\x2d\x60\xdf\x7d\x4b\xac\x1f\x4b\x9f\x85" + "\xd1\x2b\xe9\xb3\x10\x6a\xa5\xe7\xe9\xb3\x30\xe6\x48\xab\xa9\x1f" + "\xab\x1c\x33\xc2\xf6\xb3\x30\xa6\xb7\xb4\x9c\xcb\x98\xdd\xd2\x9f" + "\x85\x31\x66\xeb\x9f\xc6\x98\xad\x7f\x0a\xad\x6b\xb9\x67\x21\x74" + "\xb4\xed\x67\x21\xb4\xff\x7d\xab\x2b\xab\x1c\x13\xce\x7f\x16\x46" + "\xc7\x93\x67\xe1\x6e\x95\xbc\xbc\x4d\xa8\x1d\xfa\xbf\xa9\xbc\xcd" + "\x9b\xc7\xd8\x79\x01\x12\xeb\xd8\xd2\x67\x21\x2c\x9d\x3e\x0b\x6f" + "\x1e\x10\x7f\x16\xc6\x16\xb7\x9a\x3a\xb6\xca\xb1\x63\x6d\x3f\x0b" + "\x63\x7d\xa4\xe5\x68\xc6\x1e\x90\xfe\x2c\x8c\x4d\xa6\x39\x9a\xb1" + "\xc7\xe8\xb3\xf0\x47\xe7\x96\x7b\x16\xde\x9c\x60\xfb\x59\x78\x33" + "\xe0\xbe\xd5\xb7\x55\x8e\x8d\xe2\x3f\x0b\x61\x29\xe4\x59\xb8\x37" + "\x53\x5e\x9e\xe7\xcd\x32\xc7\xf3\x3c\xe3\xcb\xd8\x39\x13\x12\xeb" + "\xe9\xd2\x67\xe1\x8f\x39\xf4\x59\x18\x7f\x44\xfc\x59\x18\x77\xb6" + "\xd5\xd4\xd3\x55\x8e\x9b\x62\xfb\x59\x18\x37\x54\x5a\x4e\x67\xdc" + "\x11\xe9\xcf\xc2\xb8\xb5\x34\xa7\x33\xae\x8c\x3e\x0b\x6f\xa9\x5a" + "\xee\x59\x18\x3f\xdd\xf6\xb3\x30\x3e\xe8\xbe\xd5\xd9\x55\x8e\x8b" + "\xe1\x3f\x0b\x7f\xcc\x20\xcf\x42\x83\x4e\x5e\x5e\x68\x7c\x85\xe3" + "\x79\xa1\xf0\x0a\x76\x3e\x89\xc4\xba\xbe\xf4\x59\x78\x6b\x37\x7d" + "\x16\xc2\xc5\xbf\xf3\xa0\x7c\xfb\x72\xab\xa9\xeb\xab\x7c\xdb\xf6" + "\xf7\x8f\x94\x6f\xdb\xfa\xfe\x91\x40\x0e\xe8\xed\x62\xe9\xcf\xc2" + "\xdb\x59\x34\x07\xf4\xb6\xd9\xfa\xbf\x09\x5d\x5b\xee\x59\x08\xb7" + "\xfd\xfd\x07\x65\xb8\x1d\xdf\x7f\x90\x59\xef\x57\xf9\x76\x3c\xff" + "\x59\x78\x2b\x97\x3c\x0b\xc6\x58\x79\x79\xa4\xf0\x26\xf3\xff\x38" + "\xce\x6f\xf0\xb0\xce\x23\x15\x55\x06\xa0\x7e\x13\xf1\xb3\x30\x31" + "\x4d\x9f\xe9\x1b\x8c\xeb\x0b\x1b\x7a\x73\x35\x28\x97\x72\x35\x5e" + "\x6a\xf4\xa4\x06\xa5\xce\xd0\x58\x83\x92\xd4\xfe\x40\x0a\xbc\x16" + "\x18\xaf\x09\xd6\xab\x48\xfd\x49\x06\xcf\x89\xc2\x73\xa4\x2e\x15" + "\xb2\xf5\x55\xe2\xf5\x70\xef\x57\x9a\xa8\x3f\x19\xa1\x45\x45\x11" + "\x8b\x91\xde\xfd\xf3\x5c\xb2\x4e\x78\xa2\x9a\xad\x3f\x39\xcd\xab" + "\x4b\xea\xcf\xc8\xc3\x0d\xd7\x9f\x8c\x60\x8c\x49\x5a\x46\x57\x02" + "\x2a\xba\x28\x02\xec\x1b\x69\xaa\x41\x39\x71\x35\xbe\x77\xfd\x34" + "\xef\x2e\x5b\x7e\x16\xab\x2f\x3c\x51\x46\x1d\xd8\x89\x43\x69\x7e" + "\x67\x62\x32\xc5\xe8\x44\x76\x0c\x86\x7f\xbd\x8a\xc2\x81\x63\x52" + "\x51\x5d\x83\xac\xda\x1b\x13\xb3\xed\xf0\x19\x9e\x23\x62\xc5\x5f" + "\xd4\x67\x93\x83\xc0\x67\x85\xb8\xce\xb1\xfd\x3e\x6b\x73\xeb\xfe" + "\xf8\x6c\xd2\x69\xfb\x7d\x36\x79\x98\x85\xcf\x04\xf2\x10\x93\xfb" + "\x48\xf7\xd9\x24\x1d\xcd\x43\x4c\xf6\xa5\x3e\x9b\xbc\x82\xf8\x6c" + "\x52\x11\xf1\x99\xa2\x77\x83\xac\xfa\x1d\x93\x9b\x5c\xff\x8d\xe3" + "\xa6\x06\x0f\xeb\xb8\x9c\xfa\x6c\x4a\x9d\x3e\x13\x62\x77\x88\xcb" + "\xed\xf7\xd9\x13\x97\xee\x8f\xcf\xa6\xa4\xd8\xef\xb3\x29\x37\xf9" + "\x3e\x13\x8a\x97\xa7\x48\xff\x66\xa7\x72\xca\x0e\x1a\x2f\x4f\xa9" + "\xa2\x3e\x9b\x1a\x40\x7c\x36\x25\x99\xf8\x4c\x19\xd6\x20\xab\x06" + "\xc8\x54\x67\x3b\x7c\x86\xdf\xe9\xdb\x78\xce\xa6\xed\x01\x9f\x15" + "\xe2\xba\xcf\xf6\xfb\xcc\xfd\xc7\xfb\xe3\xb3\x69\x43\xed\xf7\xd9" + "\xb4\x9d\x16\x3e\x13\x88\xeb\xa6\xad\x93\xee\xb3\x69\xe1\x34\xae" + "\x9b\x96\x4d\x7d\x36\xad\x9a\xf8\x6c\x9a\x2f\xf1\x99\x73\x7c\x83" + "\xac\x3a\x22\xd3\x9a\xcc\x7f\x61\x1d\xda\xe0\x61\x1d\xe7\x50\x9f" + "\x45\x46\xe8\x33\x21\x16\x82\x38\xc7\x7e\x9f\xf9\xaf\xb9\x3f\x3e" + "\x8b\xd0\xd9\xef\xb3\xc8\x09\x7c\x9f\x09\xc5\x1f\x91\xc3\xa5\xfb" + "\x2c\xd2\x95\xc6\x1f\x91\x61\xd4\x67\x91\xb9\xc4\x67\x11\x55\xc4" + "\x67\x6d\x76\x35\xc8\xaa\x45\x12\x39\xd3\x0e\x9f\xe1\x77\xb0\x36" + "\x9e\xb3\x77\x3d\xc0\x67\x85\xb8\x0e\xb6\xfd\x3e\x9b\xf4\xca\xfd" + "\xf1\xd9\x3b\x3b\xec\xf7\xd9\xbb\xed\x2d\x7c\x26\xa0\x93\xdf\x91" + "\x51\x07\xfb\x1d\x0d\xd5\xc9\xef\x3a\x53\x9f\xbd\x3b\x8e\xf8\xec" + "\x9d\x6c\xe2\xb3\xb6\xa7\x1b\x64\xd5\x33\x79\x57\x2d\x47\x37\x9a" + "\xe6\xe5\x53\xbf\x45\x15\xb5\x1e\xed\x18\x35\xd9\x7e\xbf\x45\x1d" + "\x6f\x5a\x3b\x46\xe5\x49\xf7\x5b\x54\x1c\xd5\x8e\x51\x87\xa8\xdf" + "\xa6\xbb\x12\xbf\x45\x8d\x73\x4c\x3b\x46\x35\xb9\xfe\x55\x48\x3b" + "\x5a\xfb\xed\xbd\x15\xad\x47\x3f\xbe\xe7\x61\xbf\xdf\xde\x4b\x68" + "\x5a\x3f\xbe\x37\x5d\xba\xdf\xde\xf3\xa1\xfa\xf1\xbd\x58\xea\xb7" + "\xf7\x8e\x11\xbf\xbd\xe7\xea\x98\x7e\x7c\x4f\xb4\xfe\x9b\x2d\xfd" + "\x68\xed\xb7\xe8\xa1\xad\x47\x43\xbe\x5f\x64\xbf\xdf\xa2\xfd\x9a" + "\xd6\x90\xd1\xdd\xa4\xfb\xed\xfd\x2a\xaa\x21\xa3\xfb\x53\xbf\x45" + "\xc7\x13\xbf\xbd\x7f\xcc\x31\x0d\x19\x1d\x2c\x47\x43\x5a\xfb\x6d" + "\x46\x4d\xeb\xd1\x91\x33\x56\xd8\xef\xb7\x19\xd7\x9b\xd6\x91\x33" + "\xa4\x7f\xb3\x58\x39\x23\x97\xea\xc8\x19\x95\xd4\x6f\x1f\x70\xdf" + "\x60\x99\x11\xef\x98\x8e\xfc\x00\xc9\xd1\x91\xd6\x7e\xfb\x70\x4f" + "\xeb\xd1\x92\x1f\x4a\xd0\xff\x1f\x5a\xe8\x7f\x21\x2d\xf9\xa1\x0c" + "\xfd\xff\x61\x38\xd5\x92\x1f\x9a\xe9\xff\x0f\x39\xfd\xff\xa1\xaf" + "\x63\x5a\xf2\x43\x7b\xf4\xbf\x95\x96\xb4\xf6\xdb\xac\xa8\xd6\xa3" + "\x27\x67\xd6\xd8\xef\xb7\x59\x53\x9a\xd6\x93\xb3\x64\x7c\x07\x6a" + "\x96\x8a\xea\xc9\x59\xe3\xa8\xdf\x66\xed\x20\x7e\x9b\x59\xed\x98" + "\x9e\x9c\x25\x5a\xff\xd1\xe4\x37\x83\x87\x6f\x30\x23\x90\x87\x2c" + "\x8e\x0e\xe0\x6a\x13\xc6\xf8\x1a\x3c\x7d\x83\xa5\x7e\xdf\xc5\x54" + "\x73\xfa\x44\x34\x42\x97\x94\x73\x8a\x1d\xab\x3b\x3d\x27\xc1\xf1" + "\xba\xd3\x73\x46\x36\xdf\xf7\x5d\xe6\x0c\x92\x5e\x77\x7a\xb6\x9e" + "\x6a\xd0\x39\x81\xd4\xd7\x31\xec\xfc\x04\x69\xf5\xa8\x67\x6b\x1c" + "\xab\x47\x3d\xe7\x38\xc1\xd7\xec\x64\x52\x8f\x7a\xce\xa1\x96\xf9" + "\xee\xcb\xec\xfe\xb8\x1e\x35\x93\xea\x82\xe4\xd5\x47\x8e\x09\xb4" + "\x03\xcf\x85\x8c\x40\x8e\x96\xe2\x79\xbe\x33\xe0\xb9\x50\xea\x77" + "\x66\xf8\x78\x9e\x97\xe3\x18\x9e\xe7\x8d\x76\x1c\xcf\xf3\x3a\x37" + "\xdf\x77\x66\xe6\x39\x49\xc7\xf3\xdc\x22\xaa\xcd\xe7\xa9\x28\x9e" + "\xe7\x07\x49\xc7\xf3\xdc\x34\xc7\xf0\x3c\x2f\x93\xe0\x79\x6e\x18" + "\xc1\xf3\xbc\xb5\x2d\xf3\xfd\x99\x18\x3d\xc1\xf3\xe3\xc1\xf2\xea" + "\x4f\xcf\x57\x35\x8d\x67\xbf\x60\x46\x20\x7f\x4d\xf1\xbc\xe0\xb4" + "\xc1\xd3\x2f\x58\xea\xf7\x6e\xf8\x78\x5e\x30\xcb\x31\x3c\x2f\xe8" + "\xe6\x38\x9e\x63\xaf\x36\xdf\xf7\x6e\x62\x4f\x49\xc7\x73\x6c\x36" + "\x8d\x59\x62\xb5\x14\xcf\x0b\x3d\xa4\xe3\x39\x36\xc2\x31\x3c\x2f" + "\x98\x4e\xf0\x1c\xab\x26\x78\x5e\x30\xb9\x65\xbe\x83\x33\xbf\x88" + "\xe0\xd9\x35\x4d\x5e\x7d\xef\x05\x5a\x3b\xf0\x5c\xc8\x08\xe4\xf6" + "\x29\x9e\xe3\x76\x00\x9e\x0b\xa5\x7e\x77\x87\x8f\xe7\x38\x07\xbf" + "\x73\xf1\x51\x33\x7c\xe7\xe2\x23\x07\xbe\x73\x61\xf9\xdd\x9d\x8f" + "\xb6\x49\xc7\xf3\x47\x33\x69\x2c\xf7\x51\x3e\xc5\x73\x5c\xa5\x74" + "\x3c\x7f\xe4\xe3\x18\x9e\xe3\xb8\xef\x5f\x2c\xd4\x11\x3c\xc7\xf5" + "\x6f\x99\xef\xf1\x2c\xcc\x26\x78\xee\x50\x2e\xaf\x7e\x7a\x5c\x7e" + "\xd3\x78\xf6\x0f\x66\x04\xde\x7b\x50\x3c\x2f\x89\x35\x78\xfa\x07" + "\x4b\xfd\xfe\x0f\x1f\xcf\x4b\xda\x3b\x86\xe7\xc5\x87\x1d\xc7\xf3" + "\xe2\xd5\xcd\xf7\xfd\x9f\xc5\x73\xa5\xe3\x79\xf1\x50\x1a\xe3\x2e" + "\x36\x7b\xff\xbf\x64\xbf\x74\x3c\x2f\x76\xf0\xbb\x40\x4b\xda\x10" + "\x3c\x2f\xe2\xbe\x0b\xb4\x58\xdf\x32\xdf\x05\x5a\x34\x93\xe0\xd9" + "\x5d\x2d\xaf\x3e\xfd\x92\x64\x3b\xf0\x5c\xc8\x08\xbc\x13\xa2\x78" + "\x4e\x0c\x02\x3c\x17\x4a\xfd\x0e\x11\x1f\xcf\x09\xe7\x1d\xc3\x73" + "\xc2\x3a\xc7\xf1\x9c\x30\xa1\xf9\xbe\x43\x94\x30\x5c\x3a\x9e\x13" + "\x4c\xef\xff\x80\x9f\x13\xcc\xde\xff\x25\xca\xf8\x3e\x51\x7c\x99" + "\x63\x78\x4e\x38\x43\xf0\x1c\x9f\x46\xf0\x9c\x50\xd4\x32\xdf\x27" + "\x8a\x1f\x4a\xf0\xfc\xbb\x68\x79\xf5\xff\x13\x9b\x9c\xff\x21\x94" + "\xdf\x30\xe5\xa5\x28\xa6\x97\x7a\x39\x9e\xe3\x48\xde\xe7\x18\xa6" + "\x93\x23\x1d\xc7\x74\xf2\x80\xe6\xcb\x71\x24\xcb\xf8\xd6\x5f\x92" + "\x96\xe6\x38\x92\x7b\x53\x4c\x2f\x0d\x97\x8e\xe9\xa4\x1d\x8e\x61" + "\x3a\x79\x37\xc1\x74\x52\x14\xc1\x74\x72\x6e\xcb\xe4\x38\x92\x54" + "\x8e\xe5\x38\x96\xf6\x96\x93\xe3\xb0\xc6\xf4\xf2\x6a\xc7\xf3\x1c" + "\xcb\x57\x3a\x86\xe9\xe5\x7e\x8e\x63\x7a\xb9\x53\xf3\xe5\x39\x96" + "\x5d\x95\x8e\xe9\x65\xfb\x69\x9e\x63\x59\x1d\xc5\xf4\x8a\xfe\xd2" + "\x31\xbd\x2c\xce\x31\x4c\x2f\x4f\x20\x98\x5e\x16\x40\x30\xbd\x3c" + "\xb6\x65\xf2\x1c\x4b\x2b\x1d\xcb\x73\x2c\xaf\x93\x93\xe7\xb0\xc6" + "\xf4\x2a\x8d\xe3\xb9\x8e\x55\x13\x1c\xc3\xf4\xaa\x76\x8e\x63\x7a" + "\xe5\x99\xe6\xcb\x75\xac\x3c\x2c\x1d\xd3\x2b\x53\x68\xae\x63\x65" + "\x11\xc5\xf4\x9f\x90\x74\x4c\xaf\x0c\x71\x0c\xd3\xab\xc6\x12\x4c" + "\xaf\x74\x25\x98\x5e\x15\xdc\x32\xb9\x8e\x15\x05\x8e\xe5\x3a\x56" + "\x15\xc9\xc9\x75\x58\x63\x7a\x75\x86\xe3\xf9\x8e\xd5\x03\x1c\xc3" + "\x74\xca\x79\xc7\x31\x9d\xb2\xbb\xf9\xf2\x1d\x29\xe9\xd2\x31\x9d" + "\x62\xf6\xfd\x8b\x14\xb3\xf5\xff\xab\x4f\x4b\xc7\x74\x8a\xda\x31" + "\x4c\xaf\xee\x43\x30\xfd\x27\x2d\xc1\xf4\xea\xae\x2d\x93\xef\xf8" + "\xd3\x5a\xc7\xf2\x1d\xab\x73\xe5\xe4\x3b\xac\x31\xbd\x36\xda\xf1" + "\x9c\xc7\x5a\x27\xc7\x30\xfd\xf1\x3e\xc7\x31\xfd\x71\x42\xf3\xe5" + "\x3c\x3e\x9e\x2e\x1d\xd3\x1f\xfb\xd0\x9c\xc7\xc7\x66\xf3\x9f\xd6" + "\xee\x92\x8e\xe9\x35\x35\x8e\x61\xfa\xe3\x7b\x04\xd3\x6b\xf6\x13" + "\x4c\x7f\xac\x6b\x99\x9c\xc7\x9a\x08\xc7\x72\x1e\x6b\x63\xe5\xe4" + "\x3c\xac\x31\xbd\x7e\xa8\xe3\x79\x8f\xd4\x33\x8e\x61\x1a\x06\x6b" + "\x87\x31\x9d\x3a\xb6\xf9\xf2\x1e\xa9\x43\xa4\x63\x3a\xd5\x99\xe6" + "\x3d\x52\xcd\xea\xdf\xaf\x8f\x97\x8e\xe9\x75\x85\x8e\x61\x3a\xb5" + "\x98\x60\x7a\x5d\x0a\xc1\x74\xea\xb1\x96\xc9\x7b\xac\xf3\x75\x2c" + "\xef\xb1\xde\x6a\xfe\xdb\xfc\xe9\xb3\xa3\xd4\x73\xde\x7b\x6f\xfe" + "\xf4\x58\xf5\xfc\x99\x33\xde\x9d\x3e\xac\x8f\xe9\xef\x61\x3e\x71" + "\x7d\xe2\x1e\x47\x51\xb3\x22\xa7\x2d\x1c\x4c\x77\xce\x9c\x3e\x1b" + "\xfe\x79\x1c\x45\x47\xce\x8f\x56\xc7\x2e\x8a\x99\xae\xc6\x7f\xcd" + "\x7a\x37\x06\x0e\x99\x13\x4b\xb7\x8c\x5e\x30\x33\x76\x46\xcc\xcc" + "\xe9\xea\xa0\xd1\xc3\x07\x8c\x1b\xf1\xc7\x71\x2f\xbf\xfc\x38\x42" + "\x66\xdf\x91\x56\x33\x19\x6f\xe5\x02\x1e\x9c\xaf\x28\x3f\x4b\x28" + "\xf1\x42\x68\x1d\xe0\x6c\xfd\x3c\xa4\x5a\x3d\x0f\x39\xa7\xdc\x42" + "\x2e\xeb\x6e\x21\x57\xf5\x07\x28\x80\x71\x9f\x95\xbb\xfe\x16\xf2" + "\x60\x3a\xd6\x17\x32\xe9\x3b\xb5\x8c\xfb\xe7\x6a\x9d\x7b\x6a\x19" + "\x6c\x53\x31\xe9\xa9\x08\xef\x03\xbb\x3a\x33\xe9\x9f\xa7\x5c\x52" + "\x7e\x36\x59\xe7\xbe\x3e\x3f\xe9\x2a\x52\x30\x1d\xd2\x62\xf7\x1a" + "\x75\x8a\x23\xf8\x49\x86\xfb\x46\xca\xf4\x99\xf0\x0b\x47\xca\x0d" + "\x2e\xf0\xf3\x82\x5f\x04\xfc\x52\xe0\x97\x06\x3f\x3d\x52\x6e\x0c" + "\x82\x5f\x2c\xfc\x60\xdb\xc6\x6c\xf8\xed\x82\x5f\x3e\x52\x66\xc0" + "\xf6\x8c\x28\xf8\xc1\xbe\x8c\xb5\xa4\x9d\x8c\x0c\xa4\xcc\xf4\x80" + "\xdf\x64\xf8\xc1\xf9\x9b\x60\xfb\xa6\x02\xa4\xfc\x04\x8e\xdb\x54" + "\x0e\xbf\x1a\xf8\x41\x9b\x9f\xa8\xe1\x87\xcf\xcf\x22\xfb\xb2\x54" + "\xf0\x0b\x81\x1f\xb4\x91\x05\xd7\xc9\x3a\x04\xbf\x32\xf8\x55\xc0" + "\xaf\x12\x29\x37\x43\xdf\x36\xc3\x31\x9b\x7b\xc3\x0f\xfa\xb0\x79" + "\x07\xfc\x0a\x91\xf2\x53\x68\xe7\x53\xb8\xc6\xa7\x5a\x04\xf7\xc8" + "\xfd\xbc\xcd\xfe\x8f\x7f\xb1\x6e\x4b\x9f\xd2\x6a\x9e\xd5\xc3\x33" + "\x96\x7e\xc2\xb0\x0c\x29\x0d\xe9\xeb\xf3\x63\x9e\x45\x4e\xd7\x94" + "\xe9\x99\xa5\x2b\x10\x70\xc3\x4e\xad\x66\x71\x3d\xde\xcf\xbe\xfb" + "\xae\x4d\x4d\xcf\xd0\xa2\x2f\x55\xf8\x59\x92\x86\xa5\xf4\x0c\xee" + "\xfc\xd3\x5a\xa7\xd1\x33\xf1\xf9\xcc\x86\xc1\xae\x4c\x52\xf8\x67" + "\x78\xcd\xec\x15\x6c\x23\x8c\xf1\xb4\x41\x11\x8c\xaa\xdf\x31\xcc" + "\x07\x9a\xc5\x6c\xbf\x66\xc1\xb3\xd1\x01\xce\x9f\xc9\x80\x9f\x74" + "\xee\xe0\xd3\x65\xc8\x99\xfd\x3b\x3d\xb5\x8c\xc9\x8d\x0c\x26\x1c" + "\xb1\x81\x9d\x3b\x78\xcf\x73\x94\x1a\xef\xab\xdb\xd9\x2b\x90\xd9" + "\xd1\xa7\x4c\x33\xbb\x1e\x55\x2a\x37\x4c\x00\xae\x52\x30\x4f\xf7" + "\x0a\x34\x6e\x1a\xa5\x2e\x00\x1f\xe3\x63\x0e\x26\x56\xe1\x7f\xa3" + "\xe1\xbe\x15\x4c\xc6\xa8\x2a\x9c\xaf\xd1\x24\x6e\x00\xfe\x4c\x9f" + "\x75\xcf\x33\xd2\x47\xfd\x86\x1b\x73\x09\x5f\x47\x81\x6b\xa3\x6f" + "\x40\xe4\x19\x4e\x9f\x79\xcf\xbd\xbe\x0c\xb7\x6d\xc8\x8d\xd4\xc1" + "\x3e\x67\x06\xb0\x05\x7d\x70\xba\x01\xe7\x19\xd2\xeb\x0b\x35\x6f" + "\xb0\xd7\xbc\x03\xfd\x54\x24\x8d\x84\xb6\xb7\x47\xea\xbe\x5c\x5c" + "\xa7\x60\x70\xdf\x55\xf5\x85\x80\x65\x57\x43\xea\xfa\x94\xcd\x1d" + "\x91\x73\x0e\x34\xbb\xb5\x23\x72\xa9\x4d\xdd\x50\xad\x75\xf6\x38" + "\x44\x38\x2a\x7d\xa6\x02\x8e\x81\x6b\x02\x7e\xd7\xe7\xb3\xd7\xca" + "\x78\x2d\x46\xfc\x5a\x1b\x87\x35\x5e\x6b\xd3\x6b\x31\xf8\x5a\xc4" + "\x5e\xac\xad\xc8\xff\x4d\xed\xec\xe8\x65\xa3\xcf\x1b\x87\xe0\x36" + "\xb4\xca\x8d\xfd\x99\xbf\xf4\xd2\x19\x36\x8d\x8e\xc1\xfb\xf0\xf1" + "\xa4\xbd\xd4\x32\xb7\xa5\xa8\x86\x81\x6d\x06\xce\x07\x06\xec\x03" + "\x45\x32\x70\xcd\x06\x57\x7c\x3d\x38\x37\xce\xb0\x4c\x8d\xd4\x6f" + "\x20\x54\xad\xcc\xe8\xcb\x6c\xf8\x7c\x17\xa3\x1a\x7c\x9a\xf8\x78" + "\xe3\xa9\xb8\x42\xc6\x08\x3f\xc3\x73\x85\xc8\x49\xf3\x06\xf6\xef" + "\x46\x9d\xfa\xb5\xc7\xc0\xce\x1b\x6f\x36\xda\xb7\x47\x64\x15\xd8" + "\x48\x05\x76\x71\x35\xac\x7a\x0d\xec\xaf\x46\xf8\x3e\xcc\xed\x85" + "\xef\xa7\x36\x35\x43\x6d\x61\x33\xd5\xc8\x91\x49\xcc\x73\xc1\xb8" + "\xed\x1a\xdc\xf6\x55\x1d\x8c\xad\xd0\xa7\xa1\xf8\x7c\x38\x3e\x4c" + "\xeb\xf4\xda\x0e\x7c\xbc\xba\x27\x8b\xb9\x59\x06\xce\x3e\x18\xf7" + "\xd8\xcf\x8c\xe7\x5b\xb9\xf8\xef\xf1\x7d\x91\xca\xad\x10\x29\xd4" + "\x89\xbd\x0b\x08\x1e\x46\x55\x99\xda\x61\xef\x71\x53\x40\x18\x9c" + "\xeb\x4d\xf1\x97\x51\x64\x48\x1f\x5c\x74\xcf\x33\x24\xb7\x2e\x73" + "\x44\x0c\x93\x36\xb8\x08\xaf\x15\xbf\xa4\xcc\x60\xe7\x40\x31\xcb" + "\x5c\x10\xf1\xc3\xe0\xb2\xc4\x99\x8c\x2e\xf1\x26\x5c\xab\x53\x48" + "\xee\xc1\x85\x3a\xf0\xd9\x88\x18\x8c\x89\x82\xbb\x75\x0a\x5c\xbf" + "\x8f\xe9\xb0\xfe\xf3\x2d\xe4\x5e\x5d\xe0\x5e\x11\x6e\xb7\x36\x35" + "\xd3\x95\xde\x6b\x46\x3e\xc6\x07\x5c\xa3\x92\x5c\x1b\xda\x5d\x06" + "\xd7\x48\x1f\x5c\x09\xc7\xf9\x6a\x9d\x6e\x3b\xb3\xcf\xd7\x42\xe6" + "\xf4\xfa\x7a\x84\x6e\x2f\x64\xf4\xa1\xfa\x0b\x46\x18\x43\x11\xec" + "\x1f\xa7\x45\x93\x55\x26\x9b\x91\x67\xae\xb1\x9d\x59\xf8\x6f\x9d" + "\x3b\xdb\x4e\xbc\x50\x3b\x5a\x65\x66\xd0\x34\xbd\xda\xa9\xfe\x2e" + "\x53\xb6\xfe\x2d\xe8\xdb\x32\xc4\xd4\x2f\x64\x8a\x12\x82\x99\xba" + "\xd4\x1f\x11\xe8\x98\x0a\x04\x5c\xda\xb5\x83\x13\xa3\x0b\x5d\x84" + "\xdc\x3a\xc4\xb8\x31\x27\x0a\x2b\xd0\x92\x60\xa6\xaa\x34\xce\x80" + "\x4a\x6a\x2a\x51\xfc\x59\xe4\x9a\x54\x8c\x3c\xe2\x83\x19\x5d\x51" + "\x44\x05\x22\xdb\x8b\x51\xd2\x45\xe4\xbc\xe4\x18\x53\x37\x06\xc6" + "\xd4\x1f\x2a\xf0\xf6\x4a\xd8\x6e\x40\x49\x55\x8c\x3e\x71\x0a\x72" + "\xc5\xff\x2f\x3e\x86\xb7\x5f\x46\xf0\x3c\x3b\x87\xc6\xe9\xdc\xb6" + "\xc0\x35\xf1\xf9\x5b\xa1\x2f\xc6\xbb\xcc\xa1\xf5\x77\x11\x5a\x32" + "\x01\x79\xc5\x47\x22\x55\x28\x0c\xed\xa5\xfa\x03\x28\xd4\xc0\xc0" + "\x98\x7d\x1c\x25\xcc\x40\x2e\xa1\x7a\xbc\xd6\xfb\x0c\xfc\x72\xd0" + "\x56\x38\x16\xee\x4d\x83\xef\x6d\xc9\x79\xd0\x30\xd7\x4d\xe7\x1c" + "\xe6\xce\x39\x8f\xb0\xcd\xee\xb9\x7f\xae\xaa\x4b\xff\x3c\x0d\xee" + "\x3d\x18\xdb\x00\xae\x53\x66\xc4\xe7\xdd\x65\xc7\x1f\x6c\x03\xa7" + "\x69\x7a\xc0\x6a\x66\x50\xc4\xb4\x38\x0d\xdb\xae\x56\xb9\x69\xc5" + "\xd6\x79\x6c\x9f\x78\xc7\x86\xea\x99\xdb\x3a\xcf\xa0\x08\xd8\xbf" + "\x27\x34\xee\x65\x86\xf3\x9b\xb6\x36\x75\x53\xb5\xc9\xde\x26\xbf" + "\xc0\x31\x5a\xf0\x85\x56\x19\x83\x9c\x6b\x53\x3f\x71\xd5\x3a\xdd" + "\xd1\x9a\x61\x17\xf3\x56\x5b\xd3\xb1\xdc\x31\x3e\x5a\xa7\x1a\x6f" + "\x7a\xcc\x06\x04\x98\x6e\x3c\x06\xf6\x03\xfe\xef\xf8\xd0\xfd\x2c" + "\x9e\x1b\xf7\x73\xe3\xab\xa9\x6d\x25\xf0\x70\x96\xc1\x73\x94\x8e" + "\x71\x6f\x88\x60\x6e\x7b\xb9\x32\x0a\xf0\x8d\x9e\xa9\x33\x66\xbe" + "\x80\xc7\x57\xd7\x52\x7d\x0d\x22\xc7\x7f\x72\x87\x49\x6f\x88\x26" + "\xf3\x53\x3f\x39\x8f\xdb\x04\xdd\xa4\x82\xf1\x58\x15\x5a\xc8\xd4" + "\x61\xfe\x30\x64\x2a\xb5\xa9\xf3\x60\x4c\xce\x1c\xa5\x35\x7a\xbe" + "\x8e\xea\xb6\x45\x06\xe2\x31\x01\x3f\x6f\x4c\x1a\x9c\xcb\xb5\x03" + "\xd7\x6d\xa3\x55\x7e\xb2\xdf\x00\xe7\x33\x19\x2f\x70\xfd\x21\xfc" + "\x46\x78\xe8\x93\xfd\x4c\x1f\xd8\x97\xd6\x2f\x1b\xf6\xb5\xb9\xa4" + "\xcc\x0a\x84\xed\x08\xfe\x3e\xad\x49\xbc\x05\xc7\x66\x8d\x20\x98" + "\xee\x97\xc5\xfb\x5b\x81\xed\xb9\x31\x0d\x73\x14\xe6\x26\xd8\x3e" + "\x9d\x72\x10\x19\x03\x58\xee\xf1\x7c\x01\x78\x25\x2b\x4e\xeb\x14" + "\x56\x8d\xed\x84\x7d\x5b\x43\x78\x2d\xde\xb0\x2d\x32\xf8\x28\x28" + "\xa2\xa3\xc7\xf0\x73\x94\x95\xad\x75\xfa\x23\xa2\xb6\xcc\x3a\x80" + "\x8f\x65\xfb\x09\x5c\x82\xff\xcf\xf2\x0a\x9c\x03\xcf\x79\x1a\x1e" + "\xb3\x08\x3f\x66\xe5\xe3\x71\x0b\xf8\xa4\x8e\x1b\xa7\x70\xdb\xb9" + "\x4c\xc7\xf7\x34\xd0\xaf\xe4\x4b\x5c\x5f\xcc\xfb\x66\xe2\x45\x26" + "\xfd\xfd\x40\x72\xec\xe0\xaa\xda\xd4\xcd\x5d\xe1\xfa\xe5\xe6\x78" + "\x21\xf7\xb5\x79\x25\x60\xba\xfc\xb9\x63\xf0\x37\x68\x25\x53\x7b" + "\xc0\x2f\x2e\xc0\x2b\xdf\x61\xbc\x61\x4e\xc9\xda\x80\xf5\xcf\xfb" + "\xc1\x75\xe9\xef\x87\x41\x5b\xd1\x26\x6e\xc1\xe7\xe2\xe7\x01\xf8" + "\xc5\x85\xe5\x0d\x83\x5e\xc9\x3e\xf3\x06\xd4\xbf\x91\x4b\x60\xdb" + "\x3d\xf7\xf7\x83\xb9\xed\xce\x6c\x9f\x14\x4a\x23\x5c\xdf\xc9\x74" + "\xbd\x7b\xee\x83\xcb\xa1\x5d\x8d\xd6\x69\x78\x18\x8f\x6b\x36\x78" + "\xfb\x30\x4c\x38\xc6\x8d\x12\xfa\x7a\x19\xfe\x7d\x8c\xc3\xe9\x13" + "\x47\x0b\x11\x0a\x02\x6f\xdd\x06\x7f\x6e\xee\xc4\xe8\x6a\x53\x3f" + "\x45\x5a\xb4\xda\x03\x9f\xbf\x1a\xfe\xc6\xdb\xf1\x31\xb0\xdd\x4b" + "\x8b\xd6\x70\xcf\xca\x06\x57\xec\x1f\x7e\xbb\x9f\x8e\x20\xed\x7e" + "\x3a\x12\xb7\xc7\x8d\xf1\x4f\xe0\xff\xe3\xf3\x71\xdb\x39\x9b\x98" + "\x6a\xdc\x1e\xb4\x15\x65\xba\xc6\x3a\xd8\x66\xba\x4e\xd0\xac\xc6" + "\x6b\xad\x80\xfd\x6b\xcd\xef\x21\x6b\x13\x53\xc3\xf5\x2f\x57\x8b" + "\xb6\x04\xe2\x7d\x29\xb0\x0d\x9f\x4b\xb0\xf0\xe9\x61\x8c\x13\x2d" + "\xb9\x2f\x25\xc1\xcb\xa7\x45\x5a\x94\x5d\x68\x3e\xf6\x80\x2f\xda" + "\x9b\xc6\x66\xae\x3d\x9d\xa9\x3d\xda\x16\x69\x83\x49\x8b\xe6\xc6" + "\x19\xf6\x99\x75\xc5\xed\xd7\xa6\x7e\xa6\xd6\xa2\xb5\x5d\x49\xdf" + "\x36\xa6\xd5\x10\x6c\x83\x0f\xd8\x73\x88\xcf\x53\xd7\x97\xe1\x71" + "\x73\xeb\x06\xcc\x63\x83\x4f\xc3\x39\xe3\x2c\xc6\x4c\x17\x8c\x09" + "\xee\xb9\xcf\xc4\x7d\xa1\xfc\x83\xc7\xb9\x10\x15\xb4\xe3\x0c\x7a" + "\xe5\x12\x1e\x7b\x37\x76\x62\x00\x7b\x9f\x65\x99\xda\x80\xf3\x9d" + "\xc1\x5e\x2f\xc1\xb6\x3d\x5a\xb4\xa7\x12\x6f\x4b\x85\x63\xb4\xca" + "\x34\xd1\xef\xed\x26\xf6\x40\x8a\xd2\x6c\x2d\x8e\x2b\xf1\x73\x39" + "\xb4\xb4\x6b\x0d\x2a\xcd\x36\x22\xe3\x5f\x7a\xc7\x04\x26\x32\x9a" + "\x2b\xca\xec\xbe\x25\x75\x55\x48\x9a\xbe\xfc\x8c\xfd\xfe\x15\x53" + "\x0f\xf1\x4f\xfc\x60\x84\xf5\xc6\x0d\x65\xce\x84\x52\xdd\x2d\x96" + "\xa3\xe0\xff\x2c\x0f\x6c\x84\x78\x09\xc7\x4c\x10\x17\x47\xa7\x29" + "\x48\xdc\x64\x84\x63\xb7\xe0\xed\x38\xa6\x82\xb1\x67\xab\xd9\x3e" + "\xe6\x2f\x3d\x75\xc4\x36\x39\xee\x2c\x57\xe3\xfe\xea\x5f\xd7\xe0" + "\x3e\x1b\x77\xf4\xd4\xe1\x7b\x48\x8a\x63\x8c\xa5\xfa\x5a\x0d\x1e" + "\x9f\xd4\x0b\x71\xbc\x97\x7d\x3d\x34\x07\x31\xc6\x9d\x3d\x75\xd2" + "\xee\x21\x9b\x5d\xff\x00\x31\xf1\x0d\x5d\x9f\x9e\xba\x24\x03\x52" + "\xac\x4f\x6c\xe3\xf2\x6a\x36\xa3\xb9\xfd\x74\xef\x98\xda\xd4\x1c" + "\xd5\x91\x38\x84\xa4\x6b\xef\x1c\x95\xe9\xde\xb7\x70\xf7\x0e\xd7" + "\x62\xe7\xec\x3f\x97\x95\xcc\xde\x2f\x1c\x23\xba\xd6\x89\x59\xe6" + "\xc6\x1c\xcd\xd6\xa3\xf9\xd9\x4c\xfd\xfc\x1c\xa4\x00\xed\xa3\xfd" + "\x72\x4b\x39\xe6\xe3\x40\x93\x3d\x59\xdb\xe9\x75\x28\x26\x11\xa9" + "\xae\x29\x73\x6e\x86\xc6\x27\xb3\xdf\x4f\xfa\x16\x8e\x93\xd8\x57" + "\xf6\xfb\x55\x25\x10\x63\x87\xea\x93\x18\x32\xa6\x6c\xe9\x3c\x86" + "\x6b\x0f\xef\x33\xf9\x6f\x0b\x17\xfb\x4a\xbf\xc6\x16\xb5\x8c\x7b" + "\x55\x09\xdf\xeb\x96\xf3\xf2\xef\x75\xcb\x2e\xeb\x7b\xdd\xda\xa6" + "\x79\xef\x75\xab\xe8\xf7\x0f\x6c\xdc\xab\x5a\xf8\x5e\xb7\x9e\x90" + "\x7f\xaf\x5b\x33\x04\xee\xf5\x66\x33\xdf\xab\xe8\xfb\x3f\x1b\xf7" + "\xea\x23\x7c\xaf\xb9\x07\xe4\xdf\x6b\x6e\xb2\xf5\xbd\xe6\x9e\x6f" + "\xde\x7b\xcd\xad\x14\xbd\x57\x85\x1b\x83\xf9\x09\x78\xa9\x3e\xf1" + "\x1e\x68\xb1\x4d\x63\x92\x13\xb6\x21\x45\x51\x4d\x1d\x2a\xe9\x5a" + "\x8e\x92\x16\x21\xc5\xc0\x18\xe0\xbd\x65\x68\x28\xb3\xa1\x5e\x5b" + "\x92\x5d\x0d\xdb\xaf\xa0\xe2\xb8\x3a\x14\x38\x0f\xf3\xef\xb6\xdd" + "\xa5\x51\x52\xf9\x77\x5b\x6c\x23\xff\xea\x07\x73\x9c\xbb\xfd\x4c" + "\x49\x75\x3d\xc2\xf7\x0f\xff\x3f\xd2\xc8\xbf\xcb\x88\xbd\x2d\xf9" + "\x17\xdb\xa3\xb4\xae\x8e\xc7\xbf\x64\x0d\xd5\xf6\x75\x96\xdc\x9b" + "\x7a\x0d\x21\x61\xee\xdd\x3e\x03\x73\xef\x16\xd8\x2f\xad\xff\xdb" + "\x7d\x4d\xdc\x9b\x06\xd7\x34\xe7\xde\xa3\x51\x78\xac\xdd\xbe\x56" + "\x1e\xf7\x6e\x5f\x6b\xba\xef\x1c\xee\xbe\xc1\x56\x3a\x3e\xf7\x6e" + "\x17\xad\x75\x69\x8e\x5b\x66\x93\x2f\xfa\xb2\x7b\x5d\x1b\xe3\x8e" + "\x3e\x3e\x78\x7c\xab\x05\x9b\xfc\x63\x4b\x9d\xf3\x15\xe5\x9f\xd9" + "\xb5\x10\xb7\x6b\xa3\x9c\x98\x1d\xbd\xca\x43\x63\x99\x0b\x4c\x9f" + "\x3e\xff\xaf\xbd\xef\x01\x88\xaa\xca\xfe\x3f\xf3\xe6\xa1\x23\x02" + "\x33\xe8\x88\xb3\x65\x36\x29\xd6\xb4\x6b\x8a\x05\x44\x7d\xfd\x16" + "\xdb\xda\xca\xfe\xd2\x74\xfb\x9a\x5f\x6a\xad\xb0\xd4\xb0\xfc\x43" + "\x6a\x4a\xfe\x01\x34\xb7\x9f\xb5\x0a\x44\xe8\xd7\x0a\x81\xdd\xa5" + "\xd5\x5a\x32\x34\xdb\xa5\xed\x8f\x53\x62\x3f\x32\x04\x6a\xf5\xbb" + "\xd6\x4f\xb7\xc9\x35\x23\x45\x25\xa5\x40\x98\x99\xfb\x3d\xe7\xde" + "\xfb\x98\x37\xc3\xa0\x03\xda\xae\xf9\xf5\xe9\xe3\xbd\x77\xdf\xb9" + "\xe7\x9e\x7b\x3f\xe7\x9c\x7b\xef\x79\x6f\xde\x8d\xa3\x38\x26\xcd" + "\xf1\xf1\xfe\x13\x38\x1e\xdf\xd7\x3d\xb9\x05\x4f\xec\xff\x32\xb2" + "\xd0\x5e\x5e\x5b\xd8\xaa\x78\x97\xa4\x9a\x11\x07\x0b\x5b\x9b\x94" + "\xcc\x9e\x9a\x3c\xf1\xd4\xda\xf1\x13\x77\x3a\xbe\x04\xa2\x65\xcb" + "\xd5\xe4\x9e\xcb\x5f\xa6\x9e\x59\xfe\xb2\x9b\xba\x2f\xbf\xe0\x19" + "\x9a\xfc\x65\x6a\x48\xf2\xc7\xa0\xfc\x6d\x49\x61\x38\xd7\x53\xb6" + "\xb7\x25\xa9\xdd\x94\xa7\x30\x24\x8c\xcf\xad\x8c\x90\xfd\x1f\x8b" + "\x19\xd3\xf4\x5a\x71\x93\x82\x3e\x80\xf7\xe1\x64\x7b\xc2\xff\x35" + "\xa0\xcf\xfa\x9c\x09\x9f\xd4\xd4\x4d\x9f\xf4\x52\x97\xeb\xff\x75" + "\x2e\xff\xa6\xb4\xef\xa1\xfc\xae\xeb\x1f\xe8\x13\x37\x5f\x3d\xb1" + "\x4b\x9f\xb8\x2e\x29\xad\xb3\x4f\xfc\xc3\x3b\xdd\xf7\x89\x7f\x58" + "\xd5\xd9\x27\x6e\xfc\xda\xe7\x13\x37\xee\xed\xb9\x4f\xdc\xf8\xdb" + "\xd0\x7d\xe2\xc6\x65\x3d\xf3\x89\x1b\x53\xce\xec\x13\x37\x96\xf6" + "\xcc\x27\x6e\x2c\xed\xec\x13\x37\xaa\xfe\x3e\x71\x63\x97\xdf\xba" + "\x60\xf9\x03\x5b\xb1\x8f\x8e\x38\x62\xdc\xb4\xc9\xbd\x02\xc0\x9b" + "\xff\x5c\xf5\x04\x0f\x6b\x61\xcf\x0e\x6c\xf5\x2a\xf1\xe4\x57\x92" + "\x5b\x5a\xd2\x4d\xde\x45\x8e\x08\xd6\xef\x27\xb7\xb1\x76\x1b\xcd" + "\x87\x62\x51\x7e\x33\x6b\x71\x44\xb1\x45\x8e\x7e\x45\xdf\x81\x15" + "\x77\x5b\x91\xec\x8f\xf1\x3c\x8e\x2d\xb2\x85\xe7\x2e\x84\xe1\xe6" + "\x66\x30\xa1\x0c\xa9\xe6\xe5\x16\x40\x1f\x64\xa5\x73\xb6\xe2\x60" + "\x66\xc9\x77\xa0\x9a\x33\x11\x9b\x68\x2c\x2f\xd3\xcc\xd8\x7c\x07" + "\x94\xcc\x03\x93\x57\x01\x5b\xb1\xc2\x2a\xdc\x2d\x0e\xc5\x63\x1d" + "\x07\x02\x9f\x97\xa7\xe0\xbc\xdf\xc2\x0a\xef\xa8\xf1\xc6\xdc\xb1" + "\xcd\x93\x9d\x6e\x64\x4b\x52\x8d\x24\xab\xa7\xf0\x8e\x0a\xb6\x0e" + "\xf7\xec\xf4\x28\x1a\x43\x97\x2c\xc4\xb2\x5b\x6c\xe1\x79\x58\x76" + "\xf1\x42\x88\xdd\xf0\x1d\x38\xd8\x29\x87\x82\xf8\xa7\xd2\x3a\xa4" + "\xd8\x46\xa9\x5e\xe5\x60\x26\xde\x53\xc9\x27\x32\x2a\xdf\x8d\xe5" + "\xb7\x3b\x28\x3e\x85\xba\x0d\xb6\x12\x2c\xdf\xb3\xc8\xd1\x4d\x7b" + "\x79\xd9\xc1\xf5\x53\xca\xe5\x1d\x3e\x62\x22\xdb\x8c\x3b\xc9\x85" + "\x6d\x58\x42\x6d\x32\x62\xc4\x24\x92\x6d\xcd\x77\x30\x1c\xe5\x8c" + "\x45\x19\x1c\x58\x2e\x7d\xc3\x25\xf5\xfe\xc7\x2c\xa4\xa3\x7e\xb2" + "\x79\x9e\x95\xb2\x9d\x40\xd9\x8e\xfb\x64\xa3\xb2\xa8\x7d\xba\x7a" + "\x3e\x3a\x61\xd9\x60\xb2\xcd\xaf\xcc\x99\xbd\x53\xe8\x59\xe9\xa9" + "\x25\xe9\xdd\xd4\xd5\x97\x9b\xbb\xd2\x97\xbc\xcd\x30\x88\x59\xd6" + "\x54\xdf\xf9\xeb\xcf\x19\xc5\xff\x7e\xbd\x19\x86\xd7\xa1\x5d\xd7" + "\xb6\x1e\x03\x16\xbd\xa6\x7a\xa7\xa3\xb1\x9b\x65\xbd\x92\xd6\x55" + "\x59\xcf\xac\x60\xf5\x5e\xeb\x1d\x4d\xcc\x3a\x3e\x25\x6f\x05\xcb" + "\x6c\x8f\x1d\x6a\x69\x8b\x1d\xea\x7a\xc0\x6d\x41\xbd\x66\x99\xf6" + "\x79\x60\x3f\x6c\xac\x78\x69\xd7\x1e\x9c\x97\xde\x0b\xa6\x83\xc6" + "\x8a\xfd\xd9\x9f\xd2\xb3\xa7\x57\x9a\xfc\x9f\x3d\xfd\xd1\x0a\xc6" + "\xf2\x95\x60\x7c\xb5\x10\x8c\x9b\x2b\x01\xe9\xfc\xf7\xd7\xf6\x08" + "\x5e\xe5\x53\x27\xbc\x3c\x18\xb2\xdc\xec\x2b\x96\xef\xb6\xe5\x2a" + "\xac\x75\xc2\xb5\x06\x97\x73\x21\x3d\xb3\x29\xbf\x07\xdb\xf4\x28" + "\xf6\xb5\x66\x3c\x1f\x86\x98\x42\xc6\x3c\xe8\x7f\xc4\x58\x1e\x4b" + "\x76\x63\x6e\xee\x9d\xe2\xc9\x4e\x05\xb7\x7d\x6a\x72\x7b\xe1\x1d" + "\x2e\x4f\xe1\x8d\xa5\x5e\xcb\x73\xd5\x14\xbf\xa5\xe7\xa2\x68\x1b" + "\xa9\x0f\x78\x4c\x64\x8f\xa9\xce\x07\x77\xc1\xe1\x05\xa0\x64\x7f" + "\x0b\x91\xa8\x9b\x1d\x76\x35\xbe\xd1\xdc\xba\xac\x91\x79\xc9\xb6" + "\x28\x5e\x8a\xf7\xa2\xb2\xbe\xc5\xf9\x7d\x53\x03\x14\xcd\x03\xab" + "\x67\x7e\x7a\xbf\xa6\x53\xe9\xfd\x5f\xf4\x82\x35\xaa\x19\x2c\x45" + "\x27\x51\xa7\xe6\xa3\x3e\x9d\x44\x3b\x6b\x12\x76\x46\xbf\xc3\x2f" + "\x26\x1b\x7b\xe6\x93\xea\x92\x93\xc2\xc6\xb8\x1e\x91\x8d\xcd\x45" + "\x3d\x9a\xc3\x63\x14\x36\x6c\xbf\x0a\x37\xda\x05\xcb\x7d\x79\x4f" + "\xd1\x0a\x46\xf1\x5c\xa5\xe4\x48\x6f\x1e\xbf\x08\xbb\x56\xb1\xef" + "\x9a\xd8\x0a\xbe\x58\x46\xc5\x81\xb6\x61\x43\x5d\xf6\xbb\xd8\x89" + "\x83\xc6\xf2\x89\x98\x6e\xb2\x4f\xbe\xc6\x82\xed\x7d\x40\xc4\x36" + "\x2a\xf6\x53\x8c\xd2\x85\x6d\x41\xed\x62\xbf\x0b\xae\x39\x68\xfc" + "\xe3\x30\x6a\xc7\x45\x9b\xc0\x98\x71\x0b\x3b\x84\x6d\x36\x9c\xf1" + "\x38\xde\x1f\xf9\xbb\xb2\xf4\xec\xfd\x23\xfe\xac\x4c\xe4\xf1\x60" + "\xbb\xb9\x2d\xed\xe9\x5e\xeb\x38\x8b\xf3\x91\x36\xee\x87\xa8\x1d" + "\x0f\xcf\x02\xe5\x81\x46\x6c\x2b\x0f\xb6\x55\x8b\x23\x02\xfd\xd1" + "\x44\xf2\x47\x2c\xff\x27\xa3\x97\xba\x98\x77\xc2\x34\x23\xcb\x7a" + "\x0c\x4c\x14\xb7\xbe\x3f\x03\xd8\xb2\x63\xd8\x5e\xcd\xfb\x00\xfd" + "\x52\x14\xfa\xac\x7e\x1b\x16\x82\x95\xda\x2b\xb2\x11\xc7\x2a\x05" + "\x79\xce\xcd\x59\xd5\x61\x1e\xd4\x5f\xf2\x4f\xe6\xe5\x86\x3e\x68" + "\x67\x51\xab\xc9\x1e\xd1\x3e\xcd\xcb\xb9\xbf\x4c\x2d\x42\x3b\x74" + "\x2f\x72\x0c\x69\x5f\xe4\xb0\xe3\x3e\x58\xf3\x61\x9a\xff\x60\xb9" + "\xaf\x8c\x26\xff\x55\x97\xe9\x02\x37\xb6\x6d\x14\xf5\x75\x8b\x1c" + "\x83\x78\x1b\x3f\xec\x80\x91\xad\x60\x40\x99\x2c\x28\x2f\x94\xcc" + "\x00\xd3\xee\xf4\x83\xe0\x41\xdb\xd0\xda\x7d\xfc\x4c\x3b\x20\x5f" + "\x65\xa7\x63\x2f\xc8\x36\x33\x74\xad\x77\x9b\xb7\xf8\xf4\x6e\xf3" + "\x16\x6a\x3b\xa1\x77\x9b\x2b\x2e\x46\xbd\xfb\x28\x95\xeb\x9d\xb1" + "\x7d\x18\xd7\xa7\xe1\x75\xee\xad\xd8\x46\x9b\x8b\x48\x47\x48\x67" + "\x3e\x7c\x85\x74\xe6\xb5\xaa\x0b\x55\x67\x4e\xb7\x38\xec\xb8\x7f" + "\x2f\x3a\x83\x7c\xb9\xce\x50\x5b\x7d\x94\xda\x06\x5a\x1b\x71\x5b" + "\xcd\x5f\x53\x6d\xcf\x86\x5b\xd1\x56\xf7\x9b\x97\x0f\x86\xdd\xbc" + "\x9d\x2a\xf6\xdb\x27\x33\xef\x41\xe3\x6b\x9e\xec\x8f\xc1\xd2\xb6" + "\x82\xb1\x3a\xf7\xab\xe0\xb5\x8e\x05\x7a\xee\xe8\x2d\x34\xba\x70" + "\xce\x5a\xcd\x9e\x7d\xc5\x4e\x31\x75\x73\x06\xc5\xb1\x73\xeb\x3d" + "\x6b\x27\x97\x7a\x9f\xcd\x45\x7f\xfe\xca\x2a\x7a\x76\xe0\x7d\x76" + "\x76\xa9\x37\xfa\x25\x57\x4b\x6e\xc5\x18\x97\x41\x29\xe7\xb1\xed" + "\xc2\x3b\x28\x96\x47\xfe\x57\x3e\xe7\xa2\x67\x88\x15\xd3\xb4\xe7" + "\xd9\xe4\x13\xe4\xb3\x03\xf9\x6c\xa1\x82\x30\x0c\xa7\x67\x0b\xd2" + "\xa7\xdc\xad\x3d\x5b\xd0\xae\xe9\x3e\xe6\x4b\xe5\xcf\x57\x7d\xf9" + "\xf6\x48\x3a\x99\xef\x95\x4f\xc9\xd7\xfb\xf2\x89\x6b\xec\x47\xf6" + "\xb4\x2b\x60\x0a\x3a\xc6\xb1\x4e\x2e\x45\xfb\xc1\xb9\xd1\xd6\xbb" + "\xf1\xa8\x1c\x36\x6e\x79\x1c\x8f\x46\x3c\xf2\x38\x66\xf7\xfa\xab" + "\x2d\xe2\x5b\xe3\x85\xe3\x17\x88\xf2\xb7\x44\x73\x9b\xfc\x31\x44" + "\x1e\x91\xe7\x2d\xb9\x5b\x66\x69\xcf\xe5\x3b\xe8\x3b\xf0\xd9\x62" + "\xa2\xb2\x11\x23\x55\xbc\x2b\x20\xae\xe9\x9d\x19\xc9\x8f\x5f\x7b" + "\x63\x87\xd5\x3b\xb3\x0e\x42\xa3\x71\xcb\xbe\x3a\xec\xc3\xbd\xeb" + "\xc6\x2f\xa0\xe7\x5e\x64\x57\x5a\xb9\x68\x8b\x26\xe7\x62\x4e\xf3" + "\x26\x1f\xe7\x16\x8e\xc9\x60\x05\xed\x2e\x9a\x0b\xb6\xb0\xf4\x5b" + "\xe4\x91\x9e\xf7\x18\x45\xdc\x64\xeb\x30\x86\xd8\xd2\x3a\xea\x1d" + "\xef\x11\xd1\xfa\xe6\x39\xaa\xfd\xbd\xa5\x20\x9f\xc9\x0b\x79\x69" + "\x0d\x74\x7a\x4f\xe7\x9a\x1c\xc8\x69\x09\xb2\x06\xba\xef\x7d\x9e" + "\xad\x16\xef\xda\x31\x19\x2d\xb9\x5b\xd3\x10\x83\x52\x7d\x9d\x83" + "\x61\x81\xf4\x4b\xbb\xba\xd7\x3d\x1c\xb6\xae\xef\x8a\xcf\xed\x0e" + "\x0f\xeb\x26\xaf\xae\xe3\x3f\xb1\x43\x32\x26\x6c\xf2\x38\xbd\xed" + "\xa9\xe6\x9d\x4b\x8f\x75\x73\x6c\xf3\xfa\xe8\xae\xf8\x7a\x0a\xc7" + "\xda\xda\xaf\x1e\x92\x41\xcf\x1f\x3c\x73\x53\xc7\xd6\x6e\x72\xc3" + "\xcb\x73\x1a\x14\xf2\x87\xe5\x47\x2a\x94\x09\xd7\xca\x31\xdc\x21" + "\xb0\x50\xdc\x8b\xc6\x72\xb9\xc7\x21\xb6\x2d\x3b\xd5\xdc\xd6\x9e" + "\x0a\xbf\x39\x0e\xa3\xbd\x0f\xdb\xc2\x57\xcf\x00\xf5\x34\xfa\xc2" + "\xd3\x5f\xa5\x9b\x3f\xda\xdf\x00\xdb\x31\x6f\x6d\xb3\x0b\x8a\x91" + "\x96\x7d\x95\x1a\x75\x47\x1a\x6b\xad\x49\xdb\x0a\x13\x1c\x1e\x67" + "\xd6\x17\x10\x89\x3e\xd1\x52\x97\xf9\x12\xce\xa1\x8e\x41\xd8\x13" + "\x8a\xbd\xce\xfd\x25\xac\x99\x81\xbe\x14\x7d\x67\xf6\xdd\xd8\x67" + "\xa0\x4e\xbc\xa8\xef\x33\x1e\x79\xc1\xd7\x67\x9c\xc0\x3e\xa3\x00" + "\xfb\x8c\x6c\x1b\xd4\x66\x38\x01\x7d\x58\xef\x3b\x33\xcc\xad\x59" + "\x19\xd8\x77\x3c\x81\x7d\x47\xe6\x97\xc0\xfb\x8d\xc6\x06\x40\x9f" + "\x1f\xb5\x61\x0e\x58\xdb\x4e\x60\xdf\x71\x02\xfb\x8e\x2c\xd1\x77" + "\x3c\x7f\x1c\xfb\x8e\xb9\x38\x37\x98\x83\x7d\x47\x63\x90\xbe\xe3" + "\x78\xf0\x79\x81\xe6\x07\x4f\x9f\x70\x28\xcf\x63\xbf\xb1\x78\x2f" + "\x28\xcf\x4f\xee\xdd\x4d\x9d\xd9\xd6\xe5\xfb\xdf\x6c\xdd\xf8\xff" + "\xf0\xb2\x54\xa0\x76\x5f\xdc\x8a\xfd\x30\xe2\x52\xe7\x70\x83\x79" + "\x4f\xef\x94\xd3\x98\xde\x1e\x13\x6f\xdf\xf4\x59\x93\xc2\x0a\x93" + "\x92\x4f\x23\x6e\x8b\x1f\x07\xa5\x1d\x31\x2c\xbf\x2b\x5f\xa1\x79" + "\xa2\x77\x6d\xfc\x34\x31\x27\xfd\xd3\x97\x14\x13\x31\xbb\x04\x6e" + "\x6e\x96\x6a\x66\x0f\xa5\x46\xae\x79\x10\x54\xcf\x3f\x6c\xe1\xde" + "\x87\x6c\xa6\xac\xbd\x60\x69\x7a\x28\x1d\xdb\xeb\x18\x6c\xff\x24" + "\x5f\x29\xb9\x17\xec\xf4\xcd\x44\xf6\x0c\xb8\x4b\xee\x87\xa4\x92" + "\xbf\x43\x7c\xf1\xbd\x30\x7c\xc3\x67\xf4\x6d\x75\xc4\xb0\x81\xb5" + "\xee\x4e\xff\x0b\x94\x7c\x06\xc9\x6c\xdd\x8d\x76\x36\x60\xac\x0d" + "\xcf\x93\xf2\xef\xc5\xf9\x03\xde\x9f\xe0\x38\xed\xac\xcb\xdc\x0d" + "\xab\x0f\x02\x64\x7d\x2d\x31\xee\xc0\xf7\x00\xb8\x15\xf4\x1f\x34" + "\x26\x18\x2f\xf0\xa5\xe7\x59\x34\xe7\xe8\xc0\x78\xc6\xfb\xfe\xe3" + "\x02\x89\xf1\xee\xc6\x7a\xc0\x3e\xb0\x77\xc7\xf8\x80\x63\x7c\x00" + "\xb4\xb1\x01\x62\x13\x85\x63\x01\xeb\xe9\x53\x01\xe3\x83\x79\x3d" + "\x1c\x1f\xc8\xf9\x8d\x7b\xbe\x43\x29\x52\x18\x64\xef\x06\x65\xbd" + "\xb7\xbb\x18\xff\x89\xff\xfe\x9b\x62\x5f\xe2\x9d\x9c\x37\x66\x12" + "\x16\x2e\xe3\x1b\xe9\x77\x3b\x0c\xd0\x43\xec\x4b\xcf\x82\xfd\x21" + "\x81\x7d\xe5\x17\x3d\xc4\xbe\x94\x3d\x63\x98\xd4\x33\xec\xbf\xed" + "\x26\xf6\xfc\xdb\x93\x17\x29\xf6\x95\xe5\xfe\xd8\xff\x79\xba\xc0" + "\xfe\xcf\xd3\x7a\x8e\x7d\xc2\x59\xec\x3e\x41\xda\xfd\x5f\x0e\xf4" + "\x0c\xfb\x04\xb4\x7b\x43\x79\xcf\xb0\x3f\xd6\x4d\xec\xf9\xf7\x2b" + "\x2f\x52\xec\xff\xb2\xc9\x1f\xfb\x37\xa7\x0a\xec\xdf\x4c\x3b\x07" + "\xec\xcf\x62\xf7\x09\xd2\xee\xdf\xfe\xb4\x87\xd8\xa3\xdd\x2b\x6a" + "\xcf\xb0\x3f\xd0\x4d\xec\xf9\x37\x30\x2f\x52\xec\xdf\x2e\xf3\xc7" + "\xfe\xad\xfb\x04\xf6\x6f\x4d\xe9\x39\xf6\x89\x67\xb1\xfb\x44\x69" + "\xf7\xef\xee\xed\x19\xf6\x89\x68\xf7\xca\x94\x9e\x61\xff\x4e\x37" + "\xb1\xe7\xdf\xd1\xbc\x48\xb1\x7f\xb7\xd4\x1f\xfb\x77\xee\x11\xd8" + "\xbf\x93\x7a\x0e\xd8\x9f\xc5\xee\x13\xa5\xdd\x3b\x3f\xee\x21\xf6" + "\x64\xf7\xdb\x7a\x86\xfd\xb2\x6e\x62\xcf\xbf\xc5\x79\x91\x62\xef" + "\x2c\xf2\xc7\x7e\xfb\xdd\x02\xfb\xed\x93\x42\xc1\x7e\x89\x1e\xfb" + "\xfd\xbd\x53\x70\x6e\xc5\xc7\xf9\x2f\xdf\x2b\xb1\xff\x03\x62\x8f" + "\xf5\x2f\x9f\xbc\x3e\x60\x8c\xff\xfe\x4e\x8e\x7b\x1a\xe2\x9e\x89" + "\xb8\xe3\xdc\x50\xc3\x1c\x31\x8a\x24\xdc\x09\xf3\xac\x03\x60\xd9" + "\x8e\x79\x09\x1f\xc2\x18\x71\xb4\x73\x9c\xc3\xc1\xcd\x0c\xaa\x8d" + "\xf0\xa4\x71\x3f\x61\x7e\xb6\xb1\x3d\xe9\xc4\x59\x31\xff\xe5\xf7" + "\x33\xbe\x6f\x0b\x8c\xff\x9d\x2f\xcc\x3f\xc6\x39\x5c\x56\x77\x31" + "\x7f\x3f\xdf\x1f\xf3\xf7\xc6\x13\x0e\x2e\xe3\x7b\xe3\x7a\x8e\x79" + "\x42\x69\xd7\x98\x6b\x7d\x7c\xd5\x9b\xe7\x86\xb9\xa2\xfa\x30\x4f" + "\x28\x3d\x33\xe6\x07\x7a\x80\xf9\xf9\xed\xdf\x2f\x2c\xcc\xab\x56" + "\xfa\x63\xbe\xe3\xa7\x02\xf3\x1d\xc9\x5d\x61\xee\x45\x7f\x4d\x31" + "\x75\xfa\x6d\xa0\xa7\x25\x75\x6c\x3b\xe2\x4a\xbf\x11\xa4\x58\xef" + "\xab\x73\x2a\x95\x76\xc4\x3d\x6f\x21\xc4\xae\x5e\x08\xa3\xcd\x0d" + "\xc2\x7f\xb7\xa1\xff\x7e\xfa\x3b\x50\xbd\x8f\xda\xc2\x57\x1f\x01" + "\xb5\x0d\xdb\xb8\xed\xd1\x74\x73\x4d\x5a\x13\x6c\x3f\x5e\xa9\x50" + "\xec\x96\x9e\xdb\xb1\xa3\xa9\x51\xbf\x98\xc6\x5a\x6b\x0e\x15\x88" + "\xb8\xca\x97\x5a\x5c\xe5\x55\xbf\xb8\xca\x6f\x8e\xc8\xb8\xca\x3d" + "\x02\xa3\x22\x3d\x3e\xf7\xff\xae\x8b\xb8\x4a\xf5\x59\xe3\x2a\x3c" + "\x9e\x72\x1c\xac\xed\x73\xd3\xfb\x3d\x2f\xe3\x2a\x2f\xcc\x39\xb7" + "\xb8\x4a\xdb\x5c\x87\xf2\x02\xe2\xb3\xe4\x1e\xc4\xe7\xb3\xee\xe2" + "\xf3\x41\x97\xdf\x3f\x09\xec\x6b\xb5\x3e\x56\xeb\x57\xc9\xe6\xa8" + "\x6f\x6d\x2d\x8c\x8f\x0d\x8c\xa5\x90\xbd\x1d\x37\x56\x27\x90\x4f" + "\xee\x59\x3c\xc5\x18\xf1\x43\x8b\xa7\x90\xcd\x69\xfd\xec\x85\xd1" + "\xc7\x56\x83\xbf\xed\x7d\xf0\xa6\xe8\x63\x3f\xa8\x0c\x75\x7c\x75" + "\x06\xcc\xcb\x02\x63\x28\x02\xf3\x5d\xd7\x52\xcc\xa5\x67\x71\x14" + "\x63\xda\x0f\x2d\x8e\x72\xe1\x61\xfe\x61\xb3\x3f\xe6\xd5\xaf\x0a" + "\xcc\xab\xcb\xcf\x1d\xf3\x84\xd8\xc0\xd8\x89\xc0\xbc\xe6\x0a\x8a" + "\xb5\xf4\x2c\x7e\x62\xec\xe1\x58\xfa\x5f\x17\x3f\xb9\xf0\x30\xff" + "\xa8\xc1\x1f\xf3\x5d\xbf\x15\x98\xef\x2a\x3d\x0f\x98\x97\x05\xc6" + "\x4c\x04\xe6\xb5\xd1\x34\xf6\xea\x59\xdc\x44\x35\xfd\xd0\xe2\x26" + "\x17\x1e\xe6\xbb\xf7\xfb\x63\x5e\xb3\x56\x60\x5e\x53\x78\xee\x98" + "\x27\xc6\x06\xc6\x4a\x04\xe6\xf5\x61\x14\x5b\xe9\x59\xbc\x44\xfd" + "\xc1\xc5\x4b\x2e\x3c\xcc\xeb\xea\xfd\x31\xaf\x7d\x5a\x60\x5e\xbb" + "\xea\x3c\x60\x5e\x16\x18\x23\x11\x98\x7f\x7c\x9a\x62\x2a\x3d\x8b" + "\x93\xa8\x15\x3f\xb4\x38\xc9\x85\x87\xf9\xc7\x55\xfe\x98\xd7\x2f" + "\x13\x98\xd7\x2f\x0d\x75\xce\xac\xcd\x95\xb5\xf9\x31\x9f\x2b\x5b" + "\x71\xcc\x1e\x10\x1b\x11\x78\xff\xf5\x4b\x3e\x66\xef\xf1\x5c\xd9" + "\x18\xf1\x43\x89\x8f\x68\x58\xd3\x7c\xf9\xc2\x98\x2b\xff\x35\xe0" + "\xf9\xe7\x27\xb3\xc5\x5c\xf9\x93\x59\x5d\x61\x1d\xec\x5d\x84\x5a" + "\x9c\x6b\x6a\xef\x22\x3c\xbd\x10\x71\x44\x3d\xa0\x77\x11\xe8\x9d" + "\x84\x60\xef\x23\xd0\x7b\x08\xda\x3b\x09\xfa\xf7\x11\x52\x5c\xac" + "\x95\xde\x49\xa0\x79\x72\x4d\xda\x33\xa0\xbd\x9b\x40\xef\x20\x64" + "\x7f\x01\x91\x84\x11\xbd\x7f\x40\xf3\xe5\xef\xfb\x1d\x84\xf5\xde" + "\x0b\xe1\x1d\x84\xbd\x5d\x7e\xff\x56\xb3\xb9\xf1\x2f\x0f\x06\xd4" + "\xb7\x8e\x38\x55\xfb\xba\x78\x3b\xd9\x1c\x61\x64\x6e\x14\x76\xf8" + "\xea\xe4\x0a\xa5\x2e\xb3\x12\x9e\x5e\x0c\x16\x2d\x7e\x41\x36\x88" + "\x7e\xd9\xec\x46\x3c\x57\x3f\x22\xe2\x18\xde\xa3\xa9\x91\x4d\x8f" + "\xa6\x9b\xe9\xf7\xf8\xdb\xff\xbb\x42\xa1\xd8\x63\xc9\x0c\x88\x7f" + "\xf1\x30\x24\xd5\x36\x1f\x00\x6e\x53\x6b\xe3\x53\x31\x6f\x72\xfb" + "\xda\xb1\x36\xef\x80\xf8\x31\x4d\x03\xe2\x53\x08\xb7\xd5\x47\x00" + "\xc8\xbe\x08\xb7\xba\xcc\x0d\x1d\x78\x71\xac\x14\x19\xdb\xe8\xd2" + "\xa6\x3e\xe9\x31\x66\x45\xc7\x11\xb3\xb9\xfe\x98\x6d\xe8\x69\x7c" + "\x43\x7b\x9f\x7b\xae\x43\xd9\x80\x36\xb5\xf8\x97\x88\xd9\x5d\xdd" + "\xc5\xec\x6f\x5d\xae\x7f\x7c\x06\xcc\x4a\x43\xc4\xec\xd0\xd9\x31" + "\x33\x4c\x0a\x82\xd9\x3e\xcc\xeb\x94\x98\x55\x21\x66\xd5\x3e\xcc" + "\xbe\x0d\x11\xb3\xc0\x39\xec\xc5\x84\xd9\xbe\x2e\xd7\x3f\xeb\x1a" + "\xb3\x84\x10\xed\x2c\x21\x04\x3b\x33\x94\x77\xc6\x2c\x01\xed\x2c" + "\x41\xda\x59\x02\xda\x59\x82\xce\xce\x8e\x85\x88\x59\xe0\x1c\xf4" + "\x62\xc2\xec\xb3\x2e\xd7\x3f\x3e\x03\x66\x21\xda\x59\x42\x08\x76" + "\xa6\xa8\x41\x30\x43\x3b\x4b\x90\x76\x96\x80\x76\x96\xa0\xb3\xb3" + "\x03\x21\x62\x16\x38\x87\xbc\x98\x30\xdb\xdf\xf5\xef\xbf\xbb\xc4" + "\x2c\x31\x44\x3b\x4b\x0c\xc1\xce\x94\x29\x9d\x31\x4b\x44\x3b\x4b" + "\x94\x76\x96\x88\x76\x96\xa8\xb3\xb3\x77\x42\xc4\x2c\x70\x0e\x78" + "\x31\x61\x76\x60\x4f\x0f\x30\x0b\xd1\xce\x12\x43\xb1\xb3\x6d\x41" + "\x30\x43\x3b\x4b\x94\x76\x96\x88\x76\x96\xa8\xb3\xb3\x65\x21\x62" + "\x16\x38\x87\xbb\x98\x30\xfb\x7c\x55\x77\x31\xe3\x78\xe1\xd8\x31" + "\x28\x66\x6d\xfe\xe3\x46\x37\x8e\xe3\xe9\x99\x57\x50\xbc\x9e\x01" + "\x37\x5b\xae\xda\x08\x2b\x1a\x0f\x12\x5e\x75\x99\x3b\x21\xd8\xb8" + "\x91\x9e\x8b\x21\xee\x40\xcf\xc6\xb2\xbf\xec\xc6\x78\xf1\xc1\xae" + "\xb0\x3a\xfb\xf3\xb0\xa2\x39\x3e\xac\xb4\xe7\x61\xe7\x15\xab\x4f" + "\xba\x8b\xd5\x17\xf1\x3d\xc3\x2a\xa1\xf4\xec\x58\x25\x1c\x3a\x33" + "\x56\x8a\xea\xc3\xea\x80\x0e\xab\xce\xfd\x58\xe8\x58\x05\xf4\x5f" + "\x17\x15\x56\x07\x5d\x5d\x61\xe5\xb6\x8e\xb5\xd1\x6f\xde\xef\xc4" + "\xb9\x2f\x7b\x28\x75\x6c\xee\x41\x88\x7d\xe6\x20\x8c\xa6\xdf\x37" + "\xbf\xba\xb8\x55\xc1\x3a\x7e\xb5\x6b\x4f\x03\xb4\x1f\xb5\x85\xd3" + "\xef\x67\xb8\x9f\x7c\xd4\x66\xaa\x4b\x6b\xe2\x3e\x71\x0d\x62\x54" + "\xdb\x5c\x89\x6d\xd2\x3b\xa5\xb6\x79\x2b\xb4\xcd\x4f\x85\x8f\xf6" + "\x1f\x41\x5c\x58\x7b\x5d\x63\x25\x94\xe0\x7d\xe7\xc2\xad\xe0\x3d" + "\xea\x08\x7f\x20\x13\x94\xe3\xc6\x7f\x94\xd1\xdc\x79\x64\x26\x58" + "\xc6\x35\xb2\xd6\xda\xc6\x5d\xf0\xe2\x83\x10\xbb\x33\x13\x80\xda" + "\x9a\xcf\x95\x1f\xa1\xb9\xf2\x3b\x7e\xf8\xbc\xa0\x9b\x2b\xf3\xdf" + "\xcb\x66\x20\x36\xdf\x04\x60\x83\x73\x71\x6c\xeb\xde\x77\x36\x23" + "\x36\xcd\x1a\x36\xc7\x20\xeb\x31\xc2\xc6\xe5\x9b\x2b\x4b\x6c\x8a" + "\xc8\xe7\x65\xe8\xe6\xca\xc7\x75\xd8\xc8\xdf\xaa\xfa\x61\xa3\xc5" + "\x32\x16\x39\xe8\x19\x79\xa7\xb9\x72\xcf\x62\x19\x87\xba\xfc\xad" + "\x08\xb7\x23\xb4\x91\x3b\xd1\x8e\x96\x2e\xe0\x76\x24\xda\x3f\x26" + "\x1e\xf5\xbd\x02\xcc\xae\xde\x29\xcf\x20\x06\x6d\x68\x6b\xd4\x17" + "\x65\x63\x3d\x09\x4b\xc2\xed\xce\x4d\xed\xed\xf7\x37\x83\x82\x3e" + "\x6b\x1a\x61\xe7\x39\x6a\x33\xe5\x62\x5f\x55\x37\xe5\x33\xc4\xe7" + "\x24\xd4\x35\x49\x6c\x16\x7f\x06\xc7\x8d\x5f\x26\xb1\x47\x1d\xe1" + "\x23\x50\x4f\xb1\xef\xb1\x3c\x40\xbf\x7d\x41\x9f\xf7\xe2\x0c\x48" + "\x1a\x97\xc1\x5a\xf9\xbb\x3c\x68\x63\xd4\x9f\x91\x3f\xac\xcd\x78" + "\x1f\x3c\x6b\xe3\xc7\xb4\x0f\x18\x6b\xdb\xb9\x00\x80\x7c\x22\x61" + "\x11\xf6\xb8\x0f\x3b\xfa\xdd\x9e\x3e\xd6\xd1\xc9\x17\x3e\xb2\x2b" + "\xb8\x7d\x4d\x71\x75\x2b\xde\x51\x24\xed\xab\xa8\xa7\xf1\x0e\x2d" + "\x1e\x85\x18\xd2\x6f\xf5\xb2\xf7\x82\xf2\x42\xb7\x31\x3c\x9c\xdc" + "\x03\x0c\x4b\xcf\x8e\x61\x8b\x86\xe1\xa1\xb3\x63\x78\xd8\x1d\x04" + "\x43\xa7\x0f\x43\xc3\x24\x1d\x86\xfb\x24\x86\x55\x3a\x0c\xab\xcf" + "\x8e\x61\xc0\x5c\xfa\xa2\xc2\xb0\xe1\xcc\xf1\x8f\xa0\x18\x26\x84" + "\x60\x87\x27\x24\x86\x09\x21\xd8\x61\x83\xb3\x33\x86\x09\x3a\x3b" + "\x34\x94\xfb\x30\x4c\x90\x76\x98\xa0\xb3\xc3\x84\x10\xec\x30\x60" + "\x6e\x7d\x51\x61\xf8\x75\x75\x0f\x30\x0c\xc1\x0e\x3f\xd7\x30\x0c" + "\xc1\x0e\x8f\xac\x0c\x82\xa1\xce\x0e\x71\xec\xe2\xc3\x50\xda\x61" + "\x82\xce\x0e\x13\x42\xb0\xc3\x80\xb1\xca\x45\x85\xe1\xd1\xd5\xdd" + "\xc7\x30\x31\x04\x3b\xdc\x2e\x31\x4c\x0c\xc1\x0e\x1b\x53\x3a\x63" + "\x98\xa8\xb3\x43\x65\x8a\x0f\xc3\x44\x69\x87\x89\x3a\x3b\x4c\x0c" + "\xc1\x0e\x03\xe6\xde\x17\x15\x86\xc7\xce\x1c\xff\x0f\x8e\x61\x08" + "\x76\x98\xad\x61\x18\x82\x1d\x1e\x8f\x08\x82\xa1\xde\x0e\xb7\xe9" + "\x30\x94\x76\x98\xa8\xb3\xc3\xc4\x10\xec\x30\x60\x2e\x7e\x51\x61" + "\x78\xa2\xcb\xef\x71\xea\x31\xc4\x71\x76\xe7\x71\x69\xb3\x0f\x43" + "\x3d\x7e\x81\x63\xd1\x09\x38\x46\x25\xec\xa6\xb8\x41\xe9\x8c\xdf" + "\x89\x1a\xc2\x6f\x38\x3d\x8f\xfb\xd6\x37\x26\xe5\xd8\xc9\xe7\x39" + "\x84\xd9\xce\x69\x00\x34\x3e\xd5\xc6\xa3\xf4\x4c\xb5\x63\x3c\x3a" + "\xfd\x7f\xeb\x78\xb4\xa9\xbe\xfb\xd8\xc9\x7e\xb0\x4b\xec\xfc\xfb" + "\xbe\x09\xd8\x27\x76\x8d\xdd\x37\xab\x3a\x63\x97\xe0\xf4\x61\x27" + "\xfa\x3d\x81\x9d\xa2\x6a\xfd\x9f\xc0\x4e\xf6\x7f\x67\xc4\xee\x62" + "\xee\xff\x4e\x76\xd9\xff\xe5\x2b\xde\x0a\xdc\x2b\x71\x77\xe2\x5e" + "\xed\x51\xe0\xf6\x0d\x8a\x57\xbc\xeb\x22\xf4\x39\xf0\x7e\x2f\xf6" + "\xd4\x78\x0b\xd1\xb0\xe5\x2a\xb7\x67\x8d\x87\x27\x1c\x00\xd3\x9d" + "\x66\x43\x1a\xad\x09\x42\xb4\xbd\x35\x5e\xe6\xe5\x90\x8c\x75\x16" + "\x74\x0a\xe4\x08\xba\xe4\x5e\x44\xc7\x72\xb7\xae\xc7\x34\x93\xe4" + "\x39\x88\xe8\x3d\x8a\x42\xbc\x02\xcb\xee\x23\x69\xec\x9e\x15\x60" + "\xd7\x97\x8d\xbc\xa8\x4c\x8d\x2e\x9c\xe8\x3c\xbd\x86\xd8\x3c\x06" + "\x35\x56\x4f\xc7\x6e\x03\x3d\x5d\x5f\xc9\xcf\xe1\x57\x8f\x21\x00" + "\x66\x83\x5d\xd4\x25\x53\xd1\xea\x12\xc1\x79\x46\x55\x34\x21\xcf" + "\xe1\x7e\x3c\x7b\x01\x44\x22\x3d\xf1\x8d\x4c\xe7\x72\x13\x7d\x24" + "\x0b\xef\x05\x9c\xbf\x41\x8d\xf3\x2a\x10\x27\xea\x05\xea\x86\x0e" + "\x99\xed\x90\xef\x5f\x46\x94\xd6\x5e\x7a\x3a\xa2\x61\x4a\x07\x8d" + "\x99\xcb\x11\x1e\xa6\xa2\x1c\x49\x7a\x39\x04\x1d\x8c\x92\x74\x16" + "\xac\xd7\xe8\x0e\x2c\xf3\xdd\x36\x8d\x2e\xdb\x03\x3f\x42\x2c\x9c" + "\x75\xe9\x00\xb2\x1d\xa2\x59\xee\xeb\xc3\x65\x5b\x24\xeb\x79\x46" + "\x1a\x0c\xae\x0d\xb2\xbd\xbc\xb9\x5b\x5d\x48\xdb\xcf\xbb\x5c\x1d" + "\xd3\xc1\x77\x05\x7d\x53\x4a\xb6\xc3\x0a\x77\x7f\xce\xb7\x01\x6d" + "\x4b\x31\xd8\x65\x3b\xf4\x27\x5a\xcc\x93\x22\xea\x65\xe9\xc0\xd5" + "\xa3\xa8\x74\xcf\xa9\xa3\xb5\x8a\x36\x76\xba\xb1\x6e\xe3\x3a\xd3" + "\x9b\x02\xe9\x07\x08\xfa\x37\xac\x48\x3f\xb1\x33\xbd\x25\x90\x3e" + "\x46\xd0\xff\xd9\x82\xf4\x93\x3a\xd3\xbb\xfb\x05\xd0\x0f\x14\xf4" + "\x6f\x46\x20\x7d\x6a\x67\x7a\x7b\x20\xbd\x4d\xd0\xbf\x4f\x3a\x32" + "\xa5\x33\x7d\x72\x20\xfd\x8f\x04\xfd\x5b\x26\xa4\x4f\xeb\x4c\x9f" + "\x13\x48\x7f\x99\xa0\x7f\x87\xb0\x9f\x16\x48\x5f\xc2\x69\x61\x88" + "\xa4\xbd\x5c\xd0\x6e\x07\xa4\x4d\x0f\x52\x57\xa3\xe4\x1d\x27\xe9" + "\x07\x09\xfa\xd7\x57\x22\xfd\xac\x20\x58\x05\xd2\x5f\x21\xe8\x3f" + "\x89\x45\xfa\x8c\x20\x58\x05\xd2\x0f\x16\xf4\x1f\xcc\x42\xfa\x05" + "\x41\xb0\x0a\xa4\xbf\x52\xd0\x57\xa7\x21\x7d\x66\x90\xb6\xf7\xa7" + "\x8f\xda\x35\x09\xe9\x96\x6e\x58\xa1\xd9\x8f\x5f\xbb\x07\xf2\xbe" + "\x4a\xf0\xae\x49\xc1\x3c\x39\x41\xda\x3d\x90\x7e\x88\xa0\xaf\x1d" + "\x8d\xf4\x2b\x3b\xd3\x83\x41\xd0\xc3\xf5\x92\x7e\xa8\xa0\xaf\x8f" + "\x43\xfa\x55\x41\xda\x9e\xee\x3b\xa5\x9d\xc6\x0a\xda\xaa\x43\x48" + "\xbb\x3a\x48\xbb\xeb\x69\x87\x09\xda\xcf\xeb\x91\x36\x3f\x48\x9b" + "\xeb\x69\xaf\x16\xb4\x7b\xd7\x23\x6d\x61\x90\xf6\xd6\xd3\x5e\x23" + "\x68\xff\x36\x0e\x69\xd7\x07\x91\x77\x88\x8e\xd6\x21\x68\x3f\x25" + "\xbd\x2a\x0a\x82\x8b\x9e\xf6\x5a\x41\xfb\xc5\x52\xa4\x2d\x0d\x82" + "\x8b\x9e\xf6\xc7\x82\xf6\xb3\x6d\x48\x5b\x16\x04\x13\x3d\xed\x4f" + "\x58\xd4\xfe\x74\xe9\x5b\x37\x05\xd2\xa2\x0e\x38\xd1\x0f\xd1\x9a" + "\x31\xc3\x59\xee\xdf\x07\x95\x08\xbf\xc6\xbf\x71\xa0\xd1\x30\xc5" + "\x7d\x83\xae\x1f\xb8\x8e\xe5\xee\xd1\xfa\xb4\x8a\x40\x7e\x4c\x51" + "\xf5\xb4\x23\x58\xee\x89\x29\x92\x76\x5b\x67\x5a\x93\x9e\x76\x24" + "\xcb\x3d\x54\x25\x69\x2b\x3b\xd3\x5a\x3a\x68\x59\xee\xe1\x55\x48" + "\xf3\x76\xb1\xf4\xab\x3a\x39\xaf\xd7\xf1\x1b\xc5\x72\x1b\xc6\x49" + "\x7e\xce\xce\xfc\xec\x7a\xda\xeb\x59\xee\x37\x36\x49\x5b\xd5\x99" + "\x36\x59\x4f\x7b\x03\xcb\x3d\xa2\xd5\xbf\xba\x33\x6d\x8e\x9e\x36" + "\x9e\xe5\x1e\xdd\x23\x69\x6b\x02\x69\x8b\x45\x1f\xa4\x48\x9c\x12" + "\x58\xee\xb1\xf5\x92\xb6\xde\xaf\x8f\x55\x0c\xdc\xc6\x8a\x05\x5d" + "\x22\x8b\xfa\x87\x43\xe2\xb9\xc7\xaf\x6f\x5d\x61\xe8\x47\x7d\xca" + "\x06\xc2\xf3\xa9\xbb\x4b\x91\xf6\x46\xc9\x6f\x5f\x60\xdf\x27\xe5" + "\x4b\xc2\x7b\xfb\xb5\xfe\x09\xfb\x1d\x57\xb0\x71\x4f\xc6\x8f\xa1" + "\xef\x11\xa3\xdb\x2a\xbe\x49\xa5\xad\xe9\xe5\xe1\xba\xef\x2d\x1b" + "\x6a\x99\xd0\xcc\xdc\xfa\xb4\x3c\x85\xd5\x8f\x6c\x06\x95\xbe\xd7" + "\xc7\x06\x8c\x4f\x71\x61\x7a\xd3\xb0\xa1\xae\x96\x5c\xb7\xdd\x65" + "\x60\x7c\xcd\x01\x3c\x1f\xee\x82\x8d\x63\xe8\x3c\x6f\x05\xad\x39" + "\x92\x6c\xf0\x14\xb4\xbb\x68\x8d\x92\x12\xbc\xce\xc5\x9d\xaf\x07" + "\x92\x81\x63\xe0\xa7\x20\xd9\xb9\xd0\x0d\x87\x33\x41\x11\x6b\xd5" + "\xb9\x9f\x60\x73\xd3\x47\xa3\x2c\x39\x58\xee\xb4\x83\x78\xcd\x65" + "\xa1\xf5\x80\xf2\xdb\xdd\xce\x79\xf4\x4d\x3b\xf7\xee\xa6\x01\x93" + "\x73\xd8\x93\xbf\xfa\x3a\x23\x0b\xae\x44\xf9\x6b\xb4\xef\x57\xf1" + "\x6f\x56\x9d\x48\xbf\x45\x7c\xaf\xca\x33\xd3\x1b\xdd\xee\x0e\xfc" + "\x5e\x95\x28\xc7\x33\xe9\x14\xfa\x2b\x56\x3a\xd5\x25\xbe\x87\xe5" + "\x79\x9e\xd7\x6f\x05\xab\x67\xb1\x43\x5a\xbd\x6d\x2b\x73\x68\x6d" + "\x39\x67\xd6\x11\x38\x28\xef\x11\x7f\xc9\x77\x18\xf1\x23\xbe\x1a" + "\x4f\xca\xd7\x74\xd5\x54\x17\xb5\x07\x7b\x09\xf3\x87\xfc\xfd\x2b" + "\x8f\x55\x7c\xff\xca\x93\xe6\x32\x8c\x5b\x29\xbe\x7f\x25\xeb\x13" + "\x32\x0f\xb7\x93\x78\x04\xff\xd6\x2f\x98\xd9\xb3\x6e\x1b\xf2\x77" + "\xe2\xf8\xb7\x46\xe0\xe3\xa9\x71\x19\x6e\x95\x58\x79\xf6\xb9\x0c" + "\x3f\xb3\xcb\xf3\x43\x2e\xc3\xa9\x31\xf2\xbc\x49\xfb\x06\x59\x50" + "\xbe\x96\xf6\x46\x1c\x4b\xa9\xde\x17\x53\x4d\x34\x5e\x17\xdf\x42" + "\x6d\x6f\xb4\x0f\xa6\x6f\x44\x7b\x17\x60\x99\xaa\x68\x2b\xef\x78" + "\x3c\x9a\xe5\xb1\x49\x1e\x19\xd1\x70\x9d\xb3\xde\x99\xc9\xf2\x13" + "\x2b\xc5\xfa\x30\xde\xe9\x94\xc6\xb1\x45\xfc\x59\x74\x62\x25\xe7" + "\xbb\x76\x72\x8e\x5e\x86\xb8\x51\xd7\xdf\x10\x9f\x90\x78\x63\xd2" + "\x4d\x53\x1f\x7c\x68\xda\xf4\x19\x0f\xa7\xcf\x7c\xe4\xd1\x59\xb3" + "\xe7\xcc\xcd\x78\x6c\xde\xfc\x05\x8f\x2f\x5c\x94\xf9\xc4\x62\xfa" + "\xd1\x59\x87\xac\x2f\x8e\x31\x34\x2b\x80\x58\xde\x46\x65\xf0\xef" + "\xfc\x52\x9a\xc0\xdd\x5b\xa5\xda\x83\xcf\x09\xea\x6c\x00\xb4\xee" + "\x47\xa3\x91\x5d\x45\xeb\x90\xa0\x0e\x1a\xea\x8a\xc6\x3a\x69\x0d" + "\xb6\x43\x46\x66\xad\x6d\x1a\xeb\xa4\xf5\xfd\x76\xd8\x1a\x20\x76" + "\x08\xad\xd3\xc6\x80\xee\x97\x5c\x0d\x50\x85\x79\x83\xf1\x1c\x62" + "\x01\xdb\x73\x31\xac\xa9\x30\x86\x35\x12\xff\xc2\x75\xac\xa1\x69" + "\x49\x3a\xe4\xe2\x35\xea\xa5\xe5\xb0\x91\xed\xdd\x81\x23\x7f\xef" + "\x0a\x18\x54\xbc\x8e\x1d\x5a\x19\xc3\x0e\x3d\xb9\x8e\x35\x96\xc4" + "\x30\x57\x6c\x21\x44\xb4\xe4\xb2\x55\x2e\xa3\x97\xaf\x3d\x94\x87" + "\xf7\xbd\x51\xde\x9c\x3c\xbc\x37\xd2\x0d\xc6\x12\xbc\xc6\xb4\xe6" + "\x1d\x76\x21\xf7\x6b\x27\x5b\xc3\x90\xdf\x2c\xd6\x3e\xcb\x90\x8b" + "\xe5\x08\x3c\xd8\xe9\x2a\x1c\x45\x60\x79\x4d\x75\xad\x07\xc1\x65" + "\x64\xad\xb4\x46\x12\x96\x67\xae\x5b\xdf\x08\xc4\x6f\xf3\xbc\xd6" + "\xb0\xf9\x97\x31\x37\xd2\xee\xf3\x2e\x99\x65\x40\x9a\x6d\xc8\xbb" + "\x59\x5f\x1f\xc7\x8c\xd9\x0b\xec\x73\x1e\x9f\x35\xeb\xda\x70\x70" + "\xf0\xa3\xdf\xfa\x80\x0b\x90\x1f\x3c\xb7\x8e\x55\x61\x3d\x9d\x58" + "\xdf\xea\xdd\x38\xfb\x40\xdd\x00\xac\x53\xfe\x61\x15\xc6\x63\xfa" + "\xdb\x78\xfe\x36\xca\x5e\xcd\xd7\x23\x53\xa3\x9f\x60\x05\xa0\xa2" + "\x9c\xd4\x5f\xd1\xf7\x04\xe1\xd4\xa2\x49\x06\xac\x77\x21\xd2\x55" + "\xdb\x2f\x83\x61\x98\x6f\x2f\xca\x51\x86\xe7\x44\xbf\x9c\x70\x44" + "\xfa\x2a\x5e\x2f\x35\x7a\x26\x5d\x63\x5b\x39\x37\xc4\xb0\xd5\x2d" + "\x05\x50\x41\xdf\x6f\xe5\x6b\xc9\xe0\x35\xb6\x4b\x35\xd2\xe6\x9f" + "\xca\x9e\x64\xa0\x75\x31\x4b\x7c\x3c\x73\x48\x26\x92\x83\xe6\xc2" + "\x1f\xe1\x68\xd2\xdb\x9e\x0a\xd7\xb5\x82\xe1\xa3\x43\x00\x45\xeb" + "\x58\x29\xee\x45\xb8\xaf\xdf\x85\xf7\x3e\xc4\xbd\x1a\xd3\x6b\xf0" + "\xb8\x0b\x8f\x1f\x1e\xe2\xcf\x56\x6d\x24\xf7\xfc\xa5\xac\x61\xe4" + "\x7a\x18\xca\xd7\xdd\xcc\x82\xff\x3c\xa8\x5a\xea\x49\x76\xfa\x56" + "\x33\xeb\x67\x18\xe3\xf7\x4d\x59\x55\xa9\x04\xbc\x8f\xc7\x1a\x71" + "\xd4\xef\x46\x2b\xee\xf1\xf2\x7c\x29\xd2\x94\xc9\xf3\x7c\xdc\x8b" + "\xce\xbe\x07\xf2\xeb\x6a\x57\x4d\xa1\xd3\x86\xb2\x47\x8f\x09\x8d" + "\x2e\xcc\x09\xaa\xc9\x86\xfb\x44\xff\x74\x93\x43\xa4\x45\x34\x8b" + "\xeb\x48\x90\xc7\xe1\xb8\x63\x3b\x45\x21\xff\xa8\x74\x91\x16\xb5" + "\x00\x8f\x6f\xe3\x5e\xed\x5f\x7e\x34\xe6\x8f\x9e\x42\x78\xb6\x63" + "\x5f\x40\x58\xba\x54\x83\x95\x30\xca\x13\xba\x65\xa0\xf7\x27\x30" + "\xcd\x82\xba\x55\xe4\xd3\x1f\x63\x98\xbf\xfe\x28\x4d\x01\xfa\x93" + "\x4f\xbe\xc8\xa5\xc2\x94\x12\xa1\x2f\x6f\x9f\x5a\x32\x0d\xaf\x95" + "\x66\xe4\xf3\xb6\xfd\x7e\xce\x83\xcf\x2f\xf2\x8e\xe0\x3c\x18\xa5" + "\x24\xff\xd2\xa8\x1a\x6f\x27\x9d\xa5\xb2\x65\xb9\x42\x16\x94\x0f" + "\xd3\x4a\x49\xbe\xb9\xc8\x17\xaf\xcb\x90\xae\xb4\x0e\x4e\x6a\xb2" + "\xf1\x3c\xcf\x3c\x82\xfa\x28\xe5\x25\x9e\x94\x8f\xf9\xea\x65\xa1" + "\x3c\xb2\xec\xd3\x98\x4e\xf3\x6b\xc8\xfe\x06\x8c\x75\x6e\x17\x90" + "\x4e\xd2\xb1\xce\x1d\x87\xb6\x94\x02\x5e\xea\x07\x6d\x40\xdf\xfb" + "\xef\x73\x50\x35\xee\x1f\xb1\x14\xe2\x88\x1f\xf9\x6f\x97\x6a\x2c" + "\x2d\x21\x5b\x14\xbc\xc4\xfa\x7f\xc8\x7f\x17\xce\x68\xe8\x58\x4c" + "\xf2\xe0\x7d\x5d\xb9\x85\x34\x6f\xce\x5b\x2c\xea\x8a\x65\x95\x61" + "\xfe\x0a\xaa\x3b\xb5\x27\xde\xaf\x3c\xac\xaa\x49\x74\x8f\xd6\x6b" + "\x91\xf5\x29\xa3\xdf\x7a\x50\x7b\x10\x3d\xad\x69\xc9\xbf\x51\xab" + "\xc2\x7d\xbc\xdd\x30\x3f\xe1\xc1\xb0\x0c\xe2\x91\xed\x66\x6e\x86" + "\xfe\xe8\xf7\x8b\x5b\xd5\xc3\x6a\xd8\x16\x7f\x7c\xd4\x7c\x3d\x3e" + "\x98\xaf\x02\xf3\x57\x51\x9f\x4c\xfe\x04\xcb\x34\xd3\x78\x03\xd3" + "\xf2\xbd\xb9\xc8\x63\x61\x2b\x8f\x2b\x21\x9f\xdf\xa2\x2c\xf9\xc4" + "\x07\xe5\xa9\x92\xbc\xf6\xd3\xf7\x2b\xf5\x58\x4b\x7e\x65\x84\x39" + "\xb7\xe7\xc5\xbc\x4e\xe8\xbb\xc2\x1e\x2b\x16\xf7\x2a\x91\xa6\x92" + "\xb5\xa7\x00\x5b\x92\x2a\xd6\x5e\x13\xf7\xb6\x65\x9f\xe6\xf8\x56" + "\x09\xbf\x16\xf6\xec\xfc\x65\xac\xc1\x27\x77\x58\x8a\xf6\x9d\x76" + "\x29\xf7\x36\x2a\x8f\x2d\x9a\xc2\xfb\x50\x2a\x83\xf2\x4b\x7e\xb1" + "\xc4\x4f\x6b\xab\x11\x28\x87\x68\x2f\x35\x15\xd3\xcb\x48\x17\x79" + "\xbb\xa1\x1f\x3d\x95\x4d\xba\x18\x36\x0e\xf3\xbf\x9d\x4b\xd7\x8b" + "\xe8\x5a\x75\x71\x1f\xdb\x71\x5f\x2d\xa4\xfb\x14\x97\xc8\x7b\x14" + "\x75\xc9\x0b\x30\xd4\x0a\x71\xcd\x2b\x78\xdd\xca\x9b\x97\x8c\x31" + "\xec\x70\x03\x90\x9c\xd8\x46\x95\x28\x6b\x33\xfa\xfe\x78\x92\x15" + "\xfd\xf5\x36\xf6\xfb\x54\x20\x99\xd1\x9f\x49\xf9\x7a\x4d\x97\xd8" + "\x6f\xa3\x3a\x52\x7b\x8e\x10\xbe\x0f\xef\x99\xfa\x90\xec\xbe\x7a" + "\xf7\x4a\xd6\xb7\x31\xaf\x37\xe2\x40\x78\x11\x2e\x3a\x9e\xa4\x2b" + "\xf9\xc8\xab\x5c\x5c\x0b\xdd\xa0\xb6\xce\x8f\x61\x35\x44\xef\xa3" + "\xed\xcd\xc7\x86\x59\x58\xf6\xc8\x0c\xbe\xde\x9b\x81\xbe\xb5\x8f" + "\x7c\xcb\x69\xbd\x52\xe4\xc1\xc7\x0f\x48\xb7\x9b\xf4\x11\xaf\x6b" + "\x64\x19\x35\xd8\x9f\x0f\xc7\x7d\xb4\xcf\xfe\x7b\xbf\xe3\xaf\x5f" + "\xbd\x02\xed\x9f\xf0\xce\xf7\x66\xa7\x80\x5c\x57\xd9\x7e\x5c\xed" + "\x7d\x8f\xec\x3b\x24\xd6\xbd\x5f\xdd\x81\xf6\xe2\xe3\xd1\x3b\x3e" + "\x00\xeb\x4a\xae\x8f\x8b\xc6\x19\xa8\xce\x98\xb7\x52\xf2\xe1\x75" + "\xe6\xfa\xb4\x82\xeb\x40\x0d\x5b\x84\xf5\xec\xd0\x83\x5e\xf9\x12" + "\xe7\x9a\x80\x36\x91\xb2\x2b\xfb\x69\xdd\x2f\xf2\x49\x38\xfe\xbd" + "\xa5\xa5\xdd\xe7\x97\x08\x7b\x2f\xc7\xbe\x77\x52\x89\xe8\x6f\xa5" + "\xdf\xea\x25\xee\xc7\xf8\xe9\x30\xc9\x32\x9b\xeb\x2f\xc9\x92\x3d" + "\x85\x64\xa9\xe4\x72\x64\xdb\x01\xef\xf1\xdf\xe4\x21\xaf\x0c\x69" + "\xaf\x1a\xaf\x31\xc4\xeb\x49\xf4\x55\x24\x13\x96\x5d\xcf\xfd\xdf" + "\xcf\xb9\x1e\xdc\x2e\x65\xaf\x6e\x5d\x41\x79\x8d\x49\xa7\x15\x9e" + "\xb7\x1a\xe9\xca\x5b\xc5\xba\x09\xe1\x98\x7f\x93\xfd\x41\xa2\x8f" + "\x28\x23\x1f\x6d\xbf\x97\x9f\xaf\xb1\x4f\x46\x5d\x3d\x82\xde\x3f" + "\x1d\x4c\xa4\xa3\x9a\x5e\x34\xaa\x11\xcb\x70\x8c\x41\x78\x95\xe3" + "\x18\x69\x13\xb5\x37\xe9\x32\x8e\x91\xe2\x5b\x0a\x4c\xe5\x9a\xde" + "\x62\x39\x45\xd4\xf6\x02\x1f\xd3\x37\xa8\xc7\x95\x3e\xdd\x32\x7d" + "\x23\xdb\x71\x13\xb6\xa3\x09\xcb\x7b\x4c\xd6\x6b\x13\xd2\x5b\xf0" + "\x7a\xaa\x94\x5d\x7c\x2b\x58\xed\x13\xa9\xe1\x20\x6d\xb5\x26\x97" + "\xfc\x2f\xc7\xa0\x4f\x99\xcc\x5b\x26\xca\xea\xf3\x92\x46\x4b\x63" + "\x44\xbe\x06\x1a\xa6\x91\x1f\x1c\x89\xd8\x73\xdf\x47\x6b\xf9\xca" + "\x34\xb2\x1d\x51\x46\xc4\x78\xae\x87\x38\xee\xf1\xe9\x51\x9f\xa5" + "\x01\xfe\x89\x7c\x71\x7e\xed\x4a\xb1\xc6\x04\xe9\x12\xf9\x54\x9a" + "\xab\x20\xbf\x49\xd2\x7e\x34\x99\xbf\xf6\xd7\x95\x88\x9b\x50\x57" + "\xae\xd3\xf1\xde\x17\xac\x9f\x2b\x11\x3e\xb0\x48\xe4\x09\xbf\x56" + "\xd6\xad\x5c\xd4\x4d\x5e\x53\xbb\x65\x51\xbb\xf5\x3d\xa6\x6b\x47" + "\x6c\xb7\xbe\xf7\x48\xfa\x4a\xf2\xe5\x3e\x7b\x0d\x5f\xab\xd9\x72" + "\x67\x7f\xd1\xf7\x17\x64\x0f\x3e\xb9\xc2\x33\x02\xfc\x45\x65\x70" + "\x7f\x11\x9e\x2c\xeb\x5b\x1a\x60\x1b\x65\x42\x76\xd9\xb7\x20\x0e" + "\xb5\xcd\x72\xad\x0f\x4c\x23\xff\x49\x65\xeb\xfb\xa0\x62\xd1\xae" + "\xd2\x96\xfb\x26\x74\xc6\xa1\xaf\xaa\xb7\x67\xc2\x9a\x7c\x02\xf1" + "\x20\x4c\xf9\xb8\x12\xd3\x04\xae\xe1\xfb\xc9\x37\xe8\x7d\x34\xd2" + "\x16\x7a\x19\xd9\x4b\x5f\x93\xbf\x2d\x86\x2f\x90\xb6\xa8\x95\xfd" + "\x29\x62\x14\xa7\x2b\x77\x69\x40\xb9\x84\x4d\x15\xff\x96\x33\xaf" + "\x63\xdf\x9d\x5a\x9f\x46\xf4\x98\x37\x13\xf3\x54\x04\xf4\x8f\xf9" + "\x24\x1f\x96\xe5\xe0\x3e\x6b\x1d\xf7\x15\x99\x2d\x42\x9e\x6d\x25" + "\xb2\x9f\xc0\xb4\x38\x99\x96\x23\xfb\x12\x4d\x6f\x86\xf9\xcb\x14" + "\x61\x09\x3e\x3e\x0a\x77\x68\xe3\x23\xce\x8b\xfb\xa2\x08\xab\xac" + "\x1f\xa5\x5d\x27\xd2\xfa\xec\xa7\xb4\x5c\xd1\x0e\x85\x8c\xf7\x57" + "\x7d\x72\x64\x7f\x45\xf6\xa5\xb8\x54\x53\x13\xd9\x18\x5d\x23\x0f" + "\x5a\x7f\xdd\x50\x97\xd3\x46\x73\x88\xf5\x78\x6f\x35\xf9\x03\xf2" + "\x17\xf6\x19\xc2\x6f\xd8\xef\xe4\xc7\x37\xc8\xef\xd0\x38\x84\xee" + "\x23\xdd\x52\xf2\x45\x98\xfe\x21\xad\xc9\xc9\x8e\x9a\x90\x6f\x44" + "\xb9\xcc\x7b\x80\x8f\x15\x8e\xa6\x18\xb5\x34\x2d\x1f\xfa\x86\x35" + "\x94\x8f\xf2\x6b\xfe\x8b\x7c\x97\x9b\x7c\x13\x2f\x2f\xf2\x2a\xa9" + "\xe3\x7c\xde\xa0\x8d\x8b\xda\x15\x1d\x2d\xad\x7f\xc0\x7d\x5a\xe4" + "\x2c\xe1\xcf\x22\xef\xa3\xbc\x1c\x3f\xf4\x95\x59\xa7\xd9\x17\x25" + "\xf3\x40\x2d\x3e\x49\x7e\x11\xa6\x08\x39\x23\x2b\x45\x3d\x22\x97" + "\xf3\x7a\x08\x9f\x9a\x2f\x64\x81\x29\xc5\x6d\xfc\xde\x06\xaa\x0b" + "\xdd\xcb\xd3\xdd\xa3\x35\x48\xf0\x1e\xff\x96\x77\x60\x3e\x6f\x7b" + "\x7a\x27\x7a\x5a\x4f\x17\x7d\xa8\xa9\x78\x9d\xe6\x7b\xa3\x92\xa4" + "\x9c\xdf\x6a\x7e\x17\xdb\x65\x25\xf9\x5e\x7e\x6f\x86\xa4\xb9\x53" + "\x1e\xb9\x7f\x8f\x1a\x26\xda\xd5\xa6\xc8\xf6\x5e\x2d\xea\x11\x75" + "\x13\x9f\x67\x1f\x4d\xc5\xb6\x8d\x1a\xa4\xb5\xad\xfe\x9c\xec\x07" + "\xcb\xa7\xb1\xa4\xf0\x2b\x4b\xf9\x1c\xb6\x88\x68\x48\x26\xd1\x47" + "\x44\x5a\x03\xc7\xd4\x87\x55\xcb\x16\xea\x97\xc4\x58\xd5\xf2\xac" + "\x8c\x0f\x81\x73\xde\xef\xb0\x5f\x88\xda\xaf\xf9\x18\xd6\x92\x02" + "\xf4\x0d\x74\x94\x85\xaf\x33\x41\xdf\xcc\xd7\xd3\x90\x7f\x7a\xad" + "\xcd\x25\x79\x46\x55\x6a\x7e\x83\x7c\x49\x6d\xf3\x41\x39\xa6\x33" + "\xa7\x17\x4b\x5f\x72\x5c\x35\xcf\xf4\x1f\x87\x99\x67\xfa\xfb\x0c" + "\xcb\xb2\x40\x9f\x81\xe3\xe6\x95\x2d\x05\xe6\xd1\x7e\xe3\x00\x4c" + "\x3b\xb3\xef\x30\x5b\xc8\x46\x69\x0d\x24\xee\x9f\xe6\xf1\xb4\x8f" + "\x35\x99\xc9\x6f\x9e\x5a\x22\xe3\x17\xaa\x65\x36\x8d\xd5\x02\xca" + "\x2b\xf7\xf3\x9d\x54\x9e\xc6\x4f\x05\x5a\x47\x07\xdb\xe1\x24\xf1" + "\x5c\x2a\xfd\x7c\xa9\x9f\xaf\x94\x7d\x18\xf9\x49\xff\xbe\x0a\xee" + "\xf3\xef\xab\x2c\xf7\x74\xf6\x91\x16\x47\xe8\x7d\x95\x05\xc8\x6f" + "\x69\x3e\xd2\xdf\x17\x58\x86\x17\xfb\x8d\x65\xcd\xdb\xb4\xb1\xac" + "\xcf\x8f\x9a\xc7\x90\x8f\xc2\xf2\x2b\x65\xd9\x65\x2e\xa3\x77\x93" + "\x56\x36\xea\xd1\xfe\x5a\x3b\xea\x66\x01\x58\xf0\x7c\x95\x1c\x03" + "\x72\xdb\x6c\xa3\xb5\x44\xd4\xc8\x7a\xd4\xbf\x70\xd2\x33\xe7\x9c" + "\x93\x70\xc8\xd7\x57\x54\x9d\x9a\xab\xb5\x6f\x74\x82\x7e\x5c\xb8" + "\x61\x1d\x5b\xd5\x52\x10\x1d\xa1\xaf\xe3\x1a\x4c\xcb\x93\x31\x04" + "\xde\xb6\x9c\x97\xc5\x55\xb2\xce\xbf\x6e\xa2\x1e\xd1\x56\xaa\x07" + "\xcd\x89\xb0\xfc\x3d\x34\xee\xa1\x75\xd0\xd0\x6e\x52\x4b\x3a\x74" + "\x5e\x29\x3f\xbd\x42\x3f\xbe\x82\x6d\xe4\x2b\xe5\xdc\xb3\x1a\xc7" + "\x3b\xf9\xfa\x58\xcc\xf8\x9f\x4d\xb4\x67\xcc\x9b\x39\x67\xc1\x8c" + "\xeb\xed\x33\xe7\xcc\x5c\x30\x73\xea\xac\x99\x8b\xa7\x2e\x98\x39" + "\x77\xce\xf0\xd9\x53\x1f\x9e\xf9\x90\x7d\xd1\xd4\xf9\xf6\xb8\xcc" + "\x61\x99\xe1\xe0\x23\xbd\xd9\x3e\x75\xfe\xfc\xc7\x67\x4f\x9f\x66" + "\x9f\x33\xf3\xa1\xeb\xe6\x4d\x9f\x3f\x7d\x81\x7d\xea\xbc\xb9\x8f" + "\xcf\x99\x66\x1f\x36\x6d\xc4\xb0\xb8\xc4\x69\xe1\xfa\x18\xda\x10" + "\x0b\x34\x7a\xbf\x6b\x68\xc8\xfb\x0e\x4c\x66\x43\xc6\x3c\x73\xe6" + "\xcc\x39\x3c\x66\xa7\xf6\x5b\x36\xb2\x10\xf8\x9a\xe9\xb4\xae\x2d" + "\x2b\x88\xce\xc7\xa3\x4a\x74\x58\x4f\x7b\x09\xad\x9b\x1e\xc3\x06" + "\xb5\x14\xf4\x4b\x76\xa9\x31\x7c\x3d\x6c\x6c\x0b\x3b\xd6\x6d\x10" + "\xfb\xae\xba\x01\xc7\x6c\x19\xf4\xbe\x77\xc9\x77\x60\xcd\x5f\x08" + "\x2a\xee\x11\xb8\x5b\x68\x4d\x75\xcc\xb3\xc0\xa5\xf6\xcf\xe7\x31" + "\x51\xb5\xbf\xb5\x29\x3a\xde\xca\xf2\xe3\xad\x02\x97\xfe\xd1\x5a" + "\x3c\x7a\xc2\xaf\x61\x02\xe9\xe7\x41\xb5\x3f\x5f\x37\xe0\x49\xd4" + "\x65\x8a\xc7\x9e\x7a\xf7\xb6\x64\x1c\x0f\xee\x77\x5e\xc6\xef\x45" + "\x37\x2b\x10\x81\x72\xa9\x3b\x96\xc6\xc1\x73\x58\xd6\x7c\x1b\x63" + "\x58\xc6\x3e\x2d\x9e\x46\xeb\xdc\x63\x5d\xf6\xc9\x7a\xbc\xc5\xeb" + "\xb1\x8e\xc5\x16\xf6\x43\xf9\x0a\x48\x9e\xfe\xaa\x56\x07\x94\x7b" + "\x9f\x4b\xed\x97\x4e\xeb\xdc\x93\x5c\xc1\x62\x7d\x14\xef\x42\x39" + "\xc7\x7b\x17\x62\xbb\x0d\x16\xeb\x28\xe5\x15\x0b\xfb\xc3\xfa\xac" + "\x2c\xc1\xf3\xdc\x93\x10\xb1\x86\xd6\xe2\x5e\x71\x25\xdb\xdd\xec" + "\x86\xba\xf4\x7d\x60\x7e\x82\x35\xb1\x3f\x35\x34\xc8\x3a\x65\x92" + "\x6f\x78\xfd\x91\x7d\x2a\xd5\x09\xfb\x8a\x88\x92\x93\x5d\xc6\x16" + "\xd5\xe7\x62\x58\x33\x7b\x51\x3f\xe6\xea\xff\x05\xb5\x09\x8d\xb7" + "\x4e\x61\x3f\x85\x75\x40\xfd\xea\x6f\x97\x63\xe3\x66\xd6\x3e\x45" + "\x37\x96\xea\x4f\x7a\xd6\xdc\x05\x6f\x93\xc6\x9b\xd6\xf8\xa6\x3c" + "\x02\x7f\xeb\x78\xcc\xd3\xe4\xe3\x6f\x75\x04\xf2\x27\x9e\x78\xde" + "\xa4\x95\x23\xe6\xe1\x56\x1a\x13\x34\xa1\x2e\x37\x75\x51\x5e\x6c" + "\xc1\x3a\xb6\xa7\x0e\xd3\xf3\x4e\x83\x8a\xb4\x7b\x4a\xd6\x71\xfe" + "\xab\xd0\x86\xf8\x7a\xe0\x4f\xc6\x00\xac\x44\x9a\x53\x05\xfd\xed" + "\x14\xdf\xc5\x7b\x34\x27\xb6\x05\xc6\xac\xa5\x3e\xdf\x1c\xa0\xcf" + "\xc9\x05\x34\x26\x2c\x44\xfe\xa8\x43\x79\xdf\x62\x3f\x8c\xd7\x23" + "\x0a\xc1\x41\xe5\xe0\x79\x3d\xc5\x43\x90\x67\xab\x56\x1e\x43\xfd" + "\xcf\xf5\x8a\x18\x8c\xd4\xad\xe1\x75\x99\x0d\xb4\xce\x02\xdb\x81" + "\xfe\x9d\x64\x24\x1d\x6b\x29\x18\x30\x5c\xd3\x29\xd4\xf5\x3d\x5c" + "\xaf\xac\xe0\x60\x05\xd6\x0a\x5a\xef\x9b\xf4\xaa\x18\xf5\x89\xf4" + "\x0a\x69\x53\x35\x9d\x42\x5d\xab\x27\x3a\x94\x21\xbc\x62\x71\xb2" + "\x4a\x3e\xf2\x90\x3a\x60\x37\xe9\x18\xfb\xaf\x3b\xf6\xb1\x81\xbf" + "\xda\x27\x70\x1a\xb0\xbb\xae\x55\x60\xe0\x6b\xf7\x01\xa5\xba\x76" + "\xaf\x47\x3d\x0e\xa7\x76\xe6\xb1\x6a\xa4\x47\xd9\xea\xf9\x58\x7c" + "\x19\x62\xc0\xfb\xaa\x01\x7c\x1e\x2f\xdb\xb0\xc6\xd7\x86\x03\x1a" + "\x82\xb5\x61\x40\xdb\xa9\xb4\xb3\x82\x01\xcd\x64\x2b\x2d\x05\x31" + "\x83\xb4\x35\xa8\x83\x61\x89\x65\xa8\x6a\x21\x98\xa8\x8c\x2a\x2b" + "\xa7\x1f\xa7\x95\x91\x87\x6d\xdd\x94\x9d\x7e\x46\x7d\xae\x2a\x05" + "\xa0\x98\x38\xe5\x8f\xb5\x52\xfb\xc6\xac\xf6\xe5\x67\xcd\x81\xf9" + "\x87\x3d\xe4\x27\x2b\xdf\x59\x41\x4c\xe9\x73\x72\xed\x6d\xcc\x5f" + "\x73\x26\x79\x63\xed\xa2\x9f\x74\x0e\x21\xfd\x1e\x18\x56\xb7\x1e" + "\x80\xd2\xc4\x75\x4c\xf3\x29\xec\x7b\x02\xe3\xfb\x5d\x3e\x6f\x50" + "\x07\xde\xee\xf7\xbc\x41\x1d\x18\xdf\xd5\xf3\x86\x80\x72\x97\x53" + "\xb9\xde\x92\x49\x06\x5f\xd9\x03\x67\x79\x83\x94\xad\xe5\x1f\x51" + "\xaa\x9f\xcf\x0c\xfc\x98\x64\xa8\xc5\x7e\x8a\x5d\x3e\xc9\xc0\x90" + "\x4f\x15\xef\xc3\x07\xd6\x8b\xf1\x0b\x8d\x8b\x06\x56\x10\x4d\x60" + "\x3d\x3a\x36\x93\x95\xd6\x89\x85\xd3\xfc\x22\xec\xe7\x40\xde\x15" + "\x6e\x4c\xd3\x6e\x2b\x7e\xc4\xc0\x82\x5c\x44\x00\x24\x71\x7a\x86" + "\x9b\x48\x92\xd7\x4d\xfc\x42\xed\xa0\xef\xb8\x7f\x0e\x5b\x1f\x21" + "\x2f\xe7\xd7\x0a\x06\x59\x5e\x8e\x8e\x62\xcc\x19\x72\x33\xd0\xb2" + "\x04\xdb\x28\x32\x90\x33\x29\x0c\xf9\x95\x72\x62\xc6\xdc\x92\xbf" + "\x76\xcd\xf4\xd7\x94\xe2\x7f\x8d\x9b\x71\x8a\xae\x80\x2b\x8d\xd3" + "\xf8\xab\x5b\xff\xb6\xa7\x23\x49\x29\xb5\xe8\x8b\xb4\x40\x4e\x18" + "\x3f\x31\xd3\x9f\x56\xe4\xe7\xc0\xfb\x49\xce\x0e\x82\xfe\xcd\xcb" + "\x75\xe4\x1f\x09\xf1\x6f\xf6\xe3\x71\x8e\xdb\x60\xdd\xf9\x95\xe2" + "\x70\x53\xfd\x79\xe4\x7f\xe6\xcd\x5e\xdf\x47\x3b\xf5\xa9\xc7\xcd" + "\x93\x82\x91\xfa\xda\xff\xe6\x6d\x5a\x92\x5e\x43\x7d\xf7\x6f\x89" + "\xf3\xbf\x4e\x0e\xb8\x7f\xdb\xc4\xf3\x20\x39\x38\xe9\x4f\xb6\x0b" + "\xc7\x28\x3f\x1d\xd4\x91\x68\x0e\x30\x19\x73\x7e\x80\x09\xf9\x36" + "\x29\x8d\x11\xe5\x29\xd3\x25\xab\xc1\xa9\xbf\x9f\xed\xb2\xe5\xd2" + "\x20\xae\x6c\xea\xac\x53\xb7\x06\xa4\xd1\x75\x2f\xbb\x4c\x1b\xf5" + "\x5e\x27\x7a\x9e\x66\xd7\x5d\x1b\x92\xf1\x4f\x29\xc0\xe8\xb4\xf3" + "\x20\xea\xa5\xed\x7f\xe3\x66\x20\xfb\xb8\xb4\x7d\x4f\x1b\x13\xbd" + "\x38\x7a\x22\x7e\xa0\x7f\xac\xc3\x51\x32\x79\x83\xc9\x04\x26\x4f" + "\xce\x4b\x3f\x7e\x69\xbb\xb4\x5d\xda\x2e\x6d\x97\xb6\x4b\xdb\xa5" + "\xed\x22\xd8\x0c\xfa\x89\xb5\x09\xf7\xde\xf2\xa8\x9f\xff\x18\xe4" + "\xae\x4f\x53\xce\x25\x1f\x93\x1b\xe4\x24\x3b\xed\xa5\x69\x2e\x4b" + "\xfe\xc4\xfa\xb8\x8a\x8c\x26\xd3\xaa\x94\x6a\xc7\xa6\xf4\x06\xdb" + "\xfa\xd4\x7d\x49\x95\x99\xad\xea\xca\x31\x55\xb1\x65\xd3\x0e\x59" + "\x0b\x27\xed\x89\xdf\xb6\xa0\x39\x62\xf5\xb8\x9a\xe1\xe5\xb3\x1a" + "\x07\x15\x4d\xd9\x3f\xfa\xed\xa5\x6e\x65\xc5\x6d\xef\x0f\xf9\xdd" + "\x83\x07\xfb\x15\xdc\xf5\xc9\xf5\x5b\xe7\x9d\x0c\x7f\xe6\xff\xec" + "\xfa\xf1\x2b\x8f\x1c\xb9\xec\x85\x7b\x3f\xbb\xf9\x2f\x8b\xdb\x7a" + "\x3d\xf5\xf3\x0f\xae\xfe\xc3\x8c\xc3\x31\xeb\x26\xff\x77\xe2\x9f" + "\x16\x7e\x17\x95\x7b\x67\xed\x88\xcd\x73\x8e\x0f\x2e\xbe\xff\xef" + "\xb7\xbc\x9b\xe5\x35\x2c\xff\xe9\x7b\x57\xfd\x76\xea\x17\xd1\xcf" + "\xfe\xf2\xe3\x51\x5b\x1e\xfb\xa6\xcf\xd3\xbf\xf8\xf0\xda\x97\x67" + "\x7e\xfd\xa3\xe7\xef\xf9\xf4\xa6\x37\x9f\x38\x1d\xf6\xeb\xdb\x77" + "\x0e\x7b\x69\xfa\x97\x03\xd6\xde\xbd\x37\xe1\x8d\xc7\xbf\x8d\x5c" + "\x33\x7e\xf7\x75\xaf\xce\x3e\x76\xc5\x86\xfb\x0e\xfc\xfb\x3b\xcb" + "\x3c\xc6\x27\x7f\xb6\x63\xe8\xef\x1f\xfa\x47\xff\xe7\xfe\xe3\xaf" + "\x37\xbc\x3e\xff\x54\xdf\xdf\xdc\xf1\xd1\x4f\xfe\xf8\xe8\xd1\xcb" + "\x5f\xfc\xd5\xff\xff\xb7\xb7\x96\xb4\xf7\xfe\xbf\x63\xff\xdf\x35" + "\x1b\x1f\xfe\x6a\xe0\x7f\xfd\xe7\xdf\x6e\xfc\xf3\xa2\x16\x73\xde" + "\x84\xba\x91\xaf\xcd\x3d\x71\x65\xc9\x03\x9f\xdf\xba\x3d\x9b\x9d" + "\x4b\xfb\x81\x9a\x7e\xc3\x3f\x13\x37\xdf\xe0\x91\x92\x8b\xf7\xf5" + "\x98\x8f\x62\x90\xf8\x8b\x84\x9c\x04\x30\x98\xa0\x97\xda\x83\x19" + "\x43\x4f\xeb\xdd\xc5\x66\xd7\xe7\x0f\x65\xa3\x78\xc5\x28\xdc\x09" + "\x87\xcb\x79\x8a\x2f\x0a\x10\x1b\x22\x8f\x7f\xde\x66\xc0\x36\x30" + "\xa2\x84\x61\xd0\x0b\x5b\xcd\x04\x7d\x20\x1c\xfa\x42\x04\x44\x42" + "\x14\x98\xc1\x02\xd1\xd0\x0f\xfa\x83\x15\x06\x40\x0c\x0c\x04\x1b" + "\xfc\x08\x2e\xc3\x5a\x0d\x82\x2b\x60\x30\x5c\x89\x8d\x73\x15\x0c" + "\x81\xa1\xc1\xeb\x95\x03\xc9\x36\xfc\x83\xff\x27\xf2\xa8\x4d\x0e" + "\xa4\x5d\x4a\xff\xa7\xa6\x3b\x65\x7a\xbd\x4c\x77\x5d\x4a\xff\xa7" + "\xa6\xdb\xff\xc5\xc7\xab\xfe\xa5\x47\x03\x0e\x23\xc4\x48\xc2\x6f" + "\x3c\xd1\xb1\x05\xa6\x1a\xe4\xd6\x71\x0d\x67\xc9\xdf\x89\x9f\x7f" + "\xfe\xc0\x2d\x19\xf7\x78\x71\x9a\x0d\x20\x9f\x3d\x30\xfd\xe6\x3e" + "\xee\xb7\xad\x33\xbc\xaf\x46\xe7\xd0\x53\x15\x13\x58\xf9\xdf\x10" + "\x36\x7a\xb2\xb8\x63\x25\xee\xf9\xb8\x3f\x87\x7b\x09\xee\x2f\x6b" + "\x45\x81\x61\x88\x0d\x0c\x43\x27\xe2\x71\x1b\x1e\x1b\xc1\x10\x9b" + "\x03\x86\x6b\x50\xf8\x61\x4e\x30\x38\x92\x7d\x95\x19\xe5\xea\x90" + "\xda\x30\x52\xa6\xdb\xf1\x3c\x3e\x3d\xa0\xc0\xee\xf6\x77\xce\xdb" + "\x27\xa5\xd8\x47\x8d\x88\x1f\x91\x90\x60\xbf\xee\x3a\xfb\xf5\x71" + "\xa3\xae\x1f\x19\x17\x3f\xf2\xfa\x51\xf6\xb8\x51\x37\xc7\x27\xdd" + "\x7c\x43\xbc\x7d\xf6\x13\xf3\x66\x8e\x8a\x7b\x78\xba\x7d\xce\xb4" + "\x99\xf3\xed\x33\x66\xce\x9b\xbd\x68\xea\xbc\xe9\xa1\xd4\xbe\x5b" + "\x1b\x56\x07\xae\xf0\x08\x31\xf5\xa8\x19\xe0\x56\x50\xed\x76\x50" + "\xe3\x6d\xd0\x19\x66\x87\xdc\x3b\x6d\xb3\xef\x9d\xfc\xd9\xb0\x5f" + "\x45\xbd\xff\xd3\x87\x87\xfd\xfb\xcf\x7e\x9f\x57\x01\xca\x4d\x2a" + "\x28\x71\xd5\xa0\x5c\x5d\x05\xca\xe5\x29\xa0\x44\x4d\x02\x65\xde" + "\x26\x50\x1e\x99\x08\x4a\x5a\x1c\x28\x93\xd6\x83\x32\x76\x55\xe7" + "\xb4\xe5\x63\x44\xda\xeb\x49\xa0\x6c\x6a\x06\x65\xc3\x68\x50\xf2" + "\x1a\x44\xda\x87\xb1\xa0\xbc\x5b\x7d\xde\xdb\xe2\xdc\xb7\xee\xea" + "\x81\xe1\x7f\x00\xd9\x9e\x18\xe5" ; diff --git a/sys/dev/mxge/rss_ethp_z8e.h b/sys/dev/mxge/rss_ethp_z8e.h index 34b0e9e42e9..3cec65fa23d 100644 --- a/sys/dev/mxge/rss_ethp_z8e.h +++ b/sys/dev/mxge/rss_ethp_z8e.h @@ -1,6 +1,6 @@ /******************************************************************************* -Copyright (c) 2006-2011, Myricom Inc. +Copyright (c) 2006-2012, Myricom Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -28,9944 +28,9560 @@ POSSIBILITY OF SUCH DAMAGE. $FreeBSD$ ***************************************************************************/ -static unsigned int rss_ethp_z8e_uncompressed_length = 571764 ; -static unsigned int rss_ethp_z8e_length = 158985 ; -static unsigned char rss_ethp_z8e[158985 + 1] = - "\x78\x9c\xec\xbd\x71\x7c\x94\xc5\xb5\x37\x7e\xb2\x59\x20\x62\x60" - "\x37\x31\xe2\x96\x62\x5d\x34\x81\x68\x03\x44\x1b\x2c\x52\xc0\x20" - "\xa0\xc1\x06\x88\x82\x6d\x54\x34\x41\x81\x06\x8d\xb0\x40\x84\x00" - "\x21\xbb\x2c\x68\xb1\x02\xd9\x44\x84\x28\x21\x49\xaf\xd8\xd2\x96" - "\x6a\xac\x78\x8b\xb7\xa8\x6b\x89\xbf\x1f\xed\x4d\xb2\x69\x5f\x7a" - "\xdf\xdc\xfe\xf0\x76\xe5\x46\x9a\xf2\x06\xd8\x92\x85\xac\x64\x77" - "\xe7\xfd\x9e\x99\xe7\x49\x76\x97\x0d\xca\xbd\xf7\xf3\xf9\xfd\xd3" - "\x7c\x3e\x9b\xe7\x79\xe6\x99\x39\x73\xe6\xcc\x39\x67\xce\xcc\x9c" - "\x39\x0f\xd1\xb5\xff\x79\x29\x89\x2f\x09\x64\xfc\x4e\xe1\xc7\xff" - "\x85\xf2\xff\xf8\xfb\xc7\xdf\x3f\xfe\xfe\xf1\xf7\x8f\xbf\x7f\xfc" - "\xfd\xe3\xef\xff\xdf\x3f\x5f\x02\xe5\x5c\x30\x18\xe9\xb7\x2e\xa2" - "\x5e\x67\xd2\x18\x2f\x85\x4b\xf7\xbe\x22\x82\x78\x95\x80\x71\x7e" - "\x0c\x5f\xf9\x57\x83\x34\x83\x8b\x92\x6e\x35\x93\x59\xec\xb5\x18" - "\x66\xed\x27\xda\x3d\x4a\x74\xbf\xb2\x47\xf8\x9a\x2b\x88\x8e\x1d" - "\xc0\xf3\x1e\xd1\xf5\xca\x28\xe1\x07\x9c\x62\x2f\x15\xed\x66\x38" - "\x5b\xf1\xbc\x15\xe9\x48\x2b\xf3\x52\xf1\x36\x4e\xab\x42\x39\x3d" - "\xdd\xb3\xed\x12\x35\x5b\x83\x54\xc5\x70\xac\x21\x9a\x3d\x56\xe2" - "\xd1\x88\xbc\xc9\x9c\x77\xcb\x28\xd4\x9b\x46\xe4\xdc\x23\x02\x11" - "\x38\x24\x71\x3d\x5c\xb7\x96\xbf\x3d\xa6\x3e\x1f\xd2\x3a\xf5\xfa" - "\x06\x81\x61\xe6\xf2\xdc\x06\xeb\x37\x28\xf1\x34\x5d\x7f\x23\xc3" - "\x64\xdc\x84\x93\x92\x3c\x97\x83\x74\x9a\xae\xcb\xec\x71\x52\xe2" - "\x31\x50\x63\xd7\x1e\x99\x9e\xe8\xf1\x07\xc9\x5a\x49\x09\x78\x37" - "\x0f\x57\x03\xca\x8d\x60\xfa\x2c\xac\xa3\x74\xae\x1b\x70\x8d\xc2" - "\xe0\x4e\x68\x48\x25\x62\x1a\xf9\x0d\x34\xde\xef\xa4\x84\x5e\xe7" - "\x75\x68\x7f\x52\xa6\x6c\x3f\xea\x45\x59\xe3\x69\x1a\xfe\x77\x03" - "\xf2\xa3\x4e\x9f\x75\x23\xe3\x30\xfc\x13\xe1\x74\x1b\x74\x38\x61" - "\xa7\xfb\xfa\xfa\x1a\xa2\x1e\xa7\x61\xae\xdf\x60\x12\x1a\x9c\xa3" - "\x3a\x1c\xce\x87\xba\x92\xb9\xae\x1e\xa7\xb1\x26\x22\x8f\x57\xcf" - "\x03\xbc\x7d\x93\xfc\x94\xc8\x38\x9f\xa2\xe1\x53\xb8\x3e\xad\x2d" - "\x46\xae\xc3\xb3\x2e\x48\x1e\xf4\x3d\xea\x4e\x43\x5b\xad\xc7\x02" - "\x44\x80\x99\xd2\x50\x49\xc4\xf0\x81\xbf\x55\xc1\x1c\x9e\xa3\xc3" - "\x64\x18\xfd\x6d\x75\xba\x53\x1b\x24\x8e\xdc\xd6\x24\xd2\xf2\x16" - "\x47\xe2\xc8\x70\xd1\x96\x9b\xb8\x2d\xcd\xe0\x28\x2d\xcf\xb6\x7e" - "\x7a\xf4\xb7\xff\xfa\xdc\x18\xd8\x16\x05\x3b\x01\xb0\x13\xdc\x5a" - "\xb9\xfe\xf6\x7b\x63\xf2\xab\xbc\xe6\xeb\xfc\x06\xa1\xd1\x61\x78" - "\xd7\x40\xde\xeb\x76\x47\xe6\x05\x3e\x06\x45\x5b\x32\x78\x69\x78" - "\x07\xda\x99\x88\x3c\xf9\xe8\x47\xab\xf6\xfe\x46\xed\xbd\x05\xef" - "\xee\x55\xf0\xae\x9f\x12\x01\xcf\xcc\xf0\x22\x79\x4b\x49\x94\x11" - "\xbf\x21\x30\x90\x87\xe2\x37\x2c\x49\xe7\xb7\xb5\x16\x11\xb6\x7f" - "\x0d\x6d\xaa\x49\x4f\x0a\x3b\x05\x79\xca\x03\x64\x1d\x4d\xf6\x53" - "\x74\x7d\x13\xe0\xd3\xae\x8d\x94\x64\xb7\x89\x80\xa7\xbc\x9b\xda" - "\x7c\xdd\x64\xf7\x41\x36\x82\x17\xa9\xf2\x22\x78\x31\x78\x96\x2a" - "\x57\x93\xa5\xb9\xe2\x73\x8a\xc7\xcb\x61\x83\x20\xfb\x18\x2e\xdb" - "\x49\x6d\x75\x9d\x64\xaf\x8b\x2e\x6b\xbf\x99\x2c\xad\x78\x46\x9f" - "\x9b\x18\x0f\x96\xb7\x60\x6a\x7a\x52\xc5\x6b\x64\xb4\x8f\x25\x43" - "\xeb\x52\xb7\x86\x4b\x72\x39\xe3\xb2\xed\x0c\x25\xbd\xb1\x1c\x7c" - "\x78\x86\xf1\xcd\x4a\x7a\x7b\x63\xc0\x70\xcc\x92\x4f\xc7\x2c\x27" - "\xa9\xd9\x32\x9d\x9a\xcb\x67\xd3\xae\x33\x94\x7c\x2c\x30\x8d\x9a" - "\x8d\xf7\x53\x73\xfa\x6c\xf2\x74\xe3\x1e\xf2\x7b\xcc\xe2\x27\xeb" - "\x3a\xe6\xa7\xe4\x92\xdd\xcf\x50\x92\x57\xc1\x04\xed\x92\xcb\x3e" - "\x2e\x23\x62\xda\xf1\x73\xbc\x76\xac\xfd\x1a\x59\x80\x5f\x17\x70" - "\xb9\x07\xb8\xfc\x32\xdd\x42\xd9\xc0\x79\x98\xa7\x36\x48\xc6\x0a" - "\xba\x6e\x10\x39\x4e\x0b\x83\xf7\x20\xbb\xdd\xf5\xd0\x27\x2c\xbf" - "\x3d\x9b\x0a\xa1\x13\x92\x21\xff\xc9\xdb\x34\x19\xe8\xb6\xff\x98" - "\x8c\x3d\xeb\x0b\x13\x1a\xf6\x88\xce\x5e\xe7\x08\xd2\xdf\x41\x16" - "\x3b\xf1\xbe\x6b\x52\x1a\x99\x3d\xc1\x5c\xfa\xe8\x72\x17\xcb\x63" - "\xf7\x48\x3f\x25\x30\x3c\x53\x39\x64\x67\x1d\x0d\x01\x3e\x7f\x68" - "\x40\xfa\x6d\xc8\x87\xf2\xb9\x5e\x7a\xb5\x9b\xcb\x8b\x9b\x1e\xf7" - "\x87\x6f\x7a\xfc\x62\x78\xef\xe3\x3d\x62\xef\xe3\x17\x42\x7b\x1f" - "\xff\xbb\x7d\x03\x25\x85\x6e\x7a\xdc\xd7\x66\x93\x7d\x60\x6e\xb3" - "\xa1\x0f\x42\x94\xb4\xf9\x2c\x99\x9f\x5c\x8d\xbe\x0f\x7e\x4a\x9b" - "\x57\x90\x25\x9c\x72\x87\xdb\x13\xfc\x13\x3d\x59\x41\x02\xf7\xed" - "\xf1\xda\xd7\x93\x9a\x95\xa7\xcb\x16\xea\x3d\xe2\x35\xde\x26\x69" - "\xe8\x4b\xc9\xc9\xc3\x2f\x1f\xbf\x02\xfc\x16\x89\xd4\xac\x45\xa0" - "\x95\x7d\xe4\x96\x04\xaa\xbf\x4c\x34\x29\x4c\x09\x67\x68\xc4\x09" - "\xe0\x6f\x1e\x84\x6e\x63\xc2\x35\xb6\xdc\xf1\x0e\xaa\xec\xed\x2d" - "\x21\xd6\x85\xac\xff\x58\x1f\xf6\x3a\x47\x5a\x51\x4f\xae\x94\xdf" - "\x3d\xd0\x31\xa9\xb6\x5c\xa4\x77\xf9\x37\x95\x24\xf8\x36\x95\x18" - "\x7a\x52\x6d\xb3\x90\x67\x36\xf2\x94\x6b\x34\xec\x62\x58\x90\x2d" - "\xdf\x88\x20\x25\x02\xa6\xed\xd7\x97\x3a\x8c\xfb\xf7\x88\x93\xc8" - "\x57\xda\x0f\x0b\xb0\x01\x07\xf4\x1f\xe9\xd0\xd3\x40\xeb\xce\x9d" - "\xc8\xc7\xe5\x3d\x81\x5c\x1e\x53\xbc\x9e\xd2\x2e\x32\x05\x69\xb8" - "\xe8\x53\xf5\x21\x4f\x17\xeb\xf4\x11\x01\x1a\xda\xeb\xa4\x02\x86" - "\xcd\xe5\x3c\xdd\x5d\x84\x72\xb3\x84\xbd\xc4\x80\xf4\xf9\xbd\xa2" - "\x24\x61\x1b\xd2\x8f\xa1\xbc\x56\x77\x97\x8e\x23\xd7\xc1\x7d\x2d" - "\xf1\x04\x3f\x1c\x2b\x0d\xd0\x88\x5a\x4a\x44\xb9\x85\x0c\x8f\x61" - "\x81\x0f\xbc\x68\xeb\xac\x63\xa5\x3e\x0a\x8b\x28\x98\x5e\x05\xcf" - "\x34\x25\x0a\x1e\xd2\x05\xe0\x31\xff\x35\xa3\xcc\x88\x46\x09\xef" - "\xe1\x5f\x87\x19\x5e\x80\x8c\x56\x89\xef\xf7\x18\x46\x2f\xeb\x0f" - "\xc0\x74\xaf\xbb\x8f\xba\xc9\xd4\xe8\xb3\x97\x24\xb6\x61\xdc\xe4" - "\xf2\x6f\x57\x76\x0d\x11\x3d\x85\x89\xcc\x73\xfc\xde\x13\xbc\xc0" - "\x79\xb6\x88\x9e\x92\xc4\x11\xdd\xd0\x45\xc8\x83\xf2\xe5\x8c\x67" - "\x64\x5f\x3e\x3c\xe7\x7b\xd3\xe9\x7b\xb3\xe7\xce\x9e\x4e\xf3\x66" - "\xce\x9a\x4e\xd9\xf7\x4c\xc8\xce\xf9\xd6\xb7\xbf\x25\x6f\xbe\xf5" - "\xed\x29\xdf\xa2\x82\xef\x3f\x3c\x9d\x0a\xe6\x4f\xa7\x85\xf8\x15" - "\x2c\x9c\xf3\xf0\xec\x39\x0b\xa7\x53\xe1\xfd\x73\xf1\x34\x6b\xfa" - "\x9d\xd9\x0f\x4c\x28\x98\x35\x77\x0e\x3d\xb4\xe8\xae\xec\xbb\xee" - "\xa2\x99\x73\xf2\xef\xcc\xce\xd6\xae\x77\x66\x73\x96\xc7\xa6\xcc" - "\x59\x38\xa1\x60\xcd\xaa\xb2\x55\x13\xe6\xcf\x9d\xc5\x29\xd0\x6e" - "\x11\x3c\x94\x19\xba\x14\x66\x5a\xfb\xc5\xf9\x3c\x0a\x43\x77\xd4" - "\x83\x07\xf0\xeb\x76\x57\x9e\x82\x0e\x48\x79\xbe\x9e\xfb\x4e\x8e" - "\x01\xa6\xa3\x90\x7b\x63\xaf\xd3\x5c\x01\x1a\x1e\x61\x1a\x5a\x6f" - "\x65\x3d\x71\xd3\xfb\x78\xf7\xb1\x36\xd6\x0c\xc1\xfb\xba\xe8\xf7" - "\x37\x40\x07\x9b\xfe\xdf\x36\x2b\x91\x07\x3f\xd0\xdd\x0f\x5d\x08" - "\xfa\xfa\xa8\xc7\x5e\x38\x04\xfc\x9d\x80\x3a\x3a\x21\x9b\xed\x28" - "\xdb\x11\x21\xf3\x9d\xe8\x9f\x76\x1e\x57\xce\x91\xf9\x9d\xb6\xb2" - "\x5c\xe2\x7e\xf2\x94\x69\x30\x2e\xf6\xc3\x18\x2e\x61\xa0\xef\x01" - "\xe7\x84\x82\x93\x62\x8d\xd0\x0f\x5e\x86\xb3\x0b\xef\x34\x58\x17" - "\xdb\xa0\x27\xa0\xc7\x53\xc3\xf6\x4c\x12\xa9\xe9\xe6\x70\x5f\xa6" - "\x1c\x2b\x51\xae\x30\x82\xaf\xfd\xcd\xe5\xc8\xf7\x46\x5e\x02\xf8" - "\x20\x01\xe3\x2f\xda\x62\x5e\x0a\xfe\xf6\x87\x6a\x72\x1e\x15\xe7" - "\x0b\xd9\x8e\x18\x7a\x9a\x52\xff\x80\xf6\xb5\x84\x6b\x72\x0a\x45" - "\xaf\x4c\x63\xba\x1d\x11\xfc\x9c\x8a\x7c\x7d\xfd\x69\xef\x73\x1a" - "\xf8\x20\x91\xe5\x55\x08\x99\x8e\x31\x33\x75\x03\x74\x5a\x07\xf2" - "\x16\x72\xde\x49\x41\x1a\x06\x5d\x63\xb1\xda\x13\xe8\x14\xa5\x52" - "\x38\x35\xe7\xb1\x88\xfa\x00\x27\x95\x07\x29\xe6\x47\x63\xef\x79" - "\xc0\xe9\x91\xe9\xb0\x63\x52\x9f\x00\xfc\xc7\x59\x57\x2a\xfd\x7d" - "\xd3\xbf\x73\x3e\x6d\x6c\x1e\x78\x86\xac\x2b\x38\x37\xfd\xfb\x31" - "\xd0\x92\xed\x05\xb6\xff\x7a\x9d\xa9\x8b\xbc\x34\xc2\xa7\xc6\xc6" - "\x9b\x3a\x38\x6f\x18\x38\x0a\xf3\x7b\x25\x80\xbb\xd8\xbd\xb1\x9b" - "\x4e\xdb\x78\xac\x4d\x35\x87\xed\x25\x14\x8d\x53\x4a\x0b\xe3\xcf" - "\xfa\x03\xb4\xf8\x13\xf8\xe0\x3a\xc0\x3b\x10\xcd\x07\xa9\x6e\xc0" - "\x79\x14\xf8\x75\xa0\x4d\x8f\x7a\x29\xe5\x78\xb8\xa7\x04\xf5\x92" - "\x01\x72\x05\x7d\x3e\x00\x43\x2b\xdf\x19\x5d\x3e\x65\x3b\x97\x43" - "\xfe\x21\xbd\x3d\x32\xff\x0e\xa6\xb9\xc6\x77\xe0\xcb\x1b\xd2\x62" - "\xf8\x72\x3f\x70\xf9\x8f\x88\xf7\x39\x31\xef\xb7\xe0\xfd\x7f\x6a" - "\xef\x21\xf7\x37\x2c\x8a\xe1\x5b\x1b\xde\xff\x15\xf8\xfa\x21\xd7" - "\xb0\x2d\x52\xf2\xc0\x63\xbe\x88\xfc\xdb\x62\xf2\x37\x22\xff\xff" - "\x61\xbe\xe1\x31\x87\xf3\x37\x68\xb2\x83\xfc\x49\xc8\x7f\x38\xa6" - "\xfe\x25\xc8\xef\x8f\xc0\xef\x44\xf4\xfb\xb4\x3a\xbc\xff\x82\x79" - "\x1d\x36\xd1\x10\xe4\x19\xc6\xba\x84\xf5\xd8\xb1\x52\xee\xaf\x34" - "\x63\x4c\xfe\x74\xe4\x4b\xd6\x68\x64\xd0\x68\x94\xc7\xfd\x88\x3a" - "\x4e\x2a\x1c\xd2\xa6\xc4\x94\x29\x44\x99\x34\xd0\xf1\x51\x9d\x2f" - "\xe3\x94\x29\x8d\x29\xb3\x83\xfb\x51\xa8\x7a\x8c\xbd\x7d\x03\x65" - "\x34\x1d\x19\x09\x83\xdb\x76\x3d\x60\x34\x45\xc3\x18\xd5\x85\x7a" - "\xc7\xec\x54\x7a\xe7\x7a\xf0\xd0\x5d\x48\xfb\x77\xc0\x7c\x82\x65" - "\x00\xb2\xea\xf7\xf8\x02\x24\xec\x79\xc9\x8a\x77\x6f\x4c\x19\x19" - "\x24\xbe\x9f\xc0\xf7\x0c\x5b\xf4\xe6\x6b\x32\x79\x63\x0a\xae\x48" - "\x4f\x63\xfb\x2d\x81\x75\xb0\xe8\xfd\x6e\x58\xc1\xbc\x71\xb2\x30" - "\x90\x01\xcf\x21\xad\x8e\x3f\xe0\x39\x01\xf8\x3f\x86\x31\x87\xc4" - "\x7a\xe4\xdb\x48\xb3\x90\xfe\xb1\x94\x55\x95\x4f\x3e\xab\x3a\xf2" - "\x98\xbf\x73\xf0\xfc\xbe\x56\xfe\x1d\x86\x87\xfb\x3b\xb5\xfb\x84" - "\x10\xc3\x3a\xaf\xcb\xe0\xa8\x9f\xc9\x72\x90\x43\x09\x1f\xe5\xc5" - "\x7a\xf9\x8e\x61\xbe\x8a\xeb\x5c\x5c\xb7\xe0\xfa\x10\xae\x4f\xd8" - "\xbf\x20\x8b\x3d\x24\xe5\x91\x9f\xe7\xe2\xfa\x30\xae\x93\x71\x5d" - "\x88\xeb\x58\x5c\xef\x43\x1b\x42\x2c\x17\x18\x47\x79\x8e\xe5\xc7" - "\xb8\xaa\x78\x8b\xe7\x00\xbd\x79\x4c\x83\x39\xc8\xd3\x25\xe5\x55" - "\xe9\x97\x24\xd5\x8f\x37\x76\xcb\xb4\x54\x99\x36\x4c\xf1\x83\x4a" - "\x0b\xe9\x7a\xe8\xfc\x40\x9a\xa6\x9b\x34\x59\xd4\xd2\x14\xfc\x02" - "\xc0\x77\x33\xae\x42\xc1\x1a\xa2\xfa\x5c\x83\xaf\xca\x19\xe3\xd4" - "\x99\x10\x59\x27\xae\xbb\xed\xe5\x42\xe0\xea\xe0\x3e\xf2\xd2\xa8" - "\x26\x21\xf9\x1e\x63\xac\x82\xb7\x58\xcb\x97\xc3\x34\x96\xe5\x65" - "\x7a\x5a\x7b\x04\x2f\xa5\xf6\x3a\x47\x05\x63\xe4\x28\x1b\xbc\x34" - "\x91\x79\x86\xe9\xce\x6d\x1b\x69\x93\xe3\xb8\x6c\x8b\x84\x7f\x5e" - "\xf1\x64\xbd\x36\x6f\x55\xf2\x7b\xd3\xec\x18\xfd\x22\x79\x36\x46" - "\xde\xbb\x99\xe6\x89\x15\x2c\x07\x37\x61\xfe\xf7\xf6\x18\x69\x33" - "\xd6\xe4\x3c\xc9\xef\xfd\xe8\x63\xae\x37\xd1\xc6\xed\xb8\x69\xb7" - "\xfe\x5e\xbe\x4b\xb1\xb9\x99\xbf\x13\x4b\xe5\xbb\x26\x8c\x47\x47" - "\xf4\x77\x7a\x3d\x89\x65\xf2\x5d\xcb\x00\xdc\xf4\x6c\x0d\x6e\x62" - "\x3c\x9b\x4f\xb8\xd2\xad\x13\x88\x0c\x77\x38\x68\x88\x27\x78\x82" - "\x16\x04\x45\x68\x82\x83\xae\xf3\x04\x0f\xd1\xed\x44\x29\x9e\xe0" - "\x49\xba\x83\x68\xac\x27\xb8\x1b\x36\xc8\x01\x7e\xff\xd1\x78\x4a" - "\x48\xc0\xd5\x3e\xce\x61\x48\xf0\x04\xcb\x28\xdd\x61\xc4\xb5\x94" - "\xee\x1f\x22\x7a\x3d\xc1\x7c\xe4\x5b\x4a\x0b\x42\xe2\xfc\xec\x21" - "\xe2\x2f\x45\x21\x32\xe7\xbf\x20\xec\x9e\x20\xe6\x03\xc1\x16\xa4" - "\x87\xc5\x82\xd0\x17\xf8\xf5\x8a\xb0\x2b\x3d\x7b\x41\xe8\xbc\x98" - "\xf5\xc2\x47\x78\xfe\x8b\x40\x1f\x09\x4f\x70\x1a\xb5\xf9\xfd\xc8" - "\x67\x17\xa2\x3a\xdd\xfa\xe4\x45\x03\xf5\xc1\x86\x08\x57\xa7\x67" - "\xa3\x2d\xb9\x7d\x68\x07\xc6\xd7\x7b\xfb\x36\xe1\x5a\x93\x3e\x43" - "\x3e\xbb\xd2\x0b\x84\x39\x3d\x77\x22\x26\x57\xdc\x06\x4f\xb0\x93" - "\x8a\x30\x3d\x58\xb0\xc1\x27\x18\xff\x91\x5b\x78\x6e\x35\x8d\xd0" - "\x07\xa6\x05\x1b\xec\x02\xef\x92\x44\x4a\x7a\xae\x27\xd8\x4d\xa8" - "\xa3\x00\xf0\xe6\x49\x78\xae\x74\x1b\xf2\xfa\x38\x5f\x24\x1c\x86" - "\xc1\x79\x17\x84\xc8\x84\xfc\xb6\xbe\x94\xf4\x62\xfc\x1c\xf8\x35" - "\xa1\xec\x6f\x85\x33\xed\x63\x81\xf1\x1e\xe5\xdb\xf1\xec\x0d\x40" - "\x86\x25\x2d\x43\x34\x0c\xf9\x61\x3b\xd0\x6c\xf0\x1d\xf0\xcd\x20" - "\x89\x6f\x4d\xba\x08\xa8\x76\x84\xb5\x76\x84\x38\xbd\x07\xb6\x0e" - "\xf2\x58\x7b\xe4\xbb\x8c\x5b\x50\x6e\x91\x2c\xe7\xca\xb0\x0a\x73" - "\x46\x76\x00\xf2\x05\xba\x3a\x98\x8e\xa0\xab\x83\x69\x29\xaa\x33" - "\xac\x9e\xf2\x1d\x24\x52\x32\xb2\xfb\x52\x32\x72\x51\xfe\xe1\x3e" - "\x69\x83\x64\x14\x07\x24\xec\x8c\x22\xc0\x59\x0c\xbe\x4d\x04\x8c" - "\x62\xc0\xb2\xf5\x39\xad\xb4\x60\x83\x08\x2c\x08\x6e\x09\x16\x6d" - "\xa0\xc4\x2c\x72\x00\xdf\x0f\x40\xa3\xa5\x68\x67\x33\xae\xb3\xf1" - "\x9e\x6e\x40\x5d\x1f\x01\x6e\x31\xd7\x87\x7a\x6c\x80\xf9\x1c\x60" - "\x2d\x65\x9c\xbe\x70\x92\x19\xcf\x8e\x2f\x14\x7e\x8d\x61\x57\x86" - "\x3b\x6c\xce\x68\xd2\x79\x88\xf9\x47\xd1\x6d\x37\xcd\xf7\x8b\xa0" - "\x27\xb8\x9f\xc0\x63\xe6\x36\xff\x49\x7e\x8f\xf9\xcf\x21\xf4\x33" - "\xf3\x54\x19\xae\x07\x88\xf9\xa7\xcd\xf6\x02\xe7\xfd\x88\x79\x68" - "\xbe\xcd\xbf\x65\x02\xd9\x12\xf0\x6c\x2f\x0a\x26\xd1\x93\x36\xa3" - "\x23\xe4\xca\x70\xb5\xd9\xb8\x5f\x4e\xa0\x0c\x97\x2b\x25\x53\x02" - "\xe6\x00\x09\x22\x68\x2a\xf7\x19\x47\x94\xd8\x45\x9b\x3f\x1f\x79" - "\x6d\xc4\xed\x61\x3e\xe2\xfc\xf3\xba\x85\x37\x64\x1e\x97\xcb\x6d" - "\x13\x23\x1d\xd4\xda\x3d\x99\x78\x1e\xd6\xda\x7d\x80\xf9\x34\x2c" - "\xcc\xe3\x98\x47\xfb\xe6\x75\x3b\x86\x3c\x79\x91\x12\x90\x16\x6a" - "\x2d\x39\x84\xf7\xcd\xc8\xd7\x22\xf9\x76\xfe\xc5\xa0\x29\x68\xce" - "\x70\x04\x5d\xe3\xac\xf3\x2f\xf6\x89\xd6\x92\xdd\xf4\x44\xb7\x03" - "\xb4\x3a\x44\xf3\xce\x06\x13\xdb\x6c\x4b\x91\xa7\x17\xe9\x07\x24" - "\xff\xcf\x3b\xdb\x23\xe6\xaf\x16\xe7\xe7\x5f\xfc\x8b\x98\x57\x22" - "\x3e\x2a\x2a\xa7\x91\xd7\x6f\x11\x61\x96\x8b\x96\xce\x43\x74\xfd" - "\x49\x2f\xb1\x4c\xe4\x2f\x09\x8b\x79\x67\xcf\x8b\x27\x57\x33\x6d" - "\xa6\x51\x6b\x09\xe4\xa7\x7c\x37\xd3\xbb\xb1\xb5\xe4\x28\xea\x9f" - "\x0d\xb8\x76\xe1\x29\xdf\x8f\xbc\x6e\xd3\x13\x67\xcd\xd4\xd2\xb9" - "\x9b\x82\x29\x19\x8e\x50\x75\x86\x2b\x9c\x92\xd1\x14\xae\xce\x70" - "\x8b\x94\x71\xe6\x60\xf5\x38\x6b\x28\x65\x1c\x78\x60\x9c\x0b\xfd" - "\x74\x1d\xf7\xf9\x65\x27\x59\xf1\xbc\xeb\x32\xf7\xbf\x6b\x5c\x23" - "\xda\xea\x86\xcd\x2b\x14\xef\x8f\x6b\xe4\xb5\x05\x94\x75\xf7\xa5" - "\x8c\x6b\x42\x3e\xb7\x92\xaf\x71\xed\xcc\x97\xc8\x67\x40\x9a\x07" - "\xf3\x9e\x44\xbc\xf7\xe2\xe7\xeb\x4b\x19\x0f\x3b\x77\x7c\x01\xe0" - "\xa7\x48\x9e\x72\x8d\x2f\x10\x33\x5c\xb0\xa1\x2f\x02\xce\x78\xdb" - "\x82\xd0\xbd\x02\x34\x84\x9c\x8c\x2f\x08\x57\x8f\x2f\x16\xa9\xe3" - "\x5d\x01\xc9\xfb\xe3\xab\x18\x76\xdf\xa6\x4c\x5e\x73\x30\xe2\x7d" - "\xa3\xa8\xc9\x4c\x0d\x30\xaf\x9a\x33\xcd\x61\x73\xa6\x4d\xb8\x32" - "\xad\xdf\x7d\x41\xf8\x42\xae\xcc\xdc\xb0\x2b\x33\x3b\x38\x14\xb6" - "\x79\xf9\x51\x62\xfd\x14\xfc\x50\x80\x06\x9f\x80\x1e\x07\x64\xff" - "\x7b\xca\x21\x03\x1b\x46\x3b\x5a\xbb\xc1\x0b\xb6\x5f\x4a\xdd\xd4" - "\xe6\x3f\x21\x69\x2a\x52\x32\xcd\xcc\x53\xdc\xbf\x4f\xda\xc8\x21" - "\xaa\x33\xad\xe1\xea\xcc\xec\x50\x35\xe0\xa6\xa0\x9e\xd4\x3b\x7e" - "\x15\x90\xf2\x7a\x07\xf8\xf5\x28\xca\x7c\x42\x8a\xc7\xef\x68\x1a" - "\x4c\x47\xb2\xae\x62\xfd\xb4\x20\x18\x60\x9e\xf9\x2b\xeb\x35\xa5" - "\xa7\xa8\x48\xd7\x53\xac\xa3\x78\xbe\xc3\x7a\x2a\xac\xe9\xa9\xb0" - "\xa6\xa7\xe4\xb3\x19\xba\xc6\x95\x9e\xcb\xfa\x68\x41\xb9\xd2\x33" - "\x0b\x42\xd9\x02\xbc\x91\x0c\x18\xb9\xaa\x2f\x90\xa7\x26\x7d\x9e" - "\xcc\x2f\xe9\x94\x6e\x0b\x43\xdf\xe0\xe7\x08\x2b\x7d\xe3\xd6\xf4" - "\x8d\x41\xd7\x37\x21\x8c\x6b\x90\xa9\x70\x3c\x7d\x13\xd6\xf4\x4d" - "\x48\x28\x7d\xa3\xe1\x13\xe2\xf4\x90\xa6\x6f\x42\x71\xf4\x0d\xe4" - "\x99\xdb\x9b\xa8\xe9\x19\x07\xeb\x19\x6e\x2f\x78\x2d\x3b\xac\xf4" - "\x4c\x01\xe6\x3a\x06\xd6\x33\x21\x94\x09\xeb\x7a\xa6\x57\x96\xb7" - "\xb1\xae\xe9\x7b\x91\xa0\x3f\xad\xc4\x3a\x46\xea\x93\xe0\xd8\x20" - "\xeb\x13\xd0\xef\xde\x58\x7d\x02\x78\x0e\xdc\x9b\x35\x3d\xd5\x84" - "\x99\x6e\x10\xfa\xc4\xb5\xa0\xdc\x8f\xbe\xfe\x14\x73\x7f\xe8\xed" - "\xf2\x32\x87\xa7\x3c\x48\xd0\x03\x6e\xd1\xe6\x20\xe0\x08\xfe\x0d" - "\x41\x57\x10\x41\x2e\xcd\x41\xc8\x38\x78\xdc\xda\x66\xfb\x13\x85" - "\x20\xab\xf3\xba\x7b\x3c\x4f\xfa\x33\xcd\xf3\xce\x0a\x1f\xe8\xe3" - "\x7d\xd2\xe6\x80\x7e\xc9\xf4\xb5\x76\x7f\x40\xf9\x9d\x22\x9c\x5f" - "\xec\xb5\x42\x06\xac\xf3\x56\xb8\x4d\x4f\xae\x36\x43\xce\x84\x1b" - "\x7a\xf1\x7f\xcd\x3b\x6b\x36\x2d\xee\xa4\x6f\xe4\x2f\x11\xe1\x10" - "\xe4\x0c\xed\x75\xa1\xdd\x8d\xc0\xbd\x09\x32\xe7\x86\x9c\x99\x83" - "\x31\x72\x06\x99\xd9\x85\x7b\xab\xa2\xdf\x38\x37\xe4\xac\x31\x2c" - "\xc7\xb3\x4e\x39\xc7\x44\x3d\x6e\x5e\x8b\x83\xac\x35\x86\xab\x95" - "\xac\x85\x55\xb9\xf6\x30\xd3\xcf\xa0\xc9\x1a\xfa\x02\xef\xbd\xf8" - "\xf9\x20\x3f\xf1\x65\xcd\x16\x21\x6b\xab\x35\x59\x4b\x51\xb2\x86" - "\x3e\x4d\x0c\x6d\x52\xf2\xc6\xf0\x79\x1e\xda\x2f\x6f\xa9\x99\x66" - "\xdc\x27\x28\xde\x91\x32\x87\x71\x25\x33\x17\xf2\x96\x0d\x79\x03" - "\x3c\xe1\x63\xbd\x09\xde\xfc\x0f\x1e\xeb\xe6\xdb\xc4\x7f\x14\x85" - "\x46\x3b\x20\x4f\xb9\xd0\x65\x7f\x81\x1e\xfd\x8f\x27\xfd\xd4\x08" - "\x79\x32\x43\x8e\xac\x90\xa7\x6c\xc8\x15\xcb\x53\x53\x68\x13\xc3" - "\xbc\xa3\xa9\x1f\x86\x1c\x2b\xa3\xe5\x69\xb0\x75\xd0\x5e\xa7\xb5" - "\xc2\x4b\xbf\xb1\xb1\xbd\x82\xfb\xed\x5e\x3a\x3a\x5b\xbb\x87\xfd" - "\xd3\x68\x91\x76\x0c\x64\xd0\x56\x49\x37\x9e\xa1\xb1\x79\xe0\x77" - "\xc2\x7d\x32\xee\xf3\x17\xdc\xfe\x11\xec\x88\xba\x5a\xd4\xdb\xcb" - "\x72\x28\x9c\x39\x6c\x9f\xe5\x82\x0f\x93\x44\x6f\x66\x32\xec\xcb" - "\xd3\xa2\xcf\xc2\x6b\x6d\x26\x3c\x8f\x44\xfb\xd3\x71\x4d\xdd\x7f" - "\x89\xd2\xf0\xb3\xec\x77\x86\x1d\x6c\x3b\xe1\x3e\x5b\xac\xb7\x0c" - "\xdf\xb5\x8e\xb2\x4c\x7e\x4a\x6a\x70\x86\x0b\x4d\x5b\xcc\xbc\xe6" - "\x94\xc6\xf7\xc2\x79\x60\x5a\xc3\x25\x32\xf2\xba\x40\x38\x05\xf5" - "\x95\x9b\x84\x58\x9b\x49\x0d\x6b\xa0\x1f\x9c\x64\x69\x70\x8a\xa6" - "\x50\xaf\x94\x49\xab\x8e\x0b\xe3\x06\x3c\x6f\x06\x9e\x8b\x1f\xd9" - "\x90\x4b\x9f\x94\x53\xdc\xb5\xda\x5e\xe7\xd8\xfe\xf6\x0f\xf2\xbe" - "\x4e\xa7\xc9\x20\xef\x8f\xea\x74\x1a\x64\x5d\xcf\xc8\x63\x74\x68" - "\x9d\xf0\x55\x3d\x43\x4c\x0b\x8b\x3d\x28\xfe\x13\x74\x74\x54\x86" - "\xe8\xe6\x05\x1b\x6e\x11\x9e\x6e\x01\xfe\x3c\x4b\x0d\x78\x5f\x59" - "\x21\xc2\xe1\x94\x9c\xe3\xa2\x3a\xa7\xb9\x67\x9d\x08\xf2\x5a\x4e" - "\xaf\xf3\x56\xab\x97\xbe\xe3\x56\x7d\x91\xd1\x28\xe7\x90\xe6\x9c" - "\x66\xc0\x4a\x61\x58\xad\x28\x1f\xaa\xce\x69\x41\xbe\x3c\x2f\xfd" - "\xae\x50\xe6\x33\x67\x34\xda\x36\xd2\xd7\xcf\xd0\xad\x92\xc6\xc2" - "\x95\x73\x92\xf5\x01\xd2\xcc\x48\xdb\x01\xf8\x5e\xe4\x2f\xf7\xd2" - "\x7b\xbb\x95\x1d\x7b\xeb\x0e\x3d\x1f\xee\x8b\xf9\x3e\x8a\x7f\x12" - "\xe4\x62\x3a\x60\x59\x07\x36\xab\x12\xb4\xe5\x75\xfd\xcf\x8c\x5f" - "\x6e\xfc\xd7\x03\xfa\x7c\x9c\x15\xb6\x16\xd9\x37\xd3\x18\xf4\x0f" - "\xf0\xbb\x2d\x01\xf3\x88\xd3\xc2\x79\x6b\xed\x1b\x1b\x03\x98\x27" - "\xdc\x96\xec\xa5\x97\x9b\x07\xa3\xa7\x60\x5b\xe7\x92\xe8\xaa\x5a" - "\xd7\x4f\xcb\xcf\x16\x6c\x08\x0b\xbe\x67\x7d\xd4\x80\x74\xa6\x1b" - "\xe0\x2c\xd2\x69\x36\x78\xbf\xe4\x74\xa8\x39\xe7\x6d\x87\x85\x53" - "\x90\xfb\x1b\xbc\xc7\x74\xdb\x7b\x8a\x0e\xe3\x9a\x7a\xa0\x47\x78" - "\x9d\x18\x73\x33\xff\x5a\x8b\x08\x00\xe6\x41\x2f\x65\x65\x6b\xeb" - "\x50\x7e\x4f\x70\x0e\xeb\x96\xb8\xe3\x16\xef\x89\x0d\xc0\x4f\x3f" - "\xd1\x36\x06\x7a\x48\xea\xa6\xd5\xc6\x4a\x85\x77\x80\xe1\xba\x2b" - "\x2f\x50\x27\xde\xaf\xf5\x8b\x2e\xe1\xb2\x05\x78\x1e\xe1\x5e\x77" - "\x99\xd3\xfe\x04\xde\x16\xee\x35\x8c\x53\xfa\x9f\xdc\xdf\xb8\x4c" - "\xa7\xcb\x29\xb1\xa1\x7f\xfd\x27\xdd\xcd\xeb\x3d\x6a\x9d\x2b\x3d" - "\xd7\x4b\x13\x02\x3a\x5e\x6c\x63\x80\xbe\x4c\xeb\x46\xb6\x35\x78" - "\xef\x61\x6d\x85\x08\xb0\xcd\x81\xbc\xa5\x7a\x1b\xb8\x7d\xaa\x5d" - "\xe9\x8e\xc8\x76\xf1\x1e\x95\xa9\x42\xd1\x60\xed\x06\x4a\xb2\x2a" - "\x5a\x27\x71\x7b\xb9\x2d\xdc\x66\xd9\x16\xa9\x63\x31\x46\x04\x27" - "\x63\x3e\x26\xd3\xdd\x80\x85\xf9\x4f\x96\xc6\x53\xe9\xb9\xb1\x7c" - "\xd4\xdf\x8f\xe6\x0c\x1b\xe6\xa0\xdf\xb0\x87\xc5\xa9\xd3\x94\xf1" - "\xa8\x5a\x3b\xcb\x78\x34\xcc\x76\x76\x80\xf9\x77\xaa\x9b\xc7\x64" - "\x4f\x05\xeb\x5b\x99\xf7\x06\xe4\xed\x44\x9e\xb9\x5a\xde\xb9\x6a" - "\xcf\x4e\x5e\x87\xf1\x15\xe3\xd8\x73\x5e\xca\x28\xf6\xc9\xf1\xde" - "\xe6\xd6\x9f\x31\x77\xc7\xfc\x2f\xc3\x22\xaa\xa7\xba\xe3\xe3\x92" - "\x69\xe3\xf1\x2c\x74\x49\x74\xa3\x9e\x9b\x98\xa7\xec\x1b\xe8\x6b" - "\xe0\xcb\xcf\x2a\x37\xd3\x0d\xcc\x4f\x22\x25\xa7\x53\xd1\x3d\xe3" - "\x90\x70\xc2\xf6\x84\x46\xb5\xad\xa3\xaf\x43\x8e\x4e\x9e\xa1\x8c" - "\x8f\x8b\x2a\xac\xc0\x95\xa8\xea\x1c\x91\xd4\x41\x29\x39\x5e\x4f" - "\xf0\x73\x6a\x38\xc7\x6b\x3b\x19\x5e\x9d\x17\x71\xdf\x7d\x35\x7d" - "\x01\xba\xfa\xd4\xda\xc3\xb8\x47\x79\x9f\xe1\x14\x8d\x9b\xcd\xed" - "\x55\x7b\x9c\xe3\x26\x8b\x4b\x62\xb1\x50\x63\x1a\x60\x8e\xb3\xe1" - "\xea\x93\x3f\x27\x15\x6b\xcf\x5e\xe4\x4b\x17\x97\xc2\x9c\xc7\x87" - "\xb4\x69\xc2\x99\xc0\x32\x71\xb4\xd7\x39\xae\xc4\x4b\x33\x3a\x54" - "\xdf\x8c\xcb\x61\x58\x83\xe0\xe0\x45\xdf\x12\xf3\x26\x60\xfd\xc1" - "\x5a\xc9\x6b\x97\xe3\xde\x94\x72\x01\x58\x0d\x06\xa5\xb7\xc3\xc0" - "\xb5\xde\x19\x2e\x81\x8e\x2e\x09\xd7\x4c\xcf\x93\xf7\xda\x3b\xa1" - "\x8d\xa3\xf1\xe1\xaf\x36\xba\x47\x33\x8f\x8f\xcf\x52\x70\x6c\x01" - "\xf7\xe8\x33\xfc\x3c\x81\x9f\xfd\xe6\x19\x79\x9e\xda\x5c\xd4\x7f" - "\x06\xf5\x8e\xcf\x52\xf3\xf9\xf1\x13\x7a\x50\x47\xaf\x73\x7c\x96" - "\x97\x26\x19\xd5\x9e\xcb\x8c\xbc\xc1\xf6\x92\x59\x76\x58\xe6\x94" - "\x4c\x67\x9e\x6d\x6d\x94\xf2\xd7\x0e\x9e\xf7\x69\x7a\x83\xd7\x69" - "\x92\x4f\x51\x66\x77\xab\x45\xf2\xb7\x41\x18\xc6\xef\x78\x2b\xec" - "\x33\xf0\xbe\x98\x52\x5f\x99\xdd\x57\xfe\xc6\xbb\xf1\x6b\xc7\xef" - "\xa4\xf6\xdc\x85\x5f\x10\xf7\xf9\xf8\x9d\x94\xb4\xdb\xb7\x34\xc1" - "\x8b\x77\x3d\xb0\xd9\xf9\xd9\x4b\xe3\x8f\x8b\x7d\xe9\x06\xd8\x25" - "\xf2\xbe\xe1\x6b\xbc\x4e\x30\xde\x8f\x3e\xa8\x50\x7d\x91\x29\xd7" - "\x54\x80\x1b\xd3\x5d\xd8\x6b\x45\xa0\xb9\xd2\xcf\x78\xa7\x37\xd7" - "\xfa\xc9\x3a\x8e\xdb\x9f\x99\xc9\x6d\xf2\x83\xfe\x7c\x5d\x5b\x2b" - "\x7c\xc7\xea\x82\xc4\xfb\x73\xbd\xce\x4c\xc8\xff\x8a\x7c\xb5\xe6" - "\xb0\xda\xca\xf0\x34\x9e\x10\x7a\xfb\x95\x4e\x9b\x91\xc7\x7d\x89" - "\xe7\xe7\xd1\x76\xd3\x39\xca\x7c\x4f\xa4\x4e\xcf\x3b\x56\x42\xb4" - "\x1f\x7a\x04\x63\x8d\xdc\x2b\x68\x90\xfe\x01\x99\x18\xff\xc7\x9d" - "\xd4\xf7\x93\x76\xe2\xfd\x2e\xbc\xc3\xd8\xe3\x6b\x2d\x09\x10\xc3" - "\x0a\x71\xfb\x50\xfe\x83\xb0\xcf\x88\xb1\x1a\x7d\x3e\x23\xaf\xd2" - "\x06\x3d\xd3\xaf\xb7\x32\x17\x6f\x3e\x2b\x02\x7a\xfb\x8e\x35\xb2" - "\x2c\x64\x82\xff\x9f\x2d\x19\x94\xff\xfb\x71\xbe\xe3\xba\x63\xe9" - "\xaa\xcf\xc2\xa0\x4b\x74\x9f\xdd\x91\xa4\xfa\xeb\xf6\x69\xd1\xfd" - "\x75\x07\x6c\x9b\xdb\xb7\xe1\x57\x87\xdf\x21\xf5\x1c\xf9\xbb\xdd" - "\x16\x71\x7f\x14\x3f\xe8\xce\xdb\x31\xfe\x67\x04\x54\x3f\x70\x3a" - "\xda\xc1\x3c\xf2\x77\x4a\x0a\xf7\x15\x12\xef\xd7\x72\x3a\xf3\x33" - "\xa7\x87\x61\xcf\x78\xe9\x76\x17\xde\x9b\x59\x56\xab\xc2\x14\xf5" - "\xde\x83\xda\xdd\x1b\xa1\xab\xe9\xf6\xcf\x18\x96\x69\xcb\xf6\xed" - "\xcc\xa7\x28\xb3\xdb\x14\xdc\xbe\x1d\xf5\x75\xeb\x74\x45\xda\x09" - "\x7e\xcf\x3c\xd9\xeb\xbc\xc3\x08\xba\x1c\x94\xfb\xb1\x98\xef\xc5" - "\xb7\x35\xee\xc8\xec\xb7\xc9\xcc\xe3\x0b\x58\x1f\x75\xd3\x37\x73" - "\xa0\xb3\xd0\xb7\xd3\x73\xd5\x58\xf3\xcd\xc9\xfc\x0c\x5d\xf9\x19" - "\xee\xb3\x5b\xa1\x93\x2e\xd7\xe4\xe4\xf5\x19\x68\xd8\x65\x03\xe5" - "\x06\x6b\xea\x8e\x06\x53\xb3\x16\x79\xba\x0e\x53\x5b\xf0\x57\x64" - "\x7d\x46\xc2\xb8\xdd\x03\x1e\xb0\x6f\x10\xa1\xb7\x2f\x1f\x34\x7a" - "\x82\xe7\xdd\x18\x9b\x6f\x39\x43\xdf\x94\xf4\x78\xf9\x14\x46\xfd" - "\x27\x25\x6c\x8d\x3e\x75\xb5\xbb\x96\x8b\xe0\xae\xd3\xc2\x0f\xfb" - "\x6e\xf8\xce\xcb\x94\xf5\xfa\x46\xca\xae\xbb\x4c\xe9\xf5\x97\x29" - "\x53\xfc\x35\xd3\x50\x07\xbb\xed\xc9\x8b\x66\x82\x4e\xe0\xf5\xbb" - "\xa4\xfa\x8d\x24\x79\x24\x54\x0d\xfb\x2d\x08\xfb\xed\x7c\x26\xeb" - "\xc6\x7e\xfb\xad\x4f\xda\xc5\x93\xf3\x15\x1f\x4d\xce\x1f\x51\x42" - "\x09\xc9\xc5\x64\x06\x7e\xf6\x73\x74\xc7\x8a\x64\x0c\x88\xdc\x66" - "\xaf\xd6\x5e\xd0\xbc\xc2\x54\x42\xc3\x64\x5b\xa1\xaf\x45\xf5\xf4" - "\xdc\x41\xc7\x61\x03\xf3\x94\x9f\xe5\x86\xdb\xb0\x85\xf7\x8c\x0f" - "\x8f\x0e\x18\xd7\xd6\x89\x00\xa7\x97\x8d\x15\x01\xa4\x97\x70\xdd" - "\x4d\x48\xef\x75\x7e\xd3\xe5\x35\x5a\xd3\x06\xe3\x51\xcc\x8f\x34" - "\xbd\x92\x95\x22\x0c\x0e\xf0\xe8\x78\xd7\xe6\x20\x6c\xef\x73\x2c" - "\xb3\x59\xe6\x05\xa5\x22\x68\x5d\xc9\xfb\xf7\x59\xc4\xbe\x05\xbc" - "\xa7\xf8\x16\x6c\x9b\x2f\xf3\x27\xe0\xf1\x82\xe7\x0a\xa6\x52\x07" - "\xcf\x3d\x5c\x02\xf3\xf3\xaf\xea\xcf\x80\x76\x26\xbf\x32\x8a\xfd" - "\x6c\xb2\xf2\xbd\x94\x7f\x80\x71\x97\xbe\x34\xd0\x9d\xb0\xb7\x6e" - "\x00\x5e\xdb\xfd\xa0\x03\xde\x63\xfc\x9f\x5b\xae\xed\xff\xfa\x78" - "\xef\x15\x69\x18\xff\x1f\x3c\xca\x69\x65\x63\xc9\x52\x66\x15\x5d" - "\x83\xd9\x4c\xbc\x27\x0d\x78\x37\xa1\xcc\x61\x1d\x0e\xc6\xa9\x9f" - "\xf7\x18\x1e\x79\x04\x69\xc7\x75\x38\xc8\x73\x23\x9e\x3b\xfa\xf3" - "\xa8\x32\x5d\x11\x65\x1e\xe9\x31\xdc\xf1\x73\xa4\x05\xa3\xcb\x4c" - "\x48\x8e\x2e\x33\x61\x4c\x44\x19\x87\xaa\x67\x42\x76\x4c\x99\xdc" - "\x98\x32\x05\x57\xe2\x36\x61\x69\x4c\x99\xb2\x98\x32\xdb\xae\xc4" - "\x6d\x42\x6d\x4c\x99\x83\x31\x65\x8e\x44\xd0\x92\xfd\x6a\xb2\x91" - "\xd6\x12\x53\xe6\x64\x4c\x99\x6e\xfd\x79\x10\x1a\x27\xaf\xdd\x4f" - "\x16\xf0\x26\xfb\x6e\xf9\x5e\x41\xff\xf4\xec\x7d\xb6\x57\x95\x9d" - "\x98\x79\x65\xbb\x26\x4e\x8b\xae\x6f\x62\x7e\x74\x7d\x13\x17\x5f" - "\xd9\xae\x89\xb6\x98\x32\x8e\x98\x32\xae\x88\x32\x8d\x5a\x3d\x07" - "\x62\xca\x1c\x8e\x29\xd3\x7c\x25\x5f\x4d\xec\x88\x29\xd3\x15\x53" - "\x26\xf0\x25\xb4\xe0\x71\x5c\xf9\xb5\x8d\x62\x5b\xf9\x3e\xd8\x08" - "\x93\x96\xb0\x6f\x04\xef\x83\xbe\x71\x39\x30\x84\xf7\xe7\x78\xbc" - "\x3a\x56\x1e\xc0\xd8\x32\x09\x7a\x36\xc7\xad\x8f\x59\xec\x37\xc2" - "\x32\xad\x6c\xec\x49\x99\x83\xd9\xa2\xd2\xf7\x4c\xf3\x5f\xe3\xba" - "\x8e\x8d\xe1\x71\x6a\xd2\xee\x7e\x9b\x58\xf9\xa0\x91\x06\xe7\x6f" - "\xfa\x3e\x6c\x83\xf2\x47\x49\x60\x9b\xfc\x58\xb9\x2c\x73\x3c\xc2" - "\x8e\xe6\xfa\xfd\x87\x37\x06\x8c\x31\x78\x1c\xbc\x0a\x1e\xc9\x98" - "\x03\x74\xb5\x61\xf4\xe2\xfd\xf5\xd6\x3a\xd8\x40\xb0\xfb\x19\xb7" - "\x53\x94\x9d\x2d\x6d\xb2\x95\x97\x89\xef\x3d\x15\x53\xe5\xfe\xbb" - "\xb2\x49\xb3\x4b\x9a\x51\x3f\xdb\xee\xcd\xb6\x0b\xec\x23\x85\xf1" - "\x97\x6d\xb7\xec\x57\x8f\x55\xf8\x80\x57\x76\xb1\xee\xa7\xe2\xa5" - "\xec\xdd\xd2\xd6\x70\xd9\x78\x7f\xdd\xc7\x3e\x34\xc7\xfc\x53\x38" - "\x0f\xf8\x7f\x52\xa9\xde\x5e\x8c\xf5\xb0\x1d\xb3\xa7\x5d\x8d\x66" - "\xaa\x0f\xb3\x8f\x46\xf3\xe4\x10\xf0\x4a\x76\x7b\x74\xbf\x67\x7b" - "\xa3\xfb\x3d\xdb\x17\xcd\x93\x06\xf0\xe4\x9d\xc6\xe8\x32\x77\xa6" - "\x45\x97\xb9\x33\x3d\xa2\x8c\x4b\xd5\x73\xe7\x94\x98\x32\x79\x31" - "\x65\x0a\x23\x9e\xd1\xc6\x3b\x4b\xfa\xe7\x3e\xd2\x07\xea\xce\xf2" - "\x88\x67\xc3\x6e\xa9\x3f\xef\xdc\xa1\xa7\xf1\xda\x51\xfd\x1e\xe5" - "\x83\xa3\xc1\x3b\x18\x23\xef\x9c\xff\x68\x0c\x0e\x2d\x31\x38\xf4" - "\xcb\xbf\xb6\x77\xff\xdb\xd3\x74\xd7\x61\x6d\xef\xbe\x1b\x63\xf6" - "\x02\x7e\x06\xac\x5a\xe4\x07\x1d\xee\x4a\x8e\x86\x77\xd7\x98\x68" - "\x78\x77\x65\x45\x3c\x9b\xf1\x3c\x2d\xa2\x0d\xe6\x44\x0b\x25\x80" - "\x5f\x60\xbf\xdd\xb5\x48\x4f\xe7\x39\x25\xf0\xed\xb2\xcb\xb1\x26" - "\x97\x7d\xcb\x52\x4f\xd1\x5d\x33\x79\xfe\xa9\xc1\x8c\x94\x7f\x52" - "\xed\xba\x6b\x77\x0c\x1e\x07\x62\xf0\x38\x1c\xd1\x2e\xbf\x69\x0b" - "\x3d\x64\x0a\x3e\xfc\x28\xdb\x3e\xec\x4f\x29\x7d\xbc\x36\xc3\x66" - "\xbb\x48\x66\xf6\xad\x3b\x5d\x46\x89\x9e\xf2\x2e\xcc\xe5\x26\x0f" - "\x6a\xb3\xf7\xa4\xda\x7c\xca\xb7\x8a\xac\xbd\xce\x6f\xa5\xe9\xfc" - "\x18\xae\xb1\xf9\xc2\xd5\xd3\x92\x91\x06\xfd\x97\xdd\xa8\xec\xdc" - "\xef\x14\x0a\x7b\x61\x2d\xe8\x89\x79\x51\xce\x8d\x6a\x1e\xb1\xda" - "\xc8\x3e\x62\xec\xc7\x8a\x31\x3e\x59\xed\xc3\x7f\x6b\x71\x04\x5f" - "\xfb\xad\x1b\xef\x15\xa7\x28\x67\x2c\xdb\x00\x2c\xa3\xec\x6b\x76" - "\x2c\xe8\x23\x9e\x7b\x7b\x82\x67\xa4\xed\x86\xf7\x56\xad\x6c\x6d" - "\x44\x59\x9f\x36\x37\xee\xe2\x77\x93\x82\x64\x3c\xe6\xf7\x11\xe0" - "\xa4\x29\x7b\x2f\x67\xec\x31\xc8\x2b\xca\xb4\xe8\x65\x78\x1e\x2d" - "\xf7\x78\xcb\xc8\x38\xb1\x82\x8c\xee\x8d\xa7\x24\x6c\xdd\x6f\x03" - "\xb6\x74\xb7\xa7\xa2\x8b\x3c\xfe\x0e\x5e\xeb\x32\x2a\x1f\x9d\x1c" - "\x6b\x62\x80\x92\x7a\xaa\x6d\x90\x99\x1c\x6b\xa8\xda\xd6\x85\xf9" - "\x12\x6c\xcc\x6f\xcd\x66\x7d\x13\x49\xbb\x39\x73\x0a\x1e\x5e\x30" - "\x6f\xc2\xf7\x1f\x9e\xbb\x68\xce\x54\xeb\xa2\x15\xcf\x2d\x5b\x3a" - "\x61\xd5\xf3\x65\xd6\xf5\x6b\x56\x94\xad\x58\xf9\x03\x6b\x76\x79" - "\x46\xb9\x75\x49\x99\xba\x66\x96\x2e\x59\x5b\x36\x9d\x6f\xb3\xac" - "\xb6\x35\xcb\xd6\xc9\xdb\xdb\x87\x53\x34\x90\x15\x65\xcb\xd6\x58" - "\x33\x96\x66\x59\xef\x5f\xb2\xa2\xf4\xf9\x35\xcb\xe2\xc2\x9a\x6a" - "\x5d\xb3\x6c\xcd\xb2\x25\x4b\xad\xd3\xad\xd9\x0c\x39\x12\x5c\x44" - "\x7f\x66\xeb\xe3\x18\x8f\x5f\x55\x4e\xd1\xae\x8d\x67\x5e\xc5\x3f" - "\x39\xfe\x2b\xc7\xb2\xc9\x49\xd1\x3c\x37\xd9\x12\xcd\x73\x93\x33" - "\xaf\x1c\xcb\x26\xc7\x8c\x7f\x93\x63\xc6\xbf\xc9\x8b\xaf\x1c\xcb" - "\x26\xc7\x8c\x7f\x93\x63\xc6\xbf\xc9\xfd\xe3\x1f\x78\xc9\xbb\x55" - "\xea\x85\xc9\x31\xe3\xdf\xe4\x98\xf1\x6f\x72\x73\xcc\xf3\x89\x88" - "\xe7\x1b\xf0\xdc\x19\x39\x3e\xe2\xd9\xaf\xcb\xe7\x80\x7e\xb9\x3b" - "\x49\xcf\xc3\xba\x1e\xba\xb9\x53\xe5\xbd\xdb\x1a\x91\xb7\x4b\xcb" - "\x9b\xd3\x2f\x7f\xbc\xaf\x8d\x74\x35\x5f\xbf\xfb\x35\xd6\xe9\xec" - "\x8f\xc7\x63\x13\xe4\xe3\x96\x73\x74\x77\x0a\xc3\x62\x1e\x66\xff" - "\x4c\xb1\xf7\xf1\xde\x86\x54\x4a\xe2\x32\x0d\x35\xec\xd7\x9b\x93" - "\xc5\xbe\xba\x48\x63\xdf\x65\xe8\x94\xbb\xd9\xfe\xed\x54\xe3\xc5" - "\xdd\x5e\x69\xf3\xa3\x8c\x06\x5f\xce\x6b\x00\x87\x7d\x81\x93\xaa" - "\xd4\x58\xdc\x89\xfb\x64\xe6\x69\x94\x37\x0a\x43\xce\x6a\xf6\x81" - "\x46\x9a\x19\xbf\x34\xc0\xf3\xea\xf0\xb6\x8d\x8a\x6f\x5b\xc6\xda" - "\xb9\xfd\xf3\x41\x03\x99\xaa\x9c\xe1\x0e\x4f\x98\x6d\xeb\x6f\xa7" - "\xa9\xb5\x85\x9c\x12\xe1\xfc\xa8\xb0\x01\xe9\xf1\xe7\x49\xdf\x86" - "\xfd\xf7\xed\x24\xb5\xde\xf2\x6d\xf4\xff\xbc\x1c\xb5\x76\x9a\x53" - "\x02\x7d\x7b\x19\x70\x2e\xe2\xda\x87\xeb\xbf\xeb\xf0\xdd\x72\xbe" - "\xfd\xed\x32\xe1\x4c\x58\xc8\x70\x63\xd2\x77\x40\xbf\x5d\x36\x05" - "\x1d\x85\x71\xde\x1d\x14\xce\xc4\x87\xe3\xa4\xbb\x61\x33\x5c\x06" - "\x1e\x7e\xc6\x37\x22\xbd\x43\x38\x47\x2e\xe2\xfc\x5e\xae\x0f\x65" - "\x06\xb3\xb5\x75\xff\x5b\xe5\xc3\x3f\x25\x3d\xa6\x1d\x5f\x9c\xa6" - "\x29\x3f\x56\xed\x98\x12\x8a\xae\x7b\xca\xb4\xf8\xed\x98\xb2\x08" - "\xed\xf8\x22\x7e\x3b\xa6\xd8\x24\x6d\x0d\x68\x8b\xe1\x8a\x77\x3b" - "\xd0\x96\x2f\x24\xdd\xa3\xd3\x0f\x68\xb6\x90\x1f\xf3\x30\x33\xde" - "\xc9\xb2\x0b\x2b\x06\xfa\x4d\xcb\xd7\x62\xaa\xa5\x82\x38\x75\x76" - "\x0a\xe7\xb0\x85\x5e\xba\x47\x9e\x6b\x88\x48\x0f\x2a\x5c\x40\x27" - "\x03\xd3\x09\xed\x41\xb9\xc1\xfa\x5b\x9f\x97\xa8\xb5\x90\x7b\x20" - "\xff\x53\x48\x5f\xcb\x5c\x5b\x21\x7c\x3a\x1d\xf1\xae\x24\xe6\x5d" - "\x20\xe2\xdd\xb6\xa8\x77\x9b\xfb\xd3\xeb\xf4\xf4\xaf\xd6\x4f\xf7" - "\xb4\xc4\xf4\x13\xfa\x67\xea\x13\xd1\xed\xbe\xe7\xa4\x6a\x1f\xfa" - "\xe8\x0a\x5a\xdf\x13\x40\x1f\xf5\xc5\xef\xa3\xa9\x69\xf1\x79\x6d" - "\xaa\x5c\x47\x13\xa9\x14\x07\xde\xd4\x3c\xf4\x5d\x9f\xe4\x41\xad" - "\x9f\xae\xec\x9f\xa9\xa5\x7a\xff\x7c\xb5\x36\x4e\x6d\x8a\x69\x63" - "\xe8\x34\x7d\x67\x82\x6a\xeb\x77\x36\xc7\xc0\x3e\x1e\x9f\x17\xa7" - "\x7a\xd1\xce\xd0\x20\xed\x0c\x0e\xce\x8b\xdf\xb1\xa0\x3d\xa1\x2b" - "\x79\xf1\x3b\xd9\xaa\x0c\xc5\x2b\x93\x2f\x9c\xf1\xea\xf9\xce\x52" - "\x7b\x90\xed\xdc\xef\xd4\xf1\xfa\x52\x44\x7a\x45\x34\xff\xa1\x0d" - "\x5c\x8e\xe9\x17\x54\x7a\x96\xfb\xe1\xb4\x95\x0c\x5f\xc6\x93\xbd" - "\xce\xef\x9c\x8c\xa1\xd5\xf9\xd3\x34\xed\x89\x1e\x43\xc2\x01\x45" - "\xaf\xe9\x63\x63\x70\x0a\xc4\xa7\xd7\x34\x33\xe8\x75\x3e\x3e\xbd" - "\xa6\x65\x0d\x4e\xaf\x69\xdc\xff\xe7\xaf\xa4\xd7\xb4\xe2\x48\x7a" - "\xc1\xd6\x95\xed\xbb\xcd\x02\xde\xe8\x2b\x12\x0d\xdc\xd6\x10\x99" - "\x4d\xe0\x15\x55\xa6\x9b\xcb\xec\x36\x05\x14\x9f\xc0\x86\x4c\x3a" - "\x47\xd3\x2a\x74\xf9\x1f\x59\x4b\xc3\x44\xdf\xe3\xec\x47\x94\xc0" - "\xe5\x3c\xe5\xe7\xdd\x9e\x60\x36\xf1\xfc\x23\xa6\xde\x8e\xf8\xba" - "\x60\x9a\x0f\x34\xad\xb9\x32\x7d\x7a\x92\xf2\x23\x9b\x9e\x1b\xad" - "\x23\xa6\x5b\xa3\xfb\x08\x74\x43\x39\x6d\xdb\xe9\x4b\x7f\x57\xef" - "\xb3\xe9\xae\x2b\xfb\x6c\xc6\x9d\xaa\xbf\x66\xa4\xc4\xe0\x77\x30" - "\x7e\x7f\x4d\x77\x0f\xde\x5f\xd3\x4f\x0e\xde\x5f\xd3\x79\xfd\xf4" - "\xbc\x97\x66\x64\x47\x8f\x1b\x33\xcc\xd1\xed\x45\xbd\x28\x27\x0c" - "\x43\x6f\xe0\xe7\xaf\xda\x6e\xfd\xc7\x3a\x8e\xfb\x8a\xcf\x15\x01" - "\xff\xb1\x8c\xe3\xb5\xc2\x18\x14\x36\x68\xe8\xda\x18\x7f\xbf\x95" - "\xe7\xb8\x6d\xb5\x44\xbc\x8f\x6c\xfd\x06\xdb\xee\xf7\x0e\x09\x1b" - "\xa8\x03\xf7\x86\xd3\x94\xfb\x87\xb0\xc1\x50\xc1\x7b\x9e\xd2\x6f" - "\x5d\xae\x21\xdc\x3b\x26\xb2\x2f\x78\xef\x93\xe7\xa6\xbb\xd4\xdc" - "\xe9\x2f\x28\xff\xa6\xea\x97\xdc\x77\xa2\xe9\x78\x6f\x6e\xfc\x7e" - "\xb9\xb7\x10\xfd\xf2\x97\xf8\xfd\x72\x6f\xd9\xe0\xfd\x72\xaf\x0b" - "\xfd\xf2\x97\x2b\xe5\xe8\xde\x83\x9a\x1c\x6d\xe5\x32\xd6\x95\x3c" - "\x1f\xcf\xfd\x1a\xe7\xc1\x3d\x64\x24\x57\xd2\x64\x42\xb7\x2e\x47" - "\xb2\xcc\x49\xc0\x92\xf5\xab\x3c\xf7\x76\x68\x30\x22\xe0\xe6\x92" - "\xa9\x3b\x9e\x9c\xe4\x5a\x38\xef\x44\x1b\x25\x81\x86\x85\xfb\x19" - "\xc6\x1a\x22\xd4\xf3\x1c\xe7\xe3\xf4\x89\xfe\x48\x39\xc9\xcd\xd3" - "\xf3\xb1\xae\xd3\xf2\xe6\x8a\xde\x12\xe2\x7c\x31\xb0\xb5\xf6\x0f" - "\x93\xe3\x08\xe7\xe7\x7c\x31\x79\x6a\x95\x3c\xe6\x9e\x8c\x96\xc7" - "\xdc\xa6\x68\xfe\x04\xfd\x51\x2e\x0c\x3d\x87\x7b\x23\x70\xf8\xca" - "\xfc\x75\x75\xd9\x9c\x99\x15\x23\x9b\xe0\x81\x99\xad\x8a\x07\x66" - "\xfe\x32\x1a\xd7\x99\xb3\xe3\xf3\xc0\xcc\xc5\x83\xf3\xc0\xcc\xf2" - "\xc1\x79\x60\xe6\x6e\xe6\x01\x2f\xcd\x6c\x89\x96\xcd\x99\x87\xa2" - "\xdb\x8e\x7a\xa5\x6c\x52\xca\xb5\xc8\x26\x6c\xa1\x1b\x06\x93\x43" - "\x96\x29\xf6\x1f\x69\xb8\xac\xef\x75\x7c\x25\x9a\x25\x41\xae\x80" - "\xdf\x7d\xc5\xbc\xa6\x04\x1d\x3f\x85\x69\x58\x2f\xcf\x63\xde\x57" - "\x16\x49\xc7\x5d\xea\x0c\xa4\x1d\x79\xbf\xe0\x7d\x65\x45\xcf\x59" - "\x1f\x47\xb7\xff\xbe\xdd\xf1\xe9\x79\xdf\x21\xd0\xd3\x1e\x9f\x9e" - "\xf7\x1d\x1f\x9c\x9e\xf7\x75\xf2\x19\xa9\x2b\x65\xea\xbe\xa0\x75" - "\x9d\xb4\x51\x64\x99\x73\x34\xeb\x91\xaf\x36\x3e\xcd\xca\x89\x1e" - "\x9f\x66\x8d\xb9\xf6\xf1\x69\x56\x79\xfc\xf1\x69\x96\x2b\xfe\xf8" - "\x34\xeb\xa0\x92\x87\x59\xde\x68\x79\x98\xe5\x8e\xe6\x09\xd0\xee" - "\x7f\x6c\x7c\x9a\x9d\x1d\x23\x03\x55\xa7\x69\xf6\x3b\xb0\x29\x1c" - "\xaa\xdf\xe6\x3c\x1f\x8d\xe3\xec\xfc\xf8\xfd\x36\x7b\x29\xfa\xad" - "\x2a\x7e\xbf\xcd\x76\x0c\xde\x6f\xb3\xeb\xd0\x6f\x55\x57\xf6\xdb" - "\xec\xc3\xd7\x6e\x53\xcc\xee\x8a\xee\xb3\xd9\xed\xd7\xde\x67\x73" - "\xb2\xe2\xf7\xd9\x9c\xd9\xf1\xfb\x6c\x8e\xe6\x9b\x3e\x67\x77\x74" - "\x9f\xcd\x29\x8b\xee\x33\xd0\xed\xbf\xd9\x67\xe8\x9f\x52\xe5\x9f" - "\x30\xe7\x22\xe6\xed\xc3\x7a\x9d\x73\xba\xbd\x74\xff\x61\x35\xb7" - "\xbe\x5f\x8d\x1d\xaa\x0f\xdf\x46\x1e\xef\x95\xe3\xc0\xfd\x49\x5a" - "\xda\xf7\xaf\xec\x87\xfb\xd3\xa1\xa3\xbb\x9b\x2b\xe4\xde\x96\xea" - "\x43\xa6\x39\xf2\xb9\x37\xf2\xfe\xd4\xfd\xb3\xb9\x2c\xfa\x58\x78" - "\x02\x41\x62\xbd\x8e\xfc\x7e\x86\xc3\x67\x43\x63\x60\xd9\xae\x65" - "\x8c\xbf\x8a\x4f\x4d\xa9\xbb\xf2\x2e\xc0\x7b\xe0\x05\xc5\xab\xf7" - "\xc7\xda\xbf\x0d\x78\xf7\xa8\xe2\xd3\xb9\x19\x31\x38\xf8\xe3\xf3" - "\xe9\x03\xc9\x68\x43\x43\x7c\x3e\x7d\x20\x73\x70\x3e\x7d\x00\xfd" - "\x4f\x0d\x11\x73\x9f\xd4\x27\x83\xde\x98\xb9\xcf\x03\x25\x26\xbf" - "\xe2\x1d\x69\x13\x55\xe7\x94\xf6\x3a\x1f\x88\xb5\xff\xd0\x37\x79" - "\x23\x34\x9c\x87\xc4\x94\x1f\xc4\xfe\x7b\x80\xed\xbf\xb7\x07\xc1" - "\xf9\x2a\xf6\xdf\x03\x6c\xff\xbd\x7d\xa5\x6c\xe5\x69\xf6\x5f\xbc" - "\x39\x5e\x5e\x56\xfc\xfe\xcf\x8b\xe9\x7f\x2a\x2c\xc3\x7c\x58\x96" - "\x8f\xce\x57\x1a\x99\x8f\x7d\x93\x38\x2f\xf3\x48\x9c\xbc\xb5\xb1" - "\x30\x07\xc9\xe7\xbe\x82\xf7\xd8\x97\x2a\x2e\xef\xe5\x69\x67\x4a" - "\xe6\xce\x8e\x96\xc7\xb9\xc6\x68\x79\x7c\xe0\x60\x74\xb9\xb9\xe9" - "\xd1\xef\xef\xf7\xff\xcf\xe9\xd8\xb9\xbb\x63\x78\xe0\xa3\xd3\xf4" - "\x60\x8a\xe2\x81\x07\x57\xc4\xe0\x71\x28\x3e\x0f\xcc\x6d\x46\xfb" - "\x3f\x8a\xcf\x03\x73\xbd\x83\xf3\xc0\xdc\x20\x68\xf9\x51\x24\xdf" - "\x2e\xac\xc8\x1d\x16\x9d\xe7\x41\x6b\x7c\x9d\xf7\xe0\x94\xf8\x6b" - "\x04\x0f\x16\x28\x1a\x3f\xb8\x3d\x9a\xc6\x0f\x96\x44\xd3\x10\x6d" - "\xf9\xef\xd3\xb0\x3f\x1e\x44\xaf\xf3\xc1\x58\xf9\xf7\x9c\xa6\xef" - "\x6a\xf2\x9f\xff\x50\x0c\x8e\x7e\x85\x4b\xbc\x75\x91\xef\xf2\xfc" - "\xd7\x13\x9f\x96\xdf\xcd\x8a\xdf\xe6\xef\xce\xc6\x18\xe4\x09\x5f" - "\x21\x4b\xdf\x5d\x8c\xf4\x85\xbc\x1e\xca\xeb\x21\xf5\x48\x5f\x18" - "\xa4\x24\x39\x5e\xf5\x8f\x4b\xdf\x75\xb0\x2f\x0a\xd3\x9f\xf9\xd7" - "\x34\x86\x0a\x78\x0c\x62\xbc\x8a\x2a\xa4\xdf\x82\x69\x1b\xf3\xfa" - "\xad\xcc\xeb\xdf\x95\xf6\x1f\xef\xb3\xb0\x1f\xa1\xa9\x9c\x0a\x38" - "\x2e\x85\xce\xef\x9c\x3f\x06\xf6\x49\x96\x0b\xce\xaf\xe7\x55\xeb" - "\x66\x8e\x18\xdd\x94\x6f\x8c\xdf\xc7\xf9\x63\x06\xe7\x9d\xfc\x29" - "\xaa\x9f\xf3\x4b\xa3\xfb\x39\xbf\x20\xec\x1c\xb9\x88\xdb\x0a\x1e" - "\xb8\x26\x39\x29\xb3\x8a\xb8\x7e\x5c\x52\xdf\x6f\x7d\xbc\xc3\x56" - "\x49\xdf\x38\x43\xf9\x27\x64\x7d\x06\x11\x30\x6d\x49\xa0\x66\xa9" - "\x03\xe6\xdd\x2e\xf1\x44\x9e\xa2\x20\x19\xc4\xd6\x67\x3b\xf8\x5d" - "\x83\x53\x04\x90\xaf\x9d\xf7\x04\xf8\x6c\x35\x78\xe1\x86\x53\x94" - "\x7f\x36\xaa\x3c\x24\xdf\xa3\x60\x64\x36\x48\x79\x9c\x97\xae\xaf" - "\xe9\x6e\xc3\x73\xfc\x75\xdf\x79\x79\xba\xef\x83\xf2\x19\x9b\x37" - "\xe8\xfe\x25\xe3\xc4\x67\x65\x18\xa7\xab\xeb\x81\x79\x75\x3a\xff" - "\x2a\x5f\xcb\x79\x87\x06\x7c\xf9\xe6\x1d\xc1\xbb\xe2\xab\xac\x0d" - "\x46\xc8\xc1\xbc\xce\x48\x38\x2a\x26\xca\xbc\x80\xee\x8f\xd7\xeb" - "\x9c\x6f\xfc\x12\x58\x1a\x3e\xf3\xb3\xa2\xf1\x99\x3f\x0d\x76\x4a" - "\x9a\x06\x23\xef\x6a\x30\xb8\xcf\x15\xcf\x32\x3f\xcc\x2f\xbe\xda" - "\x9a\x5f\xa2\x85\x0a\x5e\xb9\x82\xb7\xe6\x4b\x7b\x89\x61\x7c\x09" - "\x8e\xed\x51\x73\x0b\xb9\x77\xcf\x7b\x5b\x0b\xf6\x2b\xb9\x5f\x10" - "\xb3\x46\x38\xbf\x5b\xfa\x53\x69\x72\xff\x64\x30\x56\x0e\x16\x24" - "\xeb\x63\x74\x4c\x7a\xba\x2e\xf7\x98\xd7\x32\xdc\x98\x75\xd6\x05" - "\xb3\x95\x2c\x2c\xa8\x0b\xa7\x44\xce\xd7\x16\x48\xfb\x4f\x5f\x2f" - "\xc5\xfb\xd9\x31\xe5\x62\xd6\xff\xe6\x77\x8b\xc1\xd7\xe9\x93\xd1" - "\xbf\x7e\xde\xdb\x52\xb1\x1a\x16\xb4\xc4\xac\x57\xf8\x76\xc9\xf3" - "\xf7\x7f\x06\xdc\x02\x4d\xef\x3d\x34\x33\xa6\xbe\x6e\xfb\xd9\xab" - "\xb5\xbf\x60\x90\xf6\x17\x0c\xb4\x7f\xa5\x84\x1b\xb3\x96\x58\x20" - "\xdb\x1f\xba\x42\xff\x15\xb0\x0f\xa9\x4e\x37\xd8\xdc\x05\xef\xe9" - "\xb6\x3a\xaf\x1f\x0c\x6e\xab\x17\x0c\xac\xff\xa9\x72\x03\xeb\x7f" - "\xbe\x78\xb6\xba\x97\xe4\xde\x6a\x74\xdd\x1d\xa6\xba\xb8\x6d\x19" - "\x64\xfd\xef\x21\x6d\xfd\xef\xa1\xe2\x68\x7d\xf6\x90\x35\xba\x0f" - "\x0b\x62\xfa\xf0\xa1\xdc\xe8\x3e\x5c\xd0\xfd\x5f\x1d\xd7\xf0\x4c" - "\x89\x89\x89\x86\xc4\x04\x43\x42\x22\x5e\xa3\x89\x34\x2c\xd1\x98" - "\x38\x04\xbf\xa1\xda\x75\x98\x21\xd1\x60\xc4\x6f\x88\x76\x1d\x1a" - "\xf3\x3c\x8c\xcb\xe2\x67\xd4\xae\x43\x62\x9e\x87\x7e\xc9\xfb\x61" - "\x5a\xbd\x7a\xfd\xc6\x98\xe7\x21\x5f\xf2\x7e\xe8\x7f\xb3\x3c\x5d" - "\xf1\x1c\xed\x87\x36\x77\xe5\xba\x25\xa5\x2b\x96\xca\xfd\xe2\x65" - "\xd6\x25\x4f\x3f\xbd\x6c\xed\x5a\x6b\xd9\x2a\xeb\x7d\x33\x1f\xbe" - "\x6b\xaa\x55\x6d\x3b\x97\x4e\xcf\x58\x3a\x9c\xe6\xad\x5f\xc3\x2f" - "\xe6\x2d\x9c\x5b\x68\x2d\xb8\x6f\x66\xf4\x4b\x1d\x8c\xdc\x5e\xbe" - "\x1a\x94\x08\xf9\xcb\x7d\x69\x14\xd1\x8e\x3d\x52\xf7\x74\xb2\x9f" - "\xaf\x5a\xf3\xf8\xfe\xc7\x2d\xec\x3f\x7a\xd9\x2e\xdc\xb7\xf2\x9e" - "\xfe\xc2\x65\xdc\x88\x09\x8d\x0e\xb2\x3d\xc5\xe7\x57\x16\x6e\x11" - "\x1f\xfa\xc8\xfa\x20\x19\x4e\xd1\xe2\x3f\x34\xe7\x21\x2f\x9e\x3d" - "\xde\x20\x59\xed\x94\x84\xf2\xab\xf1\x2e\x41\xcc\x08\x23\xcd\xaf" - "\xf9\x42\x7f\x6f\x8b\x4c\xfb\xd0\xa1\xe7\x33\x9d\xa6\x45\x19\xe2" - "\x43\x21\x9f\xf9\x7c\x90\xca\xb7\xf0\x0b\x61\x78\xf8\x08\xeb\x86" - "\xba\x54\x32\xf2\x5e\xe8\x6b\xa9\x94\xf4\xda\x28\x8e\x59\xb2\xb0" - "\x5b\xdf\x0b\x7d\x09\xcf\x5e\x5a\xdc\xce\x75\x73\xde\xb0\xe1\xe1" - "\x53\x9c\xbf\x3e\x2a\xff\xa2\x31\x03\x7b\xb1\x0b\xbb\x0d\xc8\xb7" - "\xe0\x33\x32\x99\x42\xe2\xef\x81\xd4\xac\xbc\x89\x79\x94\xe0\x41" - "\x57\xb4\x04\x1d\xa4\x7c\x7e\x16\x2d\xdb\x10\x12\x41\xf6\x4f\x9f" - "\xd7\x6d\x17\x55\xcf\x91\x11\x32\x9d\xe0\x5e\xc3\x3e\x0a\x8b\xf2" - "\x1b\x96\x91\x11\xed\x1f\x73\x86\x1e\xa9\xb0\xce\x27\xb2\xcf\x23" - "\xe3\xef\xcb\xd9\xdf\x30\xe7\xf4\xae\x3f\x92\xf1\x17\x97\x1d\x86" - "\xcb\xc2\x42\x15\x65\xa2\x4b\x70\x1c\x23\xbf\x08\xb0\x8f\x7f\x4b" - "\x71\x88\xf3\xfc\x5b\xaf\xdd\x42\x6d\x65\x7e\xda\x7c\x52\x04\xb6" - "\xff\x51\x9d\x0d\x68\xed\xf6\xb3\xff\x62\xd2\xe6\x79\x94\x78\xba" - "\x90\x0c\xad\x25\xb5\xe4\x59\xec\xa7\x8a\x93\xa2\xab\xa5\xf8\x73" - "\x6a\x2b\x69\xa2\xa2\x0e\x32\xb4\x74\x7e\x4a\x32\x16\x4f\x4d\x5d" - "\x53\xe5\x45\xb2\x6c\x5e\xc1\x69\x17\x69\xe3\x66\x1a\xb1\xf1\x4f" - "\x64\xf2\x74\x75\xa0\x9e\xb3\xf4\xd8\x09\x4a\x00\x3c\xc3\xa6\x4f" - "\xc9\xb2\xe9\x51\xf6\xf3\xcd\xa5\xba\x4a\xb2\x08\x7b\x66\xf2\x65" - "\x7b\xa6\xf9\xb2\xc8\x4c\xed\xb5\x67\xa6\xb5\xd9\x90\xbf\xf3\x03" - "\x1a\xd9\x41\x69\x1f\x9e\xe9\x30\xd4\x5e\xa0\x31\xdc\xa6\xd3\x68" - "\x5b\xdd\x05\xe4\xaf\x59\x93\x1d\x46\xd9\xc8\x32\xc1\x94\x35\x79" - "\x9e\xc2\x00\x85\x01\xab\xf6\x32\x8d\xa9\xbb\x4c\x96\x70\xf5\x9a" - "\x6c\x2e\xd7\x4d\xdf\xdb\xe0\x69\x21\xaa\xd8\x2c\x42\x7d\x35\x39" - "\x79\xd0\x89\xc3\xde\x7e\xea\x88\xd1\xd3\xd2\x4d\xad\xfe\xcb\xd4" - "\x46\x7f\x26\x4f\xf9\x5f\xdd\xbf\x78\xea\x08\xaf\x59\x27\xb8\x37" - "\x76\xa2\x2e\xc5\x3b\xf6\x56\x3e\xab\xec\xa0\xaa\x4a\x4a\xb6\x6d" - "\xa4\x61\x67\x90\xae\xe6\xf6\xe3\x0b\x3c\xc1\xbf\xba\x37\x4a\x7f" - "\xdc\xc5\xed\x95\xad\x94\xd8\xe6\xaf\x65\xbf\x4f\x43\x28\xb5\xae" - "\xc9\xe3\x6f\x27\x8f\xed\x2f\xee\xb0\xb9\xae\x76\x47\x98\x92\x7e" - "\x79\xa9\xdd\xe0\x31\x5e\x22\x4f\xa1\x9f\x3e\x42\xdd\xa2\xa6\xee" - "\x28\xf4\x56\x6e\x9b\x3f\xc0\xe7\x9d\xb2\x45\x8f\x65\x78\xd5\x1a" - "\xca\xaa\xbf\x40\xe9\xfb\x2f\x50\xa6\xe8\xcd\x34\xb0\x8f\x2d\x9f" - "\x4d\xdd\x8f\x6b\x72\x27\x25\xa1\xed\xca\x1f\x3b\x45\xf3\xb5\xed" - "\xcb\xa4\x86\xcb\x03\xbe\xb6\x97\x7b\x06\x7c\x6d\xc1\x53\x3e\xf6" - "\xb7\xf5\xd2\x23\xdb\x4c\x2d\x34\x0c\x72\x72\x90\xf9\xbb\xea\x1c" - "\x19\xb7\x9e\x23\x9a\xe8\x30\x90\x75\x39\x9f\xb3\xf8\xfe\x32\x0f" - "\xfa\x86\xef\x4f\xd1\xf7\xc7\xe0\x9a\x8c\x5f\x02\xd2\x65\xfc\x86" - "\x4e\x8d\x8f\x91\x66\x40\xda\x10\x5c\x13\x21\x2f\x21\x7b\x9d\xf0" - "\xa1\xae\xc6\x1e\x03\x0d\x67\x7e\xd6\xfc\x7b\x1b\x7b\x9d\xdf\xf3" - "\x7b\xe9\xb9\x6e\x9d\xaf\x95\x8e\x5f\xe8\xfb\xe8\xd4\x59\x8e\x97" - "\xe5\x93\x78\xf5\x95\x24\x70\xec\x2c\x2d\x9d\x71\x78\x82\xeb\x45" - "\xfd\xb9\xb8\x9a\xf0\x83\x9c\x7e\xef\x84\x5e\xb6\xa7\xaf\x04\x75" - "\x7e\xff\x11\xa4\x0b\x3d\x1d\xed\x36\xf2\xbb\x77\x4f\x9d\x35\xa8" - "\x3c\x99\x06\xc0\x0c\x68\xf0\x21\xfb\x0b\x77\xb3\x8c\xf7\x18\x4c" - "\xe2\x58\x71\x0e\xd5\xed\x11\x2d\xfb\xf7\x88\x66\x25\x7b\xdf\xaf" - "\xf5\xd2\x2a\x17\xe3\x88\x71\xbc\x79\x07\xde\x1d\xc3\xa8\xc3\x74" - "\x69\x5e\xca\xfe\x64\xdf\x87\xfd\x77\xfd\xd1\xc8\x36\x08\xe7\x43" - "\xb5\x3c\x96\xbe\x55\x79\x7c\x08\x74\x40\x6d\x5b\x67\x37\xfd\xe2" - "\x72\xd7\x10\xfb\xef\xc8\xe0\x09\x9e\xa2\x49\x69\x64\x61\x7b\xb0" - "\x61\x8f\xf0\xbe\xc2\xf1\xf9\xf6\x88\x6e\xf0\xcb\xcd\x67\xa8\x70" - "\xc8\x37\xd3\x28\xed\x5f\xcb\x49\xd3\x4f\x85\x37\x47\xe8\xa7\x37" - "\x5b\xbd\x47\x22\x74\xd3\xe2\x47\xae\xd4\x4d\x8f\x3f\xa4\x74\x13" - "\x64\x5f\xea\xa2\x90\x57\x4b\x9f\x1e\x93\xae\xf9\x89\x3c\x3e\x36" - "\x26\x3d\xa0\xa5\x8f\x88\x49\xf7\xa9\xf4\xc7\xe6\xe9\xba\xaf\x8d" - "\xf1\x58\xcf\xba\xef\xb1\x3b\x59\xf7\xb5\x15\x6b\xba\x4f\xea\x9f" - "\xc7\x6e\x14\xff\x04\x5d\xb4\x8e\xf5\xcd\xa3\x67\x19\x7f\xf1\x21" - "\xe9\xb8\x5f\x87\xb4\x5f\x72\x9a\xeb\xcf\x64\xc4\x4f\xd7\x7b\x82" - "\xf5\x1e\xeb\x3c\xd6\x7d\xfb\x46\x89\x8e\x7d\x7b\xc4\x89\x3a\x19" - "\xfb\xe7\xd1\x7e\xfd\xf7\x32\xd2\x76\x20\xed\x65\xbc\x67\x3d\xc8" - "\x34\x69\x2d\x3c\x42\xec\x7f\x02\x5b\xab\x33\x6c\xc8\xa6\x5d\xe8" - "\x6f\x3e\x6f\xb8\x0d\xf4\x35\x25\x90\xcd\x53\xc6\x67\x58\x43\xec" - "\x93\xd6\xd9\x56\xd6\xc9\x72\x37\x6a\x2b\xe4\xcc\x53\xfe\x39\x55" - "\xfa\xc5\x19\x3e\x77\xc7\x38\x14\x6d\x78\x90\xe3\x25\x25\x34\x63" - "\x36\xcc\x7e\xe1\xac\xb3\x81\x8b\xd1\x05\x9c\x54\x7c\x96\x47\x0f" - "\x78\xe9\x80\x43\xf5\xf5\xe2\x76\x8e\xcb\x76\x8a\x0a\xbb\x30\xdf" - "\x0b\x70\xdb\x4c\x21\x07\xf1\x39\x18\x8e\x55\xc8\xd7\x7d\x86\x70" - "\x89\x4b\x3f\x0b\xe3\x84\x6e\x40\x1e\x4f\x47\x80\x18\x67\x2f\x3d" - "\x9a\xd3\x5a\x71\x84\xcb\x77\x30\x6d\x84\xd3\xae\xc3\x48\x90\x30" - "\x0c\x72\xde\x58\x82\x7c\x6a\xed\x3c\x35\x27\xaf\x75\xb1\x8f\x58" - "\xef\x7b\xba\x00\xa3\xe2\x94\x82\x01\x58\x02\x63\x40\xd4\x3b\x0d" - "\xfe\x88\xcd\xe2\xef\x80\x7f\x80\xfb\x8b\xcf\x45\xf2\x7e\x1b\xe8" - "\x92\xcc\xbe\xf2\xca\x16\x7d\x74\x42\xc3\x9f\x89\xb4\xb3\x9d\xe0" - "\xb7\x47\xb3\xf8\xdc\x12\x9f\xe7\xbc\xda\x59\x4e\xd0\x28\x5d\x3f" - "\xcf\x19\x5e\xff\x3f\x7b\x96\x13\xb0\x2d\xf5\x06\xd1\x04\xfc\xb3" - "\xf8\x3c\x27\xf0\xdf\xc1\x7c\xa8\xb5\x29\xfb\xd5\xc7\x24\xcd\xcb" - "\x38\x0d\x73\xc7\xe3\x7a\xff\x73\x7b\xb9\x2d\x78\x57\xa8\x6c\x44" - "\x81\xf9\xc7\xe3\xd9\xfc\x1e\x69\xb3\x39\xff\x24\xe8\x31\x0f\xc6" - "\xb0\xb7\x4f\x85\x0c\x55\x1b\xc9\xa8\x74\xda\xe2\xb9\x5c\x5e\xe9" - "\xb4\xc5\x34\xa0\xd3\x1e\xbf\xa8\x74\x9a\xa2\xb1\xd2\x69\x8f\xff" - "\x4d\xe9\xb4\xc7\x3f\x93\xfb\x62\xd0\x69\xfc\x8e\xf5\x9a\xae\xd3" - "\xf6\x8f\x12\xc7\x59\x77\xf4\x3a\x1f\x6f\xd7\x75\xdb\x4e\xa4\xb1" - "\xee\x60\x1c\x95\x9e\x7a\x2c\x53\xfc\x7f\x99\xa4\xfc\x0e\xf8\xbe" - "\x84\xcf\x2f\x74\x69\xf7\x3c\x9e\xcc\x54\x3a\x6e\x71\xfa\x80\x8e" - "\x7b\xfc\xe0\x40\x59\xd6\x71\x8b\xef\x51\x3a\x4e\xa5\x37\x3c\xc6" - "\x3a\xee\xb1\x4c\xa6\x81\x06\xdf\xc0\x6b\x78\x5a\x7e\xa6\x63\x76" - "\xa4\x8e\x8b\x96\xaf\xc5\x15\xba\x8e\x63\xdd\x86\xe7\x1d\xd0\x69" - "\x72\x0e\xc9\x72\xb6\x1b\x34\xd7\xe5\x8e\xfb\x80\xdb\xcc\xf1\xd7" - "\x98\x6e\xb3\xce\xd2\x30\xed\xec\x90\xd6\xee\xc5\xc7\x75\xdf\x47" - "\xd0\xbf\x3d\x9e\x1d\x3d\x10\x23\x91\x6e\xe1\xb3\xf3\x1e\xc7\x29" - "\xf2\xd4\x0a\x47\x5b\xf0\x24\x15\x95\x41\x57\x24\x3e\xfb\x19\xf7" - "\x2d\xe6\x1d\xdf\xe1\x2b\xeb\x9e\x33\xf4\xc4\x88\x22\x3f\x0d\xc5" - "\x5c\xfd\xb3\x2a\x03\xde\x95\x47\xbd\x93\x6b\x0c\x13\xd7\x70\x7c" - "\x3d\x08\xc2\x20\xf3\xfd\x6b\xac\x6f\xf3\x55\xea\x7b\x4d\xd6\x07" - "\x9b\x0a\x73\xa0\x94\x73\xf4\x84\x9c\x97\xc8\xf8\x36\x5b\xe3\xc2" - "\xfa\x9d\xf6\x7e\xc8\x20\xef\xff\x76\xf5\xf2\x4f\x5e\x77\xf5\xf2" - "\x4f\xde\xce\xba\x08\xed\x33\x85\x9c\xd1\x70\x46\x06\xf5\x7c\x67" - "\x38\xdf\x43\xda\x5a\xcc\x67\xf6\xb1\x72\x8e\x66\xd1\x61\x32\xff" - "\xed\x42\x3e\x19\x33\x04\xba\x72\xf6\x06\xe2\x78\x2d\x91\x65\x77" - "\x0e\xd0\xf8\xc9\xdc\xab\xac\xfb\x25\x7b\x6a\x49\xc6\x8c\x3d\x06" - "\x9b\x94\x63\x1a\xed\xee\x5f\xff\x78\xb2\x13\x7a\xd3\x1b\xe1\x17" - "\xcb\xf3\xb1\x5b\x38\xae\x01\xdb\x97\x55\x6a\xbe\x79\x13\xf4\x73" - "\x2a\x9f\x87\xe1\xb3\x31\x45\xa1\x02\xc3\x31\x19\xcb\xac\xc8\xaa" - "\x97\x1d\x6c\x9d\x85\xeb\xd5\xea\x64\x1f\x53\x3f\xca\x2c\xd2\xcb" - "\x30\x6c\xf6\x53\xc4\xb8\x7c\x8b\x3c\x53\x1a\xec\x66\x5d\x78\x13" - "\x6c\xd1\x54\x55\x4f\x31\x69\xf5\x6c\xf7\xd2\x13\x05\x57\x3b\x9b" - "\x31\x78\xfb\x8a\x9a\xaf\xbd\x7d\xa4\xb5\xaf\x98\xbe\xa4\x7d\x57" - "\xa9\xb7\x78\xda\xb5\xd7\x6b\xd6\xeb\x2d\xbf\x76\xba\x16\x1f\xfa" - "\xea\x74\xcd\xd6\xe8\x5a\xec\xfd\x12\xba\xc6\xa9\x67\x49\xda\x57" - "\xaf\xc7\xaa\xd5\xb3\x24\x2f\x5e\x3d\x24\xff\x06\x3d\x37\x95\xa4" - "\xc7\xda\xec\x81\xec\xa8\x58\x75\x4b\x5c\x91\xf1\x8b\x7b\xa4\x5c" - "\x2d\x39\xd0\x1f\x2f\x59\xed\x95\x43\x57\x2f\xf9\xb8\xa8\x91\xc7" - "\x77\x11\xf6\xd2\x92\x66\x8e\xe3\x3a\x7b\xb3\x3a\x93\xad\x95\xe9" - "\xb8\x5a\xdc\x64\x8e\xd1\xc5\x31\xf9\x3c\x16\xb4\xbd\x96\x63\x97" - "\xac\xe6\x33\x15\x1c\xaf\x15\x3a\xfe\xa9\x9b\x39\xe6\x18\xee\x87" - "\xe1\x3e\x53\xe9\x80\xa7\x32\x51\xcf\xe0\x67\x27\x6b\x56\x5b\x0f" - "\x54\x66\x0f\x19\xcc\xbf\x1e\xe5\x61\x53\xac\x96\x6b\x53\xe1\xd4" - "\x19\x85\x98\x4b\x68\xf1\xfe\x96\x7e\x2e\x63\xc0\xd9\x0b\xf9\x3c" - "\x09\xc6\xc5\xa5\x23\xb4\x73\x00\xa0\x87\x03\x74\x7d\xaa\x51\xa7" - "\x87\x9e\x8e\xb4\xc3\x3a\x3d\x60\xdf\x24\x7b\x1a\x83\x7c\x4e\xc7" - "\xaf\xce\x64\x3f\xf5\xef\xa2\x7a\xb5\x45\xc1\x7e\x5a\xed\xd1\x70" - "\x7d\x7d\x85\x46\x39\x6f\xaa\xe4\x79\xd3\xd3\x47\x7d\x29\xab\x2d" - "\x3a\x1e\x62\xad\xc5\xc0\x67\xbf\x27\x61\x2c\xdd\xa5\x62\xee\x25" - "\xf0\x39\x39\xf9\x7e\x6d\xa6\x41\xd1\xe4\xe9\xe9\xa2\x87\x63\xc7" - "\x48\xd8\xc9\xc0\xb3\x93\xe1\x7a\x71\xf5\x6d\xca\xe4\xb8\x17\x5a" - "\x7b\x9e\xce\x08\xd7\xcc\x28\x0c\xf7\x5a\x0c\x3a\xbe\xf5\xf2\x4c" - "\xeb\xd3\x68\x7f\xb1\x8a\x13\x2b\xf1\xb1\x18\xd8\x9f\x3f\x9c\xba" - "\xda\x2a\x36\x59\xe8\xf0\x9a\x2e\x39\x6f\xe2\x3a\x27\xa1\x7e\xc1" - "\xf3\x24\xd8\x26\x28\xd7\xd8\x4f\x37\xc0\x15\xbd\x3a\xdd\x9e\xce" - "\x57\xe3\xb2\x6a\xa3\x7f\x93\xc5\x70\xcc\x27\xcf\xdb\x51\xba\xd5" - "\xfe\x85\x8a\x85\xfd\xf4\x49\x9d\x76\xfd\x38\x01\x1f\xce\xa3\xfc" - "\x9b\x9e\x0e\xea\x38\x49\xd9\x4d\xe5\xf3\xbb\x4f\xf9\xf8\xdc\x90" - "\xa2\xff\xb1\xe4\x5e\xe7\x52\xeb\x95\xf4\x5f\x9a\x13\x41\xff\x44" - "\xe6\x3d\xa6\x3f\xaf\x75\x80\x2e\x4f\x80\x96\x49\xea\xbc\x03\xdb" - "\x33\x4b\x97\xe1\x39\x99\xf1\x0c\x57\xeb\x34\x2f\x34\xaa\x75\xb2" - "\xa5\xb5\x11\xfd\x80\xf6\x5a\xd8\x56\x4b\xd0\xdb\xcf\x65\x98\x06" - "\x1c\x57\x92\xeb\x06\x3e\xd7\xa3\xee\xa6\xd8\x36\x6d\x55\x67\x49" - "\x48\xf9\x96\x2c\x6d\x8f\x88\x2d\xee\x2b\xb3\x8a\x80\x3a\x97\xbc" - "\xb4\xfc\x70\xa5\xcf\x38\x98\x0e\x60\x1e\x94\x31\x2a\x0d\x72\x5d" - "\x01\x36\xd7\xf2\x4f\x04\x70\x53\x7d\xbf\x7c\xbf\x4a\x5b\xf6\x37" - "\x5c\xc1\x63\xcb\x66\x0a\xd4\xed\xb3\xcb\x18\x2b\x68\xdb\x72\x2f" - "\xf3\x9c\xce\x67\xbc\x0e\xa9\x7c\xc6\x97\xbd\xc9\x3a\x45\xa7\x39" - "\xf0\x1f\xde\xeb\x5c\x66\xd3\xf1\xd7\xf3\x73\xdf\x71\x1e\xde\xb3" - "\x69\xb6\x06\xa4\xae\x55\x67\x86\x96\xd5\xe9\x32\xcc\x75\x70\x3f" - "\xb3\xae\x61\x7a\x28\x5a\x2c\x3b\x1a\x0d\xcb\x62\x50\x71\x33\x99" - "\xe7\x21\x8f\x1b\x03\x43\x90\xc7\x3b\x00\x63\xd9\x62\xf5\xae\x1f" - "\x4f\xf6\xf3\x97\xbe\x78\xaa\x3f\x96\xcf\xe5\x76\x0d\xe0\xcb\xf2" - "\xb7\xbc\xbf\xff\xf9\x9d\xdf\x6e\xe1\x18\xbc\x52\xc7\x94\x8d\x65" - "\x7c\x7d\x1c\xdb\x56\xf2\x3a\xe0\xbb\x18\x77\xce\xa3\xf7\xd9\x00" - "\x2f\x2e\x2f\x89\x84\x23\xec\x12\x57\x09\x47\xe9\x0e\x1f\xef\x6d" - "\x5b\xd5\x7e\xcb\xf2\xdd\x11\xed\x4e\xd6\xf1\x19\xd0\x09\xcb\x0f" - "\xc7\xf2\x24\xd7\xcd\xb1\xf8\x34\xd8\xac\x4b\xcc\xa7\x68\x79\xa3" - "\x86\x97\xec\xc7\xc1\xc6\x37\x8e\x73\xc9\xb1\x4f\x5f\x51\x3a\x04" - "\xfd\x5c\x32\xf6\x15\x75\x8e\xc8\xaf\xe2\x9f\xfe\x20\x43\x18\x7e" - "\xcc\xb4\xe2\xf5\x74\x9f\x8c\xd7\x21\xcf\x98\xff\x80\xf7\xf8\xc5" - "\x48\xdb\x8f\x65\xac\x5b\xcd\x37\xd0\xd7\x6c\x0b\xca\x58\x7e\xf6" - "\x32\x3e\x73\x1b\xe4\xb9\x9e\xf4\x7d\x3b\x56\x16\xa4\x85\x01\x96" - "\x89\x1f\x94\xf1\x59\x7a\x15\x47\xfc\x07\x0e\xfd\xfc\x3c\xc7\xce" - "\xe4\xb8\xaf\xd0\x43\x89\x03\x71\x5b\x4b\x0a\xd9\xc6\xd2\xfa\x97" - "\x76\x19\x44\xbb\x92\xff\x1f\xfc\x8e\xcf\xcb\xab\x7d\xac\x53\xd0" - "\x09\x89\x7f\x3d\x45\x3f\xf8\x4c\xad\xfb\xe8\x3a\xaa\xe4\x51\xde" - "\xcb\xf2\x6a\x30\x50\x57\x37\xe4\xbb\xe0\x4a\x5d\xf2\x83\xdf\xe9" - "\x73\x17\x3e\x7f\xa7\xf6\xc5\x06\xe0\x79\xe9\x07\x72\x2e\x38\xd0" - "\x07\xbf\x05\xac\x92\x29\x57\xea\x85\x92\x7c\x5d\xf6\x6c\xb7\xf2" - "\x19\xee\x1f\x98\xb9\xfe\xc1\xc6\x0b\x61\x7f\x94\xfb\x29\xe9\xb4" - "\x35\x7e\xdf\xc4\xdf\x67\x2b\x69\xd2\xdb\xa0\xd3\x44\xb5\x61\xc5" - "\x75\x3d\xa9\x39\x65\x03\x6d\x5f\x21\x6d\xd7\x88\xf7\x33\x23\x68" - "\xc3\xcf\xb9\x6a\x5c\x5b\x01\xfa\x2c\xd5\x62\xd5\xaa\x34\xc8\xce" - "\xd7\xc5\xa6\x42\x52\x38\xae\x20\x5d\xd6\x91\x37\xcb\x4b\x17\x2d" - "\x6a\xbf\x6b\x05\xda\x5f\xb2\x5d\x95\x2b\x39\xc1\xb8\xc4\x6d\x67" - "\x34\x8e\x47\xd8\xd6\x50\x31\x15\x56\xbc\xcf\xf8\x5a\xc7\x71\x1f" - "\xaf\x78\x41\xea\x70\x8e\xaf\xd0\x57\x32\xc4\xdf\x97\x49\x3d\x7d" - "\x25\xd0\x0b\x99\x06\xd4\x03\xfd\xdf\xe3\xd7\xea\x3c\xa4\xe3\xca" - "\xb8\xc9\xf8\x9c\x62\x45\x7c\xfa\x72\xbd\x32\xe6\x53\xc9\x30\xfc" - "\x92\xf0\x1b\xfa\x55\xed\x12\xd8\xe9\x5d\xbe\xea\xa9\x81\xf0\x3a" - "\x71\x9c\xe3\x8b\x61\x2e\xd2\x55\x05\xfe\x1d\xb9\xc5\x0d\xdb\xfc" - "\x09\x43\xd1\x06\xca\xc5\x9c\x99\xc4\x25\x31\xa5\x3e\x8c\xeb\x3a" - "\x91\xc3\x71\xc6\xf1\x9c\xad\x3d\x67\xf1\x73\xcf\x3a\xb1\xb8\xd7" - "\xf9\x4c\xb1\xbe\x47\xa8\x62\xe3\x3c\x63\xeb\x8f\x27\x94\xf8\x38" - "\x9f\x27\xe2\xb8\x53\x61\xcc\x85\xba\xb8\xde\x22\x9e\xcf\xa2\x3e" - "\xe4\xab\x85\xbd\x21\xd7\x5e\x7c\x89\x77\xa4\xe2\x97\x39\xc8\x5e" - "\x6a\x17\xe3\xd5\x93\x32\x35\xa0\xe3\x3a\xd2\x9f\x6b\xf8\x8a\xb8" - "\x05\x75\xdc\x90\x7e\xbc\x4a\xa5\x07\x39\xfe\x21\xfb\x3a\xf6\x3a" - "\x9f\x1d\xa3\xe3\xaa\xe3\xc0\xf5\xf1\xf9\x4d\x91\x9a\xe3\xe0\xd8" - "\x33\x5c\x1f\xc7\x53\x45\xde\x3c\x1d\xdf\xaf\xca\xcb\x95\x75\x42" - "\xf0\xf8\xc9\xfa\xd7\x3a\x9a\xa8\xcd\xcf\x3a\xe5\xd9\xba\x63\x75" - "\x7e\x5e\xef\x76\xa2\x8e\x2d\x3d\xa2\x84\xc2\x7d\x25\x71\xfb\x98" - "\xcb\x20\x7f\x87\xd4\x0f\x35\x39\x5b\xc2\x22\x0f\x7a\x02\xe5\xfa" - "\xf2\x78\xad\x09\x72\x5b\x6a\x6c\xae\xe8\xe2\x33\x97\xd0\x39\xa5" - "\x46\xe4\x71\xb0\x9d\x85\xf9\x56\x40\x7e\xbf\x02\xba\xc9\xbd\x2e" - "\x07\x30\x4a\x87\x18\xcb\xc9\xd8\x1c\x13\xa7\x6a\x30\xfe\xe8\x31" - "\xcf\x70\xf5\xd4\xcc\x28\xe9\x75\x96\xc2\xfe\x7f\x6e\xd0\x3d\xdf" - "\xad\xa3\x40\x4f\xe4\x73\x8d\xe6\xf9\x5e\x69\xc9\xd5\xf2\xea\xfb" - "\xd5\xac\x83\x26\x59\x28\x59\xa4\xcc\x70\xb1\xbe\xed\x49\x9d\x51" - "\xc2\x63\x09\xca\x1f\xd4\xcb\xf3\xb8\xce\x63\x07\xfa\xcb\x52\xd5" - "\xaf\x0f\x4b\xdb\x95\x3c\x97\xb6\xeb\x32\x1a\xaf\x9e\xb2\x03\x22" - "\x6c\xcf\x20\x83\x07\xe3\xd6\xc4\x00\x25\xd7\xbf\x4e\xe4\xda\x28" - "\x02\xaf\x6c\xc4\x1c\x66\x34\x7f\xef\xa2\x34\x8f\x65\x94\xf9\x7b" - "\x17\xf8\x25\x11\xb8\xbc\x72\x09\x75\x56\xaa\x7c\x9a\xdf\xba\x05" - "\xf9\xca\x70\x4d\x13\x06\x03\xed\xae\xa4\xa4\xdd\x61\x32\xba\x2a" - "\x69\x0c\xd2\x60\xeb\x3e\xb7\x48\x97\xd9\x78\x38\x54\xd5\x13\xd5" - "\xa0\xde\x2d\x95\x22\xf8\x5b\x8c\xe7\xce\xb0\x08\x7c\x15\xba\xa3" - "\xfd\x87\x55\x1b\x9f\x3b\xac\xdb\x84\xb8\x77\x47\xfb\x1d\x3c\x77" - "\xc5\x19\xef\xa7\x56\xad\x2a\x2b\x5a\xb3\x8c\x2f\x99\x19\xcf\xdf" - "\x3e\x3c\x72\x2d\x84\xc7\x3f\x15\xa7\xe2\xb9\x0e\x5e\x77\x7c\x25" - "\x55\xdf\x47\x5f\x69\xd1\xd7\x3e\x35\x7f\xfd\x7b\x79\x4e\xc7\x73" - "\x1f\xbc\xcb\xf9\xb8\x62\x33\x83\x49\xf8\x2c\x89\x0c\xb1\xf5\x2d" - "\x5f\x52\xb6\xa4\x74\x2a\xef\x98\x0d\x8f\x53\xcf\xca\xbc\x98\x7a" - "\x1c\xfd\xf5\xa8\xf1\xc7\x6f\xe0\x7c\xd5\xef\x16\x88\x94\xbd\x3e" - "\x75\x56\x7a\xe5\x01\x7d\x4d\x6b\x10\x3f\x47\x77\xa8\x66\x8d\x8d" - "\xe5\xc1\xbe\x99\x0c\xef\x6e\xec\x30\xb0\x1d\x59\x89\x7b\x5e\x5b" - "\x90\x6b\x64\x5a\xbc\xa8\x0f\x2f\x74\x60\x7c\x5f\x19\x10\xd5\x39" - "\xa0\xdb\xca\x41\xd7\x6c\x22\x7d\x44\xd8\xa7\xb0\x93\x56\x99\xaf" - "\xe6\x73\xc4\xf9\xb9\x3d\xcc\xb3\x31\xe5\x5e\x50\x7d\xb6\x0a\xfc" - "\x5f\x6a\xed\x3f\xcf\xab\xe5\xa9\x1a\xa5\xc7\xe1\x5a\xb5\x78\x50" - "\x7f\x11\xd7\x8c\x5a\xc5\xe3\xab\x3e\x69\xc6\x7c\x0d\xed\xfc\xe1" - "\x29\x5a\xf5\xb1\xd1\x02\x1b\x61\x34\xfd\x14\xf7\x9f\x70\x59\x7e" - "\x17\xc5\x47\x37\x9f\x6d\x34\x42\xbb\x40\xcb\x24\x08\xf5\x47\x46" - "\xed\x26\x11\x3f\x83\x48\x90\xbb\xa9\x89\xe8\xc1\x61\x43\x8d\x64" - "\x1a\x99\x9c\x74\xcb\x37\xc6\x58\xee\x9d\x31\x6d\x8a\xbd\xb2\x02" - "\x5a\x39\x18\x30\x89\xc8\xf8\x69\x7b\x6b\x1f\xb9\xdd\x41\xd2\x9f" - "\xa6\x7a\x6f\x6d\x3c\x5c\x77\x3a\x85\x8d\xcf\xae\x87\x53\xdf\x72" - "\xdb\x9f\x27\xc3\xdb\x97\xbd\x06\x8e\xd1\xcc\xf6\x33\x7f\xeb\xe2" - "\x14\xd9\x1e\xfa\x08\x69\xa0\x57\xb9\x70\xbd\xe5\x56\x76\xa7\xad" - "\x3a\x5c\xf3\x96\x7b\x00\xbe\x91\x18\xbe\xfd\x35\x32\x1c\xa8\xec" - "\x32\x78\x8c\x33\xc8\x63\xf5\xd3\x47\xb8\x8f\xdb\x57\xa8\x93\x6d" - "\x59\x86\xd1\xe0\x0c\x6f\xb7\x7f\x41\x06\xed\xfc\xa9\xe1\x1c\xd9" - "\x7e\xd7\x34\x48\x39\x3e\xef\xdd\x93\x3a\xf5\xc3\x5e\xe7\x6a\xa3" - "\x97\xee\x9b\xad\xd9\x32\x18\x73\x57\x63\xfe\xbf\x4a\xc6\x79\xc2" - "\xfb\x0f\xf8\xbb\x30\x48\xcb\xd4\xf3\xc4\xed\xa3\x1f\xf1\x1a\xbc" - "\x70\x33\x1f\x88\x4b\x7f\xeb\xe2\xb3\x2d\x83\xf8\xc1\x0c\xf3\x94" - "\xdf\xc5\x7b\x91\x43\x46\x42\xff\xd8\x2f\x8a\xbe\x90\x93\xd2\x20" - "\x4e\x86\x90\x81\x6e\x09\x5e\x12\x85\xad\xdd\x17\x64\x4c\x53\xd6" - "\x35\x6f\x2d\xff\xad\xc1\x13\x38\xef\xf6\x6c\x0b\x53\x1b\xec\x4a" - "\x4f\xdd\x79\xb7\x8a\x7d\x1a\xa2\x56\xfa\x33\xb5\x96\xff\x6f\x87" - "\xc7\xf1\x67\xa4\x0b\x19\x0b\xbb\xef\x92\x58\xe4\x31\xfe\x1b\xf1" - "\x77\x8a\x78\x8c\x03\xdd\xad\xe7\x68\xf5\xdf\x3f\x04\x9c\xb7\xff" - "\x03\xb0\x64\xcc\xb4\xe9\xf4\x11\xee\xd1\xa6\xfe\xf1\x2f\x6e\xac" - "\x99\x04\xf7\x4e\x53\xf9\x13\x86\x30\xc6\x52\x8e\x6d\x87\x31\x34" - "\x87\xdb\x85\xe7\x6c\x7e\xc6\x35\x8b\xaf\xa6\x2d\xee\xfd\xa6\xe0" - "\x13\x3c\xb6\x16\xf2\xb8\x89\xf4\x45\x0d\x97\xe4\x58\x5b\xa0\x3d" - "\xe7\x6b\xcf\x79\xda\xf3\x6c\xed\x39\x57\x7b\xe6\x75\x79\x6d\x4c" - "\x5e\xe3\xea\xb7\x17\x0c\xc3\xda\xf1\xdc\xa8\xf7\x05\xf0\x19\x61" - "\x2a\xdf\x2c\xc7\x76\x0d\x8f\x1c\x0d\xaf\x6c\xed\x59\xc7\xe7\x66" - "\x53\x70\xf3\xff\x10\x3e\x6b\xad\xd1\xf8\xac\xcd\x8e\xc0\x87\x4c" - "\xe5\xb9\x5f\x05\x1f\xb3\x89\xbf\x13\xf1\xdf\xc0\x87\x71\xe1\x34" - "\xd4\xdf\x14\x83\x8f\x5b\xc7\x27\x2e\xbf\xad\x13\x5d\x6c\xd7\xac" - "\xfd\x9a\x8c\xeb\x3c\x8c\x6d\x96\x86\xcb\x7a\x9c\xc2\xb5\xc1\xab" - "\xc5\x29\x84\x2c\x60\xdc\x2e\x43\xfb\xd7\xb6\x68\xf6\xdb\x51\x65" - "\xe7\x97\xe5\xe8\xbe\x63\x68\xeb\xc1\x2a\xd5\xd6\x43\xdb\x38\x56" - "\xdf\x06\xfa\xba\xbd\x5c\x74\x61\xde\xfd\x9f\x3c\x37\x8c\x84\x5b" - "\x5a\xb6\x76\xed\x73\x53\xad\xa5\x4b\x56\x2e\xb3\x66\x2c\xb5\xae" - "\x2d\x59\xb1\xbc\x6c\x59\xb4\x3f\x85\x59\xfb\x7e\x8f\x3c\x27\xc2" - "\x73\x29\x39\x97\x06\xff\x4b\x3d\x29\x7d\xf2\xca\x2e\x0a\x67\x59" - "\x31\xeb\xdc\xfa\x1a\xf5\x9d\x27\xe0\xd3\xac\x8f\x21\xfa\xfc\x97" - "\xc7\x10\xa4\x9f\xc4\x38\xb9\x38\x22\x9d\xf3\xfa\xf4\x34\x86\xaf" - "\xe9\xa6\x61\xa7\xa8\xac\x9a\xeb\x8c\x4b\xc3\x4b\xa2\x11\x76\x13" - "\x7f\xc3\xc2\x00\x9d\x22\x38\xee\x16\x9f\xbf\x44\x39\x71\x9a\x9e" - "\x97\xf3\x8a\x45\x78\x56\x73\x36\x01\x1c\x9f\x7f\x04\x65\x0e\x20" - "\xcd\xc8\x36\x04\xe6\x81\x5d\x5c\x0e\xe9\xcf\x71\x1c\x0c\xa4\x27" - "\x69\xf1\xc4\x38\x6d\x0b\xc7\xa9\x40\x9a\x39\x22\xed\x55\xa4\x59" - "\x90\x66\xd5\xe0\xbd\xc9\x74\xc6\x73\xae\xb6\x4e\xc6\x79\xde\xd7" - "\xea\x75\x44\xe2\xcc\xdf\x70\xb9\x6b\x62\xb6\x75\xd1\xc2\xbb\xa7" - "\xcf\x78\x7a\xd5\xca\xe5\xc3\x49\x92\x3d\x13\xc3\x71\xf6\x5d\xe5" - "\xb7\x4f\xb5\xda\x96\x2d\x5b\x63\x5d\xbf\x6c\x65\x99\x75\xc9\xfa" - "\x25\x1b\x86\xd3\xf2\x55\x6b\x9e\xe6\x28\x0b\xdc\x2d\x6b\x8b\x9e" - "\x5e\xfe\x03\x76\x7a\x51\xb9\x87\x47\xd9\x09\x8b\x58\xb7\x69\x71" - "\x49\x8e\x57\xb1\x0d\x99\x72\x6f\x31\xee\x39\x5e\x97\x05\xd7\x66" - "\xfc\x8e\xe2\x77\x04\xbf\x13\xf8\xb5\x9f\xa1\x4d\xdb\x70\x3d\xdc" - "\xeb\x5c\xb7\x54\xb7\x57\x06\x78\x68\x5d\xb9\xce\x43\xb0\x2f\x0e" - "\xab\xf1\x6d\xdd\xc1\xb6\xa0\x94\x9f\x7e\x9e\xaa\xba\x34\xc0\x53" - "\x1c\x6f\xb4\x8d\x7d\xba\xd6\xe1\xfd\x65\xb9\x56\xc9\x6b\x26\xd7" - "\x31\xdd\x4e\xd3\x86\xfd\x0d\x7b\x44\x0b\xc7\xca\xc1\xb5\x19\xfc" - "\xd2\xa2\xe2\xd3\xac\x4f\x47\xbe\xb1\xa8\xe3\xa8\xaa\x43\x7b\x1e" - "\x25\x8e\xf3\x37\x5c\x4e\x69\xcf\x0c\x0b\x30\x26\xf3\x3d\x5f\xb5" - "\xbd\x53\x93\xf6\x8d\x37\xc3\xc0\xbb\xf5\xad\x5a\x1d\x1c\x4f\xdb" - "\x51\xef\x94\x73\x29\x39\x77\xe6\x35\x62\x53\xc2\xbd\x02\xf8\x9c" - "\x0f\x27\x3e\xde\x21\xe3\x5f\x3a\x2e\x43\x47\x7c\xeb\x5b\x9e\x72" - "\x99\x3f\x81\xd7\x90\xe7\xdb\x44\x98\xe3\x90\x87\x13\x9f\xed\xe0" - "\x72\xc2\x7c\x6f\x71\x78\xd7\x88\x5c\x65\x33\x70\xdc\xc1\xf5\x07" - "\x35\x98\x01\xa6\xed\x19\x5a\xf7\xa8\x9a\x87\x6f\xda\xa6\x6c\x89" - "\xf5\x87\x75\x5f\x4b\xc8\x68\x26\x9e\x9b\x75\x1d\xe0\xa5\xf5\x2e" - "\xcd\x2f\xce\xad\xb5\x3f\xa8\x3d\x1f\xd1\x70\x4c\xe0\x58\x28\xc0" - "\xbf\x9d\xfb\x0e\xf6\xca\x11\xdc\x9f\x00\x7d\x5a\x14\x7d\xca\x65" - "\x9c\x03\xd8\x4d\xfc\xfe\x04\x7f\xef\x06\xef\x4e\xa8\x38\x23\xeb" - "\x73\xb8\xcd\x03\xbe\xb3\x75\xb9\xc0\x75\x32\xef\x31\x43\x96\x8e" - "\x78\x2e\xb1\x7c\xae\xcf\x06\xbc\x26\x5d\xef\xb0\x9e\x29\x0a\x41" - "\x4e\xe5\x7c\xaa\xbc\x54\xd7\x37\x03\x7c\x50\xee\x88\xa7\x4b\xe2" - "\xf5\xbb\xa2\x7f\xf9\xdf\x84\xf3\xf9\x66\xe0\xd4\x24\xfb\x80\xe3" - "\xb1\x5e\xea\x9f\xb7\xf5\x29\x1d\x59\x7e\xa2\x7f\x8e\xa9\xe1\xc1" - "\xb1\xdd\xbd\x8c\xdb\x65\xb9\xef\xaf\xe9\x8d\xf2\xa0\xae\x37\x74" - "\x38\xa6\x04\x11\x36\x95\xe3\x9f\x6b\x72\x31\xef\x91\xf0\x78\x29" - "\xed\x11\xc0\x19\x79\x51\x9d\x81\x0b\x57\x4f\xc6\x9c\xb6\xfc\x30" - "\x7f\xf3\x4d\xda\xb4\xce\xe7\xff\xf7\x80\x2e\xda\x50\x10\x09\x53" - "\x98\x27\x17\x33\x5c\xd6\x47\x6c\x93\x14\x85\x8c\x1c\x87\xa6\x58" - "\x1b\x5f\xa0\x83\x37\x38\x74\x5c\x41\xc3\xe3\x3a\xbe\xda\x37\xc7" - "\x8e\xa3\x1e\xef\x82\x50\x1f\xfb\x82\x37\xab\xfe\xdc\x24\xf5\x0d" - "\xde\x1d\x42\xd9\xa3\x5e\x7a\xde\xac\xc9\x50\x0b\xca\x1f\x3a\x56" - "\x39\x1b\x79\x36\x74\x68\xfe\xcc\xed\xe8\xdf\x13\x03\xbc\xbf\xae" - "\x35\x62\x9d\xe7\x84\xea\xc3\x19\x8e\x53\xb4\xd1\x12\x91\xae\xf5" - "\xed\xb1\x02\xa4\xb7\xaa\x35\x93\xc9\x56\x55\x7e\xa3\xf2\x5d\xd5" - "\x70\x64\x5d\xc0\xe7\xf5\x58\xc6\x25\xed\x65\x1f\x6f\x2c\xd0\xc7" - "\x0b\xc0\x3a\x2c\x69\x3e\x4a\x1c\x65\x3a\xa9\x78\x1f\xcf\x5f\x52" - "\x74\xda\x58\x1e\x45\x7b\x1e\x37\x51\x0f\xd3\x69\xe4\x16\x11\x1e" - "\xe9\x4f\x10\x45\x1b\x8c\xc4\xf2\xc2\x32\xce\x7b\x83\xe0\x0f\x69" - "\x57\x29\xba\x6d\x3c\xa2\xd3\x4d\xef\x3b\xa6\x93\x97\x36\x66\x32" - "\x6d\xa3\xdb\x38\xac\xfd\x94\xde\x76\xd0\x94\x63\x9a\xe2\xb9\x45" - "\x93\x8b\x16\xf7\x68\xf6\x1d\x59\xf7\x87\x63\xc6\xbb\xe9\x58\x79" - "\x0e\x29\xda\x6e\xb2\x78\xa9\xac\x3c\x62\x5e\x72\x9c\xe9\xcb\xb2" - "\x02\x3c\x17\x6b\xb1\xb7\x8e\x2b\x3f\xa6\x75\x2d\xa2\x7a\xf2\x62" - "\x29\xcb\xeb\x64\x8c\x14\x8e\xdb\xdb\xce\x34\x62\xbd\xc8\xb2\xc4" - "\x32\xc0\xf2\xa4\x68\xb4\xa9\x2c\x82\x46\xcd\x4c\x1f\x8d\x4e\x87" - "\x63\x74\xf9\x32\x6b\xe9\x74\xa5\x8b\xad\x99\x19\x4b\x27\xc9\x40" - "\x37\xd6\xfb\x67\x4d\xb5\x16\x4c\xcf\x28\x2f\xc9\x9a\xaf\x2e\xb3" - "\x0a\xf2\xf9\x3a\x3c\x7a\x5e\x67\x45\x3d\x27\xa3\xe7\x86\x5b\x4a" - "\x94\xfe\xd8\xe4\xf7\x26\x98\x25\xdf\x70\xdc\xd9\xaa\x95\x44\x21" - "\xe0\xbd\xeb\x0c\xfa\xd4\x9c\xc3\x71\x9e\xdd\x0b\xca\x89\xe3\xa2" - "\x7f\xd1\x80\x77\xf5\x48\x1f\x69\xe3\xef\x23\xfc\x45\x84\x53\x72" - "\xe4\x7a\x9f\xa8\xce\x70\xfb\x52\xf6\xd6\xe2\x57\xec\x4b\x99\xda" - "\x3e\xe7\x76\xbb\xe8\x75\x56\xe4\xeb\xed\xe2\xb5\x1d\xcc\xcb\x82" - "\x0b\xca\x45\x88\x69\x54\x54\xce\xb1\xc8\x01\x3b\x91\xd7\x76\x2a" - "\xd0\x7e\x5b\x93\x9a\xbf\x56\x80\xff\xd7\x69\xf6\x0c\x15\xe0\x19" - "\xf6\xdf\xdd\x72\x8d\x2b\xec\xb4\xc8\x18\xe6\xe1\xad\x77\x3c\x8c" - "\xf9\x40\xb1\x0e\x13\xb0\x86\x2a\xbf\x07\x05\xef\xab\xfa\xd5\x86" - "\x6b\xee\x4e\x36\x25\xa8\xb8\x90\x90\x71\x47\x83\x21\x5c\xd8\xef" - "\x27\x83\x77\x23\xb7\x98\xd9\x8f\xa6\x10\xbc\xe7\xe0\x3c\xfa\xbb" - "\x2a\x67\xd8\x5b\x65\x08\x07\xd0\x8f\x66\x65\x3f\x77\xb3\xfe\xc4" - "\xdc\x75\xf3\x34\x7d\x5c\x93\xe3\xa1\x81\x1c\x6a\x3e\xb3\xf9\x09" - "\x2e\x77\xc1\x69\x24\xe8\xec\x96\x5b\xd3\xe4\x1c\x25\x10\x76\x26" - "\x90\xf2\x65\xde\x7c\xa7\xae\x63\x79\xbf\xd4\xb4\x45\xf8\x78\x8d" - "\xd8\x14\x14\x3e\x19\x6b\x9f\xc7\x0e\x3a\x43\x9e\x8a\x5e\x87\x47" - "\x7e\x83\x93\xbf\x2b\xe2\xd7\xc6\x8d\x90\x1a\x37\x50\xbf\x2f\xf1" - "\x8e\x62\x8c\x0f\x09\x67\x08\xb6\x2e\xf0\x67\xda\xf0\x5e\x4b\x18" - "\xb4\xf2\xf0\x38\xc9\xf4\x49\xe5\xf8\x31\x66\x3e\xe3\x51\x68\x0a" - "\xa2\xcd\x91\xed\x32\x84\xbd\xbb\x9c\x68\x97\x01\xed\x2a\x3f\xcb" - "\x32\x13\x60\xdf\x24\xc8\xdb\x28\x19\xcf\x5a\xce\xcf\x2b\xad\x91" - "\x6d\x64\xfd\xaf\xda\x50\x39\x33\x5e\x1b\x85\x81\xdb\xc8\x34\xa8" - "\xbc\x51\x93\x37\x89\x27\xeb\x8f\x6e\xda\x7c\x62\xe4\x16\xf6\x09" - "\xca\x09\x42\xbf\xcd\xe2\x3e\xc4\xf8\xe9\x62\x3c\xe3\xf5\x17\xc3" - "\xd3\x60\x79\x4d\x5b\x1c\xc5\xc0\xe5\x50\x7c\x7a\x57\xb6\x5e\x9d" - "\xde\x95\x3f\xe6\xf2\x8c\x07\xef\xef\x98\x82\x06\xe8\xe0\xbd\xc5" - "\x98\xaf\x6d\x8f\x57\xef\xc8\x2d\x8d\x8c\x57\xdc\x77\x82\xe5\x45" - "\xd3\x41\xe0\x43\x01\x39\x11\xac\x93\x7a\x9d\xf6\x3c\x5d\x1f\x99" - "\x12\xac\x89\x52\x3f\x18\x84\x2b\x1e\x0c\xd3\x16\x17\xef\x73\xcd" - "\x42\xfd\x71\xdf\x87\xf9\xdb\x1d\xae\x9c\xae\xf0\xd6\x6f\xde\x6a" - "\x4a\xa0\x7b\x7d\x89\xdf\x1c\x6e\x2a\x0f\xa6\x33\x0d\x01\xb3\x1c" - "\x72\xfc\x08\xcf\x53\xd5\xda\x88\x1d\xf6\x7f\xb5\x8c\xcf\xe4\x4b" - "\xc9\xe9\x52\xfb\x46\x76\x8c\x7f\xb5\x56\x7d\x6d\x1e\xcf\x9d\x5e" - "\xfa\x5b\x89\x92\xcb\xaf\xbf\x2e\x6a\xa6\xd6\x85\x9d\x26\x61\xdd" - "\x68\x82\x1d\xe9\xd8\x1c\x16\xfc\x3d\x87\xa9\x75\x03\x7c\xa2\xfc" - "\xa5\x74\x3e\xe9\x75\x3a\xd2\xe3\xf3\x80\x63\xce\xd5\x79\xc0\xf1" - "\x35\x7e\xcf\x74\x57\x73\x15\x47\xa9\x6e\xa7\x88\xad\x5f\x7f\xdd" - "\x5a\x29\xeb\x27\x55\x37\xd3\x24\x97\xf7\x8c\xf2\x41\x17\x07\xf2" - "\xd6\xea\x7a\x80\xf9\xc5\x14\xe2\x6f\x5d\x90\xe4\x69\xbc\xc3\xb8" - "\x52\x96\xa4\xd6\xc1\xbf\x53\x28\xbf\x5f\xe9\xdc\xe4\xf2\xd9\x4b" - "\xf6\xf1\x77\x5a\xfd\x29\x93\x97\x22\x4f\x87\x97\x9a\xd5\x7e\xab" - "\x79\xf2\x62\xe8\xec\xe2\xdd\xca\x1f\x3a\x49\xc6\x8b\x82\x4c\x73" - "\x8c\x28\x96\x6b\xa4\xa5\x01\x6f\x8e\x17\x85\xf9\xce\x16\x73\xff" - "\xb8\xe4\xcc\x85\xae\x10\xd2\x16\xc3\xb8\x34\xa6\x07\xb4\x7b\xd5" - "\x10\x3e\x78\x69\x92\x85\xb8\xcd\x97\xb6\x8e\x3e\xf8\xc3\x89\x64" - "\xfc\x7f\x2c\x4f\x91\xed\x2e\x4a\xdb\x72\xb7\x91\xfe\xcf\x14\x32" - "\x30\x1d\xbc\xb4\xc5\xaa\x68\xb7\xa5\x58\xef\x1f\x2f\xd9\x8f\x4b" - "\xdd\xb9\xf5\xf1\xae\x05\x41\xf1\x85\x5a\xe7\xde\x02\xfd\xf7\x5c" - "\xad\x7a\xbf\xa9\x2b\x76\x0d\x88\xed\x79\xeb\x8a\xb5\xd6\xa5\xab" - "\xd6\xaf\x1c\x3b\x36\x6a\xae\x64\x54\xdf\xc5\xdd\xb2\x5b\x8d\xa7" - "\x5b\x8e\xeb\x78\xb3\x5d\x82\x67\xb4\x7f\xd3\x15\xb1\xec\xf3\x8b" - "\x34\x37\xf7\xa2\x6c\x1a\xb8\xbf\x93\xf2\xef\x8c\x78\xfc\x16\xe5" - "\xdf\xf5\xad\xa2\x87\x97\x2d\x59\xba\x21\x22\x75\x72\xe4\xba\x61" - "\xd5\xeb\xa8\x3b\x71\xf4\x7d\xd0\x15\x09\xf3\x37\xf1\xd8\xe2\xfc" - "\xa0\x32\x28\xfe\x0a\x7d\x3d\x05\x32\x56\xd4\x5a\x16\xa4\x56\xe8" - "\x32\xf1\x75\xd6\xe1\xc3\xd4\xd9\x4e\xd8\x53\xe0\x2d\x13\xda\xee" - "\x83\x5d\x77\x91\xd7\x67\x50\xee\xb3\xb6\x5a\x8e\xe9\x3c\x55\x8b" - "\x57\xef\xac\x43\x7a\x0a\xae\x9f\xe0\x3a\x14\xd7\xdf\x59\x57\x62" - "\xde\xc3\xbe\xf4\xeb\xd8\x97\xde\xf9\x8e\xf4\x07\xf2\x3b\x88\x7d" - "\x82\xf0\x7e\x11\xdb\x20\x5e\xda\x6a\xe4\x75\x70\xce\x8b\xb4\xfd" - "\xd6\x67\x28\x9b\xaf\x42\xee\x0d\x3a\xeb\x44\xf5\xd4\x0e\xb1\xaf" - "\x90\xbf\xb7\x96\x7e\x9a\xb6\x26\x24\x26\x7c\x46\x89\x96\xa4\xe4" - "\x5e\xe7\x56\x94\x5d\xb9\x88\xe9\x34\xd8\xb7\x68\xe5\x37\x80\x63" - "\xec\xc3\x01\xdb\xf0\x47\x24\xed\x5b\xcd\x9e\xab\x97\xe3\xc2\xd6" - "\x45\x11\x36\x1d\xef\x4d\x0f\x57\xf6\x89\x08\x29\xfb\x74\x6b\x99" - "\x2e\x07\xb8\x77\xe8\x7c\x1a\x15\x5f\x6f\x65\xd9\xb2\x35\xcb\x96" - "\x5a\x33\xd6\x0e\xa7\x88\xe8\x7a\x25\xcb\x56\x5a\xd7\x2c\x5b\xfd" - "\xfc\xb2\xb5\x32\x32\x1e\xbf\x8d\x1a\xf3\xd3\x44\xea\x3d\xc9\xfa" - "\xb9\x2f\xeb\x68\xa6\xef\xd6\xcf\x39\x26\x9b\xa8\xb9\x67\x07\xfb" - "\xee\xa8\xf9\xc6\x5b\x1d\xd1\xf3\x8d\x17\x54\xdc\x09\xd7\xd4\xe3" - "\x6a\xae\xf3\x82\xfc\x8e\xf5\x29\xda\xe6\x1a\x88\xff\xbe\x6d\x26" - "\x68\x69\xd0\xe8\x76\xb1\xd7\xb9\x6d\x8a\x4e\x37\x2f\xbd\xe0\xd6" - "\x6c\xa9\x6e\xa9\x3f\x30\xc6\x42\xff\x45\x8d\xaf\xea\x1b\xb4\xdb" - "\x38\x2e\x47\xa2\x5c\x4f\x4e\x99\xca\xf3\x0d\x03\xc3\x44\x7d\x6e" - "\xf4\xcf\x71\xe8\x4d\xd6\x6f\xdb\x75\x78\xa8\x33\x93\xeb\xd3\xe6" - "\x41\x37\x9d\xa1\x17\xe4\x9a\x73\xd8\x35\xb5\x85\x75\x0a\xc7\x10" - "\x09\x57\x03\x8e\xdc\xa3\x7d\xc1\x2d\xd7\x61\xf9\x1b\x04\x80\xc5" - "\xeb\xc0\xd0\x73\x27\xf9\x7b\xc5\x9c\xa6\x62\xc3\x6d\xdd\xc1\x6b" - "\xcf\xa8\xab\x19\xf8\x07\x06\xce\x36\xbc\xe0\x66\xbb\x93\xe1\x7a" - "\x69\xdb\x51\x86\xa7\x62\xdf\xbd\x30\x06\xbc\x93\x3e\x60\x3f\xbd" - "\x50\x1c\x31\x2f\x63\x7c\x24\x9e\x7e\xe0\x22\xe3\xac\x2a\x5f\x53" - "\xd9\x6e\xd6\x9f\xbb\xb5\xb6\xeb\xed\x01\x3c\xe8\xbf\xad\x66\xdd" - "\x6f\xc2\xab\xb5\x9b\xf1\x63\xdc\x23\x71\xd6\xf0\xad\x65\x7c\x51" - "\xee\x40\x84\x6c\xf3\xba\xcc\x10\xa4\x1d\x19\xf0\x61\xdf\x46\xb1" - "\x7a\x63\xd5\x4a\x6b\xe9\x8a\x95\xcf\x16\xad\x5f\xf2\xec\xb2\xa2" - "\xe7\x6d\x59\xd6\xe7\x57\x3e\x55\xba\xea\xe9\x67\x99\x6b\xd6\x96" - "\x3d\xff\xf4\xb3\x56\xd6\x2c\x45\xb3\xf3\xf3\x8b\xee\x7b\x64\xe1" - "\xa3\xc3\xe9\xbe\x25\x48\xc3\xcc\x3f\x3f\x3b\x4b\xbd\x7a\x78\xce" - "\xac\xef\x15\xcd\x5a\xf0\xc8\xfc\x45\xf2\xd0\x4b\xff\xfb\xd9\x2b" - "\xe3\x67\x88\xe2\x43\x33\x78\xa9\x19\xfd\x3b\xe4\x14\xbd\x34\x4d" - "\xc5\x4b\x7f\xb1\x34\x3a\x5e\xfa\x8b\x40\xfa\xc5\x46\xfc\x8e\x12" - "\xfd\xd0\x87\x1f\xb4\xfb\x4b\xd9\x8a\xbf\xae\x7b\xb2\xd7\xf9\x62" - "\xed\x00\x7f\xbd\x24\xcf\x52\xb2\x9f\x92\x5a\x9f\x7d\x11\xfa\x7f" - "\xeb\x91\xc8\x77\x03\xf3\xc9\x17\xdb\xfb\xe7\x93\xfd\x3a\xe5\xc5" - "\xfe\xb9\x25\xd2\xda\x31\xaf\xbc\x8e\xe7\x95\x6a\x3d\xe9\xa5\xe9" - "\x92\xa7\x06\x95\xef\x24\xd2\xe7\x95\x2c\xdb\x72\x4f\x4a\xce\x3f" - "\x7e\x38\x25\x52\xc6\xe5\x9a\xbe\x26\xe3\x5c\x4e\xae\xdf\x99\xdf" - "\x6a\xe6\x35\x6d\xd8\xc7\xcd\xb0\x15\x30\x7e\xf5\x0a\x91\xf2\x56" - "\xb3\xc2\xe9\x87\xe5\xbc\xc6\xcd\x76\xb3\xc6\x4f\x23\xcf\xd0\x0f" - "\xdf\x13\xce\x17\x5a\xd4\x9c\xf2\x85\x10\xeb\x75\xb1\x75\xf4\x7d" - "\xec\x5b\xc4\x73\x27\xd4\x79\x68\x80\x67\x5f\x9a\xc6\xbc\x30\x30" - "\x97\xfd\x61\x94\xfe\xef\x91\xdf\x25\xfc\xe1\x49\x3d\xde\x43\xd9" - "\x58\x32\x18\xc7\xba\x68\xb7\x41\x40\xdf\xfc\x70\x07\xd7\xc1\xf4" - "\xf4\xd2\x8b\x07\x91\xd7\x38\x40\xbf\xed\xe6\x7e\xfa\x69\xeb\x2c" - "\xfa\x1a\x8b\xc2\xfb\xa5\xe9\x83\xd1\x2a\x3e\x9d\xb6\x17\x7f\x29" - "\x9d\x9c\x34\x84\x65\x52\xa7\xd7\x95\xb4\xda\x7e\xe0\x4a\x5a\x6d" - "\xbf\x38\x40\xab\x17\x6f\xbe\x92\x56\xdb\x3b\x22\xf6\x95\xb4\x75" - "\x94\x97\xa6\x33\xcd\x98\xc7\xd0\xee\x1d\xe0\xb3\xda\x01\xfa\xbd" - "\x94\x74\x25\xfd\x5e\x1a\x13\x9f\x7e\xdb\xf9\x7c\x55\x24\x9c\xfa" - "\x78\xe3\xc6\xc8\x2d\x06\xed\x3c\xd8\x4b\xd5\xfc\xad\x7b\xc6\xe3" - "\x15\x43\xb8\xe4\x15\x27\x7e\xb8\xf2\x3c\x62\xc0\x16\x17\x01\x8d" - "\xbe\xae\x66\xcc\x79\x79\x5d\xe9\x2a\x63\xd1\x49\x7d\xcd\x03\xf7" - "\x1d\x3c\x77\xe6\x6f\x42\x71\x3a\xd3\x93\xbf\x31\x06\x7e\xef\x50" - "\x76\xe9\x4b\xfd\xdf\xff\xe8\x99\xf8\x60\x76\xe2\x16\xb2\x1e\xab" - "\xbb\x8b\xd3\x03\xe0\xa1\x3c\x4e\x67\xdf\xad\xc1\x60\x16\x85\x72" - "\x29\x3e\xdc\x1f\xf5\xf3\xff\x60\x67\xa2\x63\xf4\x51\xc9\x92\x95" - "\x4b\x57\x2d\x5f\xfe\xe5\xaa\x28\x72\x5f\xcd\xe5\x0c\x6f\xef\xe5" - "\xef\x6e\x6e\x7d\x66\x23\xea\x84\xfd\x6f\xeb\x52\xe3\xe6\x8f\xa0" - "\xff\x56\x34\x2b\x5b\xf2\xf1\x2e\x75\x0e\xfc\xe5\xb4\x08\xfd\x0c" - "\x1e\x79\xd9\x2a\x9c\x3f\x5a\x3c\xd0\xc7\x3f\xea\xbe\xb2\x8f\x5f" - "\xa6\xf8\x7d\xfc\x72\x7a\x78\x1d\x9f\xc3\x79\x19\xf3\x9f\x35\xd2" - "\xd6\xe4\x67\xf6\x83\xc0\x9c\xb9\x0b\xf3\xe5\xee\x05\x1b\xdc\xf7" - "\x16\x6d\x48\x90\x7b\xc5\xfc\xed\x95\xe0\x25\xd1\xc9\xbe\x08\xbc" - "\x3f\xc6\xdf\x5e\xe1\x6f\x2e\xf1\xf7\x3f\x65\x1e\xdc\x57\x9d\x26" - "\x39\x77\xc4\x7b\x6b\xc3\x69\xf9\x7d\x6c\xd8\x0a\x2f\x3b\x74\xdb" - "\xda\x04\x93\x91\xcf\xa7\xef\x52\xfd\xd1\xc1\x7d\xc1\xf5\x15\x6d" - "\x70\xab\x3a\x2e\xf1\x77\xd5\xc8\xa4\x6c\x88\x97\x8f\x5c\x75\xed" - "\x3e\x65\xaf\x63\xb0\xbd\x4a\x61\x70\x0c\xeb\xdf\xab\xd4\xbe\x43" - "\xcc\xb2\xcf\xfe\xa3\xbd\xce\x1d\xe6\x58\xff\x53\xe5\x3b\xb4\x23" - "\x53\xf7\xc9\xaa\x92\x3e\x50\x64\x62\xfd\xc9\xf3\x9c\xd3\xb4\x23" - "\xbf\x41\x8e\x97\x3b\xf2\x23\xf7\x38\xad\x1b\xb7\x0c\x3d\x47\x2f" - "\x5f\xbc\xca\xbe\x69\xf2\x80\xef\xab\x63\x18\xca\xef\xe8\xf7\x11" - "\x73\x3a\x86\x35\x44\xe0\x86\x77\x07\x23\x7c\x15\x7d\x3c\x1e\xf3" - "\xfc\xb1\x41\x7d\x57\xd5\x07\x1c\x5a\x91\x86\xf9\xc4\x4e\x19\x8f" - "\x70\x7d\x90\xc6\xd8\x66\xf0\x37\x7b\x76\x5c\xd4\xe6\xa1\xdd\xd6" - "\x4a\xc6\x67\xc7\xab\x0c\xd7\x8b\x7c\x42\xee\x07\xec\xa4\x7e\x9c" - "\x23\xea\xd3\x61\x2b\x9a\xec\x4c\xd7\xf1\xf2\xd2\x0e\x19\x3f\x85" - "\xbf\x73\x1d\xd9\xa6\xf2\xe5\x2b\x8a\x6c\x25\x1b\x8a\x56\xac\x5c" - "\x51\x36\x9c\xca\x97\x3c\xbf\x62\x12\x92\xac\x4f\x97\xac\xb0\x15" - "\xad\x90\xd1\x8a\x65\x20\xe4\xb2\x0d\x36\xde\xfb\xb8\x62\x0f\xde" - "\x2c\x6d\x79\xc3\xce\x69\x6a\xbc\xdf\xb9\x5b\xe7\x53\xf9\xed\x6f" - "\x51\x48\x03\xbe\x57\xf2\x9b\xc1\x89\x68\xe7\xc7\xcc\xc3\x2a\xbe" - "\xcf\xae\x0e\x65\x5f\xec\x6c\xb9\xd2\x27\x6b\xa7\x57\xf7\xc9\x02" - "\x7f\x9b\x59\xd6\x23\x60\x81\xff\x77\xd1\x95\x65\x76\xa5\xf5\xfb" - "\x77\x6a\xdf\x1d\xe7\xbe\x92\xf1\xee\x6b\x58\xdf\xee\x7c\xd0\x53" - "\x3e\x87\x63\xf6\x6a\x72\xb5\x6b\x76\x04\xbe\xd2\x97\x97\x61\xf1" - "\x39\xa9\x49\x81\x48\x5f\xb6\x5d\x9f\x60\xec\xb5\xe8\xf5\x58\x37" - "\x19\xa0\xef\x76\xbd\xe6\x37\xb8\x13\xa5\xff\x31\xca\x01\x96\x4b" - "\xf7\xa3\xf1\xf6\xb7\x6b\xd7\x81\x58\x1c\x81\xfb\x58\xa4\x1f\x1d" - "\xf0\x13\xdc\xe5\x60\x18\x48\xc3\xf8\x5f\x95\x15\x99\x16\xd9\x4f" - "\x33\xe7\xe4\xc3\x80\x5e\xbb\x0c\x9d\x34\x6b\x49\x69\x29\xeb\xa0" - "\x25\xcb\x4a\x9f\x5f\xb3\x6a\xad\xd6\x75\x33\x97\x73\x18\x6a\x99" - "\x65\xaa\xf6\xc6\xba\x72\xd9\xb2\xa5\x2a\x49\xeb\xc8\xe8\x3d\x2b" - "\xe5\xc7\x50\x85\xf9\xff\x8e\x92\x01\x5b\xb1\xaa\x51\x18\x76\x75" - "\xe2\x77\x5e\xea\x1f\xd9\xaf\x55\xa5\xd1\x73\xb4\xaa\x0a\x5d\xf6" - "\x65\x3f\xdb\xd9\xe7\x2c\xe7\xd1\x1e\x21\xf7\x78\xd0\xaf\xae\x3f" - "\xa0\x9d\x43\xbc\xe4\xe2\x33\x5f\x09\x11\x70\x0e\xf7\xd3\x7b\xeb" - "\xe3\x1d\x5b\x95\xcf\x84\x91\xbf\x59\xcb\x31\x25\xf0\x1e\xf3\xff" - "\x97\x4f\x2a\x3d\x59\xe5\xed\xdf\x7b\x31\x24\x62\xbe\x59\x05\xde" - "\x5f\x95\x7d\xa5\x7c\xbb\x92\xae\x94\x7b\xf6\xb5\x74\x59\x75\x1a" - "\x47\x7c\x83\x1e\xfc\xe7\xfa\x40\x5f\x33\x6e\xd0\xbe\x89\xc0\xf7" - "\x5c\x96\xe7\x15\x62\xe4\x88\x7b\xd9\xaf\xe1\x14\xb9\x76\x28\x9e" - "\x72\x95\x44\xf8\x06\x9a\xcf\x90\x6b\xbb\xea\x5b\x97\x43\x97\x3f" - "\xb4\x53\xda\x72\x0c\x43\x8d\xeb\x55\x43\x14\x7f\xb9\x0e\xe8\xb4" - "\xe5\x39\x3c\x9e\x0f\x0f\xd8\x41\x55\x8b\xa4\xbf\x88\x8a\xa9\xd1" - "\xc7\xed\x07\x9c\x1c\x1d\x0e\xf2\xa2\xfd\x49\x3e\x9d\x56\x7a\x9e" - "\x48\x9e\x98\xb5\xc4\x86\x09\xf6\x8a\xe5\xcb\x97\xad\x59\xab\xc7" - "\x19\xcf\x5c\x55\xba\x54\xc5\x15\x9f\x8a\xee\x5f\x0f\x19\x9e\xce" - "\xa1\xc9\x91\xaa\x6e\x63\xec\xdd\x2c\x5e\x13\x91\xfe\xa3\x72\xce" - "\xf5\xea\x07\xf5\xda\xfc\xeb\x14\xd5\x14\x28\xff\xab\x9a\x14\x65" - "\xdb\x5e\xff\x46\xaf\xb3\xba\x4c\xb7\x6d\x79\xad\xb5\x87\x6e\xad" - "\xe5\x33\x72\x7c\x96\x60\xff\x1e\xd1\xc9\x6b\xab\xc8\x53\xab\x7f" - "\x8b\x8e\xed\xa6\x9d\x7b\x54\x0c\x6d\xf7\x4a\xf6\x15\x79\xf5\xd3" - "\x70\x75\x4e\x87\x48\x4d\x4f\x82\x7d\x96\xcc\x32\x31\xa2\x9b\x7d" - "\x78\x39\xf6\x55\x75\x27\xdb\x75\xac\xcb\xf8\x7b\x0d\x9d\x54\x7d" - "\x18\x3a\x1a\x3a\xfd\x55\xaf\x2f\x25\xa7\x63\xdb\x46\x4a\xe2\x3a" - "\xa0\xaf\xbd\xcd\x8d\x4c\xdb\x1a\xfa\x18\xba\x4c\xd3\xd9\x5e\xae" - "\xc7\x4b\xd5\x2d\x6a\x3e\x98\xd3\xad\xad\xb3\x76\x23\x1f\xf4\xff" - "\x88\x5a\xc5\xab\x19\xf6\xf1\x0e\x2a\xe7\x6f\x53\xaa\xb8\x55\x33" - "\x6a\xd1\x0e\x07\x7f\x03\x12\xb6\x20\xe6\x3b\xd5\x65\x68\x83\x43" - "\xf3\x01\x07\xaf\xd4\xb4\x2a\xdf\xfe\xea\xa5\x4c\x03\xc0\x0d\x68" - "\x70\x03\x80\x8b\xfe\xbf\x59\x8b\x97\x5d\xb3\x43\xaf\x03\xe3\x9f" - "\x0f\x76\xb3\x9b\x6d\x67\xe0\xdd\x8e\xdf\x89\x2a\xb9\x97\xee\x85" - "\xde\x37\x09\xf6\x5d\x1b\xf8\xde\x5e\x4d\xb3\x3e\x16\x72\xdd\x1a" - "\xee\xec\xb3\x94\xc4\xeb\x7c\x5a\x5d\x32\x86\xa1\x0e\x13\xcf\xed" - "\xe1\x4b\x67\x1b\x01\x33\x09\xe3\xba\x4f\xfb\xce\xda\x89\xaa\x0b" - "\xec\xe7\xe8\xc5\xb8\x7d\x8b\x28\x0a\x9a\x79\x0f\x6a\x84\xfe\x1d" - "\xbb\x86\x0b\x4c\xaf\x57\xb2\x07\xf6\x96\x50\x1e\xf4\x87\x3c\x38" - "\x3a\xe9\x95\xb9\x5c\x2f\xcb\x02\xf7\xe5\x65\xf4\x0d\xfa\xc7\x2c" - "\x2e\x9d\x6d\xb2\xae\xa4\x11\xa7\xe9\x95\xe7\xb8\x8f\x78\x3f\x98" - "\xfd\x0f\x91\x66\xe2\xb8\xfb\xa7\xe8\x95\x47\xb9\x7f\x18\x17\xe1" - "\x4a\xf7\x06\x7b\x0b\x1f\xe0\x33\xd7\xac\x33\x37\x57\xc0\xe6\x5e" - "\xce\xba\x64\xf7\xa7\x3c\x87\xe7\xef\x25\xf1\xbd\x7d\xa9\x08\xcb" - "\xfe\xdd\xc8\xfd\xbb\xfb\xd3\xcd\x5d\x22\xfc\x85\x93\xc4\x71\x3f" - "\xd1\x17\x06\x0a\x06\x0c\x09\x8c\xb7\xc1\x7e\x96\xcf\x85\x37\x92" - "\xa7\x7c\x3b\xfb\xb2\x25\xed\xda\x48\x66\x3e\x53\xcf\xdf\x02\x6a" - "\xf3\xd7\x51\x9b\xad\x8e\x7e\x1f\xdc\x4d\xee\x75\x1c\x1f\xe5\xd5" - "\x6d\xff\x5a\xbe\x9b\xf7\xd8\xae\xc3\xfd\x1c\xeb\xf7\x64\x5d\x63" - "\xfe\xf5\xc4\x1f\xe9\x5f\xdd\x7f\x24\xeb\x63\xf2\x39\xab\xa5\xf0" - "\xf7\xd4\x92\xfb\x7b\xb2\x77\x8a\x30\xcf\xeb\x2a\x9f\xe3\x3a\xb6" - "\x03\x56\x23\x9f\x3f\x37\x87\x7b\x2c\xc3\xd1\x7e\x23\xef\x1f\xb4" - "\xf9\x7d\xe4\x5e\xf9\x2f\x8c\xe3\x2f\xeb\x2f\x50\x92\x7b\xe5\x6f" - "\xe5\xbd\x9a\x6f\x9d\x6d\xf4\x2c\xed\x60\x9b\x32\xc8\x67\xef\x79" - "\x4f\x12\x73\x8c\x70\x15\xe3\x18\x52\x78\x83\x5e\x46\xbd\x3c\x6c" - "\x4e\xbd\xbc\x8c\x15\xb7\x9f\xe9\x01\x9c\x5a\x17\x29\x9a\xb4\x60" - "\xa4\xd0\x70\xfe\xd4\x5e\x18\x49\x9f\x57\x5a\x98\x3e\x1c\xb3\x35" - "\x8c\xfe\x02\x6e\xb9\xa0\x41\x58\xaf\x03\x38\x27\x69\x6b\xb8\x49" - "\xbb\x2e\x50\xb2\x7b\x25\x7f\x0b\xee\xd5\x3b\x4d\x05\xc6\xa4\xf0" - "\xa5\x73\x4d\x55\x17\xc9\xc8\xfd\xc6\xfb\x36\x55\xf2\x3d\xc3\x7c" - "\x35\x8d\xfb\x0c\x3c\x99\x87\x5f\x3e\x7e\x05\xcc\x77\xb8\x2e\x42" - "\x7f\x6d\x07\x0e\x87\xd0\x57\x8d\x7c\x55\xbc\x98\xe1\xe0\xb8\x24" - "\xda\x1c\x6a\x20\x1d\x72\x14\x14\xf2\x7b\xcb\x90\x99\xdd\x87\xc2" - "\x90\x23\x5e\xc3\xa9\xaf\xa1\xe4\xb0\xd3\x15\xd8\x0f\x5d\x57\x57" - "\x23\xcf\x25\x9b\x79\x5d\xf3\x75\xf9\x6d\x8d\x57\x9b\x74\xdd\xf7" - "\xa3\x51\x7c\x76\x73\xf7\x49\x03\xaf\xfb\xb8\x72\x7c\x1a\x9f\xc3" - "\x0e\x7b\x15\xfa\xff\x26\x4d\x3f\xd6\xc8\xf9\x05\xcb\xfe\x60\xf3" - "\x09\xd8\xb2\x2d\x62\x5f\x21\xf1\xfe\x4f\xf2\x16\xe1\x4b\xee\x34" - "\x89\x36\x7f\x8b\x3c\xb3\xdb\xe6\x0f\xc9\xfd\x1f\xbc\x4f\x98\xef" - "\xf7\x99\x60\xfb\xb6\x33\xed\xf4\x74\xde\x3b\xe2\x75\xb5\xf9\x7e" - "\xe1\x5b\xb0\xc1\xc4\xdf\xc2\x1c\x23\xf7\x0e\xb4\xf4\x36\x0b\xe6" - "\x0d\x1b\x7c\x26\x34\x34\xd8\x0f\xab\xa7\x30\x91\xe5\x0d\x79\xd3" - "\xfa\xf3\xf6\x14\x1a\xf9\xdb\xce\x5c\x67\x44\xda\x90\x05\xe5\x28" - "\xcb\x7d\xa5\xa5\x29\x9b\x79\xcf\xe1\xfe\x39\x25\x9f\x5f\xe8\xc1" - "\xb8\xb9\xb6\x30\x21\xdc\x53\x68\x08\x01\x36\x78\xdf\x2c\xbf\xc9" - "\x19\xf4\x69\xdf\xb8\xea\x82\xfc\x76\x90\xa8\xfe\x95\x17\xf9\x8c" - "\x0c\x97\x63\x41\xf0\xb7\x41\x44\xca\x7b\x25\xf1\x7d\xee\xea\x6a" - "\xdd\x95\x8f\x81\x9f\xf6\x1e\x65\x79\x0e\x99\x27\x07\xad\xcf\xb0" - "\x0d\xb3\x57\xfa\x06\x84\x20\x63\xa1\x94\xc9\xc1\x49\x5d\x94\x50" - "\x09\xbe\x55\x6b\x50\x7b\x1f\xf1\x40\x06\xed\x61\x01\x3b\x74\x6f" - "\x1e\xf3\x8d\xa9\x9b\x7d\xe5\xee\x26\xe9\x9f\x96\x5a\xeb\xf2\x04" - "\xba\xa8\xc5\xf1\x67\x6a\x09\x7a\x1c\x47\x2f\xf8\x8c\xca\x4f\xcd" - "\xc8\x70\x57\xf0\x3b\x3b\x78\xb5\x28\xd4\x48\x83\xed\x0d\xf0\xfc" - "\x18\x63\xd8\x5f\xd4\x5c\x71\xef\x51\x7d\x5e\x7c\xf5\x36\xd4\xa6" - "\x71\xfc\x0c\x21\x2c\x14\xae\x59\xe7\x02\x2e\x76\xd1\x9b\x49\x93" - "\x36\xf2\x9a\xdc\xde\x6e\xcc\x51\x72\x35\xb8\xe7\x15\x5c\xe4\xbf" - "\x0a\x5c\xe6\x99\x96\x5a\xd2\xda\xb4\xce\x11\x02\xec\x50\xea\x3a" - "\xf6\x37\xb0\xdb\xbf\xe0\x35\xdb\xd7\x1e\x45\x3d\x8e\xb6\x60\x3b" - "\x71\x1c\x9e\xfa\x30\xc6\xc7\xf3\x16\xd2\x7c\xf2\xec\xe7\xa8\x76" - "\x4e\x58\x64\x9a\x31\x5f\xe7\xfd\x18\x3b\xeb\x38\x5e\x0b\xa8\x0c" - "\xd1\x50\x0f\x46\x46\x8e\x1d\x01\x18\xf3\x3e\xe1\xbd\x2f\xe8\x89" - "\x90\xb0\x18\x3e\xb8\x84\x91\x1e\xba\x53\xc6\x92\xd8\xfa\xf5\xd7" - "\x47\x6e\xa1\x7b\x85\xc1\x24\x7d\x3a\xc3\xd5\x7b\x6a\xd1\xb7\x5d" - "\xca\x07\x70\x32\x45\xf8\xff\x25\xa2\x2e\xe9\xff\x27\xcc\x39\xcd" - "\x75\x72\xdd\x71\x32\xc6\x8b\x5a\xbf\x97\xf6\xca\xf5\xd7\x1d\x7c" - "\xc6\x43\xea\xd8\xd7\x96\xf8\x52\xd6\x30\x3e\x1c\x1f\x3a\x21\xbc" - "\x2e\xd4\x54\xf5\x77\x69\x5f\xf3\xbb\x99\x6d\xdd\xbd\x6e\xe1\x5a" - "\x53\xcc\xe7\x18\x35\xd8\xa6\x73\xf4\x5a\x8a\xa8\x5e\x53\xec\xa5" - "\xd7\x8a\x55\xdf\xc8\xfb\x2c\x7e\x1f\xec\xcb\x84\x5d\x5d\x7b\xb0" - "\xee\x32\xef\x05\xd4\x2e\x12\xce\x5b\xdc\x3d\xe6\x35\xc5\x0b\x2d" - "\x6c\x53\xbd\x56\xe6\x35\xfc\xa1\x50\x5b\x07\x94\x71\x31\x06\x9b" - "\x23\x89\x7d\x96\xe1\x1e\x00\xc1\x7c\x36\xed\x0c\xed\xfb\xfc\xb2" - "\x93\x0c\x7d\xb0\x05\x2f\x1b\xc8\x0c\xf9\x4a\xde\x35\x9a\xb2\xf1" - "\x6e\xf4\x19\x7a\xed\x77\x41\x03\xa5\xe1\x67\xf6\x7d\xbd\xe4\x3a" - "\xc0\xcd\xe5\x35\xd2\xd6\x0b\xbc\xc6\xf5\xba\x3c\xa7\x5c\xf5\x3a" - "\xa5\x87\x01\x8f\xf7\x7b\xaa\x46\x53\x3a\xaf\x53\x22\x2d\xb3\x28" - "\xa4\xf6\x3d\xf5\xb5\x88\xad\xa3\x29\x2b\xba\xde\xd7\x9a\xd4\x3a" - "\xe6\xbe\x4e\x39\xb7\xf2\xd1\x37\x30\xb7\x3a\x05\xb8\x07\x84\x33" - "\x51\x88\xaf\x5b\x0c\xca\x37\xe1\xf5\x9d\xa6\x5a\xc5\x77\x72\x9f" - "\x0f\xfc\xc6\xfb\xa8\xda\x9e\x52\x82\x8c\x07\x92\x3a\x75\x07\x7f" - "\x87\x3a\x62\x9d\xd8\x2c\xf1\xd0\xce\xf0\x87\xb6\xde\xc1\xb1\xc1" - "\xe4\xd9\xfd\xa2\x25\x6a\x3f\x8a\xcf\xf7\x7b\xe9\x75\x19\x8f\x71" - "\xc7\xeb\x94\xfc\xf2\xeb\x64\x6e\x5d\x2e\xdb\x75\x54\xc9\xa2\x91" - "\x18\xdf\xb0\x8b\xe5\x0c\x3c\x01\xbc\xb9\x3e\xe6\x8d\xb6\xe0\x79" - "\xb7\xbd\x4c\x84\xdd\xcf\xb0\x2d\xfa\x7a\xc8\xbd\xe6\x10\x2d\xe8" - "\x0c\xaa\xb3\xa8\x8b\xc9\xd7\x00\x78\x0d\xa3\xc9\x7c\x9a\xf6\x5d" - "\xe7\x29\x25\xde\xaf\xb8\xd5\xbd\xe6\x30\x60\xef\xbb\x99\xc7\x82" - "\x9d\xa0\x8f\x1a\x13\xf6\xb5\x7b\x02\x1d\xd4\x0a\xf9\x9e\x6f\x13" - "\x12\x0e\xf2\x3c\x22\xdb\xbb\xcf\x62\x2d\x52\x31\x18\x64\x5b\xfb" - "\xf7\xf9\xb4\x76\x78\x2e\x48\x78\x25\x1e\x70\x89\xde\x26\x9d\xd6" - "\x8a\xbf\xf6\xbd\xe9\x5e\x73\x80\xb8\x7f\x38\x3f\x9e\x77\x7b\xba" - "\x91\xf7\x6c\x74\xbf\x70\x1e\xbc\xfb\x04\x70\xbf\x3d\xb0\x57\xcd" - "\x7b\xa8\x03\x79\xea\x5e\xe7\xf3\x68\xaf\x27\xed\x03\x8d\xd4\xda" - "\xfe\xbe\x3b\x19\x57\xf4\x5d\xb6\xa7\xec\xcf\xf1\x7d\x52\x21\xfb" - "\xe0\xfb\x2d\x6d\x72\xcf\xae\x6e\xec\xfc\x60\x58\x28\x7d\x56\x77" - "\x22\x0c\x3d\xe0\xc5\x95\x75\x81\xd4\x27\x13\xd9\x0f\xa8\xee\x4f" - "\xa6\x04\xd5\xbf\xdc\x16\xb6\x57\xe2\xf5\x71\xc4\x7e\xa2\x99\x71" - "\xd5\xfb\x98\xbf\xe1\x18\xe6\x3d\x61\xf6\xb7\xef\xb3\x90\xe2\x3f" - "\xe1\x02\xdc\x4f\x94\x1c\x4d\xce\xd5\xe2\x1a\xe4\xf6\xa4\xdc\x9d" - "\xc4\xe7\x23\x75\xdf\x60\x91\x72\xb7\xb1\x48\xf9\x73\x5b\x58\x47" - "\x35\x18\x84\xc6\x9b\x75\x27\xb4\xb2\xd3\x94\x4f\x46\xdd\x6e\x94" - "\x9f\x16\xb7\xbd\x89\xd0\x3b\x4e\xa8\x69\xb4\x87\xed\x48\x01\x5d" - "\x85\xf1\x60\xa8\xc7\x7f\x59\xfb\x7e\xe6\xfe\x87\x60\x53\x0f\xe5" - "\xf3\x51\x3a\x6e\xd7\xb6\xf7\xb7\x7f\x8c\x9a\xdb\xec\x5f\xac\xaf" - "\x2d\x09\x33\x68\xec\x34\x09\x3e\x2b\xc9\xe7\x5d\xfc\x29\x75\x8d" - "\xbe\x94\xb7\xda\x95\xdc\xec\xdf\x06\x3b\x55\xea\xdb\xa2\x00\x39" - "\xb8\x5d\xbc\xb7\x8b\x79\xd3\x50\x6e\x33\xe0\x60\xfe\x63\x9b\xa6" - "\xc6\x73\x05\x7b\xd0\xb5\x1d\xbd\x6d\x68\x93\x6c\x1b\xda\x28\xdb" - "\xa6\x7d\x5f\xea\x34\xd5\x8f\x95\xeb\xe5\xd7\xd6\x1e\x15\x5f\xc6" - "\x55\xd7\xc8\xdf\xce\x3d\x4d\x0d\xef\xcb\x33\x30\xe8\x13\xb5\x0f" - "\x52\x5f\x26\x86\xbf\x3c\xfc\xda\x60\xd6\xe7\x2a\x98\x6f\xb5\xbf" - "\xca\xb1\x28\xb5\x6f\xd4\x01\xf6\x8f\x45\xf5\x5b\xf2\x1c\x40\x0f" - "\xea\xe3\x6f\x7c\x0e\xe8\xa1\x86\x74\xee\xab\x89\x87\x28\x57\xf1" - "\x61\xc3\xd7\x78\xad\x59\xcd\xf3\xea\x8f\x43\xf7\xee\x50\x73\x2a" - "\xdd\x8f\x3c\x41\xfa\x91\x47\xea\xd8\x6b\xc4\x51\xea\x3b\x91\xba" - "\x27\x17\xf7\x47\xe4\x59\x49\xe0\xbb\x3e\xa8\xeb\xbf\xfa\x23\xec" - "\x93\xd4\xef\x0f\xb0\x01\xbc\x52\xa9\xce\x91\xf7\x3a\x1b\x0a\x75" - "\x1b\x45\x7e\x93\xcc\x29\x8e\x73\xbe\x05\x1b\xce\x4b\x7f\x81\x2a" - "\x19\xf3\xe0\x8c\x76\xce\xae\xe1\x39\x6d\x5d\x23\x93\x7d\xf8\x51" - "\x76\xb7\x97\x3e\x96\x67\x02\x99\x06\x5c\xb7\xc4\x5d\x7e\x17\xac" - "\xa1\x69\x60\xdf\xa7\x5e\x7e\x37\x5d\xf9\xb5\x36\x1c\xd7\x79\x04" - "\xed\x1d\xaa\x62\x83\xd6\xdf\x79\x2c\x8b\x24\x0f\xf4\x08\xcb\xf0" - "\xdb\xea\x98\x27\x1b\x7c\x91\x74\x5a\x10\x0c\xdb\x95\x0e\xaa\xef" - "\x10\x52\xd6\xeb\x3b\xbe\xdc\x9e\x68\x9c\xa3\xdb\x22\x8a\xce\x66" - "\xe8\x97\x37\xcc\x92\xd6\xae\x0c\x2b\xc7\x68\xd9\x54\xc9\x31\xa7" - "\x7e\x3c\x84\x63\x7b\x05\x5d\x19\xb9\x21\x3e\x93\x89\x71\x36\xec" - "\xca\x28\x38\x6d\x23\x43\x91\x8d\xf7\xba\xd6\x64\xf3\xfc\x4a\xd8" - "\x61\x0b\xa4\xc2\x3e\x81\x9c\x6f\x5e\x41\xa6\x27\x4a\x00\xdb\x9e" - "\x99\xc6\xb1\xb7\x38\xee\x16\xc7\xce\x0b\xd9\x33\x53\x71\x3f\x0a" - "\xf6\x9c\x59\x98\x33\xb2\xd9\x5f\x26\xe4\x14\xd0\xc7\x27\x39\xfe" - "\x97\xc1\xe3\x0b\xd0\xe6\xb3\x94\xc4\xb1\xbd\x82\xd5\x6b\xf2\xda" - "\xfc\x9f\xca\xb9\xc5\x48\x1b\xec\xe9\xb0\x3c\x97\x63\x09\xa7\xac" - "\xc9\xc6\x18\x9f\xa3\xda\x7d\x5e\xa8\x76\x2b\xbc\x19\x7f\xa5\xe3" - "\xc6\x17\x54\x4a\xdc\xff\xe9\x67\x41\xc0\x0f\xbb\xb2\xf2\x43\xae" - "\xac\x3c\x75\x96\xb3\x85\x2a\xcb\x44\x97\x07\xb6\x31\xfb\x6f\xf2" - "\x79\x5d\xf6\xc7\xe1\x36\x72\xfb\xb8\xee\x7f\xbd\x70\x56\xc6\x2a" - "\x0b\xe2\xd9\x5e\xaa\x95\xe9\x46\x99\xee\x16\xba\xec\xca\x92\x6d" - "\x6f\xf3\xab\xb2\x45\xf2\x9e\xcb\x47\xd0\x41\x6b\x73\x3f\x1d\xd0" - "\x76\x6e\x1f\xb7\x3f\xc8\x34\x01\x0d\xb4\xb6\x5a\xfa\xb4\x76\x72" - "\x1b\x7f\x8f\x51\xe7\x75\xb4\x13\x6d\x95\xed\xec\x43\x3b\x8f\x97" - "\x10\x05\x6a\xea\x9a\xbe\x48\xcd\xca\xe3\xf9\xa1\xfd\x0f\xb0\xa3" - "\x2b\x5c\x84\x79\xa0\xf1\x97\x95\x2e\xc3\x8f\x60\x9b\x54\xfa\x30" - "\x1f\xf4\x89\x2e\xb6\xf7\x3d\x36\xfc\x82\x75\xf2\xbb\xc3\xd2\x3e" - "\xe6\x6f\xc4\xae\x46\x9b\xc2\x9f\x53\x65\x97\xe8\x82\x6d\x1a\xf0" - "\x04\x91\xa7\x04\xed\xc7\xfc\xf1\xb4\x86\x3f\xe7\xdd\xfc\x77\xd5" - "\x2e\x53\x29\xa5\x7d\xf4\xd8\x76\x83\xa7\x63\x3b\xe9\x6d\x79\x12" - "\xf9\xd0\x1e\x0b\x60\x8d\x90\xdf\x65\x40\x3b\xf7\x01\xcf\x40\x44" - "\x9b\x5a\xbb\x03\x80\xf9\x27\x1a\x5e\x40\x09\xaf\x9f\x43\x3b\xce" - "\x91\xc5\x55\x09\xfb\xeb\x61\xb6\x17\x7f\xfc\xd9\xf5\x85\x94\xee" - "\xa5\xc6\x2e\xc5\x77\x32\x6e\xd0\x8d\x67\xe8\x8d\xeb\xfa\x63\x03" - "\x71\xbc\xb5\x94\x35\xf9\xcc\x47\x32\x46\x10\x8f\x19\xbd\xe0\x19" - "\xf6\xa5\x59\x8f\x3a\x7a\x33\x47\x49\x7c\x9c\x39\x84\xe7\x64\x3c" - "\xf3\x37\xa3\xd2\x78\x4d\x00\xe5\xf2\x04\x68\xc6\xf0\x61\xcf\xe5" - "\xf0\x95\x69\x18\xf7\xac\xc9\x5b\x34\x45\xa4\x4e\x96\xbe\x0c\x4d" - "\x95\x3e\xc3\x0b\x6f\x51\xd6\xb5\xe9\x94\x37\xa6\x0c\xa6\xbf\x79" - "\xdf\x82\xe1\xa1\x6d\xa9\x67\xe8\xc0\xcd\xd1\x32\x66\x95\xba\x4c" - "\xe9\xc1\x37\x3a\x79\xaf\xe0\x1a\xeb\x95\xfa\x8f\x7d\x9e\xae\xb1" - "\x5c\x97\x8e\x07\xee\x0f\x0c\x86\xfb\xb5\xd3\xe1\x40\xee\x60\xb0" - "\x76\xee\x91\xf1\xe2\xec\xbb\xf6\xb0\x3f\x62\x5d\xed\x31\x4b\x50" - "\xda\x75\xcd\x07\xfc\xb4\x76\x3f\x25\xd9\xcf\xf2\x9a\xcc\x3c\x3a" - "\x56\x97\x4d\xf5\x98\x93\x8b\x9e\xcc\xd4\x57\x2e\xb0\xef\x83\xd2" - "\x21\x6c\x93\xf2\x59\x4a\xb1\x36\xd3\x5c\xb5\x47\xb7\xe1\xdf\xbc" - "\xae\xe2\x22\x19\xd4\x37\x52\xde\x4c\x9a\x6d\x15\xc1\xdd\x86\x70" - "\x49\x1d\xc7\xbc\x4a\xdd\xe3\xe5\x98\x57\x7a\x1c\x29\x69\xfb\x94" - "\x43\xe6\x7a\x2c\xc3\x77\xae\xa1\x2c\x8e\x7d\x67\xf2\x29\x5b\x4e" - "\x8d\xd7\x6f\x4e\x01\x7e\x66\x6d\xbf\xdf\xac\x62\x4b\xbd\xe1\x68" - "\xb8\x80\xba\xd4\xfb\x15\x21\xcc\x61\x24\xdc\x35\x94\x5e\x77\x81" - "\x32\xd9\x0e\x2a\xfa\x5c\xd9\x6c\x3c\x2f\x9c\xd7\x6d\x12\xa1\xff" - "\x93\x49\xfb\xcf\x0c\xc4\xc6\xf3\xad\xe5\x78\x7a\xc2\x32\xd8\x5e" - "\x49\xd5\x28\xe9\xf3\x23\xe3\xb1\xa8\x6f\xe8\x11\xed\xae\x21\x23" - "\x7f\x33\x96\xd7\xf2\x78\x6d\x98\xcf\xfd\xa8\x31\xe4\xcd\x0e\x3d" - "\x66\xd8\xa0\xfb\x88\x2e\x35\xdf\x09\x0f\xc5\xfc\xcb\xd7\xeb\x76" - "\xaf\xe3\x31\xe3\x27\x56\x3e\x6b\x34\x30\xc7\xf9\x49\x02\xbf\xe3" - "\x34\xf6\x85\xcf\x95\xb4\xfc\x49\x1e\xcf\x7b\xb4\x39\xe3\x47\xd6" - "\xfe\x34\x65\xc3\xf0\x58\xc6\x38\x34\xa8\x75\xe4\x91\xbd\xce\x9f" - "\x2c\xd5\xc7\x33\x1e\xd7\xd5\xf7\x6a\x7f\x52\xee\x35\xfc\x2f\xd7" - "\x55\xf0\x33\x6b\xdf\x7b\xe6\xd8\x08\xb9\xc8\x7f\x50\x1f\xdf\xe4" - "\xf7\x48\xb6\x8e\xbe\x6f\xed\x06\x1a\xb3\xf0\x6b\x49\x32\xf6\x06" - "\x7f\x77\x54\x8d\xbb\x3f\x69\x1f\xd8\x4f\xcb\x95\xf4\x96\xdf\x1a" - "\xe4\x39\x86\x41\xb0\xaf\x85\x4f\xf3\x83\x39\x3e\x70\xce\xfd\x27" - "\x67\x07\xea\xf9\xa9\xb9\x7f\x1c\x45\x1d\xec\xd7\xc1\xf0\x95\x6d" - "\xf2\x93\x66\xae\x83\xe7\x56\x6a\x7c\xfd\x49\xf3\x55\x6c\xb1\x4c" - "\xa6\x6f\x58\x9b\x4f\x7a\xba\xff\xaa\xe8\x5b\x4e\x89\x93\x76\x93" - "\xe5\xa3\x4a\xaf\x71\xa4\x8a\xe3\x64\x3a\x45\x3f\x5d\xc2\xef\x99" - "\xd7\xdd\x13\x79\x2d\xee\xa7\x1f\x78\x78\xdc\xee\x2b\x4c\x9e\xcf" - "\x73\x7d\x69\x8b\xff\xf4\xd0\x04\x94\x43\x5a\xea\x87\xe7\x02\xc6" - "\xaa\x8d\x94\xc5\xdf\xf4\x44\xba\x5c\x27\xf0\xdd\xf4\x6c\xef\x6d" - "\x69\x64\xb9\x6d\x37\x9f\x07\xf8\xe9\x09\xcc\x2f\xa5\x1f\xae\xac" - "\xbf\xe6\x5d\x19\xfb\xef\xed\xcb\xde\x21\xaa\xaf\x0e\xae\xc6\x73" - "\x66\xc4\xf3\x08\x7d\x2d\xdf\x4b\x07\x6d\x72\xef\x92\x7d\x9e\x57" - "\xf2\x78\xbd\xd7\x31\xe0\x27\x74\x70\xb5\xc2\xe5\xe0\xea\x63\x36" - "\xe2\xb5\xea\x13\xf5\x32\x8e\xd7\xc1\xd9\x5e\xfa\xc9\x36\x6d\x3d" - "\xa6\x5d\xf2\x15\xdb\xbb\x2f\xf2\x1c\xec\xaf\xee\x9d\xc8\xc7\xe3" - "\x44\x51\x39\xe5\x2a\x1b\x7e\x6f\x6d\x18\xfc\x13\xd1\xfe\x4f\x79" - "\xad\x2f\xae\x4e\x7c\x9d\x48\x96\xa9\xde\xd3\x2e\x7d\xce\xaa\xdf" - "\x2b\xc6\x35\x49\x54\xd7\x3a\x70\x4d\x06\xcf\xb9\x70\xe5\x31\x7c" - "\x3b\xae\x69\xa2\xfa\x5d\xb9\x96\x81\x39\xac\x05\xf3\x84\xa4\x9e" - "\x94\x3d\xc7\x07\x3b\xab\xc8\xb4\xf1\x6c\xfb\x1e\x29\x1f\xda\x9f" - "\x2d\x6a\xf5\xc1\x3e\xdb\x4f\xb4\x36\x28\x2e\x5b\xbf\xc1\x67\x82" - "\x7e\xb6\xc8\xbe\x9f\x7d\x57\x7e\x96\x19\xed\xbb\xf2\xb3\x3c\xfc" - "\xb6\xe3\x77\x92\xe8\xe7\xc9\xb8\x2e\x1a\xf8\xfd\x3c\xaf\xd7\xf9" - "\xb3\x45\xa0\xa3\xb4\xb1\xae\x4d\x27\x72\x79\xf4\x03\xcf\x8b\x52" - "\xd6\xd9\x54\x7b\xdf\x6a\xc2\x73\x92\x48\xf9\x95\x4f\x6b\x6f\x23" - "\x9e\xcd\x56\x3b\xc6\xb5\x14\xd0\x64\x34\xda\x9c\xf2\x5e\x31\xb7" - "\x97\xf1\xed\x49\xa9\x75\x44\x9e\xd3\x64\x98\xdc\x7e\x5f\x0a\xca" - "\x81\x96\x62\xe2\x83\xd9\x3a\x3d\x35\x3a\xf1\x7c\xca\xd0\x03\x18" - "\xca\x0e\x42\x7e\xc0\xd0\xf3\xf7\xd3\x7e\x34\x7f\x5f\x03\x7d\x8a" - "\x7c\x98\x13\x27\xe9\x67\x40\x7b\x9d\x3f\xcf\xfd\xb8\x94\xb4\xef" - "\x3b\xff\x6c\x91\x3f\xa2\x2c\xc7\xbc\x88\x57\x1e\x75\x26\xa9\x3a" - "\x6b\x1d\xa7\xe9\x67\x8f\xa8\x7a\x7f\x9e\x33\x98\x2c\x55\x8e\x85" - "\x7d\x57\xe7\xe5\xb8\x18\x6c\x0f\x4d\xf3\x8c\xf1\x93\xa7\x2e\x8c" - "\x31\x7f\x6f\x53\x6e\xa5\x70\x9f\xa6\x9f\x5f\x6c\x0b\x74\x5d\xe3" - "\x78\xf8\x73\xe9\x93\x25\x2e\x3b\xc8\x53\x71\x97\xfc\x96\xf5\x39" - "\x3a\x94\xe1\xf1\xc9\x98\xf0\x7c\x2f\x63\x8b\xb2\x9f\x06\x8f\x0d" - "\x98\x63\xf7\xc7\x54\x0c\x23\x6f\x3d\xa7\x23\xcd\xe3\xf7\xc9\xd8" - "\x8b\x03\x7e\xe4\x7b\xb6\x2b\x99\xfa\xc5\xa7\x32\xfe\x02\xe3\x1b" - "\x7c\xc0\xcd\x38\x87\x5d\x7b\xb6\x73\x1b\xec\x98\xff\x79\x82\xbd" - "\x6e\x96\x09\xeb\x3a\x5e\x2b\xfc\xc5\xfb\xe0\x3b\x11\xae\xde\x73" - "\x8d\x63\xf3\x2f\xe4\x79\x20\x7b\x50\x9c\xf3\xa5\xec\xd9\xce\x36" - "\x49\x55\xe5\x90\xa4\x59\x75\xc2\xdd\x93\xba\xb7\xa9\xd7\xf9\x8b" - "\x93\x1f\x97\xab\xbe\xb9\x46\xb8\x27\xf5\xb6\xd7\x6b\x6d\x47\x9a" - "\xdc\x9b\x9b\x54\xab\x62\x4d\x7a\xe9\x50\xda\xa0\x6b\x56\xe8\x67" - "\xb6\x07\xd8\xc7\x55\xd1\xe2\xd0\xd2\xfe\xb1\xe1\x9a\xf0\x38\xb4" - "\xf4\x2b\xd4\xd1\xa7\xd5\x71\xfc\xbf\x58\xc7\xf1\xab\xd5\x01\xdd" - "\x70\xf3\x19\xfa\xe5\xa2\x6b\x9f\x3b\xfe\xd2\x2a\x79\xc5\xb5\xb7" - "\x51\xe9\xcc\xb7\x3e\x09\x61\xfe\x16\x34\xbf\xd5\x24\xbf\x3b\x65" - "\x20\x07\xc7\xdd\x0c\xba\xd6\xd9\x5a\xcb\x2f\x93\x7b\xdd\x1f\xa9" - "\x93\x7e\x29\x63\xdd\xb5\x96\xf1\x9c\xed\x57\xbe\xbe\x9a\x5a\xea" - "\x33\x1c\x3a\xc0\xf4\xde\x8f\x7e\xd8\x17\xc1\x67\x6d\xfe\x3f\x92" - "\xa7\x98\xd7\x57\xdb\x79\x5d\xdb\x27\x52\xde\x6a\x0a\x43\x37\xc0" - "\x46\x0f\x49\x7a\xc0\x7e\x51\xf3\xad\xba\x5a\x39\xdf\xf2\xc9\xf3" - "\x89\x23\x64\x3c\x4d\xe7\x2a\x3f\xaf\x7d\x87\xfa\x0a\x39\x86\x48" - "\x01\xc7\xd9\xe4\x75\x67\x61\xce\x39\xb9\x20\x98\x28\xe4\x7c\x0a" - "\xb6\x3f\xc7\xd9\xf4\xf8\xbd\x14\x82\x1d\x5d\x77\x89\xd2\xea\x60" - "\x7b\x42\x67\x9b\x59\xaf\x37\x68\xb1\x36\x77\x5e\x1a\x88\xb5\x59" - "\xcf\x6b\x3d\x1d\xb8\xbf\x44\xc6\x50\x75\x5d\xed\xbe\x4b\x94\xbe" - "\x7f\x1d\x65\xee\xe3\xb5\xbc\xbf\x29\xdb\x87\xed\x0a\x19\x77\x73" - "\x55\x26\xaf\xe7\x0f\xd8\x3e\xeb\x39\x2e\x70\xbf\xde\x32\xca\x35" - "\x90\x6b\xa2\xf7\x5b\x72\x1c\x0c\xba\xf6\xb4\x07\xcd\xef\x15\x83" - "\x76\x0e\xf4\x41\x33\xe8\x97\x1b\xaf\x6f\x75\x3f\xac\xdd\x11\xb1" - "\x52\x3f\x4e\x57\xfa\xdd\x4b\x6f\x27\x0d\xc6\x13\xa1\x7d\x85\x34" - "\xa9\x9b\xb2\x95\x4f\xc3\x75\x18\x13\xdf\x2e\xe5\xfd\xf3\xca\xe7" - "\xc8\x12\xda\xb7\x38\xc1\xfe\x63\x4a\xe4\xef\x9c\xf3\xaf\xf2\xef" - "\xa2\x6b\x52\x29\x65\xf3\xfe\x03\xfb\x3d\x58\x37\xc9\xfc\xd3\xd3" - "\x2b\x28\x6a\x6e\x91\xa7\x1c\xa3\xa6\x5a\xe7\xae\x7c\x7a\xd5\x73" - "\xb6\x25\x65\x2b\x9e\x5a\x51\xba\xa2\x6c\x83\x0c\xa1\x90\x25\xff" - "\xdd\x9f\xb1\x74\x91\xdc\x74\x8e\xb0\x2f\xd2\x07\xd6\xe3\xde\xbe" - "\x18\xe4\xf5\x83\x6b\xa2\xd7\xdb\x52\xff\xd5\xc1\x96\xaa\x93\xbe" - "\x3b\x4d\x49\x5e\xc3\x1f\xe5\xf7\xcd\x77\x20\x6d\x87\xe6\x63\x73" - "\x5a\xcb\x17\x76\xbd\x9b\x0b\x3e\x9e\x76\x8a\x7e\x15\xe4\xfd\x10" - "\xf4\x95\xcb\x53\x71\x86\xe7\x92\xd3\x78\x8d\xbf\x95\xd7\x32\xd6" - "\x70\xfe\xa6\xcd\xec\xc3\xc0\xfe\x50\xe0\xc3\x03\xa7\xb4\x67\xed" - "\x9b\xe9\xfb\x82\xab\x2c\x07\x82\xe7\x2d\x3f\x11\xa2\xf0\x75\xb1" - "\xaa\x64\x9f\x38\x5f\xf2\x7a\x44\xfc\xb7\xa1\x28\x5f\x0d\x39\xf9" - "\x36\x7e\x37\x09\x57\x86\x0d\xf2\x37\xe6\x0c\x35\xbd\xc9\x38\xcc" - "\x2b\x11\xe7\x07\x62\x21\x34\xbd\x8f\xe7\x3e\xfc\xc2\xc2\x35\xce" - "\x15\xb1\xbf\xc6\xef\x3e\xe5\xfc\xb6\xe5\xec\x13\xd6\x74\x96\xf1" - "\x12\x35\xe3\xaa\x7c\xf6\x92\x44\xe4\x0f\x29\x3c\xdf\xb9\xce\xb3" - "\xad\x8d\xac\x4f\xc9\xfb\x24\xf7\x33\x6c\xcf\xbd\xf3\x63\x61\xb0" - "\x0b\xde\x83\xf3\x74\x05\x49\x9d\x57\x7b\xbb\x9c\x7d\x10\xea\x61" - "\x6f\xd7\xa5\x92\xd9\x95\x4a\xc9\xbd\xce\x77\x72\xfa\xfd\x2f\xcc" - "\x6a\xbc\xe5\x31\x8f\x63\x67\x43\x1f\xf5\xf2\xf8\xc9\x78\x30\x0f" - "\x03\x66\x31\xef\xcf\xa9\xf3\x51\xef\x94\xc2\xb6\xb4\x5c\xbb\x3e" - "\x7e\x47\x7e\x4f\x65\xd2\x0e\x2a\xe6\x35\x6d\xde\x77\xe6\xd8\xd2" - "\x90\x57\x6d\xfd\xf0\x57\x7f\x92\xfb\xea\xd0\x29\xbc\x5f\xd2\x50" - "\x09\x3b\xc1\x9c\x73\x82\xed\x9b\xa0\x93\x1c\xbc\xb7\x19\xbe\x74" - "\xb6\x89\xf7\xa3\xe5\xd9\x42\x19\x93\xfd\xf7\xd4\x70\x91\x8c\x9d" - "\xf4\x0e\x7f\xab\xdb\x3c\x40\xd7\x5f\xdd\xc3\x30\x44\x4d\x7a\x92" - "\xa9\xc2\xb0\x9d\x61\x84\x2f\x9d\x9b\xa2\x97\x03\xed\x86\x71\x39" - "\xf0\xc1\xcd\xb2\x1c\xe7\x95\x31\x51\xcc\x8b\x85\x79\x4f\xbb\xac" - "\x53\x3d\x17\x08\xc8\x61\xf0\x52\xa8\x09\xf7\x8b\x98\x4e\xb8\x16" - "\xca\xb5\x5f\xcc\xd7\x65\x2c\x1e\xf3\x9a\x62\x8f\xf7\xaf\x6e\x89" - "\x0f\xfb\xe2\x96\x41\x67\x49\x7b\xf0\x57\xab\xeb\x3f\x27\xa3\xed" - "\x19\xee\xbf\x77\xe5\xba\x3f\xf8\xe9\xa0\xc2\xef\xdd\x21\x3d\x35" - "\x59\x79\x3d\xe6\xbd\x2e\xbf\x21\x89\x8e\x59\xf8\xec\xc0\xbb\xb9" - "\xc7\x2c\x97\x31\xa7\xf8\x55\x8b\xd7\x78\x5b\xb9\xb2\x45\x54\x39" - "\xde\x27\x86\x9d\xda\x95\x68\x31\xdb\xf1\xbe\x5b\xf7\xbb\x80\x4d" - "\xda\xb5\x13\xef\x40\xdb\x66\xa6\x9b\x97\x9a\x72\xdb\x4a\xd5\xd9" - "\x0c\x3c\x0f\xe5\xf3\xf6\x92\xd6\x5b\x9f\xed\x32\x6d\x71\xf3\xf9" - "\xcf\x29\xa6\x60\xae\x81\xf7\x81\xf9\xdc\x3f\xc7\x42\xe0\xb3\xff" - "\xbc\x96\xa7\xbd\xcf\x8e\x79\x9f\xa5\xbf\xef\x75\xbe\xbb\x54\x3f" - "\xb3\xcf\x31\x95\xd8\xc7\x20\xa4\xf9\x0a\xca\x58\x43\x17\xd4\x3e" - "\x2a\xfb\x0a\xf2\x3a\x22\x9f\x79\xe4\xbd\x4e\x94\xab\xeb\xf7\xdd" - "\x94\x67\x7d\xde\x3d\xa4\xfb\x46\xe1\xfe\x48\xbf\x5f\x0f\x68\xd1" - "\xe3\xda\xbb\xdd\x6f\x7e\x37\xd7\xef\xda\x73\x1c\xef\x4e\x40\x1f" - "\x0e\x1a\x8b\x48\xce\xfd\x38\x26\xf3\xf3\x64\x08\xa7\x4e\x26\x8e" - "\xd1\x71\xcc\x4f\xda\x39\xe7\xc3\x93\xb5\x33\xf1\x89\xe7\xe8\xdd" - "\xbf\x0f\xec\x39\x86\xb4\xf5\xb2\xc3\x8b\x95\xbd\x76\x78\xb1\x5c" - "\x2f\xab\xd9\x6b\x7b\x63\x63\xc0\xd0\xb4\xd1\x6b\x50\x67\x1f\x0e" - "\x17\x78\xe9\xe8\x36\xdd\x6f\x05\xf9\xcc\x83\xc5\x5e\x13\xae\xa9" - "\x27\x14\xcc\xf7\xe4\x7a\xe2\xc0\xfc\xe7\x3d\xe9\x1b\xc4\xfb\x83" - "\x61\x1e\x2b\x53\xd7\x39\xa4\x0f\x86\xed\x02\xaf\xbb\x0c\x55\x73" - "\xb1\xf7\xb4\x6f\x49\x49\x5f\xcf\x1b\xce\x44\x3f\xa7\xf2\xb3\xa2" - "\xd9\x61\xaf\xbe\x06\xbf\xcb\x10\xe6\xb8\xdc\xc2\xde\x28\xfc\x1e" - "\x9b\x9f\x60\x87\xf9\x3c\x18\x7b\x51\x87\xb0\xad\xe1\xb8\xf9\xef" - "\xdd\xc8\xb4\x57\x32\xf5\xde\x4b\x12\x27\xe7\xbd\xc2\xce\xf6\xa7" - "\x8f\x7d\x40\x2e\x10\xf2\xa5\x20\xdf\xcc\xe6\x8a\x6e\xf6\x63\x39" - "\xce\x31\x0f\x3b\xb5\xba\x7d\x29\x53\x4f\xdc\x96\x4c\xc5\xbd\xce" - "\xf7\x60\xff\xbf\x98\x7b\xed\x72\xfe\xde\xa2\xab\xd9\x22\x6a\x6c" - "\xcc\xa5\xc1\xe6\x33\x3c\x5f\x9d\x88\xfa\xe7\x09\xc6\xff\x9f\x67" - "\x06\x0d\x01\xd8\x0f\xc3\xc4\x37\x1d\xe5\xd0\x03\xc3\x44\x68\x23" - "\xfa\xab\xc7\x02\x7b\xb7\x85\xda\x82\xcd\xd2\x47\x04\x32\x6c\xaa" - "\xf4\x8b\x0b\x9e\xe0\x61\xe9\xdf\xab\xce\xc1\xff\xf3\x3d\x9e\xe0" - "\x07\xd4\x66\xf3\x91\x7b\xcd\x1f\x31\x66\xfd\x73\x06\xe3\x35\xd1" - "\xe6\xa0\x09\xe7\xf8\xfd\x7b\x9d\x6a\x9c\xfc\xe7\x5c\xed\x6a\xe6" - "\xd8\x98\x91\x38\xdd\xff\xfc\xca\xa7\xcb\x56\xac\x5a\x39\x21\x7f" - "\xd9\xba\x65\xa5\xd6\x87\x95\xcb\x5d\xd4\xf8\x95\x34\x10\xff\xfb" - "\xd7\xc9\x3c\xa6\xb0\xad\xc2\x71\xc0\xaf\x16\x03\x5c\x8f\xff\x0d" - "\xbb\x21\x9d\xd7\xf7\xfe\x27\x63\x80\xeb\xb6\x08\xc7\xff\x1e\x58" - "\xeb\xfe\x75\x4b\xbf\x0c\x84\x3f\xea\xe5\x67\x3e\xfb\x19\x76\xfe" - "\x73\x3e\xcb\x51\xbd\xf4\x4f\xfb\xf5\xec\xc8\x58\x49\xec\x8b\xc7" - "\xeb\x23\x48\x5f\xac\x9f\xb3\x05\x2f\x62\xdc\xf8\x75\xe9\xc0\xb9" - "\x9f\x5f\x97\xa3\xbf\x8f\x28\xf9\x95\x79\xb7\xeb\x7b\xc2\xda\x77" - "\xd7\xe4\x1e\x76\xd8\xd9\x97\xab\xd6\x61\x7e\xbd\xb3\x3e\x3c\x2c" - "\x49\xed\x01\xfc\xfa\xb0\x7e\xa6\x4c\xc9\xe6\x47\x9a\x6c\xfe\xba" - "\xe5\x6a\xfb\xf6\x03\xb2\x71\x24\x69\x40\xae\xff\xa2\x95\x3d\x92" - "\xf4\x65\x7b\xfe\x9a\x3d\x7c\xe3\x19\xfa\x97\x9b\x79\x6d\x06\xf7" - "\xb7\xe0\x7e\x88\x1c\x6b\xa5\x7f\xfd\xfb\x9f\x69\xf7\xa8\xe3\xfd" - "\xdf\x69\xf7\x5f\xc7\xfd\x3b\xda\xfd\x68\xdc\xbf\xa6\xdd\x43\x66" - "\xdf\xdf\xa2\xdd\xa7\xe1\x7e\x85\x76\x0f\x9d\xff\xfe\x43\xda\xfd" - "\x28\xdc\xdf\xa3\xdd\x7f\x0d\xf7\x63\xb5\x7b\xc8\xe0\xfb\xd7\x69" - "\xfb\xa7\x49\xc0\xfd\xe2\xb5\xdb\xe7\x47\xdc\x6a\x8f\xee\x7d\x82" - "\x2d\x74\x40\x8d\x19\xfd\x69\x69\xe0\xe9\xa5\x3a\x7d\x91\x7e\x84" - "\xeb\x41\x7a\x96\x97\xde\xec\x8c\x48\x3f\xa8\xe5\x9f\x8d\xf1\xc6" - "\x1b\x91\x5e\xa7\xa5\x2f\x86\x0d\x9a\x14\x91\xee\xd2\xd2\xcb\xa0" - "\x17\x4b\x22\xd2\xb5\xb8\x0e\xef\xef\xf0\x52\xa3\x25\x22\xbd\x5c" - "\x4b\x3f\xa0\xfb\x2b\x68\xe9\xa5\x5a\xfa\x51\xa4\x1f\x8f\x48\x2f" - "\xd6\xd2\xa1\xff\x7f\xdd\x11\x91\xae\xd6\x15\xe4\x59\x34\x93\x38" - "\x56\xc1\xb2\xf5\x7e\xc0\x4b\xfb\x8f\x44\xe4\xc9\x53\x65\xff\xc5" - "\xec\xa5\xba\xc8\xb6\x4c\xd3\xd2\x33\xbd\xf4\xb7\xc6\x88\xf4\xec" - "\xc1\x74\x55\x42\x2d\x15\x0f\xb6\x86\xc9\xdf\xa9\x92\x7e\x92\xd2" - "\xb6\xfc\xcd\x32\x3e\xa7\x66\xda\x2f\x4e\x59\x2b\x85\x38\x45\xbf" - "\xc9\xd7\xfc\x03\x9b\xd9\x5f\x4b\x9d\xf7\xfb\x4d\x8e\x3c\x03\xc6" - "\x3e\xe7\x7c\x06\x70\x23\xa7\xfd\x8b\x8c\x7d\x32\xa9\xdc\xa1\x62" - "\x72\x2a\xff\xd3\x6e\x39\x97\xd7\xf6\x39\x91\xe7\x33\x5e\xdb\x64" - "\x38\xbc\xde\xe7\x29\xbb\x2c\x7d\x22\x79\x2e\xc5\x69\x3c\xa7\x95" - "\xe7\xc2\x22\xe6\x54\x4a\xef\xff\x66\x59\x98\xcf\xed\x3b\xd5\xbc" - "\x9f\x65\x91\xf3\xb3\x6f\x4e\x64\x5e\x2f\xfd\x46\xce\x4d\x13\x2d" - "\x29\xff\xd6\xeb\xfc\xcd\xec\x81\xb3\x4a\xff\x52\xa7\xa5\xff\x09" - "\xe9\x8b\x23\xd2\xb7\x0f\xae\xdb\xa1\xef\xcc\xe9\x05\x7d\x97\x84" - "\x3f\x78\x49\x04\x76\xfd\x07\xf0\x5e\x2e\xcf\xdd\x7c\x23\xe4\x4a" - "\x2f\xd6\x62\x60\x7c\x16\x5c\x27\x7c\xd0\xd9\xfc\x8d\x89\xeb\xe7" - "\xfb\x7d\x34\xdf\xd6\x2b\x76\x3e\xc5\x7e\x76\x17\x65\x3c\x28\x7b" - "\x37\xc7\xdf\x66\xdf\x2d\x3f\xef\x0f\x25\xb7\x61\x8c\xab\x5f\xce" - "\xef\x3f\xa5\x79\x25\x3e\x6a\x2d\x09\x51\x3d\x60\xef\x7f\x4a\xf7" - "\x9b\xfc\x4d\x7f\xfc\x1f\xc6\x81\xeb\xb3\xcb\x6f\xc5\x1c\x9d\xc0" - "\xb8\xf2\xb7\xf0\x44\xf5\x7b\x36\xf1\x5b\xb6\x65\xf7\xb8\x4c\x5b" - "\xc8\x8a\xb1\x7d\x0a\xee\x1d\xea\x87\x77\x48\x1f\xac\x4d\x4a\x96" - "\x8f\x6a\xfe\x98\xe9\xed\x4a\x5f\x1c\x2d\x13\xff\xc4\xe7\x8e\x8e" - "\xf2\xf9\xa7\x12\xd8\xcd\x71\xfd\xaf\x36\xef\x27\x43\x5f\x0d\x6c" - "\x93\x73\x47\x0c\x4a\x3f\x7d\xb0\x34\x6c\x48\xda\xc2\xeb\x8a\xf2" - "\x3b\x11\x35\x93\xcd\x87\x56\x06\x0c\xad\x1b\x3b\x69\xd3\xd7\xc8" - "\xb2\x38\xc0\xbe\xe4\x47\x3f\x1f\x59\xc6\xb1\x45\xf7\xda\x60\x87" - "\x1a\xde\xc5\xfb\x0f\x57\x1e\x31\x04\xa5\xbd\xf2\xc1\x52\xb9\x16" - "\xe5\xca\xe9\xe4\x31\xc4\xd3\x11\xe2\xb3\x47\xd2\x4e\x86\xfe\x4f" - "\x0a\xad\x2f\x49\x0d\xae\x2d\xb9\x7e\xff\x1a\x4a\x0e\xad\xcd\x4c" - "\x7b\xe5\x12\x4d\xd1\xc7\x1f\xcc\x61\xb3\x45\xaf\x65\x78\x15\xc6" - "\x14\x9e\xe3\x8e\x4c\x30\xcb\x3d\x37\xbe\x0f\x1b\xde\x48\xaf\x5f" - "\x77\xf5\x6f\xde\x84\x30\xb7\xe5\xd8\xd3\x8c\x4b\xbc\xb6\xee\x78" - "\x1d\xf3\x65\xed\x9c\x6c\xe5\xe7\x34\x0a\xf3\x16\xc3\xc8\x8b\xc2" - "\x7d\xa6\x94\x0c\xfc\x9d\x90\xca\x65\x72\x1d\x69\x48\x6b\x49\x90" - "\x3c\xe5\x7f\xa6\xca\x35\xdc\x47\x1f\xbc\xcf\x76\x1a\xfb\x4d\x22" - "\xbf\xf9\x0c\x7d\xf0\x3b\x53\x00\x63\x46\x00\xb6\xf4\x33\x3c\x27" - "\xfc\xe0\x53\xbf\x8c\x7d\xfb\xa1\x95\x7d\xc7\xdd\x6b\xee\xe3\xb4" - "\x2f\xec\x9f\x4b\xdf\xd8\xe3\x4a\xb6\x3e\x38\xc1\xcf\x76\x3e\xb7" - "\x9b\x3a\x35\xf9\xad\xcb\x81\xff\xcb\xde\xf7\xc0\x45\x55\xa5\xfd" - "\x9f\x19\x10\xc9\x48\x06\x17\x09\xcd\x6a\x6c\xb1\x9d\xca\x3f\xd4" - "\xea\xbb\xae\x61\xe2\xbf\xd6\x5c\x4d\x74\xfd\x83\xe5\x1f\x34\x29" - "\x74\x45\x47\x44\x44\x44\x40\x34\x5e\x6b\x15\xc7\x42\x16\x13\x75" - "\xea\xc5\x7d\xa9\xfc\xc3\xee\xda\xfb\x62\x6b\x3a\x26\x16\x28\x30" - "\x58\x58\x68\xa8\x23\xa1\x21\x8b\x36\xc9\x28\x83\xce\xdc\xfb\x7b" - "\x9e\x73\xee\x9d\x3b\x77\x98\x01\xc7\x34\xdb\xdf\xbe\x7c\x3e\x7c" - "\xee\x9c\x7b\xcf\x3d\xf7\xdc\xf3\x3c\xe7\x7b\x9e\xe7\xb9\xcf\x79" - "\x9e\x4e\xcc\x56\xf1\xc9\x49\x61\x7d\x88\x61\xfa\xd7\x27\xd5\x9e" - "\x78\x97\xd3\x69\xb4\x3c\xc6\x46\xcf\xb7\x91\x17\x2d\xbc\x89\x7e" - "\xcf\xc4\x78\x05\xc9\xc3\x0c\xfc\x75\x1d\x61\x7b\xec\x0e\x6e\xe1" - "\x36\x69\xb4\x2c\x5e\xe5\xc1\x4d\x84\xf9\x22\xc1\x1a\xa9\xc9\x60" - "\xb6\x5c\x8d\x8e\xd9\x36\x35\xfa\x35\x3d\xd1\x57\xf9\x60\x5e\x73" - "\x90\xa6\x08\x8e\x0b\x9b\xbb\x3d\xa7\xf7\xbc\x1e\xf5\xd1\xab\x1f" - "\x21\xc1\x68\x53\x47\xbf\xe3\x1d\xcc\xdf\x18\x9e\x71\x28\x9f\xdf" - "\x44\xaf\x3d\x5a\xa7\x25\x3e\x4c\xdf\x3b\x78\x69\x40\x3e\x01\xb9" - "\x82\x3c\xc0\xab\x34\x51\xd4\xc7\x4b\xa7\x89\x31\x36\xf1\x06\xf4" - "\x2d\x64\xdf\x3e\x0e\x15\xf2\x41\x9a\x28\x56\xff\xd0\x6f\x2b\x9b" - "\xe0\x1d\x54\x1a\xb5\xd1\x7a\x59\x90\x09\x0f\x01\xef\x6b\xd4\xbc" - "\x4e\x13\xce\xf6\xbf\x1f\x7a\x43\xc4\x55\xc6\xa3\x87\x56\xb1\x71" - "\xeb\xa3\x67\xe3\x76\xa8\x50\x58\xaf\x1e\xc5\xdf\xb0\x76\x87\xb3" - "\x6f\xf5\x87\x12\x45\x19\xd9\x24\xd4\xc1\x7b\xe0\x77\x34\xc3\xda" - "\x43\x39\xf0\xee\xc2\x1e\x86\x43\xf4\x7b\x21\xbc\x1f\xac\x59\x07" - "\xab\xf0\xbd\x3c\x61\x2b\x1d\x8b\x54\xe2\x03\x7d\x8e\x44\x9f\x52" - "\x94\x53\x8c\x96\x61\x06\x96\xcb\xf2\xf0\xd3\x74\x1f\x30\x3c\x07" - "\xe8\xa3\x44\xdc\xc4\x7d\xcb\xd8\x9e\xd4\x7f\x43\x77\xb1\x2f\xf8" - "\x3c\xbc\x06\xef\xaa\x46\x7a\xc2\x58\x85\x63\x1d\xa4\xeb\x45\x2d" - "\xda\x38\xae\xc1\x98\xa1\xbf\xd0\xe1\x48\x1c\x13\x36\x66\x87\x1d" - "\x39\xcf\xd9\x78\x1d\x0e\x92\x8f\x07\x2b\x73\x2a\xc0\x86\x04\xf4" - "\x1b\x39\x1c\x29\x8c\x5f\x93\xf0\x7c\x9a\x87\x93\x5d\x33\xec\x74" - "\xba\xf7\x61\x47\x5d\x96\x37\x55\x89\xdf\x60\xd1\x26\xcf\xf8\xd5" - "\x50\xe5\x74\x5f\xd5\xec\x1f\x50\x46\x0e\x53\x63\x9e\x4b\x1c\xf3" - "\x96\x4c\x43\xbd\x34\xde\xac\x1d\x37\xcf\x78\x44\x7c\x86\x89\x18" - "\x0a\xc4\x7e\xc2\x6f\x61\x0d\x3e\xac\x91\x68\x62\x18\x23\xde\xb7" - "\x9d\xee\x25\x3a\x64\xc1\x3d\x90\x6e\x71\x10\xbf\xfd\xc0\xa8\x54" - "\xda\x86\x19\x28\x3f\x92\xc3\x7a\xf4\x89\x85\x71\x8d\x64\x3c\x74" - "\x78\x2d\x5b\x0b\x0f\xeb\xb1\x4d\xfc\xae\xc2\xe2\x9d\x1e\x06\xcc" - "\x3a\x24\xe4\xea\x3e\xbc\x4b\xe8\x03\xe8\x7f\x07\x0b\x5c\xf5\xba" - "\x11\x73\xe6\xd1\xcd\xbe\xfd\x96\x69\x5d\xf7\x15\xf9\x4b\xfb\x3a" - "\x0f\x37\x38\xed\x8b\x15\xf6\x1a\x7e\x3a\x10\xf4\xd4\x7d\xd9\x2c" - "\x2e\x6e\x71\x36\xd0\x2c\xfd\x1a\xe9\x89\xf9\x61\xd2\xb4\x7c\x63" - "\xa5\x16\x74\x6b\xd5\xa0\xbe\xbc\x6e\x50\x78\xda\x35\xd2\x05\x7d" - "\x2e\x10\x6f\xd0\xde\xc3\x07\xc1\xf9\x4d\x83\xc2\xa5\xbd\x77\x25" - "\x26\xd0\x6d\x0b\x37\x80\x2e\x9b\x7e\x99\xf4\x64\x3e\x14\x9f\x2e" - "\x11\xec\x3e\xef\x70\xba\x41\x03\x71\x5f\x67\x25\x68\x84\x7c\x7a" - "\xdc\x3b\xdc\xa6\x41\x03\xa1\xdd\x51\xe9\xf1\xa4\x1b\xae\x6f\xe8" - "\xab\xcb\x78\xa6\xc4\x00\xed\x8e\xc2\x98\x6b\x1c\x1f\xad\x80\xe7" - "\xaf\xe3\x54\x43\xaa\x36\x70\x84\xfa\x88\x03\x9f\x29\xeb\xc8\xa7" - "\x87\xe1\xf9\xeb\x30\x6f\x25\xda\x7c\x8c\x56\xe8\xe7\xa6\x41\xeb" - "\xe0\x5a\x57\xb8\x86\xf6\x1e\x0e\xe3\xaf\x61\x3c\x77\x68\x3f\x14" - "\xdb\x87\x67\xad\x63\x7d\x37\xd3\xba\x75\xe4\x48\x6f\xac\x23\xc6" - "\x75\xe3\xd2\xa3\x7d\xf0\x3a\xee\x13\xb6\x63\x5e\x04\x90\xce\xd9" - "\x3d\x35\x8e\x7b\x04\xf9\x19\xe6\x72\xc9\x7e\xfe\xad\xe7\xd0\xf7" - "\xa7\x18\x7d\x52\x99\x2c\x5b\xb2\x4f\x98\xeb\x20\x1f\x97\x7c\x24" - "\xfc\x0e\x70\xd4\x4d\x8f\x26\x69\xad\x24\x94\x7e\x57\x5d\xee\x03" - "\xd8\x5b\x12\x80\x39\x16\x9c\xda\x3c\x8f\xed\xad\xc7\x78\x71\xb1" - "\x24\x00\x70\xf9\x7e\xe8\x37\xe6\x47\x39\x8f\xb6\x5a\x61\x6c\x4c" - "\x40\xa7\xa2\x8d\x2c\x26\xe0\xbe\x0d\xc0\xfb\x69\xab\x40\x1e\x58" - "\x45\x02\x56\xd9\x49\x2f\x7c\x4f\xa0\x5b\x03\xfa\x55\xa3\xee\x86" - "\x63\x23\xd0\xb0\x00\xde\x65\xd7\xaa\x38\xbe\x7e\x55\x13\xdf\x50" - "\x11\x57\x43\x60\x9d\xe9\x56\xa9\xad\xc2\xd8\xe4\xe7\xf1\x5d\xd1" - "\x46\x09\x63\x0a\x72\x26\x3c\x63\xd3\xa0\x5d\xb8\x57\x86\xda\x09" - "\x94\x87\x8b\xc5\x7d\x45\xdb\xe9\xde\xa3\x92\x70\x87\xed\x2b\x89" - "\x2f\x11\xfa\x52\xca\xe1\xef\x24\xba\x3f\xb1\x0b\xea\x3f\x68\xd3" - "\x98\xbd\x42\xef\xd8\xa3\xc1\x6c\x03\x25\x0b\x9d\xe2\x72\xd1\x7b" - "\xd1\x46\x80\xf7\x4e\xb0\xf1\xd7\x36\x0a\x75\xf1\xde\x09\x2b\x66" - "\xf3\x78\x2f\xdc\xa3\x77\xdc\x23\xdb\xe3\x73\x84\xc9\x15\x30\xb6" - "\xf8\xdb\x0c\x63\x29\xf8\x50\xa9\xd9\xf7\xef\x92\x1a\xf1\x9b\xb3" - "\x89\x7c\xaa\x43\x7e\x72\x1f\x4f\xfc\x28\x91\xc7\x48\x3a\x5a\x85" - "\xf1\x9b\xe0\x7c\xa8\x18\xcb\x08\x7e\x87\x41\x5b\x4c\xce\x76\x8a" - "\x51\x96\xed\x14\xef\x30\xdd\xcc\x7f\x8b\x7c\x02\xb8\xe2\xd3\x48" - "\x8e\x82\x5c\x34\xa4\x8a\xed\x93\x3a\x7a\x18\xfb\x59\x47\x8e\x62" - "\x2c\x85\x40\x16\x4b\xe1\xe8\x6a\x01\x3f\x0c\x13\xec\xb6\x40\x13" - "\x3c\x13\xf7\xfc\x38\x95\x93\x01\x4f\x54\x50\xef\xaf\x2c\x1e\xe0" - "\x51\xad\x4b\x7d\xbc\x9e\xe1\x52\x8e\x74\x29\xab\x2d\x30\x6f\x3c" - "\x7d\x5b\xdf\xd0\x93\xda\x0f\xeb\xbb\xae\x26\xda\xf4\x4b\xc4\x07" - "\x78\xe5\x02\xf6\xad\xb2\xa1\x09\xdf\x29\x90\xcf\x0c\x27\x68\x03" - "\xa5\xb2\x25\xac\xe9\x75\x61\x50\xe7\x12\x09\x41\xbf\x6f\xcc\x91" - "\x02\xf5\x1b\x59\x1c\xf3\xcf\xa7\xcf\x58\xd6\x85\x70\xaf\x45\xdf" - "\xcf\x2b\x27\xe2\xf7\x44\xff\xdd\x37\x4c\x9d\xf0\x3b\x57\xda\x16" - "\xe0\x49\x3b\x09\x01\x1e\xab\xc7\x7c\x74\x70\x4f\xd3\x7f\xdd\x68" - "\xe8\x64\xb4\x9d\x26\xda\x05\x44\xd9\x48\x3e\x1f\xe7\x9b\x4a\x7c" - "\x37\x5e\x24\x2a\xa0\xab\xed\x88\x6d\x30\x11\x63\x21\xe4\x77\x63" - "\xfb\xb8\xf3\x01\x5f\x97\x86\xf2\xd6\x96\xcc\xcf\x0a\x41\xf7\xca" - "\x11\x75\xec\xf5\x2c\x0f\x8a\x2f\x3c\xbf\xbb\x52\x88\xfb\xc0\xc6" - "\xf6\xb3\x0b\x6c\x9f\x55\xf0\x6b\x70\x4f\xad\x24\x7f\x7f\xce\x72" - "\x8d\xeb\x86\x08\x6b\xdd\xe7\x71\x47\x40\x82\x5f\xcb\x7c\x14\x82" - "\x5b\x32\x3f\xf7\x77\xf8\x28\x50\xbb\xd5\xe7\x71\x40\x43\x0b\x93" - "\xcd\x87\x00\xbe\xfb\x0b\x73\x10\xcf\x87\xa9\xf1\x5e\xb8\x2f\xd0" - "\x42\x6d\x4c\x9f\x8f\x92\x78\xed\xf3\x00\xc4\x7c\x78\xa7\x00\x13" - "\xf9\x2c\x03\xdf\x0b\xc7\x04\xea\xf9\x42\x79\xed\x91\x02\x0f\x71" - "\x61\x55\x61\x55\x36\x6a\x03\xf9\x73\x1c\xf0\xd3\x65\xa0\xc1\x2f" - "\x30\xf6\x93\x11\x9e\x53\xb1\xfd\x06\xa9\x08\x6d\x26\x95\xf0\x1b" - "\x7d\x91\x0d\x0b\xbe\x25\xf5\x6a\xf7\xeb\x0d\xac\x59\x51\xd0\xe7" - "\x18\x6c\x0b\xb1\x00\xfd\xb7\x8c\xa9\xb0\xfe\x98\xa1\xad\x7a\x42" - "\xdb\xa8\xe0\x1a\x48\x45\x32\xea\x59\x1f\x69\x2b\xb7\x9f\x26\x95" - "\xa1\x5f\xd2\xe7\xa0\x4c\x68\x48\x68\x6e\xaf\x6d\x2d\xb4\x9d\x21" - "\xb4\xdd\x04\x6d\x07\x7b\x6e\x3b\x57\xe7\x65\xdb\x5e\xf4\x3b\x37" - "\xc3\x9b\xb6\x41\xde\xad\xc6\x3c\x37\xb8\xaf\x2b\xad\x07\x79\xc0" - "\x7e\x1d\xe3\x7e\x3e\xca\x33\x7f\xd8\xb2\xa1\x74\xef\x57\x26\xdd" - "\x3b\x53\x45\xf7\x80\x5d\x21\xd4\xa7\x91\xed\xfb\xba\x40\xd0\x1f" - "\xa2\x25\xb3\x4c\x23\xe9\x4a\x8e\xef\x54\x20\xab\x96\x8d\x63\x7e" - "\x8f\x03\x85\x38\xe4\x65\x18\x37\xd2\x83\x9e\x37\xc8\xc6\xfc\x67" - "\xcb\x5e\x17\xed\x2f\xcd\x41\x83\x6c\x42\x5b\x6a\x57\xbb\x9e\x98" - "\x90\x36\x36\x39\x51\xcc\x6d\x9b\x28\x6c\x3f\x9d\x14\xfb\x4a\xec" - "\xfc\xa4\xd8\x79\xea\xc9\xcb\x12\x16\xf5\x5b\xfc\xea\xab\xea\xf1" - "\xb1\x4b\x97\xce\x79\x2d\xb6\x0b\x99\x9c\x30\x67\xd1\xd2\xf9\x68" - "\x7b\x53\xab\x47\xfd\x7a\x76\xdc\xe2\xc4\x7e\xcf\x8d\x0a\x77\xb1" - "\xbd\xe1\x5e\xc5\x5a\x94\xc1\x61\xed\x08\x49\xb3\x93\x20\x8c\xe3" - "\x13\xb8\x82\x37\xac\x04\xfd\x0f\xf8\xaf\x11\xd7\x29\x5c\x1b\x50" - "\x37\xc0\x18\x82\x80\xdf\xe5\x5b\x73\xf9\xaa\x8b\xe4\x1b\x3b\xc8" - "\x95\x35\x3b\x58\x3c\xbc\x5a\xd0\xc9\xcd\x2c\xdf\xe2\x37\xa7\x30" - "\xd6\xdd\x9f\xe0\x9c\x39\x68\x88\x65\xe3\x59\xe2\x0b\xeb\x1a\xe8" - "\x25\xc7\xf2\x78\x65\x67\x7e\x7d\x08\x5f\xc2\x7f\x1b\x4a\x84\x18" - "\xe2\x4a\xa3\xc9\x8a\xdf\xf3\xfd\x27\xd8\xd2\x79\xc4\x53\x36\xb7" - "\x8e\x6d\x61\xe3\xa2\xd1\x32\xbf\xe2\x6f\xf6\xa3\x0e\xb3\x86\xe6" - "\xc3\x3c\x06\xf3\xff\x13\xad\x84\xd3\x5f\x96\x08\xb2\x23\xc6\xf8" - "\x58\x5e\x07\x65\x16\x67\xe4\x58\xb5\xdc\x57\xa3\x1c\xd6\xe5\xaf" - "\x1b\xd8\x3f\xde\x53\xe3\xcf\xfe\xf1\xb7\xf3\xff\x37\xf9\xec\xdf" - "\xf5\xfc\x8f\xfd\x17\x9f\x7f\xbb\xf7\x57\xa7\xb6\xff\x7f\x2b\xcf" - "\xc7\xe3\xbd\x7c\xff\x1f\x73\x7f\xf5\xda\xf6\xfe\x91\xdf\x80\xb7" - "\x6a\xff\x74\x96\xf8\x03\x7f\xe6\x6c\x98\x0b\x3c\x7d\x86\x84\xa6" - "\xda\xf8\xfa\xf4\x99\xa4\x57\xda\x25\x82\xf9\x08\x1b\x12\x93\xf9" - "\xfa\xb4\xeb\x28\x93\x56\x4f\x01\xfe\x2d\xce\xae\x23\x01\x1b\xea" - "\x88\xaa\x32\x11\x73\x15\x63\xac\x2f\xc0\x99\x26\xf8\x87\x72\x79" - "\x92\x95\x1c\x37\xff\x80\xfe\x4d\x86\xca\x18\xc0\x9d\x5a\x42\x90" - "\x7f\x03\x62\x48\x70\x7e\x08\x7f\x80\xcf\x5c\x0c\xeb\xd9\x62\xcc" - "\x4b\x58\xbd\x97\x8b\xec\xb4\x37\xa5\xb4\x93\x7a\x2e\xae\xf1\x15" - "\xd3\x05\xde\x3c\xca\xf6\x14\x7d\x49\xf7\x33\xc0\x3c\xa9\x66\x76" - "\xf5\xea\xe1\x6c\x3d\xaf\x0e\x12\xec\x4d\xf0\xfb\x4b\x2a\x2b\xc2" - "\x7b\x14\x63\xfe\x56\x6c\x73\x0f\x57\x4c\xf3\xb7\xee\x4d\x89\xec" - "\x94\x3a\x87\x28\x2b\x4d\x8d\x04\x73\x3b\x61\x2e\x50\x98\x77\xbb" - "\x60\x9e\x15\x6d\x0b\xe1\x75\xd0\xbf\xf5\xdb\x43\xf8\x75\xd0\xa7" - "\xc2\x96\xcc\x8a\x52\x58\x7b\x0e\x08\xdf\x5d\x0c\x30\x2f\x76\x6d" - "\x80\x3a\x13\x96\x91\x47\x37\x40\xbd\x6c\xa8\x87\x72\x32\xeb\xdf" - "\x89\x0d\x30\x06\xfb\xe0\x99\x55\xea\x59\x58\x36\x52\xdf\x1b\x7c" - "\x36\xbc\x87\xba\x8e\x18\x43\x61\x6d\xf3\xc5\x67\x88\xcf\x6d\xc9" - "\xac\x04\xfc\x2b\x4d\xa4\xdf\xce\xe0\x3c\x6b\xa7\x72\x32\x9b\xaf" - "\x83\x26\x6f\x94\xf2\xeb\x4e\xde\x90\x02\x6b\xfa\x0d\x1a\x03\x33" - "\x07\xed\x2d\x28\x63\x50\xb9\xc2\x4e\x02\x99\x7d\x00\x64\x8b\x38" - "\xc0\x01\x90\x27\xa8\x2f\x34\xc8\x12\xd0\x97\x1c\xcc\xf3\x88\xd7" - "\x41\x6f\xdb\x07\xeb\x72\x11\xca\x01\xb3\xae\x8d\x25\x68\x63\xc7" - "\x1c\xad\x4b\x67\xf0\x56\x96\x33\xa7\x72\x9f\x28\x0b\x20\x06\xe1" - "\xfa\x0f\xb2\xb0\xef\x4d\xa0\x21\xf0\x40\x29\xc8\x16\x41\x8d\x74" - "\xe5\xa0\x63\x5f\x4a\xd7\xfc\x24\x1a\xb3\xd9\x87\x61\x74\xa5\x1d" - "\xde\x2f\x00\x9e\x01\x63\x56\x4b\x6d\xe1\x0c\x63\x8c\x01\xe2\x3a" - "\x8e\x3a\xaf\x09\xda\xe0\x01\xcb\x84\x6b\xf0\xfe\x47\xc5\x5c\x77" - "\x20\x57\x54\x1e\x10\xc6\xac\x9c\x7d\x43\x36\x52\xdd\x1f\x64\x2e" - "\xc1\xb6\x59\x59\x8a\x72\x85\x70\xaf\xc3\xff\x11\xf5\x72\x0e\xe4" - "\x0a\x1c\x2f\x1c\x27\x68\xa7\x54\xc0\xb1\x6a\x26\xbf\x9c\x58\x26" - "\x7c\xb7\xc4\xfc\x17\x6b\xa5\xf1\x37\x16\x3a\x8f\x3f\xdc\x2f\xe8" - "\x8d\x27\x7a\x3b\xd1\x0e\x74\xa3\x2a\x2b\xda\x49\xa1\x8f\x07\x98" - "\x8d\xc7\x78\x1e\x63\xa5\x61\x6c\x66\x18\xe3\x03\xeb\x31\x0e\x30" - "\x60\xf3\x9a\xb3\x04\xbf\x7d\x83\xfc\x54\x75\x9e\xc9\xa7\x55\x19" - "\xc8\xc3\x50\xa6\x76\xf8\x7a\xe8\x17\xb6\x07\xe5\x89\x70\x04\x39" - "\xb6\xea\x05\xe7\x7c\xca\x52\x2e\xe5\xaa\x48\x69\x3f\x82\x71\x21" - "\xd3\x9f\x8d\x0b\xd1\x06\x46\xeb\xdf\x8c\xc3\xbe\xd5\xe2\xbc\x14" - "\xdf\x15\xf3\x2a\xc3\x79\x94\xfd\x6b\x91\x6e\xe2\x79\x8c\x21\x0c" - "\x74\x0a\x80\x67\x9d\x12\xfa\xb4\x0f\xca\xfe\x50\x0e\xa3\xf6\xfd" - "\x9b\x74\xbf\x79\xed\x86\x34\xe9\x1e\x9c\x37\xc0\xc3\x81\x50\xe7" - "\x04\x1c\x79\xb1\x2e\xcb\xbd\x5c\x15\xfd\xf6\x0d\xb4\x81\x55\x69" - "\xc5\xdc\xcb\x98\x77\x19\x31\x63\xc3\x2c\xd9\xd8\xe3\xd8\xec\x02" - "\x5a\x51\xbe\x3b\x62\x2b\x86\xf1\x3e\x01\xf2\xff\xc7\xd1\xec\xbd" - "\xaa\xa2\x85\xfe\x19\x58\xfc\x94\x32\x1d\x8d\xf7\x4b\xf5\xa1\x13" - "\x91\x0e\x7d\xc8\x21\x5b\x56\x45\x23\x4f\x42\x5b\xe5\x48\x7f\x94" - "\x13\xa1\x5e\x9c\x83\xb7\xe8\x7e\xdf\xaa\x06\x94\x2f\x85\xfe\x23" - "\xbf\x94\x09\x63\xa7\x73\x9e\x77\xce\xf3\x1c\xda\x00\xfd\xff\x73" - "\x07\x0f\x88\xf3\x9a\xf1\xc1\x17\x42\xee\xa7\x3f\xa3\xcd\xba\x0a" - "\xda\x35\xa0\x0c\xce\xd6\xd5\x2f\xf6\x1d\xa9\xb5\xa1\x0d\xbd\x1a" - "\xca\x30\xbf\xbf\xd0\x35\x77\x7b\xce\xb0\x96\xe2\xc6\x17\x30\x3e" - "\x03\x68\xae\x12\x1c\x17\x71\xbe\x6e\x9c\x85\xba\x5f\x38\x9b\xb3" - "\xc9\xc0\x0d\xd6\x26\x22\xf8\xfa\xc3\x9c\xbd\x80\xdf\x4e\x1b\x81" - "\x87\xfc\x71\xfe\x02\x7d\x77\x61\xbc\x69\x18\xc7\xaa\xb5\xb9\x74" - "\xde\x06\xe0\xbc\xbd\x89\x31\x24\xe0\x39\x25\x31\x91\xe4\x48\xb2" - "\x81\xce\x63\x8c\x1f\xb2\x15\xc6\x0e\xf3\x1c\xc3\xb3\x53\x45\x1f" - "\x65\xe4\x11\x8c\x17\x22\xf0\x49\x09\xce\x65\x61\xec\x7c\xa1\x5e" - "\x81\x38\xf7\x9c\xe8\x4f\xeb\xb8\xcc\xb7\x40\x36\xdf\xbe\xa8\x16" - "\xc7\xda\x46\xe7\x71\x95\xd6\x06\xf3\xd8\x79\x4c\x71\x3c\x71\x5c" - "\x5b\x32\xbf\x84\xf7\x2f\x0d\x15\xc7\x54\x1a\xcf\x2f\x97\x08\x34" - "\xaf\x62\x36\xa6\x2f\x07\x0a\xf6\x27\xc7\x18\x0a\xfc\x87\xeb\x40" - "\xf1\x1a\x7c\x77\x58\x1b\xf0\xf9\xc8\x23\x5b\x05\xcc\x2a\x31\x23" - "\x8f\x7c\x09\xf3\xff\x0f\x1a\x09\x3b\xaa\x12\xa9\xce\x02\x74\x62" - "\xf4\xf9\x72\x1b\x8d\xb7\xe1\x06\x3b\x4c\xe4\xc4\x0c\x09\x9f\xbe" - "\xdc\x25\x8e\x83\xc8\x93\xe2\xbc\x87\x36\x5a\xe5\xf8\xf3\xe5\x19" - "\x68\xa3\x1b\xe2\x9b\x24\x43\x7d\xd9\x24\xc7\xb7\x2f\xab\x11\xdf" - "\x90\xaf\xb5\x49\x68\x63\x63\xeb\x95\x89\x54\xa4\xca\x31\xa9\x62" - "\x09\xf3\x0d\x60\x32\x17\xf2\x96\x76\x16\xab\x8f\x6b\x18\xd4\xa7" - "\xba\xb8\xb0\xe6\x61\xcc\x2e\x3c\x17\x27\x8c\x57\x2d\xd4\x2f\xc1" - "\x7d\x93\x18\x2b\xe1\xfe\x5a\xa6\xeb\x01\x4e\x1f\xc0\xf8\xdd\x50" - "\x4f\x53\x09\x4f\xbb\x99\xc5\xb0\x5b\xc4\x0a\xfe\x95\xe8\xfb\x97" - "\x37\x90\xfb\xb4\xcf\xf1\xdf\x5e\x24\x27\x71\x3f\xab\x15\x63\x48" - "\x42\xdb\xea\x8b\xe4\xeb\x13\xf0\xdc\x60\xe1\x18\x0a\xc7\xfd\x70" - "\xec\x01\xc7\x77\xe1\xf8\x10\x1c\xdf\x80\xfa\x9c\x50\x3f\x1c\xca" - "\x4b\xe0\xfc\xaf\x85\x23\xf4\xf1\x24\xca\x9b\x51\x82\xec\x88\xe7" - "\x47\x63\x19\x8e\x83\x04\x9a\x0b\x31\x05\x4f\xf6\x83\x76\x92\xa1" - "\xff\x35\xc6\x5a\xda\x96\xf6\x22\xf9\xea\x1a\xb6\x8d\xfb\x98\xe1" - "\xf7\xfb\x4e\x32\x28\xb4\x73\xf2\x24\x1c\x07\xc2\x71\x0b\x1c\x13" - "\xe1\x18\x2f\x8c\x41\x15\x62\xc3\xbc\x64\x3a\xe6\xd4\x3f\x94\x3d" - "\x8f\xcd\x79\x5c\x87\x25\xec\xa8\x2c\x9d\x37\x83\xd1\xdb\x44\xbe" - "\xa0\x7c\x00\x75\x87\x63\x5d\x38\x8e\x14\x8e\x91\xc2\x71\xb4\x70" - "\xfc\x9d\x70\x1c\x25\x1c\xc7\x98\xc8\x49\xad\x20\x63\xc0\xb8\x9c" - "\xd4\xe2\x7b\x03\x76\x07\xb0\x67\x7c\xa5\x43\x1d\x19\x70\x7c\x10" - "\xb4\xef\xd3\x92\xf9\x95\xaf\x68\x1f\x45\x9b\xcf\xcd\xcc\xb2\x0f" - "\xb7\xd2\xef\xda\x5f\xf5\x72\xc2\xb6\x92\x00\x45\x24\x01\x19\xa8" - "\x7b\xbe\x92\xd7\x09\xed\x24\x2a\x85\xef\xc2\x42\x6e\x00\x1f\x8c" - "\x97\x47\xf5\xa1\xa0\x3d\x18\xa3\xb8\x96\xda\x8e\x31\xb6\x5b\xd0" - "\x90\x52\xf8\xaf\x06\xdd\xa0\x46\xc4\x6f\xd4\x7b\x98\xae\xde\xf9" - "\x4b\x78\xd6\x3a\x49\x57\xff\x6a\x30\xfb\x86\xf6\xe0\x12\x38\xaf" - "\x97\xce\x9f\xc4\xfd\x00\x83\x60\x3c\x6b\xe0\x7d\x06\xd6\x91\xaf" - "\x30\x86\xff\x33\xf5\xec\x9d\xc3\xc5\x77\x16\xe8\xa1\x15\xc7\xb7" - "\x9e\x9c\x4c\x06\x2c\x4c\x40\x1e\xae\x73\xe0\xec\x49\x6a\xd7\x15" - "\x78\x04\x68\x79\xf2\x69\xa4\xa9\xd3\x1c\x74\xc6\xa0\xe0\x96\xcc" - "\xaf\x35\x72\x4c\x31\x6a\x10\x53\x90\x37\x00\xbf\x91\xd6\xfe\x2e" - "\xf3\xaf\x1a\xe7\x1f\x9b\x77\x5f\xcf\x93\xdf\xfb\x65\xb5\x8d\xcd" - "\xbb\x1a\xe0\x33\xe0\xcf\x6a\xcc\x0f\x01\x38\xf4\xf5\x28\x61\x4e" - "\xd7\xc0\x9c\x1e\x04\xe7\xab\x58\x5f\xd9\x79\xe1\x59\xc0\x67\xd5" - "\xf8\xde\x0f\x89\xe7\x85\xf7\xc5\x76\x70\x0f\x7e\x0f\xf1\xbc\xd0" - "\x3e\xf0\x63\x75\x31\xce\x13\xf1\xbc\xf0\x4e\x20\x47\x7d\x6d\x13" - "\xf1\x64\x3d\xe3\xb7\xb5\xe2\x7d\x48\x37\x8c\x8f\xc5\x6c\xfc\x5f" - "\xe3\xde\x0a\x3d\xae\x0f\x6b\x66\x91\x80\xe5\x79\xe4\x01\x36\x2f" - "\xbf\x6e\x90\x63\xe4\xe9\x32\x3e\x33\xd0\xc6\xab\x86\x18\x2a\x6c" - "\x03\x45\x79\x35\xbf\x25\xb3\x66\x9e\x98\xe7\x5b\xca\x33\x50\xb3" - "\xa5\x42\xef\x18\x5f\xe8\x4b\xcd\x3a\xb1\x2f\x4e\xeb\x33\xa5\x01" - "\xf6\x0d\xdb\x5a\x03\xf2\xba\x05\x70\x81\xe1\x76\x4d\xb1\x89\xdc" - "\x2f\xca\xbb\x74\xdd\x0a\x54\x10\x6d\x76\x12\xfd\x3e\x1a\x88\x6b" - "\x23\xfa\xf8\x70\x68\xc7\x4a\xb6\x93\x4a\x2d\xe8\xf2\xc9\x17\xc8" - "\xec\x15\x5d\x30\xf6\x4a\x34\xf4\x75\x37\xf4\xad\xc0\x8e\xb6\xff" - "\x45\xa8\xa7\x9e\x9e\x63\x4f\xe2\xad\xc2\x98\xc1\x3c\x3a\x3d\x5a" - "\x18\x5b\xc4\xaf\x02\xc4\xf4\x35\x69\x2c\x67\x10\xda\x72\x70\x7e" - "\xbc\x8d\xeb\x58\x28\x6f\x2d\xc9\xc7\xb9\x72\x6a\x8c\x28\x93\x42" - "\x7f\xf5\x4c\x26\xfc\x62\x27\x8d\x4d\xa4\x1b\x62\x60\xb6\xc0\x53" - "\x27\xd9\xbb\x9f\x3a\xc0\xbe\x73\x0f\x11\xe2\x1b\x9e\x2a\xf4\x09" - "\x0d\xf9\x9a\xf9\x65\x95\x7d\xc6\x7c\x4a\x4e\xe5\x39\x7c\x4a\x24" - "\x59\xd1\xc0\xe2\x46\x9d\xda\x27\xcd\x89\x53\x6b\xf1\x3e\xb8\xbf" - "\x11\xce\x97\x4b\xe7\xbf\x28\x10\xec\x5d\x25\x5d\x57\x47\xa2\x6f" - "\x59\x77\x8c\xb5\xcd\x9e\x77\xba\x2f\x7d\x3e\xb5\x79\x0c\x29\x11" - "\xe7\x2f\x8e\x33\xae\xd9\x74\x0e\xc3\xfc\xc5\x79\x7c\x73\xd3\x90" - "\x52\xf8\x67\xf3\x96\xad\xcd\x06\x3a\x6f\xe9\x9c\x3d\x1d\xe1\xd4" - "\x0f\x1a\x5f\x07\xfb\xda\xbc\x32\x34\x00\xae\x45\xc3\xba\x5a\x25" - "\x5c\x63\x39\x25\x1a\x69\x8c\x3c\x33\x7e\xdb\xc6\x6f\x9d\xb8\x47" - "\x2b\x10\xb8\x1b\x63\x82\x88\xdf\xaa\xc7\x37\xa5\xf3\x76\xfc\xee" - "\x74\x9d\xb7\xe8\x1c\xb1\xfe\x4f\x17\x48\xf1\x7d\x4e\xf9\x0a\xef" - "\x85\x39\x61\xf2\x99\x2f\x58\xcd\x35\x26\x53\xd5\x58\x90\x4f\x8d" - "\xc0\x7b\x70\xcc\x63\x79\x99\x4f\x9b\x44\xde\x83\x79\x39\xef\x22" - "\xf9\x66\x49\x4e\x08\x9f\x07\x34\xcd\x83\xb9\xb4\x10\xca\x33\xe1" - "\x38\x8f\x1d\x15\x2a\x3c\x0a\x73\x24\xaf\x25\xf3\x9b\x5e\x62\x3e" - "\x7a\x1c\x1b\x4b\x50\xae\x09\xf9\x2c\x1b\xc6\x01\x79\x8d\x7e\x47" - "\x86\x7e\x23\x7f\x21\x9f\x21\x8f\x05\xae\x1e\x4b\xf9\x8c\xc6\x1f" - "\x80\xf3\xd8\x5f\xe4\x33\x68\x2b\x4e\x8c\xf3\x6b\x22\xdf\x04\xb0" - "\xef\x39\xdf\xa4\x8a\x3e\xb7\xf8\x2d\x29\xb1\x37\xe9\x0e\xed\xaa" - "\x4b\xd4\x34\x96\xe6\x39\xa3\x6d\x34\xc1\xba\xf8\x1d\x8e\xe1\xe4" - "\x83\x25\x70\x4f\x91\x34\xe6\x46\x9a\x9b\xf9\xc8\x0c\x6a\x8b\xfc" - "\x05\x5c\x2b\x77\xd6\x33\x4c\xe4\x58\x1e\xea\x1a\xe8\xdb\xf7\xcb" - "\x60\x82\xdf\x81\x01\xc7\xbe\x31\x8b\x72\xed\x80\x60\xfc\x9e\x7f" - "\x6c\x14\xf4\x0f\x75\xe8\x2a\xf8\x1d\x0e\xba\x64\xa9\x07\x9b\xf1" - "\x40\xb4\xf5\x08\xf9\x79\x6a\xd1\x8e\x85\xf9\x0c\x2e\x92\x73\x4b" - "\x2a\x30\x16\xc8\xe2\xb6\x71\x9e\xd3\x92\xf9\x6b\x18\xeb\x59\x9d" - "\x40\x7e\x51\x47\xce\x4d\x46\xbb\x51\xfa\x0f\x68\xa3\xa9\x4d\x96" - "\xdb\x68\x6a\x4b\x85\x7f\xd0\xb4\xcf\x44\x3a\xfd\x57\x09\xc7\x71" - "\x1d\xfc\x37\x08\x75\xe1\x4d\xcf\x0a\x6b\x4a\x28\xcc\x93\x5a\x87" - "\xfd\x17\xf9\x12\xe7\x36\xfa\x71\xa0\xcd\x49\x61\x23\x74\xef\x5b" - "\xa0\x0d\xfa\xbd\xe6\xc9\x49\x86\x14\xe4\xa3\x33\x74\x1f\x14\xc6" - "\x20\xf6\xce\x97\xe8\x0c\xa5\x27\x8b\x07\x5a\x5b\x05\xcf\x0e\xde" - "\x78\x85\xf8\x6a\x13\xc8\xc3\x68\xff\x0e\xb4\xf3\x06\xd4\x71\x85" - "\x98\x82\x55\x8d\xe4\xcc\x89\xc4\x55\x44\x09\xd7\x1f\x85\xdf\x06" - "\x51\x4e\x82\x7b\x54\x3e\x56\x12\x8c\xf2\xd1\xc8\x55\xe4\xd1\x96" - "\xcc\x33\xf9\x22\xad\x50\x86\x40\x3b\x9c\x60\x4b\x80\xbe\xd6\x52" - "\x1f\x67\x8c\x53\x6f\xa2\xe3\x46\x71\x18\xdb\x00\x1d\xf6\xcc\x3a" - "\x1f\x0b\x51\xb1\xb5\xe7\x0c\xf0\x7f\x99\x20\x33\x9e\x29\x00\xde" - "\xaf\x76\xea\xe7\xf3\x4e\xbf\xb3\xf0\xfe\x40\x0b\xca\x67\x9e\xc6" - "\xe7\x6c\x3f\x71\x7c\xd0\x5f\x35\x10\xf4\x04\x4a\x6f\x1b\xdf\x04" - "\x7d\x2b\xd7\xa6\x10\xff\x46\x72\xee\xe1\x1d\xb9\x74\x9f\x5d\x29" - "\xb3\xcf\x9f\x0b\x12\xf5\x70\xd6\xef\xb3\x67\x02\x57\xfb\x10\xb4" - "\xab\x63\xbc\x33\xea\xeb\xf7\x7d\x28\xb5\xa5\x1b\x6d\x11\xc4\x90" - "\x36\x04\xeb\x88\x72\x55\x6d\x73\x7a\x28\x39\x12\x1a\x01\xf3\xf8" - "\x6c\xa1\x49\xf9\xa5\xbf\xf7\x3e\x95\x67\x0b\x85\xf1\x2d\x67\xbe" - "\x08\x67\x57\xe0\x5a\x82\xba\x3f\xac\x23\x25\xb8\x46\xb7\x64\x9e" - "\xf3\x15\xe7\x0d\xac\x1b\x25\x70\x8f\x10\x0f\x1b\xbf\xff\x9e\x4d" - "\xc4\x18\x10\x54\x6f\x60\xf5\x03\x98\xcd\xff\xdc\x60\x87\x2c\x0d" - "\xf5\xf0\x3e\xe6\xa3\x76\x76\xdc\x6c\xbb\x02\xc6\xf4\xec\x38\x7c" - "\x37\x81\x17\x61\xbd\x3a\x17\x27\xcd\xdb\x33\x14\x9b\x8f\x34\x39" - "\xcf\xcb\x73\xeb\x24\x7d\xb3\x36\xa2\x5f\x0e\x51\xbb\x9b\x87\xda" - "\xae\xb8\x56\x9d\x6b\xdd\xb8\x91\xd7\xeb\x94\xdc\x88\x35\xd9\x24" - "\x40\xb1\x1e\x86\x0d\xe7\x59\x52\x4c\xf7\x8b\xc4\x74\x5f\x60\xc0" - "\x83\x51\x23\x13\x3b\xf3\x69\xa1\x44\xb9\xe1\x6a\x67\xff\xde\xd6" - "\x07\xf5\xbc\xcf\x93\x93\xc6\x27\x5a\x89\x7a\x81\x8e\x7c\xb7\x90" - "\xf8\x8c\xb4\xc3\xb3\x03\x88\xd6\x44\xea\x82\x71\xcf\xe8\x91\x00" - "\x94\x3f\xea\x82\xb1\xcd\xd4\x7c\xe2\x9f\x5a\xcf\x37\xac\x7f\xb5" - "\x93\x3f\xac\x07\xaa\xad\xc0\x63\xf7\x07\x3c\xa8\xbf\x09\x6d\x1c" - "\x8e\xa1\xf7\x15\x79\xee\x9b\x69\xb3\xfb\xbe\x69\x43\xa0\x6f\x3b" - "\xbd\xeb\xdb\xb7\xfb\xa4\xbe\x7d\xbb\xef\xc7\xf7\xed\xfc\xd3\x4e" - "\x7d\x53\x49\x7d\x8b\x83\xbe\x9d\x1f\xee\x5d\xdf\x2e\x4c\x96\xfa" - "\x76\x61\xf2\x2d\xf6\x6d\x57\x3b\x7d\xab\x70\xdf\xb7\xe4\x07\xa1" - "\x6f\x67\xbc\xeb\xdb\x45\x8b\xd4\xb7\x8b\x96\x1f\xd3\x37\xd4\xe5" - "\xd3\x7a\xf1\x17\x68\x3c\xf9\x04\x16\xaf\xf5\x22\xf9\x76\x68\x5a" - "\x3e\x2d\x77\xbb\x48\xea\x5a\x85\xf9\x6d\x4e\xb7\xf0\xdf\x32\x39" - "\xa7\x2e\xb6\xbf\x16\xfd\x5d\xeb\x66\x00\x2f\x07\x33\x9e\xfe\x96" - "\xfa\x37\xa4\x9b\x79\xc1\xdf\xb4\xee\xf5\xed\xd4\x1f\x65\x58\x9c" - "\x50\x2e\x6d\xee\x36\x84\xe6\xa1\xe7\x60\x3e\xf3\xdd\x9e\xf5\xc7" - "\xfc\x9d\x7b\x13\xcc\x4a\x3e\x13\x63\x87\x61\xbc\x3f\x5f\xc2\xbf" - "\xf5\x6c\xe8\xde\x04\x2b\xcd\x1d\xbe\x86\xee\xf7\xad\x33\x88\x7b" - "\xdc\xc4\x67\x98\x83\x86\xc5\xc1\xf9\x1a\x31\x0f\x2c\xaf\x44\x79" - "\xe6\x59\xcc\xf5\x08\xb2\x44\x9d\x59\xcc\xcd\x0a\xfc\xbe\x56\xc0" - "\x06\x4b\xa0\xb5\x3d\xdc\xfb\xb6\x8f\x88\x7b\x23\x13\x49\x20\xe6" - "\xa5\xdc\x98\xd6\x19\xbf\x39\x42\x5b\x75\xfb\x70\xdc\x27\x58\x3a" - "\xf3\x81\xa9\xc4\x07\xf7\xf6\xa1\x8f\x9e\x31\xd4\x4c\xc2\x52\x49" - "\xa7\x09\xc9\xd0\xa6\x95\xc4\x04\x26\x43\x7b\x30\xd6\x4c\x37\xf8" - "\x96\xda\xf8\x72\xa0\x3d\xfc\xfe\xed\x93\x48\x02\x46\x86\xa6\xf3" - "\x6b\xb6\x10\x5f\xdc\x07\x88\xfb\xf9\xd8\x5e\x3e\x3f\xff\x96\xcc" - "\x6f\xf5\xe2\xfb\xdd\x02\x7d\xba\x32\xfa\xd4\x9f\x91\xe8\x53\xbf" - "\xa5\x2d\x7d\xea\x3b\x31\xfa\x7c\x6b\x93\xe8\x73\x21\x52\x4e\x9f" - "\xfa\x3e\x72\xfa\xd4\xc7\xdd\x1e\x7d\xea\x63\x24\xfa\xb0\x67\x30" - "\xfa\xd4\x27\xbb\xa7\x4f\xbd\x4e\xa2\x4f\x7d\xd8\xad\xd1\xa7\xfe" - "\xa8\x67\xfa\xd4\x4f\x6e\x87\x3e\x7e\xee\xe9\x73\xa1\xfb\xad\xd3" - "\xe7\x42\xa4\x17\xf4\x79\x80\xd1\xe7\xe2\x2a\x89\x3e\x17\x7f\xdb" - "\x96\x3e\x17\x76\x32\xfa\x5c\xc8\x97\xe8\x73\xd1\x24\xa7\xcf\x85" - "\xa3\x72\xfa\x5c\xf4\xbf\x3d\xfa\x5c\x24\x12\x7d\xd8\x33\x18\x7d" - "\x2e\x86\xba\xa7\xcf\xc5\x70\x89\x3e\x17\x4a\x6e\x8d\x3e\x17\x63" - "\x3d\xd3\xe7\x82\xc5\x7b\xfa\x5c\xfc\xc8\x85\x3e\x2a\xcf\xf4\xb9" - "\x68\xf2\x82\x3e\x81\x8c\x3e\x0d\x0f\x4b\xf4\xf9\xee\x54\x5b\xfa" - "\x7c\x37\x9a\xd1\xe7\xbb\x08\x89\x3e\x0d\x19\x72\xfa\x7c\x17\x2b" - "\xa7\xcf\x77\x85\xb7\x47\x9f\xef\xf4\x12\x7d\xd8\x33\x18\x7d\xbe" - "\x2b\x76\x4f\x9f\xef\xaa\x24\xfa\x7c\x37\xef\xd6\xe8\xd3\xd0\xc9" - "\x33\x7d\xbe\xcb\x69\x87\x3e\x9d\xdd\xd3\xa7\x61\xca\xad\xd3\xa7" - "\x21\xa3\x3d\xfa\x78\x27\xeb\x35\xe4\xe0\x73\xef\x40\x3b\xb5\x9e" - "\xda\xc1\xb1\x43\xff\x43\x2e\xb3\xa1\x76\x3b\xe7\xe7\xcf\xf6\x68" - "\x34\xe4\xa8\x53\xc8\xb0\x3a\x72\xe9\x89\xed\x5c\x27\x7f\x3e\xb3" - "\x10\xf4\xa4\x0f\xf2\xf8\xd5\x7e\xbe\xdc\xea\xce\xbe\xb8\x37\xdb" - "\x73\xfe\xf6\x4b\x6f\xf8\xf4\x20\x8f\xe0\x3e\xba\x35\x20\x2f\xe3" - "\xef\x96\xcc\x4b\x39\x20\x0b\x46\xb6\xb7\x7f\x0b\x7d\x9d\x8e\xac" - "\x45\xfd\xf6\x92\xc1\x11\x17\x23\x93\x4f\xc6\xf8\x62\xda\xc7\x70" - "\x9f\xc5\xa5\x86\x1c\x1a\xaf\x6a\xd0\xfa\xc8\xc7\xf8\x73\xa8\x7b" - "\x5c\x24\x8d\x17\xf8\x4d\x83\xd6\x23\x3f\x80\xac\xfe\x8b\x46\xd2" - "\x18\xee\xf0\xcf\xe3\xa3\xdf\x11\x6c\x84\x83\x59\xdd\xa6\x29\x50" - "\x77\x30\xe6\x21\x5d\x9a\x86\xf9\x35\x9b\x86\x82\xec\xfb\x38\x3e" - "\x03\x63\x27\xed\x80\x23\xfa\xc9\x30\xdf\xcc\xc6\x28\x2a\x2f\xaf" - "\x79\xe8\x1d\xe6\x0b\xd7\xd4\x47\xe4\x3b\x78\x4e\x17\x28\x3f\x20" - "\xc8\xf3\x58\xff\xfe\x46\xf2\xcf\x6b\x4e\xd7\x03\xa0\x7c\x0a\xda" - "\x0e\x12\xae\x3f\x00\x65\xcc\xb9\x4c\xe3\x8d\xf3\xd9\x19\x82\x0f" - "\xf1\x3f\xf5\x70\x4e\x25\xd4\x09\x82\x3a\xaf\xa3\xec\x2e\xb4\xd1" - "\x0d\xca\xf3\x51\x07\x16\xae\x07\x43\x79\x3c\x7e\x3b\x10\xae\x77" - "\x87\xf2\xd3\x50\xfe\x15\xdb\xf3\x72\x53\x98\xa3\x8d\xb6\xdb\xdb" - "\x33\xde\x48\xf3\x95\x21\x0d\x98\x2e\xf0\x4f\x27\xff\x9f\xc6\x7a" - "\x97\x6b\x31\x4e\xd7\xaa\xc5\x6b\xcc\x47\xed\x9f\xa9\x4e\xd7\x4a" - "\x5c\xae\xe5\x39\x5d\xdb\xe7\xd2\xe6\x3e\xa7\x6b\x05\x2e\xf7\x55" - "\x39\x5d\xd3\xb9\x5c\x6b\x72\xba\x96\x21\x5c\xf3\x69\xc9\x6c\xf2" - "\x95\xbe\xe1\x35\x6a\x85\xf3\x4a\x38\xdf\xcb\xe9\x7c\x8c\x70\x1e" - "\x9e\xdf\x34\xd0\x44\xb6\x9a\x85\xf3\x94\xf6\xac\xfd\xa6\x71\x4e" - "\xed\x87\x33\x1b\x47\x53\x8c\xc3\x77\xae\xdb\xb3\xd1\xdc\xcd\xe8" - "\x77\xe0\x5a\x28\xf2\x95\x33\x6f\x2f\x4a\x52\xcf\x5d\xf6\x9a\x3a" - "\x21\x36\x11\xdd\x57\xe2\xe7\x27\xaa\xe3\x17\xcf\x8b\x95\xc5\x59" - "\x0f\xc6\x98\x83\x98\x53\x0d\x63\xb7\xd0\xfc\x05\xb9\x7c\x83\x23" - "\xe7\x07\xe0\x2a\x3c\xab\xdc\x44\x46\xd3\x67\xe5\xb0\x78\xe4\xa5" - "\x18\xfb\x85\xc5\x79\x21\x63\xeb\x48\xd3\x09\x21\xce\x8b\x01\xea" - "\x5a\x3d\xc7\x79\xb9\x52\x4d\xe3\x1b\x42\x3d\x16\xe7\xe5\x4a\x0d" - "\xcc\xf3\x91\x7c\x17\x96\xc3\x83\xe5\x36\xbb\x2c\xca\x26\xe6\xd9" - "\xad\x34\x46\x60\x06\xb3\x65\xb8\xc6\x6b\x1d\xb4\x10\xef\x13\xbe" - "\x97\x2e\x74\xba\x7f\x1e\xbb\x2e\xae\x0f\xc2\x33\x75\x83\xb4\x50" - "\xee\x52\x07\x65\x6a\xbf\xa7\xd7\x2e\x33\x5b\xde\xa6\x41\x89\xf8" - "\x4e\xf8\xde\xf2\x77\x53\x4e\xab\x23\x97\x77\x4b\xef\x76\xb9\xda" - "\x29\x16\x9c\xf0\x0e\x97\x6d\x6c\x8e\xb6\x79\x57\xea\x9f\xc8\xab" - "\x06\x25\xe2\xb3\x11\xcf\xd8\x5e\x06\x28\x6f\x1a\xa4\x15\xfb\xe3" - "\xd4\xbf\x44\xd4\xeb\xa1\x7f\xa7\xe8\x98\x00\x4d\x79\xa0\xa9\xf0" - "\x0e\x5b\xf8\xcc\xa6\x54\x96\xcb\x00\xd6\x13\xcc\xc9\x42\xd7\xaa" - "\x2b\xf3\x44\x5b\x26\xae\x51\xcc\x86\x79\x45\x92\xff\x30\x46\xd7" - "\x26\x71\xfd\xba\xe2\x24\xff\xb1\x67\xc2\xb9\x02\x67\x1e\x72\x7a" - "\xde\x09\x7c\x1e\xd4\x1b\xc7\xf6\x03\x0c\xd2\xe2\x7c\x87\xb2\x0a" - "\x7d\x31\xf1\x5e\xec\xa3\xa7\x3c\x7c\x9e\x62\x28\x4a\xe3\xf8\x7d" - "\x2f\x71\x1c\x73\xe8\x1e\xf9\xef\xfb\x8a\xf6\x3a\x21\x07\x86\x21" - "\xc7\x91\x97\xfa\xfb\x68\x9a\xdb\x4d\xf7\xf7\x31\x03\x02\x48\x0c" - "\x1b\xdb\xef\xe7\x20\xc6\xe3\x9c\x61\x58\xff\xbd\x41\xa0\x79\x24" - "\xeb\xff\xf7\x6f\xe0\x79\xc9\xff\xfe\x7b\x93\x58\x4f\xc4\x65\xf6" - "\xbd\xea\xfb\xfd\xb4\x1e\xcb\x15\x3c\x86\xd1\xfc\x57\xaa\x3a\xf2" - "\x7d\xb9\x50\xff\x12\xe5\x45\x1a\xbf\xe7\xfb\x06\x7e\xd3\xb0\x31" - "\xd0\x57\xd0\x7f\x9a\x84\x9c\x15\xec\xb9\x70\x2c\xc7\xbe\xe0\x18" - "\xe1\x5e\x72\x7e\xd3\xdf\xc7\x00\x7d\xdc\xc6\x47\x10\xfc\xba\x1f" - "\x6d\x24\x3f\x30\x19\x42\xc9\x5b\xd1\xc6\xca\xde\xf5\x87\x58\x27" - "\xdf\xe7\x00\xb1\x0e\xc3\x6e\x7a\x8d\xfa\x94\x6b\x93\xd0\x1e\x24" - "\x5c\x4b\xc2\xfd\xb5\x8e\xdf\x7e\x4e\xbf\x3b\xe1\x6f\xea\xd7\x9c" - "\x42\xd7\x56\x5f\x69\x1f\xff\x0f\xf3\xa0\x1c\xe0\x52\x0e\x96\x95" - "\x57\x30\xbf\x67\x90\xcd\xea\xa9\x0f\xb9\x70\x5e\x68\xfb\x3e\xda" - "\x9f\x24\x7e\x30\xf0\x46\x06\xee\xe9\x16\xe6\x61\x06\xee\xd9\x0e" - "\xb4\xcd\xa4\xfb\xb5\xe1\xfa\x40\xe1\x18\x2e\x1c\xfb\xb2\x3c\xad" - "\x3f\xf4\x92\x72\xad\xa3\x8d\xe6\x87\xbe\x9e\x72\xbf\xe3\x7e\x70" - "\xe1\x18\x2e\x1c\xfb\x0a\xb9\x6a\x67\xc0\x7d\x8e\xfd\xdf\xee\x7d" - "\x90\x7f\x58\x2b\xee\xe5\xb6\xeb\x06\x85\x71\xba\x08\x8c\x4d\xf7" - "\x28\xc6\x09\x4b\x6f\xc2\x58\x31\x16\x62\x24\x37\x88\x31\xb1\x25" - "\x03\x73\x83\x56\xb2\x9c\xa0\xb8\x07\x56\x81\x76\x73\x94\x1d\x2b" - "\xb5\x97\x69\x5e\xd0\xe5\x4d\x62\xde\x93\x1f\x1a\xec\x9b\x06\x85" - "\x09\xf3\x65\x0b\xf3\xd1\xbf\x4a\xed\xc5\x34\xaf\x75\x13\xfd\xee" - "\xe5\x7f\x91\x5c\x4d\x16\xeb\xb0\xb1\xbb\x4a\x6d\x5f\x3b\x32\xc5" - "\xdc\x8f\x57\xd5\x62\xae\x69\x13\xb9\x9a\x7a\x2d\x28\x21\x1a\xce" - "\x0d\x94\xfb\x4c\x5f\x1d\x8f\x6d\x62\xdf\x4d\xe4\x07\x33\xb6\x0d" - "\x75\xa2\x1d\x73\x16\xce\x2f\xb7\x91\x9e\xd0\xaf\x8b\x62\xfb\x70" - "\x1d\xe6\xbf\x99\x8e\x25\xb6\x79\x6d\x53\xde\x3a\x38\xb7\xde\xe4" - "\xdb\x39\x8f\xf9\x5c\x5f\x85\xf5\xef\xbf\x47\xb5\x27\x03\xc1\x5c" - "\x48\x86\xb9\x94\xc1\xe9\x86\x69\x59\x2c\xef\x61\xc9\xcc\xc6\x78" - "\xf5\x02\x7a\x87\x6f\xbc\x4e\x7c\xd1\x07\x82\xf1\x6c\x33\x8b\x81" - "\x0c\xe7\x00\xab\x0b\x61\x8e\xb0\xf5\xcf\xab\x75\xff\xaa\x85\xb6" - "\xd1\x93\xc5\x36\xc3\xbd\x4b\x2d\x99\xcd\x91\x8e\xfc\x09\x8e\x79" - "\xdc\x3c\x1f\xbf\x3d\xc0\xfc\xa0\x7d\x74\xed\x03\xf6\x17\xda\xaa" - "\xf7\x28\x63\xaa\x86\x69\xe9\xf7\x99\xb7\x9e\xd5\x30\x1f\xd5\xe6" - "\xbf\xfa\x84\x3e\xd4\x00\xcf\xda\xe5\xc8\x1b\x01\x75\xb2\xd1\xf7" - "\x1e\xda\x77\xbc\x67\x02\x7d\x46\x35\x9b\xeb\xcd\x0d\xdc\xa6\x61" - "\xda\x8d\x37\x88\xaf\x70\xbe\xa1\xd2\x66\xc5\xdc\x03\x6e\xe3\x6c" - "\xd1\xdc\x79\xe8\x13\xfe\xd6\x30\x2d\xee\x1b\x1a\x60\x15\xfb\x6c" - "\x69\xc0\xfd\x2a\xd8\x67\x36\xb6\x96\x33\xe2\x38\x6e\xb8\x0a\x6d" - "\xa7\x9d\x26\xf5\xc4\x12\x8b\x7e\x73\x74\x4c\x52\x44\x5f\x4e\x0b" - "\xd5\xf9\xe8\xf3\x59\x1d\xaa\xfb\xd3\x3c\x46\xd0\xfe\x76\x9a\x8b" - "\x0d\xde\x01\x68\x61\x48\xc3\x3d\xff\x16\x9a\x17\x60\x0d\x8d\xd5" - "\x01\xef\x4d\xfd\x64\xaf\x09\xdf\x49\x2c\x05\xe2\x5a\x61\x12\xce" - "\x6d\xc4\x67\x27\xdd\x20\x57\x88\xe5\x75\xcc\xb1\x0e\xe3\x91\x81" - "\xf1\xe9\x2a\x2d\x30\x4f\x92\x6f\x20\x2f\x60\x6e\xf6\x42\x13\xb1" - "\xac\x65\xeb\x1b\x8e\xb9\x25\x0e\x9f\x8f\x63\x0b\xba\x99\x19\xc6" - "\xf4\x7a\x4b\xe6\x35\x47\xfe\xc7\xec\x10\xd4\x77\x2c\xed\xc6\xd7" - "\xb5\x43\x9f\x2b\xf3\x60\xed\xec\x79\x1a\xfb\x57\xc6\x75\x1b\xa6" - "\x45\x9f\x6c\xf8\x1d\x2f\x60\x3b\xa5\x1d\xe3\x83\x6b\xef\xfa\x84" - "\xf6\xea\x5d\xc9\x78\x81\xc6\x50\x83\x73\x63\x84\xf1\xa3\xf9\x24" - "\x74\x49\x6c\x1c\x84\xfa\x36\x66\x2f\xee\xf5\x2b\xe8\x97\x53\xfe" - "\xbb\x6b\x74\xed\xc6\xd8\xf7\xdb\xa9\x4e\x78\x6d\x9f\x53\x9f\x2d" - "\x74\xff\xeb\x55\xb4\xf5\x5d\x9b\x81\xcf\xda\x80\xf1\xc3\x90\x2f" - "\x1a\x9d\xf9\xff\xda\x50\xec\x27\xfa\xfc\xda\x83\x9e\xd5\xc0\x7a" - "\xdb\x17\xc7\x19\xee\x81\x75\x7e\x98\xb6\x9d\xb5\x90\xe6\xdd\x6b" - "\xc9\xbc\xae\x11\xd7\x42\xd0\x2f\x60\x5d\x68\xe9\x4d\xf5\x4e\x90" - "\xa7\x8d\x1c\xca\x33\x2d\x6a\xe4\x1b\x98\xeb\x71\x02\xc6\xc2\xba" - "\x7f\x7d\x86\xf8\xcd\xcb\x8e\xfb\x26\xae\xd0\xef\xbd\x16\x31\x9f" - "\x1c\x8b\xd7\x77\x3d\x43\xda\x67\x71\x7d\x7d\x9b\x7d\x16\xb8\xf7" - "\x27\x97\xe6\x1d\xdb\x85\x6b\x4a\x45\x53\x3d\xae\x11\xf4\x7e\xdc" - "\x7b\x91\x06\x3a\x39\xdb\x3f\x54\x8f\xf6\x79\x9a\xf3\x04\xfb\xc2" - "\x72\x4f\xd4\xd1\xdf\xc0\xb7\xbe\x78\x64\xbc\x74\xdd\xec\xc8\x99" - "\x0e\xf4\xc6\x6f\x6d\x47\x7c\x9f\x27\x86\xc7\x70\xbd\x6e\xe9\x8d" - "\xf9\xbf\x5b\x32\x5b\x82\xc5\xdc\xdf\x34\xd7\x37\x7b\x9f\x19\x1e" - "\xe3\x32\xf6\x27\xe1\x18\x2f\x00\xf7\xd7\xd1\x31\x50\xfd\xad\x01" - "\x63\x3d\x63\xdc\x4a\x43\x0a\xe6\x64\x69\x39\xf1\x76\x08\xdd\xa3" - "\x6c\x31\xf4\xbf\x8a\x7e\x58\x4d\x17\x53\x69\x3c\x26\xff\x09\xc9" - "\x36\x1e\xef\xa3\xf2\x44\xd0\xdf\x1a\xf0\x1a\xcd\x75\x80\x6d\xde" - "\x76\xdc\xe2\x96\x7c\x41\x36\x6d\x02\xdd\xe7\x41\xa0\x15\x95\xdd" - "\xe1\x77\x48\x23\xb1\xb6\xb2\x1c\xb4\x2c\xf6\xbe\xe0\x8f\xed\xc7" - "\x62\x6c\xc0\x98\xd1\x98\x07\xd6\x78\xf5\x93\x98\xaf\xd9\xba\x84" - "\xc6\xc1\xd6\x0d\x4a\x16\xc6\x20\x79\x23\xeb\x57\xe0\xec\x64\x25" - "\xed\x23\xf6\xcf\xbb\xbe\x59\x07\x0b\x7a\x84\x5f\x4b\xa6\x35\x55" - "\x8c\xcd\xc1\xe4\x29\x16\x1f\x9b\xd1\xc2\x7a\x49\x90\x9f\x53\x85" - "\x67\xa7\xde\x81\x67\xef\x13\xda\x8c\x62\x31\xc2\x5b\x40\x06\x1a" - "\x14\xd5\x92\xd9\xea\x2b\xea\x33\xc2\x1e\xa2\xbe\x4c\xcf\x6a\xed" - "\x25\xe9\x33\x6c\x0c\x65\xfb\xee\x16\x2f\x4e\x54\xcf\x9b\xbf\x54" - "\x3b\x27\xf1\x95\x38\x75\x6c\x42\xc2\xe2\x04\x35\x06\x69\x72\x9e" - "\x3f\x2c\x8f\x51\x6b\xb8\x90\x9f\xb0\x50\xca\x4f\xd8\x9a\xec\x9c" - "\xd3\xd3\x44\x5a\x53\xef\x8c\xed\xa2\x35\xcf\x53\x3b\x3a\x25\x57" - "\x04\xff\xc5\xf0\x6f\x80\xff\x52\xb4\x65\xcc\xb6\x92\x48\x58\xeb" - "\xa9\x9f\x89\x14\x73\xa2\x35\x0a\x7d\x8c\xea\x48\xeb\xb5\xed\x9c" - "\x2f\xea\x41\x98\x37\xbc\x08\xeb\xef\x80\xfb\xe1\xdf\x00\xff\xa5" - "\xf0\x4f\xef\xe3\x3e\xa5\xfb\xe5\x8b\x9c\xaf\x31\xff\x91\xd5\xbb" - "\xb0\x0e\xbf\x1a\x3f\xd9\x63\xfe\x75\x56\xcf\xa5\x0f\x4a\x3e\xf3" - "\xaa\x58\x8f\x7e\xdb\xef\xba\x9a\xa8\xdd\xd4\xf3\xe1\x33\x2f\x15" - "\x0a\xf5\xa8\xaf\x8d\xf8\x3e\x98\x6b\x00\xea\x8b\xf5\x7c\xf9\xcc" - "\x96\x81\x42\x3d\xba\x56\x70\x99\x4a\x77\xcf\xed\xc4\x67\x16\xf7" - "\x12\xea\xa9\x9c\xdb\x73\xaa\xe3\xc7\x65\x9e\x2b\xc0\x3a\xdc\x6a" - "\xdf\x60\x26\x3b\xb5\xe6\x41\x7d\xb7\x31\x5a\xbd\xa3\xd3\xcd\x48" - "\x57\x3a\x69\x5f\x99\x1f\x3b\x64\xfe\xa2\x24\xcc\x34\x95\xb8\x78" - "\x59\x22\x1e\x17\xcd\xf9\x23\x3d\x2c\x9e\xfd\xea\x2b\xec\x47\xe2" - "\xc2\x70\xfc\xb1\x10\xf8\x0d\x8f\xf3\x96\x69\xf1\xf0\xca\x62\x2c" - "\x26\xc7\xf5\x5d\xf6\x0a\x1e\x5c\xf7\x81\x6a\x5a\x32\x6f\x36\x00" - "\x6f\xd4\x30\x9c\xbd\x09\x3a\xd2\xa5\x5e\x54\x8e\x5d\x6d\x22\x47" - "\x35\x36\x22\xda\xb5\xe4\x31\x47\x6c\x0a\x8c\x39\x12\xb8\x5a\xfb" - "\x4a\xa0\x6d\x7e\x2c\xac\x19\x20\xcb\xda\xc2\x4d\x64\x01\x11\xb0" - "\x71\x1d\x8d\x73\x9a\x79\x33\x43\xf0\xed\xf4\xe5\x74\x83\x22\x30" - "\x7e\x3f\x94\x69\x9e\x6d\x28\xc7\x41\x79\x2d\x94\x31\xbf\x76\x30" - "\x94\x47\xa1\x4d\x0a\xca\xa1\x50\xee\xc5\xe9\x34\x51\xb8\xc7\x18" - "\xca\x6a\x28\x87\x41\xfb\x3a\x71\x5e\xb8\x97\x95\x6d\x45\x62\xee" - "\x6f\x96\xe7\xdb\x66\x70\xe4\xf9\xc6\x7c\x4e\x69\xaa\x19\x74\xfd" - "\xa5\x32\x88\xad\xde\x27\xf4\xe1\x24\xa8\x53\x2f\xae\x97\xcc\xde" - "\x61\xb3\x88\xf1\x53\x98\x3d\xc3\xee\xeb\x94\x2f\x1d\xcb\xc1\x62" - "\xbe\x74\xb4\x77\xd1\x7c\x8d\x70\xe4\x33\x31\x9e\x2c\x5f\xe8\xd6" - "\x96\x47\xf3\x7c\xda\x57\x60\x6c\x5e\x73\xfa\x3c\xc5\x2f\xb7\xa3" - "\x0d\x0d\xca\x2c\xb6\x24\x7f\x85\xd8\x69\x7e\x28\x31\xee\x9c\x73" - "\x2c\x09\xb7\xfb\xa1\xbe\x00\x99\x81\xe6\xbb\x5a\xb8\x38\xd0\x36" - "\x27\x96\xc9\x81\xf6\x53\x0c\xbf\x9e\x1d\xc7\xe4\x05\x7b\x09\x3f" - "\x89\xe5\x44\x31\x11\x6e\x0c\x8b\x3d\xb5\x70\x31\x0f\xf7\x06\x26" - "\xcf\x89\xa5\xe7\xa0\xde\x1a\x90\xd5\x84\xfe\xbd\x6f\xec\x85\x7b" - "\x5c\x39\x21\x46\x86\xbd\x70\xd6\xc3\x19\xf8\x1c\x7f\x2a\x87\x7c" - "\x41\x02\x30\xdf\x26\xf6\x6d\xbb\x53\x5c\xbc\x8d\x70\x0e\x7d\x48" - "\x9b\x27\x91\x00\x8c\x03\x2c\xf4\xa5\x90\xe5\x0f\xe3\x22\xc5\x58" - "\x53\x26\x38\xe7\xfa\x3e\x93\xfe\x40\xb9\xb2\xcf\x2b\x7d\xa3\x46" - "\xc3\xaf\xbe\x42\xca\x6a\x67\xde\xec\xd5\xdc\x6d\x68\x64\xf3\x9e" - "\xb1\xbf\x61\x79\x49\x39\xd0\xff\xed\x54\x17\xe2\x50\x07\x6e\x89" - "\xce\x63\x3e\xa8\x5c\x19\xc6\xdd\xe5\x32\x51\x9e\xc4\x7d\xd3\x5c" - "\x31\xf2\x2c\xaf\x7a\x36\x6a\xc7\x2a\x8c\xf1\xac\x80\x31\xe6\x76" - "\xe3\x35\x21\x86\x97\x92\xc6\xb8\xb2\x93\x50\xba\x47\x18\x64\x14" - "\xdc\x83\x7a\x51\xa1\xa8\x40\xb9\x03\xed\x49\x5c\x26\x37\x19\xf9" - "\x16\x68\x8c\x31\x44\x2c\x7c\xb7\x41\x1a\x3e\xe8\x59\xcc\x71\xe8" - "\x8b\xb2\xae\x51\x85\x63\xc6\x63\xcc\x80\x91\xf0\x3f\x8d\xe5\x9e" - "\x79\xb9\x41\x6c\x13\xca\x01\x20\x43\xcd\x80\xa3\xaa\x25\x93\x1f" - "\xe3\x94\x93\x4f\xd8\x13\xcd\xcf\xc7\xd8\x6f\xd8\x36\x95\x9d\x15" - "\x8a\xfd\x4c\x06\xe1\x13\x4d\x44\x35\x90\xcd\x45\xcc\x35\xfa\xe6" - "\x3a\xe1\x37\xc8\x3f\xcf\x98\x5d\xda\x38\x29\xda\x4a\x19\x4f\xc3" - "\x9a\xa7\x24\x23\xe1\x7f\x1a\xd4\x3f\x60\x22\xff\x41\xeb\xaf\x51" - "\xd2\x7d\x92\x17\x7d\x42\x71\xbf\x3b\x5f\x2d\x9e\xef\xa4\x88\x84" - "\x31\xc5\x9c\x6e\x6c\xee\x37\x77\x7b\x76\x20\x94\x2d\xa2\x8d\x85" - "\xda\x5c\xb2\xd0\xaf\x4b\x2c\x3f\x1b\x09\xe5\x60\xb1\x0c\xbf\xd5" - "\x22\x56\xa0\x4d\xa2\x39\x3d\x7a\x0b\xea\x9d\xaf\x84\x82\x5c\x08" - "\xf2\x0d\x5c\x07\xfa\xbf\x39\x86\xdd\x9b\xab\x6f\xce\xdc\xa0\xb5" - "\x74\xdb\x63\xb2\x00\xfe\xc1\x35\x90\xff\x16\xd6\x0a\xed\xc4\x99" - "\x7c\xef\x2b\x17\xdf\x8d\xcb\xf4\x09\xe4\x36\x45\xa8\xe8\x3b\x2a" - "\x14\x05\xf0\x3b\xd8\x1c\x34\xb0\x01\xea\x01\xfd\x6d\xf9\xb4\x5e" - "\xd2\x65\xfd\xfa\x1b\xaa\xc9\x46\x90\xe0\x0d\xaf\xde\xc0\xf1\xa3" - "\x3e\xd9\x1b\x52\x54\x51\x28\x77\x62\x1c\x10\x9a\x13\x0d\xe3\x5b" - "\xda\x88\x1f\xcd\x29\xb0\xe9\xcf\x79\x34\x96\xfe\x72\x4d\x80\x18" - "\xdb\x92\xd7\x0d\xac\xe5\x95\x8b\x2d\x18\xef\x92\xe6\x0e\x69\xd1" - "\x74\xa5\x31\x2e\x85\xd8\x96\xdb\x92\x48\x70\x3e\xc7\x62\x5b\xd2" - "\x18\x21\x7e\xa0\xa7\x24\xb9\x8f\x6f\xc9\x67\xee\x1a\x23\xc6\xb7" - "\xe4\xaf\xdb\xad\xf0\x3b\x0c\xc6\x03\xf3\xbf\x6b\x68\x59\x8a\x37" - "\xe5\xeb\x36\xde\xa5\x12\x70\x4f\xc9\xe2\x5d\x7a\xb5\x5e\x28\x14" - "\xd4\x2e\xdb\x92\xa5\x00\xfc\x5b\x49\xf3\x02\x3a\x9d\x2b\x81\x37" - "\x11\xe2\x1b\xf0\x71\xc2\xb9\x1a\x13\x79\x23\x5f\xd0\x4b\xcd\xa8" - "\xe3\xe7\x50\xdb\x18\xd7\xc4\xdf\x8c\xdb\xe2\x0e\x73\xae\x76\xfb" - "\x28\xe6\x2a\xc6\xa7\xc8\x52\x86\x9a\x14\xca\x54\xbc\x97\xea\x92" - "\x0a\x65\xa8\xeb\xbc\x9e\xfb\xca\xe2\x79\xb1\xb3\x17\xc4\x6b\xd5" - "\x93\x26\x8f\xa4\x89\x12\xfb\xaa\xe7\x27\xc6\xd2\x25\x49\x3d\x69" - "\xf4\x88\x09\x13\x26\xcf\xfe\xc3\xe4\xe1\x93\xa7\xfc\x61\x28\xdb" - "\xb1\x38\x39\x61\x05\x26\xdb\x4c\x5c\xac\xc6\x9b\xe6\x0a\xd9\xc4" - "\x53\x62\x13\x16\xbb\xe2\x41\x30\xb5\x73\x29\xa9\x4d\xd7\x82\xbf" - "\xa9\x2d\x4d\xa1\xdc\x27\xda\xb8\x28\xf6\x29\x94\x3b\x71\x6c\x69" - "\xae\xf1\x2c\x65\x5f\x94\xaf\x84\x3c\xef\xb8\xee\xf8\xe2\x9c\xc6" - "\xf5\x07\xde\xc5\xe4\x1c\x9b\x8b\xdd\xeb\xe3\xab\xc4\xfb\x84\xb9" - "\x2c\x9c\xeb\xc1\xf7\xec\x99\x4e\xe3\x6b\x65\xf9\x04\x8b\x76\x6f" - "\x3c\x27\xf6\xa1\x0e\xeb\x64\x29\x67\x3a\xf2\x09\x67\xf9\x44\x48" - "\x79\x28\xe9\x9f\x6c\x8c\x08\x41\x71\xa6\x13\xc8\x2a\x7e\xf0\xdf" - "\x19\xff\xc7\x38\xf0\x3d\x89\xaf\x41\x9d\x2d\x50\x01\x6b\x70\xb2" - "\x0f\xcb\x63\x95\x55\x4d\x73\x2f\x4c\xb0\xdb\x7c\x66\xdb\x95\x70" - "\xf4\xe1\x67\xdb\x7d\xa9\x9e\xc8\x27\xf1\xd5\x74\xaf\x7d\x12\x5f" - "\x85\xf9\xda\x80\x8f\xd7\x4d\xb0\xa5\xad\x9b\x60\xe7\x6d\xb3\x41" - "\x7e\x87\xe3\x77\xb8\x67\x7c\x82\xfd\x3b\x9e\xe6\xac\xc1\xbd\xf5" - "\x2c\xce\x60\x29\xfa\x50\xce\x02\x1e\xde\x7e\x95\xe5\x24\x9e\xb0" - "\xe2\xfb\x73\xb3\x57\x98\x58\x4e\xe2\x2b\x2c\x8f\x37\xcb\x75\x4e" - "\xd2\xa0\x9d\xb2\xd9\x76\x1f\xf5\x04\xfb\x4d\x9e\xee\x7b\xcd\xf2" - "\x55\xb7\x97\x67\x18\x31\x76\x69\x0f\xa2\xc4\x7d\x74\xf6\xbf\x3c" - "\xad\xc3\x98\x82\xe9\x66\xde\x8a\xb1\x69\x0e\xdd\xa8\x51\xaa\x93" - "\x7c\x61\xdc\x7c\x47\x57\x6a\xc3\xdd\xef\x7b\xce\x1e\x14\xc5\x6f" - "\x7e\xce\xc2\x67\x0f\xee\xcb\x6f\x1e\x96\xc8\xeb\x22\xfa\x22\xde" - "\xf3\xd9\xcf\xfa\x43\x19\xce\x0f\xad\xe7\x37\x47\x26\xf2\xd9\x91" - "\x06\x38\x42\x79\x64\x3e\xbf\x79\x38\x94\xbb\xaf\x83\xfb\xcc\x7c" - "\x76\x88\x15\xea\x69\xf9\xec\xd0\x38\x38\x42\xb9\x47\x0d\xd4\x83" - "\xf2\x43\x63\xe0\x08\xe5\x5e\xc5\x17\x15\x9d\x54\x70\x0f\x9c\x7b" - "\x3e\x99\x3d\xeb\x85\xb5\xf4\x59\xd9\xe3\x74\xec\x19\x13\xf2\xd9" - "\x33\x26\x15\xb2\x67\x4c\xd9\xc7\x9e\xf1\x88\x06\xea\x5b\xf9\x6c" - "\x75\x30\xd4\x4b\xe6\xb3\x1f\x23\x70\x84\xf2\x2f\x9b\xa0\x1e\x94" - "\xfb\xe0\xb3\xa0\xfc\xab\x12\xa8\x0f\xe5\x27\x8a\xa0\xbe\x8d\xcf" - "\x7e\x4a\x0f\xf5\x52\xf9\xec\x7e\xd8\x3e\x94\x07\x64\x40\x3d\x28" - "\x3f\xad\x85\x23\x94\x7f\x1d\x03\xf5\xa1\x1c\x0d\xef\x34\x8c\xf0" - "\xd9\x2f\x25\xc2\x31\x83\xcf\x9e\x01\xcf\x8b\x84\xf2\xcc\x5a\x38" - "\x42\x79\x36\xdc\x3f\x1c\xca\x73\x46\xc1\x11\xca\x73\xf1\x5d\x7d" - "\xf9\xec\x79\xf0\x9c\x61\x6b\xf9\xec\x57\xe1\x9d\x23\xa1\x1c\xa7" - "\x86\x23\x94\xe7\x43\x7f\x86\x43\xf9\x8f\x78\x1f\x94\xe3\x61\x0c" - "\x86\xc1\x18\x6b\x43\xe1\xb8\x8e\xcf\x4e\x68\x80\x7a\x50\x5e\x56" - "\x0c\x47\x28\x27\xc3\x18\x0e\x87\xf2\xca\x68\x38\x42\x39\x0d\x9e" - "\x3f\x2c\x80\xcf\xce\xb0\xc1\x71\x3d\x9f\xbd\xa6\x0a\xea\x41\x39" - "\xab\x00\x8e\x50\x7e\x03\xc6\x6f\x38\x94\xd7\x8f\x83\xe3\x7a\xf7" - "\xf4\xdc\x58\xc2\xaf\xf6\x83\x3e\x6f\x9d\xc1\xaf\xee\x0c\xc7\x6d" - "\x01\xfc\xea\x4e\x1a\x3e\x5b\x7f\x00\xce\xc3\x71\x9b\x15\xca\x7d" - "\x85\x32\x1c\xb7\xd7\x43\x39\x5c\x28\xc3\x71\x07\xc8\xe3\x9d\x06" - "\x0a\x65\x38\x16\x60\x79\x30\x9f\xbd\x13\x8e\x7e\x78\x8c\x82\x72" - "\x84\x50\x86\xe3\x7f\xe7\xc3\x11\xc6\xf4\xbd\x75\x70\x3e\x92\xcf" - "\xfe\xaf\x31\x50\x86\x63\x81\x3f\x94\x47\xc1\x71\x21\x94\x47\x99" - "\xfb\xf4\x2f\x42\x5e\xe5\x42\x3a\x15\xf1\x21\x23\xb5\xe9\xd7\x88" - "\x12\x79\x14\x73\x78\xc0\xda\xfc\x68\x9d\xc2\xef\x72\x51\x9a\x89" - "\xca\x0c\xf6\xdc\xe7\xcc\x5c\x08\xb5\x77\xf9\x41\xbd\xce\x17\x15" - "\xfe\x3d\x10\x8f\x8c\xa9\x26\x9a\x47\x50\x88\x8f\xe9\x57\xa7\xe8" - "\xdc\x1d\xe4\x2b\xcc\x05\xa1\x84\xf1\xea\xcb\x67\x76\xba\x0a\xc7" - "\x5d\x7c\xe6\xfd\x75\x30\x5e\x50\x0e\xfa\x02\x8e\x50\xfe\x8f\x37" - "\x61\xbc\xa0\xfc\xf2\x08\x38\xee\x6a\xc9\xea\x9c\x68\x52\xf8\x2e" - "\xa4\xf8\xb2\x67\x6c\x78\xa0\x8d\xe7\x27\x00\xd2\xf2\xef\xc6\x17" - "\x05\xda\x0c\xc0\x63\x13\x75\x81\x18\xe7\x71\xe7\x00\xe8\x6b\x57" - "\x03\xf6\x09\x73\xfa\xf0\x37\xc3\x94\xec\xd9\xf7\xf3\xf0\xec\x77" - "\x31\xf7\x04\x1f\xf2\xb8\xa7\xeb\x87\xe9\xf5\xc7\x16\x85\xb3\xeb" - "\xfe\x44\xba\xfe\x32\x5e\x3f\x1f\x88\x31\xdc\x1f\x7f\x9c\x5e\x37" - "\x5a\x1a\x84\xf7\xf2\xc1\x6b\x76\xac\x6b\x52\xf8\xab\x19\xfe\x77" - "\x86\x35\xce\x87\x34\xab\x22\x42\x5b\xb2\xfc\xc3\xa1\xef\x7d\x05" - "\xf9\x3f\x82\x57\x0d\x8a\x64\xf1\x51\x86\xb9\x8d\x49\x89\xfa\x2f" - "\x97\x33\x2d\x74\x03\x60\x28\xea\xd4\xb0\x96\x2a\xd5\x69\x61\xc5" - "\x75\x8a\xfb\x6c\xdb\x50\xe6\x0a\x5e\x68\x66\xd8\xea\x7f\xf8\xe6" - "\x5b\x11\xf3\xd4\x29\x81\xf0\xfc\xfb\xec\xe9\x56\xfe\x9a\x21\x6d" - "\x04\xe0\x32\x3d\xaf\xa7\xfb\x8f\xd8\xef\xf5\xd4\xaf\x94\xfd\x4e" - "\xa6\x36\x6c\x68\x0b\xef\x75\xd6\x61\xec\x59\xa5\xa5\x5c\x48\x3c" - "\xa1\xdf\xe5\x15\xfe\x47\x3f\xe1\x4c\xca\xc0\x44\xd2\x49\x9d\x72" - "\x08\xdb\x0f\x90\xe9\xbb\x8e\xba\x78\xcd\xff\x87\x83\x50\x77\x2b" - "\xda\xa6\xb2\xee\xeb\xe5\xc8\xcf\x0c\xef\xf0\x27\x5c\x47\x95\x04" - "\x73\x93\xf9\x52\xf9\x59\x71\x5f\x3e\xee\x94\xb2\x05\x47\x11\x5b" - "\x4e\x27\xbd\x3d\x67\xa1\x99\xcf\x8d\x27\x5d\x6d\x0a\x16\x57\x58" - "\x71\xdf\x89\x01\x56\x94\x57\x8f\x61\xdd\x37\x38\xbf\x2f\x43\xfb" - "\x27\x13\xa5\x21\xe1\x34\x96\xcb\xf8\xac\xb3\x11\xc6\xa6\x1a\x62" - "\x48\xa0\x6d\x95\xf2\x59\xd7\xc2\x39\xbf\x4b\xc9\xdb\x51\xee\x4f" - "\x46\xbb\xdd\x17\x78\x7e\x3c\xd0\x05\xd6\xa4\xfb\x0a\xc5\xbe\xe0" - "\x7a\xb4\x01\xc6\x0e\x65\x72\x8c\xa5\x31\xdb\x6e\xc7\xd8\x74\xeb" - "\x4c\x30\x0e\x8c\x5e\xf7\xad\xc7\x1c\xf1\xc2\x73\xcf\x73\xdd\x22" - "\xa2\x2a\x67\xe0\x37\x48\x7f\x8c\xf5\x75\x8d\xee\xbf\xc7\xcc\xc9" - "\x1c\xca\x10\xac\xae\x33\xed\xe6\x0b\x71\x07\xe6\x2f\x4a\x4c\x58" - "\xa2\x5e\x3a\x3f\x25\x76\x68\x9f\x65\x7d\xd5\x09\xc9\xea\x04\x5c" - "\xc2\xd9\x09\x58\xe6\x97\x2e\x5c\x9c\xa8\xc6\x8c\xe6\x6d\xf3\x21" - "\x87\xf2\xaa\x08\x0d\x95\x57\x15\x81\xd4\x46\xc0\xeb\xe3\x0b\x13" - "\x53\x79\x4e\xfd\x58\x67\xfe\x8a\xa2\x4b\x7e\xab\x5f\x17\x1a\x87" - "\x84\xcb\x54\x53\xbd\x11\xd6\xed\x80\x2d\xdd\x08\xee\x11\xf4\x6f" - "\xc9\xea\xe2\xc8\x7f\x6e\x52\x04\xd6\x52\x5b\x4c\x56\x97\x42\xe0" - "\xc7\x71\xc2\xb7\x38\xb6\xc7\x46\xb8\x46\xbf\x55\x67\x75\x29\x05" - "\xbd\x74\x17\xa5\x95\x3e\xde\x9f\xad\xe9\x5d\xac\xf4\xd9\xea\xf8" - "\x42\xbe\x60\x40\x11\xc8\x85\x0a\xfa\x5d\xd0\xf6\x28\x6f\x24\x57" - "\x69\x2c\x02\x98\x6b\x2a\x8c\x01\x62\xcf\x1d\xa1\xe3\x42\x26\xaa" - "\xb8\xbf\x84\x6b\xd3\xdf\x25\xca\xbd\x80\x05\xbe\x6a\x98\x0f\x8f" - "\x91\x47\x0f\xa5\x35\x28\xaf\x28\xee\xbf\xef\x50\x5a\x8d\x92\xcf" - "\x19\x19\xd7\x1c\x36\x3c\xcf\x2a\xe4\xcd\x36\xda\xac\xe4\xf3\x51" - "\x04\xf5\xc2\x62\x4b\xf7\xe9\xf0\x3f\x22\xd9\xba\x79\xae\xda\xf0" - "\xd8\x33\x64\xf4\x13\xfc\xf7\x9f\x95\x10\xd2\xa4\x08\x2c\xf9\x6c" - "\x14\xea\x2a\x11\x6a\xab\x2a\x22\xcc\x92\x1b\x85\x7b\x7b\xcd\xad" - "\xb9\x73\xb5\x37\x42\x46\x99\x8f\x40\x9d\x63\xa0\x4b\x1d\x87\xd9" - "\x86\xb1\x66\x5b\x1f\x1f\x40\xf6\xde\xd0\x29\x4b\x4b\x22\x98\x1d" - "\x39\x06\xe6\x0c\xe5\xa7\xfb\x77\x7f\xb6\xaf\x84\xc0\xb3\xe1\xfa" - "\x18\xe5\xe7\x83\xdb\x5c\xaf\xf8\x2c\xbc\x84\xb4\x60\xcc\x66\xd0" - "\x55\x0f\x9e\xce\x23\x7c\xee\xb4\xaa\xdd\x29\x56\x25\x08\xe2\xca" - "\x8a\x9a\x3c\x92\x7a\x81\x3c\x60\xfb\x5e\xe3\xfb\x21\xdc\xdf\x8a" - "\x31\x55\x8f\x87\xd2\xd8\x8a\x69\x06\x9a\x13\x37\xb0\x12\xe4\x0f" - "\xee\x7b\x8d\x5f\xe5\x64\x03\x81\xeb\x5f\xd9\x7e\x1f\x4a\x2a\xe2" - "\xcc\xc4\x18\xad\x27\xad\xca\x48\xb2\xff\x25\x3d\xd9\x0a\x7a\xcf" - "\xd6\x2b\x24\x80\xca\xd2\x37\x35\x7e\xb6\x9b\x1a\x5f\xdb\x4a\x0d" - "\xc6\xba\xe2\xf9\xef\x35\x5d\x50\xb6\xb6\x2d\xd6\xf8\x57\x9a\xf5" - "\x64\x40\x03\xd1\xb4\x2a\x49\x60\xeb\x4a\x4d\x97\x4a\x6d\x1e\xb4" - "\x05\xc2\x32\x8c\x2b\xc6\xd9\xc3\xf8\x7b\x38\x4e\xf7\x47\x93\xc9" - "\x4d\x8a\xfb\x5f\xef\x52\x4d\xba\x63\x9c\x57\x94\x57\x31\x46\x34" - "\x17\x3c\xad\xca\x1e\x1c\xa5\x4b\xbb\x06\xfd\xc2\x38\x46\x7b\xc6" - "\xaa\x50\xde\x07\x59\x46\x81\xef\xcc\xf1\x9a\x2e\xb3\xf1\xf8\xd6" - "\xc0\xaf\x50\xe6\xe7\x5a\x42\x31\xdf\x94\x3f\xf6\x13\x73\x3f\xaf" - "\x3a\x0f\x63\x99\xae\xf1\x85\x7a\x01\x70\xbe\xab\xb1\xc9\x4a\xec" - "\xfd\xc6\xaa\xfb\x6b\x69\x4e\xdf\xe0\xed\x69\x44\xa5\x4b\x23\xc1" - "\xea\xff\xa0\xbc\xb4\xd3\xbe\x7b\x2c\xc8\x92\xbd\x92\xd1\xbe\xc3" - "\xce\x75\x7d\x5d\xfd\x3c\x21\xea\x67\xe8\xef\x7e\xea\x21\x40\xc3" - "\xe0\x69\xe1\x54\x1f\x41\x1d\x58\xd1\xb5\x37\xe3\xf1\xae\x3d\x5a" - "\xfd\x5e\x3d\xc0\x65\x6d\xa9\xe1\x56\xfb\xf6\xc2\x7c\xdf\x57\x14" - "\x0f\xd8\xf9\xec\xbf\x8d\xe2\x73\xe6\x52\x5e\x84\x72\x6b\xab\x5f" - "\xa8\x1a\xce\x15\x42\xfb\x11\xad\x0a\xdf\x6a\xf8\xaf\x61\xf7\x3f" - "\x60\xc6\xf7\xb6\x17\x0c\x58\x87\xef\x4d\x73\x14\xc1\x7b\xcd\x06" - "\x9a\xf1\x21\x53\x4d\x34\x6e\xff\x4d\x18\x5f\x21\x87\x2b\x8e\x07" - "\x8e\x01\x77\x53\xd3\x85\xbe\xeb\x4d\x4d\x00\x8c\x2f\xc6\x74\x0e" - "\x4c\x9b\x03\xf7\xe4\x4e\xb5\xc0\xb5\xae\xad\xc1\xd3\x34\x98\x2b" - "\xcc\xa8\x35\x13\xfb\xe6\xa9\x66\x8c\x59\xb8\x25\x05\xe6\x5c\xf7" - "\xa9\x26\x7e\xf3\x54\x71\x6e\x11\xec\x27\x97\xfd\x37\x4b\x2b\xee" - "\xd5\x83\xbe\x41\xff\xaa\xe1\xbf\xc6\xa4\x78\x20\xb1\xb5\xcf\x80" - "\x3c\x38\x8e\x81\xbe\xf6\xe2\xb3\x06\x16\xe2\x6f\xb8\xd6\x0b\xde" - "\x79\x26\x8e\x03\x8e\x87\x30\x16\x53\xa4\xb1\x88\xa9\x87\x7a\xa3" - "\xb8\xac\x9c\x54\x93\xa2\x6b\x18\x9f\x35\x20\xce\xa9\xde\x2a\xa9" - "\xde\xc2\x75\xac\xde\x8e\xbe\xac\xde\x6f\x4d\x40\x87\x1e\xc2\x78" - "\x1f\x76\x33\xde\xfb\xa5\x7b\xa7\x84\xb3\x7b\xdf\x38\xc0\xee\x0d" - "\x83\x7b\xbb\xfe\xe0\xd2\xa7\x4b\x52\xfd\x09\xf3\x58\xfd\xb5\x0b" - "\x59\xfd\x47\x77\x49\xf5\x02\x83\xa4\x7a\x2f\x99\x59\xbd\x8d\xbe" - "\xac\xde\x93\x01\x70\x7d\x7c\xdb\xbe\x04\x8e\x96\xee\x49\x4e\x64" - "\xf7\x7c\xa0\x66\xf7\x8c\xca\x87\xeb\xab\xe4\x7d\x09\x5c\x26\xd5" - "\x4f\x10\xde\xbb\xa0\x88\xd5\x1f\x36\xc6\xa9\xde\x36\x81\x27\xe0" - "\xfa\x5e\xa8\xd7\x35\xb4\xd5\x2f\x2d\x9a\xd5\x7b\xa1\x01\xf9\x11" - "\xea\x7c\xc2\x65\x3d\xe2\xdf\xea\xd7\xd3\x02\xed\x04\x00\x6d\x42" - "\xf1\x08\xb4\x0b\xe5\x74\x11\xd0\x87\x80\xb5\xf8\x9d\x08\x31\xd7" - "\xa4\xe8\x32\x0f\x70\xd7\xee\xd6\x96\x96\x15\x68\x73\xd8\xf2\x38" - "\x90\x1f\x36\x3f\x67\xf0\x98\x23\x1a\x65\x88\xdc\x61\x2a\x1d\xc7" - "\x72\xcd\x03\x8f\x82\xfc\xa3\xea\x03\x6b\x61\x06\x8d\xdd\x9c\x33" - "\x51\xc7\x85\x01\xc6\x5e\x26\x3e\xc6\xd4\x06\x52\xc4\x35\x28\x75" - "\x37\x88\x6f\x25\x3c\x01\xeb\x17\xc1\x9a\xaa\x5e\x84\xb2\x85\x6a" - "\xa8\xee\xba\xd0\x9e\x3e\xbe\x28\x3d\x9e\xe5\xd7\x46\x39\x0c\xb1" - "\x19\xe6\x63\x00\xcd\xfb\xb6\xa8\x33\xd6\x5d\x02\xbf\xfd\xb1\x6e" - "\xeb\xe3\xfd\xc3\x5b\xdf\x8b\x2f\xba\x11\x32\xd2\x7c\xe3\x2f\x4f" - "\xab\x6e\x86\x4c\xd4\xdd\xcc\x8d\x52\xd9\xde\x8b\x57\xdb\x1e\x1f" - "\x50\x64\x0f\x19\xa5\x85\x67\x03\x6e\xe7\x29\xf7\x70\x45\xca\x3d" - "\x69\x06\x25\xb6\x7b\x28\x4d\xaf\x3c\x98\x56\xa5\x3c\xc8\x15\x2b" - "\x0f\xa5\xe9\xe0\x58\x88\x39\xc0\x40\xde\x53\x1d\x3e\x98\x56\x0a" - "\xeb\x46\x10\x81\x79\xd0\x20\xda\x42\xf9\x11\x36\x52\x59\x68\x23" - "\x47\x13\xaf\x11\x73\x50\x84\x06\xfe\xfb\x9a\xbb\x4f\x0b\x35\x77" - "\x9f\xab\xa6\x7d\x0e\x89\xa6\xef\x88\x7b\x5d\x0f\x72\xac\xcf\xc2" - "\x78\x40\x9b\x41\x4f\x6c\xc7\x6f\xbe\x62\x5c\x6b\x45\x50\x7d\x9b" - "\xb8\xd6\x4a\x96\x7f\xce\x11\xdb\xfa\xa7\x88\x6b\x2d\xd8\x1c\x68" - "\x5c\x6b\xd0\x1f\xa9\x1e\x09\xeb\x17\xcd\x59\x69\x03\xf9\x6c\xf3" - "\x04\x2d\xea\x8b\x28\x8f\xb5\x64\x75\x53\x89\xfa\x1e\xca\x18\xf6" - "\x4d\x11\x83\xe1\x7f\x20\x9c\xd7\x98\x14\x1f\xad\x15\xcf\xf3\xb9" - "\x7e\xf8\x3d\xc0\xc7\xce\xc7\x3d\xd7\x82\xfb\x37\xf9\xb8\x61\xf6" - "\xcd\x23\x32\xec\x9b\xe7\x12\x38\x17\x01\xff\x43\xed\x9b\xfd\xf6" - "\xc1\x7f\x31\xfc\x1f\x80\x7f\x03\xfc\x97\xc0\x7f\x29\xfc\x57\xc1" - "\x7f\x35\xfc\xd7\xc0\x7f\x2d\xfc\x9b\xe0\xbf\x9e\xef\xee\x57\x8e" - "\x71\x39\xa1\x6d\x33\xd0\x3d\x54\x6c\x57\x1a\xdf\x6e\x1b\xe0\x7d" - "\x23\x51\xfe\x01\xbc\x8a\xe1\x19\x5e\x85\xf2\x3b\xfb\x17\x23\xee" - "\xf2\x7d\x86\xe7\x99\x7b\xc7\xeb\xcd\xdd\xa3\xf5\x70\xf4\x37\x07" - "\x69\xd5\xf0\x0f\x34\xd4\x86\x9b\x37\x4f\x0b\x07\x1a\xfa\x03\x2d" - "\x0d\xf0\x2e\x30\x6f\x7a\x54\x31\xbb\xd4\x2f\x80\xfe\x3d\xcc\xc2" - "\xef\x00\x93\x22\x84\xee\xc1\x81\x36\x32\xa0\xdc\xcb\xa4\x78\x90" - "\xd6\x6b\x0e\x99\x16\x29\xec\xfd\xc4\xf3\x03\x4d\xbe\xbf\x24\xac" - "\x5e\x94\x4c\x76\x8a\x7f\x45\x3b\x3b\x7e\x4e\xf2\xec\xa5\x0b\xe7" - "\xbf\x12\xbb\x74\x88\xba\xcf\x3c\xb5\x66\x7e\xc2\x92\xd9\x4b\x96" - "\xc5\x2e\x8b\xa5\xa2\x13\x9c\x7a\x42\xee\xd7\x86\xb9\x3b\x6c\xa0" - "\x07\x74\xad\xe7\x79\x5c\xb3\xc6\x59\x80\xcf\x1e\x8b\x2f\x3a\x70" - "\xc5\xac\xb4\x83\xec\x12\x50\x9f\x01\x73\x6f\xa2\xee\xc0\x15\xab" - "\x32\xa0\x5e\x4d\x78\xe0\x77\xbc\x66\xac\xaf\x12\x64\x99\x2f\x48" - "\x39\xca\x32\x50\x67\xcf\x22\xab\xf2\x45\xbc\xff\x2f\x03\x8a\xf6" - "\xc2\x6f\x38\xa7\xc2\xfb\x78\x90\x6f\xe8\x11\xe4\x1b\x56\x1e\x69" - "\x3e\x48\x8f\x51\xaa\x83\xb4\xde\x28\xed\x21\x3c\x5e\x5f\xc5\x97" - "\x43\xbb\x68\x6f\xe3\xff\xd2\x3f\x9c\xd6\x81\xf9\x46\xeb\xc0\x5c" - "\xab\x53\x04\x97\x62\x3d\xaa\x53\x40\x1f\xf7\x42\x3f\x40\xe7\xf7" - "\x15\xe7\x2f\xea\x10\x8e\x39\x9c\x84\xb2\x5e\xf0\xd3\x38\x87\xb1" - "\x3f\x3c\xcc\xd9\xdd\x70\xef\x9e\x45\x66\x66\x9b\xbd\x86\x58\x61" - "\x22\x88\x13\x88\x0f\xc6\xd4\x2a\x7a\x7f\x11\x57\xa5\x44\x3d\x04" - "\xee\x5d\x82\xd7\x68\x8e\x12\x2a\x8f\x07\xef\x12\x65\x60\x31\x47" - "\x49\x40\x0c\xf0\xc6\x5c\xf2\xe8\x15\xc5\x2f\x5e\xc7\xf1\xc3\xf1" - "\xc2\x6f\xb2\x7c\xd6\x2f\x46\x61\xfc\x85\x6d\xdd\x88\xbf\xad\xfb" - "\x42\x2b\xb3\xd7\x04\x37\x89\x72\xa5\x25\x78\xa1\xd5\x99\x6e\x8c" - "\x5e\xea\xd8\x45\x73\xe6\x2e\x8c\x9d\x47\x3f\xe3\xcd\x59\xba\x74" - "\x59\x7c\xac\x3a\x76\xce\x2b\x71\x6a\x7a\x59\xbd\x6c\x29\x54\x99" - "\x9f\xb8\x54\xbd\x78\xf9\x22\x75\xfc\xd2\xf9\x28\x21\xc7\x26\x24" - "\x2c\xd3\x26\x76\x21\xec\x4e\x75\xfc\xb2\x85\x89\xf3\xb5\xf0\x63" - "\x69\xec\xa2\x79\x6a\x4a\xf5\xa5\xd0\xd4\xc2\x85\x6a\xe1\x09\x4b" - "\xe3\xe6\x24\x20\x23\x2c\x7a\x0d\x2a\x39\xdd\x2f\x97\x9f\x03\x30" - "\xc6\x1e\xfa\x76\x5d\x51\x84\x8c\x2f\xf1\x85\xb1\xce\x59\x68\x45" - "\x9f\x08\x28\x8f\xa3\x3a\x55\x56\xb0\x0d\x6d\xd7\x6f\xc3\x3b\x36" - "\x03\xdf\xb7\x64\x75\x2f\x15\xdf\x8d\xda\xb2\x31\xee\x28\xc6\xb4" - "\x55\x84\xfc\x96\xee\x41\x06\xfe\xa7\x3e\x33\x59\xdd\x03\xd9\x58" - "\x74\xb7\x3a\xdb\xc5\x98\x1d\x36\x24\x08\x7d\xf3\x60\x0e\x8c\x43" - "\xb9\x40\xc8\x13\xa1\x80\x7b\x86\xe2\x3d\xdc\xe6\xb9\xb0\x66\x84" - "\x84\x4b\xb2\x79\x88\x3f\xd6\xa7\xf5\xb2\xba\xbf\xc4\x77\x9f\x06" - "\x6b\x72\xf7\x26\xec\x97\x87\x75\x44\x7d\x1d\xda\x3d\x5e\x44\xc8" - "\x53\xc1\x44\x73\xfd\xad\x61\xfa\x96\x6e\x11\x91\x37\x32\x49\xe7" - "\x1b\x30\x97\xad\x4a\xf2\x68\x2b\xf0\xc5\x8a\xa7\x89\xcf\xaa\xf1" - "\x44\x59\xb4\xa0\x08\xe3\x26\x93\xf2\x31\x79\xc4\x18\x03\xba\xb7" - "\x75\x17\x29\x37\xd4\x91\x0a\xdb\x07\x2c\x17\x49\x0a\xca\xd6\x0f" - "\xfe\x15\xe3\xe4\xa5\xaf\xe2\xed\x7b\x3f\x36\x77\xda\xd3\x58\x84" - "\x39\x44\x1e\x35\xda\xce\x19\x8c\xa9\x05\xc4\x98\x6c\x34\x60\x8c" - "\x12\x18\xb7\x6d\x07\xe1\xda\x7d\xe5\x70\xdf\x8b\xa4\x33\x94\x37" - "\xe1\x33\xd6\xe5\xf2\x35\x6f\x84\xf0\xb5\x6f\xe4\xf2\x26\xe0\xa9" - "\xfa\xf5\x42\x5e\x10\xf4\x39\x40\xdf\x0a\xe4\x53\x6d\x12\x09\x6d" - "\x54\x3c\xa8\xa1\x36\x80\x51\xb4\xdc\x03\xca\xf4\x3b\xb6\x31\x39" - "\x17\xcb\x3d\xa1\x3c\x86\x95\xb7\x63\xf9\x21\x28\x47\xb3\xf2\x67" - "\x58\xee\x05\xe5\x38\x56\xae\x24\x34\xd6\x86\xe2\x41\x16\x7f\x20" - "\xf9\x2b\x2c\xc3\xd8\x3f\xb8\xce\x90\x84\xfd\x3d\x0b\x34\x7b\x70" - "\x73\xfa\x19\xd0\xd1\x92\x2f\xd2\xf9\x70\x28\x2d\x0e\x6d\x14\x30" - "\x1f\x1e\xec\x71\x7f\x2d\xea\x77\x0f\x16\xfb\x85\xe3\x31\xe4\x40" - "\xa0\x95\x74\x06\x79\xe9\x7e\x78\x9f\x37\x70\xec\xdc\xda\x64\xf6" - "\x0c\x3f\x37\xc1\xc6\x1b\xf8\x9d\x03\x0a\xf9\xcd\x93\x54\xfc\xce" - "\x70\xf4\x5d\x84\xb5\xec\xb9\xaa\xa2\x14\x2b\x8d\x5d\x0d\x32\x2a" - "\xcc\xa1\x07\xa9\x5f\xb6\x19\x64\x3e\x0f\xb1\x6c\x55\xfc\xe6\x91" - "\x2a\xd0\xa5\xf2\xc6\x6b\x6c\xe8\x43\x0d\x72\x6e\xe8\x1b\x47\xe3" - "\x50\x36\x88\x5e\xc3\x15\x84\x9b\xb9\xf4\x68\xc2\x87\x0d\x28\x1c" - "\x1f\xc7\x1b\x60\x9d\x52\x30\xfb\x37\x8f\xcf\x3f\x47\x9f\xdb\x67" - "\x40\x21\xb7\x3c\x0e\x73\x4f\x51\x7c\x49\xc3\x35\x3b\x09\xf0\x64" - "\x65\x74\xa0\x7d\x73\x74\xc6\xd1\xb8\x0b\xde\xe5\x31\x52\x84\x7a" - "\x8e\xab\x0e\x7d\xc2\x58\xae\x36\x78\x8e\x0d\xde\x15\xe5\x83\x3d" - "\x5c\xa9\x12\xe4\x94\xc2\xdd\x73\x6b\x3a\xf1\xcb\xa3\x03\xe1\x9d" - "\x9e\x36\x6a\xae\x91\xca\x1b\x38\x57\x7a\x8c\x39\x0a\x54\x19\x9d" - "\x6c\x33\x04\x9a\x69\xcc\x6d\x15\xe6\xa0\xe1\xbb\x8f\x54\x35\x2a" - "\x7a\xe4\xbd\x98\x0a\xef\x00\xef\x7e\xb0\xae\xc6\x97\x83\xf7\x18" - "\xc0\xc6\x0d\xef\x4b\x85\xb1\xcd\x13\x65\x7b\xef\xfa\xdf\x83\xf2" - "\x0d\xb7\x34\x9a\xe0\xde\xe8\xbd\x20\x93\x70\x37\xa3\x03\x39\x58" - "\x7f\xf0\xda\x51\xcd\x65\x82\xcf\x64\x63\xdd\x83\x7e\x43\xe4\xc3" - "\x60\x9c\xe1\xf9\x18\xeb\x5b\x1c\x57\xa8\x9b\x6a\xbf\x19\xe7\x9e" - "\xfe\xb9\xd1\x51\xd0\x3f\x1d\xbf\xd9\xcf\x6d\x0c\x54\x58\x6f\xd3" - "\x19\x7f\xf4\x2f\x85\xff\x1a\xfe\xdd\x78\x95\xb9\x4f\xff\x06\x9a" - "\x1b\x34\x77\x42\x86\x68\x27\x81\xf9\x06\x3c\xd2\xb3\x47\x11\xe8" - "\xc3\xee\xe3\x1b\xe6\xb2\x9c\x6c\x9d\xce\xf1\x81\x76\xcc\x35\x7c" - "\x0d\xe3\xc6\xe7\x1d\xd5\x58\xbc\xa4\x69\xcf\x19\x9e\x68\x8a\xed" - "\x83\x5e\x7d\xd3\xcb\xf6\x76\x79\xe4\x91\x02\x18\x97\x60\x3f\xfd" - "\x0d\x7e\x94\x82\xc9\xdf\xbd\x26\xe2\x58\xd9\x60\x1d\x49\x39\x49" - "\x94\x56\x58\x2f\x3f\x98\xba\x4e\xd9\x17\xd6\x19\x3b\xac\xfd\x65" - "\x55\x25\x64\xc2\x38\x92\x5e\x11\x77\x95\x88\xb9\xd6\x60\x5d\x53" - "\xbd\x3f\xd5\xac\xc4\xef\x50\x98\x5b\x8d\xea\xaa\xb9\x53\xa3\x3e" - "\xfc\x0a\xd6\x4c\x90\x1b\x76\x7f\x65\x56\xda\x9a\xa3\xd5\x34\x6e" - "\x3d\xe8\xe5\xe9\x71\x3c\xe7\xf8\x36\x85\xb9\x4d\x74\x03\x6b\x31" - "\x77\xf5\xf1\xa8\x2a\x1a\x4b\xe0\x78\x74\x09\x39\x5e\x9b\x47\xca" - "\xeb\xcf\xe0\x1e\xeb\x77\x8f\x47\xeb\x50\x66\xec\x6a\x03\xb9\x70" - "\x2b\xc8\x85\x30\x5f\xef\xe3\x54\xb9\x79\xe2\xf7\x29\xcc\xc5\x26" - "\xca\x84\x36\x98\xa3\xf9\x42\xbe\x35\x5b\x56\xcf\xc8\x7c\xe1\x5b" - "\x15\xe6\x61\x7b\x27\x89\x84\xbd\xa3\xe4\xa2\xdd\x7d\x97\xea\xba" - "\x84\xfa\x61\x87\x72\x41\xb9\x79\x62\x3e\xb6\x17\x97\xa8\xc9\x3f" - "\xe0\xdd\x8f\x6a\xbc\x9d\x93\xbd\xa8\x0f\x9d\x0d\xf8\xce\x06\x3c" - "\x67\x83\xf1\x34\x29\x1e\x0a\x00\xba\xb9\xd5\x43\x44\x1a\xdc\x4c" - "\x17\x69\xf0\xf0\x79\x4a\x03\xd0\x5f\x56\x4e\x17\x68\x70\x1a\x68" - "\x50\x0f\x34\xc8\x24\x19\xc7\x26\x97\x93\x09\x51\x40\x83\xa6\xab" - "\x98\xf3\x80\xe5\xbb\x4b\x64\x63\x4f\x69\x71\xda\xac\xac\xb4\x30" - "\x1a\xec\x7a\x89\xd1\x60\xcf\x4b\x66\x90\x63\x06\x90\xf7\xa1\x6c" - "\x5f\x1e\xad\xc6\x3c\x54\x7c\x66\x0c\xe6\xe6\x66\xb4\xb8\x09\xb4" - "\xb8\xc9\x68\x91\xb6\x04\x68\x51\x5d\x43\xe3\x5d\x1d\xaf\x2d\x27" - "\xe5\x31\x7a\x52\x01\xb8\x04\xb4\x98\x83\x74\x41\xdd\xda\xbe\x52" - "\xd3\x0d\x74\xe9\xe0\xfc\x14\x12\x2a\xd2\x03\x74\xf7\x2e\x1b\x52" - "\x08\xfa\x0e\x87\xc3\xdc\x14\xe9\x11\x4c\xe9\x71\x59\xa0\xc7\x0d" - "\xf4\xbf\x03\x7a\xdc\x00\x7a\xdc\x00\x7a\x64\x32\x7a\x20\xce\xbf" - "\x68\x09\xe4\xb9\x7f\x6a\x30\x1e\x46\x5b\x7a\xac\x14\xe8\x71\xfa" - "\x76\xe8\xf1\xf0\xae\xb6\xf4\xe8\xa5\xeb\x88\x1e\xd2\x9c\x78\xf4" - "\x75\xa4\xc7\x4d\xbd\x30\x27\x1e\xc7\x39\x91\xa1\x7c\x0a\xd6\x22" - "\x1c\xd3\xb2\xaa\x03\x74\x4e\x60\xae\xb1\xf7\xa7\x5a\x95\xe5\xf5" - "\x40\x97\x79\x40\x97\x14\x89\x2e\x8c\x1e\x13\x55\x85\x5f\xb1\xf1" - "\x57\x8f\xc5\x35\x03\xe7\x06\xd2\x07\xe8\x04\xf3\xc7\x5d\xae\x42" - "\xe7\x6f\xb8\xd0\x26\x87\xf3\x04\xe7\x08\xce\x87\x8a\xb8\x33\x34" - "\xf7\xfb\xf1\xa8\x52\x82\xdf\x72\x8f\x47\x1f\x00\x5a\xe5\x11\xfb" - "\x72\xa0\x4d\x12\xee\x17\x21\xbd\x31\x67\xe1\xf1\xe8\x75\x28\x2f" - "\xa8\x80\xe7\xef\xb3\x03\x9d\xec\x2d\xa1\x5d\xd6\x83\x1e\x85\xdf" - "\x78\x9d\xbf\xed\x62\x7e\x66\xde\xaf\x67\x24\x9c\xf7\xb5\x01\x8d" - "\x60\xee\xc8\xe6\x8c\x23\x6f\xf3\xb7\x1a\xb2\xad\x8e\xf8\x3f\x30" - "\x9f\xd1\xc8\xee\x34\x67\xc6\xcf\xc7\x39\x93\x01\x34\x3a\xe9\x25" - "\x8d\x1e\x65\x7b\xa8\x42\x00\xab\xbb\xfb\xe9\x61\x9d\x04\x1a\x3d" - "\xa2\xf6\x44\x23\x7b\x41\xff\x52\xbb\x2a\x02\xbf\x3d\x3f\xca\x2d" - "\x9e\xac\xe0\x40\x67\xba\x01\xba\xe9\x71\xb3\x8d\xa4\xce\x24\xca" - "\x94\x33\xc4\xcf\x38\xf9\x0b\x62\x34\x15\xd3\xb8\xe9\x68\xf3\xc5" - "\x7c\x26\x46\x5b\x31\xe0\xd5\xdc\x0c\x2c\x6f\xa3\x65\x33\x59\x39" - "\x93\xf8\xd0\x5c\xa6\xd1\x7a\xb2\x1e\xf8\x73\xf7\x4b\x7a\x25\x97" - "\x33\x32\x8e\x57\x61\x1e\x26\x62\xa8\xd4\xda\x30\xee\x5b\x40\x45" - "\x5c\x39\xc6\xca\x3c\x87\x71\xc9\x2b\x2d\xd0\xa6\x99\xbf\x61\x87" - "\x35\x63\x7b\x26\x5f\x8c\xb9\x29\x06\xe0\x1a\x81\xb1\xec\x14\xea" - "\x39\x28\x8b\xa0\xed\xcb\x90\xf6\x0e\xc8\x5e\x6a\xea\x0b\x0c\xe7" - "\x14\x15\x0b\x2c\x70\xfd\x97\x27\xb1\x5f\xcc\x0e\xcd\x8e\x03\x30" - "\xc6\x78\xc8\xdc\x23\x9f\xa4\x99\x7d\x75\xa0\xf3\x82\x8c\x86\xed" - "\xfc\x95\x67\xfa\x60\x83\xb1\xda\x4a\x6d\x90\xe6\xf4\x38\x3f\x5d" - "\x0a\xfa\x78\x61\x9e\x0b\x5c\xb3\x7f\xf9\x3a\xfa\x85\xf0\x05\xb0" - "\x5e\x85\x4c\xc8\x28\x9a\x6b\x56\x4a\xeb\xb2\xba\x16\xd6\xb3\x86" - "\xd1\x1a\x3e\x1d\xf3\x81\x1c\x84\xf7\x42\x3d\xe8\x83\x3a\x2b\xc5" - "\x94\x0f\xe7\xae\x53\xa2\x8d\xc4\x0a\xf8\x50\xfe\xd5\xdf\x68\x7e" - "\xd9\x8b\x8a\xde\x97\x8f\x45\xdb\x08\x3e\x7f\xca\x13\xf8\x9d\xa1" - "\xb7\xba\x55\x59\x30\xb0\xd5\xaf\x67\x7e\x7a\xbd\x94\x5b\xd3\x39" - "\x87\x26\xe2\xcc\xee\xb9\xd0\x26\xe2\x4c\x5d\x86\x92\x61\x4b\x24" - "\xda\xe9\xfc\x5d\xb1\xa5\xa2\xe9\x32\x49\x03\x3e\xae\x88\xd3\xd3" - "\x9c\x2d\x5d\x01\xdf\xb9\x95\x80\x27\x37\x41\xe7\x07\x3c\x41\x1c" - "\xd8\x0e\xf8\xc1\xad\x04\x5d\xff\x06\xe8\xfa\x02\x8e\xa0\xec\x85" - "\xc7\x99\xc0\xa3\x81\xa5\x70\x0e\xe8\xc4\x01\xae\x03\x9e\x68\xb6" - "\xa6\x90\xb0\xad\xc0\xa3\xdb\x10\x47\x40\x2e\x7e\x51\x0b\x38\xb2" - "\x1c\x70\x24\x89\xe6\x38\x0e\xdd\xae\x64\xf8\xf1\x71\xdd\x3a\xa5" - "\x4e\xcc\x71\x4e\xc7\xf7\xb1\xd5\x95\xc8\x1f\x31\x19\xd8\x57\xa5" - "\x1d\xd7\xa7\x95\xd1\x3e\x95\x16\xe0\x91\xdc\xb9\x5a\x3c\x47\xe7" - "\xed\xf2\xb8\x2e\x1c\xe3\xb5\x48\x1c\x93\x1d\x57\x48\x38\xcd\x03" - "\xfa\x7d\x68\x97\x8d\x8b\x48\xdf\xed\x57\x48\xd8\xf6\x45\x44\x03" - "\xf3\x55\xb9\x1d\xfa\x30\x6b\x89\x8a\xd0\xdc\x28\x7e\x3d\x0b\xe0" - "\xbc\xdb\xdc\x28\x20\x57\x87\x6e\xc7\x39\xb3\x58\xe3\xe8\x93\x4d" - "\x97\x10\x6e\x87\xb1\xa3\x71\xe4\x14\x8f\x31\x5f\x27\xd5\xaf\xa2" - "\x98\x9c\xff\xcb\x00\xe6\xfb\xd4\x77\x32\xe8\x2a\x9d\x1b\x15\x8f" - "\x1d\xe6\xdf\x1a\x38\x46\x9b\x42\x14\x8d\xe2\x35\x90\x3d\x39\xa0" - "\x55\xff\x0c\x92\xc1\x05\xe5\x17\x1b\x93\x2f\x63\xae\x01\x2f\xe7" - "\xe1\x63\x35\xd8\x96\x5d\x97\x30\x90\xfa\x1b\xbd\x95\x10\xb1\xa3" - "\x91\x84\xf3\x7f\x04\x7a\x2c\x80\x77\x6d\x24\x61\xf9\x8d\xf0\xae" - "\xcb\xd9\xbb\x8a\x39\xdd\xb9\xcc\x82\x08\xb8\xd6\x6e\x5e\x31\xf3" - "\x1f\x31\xaf\x58\x98\x1a\x30\xec\x17\xfc\x63\xe8\xcb\x4c\xe3\xfc" - "\xb4\x18\x6d\x67\x08\x3e\x17\xed\x43\xc6\xab\x94\xa7\x3f\x42\x5e" - "\xe6\xf4\xf1\xaa\xd9\xb5\xc0\xdb\x2d\x71\x68\x2b\x53\x1d\xac\x33" - "\x63\x5c\x1d\x2a\xf3\x99\x14\xea\x7a\x94\xd3\x0e\xc1\x39\xe4\x7d" - "\x27\x9e\xaf\x47\x9e\xc7\xeb\x94\xef\xe1\x3e\x63\xed\x05\x82\xed" - "\x39\xb7\x83\xf4\x17\xdb\xba\xa8\x08\xdb\x82\x6d\x21\x2f\xa0\x5d" - "\x07\xe7\x1a\xa3\x7d\x31\xfa\xad\x87\xf2\x21\xa3\xcc\xac\x6c\xc6" - "\x9c\x39\x2a\xe4\x01\xca\x2b\x80\xdf\x18\xc7\x99\xe7\xa3\x7d\x80" - "\xcf\xb0\x9f\x5d\x80\xde\xe1\x22\x5f\xc0\xb9\x60\x57\xde\xe8\xba" - "\x5a\x85\x3a\x4d\x30\xfe\xbe\x55\xfe\xf0\x8e\x7e\x61\x1e\xfd\x5f" - "\xb9\x30\x90\x6f\x01\x2f\x11\x37\xed\xcd\x4e\x98\xd9\xc4\x30\x13" - "\x31\x49\xc4\x4d\x8a\x4d\x34\x5f\x44\x31\xfa\xbc\x32\x9f\x76\x2f" - "\x71\xb3\xa2\x49\xc2\xcd\x17\xb5\x4e\xb8\xd9\xc4\xdf\xe0\xfa\xb8" - "\xc3\xcd\x3e\x5b\xe4\xb8\xd9\x67\x9b\x1c\x37\x9f\x50\xb8\xe2\x66" - "\x5b\xcc\xec\x73\xc6\x1d\x5e\x82\x1e\xf3\x68\xa3\x42\x53\xe4\x19" - "\x2b\x1f\xf7\xf7\x1e\x2b\x7f\xd5\x43\x8e\x95\x8f\x8f\xfb\xff\x17" - "\x2b\x7f\xb5\x5b\x86\x95\xaa\x5b\xc4\xca\x46\x8a\x95\xc1\xfc\x3f" - "\x61\x4e\x08\xf8\xb1\x7d\x81\x07\xac\x5c\xd0\xc1\x5c\xf8\xa3\x27" - "\xac\xd4\x74\x92\x63\xa5\x66\xb0\x1c\x2b\x7f\x75\x59\xc2\x4a\xe1" - "\xda\x1d\xc1\x4a\x8d\xef\xbd\xc1\x4a\x8d\x2f\xc5\xca\x2b\x88\x95" - "\x9a\xf3\x1d\x63\xe5\xe3\x2a\xf7\x58\x09\xe7\x29\x56\x3e\xae\x92" - "\xb0\xf2\x4c\x07\x58\xf9\xc4\x51\x2f\xb0\x32\x98\x62\xa5\xca\x03" - "\x56\x2e\x80\xb1\x12\xf8\x82\xf2\x9e\x0b\x6f\x08\x58\x19\xea\xc0" - "\xca\x5b\xe0\x0f\xef\xe8\xf7\x44\x49\x7b\x58\xc9\xe9\x98\x7c\x89" - "\x58\xc9\x87\x08\x58\xb9\xd0\x46\x52\x4e\x01\x46\x56\x37\xd2\xbc" - "\x38\xd4\x57\x18\xfe\x53\xa7\x23\x16\x45\xe9\xf6\xc0\x78\x19\x4d" - "\x45\x14\x9b\xa8\xcf\xeb\x38\xc4\xaa\x22\xa8\x9b\xe7\x90\x3b\x29" - "\x76\x9e\x12\xb0\x73\x86\x80\x9d\xb3\x7e\x04\x76\xbe\x84\xb4\x7c" - "\xf2\x64\xab\x52\xc4\xce\xb7\x00\x3b\x9f\xa4\xf2\x03\x7e\xd3\x64" - "\xd8\xd9\x7f\xa2\xd8\x2f\xb4\x69\x1a\x13\xdf\x21\xac\x5f\x57\xdb" - "\xe2\xe8\x58\x6c\xef\xa9\x27\x0c\x0b\x9a\x88\x03\x4b\x67\x48\x58" - "\x0a\x6d\x29\x3c\xe3\xe8\x53\x51\x0e\x1c\xcd\x04\x1c\x3d\xeb\x84" - "\xa3\xa0\x37\x7d\x88\x98\x07\x38\xda\x42\x71\xf4\x63\x01\x47\xfb" - "\xce\x39\x36\x03\x70\x74\xac\x88\xa3\x4f\xe5\x58\x33\x0b\x06\x5a" - "\xb3\x3a\xc6\xd1\x16\x8a\xa3\xda\xbb\x8f\xa3\x25\x2e\x38\x0a\xba" - "\x2b\xe6\x75\x77\x8b\xa3\x22\x3f\x52\x1c\xcd\x90\x70\x94\x8e\x6b" - "\x5f\x7b\x65\x0c\x8c\x7b\x8c\x96\xea\x6e\x0e\x1c\xd5\x16\x31\x1c" - "\x85\x73\xd4\x7e\xb2\x14\x70\x14\xf8\x2f\xbd\x02\xe3\x05\x92\x48" - "\xe8\xa3\x0a\xf1\x75\x07\xcc\x19\x1c\x23\x07\x9e\x2e\x80\x39\x83" - "\x18\xd3\x0c\x73\x06\x70\x74\xd6\x35\x15\xa1\xf3\x25\x0b\xe6\x4b" - "\xa3\x87\xbc\x7c\xa2\x0f\xae\x47\x3c\xed\x37\x45\x8e\xa7\xfd\xd6" - "\xc9\xf1\xb4\xdf\x50\x09\x4f\x85\x6b\x88\xa7\x40\x33\x18\x9f\x62" - "\xc4\xd4\xdb\xc3\xd3\x7e\x93\x1d\x78\xaa\x14\xf0\x74\x41\xc7\x78" - "\x4a\xbf\xfd\x79\xc0\x53\x67\x6c\xf0\x8c\xa7\xfd\x26\x4b\x78\xda" - "\xff\x69\x07\x9e\xd6\x78\xc2\xd3\xa7\xa2\xdd\xe3\x29\x9c\xa7\x78" - "\xfa\x54\xb4\x03\x4f\x6b\xdc\xe0\xe9\x58\x67\x3c\x1d\xd0\x9b\xe1" - "\x69\x11\xc5\x51\xc4\xd4\x4a\x0b\xf0\x07\xce\xb9\xc4\x3c\x8a\xa9" - "\x1c\x60\x2a\xe6\x2a\xc6\x3c\x55\xe8\x6b\xef\x0e\x53\x19\xe6\x9a" - "\x08\xe2\x2a\xce\xcd\xf4\xf1\xa0\xef\xc2\x5a\x04\x63\x42\xd7\x5e" - "\x71\xfc\x76\x38\xe1\xeb\xec\x15\x2a\x94\xed\x64\xbc\xc2\x89\xbc" - "\xd2\xac\x41\xbf\x5b\x19\xaf\x78\x47\xcb\x01\x6a\x4f\xd8\xea\x49" - "\x77\x3f\x86\xba\xfb\x14\xa2\x5c\x39\x05\xf0\x35\x1a\x75\xf7\x42" - "\x17\xdd\xbd\xb0\xad\xee\x7e\xb2\x7d\x1c\xf5\x4a\x77\x9f\x8a\x34" - "\x0c\x7f\x58\x8e\xa3\xe1\xbd\xe5\x38\xfa\xeb\x6d\xd8\x2f\x86\xe3" - "\x85\xee\x75\x77\x3a\xcf\xc3\xe3\x1d\xba\x7b\x8d\x1c\x3f\x25\xdd" - "\xfd\xd7\xe3\x3d\xe3\x68\x78\x9e\x4c\x1e\x9d\x25\xe0\xe8\x5c\x01" - "\x47\xe7\x4a\x38\x7a\xfc\x0b\x51\x1e\x7d\xfa\xa3\xb2\x1a\x67\x1c" - "\x0d\xaf\x75\xe0\x68\x6d\x5b\x1c\x15\x31\x14\xf1\x14\xdb\x41\x5b" - "\xd6\x2e\xc0\xe9\xbd\x73\xb5\x4a\x66\xab\x8d\xc1\xb1\xf3\x77\xb5" - "\xd5\x56\x34\x5d\x23\x69\x33\x10\x4f\xf3\x28\x9e\x06\x2a\xc8\x1c" - "\xc0\xbe\xae\xb8\x97\x20\x1f\xbf\xdb\x27\xb1\x3c\x6f\x68\x5f\xe2" - "\x96\xb3\xbc\xa1\xa2\x9d\x09\xde\x97\x7e\xaf\x9f\x79\x46\xc0\xd4" - "\xeb\x30\x1e\xc0\x73\x5b\xaf\x03\xa6\x26\xb9\x91\x4d\x57\x02\xa6" - "\xa6\x38\xc9\xa6\x30\xf7\x3f\x9e\xeb\x8a\xa9\xcf\xbc\x50\x89\xbc" - "\x82\x98\x2a\xd3\xe3\x0b\x7f\x06\x7a\xfc\x33\xef\xca\xb1\xf4\x99" - "\x6a\x39\x96\x3e\xf3\x86\x84\xa5\xc2\xb5\x3b\x22\x9b\x3e\xa3\xbf" - "\x37\xb2\xe9\x33\x7a\x49\x8f\xff\xf5\x2a\x07\x96\x56\x7b\xc2\xd2" - "\x70\xbd\x7b\x2c\x85\xf3\x14\x4b\xc3\xf5\x0e\x2c\xad\x76\xa3\xc7" - "\xcb\xb0\x74\xe0\x1c\x86\xa5\x85\x4c\x36\xad\x11\x65\xd3\xc2\x7f" - "\x41\x3d\x7e\x60\x8c\xb7\x7a\xfc\xb1\x26\x86\x9f\x88\x4f\x22\x86" - "\x4a\x7a\x7c\xa1\x67\x3d\xbe\x03\x0c\xf5\x4a\x16\xa5\x18\x3a\x68" - "\x8e\x1c\x43\x07\xc5\xca\x31\x74\xf0\x49\x57\x0c\x6d\x8b\x9f\x83" - "\x76\xba\xc3\x4e\xa6\xc7\x0f\x5e\xeb\x19\x37\x07\x55\x79\x8f\x9b" - "\xff\x71\x59\x8e\x9b\xff\x11\xfc\xef\x81\x9b\xbf\x59\x2d\xc3\x4d" - "\xd5\x2d\xe2\xe6\x4f\xa2\xd3\xff\xc6\xc5\xfe\x39\xd8\xc5\xfe\xf9" - "\x1b\x27\xfb\xe7\xe0\x3b\x68\xff\xfc\xcd\x3d\xb2\x7f\xfe\xa6\x46" - "\x92\x41\x07\x7f\xd4\x31\x6e\x0e\xaa\x71\x8f\x9b\x70\x9e\xe2\xe6" - "\xa0\x1a\x09\x37\x3b\x92\x41\x7f\xbb\xc5\x0b\xdc\xfc\x99\xeb\xf4" - "\xbf\x6d\xd7\xfe\xe9\x4e\xa7\x47\xdc\xa4\x78\x59\xe3\xa2\xd3\x4f" - "\x71\xd6\xe9\x0b\x25\x9d\x7e\x0c\xc3\x2d\xa3\x4d\x27\xd7\xe9\xef" - "\x38\x8e\x0e\x79\xdf\xea\xb0\x87\xbe\x09\x38\x3a\x84\xc6\x88\xb1" - "\x3a\xec\xa1\xcf\x3d\x2d\xf6\x8b\xe9\xf4\x6f\x11\xd6\x2f\x37\x3a" - "\x3d\xf5\x9b\x1d\x62\x77\xe8\xf4\x35\xae\x3a\xfd\xd0\xf3\x9e\x31" - "\xf5\xd9\x30\xb7\x3a\x3d\xea\xdf\x14\x53\xb5\x14\x53\xaf\xe7\x3a" - "\x63\x6a\xc4\x70\x8a\xa9\xcf\x8b\x98\xfa\x6c\x9c\x15\xe6\xa6\xd5" - "\xaf\x63\x4c\xc5\x76\x24\x4c\x8d\xfb\x69\x30\xd5\x70\xeb\x98\xea" - "\xbc\x87\xf5\x63\x78\x77\x07\xa6\xd2\x31\x8e\x38\x53\x19\x83\x98" - "\x1a\xe7\xa2\xdf\x17\xba\xd7\xef\xcb\x88\x12\xc7\x47\xd4\xef\x91" - "\x06\x14\x6f\xee\xaa\x7e\x3f\x74\x90\x1c\x5b\x87\xc6\xc9\xb1\x75" - "\xe8\xc3\x12\xb6\x0a\xd7\xee\x88\x7e\x3f\x74\xe0\xbd\xd1\xef\x87" - "\x0e\x94\xb0\xf5\xb9\xa0\x8e\xb1\xf5\xd9\xbe\xee\xb1\x15\xce\x53" - "\x6c\x7d\xb6\x6f\xbb\xd8\xfa\xbc\x33\xb6\x0e\x53\x88\xd8\x2a\xe9" - "\xf7\xc0\x1f\x38\xff\x12\x75\xb7\xaf\xdf\xbf\x70\xaf\xf5\xfb\x61" - "\xc4\x2b\xfd\x3e\x17\x70\x16\x74\xf1\x95\x27\x40\xbf\x9f\x28\xe8" - "\xf7\xb5\x7a\x17\xfd\x5e\xdf\x46\xbf\x4f\x9d\x28\x60\x2a\xcc\x29" - "\x8a\xa9\x73\x0b\x6f\x5f\xbf\x9f\x84\x34\x1c\x66\x97\x63\x6a\xa4" - "\x42\x8e\xa9\x23\x37\x61\xbf\x18\xa6\xeb\xdd\xeb\xf7\x74\x9e\x47" - "\x8e\x97\xe9\xf7\xd0\xbf\xb6\xfa\xfd\xc8\xe1\x32\x4c\x9d\xe5\x8c" - "\xa9\x91\xc9\x32\x39\x15\xde\x0b\x31\xf5\xfd\xb3\x0c\x53\x3f\x38" - "\xeb\x84\xa9\x2f\x7e\x20\x60\xea\xf0\xf7\xcb\x26\x3b\x63\x6a\xe4" - "\x01\x11\x53\x29\x5e\xce\xb2\x2a\xd3\xa3\xdb\xfa\x9d\x50\x7f\x1f" - "\xf4\x05\x82\xb6\x71\x9f\x14\xb6\xb9\xfb\x6c\x5c\xc7\xfe\x26\xd1" - "\xee\xfd\x4d\x8c\x89\x26\x52\x5e\xaf\xa3\x7e\x26\xf9\xe8\x67\xb2" - "\x9a\xf4\xce\xbf\xc1\xe2\x07\xd0\x1c\x1f\xd7\xdd\xc7\x0e\x98\x39" - "\x5d\xc2\x59\xf4\xc9\xda\x8a\x3e\x59\xd7\x99\x0f\x10\xd0\xbb\x6d" - "\xac\x00\x51\x6e\x02\x3c\xd8\x7f\xd6\x15\x67\x47\x0c\xad\x44\xfe" - "\x99\x11\xe7\xa2\xf3\xeb\x7f\x06\x3a\xff\x88\xcd\x72\x7c\x1d\x51" - "\x2a\xc7\xd7\x11\xab\x24\x7c\x15\xae\xdd\x11\xd9\x75\x44\xce\xbd" - "\x91\x5d\x47\xe4\x48\x3a\xff\xc8\x25\x0e\x7c\xad\x72\xc2\xd7\xb3" - "\xce\xf8\x1a\x99\x41\xf1\xf5\xac\x2b\xbe\xc2\x79\x8a\xaf\x91\x19" - "\x0e\x7c\xad\x72\xd1\xf9\xcf\xba\xe2\xeb\xa8\x29\x14\x5f\x6b\xf5" - "\x2e\xb2\xab\xbe\x63\x9d\xbf\xf6\xe7\xa6\xf3\x8f\x9a\xec\x95\xce" - "\x8f\x98\xba\x90\x61\x2a\x62\x96\x88\xab\x92\xce\xaf\xf7\xa8\xf3" - "\x77\x84\xab\x5e\xc9\xaa\x14\x57\x47\x4f\x91\xe3\xea\xe8\xe9\x72" - "\x5c\x1d\x73\xc6\x15\x57\xdb\x62\xea\xe8\x2d\xee\xf0\x94\xe9\xfc" - "\x63\xd6\x7b\xc6\xd2\xd1\x25\xde\x63\xe9\xf3\xd7\xe4\x58\xfa\xbc" - "\xff\xbf\x2f\x96\xfe\xee\x0d\x19\x96\xaa\x6e\x11\x4b\x7f\x12\x3b" - "\xc0\xef\xce\xcb\xb1\x74\x4c\xb0\x1c\x4b\x7f\x57\x26\x61\xa9\x70" - "\xed\x8e\x60\xe9\xef\x4c\xf7\x06\x4b\x7f\x67\x92\x64\xd5\x31\x9f" - "\x74\x8c\xa5\xa3\xcb\xdd\x63\x29\x9c\xa7\x58\x3a\xba\x5c\xc2\xd2" - "\x33\x1d\x60\xe9\x0b\xef\x7a\x81\xa5\x72\x3b\x80\x2b\x96\xde\x73" - "\x3b\xc0\x0b\x7a\xaf\xec\x00\x22\x96\x4e\x6c\x6b\x07\x40\x7c\xa5" - "\x76\x00\x18\x2f\x11\xc3\xa8\x1d\x60\x14\xc3\x32\xa3\x6d\x9d\xcc" - "\x0e\x70\xe7\xb1\x75\xec\x5f\xad\x0e\x7b\x6a\x26\x60\xeb\x58\x9a" - "\xff\xc3\xea\xb0\xa7\xbe\x38\x5e\xec\x17\xb3\x03\xbc\x49\x58\xbf" - "\xdc\xd8\x01\x46\x60\x7b\xbf\xef\x24\xb3\x03\x38\x61\xed\x45\xc5" - "\x78\xbb\x67\x9c\xfd\x7d\x5f\x99\x1d\xa0\x4e\xc2\xd9\xeb\xe8\xa3" - "\x0e\x38\x48\x71\x36\xc4\x19\x67\xc7\xcd\xa4\x38\x3b\x42\xc4\xd9" - "\xdf\x6b\x5b\x60\x6e\xb6\x78\x8b\xb3\xb8\x8f\xe0\x6c\xcc\xbd\xc1" - "\xd9\x62\x2f\x70\xd6\xc9\x36\xb0\x1f\xc6\xc3\x81\xb3\x74\xdc\xc7" - "\xb5\x56\xce\x40\x9c\x8d\x71\xb1\x0d\xe8\xdd\xdb\x06\x8e\xde\x0b" - "\xdb\xc0\xf8\x89\x72\xbc\x1d\xbf\x56\x8e\xb7\xe3\x7f\x2b\xe1\xad" - "\x70\xed\x8e\xd8\x06\xc6\x47\xdd\x1b\xdb\xc0\xf8\x28\x09\x6f\x5f" - "\xec\xd7\x31\xde\xfe\x7e\xa0\x7b\xbc\x85\xf3\x14\x6f\x7f\x3f\xb0" - "\x5d\xbc\x1d\xe1\x8c\xb7\x13\x1e\x16\xf1\x56\xb2\x0d\xe8\x05\xdb" - "\xc0\xba\x8e\x6d\x03\xb5\x1e\x6c\x03\xa3\xef\xb5\x6d\x60\x82\xc7" - "\x18\xd2\xee\x6c\x03\xad\xb9\xcc\x6f\x7f\x25\xfa\xed\xcf\x04\xfc" - "\x8d\xfa\x02\xc6\xa0\x63\xbf\xfd\x54\xd1\xff\x34\x26\x4f\xc0\xd9" - "\x3c\xb7\xb6\x81\x63\x0d\x9e\x6d\x03\xc7\xaa\x9d\xfd\x4f\xa3\x7a" - "\xc8\xbf\x5b\x45\x3d\x2c\x7e\xb7\x3a\xf6\x15\xe2\xec\x64\x9a\xd7" - "\x85\xcb\x99\x66\x60\xf1\x0c\x27\x87\x61\x3f\xdd\xf9\xf1\x7f\xcc" - "\x39\x7f\xcb\x8a\x5a\xe1\xb0\x15\x54\x21\xde\xe6\x11\x8e\x8f\xf3" - "\xc3\x58\xe4\xd4\x56\x30\x15\x79\xef\x0f\x27\x9d\x71\xf7\xe0\x69" - "\x67\xdc\x8d\x2a\x10\x71\xd7\x0e\xb8\xfb\x49\x5d\x1e\xb3\xbf\xbe" - "\xc4\x7c\x53\x77\xbd\xe4\xe4\x9b\xfa\xc5\xa7\x02\xee\x4e\x7c\xb7" - "\xcc\x04\xef\xdf\x9e\xff\x14\xdc\xbf\xe7\xf4\xad\xfa\xa0\xe6\xb9" - "\xf5\x9d\x12\xf0\xc9\xad\xff\x14\xf4\x55\xb5\x4d\x98\xab\x76\x98" - "\xa7\xdb\x9c\xfc\xa7\xf2\x53\x60\x3e\x0b\xfb\x4a\xda\xf5\x43\x7d" - "\x49\xf2\x43\xe5\x73\xa6\xd2\xbc\xae\xdc\xe6\x69\x86\x1b\x7c\x9c" - "\x0f\x1f\x3c\xd5\x86\xcf\xbf\x79\x13\xd6\x9d\x91\xd1\x3e\x4c\xaf" - "\x9b\x6a\x02\xec\xe9\xca\xc6\x7d\x62\xad\x1d\xd6\x1a\x3b\xac\x35" - "\x5c\xce\x54\x93\x0d\x65\x93\xdc\xa9\xf5\xf9\xa0\xe7\xd9\x32\x69" - "\xce\xd6\x2e\xd9\xa0\xeb\xed\x40\x3d\xef\x0a\xcc\x8d\x74\x8d\x12" - "\xfb\x23\xe2\x68\x60\x03\xbc\xc7\x95\xf6\x65\x39\xdb\xf7\x12\x8e" - "\x1a\xc6\x1e\x83\x67\x4e\x3a\x51\x89\xbc\x1b\x2d\xed\x29\xa0\x32" - "\xb3\x07\x5f\x59\xec\x0b\x8b\xbb\x08\xbc\x70\x07\x6c\x12\xce\xfd" - "\x91\xe3\xfa\x1f\x9e\x90\xe3\xfa\x1f\x66\xc8\x71\xfd\x0f\x41\x12" - "\xae\x0b\xd7\x00\xd7\x81\x6e\x54\x8e\x86\xb5\xef\x36\xe5\xe8\x3f" - "\x68\x44\x5c\xe7\x04\x5c\xdf\x7e\x0b\xb8\xde\xae\x1c\xed\x84\x4b" - "\x9e\x71\xfd\x0f\x1a\xc9\x26\x31\xb9\x93\x5b\x1f\xd9\xd3\xce\xb8" - "\x1e\xb5\x8b\xe2\xfa\x69\x57\x5c\x87\xf3\x14\xd7\xa3\x76\x79\xdc" - "\x4f\x70\xda\xf5\x7b\xda\xe4\x4b\x14\xd7\x6b\x04\x1f\xd9\x2a\x2f" - "\xf6\x13\xd4\x30\x4c\x17\xb1\x1c\xed\x55\xf7\xd6\x26\x31\xb9\xc1" - "\x1b\x9b\x04\xc5\xf2\x26\x86\xe5\x88\x8d\x22\x9e\xdf\xca\x7e\x82" - "\x8e\xf0\x5c\x94\x9b\x11\xcf\x3d\xc9\xcd\x72\x3c\x9f\x72\x49\x8e" - "\xe7\x53\x2e\xcb\xf1\x7c\xfa\x25\x39\x9e\x4f\x6f\x70\xc5\xf3\xb6" - "\x58\x3e\x75\xa8\x3b\x1c\xd7\x4e\x45\x1b\xc5\xf4\x3c\xcf\x18\x3e" - "\x35\xce\x7b\x0c\x9f\x16\xfb\x6f\x87\xe1\x2a\x57\x0c\x9f\xa6\x47" - "\x0c\xb2\x67\xb9\x60\xf8\x02\x01\xc3\x05\x1c\xd9\xd1\x28\xc8\xc2" - "\xae\x18\xde\x04\xef\xd1\x81\x3e\x6e\xfb\xa7\x2b\x86\x47\x6f\x96" - "\x61\xb8\xaa\x03\x0c\x5f\xc0\xec\x20\x32\xbf\x5c\x0f\xb6\x10\x78" - "\x8f\x82\x6d\x1e\x64\x73\x71\xcc\x9c\xfb\x23\xc7\xf0\xe8\xcb\x72" - "\x0c\x9f\xae\x96\x63\x78\xf4\x49\x09\xc3\x85\x6b\x77\x44\x36\x8f" - "\x6e\xba\xe3\xb2\xb9\xc8\x1f\xed\x62\x78\x74\x93\x24\x9b\x4f\x2f" - "\xeb\x18\xc3\xa7\x6a\xdd\x63\x38\x9c\xa7\x18\x3e\x55\xeb\x71\x9f" - "\x43\x1b\x0c\x7f\xe9\x7d\x2f\x30\x5c\x6e\x0b\x11\x31\x5c\xb0\x85" - "\xec\x70\xb2\x85\xd8\x33\x99\x2d\x64\x5b\x23\xe3\x8d\xae\x0a\xc6" - "\xa7\xc0\x3f\xa1\xdb\x95\xed\xeb\x6e\xdb\x6e\xcb\x0e\xf2\x52\x9b" - "\x98\xe4\xed\xd9\x41\x28\x7e\xe3\x1e\x87\xe9\x80\xdb\x55\xb7\xb8" - "\xc7\x61\x8c\xb8\xc7\x41\xe7\x61\x8f\x83\x80\xe7\xb3\x7e\x04\x9e" - "\xd3\x3d\x0e\x2f\xef\x97\xdb\x98\x5f\xfe\x44\xb4\x31\x33\x3c\x9f" - "\x5d\x21\xc7\xf3\xd9\xe5\x8e\x3d\x0f\x80\xf9\x46\xed\x5b\x6d\xf6" - "\x3c\x38\xb0\x9d\xda\x41\x67\x3c\x6c\x98\x5a\x4f\x1c\xf8\x3e\x43" - "\xc2\x77\x68\x6b\x95\x0c\xdb\xeb\x9c\xb1\x7d\xc6\x28\x19\xb6\x9f" - "\xcd\x93\xfb\x47\xd4\x69\x9d\xb0\x5d\xdc\xf3\x30\x73\x78\x59\x6d" - "\x07\xd8\x0e\xf7\xdf\xfa\x1e\xb1\x3b\x8b\xed\xe2\xfe\x06\xb7\xd8" - "\xee\xbc\xbf\xc1\xc9\xff\x01\xb1\x9d\xe6\xbd\xe8\xee\x82\xed\x2b" - "\xe3\x94\xf6\x23\x30\x1f\x00\xd7\x71\x8e\xd8\x79\xc0\x76\x3a\xde" - "\x33\x53\x9d\xb1\xfd\x66\x26\xc3\xf6\xad\x8d\x3f\x1e\xdb\x1d\xf2" - "\xb0\x33\xb6\x3f\x8f\xd8\x3e\x6b\x05\xdb\x7f\x91\x71\x6b\xfb\x2f" - "\x5c\xfc\x33\xb6\xde\x82\xfd\xa5\x5d\x8c\x77\xd3\x2f\x39\xc6\xcf" - "\x3a\x21\xc7\xf8\xd9\xbe\x72\x8c\x9f\xb5\x5f\xc2\x78\xe1\xda\x1d" - "\x91\xd3\x67\x55\xdd\x1b\xfb\xcb\xac\x2a\x09\xe3\x67\xef\xee\x78" - "\xef\xc5\x8c\x71\xee\x7d\x33\xe0\x3c\xc5\xf8\x19\xe3\xda\xdd\x7b" - "\x21\xb3\x77\xc7\x6c\x73\xbb\xf7\xa2\xea\xa7\xf3\xcd\x70\xe6\x15" - "\x57\xfb\xcb\xed\xdb\xbe\x63\xf2\xbd\xb5\xbf\xe0\xde\x8b\x95\x27" - "\x9d\xf6\x5e\xd4\x76\xbc\xf7\x22\x75\xca\x2d\xda\x5f\xda\xf1\xcd" - "\x38\x16\xe5\xec\xef\x36\x67\x8b\x1c\xdf\xe7\x6c\x73\xe0\xfb\x24" - "\xc4\xf7\xd8\xbf\xca\xf1\x3d\xb6\x08\xfb\xe9\x6e\x2f\xc6\xc7\xb2" - "\xef\x8a\x73\x5a\xe5\xbe\x1a\x2e\xf6\x97\x49\xc8\x7b\xb1\x73\x64" - "\xf8\x7e\xd6\x19\xdf\xe7\x86\xb9\x93\xdd\xd1\xee\x4d\x7d\x8a\x67" - "\x39\xed\x69\x7b\x51\xf4\x7f\x7b\xa5\x5f\x59\x34\xbc\xbf\xc9\x83" - "\xaf\xdb\x2c\xe6\xeb\x46\x7d\xdb\xd0\x0e\x0e\x6d\xed\x9d\xa5\x55" - "\xa6\xc5\xf0\x1c\xfa\xba\xb9\xfa\xb9\xa1\xef\x1b\xfa\xba\x55\xc4" - "\xe9\x3c\xfa\xb9\x21\x6f\x7a\xf2\x75\x83\x7e\x07\x53\xac\x3f\x2f" - "\x60\xbd\xe0\xeb\x96\x9f\x24\xf9\xba\xc9\xb0\xde\x8d\xff\xf0\xfe" - "\xb3\x19\xee\xe5\xf8\x74\x09\xeb\x6f\xa0\x1c\xff\xac\x8b\x2d\x86" - "\xd2\xe0\x95\xb8\x9f\xd4\x16\x43\xb1\x7e\xde\xcc\x4a\xe4\xe3\x19" - "\x5a\x37\xb6\x98\xb6\x3e\xce\x3f\x9d\x2d\x66\xde\x47\x72\x8c\x9f" - "\xd7\x20\xc7\xf8\x79\xdb\x24\x8c\x17\xae\xdd\x11\x8c\x9f\xb7\xef" - "\xde\xd8\x62\xe6\xed\x93\x6c\x31\xb1\x9b\xdc\xfa\xdf\xc9\x6c\xec" - "\x73\xfb\xba\xb7\xb1\xcf\x15\xfc\xef\xe6\xf6\xf5\xb8\x27\xa4\xcd" - "\x37\xcd\x57\x97\x31\x1b\xfb\x6d\xec\x09\xa9\xfd\xb9\xd9\x62\x5e" - "\x4d\xf4\xd6\x16\x43\x7d\x9b\x4f\xa2\x7f\x88\x77\x7b\x42\x3a\xc2" - "\x76\x87\xec\xde\xce\x37\x4c\x39\xb6\xbf\xb6\x4c\x8e\xed\xaf\xad" - "\x90\x63\xfb\x1f\x57\xcb\xb1\xfd\x8f\x19\xae\xd8\xde\x16\xd7\x5f" - "\x2b\x73\x87\xe9\xda\x49\x68\x8b\xf9\x63\xb8\x67\x3c\x7f\xcd\xe2" - "\x3d\x9e\xc7\xd9\xff\xad\xf1\x5c\xe5\x8a\xe7\xf3\x07\xff\xa4\x76" - "\x19\x8a\xe7\x0b\xfa\xc9\xf0\x5c\xd5\x01\x9e\xff\x64\x76\x99\x05" - "\xaf\xcb\xf1\x7c\x41\xb1\x1c\xcf\x17\xc4\x4b\x78\x2e\x5c\xbb\x23" - "\x76\x99\x05\x6b\xef\x8d\x5d\x66\xc1\x5a\x49\x66\xff\xe3\x9c\x8e" - "\xf1\xfc\x35\x9b\x7b\x3c\x87\xf3\x14\xcf\x5f\xb3\x79\xf4\xa7\x6e" - "\x83\xe7\x0b\x87\x7b\x81\xe7\x6e\x7d\x54\x7e\x1e\x76\x99\x85\x91" - "\xde\xda\x65\x3c\xed\x53\x41\x7c\x97\xfc\x53\x9c\xf6\xa9\x44\x8a" - "\xfb\x54\x32\xe4\xfe\x29\x77\x1c\xdb\xe3\x27\xca\xb1\x3d\x7e\x8a" - "\x1c\xdb\x97\x2c\x91\x63\xfb\x12\xad\xd8\x4f\x66\x97\xc9\x6c\xb3" - "\x6f\x45\x8e\xf3\xf1\x1f\x19\x26\xd5\x13\x77\x58\x0f\x6d\xf5\xf6" - "\x8c\xf3\xf1\xb5\x9e\x70\x1e\xfd\x55\x3e\x9c\x15\xe7\x06\xe7\x17" - "\x5d\xf8\xff\x01\xe7\x3d\xf9\xa1\x50\x3d\x08\x30\x1e\xf1\x9e\xe2" - "\xbb\x80\xf5\x88\xf3\xf6\x7f\xb8\xb3\xd1\x2c\x56\xdf\x2d\x9c\xf7" - "\x6c\xa3\xd1\x3e\x5c\x39\x43\xc0\xf9\x5b\xd9\x43\x73\x58\x6e\xa3" - "\xc9\x5f\x70\xb7\x6d\x34\xda\x65\x72\xbc\xd7\x16\xca\xf1\x5e\x3b" - "\x53\xc2\x7b\xe1\xda\x1d\x91\xdf\xb5\x89\xf7\xc6\x46\xa3\x4d\x94" - "\xf0\x7e\xc9\xc4\x8e\xf1\x3e\xbe\xde\x3d\xde\xc7\x0b\xb1\xd9\xe2" - "\xeb\x6f\x1d\xef\x13\x1c\x78\xdf\x76\xff\x4c\xc6\xed\xfb\xc8\x0c" - "\xbf\xd7\x36\x9a\x04\x8f\xf8\xdf\x5e\x7c\x8c\xdb\xb7\xd1\x08\x7b" - "\x12\xe7\xba\x8f\x8f\x51\xd6\x8e\x8f\x4c\x59\xb9\x33\xd6\x2f\x1d" - "\x2a\xf7\x45\x5c\x3a\x5c\xf4\x45\x2c\xab\x44\xac\x5f\x3e\x5f\x8e" - "\xf5\xcb\xe3\x3c\xd9\x68\xf6\x73\xce\x3e\x89\x4b\xb7\xc9\x6d\x34" - "\x7a\xb9\x8d\xe6\x45\xe4\xbd\xe5\x3d\x3c\x63\xfd\xd2\x52\xb9\x0f" - "\x38\xdb\xa3\xf8\xfe\x2c\xc1\x07\x7c\x96\x93\x0f\xf8\xd8\xf7\x04" - "\xac\x4f\xbc\x50\x5a\x65\x23\xde\xf8\x21\xfe\x78\x5f\xef\x75\x6e" - "\x7d\x10\xe9\x1a\xd0\x8e\x1f\xe2\xec\x53\x2a\xf4\x69\x8e\xd8\x9e" - "\xe4\xe4\x87\xd8\x4e\x3c\x63\x19\xfe\xcf\xd2\x7a\xc4\xff\x56\x5e" - "\xc2\x7f\xee\x37\x92\xdd\x86\x43\x39\x9f\xd2\x65\x99\xfa\x6e\xd9" - "\x6d\xdc\xd9\x49\x0c\x23\x10\xff\x93\xba\x33\x39\x3f\xee\x67\x66" - "\xb7\x49\x8a\x97\xe3\x7e\x92\x5e\x8e\xfb\x49\x53\x24\xdc\x17\xae" - "\xdd\x11\x5f\xf4\xa4\x85\xf7\x46\xce\x4f\x5a\x28\xd9\x6d\x96\xbf" - "\xd0\x31\xee\x2f\xad\x72\x8f\xfb\x4b\xab\x18\xee\x2f\xad\x6a\xd7" - "\x6e\x23\xf3\x8d\x4c\xee\xf7\xa3\xed\x36\xa2\x9c\x7f\xcf\xf7\xf5" - "\x24\xf7\xf5\xc6\x6e\xe3\xd8\x93\xfe\xa3\xec\x36\xee\xf1\x5e\x94" - "\xed\xcb\xda\xf9\xe6\x2a\xc7\xfb\x15\xfd\xe4\x78\xbf\xe2\x69\x39" - "\xde\xaf\x1a\x2f\xc7\xfb\x55\xe3\xdc\xd9\x6d\xe4\x58\xbf\x62\xb5" - "\x3b\x9c\xd7\xbe\x88\x76\x9b\x54\x9b\x67\x8c\x5f\xb1\xcb\x7b\x8c" - "\x4f\x29\xfb\x3f\x8c\x77\xc1\x78\x95\x2b\xc6\xaf\xf4\xfd\x49\x65" - "\x7c\x8a\xf1\x2b\x5b\x65\x18\x7f\x07\x6d\x39\xb7\xb2\x9f\xc4\xb3" - "\x6c\x9f\xea\xe2\xff\x9e\xea\xe2\xff\x9e\xea\xe4\xff\x9e\xba\xf6" - "\xce\x61\x7c\xea\x9d\xf7\x7f\xbf\x25\x8c\x4f\x75\xf2\x7f\x5f\xd5" - "\xaf\x63\x8c\x5f\xb1\xcf\x3d\xc6\xc3\x79\x8a\xf1\x2b\xf6\xb5\x2b" - "\xdb\xcb\x30\x3e\x2d\xe8\x6e\xd8\x72\xee\xcd\x7e\xa3\x34\x95\x37" - "\xf6\x9c\xf6\xe2\x8e\x78\xb4\xe7\x0c\x16\xed\x39\x5a\x0f\xf6\x9c" - "\x3b\x85\xf9\xe9\xbd\xe5\x98\x9f\xde\x47\x8e\xf9\x6b\xa6\xc8\x31" - "\x7f\xcd\x64\xb9\x3d\x27\xa1\x8d\x3d\x47\x8e\xff\xe9\xaf\x1b\x5e" - "\x74\xb6\xe7\xe8\x9d\xec\x39\x6b\x3a\x79\xc6\xff\x74\x8f\xf8\x7f" - "\x9d\xe2\x7f\x8c\x1b\xfc\xcf\xf8\x37\xc1\xff\x98\x1f\x81\xff\xab" - "\xef\x01\xfe\x67\x2a\x98\x8d\xe7\x16\xe3\xa4\xec\xf7\xde\xc6\xf3" - "\xe3\xd6\x81\xcc\xe9\xf2\x75\x20\x73\xbd\x7c\x1d\xc8\x1c\x2e\xad" - "\x03\xc2\xb5\x3b\xb2\x0e\x64\x46\xdf\x9b\x75\x20\x33\x5a\x5a\x07" - "\xd6\x0c\xea\x78\x1d\x48\xf7\xb0\x0e\xa4\x0b\xeb\x40\xba\x17\xeb" - "\xc0\xda\x3e\x9e\x6d\x3c\xda\xdb\xb7\xf1\xfc\xf6\x5e\xef\x83\x5a" - "\x1b\xe6\x95\x8d\x27\x37\xba\xa8\x1c\x63\xa4\x9c\x27\xca\x95\x73" - "\x44\x1b\x8f\xc1\xc5\xc6\x63\x68\x63\xe3\x59\x71\x5e\xc0\xff\x71" - "\xc2\x7e\xd3\x17\x7f\x44\x8c\x14\x9a\x47\xf9\xf5\xde\x72\xbf\xf9" - "\xd7\x29\xfe\x4b\xf1\xfb\xd6\xfd\x15\xfb\xc5\xd6\x1f\x43\x3b\x31" - "\x50\x5f\x5f\x22\xb3\xe9\x8c\x73\x17\x23\x65\x9d\xcc\xef\x46\xbe" - "\xdf\xf4\xf5\x7c\x19\xde\xbf\xc8\xf6\x9b\x7e\xe0\xee\x3b\xad\x23" - "\x26\x7f\xd6\x6e\x1a\x93\xdf\x11\xcb\xef\x75\xd3\x2d\xc5\x92\x9e" - "\x25\xc4\x92\x3e\x7b\x0f\x62\x49\xdf\x6a\x4c\xfe\xb3\xae\xf1\xfb" - "\xfe\xf3\x05\x63\xb9\x81\x54\x22\x8f\xcc\x70\x8d\x7d\x6a\x70\xbf" - "\x77\x5f\x29\xec\xdd\x5f\x74\x77\xe2\xa0\x60\x7f\xe8\x9a\xdf\x2d" - "\xbf\x68\x77\x9a\x99\xf6\x07\x73\x56\x43\x5f\x2b\xca\x81\x57\x39" - "\xc4\xd3\x04\xc4\xd3\x75\x84\xd6\x3d\x0f\xbc\xd0\xad\xef\x18\xe4" - "\xe3\x6c\x8e\x04\x68\x93\x10\x5b\xff\x93\xfa\x7d\x81\x18\x01\xd8" - "\xca\xea\xad\x3a\xcf\xdb\xed\xdd\x06\x8e\x81\xfe\x77\xde\xb3\xa8" - "\xaa\x53\xa5\xc9\x02\xf3\xa2\x11\xf7\xc4\x2a\x8c\xb6\x16\x03\xd2" - "\xe2\xe0\xa2\x2a\x5f\x1e\xf0\x77\xc7\xab\xc4\xdf\xbb\x79\xfa\x9f" - "\xe5\x54\x9e\xc1\x75\xaf\x5b\xfe\x01\x8c\x03\x22\xca\x56\xdc\xf7" - "\x92\x7d\x6b\x1b\x8c\x0f\xc7\xb3\xb5\x6f\xf6\x7c\x86\x1b\xf0\xbc" - "\x08\x18\x4b\xea\x63\x8b\xb8\x41\x73\x58\x01\x6e\x6c\xbf\x2a\x7d" - "\xc7\xc6\xf6\x71\x8c\x98\x1d\x65\x9d\xe4\xff\x62\xf2\x84\xad\xaf" - "\x17\xb8\xc7\xd6\xd7\x0b\x18\xb6\xbe\x5e\xe0\xc0\x56\x93\x1b\x3b" - "\x8a\xcc\x8f\xfd\x0d\xc1\xff\xc5\xe0\x22\x63\x1b\xfe\x05\xe3\xa3" - "\xbc\xe1\x95\xff\x0b\xc5\xd3\x85\x0c\x4f\x11\xaf\x44\x4c\x95\xec" - "\x28\x06\x8f\x76\x94\x8e\x30\xd5\xab\x3d\xfc\x14\x53\xdf\x5c\x26" - "\xc7\xd4\x37\x57\xc8\x31\x75\x43\xab\x2b\xa6\xb6\xc5\xd3\x37\xf7" - "\xbb\xc3\x52\x16\x1f\x65\x43\xa1\x67\x1c\x7d\xb3\xde\x13\x8e\x52" - "\xff\xf4\x59\x4e\xfe\xe9\x0e\x1c\xfd\xd3\x35\x39\x8e\xfe\x49\x73" - "\xab\x38\x4a\x73\x9b\x9c\xfd\x09\x72\x9b\xdc\x36\x8e\x6a\x5d\x70" - "\x74\xfd\x26\x09\x47\x5d\xf3\x9b\x74\x80\xa3\x0b\xee\x4e\x0c\x14" - "\x19\x8e\x72\x66\xda\x1f\xf5\x22\xec\xeb\x86\xee\x72\x1c\xdd\x30" - "\xc6\x33\x8e\xae\xbf\x20\xe1\x28\xab\x77\x77\x71\x74\x43\xb0\x0c" - "\x47\x17\x38\xe1\xe8\x3f\x25\x1d\x02\x7d\x2c\x1c\x38\x1a\xef\x84" - "\xa3\x0b\x3a\xc2\xd1\x0d\xc1\x38\x46\x4c\x46\xdd\x70\xaa\x63\x1c" - "\x7d\xb3\xc9\x3d\x8e\xc2\x79\x8a\xa3\x6f\x36\x49\x38\xea\x46\x46" - "\x95\xe1\x68\xf6\x27\x5e\xe0\xe8\xcf\x3c\x36\x4a\xf6\x01\xaf\x6c" - "\x15\xd2\x9e\xce\xb6\x31\x52\x67\x3a\xef\x09\x2a\x76\xc9\x7b\x52" - "\xdc\x26\xef\xc9\x0a\x71\x8f\xe7\x18\x01\x57\xc7\xfe\x08\x5c\xa5" - "\x7b\x3c\x37\x56\xc8\x7d\x4f\x36\x9e\x10\x7d\x4f\x18\xae\xbe\x1d" - "\x2b\xf6\x4b\xca\x7b\x52\xdc\x4e\x8c\x54\x5d\x6f\x59\x6c\x94\x31" - "\xce\xb1\x51\xde\xee\xee\x39\x46\xaa\x6e\x8c\x2c\x36\xca\xb1\x42" - "\x47\xde\x13\xd7\x18\xa9\x12\xc6\x6e\x9a\x4e\x31\xd6\x11\x83\x4a" - "\xb7\xde\x11\x23\xb5\x83\x7d\x41\xd8\xce\x9e\xba\xb8\xbb\x8f\xb1" - "\x06\x2f\x30\x56\x96\xf7\xc4\x35\xc6\xd4\x26\xbb\xb1\xb4\x98\x54" - "\xc6\x14\xbb\x89\x8d\x5a\x7c\x4f\x73\x9f\x60\xbf\xdc\x63\xed\x5b" - "\xab\xe5\x58\xfb\xd6\x3e\x5a\xf7\x8c\x3b\xac\x7d\x6b\xa2\x84\xb5" - "\xac\xde\xaa\x33\x2e\x58\x5b\xeb\x01\x6b\x61\x5d\xdd\x71\xd1\x5b" - "\xac\x7d\x8b\xf6\x9d\xcb\x14\xb0\xb6\xf1\x4e\x63\xed\x5b\x19\x12" - "\xd6\xbe\x3d\xba\xe3\x1c\x53\xba\x28\xf7\xfb\x72\x74\x51\x0c\x6b" - "\x75\x51\xed\xe6\x98\x92\xf9\x7c\xe4\x0c\x12\x73\x4c\x49\xf6\x80" - "\x62\xc1\x1e\xf0\xaf\x9c\x13\x25\x67\xa0\xb7\xf6\x80\xe3\xa0\xbb" - "\xe3\xbe\xcb\x95\x98\x73\x6a\x06\xe6\x44\x29\x72\xb1\x07\x14\xb5" - "\xb5\x07\x4c\x6f\x1f\x63\xbd\xb2\x07\xd0\x7d\x97\x9b\x9f\x96\x63" - "\xec\xe6\x41\x72\x8c\xcd\xab\x10\xf7\x59\x62\x7f\x3c\xc7\x4c\xdd" - "\xbc\xda\x61\x0f\xa8\x95\x63\xab\x64\x0f\xc8\x5b\xe5\x19\x63\x37" - "\xcb\xed\xbf\x63\x0b\x65\xfb\x2c\x3f\xa8\x73\x8e\x43\x2d\xc6\x9f" - "\xca\x2d\x2b\xab\x76\xc6\xd8\xcd\xe6\x7f\xa5\x38\xd4\x8e\x58\x53" - "\x1d\xf8\x72\xb7\x8d\x43\xfd\xe7\x58\x63\x69\x11\xc1\xbd\x6d\x14" - "\x6f\x65\xb6\x81\xa2\x7b\x63\x1b\x28\x2d\xf2\x60\x1b\xf8\xf3\x25" - "\x39\xce\xe6\xf5\xa2\x75\x4f\xb9\xc3\xd9\x3f\xef\x97\x70\x96\xd5" - "\x5b\x75\xca\x05\x67\x6b\xee\xa4\x4c\xfb\xe7\x86\xbb\x6b\x1b\xf8" - "\x73\x83\x64\x1b\xc8\xbb\x85\xfd\x8f\x9b\xf7\xb9\xc7\xd9\xcd\x82" - "\xdd\x75\xb3\x64\x77\xad\x71\x93\x2f\x45\x86\xb3\x5b\x36\x89\xfb" - "\x1f\xa9\x4c\x5b\x2b\xca\xb4\x45\xff\x82\xf9\x52\xb6\xe8\xbc\xb5" - "\x0d\xe0\x3e\x77\xc4\x56\xc4\x2e\x11\x5f\x25\xdb\x40\x91\x67\xdb" - "\x40\x07\xf8\xea\x7d\xee\xbe\x77\x36\xc9\xf1\xf5\x9d\xcd\x72\x7c" - "\xdd\xde\xdb\x15\x5f\xdb\x62\xeb\x3b\x27\xdd\xe1\x2a\xb3\x0d\x6c" - "\xab\xf2\x8c\xa9\x5b\x89\x27\x4c\xa5\x31\xfd\xea\x24\x1f\x69\x09" - "\x53\xf3\x1f\x96\x63\xea\xd6\x51\xb7\x8a\xa9\xf7\x24\x5f\xca\x6d" - "\x63\x6a\x9c\x0b\xa6\xe6\xef\x97\x30\xd5\x35\x67\x4a\x07\x98\x7a" - "\xb7\xec\x04\xce\x98\x2a\x93\x5d\xb7\x0d\x95\x63\xea\x36\xad\x67" - "\x4c\xdd\xf6\x80\x84\xa9\xac\xde\xdd\xc5\xd4\x6d\x11\x77\xd7\x4e" - "\xb0\x2d\x42\x92\x5d\xb7\x2b\x3a\xc6\xd4\xad\xfe\xee\x31\x75\xab" - "\x3f\xc3\xd4\xad\xfe\xb7\xbe\xa7\x7c\xfb\x05\x2f\x30\xf5\x67\x9e" - "\x4b\x65\x7b\xbd\xd7\x76\x02\xb4\xb7\x22\x96\xd6\xfe\xb8\xd8\x21" - "\xc9\x62\xec\x90\x51\x02\xc6\x3e\xff\x63\x31\x76\xc7\x35\xb9\x4f" - "\xc3\x8e\x56\xd1\xa7\x81\x61\xec\x7f\x6d\x91\xe7\x47\x6d\x1b\x2b" - "\x44\x1e\x43\x55\xff\x82\xc3\x4e\x80\x98\x3b\xca\xd9\x4e\xf0\x5f" - "\x2f\x78\xc6\x5b\xbd\x56\x66\x27\xf8\xcc\x3d\xde\x5e\x97\xe1\xed" - "\xbb\x1b\x28\xde\x3a\x62\xa8\xea\xf7\x89\x31\x54\x3b\x94\x61\x65" - "\x78\x1b\xf3\xd3\xe0\x6d\xf1\xad\xe3\xad\x3c\x97\x8a\x6b\xbc\xd4" - "\xf7\x9e\x36\x96\x00\xde\xd2\x78\x1d\xae\x31\x53\x6f\x2d\x5e\xc7" - "\xdd\x8a\x99\x8a\xfd\x72\x8f\xbb\xef\x7d\x24\xc7\xdd\xf7\x1a\x68" - "\x5d\xb7\xb8\xfb\xde\xeb\x12\xee\xb2\x7a\xb7\x8c\xbb\xb7\x65\x33" - "\x78\x6f\xdf\xdd\xb5\x19\xbc\xb7\x4f\xc2\xdd\xff\x5a\xd1\x31\xee" - "\xea\x93\xdd\xe3\xae\x3e\x99\xe1\xae\x3e\xb9\x5d\xdc\x95\xf9\x10" - "\x14\xcc\x77\x1b\xcb\xa3\xf6\x5f\x3d\xcf\x4a\x41\xdc\xed\xd8\x0c" - "\x00\x83\x95\xa9\x18\xc3\x29\x06\x7d\x08\x3a\xb6\x19\x74\x84\xb7" - "\xde\xdb\x0c\x76\xc6\xca\xf1\x76\xe7\x7c\x39\xde\xbe\xdf\x1d\xfb" - "\xd5\xae\xcd\x80\x62\xc0\xce\x8f\x1c\x36\x03\x93\x1c\x67\x25\x9b" - "\x41\xe1\x51\xcf\xdf\xbe\x76\x9a\x64\xf2\xed\xf3\x2e\x31\xab\x67" - "\x49\x78\x7b\xac\x52\xf4\x19\xfb\xef\xa0\xb2\x28\x67\xbc\xfd\x4b" - "\x58\x9b\x98\xd5\x93\xef\x60\xcc\xea\xc9\x77\x38\x66\xf5\x14\x79" - "\xcc\xea\x77\xae\x4b\x7e\x64\xde\xc7\xac\xfe\xef\xdd\x14\x83\x91" - "\x87\x30\x6e\xf5\xad\xd8\x11\xee\x72\xae\x15\x19\xf6\xca\xec\x08" - "\x85\x4f\xcb\xb1\xb7\x70\x9e\x67\xec\x2d\x54\x48\xd8\xcb\xea\xdd" - "\x5d\x99\xb7\x30\xfc\xee\xda\x11\x0a\xc3\x25\x3b\x42\xe1\x35\xb7" - "\xd8\x2b\xfb\x36\xb6\xb3\xc1\xfd\xb7\x31\x38\x4f\xb1\x77\x67\x83" - "\x47\x3b\x42\x1b\xff\xad\xf7\x4f\xb1\x6f\x63\x82\xcc\x6b\xf2\xc2" - "\x8e\xf0\xb3\xf3\x31\x78\xbf\xe6\x76\xec\x08\x88\xb7\x88\x67\x22" - "\xe6\xde\x8a\x1d\xe1\xce\xcb\xb8\x1f\x9c\x92\x63\xee\x07\x67\xe4" - "\x98\xbb\x67\x95\x2b\xe6\xb6\xc5\xdb\x0f\x1f\x76\x87\xb5\xcc\x8e" - "\xb0\xa7\xaf\x67\x9c\xfd\x70\x8c\x47\x9c\x75\xf1\xcd\x95\x70\x76" - "\xd7\x0a\x39\xce\x7e\xb8\xfe\xb6\x70\xf6\x56\x73\xb0\xfc\xac\x70" - "\x36\xc6\x05\x67\x77\x77\x97\x70\xd6\x35\x0f\x4b\x07\x38\x7b\x97" - "\xf2\xb0\x78\x96\x71\x77\x6f\x91\xe3\xec\xee\x72\xcf\x38\xbb\x7b" - "\xbe\x84\xb3\xac\xde\xdd\xc5\xd9\xdd\x79\x77\xd7\xb6\xb0\x3b\x4f" - "\x92\x71\xf7\xcc\xec\x18\x67\x3f\x8c\x72\x8f\xb3\x1f\x0a\xdf\xc5" - "\x3e\x8c\xf2\x28\xe3\xb6\xc1\xd9\xbd\xc3\xbd\xc0\xd9\x9f\xb9\x0f" - "\xc2\xde\xc8\xdb\xb1\x2d\x50\x7c\x35\xb9\xec\x97\x38\xe5\xbc\x5f" - "\xc2\xc9\xb6\x30\x4a\xb4\x2d\xc8\xf3\xb3\x24\x8b\xf6\xdb\x48\x01" - "\x77\x47\xfc\x58\xdc\x2d\x9a\xd8\xe2\xc0\xdd\x04\xc0\xdd\x22\xba" - "\x3f\xa2\xc5\x81\xbb\xfb\xee\x13\xfb\x25\xe5\x67\xf1\x60\x5b\x18" - "\x42\xdb\xdb\xe9\xb0\x2d\x20\x0e\x47\x3a\xdb\x16\xfe\xbe\xdf\x33" - "\x06\x17\x95\xcb\x6c\x0b\x9f\xba\xc7\x60\x8b\x0c\x83\xff\x6a\xa7" - "\x18\x3c\x44\xc4\xe0\xbf\xaa\xae\x83\x6e\x79\x3d\xcb\x3b\x0c\xb6" - "\x50\x0c\x1e\x73\x6f\x30\x78\xdf\x1d\xc0\x60\x3a\xee\x7f\x7b\xd7" - "\x68\x00\x0c\x9e\x81\x18\x3c\xe6\xd6\xec\x0d\x3f\x51\x8e\x16\xec" - "\x97\x7b\x2c\xfe\x7b\x1f\x39\x16\xff\x3d\x9a\xd6\x75\x8b\xc5\x7f" - "\xbb\x26\x61\x31\xab\x77\x77\xed\x0d\x7f\x0f\xbb\xbb\xf6\x86\xbf" - "\x87\x49\x58\xfc\xf7\x4b\x1d\x63\x71\x51\xb5\x7b\x2c\x86\xf3\x14" - "\x8b\x8b\xaa\xdb\xc5\xe2\x21\xce\x58\xbc\xcf\x21\xf3\xca\xec\x0d" - "\xa6\x7f\xf5\xdc\x2d\xfb\x3c\xca\xbf\xea\x47\x48\x46\x9d\xe2\xa3" - "\xa7\x8d\xf9\x84\x34\x67\x92\x0c\xa3\x6d\x08\x81\x73\x30\x7e\x1f" - "\x4d\x37\x86\x0e\x26\xdc\x5b\x11\xc5\x88\xc7\x6f\xe3\x3f\xc8\xb8" - "\x3a\xa5\x30\xb7\xe8\x18\x7f\x44\xfd\x5d\xf1\x3c\x62\xef\x0e\xa7" - "\xeb\xee\x9e\xc5\xeb\x22\x06\x0a\xf7\xed\x63\xfb\x6e\x22\x06\x8b" - "\x65\xe4\x4d\x93\xe2\xa3\x62\x7e\x53\x44\xb8\x39\x28\x22\xdc\xdd" - "\xfd\x8f\xa9\x88\x7f\xd7\xd5\x3c\xbf\x3d\x97\xb7\x34\x3f\x3e\x5c" - "\xdf\xfc\x26\x21\xba\x5c\xde\xdc\x92\xf5\x91\x19\xee\x0d\xfd\x33" - "\xd4\x6b\xee\xf6\x91\xae\x39\x33\x8a\xb4\x64\xfd\x8f\xaf\x78\x0e" - "\xc6\x8d\x70\x99\x3e\x3c\x07\xd7\xf8\xdc\x4e\xa9\x3b\xd2\x00\xab" - "\x52\x09\xe9\x7f\x1d\xe7\xcc\xff\x04\x03\xcf\x04\x67\x43\x9b\x1b" - "\xa1\x2d\xfe\xc1\x87\x2c\xc0\x8f\xbe\x95\x6b\x09\xce\xe9\x75\xf0" - "\x5e\xfa\x6c\x1c\x7b\x9f\x27\xf3\x78\xa5\x2f\xe1\x76\x86\x5b\xf9" - "\xee\xd3\x8b\x80\x1e\x44\x97\x40\xfc\xf1\x3d\x36\x42\x3d\x5e\x99" - "\xce\x73\x7d\x06\xc0\xf8\x59\xd8\x9c\x86\xfe\x1d\x04\x3d\x96\x87" - "\xe7\x6e\x4f\x20\x2a\xf8\x0f\xe0\x37\x4f\x2f\x82\x7e\xe5\x43\xbf" - "\xd6\x62\xbf\x3c\xbd\xe3\xc6\x77\x60\xdd\x79\x28\x14\xd7\x0e\xfa" - "\x7c\x7c\x36\x7d\x8e\x92\x5b\x67\x87\xf3\x7c\x66\x3a\x6f\x4c\xb6" - "\x91\x40\x18\x8b\x1d\xd0\x6f\xe4\x47\xee\x2f\xc3\xf5\x6b\x7a\x12" - "\xb2\x27\xa5\x41\x69\x84\xbe\xdb\xff\xfc\x90\xc5\x90\xf6\x0c\x81" - "\xeb\x66\xd4\x59\x2e\x2a\xfe\x77\xcb\x84\x4b\x84\x20\x9e\xc0\xef" - "\x9d\x16\x58\xc7\xc6\x43\x79\x23\xbc\x07\xd7\x1c\xea\x8b\x75\xe1" - "\xfc\x44\x43\xd2\x69\x12\xa8\x25\xfe\xd9\xf0\x6e\x42\x5d\x35\xd6" - "\x35\x29\xfe\xb7\x00\xfb\x00\xe5\x81\x50\xc6\xfb\xd0\x87\x8c\xf0" - "\x05\xe1\x56\xca\x9b\x39\xd3\x8b\xb8\x3e\xe1\x56\x8a\x7d\xf0\x9e" - "\x1b\xe1\x9d\xa1\x4e\x00\xd4\x09\xa0\xc7\x34\xa2\xca\x81\x73\xd8" - "\x0e\x1c\x03\x0c\x8b\x6e\x60\xdb\x2a\x6c\xdb\xc3\x38\xf8\xf2\xc1" - "\xd3\x8b\x78\xe0\x6d\x5c\x53\xd5\x69\x8a\x13\x75\x8a\xe2\x51\x81" - "\x0a\x9e\xe7\x0b\x06\x64\xac\x49\x23\x01\x3a\x8e\x10\x43\x4f\x6c" - "\xa7\xf8\x61\x68\xdf\x17\xc7\xa2\x25\xeb\x7f\x6d\x26\xc5\xff\x14" - "\xe2\xf8\x02\x3d\x2d\xea\xc7\xf0\x1d\x8a\x27\xe3\x73\xf0\x1e\x56" - "\xff\x7f\x69\xec\x7b\xec\xb3\x3a\xcd\x87\x87\xeb\x43\x7d\x14\xe7" - "\x89\x4f\xe8\x03\x61\x2d\x59\xc5\x11\x26\xb2\x68\x32\xde\x6f\x62" - "\xf7\x01\x2f\x15\x47\x01\xcd\x4a\xf0\x1c\x96\x3d\xf4\x37\x40\xa4" - "\x5b\x45\x28\xf0\x86\x2b\xed\x44\x1e\x01\xbe\x10\x79\x04\xfb\xbb" - "\x37\xcd\xa4\xa4\xeb\xb0\xa2\x98\xea\x75\xd9\x40\x43\xfb\xd6\x50" - "\xdf\x8d\x30\xb6\xdc\x4d\xa4\x4b\x1d\x5c\xdb\xbf\x19\xe9\xb2\x31" - "\x05\x68\xc2\xea\x16\x4b\xfd\xc7\xf2\x7e\x4a\x4f\x0e\x68\xc1\xf6" - "\x6e\xee\x9f\x8f\xef\xb3\xf1\x3a\xd0\x31\x84\xb7\x94\x24\x43\xbf" - "\x90\x6f\x81\x47\xf6\x24\x58\x95\xe8\xd7\x87\xe7\x0f\x5e\xb5\x2a" - "\x37\x36\x12\x94\x2b\xc9\x06\xc0\xe5\x6d\x49\x30\xe6\xd0\x26\x1f" - "\x36\x20\x63\x80\x48\xc7\x14\xa0\x5d\x12\xf0\x2e\x8c\xf9\x46\x18" - "\xbf\xed\x80\x79\xf8\x7b\x3b\xac\x3f\x1c\xd4\x33\x29\xf6\x17\x40" - "\x7b\xaa\x6d\x21\xbc\x79\x47\x08\xdf\x04\x63\x38\xb8\x25\x6b\x7f" - "\x86\x38\x86\xd8\xa7\x8d\x70\x7e\x03\x5c\x87\xf1\xb4\x31\x1e\x2a" - "\x2e\x17\xdf\xd9\xd3\x78\xae\xdf\x43\x06\x6f\xd8\x43\x7a\xbd\xb9" - "\x87\x44\xac\xac\x87\x79\x99\x39\x8c\x3f\x3e\xc3\x06\x6b\x62\x6e" - "\xde\x8d\x90\x11\x3a\xfc\xf6\xc4\xad\x79\x48\xff\xfa\x1e\xd2\x17" - "\xf7\xc6\x4e\x00\x8a\xe2\x1a\x3e\xa1\xd3\x39\xde\xa8\xbd\x46\xb8" - "\xa0\xdc\x3c\xfb\x9a\x27\xbb\xbd\x08\xab\xe3\x51\x8d\x85\xa4\x25" - "\xc2\x5a\x7e\xb5\x81\xa4\x59\x78\x73\x65\xc6\x25\x02\xd8\xa3\x61" - "\x63\xf7\x8f\xc8\x09\xb1\x84\xe0\x9e\x41\xee\x9f\x1a\xf2\x40\x1c" - "\xf1\x4d\x3d\x45\x42\xd3\xeb\xf9\x06\x7b\xee\x84\x8c\xb4\x55\x44" - "\xb9\xe7\x6a\x0d\x93\x3d\x15\xff\x08\xfa\x04\xf7\xa7\xb6\x44\x93" - "\xd9\x36\x61\x3d\xca\x99\x5e\x9c\x3e\x9f\xf4\xc0\xf7\x09\xa4\xb2" - "\xd7\xc7\xbb\x61\xdc\x8a\xbd\xc3\xe7\x8f\x93\x29\x3d\x73\x27\xaa" - "\xf6\xcc\xb5\x82\xdc\xea\xa7\x4f\x8f\xe5\x1b\x50\xae\x83\xf5\x85" - "\xca\x82\xc6\x06\x1b\xc8\x56\xf3\x60\xfd\x36\x91\x43\x75\x7a\x25" - "\xb7\xd9\x4f\xef\xe5\x33\x6a\xe9\xba\x8d\x6b\x29\xf4\x7d\x8a\x86" - "\xb0\x75\x10\xd6\xcc\xc0\x44\x94\xa7\xf8\x73\xd8\xff\x83\xf0\xae" - "\x7c\xef\x78\x98\xa7\x1f\xc7\xe0\xfa\x39\xa1\xd6\x40\xca\xad\x76" - "\xf2\x4e\x23\x1d\x23\x3f\x18\x23\xc0\xd5\x8f\x07\xc2\x38\xf9\xbb" - "\xa3\x1b\xd2\x8c\xd3\xe5\xe6\x71\x3e\x8c\x36\x94\x2e\x16\x46\x97" - "\x17\x97\x10\x58\x47\x81\x36\x9b\x18\x6d\xb8\xee\xd1\x3a\xa4\x8d" - "\x77\xef\xf1\x8f\x02\x4f\xeb\x0b\x3e\x9b\x07\xfe\x40\xbe\xe0\x82" - "\xa3\x75\xf8\x6c\xec\x03\x7e\x3f\x43\x3e\x98\xf0\xfa\x39\xbe\x52" - "\xdb\x40\x8c\xf0\x3e\x7c\x90\x73\x1f\x6c\x5e\xf6\xe1\x80\xc6\x53" - "\x1f\xd6\xf7\x07\xbe\xed\x0f\x7c\xdb\x1f\xf8\xd6\xc4\xf8\xf6\x58" - "\x2d\xe3\x5b\x3b\xf4\xab\x15\x64\xf7\x95\x53\x88\x12\xfb\xb5\xeb" - "\x34\xc6\xe8\x83\x7e\x36\x48\xbc\x3b\xfe\x32\x8c\x91\xc8\xbf\x3e" - "\x4f\x76\xc3\xf1\xa9\xb4\xd4\x90\x74\xe4\xdf\x1b\xee\xf8\xf7\x20" - "\x99\x30\x07\x68\xf3\x1a\xf0\xef\x77\x1a\x12\x50\x4f\x7c\x57\x4d" - "\x01\xfe\x6d\x70\xc7\xbf\x9f\x9c\x38\x00\xcf\x6c\xc3\xbf\xb1\xce" - "\xfc\xfb\x49\xbc\xf7\xfc\xfb\xc9\x60\x07\xff\xbe\x24\xf0\xef\x7c" - "\x17\xfe\xad\x77\xe2\x5f\x7c\x6f\xaf\xf9\xf7\x93\x7c\xef\xf8\xf7" - "\x13\xb5\x83\x7f\x41\x2f\x79\xe7\x55\x3a\x46\x7e\x30\x46\xc0\xbf" - "\x07\x2c\x30\x4e\x6e\xf9\xf7\xa7\xa7\xdf\x21\xc3\xad\xd3\xef\xd0" - "\xa6\x8e\xe9\x77\xa8\x9f\xf7\xf4\x3b\x68\xbd\xfb\xf4\x3b\x34\xc3" - "\x3b\xfa\x1d\x34\x79\xa6\xdf\xc1\x7d\x3f\x1f\xfa\x1d\xce\xb8\x75" - "\xfa\x1d\x9e\xd8\x31\xfd\x0c\x97\xbd\xa7\x9f\xa1\xf8\xee\xd3\xef" - "\x70\x2f\xef\xe8\x67\xd0\x7b\xa6\x9f\x21\xd1\x13\xfd\x46\xf6\xe0" - "\x78\x0e\xfd\xe6\x42\x9e\x33\xa3\x0c\xc4\xe4\xb5\x4f\xc7\xa3\xce" - "\x08\x65\x5f\xb1\x4c\x65\x2a\xd0\xab\x5d\xca\x01\x2e\x65\x95\x4b" - "\x39\xd8\xa5\x1c\xea\x52\xee\x25\x96\x81\x5e\x9d\xae\x28\x0e\x7f" - "\x02\x3a\x1b\xc8\x38\x9f\x46\x0b\xd7\xc3\x66\xdb\xd5\xa8\xf7\x85" - "\xb9\xeb\xfb\xc6\x4c\xde\xaa\x4d\x23\x0f\x35\x2a\x3e\x2d\xa1\xf4" - "\x58\xd3\x53\xc3\xa7\x64\x10\xa0\x47\xf5\x8b\xab\x90\xaf\xcc\x84" - "\xbf\x19\xea\x07\xe3\xf4\x20\xe8\x9b\x66\xe4\x39\x75\xc2\x21\xbe" - "\x4e\xf1\xe9\x5f\xf1\xfd\xfa\x6b\x0d\x84\xf3\x79\x52\xc3\xd3\x98" - "\xcd\x7e\xd5\x66\x9f\x27\x7b\x82\x3e\xaa\xcf\x56\x72\xfe\xd9\x99" - "\x9c\x7a\x95\x99\x37\x8f\xfb\x01\xd6\x31\x58\xcb\x8c\x4d\x56\xe0" - "\x49\xde\x6c\x48\xb8\x0c\xfd\x3d\xd2\xa3\x22\x15\xda\x86\xe7\xc0" - "\xb3\xaa\xf8\x60\xbf\x7d\x46\x5b\x15\xe1\xa1\x8d\x4a\x4b\x29\xe8" - "\xfe\x35\x44\x68\xb3\x8a\xef\xee\x87\xbe\xa6\x7a\xb7\xfa\x59\xce" - "\xb0\x30\x78\xe6\x90\x29\x1a\x5f\xc2\xaf\xf6\x0d\xf6\x8e\x3f\x8e" - "\x44\x78\xd4\xfb\x72\x86\x15\xb0\x76\xfd\x6f\xa7\xdd\x1c\xcf\xed" - "\x46\x0a\xfd\x55\xdd\x4e\xbb\x4d\xed\xb4\x2b\xf4\x57\x7d\x1b\xed" - "\x96\x8c\xf2\xdc\xee\x70\xa1\xbf\x91\xb7\xd3\xae\xc7\xfc\x1f\xd0" - "\xae\xd0\xdf\x8c\xdb\x69\xd7\xd2\x0e\xdd\xc2\x6e\x8f\x17\x8e\x8e" - "\x69\x8f\x17\x6e\x8f\x0f\x8e\xb6\xf3\xfe\x91\x61\xb7\xc7\x03\x47" - "\xcd\xed\xf1\xc0\xed\xd1\xff\xb3\x76\xe9\x7f\x7b\xb4\xff\x2c\xaf" - "\x3d\xda\xdf\x1e\xdd\x3f\xf3\xc8\xff\xa8\xcb\xf2\x39\xcf\x19\xf8" - "\x90\x78\xc2\xe5\x76\x35\x70\x21\xcf\x7d\xba\x86\x8b\x24\x23\x01" - "\xc3\x02\xf3\x48\x50\x24\xb5\x0f\x7d\x9e\xb1\x2a\x9f\x28\x75\x4a" - "\x4e\xb9\x3b\xa5\x46\x69\xb4\x0d\x26\xe9\x36\xde\x5e\x90\x64\x55" - "\xfc\x12\xce\x1f\x8e\x23\xc4\xb2\x54\x43\x58\x3b\x5d\x0d\xd9\x69" - "\x91\x64\x82\x9d\xa0\x3d\xc2\x72\x24\x15\x30\x0c\x70\xcc\x98\x67" - "\xc5\x35\x2f\x08\xee\xb3\x01\xff\x42\x1b\x56\xb2\x97\x33\x2b\x22" - "\x13\x68\x3d\x33\xe8\x8d\x66\x3e\xf7\xb9\x4f\xf9\x74\x0d\x59\x0b" - "\xbf\xe1\x99\x97\x7c\xcc\x44\xb9\x1d\xf4\xc9\x96\xac\xcf\xeb\x4d" - "\x8a\x52\x03\xea\x98\xa0\xcb\x36\xa5\xff\x80\x36\xf7\x78\xb2\x06" - "\xf4\x5a\xac\xbb\x87\x33\x2b\xfb\x6b\x89\xf2\x88\x19\xf5\xf7\x52" - "\xd5\xe1\x44\x42\xda\xb1\xb9\xf8\x72\xc1\xd3\x7c\xf1\x7e\x6c\x07" - "\x6d\x99\x1b\x39\x18\xdb\xe0\xe9\xc5\xd8\x5f\x3e\x67\x44\xb2\x21" - "\x05\xd7\x85\xd2\xbc\xd1\x4f\xf0\x2d\x02\xce\xf7\x6c\x84\x32\xd5" - "\xd9\x33\x79\xc0\xdc\x4e\x85\x7c\xf6\x03\x91\x95\x96\xab\xc4\x90" - "\x74\x83\xd4\x29\x4a\xb7\xe0\xb3\x9b\x83\xa7\x11\x4b\xf0\x34\x7f" - "\xe8\x43\x8e\xd8\x5f\x7c\x96\x78\x1e\x6d\x14\x42\x1f\xf7\x1d\x4e" - "\xf5\xdc\x47\x58\x4b\xba\x4d\x08\xe5\xcd\x38\x86\x86\xb4\xab\xd0" - "\x97\x63\x4f\xe0\x38\xf3\x39\x53\xab\x2c\xe9\x9a\x47\x98\xcd\xae" - "\x2c\x0a\x6d\x3f\xb0\x0e\x94\x30\x3b\x8c\x5f\x09\xf5\xb3\x01\xbc" - "\x07\x9d\x3d\x0f\xe5\x95\x2b\x8a\x32\x9a\xff\x78\x8a\x46\xe9\xa5" - "\xce\x53\x46\xd7\x7f\xc3\x23\x38\x0e\xc7\x82\xe0\x79\xcf\xd6\x29" - "\xca\x12\x99\x1d\xc2\xaf\x06\x9f\x07\x75\x70\xcd\xa9\xe1\x73\x3a" - "\xe9\xb1\x1e\x5c\xcf\x11\xae\x9b\x9c\xae\x9b\xf8\x9c\x69\xa1\xc2" - "\xf5\x7d\xc2\xf5\x7a\xa7\xeb\xf5\xda\x47\xd0\x2e\x57\x56\x8b\xef" - "\x04\x6b\x99\x01\xd7\x35\xb4\xf9\xd3\x77\xea\xee\x67\x10\xea\x55" - "\x37\x29\xca\xae\x35\x03\x5f\xc1\xf5\x5a\xa7\xfb\x6b\x8f\x24\x87" - "\x93\x91\xdb\x70\x4c\x8f\xf9\x9b\x7c\xbb\x84\x31\x5b\x4e\x19\xf5" - "\x2d\x82\xf6\x8a\x9d\xdb\x83\xf3\xd5\xd0\x66\xb1\x05\x64\x3d\xa0" - "\x4f\x13\x3e\xd3\x79\xfc\x63\x13\x12\x16\x27\xa8\xfb\xcc\x53\xcf" - "\x8b\x9f\xa3\x7e\x65\xf1\xb2\x45\x89\x43\xfb\xcc\xeb\x42\x88\x13" - "\xef\xa8\xf8\xcc\x40\x9e\xcb\x99\x34\xc6\x98\x07\x32\x96\x52\x05" - "\xeb\xed\x0d\x92\x03\x74\xb5\x87\xcc\x0d\xb7\xe7\xce\x81\xf9\x33" - "\x52\x6d\x48\x19\x01\x63\x7f\x6c\x0b\xb5\xfb\xab\x09\x59\x0f\xd7" - "\x0d\x29\xc7\xf0\xdc\x6e\x7a\x6e\x1e\x21\xd4\x5e\x95\xe2\x4f\x4a" - "\xd4\x57\xa9\xcd\x0b\xae\x5d\xa0\xf6\xbd\x6b\x44\x69\xcb\xf4\x27" - "\x7f\x4f\xab\x52\x1e\xe0\x4c\xca\xbf\x73\x35\x4a\x94\x17\x8e\x84" - "\x96\x92\x01\xc9\xfe\x04\xaf\x1f\x4a\x83\xf3\x70\x1d\xaf\xd1\x76" - "\x28\xad\x8f\x0f\xc2\x7a\x68\x03\xc3\xdf\xe9\x79\xfc\xf9\x23\xa1" - "\x66\xc2\xe4\xd6\x63\x6f\x60\x5f\xd5\x3d\xf1\xfb\xc2\xb1\x0d\xd8" - "\x3f\x93\xe2\xd8\x7a\x9f\x7c\xa8\x9f\x44\x02\xa0\xfe\x0a\x6e\xf3" - "\xa4\x31\x88\x05\xb6\xac\x63\x91\x7c\x66\xb7\x7e\xdb\xdf\x22\xfe" - "\xf9\x6f\xc1\xdc\x7c\x8b\xf8\xb6\x64\x1d\x9f\x67\xf2\x55\xd7\xe3" - "\xd8\x42\x33\x01\xcd\x4a\x32\x0c\xce\x25\x9b\x48\x7c\x13\x9e\x83" - "\x39\x68\xf1\x84\x2d\xd7\x41\xbe\xb3\x86\xf5\x37\x70\xc1\x93\x06" - "\xf3\x30\x6e\x2d\x61\xfd\xcd\x81\x5a\xe0\x2d\x98\x63\x7c\xf7\x49" - "\x83\x9b\x14\x15\xeb\x3f\x1b\x48\x48\x1a\xce\xe9\xdc\x91\xea\x0f" - "\xae\x5b\xf1\x7b\x5a\xf8\xae\xeb\x66\x28\xcf\x31\x14\x42\xb9\xcc" - "\x50\x48\xd4\x2f\xa2\xec\x74\xfc\xf2\xef\xe7\xf1\xb6\x27\xca\x41" - "\xce\xac\xff\x1b\x39\x5e\x5d\x4a\x02\x66\x10\x1f\x47\xac\xf7\x44" - "\xa2\x9c\x60\x82\xf2\x32\xa2\xac\x04\xbd\x1f\x6d\xf3\x69\xbf\x45" - "\xfb\x7c\x05\x41\x9b\x3d\xaf\x5c\x6c\xd9\x7d\xd5\x0a\x18\xd6\xd0" - "\x09\x7d\xbe\x39\x55\x7e\x1e\xde\x33\xdb\x22\x7c\xeb\x6a\x16\xbe" - "\x75\x35\xd3\x6f\x5d\xa6\xd4\x18\xf6\xad\x0b\xbf\x71\x4d\x88\xf1" - "\xe1\xb1\x3d\xfc\xee\xf5\x80\x05\xf8\x60\xa9\xa6\xab\x7d\xa9\xa6" - "\x5b\xde\x55\x12\x5c\x69\x6e\x00\x19\xad\x94\x6c\x4d\x22\xc1\x7c" - "\x73\xdc\x7d\xe5\x86\x63\x84\x7f\x2b\x4f\xb7\x37\xcd\xd0\xc9\x8e" - "\x36\x8a\xe6\xd0\x2e\x81\xab\x15\x68\xe7\xef\xba\x3e\x81\xf4\xdd" - "\x71\x95\x84\xcf\xbe\x90\x41\xe3\x3e\x61\x8e\x3e\x5b\xb3\x46\x7d" - "\xb3\x59\xf3\x58\x6b\xb3\xe6\x91\x40\x33\xfb\x36\x36\xf3\xb2\x8a" - "\xa0\xbf\x2d\x9f\xf5\x8f\xa6\x1d\x68\xa3\xb6\x98\x89\x2d\x28\x3f" - "\x0f\x79\x19\x9e\xdd\x0b\xbf\xa7\xa4\xaf\x20\x2a\xee\x5b\x0d\xa9" - "\x88\xbb\x4a\x06\x00\xed\xf1\xdb\xc1\xf6\x3a\xf6\xed\xc0\x0e\x3a" - "\x0d\x7e\x3f\xb8\xde\xac\x51\xf2\xc1\xd1\xfa\xf1\xf3\xd5\xa4\x75" - "\x67\x7f\x83\x31\xf9\x03\x92\xde\xca\x9f\x37\xae\xe5\x08\xda\x95" - "\xf9\xac\xe3\x3a\xbe\x7b\xb4\xfe\xa8\xe6\x24\xae\x2b\xe1\x12\x76" - "\x54\x4c\xbf\x3d\xec\xa8\xa0\xf2\x33\x7e\x67\xe3\x73\x81\x8e\x57" - "\x91\x9e\x40\xd7\xab\x66\xe5\x58\xa0\x5d\x45\xfd\x7b\x40\xb7\x1a" - "\x19\xdd\x28\x9d\xa1\xde\xc5\x79\x40\xaf\x0b\x8c\x86\xe5\x16\xa0" - "\xdf\x7e\x6c\x63\x5a\xe4\xee\x24\xab\x12\xf4\x26\x65\xb9\xf5\x0c" - "\xdd\xb3\x82\x74\xdc\x75\xa3\xb4\x53\x2b\xac\x37\xf8\xbd\xf2\x7a" - "\x41\x7f\x53\x6b\xf0\xa4\xd0\x9b\xc1\x93\x34\xed\x7c\xbb\x64\xf4" - "\x9c\x4f\xfc\xcb\xeb\x4f\x32\x7a\x2e\x11\xe8\x89\x3e\x6e\xcb\x35" - "\x5d\x6d\x2d\x40\xcf\xeb\x40\xcf\x44\x13\x79\x27\x81\x04\x1b\x1b" - "\x6a\xf0\xbb\xce\x7d\x2f\x54\x10\x32\xf6\x09\x9e\xab\x30\x9c\xa6" - "\x74\xdd\x03\x74\xb5\xe9\x72\xf3\xf0\x7b\xa6\x83\xae\x49\x40\xd7" - "\xeb\x40\xd7\xcb\x12\x5d\xed\x2d\x40\xd7\x16\xa0\x6b\x0b\xd0\x55" - "\xf8\xe6\x39\x73\x3e\xd0\x15\xbf\x8f\x65\x1d\xd0\xe2\x37\x4f\xfc" - "\xb6\x84\x74\x45\xbf\x6a\x6e\xb9\xa6\x17\xfd\xd6\xf9\x8a\x86\xec" - "\x98\x4b\xfc\xfb\x59\x89\x22\x7d\x3f\x51\x41\x3f\x55\x8f\xef\x23" - "\x4a\x68\x0f\xf8\xbe\x8e\x20\x7d\x8d\xfb\xec\x64\xe5\x74\xf2\x88" - "\x6d\x13\xa3\xb3\xd1\xf6\x11\xda\x76\x07\x5f\x5f\xae\x51\x6e\x49" - "\x22\x11\x48\xf3\x71\x17\xd4\xe4\x68\x54\x05\x71\xa5\x39\xb7\x79" - "\x6a\x15\xd0\x69\x14\xd2\xfd\xf6\xe7\xed\x89\x51\xb7\x3e\x6f\x8d" - "\x3b\xff\x6f\xde\xde\xe9\x79\x6b\x1c\xe3\x7e\xde\x9e\x08\xba\xbd" - "\x79\x7b\x42\xf5\x7f\xf3\xf6\x5f\x61\xde\x56\xd9\x5c\xe7\xad\x43" - "\x6e\x49\x88\x8d\x9f\x33\x7f\xd1\xfc\x45\xaf\xa9\xe7\xae\x48\x8c" - "\x5d\xca\xa4\x17\x99\xfc\xa2\xb1\x73\x91\xca\xb7\x61\xbd\x3e\x1e" - "\x5a\x43\xf6\xf6\xac\x51\x72\x2f\x87\xfa\xf2\xba\xbf\x99\x38\xdd" - "\x47\x71\x6f\x83\x1c\x8e\xf3\x3b\x07\x64\xec\x8b\x8a\x33\x71\x9f" - "\x83\x14\x68\x48\x68\x24\xf8\x9b\x7d\xc3\xd5\x6a\x70\x9f\x63\x5e" - "\x2e\xdf\x80\xfb\x1c\xcb\x4a\x50\xb6\xf8\x72\xff\xfd\xd1\xa0\x43" - "\xbc\x1c\x4a\x5a\x5f\x8e\x56\xbe\x79\x9a\xf8\x07\xd6\x90\x71\x1c" - "\xc7\xf3\x86\xb4\x46\x90\xfb\x4e\x17\x19\x5e\x6a\x24\x28\xeb\x5c" - "\x54\x9c\x0a\x52\xa7\xac\x86\x63\xcd\x35\x75\x4a\xd6\x39\x38\xd2" - "\x3c\x7a\x20\xfb\x37\xf0\xb9\x13\x75\xf6\xbf\x3c\xad\xc2\xef\x9b" - "\x3b\x42\xf8\xfa\x3d\xa0\x67\xec\xb9\x61\x55\xae\x49\x40\x3f\xf1" - "\x47\x79\xfc\x4e\x89\x63\xb0\xe6\x2a\xe8\x12\x6b\x45\x5b\x51\x4d" - "\x6f\x9c\x5f\x20\x5f\xd5\x1f\xbc\x58\xa3\xc4\xf9\x66\x09\xee\xa4" - "\x5f\x0b\xef\x01\x7d\x34\x6d\xc9\xe5\x6b\xcd\xdd\x27\x8d\xf1\x55" - "\x13\x65\x4b\x56\xb5\x06\x64\x9e\x68\x94\x57\xd6\xc1\xb5\x37\xe0" - "\x1a\xfb\x5e\xf8\x75\x2d\xef\xf7\x85\x15\x31\x0e\x78\x5a\x71\x45" - "\x51\x4d\xe3\x3c\xad\x67\x3a\x49\x83\x75\xf3\x24\x8d\x6d\x67\x7f" - "\x93\x0d\xe5\xc9\x3e\xfd\xcd\xad\x9b\x27\x85\xda\x36\x4f\x1a\x3c" - "\xe5\x09\xfa\x5d\x1c\xea\x7f\xf5\x02\xbe\x43\x6b\xce\x48\x35\xd4" - "\xb7\x34\x07\xcf\x0d\x6f\xce\x99\x63\x38\x96\x9c\x47\xd4\x93\x10" - "\xfb\xaa\xdf\x1d\x9b\xc7\xdb\x9e\x8c\x02\xec\xcb\xfb\x80\x1c\x1f" - "\x07\xd8\x17\xdd\x16\xfb\x98\x1f\x81\x9d\x30\x0c\xac\x20\xd0\x56" - "\x3d\xce\x21\x94\x51\x77\xc3\x38\xe0\xfc\xc0\x79\x40\xb1\x10\x70" - "\x50\x9c\x2b\x38\x8f\x10\xeb\xe8\xbc\x75\x99\x37\x38\x57\xee\x37" - "\x13\x15\xce\x15\xc4\x42\x9c\x2b\xe8\x9f\xf3\xb6\x30\x57\x02\x6b" - "\x89\xea\x1d\xc0\x41\xa3\xad\x94\xce\x17\x94\x25\xcb\x6d\x4e\x18" - "\x88\xdf\x76\x9c\xe6\xca\x06\x71\xae\x88\x18\x08\xf3\xc1\x86\x73" - "\x65\xb9\xe6\xb1\x1b\xcb\xa5\xb9\xf2\xf2\x19\x15\xa1\xf8\x98\xf5" - "\x0f\x6d\x3e\xcc\x95\x4a\xad\x99\xd8\x45\x0c\x84\xb9\x82\xfb\x87" - "\x28\x06\xfe\x11\x30\xb0\x09\x30\xd0\x0c\xe7\x61\x8e\x6c\x5f\x20" - "\x60\xa0\x30\x37\x5a\x97\x0b\x18\x78\x59\x4d\x6e\xf4\x41\x0c\x7c" - "\xc7\x83\xec\x72\xc6\x05\x03\xbf\xea\x7e\x7b\x18\xf8\x15\x8d\x7f" - "\x84\x34\xbc\x01\xf4\x44\x3a\x8e\x0d\xe5\x6d\xe5\x79\x80\x7d\x93" - "\x7f\x66\x74\x4b\x70\x4f\xb7\x3d\xc2\xda\xe5\x16\xe3\xdc\xd0\x0d" - "\xf8\xbc\xc9\xd6\xd2\x96\x76\x7c\xd6\xfe\x62\x67\x9c\x43\x7c\x43" - "\xac\x43\x8c\x43\xbc\xc3\xf9\x81\x38\x87\x18\xf7\x2b\xc0\x7f\x28" - "\x37\x54\xc4\xd5\x51\xfc\x4b\xbf\x40\x54\xe9\xa3\xc9\x23\xc6\x62" - "\x3b\xe8\x36\xd7\x08\xe2\x9f\xf3\xda\x86\x78\x87\xb4\xdd\x72\x9d" - "\xe1\x1d\xae\x71\x88\x6d\x6d\xd6\x38\xa0\x2d\xd0\x84\xe0\x1a\x47" - "\xed\x14\x99\xc1\x3d\x76\x74\x63\x3a\x49\x4e\x37\x02\x7a\xf6\xd7" - "\xb6\xb6\x7a\x49\x8d\x4a\xd4\x4b\x70\x8e\xe3\x5c\x37\x29\xaa\x23" - "\x98\xee\x39\x41\xcb\xf4\xa1\xb3\x3d\x68\x19\x74\x7e\x49\xdf\xaf" - "\x99\xc8\xbe\xdd\x83\x7e\xdf\x7d\x44\x32\xbf\xb9\x53\x21\x8e\x2b" - "\xbe\xe7\xec\x27\x80\x2f\x37\x4f\x43\x9d\xad\xc9\xb6\x79\x9a\x2f" - "\xfc\xf6\x97\x78\xad\x66\xf5\xd1\x64\x42\xa6\x24\x7b\xcb\x6b\x35" - "\xd4\x77\x86\xff\x26\xfa\x17\xfc\xcb\xd1\xbe\xdc\x37\xd1\x9d\x80" - "\x2f\x42\x17\xdb\x33\xc8\x75\x9d\x56\x9d\x6e\xe3\x1b\xd4\x29\xe4" - "\x49\xe8\xd7\xf9\x32\x1b\x21\x65\x16\xc0\xbd\x71\x0b\x81\xc6\x8b" - "\xf5\x7b\x39\xb3\xaf\x49\xf1\x25\xda\x2b\x1a\x00\x7b\x7d\x9d\xb1" - "\x97\xe1\xec\x97\xf4\x1b\x81\x55\xa7\x0d\xc7\xb6\x26\x94\x92\x40" - "\x58\x7f\x7d\x2f\x2a\x4e\xaf\x5e\xb1\x8a\xe0\x7e\xd7\x4e\xf0\x7b" - "\xfc\x8d\x6e\xc3\xf4\x70\x7f\x57\xfe\x9b\xc9\x0a\xed\xf3\xe4\x11" - "\xfe\xe5\xc9\x0a\xf4\x55\x78\x9f\xd3\x2b\x39\x38\xc7\x7c\x9f\xf4" - "\x04\xaf\xaf\xbf\xe1\x4b\xe5\x32\x0e\xea\x54\x5a\xf4\x64\x7d\x92" - "\x3f\xc1\xfa\xcc\x9f\x4e\x4f\xb0\xfe\x86\x04\x15\xf5\x75\xa0\xf7" - "\xd9\xf4\x04\xef\xb5\xc3\xf9\x3f\x71\x01\x24\x3b\x25\x98\x94\x95" - "\x57\xd2\x36\xca\xca\x3f\x23\xd8\x06\xf0\x3f\xfc\x3e\x48\x36\x26" - "\x85\x02\x0e\xe8\xe1\xfa\x57\x64\xe3\x95\x5e\x70\xbc\x08\xff\xd7" - "\x49\xa3\xe2\x94\xb9\xac\x9c\x23\x81\xab\x87\xf1\xc0\xc7\xbc\x11" - "\xf7\x50\xa6\x11\x3f\x58\x47\x5a\x8d\x35\x3a\xd0\x61\x6b\x4c\xb8" - "\xc7\x9e\x4f\x7f\xb9\x89\xe3\x5f\xbe\xcc\xa5\xbf\x7c\x05\x9f\x6d" - "\xe7\x5f\xfe\x1e\x9f\xbd\x21\x45\x2d\xf8\xd7\xea\xa9\x2f\xe0\xfa" - "\xeb\x61\x04\xfb\x8a\xcf\xc5\xe7\x6d\x4c\xd0\x08\xcf\xec\x4b\xfb" - "\x86\xcf\xc4\x36\x9d\x9f\x89\xf9\xeb\xd5\x53\xf1\x99\xa7\xe3\xe1" - "\x18\x04\xf4\xa8\x47\x3a\xe0\xf3\x39\x3e\xba\x13\x9f\x1e\xed\x43" - "\xef\xb1\x36\xb8\xbb\xe7\x5d\xe1\x1e\x13\xd5\xfb\xe1\x9e\x56\x9e" - "\xd6\xa7\x6d\xc0\xda\xf8\x09\x9e\x7f\x2a\xda\x40\xda\xd2\xf0\x9b" - "\xe9\x6c\xad\xfc\xe6\x09\xb6\x56\x32\x9a\x52\x5e\x79\x39\xba\x13" - "\xd0\x4d\x85\xeb\x6a\x9d\xe2\x1b\x85\xa3\x8d\x6f\xa2\x7d\x90\xde" - "\xc8\x37\x22\x2f\x21\x1f\x89\x3c\x44\xfb\x69\x26\xc4\x99\x67\xe0" - "\xb7\xbf\xd0\xce\x0b\x62\x3b\xd0\x07\x22\xf2\xd1\x53\x70\xbd\x2d" - "\x1f\x9d\xe9\x2d\xf1\x51\xed\x61\x6b\x1a\xcf\x23\x1f\x19\x5e\xca" - "\xc4\x76\x36\x49\xfd\x99\xac\x40\x1e\xfb\x17\xe3\x2d\x33\xd2\xe9" - "\xa9\x54\x12\xcc\xde\xa7\x76\x0e\x7d\x9f\x54\x43\x30\xf6\x55\x7c" - "\x0f\xec\x43\x36\xa7\x26\xe2\x7b\x6c\xbc\x11\x06\xed\x5e\x21\xc2" - "\x3d\x9b\xb1\x6d\x71\x0c\x80\x66\x44\xbc\x47\xac\x9f\xcd\x69\xa0" - "\xdf\x7d\xe9\x3d\x8c\xe7\x2e\xba\xe1\x9f\xda\xf3\xae\x3c\x77\x7f" - "\x2a\x01\x01\x18\x64\xab\x97\xae\xe2\x73\xec\xac\x6f\x87\xec\xad" - "\xdf\x44\x23\x5d\x95\xec\xfc\x99\xee\x4e\x3c\x21\xb4\x6f\x75\xd3" - "\xfe\x99\xe1\xb2\xf6\xa3\xa1\xfd\x64\x68\x1f\x65\xb7\x97\xd0\x66" - "\x77\x66\x26\x6d\x27\x99\xb5\x2f\xf2\x2d\xaf\x8b\x08\xd7\xa6\xa0" - "\x3f\xea\x59\x5f\x86\xa7\x5f\xd2\x31\xa2\x7e\x50\x4a\x4e\xcf\xb9" - "\xf8\x41\x39\xfb\xc9\xed\x4d\x33\x0b\x3e\x50\x67\x68\x6c\x43\xb4" - "\x8d\xa1\x0c\xba\x1b\xe4\x37\xc9\x0f\xea\x34\x5e\xbf\x6c\x48\xaa" - "\x73\xf2\x83\x3a\x63\xc0\xfa\x26\xc5\xd9\xd0\x16\x25\x51\x42\xb9" - "\x9a\x9d\xff\x32\xc6\xf9\xbc\xe4\x67\xc8\xce\xa3\x0f\xb7\x60\x27" - "\x6e\x3a\x52\x8c\x76\xc2\xb3\xe1\xa2\x6d\xd6\x83\xee\xeb\x85\x8c" - "\xdc\x50\x20\xc9\xc8\x0d\x05\x9e\x65\xe4\xb3\x67\xda\x97\x91\x2f" - "\x34\x49\x32\x72\xfd\x78\x36\xef\xeb\x9f\x66\xf3\xfe\xdb\x1f\xa8" - "\xdd\x19\xda\xb3\xbd\x17\xaf\xe6\xff\x32\xa0\x08\xf9\x7c\x3b\xc8" - "\xbc\x7b\x93\x4a\x95\x7b\x40\xc7\xb2\x83\x7c\xbc\x26\x85\xf8\x62" - "\xfc\xb7\x35\x30\x86\x46\x5b\x2d\xa9\xf0\x45\x19\xf9\x0b\x68\xe7" - "\xdb\x99\x95\x66\x2b\x81\x75\x2e\x83\x8d\xcb\xb9\xdf\x02\x2d\x7c" - "\x8c\x56\x2b\xad\x87\xd7\x60\x5d\xab\x47\x39\xf9\x20\x57\xaa\xdc" - "\x96\x82\x32\xf4\x42\xb3\xb3\x0c\xdd\x92\x75\x6e\x9e\x7b\xd9\xf9" - "\xdb\x50\xdb\xff\x63\xef\xfd\xe3\xa2\xa8\xf6\xff\xf1\xc3\x2c\x28" - "\x1a\xc8\xea\x05\x5b\xbd\x58\x6b\x61\x61\xa1\xa2\x61\x17\x8b\x62" - "\x31\x2d\x2b\x15\x34\x4d\x32\x4d\x34\x34\x28\x40\x54\x54\x34\x05" - "\x34\xf5\xad\xa6\x08\x06\x5c\x2c\x44\x2c\xbd\x69\xd7\x1f\xd8\x47" - "\x6f\xda\xd7\xba\x78\x93\xde\x68\x08\xd8\xd5\x1b\x76\x35\x57\x43" - "\x43\x43\x5d\x15\xe5\xd7\xee\xce\xf7\x75\xe6\xcc\x3a\x33\xbb\x33" - "\xcb\xce\x2c\x10\xfa\xf6\x8f\x7d\x88\x33\x67\xce\xcc\x79\xbd\x9e" - "\xe7\x75\x9e\xcf\xd7\x9c\x73\x66\x05\x9f\x3b\x9f\xdd\x83\xb9\x33" - "\xce\xe5\x63\x3e\x60\x26\x9c\x59\x0f\xfc\xd9\x80\x79\x34\xe6\xce" - "\x66\x01\x77\x3e\xb7\xdc\x3e\x77\x3e\x7b\xe6\x3e\x77\x6e\x2d\xee" - "\x6c\xc9\x1f\x58\x73\xe7\x73\x63\x94\x71\xe7\x73\x11\xf7\xb9\x73" - "\x7b\xe3\xce\xe7\x42\x2c\xdc\xd9\xbc\xd4\xbb\x03\xce\xe7\xe7\xdf" - "\xe1\xce\xbf\x06\xdb\x72\xe7\x5f\x47\xda\x72\xe7\xb3\xc9\x42\xee" - "\x7c\x69\xbc\x2d\x77\xfe\x75\xad\x14\x77\x86\xb8\x55\x83\xb9\x33" - "\xc6\x17\xe6\xd1\x98\x3f\x9b\x81\x3f\x13\xac\xfd\xfa\x8d\x32\xee" - "\xfc\xeb\x41\xc7\xb8\x73\x55\x2f\x71\xee\xfc\xcb\x69\x69\xee\xfc" - "\xcb\x69\x71\xee\x7c\xe1\x1b\x8e\xf3\x5c\x58\xd5\xfe\xb9\xf3\x85" - "\x00\x71\x7e\x73\x61\x30\xe1\xce\x55\xbe\x2d\xcf\x9d\xab\x7c\xc5" - "\xb9\xf3\x85\xed\x84\x67\x54\x69\x6d\xb9\x33\x5c\x23\xca\x9d\x2f" - "\x9c\x61\xaf\xf1\x15\x72\x67\x52\x07\x8c\x99\x0d\xd2\xdc\xf9\x62" - "\x36\x19\x43\x2f\x4e\x27\x63\x28\xf1\xa9\x2d\x77\xbe\xf8\x5c\xf3" - "\xdc\x99\x60\x88\x79\x4e\x49\xee\x7c\x71\xb9\x2d\x77\xfe\xe5\xb4" - "\x38\x77\xae\x9e\xcc\xe1\xe8\x37\x93\x90\x3b\x5f\x3c\x76\x77\x70" - "\x67\x49\x6c\x05\x08\xb9\xf3\x6f\x1b\xe5\x73\xe7\xdf\x8e\xcb\xe3" - "\xce\x18\x73\x62\xdc\xb9\xba\x97\x35\xe6\x84\xdc\xb9\x7a\x88\x38" - "\x77\xae\x1e\x23\xe4\xce\xb8\x7e\x31\xee\x5c\xbd\x58\x50\xbf\x0d" - "\x77\xae\xde\x20\xe4\xce\xa4\x1c\xc7\x9d\x2f\xe9\xd8\x5c\xc4\x72" - "\xf9\xdc\xf9\x52\x6f\xfb\xdc\xf9\x52\x5f\x21\x77\xae\x36\x12\x8e" - "\x7c\x69\x1c\xe1\xce\x97\xd4\xe4\xf8\x2f\xcb\xf8\xc7\x39\xee\x4c" - "\x8e\xdb\x72\xe7\x4b\x71\xcd\x70\xe7\x60\xc7\xb9\x73\xed\xa4\x92" - "\x3b\xdc\xb9\x76\x92\x85\x3b\x9b\x81\x3f\xe6\x03\x0f\x80\x5f\x35" - "\x5e\x0f\x81\xfb\xdc\x45\x97\xcb\xbd\xec\xf3\xe7\xeb\xb9\x1c\x7f" - "\xbe\x76\x89\xf4\xfd\x6b\xc7\x48\xdf\xbf\xb6\xf6\x4e\x8e\x19\xb8" - "\x33\xe6\xd0\x6c\x8e\xf9\x44\x3a\xfc\x76\x2f\x2c\x61\xf8\xf3\xae" - "\x1b\xf5\x14\xe6\xd0\xab\xf0\xdc\x4c\xe0\xd1\xdf\xb1\x1c\xba\xbc" - "\x36\x98\xe5\xd1\x57\x1b\x60\xcc\xd0\xa7\xa7\x30\xeb\xb5\xdc\xe1" - "\xf9\x2a\x19\xfe\x9c\x54\x8f\x3e\xbb\x1d\x8c\xdf\xc3\x57\x16\xa5" - "\x90\x72\xd0\xce\xd3\x1c\xdf\xbe\xbc\x5d\xc0\xb7\x93\x18\xbe\x7d" - "\x02\xf3\xed\xef\x4a\x10\xfa\x36\x85\x70\x6e\xcc\xb7\x31\xef\x06" - "\xbe\x5d\xb1\xb1\x3b\x5d\x5a\xb7\xe2\x72\xa5\x85\x73\xaf\x85\xff" - "\x83\xaf\xf5\x87\x0b\x10\xda\x38\x03\xb9\x82\x4f\x2a\x3f\x80\x7b" - "\xe0\xf2\x75\x2b\x7e\x47\x96\x72\x30\x66\x57\x10\x5e\x7e\x75\xbf" - "\x59\x90\xd3\xfe\x7d\x14\xd6\x24\xcc\x78\x0c\x76\xc0\x3c\xcb\x92" - "\xd3\x36\xf7\xe9\x6f\xa0\x7d\x08\x37\x17\xe6\xb5\xaf\xf4\xb6\x70" - "\xf3\x74\x96\x9b\x37\x78\x03\x37\x4f\xb4\x70\xf3\xdf\x17\x28\xe4" - "\xe6\x27\x18\x8e\xf7\x4a\xcb\x73\xbc\x0d\xf3\xfe\x78\x6e\x8e\x79" - "\x39\xe6\xe2\x98\x97\x63\x9e\x8e\xb9\x39\xe6\xe9\x66\x96\x9b\xe3" - "\xbd\x09\xeb\xeb\x9a\xe1\xe6\xc0\xdd\xe8\x0e\xe5\x23\x18\x6e\xee" - "\xc2\xe7\xe6\x35\x57\x94\x71\xf3\x9a\x1a\x3e\x37\xc7\xb8\x97\xcb" - "\xcd\xb1\xef\x6d\xde\xc5\xe2\x6f\x2f\x80\xff\xb0\xaf\xec\xbe\xbb" - "\x63\xfd\x88\xfd\x86\x7d\x86\x7d\x27\xe9\x37\x3e\x37\x07\xdc\x95" - "\xd6\xff\x71\xdc\xdc\xdf\x8a\x9b\x63\x2e\x0e\xb6\xab\xc2\x1c\xbd" - "\xbc\x08\x6c\x33\x0b\x78\x3a\x70\x74\x6b\x7e\x8e\xfd\xeb\x18\x3f" - "\xaf\xa9\xbc\x93\xdb\xa6\xbc\x3b\xe4\xe3\xdc\x76\x37\x0b\x3f\xbf" - "\x5a\x69\xcb\xcf\xaf\xd6\xf0\xf8\x79\x85\xde\xe5\x77\xb5\x90\x9b" - "\xdf\xf2\xb4\xe5\xe6\xd7\xfa\x4a\x72\xf3\xee\x22\xdc\xdc\xc7\xc2" - "\xcd\xaf\xbd\xa1\x8c\x9b\x5f\x8b\x94\xe2\xe6\x75\x6a\x3e\x37\xbf" - "\x76\x80\xe3\xe6\x49\x3c\x6e\x7e\xd9\x57\x9a\x9b\x5f\x66\xb8\x20" - "\xad\x4e\x0c\xc4\x75\x61\x4e\x85\xdf\x15\x6a\x99\x75\xf5\xd7\x63" - "\x31\xaf\xc2\xb9\x0c\x78\x7e\xe0\x56\xd7\x07\xf3\x39\x3a\x7e\x47" - "\x68\x8f\x47\x25\xce\x40\x0f\x61\x2e\x85\x79\x94\x85\xf7\xe2\xf2" - "\x98\x4f\xb5\x2e\x97\x32\x9c\x10\xe7\x52\x86\x73\x0c\x4f\x66\xd6" - "\x63\x5e\xdb\x8f\xc7\xc4\x96\xe5\xea\xd7\xf6\x8b\x73\xf5\xeb\xe3" - "\x09\xaf\xb9\x76\x10\xfb\x45\xc8\xd5\xe1\x1a\x51\xae\x7e\x7d\x15" - "\x7b\xcd\x7e\x21\x57\x27\x75\xc0\xf8\xbc\x55\x9a\xab\xdf\x08\x23" - "\xe3\xf5\x8d\xae\x64\xbc\x66\x7d\x6c\xc3\xd5\xaf\x5f\xe2\x73\x75" - "\xec\x7f\x5b\xae\x4e\x30\xc5\x3c\xa7\x24\x57\xbf\x31\xd0\x96\xab" - "\x5f\xf6\xc5\x5c\x5d\x1c\x57\xb5\x3e\x42\x5c\xdd\xdc\x57\x6f\xb6" - "\x70\xf6\xd5\xb8\xbe\x25\xd6\x9c\xfd\x2e\xc4\xda\x09\x8e\xb7\xe3" - "\x36\xdd\x1c\x2f\x8f\xb7\x33\xd7\xac\x92\xc7\xdb\x31\xfe\xc4\x78" - "\xfb\xcd\x93\xd6\xf8\x13\xf2\xf6\x9b\xd7\xc5\x79\x7b\x6d\x27\x21" - "\x6f\xc7\xf5\x8b\xf1\xf6\xda\xc1\x82\xfa\x6d\x78\x7b\xed\x18\x21" - "\x6f\x27\xe5\x38\xde\x5e\x5b\xcf\xe6\x41\x0e\xc9\xe7\xed\xb5\xa7" - "\xec\xf3\xf6\xda\x73\x42\xde\x5e\xbb\x97\xf0\xf3\x5b\x1e\xf5\x0c" - "\x6f\xaf\x2d\x61\xf9\x7f\x11\xff\x38\xc7\xdb\xc9\xf1\x7a\x3e\x6f" - "\x2f\xc2\xbc\xfd\x96\x5f\x33\xbc\x5d\xe7\x30\x6f\xa7\x10\xc7\xdb" - "\xe1\x6f\xfb\xbc\xfd\xd6\x49\xfb\xbc\xdd\xc4\xe3\xed\x4d\x2c\x6f" - "\x6f\x62\x79\x7b\xd3\x5a\x4b\xde\x1b\xf3\x76\xd3\x23\xf1\x5a\x36" - "\xef\x5d\xb2\x6b\x5e\x05\xb5\xdb\x92\xf7\x9e\x0d\x7c\xdc\x80\xdc" - "\x57\xcd\x46\x08\x73\x76\x3c\x37\xa4\xb4\x3e\x98\x9d\x1f\xd2\xd8" - "\x90\x87\x39\xfb\x45\x28\x53\x05\x9c\x1d\x78\xf7\x67\x8d\xc1\x14" - "\xb4\xa7\x52\x50\x76\xde\x9d\xb2\xa7\x2d\x65\x31\x57\x87\xf2\xa5" - "\x65\xc0\xdb\xf1\x35\xd0\xff\x4b\x4b\xf1\xbc\x93\x94\xa3\x4c\x59" - "\xa8\xa3\x82\xe3\xf8\xb7\xd7\x32\x1c\xdf\xc0\x72\x7c\xb8\x06\xb8" - "\x4b\xc9\x1d\x8e\xdf\x58\x41\x65\xdc\x10\x70\xfc\xc3\x75\x2b\x6e" - "\xef\xb7\xf0\xf6\x75\x2c\xb7\xcf\x30\x33\xdc\xfe\x04\x70\xfb\x4a" - "\xc2\xed\x6f\x9f\xb6\x94\x01\xcc\x9c\x66\xca\x5c\x64\xca\x94\x42" - "\x99\x0a\x52\xa6\x8e\xcf\xff\x0f\x13\xfe\xdf\x68\xc5\xff\xeb\x18" - "\xfe\x6f\xc9\xcb\x63\x0e\xc3\xcf\xcd\x9b\x7d\xc4\x72\xf3\x0d\x77" - "\xf8\xff\x3a\x3e\xff\xbf\x93\x9b\xaf\x93\xc5\xff\xe1\x9e\x25\x16" - "\x2e\xd9\x26\x3c\xf2\x86\x38\x8f\x6c\x6f\xfc\xdf\xbc\xa2\x7c\x84" - "\x35\xff\xc7\x9a\xc0\x92\x9b\x37\x0b\x72\xf3\xf5\x0a\xf9\x7f\xbd" - "\x80\xff\x63\x3f\x2a\xc8\xcd\x97\xb4\x89\x6e\x6b\x47\xb9\xf9\xd6" - "\xe7\xff\xf5\x95\xfc\xfc\x3c\xe6\xff\x5c\x7e\xbe\x51\x84\xff\x37" - "\xf2\xf9\xff\x61\xbd\x4b\x9d\x90\xff\x53\x2e\x22\xfc\xbf\x49\x21" - "\xff\x6f\x52\xc8\xff\x9b\x1c\xe4\xff\x4d\x12\xfc\xff\xd6\x09\x69" - "\xfe\x7f\xeb\x04\xae\xdb\x9c\xc1\xf1\x34\xfc\x1e\x54\x3b\x0f\xf3" - "\x34\x13\xe1\xff\x84\xb7\x01\x4f\x33\xdd\x25\xfc\xdf\x28\xc1\xc9" - "\x8c\x3c\xfe\xdf\xd4\x0a\xfc\xbf\x49\x82\xff\x9b\x58\xfe\xdf\x24" - "\xc2\xff\x9b\x24\xf8\xbf\x89\xe5\xff\x4d\x56\xfc\xbf\x89\xe5\xff" - "\x26\x3b\xfc\xdf\xcc\xf2\x7f\x33\xcb\xff\x89\x8f\x6d\xf9\xbf\xc9" - "\x01\xfe\xdf\xc4\xf2\xff\x26\x3b\xfc\xdf\x2c\xc2\xff\x6f\x9d\xc0" - "\xfc\x5f\x14\x57\x14\xf2\x11\xe2\x8a\xb6\xe2\xff\xe6\xbb\x88\xff" - "\x4b\x62\xcd\x8a\xff\xd3\x0a\xf8\x3f\x2d\x93\xff\x37\x49\xf0\x7f" - "\xfa\xa4\x35\xfe\x84\xfc\x9f\x16\xe7\xff\x14\xb2\xe2\xff\x4d\xe2" - "\xfc\x9f\x42\x83\x05\xf5\x5b\xf3\x7f\x0a\x59\xf1\xff\x26\x21\xff" - "\xa7\x10\xcb\xff\x6f\x2d\x90\xcd\xff\x29\x64\x9f\xff\x53\x48\xc8" - "\xff\x29\x44\xf8\x3f\xe5\x42\xf8\x3f\x85\x58\xfe\x7f\x2b\x99\x7f" - "\x9c\xe3\xff\xe4\xb8\x0d\xff\x5f\xed\xd2\x1c\xff\xf7\x30\x6e\xe9" - "\xaf\x6f\xf4\xeb\x6f\x68\xcc\x9a\xa6\x7e\xb2\xea\x61\xd3\x9d\xef" - "\x12\x44\x01\x1f\x38\x0d\xfc\x60\x2a\xa2\xf0\xda\xfe\x94\xe3\x30" - "\xee\x4f\x25\xf3\xfb\xf1\xd8\x8f\xe7\x9f\xec\x5c\x58\xe4\x06\x36" - "\x45\x4d\xde\xcf\x17\x19\x03\x86\x22\xcc\x01\x1a\xb6\xf4\x2f\xaa" - "\xcf\x1a\xab\x69\xc0\x73\xfb\xe3\x10\x35\xa5\x46\x9c\xd7\xbd\x7f" - "\x9a\x36\x03\xe6\xdd\xc3\x27\x11\x4e\x77\x2c\xe6\x02\x83\x63\xcc" - "\x0b\x3e\xbe\x0d\x5c\xa0\xb6\x92\xe1\x09\x1e\x51\x5a\x94\x97\x82" - "\xbc\x3d\x6b\x90\xda\xd3\xc5\xa5\xc3\xab\x6f\x20\x64\x02\x8e\x30" - "\xbc\x2f\x6d\x7e\xa2\x4a\x8b\xf7\xf2\xe9\x42\x78\xc2\x7e\x37\x23" - "\xcb\x13\x3e\xbc\x8d\x02\x36\xce\x03\x7e\x70\x8c\xf0\x03\xfc\x0d" - "\x83\x06\xc2\x0f\x1e\x6a\xac\xf3\x7f\xe4\xce\xdc\xfe\x3b\x6b\x36" - "\xb8\xb9\xfd\x4d\x99\x1c\x37\xc0\xbc\x80\x9e\xe2\x8f\x06\xd4\x93" - "\xb9\x16\x0b\xc7\x90\xb9\xfd\x01\x55\x88\xda\xf4\x16\x72\x2f\x8d" - "\x3a\x8f\xd7\xdc\x6b\x4a\xab\xb6\xa2\x05\x2f\xa3\x87\x8c\x98\x0b" - "\x2c\xa5\x0b\x4b\xab\xb2\x11\xde\xa7\x10\xb8\x62\x70\x2e\xcb\x07" - "\x46\x4e\x95\xe0\x03\x30\x06\x63\x4e\xc0\x8c\xbd\x14\x75\xb2\xd8" - "\xbf\x18\xc9\xe6\x79\x14\xc5\xc4\x4e\xc9\x75\xbe\x5b\xfa\x1b\x8c" - "\x7e\xfd\x8b\x4c\xde\xd3\xd4\x64\xdf\xca\x09\x3a\xf3\xa7\x09\x81" - "\x78\x3f\xc2\xbf\x9f\xaf\x76\xc1\x7b\x70\xe3\xef\x51\x9a\x77\x0c" - "\x45\x82\xf5\x18\x4d\xac\xcf\x9a\x88\xcf\x30\xbf\x9b\x5c\x83\xe8" - "\x29\x46\x0a\xc1\xb9\x2e\xcc\x7a\x8c\x7a\x3d\xe2\xbe\x4b\xa9\x41" - "\xf9\x66\xb2\xf7\xa3\xf9\xfd\x98\x4e\x66\xf0\x0b\xbd\x94\x42\x3b" - "\x6f\xd7\x33\x1c\x6e\x0d\xfe\x56\xe5\x12\x17\x4f\xcc\xe1\x00\xfb" - "\x9d\x37\x35\x82\x8f\xce\x11\x1f\xd1\x4b\xdd\x99\x7f\x8d\xef\xfb" - "\x6b\xa1\xee\x47\x9a\x9a\x80\xc3\xb1\xdf\xb5\xb4\xec\x83\xcb\xac" - "\xad\x69\xc4\x6b\x6b\x2a\x91\x31\x93\xec\x2d\x08\xb8\x70\xc1\x7b" - "\x72\xc0\x33\xf8\x32\x6b\x6a\x9a\xfc\x31\x8e\xd4\xf9\x17\xf1\x3a" - "\xa0\x9f\x19\xff\x98\x58\xbf\xe0\xef\x5b\x5a\xb8\x59\xd9\xb6\x93" - "\x64\x5d\xa5\x95\x2f\x9a\xb6\x12\x0e\xce\xac\x73\x59\xed\x12\x8c" - "\xe7\xc8\x5c\xa5\x5c\xe3\x8b\x93\x80\x13\x25\xc9\xf5\x8b\x6b\x5c" - "\xfb\xf0\x8b\xfa\x1e\xf3\x8b\xca\x97\xf8\xa5\x83\x9b\x32\xbf\x74" - "\x70\x6d\x1f\x7e\x71\xbf\xc7\xfc\xe2\xba\x97\xf8\xa5\xe3\x46\x65" - "\x7e\xe9\x28\xb9\xff\x03\xf6\x0b\xce\x55\x59\xf2\x54\x96\x1c\x15" - "\x1e\x4f\x19\xbd\x43\x79\x25\xde\x99\x93\x09\x7f\xf3\xe7\x64\xfe" - "\x70\x18\xe7\x6f\x56\xa3\xa3\xc3\xf0\xd8\xea\x3e\xcb\x6e\x6e\x8a" - "\xf2\xd8\x7f\x27\x37\x45\x3d\xd0\x83\xe1\xa8\x54\x67\x13\xc3\x51" - "\xa9\xce\xcc\xbc\xed\xc5\x67\x10\x65\x7c\x6c\xa0\x7a\x57\x42\x11" - "\x85\xd7\x2f\xed\xba\x5a\x4f\xad\xb9\x01\x9c\x93\x7a\x98\xc6\x39" - "\xa9\xb5\xb3\xf1\x5c\xcc\x5a\x04\x7c\xef\xe1\xcb\x54\xe7\xc1\x78" - "\x6f\xb4\x6f\xaf\x16\x31\xb9\x20\xfa\x91\x84\xc0\x1d\x3d\x0d\x2e" - "\x78\x1c\xdd\x95\x50\x4f\x59\xb0\x64\x59\xd7\x08\xf6\x34\xdc\xdc" - "\xda\x5f\x8f\xe7\x4d\x36\xfa\x8c\xd5\x98\x7c\xa6\xa9\x8d\x3b\x87" - "\x22\x31\x7c\x31\xeb\x25\x61\x0c\xc5\xeb\x1b\xdf\x4a\xe4\x70\x66" - "\x7e\x9f\xe0\xab\x0c\x38\x3b\xfe\xfe\x8f\x17\x8c\x9d\x74\x53\x4c" - "\xa7\x37\xb7\x83\xef\x59\x8c\xc1\xf8\x2d\x8d\xb1\x0d\x42\x8c\xdd" - "\x64\x31\x06\x58\xbb\x83\x31\xde\x7a\xc7\x44\x82\x31\xfd\x1d\x8c" - "\x31\x63\xe7\xfb\xfe\xbe\x18\x67\x16\x8c\xe1\x71\x93\x60\xec\xbc" - "\x24\xc6\x7e\x38\x2d\x8e\x31\x63\x1f\x3e\xc6\x3a\x8c\x24\x18\xeb" - "\xec\x52\x3c\x09\x30\x36\x49\x2e\xc6\x98\xa5\x71\x3c\xed\xac\xee" - "\x65\xa3\x9d\xa9\xce\xd3\xad\xb5\xb3\x45\x2b\xdf\xf4\x99\x80\x6e" - "\x82\x5e\xae\xb5\xe8\x65\xaa\xf3\x2a\x45\x7a\x99\xea\xbc\xd2\xa1" - "\xb9\x6c\x54\xe7\x4b\x47\x17\x21\x74\x14\xfa\x53\x79\x04\x99\xcb" - "\xf6\x77\xac\x97\x29\xf7\x24\x8c\x43\x51\xbd\xcc\x9e\xb3\x99\x83" - "\x44\x79\xac\xba\x33\x07\x89\xf2\x18\xdf\xb0\x5e\x7c\x2e\xdb\x17" - "\x29\xb9\x3c\xed\x92\x2b\x32\xdf\x28\xd7\x6a\xbe\x51\xae\x88\x6e" - "\xc9\x45\xf8\x5a\xbe\x6e\x39\x1a\x41\x74\xcb\xd1\x08\xac\x5b\x72" - "\x19\xbe\x77\x34\xc2\xa2\x5b\x72\xe1\x3c\xd1\x2d\x47\x23\x2e\xc2" - "\x0f\x74\x0b\xf5\x40\xfd\xd1\x08\x11\xdd\x42\x79\x30\x5a\x13\x6c" - "\x58\x2d\x3d\x97\x2d\x97\xa7\x8f\x73\x79\xfa\x38\x97\xd5\xc7\xb9" - "\x8c\x3e\x26\xf7\x0c\x60\x9e\x0d\xdf\x13\xd7\xc9\xbf\x27\xa7\x1f" - "\x3c\xe6\x32\xfa\x81\xea\x5c\x83\xfd\x20\xd0\xc7\xf8\x9a\x64\x11" - "\x7d\x4c\x79\x6c\x67\xaf\xa9\xb6\xe8\xe3\x46\x52\x9e\xa9\x03\x62" - "\x4d\xb1\xa4\x3e\xa6\x3c\xa7\x92\xd8\xe3\x49\xe6\x83\xb3\x3e\xb5" - "\xd1\xc7\x94\x27\x5f\xff\x88\xcf\x65\x63\x31\xc4\x3c\x67\xa2\x84" - "\x3e\xa6\x3c\xc7\xd8\xe8\x63\xca\x3d\x51\x74\x2e\x1b\xe5\xd5\x97" - "\xc3\x51\x97\x23\x82\xb9\x6c\x94\xe7\x06\xbe\x2e\xc6\x18\xbb\xbb" - "\xb0\xf5\x40\xbd\x60\x2e\x1b\xd5\x25\x56\x5c\x13\xe7\xf2\x34\x71" - "\x2e\xa3\x89\x8f\x46\xb0\x73\xd9\xa8\x2e\x1b\x71\xdd\xb6\x9a\x38" - "\xf7\x4e\x79\x8b\x26\xc6\xd7\x10\xcc\x89\x68\x62\xaa\xcb\x25\x6b" - "\xcc\x09\x34\x31\xe5\xe5\x66\xd1\xc4\x8d\x6f\xf2\x35\xb1\x57\x2f" - "\x81\x26\x66\xea\x17\xd3\xc4\x5e\x2f\x0b\xea\xb7\xd1\xc4\x5e\xd3" - "\x2d\x9a\x18\xd7\x6f\xc1\x2d\xa7\x89\xd5\xee\x24\x86\xba\xf7\x90" - "\xaf\x89\xbd\x98\xbc\xce\xce\x8f\xc9\x3b\x27\xa1\x1e\xf6\xba\x2e" - "\xd4\xc3\x5e\x87\x89\xee\x55\xfb\x32\xf3\xd8\x28\xaf\x4a\x72\xdc" - "\x5d\xc3\x3f\x7e\x47\x0f\xb3\xc7\xf1\x3c\x36\x66\xfe\xda\x6a\x75" - "\x80\x3c\x1d\xfc\x60\x3b\xd4\xc1\x1a\x3b\x3a\x58\x73\x8f\xe9\xe0" - "\xae\x67\x94\xe9\xe0\xae\xa7\xdb\x07\xaf\xbf\xd7\xf4\x96\x5a\x47" - "\x38\xd7\x9f\xe6\x2a\xe3\xf5\x7f\x4a\x6a\x1f\x7e\xb9\xd7\xf4\x56" - "\x37\x3f\xe2\x17\x1f\x4f\x65\x7e\xf1\xf1\x50\xae\xb7\x7c\xf5\x9c" - "\xde\xf2\xd5\x4b\xeb\x2d\x9f\x73\xf6\xf5\x56\x4f\x7f\x4e\x6f\x69" - "\x56\x11\xce\xa3\x89\x27\x9c\x47\xd3\x4f\xbe\xde\x7a\x70\xeb\x7d" - "\xbd\xd5\x92\x7a\xeb\x4f\x07\x09\xc6\x1e\x9c\xa5\x4c\x6f\x3d\x98" - "\x28\xd4\x5b\xbd\xd6\xda\xea\xad\x07\x4f\x3a\xae\xb7\x1e\x6c\x50" - "\xa6\xb7\x1e\xac\x77\x4c\x6f\x69\xde\x10\xd7\x5b\x3e\x55\xd2\x7a" - "\x8b\x9c\xb3\xe5\xc9\x3d\x1a\x38\x9e\xdc\xa3\xb8\xfd\xeb\xad\x1e" - "\x31\xe2\x9c\xb8\xc7\x2c\xa2\xb7\x34\x91\x2d\xaf\xb7\x34\x91\xe2" - "\x7a\xab\xc7\x05\xc2\x4d\x35\x93\x6c\xf5\x16\x5c\x23\xaa\xb7\x7a" - "\xf6\x60\xaf\x89\x14\xea\x2d\x52\x07\xc4\x9a\xc1\xd2\x7a\xab\xe7" - "\x71\x12\x7b\x7a\x6e\x26\xb1\x87\xf8\xd4\x56\x6f\xf5\x5c\xd0\xbc" - "\xde\x22\x18\x62\x9e\x53\x52\x6f\xf5\x3c\x64\xab\xb7\x7c\xf4\xe2" - "\x7a\xcb\x77\x03\x87\x23\xdf\x21\x42\xbd\xf5\xe7\x4e\x77\x87\xde" - "\x92\xc4\x56\x8c\x50\x6f\xfd\xf9\x94\x7c\xbd\xe5\xeb\x29\x4f\x6f" - "\x61\xcc\x89\xe9\x2d\xdf\x37\xac\x31\x27\xd4\x5b\xbe\x73\xc5\xf5" - "\x96\xef\x5a\xa1\xde\xc2\xf5\x8b\xe9\x2d\xdf\x03\x82\xfa\x6d\xf4" - "\x96\xef\x49\xa1\xde\x22\xe5\x38\xbd\xd5\x2b\x99\xc4\x50\x9f\x55" - "\xf2\xf5\x56\xaf\x37\xa4\xf5\x56\xaf\xa9\x42\xbd\xd5\x2b\x88\xe8" - "\xaa\x5e\x6b\x88\xde\xea\x35\x82\x1c\xf7\x59\xc9\x3f\xce\xe9\x2d" - "\x72\x9c\xd3\x5b\xbd\xf2\xe4\xe9\x2d\xaf\x76\xa8\xb7\xd4\x76\xf4" - "\x96\xfa\x1e\xd3\x5b\x0f\x8f\x52\xa6\xb7\x1e\x1e\x79\x9f\xd7\xb7" - "\x06\xaf\xef\x55\x48\x38\x97\xf6\x82\x32\x5e\xaf\xad\x52\xce\xeb" - "\xfd\xf7\x73\xbc\xde\x7f\xbf\x34\xaf\xef\x6d\x7f\xff\x37\xea\x31" - "\xc4\xf1\x7a\x3f\x36\x97\xe9\x37\x9c\x8c\xad\x7e\x6e\xf2\x79\xfd" - "\xa3\x8b\xef\xf3\xfa\x96\xe4\xf5\x0f\x67\x11\x8c\x3d\xfa\xb2\x32" - "\x5e\xff\xe8\x08\x21\xaf\xef\x3b\xdd\x96\xd7\x3f\xba\xd3\x71\x5e" - "\xff\xe8\x71\x65\xbc\xfe\xd1\x0a\xc7\x78\xbd\xdf\x40\x71\x5e\xdf" - "\xfb\xa0\x34\xaf\x27\xe7\x6c\xf9\x58\x9f\xe3\x1c\x1f\xeb\xb3\xb1" - "\xfd\xf3\xfa\x3e\x3a\x71\xee\xd5\xe7\x65\xc2\xeb\xfd\x02\x5b\x9e" - "\xd7\xfb\x05\x8a\xf3\xfa\x3e\xdf\x10\x0e\xe4\x17\x64\xcb\xeb\xe1" - "\x1a\x51\x5e\xdf\xe7\x3a\x7b\x4d\xa0\x90\xd7\x93\x3a\x20\xd6\x78" - "\x4a\xf3\xfa\xc7\xb6\x93\xd8\xf3\xd8\x02\x12\x7b\x88\x4f\x6d\x79" - "\xfd\x63\x63\x9a\xe7\xf5\x04\x43\xcc\x73\x4a\xf2\xfa\xc7\x36\xd8" - "\xf2\xfa\xde\xe2\xfb\x69\x51\xfe\xb3\x38\x1c\xf9\x77\x15\xf2\xfa" - "\xc7\xce\xdd\x1d\xbc\x5e\x12\x5b\x3a\x21\xaf\x7f\x7c\x8f\x7c\x5e" - "\xff\xf8\x05\x79\xbc\x1e\x63\x4e\x8c\xd7\xfb\x0f\xb4\xc6\x9c\x90" - "\xd7\xfb\x8f\x12\xe7\xf5\xfe\xd3\x85\xbc\x1e\xd7\x2f\xc6\xeb\xfd" - "\x33\x05\xf5\xdb\xf0\x7a\xff\x9d\x42\x5e\x4f\xca\x71\xbc\xbe\x6f" - "\x04\x89\xa1\xbd\xe5\xef\xa7\x45\xf5\x1d\x28\xcd\xeb\xfb\x0e\x11" - "\xf2\xfa\xbe\x1e\x84\xbf\xf7\x8d\x26\xbc\xbe\xaf\x96\x1c\xef\x1d" - "\xc5\x3f\xce\xf1\x7a\x72\x9c\xe3\xf5\x7d\x93\xe4\xf1\xfa\x8e\xed" - "\x90\xd7\xbb\xdb\xe1\xf5\xee\xf7\x18\xaf\x7f\xb2\x8f\x32\x5e\xff" - "\xa4\x9f\x72\xfe\x38\xa8\x9e\xe3\x8f\x83\xea\xa5\xf9\xe3\x93\x0d" - "\xf6\xf9\x63\xa0\x8e\xe3\x8f\xfd\x37\x93\x18\xde\x7f\x39\x89\xe1" - "\xfd\x87\xcb\xe7\x8f\xfd\xbe\xb9\xcf\x1f\x5b\x92\x3f\xf6\x5d\x49" - "\xf8\x63\xbf\x55\xca\xf8\x63\xbf\x95\x42\xfe\xf8\xd4\x56\x5b\xfe" - "\xd8\xef\x8a\xe3\xfc\xb1\x7f\x57\x65\xfc\xb1\xbf\xda\x31\xfe\xd8" - "\x7f\x96\x38\x7f\x7c\xd2\x28\xcd\x1f\xc9\x39\xdb\x71\x3f\xb0\x2b" - "\x37\xee\x0f\x38\xd3\xfe\xf9\xe3\x80\x34\xf1\x31\x7e\xc0\x2a\xc2" - "\x1f\xfb\x27\xb6\x3c\x7f\xec\x9f\x28\xce\x1f\x07\x98\xc8\x58\xdb" - "\x3f\xc9\x96\x3f\xc2\x35\xa2\xfc\x31\x90\x1d\xff\xfb\x27\x0a\xf9" - "\x23\xa9\x03\x62\xcd\x28\x69\xfe\x18\x48\xd6\xa7\x52\x81\x07\x48" - "\xec\x21\x3e\xb5\xe5\x8f\x81\x99\xcd\xf3\x47\x82\x21\xe6\x39\x25" - "\xf9\x63\xe0\x29\x5b\xfe\xf8\x64\xbd\x38\x7f\x1c\xb4\x87\xc3\xd1" - "\xa0\x31\x42\xfe\x38\xb0\xf7\xdd\xc1\x1f\x25\xb1\x95\x26\xe4\x8f" - "\x03\xaf\xcb\xe7\x8f\x83\xfa\xc8\xe3\x8f\x18\x73\x62\xfc\x71\xd0" - "\x2c\x6b\xcc\x09\xf9\xe3\xa0\xb5\xe2\xfc\x71\xd0\x56\x21\x7f\xc4" - "\xf5\x8b\xf1\xc7\x41\xc7\x05\xf5\xdb\xf0\xc7\x41\x57\x84\xfc\x91" - "\x94\xe3\xf8\xe3\x53\x19\x24\x86\x3e\xb9\x59\x3e\x7f\x7c\x6a\x96" - "\x34\x7f\x7c\x6a\x81\x90\x3f\x3e\x35\x92\xf0\xc4\xa7\xb6\x10\xfe" - "\xf8\x54\x14\x39\xfe\x64\x01\xff\x38\xc7\x1f\xc9\x71\x8e\x3f\x3e" - "\xb5\xb7\x39\xfe\x68\x9f\x5b\x3c\xcb\x7d\x9b\x00\xfe\xe6\x73\x8b" - "\x23\x02\x6e\x11\x34\xde\x3e\xb7\x08\xe6\xbe\x4d\x40\xfd\x85\x7c" - "\x9b\x80\x7a\x9a\x7c\x9b\x80\x7a\x9a\xf9\x36\xc1\xe2\x51\xc0\x01" - "\x80\x5b\xec\xbc\x5c\x48\xb8\xc5\xe5\x7a\xea\xc3\xab\x2c\xb7\xa8" - "\x41\xee\x6b\x12\x58\x6e\xf1\x16\xe6\x16\x4f\xf7\xc3\xdc\xc2\x23" - "\x0f\xf8\x6d\x15\xcb\x77\x13\x81\xef\x56\xc1\xff\xa1\xef\x7c\x0b" - "\x75\x94\x01\x27\xcd\xc0\xd7\xe3\xef\x63\x40\x5d\xcc\x3a\x59\x66" - "\x0d\xad\xde\x4d\x3b\x8d\xac\xbf\xc5\xdf\x37\x91\xfa\xb6\x89\xe5" - "\xbb\x26\x8b\xaa\x68\x33\xfe\x8e\x49\x78\x34\xef\xfb\x26\xf8\xbb" - "\xa5\x86\x6a\x84\xbf\x71\x92\x37\x1b\x79\x7f\x82\xb9\x46\x35\x52" - "\x77\x59\xe2\xd2\x05\x7f\xdf\xa4\x4b\x2d\xe1\xb4\x3b\xcd\x25\x84" - "\xd3\xce\xd1\x74\x06\x9e\x14\x90\x7f\x83\xe3\x18\x1f\x61\x7e\x31" - "\xc7\x5f\x5b\x3b\xc7\xff\xa1\x9b\x37\x81\xd3\x1a\xac\xbf\x7f\x71" - "\x60\x3f\xfe\xce\x02\xfe\xce\xa4\x91\xe5\xb4\xf4\x3b\xfe\x68\xd3" - "\x0c\xe0\x3d\x35\xc8\xa5\x3f\xfe\xf6\xc5\x31\xa4\x7e\xdc\x17\xe2" - "\xfe\x4d\x7f\x5f\xfe\x5e\x96\x38\x2f\x6a\xbe\xe9\x8f\x4a\xa3\x7e" - "\x66\xd6\xcc\x1a\x2d\x6b\x66\x6f\xa0\x60\xc3\x1c\x7f\xea\xe3\xd9" - "\x3c\x4e\xeb\x83\x39\xed\x33\x76\x38\xed\xe0\x06\x65\x9c\x76\x70" - "\xbd\x90\x6f\x84\xf8\xd8\xf2\x8d\xa7\x27\x3b\xce\x37\x9e\x56\xb6" - "\xff\x3b\xf5\x74\x9a\x63\x7c\xe3\xe9\x73\xd6\x7c\x63\x3b\xc3\x37" - "\x82\x22\x31\x36\xc5\xf9\x06\x39\x67\x3b\x4e\x04\x73\xfb\xbf\x53" - "\xc1\xa3\xda\x3f\xdf\xf8\x8b\x41\x7c\x4c\xf8\x0b\xd9\xff\x9d\x7a" - "\xda\xce\xfe\xef\x4a\xf9\xc6\xd3\x7a\x71\xbe\x11\x4c\xf6\x7f\xa7" - "\x9e\xae\xb2\xe5\x1b\x70\x8d\x28\xdf\x08\xde\xcc\x5e\xa3\x17\xf2" - "\x0d\x52\x07\xc4\x1f\xe9\xfd\xdf\xa9\x21\x64\xff\x77\x6a\x08\xd9" - "\xff\x9d\xf5\xa9\x2d\xdf\x18\xd2\xfc\xfe\xef\x2c\x86\x98\xe7\x94" - "\xe4\x1b\x43\x6c\xf7\x7f\xa7\x82\xc6\x89\xf3\x8d\x67\xb9\xfd\xdf" - "\xa9\x67\x84\xfb\xbf\x53\x43\x32\xef\x0e\xbe\x21\x89\x2d\xe1\xfe" - "\xef\xd4\x33\x12\xfb\xbf\xdb\xe3\x1b\xcf\x64\xcb\xe3\x1b\x18\x73" - "\x62\x7c\xe3\x99\x73\xd6\x98\x13\xf2\x8d\x67\x4c\xe2\x7c\xe3\x59" - "\xe1\xfe\xef\x4c\xfd\x62\x7c\xe3\xd9\x30\x41\xfd\x36\x7c\xe3\xd9" - "\xc9\x42\xbe\x41\xca\x71\x7c\x23\x04\xb1\x9a\xcd\x24\x9f\x6f\x3c" - "\x7b\x4e\x9a\x6f\x3c\x7b\x49\xc8\x37\x9e\x3d\x48\x78\x45\x88\x37" - "\xe1\x1b\xcf\x56\xb0\x3c\xc4\xc8\x3f\xce\xf1\x0d\x72\x9c\xe3\x1b" - "\x21\xf7\xd7\xbf\xde\x55\xf9\xaa\xe7\x14\xae\x7f\x7d\xee\xfe\xfa" - "\xd7\x56\x79\x0f\x1d\xc2\xae\x7f\x0d\x55\xb8\xfe\x35\xf4\xfe\xfa" - "\xd7\x56\xf1\xcb\xf3\xec\xfa\xd7\x30\x85\xeb\x5f\xc3\xee\xaf\x7f" - "\x6d\x15\xbf\x84\xb2\xeb\x5f\x87\x2a\x5c\xff\x3a\xd4\x89\xf5\xaf" - "\xaf\xac\xe1\xb4\xf1\x2b\x6b\xa4\xb5\xf1\x0b\xcd\xac\x7f\x7d\xe9" - "\x04\xa7\x8d\x5f\x1c\x4c\xb8\xe8\x8b\x3d\x08\x17\x1d\xce\xe4\xa6" - "\x52\xb0\x36\xfe\x34\x5e\xbb\x7b\xf6\x7e\x0a\xef\xd1\x86\xbf\x19" - "\xb9\x76\x21\x72\x35\x62\x6d\x0c\x3e\x58\xcb\x7c\x8b\xe4\x30\x4a" - "\x7c\x17\x6b\xe3\xe1\x63\xca\xaa\x78\xdf\x21\xa1\x5e\x38\xc4\xed" - "\x8b\x7c\x18\xe1\x73\xdf\xde\xd8\x4f\x65\x34\x5a\xe5\xe4\x67\xd7" - "\x53\xda\x04\x61\x4e\xde\x94\x3d\x4d\x8d\x73\xf2\x0d\xec\x77\x45" - "\x98\xbc\x7c\x3f\xfb\x39\xf9\x8d\x8d\x30\x76\x8a\xe4\xe5\x71\x4e" - "\x1e\xc6\xc8\x7b\x2c\x27\x1f\xc6\xae\x8d\x1d\xde\x4b\x59\x4e\x7e" - "\xb8\xaf\x50\x23\xbf\x3a\xc4\x56\x23\x0f\x5f\xe2\xb8\x46\x1e\xbe" - "\x55\x99\x46\x1e\xbe\xc5\x31\x8d\xfc\xa2\x9b\xb8\x46\x7e\x21\x29" - "\x45\x52\x23\x93\x73\xb6\xda\xe6\xa5\xad\x9c\xb6\x79\x69\x56\xfb" - "\xd7\xc8\x2f\x79\x8b\xeb\x98\x97\x7a\x11\x8d\xfc\xa2\x6b\xcb\x6b" - "\xe4\x17\x5d\xc5\x35\xf2\x4b\xec\xfb\xef\x17\xdd\x6d\x35\x32\x5c" - "\x23\xaa\x91\x5f\x2a\x66\xaf\x71\x15\x6a\x64\x52\x07\xc4\xa1\x73" - "\xd2\x1a\x79\xc4\x62\x12\x97\x46\x8c\x22\x71\x89\xf8\xd4\x56\x23" - "\x8f\xe8\xd3\xbc\x46\x26\x18\x62\x9e\x53\x52\x23\x8f\x88\xb7\xd5" - "\xc8\x2f\x48\xac\x8d\x7d\x65\x38\x87\xa3\x97\x2f\x08\x35\xf2\x88" - "\x7d\x77\x87\x46\x96\xc4\x96\xb7\x50\x23\xbf\xbc\x5c\xbe\x46\x7e" - "\xf9\x80\x3c\x8d\x8c\x31\x27\xa6\x91\x5f\x71\xb3\xc6\x9c\x50\x23" - "\xbf\xd2\x5b\x5c\x23\xbf\x32\x44\xa8\x91\x71\xfd\x62\x1a\xf9\x95" - "\xe9\x82\xfa\x6d\x34\xf2\x2b\x4b\x84\x1a\x99\x94\xe3\x34\xf2\xab" - "\x7e\xec\x78\xa7\x60\x6d\xec\xab\x6e\xd2\x1a\xf9\x55\x4f\xa1\x46" - "\x7e\x45\x4f\xb4\xf0\xab\xc1\x44\x23\xbf\x52\x4b\x8e\xbf\xa0\xe1" - "\x1f\xe7\x34\xf2\x0b\x56\x6b\x63\x5f\x1d\x71\x7f\x6d\xec\xdd\xa4" - "\x91\x47\x2a\xcc\x7f\x8f\xac\x6f\x1f\x9c\xff\x5e\xd3\x62\xaf\x4e" - "\x22\x9c\x6b\x74\xa6\x32\xce\x3f\x3a\xa3\x7d\xf8\xe5\x5e\xd3\x62" - "\xa3\xd8\x35\xcb\x11\x7d\x95\xf9\x25\xc2\x5f\xb9\x16\x8b\xd4\x70" - "\x5a\x2c\x52\x23\xad\xc5\x22\x4c\xf6\xb5\xd8\xf8\x28\x4e\x8b\xbd" - "\x76\x88\x70\x9e\xd7\xb6\x12\xce\xf3\xda\x74\xf9\x5a\x6c\xec\x19" - "\xa1\x16\x1b\x33\xea\xbe\x16\x6b\x2d\x2d\x36\xba\x92\xe0\x6f\xec" - "\x76\x65\x5a\x6c\xec\x36\xa1\x16\x8b\x2c\xb6\xd5\x62\xaf\x79\x3a" - "\xae\xc5\x5e\x1b\xa8\x4c\x8b\xbd\x16\xe8\x98\x16\x7b\x2d\x53\x5c" - "\x8b\x8d\x41\xd2\x5a\x8c\x9c\xb3\xe5\xd0\xe3\x07\x72\x1c\x7a\x9c" - "\xa9\xfd\x6b\xb1\x71\x05\xe2\x7c\x79\xdc\x76\xa2\xc5\x5e\xcb\x68" - "\x79\x2d\xf6\x5a\x86\xb8\x16\x1b\x4f\xbe\x7f\x46\xbd\x96\x65\xab" - "\xc5\xe0\x1a\x51\x2d\x36\x7e\x0c\x7b\x4d\x86\x50\x8b\x91\x3a\x20" - "\x0e\xc5\x4b\x6b\xb1\xd7\x3b\x91\xb8\x34\xfe\x14\x89\x4b\xc4\xa7" - "\xb6\x5a\x6c\xfc\x9e\xe6\xb5\x18\xc1\x10\xf3\x9c\x92\x5a\x6c\x7c" - "\x83\xad\x16\x8b\x30\x8a\x6b\xb1\x09\xbc\x75\x1a\x13\x66\x09\xb5" - "\xd8\xeb\x61\x77\x87\x16\x93\xc4\x56\x81\x50\x8b\x4d\xe8\x2a\x5f" - "\x8b\x4d\x18\x2e\x4f\x8b\x61\xcc\x89\x69\xb1\x09\x99\xd6\x98\x13" - "\x6a\xb1\x09\x3b\xc5\xb5\xd8\x84\x62\xa1\x16\xc3\xf5\x8b\x69\xb1" - "\x09\xd7\x05\xf5\xdb\x68\xb1\x48\x4f\xa1\x16\x23\xe5\x38\x2d\x16" - "\x59\x48\x62\x68\xc4\x56\xf9\x5a\x2c\x32\x53\x5a\x8b\x45\x6e\x10" - "\x6a\xb1\xc8\x38\xa2\xb9\x22\x0f\x13\x2d\x16\x99\x46\x8e\x47\x6c" - "\xe1\x1f\xe7\xb4\x18\x39\xce\x69\xb1\xc8\x13\xf7\xd7\xcd\xde\x4d" - "\x5a\x6c\xe2\x72\x65\x5a\x6c\xe2\xb2\xfb\x9c\xbf\x35\x38\x7f\x64" - "\x35\xe1\x5c\x93\x7a\x29\xe3\xfc\x93\x7c\x95\x73\xfe\x68\x0f\x8e" - "\xf3\x47\x7b\x48\x73\xfe\x49\xd7\xed\x73\xfe\xa9\xe3\x38\xce\x3f" - "\x65\x1f\x19\x5b\xa7\x6c\x20\x63\xeb\x94\x37\xe4\x73\xfe\xb7\x8e" - "\x0b\x39\xff\xe4\xb0\xfb\x9c\xbf\xb5\x38\xff\xc4\x52\x82\xbf\xb7" - "\x36\x2a\xe3\xfc\x6f\xe5\x09\x39\x7f\xf4\x01\x5b\xce\x3f\xc5\xc5" - "\x71\xce\x3f\xa5\x8f\x32\xce\x3f\xc5\xcf\x31\xce\x3f\x65\xb9\x38" - "\xe7\x9f\x54\x2b\xcd\xf9\xc9\x39\x5b\xae\x36\xb5\x0f\xc7\xd5\xa2" - "\xae\xb7\x7f\xce\x1f\x95\x25\xce\xcb\xa2\x36\x12\xce\x3f\x65\x59" - "\xcb\x73\xfe\x29\xcb\xc4\x39\xff\xd4\xae\x84\x1f\x4d\x59\x69\xcb" - "\xf9\xe1\x1a\x51\xce\x3f\x75\x38\x7b\xcd\x32\x21\xe7\x27\x75\x40" - "\x1c\x9a\x2a\xcd\xf9\xa7\x9a\x48\x5c\x9a\x4a\xbe\xd9\xc5\xfa\xd4" - "\x96\xf3\x4f\xdd\xda\x3c\xe7\x27\x18\x62\x9e\x53\x92\xf3\x4f\xbd" - "\x62\xcb\xf9\x27\x19\xc4\x39\xff\xdb\xc5\x1c\x8e\xde\x9e\x2e\xe4" - "\xfc\xd3\x06\xdf\x1d\x9c\x5f\x12\x5b\x59\x42\xce\xff\xb6\x9b\x7c" - "\xce\xff\xf6\x10\x79\x9c\x1f\x63\x4e\x8c\xf3\xbf\xbd\xdc\x1a\x73" - "\x42\xce\xff\xf6\x66\x71\xce\xff\xf6\x01\x21\xe7\xc7\xf5\x8b\x71" - "\xfe\xb7\x2f\x08\xea\xb7\xe1\xfc\xd1\x2e\x42\xce\x4f\xca\x71\x9c" - "\x3f\x7a\x0b\x89\xa1\x93\x36\xc8\xe7\xfc\xd1\xcb\xa5\x39\x7f\xf4" - "\x5a\x21\xe7\x8f\x66\xd7\xce\x46\xef\x27\x9c\x3f\x3a\x89\x1c\x9f" - "\x94\xcb\x3f\xce\x71\x7e\x72\x9c\xe3\xfc\xd1\x25\xf7\xd7\xd4\xde" - "\x4d\x9c\x7f\xc6\x02\x65\x9c\x7f\x46\xb2\x72\x6e\x99\xc0\x5b\xf7" - "\x92\x60\x67\xdd\xcb\x3b\xa3\xec\x73\xcb\xf7\x78\xeb\x5e\xde\x65" - "\xd7\xbd\xc4\xb2\xeb\x5e\x62\xf7\xc9\xe7\x96\xb1\xfd\x84\xdc\xf2" - "\x9d\x8d\xf7\xb9\x65\x6b\x71\xcb\xe8\xd3\x84\x5b\xc6\x34\x28\xe3" - "\x96\x31\x56\xeb\x5f\x66\x8a\xac\x7f\x89\x95\xb1\xfe\x25\x56\xe1" - "\xfa\x97\x58\x07\xd7\xbf\xc4\x4a\xac\x7f\x79\x27\x42\x9a\x5b\x92" - "\x73\xb6\x9c\xe0\x3d\xde\xfa\x97\xf7\xee\x82\xf5\x2f\xef\x4a\xac" - "\x51\x78\x97\x5d\xff\x12\xdb\x0a\xeb\x5f\x62\x25\xd6\xbf\xbc\xc7" - "\xae\x7f\x89\x15\x59\xff\x12\x2b\xb1\xfe\xe5\x3d\x76\xfd\x4b\xac" - "\xd5\xfa\x97\x58\x76\xfd\xcb\x7b\x76\xd6\xbf\xc4\xb1\xeb\x5f\xe2" - "\xd8\xf5\x2f\xc4\xa7\xb6\xdc\x32\xce\x81\xf5\x2f\xb1\xec\xfa\x97" - "\x58\x3b\xeb\x5f\xe2\x44\xd6\xbf\xbc\x33\x52\x9c\x5b\x26\xf0\xd6" - "\xbf\xc4\x5b\xad\x7f\x89\xbb\x4b\xd6\xbf\x48\x62\xcb\x6a\xfd\x4b" - "\xbc\x82\xf5\x2f\xf1\x32\xd7\xbf\xc4\x4a\xac\x7f\x89\x3f\x67\x8d" - "\x39\x21\xb7\x8c\x97\x58\xff\x92\x60\xb5\xfe\x25\x56\x62\xfd\x4b" - "\x42\x98\xa0\x7e\x1b\x6e\x99\x60\xb5\xfe\x25\xd6\x6a\xfd\xcb\x4c" - "\x76\xfd\xcb\x8c\x5b\xf2\xb9\x65\x82\x9d\xf5\x2f\x09\x56\xeb\x5f" - "\x12\xd8\xf5\x2f\x33\xd9\xf5\x2f\x09\xec\xfa\x97\x19\xb5\xfc\xe3" - "\x1c\xb7\x24\xc7\x39\x6e\x39\xb3\xd9\xf5\x2f\xf6\x79\xc7\xbc\x5a" - "\x8e\x77\xcc\xab\x95\xe6\x1d\x33\x8b\xed\xf3\x8e\xa4\x10\x8e\x77" - "\xcc\xde\x48\xfa\xf7\xec\x25\xa4\x7f\xcf\x66\xde\xc3\x2c\x3e\x06" - "\xbc\xe3\x91\x78\xed\xae\xab\x85\x0c\xef\xd8\x9d\x50\x4f\x01\x47" - "\x74\x35\x63\xde\x01\x5c\x70\xcd\x3c\xcc\x3b\xaa\xd8\xf5\xb6\xb3" - "\x0e\x1c\x4b\xe6\xf3\x8e\xc4\x1e\xcc\xda\x5b\xcc\x3d\x6a\xeb\x99" - "\x72\xf8\xbc\xd8\x5a\xdc\x6f\x12\xd8\xb5\xb8\x50\x37\x7f\x0d\x2e" - "\xb3\x2e\xf7\x2a\xf0\x92\x69\xe0\x0f\x1e\x2f\xb9\xbf\x16\xd7\xde" - "\x5a\xdc\x59\x0a\xf3\xdf\xb3\x96\x09\xb9\xc8\xfc\xcd\xb6\x5c\x64" - "\xd6\x25\xc7\xb9\xc8\x6c\x4f\x65\x5c\x64\xb6\x87\x63\x5c\x64\x76" - "\xbc\x38\x17\x99\x59\x82\x71\x2b\xce\x45\xc8\x39\xdb\x31\x24\xc9" - "\x93\x1b\x43\xe6\x9c\x6a\xff\x5c\x64\xce\x22\xf1\xf1\x62\xce\x72" - "\xc2\x45\x66\xc7\xb5\x3c\x17\x99\x1d\x27\xce\x45\xe6\x34\x90\xb8" - "\x3d\x3b\xd1\x96\x8b\xc0\x35\xa2\x5c\x24\xa9\x1f\x7b\x4d\x9c\x90" - "\x8b\x90\x3a\x20\x36\xbd\x2c\xcd\x45\x92\x2e\x90\x58\x95\xb4\x8f" - "\xc4\x2a\xe2\x53\x5b\x2e\x92\xb4\xb6\x79\x2e\x42\x30\xc4\x3c\xa7" - "\x24\x17\x49\x3a\x69\xcb\x45\x66\x1e\x16\xe7\x22\xf3\x76\x72\x38" - "\x9a\x37\x4a\xc8\x45\xe6\xf6\xba\x3b\xb8\x88\x24\xb6\x16\x09\xb9" - "\xc8\xdc\x2b\xf2\xb9\xc8\xbc\xde\xf2\xb8\x08\xc6\x9c\x18\x17\x99" - "\x17\x6f\x8d\x39\x21\x17\x99\xb7\x4a\x9c\x8b\xcc\xdb\x2c\xe4\x22" - "\xb8\x7e\x31\x2e\x32\xef\x98\xa0\x7e\x1b\x2e\x32\xef\x92\x90\x8b" - "\x90\x72\x1c\x17\x99\xbf\x86\xd5\x73\xf1\xf2\xb9\xc8\xfc\x78\x69" - "\x2e\x32\x7f\xae\x90\x8b\xcc\x1f\x41\x38\xc7\xfc\x02\xc2\x45\xe6" - "\x4f\x22\xc7\x67\xc6\xf1\x8f\x73\x5c\x84\x1c\xe7\xb8\xc8\xfc\x42" - "\x19\x79\x2e\x6f\x39\x6b\x71\x77\xde\x16\xe6\xb9\x2c\x39\x2e\x63" - "\xc0\x50\xd7\x3b\x79\x2e\xfe\x7b\x52\x91\x3c\x17\x1e\xd3\xb9\x3c" - "\xd7\x19\x26\x56\x71\x79\x2e\x3d\x93\xe7\xc2\x39\x2e\xfc\xae\xd4" - "\x92\xe3\x32\xcf\xb7\x5d\x87\xbb\xd3\x2c\x3f\xc7\xc5\xbd\x2f\xfd" - "\x36\x90\xe4\xb8\x2a\xef\xe4\xb8\xf0\x78\x6e\xaa\xb3\xcd\x71\xe1" - "\x71\x9c\xcb\x71\xfd\xdc\xc2\x39\xae\x05\x93\x95\x8d\xeb\x0b\x26" - "\xb5\x8f\xf7\xda\xf7\xda\x3a\xdc\xf9\x87\x49\xee\x67\xe1\x2d\x65" - "\xef\xb5\x17\xd6\xb6\x0f\xbf\xdc\x6b\x73\xbf\x17\x6c\x21\x7e\x59" - "\xb4\x56\x99\x5f\x16\xad\x69\x1f\x7e\xb9\xd7\xe6\x81\xbc\x1f\x42" - "\xfc\x92\xd2\x47\x99\x5f\x52\x9c\xd8\xff\x72\x45\x30\xa7\x99\x57" - "\x04\xf3\x35\x73\xc9\x30\xbe\x66\x4e\x69\x66\xff\xcb\x0f\xd2\x38" - "\xcd\xbc\xe4\x1c\xe1\xa1\x4b\x8a\x09\x0f\x5d\xc2\xbc\x9f\x5a\x1c" - "\x86\x18\xad\x6c\xc4\xba\xf9\xdd\x7a\x6a\xd7\xe5\x22\xca\xb8\x94" - "\xe8\xe5\x72\x63\x29\x3a\x66\xa8\x47\x1f\xce\x43\xae\xab\xae\x22" - "\xd7\x2f\x6e\xd4\x53\x5e\x71\xc8\x1d\xc6\x24\xb0\x59\x29\xf0\x98" - "\x8d\x28\x31\x05\x6b\xe9\x34\x53\x79\xa2\x81\xa7\xa5\x53\xa7\x72" - "\x3a\x1a\xca\x25\xd6\xa3\x7f\xbe\x5b\x44\x61\xbd\xdc\x94\x3d\x4d" - "\xdd\xd4\x6f\x28\xd9\xc7\x8a\x9f\xcf\x87\x7b\x6b\xdf\x12\xe6\xf3" - "\x1b\xb3\xa7\x79\x37\xec\x1c\xea\xca\xec\xa1\xd9\x87\xcb\xe9\xcb" - "\xd9\x3f\xf3\x93\x46\xe4\x6d\xc9\xe7\x7f\x72\xcf\xe5\xf3\x17\x9d" - "\x20\x18\x4d\x3b\xa2\x2c\x9f\x9f\x56\x22\xd4\xd0\x2b\x2e\xd8\x6a" - "\xe8\x25\xfd\x1c\xd7\xd0\x4b\xc6\x28\xd3\xd0\x4b\x22\x1c\xd3\xd0" - "\x4b\xf6\x58\x6b\xe8\x6d\x29\x58\x43\xa7\x18\x31\x8e\xc5\x35\x34" - "\x39\x67\xab\x7d\x3e\x18\xc3\x69\x9f\x0f\x7a\xb5\x7f\x0d\xbd\xb4" - "\x48\x5c\xe7\x2c\x3d\x42\x34\xf4\x92\xc2\x96\xd7\xd0\x4b\x0a\xc5" - "\x35\xf4\x07\xcf\x11\xbd\xb1\xa4\xd0\xa2\x87\x39\x0d\x0d\xd7\x88" - "\x6a\xe8\x0f\x66\x59\x5f\x43\x34\xf4\x92\xbd\x44\x43\x7f\xb0\x56" - "\x5a\x43\x2f\xeb\x4b\x62\xd7\x07\x0d\x24\x76\x11\x9f\xda\x6a\xe8" - "\x0f\x8e\x37\xaf\xa1\x09\x86\x98\xe7\x94\xd4\xd0\xcb\x7a\xd8\x6a" - "\xe8\x14\x89\xfd\x33\x97\x5f\xe7\x70\xb4\x3c\x53\xa8\xa1\x97\x4d" - "\xbd\x3b\x34\xb4\x24\xb6\x8a\x84\x1a\x7a\xf9\x40\xf9\x1a\x7a\xf9" - "\x74\x79\x1a\x1a\x63\x4e\x4c\x43\x2f\xdf\xc3\xe2\x67\xaf\xb8\x86" - "\x5e\x7e\x4c\x5c\x43\x2f\xbf\x20\xd4\xd0\xb8\x7e\x31\x0d\xbd\xa2" - "\xab\xa0\x7e\x1b\x0d\xbd\xa2\x9f\x50\x43\x93\x72\x9c\x86\x5e\x51" - "\x41\x62\x68\x8a\x82\xfd\x33\x57\xec\x91\xd6\xd0\x2b\x0e\x08\x35" - "\xf4\x8a\x35\x44\x2b\xaf\xa8\x22\x1a\x7a\x45\x01\x39\x9e\x52\xc0" - "\x3f\xce\x69\x68\x72\x9c\xd3\xd0\x2b\x6a\x65\x68\x68\x4d\x0b\x69" - "\x68\xf7\xbb\x4b\x43\xff\xd3\xd0\x3e\x34\xf4\xca\xcd\xca\x34\xf4" - "\xca\x02\x07\x35\x81\x77\x33\x9a\xc0\xf5\xbe\x26\xe0\xf3\xad\xff" - "\x71\x27\x7c\x6b\xf5\x10\x65\x9a\x60\x75\x70\x7b\xf0\xcb\xbd\xe5" - "\x93\x95\xec\x7c\xfd\x0f\x8f\x29\xf3\xc9\x87\xa5\xf7\xf5\x73\x6b" - "\xf8\x65\x75\x1a\xf1\xcb\xda\xe9\xca\xfc\xb2\x36\x5a\xb9\x7e\xce" - "\xce\xe3\xf4\x73\x76\x1e\x5f\x3f\x7f\x2f\x78\xe7\x9c\x3e\xc4\xbe" - "\x7e\x5e\x5f\xc5\xe9\xe7\xcc\xe1\x84\x83\x66\xb2\x73\x4a\x32\x98" - "\x9c\xfa\xa2\x7d\x44\x3f\xdf\xc6\xfa\xf9\x22\xe8\xe7\x19\x51\x94" - "\x91\xfd\x76\x04\x9e\xbf\x76\x0c\x34\x30\xd6\xcc\xe5\xc9\xf0\x77" - "\x92\x01\x7d\x38\x1b\xb9\xae\x06\xed\xbb\x1d\xc6\xca\xed\xf3\x0c" - "\xd4\xca\x77\x61\x9c\xa9\xdc\x89\xbc\x62\x40\x57\xdf\xc0\xba\xfa" - "\x30\x68\xe6\xe5\xac\xae\xce\x98\x5a\x9e\xc4\xd7\xd5\xe9\x07\x18" - "\x5d\x6d\x20\x73\xe3\xca\x93\x40\x57\xc3\xfd\xf0\xb7\x28\xf8\xba" - "\xba\x01\x74\x73\x23\xe8\xe6\x8c\xcb\x56\x1a\x7b\x86\xad\xc6\x6e" - "\xf0\x99\xa6\xa9\xef\x37\xd4\x1d\x6b\xec\xdb\x5b\xef\x6b\x6c\x5b" - "\x8d\xbd\xc6\x9b\xe0\x38\xa3\x9f\x32\x8d\x9d\x11\x20\xd4\xd8\x39" - "\x2f\xdb\x6a\xec\x8c\x4c\xc7\x35\x76\xc6\x3e\x65\x1a\x3b\x63\xaf" - "\x63\x1a\x3b\xd3\xc7\x5a\x63\xff\x8d\x79\x4f\x9d\x1e\x82\xb1\x2e" - "\xae\xb1\xc9\x39\x5b\x6d\xb4\x7e\x1f\xa7\x8d\xd6\x2f\x69\xff\x1a" - "\x7b\xbd\x9f\xb8\x0e\x5a\xdf\x8f\x68\xec\x4c\xef\x96\xd7\xd8\x99" - "\xde\xe2\x1a\x7b\x3d\x3b\xff\x2d\xd3\xdb\x56\x63\xc3\x35\xa2\x1a" - "\x7b\xfd\x49\xeb\x6b\x88\xc6\xce\xd4\x10\x8d\xbd\xfe\xba\xb4\xc6" - "\xfe\x68\x2d\x89\x6f\x1f\x4d\x26\xf1\x8d\xf8\xd4\x56\x63\x7f\x34" - "\xb8\x79\x8d\x4d\x30\xc4\x3c\xa7\xa4\xc6\xfe\x68\xb1\xad\xc6\x4e" - "\x0f\x16\xd7\xd8\xd9\xe3\x39\x1c\x65\xdd\x12\x6a\xec\x8f\x8a\xef" - "\x0e\x8d\x2d\x89\x2d\x3f\xa1\xc6\xce\xca\x96\xaf\xb1\xb3\x8e\xc8" - "\xd3\xd8\x18\x73\x62\x1a\x3b\xdb\x87\xc5\x8f\x46\x5c\x63\x67\x0f" - "\x14\xd7\xd8\xd9\x2f\x0b\x35\x36\xae\x5f\x4c\x63\x67\xcf\x15\xd4" - "\x6f\xa3\xb1\xb3\x33\x85\x1a\x9b\x94\xe3\x34\x76\x4e\x10\x89\xa1" - "\x6b\xcf\xc9\xd7\xd8\x39\x3e\xd2\x1a\x3b\xa7\x97\x50\x63\x67\x1b" - "\x88\x96\xce\x19\x41\x34\x76\x8e\x2b\x39\xbe\x56\xcf\x3f\xce\x69" - "\x6c\x72\x9c\xd3\xd8\x39\x91\xf2\xde\x53\x3b\xb5\x1f\x96\x6b\xdb" - "\xaf\xc7\x68\xa9\xfd\xb0\x2c\xef\xaa\xff\xe8\xf5\x18\xb9\x9d\x94" - "\xe9\xec\x5c\xf7\xfb\x7a\xae\xa5\x75\x43\x4e\x1c\xe1\x5b\x1b\x14" - "\xee\x7f\xbb\xc1\xee\xfe\xb7\xf7\xf5\x9c\x52\xbf\xe4\x46\x10\xbf" - "\x7c\x32\x58\x99\x5f\x3e\x09\x52\xae\xe7\x3e\x1b\xc1\xe9\xb9\xcf" - "\x46\x48\xbf\x0f\xcd\xeb\x64\x5f\xcf\x15\x64\x70\x7a\x2e\xff\x3a" - "\xe1\x3b\xf9\x27\x09\xdf\xc9\xcf\x6e\xb9\xf7\xa1\xf9\x9e\xc2\xf7" - "\xa1\x79\xb3\xee\xbf\x0f\x6d\x0b\xad\xb6\xa1\x8a\x60\x74\xe3\x29" - "\x65\x5a\x6d\x63\xa5\x50\xab\x7d\x76\xcb\x56\xab\xe5\x3f\xe7\xb8" - "\x56\xcb\x9f\xaa\x4c\xab\xe5\x47\x39\xa6\xd5\xf2\x0f\x89\xbf\x0f" - "\xcd\xf3\x90\x7e\x1f\x4a\xce\xd9\x72\xec\x82\xa9\x1c\xc7\x2e\xe8" - "\xd7\xfe\xb5\xda\xa6\x0a\x71\x3e\xbd\xe9\x14\xd1\x6a\xf9\x45\x2d" - "\xaf\xd5\xf2\x8b\xc4\xb5\x5a\xc1\x28\xc2\x6b\xf3\x8b\x6c\xb5\x1a" - "\x5c\x23\xaa\xd5\x0a\x96\x58\x5f\x43\xb4\x5a\xfe\x61\xa2\xd5\x0a" - "\x36\x4a\x6b\xb5\xcd\x43\x48\xec\xda\xdc\x89\xc4\x2e\xe2\x53\x5b" - "\xad\x56\x70\xae\x79\xad\x46\x30\xc4\x3c\xa7\xa4\x56\xdb\xdc\xd7" - "\x56\xab\xe5\xb9\x8b\x6b\xb5\xcf\x5c\x38\x1c\x7d\xba\x59\xa8\xd5" - "\x36\xcf\xba\x3b\xb4\x9a\x24\xb6\x2a\x84\x5a\xed\xd3\x30\xf9\x5a" - "\xed\xd3\xb9\xf2\xb4\x1a\xc6\x9c\x98\x56\xfb\xf4\x10\x8b\x9f\xc3" - "\xe2\x5a\xed\xd3\x33\xe2\x5a\xed\xd3\x5b\x42\xad\x86\xeb\x17\xd3" - "\x6a\x9f\xf5\x16\xd4\x6f\xa3\xd5\x3e\x7b\x4e\xa8\xd5\x48\x39\x4e" - "\xab\x7d\xa6\x27\x31\xf4\x93\x3d\xf2\xb5\xda\x67\x87\xa4\xb5\xda" - "\x67\x47\x84\x5a\xed\xb3\x3c\xa2\xc9\x3e\xab\x25\x5a\xed\xb3\x42" - "\x72\xfc\x93\x42\xfe\x71\x4e\xab\x91\xe3\x9c\x56\xdb\xe2\x2a\x4f" - "\xab\x39\xbe\x5f\xd6\x1f\x3f\xa7\x58\x7d\x8f\xcd\x29\xde\xba\x47" - "\x99\x4e\xdb\x5a\x78\x5f\x13\xb4\x86\x26\xd8\xa2\x21\x7c\xeb\xf3" - "\x97\x95\x69\x82\xcf\x47\x28\xd7\x04\xbb\x27\x71\x9a\x60\xf7\x24" - "\x69\x4d\xb0\xad\x97\x7d\x4d\xb0\x63\x0b\xa7\x09\xfe\xee\x46\xc6" - "\xd5\x2f\x2e\x91\x71\xf5\x8b\xed\x2d\xa7\x09\xbe\xe8\x2d\xd4\x04" - "\xdb\x96\xdf\xd7\x04\x6d\xa1\x09\xb6\xd6\x13\x8c\x6e\xbf\xa2\x4c" - "\x13\x6c\xaf\x11\x6a\x82\xc2\x4e\xb6\x9a\xe0\x8b\x31\x8e\x6b\x82" - "\x2f\xe6\x2a\xd3\x04\x5f\x24\x39\xa6\x09\xbe\x38\x29\xae\x09\xb6" - "\x69\xa5\x35\x01\x39\x67\xcb\xe5\x76\xcc\xe5\xb8\xdc\x8e\xb0\xf6" - "\xaf\x09\xfe\x5e\x25\xce\xdb\xfe\x7e\x85\x68\x82\x2f\x4e\xb4\xbc" - "\x26\xf8\xe2\x84\xb8\x26\xd8\x31\x95\xf0\xa7\x2f\x4e\xd8\x6a\x02" - "\xb8\x46\x54\x13\xec\xc8\xb6\xbe\x86\x68\x82\x2f\x2a\x89\x26\xd8" - "\xb1\x47\x5a\x13\xec\x1c\x45\x62\xd7\xce\x5e\x24\x76\x11\x9f\xda" - "\x6a\x82\x1d\xb7\x9a\xd7\x04\x04\x43\xcc\x73\x4a\x6a\x82\x9d\xcf" - "\xd9\x6a\x82\x6d\xbe\xe2\x9a\x60\xb7\x0f\x87\xa3\x5d\xfb\x84\x9a" - "\x60\xe7\xf2\xbb\x43\x13\x48\x62\xab\x4a\xa8\x09\x76\x8d\x97\xaf" - "\x09\x76\xad\x92\xa7\x09\x30\xe6\xc4\x34\xc1\x2e\xf6\xfd\x1f\xc1" - "\x8b\xad\x26\xd8\x75\x5d\x5c\x13\xec\xee\x24\xd4\x04\xb8\x7e\x31" - "\x4d\xb0\x7b\xb0\xa0\x7e\x1b\x4d\xb0\x7b\x8c\x50\x13\x90\x72\x9c" - "\x26\xd8\x5d\x4b\x62\xe8\xe7\xc5\xf2\x35\xc1\xee\x93\xd2\x9a\x60" - "\xf7\x19\xa1\x26\xd8\xcd\x72\xff\x42\x77\xa2\x09\x76\x1f\x26\xc7" - "\x3f\x3f\xcc\x3f\xce\x69\x02\x72\x9c\xd3\x04\x85\x9a\xfb\xfb\x69" - "\xdd\x4d\xfb\x69\xed\x39\xa2\x4c\x17\xec\x29\x51\xce\x3f\x0f\xec" - "\xe7\xf8\xe7\x81\xfd\x7c\xfe\x29\xdc\xd7\xe2\xcb\x8d\xf6\xf9\xe7" - "\x57\x88\xe3\x9f\xfb\xa6\x92\x18\xbe\x6f\x38\x89\xe1\xfb\x98\xbd" - "\xf9\xe4\xed\xa7\xb5\x77\xb1\x70\x3f\xad\x2f\xaf\xdc\xdf\x4f\xab" - "\xb5\xb8\x65\x61\x00\xe1\x96\x7b\x5f\x56\xc6\x2d\xf7\x8e\x10\x72" - "\xcb\xaf\xa7\xdb\x72\xcb\xbd\x3b\x1d\xe7\x96\x7b\x8f\x2b\xe3\x96" - "\x7b\x2b\x1c\xe3\x96\xfb\x06\x8a\xef\x61\xf1\x65\x81\xf4\x7e\x5a" - "\xe4\x9c\x2d\x27\xf8\x07\x6f\x5f\xfd\x7f\x6c\x6c\xff\xdc\xf2\x1f" - "\x3a\xf1\xf1\xff\x1f\x2f\x13\x6e\xb9\x2f\xb0\xe5\xb9\xe5\xbe\x40" - "\x71\x6e\xf9\x8f\x6f\xc8\x38\xbc\x2f\xc8\x76\x0f\x0b\xb8\x46\x94" - "\x5b\xfe\x83\xdd\xff\x7e\x5f\xa0\x90\x5b\x92\x3a\x20\x0e\x79\x4a" - "\x73\xcb\xaf\xb6\x93\xb8\xf4\xd5\x02\x12\x97\x88\x4f\x6d\xb9\xe5" - "\x57\x63\x9a\xe7\x96\x04\x43\xcc\x73\x4a\x72\xcb\xaf\x36\xd8\x72" - "\xcb\x2f\xf3\xc4\xb9\xe5\x81\x59\x1c\x8e\x0e\x74\x15\x72\xcb\xaf" - "\xce\xdd\x1d\xdc\x52\x12\x5b\x3a\x21\xb7\xdc\xbf\x47\x3e\xb7\xdc" - "\x7f\x41\x1e\xb7\xc4\x98\x13\xe3\x96\x07\x06\x5a\x63\x4e\xc8\x2d" - "\x0f\x8c\x12\xe7\x96\x07\xa6\x0b\xb9\x25\xae\x5f\x8c\x5b\x1e\xc8" - "\x14\xd4\x6f\xc3\x2d\x0f\xec\x14\x72\x4b\x52\x8e\xe3\x96\x5f\x47" - "\xb0\xe3\xdd\x70\xf9\xdc\xf2\xeb\x81\xd2\xdc\xf2\xeb\x21\x42\x6e" - "\xf9\xb5\x07\xe1\x90\x5f\x47\x13\x6e\xf9\xb5\x96\x1c\xff\x72\x18" - "\xff\x38\xc7\x2d\xc9\x71\x8e\x5b\x7e\x9d\x24\x6f\xfd\x4d\x8b\xe4" - "\x9b\xdb\x68\xfd\x4d\x4b\xe5\x9b\xdb\xcb\xfa\x9b\x83\xbd\x95\xf1" - "\xca\x83\xda\xfb\xf3\x82\x5a\x3a\xd7\xfc\xf5\x4a\xc2\xb5\xbe\xd9" - "\xa7\x2c\xd7\xfc\xcd\x5e\xe5\x5c\xbf\xb8\x8a\xe3\xfa\xc5\x55\xd2" - "\xeb\x09\xbe\x5d\x65\x9f\xeb\x7f\x17\xc0\x71\xfd\x43\xec\x7c\xdb" - "\x43\xb3\xc8\x98\x7a\x68\xa0\x92\xf5\x04\xab\x6f\x20\xd7\x0f\xad" - "\xd7\x13\x9c\xf8\x86\xac\x27\x98\x6d\xbd\x9e\xa0\x68\xbb\x70\x3d" - "\xc1\x3f\x3b\x49\xad\x27\xc0\xb9\xe7\xa6\x9d\x43\x99\xb5\x04\xa2" - "\xeb\x08\x26\xb6\xfc\x3a\x02\xac\x13\x3e\x01\xdc\x62\xad\x80\xe3" - "\xcd\xbd\xa5\x15\x0e\xc6\x10\xfc\x16\xcd\x55\xa6\x15\x8a\x92\x84" - "\x5a\xe1\xfb\x4c\x5b\xad\x50\x74\xca\x71\xad\x50\x64\x52\xa6\x15" - "\x8a\x8c\x8e\x69\x85\x43\x93\xc5\xd7\x11\x7c\xbb\x46\x7a\x1d\x01" - "\x39\x67\xcb\xf1\xfe\x65\xe2\x38\xde\xbf\x8e\xb4\x7f\xad\xf0\xaf" - "\x38\x71\x3e\xf7\xaf\xb9\x44\x2b\x1c\x9a\xd4\xf2\x5a\xe1\xd0\x24" - "\x71\xad\xf0\xaf\x4b\x84\x57\x1d\x9a\x64\x9b\x87\x86\x6b\x44\xb5" - "\xc2\x77\xbd\xac\xaf\x21\x5a\xe1\x50\x14\xd1\x0a\xdf\x0d\x91\xd6" - "\x0a\xdf\x9d\x24\x71\xed\x3b\xf6\x1b\x93\xc4\xa7\xb6\x5a\xe1\xbb" - "\xc5\xcd\x6b\x05\x82\x21\xe6\x39\x25\xb5\xc2\x77\xc5\xb6\x5a\xe1" - "\xdb\x95\xe2\x5a\xa1\x78\x23\x87\xa3\xe2\xe7\x84\x5a\xe1\xb0\xe7" - "\xdd\xa1\x15\x24\xb1\x15\x27\xd4\x0a\x87\xcf\xc8\xd7\x0a\xc5\x5d" - "\xe5\x69\x05\x8c\x39\x31\xad\x50\x3c\x99\xc5\x4f\x94\xb8\x56\x28" - "\x5e\x20\xae\x15\x8a\x33\x85\x5a\x01\xd7\x2f\xa6\x15\x8a\xbf\x11" - "\xd4\x6f\xa3\x15\x8a\x4f\x09\xb5\x02\x29\xc7\x69\x85\xef\x17\x91" - "\x18\xfa\xed\x40\xf9\x5a\xe1\xfb\xc9\xd2\x5a\xe1\xfb\xe9\x42\xad" - "\xf0\x7d\x30\xd1\x04\xdf\x67\x10\xad\xf0\xfd\x48\x72\xfc\xdb\x40" - "\xfe\x71\x4e\x2b\x90\xe3\x9c\x56\xf8\xbe\x40\xde\xdc\x14\xc7\xf3" - "\xd0\x7f\xfc\xdc\x14\xf7\x7b\x6c\x6e\x4a\xc9\x28\x65\x5a\xa1\x64" - "\xa4\x72\x5e\x5a\x11\xc9\xf1\xd2\x8a\x48\xe9\x39\x10\x47\x7a\xdb" - "\xe7\xa5\xc7\x0a\x38\x5e\x5a\xea\x42\xe2\xf7\x0f\x17\x48\xfc\xfe" - "\x61\xab\xa3\x73\x20\x56\xdf\x66\xb9\xa8\x65\x0e\xc4\x3c\x76\x0e" - "\x04\xf0\x51\xc2\x3f\x7f\xe8\x25\x9c\x03\x71\x64\x95\xd4\x1c\x08" - "\xd1\xb9\x0f\x56\x9c\xd3\xc2\x4f\x9d\x99\xfb\x70\x6f\x73\xce\xef" - "\xf7\x12\xce\x79\xf4\x92\x32\xce\x79\xb4\x5a\xc8\x39\x8f\xbb\xd9" - "\x72\xce\x1f\x46\x39\xce\x39\x7f\x98\xa5\x8c\x73\xfe\x90\xe8\x18" - "\xe7\xfc\xe1\xb8\xf8\xdc\x87\x23\x7e\xd2\x73\x1f\xc8\x39\x5b\xae" - "\x70\x8c\x97\x57\x3c\xf6\x5c\xfb\xe7\x9c\xa5\x7a\x71\x5e\x50\x7a" - "\x89\x70\xce\x1f\x2a\x5a\x9e\x73\xfe\x50\x21\xce\x39\x8f\xb1\xe3" - "\xff\x0f\x15\xb6\x9c\x13\xae\x11\xe5\x9c\xc7\x32\xad\xaf\x21\x9c" - "\xf3\x87\x13\x84\x73\x1e\xdb\x29\xcd\x39\xcb\x5e\x26\x31\xab\xac" - "\x07\x89\x59\xc4\xa7\xb6\x9c\xf3\xd8\xf5\xe6\x39\x27\xc1\x10\xf3" - "\x9c\x92\x9c\xb3\x6c\x88\x2d\xe7\x3c\xa2\x15\xe7\x9c\x15\x5d\x39" - "\x1c\x95\xef\x11\x72\xce\xb2\x25\x77\x07\xe7\x94\xc4\x96\x5e\xc8" - "\x39\xcb\xc7\xc8\xe7\x9c\xe5\xcb\xe5\x71\x4e\x8c\x39\x31\xce\x59" - "\x7e\x9c\xc5\xcf\x09\x71\xce\x59\x7e\x45\x9c\x73\x56\xb8\x09\x39" - "\x27\xae\x5f\x8c\x73\x56\x0c\x14\xd4\x6f\xc3\x39\x2b\x46\x09\x39" - "\x27\x29\xc7\x71\xce\x0a\x03\x89\xa1\x25\x47\xe4\x73\xce\x8a\xe3" - "\xd2\x9c\xb3\xe2\x94\x90\x73\x56\xec\x20\xdc\xf2\xb8\x2b\xe1\x9c" - "\x15\x45\xe4\x78\x49\x09\xff\x38\xc7\x39\xc9\x71\x8e\x73\x1e\xf7" - "\xb6\xc7\x39\xe9\xac\x0e\xd5\x19\x94\xb9\x10\x7e\xfb\xe1\x39\x7b" - "\xc0\xf8\x56\x04\x7f\x97\xc0\x38\xa5\x86\xbf\x2b\xa4\xb8\x8c\xc1" - "\xa7\x43\xb5\x19\x78\x89\x19\xee\x53\x6e\xb8\x56\x54\xd4\xd3\x88" - "\xc7\x93\x2c\x32\xbe\x74\xa8\xf6\x32\x76\x1c\x61\xa6\x63\x10\xed" - "\x0d\x7f\x27\xc3\x31\x28\xdf\x05\xc6\x43\xed\x3c\xd4\xe5\x2a\x75" - "\x7c\xaf\xa5\x1c\x3c\x73\x97\xf3\xd4\xf1\x59\xb8\x0e\x78\xd6\x22" - "\x68\x8f\x56\xf2\x59\xa1\xae\xf0\xed\x0f\xa1\xc5\x46\xfa\xb7\xa2" - "\x84\x1b\xa8\x8a\xfa\xb1\x93\x57\x4d\xc7\x11\x10\x87\x10\xe6\x88" - "\x85\x3d\x0d\xae\xb8\xce\xa2\x84\x46\x38\x77\xbc\x06\x9f\x33\xc1" - "\x33\xa6\xc4\x23\x2a\xfd\x46\x47\x77\xe0\x5c\x6e\xa9\xb5\x74\xf5" - "\x4c\x23\x3c\x33\x8c\xaf\xff\x7c\xa8\xd2\x75\xf7\xc7\x95\xcc\xd8" - "\x53\x56\x6b\x62\xea\xd0\x26\xe0\xe7\xf9\xd1\x33\x1f\xca\x8b\x3d" - "\xc3\xf2\x5d\x28\xc0\xad\x2f\xad\x97\x37\xde\xfd\x18\x25\x65\x47" - "\xaf\x25\x0f\xa1\xa2\x27\xc0\x76\x5a\x44\x89\x9d\x97\x79\x1f\x7b" - "\xf3\x1f\xdc\x3f\xea\x4e\xd7\xa6\x6e\x40\xd4\x3a\x73\x47\xf7\xef" - "\x20\x26\x6e\xca\xa1\x0d\x75\xab\xff\x1d\xa4\x77\x39\xb4\x0d\xdb" - "\xfc\x03\x38\xbf\xae\x3b\x6d\xb8\xb9\x14\xe3\xe6\xdf\x23\x0f\xc1" - "\xd8\x6e\xed\x8b\xd9\xd1\xf1\x53\xb5\x49\xb1\xf1\xd3\x67\xce\x4d" - "\xd2\xf6\x89\xee\x8c\xc6\xcd\x9c\xa9\x8d\x9f\x9a\xb0\x40\xcb\x3f" - "\xf3\x8c\x36\x3a\x76\xce\xd4\x69\x71\xd3\xfb\xc5\xbf\x9d\xd8\x19" - "\x9e\x09\xf1\x9e\xc3\x1b\x3f\x8b\x79\xf5\xbf\x23\xf3\xd7\x23\xf4" - "\x51\x37\xe4\x8a\x9f\x0b\xee\x77\x50\xef\xaa\xad\xc2\xf7\x4b\xcf" - "\xa1\x6b\x29\x28\x93\x0a\x31\x6d\x5d\x4a\x47\x28\xfb\x63\xc9\x26" - "\x78\xae\x7c\x78\x6e\x78\x46\xfc\xcc\xd5\x96\x67\xb6\x60\x22\x15" - "\x63\x22\xe5\x06\x60\xf0\x44\x27\xaf\xfa\x8e\x2f\xd1\x74\x24\x6e" - "\x5f\x2d\xf4\x15\x17\x38\xb6\x99\xd1\x0d\xd9\x1d\xaa\xeb\x56\x9f" - "\xf0\xb3\x60\xcc\x9c\x15\x9e\x46\xe7\x74\x28\x04\x5e\xe9\x52\x47" - "\xc7\x3c\x0f\xd8\xc4\xd7\xcf\x1a\x80\x50\x1a\x5d\x17\xc9\x7c\x1b" - "\x83\xae\x03\x0c\x13\x9c\xc2\xb9\x93\xc3\x6e\x52\x28\x14\xea\x88" - "\xd1\xa3\xf8\x1a\x5c\x87\x1e\x8e\x61\x9b\x9b\x0b\xe2\xd5\xe3\xfd" - "\x51\xda\xe3\x69\x28\xad\x0e\x5f\xb3\xa5\x7f\xb5\x57\x12\x72\x09" - "\x4f\xa6\xcf\x42\xdc\x71\xa1\x7b\xc7\xab\xe9\xad\xfd\xab\xf5\xd4" - "\x89\x91\xe6\xec\xf0\x34\x68\x4f\x0d\xd4\x53\xa8\x47\x4d\x15\xb8" - "\x9e\x75\x39\x8c\xed\x6b\x70\xdb\xc1\x3e\xa0\x7f\xe8\x22\x7a\x29" - "\xdb\x87\x32\xfc\xb4\xe6\x8c\xd9\x51\xe5\xae\xb7\x51\xb8\x91\x6e" - "\xa2\x33\xfd\xb4\x65\xb5\xb5\x10\xd3\x12\xdf\xa6\x3b\xff\x3b\xd6" - "\xcb\x18\x3b\x7d\x53\x37\xe8\x8b\x99\xb3\xa3\xe8\xcc\x67\x27\x8d" - "\xef\x8b\xd4\x75\xab\x4f\x7a\x58\xec\x09\xb6\x74\x95\x87\xa3\x93" - "\x6a\xdc\x26\x8c\x07\x78\x1e\x16\x0f\x27\x27\x1d\x4a\xb2\xc5\xc3" - "\x9d\xbe\x99\xf3\xbc\xc1\x48\x47\xbe\xd4\x94\x15\xea\x4f\x7b\x87" - "\x7a\xa7\x5c\x40\x1d\xb0\x6d\xcb\x40\x0b\xa4\xcf\x43\x9a\xb5\x6f" - "\x21\xed\x94\x05\x6a\x64\xc8\x0e\x55\x7b\x2d\x49\x73\x01\x9b\x50" - "\x10\x5f\x02\x21\x66\x06\x36\x75\x0f\x4f\x5b\x34\x1d\x51\x3b\xcf" - "\x17\x52\x98\x3f\xe3\x79\x2b\x17\xa9\xff\xf4\xca\x87\xeb\xe8\x6b" - "\x91\x08\xfb\x83\xf1\xc5\xb5\x18\x34\x2a\x16\xc6\xe7\x77\x99\xf3" - "\x63\x36\x42\x9d\x32\xdb\xc5\xf0\x5f\x13\xf8\x6a\x00\xf8\xa9\xbc" - "\xca\xc4\xd4\xc9\xf8\x2a\x8e\xf3\xd5\x37\xf0\x1c\x9c\xbf\x4e\x56" - "\x62\xbf\x8a\xb7\x39\x34\x91\x6d\xf3\x36\x68\x73\x96\x9d\x36\x67" - "\x90\x36\xbb\xdd\xb0\xdf\xe6\x9f\xba\xda\x6f\xf3\x4f\xc3\xe5\xb7" - "\xf9\x3f\xa7\xe5\xb7\xf9\x3f\xa5\x76\xda\xcc\xfa\x59\x07\x7e\xd6" - "\xd9\xf1\xb3\x8e\xf5\xf3\x03\xe7\xed\xb7\xb9\xd2\xcd\x7e\x9b\x2b" - "\x87\xc8\x6f\xf3\x4f\x15\xf2\xdb\xfc\x53\x91\x74\x9b\x75\xac\x9f" - "\x75\xe0\x67\x9d\x1d\x3f\xeb\x58\x3f\x77\xfd\xb1\x99\x36\x37\xd8" - "\x6f\xf3\xa9\x7e\xf2\xdb\x5c\x79\x58\x7e\x9b\x2b\xf7\xda\x69\x33" - "\xeb\xe7\x30\xf0\x73\x98\x1d\x3f\x87\xb1\x7e\x7e\x7a\xb5\xfd\x36" - "\x9f\xba\x62\xbf\xcd\x3f\xf7\x96\xdf\xe6\x53\xfb\xe5\xb7\xf9\xd4" - "\x36\xe9\x36\x87\xb1\x7e\x0e\x03\x3f\x87\xd9\xf1\x73\x18\xeb\xe7" - "\x37\x87\xda\x6f\xf3\xcf\xe7\xec\xb7\xf9\xbf\x3e\xf2\xdb\xfc\xf3" - "\x0e\xf9\x6d\xfe\x39\x4f\xaa\xcd\x8d\x10\xb7\x3d\xa0\x2d\x4d\x3f" - "\x45\xbe\x64\xf2\x0e\xf5\xf5\xa8\x42\x54\xde\x52\x73\x8c\x57\x35" - "\xea\x04\x6d\x8b\xa1\x73\xc6\x46\xe0\x7f\xcd\xde\xa1\x9a\x46\xef" - "\x50\xff\x86\xee\x1d\x0a\xdf\x9f\x8c\x3a\x60\x3e\xbe\xca\x8c\x34" - "\xe6\xac\x50\xef\x35\x63\x91\x36\xd5\x80\xd4\x65\x29\x7a\x94\x92" - "\x48\x1b\xca\xd0\x39\xe4\x59\x8d\xb5\xe7\xcf\xa8\xb4\xa6\x04\x25" - "\xcc\xa6\xe9\x8b\xd4\xe9\xa9\x38\x6f\x02\x3c\x39\x2d\xe3\x3f\x48" - "\x0b\xf7\x08\xcc\x87\x1f\xae\xc7\x6b\x24\x8c\x9f\x39\x63\xc7\x6e" - "\x4a\x41\x9a\x6f\xdf\xad\x46\xf8\xf8\x46\xf8\x99\x72\xc2\xd3\x52" - "\x26\x23\x6a\xd7\x8d\x4a\x8a\x8c\xcd\xa7\xfb\x59\x8f\xcd\x23\xa7" - "\x82\x2d\xa7\x31\xe7\x16\xe4\x8d\x95\x6b\xcb\xff\xd6\x5b\xc6\x6e" - "\xc6\x96\xa7\x4d\x64\xbc\xb7\x1a\xbb\xbf\x85\xfb\x73\xb6\xfc\x6f" - "\x35\xb6\x25\x9d\x15\x1a\x58\x5e\xdd\x88\x75\x93\xfa\x62\x32\xa2" - "\xe0\x78\x6e\x59\xe2\x0d\x24\x6e\xe3\xd0\x44\x9e\x8d\xf3\x3c\xaa" - "\xdc\x6e\x48\xd8\x38\x17\x6c\xbc\x4d\xc4\xc6\x59\x8e\xd9\xf8\x4c" - "\xb1\xf3\x36\x3e\x93\x29\x6d\xe3\x33\x67\xe4\xdb\xf8\xcc\x24\xf9" - "\x36\x3e\x33\x92\xb5\x71\xa1\xd0\xc6\xa7\x8d\x76\x6c\xcc\xc3\xb1" - "\x0e\x70\xfc\xc0\x79\x71\x1b\xeb\x00\xc7\x3a\x11\x1c\xeb\x1c\xc4" - "\xf1\xd9\xbe\xce\xdb\xf8\x97\x5b\xd2\x36\x3e\x1b\x26\xdf\xc6\xbf" - "\x14\xc9\xb7\xf1\x2f\x85\xc4\xc6\x3a\x2b\x1c\xff\x12\x25\x6d\x63" - "\x1d\x0f\xc7\x3a\xc0\x71\xd7\x1f\x25\x6c\x0c\x38\xd6\x89\xe0\x58" - "\xe7\x20\x8e\xf5\x6b\x9d\xb7\xb1\xfe\x0d\x69\x1b\xeb\xb7\xca\xb7" - "\xb1\xde\x4f\xbe\x8d\xf5\xde\xac\x8d\xad\x70\x7c\xf6\xb0\x1d\x1b" - "\xf3\x70\x1c\x06\x38\x7e\x7a\xb5\xb8\x8d\xc3\x00\xc7\x61\x22\x38" - "\x0e\x73\x10\xc7\xe7\xae\x3b\x6f\xe3\x73\xdf\x48\xdb\xf8\x7c\x27" - "\xf9\x36\x3e\xb7\x52\xbe\x8d\xcf\x25\x13\x1b\x87\x59\xe1\xf8\x9c" - "\xbf\xb4\x8d\xc3\x78\x38\x0e\x03\x1c\xbf\x39\x54\xc2\xc6\x80\xe3" - "\x30\x11\x1c\x87\x39\x88\xe3\x5f\xc7\x3b\x6f\xe3\x5f\x7b\x4b\xdb" - "\xf8\xd7\x78\xf9\x36\x3e\x5f\x23\xdf\xc6\xe7\x4f\xb3\x36\xb6\xc2" - "\xf1\xf9\x35\x52\x36\x6e\x02\x0d\xe8\x09\x36\xf6\xac\x41\xd4\x46" - "\x6c\xdb\x4a\x62\x5b\x53\xf7\xb1\x11\x1b\x29\x73\x0c\xb6\x09\x93" - "\x03\xfa\x5d\xd3\xc5\x94\x15\xea\x4b\x53\xd0\xa6\x14\x9c\x77\xfd" - "\xf5\xa4\x71\x29\xea\xa2\x4d\xc1\xf9\xdf\x0b\xcc\xfc\x58\x6d\xca" - "\x8a\x33\x70\x3f\x15\xce\x7b\x19\xb3\xdd\x32\x4c\x3e\x2f\x44\xc1" - "\x39\x4f\xba\xcf\x40\x04\xda\x2b\x90\x7e\x4f\xe3\x5d\x5e\x53\x08" - "\xf6\x39\x8a\xca\x2a\xbf\x46\xe6\xee\x63\xc7\x0e\x30\x22\x7f\xfa" - "\x77\x7f\xef\xd2\x24\x3d\x32\xbd\xad\xf1\x28\x4f\x2e\x41\xe5\xc9" - "\x5f\xa2\xf0\x6a\xfa\x36\xfd\xab\xbf\x47\x93\x4f\x64\xae\xc9\x67" - "\x6c\xa0\x29\x7b\x9a\xbf\xd1\x27\x72\xe5\xce\x79\x7a\xca\xa3\x1e" - "\xf9\xc7\x55\xd1\x74\xfa\x34\xe4\x9a\x7e\x1e\xb9\xaf\x9b\x86\x3c" - "\xd6\x9d\x47\xea\xd2\xaa\x4a\x74\xec\x72\x09\x3a\x76\xe3\x14\x3a" - "\x76\x1b\x7e\x8d\xf0\x33\xc3\x2f\xed\x14\xf8\x1a\xa1\x51\x57\x10" - "\xfe\xae\xa8\xe1\xc9\xd3\xc8\xbb\xd4\x58\x89\xf0\x9a\xde\xab\x54" - "\xd5\x76\x8f\x28\xe4\x4d\xff\xaa\x41\xf4\xdb\x1a\x0a\xce\xb9\xe2" - "\xe3\xe5\x46\x03\x2a\xad\xaa\xc7\xe7\x57\xc2\x79\xd7\xd4\x2a\xa8" - "\xdf\x5c\x82\xbf\x1b\x6a\x28\x4d\x3b\x82\x8c\x99\xfb\xf0\xb8\xe7" - "\x4f\x77\x7f\xde\x90\x01\xa6\x36\xd3\x9a\x47\x08\x0e\x2e\x1c\xca" - "\x37\xcb\xf5\x75\x15\xd9\xff\xe6\x3d\x4d\x37\xb0\x73\x4f\xf3\x7b" - "\x91\xea\xd1\xa7\xce\xd2\x78\x8e\x1f\xce\x25\x94\xd5\x1e\x45\xf8" - "\x5d\x53\xf8\x02\x84\x46\x9a\x10\xc2\xb6\x28\x4f\xae\x46\xa3\x13" - "\x91\x17\xce\x3f\x9b\x7f\xf7\xef\x56\x5e\x65\x40\x8b\x8d\xf0\x8c" - "\x57\xeb\xef\x3c\x63\xd9\xb2\x32\x04\xe7\x7a\x96\xc5\xe8\x91\x47" - "\x22\x52\x63\xfb\x1a\xb3\x42\x35\xa3\xa1\xff\x24\xd4\xd2\x34\xb6" - "\x2d\xb6\x29\xb6\x2f\xae\xcf\x62\xf3\xf2\x68\x03\x4a\xad\x47\xea" - "\xf2\x14\xf8\x37\x99\x36\x94\xa3\xeb\x08\x9e\xf1\x20\xdd\x75\x5f" - "\x1a\xe0\x62\x1c\xc6\x82\x9e\xfa\xb5\x14\xfc\xdf\x4d\x02\x53\x59" - "\x04\x53\x6e\x37\x1c\xc0\x54\x1e\x87\xa9\x8b\x7d\x39\x4c\x55\xbb" - "\x49\x63\xea\xb7\xa9\x2c\xa6\x0a\xdb\x27\xa6\x2e\x9a\xec\x63\xea" - "\xe2\x69\x3b\x98\xda\x46\x77\x0f\x4d\x14\x62\xaa\xda\x47\x3e\xa6" - "\x7e\x0b\x68\x43\x4c\xe5\x2a\xc3\xd4\x6f\x6a\x21\xa6\x2e\x6a\xa5" - "\x31\xa5\x63\xe3\xd4\x03\xe7\x9b\xc7\x94\x8e\x17\xa7\xaa\x17\x73" - "\x98\xba\xfc\x86\x34\xa6\x2e\xed\x23\x98\xd2\xb5\xd3\x38\x75\x69" - "\x8c\x7d\x4c\x5d\x0a\x94\xc6\x94\x0e\xe2\x54\xa8\x55\x9c\xba\x1c" - "\x2b\x1f\x53\x97\xd2\xda\x0e\x53\x3a\x85\x71\xea\x52\xb4\x10\x53" - "\xd5\x49\x76\x30\xc5\xc6\xa9\xae\x3f\x3a\x80\x29\x5e\x9c\xba\x7c" - "\x9c\xc3\x54\xcd\x4e\x69\x4c\xd5\x74\x62\x31\xd5\x4e\xe3\xd4\xef" - "\x5b\xed\x63\xea\xf7\x65\x76\x30\x05\x71\x4a\x67\x15\xa7\x6a\xbe" - "\x91\x8f\xa9\xdf\x4f\xb4\x21\xa6\x14\xc6\xa9\xdf\xf7\x0b\x31\x75" - "\xb9\x44\x1a\x53\x61\x6c\x9c\x7a\x7a\x75\xf3\x98\x0a\xe3\xc5\xa9" - "\x2b\x7d\x38\x4c\x5d\x73\x91\xc6\xd4\xd5\xc9\x04\x53\x61\xed\x34" - "\x4e\x5d\x69\xb0\x8f\xa9\x2b\x95\xd2\x98\x0a\x83\x38\xa5\xb3\x8a" - "\x53\xd7\xba\xca\xc7\xd4\x55\xff\xb6\xc3\x54\x98\xc2\x38\x75\xd5" - "\x43\x88\xa9\x2b\xbe\x76\x30\xc5\xc6\xa9\x37\x87\x3a\x80\x29\x5e" - "\x9c\xba\xb6\x80\xc3\xd4\xf5\xf1\xd2\x98\x32\xec\x61\x31\xd5\x4e" - "\xe3\x94\x61\x94\x7d\x4c\x19\x02\xec\x60\x0a\xe2\x54\x98\x55\x9c" - "\xba\x3e\x5d\x3e\xa6\x0c\x8b\xda\x10\x53\x0a\xe3\x94\x21\x4a\x88" - "\xa9\x6b\x89\x52\x98\x6a\xc4\xba\xcf\x05\x30\x15\x03\xba\x0f\x30" - "\xe4\x55\x41\x30\xd5\x04\x98\xfa\x84\x8f\xa9\xff\x5a\xeb\xbe\xeb" - "\xc7\xcc\x77\x30\x75\xf3\x94\x35\xa6\xcc\x80\xa9\x26\x06\x53\x37" - "\xae\x5b\x74\x5f\x79\x4d\x01\xf8\xea\x32\x2a\x8f\x00\x3c\xe5\xb0" - "\x78\xfa\x2f\xe0\x09\xda\x63\x86\xf6\x96\x9e\xae\x44\xe1\x06\xd2" - "\xae\x46\x68\xaf\x99\x8f\xa5\xc6\x6a\x0a\x63\x08\x63\xc7\x82\xa3" - "\x63\x09\x80\x9f\xd9\xc7\xd1\xb1\x79\xf0\x5b\x08\xbf\x14\xf8\xa1" - "\xe3\xa8\xb4\x1a\x31\x39\x7b\x0e\x3f\x15\x2c\x7e\x6e\xac\xb5\x8f" - "\x9f\x1b\x71\xf2\x34\xde\xcd\x4b\xf2\xf1\x73\xe3\x20\x3b\x97\x4e" - "\x1d\x3e\xe6\x2c\x8d\xe7\xcd\x12\x8c\x5c\x46\xe1\x46\xe4\x45\xbf" - "\xe9\xdf\xcd\x23\x12\xa9\xdf\x37\x21\x6a\xed\x34\xa4\x5e\xfb\x33" - "\xb4\xd7\xd2\x77\xce\x23\x8f\xa3\xf5\x5f\xa3\xd2\x1b\x95\xa8\xf4" - "\xf6\x11\x54\x6a\x86\xdf\x65\xf8\xc1\x33\x86\x4f\xe7\xb7\xd7\xc0" - "\xb6\xf7\xe6\x62\xa8\xcb\x4f\xba\xbd\x37\x27\x31\xed\x8d\x86\xf6" - "\x36\x72\xed\x2d\x07\x2c\x82\x5f\x7a\x9a\x59\x9d\x18\x6e\x40\x9d" - "\x66\x1a\x69\xba\x91\xc5\x20\xf6\xcb\xd1\x13\xf5\x28\x3c\x11\x7c" - "\xf5\x36\x60\xb0\x6a\x1b\x4a\x5d\x04\x18\x6c\xac\xc7\xef\xf5\x0d" - "\xe5\x69\x0d\x80\xc1\x1b\x05\x34\xd8\xad\x09\x63\xf0\xbf\x18\x83" - "\xd7\x0f\x9b\xa5\x31\x98\x45\x30\x08\x3a\xb1\x79\x0c\xf2\xe2\x5a" - "\xed\x18\x0e\x83\xb7\x27\x4b\x63\xf0\xd6\x5c\x8b\x4e\xfc\xe3\x31" - "\x78\xab\xab\x7d\x0c\xd6\x1a\xe4\x69\xc2\xdb\xf1\xf2\x31\x78\x4b" - "\xd7\x76\x18\xbc\xed\x62\x1f\x83\xb7\xf4\x0e\x60\x30\x57\x19\x06" - "\x6f\xf9\x09\x31\x58\x3b\x42\x1a\x83\x3a\x36\x0e\x82\xae\x6c\x16" - "\x83\x7c\x5d\x79\xfb\x24\x87\xc1\xfa\x73\xd2\x18\xac\x6b\xb0\xe8" - "\xca\x3f\x1e\x83\x75\xd9\xf6\x31\x58\x97\x24\x4f\x43\xd6\x5f\x97" - "\x8f\xc1\xba\xc3\x6d\x87\xc1\xfa\xe5\xf6\x31\x58\x1f\xdd\x3c\x06" - "\x75\x0a\xe3\x60\xdd\x36\x21\x06\x6f\x97\xda\xc1\x20\x1b\x07\x41" - "\x87\x36\x8f\x41\x5e\x1c\x6c\x78\x83\xc3\x60\xd3\x74\x69\x0c\x36" - "\x2e\xb6\xe8\xd0\x3f\x1e\x83\x8d\x3d\xec\x63\xb0\xa1\x5e\x9e\xe6" - "\x6c\x9a\x2b\x1f\x83\x8d\x23\xda\x0e\x83\x4d\x9d\xec\x63\xb0\xb1" - "\xda\x01\x0c\x2a\x8c\x83\x8d\x01\x42\x0c\x36\x44\x48\x63\x30\x8c" - "\x8d\x83\xa0\x5b\x9b\xc5\x20\x5f\xb7\x36\x9d\xe1\x30\x68\xba\x24" - "\x8d\x41\x93\x8b\x45\xb7\xfe\xf1\x18\x34\x6e\xb4\x8f\x41\xe3\x22" - "\x79\x1a\xd5\xd4\x20\x1f\x83\xc6\xd2\xb6\xc3\xa0\x69\xad\x7d\x0c" - "\x9a\xe2\x9a\xc7\x60\x98\xc2\x38\x68\x2c\x14\x62\xb0\xe9\x84\x1d" - "\x0c\xb2\x71\x10\x74\x6e\xf3\x18\xe4\xc5\x41\xf3\xd4\x3b\x18\x54" - "\xa1\x78\x69\x0c\xd2\xcb\x2d\x3a\xf7\x8f\xc7\x20\xdd\xdb\x3e\x06" - "\x69\x24\x4b\xd3\xaa\xd0\x62\xf9\x18\xa4\x23\xda\x0c\x83\x2a\xd4" - "\xd5\x3e\x06\x69\x83\x03\x18\x54\x18\x07\xe9\x20\x21\x06\xcd\x91" - "\x52\x18\x34\x83\x2e\x6e\xda\x32\x10\x99\xb3\x22\x73\xbd\x5c\xb4" - "\xc8\xe8\xfd\x42\x54\x79\x52\x2d\x1a\x7d\x0b\xec\x93\x78\x0b\xbd" - "\x75\x4b\x8d\x4c\x59\x91\x2b\x81\x93\x6b\x78\xfa\x99\x99\x5b\x66" - "\xcc\xd8\x97\xb6\x2e\x01\xb9\x82\xfe\x1e\x8b\x8f\x95\x5f\xac\x47" - "\xf8\xfe\x8b\xf1\xf3\x5c\xe6\x9e\x07\xe7\x09\xe8\x6b\xfe\x6a\xe6" - "\x1d\x73\xa3\x1e\x55\x85\x20\x55\x69\x95\x1e\xec\xb0\x90\xf1\x2f" - "\xb6\xcb\x45\x95\x4b\xc4\xa6\xab\xc8\xd5\xf8\xab\xa6\x27\xd8\xdb" - "\xdb\x73\x3e\x72\xf1\xad\xa2\xcd\xd8\xae\xd8\x5e\xd8\xc6\xda\x85" - "\x34\x0d\xe5\x36\x97\x01\xc6\x8c\xbf\xfa\xf7\xcc\x87\x72\xa2\x7a" - "\x55\xe5\xb2\x5d\x36\x36\x54\x2e\x71\xcc\xba\x05\x95\xcb\x88\xd2" - "\xd3\x48\xf4\xdd\x31\xd8\x2a\xcb\x41\x5b\xe5\xf2\x74\x5e\x2b\xd8" - "\x8a\x5a\xe4\x98\xad\xa8\x63\x56\xb6\xb2\xd5\x55\x2a\xea\xa4\x7c" - "\x5b\x51\xb9\xc4\x56\x54\x92\xb4\xad\x74\x0e\xe2\x4a\xa7\xe1\xe9" - "\x91\x56\xb0\x95\x6a\x9b\x63\xb6\x52\x35\x08\x6d\x25\xc2\xff\x55" - "\xae\x2e\xf2\x6d\xa5\x22\x7b\x81\xaa\x54\x05\x76\x6c\xe5\x20\xae" - "\x74\xb9\x3c\xde\xdc\x0a\xb6\x72\x3d\xe1\x98\xad\xdc\xfa\x58\xd9" - "\xca\x96\xa7\xaa\xdc\xfa\xc9\xb7\x95\x2b\xf9\x1e\x9e\xca\xb5\x54" - "\xda\x56\x61\x0e\xe2\x2a\x4c\xc3\xe3\x77\xad\x60\xab\x0e\xc8\x31" - "\x5b\x75\x18\x23\xb4\x95\x08\x9f\x52\x75\x78\x43\xbe\xad\x3a\xf8" - "\x12\x5b\xb9\xd5\xdb\xb1\x95\x83\xb8\x0a\xcb\xe5\xf1\x90\x56\xb0" - "\x55\xc7\x00\xc7\x6c\xd5\x71\xb1\x95\xad\x44\xc6\xfd\x8e\xcb\xe5" - "\xdb\xaa\xe3\x08\x62\xab\x8e\x7e\x52\xb6\x32\x65\x85\x7a\x7b\x81" - "\x0d\x1a\x72\x9e\x37\x78\x25\x23\xaa\xd1\x0f\xec\xe6\x0d\x76\x5b" - "\xa2\x05\xfe\x04\x76\x33\x18\xd1\xe8\x59\x67\xe9\xb2\x1a\x13\x6a" - "\x04\x9b\x35\x78\x87\x6a\xca\x0d\xd5\x78\xce\xd1\xb3\xe7\x55\x9d" - "\xa6\xbf\x39\x4b\x8d\xb0\xdd\xb0\x1d\xb0\xed\x68\xb0\x1b\x63\x47" - "\xef\x69\xfe\x26\xef\xb1\x81\xa3\xae\x9c\xa5\x67\xea\x69\x1a\xb7" - "\x97\xf6\x76\xcb\xc0\xef\x05\xc2\xab\x51\x27\xed\x58\xdc\xa6\x4e" - "\x3e\xf8\x78\xb9\xa1\x12\xf8\xc1\x0d\xc4\x70\xb3\xb3\xfe\xde\xa6" - "\x09\xfe\x1e\xa6\xf2\xc8\x97\xe8\xee\x1d\x0a\x8d\xdd\xc3\xd3\x52" - "\xaf\xa0\x0e\x98\x3f\xa4\x9b\x91\x66\x71\x3c\xa2\x76\xbd\x5b\x44" - "\x31\x6b\xd7\x66\xe3\x3a\xdc\xcf\x81\x5d\x34\xf4\x4d\xde\x9c\xee" - "\x9b\x31\xa8\xfc\x62\x06\xe3\x37\x6b\x8e\xc0\xf8\xed\x27\x7f\x35" - "\xf0\xcc\x40\xda\x3b\xd4\x3f\xa3\x0c\x69\xe9\x26\xb0\x71\x0a\xf3" - "\x3c\xc7\x36\x35\xca\xb5\xb1\x3b\x33\xff\xdb\xac\x65\xe7\x6f\x81" - "\x9d\xf0\xfd\x99\xf9\x5b\x89\xbc\xf9\x5b\xf0\xcc\x77\xe6\x6f\xa9" - "\xdc\x13\xf1\xfc\x2d\xf3\x59\x4d\x4f\x4b\xdb\x67\xc6\xd1\x34\xb4" - "\xbd\x5b\x59\xad\x01\xe1\xf6\x97\xd5\x16\xa1\xd4\x24\xa4\x2e\x6b" - "\xac\x46\x29\xb5\xb4\xa1\x2c\xed\x12\x0a\xbf\x85\x79\x30\xc6\x4b" - "\xa7\xc9\xc4\xaf\xee\x81\xe6\xb3\xfe\x3d\xf5\xaa\x4e\xe3\xca\x2a" - "\x10\xe2\xad\xe3\x89\x01\xce\xec\x0e\x7e\x88\x29\x4f\x3b\x8f\xc0" - "\x27\x85\xe5\xc6\x9f\xb1\x9f\x62\xe0\x7c\xc8\x1d\x7e\xdd\x7d\xec" - "\x97\xf8\x18\xf6\x19\x7e\xdf\x84\xf7\x0e\xd8\xc4\xe3\xdf\x18\x17" - "\x5e\xc9\x69\xa8\x3c\xb9\x11\x95\x19\x11\x02\x1c\x9d\xfe\x21\xb2" - "\x52\x0a\x47\x59\x04\x47\xa1\x89\x5e\xc9\x6e\x37\x1c\xc0\x51\x2e" - "\x87\xa3\x07\x76\x3a\x87\xa3\x07\x26\x3b\x8f\xa3\x07\xfa\x3a\x81" - "\xa3\x6d\x42\x1c\x79\xf8\xc8\xc7\x51\xe7\x5a\xf9\x38\xea\xbc\xdf" - "\x39\x1c\x3d\xb0\x95\xe0\xa8\x73\x32\xc1\xd1\x03\x79\x1c\x8e\x98" - "\xb5\x51\xad\x84\xa3\xce\x7e\xd2\x38\xd2\xb1\xf1\x28\x14\xe2\xd1" - "\x03\xe7\x9b\xc7\x91\x8e\x17\x8f\x3c\x6f\x39\x87\x23\xcf\xad\xce" - "\xe3\xc8\x73\x96\x72\x1c\xe9\xac\xe2\x51\x97\xc9\xf2\x71\xe4\x19" - "\x22\x1f\x47\x9e\xc8\x39\x1c\x79\x5e\x21\x38\xf2\x28\x22\x38\xf2" - "\xac\xe2\x70\xc4\xac\x37\x6b\x25\x1c\x79\xc4\xd9\xc1\x11\x1b\x8f" - "\x74\x10\x8f\xba\xfe\xe8\x00\x8e\x78\xf1\x48\xfd\x9c\x73\x38\xf2" - "\xba\xe2\x3c\x8e\xbc\x0e\x38\x81\x23\xab\x78\xa4\xde\x2a\x1f\x47" - "\x5e\xcb\xe4\xe3\xc8\x6b\x84\x73\x38\x52\x0f\x26\x38\xf2\x72\x27" - "\x38\x52\x07\x70\x38\x62\xd6\xf0\xb5\x12\x8e\xba\xec\x95\xc6\x51" - "\x18\x1b\x8f\x74\x10\x8f\x9e\x5e\xdd\x3c\x8e\xc2\x78\xf1\xa8\xdb" - "\x72\xe7\x70\xd4\x6d\xb0\xf3\x38\xea\xe6\xa2\x1c\x47\x61\x56\xf1" - "\xa8\xdb\x15\xf9\x38\xea\x5a\x2a\x1f\x47\x5d\x33\x9c\xc3\x51\xb7" - "\xc5\x04\x47\x5d\x23\x08\x8e\xba\x25\x71\x38\x62\xd6\x45\xb6\x12" - "\x8e\xd4\x46\x3b\x38\x62\xe3\x51\x18\xc4\xa3\x37\x87\x3a\x80\x23" - "\x5e\x3c\xf2\x3e\xe6\x1c\x8e\xbc\x17\x3b\x8f\x23\xef\x97\x9d\xc0" - "\x91\x55\x3c\xf2\x19\x2c\x1f\x47\xde\xde\xf2\x71\xf4\xa7\x4a\xe7" - "\x70\xe4\x5d\x4c\x70\xf4\xa7\x5c\x82\x23\xef\x83\x1c\x8e\x98\xb5" - "\xa6\xad\x84\xa3\x3f\x0d\x93\xc2\x11\xde\x8b\xe0\x23\xb2\x2f\x44" - "\xed\xba\x85\x28\x78\x13\xfe\xb7\x11\x05\xd6\xa5\xfb\xc4\x1d\x5a" - "\x44\xf6\x03\xd0\xab\x7c\x98\x7c\xaf\xd8\xf5\x0f\x6c\x07\xbf\x78" - "\x87\xaa\xc3\xcf\x90\x3d\x1a\xf0\xbe\x20\x37\x53\x63\xd0\x00\xbc" - "\x2f\x83\xaa\xfb\x16\xbc\x8f\xd5\x9d\xbd\x03\xbc\x25\xf6\x0e\x98" - "\x28\xbd\x77\x40\x63\x8e\x65\xdd\xed\x36\x6e\xdd\xad\xaa\xfb\x2c" - "\xbb\xeb\x6e\x55\xdd\xdf\xd8\x38\x51\x2e\x1e\xba\x33\xeb\xbf\x6e" - "\x76\x7f\xde\x50\x97\xde\x3d\x06\xda\xac\x23\x6d\xef\xce\xec\x1f" - "\xdc\xfc\x7a\xdc\x6d\x3c\x9c\x74\xf7\x1e\x3f\x09\xa5\xd1\xab\x4f" - "\xc6\xd0\x3e\xa1\x6a\x3a\x3b\x54\xee\xb3\x48\x7e\xff\x90\xb5\x77" - "\x86\xb8\xbd\x35\xde\xc4\xde\xec\xbe\x05\xde\x12\xfb\x16\x4c\x94" - "\xde\xb7\x40\xdc\xde\x0f\xda\x5f\xe7\xac\x7a\xf0\x88\x7c\x7b\x3f" - "\x98\x45\xec\x1d\x9a\x58\x97\xfe\x60\x25\x67\x6f\xcd\x38\xf9\xf6" - "\x7e\x70\x19\xb1\xf7\x7f\x26\x81\xbd\x33\xc0\xde\x05\xf2\x9e\x45" - "\xa3\xb5\x6f\x6f\x9d\x04\xbe\x7b\x2c\x63\xed\xcd\xe2\x5b\x62\xcf" - "\x84\x89\xd2\x7b\x26\x88\xdb\xbb\xc7\x18\xfb\xf6\xee\x31\x44\xbe" - "\xbd\x7b\xb8\xb2\xf6\x06\x7c\xf7\x18\xc1\xd9\xbb\x87\x83\xfb\x0a" - "\xf0\xed\xad\xa9\x25\xf6\xfe\x29\x82\xf6\xd1\x01\xbe\x75\x72\x9f" - "\x25\xa3\x19\x7b\x4b\xe0\xbb\x67\x2d\xb1\x37\xbb\x5f\x83\xb7\xc4" - "\x7e\x0d\x13\xa5\xf7\x6b\x10\xb7\x77\xcf\x43\xf6\xed\xdd\x73\xbb" - "\x7c\x7b\xf7\x4c\x22\xf6\xd6\x01\xbe\x7b\xee\xe7\xec\xfd\xe7\x20" - "\xf9\xf6\xee\x19\x4d\xec\x5d\x39\x0c\xec\x0d\xf8\xd6\xc9\xc4\xf7" - "\x9f\x91\x7d\x7b\x87\x49\xe0\xdb\x37\x9a\xb5\x37\x8b\x6f\x89\xbd" - "\x22\x26\x4a\xef\x15\x21\x6e\x6f\xdf\x81\xf6\xed\xed\xdb\x43\xbe" - "\xbd\xff\x5c\xc5\xda\x1b\xf0\xed\xeb\xcf\xd9\xdb\x77\x8b\x7c\x7b" - "\xff\xf9\x04\xb1\xf7\xa9\x60\xda\x27\x0c\xf0\x1d\x26\xf3\x59\x7c" - "\x13\x9b\xb1\xb7\x04\xbe\x7b\x9d\x20\xf6\x66\xf7\xa9\xf0\x96\xd8" - "\xa7\x62\xa2\xf4\x3e\x15\xe2\xf6\xee\xb5\xd9\xbe\xbd\x7b\xad\x92" - "\x6f\xef\x5e\xe3\x88\xbd\xc3\x00\xdf\xbd\x72\x39\x7b\x3f\xe4\x2d" - "\xdf\xde\xbd\x86\x11\x7b\xff\x1c\x00\xf6\x06\x7c\x87\xc9\xc4\x77" - "\x2f\xbd\x94\xbd\xbd\xc0\xde\xc5\xc0\x63\x60\x1c\xc4\xfb\x2c\xa8" - "\xc3\x4d\x42\xbb\x97\x27\x07\xa3\xfe\xb7\xb1\xed\x1f\x2e\x82\xb1" - "\x43\xd3\x66\xfb\x65\xa8\x1e\xde\xee\xf4\xda\x61\xd5\xc3\x73\x25" - "\xd7\x0e\xab\x1e\x9e\x2c\x7b\xed\xb0\xea\x61\x7f\x8e\x03\x3d\x1c" - "\xc7\xf9\x54\xcb\xc4\x0f\x59\x6b\x8a\x55\x0f\x6b\x44\xf7\xd1\x50" - "\x3d\x54\x82\xd7\x14\xd3\xab\xff\xab\x35\x67\x2b\xe1\x46\x0f\x97" - "\x3a\xe0\xeb\x5c\xf0\x43\x86\xb4\xaf\x7b\xef\x00\x5f\xe7\xb6\xd9" - "\xbe\x1d\xaa\xde\xd9\xce\xfb\xba\xf7\x54\x69\x5f\xf7\x7e\x59\xbe" - "\xaf\x7b\x7b\x73\xfc\xab\x77\x24\xe7\xeb\xde\xf2\xd7\x8f\xab\x7a" - "\xbb\x8a\xee\xe7\xa1\xd2\xee\x25\xbe\x3e\xbd\x0c\x7c\xad\x80\x97" - "\xf5\xde\xdf\xbc\xaf\x75\x78\xdf\x09\x3b\xfd\xfa\xd1\x5c\x18\x33" - "\x35\x6d\xb6\x7f\x88\xea\xd1\x25\xce\xfb\xfa\xd1\x51\xd2\xbe\x7e" - "\x74\xb0\x7c\x5f\x3f\x8a\x38\xee\xf7\xe8\x30\xce\xd7\x8f\x56\xca" - "\xf7\xf5\x23\x06\xd1\x7d\x45\x54\x8f\x14\x10\x5f\x9f\xa9\x36\x67" - "\x2b\xe1\x84\x8f\x6e\x71\xc0\xd7\xd0\xaf\x75\x76\xfa\x75\x9f\x65" - "\xe0\xeb\xdc\x36\xdb\xc7\x44\xd5\x27\xde\x79\x5f\xf7\x19\x22\xed" - "\xeb\x3e\xbd\xe5\xfb\xda\xaf\x86\xe3\x9d\x7d\x02\x39\x5f\xf7\x39" - "\x2c\xdf\xd7\x7e\xa7\x45\xf7\x37\x51\xf9\xad\x21\xbe\x3e\x3b\x12" - "\x7c\xad\x80\x8f\xf6\x91\xe4\xff\x9c\xaf\xc3\xf0\x3e\x1c\x76\xfa" - "\xf5\xe3\x89\xc0\x15\x34\x6d\xb6\x9f\x8a\xea\xf1\x37\x9c\xf7\xf5" - "\xe3\x7d\xa4\x7d\xfd\xb8\xa7\x7c\x5f\x3f\x56\xc9\x71\xde\xc7\x7d" - "\x39\x5f\x3f\x5e\x28\xdf\xd7\x8f\x95\x88\xee\xb3\xa2\x7a\x2c\x99" - "\xf8\x5a\x5f\x68\xce\x56\xc2\x85\x1f\x5f\xe4\x80\xaf\xa1\x5f\x87" - "\xd9\xe9\xd7\x7d\x41\xd7\x87\xe5\xb6\xd9\xbe\x2e\xaa\xbe\xc3\x9d" - "\xf7\x75\xdf\xae\xd2\xbe\xf6\x6f\x90\xef\x6b\xff\xc3\x1c\xdf\xee" - "\xeb\xce\xf9\xba\x6f\x9e\x7c\x5f\xfb\xef\x15\xdd\xef\x45\xe5\x1f" - "\x4d\x7c\x7d\xde\x1b\x7c\xad\x80\x87\xf7\x8d\x51\xc2\xc3\xe7\x6c" - "\x44\xee\x42\x7f\x3f\x39\xb2\x6d\xb9\xf8\x93\x83\x9d\xf7\xf7\x93" - "\x2e\xd2\xfe\x7e\xe2\x92\x7c\x7f\x3f\xb1\x97\xe3\xe2\x4f\xd4\x73" - "\xfe\x7e\x72\x8d\x7c\x7f\x3f\xb1\x45\x9c\x8b\x3f\x31\xce\x39\x2e" - "\xfe\x64\xa4\x12\x2e\x6e\xeb\xef\x7e\x21\x6d\xcb\xc7\xfb\xf5\x71" - "\xde\xdf\x01\xd7\xa5\xfd\x1d\x70\x4a\xbe\xbf\x03\xb6\x70\x7c\x3c" - "\xa0\x9a\xf3\x77\xbf\x45\xf2\xfd\x1d\x90\x25\xce\xc7\x03\x86\x39" - "\xc7\xc7\xfb\x8d\x50\xc2\xc7\x6d\xfd\x3d\x20\xa0\x6d\x39\xf9\x00" - "\x1f\xe7\xfd\xdd\xff\x9c\xb4\xbf\xfb\x1f\x91\xef\xef\xfe\x59\x1c" - "\x27\xef\xcf\xcb\x7f\x0f\x88\x93\xef\xef\xfe\xcb\xc4\x39\x79\xff" - "\x20\xe7\x38\xf9\x80\x60\x25\x9c\xdc\xd6\xdf\x03\x7d\xdb\x96\x97" - "\x0f\x74\x73\xde\xdf\x81\xc7\xa5\xfd\x1d\x78\x40\xbe\xbf\x03\x97" - "\x71\xbc\x3c\xb0\x84\xf3\xf7\x40\xf9\xfb\x67\xaa\x02\x93\xc4\x79" - "\x79\xa0\x9f\x73\xbc\x7c\xa0\xbf\x12\x5e\x6e\xeb\xef\xa7\x3c\xda" - "\x96\x9b\x0f\xba\xe5\xbc\xbf\x07\x1d\x92\xf6\xf7\xa0\xed\xf2\xfd" - "\x3d\x28\x89\xe3\xe6\x83\x78\xf9\xff\xa7\x46\xca\xf7\xf7\xa0\x68" - "\x71\x6e\x3e\xc8\xdb\x39\x6e\xfe\x94\x46\x09\x37\xb7\xf5\x77\x90" - "\xb1\x6d\xf9\x79\xd0\x05\xe7\xfd\x1d\xb4\x47\xda\xdf\x41\x1b\xe4" - "\xfb\x3b\x28\x9a\xe3\xe7\x41\xdb\x38\x7f\x0f\x0e\x91\xef\xef\xa0" - "\x71\xe2\xfc\x3c\xc8\xd5\x39\x7e\x3e\xd8\xdd\xf9\x3c\xf9\x5f\x2a" - "\x31\x37\x97\xbb\xff\x63\x79\x12\xbb\xe6\x4e\x35\x98\xdb\xff\x51" - "\xf5\x17\xe6\xdb\x2a\xa2\x7b\xcb\xa8\xfe\xd2\xa7\x5d\xef\xff\xa8" - "\x7a\xda\xfe\xfe\x8f\xaa\xa7\xe5\xed\xff\xa8\xfa\x8b\xa7\xfc\xf9" - "\xf8\x4f\x57\x72\x1a\xe1\x2f\x3c\xfd\x1f\xcc\xf4\xeb\x76\xbd\x2f" - "\xa4\xea\x69\xe1\xbe\x90\xaa\xc1\xcc\xbe\x90\xf4\xea\x5f\x93\x95" - "\x69\x91\xbf\x54\x39\xff\x5e\xe0\x99\xbd\x58\x87\xc8\xdd\x87\x92" - "\xc3\x76\xf0\x1e\x0e\xdb\xcf\x6c\x95\xc6\xf6\x33\x2e\xed\x7a\x1f" - "\x4a\xd5\x90\xe5\xf6\xb1\x3d\x24\x5a\xd6\x9e\x23\xaa\x21\xf2\xf7" - "\xbd\x51\x0d\xd9\xcb\xe9\xa1\x21\x3c\xfd\xfb\x4c\x6d\x1b\x62\x5b" - "\xd9\x7e\x4a\xaa\x21\xb9\x42\x6c\x07\x6f\x23\xd8\xbe\x50\xaa\x4c" - "\x77\x3d\x53\xe4\xfc\x7b\x90\xe7\x32\xb0\xe6\x92\xbb\x1f\x26\x87" - "\xed\x67\xd7\x72\xd8\x7e\x6e\x89\x34\xb6\x43\xce\xb4\xeb\xfd\x30" - "\x55\x21\x53\xed\x63\x3b\x44\x27\x6b\x2f\x13\x55\x48\xb1\x7c\x6c" - "\x87\x64\x70\xda\x2f\xe4\x04\x87\xed\xe7\x2a\xda\x0e\xdb\x0a\xf7" - "\xc9\x54\x85\x24\x09\xb1\xfd\xec\x32\x82\xed\x6a\xad\x32\x8d\xf9" - "\x5c\x9e\xf3\xef\x7d\x74\x71\x58\x5f\xca\xdd\x97\x93\xc3\xf6\xf3" - "\xb1\x1c\xb6\x75\x36\xfb\x42\x71\xd8\x0e\x3d\xd0\xae\xf7\xe5\x54" - "\x85\x3e\x67\x1f\xdb\xa1\xbe\xb2\xf6\x48\x51\x85\x6e\x96\x8f\xed" - "\xd0\x38\x4e\xe7\x86\x16\x72\xd8\xd6\xed\x68\x43\x6c\x2b\x8c\xdb" - "\xa1\x11\x42\x6c\x3f\x1f\x45\xb0\x7d\x39\x49\x99\x9e\xd6\x25\x3b" - "\xff\x9e\xeb\x85\x11\x58\x4b\xcb\xdd\x1f\x94\xc3\x76\xd8\x70\x0e" - "\xdb\x2f\x0c\x91\xc6\xf6\xd0\xec\x76\xbd\x3f\xa8\x6a\xa8\xfd\xfd" - "\x7f\x54\x61\x76\xf6\xff\x11\x5b\x2b\x3c\x54\xfe\xbe\x17\xaa\xa1" - "\x23\x38\x4d\x3f\x74\x0d\x87\xed\x17\x56\xb6\x1d\xb6\x15\xee\x1b" - "\xaa\x1a\x1a\x20\xc4\x76\x58\x08\xc1\x76\x4d\x89\xb2\xdc\xc1\x0b" - "\xe3\x9c\x7f\xaf\xf7\xa2\x1f\xce\x1b\xc8\xdd\xa7\x94\xc3\xf6\xb0" - "\xde\x1c\xb6\x5f\xf4\x91\xc6\xf6\xf0\x59\xed\x7a\x9f\x52\xd5\xb0" - "\x5b\xf6\xb1\x3d\xec\x84\xbc\x3d\x5d\x86\x2b\x58\x07\x3f\xdc\x8f" - "\xcb\x5f\x0c\xe7\xcd\x7f\x7f\x31\xba\x0d\xb1\xad\x30\x6e\x0f\x77" - "\x17\x62\x7b\x98\x86\x60\xfb\x9a\xaf\xb2\x3c\xc9\x8b\x81\xce\xe7" - "\x49\x5e\x0e\x64\xde\x61\xca\xdc\x2f\x95\xc3\xf6\x8b\x26\x6e\x6f" - "\xa2\x97\x7b\x5b\x63\xfb\xce\xde\x44\xaa\x11\x43\xda\xcd\x7e\xa9" - "\xaa\x97\xbe\xb1\x8f\xe3\x97\xf2\xe4\xe5\x44\x46\xf4\x96\x8f\xe3" - "\x97\x6a\xb8\x9c\xc8\x08\xde\xfc\x97\x97\x2d\xdf\x24\x6f\x83\x3d" - "\x8b\x46\x14\xdb\xdd\xb3\x48\x35\x62\x4b\xab\xed\xa3\xaa\x7a\xa9" - "\x42\xb0\x67\x91\xea\xc5\x5a\x33\xd3\x17\xae\x27\x2a\xcb\xab\xbc" - "\x1c\xe2\x7c\x5e\x65\x24\x79\xbf\x2b\x73\xdf\x56\xae\x2f\xbc\xd2" - "\x89\xeb\x0b\x23\xfb\x49\xf7\x85\x57\x87\xb7\x9b\x7d\x5b\x55\xaf" - "\x1c\xb1\xdf\x17\x5e\xd9\x26\x2f\x87\xf2\xaa\x82\x7d\x60\x5e\xa9" - "\xe7\x72\x28\xaf\x86\x70\x7d\x61\xe4\xa2\xb6\xeb\x0b\xaf\x1e\xb7" - "\xdf\x17\x5e\x2d\x6c\xb5\xfd\x5c\x55\xaf\x9c\x16\xf6\x85\x57\x10" - "\xe9\x0b\x37\x6b\x95\xe5\x61\x46\x2a\x7a\xff\x2d\xec\x0b\xe1\x23" - "\x98\x77\xdf\x32\xf7\x8f\xe5\xfa\xc2\x28\x1f\xae\x2f\x84\xdb\xf0" - "\x79\xae\x2f\x8c\x1e\xd3\x6e\xf6\x8f\x55\x8d\x3a\x69\xbf\x2f\x8c" - "\xda\x2b\x2f\xe7\x32\x7a\x88\xfc\xbe\x30\x9a\xb7\xfe\x69\x34\x6f" - "\xfd\x53\xf8\xca\xb6\xeb\x0b\xa3\xcf\xd8\xef\x0b\xa3\x0f\xb6\xda" - "\xbe\xb2\xaa\x51\xd5\xc2\xbe\x30\xca\x83\xf4\x85\xdb\xc9\xca\xf2" - "\x36\xe1\x0e\xf0\xff\xe6\xf2\x36\xf0\x2c\x3e\xcc\xbb\x7e\x59\xfb" - "\xd8\x72\x7d\x21\xa2\x37\xd7\x17\xc6\x0e\x97\xee\x0b\x63\x26\xb7" - "\x9b\x7d\x6c\x55\x11\xe7\xec\xf7\x85\x88\x22\x79\x39\x9a\x31\xc3" - "\xe5\xf7\x85\x31\x6a\x2e\x47\x33\x66\x1c\xd7\x17\xc6\x66\xb5\x5d" - "\x5f\x18\x73\xc9\x7e\x5f\x18\x53\xd2\x6a\xfb\xdb\xaa\x22\x6a\x85" - "\x7d\x21\x42\x43\xfa\x42\xbd\x51\x59\x9e\x67\x6c\x94\xf3\x79\x9e" - "\xf1\x51\xcc\x9c\x09\x99\xfb\xe9\x72\x7d\xe1\xb5\x7e\x5c\x5f\x18" - "\x3f\x46\xba\x2f\x8c\x8b\x6d\x37\xfb\xe9\xaa\x5e\xbb\x62\xbf\x2f" - "\xbc\x56\x2a\x2f\xa7\x33\x6e\x8c\xfc\xbe\x30\xce\x97\xcb\xe9\x8c" - "\x8b\xe2\xfa\xc2\xf8\x82\xb6\xeb\x0b\xe3\x6e\xd9\xef\x0b\xe3\x4e" - "\xb4\xda\x3e\xbb\xaa\x71\x48\xd8\x17\x5e\xf3\x23\x7d\xa1\x29\x4d" - "\x59\x5e\x68\x7c\x9c\xf3\x79\xa1\xc8\x38\x66\x3e\x89\xcc\x7d\x7d" - "\xb9\xbe\xf0\xfa\x10\xae\x2f\x44\x4a\x7f\xe7\x41\x35\x61\x6e\xbb" - "\xd9\xd7\x57\xf5\xba\xfd\xef\x1f\xa9\x5e\xb7\xf7\xfd\x23\x91\x1c" - "\xd0\x84\xc9\xf2\xfb\xc2\x04\x7f\x2e\x07\x34\x81\xb7\xfe\x2f\x72" - "\x47\xdb\xf5\x85\x48\xfb\xdf\x7f\x50\x4d\x70\xe0\xfb\x0f\x0a\xf7" - "\xfb\x55\x4d\xf0\x10\xf6\x85\xd7\x03\x49\x5f\x30\xbb\x2a\xcb\x23" - "\x45\x36\x9b\xff\xc7\x3a\xbf\xc9\xdb\x36\x8f\x54\x5a\x15\x8c\x9e" - "\x9c\x88\xfb\xc2\x44\xad\x31\x3b\x54\x83\xf7\x17\x36\xf9\xb1\x7b" - "\x50\x2e\x61\xf7\x78\xa9\x35\x92\x3d\x28\x0d\xa6\x3b\x7b\x50\x92" - "\xbd\x3f\x10\x85\xd7\x02\xe3\x35\xc1\x46\x35\xd9\x7f\x92\xc6\x73" - "\xa2\xf0\x1c\xa9\xf3\x25\xcc\xfe\x2a\x8b\x8c\xd0\xf6\x8b\xcd\xec" - "\x3f\x19\xa5\x47\xa5\x51\x0b\x91\xb1\xeb\xbe\x34\xb2\x4e\xf8\x8d" - "\x42\x66\xff\xc9\x29\x9a\x9e\xe9\xbf\x20\x6f\x2f\xbc\xff\x64\x14" - "\x6d\x4e\xd5\xd3\x86\x32\x50\x9a\xa5\x51\x60\xdf\xa9\x96\x3d\x28" - "\x27\xf6\xc0\x6d\x37\x4e\xf1\xef\x99\xff\x8b\xd4\xfe\xc2\x13\x15" - "\xec\x03\xfb\x46\x29\x97\xdf\x99\xa8\xe6\x30\x3a\x91\x19\x83\xe1" - "\xfc\xb6\xd2\x48\x88\x31\xe9\x68\x65\x93\xa2\xbd\x37\x26\x06\x38" - "\xe0\x33\x3c\x47\xc4\x26\x7e\x71\x3e\x7b\xf3\x04\xf8\x2c\x17\xef" - "\x73\xec\xb8\xcf\xdc\x6e\xb4\x8e\xcf\xde\x8c\x76\xdc\x67\x6f\x1e" - "\xb3\xf2\x99\x48\x1e\xe2\xcd\x7d\xf2\x7d\xf6\x66\x1a\x97\x87\x78" - "\xf3\x30\xe7\xb3\x49\xde\xc4\x67\x6f\x4e\x22\x3e\x73\xd9\xdb\xa4" - "\x68\xff\x8e\x37\xf5\xcd\xfb\x8c\x99\xfb\x60\xa7\x9f\x4d\x5e\x69" - "\xcc\x06\xed\x0e\xba\xdc\x71\x9f\x3d\x70\xbe\x75\x7c\x36\x59\xe3" - "\xb8\xcf\x26\x2f\x11\xfa\x4c\x4c\x2f\x4f\x96\xff\xcd\x4e\xd5\xe4" - "\x20\x4e\x2f\x4f\x4e\xe6\x7c\x36\xb9\x84\xf8\x6c\xb2\x9a\xf8\x8c" - "\xd2\x37\x29\xda\x03\x64\x72\x96\x03\x3e\xc3\xef\xf4\xed\xf4\xb3" - "\x29\x21\xe0\xb3\x5c\xbc\xef\xb3\xe3\x3e\xeb\xfa\x63\xeb\xf8\xec" - "\xad\x52\xc7\x7d\x36\x65\xb0\x95\xcf\x44\x74\xdd\x94\x5e\xf2\x7d" - "\xf6\x56\x35\xa7\xeb\xa6\x04\x70\x3e\x9b\xb2\x88\xf8\xec\xad\xc3" - "\xc4\x67\xae\x1e\x4d\x8a\xf6\x11\x99\xd2\x6c\xfe\x0b\xf3\xd0\x26" - "\x6f\x5b\x9d\xc3\xf9\x2c\xca\x60\xcc\x06\x2d\x04\x3a\xc7\x71\x9f" - "\x3d\xbd\xba\x75\x7c\x16\x95\xe6\xb8\xcf\xa2\x2e\x09\x7d\x26\xa6" - "\x3f\xa2\x8e\xcb\xf7\x59\x54\x1e\xa7\x3f\xa2\xf4\x9c\xcf\xa6\x06" - "\x12\x9f\x45\x25\x13\x9f\xb9\x05\x37\x29\xda\x8b\x24\xca\xe8\x80" - "\xcf\xf0\x3b\x58\x3b\xfd\x6c\xda\x16\xf0\x59\x2e\xde\x07\xdb\x71" - "\x9f\xbd\x39\xb4\x75\x7c\x36\x2d\xc8\x71\x9f\x4d\xdb\x68\xe5\x33" - "\x11\x9e\x3c\x4d\xc1\x3e\xd8\xd3\x22\x38\x9e\x3c\x2d\x8b\xf3\xd9" - "\xb4\x2a\xe2\xb3\x69\x01\xc4\x67\x1d\xa2\x9b\x14\xed\x67\x32\x4d" - "\x72\xff\x2f\x7b\xbc\xd1\x32\x2f\x9f\xf3\x5b\xf4\xa4\xf6\xc3\x1d" - "\xdf\xae\x71\xdc\x6f\xd1\xe3\x9b\xe7\x8e\xd1\xcf\xc9\xf7\x5b\xb4" - "\x3b\xc7\x1d\xa3\x47\x72\x7e\x8b\xce\x23\x7e\x7b\xbb\xca\x39\xee" - "\x18\xdd\xec\xfa\x57\x31\xee\x68\xeb\xb7\x19\xde\xed\x87\x3f\x4e" - "\xdf\xe2\xb8\xdf\x66\x78\x36\xcf\x1f\xa7\xdf\x92\xef\xb7\xe9\x45" - "\x1c\x7f\x9c\xe1\xca\xf9\x6d\xc6\x38\xe2\xb7\xe9\x79\xce\xf1\xc7" - "\x19\x5a\x25\xfc\xd1\xd6\x6f\xef\x94\xb6\x1f\x0e\xf9\xce\x24\xc7" - "\xfd\xf6\x4e\x71\xf3\x1c\xf2\x9d\x9d\xf2\xfd\xf6\x4e\x32\xc7\x21" - "\xdf\x39\xc8\xf9\x2d\xc6\x83\xf8\xed\x9d\x71\xce\x71\xc8\x77\x2a" - "\x95\x70\x48\x5b\xbf\xc5\x2e\x6b\x3f\x3c\x32\xd6\xdb\x71\xbf\xc5" - "\x2e\x6e\x9e\x47\xc6\xca\xff\x66\xb1\x2a\x36\x90\xe3\x91\xb1\x49" - "\x9c\xdf\x62\xd9\x6f\xb0\xc4\x7a\x38\xc7\x23\x63\x9b\xdd\xff\x43" - "\x8c\x47\xda\xfa\xed\xbd\x90\xf6\xc3\x25\xdf\x95\xc1\xff\xdf\xb3" - "\xe2\xff\x62\x5c\xf2\x3d\x05\xfc\xff\x5d\x0b\xff\x87\xfe\xf6\x1e" - "\x8f\xff\xbf\xc7\xf2\xff\x77\x0f\x3b\xc7\x25\xdf\x73\x84\xff\xdb" - "\x70\x49\x5b\xbf\xc5\xd5\xb6\x1f\x3e\x19\xb7\xcc\x71\xbf\xc5\x5d" - "\x69\x9e\x4f\xc6\x29\xf8\x0e\x54\x5c\x01\xc7\x27\xe3\xaa\x38\xbf" - "\xc5\x07\x11\xbf\xc5\x2d\x72\x8e\x4f\xe2\x4f\xdb\xd9\xf7\x9b\xc9" - "\x3b\x54\x43\x8b\xe4\x21\x8f\xc5\x04\xb3\x7b\x13\xce\x3c\x6c\xf2" - "\x09\xd5\xc8\xfd\xbe\x8b\x65\xcf\xe9\x23\xc0\x8c\xce\xab\x66\x4e" - "\x76\x6e\xdf\xe9\x99\x9e\xce\xef\x3b\x9d\x70\xaa\xe5\xbe\xef\x92" - "\x70\x48\xfe\xbe\xd3\x09\x6b\x38\x0e\x9a\x50\xc1\xf9\x3a\x91\x99" - "\x9f\x20\x6f\x3f\xea\x84\x08\xe7\xf6\xa3\x9e\x39\x9e\xe0\x2b\x41" - "\x4d\xf6\xa3\x9e\x39\xb2\x6d\xbe\xfb\x12\x7f\x10\xef\x47\x4d\xa7" - "\x77\xcc\x50\xb6\x3f\xf2\xcc\x0a\x07\xf0\x9c\x4b\x8b\xe4\x68\x39" - "\x3c\xcf\xce\x02\x3c\xe7\xca\xfd\xce\x8c\x10\xcf\xb3\xfb\x39\x87" - "\xe7\x59\x67\x9c\xc7\xf3\xac\xed\x2d\xf7\x9d\x99\x59\x99\xf2\xf1" - "\x3c\x6b\x12\xc7\xcd\x67\x15\x70\x78\x9e\x7d\x42\x3e\x9e\x67\x69" - "\x9d\xc3\xf3\xec\x3e\x04\xcf\x89\x7a\x82\xe7\xd9\xbe\x6d\xf3\xfd" - "\x99\xc4\x35\x04\xcf\x9d\x2a\x95\xed\x3f\x3d\xbb\xa0\x79\x3c\xeb" - "\x34\xb4\x48\xfe\x9a\xc3\xf3\xdc\x68\x93\x8f\x4e\x23\xf7\x7b\x37" - "\x42\x3c\x27\x99\x9c\xc3\x73\xd2\x4e\xe7\xf1\x9c\xb4\xa0\xe5\xbe" - "\x77\x93\x34\x55\x3e\x9e\x93\x02\x38\xcd\x92\x94\xc8\xe1\x79\xee" - "\x16\xf9\x78\x9e\x63\x70\x0e\xcf\x49\xb7\x08\x9e\xe7\x14\x12\x3c" - "\x27\xd5\xb4\xcd\x77\x70\xe6\x4c\x22\x78\xf6\xd0\x2a\xdb\xdf\x7b" - "\xae\xe4\xfe\xc7\x3c\x3c\xe7\xd2\x22\xb9\x7d\x0e\xcf\xc9\x41\x80" - "\xe7\x5c\xb9\xdf\xdd\x11\xe2\x79\xbe\x93\xdf\xb9\x98\xdf\x02\xdf" - "\xb9\x98\xef\xc4\x77\x2e\xac\xbf\xbb\x33\x7f\xa0\x7c\x3c\xcf\x33" - "\x72\x5a\x6e\xbe\x8e\xc3\x73\x72\x92\x7c\x3c\xcf\x2b\x72\x0e\xcf" - "\xf3\xd9\xef\x5f\xcc\x4b\x23\x78\x9e\x7f\xb0\x6d\xbe\xc7\x33\x2f" - "\x80\xe0\xb9\x4b\x8c\xb2\xfd\xd3\x93\x75\xcd\xe3\x39\x4c\x43\x8b" - "\xbc\xf7\xe0\xf0\xfc\xbe\xab\xc9\x27\x4c\x23\xf7\xfb\x3f\x42\x3c" - "\x2f\xdc\xe8\x1c\x9e\x17\x8e\x72\x1e\xcf\x0b\x7b\xb4\xdc\xf7\x7f" - "\x16\xba\xc8\xc7\xf3\x82\x52\x4e\xe3\x2e\xe4\xbd\xff\x7f\x7f\x98" - "\x7c\x3c\x2f\x70\xf2\xbb\x40\x0b\xb3\x09\x9e\x17\xb0\xdf\x05\x5a" - "\xb8\xa6\x6d\xbe\x0b\x94\x6c\x24\x78\x56\x17\x2a\xdb\x9f\xfe\x7d" - "\xb5\x03\x78\xce\xa5\x45\xde\x09\x71\x78\x5e\x7c\x02\xf0\x9c\x2b" - "\xf7\x3b\x44\x42\x3c\x2f\x8e\x77\x0e\xcf\x8b\x7b\x39\x8f\xe7\x45" - "\x97\x5a\xee\x3b\x44\x8b\x8e\xcb\xc7\xf3\xa2\x3c\x4e\xfb\x2f\xe2" - "\xbd\xff\x4b\x51\xf0\x7d\xa2\x45\x51\xce\xe1\x79\xf1\x74\x82\xe7" - "\x45\x5a\x82\xe7\xc5\x93\xda\xe6\xfb\x44\xef\x97\x12\x3c\x77\xab" - "\x57\xb6\xff\xff\xe2\x66\xe7\x7f\x88\xe5\x37\x2c\x79\x29\x0e\xd3" - "\x69\xdb\x9c\xcf\x71\xa4\x85\x39\x87\xe9\xd4\xeb\xce\x63\x3a\xf5" - "\x9b\x96\xcb\x71\xa4\x2a\xf8\xd6\x5f\x6a\x22\x97\xe3\x48\xdd\xcb" - "\x61\x3a\xad\x5a\x3e\xa6\x53\x83\x9c\xc3\x74\xda\x10\x82\xe9\x94" - "\x5a\x82\xe9\xb4\xc0\xb6\xc9\x71\xa4\x14\x38\x97\xe3\x48\xdb\xab" - "\x24\xc7\x61\x8b\xe9\x0f\x16\x39\x9f\xe7\xf8\xc0\xc7\x39\x4c\x2f" - "\x2d\x76\x1e\xd3\x4b\x33\x5b\x2e\xcf\xb1\x74\x81\x7c\x4c\x2f\x1d" - "\xc6\xe5\x39\x96\xae\xe4\x30\xfd\xc1\x41\xf9\x98\x5e\xea\xee\x1c" - "\xa6\x3f\xf0\x24\x98\x5e\x52\x42\x30\xfd\x81\x6b\xdb\xe4\x39\x96" - "\x24\x39\x97\xe7\xf8\x60\xa5\x92\x3c\x87\x2d\xa6\x57\x44\x38\x9f" - "\xeb\x58\x7e\xc9\x39\x4c\x2f\xdf\xe0\x3c\xa6\x97\x4f\x6f\xb9\x5c" - "\xc7\xf2\x51\xf2\x31\xbd\x5c\xc3\xe5\x3a\x96\x4f\xe2\x30\xbd\x22" - "\x43\x3e\xa6\x97\x9d\x76\x0e\xd3\xcb\xcf\x11\x4c\x2f\xcb\x23\x98" - "\x5e\x5e\xd9\x36\xb9\x8e\x65\x23\x9c\xcb\x75\xac\x98\xa4\x24\xd7" - "\x61\x8b\xe9\x55\x7e\xce\xe7\x3b\x56\x7e\xe3\x1c\xa6\x57\xc6\x3b" - "\x8f\xe9\x95\x43\x5a\x2e\xdf\xb1\xb2\xb7\x7c\x4c\xff\x0f\xef\xfb" - "\x17\x2b\x79\xeb\xff\x57\x45\xcb\xc7\xf4\xff\x14\x3a\x87\xe9\x95" - "\xfb\x08\xa6\xff\x27\x91\x60\x7a\xe5\x8e\xb6\xc9\x77\xfc\x8f\xaf" - "\x73\xf9\x8e\x55\xcd\xee\x7f\x21\x96\xef\xb0\xc5\xf4\x87\xf5\xce" - "\xe7\x3c\x3e\xcc\x74\x0e\xd3\x1f\x86\x39\x8f\xe9\x0f\x3d\x5b\x2e" - "\xe7\xb1\xfa\x96\x7c\x4c\xaf\x2e\xe2\x72\x1e\x1f\xf2\xe6\x3f\xad" - "\x09\x96\x8f\xe9\xd5\xcb\x9c\xc3\xf4\x87\xab\x08\xa6\x57\x0f\x23" - "\x98\xfe\x30\xad\x6d\x72\x1e\xab\x0c\xce\xe5\x3c\xd6\xb8\x2a\xc9" - "\x79\xd8\x62\x3a\xbd\xd4\xf9\xbc\x47\xfa\x74\xe7\x30\x9d\xee\xe3" - "\x3c\xa6\xd7\x9e\x6b\xb9\xbc\xc7\xda\x23\xf2\x31\xbd\x36\x8b\xcb" - "\x7b\xac\xe5\xed\x7f\xbf\xce\x43\x3e\xa6\xd7\x46\x3a\x87\xe9\xf4" - "\xc9\x04\xd3\x6b\x35\x04\xd3\xe9\xe3\xda\x26\xef\xb1\xe6\xb0\x73" - "\x79\x8f\x74\x9b\xf9\x6f\x73\xa6\x27\x44\x6b\x67\xce\x98\x31\x67" - "\x7a\x92\x76\x4e\x5c\xec\xdb\xd3\x9f\xeb\x63\xf9\xff\x73\x81\xc9" - "\x7d\x92\x3b\xa3\xe8\xf8\xa9\x53\xe6\x0d\xe2\x4e\xc6\x4d\x4f\x80" - "\x7f\x3a\xa3\x98\xa9\x73\x62\xb4\x49\x0b\x12\xa7\x6b\xf1\xff\xe2" - "\xdf\x4e\x84\x22\x33\x93\xb8\x23\x63\xa7\xc7\x4d\x4d\x8e\x4d\x78" - "\x47\x3b\x35\x2e\xf6\x9d\x84\xf8\xe9\x09\x49\xda\xd9\xd3\x67\xcd" - "\x8d\x9d\x3d\x1d\xff\x3d\x47\x3b\x63\xe6\x6c\x38\xf0\xf6\xf4\xd8" - "\x79\xd3\xb5\xd3\xe6\xce\x98\x31\x7d\xf6\x9c\xce\x68\xd4\xdc\xb8" - "\xa4\xd8\xc4\xb8\xe9\xda\x61\xa3\xc2\xfa\x8d\x1b\xfe\xda\xb8\xd0" - "\xd0\xce\x88\xf7\xed\x69\x2d\x9d\x35\x4d\x0b\x18\x72\xbd\xa8\xfa" - "\xc4\xb3\x0c\xd8\xe8\x5a\xc0\xe6\xba\xd9\x48\xbd\x7a\x36\x72\x5d" - "\x75\x03\xb9\xaf\xbd\x81\x3c\xcc\x39\x6e\xb9\xda\x77\x91\x8e\xee" - "\x3a\x2f\x71\xdd\x0d\xe4\x6d\xce\xfc\xd2\x40\x67\xee\x2a\x34\x74" - "\xfd\x6b\x01\x2e\x4b\x77\xcd\xa9\xc0\xc7\xc1\x17\xae\x74\xe6\xbe" - "\xa8\xf3\xaa\x8f\x4b\x0d\x5d\x73\xd3\x52\x2f\x21\x8a\xee\x92\x11" - "\xbc\xcb\x6c\xa0\x0e\xe1\xb7\x1d\x60\x2b\xa4\xca\x8c\x80\x5f\x08" - "\xfc\x6a\xe0\x67\x44\xaa\xf5\x23\xe0\x97\x08\xbf\x64\xf8\x55\x21" - "\xd5\x47\xfe\xf0\x8b\x84\x5f\x34\xfc\xe0\xd8\x47\x6b\xe0\x97\x85" - "\x54\x59\x70\x3c\x0b\xca\x66\xc1\xb9\xac\x44\x52\x4f\x16\x9c\xcf" - "\xaa\x47\xaa\x6c\x2d\xfc\x82\xe1\x07\x75\xe6\x78\xc0\x2f\x17\x7e" - "\x7e\xf0\x0b\x84\x1f\x1c\xcf\x19\x07\x3f\x5c\x76\x11\x39\xf7\xd7" - "\x61\xf0\x4b\x83\x5f\x01\xfc\x0e\xc2\xcf\x80\x54\xb9\xae\xf0\x53" - "\xc3\x4f\x03\x3f\x78\xbe\x5c\x28\x93\x0b\xf7\xca\xc5\xe7\xe0\x1e" - "\x1b\x7c\xe1\x97\x04\xbf\x4a\xa4\xfa\x38\x00\x7e\xa5\xec\x0f\x8e" - "\x7d\xbc\x8d\xf7\xff\xc3\xbc\xbf\xc5\x7e\x55\x5e\x4b\x1e\xd6\x17" - "\x3d\x61\x84\x7e\x9b\xb9\x93\x5e\x8a\x54\x74\x66\x6e\x5a\xe2\x13" - "\xc8\xe5\xb2\x2a\x73\x41\xf9\x32\x84\x68\xf5\xae\xc2\xa2\x85\x8d" - "\xf8\xfc\x02\x6c\xb3\xba\xf4\xcc\x64\x3d\x4a\xd4\xe0\xfe\x29\x0f" - "\x9f\x99\xc9\xec\xf5\xfb\xf5\x2e\x6a\x35\xbe\x9e\x5e\xff\x6c\x24" - "\x9d\x1a\xf9\x09\x5e\x87\x0b\xf5\x47\xe0\x75\xba\x74\xc6\x33\x15" - "\xb4\x7a\x70\x34\x8e\x31\x45\x0b\x99\xe7\x1a\x43\xfa\x23\x9c\x87" - "\x67\x33\xf8\xb8\xe5\x42\xff\x73\xc5\xff\xa7\xc1\xe7\x74\x41\xbc" - "\x3b\x89\x3b\xeb\x19\xfd\xd2\xe8\xf3\x7a\x04\x3e\xd7\xb0\x75\x00" - "\xc4\x89\xb0\xdc\xa2\x84\x46\x54\xa5\xca\x1c\x05\x6d\xa3\x20\x06" - "\x52\xf4\x63\x03\x90\x39\xe7\xf5\x88\x03\x80\x03\x5c\xee\xeb\x94" - "\x6a\xfc\xef\x48\x7c\x9e\xce\x9a\xa0\xc1\x79\xa0\xa2\x94\x4f\x21" - "\x2e\x67\x8e\x69\xf4\x89\x33\x68\xc7\x7a\xd1\xe7\xc9\xb3\xe1\x72" - "\x55\x96\x67\x69\xf4\x71\x2b\xc0\xf5\xd3\xda\xf8\x42\x38\xe7\x6a" - "\xce\xfc\x6b\x01\x3c\x87\xcb\x55\xb8\x8e\x86\x67\x2c\x1a\x8b\xef" - "\xbb\xfe\x0c\x3c\x2b\x95\x3a\x06\xea\xfe\x34\xbe\x70\xf7\xc2\x7a" - "\x0a\x9f\x33\x67\xb9\xe5\x02\xde\x3d\xe8\xf4\x75\x9a\x8f\xbb\x21" - "\xd7\x4d\xeb\x11\xca\x5f\x8f\xdc\xeb\xd2\xd7\x9f\xd0\xbb\x6a\xab" - "\x48\xec\xcb\x8c\xa0\xa0\x8c\x5e\xb5\xbe\x90\x06\xfc\x32\xf7\xf2" - "\x1e\x93\x21\x7d\xaf\x8f\x7a\xdf\xb9\x57\xce\x98\x0c\x7c\x2f\xc6" - "\x46\x70\x9e\xd8\x8a\xd4\x61\xde\x32\xa0\x10\xdb\x0f\xdb\xce\x52" - "\x87\x39\xfb\xce\xf3\x86\xe1\xeb\xf5\xaa\x8f\xbc\xe9\xbf\x0d\x28" - "\x34\xe7\x44\x16\xc2\xb5\x06\x7c\xde\x6b\x09\xaa\xa5\xe1\x5f\x7c" - "\x7f\xe2\x0b\xb0\x3d\x95\x86\x70\xfd\x34\x7b\x8c\x86\x63\x70\xed" - "\x24\xf3\x52\x2d\xc2\x63\x53\x8d\x2a\x8b\xc9\x4d\xd0\xea\x10\x7f" - "\xe2\xe3\x8f\xf6\x2d\xa8\xa0\xcd\xf0\x33\x0d\xa8\x40\x2e\x45\x63" - "\xb1\x7f\x3f\x3a\xa1\x1d\xdd\x11\x6c\xfc\xd1\xc9\x3b\xb6\xed\x1d" - "\xbf\x0d\xec\xa3\xde\xd4\x0d\xfa\xfb\x8a\xce\xee\x34\xa5\x45\xd8" - "\x3f\xd8\x56\x60\x27\x04\xc7\xdd\x31\x4e\xeb\xd2\xb3\x5c\xad\xec" - "\xa5\x7e\x65\x4c\x2a\xcd\xab\xfb\x18\x4d\xfc\x16\xc1\x96\x0f\xd2" - "\xbb\x74\x66\xc6\x16\xed\x23\x0c\xe6\xc6\xb0\x7e\x65\xb0\x85\xed" - "\x47\xfb\x4c\xd3\xe2\xff\x8f\xef\x8b\xd4\x5e\x15\x88\xd2\xa6\xf8" - "\xed\x27\x58\x98\xa0\xb1\xe0\x84\x69\x63\xce\x0b\x31\xa6\xa5\x30" - "\xd6\xde\xc1\x5f\x56\xa1\x29\x33\x44\x0b\xe5\x2a\x1a\xb2\x23\x32" - "\xe8\x8c\x10\x2d\x5e\x7f\x7e\x5e\x95\xb5\x9d\xb1\xc1\x52\x77\x44" - "\x9e\x23\xc4\x2f\x25\x8e\x36\xa4\x5c\x87\x7b\x75\x9f\x50\xf1\xf5" - "\x3c\x03\xf8\x2b\x22\x03\xe3\xe1\xc0\xed\x7a\x0a\xef\x09\x48\x77" - "\x59\xf7\x4c\x3e\xb4\x75\x23\x60\x02\xda\x8a\x70\xbd\xf0\xec\x06" - "\xae\xad\x59\x59\x18\x1b\x70\x8f\x60\x72\x6f\xa8\x77\x29\xdc\x23" - "\x33\x24\xb8\x2e\x3d\x5b\xa3\x77\xd9\xb7\xcc\x62\x13\xe6\xde\x5c" - "\x39\xb6\x2f\x65\x7b\x18\xba\x86\x04\x37\xcd\xa3\x2b\xd6\xfd\x0c" - "\xf5\x2f\x45\x74\xe3\x6d\xba\x74\x51\x04\x5d\x9f\xfe\x3a\x9e\xe7" - "\x78\x1a\xa5\x4e\x45\xbe\x0f\x2c\xa1\x0d\xe1\x26\xe4\xf5\xc0\x69" - "\x2f\xfa\x58\xc4\x69\xe6\xdb\x08\x8b\x2a\xe8\xea\xb2\xc4\x83\x68" - "\xd1\x05\xe4\xb1\x38\x16\x79\xa7\x46\x40\x5b\x4a\xe9\xfa\xf2\xe4" - "\xd3\xa8\xac\x16\x7e\x89\xc7\xa0\xdc\x49\xf8\x1d\x44\xa9\x0b\x90" - "\xeb\x68\x18\xf7\x52\x6e\x21\x8f\xb2\xc4\x5b\x70\xec\x0a\x5a\x14" - "\x45\x1b\x8f\x95\xe2\x72\xc5\x28\xdc\x68\xf0\x5a\x7c\x05\x7c\xfa" - "\x3a\x5e\xd3\x7d\x06\x6d\x82\x67\x69\xec\xfa\xa5\xbe\x21\x73\x5f" - "\xcc\xcd\x79\xb4\x11\xda\x52\xa5\x47\xcf\x16\x09\xda\x82\x9f\xb9" - "\x11\xe1\xbd\x9b\x5c\x70\x19\x73\x76\x78\xe2\x14\x23\x8e\x2f\xd9" - "\x95\xc0\x3b\x90\xe5\x3c\x3e\x67\xf0\x09\x4f\xd4\xab\x72\x5c\xc3" - "\x8d\x74\x1d\xb6\x0f\x6e\x37\xd8\x28\x88\x6d\x7f\x90\x2a\x11\xb9" - "\xd6\xa5\xe7\x8c\xd0\xbb\xec\x8f\xc2\xf7\x80\x3a\x3b\xc0\x7d\x4e" - "\x63\x6c\xb0\xe7\xa2\xf5\x2e\xff\xd8\xc6\xe1\xe5\x23\x2d\x60\xa4" - "\x83\xe5\x59\xe0\xfc\x32\xbd\xcb\x57\x85\x3c\x3c\x61\x7c\xdc\x39" - "\xcf\x8e\x67\xf8\x78\x95\x19\xc7\x56\xf5\xe0\x60\x93\xcf\x04\x2d" - "\xed\xd3\x21\x90\xbe\xa9\xf1\xa0\x29\xba\x7e\xb4\x91\xae\x37\x67" - "\x0f\xc5\x63\x99\x47\xb9\xb1\x16\x91\xf2\x7f\xed\x4b\x67\x77\x08" - "\x26\x73\x48\xff\xda\x15\xd7\x09\xdc\xa6\x22\xfd\x06\x52\x87\x57" - "\xd0\xf5\xb8\xff\x9a\xb3\xbb\x14\xa6\xcf\x46\xde\x74\xf6\x04\xb5" - "\xd9\x67\xac\xb6\x61\x73\x3c\xc6\x57\x32\xc6\x2f\x9d\xd5\x21\xd8" - "\x52\x0f\xdc\xd7\x0d\x6c\x50\x6d\x86\xeb\xe9\xac\xa1\x89\xec\xf3" - "\x30\xf1\x90\xc4\xd1\x9c\x6a\xba\x0f\x9c\xcb\x18\x1c\x02\xe7\xdc" - "\xce\xab\xfe\x9a\x04\xc7\x11\xfc\x3f\xa9\x28\xe5\x06\xae\x63\x01" - "\xc1\xd0\xe0\x60\xc1\xff\x29\x6c\xcf\x8f\xe2\x70\xff\x27\x3c\xf4" - "\xaf\x1b\xb8\x7e\xc7\xb4\x97\x22\x71\x72\x28\xf4\xbb\xbf\xee\xd0" - "\xbb\xfc\x29\x8e\xb5\xb1\x4b\x2d\x89\x49\x06\xf3\xe6\x78\xf7\xef" - "\xc0\x52\xdf\x95\x22\x04\x65\x2a\xf4\x2e\x3e\x69\x9c\x2d\xff\x7a" - "\x09\x97\x65\x9e\x13\xfa\xa6\x79\x29\x3b\x06\xc0\x35\xd0\x6f\x8a" - "\x70\xcc\x21\xb1\xed\xaf\x55\x38\xee\x40\xbf\xf3\x67\xe3\xfe\x4a" - "\x78\xae\x45\x74\xb7\x99\x05\xf0\x5c\x69\xe7\xd9\x67\xe1\x3f\x9b" - "\x25\xce\xd0\x99\x89\x5a\x52\x36\x44\x57\x97\x9e\x1b\xa1\x77\xe9" - "\x1e\xc9\xc7\x1a\x69\x57\x6e\xf1\x80\x52\xf8\x1b\x78\x89\xa5\x2e" - "\xe8\xab\xee\xd0\x47\xc7\x62\x4c\xe1\xfe\xb9\x61\x3d\xe6\x1a\x89" - "\xfe\x0d\x99\x89\x81\x50\x4f\xae\xa5\x9f\x9a\xe7\xd1\x95\xe0\x57" - "\x64\xbe\x4d\x9f\x58\x07\xbe\x0c\x37\xa9\xe8\x29\xa6\x00\x04\xbc" - "\xd5\xb8\x09\x8e\x6f\x9a\x87\x79\x5f\xf6\x09\xe8\xcb\xee\xe2\x65" - "\x5d\x11\x2e\xc7\x94\x67\xcb\x36\x76\x4d\xf4\x67\x9e\x99\x52\x99" - "\xe1\xf9\x5c\x2c\xcf\xd4\xd8\x35\x24\xa0\x2e\x7d\x83\xb7\xde\xc5" - "\x35\x4e\xd0\x5f\xd6\x07\x45\xd2\x74\x24\xc6\x95\xea\xa2\x6a\xc3" - "\x10\xf8\xb7\x23\x8b\xe3\x07\xbe\x03\x5e\x3b\x6c\x14\xf4\x15\xf0" - "\xf7\xc7\xdd\x69\xd0\x93\x1b\xc6\xe9\xd1\x94\x2c\x7c\xfd\x6a\xf8" - "\x3f\x3e\x8e\xcb\xc0\xf1\x38\x3d\x8a\x62\x63\xca\x47\x69\xd8\x7f" - "\x56\xf5\x66\x92\x7a\x99\x67\x79\x00\xd7\x89\xaf\xc3\x75\x6e\xcc" - "\xa1\x6b\x70\x3d\x50\x47\xa1\xa5\xee\xb5\x70\xcc\x52\xff\xb0\xf8" - "\x3b\xf7\xa8\x80\x7b\x78\xf0\x9f\x7d\x43\x0e\x5d\xcb\x3e\x57\x8d" - "\x1e\xc5\x44\xe3\x73\xab\xe0\x18\xbe\x96\x60\xe4\xe3\x4e\x18\x3f" - "\x7a\xd2\x1e\x15\xc1\xd1\xc7\x1a\x3d\x9a\x51\xc3\x8f\xf1\xe0\x27" - "\x4f\xcb\x18\x40\xea\xfb\x38\xc4\x52\x1f\x57\x17\xa9\x83\xce\x98" - "\xa5\x61\xfb\x08\xee\xcb\x1e\xb8\x7e\x28\x0f\xed\x9f\x16\xc4\xb6" - "\x3f\xae\x96\x60\x1e\x6c\xcf\x5c\x43\xf0\x90\xbe\x2e\xca\x32\x96" - "\x83\x2f\xfc\xe1\x9a\x02\xab\xb1\xc9\x1d\x8e\x6b\xd8\xfa\x0e\x82" - "\x9f\x02\xf8\x6d\x25\x63\xca\x04\x1d\xc6\x14\x7b\xff\x05\xf8\x79" - "\x2d\xe7\xe1\x1e\xae\x70\x8f\xd9\xb8\x1f\xe0\x7b\x98\xb3\x23\xa0" - "\x9e\x4f\xac\xc7\x3f\x57\x5c\xce\x9c\xbe\xee\x73\x3c\x4e\x7e\xd4" - "\x9d\xae\x86\x32\xfe\x96\x32\xf8\x3c\xd8\xfc\x79\x38\x06\xed\x8f" - "\x67\x6c\x94\x0e\x65\x40\x67\x49\xae\x9d\x49\xe9\x8d\xa8\xf2\x3c" - "\x3d\xd6\x95\xb8\xcf\x87\x94\xfb\xd6\xa2\xf2\x3c\x33\x32\xff\x2d" - "\x30\x50\x97\x42\x17\x01\x57\x3f\x50\x56\x5f\x8d\xe4\x71\xc1\x4f" - "\x98\xef\x5f\xd1\x8d\xa0\x7f\x16\x0d\x42\x98\x1b\x5c\x55\xe5\x5d" - "\x2a\x37\xdc\x60\xe2\x1f\xfc\xcd\x70\x81\x8f\x40\x2f\x61\xcd\x04" - "\xba\x38\x26\x83\x22\xba\xc9\x0c\x65\xf3\xf1\x71\xac\xa9\x40\xcf" - "\x6d\xe2\x9d\xa3\xff\xd6\xbf\x90\xd8\x2e\x6f\x33\x33\x1e\xe2\xe7" - "\x35\xbe\x54\x84\x9f\xd9\xbc\xa5\x7f\x21\x6e\x43\x6a\x32\x6d\x2e" - "\x37\xd6\x15\x95\xd5\x9a\x90\x76\x1e\xd6\x7b\x79\x8b\xc3\x37\x22" - "\x1a\xe2\x63\xa1\xbc\x36\xe4\x31\xeb\x1f\x40\x13\x5f\x35\xf4\xe9" - "\x5f\x98\x6a\x42\xd4\xba\x14\x37\xf7\x17\xf2\xe8\xa2\x9b\x8f\x05" - "\x42\x1c\xc8\x2b\x38\x04\x8c\x57\x3e\x4f\xce\x2b\xb0\xb4\x3d\x9f" - "\x6d\x3b\x1c\x63\xf4\xca\x80\xdc\x34\xa6\xbd\xf0\x7f\x49\x7f\xd1" - "\x4b\xbd\xe8\xef\xf2\x8c\x68\x4e\x1e\xdd\x38\x67\x23\xa2\x4c\x39" - "\x2f\x18\x76\xe7\x57\xe2\x58\xaf\xb3\xd8\x93\xb1\x9d\xd1\x80\x12" - "\x53\x90\xfa\xb2\x6a\xe3\x92\xf0\x45\x69\xcc\xf7\x93\xfe\x09\xe5" - "\xe4\x3d\xeb\x46\xe6\xfb\x55\x65\xa0\xb1\xc3\x8d\xa9\x34\x19\xaf" - "\x36\x6e\x1f\xcd\xd6\x87\xcf\x59\xfc\x97\xcf\x6a\x5f\x05\xf7\x90" - "\x5c\xff\x6a\xa7\xad\x6a\xf1\xb6\xe6\xc7\x2b\x6f\x6b\x7e\xb0\x6d" - "\x5b\xf3\xb3\x5b\xb6\xad\xf9\x92\xdf\x3f\xb0\xd3\x56\xad\x78\x5b" - "\x37\xbd\xa1\xbc\xad\x9b\xfc\x6c\xdb\xba\x69\x49\xcb\xb6\x75\x93" - "\xe4\xfb\x3f\x3b\x6d\x0d\x14\x6f\x6b\xc1\x70\xe5\x6d\x2d\x50\xdb" - "\xb6\xb5\x20\xbe\x65\xdb\x5a\x90\x24\xd9\x56\xca\x8b\xc6\xf1\x09" - "\xe2\x52\x63\x4a\x03\xf0\xbc\x9c\x37\x8a\x16\x6f\x46\x54\x69\x6d" - "\x3d\x2a\xf3\xad\xc4\x1c\x9a\xea\x9f\x08\x71\x6f\x29\x0a\xa1\x73" - "\xdc\x0a\xcb\xf2\x6a\xe0\xf8\x45\x74\x2c\xb9\x1e\xe9\x66\xe3\xf8" - "\xbb\x79\x48\x79\xb4\xdc\xf8\xbb\xd9\xf5\x4e\xfc\x35\x0e\x62\x63" - "\xee\xa7\xd3\xcb\x6a\x1a\x11\x6e\x3f\xfc\x3d\xe6\x4e\xfc\x5d\x4a" - "\xec\x6d\x1d\x7f\xb1\x3d\xca\xeb\xeb\x05\xf1\x97\xac\xa1\xfa\xb4" - "\x97\x75\xec\x4d\xbf\x8c\x90\x78\xec\xdd\xdc\x80\x63\x6f\x3e\x9c" - "\x97\xf9\xfc\x87\x2d\xb1\x37\x03\xee\xc9\x8f\xbd\xdf\x45\xe3\xf1" - "\xf5\x53\x5f\x65\xb1\xf7\x53\x5f\x4b\xbb\x37\xb2\xed\x86\x7b\xa5" - "\x09\x63\xef\xa7\x92\x7b\x5d\xf2\x71\x4b\xe7\x3c\x5f\xb1\xfb\xa1" - "\x7a\x37\xf3\x96\x40\x03\x1e\xdf\xea\xc0\x26\x5f\xe5\xd7\xbb\x82" - "\x7d\x98\xb5\x10\x37\xeb\xa2\x5d\xe8\x2d\x03\x72\xc3\x93\xe8\xb3" - "\x74\x9f\x40\x03\xce\x63\x62\x3d\x7e\x51\xf5\x59\x27\x7a\xeb\x80" - "\x5c\x99\xcf\x7d\x82\x1d\xff\x02\x53\xa0\xbf\xec\x9e\x57\x4f\x99" - "\xdf\x8f\xf4\x02\x3f\xa8\xe9\xec\x17\xd4\xf4\x0a\x4d\xc5\xcd\xec" - "\xc8\xb4\x62\xff\x0b\x08\x97\xa5\x97\xb8\x86\x28\x7f\xfe\xcf\xb2" - "\x9a\x79\xfe\x23\xf2\x9f\x9f\xd4\xe9\xd8\xf3\x7f\x96\xe5\xd0\xf3" - "\x77\x87\xe7\x6f\x0c\x76\x03\x6d\x48\xfd\xb3\x31\xd8\x55\xde\xf3" - "\x6c\xf1\x73\xc8\xc7\xce\xdd\xc3\xe1\xf8\x47\x77\x8f\x50\xef\xce" - "\x37\x50\x10\x03\x98\x31\x1c\xf7\x3d\x12\xff\xaa\x21\x66\x9d\xa5" - "\x49\x4c\x32\xc8\x8c\x49\x5b\x25\xbf\xff\x67\x7b\xff\x61\x89\xad" - "\x70\x7f\xe9\xf6\x5b\xc7\xc4\x5d\x43\xd5\xd2\x31\xf1\x85\x44\xdb" - "\x98\xf8\xb7\x51\xf2\x63\xe2\xdf\x34\xb6\x31\xf1\xf3\x05\x5c\x4c" - "\xfc\x7c\xba\xf2\x98\xf8\xf9\x40\xc7\x63\xe2\xe7\x9e\xca\x62\xe2" - "\xdf\x2a\xed\xc7\xc4\xcf\x03\x95\xc5\xc4\xcf\x03\x6d\x63\xe2\xdf" - "\xb2\x84\x31\xf1\x73\xc9\xbd\x2e\xe8\x0c\x3f\x2d\x8c\xd1\x1e\x97" - "\x55\xdb\x82\x8d\x4b\x41\xb7\x64\xe4\xe5\x86\x9b\xe8\x3a\x3a\xd3" - "\x4f\x6b\xa6\x82\x70\x5c\xd1\xd5\xd5\xc5\xb8\x9b\xe7\xfb\x7b\xd0" - "\xdd\x82\x2e\xd2\x4d\x1a\x04\x76\xf2\x83\xe7\xf7\xa2\xeb\xfc\xbb" - "\xd0\xf3\xfd\xbb\xe5\xdd\x46\xde\xf0\xd3\xe4\xb1\xe3\x31\xfc\x1d" - "\x48\xcf\xd7\x74\x4e\x9f\x87\x02\xbc\x6a\x91\x3b\x3c\x43\xa4\xd7" - "\x12\x35\x82\x18\xe4\x8d\xff\xa6\x97\x6e\x09\xd9\x74\x1b\xb9\x7a" - "\x25\x83\x6f\xba\xc2\xfd\x92\xbd\x68\x7a\x8e\x3f\xda\x34\x1b\x74" - "\x36\x85\x34\xf9\x14\x5d\x68\xac\xf3\xa7\x4c\xde\x13\x02\x89\x7f" - "\xb6\xd5\xd0\xdd\x41\x7b\x65\xbd\x6e\x34\x77\x7f\xbd\xca\x94\x1a" - "\xa3\xa2\xdf\x8f\x54\xe1\x67\x35\x65\xbd\xae\xa7\x73\xe0\x97\x1a" - "\xd3\x05\x73\x68\xd0\xe1\x81\x74\x9d\xa6\x33\x68\xf4\x80\xfc\x79" - "\xc8\x6f\xe3\x6d\xe4\x4f\xdf\xf4\xa7\xc0\xff\x91\xf8\x3b\xa4\x60" - "\xa3\x48\x33\xb5\x25\x04\xce\xb9\xe2\x98\x48\xe3\xfb\x1b\xe1\xfe" - "\x4d\x70\xff\x46\x8c\x6d\xa4\xd9\x04\xf7\x37\xcd\xf7\x97\xd9\x5f" - "\xb6\xed\x67\xf0\xc9\x3e\x97\x39\xe0\x15\x35\xbd\x0b\x7e\xf8\xb9" - "\xc0\x86\x9b\xb0\x4d\xfa\xbf\xe2\x8d\x9f\x6d\xed\x6d\x14\x00\xcf" - "\xe9\x07\xcf\xe0\x0f\xf7\xc5\x7b\xb8\x44\xbe\x35\x4b\x8d\x31\x2a" - "\x78\x36\x53\x26\xfb\x6c\xd7\xe0\xd9\xae\x72\xcf\x86\xef\x85\xed" - "\x23\xf5\x7e\x34\x7c\xf1\x43\xb8\x6f\xfe\xe6\x95\xdc\x71\x04\x7e" - "\x57\x7a\xf3\xfd\x18\x99\x58\xdd\xbe\x4c\x0a\x2f\xeb\x76\x21\x5f" - "\x5a\x9d\x93\x3b\x7a\xf9\x59\x3a\xdc\x88\xd0\xf2\x5d\x28\xa0\x1c" - "\xfa\x75\x59\xfd\x15\x44\x77\xcd\xc9\x2d\xf6\xaf\x91\x7b\x2f\x83" - "\xd4\xbd\x56\x2f\xa5\x2b\x9a\xfc\x70\x5e\x2c\x32\x79\x1d\x45\x27" - "\x37\xfa\x0d\x28\x38\x7a\xa2\x11\x4d\x49\xc6\xef\x63\xe9\x64\xed" - "\x44\xe4\x7e\x5e\x55\xb8\x25\xf5\x14\x7e\x77\xf4\x45\x92\xf0\xdd" - "\xd1\x17\xb9\x48\xb5\x23\x04\xa9\x76\xc6\x21\xd5\xae\x5a\x04\xe5" - "\xac\x7e\x01\xe1\xdb\x1f\x42\x29\x46\xfa\x37\x3a\xab\x43\x75\x3a" - "\x45\xd7\x87\xf7\x75\xd1\x17\xcd\xc3\xef\x52\x76\x0c\x06\xfb\xfd" - "\x0e\xe3\xaa\x17\xfe\x1b\xd7\x97\x38\x1b\xfd\xe9\xb2\x6a\x47\x90" - "\x57\x6d\xc7\x11\x46\xef\xc8\x02\x23\x1d\x89\x9a\xb4\xf1\xa8\x21" - "\x6b\x82\xba\x09\xe7\xed\xa6\xe1\x18\xf4\xf7\x7e\x5e\x2e\x69\x88" - "\x06\xff\xd3\xb4\x06\xbf\x4f\x8c\xcc\x83\x1f\xf6\x25\xe3\xc7\x6e" - "\xcf\xac\xc1\xfe\xc6\x7d\x61\x13\x39\xae\xc6\xfd\x61\x1d\xdb\x6f" - "\x0c\xaa\x27\xa2\x4c\x14\x42\x26\xb8\x3e\xf5\x02\xf2\xc5\xdf\x9f" - "\xdd\x08\xe5\xa6\x98\xdc\x71\x3f\x8e\x2c\x9a\xf8\x23\xba\x98\x88" - "\xa8\xd4\xeb\xc8\x13\x30\xc1\xf4\x47\x33\xf4\xc7\xf0\xd3\x5e\xf5" - "\x10\x57\xcc\x29\xb7\x90\x17\x8e\x53\xf8\x5b\x2e\xe5\x35\x7a\x64" - "\xbe\xe6\xdf\xe5\x93\x04\xe4\x6d\xbc\x16\xd3\xcd\x70\x2d\xe6\x4f" - "\x1b\xcc\xc8\xbb\x4b\x22\x52\x6f\x4c\x00\x2c\xce\x84\xfe\x79\x15" - "\xfa\x67\x0d\xe9\x9f\x16\xfc\xd1\xab\x7f\x8c\xc4\x6b\xec\x99\xbe" - "\x99\xc9\xf6\xcd\xf9\xfe\x38\x17\x76\x07\x7f\xc6\x99\xfe\xd4\x46" - "\x8a\x46\xf0\x8c\x60\xf7\xed\xd1\x9b\x52\x3a\xba\xe3\xdc\x25\xfd" - "\xd8\x40\xfc\xfe\x03\xda\x4a\x1b\x77\x83\x2f\xdc\xfa\x52\x5a\x3a" - "\x3b\xb2\xe0\x68\x44\x35\xe2\xf2\x26\x85\x5b\x1b\xfb\x0c\x28\xd0" - "\x8e\xa5\xaf\x9d\x57\xed\x08\x80\xe3\xee\xda\xd7\x1f\x57\x83\x1f" - "\xb7\x92\x3c\x4b\xe1\x16\x9c\x4b\xd5\xab\x76\xe0\x1c\x32\xc2\xef" - "\xe8\x7f\x60\xde\x7f\xed\x8c\x86\xb2\xc8\x04\x36\x37\x7a\x77\x08" - "\x36\x7b\x4f\xd0\x15\xbd\xdb\xc8\xc4\xab\x26\xf0\xc1\xc5\x38\x44" - "\x4d\xa9\x01\xdb\x98\xc0\x36\x75\xfe\x1e\x10\xb7\x22\x70\xdc\xa2" - "\x33\x82\xf4\x8b\xf4\xb4\x39\x3c\x5a\x45\x83\x5d\xdc\xcb\x93\x4d" - "\xe8\xad\x44\x44\x2f\xbe\x02\x36\xaa\xad\x44\xd0\xb6\x2e\x10\xdb" - "\xba\x6d\x9c\x87\xbc\x3f\x01\xfb\x78\xd6\x00\xa7\x59\x9f\x9b\xb1" - "\x2b\xa5\xc4\xcd\x04\x38\xc7\x71\xcc\x6b\x89\x4b\x27\xf0\x55\x97" - "\x35\xb8\xdf\x42\x3f\xf6\x5a\xc2\xc4\x55\xc6\xb7\xc6\xf9\xfe\x8f" - "\x34\xcd\xf7\xd7\xc2\xef\x21\x4b\xac\xb3\xc4\x19\x3a\x7d\x7b\x29" - "\x8e\x73\xe5\xc9\x7a\x64\x04\x5b\x76\xc1\x63\xe2\x7c\x7f\x5f\xc6" - "\xa6\xef\x80\x4d\x67\x20\xf7\x01\xf5\xc8\x05\x9e\x4b\x0d\xcf\x8c" - "\x8e\xc5\x9c\xc7\xb1\x55\x63\x82\x7e\x84\xed\x0c\x75\x52\x34\x60" - "\xcd\x9c\xd5\x21\x78\x54\xac\x16\x15\xfb\x9f\x44\x78\x1f\xd7\xd4" - "\x06\xfa\x1c\x7e\xff\x56\x9e\x6c\x44\xb4\x4f\x64\x01\xc9\x9d\xef" - "\x70\x3d\x1a\x51\x8f\xa4\x31\xbd\xeb\x0a\x87\xe9\x5d\x57\x38\x4c" - "\xef\x62\xe6\x60\xf1\x71\xdd\x50\x00\xb8\xf6\xe6\xe3\x7a\x97\x5b" - "\xab\xe2\x7a\xb4\x7c\x5c\x6f\xb8\xca\xc3\x75\xca\x1f\x83\xeb\x1f" - "\x22\x19\x5c\xab\x9a\xfa\x30\x78\x75\x2f\x37\x7e\x09\xfc\x77\x57" - "\xa5\x05\xb7\x47\xbe\xc0\xb8\x2d\xf4\x6d\xaf\xb8\x6d\xa8\xf3\xd7" - "\xc2\xaf\xc5\x71\x0b\x75\x3a\x8c\xdb\x1f\x22\x1b\x91\xc5\x7e\x18" - "\xbf\x74\x46\x4e\xae\x36\x15\x85\x82\xdd\xb6\x78\x2d\x79\x08\x1d" - "\x23\x36\xdc\xa2\x7d\x9d\x36\x43\x8c\x60\xf6\x40\x68\x5c\x4a\xd3" - "\x66\xef\xb1\xda\xd4\xe3\x48\x6d\xce\xea\x52\x58\x6e\xdc\x89\xbc" - "\x12\x91\x2b\x7e\xff\x49\x77\xdd\x17\x05\x3a\x9c\x79\x07\x6d\xce" - "\xcc\xa9\x30\x65\xe6\xa6\x99\x20\x9e\x98\xb2\xa7\x69\xcd\x99\xf3" - "\x12\xcd\x5d\x77\x15\xd2\x78\x4e\x42\xd7\xbf\x16\xd4\xa5\x17\x6e" - "\xb1\xbc\x2b\x17\xe5\x46\xde\xd3\xb4\xd0\x5f\x40\x53\x7d\xd9\x0b" - "\xfe\xa5\x2e\xaa\xf6\x3c\x07\xff\xaa\xe0\x5f\xe6\xbd\xa9\xbc\x71" - "\xae\xb0\x92\xbc\x73\x8a\xdc\xcb\xc6\xc1\x53\x4c\x1f\x7c\x02\x79" - "\x5e\x66\xff\xae\x4b\xdf\x13\x64\x79\xf7\x7e\xa7\x3c\x67\x8f\x0a" - "\x7c\x6f\xb0\x89\x2b\x99\x0f\x40\xfe\x8f\xe7\xda\xb0\xf5\x31\xff" - "\x37\xfb\x85\xe5\x16\xa5\x9c\x47\x35\xaa\x3d\x05\xe5\x30\xf6\x9b" - "\x73\x22\xf7\xae\xbb\x0d\x78\x4c\xbe\x13\x7f\x4f\x75\x01\x7f\x17" - "\x2d\x64\xca\x30\xfb\x91\x9a\xb3\xc2\xd3\xe8\x9c\x0e\x85\x58\x43" - "\xd6\xd1\x31\xcf\xb3\xff\x3e\x87\xb1\x4d\xf2\x2d\x7b\xae\xd0\x60" - "\x3f\xfc\xfd\xf5\x3b\xf3\x8f\xf0\x77\xd1\xd3\x5c\x7d\x0f\x2d\x22" - "\xe3\xad\xe5\x79\xf1\xb7\xd3\xf1\xfc\x9e\xc7\xd3\x50\x5a\x9d\xc8" - "\xb7\xd3\xb9\x79\x40\x7b\x2a\xcd\xd9\xe1\x69\x75\xe9\x5f\xfa\xeb" - "\x55\x5f\x04\xf2\xdb\x2c\xe6\x0b\xbd\xea\xcb\x61\x52\xe7\xe4\xf9" - "\xe1\xcb\x28\xa9\x7a\x86\xfb\x9b\x68\x99\x75\xed\x90\xe4\xd5\x7e" - "\xfd\x03\xc3\xb7\x99\x8a\xcc\x4d\x91\x5e\xc5\x8b\xae\xc8\xe4\x44" - "\xff\x4f\x72\xfe\x9b\x29\x6b\xac\xce\xf8\x18\xd4\xdd\xf7\x21\x64" - "\x9a\x19\xf9\x12\x7e\x07\x82\xb9\xde\xe2\x58\x32\x67\xac\x74\x9b" - "\x11\x61\xde\xb7\x3d\xa1\x84\x6a\x6c\x8a\x44\x5d\x0c\x48\x3d\xba" - "\x36\x95\x5e\x77\x15\xf9\xd1\xf3\x23\xbd\xd6\x5c\x45\x21\x4d\x37" - "\x35\x9d\x3f\x9c\x8d\x5c\x1b\x21\x26\x37\xce\x89\xf1\xc2\xf3\xd3" - "\xbe\xbd\x5c\x44\x95\x1b\xf7\x63\x9e\xe9\x87\xc7\x01\xfc\xec\xa6" - "\x9b\x91\x5d\x56\xdd\x40\xcc\x7b\xe5\xa2\x69\x9f\xc2\x38\xb0\xb7" - "\xab\xdb\x62\x88\x7d\x10\xbb\x98\xf1\x40\xc1\x58\xd0\x08\x63\xc1" - "\xa8\x48\xba\xbe\xac\xf2\x47\x94\x7a\x05\xa9\x53\xe7\x22\x4f\x5c" - "\x7f\xb9\xf1\x1b\x32\x3e\x8c\x87\xf1\x01\xfe\x0f\x5a\xe2\xce\xf8" - "\xa0\x1d\x8d\x6c\xc6\x07\xac\x43\xca\x4e\x57\x23\xc0\x72\xc7\xd1" - "\xb5\x5e\xf5\x29\xb5\xb4\x19\x6b\x12\xfc\x0e\x1b\xca\x74\xb1\x8c" - "\x15\x78\x9c\x68\x64\xc7\x89\x8d\xec\x38\xf1\x71\x0b\x8c\x13\x1f" - "\xe3\x71\xe2\x24\xa2\x36\xe0\x31\x02\xc6\x87\xbf\xff\x62\xa0\x9a" - "\x60\x4c\x90\xe7\xe7\xbd\x35\x92\xf8\xc9\x89\xfc\xc0\x0c\x63\x31" - "\xf6\xf3\xfb\xe0\x5f\xec\xe7\x72\x7f\xf0\x6d\x65\xc7\x11\x0d\x70" - "\xdc\x98\xf3\xbc\x61\xdb\x45\x03\x45\x67\xbd\xa0\x6e\x00\x3c\x2c" - "\xbc\x85\x28\xa3\xf7\x58\xdd\xce\xd7\x33\x28\xac\x5b\xcd\xd9\xa1" - "\x41\x44\x23\x7f\x35\x15\xe7\x68\xbc\xaa\x91\x1a\xe7\x4f\x4d\x74" - "\xa4\x97\xf9\xf7\x48\x4f\xf3\x7b\x1a\xf7\xa6\xdf\x35\x9d\x57\xbf" - "\x8b\x5c\x0d\xef\xc5\x78\xa5\xbe\x81\xd4\xff\xfc\x4f\x06\x55\x56" - "\x0b\x7d\xbb\xc3\x77\x01\x34\xd4\xbf\xe9\x3c\x0a\xde\x34\x0d\x05" - "\xe5\x5f\x44\xda\xfc\x19\x28\xe0\x93\x8b\x80\xa1\xf7\x22\xbb\x34" - "\x31\xf8\x68\x28\x62\xe6\x04\xcc\x40\x3a\xba\x7b\x98\x01\xfe\x0d" - "\xce\x98\x81\x98\xbd\x1f\x69\x9f\xb1\x3a\x33\x94\x5b\x03\xda\x0d" - "\x38\x3a\x3c\xc3\x3f\x5e\x16\xc3\xcd\x27\x32\x39\xc4\xa8\x08\xc0" - "\x4d\x05\xe0\xe6\xba\x10\x37\x58\xb7\x32\xd8\x19\x45\xb0\x83\xdf" - "\xf9\x6d\xe2\xf3\x8b\x69\x47\x15\xe3\x27\x0f\xf8\x73\x83\x15\x7e" - "\xf2\xae\x3a\x87\x9f\x26\xc0\x4f\xde\x52\xc0\xcf\x31\x44\xe5\x9a" - "\x9d\xc1\xcf\x57\xcc\xfe\x17\x38\xcf\x47\xe6\x0a\xed\x5b\x85\xfd" - "\xac\x57\xed\x5b\x39\xde\xdf\x05\x29\xc3\x55\x68\x62\x33\xb8\xda" - "\x4b\x70\x75\xe0\x80\x02\x5c\x2d\xa3\xa1\x7e\xfb\xb8\xba\x25\x81" - "\xab\xd0\x44\x5b\x5c\xed\xdf\xdc\xb6\xb8\x62\xf6\xed\xfc\x3f\x80" - "\xab\x03\xcb\x84\xb8\xfa\xea\x1c\xc1\xd5\x57\x7a\x27\x70\xd5\x4c" - "\xbc\xd2\xb1\xf1\xea\x60\x57\x05\xb8\x3a\x0d\xb8\x6a\x26\x5e\x5d" - "\x91\xc2\x95\x48\xbc\xfa\xba\xa1\x6d\x71\xc5\xec\x2b\xfa\x7f\x00" - "\x57\xff\xdf\x69\x21\xae\xbe\x1e\x42\x70\xf5\x75\xb0\x72\x5c\xe9" - "\x9a\x89\x57\x3a\x36\x5e\x7d\x1b\x2b\x1f\x57\x87\x83\x68\xa8\xdf" - "\x3e\xae\xce\x48\xe0\x4a\x27\x12\xaf\xbe\x19\xd3\xb6\xb8\x62\xf6" - "\x3d\xfd\x3f\x80\xab\x6f\x83\x84\xb8\x3a\x98\x49\x70\x75\x30\xc3" - "\x09\x5c\x35\x13\xaf\xc2\xd8\x78\x55\x74\x48\x01\xae\xd6\x00\xae" - "\x9a\x89\x57\xdf\x48\xe1\x4a\x24\x5e\xfd\x73\x7b\xdb\xe2\x8a\xd9" - "\x97\xf5\xff\x00\xae\x8a\xd6\x08\x71\xf5\xed\x25\x82\xab\x6f\xab" - "\x95\xe3\x2a\xac\x99\x78\x15\xc6\xc6\xab\xef\x7a\x28\xc0\x55\x15" - "\x0d\xf5\xdb\xc7\xd5\x62\x09\x5c\x85\x89\xc4\xab\x7f\xb9\xb4\x2d" - "\xae\x98\x7d\x63\xff\x0f\xe0\xea\x5f\x55\x42\x5c\x1d\x0a\x23\xb8" - "\x3a\xa4\x73\x08\x57\xf5\x3c\x5c\x9d\xee\x38\xa2\x31\x95\xe8\xc1" - "\xed\x33\x58\x5c\xfd\xad\x7f\xe0\xfb\x73\x11\xb5\x73\x62\xae\x95" - "\x16\x2c\x9e\x6e\x8d\x29\xc0\x05\x83\x29\xe3\x7b\x80\xa9\xcb\x04" - "\x53\x29\x67\x00\x53\x3f\xe7\x52\xe5\xc9\x57\x30\x4e\x18\x0c\xe5" - "\xcd\x00\x0c\x61\x5d\xe8\xe2\xea\x2d\x47\x03\x7e\x78\xd9\x82\xa5" - "\xc3\xa3\x5a\x04\x4b\xe3\x00\x4b\x27\xac\xb1\x54\xcc\x61\x69\x8c" - "\x84\x06\x7c\x4b\x02\x4b\xfa\xe6\xb1\xf4\x09\xce\x21\xcc\x6c\x25" - "\x2c\x1d\xe7\x72\x08\x3b\xa6\x19\x28\xa3\x8f\x5c\x2c\x15\x07\x0a" - "\xb1\xf4\x5d\x36\xc1\xd2\x77\x59\xca\xb1\xa4\x4b\x94\xc6\x92\x85" - "\x4f\xfd\xef\x1e\xe7\xb0\x04\xdc\x4a\x80\xa5\xe6\x79\x14\x87\xa5" - "\xef\x37\xb4\x2d\x96\xac\x78\xd4\x3d\x8b\xa5\xff\x5d\x24\xc4\x52" - "\x31\xab\xfb\x8a\x25\x75\x9f\x19\xc6\x2e\xfc\xce\x09\xaf\xc1\x35" - "\xdd\x8c\x7c\xc9\x04\x63\x1a\x5e\x8b\x8b\xdf\x53\xec\x4e\xa8\xa0" - "\x30\x9e\xd2\x6f\x20\xbf\x35\xb3\x51\x88\x57\x3d\xc1\x8a\x11\xb0" - "\xb2\xf2\x06\x72\x6d\x6a\x02\x9c\x34\x22\xd7\x06\xb0\x77\x43\x53" - "\x8c\x57\x69\x54\x35\xfa\xe7\xd5\x0a\x18\xcb\xf6\xa3\x7c\xb8\xa6" - "\x89\xcd\x43\x9a\xdf\x8f\xec\xb2\x6a\x21\xce\x43\x1e\x43\x45\x13" - "\x3f\x06\xff\x97\x38\xed\xff\x86\x0f\xa4\xfc\xff\x8d\xc0\xf7\x79" - "\x3c\xbf\x6b\x5f\x51\x9e\x87\x64\xde\x53\x25\x10\xdf\x5b\xfc\xbe" - "\xa1\x05\xfc\xbe\x81\xf5\xbb\x73\xe3\xd1\x11\xe9\xf9\x8f\xbc\x58" - "\xc1\xcc\x29\xa8\x27\x31\xc2\x12\x17\x70\x8c\xc0\xfc\xa5\xc1\xfb" - "\xf9\x5a\xeb\xf1\x06\xc7\x87\xab\xaa\x1f\xce\xe1\xb1\x49\x92\xc7" - "\xb0\x71\x22\x75\x01\x89\x13\x84\xc7\x14\x87\xb4\x6c\xfe\xf1\xe8" - "\x91\xd6\x8b\x17\xdf\x34\x3f\xf6\x38\xc1\x63\x30\x6e\xf2\xac\x70" - "\xd3\x1a\xf1\x42\x19\x6e\x7e\xd8\x21\x8c\x17\x47\x3b\x91\x78\x71" - "\xd4\xdd\x91\xb1\xc7\x3e\x9e\x42\x93\x78\x78\xda\xcb\xe1\xa9\x6c" - "\x20\xce\x51\xca\xc4\x53\x46\xcb\xe6\x1d\x8f\xf5\x68\x5b\x3c\xb5" - "\x5c\xde\xb1\x7d\xe3\xe9\x98\x51\x88\xa7\xd2\x37\x08\x9e\x4a\x23" - "\x5b\x00\x4f\xbc\xf8\xa4\xe3\xc5\xa7\x8a\x25\x38\x37\x29\x13\x4f" - "\x55\x2d\x9b\x6f\x2c\x8f\x6d\x5b\x3c\xb5\x5c\xbe\xb1\x7d\xe3\xa9" - "\x62\xa4\x10\x4f\x65\xdb\x09\x9e\xca\xb6\x39\x8f\x27\x5d\x92\x35" - "\x27\x26\x78\xfa\xf1\x38\xe6\xcf\xf2\xf0\xf4\x7d\x70\xcb\xe6\x19" - "\x8f\x1f\x68\x5b\x3c\xb5\x5c\x9e\xb1\x7d\xe3\xe9\xc7\x3c\x21\x9e" - "\x2a\x1a\x08\x9e\x2a\xea\x5b\x00\x4f\xbc\xf8\x14\xc6\x8b\x4f\x27" - "\x7b\xe3\x5c\xa4\x4c\x3c\xb5\x70\x7e\xf1\x44\xa7\xb6\xc5\x53\xcb" - "\xe5\x17\xdb\x37\x9e\x4e\xd4\x08\xf1\xf4\xef\x97\x09\x9e\xfe\x3d" - "\xc2\x79\x3c\x85\xf1\xe2\x53\x18\x2f\x3e\xfd\x34\x0b\xe7\x20\x65" - "\xe2\x49\xdf\xb2\x79\xc5\xff\xbc\xd1\xb6\x78\x6a\xb9\xbc\x62\xfb" - "\xc6\xd3\x4f\x21\x42\x3c\x9d\xdc\x40\xf0\x74\x32\xd7\xd1\x5c\x90" - "\x25\x07\xc4\xc7\x93\xb4\xb6\x3b\xb5\xcf\x5a\xdb\xc9\xcb\x01\x81" - "\xce\x53\x9c\x4f\xac\xdc\x78\xb7\xe6\x13\x31\x86\x2c\x79\xa0\xf6" - "\x97\x03\x3a\x95\x26\xc4\xd0\x4f\x17\x08\x86\x7e\xaa\x92\xc2\x90" - "\x91\x3f\x27\xed\x37\xde\x9c\xb4\x2b\x88\xda\x99\x50\x44\x95\xb1" - "\x73\xd2\xf0\x7c\xb4\xb2\xaa\x6a\xb4\xea\x36\x52\x77\x89\x41\xea" - "\xd1\x89\xa9\xf4\x3a\x1c\x43\xe6\x44\x7a\x7d\x78\x11\x85\x34\x01" - "\x66\xd2\x2f\xb3\xf3\xd2\x00\x37\x3f\x9c\xae\x47\xdf\x26\xe0\x79" - "\x69\x85\x68\x13\x94\x33\x66\x91\x7c\x10\x8e\x23\xcc\x9c\xb4\x19" - "\x78\x4e\xda\xcf\x5b\x45\xe7\xa4\x2d\x95\x39\x27\x2d\x09\x70\x50" - "\x0b\x38\xb8\x85\x31\xb0\x4f\x30\x17\xed\x93\xa5\xbc\x1c\xd0\x34" - "\x89\x1c\x50\xa5\x63\xef\x24\x5a\x7c\x2e\xda\x35\xde\x5c\x34\x4b" - "\x0e\x68\x22\xc4\x0e\xd9\x7e\xff\x6f\xb2\xbd\x1c\x90\x09\x62\xc2" - "\x68\x3c\xb7\xbc\x96\xcb\x17\x2f\x8a\xc5\x6b\x7f\x9f\x37\x18\x21" - "\x56\xe0\xf9\xe3\xbb\xa6\x95\x30\xf9\xbe\xf2\xe4\x4a\xb4\xaa\x11" - "\xa9\xbd\x0c\x6c\x5c\xf0\x09\x0d\x6a\x82\xd8\x60\x82\x71\x09\x7c" - "\xed\xd9\x34\x07\x62\xc3\x0d\x88\x0d\x73\x20\x36\xdc\x82\xd8\x70" - "\xbe\x84\x89\x0d\xf4\x8a\xef\x02\xf0\xfe\xdb\x9b\x2e\xa3\xa0\x8d" - "\x97\x51\x30\x8e\x01\xa6\xec\xb1\xba\x26\x9f\x50\x6f\x83\x4f\xa8" - "\x06\xce\xf9\x13\x0c\x34\x14\xad\x99\x8d\x98\x58\x8f\x7d\xaf\x9d" - "\x81\xe3\xc1\xe9\x9d\x4d\x4b\x11\x72\x06\x07\x4d\xfc\x9c\x20\x1f" - "\x07\x12\x31\xc0\x69\x2c\x58\xe5\x81\x3f\x71\x32\x06\x60\x2c\x7c" - "\x62\x89\x01\x4e\x61\xe1\x8c\xe4\xfa\x1f\xfb\x58\x08\x4d\x74\x00" - "\x0b\x7b\x1d\xc4\xc2\x32\xbc\x6f\xb5\x08\x16\xb2\x00\x0b\xb9\x70" - "\x6e\x1b\xc1\xc2\x2d\x11\x2c\xfc\x72\xa0\xf5\xb1\x20\xcc\xc9\xdc" - "\xbb\x58\x38\x2b\xf9\xfd\xd7\x66\xb0\xe0\x40\x5c\xd0\x39\x1a\x17" - "\x4e\xe3\xfd\x9e\x6d\xb1\xa0\x83\xb8\xa0\x83\xb8\xa0\x63\xe3\xc2" - "\x15\x11\x2c\xe8\x8b\x5b\x1f\x0b\xc2\x7c\xca\xbd\x8b\x85\x73\xd2" - "\xfb\x5f\xd8\xc5\x82\xce\x81\xb8\xa0\x73\x30\x2e\x1c\x0e\xc2\xfb" - "\x24\x8b\x60\x01\xe2\x82\x0e\xe2\x82\x8e\x8d\x0b\x67\x44\xb0\x70" - "\xfe\x78\xeb\x63\x41\x98\x0b\xb9\x77\xb1\xf0\xeb\x36\x85\x58\x70" - "\x20\x2e\x84\x39\x18\x17\x0e\xaf\xc1\xfb\x0b\xdb\x62\x21\x0c\xe2" - "\x42\x18\xc4\x85\x30\x36\x2e\x7c\x23\x82\x85\xaa\x33\xad\x8f\x05" - "\x61\x1e\xe3\xde\xc5\xc2\x05\xc9\xef\x9f\xd8\xc7\x42\x98\x03\x71" - "\x21\xcc\xd1\xb8\x50\x85\xf7\xe5\x15\xc1\x02\xc4\x85\x30\x88\x0b" - "\x61\x6c\x5c\x58\x2c\x82\x85\x8b\x97\x5a\x1f\x0b\xc2\x1c\xc4\xbd" - "\x8b\x85\xdf\x8a\xec\x62\x81\xb6\xc5\x02\xce\x21\x60\xfd\x88\xf7" - "\xbd\x66\xb0\xf0\x6e\x11\xd5\x48\x63\x2c\x94\xa0\xd5\x0b\x79\x58" - "\xc8\x26\x3a\xc2\x82\x83\xb5\x7c\x1c\xe0\xf5\x4b\x18\x07\xa0\x1f" - "\x8c\xe0\x77\x3a\x27\xcc\xc0\xcc\x57\xca\x0e\xf5\xc7\xfa\x01\xe7" - "\x19\xb0\x86\x90\xd6\x0f\xd5\x57\x5a\x04\x03\x71\x80\x81\x1a\x71" - "\x1d\xd9\xe2\xfa\xe1\x5a\x2b\x61\x00\xb4\xe4\xc7\x29\xce\x60\xe0" - "\xd2\x61\xf9\x18\x00\x8e\xe0\x10\x06\x08\x4f\xb0\x8f\x01\x5d\x06" - "\x87\x01\xe0\x0b\xd9\xba\x6d\x98\x1f\x10\x0c\xe8\x72\xa5\xf9\xc1" - "\xe5\xeb\xad\x8f\x81\x16\xe6\x07\xed\x16\x03\xbf\x97\x48\xae\x61" - "\xc4\xb1\x1c\xe2\xfe\xe8\xbe\x0f\x21\xfa\xbd\xc8\x97\xd2\x2f\x23" - "\xbf\x0f\xdf\x45\x21\x78\xdf\x98\x9d\x8d\xf5\x54\x4a\x22\xfd\x1b" - "\x5e\x5b\x6d\x84\x76\xe0\x7d\x44\x19\x7c\x5c\xd3\xb8\x97\xc7\x18" - "\xd0\x2a\xc0\xc2\x87\xd0\x06\xbc\x47\x7c\x97\xc4\x8e\x23\xca\x6a" - "\x8f\xa2\xc6\x9b\x91\xa8\x34\xea\x32\x0a\xf7\xa7\x9b\xca\x4f\x17" - "\xe1\x35\x8c\xae\x45\xf3\x8e\xe2\x75\xe2\x9d\xa7\x24\x23\xea\xaa" - "\xaa\x66\x0d\xce\x29\x0d\x48\x46\xea\xbc\xcb\x24\x8f\xb4\xea\x2a" - "\x42\xc5\xc9\x08\x11\xbf\xd7\x5c\x72\x5b\xd0\x02\x39\xa4\x49\xe0" - "\xf7\xd3\x16\xbf\x17\x0b\x73\x48\x94\x03\xeb\x19\x1d\xc8\x1d\xb6" - "\xca\x7a\xc6\x6b\xb6\xeb\x19\x95\xe5\x0e\xaf\x1c\xb4\x3b\x8f\x88" - "\xe5\x01\xef\x27\x31\xfd\x9e\xf1\x6b\x13\xc4\xfe\xf2\xe4\xfd\xcc" - "\xfc\x68\xdc\xcf\x71\x9f\xc7\xf8\x48\x85\xf6\x62\x8c\x60\x3c\x8c" - "\xde\xd6\xd4\xf4\x56\x2d\xa2\xcc\x3e\xa1\x41\x18\x13\xe6\x99\x1a" - "\xf7\x35\xd0\xa6\xf2\xa8\xf3\xe0\xf7\x1b\xa8\xbc\x8a\xf5\xf9\xc2" - "\xf3\xe0\xcb\xab\xc9\xf4\x4c\xff\xce\xfd\x6b\x91\x3a\xf5\x14\x52" - "\x4f\xc1\x6b\x8e\x61\x1c\xf8\x04\x38\xc1\xa6\x77\x11\xc4\x82\x50" - "\x75\x13\x1b\x1b\xcc\x96\xbc\x12\x1e\x23\x00\x13\x1f\x26\x00\x26" - "\x92\x00\x13\x6f\x61\x4c\x5c\x35\xb9\xcd\x15\xc9\x2f\xcb\xc0\x04" - "\x93\x5f\x8e\x06\x4c\x54\x71\x98\xb8\x93\x57\x96\x18\x13\x8a\x26" - "\x3a\x31\xb7\x50\x24\x1e\x38\x9d\x57\xbe\xc6\xe6\x95\x79\xf1\x40" - "\x19\x36\xae\x49\xef\x89\x29\x89\x8d\xd0\xc4\xe6\xb1\x51\x67\xc1" - "\xc6\xde\xe6\xb1\x61\xc8\x12\xc1\xc6\x32\x1e\x36\x32\x78\xd8\x20" - "\x79\xa6\xec\xd0\x6d\xb6\xd8\xb8\xde\xa3\x6d\xb0\x61\x35\xef\xe7" - "\x9e\xc5\xc6\xf5\x5a\x05\xd8\x70\x20\x6e\x5c\x63\xb1\xa1\x73\x20" - "\x6e\xdc\x28\x14\xc1\xc6\x69\x0e\x1b\x3a\x5e\xdc\x60\xf3\x4e\xd9" - "\x3a\x91\xb8\x71\x73\x70\xdb\x60\xc3\x6a\x0e\xcf\x3d\x8b\x8d\x5a" - "\xc9\xef\x1f\x4b\x63\x43\xe7\x40\xdc\x38\x6b\xc1\x86\x03\x71\xa3" - "\xb6\xd4\x16\x1b\x87\x83\x78\xd8\xe0\xc5\x0d\x36\x0f\x85\x39\xa7" - "\x0d\x36\x6e\x8d\x69\x1b\x6c\x58\xcd\xc7\xb9\x67\xb1\x71\x3b\x40" - "\x01\x36\x1c\x88\x1b\xff\x64\xb1\x11\xe6\x40\xdc\xb8\x5d\x2d\x82" - "\x8d\x35\x1c\x36\xc2\x78\x71\x83\xcd\x4b\x65\x87\x89\xc4\x8d\xba" - "\xf8\xb6\xc1\x86\xd5\xdc\x9a\x7b\x16\x1b\xf5\x23\xe4\x63\x23\xcc" - "\x81\xb8\x91\x6a\xc1\x86\x03\x71\xa3\xc1\x55\x04\x1b\x55\x3c\x6c" - "\xf0\xe2\x06\x9b\xa7\xca\x0e\x13\x89\x1b\x0d\xab\xda\x06\x1b\x56" - "\xf3\x64\xee\x59\x6c\x34\x46\x3b\x82\x8d\x45\xb5\x22\x3a\xa5\x8a" - "\x60\xa3\x09\xca\xf0\x71\xc1\xd7\x26\xd0\x3e\xd7\x70\xd0\x2c\x18" - "\x13\x93\x17\x21\x8a\xc1\x45\x2d\x1f\x17\x4d\xbe\x18\x17\xfd\x62" - "\x00\x17\x17\x58\x5c\x58\x74\x09\xb3\xf7\x0a\xd1\x26\x96\x9c\x95" - "\x45\x9f\xac\xc6\x9a\x35\xc6\x82\x89\xa6\x8d\x6e\xb1\x2d\x80\x09" - "\xc1\xbc\x07\x1e\x26\xde\x90\xd0\x27\xaf\x2b\xc7\xc4\xc7\xa0\x5d" - "\x9b\x5a\x7a\xed\x93\x05\x13\xa7\x9c\xc5\x84\xd1\xee\xfc\x07\x71" - "\x4c\xb0\x3c\x43\x12\x13\x1c\xb7\x20\x98\x38\x6b\x07\x13\xa6\x40" - "\x5b\x4c\xb0\xbc\x82\xd9\x87\x80\x70\x0b\x4b\x0e\xcb\xc2\x2f\x84" - "\x98\x30\xed\x69\x1b\x4c\x58\xf1\x8b\x7b\x16\x13\xe6\x35\x92\x39" - "\xac\xa5\x88\xda\xb8\xd4\x5c\x98\x41\x99\xf7\xc3\xaf\x08\x7e\x25" - "\x70\xcc\x0d\x8e\x55\xe0\x6b\xe0\xff\xcc\x39\x73\x67\x66\xef\xe1" - "\x22\x2f\x97\x28\x6c\x6f\x5c\xa6\x83\xa5\x8c\xd7\x12\xa4\xdb\xc4" - "\xd6\x01\xc7\xd3\xe0\x78\x51\x17\x17\x5d\x07\x28\x5f\x42\xa7\x7f" - "\x19\x05\xc7\x3a\xe2\xb2\xf4\x12\x57\xb2\xf7\x31\x45\xe1\x3a\xac" - "\xef\xe9\xce\x96\xf1\xe5\xdf\xd7\x73\x89\x0e\xef\xe5\x67\x29\xd3" - "\xc9\x4c\x9d\xdd\x82\xcb\x99\x5d\x5c\xb5\xe6\xa5\x48\xcb\x2f\x4b" - "\x0f\x45\xb8\x5e\x4b\xd9\xce\x6c\x7d\x7e\xfc\x32\xa6\x4f\x11\xea" - "\xe2\xa2\x65\xea\xec\x92\x48\xe1\x36\xe1\xb2\x0f\xd0\x5d\x0a\xf7" - "\x33\xe5\x5d\x5c\xfd\x05\xe5\x57\x20\xa6\x2c\x5b\xce\x83\xee\x50" - "\xe2\xc7\x96\x63\x38\x1b\x1c\x73\xe5\xdb\x8f\x2d\xe7\x69\xb1\x0d" - "\xde\xbf\x8f\xdf\x56\xd3\x52\x0a\xd7\x87\xcb\x74\x31\x77\xf8\xdf" - "\x20\xb6\x2d\x41\xfc\x7b\xe2\x72\x70\xdd\x40\xd6\xce\x5e\xd0\x86" - "\xe0\x3b\xf5\x65\x75\xa8\xb6\x94\x03\x1c\xf6\xd8\xc4\xd9\x46\x0d" - "\xb6\xae\xc5\x7b\x96\x5b\xfb\xae\x8b\x8b\x8b\x1e\xfb\xae\xbc\x06" - "\x21\x5c\x96\xee\xf2\xe5\x36\x28\xdf\x95\x6d\x87\x8e\xb4\x83\xd9" - "\x33\x91\xf8\x9a\x32\xfe\x29\x9f\x79\x56\x17\x2d\xfb\xac\xdd\xa0" - "\xdc\x30\x4b\xbd\x66\x8a\xc1\x30\x5b\xd6\x95\x29\x5b\x16\x87\xbf" - "\xef\x75\xa7\xfc\x9f\x70\x59\x53\xfa\x77\xc3\x4c\x4b\x5c\x47\x58" - "\xd7\x6f\x5a\xea\x8e\xcf\xf3\xeb\xf7\x26\xe5\xf7\x05\x41\xf9\x91" - "\xb6\xe5\xd5\xd6\xe5\x7d\x48\xf9\xaf\xd6\x40\xf9\x08\xdb\xf2\xc6" - "\x6e\x56\xe5\xbb\x93\xf2\x07\xaa\xa0\xfc\x38\xdb\xf2\x5a\xeb\xf2" - "\x0f\x92\xf2\xc5\x19\x50\x3e\xd2\xb6\xbc\xce\xba\xbc\x86\x94\x3f" - "\x18\x02\xe5\x27\xd9\x96\x4f\xb3\x2e\xdf\x83\x94\xff\x36\x0b\xca" - "\x47\x59\x97\xdf\xc4\x94\x45\x8f\xb0\x65\x7b\x92\xb2\x45\x35\x50" - "\x36\x5a\xa4\xad\x2a\xb6\xee\x40\xb6\xfc\x9f\x49\xf9\xff\x37\x12" - "\xca\xc7\xd8\x96\x77\xb5\x2e\xef\x4b\xca\xff\x94\x07\xe5\xe3\x44" - "\x7c\x65\x5d\xbe\x17\x29\x7f\xe4\x20\x94\x4f\x14\xf1\x95\x75\xf9" - "\x87\x48\xf9\x52\x0f\x28\x9f\x24\x62\x7b\xeb\xf2\x0f\x93\xf2\x65" - "\x93\xa0\x7c\xb2\x88\xed\x85\xe5\xd3\x2b\x76\x40\xb9\x45\xf9\x2c" - "\x36\xad\xec\x6e\x5d\x77\x6f\x52\xf7\x8f\x46\xb8\x26\xcd\xb6\x3c" - "\x72\x21\xe5\xd1\x20\xb6\xfc\x23\xa4\xfc\x49\x6c\xcb\x65\x22\xb6" - "\x7f\x14\x97\xdf\x44\xca\x3e\x4a\xca\xfe\xef\x69\x28\xbb\x52\xc4" - "\xee\xfc\xb2\x7e\xa4\x6c\xb5\x3b\x94\x5d\x23\x62\x73\x7e\xd9\x3e" - "\xa4\xec\x7f\x8b\xa0\x6c\x86\x88\xbd\xf9\x65\x1f\x23\x65\xcf\x94" - "\x42\xd9\x2c\x91\xe7\x7d\x84\x57\xf6\x71\x52\xf6\x6c\x25\x94\xcd" - "\x15\xf1\x0b\xbf\xac\x3f\x29\x7b\x19\xfb\x30\x4f\xc4\x27\xfc\xb2" - "\x7d\x49\xd9\x73\xb8\xaf\x15\x88\xf8\x84\x5f\xf6\x09\x3a\xfd\x57" - "\x03\x1b\xa7\xb7\x58\x97\xcd\xe7\xe2\xee\x93\xe6\x2e\x17\x8c\x6c" - "\xac\x64\xe6\x6b\xd0\x50\x8e\x1b\x73\x8c\x4f\x59\xc6\x08\x33\x85" - "\x02\xe8\xf4\x53\x38\xde\xe1\x3a\x77\xd8\xc6\x36\xd7\xa7\xf2\xb9" - "\x31\xa2\x1f\x9d\xde\xb8\x83\xbd\x7f\xa1\x6d\x59\x77\x7e\xd9\xfe" - "\x74\xfa\x55\x57\xb6\xec\x5e\xdb\xb2\x6a\x7e\xd9\x01\x74\xba\x41" - "\xcb\x96\xdd\x2f\x12\x5f\x07\xf1\xca\x06\xd2\xe9\x37\x42\xa0\xdc" - "\x41\xb1\xf8\x4a\x2f\xd5\x0e\xc2\xf1\xc0\x12\xbb\xa1\xfc\x40\x62" - "\x5f\x23\xc6\x03\xf3\x8e\xda\x52\x16\xfc\x30\x88\x37\x56\x0e\x32" - "\x77\xa9\x8d\x64\x6d\x76\xd8\xf6\x19\xd2\xf8\xcf\xf0\x14\xa9\xf3" - "\x76\x12\xd4\x59\x62\xfd\x0c\x6c\x3c\xc2\x3c\x01\xdb\x37\xc8\x94" - "\x5e\x9f\x81\xed\x0b\x65\x4b\x05\x1c\x81\x72\x51\xe1\x3a\x59\xdf" - "\x0e\xa6\xd3\x6b\xd4\xac\x0d\x04\xe3\x11\xf4\x47\x26\x1e\x82\x7f" - "\x4b\xe8\x15\x1a\x2d\x94\x7d\x9a\x2d\x77\xc2\x7a\x1c\x64\x9f\xef" - "\x2f\x70\xae\xf2\xce\x18\xe8\xe2\x7a\x5a\x8c\xcb\x24\x3e\x81\x1e" - "\xb8\xec\xda\xb1\x9a\x8c\x93\xec\x37\x7e\x5d\x3b\x31\x36\x32\x6f" - "\xe9\x5f\x11\x5e\x4b\x1b\xf9\xc7\xd6\x51\x74\xc5\x80\x5a\xe4\x8a" - "\xf7\xe9\xa6\x7d\x22\x93\xf5\x70\xdc\xd0\x67\x40\x41\xdd\xfa\x8e" - "\xb5\x7a\x97\x7f\x31\xdf\x6d\xab\x5b\xef\x8e\xf4\xe8\xbd\x71\xf8" - "\xef\x75\x4b\xe9\x7a\xbc\x7f\xb2\x29\xe7\xff\x67\xef\x6d\xc0\xa2" - "\x3a\xb2\x84\xe1\xd3\x4d\xa3\xad\x41\x69\x08\x6a\xab\xa8\xad\x62" - "\xd2\x49\xfc\x21\x19\x33\x43\x1c\x8c\x24\xa2\xc1\x8c\x3f\x44\x31" - "\x21\x91\x44\x90\x46\x9b\x88\xda\x01\xd4\xd6\xa0\x60\xab\x89\x99" - "\xf8\x03\x84\x18\x4c\x10\x30\x21\x3b\x66\xd7\xdd\x30\xbb\xce\x3b" - "\xcc\x3e\x66\xd2\x13\x48\x86\x64\x84\x76\x67\xcd\xbb\xcc\x8c\x33" - "\xe9\xb0\x8c\x43\x5c\xd4\x9e\xd0\xda\x1d\x69\xba\xbe\x73\xaa\xee" - "\xa5\xbb\x2f\x8d\x26\xef\xe4\xdd\xfd\x9e\xef\x4b\xeb\xe5\xde\x5b" - "\x75\xea\xd4\xa9\x53\xe7\x9c\x3a\x55\xb7\x7e\x86\x35\x3a\xfc\x3d" - "\x28\x7f\xcc\x8b\x38\xbc\xe8\x33\x46\xd0\xf9\xd6\x74\x8e\x84\xc3" - "\xda\x03\x17\x35\xda\x45\x6c\x8b\x39\x19\x69\xa0\xf3\x1d\x4c\x9d" - "\xf8\x2e\x78\x4a\xeb\x10\x86\x9d\xb5\x17\xde\x20\x98\x43\xae\x31" - "\xeb\x80\xed\x5d\xd3\x6d\xd9\x0d\x53\x2e\x69\xb4\xdc\x0e\xd0\x1e" - "\xb6\xfe\x31\xc3\xce\xf2\xbd\x6b\xaf\x9a\x1f\xe4\xfb\xd6\x6a\x46" - "\x54\xd0\x7e\xb5\xb4\x6f\xed\xc0\x9e\xb5\xf5\x9b\xea\xf9\x3e\xb8" - "\x1a\xed\xe7\xbc\x2c\x36\x76\x8e\x25\xcc\x6e\xf2\xdf\xd8\x57\x46" - "\x67\x51\xdb\x77\x5f\x82\x4e\x29\x8e\x70\x4a\x78\x72\x94\x78\x28" - "\x9d\x6b\xea\xa6\x7a\xe4\x41\x53\x7f\xf9\xfd\x29\x7e\xdd\xfd\xc9" - "\xac\x7c\x41\xb5\xa3\xc0\x09\xfc\x1c\x46\xcd\x88\x5f\xb1\xd1\x4f" - "\x3a\xfc\xe5\xf7\x27\x60\xf8\x01\x87\xfb\x06\x0f\xef\xd4\x8c\x98" - "\x49\x7e\x6f\xaf\x2e\x59\xcf\xca\x93\xe3\xed\x13\x6e\x40\x97\x66" - "\x04\x3f\xbb\x8a\xc2\x59\xc5\x82\x6a\xe2\xa7\xbf\x62\xc1\x81\x08" - "\x3d\x68\x7a\x63\x92\xf5\x9e\xca\x11\x4b\xe5\xf3\xe8\xe4\xbc\x08" - "\xaf\x53\xc2\xf5\xb5\xf7\xdc\xd5\x68\xcf\xd3\x9e\xbb\xdf\x00\xfe" - "\x20\xc1\x87\x3f\x83\x04\xfd\xab\x57\x87\x75\x23\x6d\xdd\xe8\x27" - "\x9f\x15\x75\x3e\x02\xeb\x3f\x42\xaa\xff\x91\xe0\x54\x0d\x4b\x96" - "\x9e\xa3\x9c\xaa\x9f\xb5\x48\xcf\x7a\x79\x8f\xe3\xf0\x7b\x2e\x0f" - "\x3b\x83\x75\x7d\xde\xff\x46\xa6\x96\x7c\x7c\x4e\xcf\x98\x61\x67" - "\x0c\x93\x41\x75\x51\x33\xb2\x06\xf3\x3c\x2f\xea\x64\xe4\x56\xbc" - "\x47\x4b\x77\x97\x74\x67\x04\xc3\xe5\x38\xee\xc9\x26\xe4\x7b\xb9" - "\xa8\x8b\x91\x87\x78\xdf\x86\xe4\x06\x65\x8b\xc5\x2c\x28\xe7\x78" - "\x5f\x5d\x17\xb2\x9e\x21\xf1\xde\xfb\xbe\x37\xf7\xfe\xef\xff\x20" - "\xe9\x81\x9c\x75\xb9\xa6\xbc\xf5\x1b\xcc\xf9\xcf\x6e\x2c\xd8\xb4" - "\x79\x8b\xe5\xb9\xc2\xa2\xe2\xad\xdb\xb6\x5b\x77\xec\x44\x3c\x03" - "\x67\x62\xb3\x37\x52\x55\x6e\x35\x60\xbd\x3e\x4c\x79\xf4\xf3\x7c" - "\x31\x4c\xc8\xd7\xc8\x1e\x8d\x21\x7c\xdf\xc1\x81\xde\x3c\x9d\x69" - "\xd8\xa3\xb9\x6d\x09\x9d\xb1\x88\xf2\xad\x72\xd4\x3c\x62\xa7\x73" - "\x9c\xbb\x34\xb7\x25\xb7\xbb\x1e\xb1\xd3\xb9\xe3\xcd\xfa\x6e\x48" - "\x98\x06\xaa\x4b\x9a\xdb\x8c\x14\x5f\x77\x07\x40\x0b\xa6\x0d\x87" - "\x73\x9a\x0e\xf4\xaf\x8c\x65\xae\xaa\xb1\xac\x87\xf0\x57\x1d\x65" - "\xdd\xae\xe7\xcd\x70\x18\xdf\x51\xc7\x74\x17\x35\xb7\xf5\x37\xc7" - "\xf3\x73\x59\xe3\x6b\x8f\xb2\xae\x7d\x63\x59\xd7\xde\xa3\xac\xa7" - "\x6e\x2c\x73\x26\x54\x41\x94\xa7\xf2\xb6\x46\xa7\xe6\x36\x2d\xd7" - "\x57\x8c\xf7\xc7\x8e\x3c\x79\x04\xe3\xe6\xf8\x20\xa2\x0e\xdf\x31" - "\xcc\xdd\x6c\x10\x74\xbf\xfb\xa5\x37\x12\xf1\x55\xb1\xbe\x02\xd5" - "\x61\xcc\x47\xd4\x47\xd4\xd4\x16\xf4\x3a\x30\x3f\x97\xc3\xdb\x09" - "\x4e\x4d\x94\xa1\xee\x3a\xcf\x2f\xda\x51\xdd\x03\x84\xef\x9f\x0a" - "\xbd\x91\x45\x13\x98\x0f\x61\xc1\xff\x7c\x81\x0a\xf3\xbb\x80\xb8" - "\xdd\xc1\xe5\x31\xae\xdf\x54\x6c\xd8\xbc\xb5\xa0\xe0\xae\x91\x60" - "\xe4\x77\x08\x3e\x83\xbc\x98\xf6\x56\x7f\xe5\x28\x6b\xc1\x72\xda" - "\xb1\xbc\xad\x6d\xd8\x4b\x41\xd9\x00\x2c\x53\x39\xe2\xdd\x8a\xe1" - "\x67\xf0\xf9\x0c\xd2\xde\xca\xcf\x34\xd6\x4c\x3a\xc1\x2a\xa3\x66" - "\x22\x9d\xad\x74\x16\x1b\xed\xc5\xde\xbb\x3d\x43\x85\xe5\xae\x42" - "\xb8\x56\xc3\x04\x98\x81\xe9\xfa\x91\x8e\x06\x7c\x26\x78\x7e\x1e" - "\x30\xc2\xb7\x88\x72\x4d\xaa\xa0\x77\xe4\x95\xfd\xf8\x58\x76\xd0" - "\x53\x19\xd5\x41\x67\x4c\xf0\x73\x32\xf1\x1d\xf9\xd2\x8a\xb0\xe5" - "\xbd\xa5\x19\x2a\xec\xeb\xaa\xea\x02\x38\x4f\x12\x4d\x44\x07\xf5" - "\x9f\x7f\x83\x1e\xa8\xbf\x2f\x13\x66\x79\x41\xf5\x9b\x2e\x80\x9a" - "\xa3\xac\x1e\xaf\x1a\xbc\xaa\x3f\xc1\xb8\x8f\xf1\x6a\xc5\xf0\xb3" - "\x78\xff\x04\xef\x1f\xe3\x85\xfd\x6f\x3d\xd1\x5d\x54\xc2\xba\xe7" - "\x54\xc3\x74\xc2\x8f\xb2\xf5\x44\xa7\x26\xde\x4b\xb4\xd3\x19\x32" - "\x2c\x76\x54\x41\xc8\xb9\x17\x9a\xd1\x4e\xc0\x78\xbc\xbb\xc5\x3d" - "\xf8\x8a\x4e\xc6\x2b\x4b\x7a\x6e\x40\x98\xb3\xd2\x73\x13\x5e\x2d" - "\xb7\xbe\x94\xf8\x86\xba\x74\x89\x5f\x1f\xf6\xeb\x5c\x93\x0a\xbe" - "\x1e\x5c\x4c\x37\x68\xe2\x52\xf0\xb2\x86\x86\xc7\xa5\x8b\xb0\xf1" - "\xf1\xe2\x7d\xbc\x51\xba\x67\xe0\x85\x7c\x9a\x80\xf8\x27\x94\x8b" - "\xb0\x09\x35\x78\xef\xc2\xcb\x15\x9a\xff\x24\x4c\x3f\x69\x1f\xd5" - "\x67\x1f\xb6\x31\x54\x97\x4e\xcd\xa8\x64\xaa\xa3\x23\x42\xb6\x54" - "\xb4\x8e\x0e\xc3\x92\x50\xb6\x6a\x02\xf2\x13\x3d\x2b\x54\x7e\xa2" - "\xf5\x0a\xf9\xe1\xb6\x08\xf5\x65\x5f\x9d\x90\x97\x33\xbd\xcf\x9b" - "\xf0\x3d\x3a\x1e\xf1\x9c\xa1\x71\x1d\xc4\xc1\xfd\xd7\x23\x97\x00" - "\x46\x99\x41\x43\xf6\xa5\x47\x13\xbd\x89\x64\x96\xf2\x96\xf2\x15" - "\xb4\x20\x7d\x18\x56\x4f\xf4\x6d\x41\xbc\xf8\xde\x80\x70\xf5\x0e" - "\xf8\x52\xa6\x8d\xa7\xf9\xf1\xb3\x28\x8f\x12\xbd\x84\x93\xd2\xb1" - "\x40\xb9\x92\x28\x8d\xc8\x5b\x37\x15\xc3\x13\xd1\x46\xd1\x1a\xb9" - "\x08\x87\xcf\x09\x24\x93\x74\x77\xf8\x12\x51\x97\xd2\xc0\x4f\xfb" - "\xc2\xeb\x21\x11\xf5\x6d\x44\xa7\x46\xa7\x99\x5d\x02\x89\x84\x8f" - "\xec\x37\x96\xa3\xb5\x8e\x74\x51\xe0\x1a\x4f\xe5\x20\xfc\x9f\x60" - "\x0f\x88\xee\xb5\x44\x0f\xc6\x07\xe5\x5b\xe5\xc0\xde\xd7\x91\x9d" - "\xa2\xac\x98\x57\x03\xa6\x6f\xa4\xb2\x13\x3f\x31\xbe\x09\xf1\x64" - "\x53\x1c\x9d\x23\x29\x95\xa7\x81\xd6\x26\x12\x3f\x08\xde\x81\x3d" - "\x0e\x7e\xe6\x85\x26\x6a\x3f\xe7\x1b\xa6\xa7\xfa\x60\x98\x07\xe1" - "\x28\xf5\x31\x1f\x43\x7b\xf4\xd6\x4e\x2f\xfa\x34\x31\xbf\x0b\xad" - "\x1f\x5d\x53\x70\xfd\x60\xba\x46\x4c\xdf\x42\x6d\x3f\xd9\x13\xcc" - "\x33\x9a\xce\x81\xc6\xb0\x72\x7f\x25\xe2\xd8\xe6\xe5\x63\x51\x88" - "\xe7\x63\xa4\xa5\x9c\xf0\x20\x3d\x2d\x02\x57\x8c\x86\xf6\xc7\x0f" - "\xae\x6b\x09\x5f\x03\xd5\x39\xd7\xe7\x9d\xbc\x4c\x68\xbb\x62\x8e" - "\xd5\x8a\xb8\x26\x84\x69\x62\x7d\x69\xc0\x9e\xcf\x14\xe7\x4d\x8b" - "\xb8\xd3\xa5\x5f\xf1\xfa\x6d\x11\x76\x2d\xe6\x17\x45\xbb\x58\x77" - "\x80\xee\x18\x8b\x7c\x7e\x94\x44\xf7\x69\xca\x8f\x6d\xcf\xe2\x6d" - "\x28\xe5\x41\xe9\x25\x7c\x4b\x09\x9f\xcc\xab\xd9\x48\x87\xe0\x97" - "\xae\x0c\xc3\x1b\x48\x16\x39\xdf\xd0\x8e\xf6\x96\x92\x2c\xc6\x14" - "\x63\xfa\x33\x87\xe9\x7d\x3b\x7f\xd7\x72\x1b\x3b\x10\xaf\x3b\x43" - "\xf1\x0e\xf4\x20\x8f\x6c\x44\x59\xf2\x03\x4c\x8f\x83\x44\xb7\x8d" - "\x97\xed\x94\xfb\xf9\x54\x55\xb3\x0f\x80\xe8\x44\x1e\x35\x79\x2a" - "\x63\xe3\xd1\xf6\x67\x11\xad\x68\xaf\x4f\xb3\xb7\x32\x81\x68\x46" - "\x7b\x26\xd1\x17\x7b\x48\xaa\xfb\xd3\x54\x46\xe2\xe7\x6c\x61\xfb" - "\x30\x2e\xee\x5e\xa2\x3d\x50\xee\x58\x73\x30\x8f\x79\xb9\xb1\x1e" - "\xa8\xbe\xa8\x5e\x82\x70\x92\xec\x97\x23\xae\x53\xe2\x5d\xc8\x06" - "\xf1\xba\x7c\x2c\x3b\x4b\xf0\x01\xd8\xdb\x4f\x50\xdc\x6e\xcc\x7b" - "\x8e\x85\x9f\x71\xad\xa2\x33\xc0\x10\xef\x29\xfb\x4e\x1f\x20\x8e" - "\x26\xe2\x29\xc2\x5d\x23\x79\xc4\xf7\xb3\x52\x1e\x6e\x6c\xcf\x67" - "\xe2\x95\x1c\xd0\xff\xdb\xff\x1c\x2a\x5f\xb7\x2b\xf5\x9f\xea\xbb" - "\xdc\x5f\x9a\x06\x5c\x1e\x0a\xc1\x70\x45\x73\xfb\x1e\xa9\xed\x90" - "\xea\xfa\xf6\x4f\x9b\x51\x5f\x82\x70\x64\x29\xea\xba\x89\xcb\xe3" - "\xf6\xa5\x2a\x2a\x33\xa6\x6d\x92\xf0\xf0\x32\x73\x79\xb2\x71\x19" - "\x38\xcb\xb6\x63\x39\x07\xe4\x20\xb6\x49\xaa\xe7\xb3\x0a\x9e\xc8" - "\xb6\x8b\x9f\x47\x4c\x36\x09\xfd\xea\x07\x3d\x7d\x01\xbb\x44\x75" - "\xef\xe7\x75\x7f\x7b\x76\x9d\x68\x6f\x25\xbb\x75\xbb\x88\x1f\x1b" - "\x22\xc3\x44\xcb\xab\x5c\x7e\x89\x96\xd2\x2c\xa2\xa5\x89\xd3\x51" - "\x6a\x80\x2b\x9a\xb8\x28\xca\x1f\xd3\x56\x4b\xfa\x2a\xe1\x8a\x2d" - "\x20\x5c\x7b\xd1\x56\x11\x4d\x4e\xcd\x68\x2f\xb7\x7f\x8b\xb9\x1c" - "\x6c\x92\x68\x6f\xf5\xda\x28\x6d\x74\xf6\x57\x6a\x9e\xb6\x15\xe1" - "\xce\x7b\xc5\x79\x6e\x23\x31\xfd\x49\x3e\xc7\x52\xa3\x3f\x4b\x36" - "\x9a\xd6\x0e\xe3\xf3\xcf\x0c\x8f\xa3\xac\x5e\x02\x0d\xe2\xd3\x92" - "\x8c\xca\x72\xd1\xa3\xd1\xbf\x4d\x7d\x15\xe4\xf5\x29\xf4\x91\x4e" - "\x12\xbf\x49\x96\xd1\x47\x9a\xeb\xa9\x8c\x3b\x2f\xcb\x2d\xe6\x53" - "\x43\xbc\x17\xf5\x33\x66\x3c\xca\x71\x53\x40\xb6\xc6\x8c\x97\xf8" - "\x78\x12\xf9\xa8\xc5\xfc\x8e\x49\xe5\x3a\x89\xf0\xe8\x8b\xe9\x5f" - "\x92\x68\xaf\x96\xe0\xef\x97\xeb\x41\xd2\xd5\xb3\x87\xc9\xfe\xf2" - "\x3a\x18\x73\x56\x4a\xdb\x20\xe5\xd5\x26\xc3\x92\x8f\xc8\xcf\x66" - "\xc6\x30\xb2\x83\x73\xb0\xee\xb9\xed\xdb\x79\x83\xc3\x49\xb6\xb1" - "\x45\xe4\xa1\xdf\xca\xe5\x10\xfd\x9e\x80\x1c\x8d\x69\x50\xd8\x27" - "\xb2\xc5\xe5\xed\xfb\xc4\xd9\x77\x24\x4b\x64\x53\xa9\x4f\x84\xf8" - "\x4a\x24\xfd\x91\x68\x1e\x1b\x13\x2a\x2b\xfa\x1c\x94\x95\x59\x01" - "\xdc\x63\x21\x5c\x3b\x57\x27\x6c\x60\x8d\x48\x33\xf6\x31\xa9\x6c" - "\xa7\x44\xd9\xa4\x77\xe2\xdb\x6e\xce\xb7\x31\x41\x7c\x44\xbe\x8d" - "\xdb\x23\xc1\x37\x91\x2d\x0f\xe8\xeb\xd8\xf7\x64\x5d\x1e\x6c\x2f" - "\xc6\x3d\x47\xfa\x10\x44\x57\xb5\xc2\x5e\x34\x85\xb7\x17\x63\xcd" - "\x52\x79\xeb\x15\xba\xd1\x20\xf9\xbb\xfb\xe5\x7a\x68\x77\x4b\x67" - "\x10\x62\x18\xd9\x4f\xca\x3b\xb8\x0d\xaa\x15\x7c\x95\x74\x79\xdc" - "\xd3\x83\xeb\x61\xdc\xcc\x60\x7d\xa6\xba\x26\x9b\x40\x38\xa8\x4e" - "\xb9\x5f\x89\x61\xa2\x5e\xc7\x69\xc8\x36\x04\xdb\x68\x84\xad\xf2" - "\x33\xd2\x97\x71\x89\xa1\xba\x38\xb6\x46\xd2\x45\x29\x6f\xbd\x0a" - "\xeb\x28\x31\x28\xdf\x06\x45\xbe\x54\x37\x2d\xfc\xac\x18\x5e\xc6" - "\x71\x97\xe5\x36\x8d\xe0\x31\xad\x15\xd3\x74\x28\xda\xc7\x72\xa2" - "\x0f\xf3\x4a\xe7\x36\xeb\x28\xb7\x15\x56\x8f\xa0\xe7\x42\x9d\xd4" - "\x4e\x60\x58\xa2\x14\x76\x52\x6a\x4b\x64\xb9\x59\x16\x4a\x93\x3e" - "\x29\xbc\x7f\x34\x36\x5d\xf6\x8f\x38\x2e\x6e\x8b\xf4\xc9\x52\xf9" - "\x28\x6c\x96\x08\x1b\xab\xa1\xb0\xc3\x82\x0f\x55\x8c\xb7\x57\x63" - "\x4e\x4a\xed\x15\xe9\x97\x1a\xdf\xf5\xa4\x63\xf4\x8e\x38\x38\x7e" - "\x47\xd9\x0d\xea\x43\x60\xdf\x3b\xee\x34\xd9\x03\xb2\x17\x34\x37" - "\x98\xdf\x97\xf3\xfb\x1f\xc9\xee\x90\x1f\x42\xf1\x08\xd7\x40\xb6" - "\x08\xc3\xff\x4a\xfb\x02\xb2\xff\xd2\x22\x5e\xfd\x79\x91\x76\x7c" - "\x24\xf7\x15\xfe\x2b\x2d\x42\x0e\x93\xd3\xa1\xdd\xfa\x19\xa5\xa3" - "\xf4\xb2\xfd\x22\xdb\xe5\x23\xdb\xc4\xf3\x1b\xbf\x44\x92\x71\xde" - "\x6f\x90\xfd\xa2\x3e\x75\x10\x2c\x9d\xa5\xc6\x6d\xda\xf8\x2a\x61" - "\xcf\xc6\xef\xa7\xb4\xbc\xfe\xd0\x56\xee\xfe\x8a\x7d\x5e\x57\x08" - "\x9a\xda\x2f\xc9\x2e\x46\xed\x13\x74\x8e\x77\x8a\x72\x8c\x7f\x87" - "\x97\x43\xd8\xd4\x72\x41\x4b\xd4\xbe\xda\x1b\x3c\xee\x43\x2a\x0b" - "\xc5\x1d\x09\x8a\xa3\xb3\x11\x31\x4e\x8c\x97\x28\xd2\xf9\xfb\xcc" - "\x83\xe0\xeb\x6e\xf0\x7e\x1f\xf9\x08\x92\xed\x9d\x90\x2d\xe8\x9c" - "\x30\x49\xb6\xbb\xc8\x97\x53\x64\x7b\x79\xdc\x7a\x09\x66\xb9\x74" - "\xe7\xf6\x7d\xc2\x32\xc1\x57\xbd\x5a\xe2\xf7\x69\x51\x8e\x09\x39" - "\xbc\x9f\xfd\x5f\x99\xc8\xdb\x09\xa9\x32\x6f\x83\x9f\x49\x7f\x30" - "\x7f\x1d\xbd\x73\xb9\x2f\xe1\x7d\xd8\x1a\x82\x21\x9a\x44\x1b\x31" - "\x3e\x59\xe9\x53\x5f\xd4\xc4\xff\x8e\xda\x25\xe1\xab\xc6\xff\x42" - "\x1a\x7b\x02\x7b\xe1\x9b\xd8\x2e\x4c\xd4\xc8\x36\x86\x79\xd2\x80" - "\xce\x58\xba\xa8\x99\x18\x49\x61\x74\x3e\x56\x30\x0c\xd9\xa7\x77" - "\x6f\x38\x25\x9c\x13\x9c\xb2\xdd\x20\x5b\xd2\xee\xee\x94\x7c\xba" - "\x89\xe5\xb5\x92\x2d\xb9\xa2\x99\x58\x11\xea\x87\x4d\xac\x08\xb5" - "\x19\xf1\x6f\x2b\x6d\x06\xfa\xcd\xfb\x3c\x95\x13\x4d\x21\x7e\x00" - "\x86\xdd\xdc\x76\x4c\x4c\x22\x1d\xa5\xb3\x59\xb9\x7d\xe2\xe3\x69" - "\x13\xbf\x92\x69\x26\xbb\xd9\xfb\xbc\x3c\x7e\x11\xff\x2a\xf9\x6a" - "\x8a\xfc\xce\x87\xd8\x4e\xca\x4f\xc6\x87\x25\x27\x3d\xb2\x17\xd2" - "\x78\xcb\xc4\x06\xc9\xce\xd7\x87\xd8\x4a\xa9\x0d\x23\x3b\x19\xda" - "\x56\x45\xed\x0f\x6d\xab\xe2\xf7\x0c\xb6\x91\xf1\xe9\x5f\xbf\xad" - "\x8a\x37\x92\xdd\x92\x6d\x64\xa8\x2d\x88\xcf\xa8\x0d\xf1\x65\x27" - "\x5e\x90\x7d\xd9\x80\x1d\x9d\x58\x40\x36\x0a\xf3\x6f\x92\xf2\x46" - "\x3b\x31\xf2\x9c\x9c\x37\xc6\x6b\xda\x0d\x28\x9b\x95\x51\x49\x28" - "\x53\x8d\x92\x0f\xc8\x75\xf3\x06\x9d\xc5\xa7\x19\x4f\xe3\x9d\x23" - "\x49\xce\xec\x9b\xbf\x84\xae\x40\x5b\xd1\xd2\xbb\x45\xe6\xef\xa4" - "\xa7\x83\xfd\xc2\xe3\x47\xd9\x01\x4f\xe5\xa4\xb9\xc1\x65\x3c\x84" - "\x61\x47\xa4\x31\x04\xce\x5b\x8e\x6b\x12\xf9\x2b\x21\x65\x13\xe5" - "\x98\x94\x4c\xe5\xa0\x3e\x11\xe6\xef\x23\xbf\x87\xce\x67\x46\xbd" - "\x29\xab\x1b\x90\xf9\xd1\xe7\xbf\xb2\x05\xfb\x57\x51\x17\xc8\x56" - "\x4a\x7d\xcf\x56\xf4\x77\xca\x83\xc7\x62\x96\x2d\x4c\x37\x58\x0a" - "\xf3\x37\x17\xaf\xbf\xcf\x90\xbf\x39\xbf\x38\x3f\xa7\x20\x7f\x67" - "\x4e\x71\xfe\x96\xcd\x33\x37\xe5\x6c\xc8\xcf\x35\x6c\xcf\x29\x32" - "\x24\x5a\x67\x58\x47\x42\x00\x74\x9e\x21\xa7\xa8\x68\xeb\xa6\x3c" - "\x93\x61\x73\x7e\xee\xac\xc2\xbc\xa2\xbc\x62\x43\x4e\xe1\x96\xad" - "\x9b\x4d\x86\x19\xa6\xd9\x33\x12\xbf\x6f\x1a\x19\x3c\x86\x36\x4d" - "\x07\x3d\xfe\xeb\x5f\x74\x1f\xb9\x0e\xda\x68\x95\xa5\x30\xda\x9a" - "\xbf\x59\x8c\xd9\x4d\x7e\x7b\x4e\x15\x58\x30\x3e\xaa\xae\x92\x78" - "\x3d\xa9\x09\xef\x1a\x82\xc3\x72\x1a\xf0\x59\x8b\xb4\xc7\x7b\x2a" - "\x27\x9b\x9d\x9a\x69\xe9\xc4\x33\xe4\x85\x01\xcb\x16\xcf\xae\x7f" - "\xdc\x8d\x3e\x9b\x85\xe6\x04\xd4\x5d\x87\xb8\xf2\x6d\xa0\xc1\x2b" - "\x0a\x2f\x9d\x5a\x47\x63\x5d\x93\xd1\x16\x4c\x69\xe2\x67\x8e\x69" - "\xa6\x24\xbb\x62\xe6\x27\xb1\xf2\xf9\x49\xa2\x5e\xa6\x3c\x20\x8f" - "\x71\xaf\xd8\x0f\x2b\x48\x3e\x3b\x35\x53\xf8\xf8\xec\x5e\x94\x65" - "\x1a\xf7\xed\xfd\xe5\xc3\x29\xe8\x0f\x5e\xa0\xb1\x5b\x8c\x7b\xc0" - "\xad\x86\x28\xa4\x4b\xd3\x5c\x92\x08\xaf\x60\x5e\x45\x7a\xc6\x3c" - "\x95\x53\x40\x1e\x4f\xc3\x32\xe8\xb0\x2c\x1d\x52\x39\xfe\x93\x97" - "\xe3\x28\x4b\xa8\x8a\x45\xfa\x2a\x89\x9e\x29\x33\xe5\x32\x20\xdd" - "\x1d\x4e\xcd\xe4\x72\xa4\x53\x47\x74\x85\x1b\xeb\xa3\xf1\x2e\xa4" - "\x73\xab\x7f\x1b\xf2\x6d\xb2\x38\xdf\xf5\x48\xad\xd0\x3f\x2c\xcf" - "\xa9\x3a\x7c\x3e\xfc\x25\x44\x1d\x2a\x84\x38\x66\x9b\xc2\xda\xdc" - "\x3e\x70\x98\x3b\x20\x7a\x07\x73\xb1\xff\xf5\x45\xb7\x54\xa6\x7a" - "\xb2\x0d\xff\xf2\x6c\x87\x86\xca\x84\x6d\x45\x54\xdd\x97\x43\x8e" - "\x2d\x6a\x5e\x19\xcb\xdc\xec\x8d\x60\x9f\xcb\x30\x82\x78\x42\xfe" - "\x56\x2f\xb6\x53\x58\x06\x17\xe6\x9d\x26\xf9\xc6\x6e\xd6\x97\x15" - "\xe4\x4b\x4d\x21\x39\x73\x0f\x81\x5b\x2b\xe3\x66\x6a\x7e\x2e\xb2" - "\x5e\xd4\xbf\x61\x2b\xa6\x71\x05\xf0\x1b\xd2\x95\xf8\x09\x27\x3e" - "\xbb\xe4\x7c\x44\x3f\xdc\x40\x3e\x81\x0b\x65\xd9\x35\x44\x7e\x09" - "\x95\x47\xd9\x79\x07\x86\x1f\xf9\x0a\xc8\x57\xc0\xf6\x99\xe3\x6f" - "\x44\xbe\xc7\x11\xfe\xbd\x63\x01\xf6\x21\x4c\x6f\xe5\x94\x34\x1a" - "\xdf\xc5\x38\xd4\xff\xa8\x14\xe5\x98\xb5\x24\xcf\xf3\x14\xf2\x9c" - "\x52\x49\x3e\x61\x15\xe2\x47\x19\x3a\x72\x0d\xc8\x5f\x3b\x3b\xbb" - "\x0a\x8c\x94\x0f\x3e\x9f\xa3\xf1\x10\x4f\xe5\x54\x83\x9c\x1f\x43" - "\xf9\x3f\xec\x17\x63\x30\x92\x6c\xcd\x74\x58\xbb\xe9\xbb\x08\x6b" - "\x46\xfb\x4e\x34\x92\x8c\x61\x9a\x0c\x59\xa6\x50\xd6\xcf\x73\xb9" - "\x8a\x03\x23\xab\x34\x74\xd4\xc5\x22\x1c\xca\x55\x2d\xca\x13\xc9" - "\x15\xc2\x96\xc9\x32\x85\xb2\x76\x8e\xe0\x90\x86\x91\x8d\x3b\x53" - "\x34\x64\x23\xbb\x34\x53\xaf\x91\x8c\xb1\xd7\x7e\xd4\xc1\xc6\xad" - "\xe9\x10\xf5\x34\xf5\x9a\xc3\x2b\xea\x20\xc0\xf7\xa9\xad\x41\x7c" - "\x3f\x87\x72\x3c\x92\xf8\x2c\xc6\xaa\xa7\x5e\x43\xda\xce\x71\x5f" - "\x7c\x17\xd6\x01\x6f\xab\xa6\x9e\xa6\xf4\x12\x0f\xcf\x06\x78\x38" - "\x4d\x17\x8e\x87\x0a\xde\x69\xe8\x62\x95\xd3\xe2\x49\x57\x30\x4d" - "\x2a\xb6\xa2\x5d\x43\x7d\x2b\xc0\x3c\x34\x9a\x2a\xd0\x52\x1e\x2d" - "\x71\x1c\xbe\x58\xce\xe3\x08\xf2\xda\x55\x6a\xbe\xa9\x3c\xb7\xd4" - "\x03\xd0\x98\x38\xa5\x4f\x88\x23\xfe\x4e\x3b\x1d\x48\xcf\xdc\xca" - "\xf4\x33\x72\x43\x68\xe5\x17\xd2\xda\xfa\x4a\x2c\xca\x91\xa0\xd7" - "\x7d\x33\x7a\x13\x0c\xa2\x9d\xb4\x4f\x23\xf9\x9e\x3e\xcb\x81\xbd" - "\x5d\x0a\x93\xde\xe3\x7b\xb1\xed\x51\x8e\xef\x0f\xfd\xbd\x61\xfa" - "\xa6\xd0\xef\x0d\xd3\xb3\x86\xfa\xde\xa0\xc8\xf7\x1d\xca\xd7\x5f" - "\x97\xa1\x0a\xca\x9b\xb7\x7b\x43\x7d\x5b\x98\x5d\x1f\xdc\x9f\x99" - "\xfe\x15\xd1\xd0\x8e\xed\x14\x9b\x98\xa1\x62\x88\xa7\x85\xb7\xe1" - "\xd3\xbd\xc2\x7f\x21\xbf\x68\x7a\x07\xc1\x28\xcb\x31\xf0\xd3\xc6" - "\xfd\x8a\x6e\x5f\xf1\x97\xc8\xc5\x40\x33\xfc\xc1\x60\x96\xa3\xd5" - "\x21\xc0\xc0\xc2\xbc\x44\x01\x4c\xe5\xf0\x0c\x7f\x22\x48\x7a\x77" - "\xf1\x17\xcd\x00\xfc\x40\xfc\xdf\xf0\x1b\x21\xe8\xe5\xf8\xbc\xa0" - "\x92\xf2\x3b\x10\x04\x91\x7a\x93\xd4\x0c\xe4\x24\xe1\x7e\xcf\xe1" - "\x55\x96\x81\x7e\xe4\xd4\x93\x1c\x98\x31\x9f\x84\x5f\x7e\x67\xc1" - "\xef\x14\x12\xfa\x8e\xbf\x88\xac\xa0\x0c\xa6\x44\x98\xf8\xf4\xae" - "\x04\xe7\x40\x90\xba\x5e\x17\x9c\xa5\x0e\xca\x22\xf9\x43\x34\xfd" - "\xf1\x22\x3e\x23\xc6\x4f\x6d\x1d\x00\xb8\xdd\xbd\x27\x08\xfc\x37" - "\x82\xfc\xe9\xfa\x9b\x94\xf1\x9b\xfe\x26\x07\x3d\x4f\x11\xb7\x69" - "\x1d\xdf\x22\xfe\x9b\xff\x0c\xe7\x46\xc8\x8f\x01\xf1\x98\x9e\x1d" - "\x0e\x34\xc0\xff\xe9\x76\x39\x28\x58\x42\x03\xf1\x77\x26\x87\xbe" - "\x1b\xbd\xa1\xef\xf7\xa4\xfd\xed\x84\xa3\x0e\xd2\x9f\x52\x67\x0c" - "\xc0\xdd\x71\x03\x81\xd1\x0a\x95\x89\x2e\x57\xa8\x50\xe0\x27\x51" - "\x13\x81\xf4\xd4\x04\x05\x6b\xc2\x43\xff\xdf\xf9\x4d\xd8\x23\x29" - "\xc4\x14\x97\x6e\x50\xe4\x02\x45\x18\xbd\x0f\x33\x48\x61\xf7\xfe" - "\x6a\x10\x3c\x0f\x33\x04\xbd\xab\x52\xf0\x4f\x3d\xc0\x8c\x82\x6f" - "\x83\xd6\xef\x7e\xff\x3f\xfc\xa9\x48\x3f\xbe\xfb\xfd\x5f\xfa\x31" - "\xd1\x8a\xa3\x25\xe2\x37\xfa\xc7\x06\x0c\x25\x93\x22\x98\x14\xc0" - "\xa4\x87\x6f\xa5\x1d\xff\xee\xf7\xdd\xef\xbb\xdf\x77\xbf\xef\x7e" - "\xdf\xfd\xbe\xfb\xfd\x7f\xe0\xa7\xe2\xfd\x08\x26\xfd\x06\x9e\x07" - "\xe2\xa9\x1b\x64\xae\x61\x6a\x15\xb0\xa0\x88\xb2\xfb\x41\xa5\x85" - "\x61\x9a\x6f\xcf\xcb\x33\x0c\x10\xf4\x35\x13\xd0\x99\x7d\xf7\xe2" - "\xf5\x3d\xbc\x26\x06\x85\x4f\xfb\xb6\x28\xfa\x9b\x7f\x2a\x64\x5e" - "\x04\xf6\x0b\x23\x61\x18\x0c\x07\x2d\x8c\x80\x91\x70\x1b\x44\xc1" - "\x28\x18\x8d\xfd\x4d\x1d\xc4\x40\x2c\xdc\x0e\x71\x30\x06\xc6\xc2" - "\x38\xd0\xc3\x78\x98\x80\x25\x89\x87\x49\xd8\xb7\x9f\x82\x0c\x99" - "\x1a\xbe\x2c\x65\x90\xa2\xc7\x3f\xf8\x3f\x1d\x52\xf8\x7b\xf6\x77" - "\xe1\xff\xad\xe1\x76\x29\xfc\x9c\x14\xee\xfc\x2e\xfc\xbf\x35\xdc" - "\xf0\x3f\x7c\x9f\xfa\x3f\x7a\x57\xa1\xc9\x16\x56\x5b\x15\xd6\x56" - "\x2a\x43\x55\xd2\x6f\xe0\x1d\x6e\x91\x7e\x10\xbe\xd0\xf4\xca\x5f" - "\x0a\x5e\x73\xc5\x63\x29\x80\x18\xe7\x65\xc1\x3f\xdf\x50\x29\xe5" - "\xdf\x9e\x2e\xbc\x5c\x78\x21\xe4\x1e\x6c\x61\x6c\xb7\xe1\x35\x46" - "\xc6\x23\x60\xb4\x78\x5d\xc1\xf8\xcf\x1a\x00\x9c\x17\xf0\xc2\x6c" - "\x3f\xb7\x02\x74\x46\x01\xfc\x79\x29\xc0\x7f\x9e\x02\xb8\xd8\x13" - "\xc0\xd9\x5b\x16\xa0\xee\xaf\x16\xf1\x6c\xc0\xeb\x3a\x21\x02\xa7" - "\x6a\x60\x78\xcf\xbe\x28\x23\xcd\x70\xef\xec\xb9\xb3\xef\xff\x5e" - "\x8e\x61\x56\xfa\x2c\xc3\x7d\x89\xf7\xde\x3b\x27\xf1\xfb\x73\xee" - "\xfd\x81\xe1\xbe\xfb\xe6\xdd\x9b\x38\x2f\x31\xd1\xb0\x69\x47\x61" - "\xfe\xbd\x89\x1b\xf2\x0c\x9b\x4d\xf9\x45\x86\xf5\xf9\x85\x9b\xb6" - "\xe7\x14\xe6\xdd\xaa\x5c\xdf\xf0\x47\xe4\x4d\xf2\x03\xaf\x81\x50" - "\x6e\x2f\x00\xcd\xcc\x34\xd0\xcc\x4f\x81\x41\xd5\xa3\x2a\x97\xc6" - "\x52\x8d\xd2\x15\xf6\xb7\xe9\xa9\xc7\x7f\x3f\x63\xcd\xe8\x0f\x1e" - "\xda\x30\x63\xfe\xc2\xb7\x8e\x34\x82\xfa\x7b\xad\xa0\xbe\xa7\x00" - "\xd4\x53\x67\x82\x7a\x4c\x06\xa8\x87\x77\x81\x7a\x4b\x12\xa8\xd7" - "\xdb\x41\x9d\x65\x02\x75\xba\x05\xd4\x0f\x87\x09\xdb\x5d\x20\xc2" - "\xfe\x59\x07\xea\x9f\x94\x83\xfa\x8d\x12\x50\x1f\x3a\x25\xc2\x5a" - "\xab\x40\xfd\xde\x2d\x6b\xfb\xbf\xf9\xf7\x75\xfd\x89\x41\x3f\x27" - "\x97\x39\x5a\x0f\xb0\x33\x3e\xcc\xa0\xe9\x77\xbf\xef\x7e\xdf\xfd" - "\xbe\xfb\x7d\xf7\xfb\xee\xf7\xdd\xef\xff\xe5\x3f\x97\x0a\xe6\x7e" - "\xa9\xd6\xc0\x07\xe8\x2d\x79\x6c\xda\x78\xa7\xea\x81\xb9\x34\xc7" - "\x04\x68\x2d\x15\x68\xf9\xbe\x2f\xe2\xd2\xe0\x2d\x12\x1b\xfe\x61" - "\x78\x0d\xd7\x06\xcf\x55\xa1\xb9\x48\xcd\xfa\x44\x88\xd0\x83\x98" - "\x37\x65\x63\xe7\xc4\x7a\xe7\xfb\xa0\x07\xb4\x7c\xcf\x03\x5a\x3f" - "\x8a\xf8\xad\x4e\xf8\xfb\x7a\x79\x9e\x95\x0c\x47\xf3\xac\x68\x5e" - "\x16\xc2\xf2\x79\x27\x43\xcc\xab\xd1\xb1\xd7\xf4\xea\x85\xc7\x01" - "\x68\x1d\xea\x2b\x47\x99\xab\xa5\x04\xa0\xb9\x41\xac\x47\xa5\x39" - "\x37\x88\xbf\xc3\x09\x07\x1a\xc4\x3c\x2b\xe6\xde\x8b\xe1\x18\xd6" - "\xe3\x84\x97\xaa\xa4\x3c\x7b\xe4\x70\xc7\xbe\xeb\xd0\x62\xe0\xeb" - "\x6d\x5c\x2d\x86\x7e\x48\x9d\x4a\xe5\x1f\xa1\x47\xd8\xf8\xa1\xe6" - "\xd8\xc8\xf3\xc9\x28\x6f\x09\x3e\x4d\x91\x1f\x96\x71\x44\x96\x9c" - "\xdf\x10\x38\xa2\x28\xad\x8c\x07\x69\xef\xc1\x34\xe5\x32\x1e\xa4" - "\x47\xa6\xd1\x95\xba\x8b\xe7\x71\x2a\x1c\x4d\x86\x0f\x93\x23\xf3" - "\xbe\x3f\xa7\x2b\xf9\xfc\xfa\x04\xc3\x98\x7b\x17\xe5\x25\xdc\xc9" - "\x12\xa3\x67\xbe\x9c\x78\x5b\xca\x88\x94\xd1\x73\x56\x26\xaa\x75" - "\xea\x69\xea\xc4\x58\x9d\xfa\x8e\x75\xf4\xf7\xdc\x64\x23\xbf\x1b" - "\x34\xc9\xfb\x4c\xdf\x37\x0c\x5f\xf0\xe2\x0b\xdb\x52\x7e\xfe\x93" - "\xc5\x29\x8f\x3c\x5e\x74\xd7\x07\x89\xea\xdb\x7f\xfb\xf2\x7b\xc6" - "\x2f\x09\x62\xea\x34\xfa\x9b\xd5\x1c\x11\x77\x97\x8d\xb0\x9c\x1b" - "\x6f\xf8\x80\x42\xee\xd6\x24\x17\x9b\xee\x9f\xd3\x40\x39\xae\xce" - "\x9d\x65\xa3\x34\x8b\x97\x89\x34\x02\x62\xce\xe9\xe0\xb8\xd9\xff" - "\x4c\xa9\x0d\x9c\x06\xd0\x08\x5c\x03\xb8\xc7\x09\x0a\x45\xe8\xb4" - "\xb6\xc4\x49\x52\xde\x6f\xd2\xdf\xa7\xde\x9a\xad\x46\x0c\xb1\xb3" - "\x1e\xa6\xd8\x39\x9e\x44\x8f\xa1\x25\x59\xb3\x21\xc1\x38\xfc\xde" - "\x9f\xe0\x53\xc2\x86\x04\x9d\x1a\x9f\x5f\x14\xcf\xc4\x03\xd3\x0f" - "\x04\x84\x4e\x3d\x23\x2e\xd9\x64\xfa\xfe\x67\x6e\xd3\xf7\x75\xea" - "\x94\x06\x53\x72\xca\xd8\x83\x05\xf7\x24\x24\x27\x98\xee\xd7\xa9" - "\xf9\x7d\x5e\xca\x8c\x1f\x3f\xa5\x53\xdf\xf9\xab\xc4\x18\x9d\xea" - "\xd7\xf5\x2a\xf8\x50\xbd\xea\xd4\x87\x11\x9f\x7e\xfa\x11\xdc\xbd" - "\xe9\x23\xd5\xdd\x4b\x3f\x52\xab\x62\x3e\x8a\x7a\x12\x7e\xad\x1b" - "\x0e\xbf\xd6\xe3\x65\x78\x04\x5a\x55\xa5\xe9\xad\xea\xed\xd9\xad" - "\x11\xa5\xed\xad\x9a\x27\xa0\x35\x72\x6d\x4c\xeb\xb0\x47\x1e\x6b" - "\x1d\xfe\xc4\xe7\xad\xda\x3b\xa1\x75\x04\x40\xeb\x54\xf4\xf3\xa7" - "\x41\x5c\xeb\x7d\x31\x2f\xb4\x3e\x32\x59\x6d\xbf\xbd\xf7\x21\xfb" - "\x04\xcd\x62\x7b\x82\x0e\xec\x33\x46\x82\xfd\x8e\xa8\x28\xfb\x9d" - "\x78\xdd\x05\xf5\xf6\x44\x7c\x4f\x86\x78\x7b\xe4\xce\x61\x00\x82" - "\x96\x8f\x0c\x00\x1f\x4d\x85\x05\x1f\x4d\xc3\xfb\x74\xbc\x12\xf0" - "\x9a\x81\xd7\x9d\x78\x61\xff\xe5\x23\xda\xdb\x08\x8c\xc3\x92\xff" - "\xd7\xaf\x72\x72\xe6\xe6\xdc\x9f\xb1\x30\x22\x22\x2f\x01\x6e\x43" - "\xae\x69\x92\x13\xa6\x46\x26\x45\xe6\x25\x7c\xe6\x4e\xc1\xbf\x3a" - "\xf5\xd3\xff\x1e\x31\x6c\x8e\x27\xc9\x93\xfd\xf3\xcf\xfa\x61\x24" - "\xf2\x1f\x94\x32\xdc\x6b\x03\x95\x1b\x69\x74\xdb\x7a\x1f\xf2\xd8" - "\xa2\x74\x4e\x18\x61\x96\xe5\x58\xc4\x7d\xa0\x73\xdb\xca\x50\xfe" - "\xa2\x66\x86\x8f\xdb\x43\x71\x69\x37\x49\x67\x0a\x1f\x47\x32\x1d" - "\x55\x26\xc7\xf5\xaa\x9b\xd3\xf1\x1d\xe5\x5f\x9b\x14\x0a\x6b\x8f" - "\x70\xdb\x54\x7b\x30\xee\xd4\x60\x3c\x76\xc4\x93\xfa\x63\x8c\x6b" - "\x0d\x13\xf7\xa8\xdb\xb6\x92\xf2\xe8\x52\xe4\xe1\x96\xf3\xa0\x75" - "\xde\xb5\xa8\x5f\x64\x77\xfc\xb6\x11\x4d\x94\xd6\xe1\x75\x41\x83" - "\xbf\x5b\xa5\xb1\x9e\x05\xc2\xe3\xb1\x8d\x4a\x90\xd3\x13\x1c\xed" - "\x49\x40\xeb\xf3\xf8\x3c\x50\x18\xb5\x9a\xe6\x81\x1e\x46\x1c\x86" - "\x6d\xaa\x71\x9d\x10\xd5\x4f\x69\x9c\x30\xca\xec\x56\x7f\x82\x79" - "\x8f\xca\x96\xed\x1c\x86\xf1\xb5\x00\x94\x07\x96\xbd\x0c\xe3\x4a" - "\x06\xd3\xfc\x49\xac\xe0\xcb\xa8\x6a\x39\xee\x66\x73\x0b\x45\x1a" - "\xc6\xdc\xb6\x4f\xfc\x98\xe6\xec\x60\x7c\xac\xcc\x6d\x53\xbf\x80" - "\x71\xdd\x61\xe2\xf6\x88\xbc\x46\x6b\xc2\xc4\xd9\x30\x4e\x8d\x71" - "\x86\x21\xe2\x22\x30\x2e\x39\x5c\x5c\x4b\x0d\xc7\x99\x39\xc0\xf3" - "\xd1\xa3\x52\xf0\xdd\x2c\xf3\xfc\xd6\xe5\xa1\xfa\xbe\x17\xf9\x3e" - "\xba\x46\x89\x9f\x70\xbb\xd5\x6d\x84\xaf\x69\x70\xde\x67\x55\x6e" - "\x5b\x1a\xca\xc2\xe8\xf3\x83\xe3\x7e\x33\x11\xf9\x40\x74\xb9\xc2" - "\xc4\xc5\x63\x79\xd0\x5e\x47\x47\x85\xc1\x39\x0c\xe3\x9c\x18\x67" - "\xbc\x45\x7d\xe8\xb8\x0d\xa7\x7d\x10\x26\x43\xe4\x45\x88\x9d\x4f" - "\xe5\x11\x72\x01\xc3\x2e\x42\x4c\x5b\xaf\x98\x13\xef\x32\xec\x84" - "\x08\x7c\x3f\xc1\x6c\xf6\x31\x18\xdf\x83\xf2\xa4\x75\x5c\xf7\xc1" - "\x45\x88\x3e\x88\x30\x11\xb4\x86\x95\xda\x27\x0c\x8f\x70\x78\x7d" - "\xb4\x8e\x03\xe5\x2c\xfa\xa7\x78\x57\x63\x3a\xbe\xc6\x6f\x55\x0d" - "\x24\x10\x8d\x7c\x1e\xab\xcd\xae\xa2\x79\xa1\xd4\x1e\xba\xd5\x70" - "\xa7\x9b\xcb\x6c\x34\xb6\x7f\xda\x7a\x69\x0e\x2f\xd1\xa0\xc1\xb4" - "\xbb\xd4\x3a\x3e\x27\xdc\x85\xb8\x88\x86\xc7\xfc\x36\xbb\x7a\x00" - "\x8f\xda\x7e\x1b\xcd\xef\xed\xb5\xa9\x97\xb8\xd5\xd1\x4c\xe0\xd1" - "\x19\x64\x3c\x04\x87\x79\xf1\x79\xf2\xbd\x36\x4d\x65\x10\x4c\x6a" - "\x70\x5e\x73\xdc\x10\x41\x34\x77\x82\xae\x86\xf2\x93\xca\xc8\xe7" - "\xdc\x3a\xb6\xf9\xc0\x81\xfe\xc5\x45\xd0\x59\xb1\xac\x86\x66\x2f" - "\xad\x75\xb6\xc7\xd4\xed\x06\xe0\x7a\xa1\x06\x83\x84\xb3\x5a\xc6" - "\x49\x38\x82\xca\x1a\x2b\xf2\xa7\xb2\x6a\x41\x82\x6d\x09\xa6\x91" - "\xf0\x62\xb9\xc6\xd5\x22\x5c\x0b\x7a\x2d\x12\x4c\xb7\x0c\x13\x54" - "\x07\x53\x25\xfa\x88\x3f\x54\x67\x59\xb2\x7e\x7a\x6c\x31\xd8\xfe" - "\xdf\xd6\x2d\xf4\x36\x10\x2e\xd1\xa0\x17\x34\xa8\x90\x06\x95\x5d" - "\xe0\x8f\x49\x93\xf1\x3b\x41\xe7\x0d\xa6\xb9\x96\xc3\xea\x46\x08" - "\x3d\xe5\xb0\xc5\x01\xd8\xe8\x10\x58\xe4\x85\x5a\xd4\x01\xa8\x9d" - "\x10\x63\x42\x7e\x44\x20\x4c\x23\xd6\xb7\x41\x86\x91\xca\xaf\xc7" - "\xb8\x05\x12\xbe\x96\x20\x7c\xc5\x84\x8f\xe6\xc5\x0a\xdb\x1b\xe3" - "\x0c\xd8\x3e\x68\xc5\x77\xd7\x60\xfb\x4a\xfa\x1a\xab\x45\xb8\x04" - "\x0a\xb7\x4c\x03\xdd\x25\x88\xf9\x73\xaf\x3a\xa2\x5b\xf0\x22\x16" - "\xed\xdf\xa8\x01\xdf\x06\xdf\xe7\x3a\xc1\xe0\x95\xf2\x33\x11\x6f" - "\x02\xf6\x96\xf2\x8c\xcd\x90\xf3\x94\xe3\x83\x75\x26\x65\xc4\x1c" - "\xf4\x4f\x52\xfe\x3e\x25\x3e\x65\xb2\xec\xbb\xcc\x6f\x59\x9f\x30" - "\xc7\x3d\xbf\xc5\x70\x7f\xe2\xdb\x79\x09\x33\x79\xdb\x7f\x67\x67" - "\xe2\x34\x6c\xdd\x7f\xcb\xff\x56\x52\x48\x02\x0f\xc1\x70\x7a\x9e" - "\x46\xcf\x92\xbf\x80\x4f\xab\x57\x45\x0c\x9f\x51\x48\x4f\xc2\x73" - "\x48\x19\xfb\x4c\x6e\x44\xaa\xf4\x3c\x5a\xc4\xdc\xc3\x7d\x0e\xe3" - "\xc3\xf4\x7c\x07\xc7\x35\xa7\x81\x72\x9e\xfd\x72\xe2\x0f\x1f\xff" - "\x97\x88\x8f\x5e\xd8\x98\x12\x75\xa7\x8d\x60\x66\xfe\x28\xf1\x0d" - "\x0c\x69\xa6\x90\x69\x6f\x72\x0a\x82\x53\x9d\xa6\x54\x52\x7c\xfc" - "\xcc\x45\x89\xaf\xae\x59\x35\xfd\xb7\x89\xb1\xb7\x7f\x90\xd5\x4c" - "\xe9\x6f\x8f\x0d\xc9\x69\x5a\x80\xaa\x75\x47\xee\xda\xff\xbd\xb7" - "\x05\x96\xc7\x57\x45\xfc\x36\x65\xf2\x96\x42\x0a\x9d\xce\x7d\x31" - "\xf2\x55\xe6\x5c\x4b\x8c\x7c\xe1\xf1\xcf\xfe\xf5\xf1\xb7\xce\x3d" - "\x75\x17\x96\xf4\xf6\xca\x73\x4f\x3d\xfe\xd6\x67\xff\x1a\xb1\x97" - "\x20\xef\x36\x25\xc6\x19\x22\xe7\x6f\x6d\x79\xec\x2e\x4e\xd5\xb8" - "\x83\xfa\xea\xf1\x0d\x13\x1a\x27\x9e\x89\x6f\x9d\xf4\xef\x93\xff" - "\x34\xe5\x0b\x83\x7b\x2a\x43\x3f\xe2\xa1\xc4\xa9\x03\x7e\x04\xa0" - "\x1f\xd1\x89\x7e\x44\x29\xfa\x11\xed\xc1\x7e\xc4\xc7\x23\xe7\x95" - "\x08\x5f\x42\xc0\x0b\xff\x67\xe6\xbf\xa3\xff\xb3\x19\xfd\x9f\x99" - "\x1f\x45\xae\x7e\xe2\xa3\xa8\x0c\xe1\xff\xc4\x44\x0f\xe3\x3e\xd0" - "\x78\xbc\xa3\x1f\xf4\xeb\xa9\x78\x37\xe2\xfb\x5d\xb1\xc3\x43\x7d" - "\xa2\x95\xa3\x5b\x23\xb3\xd0\x27\x4a\x46\x9f\x28\x25\xa7\x55\xbb" - "\xe4\x57\xad\x23\x92\x52\x5a\x47\x0e\xf8\x45\x8b\x5b\x53\xf5\x73" - "\x5a\x97\x68\xa0\xf5\x51\x10\xbe\xd1\x3e\x48\xfc\x58\x13\xa7\xfa" - "\x4d\x14\x68\x7e\x33\xba\x7e\xe4\x6f\xa2\xed\xf6\xdf\xe8\xf0\x8a" - "\x81\xfa\xdf\xc4\xc2\xf0\x0f\x1e\xaa\x87\x0f\x16\x96\x3a\x3f\xd2" - "\xc0\xe8\x8f\x46\xc0\xb5\x8f\x62\xf0\x9e\x7d\x14\x3e\x7a\x11\x34" - "\x1f\x8d\xd4\x5c\x0b\x94\x37\xee\xcf\x1f\x4d\xfd\x70\xfe\x47\xd3" - "\x92\x7f\xf9\xd1\xf4\xd4\x95\x1f\x25\x7c\xf8\xe1\x47\x33\x9c\x93" - "\x83\xfd\x26\x2a\x33\xc0\x3d\xfb\xc8\x83\x45\x7e\xdf\x6f\x1c\x96" - "\x38\x6c\x7f\x1e\xf7\x07\xbf\x2f\xf9\x85\xdf\x4f\x59\xf4\xc2\xe3" - "\x8f\xe7\x46\xa8\x53\x26\x73\xef\x52\xf2\x34\x03\xde\x67\xa8\xcf" - "\x39\xbf\x25\xe0\x73\x26\xb8\x03\x3e\xa7\x61\xd8\xfc\x6d\x21\xfe" - "\x59\x1f\x86\x9d\x4f\x4e\x30\xcc\x48\xe4\x9e\xd9\xb9\xf1\x4a\x6f" - "\x6d\xf6\xa1\xc4\xf9\x09\xda\xfb\x3b\xd0\x67\x1b\x7e\xe0\xc5\xdc" - "\x9f\xd0\x85\x5e\xdb\x57\x3a\xf5\x0b\xcf\xe6\x24\x65\xee\xbd\x1b" - "\xeb\xfc\x76\xf2\x82\x87\xbf\xb8\xbf\xe9\xc5\x17\x5f\x68\xfa\xe8" - "\xa9\x55\x77\xfd\x33\x86\x7d\x90\x50\x8c\xf2\xf3\x1f\xa6\xff\x98" - "\x73\x2d\x39\xf2\xc5\x27\x9a\x5e\x78\x6d\xc3\x86\x16\x92\x17\xaa" - "\x5b\xb9\x8d\xea\xb5\xc5\xa2\x4f\xa2\xfa\xb9\xc7\x36\x06\xfd\x9f" - "\xf1\xad\xca\xb6\xec\x3b\xbd\xfc\x4e\x2f\xbf\xd3\xcb\xff\x09\xbd" - "\x1c\x0b\x42\x2f\xc7\x1f\x0c\xa7\x97\x4b\x96\x2f\x5e\x31\xcf\xb0" - "\x35\xd7\x60\x29\xdc\xb2\xa1\x30\x67\x93\xa1\x60\x4b\x8e\x29\xcf" - "\x34\x12\x06\x22\x72\x72\x8b\xf3\xb7\xe5\x14\xe7\x0d\x5a\xf3\xa8" - "\x97\x7d\xd2\xc1\xbe\xf5\x78\xef\xd0\xbe\xf5\x84\xb8\xf0\xfd\x12" - "\x15\xb6\xed\x13\x12\xc3\xc4\x4d\x93\xe2\x96\x86\x89\x7b\x58\x8a" - "\x33\x87\xe9\x03\x8e\x12\x7d\x8c\x09\xfb\xc2\xc5\x61\x78\x8d\xec" - "\x93\x60\x3f\x4d\xdd\x32\xad\x07\xc8\x27\xb9\x08\x13\x3e\xc4\x32" - "\x75\x63\xfc\x19\xd9\x97\x71\xc2\x84\x7d\xb2\x8f\x26\xf5\x43\x8c" - "\x6e\x5b\x0a\x96\x73\x82\x33\x4c\x1f\xe5\x6e\x29\x5f\x5f\xc0\x37" - "\x5a\x6e\xf0\xd8\x26\x46\x0d\xf6\x8d\xce\x81\xe8\x43\x4e\x34\x2a" - "\x60\x93\x64\x58\xf4\x27\x69\x2f\x88\x1e\x5a\xab\xd6\x03\x13\xcf" - "\x30\xdb\xf8\x6a\xf2\x29\xa9\x1f\x49\x78\x44\x5f\xb2\x83\xf7\x25" - "\xb1\xaf\xd8\x85\x69\x8b\x83\xfa\x93\x5d\xe8\x1b\x0f\xa7\xfe\xe4" - "\x45\x98\x78\x82\xfa\x94\x87\x39\xae\x4b\x84\x6b\x19\xe1\x72\xc2" - "\x44\x3b\xf7\xfb\x44\xda\xc6\xa0\x71\x33\xec\xd7\x4e\xe4\x7b\x99" - "\xca\x7e\x21\xc6\x9f\x73\x6a\xb2\x7a\xe4\x32\x90\x2f\x28\x95\xa3" - "\x4c\xd4\xc3\xc4\x30\xfd\x9f\x73\x95\xa2\x1f\x18\x3f\xd0\xff\x21" - "\x7c\x7e\xdb\xf8\x9f\xd6\x72\x9c\xf1\x09\x32\xce\x60\xb9\xcc\xdd" - "\xb2\x79\x7d\xfe\x86\xad\x85\x79\x86\xa2\xa5\x4b\x0d\x9b\xb6\x98" - "\xf2\x66\xcf\x9e\x3d\x32\x44\xfe\xa2\x84\x4f\xfb\x49\x0a\xc9\x21" - "\xf9\xb5\x92\x1c\xa6\xa0\xcf\x29\xf9\xcd\xf1\x65\xa1\xfd\x8b\x4f" - "\x52\x24\xff\x56\x87\x30\x89\x12\x4c\x43\x08\x0c\xe2\x93\x7c\x64" - "\xf2\x73\x47\x4b\x30\xad\x4a\x3c\x18\xc7\xfb\x45\xb4\xfe\xae\x57" - "\x94\xaf\x47\x81\xe7\x21\xa9\xbf\x83\x72\x3f\x4c\xea\x27\x4c\xd2" - "\x29\xf0\x3c\x14\xe8\x6f\xa8\x64\x98\xb9\xc1\x7d\x13\x7c\x4f\x95" - "\xeb\x24\xe0\xc7\x37\x77\x0b\xdc\x2a\x5d\xc0\xef\x9f\x54\xa0\xe8" - "\x4b\x8d\x0d\xe0\x06\x9d\x04\x53\x1e\x4a\x63\xf3\x25\xa9\xac\xda" - "\x20\x3c\xa7\x43\xf1\x34\xff\x97\x84\x27\x22\x08\xa6\x43\x41\x63" - "\xf7\x60\x1a\xed\xa3\x05\xee\x7a\xcc\xdf\x29\x95\x6d\xb2\xa2\xfc" - "\x08\xc3\x71\xc7\x21\x4c\xbc\x0c\x33\x37\xb8\x2f\x45\xfd\x39\xbe" - "\x26\x13\x26\x2f\x25\x79\xc2\x6b\x18\xd2\xfd\x97\xa0\x3e\xdd\x70" - "\x29\x9d\xb2\xfc\xa3\x7a\xb1\xbf\x50\x17\xd2\x4f\x9b\xac\x28\x3f" - "\xf6\x0d\x63\x65\x1e\x69\x64\x18\x65\xf9\x9d\x82\xc6\x98\x98\x40" - "\xf9\x27\x77\x28\xf0\x8c\x25\x99\x22\x5c\x41\x79\xf9\x14\x78\x3a" - "\x25\x3e\x06\xf1\x7a\x8a\x41\x51\x1f\xff\x29\xd1\x13\xc4\xeb\x29" - "\xa9\x0a\x3c\x57\x29\x3e\xb4\x5c\x53\xcc\x0a\x3c\x57\x03\xe5\x42" - "\x39\x16\x30\x07\x15\xfd\x58\x35\xb3\x7d\x30\x4a\x81\xa7\x51\x86" - "\xe9\x1d\xf6\x42\xbd\xa8\xdb\x29\x2d\xb2\x2d\x12\xf5\x1a\x9f\x48" - "\xb8\x31\xfc\x42\xb0\x2d\x40\xba\xba\x07\xf3\xc9\x00\x4a\x3e\x05" - "\xd1\x25\xf5\xc5\x0d\x09\x8a\xf2\x5d\x92\xf8\x34\x32\x08\x4f\x9a" - "\xa2\x7c\xff\x25\xe1\x89\x0c\x82\x51\xd4\x7f\x73\x8f\x84\x47\x13" - "\x04\xa3\x94\xff\xcb\x12\x9e\xe0\xbc\x4e\xdf\x9a\x4f\x86\x10\xf9" - "\x27\x5e\x61\x58\xcf\x2d\xc6\xa0\xb4\xe2\xdb\xc1\x54\x6c\xff\xde" - "\xaa\xe1\x6b\xa6\x63\x0b\x0f\xd2\xde\x52\x68\xa3\x53\xf8\xd8\xe0" - "\x0d\xb2\xd3\x53\xad\x75\x68\xcf\x44\x19\x20\x51\xd8\xee\xa9\x7c" - "\xbf\x10\x4c\x9b\xee\x84\xd1\xc5\xc1\xdf\x01\x9c\x30\xf5\xa0\x14" - "\x87\xe5\x1f\xd3\x21\xc7\x51\xb8\x18\x5f\x9c\x8a\xed\xdf\x78\x8b" - "\x68\xc7\xa6\x16\x48\xb0\x68\xf7\xe3\xd3\xc2\xad\x63\x1e\xea\xfb" - "\x4b\x91\x9e\xf9\x4b\xc7\xd3\xba\xe6\x6c\x9d\xdf\xc6\xc0\x61\xf5" - "\x82\x61\x02\x94\x76\xc2\x34\x2d\xf5\xf1\x0f\xef\x04\x6d\xa9\x85" - "\x79\x69\x0f\xdc\x76\x57\x0f\x94\xba\x58\x37\xed\x33\xbb\xfb\x1a" - "\x68\xe9\xbc\x84\xdd\xcf\x81\xbe\xa5\xe4\xcf\x61\xd7\xe6\xfa\xe9" - "\xdc\xc6\x78\x4a\xdb\x05\xed\x35\x5d\x50\x5a\x13\x9a\xb6\x74\x12" - "\xe8\xdb\x68\xcf\x5a\x1b\x44\x13\x1d\xf4\x3d\xc5\x17\x9b\xad\x2b" - "\x39\x06\x9a\x52\xf4\x2e\xdb\x4c\x76\x99\x96\x73\x44\xcb\xbe\x4b" - "\xa0\x7d\x6b\xbd\x5d\xbd\xf7\x12\xd1\x6b\xd6\xbd\xbb\xd3\xab\x6e" - "\xd6\x2f\x85\x66\xfd\x05\x68\xd1\xcf\x87\x16\x6b\x2a\x1c\xbe\x04" - "\x51\xcd\xde\x64\x68\xd1\x2c\x86\x96\x84\x54\x70\xf4\xe0\xb3\xa1" - "\x1f\x61\xdc\x7c\x1f\xa4\x8b\x30\xcd\x5e\xf5\x2c\x68\x9d\x02\x27" - "\xf2\x6c\xda\x59\x79\x4f\x1f\x7a\x0f\x57\x8e\xa2\xf1\xa0\x47\xfa" - "\xba\x91\x96\x07\x3a\x61\x7a\x64\x82\x1e\x12\xa9\xfd\x75\x54\xfb" - "\x40\x53\x02\x23\x86\x90\x8b\x38\xbe\x1f\x28\xfa\x51\xb5\x47\xb1" - "\xad\xc7\x7b\x2f\xca\x84\xc7\x36\x3d\x19\xf3\xbe\x20\x8d\x7b\xf5" - "\x94\x9e\x40\x39\xdb\x9e\x49\xfb\x83\x60\x3b\x3d\x3d\x53\x8e\xa3" - "\x7d\x4e\x69\xff\xd2\x39\x71\xa0\x73\xf8\x52\xe0\xfd\x1b\xdd\xb4" - "\x06\xbf\x87\xf6\x45\x20\x7c\xd8\xe6\x47\xd0\xf8\x13\xd2\x73\x17" - "\xb6\xf1\x3d\xd3\x11\x0e\xd3\x63\xfd\x9f\xe3\xfb\x1a\xb3\x71\x6b" - "\xdc\xfe\x71\x6b\xae\xf9\x5f\x5b\xd3\xcb\x5e\x5b\xf3\x65\xff\x6b" - "\x6b\xfe\x5a\xba\x03\xb4\xfd\xe3\xd6\xb8\xda\x2d\xbc\x0e\x74\xed" - "\x96\xcb\xb4\x9e\x5e\xbb\xeb\x32\xe8\x9e\x79\x0e\xeb\xde\xf7\x47" - "\xd8\x95\x0f\x7a\x7f\xcc\xfa\x56\x87\xef\x53\x78\xa6\x04\x18\x3e" - "\x77\x84\x2b\x5f\x6f\xac\x39\x5d\x1e\x4f\xf3\xd8\x12\x74\x4e\xcd" - "\x5a\xbe\xf6\xdf\x15\x63\x49\xc7\x2b\x03\xaf\x4c\xbc\xb2\x58\xac" - "\x39\x0b\x79\x55\x3a\x7a\x8f\x0a\x68\x1f\x9f\x39\x7e\x50\x5d\x82" - "\x84\x99\x48\xbf\x6e\x08\xbe\xc5\xfb\x2b\xdf\xa5\xfd\x7f\x77\xd3" - "\xfe\xbf\xe4\x03\x90\x7e\x91\x3f\x8a\xf9\x58\x31\x1f\x2e\xdf\xa8" - "\x23\x6e\x16\xfb\x6e\x19\xf9\x74\xee\xe7\xcd\x2a\xd7\xf3\x66\x75" - "\x6f\xec\xbb\x7b\x11\xa6\x06\x61\xca\x24\x1e\x76\x13\x2e\xd4\x1b" - "\xd7\x28\x1f\x44\x20\x4e\xcb\xcf\xaf\x77\x68\x8e\x1f\x65\x17\x10" - "\xae\x65\x00\x17\xe2\xae\xe2\x7e\x52\x42\x87\x1c\x46\x7e\xd2\x21" - "\x84\xa3\xf4\x0e\x6f\x0a\x7d\x33\x74\x3a\x0a\xba\x69\x1f\x8b\x91" - "\xac\x4f\xe4\x47\x3e\x1c\xe9\xea\x28\x2f\x0c\xf3\xd8\x20\x9d\x70" - "\x53\x3a\x47\x4f\x37\x60\xba\xbd\xac\xd4\x8c\xfe\x22\x2c\xf7\x30" - "\xb3\x8a\xf6\xb4\x6d\xc6\xf4\x22\xef\x19\x29\x32\x8d\x94\x07\xdf" - "\xd3\x96\xe8\x44\x79\x68\x2e\xf0\xc2\xa8\x6a\x1a\x27\x87\x55\x84" - "\x8f\x70\xa1\x1c\x38\xb1\xac\x7b\x9b\x0b\x5c\xe0\x67\x21\x38\x9d" - "\x12\xbe\xf2\x10\x7c\x18\xce\x10\x1f\xc9\x5f\x0b\xa6\x19\x55\xcf" - "\xf1\xad\xfc\xb9\x9f\xf0\x79\x41\x63\xe0\xf4\x3e\x4e\x38\xf8\x9e" - "\xd4\x88\xd3\xbe\xed\x61\xf4\x1d\x67\x78\x5d\xa5\xe6\x08\xbe\x7e" - "\x1e\xd3\xbf\xbb\xbb\x3b\x92\xf5\x66\x46\x8c\xe6\x6b\xe7\x1f\x06" - "\xfa\xd6\x8a\x30\xbf\x63\xbd\xe6\x88\x51\x3d\xe8\xeb\x21\x0c\xed" - "\xa7\x45\x74\x06\xd7\xe5\xca\x45\x8f\xcf\x87\xc7\x53\x97\xa4\xce" - "\x87\x65\x0f\x2d\x9c\x0f\x89\x0f\xcc\x4a\x9c\xfb\xbd\x1f\x7c\x8f" - "\x3f\x7c\xef\x07\x49\xdf\x83\xf4\x27\x56\xce\x87\xf4\xe5\xf3\x61" - "\x15\x5e\xe9\xab\x16\xad\x4c\x5d\xb4\x6a\x3e\x64\x2e\x5e\x82\x6f" - "\x0b\xe7\xdf\x9b\xf8\xc8\xac\xf4\x85\x4b\x16\xc1\x63\x19\xf7\x25" - "\xde\x77\x1f\x3c\xb4\x68\xe9\xbd\x89\x89\xd2\xfd\xde\x44\x02\x79" - "\x2a\x69\xd1\xaa\x59\xe9\x85\x5b\x8a\xb7\xcc\x5a\xbe\x64\x21\x85" - "\xc0\xa2\x45\xf3\xd3\x43\xfc\x48\x63\xff\xf5\x7e\xe2\xb7\x9b\x5d" - "\x4d\xa3\x7d\x8c\xa1\x16\xe5\x00\xaf\x1e\xbe\x3f\x12\xdc\xf9\x6f" - "\xb5\x54\x7f\xbc\x2d\xb8\x23\x8e\xda\x53\x8f\xed\x0e\xaa\x7f\x3b" - "\xf1\x91\xf6\x12\xbe\x08\xb3\xe7\x63\xdc\x78\xc9\x1f\x89\xc4\x78" - "\x6f\x68\xfc\x5d\x59\x18\x3f\x85\xf6\xdb\x71\xe0\x85\xbc\x77\xa3" - "\x3d\x44\x1e\xbb\xa0\xb7\x34\x33\x92\xef\x77\x88\xf5\x4e\xfb\x50" - "\x78\x6c\x77\xce\x0d\xd2\xfb\x2e\xda\xaf\x82\xc6\x93\xaf\xc0\x9d" - "\xa3\xda\x8b\x53\x68\x4f\x2a\x70\x14\x4b\x38\xae\x0d\xe0\x18\x29" - "\xed\x99\xe8\xac\xa5\xbd\x40\x04\x9e\x92\x20\x1b\xe1\x24\x3c\x87" - "\x31\x4e\xc2\xf5\x58\x3b\xda\x0a\xb4\xe5\x13\xfc\xa5\x46\x60\xb1" - "\xd9\x7a\x7f\x9f\x11\xc4\xf8\xeb\x9d\xa7\x83\x64\xdb\xdd\x62\x45" - "\xb8\xb7\xd2\x54\xb4\x2f\x03\xdf\xa3\x01\xee\xb0\xa3\x8c\xbb\xfb" - "\x2b\x2d\x39\xec\x2a\xdf\x17\x71\x18\x96\x6f\x16\x96\x2f\xc1\x5f" - "\x69\xc9\xe6\x7b\x8c\x72\x38\x63\x1c\xa3\xf7\x58\x84\xeb\x1b\x08" - "\x1b\x43\x61\x1e\xfa\xbe\x43\x7b\x76\x33\x1e\x1e\x81\xe1\x9f\xa2" - "\x5d\xeb\x40\xd8\x6c\x82\x9d\xe3\x83\xe1\x7c\x3f\x94\x52\x15\x74" - "\x82\x31\xcb\x1f\x6b\x59\x17\x94\x1f\xe1\xc9\x12\xed\x18\xd6\xc5" - "\x55\xc4\xd3\xcb\xc3\xd5\x18\xfe\x0b\xc4\x9f\x4b\xf6\x52\xd8\xf0" - "\xd9\x7c\x7f\x22\x69\x4c\x3e\xf0\x4e\xfb\x3d\xef\x16\xef\xcd\xc8" - "\x4b\xfa\x4e\x40\xdf\xf8\x3d\x36\x23\xfa\x3f\x09\x69\xa2\xad\x9c" - "\xcd\xf3\xa0\xfd\x65\x99\xee\xcb\x46\xc4\x6b\xb2\xef\xec\xe1\x67" - "\x04\x39\xc1\x58\xe0\x2f\x35\x83\x82\x26\x23\xd1\x4f\x36\x04\x79" - "\x31\x0b\xe5\x60\x84\xc7\x76\x17\x28\xe4\x20\x1e\xf1\xe4\x20\x7d" - "\x1d\x58\xa6\x1c\xc4\x93\xe0\xef\x35\x63\xbe\xd8\x5f\x64\x66\xf4" - "\x95\x02\x38\xa4\xf4\x29\xa1\xe9\xef\xec\xa2\x74\x08\x1f\xe9\xe9" - "\x25\xf8\x3b\xbb\x89\xe7\x92\xdc\xa1\x5c\xde\x65\x51\xc8\xe5\x54" - "\xa4\xe5\xfb\x41\xf1\xe5\x8a\xf8\x48\x8c\xff\xa1\x14\x8f\xba\x7f" - "\x57\xa3\x82\xde\xb3\x18\xbf\x00\xe9\x75\xa3\x6e\x47\x60\x7e\x0d" - "\xb5\x92\x6f\x22\xc1\x3b\x15\xf0\x3e\x84\x5f\x48\x72\x43\xed\x0e" - "\xc1\xd7\x49\xba\x83\xf0\x5a\x8f\xed\x6e\x5d\x28\xfc\xac\x3f\x23" - "\xfc\xd2\x00\x7d\x77\x27\x86\xc6\xdf\xed\xc5\xf8\xc7\x48\xd6\xf1" - "\xfe\x34\xf9\xfa\x64\x4f\xc8\x96\x35\x17\x50\x7d\xdd\x9d\xad\x80" - "\x2f\x43\x38\x93\xc4\x23\xb5\xc4\xa3\x06\xa9\xef\x7e\x41\xa2\xa1" - "\x4a\x91\xe6\x34\xa6\x29\x40\x3e\xe6\xc8\x72\x19\x26\x4d\xab\x22" - "\x4d\x37\xd5\x23\x13\xf9\x68\x3c\x7d\x81\x34\x92\x9d\x0c\xc6\x41" - "\x65\xbb\xcd\x63\xbb\x27\x4a\x51\xf6\x54\xcc\xb7\xf8\x90\xb0\x3b" - "\xb7\xa1\x0c\xdd\x87\x61\xf7\x23\xce\x3c\xd2\x81\xc3\xe4\x0f\xba" - "\xbc\xc0\x4a\xd3\xa2\x84\xec\xde\xb3\x69\xb4\x0f\xe8\x79\x16\x3d" - "\x13\x6e\xe6\x59\x2a\xe9\xe4\x3d\x9b\xf0\x4e\xe1\xfc\x7c\x1b\xb2" - "\xc3\xcc\xf3\x23\xbf\xc0\x79\x4f\x05\x9d\x7f\x86\xef\xfd\x52\x1e" - "\xb3\x68\x0f\x51\xa4\x7f\x1d\xb6\x3b\xc0\xb6\x23\xdc\x4e\x58\x88" - "\xe1\x93\xb8\xae\x0a\x38\xfe\x2e\xf2\x48\x23\xf9\x9e\x8b\xef\x63" - "\xa4\xf4\xa3\x08\x1f\x3e\xdf\x2b\x3d\xab\xfa\x09\xd7\x55\x59\x07" - "\x67\xf1\xfd\xe4\x48\x0f\x39\x7e\x4c\x4f\xfb\xb5\x0a\x9c\x33\xff" - "\x8a\xf7\x25\x78\xff\x23\xde\x1f\xc3\xfb\x2f\x68\xff\xd4\xd2\x7e" - "\xae\x8f\xf4\xfe\x36\xde\x57\xe2\xbd\x02\xef\xab\xf0\xbe\x0b\xef" - "\x0f\xe3\xfd\x49\xd2\x0b\xda\x0b\x9e\xf6\xb4\xc1\xb6\x55\xc8\x16" - "\x7d\xfb\xf3\xa4\x11\x0f\x16\x21\x4c\x2a\xd7\x57\x61\x5f\xb4\xa2" - "\x1e\x67\xf2\xf3\x87\x50\x1e\x28\x6c\xb8\x90\x07\x11\xd6\x2f\xdb" - "\xa1\xab\x81\x30\xc9\x36\x49\xba\x28\x85\x09\xfc\xe9\x88\x3f\x9e" - "\x68\x65\x02\x57\xa4\xa8\x73\x09\xbf\x48\xa7\x09\x93\xa7\x2a\x38" - "\x4f\x27\xdc\xe3\xa2\xfd\x90\xf0\x7e\x81\xef\x37\x09\xb3\xa2\x18" - "\x97\x7b\x6c\x67\x39\xbe\x7b\x9a\x24\xb8\x72\xe2\x31\x4f\x2f\xc2" - "\x67\x06\xc9\x52\xac\xc7\x36\x2b\x53\x21\x4b\xe8\xeb\xdf\xf1\x02" - "\xc9\x0c\xf1\x9d\xca\x36\xda\xc2\xdb\x72\x5e\x16\x8e\xff\xaa\x90" - "\xc9\x5a\x69\x6e\x92\xd0\xdf\x59\xf5\x0a\x3c\x67\x10\xcf\x8f\x15" - "\xfa\xde\x13\x68\xd7\x66\x9d\x53\xd8\xa3\x06\xcc\xef\xbc\x13\xf5" - "\x41\xb2\xab\xee\x88\x12\xd2\x97\x59\x5e\x27\x5c\xe2\x7e\x1e\xc6" - "\xaf\x27\x3c\xee\x52\xbe\x8f\xbf\x3b\xc2\x42\xe5\x9d\xad\x97\xe3" - "\x79\x5c\x4c\x23\x6f\xcf\x22\x0a\x78\x1c\xb6\x7f\xd3\x75\x72\x1c" - "\x88\xfd\xe1\xdc\x11\xc5\x3c\x2e\x3d\x80\x37\x3b\x49\xc2\x1b\x11" - "\xf6\x0c\x86\xf2\x6c\xe3\x2c\x00\xf5\xdd\x65\x10\xe9\xf0\x9d\x87" - "\x15\x3e\xd6\x3f\xab\x0c\x46\x38\x7c\xa7\xe0\x2e\x80\x18\x87\xef" - "\x02\xdc\x0d\x30\xd5\xe1\xab\x42\x7f\xa5\x81\xe2\xdf\xbf\x13\x54" - "\x2a\xbc\x97\xde\x51\xa6\x56\x39\x7c\xc5\x90\x50\xa6\xc1\x7b\x01" - "\x2c\x8e\x64\x1e\x87\x6f\x29\xc2\x99\x60\x45\x3f\xbb\x9a\x1a\xc9" - "\x3e\x5b\xdb\x0f\xba\xa5\xfb\x59\xa9\xc3\x87\x7d\x07\xdf\x59\x0c" - "\xf7\xb3\x15\xfd\x5f\xe1\xe5\x61\xfe\xf2\xec\xa4\x15\xfd\x57\xd9" - "\xc2\xfd\xef\xe3\xfb\x67\x0c\xeb\x92\x39\x7c\xc9\xd0\xee\x76\x23" - "\x5c\x29\x63\x15\xd9\xc6\x67\xae\xa9\xa1\x8f\xce\x4d\xa8\xc8\x4e" - "\xc2\xb2\xa4\xf5\x61\x39\xb0\x1d\x7e\xa4\xef\x79\xbc\x57\x66\x2f" - "\xe6\xef\xe5\xd9\x99\x4c\x97\x9d\x36\x1b\x3b\x62\x54\x06\x87\xaf" - "\x0b\xd6\x62\x57\x62\xc5\x0e\x17\x23\xfa\x47\xef\xa1\x7e\x58\x32" - "\xed\xb9\x1c\xbd\x62\x47\x29\xc3\x38\x2d\x8b\xc9\x4e\x73\xf8\x7a" - "\x00\xf3\xc8\x44\x7c\xab\x39\xbe\xf2\x6c\x2b\xc2\xba\x08\x2e\x18" - "\x0f\xe1\x20\xd8\x15\xfd\x10\x8d\xf0\xd6\xbe\x98\x6c\x33\x5e\x07" - "\xf0\x6a\xc2\xb4\x9f\x30\x5b\xdc\xaf\x68\xdf\x4c\x4c\x8f\x6d\x73" - "\x76\xb7\x97\xce\x78\x20\x5e\xf6\xc3\x70\x84\xef\x40\xb9\x4a\x45" - "\xf9\x44\x7a\x73\xb4\x9c\xde\xca\x9c\xe1\x5e\x5e\x8e\x9c\x61\xa2" - "\x1c\x39\x91\x14\xde\x8b\xb2\x83\xcf\xc6\x5e\x11\x77\x27\xa6\xcb" - "\xe0\xe9\xca\x73\x8c\x4c\x97\x93\xe4\x45\x3d\x44\xbe\x96\x11\x1f" - "\x91\xaf\x65\xc4\x4b\x56\x91\x63\x74\x58\x0f\x02\x8b\xc9\x49\xea" - "\x8b\xc9\x49\xc3\xf4\x4f\xf5\x71\x5f\x25\xc7\xec\x15\xb8\x37\x20" - "\x9e\x2c\x94\xef\x08\xc4\x61\x46\x5c\xd6\x3e\x9b\x01\x56\xec\x60" - "\xde\x15\xbe\x3d\xbe\xb5\x3b\x20\x62\x26\x94\x21\xbd\xef\x21\x8f" - "\x4c\x58\xce\x16\xbc\xa7\x62\x3c\xdc\x8e\x79\xbd\x8f\x78\xcd\x94" - "\x1f\xe6\x63\x45\x9c\x5b\x11\x97\x89\x68\xfa\x8a\xce\x52\x8b\xcd" - "\x39\xf0\x95\xa0\xef\xa4\xbf\x3c\xa7\xd5\xaf\xcb\x69\x92\x65\x88" - "\xe4\x47\xf0\xad\x0a\x96\xbb\x99\xcf\xe1\x3b\x8e\xad\x0e\xf6\x91" - "\xdc\x17\x28\x1e\xfb\x4a\xa7\xb0\x9e\x49\xa6\x8a\xf1\xde\x00\x24" - "\x3f\xed\x96\xfd\x04\xfb\x3e\xc9\xd0\x72\x8b\x7b\xcf\x2c\xb0\xa8" - "\xf0\xbd\x74\xad\x4f\x0b\xcf\x58\x34\x65\xfd\xe5\x39\xd5\xed\x16" - "\xaa\x97\xf3\x98\x86\xd2\x15\x40\xb4\x0a\xfb\x0b\x2a\xe6\x8b\xb6" - "\xba\x34\xa3\xcc\xa5\xac\xdd\xbd\x14\x61\x2d\x40\xe5\x21\x39\x22" - "\xf8\x65\x3d\xcc\xd9\xaf\x5b\x97\x46\x65\x63\xa3\xcb\xa0\xad\xe7" - "\x7e\xa0\x3e\x5b\x5b\x4f\x03\xc9\xa9\x9f\xe9\xd6\xe9\x51\x46\xfb" - "\x96\xf5\x94\x45\x3e\x73\x0d\x54\x18\xd6\xdf\x66\x3e\x85\xf1\x2d" - "\x08\x77\x96\xcb\xed\xf2\x6b\xbe\x68\x9f\x2e\xe7\x80\xaf\x7c\x9d" - "\x71\xf9\xb5\x3e\xd6\x66\xae\x82\xa7\x7b\xca\x90\x57\xa7\x60\xd9" - "\x65\x5f\x44\xbb\xc5\x84\x30\x1e\x0c\x6f\xe0\xf2\xbf\xec\x72\x2f" - "\x5b\xfe\x1c\xbb\xba\xfc\xda\x67\x6c\x99\x99\xbd\xbf\xd6\x0a\xa3" - "\x6f\xdb\xc3\xfc\xa4\x17\x67\xbb\x4e\xc1\x6d\x17\x68\x4f\xfd\x54" - "\x58\x9a\xe3\x67\xcb\x2e\x5f\x65\xcf\x3c\x47\xbc\x49\x86\x36\x33" - "\xea\x8f\xb5\x8a\xf8\x7d\xb2\xcd\x7c\x06\xf3\x4f\x45\xbc\xa5\xcc" - "\x61\x3d\x8e\xb0\xf6\xe8\xa7\x2f\xeb\xe0\x6c\x57\x15\xf8\x62\x72" - "\x0e\xf4\x57\xe4\x54\xfb\x63\x72\x9a\xfc\x15\x39\xad\x2c\x66\x9d" - "\xde\x57\xb1\xce\xd8\x1f\xb3\x0e\x65\x60\x5d\x35\xd6\xd3\x08\xaa" - "\xf3\x1b\x36\x30\xe0\xfb\xd1\x1b\x54\xff\xe5\xeb\x4e\x62\x59\x5b" - "\xd1\x37\x66\x42\xf6\xd7\x9d\xa4\x71\x08\x4c\xdb\xda\x17\xb3\xae" - "\x09\xe1\x5a\x85\x7e\xad\xeb\x20\xb9\xa4\xf1\x7e\x0c\xfb\x0f\xec" - "\x23\x45\x60\x7c\x37\x5e\xde\xbe\x98\x5c\x2d\xab\xcc\xcd\x44\xfc" - "\x31\x5c\xa6\xca\x73\x33\xd9\x83\xe5\xe8\x6b\x5f\x43\x3c\xb9\xd6" - "\x15\xfd\x0b\x18\xf2\x10\xf5\x24\x37\xd3\x5f\x91\x6b\x66\xb1\xb9" - "\xd5\x5e\x2e\xfb\xb9\xaf\x11\xee\xbe\xe7\x8d\x34\x3e\xa1\xc1\xf8" - "\x93\xac\xd2\x34\xc1\x4b\xb2\xaa\x33\xe9\xfd\x3a\x93\x95\x95\x9b" - "\x8c\x3f\xda\xcf\x5c\xfd\xe5\xa6\x34\x7f\xb9\x29\xc9\x37\x0c\x7d" - "\x78\xeb\x19\x20\xfb\xe4\xfb\x25\x43\x1e\x7c\x88\xfc\x68\xe0\xf5" - "\xef\xb0\xa2\x0e\xec\x98\x50\xd6\xd6\x83\xb2\x60\xf9\x47\x6e\x9b" - "\xda\xdd\xe7\x39\x4f\x59\x8c\x49\x4f\x32\x45\xf5\xfb\x8c\x05\xca" - "\x58\x85\xc9\xe8\xaf\x30\x25\xf5\x57\x20\xde\x18\xcc\x27\x76\xfd" - "\xbf\x7a\xb9\xbe\xae\x47\x79\x3d\x03\x74\xee\xa5\x90\xf1\xf5\x4d" - "\x43\xd9\x48\xb2\x55\x64\x9f\x56\xf8\xbc\x24\x33\x7f\x21\xbb\x26" - "\xec\x14\xac\x95\xed\x14\xd9\x28\xea\x17\x91\x9d\xf2\x4b\x76\xca" - "\x2f\xd9\x29\xfe\xae\x43\x5b\x53\x9e\x9d\x46\xf6\x68\x85\x55\xd8" - "\x99\x15\xfd\x89\x0c\x65\x23\x0a\x71\xa4\x89\xba\x40\x98\xca\xec" - "\xd5\x1c\x9e\xf3\x29\xdb\xea\x47\x7b\x83\xd7\x01\xbf\xb0\x37\xad" - "\x92\xbd\x51\xcb\xf6\x86\xce\x64\x43\x9d\xf2\x87\xb3\x37\x7e\xc9" - "\xde\xf4\x33\x61\x6f\xfc\x92\xbd\xa1\xf0\x7e\xc9\xde\xf4\x87\xb1" - "\x37\xa8\xcf\x54\xde\x08\xc9\xce\x94\x91\x9d\xa1\xf2\xa2\xac\x25" - "\xf9\x85\x9d\xc9\xc4\x3e\x91\x9a\xec\x4c\x3f\xa6\xf1\xcb\x76\xc6" - "\xc3\xd3\x5b\xc9\xd6\xf4\xbd\x00\x68\x3f\x0d\x40\x36\x86\xdb\x13" - "\xdf\x54\x1f\xd9\x13\xe4\xdf\x02\xa5\x3d\x41\x7c\x07\xf0\x59\x27" - "\xd9\xa9\xa6\xe8\x3d\xcc\x87\xf6\xa4\x7a\x85\xd5\x8d\x75\xfd\x47" - "\x88\xf6\xa1\xdd\xb6\x16\x97\x39\xac\x3e\x40\x3b\xd0\xca\xda\xcb" - "\x00\x69\x44\xf9\xed\x47\x5b\x01\x80\x7a\xa9\xf7\xa1\x8e\xa3\x8c" - "\x1b\xdb\x2d\x9f\x42\x3f\xea\xea\xb2\x9e\x5e\xc7\x33\x6e\xa3\x6e" - "\xd9\x65\xe6\x42\xfe\x38\x9f\xb1\x94\xa1\x7d\x31\xba\xda\x7a\xde" - "\x83\xa5\x5d\xcc\xbf\x34\xdb\x69\x40\x1d\x30\x2e\xcb\xb7\x47\xd3" - "\x99\xa3\xcb\xaf\x31\x3b\xda\xc5\x7f\x5f\x76\x59\x17\x9d\xd5\x05" - "\x93\x97\xe6\x30\x7f\x3f\xea\x19\x96\xb7\x1a\xcb\x7d\x12\x69\x6f" - "\x42\x9d\x6b\x45\x3d\xd3\xfb\x14\x7a\x86\x3a\x73\x14\x9f\x0d\x82" - "\x7f\xeb\x5a\x51\xcf\x4e\xfa\x79\x7b\xd6\xc5\xfb\xa2\x98\x4f\x2b" - "\x8d\xdb\xa1\xae\x9d\xf4\x57\x08\x5d\xf3\x8b\x74\x1d\x7e\xe2\x9f" - "\x5a\xd2\x35\xac\x0b\x8c\xef\xc6\xcb\x8b\xfa\x13\x5e\xd7\x2c\x41" - "\xba\xf6\x9c\xa4\x6b\x31\x42\xd7\xb0\x4e\x23\xfa\x9f\x17\xfa\x46" - "\xf8\xa9\xbf\x3a\xa0\x6f\xb1\x26\x3d\x9d\x0d\x20\x64\x87\xeb\x1c" - "\xb6\x2b\xa6\x34\xd4\xb7\x24\xd4\x37\xc4\xc7\x5c\x64\x37\x51\x36" - "\xff\x44\x6d\xdd\x72\x0b\xfb\xd3\xda\xfe\x09\x65\xa8\x4f\x69\x68" - "\xcb\x3e\x43\x3b\xfa\xa7\x67\xdc\x50\x8f\xfa\xa4\x47\x3d\x32\xa2" - "\x3e\x25\xa1\x5e\x91\x3e\x35\xf5\x3f\x4f\x38\xd7\x37\x0d\xe0\xe0" - "\x6d\x65\xa8\x3e\xdd\x6c\xdc\xd4\x63\xfb\x81\xc6\x09\x5f\xf1\xf1" - "\x57\x7c\xd6\x39\xe1\x46\xaa\xf4\x1c\xef\x84\x3f\x68\xb8\x2f\x83" - "\x7a\x68\xd9\x0d\x63\x2e\xc1\x0f\xce\xa1\xcc\x03\x3e\x47\xe1\xf3" - "\xf9\x15\x77\xbd\x8f\xbe\xc4\x1f\xba\x31\x6f\x0f\xe9\x22\xb3\xcd" - "\x25\x5f\x2e\x05\x65\x51\xcb\x3c\x74\x46\x6d\x51\x21\x9d\x51\x4b" - "\x67\xd2\xe2\xfb\x68\xe4\x41\x02\xde\x63\x8f\x5f\x87\x38\xbc\xe8" - "\x5c\xca\x32\xf2\x9f\xf0\x39\x91\x6d\xd7\x8f\x3c\xbc\x0d\x66\x46" - "\xbb\xc5\x59\xb4\x74\x76\x2e\xfa\xd1\x71\xf4\xcc\x6c\x9f\x19\xeb" - "\xae\x4b\xe7\xd1\xc6\x60\x7e\x74\x1e\x6d\x91\x11\xea\x0a\xf9\x19" - "\x59\xfa\x3a\x1b\x6b\xec\xf7\x70\xbd\x34\xca\xb4\x10\x6d\x48\xe7" - "\x24\xa4\xb3\x6b\xf5\x8e\x14\xf8\xd0\x1a\x7e\xdf\x45\x8f\x2d\x69" - "\xa0\xfc\x43\xc4\x27\xc8\x3c\x19\x22\x3e\x55\xe6\xd3\x50\x73\x3b" - "\xa9\x9d\xee\xdf\xc6\x7a\x68\x0f\x6f\x1a\x37\x28\xf5\xb1\xff\xa4" - "\xb3\x68\x77\xf7\x83\x76\x85\xd5\xcb\x1c\x3d\xcc\xee\xb0\x5e\x86" - "\x3a\xda\x57\xbc\x84\xf9\xfd\x31\x45\x19\xac\xa2\x28\xbd\x77\x1b" - "\xf3\xd1\xb8\x0f\xe6\x71\xd2\x09\x6b\xea\x45\x5d\xe4\x9c\xe4\xfd" - "\x4d\x5d\x51\x3a\xe2\x8a\x21\x5c\x6d\x98\xbe\xbf\xa2\x08\xe5\x35" - "\xe9\x9c\x53\xa5\xe5\x7b\xee\xa2\x2e\x9f\xb4\xec\x84\x89\x97\xe0" - "\x01\x2d\xef\x27\x94\x17\x99\xc9\x26\x60\x98\x0e\xc3\xe2\x10\x7f" - "\x81\xc7\xf6\x00\xfa\xdc\xbd\x55\xc2\x97\x7d\x20\x4e\x86\x73\x42" - "\x52\xb7\x72\xde\x9a\xb4\x4a\xb2\x2c\x64\x1f\x38\x15\x84\xee\x6a" - "\x47\x3b\xc8\xa5\x84\x8f\x0e\xd8\xf4\x75\x46\x3a\x8f\xab\x74\x17" - "\xc4\x63\xfd\x10\x7d\x2f\x61\x9f\xe3\x22\xb3\x3d\x60\x78\x6b\xa7" - "\x17\xfb\x14\x0f\x54\x39\xe1\x93\x21\xf9\xe9\xbf\xce\xba\x90\x07" - "\xad\x47\xb6\x01\x10\x7f\x88\x9f\xa8\x37\x7e\xe4\xc3\xe7\x64\x93" - "\xea\xb6\x51\xbf\xfb\x81\x0e\x99\x5f\x43\xd7\x49\x91\x49\xf4\x4d" - "\xe7\x25\x31\x1b\x03\xfb\x64\xfa\x8e\x31\xef\x01\xc1\x83\x75\x4d" - "\xbd\x68\x47\x68\x4c\x99\xce\xce\x2a\xd2\x33\xaf\xc7\x36\x6f\xa6" - "\x13\x1e\x6e\x95\xc6\xab\xdc\x0e\xdf\x22\xb2\x2d\x61\xdb\x2d\xbe" - "\x67\xe9\x00\xfe\x1f\x66\xb6\xc7\xa3\x1d\xe2\xb6\xa9\x31\x75\xb7" - "\xa8\x7f\x2f\xe1\xa5\xb5\x1e\x5d\x18\x5f\xe4\x66\xdd\xac\xbc\x31" - "\x89\xfa\x11\xb4\xff\x27\x86\x3d\x89\x72\xcd\xec\x85\x44\xd3\x0f" - "\x9f\xb4\x4f\xbe\x01\x17\xad\x10\x51\x37\x30\x4e\xf4\xc3\x54\x1a" - "\x17\x12\xe3\x61\xf3\x5a\x9c\xb0\xc8\x24\xd3\x45\x3e\x06\xf2\x96" - "\xf8\x7c\x92\x7c\x0d\xfa\x4e\x51\x54\xc2\xbc\xe4\x73\x20\xac\x4b" - "\x2e\x03\x95\x4f\x94\xeb\x87\x9a\xe0\x72\xd1\xb7\xfb\xe8\x12\xc1" - "\x83\xa2\x1d\xa0\xe5\x67\xf9\xf4\xd3\x77\x8e\x45\xbc\x2c\x54\x66" - "\x5e\x16\x6e\x63\xb1\x8d\xf0\xdd\x8f\x32\xc4\xc3\x5b\x11\x17\xf6" - "\x7f\x16\x9e\x13\xf2\x34\xaf\x65\xa8\x35\x2c\x28\x9b\x56\xec\xab" - "\x4e\x2e\xf5\xb3\x4e\xc4\xf9\x47\x31\xc6\xf6\xc3\x3f\xfa\xc9\xcf" - "\xf6\x92\xec\xee\x30\x51\x9b\xec\x28\x21\x7b\xcb\x61\x6f\x47\xd8" - "\x2e\x84\x69\x93\x60\xdb\xf8\x59\x89\xe2\x3e\x9c\xee\xd8\x8e\x6d" - "\x45\x3a\xba\x5c\xbc\xbd\x6f\x04\xf9\x1d\xfb\xf8\xd8\x4f\xfc\x61" - "\x0d\xab\xd8\x61\x0a\x4f\x8b\xc9\x4a\xed\x59\xff\x75\xd6\x83\xf9" - "\x8c\x23\x39\x2a\xdd\x01\xe3\x51\x26\x3f\xdf\xbd\x0b\xc6\x90\x8c" - "\xb1\x98\x22\x8b\xe0\x7b\x72\x22\xb3\xa1\xef\x89\x16\xd5\xb2\x0d" - "\x26\xa2\x0e\x99\x2f\x41\xf2\xa2\xb5\x25\x06\xa4\x15\xe0\xc8\x15" - "\x20\x1f\xe5\x33\x84\x2f\x70\xf8\xfe\x4c\xe7\x8e\xa3\x2c\x26\x9b" - "\x64\x59\xc4\x67\xcb\xcd\x6c\x05\xf2\xd5\x2b\xc6\x28\x92\xff\x48" - "\xdf\x24\x3a\x21\xb9\x95\xca\x2b\xe6\x40\x27\xff\x82\x5d\x67\xf1" - "\x4c\xb4\x69\xdd\x4e\x48\x76\xe3\xdd\xcb\x2f\xb4\x25\xd2\x7b\x37" - "\xc2\x9d\x64\xd7\xfb\x09\x06\xfb\xb8\xc9\x76\x66\x53\x91\x9e\xd4" - "\x60\xde\x3d\x4e\x78\x46\xec\xc7\x0d\xc9\x4d\x84\x6b\x08\x1a\xba" - "\x19\xdf\xff\xf6\x4b\x2c\xef\xfc\xd5\x86\xdd\x34\xc6\x39\xff\x2e" - "\xae\x17\x88\xab\x4e\x2d\x6c\xb6\x1f\x69\xad\xb5\xf9\xcd\x68\x9f" - "\xcd\xfe\xca\x92\x24\xfe\x2c\xc5\x31\xa9\x1d\x0d\x8f\xbf\x31\x95" - "\x9f\xc7\x08\xf3\x1b\x05\x9e\xc6\x24\xfb\x84\x4b\xf4\xfe\x53\x7a" - "\x77\xeb\x76\x25\x39\xaa\x53\xc4\x19\x91\x08\x23\xfa\xf1\xf3\x7f" - "\xda\x8b\x79\x78\x6c\xf3\x1b\x9d\xb0\xb8\x5e\x7c\x9f\xd9\x15\x76" - "\xdf\x6e\xbe\x3e\x0a\x75\x80\x74\x4e\xe8\xf4\x82\xfd\x6d\xf5\x5c" - "\xff\x3a\x50\xe6\xbd\x92\xfd\xa5\xf1\x9c\xa8\x4e\x58\xb0\xaf\x4d" - "\xcf\xe5\x5b\xcd\xd4\x0f\xea\x42\xce\x78\xc3\xb8\xc1\xd7\x83\xa9" - "\x78\x65\xe0\x95\x2d\xbd\x17\xe0\x85\x65\x7e\xf0\x1c\xbe\x17\x73" - "\xde\xbd\x61\x52\x39\x31\xae\x17\x7d\x76\x7a\x77\xc2\x83\x4b\xd9" - "\x1b\x09\x6a\xf9\xb9\xee\x18\x8d\x13\x3c\x68\x75\xc2\x7c\x10\x75" - "\xb1\x80\xcf\xdd\x41\xda\x88\xef\xac\xb4\x9a\x79\x5b\x76\xbb\x91" - "\xee\x07\x4f\xb6\x54\xbb\xc1\x70\x07\x95\xff\xc1\x53\x54\x26\x9a" - "\xc3\x42\xf7\xa2\x6a\xe6\x6a\xae\xf1\x01\x7d\xcb\x43\x5c\xa8\xff" - "\x75\x09\x62\xcc\xa1\xd1\x42\xf8\x24\x99\x60\x72\xf9\x05\x9f\x77" - "\x25\x19\xb6\xa9\xe8\x3d\xa6\xf6\x28\x1f\x87\x39\xcf\x4a\x33\xa5" - "\xb9\x0b\x0b\x46\xa0\x9e\x2f\xa0\xb3\x1e\xaf\xc0\x82\x65\x0c\x79" - "\xdd\x6c\xe6\x67\x49\xb9\xb0\xfd\xe9\xa9\xe5\xf3\x8d\x16\xa0\xfd" - "\x9b\x9f\xcd\xbf\xcd\x60\x38\xb7\x35\x88\xf3\x30\xc6\x61\x7b\xd4" - "\xd3\x66\xf6\x42\x3f\x95\x19\xd3\xbe\x77\xdd\xab\xa1\xb3\x2e\x77" - "\x5b\x18\xa7\x83\x61\x5d\x09\x5b\xf6\xa0\x73\xd7\x65\xe6\x95\xcb" - "\xdc\x5c\x4f\xfa\xb1\x60\x9f\x13\xde\x39\x3f\xa4\x4e\x0c\x94\x23" - "\xe5\x44\x73\x82\xa8\x47\x3f\xf2\x2a\xb4\x1e\x53\xea\x45\x1d\x2e" - "\x38\x1f\x5a\x87\x29\x98\x43\x0a\x4a\x42\xca\x5c\xbc\x52\xa5\xf7" - "\xe0\x4b\x1b\xf4\x8c\xf5\x9a\x72\xd0\x63\x4b\x89\x43\xfd\x28\x11" - "\x75\x43\xe1\x28\xcf\x24\x37\x7f\xc5\xb6\xa7\x8f\xce\x26\xbd\x0c" - "\x14\x4e\x32\x4e\xe1\x7e\xf4\x6f\xf0\xdd\x88\xf1\x3a\xd2\x5f\x3a" - "\x97\x2b\x38\x7e\xe0\xfc\x05\x48\xd9\x41\xb8\xa2\xf7\x1c\x38\x40" - "\xb2\x8b\x30\x33\xa3\x7d\x07\xd0\xf7\x4e\xd9\x27\xf3\x15\xc3\x0a" - "\x28\x9e\xe4\x14\xc3\x6b\x9c\xf0\xf7\x7c\xef\x72\x37\xf6\x01\xc3" - "\xfb\x1e\x29\xf6\x01\x1f\x4d\x97\x9b\x49\x75\xd9\x03\x0f\x9d\x45" - "\x3b\x86\xf6\xbb\x24\x51\xb4\x3f\x0f\xb5\xd1\x3b\xda\xcf\xcf\xf1" - "\xb9\xb5\x0d\xed\xd4\x8d\x4a\x4b\x7a\x9f\x1a\x86\xdf\x50\x43\x8a" - "\xaf\xf2\x42\x94\x2f\xd6\x9c\xe5\xe8\x3e\x0d\xed\xbe\x7f\x06\xc3" - "\xb3\x1c\xc7\xaf\xe8\x7c\xb8\xd2\x1d\xac\xff\xdd\x1b\x27\x35\x0e" - "\xdf\x55\x3b\x3f\x07\x16\x1e\xe2\xfc\x78\xb9\x13\xbd\x80\x67\x38" - "\x6e\x89\x3f\x7f\xe8\x3e\xbc\x9e\xf9\x0e\x5f\xa4\x3d\xe3\xf5\x23" - "\x0f\xdd\x80\x99\xaf\xef\x84\xc4\x9a\x1b\x90\x50\x7b\x03\x8c\xec" - "\x2f\x46\x75\x0d\xfa\x71\xcf\x5c\xd3\x01\xda\x89\xcc\xd1\x16\xd0" - "\xd6\xee\x44\x7f\xce\x07\xaa\xfe\x0a\xf4\xe7\x7c\xe8\xcf\x5d\x35" - "\x92\xbd\x1c\xf0\xe7\xfa\xb8\xaf\x5c\x74\x81\x9f\x21\x5a\x51\x74" - "\x61\x94\x19\x54\x51\xd9\xa0\x43\xfa\x4a\xaf\xc0\x43\xaa\xa8\x2e" - "\xf4\x25\xb1\xcc\x4e\xa9\xbc\x78\x8f\x8b\x36\xc3\x70\x5e\x56\xb4" - "\xe1\xac\xa2\x24\x71\xc8\xb6\x59\x4d\x32\xe5\x26\x5d\xc2\x32\x3c" - "\x3c\x9e\xbe\x39\x9f\x9e\xe0\xd5\x14\xd5\x30\x2f\x85\x17\x4f\x65" - "\x5e\x0c\xe7\x7b\xfd\x37\x62\xb8\xc7\xf6\xb0\xd1\xa9\xc9\x1a\x72" - "\x3d\x24\xf6\x99\x24\x5b\xf3\xf0\x3b\x4c\x5d\x86\x32\x9a\x5b\xbd" - "\xcb\x87\xfe\xf8\x15\xd2\xe3\x87\x4f\xae\x28\x60\x3e\xc3\x66\xfa" - "\xfe\xff\x70\x35\xcd\x4d\xa0\x6f\x92\xff\x84\xbe\xce\xad\xe6\x23" - "\x50\x1b\x42\xfd\x87\xe8\x02\xc4\x59\x99\x5b\xcd\xb0\xcf\xfe\x75" - "\xfd\x7a\x9a\x7f\x26\xd6\x9a\x3e\xdc\xe5\x84\xcd\x7c\xde\x07\x5f" - "\x9f\xc3\xed\xe9\xc2\x16\x37\xf2\x20\xd4\x06\x2c\xac\xa6\xfd\xcb" - "\x7b\xcb\x2d\x17\xec\x93\xc9\xf6\x2f\xac\x10\xbe\x90\xa5\x43\xb4" - "\x05\x0b\x9f\x13\xdf\x0f\x16\xce\x75\xc2\x4a\xde\xc6\x5b\xa6\x91" - "\x4c\x2c\x2c\x60\xb1\x96\x3f\x10\xdc\xec\x32\x28\xdb\xe2\x83\x6c" - "\x56\x61\xe9\x60\x5c\x57\xae\x00\x7b\x6d\xa3\x87\xd6\xdc\xb8\xc7" - "\xad\xf1\xa0\x6f\xd0\x82\x71\x17\x28\x0f\x17\xc2\x20\xdf\x47\x88" - "\xb9\x0b\x0b\x0f\x38\xe1\x31\xc9\x1e\x2e\xcc\x12\x63\xcc\x0b\xb3" - "\x7a\x31\x2d\xfa\x8a\xb7\x63\x3c\xfa\xbf\x1b\xa3\xa4\x6f\xdc\xae" - "\xbd\x7c\xad\xe8\xc2\x33\x4e\x28\xe0\x7b\xef\x17\x4f\x05\x7d\xb1" - "\x81\x85\xd5\x11\xb1\xd7\x7d\x70\x39\x17\x3d\xc4\xe7\xe1\xa9\x61" - "\x9c\xc7\x96\x0a\x32\x5e\x6c\x6f\xff\xbe\x57\xbd\x7a\x35\x86\xc5" - "\xc9\x78\x11\x66\x0c\xbe\x27\x0c\xc0\x88\x34\x73\x83\xd2\xac\xee" - "\x55\xdf\xfd\xf7\x18\x96\xa6\x48\x93\xa9\x48\x63\x0e\x4a\x53\x26" - "\xe5\x53\xa2\x48\x73\x50\x91\xa6\x26\x0c\x6d\x8d\x8a\x34\x76\x45" - "\x9a\x73\x61\x68\xeb\x52\xa4\x71\x87\xa6\x59\xa4\x09\xe2\x2d\xcd" - "\x27\x4a\xc4\x30\x7d\x68\x9a\x45\x46\x45\x9a\x24\xf9\x1d\x7d\xcf" - "\x4c\xe1\x1b\xa0\x3c\x61\x9d\x62\xbd\x5e\xc0\x78\x2c\xff\xea\x82" - "\x9b\xf8\xdf\xd8\x37\xb4\x9c\x2f\x3d\x2e\xce\xd3\x25\xbb\x4a\xf3" - "\x0f\xc8\x9e\xd3\x37\x13\x92\x09\xf2\x3b\x29\xaf\x8b\xb0\x78\x3f" - "\xc9\x10\xe2\x3c\x35\x98\x1f\x8b\xec\x0a\x3a\xcf\x29\xe8\x74\x0e" - "\xe6\xc7\x22\x77\x68\x9a\xc5\x9a\xd0\x34\x8b\xe3\x82\xd2\xd4\x8b" - "\x7c\x16\x1b\x15\x69\x92\x14\x69\xd2\x06\xcb\xe7\xe2\x2c\x45\x9a" - "\x02\x45\x9a\x92\x00\x0f\x17\xf3\xb5\xe1\xa4\x0f\x18\x8e\xfd\x9f" - "\x55\x67\x6e\xc2\x3b\x9d\x2c\xcf\xf2\xda\x69\x21\xd7\x8f\xd0\xf9" - "\x78\xb4\xd6\x8c\x9f\x5d\xd0\x05\x8f\xcc\x92\xbf\x2d\xbf\x75\xc3" - "\x1b\x49\xdf\x3c\x91\xb7\xdd\xcd\x56\x2f\xb6\xb9\x8b\xb1\x0d\x5e" - "\x96\x28\xcf\x2d\xa1\xf9\x38\xfc\xec\x1b\xde\x1f\x59\xdc\x21\xf4" - "\xef\x11\xf9\x9b\x0e\x95\x07\xfb\x19\x8f\xcc\xfc\x3f\xa4\xab\x8d" - "\xe8\xa2\x33\x20\x10\x87\x65\xa0\xaf\x31\x40\x2b\xe5\xf9\xc8\xef" - "\x64\x5a\xeb\xc4\x9c\x20\x9a\x2b\xec\xa2\x73\x39\x30\x4d\x43\x50" - "\xff\x84\x68\x75\x9f\xde\xe9\xd5\x84\xd2\xfc\xc8\x3e\x89\xe6\x0e" - "\x61\xa3\x1e\xe9\x90\xed\xc9\x90\xf2\x57\xde\x68\x6c\xaf\x01\xa0" - "\x39\x0f\x6d\x35\xe8\x6f\x62\x1f\x8b\xe8\xee\x84\x34\x03\xf7\x7f" - "\x37\xdf\x00\x7a\x76\x94\xcc\xe3\x73\x22\x44\x59\xd2\x32\xe9\xfc" - "\x65\xf2\x7d\x5a\x2c\x5f\xd2\xbc\x3c\xc6\xcf\x62\x82\xb4\xfd\xcd" - "\x25\x2e\xa4\x35\x2d\x5d\x9e\x3f\xe4\x84\x34\xe1\xd7\x95\x37\x1a" - "\x68\xbe\x06\xcd\x6d\x6a\x76\x27\x11\x4c\x31\xd2\x29\xcf\x9d\xee" - "\xa1\xb3\x9c\x11\x76\xe6\x50\x7d\xa5\x60\xbe\x0a\x1a\x1e\xfd\xab" - "\x90\x9f\xb4\x33\xa1\xfa\x10\x89\x72\x9a\x76\x2e\x54\xe6\xd2\x9c" - "\xa1\x32\x97\xe6\x0a\xd5\x07\x35\xea\xc3\x12\x4d\x68\x9a\x25\x71" - "\xa1\x69\x96\x24\x04\xa5\x29\x17\xf9\x2c\x49\x52\xa4\x49\x53\xa4" - "\x09\xb6\x7f\x58\xe6\x25\xe6\x81\x7e\x27\xb7\xf7\x4b\xac\x41\xef" - "\xea\x2a\xde\x4e\x2d\x39\x28\x87\x49\xeb\x92\xf9\x5c\x29\x09\xdf" - "\x49\x85\x8d\x22\xf8\x33\x0a\x1a\xce\x2a\x68\xb8\x20\xbf\x4b\xf3" - "\x2b\x3e\x40\xde\x4d\x95\xe4\xcc\x1d\xbd\x07\x1e\x8b\xf6\xad\x7c" - "\x92\x7c\x33\x6a\x9f\xf8\x1c\xb6\x5d\xe8\x53\x5e\x03\x1d\xcd\x1d" - "\xbc\x58\x0c\x11\x74\x3e\x8c\x13\x7e\x94\x81\xfd\xb9\x0e\x9a\xe3" - "\x8e\xfe\xd4\x8a\x8b\xb0\xa4\x07\xf3\xaf\xc6\x3c\x90\x77\x8f\xa6" - "\x84\xd2\xf0\x68\x7a\x28\x0d\x8f\x66\x07\xbd\xeb\xf0\xdd\x12\x54" - "\x6e\x1d\xed\x13\xf1\x0a\xf7\xad\x1f\x3d\x20\x87\xd3\x18\x00\x96" - "\xb1\xbb\x94\xfb\x01\x29\x34\x6f\x30\xb6\x13\x1e\xdd\x4a\xe3\x05" - "\x12\xce\xd3\xc1\xbc\x15\xbc\x78\xb4\x55\x41\x47\x87\x82\x8e\xee" - "\x80\xad\x59\xd2\x23\x74\xe4\x51\x7c\x7e\xdc\x48\x61\xc8\x0b\x43" - "\xb4\xcf\x70\xbb\x7d\x1a\xf9\xa9\x3f\x5a\xe2\xc6\xf2\xb2\x17\xd4" - "\xb1\xd2\xfb\x32\x36\x8d\xfc\xee\xa2\x0e\xb4\xcf\xb4\x76\x76\x0a" - "\x86\x65\x88\x7a\xfd\x11\x96\x7f\x55\x8a\xc0\xfb\x23\xfe\x6d\x9f" - "\x60\xf1\xd9\xc0\x62\x1a\x87\xec\x9f\xf5\xc6\x36\x26\xca\x73\x6c" - "\x11\xc7\x3e\x59\x1f\xfc\x95\x8d\x89\xfe\x8a\x9d\xe7\x30\xac\x1a" - "\x75\xa2\x5c\xf4\x69\x76\xc6\xa3\xec\x57\x63\xfd\x61\x1f\x78\xa9" - "\xd4\x97\x69\xa4\x33\xe6\x68\xce\x1a\x9d\x41\x15\x25\xe6\x66\xfc" - "\xe8\x6c\x90\x5e\xb9\x0d\x3b\x17\xb0\x4e\x58\x5a\x41\xbe\x1d\xd9" - "\x0d\x9a\x83\xd8\xec\x73\x01\x8d\xb3\x38\x7c\x97\xb8\x4f\x8e\xf1" - "\xe5\x22\xed\x52\x6d\x50\x5a\x97\x34\x0e\xd2\x4d\x71\x73\x7c\xa0" - "\x69\x76\xbb\xe8\xac\xdd\x38\xe1\xc7\x2f\xad\x68\x46\x7b\x81\x69" - "\x92\xe5\x34\x34\x66\xc2\xbf\xfb\x17\x03\x9d\xcb\xac\xb1\xef\xec" - "\xe4\xb8\xa5\x6f\xce\xbc\x7f\xe4\x28\xe9\x06\x87\xbb\x83\x7c\x4a" - "\x8d\x98\xb7\xb5\xb4\x3c\xc2\x0b\xda\xde\x8a\x46\x83\x13\x9f\xfb" - "\x2b\x1a\x8d\x48\x1b\xf2\xf3\x47\x74\x36\x62\x88\x2f\xb3\x68\x51" - "\xfa\xca\x15\xcb\x66\x3d\xb1\x72\x49\xc6\xa2\x79\x86\x8c\xfc\x4d" - "\x79\xa6\x59\x5b\xb6\x16\x1b\xb6\x17\xe6\x17\xe7\x6f\xde\xc0\x8f" - "\x07\x33\xe4\x14\x8b\xbb\xb1\x20\xa7\xa8\x78\x3e\x3d\xce\x34\x58" - "\x0a\xf3\xb6\xf1\xc7\xbb\x46\x42\x28\x92\xfc\xe2\xbc\x42\xc3\x0c" - "\xd3\x4c\xc3\xe2\x9c\xfc\x02\x5a\xc5\x10\x0e\xd7\x3c\x43\x61\x5e" - "\x61\x5e\x8e\xc9\x30\xdf\x90\x48\x98\x83\xd1\x05\xd5\x67\xa2\x6c" - "\x9f\x8a\xb0\x3d\x47\x1f\xba\x9b\xec\x14\xb5\xeb\x17\x61\xc5\x56" - "\xf2\xe1\xf8\x79\x5e\x28\x87\xd8\x26\x38\x3d\xb6\x65\xc5\x83\xdb" - "\xf1\x65\x07\x42\xe5\x77\x59\x75\xa8\xfc\x2e\x3b\x39\xb8\x1d\x5f" - "\xa6\xd0\xff\x65\x0a\xfd\x5f\x76\x61\x70\x3b\xbe\xcc\x15\x9a\x66" - "\x39\x84\xa6\x59\xae\x1b\xb0\x33\x48\xeb\x5e\x6e\x97\x96\x27\x28" - "\xd2\xcc\x55\xa4\x49\x55\xbc\x67\x04\xbd\xa3\xef\xba\xdc\x14\xec" - "\x1b\xe0\x7b\xb1\xac\xeb\x01\xfb\xb6\xfc\x80\x0c\x43\x6d\x0f\xad" - "\x75\x91\x60\xeb\x83\x60\xbb\x25\xd8\x01\xfd\x27\x9b\x44\x73\x37" - "\x85\x7f\xbe\x62\x86\x64\xdb\xba\x8e\x04\xda\xd0\x2e\xac\x8b\x29" - "\x57\x60\x79\x45\x9d\x80\x75\xd1\x7c\x5e\xf6\xda\x1a\x4f\x5d\x2c" - "\x68\x29\x2d\x9d\x67\xc5\x6c\x4b\x6b\x68\xfe\x38\x86\x45\xe1\x85" - "\x76\x6a\x85\x5e\x9e\x3b\xbf\x0f\x61\x9c\xb0\x82\xcb\x32\xa5\xdb" - "\xc7\xe7\x1d\xf2\xfc\x2a\x68\x8d\x15\x9d\x11\x77\x44\xec\x21\xd1" - "\x45\xe7\xac\x51\xde\x88\x43\xc3\xd4\x4b\x3f\x97\xce\xcb\xd2\xe1" - "\x15\x87\x38\x0b\x64\x9c\x88\x4f\x0f\xe2\x5c\x3e\x9a\x47\x26\xf9" - "\x3d\x2b\x0e\xca\xfe\x05\xf5\x15\xc2\xd9\x8e\xf0\x73\xb3\x21\xfa" - "\x88\xcd\x8f\x7d\x94\x2e\xa2\xe9\x0c\xf9\xa1\x0e\xbd\x0f\xda\x6b" - "\x7c\xd8\x7f\x05\x1d\xef\x4f\x59\x2f\x83\xa3\xde\x07\x34\x3e\xbc" - "\xd6\x0a\x65\x75\x6a\x7f\x07\x1b\x48\x47\x7d\xb4\x15\x6e\xa2\x67" - "\x1f\x85\x63\x7a\xec\x4b\xb8\x68\x0e\xf7\x10\xe3\x11\xd1\x04\x67" - "\x9f\x46\xfd\xbd\xf4\x99\x92\xef\x7b\xa0\x0e\x71\x85\x9d\x5f\xac" - "\x06\x87\xc7\x96\x8e\xed\xdf\xf6\x73\xb2\xcd\x6e\xae\xe6\xb6\x4f" - "\x8d\xe1\x65\xc8\x8b\xc6\xa1\xfc\x14\xc9\xbe\x5b\x68\x5e\x19\xc2" - "\x9e\xba\x19\x2c\xd1\xdd\x8c\xe5\x46\x5d\x74\xbe\xb5\x3b\x31\x52" - "\xb2\xaf\x5a\x4c\xd7\x25\xa7\xfb\x3a\xe5\x23\xdf\x88\xda\x63\xd4" - "\x55\xb7\xe8\x2b\xae\x7c\xf2\x15\x3e\x67\xf9\x31\xf4\xff\xd2\x65" - "\x3d\xb8\x0d\xdf\xd1\xfe\xa5\xf3\xf1\x44\x3e\xaf\x07\xfb\x93\x45" - "\x16\xf4\xd9\xf4\x6e\xb4\x8d\x8f\x65\xca\x71\x7c\x9c\x88\xe2\x4a" - "\x98\xb7\x59\xdf\x45\x71\xc5\x03\x71\x62\x0d\x01\x6b\xb6\xfa\x28" - "\xfc\xa0\x1c\x2e\xda\x96\xc7\x6a\x14\xef\xa7\xe4\x77\x7c\x6e\xc2" - "\x67\x83\x84\xdf\x85\x36\x57\x25\xf6\x5c\x58\x39\xbe\x96\xeb\xcd" - "\x63\x1d\x72\x3c\x1f\x53\x3b\x41\xdf\xc6\xdc\xe0\x8f\xb5\x38\xb9" - "\xcf\x85\x69\xde\xfd\xd2\x1b\x89\x7d\x0c\x15\xa3\xb3\x55\x31\x8c" - "\xf0\x90\xce\xf0\x33\xee\xf1\xbd\x13\x1e\x3b\x4b\xeb\x1c\x48\x46" - "\xb6\xfb\x20\xde\xf2\x20\x8d\x3f\xaf\xe4\x72\x4b\x61\x84\x97\xf0" - "\x51\x9b\x48\xb8\x09\xdf\x61\xf2\x69\xf9\x7c\xc9\x95\x54\xfe\x83" - "\x43\xd5\x15\xc6\x5b\x83\x78\x19\x89\xef\x07\x42\xcb\xba\xb2\x5a" - "\xf1\x7e\x52\x7e\xa7\xb1\x5e\x21\x7b\x2b\x6b\xa4\xb8\x96\x9b\xe5" - "\x35\x8d\xaf\x91\x59\xd9\xad\xc8\xcf\x1b\x8a\x7f\x95\x56\xf1\xae" - "\x97\xdf\xab\xf8\x37\x86\x55\x46\x39\x8f\x23\x62\x0e\x97\xb3\x61" - "\xb7\x2b\xf2\x66\x7b\x99\x60\x9a\xac\xa0\x3c\x87\xe1\x7b\x41\xa0" - "\xfe\x56\x59\x65\x7c\xf8\xbc\x2f\x08\x0e\xfd\x92\x55\x55\x32\x9c" - "\xf8\xbe\xb1\xaa\x21\x28\x5d\xe3\x2d\xca\xaa\x90\xdd\x8c\x7e\x21" - "\xbb\xab\xba\x15\xb4\x78\x03\x38\x33\x34\x01\x5a\x32\x74\x41\x70" - "\xa8\x9f\x19\x06\xa5\xac\x16\x59\x49\xc6\x49\x5e\x33\x92\xc3\xc4" - "\x79\xa5\xb8\xcc\xf0\x32\x9e\x61\x09\x0a\x97\xfa\x47\x19\x9f\x4a" - "\x7e\x02\xd9\x67\x77\x6f\x69\x86\x7c\xce\x2a\x97\x49\xda\x47\x6c" - "\x8e\x38\xd3\x1b\xe5\x3a\xa3\x51\x89\x57\xac\xbf\x91\x70\x04\x70" - "\x96\x09\x1f\x2f\xc3\x19\x54\xb6\x1e\x27\xac\x94\xbf\x13\xb9\xc4" - "\xd8\xe0\xaa\x0b\x43\xf5\x3b\x3c\xb6\xd5\xf1\xa1\x3c\x5b\x3d\x33" - "\xc0\xb3\xd5\x49\x01\xbc\xab\x53\x83\xe0\x7e\x8d\xef\x19\x41\x70" - "\xd9\xb7\x92\x4d\x21\x2b\xab\x0f\x28\xf2\xaa\x0e\xc2\xd1\x10\x94" - "\x57\x63\x10\x5c\x07\xbe\xdb\x87\xae\x9f\xd5\x17\x86\xae\x9f\xd5" - "\xde\xf0\xf5\xf3\xb8\x2e\x90\xef\xe3\xf1\xb7\xd6\xab\xc7\x53\x82" - "\xe8\xa9\xc3\xf7\xf4\x50\x3d\x7a\x3c\x5b\xf1\x3e\x50\xff\x0c\x6d" - "\x47\xc3\xce\x94\x48\x0a\x2f\x9e\x0a\x3a\xa1\x67\x8f\x97\x07\xc7" - "\xbf\x7b\x43\xc4\x13\x8d\xfc\x1b\x1c\x7d\xdf\x14\x70\x4d\x4a\x38" - "\x82\x09\x8a\xef\x90\x69\xc7\xf6\x3a\xec\x99\xa0\x72\xfb\xe7\xf0" - "\x53\xfb\xf7\xb8\x5b\x7c\xb7\x29\x8c\x63\xb6\xf7\x33\x87\x6a\xcb" - "\x3c\xb6\x27\x12\xb1\xcf\xd0\x2d\xf8\xf3\x04\xca\xff\x66\xee\x9b" - "\xb0\xf2\xc2\x38\x94\xa7\x1b\x17\xe1\x89\x4f\xf1\xde\x87\xf7\x5f" - "\x84\xb6\xaf\x4f\x64\x30\x9b\x6a\x55\x9d\x4d\xd9\xee\x3e\x51\x80" - "\x7d\x8f\x1b\xd1\xbe\xb2\xcc\x30\x71\x07\x98\x2d\x62\x65\x98\xf0" - "\x7a\xac\xaf\x1b\x4e\x78\xe2\x3c\xd1\x1b\x14\xde\xc4\x6c\xa3\x33" - "\x08\xde\x49\xf9\x61\x9a\xa1\xea\x4d\x5e\x07\x25\x64\x2f\x53\xa3" - "\x28\xc7\x57\x17\x21\x73\x8f\x28\x47\xe6\x1f\x43\xf3\xce\x8c\x0f" - "\x5f\x8e\xcc\xb9\x58\x8e\xaf\xc2\x97\x23\x33\x9d\xf3\x56\x8d\x65" - "\x19\xe4\x77\x64\x16\x60\x59\xbe\xe2\x7c\x0f\x0d\xdf\x27\xf7\x53" - "\x4b\xbf\xc2\xfe\xbf\x1a\x78\xda\x55\x25\x81\x7a\x93\xe0\x4e\x45" - "\x57\x43\x7a\x98\x3c\x5b\x98\x6d\xf8\x2a\x27\x64\xfa\xe4\xf6\x4a" - "\x0a\xbf\x20\x68\x41\x3e\xa9\x89\x4f\x58\x1e\x4c\x37\x54\x7d\xcb" - "\xfa\x29\xbe\x33\x3d\x89\xfa\xff\x84\x53\x6e\xd3\xb1\x3d\x77\xc9" - "\x7c\xc4\xb8\x34\x45\x9c\x37\x28\xce\x14\x12\xb7\x6b\x20\xbc\x44" - "\x0e\xff\x7a\xf5\xf4\xe4\x29\x45\x3d\x61\xfd\x3c\x35\x3f\xb4\xdc" - "\x4f\x9e\x11\xe5\xc3\x3a\x1a\xc4\xeb\x27\x3b\xb0\x8e\xfa\xc2\xd7" - "\xd1\x93\xee\xf0\xb2\xf6\x54\x14\xc7\x17\x0b\x61\xf0\x3d\x65\xc4" - "\xba\xeb\xe3\x32\x28\xd5\xd3\xe0\xfa\x79\x6a\xa9\x5c\x3f\x5f\xaf" - "\x8c\x4f\x95\x2b\xca\xd8\x7f\x11\xd6\x8c\x12\x65\x5d\xf3\xb4\x02" - "\xf7\xc9\xf0\xb2\xf8\x94\x1d\xcb\xd9\x1f\xbe\x9c\x4f\x5d\x18\x5a" - "\x16\x9f\xa2\x6f\x75\xfd\x83\x65\x71\x8d\x4e\xa4\x81\x30\x69\xd6" - "\xcc\x64\xb6\x70\xf9\xac\x49\x25\xbf\xc8\x09\x6b\x4a\xe8\x3b\x5d" - "\x50\x78\x56\xa8\xfc\x61\x19\x28\x1d\xf1\xcf\x27\xfa\x31\x54\x0f" - "\x17\x0d\xa0\xbe\x95\x4c\x7a\x6c\x6b\xce\x28\x78\x75\xf5\x22\x64" - "\xcd\xef\x55\xab\x17\x0b\x7e\x3d\xad\x52\xd0\xd4\x11\x9e\x5f\x6b" - "\x5c\xc8\xaf\xab\xe1\xf9\x95\x15\x35\x34\xbf\xb2\xa8\xfe\xaf\x0e" - "\xe6\x57\x56\x4a\x30\xbf\xfc\x36\x51\xbe\xe9\x7a\x94\x8d\xbe\xb5" - "\xac\x4e\xd8\x72\x5d\x34\xca\x8a\x48\xd3\x43\x69\x8a\xa3\xbd\x42" - "\x4e\x0c\x13\x40\x7b\x05\xb2\xb2\x64\xfd\x1f\x5d\x0d\xc3\x59\xdf" - "\x1a\x9a\xa3\x4d\x67\x3d\xeb\x1c\xd6\xab\x76\x87\x2f\x11\x68\xbc" - "\x51\x91\x6f\x53\x78\x5b\x90\x75\x0e\x79\x5a\x19\x26\xbc\x5b\x8c" - "\x99\x3e\x6d\x08\xb5\x11\x4f\x43\x68\x1d\xad\xe1\xe9\x60\x60\xff" - "\xd3\x9b\x5f\x37\xaf\xb3\xa7\x2d\x83\xeb\xec\x99\x18\xa9\xbe\xfe" - "\x1a\x4a\xdf\xd3\x07\xc2\xd7\xd7\xd3\xf5\x43\xd7\xd7\xd3\x67\x86" - "\xae\xaf\xa7\xa9\xef\x73\xd5\x09\xcf\xe8\x42\xdb\x8d\xa7\x5d\xa1" - "\xe5\xc5\x7c\x31\x1d\x53\x0f\xbb\x9d\xde\xbf\x6e\xb9\xe5\x8b\x6c" - "\x1c\xd5\x15\xad\xff\x47\xfa\xa7\x12\x8d\xdf\x14\xc7\x90\xb8\x91" - "\x87\xe5\x3b\x87\x3c\x3f\x3c\xaa\x1d\xfb\x95\x34\x3f\xcf\x30\x99" - "\xc6\xca\x9e\xf9\xb3\x5f\xad\x9a\x87\xcf\xea\x8b\x90\xfd\x53\xbf" - "\x3a\xa2\x8c\xe6\x92\xf1\xb5\x83\xfc\xfb\xc4\x33\xbe\xe0\xba\xa0" - "\x39\x65\x87\xc5\x5e\x8e\x34\xce\xf9\xd9\x45\x58\xbb\x5f\xd4\x4b" - "\x76\x45\x28\x1f\xd7\x1a\xc2\xd7\xcb\xda\x24\xac\x97\xcf\xc2\xd7" - "\xcb\xda\x8c\xa1\xeb\x65\xad\x05\xeb\xe5\xb3\xc1\x7a\xb4\xf6\x80" - "\xa4\x47\x7b\x29\x8d\x61\x33\xf9\xab\x6b\xbf\x22\x18\x7c\x46\x1d" - "\x59\xfb\x39\xc5\xcf\xea\x91\xf5\x88\xa7\xa1\xfe\x3f\xcf\x5f\x82" - "\x69\x92\x70\x04\xe3\x75\x46\xf7\x84\xd3\x93\xb5\xf4\x3d\x55\x35" - "\xdb\x02\x5a\xe4\x61\xe6\x71\xc2\x51\x08\x70\x05\xb2\x97\x11\x1c" - "\x85\xd3\xd9\xcb\x01\xf8\x6c\xa3\x0c\xc7\xc7\x45\x05\xac\x81\x79" - "\xcc\x40\x70\xa1\xb8\xb3\xa5\xf2\x0f\xe7\xed\x08\xc1\x13\x9c\x02" - "\xc6\x2a\xf4\x31\xfb\x4c\xa8\x3e\x66\x97\x87\xca\xe7\x5a\xfa\x3e" - "\x11\xed\x47\x3b\x87\xb2\xdc\xd5\x6f\x53\xcd\xfb\x76\x74\x33\x27" - "\x4a\xa1\x9b\x28\x03\x39\xff\x28\x64\x20\xe7\x50\x28\xad\x39\x09" - "\xe1\x65\x20\x27\x79\x68\x19\xc8\xc9\x1c\x5a\x06\x72\x8a\x49\x06" - "\x9c\x90\x73\x2a\x54\x37\x73\x0e\x86\x96\x1d\xf3\xe5\xba\x09\x31" - "\xdf\x44\x37\xd1\x17\xba\x7d\x28\x3d\x94\xfc\x7f\x55\xdd\x0d\x80" - "\x6f\xc0\x33\x2d\xea\x15\xd2\xb7\x2e\x85\xbe\x21\xa1\x8d\x37\x13" - "\x0f\x6b\x79\x1f\x6d\x5d\x46\x30\x1f\x0f\x8b\xbe\x56\x29\xc2\xfe" - "\x8e\xe6\xec\x09\x7e\xe6\x9e\x08\x2d\xff\xba\xe2\xf0\xfc\x5c\x77" - "\x10\xf9\x59\x1a\x9e\x9f\xeb\x4e\x0e\xcd\xcf\x75\x2d\xb4\x56\x7d" - "\xb0\x4e\xad\xbb\x60\xd8\xc6\x7d\x14\x9e\xe6\x0a\xe4\xde\xff\xf5" - "\xda\xa7\xdc\xb8\xd0\xf6\x69\x9d\xef\x9b\xb7\x4f\xb9\x99\xe1\xdb" - "\xa7\x5c\x4b\xf8\xf6\x29\xf7\x80\xd0\x87\x5c\x7b\xa8\x3e\xe4\xd6" - "\x87\xca\x04\xf2\xee\x5b\x6b\x9f\x4c\x3a\x85\x0e\x1c\xb9\x08\xa6" - "\x0a\xf4\x29\x24\x5b\x98\xb7\x3a\x94\x46\xd3\xcc\xf0\xf5\x66\x4a" - "\xc5\x7a\x3b\x12\xbe\xde\x4c\xd9\x43\xd7\x9b\xa9\x04\xeb\xed\xc8" - "\xe0\x7a\x33\x55\x7d\x73\x9f\xc2\xd4\x1a\x5a\x67\xa6\xc6\x6f\x5e" - "\x67\x79\x51\xe1\xeb\x2c\x2f\x21\x7c\x9d\xe5\x25\x8b\x3a\xcb\x2b" - "\x0e\xad\xb3\xbc\x8c\xd0\x3a\x43\xbe\x7d\x6b\x75\x96\xd7\xa2\xa8" - "\xb3\x2d\x17\x61\xfd\x22\xac\xb3\x73\xa2\xce\x36\x8c\x50\xd0\xe8" - "\x0c\x5f\x67\x79\x5e\xac\xb3\x2d\xe1\xeb\x6c\x7d\xdc\xd0\x75\xb6" - "\x9e\xf6\xd0\xd8\x32\xb8\xce\xd6\xa7\x7d\xf3\x3a\x5b\x5f\x12\x5a" - "\x67\xeb\x4d\xdf\xbc\xce\xd6\xdb\xc3\xd7\xd9\xfa\x8e\xf0\x75\xb6" - "\xde\x25\xea\x6c\x83\x31\xb4\xce\x36\x68\x43\xeb\x0c\xf9\xf6\x37" - "\xd6\x19\xd6\x8f\x5e\xcc\xd7\xdd\xf0\x52\x2f\x1f\xd3\xde\x50\xe6" - "\x04\xb3\xb4\x9e\xdd\xcc\x65\x47\xaa\xc3\x77\x11\xa6\x78\x70\xdb" - "\xbd\xa1\x46\x0a\x7b\x62\x70\x3d\x6c\x68\xc2\x76\xb5\xa7\xa5\x84" - "\xcf\xeb\x12\x75\x48\x3c\x47\x38\x31\x46\xb6\x81\xdb\x7f\xac\x63" - "\x46\xfb\x0a\x53\x5b\x8c\xf0\x6e\xc2\x43\xfb\xaa\x84\xe2\x32\x6b" - "\xbe\x89\x5f\x36\xf4\x1c\xf3\x42\x3d\xed\xfd\x7f\x11\xf2\xc7\x0b" - "\x59\x35\x2b\xfd\xdf\x3a\xcc\xeb\xb2\x90\xd3\x67\x15\x63\x26\xe6" - "\x21\xfc\x5f\x33\xf9\xbf\x75\xe1\xe5\xd4\x7c\x13\xff\xd7\x4c\xfc" - "\xa8\x0b\xea\xaf\xc6\xa2\x07\xa8\xe8\xaf\x9a\x7d\xd1\x6e\x21\x3b" - "\xdc\x8f\xad\x28\xd4\x7b\x6c\xf9\x09\x0a\x9a\xb1\x6e\xf2\x4f\x48" - "\x34\x1f\x0b\x4d\x9f\x9f\x1c\x9e\xe6\xfc\x0c\xa4\xf9\xdd\xf0\x34" - "\xe7\x5b\x86\xa6\x39\xff\x20\xd2\xfc\xee\x60\xdd\xca\x6f\x90\xe4" - "\x20\x4c\xbf\x3c\xdf\x1e\xbe\xfe\xf3\x15\xf5\x0f\x99\xc5\x25\xcc" - "\xc5\xd3\x87\xc0\x3d\x0b\xc1\x70\x34\x57\x9f\x60\x49\x46\xc2\xc0" - "\xce\x54\xe2\x1c\x02\x2e\x63\x90\xec\xd1\xda\x82\xb0\xb2\xf7\x6c" - "\x99\xd0\xc7\x67\x3b\x42\xf5\xf1\xd9\xea\x50\x7d\x44\x5e\x87\xa6" - "\x6b\x0a\x8d\x37\x1f\xf8\xf6\x6c\xec\x46\xa3\x42\x06\xde\xbf\x08" - "\x1b\xdf\x16\x32\xb0\xb1\x3f\x94\x8e\x8d\x29\xe1\x65\x60\x63\x26" - "\x96\xff\xfd\xf0\x32\xb0\xb1\x78\x68\x19\xd8\x58\x8e\xbc\x7c\x3f" - "\x58\x6e\x57\x95\xa4\x0c\x57\xc0\x9c\x0e\x6f\xf3\x36\x9e\x0d\x3f" - "\xae\xb3\xb1\x4b\xf0\xb8\x20\x3e\x94\xc7\x1b\x7d\xa1\x3c\xc4\xb2" - "\xfc\xed\x3c\x1c\x38\x2b\xc3\x63\x2b\x50\xea\xbf\xe3\x22\x14\x48" - "\xfa\xbf\xe9\xcf\xa1\x34\x16\x48\xfd\x9f\x70\x63\x59\x05\x0d\xc8" - "\x4b\x47\x78\x5e\x16\xd8\xc3\x97\xb9\x80\xda\x20\x87\x7f\x90\x2e" - "\x15\xb8\x30\x7c\x15\x7d\x3b\xa0\x31\xac\x5a\x0c\x5f\xe5\x03\x2d" - "\x6f\xaf\x06\xda\xa5\x4d\x71\x34\x46\xce\xc7\x98\x51\x7e\xa3\xe3" - "\x81\xd6\x1e\xe9\x88\xae\xb5\x25\xca\x6f\xa2\x9b\x52\x88\x6e\x9a" - "\xc7\x42\xeb\x6a\xa2\xad\x90\xee\x70\xfb\x40\x96\x77\x82\x57\xe0" - "\xb6\x90\x5e\x10\xbc\x0c\x2b\xc6\x3a\xcb\x14\xb6\x69\x53\x75\xf8" - "\x3a\xde\xd4\x38\xb4\xec\x6c\x3a\x2b\xea\x79\x33\x84\xd6\xf3\xa6" - "\x2e\xbf\x6d\x74\x06\x95\x15\x65\xe0\x1b\xe9\x09\x7d\x3b\x1d\xd2" - "\xde\xef\x5d\xd3\x61\xd9\x0d\x93\x2f\xc1\x66\x33\xcf\x4f\xcd\xd0" - "\xa7\x50\x41\x0b\xb7\x01\x9b\xdf\xe3\x74\x22\xcc\x5a\x1f\xa8\xd9" - "\xde\x8d\x1d\x14\x57\x67\x63\x5e\x3a\x37\x46\x3e\x03\x06\x65\xe1" - "\xf6\x4e\xd8\xbc\x27\x24\x3d\xb6\x46\x0e\x81\xe3\x8c\x18\xdf\xdf" - "\xdc\x24\x8f\xc3\x0f\x35\xbe\x8f\x30\x17\xe4\x79\xbf\xe2\x5b\xd8" - "\xe6\x73\x43\xb6\xcb\x48\x13\xad\x1d\x27\x9a\x6e\x6e\x07\xb6\x24" - "\xca\xf2\x2b\xbe\xcd\x6d\x49\x09\xac\x6d\xd9\xb2\x14\xe3\xdc\x37" - "\x19\xcf\x0d\xd2\x83\x2d\xd6\x60\x3c\xe2\xbc\x98\x2d\x07\xe5\xf5" - "\x29\xf8\x5c\x7d\x0b\x5c\x32\x3d\x76\x05\x3d\xe7\xb0\xbf\xe0\x96" - "\x70\x5c\xb8\x05\x8e\x38\x47\xc3\x3c\x98\xed\x87\x88\x4b\x50\x78" - "\x17\x9d\x3f\xe3\xa8\xe9\x86\x28\x1f\x68\x44\xdf\xce\x72\x2f\xad" - "\x0d\xa1\xbe\xa1\xc3\xb7\xc0\x4e\xdf\xe0\xf8\x1c\x02\xfd\x02\x7b" - "\x9b\xb5\x5f\xda\x83\xcd\xf2\x10\xf1\xb4\xcd\x7c\xd5\x5e\x73\x94" - "\x75\x1f\xe7\x7b\x6f\x59\x42\xfa\x7f\x07\x69\xfe\x0f\xcd\xc3\xd8" - "\x0d\x0b\x10\xfe\x77\x42\xd7\x0b\x15\x3e\xa9\x65\x88\xfe\x9f\x85" - "\xfa\x7f\x0b\xc2\xeb\xb9\xe5\x26\xfd\x3f\x0b\xf5\xff\x16\x04\xb7" - "\x9b\xe2\x3b\x8f\xe5\x42\xb0\x4f\x4a\xfb\x63\x19\xd6\x93\x9f\xf9" - "\xdc\x63\xf7\x54\x81\xce\x47\xdf\xb4\x51\x37\x1d\xdd\x2d\xa4\xaf" - "\xba\x36\x57\x13\xed\xc3\xa0\x1d\x6d\x21\x59\xa4\xb6\x8c\xf4\xf5" - "\x39\x03\x6f\xcb\x7c\x42\x17\x4b\xad\xcc\x35\xb3\x0b\x65\x68\x8b" - "\x59\xc6\x15\xb5\xcb\x2c\xd6\x7d\x8c\xee\x82\xe1\x8e\x6e\xde\x2e" - "\xaa\xc8\x5f\xe5\x7e\xab\xef\x1a\x10\xde\xe6\x92\x36\x20\xbc\xfe" - "\x81\x76\x92\xe3\x2e\x21\x1d\x27\x9c\x84\xbb\x1d\xe1\x08\x2f\xc1" - "\xc9\xe5\x10\x6b\x63\x9e\x6b\x08\x2e\x3b\x1f\x7f\xc1\xbc\x31\xfc" - "\x73\x1a\x57\x71\x50\xba\xd2\x35\x6c\x76\x17\x7d\x33\xbb\x6a\x67" - "\xa5\x1b\xd9\xec\x42\x1a\x13\x2b\xa4\xf3\xa0\x55\xef\xfe\xc9\x19" - "\x59\x3c\x15\xb4\x22\xec\xb9\x9e\x16\x83\x17\x9c\x50\x98\x18\x6a" - "\x23\x0a\x15\xfe\xaf\x85\xf7\x33\xf1\xae\xa1\xf9\x89\xd2\xfc\x55" - "\xb2\x07\xcc\xe1\xf3\x70\xf9\xb8\xd9\x9c\x0a\xfa\x26\x4d\x73\xa2" - "\xc4\xfe\x6f\x85\x56\xc5\xd8\x9b\xeb\x30\x9f\x57\xf3\x7b\xcc\xb7" - "\x28\x52\xc8\x48\x71\x64\x68\x9d\x16\x56\x97\x5e\xa6\x6f\x41\xa2" - "\x3d\x78\xc6\xa7\xb4\x8f\x85\x4d\xb2\xef\xa6\x08\x3f\x27\xb7\x07" - "\x86\xcd\x84\xb7\x48\xd1\xce\x14\x72\xff\xbf\x7f\x50\xbb\x50\x44" - "\x76\x3d\x44\x26\xdb\xb9\x0c\x15\x19\xda\xdc\x28\x37\x85\x24\xff" - "\x45\xc7\x10\x66\x0f\xad\x39\xc4\xf7\xe1\x57\xa0\x28\xbd\xdf\x06" - "\xda\x36\x17\x5f\x53\xa5\x43\x19\xe1\x72\x4b\xed\xc6\x1c\x31\x1f" - "\xc9\xad\xc8\xa3\x40\xe6\x39\xc1\xb4\x17\xfe\x1e\xc4\x7c\x0a\x92" - "\x85\xa2\x14\x9a\x9b\x31\xba\x87\xef\xb5\xa5\x93\x65\xc8\xe1\xeb" - "\x80\x76\x9f\xb2\xcf\x53\x74\x3a\x7c\xd9\x8b\xa8\xfd\xaf\x74\x42" - "\x71\x42\x68\xdd\x16\xf1\xf6\x5f\xfe\xae\x83\x75\xef\x0a\x4d\x57" - "\xac\x09\xad\xfb\xc2\x6a\x8a\x1f\x72\x8e\x4f\x79\x61\x3c\xf6\x67" - "\xd6\xba\xf9\x7c\xaf\x62\xd4\xff\xc2\x8c\x9b\xd9\x41\xa6\x2b\x8c" - "\xf7\x23\xac\x34\x2f\x18\xed\x56\xf1\x81\x90\x31\xa3\xb1\x7c\xcc" - "\x68\xed\x45\xd8\x2a\x7d\xfb\xd9\xda\xa6\xa0\xaf\x61\x68\xdf\xa0" - "\x98\xbe\xff\xac\x0d\x6f\x33\x8a\x2f\x84\xf7\x0d\x8a\xdd\x92\x5d" - "\x58\xcb\x62\x94\x72\xb0\x95\xd6\xd3\xf1\x34\x72\x1f\x96\xc6\x42" - "\x87\xee\xc3\x6e\x4d\x19\xe8\xc3\x16\x92\x3d\xd8\x6a\x1c\xe8\xc3" - "\xba\xc2\xf5\x61\x9d\x61\xea\x73\xeb\xbe\xf0\xf5\xb9\xb5\x26\x7c" - "\x1f\x76\xeb\x69\xd1\xce\x6f\xed\x0e\xad\xe7\xad\x67\x03\xdf\x84" - "\x8b\x1b\xbe\x3d\x7f\x78\x5b\xd2\x60\x7f\x78\xdb\xcf\x44\x5d\x6d" - "\xbb\x16\x4a\xdb\xb6\xf4\xf0\xb6\x7d\x9b\x79\x68\x7f\x78\xdb\xbe" - "\xa1\x6d\xfb\xb6\xfa\xc1\xfe\xb0\x61\x98\x02\xa6\x65\xc0\x57\x0a" - "\xf1\xcd\xb6\x5d\x10\x7c\xda\x4e\xfe\x5c\x44\x10\xbc\x3b\x54\xde" - "\x91\x66\xc4\x87\xb6\xed\x12\xd9\x34\x59\x66\x86\xe2\x09\xed\xbd" - "\x34\xbd\x0a\x46\xa0\x0e\xbc\xef\xb1\x6d\x1f\x90\x7f\x9a\xc7\x47" - "\xf9\x90\x8d\x1c\x72\x3e\x9d\x5a\xa6\x8f\xe8\xd8\x5e\x72\xb3\xef" - "\xa5\x11\x7a\x48\x7f\x65\x10\x3f\xb6\x73\xff\x8f\x70\xdc\xbc\xce" - "\xb6\xf7\x28\x74\xcc\x2d\xe6\xe1\x5a\x7f\x21\xea\xcd\xaa\xe8\xcb" - "\x5a\xb5\x7c\x4d\xdf\x90\xf6\xd6\x6a\x0c\x2f\xa3\xd6\x94\x01\x7b" - "\x5b\xc8\xf1\xee\x50\xc4\x67\x8b\x3a\xb0\x36\xf9\x63\x82\xc7\xba" - "\xad\xd6\x50\x9b\x64\xcd\x56\xa4\x53\xf4\xff\xac\x9c\x9e\xaf\xd7" - "\xde\x58\xbb\x87\x6e\x6f\x76\x6c\x15\xe5\xdf\xa9\xf8\xbe\xbc\x43" - "\x7b\xf3\xf6\x66\xc7\x10\xe5\xdf\x91\x12\xda\xde\xec\x54\x7c\xa3" - "\xdf\x91\x1d\xbe\xbd\xd9\x61\x95\xed\x8c\xb0\x1b\x3b\xfe\xed\xeb" - "\xd9\x9b\x1d\x8d\xa1\xf6\x66\x47\xf5\xad\xec\x4d\xf3\x20\x7b\xb3" - "\xc3\x1d\x5d\x13\xae\x2c\x3b\xa3\xc2\xdb\x9b\x9d\x09\xa2\x0e\x77" - "\x96\x84\xda\x9b\x9d\xc9\xa1\x75\xb8\x43\x51\x87\x3b\x15\xdf\xbf" - "\x77\x68\xff\x4f\x6d\x52\x44\x44\x84\x3a\x42\xa5\x56\x45\x60\x14" - "\x16\x0f\x86\x47\x68\x22\x22\xf1\x1a\x26\xdd\x87\xab\x23\xd4\x1a" - "\xbc\x22\xa5\xfb\x30\xc5\xfb\x70\x4a\x8b\x97\x46\xba\x47\x2a\xde" - "\x87\xdd\x22\x7e\xb8\x94\xaf\x9c\xbf\x46\xf1\x1e\x79\x8b\xf8\x61" - "\x7f\x63\x7a\x18\xf4\x1e\xba\x0e\x72\xc9\xe6\x6d\x39\x05\xf9\x26" - "\x3e\xaf\x3d\xcf\x90\x93\x9b\x9b\x57\x54\x64\x28\xde\x62\x78\xf8" - "\xa1\x95\xf7\xcd\x33\x88\xe9\xf1\x05\xf3\x67\x98\x46\xc2\xb2\xed" - "\x85\x14\xb1\x6c\xd5\x92\x4c\x43\xfa\xc3\x0f\x85\x46\xca\x68\xf8" - "\x34\xf8\x9b\x61\x09\xd2\xbd\x94\x97\xc6\x02\x1c\x3c\xca\xed\x4e" - "\x17\xad\x3d\x17\xfd\x89\xb2\xdf\x9d\xa5\xf5\xcb\x37\x4a\x19\xad" - "\xab\xe8\x84\x92\x5d\x54\x88\x59\xf5\x65\x60\x59\x47\xfb\xa9\x94" - "\x1c\x63\xbf\x74\x81\xe1\x51\x50\x77\xc2\xfe\x2f\x5a\xd2\x10\x16" - "\xdf\x1d\x4e\x1f\x18\x4a\xc9\xb7\x2d\x7b\x09\xe3\x54\xec\x41\x3f" - "\x86\xb9\xa5\xf5\xf9\xa5\xc7\x78\xd8\x2f\xcb\x64\xb8\xe8\x8b\xb0" - "\x6b\x3e\xfb\x25\xe3\xef\xb4\x67\x8d\x80\xdb\x15\xc3\xd4\xcf\x9f" - "\x23\xbb\x50\x13\x0b\x1a\x9a\x97\x7d\x2c\x16\xb4\xc7\xc6\xd2\x9e" - "\xbb\xbb\x34\xf2\xbc\xec\x97\xf0\xdd\x09\xfb\xbb\x29\x6f\x82\xf5" - "\xab\x9f\xbf\x41\xf0\xb5\xa1\xf0\x73\x03\xf3\xb8\x77\x69\xd4\x08" - "\xb7\xe2\x73\x88\x8e\xee\x67\x7f\xf5\xc6\x9a\xd3\x67\xa7\xa1\x9f" - "\x86\x55\x71\xd6\x57\x06\x62\x6d\xd4\xae\x5d\x3b\xfa\x99\x8f\xf6" - "\x4c\x58\xd6\x53\xca\x8e\x6c\x02\x0d\xea\xb3\xca\x5e\x48\x6b\x29" - "\x76\x99\xea\xf2\x40\x83\xe5\x8f\xbf\x04\xbb\xab\x0c\xcb\xd1\x6f" - "\x5c\x06\x9a\x4f\xac\xb4\xde\xb5\xa8\xf0\xf0\x6f\x41\xf3\x0f\x37" - "\xca\xd4\x37\x98\x1e\x4a\x8a\x59\x37\xa3\x7d\xb8\xdd\xcc\x4b\xf3" - "\x6d\xcf\x66\xf7\x13\xcc\x3a\x4f\xa9\x1e\xda\xd1\x7d\xd9\x75\x81" - "\x79\x0f\xfc\x56\xec\x57\xd1\xd6\xe3\xa6\xf5\xb3\xda\x5d\xcb\x20" - "\xe2\x62\x26\xa8\xdb\xcc\xd5\xe0\xc8\x72\x43\xc9\x05\xd6\x7d\x36" - "\xfb\xcf\xd0\x6e\x6e\x84\xb5\x1d\xa0\x3e\xdb\xf5\x47\xe0\x7b\x49" - "\x57\x5e\xa0\x75\xb7\xfa\x5d\xf9\x14\x76\x0d\x76\xee\x82\x51\x3b" - "\x3f\xa5\x7e\x50\x07\xe6\x73\x19\x9e\x3a\x0f\x2a\xc4\xa7\x7e\xfe" - "\x8f\xa0\x7f\xfe\x49\x5a\x67\x9e\x02\x35\xbb\x41\xcf\x4a\x8d\x51" - "\x37\x4a\x8d\xba\x1b\xcc\x18\xeb\x29\x35\xc6\xb5\x5b\x10\xbe\xeb" - "\x3d\x18\xdd\x01\x71\xbf\xbc\xd4\xa1\xae\xfe\x12\xe2\xa9\x4c\x17" - "\xb1\x6c\x35\x5f\x22\x7c\xe5\x4f\xcb\xfc\x98\x36\x38\x8d\x2f\xe6" - "\xa7\xd5\x8e\x4c\x2f\xf8\x11\x57\xf5\x0d\x88\xaf\xb9\x01\x7a\x7f" - "\xc5\x4f\xcb\x28\x5d\x0f\x94\x56\x38\xce\x02\x4a\x0a\xeb\xef\xab" - "\xb4\xa4\xa3\x3d\x1c\xfe\xee\xba\x26\x8d\xe3\x6c\x0f\xb4\xb9\x6f" - "\x40\x3b\xfc\x1e\x1c\xd6\xbf\xd8\xff\x61\x5d\x53\x24\xfa\x93\x2a" - "\xfb\x4e\x9a\x03\x2f\x64\xa7\xb4\x8d\xf6\xcf\x2b\x83\x23\xbb\x21" - "\xca\xb2\x13\x86\x5f\xc2\x70\x6e\x7b\xca\x73\x33\x1d\xbe\xbf\xd8" - "\x77\xf2\xf5\xe0\xfb\xbb\x77\xb7\x41\x44\xbb\xbb\x9a\xca\xaf\xee" - "\x8f\xbd\x00\x0e\xf7\x39\x70\x58\x3e\xb3\xfb\x75\x7f\xe8\x3e\xe8" - "\x07\xed\x3f\x5e\x3f\xa7\x76\x68\xae\x83\x23\xd3\x0d\xef\x63\xde" - "\xac\xf2\x02\xed\x09\x99\xd2\xee\xf6\xd2\xfe\x3b\x89\xac\x57\x3f" - "\xf2\x48\x21\xcc\xac\xfd\x12\x12\x8e\x7f\x09\x46\xe6\x31\xaa\x69" - "\x8d\x37\xed\x97\x76\x1c\xef\x51\xd8\x07\xc3\xb2\xf3\xb5\xde\x2c" - "\x46\x5a\xeb\xdd\x67\x84\xba\x1b\x81\xb5\xde\x37\x7a\x03\x6b\xbd" - "\x51\xa6\xb4\xb4\xde\xdb\x09\xbb\x6b\xa2\xcf\xc2\x70\xd4\x13\x3b" - "\xc9\xf7\x91\x2b\xa0\xd9\x7b\x05\x60\x76\x99\x9a\xfa\x99\x1a\xd4" - "\x87\x5d\x0e\xac\x1b\x7a\xee\x84\xb2\xb9\x78\x8f\xc2\x0b\xfb\x73" - "\x65\x7c\xaf\x8a\x2e\x49\x8e\x31\x4c\x8d\x61\x93\xf0\x1e\x81\xf7" - "\x31\xa5\x35\xcc\xc5\xca\x8b\x13\xd1\x57\x19\x49\xf2\x2c\xd6\x97" - "\x17\x27\x7a\x6c\x65\x51\x4e\x38\x55\x20\xcb\xb5\xb0\xef\xbb\xb4" - "\xef\x77\x5e\xa6\xfd\xde\x5d\x9c\xae\x3e\xb3\x8a\xf6\x7e\x97\xc2" - "\x89\x86\xad\x94\x2f\xe6\x9f\x89\xf7\x68\xd1\x07\x2d\xed\x91\xd3" - "\xf6\xf6\x99\x29\xcf\x4d\x18\xce\xe4\x70\x2c\xb7\x86\xe2\xfe\xa5" - "\xf3\xb2\x5a\xc0\x18\xd5\x88\xd3\x2b\xe1\x47\xdd\x2f\x39\x45\x3a" - "\xde\xab\x8e\x66\xcd\xd9\x73\xa1\xe6\x28\x3b\x7b\xfc\x28\x6b\x11" - "\xba\x57\xd6\xe8\x84\x7f\xe2\x7b\x4f\x62\x1b\xde\x72\x10\xe3\x9a" - "\xb1\x37\x4e\x7c\x69\x31\xd1\xfc\xd2\xb2\x73\x4e\x98\x16\x17\x5c" - "\x06\x66\xdb\xd9\x48\xed\xe8\x3f\xed\x6e\xc5\xfe\xe4\xf3\x8d\xed" - "\x5d\x3d\xf0\x0f\x37\xba\x23\x4b\x3f\x06\xb5\xc3\xd7\x09\x73\xe2" - "\xc4\x39\x39\x75\x47\x99\xf3\x15\x3a\x3f\xf8\x28\xeb\x41\x79\x99" - "\x74\x09\xf6\x4c\xba\x27\x0e\xe2\x7e\x83\x5e\x89\xb0\x4f\x7b\xee" - "\x0f\xb2\x4f\xef\xb5\x39\x9b\x82\x6c\xd3\xfe\x4d\x83\x6d\xd3\xbe" - "\x7c\x61\x9b\x50\xf7\xb9\x2d\xea\x77\x4a\xe1\xab\x15\xe1\xd2\xfa" - "\x95\x7d\x0f\x28\xc2\xbd\x52\xf8\x0c\x45\xb8\x4b\x84\xef\xcd\x93" - "\x6d\x5f\x3b\xd1\xb1\x9d\x6c\xdf\xde\x25\x64\xfb\xda\xb3\x25\xdb" - "\xc7\xed\xcf\xde\x59\xec\x4d\xb4\x45\xdb\xc8\xde\xec\x8d\x24\xfa" - "\xd9\x2f\x41\xa6\x7d\xc4\x45\xb0\x7d\x48\x61\xe5\xbf\x07\x0d\x5e" - "\x92\xdd\x2b\x19\x47\x76\x8f\x6c\x1e\xd9\xbe\x37\xc6\xb2\x8e\x37" - "\x8e\xb2\xf3\x35\x7c\xdf\x6a\xdb\x80\xfd\x7b\x19\xc3\x0e\x62\xd8" - "\xcb\x18\x4f\x76\x90\x78\xd2\x96\xd9\x04\xfc\x5c\x9b\xf2\x22\x8b" - "\x5f\x9d\x08\x87\xb1\xbe\x69\xff\xab\x7d\xc8\xdf\x68\x15\x58\x1c" - "\xc5\x6e\xbe\x0e\x85\xf6\x4a\x6f\x2f\xee\x22\xbd\x1b\xbb\xd7\x4f" - "\xe3\x14\x7f\x86\xdd\x6e\x76\x89\xd6\xaa\x10\x0d\x6b\x77\x3c\x4a" - "\x7b\x7d\xab\x5a\xcc\x00\xb4\x2f\x01\xd9\x6c\xa4\x45\x53\x8e\x34" - "\x89\xbd\x85\x6d\x67\x9c\xf0\x99\x24\xaf\xfb\x69\xad\x1a\xb6\x29" - "\xd8\x11\xb7\xa1\x7d\xc4\xb2\x45\xf7\x97\x01\xed\xcd\x42\xe7\x6b" - "\xd2\xfd\x0d\xb5\xdf\x5c\x2e\xef\xcf\x62\x43\xdb\x80\x30\x8e\x0e" - "\x2f\x10\xcd\x4e\xb0\x2d\x6d\x2b\x69\xc2\xf4\x7b\x5c\xc4\x1b\x66" - "\x2b\x95\x71\xa8\x38\x0e\x35\x1f\xbb\x35\x23\x9c\x53\xf8\x37\x96" - "\xf4\xb6\x2c\x17\x90\xdd\x77\x74\x23\x8e\x92\x4e\x81\x03\x71\x31" - "\x6c\x03\x42\xe2\x24\xfc\xa3\x76\xb1\xbf\x22\xfe\x33\x54\x5f\xb4" - "\x4f\x17\xcd\x53\x42\xbe\x44\xd1\x5e\x0d\xc2\x0f\xb5\x2d\xaa\xfb" - "\x3d\x80\xb4\xd7\x18\xca\x9b\x2d\x95\xf6\xf2\xa2\xfd\xc5\x6e\xb6" - "\xb7\x18\xf2\x28\x41\xde\x5f\xcc\xbf\xfd\xdb\xdd\x5b\x0c\x71\xeb" - "\x6b\xd5\x0c\x75\xce\x96\x4a\xfb\x8b\x21\xfd\x0d\x24\x87\x52\x99" - "\xd2\x5e\x7d\x8a\x78\xbe\xe7\x20\x85\x1d\xb1\xb1\x56\xb9\xfe\xa9" - "\xbc\x54\x16\x8c\xb3\x08\xff\x90\xa1\x5e\xee\x4b\xa3\x78\x0c\xcb" - "\x22\xf8\x39\x68\xc7\x1c\xd8\x86\xbd\xdb\xd9\xaf\x3e\xb2\x13\x34" - "\xc2\xa6\xed\xcf\xa1\xf4\xc2\xa6\xed\xd7\x07\x6c\xda\xfe\x51\xc2" - "\xa6\x09\x1e\x0b\x9b\xb6\x5f\x25\x6c\xda\xbe\xaf\xf8\x7c\x22\xb4" - "\x69\x14\x47\x76\x4d\xb6\x69\xc7\xc7\xb2\x56\xb2\x1d\x1e\xdb\xbe" - "\x6e\xd9\xb6\x1d\xc2\x30\xb2\x1d\x44\xa3\xb0\x53\x7b\x53\xd8\x1f" - "\x8c\x20\xe6\x6b\xd2\xb3\x99\xf6\xcf\xe8\x96\x9e\xa9\x3d\x79\x52" - "\xd8\xb8\xfd\xc9\x01\x1b\xb7\xcf\x1e\x48\x4b\x36\x6e\xff\x63\xc2" - "\xc6\x89\xf0\xba\xa7\xc8\xc6\xed\x4d\x21\x1e\x48\xf8\xd5\xf4\x1d" - "\x4d\x82\x27\x3e\xa6\x05\xdb\xb8\x50\xfd\xda\x5f\x25\xdb\x38\xb2" - "\x6d\xf8\xde\xe0\x84\xa9\x7c\x5c\x98\xf4\xac\x0a\x79\x2e\xeb\x1d" - "\xd5\x01\x95\x99\xce\x0f\x20\xbe\x2d\xbc\x0c\xc3\xa5\x7d\x6b\xa4" - "\x72\xef\x77\xca\x6b\x34\x91\xff\x83\xf7\x34\x83\xc0\xbe\x64\x58" - "\xd7\x53\x68\x3f\x47\x47\x59\x27\x38\xaa\x59\x59\xbb\xef\x02\xf8" - "\xf7\x6e\xfc\x9c\xea\x15\xfb\x1b\x3f\xa4\x3b\xd9\x9d\x4b\xf0\xc2" - "\xd4\xb5\x6e\x3e\x7e\xff\xf9\x11\x35\xc6\x59\x43\xe2\xe6\x53\x1e" - "\x34\xae\x88\xcf\xda\xa1\xc6\x11\xbe\x41\x5e\x87\x6e\x92\xd7\x3b" - "\x3c\x2f\xf4\xa5\xb0\xdf\x13\x73\x05\x5e\xe0\xdf\xd0\xf8\x9e\xcc" - "\xe1\x71\xfd\x4e\x8a\x8f\x18\x22\xfe\xab\x9b\xa7\x7f\x71\xfc\xcd" - "\xd3\xbf\xf8\x00\xd9\x20\x5a\x8f\xd7\x6f\x0b\xc5\x33\xda\x27\xc3" - "\x5d\x22\xb8\x1c\xe9\x3b\xc8\xe7\xa5\x53\x79\xbf\x4c\x2f\xe3\x24" - "\xb9\x3b\x8c\x70\x7c\xff\x5a\xb4\x91\xa9\x3b\x80\xf6\x0e\x0e\x4e" - "\x7b\x3c\xc0\xdf\x17\xd3\x6f\x32\x4e\x13\xe5\xc0\x5e\x20\x9d\x2f" - "\xdf\x8c\xad\x20\xad\xa5\xa9\x1a\xf8\xf6\xf0\xa2\x1b\xed\x25\x3f" - "\xbf\x55\x5a\xb7\xdb\x83\xf6\x6d\x0a\xed\xb1\x49\x7e\xa5\xb4\xd6" - "\x62\x1c\xda\xe5\x58\xda\x87\x85\xc6\xab\xd7\xf6\xa7\xab\x9b\xf9" - "\xfe\xfb\x07\x12\xe5\xb4\x43\x8d\xed\x51\xbe\x52\x9e\x7c\x1d\x12" - "\xa6\x31\xc9\x69\x08\x37\xad\xbd\xc1\xf6\x78\x0a\xdf\xdf\xcc\xd7" - "\x43\x36\x70\x1c\xfa\xa0\xb1\x22\x9f\x6c\x90\xf2\xa9\x76\xc2\x0b" - "\xa6\x9b\xad\x73\x1a\xba\x7c\x07\xce\x7f\xf3\xf2\x81\x54\xbe\x97" - "\x74\xb7\x28\xdf\x4d\xf2\x7d\x69\xe9\x37\xcf\x57\x27\xe7\x7b\xe0" - "\x9b\xf3\xf5\xa5\x33\x5f\x9f\xaf\x89\x12\x5f\x5f\x72\xdd\x82\xaf" - "\x61\xf2\xf9\x71\xc2\xd7\xcf\xc7\x20\xe5\xf3\xe3\xcc\x70\xf9\x00" - "\xff\x0d\xb9\x5f\x8f\x56\x3e\x23\x46\x3a\x97\x78\x04\xe2\xa9\x77" - "\xc2\x81\x81\xb3\x87\xc5\x79\x49\x3f\x3e\xed\x84\x97\xaa\x42\xd7" - "\x71\xfd\xf8\xdf\xd6\xd6\x53\xbb\xce\xfc\x4e\xf8\xf1\x79\x1a\x6b" - "\x4b\xdd\x25\xf6\x07\x94\xd2\xa0\x3d\x7f\x69\xc8\xfd\x8b\xa4\x3d" - "\x72\xb2\xe5\xbd\x3b\x68\x7d\x2a\xab\x6c\xcc\xee\x2d\x35\x83\x38" - "\x2b\xfa\xe5\x7b\x69\x1d\x12\x3e\x0f\xc7\x67\x31\x0e\x45\xe7\x0b" - "\x88\x3d\x29\x86\x61\xd8\x1e\x3a\x7f\x42\xac\xdf\x7b\x39\x03\x69" - "\xb0\xf2\xb1\x26\xbe\xc7\x3e\xdf\xdb\xc5\x8d\x70\x6a\x4a\x2b\xf6" - "\xf4\x78\xd9\x2a\xc3\x38\x65\x7c\x03\xfb\x5b\xbc\xbc\x44\xb4\x2d" - "\x2f\xa7\xf5\x0e\x71\x8e\x11\xed\x73\xd6\xb0\x3b\x31\x64\xfd\xe1" - "\xa2\xc2\xc2\x2d\x85\xf3\x0c\x45\x9b\xd6\xcd\x2a\x2a\xce\x29\xde" - "\x5a\xc4\x17\xaa\x8f\x04\x0c\x30\x14\xe7\x6f\xca\xdb\xb2\xb5\xd8" - "\xb8\x3d\x27\x5f\x2c\x6c\xbf\x0b\x01\x83\x81\x20\xf4\xdc\x48\xb4" - "\x41\xe7\x98\x9a\xef\x41\xc1\xcf\x8e\xa4\xbd\x48\xe4\x75\xbb\x2d" - "\x7a\x7e\xc6\x16\xda\xac\x83\xc9\x4e\xd8\xd2\x2d\xd7\x03\xed\x8f" - "\x88\x7e\x8b\xfe\x12\x1c\x7c\x92\x64\x67\x05\xba\xa0\x75\x62\x5f" - "\x09\xbe\x37\x80\xa3\x18\x03\xda\x41\x6b\xdf\x46\xe3\xb0\x07\xcf" - "\xf9\x6d\x2f\xdb\xf9\x7e\x8f\x3b\x2f\xd1\xfb\x35\xd9\x4f\xa0\xef" - "\x4a\xe2\x3b\xf0\x94\x05\x9d\x70\x70\x06\xe5\x4b\x7a\x57\x5b\x29" - "\xce\xea\x66\xb6\x97\x3b\x68\xad\x36\xbe\x6b\x91\x06\xbb\xec\x8b" - "\x22\xbd\x51\x2c\xa6\x11\x7d\xb4\x83\xee\x0f\x74\x2e\x90\xd6\x7a" - "\x6b\x6b\xc5\xba\x6e\x0d\xc2\xf6\x0c\xc0\xda\x68\xdf\xe3\x46\x33" - "\xb6\x9b\x61\xbf\x65\xb3\xd8\x5d\x99\xfe\xbe\xcc\xc8\xe0\x32\x63" - "\xbf\x1a\xeb\xef\xd0\xdb\x58\xf6\x38\x59\x56\x44\xdd\x1f\x3a\x24" - "\xf6\x5e\xde\x95\x89\x61\xc3\xf0\x6e\xe9\xc5\x38\xda\x03\x01\xe3" - "\xb2\xe9\x1b\x59\x7b\xc9\x55\x7b\xb3\xbe\x13\xeb\xfd\x90\xc5\x09" - "\xdb\xe2\xc5\xba\x35\x84\xc7\x3c\x1c\x65\x37\xa0\xc5\xc0\xec\x34" - "\x46\xe7\x84\x43\x67\x5a\x0c\x6e\x60\x11\x6b\x3e\xa7\x74\xa8\x57" - "\xfa\x52\x2b\xf9\x22\x18\xce\xd7\xe7\x1d\x6a\x94\x79\x5e\x6c\x60" - "\x97\x09\x66\xa8\x71\x65\x6a\x2f\x8f\xf0\xb6\xe4\x4b\xa0\x39\x58" - "\x5d\x70\xe8\xbc\xb2\xbd\x98\x61\x9a\x67\x30\xe5\x14\x1b\x0a\xf2" - "\x37\xe7\x19\x4c\xf9\x26\xc3\xe6\x2d\xc5\x86\x0d\x5b\x68\x80\x87" - "\x86\x74\x42\x64\xc2\x4f\xe5\xdb\x9e\x19\x29\x7f\xc3\xee\xdd\x6e" - "\x1e\x26\x64\xfa\xc8\xac\x5e\x8f\x79\x78\x28\x4f\x8e\xc4\x88\xb6" - "\xf2\x70\x36\xd2\xae\x11\xeb\xff\x22\xba\xf1\x1d\xcb\x7f\xa8\x35" - "\x54\x77\x8f\x3c\x2d\xc1\x1e\x94\x61\xb9\x5c\x4c\xbb\x34\x10\x77" - "\x44\x92\xc7\x3a\xb1\x4e\x99\xef\x7b\x53\xc7\xe7\xf0\x1f\xb6\x0f" - "\x99\x86\xf6\xfa\xda\x09\xb9\x57\xe0\xf0\x3b\xcc\x76\xc8\x2d\xc9" - "\x90\xd6\x5f\xbe\xcb\x2c\xc9\x0f\xca\xc4\x11\x18\x2c\x3f\x47\xb2" - "\x48\x7e\x98\x27\x53\xcb\xe7\x7b\xf8\xbc\x68\xe7\xf0\x1d\xdb\x67" - "\x27\x1c\x36\x51\x39\xdc\xdb\x33\xb5\xa5\xc7\xf8\xfe\x7b\x5f\xd0" - "\xb7\x53\x3a\x9f\x06\x65\x65\x84\x38\x47\xf3\x48\x86\x5c\x47\x32" - "\x7c\x78\x1d\xe6\xf2\x12\x2a\x63\x82\x9f\xff\xc8\x65\x0c\xfd\x03" - "\xa4\x49\x2d\xef\xf3\x47\x6d\x08\xd2\xd6\x52\xbc\x8b\x31\xcc\xa3" - "\x29\x48\x0e\xae\x84\x93\x03\xac\xdb\xdc\x82\x2d\xb9\x1b\x51\xd1" - "\x0b\xf3\x8a\x73\xcd\xb4\xb7\x05\xd9\x01\xbe\x71\xc6\x0c\x93\x61" - "\x6b\x51\x5e\xee\x48\x08\x07\x35\x10\x19\x5c\xff\x3a\x3f\xca\x6b" - "\x6f\x6f\x66\x24\xad\xb1\x10\x6b\x2a\x2a\x76\xf5\x16\x61\x5f\x24" - "\xa4\xde\x2b\x9e\x73\xe8\x13\xd1\xa7\x4b\xe4\x7b\xc7\x11\xcf\xc4" - "\x3c\x81\x8a\x9f\x11\x1f\x7a\xd5\x2a\x6c\x4f\xca\x8b\x65\x19\xc0" - "\xe7\x32\x2c\x93\x39\x30\x47\xa3\xe2\x74\xaf\x3a\xf2\x02\xd9\x1f" - "\x31\x1f\xe4\x12\xda\x81\xe8\xba\x4e\x28\xe7\x73\xc1\x6a\x79\x7b" - "\x54\x7e\x5a\x4e\x73\x78\x60\x9d\x73\x45\xbc\x2c\x27\x41\x69\xde" - "\xa6\x30\xbe\xd7\x91\xed\xc8\x39\xaa\x73\x26\xea\x5e\x23\xc3\x21" - "\x5f\x59\x1d\xb7\x23\x15\x5a\xa5\x6d\xf8\x40\x47\xdf\xc4\x05\x3d" - "\x5c\xfe\x74\xbb\x52\xf8\xbe\x29\xe8\xeb\x75\x42\xc5\x18\x69\x7e" - "\x0a\x1f\x53\x74\x58\x11\x97\x57\xe0\xc2\xbc\xae\xcb\x79\xb1\x98" - "\x5d\x74\x9e\x29\xca\x59\x85\x39\x30\x66\x58\x11\x47\x7d\x65\xd6" - "\x9b\x39\xcc\x09\xe5\x19\x5c\xb6\xf0\xb9\x78\xbc\xd8\xc3\x8d\xe4" - "\x8d\xca\x49\x72\x15\x90\xa9\x8a\x93\x72\x7d\x53\x99\x31\x5d\x96" - "\x81\xef\xf3\x5b\x61\x97\x79\x39\xd4\x5e\x33\x5c\x6f\x75\x48\x8b" - "\x47\xe8\x2e\xef\xe7\x89\xfd\x85\x68\x9d\x4b\x04\xd2\x68\xbe\x08" - "\x95\xff\x46\x73\xf7\xa3\xbd\xd4\x6f\xda\x65\xa6\xbd\x13\x44\x5b" - "\x56\x69\x40\x19\x8e\x0b\xac\x4d\xaf\x44\xff\xaf\x3c\x4e\xd4\x5d" - "\x65\x72\x90\xee\xb9\xa4\xf9\x00\xc3\x89\x47\x64\xcf\x1c\xd6\x45" - "\x5c\x5f\xc5\xba\xdf\x4a\xb3\x9c\x8e\xef\x33\x80\xb2\x41\xf3\x60" - "\xaf\x40\xe5\x01\x6a\x23\x88\x3e\x27\x54\x6a\x29\x7f\x2a\x1f\xb5" - "\xd9\x5c\x6e\xf4\x74\x06\x4a\x65\x83\x82\x86\xd3\x32\x2e\x09\x77" - "\x8b\xfc\x4e\xfb\x8e\x39\xa1\x2a\x9d\xce\x81\x6c\x76\xf3\x32\xdc" - "\xd6\x82\xbd\x82\x16\x37\x87\xeb\x91\x79\x88\xe1\x65\xf8\x8e\x75" - "\x71\x10\xc4\x37\xa1\x46\xb3\xb0\x45\x55\x74\x86\x29\x2b\x35\xd0" - "\xbe\x84\xc9\xc2\xde\xf0\xbd\x74\x78\xdc\x08\x49\x67\x47\xd0\x1a" - "\x21\x3e\x2f\xc6\xed\xe3\xb6\x41\xec\xbd\x80\xf1\xa8\x23\x1e\x3a" - "\xd3\xa5\xcf\x3c\x42\xd0\xf6\x4a\xf6\x40\x1e\x74\x3e\x25\xff\x06" - "\xf9\x4a\xba\xd8\xcb\x64\x38\xf6\xf5\x5e\x29\x93\xeb\x6f\xdf\x51" - "\x0c\xa3\xf3\x53\xd5\xa0\x6d\xe1\x7b\x85\xbd\x52\x23\xd3\x2b\xc5" - "\xa9\xb9\x3c\x70\x1e\xbc\x32\xa0\xff\xbd\xfc\xac\xcf\x57\x5a\xe5" - "\x7c\x38\x2c\xc2\x11\x7c\x4b\x02\x8f\xeb\x1a\xc0\x23\xf6\x50\xd1" - "\xf2\xf3\x9e\xeb\x29\xae\x0a\x02\xb6\xaa\x92\xef\x57\xcc\xe7\xad" - "\x61\x39\x5c\xcf\x9b\x47\xf0\x3a\x30\x00\x9d\x0f\x42\xe7\x08\xab" - "\x85\x2c\x56\xcd\x95\xd3\x44\xa8\x88\x8f\x55\xa9\x72\xde\x32\x0e" - "\xa2\xff\xa6\x36\x4f\x94\x45\x43\x3a\x22\x9d\xd9\xc9\xed\x85\xf0" - "\xb5\xaa\xda\xb8\x0c\xf2\x72\x56\xd5\x07\xd7\xb5\xf0\xe5\xaa\x4e" - "\x07\xc9\x03\xd1\x33\x50\xff\x58\xf7\x6e\xd1\x96\x54\x75\x04\xd1" - "\x98\x82\xef\xdd\x81\x7a\xe0\x75\x44\x67\x40\x85\x3d\xef\x91\xeb" - "\x0a\xc2\xf8\x19\xa7\x93\xea\x03\xfb\x62\x49\xd0\x42\x3e\x21\xea" - "\x0a\xf2\x04\x69\x7c\x75\x13\xc9\x95\xc7\xf6\x6a\x4a\xa8\x6c\xbe" - "\x9a\x1e\x44\xaf\x8a\xec\x3a\x86\x99\x64\x18\x27\xbc\xca\xd7\x32" - "\xc9\xfc\xc4\xb8\xb2\x81\x7a\xbc\x8f\xc3\x96\xcb\x74\xde\xa2\xcd" - "\x90\x78\xf5\xea\xc7\x52\x1e\xad\x72\x1e\xf8\x8c\xfd\x9f\xaa\x2c" - "\x25\x8e\x75\x3b\x8a\xf3\xc4\xe6\x46\xd4\xc8\xe7\xe4\x6e\xcc\x33" - "\xcd\x34\xe4\xac\xa7\x6d\x90\x8a\x0a\xf2\xf2\x2c\xfc\x23\x4e\xa8" - "\x1f\x18\xc7\xf3\x43\x3e\x88\x3d\xa7\x5f\x7b\xec\x15\x31\x7f\x85" - "\xf4\x82\xf4\xdd\x45\xfa\xde\x5c\xf2\x25\xef\xdb\x38\xca\xee\x03" - "\x87\x97\x95\x91\xff\xcf\x6d\x1f\x95\x5f\xef\x16\xed\x00\xd6\x27" - "\xb5\x91\x1e\xdb\x51\x4b\x28\xbf\x8e\x96\x85\xea\xf2\xd1\xf2\xf0" - "\x76\xe2\xe8\xbd\xdc\x4e\x94\x0b\xb9\x20\xfb\x44\x73\xff\x09\x2f" - "\xa6\x69\x51\xe0\x3c\x1f\xb0\x51\x47\x9d\xb2\x8d\x12\xed\xc4\x6b" - "\x1a\x6c\x83\xca\xa5\xbc\x7c\x01\xb9\x79\xad\x44\xc8\xcd\x6b\xd8" - "\xff\xfb\xc7\x7d\x72\x5f\x47\xb4\x1d\xaf\x3a\xc9\x7f\x14\xe7\x6b" - "\xbf\x96\x28\xe3\xab\x8a\xa5\x76\xe3\xb5\x94\xc1\xfe\xc3\xd1\x1e" - "\xf2\x1f\x68\x5e\x22\xf1\x82\x9f\x27\xcc\xf5\xe6\xb5\x82\x20\xfb" - "\xa3\xc3\xf7\x92\x70\x75\xbd\x8e\x9a\xe3\x59\xf4\xb9\x6d\x56\xee" - "\xe6\xe2\xf9\xb4\x45\x55\x9e\xd5\x92\x97\x5b\x9c\x67\x52\x7e\x67" - "\x33\xca\xbe\x18\x7d\xe3\xae\x42\xbd\x77\xc5\x10\x3f\x5e\xc3\xf2" - "\x1f\xf3\xc9\x65\xe0\x76\x0a\x7d\x47\xc9\xc6\x45\x5d\x84\x63\x1f" - "\x8b\xb3\xc4\x5f\xf3\xc9\x72\x42\x70\x0b\xad\xcc\xef\xb1\x55\x63" - "\xf9\x8f\x6a\xa5\xfe\x16\xf6\x69\xab\x0d\xf2\x7b\x20\x7d\x75\x1e" - "\x6f\xfb\x8e\xf2\x39\x7d\xc8\xd3\xea\xae\x20\x7f\x8b\xde\xcf\x48" - "\xef\x7c\x1f\x26\x71\x2e\x7a\xf5\x0e\xc1\xdf\x6a\xac\xff\x57\x25" - "\x5b\x71\xac\x55\xe0\x01\x78\x6b\xb7\x2b\xb2\x8e\x8f\xef\x57\x97" - "\xcb\xf9\x61\xfa\x0b\xc1\x79\x52\xbb\xa5\xc4\xe7\x84\x6a\xbe\x3e" - "\x64\x2f\xdf\x43\xae\xfa\x6c\x18\x5a\xd3\x83\xe1\x10\x06\xfb\xbf" - "\xaf\xd6\xc8\x65\x5e\x65\xa5\xb0\x63\x9a\x9b\x94\xb1\x47\x94\xf1" - "\x58\x19\xc9\x16\xe5\x4f\xf2\x2f\xd1\x60\x92\xf6\x25\x71\xd2\xf9" - "\x8d\x44\x3f\xdf\x1f\x4d\x4f\x7a\x7d\x0c\xfb\xbf\x15\x67\xe5\x72" - "\x50\x19\x4f\xef\x76\x69\xe4\x7d\xa9\x44\xfa\x63\xf3\x43\x69\x3b" - "\x76\x30\x28\x4d\xb7\x7d\x1a\x8d\xdd\x1f\x9b\xc1\x6c\xaf\x1d\x20" - "\x39\xa4\xfd\xaa\xaa\x06\xe4\xf0\x58\xd3\x60\xb9\x3b\x96\x40\x72" - "\x17\x2c\x4b\xf9\xf7\xe5\xa2\x24\x15\xe5\x15\xcf\xe3\xde\x3d\x3a" - "\x76\xb4\xed\x59\x4e\x71\xfe\x96\xcd\x45\x33\x0d\x45\xa6\x1c\x49" - "\xe9\x43\x74\xde\xc6\xfb\xfe\x6e\x59\xcf\x3c\xb6\xd7\x13\x02\xb6" - "\xe5\xf5\x80\xfc\xd3\x1c\xad\x69\x34\x36\xfb\xfa\x0e\xa1\x4f\xaf" - "\x2f\x0d\xd2\x5d\x9e\x9e\x74\xb4\x8e\xfb\x6c\xaf\x07\xb7\xff\x6e" - "\xe4\xe9\x88\x2b\xf0\xfa\x18\x89\xa7\x6e\xc1\xe3\xd7\x7f\xc5\xcb" - "\xc9\xf7\xe3\x3a\x76\x9e\xca\xc9\xf7\x7f\xe1\xfe\xd9\xeb\x27\xe5" - "\xf2\x06\xfa\x0d\xaf\xdb\xb9\x1f\x25\xf9\x6b\xb7\xea\xd7\x0b\xff" - "\xf4\x8d\x2c\x69\xec\xad\x43\xee\xe3\xc9\xfe\x35\xd2\x62\x12\xbe" - "\xea\x1b\x63\x56\x94\xb0\xbe\xb5\x56\xda\xa7\x8e\xea\xe0\x8d\x87" - "\x64\xdf\x92\xcf\xdf\xab\xd8\x95\xe6\xb1\xbd\x91\x14\x6c\x27\x58" - "\xc4\xc6\x0e\xc9\x47\x4c\x13\x7d\xd7\xdb\x7e\xde\x89\x79\xd1\xb7" - "\x87\x9b\xd0\x86\xe5\x7a\x03\xed\xdf\xbb\xa7\x09\x0f\xf9\xd7\xac" - "\x57\x2f\x9d\x55\x59\xc3\xbf\xe1\xd5\x22\x6e\x17\xd6\x2d\xc2\xa1" - "\xff\xf7\x3a\x97\x0d\x3f\xca\x28\xcd\xdd\x71\xcb\x3e\x12\xbc\xf1" - "\x29\xb5\x45\xf8\x8c\x72\x5b\x63\x14\x32\x55\x63\x74\x15\x19\xa1" - "\xb7\x57\xaf\xee\x2d\xca\xd4\xd0\x78\x01\xf1\xc2\x51\xe3\x05\x21" - "\x3f\x6f\x78\xd1\xe6\x9d\x0c\xc6\x27\xe1\x22\x9e\x6a\x88\x0e\x56" - "\xa4\x57\x93\x7c\x93\xbc\xb2\x5e\x23\xfa\x09\x6f\xd8\x59\x91\x51" - "\x3d\xc4\xde\x5b\x37\x2b\x67\x14\x9d\xf7\x48\x67\x80\x92\xbd\x12" - "\xfb\xfb\x1f\xdf\xff\x8a\x18\x1b\x90\xf2\xad\x79\x89\xa9\x4f\xf0" - "\x76\xe5\x30\x6f\x57\x18\x88\xfd\xd2\x6b\x4e\xf2\x79\xb4\x96\x13" - "\xfc\xcc\x57\x69\x7d\xb6\xab\xc5\xe2\xe3\x67\xd5\x95\x16\x93\x9f" - "\xe6\xa3\xef\x46\x7c\xfd\x71\x73\xb1\x0f\x56\x79\x49\x26\x6b\x3a" - "\x68\xaf\x78\x71\x16\x78\x4d\x97\xbc\x3f\x3c\x9d\x21\x49\xe7\x9f" - "\x62\xb9\x22\x02\xe7\x97\x1e\x3f\x43\xe3\xb6\xa2\x3f\xae\x87\xc3" - "\xe8\xd3\x8b\x3a\x38\x3e\x8b\xce\xe2\x13\x7d\x85\x4e\xac\x97\x88" - "\xbf\x20\xec\x22\xf1\x0d\x59\xb6\x13\xc7\xdf\xa3\xb9\xe9\x4e\x09" - "\x87\xc7\x76\x1c\xdb\xff\x37\xcc\x22\x2f\xc4\xe7\x91\xeb\xf3\xf8" - "\xac\xc1\xe3\x1b\x01\x7c\x98\x7e\xa6\xe4\x17\x80\x18\xfb\xfa\x80" - "\x70\xd5\xc8\x63\x5f\x01\xdf\xe7\x78\xa3\x3c\xf6\x25\xf6\x9e\xae" - "\x29\xa6\xfc\x87\x1a\x23\x62\xa5\x4f\x92\xdc\x6b\xc9\x87\x1b\xd2" - "\x9f\xc0\xf6\x9d\x68\x97\xfd\x42\x51\x3f\xb5\x4b\xc8\x3f\xa4\x33" - "\x57\x65\x5f\x52\xf8\x00\xb5\x19\xa2\x2d\xab\x4d\x92\xdb\x32\x4c" - "\x7b\x5a\xb2\x15\x52\x3b\x57\x3b\xd0\xff\x0d\x3f\x2f\xbf\xb6\x58" - "\xe6\x91\xcc\x73\xc1\xa3\xda\xb6\xde\xd8\xc2\xf2\x00\x6f\x6b\xdb" - "\x38\xaf\x07\xe2\xeb\x22\x83\x78\x4f\xef\x1a\x61\x37\x6b\xb1\xfd" - "\xaf\x99\x2b\xda\x14\x11\xc6\x62\x1b\x37\xf2\x73\xdb\x39\x0f\xf2" - "\xf9\xd8\x8c\xab\xd4\x48\xb4\xb9\x9c\xaa\x44\x83\xb0\x65\xb5\x08" - "\x7f\x5c\xea\x93\xd5\x56\x13\x2d\xc1\xf4\xae\xde\xbc\x71\xf3\x96" - "\xed\x9b\x69\x40\x6d\x6b\x91\x21\x77\x8b\x29\x6f\x64\x98\xf1\x10" - "\x3d\x9d\x6b\xed\xae\x1a\xd8\x77\xea\x4d\x2d\xcd\xa3\x17\x67\x16" - "\xbc\x39\xc2\x70\x07\xc9\x57\xdd\x26\x1a\x2b\xe0\x67\x47\xd0\x1e" - "\xab\x62\xdc\xa0\x9b\xd2\x0b\x5e\x9f\xb8\xd6\xbb\xdd\x2c\xf9\x58" - "\x27\x7e\x4a\x7c\x94\xfa\x1c\x0c\xcb\xf8\x85\xdc\x0e\x11\x7d\xdc" - "\x37\xef\x33\x72\xbb\xe8\xef\x33\x6b\x38\xbf\xfa\x8c\xd8\xde\xd4" - "\xb5\x3a\x55\xb3\x7d\xa2\x5c\x75\xe7\x65\x7e\x50\xf9\x3d\x74\xd6" - "\x26\xcb\x47\x19\x7d\x53\x2b\xe1\x22\xfb\x49\xb8\x6b\xe4\x79\xdc" - "\xb4\x97\xa8\x7d\x1b\xed\x23\x5c\xff\xa9\xbf\x82\xec\x4d\xbd\x5e" - "\xb6\x4b\xd4\x16\xf9\x11\xcf\xbb\xd7\x5d\x91\xa8\x37\x0f\x61\xda" - "\xb1\x9d\x70\xc2\x24\xce\x1b\xa8\x4f\x0d\x3d\x6f\xe0\x84\x01\x2f" - "\x93\x74\xed\x0b\x7a\xbe\xd9\x25\xa7\x49\x0f\x84\xd5\xd7\x2b\x60" - "\xf6\x21\x4d\xa7\x06\xfc\x15\xb1\x9f\xa9\xb4\xff\x31\x9d\x9d\x51" - "\xff\x05\xed\x19\x1a\x90\x8d\xfa\x51\x92\x0f\xd2\x4d\xbc\xa3\xf6" - "\xb6\x0b\x4e\x88\xbd\x4c\x2a\x51\x36\x58\x26\x50\x99\x98\x27\x1f" - "\x65\xe2\x84\x26\x20\x07\x82\x47\x18\xa6\x0f\xf8\x29\xf5\x3d\x94" - "\x26\x98\x0f\x98\xc7\x43\xa2\x6f\x7a\x22\x45\x6e\xb3\x69\xbf\x54" - "\x71\xfe\x44\xfd\xa9\xd3\xbb\xbb\xb1\xcf\x7f\x22\x2b\x08\xc7\x29" - "\x69\x2c\x42\xc3\xd4\x75\xba\x3a\xde\x67\x3b\x51\x12\x18\x13\xa8" - "\x3f\x45\x76\x97\xe3\x88\x6d\xb4\x38\xdc\xfc\xcc\x68\x95\x7c\x46" - "\x3c\xc2\x9e\x94\x7d\x14\x19\x57\x8b\x18\x73\xe2\x7b\x5c\xa2\x0e" - "\x96\x23\xcc\xd9\x81\xf1\x58\x0c\x1b\xe8\x03\x5a\x51\x8f\xb9\xef" - "\x7d\xa2\x27\xd0\xd7\xab\xe3\xfb\x0a\xf0\x7e\xa0\xc0\xa3\x75\xc2" - "\x09\xa7\xb2\xdf\x86\xfe\x83\x21\x7f\x73\x3e\xba\x0f\x1b\x2c\x5b" - "\xe6\x63\xd7\x61\x83\x25\x7f\x3e\x4d\xf9\x5a\x96\xba\x84\xdf\x51" - "\x39\xe6\x87\x19\x3f\xa6\x71\x6f\x7e\x2e\x33\x8d\x19\x61\x3f\x97" - "\xc6\x4e\x3d\xe2\xac\xd4\xe1\xd2\x5d\x2b\xdd\x87\x61\xbb\x67\x41" - "\x5d\x39\x44\x67\xdf\x20\xff\xeb\xfd\x36\x71\xce\xab\xd4\x66\xa3" - "\x2d\x7f\x73\xbf\xfc\xbd\x8c\xcf\x81\xa7\x7d\x0c\x7b\xcd\x7c\x3c" - "\xce\x63\x7b\x73\x60\xfc\x43\x8c\x2f\x8a\x6f\x6e\x18\xde\x21\x87" - "\xcb\xe3\xb1\x18\xd6\x23\x8f\xbd\x0a\xd8\x37\x7d\x81\xb4\x21\x63" - "\xdb\x71\xf2\xf7\x38\x8f\xed\x2d\x83\xcc\x33\x19\x4f\xa9\x81\x5d" - "\x91\xfc\xa4\x08\xee\x57\xdb\xde\x8c\xe3\x7b\x87\x92\x2f\xce\xc7" - "\x99\xdf\xca\x90\xf3\xa1\x3e\x02\xd1\x2d\x7d\xfb\xe1\x7a\x4f\x7b" - "\x84\x8a\x3d\x46\xdf\x1a\xa8\x7f\x05\xcf\x8d\xdf\xbb\x8b\x8f\xcb" - "\x1b\x8b\xd0\x3f\xbb\x4b\x31\x0e\x47\x32\x34\xa7\x0a\x46\xf0\x31" - "\x26\xd1\x4f\x8f\x24\x1f\x01\xcb\x70\x02\xeb\x33\x82\x6c\xb9\x68" - "\xf7\xde\xba\x30\xd0\xc6\xeb\x1a\xcd\x2c\xb6\xf0\x20\xed\x33\x2f" - "\xd6\x2d\xbc\xf5\x15\xc9\x9b\x6b\xdc\x46\x0f\xa3\x39\xca\xaf\xad" - "\xf1\x88\x71\xf8\x86\xfb\x03\x63\x66\x6f\x1d\x90\xf6\x44\xa5\xf9" - "\x6f\x58\x5f\x0d\x33\x07\x7c\x4e\x84\xe7\xbe\x17\xe2\xa4\x35\x0a" - "\x94\xff\x37\xf8\xce\x83\xfd\xfe\xff\xad\x15\x7a\xda\x60\xe7\x38" - "\xd0\x56\x8b\x75\x00\x0d\xe8\xff\xbf\x55\x23\xda\x06\xc2\x9d\x09" - "\xbd\xb1\x9f\xba\x7a\x6d\x9f\xcc\x24\x1e\xba\x63\xaf\x24\x8a\x3d" - "\x88\x1b\x7e\xe5\xb6\x69\xb0\x4e\x1b\xb0\xfe\xff\x61\x50\x5f\x57" - "\xce\xab\x6f\x1b\x6b\xf1\x5d\x67\x4d\x87\x7f\x8f\x76\x6e\x3d\x80" - "\x6f\x1b\x6b\xec\xbb\xce\x4e\xf3\x33\xc8\xd7\x01\x1c\xfa\x13\x40" - "\x7f\xc4\x9a\x2f\x6e\xa0\xac\x2e\xbf\xe6\xbf\x42\xe7\x05\xd6\x21" - "\xdc\x72\xf7\x55\x56\x8b\x69\x96\x5b\xd8\x95\x5a\x84\x5b\x76\xf9" - "\x0a\x3b\x8e\xb0\xcb\xcc\x28\x2b\xdb\x98\xaf\x3f\x62\xe3\x17\x86" - "\xc7\xc9\x76\xbf\x9d\xea\xaa\xd8\x51\xc3\x6c\xea\x23\x6c\xef\x3d" - "\x77\x7b\x6c\x6f\xa7\x0f\x9c\x53\x86\x78\x49\xae\x56\x58\xe9\x79" - "\xe3\x17\x28\x07\x5f\xac\x45\xbf\x03\xe5\xf6\x0b\x84\xa3\xef\x3f" - "\x7c\x6d\x96\x2b\xe2\xee\x58\xbc\x8c\x61\xe9\xbf\xce\x5a\xfa\xb7" - "\xb1\xa6\x23\xcf\x20\xfd\x97\x90\xfe\xeb\xac\x11\xcb\x70\xfa\xf0" - "\x45\x00\xa2\xbf\x9f\x70\xf6\x43\xc4\xda\x1d\xaa\x98\x3a\x8c\x5f" - "\x6b\xd5\x41\x1d\xc2\x3e\xe3\x86\x98\x5a\x84\x79\xe6\xb9\x18\xe0" - "\xf4\xf7\x20\xdd\x31\x3b\x6a\xfa\x31\x6f\xa2\x1f\xf3\xf7\xca\x74" - "\xca\xf9\x13\xbd\xb2\xde\xae\xa5\x31\xc2\xd8\xc2\xf3\x44\xb7\xf8" - "\xee\xf1\x77\x39\xae\x22\xac\xe7\x88\x7b\xee\x16\x7d\xec\xbf\x4b" - "\x92\xe9\x0f\xfd\x0e\xf6\x77\x65\xc2\x7e\xfe\x1d\xf6\x7f\x1a\xa4" - "\x33\x5d\x44\x18\x95\xdf\x85\x7a\x2b\xad\xfd\xfb\x42\xe6\x19\xc6" - "\xcf\x54\x7e\xe7\x4a\xdf\x52\xc8\xc7\xa8\x73\x72\x8b\xf3\xb7\xe5" - "\x60\xcf\x77\x24\x58\x28\x88\xf7\x8d\xf3\x4c\x86\x2d\x9b\x0d\xeb" - "\x73\xf2\x0b\xb6\x6c\xcb\x2b\x9c\xc9\x87\x33\x8a\xf2\x36\x9b\x68" - "\xe8\xba\x30\xa7\xd0\x32\x52\xd1\x9f\x29\xdf\x51\xd3\x4e\x67\xd0" - "\xec\x26\xf9\x7e\xe7\x63\x69\xdc\xd6\xcb\x6c\x29\xbc\x5f\x2c\x6c" - "\xcc\x4f\xee\x37\xec\x4c\xa1\xf8\xf7\x44\x3b\xfe\x4e\x2b\xab\x2c" - "\xfc\x94\x31\x7e\xb6\xb6\xea\x0a\xbc\xf3\x33\xce\x8f\xde\x34\x19" - "\x0f\xef\xbb\x92\xcc\x5a\x76\x92\x1f\xf6\x93\x2c\x46\xf1\x21\xbc" - "\x78\xe7\x90\xf0\x45\x30\xbc\x2f\x0d\x02\xf3\xed\xdf\xf9\x98\xa9" - "\xb1\xec\xc8\x4b\xa9\xcf\x60\x95\xd6\x3d\xfe\xba\x13\xde\xa1\xbe" - "\x14\x7d\xb7\x39\xc7\x7d\x72\xbe\x3e\xeb\x9d\x7c\xec\x73\x58\x99" - "\x6d\x58\x14\xf1\xeb\xb0\xe8\xd3\xab\xa3\x55\x74\x76\x6e\x27\xad" - "\x15\x4d\xa4\xef\xbb\x75\x36\x7f\x62\x60\x7e\xd3\xdf\x1d\xa4\xfe" - "\x05\xff\xce\xc1\x6d\xd2\x4f\xba\x65\xdd\x55\xd3\xfa\x9b\xbd\x13" - "\xe6\x09\xfd\xfb\xc9\x65\x82\xc7\xfa\x9f\x27\xca\xc7\xcf\x01\x47" - "\xdf\xe0\x9d\x48\x2c\xff\xff\x66\xa5\x69\xd2\x37\xc9\x77\x22\xfd" - "\xb1\x5f\x26\xf6\x17\x61\xbf\x40\xf7\x65\x23\xc6\x5d\xf1\x57\x16" - "\xfe\xa9\x1f\x7d\x2a\x3f\xf6\x13\x58\xe5\x97\xff\xd2\x5f\x59\xd8" - "\xe1\xdf\x6e\x54\x53\xdb\x5a\x6a\x45\xfe\x6e\x31\x8f\x64\x57\xcd" - "\xb7\xf5\x6f\x37\xa2\xff\x55\xe8\x64\x0c\xd3\xc6\x16\xba\xf8\x79" - "\xc5\x95\x85\x9d\xd2\xfb\xff\x43\xdc\xfb\x80\x47\x59\x5c\xfb\xe3" - "\xf3\x6e\x96\x10\x31\x64\x37\x31\xe0\x0a\x41\x16\x0d\x36\xb5\xfc" - "\x89\x8a\x2d\x7a\xb1\x46\x81\x8a\xbd\x68\x52\x8b\xf7\xa6\xb7\xd8" - "\x04\x4d\x6c\xb0\x31\xac\xc9\x02\x9b\x18\x36\x7f\xe0\xa6\xb4\x85" - "\x64\xc1\xc0\x45\x09\x90\xf6\x62\x2f\x52\x84\x50\xb1\x8d\xbd\x28" - "\xab\x44\x1b\x35\x64\xa3\x45\x8c\x8a\x75\x89\x01\x23\x0d\x61\x25" - "\x0b\x59\x92\xdd\x77\xbe\x9f\x33\xf3\xbe\xd9\x0d\x26\xb4\xdc\x7b" - "\x9f\xdf\x2f\xcf\xb3\x79\xdf\x99\x77\xfe\x9e\x99\x39\x73\xce\x99" - "\x33\xe7\x9c\xa3\xb0\x0a\x3a\x19\x71\x01\x84\xfb\x55\x1e\x91\x7e" - "\x68\xda\x20\x85\x4d\x8a\xd0\xab\x4c\x05\x5f\x32\x87\xfa\xae\xf7" - "\x59\xf0\x67\x24\x23\x1a\xec\xdb\x0b\x4c\x8f\x27\xbe\x41\xd2\xf0" - "\xec\x31\xc0\x58\xda\xb2\x18\x4c\xb7\xeb\x23\x1d\x06\xd2\x3f\x77" - "\x21\xe8\xa7\x17\x9a\x55\xf2\x8d\xbe\x7a\xe2\xcd\xdc\xf0\xdb\x1d" - "\x84\xb3\xd2\x43\x02\x17\x32\x79\xee\xf4\xc2\x6c\x1d\x9e\x74\x8f" - "\x80\x70\x29\xc6\x2d\x25\xcb\xc7\xc6\x48\x3c\xf0\x42\x66\x04\x7f" - "\xd8\x4d\x63\xed\x65\xbb\x34\x3b\x5b\x31\xab\x65\xf8\xbf\x76\xc9" - "\xb5\xf2\xc2\x1a\x3d\x2d\xe2\xa4\xbd\x1f\x57\xd1\x81\x95\x41\x36" - "\xc1\xf6\x5d\x7e\x0a\x63\x94\xa9\xa5\xdb\x13\x5e\x53\x72\xbe\xe1" - "\x39\x9b\xf8\x6b\x3a\x7f\xa4\xf7\xed\x23\xdc\x85\x75\xd6\x71\x4e" - "\xfb\x15\xed\x9f\xd6\x09\x8c\xb5\xfa\x89\xb7\xda\x1d\x73\xb8\xce" - "\xcf\xc4\x38\x27\x14\x7e\xd0\xcb\xf3\x18\x68\xca\x61\x79\x09\xca" - "\x83\xf4\xf3\x04\x9f\x84\x75\xa1\x62\x5d\x20\xcf\x31\x9a\xd7\xce" - "\xf3\xc4\xbf\xec\x5e\xd3\x54\xda\x45\xb6\xfa\x31\x5f\x77\xaf\x21" - "\x18\xd2\x3a\xa8\xae\x14\xf7\x20\xc5\x3e\xe9\x5e\x31\x8b\xca\x78" - "\x2a\x2e\xc0\x8c\xad\xd8\x21\x30\x2e\x01\x9b\x93\xc5\x9f\x46\x7a" - "\xa3\x9d\xc5\x10\x0f\x3b\x74\x0f\x19\x7e\xff\xe8\x35\xaf\xda\xd5" - "\xbb\x71\x55\x79\x5f\xe5\xee\x83\xc0\xfd\x23\xda\x4f\x5c\x3d\x1e" - "\x74\x0d\xd2\xb9\x26\xd0\x59\xf5\xee\xae\xcb\xa5\xd5\xef\xe6\xd2" - "\x5c\x99\x69\x21\x79\xca\xaa\x5d\xe2\xcc\x3b\x61\x55\xb9\x94\x5b" - "\xfe\x2e\x45\xcf\x4f\x72\x4f\xd2\x2b\xa8\xe9\x67\x96\x9a\x41\x5e" - "\xf1\x77\x19\x72\x8c\x7e\x97\xa1\xf3\x17\xc3\xd5\x63\xdf\xc9\xd5" - "\xb2\xa9\xcc\xe0\xb1\xfa\xd8\x8c\x00\x8b\xdd\xfe\x1c\x63\xae\x12" - "\x1e\x78\xa6\x04\xf3\x08\x30\xe6\x86\xdd\xcd\xa4\x7f\xb1\x03\x7b" - "\x74\xb5\xca\x58\x14\xda\xf2\xcc\x05\xd4\xe9\x94\xe9\xb8\xb4\xab" - "\x66\x41\x3a\x3f\x9e\x89\xc0\x23\xac\xd6\xc9\x62\x6a\x55\x66\x74" - "\x39\x59\x12\xe2\x40\x57\xfc\xee\xa8\xce\x0b\x0c\x7b\x2e\xbc\x1d" - "\xf8\x11\xf5\x56\x38\x79\xf0\x0d\xf0\x77\x95\x2a\x0f\xfc\x23\x70" - "\xf7\xb2\x3d\xb3\x64\x1f\xf7\xcc\xd2\x79\x03\xbc\xa7\x0d\xbd\x63" - "\xbd\x27\xe5\xd2\x33\xe6\x47\x97\x2d\xb3\x67\x15\xe6\xd2\x23\x65" - "\xea\xf2\x6f\x5e\x4a\x2b\xc6\x4a\x7f\x54\x7b\x32\x69\x6d\x11\xfd" - "\x24\xef\x2a\xed\xd9\x12\x21\xef\x21\x99\xf3\xdd\x44\xf7\x91\xae" - "\x09\xbe\x1d\x78\x5d\x5c\x1d\x60\xca\x89\x18\x66\xb8\xb4\xbe\xc7" - "\x97\xd8\x97\xe4\xdf\x29\xd5\x1a\x86\xa9\xa7\x79\x68\x3d\x2f\x0e" - "\x9e\xff\x6a\xbc\xb9\x5f\xe0\xc7\x0d\xe7\xea\x79\xfc\x87\x69\x72" - "\xaf\x7b\x31\x59\xd7\x1d\x1c\xde\xa6\x4b\xd1\xc2\xd0\xc6\xfd\x6e" - "\x5a\x23\x65\xab\x98\xe1\xa5\x92\x76\x03\xf1\x25\x4e\xbc\x93\x2e" - "\x97\x90\x7f\x6b\xbe\x22\x5f\x3b\xd7\x8e\xbd\xf4\x45\x07\xdf\x50" - "\xb4\x10\x6b\xde\x36\x92\xfe\x56\xe4\x7d\x78\x79\x76\xff\xa2\xeb" - "\x32\xba\x5e\x22\xbd\xae\xa7\x31\x34\xdf\xde\x51\x72\xcc\x5e\xc4" - "\xfc\xdf\x5d\xaf\xcf\x5f\x3d\x4d\xcd\x78\xdd\x07\xe7\x8b\x23\xda" - "\x41\xe6\xae\x55\x0d\x72\x8e\xef\x9d\x2f\xce\xa8\x27\xb0\x9f\x77" - "\xb0\xbd\xf7\x18\x2d\xcc\x82\xf7\xff\xc2\xbb\x90\x61\xd0\xb7\x21" - "\xf3\x68\x52\x77\xbd\x11\x18\x07\x98\x47\xe1\xf2\x0f\x84\x9f\xfc" - "\x8b\xc2\xcf\xc0\x15\x71\x6b\x25\x0a\x23\x38\x3a\xda\xc8\x4c\x71" - "\xb1\x31\x93\xaf\x4f\xb2\xdc\xfd\xdd\x39\xb3\xcb\x9c\xa5\x0e\xae" - "\x06\x03\x26\x1e\xe9\x37\xf5\x58\xd7\xc3\xdf\x2c\x97\xf4\xc3\x86" - "\x63\xc3\x9e\xa9\xaf\xaf\xe4\x36\xe2\x69\xd5\x84\x1e\x73\xd9\x72" - "\x66\xd8\xd7\xef\x35\x10\x0f\x45\x34\x8c\x27\xf8\x29\x78\xf1\xbd" - "\xef\x1d\x42\x1c\xe0\xe5\xe0\xae\x1e\xb3\xbc\x93\xb4\x2f\x5e\xdd" - "\xd8\x63\x0e\x97\x6f\x64\x54\x3e\xf8\x74\xc3\x4e\x67\x97\xc1\x63" - "\xfc\x2e\xf3\x58\xfd\xec\x10\xde\x87\x1d\x2b\xd4\x49\x32\x61\x2a" - "\x03\x7b\xf0\xda\xb2\x8b\xd8\x9b\x1d\xe2\x7c\xc6\xd0\xc3\xf6\xdd" - "\xdf\x30\x42\x3e\x71\xc6\x9a\x50\xfc\x60\x5f\xe5\x3e\xe0\xff\x47" - "\x93\x35\x3e\x04\x7c\xd2\xbe\x5a\x7d\x3f\xc0\xf7\x07\xe4\x39\xd1" - "\xbe\x5d\x7a\x9a\x61\xc7\xe8\x97\xa4\xeb\xcc\xdd\x34\x0f\xf8\x85" - "\xae\x2e\xb2\xbd\x38\xc2\x5c\x99\x07\x1a\x25\x97\x70\xf3\xd8\x0a" - "\x73\x74\x5c\x45\xea\x93\x2d\xa0\x8d\xc6\x76\x8f\x63\x71\xfe\x47" - "\xa8\xcd\xa4\x6f\xdf\xb6\x0d\x3c\x27\x9d\x0f\x9b\x94\xd4\xa5\xa6" - "\x8a\xd4\x25\xa1\xca\x39\xb7\x11\x0d\x65\x72\xdc\xaf\x98\x82\xf7" - "\x28\xc1\xca\x59\xb7\xed\x90\xbe\x8a\xfc\xae\xf1\xbc\x1d\x79\x8e" - "\x23\x8f\x17\xbf\x4e\xe4\x6b\x39\xc5\x1a\x96\xe2\xd9\x6c\x52\xf8" - "\x0e\x13\x46\x72\x66\xb9\xf0\xdd\x4a\xfb\x73\x0b\x4f\x00\x6f\x37" - "\x20\x64\x70\xa3\xc2\x32\xb8\x86\x75\x18\xb7\xe8\x85\xff\xce\x0f" - "\xa1\xac\xe6\xd0\x05\xb5\x79\x7b\x0f\xe1\x43\xc1\x57\x1d\x05\x0e" - "\x38\x3a\xad\x96\x59\x34\x9d\x69\x43\x4b\xb0\x99\xf6\x61\xb2\x39" - "\xd0\x84\x3a\x0f\xe2\xd7\x68\x2d\x60\x51\x3d\xac\xe1\x53\x5d\xe7" - "\x4a\xd2\x75\xbf\x7f\x58\x93\x03\xb8\x67\x20\xff\xaa\x27\x69\x4e" - "\x74\x19\x82\x28\x1f\xbc\x76\xb3\x27\xaf\x59\xe8\xb0\xd1\x9d\x04" - "\x4a\x83\x3a\x52\x3c\x81\x66\xa6\x72\x8b\x01\xe1\x46\xba\x5f\xc0" - "\x91\xb6\xd5\xd1\xce\x5a\x6d\x01\xec\x9b\x2d\xe0\x3d\x53\x92\xd1" - "\x1e\x51\x1e\xbe\x1f\xdd\x87\xf1\xb5\x82\x67\x40\x79\x6d\xa4\x13" - "\x47\x77\xf7\x79\x51\xca\x4d\xc8\xdf\xc4\x07\x2c\x06\x2a\xbf\x87" - "\xed\x3f\xc9\x7b\x53\x52\x66\x76\x4b\x5f\xa6\x1d\x6c\xff\x41\xb4" - "\xf3\xf1\x88\x76\xce\x47\xfb\x8d\xd8\x2b\xdd\x28\xf3\x20\x5f\x81" - "\x3a\x3b\x51\xa7\xdf\x47\xfa\x9f\xc9\x7c\xa5\xc5\x48\x6d\x6e\xa5" - "\xf6\x3a\x42\x8c\xaf\x4c\x31\xd6\x9c\x63\x46\xac\x05\xf7\x0e\x3c" - "\xd1\xff\x03\xa0\xeb\x93\xfa\x2a\xf7\x0f\xda\x7f\x20\x3a\x12\x61" - "\xaf\x3e\x97\xd6\x23\x0d\xda\xd8\x88\x76\x1d\x1c\xdb\xcd\x48\xb6" - "\x30\x0a\xf3\x74\x14\xea\x1d\x8d\xb1\x6a\x04\xec\x5e\x07\xac\x0f" - "\x52\x9f\xd4\x0b\x6a\x97\x8a\xf2\x6a\x2e\xa0\x4d\x45\x16\x63\x6c" - "\x27\xf9\x79\xef\xe3\x80\xf7\xd1\x74\x47\x1f\x27\x7d\x71\xd2\xbd" - "\x46\x9e\x6d\xe8\xab\xd1\xcb\x7e\x5f\x4a\x7c\xfe\x29\xb6\x7f\x8d" - "\xf4\xc5\xba\x7f\xad\x76\x96\x7c\x54\xca\x77\x1b\x3e\x25\xd8\x53" - "\xbf\x62\x2b\xcc\x55\x9e\x2e\x1f\x8b\xed\x1c\x07\x9a\x65\x3f\xab" - "\x53\x89\x3e\xfd\xfd\x5a\xbd\x9d\x23\xac\xb1\x80\x07\xf8\x45\xbd" - "\xc0\xbb\x88\x7f\x91\x7a\x66\xbf\x3f\x98\xe5\x88\x4a\x03\xaf\x62" - "\x40\x3b\xe9\x1e\xd3\x78\xd0\x68\x77\x93\x1e\x22\xda\x87\x3d\xfb" - "\xf7\xc7\x2f\xe7\x03\x19\xf0\x01\x5d\xf0\x12\xda\xf0\x7b\x21\x4f" - "\x25\x1f\xb1\x52\xc6\xfa\x52\xa2\x6e\x87\x83\x5f\xe0\xa5\xb4\xf7" - "\xa2\xde\xf2\x35\x2b\x44\x1d\xe4\x17\xb7\xcb\x6e\xe5\x27\x9a\xac" - "\xbe\x11\x6d\x1d\x44\xe8\xcf\xf9\x34\x5f\x7b\x42\x97\x60\xa8\xfe" - "\xdc\x4b\xa5\x11\xf2\x1a\xd2\x27\x28\x27\x9d\x09\x69\x2f\xe9\x25" - "\xa1\x13\x98\xee\x90\x76\x61\x3c\x81\x6e\x8d\xef\x78\xe9\x6d\xe1" - "\x7f\x8b\x68\x5a\xa1\x73\x77\x5a\xd3\x93\x7b\x69\x09\xd5\xd1\x74" - "\x89\x8f\xef\xdc\x82\x25\x8f\xe6\xe7\x4a\x11\xe6\xf4\x27\xec\x4b" - "\x7e\x3a\x94\x37\x32\x0a\x5e\xbc\xf2\xa5\xa3\xf2\x4c\xe0\x40\x6c" - "\x04\x8f\x60\x1c\x94\xe9\x1a\xd8\x01\x29\xd7\x3d\x30\x6d\x38\xb9" - "\xee\xfd\x3f\x2d\x58\x56\x28\xea\x10\x2a\x85\xb9\xf2\x56\xe0\x18" - "\xf6\xf0\xbc\xfb\xe7\x4d\x2f\xca\xb5\x0b\xa7\x3a\x52\x88\xba\x24" - "\x27\xa7\x50\x53\x38\x5c\x4a\xb9\xe8\xcb\xe3\x2b\x45\x56\xdb\xcf" - "\xec\x52\x55\xb1\x28\x7f\xc9\x8a\x5c\xad\x88\xc8\xb6\x26\x11\xbe" - "\x6c\xaa\x13\xb2\xaa\x31\x52\x3f\xe2\xc0\xc1\x88\xf3\xd4\x48\xf9" - "\xcd\x75\xf8\x36\x78\xfe\x6f\xbb\x81\xe6\xca\xcb\x4b\x5b\xeb\x85" - "\x2d\x13\xe3\xe1\xdf\x10\x7c\x5f\x9e\x4f\x7e\x20\xb0\xb7\xb5\x91" - "\xdf\x62\x4d\xf7\x00\xf8\xfa\xe5\x29\xe0\xb5\x68\xef\x75\xa4\x87" - "\x54\x0e\x9c\x0a\x3e\xfd\x95\x44\x4d\x26\x12\xa3\x1a\x0e\xcc\x26" - "\xbd\xb1\xed\x42\x7e\xf7\xf2\x9c\xb0\xfc\xee\x15\xd2\xe9\x89\xc1" - "\x78\x77\x52\xdb\xa8\x9d\xf8\xbe\x38\x42\x67\xa7\xd3\x0b\x30\x52" - "\x39\xa4\x5b\x22\x7c\xb4\x80\x26\xd6\xec\x41\x18\x5a\x7f\x43\xfb" - "\xd0\x1f\xd7\x10\xce\x55\x5d\xab\x9a\xe5\x9a\xf9\xc3\x36\xbe\xb1" - "\x38\x7d\xa6\x9f\x25\x4a\x9c\xf1\x32\xf1\xe2\xd7\xa0\x8d\x4d\x88" - "\xcf\x00\xde\x19\x45\xb4\x91\x3c\xa3\x7a\xf9\x4b\x4d\x9e\x47\xf0" - "\x19\x15\xd1\x06\x6f\x58\xe6\xf7\x4a\xa2\x2f\x7e\x55\xf3\x1a\xa9" - "\x93\x23\xf4\x0f\xa4\x0e\xc8\x1f\x8c\x83\x32\x2e\xd4\xad\x9d\xb9" - "\x27\x9e\x42\x7a\xc0\xa2\x59\x3b\x07\xa7\xbe\x67\x50\xbf\xa5\x2e" - "\xe5\x1f\x86\xf0\x3f\xd2\x27\x46\x71\xba\x2a\xf5\x65\xa9\xed\xb9" - "\x82\x8e\x22\xf9\x62\x3f\xc1\xfb\x0f\xc5\xf8\x8e\xbd\xee\x0f\x36" - "\x2f\x7b\x69\xb0\x3d\xd4\x66\xbb\x03\xc4\x00\xf2\xd1\xde\x87\x36" - "\x8d\x46\x9a\xda\x70\x9b\xff\x20\xce\x46\x89\xa7\x94\x34\xc8\x1f" - "\x63\xa4\x9c\x77\x55\x7b\xc4\xb8\x19\x7b\xd8\x1f\xbe\x44\x5b\xdb" - "\x57\x4b\xdd\x97\x51\xba\x4e\x09\xca\x1a\xd2\xff\xb0\x0c\xf6\x40" - "\x81\x94\xc1\xfe\x91\x85\xc7\xf0\x0f\x4d\x34\xef\x49\x6f\x48\xd7" - "\x19\xa2\xf1\x94\xfe\x42\xfe\x98\xa2\x97\xa3\x26\xac\x6a\x24\x3e" - "\xb9\x5a\x9e\x7f\x63\x5c\xfe\xb8\x34\x4a\x39\x21\x68\xa9\x99\x01" - "\x56\x8f\xb8\x68\xc4\x3d\x42\xe9\xa8\x4e\x21\xab\x04\x6c\xa8\x2f" - "\x2a\x78\xac\x28\x4b\x74\x3a\xca\xc3\xbc\xda\x73\x34\x3c\x37\xfe" - "\x98\x26\xf0\xa5\x06\x6b\x5e\x79\x60\x75\x98\x77\xff\xe3\xce\x41" - "\xb9\x1b\xca\x09\xef\x19\x7f\x7c\x9b\x60\x5c\x33\x28\x83\x68\x0c" - "\x8a\x76\xc8\xf3\xd4\x37\x4e\xb1\xc6\x33\x1c\xf4\x05\xed\xb5\xc4" - "\x1f\xd2\xd8\x0b\x7a\x4f\xc8\xcf\x1a\x9f\xdf\x2e\xcf\x2c\x36\xe3" - "\xfd\x05\xd5\x30\xdc\xdc\x69\x4c\x8a\xd4\xef\x95\xf0\x6f\xcc\x51" - "\xa9\x4c\xf4\x9f\xca\xc2\xfe\xa3\xe8\x72\x4d\xad\xdc\x87\x51\xe6" - "\x7f\x9c\xd2\x60\x2d\xce\xf2\x36\x6a\x70\xa0\x31\x16\x30\x6f\xb4" - "\x63\x0e\x08\x9f\x69\x65\xf5\xfc\xcc\x32\x94\x21\x7d\xeb\x36\xd6" - "\x72\x82\xad\x96\xde\x47\xfc\x37\xda\x2e\xef\x44\x62\x2e\x82\x37" - "\xa5\x76\xaa\x1b\x57\xb9\xa9\xed\x74\x8e\x17\x96\xa9\x34\xbe\x4d" - "\x79\x7d\x4f\xcb\x3c\x35\xf2\x9c\x11\x63\xd3\xa8\xf0\x95\x79\x4c" - "\x3b\xdf\xc2\x3c\xff\x43\x1b\xcd\x7b\x2a\xc7\x2f\x78\xe6\x46\xaf" - "\x0a\xb8\x60\x4c\x12\xfa\x2a\x5f\x89\xd5\xc7\x04\xe3\xd1\x7c\x19" - "\x7a\x1b\x63\xf2\xca\x6c\xdd\xb6\x12\xed\x4d\x58\xc3\xe5\x92\x96" - "\x7c\xe5\xa2\xa9\xe2\x6e\x6e\x0a\xde\x76\x1b\xd1\x46\x3b\x0c\x42" - "\x16\xaa\xeb\xaf\x4e\x06\x9c\xce\xea\x77\x01\xd4\xd5\x3f\x6e\x27" - "\xdd\x5f\x4f\x40\xea\xfe\x52\xfc\x83\x7e\xae\xb6\xfa\x43\x74\x17" - "\xa6\x1d\x75\xd4\xe9\x7c\x16\xe1\xb7\xa8\x0a\x05\xb0\x7b\x85\xee" - "\x3f\x1e\xd4\xf0\xda\xe8\xd3\xec\x95\x8f\xb4\xf2\x23\xdb\xb0\x48" - "\x9e\x29\xbe\x12\x90\xb4\xff\x2b\x84\x7b\x6a\x25\xbf\xf6\x8a\x4f" - "\x6f\x37\xbe\x1f\xbc\xb4\x8f\x19\x73\xef\xcf\xb5\xe6\x13\x8a\x4e" - "\xbd\xd5\x61\x4d\x99\x9a\x33\x53\x28\x8b\x5b\xbf\x37\xf7\x4e\x6b" - "\xc6\x5d\x53\x1d\x79\xd3\x1e\x94\x8f\xb9\x19\x0b\xe9\x79\x89\xee" - "\x80\xb5\xaf\xf2\x4f\x19\x43\xf9\xc1\x43\x5a\x1b\xfe\x94\xe7\x55" - "\xbe\x2f\x7c\x30\x71\x73\xd1\x5a\xee\x5a\xd2\x8c\x3d\xb5\x9b\xe8" - "\xe4\xf4\xd0\x67\x9c\x6f\x58\xd2\xcc\xe3\x8b\xd6\xfa\xe2\x8f\x75" - "\xe1\xd7\xe0\x8b\x2f\xb6\xd7\x00\x07\x9a\x2a\x78\xc0\x14\x1c\x2d" - "\x71\x25\xc2\xa0\x49\xba\x40\xf7\xd0\x58\xb2\xf9\xdf\x2c\xe3\xe9" - "\x21\xee\x01\xfd\x03\xb8\xfc\xa9\x59\xdf\xc7\x85\x1c\xd3\x55\xb4" - "\x36\xdd\xc1\x07\x68\xee\x80\x3e\xa0\xfb\xb4\x6b\x49\x96\x89\x74" - "\xe8\xff\xbe\x54\x09\x8b\x3f\x11\x0c\xac\x1a\x7c\x33\xfa\x2a\xff" - "\x1b\xe3\x9f\x2e\x64\xcf\x6a\xa5\x45\xec\x15\xea\xea\x9b\x1f\x02" - "\x2f\xd0\xa0\x97\x89\xb2\x62\x35\x7f\xcc\xa2\x3c\x16\x61\x9b\xe0" - "\x72\x3f\x75\xa3\xbd\x8e\xe4\x56\x74\x2f\xd8\xe4\x50\xc8\xff\x56" - "\xe6\xa0\xac\x0e\xdf\xe2\x2a\xcc\x24\xbf\xcb\x8c\xf3\x2b\xe5\x94" - "\x26\x2c\xd3\x52\xbd\x35\x06\x35\x00\x7a\xc2\x4c\xf3\x43\xd0\xaa" - "\x42\x9f\xe2\xbf\x1b\x07\xcf\xe7\x86\x8c\xfd\x7f\x8b\xf9\x70\xae" - "\xd2\x88\xb9\xfd\xa7\xb4\x1b\x12\x25\xed\xa4\x56\x2a\x4c\xda\x8a" - "\xf8\xef\x17\xc5\xba\xd4\xe6\x23\xe0\xeb\xa3\xb3\x73\x53\x90\xfb" - "\xe8\x9e\x8a\x1a\x85\x39\xc9\x4e\x33\x4f\x69\x5f\x39\xdd\x57\x1f" - "\x9c\x97\x36\xcc\x4b\x1b\xe6\x25\xe9\x39\xa0\x7e\x5f\xd4\xcd\xd9" - "\x58\xb3\xca\x69\xf6\xdf\xa5\xd4\x7e\x82\x0d\xe8\xf7\x58\x15\xb0" - "\x12\xfa\xac\x04\x9f\x84\x15\x49\x74\xcf\x90\xfa\x6a\x0a\xa2\xcf" - "\x91\xfd\x32\xa8\xde\xea\x4a\xf4\xcb\x80\x7e\x39\xce\x08\x59\x10" - "\xdd\xff\x04\x2e\x19\x1f\xf6\xe1\x72\xb0\x2e\xb2\x8f\x2a\xf9\x7d" - "\x12\x7d\x38\xf8\xea\x70\x7d\xe4\x06\xea\x23\xc1\xe0\xe0\x06\xed" - "\x9c\x53\xb4\x93\xf0\x56\x37\x3b\x98\x11\x57\x41\xf7\x2e\x8b\xd6" - "\x82\xee\x9d\x4b\x63\xb8\xbd\x92\xbb\xa8\x9d\xc3\x8d\x17\x95\x27" - "\xcb\x7a\x75\xb1\xa9\xa2\x3c\xbb\xaf\xf2\xd5\x94\xe1\xe1\xfd\xea" - "\xfd\x97\x87\xf7\xab\x93\x28\x3f\xb5\x83\xee\x90\x9a\xc8\xc0\x18" - "\xe6\x37\xe8\x8a\x61\xeb\x8d\xab\xa8\xa7\x76\x0d\xfb\x0d\x73\xbf" - "\xbb\xa6\x70\xe8\x9a\x50\xb7\x07\x18\xc1\x8f\xe4\x45\x52\xae\xff" - "\x6a\xdb\xe0\xf9\x83\xab\xa8\xc1\xa4\x58\xa3\x68\x8d\x09\x9a\x18" - "\xfd\x1d\xae\x5c\x93\xe2\x22\x1b\x85\x73\x81\xab\x86\xfd\x8e\x75" - "\x60\xe5\xab\xbf\x75\x03\xca\xb3\xc7\x55\x28\xdc\x17\xf5\xad\x31" - "\x71\xfe\x60\x32\xc1\x15\x6d\x75\x60\x8d\x9f\x14\x7b\xb7\x90\x95" - "\xbc\x86\xf5\xff\xae\xf0\xbb\xe3\x8b\x2f\xb2\x4b\xbd\xa0\xd7\x72" - "\xbc\xec\x2f\x11\xbe\x50\x5f\xb3\x7b\x95\x6f\xac\x95\x6b\x75\xe2" - "\x73\xd8\xd3\xa6\xa9\x95\x26\x6e\x2d\x31\x71\x94\x35\x56\xe5\x29" - "\x06\xec\x5b\xd3\xc2\x73\x47\xde\x53\xd5\xe7\x0e\xf2\x1f\x18\x7e" - "\x5e\xbc\xf6\xc1\xe5\xe7\xc5\x6b\x2f\x68\x72\xde\x6c\xa9\x7b\xfb" - "\x5a\x50\xe7\x39\xf8\xea\x89\xcf\x59\x9d\x54\xff\x6b\x2e\x59\x37" - "\x60\x12\x4c\x23\x3c\xb3\x10\x70\x2b\xef\xab\x3c\x94\xa2\xe3\x06" - "\x9a\x43\xa6\x10\xf1\x43\x4c\xcc\x73\x7c\x9b\x07\xdc\xa3\x9d\x11" - "\x96\x24\x11\xad\xaa\x56\xfe\xc9\x88\xfd\x6b\x2b\xdd\x3d\xf1\xc7" - "\x17\x61\x2e\x1f\x02\xfe\x33\x2e\xd0\xf0\x5f\x37\xca\xf0\xd5\x4a" - "\x3b\x14\x31\xc2\x67\x20\xd6\x39\xf9\x09\xa4\xb5\x8e\xb8\x44\xb4" - "\x9b\x7c\x06\x82\x47\x38\x54\xaf\xef\xfd\x6a\x65\x1a\xc1\x5b\xc8" - "\x8c\x0d\x44\x0f\x03\x76\x9b\x0c\xea\xae\x0b\x33\x2d\x8c\xfa\x7c" - "\x61\xf5\x84\x5d\x3f\x9f\xc1\x8c\x6f\x59\x1e\x65\xb6\x5b\x59\x62" - "\xc5\xb7\x8d\xec\x6f\xb3\x99\x81\xe0\xe0\x65\x87\x1a\x24\xec\x0e" - "\xf9\xf4\xf1\xf1\xb2\xd7\x32\x69\x3c\xe8\x5c\x26\x3d\xc8\x7b\xe5" - "\xb9\x94\xdb\x8c\x3d\xd0\x22\xbf\xff\x69\xf1\x30\xfb\xc3\x7c\xeb" - "\xd2\x22\x6b\xce\xb2\x95\x05\x53\xa6\x8c\x19\x86\x97\x70\x27\x4b" - "\x5e\xc2\x9d\x19\xc9\x4b\x20\x9c\x87\xf2\x66\x5f\xca\x3b\x2c\xcc" - "\xd2\xcc\x8b\x64\xa5\xb2\xf0\xfb\x2d\x6c\xe1\x2d\x11\xc1\xdb\xd8" - "\xc2\x5b\x6f\xcb\x7a\x28\x77\x49\x4e\x71\x44\xec\xed\x91\x72\xc4" - "\x9a\xe7\x50\x77\xd4\x84\x7b\x81\x3f\x94\x07\x9f\xa6\x7d\xe7\xf5" - "\x07\x9c\x41\xfe\x05\xe6\xee\x6c\xb2\xe9\x75\xc4\x1e\x64\x47\x80" - "\xdf\xf8\x44\xc2\xeb\xa3\xa5\x5d\xdb\x10\x23\x39\x9d\x09\x7d\xf7" - "\x81\xa7\x3b\x2f\xef\x5e\xbc\xfe\x54\xeb\x96\x00\xf0\x44\x71\xa9" - "\xa4\x77\x5e\x9f\x86\xf8\x78\x3c\x1f\x96\x67\x3a\xaf\xff\x08\xfc" - "\x72\x9a\xb0\x61\xb2\x82\x6c\x98\xbc\x2e\x74\xc3\x66\xf8\xcb\x99" - "\xb4\xa5\xe7\xee\x24\x1b\xf7\x5e\xf6\x7a\x2d\xd1\x17\x94\x16\x79" - "\xa6\x5b\x9f\x60\xa9\xf4\x24\x7a\x18\xdf\xa6\xf1\x0d\xc5\xa5\x7c" - "\x6b\x26\xe9\xd4\x24\x23\x7e\x03\xd1\x6d\x51\x96\x98\xd8\xbe\xca" - "\xd7\x5d\x3a\x0d\xe2\x1f\xe1\xee\x17\xc1\x59\xdf\x07\xe3\x80\xbf" - "\xe3\xfc\x26\x9e\x45\x36\x81\x14\x96\x4c\xfb\x83\xc9\x91\x21\xee" - "\x16\xd2\xbe\x48\x38\x61\xbb\xc0\xa5\xaf\x77\xe9\x78\xa1\x5a\xf2" - "\xa3\x63\x28\x3f\xf6\xcf\xb3\x72\xff\x7c\x23\x46\x5f\x0b\x78\x4f" - "\xd4\xe7\xea\x90\xfb\x65\x05\xf6\xdc\xc2\xdc\x1c\xeb\xd4\xa2\x31" - "\x2c\xc2\x03\x6b\x5e\x6e\x81\xb5\x30\xf7\xa9\xe5\xb9\x45\x82\xd1" - "\xa3\xaf\x43\xcf\xdf\x80\x83\xc2\xfe\xb0\x27\x10\x8c\xdf\x28\x26" - "\x5e\xd8\x54\x31\x45\x9c\xa5\xc8\x33\xb0\x9e\x14\xb5\x7a\x6c\x9a" - "\x94\x5b\x9e\x06\x5c\x0f\x4b\x7b\x5c\xae\xe2\x7c\xa2\xe3\x4e\xb1" - "\xc3\xeb\xa5\xae\xcc\x1b\x6f\x6a\xb0\xaa\x45\x3b\x0f\x86\xe9\xb5" - "\x26\x61\x77\x48\xea\xac\xbe\x71\xd4\xcb\xdc\x07\xc2\x34\x48\xd3" - "\x5d\x84\x07\x05\x3e\xfc\x3b\xb8\x50\xa3\x9d\x51\xcf\xe1\x0a\xbe" - "\x82\x77\xd6\xf4\x33\x21\x0f\x24\xdf\x08\x12\xbf\x1e\x4e\xd5\xe1" - "\x08\xfa\xa5\x93\xe4\x0e\x3a\x7f\x94\x1e\xbc\xc8\x9d\xc5\xcc\x40" - "\xb2\x07\xe0\x90\xf2\xbd\x85\x3e\x03\xaf\x7c\xc3\x0a\x5a\x26\x9f" - "\xd2\x6c\xd7\x74\x37\x79\x7c\x71\x1e\xca\x71\x84\xf9\x8e\xa6\x39" - "\x82\x8e\xef\xa7\x79\x73\x38\x29\x8b\xf6\x08\x89\xbb\xaf\xfe\x7b" - "\xed\xe5\x63\xe4\x39\x8a\xc4\x6f\x87\x1b\xb5\x3e\x74\x13\xce\xd2" - "\x74\x7f\x0d\x72\x5e\x37\xcd\xc1\x9c\xcb\xa7\xb1\x00\x9e\x5f\xab" - "\xc3\x8b\xfa\x4b\x6d\x27\xb9\x35\xf0\x70\xf9\xbe\x92\x80\x41\xfa" - "\x2e\x7d\x63\x9a\xe4\x8f\x9a\xac\x91\xe7\x86\x92\x17\x6a\x9a\x15" - "\xb6\x13\xf2\x46\xed\xa5\x38\x62\x59\x01\x5d\x27\xfb\x59\xd6\xca" - "\x25\x3f\xcb\xcd\x5a\x6e\x9b\x66\x5d\x5e\x20\x8e\x6d\x85\x18\xc0" - "\xbe\xfc\xb1\x9f\x59\x09\x8b\x64\xcd\x5b\xb8\x30\xeb\xde\x87\x7f" - "\xf8\xa3\x31\xec\xde\x25\x88\xb3\x2f\xb3\x2e\x4c\x9d\x26\x3f\x3d" - "\x34\x7f\xee\xbf\x64\xcd\x4d\x7f\xf8\xc1\x45\xc3\xe8\xa4\xc7\x62" - "\x4e\x90\x8e\xcf\xa8\x0e\xf6\xd6\x3a\xa9\x83\xd4\xd4\x3c\x54\x07" - "\xa9\xc9\x8b\x1f\xb0\xf3\x9b\x16\xc6\xde\x42\xec\x5b\xeb\xf0\x2b" - "\x97\xf3\xe6\x2a\x33\xda\xef\x0f\xcf\x9b\xb7\xc4\x79\x1b\xc9\x0e" - "\xa4\xec\xf5\x4d\xe0\xbf\x37\x16\x46\x7e\x0b\xe3\x82\x37\x43\x02" - "\x5f\x6a\xf3\x82\xe6\x43\x56\x30\x46\xcc\x0d\x49\xaf\xbc\xb9\x50" - "\x9f\x1b\x35\xf2\x7c\x88\x91\xcc\x8c\xbe\x63\x7e\x27\x92\x7c\x19" - "\x73\x21\x8f\xce\xd6\x29\x9e\xc7\xf7\x24\x6a\xe5\xae\x21\x79\x33" - "\xd1\xb3\xda\x99\x58\xdc\x69\xf6\xe6\xeb\xbc\xb2\x69\x81\xe4\x05" - "\x9b\x8a\xc5\xbc\x59\x3d\xe1\x5e\x71\x06\x29\xee\x13\xbd\xd9\x18" - "\x9e\x3f\x6f\xad\xa3\xb1\x21\xbc\x20\x71\xef\x9b\x47\x2f\x91\xe3" - "\x44\x21\xae\x4b\xb7\x33\x6f\x9f\xc2\x0c\xc6\x29\x2e\x56\x6b\xe0" - "\xe5\x5e\xf6\xe6\x16\xa9\x87\xfa\x56\x8c\x4e\x3f\xe3\x3d\xd1\xcb" - "\x78\xfb\xa5\xf2\xaf\xea\x08\xf9\x97\xd3\xc6\x4f\xb4\xda\x7c\x44" - "\x23\xbb\x3d\x3e\x61\xdf\xf4\xee\x56\x9b\x9f\x74\x4b\xc6\x9c\x62" - "\x6f\x3d\x52\x16\xe2\xfd\x78\x9f\x80\xbe\x89\x3d\x64\xa6\x94\x29" - "\x80\x1f\x7b\x6b\xbd\xe4\x4d\x64\x3c\xc1\x1d\xef\xd4\x46\x23\x8d" - "\x0f\xe6\x65\x17\xc6\x28\x7d\x38\xbc\x17\x57\x61\xd0\xec\x48\xbd" - "\x75\x82\x78\x54\x82\xd5\x33\x06\x35\xef\x99\x4a\xfc\xf0\x24\xdc" - "\x17\xa6\x2f\x79\x40\xc2\xf6\x2d\x6f\x93\xa3\x9b\xf6\xcd\xc0\x48" - "\xb8\x14\xe3\x79\x5c\x1f\xcf\xf4\x90\xef\x6e\x1a\xaf\xbe\xca\x3f" - "\x5b\xf4\xb1\xec\x9d\xf1\x73\x5b\x54\x05\xb3\x1e\xae\xbb\x95\xe2" - "\xb1\xfe\xdf\xda\x22\x74\x7b\x68\x7d\x5d\x92\x17\x78\x38\x4d\xcb" - "\x9f\xa9\xe7\xbf\xd4\x3e\xb1\xb8\xa0\x4b\x42\xae\x3b\xa5\x8e\x8f" - "\xe6\x4e\x7a\x88\x8e\x0f\x9d\x01\x36\xc9\x39\xa9\xcb\xe0\xcc\xb2" - "\x3f\xcd\x3f\x50\x37\x82\xff\xde\x68\x7b\x54\x93\x03\x60\x6d\xff" - "\xf9\xfc\x0c\xc6\xf2\xfd\x2b\x33\x07\x65\x28\x24\xfb\x20\x9b\x83" - "\x68\x87\x37\x42\x46\x36\xa8\xa3\xe9\x65\xcd\x19\xa4\x33\x46\x77" - "\x96\xa9\x1c\x5a\x57\x52\x6e\xd3\x6c\xf6\x00\xf3\xa2\xbc\x02\x71" - "\xfe\x5d\xf9\x67\x71\x57\x92\x78\x6d\xc1\xe7\x97\xf2\x2f\x34\x1d" - "\x26\x41\xbb\xc8\xfb\x78\xcd\xf3\x06\x65\x41\xe2\x6e\xda\x9f\x85" - "\x5e\x36\xe2\x17\x0f\x27\x2f\x04\x7e\xc8\x5b\x52\x90\xb3\xec\xf1" - "\xc7\xff\x3e\x6a\x88\x3c\xe3\x72\x55\xaa\xa0\xb5\x9a\xc1\xff\xee" - "\xcb\x93\xf3\xb4\x19\xf8\xff\x37\x69\x92\x7e\xfb\xf1\x97\x58\x37" - "\x93\x4e\xb3\xb7\x2d\x3a\xfd\x2e\xd7\xd1\xdb\xc9\xbc\xb2\x39\x2f" - "\xbc\x36\x9a\x7d\x5f\x5f\x1b\x6f\x1b\x87\x5f\x1b\x6f\xa7\x60\x9f" - "\x3d\x8e\xef\xc9\xa8\xf3\xb8\xc0\xf9\x34\xde\x92\x06\x77\x9b\x82" - "\x77\x0b\x1a\x3c\xab\x98\x29\x44\x7f\x93\x6c\x9a\xf6\x83\x10\xf8" - "\xda\x10\x70\x44\x56\x90\x99\x69\x2f\xa8\x29\x20\xb9\xe3\x64\x1e" - "\xbc\xc0\xbd\x59\xc5\xc0\x17\x08\x57\x9f\x96\x67\xf0\x3f\x39\x0f" - "\x3e\x04\xef\x35\xa7\x08\x57\xa8\xe4\x0c\x81\xc9\xfd\xfa\xed\x2d" - "\x3a\x8d\x6b\xaa\xb0\x0a\x1b\xd9\xb4\x6f\x87\xa4\x3e\x53\x03\xed" - "\xdd\xa8\xe7\x80\xc0\x41\x21\x13\x9d\x01\xb0\x9a\x27\x50\x2e\xe9" - "\x05\x15\x50\xfb\xa2\x6e\x33\x05\x53\xc5\x59\xc1\x8e\x27\x84\x3e" - "\xd0\x6d\x52\x1f\xe8\x36\xb6\xbd\x80\xe0\xf0\x76\xe0\xb2\xb2\xf1" - "\xf8\x63\x6d\x91\xf1\x8e\xc7\x97\x66\xd9\xf2\x8a\xb3\x48\x17\xf0" - "\x92\xfd\x5d\xae\xa1\xca\x77\x92\x24\x7c\xdf\xc9\x08\xcb\xaa\xa4" - "\x0e\x1f\xe1\xcc\x99\x01\x61\xc3\x56\x3b\xeb\x79\x77\x16\xc1\xbe" - "\xec\x22\x85\x63\x30\xe7\xde\x9d\x4e\x67\x3f\xbd\xa4\x3b\xb3\x23" - "\x93\xb9\x2a\xb9\x9b\x64\x68\x88\x1f\xa7\xdf\xa9\xef\x45\x3c\xd6" - "\x3e\xc5\x5d\x25\xce\x1a\xed\x42\x36\x07\x38\xbd\xe3\xf6\x32\x93" - "\xa6\xeb\x6a\x7b\x8c\xf4\xf3\x84\x4e\xb9\xa0\x33\xde\x39\x23\xef" - "\x68\xbd\xd3\xa9\xc3\x12\xb4\xef\x6c\xba\xd7\x4f\x7a\x3a\xbd\x9c" - "\x74\x02\xdf\x65\x7a\x7e\x2f\x7b\x47\xdc\x31\x7d\xd0\x2f\xde\xf7" - "\xfc\xc4\x1f\x79\x27\xff\x9d\x2d\x12\x6f\xbd\x53\x87\x78\xe0\xca" - "\x77\xca\xd1\xe6\x38\x69\x23\x40\x94\xb3\x40\xd7\x87\x8a\x84\xdb" - "\xdc\x25\x36\x10\xcb\x4b\x1f\x7f\x3c\xb7\xb0\x48\xf7\x29\x9f\xb2" - "\x2c\x3f\xe7\x2e\xed\x0e\x7e\x41\xee\xca\xac\xa5\x39\xe2\x8e\x0f" - "\x62\xe5\xeb\x25\xf0\x9d\x46\xfc\x8d\xd0\x9b\x17\x7d\x6a\x9b\xba" - "\x5d\xa3\xa3\x3a\x58\xcb\x01\xa9\x6f\xd1\xf2\xa4\xdc\xdb\xae\xfe" - "\x4f\xb4\xa3\x4d\xdf\xdb\x48\xc6\xd2\xcb\xee\xb0\xd2\x99\x19\xd9" - "\x65\xa0\xb3\x39\x92\xb3\x20\x0d\xd6\xe8\x3b\x83\x77\xa6\xd7\x23" - "\x9e\xce\x84\xdd\x05\x74\x0e\xdc\x36\x5f\xdd\x50\x94\xc3\x13\xb2" - "\xcd\xc0\x6b\xb1\x34\x76\x74\x56\x24\x7d\x78\xb4\xa4\x11\xbe\x26" - "\x59\xa0\xbb\x80\xf4\x69\x5b\xcc\xa0\x4f\xb0\x5f\xb6\x2d\x00\xaf" - "\x97\xb3\xa6\x84\xc5\x50\x1d\xd8\x0b\xbd\x52\xae\xdc\xb2\xf8\xf5" - "\x52\xc6\xb4\xfd\xd0\xbb\x5e\xc8\x39\x5b\x52\xe4\x9e\x5a\xe4\xd0" - "\xe4\x28\x0e\xa4\x5b\xe3\x65\x37\xfa\x64\x9b\xb3\x67\x8b\x79\x22" - "\x70\x5d\xcb\x2e\xbe\x31\xbb\x59\xe8\x3c\x6f\xcc\x9e\xad\xf2\xbc" - "\x28\x0a\x63\xaf\x19\x83\x71\x6c\xe3\x65\x29\x4c\xd3\x93\x8e\x3a" - "\xc5\x8e\xdc\x42\x72\x60\xcc\x0f\x37\xc1\x02\xe5\xaf\xd1\xca\x5f" - "\x83\xf2\x51\xef\x6d\x9a\xff\xdc\x16\x9f\x5e\x17\xd6\xab\x0f\xfb" - "\x71\x0e\xed\xc9\x68\xff\x62\xfc\xb2\xa5\xcc\x29\x00\xde\x6f\xf2" - "\xa0\xcc\x49\xd2\x7d\x47\x52\xf4\xf5\x42\x75\x6b\x7d\xa0\x39\x40" - "\xf6\x2b\x15\xad\xae\x72\x92\x7f\xe8\x65\x72\x94\xc9\x2f\x74\xd7" - "\x63\xff\x8c\x01\xde\xf0\xc5\x55\x60\x9f\xa4\x3a\x88\x6e\xf7\x4f" - "\xe6\xd8\x47\x43\x59\x21\xa3\xb4\xa1\x51\xcc\xc6\x46\xd2\xec\xa8" - "\x6f\x4b\x98\xce\x44\x19\x17\x80\x9f\x9d\xac\xbc\x93\x1d\xd9\x4f" - "\x75\x93\x9e\x13\x8d\x6b\x3f\xc6\x09\x63\x65\x41\x3d\x0d\xe0\x35" - "\xc6\x02\x0e\x1f\xd0\x78\x91\xee\xc8\xf6\x7e\xc1\x7f\x98\xd0\x36" - "\x63\x07\x3b\xf2\x3a\x8d\x15\x95\x05\x18\x77\x05\xfb\x32\xef\x23" - "\x1b\x76\x04\xeb\x55\xa5\xbc\x8b\xce\x2f\x4f\x31\xcf\x7c\xa2\xcb" - "\xc1\xab\x88\xf7\xb2\x1c\xae\x8a\xb1\x16\xba\xd3\x9e\xf9\xab\xba" - "\xb8\x7a\xb1\x92\xf1\x66\xec\x0f\x17\x0d\x2c\x18\x00\x5f\x8d\x76" - "\x1b\xca\xce\x90\x9d\xbd\x7a\xe0\x9a\xb5\xa4\xb3\x12\x53\x5d\xc2" - "\xcc\x64\xa3\xb0\xcc\xc6\x03\xad\xfe\x3a\xd6\x6a\xab\x63\xef\x04" - "\x6b\x99\x7b\x05\xc9\x69\x3d\xdd\xef\x3a\x6a\xe9\xae\xca\x55\x78" - "\x7f\xd1\xfa\x2f\x54\x57\xeb\x9a\x77\x8f\xbe\x8f\x91\x7b\x9f\x59" - "\xff\x4d\x84\x6b\x5b\x32\xdf\xc1\x6c\x7b\x87\x95\x75\x72\x95\x68" - "\x3c\xe7\x93\x54\xc7\x5a\x94\x55\x4f\xf6\xfc\xcc\x6a\xaf\x65\x0c" - "\xfa\x6f\x4c\x77\x30\x71\x46\xea\x2e\xf8\x13\xb5\x71\xdc\xf6\x73" - "\x2c\xc6\x5d\xf0\x86\x78\x17\x32\x13\xf4\xd7\x93\xd3\x2e\x74\x30" - "\xc9\x96\xa1\xc7\xd1\x45\x77\xbe\xd5\x1a\x6a\x63\x48\xb6\x1b\xf0" - "\x32\xea\xf9\x77\x38\xf5\xfc\xad\x02\x17\x6c\x23\x78\xa0\x4d\x47" - "\x16\x49\x98\xb4\x20\x56\xb6\x19\xf0\xc9\x8c\x84\x4f\xeb\x2c\x82" - "\x0f\xe9\xa4\xab\x2b\xba\xeb\xd1\xb6\x34\xc0\x40\xd5\xeb\xa0\x39" - "\x40\x67\x79\x54\x7e\xf5\x39\x16\xeb\x2e\x20\x9d\x75\xcf\xb3\xa6" - "\x0c\x63\x8c\x7a\xe1\x4c\x43\xcd\x79\x66\xa4\x71\x23\xda\xa1\x46" - "\x7c\x17\x30\x2f\xa5\x31\xf3\xc5\xdb\x32\xf0\x5b\x84\x5f\x26\xcd" - "\x3d\x3c\x17\x63\xbc\xd6\xa2\x0d\x89\x18\xab\x7a\x7a\xca\xf9\xb8" - "\x64\x2d\xd9\x78\xa5\xfd\x19\x73\x25\x1c\xbf\x71\xc9\xcf\x83\x58" - "\x3b\xaa\xe0\x3d\x3d\x89\xea\x86\x55\x0d\x52\x7f\xf9\xdd\x45\xdb" - "\x40\xeb\xd7\x6d\x14\x36\x32\x62\xc1\x9f\x90\xcc\x81\x3d\x27\xee" - "\xd2\xb5\x59\x74\x3c\xfe\xcb\xf1\x64\x7f\xc2\x33\xcf\x20\x74\x29" - "\x8b\x4a\xb5\xb9\x5e\x8a\x34\x73\xbc\x6c\x46\x9e\x5c\x13\x2d\xe2" - "\x0e\x20\xe1\x81\x91\xe8\x2c\xec\x5d\x2d\xa4\xc3\xca\x27\x66\xb2" - "\x58\x85\xfb\x62\xb3\x4d\xdc\x13\x6c\xa2\x39\x14\x2b\xe6\xbe\xfc" - "\x06\xda\xd8\x67\xc2\xde\xd6\x86\x78\xa3\x1e\x4f\x7b\xa8\x0a\x7e" - "\x99\x78\xf5\xf4\x62\x13\x77\x9e\x67\x49\x42\xee\xa5\xc7\x17\xfb" - "\x4c\xad\xd8\xf9\x9d\xc0\xdd\x64\x5b\x87\xf2\x20\x3e\x0a\x7b\xe5" - "\x41\xd4\xeb\x46\xfa\x44\x3d\x3d\xef\xcd\x34\x7a\x1c\x4d\x62\x9d" - "\x91\xfd\x35\xb1\x47\xca\xf8\x51\xe9\x0e\x9f\x49\x8c\x99\x1e\x57" - "\x94\x29\xf6\x66\xb2\xc3\x01\xda\x9b\x8b\xf6\x9c\x12\xf1\x0a\x78" - "\x67\x8a\x37\x47\xc4\x19\xc8\xe6\x09\xd9\xd3\x8c\x88\x8b\x42\x9b" - "\xd9\x60\x18\x75\xd3\x3e\x4d\xeb\x2e\xbd\x98\xce\x00\xe5\xfe\x2c" - "\xea\x2e\xe6\x4c\xda\xe8\x95\x71\x92\x0e\x78\xaf\x3e\x92\x6f\xa7" - "\x73\x17\xaa\x5b\xed\xcd\x34\x84\x7a\x33\xa3\xa8\x7e\x2a\x8b\x64" - "\xae\xe8\x23\xea\xed\x62\x64\x1f\x9e\x6f\x38\x97\xca\xe9\xde\x17" - "\xca\x15\xed\x71\x04\x80\x7b\xce\x35\x0c\xaf\xdf\xf3\x49\x97\xdb" - "\xf9\x6f\x98\xd3\xef\xef\x22\x9c\x12\x32\xdb\xd7\x59\x9f\xa0\x7d" - "\xfa\xfd\x29\x34\xa6\x21\xac\xf3\x50\xbc\x7d\xdd\xcc\x2e\xa6\x38" - "\xb1\x76\xe4\xd9\xe4\xfb\xf7\x10\x9d\x58\xa6\x72\x8e\xf7\x59\x34" - "\x77\x4d\xdd\xa4\x97\x63\x77\x09\x5d\x98\x84\x0f\xbd\x9e\x40\x17" - "\x6b\x29\xff\x98\xb5\x04\x3d\xe5\x07\xcf\xf9\x8c\x52\x27\xc6\x48" - "\xe5\x3e\x4c\xdf\xca\xb0\x5e\xb2\x42\xf5\x23\xf3\xb6\xe0\x97\x00" - "\xbb\xcf\xe4\x5e\xf0\xfe\x2e\x9d\x47\xba\x7c\x1f\xfe\x22\x6c\xa2" - "\x92\xbe\xa8\xba\xf1\x65\xf2\xd7\x55\xc6\xfb\x52\xd8\xcc\x12\x92" - "\x55\xbf\xdf\x1e\xe7\x67\x69\x5a\xb9\x67\x65\xb9\x7f\x61\x97\x2b" - "\x97\xe6\x6d\xcb\x16\xa9\x87\xa2\x26\xbc\xdc\x16\x42\xd9\xa1\x84" - "\x3f\x98\xb1\xd7\x94\x81\x7e\x01\x3d\x72\x74\x3e\xea\x69\x6b\x0d" - "\xb6\x31\xb2\xab\xbc\x5d\xc5\x7e\x7d\xd6\xc2\x34\xfd\x9f\xb2\x1e" - "\xf6\x97\x5b\x54\x9e\x62\x06\xef\x46\xf2\xdf\x32\xc2\xb3\x24\x4f" - "\x77\x86\x58\xb4\xc7\x0e\x2e\x2b\xfe\x93\x2e\x94\x71\xc7\x9b\x24" - "\x6b\x07\xae\x0a\x71\x8b\xe1\xd5\x0b\x5e\x56\x03\xfc\x2d\xec\x83" - "\xae\x9e\xf8\x5c\x5c\x05\xbb\x9b\x1b\x4c\x42\x7f\x4c\xdd\xf0\x41" - "\x17\xc6\x76\xb6\xd4\x37\x2a\x5a\x17\xa1\x6b\x14\x85\xba\x5e\x26" - "\x5d\x23\x6e\x2e\xca\xa8\xa3\x3d\x13\x63\xd6\x57\xf9\x17\xd0\xff" - "\xef\x89\xfd\x6e\x1d\xd1\x45\x02\xcf\x1f\x7d\xc0\x17\xbf\xbf\x81" - "\xca\x20\x3b\x65\xea\x8a\x60\x43\xcd\x57\xcc\x28\xe1\x71\x74\x7a" - "\x6b\x77\x9f\x9b\xbb\xf6\x37\xd0\x3a\xd2\xca\x36\xa1\xec\x10\xdf" - "\xb0\x1f\xb4\xf7\xd1\x85\x72\x6c\xc4\xbb\x85\xbe\x07\x07\xe8\x6e" - "\xe0\x5f\x6a\xeb\xfa\x89\x2e\xfa\x4b\x1a\x68\x5d\x77\xaf\x79\x7f" - "\xc3\x0f\x2d\xe5\xa0\x01\x8e\x66\x7b\xa3\x62\xed\x62\x6f\xd7\x6c" - "\x9d\x8e\x74\xae\xc6\xb7\x5a\xc6\x78\x50\x08\xe8\xf6\xc4\xd3\xec" - "\xd8\x7b\xfd\x95\xcc\x30\x80\xbd\xb5\x1f\xbc\x0f\xdf\x9a\x19\x5b" - "\x3d\x81\xa5\xe2\xdb\x84\xd3\xec\xe8\xcb\x41\x03\x4b\xc4\xcf\xec" - "\x9b\x98\x77\x15\xca\x4d\x23\x99\xee\x91\x73\x74\xce\xfc\x81\xb4" - "\xcb\xf1\x1c\x4b\x56\x51\x1e\xc9\x92\x6b\x26\xb0\x64\x92\x23\x23" - "\x2e\x25\x2b\x24\xcf\x59\x74\x3e\x71\xf5\x04\x36\x6d\x68\xbd\x47" - "\xeb\x24\x9d\x77\x4c\xec\xf1\x2b\x7d\xec\x7a\xdb\x77\x79\x07\xca" - "\x75\xf1\xca\x28\xce\x27\x5a\x0c\x92\x1e\xfc\xa0\xd8\xb4\x45\xce" - "\x3b\x71\xae\x80\xf9\x46\xe7\x36\x9a\xbc\x5a\x11\x36\x5e\x13\x8a" - "\x93\xe8\x6e\x96\x88\x53\xcc\x04\x4b\xb3\x68\x87\x66\x97\x31\xb4" - "\xfa\xe6\x6c\x2a\x83\xda\x93\xb5\x44\xca\xba\xc9\x66\x23\xe0\x2a" - "\xf4\x84\xd7\x3d\xc7\x62\x7f\xf5\x1c\x33\x1f\x79\x5c\xf4\x6b\x97" - "\x5c\x8b\x46\x46\xed\x55\x5d\xb4\xce\x30\x27\xd0\x6e\xaa\x8f\xe6" - "\x46\x6b\xf0\xac\xbb\xcc\xce\x55\xf7\x13\x64\x9f\xe4\x83\x2f\xdd" - "\x85\x7b\x58\x7a\x67\x50\xda\x19\x5b\xcc\x7c\x3b\x50\xde\x8e\x09" - "\xcc\x8c\xb2\xce\x7b\xf2\x09\xd7\x5a\x6e\x70\x17\x1e\x40\xd9\xc7" - "\xae\xa2\xfd\x68\x3d\xe0\x23\xf7\xa5\x63\x07\x3d\x81\x76\x46\x3e" - "\x2e\x1e\xb4\xf1\x10\x95\x83\x34\xf7\x88\xfe\x6e\xb5\x58\xb3\xa4" - "\x5d\x4d\xd1\xd7\xc1\x33\x04\xad\x1f\x9e\x73\xa2\xbc\x45\x9e\x6c" - "\xd0\x9c\x5a\x9f\x74\x58\xcb\xf9\x75\x6c\x83\xbb\x70\x27\xa3\xf1" - "\xa1\xf4\x08\x97\x7b\xba\x91\xf6\xcc\xd0\x71\xa1\x34\xf8\xb6\x1f" - "\xe5\x7e\x27\x7c\x36\x46\x67\x36\xe1\x34\x75\xe8\x0f\x60\xe5\xdf" - "\x0a\x18\x49\x99\xe1\xb1\x49\xd4\x56\x8c\x5d\x92\xc7\xfe\xf1\xf0" - "\x77\x22\xb1\xf6\x31\xef\x2b\x5a\x85\xbc\xec\xc3\xb1\x0f\x06\x55" - "\x2e\xf1\xd9\x87\x6e\xd0\x6e\xd8\xe7\x3e\x74\x13\x2e\x10\xf8\x64" - "\x06\x9d\x67\x7f\xf8\xba\x49\x91\xe3\x4b\x7d\x21\x9a\x69\xb8\x31" - "\x8e\x38\xab\x20\x1d\xc0\xc1\x31\xe6\xe6\x4f\xba\x54\x3a\x83\x22" - "\xdd\xde\x01\x0b\x93\xf3\x8f\xbb\x50\xee\x7e\x8d\x86\x6c\xd3\xf6" - "\xd3\xb6\xde\x78\xfb\x16\xfe\xb4\x85\xe9\x7a\x88\x58\xbf\xb5\x59" - "\x52\x77\xd4\x42\x38\x6a\x87\x41\xae\x1d\x6a\xa3\x96\xb7\x45\x9e" - "\x8d\x7f\x58\x8e\xfc\x2d\xc3\xf6\x37\x6a\x02\xd9\x9f\x2a\x23\x1b" - "\xa2\xe2\xae\x12\x70\x15\xf6\x83\x68\x8f\xbf\x9f\xc9\xf3\xfa\xf6" - "\xbb\x40\xe3\x47\xd3\x3d\x55\xbd\x6d\x57\x76\xae\xd0\xae\xdd\x97" - "\x6b\x5f\xa0\xf3\xd0\xdc\x0c\x18\x57\x9a\x84\xbf\x03\xd0\x5d\xaa" - "\x3f\xfe\x13\xd0\xd9\x3d\x56\xb9\x6e\xda\x6d\x3c\x5e\xe2\xdb\xac" - "\x00\x2b\xa7\x7e\x69\x72\x89\x68\xea\x33\xca\x71\xe9\xe7\xdb\x7a" - "\xd9\x23\xfa\x10\xd1\xfb\x86\x3e\x49\xfb\x06\x9f\x74\x89\xbe\x91" - "\x8d\x1e\xd1\xb7\x8f\xc4\x1d\xc0\x2b\xec\x4f\xbb\x84\xed\x27\x3e" - "\xf7\x04\x2a\xe3\xe3\xe7\xa9\x7d\x34\x26\xc0\x0f\xd7\x9e\x66\x1f" - "\x65\xf3\x31\xbf\x1a\x73\x65\x65\x7e\x34\x4d\x96\xd9\x63\xdd\x04" - "\x1c\x2c\xef\x2c\x92\xce\xce\xc7\xeb\xf9\x86\x1e\x2b\xf1\x30\xbd" - "\xa8\x0f\xf3\x23\x02\x0f\x7d\x6c\xa6\xb1\x9a\xb1\x87\xa5\xc9\x79" - "\xf8\xf1\x28\xe2\x77\xa5\x8f\xa7\x8f\x0e\x60\xde\x4b\xfb\x72\x83" - "\x3a\xab\x8a\xd8\xc7\x22\x71\xec\x15\xb6\x51\xf2\x34\x09\x1f\x00" - "\xfe\x1f\xed\x14\x7a\x49\x68\xef\xca\xa0\x8e\xff\x3e\xda\xc9\x49" - "\xde\xed\xd4\xe4\x9e\x84\xcb\x9c\xd2\x46\x60\x5f\xe5\xc7\xf3\x06" - "\xe5\x9e\x74\xa7\xbb\x92\x37\x53\x3a\x8c\xfd\x59\x4a\x23\x6d\x90" - "\x9d\xd6\xee\x3b\x7f\xfc\x23\xed\x2e\x73\x0a\xe9\x6a\x21\x2f\xf0" - "\x1d\x17\xf2\x56\x82\x01\xd5\x2d\xda\x6e\x20\x19\xe7\xc7\x75\x61" - "\x39\xf3\x47\xc2\x37\x84\xb4\x47\xf0\xf1\x01\x7d\x8e\xa0\xbf\xd1" - "\xd2\xaf\xc7\x47\x93\x0e\x4f\x63\x62\x0e\xf4\x72\xcb\x98\x1b\xeb" - "\x68\x4e\x7e\x7c\x3c\x12\x4e\xe9\x41\xb5\x4c\xe2\xa0\x8f\x9a\xb8" - "\x58\xeb\x1f\x35\xfd\x7d\x7a\xe2\x93\x5b\x74\x5a\x44\xc2\xd9\x0c" - "\xfc\xf2\x69\x50\xc0\xda\xb5\x24\x85\xec\xee\x3e\xed\x24\x3b\xe2" - "\x9f\x7c\x45\xf6\xda\x83\xae\x25\x0b\x42\x65\x16\xb2\x4f\xcb\x54" - "\xd7\x92\xcc\x53\x36\x66\xc8\xb2\x91\x6c\x7d\x7f\x39\xf1\x78\xe0" - "\x59\xc1\xaf\x81\x3e\xc1\x3a\x5f\xb5\x94\x99\x1e\xc9\x23\x19\x43" - "\x4a\x22\xd9\x53\x27\x5b\xea\xe4\x0b\x21\x54\x96\x92\x80\xf7\xf1" - "\xa0\xe7\xcc\xdc\xbc\x64\x36\x9d\xcf\x87\x2a\x39\xf0\xf1\x71\xb2" - "\xe9\x6e\xf0\xf8\x02\x6c\xd5\x19\x16\x43\xf6\xda\x83\x1b\xf6\x6f" - "\x69\xf5\x7f\x2a\xf8\x9b\x38\x1b\x4b\x04\xfd\x41\x77\x00\x2c\x6a" - "\xfc\xfe\x72\xec\xf1\x6b\x64\xbf\xcf\x72\xd9\x6f\xd9\x6e\x6a\xbf" - "\xc4\x71\x8f\x65\x3a\x45\xdb\x3f\xdd\x14\x44\xf9\xaa\x2b\x6f\x51" - "\xc8\x95\x97\x21\xef\xd4\xb7\x30\xa7\x9d\x77\x79\xfc\x2d\xe0\xb9" - "\xce\x0b\xdf\x75\x74\xfe\x4f\x7d\xa4\xfe\x51\xdd\xef\x9e\x3b\x23" - "\x68\xad\x20\xc2\x65\xf9\x5a\x9e\x6e\xe4\xe9\x6e\x61\xfd\xae\x3c" - "\xd1\xf7\x56\xbf\xcc\x9b\x25\xde\x29\x7f\x04\x1c\xb4\x3e\x0f\xc2" - "\x01\x7d\xa7\xfe\x51\xff\x83\x04\x13\xc0\x40\xeb\xab\x65\x40\xeb" - "\x27\xf5\xf1\x1d\xec\x3a\xcf\xa1\x9f\xe8\xab\xe8\xe7\x00\xfa\xd9" - "\x9c\xc7\x58\x60\xe3\x71\x76\x31\x21\x2f\x83\x78\xd4\xb2\xf7\x40" - "\xc3\x97\xba\x18\x78\x51\xe3\x8b\x4e\x97\xe1\x97\xa0\x4d\x9c\x3e" - "\xf0\xa4\x3e\xde\x45\x3a\xbc\x1e\x1b\x7e\xc1\x3a\x46\x34\x8e\x4e" - "\xaf\xa3\x6e\xcb\xbb\xea\x49\xe6\xec\xe2\x5d\xa0\x4d\x03\x9e\x20" - "\xd2\xe4\xa1\xff\xe0\x61\x4f\x69\xed\xa7\xb4\xab\xbe\x92\xfd\x32" - "\xe5\xb3\xc4\x43\xff\xb6\xd6\xe0\x69\x5f\xcb\xf4\xbe\xfc\x04\xe9" - "\xd0\x1f\x0b\xca\x1a\x4b\xfd\x51\xd1\xcf\xad\x68\x67\x20\xa2\x4f" - "\x47\xba\x49\x8f\xf8\x03\x36\x26\x83\x29\xcf\xf5\xa0\x1f\x3d\xcc" - "\xe2\x72\x82\xfe\x7a\x88\xe8\xc5\xe3\x47\xae\xce\x64\xc9\x5e\xf6" - "\xc9\x51\x39\xef\x84\x2d\xe8\x71\xa7\xd9\xa7\xe7\x07\xed\x3d\x93" - "\x0d\xfd\xf8\xfd\x75\x34\x8f\x84\xdd\x67\xda\x33\xfa\x30\x67\xe8" - "\x9c\x7e\x25\xea\xe8\x4b\x19\x2f\xda\x53\x39\x8b\xf4\x84\x63\x11" - "\x26\xdf\x51\x74\x5f\x55\x41\xbe\x2d\x1c\x30\xa3\xf2\x41\xcf\xad" - "\xa1\x27\xc1\x70\x58\x9d\xdb\xbd\x6c\x36\xea\x10\x67\x2c\x0d\x4e" - "\x9f\xe1\xdf\xf7\xb2\x69\x57\x86\x53\xfe\x9a\x3c\x12\xfe\x26\xf9" - "\x2c\x95\x87\xbe\x25\x9c\x66\x9f\x5d\x35\x74\x8d\x59\x05\x2e\x93" - "\x78\xf0\xaf\x6d\x24\xff\xbc\xc2\x7a\x05\x0d\x47\x3a\x16\x57\x98" - "\xef\xa8\xde\x0e\xbc\x8f\x78\xdf\xe2\xca\xe1\xf0\xd9\xb4\x91\xca" - "\x5a\xbf\x59\xe8\x48\x96\x55\x6f\x06\xbe\x00\xad\x70\xd8\x42\x67" - "\x29\xd8\x3b\x77\xfa\x59\xd1\x36\x46\xfe\x67\xc6\x7a\x82\x0f\xb0" - "\xc3\x75\xa9\x6c\xfb\x39\xb2\x19\x97\x92\xf0\xcc\x39\x8c\xa5\x86" - "\x43\x88\x26\x25\x39\x32\x2f\x4a\x31\xd7\x6c\xd6\x69\xf8\xcf\xce" - "\x97\x9e\x67\x06\x6b\x81\x78\xf7\xcf\xb3\xf2\x60\xad\x41\xcd\xab" - "\x23\x3b\xe6\x09\xc7\x52\xc9\x8e\xb9\x6e\x1b\x5c\xd0\x3e\x0e\xac" - "\xb9\x5e\xcb\x98\xf5\x85\x6c\x1a\xf9\x33\x30\xf9\x24\x2d\x27\xf7" - "\x6b\x6f\x32\xda\x67\xd6\xec\x85\x9b\xa5\xbd\xf0\xbf\xe6\x93\xce" - "\xb9\xf6\xfd\xe1\x10\x78\x18\x51\x6e\x21\x4b\xae\x3b\xc7\x52\x88" - "\x0e\xca\x3a\x29\x69\x36\xe2\x0b\x1f\xe8\x36\xf1\xd0\xdf\x52\xd8" - "\xb6\xd3\x61\x7f\x07\xbe\x22\xf2\x91\xc0\x2d\x23\xe9\x4f\xd7\x8c" - "\x17\xfa\x04\xc2\xd6\x2e\x9d\x33\x20\xcc\x6a\x37\x32\xe3\x61\xd2" - "\x4d\xac\x97\xf7\xf0\x0e\x07\xa5\xbe\x6f\x5f\xa5\xb7\x49\xb7\x03" - "\x3f\xe2\x79\xb9\x4b\xf2\x3b\x6a\x34\xf8\x2f\x5f\x9f\x5b\xda\x20" - "\x3d\x11\xeb\x59\xa3\x46\xf0\x38\xde\x33\xf4\x8d\xe2\xc8\xae\x5b" - "\x9a\x80\xe5\x89\x59\xc4\xf7\x68\x3c\xe3\x21\xeb\x60\x9c\xa4\x61" - "\x84\xce\xb5\x45\x9e\xff\x61\x6f\x8a\xeb\xab\x3c\x91\xa1\xef\x67" - "\xb4\xaf\x4b\x5b\xaf\x27\x72\xbc\x51\x71\x7b\x2e\xd3\x3e\xb3\xa6" - "\x23\x4e\x67\x37\x69\x48\x5f\xab\xef\x6f\xe2\x0c\x77\xf5\x84\x7b" - "\x8b\x8a\x59\xd2\x0f\xaf\x8b\x61\x74\xfe\x87\xb4\x5d\x72\xdf\x3d" - "\x71\x30\x7c\x46\x90\x26\xe0\x4d\x36\x0a\x04\x8f\x41\xb6\x3f\xa5" - "\x4f\x83\x6e\xdd\x06\xa8\xdc\x7f\x4f\x7c\x14\x51\x4f\x70\x70\x1f" - "\x45\x1d\xa4\x83\x4e\xe5\x4b\xda\xe4\x44\x83\xb8\x4b\x89\x74\x72" - "\x7f\x3d\x31\x22\xdf\x46\x76\xa8\x08\xbe\xaa\xc6\x4f\x7a\xba\xbf" - "\x90\xf0\x75\xb0\xa8\x99\xb5\xcc\x72\xc8\xe9\x35\xc6\x49\x1b\xdd" - "\xa6\x0e\xd6\xf1\x00\x7d\xa7\xb9\xee\x9e\x41\xf2\xc0\x8e\x17\x3c" - "\xb4\x6f\x0f\x64\xc6\x3e\x48\xbc\xbe\xa0\xc5\x3b\xb6\x4c\x47\x3e" - "\xc4\x25\xbc\xd6\x13\x30\xd6\x94\xb0\x69\xd2\x96\x6a\x87\xb0\xd1" - "\x45\x77\xd6\x6f\x4c\x64\x96\x1b\x6b\x59\x4a\x5f\x65\x87\x1b\xfc" - "\xa5\xd4\xcb\xa5\xfa\x37\x9e\xcb\x20\x7f\x0e\xfb\xfa\xbd\xa3\xe4" - "\x58\x7d\xfe\x08\xc2\x29\xe1\x70\xc7\x45\xed\x7c\xa8\xcd\xcb\x3e" - "\x5f\xbc\xa3\x47\xea\xd2\x0b\xf9\x92\xeb\x58\x5b\x58\xff\xe0\xf3" - "\x47\x64\x5b\x3e\x7f\xe4\xb0\x8d\x91\xec\xfc\xe8\x76\x61\x9b\xfd" - "\xf3\x54\x2f\x3b\x61\xd3\xe4\x31\x6d\x62\x5e\x11\xbd\x5b\x45\x3c" - "\xd8\x17\xee\xf5\x48\x47\xfb\x04\xe8\xa3\x34\x49\xc3\x1f\xeb\x52" - "\x31\x7f\x22\xfa\xff\x36\xc9\x1b\x87\xc5\x89\xcf\x31\x26\xf2\x6c" - "\x38\x66\x15\xfa\x2c\x1b\xce\xed\xc2\x33\x86\x6f\xf8\xb0\x0d\xcf" - "\x58\xc4\x7b\xf1\x34\xe3\xd9\x8e\x67\x22\xbe\xbb\x68\x5e\x82\x87" - "\xb5\x90\x8f\xca\xde\xf8\x63\x96\x91\xee\x45\x11\x6c\x3c\x6b\xfe" - "\x85\x49\x9d\xbd\xce\x34\xf2\x4f\x98\xbe\x8d\xb1\xa2\x20\xef\xb7" - "\x5e\x4f\x3e\x46\x3a\xd3\xca\xb6\xd1\x59\x7a\x67\xe2\xd0\xb3\xf4" - "\xce\x59\xf8\x21\xd4\xd9\x8c\x5f\x00\xbf\xb4\xf0\xef\xe4\xac\xbe" - "\xca\xce\x34\xc0\x51\xd0\x58\x57\x86\x13\x29\x3f\xc6\x81\xf8\xa2" - "\xf8\x97\xdd\xb2\xbf\x3d\x0c\xe1\x18\x1e\x7f\x2e\x4d\xeb\xaf\x0f" - "\x61\xb3\xb5\x0c\xfb\x5a\x3c\x60\x32\x01\x7d\x8e\x3f\xb7\x8b\xfa" - "\x4b\xed\xed\x8d\xff\xb0\x2d\xf2\x4e\x18\x95\x49\xfd\xf7\xc5\x23" - "\x1f\x60\xc9\x67\xfc\xdc\xa6\xc3\x53\x83\x13\xdd\x97\x31\xf4\xa2" - "\x0c\x49\x07\x21\x3d\xca\xd0\xd3\x0f\xc2\x7e\x82\xb0\x4f\xd0\x45" - "\x75\x81\x27\x8e\xd1\xef\x9b\xf5\x55\x9e\x9c\xf6\x7a\x3e\xd3\xec" - "\x79\x74\xa6\xf9\x23\xf2\x92\x4d\x85\xe1\xf2\xa3\xce\x18\x59\xe7" - "\x87\x6d\xa7\x58\xe7\x3d\xb2\xde\x93\xd6\x91\xd6\x92\x73\x0a\xe8" - "\x3b\x50\xbd\x33\x25\xdf\x37\xc7\x93\xe4\x67\x9e\x3a\x15\x7b\xfe" - "\x87\xc0\x47\xdc\x7d\x8a\x9d\x3c\xd1\x1a\xe8\xba\xc2\xfd\xf0\xa4" - "\xb0\x17\xc2\xfb\xcb\x99\xa7\xf4\x56\x71\x9e\xd5\xc3\xbe\x88\xf7" - "\xf8\xc4\x9d\x73\xbc\x9f\x0a\xd1\x77\x3a\x43\xa7\xbd\x01\x3c\xf6" - "\xa0\x9f\x0c\x15\x69\xb7\x53\x3c\xe2\xc8\x26\xc9\x8e\x88\x6f\x7c" - "\xe3\x07\xed\x72\x4d\x9d\x7a\x9b\x68\x0b\xd1\xde\xe0\x7d\x6e\x6a" - "\xb3\xea\xfa\xa0\x9d\xfa\x50\x06\xfe\x8f\x7c\x83\xd2\x9a\xb0\xae" - "\x20\x59\xe1\xa9\xe7\x31\xef\xb8\xba\xe1\x83\xf6\x2b\xeb\xc3\x29" - "\x71\x57\xb2\x2c\xc8\x7b\x7c\xf1\x1f\xb4\x13\x4d\x52\xe3\x1c\x15" - "\x33\xb7\x8e\xbb\x7b\x13\x3e\x04\x8e\x3d\xd5\xfc\xba\x43\x8e\xcd" - "\x15\x96\xdb\xac\xf7\x7d\xbb\xd6\x77\xc4\x89\x33\xaa\x99\x5b\xa4" - "\xff\x10\x2f\xfb\x82\x8d\x28\xb3\xc2\x38\x13\x3d\x80\xbd\xe1\xa2" - "\x84\xc5\x17\x19\x83\x7b\xc3\x15\xb5\xe3\x8b\x11\x6d\xf9\x47\xd4" - "\x31\xa0\xd5\x71\xe0\x7f\x58\xc7\x81\xcb\xd5\x21\xcf\xcf\xbb\xd2" - "\xae\x9c\x77\xec\x12\x76\x75\x80\x3f\x7d\x12\x67\x7e\xb9\x3f\x04" - "\xfe\x2d\x68\xee\x21\xfd\x90\x32\xd2\x95\x25\x5f\x2a\x41\xd7\xcb" - "\xee\x23\x8e\x7e\xe6\x5e\xf1\x3e\xeb\x64\x5d\xc2\x7e\xdf\x11\x3b" - "\xf1\x6c\xe7\xd2\x06\x36\x7e\x98\x31\x60\xf8\xc2\x45\xf0\xde\x86" - "\x71\xd8\x1a\x31\xcf\x5a\xfd\xef\x33\x4f\x36\xc9\x57\xdb\x48\xae" - "\x8d\x35\xdb\xc3\x54\xe0\x06\xd0\xe8\x21\x01\x0f\xd0\x2f\x92\xdf" - "\xfa\xa4\x4b\xf0\x5b\x3e\x61\x33\x79\xac\xf0\x91\x52\xb9\xd7\x4e" - "\xb2\xef\xd0\x40\xa6\xb5\xaf\x92\x65\x90\xef\x14\x92\x3b\x73\x73" - "\x51\x5e\x7a\x30\x8a\x0b\x7e\x0a\xb4\x3f\xf9\x4e\xf1\xf8\xbd\x2c" - "\x04\x3a\xba\xee\x02\x4b\xac\x03\xed\x09\x9c\x6d\x26\xbc\xbe\x43" - "\xf3\x9f\xb2\xfe\x42\xd8\x7f\xca\x76\x92\xf5\xb4\xe3\xfd\x02\x33" - "\x86\x36\x7c\xd2\xb5\xf5\x02\x4b\xde\xb6\x82\xa5\x6c\x25\x59\xde" - "\x97\x92\xf6\x11\xba\xed\xe4\x4b\x65\x59\x0a\x9d\x25\x84\x69\x1f" - "\xb2\x91\x10\xc6\x5b\x46\x21\x03\xb9\x22\x78\x7f\x29\xf6\xc1\xa0" - "\xeb\x98\x35\x68\x3e\xb7\x0b\xb0\xc3\x5e\xd6\xd5\x00\xf8\x4d\x1b" - "\x6e\x6c\x75\x1d\x99\xda\x08\xff\x37\xaf\x27\x4b\xfc\x8e\xb2\xfc" - "\x23\xcd\x89\xd0\xd6\x4c\x36\xb3\x9b\xa5\xca\x73\xfb\xab\xb0\x27" - "\x9e\xce\x24\x9d\x46\xe7\x93\xcc\x12\xda\xba\x58\x29\xfb\x35\x8b" - "\xf2\x04\xd3\x18\xfd\x9c\x5f\xf1\xae\x99\xf9\x2c\x95\xce\x1f\xe8" - "\xac\xc4\xfa\xb4\x48\xff\xcd\xe4\x52\x96\x1a\x59\xf6\x93\xc5\x85" - "\x4b\x6f\x49\xfd\x69\xae\xf5\xf1\xa5\x85\x4f\xae\x5c\x52\x98\xcb" - "\x16\x48\x55\x10\x61\x8e\xbe\x98\xf4\x40\x56\x2e\xb5\xe7\x59\x1f" - "\x5b\x5e\x58\x98\x5b\x60\xb7\x3e\x30\x37\xe3\xeb\x36\x49\xb7\x5a" - "\x76\xd2\x59\x8f\xd4\x0b\xec\xbe\x8a\xff\xc7\xb7\x2e\x54\x93\x7f" - "\xad\x8a\xf9\x8b\x4c\xc1\x05\x56\xe9\xe7\xa8\x7b\x31\xe9\xe2\xf2" - "\xb2\xcc\x2d\x92\x4e\xed\x7e\x44\xd2\xf6\x25\x56\x79\x8f\xae\x5b" - "\xda\x01\xec\x5d\x90\x24\xd7\xd4\xdf\xee\x8a\xb2\x31\x7a\x7f\x92" - "\xde\x4d\x36\xb6\xd6\x3d\x81\xce\xc3\xff\x26\x6c\x34\xf2\xad\x0b" - "\x15\x3d\x9d\x9e\x46\xfb\x2e\xec\x4e\x6f\x27\xbb\xba\x95\xa7\x73" - "\x00\x9f\x84\xbe\xca\xbf\x2d\xf2\x1a\xb3\xdc\x1a\x8d\xd0\x25\x75" - "\x10\xbb\x17\x93\x8d\x4e\xfe\x1f\x13\x2f\x68\xe5\xac\x43\x7d\x57" - "\x23\x2d\x78\xb1\xd3\x31\x9a\xae\xe2\xe4\x0e\xad\x5d\x52\xa7\xe2" - "\xf4\x0a\xa9\x53\xf1\xb7\x9d\x11\x77\xe1\x85\xad\x09\xda\x1b\x35" - "\x9a\xb4\x4f\x2b\xaf\x59\xc7\x09\x48\x7f\x14\x74\xdd\x96\x2b\xc7" - "\x85\x7f\x93\xfc\xcf\x10\xdb\x4b\xdd\xf3\x87\xda\x34\xd1\xe1\x66" - "\xf9\xad\x94\xc5\x4b\xb8\xa2\x0f\x07\x25\x9c\x44\x7c\xd2\x69\x84" - "\x29\x9f\x97\x75\x27\x5d\x3a\xbf\x06\x47\xfc\xfe\x82\xc7\x96\x3d" - "\x69\x5b\x62\x5f\xfa\xe8\xd2\xfc\xa5\xf6\x62\x71\x65\x7f\x9a\xf8" - "\xf7\xbd\xa9\x39\x8b\x2e\xb5\x3f\x9f\x42\x32\x19\xcd\x6e\xb5\x9f" - "\x74\x20\xa4\x5c\xac\xfb\xab\x60\x25\xbb\xfb\xca\xfa\xd9\x2d\xda" - "\x5a\x27\xec\x78\x9c\x61\xde\xa8\xb1\x07\xb5\xf3\x91\x6e\x6d\xac" - "\xc4\xf7\x5e\xf3\x39\x97\x75\x02\x9b\xd3\xc1\x7c\x07\xe8\x5c\x0c" - "\xf0\xf6\xd2\xfe\xb9\xbe\x84\xf6\xb9\x36\x76\x24\x88\xbd\x54\x9c" - "\x95\xf7\x8c\x25\x98\x11\x0d\x09\x18\xed\xec\x60\x67\x96\x0b\x58" - "\x9c\xb5\xec\x14\xb6\x39\xce\x5a\x7e\x4b\x73\x91\xda\xac\xf2\xcc" - "\xad\x9c\x67\x3e\xa7\x9e\xcd\xdb\xca\xcf\xe6\x3d\x17\xb6\x7d\x79" - "\xc6\x8b\xbc\x7b\x90\xf7\x24\xf9\xb6\xaa\xee\x61\x7b\x08\x4f\x52" - "\xd8\x64\x37\x83\x37\x3c\xd6\x4e\xed\xf1\xf8\x52\x99\xbc\xaf\x7f" - "\xc6\xeb\xf1\xdf\xca\x40\x7b\x7a\xc5\xfd\x50\x71\xbe\x07\xfa\x10" - "\xf9\x3c\x68\x97\xc7\xd7\x4f\xb4\x48\xbb\x0a\x1a\xd1\xcb\xce\x98" - "\x81\x2f\x2d\x54\x2e\xf5\x79\x1b\xe6\x24\xe9\x69\xa0\xef\xa0\x63" - "\x4e\xd7\x69\x77\x83\x3b\xd7\x23\x9e\x60\x30\x74\xfc\x7b\xa6\xd0" - "\x38\x02\xc6\xdf\x09\xcf\x81\x1e\x61\x23\x6a\x61\x27\xff\x8c\xbb" - "\x96\x38\xe4\x78\xf7\xdc\xaf\xc5\x9d\x0d\xdb\x0b\xe8\x79\x04\xe1" - "\x01\xfc\x54\xee\x7a\x74\x4b\xc4\xd9\x34\x7d\x13\x36\xbd\x48\xef" - "\xc4\x56\xc2\xae\x47\xfe\x0d\x72\xee\x3d\xfa\x1f\xbe\xb2\xbc\x28" - "\xe4\x09\xd1\xfd\x56\x0d\xbe\xfb\x3d\x6b\x7a\x74\x5d\x0f\xb4\xe9" - "\xec\x0f\xdc\x8f\x07\x99\xf0\x5f\xdf\x19\x14\xfa\x90\x9a\x8d\x08" - "\x45\xad\xec\x26\x7d\x35\xb2\xaf\x16\xbb\x2d\x41\xfa\x7e\xe8\xab" - "\xec\xe9\x1c\xd4\x49\x32\x4b\x9a\x91\xe8\x36\xf2\xe9\x47\xeb\x87" - "\x68\x40\x6a\x13\xad\x1f\x94\x6d\xa6\x73\x6e\xb9\x8e\xce\x26\xfd" - "\xcf\xd6\xd1\x59\x31\xe7\xd1\x6e\xf0\x9c\x65\x7c\xe6\x3a\x96\x2d" - "\xf4\x10\x82\x7e\xba\x97\x6c\xc4\xde\xb3\x58\xe2\x24\xdf\x7a\xa1" - "\xab\xb2\xa2\x9b\xfc\x19\x97\xef\xe8\x67\xb1\xaa\xab\x28\x9b\x68" - "\xf5\x23\xa5\x42\x7f\x23\x06\xf9\x1a\x48\xbf\x83\x74\x0c\xe3\x84" - "\xcf\xc8\xf7\xd9\x8e\xf3\xcc\xd8\xc9\xce\xd6\xd1\x79\x52\x18\xd6" - "\x67\xbf\xa2\xf3\x43\xbe\x31\xdb\x6c\x2a\x35\xac\xa5\x32\xd4\x0b" - "\x67\x66\xeb\xf9\xc8\x37\x39\xe5\xeb\x60\x67\x3f\x10\xf9\x28\xad" - "\xb0\x25\x62\x5e\x8c\x7d\xdb\x4a\xe9\x83\x08\x6f\x57\xcd\x19\x1c" - "\x7b\x4a\x68\x45\xb0\x01\xdf\x16\xa9\xae\x0f\xdb\x10\x97\x29\xce" - "\x31\x06\x2c\x74\xbe\x89\x39\xb7\xbf\xc1\xe3\xfd\xc2\x2d\xda\x43" - "\x77\x95\xed\xd8\x7f\x05\x6f\xe3\xfb\xe6\xf6\x2f\x99\xd1\xf6\x38" - "\x8d\xa7\x4f\xda\x00\xee\x61\xbb\x64\xfb\x7c\xaf\xf6\x6e\xcc\xcb" - "\xe8\xc5\x7c\xf5\x1b\x62\xd8\x61\x0b\xe9\xd8\x9f\x73\x1d\xb6\xf4" - "\x63\x7c\x7c\x6b\x80\x2f\xcb\x25\x5d\xed\x1b\x5c\x9b\x34\x47\xa3" - "\x2c\xe6\x32\x7c\xdf\xa9\xeb\x34\xd1\x3c\x5d\x27\x6c\xbc\x9f\x2d" - "\x25\xb8\x61\x6e\xcf\x3a\x92\x1f\xb6\xb1\xdc\x2b\xef\xf5\x99\x91" - "\x67\xf0\xfe\x6f\xe8\x82\xda\x82\x76\x90\x2d\x1a\x47\x68\x85\x7a" - "\x9c\xce\xdf\x1f\x3c\xaf\x72\xba\xf3\x40\xf7\x57\x88\x77\x4a\x77" - "\xf0\x5e\xe2\x05\xe9\xae\x18\x9d\xbd\xd3\x5d\xfa\xf0\x3a\xf9\x2a" - "\x59\xbf\x53\x4f\x6b\x84\xda\x40\xf7\xc1\xaa\x9f\x10\xeb\x94\x68" - "\x9c\x58\x71\xfe\x10\xf5\xb3\x2f\x1f\xf4\xa3\xcc\x1e\x71\x6e\xd6" - "\xbb\x5d\x2b\x87\x6c\x66\xa1\x8c\x3c\xbd\x0c\x95\xf4\x87\x0b\x85" - "\xfe\x9e\x57\xe6\x97\xba\x46\x0f\xfa\x55\x71\x8f\x87\xf2\x4b\x1d" - "\xa0\xaf\xea\x06\x75\x50\xc5\xdd\x9a\xaf\xf6\xe8\x3a\x66\x78\x1f" - "\xbc\xff\x45\x30\xed\x75\x1d\x6b\xf7\x03\x3f\xf8\x5d\xc7\x2c\xf8" - "\x06\xfc\xff\x65\xdb\x65\xe5\x21\x64\x47\x61\x39\x33\xa8\x09\x45" - "\xeb\xc8\x46\x06\x69\xdb\x4b\xbd\xf7\x73\xb7\x6b\xf6\x32\xa2\x7a" - "\xd8\x57\x5f\x85\xcf\xe1\x43\x9a\x0c\xf9\xdc\x62\xc9\xc3\x9c\x5b" - "\x2c\x64\xc8\x1b\x8f\xb9\xff\xb3\x24\x60\x68\x28\xf1\x1a\xa4\x3e" - "\xde\xb9\x0c\x2f\xeb\x5f\x13\xd6\x05\x3d\x67\xa6\xb2\x86\xa7\x39" - "\x8b\x1d\xb2\xcc\x5e\x61\x3f\x24\x2c\x13\xe8\x15\xf7\x9f\xe8\xcc" - "\x5c\x25\xfa\x31\xe1\xe5\x36\xd2\x91\xf2\xd8\xce\x91\x2c\x39\x5a" - "\xca\x27\x64\x1a\x4d\xcf\xf3\x9a\xd3\x43\xc3\x09\x14\x96\x30\x3b" - "\xe7\xd5\xcf\xa5\xaa\x0d\x2a\xf9\x1f\xe4\x65\xf5\xc0\x97\x36\xbf" - "\xb0\xd3\xe0\x01\x3d\x8a\x3a\xb8\xad\x90\xee\x52\xf6\x8e\x23\xfb" - "\x0d\x72\x6d\xf6\xfe\x42\xb4\xa9\xf2\x6e\x5e\x46\x3c\x99\x8f\x7c" - "\x1d\x9d\x63\x48\x17\x8f\x74\xf7\x34\x95\x76\x93\x8e\xd9\x22\xf2" - "\x63\xdb\xa9\xd5\xed\x8b\x2f\x76\xdc\x18\xcb\xb2\xfb\x2a\x7b\x17" - "\x79\x59\x53\xdd\x95\xe3\x8d\xde\x45\x97\xa3\xcf\x25\xbd\x98\xc6" - "\x46\xe2\xf1\x49\x86\x33\x03\xf5\x3f\xc0\xa9\xfd\xfe\x7b\x82\x86" - "\x00\x1b\x30\x8c\xe6\xdf\x2a\x77\xb0\x60\xe5\x68\x1e\x2a\xc1\x78" - "\xf5\x5a\xc0\x03\xb6\xb0\x56\xa9\x77\x43\xba\x03\x26\xa7\x9f\x9f" - "\xf3\x04\x0f\xd0\x19\x02\xd1\xef\xc0\x5b\xfe\x3b\x3c\xc1\x57\x19" - "\xe9\x77\x13\xbe\xe9\x60\xfe\xa9\xd4\xae\x19\xb6\x72\x36\xbd\x87" - "\xbe\xf7\x76\xca\x3d\xdf\x9f\xa6\x3d\xcd\x64\x1f\x38\xb2\x4d\xdf" - "\x5b\x5e\xf0\x18\x19\x99\x9e\xbe\x30\x77\x45\x6e\xbe\xf5\x21\x32" - "\x41\x7d\xa9\xde\x68\xd8\xcf\xe1\xf9\x58\xda\x5f\x89\x7e\x27\x7f" - "\x87\x97\xf3\x75\xa8\xfb\x39\xc4\x9a\x4b\x26\x99\xf7\xff\xa5\xaf" - "\x43\x9d\x3e\x27\x3f\x87\xe1\xf3\x9f\xf3\x2d\x83\x6b\x40\x3d\xd4" - "\x47\x61\xb1\xa7\x57\xfa\x17\xd2\x3a\x92\xfb\xcb\xf9\x79\x91\xb6" - "\x8a\x24\x7d\xb6\xbf\x01\xf1\x8b\xf5\x3b\xaf\x98\x8b\xb1\x08\xe7" - "\x87\xef\xd8\x9c\x77\x60\xbc\x1b\xe5\xfa\x15\x69\xd7\xea\x7a\x12" - "\x9a\x4f\x7b\xa1\xd7\xa1\x56\xdd\x5e\x2a\x65\x93\xe7\xd7\x6f\x57" - "\x47\xc7\xc8\x73\xb1\xf3\x07\xf4\x3b\x5c\x72\x6d\x1e\xd2\xd6\xe6" - "\xf9\x96\xcb\xe9\xb2\x84\xd7\xc6\x85\x98\xf0\xba\xfe\x4c\xcb\x7b" - "\x21\xe6\xef\xe9\xc1\x68\x3c\xe2\xb8\xd3\x2c\x30\x89\xe4\x95\xf2" - "\xce\x76\x40\xd8\x17\x92\xf6\x38\xfa\x4e\x68\xef\xa8\xa3\xef\x6d" - "\xed\x7d\x22\xde\xf7\x6b\xef\xa0\x17\xfb\x9e\xd5\xde\xb1\x66\xfb" - "\x2a\xb4\xf7\x44\xbc\x2f\xd5\xde\xb1\x77\xf4\xfd\x40\x7b\x1f\x8f" - "\xf7\x3b\xb4\xf7\xeb\xf0\x3e\x45\x7b\xc7\x1a\xec\x13\x67\x06\x68" - "\x7b\x0c\xda\x7e\xfe\xca\x79\xd6\x0b\x6e\x79\x6e\xdd\xc7\x40\x0f" - "\xd6\xca\xbd\x67\x30\x2e\x11\x73\x3a\x47\x87\x2f\xe2\x1b\xa9\x1e" - "\xc4\x4f\xf3\x32\x6f\x5b\x44\xbc\x66\xbf\xad\x6f\x9e\x97\x7d\xe5" - "\x8d\x88\xaf\xd3\xe2\x17\x83\xe7\xf6\x47\xc4\xbb\xb4\x78\x3b\xf0" - "\x62\x5e\x44\xfc\x1a\x2d\x7e\x9d\x97\x7d\x62\x8c\x88\x77\x68\xf1" - "\x3b\x75\x1d\x1e\x2d\x3e\x5f\x8b\x3f\xe8\x65\xef\x1f\x88\x88\xcf" - "\xd6\xe2\x81\xff\xcf\xb7\x47\xc4\x0b\xbc\x22\x6d\xb2\x9b\xf8\xe1" - "\x52\x5a\x5b\x7d\x01\x2f\x6b\xdf\x19\x91\x66\x81\xcc\x1b\x30\x7b" - "\xd9\x87\x2d\x11\xf1\x73\xb4\xf8\x14\xaf\xf2\x8d\xc8\x32\x53\x47" - "\xc2\x55\xca\x16\x96\x3d\x92\x5c\x9f\x78\x20\xa1\xcb\x2c\xe8\xec" - "\x8b\xb9\x74\x27\xcc\xb4\x8d\x77\x58\x9d\x9c\x77\xb0\x8b\x0b\x35" - "\xdd\xdd\x0c\xd2\xa3\x94\xf7\xeb\x2e\xce\xd2\x6c\x2b\xf8\xc4\x9d" - "\xbb\x12\x8a\x0b\xbc\x22\xe4\x33\x8e\x72\x69\x2f\x5c\xf7\x3d\x43" - "\xf2\x2d\xed\xec\x1f\x69\xc8\x56\x2c\xe9\x82\x77\x93\x0c\xdc\x63" - "\xef\x97\xb6\xe4\xc1\x07\x53\x1c\xc9\x79\x08\x1e\x91\xf2\x2c\x89" - "\xf7\x2f\xe6\xaa\xfd\x74\xaf\x55\xca\xc2\x68\x2d\x52\x7a\xd2\x57" - "\x8b\x4c\xeb\x65\x17\x85\x5d\x8a\x28\x4b\xfc\xb1\xbe\xca\x8b\xf3" - "\xc2\xf7\x89\x02\x75\x5a\xfc\x07\x88\x5f\x1c\x11\xbf\x76\x64\xdc" - "\x0e\x7c\x67\xce\xce\x1c\xb8\xc0\xfd\xc1\x0b\x3c\x50\xfd\x57\xb4" - "\xfb\x71\xa1\x23\x78\x7d\xc8\x95\x9d\x47\xf7\x6d\xc8\x47\x6c\x70" - "\x05\xf7\x91\x4e\x24\xe2\xaf\x7e\xd0\xef\x03\x8d\xd1\xc7\xd7\x3f" - "\x4a\xfa\xaf\xe7\x19\x9d\xcd\x96\x75\x93\xbf\x41\x13\xa7\x7b\xdc" - "\xab\xce\xb0\x58\xba\x8f\xb3\xfd\x71\xfa\xfe\x29\x7b\x20\xcf\xc7" - "\x8e\xe4\x85\xd8\x76\x94\xbd\xed\x51\x9d\xbe\xb8\x18\x0c\xdf\x15" - "\xce\xa6\xb3\xec\xeb\xcb\x84\x4f\xec\x7e\x61\xab\xdc\x54\x41\x3a" - "\x05\xe7\x1a\xf9\x1b\x44\x1b\x7f\xe0\x35\x55\x30\x2b\xf6\xf6\xd9" - "\x78\x6f\x93\x3f\x7c\x43\xfc\x48\x7d\x92\x6b\xb9\xdf\x2e\x71\x4d" - "\x76\xbb\xc4\x17\xfd\x76\xfe\x1b\xba\x7f\xd2\xef\x00\xbe\x69\x04" - "\x1d\xde\x38\x5c\xfe\x55\xdb\x98\x61\x60\x23\x68\x93\x9e\x46\x83" - "\xc4\x4f\x03\x39\xaa\x21\xa6\x82\x64\xed\xc2\x1f\xee\xc6\xa2\xba" - "\x3d\x05\x01\xc3\x91\x92\x4e\xf6\xf4\x75\xcc\xb2\x38\x60\x40\x9a" - "\xfe\x93\x71\x76\xb2\x69\x7e\xcc\x0d\x7a\xd6\xf0\x12\xbe\xbf\x56" - "\xd0\x68\x08\x0a\x7a\x65\x20\x47\xc8\x67\x5d\x45\x36\xda\x43\x3c" - "\xed\x21\xa2\xc5\x63\x41\x8b\x67\x03\xff\xc7\x84\x56\xe6\x25\x04" - "\x8b\xf2\xae\xde\x56\xc8\x62\x43\x45\x29\x89\xcf\x5c\x60\xb3\xf5" - "\xfd\x67\xdb\x0a\xec\x29\x7d\x96\x31\x35\xd8\x53\x48\xee\x13\xa7" - "\x98\xc5\x39\x34\xbd\xab\x86\xbf\x9a\xb7\xaf\xb8\xbc\x6f\xef\xd0" - "\xca\x14\x61\x6f\x82\xda\x32\x5c\x5f\xd7\x3d\xc7\x8c\x21\xed\x5e" - "\xaa\xf3\x24\x1b\x0f\xfa\xd9\x10\x77\x9e\xbb\x4f\xe7\x33\x03\xf9" - "\x43\x76\xe6\x0a\xd9\xea\xa8\x23\x79\x41\xe6\x71\x7c\xcc\x9c\x85" - "\x34\x46\x03\xaf\x10\x9d\x46\xfa\xcc\x48\x6f\x3e\xcd\x06\xde\x36" - "\x05\xb0\x67\x04\x40\x93\x3f\x41\x7c\xf1\xc0\xa7\xd2\xbe\x45\xd0" - "\x4a\xf7\x48\xdd\x85\xf7\x52\xdc\xc5\xb2\x93\x42\x6f\x68\x91\x5c" - "\x5b\x03\x47\x29\x5c\x46\xf7\x64\x13\x1c\x75\x7b\xfb\x03\xa3\xa4" - "\xfc\x6e\xe0\x03\x6d\x7f\x68\x90\xbc\xdd\xc0\xd1\x91\xe6\xae\xea" - "\xca\x71\x70\xf2\x05\x59\x47\xf4\x2b\xf7\x8a\x33\x7e\xb2\x19\xe0" - "\xb8\xdb\xcd\x81\xee\xa4\x2d\xa3\xe0\xb3\xea\x86\x1c\x87\xb4\x21" - "\x19\x94\x77\xf3\x85\xbc\x3f\x67\xad\x3c\xdf\xc8\xd9\x22\xe5\xfd" - "\x39\x24\x2f\x07\xfe\x09\x6e\xe9\x8d\xcf\x01\x7d\x1b\xcc\xef\x4d" - "\x58\x35\xec\xfc\x92\xfb\xd1\x92\x5d\xd6\xeb\x59\x22\x9d\x33\x65" - "\x85\xa4\x2d\x56\xb9\x86\x43\x75\x7c\x83\xf8\x36\xb9\xc3\xc6\xa2" - "\xa4\xbd\xe3\xe0\x97\x33\xeb\x98\x15\x6d\x1d\xcb\xcd\x39\x99\x42" - "\xef\xd1\x95\x93\xe7\xe9\x26\x3f\x55\x21\x26\xcf\x03\x43\xbb\x78" - "\x7c\x4e\xa6\x4c\x1f\xba\xa3\xb5\x1b\x7d\x30\xe7\xa4\x78\x02\x67" - "\x34\x9a\x30\x84\xb9\x9f\x93\xc2\x5d\x39\xb3\xe5\x7d\xf3\xd0\x2f" - "\x74\xbc\x2a\xe7\x68\x68\x95\x84\xdb\x92\x5d\x12\x6e\xa1\x5d\xda" - "\x7e\x35\x99\xde\xb1\x77\xa7\x4a\xfd\x95\x90\x5d\xa7\x91\xbd\x5a" - "\x1a\xca\x83\x77\xcd\xce\x67\xa8\x16\x7d\x9f\xa6\x7d\x9f\x4d\x71" - "\xe8\x1f\xf6\xac\x60\x1b\xf5\x6b\x24\xdc\x2a\x60\x51\xca\xa2\xd0" - "\xe6\x05\xa4\xeb\x4d\x74\x8a\xc7\x7f\xb7\xdb\x23\xc6\x80\xdf\x42" - "\xba\xfd\x54\x0f\xd9\x1b\x22\xbc\x89\x32\x8d\x54\x5e\xb8\xfd\xea" - "\x38\xbd\x2d\x54\x1f\x7d\x43\x5f\x53\x04\x5f\x8d\x3e\x53\x1a\x1a" - "\xd7\x53\x36\x92\xfb\x9d\x07\xcc\x48\x87\x8e\xa7\x11\x4c\x24\xcc" - "\x78\x92\xc6\xd3\x6b\xe3\xc0\xe3\x87\xc2\x43\x86\x55\x33\x70\x43" - "\x21\xe9\x52\xf1\x34\x0d\x7e\x9a\x8f\x15\x55\xd8\xa2\x95\xdf\xd4" - "\xe7\x23\xf2\x4e\x1a\x4c\x8b\x76\x13\x6d\x44\x7a\x09\x74\x4e\x25" - "\xe7\xab\xda\x16\x91\xaf\x2d\xeb\x2b\xa2\x91\xb3\x53\x56\x6f\x16" - "\x3e\x2b\x53\xfb\x2a\xd5\xce\x30\xbc\x65\x39\xc3\xd4\x71\xbd\x5e" - "\x87\x97\xa9\x3b\xf5\x76\xe2\x5d\xdb\x83\x79\x4a\x78\x4c\xd4\x05" - "\x7a\x3e\x92\xe9\x60\x8c\xfc\xe4\x3f\x76\x04\xbf\x18\x8a\x07\x50" - "\x69\x0d\xde\xed\x16\xf3\x91\xf1\x7a\x92\x5d\x02\xae\x0b\xe4\x1c" - "\xe2\x6b\xe4\x5e\xc8\xeb\xa9\x4c\x3a\x6b\x94\xf6\x46\xf9\x16\x94" - "\xab\xdd\x59\xe2\x7b\xb4\x36\x80\xff\x0b\xee\xbc\x94\xaf\xbb\x77" - "\x49\x8e\x35\xe3\x16\x71\xe7\x76\xfa\x72\x1b\x5d\xa7\xcd\x09\x07" - "\x86\xd2\xdc\xe6\xb0\x8d\x33\xf2\x45\xad\xd9\x38\x73\x15\xd7\x09" - "\xf8\x2b\x6c\x1e\xbf\xc0\x6b\xe9\xee\x08\x5f\xc1\xb7\x54\x63\x0c" - "\xcb\xce\xb3\x6b\xc9\x2f\xb6\xd3\xc6\xbf\x20\xfb\x77\xc0\x97\x07" - "\x81\x3f\x48\x9f\x7e\x34\xe9\x25\x11\xfe\x21\xbd\x67\x1e\x8f\xf8" - "\x0d\x45\xee\xc1\x7b\x78\x8a\x71\x0e\xdd\x1d\xe5\x65\x99\xa0\xa5" - "\x8b\x8e\xd2\x7c\x20\x1d\xf5\x53\x8a\x31\x09\xe9\x8e\xe2\x9b\x7d" - "\xbd\x90\x25\xd8\x2d\x21\x73\xb1\xbd\xec\x0c\x8b\x16\x3e\x0e\x1d" - "\x01\x92\xa9\x19\x3a\x14\xf6\x3c\x8f\xb7\x5b\x10\x1f\x27\xe2\x03" - "\xa8\x7b\x83\xdd\x82\x6f\x71\xf8\x76\x02\x4f\x15\x65\x38\xaa\xd1" - "\x6e\xe7\x19\x76\x3d\xda\xd2\xc5\x5d\x76\x0b\xda\x79\xaa\xec\x49" - "\x36\xbe\xd5\xd6\x45\xfc\x1d\xca\xf3\x4a\xdf\x8d\xc8\xdb\xa1\x28" - "\xb7\xa3\x5f\x0e\x92\x89\xe0\x59\xba\x1e\x4f\x67\x88\xc5\x39\x57" - "\x61\xdf\x5b\x85\xfa\xe9\x5e\x2b\xca\x21\x1b\x24\xb2\x2d\xe8\x1b" - "\xc9\xd5\x50\xee\xaa\x6e\x7e\x0a\x65\x77\x1d\xe9\x46\x79\x8e\xf6" - "\xc1\x32\x35\x9a\x7a\x32\xfa\x3b\x8e\x6f\x5c\x15\x40\x9b\xb6\x90" - "\xee\x36\xe2\xcc\x88\x33\x0f\xd2\xc3\x8a\x31\x5e\x7b\xbf\x6a\x30" - "\x6d\x59\x26\x73\x5e\x64\x42\x87\xda\xba\x32\x8a\x75\x28\x51\xf5" - "\x64\x07\x2b\x5c\xa6\x61\x12\x95\xb7\x0e\xe5\x95\xe5\xb2\xab\x80" - "\xab\x63\xd0\x46\xf2\x11\x7d\x42\xc0\x89\xd6\x98\x62\x48\x42\x5f" - "\x5c\xd4\x27\x15\x63\xb7\x1e\xeb\x01\xfd\x51\xd0\x9f\xab\x56\x85" - "\x06\xef\xea\x52\x9f\xe2\x89\x9f\xa3\x7e\xc9\x71\xb4\xcf\x42\xbf" - "\xe6\xac\xca\xe3\x27\xd0\xb7\xae\x23\x79\xed\x0c\x7b\x8f\xa9\xd5" - "\xd6\x46\x77\x28\x4e\x48\xb8\x75\x91\x0e\xea\x2c\xf4\x73\xce\xa0" - "\xad\x5e\x25\xea\x59\xbe\xd1\xc9\xd0\xae\x75\x5a\x3f\x29\xae\x76" - "\x90\xa6\x57\xa2\x36\x69\xef\x63\x06\xd3\x7e\xbd\x9f\x31\x11\xfd" - "\x44\x7e\xe3\x5d\x54\x9e\xd6\xcf\x31\xe8\xe7\x55\x5f\xef\x27\xe6" - "\xd3\x0a\xbe\x46\xeb\xe7\x5a\xad\x9f\x06\xf4\x73\x0c\xfa\x39\x21" - "\xa2\x9f\x09\x97\xf4\x73\x36\xfa\x99\x86\x7e\x76\x44\xf4\xd3\x3c" - "\x4c\x3f\x67\x7b\xa9\x8e\x0d\xf6\x34\x69\x1f\x8c\x37\x8a\xfb\xef" - "\x55\x51\x83\xf7\xdf\x55\xba\x77\x79\x41\xd8\x20\x3a\x40\xf2\x1b" - "\x92\x1b\x11\xaf\x47\x77\x3c\xb3\x8a\xd7\x96\x0b\xd9\xcd\x78\x29" - "\x9b\x16\xf4\x55\x55\xd4\xe2\xc1\xbb\x1b\x9b\x85\xef\x1a\x3f\xc5" - "\x0b\x9b\x01\x85\x4c\xc8\x1e\xd3\x8b\x57\x96\x51\x7e\xca\x8b\xf4" - "\xeb\x06\xef\x98\x29\x06\x9b\x94\x87\x3a\x19\xbd\x93\x2d\x2c\x79" - "\x26\xc0\x9b\xc5\x99\x40\x55\x54\xd8\xff\xd3\x0a\xde\x44\x70\x11" - "\xf7\x59\xc5\x7d\x50\xb6\x36\x2b\xb8\x56\xbf\x97\xde\x8d\xb4\x9d" - "\x11\xf7\xd2\xbb\x45\x1b\xfa\x85\xed\x87\x95\xe9\xc1\x95\xe2\x7e" - "\x7a\x5f\x95\x31\x26\x5c\xb7\x22\xe5\x2f\x98\xa3\xf4\xee\x93\xb6" - "\xd9\x48\xc6\x66\x15\xfa\x36\x55\xc6\x59\xba\x8e\x8b\x57\x61\x36" - "\x5a\xcb\xc3\xfa\x79\xa9\x32\x2e\x1e\x62\x0b\x4a\x19\x45\x76\xde" - "\x29\xde\x3e\x78\xd7\xbc\xca\x58\xfe\xf7\xee\x9a\x97\xf9\x30\x4e" - "\x58\x6f\x36\xf2\x79\xae\x18\xc1\xe3\x16\xdb\x85\xaf\x14\x65\xd4" - "\x24\x6a\x67\x87\x62\xa4\xfd\xc3\x24\xce\x83\x14\xe3\xa7\x1a\x6e" - "\x6e\x4e\x0f\x05\x4d\x5e\xd4\x29\x6c\x4b\x0d\x86\x8d\x47\xc9\x56" - "\x06\xf2\x8e\x15\x76\xce\x51\xde\xd0\xf4\xe2\x7b\xf9\x25\xe1\xb4" - "\x4b\xc2\x56\x3f\x70\xd6\x48\xba\x3c\xeb\x27\x08\x19\xaf\x2d\xae" - "\x82\xd9\xca\xbe\x64\x51\x98\x8b\x27\xa9\x6d\xad\x5d\xe2\x9e\x9f" - "\x89\x57\xa6\x32\x4f\x57\x50\xd2\xed\xa0\x97\x3a\x92\x91\xe6\x4b" - "\x36\x9e\xee\x99\x90\x2f\x19\xa4\x3f\x2d\xfc\xc7\x28\xd1\x2f\x2f" - "\x5e\x3e\x86\xa9\x3f\xcd\xbc\x9a\x1b\x4a\x1a\x48\x97\xe0\xc5\x7e" - "\x2f\xf9\x60\x51\x9c\xcf\xb2\x24\xc2\x53\x98\xc3\x9d\xdc\xf0\x74" - "\x03\xf2\x74\xff\x67\x7f\xd7\x28\x4f\xf0\x63\x66\x03\xfe\x3c\xad" - "\x44\xef\x32\x96\x32\x63\xcd\x29\x66\xc6\x3c\x0b\x1e\x0e\xce\x66" - "\xba\xad\x87\xba\x04\x69\x43\xa0\x0e\x73\xb2\xc8\xc2\x03\x7d\x55" - "\xd1\x46\xf0\xb5\xe5\xba\xfc\x62\x9d\xb4\xf5\x66\x44\xfd\x4f\x09" - "\xbb\x14\x92\x3e\x00\x6c\xa3\xef\x91\xf7\x4c\x13\x7f\x8a\x3c\xb3" - "\x07\x79\x1b\x25\xba\x49\xc2\xb0\x78\x8b\xdc\x47\xa2\x9b\x0e\x83" - "\x3b\x5a\x23\x75\xa2\x12\x91\x36\x67\x50\x27\x8a\x64\x82\xf8\x8e" - "\x31\xdc\x22\xf9\x9e\xe2\x2d\x59\xa1\x18\x6d\x8d\x53\x7c\x76\x0a" - "\xe5\x45\x3e\x93\xf0\x73\x59\x15\x5d\x1f\x9e\x6b\xd1\x79\xb4\x9f" - "\xa2\x4f\xb1\x18\xd7\xe3\xd4\x2f\x82\x89\x9f\xec\xba\x29\xa3\xbc" - "\x87\x77\x8e\xe0\x07\xc9\x9c\xdd\x1e\x14\xf2\xa5\x63\x8d\x98\x4f" - "\x67\x30\x06\xd7\x90\x6d\x2b\x0f\xea\x39\xb2\xbd\x9f\x1d\xb1\xf4" - "\xb2\x56\xbc\xd3\xdd\x07\xf7\x13\x9f\xb3\x4e\xeb\xf0\x7b\x39\xe8" - "\x81\x4c\xb4\x39\x8f\xca\x22\x5c\x43\xfa\xa2\x64\x83\xb0\xd5\x87" - "\xb2\x3a\x99\x28\xe3\x88\xda\xc5\x8e\x38\x88\x87\x3d\xd7\xd8\xba" - "\xfd\x63\xd6\x6a\xf9\x8b\xa8\x87\xe8\x6d\x77\x61\xef\xe5\xca\x76" - "\xa0\xec\xb5\x5a\xd9\xdd\x28\x3b\x71\xe4\xb2\x3f\xf0\x5e\x61\xd9" - "\x57\xd0\xee\x0f\xda\xae\xa4\xec\xb2\x2d\x3c\x04\x3c\x3c\x16\x7b" - "\x7c\x36\xd9\x67\xa5\x3b\xae\xa1\x0b\x64\x93\x66\xb2\xe0\xd5\x4f" - "\x29\x31\xdb\x08\xdf\x08\xfd\x90\x0d\x45\x8b\xc5\xfd\x57\x92\xb3" - "\x6b\xf7\x5e\x3d\xc1\x93\x8c\xe4\xee\x7d\x55\x31\x6b\xc3\xbc\xe8" - "\xe0\xd9\xb8\xd9\xab\xc4\xec\x91\xba\xd6\x45\x8b\xe5\xdc\x8a\x59" - "\x42\x65\x0d\xcf\x73\xda\xd7\x09\x9d\x7d\x25\xe6\xa4\x2e\xdf\xea" - "\x8d\xb7\xaf\xd3\xca\xb2\x5e\x2a\x37\xd5\x0c\x09\x59\x73\x1d\x76" - "\xeb\xca\xc2\xa5\xf6\x5c\xfd\x82\xf6\x18\xf6\x50\xee\x63\xb9\x4b" - "\x57\xe4\xe6\x58\x17\x2d\x2f\x2c\x98\xbe\xec\xf1\xc7\xad\x0f\xe4" - "\x16\x15\x2d\xf9\x69\xee\x18\xb6\xa8\x70\x49\x41\xd1\x52\x92\x6d" - "\x5a\xad\xf3\x6e\xcb\xca\x5b\x66\x9f\xfe\xdd\x79\xa9\x97\xc8\x36" - "\xe9\xbe\xf6\x71\xe2\x71\xb0\x3f\x8d\x07\x8d\x11\x4f\x76\x89\x4c" - "\xc5\xdc\xfd\x34\xf8\x6b\xcc\xc1\xd3\xb4\x17\xd2\xfe\x43\xbc\x17" - "\xd9\x37\x26\x9b\xc9\x5b\x37\xf3\xb6\x53\xca\xc4\x6d\xa0\xdb\xdb" - "\x11\x47\xf7\x9e\x8f\xf3\xfe\x32\x9f\x38\xcf\x56\x26\x16\x23\x4d" - "\xd3\xaf\x10\xe7\x8b\x2f\xde\x52\xf3\x57\x66\x94\x34\xc6\x55\x01" - "\x6e\x18\xcd\xd7\x91\xad\xe1\xcf\x2d\x4c\xb3\x91\x6e\xf0\x78\x03" - "\xa4\x43\x14\x93\x1e\x2c\xe3\x84\x53\xe5\xfa\xba\xea\xa2\x84\x4b" - "\x8e\x43\xdc\x65\x50\x26\xfe\x88\x78\xc4\xd5\xe4\x77\xb1\x6a\x0c" - "\xf0\xff\x80\x2d\x8c\xab\xaf\xd1\x69\x73\xd2\xf1\x59\xd9\x81\xb0" - "\xb0\xb5\x12\x3d\x66\xd6\x10\xfd\x30\x25\x36\x91\x29\xd7\x96\xca" - "\x1f\xf2\x28\xd7\xae\x95\x3f\x7a\x8f\xfc\x4d\x9c\x23\x7f\x97\xc6" - "\xff\x6f\x7f\x7a\xfd\xff\xe3\x32\x02\x7f\xe7\xf7\x0f\xd4\x2f\xfa" - "\xfd\xff\x63\xff\xff\x37\xf9\xb1\x18\x2e\xf3\xa3\xf9\x86\xb9\x75" - "\xfc\x57\x7f\x65\x31\x98\x9f\xb5\xeb\x1f\xc5\x9c\xfe\x94\x59\x4a" - "\x83\xbc\xb3\xec\x11\x96\xe4\xfc\x12\x34\x18\x68\x2d\xbb\x83\x77" - "\x3a\x2f\xf0\x13\x98\x37\xef\x61\xfe\x36\x56\x77\xb0\xd8\xf5\x1d" - "\xa0\xb3\xec\xd2\xf7\x0c\x9d\x37\xd1\x3d\x2f\x0f\xc2\x2d\x2b\x02" - "\xec\x5d\xdf\x57\xa4\x53\xe9\x6e\xcd\x06\xee\x39\xce\x18\xcd\xdf" - "\xd8\x6c\x96\x58\x37\x9e\x1f\xe4\x95\x7b\x73\xb8\x61\xef\x22\xc4" - "\x1d\xdd\xa7\xa6\x8d\xda\x57\xd2\x3c\xca\xfa\x28\xed\xf3\xb1\xaf" - "\x68\x73\xf3\x1e\x71\x8f\x11\x4f\x9a\x83\x9a\x8d\x69\xec\x4f\xd7" - "\xbc\x2a\xf7\xf4\x6b\xd6\x6b\xf2\x3c\x7a\x17\xf7\x37\xd0\x8f\x46" - "\x5e\x59\xd2\x40\x65\xee\x55\x1b\x47\xd1\x9e\xb9\xaf\x24\x6d\x54" - "\xe9\x12\x66\x68\xf5\x9e\x66\x87\x81\x0b\xe9\x7c\x1c\xeb\x6e\x0f" - "\xd6\x59\xc3\xb6\xf1\xdc\x85\xf6\xad\x03\x3d\xb7\x16\x6d\xda\xd5" - "\x57\x35\x36\xc5\xab\x8c\xb6\x68\xb4\x9c\x1b\xeb\x62\xcf\x7a\xa4" - "\x49\x5f\xce\x26\xaf\x47\x3a\xd0\x76\x6b\x89\x47\x91\xed\x8b\x9f" - "\x02\x18\x1c\x40\x9d\x6d\xd6\x9f\x50\x38\x4e\xd0\x18\x54\x37\xfa" - "\x61\xed\x50\xe2\x04\xcf\x4f\x75\xe8\xf5\xa2\xfc\xb5\x28\xbf\x4d" - "\x3b\x63\x74\xc9\x72\xc6\x1e\x90\xeb\xb5\x88\xec\x33\x1c\xd7\xee" - "\x89\x75\xae\x2f\xc1\xbe\xde\xcf\xc8\x0e\x6e\x2d\xea\x70\x9b\x2a" - "\x18\x37\xd1\x1d\xe3\xe3\x41\xf0\x35\xaa\xd4\xdf\x55\xe2\x9e\xd5" - "\xf2\x0a\x3a\x44\xd0\x1e\x21\xd0\xf7\x42\x3e\x03\xfa\x23\x0f\x78" - "\x02\x34\x87\xb8\x9f\x01\x7a\x83\xe2\x51\x47\x2d\xfa\xd5\x06\xbe" - "\xf9\x00\xf6\x6e\xba\x23\x1e\xf3\x93\xf3\xdf\x67\x74\xc6\x41\xf4" - "\x42\x91\x83\x07\x84\x5f\xa9\xaa\xb8\x59\x3a\xbd\x40\xf3\x83\x68" - "\x84\xf5\x3f\x61\xc6\x01\x8c\x31\xe6\x48\x33\xe8\x0f\xd0\xf4\x71" - "\x36\x6d\x6c\x9a\x05\x5d\xa0\xf9\x91\x96\x38\x3c\x6e\x15\xf6\xf7" - "\x58\xd4\xd1\xec\x55\x26\x0a\x58\x48\x1c\x14\xb7\x4e\xdf\xeb\x49" - "\xe6\xe0\x45\x19\x1c\xb8\x0e\x70\x3b\x30\x2d\x5b\x01\x1d\x3c\xf6" - "\x28\xc6\xe2\x00\xa5\x45\x7e\x23\xd2\x1f\xc4\xbe\x3f\x47\x1b\x93" - "\xe3\xe0\x09\x40\x07\xc4\xcd\xa3\x76\x20\x4f\x0b\x60\x8d\xba\xcc" - "\x7e\x0d\x8f\x1d\x95\x34\x8c\xf9\x53\x1d\xf6\x18\xeb\x35\x61\xf8" - "\x9b\x62\x22\xe1\x0f\x58\x48\xbe\x5c\x31\xff\x22\x62\xec\xc0\x97" - "\x9a\xb3\x49\x0e\x8d\xfa\x0e\x0a\x19\x9a\x62\xba\x87\x6c\xbf\x61" - "\xce\x1c\x04\x2c\x0e\x22\x5d\x23\xe1\xe6\xd5\x7f\x05\xce\x7d\x94" - "\x68\x28\xf3\xfd\x92\x46\x35\x75\xd1\x1c\x3e\xa5\x98\xde\xa3\x70" - "\xa7\x12\xb7\x80\xca\x43\xf8\x15\x3c\x41\xcb\x9a\xf6\x97\xd5\x91" - "\x7f\x63\x7b\x2a\xd9\x66\x93\x63\x6d\x4f\x45\xbb\xea\xf5\x3b\x50" - "\x34\x07\x68\xec\xd1\x47\x21\x7f\xf0\x2a\xa6\x7a\x92\x35\x8a\x7c" - "\x03\x79\xd4\xc6\xe3\xb4\x3e\xf5\xef\x88\xef\x22\x9b\xb9\x11\xb0" - "\x59\xa0\x8d\x49\xa3\xf0\x15\xaa\x98\xef\x91\x6d\x33\x27\x21\x1c" - "\x83\x36\x88\x73\x88\xde\x81\xbc\xa8\x1a\xca\xe3\x0c\xe7\xa1\xf5" - "\x83\xb9\x6c\x42\x9e\x3b\xf0\xe4\x7a\x5a\xb2\x9b\x8f\x76\xb8\x9f" - "\x21\xdb\x65\x8a\xa9\xbd\x77\x20\xc5\x80\x7a\x03\xa8\xd7\x40\x73" - "\x83\xe6\x85\x5e\x46\x8d\x84\xd1\x1e\x8c\x9f\x98\x5f\x87\x83\x8d" - "\x80\xbb\x19\xf4\x7f\x20\x53\xd2\x77\x26\xb7\xd6\x3e\xb7\x38\x1f" - "\x8c\x8e\xf1\x6d\x97\x76\x86\x28\xdd\xa0\xff\xd7\x30\x9d\x69\x22" - "\x3b\x43\x31\x28\xab\x45\x9b\x13\x26\xa4\x6b\x1b\x9c\x43\x64\xef" - "\x40\x31\x67\x10\xad\xa9\xb5\x9f\xe6\xde\xfd\x12\x76\x71\x3e\x9a" - "\x03\xa0\xe3\xb7\xc8\x71\x8e\x5b\x40\xb4\xaa\x9c\x87\xf1\x89\x7a" - "\x19\xc2\x66\x02\xe0\xac\xa2\x0c\x7d\xae\x44\xe2\x06\xa4\x4d\x03" - "\x5d\x3a\x38\x6f\x74\x5c\x20\xcb\x4c\x28\xd6\xe8\x90\x46\x8c\x0d" - "\xd9\x6b\x77\x0b\x3b\x58\x62\x5e\x26\x2c\x3c\xec\x0f\x12\x7e\x3d" - "\x8a\x76\x01\x27\xc4\xbf\xd0\x9b\xe0\x8c\x09\xcf\xed\xf8\x2d\xfa" - "\xdc\x8e\x18\x57\x31\xb7\xd7\x08\x7c\x14\xdf\xe8\x65\xf7\x75\xea" - "\x73\x9f\xd6\xb9\x8a\x75\x5d\xb3\x42\x9c\x0f\x98\x48\x1e\x28\xd6" - "\x7d\xa0\x5b\xf0\x18\x34\x9e\xad\x8e\x4e\x61\x23\x7f\xb5\xca\x62" - "\x5a\xfd\x27\x49\x3e\x72\x9a\xd6\xbf\xbe\xc6\x69\x6c\x50\x97\x9b" - "\xfc\x18\xac\x01\x0e\xa4\x35\xe8\x47\x9b\xf0\x2d\x86\x6c\xc2\x35" - "\x2d\x4e\x63\x45\x18\xdb\xc3\xd9\x34\x6e\x09\xb3\xf5\x3b\x17\x35" - "\x12\x07\xc4\x6a\xf3\x45\xb4\xf1\x12\xb8\x9a\x24\x5c\x13\xf2\x87" - "\xae\x6f\x73\x2c\xad\xef\x48\xb8\x12\x4c\x09\xb6\x48\x8b\xfe\x8f" - "\xb6\xeb\x70\x0d\xc3\xf4\x9a\xab\xb4\xf9\xa8\xe1\xd6\x84\x61\x71" - "\x6b\x8d\xf4\x19\xd1\xb8\x9a\xfa\x82\x3d\x85\xea\x17\xfe\xb0\x34" - "\xde\xa7\xc9\x47\x73\x2a\x21\xe8\x65\xa5\x69\x3a\x1e\x43\x7b\x16" - "\xd1\x7c\xa2\xb1\xd2\x71\x07\xc9\xca\x64\xdb\xaf\x49\xd1\xc7\x83" - "\xda\x1d\x89\x13\xd0\x26\xa1\xef\x15\xee\xf3\x35\x3f\x42\xbe\x04" - "\xc2\x6d\x61\xfa\xea\x9a\xbc\xa1\x7d\xbf\x26\x83\xfa\x4e\x73\xc2" - "\xb6\x82\xe4\x65\x72\x2f\xf3\x2a\xb1\xc7\x87\xe2\xab\xd8\xf7\x84" - "\x5e\x86\x46\x8f\x11\xbe\xb7\xfd\x44\xa6\xa7\xfd\x0d\xe9\x85\x6c" - "\x5e\xdb\x0f\xd3\x68\xff\x43\x5c\xb3\x06\x83\xe3\x48\xdf\x44\xf7" - "\xb8\xc9\x96\xcf\xd5\xc7\x25\x2f\x08\x1c\x7d\x90\x7c\x67\x20\xdd" - "\xda\x56\xf0\x01\xc1\x68\xc6\xea\x34\x7a\x93\xf0\x04\x5f\x99\x79" - "\xf5\xca\x2e\x76\x95\xed\xbb\xfc\xf3\x53\x4a\xe2\xbf\x63\x1d\x05" - "\xc8\x5e\x26\xca\xb6\x9e\x52\xae\xcd\x45\xbd\x89\xda\xd3\x82\xe7" - "\x03\x78\x5e\x87\xe7\xed\x78\x4e\xc4\x73\x12\xd2\xab\x5a\xfa\x54" - "\x84\x47\x21\xfe\x36\xed\x89\x36\x26\xd2\x79\x76\xc6\xaf\x88\xae" - "\xfc\x09\xc5\x8f\xff\x88\xc2\x78\xbe\xad\xf5\xbb\x45\xae\xed\xc4" - "\x17\x50\x8e\x83\xd2\xd1\xbe\x86\x38\x1b\xd2\xac\xa7\xb2\xc9\xae" - "\x02\xde\xef\x89\xa0\x4f\x51\xce\xb8\x27\xf1\x9c\x85\xe7\x2d\x78" - "\xda\x91\x9f\xec\x79\x66\x00\x06\x6d\x61\x7c\x11\xb7\x20\xc7\x21" - "\xc7\x13\x63\xd8\x44\xeb\x5d\xc7\x07\x34\x9f\x86\xa4\x5b\x2c\xd3" - "\x49\xfe\x75\x5c\xb2\x3e\x76\x41\x31\x76\xa6\xf6\x20\xc6\x0e\xe5" - "\xdf\x43\xf9\xf1\x9c\xab\x3d\xd3\xb4\xe7\x7c\xed\x79\x9f\xf6\x9c" - "\xa7\x3d\x17\x78\x95\x44\xbf\x46\x9b\x00\x66\x89\x42\x4e\x8e\xb5" - "\xab\xd5\x3b\x3e\x85\xf8\x6b\xe0\xff\xdb\xc9\x8f\x23\xea\xad\xd3" - "\xe5\xd6\x24\xfb\x19\xa8\xba\xea\xea\xad\x42\xf6\x33\xee\x40\x04" - "\x2e\xcc\x8b\x55\xd2\x18\x68\xa7\xe8\x3a\x03\xe8\x06\x59\x4e\xac" - "\x41\x3b\xaf\x27\x7f\x30\xe4\x57\x93\xec\x14\x0a\x3e\x2a\xbe\x27" - "\x85\xd6\xab\x90\xe9\x6f\x20\x1b\x45\xc5\xf9\xf8\x39\xc0\x53\x94" - "\xea\xf8\x9e\xf8\x25\xc9\xe7\x8f\xfe\x4b\x5f\xd5\x78\x6b\x98\xcf" - "\x1f\xd7\x26\xcf\x36\xaf\x7d\x0a\xf1\x11\xfc\xff\xb8\x75\xd4\x66" - "\xc0\xba\x1d\xfd\x99\xd5\xa1\x8c\xcf\xc6\xf3\xd6\x4e\xd9\xe7\x54" - "\xbd\xcf\xda\x58\xd9\x74\x98\x77\x2a\x89\x41\xe0\xc3\x42\x9a\xdf" - "\x1d\x83\x78\x39\x31\x48\x4f\x6d\xfe\x60\x9c\x13\x5f\xa4\xf1\x8e" - "\xc0\x27\x69\x61\x3c\x3d\xfe\xe0\xd0\x71\x89\x3b\x18\x94\xf4\x42" - "\x3b\xd6\x25\xcd\x81\x35\x97\xac\xcb\x0c\x5a\x97\x5a\xde\xc0\x50" - "\x1c\x7f\x4d\x06\xe1\x78\xad\x8d\x98\xb7\x89\x39\x34\x36\x5e\x65" - "\x7c\xbb\xb6\x27\xb5\x63\x8f\xbc\x1d\xf1\x0b\x65\x3b\x65\xbc\x56" - "\x17\xe6\x5f\xe2\x3c\x9a\xff\x7a\xbc\x36\xbf\xa9\x9c\x39\x34\xd6" - "\x7a\xbc\x56\x3e\xe6\x69\xe2\x2c\x5a\x3f\x7a\xbc\x9c\x93\xf1\xeb" - "\x08\xdf\x50\xde\xa0\xd0\x65\x04\xff\xfd\x93\x26\xb4\xfb\xda\x46" - "\xd0\x17\xf5\xb4\x9e\x57\x97\xb0\xd8\x95\x5b\xd8\x58\xb9\x36\xaf" - "\xfd\x48\xcf\x2b\x64\xfa\x55\xd7\xb6\xe8\x38\xaa\x46\xe0\xb3\x84" - "\xb4\xa1\xb8\x72\xc2\x52\x5e\x69\x0a\x06\xcd\xc5\x39\x47\x82\xb3" - "\x04\xce\xc5\xba\xaf\xeb\xab\xb2\x18\xbd\x6c\xaf\x59\xdb\x4b\x5a" - "\x04\xad\xa6\x58\xee\x38\x52\x2f\x71\x97\x2c\xdb\x32\x88\xff\x22" - "\xe8\x10\x81\xeb\xa9\x2e\x2a\x0b\xfb\x8a\xd9\x5f\x96\x79\xb5\xc4" - "\xdf\x96\x4c\x2f\xbb\x21\x51\xc7\xad\xb4\x3f\x99\x14\x66\xab\xfe" - "\x89\xdc\x9f\x54\x92\x81\xd9\xfc\xc2\x3e\x5d\xab\xad\x9b\xd1\xbe" - "\x49\xf6\xbf\xb3\x8a\xc7\x90\xcd\xaa\x4c\xb4\xf5\x01\xd0\x67\x3b" - "\xb5\xb3\x19\xf0\xb9\xd7\x85\x88\x97\xd5\xe0\x8a\xf5\x74\xdd\x09" - "\x6d\x5c\x8e\xa3\x3d\x3b\x09\xb7\xaf\x5e\x21\x7d\x2a\x91\x3c\x48" - "\xf8\xf8\x22\x9a\xd5\xc2\x03\xc2\x97\x41\x95\xa5\x2b\x42\xc6\x55" - "\x2f\xd7\xc9\xb5\x47\x84\x8f\x0a\x57\x71\x8e\x94\x27\x5e\xb7\x5c" - "\xc6\x5f\x97\x29\xf5\x10\x8a\xf3\xb4\xf0\xbc\x28\xcb\xf8\x0f\x85" - "\xfc\x35\xfa\xaa\x9b\x24\x3d\x72\xdd\xec\x08\x9d\x1f\x01\x6b\x61" - "\xe7\xb8\xea\xba\x8c\xf0\xba\xb8\x2e\x99\xf2\x20\xef\x69\xc4\xe7" - "\xe9\xf1\x72\xaf\x89\x9b\xa3\xc9\xcc\xf2\xae\xae\x48\x63\xc0\xcd" - "\xd1\x5b\x2b\xf5\xf5\x7b\x5d\xb3\xac\x5f\xae\x5f\xea\x23\xcd\x07" - "\x5a\xc3\x41\x61\x57\xac\x27\x85\xd6\x32\xde\xf3\x83\xfa\xda\x95" - "\xf4\x9d\xb8\x73\x26\xd7\xed\x75\xed\x11\xed\x70\x69\x73\xf5\x78" - "\xef\x63\x96\x58\x7c\xf3\x7b\x95\x18\x79\x96\xa5\x58\x24\x8f\xb1" - "\x61\xc9\x2e\xf5\x02\x0f\x90\x6c\x9a\xe4\x09\x24\xb3\xd1\xf4\x55" - "\xe9\xac\xc4\x4f\xb6\xd2\x5c\x58\x0f\x61\xfb\x68\x66\xa6\xdb\x47" - "\xeb\xab\x9a\x30\x2f\x2c\x3b\xb6\xec\xd4\xfa\x95\x83\xfa\xea\xdc" - "\xce\x37\x68\x2e\x6d\x92\x6b\xcc\x52\x4b\xf3\xd8\x83\xb9\x87\xfd" - "\x67\xcb\xe1\x52\x91\xb7\x5c\x9f\x7b\x58\xa3\x39\xa7\x94\x89\xf1" - "\xb5\xe3\xf9\x16\x8c\x29\xe1\xd7\x7c\xcc\x83\x10\x9e\x39\xf2\xa9" - "\x98\xe9\xa9\xcd\xf9\x2d\xc8\x8b\xf5\x3f\xa5\x51\x1f\x03\x7f\xfc" - "\xb1\x54\x31\xc7\x9c\xa4\xdf\x98\x2a\xce\xfa\x69\x8e\xd1\xfc\x12" - "\x67\xfe\x98\x6b\xa6\x8a\xef\x33\x9a\x67\xc2\x66\x0a\xc2\xd4\x5e" - "\x9a\x67\x7d\x55\x13\x63\x74\x9b\xc7\x5e\x65\x82\x3c\x6f\xab\x9a" - "\x98\xa4\xeb\x86\xd3\x3c\xb4\x4f\x61\xe3\x50\xbe\xb5\xc9\xea\x27" - "\xd9\xf9\x67\x9e\xe0\x7c\x46\x69\x09\x76\x12\x5f\x5e\xdb\x84\x3c" - "\x11\xe3\x1f\x27\x74\x59\x0f\x2f\x16\xf2\xcc\x6b\xf0\x2d\x7f\x28" - "\xce\xb9\x2a\x20\xe8\x4a\x60\xc7\x1b\x13\x19\x9d\xd3\x63\xaf\x99" - "\xe8\xd2\xe9\xe1\x99\x88\x43\x1a\x6a\x1f\xf1\xe0\x6d\x78\x77\xd1" - "\x3e\x3d\x82\xdc\x79\x16\xc9\x8a\x08\x67\x90\xec\x89\xe4\x60\x80" - "\xf5\xd1\x53\xca\xe4\xf8\x23\x64\xbf\x68\xd9\xd7\xed\x5e\x3b\x1d" - "\xfc\x3c\xd9\xd3\xb2\x16\xb2\x6b\x3a\x94\xeb\xfd\x24\x77\x2a\xfb" - "\x8a\x64\x3c\x49\x96\xa1\x32\x9e\xa4\x3c\xed\x57\x8a\x9f\x37\xfc" - "\x9b\x64\xd3\xde\xbb\x2f\xff\x9b\xb4\x56\xa6\x9d\x54\x8b\x5f\xbd" - "\x84\x95\x05\x6b\x25\xa9\x54\x87\x15\xe1\x14\xc2\xb1\xa4\x67\x43" - "\xeb\x5c\x09\x32\xb2\x97\x84\x71\x42\xbb\x57\xdf\xfc\x90\xbb\x84" - "\x78\xda\x24\xe1\xbb\x80\xec\x17\x5f\x91\xae\x97\x92\x24\xc6\x53" - "\xd8\x97\x55\x92\x6c\xa8\x3b\xb1\xa6\x87\x19\x6d\x85\x6c\x12\xc9" - "\xd0\x4d\x21\xee\x26\x1e\x98\xe6\x04\x60\xd0\x76\x5a\x99\xf4\x94" - "\x7d\x15\x33\xe0\xfb\x64\xbc\x67\xeb\xb4\x14\xf2\x98\xa3\x02\x2c" - "\x91\x68\xa8\xb9\xab\xd8\xe4\xbe\xaa\x49\x73\xf4\xb1\x22\x3a\x83" - "\xe4\x78\x83\xfe\xae\x94\x24\xa1\x0b\x40\xb6\xfc\xbd\x04\x37\x1d" - "\x57\xf5\x90\xec\x7a\x52\x4a\x94\x9f\x99\xe5\x3e\x34\xa9\x1c\xe3" - "\x9a\x26\xe7\xcb\xa4\x79\x98\xfb\x47\x23\xda\xf9\xbd\x88\xf7\x2a" - "\xca\x6f\xf2\x13\x0d\x37\x12\x7c\x26\x1d\xd1\xe1\x53\x23\x6c\x80" - "\x32\x9b\x18\xef\x20\xef\x46\xdb\x5a\x6c\x25\x2c\xe6\xb4\x72\xfd" - "\xab\xe8\x23\xdd\x0d\x6e\x96\x32\xfe\xeb\xf7\xeb\x7c\xba\x6c\xf7" - "\xf5\xab\x4c\x15\x51\x8c\x64\xf3\x64\x33\x52\xe8\x62\x9e\xb5\x08" - "\x79\xbc\x27\x38\x87\xb9\x9d\x77\x52\x9a\xfb\xb5\xbd\xec\x78\x6f" - "\x99\x85\x1d\xb6\xcc\xc1\x3a\xbe\x7e\x81\x37\x2a\x2e\xf9\x8a\x75" - "\x5e\x95\xeb\x17\x68\xf0\x6d\x11\xba\x22\xca\xf5\xd7\xd1\x5e\x42" - "\xb2\x01\xec\x23\x44\xa3\x25\xa0\xec\x9d\xfa\xba\xc1\x3e\xd1\x84" - "\x3c\x16\x89\x63\xb2\xb1\x27\x5d\x9f\x48\x76\x6b\x04\xff\x20\xd3" - "\xc7\xca\x73\x83\xeb\xdb\x07\xe9\x6d\xa4\xa3\x7c\x42\x87\x50\x99" - "\xd4\x9d\x15\x22\x59\xc2\xa4\x6e\xea\x9b\x36\x17\xb1\x5f\x4d\x8e" - "\x09\xaf\xdb\x49\xf3\xc4\xba\xed\x8e\x5c\x97\x93\x53\xc2\x7c\xea" - "\xc4\xe3\xd3\x6b\x99\x75\xb8\x75\x68\x8b\xa3\xbd\x6a\xf2\xb3\x35" - "\x35\xbc\xde\x65\x50\xef\x5d\x5d\xcd\x62\x95\x75\x00\x1b\xad\xb3" - "\x15\xd9\xe3\xb0\x1e\x5f\x30\xc5\x5e\x9b\x31\xd7\x3e\x9a\x3b\x2d" - "\xcc\xb0\xfe\xdc\xe8\x98\x29\x81\x6b\xeb\x79\xd4\xcd\x0f\x3d\x60" - "\xa7\xb3\x6f\x17\xfb\x22\x9f\x45\xcd\x05\x96\xbb\x31\x96\xd9\xbc" - "\xca\x94\x03\x74\xcf\xfd\x70\x2c\xd1\x22\x53\x0e\x50\x99\xa5\x75" - "\x2c\xa6\xb4\x93\x77\xad\x7b\x7c\x54\x0c\xf6\x5f\x33\xf6\x8d\xb5" - "\x57\xc7\x5e\x5b\x3f\x80\x32\x5e\xcf\x16\xf9\x86\xb5\xf3\x26\xdb" - "\x66\xbd\x7d\xf8\xb6\xd9\xc6\x9f\x52\xac\xf3\xaf\xac\x6d\x37\xf8" - "\xc3\x6d\xbb\xc1\xff\x7f\xd0\xb6\xf7\x22\xda\x66\x0e\xb7\x2d\x8f" - "\xda\x76\xe2\xca\xda\x96\x3c\x2b\xdc\xb6\xe4\x59\xff\x60\xdb\xf6" - "\x8c\xdc\xb6\x29\x4f\x0e\xdf\x36\xc7\xb5\xa7\x94\x29\xab\xae\xac" - "\x6d\x53\xed\xe1\xb6\x4d\xb5\xff\x6f\xda\xe6\xac\xe3\x27\x5b\x93" - "\x18\xd9\xd3\x8c\x25\x3c\x7f\x4a\xb9\xa1\x62\x55\x92\xd0\xe3\x4e" - "\xc0\xfb\xed\x65\x75\xfc\x73\x49\xdb\x4c\xb9\x28\xf7\xb4\x29\x3e" - "\xcc\x5f\xa9\x57\xa2\xdc\xe0\x15\x7a\x2e\x51\x13\x76\xf1\x4a\x1e" - "\x9c\xe1\x27\x9d\xc1\x20\xd9\x76\x21\x5b\xf0\xf5\xfb\x2e\x04\xc8" - "\x0f\x47\xc3\x8e\x73\x46\xb6\xef\x82\xcf\xd0\x57\x75\xc3\x34\xdd" - "\x9e\xab\x9e\xd7\xb4\xe5\x72\xf8\xe8\x86\x25\x73\xf3\x98\x89\xf0" - "\x11\x3d\xc9\x9f\x66\x8d\x73\x74\xcc\xdc\xaf\x68\xdf\xbf\xc1\xa1" - "\xdf\xd7\xd5\xcb\x4a\xef\x1a\xcd\x4d\xa5\x2c\x8a\xee\x0c\x0b\xdb" - "\x8f\x16\x1f\x4b\x2e\x65\xa3\xd2\x1d\x28\x3f\xc0\xb2\x4d\x0e\x94" - "\x0d\x78\x48\x5a\xfe\x86\x57\xa3\xf2\x59\x6c\x2d\xca\xa6\xe7\x5c" - "\x4b\x19\x5f\xfd\x2c\x33\xd2\xdd\x62\xba\x23\x2c\xef\x07\x47\xc7" - "\xa0\x1e\xaf\x5e\xcf\xdf\x81\x5f\x9c\x84\xdf\x8d\xaf\x87\xe1\x77" - "\xe3\xf2\x30\xfc\x6e\xbc\x43\xc2\xef\xc6\xd4\x30\xfc\x92\xad\x57" - "\x06\xbf\x1b\xf3\xc3\xf0\x93\x79\x2f\x0f\xbf\x1b\x7f\x3d\x32\xfc" - "\x6e\x6c\x0c\xc3\x4f\x96\x35\x02\xfc\xa2\x87\x87\xdf\x8d\xa1\x7f" - "\x0c\x7e\xc9\xd6\x7f\x10\x7e\x63\x25\xfc\xa6\x2a\x61\xf8\x25\xbf" - "\x1c\x86\x5f\x72\xb1\x84\x5f\xb2\x2d\x0c\xbf\xa9\xd9\x57\x06\xbf" - "\xe4\x3d\x61\xf8\xc9\xbc\x97\x87\x5f\xf2\x89\x91\xe1\x97\x1c\x08" - "\xc3\x4f\x96\x75\x65\xf0\x9b\x7a\x17\xe0\x66\xd6\xe0\x67\x1e\x19" - "\x7e\x53\xb3\xff\x41\xf8\x99\x24\xfc\x6e\xba\x27\x0c\xbf\xa9\xe7" - "\xc3\xf0\x9b\xfa\x8a\x84\xdf\xd4\x86\x30\xfc\x6e\xaa\xbf\x32\xf8" - "\x4d\xed\x0e\xc3\x4f\xe6\xbd\x3c\xfc\x6e\x9a\x32\x32\xfc\x6e\x9a" - "\x1d\x86\x9f\x2c\x6b\x04\xf8\x8d\x1e\x1e\x7e\x37\xad\xfa\xc7\xe0" - "\x77\x53\xfd\xe5\xe0\x77\x65\xb4\xc6\x4d\x23\xde\x7f\xbf\xc2\x72" - "\x82\x23\x95\x43\x30\x24\xfd\x44\xb5\xea\xa6\xe0\x76\x35\x3a\x46" - "\xde\xe1\xb8\xe9\x00\x78\x98\xbb\x3b\x94\x6f\xdc\xbf\x5d\x1d\x15" - "\xc3\x2b\x3f\x3f\xae\x56\x9e\x5c\xc3\x2b\xa2\x8d\x6a\xc5\x68\x23" - "\xd9\x33\x18\xd1\xe7\xba\xf2\x8d\x17\xa2\xae\x63\xd7\xd3\x7d\xbd" - "\xd5\xa0\xd7\xe8\xbd\xaf\xea\x1b\x07\x40\x8b\xa4\x5d\x0a\x93\x9c" - "\xa5\x45\xc2\xd9\x67\x61\x6e\xce\xf2\x82\x9c\x25\x05\x76\xeb\x92" - "\xc7\x7e\x56\x34\xd4\x86\xbe\xf0\x93\xb9\x86\xc6\xef\x1b\x81\x41" - "\x1b\x33\x95\xdc\x41\xb6\xfa\x6c\x37\x90\x6e\x5a\xca\x6c\xe1\xd7" - "\x20\xa1\x24\x89\x0f\x64\x3e\x97\x76\x23\x3f\x24\x6c\x10\x0e\xe4" - "\x3d\x07\x7e\xaa\x89\xec\xca\x68\xe7\x50\x4d\xa7\x94\x9b\x7f\xc0" - "\xe3\x9d\x42\x7f\x54\xdc\xed\x50\x52\xf4\x3b\x58\xcd\xdc\x6c\x4f" - "\x52\x5d\xce\x5d\x7c\x83\xb3\x9e\x60\xd0\x4a\xf6\xdf\x56\x44\x4d" - "\xee\x50\xa6\x25\xf2\x78\x7b\x12\x77\xd9\xad\xda\x19\x87\xb0\x7f" - "\x97\x56\xc2\x3f\xa3\xf2\x34\x5a\x90\xfc\x96\xb8\x25\x3d\x98\x72" - "\xc4\x54\x61\x8d\xa2\xb4\x64\x87\x91\xec\x13\xea\xbe\xaa\xa8\xdd" - "\x94\x16\xf4\xf8\xdd\xc8\x7f\x37\xf9\xea\x1c\x2c\x43\xb6\xe9\x9a" - "\xd3\xca\x37\x8d\xa2\x2f\xae\xa2\xe6\xde\xa7\x33\x9f\x13\xfe\x22" - "\x05\x5c\xbf\x75\x11\x7d\x68\x16\x7e\x3e\x83\x67\x85\x9f\x4f\x2d" - "\xcf\x24\xe4\x11\xf8\x94\x6c\xaf\xca\x32\xbe\x75\x42\x6f\x17\x68" - "\xe8\x31\x08\xbf\x1d\x51\xc7\xd5\x08\xef\x8f\xf8\x1e\x8b\xf0\x26" - "\xd0\xa1\xf1\xda\xf7\xb1\x08\x17\x13\x5d\x2a\xfa\x55\x5d\x2e\x75" - "\xa2\x95\x6f\x2d\x46\x9c\x59\x4b\x13\x8f\x34\xf7\x10\xad\xab\x95" - "\x91\x80\xf0\x54\xe2\x19\xb5\xef\x89\x08\x5f\x45\xe7\x02\xda\xf7" - "\x71\xa7\x95\x9b\xcf\x20\xfc\x0d\xed\x3b\xe8\xfa\x9b\x85\xad\x2d" - "\xc0\x9d\x7c\x47\x39\x00\xfb\xb5\x04\x77\xc0\x3a\x91\x9b\x8b\x9a" - "\xc0\xaf\x96\xd1\x38\x52\x3f\xdd\x25\xa7\x59\x87\x72\xf3\x75\x74" - "\x2f\x4f\x8e\x95\x73\x97\xb4\x0f\x64\xc8\x44\xbc\x85\xe2\x49\xb7" - "\x5c\xdd\xe0\x5c\x4b\xef\x80\xe9\x7e\x82\xa1\x56\x17\x78\xa2\x9b" - "\xd3\xb4\x71\x06\xec\xc8\x86\x2f\x2b\xdf\xa1\x8d\x05\xda\x36\x1a" - "\xdf\xb7\x69\xe7\x1e\x5d\xe9\xc1\x01\x79\xbf\x48\xb9\x39\xef\x7f" - "\x64\xb3\x02\xf9\x24\xde\xbb\x79\x97\xee\xc3\x10\x71\xc2\x56\x06" - "\xcd\x4f\x92\xaf\xf8\xe2\x8b\x1a\x84\x8d\x16\xcc\x51\x7d\xae\xd0" - "\x3c\xe1\xd1\xdf\x70\x4b\x59\xcd\xcd\x83\xf7\x7f\x91\xd7\xaa\xf9" - "\x7d\x60\x92\x4f\xf8\x16\x0b\xeb\x17\x7d\x53\xe0\x87\x88\x6f\x49" - "\x11\xdf\x74\xbb\x84\xd2\xe6\x54\xd5\xb7\x66\x47\x7c\xab\xbd\xe4" - "\xdb\xa2\x88\x6f\x6b\x2e\x29\xd3\x16\xf1\xcd\x7e\x49\xbe\x75\x11" - "\xdf\xb2\x2f\xf9\xb6\x2b\xe2\x5b\x86\xf6\x2d\x0a\xf1\xee\x41\x1b" - "\x89\xca\x37\xd3\xb4\x78\xe0\xfa\x6f\xb5\x47\xc4\xa7\x6a\xf1\x54" - "\xbf\xcf\xcb\x8e\x1d\xd7\xe2\xc5\x3c\xc7\x3c\xba\x49\xd6\x31\x2d" - "\x36\xa2\x0e\x26\xc7\xb0\x48\xde\x2f\x56\x52\x1c\x26\xc5\x3a\x9a" - "\xe6\x94\xa9\xa2\x9c\x7c\x08\xb9\xa4\x3d\x30\xb9\x0e\x85\x1f\x6a" - "\xf2\x95\x8b\x74\x23\xe1\xc6\xe1\x75\x04\xa7\x95\xeb\xf7\x58\x43" - "\xae\xa2\x03\xaa\xab\xe4\x28\xf9\x25\x24\xbb\x61\x65\xdd\x64\x3b" - "\x46\xf7\x49\xd8\xcf\x3c\xf6\xbe\xf2\xd6\x80\xb8\x6f\x4b\xf7\x21" - "\xe2\xc8\xee\x59\xab\x90\xef\x9c\x91\x7e\x09\xe9\x7e\xef\x86\xa2" - "\x03\x2b\xbb\x59\x92\xed\xbb\xbc\x93\xf8\x3c\x89\x13\xa6\x11\x3e" - "\x31\x69\x38\xed\x59\xa1\xeb\xad\x4c\x4f\xa5\x38\x4f\xb7\x90\x33" - "\xc7\x9c\x52\xa6\x97\xeb\xdf\x65\x7f\xa7\x97\x0b\x5e\x5a\xbb\x57" - "\xd8\x57\x35\x3d\x65\xd0\x6f\xa6\x32\x7d\xcd\xf9\xf8\xfd\xbb\x10" - "\x37\x67\xa8\x7e\xe3\xf4\x87\xa9\x4c\xea\x87\x57\x99\x16\xa0\xb2" - "\x91\x26\x7b\x50\xbf\x11\xf1\x2b\x83\x6c\x02\xda\x76\x4a\x2f\x1f" - "\xdf\xc1\xff\x4f\x13\x7c\x25\x95\x79\x7e\xc3\x87\xed\x88\xab\xf5" - "\x1a\xe7\x3a\xa4\x7e\xe4\xf4\x7a\x2f\xeb\x48\x1d\x69\xff\x13\x32" - "\x49\xb3\xd3\xcd\x5d\xce\x66\xac\xf9\x46\x69\x07\xc0\xe9\x96\xbc" - "\xfc\xf4\x33\xe4\x8b\x8c\x7c\x78\xd3\xb9\xa3\xc4\x3b\x33\x84\x3e" - "\x04\xc5\x01\x36\x84\x9f\xc5\x59\xd1\x95\xad\xc9\xe9\x62\xff\x23" - "\xdb\x4d\x74\xe7\x82\xee\x70\xf4\x55\xcd\x58\x30\xe8\xeb\x41\xbf" - "\x4f\xa0\xcc\x78\x8a\x64\x7c\x35\xaa\x6c\xe3\xa5\x6d\xa0\xf6\xa2" - "\xac\xee\x11\xf7\x52\xb3\xb3\x51\xc8\x41\x37\x16\xbb\xa5\x2e\xd9" - "\x8c\x57\xa2\x2c\x13\xbb\x50\xd7\x81\x41\x1f\x17\x48\x53\x4d\x3a" - "\xc1\x28\x7f\xb0\x9f\x85\xa2\x8e\xe3\x52\x4e\x3f\xc3\x07\x3c\xd6" - "\x58\xd3\xcf\x8c\x5a\xbc\xaf\x35\x18\xa0\xbb\xf5\xc3\xda\xe0\xa2" - "\x3d\x52\xd8\x6f\xda\xe8\x6c\xa4\xfb\x13\x33\x03\x7a\x9b\x67\xfa" - "\x48\x6f\x9f\xda\x2c\x61\x3b\xf3\xa4\x0e\xc7\xf5\xe7\x50\xb6\xf3" - "\x63\xd6\xa9\xcc\x7c\x92\xf4\x5b\x04\x4c\x4a\x74\x9d\xab\x99\x4f" - "\x8a\x74\xfd\x83\x69\x84\xbc\x83\xf4\x7d\x09\x4e\xdb\xc9\xee\x00" - "\xca\xac\xc6\x58\x08\x3f\xb6\xca\xcc\x97\x85\x7c\x13\xdf\x45\xbf" - "\x85\x3e\x5b\x6a\xa2\x9c\x2b\x33\xf7\x78\x95\x54\xab\x9c\x83\x32" - "\x8e\x7c\xc0\x93\x1e\x42\x8f\x32\x73\x3d\xf9\x92\x05\x3c\x9a\xc9" - "\x76\x5d\xab\x1f\xeb\xc5\xd1\x4f\x73\xa1\x99\x7c\x06\x7a\x95\x99" - "\xd2\x97\x95\x99\x60\x3e\xd3\x46\xf5\x13\x6c\xc9\x8f\x2e\x60\x7a" - "\xa1\xaf\x2a\x75\x50\xfe\x41\x3e\x7b\x91\x66\x44\xdb\x8d\x04\xa3" - "\x10\xda\xdc\x0a\x7a\xd5\x3d\xe1\x63\x6a\xdf\x7b\x6a\x82\xb3\x91" - "\xf4\x27\xf1\x2e\x6d\x5f\xb8\xe4\xd8\xc9\x79\x90\xfa\x42\x94\x25" - "\x69\x4a\xab\x9c\x0b\xd2\x8f\xb9\x92\x9a\xa1\xc1\x4f\xf8\xbc\x70" - "\xad\x90\x70\x90\xe9\x6f\x31\x4a\xb9\x4c\xd2\x37\xd0\xae\xfa\xb0" - "\x5c\xe6\x16\xa3\x90\xa9\x69\x3a\xd6\xf8\x76\x30\xa2\xcd\x7e\x71" - "\x0f\xf0\x1c\xf1\xd4\xa9\x39\x54\xd7\x7a\xb2\x2d\x46\xf3\xe2\x74" - "\xe4\xfc\x4f\x9d\x4f\xed\x24\xdd\xbc\x50\x7c\xb1\x9b\x6f\x28\x26" - "\x5f\xda\x6e\xe4\x29\xc5\x5a\x18\xf6\x2e\x1a\xe1\x4d\xf2\x7b\xd2" - "\x57\x75\xcb\xb4\x08\xdf\xbb\xd8\x07\x6f\x79\x44\xdf\xe7\x68\x8f" - "\x26\x3b\x0f\x83\x71\x1b\xce\x6d\xc1\x7a\x0f\x68\xb4\xd2\x48\xbe" - "\xa7\x62\x6b\x66\xb0\x54\xba\x6b\x4c\x7a\xda\x34\xdf\xb8\xf9\xdc" - "\x6c\xb2\x9d\x4c\x76\x20\xdd\x25\xb7\xa2\xbd\xb7\x8e\x7d\x66\xbc" - "\xb8\xdf\xe8\x77\xcf\x38\x47\x3a\x3a\xdd\xa7\x4a\x85\x7d\xa3\x98" - "\x74\x47\x90\xef\x90\xbe\xb7\x7d\x3c\xfe\xdc\x6c\xfa\x26\x7c\x07" - "\x50\x99\xff\x53\x3b\xc0\xca\x2d\xed\x1a\x2d\xd3\x8d\xbd\xfc\x5a" - "\xf4\x47\xdc\x67\xc4\xfb\xf8\xd3\xca\x6d\xb7\x4b\x7f\x91\xd2\x96" - "\xbd\xa6\x6b\x18\x2d\xef\xe7\xfb\x98\xb8\x2f\xad\xdc\xfa\x82\xf5" - "\x66\xc6\xba\x95\x5b\x5f\x14\x76\xa5\x5d\xf6\x18\x8d\xce\x8b\xa9" - "\x91\xed\x32\x65\x39\x0c\xa2\x8d\xd4\xbe\x2b\x6b\xdb\xad\xfa\x7e" - "\x19\xdd\x57\x75\x6b\xa3\x7e\xaf\x5f\xf4\x5f\xb3\x37\xed\xbe\x81" - "\xf8\x96\xdb\xa6\xca\x71\xb1\x6b\xbe\x7a\xed\xb1\xff\x07\x75\xfb" - "\xb4\xfd\xd0\x2b\x6c\x6e\x03\x2e\x18\x57\x6f\x5f\xd5\x6d\x69\xfa" - "\x7e\xaa\xe9\xc8\x4f\x93\xfb\xfc\x6d\x99\xe1\xbd\x54\xc2\x70\xc8" - "\x9d\x9d\x65\xcb\xec\x56\x10\xec\xb6\x25\xf6\xc7\xf2\xac\xb9\x85" - "\x85\xcb\x0a\xad\x64\xf0\xe6\x12\xbf\x4a\x31\xbc\xea\xb6\x7c\xcd" - "\xf7\xdb\xae\x41\xdf\x6f\x55\xb7\x1d\x88\xf4\xc9\xe7\x55\x6e\x6b" - "\xfc\xbf\xe1\x6b\x6e\x1b\xf1\x9e\x9f\xcb\xa0\x36\xe0\xd7\x88\x9f" - "\x1b\x3f\xf2\xc1\xc3\xb2\x02\x2c\x0d\xfb\xa3\x38\x13\x0e\xdf\x57" - "\xbf\x6d\x1d\x9d\x83\x77\x28\xb3\x6e\xd9\xae\x1a\x99\xb0\x6b\x52" - "\xa9\x0a\xdb\x9b\x3b\x90\x1f\x3f\x37\x7e\xcd\xf8\x89\x7c\xea\x1b" - "\xe2\xae\x6d\x43\xe4\x37\x3a\x9b\xe6\x95\xee\x39\x94\x86\x57\x18" - "\x05\x1d\xa2\x6e\x94\xe9\x2e\x69\x83\x81\x57\x4d\x3f\xa0\xa5\x13" - "\xb8\x21\xae\x82\x59\x87\x49\x17\xc5\xab\xbe\xe1\xd5\xd2\x89\xbb" - "\xef\x7a\x7f\xc8\x76\x3f\xd2\xeb\xe9\x8c\xbc\xea\x16\x9b\x96\x4e" - "\xda\x34\xab\x34\x0c\x57\xef\x28\x5e\x79\x21\x49\x4b\x67\x8e\x2c" - "\x2f\x22\x4d\xb4\x5a\x35\x79\x1e\xa5\x51\x2b\x8c\xd2\x0f\x4b\xd5" - "\x6d\x47\x91\x7e\x58\x9b\xa7\x57\x36\x4e\xb7\x97\x5e\x3a\x4e\xb6" - "\xc7\x96\xe6\xde\xb9\xb4\x60\x05\x79\x92\xb2\x2f\x5b\x6e\xa7\x67" - "\xc1\x92\x9f\x89\xc7\xb2\xac\xc7\x1f\x93\x2f\xf6\xfc\x54\x7a\xc9" - "\xc7\x7c\xa3\x67\xce\x72\x1b\x3d\x1e\x5b\x46\x41\x47\xde\xb4\xe5" - "\x8f\xe9\x2e\xbd\x87\xd8\x5d\xea\xab\xfa\x76\xb2\x57\x99\x95\x28" - "\xe9\x91\x6f\xa7\x7a\x95\x6f\x88\x73\x60\x53\x85\x97\xbd\x99\x22" - "\x7c\xff\xb1\xaf\xd9\x2b\x50\xbe\x7d\x17\xd9\x2b\x30\x55\xd8\x1e" - "\x33\x05\x97\xe6\xf2\x0d\x25\x56\xe4\xcd\xf7\xb2\x9d\xda\xdd\x72" - "\xbb\x45\xd8\x0d\xad\xba\xfd\xa0\xae\x5f\xa8\xba\x8a\x5a\xc8\x1e" - "\xbe\xd0\x37\xda\x28\x6c\xe1\x04\x90\x2e\x71\xfb\x46\xe1\x97\x26" - "\x11\xe1\xa3\x08\x27\x21\x6c\x41\x18\xfc\x65\x4e\x26\xdd\x4f\x44" - "\xd8\x8a\x70\x32\xca\x6f\xd1\xd7\x45\x24\x6c\x34\x67\x73\x77\x0e" - "\xcb\x1f\x0f\xb5\x31\x85\xb5\xf5\x1d\xb3\xee\xcb\x57\xf8\xed\xad" - "\xfa\x8e\x75\xd0\x6f\xaf\xf0\xe5\x64\x5e\x2c\xf6\x35\xb1\xb7\x7f" - "\x67\x5b\x94\x65\xd2\x0a\x49\x87\x7f\x67\x81\x6e\x93\x41\xd2\xd9" - "\xdf\xc9\x8c\xf0\x79\x4c\xe1\xbc\x41\x9f\xc7\xd2\x2e\xd9\x73\xc2" - "\xee\x91\xf2\x9d\x06\x5e\xf5\xed\xf6\x41\xff\x74\x55\xdf\x71\x45" - "\xfa\xa7\xf3\xe2\x3b\xf1\x37\x88\xdf\x15\xde\x07\xbf\x33\x87\xea" - "\x1c\xce\xbf\x33\xf8\x73\x47\x56\x31\x68\x71\x3c\x05\x5d\xae\xd1" - "\xc0\x14\xcf\x2b\xd3\xc8\xbe\x8d\x95\xbe\x11\xed\x37\xac\xcc\x81" - "\xfc\x2b\x2a\xb3\xef\x21\xbb\xbb\xbe\xb2\x1c\xe5\xc6\xed\xa4\x83" - "\x84\xb0\xb4\x1b\xc9\x7b\x94\xd9\xe2\x1e\x9b\x6e\x53\x2e\xf2\x4e" - "\xfc\xb0\x77\x0f\xde\xd7\xcf\x8c\xf3\x97\x99\x82\x4b\x72\x25\x1d" - "\x37\xfb\xd7\x12\x97\x16\x77\xca\xfd\x7e\xf6\x3a\xfe\x90\xf4\x77" - "\xe2\x55\xee\x30\xd3\x7d\x24\x93\x92\xbf\x8c\x23\xaf\xc9\xb1\x24" - "\x57\xc4\x21\xdd\x6a\xd0\x5a\x5a\xfb\x9e\xf2\x24\x75\x31\x7e\x21" - "\x24\xef\xfa\x2b\xb3\x6d\x3f\x99\x54\x4e\xf5\xc4\x08\x3a\xe2\x7d" - "\x16\x4b\xbe\x02\xa9\x6d\xdb\x23\x6c\xde\xd5\x20\x8e\xf4\xb1\x7a" - "\x1f\x62\xc2\xee\xaf\xd6\x16\x9b\xf0\x55\x56\x75\x47\x8c\x6e\x33" - "\xc7\x8b\xb8\x4b\xfb\xf3\xd0\x0f\xc5\x0a\x99\xfa\xd8\xb4\x8c\xf9" - "\x78\x9b\xa6\xb9\xb9\x8d\x9c\x3b\x49\xbd\x09\xa5\xa9\xbd\x7b\x7f" - "\xbe\x52\xf8\x89\xac\xba\x23\x13\xe3\x14\x14\xe3\xbd\xfa\xc7\x5f" - "\x12\x6e\x11\xfe\x13\xe9\x5e\xa1\xea\x47\xbd\x73\xee\x17\xf6\x75" - "\x0d\x92\x5e\x14\x76\xed\xaa\xee\x48\xe2\x09\x45\x8d\xd2\x47\x6c" - "\x49\x23\xc6\x4f\xec\xfb\xb4\x36\xc4\xfd\x49\x33\xf5\xfd\x8e\x06" - "\xe0\xd4\xb9\xf8\xfd\xab\xf4\x0f\xf3\xe3\x2f\xf5\x72\xc9\x7e\x14" - "\xe6\x96\x15\x4f\x33\xea\x6f\x1f\xd4\x11\x1a\xbc\x93\x79\xc7\x45" - "\xb2\x6d\x35\x78\x3f\x57\x99\x73\xbb\xa4\x2b\xef\x34\x7a\xd9\x4d" - "\x2e\xb9\xbe\xef\xc4\xfc\x6f\xd6\xee\x66\xdd\x09\xfe\xf7\x9f\xb3" - "\x87\x96\x71\x67\xae\x2e\xfb\x90\x63\x77\x67\x1a\xe6\xe2\x5c\xfc" - "\xfe\x15\xe9\x17\xea\x3e\xb2\x57\x1b\xc4\xdd\xa2\x53\x51\x16\x96" - "\x8a\xf8\x1c\x3d\x7e\x94\x92\x06\xd8\xdc\x69\xd7\xf1\x49\x6f\x42" - "\x71\x0b\xc2\x6b\x40\xa7\x07\xb5\x30\xf8\x9f\x3b\x6b\xf5\x30\xde" - "\xeb\x75\x7c\x43\xfc\x59\xef\xd3\x99\xcf\x12\xff\xf7\x98\x05\x34" - "\x99\x85\xf8\xab\x3b\xc1\xff\xfe\xb9\x5c\xe6\xfd\xc0\xd7\x5b\xf9" - "\xce\x34\x7f\x42\x4f\xaa\x1f\x38\x14\xdf\x8e\x7b\xd9\xef\x16\x6b" - "\xe5\x74\x79\x8d\xf3\x8f\x86\xc7\x23\xca\x04\x18\x1f\x95\x7d\x9a" - "\x63\xc5\x7b\x3b\xf9\x2b\xef\xab\xfa\x27\xb3\x57\xf9\x76\x40\xa4" - "\x5b\xd1\x5d\xbf\xae\xdf\xbc\xc8\x03\x0e\xde\xfd\x38\xcd\x95\x7f" - "\x12\xf7\x93\xd7\x97\x98\x33\x88\xe6\x23\x3b\x04\xc2\x3e\x19\xd9" - "\x9c\x0c\xb2\x68\x61\xe7\x7f\xc3\xb1\x2e\x61\xdf\x7e\x65\x4a\xac" - "\x6e\x6f\x12\xeb\x34\x8f\x1b\xf6\xda\xc9\x06\xa5\x90\xa5\xf5\xa5" - "\xc4\x09\xbb\x93\x9a\xbd\xc9\x6d\x2b\x58\x62\x9d\x2a\xed\x4d\x0a" - "\x1b\x05\x97\xb1\x39\xc9\x2b\xbf\x98\xa5\xdb\x9c\x04\x1c\xe8\xee" - "\x61\x0a\xbf\x10\x0c\xe0\x99\x1c\x61\xeb\xc6\x38\xac\xfd\x49\x03" - "\xf0\xa6\x41\xda\x9f\xbc\xb2\xfd\xe6\x9f\xba\xe5\x3c\x99\x33\x4d" - "\xf7\xe1\x1d\x11\x97\x86\xf5\xa2\xd1\x39\x77\x04\xb4\xb8\x45\x5e" - "\xf6\x56\xf7\x20\x6d\x06\x7c\x47\x32\x45\x7c\x2f\xe5\x65\x79\xcf" - "\x46\xae\x2b\x26\xfe\x68\xeb\x1e\x85\x7d\x39\x1a\xbf\xd1\xf4\x5b" - "\x30\x88\x3f\x2e\xf0\x76\xe2\x11\x4c\x0a\xf6\x1b\x47\x14\x4f\x0f" - "\x06\xa3\xb2\x82\xca\x51\xa2\x3d\xe9\xce\x75\x7a\x28\x48\x77\xff" - "\x8d\xe9\xa1\x5e\xf2\xaf\x79\x94\xee\x92\xd5\x3c\x4e\x77\x1b\x27" - "\x73\xf2\x53\x93\x1e\x3a\xcb\x77\xc8\x3b\x9b\x6d\x9a\xcf\xcc\x96" - "\xd0\x0a\xde\x8c\x71\x88\x25\xbe\x83\xec\x6f\xc5\x29\x01\x16\x67" - "\x8b\x3a\xf4\xe0\xf9\x43\x9c\x6c\x6f\x91\x8f\x32\xb5\x2a\x00\x5c" - "\x69\x55\xb2\x82\x51\xe5\x9e\x60\xa7\xf0\x13\x90\x1e\x1a\xcd\xd3" - "\x1d\x77\x71\xe1\x5b\x6c\x05\x6f\x02\x9e\x8d\x12\x3e\xb4\x8b\x79" - "\x2f\xde\x63\xd2\x8b\x7b\x39\xf9\xf7\x44\xd9\xcd\xe9\x41\xb5\x3f" - "\xdd\xa1\x96\x65\x39\x14\xe4\xfb\x1c\xf9\x3e\x47\x7b\x52\x51\xa6" - "\x19\xe1\xbb\xf9\x8e\xc7\xe9\x0e\x54\xb9\xe0\x7d\xd0\x47\xb7\x76" - "\xaf\xb4\x91\x7c\x7a\x92\x9d\xf1\xac\xa0\xbb\x7c\x87\x76\x4f\x54" - "\xf8\x96\x75\x0c\x70\xad\x9e\xd9\xe9\xc5\xec\xee\xac\xe2\xc9\xe2" - "\xbe\x29\xdd\xa5\x4a\x0f\x5a\x51\x67\x39\xc1\x23\x56\xf8\xf3\x16" - "\xf7\xa9\xee\x6a\xbf\x9c\x7f\x4f\xd2\x13\x29\xba\x8e\x19\xe8\x7e" - "\x46\xe8\xb7\x05\x6d\x64\x0b\xac\xcc\xc7\x03\x24\xf7\x3b\xd4\xdf" - "\x6e\xb0\xae\x30\x02\xaf\xde\x15\x6a\xb5\xa5\x0e\x7f\xa7\xae\xda" - "\x96\xcf\x37\x95\xce\xe2\xd5\x45\x0b\xf0\x3c\xc0\x5d\x25\x74\x67" - "\x50\xe1\xd5\x2b\x92\xf9\xa6\x55\x88\x2f\x66\x78\x1e\xe0\xd5\x4f" - "\x1f\xe7\x9b\x9c\x08\x3b\x1b\xf1\x44\x38\x63\x27\xd2\xa7\xf2\xea" - "\x87\x12\xf1\x6c\xe0\xd5\x3f\x5c\x83\x74\x08\x2f\xf2\xe3\x89\xf0" - "\xbf\xe4\x20\x1d\xc2\xff\x7a\xf4\x94\xf2\xdd\x66\xbc\x23\xae\xa2" - "\x56\xd6\xb5\xa6\x5e\xd4\x55\xfd\xf3\x3d\xb2\x8e\x5f\x36\xca\x3a" - "\xd6\x37\xc9\x3a\x5c\x6d\xb2\x8e\x1f\xcd\x43\xba\xd9\xbc\xfa\xc7" - "\xa9\x78\x36\xf2\xea\x47\x92\x90\x0e\xe1\xac\x18\x3c\x11\xce\x46" - "\x5d\x4e\x84\x1f\xf5\xe2\x89\x70\x4e\x0b\xd2\xcd\xe1\xd5\x8f\x1f" - "\xc4\xf3\x20\xaf\xce\xa3\xf2\x11\x7e\xa2\x0e\x4f\x84\xf3\xd7\x21" - "\x1d\xc2\x05\xa5\x78\x22\xfc\x0c\xfa\x54\x9a\xc6\xab\x37\xb9\xf0" - "\x74\xf3\xea\xff\x40\x7d\xab\x10\xde\x12\xc0\x13\xe1\xe7\x90\xdf" - "\x89\x70\x5d\x36\x9e\x08\x6f\xa7\xbe\xce\xe3\xd5\x3b\xa8\x9e\x26" - "\x5e\xfd\x6b\xea\x33\xc2\xff\x39\x07\x4f\x84\x77\x52\x7b\x10\xfe" - "\x2d\xe5\x43\x78\x17\x60\x50\xba\x80\x57\xff\x6e\x16\x9e\xcd\xbc" - "\x7a\xaf\x11\xe9\x10\x6e\x38\x8a\x27\xc2\x2f\x01\x86\x4e\x84\xff" - "\x60\xc7\x13\xe1\x57\xa8\xbf\x0b\x79\xf5\x41\x0b\x9e\x2d\xbc\xfa" - "\xb5\x6e\xa4\x43\xf8\x75\x37\x9e\x08\x37\x01\x7e\x4e\x84\xff\x9c" - "\x87\xe7\xf0\x7e\x82\xaa\xdf\xf1\xf2\x8a\x68\xc6\xab\x3f\x34\xf3" - "\x8a\xd1\x78\xb6\xbb\x79\xc5\xa8\x14\x5e\x7d\xdc\x86\x78\x3c\x3f" - "\xda\x83\xf0\x34\x2d\x8c\xe7\xc7\x5b\x10\x4e\xd5\xc2\x78\x7e\xb2" - "\x06\xe1\x59\x5a\x18\x4f\x2f\x85\x01\xe3\x13\x74\xce\x41\x4f\x23" - "\xc2\x73\xb4\x30\x9e\x9f\x67\xe0\x19\xe4\xd5\x7f\x9d\x83\x78\xc0" - "\xea\xaf\x41\x84\xf1\xfc\xec\x20\xc2\x80\x85\xd7\x8a\xf0\x3c\xdf" - "\xd4\x9f\x09\x9d\x26\x75\xfc\xbd\x3e\x3e\xbe\xbc\xa1\xec\x3c\x33" - "\xd0\x1c\x25\x7f\x14\xd6\x15\x6c\x72\x87\x92\xf6\x7c\x83\xd3\x6b" - "\xa0\x34\xa1\xcd\xa5\xa9\xea\xf8\xd2\x06\xc4\x47\x23\xdd\xe8\x53" - "\xca\x3d\xef\xd1\xfe\xea\x29\xf5\x0a\x9f\x78\x9a\x5d\xbb\x68\xe4" - "\x39\x02\x7a\x62\x36\xf9\x46\x07\xbc\xf2\x79\xe5\xa8\x73\x78\x76" - "\xf3\xca\xab\x3b\x00\x2f\x84\xe3\xdf\xc7\x13\xe1\x6f\xff\x12\xf0" - "\x42\xf8\xc7\xf7\xe2\xd9\xdd\x57\x75\xcf\x34\xaf\xf2\x5d\xa1\xe3" - "\xc2\xf7\xfe\xdc\x66\x0a\x72\xe0\x23\xec\xd5\xbf\xde\xed\x33\x05" - "\xdd\x98\xef\xd5\x6d\x26\xb2\xcf\xf6\x7c\x3e\xda\xba\x90\xec\xca" - "\x11\xff\x13\xcd\x07\x92\x0d\xb2\xee\xab\x79\x87\x72\xcf\x8f\x48" - "\x6e\xca\xc7\xe7\x8c\xf4\xbd\x58\x7c\xbf\xe1\x77\x36\xf9\x3d\x86" - "\x85\xbf\xff\x98\xbe\x3f\x6b\x22\x59\xf7\x4d\x8f\x89\xef\x1e\x7f" - "\x97\xd6\xaf\x28\xfa\xf6\x32\xa5\xf5\x2a\xf7\xb4\x4b\xd9\x57\xda" - "\x71\x5e\x19\xc5\x7a\xcd\x25\xc7\xd1\xf6\x2e\xaf\x72\x57\xa7\x26" - "\x87\x6c\xe1\xe6\xa2\x36\x69\xc3\xc0\x39\x92\x7d\x95\x18\xb5\xb6" - "\x36\x73\x7d\x25\x6f\x23\x7e\x16\x7b\x90\xc1\xea\x4c\x6e\xec\x50" - "\xe6\x1e\xd8\x46\x72\x8a\xc4\xdd\xa9\x74\xcf\xa8\x43\xb9\xb7\x78" - "\x60\xe3\xd3\xc9\xd6\x12\x13\xea\x9f\xfb\x72\x59\x80\x9f\x77\x3b" - "\xef\xc5\x5e\x29\xe2\xb3\xa5\xee\xba\x78\x5f\x28\xf5\x8d\xc4\xfb" - "\x6c\x29\x73\x9d\x7b\x80\xf2\x46\xf2\x0f\xa1\x5f\x46\x75\xaa\xe3" - "\x77\xa7\xc9\xf3\xb2\x7b\x57\xbd\xaa\x7a\x0d\x26\x3b\x1b\x65\x2d" - "\x39\x84\xf2\xef\x6d\x1a\xc2\x6b\x0e\xa6\x15\xdf\x5e\x78\x0d\x69" - "\xb7\x0a\xb9\xd0\xbd\x47\x75\x99\x32\x47\x1f\x7e\x25\xe9\xac\x34" - "\xda\x17\x25\xbd\x38\x77\x11\xd9\xd7\x0c\x26\xae\x4f\x0b\xd6\xde" - "\xeb\x0d\xd5\xee\x4e\xe5\x9b\x77\xa7\xc5\x05\x15\x26\xf5\xfe\xe7" - "\xfe\x62\x66\x80\xe4\x75\xef\x50\xda\x7b\xd4\x31\x71\xb3\x66\x38" - "\x98\xc1\x5d\xf8\x31\x85\x2b\xf8\x2f\xaf\xcb\xf4\x74\xb7\x33\x77" - "\xa1\x28\xab\x9c\xff\x32\x75\xa1\x3a\x26\xb9\x76\x3b\xd1\xb9\x0e" - "\x92\x33\xbd\x4f\xf1\xa3\x30\x2e\xe0\x27\xe6\x66\xeb\x6d\x21\x3f" - "\x03\xeb\x01\x3b\xa2\x41\xe9\x9e\x76\x56\x28\x44\x36\xa5\xd6\x7a" - "\x01\x07\x39\x5e\x73\xe7\x11\xce\xd7\xea\x7d\x56\x4d\x78\xda\xdc" - "\xba\x98\xce\x64\x63\xc8\x46\xcf\x79\x71\xaf\x33\x48\xbe\x01\x69" - "\xaf\x95\x69\x23\xc7\x6e\xa9\x76\x9f\x75\x69\x81\xbd\xf0\x29\x6b" - "\xd1\xd2\x92\xdc\xbb\xa6\x2e\x9f\x66\x2d\x74\x58\x0b\x85\x7f\x6d" - "\x11\x91\x33\xcd\x5a\x94\xbf\xcc\x6e\xb5\x17\xdb\x72\xbf\xee\x6b" - "\xd8\xc2\xcd\x25\xdd\x92\x36\xbc\x5f\xda\x00\xa8\xdf\xdd\x65\x2f" - "\xe5\xaa\xf5\x86\xd1\xa0\xfd\xe7\x2d\xba\x18\x3d\x97\xee\xe6\x98" - "\xd5\x4a\x2b\xd3\x7c\x80\xc7\x3e\x9b\xc0\xe8\xfe\x48\x4c\x5f\xd5" - "\xbc\x85\xe1\x73\x96\xfb\x6b\xa5\x1c\x64\x5e\xb6\x57\xb9\x57\xd8" - "\x34\xab\xd5\xed\x7e\x69\xdf\xe4\x39\xc5\xbc\x72\x2f\x7b\x5e\xda" - "\xb2\xab\xdf\xbd\x40\xd2\x94\xf3\x84\xdc\x8a\x5b\x77\x77\xf1\x9d" - "\xf9\x64\xf3\x4a\xa1\xb9\x2a\x7c\xf2\xb2\x73\xe2\x8e\x2b\xd6\x5a" - "\x06\xdd\x2f\x0f\x6d\x2e\x6b\x53\xc7\x57\x67\xa8\xbf\x7d\xb2\xa1" - "\xec\xd7\xcc\xb0\x0f\xb8\xc0\x68\xc5\x7a\xb8\x81\x4d\x3e\xe4\xec" - "\x32\xa0\xcd\xaf\x1f\x72\xb6\x1b\x78\x6d\xf9\xae\xde\x64\x67\x7b" - "\xa0\x52\xd8\x07\x45\x19\x01\xf6\xe7\x79\x8c\x78\xa3\x46\xff\xb8" - "\xcd\x01\xff\xb8\xb2\xc6\xc0\xa6\x1d\xd9\xee\x1b\x6e\x65\xf3\xbf" - "\xc9\xcf\xbe\xd5\x44\x32\xac\xfb\x4b\xdf\x9a\x47\x32\xc4\x92\xce" - "\x80\xb9\xa4\xcb\xbf\x79\x3d\xe9\xf8\xf9\x2e\x6e\xde\xd1\xd0\x3f" - "\xbe\x32\xf5\x30\xd2\xbc\x03\xde\xe1\x5d\x2b\xe6\xef\x14\x66\xb8" - "\x78\x53\x7e\xda\xbe\x7e\x97\xa1\xb9\x69\x8e\x94\x7b\x66\x63\xcd" - "\x88\xf9\x34\x3f\xf7\xad\x03\x4d\x0c\x75\xb3\x7d\xfd\x0b\x0c\x7f" - "\x9e\xfd\xb5\xef\xff\xfe\x56\x6a\x13\xeb\x23\x9b\xad\xe0\xd1\x5e" - "\xfb\x78\x0b\xe3\x9b\x37\x99\x5f\x2c\x09\x18\x16\x7b\x99\xe1\x48" - "\xfb\x16\x56\x7a\x92\x8d\x0d\x9e\x4d\x31\xfe\x0e\xf9\x2f\x92\x2d" - "\xc4\x77\x2d\xc2\x26\x1a\x76\x17\x55\xdc\xeb\x03\x7d\xa2\x9e\x4d" - "\x89\x6e\x5d\xe4\x66\xf8\xfe\x68\xf0\x9f\x2d\xec\x48\x9e\x8f\x79" - "\x32\xeb\xd9\x45\x43\x1a\x7b\xe5\xdf\xea\xd9\x56\xf0\x07\x5b\x7b" - "\x58\xac\x3c\xcf\x4d\x89\x0e\x0e\xa4\x18\x83\x4f\xa7\x90\x8d\x1a" - "\xce\xcf\xa6\x8c\x21\x9a\x34\xb8\x2c\x25\xa6\xd5\x57\xcf\x66\x76" - "\xb1\x94\x8b\x06\x66\xba\xf8\x74\xca\x98\x56\xdb\x16\x94\x05\x62" - "\x13\x70\x25\xfb\x58\x64\x37\x8b\xe0\x74\x75\x26\x5b\xd4\xad\xcc" - "\xbf\x6b\xcc\x51\x36\x8e\xec\x33\x92\x7d\x35\xb2\x11\xab\x26\x6e" - "\x32\x87\x12\xd7\xb7\x39\xcf\x93\x3d\x91\x00\x03\xae\xcc\xb0\x4a" - "\x1f\xe4\x0a\xf5\x59\xe5\x29\x63\xb2\xe8\xb9\xb1\xe8\x51\xa2\x95" - "\xd5\x3e\x0b\xf9\x4e\x8a\xa1\x76\x62\x9d\xc6\xac\x3a\x01\x58\x96" - "\xa5\x18\x91\x2e\x16\xf1\x71\x9e\xee\x00\x0b\x4d\xff\x79\xf6\x0c" - "\x9b\xf0\x91\x9b\xb8\xdd\xc9\xcc\x2e\x27\x4b\xb4\x7e\x5b\xcc\xa5" - "\x47\x42\x2f\xfe\x3c\x83\x57\xfd\xeb\x6c\x5e\x61\x4c\x92\x71\x0b" - "\xee\xb2\x7e\x8f\x31\xeb\xad\xf4\x7e\xdf\x49\xeb\x9d\x18\xc3\xc4" - "\x5a\x9b\xa0\xe3\x05\xcf\x77\xdf\x47\x72\x8e\xdf\xf7\xde\xc5\xe8" - "\x5f\x97\xaa\x55\x47\xb7\xa8\x15\x46\x2b\xf9\xd2\xee\x51\xee\x7b" - "\x99\x57\x9f\x09\xf0\xda\x1d\x62\x2e\x22\xbc\xff\x62\xf4\x43\x5e" - "\x5e\xdd\xb3\x18\xe5\xa7\x5d\x54\x8c\xed\xf8\x1d\xd7\xf2\xef\xa2" - "\x7e\x87\x76\xe6\x37\x53\xbf\x85\xbf\x1d\xf4\x2b\x0b\x63\xc6\xc7" - "\xd7\x5a\x85\x0d\xfa\x01\xc0\x57\xf3\x47\x4a\xf0\x20\x18\xa8\x03" - "\x29\x63\x44\x5f\x07\x52\x62\x01\x5f\xb2\xc5\x6a\x72\x2e\x41\x9e" - "\xcd\xb5\xb3\xf0\x2d\xee\x62\x62\x6d\x1e\xf9\xbd\xf2\xd8\x7c\x2c" - "\xb4\xa9\x36\x95\x6c\x8d\x3d\x5b\x82\x35\x37\xae\xd6\xca\x37\xd5" - "\xce\xd1\xd6\x16\xa3\x76\xaa\xd5\x3d\xbb\x2e\xd2\x5d\x01\xb4\x0d" - "\xed\x6b\xc7\xef\xb8\x57\xb9\x6f\xda\xc5\xa9\xf9\xed\x78\x32\xb4" - "\xd5\xca\xab\x96\xe5\xd1\x3b\xbe\x59\x01\x9b\x71\x04\x07\x82\x87" - "\x84\xc5\x82\xb1\x61\x58\x6c\xdd\xe9\x55\xbe\x17\x54\xab\x3c\xa8" - "\xe3\xbe\xe3\xbc\xea\x89\x94\x88\x74\xb7\x87\xd3\xfd\xd7\x02\x99" - "\xee\xa3\x6e\x99\xce\x5e\x8f\xef\xef\x49\x78\x2f\x28\xfe\x3a\xbc" - "\x17\x3c\x15\xce\x5b\xe3\x93\x79\x9b\x4a\x65\xde\x2c\xca\xfb\xc2" - "\x25\x6d\xfa\x75\x38\xfd\x2f\x93\x65\xfa\x43\xd3\x64\xfa\x7f\xcb" - "\x8f\x48\xf7\x76\x38\xdd\xa6\x06\x99\xee\xed\x26\x99\x2e\xa7\x05" - "\x73\x63\xd4\x30\x6d\x09\x85\xf3\xbc\x34\x4b\xe6\xe9\xf4\xca\x3c" - "\x65\x8b\x91\xe7\xf6\xa1\x6d\xb9\x7f\x7a\x38\xfd\x8b\x5a\xbf\x3f" - "\xb3\xc9\xf4\x25\x31\x11\xe9\x1e\x96\xe9\xe8\xfb\x69\xa4\xbb\xaf" - "\xed\x62\xf4\x2b\x16\x99\x6e\xcd\x2e\x9a\x8f\x48\xb3\x5c\xad\xca" - "\x6c\xbe\x18\xfd\xf0\x01\x94\xd3\x84\xb1\x49\xa2\x27\xc6\x2e\x49" - "\x75\x95\x74\xe2\x7d\x0e\x9d\x6b\x10\xce\xf5\x2a\xf3\x92\x80\x77" - "\x43\xc3\x9f\x99\xde\x7f\x60\x50\x8e\xa6\x82\x7e\xd8\x54\x3a\x3c" - "\x8d\xbe\xb1\xf0\x28\xe9\x3a\x10\x4e\x39\xa5\x7c\x7f\x2a\xd9\xa0" - "\xe3\x65\x0b\x34\xd9\xd5\xfd\x82\x57\x23\x1b\x10\x24\xdf\x94\x71" - "\xdf\x97\x32\x4f\xcc\x4d\xf0\x9a\xc2\xee\x1f\xc9\x33\xb1\x47\x35" - "\x7b\x95\xef\x13\xbd\x34\xea\x19\x83\xda\x80\x5f\x23\x7e\xee\x67" - "\x48\xce\x59\xc9\xe6\xeb\x32\xe0\xe1\xdb\xfa\x7d\xec\x7f\xbf\x6d" - "\x09\xcb\xc1\xbe\x0f\xd8\xdd\xdf\x7c\xe5\x7a\xc2\xdf\xff\x9a\x4c" - "\x66\x88\x6f\x69\xa2\x95\x36\x97\x66\xb8\x54\xe9\xaf\x1e\x6b\x11" - "\x74\xde\xf7\xdf\xc4\x9e\x5f\x2e\x6c\xcb\xd6\x56\xb7\xa9\xc9\xd8" - "\x4b\xce\xb0\x28\x4f\x69\x17\x6b\x50\xbb\x0c\xae\x7e\x66\x6c\xc5" - "\x7e\x4a\xe9\x1b\x40\x3b\x58\x0b\x88\x86\xfa\xfe\xa7\xae\x0b\x5a" - "\x79\xf5\xbb\x7d\x65\x4f\x4a\xbf\xdc\x44\x6f\xd2\x1e\x04\xbc\x13" - "\x2b\x7c\xb5\x15\x8c\x46\xda\x7f\x8e\xc7\x7b\x0c\xa5\xbd\x78\xd3" - "\xcf\x6c\x17\x7f\xb3\xdb\xd7\xbf\xb9\x22\xb5\xff\xa6\x82\x8c\x81" - "\xf1\xd5\x6d\x03\x9b\xd7\x67\x04\x7f\xb3\x3b\x3b\x78\x53\xbe\x2f" - "\x34\xbe\xa2\x01\x75\x63\x7f\xda\x62\xd8\xab\x36\x18\xf6\x3a\xdd" - "\x06\x2a\xf7\x90\x73\x97\xe1\x35\x67\x9b\xe1\x35\xb5\xd1\x70\xc8" - "\xe9\xc2\xb3\x9e\xfc\x76\x81\xae\xfd\xe7\x25\xaf\x39\x9b\xb1\x3f" - "\xfe\x73\x3d\xe0\x55\xaf\xcb\x5b\xf9\xbd\x41\xd6\xba\x2b\xc8\xde" - "\xb4\x9f\x67\xbe\xf8\x92\x6e\xfc\x7c\xbe\x71\xb5\x99\xbe\x71\x3b" - "\xb2\x45\x9b\xc7\x6f\x12\x7d\xa4\x3b\x5f\xaf\xa9\xb2\xcd\x1a\x3c" - "\xa8\xcc\xb7\xb7\xd3\x59\xac\x6e\x77\x57\x59\xb8\xe6\x6b\x76\x77" - "\x0d\xd2\x67\xdc\xa0\xed\xdd\xff\x2f\xec\xee\x6a\x72\x09\xb2\xbb" - "\x0b\x5e\xb8\x4d\xe3\x85\xdd\x9a\x8d\xa5\x58\xe2\x7f\x85\x8d\x25" - "\x87\x5b\xd8\x49\x12\xe7\xff\x9b\xd6\x35\x10\x1d\xda\x57\xb5\xd0" - "\xad\xf3\xb9\x44\x5b\x85\x36\x94\x04\xf1\x0b\x20\x1e\xf8\xcf\x37" - "\x4f\x8f\xe7\x9b\xe7\x12\x1f\x11\x15\xe2\x79\xdf\xed\xa3\xfb\x4c" - "\x3c\xef\xee\xd0\xa6\x32\x77\x68\xd3\x8e\x34\xc4\xcd\xc1\xef\xae" - "\xd0\xa6\xb9\x7e\xfc\x02\xf8\x05\x43\x9b\xe6\x01\xf7\xce\x33\xe2" - "\x17\x83\x9f\x19\xbf\x44\xfc\x2c\xf8\x25\xe1\x67\xc5\x2f\x59\xdd" - "\x34\x8f\xec\x16\x2b\x7c\xf3\xbc\x54\xcc\x03\x8b\x5e\x6e\x18\xde" - "\x0f\xdc\x85\xfe\xa7\x11\xdd\xc7\xe3\x7a\x12\x39\xd9\x3e\x7b\xfe" - "\x67\x01\xd1\x7e\xc2\xcb\xcf\x3b\xdb\x7d\x53\x76\x7b\x7d\xe3\x36" - "\x79\xf1\x5c\xe0\x8b\xdf\x97\x87\x9f\x0d\x3f\x87\x6f\x53\xad\x0d" - "\x63\xba\x00\xdf\xc0\xcb\x3f\x00\xbc\xbc\x48\x93\xcf\x3d\x00\x3c" - "\xb7\xa8\x41\x7b\x3f\xe8\x55\x7e\x20\x6c\x12\x20\x9d\x1b\xe1\x16" - "\xaf\xf2\x90\x48\xd7\x3b\xbe\xb6\x5c\xbb\x0b\x55\x8e\xf8\x4e\xaf" - "\x31\x2b\x46\xa6\x5b\x4f\xf2\x3a\x2a\x33\xa0\xaf\xc3\x21\xfe\x39" - "\x1e\xb3\x65\x3d\xb9\xc4\x91\x55\x94\xbf\xf4\xb1\xdc\xa2\x3b\xad" - "\x53\x73\xac\x29\x4b\x0b\x9f\xca\x7a\x6a\x79\xee\xf2\x5c\x41\x42" - "\x22\xea\x9b\x43\xce\xa9\xc8\x0f\x33\x0b\x82\x1f\x8a\xeb\xe4\x9c" - "\xf6\xee\x85\x7e\x8c\xd1\x0d\xbb\x7d\x07\x7b\x7c\x86\x10\x68\xb8" - "\xd8\xce\x72\xac\xcd\xea\xb6\x83\x3d\x01\x43\x6c\xa7\x95\x71\xac" - "\x07\xfa\xe6\xe9\x6c\xd3\x68\xba\xf7\x59\x0b\xd1\x74\x48\xb3\xb7" - "\x20\x60\x78\x90\xf2\xff\x36\xdf\xb7\x0f\xef\x88\xcb\xa0\x7c\x1c" - "\x74\x9e\x78\x82\xce\x93\xe1\x8a\xd4\xd7\xc4\x73\x7d\xc6\x6b\x22" - "\x5d\x45\xc3\x21\x7a\x5e\x28\xe5\x2d\x28\x97\xe4\x75\xfc\xb7\x3f" - "\xb3\x89\x34\xbf\x2d\x90\x69\xb0\x16\x3b\x94\xf4\xb5\x94\x4e\xf0" - "\x56\x68\xe3\x3e\xb4\xa3\x6c\x39\x33\xea\xeb\x9b\x78\xa9\xc1\x35" - "\xbe\x82\x68\xde\x07\xbf\xa2\x35\x4e\xed\xe1\x58\xd3\x2f\x22\xef" - "\xde\x02\x9f\xc8\x0f\x1e\x33\x8a\x78\x4b\xc2\x23\x84\x3f\x3c\xa5" - "\x6d\x22\x7f\x83\xda\x66\x20\x7e\xac\x47\x49\xbf\x85\xbe\xd5\x81" - "\x4e\xad\x13\x7c\x49\x7a\xbe\xce\x0b\xac\x1b\x2f\xed\x2c\xc5\x66" - "\x33\xba\x0f\x3e\x19\xf5\xcc\x27\xf8\x11\xbc\xe8\x5c\x98\x57\x3d" - "\x68\xac\x4b\x60\x46\xf2\x61\x10\x1c\xb7\x7b\xb6\x3c\x1b\x48\xdf" - "\xa3\xd3\xd7\xfe\xc4\xdd\xb3\x23\xc7\x4d\x8e\x97\x35\xb7\x80\x4e" - "\x38\x72\xc4\x51\xe2\x92\xa2\xa2\xe5\x4f\xe6\x5a\x73\x97\x3c\x96" - "\x67\x15\x9f\xad\xcb\x8b\x90\x64\xa9\xbd\xc8\xba\x6c\x65\x81\xf5" - "\xc9\xa2\xa5\xc4\x29\xe4\x16\x16\x2e\xb7\xd9\xc7\x30\x99\xd3\xfa" - "\xe4\xf2\x7c\xfb\x52\x1b\x5e\x8a\x72\x0b\x72\xac\x62\xd4\x8b\x50" - "\x54\x7e\xbe\x55\xab\xa1\x28\x6f\x49\x21\x4d\x84\x82\x9f\x22\x51" - "\x44\xfe\xa1\x7c\x44\x2c\xd9\xb1\xa2\xbd\xa7\x47\xf9\xc1\xd8\x26" - "\x23\x60\x5d\xbb\x7b\x36\xe9\x32\x20\x1c\x2b\x78\xcb\xaa\x74\x71" - "\xee\xf3\x0c\xfa\xd8\x3b\xd5\xd9\xde\x57\x95\xb1\x56\xef\x1b\xd9" - "\x8d\x17\x76\x13\xc9\x26\xa7\x92\x71\x51\xdc\xd1\xc3\x7a\x10\xba" - "\x2e\x55\xe9\x1e\x09\x8b\x8c\xc6\x48\x9b\xdb\x52\xa7\x27\xe3\x3d" - "\x79\x66\xf2\x03\xba\x03\xc2\x34\x3b\xf7\x0a\xf2\x84\x28\x8f\xba" - "\x69\xc7\x02\xe4\xf3\x85\x79\x94\x8c\x66\x4a\x2f\xd2\x55\x65\x4c" - "\xe0\xe3\x6a\xb1\x37\x65\xec\xa1\x76\x8d\xb0\xcf\x58\x2f\xa0\xdc" - "\x77\xc1\x9d\x7c\x2b\x91\xa5\x5c\xd8\xe8\xec\xea\x4b\x78\x9a\xf5" - "\x57\xb2\xd1\xfd\xd8\xdb\x02\x06\x36\xf9\x22\xe6\x45\xf1\x2d\x2c" - "\x6a\xd5\x03\xcc\xd0\xf0\x44\x03\xd9\x7d\x65\x2d\x0b\xb6\x30\x0f" - "\x76\x41\x4f\x60\x0f\x6b\x71\x77\xb0\x23\xc1\xdd\xd2\x27\x43\x09" - "\xf1\x18\x0f\x3d\x45\xb6\xa8\xca\x56\xf1\xd0\xbe\x3f\xf9\x46\xed" - "\x3d\xdd\x40\xbe\x14\x26\x7b\x82\x9f\xb9\x3d\xa5\x3b\x99\xc7\xe1" - "\x71\xd3\x1d\x7d\xc0\xed\x91\xd7\xf0\xed\xaa\x16\xe4\x7b\x90\x8d" - "\x46\xf8\x07\x54\xc7\xda\xcd\xbc\xfd\x17\xe3\xf9\xf1\x5f\x6c\xe6" - "\x5e\xcc\x29\xf2\x8d\xd0\xb5\x7e\x3c\xef\x5e\xaf\xd9\x9b\xa3\x79" - "\x6a\x5b\xc1\x2c\xa7\x95\x1f\x74\x09\x59\xc8\x3c\x11\xbe\x0e\x61" - "\xb1\xff\x7b\x1c\x9b\x29\x3c\xe1\xb4\xf2\x50\x8c\x0c\x6f\xa7\xf0" - "\x44\x84\x2d\x32\xfc\x16\x85\x93\x10\x4e\x91\xe1\x56\x26\xef\xab" - "\x3f\x34\x5b\x86\x8f\x51\x18\xb0\x7f\x68\x81\x7b\x05\xb5\xf7\xaf" - "\x18\xb3\x87\x1e\x2e\xfb\x14\xbc\xaa\xe3\x94\x58\x0f\x87\x9c\x79" - "\x24\xab\xc1\x7a\xf8\xc1\x47\x57\x1f\x27\x3e\xf7\x21\x47\x74\x2a" - "\x3d\x7f\x50\x6a\x0a\xb0\xd1\xa0\x1b\xaf\xc6\xb7\xfb\x09\x76\xc3" - "\xd2\x31\x7b\xcb\x26\xa7\x07\xb9\x9b\x3f\x9f\xdf\xc5\x37\xd5\x64" - "\xf0\xe7\x0b\xe8\x2c\x1f\x7b\x5d\xa9\xb9\xa1\x24\x20\x6c\xef\x82" - "\x56\xc7\x1a\x7a\x48\xe8\xce\xf8\x40\xfb\x8e\x60\x8b\xd3\xcc\x37" - "\x95\x67\x80\xa7\x6c\x7f\x20\x25\x48\x7a\x89\xa0\xf7\x7f\x78\xff" - "\x9b\x79\x44\x3b\x6c\x3a\xac\xee\x2c\x48\x55\xcb\x32\x19\x4f\xce" - "\xef\x7a\x20\x8f\xbb\xb1\x8f\x29\x52\x86\xce\x3f\x43\xfd\x9f\x89" - "\x7a\xa7\xe6\x77\xa9\x2b\xf3\xc8\x9f\x94\xc0\x2f\x4e\xda\xd3\x57" - "\x00\x9f\x3c\x9d\x69\x0a\x6d\xda\xe4\x7e\x33\xef\xe4\x95\xf9\x66" - "\x53\x7e\xb8\x60\x44\xfd\x27\xb4\x29\xc4\x33\x59\x10\xf5\x04\xd1" - "\x57\xa2\x1f\xf6\xaa\xcd\x06\xd0\x31\x5d\x2f\x3e\xda\x3e\x8a\xaf" - "\xcc\x34\xa1\x4f\xb7\x78\x52\xce\xb3\xd6\x7e\x5a\x2b\x8b\x62\xde" - "\x74\x30\x36\xdf\x11\x74\x9b\x7c\x42\x47\xce\x6c\x7b\x82\x5d\xcf" - "\xc7\x95\x67\x9c\x56\x16\x65\x3e\x58\x8a\x3e\xa0\xef\xaf\x75\xb4" - "\x1b\x55\xf4\x63\xa6\x84\x1b\xe5\x9b\x03\xd8\xb6\xeb\x3c\xce\x95" - "\xb5\x7f\x91\x98\x37\x6a\x51\x26\xa3\xbb\x83\xfb\x40\xb3\xa8\x03" - "\x99\x26\x15\xfb\x11\x7d\x7b\x33\xe5\x0c\xa3\x3a\x25\xac\x17\x49" - "\x3f\xaf\xc9\x80\x33\xea\x27\x5b\xc5\x3a\x5c\x91\x76\x4e\x68\x20" - "\x6f\xf8\xf1\xdf\xbc\xc9\x85\xf6\xb5\xf1\x4d\x73\x87\xb7\x35\xbd" - "\x79\xee\x21\x6d\x7e\xc4\xe0\x67\xe1\xbf\xde\x9d\x81\x39\x90\x22" - "\xfc\x7d\x6e\x5e\xe7\xd6\xe5\x45\x58\x6f\x98\x23\x8b\x3e\x6a\x70" - "\x76\x0d\x6f\xab\xd5\xf5\x81\xf4\xb3\x36\xea\x33\x6e\x0a\x91\xff" - "\xe0\xf3\x64\xf7\xba\xeb\xcd\x14\xff\x15\x8e\xe9\xc3\x5f\xf3\x79" - "\x14\xe9\x3b\x76\xfe\x37\xf9\xc0\x15\x96\x97\x3f\xe2\x1c\xd9\xf9" - "\xff\xd8\xfb\xfa\xb8\xa8\xca\xbc\xfd\x9b\x01\x0d\x0b\x75\x34\x70" - "\xd1\x35\xc3\xd2\x76\x34\x4d\xdc\xa7\x5c\x2d\x7d\x16\xdf\x4a\xcd" - "\x17\x6c\x65\xa3\x44\x43\xc3\x16\x0c\x0c\x0d\x15\x11\x06\xa4\xec" - "\xa7\x86\x80\x0a\x2e\x1a\x0a\xf6\x68\x8b\x26\xbe\xf4\xd4\xb3\xda" - "\xaa\x8d\x9b\xee\xfa\xc2\x9b\x3d\x58\x68\xa8\x23\xa1\x91\xa1\x8d" - "\x38\xca\x80\x33\x73\x7e\xdf\xef\xb9\xcf\x70\xce\x99\x39\x67\x98" - "\x33\x82\x62\x8f\x7f\xf0\xd1\x39\xe7\xcc\x3d\xf7\xb9\xbf\xd7\xb9" - "\xee\xeb\xfa\x9e\xfb\x05\xda\xc5\x77\xb4\xbe\x91\x19\xe3\x41\x7d" - "\xc8\xab\x5d\xb0\xad\xcc\xd0\x8f\x24\x9c\x26\x2a\x13\xf4\x97\x3b" - "\xfe\xbc\x42\x35\x00\xfa\x19\x0b\x68\x81\xe3\x65\x47\xc8\x94\x89" - "\x24\xb9\x38\xb2\x8e\xd8\xf6\x4f\x83\x7e\x2d\x78\xfb\x9f\x0d\x2a" - "\x7c\x8f\x85\xfb\xa5\xb1\x9e\x7d\xfd\xba\xcc\x4f\xbf\x35\xa1\x8f" - "\x4d\x29\xfc\xd6\xa0\x32\xdf\x08\x0d\x60\xd7\xdd\x06\x2f\x91\x1c" - "\xc9\x58\x9b\xde\x6d\xe1\xde\x0c\x99\xef\x46\xe2\x7e\xd4\x27\x83" - "\xcb\xd8\xf9\xdc\x27\x43\x8f\x90\x93\x95\x39\xa4\xa8\xfa\x1c\xce" - "\x41\xdc\x72\x32\x34\x13\x35\x65\x27\x33\xe8\xc6\x8f\x40\x37\xc2" - "\xf3\xda\xc1\xaa\x3e\x5d\x63\x7b\xbf\x85\xef\xba\x6c\x9a\xd1\x0c" - "\xcf\x68\x2e\xb7\x87\x9a\xf9\x83\x10\x92\xcb\xbd\xeb\xc2\xbd\xd5" - "\x36\x2e\x22\x7d\x36\xaa\xac\xa1\x52\xef\xb6\x3a\xcd\x67\xd7\x7b" - "\xf1\xb7\x76\x39\x5d\x63\xdb\x63\x6d\xf2\xfc\x00\xf2\x0f\xb8\xf7" - "\xa3\x1a\xa5\xcf\xe4\x9f\xd9\xb1\x83\x66\xc0\x9d\x19\x30\x67\x86" - "\xf6\x84\x18\x14\x41\xdc\x24\xfd\x98\x2d\x06\xb7\x93\x6d\x31\x08" - "\xdd\xc2\xc6\x00\x7c\xdc\xd2\xd7\xb8\x18\x9c\x85\x18\x54\x43\x0c" - "\x52\x49\xca\x89\x69\x45\x64\x4a\x30\xc4\xa0\xb6\x0e\xd7\x6c\xa7" - "\x7b\xd8\xc5\xd1\xb6\x67\x63\x71\xd6\xa0\x2a\x31\xd2\x18\xec\x7c" - "\x9d\xc6\x60\xd7\xeb\x06\xd0\x31\xd1\x41\xdb\xe1\xb3\x65\x71\x68" - "\x00\xee\xc7\xc3\xa4\x86\xe3\x7e\xdb\x34\x16\xb7\x21\x16\xb7\x69" - "\x2c\xb4\xf3\x21\x16\xe5\x15\xec\xba\x2f\x27\x2b\x8b\x48\x51\x78" - "\x3e\x29\x06\x5e\x82\x58\xcc\xc2\xb8\x60\x8e\xc1\xb2\x54\xd3\x75" - "\x43\x02\xf1\xcd\x4d\x20\xfe\xb6\x78\x58\x6f\x43\x3c\x12\x20\x1e" - "\x8d\x10\x0f\x53\x53\x3c\x7c\xd9\x78\x5c\xe5\xe2\xd1\x88\xe3\xe6" - "\x20\x1e\x8d\x10\x8f\x46\x88\x47\x2a\x8d\x07\xf2\xfc\x64\x63\x67" - "\xc6\xfa\xb3\x86\x6c\xbe\x22\x11\x8f\xa5\x5c\x3c\xce\xba\x13\x8f" - "\xd0\x68\xc7\x78\xbc\x1a\xdc\x5c\x3c\xf8\x67\xe2\xf5\xb1\x18\x8f" - "\xdb\xf9\xdc\x33\xf1\x14\x3e\x13\x29\xaa\xa7\xa1\x2f\xc2\x36\x3d" - "\x5e\x76\x80\x7d\x26\xe0\x5e\x53\xb6\xff\xd9\xa4\x2a\xaa\x86\xb8" - "\x44\x30\x34\x4f\xc0\xc5\x85\xc6\x23\x3d\xb8\xe0\x5b\xda\xfe\x01" - "\x13\xb0\xcf\xc0\x67\x03\xe3\x03\x71\x82\xe7\x47\x6a\xff\x41\xe1" - "\x3b\x60\x28\xd3\x8a\xcf\x09\x3e\x23\xf8\x3c\x14\x47\x9e\x63\xf7" - "\x73\x3f\x19\x7c\x8c\xe0\xbb\xe0\x93\xa1\x07\x20\x56\x39\xc4\xb2" - "\x18\x62\xb3\x08\x9e\x13\x0f\xd2\x1b\xf7\x21\x3c\x19\xba\x02\xf5" - "\x82\x1a\x30\xdf\xc1\x02\x71\xb2\xd4\xfb\x3f\x9c\x06\x3e\x2b\x6f" - "\x11\xff\xdc\x6c\xe6\xf6\x5c\x66\xda\x87\xe0\x9c\x7c\x2f\x33\xc4" - "\x08\x9e\x1d\xd1\x33\xd3\xb4\x17\xf3\x0f\x1a\xb2\xa9\x8a\x78\x77" - "\x8c\xa2\x31\xb2\x08\x9e\x99\x49\x51\xf8\xcc\xa4\x40\x8c\x4e\x2b" - "\x8c\xd1\xeb\xec\x38\x28\xf0\x9f\x99\x8c\xdf\x68\x3d\xf4\x93\x10" - "\xa3\x50\xbd\x5c\x8c\x2c\x5b\xa3\xbd\x2d\xea\x04\x7c\x87\xfd\xb8" - "\xf5\x9d\x69\x1e\x56\xf0\x50\x8d\xe0\x5d\x4f\x1a\xcc\x24\x71\x06" - "\x51\x25\x9c\x23\xed\x4b\xa7\x7d\x43\x4a\xf5\xfb\x08\xae\xc3\x8c" - "\xb9\x6f\xdc\x8f\xa1\xd4\xbc\x0f\xf8\x2a\x4f\x87\x9f\x37\xb1\x9f" - "\x0d\x64\xe9\x0c\xe2\xc9\xee\x4f\x1a\x9a\x4f\xd2\x00\x9f\x85\xaf" - "\xe7\xab\xac\x59\x29\x05\x8c\x1a\xf7\x91\x21\x3a\x9c\x13\x95\xbc" - "\x84\xf8\x14\x47\x16\xe1\x5a\x74\x17\x70\x6d\xe1\x12\x23\x94\x69" - "\x60\x1a\x2d\xd0\x67\x6c\x4e\x65\xf6\xe1\xda\xfa\x83\xb0\x8f\x60" - "\xd7\xc9\x98\xde\x1b\xb5\x08\xe6\x00\x75\xda\x8d\xa0\xbd\xa6\xb3" - "\xe3\x09\xe1\x98\x47\xf1\x5c\x1c\xbb\x31\x33\x1b\xeb\x45\xf3\xf1" - "\xf4\xdf\x41\xb8\x8f\x63\xb7\x7c\xcf\x83\x5a\x83\x57\x26\x78\x62" - "\xd0\x68\x58\xce\x7c\x86\xfa\x43\x4d\x69\xb9\x89\xcd\xc5\x1a\x92" - "\x23\xdb\x67\x26\xe0\x3a\xbe\xb8\x4e\x3f\xf6\xd9\x33\xc7\xe2\x1e" - "\xcb\x80\x59\x0d\xd3\x2d\x4d\xb7\x67\xb6\x41\xc5\xf7\xcb\xd3\x73" - "\x01\xb7\x9a\xb1\x1a\x26\x19\xf7\x33\x38\x04\xf7\x85\x3e\x68\x47" - "\x95\x89\xe5\x94\x4f\x67\xaf\x50\x61\xae\xc8\x04\xfc\x50\xf4\xed" - "\x67\xec\x9e\xb1\x97\x3d\xc2\x0a\x4f\x84\x9a\x09\xfe\x7e\x48\x3f" - "\x7c\xdf\x32\x5d\xdf\xa0\xba\x10\xd0\xd0\x3e\x24\x2c\xb9\x9a\xdf" - "\x2f\x53\xb8\x2f\x26\xf2\x4c\xe1\x6c\x28\x13\x79\xa6\x2a\x45\x45" - "\xb9\x25\x08\xf3\x95\xde\xf6\xdc\x52\x5c\x7b\x95\x68\x01\xc7\xc5" - "\x91\xf9\xec\x9e\x13\x9d\x80\xdf\xad\x4b\x81\x4f\x6e\x6b\xba\x6e" - "\x02\x3e\x41\x1e\xd8\x0c\xfc\x61\x5d\xea\xff\x70\x7a\x23\x19\x60" - "\xe3\x11\xd4\x5e\xf8\xef\x0c\xc0\x68\xe7\x63\x70\x0c\xe2\x64\x05" - "\x5e\x07\x3e\xd1\x7c\x94\x40\xfa\x7c\x04\x18\xdd\x84\x3c\x02\xba" - "\x78\x72\x2c\xf0\xc8\x62\xe0\x91\x45\xec\xbe\xc5\xfe\x9b\x55\x94" - "\x3f\xbe\xac\x5a\xa1\xca\xb4\xed\x5b\xce\xb6\xef\x8c\x91\x25\x88" - "\x8f\xf0\x14\x76\xce\x9b\x05\xfb\xa7\xa5\xa1\x9e\x25\x46\xc0\xc8" - "\xfa\xbc\x3d\x78\x8c\x7d\x6e\x17\x47\x3e\x6c\xa5\x58\x0b\xc2\x36" - "\xc9\xbb\x46\x02\xd9\xbd\x3d\x7f\xf1\x7f\x38\x63\x1e\x19\xb0\xf9" - "\x1a\xe9\xb3\x79\x1e\xd1\xc0\xf3\xaa\xda\x0c\x75\x98\x39\x5f\x4d" - "\xd8\xbd\x1d\xda\x87\x44\xc0\x71\xc9\xbd\x1d\x40\x57\xfb\x6f\xc6" - "\x67\xe6\x1d\x4d\x53\x9d\xcc\x99\x7b\x53\x2c\xd0\x76\x74\x2d\xa6" - "\x19\x74\xfd\x3d\xf5\x9b\xa1\x54\xe7\xcf\xe0\xd6\x19\x8e\x0c\x03" - "\xaf\xf2\xd0\x15\x8f\x19\xcb\x98\xb5\xb1\xc1\xb1\x09\xb8\xa6\x31" - "\x77\x0e\xb4\xa7\x15\x62\xf5\x4c\x0a\x49\xb1\x76\xa9\x04\x9e\x00" - "\xed\x84\x6b\x2f\x2b\x7a\x0e\x67\xe4\x60\x59\x96\xcc\xbd\xef\xe3" - "\xfd\x5a\xd7\xee\x4d\xcb\xbb\x42\x02\x99\xb7\x21\x1e\x73\xe1\x5e" - "\xaf\x90\x3e\xb9\x57\xe0\x5e\x17\xd3\x7b\xb5\xed\xd3\x6e\x4d\xbd" - "\xa0\x81\x73\x4e\xf7\x45\x32\xbc\x8d\xfb\x22\x85\x6b\x80\xc3\x1e" - "\x65\x9e\x20\xa4\xb8\x96\x5d\x07\xa3\xbe\xd4\x7c\x8e\xe0\xef\x62" - "\xfe\xa8\xb4\x8e\xc5\xf4\x42\xc4\xb2\x35\x7f\x47\xf0\x1b\x95\x80" - "\xed\xfa\x48\xcc\xa5\x05\x1f\xaa\x32\xe0\xba\x13\xac\xe6\xd3\x7b" - "\x4c\xdf\x8a\x3a\xed\x2b\x38\x86\xd8\x17\x60\x7e\x2b\x62\x1e\xcf" - "\xb3\xb8\x87\xef\x95\x56\x5e\x22\x58\x9e\xb0\x1c\x8c\xbf\xad\xac" - "\xcb\x1e\x6f\xbc\x86\x65\x21\x16\x30\xcf\x83\xcf\x1a\x8d\xfd\x3e" - "\x1c\x6f\xee\xcf\x74\x4b\x0d\xa4\x9f\x0d\xb8\x9e\x89\x1a\x31\xc0" - "\x62\x05\xf8\x1b\xd7\x49\x65\x98\x50\x4f\xc0\x19\xd6\xf3\x61\x88" - "\x77\xa0\x0d\x17\x70\xcc\xd7\x1e\x1b\x9d\x96\xa9\xd1\xd3\xf8\xe2" - "\xff\x5d\xc5\x87\xb2\xf8\xbd\x11\x2a\x3b\x96\xae\x4f\x34\xc6\xe2" - "\x71\xe4\x4d\xcb\x0d\x01\x67\xd6\x52\xce\x44\x4e\xb2\xf1\x26\xcb" - "\x4d\xec\xda\xfc\xfb\x70\xdc\x6d\x24\x5b\x47\x85\xbc\x59\x5c\xcb" - "\xf3\xe6\xe4\x58\x01\x6f\xd6\x32\x8d\xa0\xdf\x25\x78\x33\xfc\x35" - "\x31\x6f\x86\xcf\x10\xf3\xe6\x9b\x87\xed\x79\xd3\x91\x33\xc3\x37" - "\x49\xf1\x25\xf8\x98\xc7\xaf\x78\xbc\x19\x2b\xcf\x95\xe1\xc7\x94" - "\x73\xe5\xac\x33\x62\xae\x9c\xe5\xf3\xeb\xe5\xca\xd9\x31\x22\xae" - "\x54\xbb\xc8\x95\x57\x58\xae\xf4\x65\x7e\x86\x67\x82\xe3\x8f\xcd" - "\x73\x65\xb8\x72\x6e\x33\xcf\xc2\xdb\x72\x5c\x39\xfb\xa8\x98\x2b" - "\x67\x9b\xc4\x5c\x39\xbb\x90\xe7\x4a\xee\x5c\x8b\x70\xe5\xec\x23" - "\xf7\x86\x2b\x67\xb3\xeb\x9c\x97\x5e\x43\xae\x7c\x73\x4b\xf3\x5c" - "\x19\x5e\x26\xcd\x95\x70\x9c\xe5\xca\xf0\x32\x9e\x2b\xcf\x35\xc3" - "\x95\x11\xcb\x15\x70\xa5\x2f\xcb\x95\x6a\x19\xae\x9c\x0b\x6d\xc5" - "\xe1\x82\xc5\x9e\x1d\x36\x38\xae\xf4\x6f\xe2\x4a\x17\xf0\xa1\x2c" - "\x7e\x11\xef\x3b\xe3\x4a\x6b\x26\xd5\x97\xc8\x95\x4c\x37\x8e\x2b" - "\xa3\xcd\x24\xe1\x0c\x70\x64\xf9\x15\x76\x0f\x0f\x76\x8c\x30\xfc" - "\x25\xbe\x86\x5c\xb4\xba\x6c\x17\xb4\x57\xa9\x7e\x0f\xcb\x4d\xec" - "\x3c\xaf\x89\xc8\x55\x7b\xe0\xda\x9c\x26\xdd\xc9\x72\xe7\x19\x8e" - "\x3b\xc3\x38\xee\x9c\x79\x07\xdc\xf9\x3a\xc6\x72\x4e\x76\x83\xca" - "\xc6\x9d\x6b\x81\x3b\xe7\xb0\xfa\x01\xdf\xed\x52\xee\x8c\xea\x62" - "\xab\x17\xe6\x34\x4b\xe3\x36\x12\x5a\xaf\x3a\x47\x1e\x9d\xc0\x96" - "\xf7\x93\x6e\x6e\x2d\x69\xe2\xd2\x30\x9e\x4b\x2f\x7b\x44\x1e\x96" - "\xe7\xd1\xb7\xd4\x4d\x3c\x9a\x0a\x3c\x7a\x5e\xc0\xa3\xe0\x9b\x3e" - "\x45\xce\x03\x1e\xad\x67\x79\xf4\x4b\x8e\x47\xff\xd2\xfb\x44\x18" - "\xf0\xe8\x04\x1b\x8f\xbe\x35\xcd\x94\x7a\x21\xc0\xf4\x41\xf3\x3c" - "\x5a\xcf\xf2\x68\x6c\xeb\xf3\xe8\x11\x3b\x1e\x05\xef\x8a\x7b\xb5" - "\x4b\xf2\xa8\x0d\x8f\x2c\x8f\xa6\xf0\x3c\xca\xb6\xeb\x5f\x0e\x96" - "\x84\x43\xbb\x87\xc7\xb2\xde\xad\x89\x47\x63\xf7\x50\x1e\x85\x63" - "\x6c\xfe\xe4\x5d\xe0\x51\xc0\x5f\x72\x31\xdc\x37\x3c\x2f\x50\x47" - "\x35\xf2\x6b\x1e\x3c\x33\xd8\x46\x4d\x7c\x3a\x17\x9e\x19\xe4\x98" - "\x1b\xf0\xcc\x00\x8f\xce\xbc\xa9\x26\xec\xf3\xf2\x01\x3c\x2f\x57" - "\x64\xf6\x15\xb3\x8d\xe3\x95\xe5\xd3\x48\x3f\x31\x9f\x46\x8e\x13" - "\xf3\xe9\x5f\x2c\x3c\x9f\x72\xe7\x90\x4f\x21\x66\xd6\x35\x95\xde" - "\xc8\xa9\xee\xf1\x69\xa4\x6f\x13\x9f\xaa\x38\x3e\x9d\xdb\x3c\x9f" - "\xb2\xef\x06\x65\xf8\x54\xc8\x0d\xf2\x7c\x1a\xe9\xcb\xf3\x69\xe4" - "\xf5\x26\x3e\xad\x90\xe3\xd3\xb7\xfc\xa5\xf9\x14\x8e\xb3\x7c\xfa" - "\x96\x7f\x13\x9f\x56\x48\xf0\xe9\x04\x21\x9f\x46\x5d\xa4\x7c\xba" - "\x87\xae\xbb\x01\x9c\x5a\x62\x04\x7c\xe0\x33\x17\x97\xc3\x72\xaa" - "\x15\x38\x15\xf7\x5a\xc5\xbd\x66\x70\x6c\xbe\x14\xa7\x52\xce\xd5" - "\x13\xe4\x55\x7c\x36\x93\x27\x81\xdf\x85\xbe\x08\xda\x84\xed\x7b" - "\x6d\xed\x97\x27\xe0\xd7\x37\x96\xa8\x51\xdb\x89\xb0\x62\xb5\x61" - "\xe5\x86\x06\xc7\x16\x8b\xb0\xa2\x2c\x96\x51\x7a\x39\x6e\x95\xf3" - "\xee\x27\xd0\xbb\x87\x10\xd5\xd2\x10\xe0\xd7\x50\xf4\xee\x05\x76" - "\xde\xbd\xc0\xd1\xbb\x9f\x76\xce\xa3\x8a\xbc\xfb\x9f\x31\x86\x73" - "\xcf\x89\x79\x74\xee\x45\x31\x8f\xce\x9b\x81\xf5\xa2\x3c\x5e\x20" - "\xed\xdd\xd9\xe7\xfc\xed\x81\x4d\xde\xbd\x42\xcc\x9f\xbc\x77\x9f" - "\xd7\x51\x9e\x47\xdf\x0e\x15\xe9\xd1\x99\x1c\x8f\xce\xe6\x78\x74" - "\x36\xcf\xa3\x27\xbf\xb1\xe9\xd1\xe8\x85\xc7\x2b\x84\x3c\xfa\x76" - "\x6e\x13\x8f\x56\x3a\xf2\xa8\x8d\x43\x91\x4f\xb1\x1c\xcc\x65\xed" - "\x04\x9e\xde\x3d\x3b\x56\x45\x73\xb5\xe1\xd8\x76\xde\xf6\xb9\xda" - "\xe2\xda\x9b\x44\x1b\x86\x7c\x9a\xc3\xf2\x69\x67\x0f\x32\x0b\xb8" - "\xaf\x13\xce\x45\xc8\xc5\xf7\xfa\x8b\xe8\x5e\x4d\x98\x5f\xb2\x2e" - "\xa6\xfb\x1e\xda\xf2\x4c\x70\xbf\xec\xfb\xfc\x19\xe7\x38\x4e\xc5" - "\xfd\xcc\x01\x73\x1f\xdd\x02\x4e\x5d\x24\xa1\x4d\x97\x02\xa7\x26" - "\x08\xb4\x29\x3c\xfb\x5f\xce\xb6\xe7\xd4\x98\x0e\x25\x88\x15\xe4" - "\x54\x91\x8f\x2f\x68\x03\x3e\x3e\x66\x96\x98\x4b\x63\xb2\xc4\x5c" - "\x1a\x33\x9e\xe7\x52\xee\x5c\x8b\x68\xd3\x98\xf0\x7b\xa3\x4d\x63" - "\xc2\x79\x1f\x3f\x6f\x44\x13\x97\x96\xcb\x71\xe9\xdb\xe1\xd2\x5c" - "\x0a\xc7\x59\x2e\x7d\x3b\xbc\x89\x4b\xcb\x25\x7c\xbc\x88\x4b\xdf" - "\xe9\x4d\xb9\xb4\x80\x6a\xd3\x0a\x9b\x36\x2d\xb8\x0f\x7d\xfc\x3b" - "\x01\x4a\x7d\xfc\x89\x5a\xca\x9f\xc8\x4f\x36\x0e\xe5\x7d\x7c\x81" - "\xbc\x8f\x6f\x86\x43\x15\x69\x51\x96\x43\x63\x7b\x8b\x39\x34\xb6" - "\xaf\x98\x43\xdf\xcd\xb6\xe7\x50\x47\xfe\x8c\x9d\x23\xc5\x9d\xd4" - "\xc7\xbf\x3b\x46\x9e\x37\x63\x33\x95\xf3\xe6\xfc\x42\x31\x6f\xc6" - "\x96\xff\xdf\xe0\xcd\x05\x23\x45\xbc\xa9\x76\x91\x37\xef\x8a\xa7" - "\x5f\x60\x97\xff\x5c\x60\x97\xff\x5c\x20\xc8\x7f\x2e\x68\xc1\xfc" - "\xe7\x82\x7b\x94\xff\x5c\x90\xc3\x6b\xd0\x77\x17\x36\xcf\x9b\xb1" - "\x39\xd2\xbc\x09\xc7\x59\xde\x8c\xcd\xe1\x79\xb3\x39\x0d\x1a\xf7" - "\x9a\x02\xde\x6c\xe3\x9e\x3e\xce\x69\xfe\x53\xca\xd3\x23\x6f\xb2" - "\x7c\x59\x61\xe7\xe9\x43\x84\x9e\xbe\x80\xf7\xf4\xe3\x28\x6f\x95" - "\x9a\x33\xc5\x9e\xbe\xc5\x79\x74\x61\x94\xa9\x29\x1f\xba\x0a\x78" - "\x74\x21\xbb\x16\x8c\xa9\x29\x1f\x1a\x7f\xdd\x56\x2f\xea\xe9\xd7" - "\x12\x5a\x2f\x09\x4f\xcf\x8e\x1f\x5e\x78\xb0\xc9\xd3\x57\xd8\x7b" - "\xfa\xf8\x2d\xf2\x9c\xba\xb0\x5a\xd2\xd3\xa3\xff\x66\x39\x35\x96" - "\xe5\xd4\x5b\xeb\x85\x9c\xba\xd8\x83\xe5\xd4\x17\x6d\x9c\xba\x48" - "\x63\x82\x67\xd3\xd4\xbe\x79\x4e\xc5\x72\x78\x4e\x8d\xbc\x3b\x9c" - "\xaa\x73\x9d\x53\x85\xf3\x60\xbf\x84\x7b\x6f\xe2\x54\xb6\x8d\x17" - "\x6f\x2a\x09\x47\x4e\x8d\xb4\xf3\xf7\x05\xd2\xfe\xfe\x38\x51\x61" - "\xfb\xd8\xfc\x3d\xc6\x80\xe5\x9b\x56\xf5\xf7\x8b\x6f\x8a\xb9\x35" - "\x5e\x23\xe6\xd6\xc5\xe7\x78\x6e\xe5\xce\xb5\x88\xbf\x5f\x6c\xbc" - "\x37\xfe\x7e\xb1\x91\xe7\xd6\xf8\x53\xcd\x73\xeb\xc2\x5a\x69\x6e" - "\x85\xe3\x2c\xb7\x2e\xac\x75\xca\xad\x2f\x0a\xb9\x75\xc9\x61\x1b" - "\xb7\xf2\xfe\x1e\xf0\x81\xcf\x5f\x5c\xa6\xfb\xfe\x7e\xfc\xbd\xf6" - "\xf7\x4b\x74\x8a\xfc\xfd\x7a\xe0\x59\xf0\xe2\x4b\x4f\x81\xbf\x9f" - "\xca\xf9\xfb\xca\x7c\x3b\x7f\x9f\xef\xe0\xef\x13\xa7\x72\x9c\x0a" - "\xcf\x14\xcb\xa9\xb3\x0b\xdc\xf7\xf7\xaf\x60\x0c\x13\x0e\x8a\x39" - "\x35\xe1\xb0\x98\x53\xb5\x53\xb1\x5e\x94\xd3\xf3\xa5\xfd\x3d\xfb" - "\x9c\x2f\xed\x28\xf2\xf7\x50\x3f\x47\x7f\xaf\xf5\x10\x71\xea\x4c" - "\x21\xa7\x2e\x1d\x2a\xd2\xa9\x70\x5f\xc8\xa9\xdb\xcf\x53\x4e\xdd" - "\x71\x5e\xc0\xa9\x93\x77\x70\x9c\x9a\x18\x75\x7c\x9a\x90\x53\x97" - "\x26\xda\x38\x95\xe5\xcb\x99\x26\x55\x72\xa8\xe3\xb8\x13\x76\xbc" - "\x0f\x8e\x05\x82\xb2\x71\xbe\x18\x96\x59\x78\x3e\xb2\xf9\xf1\x26" - "\xa1\xd2\xe3\x4d\x4a\xe3\xf4\xa4\xa8\x3a\x93\x1d\x67\x92\x8b\xe3" - "\x4c\x96\x91\xde\xb9\x8d\x74\xfd\x01\x76\xed\x44\x99\xb5\x07\x66" - "\xbc\xc6\xf3\x2c\x8e\xc9\xfa\x08\xc7\x64\xdd\xa2\x63\x80\x20\xde" - "\x8e\xeb\x0d\xd8\x74\x13\xf0\xc1\xfe\xf3\xf6\x3c\x9b\x68\x29\x41" - "\xfc\x84\x45\xda\x79\xfe\xfc\x36\xe0\xf9\x93\x42\xc4\xfc\x9a\xb4" - "\x42\xcc\xaf\x49\x23\x78\x7e\xe5\xce\xb5\x88\x76\x4d\x9a\x76\x6f" - "\xb4\x6b\xd2\x34\xde\xf3\x6b\x07\x37\xf1\x6b\x99\x80\x5f\xcf\x0b" - "\xf9\x75\x69\x10\xcb\xaf\xe7\xed\xf9\x15\x8e\xb3\xfc\xba\x34\xa8" - "\x89\x5f\xcb\xec\x3c\xff\x79\x7b\x7e\x4d\xf6\x63\xf9\xb5\x32\xdf" - "\x4e\xbb\xe6\x37\xef\xf9\x2b\xdb\x9a\xe7\x4f\xf6\x55\xe4\xf9\x91" - "\x53\xa3\x29\xa7\x22\x67\xd9\x78\x95\xf7\xfc\xf9\xb2\x9e\xbf\x39" - "\x5e\x55\xa4\x55\x59\x5e\x4d\xf1\x13\xf3\x6a\x4a\x77\x31\xaf\xbe" - "\xb7\xc9\x9e\x57\x1d\x39\x35\xe5\x35\x29\x3e\xa5\x9e\xff\xbd\x89" - "\xf2\x5c\x9a\xf2\xbe\x72\x2e\x5d\xf6\x85\x98\x4b\x53\x8e\xfd\xdf" - "\xe5\xd2\xd4\xf1\x22\x2e\x55\xbb\xc8\xa5\x77\x25\x0f\x90\xba\x45" - "\xcc\xa5\xa9\xe5\x62\x2e\x4d\x5d\xc9\x73\x29\x77\xae\x45\xb8\x34" - "\x35\xff\xde\x70\x69\x6a\x3e\xaf\x55\xdf\x4b\x6a\x9e\x4b\x53\xd2" - "\xa4\xb9\x14\x8e\xb3\x5c\x9a\x92\xc6\x73\xe9\xb9\x66\xb8\xf4\xfd" - "\x59\x0a\xb8\x54\x9c\x07\xb0\xe7\xd2\x7b\x9e\x07\x78\x3f\x5c\x51" - "\x1e\xc0\xc6\xa5\x53\x1d\xf3\x00\xc8\xaf\x6c\x1e\x00\xda\xcb\xc6" - "\x61\x6c\x1e\x60\x0c\xe5\xb2\x52\xf3\x0a\x51\x1e\xa0\xe5\xb9\x75" - "\xf9\x7c\x53\x53\x3e\x35\x15\xb8\x75\x39\xbb\x46\xaa\xa9\x29\x9f" - "\xba\xb2\xa3\xad\x5e\x34\x0f\xb0\x8a\xd0\x7a\x49\xe4\x01\x46\xb1" - "\xe5\x1d\x15\xe5\x01\x04\x5c\x7b\xd9\x63\xc5\x41\x79\x9e\x5d\x5e" - "\x2b\xca\x03\x54\xf1\x3c\x7b\x0b\xc7\xa8\x03\x0f\xb2\x3c\xdb\x4d" - "\xc8\xb3\xff\xef\x31\x96\x67\x47\xd9\x78\xf6\x83\xc0\x7a\x78\x36" - "\xeb\x95\xf2\x2c\xce\x23\x38\x1f\x7e\x6f\x78\x76\x9f\x02\x9e\x15" - "\xe4\x06\xf6\x43\x7b\x34\xf1\x2c\xdb\xee\xff\x6f\x7f\x49\x18\xf2" - "\x6c\xb8\x5d\x6e\x20\x5f\x3a\x37\x70\xf4\x5e\xe4\x06\x56\x74\x11" - "\xf3\xed\x8a\x31\x62\xbe\xfd\x7f\x0d\x3c\xdf\x72\xe7\x5a\x24\x37" - "\xb0\x42\x7d\x6f\x72\x03\x2b\xd4\x3c\xdf\xae\xb8\xda\x3c\xdf\x2e" - "\x37\x4a\xf3\x2d\x1c\x67\xf9\x76\xb9\xd1\x29\xdf\x8e\x12\xf2\xed" - "\xca\x73\x36\xbe\xe5\x73\x03\xf9\x5c\x6e\x60\x45\xf3\xb9\x81\x4a" - "\x99\xdc\xc0\xd8\x7b\x9d\x1b\x58\x59\xa9\x24\x37\xd0\xb0\x9e\x8e" - "\xdb\x5f\x8a\xe3\xf6\x67\x00\xff\x06\x7f\x03\x6d\xd0\xfc\xb8\xfd" - "\x44\xdb\xf8\xd3\xf0\x1c\x8e\x67\x73\x24\x73\x03\x27\x6a\xe4\x73" - "\x03\x27\xca\x85\xe3\x4f\x57\x9d\x11\xbf\xb7\x5a\x75\xce\xf6\xde" - "\xea\xc4\xb7\xc8\xb3\xe9\xec\x9a\xdd\xd6\xac\x6c\x42\xd7\xf0\x4e" - "\xaf\xc6\x7a\x4a\x8d\xe3\xff\xd2\x2a\x7c\x97\xf5\xe1\xb0\xa6\x5c" - "\x41\x19\xf2\x6d\x0e\xb1\x32\x91\xed\x71\x0d\x71\x36\x57\xf0\x67" - "\xc4\x5e\x7a\xb6\x90\x77\x0f\x9d\x15\xf2\xee\x87\x11\x36\xde\xb5" - "\x00\xef\x1e\xac\xca\xa1\xf9\xd7\xd7\xe9\xd8\xd4\x9d\xaf\x0b\xc6" - "\xa6\x7e\xf3\x4f\x8e\x77\xd3\x66\x1d\xd7\xc3\xfd\x3b\x1b\x3f\x05" - "\xdf\xdf\x75\xd6\xd5\x31\xa8\x39\x92\x63\xa7\x38\x7e\x92\x1c\x3f" - "\x05\x75\x55\x6f\xe2\x9e\x55\x0b\x3c\xa7\x9b\x04\xe3\xa7\x72\x13" - "\xe0\x79\xe6\xe6\x95\x38\x1d\x87\xfa\x3a\x3f\x0e\x95\xc9\xca\x1a" - "\x8e\xfd\x9b\x35\x3b\x9b\x34\x32\x91\x9e\x8c\x6f\xd6\x70\xfc\xfd" - "\xdb\xb7\xa1\xdf\x19\x1d\xea\xc9\xf9\xba\x00\xe0\x9e\x4e\xb4\xdd" - "\xd3\x72\x2d\xd0\xd7\x58\xa0\xaf\xb1\x66\x65\x05\x98\x51\x9b\xac" - "\xcf\xea\x93\x0b\x3e\xcf\x9c\xca\xee\x69\xf8\x70\x3a\x78\xbd\x3c" - "\xf4\x79\xd7\xe0\xd9\x48\xd6\xa8\xb0\x3e\x36\x1e\xed\x5c\x03\xf7" - "\x71\xcd\xb9\x96\x33\xff\xc2\xf3\xa8\x6e\xc2\x09\xf8\xcd\xd5\x6b" - "\x4a\x10\xbb\xa1\xfc\x9c\x02\x56\x33\xcb\x8c\x95\xc5\xba\xd0\x75" - "\x1b\x01\x0b\x2d\x90\x93\x10\xd6\x47\xcc\xeb\xab\x7f\x12\xf3\x7a" - "\x7a\x4f\x31\xaf\xaf\x3e\xc5\xf3\x3a\x77\x0e\x78\x1d\xe2\xc6\xea" - "\x68\xcb\x1a\x77\x75\xf4\xea\x1a\x1b\xaf\x5b\x39\x5e\xdf\xec\x02" - "\xaf\x3b\xd5\xd1\x02\x5e\x92\xe7\xf5\xd5\x35\x7c\x4e\x22\xfd\xa8" - "\xe4\x18\xd9\xb3\x42\x5e\xff\x30\x9a\xe5\xf5\xb3\xf6\xbc\x0e\xc7" - "\x59\x5e\xff\x30\x5a\x76\x3e\xc1\x59\xfb\xf7\x69\x19\xdb\x59\x5e" - "\xaf\xe0\xc6\xc8\x96\x29\x98\x4f\x50\x41\x39\xdd\xc6\xe5\x98\xaf" - "\xba\xb7\x39\x89\x8c\x02\x25\x39\x09\x96\xcb\x6b\x29\x97\x23\x37" - "\xda\xf8\xdc\x95\xf9\x04\xcd\xf1\xb9\x4d\x37\x23\x9f\xcb\xe9\x66" - "\x31\x9f\x67\x6e\x17\xf3\x79\x66\xa1\x98\xcf\xb3\xb6\x8b\xf9\x3c" - "\xab\xc0\x9e\xcf\x1d\xb9\x3c\xd3\x22\xc5\xe3\xb1\x7f\xc6\x1c\x45" - "\x56\xa8\x3c\x87\xaf\xd1\x28\xe7\xf0\xb5\x7d\xff\xcf\x71\xb8\xda" - "\x9e\xc3\xd7\x86\x23\x07\x59\x3e\xb0\xe3\xf0\xb9\x1c\x87\x73\x3c" - "\x92\x77\x85\xd3\xc2\xf6\x1c\x5e\x0b\xf7\xd1\x8c\x1f\x37\xff\x6c" - "\xcf\xe1\xeb\x42\x44\x1c\xae\x6e\x86\xc3\xe7\xd2\x3c\x88\x68\x5c" - "\xae\x4c\x2e\x04\xee\x23\x62\x93\x8c\x36\xb7\xb5\x99\xb0\x3e\x62" - "\x0e\x5f\x57\x28\xe6\xf0\x75\x7a\x31\x87\xaf\xcb\xe6\x39\x9c\x3b" - "\xd7\x22\xda\x7c\xdd\xce\x16\xd7\xe6\x36\x7c\x38\xe5\xf0\x75\x3b" - "\x79\x6d\x9e\xb5\xb2\x79\x0e\x5f\x13\x28\xcd\xe1\x70\x9c\xe5\xf0" - "\x35\x81\xb2\xf3\x1c\x1c\x38\x3c\x3b\x4a\x01\x87\x8b\x73\x21\x36" - "\x0e\xe7\x72\x21\x79\x82\x5c\x88\x25\x95\xe6\x42\x36\x5d\xa1\xd8" - "\xe8\xe4\x41\x71\x0a\xf8\xf1\xdf\xac\x72\xee\xdd\x36\xb9\x95\x07" - "\xc9\x8e\x54\x92\x07\x61\xf9\x1b\xe7\x38\xbc\x06\xbc\x5d\xe6\xe2" - "\x1c\x87\x71\xb6\x39\x0e\x99\x32\x73\x1c\x38\x3e\x9f\x79\x07\x7c" - "\xce\xce\x71\x58\xbf\x44\x9c\x63\x5e\x9f\x64\xcb\x31\x53\x3e\xdf" - "\xb8\x5a\xcc\xe7\x1b\xd3\x9a\xe6\x3c\x00\xe7\x97\xc6\xae\x75\x98" - "\xf3\xd0\xc4\xed\x6c\x1e\x74\xfd\x39\xdd\x9f\xab\x49\x13\xbf\x87" - "\xf1\xfc\x0e\x65\x8d\x10\x71\x7b\x95\x90\xdb\xff\xea\x25\xe2\xf6" - "\xf3\x39\xe2\xf1\x11\x55\xb1\x02\x6e\xb7\xcd\x79\xc8\xf1\x38\x5e" - "\xd9\x0c\xb7\xc3\xf7\x5d\x9f\x23\xd6\xb2\xdc\x6e\x9b\xdf\x20\xc9" - "\xed\xc2\xf9\x0d\x82\xf1\x0f\xc8\xed\xec\xde\x1b\x7e\x76\xdc\xbe" - "\x34\x52\x65\xf9\x1a\x9e\x07\xe0\x75\x7c\x46\x2c\x0c\x70\x3b\xdb" - "\xde\x39\xc3\x85\xdc\x7e\x3b\x95\x72\xfb\x47\x57\xee\x9c\xdb\x9b" - "\xf4\xb0\x90\xdb\x5f\x44\x6e\xdf\x30\x8c\xce\xbf\x48\x71\x6d\xfe" - "\x85\xdd\xf8\x8c\x8f\x5c\xc8\xbf\x38\xe5\x78\x89\x7a\x89\x39\x7e" - "\xc3\x1a\x31\xc7\x6f\x38\x22\xe6\xf8\x0d\x4b\x78\x8e\xe7\xce\xb5" - "\x88\x4e\xdf\x90\x79\x6f\xf2\x2f\x1b\x32\x79\x8e\xdf\x18\xd3\xfc" - "\xdc\x8b\xbf\xfa\x48\x8f\xcd\x80\xe3\x2c\xc7\xff\xd5\xc7\xe9\xdc" - "\x0b\x51\xbe\xfb\xa3\x19\x92\x73\x2f\xca\xee\xde\xd8\x0c\x21\x56" - "\xec\xf3\x2f\xee\xe7\xbe\x3f\x0a\x53\x9a\x7f\xc1\xb9\x17\x4b\x4f" - "\x0b\xe6\x5e\x54\x36\x3f\xf7\x22\x31\xc4\xc5\xfc\x8b\x93\xb1\x19" - "\x27\x82\x85\xe3\xdd\x72\x5f\x13\xf3\x7b\xee\x8c\x26\x7e\x7f\x05" - "\xf9\x3d\x7f\xbe\x98\xdf\xf3\x63\xb1\x9e\x52\x73\x31\xbe\x14\xbd" - "\x57\xcc\xdd\x2f\x1e\xab\x61\x97\x7f\x79\x05\xb1\x97\xdf\x5b\xc4" - "\xef\xe7\x85\xfc\x9e\x5b\x2d\xa5\xdd\x31\xef\xcd\x8e\x29\x9e\x29" - "\x98\xd3\x36\xd9\x36\xfe\x6d\xd3\xd5\xe3\xa1\x70\xff\x7a\x99\xb1" - "\x6e\x33\xe9\x58\x37\x76\x6c\x1b\xe6\xc1\xa1\xac\xdd\x33\x63\x55" - "\xda\x70\xc6\x8a\x63\xdd\xec\xc7\xb9\xe1\xd8\x37\x1c\xeb\x56\x1c" - "\x99\x29\x3b\xce\x0d\xb1\x29\x37\xd6\x0d\xea\xed\xcb\x72\xfd\x45" - "\x8e\xeb\xb9\xb1\x6e\xb9\x8b\xf8\xb1\x6e\x22\xae\x97\x18\x3f\xbc" - "\xff\x7c\x8a\xb4\x8e\x4f\xe6\xb9\xbe\x11\x75\xfc\x0b\x76\xb9\x18" - "\x36\x06\x9b\x35\x77\x35\x17\xc3\x72\x7d\xde\x63\x25\x88\xe3\xb0" - "\x58\x89\x5c\x8c\xe3\x18\xe7\xbb\x97\x8b\xc9\x5b\x28\xe6\xf8\xbc" - "\x02\x31\xc7\xe7\xcd\xe0\x39\x9e\x3b\xd7\x22\x1c\x9f\x17\x77\x6f" - "\x72\x31\x79\x71\x7c\x2e\x26\x7f\xaa\xe4\xf8\x3b\x51\x8e\x3d\xb7" - "\x56\x3a\xc7\x9e\xcb\x8d\xbf\xcb\xad\x95\x9d\x13\xe2\xf0\x4e\x73" - "\xcb\x73\x34\xc7\xee\xc6\x9c\x90\xca\xb6\x96\x8b\xd9\xf2\xac\xd2" - "\x5c\x0c\x3b\xb6\xf9\x34\x8e\x0f\x51\x36\x27\xa4\x39\x6e\x6f\xd2" - "\xee\x4e\xde\x61\x8a\xb9\xfd\xe3\xe7\xc4\xdc\xfe\xf1\x30\x31\xb7" - "\x7f\x32\x52\xcc\xed\x9f\x04\xd9\x73\xbb\x23\xaf\x7f\xbc\x52\x8a" - "\xd3\x63\x5f\xc1\x5c\xcc\x36\x83\x3c\x9f\x7f\xfc\xb9\x72\x3e\xff" - "\xaf\x83\xff\xa7\xf9\x5c\x6d\xcf\xe7\xff\x65\xba\xab\x79\x19\x96" - "\xcf\xb7\x5e\x15\xf1\xb9\xba\x19\x3e\xbf\x6b\x79\x99\x6d\x63\xc5" - "\x7c\xbe\x2d\x5e\xcc\xe7\xdb\x06\xf2\x7c\xce\x9d\x6b\x91\xbc\xcc" - "\xb6\x31\xf7\x26\x2f\xb3\x6d\x0c\xaf\xd9\x3f\xe9\xdd\x3c\x9f\x7f" - "\x7c\x40\x9a\xcf\xe1\x38\xcb\xe7\x1f\x1f\x90\x1d\x4f\xed\xc0\xe7" - "\x7f\xf3\x50\xc0\xe7\x92\x63\x54\xda\x46\x5e\xe6\x6f\x44\x69\x5e" - "\x46\x6e\x9e\x0a\xf2\x3b\x3f\x3e\x45\x30\x4f\x25\xc8\x36\x4f\x25" - "\x45\x3c\x3e\xa5\xc5\xb9\xbd\xa0\x8b\x98\xdb\x0b\xfc\xc4\xdc\xbe" - "\x73\xb0\x98\xdb\x77\x06\xda\xea\x49\xf3\x32\xa9\x0e\xf3\x56\xc4" - "\x3c\x5f\xb0\x50\xf7\x4a\x35\x91\xe2\xfa\xcb\x1e\x9f\x5e\x94\xe7" - "\xf9\x82\x5c\x39\x9e\xc7\xf1\x2a\x9f\xce\x8c\x94\xe0\xf9\xed\xdb" - "\x7e\x0d\x3c\x2f\x37\x0e\x85\xf5\x41\xc0\xf1\xc8\xf7\x2c\xbf\x73" - "\x5c\x8f\x3c\x6f\xf9\x87\x54\x8e\x66\xbb\xbe\xb5\x78\x5e\x3e\x47" - "\xb3\xe3\x5c\x49\x18\xc7\xf3\xae\xcc\xa1\x39\x2c\xce\xd1\xe4\xce" - "\x6d\xed\x1c\xcd\xa7\xcf\x89\xf9\xfe\xd3\x48\x31\xdf\x7f\xfa\x18" - "\xcf\xf7\xdc\xb9\x16\xd1\xef\x9f\x3e\x7b\x6f\x72\x34\x9f\x3e\xcb" - "\xf3\xfd\xce\x2e\xcd\xf3\x7d\xc1\x56\x69\xbe\x2f\xe0\xd6\x66\x2b" - "\xd8\xea\x3a\xdf\x17\x36\xf1\xbd\xe3\xfc\x99\x14\xf7\xc7\xc8\x8c" - "\xbc\xd7\x39\x9a\x42\x59\xfe\x77\xb6\x3e\x86\xfb\x39\x1a\x6e\x4e" - "\xe2\x6c\xe9\xf5\x31\x8e\x3b\x19\x23\x73\xbc\x48\xc8\xf5\x85\x16" - "\xf1\x58\xc4\x5d\x1e\xb6\xb1\x88\xc7\x4b\x90\xeb\x3f\xeb\x27\xe6" - "\xfa\xcf\x34\x72\x39\x9a\xfd\x56\xe1\x98\xc4\x5d\x33\xc4\x39\x9a" - "\x7c\x71\x8e\x66\x32\x62\x6f\xef\x19\x79\xae\xdf\xb5\x42\x3c\x06" - "\x9c\xce\x51\xdc\x3e\x93\x1b\x03\x3e\x53\x30\x06\x7c\xc2\xc7\x1c" - "\xd7\xef\xde\x76\xac\xcc\x4c\x94\x8c\x43\xbc\xf3\xb1\xde\x2b\x24" - "\xc7\x20\xb2\x7d\x80\x93\x71\x88\x6f\x9c\x51\xe3\x98\x66\xcd\xe6" - "\x45\x82\x71\x88\x4e\xd6\x33\x16\xf1\xff\xcc\x58\x59\xfe\x6f\x60" - "\x78\xfe\xb7\xfe\x81\xcf\xdb\x58\x51\xe7\xb3\x71\xd9\xad\x6f\xad" - "\xbc\x8d\x54\x9e\x44\x37\x0a\xf9\x7f\xcf\x69\xaa\xf3\x23\xdb\x58" - "\xde\x66\xef\x40\x31\xef\xef\x0d\x17\xf3\xfe\x5e\x3f\x9e\xf7\xb9" - "\x73\x2d\x32\x16\x7d\xef\x80\x7b\xa3\xf3\xf7\x0e\xe0\xf3\x36\x9f" - "\x75\x68\x9e\xf7\x77\x65\x4a\xf3\xfe\xae\x4c\xca\xfb\xbb\x32\x9d" - "\xe6\x6d\x44\x63\x23\x3f\xbb\x7a\xc7\x79\x1b\x9b\xce\xbf\xe7\xf3" - "\x7a\x3e\xab\x55\x92\xb7\x69\x9a\x93\x7e\x47\x79\x1b\x69\xbe\xb7" - "\x69\xfb\xe3\x4e\xde\xb9\x8a\xf9\xfe\xbf\xaf\x8a\xf9\xfe\xbf\xaf" - "\x8b\xf9\x7e\x5f\x47\x31\xdf\xef\xf3\x91\xca\xdb\x88\xb9\xfe\xf3" - "\x91\x52\x3c\x1f\x3b\x19\xf3\x36\x7f\x3f\x20\xcf\xf1\x9f\x47\x2b" - "\xe7\xf8\x2f\x56\x3e\xe0\x78\x3b\x8e\x57\xdb\x73\xfc\x17\x47\xee" - "\xaa\xc6\x67\x39\xfe\x7f\xf6\x8b\x38\xbe\x05\x73\x39\xae\xcc\x27" - "\x91\xd7\xf6\x7f\xb7\x1b\xff\xfe\x77\xbb\xf1\xef\xff\x23\x18\xff" - "\xfe\xf7\x31\x2d\xc7\xf1\x7f\x6f\xf9\xf1\xef\x2e\x71\xfc\xdf\x05" - "\xe3\xdf\xff\x7e\xb5\x79\x8e\xff\x3c\x4e\x9a\xe3\xe1\x38\xcb\xf1" - "\x9f\xc7\x39\xd5\xf6\x22\x8e\xdf\x77\xaa\x35\x72\x39\xf7\x66\xbe" - "\xd1\x3e\xd9\x3d\xec\x94\xae\x3b\x22\x9b\xcf\x19\x6a\xcb\xe7\xc4" - "\xca\xe4\x73\x5a\x8a\xf3\xf7\x5f\x14\x73\xfe\xfe\x4b\x62\xce\x3f" - "\xe4\x27\xe6\xfc\x43\xbe\xe2\x7c\xce\x02\x87\x7c\x8e\x98\xff\xbf" - "\x1c\xab\x9b\x2c\xcc\xe7\xe4\x0b\xf2\x39\x07\x8f\xca\xf3\xff\x97" - "\xb2\xfc\x7f\x8b\xe5\xff\x70\x09\xfe\xff\xc7\xff\x11\xfe\x0f\xbf" - "\x03\xfe\xff\xc7\x3d\xe0\xff\x03\x87\x69\x8e\xc7\xc5\x75\x52\xf6" - "\x2b\xcf\xf1\xdc\x59\x3f\x70\xb0\xbb\xb8\x1f\x38\x38\x51\xdc\x0f" - "\x1c\xf4\xe0\xfb\x01\xee\x5c\x8b\xf4\x03\x07\xfd\xef\x4d\x3f\x70" - "\xd0\x9f\xef\x07\x0e\xde\x6c\xbe\x1f\xf8\x52\xa6\x1f\xf8\x92\xeb" - "\x07\xbe\x54\xd0\x0f\x1c\xba\x24\x9f\xe3\x89\x75\x3f\xc7\x33\xec" - "\x5e\xcf\x83\x3a\x54\xad\x28\xc7\xb3\x3e\xdb\x50\x84\x6b\xa4\x5c" - "\x24\xaa\xa5\xb3\x6c\x39\x1e\x9d\x5d\x8e\x47\xe7\x90\xe3\x59\x72" - "\x91\xe3\xff\x89\xdc\x7c\xd3\xc9\x77\xb0\x46\x0a\xbb\x9f\xf4\x57" - "\x17\xc5\xe3\xe6\xbf\x62\xf9\x9f\x5f\xbf\xef\xeb\xf9\x58\x2f\xda" - "\xff\xe8\x9c\xac\x81\xaa\x1b\x2c\xca\xe9\x4c\x94\x5a\x23\xe5\x6b" - "\xd1\xb8\x1b\xf1\x7c\x53\x5d\x98\x88\xef\x27\xd3\xf9\xa6\x3b\xa4" - "\xde\xd3\x36\xad\xc9\x7f\x38\x86\x5d\x93\xbf\x69\x2d\x3f\x5d\xbe" - "\x4b\x6b\x49\xcf\xe4\xd6\x92\x3e\x7f\x0f\xd6\x92\x76\x75\x4d\xfe" - "\xf3\xf6\xeb\xf7\xfd\xb3\x43\x69\x91\x8e\x94\x20\x46\xc2\xec\xd7" - "\x3e\xd5\x49\xcf\xdd\x57\x71\x73\xf7\xe7\xb5\xce\x3a\x28\x58\x1f" - "\xb6\xcf\xef\x5a\x49\x0a\xb5\x06\xb6\x3e\xb8\x77\x37\xd4\x75\x75" - "\x11\x60\xd5\x8a\x7c\xba\x00\xf9\xf4\x9f\x3a\xf6\xda\x8b\x80\x85" - "\xae\x91\xc1\x88\xe3\x74\x2b\xf1\x89\x5d\x84\xdc\xfa\x4f\x76\xdc" - "\x17\xc8\x08\xe0\x56\x7a\x5d\xd2\x45\xc6\x62\xe9\x1a\x1b\x0c\xf5" - "\x7f\x68\xd7\xbc\xb2\x76\x25\x7a\x23\x3c\x17\x57\xd8\xbd\x5c\x4b" - "\xcd\xf5\x3a\x8c\xc5\xa1\x79\x65\x5e\x0c\xf0\x6f\xde\x5b\xc4\x5b" - "\xd9\x73\xfa\xcf\x34\x56\xcf\x60\xbf\xd7\xb5\xd2\x07\xd7\x01\xb1" - "\x69\x2b\xeb\x2f\x7c\x7e\x6b\x13\xb4\x8f\x95\xa1\x7d\xdf\x1b\x51" - "\x94\x37\xe0\xf7\x34\xd0\x96\xec\x18\x5b\xe4\x0d\x76\x0f\x2b\xe0" - "\x8d\xcd\x75\xfc\x7b\x6c\x2c\x1f\xdb\x88\xe6\x51\xbe\xe6\xc7\xbf" - "\xe8\xe5\xb8\x55\x17\x21\xcd\xad\xba\x08\xca\xad\xba\x88\x26\x6e" - "\xd5\x4b\xe4\x51\x44\xe3\xd8\x8f\x70\xe3\x5f\x74\x76\x1a\x5b\x77" - "\x1f\xae\x8f\x72\x44\xd1\xf8\x17\x96\x4f\xa3\x29\x9f\x22\x5f\xd9" - "\x38\x95\xcf\xa3\xe8\x64\xf3\x28\xcd\x71\xaa\xa2\x39\xfc\x2c\xa7" - "\x1e\x7d\x4e\xcc\xa9\x47\x87\x89\x39\xf5\xd8\x7e\x7b\x4e\x75\xe4" - "\xd3\xa3\x4b\xa4\xb8\x94\xae\x8f\x72\x2c\x52\x9e\x47\x8f\x6e\x95" - "\xe3\x51\x76\x7c\xfa\x4c\xc1\xf8\xf4\x26\x1e\xfd\xd7\x17\x62\x1e" - "\x3d\x5a\xe3\x2a\x8f\xb2\x7b\x9b\x9c\xbf\x0b\x7b\x9b\xb8\xcd\xa3" - "\xb1\x76\x3c\xfa\xef\xa9\x3c\x8f\xda\xef\x6f\xd2\x0c\x8f\xce\x6d" - "\x9d\x35\x50\x44\x3c\x6a\x35\xb0\xf5\x09\x98\xc7\xd6\xf5\xb4\x98" - "\x47\x8f\x79\xcb\xf3\xe8\xbf\xb7\xf1\x3c\x4a\xaf\x6b\x5d\x1e\xfd" - "\x77\xb9\x88\x47\xe7\x0a\x78\xf4\x67\xde\x43\xe0\x18\x8b\x26\x1e" - "\x8d\x11\xf0\xe8\xdc\xe6\x78\xf4\xdf\xe5\xd8\x46\x54\xa3\x1e\xdb" - "\xd0\x3c\x8f\x1e\xdd\x29\xcd\xa3\x70\x9c\xe5\xd1\xa3\x3b\x79\x1e" - "\x95\xd0\xa8\x22\x1e\x3d\x9e\xa4\x80\x47\xdb\xf8\xda\x28\xc7\x13" - "\x15\xe5\x2a\xf8\x39\x9d\x8e\x6b\xa4\xce\x10\xce\x09\xda\x67\xb7" - "\xef\xc9\x3e\x87\x7d\x4f\x96\xd8\xe6\x78\x8e\xe3\x78\x75\xc2\x1d" - "\xf0\x2a\x3b\xc7\xf3\xc4\x6a\xf1\xd8\x93\x13\x6b\x6c\x63\x4f\x28" - "\xaf\x96\xf4\xb5\xd5\x8b\xdf\xf7\x64\x9f\x93\x35\x52\x4f\x5c\x14" - "\xad\x8d\x32\x4e\xb8\x36\x4a\xf1\x69\xf9\x35\x52\x4f\x7a\x8b\xd6" - "\x46\x39\x51\xd0\xb4\xef\x89\xfd\x1a\xa9\x3c\xc7\x16\x75\x67\x39" - "\xb6\x69\x0d\xaa\x93\x13\x9b\xd6\x48\x6d\x66\x5e\x10\x96\xb3\xab" - "\x2a\xb2\xf5\x39\x56\xa7\x80\x63\x45\xfb\x9e\xd8\xaf\x31\x55\x74" - "\xb0\xf4\xd8\x3e\x52\x12\xbe\x4f\x62\x6d\xd4\x7d\xf7\x74\xef\x13" - "\xac\x97\x34\xd7\x16\x8f\x14\x73\x6d\x71\x1c\x7b\xed\x39\x29\xae" - "\x2d\xee\xc2\x73\x2d\xbd\x2e\xe9\x9c\x1d\xd7\x56\xca\x70\x2d\xf4" - "\xab\x79\x97\x95\x72\x6d\x71\x10\xcb\xb5\xa9\x1c\xd7\x5e\x69\x69" - "\xae\x2d\x0e\xe2\xb9\xb6\xa4\x5d\xf3\x7b\x4c\x9d\x54\x4b\xcf\xcb" - "\x39\xa9\xa6\x5c\x7b\x52\xed\x74\x8f\x29\xd1\x98\x8f\x92\x9b\xb6" - "\x3d\xa6\xf8\x7c\xc0\x3e\x2e\x1f\x70\x3f\xef\x89\x52\x62\x54\x9a" - "\x0f\x38\x09\xde\x1d\xe7\x5d\x2e\xc5\x3d\xa7\xc2\x70\x4f\x94\x3d" - "\x76\xf9\x80\x3d\x8e\xf9\x80\xd7\x9c\x73\xac\xa2\x7c\x00\x3b\xef" - "\xb2\xf4\xba\x98\x63\x4b\x6f\x8a\x39\xf6\x7f\x57\xdb\xe6\x59\x62" - "\x7d\xe4\xd7\x4c\x2d\x1b\xd9\x94\x0f\xa8\x14\x73\x2b\x9f\x0f\xf8" - "\xdf\x11\xf2\x1c\x5b\x26\xce\xff\x4e\x28\x10\xcd\xb3\xdc\x51\x25" - "\x5c\x87\xda\xb6\xfe\xd4\xa9\x95\xc7\xcb\x85\x1c\x5b\xb6\xe7\x7e" - "\x5a\x87\xba\x69\xad\xa9\x66\xc6\x72\x3b\xae\x43\xfd\x4d\xdf\xd2" - "\x63\x7b\x08\xce\x6d\x63\xf9\x56\x94\x1b\xd8\x73\x6f\x72\x03\xc7" - "\xf6\xc8\xe4\x06\xbe\xd9\x2e\xe6\xd9\x6f\x2a\xd9\x6b\xcf\x48\xf1" - "\xec\x37\x4b\x78\x9e\xa5\xd7\x25\x9d\xb1\xe3\xd9\x8a\x96\xd4\xb4" - "\xdf\x14\xb4\x6e\x6e\xe0\x9b\x02\x3e\x37\xf0\xbf\x2e\xcc\x7f\x2c" - "\x8b\x93\xe6\xd9\x32\x2e\xef\x5a\xc6\xe7\x5d\x2b\x24\xf6\x4b\x11" - "\xf1\x6c\xf9\x54\xdb\xfc\x47\x56\xd3\x56\xda\x34\xed\x9e\xfb\x70" - "\xbf\x94\xf2\x60\xa5\xb9\x01\x9c\xe7\x8e\xdc\x8a\xdc\x65\xe3\x57" - "\x3e\x37\xb0\x47\x3e\x37\xd0\x0c\xbf\x2a\xdf\xbb\xef\xf4\x54\x31" - "\xbf\x9e\x0e\x11\xf3\x6b\xc5\x45\x7b\x7e\x75\xe4\xd6\xd3\xd9\x52" - "\xbc\x4a\x73\x03\x15\x99\xf2\x9c\x7a\x5a\x27\xc7\xa9\xec\x9a\x7e" - "\x55\xfc\x18\x69\x9e\x53\xbf\x3d\x27\xe6\xd4\x6f\xbd\x5c\xe5\xd4" - "\x7b\xb2\x5f\x8a\xdb\x9c\x1a\x69\xc7\xa9\xdf\x2d\xe1\x39\xd5\x7e" - "\xcf\x94\x66\x38\xb5\xb5\xf2\x04\x42\x4e\x15\x69\xd7\xef\x2c\x62" - "\x4e\xad\x08\x94\xe7\xd4\xef\x8a\x79\x4e\xa5\xd7\xb5\x2e\xa7\x7e" - "\x67\x6e\xdd\x3c\xc1\x77\x66\x5e\xbb\x56\x1c\x6e\x9e\x53\x4f\x1f" - "\x93\xe6\xd4\xd3\xc7\x28\xa7\x9e\x3e\xe6\xfa\x9c\xf2\x33\xdb\x14" - "\x70\x6a\x1b\xdf\x4b\xe5\xcc\x56\xc5\x79\x02\xcc\xb7\x22\x97\x56" - "\xde\xd9\xda\x21\xf1\xb6\xb5\x43\xc6\x70\x1c\xfb\xe2\x9d\x72\xec" - "\xd9\x2f\xc4\x63\x1a\xce\xee\xb7\x8d\x69\xa0\x1c\x7b\xfe\x35\xf1" - "\xfe\xa8\x8e\x6b\x85\x88\xd7\x50\xfd\xbe\x43\x53\x9e\x00\x39\x77" - "\x8c\x30\x4f\x70\xbe\x83\x3c\xdf\x7e\x1f\x28\xca\x13\xfc\x4b\x9a" - "\x6f\x6f\x89\xf8\xb6\x72\x12\xcb\xb7\x4d\x6b\xa8\x7e\x1f\x67\x5b" - "\x43\xb5\x59\x0d\x2b\xe2\xdb\xf0\xbb\xc3\xb7\xfb\x5c\xe7\x5b\xf1" - "\x5e\x2a\xf6\xeb\xa5\x56\x5e\x2f\x3d\x02\x7c\xcb\xae\xd7\x61\xbf" - "\x66\xaa\x6b\xeb\x75\xb4\xd6\x9a\xa9\x58\x2f\x69\xde\x3d\xb7\x50" - "\xcc\xbb\xe7\x0a\xd8\x6b\x25\x79\xf7\xdc\x58\x9e\x77\xe9\x75\x2e" - "\xf3\xae\x5b\x39\x83\x73\x71\xad\x9b\x33\x38\x17\xc7\xf3\xee\xf9" - "\x61\xcd\xf3\xee\xf7\x43\xa5\x79\xf7\xfb\xa1\x94\x77\xbf\x1f\xea" - "\x94\x77\x45\x63\x08\x2e\xf4\x93\x5c\xcb\xa3\xf2\x7e\xdf\x67\xe5" - "\x82\xc6\x9d\x9c\x01\x70\xb0\x2a\x11\xd7\x70\x0a\xc7\x31\x04\xcd" - "\xe7\x0c\x9a\xe3\x5b\xe5\x39\x03\x7d\x5f\x31\xdf\xea\xfb\x89\xf9" - "\xf6\x87\xd3\x58\x2f\xa7\x39\x03\x96\x03\xf4\x0b\x9b\x72\x06\x7a" - "\x31\xcf\xf2\x39\x83\x1f\x96\xcb\xbf\xfb\xd2\xe7\x8b\xf4\xed\x8b" - "\x76\x6b\x56\xcf\xe4\xf9\xf6\x44\x89\x6d\xcc\xd8\xc5\x53\xc7\x83" - "\x85\x7c\xab\xaf\x76\x58\xb3\x7a\x5a\x0b\xae\x59\x3d\xad\x85\xd7" - "\xac\x0e\x11\xaf\x59\xbd\xf1\x16\x3f\x8e\x4c\xf9\x9a\xd5\x55\x31" - "\x2c\x07\x23\x86\x70\xdd\x6a\x57\xf2\x08\xad\xbc\xd7\x8a\x88\x7b" - "\x45\x79\x84\xaa\xeb\x62\xee\xfd\xa1\x8f\x3c\xf7\x56\x1d\xe6\xb9" - "\x97\x5e\xd7\xba\x9a\xb7\xca\xd0\xba\x79\x84\x2a\x03\x9f\x47\xf8" - "\xe1\x0b\x49\xee\x15\xbd\x1b\xd3\x17\x48\xbf\x1b\x83\xe3\x2c\xf7" - "\xea\x0b\x64\xf3\x08\x0e\xe3\xb7\xaa\x37\xd0\x77\x63\x9c\xe6\xd5" - "\x2b\xc8\x23\xb4\xb9\x31\x06\xd5\x39\xee\xe4\x11\x90\x6f\x91\xcf" - "\x6c\x9c\xeb\x4a\x1e\xa1\xe5\x35\xee\xa5\x0d\x62\xce\xbd\xb4\x49" - "\xcc\xb9\x3f\x8d\xb0\xe7\x5c\x47\xbe\xbd\x74\x4e\x8a\x6b\x69\x1e" - "\xa1\xa6\x56\x9e\x67\x2f\x7b\xcb\xf2\xac\xdd\xd8\x5c\x9e\x67\x7f" - "\x1c\x26\xe6\xd9\xcb\x13\xdd\xe2\x59\x57\xf7\x60\x69\x53\x3c\x1b" - "\x6e\xc7\xb3\x3f\x9e\xe6\x79\xd6\x7e\x1f\x96\x66\x78\xb6\x95\xf6" - "\x61\x91\xd7\xb8\x35\xaf\x89\x79\xb6\x26\x4d\x9e\x67\x6b\xfa\xf1" - "\x3c\x4b\xaf\x6b\x5d\x9e\xad\x09\x6d\xdd\xdc\x42\x4d\x28\xaf\x71" - "\x7f\x7a\xac\x79\x9e\xbd\xac\x96\xe6\xd9\xcb\xdc\x7b\xb1\xcb\x6a" - "\x59\x8d\xeb\xc0\xb3\x57\x3c\x14\xf0\x6c\x1b\x1f\x83\x70\x85\xb8" - "\x93\x5b\x60\xf9\x55\x6f\x37\x5f\xe2\x8c\x70\xbe\x84\x20\xb7\x30" - "\xc6\x96\x5b\x10\xef\xcf\x12\x6f\xcb\xdf\x06\x71\xbc\x3b\xea\x4e" - "\x79\xf7\xe7\x2e\xf5\x4d\xbc\xbb\x00\x78\xf7\x67\x76\x7e\x44\x7d" - "\x13\xef\x5e\x3b\x6e\xab\x17\xbf\x3f\x8b\x4c\x6e\xe1\x79\xb6\xbc" - "\x39\x4d\xb9\x05\xe4\xe1\x20\x61\x6e\xe1\xda\x12\x79\x0e\xfe\x39" - "\x4d\x94\x5b\xf8\xa7\x34\x07\x1b\x45\x1c\x5c\x7b\x90\xe5\xe0\xe7" - "\x6d\x1c\xfc\x73\xd9\x2d\xf0\x96\xb7\x3e\x50\xc6\xc1\x46\x96\x83" - "\xc7\xdd\x1b\x0e\xfe\xbc\x05\x38\x98\x6d\xf7\xab\xb3\x4a\x75\xc0" - "\xc1\x61\xc8\xc1\xe3\x5c\xcb\x37\xdc\xa5\x3d\x5a\xb0\x5e\xd2\x5c" - "\x7c\xf5\x92\x98\x8b\xaf\xf9\xb3\xd7\x4a\x72\xf1\xd5\x2f\x78\x2e" - "\xa6\xd7\xb5\x6e\xbe\xe1\x6a\x75\xeb\xe6\x1b\xae\x56\xf3\x5c\x7c" - "\x6d\x7b\xf3\x5c\xfc\x73\x96\x34\x17\xc3\x71\x96\x8b\x7f\xce\x72" - "\xca\xc5\xcf\x0b\xb9\xf8\x97\x26\xcd\x2b\xca\x37\xe8\xef\xf7\xbd" - "\x5b\x7e\x91\xd5\xbf\x01\xbd\x48\x4a\x95\xc7\x2f\xd7\x4b\x73\x09" - "\xb9\x91\x4a\x52\x4a\xcd\xcf\x13\x38\x06\xed\x67\xe8\x5e\xea\x3f" - "\x94\x58\xd7\x2e\x8d\x47\x3e\x5e\x87\x7f\xa0\x71\x33\x55\xdc\xb3" - "\xc5\xb6\xb1\x81\x1d\xef\x8a\xc7\x91\x7b\xf3\x04\xe7\xa5\x7e\x8b" - "\xc9\x4c\x30\x71\xdf\x8b\xa3\xf3\x6e\x12\xcc\xb6\xcf\x88\x4d\xbd" - "\x87\x21\x9e\x59\x93\x60\x34\x74\x49\x30\x4a\x7d\xff\x09\x35\xf1" - "\xee\xb4\x8c\x61\x36\xaf\x67\x8c\x37\x9e\xd2\xea\x6f\xac\x22\x24" - "\x73\x3d\x63\xa8\xff\xc0\x00\xb8\xf9\xa5\xe2\xaf\x70\xdd\x8d\xae" - "\x75\x65\x37\x52\x83\x09\x1c\x3b\x62\x3b\x06\xed\x46\xac\xa9\x9e" - "\x8c\x15\xce\x31\xeb\x47\x1d\xc8\xd3\x02\x57\x25\x12\xf2\xcc\x2d" - "\x7c\x66\x0c\xe5\x80\x19\xdf\x74\x28\x33\x03\xca\x62\x7e\xf3\x5b" - "\x23\xe0\xd1\xab\xe4\x7d\x82\xcf\xf4\x0a\xb8\xaf\xfc\x74\x6c\x7b" - "\xcf\xfe\x39\x8c\xca\x8b\x58\xb7\xcd\x1b\xca\xf8\xad\x37\x40\x3c" - "\x48\xe6\x02\xe2\x8d\xf7\x91\x01\xd7\x31\xaa\x64\x06\xfa\x11\x5d" - "\xa9\xd9\x48\x9f\x69\xa8\xdf\x21\xf0\xb1\x0c\xfc\xee\xe6\x05\x44" - "\x0d\x7f\x3e\x4c\xf6\x7a\xa8\xeb\xf5\x30\xb8\xcf\x31\x58\x2f\xb9" - "\x7b\xcc\xd8\x08\xfd\xce\x6f\xfd\xb1\xef\x60\x7f\x1f\x7f\x9b\xfd" - "\x1d\x95\x75\x85\x05\x8e\x33\xa9\xc9\x4c\x69\xbc\x99\x74\x86\xb6" - "\xc8\x83\x7a\x23\x1e\xad\x9f\x68\xf5\xef\xf5\x20\x64\x57\x42\x8d" - "\xaa\x14\xea\x6e\xf9\xeb\x6f\x8d\x3a\xed\xef\x09\x9c\x37\xa0\x67" - "\xb9\xec\x51\xf7\xda\x94\x9f\x08\x41\x3e\x81\xff\xcf\x31\x42\x3f" - "\x36\x09\x3e\x67\xc0\x7d\x58\x6f\xf8\x7b\xe1\xb5\x70\xbc\x8b\x6e" - "\xd1\x59\xd2\x39\x96\x78\xa7\xc3\xbd\xd1\x6b\xaf\xeb\xf1\x5a\xbd" - "\x47\x5d\x04\xd6\x01\x3e\x1b\xe1\x33\x7e\x0f\xc7\x90\x11\x66\xeb" - "\xbc\xa1\x2c\x36\xb3\xd6\x1b\xac\x7d\xe7\x0d\x65\xb9\x0f\xee\x33" - "\x03\xee\x19\xae\xf1\x81\x6b\x7c\xd8\x7f\xb5\x44\x9d\x05\xc7\xb0" - "\x1c\xf8\xd7\x47\x37\xaf\x11\xcb\x2e\xc3\xb2\x65\xda\xc1\x8b\xf1" - "\x5d\x6f\x60\x00\xdb\xd8\xa7\x06\x68\x3d\x4e\x55\x79\xdc\xf0\xea" - "\xec\xc1\x30\xf0\x9c\xeb\xde\xd3\x12\x9f\x4c\x2b\x21\xba\x1e\x58" - "\x4e\xdd\x39\x28\xdf\x0b\xdb\xa2\xfe\x83\xba\x03\x7a\x8f\xeb\x91" - "\xd8\xbe\x10\x4f\x63\xc0\x13\x78\x0f\x37\x7c\xf1\x77\xf0\x3b\xdc" - "\xf5\xec\xda\xf7\x58\xe7\x00\xad\x27\x03\x9f\x2d\x9e\x1e\x17\x89" - "\xa7\x7f\xc7\x3e\xf0\x7d\xb3\x9e\xec\x2c\xc7\xef\xeb\xe9\xf7\x00" - "\x4b\x37\xa0\xde\x86\xf7\xf1\x18\x7e\x96\xa9\xaf\x8f\x2d\x6e\xc5" - "\xfe\x80\x0d\xfb\xd8\xd9\x30\x02\xb8\xb0\x61\x04\xeb\xbb\x5b\xab" - "\x57\xb1\xfd\xb0\xc7\x0d\xd6\xd7\xa5\x43\x0c\x2d\x1f\xf9\x7b\x65" - "\x40\xdb\x5a\x6f\x63\x5c\xaa\xe0\x9c\x31\x04\xe3\x92\x91\x00\x31" - "\xa1\xd7\xc6\xf3\xf5\xc7\xcf\x46\x36\x9e\x56\x88\x05\x9d\xbb\x69" - "\xec\x87\xf7\x93\x71\x0b\xe2\xd8\x8d\x31\x1e\x81\xab\x19\xc4\x2d" - "\x60\x64\xd7\x02\x93\x0a\xc7\xf5\xe1\xf1\x43\x75\x26\x55\x06\x48" - "\x36\xe8\x67\xc9\x6a\xe0\xe5\x4d\x8b\xa0\xcd\xa1\x4c\xa6\x4f\xb4" - "\x6e\x90\x2d\x8e\x09\x10\xbb\x45\x80\x5d\x68\xf3\x0c\x68\xbf\xcd" - "\xc0\x79\xf8\xff\xcd\xd0\xff\x80\xa6\xd3\xe9\x3d\x8c\x11\x50\x9e" - "\x7a\x53\x37\xc6\x90\xd7\x8d\xa9\x85\x36\x1c\x5a\xff\x81\x31\xc8" - "\xd6\x86\x58\xa7\x0c\x38\xbe\x1a\xce\x43\x7b\x1e\xa0\x18\xba\x91" - "\x66\xbb\x67\xb9\xf6\x4c\xdb\x45\x86\xae\xde\x45\x7a\xae\xda\x45" - "\x86\x2f\xad\x86\xe7\x32\xf5\x8f\xcc\xc9\x30\x33\xf4\x89\xa7\x6b" - "\x1a\xbb\x25\x97\xe1\xbb\x27\xeb\x7b\xbf\xcd\x5f\xbe\x8b\x0c\xc0" - "\xb9\xb1\x53\x6a\x09\xc1\x3e\x7c\x4a\xbb\x0b\x4c\x69\xec\x4d\x62" - "\xed\x72\xba\xc6\xf2\x5e\xff\xae\x93\x6f\x12\x72\x54\x63\x24\xda" - "\x38\xe8\xcb\xeb\x6a\x88\xd6\xc8\x18\x4a\x52\x7e\x22\xc0\x3d\xb5" - "\xb4\xed\x6e\x91\x29\x73\x08\xc1\x39\x83\xd6\x9f\x35\xa4\x63\x24" - "\xf1\x4a\x3c\x43\xfc\x93\xab\x99\x1a\xcb\xfa\x34\x9d\x36\x89\xa8" - "\x76\xd5\x55\x50\xed\xe9\x71\xf3\xd4\x41\x9c\x9f\x5a\x1f\x4a\xde" - "\x30\x73\xfd\x51\xd6\x7a\x53\x72\x14\xe9\x8e\xf7\xd3\x99\xd5\x5e" - "\x37\x63\xa0\xdd\x4c\xca\xf8\xf9\xe6\x50\x36\x9e\xeb\xd3\x83\x77" - "\xcd\x36\x81\x6e\x1d\xad\x4f\x9e\xc3\xd4\xa0\xae\x83\xfe\x85\xd5" - "\x82\xa5\x35\x66\xd0\x56\x11\xd0\x7f\xeb\xc9\x57\x55\xf9\x2a\x6b" - "\xf6\x68\xbd\xc2\xdf\xc8\x65\xfb\x6d\xec\x4b\xa1\xee\x21\x1a\x92" - "\xc2\xd6\x1f\xfa\xcc\xce\x71\xa8\xa7\x98\x0b\x58\xff\x43\x70\xaf" - "\x4c\xef\x1d\xc1\x70\x7d\x00\xf6\x9f\x53\x2a\x75\xa4\xc8\x64\x21" - "\x1b\xaf\xb0\x6d\xd4\x1e\xda\xc8\x0b\x62\x6e\x84\x76\xf2\x96\x8a" - "\x1b\xc6\xcc\x9a\x79\xba\xc6\xea\x49\x63\xc3\xc6\xc5\x48\xe3\x32" - "\x79\x3e\x81\x7e\x14\x62\xb3\x86\xc6\xc6\xea\x97\x5d\x86\xb1\x51" - "\x76\x1f\xb7\x22\xe4\xfa\x17\xfc\x6d\x06\xf0\x81\xb8\xb0\xfa\x66" - "\x97\xe1\x6f\x63\x1d\xf0\xfd\x19\xe2\x60\xca\xf2\x0b\x4c\x49\x6c" - "\x0d\x29\x85\xfb\x61\xba\x08\xeb\x60\x56\x5a\x87\x1a\xb9\x3a\xa4" - "\x3d\x03\xb8\x7d\x06\x70\xfb\x0c\xe0\x56\x4f\x71\x7b\xa2\x92\xe2" - "\xd6\x02\xf5\x6a\x00\xed\xbe\x34\x84\xa8\xb0\x5e\x3b\xcf\xe2\x1a" - "\x7d\x50\xcf\x1a\x1e\xbb\x93\xae\x42\x1b\xd9\xf0\xeb\xd9\xbf\x2b" - "\xb6\x4f\x89\xb1\x82\x24\x23\x7e\x1b\xa5\xf0\x6b\xd2\x4d\x99\x05" - "\xb1\xf9\x0b\xe0\xf7\x47\x0d\xf1\xa9\x26\x5e\x49\x21\x80\xdf\x1a" - "\x29\xfc\x9a\xd6\x1c\x80\xdf\x74\xc0\xef\x1c\x21\x7e\x4d\x03\x95" - "\xe3\xb7\xde\xd4\x84\xdf\xd7\x39\xfc\x46\xd9\xe1\xb7\x5a\x80\x5f" - "\xbc\x6f\xc5\xf8\x35\x85\x29\xc3\x6f\xbd\xbe\x09\xbf\xe0\x4b\x36" - "\xbe\xc5\xb6\x51\x7b\x68\x23\xc0\x6f\xfd\xe7\xd0\x4e\x92\xf8\xbd" - "\xfb\xf1\x6b\x4c\x71\x3d\x7e\x8d\x53\x9b\x8f\x5f\xc3\x55\xe5\xf1" - "\x6b\xd8\xd7\xfa\xf1\x6b\xec\xa9\x2c\x7e\x0d\xf9\xf2\xf1\x6b\x88" - "\x6b\x3b\xf1\x33\x07\xb9\x1e\x3f\x73\x97\xe6\xe3\x77\xbb\x50\x79" - "\xfc\x6e\xc7\xb7\x7e\xfc\x6e\x57\x2a\x8b\xdf\xed\x70\xf9\xf8\xdd" - "\x7e\x56\x2e\x7e\xa3\xbb\x5b\x19\x2b\x8e\x9b\xeb\x96\x18\x88\x1a" - "\x88\xea\x35\x4b\x47\xf4\x8c\xf0\xd9\xcb\xf6\x99\xd5\x54\xe0\xab" - "\xed\x3e\xfb\xd8\x7d\x56\xdb\x7d\xf6\xb5\xfb\xec\x6f\xf7\xb9\xa7" - "\xed\x33\xc4\xab\xdd\x35\x0f\x73\x12\x78\xb6\x14\xbd\x87\xc5\x9f" - "\x3b\xdf\xe7\x0d\x4b\x00\xfa\xbe\x3e\x52\x75\xcf\x48\x65\x4c\x1d" - "\x3d\x08\x73\x5b\xc5\x90\x58\x2d\xf9\xed\x15\x0f\x4b\x5a\x63\x2a" - "\x58\x42\xcf\x1e\x1a\xa6\x31\x85\x58\xb3\xc6\xf8\x4e\x5e\x02\xf8" - "\x32\x80\x4f\x4c\xf6\x6f\x0f\x65\xff\x06\xda\xcd\x50\x12\x6b\x00" - "\x5d\xfe\x15\x53\xe5\x61\x59\x82\xf7\xf9\x4c\xac\x8e\x58\x3d\xfb" - "\x63\xde\xca\xc3\x9a\x3d\xc6\xd7\xe0\xd9\xbf\x07\xf8\x52\xfd\xea" - "\x54\xab\x77\x69\x6d\x39\x49\x57\x59\x03\x12\x13\x41\xd7\xd7\x7e" - "\x4e\x96\xd6\x32\x35\x89\x66\xc6\x54\x1a\xa6\xc3\xf7\xb6\x35\xa5" - "\xf1\xc7\x48\x89\xa1\x9c\x60\x9f\x87\x58\x2d\x35\x7c\x4e\xdf\x13" - "\xe3\x35\x70\xac\xc4\xb0\x93\x14\xc3\x67\xdd\xbc\x4b\x70\x9f\xd6" - "\x7e\xa5\xb5\x3b\x89\x25\x6b\x8c\xda\xea\x3b\xda\xc8\xf8\x8e\x36" - "\x15\xd7\x42\xdd\xb2\x46\x9b\xb1\xae\x25\x50\x0f\x76\x8f\xce\xec" - "\xd1\x66\xb6\x5c\x63\x19\x9b\x43\xb0\x64\xc3\xf5\x7e\x70\xbd\xdf" - "\x68\x13\xd6\x0f\xeb\x26\xe9\xf7\xb2\x12\x23\xa0\xee\xcf\x87\x68" - "\xbc\x08\xb3\xcc\xcb\x5f\x19\xde\xac\x13\x65\x7d\x64\x56\x62\x35" - "\x2d\xd7\xdb\x9d\x72\x65\xc7\x3f\x31\x59\x49\x5c\x7d\xd5\xee\x94" - "\x6b\x76\x52\x2e\x57\xdf\x00\x37\xca\x65\xa6\xc9\x97\xab\xe5\xea" - "\x1b\xe4\x4e\xb9\x3b\x9d\x94\xcb\xd5\x37\x45\x79\xb9\x2a\xe2\xe5" - "\x24\x6e\x11\x6e\x61\x41\x45\x42\x9d\x61\xc1\x2d\x1c\xa8\x88\x93" - "\xfb\x4f\x8a\x70\x0b\x03\x2a\x0f\xd9\xfc\x37\x62\xc0\xad\xf8\xab" - "\x3c\x9c\xc6\xdf\xad\xd8\xab\x3c\x64\xf7\x7f\xc4\xd8\xbb\x17\x77" - "\x0f\x59\xfc\xa3\x37\x86\x38\x01\xa7\xef\x08\xb2\xae\x9f\x48\xac" - "\xdd\x12\x55\xef\x59\x83\xc8\xe8\x24\xe8\xf3\x72\x48\x97\xd1\x9b" - "\x2e\x30\x41\x98\x73\x52\xa9\xb2\x92\x72\x89\x2a\x53\x65\x55\x15" - "\x26\x54\xa8\x4a\xcd\x43\x91\xb7\x2c\x5b\x17\x99\x3c\x9e\x84\xe3" - "\x87\x23\x09\x31\xbe\xab\x21\xb4\xac\x89\x24\x5d\x1b\x44\xa6\x58" - "\x08\xe6\x38\x8c\x93\xe7\x5f\x60\xbe\x4e\x04\x8d\x7f\x1d\xf8\x35" - "\xc7\x84\x7d\x69\x17\xf8\xae\x19\x70\x0c\xe5\x98\xc8\x6e\xab\xc1" - "\x63\xb2\x81\xbd\xd6\x00\x7e\xd4\xc0\xac\x4f\x64\xfb\x64\x26\x59" - "\x43\xde\x87\xcf\x97\x55\x9e\xed\x3c\x0d\x44\xb5\x19\xbc\x6a\xfd" - "\x2a\x4f\xa2\x57\x79\x56\xa2\x7f\x05\x9f\x5c\x9b\x7c\x1d\xf3\xf9" - "\x3b\x82\x76\x59\x0d\xaa\xf7\xc0\x37\xe3\xf5\xcf\xc4\x12\xd5\xd7" - "\x50\x1e\x5c\x3b\xe0\x70\x1c\x21\x4e\xf2\x39\x5e\x56\xdf\xac\x31" - "\xf8\x7d\x2c\x07\xf3\xa4\x19\x56\x68\x67\xdf\xf5\x26\xac\x37\x93" - "\x95\xbc\x4f\x97\x00\x7d\x8e\xca\xf3\xf3\xb1\xfd\x98\x7a\xec\x43" - "\xa0\xef\xe8\x71\x05\x3e\xb3\xf9\x80\x54\xa6\x8c\xf1\x1d\x55\xc3" - "\xa4\x77\x0c\x2a\x31\xd6\x11\xdd\xa2\x46\x52\xa5\xf2\xfc\x02\x7f" - "\xfb\x86\x6f\x56\x90\xd1\x37\x6b\x1c\xd4\x61\x8f\xad\xbe\xf8\x5b" - "\xb6\xe3\x98\xff\xe0\xea\x58\x76\x38\x51\xbe\x8e\xcc\x7b\x3d\xba" - "\x4e\xf1\x67\x0c\xd8\x96\x3a\x6d\x1d\xd4\xa5\xdd\x58\x6c\x6f\x26" - "\x2b\x4b\x6d\x4c\xd6\xf4\x62\xf3\x81\x2a\xaf\x68\xcc\x2b\x31\x59" - "\x63\x68\x7e\x3b\x7b\x0c\x3b\x56\x07\xb9\x1f\x34\x40\x05\x6a\xa1" - "\x6b\x2a\x2f\x36\x1f\x18\xa2\x51\x29\xf3\x53\x2a\x2f\xd6\xff\xea" - "\x7a\x61\x3b\xb4\x1b\x08\xbf\xf7\x42\x95\xca\x2b\x93\xe6\x38\xc6" - "\xf8\xe3\xef\xc1\x35\x3d\xe1\x37\xfd\x99\xac\x51\x7a\xbc\x0e\xce" - "\xef\xe1\xce\x07\x08\xce\x07\x40\x9d\x43\xb9\xf3\x65\xdc\xf9\x3e" - "\x82\xf3\x7d\x62\x7b\x11\x8f\x2b\x2a\x2f\x13\xde\x13\xe3\x3b\x06" - "\xef\xc7\x17\xdf\x27\xb0\xf7\xe4\x37\x86\x70\xd7\xf9\xd6\xaa\xda" - "\x75\xb9\x01\xf8\x82\xf3\x3d\x05\xdf\xef\xf9\x75\x7c\x20\x19\xbd" - "\x09\xdb\xb4\x5d\x1f\xbd\xd7\x8b\x03\xd8\x3c\x91\xca\x2b\x80\x6d" - "\x0b\xe8\x3f\x85\xe5\xc1\x71\x03\xf6\x91\x46\xd0\x91\xf0\x7f\xcc" - "\xb5\x8a\x72\x1d\x73\x16\x2c\x78\x67\x41\x40\xdf\x88\x80\x88\x98" - "\x59\x01\x6f\xbe\xb3\x70\x5e\xdc\x88\xbe\x11\x0f\x13\x22\xc0\x8e" - "\x9a\x49\xed\xcc\x58\xb3\x32\x56\x94\xe6\x80\x7e\x53\xa9\xa1\x2f" - "\x6f\x24\x59\x10\x57\x4b\xb7\xbc\x58\xcb\xfa\x3c\x78\x96\x52\xc2" - "\x75\x09\xa3\xa0\xed\xdb\xb1\xef\x01\x4a\x03\x08\x49\x83\xf3\xba" - "\x84\x13\x78\xec\x38\x7b\x0c\x1c\x33\x9b\x0b\x4b\xf0\x26\x47\x02" - "\xea\xd8\x7c\xda\x35\x55\x7b\x0f\x36\x77\x78\x93\xa8\xcc\xa9\xde" - "\xe4\xbf\xb5\x65\xaa\x03\x56\xbd\xea\xbf\xad\x15\x2a\xd4\x20\x5f" - "\xfb\x1f\x23\x83\xe2\xbd\x09\x9e\xff\x4a\x0b\xc7\xe1\x3c\x9e\x63" - "\xcb\x61\x63\xdd\x7e\x2a\x5e\x87\xf9\x35\xfc\x7f\x72\x0e\x73\xf1" - "\x6b\x7f\xd0\x31\xa8\x89\x55\xed\xb6\x61\x5d\x03\x7a\x10\x02\xed" - "\xb8\x1d\xeb\xa7\x57\xb5\x2b\xf0\xcc\x85\xeb\x17\x11\x1f\xb8\x3e" - "\xdb\x9a\x9d\xb1\x02\x79\xc1\xbc\xaa\x5d\x18\x93\xda\x75\xe0\xe6" - "\xb5\xc4\x3b\x77\x2d\x3c\x9f\x6b\x89\x57\xfd\xaa\xf6\x29\x7a\xaf" - "\xb0\x5a\x6c\x5b\x28\xc6\xe7\x86\x8a\xfc\x11\x8e\x65\xe9\xc9\xce" - "\x68\x3c\x06\xcf\x9f\x5c\x7e\xd8\xe7\x16\x68\x47\x53\x9f\x68\x62" - "\xf5\xcd\x88\x67\xa0\xdd\xea\xfb\x44\x07\x76\x8e\x05\x6c\xc1\x33" - "\xc6\xf8\x65\xc4\xd7\xaa\xbc\x0b\xfe\xf5\x2c\x21\x5a\x7c\xa6\xd7" - "\xa7\x84\xef\xb8\x65\x82\x67\x3b\x2f\x76\xe7\x2d\x03\x7c\xce\x23" - "\x05\xf0\xf9\xb8\xae\x80\x04\x4c\x06\x3d\xa6\x7a\xa8\xc3\xcb\x11" - "\x8c\xb9\x5f\x11\x68\xd8\xea\xcf\xc8\xc9\xf2\x63\xc4\x27\x8c\x78" - "\x36\xad\x23\x1f\x47\x54\x53\xf4\xf0\x79\x21\x51\x95\x98\x2c\xec" - "\x3b\x03\xed\x30\xcc\xfd\x17\x13\x7c\x1f\xc0\xa8\x76\xc5\x15\xd6" - "\x99\x80\xcb\x6a\xda\xe1\x78\x72\xab\xfa\xfb\x1a\xfc\xce\x1b\x46" - "\xee\x3d\xda\x0d\xee\x3d\xda\x0d\xf6\x3d\x5a\x74\x62\x38\x7d\x8f" - "\x86\xef\xcf\xa6\x84\x7b\x32\x58\x1e\xbe\x53\xeb\x68\x04\x1c\xbc" - "\xab\xe9\x64\x79\x57\xd3\x35\xa7\x8e\xf8\x96\x18\x6a\x48\x69\xed" - "\x31\xf2\xd1\x22\xe2\xcb\xdc\x88\xec\x50\xa4\x3b\x41\x98\xb5\xdf" - "\xe9\x77\x6b\x75\xed\x2c\x98\xff\xb8\xe1\xff\x70\xe7\x65\x1e\xf8" - "\x9c\x76\x4a\x5b\x40\x06\xe4\xd5\x91\xc0\x37\x2e\xa5\xb0\x6b\x4a" - "\xe1\xfe\x7f\xe6\x1b\x9a\x80\xdb\x37\x34\x4f\x34\xdc\xd0\xf4\xea" - "\x6c\xa0\xef\xdd\x66\x5c\x55\x13\x1c\xcb\xcb\x7c\x70\x6b\x67\x1e" - "\xe6\xbf\x8d\x06\x62\xee\xf2\x7d\x0d\x62\x19\x7e\xbb\x27\xbe\xab" - "\x49\x5e\x42\xd4\xd6\x1f\x34\xa4\x38\xb2\x8e\x0c\x82\xd8\xe3\x7b" - "\x89\xcd\x55\xf4\xbd\x84\x05\xfc\x12\xbe\x9b\xb8\x75\x43\xa3\x62" - "\x7c\xb3\xf5\x93\xa2\x02\x48\xc3\xb6\x68\xc0\xeb\x0e\x92\xdc\xc0" - "\x5c\x2c\x7d\xdf\x4a\x30\x67\xcd\xac\x6a\xbf\x93\xf1\xcb\xd6\x1f" - "\xd5\x9c\xc6\x3e\xe6\x59\x9e\x3b\xbc\x17\xba\xc7\x1d\xde\xec\xbb" - "\x04\x7c\x87\x07\xf1\x8b\xdd\x59\x87\xf1\x84\xb8\xd6\x19\x54\x13" - "\x20\x76\xc5\xd5\x1f\x43\xdc\x2a\x44\x71\x63\xe3\x0c\xd7\x5d\x8e" - "\x80\x78\x5d\xa2\x31\x2c\x32\x42\xfc\xf6\x63\x19\x59\x29\x85\x8b" - "\x4c\x2a\xf0\x64\xaa\x22\xd3\x39\x76\x3e\x0c\xc6\x71\x67\xe3\xb1" - "\x76\x0d\xd0\xef\xe0\xbb\xd0\x5b\x5b\xa3\x03\x1a\x7c\x33\x42\x6f" - "\xfb\x66\x44\x3a\x79\x2f\x4a\xe3\x19\x45\xbc\x8b\xaa\x4f\xd3\x78" - "\xce\xe7\xe2\x89\xe3\xe7\x16\x6b\x3a\x99\xeb\x21\x9e\xb7\x20\x9e" - "\x71\x7a\xb2\x71\x01\xf1\x2d\xad\xa9\xc0\x77\x46\x1d\xc6\x17\x13" - "\x32\xa1\x1f\x63\x2d\xd6\x9d\x65\xe3\xba\x0b\xe2\x6a\xce\x3c\x5d" - "\x83\xef\x4a\x9b\xe2\xba\x08\xe2\x7a\x0b\xe2\x7a\x95\x8f\xab\xa5" - "\x1e\xe2\x5a\x0f\x71\xad\x87\xb8\x72\xef\x53\x67\x44\x41\x5c\xf1" - "\xdd\xdb\x07\xf5\x81\xf8\x3e\x15\xdf\x5b\x61\x5c\x71\xcc\xb6\x75" - "\xb1\xa6\x27\xfb\x1e\xf5\x4d\x0d\xc9\x9b\x4d\xbc\x07\x9a\x88\x47" - "\xf2\x7e\xa2\x86\x7a\xaa\x9f\xfa\x9c\xa8\xa0\x3c\xc0\x7d\x15\xc1" - "\xf8\x96\x7e\x6e\x21\x4b\x5f\x23\xbd\xcc\x6b\x68\x9c\x4b\xcd\x5f" - "\x60\xde\x78\xe8\xad\xc5\x1a\xd5\x86\x45\x64\x38\xc6\x7c\xe2\xa5" - "\x00\x72\x34\xb8\xd8\x21\xe6\xd6\xec\x2c\x35\xc4\x29\x1c\xe3\xee" - "\xfe\x73\xeb\x13\xee\xfa\x73\xfb\xf0\xe1\x07\xcf\x6d\x4b\x3f\xb7" - "\x0f\x47\x48\x3f\xb7\x3e\x03\xdd\x7b\x6e\x7d\x06\x3c\x78\x6e\xef" - "\x87\xe7\xd6\xc7\xdf\xfe\xb9\x6d\xd2\x2d\x0b\xe6\xc4\xcc\x8a\x9a" - "\x17\x35\xef\x2f\x01\xb3\x97\xc4\xcd\x79\x97\xaa\x17\x91\x7e\xd1" - "\x58\xac\x41\xaa\x75\xd0\x5f\x9f\xf4\xaf\x20\xbb\x7b\x54\xa8\xac" - "\xd3\xfd\xbd\x98\xcc\xba\x40\x6b\x66\xdd\x9e\x75\xa0\xc5\xf1\xf9" - "\xce\x02\x8d\x7d\x59\xe5\xff\xfe\xbf\x7b\x82\xfe\x5c\x70\x85\xe0" - "\xff\xe9\xfb\xe1\xdd\xb1\x38\x87\x32\x67\x3d\x53\x83\x73\x28\x8f" - "\x1f\x41\x6d\xd1\xe9\xf4\x23\xa1\xe0\x27\xa6\xfb\x93\x86\xe9\xa1" - "\xaa\x55\x67\x89\x77\xe7\x0a\x32\xd1\x6a\x65\x18\x9d\xf6\x0a\xe8" - "\x3e\xbf\x22\xdd\xeb\x57\x08\x6a\x9d\xcb\x2a\xdf\x81\x01\x09\xcb" - "\xf0\xdf\x2e\x01\x09\x1f\x5c\xb8\xac\x7a\xf4\x14\x9b\xc7\xe9\xc6" - "\xd4\x30\xeb\xd3\xcb\x2c\x9f\xcc\x0b\xc6\x77\xa7\x79\xdd\x98\xea" - "\x5d\xe0\x37\x76\x35\x9a\x54\xef\x2d\xc0\x31\xe8\x8f\x33\xf8\x0e" - "\x14\xdb\xe0\xbd\x3a\xf0\x13\xef\x73\x79\x28\xd5\xa3\x23\xf0\xf9" - "\x02\x7d\x55\x7d\xe8\x72\x85\x0a\x9f\x37\xa3\xef\x28\xfd\xfb\x70" - "\x1f\x50\x47\xfd\x86\xf5\x4c\xa5\xc1\x2f\x63\x85\x57\x00\x51\xd5" - "\xaf\xea\x3c\x06\x34\x4f\x1c\xea\x95\x15\x70\x6e\x25\x9c\x63\xdf" - "\x45\xaa\xba\x9a\x98\x87\x3b\xf9\x22\xc7\x01\xa6\x3d\xae\xa9\x3a" - "\xaf\xc1\x35\xa4\xd2\xa8\x2f\xa9\x31\x65\x67\x44\x9a\xb7\x45\x07" - "\x98\x51\x4f\xf6\x8d\x0e\x6c\xc8\xce\x08\x35\x67\x67\xc4\x87\xf4" - "\x63\xdf\xb9\xc3\xf5\x5d\xe6\xe0\x3d\x34\x64\xa5\x84\xc3\xf5\xc6" - "\x1b\xbe\x79\xb1\x37\xb2\xf2\xc8\x89\xf8\x1c\x12\xf0\x0a\x72\x5f" - "\xe7\x83\x13\x72\x18\x73\xff\x60\xe0\xbe\x9c\x1d\xe4\xe4\x44\xe0" - "\xbe\x50\x47\xee\xa3\x63\x14\x2c\x84\x72\x60\x31\x81\xb2\xaa\xf1" - "\x19\x42\x8d\x5a\x08\xed\x80\xcf\x07\x3e\x07\x2c\x17\x02\x0f\xda" - "\x9e\x15\x7c\x8e\x90\xeb\xd8\xe7\xd6\xee\xb9\xc1\x67\xe5\x11\x03" - "\x51\xe3\xb3\x82\x5c\x88\xcf\x0a\x8e\xfd\x59\xc7\x3d\x2b\x9d\x2b" - "\x89\x7a\x23\xf0\x60\xa9\xf9\x18\xfb\xbc\xa0\x96\x2c\x32\x0b\x38" - "\x10\xdf\x1b\x09\x9e\x95\xd5\xb6\x67\xc5\xc6\x81\xf0\x3c\x98\xf1" - "\x59\x59\xac\x79\xa2\x71\x31\xff\xac\x4c\x3f\xa7\x26\x2c\x3f\x7e" - "\x70\x2b\x30\x17\x9e\x15\xcc\xa7\x59\x6c\x1c\x08\xcf\x0a\xce\x4d" - "\x62\x39\xf0\x6d\xe0\xc0\x5a\xe0\x40\x03\x1c\x87\x67\x64\xf3\x5c" - "\x8e\x03\xb9\x67\xa3\x61\x31\xc7\x81\x57\x03\x48\x63\x5f\xe4\xc0" - "\x8d\x32\xda\xe5\x9c\x1d\x07\x76\x19\xec\x1e\x07\x76\x09\xc4\xef" - "\x61\x0c\x1b\x21\x9e\x18\xc7\x09\xfe\x8c\xb9\x28\x07\xb8\x6f\x5a" - "\x1b\x8b\xdb\x02\xe9\xb8\xed\xe2\xfa\x2e\x49\x8e\x93\x88\x1b\xe0" - "\xbc\xd6\x5c\xef\x18\x3b\xe6\x03\x63\xbc\x90\xe7\x90\xdf\x90\xeb" - "\x90\xe3\x90\xef\xf0\xf9\x40\x9e\x43\x8e\xfb\x1d\xf0\x3f\x7c\xae" - "\x29\x8e\xac\x62\xf9\x2f\xf9\x12\x51\x27\x8f\x25\xbd\x4a\xf7\x59" - "\xc0\xdb\xdc\x24\xc8\x7f\xc2\xbe\x0d\xf9\x0e\x63\xbb\xe1\x16\xe5" - "\x3b\xec\xe3\x90\xdb\x1c\xfa\x38\x88\x2d\xc4\xa4\x27\xf6\x71\x6c" - "\xce\x22\xd5\xb7\x7b\x5e\x57\xea\x49\xb2\xba\x12\xef\xfa\x55\x8f" - "\xfa\x3b\xfa\x92\x47\x07\xd8\x7c\x09\x3e\xe3\xf8\xac\xeb\x55\x9d" - "\x43\xa9\xf7\x4c\xdb\x43\xfd\x50\x77\xba\xb7\x10\x78\x7e\xde\xef" - "\x3f\x1a\x43\xc7\x05\x80\xbf\xf7\x4b\xde\xc7\x64\x8f\xaa\xc1\x76" - "\xc5\xfb\x7c\xa3\x1f\xe0\x32\x3b\x2b\x28\x03\xdb\x2a\x3b\x6b\x0c" - "\xfc\x7f\x1c\x8f\xb5\x47\x37\x1d\x8d\x27\x24\x24\x5e\x29\xd6\x1e" - "\x65\xdf\xff\x32\xdf\x87\x3e\xca\x4c\x0f\xf5\xb2\x7e\x1f\xda\x0e" - "\x70\xe1\xff\x8e\x25\x85\xdc\xca\xdc\x1d\x99\x6c\x66\x6a\x02\x12" - "\x48\x7f\xa8\x97\xe5\xb8\x99\x90\xe3\x46\xe0\xbd\x89\xd1\x10\xe3" - "\x5d\x35\xbb\xad\x06\x2f\xbd\xaa\x53\x39\xf8\xc5\x1a\xe0\x5e\x2f" - "\x21\xf7\x52\x9e\xed\xc4\xae\x11\x66\xca\xdc\x1d\x8f\x65\x4d\x39" - "\x46\x3a\x43\xff\xeb\x75\x59\xe5\xb7\x69\x49\x12\xc1\xb9\xb4\xed" - "\xe0\xff\x51\x8d\x5d\xb5\xf8\xfd\x4e\xcc\xf7\xd3\x3c\x62\x5f\x24" - "\xbd\x98\xe9\xd3\x3c\x70\x1c\xc4\x76\x6b\xbe\xca\x0a\xc7\xe8\xb8" - "\xaa\x7c\x82\xe7\xd3\x1a\xbd\x58\x5d\x66\x85\x6b\x4a\x8c\xf9\x24" - "\x6d\x91\x37\xc1\xeb\xe9\x58\xbd\x7c\x82\xd7\xaf\x5e\xa0\x66\xc7" - "\x51\xb0\xdf\x33\xe7\x13\xfc\xae\x05\x8e\x7f\x68\xf5\x21\xe9\x09" - "\xbe\xe4\x78\x51\x09\x5b\xc6\xf1\xa2\x7f\x11\x2c\x03\xf0\x0f\xff" - "\x3f\x44\x32\x16\xf9\x03\x0f\xe4\xc3\xf9\x6f\x49\xc6\xb5\x9e\xf0" - "\xef\x65\xf8\xbb\x45\xae\xa8\xfc\x7c\x8e\x17\x59\x49\xe7\x65\x7f" - "\x64\x00\xc7\x4c\x29\xce\xcf\xd4\x92\xf6\x50\x77\xbf\xd2\x8a\x4c" - "\xf0\xb0\x8f\x9a\x71\xfe\x3e\x93\x3c\xbd\xd6\xca\x4c\xbf\x6a\x4d" - "\x9e\x7e\x0d\x7f\xdb\xc2\x4c\xff\x05\x7f\x7b\x75\x42\x00\x37\x76" - "\x37\x9f\x1d\x67\x98\x76\xab\x0f\xc1\xba\xe2\xef\xe2\xef\x65\x2c" - "\xd0\x70\xbf\x39\x80\xad\x1b\xfe\x26\x96\x29\xfc\xcd\x13\xf8\x9b" - "\x7f\x66\x7f\x73\x25\xfc\xdb\x05\xfa\x2e\x36\x0e\xf8\xfb\x56\x26" - "\xb4\x1d\x93\x1c\xea\xc9\x7e\xc7\x54\x23\xf5\x9d\x83\xf4\x3b\x8f" - "\xb2\xb9\x38\xfc\x4e\x03\x83\xd7\xd3\x32\xa0\x6f\x3c\x83\xc7\x9f" - "\x0e\xd5\x11\xc7\x18\x76\x5b\x48\xfb\xca\x6e\x63\x69\x5f\x49\x63" - "\xca\x62\x65\x7a\x68\x3b\x88\x9b\x1a\xfb\xd5\x2a\x55\xb7\xc7\x9a" - "\xca\xf8\x3e\xd4\x13\xe3\x8d\xb8\xb1\x61\x09\x71\x64\xc3\x10\x5b" - "\x4f\x03\x21\x42\xcc\xc0\xff\xbd\xb9\x72\xe6\xd8\xca\x81\x3a\x10" - "\x1b\x8e\x9e\x86\xf3\x8e\x38\xf2\x1f\xc1\xe3\xe8\x37\xe7\x4c\x5a" - "\x86\x41\x1c\xe9\x5e\x4f\xc5\x72\x0a\xf9\xfa\x4c\xf3\x40\x8c\xdd" - "\x67\xd8\xf2\xc1\x38\x3d\x9d\x48\x7c\xe9\xfd\xfc\x26\x89\xbd\x9f" - "\x44\x9d\x2f\xd6\xd5\x76\x1f\x58\x87\x74\x6b\x00\xb1\xdd\x47\x46" - "\x63\x1f\x28\xf7\x1a\xe1\xbe\xb3\x17\xcb\xb6\xb5\x01\xc4\x8c\xd8" - "\xbe\x63\xbb\x3e\xdd\xaa\x81\x7a\x0f\x60\xbf\x43\x31\x77\x59\x02" - "\x3f\xbf\xb1\xd8\x63\xee\x91\x44\x02\x02\x18\xb4\xd5\xeb\x75\xf0" - "\x3b\xfe\xdd\x69\xdd\xbe\xb2\x34\x7c\x1f\x8a\x71\x55\x71\xc7\x07" - "\x0b\x30\xc1\x95\x6f\x92\x28\xdf\x7f\x86\xa8\xfc\x50\x28\x3f\x1e" - "\xca\x47\xed\xf6\x3a\xe6\xec\xfc\xd9\x75\x60\x9e\x8e\xa7\xe5\xdb" - "\x70\xcb\x64\x26\x18\x63\x13\xc8\x43\x57\x54\xdd\x03\x28\x9f\x76" - "\x62\xdb\x88\x1d\x63\xa5\xb2\xe6\x5b\xed\xc6\x58\x09\xc7\xe0\xed" - "\xd6\x1a\xe8\xf8\x2a\x55\x77\x76\x4f\x2b\xcc\x8d\xa1\x06\x2d\x04" - "\xfd\xc6\x8f\xb1\x3a\x8b\xe7\x3b\xe8\x16\x55\xf1\x63\xac\x54\xfe" - "\xec\xfb\x4e\xbd\xaa\xfb\xb3\xf5\x2a\xa2\x82\xcf\x06\x7a\xbc\x53" - "\xa2\xf0\x78\xd3\x18\x46\xee\x38\x8e\x0f\xe7\x72\xc4\xb5\x5f\xef" - "\xc3\x3c\x61\xf7\x89\xb6\xdc\xac\x8c\xf7\x55\xa0\x91\x9f\xd4\xf1" - "\x1a\xf9\x49\x9d\xbc\x46\xee\xde\xe0\x5c\x23\xf7\xf6\xe6\x35\xf2" - "\xe3\x51\xf4\xb9\x7f\x7c\x12\x7d\xee\x1f\x67\xdf\x85\xa6\x43\x79" - "\xe6\x8f\x77\x84\x33\x9f\x44\x1b\x10\xe7\x9b\x41\xf3\xee\x5e\x74" - "\x4c\xb5\x0b\x3c\x96\x05\xf4\xf1\x7b\x09\xc4\x0b\xd7\x96\x7b\x0f" - "\xda\xb0\xd4\x5c\x49\x8a\xbd\x50\x23\x7f\x03\xe5\xf4\x5a\x52\x82" - "\xef\x37\xb3\x92\x75\xb4\x5d\x7a\x84\x40\x2c\x3c\x4b\x4d\x26\xf6" - "\x3a\x3c\x07\xfd\x5a\x35\xea\xe4\x43\xd6\x63\xaa\x4d\x09\xa8\xa1" - "\x77\x04\x0a\x35\x74\xfd\xaa\x1e\x29\xd2\xda\xb9\xd7\xb3\xe6\x55" - "\x42\xed\xdc\xa3\x18\xb5\x33\xe6\xf3\x51\x0f\x58\xa9\x66\x0e\x00" - "\xfd\x1c\x88\x3a\x1a\xb5\xb3\x55\xa4\x9d\x7b\x6e\x71\xae\x9d\x7b" - "\x34\x3c\xd0\xce\xad\xa5\x9d\x6d\xf9\x03\x7b\xed\xdc\x33\xc6\x3d" - "\xed\xdc\x33\xfa\x81\x76\x6e\x6b\xda\xb9\x67\xa8\x4d\x3b\x5b\x53" - "\x7d\xdb\x63\x3e\x7f\x73\x93\x76\xee\x35\xcd\x51\x3b\xf7\x8a\x74" - "\xd4\xce\x3d\xb2\xc4\xda\xb9\xcf\x7c\x47\xed\xdc\x6b\xbb\x9c\x76" - "\x06\xde\xaa\x45\xed\x8c\xf8\x42\x1d\x8d\xfa\x19\xea\x3b\x8e\x62" - "\xad\xd7\x19\xf7\xb4\x73\xaf\x0a\xd7\xb4\xf3\xe3\xc3\xa4\xb5\x73" - "\x77\x93\xbc\x76\xee\x6e\x92\xd6\xce\x01\x67\x78\xcd\x13\xb0\xad" - "\xed\x6b\xe7\x80\x71\xd2\xfa\x26\x60\x2a\xd5\xce\x8f\x0f\x6d\x79" - "\xed\xfc\xf8\x50\x69\xed\x1c\x70\x94\xea\x8c\xc7\x87\x3b\x6a\x67" - "\xf8\x8e\xa4\x76\x0e\x68\xe0\xbe\x33\x54\xac\x9d\x69\x19\xd0\x67" - "\xfa\xc9\x6b\xe7\xde\x7b\x69\x1f\xda\x7b\x19\xed\x43\x69\x4c\x1d" - "\xb5\x73\xef\xd7\x9a\xd7\xce\x14\x43\x6c\x3d\x65\xb5\x73\xef\x2d" - "\x8e\xda\xb9\xbb\x49\x5a\x3b\x3f\xb9\x84\xc7\xd1\x93\xdd\xc5\xda" - "\xb9\xf7\x4f\xf7\x87\x76\x96\xc5\xd6\x38\xb1\x76\x7e\x62\xbf\x72" - "\xed\xfc\xc4\x55\x65\xda\x19\x31\x27\xa5\x9d\x9f\x1c\x66\x8f\x39" - "\xb1\x76\x7e\x32\x44\x5a\x3b\x3f\x19\x23\xd6\xce\x58\xbe\x94\x76" - "\x7e\x72\x83\xa8\x7c\x07\xed\xfc\xe4\x17\x62\xed\x4c\xaf\xe3\xb5" - "\x73\x9f\x30\x2e\x17\xb1\x45\xb9\x76\xee\x33\xc2\xb9\x76\xee\x33" - "\x56\xac\x9d\xfb\xf8\x53\x8d\xdc\x27\x96\x6a\xe7\x3e\x03\x38\x0d" - "\x9e\x2f\x3c\xce\x6b\x67\x7a\xdc\x51\x3b\xf7\x59\xd1\x8c\x76\x1e" - "\xea\xba\x76\x1e\x14\x7f\xac\x49\x3b\x0f\x8a\xb7\x69\x67\x2b\xe8" - "\xc7\xcd\xa0\x03\xe0\xaf\x06\xe7\x5a\xe0\x33\x77\x59\xd5\x77\x98" - "\x73\xfd\x3c\xe0\x73\x5e\x3f\x3f\xdd\x8e\x3e\xfb\xfd\x7f\xa2\xcf" - "\x7e\xff\xed\x4d\x39\x66\xd0\xce\xa8\xa1\xb9\x1c\x73\x79\x3a\xfc" - "\xed\x4e\x38\xc6\xea\xe7\x5d\x75\x26\x15\x6a\xe8\x95\x38\xee\x13" - "\x74\xf4\xd7\x9c\x86\x2e\x35\x0e\xe5\x74\x74\x7f\x3f\xe8\x33\xf4" - "\xe9\x5a\x76\x2e\x98\x37\xd4\xaf\x82\xd5\xcf\x71\x26\xf2\x5f\xb7" - "\x86\xe2\x7b\xf8\x0a\x9d\x96\x5e\x07\xf7\x59\xc9\xeb\xed\xbe\x47" - "\x45\x7a\x3b\x8e\xd5\xdb\xe5\xa8\xb7\xbf\x3e\x46\xc8\x21\x2d\xd5" - "\xdc\xa8\xb7\x51\x77\x83\xde\x2e\xdb\xd4\x8d\x29\xaa\x5f\xd5\xd7" - "\x68\xd3\xdc\xab\xe1\x33\xc4\x5a\x7f\x04\xa2\xb2\xe9\x2d\xe2\x05" - "\x31\xa9\x78\x0f\x7e\x03\xaf\xaf\x5f\xf5\x54\x4f\xdb\x75\xd0\x67" - "\x97\x51\x5d\xde\xaf\xdc\x2a\xca\x69\x3f\x15\x85\x9e\x84\xed\x8f" - "\xa1\x1d\x50\x67\xd9\x72\xda\xd6\xbe\xd1\x81\x8c\x1f\xd5\xe6\xe2" - "\xbc\xb6\x66\x84\x4d\x9b\xa7\x73\xda\xbc\xc1\x17\xb4\x79\xac\x4d" - "\x9b\x3f\x95\xed\xa6\x36\x2f\x67\x35\xde\x84\x96\xd7\x78\x1b\x16" - "\xdd\x7b\x6d\x8e\xba\x1c\xb5\x38\xea\x72\xd4\xe9\xa8\xcd\x51\xa7" - "\x5b\x39\x6d\x8e\xeb\x1e\x9a\xea\x9b\xd1\xe6\xa0\xdd\x98\x87\x1f" - "\x8e\x60\xb5\xb9\x87\x50\x9b\x6b\x3a\xb8\xa7\xcd\x35\xde\x42\x6d" - "\x8e\xb8\x57\xaa\xcd\x31\xf6\x0e\xef\x62\x71\x5f\x07\x88\x1f\xc6" - "\xca\xe9\xbb\x3b\x2e\x8e\x18\x37\x8c\x19\xc6\x4e\x36\x6e\x42\x6d" - "\x0e\xb8\x2b\x32\xdd\x3b\x6d\xae\xb1\xd3\xe6\xa8\xc5\xa1\xed\xaa" - "\x51\xa3\x97\xea\xa0\x6d\xe6\x83\x4e\x07\x8d\x6e\xaf\xcf\x31\xbe" - "\xae\xe9\xf3\xdf\x19\x9b\x72\xdb\x2a\xdf\xf6\x9b\x31\xb7\xdd\xd5" - "\xa6\xcf\xfb\x19\x1d\xf5\x79\x7f\x6f\x81\x3e\x2f\xd3\xab\x9e\x1a" - "\x20\xd6\xe6\x81\xfd\x1c\xb5\x79\xff\xb1\xb2\xda\xbc\x9b\x84\x36" - "\xf7\xb3\x69\xf3\xfe\x0b\xdd\xd3\xe6\xfd\xe3\xe4\xb4\x79\xbd\x5a" - "\xa8\xcd\xfb\x9f\xe6\xb5\x79\x9c\x40\x9b\xf7\x1d\x2a\xaf\xcd\xfb" - "\xd2\x79\x59\xea\xdd\xf1\x58\x16\x6a\x2a\x7c\x57\x18\x80\x73\xf6" - "\x55\x03\x96\xa3\xae\xc2\x5c\x06\xd4\x1f\xb4\xd5\x80\xa9\x42\x8d" - "\x8e\xef\x08\x9d\xe9\xa8\xd8\xb7\x48\x2f\xd4\x52\xa8\xa3\x6c\xba" - "\x17\xaf\x47\x3d\xd5\xba\x5a\xea\x69\x83\xb4\x96\x7a\xda\xc2\xea" - "\x64\x9c\xeb\xa9\xea\x5f\x8e\x7d\x62\xcb\x6a\xf5\xfe\xe5\xd2\x5a" - "\x7d\xc0\x7c\xaa\x6b\xfa\x57\x60\x5c\xc4\x5a\x1d\xbe\x23\xa9\xd5" - "\x07\x6c\xe3\xbe\x53\x2e\xd6\xea\xb4\x0c\xe8\x9f\x0f\xcb\x6b\xf5" - "\x81\x33\x68\x7f\x3d\x70\x20\xed\xaf\xb9\x18\x3b\x68\xf5\x81\xed" - "\x84\x5a\x1d\xe3\xef\xa8\xd5\x29\xa6\xd8\x7a\xca\x6a\xf5\x81\x93" - "\x1c\xb5\x7a\xdf\xa1\xa8\xd5\xa5\x71\x35\x68\xb0\x18\x57\xcf\x9c" - "\x32\x59\x6d\x9a\x7d\x15\x96\xb7\xc9\x5e\xb3\xdf\x87\x58\x33\xf0" - "\xba\x1d\xef\xe9\x99\xf9\xca\x74\x3b\xfb\x9d\x6d\xca\x74\x3b\xe2" - "\x4f\x4a\xb7\x3f\x73\xdd\x1e\x7f\x62\xdd\x3e\xa8\xa3\xb4\x6e\x1f" - "\xd4\x57\xac\xdb\xb1\x7c\x29\xdd\x3e\x68\xaa\xa8\x7c\x07\xdd\x3e" - "\x28\x46\xac\xdb\xe9\x75\xbc\x6e\x0f\xf4\xe5\xf2\x20\xe7\x94\xeb" - "\xf6\x41\x37\x9d\xeb\xf6\x41\x16\xb1\x6e\x1f\x54\x46\xf5\x79\xa0" - "\xc6\xc4\xea\xf6\x41\xd5\x9c\x9e\xaf\x14\x1e\xe7\x75\x3b\x3d\x6e" - "\x12\xea\x76\x1d\xea\xf6\xc0\xa0\x66\x74\x7b\x90\xeb\xba\xfd\x05" - "\x81\x6e\x7f\xa1\x19\xdd\x1e\x78\xdd\xb9\x6e\x1f\x2a\xd0\xed\x7f" - "\xe0\x74\xfb\x10\x4e\xb7\x0f\xd9\x6e\xcb\x7b\xa3\x6e\xb7\x3c\xb1" - "\x23\x9c\xcb\x7b\x1f\xdb\xb5\xa8\x4c\xb5\xdb\x96\xf7\x5e\x00\x7a" - "\xdc\x40\xbc\x57\x2e\x20\x04\x35\x3b\x8e\x0d\x29\x32\x0d\xe5\xc6" - "\x87\x0c\xf1\xcb\x45\xcd\x7e\x19\xae\xa9\x06\xcd\x0e\xba\xfb\xbf" - "\x1a\x87\xaa\xe0\x7e\x2a\x44\xd7\x2e\x6a\xba\xb6\xd2\x76\x2d\x6a" - "\x75\xb8\xbe\xa8\x04\x74\x3b\x7e\x07\x9e\xff\xa2\x22\x1c\x77\xa2" - "\x3d\xc1\x5e\x0b\x65\x94\xf1\x1a\x7f\xf0\x76\x56\xe3\x1b\x38\x8d" - "\x0f\xdf\x01\xed\x72\xac\x49\xe3\x37\x96\xa9\x32\xeb\x44\x1a\xff" - "\x48\xfd\xaa\xc1\xe5\x36\xdd\x9e\xc1\x69\xfb\x4c\x2b\xab\xed\xcb" - "\x41\xdb\x57\x50\x6d\x3f\xd8\x64\xbb\x06\x30\x53\xc9\x5e\x73\x99" - "\xbd\xa6\x08\xae\x29\xa3\xd7\xfc\x5e\xa8\xff\x8f\x50\xfd\xff\x9c" - "\x9d\xfe\xff\x3d\xab\xff\x6d\x79\x79\xd4\x30\xc2\xdc\xbc\xd5\x4f" - "\x2a\x37\xff\x6c\x93\xfe\xcf\x10\xea\xff\xa6\xdc\xfc\xef\x15\xe9" - "\x7f\xf8\xcd\x63\x36\x2d\x79\x57\x74\x64\x9d\xb4\x8e\x6c\x6b\xfa" - "\xdf\xba\xea\xe1\x08\x7b\xfd\x8f\x9e\xc0\x96\x9b\xb7\x8a\x72\xf3" - "\xcf\xba\xa9\xff\x9f\x15\xe9\x7f\x8c\xa3\x1b\xb9\xf9\x63\x77\xc5" - "\xb7\xb5\xa1\xdc\x7c\xeb\xeb\xff\xff\x30\x0a\xf3\xf3\xa8\xff\xf9" - "\xfc\xfc\x73\x12\xfa\x7f\x88\x50\xff\x1f\xd1\xab\x7e\x6f\xa7\xff" - "\x87\x4b\xe8\xff\x21\x6e\xea\xff\x21\x6e\xea\xff\x21\x2e\xea\xff" - "\x21\x32\xfa\x3f\xd0\x20\xaf\xff\x03\xe9\xfa\x9e\x99\xbc\x4e\xc3" - "\xf7\xa0\x01\x8b\x50\xa7\x0d\xa5\xfa\x9f\xea\x36\xd0\x69\x43\xef" - "\x13\xfd\xff\x07\x19\x4d\xf6\x07\x81\xfe\x1f\xd2\x0a\xfa\x7f\x88" - "\x8c\xfe\x1f\xca\xe9\xff\x21\x12\xfa\x7f\x88\x8c\xfe\x1f\xca\xe9" - "\xff\x21\x76\xfa\x7f\x08\xa7\xff\x87\x3a\xd1\xff\xc3\x38\xfd\x3f" - "\x8c\xd3\xff\x34\xc6\x8e\xfa\x7f\x98\x0b\xfa\x7f\x08\xa7\xff\x87" - "\x38\xd1\xff\xc3\x24\xf4\x7f\xa0\x01\xf5\xbf\x34\xae\x5e\x18\x2c" - "\xc6\xd5\xf3\x76\xfa\x7f\xd8\x7d\xa4\xff\x65\xb1\x66\xa7\xff\x9f" - "\x77\x43\xff\x3f\xaf\x50\xff\x0f\x91\xd1\xff\xcf\x5f\xb7\xc7\x9f" - "\x58\xff\xbf\x20\xa3\xff\x5f\xb0\xd3\xff\x43\x64\xf4\xff\x0b\x53" - "\x45\xe5\x3b\xe8\xff\x17\xec\xf4\xff\x10\x3b\xfd\x3f\x9c\xd3\xff" - "\x81\xd9\xca\xf5\xff\x0b\xcd\xe8\xff\x17\xec\xf4\xff\x0b\x9c\xfe" - "\x1f\xce\xe9\xff\x17\x38\xfd\x1f\x98\x25\x3c\xce\xeb\x7f\x7a\xdc" - "\x51\xff\x0f\x6f\x4e\xff\xfb\x98\xb7\x46\x07\x34\xf6\x89\x0e\x6c" - "\xcc\xca\x0b\x7e\xba\xfa\x71\x4b\xd3\x9e\x07\xe1\xa0\x07\x2a\x41" - "\x1f\xcc\x22\x2a\x5c\x37\x40\x7b\x0a\xfa\xfd\x59\x74\x7c\x3f\xf6" - "\xfd\x38\xfe\xa4\x30\x41\xd7\x0e\xda\x94\xdc\xf6\x4d\x24\xe6\x01" - "\xc9\x41\xa8\x01\x1a\xb6\x46\x13\x53\x56\x46\x68\x03\x8e\xed\x8f" - "\x26\xaa\x37\x6a\xa5\x75\xdd\xd2\x4a\xc6\x0a\x98\xf7\x9e\x12\x46" - "\x35\x5d\x71\xe4\x25\x16\xc7\xa8\x0b\x36\xde\x02\x2d\x60\xac\x60" - "\x75\x82\x4f\x78\x00\xc9\xd5\x12\xdf\x8e\xb5\x44\xdd\xd1\xc3\xa3" - "\xfd\xcb\xaf\x11\x62\x01\x8d\x30\xb6\x1f\x63\xed\x5f\x1d\x80\xeb" - "\x04\x75\xa2\x3a\x61\x5f\x3b\x33\xa7\x13\x3e\xbc\x45\x06\x6c\x5a" - "\x04\xfa\xa0\x98\xea\x03\xdc\x1f\xa1\x81\xea\x83\x5e\x8d\xf5\x9a" - "\x27\x9a\xc6\xf6\x37\xcd\xd9\xe0\xc7\xf6\xdf\x5e\xc3\x6b\x03\xd4" - "\x05\xcc\x1b\x1a\x32\xc8\x44\xc7\x5a\x24\x4c\xa5\x63\xfb\x07\x54" - "\x13\x55\xde\x4c\xe2\x5d\x14\x5e\x85\xf3\xf0\xfd\x8b\xaa\xb7\x91" - "\x25\xe3\x49\x2f\x33\x6a\x81\x54\x66\x4f\x51\x75\x36\xc1\x35\x10" - "\x41\x2b\x0e\xcd\xe1\xf4\xc0\xc4\x59\x32\x7a\x00\xfa\x60\xd4\x04" - "\xb4\xef\x1d\x71\xfd\xa8\xe6\x28\x51\xae\xf3\x46\xb0\xdc\x29\x3b" - "\xe7\x77\x6b\x74\xa0\xb9\x4f\x34\xb1\xf8\xe6\x05\xd3\x35\x31\xb3" - "\x52\xac\x1f\x7f\x1a\x8b\x6b\x1d\x7e\x5a\x55\xe3\x81\xeb\x7b\xe3" - "\x5e\x97\xd6\x9d\xc9\x41\xa2\xf9\x18\xb7\xb9\x98\xdd\xa6\x31\x43" - "\x7d\x37\xa3\x96\x30\x6f\x98\x55\x04\xce\x75\x62\xe7\x63\x98\xf4" - "\x84\xdf\xf3\xd2\x9f\x6c\xb6\xd2\x75\x25\xad\x4b\x23\x3b\x58\x21" - "\x2e\x4c\xaa\x8a\x14\xde\x32\xb1\x1a\x2e\x0d\xf7\xc1\x5c\xe6\xd1" - "\x11\x35\x1c\x60\xff\xe1\xbc\x46\x88\xd1\x45\x1a\x23\x26\xd5\x9b" - "\xfd\xd7\xbc\x54\x13\x00\x65\x3f\x71\xfb\x36\x68\x38\x6e\xcf\x4c" - "\xdb\x1a\xbb\xec\xdc\x9a\x46\x9c\x5b\x53\x41\xcc\x6b\xe8\xba\x85" - "\x80\x0b\x0f\x5c\xef\x03\xea\xd0\x93\x9d\x53\x73\x5b\x83\x38\x52" - "\x6f\xbe\x8c\xf3\x80\xce\xb2\xf1\xb1\x70\x71\xc1\xbd\x33\x6d\xda" - "\xac\xa4\xe0\x34\x9d\x57\x69\x17\x8b\xdb\xdb\xa8\x06\x67\xe7\xb9" - "\xac\x1a\x3e\x0d\xc7\xc8\x5c\x53\xfd\x71\xe5\x51\x50\x37\x21\x71" - "\x4a\xe3\xf2\xc7\x15\x6d\x23\x2e\xea\x5f\x59\x5c\xfe\x73\x28\x8d" - "\xcb\xc8\xde\xee\xc5\x65\x64\x40\xdb\x88\x8b\xf7\xaf\x2c\x2e\x7f" - "\x2c\xa3\x71\x19\xb5\xdf\xbd\xb8\x8c\xda\xe7\x2c\x2e\x98\xab\xb2" - "\xe5\xa9\x6c\x39\x2a\xec\x4f\xa9\xdf\x99\x90\xc6\x8f\xc9\x9c\x90" - "\x26\x1c\x93\x79\xf2\x08\xe6\x6f\x56\x91\x13\x63\xb0\xaf\x1c\xbd" - "\xda\x79\x6e\xea\xa5\x72\x3e\x37\xf5\xe2\x73\x54\xa3\xbe\xd8\x9d" - "\x6a\xd4\xb1\xec\xb8\xed\xa4\x73\x44\x65\x7e\x6a\x5e\xf0\xae\x79" - "\x3a\x15\xce\x5f\xda\x75\xcd\xa4\x4a\xab\x03\xcd\xa9\x7a\x9c\xc1" - "\x9c\xd4\xea\x05\x38\x16\xd3\x48\x40\xef\x3d\x7e\x45\x35\x76\x2a" - "\xae\xbb\x76\xe8\x9a\x8e\xcd\x05\x31\x4f\x7c\x1a\xbb\xb3\x87\xc1" - "\x03\xfb\xd1\x5d\xf3\x4c\x2a\x1b\x96\x6c\xf3\x1a\xa1\x3d\x03\x6f" - "\x6c\x8b\x0e\xc0\x71\x93\x8d\x7e\x19\xa1\x16\xbf\xbc\x60\x73\x61" - "\x72\x90\x14\xbe\xd8\xf9\x92\xd0\x87\xe2\xfc\xc6\x99\xb1\x3c\xce" - "\xac\x4b\x29\xbe\x4a\x40\xb3\xe3\xde\x42\x9d\xa1\xef\x64\x6e\x47" - "\x76\x98\xbe\x1d\x62\xcf\x61\x0c\xfa\x6f\x79\x8c\x6d\x10\x63\xec" - "\x06\x87\x31\xc0\x5a\x13\xc6\x04\xf3\x1d\x03\x29\xc6\xf4\x4d\x18" - "\x63\xfb\xce\xa5\x9a\x9e\x88\x33\x1b\xc6\xb0\xdf\xa4\x18\xab\x92" - "\xc5\xd8\xc9\x4a\x69\x8c\x99\xfb\x0a\x31\x36\x32\x92\x62\x6c\xec" - "\x63\x47\xc3\x00\x63\x61\x4a\x31\x36\xb6\xa7\xd8\x3b\xbf\x3c\xcc" - "\xd1\x3b\x8f\x5d\x66\xef\x9d\x6d\x5e\xf9\x86\x5f\x56\xd0\x0d\xf0" - "\xcb\xc6\x26\xbf\x3c\x76\x9b\x7b\x7e\x79\xec\x56\xd7\xc6\xb2\xbd" - "\xd8\xee\x44\x22\x21\x27\xe0\x79\x2a\x0d\xa6\x63\xd9\x3e\x65\xfd" - "\xf2\xe8\x4c\xc4\xa1\xb4\x5f\xa6\xe7\x1c\xc7\x20\xbd\xb4\x8d\x1f" - "\x83\xf4\xd2\xfc\x86\xb5\xd2\x63\xd9\x76\x68\x73\x04\xde\x25\x47" - "\x62\xbc\x51\x8e\xdd\x78\xa3\x1c\x09\xdf\x92\x43\xf0\xbb\x42\xdf" - "\x72\x22\x98\xfa\x96\x13\xc1\xe8\x5b\x72\x58\xbd\x77\x22\xd8\xe6" - "\x5b\x72\xe0\x3c\xf5\x2d\x27\x82\x2f\xc3\x1f\xfa\x96\x97\x7c\x4f" - "\x04\x4b\xf9\x96\x97\x1e\xa3\x63\xd9\x5e\xf4\x92\x1f\xcb\x96\x23" - "\xf0\xc7\x39\x02\x7f\x9c\xc3\xf9\xe3\x1c\xd6\x1f\xd3\xdf\x1c\xc0" - "\xd6\x0d\x7f\x13\xcb\x14\xfe\x26\xef\x1f\x5e\x5a\x43\xfd\xc3\x8b" - "\xde\x18\x07\xb1\x3f\x86\xef\xc4\x4b\xf9\xe3\x97\xb8\xf1\x6f\x2f" - "\x7a\xd9\xfc\x71\x23\xbd\x9e\x2d\x03\xb8\xe6\xa2\xbc\x3f\x1e\x97" - "\x44\xb9\x67\x1c\x37\x1e\x9c\xc6\xd4\xd1\x1f\x8f\x13\xfa\x1f\x99" - "\xb1\x6c\x14\x43\x6c\x3d\x63\xe5\xfc\xf1\xb8\x18\x47\x7f\x3c\x3a" - "\x4d\x7a\x2c\xdb\x84\xb1\x3c\x8e\xc6\x5f\x12\x8f\x65\x1b\xf7\x85" - "\xd0\x17\x23\xc6\xee\x33\x6c\xf9\x8a\xc7\xb2\x8d\x5f\x2e\xed\x89" - "\x73\x04\x9e\x38\x87\xf5\xc4\x27\x82\x6d\x63\xd9\xc6\xef\xc7\xb2" - "\x1d\x3d\x71\x4e\xd3\xf5\x36\x4f\x8c\xdf\xa1\x98\x93\xf2\xc4\x13" - "\xda\xd9\x63\x4e\xec\x89\x27\xf4\xb6\x79\xe2\xc6\xe9\x42\x4f\x3c" - "\x61\x98\xd8\x13\x63\xf9\x52\x9e\x78\xc2\x1c\x51\xf9\x0e\x9e\x78" - "\xc2\x32\x9b\x27\xc6\xf2\x6d\xb8\xe5\x3d\xf1\xcb\x7d\x28\x87\x8e" - "\x7e\x4e\xb9\x27\x7e\x99\xcd\xeb\x14\x6e\xa4\xef\x9c\xc4\x7e\xf8" - "\xe5\x8e\x62\x3f\x3c\x41\x4f\x7d\xef\xcb\x43\xe9\x38\xb6\x09\x46" - "\x7a\x7c\xf4\xb3\xc2\xe3\xbc\x1f\xa6\xc7\x71\x1c\x1b\x1d\xbf\xf6" - "\xf2\x38\x65\x3e\xf8\x37\x6d\xd0\x07\xfb\x3b\xf1\xc1\xfe\xbf\x32" - "\x1f\x3c\xb1\xc1\x3d\x1f\x3c\xd1\xd4\x36\x74\xfd\xaf\xcd\x6f\xbd" - "\x1c\x46\x35\xd7\xe4\x35\xee\xe9\xfa\xc9\x99\x6d\x23\x2e\xbf\x36" - "\xbf\x35\x29\x88\xc6\x25\xb8\x9f\x7b\x71\x09\x96\xdd\xff\xb0\x79" - "\xbf\xf5\xaa\x99\xf7\x5b\xaf\x9a\xe5\xfd\x56\xb0\xc5\xb9\xdf\x0a" - "\x19\xc3\xfb\xad\x3f\x6d\xa3\x9a\xe7\x4f\x2b\xa9\xe6\xf9\xd3\x78" - "\xe5\x7e\xeb\x95\xc3\x0f\xfc\x56\x4b\xfa\xad\xc9\x15\x14\x63\xaf" - "\xac\x76\xcf\x6f\xbd\x92\x26\xf6\x5b\xa1\xdb\x1d\xfd\xd6\x2b\xd7" - "\x5d\xf7\x5b\x7f\xf2\x73\xcf\x6f\xfd\xc9\xd7\x35\xbf\xf5\xa7\x85" - "\xd2\x7e\x6b\x2a\x91\xf7\x5b\xf4\x9c\xa3\x4e\x0e\xf1\xe3\x75\xf2" - "\xb4\x8b\x6d\xdf\x6f\x4d\x7b\x5f\x5a\x13\x4f\x5b\x4d\xfd\xd6\x9f" - "\xe2\x5a\xde\x6f\xfd\x29\x4e\xda\x6f\x85\x78\x50\x6d\xfa\xa7\x78" - "\x47\xbf\x05\xdf\x91\xf4\x5b\x21\xcf\x71\xdf\x89\x13\xfb\x2d\x5a" - "\x06\x70\xcd\x54\x79\xbf\x15\x72\x95\x72\x4f\xc8\x41\xca\x3d\x34" - "\xa6\x8e\x7e\x2b\x24\xbb\x79\xbf\x45\x31\xc4\xd6\x53\xd6\x6f\x85" - "\x9c\x73\xf4\x5b\xc1\x66\x69\xbf\xf5\xea\x17\x3c\x8e\x5e\x0d\x11" - "\xfb\xad\x3f\xf7\xbd\x3f\xfc\x96\x2c\xb6\xde\x17\xfb\xad\x3f\xdf" - "\x54\xee\xb7\x5e\xed\xa7\xcc\x6f\x21\xe6\xa4\xfc\xd6\xab\x0b\xed" - "\x31\x27\xf6\x5b\xaf\xae\x91\xf6\x5b\xaf\x6e\x17\xfb\x2d\x2c\x5f" - "\xca\x6f\xbd\x7a\x5a\x54\xbe\x83\xdf\x7a\xf5\xba\xd8\x6f\xd1\xeb" - "\x78\xbf\x15\x9a\x45\x39\x34\x78\x9b\x72\xbf\x15\xba\x50\xde\x6f" - "\x85\x26\x89\xfd\x56\x68\x30\xf5\x55\xa1\x05\xd4\x6f\x85\x46\xd0" - "\xe3\xc1\x5b\x85\xc7\x79\xbf\x45\x8f\xf3\x7e\x2b\x74\x9f\x32\xbf" - "\xd5\xb9\x0d\xfa\x2d\xb5\x13\xbf\xa5\xfe\x95\xf9\xad\xd7\xa3\xdc" - "\xf3\x5b\xaf\x47\x3e\xd0\xf5\xad\xa1\xeb\x43\x8b\xa8\xe6\x0a\xf3" - "\x70\x4f\xd7\xe3\x16\x1d\xee\xea\xfa\x37\xcb\x79\x5d\xff\x66\xb9" - "\xbc\xae\x0f\x6b\x66\xfd\xb7\x59\x3d\x79\x5d\xff\x06\x97\xcb\x7c" - "\x63\x16\xed\x5b\xdf\xe8\xad\x5c\xd7\xcf\xdc\xf0\x40\xd7\xb7\xa4" - "\xae\x7f\x7d\x0f\xc5\xd8\xcc\x39\xee\xe9\xfa\x99\x11\x62\x5d\x1f" - "\xb1\xcc\x51\xd7\xcf\x3c\xee\xba\xae\x9f\x79\xd5\x3d\x5d\x3f\xb3" - "\xd6\x35\x5d\xff\xc6\x24\x69\x5d\x1f\x56\x21\xaf\xeb\xe9\x39\x47" - "\x3d\x16\x7e\x95\xd7\x63\xe1\xfb\xdb\xbe\xae\x0f\x0f\x93\xd6\x5e" - "\xe1\x73\xa8\xae\x7f\x63\x62\xcb\xeb\xfa\x37\x26\x4a\xeb\xfa\xf0" - "\x33\x54\x03\xbd\x11\xec\xa8\xeb\xe1\x3b\x92\xba\x7e\x56\x47\xee" - "\x3b\x13\xc5\xba\x9e\x96\x01\x5c\xd3\x4f\x5e\xd7\xcf\x3a\x4a\xb9" - "\x67\x56\x36\xe5\x1e\x1a\x53\x47\x5d\x3f\x2b\xa6\x79\x5d\x4f\x31" - "\xc4\xd6\x53\x56\xd7\xcf\xfa\xc2\x51\xd7\x87\xc9\xac\xa7\xf5\xe6" - "\x6a\x1e\x47\x6f\x0e\x14\xeb\xfa\x59\x96\xfb\x43\xd7\xcb\x62\x2b" - "\x4c\xac\xeb\x67\x17\x2b\xd7\xf5\x6f\x7a\x28\xd3\xf5\x88\x39\x29" - "\x5d\xff\xe6\x24\x7b\xcc\x89\x75\xfd\x9b\x51\xd2\xba\xfe\xcd\x65" - "\x62\x5d\x8f\xe5\x4b\xe9\xfa\x37\x0b\x45\xe5\x3b\xe8\xfa\x37\x8f" - "\x8b\x75\x3d\xbd\x8e\xd7\xf5\x11\xd1\x94\x43\xc3\xdc\x58\x4f\x2b" - "\x62\x92\xbc\xae\x8f\x08\x11\xeb\xfa\x08\x0d\xd5\xef\x11\x29\x54" - "\xd7\x47\x0c\xa7\xc7\xc3\x12\x85\xc7\x79\x5d\x1f\x96\x28\xd6\xf5" - "\x11\x99\xca\x74\xfd\x43\x6d\x50\xd7\x7b\x3b\xd1\xf5\xde\xbf\x32" - "\x5d\xff\xd6\x48\xf7\x74\xfd\x5b\x41\xee\xeb\xc7\x79\xbe\xbc\x7e" - "\x9c\xe7\x2b\xaf\x1f\xff\xe2\xe7\x5c\x3f\xbe\x1d\xc6\xeb\xc7\xa8" - "\x83\x94\xc3\xa3\xb6\x50\x0e\x8f\x9a\xa5\x5c\x3f\x46\x9e\x79\xa0" - "\x1f\x5b\x52\x3f\x46\x6c\xa5\xfa\x31\x72\x9b\x7b\xfa\x31\x72\xab" - "\x58\x3f\xce\x3b\xec\xa8\x1f\xa3\x3a\xb8\xae\x1f\xa3\x06\xba\xa7" - "\x1f\xa3\x06\xb8\xa6\x1f\xa3\x56\x4b\xeb\xc7\xbf\xf8\xcb\xeb\x47" - "\x7a\xce\xb1\xdf\x7f\x7b\x20\xdf\xef\xcf\x6d\x68\xfb\xfa\x71\x6e" - "\xae\x74\x1f\x3f\x77\x1b\xd5\x8f\x51\x69\x2d\xaf\x1f\xa3\xd2\xa4" - "\xf5\xe3\xdb\xdd\x69\x5f\x1b\x95\xe9\xa8\x1f\xe1\x3b\x92\xfa\xf1" - "\x6d\xae\xff\x8f\x4a\x13\xeb\x47\x5a\x06\x70\x4d\x94\xbc\x7e\x8c" - "\xe6\xe6\xa7\xbe\x7d\x9a\x72\x0f\x8d\xa9\xa3\x7e\x7c\xbb\xb0\x79" - "\xfd\x48\x31\xc4\xd6\x53\x56\x3f\xbe\x7d\xd3\x51\x3f\xfe\xc5\x57" - "\x5a\x3f\xc6\x14\xf3\x38\x8a\x89\x11\xeb\xc7\xe8\x11\xf7\x87\x7e" - "\x94\xc5\x56\xae\x58\x3f\xc6\x74\x54\xae\x1f\x63\x46\x2a\xd3\x8f" - "\x88\x39\x29\xfd\x18\xb3\xda\x1e\x73\x62\xfd\x18\xb3\x5d\x5a\x3f" - "\xc6\x1c\x16\xeb\x47\x2c\x5f\x4a\x3f\xc6\x5c\x15\x95\xef\xa0\x1f" - "\xe7\x75\x10\xeb\x47\x7a\x1d\xaf\x1f\xe7\xed\xa4\x1c\xfa\xd6\x41" - "\xe5\xfa\x71\xde\x6a\x79\xfd\x38\x2f\x5b\xac\x1f\xe7\x45\x52\x9d" - "\x38\x4f\x47\xf5\xe3\xbc\x44\x7a\xfc\xad\x03\xc2\xe3\xbc\x7e\xa4" - "\xc7\x79\xfd\x38\xaf\xac\x39\xfd\xe8\x5c\x5b\x2c\x12\xec\x4d\xb0" - "\x48\xb4\x37\xc1\x71\x91\xb6\x78\x67\xbe\x73\x6d\xf1\xae\x60\x6f" - "\x82\x05\xdc\xde\x04\x0b\xb8\xbd\x09\xe6\xb3\x7b\x13\x24\x4d\x02" - "\x0d\x00\xda\xa2\xf0\xca\x1e\xaa\x2d\xae\x98\x54\x1f\x5e\xe3\xb4" - "\x45\x2d\xf1\x4e\x9b\xc7\x69\x8b\x99\xa8\x2d\xe6\x8f\x47\x6d\xe1" - "\x93\x0b\xfa\xb6\x9a\xd3\xbb\xb1\xa0\x77\xab\xe1\x33\x3c\x3b\x87" - "\xa0\x8c\x12\xd0\xa4\x99\xf8\x7d\xdc\x1f\x03\xca\x62\xe7\xc9\xb2" - "\x73\x68\xf5\xed\x02\x66\xd3\xf9\xb7\xb8\xbf\x89\xdc\xde\x26\xb6" - "\x7d\x4d\x12\xab\x19\x2b\xee\x63\x32\x25\x42\xb0\xbf\x09\xee\x89" - "\x6a\xa8\x21\xb8\xc7\x49\xee\x02\xe2\xfb\x11\x6a\x8d\x1a\xa2\xee" - "\xb4\xcc\xa3\x13\xee\x6f\xd2\xc9\x48\x35\x6d\xa1\xf5\x18\xd5\xb4" - "\xef\xfa\x3f\x0c\x3a\x69\xc0\xe6\x3a\x5e\x63\xac\x43\x7d\xf1\xae" - "\x26\xc0\xf8\xae\xa6\xd7\x8d\x1b\xa0\x69\x0d\xf6\xfb\x5f\x18\xe3" - "\x71\x9f\x85\xd2\x78\x9a\x03\x65\xf7\xbd\xf8\x8b\x86\xe4\xbd\x05" - "\xba\xa7\x96\x78\x3c\x83\x7b\x5f\x14\x13\xf5\xef\x7a\x02\xef\xdf" - "\xd0\xf4\x14\xae\x65\x89\x79\x51\xeb\x0d\x0d\x29\x0a\x3f\xcb\xce" - "\x99\x35\xdb\xe6\xcc\xd6\x91\xa1\x86\x77\x35\xaa\x8d\x0b\x04\x9a" - "\xd6\x0f\x35\xed\xf3\x4e\x34\xed\x7c\x3f\xf7\x34\xed\x7c\x5f\xb1" - "\xde\x58\x3c\xd8\x51\x6f\xcc\x5f\xe2\xba\xde\x98\xef\xe6\xfa\xef" - "\xf3\x5d\x5c\xff\x7d\xbe\xc5\x5e\x6f\x6c\x67\xf5\xc6\x3b\x71\x88" - "\x4d\x69\xbd\x41\xcf\x39\xf6\x13\xef\x0a\xd6\x7f\x7f\x37\xaa\xed" - "\xeb\x8d\x77\x7d\xa4\xfb\x84\x77\xb9\xf5\xdf\xe7\x3b\x59\xff\xdd" - "\x5d\xbd\x31\xdf\x2c\xad\x37\xde\xe5\xd6\x7f\x5f\x40\x1c\xf5\x06" - "\x7c\x47\x52\x6f\xbc\xcb\xad\xff\x3e\xdf\x2c\xd6\x1b\xb4\x0c\xe0" - "\x1f\x27\xeb\xbf\xc7\x71\xeb\xbf\xc7\x71\xeb\xbf\xd3\x98\x3a\xea" - "\x8d\x38\x17\xd6\x7f\xa7\x18\x62\xeb\x29\xab\x37\xe2\x24\xd6\x7f" - "\x7f\x27\x56\x5a\x6f\x2c\x12\xac\xff\xbe\xd0\x6e\xfd\xf7\xb8\xc2" - "\xfb\x43\x6f\xc8\x62\xcb\x6e\xfd\xf7\x85\x32\xeb\xbf\x3b\xd3\x1b" - "\x0b\xf7\x2a\xd3\x1b\x88\x39\x29\xbd\xb1\xd0\x62\x8f\x39\xb1\xde" - "\x58\xd4\x5d\x5a\x6f\x2c\xb2\x5b\xff\x1d\xcb\x97\xd2\x1b\x8b\x66" - "\x88\xca\x77\xd0\x1b\x8b\x96\x88\xf5\x06\xbd\x8e\xd7\x1b\x8b\x7b" - "\x52\x0e\x7d\xa7\xbb\x72\xbd\xb1\xc8\x22\xaf\x37\x16\xb7\x13\xeb" - "\x8d\x45\x15\x54\x57\x2c\x0e\xa4\x7a\x63\x51\x2d\x3d\xfe\x8e\xbf" - "\xf0\x38\xaf\x37\xe8\x71\x5e\x6f\x2c\x7e\x30\xff\xf5\xbe\xca\x57" - "\xc5\xbb\x39\xff\x35\xfe\xc1\xfc\xd7\x56\x79\x0f\xbd\x98\x9b\xff" - "\x9a\xe0\xe6\xfc\xd7\x84\x07\xf3\x5f\x5b\x25\x2e\x4b\xb8\xf9\xaf" - "\x89\x6e\xce\x7f\x4d\x7c\x30\xff\xb5\x55\xe2\x92\xc0\xcd\x7f\x4d" - "\x72\x73\xfe\x6b\xd2\x1d\xcc\x7f\x5d\x5e\xc0\x7b\xe3\xe5\x05\xf2" - "\xde\x58\xdb\xcc\xfc\xd7\x54\x03\xef\x8d\x97\x4d\xa5\x5a\x74\xd9" - "\x73\x54\x8b\xa6\xb0\xb9\x29\x2d\x7a\xe3\x8f\x77\x84\xef\x5e\xb0" - "\x4f\x85\x6b\xb4\xe1\x9e\x91\xab\x13\x88\x97\x19\xbd\x31\xc4\x60" - "\x35\xbb\x17\xc9\x11\x12\x3b\x17\xbd\x71\x4a\x4c\x49\xb5\x70\x1f" - "\x12\xed\x39\x7e\x5d\xe4\x23\x04\xcf\x1d\xaa\xdb\xa7\xca\x6c\xb4" - "\xcb\xc9\x2f\x30\xa9\x02\xe6\x89\x73\xf2\x96\xec\xbc\x60\xcc\xc9" - "\x37\x70\xfb\x8a\xb0\x79\xf9\x81\xce\x73\xf2\x9b\x1a\xa1\xef\x94" - "\xc8\xcb\x63\x4e\x1e\xfa\xc8\x5f\x59\x4e\x3e\x91\x9b\x1b\x9b\x32" - "\xcc\xbd\x9c\x7c\xca\x50\xb1\x47\xfe\x20\xc4\xd1\x23\xa7\x6c\x72" - "\xdd\x23\xa7\x1c\x76\xcf\x23\xa7\xe8\x5c\xf3\xc8\xcb\x7a\x4b\x7b" - "\x64\x6d\xa6\x56\xd6\x23\xd3\x73\x8e\xde\x26\xf5\x30\xef\x6d\x52" - "\x57\xb7\x7d\x8f\x9c\x1a\x28\xed\x63\x52\x87\x51\x8f\xbc\x2c\xa0" - "\xe5\x3d\xf2\xb2\x00\x69\x8f\x9c\xca\xbd\xff\x5e\xd6\xc7\xd1\x23" - "\xc3\x77\x24\x3d\x72\xea\x45\xee\x3b\x01\x62\x8f\x4c\xcb\x00\x1e" - "\xb2\xc8\x7b\xe4\xf7\x36\x50\x5e\x7a\x2f\x8a\xf2\x12\x8d\xa9\xa3" - "\x47\x7e\x6f\x64\xf3\x1e\x99\x62\x88\xad\xa7\xac\x47\x7e\x6f\xa5" - "\xa3\x47\xd6\xca\xcc\x8d\x5d\x3e\x8b\xc7\xd1\x72\x0f\xb1\x47\x7e" - "\xef\xd4\xfd\xe1\x91\x65\xb1\x15\x28\xf6\xc8\xef\x6f\x51\xee\x91" - "\xdf\x3f\xad\xcc\x23\x23\xe6\xa4\x3c\xf2\xf2\xde\xf6\x98\x13\x7b" - "\xe4\xe5\x23\xa4\x3d\xf2\xf2\x10\xb1\x47\xc6\xf2\xa5\x3c\xf2\xf2" - "\x65\xa2\xf2\x1d\x3c\xf2\xf2\x4d\x62\x8f\x4c\xaf\xe3\x3d\xf2\x07" - "\x41\x5c\x7f\xe7\xc6\xdc\xd8\x0f\x7a\xcb\x7b\xe4\x0f\xfa\x89\x3d" - "\xf2\x72\x33\xf5\xc2\x1f\x4c\xa3\x1e\xf9\x03\x35\x3d\xae\x7d\x56" - "\x78\x9c\xf7\xc8\x5a\xbb\xb9\xb1\x1f\x44\x3c\x98\x1b\x7b\x3f\x79" - "\xe4\x15\x6e\xe6\xbf\x57\xf8\xb6\x0d\xcd\xff\x6b\xf3\x62\x1f\xc4" - "\x53\xcd\xb5\xb2\xd0\x3d\xcd\xbf\x72\x67\xdb\x88\xcb\xaf\xcd\x8b" - "\xad\xe0\xe6\x2c\x7f\x38\xd6\xbd\xb8\x7c\x38\xc6\x7d\x2f\xb6\xee" - "\x59\xde\x8b\xad\x7b\x56\xde\x8b\xa5\x75\x77\xee\xc5\x32\x13\x79" - "\x2f\x96\x7e\x8e\x6a\x9e\xf4\xc3\x54\xf3\xa4\x2f\x53\xee\xc5\x56" - "\x37\x88\xbd\x58\x5a\xd4\x03\x2f\xd6\x5a\x5e\x6c\xa5\x91\xe2\x6f" - "\xf5\x51\xf7\xbc\xd8\xea\x23\x62\x2f\xb6\xee\xa2\xa3\x17\x4b\xef" - "\xe7\xba\x17\x4b\x9f\xe4\x9e\x17\x4b\x9f\xe8\x9a\x17\x4b\x2f\x94" - "\xf6\x62\x69\x3d\xe5\xbd\x18\x3d\xe7\xa8\xa1\x33\x27\xf1\x1a\x3a" - "\xb3\x7b\xdb\xf7\x62\x19\x07\xa4\xf5\x72\xc6\x51\xea\xc5\xd2\x77" - "\xb6\xbc\x17\x4b\xdf\x29\xed\xc5\x32\xb9\xfd\xcf\xd2\xf7\x38\x7a" - "\x31\xf8\x8e\xa4\x17\xcb\x8c\xe1\xbe\xb3\x53\xec\xc5\x68\x19\xc0" - "\x43\x2b\xe5\xbd\xd8\x9a\xbe\x94\x97\x32\x6f\x52\x5e\xa2\x31\x75" - "\xf4\x62\x99\xc5\xcd\x7b\x31\x8a\x21\xb6\x9e\xb2\x5e\x6c\x8d\x9f" - "\xa3\x17\x4b\xf3\x97\xf6\x62\x6b\x05\xf3\x34\xd6\xae\x16\x7b\xb1" - "\x35\x33\xee\x0f\x2f\x26\x8b\xad\x03\x62\x2f\xb6\x76\xa0\x72\x2f" - "\xb6\x76\x96\x32\x2f\x86\x98\x93\xf2\x62\x6b\x0b\xed\x31\x27\xf6" - "\x62\x6b\x8f\x4b\x7b\xb1\xb5\x17\xc5\x5e\x0c\xcb\x97\xf2\x62\xeb" - "\x3a\x8a\xca\x77\xf0\x62\xeb\xfa\x89\xbd\x18\xbd\x8e\xf7\x62\xeb" - "\x8a\x28\x87\x7e\x78\x58\xb9\x17\x5b\x57\x28\xef\xc5\xd6\x7d\x21" - "\xf6\x62\xeb\x56\x50\xcf\xb5\x4e\x4f\xbd\xd8\xba\x5c\x7a\xfc\x43" - "\x9d\xf0\x38\xef\xc5\xe8\x71\xde\x8b\xad\x33\x3c\x98\x37\x7b\x3f" - "\x79\xb1\xec\x2d\xee\x79\xb1\xec\xfc\x07\x9a\xbf\x35\x34\x7f\x96" - "\x17\xd5\x5c\x7f\x1d\xe6\x9e\xe6\xff\xeb\x50\xf7\x35\x7f\x9e\x86" - "\xd7\xfc\x79\x1a\x79\xcd\x9f\xd3\xd1\xb9\xe6\xcf\x8d\xe5\x35\xff" - "\xc6\x53\xb4\x6f\xdd\xf8\x05\xed\x5b\x37\x2e\x54\xae\xf9\x37\x5c" - "\x15\x6b\xfe\x9c\x19\x0f\x34\x7f\x6b\x69\xfe\xec\x1a\x8a\xbf\x0d" - "\xfb\xdd\xd3\xfc\x1b\xf6\x89\x35\x7f\xde\x69\x47\xcd\xbf\xf1\x31" - "\xd7\x35\xff\xc6\x91\xee\x69\xfe\x8d\x41\xae\x69\xfe\x8d\x5b\xa4" - "\x35\x7f\x8e\x5a\x5e\xf3\xd3\x73\x8e\x5a\x2d\x77\x24\xaf\xd5\x72" - "\x3b\xb6\x7d\xcd\xff\xd1\x1e\x69\x5d\xf6\xd1\x7e\xaa\xf9\x37\xe6" - "\xb7\xbc\xe6\xdf\x98\x2f\xad\xf9\x73\x07\x52\x7d\xb4\x71\xab\xa3" - "\xe6\x87\xef\x48\x6a\xfe\xdc\x59\xdc\x77\xf2\xc5\x9a\x9f\x96\x01" - "\x3c\x94\x24\xaf\xf9\x37\x75\xa7\xbc\x94\xcb\xed\xd9\x45\x63\xea" - "\xa8\xf9\x73\x0f\x37\xaf\xf9\x29\x86\xd8\x7a\xca\x6a\xfe\x4d\x1d" - "\x1c\x35\x7f\x8e\x8f\xb4\xe6\xdf\x7c\x91\xc7\xd1\xe6\x65\x62\xcd" - "\xbf\x69\xea\xfd\xa1\xf9\x65\xb1\xb5\x47\xac\xf9\x37\xf7\x56\xae" - "\xf9\x37\x87\x28\xd3\xfc\x88\x39\x29\xcd\xbf\x79\x8b\x3d\xe6\xc4" - "\x9a\x7f\xf3\x41\x69\xcd\xbf\xf9\xb4\x58\xf3\x63\xf9\x52\x9a\x3f" - "\xcf\x43\x54\xbe\x83\xe6\xcf\x7b\x4c\xac\xf9\xe9\x75\xbc\xe6\xcf" - "\xe3\xfa\xbb\xbf\x7e\xa1\x5c\xf3\xe7\x6d\x91\xd7\xfc\x79\xdb\xc5" - "\x9a\x3f\x8f\x9b\x3b\x9b\x57\x4e\x35\x7f\x5e\x26\x3d\xfe\xd7\xcf" - "\x85\xc7\x79\xcd\x4f\x8f\xf3\x9a\x3f\xaf\xfa\xc1\x9c\xda\xfb\x49" - "\xf3\x6f\xc9\x76\x4f\xf3\x6f\xc9\x72\x5f\x5b\x6e\x17\xcc\x7b\xd9" - "\xee\x64\xde\xcb\xc7\x51\xce\xb5\xe5\x27\x82\x79\x2f\xdb\xb8\x79" - "\x2f\xdb\xb8\x79\x2f\x5b\x4f\x29\xd7\x96\x5b\xc7\x8b\xb5\xe5\xc7" - "\xfb\x1f\x68\xcb\xd6\xd2\x96\x79\x26\xaa\x2d\xb7\xfa\xb9\xa7\x2d" - "\xb7\xda\xcd\x7f\xd9\x21\x31\xff\x65\xab\x82\xf9\x2f\x5b\xdd\x9c" - "\xff\xb2\xd5\xc5\xf9\x2f\x5b\x65\xe6\xbf\x7c\x1c\x2d\xaf\x2d\xe9" - "\x39\x47\x4d\xf0\x89\x60\xfe\xcb\x27\xf7\xc1\xfc\x97\x4f\x64\xe6" - "\x28\x7c\xc2\xcd\x7f\xd9\xda\x0a\xf3\x5f\xb6\xca\xcc\x7f\xf9\x84" - "\x9b\xff\xb2\x4d\x62\xfe\xcb\x56\x99\xf9\x2f\x9f\x70\xf3\x5f\xb6" - "\xda\xcd\x7f\xd9\xc6\xcd\x7f\xf9\xc4\xc9\xfc\x97\xbf\x71\xf3\x5f" - "\xfe\xc6\xcd\x7f\xa1\x31\x75\xd4\x96\x7f\x73\x61\xfe\xcb\x56\x6e" - "\xfe\xcb\x56\x27\xf3\x5f\xfe\x26\x31\xff\xe5\xe3\x48\x69\x6d\xb9" - "\x5d\x30\xff\xa5\xc0\x6e\xfe\xcb\xdf\xee\x93\xf9\x2f\xb2\xd8\xb2" - "\x9b\xff\x52\xe0\xc6\xfc\x97\x02\x85\xf3\x5f\xb6\xca\xcc\x7f\x29" - "\xb0\xd8\x63\x4e\xac\x2d\xb7\xcb\xcc\x7f\xd9\x6e\x37\xff\x65\xab" - "\xcc\xfc\x97\xed\x33\x44\xe5\x3b\x68\xcb\xed\x76\xf3\x5f\xb6\xd9" - "\xcd\x7f\xd9\xc1\xcd\x7f\xf9\xb8\x8b\x72\x6d\xb9\xdd\xc9\xfc\x97" - "\x1d\x76\xf3\x5f\xb6\x73\xf3\x5f\x76\x70\xf3\x5f\xb6\x73\xf3\x5f" - "\x3e\x56\x0b\x8f\xf3\xda\x92\x1e\xe7\xb5\xe5\x8e\x66\xe7\xbf\x38" - "\xd7\x1d\x9f\xa9\x79\xdd\xf1\x99\x5a\x5e\x77\xec\xb8\xe8\x5c\x77" - "\xec\x0e\xe5\x75\x47\xe1\x7e\xfa\x7c\x17\x6e\xa2\xcf\x77\x21\xfb" - "\x1e\x26\xa9\x18\x74\xc7\x13\x3b\xc2\x77\x5d\xdb\xc3\xea\x8e\xdd" - "\xf3\x4c\x2a\xd0\x88\x5e\x56\xd4\x1d\xa0\x05\xd3\x16\xa1\xee\xa8" - "\xe6\xe6\xdb\xee\x3c\x5d\x1c\x2f\xd4\x1d\x9f\x3e\xc7\xce\xbd\x45" - "\xed\x61\x34\xb1\xd7\xe1\x79\xa9\xb9\xb8\x07\xe7\x71\x73\x71\xa1" - "\x6c\xe1\x1c\x5c\x76\x5e\xee\x35\xd0\x25\xb3\x21\x1e\x02\x5d\xf2" - "\x60\x2e\xae\xb3\xb9\xb8\x3b\xdd\xcc\x7f\xef\xcc\x17\x6b\x91\xcf" - "\x0e\x3a\x6a\x91\xc2\x76\xae\x6b\x91\xc2\x7e\xee\x69\x91\x42\x8d" - "\x6b\x5a\xa4\x70\xa5\xb4\x16\xd9\x51\x8d\xb8\x95\xd6\x22\xf4\x9c" - "\x63\x1f\xb2\xbb\x1f\xdf\x87\xec\xba\xd9\xf6\xb5\xc8\xae\x1c\xe9" - "\xfe\x62\xd7\x16\xaa\x45\x0a\x57\xb4\xbc\x16\x29\x5c\x21\xad\x45" - "\x76\xfb\x51\xde\x2e\x4c\x73\xd4\x22\xf0\x1d\x49\x2d\xb2\x7b\x3c" - "\xf7\x9d\x15\x62\x2d\x42\xcb\x00\x6e\x9a\x23\xaf\x45\xf6\x78\x50" - "\xae\xda\x7d\x8a\x72\x15\x8d\xa9\xa3\x16\xd9\xbd\xbd\x79\x2d\x42" - "\x31\xc4\xd6\x53\x56\x8b\xec\xbe\xee\xa8\x45\x76\xe8\xa5\xb5\xc8" - "\xde\xe3\x3c\x8e\xf6\x46\x89\xb5\xc8\x9e\x61\xf7\x87\x16\x91\xc5" - "\x56\x8e\x58\x8b\xec\xed\xa0\x5c\x8b\xec\x1d\xa1\x4c\x8b\x20\xe6" - "\xa4\xb4\xc8\xde\x95\xf6\x98\x13\x6b\x91\xbd\xdb\xa4\xb5\xc8\xde" - "\x83\x62\x2d\x82\xe5\x4b\x69\x91\xbd\x3f\x89\xca\x77\xd0\x22\x9f" - "\xb5\x13\x6b\x11\x7a\x1d\xaf\x45\x3e\x2b\xe0\xfc\xdc\x4a\xe5\x5a" - "\xe4\xb3\x95\xf2\x5a\xe4\xb3\x35\x62\x2d\xf2\x59\x04\xd5\x1c\x9f" - "\x1d\xa0\x5a\xe4\xb3\x78\x7a\x7c\xc7\x0a\xe1\x71\x5e\x8b\xd0\xe3" - "\xbc\x16\xf9\xac\x48\x41\x9e\x6b\x9a\x92\xb9\xb8\x85\xb7\xc4\x79" - "\x2e\x5b\x8e\xcb\x3c\x20\x79\x4c\x53\x9e\x4b\xf8\x9e\x54\x22\xcf" - "\x85\x7d\x3a\x9f\xe7\x3a\xc7\x72\x15\x9f\xe7\xd2\xb3\x79\x2e\xcc" - "\x71\xe1\xbb\x52\x5b\x8e\xcb\xba\xd8\x71\x1e\x6e\xa1\x55\x79\x8e" - "\x8b\x7f\x5f\x6a\x32\xd0\x1c\x57\x45\x53\x8e\x0b\xfb\x73\x4b\xbd" - "\x63\x8e\x0b\xfb\x71\x3e\xc7\x75\xb6\x85\x73\x5c\x9f\x2f\x71\xaf" - "\x5f\xff\x3c\xbe\x6d\xbc\xd7\xfe\xb5\xcd\xc3\xfd\x4c\x4f\x73\x3f" - "\xff\xd3\xc5\xbd\xf7\xda\xff\xa3\x6e\x1b\x71\xf9\xb5\x8d\xfd\xfe" - "\x5c\x47\xe3\xf2\xf7\xed\xee\xc5\xe5\xef\x05\x6d\x23\x2e\xbf\xb6" - "\x71\x20\xff\x13\x4a\xe3\xb2\x7f\xa4\x7b\x71\xd9\x1f\xe4\x7e\xae" - "\xfe\xf0\x34\xde\x33\x1f\x9e\x26\xf4\xcc\xc7\xc6\x08\x3d\xf3\x97" - "\xcd\xac\x7f\x79\x28\x97\xf7\xcc\x07\x2c\x54\x87\x1e\xb8\x48\x75" - "\xe8\x01\xf6\xfd\x54\xd2\x48\xc2\x7a\x65\x33\xfa\xe6\xb9\x26\xd5" - "\xae\x2b\x3a\x95\x39\x95\xfa\xe5\x52\x73\x11\x29\x36\x98\xc8\x87" - "\x8b\x88\xd7\xca\x6b\xc4\x6b\x47\x9d\x49\xd5\x39\x9a\x78\x43\x9f" - "\x04\x6d\x56\x04\x3a\x66\x13\x89\xd5\xa2\x97\x3e\xd0\xbd\x34\xd6" - "\x20\xf0\xd2\x5f\x26\xf1\x3e\x1a\xae\x8b\x35\x91\xaf\xe6\xea\x54" - "\xe8\x97\x6f\x67\xe7\x05\xdf\x1e\x98\x1c\xc4\xae\x63\x25\xcc\xe7" - "\xc3\x6f\x07\xcc\x14\xe7\xf3\x1b\xb3\xf3\xa6\x35\x14\x26\x8f\x61" - "\xd7\xd0\xec\xcb\xe7\xf4\x95\xac\x9f\xf9\x51\x23\xf1\xb5\xe5\xf3" - "\x3f\xfa\xd5\xe5\xf3\xff\x6e\xa0\x18\xfd\xc7\x25\xf7\xf2\xf9\xff" - "\xa8\x16\x7b\xe8\x7f\x7a\x38\x7a\xe8\x03\xe3\x5d\xf7\xd0\x07\x62" - "\xdc\xf3\xd0\x07\xa2\x5d\xf3\xd0\x07\x8a\xed\x3d\x74\x81\x16\x3d" - "\xf4\x97\xfe\x88\x63\x69\x0f\x4d\xcf\x39\x7a\x9f\x43\x31\xbc\xf7" - "\x39\x34\xac\xed\x7b\xe8\x83\x95\xd2\x3e\xe7\xe0\x25\xea\xa1\x0f" - "\x14\xb5\xbc\x87\x3e\x50\x24\xed\xa1\x0f\xbd\x46\xfd\xc6\x81\x22" - "\x9b\x1f\xe6\x3d\x34\x7c\x47\xd2\x43\x1f\x5a\x6d\xff\x1d\xea\xa1" - "\x0f\x94\x51\x0f\x7d\x68\xbb\xbc\x87\xfe\x6a\x2c\xe5\xae\xaf\xfc" - "\x28\x77\xd1\x98\x3a\x7a\xe8\x43\x57\x9b\xf7\xd0\x14\x43\x6c\x3d" - "\x65\x3d\xf4\x57\xcf\x39\x7a\xe8\x2f\x65\xd6\xcf\x3c\xdc\x91\xc7" - "\x91\xae\x50\xec\xa1\xbf\x4a\xba\x3f\x3c\xb4\x2c\xb6\x2a\xc5\x1e" - "\x5a\x37\x49\xb9\x87\xd6\x2d\x53\xe6\xa1\x11\x73\x52\x1e\x5a\x57" - "\xcc\xe1\xa7\x4c\xda\x43\xeb\x7e\x92\xf6\xd0\x87\x3d\xc4\x1e\x1a" - "\xcb\x97\xf2\xd0\x87\x07\x8a\xca\x77\xf0\xd0\x87\xc7\x8b\x3d\x34" - "\xbd\x8e\xf7\xd0\x87\x6b\x29\x87\xee\x77\x63\xfd\xcc\xc3\xc5\xf2" - "\x1e\xfa\xf0\x69\xb1\x87\x3e\x5c\x40\xbd\xf2\x3f\x09\xf5\xd0\x87" - "\x0f\xd0\xe3\xfb\x0f\x08\x8f\xf3\x1e\x7a\xbf\xdd\xfa\x99\xff\x54" - "\x2b\xf0\xd0\xa1\x2d\xe4\xa1\xc7\xdd\x5f\x1e\xba\x71\x4f\xdb\xf0" - "\xd0\x5f\x1f\x74\xcf\x43\x7f\x7d\xc0\x45\x4f\x30\xad\x19\x4f\x30" - "\xe6\x81\x27\x10\xea\xad\x7f\xf6\xa1\x7a\xeb\x68\x88\x7b\x9e\xe0" - "\xe8\xb4\xb6\x10\x97\x5f\x57\x4c\x8e\x70\xe3\xf5\xff\xf5\x93\x7b" - "\x31\xf9\x57\xcd\x03\xff\xdc\x1a\x71\x39\x9a\x4b\xe3\x72\x6c\x99" - "\x7b\x71\x39\x96\xe2\xbe\x7f\x2e\xdb\xc7\xfb\xe7\xb2\x7d\x42\xff" - "\xfc\x2f\xd1\x3b\xe7\xe3\x21\xce\xfd\x73\x09\xe1\xfd\x73\xd1\x2c" - "\xaa\x41\x8b\xb8\x31\x25\x45\x6c\x4e\x3d\xf1\x0b\xea\x9f\x6f\xa1" - "\x7f\xbe\x0c\xfe\xf9\xad\x70\x95\x99\xdb\x3b\x02\xc7\xaf\x15\x83" - "\x07\x46\xcf\x5c\x1a\x0f\xff\x8f\x33\x90\x0f\x17\x10\xaf\x55\xe0" - "\x7d\xb7\x43\x5f\xb9\x7d\x91\x41\xb5\x62\x2e\xf4\x33\x15\x85\xa4" - "\x73\x24\xf8\xea\x3a\xf4\xd5\x47\xc0\x33\x2f\xe7\x7c\xf5\xc9\xa4" - "\xd2\x38\xa1\xaf\x3e\x7e\x9a\xf5\xd5\x06\x3a\x36\xae\x34\x0e\x7c" - "\x35\xfc\x1e\xee\x45\x21\xf4\xd5\x0d\xe0\x9b\x1b\xc1\x37\x67\x5e" - "\xb1\xf3\xd8\x6f\x39\x7a\xec\x06\xbf\xbc\x50\xd3\xc0\xe4\x71\xe8" - "\xb1\x6f\x6d\x7b\xe0\xb1\x1d\x3d\xf6\xbf\x03\x29\x8e\x4f\x8e\x77" - "\xcf\x63\x9f\x1c\x27\xf6\xd8\xa7\xe6\x38\x7a\xec\x93\x85\xae\x7b" - "\xec\x93\xa7\xdc\xf3\xd8\x27\xcb\x5c\xf3\xd8\x45\x83\xed\x3d\xf6" - "\x27\xec\x7b\xea\xe3\xa1\x88\x75\x69\x8f\x4d\xcf\x39\x7a\xa3\xe2" - "\x53\xbc\x37\x2a\xde\xd4\xf6\x3d\x76\x71\x90\xb4\x0f\x2a\x1e\x4f" - "\x3d\x76\x51\x60\xcb\x7b\xec\xa2\x40\x69\x8f\x5d\xcc\x8d\x7f\x2b" - "\x0a\x74\xf4\xd8\xf0\x1d\x49\x8f\x5d\x7c\xdd\xfe\x3b\xd4\x63\x17" - "\x3d\x4b\x3d\x76\x49\x47\x79\x8f\x5d\xb2\x9d\xf2\x5b\xc9\x12\xca" - "\x6f\x34\xa6\x8e\x1e\xbb\x64\x6a\xf3\x1e\x9b\x62\x88\xad\xa7\xac" - "\xc7\x2e\xd9\xe0\xe8\xb1\x8f\x4f\x93\xf6\xd8\x65\xf3\x79\x1c\x95" - "\x75\x11\x7b\xec\x92\x8b\xf7\x87\xc7\x96\xc5\x56\x90\xd8\x63\x97" - "\xee\x55\xee\xb1\x4b\x2f\x29\xf3\xd8\x88\x39\x29\x8f\x5d\x36\x98" - "\xc3\xcf\xb3\xd2\x1e\xbb\x6c\x92\xb4\xc7\x2e\x9b\x23\xf6\xd8\x58" - "\xbe\x94\xc7\x2e\x5b\x23\x2a\xdf\xc1\x63\x97\x15\x8a\x3d\x36\xbd" - "\x8e\xf7\xd8\xa7\x82\x29\x87\x1e\xb3\x28\xf7\xd8\xa7\x06\xcb\x7b" - "\xec\x53\xc3\xc4\x1e\xfb\x94\x0f\xf5\xd2\xa7\x22\xa8\xc7\x3e\x15" - "\x40\x8f\x1f\x33\x0b\x8f\xf3\x1e\x9b\x1e\xe7\x3d\xf6\xa9\x38\x65" - "\xef\xa9\xef\x68\x3d\xac\x31\x77\x7f\x3e\x46\x4b\xad\x87\x65\x7b" - "\x57\x7d\xaf\xe7\x63\xfc\x6f\x5f\xf7\x7c\xf6\xff\xf6\x79\xe0\xe7" - "\x5a\xda\x37\x9c\x5a\x41\xf5\x56\xb9\x9b\xeb\xdf\x96\x3b\x5d\xff" - "\xf6\x81\x9f\x73\x37\x2e\xff\x1b\x4d\xe3\xf2\xed\x54\xf7\xe2\xf2" - "\x6d\xb0\xfb\x7e\xee\x7c\x04\xef\xe7\xce\x47\xc8\xbf\x0f\xfd\xae" - "\xaf\x73\x3f\xf7\xfd\x4e\xde\xcf\x9d\xed\x48\xf5\xce\x99\xeb\x54" - "\xef\x9c\xd9\xdb\x72\xef\x43\xcf\xf4\x13\xbf\x0f\xfd\x6e\xf5\x83" - "\xf7\xa1\x77\xc3\xab\x9d\x26\x14\xa3\x15\x37\xdd\xf3\x6a\x15\x46" - "\xb1\x57\xbb\xd0\xc5\xd1\xab\x9d\x79\xcd\x75\xaf\x76\x26\xc9\x3d" - "\xaf\x76\x26\xd1\x35\xaf\x76\xe6\x9c\xf4\xfb\xd0\xef\x34\xf2\xef" - "\x43\xe9\x39\x47\x8d\xfd\x7d\x12\xaf\xb1\xbf\x1f\xdf\xf6\xbd\xda" - "\xd9\x5a\x69\x3d\x7d\xf6\x26\xf5\x6a\x67\x2a\x5b\xde\xab\x9d\xa9" - "\x94\xf6\x6a\xdf\x47\x51\x5d\x7b\xa6\xd2\xd1\xab\xc1\x77\x24\xbd" - "\xda\xf7\x9b\xec\xbf\x43\xbd\xda\x19\x3d\xf5\x6a\xdf\xef\x97\xf7" - "\x6a\x95\x21\x94\xbb\x2a\xfb\x52\xee\xa2\x31\x75\xf4\x6a\xdf\x5b" - "\x9a\xf7\x6a\x14\x43\x6c\x3d\x65\xbd\x5a\xe5\x58\x47\xaf\xf6\x5d" - "\x1f\x69\xaf\x76\xfe\x31\x1e\x47\xe7\x0e\x8a\xbd\x5a\xe5\xea\xfb" - "\xc3\xab\xc9\x62\xab\x56\xec\xd5\xce\xcd\x50\xee\xd5\xce\xad\x51" - "\xe6\xd5\x10\x73\x52\x5e\xed\xdc\x39\x0e\x3f\x7a\x69\xaf\x76\xae" - "\x41\xda\xab\x9d\xef\x22\xf6\x6a\x58\xbe\x94\x57\x3b\x3f\x42\x54" - "\xbe\x83\x57\x3b\xff\x9a\xd8\xab\xd1\xeb\x78\xaf\x76\x9e\xf3\x46" - "\xdf\x16\x2b\xf7\x6a\xe7\xcf\xc9\x7b\xb5\xf3\x97\xc4\x5e\xed\xfc" - "\x3e\xea\xc9\x2e\xa8\xa9\x57\x3b\x5f\x44\x8f\x7f\x5b\x24\x3c\xce" - "\x7b\x35\x7a\x9c\xf7\x6a\x17\x02\x94\x79\x35\xd7\xd7\xcb\xba\xf7" - "\x63\x8a\xd5\xbf\xb2\x31\xc5\xfa\x62\xf7\x7c\x9a\xbe\xe8\x81\x27" - "\x68\x0d\x4f\x70\xe1\x59\xaa\xb7\xaa\xe6\xb8\xe7\x09\xaa\x22\xdc" - "\xf7\x04\x57\xe2\x79\x4f\x70\x25\x5e\xde\x13\xfc\x30\xcc\xb9\x27" - "\xf8\x51\xc7\x7b\x82\xcb\xbd\x69\xbf\x7a\xb9\x1d\xed\x57\x2f\x1d" - "\x6d\x39\x4f\x70\x69\x84\xd8\x13\xfc\xb0\xe5\x81\x27\xb8\x1b\x9e" - "\xe0\xa2\x2f\xc5\xe8\xa5\x0e\xee\x79\x82\x4b\xde\x62\x4f\xf0\x73" - "\x5f\x47\x4f\x70\x29\xc6\x75\x4f\x70\x69\x8d\x7b\x9e\xe0\x52\xa6" - "\x6b\x9e\xe0\xd2\x75\x69\x4f\xf0\xc3\x70\x79\x4f\x40\xcf\x39\x6a" - "\xb9\x1f\xd7\xf0\x5a\xee\xc7\x19\x6d\xdf\x13\xfc\x48\xa4\x75\xdb" - "\x8f\x1d\xa8\x27\xb8\x64\x68\x79\x4f\x70\xc9\x20\xed\x09\x7e\x4c" - "\xa2\xfa\xe9\x92\xc1\xd1\x13\xc0\x77\x24\x3d\xc1\x8f\x7b\xed\xbf" - "\x43\x3d\xc1\x25\x23\xf5\x04\x3f\x16\xcb\x7b\x82\x9a\x28\xca\x5d" - "\x35\xc3\x28\x77\xd1\x98\x3a\x7a\x82\x9a\x2e\xcd\x7b\x02\x8a\x21" - "\xb6\x9e\xb2\x9e\xa0\xe6\x35\x47\x4f\xf0\xc3\x50\x69\x4f\x70\x65" - "\x30\x8f\xa3\x9f\x4e\x89\x3d\x41\xcd\x96\xfb\xc3\x13\xc8\x62\x8b" - "\x88\x3d\xc1\x4f\xf3\x95\x7b\x82\x9f\xb6\x29\xf3\x04\x88\x39\x29" - "\x4f\xf0\x13\xf7\xfe\x8f\xe2\xc5\xd1\x13\x5c\xe9\x28\xed\x09\xae" - "\xf4\x15\x7b\x02\x2c\x5f\xca\x13\x5c\x99\x2a\x2a\xdf\xc1\x13\x5c" - "\x89\x11\x7b\x02\x7a\x1d\xef\x09\x7e\x56\x53\x0e\xad\xba\xa8\xdc" - "\x13\x5c\xb9\x2e\xef\x09\xae\x34\x88\x3d\xc1\x15\x4e\xfb\xff\xdc" - "\x87\x7a\x82\x2b\x7a\x7a\xbc\x4a\x2f\x3c\xce\x7b\x02\x7a\x9c\xf7" - "\x04\x3f\x3f\xfb\x60\x3d\xad\xfb\x69\x3d\xad\xda\x4b\xee\xf9\x82" - "\xda\x6a\xf7\xf5\xa7\xb1\x9c\xd7\x9f\xc6\x72\xa1\xfe\x14\xaf\x6b" - "\x71\x75\xbf\x73\xfd\x59\xd7\x93\xd7\x9f\x86\x24\xca\xe1\x86\x59" - "\x94\xc3\x0d\xec\xda\x7c\xca\xd6\xd3\xfa\x65\x83\x78\x3d\xad\x6b" - "\x1d\x1e\xac\xa7\xd5\x5a\xda\xf2\xe7\x71\x54\x5b\xfe\x32\xc7\x3d" - "\x6d\xf9\x4b\x84\x58\x5b\xde\x5c\xe6\xa8\x2d\x7f\x39\xee\xba\xb6" - "\xfc\xe5\xaa\x7b\xda\xf2\x97\x5a\xd7\xb4\xa5\x61\x92\xf4\x1a\x16" - "\x57\x0f\xc8\xaf\xa7\x45\xcf\x39\x6a\x82\xeb\x82\x75\xf5\xaf\xef" - "\x6f\xfb\xda\xf2\x7a\x98\x74\xff\x7f\x7d\x0e\xd5\x96\x86\x89\x2d" - "\xaf\x2d\x0d\x13\xa5\xb5\xe5\xf5\x33\xb4\x1f\x36\x04\x3b\xae\x61" - "\x01\xdf\x91\xd4\x96\x75\xdc\xfa\xf7\x86\x89\x62\x6d\x49\xcb\x00" - "\x1e\xea\x27\xaf\x2d\xeb\x8e\x52\x5e\xaa\xcb\xa6\xbc\x44\x63\xea" - "\xa8\x2d\xeb\x62\x9a\xd7\x96\x14\x43\x6c\x3d\x65\xb5\x65\xdd\x17" - "\x8e\xda\xf2\xea\x3e\x69\x6d\x69\x5c\xcd\xe3\xc8\x38\x50\xac\x2d" - "\xeb\x2c\xf7\x87\xb6\x94\xc5\x56\x98\x58\x5b\xde\x28\x56\xae\x2d" - "\x8d\x1e\xca\xb4\x25\x62\x4e\x4a\x5b\x1a\x27\xd9\x63\x4e\xac\x2d" - "\x8d\x51\xd2\xda\xd2\xb8\x4c\xac\x2d\xb1\x7c\x29\x6d\x69\x2c\x14" - "\x95\xef\xa0\x2d\x8d\xc7\xc5\xda\x92\x5e\xc7\x6b\xcb\x9b\xd1\x94" - "\x43\xaf\xce\x52\xae\x2d\x6f\x4e\x92\xd7\x96\x37\x43\xc4\xda\xf2" - "\xa6\x86\x6a\xc8\x9b\x29\x54\x5b\xde\x1c\x4e\x8f\x5f\x0d\x17\x1e" - "\xe7\xb5\x25\x3d\xce\x6b\xcb\x9b\x99\xca\xe6\xdf\xb4\x48\xbe\xf9" - "\x2e\xcd\xbf\x69\xa9\x7c\x73\x5b\x99\x7f\x53\x3f\xc2\x3d\x5d\x59" - "\x3f\xfc\xc1\xb8\xa0\x96\xce\x35\xdf\xdc\x4a\xb5\x96\xe9\x94\x7b" - "\xb9\x66\x53\x99\xdb\x5a\xdf\xd3\x83\x34\x69\x7d\x4f\x9c\x4e\x28" - "\x37\x9f\xa0\x61\x9b\x73\xad\x6f\x1d\xc7\x6b\x7d\x33\x37\xde\xd6" - "\xbc\x9a\xf6\xa9\xe6\x49\xee\xcc\x27\x58\x55\x47\xbc\x3e\xb4\x9f" - "\x4f\x50\x7e\x90\xce\x27\x58\x60\x3f\x9f\xe0\xf6\x51\xf1\x7c\x82" - "\xc6\xbe\x72\xf3\x09\x30\xf7\x7c\xbb\x30\x79\x0c\xce\x25\x90\x9c" - "\x47\xf0\x7a\xcb\xcf\x23\x40\x9f\xf0\x11\xe0\x16\xbd\x02\xf2\xcd" - "\xaf\xcb\x2b\xd4\xbf\x4f\xf1\x7b\x7b\x8d\x7b\x5e\xe1\x76\xa6\xc8" - "\x2b\x78\x7a\x14\x3a\x7a\x85\xdb\x37\x5d\xf7\x0a\xe6\xee\xee\x79" - "\x05\xb3\xbf\x6b\x5e\xc1\xbc\x44\x7a\x1e\x41\x43\x81\xfc\x3c\x02" - "\x7a\xce\x51\xe3\x59\xbb\xf3\x1a\xcf\x72\xa9\xed\x7b\x05\xcb\x0a" - "\x69\x3d\x67\x59\x43\xbd\x82\x39\xbe\xe5\xbd\x82\x39\x5e\xda\x2b" - "\x58\xdb\x51\x5d\x65\x8e\x77\xcc\x43\xc3\x77\x24\xbd\x82\x75\x98" - "\xfd\x77\xa8\x57\x30\x27\x52\xaf\x60\x0d\x91\xf7\x0a\xd6\xeb\x94" - "\xd7\xac\xdc\x1e\x93\x34\xa6\x8e\x5e\xc1\xba\xa1\x79\xaf\x40\x31" - "\xc4\xd6\x53\xd6\x2b\x58\x2f\x3a\x7a\x85\x86\xad\x92\x5e\xc1\x93" - "\xec\x6f\xc2\x91\x27\x79\x4d\xec\x15\x98\x7e\xf7\x87\x57\x90\xc5" - "\xd6\x0a\xb1\x57\x60\x1a\x14\x7b\x05\x4f\x32\x50\x99\x57\x40\xcc" - "\x49\x78\x05\x4f\xb2\x84\xc3\x4f\xa2\xa4\x57\xf0\x24\xd9\x92\x5e" - "\xc1\x93\x14\x8a\xbd\x02\x96\x2f\xe1\x15\x3c\xc9\x19\x51\xf9\xf6" - "\x5e\xc1\x93\xdc\x14\x7b\x05\x7a\x5d\x93\x57\xf0\xf4\xc8\xa1\xfd" - "\x5f\xc3\x24\xc5\x5e\xc1\xd3\x63\x89\xac\x57\xf0\xf4\x58\x26\xf2" - "\x0a\x9e\x1e\xec\x7c\x5f\xbd\xa7\xc7\x4e\xd6\x2b\x78\x7a\x44\x52" - "\xaf\xd0\x30\x51\x78\x9c\xf7\x0a\xf4\x78\x93\x57\x48\xf7\x38\xa0" - "\x6c\x6c\x8a\xeb\x79\xe8\x7b\x3f\x36\xc5\xfb\xd7\x35\x36\xc5\xd3" - "\x33\xca\x2d\xaf\xe0\xe9\x19\xe9\xbe\x2e\x7d\x24\x8e\xd7\xa5\x8f" - "\xc4\xc9\x8e\x81\xf0\xf4\x1a\xe1\x54\x97\x7a\x7a\x1f\x68\xd2\xa5" - "\x9e\x0f\x3d\xc6\xf2\xb7\xe7\x43\x1e\x2c\x7f\x7b\xb6\x3f\xec\xea" - "\x18\x88\x55\xb7\x38\x2d\x6a\x1b\x03\xb1\x88\x1b\x03\x01\x7a\x94" - "\xd5\x9f\x9e\xed\x87\x89\xc6\x40\x78\x7a\x6d\x93\x1b\x03\x21\x39" - "\xf6\xc1\x4e\x73\xda\xf4\xe9\x9d\x8c\x7d\xf8\x55\x6b\xce\x74\x8f" - "\x32\x56\x73\x7a\xb6\x6f\xe7\x96\xe6\xf4\x6c\xef\x25\xd6\x9c\x3e" - "\xbd\x1d\x34\xa7\x67\xfb\x28\x97\x35\xa7\x67\xfb\xd5\x6e\x69\x4e" - "\xcf\xf6\x69\x2e\x69\x4e\xcf\xf6\x57\x25\xc7\x3e\x78\x7a\x05\xc9" - "\x8e\x7d\xe0\xce\x39\x6a\x05\x6f\x3e\xaf\xe8\xe9\xfd\x5a\x9b\xd7" - "\x9c\x9e\x0f\x99\x25\x75\x81\xa7\x77\x3b\x56\x73\x7a\xb6\xaf\x6d" - "\x71\xcd\x09\x65\x4a\x6a\x4e\x4f\x6f\xda\xff\xc3\x79\x07\xcd\x89" - "\xdf\x91\xd2\x9c\x9e\xde\x85\xf6\xdf\x69\xa4\xd7\x1b\x58\xcd\xe9" - "\xe9\x7d\x5c\x56\x73\x7a\x76\x98\x43\x39\xab\xc3\x73\x94\xb3\x68" - "\x4c\x1d\x34\xa7\x67\x87\x8e\xcd\x6a\x4e\x0e\x43\x6c\x3d\xe5\x34" - "\xa7\x67\x87\x10\x07\xcd\xe9\xe9\x35\x5c\x5a\x73\x3e\x32\x90\xc7" - "\xd1\xc3\xc5\x22\xcd\xe9\xd9\x61\xd3\x7d\xa1\x39\x65\xb1\xf5\x90" - "\x59\xa4\x39\x3d\x1f\x8e\x51\xae\x39\x1f\xde\xa2\x48\x73\xb2\x98" - "\x93\xd2\x9c\x0f\x5f\xe5\xf0\x63\x90\xd6\x9c\x8f\x74\x90\xd6\x9c" - "\x8f\xf4\x16\x69\x4e\xb6\x7c\x29\xcd\xf9\xc8\x24\x51\xf9\x0e\x9a" - "\xf3\x91\x28\x91\xe6\xe4\xae\xe3\x35\xa7\x8f\x0f\xe5\x50\xcf\x4b" - "\xca\x35\xe7\x23\x57\xe5\x35\xe7\x23\x37\xc5\x9a\xf3\x91\x63\x54" - "\x5b\xfa\x04\x50\xcd\xf9\x48\x25\x3d\xee\x59\x2d\x3c\xde\xa4\x39" - "\xb9\xe3\xbc\xe6\xf4\x09\x74\xa6\x39\x99\xac\x31\x9a\x4c\x95\x75" - "\x0f\xfc\xed\x83\x7a\x76\x87\xfe\x4d\x07\xff\x3f\x06\xfd\x54\x17" - "\xf8\xbf\x6c\x8e\xcd\xe0\x37\x46\x63\x05\x5d\x62\x85\xdf\x29\x35" - "\xfc\xa2\xd3\xf5\x30\x63\x7f\xb2\x87\xf6\x2f\x63\x34\x9d\xcd\x0f" - "\x8d\xb3\x32\x91\x84\xf1\x85\xff\xc7\xc3\x31\xb8\xbe\x13\xf4\x87" - "\x01\x8b\x48\xa7\x6b\x9e\x3e\x65\xb6\xeb\xa0\xce\x9d\xaa\x3c\x7d" - "\x56\x63\x19\x50\xd7\x4a\xb8\x9f\xe1\xb2\x75\x85\xb2\xa6\x6c\xef" - "\x45\x92\xcc\xcc\x8f\xba\x79\x75\xa4\xda\xb3\x63\xdf\xce\xb5\x0f" - "\x8d\x03\x1e\x22\xa8\x11\xf7\xf4\x30\x78\x61\x99\xba\x79\x8d\x78" - "\xce\x1b\xcf\x59\xa0\x8e\xda\x18\xa2\x4a\xaf\x7b\xc8\x1b\x34\x57" - "\xbb\x64\x23\x53\xf3\x8e\x19\xea\x0c\xfd\xeb\x57\xbd\x2a\xbc\x76" - "\x6f\xac\x60\xfb\x9e\x12\xa3\x85\x2d\x23\x60\x1e\xd6\xa7\x63\xbf" - "\xcd\x70\xbd\x54\x1d\x96\xef\x22\x03\xda\xf5\x63\xf4\xca\xfa\xbb" - "\x8e\x89\x72\xed\xd8\x79\x59\x2f\xa2\xeb\x0f\x6d\x17\x40\x54\x52" - "\xe7\x15\xfe\x8e\xb3\xf1\x0f\xde\xeb\xba\x31\xc6\xe4\x0d\x44\x95" - "\x61\x7d\xc8\xfb\x6b\xa8\x51\xde\x7a\xc6\x50\x9f\xde\x29\x58\xef" - "\x61\x8e\xc4\x36\x7f\x0f\xce\x67\x74\x63\x0c\x37\x52\x11\x37\x9d" - "\x22\x0f\x43\xdf\x6e\x1f\x8b\x05\x11\x31\xb3\x02\xe2\xa2\x62\xe6" - "\xbc\xb3\x30\x2e\xa0\x6f\xc4\xc3\x64\xda\x3b\xef\x04\xc4\xcc\x9a" - "\xb7\x24\x40\x78\xe6\xf9\x80\x88\xa8\x77\x67\xcd\x8e\x9e\x33\x30" - "\xe6\xcd\xd8\x87\x31\xc1\x2a\xa8\x87\x2f\xd6\xc5\x9a\xde\x29\x6e" - "\xf3\x5a\x42\xd6\x75\x25\x5e\x58\x2f\xf8\xbd\x0a\xbd\x57\x58\x2d" - "\xfe\x5e\xfa\x7a\xc6\xa8\x82\x6b\x92\x81\xd3\x32\xb4\x0f\xc1\xb5" - "\x1d\xab\xf3\xa0\x5e\x9b\xa1\xde\x50\x47\xa8\x73\x67\x2f\x5b\x9d" - "\x6d\x98\x48\x46\x4c\x68\xeb\x00\x83\x9d\xfb\x76\x36\x3d\xf4\x12" - "\xc3\x84\xe2\xfd\x19\xe1\x59\xf1\x80\x63\x07\x59\xdf\x90\x3d\x46" - "\x03\xdf\x0d\xb2\x61\xcc\x9a\x95\xa6\x63\xd6\x8f\x36\x80\xae\xf4" - "\xa8\x67\x22\xff\x13\xb0\x89\xdf\x5f\x3d\x88\x90\x14\xa6\x3e\x94" - "\xdd\x1b\x83\xa9\x07\x0c\x53\x9c\xc2\x39\x75\xf8\x0d\x15\xf9\x23" - "\x94\xf1\xbe\x9e\xec\x8c\xc6\x32\xf4\x70\x0c\xdb\xdc\x9a\xbf\x23" - "\x38\x44\x43\x52\x7e\x97\x42\x52\xea\xf1\x3b\x5b\xa3\x35\x9d\xe3" - "\x88\xc7\x94\x78\xe6\x02\xf0\x8e\x07\xd3\x7b\x47\x30\xb3\x2d\x5a" - "\xa3\xf7\xec\x1c\x69\xcd\x4e\xd3\xc1\xfd\xd4\x42\x39\x45\x7a\x8f" - "\x21\x3e\x58\x4e\xc6\x7a\xb6\xed\x6b\xf1\xde\xa1\x7d\xc0\xff\x30" - "\x3a\x26\x95\x7b\x86\x32\xc3\x35\xd6\xcc\xbd\x7b\x4a\xbd\x6e\x91" - "\x29\x66\xe6\x36\xb3\x26\x5c\x53\x62\x34\x02\xa7\xc5\xbe\xc9\x74" - "\xea\xb4\xbc\xb3\x39\x6a\x4e\x5e\x57\x78\x16\xd7\xec\xdd\xc3\xac" - "\x49\x08\x08\xe9\x47\xd4\xf5\xe9\x6a\x8d\xad\x3d\xa1\x2d\xbd\x94" - "\xe1\x48\x3d\x00\xef\x09\xf1\x00\xf5\xe1\xf0\xa0\x8e\x3f\x1c\xe7" - "\x88\x87\xa6\x67\x73\x7d\x62\xa0\x99\x09\x7d\xe9\x76\x56\x62\x24" - "\xe3\x9b\x38\x4d\x7b\x89\xb4\xc7\xb6\x2d\x01\x2f\x90\xbe\x88\xf8" - "\xaf\x9e\x49\x02\xde\x58\xa2\x26\x86\xec\xc4\xe0\xce\xcb\x52\x3c" - "\xa0\x4d\x54\xc0\x2f\x81\xc0\x99\x81\xb7\xbb\xa5\xe9\x12\xe7\x10" - "\x55\x61\xd5\x1e\x15\xea\x67\x1c\xb7\x72\xd9\xb3\xcb\xb0\xcd\xf0" - "\x3d\xe6\x97\x50\x82\xf1\x60\x63\xf1\x4b\x24\x99\x04\xac\x8c\xef" - "\x53\xe0\x7c\xcc\x26\x28\x53\xd9\x7d\x75\x61\xf5\xaf\x05\x62\x35" - "\x08\xe2\x54\x5a\x6d\x61\xcb\x64\x63\x15\xcd\xc7\xea\x20\xd4\x83" - "\x8f\x97\xda\x88\x71\x95\xb9\xe7\x3d\xdc\x3d\xd7\xc0\x3d\x97\x3b" - "\xb9\xe7\x32\x7a\xcf\xed\xea\x9c\xdf\x73\xd7\x81\xce\xef\xb9\xeb" - "\x2c\x37\xee\xd9\xa4\xfc\x9e\xbb\xd4\xc8\xdf\x73\x12\x17\xe7\x24" - "\x88\x73\x92\x93\x38\x27\x71\x71\x7e\xa4\xca\xf9\x3d\x3f\xda\xdb" - "\xf9\x3d\x3f\x1a\xa2\xfc\x9e\xbb\xd6\x2a\xbf\xe7\xae\x95\x4e\xee" - "\x99\x8b\x73\x12\xc4\x39\xc9\x49\x9c\x93\xb8\x38\x77\xf9\xc6\xf9" - "\x3d\xfb\xfa\x39\xbf\x67\xdf\xf1\xca\xef\xf9\x51\xbd\xf2\x7b\x7e" - "\xb4\x4c\xfe\x9e\xb5\x5c\x9c\xb5\x10\x67\xad\x93\x38\x6b\xb9\x38" - "\x0f\x59\xe5\xfc\x9e\xfd\x3a\x38\xbf\x67\xbf\x11\xca\xef\xd9\xb7" - "\x5c\xf9\x3d\xfb\x1e\x71\x72\xcf\x5c\x9c\xb5\x10\x67\xad\x93\x38" - "\x6b\xb9\x38\x4f\x1f\xd5\xcc\x3d\x5b\x9c\xdf\x73\xb7\xc1\xca\xef" - "\xd9\xef\x98\xf2\x7b\xf6\xdb\x27\x77\xcf\x8d\xc0\xdb\x3e\x70\x2f" - "\xb7\xbf\x0b\x7d\xc9\xe2\x9b\x18\xe6\x53\x4d\x54\xb9\xa9\xd6\xc8" - "\xce\x35\xa4\x03\xdc\x5b\x24\xb3\x3e\x23\x13\xff\xb5\xfa\x26\x86" - "\x36\xfa\x26\x46\x36\x74\x1b\x6d\x58\x3a\x83\xb4\x47\x3d\xbe\xd2" - "\x4a\xfc\xad\x59\x89\xd3\xd2\x5e\x21\x01\xc9\x06\xa2\x2e\xd1\xea" - "\x89\x36\x96\x31\x94\x90\x8b\xa4\x63\x0d\x7a\xcf\xb3\xa4\xa8\xf6" - "\x18\x99\xb7\x80\x61\x2e\x7b\xfe\x26\x09\xf3\x26\xa0\x93\x53\x32" - "\xbf\x25\x01\xf0\x1b\x81\x9b\xe1\x0f\xcb\xe9\x3c\x11\xfa\xcf\xf5" - "\x19\x6b\xf3\xb4\xc4\xff\xd0\xdc\x1a\x82\xc7\x37\xc1\x9f\x65\x7d" - "\x9a\x4e\x3b\x83\xa8\x76\xd5\x55\xa8\x68\xdf\xfc\x9b\xf1\xf6\x7d" - "\xf3\xc4\x59\xd0\x96\xb3\xd9\x73\xd9\xb9\xaf\x28\x6d\xcb\xdf\xf8" - "\xda\xfa\x6e\xb6\x2d\x2b\x2d\xb4\xbf\xb7\xeb\xbb\x0f\xc1\xef\xf3" - "\x6d\xf9\x1b\x2f\x6c\x4b\x26\x2b\x31\xb6\xb4\xa6\x11\x7d\x93\xfa" - "\x72\x3c\x51\xe9\x3d\xbb\x7d\x5e\x12\x5b\x47\x64\xda\x78\x8f\xa0" - "\x8d\x2b\x7d\xaa\xdb\xd5\xc9\xb4\x71\x05\xb4\x71\x8d\x44\x1b\x97" - "\xbb\xd6\xc6\xfe\x17\xef\xbc\x8d\xfd\x0b\xe5\xdb\xd8\xbf\x41\x79" - "\x1b\xfb\xc7\x2b\x6f\x63\xff\x48\xae\x8d\x0d\xe2\x36\xf6\xf7\x97" - "\x6f\xe3\x24\x01\x8e\x93\x00\xc7\x8f\x54\x49\xb7\x71\x12\xe0\x38" - "\x49\x02\xc7\x49\x2e\xe2\xb8\xc7\xd8\x3b\x6f\xe3\x1e\x5d\xe4\xdb" - "\xb8\xc7\x0c\xe5\x6d\xdc\xbd\x52\x79\x1b\x77\x2f\xa2\x6d\x9c\x64" - "\x87\xe3\xee\x89\x4e\xda\x58\x80\xe3\x24\xc0\x71\x97\x6f\x64\xda" - "\x18\x70\x9c\x24\x81\xe3\x24\x17\x71\xfc\xdb\xed\x77\xde\xc6\xbf" - "\x5d\x28\xdf\xc6\xbf\x3d\xac\xbc\x8d\x7f\x1b\xa4\xbc\x8d\x7f\x1b" - "\xc8\xb5\xb1\x1d\x8e\x7b\xe8\xe5\xdb\x58\x2b\xc0\xb1\x16\x70\x3c" - "\x64\x95\x74\x1b\x6b\x01\xc7\x5a\x09\x1c\x6b\x5d\xc4\xf1\x63\x1d" - "\xef\xbc\x8d\x7b\x9e\x91\x6f\xe3\xc7\xfa\x2a\x6f\xe3\x9e\x5b\x95" - "\xb7\x71\xcf\x2c\xda\xc6\x5a\x3b\x1c\xf7\x1c\xe3\xa4\x8d\x05\x38" - "\xd6\x02\x8e\xa7\x8f\x92\x69\x63\xc0\xb1\x56\x02\xc7\x5a\x17\x71" - "\xdc\x6b\xfe\x9d\xb7\x71\xaf\x11\xf2\x6d\xdc\x6b\xa5\xf2\x36\xee" - "\xe5\xad\xbc\x8d\x1f\x33\x71\x6d\x6c\x87\xe3\xc7\x0a\xe4\xda\xf8" - "\x36\x78\xc0\x8e\xd0\xc6\x1d\x6b\x89\x6a\x13\xb6\x6d\x05\x6d\x5b" - "\x4b\xb7\x8c\xcc\x4d\x2a\x6b\x24\xb6\x09\x9b\x03\xfa\xd9\xbf\x93" - "\x25\x2b\x31\x8c\x51\xc1\x3d\x69\x31\xef\xda\xeb\xba\x39\x95\x74" - "\x0a\xd0\x62\xfe\x37\x80\x1d\x1f\x1b\xa0\xfd\xe0\x1c\xfc\x9e\x27" - "\xe6\xbd\xcc\xd9\xa3\xca\x2c\x7e\x29\xf9\x70\xae\x1f\xd3\x77\x5e" - "\x10\x78\xaf\x58\xe6\x6d\x7f\xdf\xd2\xda\x3d\xd0\x3e\x27\x48\x49" - "\xc5\x97\xc4\xda\x2d\x63\xed\x20\x33\xd1\x30\x3f\x6b\x7c\x8b\xe2" - "\xf4\xc4\xf2\xa6\xbf\x4f\x69\xfc\x31\x52\x1a\xff\x19\x99\x52\xc3" - "\xdc\x62\x7e\xd0\xf8\xdc\xf6\xcb\xae\xb0\xf8\x65\xc4\x5a\xb2\xf3" - "\x22\xcd\x7e\xd9\xc7\x0a\x17\xe9\x55\x3e\x26\xa2\x89\xae\x66\x98" - "\xf4\xd9\xc4\x2b\xbd\x8a\x78\x67\xcc\x26\x3e\x19\x55\x44\x5d\x54" - "\x5d\x41\x8a\xaf\x1c\x23\xc5\x75\x67\x48\xf1\x2d\xf8\x6b\x84\x3f" - "\x2b\xfc\xa5\x9c\x81\x58\x13\x32\xe9\x2a\xc1\x7d\x45\x0d\x4f\x57" - "\x12\xdf\x22\x73\x05\xc1\x39\xbd\xd7\x3c\x1f\x3f\xea\x13\x4e\x7c" - "\x99\x1f\xfc\x09\xf3\xa6\xbf\x0a\xce\x79\xe1\xf1\x52\xb3\x81\x14" - "\x55\x9b\xf0\xfc\x56\x38\xef\x95\x5c\x0d\xe5\x5b\x8f\xe1\xbe\xa1" - "\x86\xa2\x94\xe3\xc4\xbc\xa6\x4e\xc7\xa0\x87\xee\x96\x18\x98\x09" - "\x4d\x6d\x65\xfc\x9f\xa0\x38\x08\x38\xb7\xd9\xaa\x34\xd6\x8f\xd3" - "\xf5\x6f\xde\xf6\xef\x0a\xed\xdc\xc3\xfa\x76\xa8\x7a\xf2\x99\x0b" - "\x0c\x8e\xf1\xc3\x5c\x42\x89\xf1\x04\xc1\x77\x4d\x53\x96\x10\x32" - "\xd1\x42\x08\xb6\x45\x69\x7c\x0d\x99\x1c\x4b\x3a\x63\xfe\xd9\xfa" - "\xb3\xa6\x6b\x69\xb5\x81\x24\x99\xa1\x8e\xd7\x4c\x4d\x75\x2c\x79" - "\xbf\x84\xc0\xb9\x1e\x25\x91\x7a\xe2\x13\x4b\xd4\xd8\xbe\xe6\xac" - "\xc4\xd0\xc9\xf0\xfc\xcc\x33\x32\x0c\xb6\x2d\xb6\x29\xb6\x2f\x96" - "\x67\x6b\xf3\xd2\x08\x03\x49\x36\x11\x75\xa9\x16\xfe\x8d\x67\x0c" - "\xa5\xe4\x3a\x81\x3a\x56\x30\x5d\xea\x74\x80\x8b\x2c\xc4\x02\xe0" - "\xb3\x06\xe2\xdf\x55\x06\x53\xe5\x14\x53\xed\xea\x5c\xc0\x54\x25" - "\x8f\xa9\xde\x63\x79\x4c\x3d\xd9\x5b\x1e\x53\x4f\x24\x71\x98\x32" - "\xb4\x4d\x4c\x3d\xd1\xdd\x39\xa6\x7a\x9b\x9c\x60\xaa\x06\x30\xb5" - "\x47\x8c\xa9\x27\x07\x2b\xc7\xd4\x13\xe3\xee\x22\xa6\x2a\xdc\xc3" - "\xd4\x13\x03\xc4\x98\xea\x3d\x5c\x1e\x53\x49\x1c\x4f\x3d\x52\xd5" - "\x3c\xa6\x92\x04\x3c\xf5\xe4\x06\x1e\x53\x7d\x17\xca\x63\xaa\xcf" - "\x29\x8a\xa9\xa4\x36\xca\x53\x7d\x62\x9c\x63\xaa\xcf\x44\x79\x4c" - "\x25\x01\x4f\x25\xd9\xf1\x54\xdf\xe5\xca\x31\xd5\x27\xf7\xee\x61" - "\x2a\xc9\x4d\x9e\xea\x93\x22\xc6\xd4\x93\x99\x4e\x30\xc5\xf1\x54" - "\x97\x6f\x5c\xc0\x94\x80\xa7\xfa\x5e\xe5\x31\xf5\xbb\xe3\xf2\x98" - "\xfa\x5d\x5f\x0e\x53\x6d\x94\xa7\x9e\x3a\xec\x1c\x53\x4f\xe5\x3b" - "\xc1\x14\xf0\x54\x92\x1d\x4f\xfd\xee\x8c\x72\x4c\x3d\x65\xb8\x8b" - "\x98\x72\x93\xa7\x9e\x2a\x17\x63\xaa\x6f\xb5\x3c\xa6\xb4\x1c\x4f" - "\x0d\x59\xd5\x3c\xa6\xb4\x02\x9e\xd2\x8c\xe4\x31\xd5\xff\x31\x79" - "\x4c\xf5\x5b\x42\x31\xa5\x6d\xa3\x3c\xd5\xcf\xcf\x39\xa6\x34\x46" - "\x79\x4c\x69\x81\xa7\xb4\x76\x3c\xd5\x7f\xa0\x72\x4c\xf5\x1b\x73" - "\xf7\x30\xa5\x75\x93\xa7\xfa\x69\xc4\x98\xd2\x0c\x75\x82\x29\x8e" - "\xa7\xa6\x8f\x72\x01\x53\x02\x9e\xea\x9f\xcd\x63\x6a\xc0\x7c\x79" - "\x4c\x3d\x5d\xcc\x61\xaa\x8d\xf2\xd4\xd3\x51\xce\x31\xf5\xf4\x38" - "\x27\x98\x02\x9e\xd2\xda\xf1\xd4\x80\x65\xca\x31\xf5\x74\xce\x5d" - "\xc4\x94\x9b\x3c\xf5\x74\xa2\x18\x53\xfd\xd3\xe4\x30\xd5\x88\xbe" - "\xcf\x03\x30\x15\x09\xbe\x0f\x30\xd4\xb9\x8c\x62\xea\x36\x60\xea" - "\x23\x21\xa6\xbe\xb7\xf7\x7d\x03\x7e\xb2\x36\x61\xea\x99\x9b\xf6" - "\x98\xb2\x02\xa6\x6e\xb3\x98\x7a\xa6\xa3\xcd\xf7\x95\xd6\xe6\x43" - "\xac\xae\x90\xd2\x60\xc0\xd3\x7a\x0e\x4f\xdf\x03\x9e\xe0\x7e\xac" - "\x70\xbf\x45\x95\x15\x64\x8a\x81\xde\x57\x23\xdc\xaf\x55\x88\xa5" - "\xc6\x1a\x15\x62\x08\xb1\x63\xc3\x51\xf1\x3c\xc0\xcf\x82\x53\xa4" - "\x78\x11\xfc\x25\xc0\x9f\x16\xfe\xc8\x29\x52\x54\x43\xd8\x9c\x3d" - "\x8f\x9f\x32\x0e\x3f\x03\xb7\x3b\xc7\xcf\xc0\x15\xca\x3c\xde\xa0" - "\x76\xca\xf1\x33\xb0\x82\x1b\x4b\xa7\x9e\x32\xf5\x02\x83\xe3\x66" - "\x29\x46\xae\x90\x29\x66\xd2\x99\x99\xae\xe9\xea\x13\x4a\xd4\x4b" - "\x2d\x44\xb5\x7a\x36\x51\xaf\x3e\x0b\xf7\x6b\x7b\x76\xaa\x88\xcf" - "\x09\xd3\x97\xa4\xa8\xae\x82\x14\xdd\x3a\x4e\x8a\xac\xf0\x77\x05" - "\xfe\xa0\x8e\x53\xe6\x08\xef\xd7\xc0\xdd\xef\x33\x1b\xa0\xac\x3e" - "\xf2\xf7\xfb\x4c\x3c\x7b\xbf\x11\x70\xbf\x8d\xfc\xfd\x96\x02\x16" - "\x21\x2e\x3d\xac\x9c\x4f\x9c\x62\x20\x1d\xde\x31\x33\x4c\x23\x87" - "\x41\x8c\xcb\x89\x72\x13\x99\x12\x0b\xb1\x7a\x13\x30\x58\x5d\x40" - "\x92\x13\x01\x83\x8d\x26\x7c\xaf\x6f\x28\x4d\x69\x00\x0c\x0e\x3c" - "\xc0\x40\xbb\xdd\x46\x0c\x7e\x8f\x18\x1c\xa0\xb7\xca\x63\xb0\x9c" - "\x62\x10\x7c\x62\xf3\x18\x14\xf0\xda\xa0\x18\x1e\x83\x83\x97\xc8" - "\x63\x30\x70\x8d\xcd\x27\xde\x7b\x0c\x06\x0e\x74\x8e\xc1\x40\x1f" - "\x65\x9e\x70\xf0\x4a\xe5\x18\x0c\x0c\xbb\x7b\x18\x1c\xfc\x98\x73" - "\x0c\x06\x9a\x5d\xc0\x60\x85\x7b\x18\x0c\x0c\x12\x63\x70\x50\x84" - "\x3c\x06\x93\x38\x1e\x04\x5f\xd9\x2c\x06\x85\xbe\x72\xf0\x75\x1e" - "\x83\xff\x61\x91\xc7\xe0\x7f\xf8\xd9\x7c\xe5\xbd\xc7\xe0\xef\xf7" - "\x3a\xc7\xe0\xef\x33\x95\x79\xc8\x67\x3b\x2a\xc7\xe0\xef\xf5\x77" - "\x0f\x83\xff\xb1\xc5\x39\x06\xff\x23\xa5\x79\x0c\x26\xb9\xc9\x83" - "\xbf\x3f\x22\xc6\xe0\xe0\x1a\x27\x18\xe4\x78\x10\x7c\x68\xf3\x18" - "\x14\xf0\xe0\xb3\x0b\x79\x0c\x0e\x59\x26\x8f\xc1\xe7\x36\xd8\x7c" - "\xe8\xbd\xc7\xe0\x73\xcf\x39\xc7\xe0\x73\xbe\xca\x3c\xe7\x90\x35" - "\xca\x31\xf8\x5c\xc4\xdd\xc3\xe0\x90\xbe\xce\x31\x38\xc4\xcb\x05" - "\x0c\xba\xc9\x83\xcf\x8d\x13\x63\xf0\xd9\x68\x79\x0c\x6a\x39\x1e" - "\x04\xdf\xda\x2c\x06\x85\xbe\x75\x48\x03\x8f\xc1\x61\xed\xe4\x31" - "\x38\xf4\x31\x9b\x6f\xbd\xf7\x18\xfc\xc3\x7e\xe7\x18\xfc\x43\x8e" - "\x32\x8f\x3a\xcc\x4f\x39\x06\xff\x50\x73\xf7\x30\x38\x74\xbb\x73" - "\x0c\x0e\x5d\xd1\x3c\x06\xb5\x6e\xf2\xe0\x1f\x8a\xc4\x18\x1c\x62" - "\x70\x82\x41\x8e\x07\xc1\xe7\x36\x8f\x41\x01\x0f\x0e\x4b\xe2\x31" - "\xf8\xc2\x4a\x79\x0c\x3e\xbf\xc5\xe6\x73\xef\x3d\x06\x9f\x1f\xe1" - "\x1c\x83\xcf\xf7\x54\xe6\x69\x5f\xd8\xa0\x1c\x83\xcf\x47\xdf\x3d" - "\x0c\xbe\x30\xd0\x39\x06\x5f\xf0\x71\x01\x83\x6e\xf2\xe0\xf3\xc1" - "\x62\x0c\x0e\x8b\x93\xc3\xa0\x15\x7c\xf1\xed\xad\xf3\x82\xac\x59" - "\xd9\x15\x9d\x3d\x02\x88\xd9\x37\x25\xbf\x34\xce\x48\x26\xdf\x84" - "\xf6\x89\xbd\x49\x66\xde\x54\x13\x4b\x56\xf6\x31\xd0\xe4\xa1\x02" - "\xff\xcc\x8e\x2d\x33\x67\xd6\xe9\x32\xe6\x11\x2f\xf0\xdf\x6b\xf1" - "\x58\xe9\x65\x13\xc1\xdf\x4f\xc2\xfa\x5c\xe1\xeb\x83\x79\x02\xe6" - "\x17\x8d\x9a\x7d\xc7\xdc\xa8\x27\xd5\xc3\x89\x67\x51\xb5\x1e\xda" - "\x21\x81\x8d\x2f\xb6\xcb\x65\xcf\xe1\xd1\x79\xd7\x88\x97\xf9\x07" - "\xff\x1e\xd0\xde\xbe\x1d\x17\x13\x8f\x9e\xd5\x8c\x15\xdb\x15\xdb" - "\x0b\xdb\x38\x20\x01\xdf\x5d\x0f\x3f\x58\x02\x18\x33\xff\xa0\xe9" - "\xb1\x19\xae\x93\xf6\xab\xc3\x8f\x2a\xc7\xc6\xf0\x15\x74\xde\xc2" - "\xf0\x88\xa2\x4a\x22\xf9\xee\x18\xda\xaa\xdc\xc5\xb6\xaa\x10\xf8" - "\xbc\x56\x68\xab\x11\x39\xae\xb5\xd5\x88\x9f\xec\xda\x4a\xc2\x57" - "\x8d\xb8\xae\xbc\xad\x46\x7c\x4e\xdb\x6a\x44\xa6\x7c\x5b\x25\xb9" - "\x88\xab\xa4\x50\x81\x1f\x69\x85\xb6\xfa\xcf\x23\xae\xb5\xd5\x1f" - "\xfd\xc4\x6d\x25\xa5\xff\xff\xf8\x98\xf2\xb6\xfa\x4f\x3d\x6d\xab" - "\xff\x3c\xe0\xa4\xad\x5c\xc4\x55\x52\x85\x40\x37\xb7\x42\x5b\xfd" - "\xd1\xe0\x5a\x5b\x05\x8d\xb4\x6b\x2b\x09\x9d\x1a\x34\x5e\x79\x5b" - "\x05\xd1\xfd\xf0\x3c\xff\x58\x23\xdf\x56\x5a\x17\x71\xa5\x0d\x15" - "\xe8\xbb\x56\x68\xab\x91\x3d\x5d\x6b\xab\x91\x31\xe2\xb6\x92\xd2" - "\x53\x23\x17\x2a\x6f\xab\x91\x43\x69\x5b\x8d\xf4\x75\xd2\x56\x2e" - "\xe2\x4a\x5b\x21\xd0\x21\xad\xd0\x56\xa3\xc6\xb9\xd6\x56\xa3\x36" - "\xd8\xb5\x95\x44\xbf\x3f\x6a\x8b\xf2\xb6\x1a\x15\x41\xdb\x6a\x54" - "\x90\x5c\x5b\x59\xb2\x12\xa7\x75\x86\x36\x68\x58\x9f\x18\xd8\x39" - "\x9e\xa8\x1a\xfb\x40\xbb\xf9\x42\xbb\x2d\x0b\x20\xb7\xb3\xa0\xdd" - "\x0c\x66\x32\x79\xfe\x05\xa6\xa4\xd6\x42\x1a\xa1\xcd\x1a\x7c\x13" - "\x43\x4b\x0d\x35\x38\xe6\xe8\x85\x2a\xcf\x31\xcb\xa6\xcf\x57\x13" - "\x6c\x37\x6c\x07\x6c\x3b\x06\xda\x8d\x6d\x47\xdf\xbc\x48\x8b\x6f" - "\x46\xec\xa4\xab\x17\x98\x77\xf4\x0c\x83\xf7\xcb\xf8\x8e\x2a\xc3" - "\xf7\x02\x53\x6a\x48\x87\x80\x57\xf0\x9e\xc6\x0c\xc6\xe3\xa5\x86" - "\x0a\xd0\x07\x75\x84\xd5\x66\x17\x34\xbe\x96\x57\x35\x3e\x96\xd2" - "\xd0\x97\x98\x6e\xa3\x0d\xe6\x6e\x69\xba\xe4\xab\xa4\x3d\xea\x87" - "\x74\x2b\xf1\x4f\x8a\x21\xaa\x5d\x73\x75\x2a\x76\xee\xda\x02\x2c" - "\x63\xb4\x05\xda\xc5\x9f\xb9\x21\x18\xd3\x7d\x23\x92\x94\x5e\xce" - "\x64\xe3\x66\xaf\x11\xd8\xb8\x7d\xa7\x51\x83\xce\x0c\x64\x7c\x13" - "\x23\x33\x4b\x48\x00\x73\x1b\xda\x98\x9d\x4f\x34\xe6\xa7\xbc\x46" - "\xa5\x6d\x3c\x9a\x1d\xff\x6d\x0d\xe0\xc6\x6f\x41\x3b\xe1\xef\xb3" - "\xe3\xb7\x62\x05\xe3\xb7\xa0\xce\xfc\xf8\xad\xd1\x69\x38\x7e\xcb" - "\x7a\xc1\xbf\x87\xed\xde\xdf\x89\x66\x18\xb8\xf7\xae\x25\x46\x03" - "\xc1\xfb\x2f\x31\xea\x48\x72\x1c\x51\x97\x34\xd6\x10\xad\x91\x31" - "\x94\xa4\xfc\x44\xa6\xdc\x44\x1d\x8c\x78\x19\xb3\x84\xc6\x75\xf4" - "\x44\xeb\x05\x4d\x0f\xbd\xe7\x98\xd8\x92\x32\x42\x04\xf3\x78\x22" - "\x41\x33\x7b\x43\x1c\x22\x4b\x53\xaa\x08\xc4\xc4\x50\x6a\x3e\x8b" - "\x71\x8a\x84\xf3\xc3\x9b\xf4\x75\xb7\x8c\x3a\x3c\x86\x31\xc3\xf7" - "\x4d\xb8\x76\x40\x9e\x40\x7f\x23\x2e\x3a\xc7\xa7\x90\xd2\xf8\x46" - "\x52\x62\xc6\x39\xbb\xa3\x4c\x27\x43\x2b\xe4\x70\x54\xce\xe1\x68" - "\x4f\xe7\xf8\x76\x75\x2e\xe0\xa8\x82\xc7\xd1\x8b\xc7\xef\x0c\x47" - "\x2f\x2e\xb9\x73\x1c\xbd\x38\xf6\x0e\x70\x54\x23\xc6\xd1\x4b\x83" - "\x95\xe3\xe8\x45\xb5\x72\x1c\x8d\x2d\xbf\x33\x1c\xbd\x78\x98\xe2" - "\x68\x6c\x16\xc5\xd1\x8b\xfb\x78\x1c\xb1\x73\xa3\x5a\x09\x47\x63" - "\x83\xe4\x71\x94\xc4\xf1\x51\x12\xf0\xd1\x23\x55\xcd\xe3\x28\x49" - "\xc0\x47\xe3\xbb\xdc\x19\x8e\xc6\x1d\xbe\x73\x1c\x8d\x5b\xed\x3e" - "\x8e\x92\xec\xf8\x68\xfc\x12\xe5\x38\x1a\x17\xaa\x1c\x47\xe3\x7a" - "\xde\x19\x8e\xc6\x77\xa0\x38\x7a\xa9\x92\xe2\x68\x3c\xe1\x71\xc4" - "\xce\x37\x6b\x25\x1c\xbd\xb4\xc2\x09\x8e\x38\x3e\x4a\x02\x3e\xea" - "\xf2\x8d\x0b\x38\x12\xf0\xd1\xcb\xaf\xdd\x19\x8e\x5e\xee\x70\xe7" - "\x38\x9a\x70\xfa\x0e\x70\x64\xc7\x47\x2f\x1f\x56\x8e\xa3\x09\xf9" - "\xca\x71\x34\x21\xe2\xce\x70\xf4\xf2\x54\x8a\xa3\x09\x7d\x28\x8e" - "\x5e\x1e\xc7\xe3\x88\x9d\xc3\xd7\x4a\x38\x1a\x5f\x26\x8f\x23\x2d" - "\xc7\x47\x5a\xe0\xa3\x21\xab\x9a\xc7\x91\x56\xc0\x47\x93\xb6\xdc" - "\x19\x8e\x26\x4d\xbd\x73\x1c\x4d\x7a\xcc\x7d\x1c\x69\xed\xf8\x68" - "\x72\x07\xe5\x38\x9a\x58\xa3\x1c\x47\x13\x77\xde\x19\x8e\x26\x6d" - "\xa0\x38\x9a\x18\x4d\x71\x34\x29\x93\xc7\x11\x3b\x2f\xb2\x95\x70" - "\x34\xd1\xdf\x09\x8e\x38\x3e\xd2\x02\x1f\x4d\x1f\xe5\x02\x8e\x04" - "\x7c\x34\xe5\xa7\x3b\xc3\xd1\x94\x0d\x77\x8e\xa3\x29\x73\xee\x00" - "\x47\x76\x7c\x14\x3c\x55\x39\x8e\xa6\x04\x2a\xc7\xd1\x64\xe3\x9d" - "\xe1\x68\xca\x45\x8a\xa3\xc9\x9f\x53\x1c\x4d\xa9\xe0\x71\xc4\xce" - "\x35\x6d\x25\x1c\x4d\x0e\x97\xc3\x11\xae\x45\xb0\x8e\xae\x0b\x61" - "\xcc\x48\x20\x43\xf3\xf0\xdf\x46\x12\x58\x9f\x1e\xbc\xe2\x70\x22" - "\x5d\x0f\x40\xef\x19\xcc\xe6\x7b\xa5\xbe\xff\xc8\x76\x88\x8b\x6f" - "\x62\xf0\x94\x73\x74\x8d\x06\x5c\x17\xe4\x46\x72\x24\x19\xc4\xae" - "\xcb\x30\x55\x87\xeb\x58\x35\xad\x1d\xe0\x2b\xb3\x76\xc0\xeb\xf2" - "\x6b\x07\x34\xae\xb7\xcd\xbb\x2d\x10\xcc\xbb\x9d\xba\xda\xf9\xbc" - "\xdb\xa9\x0b\x37\xbd\xae\x14\x0f\x53\x83\xf0\x1e\x6f\x74\x4b\x84" - "\x7b\x9f\xfa\x3e\xdc\x73\x18\xbd\x77\x00\xbc\x4b\xf3\x71\x0b\x04" - "\x38\x99\x1a\x18\x12\x46\x52\x98\x74\xf5\xfb\x8c\x5f\x62\x30\x93" - "\x9d\x18\xae\xb0\x2e\xff\xbf\xbd\xef\x01\x88\xaa\xca\xfe\xbf\x33" - "\x0c\x45\x86\x32\x18\xb8\xd4\x5a\x8d\x2d\xb6\xd8\x9a\x62\x59\x6b" - "\xfb\xd5\x8d\x12\x8b\x4a\x05\x0d\x75\x54\x54\x34\x34\x48\x44\x02" - "\x54\x44\x18\x90\xac\xd5\x42\x40\x02\x16\x93\x7f\xb6\xd4\x9a\xab" - "\x49\xad\xee\xd2\xae\xd6\xb4\x6a\x8b\x85\x40\xa5\x2d\xed\xe2\x36" - "\xb1\x64\x64\x68\x93\x8e\xf2\x6f\x66\xee\xef\x9c\x77\xdf\xf0\xde" - "\x0c\x33\x30\x6f\x06\x59\x7f\x6d\x53\x4f\x66\xee\x3b\xef\xdc\x7b" - "\xcf\xf9\xdc\x73\xcf\x3d\xef\xbd\x73\x1d\xee\x7f\xc8\xcb\xbb\xd1" - "\xbe\xbc\x9f\x0c\xe6\xe5\x5d\xcd\xcb\xdb\x7e\xde\x82\x45\x8e\xf3" - "\x16\xd8\x97\xf7\xdc\x01\xde\x73\x9e\xfb\x95\x74\x79\xcf\xad\xe6" - "\xe5\x5d\xdd\x91\x3b\xd7\x20\xc8\xfb\xc9\x44\xe9\xf2\x9e\x5b\xc9" - "\xe4\xed\x9b\x0a\xf2\x6e\x04\x79\x4b\xcc\xdf\xf2\xa4\xc3\xfc\xdf" - "\x4c\xde\x19\x0e\xf0\x1d\x59\xc9\xe4\xcd\xe7\x4c\xf0\x73\x90\x33" - "\x61\x91\xe3\x9c\x09\xf6\xe5\x1d\xb9\xa6\x7f\x79\x47\xce\x93\x2e" - "\xef\x48\x15\x93\x77\x06\xe0\x3b\x32\x46\x90\x77\xa4\x4e\xba\xbc" - "\x23\x95\x4c\xde\x23\xe3\xa9\x7f\x06\xe0\x3b\x43\x22\xbe\x23\xf7" - "\x0d\x20\x6f\x07\xf8\x9e\xaf\xe4\xe5\xcd\xe3\xdb\x41\xbe\x86\x45" - "\x8e\xf3\x35\xd8\x97\xf7\xbc\x33\xfd\xcb\x7b\xde\x71\xe9\xf2\x9e" - "\x97\xcf\xcb\x1b\xf0\x3d\xef\x94\x20\xef\xf9\x11\xd2\xe5\x3d\x2f" - "\x8b\xc9\xfb\xa6\x68\x90\x37\xe0\x3b\x43\x22\xbe\xe7\x8f\xee\x5f" - "\xde\x1a\x07\xf8\x5e\x90\xc5\xe4\xcd\xe7\x8a\xf0\x73\x90\x2b\x62" - "\x91\xe3\x5c\x11\xf6\xe5\xbd\x60\x56\xff\xf2\x5e\x70\x9f\x74\x79" - "\x2f\x20\x4c\xde\x1a\xc0\xf7\x82\x50\x41\xde\x0b\xb4\xd2\xe5\x3d" - "\x5f\xcf\xe4\xed\x17\x49\xfd\x35\x80\x6f\x8d\x44\x7c\x2f\xc8\x19" - "\x40\xde\x0e\xf0\xad\xd6\xf3\xf2\xe6\xf1\xed\x20\x4f\xc5\x22\xc7" - "\x79\x2a\xec\xcb\x5b\x7d\xa4\x7f\x79\xab\x5f\x93\x2e\x6f\x75\x22" - "\x2f\x6f\xc0\xb7\xfa\xa0\x20\xef\x85\xc1\xd2\xe5\xad\x8e\x66\xf2" - "\xf6\x0f\x03\x79\x03\xbe\x35\x12\xf1\xad\x36\x3a\x92\xb7\x0f\xc8" - "\xfb\x38\xf8\x31\x30\x0f\xaa\xcd\x85\xe0\xa7\x98\xac\xe5\xde\x90" - "\x3a\x85\x4c\xb8\x82\xb2\x5f\xd4\x0c\x73\x87\x7a\xe8\xf2\x65\x2c" - "\x3a\xee\xfe\xbb\xc3\x8b\x76\x38\x7e\x77\x78\xd1\x46\xe9\xef\x0e" - "\x2f\x0a\x15\x7c\xa0\x45\x5b\x05\x9d\x2e\xe6\xec\x87\xb4\x77\x8a" - "\x17\x4d\xb6\x9f\x47\x63\x61\x2b\xbe\x53\x4c\x73\x47\x4d\x35\x17" - "\xb9\xe2\x1b\x2d\x6a\x73\x42\xd7\x4d\xa0\x87\x46\xc7\xba\x8e\xaa" - "\x05\x5d\x37\x0d\x5d\xde\x8e\xa8\xb7\xdc\xd7\x75\x54\x86\x63\x5d" - "\x47\xad\x94\xae\xeb\xa8\x60\xc1\xff\x8a\x4a\x11\x74\xbd\xc4\x85" - "\xf7\xc7\xa3\x54\xf6\xf3\x79\x2c\x6e\x64\xba\xfe\x49\x25\xe8\xda" - "\x05\xbf\x2c\xea\xd4\xc0\xba\xce\x80\x71\x9d\xd1\xcf\xb8\x5e\x7a" - "\x10\xe6\x4c\xf5\xd0\xe5\x0f\x59\x5a\xe6\xbe\xae\x97\xc6\x39\xd6" - "\xf5\xd2\x39\xd2\x75\xbd\x74\xb4\xe0\xfb\x2d\x8d\x16\x74\xbd\xd4" - "\x20\x5d\xd7\x4b\xbd\xed\xe7\x15\x59\x72\x98\xe9\xfa\x66\x85\xb9" - "\xc8\x15\x9f\x70\xa9\xd6\x09\x5d\xc3\xb8\xce\xe8\x67\x5c\x47\x57" - "\x82\xae\x9b\x86\x2e\x8f\x49\xf4\x36\xf7\x75\x1d\x3d\xcf\xb1\xae" - "\xa3\xa7\x49\xd7\x75\xb4\x97\xe0\x77\x46\xcf\x14\x74\x1d\xad\x93" - "\xae\xeb\x65\x9d\xf6\xf3\x9b\x2c\xdb\xc3\x74\x7d\x4b\x2c\xe8\xda" - "\x05\x7f\x34\xda\xa1\xff\x2f\xe8\x5a\x03\xe3\x5a\xd3\xcf\xb8\x5e" - "\x91\x03\xbe\x82\x7a\xe8\xf2\xa9\xac\x58\xe7\xbe\xae\x57\x3c\xe4" - "\x58\xd7\x2b\xc6\x49\xd7\xf5\x72\x83\xe0\xf3\xae\x98\x22\xe8\x7a" - "\x45\x9d\x74\x5d\x2f\x6f\xb5\x9f\x67\x65\x79\x21\xd3\xf5\x4f\xeb" - "\xcc\x45\xae\xf8\xc2\x2b\x4a\x9c\xd0\x35\x8c\x6b\x4d\x3f\xe3\x3a" - "\x06\xd6\xf5\x9a\xa6\xa1\xcb\xeb\x12\xb3\xdc\x7d\x5d\xc7\xdc\xed" - "\x58\xd7\x31\xfe\xd2\x75\xfd\x94\x4e\xf0\xb7\x63\x02\x05\x5d\xc7" - "\xd4\x48\xd7\xf5\x53\x8d\xf6\xf3\xbd\x3c\x95\xc5\x74\x7d\x6b\x30" - "\xe8\xda\x05\x3f\x3c\x66\x8b\x2b\x7e\x78\x72\x19\xf1\xb2\xd6\xf7" - "\xaa\xd8\xa1\xf5\xc5\x57\xcd\x71\x5f\xdf\xab\x6e\x75\xac\xef\x55" - "\x9e\xd2\xf5\xbd\xb2\x51\xf0\xc5\x57\xf9\x09\xfa\x5e\xb5\x47\xba" - "\xbe\x57\x6a\xed\xfb\xe2\x2b\x13\xdd\xf3\xc5\x57\xa5\xb8\xe2\x8b" - "\xf7\xd5\x77\xac\x7a\x68\xfd\xf1\xd8\x87\xdc\xd7\x77\xec\x70\xc7" - "\xfa\x7e\xfa\xb2\x74\x7d\x3f\xad\x15\xfc\xf1\x58\x85\xa0\xef\xd8" - "\x12\xe9\xfa\x7e\xba\xda\xbe\x3f\xfe\x74\xb4\x7b\xfe\x78\x6c\x8c" - "\x2b\xfe\x78\x5f\x7d\x3f\x13\x36\xb4\x3e\xf9\x33\x93\xdc\xd7\x77" - "\x9c\xc9\xb1\xbe\xe3\xbe\x92\xae\xef\xb8\x6a\xc1\x27\x8f\x13\xc5" - "\xbf\x9f\xd9\x2a\x5d\xdf\x71\x95\xf6\x7d\xf2\xb8\x08\xf7\x7c\xf2" - "\x67\x22\x5d\xf1\xc9\xfb\xea\x3b\x7e\xca\xd0\xfa\xe5\xf1\x63\xdc" - "\xd7\xf7\xea\xf3\x8e\xf5\xbd\xfa\xb4\x74\x7d\xaf\xae\x14\xfc\xf2" - "\xd5\xad\x82\xbe\xe3\x5d\xc8\x9f\xb9\x3a\xdf\xbe\x5f\xbe\x3a\xc4" - "\x3d\xbf\x3c\x3e\xd4\x15\xbf\xbc\xaf\xbe\x13\x82\x86\xd6\x37\x4f" - "\xf0\x75\x5f\xdf\x6b\xce\x38\xd6\xf7\x9a\xe3\xd2\xf5\xbd\x26\x5f" - "\xf0\xcd\xd7\x88\xe2\xff\x09\xb1\xd2\xf5\xbd\x26\xcb\xbe\x6f\xbe" - "\x26\xd8\x3d\xdf\x3c\x61\xb2\x2b\xbe\x79\x5f\x7d\x27\x06\x0c\xad" - "\x7f\x9e\x28\x73\x5f\xdf\x6b\x4f\x3a\xd6\xf7\xda\x43\xd2\xf5\xbd" - "\x36\x4b\xf0\xcf\xd7\x1e\x13\xf4\x9d\xa8\x96\xae\xef\xb5\x89\xf6" - "\xfd\xf3\xb5\x2a\xf7\xfc\xf3\xc4\x40\xf7\xe3\xe4\x49\x06\xf4\xcd" - "\xa5\xe6\x7f\x6c\x48\xb1\xbc\x73\x97\x28\xca\xff\x98\xc4\xed\xad" - "\x62\x3f\xb7\x4c\xd2\x43\xd7\x76\xfe\xc7\x67\x07\xc8\xff\xf8\xac" - "\xc4\xfc\x8f\x49\xe3\xa4\x3f\x8f\xff\xac\x41\x58\x23\x24\x89\xd6" - "\xff\xc9\xdc\xb8\xbe\xb6\xf3\x42\x3e\x6b\x93\x17\x32\x91\xcb\x0b" - "\x49\x73\x6f\x2b\x74\x6d\x2d\x92\x4c\xdc\xbf\x2f\xb0\xae\x11\xd7" - "\x21\x52\xf3\x50\x0a\xd8\x4e\x3e\x29\x60\x7b\xdd\xfb\x8e\xb1\xbd" - "\xee\xd6\x6b\x3b\x0f\x65\xca\xee\xfe\xb1\x9d\x92\x25\x2d\xe7\xc8" - "\x3a\x17\xf2\xde\xa4\x34\x0a\xeb\xa1\x75\xa2\xf5\xef\x7a\xe5\x10" - "\x62\xdb\xc5\x7c\x4a\x29\x07\xad\xb1\x9d\x7c\x8c\x61\x5b\xd5\xe6" - "\xda\xba\x6b\x5d\xb3\xfb\xf7\x41\x52\xf7\xe1\x9a\x4b\x6a\x3e\x4c" - "\x01\xdb\xeb\xdf\x10\xb0\x9d\x5a\xe6\x18\xdb\x1b\xba\xae\xed\x7c" - "\x98\x1b\x32\xfa\xc7\xf6\x86\x28\x69\xb9\x4c\x36\x7c\x29\x1d\xdb" - "\x1b\xf6\x09\x6b\xbf\x0d\x7a\x01\xdb\xa9\xed\x43\x87\x6d\x57\xf3" - "\x64\x6e\xc8\xb7\xc6\xf6\xfa\x4a\x86\xed\x9f\x4d\x75\x6d\x8d\x99" - "\x5a\xe3\xfe\x7d\x9f\x4d\x5b\x71\x7d\x29\x35\x2f\xa7\x80\xed\x8d" - "\xcf\x0b\xd8\xde\xd4\x27\x2f\x94\x80\xed\xb4\xd3\xd7\x76\x5e\xce" - "\xb4\x85\xfd\x63\x3b\x6d\x8a\xb4\x1c\x29\x69\x47\xa4\x63\x3b\x6d" - "\xab\xb0\xce\x4d\xab\x13\xb0\xbd\xa9\x76\x08\xb1\xed\xa2\xdd\x4e" - "\x8b\xb7\xc6\xf6\xc6\x74\x86\xed\xb1\xf9\xae\xad\xa7\x37\x15\xba" - "\x7f\x9f\x4b\x13\x83\x6b\x69\xa9\xf9\x41\x05\x6c\xa7\x2f\x17\xb0" - "\xad\x99\xe7\x18\xdb\x19\x6f\x5d\xdb\xf9\x41\x33\x06\xc8\xff\x93" - "\xd1\x4f\xfe\x1f\x7b\xef\x0a\x67\xb8\x90\xf7\x22\x23\x46\x58\xd3" - "\x67\xec\x11\xb0\xad\xa9\x1a\x3a\x6c\xbb\x9a\x37\x34\x23\xcc\x1a" - "\xdb\xe9\x6a\x86\xed\x9f\xb7\xba\x16\x3b\xd0\x24\xba\x7f\x5f\x6f" - "\x73\x08\xc6\x0d\xa4\xe6\x29\x15\xb0\x9d\x39\x4d\xc0\xf6\xe6\x49" - "\x8e\xb1\x9d\xb5\xfd\xda\xce\x53\x9a\xe5\xdb\x3f\xb6\x33\xf5\xd2" - "\x72\xba\x64\xb9\xf0\x1e\x7c\x56\x88\x10\xbf\xc8\x12\x3d\xff\xbe" - "\x39\x6b\x08\xb1\xed\xa2\xdd\xce\x0a\xb4\xc6\x76\xe6\x64\x86\xed" - "\xbb\xa6\xb8\x16\x27\xd9\x3c\xd3\xfd\x38\xc9\x96\x99\xdc\x3d\x4c" - "\x89\xf9\x52\x05\x6c\x67\xdf\x2c\xe4\x26\xda\x32\xcd\x16\xdb\x42" - "\x6e\xa2\xe7\xe6\x5d\x3b\xf9\x52\xb3\x3f\xef\x1f\xc7\xd9\x35\xd2" - "\x62\x22\xcf\x4d\x93\x8e\xe3\xe7\xbc\x84\x98\xc8\x73\xa2\xe7\x5f" - "\xb6\x58\xf6\x24\x1f\x82\x9c\x45\xcf\x7d\xd9\x7f\xce\xa2\xe7\xb4" - "\x57\x2f\x8f\x6a\x76\xbb\x75\xce\xa2\x6c\xa5\x99\x1b\x0b\xe3\x73" - "\x5c\x8b\xab\x6c\x51\xbb\x1f\x57\xf9\x0d\xbb\xbf\x2b\x31\x6f\xab" - "\x30\x16\x9e\x1f\x2b\x8c\x85\xdf\x3c\xe6\x78\x2c\xbc\xb0\xfc\xda" - "\xc9\xdb\xfa\xfc\x57\xfd\x8f\x85\xe7\x8f\x49\x8b\xa1\xbc\xe0\x42" - "\x1e\x98\x17\xfc\x84\x18\xca\x0b\x6a\x61\x2c\xfc\xa6\x64\xe8\xc6" - "\xc2\x0b\xe7\xfb\x1f\x0b\x2f\xd4\x5d\xbd\x7c\xae\xcf\x77\x5a\x8f" - "\x85\xe7\x47\xb3\xb1\x30\x51\xe9\x5a\x1c\xe6\x37\x2e\xdd\xff\xb6" - "\x1e\x0b\x2f\xc6\x70\xf7\xbe\x25\xe6\x8f\x15\xc6\xc2\xd6\x49\xc2" - "\x58\x78\xb1\x8f\x3f\x2f\x8c\x85\x6d\x6b\xae\x9d\xfc\xb1\x5b\xbf" - "\xef\x7f\x2c\x6c\x6d\x94\x16\x73\xd9\x36\x4f\xfa\x58\xd8\x26\x7a" - "\xff\x69\x9b\xe8\xfd\xa7\x17\xab\x86\x6e\x2c\x6c\xeb\xea\x7f\x2c" - "\x6c\x6b\xba\x7a\x79\x65\xb7\x29\xac\xc7\xc2\xd6\x20\x36\x16\x26" - "\x15\xba\x16\xb7\x79\xd1\x09\xff\x7f\xa0\xb8\xcd\xf6\x44\xee\xb9" - "\x00\x89\x79\x6c\x85\xb1\xf0\xd2\x34\x61\x2c\x6c\x5f\xee\x78\x2c" - "\xe4\x6c\xbc\x76\xf2\xd8\xbe\x64\xea\x7f\x2c\xbc\xd4\x2c\x2d\x46" - "\x93\xb3\x5c\xfa\x58\xc8\x19\x2f\xc4\x68\x72\x12\x85\xb1\xb0\xbd" - "\x7a\xe8\xc6\xc2\x76\xcf\xfe\xc7\x42\x4e\xeb\xd5\xcb\x6f\x9b\xa3" - "\xb4\x1e\x0b\x2f\x4d\x66\x63\x61\x72\x80\x6b\x71\x9e\xed\xe9\xee" - "\xc7\x79\xf2\xd3\xb9\x67\x26\x24\xe6\xd3\x15\xc6\x42\xee\x63\xc2" - "\x58\xc8\x5f\xe3\x78\x2c\xe4\x3d\x7f\xed\xe4\xd3\xcd\xbb\xa1\xff" - "\xb1\x90\xdb\x26\x2d\xa6\x93\xb7\x46\xfa\x58\xc8\x9b\x22\xc4\x74" - "\xf2\xd2\x85\xb1\x90\x7f\x78\xe8\xc6\x42\xbe\x6f\xff\x63\x21\x4f" - "\x7f\xf5\xf2\xec\xe6\x8d\xb6\x1e\x0b\xb9\x21\x6c\x2c\xdc\x5f\xea" - "\x5a\x5c\x28\x7f\xab\xfb\x71\xa1\x97\xb7\x72\xcf\x93\x48\xcc\xeb" - "\x2b\x8c\x85\x1d\xf3\x84\xb1\xf0\x72\x3f\xfb\x3c\x14\xec\xb8\x76" - "\xf2\xfa\x16\x0c\xb0\xff\xd1\x8e\xfe\xf6\x3f\xb2\x13\x03\x2a\xd8" - "\x28\x7d\x2c\x14\x84\x0a\x31\xa0\x02\xd1\xfb\x7f\x2f\xd7\x0e\xdd" - "\x58\x78\x79\x80\xfd\x1f\x0a\x9c\xd8\xff\xc1\xd5\x7c\xbf\x05\x41" - "\xd6\x63\x61\xc7\x4c\x36\x16\x1e\x50\xb9\x16\x47\x7a\x79\xc0\xf8" - "\x3f\xae\xf3\x7b\xfc\xfa\xc6\x91\xea\x5a\xa7\x90\x5f\x2c\xc2\xb1" - "\x50\x34\xd5\x58\x94\xae\xc6\xfc\xc2\xa6\x40\x3e\x07\xe5\x66\x3e" - "\xc7\x8b\xc1\xc8\x72\x50\xea\x4d\xbd\x39\x28\x59\xee\x0f\x22\xc7" - "\x77\x81\xf1\x9d\x60\xa3\x92\xe5\x9f\xa4\xf8\x4c\x14\x3e\x23\xd5" - "\x52\xcb\xe5\x57\x49\x37\x42\xdf\xcf\x0e\x90\x7f\x32\x5a\x47\xea" - "\xa2\xd3\x88\xd1\xf7\xa2\x96\xbd\x27\x5c\x58\xc7\xe5\x9f\x5c\x16" - "\x70\x4b\xee\xbf\x89\x9f\x0f\xe6\x9f\x8c\xa6\xe6\x4c\x1d\xd5\xd7" - "\x77\x12\xa0\x05\xf9\x2e\xb7\xe4\xa0\x2c\xba\x0f\xfb\x6e\x5c\x16" - "\x74\x4b\xf9\xbf\x1d\xe5\x17\x2e\x72\x21\x0f\x6c\x61\x9b\x10\xdf" - "\x29\x1a\x2f\x60\xb4\x88\x9b\x83\xe1\xfc\xb1\x3a\x35\xd8\x98\xdc" - "\xff\xab\xea\x71\x29\xf7\x46\x51\x98\x13\x3a\xc3\x67\x44\xfa\xd8" - "\x2f\x41\x67\xc5\x7a\xd0\x59\x13\xe6\x39\x76\x5e\x67\x9e\x17\xaf" - "\x8e\xce\x8a\xb3\x9c\xd7\x59\xf1\x37\x36\x3a\xb3\x13\x87\x28\xfe" - "\x58\xba\xce\x8a\x4b\x85\x38\x44\xb1\x4e\xd0\xd9\x6f\x83\x99\xce" - "\x8a\x53\x99\xce\xa6\x82\x5d\x76\x65\x5d\x5e\x3c\xe0\xfb\xdf\xb8" - "\x6e\xea\xf1\xeb\xbb\x2e\x17\x74\x56\x52\x65\x2c\x82\xb5\x3b\xac" - "\xcb\x9d\xd7\xd9\x8d\x2d\x57\x47\x67\x25\x93\x9d\xd7\x59\x49\x99" - "\xb5\xce\xec\xad\x97\x4b\x5c\xd8\xb3\xb3\x24\x42\x58\x2f\x97\x14" - "\x0a\x3a\x2b\x69\x65\x3a\x2b\x19\xcf\x74\x36\xcd\xd8\xe3\x52\x0e" - "\x90\x92\x6a\x27\x74\x86\xf7\xf4\xfb\x19\x67\xaf\xa8\x41\x67\x4d" - "\x98\xf7\xd9\x79\x9d\xf9\x7e\x72\x75\x74\xb6\xb3\xcd\x79\x9d\xbd" - "\x32\xc7\x46\x67\x76\xd6\x75\xaf\x3c\x20\x5d\x67\xaf\x28\x84\x75" - "\xdd\x2b\x61\x82\xce\x5e\x29\x61\x3a\xdb\xa9\x63\x3a\x7b\x30\xa8" - "\xc7\xa5\x3c\x22\xaf\x0c\x18\xff\x42\x3f\xb4\xc7\xaf\xef\x3a\x47" - "\xd0\x59\xa9\xb7\xb1\x08\xd6\x42\xb0\xce\x71\x5e\x67\xf7\xbf\x78" - "\x75\x74\xb6\xab\xd4\x79\x9d\x95\x7a\x5a\xeb\xcc\xde\xfa\x63\xd7" - "\x79\xe9\x3a\xdb\x55\x23\xac\x3f\x76\x19\x05\x9d\x95\xce\x64\x3a" - "\xdb\x55\xc8\x74\x16\x12\xd9\xe3\x52\x2e\x92\xd2\x00\x27\x74\x86" - "\xf7\x60\xfb\x19\x67\x65\x5a\xd0\x59\x13\xe6\xc1\x76\x5e\x67\x8b" - "\x1f\xbe\x3a\x3a\x2b\x8b\x70\x5e\x67\x65\xef\xd8\xe8\xcc\x8e\x9f" - "\x5c\xe6\x42\x1e\xec\xb2\x78\xc1\x4f\x2e\xab\x16\x74\x56\x4e\x98" - "\xce\xca\xc2\x98\xce\x1e\xca\xea\x71\x29\x9f\x49\x99\xc3\xfc\x5f" - "\xfd\xf9\x8d\x96\xe7\xf2\x05\xbd\x55\xa4\x5e\x3b\xbe\x63\x85\x97" - "\xf3\x7a\xab\x78\x76\x60\xdf\xb1\x62\xa1\x74\xbd\x55\x04\x0a\xbe" - "\x63\x45\xac\xa0\xb7\x8a\x1a\xa6\xb7\x0a\xe2\x9e\xef\x58\x31\xe0" - "\xfb\xaf\xf6\x7c\xc7\xbe\x7a\xdb\x1d\x7c\xed\xf8\x8f\x95\x5a\xe7" - "\xf5\xb6\x7b\xdc\xc0\xfe\xe3\x6e\x5f\xe9\x7a\xab\x6c\x16\xfc\xc7" - "\xdd\x2a\x41\x6f\xbb\x13\x99\xde\x2a\x6b\xdc\xf3\x1f\x77\x3b\xcc" - "\xff\xd6\x9f\xff\xd8\x57\x6f\xaf\xb6\x5d\x3b\x3e\xe4\xab\xa9\xce" - "\xeb\xed\xd5\x2f\x07\xf6\x21\x5f\x3d\x21\x5d\x6f\xaf\x16\x0a\x3e" - "\xe4\xab\x4d\x82\xde\x7e\x17\xc4\xf4\xf6\x6a\xa2\x7b\x3e\xe4\xab" - "\x06\x57\x7c\xc8\xbe\x7a\xab\xaa\xbc\x76\xfc\xc8\xaa\x60\xe7\xf5" - "\x56\xb5\x73\x60\x3f\xb2\xca\x85\x3d\x8b\xab\x66\x0a\x7e\x64\x55" - "\xbe\xa0\xb7\x2a\x1d\xd3\x5b\x55\x90\x7b\x7e\x64\xd5\x80\xf9\x3f" - "\xec\xf9\x91\x7d\xf5\xf6\xba\xfa\xda\xf1\x25\x5f\x93\xe0\xff\xbf" - "\x3e\x67\x60\x5f\xf2\x75\x17\xfc\xff\xd7\x15\x82\x2f\xf9\xba\xc8" - "\xff\x7f\x9d\xf7\xff\x5f\xd3\xb9\xe7\x4b\xbe\xee\x8c\xff\xdf\xc7" - "\x97\xec\xab\xb7\x3d\xca\x6b\xc7\x9f\xfc\x7d\xa5\xf3\x7a\xdb\x73" - "\xc3\xc0\xfe\xe4\xef\x5d\xd8\x07\xea\xf7\x87\x05\x7f\x72\x0f\x11" - "\xf4\xb6\x27\x82\xe9\xed\xf7\x25\xee\xf9\x93\x7b\x1c\xe6\x7f\xb4" - "\xe8\xcd\xe4\x97\xae\xa6\x76\xe2\x90\x27\x63\xa7\xf0\xb9\x09\xf7" - "\xea\x4c\xfe\xe9\x6a\xa9\xfb\xbb\x58\x72\x4e\x9f\x88\x25\xa4\xc5" - "\x63\xef\x46\xf7\xf2\x4e\xef\x1d\xe7\x7e\xde\xe9\x37\x2e\x0f\xde" - "\xfe\x2e\x6f\x9c\x91\x9e\x77\xfa\x8d\x3d\x82\x0f\xfa\x46\xbb\xa0" - "\xeb\x3f\x70\xcf\x27\x48\xcb\x47\xfd\x46\xbc\x7b\xf9\xa8\xf7\x3e" - "\xcb\xf0\xf5\xc6\x78\x96\x8f\x7a\x6f\xec\xd0\xec\xfb\xb2\xa7\x09" - "\xf3\x51\xd3\xdc\x87\xf7\xb9\x96\x1f\x79\x6f\xbb\x13\x78\x6e\xa2" - "\x76\x62\xb4\x02\x9e\xf7\x57\x03\x9e\x9b\xa4\xee\x33\x63\x8d\xe7" - "\xfd\x8f\xb9\x87\xe7\x7d\x5d\xee\xe3\x79\xdf\xf1\xc1\xdb\x67\x66" - "\xdf\x7e\xe9\x78\xde\x97\x2a\xf8\xe6\xfb\x0e\x0b\x78\xde\xaf\x97" - "\x8e\xe7\x7d\x53\xdd\xc3\xf3\xfe\x87\x18\x9e\xff\x60\x64\x78\xde" - "\x3f\x65\x68\xf6\x9f\xf9\xc3\x1e\x86\xe7\x50\x83\x6b\xf9\xa7\xf7" - "\x1f\x1e\x18\xcf\x19\x6a\x6a\x27\x7e\x2d\xe0\xb9\x3a\xcb\xe4\x9f" - "\xa1\x96\xba\xdf\x8d\x35\x9e\xab\x6f\x76\x0f\xcf\x07\x4e\xb8\x8f" - "\xe7\x03\x45\x83\xb7\xdf\xcd\x81\x0c\xe9\x78\x3e\x10\x26\xac\x59" - "\x0e\xe4\x08\x78\xae\xd6\x4a\xc7\xf3\x01\x6f\xf7\xf0\x5c\xed\xcb" - "\xf0\xfc\x66\x1d\xc3\x73\xb5\xd7\xd0\xec\x83\xf3\x66\x2a\xc3\xf3" - "\xa3\x53\x5d\xcb\xef\x5d\xed\x30\xff\xb1\x08\xcf\x4d\xd4\x4e\x6c" - "\x5f\xc0\xf3\x1f\x23\x00\xcf\x4d\x52\xf7\xdd\xb1\xc6\xf3\xdb\x6e" - "\xee\x73\xf1\xf6\x20\xec\x73\xf1\xb6\x1b\xfb\x5c\xd8\xee\xbb\xf3" - "\xf6\x2c\xe9\x78\x7e\x3b\x40\x58\xcb\xbd\x1d\x25\xe0\xf9\x8f\xf9" - "\xd2\xf1\xfc\x56\xb3\x7b\x78\x7e\x9b\xdf\xff\xe2\xad\x52\x86\xe7" - "\xb7\x9b\x86\x66\x3f\x9e\xb7\xc2\x18\x9e\x1f\xdb\xe2\x5a\xfe\xf4" - "\x3f\x46\x0d\x8c\x67\x8d\x9a\xda\xb9\xef\x21\xe0\xf9\x4f\x2a\x93" - "\xbf\x46\x2d\x75\xff\x1f\x6b\x3c\x1f\x7a\xc7\x3d\x3c\x1f\x8a\x73" - "\x1f\xcf\x87\xee\x1b\xbc\xfd\x7f\x0e\xdd\x2a\x1d\xcf\x07\xdb\x84" - "\x35\xee\x21\xd1\xfd\xff\x3f\x45\x4b\xc7\xf3\x41\x37\xf7\x05\x3a" - "\xf4\x16\xc3\xf3\x41\x7e\x5f\xa0\x43\x7b\x86\x66\x5f\xa0\x83\x01" - "\x0c\xcf\x4f\xd4\xb9\x96\x9f\xfe\x4f\xe3\x9d\xc0\x73\x13\xb5\x73" - "\x4f\x48\xc0\x73\x8d\x1e\xf0\xdc\x24\x75\x1f\x22\x6b\x3c\xd7\x6c" - "\x73\x0f\xcf\x35\x0f\xb8\x8f\xe7\x1a\xcf\xc1\xdb\x87\xe8\xcf\xe7" - "\xa5\xe3\xf9\xcf\x96\xfb\x7f\x60\x9f\xff\x2c\xba\xff\xf7\x8e\x0b" - "\xfb\x13\xfd\x39\xdd\x3d\x3c\xd7\x6c\x66\x78\xfe\xf3\x54\x86\xe7" - "\x9a\xd4\xa1\xd9\x9f\xe8\x4f\x6d\x0c\xcf\xb3\xfd\x5c\xcb\xff\x5f" - "\x33\xe0\xf3\x1f\xf6\xe2\x1b\x96\xb8\x94\x80\xe9\xbf\x1e\x73\x3f" - "\xc6\xf1\xd7\x25\xee\x61\xfa\xaf\xc3\xdd\xc7\xf4\x5f\x3e\x1f\xbc" - "\x18\xc7\x5f\x5c\xd8\xeb\xef\x2f\x39\x42\x8c\xe3\x2f\x8d\x02\xa6" - "\x0f\x2b\xa4\x63\xfa\x2f\x11\xee\x61\xfa\xaf\xf3\x18\xa6\xff\xa2" - "\x64\x98\xfe\xeb\xcc\xa1\x89\x71\xbc\x73\xd8\xbd\x18\xc7\x5f\x1b" - "\x5d\x89\x71\xf4\xc5\xf4\xbb\x25\xee\xc7\x39\xde\x9d\xe4\x1e\xa6" - "\x8f\x7c\xe9\x3e\xa6\x8f\xec\x1f\xbc\x38\xc7\x91\x22\xe9\x98\x3e" - "\x12\x2d\xc4\x39\x8e\x54\x09\x98\x7e\xb7\x49\x3a\xa6\x8f\x04\xba" - "\x87\xe9\x77\xc7\x31\x4c\x1f\x6e\x65\x98\x7e\x57\x35\x34\x71\x8e" - "\xc3\xf9\xee\xc5\x39\xde\xad\x72\x25\xce\xd1\x17\xd3\xef\xc7\xbb" - "\x1f\xeb\x78\xdf\xd3\x3d\x4c\x6b\x0f\xb9\x8f\x69\xed\xe6\xc1\x8b" - "\x75\x68\xe3\xa4\x63\x5a\x3b\x59\x88\x75\x68\x53\x05\x4c\xbf\xbf" - "\x4f\x3a\xa6\xdf\xeb\x74\x0f\xd3\x5a\x13\xc3\xf4\x7b\x35\x0c\xd3" - "\x5a\xc3\xd0\xc4\x3a\xde\x8b\x71\x2f\xd6\xf1\x7e\xaa\x2b\xb1\x8e" - "\xbe\x98\x3e\x16\xe2\x7e\xbc\xe3\xe8\xe7\xee\x61\xfa\xe8\x36\xf7" - "\x31\x7d\x74\xde\xe0\xc5\x3b\x8e\x4e\x93\x8e\xe9\xa3\xa2\xfd\x2f" - "\x8e\x8a\xde\xff\x3f\x96\x25\x1d\xd3\x7f\xab\x73\x0f\xd3\x47\x3f" - "\x66\x98\xfe\x5b\x0e\xc3\xf4\xd1\xda\xa1\x89\x77\xfc\x6d\x8a\x7b" - "\xf1\x8e\x63\x03\xe6\xbf\xb0\x17\xef\xe8\x8b\xe9\xbf\xfb\xb9\x1f" - "\xf3\xf8\x60\xbf\x7b\x98\xfe\x60\x89\xfb\x98\xfe\x60\xdc\xe0\xc5" - "\x3c\x3e\xf0\x95\x8e\xe9\xe3\xcd\x42\xcc\xe3\x03\xd1\xf3\x4f\x7f" - "\x8f\x94\x8e\xe9\xe3\x95\xee\x61\xfa\x83\xd7\x18\xa6\x8f\x47\x33" - "\x4c\x7f\x50\x3a\x34\x31\x8f\xe3\xde\xee\xc5\x3c\xfe\xae\x72\x25" - "\xe6\xd1\x17\xd3\x27\xda\xdc\x8f\x7b\x9c\xd8\xec\x1e\xa6\x4f\x4c" - "\x72\x1f\xd3\xb5\xa6\xc1\x8b\x7b\xd4\x7e\x25\x1d\xd3\xb5\xd5\x42" - "\xdc\xa3\x56\x94\xff\xfe\xc3\x20\xe9\x98\xae\x4d\x71\x0f\xd3\x27" - "\x36\x32\x4c\xd7\x4e\x66\x98\x3e\x91\x38\x34\x71\x8f\xbf\xeb\xdc" - "\x8b\x7b\x9c\xe8\xf3\xfc\x5b\xf2\xca\x84\x18\xd5\xda\x55\xab\x92" - "\x57\xa6\xa8\x92\xe3\xe3\x9e\x5a\x39\x6d\xac\xe5\xf7\xb4\xe0\xd4" - "\xb1\xa9\xc3\x48\xcc\x9a\xe5\xcb\xd6\xdf\x23\x9c\x8c\x5f\x99\x00" - "\x7f\x86\x91\xd8\xe5\xc9\xb1\xaa\x94\x8d\x89\x2b\x55\xf8\x6b\xcd" - "\x53\x89\x40\xb2\x36\x45\x28\x99\xbb\x32\x7e\x79\x6a\x5c\xc2\xd3" - "\xaa\xe5\xf1\x71\x4f\x27\xac\x59\x99\x90\xa2\x4a\x5a\xf9\xec\xba" - "\xb8\xa4\x95\xf8\x3d\x59\xb5\x6a\x6d\x12\x14\x3c\xb5\x32\x6e\xfd" - "\x4a\xd5\x8a\x75\xab\x56\xad\x4c\x4a\x1e\x46\x66\xad\x8b\x4f\x89" - "\x4b\x8c\x5f\xa9\x0a\x9d\xf5\xd0\xdd\x91\x33\x9e\x8c\x7c\xf0\xc1" - "\x61\x44\xb4\xf7\xb4\x8a\x16\x56\x44\x03\x86\x14\x67\x3d\x3e\x7b" - "\xbf\x3e\x80\x90\xed\x80\xcd\xbc\x24\xa2\xdc\x96\x44\x14\x5b\x2f" - "\x12\xaf\xed\x17\x89\xb7\xea\x19\x12\x42\x7d\x0f\x69\xf3\x2e\x12" - "\x3f\x3a\xea\xe1\x26\xba\xe3\x02\xa1\xbe\x17\x43\xf4\xbe\x9f\xe9" - "\xa1\x4c\x49\x77\x7c\xa6\xc2\x73\xa0\x0b\xcc\x71\xb0\xa7\xc5\xe3" - "\xb3\x2c\xbd\xef\x3f\x1a\x33\xbf\x21\x72\x3a\xe2\xa3\xc8\x37\xcd" - "\x7a\xf9\xfb\xb8\x53\x09\xc8\x8a\x78\xd4\xc5\xc3\xa1\x26\x1e\x27" - "\xbd\xe0\x08\x80\x23\x1a\x8e\xad\x70\xe4\xc3\x61\x24\x1e\xf5\xa1" - "\x70\xa4\xc0\x01\x65\xf5\xa5\x70\xec\x81\xa3\x9a\x78\x34\x40\x79" - "\x43\x0c\x1c\x70\xae\x21\x87\xf1\x69\x28\x24\x1e\x8d\x7e\x70\x44" - "\xc1\x01\xd7\x7f\x0c\xe5\x1f\xd7\x10\x8f\x4f\x80\xee\xe3\x26\x38" - "\x0c\x70\x00\xcf\x4f\x54\x70\xe0\xf5\x25\xec\xdc\xa7\x4a\x38\x66" - "\xc2\x01\x3c\x3e\x85\x7a\x3e\x3d\x0c\x47\x23\x1c\xcd\x70\xb4\x12" - "\x8f\x53\xd0\xb6\x53\x40\x73\x2a\x10\x0e\x68\xc3\xa9\x2a\x38\x6a" - "\x89\xc7\x69\xe0\x73\x1a\xea\x38\xad\x23\xd0\x47\xfe\x08\x82\x23" - "\x4a\xf4\x3b\x55\xf4\xdd\xde\x51\xe2\xb3\xf9\x76\x9d\xf6\x2e\x23" - "\x8c\xdb\xba\x13\xa6\x6c\xe2\x61\xda\xf1\x8f\xc6\xc4\xbb\x88\xec" - "\x9c\x47\x5d\x51\xc3\x16\x42\xa8\xf2\x02\xd1\xa6\x75\xe3\xf9\x22" - "\x94\x59\x47\x6e\x5d\xa1\x8e\xbc\x59\x82\xe3\x53\x1a\x3e\xeb\x0a" - "\xf9\xeb\x4f\xe9\x64\x8f\x57\xe3\xf5\xb4\x20\x6d\x34\xcd\x54\xef" - "\xc2\xf7\x70\xcf\xa2\x0c\x71\xdc\xe4\x6f\x4c\xa1\xca\x64\x03\xda" - "\x18\x6d\x1a\xd7\xae\x35\x30\xde\x46\xc0\xf5\xf1\x14\xf4\xa8\xf7" - "\x07\x9d\x67\x13\x05\xf7\x7b\xc7\x67\x7a\x5a\xb9\x37\x8c\xd9\x9d" - "\x93\xdc\xfa\xa5\xcb\xff\xe5\x7c\x3c\xd7\xf9\x5a\x7c\x08\xad\xd2" - "\x34\x69\x13\xba\x49\xab\xc7\xc9\x85\x60\xff\xe4\xf4\xce\xf8\x10" - "\x73\xf1\xcb\xf9\x35\x80\x01\xa4\x79\x47\xd3\x86\x7f\x63\xa1\xdf" - "\x72\x5a\x58\xa8\xc6\x18\x90\x56\x53\x00\x36\xb9\x6e\x4d\x97\xff" - "\xde\x60\xd5\xe3\x3e\xb4\x05\xeb\x91\x63\xbe\xf5\x93\x84\xd9\x85" - "\xba\xf8\x2e\xff\x87\x75\xc8\xdb\x54\xb9\x57\x0f\xe7\x14\x14\xb0" - "\x07\x6d\x90\x5d\x80\xeb\x4c\x45\x0f\x37\x69\x1f\xe7\xea\xbc\x0c" - "\xed\x94\x67\x3e\x06\xbc\x5f\xdd\xab\x3f\x90\xd6\x29\xa7\xd8\x76" - "\xbf\x87\x9b\x00\xeb\xde\xa6\xdc\x0f\x27\xef\x1c\x49\x14\x65\x05" - "\x84\x54\x8c\x24\x5e\x1d\xb9\x27\xdb\x75\x8a\xa8\x76\x66\xf7\xea" - "\xe2\xe5\x40\x03\x75\xd6\x52\xd0\x07\x57\x57\x61\x6e\xa3\xe3\xba" - "\xea\xa7\xf5\xd6\x55\x9c\xdb\x88\x75\x71\xf2\x61\xb2\x62\xdf\x2d" - "\x7c\xaa\xe2\xfb\x69\x73\xfd\x03\xc8\x43\xe7\x51\x3f\x9e\xbe\x1e" - "\xaf\x37\x15\x17\xe9\xf1\x1c\xd2\x33\xf9\x7f\xa6\xf7\xd9\x4c\x0c" - "\x14\xca\x4c\xbc\x0e\x4c\xa8\x03\x79\x16\xd8\xaf\x93\xde\x58\x1f" - "\x5c\x9b\x6a\xca\x56\x11\xd5\xe3\x84\xb4\x7b\x34\x70\xb1\x09\xaa" - "\x4c\x6b\x67\x3a\xae\xff\x38\xb5\x96\x9a\xe1\x30\x4d\xac\x25\x32" - "\xed\xe3\xa8\xdf\x7a\xbd\xea\x91\xeb\x41\xce\xf5\xdf\xf7\xca\x77" - "\xcc\xde\x36\x90\x91\x12\xe4\xe2\x6d\x7a\x61\xba\x96\xca\x55\x04" - "\xfb\x21\x96\x17\xf6\xa7\x23\xb7\x41\x65\x23\x33\xe5\x63\x8f\x65" - "\x52\x11\xef\x6f\xc4\xfd\x07\xfa\x08\x9d\x6c\x7a\x27\xd2\xab\xee" - "\xe0\x30\xb7\xc6\xc4\x9f\x47\xdc\xa3\x9e\xa9\x7f\x45\x34\xfe\x9e" - "\x37\x8e\x28\x7d\x6a\x89\x5c\xa5\x09\xac\x61\x78\x28\x54\x43\xdf" - "\xa6\x32\x7e\xd0\xc7\xe2\xac\x3d\x70\x6d\x90\x80\xbf\x86\x3a\xd3" - "\x8e\xb4\xd6\x2e\xff\x22\x65\x67\xd1\xf6\x46\x9a\x9f\xd6\x8a\xef" - "\x9f\xb7\x78\x34\x1c\xe7\x64\x90\xed\x45\x58\x3b\xd2\xda\x34\xf1" - "\x54\xaf\xf9\x1e\xea\x1a\x55\xa4\x7c\x67\xbd\x1e\x74\xb6\xbd\x11" - "\x31\x51\x73\xa5\x53\x8e\x39\x01\xe9\x88\x0f\xe7\x97\xb3\xbe\x7a" - "\x41\x5f\x09\xf2\xed\xc8\x6d\xf4\x16\xfa\xda\x50\x8d\xf8\x80\x3a" - "\x8c\xac\x6e\xe0\x9b\x0d\x75\xec\x48\x33\x02\xdd\x64\x9d\x4c\x1f" - "\xca\x8d\xaf\xf5\xf4\x54\x5e\x37\x21\x97\xd6\x53\x63\xb8\xf1\x0b" - "\x33\xcc\xcb\x04\xce\x47\xea\xc8\xe2\x4a\x8b\xcc\xd8\x98\xeb\xe5" - "\xc3\xe5\x8a\xd0\xfb\x72\x7c\xd2\xed\xf1\xd1\x79\x34\x86\x2e\x33" - "\xaa\x64\xdd\x57\x68\x63\xde\x7c\x68\x5b\x36\xa1\xdd\xeb\x69\x5d" - "\x46\x18\xed\xcc\xfd\x84\x80\x6f\xd4\x4c\xc0\xd6\x8e\x1e\x21\xa3" - "\xfa\xf0\x8d\xc4\x67\x44\xa2\x0f\x3d\x51\xdb\x4c\x36\x85\xd1\xb6" - "\x86\x54\x13\xa9\x37\xb4\x92\xf4\xcf\x89\x77\xe6\x49\xe2\x97\x1e" - "\x46\xf5\x75\xd1\xcd\x84\x95\x9f\x24\x99\x5f\x12\xc5\xa6\x63\xb4" - "\x73\x36\xcc\xd3\x1f\x35\x63\x79\x2b\x94\x9b\x48\x66\x1b\x35\x6a" - "\x96\x10\x6f\xfc\x7e\xf2\x18\x96\x7f\x45\x60\x3c\x2b\xc2\x53\xf5" - "\x3e\xe5\x50\x27\x5e\x5f\x01\x6d\x31\x5f\xa1\x87\xf3\xae\x10\xb2" - "\x69\x21\x09\x48\x5f\x4e\x94\xe1\xe0\x2e\x34\x18\x0f\x91\x70\x13" - "\x05\x3f\xe0\x38\xc9\x88\x23\x5e\xe1\x46\x7c\x7f\xfc\x34\x1c\x65" - "\xa4\x02\x68\xa1\x6f\x5a\xec\xdb\xa6\x33\xe0\x17\x9d\xb7\x5c\x73" - "\x84\xbf\xe6\x0c\x41\x99\x75\xf9\x5e\x0c\xee\xdc\x71\xb1\x1a\xfa" - "\x1e\x86\x32\x80\x7a\x1a\xcd\x78\xdd\x15\x6e\x7e\x42\x19\xc8\x96" - "\x19\x01\xab\x45\x39\xd5\xcb\x52\xb5\x1c\x5f\x9d\xc7\xc7\x5b\x2a" - "\x92\xb8\x36\x59\xd1\x86\x1b\xe9\x25\xbd\x7f\x0e\xf0\xfa\x78\x5f" - "\x78\xea\x83\x94\xd7\x5b\x67\x47\xee\xc7\xed\x16\x79\x5b\xf4\x02" - "\x34\x3a\xd0\x45\xa7\x47\x22\x51\x74\xe4\x7e\xe2\xad\x93\x5d\x52" - "\x89\xb0\x8b\x76\xeb\x3a\x0b\x2d\x4f\x13\xac\x93\x7d\x1f\x2b\xd0" - "\x9c\x24\x80\xe9\x5e\x1a\x38\x0f\xf8\xbf\x98\x28\x9c\xe7\xf0\xdc" - "\x7b\x9e\x9f\x7f\x2d\xbc\x3d\xc0\x0e\xd7\x9a\xfc\x0b\xa3\xa9\xff" - "\xf4\x44\x7a\x29\xc0\x9b\xca\x41\x37\x46\xda\x69\x2e\xca\xac\x86" - "\x39\xd6\xbb\xc1\x68\x20\x8c\xfe\x93\xcb\xb4\x68\x7a\x2a\x7b\xe6" - "\xf5\x93\x33\xc8\x13\x7c\x31\x25\xcc\xd7\xca\xf0\x5a\xda\x89\xf6" - "\xc3\x54\xf4\x84\x3e\x37\x09\xe6\xec\xa2\xc2\x08\xb3\x7f\x5e\x74" - "\xe7\xee\xbd\x21\x38\x27\xe0\x78\xa3\x85\x70\x2d\xcf\x07\xea\xf5" - "\xd4\x79\x7c\x72\xd0\x04\xd7\xd3\xc2\xcc\x6a\x56\xce\xec\x1b\xb3" - "\x43\x9f\x1c\xa4\x63\xe1\x5c\x7e\x72\x1d\x9c\xf3\x6c\xf1\xf8\x34" - "\x04\xca\x09\xcd\x4f\x51\x68\x35\x17\x81\xf6\xd3\x19\x0c\xd3\xc9" - "\xb5\x56\xbf\xe5\x28\xcf\xfa\x7c\xb4\x51\x68\x9b\xa0\x7c\xa5\x60" - "\x27\xd8\x1c\xc0\x6c\x7b\xa6\xb6\x23\xf7\xd3\x54\x9d\x6c\xf6\x78" - "\x94\x13\xea\xd6\xc0\xec\x5a\xba\x69\xf7\xde\xb0\xa3\x61\x84\x1c" - "\x3d\x86\xe3\xe8\xd3\x52\x9d\x2c\x22\x44\x90\xe5\xa7\x87\x90\x96" - "\x6b\x27\xd8\x12\xfc\xce\xd9\x15\xb8\x06\xc6\x39\xda\x2f\x05\xb3" - "\x8f\x9f\x56\xe3\xbc\x05\xf6\x24\x96\x9f\xa7\x6a\x81\x77\x25\x1d" - "\xf9\x66\x1b\xb4\x2b\xab\x85\x6f\x8b\xb8\x6d\x16\xbb\x48\x77\x1c" - "\x88\x65\xb4\x9b\xa0\xfe\x53\xa3\x75\xb2\x39\x01\x62\xbc\xb0\x7e" - "\x9d\x7a\x1e\x30\xdd\x34\xf1\x18\xfc\x06\x5f\xca\xc2\x0f\xec\x8b" - "\x17\xd8\x95\x04\xc4\x1b\xda\x94\x92\x02\xf4\x8f\x0e\x24\x76\xee" - "\x38\x90\x0a\xbc\x62\x2d\xb6\x05\xaf\xc5\xf1\x00\xf6\xc5\x8b\xb3" - "\x1b\x26\xa3\x07\x37\xe6\x4d\x64\x7c\xaf\x2d\x81\xb2\x2e\xdf\x03" - "\x89\x7c\xb9\x82\x6b\x93\xdc\xc3\x0c\xf5\xcb\x2c\xf5\x75\xf9\xa6" - "\xe9\x81\xaf\x56\x27\xfb\x75\xa0\x95\xad\x29\x48\x8c\xa6\x54\x8d" - "\xb8\xf1\x80\xb6\x7e\x05\x7f\xaf\xe7\x71\x7a\xe3\xd1\x5a\x42\x42" - "\x41\x5b\x97\x40\x9f\x3b\x47\x51\xb8\xfe\x34\xd1\x91\xad\x55\x78" - "\xfd\x36\xf8\x8d\xe5\x48\x03\xe5\x01\x3a\xb2\xad\x90\xf1\x3d\xe9" - "\x8d\xfa\xb1\xe6\x7b\x7a\x06\xe3\x7b\xfa\x31\xe4\xc7\xcf\xf1\x37" - "\xe2\x77\xbc\x1e\x79\x97\x15\xd3\x76\xe4\x07\xbc\x62\x2c\x75\x6c" - "\x87\x32\x4b\x3d\xa1\x6b\x7a\xeb\xda\x02\x75\x8d\x16\xf7\xa1\xa4" - "\x98\x1a\xf8\xf6\x55\xea\x48\x59\x2d\x9e\xdb\x0a\x65\x78\x2d\xc3" - "\xc2\xe9\x23\x88\x13\x1d\xeb\x97\x07\xc3\xcb\xe9\x3a\x1d\x29\x8d" - "\x10\xcf\x3d\xa0\x8b\xe1\x96\xb9\x89\xe7\xa7\xb7\xf0\x13\x78\x31" - "\x1e\x34\xbf\x3a\x96\x1f\x0b\x38\x66\xbd\x91\x7f\x47\xee\x67\x2a" - "\x1d\x79\xa9\x8a\xb5\xad\x3e\xdf\xc0\xb0\x0d\x3a\xe0\xae\x61\x3a" - "\xcf\xfd\x30\x1d\xe7\xcd\x8a\x02\xb4\x63\x69\xed\x70\x4d\xa4\xcd" - "\x9c\xe9\x05\xe5\xcd\x3c\xbf\x44\x9d\x6c\x5a\xab\xb5\x0d\xc2\xb9" - "\xae\x30\x0b\x71\xc3\xdb\x86\x22\x6c\xaf\xe5\x3c\xd4\xa1\x80\x3a" - "\x72\x11\xef\x58\x87\xa9\x68\x7b\x08\xf0\xa9\xb1\xa9\x43\x81\x74" - "\xe0\xf3\x1c\xc5\xf9\xfb\xe5\x51\xb4\x0d\x68\x9a\x2d\x34\x78\x1e" - "\x64\xfe\x6b\x28\x83\xfe\xef\x8b\xc7\xb2\x5c\xa0\x81\xf5\x9f\xc3" - "\x77\x7a\x34\x63\x88\xbc\xa1\x54\x87\xeb\x5d\x1c\xdb\x53\x1b\x46" - "\x1b\x48\x43\xa9\x99\x98\x5f\x5f\x93\x18\xa2\xa1\xda\xb3\x1e\xff" - "\x58\x53\xdf\xd9\x46\xa4\xf9\xa8\xff\xe0\xf2\xff\xd0\x6e\x58\x97" - "\xa5\xdf\x43\xd0\x67\xb9\xe0\xd1\x54\xd6\xa0\xbf\xc8\xd9\x39\xf8" - "\xbe\x0d\xcf\xbf\x0c\xeb\x38\x5c\xcb\xc1\x7a\x3d\x36\x5f\xce\xd6" - "\x73\x66\xa0\x2d\xc7\x72\x5c\xeb\xc1\xfc\x55\x21\x3a\x47\x5f\x5f" - "\xad\x67\xb2\x6b\x9a\xc7\xd9\x7b\x6c\xaf\xf1\x51\x2d\xb6\xd9\x5c" - "\xb5\x5a\x8f\x7d\xc8\x4c\xa5\xe6\x06\x63\x87\x16\xe7\x38\xd5\x7a" - "\x5c\x87\x36\x4d\x0a\x2f\x23\xd4\xfc\xda\x6a\xbd\xc4\x3e\x70\xf7" - "\xbf\x61\xad\x7e\x41\x3f\x76\xb5\x3e\xd3\x44\xe4\x79\x1a\x4f\xaf" - "\xe9\xa5\x54\x7b\xe9\xce\x35\x89\x1d\xb9\x4d\x91\x18\xa5\x96\xee" - "\xbf\x37\x45\x5a\xfa\x5e\xce\xf7\x1d\xea\x3a\x88\x65\x13\x4b\xb2" - "\xb8\xfe\x02\x8d\xc3\x67\xfd\x68\xb6\x0f\x3d\x5a\x6a\x24\xc9\xa5" - "\xb4\x3b\xb9\x8c\xc8\x4d\xc5\x9b\x83\x0f\x94\x37\xa1\x4d\x0f\xb1" - "\xc8\x93\x93\x9d\x51\x4f\x12\x35\x44\x79\xce\xe3\xf3\xfb\xc2\xd3" - "\xb3\xb8\x7d\x9d\xde\x03\x3a\x69\x6d\xfd\x9c\xf3\xd5\xeb\x61\xed" - "\x1f\x6e\xcc\xa4\x6c\x5e\xfa\x7c\xc9\x6c\x9e\x1f\x9e\xb3\xe8\xaf" - "\x9c\x5f\x93\xbb\x50\x87\xc3\xf7\x5f\xfa\xe9\xab\xd2\x7e\x5f\xff" - "\x39\xc6\x8d\xbe\xb6\xf7\xed\xeb\x3f\x1f\x1b\xdc\xbe\xfe\x33\xc2" - "\x85\xbe\xaa\xec\xf7\xf5\x5f\xc3\x5d\xef\xeb\x3f\x9b\xfa\xf6\xf5" - "\x5f\xf7\x0d\x6e\x5f\xff\xe5\xf0\xfd\xcf\x7e\xfa\x1a\xec\xa0\xaf" - "\x5d\xae\xf7\xf5\x5f\xc7\xfa\xf6\xb5\x79\xcc\xe0\xf6\xb5\x39\xc8" - "\x61\x5f\xe5\x3e\x14\xed\x13\xd8\xa5\x6e\x4d\x17\xf8\x73\xc5\xbf" - "\x25\x19\xbb\x89\xbc\xce\xd0\x49\xea\x47\x37\x91\xcc\x8d\x44\x3e" - "\x21\x11\xec\x5e\x36\x99\x4a\x8b\x1f\xd6\xd7\x97\xb6\x43\xf9\x59" - "\x72\x32\xb5\x93\x84\x24\xa1\xfd\x6d\x3e\xdf\x10\x23\xd5\xfe\x36" - "\xd7\xf4\xda\x5f\xe3\x3d\xbc\xcd\xfd\xf7\xcd\xf5\xed\xdd\x04\xfb" - "\x0f\xdf\x3d\x7b\xed\x6f\x36\x93\xb7\xad\xfd\x45\x79\x34\x74\x76" - "\x5a\xd9\x5f\xf6\x6e\xd7\x99\x8f\x6d\x6d\x6f\xee\x39\x42\xec\xdb" - "\xde\x33\xfb\xd1\xf6\x96\xc3\x79\x69\xed\x3f\x93\x6a\xb1\xbd\xf9" - "\x50\xa7\xd8\xf6\x1e\x8d\xc1\xf9\xf5\x4c\xa3\x6b\xb6\xf7\x4c\xa3" - "\xa5\xdf\x65\x7c\xbf\xa1\x6c\xb2\xb5\xed\xfd\xb7\x97\x33\xb8\xa5" - "\xc5\xe9\xca\x03\xb7\x75\x7a\x9a\xab\x12\x82\x71\x7e\xeb\x00\x99" - "\xfc\xb9\xbc\x53\x71\xd6\xe3\xdf\x6c\xaf\x8e\x8e\x18\x19\xad\x8a" - "\x6f\x0a\x4f\xa1\x5f\xd0\xb1\x09\xc1\x18\x5f\xc5\x38\x01\x9c\x3f" - "\x02\x3e\x7d\x93\xb4\x76\x33\x9e\x30\xff\x25\x6a\x60\xbc\x1c\x58" - "\xdf\x29\x37\x6f\x52\xfb\x80\x1e\x94\xb4\x28\x2b\x82\xbe\xf0\x64" - "\xfe\xa5\xa2\x22\xed\xf1\xa0\xaf\x08\xd2\xd2\xcd\x8a\x10\xd7\xdb" - "\xff\x45\x58\xff\xed\xff\x22\x43\x7a\xfb\x19\x4f\xe7\xda\xff\x45" - "\x98\x53\xed\x1f\x05\xed\xef\x9e\xe2\x09\xeb\x45\xf9\x7b\xdd\x53" - "\x14\x12\xdb\xd3\xe4\x94\x8e\xdd\xaa\x43\xe7\xb4\xfd\xa3\xa3\xb6" - "\x47\x1c\x28\xd7\xcb\xc1\x06\x70\x73\x38\x8e\x3d\x66\xff\xda\xc0" - "\x66\x7d\x41\x99\x4d\xd2\x4b\xb4\x49\x3a\x87\xef\xbf\xf4\xad\x7f" - "\x73\xf5\xe0\xd7\xff\xa5\xe3\xfe\xdb\xda\xc4\x37\x33\x23\x1c\xdb" - "\xc4\xac\xea\xbe\x36\xb1\x45\x26\xdd\x26\x7e\x59\xd7\xd7\x26\xfe" - "\xe7\x6e\xc1\x26\xfe\xe7\x66\xd7\x6d\x62\xcb\x57\xce\xdb\xc4\x96" - "\xf7\x5d\xb3\x89\x2d\x39\xfd\xdb\xc4\x96\x56\xd7\x6c\x62\x4b\x6b" - "\x5f\x9b\xd8\x12\x66\x6d\x13\xff\xe3\xf0\x5d\x57\x9a\x1f\x1d\x04" - "\x73\xb4\xf7\x39\x8f\xff\xb4\x1b\xb3\x09\x31\xe7\xff\xab\x2d\xdc" - "\x44\x3b\xe8\x8e\xe8\x20\xb3\x7c\x32\xda\x95\x90\x8e\x8e\x58\x2f" - "\xf3\x86\x20\x6f\x3a\x32\x39\x89\xf6\x04\xe0\x9a\x2a\x10\xda\xef" - "\x43\x3b\x82\x46\xd0\x0d\x41\x23\x4b\xaf\x10\x3f\x38\x02\x4a\xf9" - "\xf9\x18\xbe\x07\xd3\x0d\x01\xc3\x72\xd7\x93\xf1\x3e\x06\xe2\x05" - "\x6d\x50\xfb\x6c\x56\x12\xb0\x41\x7e\xf8\x9d\x66\x7f\x11\x54\x71" - "\x85\x28\x7c\x52\x41\x37\xbe\x50\x5f\xaa\x0f\xa5\xc9\x41\xa4\x22" - "\x89\x78\x99\xe5\x24\xa0\x5c\x4e\xab\x8d\x1d\x41\x72\x93\x5f\x61" - "\x22\xd3\x4f\x6b\x25\x1d\x05\x6b\xaf\xc2\xc2\xa9\xe6\x51\x85\x81" - "\xa6\xcc\x58\x0f\xba\x49\xed\x81\x6d\x35\x15\x16\xaa\x68\x31\x1c" - "\x99\xb1\x23\xd0\x87\xae\x58\x0f\x75\x77\x04\x0c\xcb\x83\xba\xcb" - "\xd7\x93\xc0\xb2\x2b\x24\x88\x5e\x0a\x92\x83\xfe\xd5\xb8\x3f\x2a" - "\xc8\x48\x6d\x96\x7f\x11\x04\xe7\x14\x68\x13\x29\xd6\x6f\x84\xfa" - "\x7b\x82\x30\xc6\x05\xd8\x26\x01\x15\x50\xbf\x69\x43\x90\xc4\xf1" - "\xd2\xca\xd6\xf5\x7c\xbb\xcc\xe3\x7f\x13\x41\xdf\x84\x03\xdb\x05" - "\x32\xac\x40\x99\x4c\xf8\x4d\x24\xb6\x6d\xfb\x15\x32\x1e\xda\x19" - "\x08\x6d\x08\x82\x7a\x31\xb7\x8c\x7a\xe9\xb3\x4a\xc4\xa8\x55\xdb" - "\x4c\x3b\xf8\xb6\x7d\x07\x6d\xbb\x20\xb4\x0d\xeb\x42\xf9\x38\xba" - "\x6f\x1b\x9e\x71\x1b\x8e\xcd\xaf\x7d\x52\xaf\x0f\xc3\x7b\xb8\x97" - "\x36\xc5\x4a\xc4\xea\x57\x53\x1c\xe1\x25\xef\x4d\x32\x9a\x2a\x4f" - "\xb7\xcd\x7e\xfe\x0b\x8a\x31\xc4\xe7\xdf\x24\xe3\x1b\x60\x5c\xd7" - "\x77\x9e\x27\xd4\xf7\x74\xdb\xf1\xa0\x76\xa9\x75\x39\x7c\xfe\xed" - "\xc5\x6c\xda\xd8\x13\x88\xf1\xaf\xa2\x9a\x3c\x39\x4d\xed\x0e\x8c" - "\xd7\x7d\x78\xaa\x9b\x2c\x4b\xc5\xfb\xc4\x34\x55\xb5\x88\x78\xb5" - "\x78\xb4\xab\x33\x3f\xc7\x7b\x5a\x67\x83\xac\xef\x69\x9d\x9d\x49" - "\x3c\xbe\xd6\x13\x8f\x6f\x54\xc4\xe3\xdc\x1e\x02\x74\xd6\xc7\xb7" - "\xba\xf0\x37\x6e\x23\x1a\x23\xfd\x9a\x16\x86\x06\xe5\xca\x69\x67" - "\xf8\x38\x99\x4e\xbb\x1e\xef\xf1\x7c\xfd\x0d\xc8\xef\x5b\x98\x57" - "\x7d\xf0\x3b\xf2\x4b\x4c\x22\x37\x9d\xf3\xf8\xba\xcd\xc7\x70\x7d" - "\x98\xd1\xaf\x48\x67\xa4\x6a\xd2\xa3\xda\x1b\xd2\x55\x58\x18\xd1" - "\x83\xf1\xb9\x15\x68\x83\xce\x7e\xe9\x23\xcb\x22\x14\xf4\x4f\x69" - "\x00\xde\xe7\x54\x97\xc2\x81\xba\xe4\xf4\x38\x72\xe3\x68\xd4\x37" - "\x8e\x85\x0a\x56\xae\xc4\xf1\x90\xc7\x8f\x1b\xbd\xc7\x5d\xd1\x26" - "\x39\x21\x26\xb8\x3e\xf3\x2b\x32\x1a\xf7\xc5\x2d\x03\xba\x65\x26" - "\x2f\x1c\xc7\x6a\xed\xa2\x4f\xc8\xd9\x44\x22\xcf\xfc\x9e\x0c\x07" - "\x4c\x70\xe3\xd1\x0c\xe3\x31\xbc\xd9\xa7\x13\xec\x8a\x59\x73\x99" - "\xf8\xa0\x9d\xc2\x3d\x66\x1a\xda\x75\xc4\xfc\x5d\xd0\x88\x5d\x09" - "\xc4\xcf\xf8\x5d\xec\x48\xfd\x77\xb1\x37\xed\x34\x13\xbf\x11\x89" - "\x44\x59\x96\x00\x58\x5c\x0b\xe3\xf3\x02\x8c\xcf\x76\x36\x3e\x2d" - "\xf8\xa3\xb9\xc3\x53\xf0\xdd\x7f\x6e\x6c\xee\xe0\xc7\xe6\x06\xc0" - "\xdf\x7a\x01\x7f\xc6\xb5\x41\xf2\x32\x39\x25\xd0\x46\x90\xfb\x57" - "\x01\x15\x9a\xeb\xbd\x30\x46\x49\xef\x4c\x68\x04\x9b\x0f\x7d\xa5" - "\xc6\x03\xa0\x0b\xcf\x71\x72\x15\x2d\x2a\xd2\x7d\x18\xd1\x46\x84" - "\xb8\x49\xfb\xc2\xee\xb1\xf1\x3a\xd5\x5c\xfa\x5d\x8b\xc7\xd7\x3a" - "\x28\xf7\x52\xcd\xff\xb9\x12\xf4\xb8\x90\xc5\x59\xda\xd5\x18\x33" - "\xd5\x79\x7c\x7d\x10\x78\x11\x7c\x76\xe0\x23\xee\xbe\xdc\x37\x01" - "\x40\x4b\x4c\x20\x73\xa3\xdf\xf4\x54\xb3\x5f\x61\x96\xf6\x99\x6e" - "\xce\x5e\xf5\x80\x0e\xce\xc6\x13\xf9\xb2\x76\x90\x8d\x09\x64\xd3" - "\x11\xe4\x0d\x76\x2b\x02\xed\x16\xcd\x4f\x8e\x4f\xd7\x51\x73\x78" - "\x8c\x07\x05\xb9\x78\x61\x8c\x7c\x69\x22\xa1\x19\xe7\x41\x46\x86" - "\x26\x02\x7d\x1b\x01\xb6\x6d\x64\xd9\x7a\xe2\xb7\x0b\xe4\x33\xbc" - "\x1d\x7c\x9a\x82\x7f\xe8\xde\xd4\xd4\x7a\x9a\x00\xe7\x68\xc7\x7c" - "\x36\xcb\x6e\x00\x5d\x8d\xc8\xc1\x71\x0b\xe3\xd8\x67\x33\x67\x57" - "\x39\xdd\x1a\x37\x04\xdd\xd1\xb3\x21\x48\x05\xc7\x6d\x16\x5b\x67" - "\xb1\x33\x34\xf7\xab\x2c\xb4\x73\x0d\xa9\x3a\x62\x04\x59\x8e\xc0" - "\x39\x71\x43\xd0\x68\x4e\xa6\x4f\x83\x4c\x57\x11\xaf\x89\x9d\x44" - "\x06\xed\x52\x42\x9b\xc9\xc9\xd8\x16\xb4\xad\x01\x26\x18\x47\x28" - "\x67\xe0\x29\xa7\x80\x35\x73\xe1\xf4\xd4\x59\x71\x2a\x72\x3c\xe8" - "\x34\xc1\xfc\xb2\x99\x5d\xf4\x4b\xbc\x2f\xd8\x90\x6a\x24\xd4\xbf" - "\x08\x65\x08\x72\xfb\xba\xe6\xc3\x88\x4e\xe2\x18\xd3\xe7\x76\x0b" - "\x98\x3e\xb7\x5b\xc0\xf4\xb9\x4a\xee\x3e\xbc\x08\xd7\x5d\x95\x80" - "\x6b\x3f\x31\xae\xbf\x79\xe7\xaa\xe2\x7a\xb6\x74\x5c\xef\xbc\x20" - "\xc2\xb5\xe6\xbf\x83\xeb\x8f\xd4\x1c\xae\x3d\x7a\xc6\x72\x78\x3d" - "\xdc\x60\x7c\x1b\xfc\xdf\x73\x39\x16\xdc\x9e\xd8\x8b\xb8\xfd\xb6" - "\xf1\x5a\xc5\x6d\x57\x47\x90\x0a\x8e\x41\xc7\x2d\xf0\x74\x1a\xb7" - "\x1f\xa9\xbb\x89\x45\x7e\x88\x5f\x9a\x7f\xba\x4d\x95\x49\x1e\x04" - "\x3b\x01\x3e\xc3\x6d\xe4\x24\x27\xc3\x76\xb5\x6a\x3e\x35\x83\x8d" - "\xe0\x72\x8d\x74\x67\x53\x6a\xf6\xcb\x8b\xce\xfc\x98\x28\xcd\x85" - "\x4f\xe8\x1b\x8c\xfb\x89\x4f\x22\x51\xe0\xfd\x58\xea\x7b\x71\x0f" - "\xac\xc3\xb9\x7b\xb5\xe6\x1d\x9f\xa9\xf0\x7e\x26\xde\x43\x31\x15" - "\x55\x44\x9b\x77\x1c\xd2\x9a\x7d\x2f\x10\xba\xe3\x62\x08\xde\xc3" - "\xed\xc8\x6d\x57\x5b\xee\xe1\xdb\xf5\x8d\xfc\x2a\xa2\x61\xbc\xc0" - "\x9a\xea\xfc\xc7\xf0\x57\x0e\xed\xf8\x1e\xfe\x7a\xc0\x5f\x6e\x1f" - "\x63\x69\xf3\x5c\x3b\xdb\x6b\xa9\xb0\xc8\xc0\xdb\xc1\xed\xdc\x18" - "\xbc\x8b\x0c\x3f\xc7\x7f\x87\xf6\xb4\x59\x9e\x09\xe8\xa5\x17\xe4" - "\xb1\x05\xeb\x06\x99\x28\xd8\x73\x0a\xec\x37\x3e\x03\xc4\xf3\xe3" - "\x7e\x9b\x03\x35\x4d\x5a\x4d\x0b\x69\xf7\x38\x1f\xd9\x00\x73\xbf" - "\xb9\xb8\xc8\x80\xf7\xdc\x10\xf7\x96\x7a\x47\x80\xbe\xb5\x69\x1c" - "\x0d\x97\x8f\xd8\x5c\x98\xa3\xa5\xc5\xd3\xf5\xb8\x86\xec\xa0\xb1" - "\xbf\xe6\xff\xe2\xbd\x26\x0f\x16\x6f\x39\xbf\x9b\x82\xfc\x70\x5f" - "\xf8\xde\xe7\xa2\x70\xbf\xf6\x2c\x85\xea\xfd\x74\xc2\x3f\x0f\xc0" - "\xda\x8b\x7b\xba\xe3\x73\x47\x3f\xcf\x22\x59\x1d\x76\xf6\x74\x17" - "\x9e\x4f\x3a\x9f\x63\x2e\xca\xd1\x76\xe4\x9e\x6f\x06\x1f\xa0\x55" - "\xdc\x67\x7b\xba\x00\xfa\x4e\x47\xe7\xa4\xe9\xe1\x82\x9f\x23\x3e" - "\x33\x82\x4c\x54\x22\xaf\x68\x87\x7e\x75\xe0\xea\xc4\xf0\x3d\x26" - "\xad\xb9\x47\xed\x73\x3c\xfd\xbc\x44\x9f\xe8\x82\xc3\xfd\x5f\x4d" - "\x85\x79\x59\xc6\x3b\x81\xf7\xb8\xdb\x88\x69\xad\xfa\x51\xbc\x07" - "\x82\xbe\x5e\x46\x1c\x7b\x96\xad\x6e\x8f\x91\xa0\xdf\xf7\x46\x42" - "\xad\xbc\xbb\x47\x4d\x46\xe8\x89\x72\xb6\x21\x93\xe6\x5d\x20\x81" - "\x74\x83\xda\x27\xe7\x02\x99\xda\x73\x29\x60\xd8\x4b\x49\x44\xd1" - "\x0d\x36\xb9\x3b\x39\xd6\x07\x9f\x9b\x7b\xf7\x9c\x56\xde\x60\xac" - "\x41\x3f\x33\x10\xe7\x01\x6c\xbb\xe9\x92\x7a\xc4\xb6\x8b\x78\x9f" - "\xf8\x32\xd1\xae\x78\x15\xe6\x81\xef\x8e\x7b\x66\x80\xed\x03\xdb" - "\xc5\xcd\x07\x2e\xcc\x05\xdd\x30\x17\xcc\x52\xd3\xce\xfa\xa6\x4f" - "\xf0\xde\xb5\x32\x73\x1d\x19\x8e\xfc\xf1\x5e\x33\x37\x3f\xcc\x83" - "\xf9\x01\x7e\xc3\x5a\xa2\x77\x7e\x50\xcd\x26\x7d\xe6\x07\x5c\x87" - "\xd4\x37\xb7\x11\xc0\xf2\xf5\xb3\x0d\x3e\x9d\x1a\x03\x35\xe3\x9a" - "\xa4\xc1\x78\x1e\xf3\x1b\x8d\xb0\xcc\x15\x38\x4f\x74\xf3\xf3\x44" - "\x19\x3f\x4f\xbc\x32\x08\xf3\xc4\x2b\x38\x4f\x9c\x26\xf2\x9d\x38" - "\x47\xc0\xfc\xf0\x87\x7f\xeb\xe5\x3d\x30\x27\x48\xd3\xb3\xbe\xd2" - "\x21\x7e\x8a\x8b\x8e\x9a\x61\x2e\x46\x3d\x6f\x02\xfd\xa2\x9e\x1b" - "\x82\x40\xb7\x4d\xd7\x87\x75\x41\xb9\xb1\x38\x3d\x78\xcf\x59\xbd" - "\x9c\x16\x66\x45\x74\x01\x1e\xd2\x2e\x13\xb9\xd1\x2f\x2f\x6b\xff" - "\xfc\x7c\x39\xae\x5b\xcd\x45\xe9\x29\x6c\x8d\x7c\xc9\x1f\x63\x34" - "\x3e\x6d\x44\x89\xf1\x53\x13\x55\xfb\x98\xbf\x55\x0f\x37\xaf\x0e" - "\xf0\xea\xf9\x36\x60\xd8\x8b\xcf\x10\x85\x7e\x75\xac\x4f\xe6\x42" - "\xa2\x7c\xef\xb3\x7c\x79\xbd\x01\xc6\xf6\x75\x66\x58\xb7\xa7\x07" - "\x57\xb4\x90\x29\x15\x2b\xc8\xe4\xf2\xb3\x44\x55\xbe\x8a\x8c\xdf" - "\x75\x16\x30\xb4\x5a\x3d\xa2\x87\xc3\x47\x97\x96\x7b\x2e\x60\x15" - "\x09\xa1\xa3\x32\x83\xe1\xef\x94\xfc\x55\xb0\x9e\x19\x95\x1e\x4c" - "\xfd\xf3\xb2\xcc\x40\x97\x03\x6b\x37\xf0\xd1\xa1\x0d\xdf\x9b\xec" - "\xe1\x66\x97\x44\x1f\x62\x56\x04\xe0\xa6\x11\x70\xf3\xbd\x35\x6e" - "\x70\xdd\xca\x61\x67\x16\xc3\x0e\xde\xf3\xab\x10\xfb\x17\x2b\x3e" - "\x74\x19\x3f\xa5\xe0\x3f\x77\xd9\xe0\xa7\xf4\x82\x7b\xf8\xe9\x01" - "\xfc\x94\x66\x03\x7e\x4e\x12\x79\x89\xd9\x1d\xfc\x5c\xd4\x71\x73" - "\x44\x55\x7c\x13\x7b\x86\xe9\xfb\x69\xa8\x67\x9d\xc7\xf7\x53\xe7" - "\x05\xc9\x88\x8b\xb8\xaa\x1e\x00\x57\x06\x86\xab\xcb\x6b\x5c\xc0" - "\x55\x21\xe0\xaa\xba\x7f\x5c\x5d\x76\x84\xab\xea\xbe\xb8\x32\xcc" - "\x1b\x5a\x5c\x71\xf9\x44\xff\x07\x70\x75\x79\x8a\x35\xae\x2e\x15" - "\x31\x5c\x5d\x2a\x74\x1d\x57\x19\x03\xd8\xab\x0c\xde\x5e\x75\x1c" - "\x77\x01\x57\xed\x14\xf8\xf7\x8f\xab\xf3\x0e\x70\x95\x61\xc7\x5e" - "\x5d\xd9\x3f\xb4\xb8\xe2\xf2\x9d\xfe\x0f\xe0\xaa\x23\xdf\x1a\x57" - "\x97\xcf\x33\x5c\x5d\x6e\x77\x03\x57\x03\xd8\xab\x0c\xde\x5e\x75" - "\xdf\x2a\x1d\x57\x34\x14\x70\x35\x80\xbd\x3a\xe3\x08\x57\x76\xec" - "\x55\x97\xe7\xd0\xe2\x8a\xcb\xc7\xfa\x3f\x80\xab\xae\x36\x6b\x5c" - "\x75\xce\x60\xb8\xea\x0c\x75\x1d\x57\x9a\x01\xec\x95\x86\xb7\x57" - "\xc6\x75\x2e\xe0\xaa\x94\x02\xff\xfe\x71\x75\xc4\x01\xae\x34\x76" - "\xec\x55\xcf\x92\xa1\xc5\x15\x97\x2f\xf6\x7f\x00\x57\xc6\x10\x6b" - "\x5c\x75\x97\x31\x5c\x75\x97\xba\x81\xab\x01\xec\x95\x86\xb7\x57" - "\xe6\x93\x2e\xe0\xca\x00\xb8\x1a\xc0\x5e\x65\x38\xc2\x95\x1d\x7b" - "\x65\x3a\x34\xb4\xb8\xe2\xf2\xd9\xfe\x0f\xe0\xca\x5c\x62\x8d\x2b" - "\xe3\x65\x86\x2b\xa3\xc1\x29\x5c\x75\x8a\x70\xd5\x7c\x7d\x58\x77" - "\x26\x5b\x0f\xbe\xb1\x8a\xc7\xd5\xeb\xab\x13\x37\xad\x23\xf2\xfd" - "\x8b\x4a\xac\xd7\x82\x0a\xd9\xcd\xb6\x98\x02\x5c\x70\x98\x32\xae" - "\x06\x4c\x9d\x63\x98\xd2\x9c\x01\x4c\xfd\xb3\x44\xde\x90\x7a\x1e" - "\x71\xc2\x61\xa8\x74\x15\x60\x08\xd7\x85\x32\x45\x80\x94\x35\xe0" - "\x4b\xe7\x78\x2c\x29\x88\x6c\x50\xb0\x14\x09\x58\x3a\x65\x8b\xa5" - "\xe3\x02\x96\xe6\x38\x58\x03\x2e\x75\x80\x25\xdd\xc0\x58\xda\x85" - "\x31\x84\xb5\x57\x09\x4b\x1f\x0b\x31\x84\x7d\x2b\xf4\x72\xa3\xbf" - "\x44\x2c\x29\x48\xab\x35\x96\xe8\x63\x0c\x4b\x34\xcc\x75\x2c\x65" - "\x54\x3b\xc6\x12\xef\x4f\x29\x3c\x56\xba\x87\x25\xf0\xad\xac\xb0" - "\x34\xb0\x1f\x25\x60\x49\x3e\x6b\x68\xb1\x64\xe3\x47\xfd\x60\xb1" - "\xe4\x11\x6c\x85\x25\x85\x8c\xad\xfb\x14\x32\x87\xeb\x3e\x33\xcc" - "\x5d\x78\xcf\x09\xdf\x0d\x36\x5d\x52\x3f\x6a\x82\x39\x0d\xdf\x11" - "\xc6\xfb\x14\x07\x12\x1a\xe5\x88\xa7\xdc\x8b\x24\x30\x27\x89\x4c" - "\xf5\xe9\x64\x58\x31\x02\x56\xb6\x5e\x24\x8a\x9e\x1e\xc0\x49\x37" - "\x51\x74\x81\xbc\xbb\x7a\x62\x7d\xea\xa2\xdb\xc8\x7b\x17\x1a\x61" - "\x2e\xab\x21\xe5\x70\x4d\x0f\x1f\x87\x34\x6f\x52\x8f\xd8\x96\x86" - "\x71\xc8\x93\x44\xbb\xe8\x15\xd0\xbf\xc2\x6d\xfd\x77\x3d\xe7\x48" - "\xff\x47\xac\x74\x5f\x2a\xd2\x3b\xf7\x5e\x81\x8b\xf3\x11\x77\x9f" - "\x2a\x81\xe9\xde\xa2\xf7\x9d\x83\xa0\xf7\x9d\xbc\xde\xdd\x9a\x8f" - "\x14\x9e\x8e\x9f\x7f\x14\xd9\x0a\xee\x99\x82\x4e\x66\x23\x2c\x76" - "\x01\x6d\x04\xfa\x2f\x5d\x7e\xe9\x93\x6d\xe7\x1b\xb4\x0f\x17\x14" - "\xd7\x17\xe1\xdc\xe4\xd0\x8f\xe1\xed\x44\xe6\x46\x66\x27\x38\x3f" - "\x66\x18\x99\x39\xa8\xf1\x47\xc5\x75\x19\x57\xcf\x5e\x1c\x19\x78" - "\xee\x71\xc3\x8f\x41\xdc\x94\xda\xe0\xe6\x6a\xd8\x0b\xd7\x70\x73" - "\x7d\xb4\xb5\xbd\xf0\x3c\xc2\xec\x85\xe7\x61\x67\xe6\x9e\x01\xf0" - "\x74\x50\x84\x27\x83\x80\xa7\x1b\xbe\xc2\x18\xa5\x44\x3c\x55\x0e" - "\x6a\xdc\x51\xe1\x75\x72\x68\xf1\x34\x78\x71\xc7\x6b\x1b\x4f\x37" - "\x54\x5b\xe3\xc9\x6b\x38\xc3\x93\x97\xb7\xfb\x78\xca\x10\xd9\xa7" - "\x0c\x91\x7d\xf2\xbe\x0f\x63\x93\x12\xf1\x64\x18\xd4\x78\xa3\xe2" - "\xc6\x5b\x87\x16\x4f\x83\x17\x6f\xbc\xb6\xf1\xe4\x4d\xac\xf1\x34" - "\x6c\x09\xc3\xd3\xb0\xa8\x41\xc0\xd3\x41\x5b\x9f\x98\xe1\x69\xc4" - "\xf3\xe8\x3f\x4b\xc3\x93\x2c\x6c\x50\xe3\x8c\x8a\xe1\x6b\x86\x16" - "\x4f\x83\x17\x67\xbc\xb6\xf1\x34\x22\xc2\x1a\x4f\xde\xfb\x19\x9e" - "\xbc\xf7\xb9\x8f\x27\x8d\xc8\x3e\x69\x44\xf6\x49\x79\x1a\x63\x91" - "\x12\xf1\x34\xb8\xf1\x45\x85\xcf\x91\xa1\xc5\xd3\xe0\xc5\x17\xaf" - "\x6d\x3c\x29\x2b\xad\xf1\x34\xc2\xc4\xf0\x34\xc2\x38\x08\x78\x12" - "\xd9\x27\x8d\xc8\x3e\xdd\x34\x16\x63\x90\x12\xf1\xa4\x1f\xd4\xb8" - "\xa2\x62\xe4\xf0\xa1\xc5\xd3\xe0\xc5\x15\xaf\x6d\x3c\x8d\xd4\x5b" - "\xe3\xc9\x77\x16\xc3\x93\xef\x4c\x67\x63\x41\x96\x18\x90\x18\x4f" - "\x8e\xd7\x76\xfe\x71\xb6\x6b\x3b\x49\x31\x20\x5c\xe7\xb9\x1c\x4f" - "\xf4\x9b\xf3\xff\x6b\x3c\x11\x31\x64\x89\x03\x5d\x7b\x31\x20\xff" - "\xc9\xd6\x18\xba\x69\x27\xc3\xd0\x4d\x25\x8e\x30\x64\x14\x3f\x93" - "\xf6\xb5\xe8\x99\xb4\xf3\x44\xbe\x3f\x41\x2b\xaf\xe7\x9f\x49\xc3" - "\xe7\xd1\xea\x5b\xdb\xc8\xb6\x2b\x44\x39\x22\x96\x28\x67\x27\x66" - "\xd2\x3c\xb4\x21\xc9\x6a\x9f\x97\xce\x92\xa9\x3d\x80\x99\xdc\x73" - "\xfc\x73\x69\x80\x9b\x8f\x9a\x3b\xc9\xbb\x09\xf8\x5c\x5a\x35\xa9" - "\x00\x3a\x63\x21\x8b\x07\xa1\x1d\xe1\x9e\x49\x5b\xf5\x2a\xe0\x60" - "\xd4\x42\xbb\xcf\xa4\x65\x4b\x7c\x26\x2d\x05\x70\x60\x00\x1c\x5c" - "\x46\x0c\x1c\xb2\x7a\x16\x6d\x57\xb6\x28\x06\xb4\xc2\x41\x0c\xa8" - "\xc9\xb9\x7b\x12\x83\xfe\x2c\xda\x77\xa2\x67\xd1\x2c\x31\xa0\x45" - "\x60\x3b\x24\xeb\xfd\x27\x0e\xf7\x3f\x40\x1b\x61\x02\x9b\x30\x1b" - "\x9f\x2d\x37\x08\xf1\xe2\xf4\x38\x7c\xf7\x37\x3d\xd8\x08\xb6\x02" - "\x9f\x1f\x7f\x73\x45\x2d\x17\xef\x6b\x48\x6d\x22\xdb\xba\x89\xd2" - "\x47\xcf\xdb\x05\xff\xf4\x94\x1e\xb0\x0d\x26\x98\x97\x40\xd7\xc3" - "\x7b\x92\xc1\x36\x5c\x04\xdb\x90\x0c\xb6\xe1\x32\xd8\x86\x96\x5a" - "\xce\x36\xd0\x17\xcc\x53\x31\x2f\x78\xc5\x39\x32\xb9\xec\x1c\x99" - "\x82\x36\xc0\x54\x94\x97\xd5\xe3\x9f\x1e\xa9\xf7\x4f\x57\xc3\xb9" - "\x58\x86\x81\x2e\x6d\x4e\x12\xe1\x6c\x3d\xea\x5e\xb5\x0a\xed\x41" - "\xc0\xf2\x9e\x6c\x42\xdc\xc1\x41\x8f\x38\x26\x28\xc6\x81\x03\x1b" - "\xe0\x36\x16\x6c\xe2\xc0\xbb\xdc\xb4\x01\x88\x85\x5d\x16\x1b\xe0" - "\x16\x16\x6e\x76\xf8\xfe\xcf\x00\x58\xa8\x76\x02\x0b\x06\x27\xb1" - "\x50\x88\xf9\xb4\xed\x60\xe1\x14\x60\xa1\x09\xce\xb5\x31\x2c\x5c" - "\xb6\x83\x85\x5b\xd6\x5c\x7d\x2c\x58\xc7\x64\x7e\xb8\x58\xf8\x69" - "\xa8\x6b\x58\xc8\x70\xc2\x2e\x64\x38\x6b\x17\xda\x31\x0f\x75\x5f" - "\x2c\x64\x80\x5d\xc8\x00\xbb\x90\xc1\xdb\x85\xf3\x76\xb0\x30\x7a" - "\xe3\xd5\xc7\x82\x75\x3c\xe5\x87\x8b\x85\x5b\x1d\xe7\xbf\xe8\x1f" - "\x0b\x4e\xd8\x85\x0c\x27\xed\x02\x0d\xc5\xfc\xcd\x76\xb0\x00\x76" - "\x21\x03\xec\x42\x06\x6f\x17\xce\xd8\xc1\xc2\x6d\xcf\x5f\x7d\x2c" - "\x58\xc7\x42\x7e\xb8\x58\xb8\xdd\xe1\xfe\x5f\xfd\x63\x41\xe3\x84" - "\x5d\xd0\x38\x69\x17\x68\x29\xe6\x3d\xee\x8b\x05\x0d\xd8\x05\x0d" - "\xd8\x05\x0d\x6f\x17\x8e\xd8\xc1\x82\x6a\xc7\xd5\xc7\x82\x75\x1c" - "\xe3\x87\x8b\x85\x31\xb1\x2e\x62\xc1\x09\xbb\xa0\x71\xd6\x2e\x18" - "\x30\x5f\xb0\x1d\x2c\x80\x5d\xd0\x80\x5d\xd0\xf0\x76\x21\xc3\x0e" - "\x16\xee\x28\xbb\xfa\x58\xb0\x8e\x41\xfc\x70\xb1\xf0\xb3\x94\x7e" - "\xb1\x40\xfb\x62\x01\x63\x08\xb8\x7e\xc4\x7c\xdc\x1c\x16\x9e\xd1" - "\xca\xbb\x29\x62\xa1\x96\xbc\x98\x26\xc2\x42\x11\x5b\x47\x58\x70" - "\xb0\x5d\x8c\x03\x7c\x7f\x09\x71\x00\xeb\x07\x23\xe8\x9d\x16\x67" - "\x06\x73\xcf\x2b\x15\xa5\xc7\xe2\xfa\x01\xe3\x0c\xb8\x86\x70\xbc" - "\x7e\x08\xdc\x3d\x28\x18\x88\x07\x0c\xb4\xdb\x5f\x47\x0e\xfa\xfa" - "\xe1\xbb\xab\x84\x01\x58\x4b\xbe\xa2\x71\x07\x03\x63\x1d\xee\xff" - "\xe1\x18\x03\xe0\x23\x38\x85\x01\xe6\x27\xf4\x8f\x81\x8c\x46\x01" - "\x03\xe0\x2f\x14\x65\xb4\xa1\x7f\xc0\x30\x90\xd1\xe4\xd8\x3f\xb8" - "\xf3\xb5\xab\x8f\x81\x41\xf6\x0f\xae\x59\x0c\xfc\x3c\xdd\xe1\x3b" - "\x8c\x68\xcb\xc1\xee\xcf\x1e\x77\x1b\xa1\xab\xd5\x8f\xe6\x9e\x23" - "\x81\x2f\x3d\x43\xa6\x62\xde\x98\xfd\xdd\x9d\x72\x4d\x22\xfd\x1a" - "\xdf\xad\x36\x42\x3f\x30\x5f\x28\x87\x8f\xef\x02\xbc\x1a\x62\xf5" - "\x64\x1b\x60\xe1\x25\xe8\x03\xe6\xae\x1f\x91\x78\x7d\x58\xbd\xe1" - "\x43\xd2\x7d\x49\x4d\xea\xa2\xcf\x91\xf0\x20\xda\xd3\xd0\xac\xc5" - "\x77\x18\x15\xda\xf5\x1f\xe2\x7b\xe2\xc3\x96\xa5\x12\xf9\x05\x45" - "\x50\x08\xc6\x94\x26\xa6\x12\x65\xe9\x39\x16\x47\xda\x76\x81\x90" - "\xe3\x80\x52\xa6\xf7\xa0\x32\xcf\x8d\x83\x10\x43\x8a\x02\xbd\x37" - "\x5b\xf4\x7e\xdc\x3a\x86\x24\x77\xe2\x7d\x46\x27\x62\x87\x57\xe5" - "\x7d\xc6\xef\xfa\xbe\xcf\xe8\x5a\xec\x70\x5c\x62\xbf\xcf\x11\xf1" - "\x7e\xc0\xa6\x14\x6e\xdc\x73\x7a\xed\x01\xdb\xdf\x90\x5a\xc3\x3d" - "\x1f\x8d\xe3\x1c\xc7\x3c\xe2\x23\x13\xfa\x8b\x18\x41\x3c\xcc\xde" - "\xd3\xd3\xb3\xd4\x40\xe4\x66\xff\xf4\x14\xc4\x84\x79\x6d\x80\x57" - "\x0e\xf4\xa9\x21\xba\x05\xf4\x7e\x91\x34\xb4\xf2\x3a\x4f\x6b\x01" - "\x5d\xde\x35\x9e\xae\x0d\x1a\x36\xc1\x40\x94\x99\x9f\x13\xe5\x32" - "\x7c\xe7\x18\xe6\x81\x5d\xe0\x13\x54\x3c\x43\x26\xc3\x7c\x10\xd1" - "\xc3\xdb\x06\xb3\x25\xae\x84\x73\x04\x60\xe2\xa5\x04\xc0\x04\xcc" - "\x5e\xaa\xa5\x88\x89\xbb\xde\xf2\x5c\x67\x27\xbe\x2c\x01\x13\x5c" - "\x7c\x39\x06\x30\xd1\x2a\x60\xa2\x37\xae\xec\x60\x4e\xd0\x2e\x72" - "\xe3\xd9\x42\x3b\xf6\xc0\xed\xb8\xf2\x77\x7c\x5c\x59\x64\x0f\x5c" - "\xc3\xc6\x2f\x1c\xe7\xc4\x74\x8c\x8d\xea\x81\xb1\xd1\x61\xc1\x86" - "\x61\x60\x6c\x8c\x0f\xb3\x83\x8d\x42\x11\x36\x1a\x45\xd8\x60\x71" - "\xa6\xa2\xf4\xb6\xbe\xd8\x18\x7f\x72\x68\xb0\x61\xf3\xdc\xcf\x0f" - "\x16\x1b\x77\xef\x91\x8e\x8d\x0c\x27\xec\xc6\x77\x3c\x36\x32\x9c" - "\xb0\x1b\x13\x62\xec\x60\xa3\x5d\xc0\x46\x86\xc8\x6e\xf0\x71\xa7" - "\xa2\x0c\x3b\x76\x63\xc2\x37\x43\x83\x0d\x9b\x67\x78\x7e\xb0\xd8" - "\x98\x78\xcc\x05\x6c\x38\x61\x37\xbe\xb0\x60\xc3\x09\xbb\x11\x9c" - "\xd5\x17\x1b\x34\x54\x84\x0d\x91\xdd\xe0\xe3\x50\xe8\x73\xf6\xc1" - "\xc6\x24\xcf\xa1\xc1\x86\xcd\xf3\x38\x3f\x58\x6c\x4c\xd2\x49\xc7" - "\x86\xc6\x09\xbb\xf1\x1e\x8f\x0d\x8d\x13\x76\xe3\x9e\x52\x3b\xd8" - "\x28\x15\xb0\xa1\x11\xd9\x0d\x3e\x2e\x55\xa4\xb1\x63\x37\xee\x1d" - "\x33\x34\xd8\xb0\x79\xb6\xe6\x07\x8b\x8d\x7b\x1d\xee\x7f\xdd\x0f" - "\x36\x9c\xb0\x1b\x99\x16\x6c\x38\x61\x37\x26\xd7\xd8\xc1\x86\x41" - "\x84\x0d\x91\xdd\xe0\xe3\x54\x45\x1a\x3b\x76\xe3\xbe\x69\x43\x83" - "\x0d\x9b\xe7\x64\x7e\xb0\xd8\xb8\x3f\xc0\x19\x6c\xa4\x1b\xec\xac" - "\x53\x5a\x19\x36\x7a\x80\x46\x8c\x0b\xf1\xda\x04\xfa\xa7\x08\x87" - "\x35\x0b\x62\x62\x49\x3a\x91\x73\xb8\x30\x88\x71\x71\x7f\x23\xe2" - "\xe2\xee\x58\xc0\xc5\x57\x3c\x2e\x2c\xeb\x12\x2e\xf7\x0a\x5b\x9b" - "\x58\x62\x56\x96\xf5\xc9\x8b\xb8\x66\x8d\xb5\x60\xe2\x97\x73\x3c" - "\xe3\x06\x01\x13\x56\xcf\x3d\x88\x30\xb1\xd0\xc1\xfa\x64\xbe\xeb" - "\x98\x78\x05\xd6\xae\x3d\x83\xfd\xee\x93\x05\x13\x9f\xbb\x8b\x89" - "\x29\xfd\x3e\xff\x60\x1f\x13\xbc\x9f\xe1\x10\x13\x82\x6f\xc1\x30" - "\xf1\x45\x3f\x98\x98\xd2\xda\x17\x13\xbc\x5f\xc1\xe5\x21\x60\xbe" - "\x85\x25\x86\x65\xf1\x2f\xac\x31\xf1\xc0\xca\xa1\xc1\x84\x8d\x7f" - "\xf1\x83\xc5\xc4\xaf\x42\x1c\x61\x22\x5f\x6e\xae\x86\xa3\x06\x0e" - "\x2d\x1c\xb5\x26\x39\x99\x51\x26\x37\x73\xf9\xc9\xf9\x31\x63\x7b" - "\xfe\x3a\xfa\xc2\xe3\x91\x48\x43\x37\x2b\xb8\x1c\x64\x16\x1e\xa6" - "\x61\x04\xf3\x21\x6a\x7d\x64\xd1\xa8\x13\xa4\xbd\xde\xc2\xcb\x67" - "\x33\x09\x81\xfe\x33\x3a\x39\xc9\x62\x74\x21\xd7\x21\x1d\xcd\xbd" - "\xe0\x07\x65\x5e\x3c\x4f\x2e\xc7\xaf\x49\x2e\x47\x5e\xb6\x75\xdf" - "\xc0\xd3\xa8\x4c\xd9\x44\x25\xae\x1b\x78\x61\x9d\x16\xba\x61\x48" - "\x67\xba\xee\xf6\x50\x93\x4c\x11\x28\xa6\xa3\x0f\x13\x31\xdd\x8d" - "\x3c\xbf\x20\xab\x7e\xdc\x41\x88\x8f\x4c\xc5\xfa\x92\x2a\xb7\xf4" - "\xc5\x9b\xe3\x39\xa2\x3d\x1e\x78\x8e\xb7\xe2\x79\x1d\x21\xc3\x81" - "\x1e\xf9\x0e\x8f\xe5\xda\x8d\xf4\xc3\xe9\x30\x8f\x10\x8e\xbf\x4c" - "\x11\x6c\x96\x93\x60\xd6\x2f\xa2\x28\xeb\x6d\xb3\x8a\xe4\x5b\xd7" - "\x31\xc2\x22\x2f\x31\x1d\xd2\x50\x79\x2f\x8d\x0f\xd7\x8e\x61\x72" - "\xec\xdb\x14\x71\x3b\x18\x1d\x99\xc4\xd3\x29\xa1\x5f\x53\x7b\x75" - "\x59\x18\x1a\x64\xa1\x03\xfc\xde\x0c\xba\xd0\x36\xc0\x78\xe3\xe5" - "\xe0\x0b\x3a\xd8\xc3\xcb\x22\x44\xcc\x73\xb8\x4c\xa6\x2b\xe3\xe5" - "\x65\xce\xbd\x10\x05\xb4\x23\xcd\x9b\x15\xa1\xbd\x7c\xb3\x95\xc4" - "\xa2\x57\x9a\x6d\xbc\x89\xe3\xdb\x06\xe3\x4c\x2e\x53\xf1\x72\xb8" - "\x09\x69\xe1\x9a\x30\xd6\x2f\x65\xaf\x5e\x4d\x72\x05\x9e\xd3\x8a" - "\x68\xfd\x98\x8c\xcd\x9d\xd0\xb7\x99\x7d\xe9\xbd\x6c\xe9\xfd\x19" - "\xbd\xbe\x0d\xe8\x23\xfa\xd2\x2b\x6d\xe9\x47\x31\xfa\x4b\x21\x40" - "\x1f\xd9\x97\xde\x38\xd2\x86\xfe\x27\x8c\xfe\x72\x09\xd0\xab\xfb" - "\xd2\xab\x6c\xe9\x03\x38\xfa\x91\x32\xd4\x4d\x54\x5f\xfa\x10\x5b" - "\xfa\x9b\x19\xff\x0e\x3d\xd0\x47\xf7\xa5\xcf\xb2\xa5\xbf\x85\xd1" - "\x77\x87\x01\x7d\x8c\x2d\x7d\x05\x47\x4b\xee\xe0\x69\x7f\xca\x68" - "\x8d\x95\x40\x1b\x6b\xa7\xaf\x1e\x3c\xef\x60\x9e\x7e\x34\xa3\xff" - "\x8e\x00\x7d\xbc\x1d\x5d\xd9\xd2\xdf\xca\xfa\x7a\x53\x04\xd0\x27" - "\xda\xd1\x95\x2d\xfd\x6d\x8c\xde\x33\x11\xe8\x53\xec\xe8\xca\x96" - "\xfe\x76\x46\x7f\xbd\x16\xe8\x53\xed\xc8\xde\x9a\x7e\xe4\x30\x25" - "\xd0\xa5\x97\x65\x5b\xc6\x8f\x95\xdc\x6d\x79\x8f\x61\xbc\xbd\xa3" - "\xe1\x9a\x2c\x3b\x72\xb7\xa5\xbf\x83\xd1\x8f\xa8\x06\xfa\x2d\x7d" - "\xe9\x89\x8c\xd1\x93\x7b\x78\xfa\x9f\x31\x7a\x5f\x94\xe5\x56\x3b" - "\xb2\xc7\xf3\x5a\x7e\x9c\x06\x32\x5a\x8f\x7c\xa0\xcd\xb1\x23\x77" - "\x31\xed\x58\x46\xfb\xb3\xc3\x40\x9b\x6f\x47\xe6\x62\xda\x3b\x19" - "\xed\x4f\x52\x80\xb6\xd0\x8e\xbc\xc5\xb4\x3f\x67\xb4\x37\x67\x01" - "\x6d\x89\x9d\xf6\xde\x21\xa2\x0d\x62\xb4\x3f\xcd\x01\xda\x52\x3b" - "\x7a\x11\xd3\x8e\x63\xb4\x63\x51\x87\x95\x76\xf4\x22\xa6\xbd\x8b" - "\xd1\xde\x8a\x63\xad\xca\x8e\x4e\xc4\xb4\xbf\xa0\x23\x6f\xaf\xe2" - "\x6d\xeb\x1e\x5b\x5a\xc0\x80\x16\xec\x50\x2d\xd8\xc2\xf1\xb4\x60" - "\x4c\x75\x05\xb3\x6b\xfb\x90\xce\x42\x43\xe5\xc6\x7b\x45\xf3\xc0" - "\xdd\xb4\xc0\xbf\x90\xb7\x7f\xd5\xb6\xfc\xa8\x5c\x21\xa6\x9d\x40" - "\x0b\xee\x8f\xe6\x69\x0f\xf6\xa5\xf5\x12\xd3\x4e\xa4\x05\xe3\x6a" - "\x78\xda\x9a\xbe\xb4\xca\x5e\x5a\x5a\xf0\x8b\x53\x40\x73\xb8\x9c" - "\xb7\xab\xa2\x76\xde\x23\xe2\x37\x89\x16\xdc\xad\xe7\xf9\x69\xfb" - "\xf2\x53\x89\x69\xef\xa1\x05\x53\x52\x78\xda\x63\x7d\x69\x43\xc4" - "\xb4\xf7\xd2\x82\x60\x6f\x9e\xb6\xb6\x2f\x6d\x96\x98\x76\x32\x2d" - "\xb8\x27\x88\xa7\xad\xb3\xa5\x2d\x67\x73\x90\x9c\xd7\xd3\x7d\xb4" - "\x60\x72\x28\x4f\xdb\x68\x35\xc7\xca\x65\xdc\x18\x2b\x67\x74\xf7" - "\xd3\x91\x3f\x3f\xc6\xeb\xf3\x94\xd5\xdc\x9a\x2d\x1b\x89\x73\x4a" - "\x19\xea\xf3\x85\xb9\x3a\xa0\xfd\x25\xcf\xaf\xc9\x76\xee\xe3\xdb" - "\x37\x05\xce\x35\x5b\xe6\x27\x98\x77\x74\xf6\xfc\x9e\xc4\xbb\xc8" - "\x8d\xe7\x14\xd3\x6b\xd9\xdc\xc8\xef\x53\xac\x98\xc1\xfd\x36\x57" - "\xc5\x2b\xc3\x0d\xd4\x28\x2e\xcb\x93\xd3\xc6\x89\x06\xa2\xc0\x9c" - "\xde\xd4\xbf\xa8\x46\x07\xe5\xfa\xb1\xf1\xba\x8e\x82\xe9\xa7\x74" - "\x32\x13\xb7\x27\x1e\x7c\xd7\xe9\xc8\xeb\x75\xf8\x3d\x2f\x1b\xf7" - "\x49\x0c\x91\x99\x8a\xa7\xeb\x71\x5f\xc5\x0a\xf8\x9d\x0b\x07\xb7" - "\x87\x21\xf8\x98\xf4\x05\x12\xa2\x5d\x6f\x24\x67\x53\x89\x9c\xdb" - "\xb3\x5b\x11\x7a\x37\x5d\x1b\x3b\x15\xda\x12\x02\xf5\xc6\xb4\xc0" - "\x6f\xae\x2d\xb8\x87\x69\x61\xa8\xb7\x36\xa9\x1b\x69\x36\xeb\xfd" - "\x2b\x42\xe8\x73\x8b\xbf\x49\xd4\x90\xdb\xcf\x29\x42\x39\xdb\x85" - "\x79\x6f\xcd\xfe\xa1\xde\x5c\xbe\xdb\xef\x62\x7f\xcd\xe5\xba\x55" - "\xcc\xd8\x89\x39\x6e\x31\xd7\xad\x25\xcf\x2d\xab\x67\xc6\x96\x4b" - "\x60\xaf\x68\xe5\x5e\x1d\x97\x47\x57\x11\x7a\x9a\xeb\x5f\x36\x6d" - "\xa4\x81\xab\x3b\xcd\xdd\x5b\xb2\x70\x8f\x6d\xad\xe6\x1c\x69\xe1" - "\xcf\x21\x7f\x9e\xe7\x3c\x5b\x9e\x78\x9d\x7e\xcc\x5e\x1d\x7d\x6d" - "\x75\xa7\x29\x3f\xb9\xd1\xac\x4c\xae\xa3\xf9\x1a\x5d\x43\xbc\x8e" - "\x70\x7d\x55\xcc\x38\x41\x47\x2c\x6c\x30\xe7\x27\x1f\x84\xf2\xc6" - "\x06\x43\x37\x57\xde\xa2\x98\xa1\x42\xbf\xf9\x92\x32\xad\x99\xe6" - "\xa7\xe9\xb4\xb7\x74\x93\x56\xc5\x0c\xce\xaf\xc2\x72\xba\x43\xa3" - "\x43\x19\x9b\x77\x68\x1a\x3d\x02\x88\xe2\x92\x6f\x5a\x73\x47\xc1" - "\x8c\x10\xcb\x7e\x76\x96\xba\x90\xaf\x8e\xe7\xe5\x74\xce\x5e\x45" - "\x68\x2d\x97\xb3\xb7\x60\x46\xbe\x4e\xf6\x18\xb7\x3f\x9f\xce\x22" - "\x4b\xe7\x79\xa4\x20\x0f\xfb\xfb\x9a\x10\x1f\x5a\x14\x1a\x04\xfc" - "\xf5\xe0\x7b\x67\x31\x6c\xcc\x30\xea\x64\x53\x73\xd8\xf7\x47\xbc" - "\x74\xb2\x07\x0d\xfc\x77\x3f\x9d\x4c\xbf\x85\xff\xae\xb2\xe4\x4d" - "\xb6\x9f\xc7\x79\xba\x11\xb0\xe0\x67\xde\xa5\xf6\xc2\x75\x03\xd7" - "\x1e\xff\xe9\x46\xd5\x6d\x44\x76\x56\xf1\x48\x15\xd4\xe9\xc7\xf4" - "\xf4\x48\x06\xfc\xf5\xe1\xff\xea\xf9\xbf\x14\x69\x38\xbc\xfb\x15" - "\x77\x82\x2e\x9a\x98\x7e\x1e\xe1\xf6\x81\xe6\x70\x05\xd8\xa3\xbe" - "\x9a\x26\x8e\x6f\x51\x85\xd5\xde\x37\xc1\x93\xee\xb9\x77\xf2\x7d" - "\xf7\xff\x72\xca\x03\xcb\x57\x3c\x15\xb3\x72\xd5\xd3\xb1\x71\xcf" - "\xac\x8e\x5f\x93\xb0\x36\xf1\xd9\xa4\xe4\x94\x75\xeb\x37\xa4\x6e" - "\x4c\x03\x3e\xbd\xfb\x7f\xd3\x5d\xa1\x32\x83\x9c\x80\xae\x1f\x86" - "\x3a\x1e\xe5\xf6\x79\xc2\x32\x86\xb9\x47\x0c\x0a\x95\xfd\xf5\x48" - "\x43\x00\xac\x01\xc1\xff\x6e\x57\x3c\x3a\x07\xf7\x6d\x04\xfc\xcb" - "\x1a\x4a\x1f\xd5\xe2\x9e\xd5\xad\x8a\x47\x43\xeb\xf5\x8f\x6a\x71" - "\x8f\xf5\xa3\x01\x6d\x24\xf0\x0e\x22\x3b\xa7\x78\x34\x18\xcf\x57" - "\xdc\x49\xc8\x31\xb8\xd6\x1e\xcf\x3b\x94\x24\xe0\xe5\x51\x54\x5f" - "\x38\x8a\xb6\x23\xff\xc2\x62\xda\xa6\xdf\x14\x4b\x72\xe1\x37\x8c" - "\x09\xe5\x59\x45\x98\xe7\x51\x58\x75\x98\xb3\xc9\xe8\xf2\x62\xda" - "\xba\x65\x14\x6d\x7d\xae\x98\xb6\x57\x8c\xa2\xba\xc0\x42\xe2\xdd" - "\x51\xf0\x28\x8c\xf7\x47\x95\xdc\xb8\x86\xf3\xe6\x91\x8f\x54\xe7" - "\xc1\xb9\x89\x46\xe2\x51\x01\xbf\xa1\xcc\x70\x54\xc5\xda\x7d\xe0" - "\x62\xa7\x27\xf4\xb7\x94\xf6\xc4\xcb\x72\xa1\x1e\xa6\x8f\xb0\x71" - "\xc7\xc0\x83\x81\xfa\xf4\x0d\x9d\x2d\x44\xa7\x08\xc3\x7d\x43\xb0" - "\x3e\x9f\x86\x92\x76\x82\xfc\xde\x4c\xea\xf4\x4c\xbe\x85\x1a\x81" - "\xd6\xcb\xbc\x29\x5e\x06\xf5\xb5\x02\x6f\x83\xb8\x3f\x41\xab\xd6" - "\xa4\xa8\x12\xd6\xc5\xc7\x8f\x1b\x46\x82\xb8\xbf\x44\xbc\xdf\x7a" - "\x0a\xe6\x6b\x7f\xb9\x98\x1e\x83\x7e\x6a\xa1\xbf\xb5\x27\x61\xe5" - "\x03\xd8\x20\xd0\xa7\x7c\xe0\x9b\x01\xe5\x87\xe1\xfb\x61\x68\x7b" - "\x2d\xb7\x7f\xb3\x62\xe1\x1b\xb4\x20\x6c\x32\xb4\x13\xe7\x4a\x15" - "\xe6\x77\xbf\xb4\x21\x52\x06\xfd\x2e\x04\xba\x5a\xd5\x2d\x64\xec" - "\x59\xc5\x63\x9e\xd0\x8e\x2a\xf8\x8e\xf4\x6f\xa1\x1e\x81\xfe\x18" - "\xeb\xd7\xc2\x9d\xf8\x1b\x64\xa5\x2d\x1b\x45\x73\x3a\x0a\xc2\x74" - "\xb8\x6f\x05\xb7\xf7\x26\xfc\x06\xb9\xd4\x02\x6d\xfe\xa5\xcc\x48" - "\x19\xac\x9f\x65\x15\xbd\x3c\xc3\xaa\xb1\x4d\xd8\x0e\x5c\x93\x7f" - "\x04\x9e\xac\xb9\x47\x4d\xee\xee\x24\xb2\x8f\x5a\x09\x29\x2d\xa6" - "\x95\x70\x94\xc2\x51\xf2\x21\x9c\x3b\x01\x47\x2d\x94\xd7\xc1\xdf" - "\x0f\xe1\xef\x09\x38\x60\x4d\x1f\x80\xed\x4e\x4e\xa7\x6d\x13\x4b" - "\xc8\xcf\x90\x3f\x60\x6b\x41\x8b\x62\x21\xf6\xb7\x16\xf7\xa5\xa1" - "\x23\x1f\x4b\xb1\xda\x4b\x43\xf1\x78\x1b\x81\xf3\xf0\xd7\xc8\xfe" - "\x8a\x8f\x27\x42\xe1\x88\xe1\xbf\xef\x03\x9a\x53\xfc\x77\x2d\x1c" - "\x75\x03\x1f\xb6\xfc\x1c\x1d\x33\xa7\x38\x4f\xeb\xd4\x91\xe2\x1c" - "\xdd\x2c\x3d\x51\x44\x84\xc1\x91\x65\x5d\x1e\xa1\x66\x65\xf3\x02" - "\xd9\xef\x79\xc1\xfc\xdf\x28\x38\x40\x4e\xf3\x81\xff\xfc\x12\x56" - "\x36\xbf\x8a\x28\xd4\xed\x70\x74\xda\xd4\x8f\x3c\x73\x50\x9f\x3d" - "\x30\x07\xa1\x2e\x75\x8a\xc7\x42\x51\x47\x79\x0c\x5b\x32\x7c\x37" - "\x0f\xca\x42\x00\x5b\xa5\x02\x7e\x9e\xb8\xcf\x1a\x3f\x4f\xa8\x6c" - "\xf0\x93\x8f\xb6\x08\xc6\x4b\x4e\x05\xc3\xcb\xe1\x4b\x9b\x62\xe0" - "\xf7\x13\x81\xc0\xe7\x30\xc6\x8a\x80\x07\xe7\xaf\xe6\x9d\x83\x35" - "\x78\x2c\x51\xa0\x7d\x69\x57\x3c\xb1\x0e\x31\x8b\x75\xf3\xf5\xb2" - "\xb6\x40\xfb\xa0\xac\x12\xdb\xb7\x16\xf8\xc2\xef\x2a\xa0\xab\x6c" - "\x20\x17\x2d\x6d\xe3\xae\x79\xf1\x19\xc0\x23\xdf\x5e\xe4\x89\xd7" - "\x51\xa1\x5f\x21\x78\x0d\xab\x7b\xe6\x38\x28\xc7\xb5\x3d\xbe\x77" - "\xe7\xd1\x60\xd4\x11\xc4\x24\xfe\x6d\x30\x06\xc3\x58\x0a\x23\x66" - "\xcc\x35\x1f\x40\x70\x6f\xb3\x1b\x5a\x14\x33\xbd\x27\xa4\x93\x60" - "\xe4\x87\xf6\x1b\xfa\xd1\x58\x81\x63\x91\xf1\x1a\x83\xfd\x40\xfe" - "\x1f\xc2\x6a\x0a\xff\x96\x63\x7b\xe0\xbc\xa8\xde\x42\x5c\xb3\xe7" - "\xa5\xb1\xbe\x42\x5d\x55\x70\x7d\x35\xf6\x1d\xe5\x09\xe7\x6b\x80" - "\x4f\x2c\x9e\xc3\xbd\x29\xf9\xfe\x54\xe1\xfb\x8e\x28\x0f\xa4\x6f" - "\x80\xd5\x0b\xb7\x8f\x86\x22\x8c\xcb\xd5\x0f\xfc\xab\x51\x1f\x14" - "\xea\x40\x1e\x99\x46\x6a\xa4\x60\x8f\x7e\x97\xd6\x09\xbe\xcf\xac" - "\x2f\xad\xf5\x33\x53\x2b\xd6\x0f\x5c\x87\x76\xf0\x18\xfa\x03\x68" - "\x4f\xa0\x4e\x1f\xf4\x75\xa0\x2c\xdf\x5c\x00\x3c\xd6\x77\x72\xf1" - "\x2d\xe0\xf3\x31\xb4\x25\x1f\xf9\x40\x7b\x8e\x31\x5e\xb3\xbc\x31" - "\xe7\xbe\x58\xd7\x3c\xbf\x2a\xd4\x39\x37\x9e\xd3\xb8\x3e\x81\xed" - "\x9a\xb5\xbb\x9c\x9d\xab\x01\x9a\x1a\xda\x13\x46\xe8\x26\x35\xdb" - "\xab\x9a\x9d\x3b\x98\xd9\xc5\xe9\xf7\x18\xb3\x6b\xb3\xde\x4f\xce" - "\xa0\x6d\x42\xbb\x67\xa5\x5a\xf6\xa4\xe2\xdb\x7d\x10\xeb\xa3\x1b" - "\xa2\xb8\x39\x14\xeb\xc0\xeb\x79\x7e\x91\xc8\xcf\x22\xab\x09\xd0" - "\x0e\x26\xaf\x99\x5b\xa1\xbc\x0a\xb1\xc8\xc9\x0d\xec\xe8\xa5\x4c" - "\xc4\xe2\xac\x74\xb8\xfe\x70\x2e\xfe\xde\xc0\xfd\x56\x72\x36\xb6" - "\xf7\xfc\xcc\x63\x78\x1e\x63\x22\x79\xab\x01\x4b\x66\x42\x7e\xe6" - "\x47\x82\x0d\xd9\x5c\xdf\xf6\x19\x36\x85\xca\x8e\x1a\x09\xc1\x76" - "\x82\x8c\x6a\x3a\x0a\x66\x07\x82\xed\x8f\xc1\xb6\x82\xbd\x3e\x48" - "\x7f\xa7\x26\xd8\x66\xb0\x67\x7c\xfb\x66\x17\xf1\xba\x3f\x88\x7d" - "\x44\x79\x4e\x60\xb6\x0f\xce\x45\x3c\x80\x6d\x17\xfa\x3d\x3b\x51" - "\x2c\x63\xae\xdf\xa0\x07\xd4\x17\xea\x45\xc4\x13\xb1\x9f\x0f\xbc" - "\xf6\xb1\xdf\x0c\x1b\x28\xeb\xfc\x51\xb4\x0e\xe9\x05\xda\xf0\x37" - "\xf0\x9c\x06\xea\x9e\x98\xc8\xed\x8f\x2d\xc3\x7d\xc5\x80\xef\x3e" - "\x6d\x9a\x91\x00\x8f\x1a\x94\x29\xd0\x99\x10\x8f\xf0\xbb\x8e\xaf" - "\xc3\x08\xf3\xf9\x78\x38\xa6\x0a\xe3\x3f\xfc\xbc\x35\xbe\xc2\x6d" - "\xc7\x3f\xea\x3b\xdf\x9c\x19\x46\x38\x3c\x24\x11\xd5\x05\x45\xf8" - "\x36\x7e\xee\xe0\x75\x1d\x7e\xe6\x28\x8c\x17\x11\x8f\x18\x1b\x5d" - "\xd7\x70\x78\xdc\x30\x53\x86\x7d\x86\x6b\x6b\x78\x3e\x5c\x9f\x39" - "\x3c\x65\x73\x18\xa8\xa3\x1b\xa0\x9f\xbd\x38\x98\xad\xe5\xf5\x5c" - "\x67\x23\x13\x8b\xed\xf2\xc6\x3d\x8e\xd1\x26\x81\xdf\xfd\xeb\x8e" - "\x1e\xc1\x2e\xa1\xee\xcd\x9c\xee\xc3\x63\x2b\xd8\x7c\xcb\xdb\xad" - "\x70\x76\x7e\x94\x15\x86\xb1\x2d\x65\x1c\x7e\xb1\x2d\x99\x51\xd8" - "\x96\x1a\xae\x1d\x99\x2a\x72\x41\x11\xe1\x87\xf5\xc3\xb5\x95\xfc" - "\x78\xe5\x79\xcd\x4e\x41\x5e\xcf\x81\xad\xc2\x36\x41\xdd\xcc\xfe" - "\x3d\xc2\xe1\x60\x1d\xdf\xf6\xda\xce\x6c\xbc\xf6\x89\xd8\x2e\x39" - "\x77\x6d\xad\x4e\xf1\x78\x73\x27\xdb\x23\x6e\x18\x5c\xbf\x87\x7b" - "\x6e\x53\x11\x79\x0a\x6d\x34\xbe\x8f\x0c\xdf\x8f\xa8\xe6\x03\x56" - "\xcf\x11\x05\xf0\xf3\x42\x8c\x5a\x70\xd1\xae\x88\xdc\x8f\xfb\xc7" - "\x80\xac\xf7\x81\x8f\xb4\x07\xe5\x8d\x58\x06\x1f\x69\x72\x47\x41" - "\x44\xb3\x05\xb7\x50\x4f\x29\xca\x9e\xe9\x67\xce\x18\xc0\x71\x8d" - "\x80\xad\x39\x63\x78\x39\xee\x01\x39\x7a\x41\x7d\xbb\xf9\x7e\xed" - "\x01\x7a\xf0\xc5\x22\x77\xf0\x6d\x2f\xe1\xe9\xa7\x59\xf4\xc0\x8f" - "\xd5\xba\x5c\xb4\xbf\x9c\x0e\xe6\x9c\xe2\xaf\xad\xe2\xeb\x3a\x6d" - "\xa1\x45\x1f\x91\xdb\xef\x19\xca\xd0\x0e\x4e\x04\xdd\x73\xb6\x2f" - "\xad\x9b\xa3\xe3\x6d\xe3\x31\x56\x47\x64\x06\x87\x43\xf0\x7b\x04" - "\x1c\xcd\xd9\x67\x63\x9f\xd0\x16\xe7\xd7\x6f\x61\xfb\xe9\x21\x96" - "\xd0\xa6\xe2\x3a\x09\xf8\x6d\xe1\xc7\x0f\xdf\xe6\xb9\x37\x5b\x63" - "\x25\x32\x0e\xb0\x72\xb7\xc0\x7b\xae\x97\xbd\x79\xae\x82\xd9\xc0" - "\x52\x76\xcd\xdc\x85\x7c\xdf\xf6\xb1\xbe\xf1\xbf\x51\x6e\x1a\x4e" - "\x6e\xb7\x8a\xe4\x08\x72\x7b\x72\x1b\x4f\x5f\x83\xb6\x5c\x18\xaf" - "\x73\x8f\x5b\xc6\x72\x5f\x7b\xf1\xe4\x46\x1c\x0f\xa2\x76\x55\xda" - "\xd8\x8b\x1a\xfb\xf6\x62\x6e\x22\xdf\xdf\x4a\x9b\xb1\x51\xc5\xfb" - "\xbb\xdb\x2d\x7a\xa8\x37\xf0\xfb\x1a\x42\x19\xda\x4f\xac\x5b\x3c" - "\x07\x95\x33\xb9\xf2\x63\xf9\xc9\x95\x7d\xf5\xf0\xe4\x64\xf1\x78" - "\x46\x5d\xa3\x4d\x40\x1e\xa8\x53\xce\xaf\x84\x32\xa6\xd7\x27\xbd" - "\xd1\x36\x88\x6d\x34\xd0\x16\x9a\x29\x8e\x97\x27\xa7\x58\x8f\xc5" - "\xb9\x55\xfc\x58\xe4\xeb\x8e\xbc\x01\x74\x14\x2c\xaa\x77\x9f\x4d" - "\xbd\xa8\x9b\x63\xdc\xfe\x33\x5c\x1f\x9f\xbc\x6c\x99\xd3\x90\x1e" - "\xae\x4d\x85\x6b\x74\x36\xf3\x63\x3e\xb6\x0f\xea\x52\x73\x36\xab" - "\x98\xb3\x15\xa9\x1d\xac\x3d\xad\x15\xfc\x3c\x01\x65\xc1\x7c\x59" - "\x35\x3f\x97\x58\x70\x33\xcf\xba\x4d\x91\x21\xf6\xfd\xa3\xb9\x6a" - "\x8b\x7f\xc4\xf1\xe2\x6c\x51\x64\x28\xdf\x3f\x2c\xbb\x9b\x95\xcd" - "\xf5\xc6\xb2\x5c\x26\x87\x42\xca\xcd\x57\x73\xaa\xf9\xf9\x0a\xc7" - "\x97\x1c\x7e\xab\x70\x8c\xe1\x6f\xe0\x51\x82\xfc\x1b\xb2\xba\xd1" - "\xa7\x2e\xd1\x29\x22\x0e\xa3\x3d\x40\x7b\x81\xcf\x1b\x73\x7f\x67" - "\x73\x7f\xbf\x42\xbb\x83\x7e\x08\x9e\x07\xba\x7d\x68\x8b\xa0\xbc" - "\x0b\x73\x0d\xd2\x6f\xbd\x80\x6f\x64\x33\xbb\x76\xde\x70\xce\x57" - "\xf8\x36\xcc\xc3\x52\x66\xb9\x0e\xec\xd6\x11\xbc\x0e\xaf\xb7\xd8" - "\x2f\xb4\x5d\x46\xb4\x4d\x5c\x7d\xf3\xe6\xf0\x18\xe7\xd6\x0d\x16" - "\xbf\xa8\x47\x2e\xa2\xc5\xfd\xd9\x38\x9b\x36\xaf\x94\xd9\xb3\x79" - "\xdb\xf1\x5a\x4e\x7f\x60\x2b\x35\x5d\xf4\xcb\x8a\x24\xa2\x28\xbf" - "\x88\x76\x31\x2c\x87\xb5\x73\x5e\x1b\xeb\xc7\xbc\xb7\xb8\x7e\x30" - "\x9b\x9a\xcf\xda\x12\x96\x53\xde\xcd\x9d\x3b\x89\x7d\xc1\x73\x79" - "\xa2\x73\xb8\xdf\x22\x9c\xe3\xf6\xd6\xb3\xbd\xce\xdc\x13\xdb\x87" - "\xbe\xa2\x9b\x5b\xf7\x79\x95\x17\x5b\x6c\xef\xfc\x58\xd6\xce\xf9" - "\x63\x2d\x76\x17\xe4\x72\x10\x6d\x2f\x77\x6e\x15\x4f\x33\x9b\xff" - "\xcb\xd9\xf7\xf9\xf3\x98\x5c\x03\xe4\xbc\xbc\x0f\xb3\x7e\xcc\x8f" - "\xe3\xd6\xd9\xdf\xaa\x41\xb6\xf3\x67\x5a\x64\x2b\xfe\x8e\xe3\x07" - "\xea\x57\xe2\x6f\x0e\xf7\xe9\xdc\x1a\xb6\x14\x69\xb0\x4d\x6c\x8e" - "\x98\x17\x6a\xeb\x53\x9f\x55\xa8\xbf\xc4\x79\x89\xf9\xaa\xea\xf7" - "\xf9\xd8\x14\xd1\x26\xbd\x0a\xf3\xc2\x02\x6f\x8b\x8d\xa1\x1d\x61" - "\x04\xf7\x6d\x3a\xab\x58\x30\x1c\xcb\x70\xcf\x2d\x31\x0d\xda\xa7" - "\x03\xdd\x3a\x9e\xe7\xfc\x36\x8b\xdd\x40\x5b\x52\x6f\x68\xe1\x7d" - "\xba\x05\x25\xe5\xbc\x2d\xb9\xa0\x58\xb0\xd3\xda\x0f\x5b\xb0\xd3" - "\xda\x66\xa8\xf7\xdb\xda\x0c\xf0\x9b\xb7\x74\x14\x2c\x88\xb7\xf2" - "\x03\xa0\xac\x7f\xdb\xb1\x20\x04\xc7\x28\xee\xf7\xca\xd9\x27\x2e" - "\xde\xa6\x96\x59\xda\x8c\x76\xf3\xd2\x26\x4b\xfc\x42\x5d\x86\xbe" - "\x9a\x4d\x7d\xcd\x56\xb6\x13\xeb\xb3\xf0\x53\x10\xdc\x33\x14\xe4" - "\x80\xf1\x96\x05\xfb\x78\x3b\x5f\x69\x65\x2b\xf9\x39\x0c\xed\xa4" - "\xf5\x5c\x15\xb6\xdd\x7a\xae\x52\x6f\xeb\x6b\x23\xd5\x6a\xe7\xe7" - "\x2a\x75\x30\xda\x2d\x8b\x8d\xb4\xb6\x05\xea\xa8\x72\x2b\x5f\x76" - "\x41\xab\xc5\x97\x15\xec\xe8\x82\x14\xb4\x51\x50\x7f\x0d\x5f\xf7" - "\x29\x9d\xe2\x91\x26\x4b\xdd\x70\xde\xbb\x5e\x05\xd8\x2c\x08\x0b" - "\x01\x4c\xd5\xf0\x3e\x20\x37\x36\xbb\x71\x7f\x3f\xc5\x7c\xc4\xff" - "\x30\xc4\x99\x36\xe1\x22\x69\x15\xe6\x8a\x63\x97\xd6\x5a\xe4\xbb" - "\x70\xa5\xd8\x2f\x2c\x2b\xa6\x5b\x3b\x0a\x16\x4e\x15\xf7\x71\x3b" - "\x94\xe5\xf1\x31\x04\x4e\xb6\x1c\xaf\x85\x88\x6b\xab\xbe\xb1\x7e" - "\x2c\x0c\xc5\x7e\xe0\x9a\x08\xea\x57\xa0\xdf\x83\x7b\x3e\xc3\xb8" - "\xd9\x5a\xd1\x8b\xf9\xc7\x9b\xbb\xb2\xc5\xfe\x55\x58\x2b\xda\x4a" - "\x7e\xed\x59\x0b\xfe\x4e\xbe\x38\x16\x33\x6b\x7a\x84\x2a\x31\x29" - "\x2e\x21\x65\xd5\x3d\xaa\xb8\x84\xb8\x94\xb8\xe5\xf1\x71\x69\xcb" - "\x53\xe2\xd6\x26\x8c\x5f\xb3\xfc\xe9\xb8\xa7\x54\x1b\x96\x27\xab" - "\x82\x53\xc7\xa6\x0e\x23\x02\xe9\xaf\x54\xcb\x93\x93\xd7\xad\x59" - "\x19\xa3\x4a\x88\x7b\xea\xee\xa4\x95\xc9\x2b\x53\x54\xcb\x93\xd6" - "\xae\x4b\x88\x51\x8d\x8d\x99\x30\x36\xf8\xfe\x98\x61\xe2\x18\xda" - "\x1d\x4a\xd2\x6e\xbe\xd2\xd6\x96\x77\x85\x78\xf9\xc8\x12\x93\x7c" - "\x52\xe3\x12\x58\xcc\x6e\xd1\xfe\x89\x85\x24\x11\xce\x7b\x57\x14" - "\xa0\xac\x17\x6a\xe1\xaf\x02\xe9\xa0\x9f\x2a\xf8\xee\x05\x6d\x1f" - "\xdd\x51\xb0\x28\x51\xa7\x58\xaa\x46\x99\x81\x2c\x54\xd0\xb7\xd1" - "\xf4\x4a\x6d\x1b\xf8\x6c\x89\xf8\x9c\x41\xc5\x15\xe2\x97\xbf\x9e" - "\x28\xe0\xf0\x86\x43\x29\x57\x62\xac\x6b\x11\xac\x71\x16\x6b\x59" - "\x4c\x74\x71\xa8\xde\x37\x7d\x3c\xcd\x4f\x1f\xcf\xf4\xb2\xf8\x21" - "\x4b\x2c\x3c\xfc\x79\x12\x8e\xf8\x6c\x51\x2c\x0e\xe1\x74\x05\x58" - "\xc6\x58\xf0\xa5\x77\x1f\x0e\x01\x7f\xb0\x19\xe3\xb9\x70\xee\x21" - "\x83\x9c\x78\x43\xbb\x14\x47\xd3\x83\xc9\xcb\x50\x57\x72\x00\xa5" - "\x1d\x05\x8b\xbd\x2c\xf1\x34\xe8\x83\x12\xfa\xd2\xc4\xf7\xe3\x5b" - "\xae\x1f\xc5\x34\xb0\x70\x24\xb4\xaf\x00\xdb\xb3\x78\xb2\xa5\x0f" - "\xd0\xee\x26\x9d\x62\x51\x09\xb4\x53\x89\xed\xb2\x17\xeb\xc3\x78" - "\x17\xb4\x33\xc3\xbc\x1e\xe4\x76\x1b\xdb\x33\x36\xaf\x9c\x8d\x3f" - "\xe8\xcf\xc1\x0a\xf8\x9e\x7b\x91\x78\x6f\x4f\x22\x7e\x34\xfb\x76" - "\x7a\xd2\x60\x24\x0d\xb1\x4d\xc4\x67\x23\xd5\xd3\x3f\xb5\xb5\xf1" - "\x7d\xda\x83\xb6\xe1\x8f\xcf\x34\x29\xb0\x4f\x30\x57\x78\x57\x5c" - "\x74\x18\x5b\x54\xbc\x3c\x8a\x1a\xe8\x2e\xb1\xcf\x15\xe5\x8b\x32" - "\x41\x7f\xeb\x12\xcc\x53\xd0\x87\x4e\xa8\x3b\x82\xf7\x8d\x0d\xb4" - "\x27\x4a\xe4\x4b\x2d\x46\x9c\x19\x1c\xf0\xf6\xb2\xf0\xa6\x72\x6e" - "\xaf\xe5\x00\xa6\xff\xa8\x0c\xb8\x46\x2f\xf0\x8f\x52\xdb\xf2\x47" - "\x9e\xf0\x5d\x6f\xa9\x87\xad\xc3\xa3\xd0\x27\xd0\x03\x96\xf5\x0e" - "\xea\x0b\x2c\x28\xa6\xa7\x1a\xa0\x3c\xaf\x8b\xe0\x38\x39\x55\x51" - "\xcc\xf1\xaf\x01\xb9\x8f\x46\xfe\xcf\x8d\x22\x64\x0b\xd0\x5c\x2a" - "\x58\x1c\x81\xf1\x5d\x38\x07\xe3\x3f\x2c\xcc\x36\x66\xcd\xe3\xf9" - "\x57\x36\x78\x0e\x29\x40\x9f\xb0\x10\xf8\x03\x86\xf2\x2e\xc3\x3c" - "\x0c\xbf\x27\x14\x92\x20\xac\x07\xbe\x73\xf1\x90\x8e\x82\x25\x41" - "\x96\xfa\x28\xe0\x3f\xd7\xcc\x62\x30\x3c\xb6\xc6\x37\xa4\xb6\x61" - "\xce\x30\x7a\x14\xec\x3b\xb6\x11\x31\x06\xd7\x44\x59\x30\x05\x58" - "\x3f\xc5\xe1\xca\x8f\x04\xd1\x82\x28\x5d\xc5\x48\xa0\x03\x5c\x95" - "\x03\x9e\x10\x57\x40\xbb\xd5\x82\x29\xc0\x5a\x23\xd2\x41\x1b\x86" - "\x55\xa7\x85\x28\xd0\x46\xb6\x2a\x96\xe0\x2d\x2d\x25\xfd\xed\x13" - "\x4d\xf4\x27\x8b\x9b\x98\x9e\x96\x98\x1a\x3a\x99\x0e\x04\xb9\x2f" - "\x69\x14\xc9\xbd\x11\x70\x3c\x0c\xe5\xcc\x62\xd5\x4b\x4c\xd0\xb6" - "\x46\xce\x17\xcf\x00\x1d\x70\x73\xd5\x92\xc3\x78\x3d\x2f\xc3\x3a" - "\x41\x86\x4b\x03\xec\xc9\xd0\x46\x76\x0a\x3c\x68\xc1\xd2\x40\x1c" - "\x2b\x70\xcd\x4c\x9d\x22\xaa\xdd\xd1\xbd\x02\xa8\x43\xa1\x28\x24" - "\x5e\x58\xc7\x31\x3f\x8e\x3e\xdd\x52\x47\x1e\xc8\x5a\x9f\x19\xdb" - "\x2f\x9e\x8f\xc1\x6a\x13\x63\xe2\x78\x7d\xa0\x1f\xca\x77\xe9\x61" - "\xe1\x7a\x6a\xb0\xbd\x7e\xec\x53\x56\x6d\xe5\x0e\x68\x6b\xe3\xcb" - "\x23\x01\x47\xac\xbd\xc6\xfe\xda\x1b\xa8\x62\xf3\xa4\xf6\x0e\xc4" - "\xf7\xb2\xfb\x1a\x4a\x08\xc1\x32\xfe\x77\xe0\x25\x98\x7b\x6c\xe3" - "\xfb\x8e\xef\x37\x2c\x5b\x67\x7d\xbf\x61\x59\x8c\xa3\xfb\x0d\x36" - "\xf5\xbe\x85\xf5\x9a\x2b\x22\x65\xa2\xba\x4b\xcd\x76\xea\xb6\x5c" - "\x3f\xa1\x52\xbc\x9e\x89\xe6\xda\x50\x0f\xf3\x14\xfd\x69\xa4\x8c" - "\x02\x9f\x63\xdc\x1c\x1e\xcd\xfb\x2f\xe8\x17\x2d\xd3\x21\x8d\x6d" - "\x3f\x7a\x3f\x5e\x7e\xe8\x5b\x91\x2e\xee\x87\xe7\x23\x44\x89\x7f" - "\xef\xd7\x5b\x4e\xcb\xad\x88\x09\xb5\xf3\x03\xfc\xac\x5f\x72\xf4" - "\x14\x3e\xac\x88\xff\xcd\xb8\x28\x7a\xe9\x7b\xcf\xbb\xf1\xb9\x81" - "\xb5\x97\xe3\xd7\x49\x64\xec\xdb\x14\xa5\x88\x22\xb4\x9f\xab\x29" - "\xb1\x5c\x62\xef\xf3\x2c\x1c\x59\x91\x9e\xc0\x2f\x98\x23\xa6\xd4" - "\xc8\xf3\xb7\xfc\xa6\xe2\xdf\x58\x62\xfd\x1b\x3e\x1e\x51\xa2\x0a" - "\x6e\xf7\x88\xe1\x1e\x1b\xfb\xbf\x98\xde\x22\x79\xa5\xb8\xad\x20" - "\xee\x2c\x4f\xee\x8b\x0f\xfe\xd3\x09\xfc\x82\xe0\xfc\x94\x88\x5e" - "\x82\x9b\x0c\x9b\x45\xe4\x1f\xb1\xe6\x3f\x50\xd9\x4f\x1f\xa5\x7e" - "\x6e\x13\x7d\xbf\x9d\xfd\x79\x20\x7a\x10\xf9\xf7\xff\x51\x35\xde" - "\x60\xf9\x2a\xc0\xe3\x81\x56\x7b\xa4\x82\xfc\x7f\x65\xd1\x31\x15" - "\x23\x54\x38\x3f\x4d\x6b\xfd\xfb\xc1\x7c\xeb\xdf\x0f\xe9\x06\xa1" - "\xe5\x84\xab\x24\x53\x07\x73\x6f\xc8\xbe\xde\x42\x1f\x9b\x21\xe3" - "\x93\x6f\x33\x84\x84\x0f\xdf\x1a\x0f\x42\x1e\x9e\x2c\x2a\x56\xd8" - "\xa7\xbe\x3a\x9f\x5b\x36\xf3\x03\xe2\x76\xbd\xb2\xcf\xc9\x07\x6d" - "\xca\xf0\xf7\x75\x2a\xbe\x6c\xd2\xfb\x7d\xe8\xb9\x32\x95\xe8\xb7" - "\x2c\x04\xfe\xa9\x04\xfc\xeb\xfb\xd2\xfe\xf8\xf9\xf1\xe3\xc4\x47" - "\x86\xe3\xe3\xc7\xcf\x55\xfa\x50\x36\x8b\x83\x25\xe2\xfe\xe0\x7f" - "\xb4\xd7\x50\x52\xfe\x04\xe5\x0b\x28\xff\x65\x50\xe6\xf1\x1f\x3f" - "\x3f\x7e\x7e\xfc\xfc\xf8\xf9\xf1\xf3\xe3\xe7\xc7\xcf\x0f\xe0\x23" - "\x13\x2f\xac\xbd\xe0\xb8\x9e\xff\x2b\x5e\xff\xc8\xf8\x43\x5c\x26" - "\x77\xe7\x3a\xca\x7f\x48\x56\x88\x56\x55\x19\xad\x53\xe6\x47\x34" - "\x06\x57\x27\xea\xbd\xb6\x86\xd5\x06\xed\x89\x6d\x0b\x28\x51\x37" - "\x4d\xa9\x49\xed\x54\x6c\x09\x3d\x16\x58\x15\xd3\xea\x57\x18\x79" - "\x6a\xf2\xc1\x14\x83\x77\xce\xcc\xba\xf1\xfb\xe2\xdb\x47\x97\x46" - "\x35\x4f\x3d\x9c\x6e\x94\x67\x3f\xfc\xb7\x3b\x5e\x5d\xd1\x32\xb2" - "\x60\xee\x27\xf7\xbc\x9d\x74\x71\xd8\x8b\x8f\x7f\x78\xd7\xde\x67" - "\xce\xdd\xf2\xca\xa2\x7f\xfe\xea\x2f\x69\xdd\xd7\xbd\xf0\xc8\x07" - "\x77\xbe\xbe\xea\xec\xa8\xe2\xf9\x9f\xdd\xff\xa7\xf5\x57\x46\xe4" - "\xce\xae\x9f\xf0\x66\xc2\x85\xdb\xca\x97\xfe\xfb\xd7\xef\x6a\xcc" - "\xb2\xcd\x0f\xbd\x3f\x66\xf7\xf2\x2f\x7d\x77\xcc\xf9\x78\xd2\x5b" - "\xcf\x7e\x7f\xc3\xb6\xc7\x4e\x8c\x7b\x23\xee\x9b\x9b\x77\x2e\xfc" - "\xfc\x81\x77\x36\x76\x79\x3e\x3f\xe3\xf8\xd8\xd7\x56\x7e\xe5\x5f" - "\x34\xef\xf4\x7d\x87\xd6\x5d\x1e\xbe\x7d\xd6\xc9\xbb\xf7\xaf\x39" - "\x7f\x6b\xd9\x92\x33\xd3\x8e\x64\x98\x3c\x9e\x9b\x7e\xf4\x67\xbf" - "\x7b\xea\x3f\x37\xbd\xfc\xe4\xa7\xf7\xfe\x31\xf9\xd2\x8d\x2f\x3d" - "\xf1\xd1\x2f\xfe\xb0\xfa\xdb\x9f\xee\x5a\xfc\xaf\xff\xfb\xeb\xa6" - "\x9e\xeb\x7f\xf3\xe8\xdf\x7f\xfe\xfb\xa7\xbf\xfe\xc9\x6f\x17\xfc" - "\xe3\x97\x7f\xde\xd0\xe1\x93\x17\xde\x30\xf1\xc0\xda\xef\x6e\xaf" - "\x58\xf6\xc5\x83\xef\x65\x52\x77\xe4\x47\x14\xd5\x4f\x0e\xa5\xde" - "\x04\xe7\x11\x8b\xcb\xa3\x5d\xe6\x23\x97\xf1\xfa\x67\x05\x59\xf7" - "\x11\x99\x17\xb9\x4e\xe1\xc2\x8a\xc1\xd5\x7e\x3b\xf8\xa8\xc4\xd7" - "\x3b\xf3\xc1\xf8\xd1\x24\x38\xee\x85\xe3\xa7\x5c\x89\x10\x05\xb8" - "\xc3\x49\x1e\x57\xff\x23\x83\xbe\x7b\x40\xcb\x3c\xc9\x75\x20\x2d" - "\x2f\x72\x03\x19\x46\x6e\x24\xde\x64\x38\x19\x41\x7c\x88\x92\xf8" - "\x92\x91\xe4\x26\xe2\x47\xfc\xc9\x28\xf2\x13\x12\x40\x6e\x26\xb7" - "\x40\x6f\x46\x93\x5b\xc9\x6d\xe4\x76\x10\xca\x18\xfb\x7d\xc9\x22" - "\x21\x01\xf0\x0f\xfc\x1f\x41\x42\xb8\xdf\xd1\x3f\x96\x0f\x69\xb9" - "\x96\x2f\x6f\xe4\xcb\x75\x3f\x96\x0f\x69\xb9\xea\xbf\xfc\x77\xcc" - "\x7f\xf5\xaf\x0c\x5c\x07\xe6\x3d\x58\xf9\x10\xbd\x1f\xdb\x52\x19" - "\xff\xe9\xfd\x4d\x06\xb8\xbe\x0f\x3f\xeb\xeb\x6d\x3f\x21\x70\xf0" - "\x01\xd9\x4c\x42\xd8\xfd\x06\x2a\xfe\x18\x8b\x65\x7f\x53\xf8\x66" - "\xe1\xad\x13\x2f\xe2\xc7\xfd\x3b\xf0\x47\x9b\x02\x47\x16\x1c\x39" - "\x70\xe4\xc1\xb1\x0b\x8e\xd7\x2c\xbc\x89\xec\xf6\x50\x22\x53\xa5" - "\xc3\x5f\x1d\x91\x8d\x09\x80\x63\x1f\x91\x05\x8e\x27\xb2\x3b\xda" - "\x89\x6c\x6c\xbc\xd0\xf8\x09\x5b\x7b\x5b\x29\x1b\xcf\x97\xab\xe0" - "\xfb\x24\x71\xac\x56\xea\x7c\xa6\x9d\x11\x19\xa6\x9a\x34\x61\xf2" - "\x84\xfb\xee\x5d\xae\xba\x3b\xe2\x6e\xd5\x3d\xc1\x93\x26\x4d\x0c" - "\xbe\x7f\xe2\xa4\x5f\xaa\xee\xb9\xe7\x57\x93\x82\x7f\x15\x1c\xac" - "\x5a\xb3\x31\x29\x6e\x52\xf0\xd3\x2b\x55\x09\x31\x71\xc9\xaa\x55" - "\x71\x49\x6b\x36\x2c\x4f\x5a\xe9\x44\xd7\xa5\x7c\xa0\x2b\xe4\x56" - "\x13\x6b\xa6\x58\x43\x32\xf2\x20\x51\xc4\x46\x10\x45\x7a\x30\xe9" - "\xa3\x52\x59\x3e\xdf\xa5\x20\xfe\xe8\xf3\x59\xb3\x68\xfe\x3f\xc7" - "\x2e\x1e\xf1\xb7\x87\x9e\x1e\x3b\x6d\xfa\xef\xf2\xaa\x89\x3c\xa1" - "\x95\xc8\x57\x6d\x25\xf2\xa8\x30\x22\x8f\x48\x24\xf2\xe9\xc0\x62" - "\x6f\x24\x91\xef\x6e\x26\xf2\xdf\x66\x11\xf9\x4b\x39\x44\xae\xb1" - "\x53\xf6\xce\x56\x56\x76\x7e\x3c\x91\xb7\xec\x23\xf2\xcf\x4a\x88" - "\xbc\xb6\x96\x2b\xf3\xf0\x00\xbe\x5d\x01\x83\x2c\x91\xc1\xf8\x48" - "\xc5\x83\xec\xff\x01\x9e\x94\x72\x6b" +static unsigned int rss_ethp_z8e_uncompressed_length = 544468 ; +static unsigned int rss_ethp_z8e_length = 152837 ; +static unsigned char rss_ethp_z8e[152837 + 1] = + "\x78\x9c\xec\xbd\x7f\x7c\x54\xd5\xd5\x2f\xbc\x32\x99\xc0\x80\x49" + "\x66\x12\x23\x4e\x29\xd6\xd1\x62\x1b\x5b\x84\xa0\x58\xa9\x04\x8d" + "\x02\x1a\x2d\x3f\xa2\xd2\x36\x2a\x9a\x80\xfc\x08\x1a\x21\x42\x84" + "\x09\x84\x4c\x18\xb0\x8d\x35\xbf\x40\xa4\x51\x02\x89\xb7\xd8\xd2" + "\x16\x2b\x56\x5a\x63\x8b\x35\x96\xf4\xbd\xb4\x4d\x32\xb4\x2f\xbd" + "\x37\x4f\x5f\xdb\x8e\xdc\x88\x29\x0d\x64\x20\x43\x66\x4c\x66\xce" + "\xbe\xdf\xb5\xf7\x39\xc9\xcc\x30\x41\x79\x9e\xe7\xf3\x79\xff\x69" + "\x3e\x9f\xc9\x39\x67\x9f\xbd\xd7\x5e\x7b\xed\xb5\xd6\x5e\x7b\xef" + "\xb5\xd7\x21\xba\xfc\x3f\x2f\x59\xf8\x92\x40\xe6\xa4\x63\xef\xff" + "\x27\xca\xff\xfb\xef\xdf\x7f\xff\xfe\xfb\xf7\xdf\xbf\xff\xfe\xfd" + "\xf7\xef\xbf\xff\x7f\xff\x7c\x09\x34\xe3\xbc\xc9\x4c\xbf\xad\x27" + "\x0a\xb8\x2d\x93\xbc\x09\x09\xf3\xbf\xff\xa2\x08\xe1\x55\x02\xc6" + "\xf9\x49\x7c\xe5\xdf\x4e\xa4\x99\xea\xc9\x72\xbd\x8d\x6c\xe2\xfb" + "\x76\xd3\x9c\xbd\x44\xbb\x26\x88\xde\x17\x77\x0b\x5f\x5b\x39\xd1" + "\xd1\xfd\x78\xde\x2d\x7a\x5e\x9c\x20\xfc\x80\x53\xe8\xa5\x42\x33" + "\xc3\xd9\x86\xe7\x6d\x48\x47\x5a\x29\xd2\xfc\x9c\x56\x87\x72\x46" + "\xba\x67\xfb\x00\xb5\x39\x42\x54\xc7\x70\x1c\x61\x9a\x7b\x9d\xc4" + "\xa3\x19\x79\xcb\x39\xef\xd6\x09\xa8\x37\x83\xc8\xbd\x5b\x04\x23" + "\x70\xb0\x70\x3d\x5c\xb7\x9e\xff\x78\x4c\x7d\x3e\xa4\x75\x1b\xf5" + "\x8d\x02\xc3\xc6\xe5\xb9\x0d\x8e\x2f\x50\xe2\x29\xba\xe2\x2a\x86" + "\xc9\xb8\x09\x37\x59\x3c\x83\x21\x3a\x45\xe3\x32\xfb\xdd\x94\x78" + "\x14\xd4\xa8\xdd\x2d\xd3\x13\x3d\xfe\x10\x39\x2a\x28\x01\xef\x16" + "\xe0\x6a\x42\xb9\x14\xa6\xcf\x43\x8d\x34\x99\xeb\x06\x5c\xb3\x30" + "\xb5\x26\x34\xa5\x13\x31\x8d\xfc\x26\xfa\xb2\xdf\x4d\x09\x01\xf7" + "\x38\xb4\xdf\x92\x29\xdb\x8f\x7a\x51\xd6\x7c\x8a\xc6\x9f\x33\x21" + "\x3f\xea\xf4\x39\x36\x31\x0e\xe3\x7f\x27\xdc\xad\x26\x03\x8e\xe6" + "\x6e\xbd\x62\xdf\x4e\xa2\x7e\xb7\xe9\x3e\xbf\xc9\x2a\x74\x38\x47" + "\x0c\x38\x9c\x0f\x75\x25\x73\x5d\xfd\x6e\xf3\xce\x88\x3c\x5e\x23" + "\x0f\xf0\xf6\x4d\xf3\x53\x22\xe3\x7c\x92\xc6\xcf\xe4\xfa\xf4\xb6" + "\x98\xb9\x0e\xcf\x86\x10\x79\xd0\xf7\xa8\x3b\x03\x6d\x75\x1c\x0d" + "\x12\x01\x66\x5a\x53\x05\x11\xc3\x07\xfe\x0e\x05\x73\xfc\x0c\x03" + "\x26\xc3\x18\x6e\xab\xbb\x35\xbd\x49\xe2\xc8\x6d\xb5\x90\x9e\xb7" + "\x30\x12\x47\x86\x8b\xb6\x5c\xcd\x6d\x69\x03\x47\xe9\x79\xb6\x0f" + "\xd3\x63\xb8\xfd\x57\xe4\xc4\xc0\xb6\x2b\xd8\x09\x80\x9d\xd0\xaa" + "\x97\x1b\x6e\xbf\x37\x26\xbf\xca\x6b\x1b\xe7\x37\x09\x9d\x0e\xe3" + "\x7b\x46\xf2\x8e\xdb\x15\x99\x17\xf8\x98\x14\x6d\xc9\xe4\xa5\xf1" + "\x5d\x68\x67\x22\xf2\xcc\x47\x3f\x3a\xf4\xf7\x57\xe9\xef\xed\x78" + "\x77\xa7\x82\x77\xc5\xcc\x08\x78\x36\x86\x17\xc9\x5b\x4a\xa2\xcc" + "\xf8\x25\xc1\x40\x1e\x83\xdf\x58\x8b\xc1\x6f\xeb\xed\x42\x73\x7d" + "\x0e\x6d\xaa\x3d\x5b\xa8\xb9\x05\x79\x9c\x41\x72\x4c\x24\xd7\x49" + "\xba\xe2\x10\xe0\x53\xed\x26\xb2\xb8\x4a\x44\xd0\xe3\xec\xa5\x4e" + "\x5f\x2f\xb9\x7c\x90\x8d\xd0\x05\xaa\xb8\x00\x5e\x0c\x9d\xa1\x8a" + "\x67\xc8\xde\x56\xfe\x11\xc5\xe3\x65\xcd\x24\xc8\x35\x89\xcb\x76" + "\x53\x67\x63\x37\xb9\x1a\xa3\xcb\xba\xae\x21\x7b\x07\x9e\xd1\xe7" + "\x56\xc6\x83\xe5\x2d\x94\x7a\xb6\xb0\xfc\x65\x32\xbb\xae\x23\x53" + "\xc7\xf2\x56\x1d\x97\x64\x27\xe3\xb2\xfd\x34\x59\x7e\xb0\x12\x7c" + "\x78\x9a\xf1\x1d\x28\x7c\x63\x53\xd0\x74\xd4\x3e\x9f\x8e\xda\x3f" + "\xa0\x36\xfb\x6c\x6a\x73\xce\xa5\xda\xd3\x94\x7c\x34\x98\x4d\x6d" + "\xe6\x7b\xa8\x6d\xf2\x5c\xf2\xf4\xe2\x1e\xf2\x7b\xd4\xee\x27\xc7" + "\x06\xe6\xa7\xe4\xa2\x5d\x4f\x92\xc5\xab\x60\x82\x76\xc9\xa5\xef" + "\x97\x12\x31\xed\xf8\x39\x5e\x3b\xd6\x7f\x8e\xec\xc0\xaf\x07\xb8" + "\x7c\x1d\xb8\xbc\x3e\xd9\x4e\x59\xc0\x79\xac\xa7\x21\x44\xe6\x72" + "\x1a\x37\x8a\x1c\x67\x68\xe0\x3d\xc8\x6e\xef\x3e\xe8\x13\x96\xdf" + "\xfe\xcd\xf9\xd0\x09\xc9\x90\xff\xe4\xed\xba\x0c\xf4\xba\x5e\x25" + "\x73\xff\xc6\xfc\x84\xa6\xdd\xa2\x3b\xe0\x4e\x21\xe3\x1d\x64\xb1" + "\x1b\xef\x7b\xa6\x65\x90\xcd\x13\xca\xa1\xf7\x06\x7b\x58\x1e\x7b" + "\x53\xfd\x94\xc0\xf0\xac\x4e\xc8\xce\x06\x4a\x02\x3e\x7f\x6a\x42" + "\xfa\x17\x91\x0f\xe5\x73\xbc\xb4\xfb\x10\x97\x17\x57\x3f\xea\xd7" + "\xae\x7e\xf4\x82\xf6\xfd\x47\xfb\xc5\xf7\x1f\x3d\x1f\xfe\xfe\xa3" + "\xe7\x5c\x65\x64\x09\x5f\xfd\xa8\xaf\xb3\x44\xf6\x81\xad\xb3\x04" + "\x7d\x10\x26\xcb\x96\x33\x64\x7b\xfc\x19\xf4\x7d\xe8\x6f\xb4\x65" + "\x35\xd9\xb5\x94\x0b\x76\x4f\xe8\x2f\xf4\x78\x39\x09\xdc\x67\xc6" + "\x6b\x5f\x7f\xea\x40\xb3\x21\x5b\xa8\xb7\xc5\x9b\x78\x26\x9f\xeb" + "\xf5\xa5\x68\xcd\xf8\xed\xc7\xef\x00\x7e\x07\x45\xea\xc0\x41\xd0" + "\xca\x95\xba\x35\x81\xf6\x0d\x12\x4d\xd3\x28\xe1\x34\xa5\x9c\x00" + "\xfe\xb6\x51\xe8\x36\x49\xdb\x79\xfb\xa1\x2f\x57\x52\x45\x20\x50" + "\x44\xac\x0b\x59\xff\xb1\x3e\x0c\xb8\x53\x1d\xa8\xa7\x41\xca\xef" + "\x6e\xe8\x98\xf4\xdb\x0f\x21\xbd\xc7\xbf\xb9\x28\xc1\xb7\xb9\xc8" + "\xd4\x9f\x7e\xfb\x5b\xc8\x33\x17\x79\x8e\xeb\x34\xec\x61\x58\x90" + "\x2d\x5f\x4a\x88\x12\x01\xb3\xe4\xed\x81\x2e\xf3\xde\xdd\xe2\x03" + "\xe4\x2b\x1e\x86\x05\xd8\x80\x03\xfa\xa7\x56\x1a\x69\xa0\x75\x77" + "\x0d\xf2\x71\x79\x4f\x30\x87\xc7\x14\xaf\xa7\xb8\x87\xac\x21\x1a" + "\x2f\x86\x54\x7d\xc8\xd3\xc3\x3a\x3d\x25\x48\x63\x02\x6e\xca\x63" + "\xd8\x5c\xce\xd3\xdb\x43\x28\xf7\x96\x70\x15\x99\x90\xbe\x30\x20" + "\x8a\x12\xb6\x23\xfd\x28\xca\xeb\x75\xf7\x18\x38\x72\x1d\xdc\xd7" + "\x12\x4f\xf0\xc3\xd1\xe2\x20\xa5\x34\x50\x22\xca\x3d\xc4\xf0\x18" + "\x16\xf8\xc0\x8b\xb6\xbe\x75\xb4\xd8\x47\x9a\x88\x82\xe9\x55\xf0" + "\xac\x33\xa3\xe0\x21\x5d\x00\x1e\xf3\x5f\x1b\xca\xa4\x34\x4b\x78" + "\x0f\xbe\xad\x31\xbc\x20\x99\x1d\x12\xdf\x6f\x31\x8c\x00\xeb\x0f" + "\xc0\x6c\xdd\x70\x37\xf5\x92\xb5\xd9\xe7\x2a\x4a\xec\xc4\xb8\xc9" + "\xe5\xdf\xa8\xe8\x49\x12\xfd\xf9\x89\xcc\x73\xfc\xde\x13\x3a\xcf" + "\x79\xb6\x8a\xfe\xa2\xc4\x94\x5e\xe8\x22\xe4\x41\x79\x27\xe3\x19" + "\xd9\x97\x0f\xce\xfb\xd6\x6c\xfa\xd6\xdc\xfb\xe6\xce\xa6\x05\x77" + "\xcd\x99\x4d\x59\x5f\xbf\x29\x6b\xc6\x2d\xb7\xdd\x22\x6f\x6e\xb9" + "\x6d\xe6\x2d\x94\xf7\xed\x07\x67\x53\xde\xc2\xd9\xf4\x10\x7e\x79" + "\x0f\xcd\x7b\x70\xee\xbc\x87\x66\x53\xfe\x3d\xf7\xe1\x69\xce\xec" + "\xe9\x59\xf7\xde\x94\x37\xe7\xbe\x79\xf4\xc0\xe2\x9b\xb3\x6e\xbe" + "\x99\xee\x9a\x37\x7f\x7a\x56\x96\x7e\x9d\x9e\xc5\x59\x1e\x99\x39" + "\xef\xa1\x9b\xf2\xd6\xad\x2d\x5d\x7b\xd3\xc2\xfb\xe6\x70\x0a\xb4" + "\x5b\x04\x0f\x65\x86\x07\x34\xa6\xb5\x5f\xf4\xe5\x92\x06\xdd\xb1" + "\x0f\x3c\x80\x5f\x6f\x6b\xc5\x49\xe8\x80\xb4\x67\xf7\x71\xdf\xc9" + "\x31\xc0\x7a\x04\x72\x6f\x0e\xb8\x6d\xe5\xde\xc4\xb3\x36\xa6\xa1" + "\xe3\x7a\xd6\x13\xf6\x24\xbc\x7b\x5f\x1f\x6b\x92\xf0\xbe\x31\xfa" + "\xfd\x95\xd0\xc1\xd6\xff\xd9\xe9\x20\xf2\xe0\x07\xba\xfb\xa1\x0b" + "\x41\x5f\x1f\xf5\xbb\xf2\x93\xc0\xdf\x09\xa8\xa3\x1b\xb2\x79\x1c" + "\x65\xbb\x22\x64\xbe\x1b\xfd\x73\x9c\xc7\x95\xb3\x64\x7b\xb3\xb3" + "\x34\x87\xb8\x9f\x3c\xa5\x3a\x8c\x0b\xc3\x30\xc6\x4b\x18\xe8\x7b" + "\xc0\x39\xa1\xe0\xa4\x39\x22\xf4\x83\x97\xe1\xd4\xe2\x9d\x0e\xeb" + "\x42\x27\xf4\x04\xf4\xf8\x93\x9a\x2b\x93\x44\xea\xd9\x22\x6d\x28" + "\x53\x8e\x95\x28\x97\x1f\xc1\xd7\xfe\x36\x27\xf2\xfd\x20\x37\x01" + "\x7c\x90\x80\xf1\x17\x6d\xb1\x2d\x07\x7f\xfb\xc3\xb5\xda\x9b\xa2" + "\x2f\x9f\xed\x88\x31\xa7\x28\xfd\x4f\x68\x5f\xbb\x56\xab\x1d\x12" + "\x01\x99\xc6\x74\x6b\x11\xfc\x9c\x8a\x7c\x43\xc3\x69\xef\x70\x1a" + "\xf8\x20\x91\xe5\x55\x08\x99\x8e\x31\x33\xbd\x0c\x3a\xad\x0b\x79" + "\x0f\x71\xde\x69\x21\x1a\x0b\x5d\x63\x77\xb8\x12\xe8\x24\xa5\x93" + "\x96\xaa\xfd\x3c\xa2\x3e\xc0\x49\xe7\x41\x8a\xf9\xd1\x1c\xe8\x03" + "\x9c\x7e\x99\x0e\x3b\x26\xfd\x31\xc0\x7f\x8b\x75\xa5\xd2\xdf\xf6" + "\x1b\x38\x9f\x3e\x36\x8f\x3c\x43\xd6\x15\x1c\xfb\x0d\x47\x41\x4b" + "\xb6\x17\xd8\xfe\x0b\xb8\xd3\x17\x7b\x29\xc5\xa7\xc6\x46\xfb\x64" + "\xce\xab\x01\x47\x61\x73\x75\x01\xee\xe1\xd6\x4d\xbd\x74\xaa\x84" + "\xc7\xda\x74\x9b\xe6\x2a\xa2\x68\x9c\xd2\xda\x19\x7f\xd6\x1f\xa0" + "\xc5\x5f\xc0\x07\xe3\x00\x6f\x7f\x34\x1f\xa4\xb7\x02\xce\x9b\xc0" + "\xaf\x0b\x6d\x7a\xd3\x4b\x69\xc7\xb4\xfe\x22\xd4\x4b\x26\xc8\x15" + "\xf4\xf9\x08\x0c\xbd\x7c\x77\x74\xf9\xb4\x2a\x2e\x87\xfc\x49\x81" + "\x7e\x99\xbf\x9a\x69\xae\xf3\x1d\xf8\xf2\xca\x8c\xe8\xfc\x57\xff" + "\x13\xb8\xfc\x3d\xe2\xfd\x8c\x98\xf7\x1d\x78\xff\x7f\xf4\xf7\x90" + "\xfb\x2b\x17\xc7\xf0\x6d\x09\xde\x7f\x0c\x7c\xfd\x90\x6b\xd8\x16" + "\x69\xb9\xe0\x31\x5f\x44\xfe\xed\x31\xf9\xa1\xe7\xad\xff\x62\xbe" + "\xe1\x31\x87\xf3\x37\xe9\xb2\x83\xfc\x16\xe4\x3f\x1c\x53\xff\xeb" + "\xc8\xef\x8f\xc0\xef\x44\xf4\xfb\x8c\x46\xbc\xff\x84\x79\x1d\x36" + "\x51\x12\xf2\x8c\x65\x5d\xc2\x7a\xec\x68\x31\xf7\x57\x86\x39\x26" + "\xff\x64\xe4\x4b\xd6\x69\x64\xd2\x69\x94\xcb\xfd\x88\x3a\x3e\x50" + "\x38\x64\xcc\x8c\x29\x93\x8f\x32\x19\xa0\xe3\x9b\x06\x5f\xc6\x29" + "\x53\x1c\x53\xa6\x9a\xfb\x51\xa8\x7a\xcc\x81\xa1\x91\x32\xba\x8e" + "\x8c\x84\xc1\x6d\xbb\x02\x30\x0e\xc5\xb4\x7d\x06\xea\x9d\x54\xa3" + "\xf4\xce\x15\xe0\xa1\x9b\x91\x76\x03\x60\xfe\x82\x65\x00\xb2\xea" + "\xf7\xf8\x82\x24\x5c\xb9\xc9\x8a\x77\xaf\x4a\x4b\x0d\x11\xdf\xdf" + "\xc4\xf7\x0c\x5b\x04\xe6\xeb\x32\x79\x55\x1a\xae\x48\xcf\x60\xfb" + "\x2d\x81\x75\xb0\x08\x7c\x43\x53\x30\xaf\xba\x55\x98\xc8\x84\xe7" + "\xb0\x5e\xc7\x35\x78\x4e\x00\xfe\x3f\xc7\x98\x43\x62\x23\xf2\x6d" + "\xa2\x39\x48\xe7\xb4\x5f\xea\xf9\x46\x9e\x37\x7e\x23\xa4\xde\x4f" + "\xf8\x93\xaa\x33\x97\xf9\x7d\x06\x9e\x7f\xaf\xe0\x4d\x78\x9f\xe1" + "\xe3\x7e\xba\x7e\x9f\x10\x66\xd8\x7d\x86\x4c\x4e\x78\x47\x96\x83" + "\x5c\xca\xfa\x50\x5e\x6c\x94\xef\x18\xe6\x6b\xb8\xde\x87\xeb\x0e" + "\x5c\x1f\xc0\xf5\x69\xd7\x27\x64\x77\x85\xa5\x7c\xf2\xf3\xc3\xb8" + "\x3e\x88\xeb\x3c\x5c\x1f\xc2\x75\x3a\xae\x77\xe3\x9a\xc2\x72\x82" + "\x71\x95\xe7\x5c\x7e\x8c\xb3\x8a\xd7\x78\x4e\x10\xc8\x65\x9a\xcc" + "\x43\xbb\x25\x2d\x34\xa5\x6f\x2c\xaa\x5f\xaf\x92\x73\x42\xf0\x07" + "\xa7\x8d\x55\xfc\xa1\xd2\xc2\x86\x5e\xea\x1b\x49\xd3\x75\x95\x2e" + "\x9b\x7a\x9a\x82\x9f\x07\xf8\xc7\x19\x57\xa1\x60\x25\x29\x1e\xd0" + "\xe1\xab\x72\xe6\x38\x75\x26\x44\xd6\x89\xeb\x7e\x97\x53\x08\x5c" + "\xeb\xb9\xcf\xbc\x34\xa1\x15\xf4\x33\x6b\xdc\x27\xeb\x68\x3e\xea" + "\x28\xe6\x3e\x30\x78\x4a\x28\x1e\x1d\xc3\xf7\xda\xc6\xa7\xa0\xa3" + "\xf0\x7e\xe3\x53\x9a\xce\x87\x32\x8f\x7c\xaf\x70\x59\xa2\xd7\x31" + "\x83\xfb\x47\xbe\x97\xe9\x19\xc7\x23\xf8\x32\x3d\xe0\xbe\x3a\x37" + "\x86\x2f\xcb\xc1\x97\x53\x99\xff\xb8\xcf\x98\x2e\xa9\x25\xd2\x26" + "\x30\x0d\xc3\xef\x53\xfc\xbd\x4f\x9f\x03\x2b\x5d\x70\x75\x7d\x8c" + "\xae\x92\xfc\x1f\xa3\x3b\x7a\xb9\xbf\x12\xcb\x59\xa6\xae\x6e\xf5" + "\xd2\x1b\x5e\x69\x7f\xd6\x6a\x6f\xf3\x7b\x3f\xf8\x83\xeb\x4d\x2c" + "\x61\x5d\x70\xb5\xd7\x78\x2f\xdf\xa5\xcd\xca\x62\x59\x49\x2c\x96" + "\xef\x90\x96\xdc\x62\xbc\x33\xea\x49\x2c\xe5\x77\x76\xfb\x08\xdc" + "\xb3\x55\x3a\xdc\xc4\x78\xf6\xa3\xa8\x3e\xeb\xbc\x89\xc8\xf4\x95" + "\x4a\x4a\xf2\x84\x4e\xd0\xa2\x90\x08\x7f\xb5\x92\xc6\x79\x42\x07" + "\xe9\x46\xa2\x34\x4f\xe8\x08\x65\x12\x5d\xe7\x09\xed\x82\x3d\xb3" + "\x9d\xdf\xbf\x77\x63\x65\x42\x02\xae\xae\x2f\x93\x29\xc1\x13\x6a" + "\xa4\x2f\x91\x19\xd7\x52\xba\xe7\x39\x11\xf0\x84\x96\x23\x5f\x31" + "\x2d\x0a\x8b\xbe\xb9\x49\xe2\x1f\x05\x61\xb2\xcd\x7f\x4e\xb8\x3c" + "\x21\xcc\x2d\x42\xed\x48\xd7\xc4\xa2\xf0\x27\xf8\x05\x84\x56\x7d" + "\xb6\x6a\x51\xb8\x4f\xcc\x79\xee\x3d\x3c\xff\x43\xcc\x49\x72\x09" + "\xf4\x93\xf0\x84\xb2\xa9\xd3\xef\x47\xfe\x19\x24\x6a\xce\x3a\x1f" + "\xbf\x60\xa2\x21\xd8\x24\x5a\xcd\xd9\x2a\xb4\xa7\x61\x08\x6d\xc1" + "\x78\xfd\xfd\xa1\xcd\xb8\xd6\x9e\xdd\x2d\x9f\x93\xcf\x1e\x40\x5b" + "\x1a\x6e\xaa\xc4\x3c\xc3\x89\x76\x84\x7d\x02\x76\x8c\xd9\xe3\xfc" + "\x80\x52\xb7\xb2\xad\x9e\x8d\xb9\xda\x47\x84\x7e\xb0\xea\x70\x1b" + "\x78\x8e\x26\x52\x50\xae\xf6\xec\x6b\x12\x46\xf5\xd9\x63\xd6\x04" + "\xe1\x83\xde\xb6\x32\x2d\x3c\xa1\x0f\xf0\xfb\x88\x98\x06\x9e\x90" + "\x1f\x30\xc9\x8a\x72\xc7\x86\x52\xce\xb6\xe0\xd7\x35\x94\xd2\x67" + "\x11\xa9\x7d\x13\x85\x3b\xe3\x7d\x01\xdb\x41\x54\xf7\x65\xe2\x79" + "\x26\xcf\x31\x25\x2d\xc3\x34\x56\xd4\xf4\x65\x82\x5f\xe6\x82\xef" + "\x80\x6b\x5f\xbe\xac\xa7\xb6\xef\xdb\x7e\xc1\x6d\xe8\xfb\x96\x6a" + "\x43\xdf\x37\x55\x9b\xfa\x9c\xba\x1c\x71\xda\x46\xdc\x2f\x0e\x70" + "\xbe\xea\x3e\xa7\x48\xee\xab\x0a\x42\x36\x41\xd7\x4a\xa6\x23\xe8" + "\x5a\xc9\xb4\x04\x7c\xa7\xc7\x59\x8d\x76\xf4\x55\x01\x9f\x06\x94" + "\xfb\xc9\x90\xb4\x67\xfa\x5a\xfc\x0a\xce\xdb\x80\xb3\x44\xc2\x49" + "\xee\x6b\x01\xac\x63\x61\xb7\x83\x16\x95\x89\xe0\xa2\xd0\xd6\x50" + "\x41\x19\x25\x4e\xa1\xca\x04\x9e\xcb\x78\x9c\xc5\x68\x67\x1b\xae" + "\x73\xf1\x9e\xae\x44\x5d\xef\x01\x6e\x0b\xd7\x87\x7a\x8e\x01\xe6" + "\xef\x00\x6b\x39\xe3\x37\x68\x22\x1b\x9e\xbb\x06\x37\x4b\xfc\x82" + "\x22\xd9\x67\xd7\x92\x7d\x16\x83\x87\x98\x7f\x14\xdd\x98\x6f\x5e" + "\x23\xf0\x97\x6d\x91\x53\x84\xf0\xce\xe6\x71\x72\x7a\x23\x75\x96" + "\x20\x8f\x93\xdf\x97\xe2\x7e\x01\xee\xb7\x13\xf3\xcf\xc2\x12\xff" + "\xd6\xa9\x95\x25\x09\xc8\xff\x5e\x41\xc8\x42\x8f\x97\x98\x2b\x3b" + "\x4b\x7a\xf1\xae\x97\x90\xe6\xf2\x38\x1b\xe5\xdc\x0b\xfd\x1a\x0a" + "\x27\xfb\x1a\xc2\xd5\x7d\x3d\xa9\x7e\x97\xf0\x38\x4b\x91\xb7\x84" + "\x6e\xac\xb4\x24\xc8\xfc\xce\xe5\xb2\x3d\x5a\x6d\x25\x71\x99\x8e" + "\xa2\x83\xc4\x73\x38\xb4\xdd\xd7\xd1\xbb\x9d\x79\x54\xd3\xaa\x7d" + "\x45\xe0\xcf\xa1\x8e\xa2\x5d\xb4\xa0\xb7\x72\x2c\xe8\x91\x80\xf4" + "\x70\x47\x6f\x1b\xf2\xb6\x2b\x9e\x2d\x0b\x59\x3b\x8a\xb6\x53\x28" + "\xb9\xaf\x2b\x54\xed\x73\x2e\x2a\x1b\x12\x0b\x8a\xc4\x7b\x8f\xf5" + "\x56\x82\x4f\x0f\xd2\x82\x33\xa1\xc4\xce\x12\xf0\x7c\x59\x00\xe9" + "\x21\xc9\xff\x0b\xce\xf4\x8b\x85\xcf\x88\xbe\x45\x65\xff\x10\x1d" + "\x45\xcb\xe9\x71\x3f\xa5\x5e\xb1\x55\x68\x2c\x17\xed\xdd\x07\xe9" + "\x8a\x0f\x7a\x88\x65\x62\xfe\x52\x4d\x2c\x38\xd3\x27\x1e\x7f\x06" + "\xf3\x56\x67\x36\x70\x04\x5d\xfc\xbb\x98\xde\xc1\x8e\xa2\x23\xc0" + "\x01\x72\xe3\x9c\x81\xb4\xd7\x90\xb7\xd5\xfa\xd8\x19\x1b\xb5\x77" + "\xef\xa2\x50\x4a\x5f\x57\xb8\xa6\xaf\x47\x4b\xf1\x59\x44\x0a\x68" + "\x5f\xe3\x2b\x0a\xa7\xf8\x1a\x42\x35\x3e\xa7\xa8\xf5\xf5\xa0\x9f" + "\xc6\x71\x9f\x0f\xba\xc9\x81\xe7\x53\x83\x92\x8f\x7c\xe8\xa7\x73" + "\x76\xd8\xcf\x82\x69\x29\x6a\x7c\x41\x25\x03\xe7\xec\x43\x29\xe7" + "\x2c\xa2\x16\x57\xc9\x87\xe7\x32\x99\x2f\xc3\xd0\x77\x48\xfb\x72" + "\x18\x65\xf1\x7e\x26\x7e\xb9\xf8\xe5\x23\xed\x00\xe0\xa7\x31\x7c" + "\xad\xfa\x5c\x0b\x60\x1e\x9b\x4a\x64\xe9\xf4\x77\x13\xaf\x5d\xc8" + "\xb9\xbe\xf3\x6f\xc0\x99\x79\x2a\x84\x6b\x08\xb2\x71\xee\x80\x76" + "\x47\xbd\x94\x41\xd4\x77\x6c\x51\xf8\x4e\xf1\xf8\x05\x96\x27\xa4" + "\xd7\x00\x46\xea\xb9\x9e\xa0\xe4\xd7\x73\x1f\x33\x0e\x43\x9b\x33" + "\x19\x8e\x19\xef\x83\xa2\xf6\xfc\x93\x7e\x91\x49\x5a\xf5\xf9\x22" + "\x2d\xf9\xfc\x31\x51\x7d\x1e\xf2\x70\xbe\x2a\x5c\x7d\xbe\xe1\x1b" + "\x49\xc2\xc7\xfa\x6b\xe8\x3b\x84\x7a\x0e\x53\xe8\x0e\x21\x3a\x4b" + "\xb6\xe3\xfe\x5d\x92\x32\xec\x3c\x21\xf9\xaa\xa3\xf7\x04\x68\xf9" + "\x3a\xd2\xdb\xa4\x1e\x63\xda\x8b\x94\xf3\x55\x8f\x5f\x98\x58\xc9" + "\xbc\xf0\x78\x09\x55\x8a\x9a\xf3\x4e\xad\xe6\x7c\x51\xb8\xe6\x7c" + "\x83\x96\x82\x7a\x52\x2f\x8c\x0f\x4a\xb9\xbe\x00\xbe\x3e\x8c\x32" + "\xef\x4a\x7e\x12\x35\x17\x2c\xa3\xe9\x52\xd6\x69\xac\xc3\x16\x85" + "\x82\xcc\x5f\x1f\xb3\xfe\x63\x5d\x06\x5d\x50\x60\xe8\x32\xd6\x63" + "\x3c\xc7\x62\x5d\xa6\xe9\xba\x4c\xd3\x75\x99\x16\xa1\xcb\x40\x7f" + "\x33\xf8\x3d\x28\xf5\x17\xe8\xc9\xba\x6b\x51\x38\x4b\xc4\xea\x2e" + "\x2e\x13\x86\x5e\xd2\xa0\x97\xf0\xeb\xd2\x94\x5e\xb2\xeb\x7a\xc9" + "\x64\xe8\x25\xc0\x63\xbd\xad\xc5\xd3\x4b\x9a\xae\x97\xc2\xba\x5e" + "\xd2\x74\xbd\xa4\x5d\x4a\x2f\x25\xf7\xa1\xbd\x7d\x55\xbc\x9e\x0a" + "\xb9\xa9\xe4\x7e\x5e\x54\xa6\x55\x42\x67\x80\x8e\x7d\x55\x9a\xd2" + "\x47\x07\x30\xbf\x32\xb1\x3e\x0a\xa3\xbc\x66\xe8\xa3\x80\xd4\x1b" + "\xc7\x58\x27\x71\xdf\x15\x84\x1c\xc4\xba\x48\xea\x9d\xd0\x75\x21" + "\xd6\x3b\xa0\xdf\x9d\xb1\x7a\x07\xf0\xba\x70\x6f\x53\xf5\xfb\x2c" + "\x98\x5d\x87\xac\x21\x97\x58\xe4\xf4\x4b\x1a\x15\x38\x4b\x2b\x99" + "\xe7\xc2\xd5\x3e\xbb\xe8\xac\x24\x2d\x19\x32\x02\xfd\xe4\x71\x86" + "\x09\xb2\x5b\x14\x82\xbe\x80\x1c\x38\xc3\x90\xe5\x05\xbd\xfd\x9e" + "\x85\x25\x34\xf6\x71\x7f\xa6\x6d\xc1\x19\xe1\x03\x6d\xbc\x8f\x97" + "\x54\xd2\x42\x7f\x26\xf4\xc3\xbb\x34\xbf\x5b\x68\xf3\x0b\xbd\x0e" + "\xc8\x89\x73\xc1\xea\x56\xeb\xe3\xcf\xd8\x68\xe1\x05\xd1\x0a\xfd" + "\xf1\xff\x2e\x38\x63\xb3\x2e\xe9\xa6\x2f\xcc\x5f\x2a\xb4\x30\x64" + "\x11\x6d\xed\x41\x9b\x83\x90\x45\x4b\xb8\xc6\x67\x87\x1c\x16\x85" + "\x20\x8f\x91\xb2\x28\x52\x7d\xa7\x70\xef\x90\xed\xa8\x3e\x67\x07" + "\xfe\x41\x4d\x8e\x77\xdd\x72\x4e\x0b\x5e\xb7\x4b\xf9\x49\x41\x7a" + "\x8d\x92\x47\x4d\x28\x79\xd4\x98\x76\x26\x25\x8f\xdc\x27\x78\x3f" + "\x13\xbf\x5c\xfc\xa2\xe4\x91\xe5\x4c\xb0\x9c\x95\x5c\x18\x91\xb3" + "\x67\x74\x39\x4b\x51\x72\x16\x86\xad\x12\xde\xac\x64\x8d\xe1\xf3" + "\xbc\x77\x58\xd6\x52\xcf\x17\xe1\x3e\x41\xf1\x8d\x94\x37\x96\x35" + "\xe8\xd8\xf3\x55\x90\x3f\xc0\x13\x3e\x96\x03\xf0\xe5\xdf\x79\x3c" + "\x5c\x58\x22\xfe\x5e\x10\x9e\x88\x3e\x3f\xdf\x00\x7d\xf7\x8f\x05" + "\xbd\xe2\xef\xd0\x75\xcd\x90\xa5\x22\xc8\x90\x13\xb2\x54\x05\x99" + "\x62\x59\xb2\x84\x37\x33\xcc\x0b\x96\x61\x18\x72\x3c\x8d\x96\xa5" + "\xd1\xd6\x5d\x03\x6e\x47\xaf\x97\xde\x6d\x67\x9b\x06\xf7\x41\x2f" + "\xfd\xa6\x59\xdd\x5f\x67\xf6\x52\xf3\x07\xd2\xd6\x81\xfc\x95\x54" + "\xd0\x55\xa7\xe9\xba\x16\xf0\x3a\xe1\x3e\x19\xf7\x47\x16\xdd\xf8" + "\x9e\xd0\xea\x57\x71\xbd\x01\x96\x41\xe1\x9e\xc1\x36\x5c\x0e\x78" + "\xd0\x22\x02\x99\xc9\x22\x55\xdc\x21\x86\xec\xbc\xb6\x67\xc5\x73" + "\x2a\xda\x3f\x19\xd7\xf4\xbd\x03\x94\x81\x9f\x7d\xaf\x5b\xab\x64" + "\xfb\x0a\xf7\x59\x62\xa3\x7d\x7c\xed\x06\x9a\x62\xf5\x93\xa5\xc9" + "\xad\xe5\x5b\xb7\xda\x78\x8d\x2b\x83\xef\x85\xfb\x35\x6a\x1a\x20" + "\x33\xaf\x43\x68\x69\xa8\xcf\x69\x15\x62\x7d\x26\x35\xad\x83\x6e" + "\x70\x93\xbd\xc9\x2d\x0e\x85\x03\x4c\x83\xb3\x4e\x03\x17\xc6\x0d" + "\x78\x5e\x03\x3c\xdb\xbf\x59\x96\x43\xbf\x73\x52\xdc\xb5\x61\xb4" + "\x73\xb8\xfd\xf1\xdf\x5f\x9f\x6c\xd0\x64\x94\xf7\x53\x0c\x3a\x8d" + "\xb2\x8e\x68\xe6\x71\x3c\xbc\x41\xf8\xea\x9e\x24\xa6\x85\xdd\x15" + "\x12\xff\x07\x74\xac\xac\x08\xd3\x35\x8b\xca\xae\x15\x9e\x5e\xd1" + "\xea\x71\x9e\xa1\x26\xbc\xaf\x28\xc7\xd8\x99\x22\x20\x1b\x62\x52" + "\xff\x06\x11\xe2\xb5\x23\xd4\x51\xef\xa5\xec\x2c\xd5\x17\x7d\x41" + "\x39\x67\x4d\x16\x93\x00\x2b\x8d\x61\x75\xa0\x7c\xb8\x46\x4c\x46" + "\xbe\x16\x2f\xfd\xf1\xb0\xcc\x97\xdc\x17\x2c\xd9\x44\x9f\x3f\x4d" + "\xd7\xfb\xe4\xdc\xa2\x5a\xcc\x60\x5d\x80\x34\x1b\xd2\x42\x80\x3f" + "\x13\xf9\x7b\xbc\xf4\xb6\xbe\x26\x71\x7d\xc8\xc8\x87\x7b\x69\xc7" + "\x47\xf1\x4f\x82\x5c\xbc\x47\x7f\x39\x46\x36\xc7\x12\xf4\xe5\x7c" + "\xe3\xcf\x86\x5f\x4e\xfc\xd7\x23\xba\xdc\xe7\xec\x87\x8e\x76\x6d" + "\xa1\x49\xe8\x1f\xe0\xf7\xc5\x67\x30\x4f\x39\x25\xdc\x5f\xb4\xfc" + "\x60\x53\x10\x73\x89\x2f\x96\x7b\xa9\x3a\x7b\x34\x7a\xa2\xbc\x5d" + "\x1b\x10\x3d\x75\x1b\x86\x69\xf9\x21\x74\xa3\xe0\x7b\xd6\x45\x4d" + "\x48\x67\xba\x01\x4e\x9b\x41\xb3\xd1\xfb\x45\x64\xa9\x39\xee\xe4" + "\xc9\xc2\x2d\xa8\xf5\x0b\xbc\xa7\x35\xf9\x06\x45\x87\x73\x96\x7e" + "\xe8\x11\x5e\x97\xc6\xdc\xcf\xbf\xde\x2e\x82\x01\xf7\x64\xd8\xff" + "\x53\x9a\xf5\x75\x2f\xbf\x27\x34\x8f\x75\x4b\xdc\x31\x8b\xf7\xe0" + "\x46\xe0\xdf\x30\xb7\x73\x12\x91\xd4\x4d\xb6\x59\xa5\x15\x0a\xef" + "\x20\xc3\x6d\xad\x38\x4f\xdd\x78\xbf\xde\x2f\x7a\x44\xfd\xac\x22" + "\x9e\x6b\xb4\x6e\x18\xe4\xb4\x79\xe0\x6d\xd1\xba\x8e\x71\xba\x61" + "\x5e\xeb\x17\x06\xe9\x94\x93\x12\x9b\x86\xd7\x9b\x6e\xc8\xe2\xf5" + "\x25\xb5\xae\x36\xf9\x90\x97\xa6\x16\x19\x78\xb1\x1d\x02\xfa\x32" + "\xad\x82\x6c\x8f\xf0\x5e\xc7\xfa\x72\x11\x64\xbb\x04\x79\x3f\x30" + "\xda\xc0\xed\xd3\xdb\xe5\x8b\x6c\x17\xef\x89\x59\xcb\x15\x0d\xd6" + "\x97\x91\xc5\xa1\x68\x6d\xe1\xf6\x72\x5b\xb8\xcd\xb2\x2d\x52\xc7" + "\xf2\x7c\xe2\x56\xcc\xd9\x64\xba\x3d\xe0\xbe\x21\xdb\x4b\x37\x99" + "\x15\x4f\x4d\x3e\x14\xcb\x47\xc3\xfd\x98\xdc\x77\x0c\x73\xdc\x2f" + "\xb8\x34\x71\x12\x30\x7f\xaf\xd6\xea\x6e\xf8\xbd\xc6\xb6\x78\x10" + "\xfc\x6b\x4b\x9a\xc1\x63\xb1\xa7\x9c\xf5\xad\xcc\x7b\x25\xf2\x76" + "\x23\xcf\x3b\x7a\xde\x77\xd4\x1e\xa1\xbc\x8e\xe5\x2b\xc6\xb0\xdf" + "\x01\x8f\xe3\xbc\x76\x0c\x3a\x67\x19\xcf\x02\xcf\xb8\x56\x89\x1d" + "\x49\x33\xe2\xe3\x72\xfe\x18\x8f\x65\xe1\x01\xd1\x8b\x7a\xae\x66" + "\x9e\x72\x95\xd1\xe7\xc0\x97\x1f\x56\x6c\xa1\x2b\x99\x9f\x44\x8a" + "\xc8\x56\x74\xff\xd2\x24\xe1\x86\xdd\x0b\x8d\x5a\xb2\x81\x3e\x0f" + "\x39\x9a\x71\x9a\xbe\x34\xbd\xa0\xdc\x01\x5c\x89\xea\xce\x12\x49" + "\x1d\x94\x22\x66\xf2\x1c\xa7\xe9\x2c\xaf\x25\x7d\x29\xcf\xe0\x45" + "\xdc\x2f\xb9\x94\xbe\x00\x5d\x73\xd5\xda\xc6\x97\x7e\xcf\xfb\x1a" + "\x27\xe9\x4b\x87\xb9\xbd\x6a\x4f\xf5\x4b\xaf\x89\x01\xb1\x44\xa8" + "\x31\x6d\xa6\x97\xbe\xe4\xc5\x35\x57\xfe\xdc\x54\xa8\x3f\xcf\x44" + "\xbe\x5d\x62\x40\xe3\x3c\xb9\x48\x3b\x28\xdc\x09\x2c\x13\x47\x50" + "\x77\x97\x97\xee\xcc\x55\x7d\xf3\xa5\xfd\x0c\x6b\x14\x1c\x66\xa2" + "\x6f\x89\x79\xf3\x14\x7d\xf9\x2e\x47\x05\xaf\x95\x7e\xf9\x2a\x29" + "\x17\x80\xd5\x64\x52\x7a\x1b\x36\x6a\xee\x3e\xb7\x56\x04\x1d\x5d" + "\xa4\xed\x1c\xdb\x22\xef\xf5\x77\x42\x1f\x47\xe3\xc2\xaf\x9f\x55" + "\xda\x3a\x91\x79\xfc\xcb\x8d\x12\x0e\xf8\xbe\x75\xe2\x69\x7e\xde" + "\xcb\xcf\x7e\x9b\xa5\xc5\xd3\x90\x83\xfa\x4f\x73\xbd\x8d\x6a\xce" + "\xff\xe5\xbd\xfd\xa8\x23\xe0\xfe\x72\xa3\x97\xa6\x95\xca\x3d\x9e" + "\x34\x4b\xcb\x68\x7b\xd7\x2c\x3b\x2c\x73\x4a\xa6\x6f\x7c\xac\xa3" + "\x59\xca\x5f\x66\x7f\xf2\xb9\x5c\x5d\x6f\xf0\x3a\x50\xf2\x49\xba" + "\x71\x49\x87\x5d\xf2\xb7\x49\x98\xbe\x1c\xfa\x99\xe6\x33\xf1\x3e" + "\x9c\x52\x5f\x37\x2e\xb9\xf8\x97\x99\x85\x1f\xb4\x5c\xe6\x7c\xfd" + "\x39\x1f\xbf\x62\xfc\x8e\xe0\x79\xbe\xa4\xdd\x9e\xe5\x09\x5e\xbc" + "\xeb\x87\x5d\xcf\xcf\x5e\xca\x44\xda\x64\x13\xec\x79\x79\xdf\xf4" + "\x39\x5e\x4b\xc8\x5c\x8e\x3e\xe8\x55\x7d\x71\xa3\x5c\x4f\x01\x6e" + "\x4c\x77\xe1\x6a\x10\xc1\xb6\x0a\x3f\xf0\xce\xdc\xd5\xd6\xe0\x27" + "\xc7\x97\xb8\xfd\x99\x0d\xdc\x26\x3f\xe8\xcf\xd7\xf5\x0d\xc2\x77" + "\xb4\x31\x44\xbc\x1f\x08\x58\x90\xff\xd5\x6d\x52\xef\xef\x9c\x55" + "\xcf\xf0\x74\x9e\x10\x46\xfb\x65\x9f\xd4\x5b\x5a\xb8\x2f\x01\xeb" + "\x23\xb4\xdd\x7a\x96\x6e\xbc\x41\xa4\x8f\x6d\x39\x5a\x44\xb4\x17" + "\x7a\x04\x63\x8d\xdc\x9b\x68\x92\xfe\x08\x37\x62\xfc\xff\xf2\x7c" + "\x63\xff\xaa\x06\xef\x6b\xf1\x0e\x63\x8f\xaf\xa3\x28\x48\x0c\x2b" + "\xcc\xed\x43\xf9\x77\x35\x9f\x19\x63\x75\x82\xd8\x61\x69\xa9\x28" + "\x81\x9e\x19\xd6\x5b\x99\xed\x5b\xce\x88\xa0\xd1\xbe\xa3\xcd\x2c" + "\x0b\x37\x82\xff\x9f\xf2\x8e\xca\xff\xc3\x38\x7f\xa5\xec\xe8\x64" + "\xd5\x67\x1a\xe8\x12\xdd\x67\x5f\x71\xaa\xfe\xba\xf1\x60\x74\x7f" + "\x7d\x05\xa3\xfc\x8d\x7e\x5c\x93\xf1\x9b\xa4\x9e\x23\x7f\x37\x7a" + "\x23\x9e\xa7\xe0\xb7\x1c\xf8\x60\xfc\xff\x52\x91\xea\x07\x4e\x47" + "\x3b\x98\x47\xce\x91\x45\x1b\xca\x27\xde\x1f\xe6\x74\xe6\x67\x4e" + "\xd7\x60\xcf\xe0\x99\xf0\xde\xc6\xb2\x5a\xa7\x51\xd4\x7b\xcf\x76" + "\xf0\xdc\xa6\x41\xc6\xff\x01\x86\x65\xdd\x5a\x55\xc5\x7c\x8a\x3c" + "\xa0\x51\x55\x55\xc0\xfd\x95\x25\x06\x5d\x91\x36\x97\xdf\x33\x4f" + "\x22\xbd\xd4\x4b\xc5\x0e\xb9\xff\x8b\x39\x61\x7c\x5b\xe3\x2b\x0d" + "\xc3\x36\x59\xf2\xb9\x03\xac\x8f\x7a\xe9\xab\xfb\xa1\xb3\xd0\xb7" + "\x63\x0f\xa9\xb1\xe6\xab\xaf\xf1\x33\x74\xe5\x87\xb8\x6f\xee\x80" + "\x4e\x1a\xac\xd5\x9a\x87\x4c\x34\x76\xd0\x44\x39\xa1\x9d\xab\xa6" + "\x84\x52\x07\x0e\x7a\x7a\x0e\x53\x67\xe8\xe7\xe4\x78\x52\xc2\x78" + "\xd9\x03\x1e\x70\x95\x89\xf0\x1b\x83\x07\xcc\x9e\x50\x5f\x2b\xc6" + "\xe6\x6b\x4f\xd3\x57\x25\x3d\x5e\x38\x89\x51\xff\x71\x09\x5b\xd1" + "\xc7\xb6\xca\x52\xbb\x52\x84\x6a\x4f\x09\x3f\xec\xbb\xf1\x35\x83" + "\x34\xe5\x95\x4d\x94\xd5\x38\x48\x93\xf7\x0d\x52\xa6\xf8\x38\xd3" + "\xd4\x08\xbb\xed\xf1\x0b\x36\x82\x4e\xc8\x4f\x2d\x21\xcb\xbe\x4d" + "\x24\x79\x24\xbc\x03\xf6\x5b\x08\xf6\x5b\x5f\x26\xeb\xc6\x61\xfb" + "\x6d\x48\xda\xc5\x62\xbf\xe4\xa3\x1a\xb1\x3f\xa5\x88\x12\x92\x0b" + "\xc9\x06\xfc\x5c\x67\xe9\x2b\xff\x91\xdc\x0d\xdb\x11\x6d\xf6\xea" + "\xed\x05\xed\x7a\xad\x45\x34\x56\xb6\x15\xfa\x5a\xec\x18\x7b\x68" + "\xd4\x71\xd8\xc4\x3c\xe5\x67\xb9\xe1\x36\x9c\xe3\x3d\xea\xc3\x13" + "\x83\xe6\xf5\x8d\x22\xc8\xe9\xa5\xd7\x89\x20\xd2\xbb\xb8\xee\x43" + "\x48\x0f\xb8\xa7\x90\x37\xf1\x74\xf1\x68\x3c\x8a\xb9\x91\xae\x57" + "\xa6\x6c\x15\xa6\x4a\xe6\xd1\x9e\x2d\x21\xd8\xde\x67\x59\x66\xa7" + "\x54\x2e\x2a\x16\x21\xc7\x1a\xf6\x17\x98\x52\xc2\xbe\x0c\xbc\x87" + "\xf9\x33\xd8\x36\x9f\xe6\xbf\xc0\xe3\x05\xcf\x15\xac\xc5\x80\x59" + "\x7b\xae\x47\xb8\x32\xe9\xb3\xfa\x4f\xa0\x9d\xc9\x2f\x4e\x60\xbf" + "\x9e\x29\x47\xbc\xb4\x20\x83\x71\x97\xbe\x3b\xd0\x9d\xb0\xb7\xae" + "\x04\x5e\x41\x3f\xe8\x80\xf7\x18\xff\xef\xeb\xd1\xf7\x9b\x7d\xbc" + "\xd7\x8b\x34\x8c\xff\xdf\x98\xc2\x69\xa5\xd7\x91\xbd\xd4\x21\x7a" + "\x46\xb3\x99\x78\x0f\x1c\xf0\xae\x0e\xb8\x6f\x9a\x6c\xc0\xc1\x38" + "\xf5\x93\x7e\xd3\x37\xbf\x89\xb4\x99\x06\x1c\xe4\xb9\x0a\xcf\xb9" + "\xc3\x79\x54\x99\xfc\x88\x32\xdf\xec\x37\x7d\xe5\x27\x48\x2b\x8e" + "\x29\x53\x1e\x53\xa6\x3a\xa2\x4c\xa5\x5e\x4f\x73\x4c\x99\x43\x31" + "\x65\x5a\xe3\xe0\x76\x22\xa6\x4c\x77\x4c\x19\xff\xc5\xb8\x4d\xb5" + "\x44\x97\x99\x6a\x8f\x2e\x33\x35\x33\x82\x96\xec\xc7\x93\x85\xb4" + "\xec\x98\x32\xf3\x63\xca\x2c\x31\x9e\x47\xa1\x71\xf2\xfa\xbd\x64" + "\x07\x6f\xb2\xaf\x98\xef\x45\xf4\x4f\xff\xf7\x9f\x0a\xe8\x65\x1b" + "\x2e\x6e\xd7\xd4\x83\x31\xf5\x1d\x89\xa9\xaf\x3d\x4e\xbb\xbc\x31" + "\x65\x7c\xd1\x65\xa6\x51\x44\x99\x66\x55\xcf\xb4\x8c\xe8\x32\xd3" + "\x26\xc7\x94\x99\x71\x31\x5f\x4d\xcb\x8d\x29\x93\x1f\x53\xa6\xe8" + "\x53\x68\xc1\xe3\xb8\xf2\xa3\x9b\xc0\xb6\xf2\xdd\xb0\x11\xa6\xfd" + "\x89\x7d\x31\x78\xdf\xf5\x07\x83\xc1\x24\xde\x0f\xe4\xf1\xea\xa8" + "\x33\x88\xb1\x65\x1a\xf4\xec\xad\x59\xc6\x98\xc5\x7e\x2a\x2c\xd3" + "\xca\xc6\x9e\xd6\x30\x9a\x2d\x2a\x7d\xdd\x74\x7f\x39\xae\xeb\xe8" + "\x24\x1e\xa7\xb2\xcc\xc3\x36\xb1\xf2\x79\x23\x05\x27\xeb\x61\x63" + "\xdf\xb7\x49\xf9\xbf\x24\xb0\x4d\x7e\xd4\x29\xcb\xcc\x8c\xb0\xa3" + "\xb9\x7e\xff\xe1\x4d\x41\x73\x34\x1e\x59\xf6\x4b\xe0\x91\x0c\xdb" + "\x28\xbf\x13\x56\x11\xef\xe7\x77\x34\xc2\x06\x82\xdd\xcf\xb8\x9d" + "\xa4\xac\x66\x69\x93\xad\x19\x24\xbe\xf7\x94\xdf\x2e\xf7\xfb\x95" + "\x4d\x9a\xd5\xd5\x86\xfa\xd9\x76\x6f\x2b\x39\xcf\x3e\x59\x18\x7f" + "\xd9\x76\x9b\x9e\x74\xb4\xdc\xc7\x78\x1d\x37\xfc\x62\xbc\x34\xdd" + "\x2c\x6d\x8d\xfa\x59\x79\xec\x8b\xc0\x3e\x3b\x47\xfd\x33\x39\x0f" + "\xf8\x7f\xda\x07\x46\x7b\x31\xd6\x83\x27\xb2\x0e\x5e\x8a\x66\xaa" + "\x0f\xa7\x4f\x89\xe6\xc9\x24\xf0\xca\xf4\x9c\xe8\x7e\x9f\x9e\x17" + "\xdd\xef\xd3\x0b\xa3\x79\xd2\x04\x9e\x9c\x5e\x1a\x53\x66\x7b\x4c" + "\x99\x5d\x11\x65\xea\xf5\x7a\x0e\xc4\x94\x69\x89\x29\x73\x2c\xe2" + "\x19\x6d\x9c\xde\x35\x3c\xf7\x91\x3e\x57\xd3\x7b\x22\x9e\x4d\xbb" + "\xa4\xfe\x9c\x1e\x32\xd2\x78\xed\x68\xdf\x6e\xe5\xf3\xa3\xe0\xdd" + "\x6c\x8f\x91\x77\xe4\xbf\x79\x4a\x34\x0e\x37\x67\x47\xe3\x70\xf3" + "\xb0\xfc\xeb\xbe\x02\xbf\x3d\x45\xb7\x4c\xd6\x7d\x05\x7a\x31\x66" + "\x2f\xe2\x67\xc0\x6a\x40\x7e\xd0\xe1\xe6\xf2\x18\x78\xd5\x31\xf0" + "\x1a\x23\x9e\x6d\x78\x3e\x18\xd1\x06\x5b\xa2\x9d\x12\xc0\x2f\xb0" + "\xdf\x6e\x6e\x33\xd2\x79\x4e\x09\x7c\x7b\x5c\x72\xac\xc9\x61\x5f" + "\xb6\xf4\x93\x74\xf3\x9b\x3c\xff\xd4\x61\x46\xca\x3f\xa9\x76\xdd" + "\x62\x8e\xc6\xe3\x96\x8c\x68\x3c\x6e\x99\x1c\xd1\x2e\xbf\x75\x2b" + "\x3d\x60\x0d\x3d\xf8\x30\xdb\x3e\xec\xbf\x29\x7d\xca\xb6\xc0\x66" + "\xbb\xc0\xeb\xef\x41\x3a\x55\x4a\x89\x1e\x67\x0f\xe6\x72\xa2\x79" + "\x54\x7e\x4a\x9f\x55\xa8\x7c\xb9\xc8\x01\xf8\xdb\x0d\x7e\xd4\x76" + "\xce\x2a\xd4\x76\x8c\x29\x47\x1a\xf4\xdf\x74\x9b\xb2\x73\x93\x8e" + "\x09\x57\x7e\x03\xe8\x89\x79\xd1\x8c\xe7\xf4\x79\x44\x29\xfb\xa4" + "\xb1\xdf\x2c\xc6\xf8\x64\xb5\xef\x7f\x4b\x7b\x04\x5f\xfb\x1d\x9b" + "\xee\x14\x27\x69\xc6\x0e\xb6\x01\x58\x46\xd9\xb7\xed\x68\xc8\x47" + "\x3c\xf7\xf6\x84\x4e\x4b\xdb\x0d\xef\xeb\x55\xd9\x19\x96\x88\xb2" + "\x3e\x7d\x6e\xdc\xc3\xef\xa6\x85\xc8\x7c\xd4\xef\x23\xc0\xc9\x50" + "\xf6\xde\x8c\x1d\x47\x21\xaf\x28\x93\x6d\x94\xe1\x79\xb4\xdc\x43" + "\x2e\x25\xf3\xd4\x72\x32\xb7\x6e\x3a\x29\x61\x1b\x7e\x22\xb0\xa5" + "\x7b\x3d\xe5\x3d\xe4\xf1\x77\xf1\x5a\x97\x59\xf9\x04\xcd\xa8\x4f" + "\x0c\x92\xa5\x7f\xc7\x2c\xc8\xcc\x8c\xfa\xf0\x8e\x59\xf9\xc0\xad" + "\xc4\x4b\xb7\x1c\x66\x7d\x13\x49\xbb\x79\xf3\xf2\x1e\x5c\xb4\xe0" + "\xa6\x6f\x3f\x78\xdf\xe2\x79\xb7\x3b\x16\xaf\x7e\x7a\xc5\xf2\x9b" + "\xd6\x3e\x5b\xea\xd8\xb8\x6e\x75\xe9\xea\x35\xab\x1c\x59\xce\x1b" + "\x9c\x8e\xa5\xa5\xea\x9a\x59\xbc\x74\x7d\xe9\x6c\xbe\x9d\xe2\x28" + "\x59\xb7\x62\x83\xbc\xbd\x71\x3c\x45\x03\x59\x5d\xba\x62\x9d\xe3" + "\x86\xe5\x53\x1c\xf7\x2c\x5d\x5d\xfc\xec\xba\x15\x71\x61\xdd\xee" + "\x58\xb7\x62\xdd\x8a\xa5\xcb\x1d\xb3\x1d\x59\x0c\x39\x12\x5c\x44" + "\x7f\x66\x19\xe3\x18\x8f\x5f\x75\x6e\x71\x5c\x1f\xcf\xbc\x8a\x7f" + "\x6e\x5d\x7e\xf1\x58\x76\xab\x33\x9a\xe7\x6e\xad\x8a\xe6\xb9\x5b" + "\x1b\x2e\x1e\xcb\x6e\x8d\x19\xff\x6e\x8d\x19\xff\x6e\x6d\xbf\x78" + "\x2c\xbb\x35\x66\xfc\xbb\x35\x66\xfc\xfb\xda\xf0\xf8\x07\x5e\xf2" + "\x6e\x93\x7a\xe1\x6b\x31\xe3\xdf\xd7\x62\xc6\xbf\xaf\xcd\x88\x79" + "\x9e\x1b\xf1\x7c\x25\x9e\x17\x47\x8e\x8f\x78\x5e\x6e\xc8\xe7\x88" + "\x7e\xf9\x9a\xd3\xc8\xc3\xba\x1e\xba\xb9\x5b\xcf\x5b\x1f\x91\xb7" + "\x47\xcf\xbb\x7f\x58\xfe\x78\xef\x1b\xe9\x6a\xbe\x7e\xdb\x38\xd6" + "\xe9\xec\xff\xc7\x63\x13\xe4\xe3\xda\xb3\xf4\xb5\xad\x0c\x8b\x79" + "\x98\xfd\x41\xc5\xf7\x1f\x0d\x34\xa5\x93\x85\xcb\x34\xed\x64\x3f" + "\xe2\x19\x8d\xec\x1b\x8c\x34\xf6\x95\x86\x4e\xb9\x0d\xf6\xef\xbf" + "\xb2\xd5\x78\x71\x5b\x9e\xb4\xf9\x51\x46\x87\x2f\xe7\x35\x80\xc3" + "\xbe\xc7\x96\x3a\x35\x16\x77\xe3\x3e\x99\x79\x1a\xe5\xcd\xc2\x34" + "\xe3\x43\xf6\xb9\x46\x9a\x0d\xbf\x0c\xc0\xcb\x33\xe0\x6d\x9f\x10" + "\xdf\xb6\x8c\xb5\x73\x87\xe7\x83\x26\xb2\xd6\xb9\xb5\x2e\x8f\xc6" + "\xb6\xf5\x6d\xdb\xd5\xda\x82\xd6\x2a\xdc\xef\xe5\x37\x21\x3d\xfe" + "\x3c\xe9\x36\xd8\x7f\xb7\x39\xd5\x7a\xcb\x6d\xe8\xff\x05\xfb\xd5" + "\xda\xa9\xd6\x0a\x7d\x3b\x78\x8a\x66\xae\xc0\x75\x08\xd7\xfb\x0c" + "\xf8\xad\x72\xbe\x7d\x5b\xb7\x70\x27\x3c\xc4\x70\x63\xd2\x43\xd0" + "\x6f\x83\xd6\x50\x65\xfe\xc5\xef\x66\xda\x85\x3b\xf1\xc1\x38\xe9" + "\xec\x9b\x3b\xe8\xa5\x99\xcb\x19\xdf\x88\x74\xcc\xcb\x53\x17\x73" + "\x7e\x2f\xd7\x87\x32\xa3\xd9\xda\x86\xbf\xaf\x3a\x33\x30\x73\x57" + "\x4c\x3b\x3e\x39\x45\x5f\x4f\x53\xed\xf8\xfa\xd3\x31\x75\x1f\x8c" + "\xdf\x8e\x99\x6d\x68\xc7\x27\xa3\xb4\xc3\x2b\x69\x6b\x42\x5b\x4c" + "\x17\xbd\x0b\xa1\x2d\x9f\x48\xba\x47\xa5\x7f\x3d\x43\xb7\x85\xfc" + "\x98\x87\xd9\xf0\x4e\x96\x7d\xa8\x7c\xa4\xdf\xf4\x7c\xd9\xd6\x06" + "\xca\xbb\xb8\xce\xaf\x2f\x16\xee\xb1\x0f\x79\xe9\xeb\xd5\x12\xce" + "\x48\x7a\xb1\xc2\x05\x74\x32\x31\x9d\xd0\x1e\x94\x1b\xad\xbf\x8d" + "\x79\x89\x5a\x0b\xf9\x3a\xe4\x7f\x66\x89\xb1\x96\xb9\xbe\x5c\xf8" + "\x0c\x3a\xe2\x5d\x57\xcc\xbb\x60\xc4\x3b\x7f\xd4\xbb\x2d\x46\xfa" + "\xed\xc9\x46\xfa\x67\xeb\xa7\xdb\xb3\x63\xfa\x09\xfd\x73\x7b\x47" + "\x74\xbb\x6f\x9f\xaf\xda\x87\x3e\xba\x88\xd6\xb7\x17\xa1\x8f\x86" + "\xe2\xf7\xd1\xed\xdb\xe3\xf3\xda\xed\x72\x1d\x4d\xa4\x53\x3c\x78" + "\x2d\xe8\xbb\x21\xc9\x83\x7a\x3f\x5d\xdc\x3f\xb7\x7f\x60\xf4\xcf" + "\x67\x6b\xe3\x2c\x47\x4c\x1b\xc3\xa7\x68\xd6\x5e\xd5\xd6\x59\x67" + "\xa2\x61\xcf\x9a\x19\x9f\x17\x67\xe5\xa1\x9d\xe1\xf8\xed\x9c\x55" + "\x3c\x3a\x2f\xce\xe2\x7d\xd1\xf0\xc5\xbc\x38\xab\x59\x95\xa1\x78" + "\x65\x8e\x08\x77\xdc\x7a\x4e\xb8\x42\x6c\xe7\x66\x27\xf3\xfa\x52" + "\x44\x7a\x6f\x34\xff\xcd\x9a\x29\xcb\x31\xfd\x42\x4a\xcf\x72\x3f" + "\x9c\x72\x90\xe9\xd3\x78\x32\xe0\xce\x9e\x1f\x43\xab\xbe\x53\x94" + "\xdd\xd1\x6f\x4a\xd8\xaf\xe8\x35\x7b\x47\x34\x4e\xd9\x45\xf1\xe9" + "\x95\x5d\x09\x7a\xf5\xc5\xa7\x57\x76\xe3\xe8\xf4\xca\xe6\xfe\xef" + "\xbb\x98\x5e\xd9\xc7\x23\xe9\x05\x5b\x57\xb6\xef\x8b\x76\xf0\xc6" + "\x50\x81\x68\xe2\xb6\x86\xc9\x66\x05\xaf\xa8\x32\xbd\x28\x33\xdb" + "\x6c\x0d\x2a\x3e\x81\x0d\x69\x39\x4b\xd9\xbd\x86\xfc\xa7\x36\xd0" + "\x58\x31\xf4\x28\xfb\x19\x25\x70\x39\x8f\xb3\xaf\xd5\x13\xca\x22" + "\x9e\x7f\x44\xd7\x3b\x3b\x37\xbe\x2e\x98\x5d\x08\x9a\xee\x8c\x93" + "\xee\x54\xbe\x66\xb3\x0f\x45\xeb\x88\xd9\xf5\xd1\x7d\x04\xba\xa1" + "\x9c\xbe\xed\xf4\xa9\xbf\x4b\xf7\xd9\x1d\x74\x71\x9f\xdd\xf1\xaa" + "\xea\xaf\x3b\xb6\x46\xe3\x77\x87\x3d\x7e\x7f\xdd\x91\x35\x7a\x7f" + "\xdd\x31\x7f\xf4\xfe\xba\x83\xf7\x89\xfb\xbc\x74\x47\x73\xf4\xb8" + "\x71\x47\x65\x74\x7b\xef\xe0\xfd\x17\xab\x30\x8d\xb9\x92\x9f\x3f" + "\x6b\xbb\x8d\x1f\xeb\x38\xee\x2b\x3e\xc7\x04\xfc\xaf\x63\x1c\x2f" + "\x17\xc6\xa8\xb0\x41\xc3\xfa\x4d\xf1\xf7\x5b\x79\x8e\xdb\x89\x99" + "\x38\xef\x23\x3b\xbe\xc0\xb6\xfb\x9d\xcf\x6a\x26\xea\xc2\xbd\xe9" + "\x14\xdd\x75\x97\x66\x32\x95\xf3\x9e\xa7\xf4\x93\x97\x6b\x08\x77" + "\x56\x47\xf6\x05\xef\x7d\xf2\xdc\xb4\x56\xcd\x9d\xfe\x71\x8a\x72" + "\xae\x52\xfd\x72\xd7\x75\xd1\x74\xbc\xf3\x50\xfc\x7e\xb9\xf3\x18" + "\xfa\xe5\x1f\xf1\xfb\xe5\xce\xee\xd1\xfb\x25\x87\xd7\x0f\xff\x71" + "\xb1\x1c\xe5\xd8\x75\x39\xda\xc6\x65\x1c\x6b\x78\x3e\x9e\xf3\x3c" + "\xe7\xc1\x3d\x64\x24\xe7\x19\x7e\x7f\x53\xaf\x21\x47\xb2\xcc\x7c" + "\xc0\x92\xf5\xeb\x79\x72\x75\x18\x91\x70\x4b\xac\xbd\xf1\xe4\x24" + "\xa7\x8a\xf3\x4e\x2d\x21\x0b\x68\x98\xbf\x97\x61\xac\x23\x02\x8c" + "\xbf\x71\x3e\x4e\x9f\xea\x8f\x94\x93\x9c\x16\x23\x1f\xeb\x3a\x3d" + "\xef\x21\x11\x28\x22\xce\x17\x03\x5b\x6f\xff\x58\x39\x8e\x70\x7e" + "\xce\x17\x9d\xe7\x2e\x8b\x92\xc7\xbb\xe6\x47\xcb\xe3\x5d\x8e\x68" + "\xfe\x04\xfd\x51\x4e\x83\x9e\xc3\x7d\x29\x70\xf8\xcc\xfc\x75\x69" + "\xd9\xbc\xab\x31\x46\x36\xc1\x03\x77\xcf\x56\x3c\x70\xf7\x35\x31" + "\xb8\x1e\x8e\xcf\x03\x77\xb5\x8f\xce\x03\x77\xf5\x8c\xce\x03\x77" + "\x9b\x99\x07\xbc\x74\x77\x76\xb4\x6c\xde\x3d\x29\xba\xed\xa8\x57" + "\xca\x26\xa5\x5d\x8e\x6c\xc2\x16\xba\x72\x34\x39\x64\x99\x62\xff" + "\x91\xa6\x41\x63\xaf\xe3\x33\xd1\xcc\x02\xb9\x62\xfc\x8e\xf3\x9a" + "\x12\x74\xfc\x4c\xa6\xe1\x3e\x79\xfe\xf3\xee\xee\x48\x3a\xd6\xaa" + "\x33\x97\xae\x53\x34\x67\x35\xef\x2b\x2b\x7a\xce\x9d\x1e\xdd\xfe" + "\x39\xe6\xf8\xf4\x9c\x33\x09\xf4\x74\xc5\xa7\xe7\x9c\x99\xa3\xd3" + "\x73\xce\x62\x3e\x93\x75\xb1\x4c\xcd\x29\x76\x6c\x90\x36\x8a\x2c" + "\x73\x96\xe6\xfc\xee\xb3\x8d\x4f\x73\xf6\x47\x8f\x4f\x73\xaa\x2f" + "\x7f\x7c\x9a\xd3\x13\x7f\x7c\x9a\x4b\xf1\xc7\xa7\xb9\x76\x25\x0f" + "\x73\xf3\xa2\xe5\x61\x6e\x56\x34\x4f\x80\x76\xff\x6d\xe3\xd3\xdc" + "\xe6\x18\x19\xa8\x3b\x45\xf3\xae\x83\x4d\x51\xa9\xfa\x6d\xde\x47" + "\x31\x38\x1e\x89\xdf\x6f\x73\x4f\xa0\xdf\xea\xe2\xf7\xdb\x5c\xdf" + "\xe8\xfd\x36\x2f\x19\xfd\x56\x77\x71\xbf\xcd\x9b\x7c\xf9\x36\xc5" + "\xbc\xfc\xe8\x3e\x9b\x97\x73\xf9\x7d\x36\xaf\x31\x7e\x9f\xcd\x3b" + "\x1c\xbf\xcf\xe6\xb5\xab\x3e\xbb\xc7\x1c\xdd\x67\xf3\xba\xa3\xfb" + "\x0c\x74\xfb\x2f\xf6\x19\xfa\xa7\x4d\xf9\x27\xdc\xb3\x02\xf3\xf6" + "\xb1\x01\xf7\x3d\x4b\xbc\x74\xef\x64\x35\xb7\xbe\x57\x8d\x1d\xaa" + "\x0f\xdf\x40\x9e\xbc\x8b\xc7\x81\x7b\x9c\x7a\xda\xb7\x2f\xee\x87" + "\x7b\x76\x41\x47\xf7\xb6\x95\xcb\xbd\x2d\xd5\x87\x4c\x73\xe4\x6b" + "\xdd\xc4\xfb\x53\xf7\x1c\xe6\xb2\xe8\x63\xe1\x09\x86\x88\xf5\x3a" + "\xf2\xfb\x19\x0e\x9f\x45\x8d\x81\xe5\xbd\x9c\x31\x7e\x74\x9f\x1a" + "\xad\xad\xb5\xe2\x66\xc0\xbb\xf7\x82\xe2\xd5\x7b\x63\xed\xdf\x26" + "\xbc\xfb\xbd\xe2\xd3\xfb\x5e\x8a\xc6\xe1\xde\xe5\xf1\xf9\xf4\xde" + "\x72\xb4\xa1\x29\x3e\x9f\xde\xdb\x30\x3a\x9f\xde\x8b\xfe\xa7\xa6" + "\x88\xb9\x4f\xfa\xe3\x21\x6f\xcc\xdc\xe7\xde\x2e\xab\x5f\xf1\x8e" + "\xb4\x89\x6a\xb4\xb6\x80\x3b\x37\xd6\xfe\x43\xdf\xe4\x6e\xd1\x71" + "\x7e\x36\xba\x7c\xee\x28\xf6\x5f\x2e\xdb\x7f\x6f\xc4\xc7\x39\xf7" + "\x12\xf6\x5f\x2e\xdb\x7f\x6f\x5c\x2c\x5b\xb9\xba\xfd\x17\x6f\x8e" + "\x97\xdb\x18\xbf\xff\x73\x63\xfa\x9f\xf2\x4b\x31\x1f\x96\xe5\xa3" + "\xf3\x7d\x10\x99\x8f\x7d\x93\x38\x2f\xf3\xc8\xc5\x79\xef\xb3\xc4" + "\xc2\x1c\x25\x5f\xd6\x45\xbc\xc7\xbe\x54\x71\x79\xef\x3e\xfd\x3c" + "\xc9\x7d\x87\xa3\xe5\xf1\xbe\xd2\x68\x79\xcc\xb5\xc7\x94\xdb\x15" + "\xfd\x1e\xfc\xf3\xdf\xa6\x63\xef\x37\xc7\xf0\xc0\x7b\xa7\xe8\xfe" + "\xad\x8a\x07\xee\xff\x8f\x68\x3c\xee\x9f\x14\x9f\x07\xee\x9f\x81" + "\xf6\xbf\x17\x9f\x07\xee\xcf\x1b\x9d\x07\xee\x2f\x06\x2d\xdf\x8b" + "\xe4\xdb\x87\xca\x73\xc6\xc6\xe4\xa9\x8f\xaf\xf3\xee\x3f\x10\x7f" + "\x8d\xe0\xfe\x56\x45\xe3\xfb\x83\xd1\x34\xbe\xbf\x2b\x9a\x86\x68" + "\xcb\x7f\x9d\x86\xc3\xf1\x27\x02\xee\x6f\xc4\xca\xbf\xe7\x14\x7d" + "\x43\x97\xff\xf9\xef\x47\xe3\xf8\x8d\xe5\x0a\x97\x78\xeb\x22\xdf" + "\xe0\xf9\xaf\x27\x3e\x2d\xbf\xd1\x18\xbf\xcd\xdf\x38\x8c\x31\xc8" + "\xa3\x5d\x24\x4b\xdf\x68\x47\xfa\x43\xbc\x1e\xca\xeb\x21\xfb\x90" + "\xfe\x50\x88\x2c\x72\xbc\x1a\x1e\x97\xbe\xe1\x63\x5f\x14\xa6\x3f" + "\xf3\xaf\x75\x12\xe5\xf1\x18\xc4\x78\x15\x94\x4b\xbf\x05\xeb\x76" + "\xe6\xf5\xeb\x99\xd7\xe7\x4b\xfb\x8f\xf7\x59\xd8\x8f\xd0\xea\xa4" + "\x3c\x8e\x83\x61\xf0\x3b\xe7\x8f\x86\x3d\x7f\x3e\xcb\x05\xe7\x37" + "\xf2\xaa\x75\xb3\xca\x18\xdd\x34\xbf\x34\x7e\x1f\xcf\xaf\x1e\x9d" + "\x77\xe6\x1f\x50\xfd\x3c\xff\x83\xe8\x7e\x9e\xdf\xaa\xb9\x53\x17" + "\x73\x5b\xbd\xa0\xf3\xe5\xf4\x71\xa9\x43\xf8\x46\xd5\xf7\xdb\x1e" + "\xed\x2a\xa9\xa0\x2f\x9c\xa6\x05\x73\x65\x7d\x26\x11\xb4\x6e\x4d" + "\xa0\x36\xa9\x03\x16\xbc\x2c\xf1\x44\x9e\x82\x10\x99\xc4\xb6\xa7" + "\xba\xf8\x5d\x93\x5b\x04\x91\xef\x38\xef\x09\xf0\x59\x6e\xf0\xc2" + "\x95\x27\x69\xc1\x63\x51\xe5\x31\x32\x7b\x14\x8c\x86\x26\x29\x8f" + "\x0b\x76\x19\x6b\xba\xdb\xf1\x1c\x7f\xdd\x77\x41\x8b\xe1\xfb\xa0" + "\x7c\xc6\x16\x8c\xba\x7f\xc9\x38\xf1\x79\x1a\xc6\xe9\xd2\x7a\x60" + "\x61\xb2\xc1\xbf\xca\xd7\x72\xe1\xa4\x11\x5f\xbe\x85\x99\x78\x77" + "\xfc\x12\x6b\x83\x11\x72\xb0\x70\x71\x24\x1c\x15\x83\x65\x61\x91" + "\xe1\x8f\x87\xfb\xd2\x4f\x81\x65\xe0\xd3\x18\x83\xcf\x41\xd8\x29" + "\xdb\x75\x18\x2d\x97\x82\xc1\x7d\xae\x78\x96\xf9\x61\xe1\xf1\x4b" + "\xad\xf9\x25\xda\x29\xef\xc5\x8b\x78\x6b\x91\xb4\x97\x18\xc6\xa5" + "\x71\x5c\x94\x13\x35\xb7\x90\x7b\xf7\xbc\xb7\x95\x97\xa2\xe4\x7e" + "\x51\xcc\x1a\xe1\xa2\x25\xd2\x9f\x4a\x97\xfb\xc7\x43\xb1\x72\xb0" + "\xa8\xdc\x18\xa3\x63\xd2\x77\x19\x72\x8f\x79\x2d\xc3\x8d\x59\x67" + "\x5d\x74\x58\xc9\x42\x5e\xb2\x96\x12\x39\x5f\x5b\x24\xed\x3f\x63" + "\xbd\xd4\x8b\x7c\x31\xe5\x62\xd6\xff\x16\x2d\x11\xa3\xaf\xd3\x27" + "\xa3\x7f\xfd\xbc\xb7\xa5\x62\x43\xe4\x65\xc7\xac\x57\xf8\x6a\xe5" + "\x79\xff\xbf\x72\xfb\x75\xbd\xf7\xc0\x9b\xd1\xf5\xe5\x2d\x71\x9d" + "\xb9\x54\xfb\xf3\x46\x69\x7f\xde\x48\xfb\xd7\x48\xb8\x31\x6b\x89" + "\x79\xb2\xfd\xe1\x8b\xf4\x5f\x5e\x3b\xf4\x97\x41\x37\xd8\xdc\x0f" + "\xdc\x60\xd8\xea\xbc\x7e\x30\xba\xad\xfe\xc0\xc8\xfa\x9f\x2c\x97" + "\x37\xb2\xfe\xe7\x8b\x67\xab\x7b\x49\xee\xad\x46\xd5\xfd\x40\xae" + "\xb5\x31\x5e\x5b\x1e\x18\x65\xfd\xef\x01\x7d\xfd\xef\x81\xe3\xd1" + "\xfa\xec\x81\xfa\xe8\x3e\xcc\x8b\xe9\xc3\x07\x0e\x45\xf7\x61\xde" + "\x92\xff\xec\xb8\x86\x67\x4a\x4c\x4c\x34\x25\x26\x98\x12\x12\xf1" + "\x1a\x4d\xa4\xb1\x89\xe6\xc4\x24\xfc\xc6\xe8\xd7\xb1\xa6\x44\x93" + "\x19\xbf\x24\xfd\x3a\x26\xe6\x79\x2c\x97\xc5\xcf\xac\x5f\x93\x62" + "\x9e\xc7\x7c\xca\xfb\xb1\x7a\xbd\x46\xfd\xe6\x98\xe7\xa4\x4f\x79" + "\x3f\xe6\xbf\x58\x9e\x2e\x7a\x8e\xf6\x43\xbb\x6f\xcd\x86\xa5\xc5" + "\xab\x97\xcb\xfd\xe2\x15\x8e\xa5\x4f\x3c\xb1\x62\xfd\x7a\x47\xe9" + "\x5a\xc7\xdd\x77\x3d\x78\xf3\xed\x0e\xb5\xed\x5c\x3c\xfb\x86\xe5" + "\xe3\x69\xc1\xc6\x75\xfc\x62\xc1\x43\xf7\xe5\x3b\xf2\xee\xbe\x2b" + "\xfa\xa5\x01\x46\x6e\x2f\x5f\x0a\x4a\x84\xfc\xe5\x3c\x3f\x81\xa8" + "\x7a\xb7\xd4\x3d\xdd\xec\xe7\xab\xd6\x3c\xf2\xa7\xb7\xb3\xff\xe8" + "\xa0\x4b\xb4\x5e\xcf\x7b\xfa\x0f\xfd\x85\x1b\x71\x53\x73\x25\x95" + "\x2c\xe3\xf3\x2b\x0f\x9d\x13\xbf\xf1\x91\xe3\x7e\x32\x9d\xa4\xc7" + "\xee\x6a\xcb\x45\x5e\x3c\x7b\xbc\x21\x72\xb8\xc8\x72\x8a\xbe\xfd" + "\x21\xde\x25\x88\x3b\x34\xa4\xf9\x75\x5f\xe8\x6f\x9d\x93\x69\xbf" + "\xa9\x34\xf2\x59\x4f\xd1\xe2\x97\xc4\x6f\x84\x7c\xe6\xf3\x41\x2a" + "\xdf\xe2\xd5\xc2\xf4\x50\x26\xeb\x86\xc6\x74\x32\xf3\x5e\xe8\xcb" + "\xe9\x64\x79\x79\x02\xc7\x48\x59\xbc\xc4\xd8\x0b\x7d\x1e\xcf\x5e" + "\x7a\x2c\x87\xeb\xe6\xbc\x9a\xe9\xa1\x07\x39\xff\xbe\xe8\xfc\xd5" + "\x23\x7b\xb1\x8b\x97\x98\x90\x6f\xd1\x87\x64\xb5\x86\xc5\xb9\x60" + "\xea\x40\xf3\xd4\x5c\x4a\xf0\xa0\x2b\xda\x43\x95\xa4\x7c\x7e\x16" + "\xff\xa5\x2c\x2c\x42\xec\x9f\xbe\xa0\xd7\x25\xea\x9e\x26\x33\x64" + "\x3a\xa1\x75\x1d\xfb\x28\x2c\x3e\xd2\xb4\x82\xcc\x68\xff\xa4\xd3" + "\xf4\xcd\x5e\xc7\x42\x22\xd7\x02\x32\xff\xc1\xc9\xfe\x86\xe2\x8e" + "\xda\x3f\x93\xf9\xa7\x83\x95\xa6\x41\x61\xa7\xf2\x52\xd1\x23\x38" + "\x6e\x92\x5f\x04\xd9\xc7\xbf\xbd\x30\xcc\x79\xa6\x06\x5c\x76\xea" + "\x2c\xf5\xd3\x96\x0f\x44\xb0\xea\xcf\xea\x6c\x40\x47\xaf\x9f\xfd" + "\x17\x2d\x5b\x16\x50\xe2\xa9\x7c\x32\x75\x14\x35\x90\x67\x89\x9f" + "\xca\x3f\x10\x3d\xed\x85\x1f\x51\x67\xd1\x21\x2a\xe8\x22\x53\x7b" + "\xf7\xdf\x48\xc6\xfe\xd9\xb9\xca\x51\x71\x81\xec\x5b\x56\x73\xda" + "\x05\xda\xb4\x85\x52\x36\xfd\x85\xac\x9e\x9e\x2e\xd4\x73\x86\x1e" + "\x39\x41\x09\x80\x67\xda\xfc\x37\xb2\x6f\x7e\x98\xfd\x7c\x73\xa8" + "\xb1\x82\xec\xc2\x95\x99\x3c\xe8\xca\xb4\x0d\x8a\xcc\xf4\x80\x2b" + "\x33\xa3\xb3\x04\xf9\xbb\xdf\xa5\xd4\x2e\xca\xf8\xcd\xe9\x2e\x53" + "\xc3\x79\x9a\xc4\x6d\x3a\x85\xb6\x35\x9e\x47\xfe\x9d\xd9\xcd\x1a" + "\xca\x46\x96\x09\xa5\x65\xb7\x78\xf2\x83\xa4\x01\x56\xc3\x20\x4d" + "\x6a\x1c\x24\xbb\xb6\x23\xbb\x99\xcb\xf5\xd2\xb7\xfe\xe9\xc1\xc8" + "\x50\xbe\x45\x84\x87\x6a\xb5\x66\xe8\xc4\xb1\x6f\x2c\x6b\x31\x7b" + "\xda\x7b\xa9\xc3\x3f\x48\x9d\xf4\x57\xf2\x38\x3f\x6e\xfd\xe9\xb2" + "\x96\x24\x0d\x42\xd0\xba\xa9\x1b\x75\x29\xde\x71\x75\x90\xd9\x83" + "\x3e\xa8\xab\xa0\xe4\x92\x4d\x34\xf6\x34\xd2\xd5\xdc\xfe\xdc\x01" + "\x4f\xe8\xe3\xd6\x4d\xd2\x1f\xf7\xb1\x9c\x8a\x0e\x4a\xec\xf4\x37" + "\xb0\xdf\xa7\x29\x9c\xbe\xca\xe1\xf1\x1f\x27\x4f\xc9\x3f\x5a\x35" + "\xdb\x2a\x4b\xb5\x46\x96\xd7\x07\x8e\x9b\x3c\xe6\x01\xf2\xe4\xfb" + "\xe9\x3d\xd4\x2d\x76\xae\x9a\x02\xbd\x95\xd3\xe9\x0f\xf2\x79\xa7" + "\x2c\xd1\x6f\x1f\x5f\xb7\x8e\xa6\xec\x3b\x4f\x93\xf7\x9e\xa7\x4c" + "\x11\xc8\x34\xb1\x8f\x2d\x9f\x5f\xdd\x8b\x6b\x72\x37\x59\xd0\x76" + "\xe5\x8f\x9d\xa6\xfb\xda\x0e\x65\x52\xd3\xe0\x88\xaf\xed\x60\xff" + "\x88\xaf\x2d\x78\xaa\x90\xfd\x6d\xbd\xf4\x4d\xbf\xb5\x9d\xc6\x9e" + "\xa4\xc5\x76\xe6\xef\xba\xb3\x64\xde\x76\x96\x68\x6a\xa5\x89\x1c" + "\x2b\xf9\x9c\xc5\xb7\xff\xe2\x41\xdf\xf0\xfd\x49\xfa\x76\x35\xae" + "\xc9\xf8\x25\x20\x7d\x2b\xb7\xb3\x5b\xe7\x63\xa4\x99\x90\xf6\x2c" + "\xae\x89\xb8\x3e\xed\x6a\x14\x3e\xd4\x15\xec\x37\xd1\x78\xe6\x67" + "\xdd\xbf\x37\x18\x70\x7f\x7b\xb9\x97\xd6\x2c\x37\xf8\x5a\xe9\xf8" + "\xc5\x85\xef\x9d\x3c\xc3\xf1\xb9\x7c\x12\xaf\xa1\xa2\x04\x8e\xd5" + "\xa5\xa7\x33\x0e\x1d\x5c\x2f\xea\x3f\x84\xab\x15\x3f\x96\xd3\xb9" + "\x46\xd9\xfe\xa1\x22\xae\xf3\x77\x48\x17\x46\x3a\xda\x6d\xe6\x77" + "\x6f\x9d\x3c\x63\x52\x79\x32\x4d\x80\x19\xd4\xe1\x43\xf6\x17\x9b" + "\x59\xc6\xfb\x4d\x56\x71\xb4\x70\x06\x35\xee\x16\xed\x7b\x77\x8b" + "\x36\x25\x7b\xf9\x16\x2f\x95\x58\x18\x47\x8c\xe3\x6d\xd5\x78\x77" + "\xd4\x41\xc4\x74\x69\x5b\xce\xfe\x64\xf9\xb0\xff\xae\x38\x12\xd9" + "\x06\xe1\x7e\x50\xda\xfa\x3f\xab\x38\x96\x04\x1d\x60\xe9\xec\xee" + "\xa5\x9f\x0e\xf6\x24\xb9\x7e\x4f\x26\x4f\xe8\x24\x4d\xcb\x20\x3b" + "\xdb\x83\x4d\xbb\x85\xf7\x45\x8e\x07\xb8\x5b\xf4\x82\x5f\xae\x39" + "\x4d\xf9\xcf\x7e\x35\x83\x32\xfe\x88\xd1\x4e\xe9\xa7\xfc\x9a\x08" + "\xfd\x74\x55\x87\xb7\x25\x42\x37\x2d\xf9\xdd\xc5\xba\xe9\xd1\xf7" + "\x95\x6e\x82\xec\x4b\x5d\x14\xf6\xea\xe9\xaf\xc7\xa4\xeb\x7e\x22" + "\x8f\xee\x88\x49\x0f\xea\xe9\x5b\x62\xd2\x7d\x2a\xfd\x91\x77\x0d" + "\xdd\xd7\xc9\x78\x6c\x64\xdd\xf7\xc8\xab\xac\xfb\x3a\x0b\x75\xdd" + "\x27\xf5\xcf\x23\xcf\x89\xff\x01\x5d\xb4\x81\xf5\xcd\x23\x8f\x31" + "\xfe\xe2\x37\x64\xe0\x3e\x0e\x69\xd7\x70\x5a\xfd\x5f\xc9\x8c\x9f" + "\xa1\xf7\xd6\xb2\xde\x63\x9d\xc7\xba\x6f\xcf\x04\xd1\xb5\x67\xb7" + "\x38\xd1\x28\x63\x0d\x3d\x3c\xac\xff\x5e\x40\x5a\x35\xd2\x5e\xc0" + "\x7b\xd6\x83\x4c\x93\x8e\xfc\x16\x62\xff\x13\xf0\x58\xb6\x66\xca" + "\xa2\x5a\xf4\x37\x9f\x37\xdc\x0e\xfa\x5a\x13\xa8\xc4\x53\xca\xe7" + "\x57\xc3\xec\x93\xd6\xdd\x59\xda\xcd\x72\x37\x61\x1b\xe4\x8c\xcf" + "\x4b\x57\xf8\xc5\x69\x3e\x77\xc7\x38\x14\x94\xdd\xcf\xf1\x99\x12" + "\xda\x8a\x88\xd8\x2f\x9c\x75\x36\x70\x31\xd7\x03\x27\x15\x0f\xe6" + "\x91\x0c\x2f\xbd\x36\x57\xf5\xf5\x63\x39\x1c\x07\xee\x24\x3d\x9c" + "\x8f\xf9\x5e\x90\xdb\x66\x0d\x57\x12\x9f\x83\xe1\xd8\x88\x7c\xdd" + "\x63\xd2\x8a\xea\x8d\xb3\x30\x6e\xe8\x06\xe4\xf1\x74\x05\x89\x71" + "\xf6\xd2\xc3\xfb\x3b\xca\x5b\xb8\x7c\x2e\xd3\x46\xb8\x5d\x06\x8c" + "\x04\x09\xc3\x24\xe7\x8d\x98\x1b\x3c\xa2\xd6\xce\x53\xb5\xe6\x8e" + "\x25\x3e\x62\xbd\xef\xe9\x01\x8c\xf2\x93\x0a\x06\x60\x09\x8c\x01" + "\x51\xef\x74\xf8\x29\x5b\xc4\x39\xc0\xcf\xe0\xfe\xe2\x73\x91\xbc" + "\xdf\x06\xba\x24\xb3\xaf\xbc\xb2\x45\x1f\xde\xdb\xf4\x57\x22\xfd" + "\x6c\x27\xf8\xed\xe1\x46\x3e\xb7\xc4\xe7\x39\x2f\x75\x96\x13\x34" + "\x9a\x6c\x9c\xe7\xd4\x36\xfe\xf7\x9e\xe5\x04\x6c\xfb\x3e\x93\x38" + "\x04\xfc\x1b\xf9\x3c\xe7\x49\xca\x0f\x31\x1f\xea\x6d\x6a\x7e\xe9" + "\x11\xa6\x79\x7e\x37\xa7\x61\xee\x78\xcc\xe8\x7f\x6e\x2f\xb7\x05" + "\xef\x8e\x29\x1b\x51\x1c\xf7\xd2\xa3\xcd\xfc\x1e\x69\x87\x39\xff" + "\x34\xe8\x31\x0f\xc6\xb0\x37\x4e\x86\x4d\x75\x9b\xc8\xac\x74\xda" + "\x92\x77\xb8\xbc\xd2\x69\x4b\x4a\x46\x74\xda\x92\x15\x4a\xa7\x29" + "\x1a\x2b\x9d\xb6\xe4\x61\xa5\xd3\x96\x3c\x20\xf7\xc5\xa0\xd3\xf8" + "\x1d\xeb\x35\x43\xa7\xed\x9d\x20\x8e\xb1\xee\x08\xb8\x97\xe4\x18" + "\xba\xad\x06\x69\xac\x3b\x18\x47\xa5\xa7\x1e\x69\x10\xff\x5f\x26" + "\x29\xbf\x03\xbe\x2f\xe2\xf3\x0b\x3d\xfa\x3d\xfa\x65\xc9\x9b\x4a" + "\xc7\x2d\xd9\x35\xa2\xe3\x96\xd8\x47\xca\xb2\x8e\x5b\xf2\x63\xa5" + "\xe3\x54\x7a\xd3\x23\xac\xe3\x1e\x69\x60\x1a\xe8\xf0\x4d\xbc\x86" + "\xa7\xe7\x67\x3a\x36\x47\xea\xb8\x68\xf9\x5a\xd2\x6b\xe8\x38\xd6" + "\x6d\x78\xe6\xb8\x91\x85\x52\xde\x90\x6f\x17\x68\x6e\xc8\x1d\xf7" + "\x01\xb7\x99\xe3\xbd\x31\xdd\xe6\x9c\xa1\xb1\xfa\xd9\x21\xbd\xdd" + "\x8f\xcd\x34\x7c\x1f\xbd\xb4\x24\x27\x9e\x1d\x3d\x12\x93\x91\xae" + "\xe5\x73\xf3\x9e\xca\x93\xe4\x69\x10\x95\x9d\xa1\x0f\xa8\xa0\x14" + "\xba\x22\xf1\xa9\x0f\xb9\x6f\x31\xef\x98\xc5\x57\xd6\x3d\x18\x4b" + "\xb7\x14\xf8\x69\x0c\xe6\xea\x1f\xd6\x99\xf0\xce\x19\xf5\x4e\xae" + "\x31\x4c\x5d\xc7\xf1\xfc\x1e\x2b\x1c\x6d\xbe\x7f\x99\xf5\x9d\x19" + "\xbd\xbe\xc7\xc7\xc9\xfa\x60\x53\x61\x0e\x94\x76\x96\x1e\x93\xf3" + "\x12\x19\x03\x67\x5b\x3c\x58\x8f\x7f\x5d\x7f\x9f\x34\xca\xfb\x87" + "\x3f\xa5\x7c\xd9\xa7\x94\x7f\x99\x75\x11\xda\x67\x0d\xbb\xa3\xe1" + "\xa4\x86\x8c\x7c\xa7\x39\xdf\xfb\xfa\x5a\xcc\x87\xae\xeb\xe4\x1c" + "\xcd\x6e\xc0\x64\xfe\xab\x45\x3e\x19\x97\x05\xba\x72\x2e\x6a\x4c" + "\xf5\x47\x95\x0d\x8f\xd0\xf8\xf1\x51\xcf\x74\xb2\x1e\xf5\x34\x90" + "\x8c\x51\x7b\x14\x36\x29\xc7\x4c\xda\x35\xbc\xfe\x51\xb0\x18\x7a" + "\x33\x2f\xc2\x2f\xb6\x17\x7a\xee\x5a\x15\x8f\xc6\x4f\x75\x6a\xbe" + "\x79\x35\xf4\x73\x3a\x9f\x87\xe1\xb3\x31\x05\xe1\x3c\xd3\x51\x19" + "\x3b\xad\xa0\xde\x28\x3b\xda\x3a\x0b\xd7\xab\xd7\xc9\x3e\xa6\x7e" + "\x94\x69\x33\xca\x30\x6c\xf6\x53\xc4\xb8\x7c\xad\x3c\x53\x1a\xea" + "\x65\x5d\x78\x35\x6c\xd1\x74\x55\x4f\x21\xe9\xf5\x40\x66\x1e\x6b" + "\xbd\xd4\xd9\x8c\xd1\xdb\x57\x38\xe3\xf2\xdb\x47\x7a\xfb\x0a\x4b" + "\x3e\xa5\x7d\x97\xaa\xf7\xe0\xe5\xd7\x6b\x33\xea\xed\xb9\x7c\xba" + "\x2e\x9d\xf4\xd9\xe9\x9a\xa5\xd3\x75\x69\xde\xa7\xd0\x35\x5e\x3d" + "\xdb\x3f\x7b\x3d\x0e\xa3\x9e\x96\x78\xf5\x90\xfc\x1b\xf5\xdc\x94" + "\xc5\x88\xed\xd9\x0f\xd9\x51\xb1\xf1\x96\x51\x64\xbc\xe4\x7e\x29" + "\x57\xcb\x32\x86\xe3\x33\xab\xbd\x72\xe8\xea\x65\xd3\x0b\x9a\x79" + "\x7c\x17\x9a\x97\x96\xcd\xe0\xb8\xb1\x73\xb7\xa8\x33\xd9\x7a\x99" + "\xdc\x4b\xc5\x69\xe6\x18\x60\x1c\x03\xd0\x03\x2d\x7e\xb4\x81\x63" + "\x5d\xce\xaa\x64\xff\x7b\xcc\xa9\xa0\xe3\x97\xbd\xc4\x31\xcd\x70" + "\x3f\x96\xef\x79\x3f\x1c\xd7\x66\xa5\x0b\x96\x35\x7b\x69\x69\xd7" + "\xa8\x70\x77\xce\xaa\xdf\x5f\x91\x95\x34\x9a\x9f\x3d\xca\x7b\xbd" + "\xf4\xcc\x41\xe9\x5b\x9f\x6e\x39\x86\x39\x85\x1e\x67\x70\xc5\x63" + "\x32\xf6\x9c\x2b\x9f\xcf\x95\x60\x7c\x5c\xfe\x9c\x7e\x1e\x00\x74" + "\xa9\x04\x7d\x9f\xb0\x1b\x74\x31\xd2\x91\x36\xc5\xa0\x0b\xec\x9c" + "\x64\x4f\x73\x88\xcf\xeb\xf8\xd5\xd9\xec\x27\x1e\x10\x3b\x66\x55" + "\x29\xd8\x4f\xe8\x3e\x8a\xa8\x6f\x28\xdf\x2c\xe7\x4f\x15\x3c\x7f" + "\x5a\x3e\xc3\x97\x36\xab\xca\xc0\x43\xac\xb7\x9b\xf8\x0c\xf8\x34" + "\x8c\xa9\xb5\x2a\xd6\x5f\x02\x9f\x97\x93\xef\xd7\x67\x9a\x14\x6d" + "\x9e\xf8\x85\xe8\xcf\x64\x9f\x7d\x86\x9d\x0c\xbc\x97\x30\x5c\x2f" + "\xae\xbe\xcd\x99\x1c\xff\x42\x6f\xcf\x13\x7b\xb5\x9d\x96\x63\x5a" + "\xc0\x6e\x32\xf0\xdd\x27\xcf\xb6\x3e\x81\xf6\x2f\x5d\x22\x71\x96" + "\xf8\xd8\x4d\xec\xd7\xaf\xa5\xcf\xaa\x17\x9b\xed\x74\x78\x5d\x8f" + "\x9c\x3f\x71\x9d\xd3\x50\xbf\xe0\xf9\x12\x6c\x94\x80\x7b\xb9\x7d" + "\x98\x6e\x80\x2b\x02\x06\xdd\x9e\x68\x53\xe3\xb3\x6a\xa3\x7f\xb3" + "\xdd\x74\xd4\x27\xcf\xdd\xd1\x64\x87\xeb\x13\x15\x83\x7b\xf9\x62" + "\x83\x76\xc3\x38\x01\x1f\xce\xa3\xfc\x9c\x96\x97\x1a\x38\x49\x19" + "\x4e\xe7\x73\xbc\x4f\x14\xf1\xf9\x21\x45\xff\xa3\xc9\xc8\xd3\x70" + "\x31\xfd\x97\x1f\x8c\xa0\x7f\x22\xf3\x20\xd3\x9f\xd7\x3c\x40\xdb" + "\xbf\x80\x96\x16\x75\xee\x81\xed\x9a\xe5\x7f\xc3\x73\x32\xe3\xa9" + "\xed\x30\x68\x9e\x6f\x56\xeb\x65\x2b\x6c\x11\xfd\x80\xf6\xda\xd9" + "\x66\x4b\x30\xda\xcf\x65\x98\x06\x1c\xcf\x92\xeb\x06\x3e\x57\x04" + "\xdc\x2b\x32\x63\xdb\xb4\x4d\x9d\x29\x21\xe5\x63\xb2\x22\x37\x22" + "\xa6\xb9\xaf\xd4\x21\x82\xea\x7c\xf2\x72\xdf\xe1\x0a\x9f\x79\x34" + "\x5d\xc0\x3c\x28\x63\x63\x9a\xe4\xfa\x02\x6c\xaf\x55\xb3\x05\x70" + "\x53\x7d\xbf\xea\x2a\x95\xb6\x72\x29\xae\xe0\xb1\x15\xef\x08\xd4" + "\xed\x73\xc9\x58\x2b\x68\xdb\xaa\x7c\xe6\x39\x83\xcf\x78\x3d\x52" + "\xf9\x8e\xaf\xbc\x86\x75\x8b\x41\x73\xe0\x3f\x1e\xf8\xf5\x18\xf8" + "\x1b\xf9\xb9\xef\x38\x0f\xef\xdd\xb4\x39\x82\x52\xe7\xaa\xb3\x43" + "\x2b\x33\x0c\x59\xe6\x3a\xb8\x9f\x59\xe7\x30\x3d\x14\x2d\x56\xce" + "\x88\x86\x65\x37\xa9\x78\x9d\xcc\xf3\x90\xc7\x4d\xc1\x24\xe4\xc9" + "\x1f\x81\xb1\xe2\x84\x7a\x37\x8c\x27\xfb\xfb\x4b\x9f\x3c\xd5\x1f" + "\x2b\xdf\xe7\x76\x8d\xe0\xcb\xf2\xb7\x72\xb8\xff\xf9\x9d\xdf\x65" + "\xe7\xd8\xbf\x52\xd7\x94\x5e\xc7\xf8\xfa\x38\xa6\xae\xe4\x75\x2f" + "\xad\xb4\x30\xee\x9c\xc7\xe8\xb3\x11\x5e\x5c\xe9\x8d\x84\x23\x5c" + "\x12\x57\x09\x47\xe9\x0e\x1f\xe6\xae\xe4\x50\xfb\x2e\xab\x92\x47" + "\x70\x5e\xb9\xdd\xc0\x67\x44\x27\xac\x9a\x12\xcb\x93\x5c\x37\xc7" + "\xed\xd3\x61\xb3\x2e\xb1\x9d\xa4\x55\x76\x85\xd7\x8a\x7a\xee\xc7" + "\xd1\xc6\x39\x8e\xaf\xc9\x31\x57\x5f\x54\x3a\x04\xfd\x5c\xf4\xf2" + "\x8b\xea\x3c\x91\x5f\xc5\x5d\x5d\xb5\x57\x98\x5e\x65\x5a\xf1\xba" + "\xba\x4f\xc6\xed\x90\x67\xcd\x57\x1d\xe1\xfd\xba\xd4\x92\x57\x65" + "\x8c\x5d\xdd\x47\xd0\xd7\x56\x12\x92\x71\xff\x5c\xa5\x7c\xf6\x36" + "\xc4\x73\x3e\xe9\x03\x77\xb4\x34\x44\x0f\x05\x59\x26\x56\xf5\xf2" + "\x99\x7a\x15\xbf\x7c\x55\xd0\x38\x47\xcf\x31\x3b\x39\xde\x2c\xf4" + "\x50\xe2\x48\xbc\xd8\xa2\xe3\x6c\x6b\xe9\xfd\x4b\xb5\x26\x71\x5c" + "\xc9\x7f\xd1\x5d\x7c\x6e\x5e\xed\x67\x9d\x84\x4e\x48\xfc\x18\x79" + "\xa5\x5d\x37\xa2\xa3\x8a\xfe\xc4\x7b\x5a\x5e\x1d\x46\xc0\x5d\xb4" + "\x1c\x63\xc6\xb1\x8b\x75\x49\xd1\x5d\xc6\x1c\x86\xcf\xe1\xa9\xfd" + "\xb1\x11\x78\x28\x2f\xed\xea\x91\x3e\xf8\x2d\xc3\x3a\x74\xb1\x5e" + "\x28\x6a\x33\x64\xaf\xe4\x7a\x3e\xcb\xbd\xaa\x8a\xeb\x1f\x6d\xbc" + "\x10\xae\x87\xb9\x9f\x2c\xa7\x1c\xf1\xfb\x26\xfe\x7e\xdb\xea\x4c" + "\xa3\x0d\x06\x4d\x54\x1b\x56\x6f\xed\x4f\xd5\xda\x47\xda\xbe\x5a" + "\xae\x11\x45\xbc\x7f\x27\x82\x36\xfc\xdc\xa2\xc6\xb5\xd5\x4e\xf0" + "\x87\x7e\x16\x5f\xa5\x41\x76\x5e\x10\x9b\xf3\x49\xe1\xb8\x9a\x0c" + "\x59\x47\xde\xfd\x5e\x0a\x04\xd5\xbe\xd7\x6a\x8e\x7f\x40\x7a\xb9" + "\xf9\x8c\x4b\xdc\x76\x46\xe1\xf8\x64\x16\xdb\x1c\x2a\xb6\xc2\x93" + "\xd3\x19\x5f\xc7\x97\xb8\x8f\x57\x4b\x5b\x57\xc6\x59\x18\x2a\x4a" + "\xf2\x0f\x65\x52\xff\x50\x11\xf4\x42\xa6\x29\xe0\x7e\x12\xfa\x7f" + "\xe0\x84\xaa\xf3\xc9\xc9\x06\xae\x8c\x9b\x8c\x03\x2a\x56\xc7\xa7" + "\x2f\xd7\x2b\x63\x3f\x15\x8d\xc5\xcf\x82\xdf\x98\xcf\x6a\x9f\xc0" + "\x5e\xef\xf1\xed\x48\x2a\xd6\x36\x88\x63\x1c\x63\x0c\x73\x92\x9e" + "\x3a\xf0\x6f\xea\xd6\x56\xd8\xe8\x8f\x99\x0a\xca\x28\x07\x73\x67" + "\x12\x03\x62\xe6\x3e\x0d\xd7\x0d\x62\x06\xc7\x37\xc7\x73\x96\xfe" + "\x3c\x85\x9f\xfb\x37\x88\x25\xc0\xb9\xcb\xd8\x2b\x54\x31\x72\x9e" + "\xec\x19\x8e\x2b\x94\xf8\x28\x9f\x2b\xe2\xf8\x53\x1a\xe6\x44\x3d" + "\x5c\x6f\x01\xcf\x6b\x51\x5f\xc0\xfd\x94\x0d\xfd\xbc\x98\xf3\xf9" + "\x12\xbf\x92\x8e\x5f\xdc\x58\xec\x5c\x86\xf1\xea\x4f\x4b\x2a\x36" + "\x70\x4d\xf5\xe7\x98\x3e\x1b\x6e\x4f\x95\x1a\xb8\x21\xfd\x58\x9d" + "\x4a\x0f\x71\xac\x44\xf6\x79\xc4\xfb\x5d\x06\xae\x06\x0e\x5c\x1f" + "\x9f\xe3\x14\xa9\x5a\x17\xc7\xa0\xe1\xfa\x38\x6e\x2b\xf2\xb6\x1a" + "\xf8\x7e\x56\x5e\xae\x68\x14\x82\xc7\x4f\xd6\xbf\x8e\x89\x24\x63" + "\xeb\x9d\xa2\xe2\x8c\xa3\x8d\x7e\x8e\x8d\xfa\x57\xd4\xf1\x1f\xfd" + "\x1c\x1b\x75\xa8\x28\x6e\x1f\x73\x19\xe4\xcf\x93\xfa\xa1\x56\xfb" + "\x0f\x4d\xe4\x42\x19\xa1\xdc\x50\x2e\xaf\x39\x41\x6e\x8b\xcb\xdb" + "\xca\x7b\xf8\xec\x25\x74\x4e\x71\x39\xf2\x74\xb1\x9d\x85\x79\x57" + "\x50\x7e\x37\x03\xba\xa9\x75\xc3\x0c\x86\xb1\xc5\xec\x24\x73\x5b" + "\x4c\xbc\xaa\xd1\xf8\xa3\xdf\x36\x8e\xfa\x77\x5a\xba\x02\xee\xe2" + "\xc3\x5e\x7a\x7a\x54\x9b\x70\xdb\x04\x92\xf9\xea\x27\xf2\xbc\xaf" + "\xd8\x7b\xa9\xbc\xc6\xbe\x35\xeb\xa0\x69\x76\x4a\x16\x69\xe3\xa4" + "\xbe\xed\x4f\xb7\x74\xf1\x58\x12\x70\x3f\xed\x30\xca\xf3\xb8\xce" + "\x63\x07\xfa\xcb\x5e\x37\xac\x0f\x9f\xd6\xe3\x15\x3f\x9d\x6b\xc8" + "\x68\xbc\x7a\x4a\xf7\x0b\xcd\x75\x03\x99\x3c\x18\xb7\xa6\x06\x29" + "\x79\xdf\x2b\x44\xf5\x9b\x44\xf0\xc5\x4d\x98\xcb\x4c\xe4\xef\x6c" + "\x14\xb7\xb2\x8c\x32\x7f\xd7\x82\x5f\x12\x81\xcb\x8b\x03\xa8\xb3" + "\x42\xe5\xd3\xfd\xd7\xed\xc8\xd7\x8b\x6b\x86\x30\x99\x68\x57\x05" + "\x59\x76\x69\x64\xae\xaf\xa0\x49\x48\x83\xad\xfb\x74\xbb\x21\xb3" + "\xf1\x70\xa8\xdb\x47\xb4\x13\xf5\x6e\xad\x10\xa1\xdf\x62\x3c\x77" + "\x6b\x22\xf8\x59\xe8\xee\xa5\x35\x53\x54\x1b\xd7\x4c\x31\x6c\x42" + "\xdc\xcf\x8c\xf6\x3f\x58\xe3\x88\x9d\x2b\x2f\x5b\xbb\xb6\xb4\x60" + "\xdd\x0a\xbe\x64\xde\xf0\xec\x8d\xe3\x23\xd7\x44\x78\xfc\x53\xf1" + "\x2a\xd6\xe4\xf1\xfa\xe3\x8b\xe9\xc6\x7e\xfa\x9a\x7a\x63\x0d\x54" + "\xf7\xdb\xbf\x93\xe7\x76\x3c\x07\xc2\xbb\x83\xef\x97\x6f\x61\x30" + "\x09\x1f\x5a\xc8\x14\x5b\xdf\xca\xa5\xa5\x4b\x8b\x6f\xe7\x9d\xb3" + "\xf1\xf1\xea\x69\x8d\xa9\x27\x38\x5c\x8f\x1a\x7f\xfc\x26\xce\xb7" + "\x63\x4b\xab\x48\x5b\x56\xa8\xce\x4c\xaf\x9d\x64\xac\x6d\xc5\xf7" + "\x77\x14\xf6\xf0\xce\x6c\x2f\xcb\x83\x6b\x0b\x99\xde\xda\xd4\x65" + "\x62\x3b\xb2\x02\xf7\xbc\xc6\x20\xd7\xca\xf4\xb8\x51\xbf\x39\xdf" + "\x85\xf1\x7d\x6d\x89\xa8\x11\xd0\xab\x6b\x8b\x46\x5b\x57\x88\xf4" + "\x15\x61\xdf\xc2\x6e\x5a\x5b\x75\x29\xdf\x23\xce\xcf\xed\x61\x9e" + "\x8d\x29\x17\x56\x7d\xb6\x16\xfc\x5f\x6c\xc4\xa1\x1f\xce\x53\x37" + "\xc1\x88\xc7\xb5\xf6\xc4\xa8\x7e\x23\xf5\xe3\x2c\x8a\xc7\x4b\x66" + "\xb7\x61\xde\x86\x76\x7e\xf7\x24\x95\x7c\xdd\x6c\x87\x8d\x30\x91" + "\x7e\x84\x7b\xfe\x04\x40\x02\xbf\x8b\xe2\xa3\x6b\xce\x34\x9b\xa1" + "\x5d\xa0\x65\x12\x84\xfa\x23\xb3\x7e\x93\x88\x9f\x49\x24\xc8\x5d" + "\xd5\x44\xf4\xe0\xd8\x31\x66\xb2\xa6\x26\x5b\xae\xfd\xc2\x24\xfb" + "\x9d\x77\x64\xcf\x74\x55\x94\x43\x2b\x87\x82\x56\x11\x71\x2e\xb2" + "\x7e\x99\xe5\x9b\x37\x56\x92\xf4\xab\xd9\xb1\x2c\xae\x4e\xab\x71" + "\x8b\x12\x3e\xc3\xae\xa5\x97\x65\xb9\x9e\x25\xd3\x1b\x83\x5e\x13" + "\xc7\x82\x66\xfb\x99\xe3\xbc\x02\xd7\xdf\xbf\x87\x34\xd0\xcb\x29" + "\xea\xcb\xb2\x94\xdd\xf9\xcc\x38\x6d\x67\x59\xd6\x08\x7c\x33\x31" + "\x7c\xd7\xcb\x64\xda\x5f\xd1\x63\xf2\x98\xef\x20\x8f\xc3\x4f\xef" + "\xe1\x3e\x6e\x5f\xa1\x4e\xb6\x65\x19\x46\x93\x5b\xab\x72\x7d\x42" + "\x26\xfd\x1c\xaa\xe9\x2c\x3d\x73\xd7\xa1\x51\xca\xf1\xb9\xef\xfe" + "\xf4\xa4\x2f\x06\xdc\xcf\x94\x7b\xe9\xee\xc3\xba\x2d\x83\x31\xf7" + "\x99\x6a\xf0\x86\xb4\x3f\xf1\xfe\x7a\xfe\x1e\x0d\xd2\x9a\x8d\x3c" + "\x71\xfb\xe8\x7b\xbc\x16\x2f\x5a\x99\x0f\xc4\xc0\x3f\x7b\xf8\x8c" + "\xcb\x28\xfe\x30\x63\x3d\xce\x9b\x79\x4f\x32\x29\x15\xfa\xc7\x75" + "\x41\x0c\x85\xdd\x94\x01\x71\x32\x85\x4d\x74\x6d\x68\x40\xe4\x77" + "\xf4\x9e\xc7\x58\x70\x82\xe7\x22\x09\x3f\x5b\xf9\x5b\x93\x27\xd8" + "\xd7\xea\xd9\xae\x51\x27\xec\x4a\x4f\x63\x5f\xab\x8a\x7f\x1a\xa6" + "\x0e\xfa\x2b\x75\x38\xff\x77\xa5\xa7\xf2\xaf\x48\x17\x95\x4c\xe7" + "\xa1\x01\xb1\xd8\x63\xfe\x5f\xc4\xdf\x47\xe2\x31\x0e\x74\x77\x9c" + "\xa5\x75\xab\x7f\x03\x38\x6f\xfc\x1d\xb0\x64\xec\xb4\xd9\xf4\x1e" + "\xee\x03\xee\x75\xc3\xe3\x5f\xdc\x98\x33\x09\xad\x35\x56\xe7\x63" + "\x26\x0d\x63\x29\xc7\xb8\xc3\x18\x3a\x83\xdb\x85\xe7\x2c\x7e\xc6" + "\x75\x0a\x5f\xad\x5b\x5b\xf7\x5a\x43\x8f\xf1\xd8\x9a\xcf\xe3\x26" + "\xd2\x17\x37\x0d\xc8\xb1\x36\x4f\x7f\x9e\xaf\x3f\xe7\xea\xcf\x73" + "\xf5\xe7\x1c\xfd\x39\x9b\x9f\xd5\x98\xbc\xde\x32\x6c\x2f\x98\xc6" + "\x1e\xc7\xb3\xdd\xe8\x0b\xe0\x93\x62\x75\x6e\x91\x63\xbb\x8e\xc7" + "\x0c\x1d\xaf\x2c\xfd\xd9\xc0\xe7\x1a\x6b\x68\xcb\x7f\x17\x3e\x0d" + "\x31\xf8\x1c\x88\xc0\x87\xac\xce\x9c\xcf\x82\x8f\xcd\xca\xdf\xa7" + "\xf8\x2f\xe0\xc3\xb8\x70\x5a\xc0\x5d\x9a\x19\x8d\x4f\xe9\x4c\x03" + "\x9f\xb8\xfc\xb6\x41\xf4\xb0\x5d\xb3\xfe\x73\x32\x06\xf4\x58\xb6" + "\x59\x9a\x06\x8d\x78\x85\xa5\xa5\x97\x8a\x57\x08\x59\xc0\xb8\x5d" + "\x8a\xf6\x97\xce\xd5\xed\xb7\x23\xca\xce\x2f\x3d\x68\xf8\x90\xa1" + "\xad\x07\xea\x54\x5b\x0f\x6e\xe7\x98\x7d\x65\xf4\x79\x97\x53\xf4" + "\x60\xde\xfd\x7f\x78\x6e\x18\x09\xb7\xb8\x74\xfd\xfa\xa7\x6f\x77" + "\x14\x2f\x5d\xb3\xc2\x71\xc3\x72\xc7\xfa\xa2\xd5\x2b\x4b\x57\x44" + "\xfb\x55\xd8\xf4\xef\x06\xc9\xf3\x22\x3c\x97\x92\x73\x69\xf0\xbf" + "\xd4\x93\xd2\x37\xef\xd9\xa7\x85\xbb\xb4\x8b\x75\xee\xbe\x9d\xea" + "\xfb\x52\x01\xf7\xb3\xd9\xc6\x18\x62\xcc\x7f\x79\x0c\x41\xfa\x62" + "\x8c\x93\x27\x22\xd2\x39\x6f\x91\x91\xc6\xf0\x75\xdd\x34\xf6\x24" + "\x3d\x3b\x8e\xeb\x8c\x4b\xc3\x01\xd1\x0c\xbb\x89\xbf\x9d\x61\x82" + "\x4e\x11\x1c\x7f\x8b\xcf\x61\xa2\x9c\x00\x3e\x72\x5e\xb1\x18\xcf" + "\x6a\xce\x26\x18\xc7\x0e\x94\xd9\x8f\x34\x33\xdb\x10\x98\x07\xf6" + "\x70\x39\xa4\x7f\xc4\xf1\x30\x90\x6e\xd1\xe3\x8a\x71\xda\x27\x1c" + "\xaf\x02\x69\xb6\x91\xb4\x0d\x29\x48\xb3\x23\xcd\xa1\xe0\x6d\xb8" + "\x86\xe9\x8c\xe7\x1c\x7d\x9d\x8c\xf3\x4c\xd7\xeb\xad\x8c\xc4\x99" + "\xbf\x1d\x73\xf3\xd4\x2c\xc7\xe2\x87\xbe\x36\xfb\x8e\x27\xd6\xae" + "\x59\x39\x9e\x24\xd9\x33\x31\x1c\x67\xdd\xec\xbc\xf1\x76\x47\xc9" + "\x8a\x15\xeb\x1c\x1b\x57\xac\x29\x75\x2c\xdd\xb8\xb4\x6c\x3c\xad" + "\x5c\xbb\xee\x09\x8e\xb6\xc0\xdd\xb2\xbe\xe0\x89\x95\xab\xd8\xf9" + "\x45\xe5\x1e\x1f\x65\x27\x2c\x66\xdd\xa6\xc7\x27\x39\x56\xc7\x36" + "\x64\xda\xb8\xe3\xb8\xe7\xb8\x5d\x76\x5c\xdb\xf0\x3b\x82\x5f\x0b" + "\x7e\x27\xf0\x3b\x7e\x9a\x36\x87\x70\x3d\x1c\x70\x6f\xf8\xc0\xb0" + "\x57\x46\x78\x68\x83\xcf\xe0\x21\xd8\x17\x87\xd5\xf8\xb6\xd1\xd1" + "\x19\x92\xf2\x33\xcc\x53\x75\x03\x23\x3c\xc5\x71\x47\x3b\xd9\xb7" + "\x6b\x03\xde\x0f\xca\x35\x4b\x5e\x33\x19\xc7\x74\x3b\x45\x9b\xae" + "\x6a\xda\x2d\xd8\xc7\x8c\xd7\x73\xdb\xc0\x2f\xed\x2a\x4e\xcd\xc6" + "\x46\xe4\xbb\x0e\x75\x1c\xd1\xeb\x50\xcf\x13\xc4\x31\xfe\x76\xcc" + "\x49\xfd\x99\x61\x9d\xa2\xb2\xd7\xf9\x9e\xaf\xfa\x1e\xaa\x55\xff" + "\xb6\x9c\x69\xe4\x9d\x73\x9e\x5e\x47\x2b\x68\x51\xb9\xcf\x2d\x82" + "\xc6\xdc\x99\xd7\x8a\xad\x09\x77\x0a\xe0\xd3\xa7\x25\x3e\xda\x25" + "\xe3\x60\x56\x0e\x42\x47\xdc\x72\x8b\xc7\x29\xf3\x27\xf0\x5a\xf2" + "\xc2\x12\xa1\xf1\x77\xa8\xb4\xc4\xa7\xba\xb8\x9c\xb0\x8d\x3b\xae" + "\xd5\xa6\xe4\x28\x9b\x81\xe3\x0f\x3a\x1d\x3a\xcc\x20\xd3\xf6\x34" + "\x6d\xf8\x93\x9a\x87\x6f\x0e\x29\x5b\xc2\x39\xc5\xf0\xb9\x84\x8c" + "\x66\xe2\x39\xdb\xd0\x01\x5e\x72\x5a\x74\xff\xb8\x56\xd5\x7e\x67" + "\xa9\xfe\xdc\xa2\xe3\x98\xc0\x31\x51\x80\xbf\xec\x3b\xd8\x2b\x2d" + "\xb8\x3f\x01\xfa\xb4\x2b\xfa\x38\xa5\x9f\x2f\xec\x26\x7e\x7f\x82" + "\xbf\xb3\x83\x77\x27\x54\xbc\x91\x8d\x07\xb9\xcd\x23\x3e\xb4\x8d" + "\x39\xa0\xdf\xeb\xbc\xd7\x0c\x59\x6a\xf1\x0c\xb0\x7c\x6e\x3c\x00" + "\x78\x87\x0c\xbd\xc3\x7a\xa6\x20\x0c\x39\x95\xf3\x29\x67\xb7\xa1" + "\x6f\x46\xf8\xc0\x19\x8c\xa7\x4b\xe2\xf5\xbb\xde\x37\x4b\x85\x7b" + "\x43\x36\x70\x3a\x24\xfb\x80\xe3\xb2\x0e\x0c\xcf\xdb\x86\x94\x8e" + "\x2c\x9b\x3f\x3c\xc7\xd4\xf1\xe0\x38\xf0\x5e\xc6\x6d\x50\xee\xff" + "\xeb\x7a\xa3\xac\xd4\xd0\x1b\x06\x1c\x6b\x82\xd0\xac\x4e\xfc\xab" + "\x16\x2d\xbc\x57\xc2\xe3\xa5\xb4\x47\x00\x27\xf5\x82\x3a\x0b\xa7" + "\xd5\x88\x16\x2f\x95\x4d\xe1\x6f\xcd\x49\x9b\xd6\xbd\x61\xd1\x88" + "\x2e\x2a\x3b\x16\x09\x53\x24\x83\xee\x80\xcb\xfa\x88\x6d\x92\x82" + "\xb0\x99\xe3\xd1\xb4\xe8\xe3\x0b\x74\x70\x59\xd0\xc0\x15\x34\x3c" + "\x66\xe0\xab\x7f\xeb\xec\x18\xea\xc9\x5f\x14\x1e\x62\x9f\xf0\x36" + "\xd5\x9f\x9b\xa5\xbe\xc1\xbb\x83\x01\xf7\xa6\x19\x5e\x7a\xb6\x4a" + "\x97\xa1\x76\x94\x3f\x78\xb4\x62\x2e\xf2\x6c\xca\xd3\xfd\x9a\x8f" + "\xa3\x7f\x4f\x44\xf0\xfe\xbc\x88\x75\x9e\x13\xaa\x0f\xef\xa8\x3c" + "\x49\x9b\xea\x23\xd2\xf5\xbe\x3d\x9a\x77\x92\x36\xcf\x53\xfe\x44" + "\xc2\xa9\xca\x6f\x92\x36\xaa\x81\x23\xeb\x02\x3e\xb7\xc7\x32\x2e" + "\x69\x2f\xfb\x78\xd3\x31\x63\xbc\x00\xac\xc3\x92\xe6\x13\xc4\x11" + "\xa6\x93\x8a\xfb\xb1\x61\x8d\xa2\xd3\x26\x5f\x14\xed\x79\xdc\x44" + "\x3d\x4c\xa7\xd4\xad\x42\x4b\xf5\x27\x88\x82\x32\x33\xb1\xbc\xb0" + "\x8c\xf3\x1e\x21\xf8\x43\xda\x55\x8a\x6e\x9b\xb3\x0c\xba\x19\x7d" + "\xc7\x74\xf2\xd2\xa6\x66\xa6\x6d\x74\x1b\xc7\x1e\x3f\x69\xb4\x1d" + "\x34\xe5\xd8\xa6\x78\x9e\xab\xcb\x45\x7b\xeb\x44\xf6\x21\xd9\x78" + "\xdf\x51\xf3\xd7\xe8\xa8\x73\x06\x29\xda\x6e\xae\x47\x3b\x7c\x11" + "\xf3\x92\x63\x4c\x5f\x96\x15\xe0\x79\x58\x8f\xc1\x75\x4c\xf9\x33" + "\x6d\x9c\x8b\xf9\xc4\x61\x29\xcb\x1b\x64\xac\x14\x8e\xdf\x7b\x9c" + "\x69\xc4\x7a\x91\x65\x89\x65\x80\xe5\x49\xd1\x68\x73\x6f\x04\x8d" + "\xda\x98\x3e\x3a\x9d\x0e\xc7\xe8\xf2\x15\x8e\xe2\xd9\x4a\x17\x3b" + "\x32\x6f\x58\x3e\x4d\x06\xbc\x71\xdc\x33\xe7\x76\x47\xde\xec\x1b" + "\x9c\x45\x53\x16\xaa\xcb\x9c\xbc\xf9\x7c\x1d\x1f\x3d\xaf\x73\x04" + "\xdc\xe5\x8b\xa3\xe7\x86\x5b\xbd\x4a\x7f\x94\x17\x7b\x13\xd2\xa5" + "\xbf\x30\xc7\x9f\xad\x5b\x43\x14\x06\xde\xb5\xa7\xd1\xa7\xc9\x62" + "\x31\xc7\x3b\x5e\xe4\x24\x8e\x8f\xfe\x49\x13\xde\xed\x43\x7a\x6a" + "\x09\x7f\x4b\xe1\x1f\x42\x4b\x11\x8b\x79\xcd\x46\xd4\xf8\xec\xbe" + "\xb4\x65\x16\x5f\xda\xd2\xe3\xbe\xb4\xa4\xb9\xf3\x6e\x74\x09\xc0" + "\x6d\x33\xda\xc5\x6b\x3b\xa0\xd3\xe2\x45\x4e\x11\x66\x1a\x15\x38" + "\x39\x26\x39\x60\x27\xf2\xda\x4e\x39\xda\xff\x4c\xa6\x9a\xbf\x96" + "\x83\xff\x37\x54\xeb\xba\x2c\x2f\xe0\xde\x02\xfb\xef\x36\xe9\x0b" + "\xa0\xb9\xed\x32\x96\xb9\xb6\xed\x2b\x0f\x8a\x1d\x4b\x8f\x1b\x30" + "\x01\x6b\x8c\xee\xff\x20\xe1\x7d\x56\xff\x5a\x6d\x27\x95\x58\x13" + "\x54\x7c\x48\xc8\x78\x65\x93\x49\xcb\x1f\xf6\x97\xc1\xbb\xd4\xad" + "\x36\xf6\xa7\xc9\x07\xef\x55\x72\x1e\xe3\x5d\x9d\x5b\xf3\xd6\x99" + "\xb4\x20\xfa\xd1\xa6\xec\xe7\x5e\xd6\x9f\x98\xbb\x6e\x39\x6c\x8c" + "\x6b\x72\x3c\x34\x51\xa5\x9a\xcf\x6c\x91\x7e\x9f\xe7\xdd\x66\xf2" + "\x52\xf9\xdc\xeb\x33\xe4\x1c\x25\xa8\xb9\x13\x48\xf9\x34\x6f\xf9" + "\xb1\xa1\x63\x79\xdf\xd4\xba\x55\xf8\x78\x8d\xd8\x1a\x12\x3e\xde" + "\x43\x95\x63\x07\x9d\x26\x4f\x79\xa0\xd2\x23\xbf\xfd\xc9\xdf\x20" + "\xf1\xeb\xe3\x46\x58\x8d\x1b\xa8\xdf\x97\xf8\x95\x42\x8c\x0f\x09" + "\xa7\x69\x8b\x93\xf1\x67\xda\xf0\x5e\x8b\x06\x5a\x79\x78\x9c\x64" + "\xfa\xa4\x27\xf8\xd8\x17\x86\xdb\x6a\x0d\xa1\xcd\x91\xed\x32\x69" + "\xde\x5a\x37\xda\x65\xe2\xef\x78\x9c\x61\x99\x09\xb2\x8f\x12\xe4" + "\x6d\x82\x8c\x6b\x2d\xe7\xe7\x15\x0d\x91\x6d\x64\xfd\xaf\xda\x50" + "\xf1\x4e\xbc\x36\x0a\x13\xb7\x91\x69\x50\x51\xa3\xcb\x9b\xc4\x93" + "\xf5\x47\x2f\x55\xcc\x4f\xdd\xca\xbe\x41\x62\x31\xf4\xdb\x1c\xee" + "\x43\x8c\x9f\xf5\x8c\x67\xbc\xfe\x62\x78\x0a\x96\x2b\xdf\xba\xb5" + "\xb2\x30\xe0\x76\x4d\x8e\x4f\x6f\xd7\xbc\x4b\xd3\xdb\xf5\x39\x2e" + "\xcf\x78\xf0\xfe\x8e\x35\x64\x22\x01\xbe\xc5\x7c\xad\x2a\x5e\xbd" + "\xa9\x5b\x9b\x19\xaf\xb8\xef\x04\xcb\x8b\xae\x83\xc0\x87\x02\x72" + "\x22\x58\x27\x01\xb7\x56\x43\x1f\x59\x13\x1c\x89\x52\x3f\x98\x44" + "\x7d\x3c\x18\xd6\xad\xf5\xbc\xcf\x35\x07\xf5\xc7\x7d\xaf\xf1\x77" + "\x3e\xaa\x45\x8e\xb6\xed\xab\xd7\x5b\x13\xe8\x4e\x5f\xe2\x57\xc7" + "\x5b\x9d\xa1\xc9\x4c\x43\xc0\x74\x42\x8e\x3b\x78\x9e\xaa\xd6\x46" + "\x2a\x61\xff\xef\x38\x20\xd7\x28\x53\x44\x8e\xda\x37\xaa\xc4\xf8" + "\xd7\xd0\x6d\xac\xcd\xe3\x79\x89\x97\xfe\xa5\x62\xf5\x26\x7e\xfe" + "\x15\xb1\x33\x09\xba\xdb\x2a\x1c\x9b\xac\xb0\x23\x2b\x2f\x68\x22" + "\xd3\x24\xd2\x93\x68\x84\x4f\x94\xdf\x94\xc1\x27\x28\xdf\x18\x9f" + "\x07\x2a\xdf\xbd\x34\x0f\x54\xee\xe0\xf7\x4c\x77\x35\x57\xa9\xec" + "\x36\xec\x14\xb1\xed\xf3\xaf\x38\x2a\x64\xfd\x4e\x55\x37\xd3\x24" + "\x87\xf7\x8c\xe6\x83\x2e\x95\x01\xf7\x56\x9b\xa1\x07\x98\x5f\xac" + "\x61\xfe\xde\x05\x49\x9e\xc6\x3b\xd8\x3f\xa5\x95\x6a\x1d\x3c\xe9" + "\x98\xfc\x6e\xa6\xbb\xdc\xe2\x73\x15\xed\xe1\xef\xc3\xfa\x53\x38" + "\xee\xf4\xd6\x3c\x2f\xfd\x4f\x65\x57\x24\x8b\xc3\x80\xd1\xb2\x4b" + "\xf9\x45\x5b\x64\xdc\x28\xc8\x34\xc7\x8a\x62\xb9\x46\x5a\x06\xf0" + "\xe6\xb8\x51\x98\xef\x6c\xad\x1a\x1e\x97\xdc\x39\xd0\x15\x42\x9e" + "\x6d\xc2\xb8\x34\xa9\x1f\xb4\x7b\xc9\xa4\x1d\x18\x98\x66\x27\x6e" + "\xf3\xc0\xb6\x89\x07\xbe\x3b\x95\xcc\xff\x8f\x7d\x19\x95\xdc\x4c" + "\x19\x5b\xbf\x66\xa6\x7f\xcd\x24\x13\xd3\xc1\x4b\x5b\x1b\x14\xed" + "\xb6\x76\x19\xfd\xe3\xa5\x4a\xd9\x3f\xbc\x86\xbc\x28\x24\x3e\x51" + "\xeb\xdc\x5b\xa1\xff\xd6\xd8\xd4\xfb\xf2\xc2\xd8\x35\x20\xb6\xe7" + "\x1d\xab\xd7\x3b\x96\xaf\xdd\xb8\xe6\xba\xeb\xa2\xe6\x4a\x66\xf5" + "\x3d\x5e\x77\xb2\x1a\x4f\xdd\x39\x06\xde\x6c\x97\xe0\x19\xed\x2f" + "\xbf\x28\xa6\xfd\xfc\x02\xdd\xdd\xbd\x20\x8b\x46\xee\xa7\xd3\xfc" + "\xe9\x11\x8f\xb7\xd0\xfc\x9b\x6f\x29\x78\x70\xc5\xd2\xe5\x65\x11" + "\xa9\xb7\x46\xae\x1b\xd6\xbd\x82\xba\x13\x27\xde\x0d\x5d\x91\xb0" + "\x70\x33\x8f\x2d\xdb\x6e\xad\x08\x89\x8f\xa1\xaf\x39\x6e\x4d\x41" + "\x47\x69\x88\x3a\xa0\xcb\xc4\xe7\x59\x87\x8f\x55\x67\x3c\x61\x4f" + "\x81\xb7\xac\x68\xbb\x0f\x76\xdd\x05\x5e\x9f\x41\xb9\x87\x3b\x1b" + "\x38\xb6\x73\xd2\x7c\x65\x63\x6c\xcb\x40\x7a\x1a\xae\xb3\x71\x1d" + "\x83\xeb\x5d\x8e\x35\x98\xf7\xb0\x4f\xfd\x06\xf6\xa9\xdf\x76\xa3" + "\xf4\x0b\xf2\x57\x12\xfb\x06\x9d\x22\x77\x3b\xdb\x20\x5e\xda\x56" + "\xce\xeb\xe0\x9c\x17\x65\xae\x72\x3c\x49\x59\x7c\x15\x72\x6f\x70" + "\x5b\x86\xd8\x91\x34\x5f\xec\xc9\xe7\xef\xba\x4d\x46\x7a\x59\x62" + "\xc2\x87\x94\x68\xb7\x8c\x0b\xb8\xb7\x39\x41\x7f\xf9\x2d\x86\xd1" + "\xbe\x81\x2b\xbf\x3d\x1c\x63\x1f\x8e\xd8\x86\xdf\x23\x69\xdf\xea" + "\xf6\xdc\x3e\x39\x2e\x6c\x6b\x8f\xb0\xe9\x78\x6f\x7a\xbc\xb2\x4f" + "\x44\x58\xd9\xa7\xdb\x7a\x0d\x39\xc0\x7d\xd0\xe0\xd3\xa8\x38\x7b" + "\x6b\x4a\x57\xac\x5b\xb1\xdc\x71\xc3\xfa\xf1\x14\x11\x65\xaf\x68" + "\xc5\x1a\xc7\xba\x15\xcf\x3c\xbb\x62\xbd\x8c\x90\xc7\x6f\xa3\xc6" + "\xfc\x0c\x91\x9e\x58\x62\x9c\xff\x72\x4c\x64\xfa\x6e\x7f\x8c\x63" + "\xb3\x89\x9d\x89\xec\xff\xdb\xab\xe6\x1b\x65\xb9\xd1\xf3\x8d\xe7" + "\xd4\xb9\xfb\xfa\xa4\x6c\x35\xd7\x79\x4e\xc6\x36\x44\xba\x65\x24" + "\x0e\xfc\xf6\x77\x40\x4b\x93\x4e\xb7\xf3\x01\xf7\xf6\x43\x06\xdd" + "\xbc\xf4\x9d\x99\xba\x2d\xd5\x2b\xf5\x07\xc6\x58\xe8\xbf\xa8\xf1" + "\x55\x7d\xfb\x76\x7b\x0b\x78\x23\x51\xae\x27\xa7\x25\xe5\x70\x5d" + "\x0c\xf3\x14\xca\xa3\x7f\xb2\xa1\x37\x59\xbf\x55\x19\xf0\x50\x67" + "\x33\xd7\xa7\xcf\x83\xae\x3e\x4d\xcf\xc9\x73\x39\x5a\x7d\x52\x0e" + "\xeb\x14\x8e\x25\xa2\xed\x00\x1c\xb9\x47\xfb\x9d\x99\x72\x1d\x96" + "\xbf\x45\x00\x58\xbc\x0e\x0c\xdd\x90\xc7\xdf\x49\xe6\x34\x15\x23" + "\x6e\xbb\x3c\x17\x81\xba\x66\x06\xdc\xcf\x95\x8c\x9c\x71\xf8\x0e" + "\x7f\x83\xdb\xc2\x70\xbd\xf4\xdc\x0c\x86\xa7\x62\xe0\x3d\xb7\xcb" + "\x4b\xee\xc6\x11\xfb\xe9\xb9\xae\x88\x79\x19\xf0\x51\x78\xfa\x81" + "\x8b\x8c\xb7\xaa\x7c\x4e\x65\xbb\x59\x7f\xee\xd2\xdb\x6e\xb4\x07" + "\xf0\xa0\xff\xb6\x55\x19\x7e\x13\x5e\xbd\xdd\x8c\x1f\xe3\x1e\x89" + "\xb3\x8e\xaf\x8d\xf1\x0d\xb8\xbf\x33\x29\x42\xb6\x79\x5d\x26\x09" + "\x69\x59\x23\xbe\xec\xdb\x9d\xb1\x7a\x63\xed\x1a\x47\xf1\xea\x35" + "\x4f\x15\x6c\x5c\xfa\xd4\x8a\x82\x67\x4b\xa6\x38\x9e\x5d\xb3\xac" + "\x78\xed\x13\x4f\x31\xd7\xac\x2f\x7d\xf6\x89\xa7\x1c\xac\x59\x0a" + "\xe6\xce\x9f\x5f\x70\xf7\x37\x1f\x7a\x78\x3c\xdd\xbd\x14\x69\x98" + "\xf9\xcf\xcf\x9a\xa2\x5e\x3d\x38\x6f\xce\xb7\x0a\xe6\x2c\xfa\xe6" + "\xc2\xc5\xf2\xf0\xcb\xf0\xfb\xb9\x6b\xe2\x67\x88\xe2\x43\x1b\x78" + "\x69\x26\xfa\x37\xe9\x24\x3d\x7f\x58\xc5\x4d\xff\x4e\x77\x74\xdc" + "\xf4\xef\x40\x9b\x7f\xd7\x8e\xdf\x0c\xa2\xaa\x22\xfc\xf0\xe6\xf9" + "\x03\x8a\xbf\xc6\x3d\x1a\x70\x7f\xd7\x36\xc2\x5f\xcf\xcb\x33\x65" + "\xec\xaf\xa4\xd6\x67\xbf\x0b\xfd\xbf\x3d\x2b\xf2\xdd\xc8\x7c\xf2" + "\xbb\xb9\xc3\xf3\xc9\x61\x9d\xf2\xdd\x52\x63\x6e\x89\xb4\xb9\x98" + "\x57\x8e\xe3\x79\xa5\x5a\x4f\x7a\xfe\x17\x92\xa7\x46\x95\x6f\x0b" + "\x19\xf3\x4a\x96\x6d\xb9\x27\x25\xe7\x1f\xdf\x3d\x14\x29\xe3\x72" + "\x4d\x5f\x97\x71\x2e\x27\xd7\xef\x6c\x65\x33\x78\x4d\x1b\xf6\xf1" + "\x4c\xd8\x0a\x18\xbf\x02\x42\xa4\x95\xcd\xd0\x71\xf2\xf1\x1a\x37" + "\xdb\xcd\x3a\x3f\xa5\x9e\xa6\xaa\x9b\x84\xfb\x3b\x73\xd5\x9c\xf2" + "\x3b\xcf\xb2\x5e\x17\xdb\x26\xde\xcd\xbe\x45\x3c\x77\x0a\xb8\xab" + "\x26\x8f\xf0\xec\xf3\x87\x99\x17\x46\xe6\xb2\x55\x51\xfa\xbf\x5f" + "\x7e\xc3\xb0\x6a\xb1\x11\xf7\xa1\xf4\x3a\x32\x99\xaf\xab\xa7\x5d" + "\x26\x51\xe9\xa5\x2a\x39\x6f\x65\x7a\x7a\xe9\xbb\x0e\xe4\x35\x8f" + "\xd0\xaf\xaa\x6a\x98\x7e\xfa\x3a\x8b\xb1\xc6\xa2\xf0\x7e\xfe\x17" + "\xa3\xd1\x2a\x3e\x9d\xaa\xba\x3e\x95\x4e\x6e\x4a\x62\x99\x34\xe8" + "\x75\x31\xad\x9e\x9f\x74\x31\xad\x9e\x7f\x3a\x82\x56\x2f\x5d\x4c" + "\xab\xe7\xf3\x22\xf6\x95\xf4\x75\x94\xe7\x7f\xc1\x34\x63\x1e\x43" + "\xbb\xcd\xe0\xb3\x97\x46\xe8\xf7\x7c\xe5\xc5\xf4\x7b\x7e\x57\x7c" + "\xfa\x3d\x9f\x75\x7d\x34\x9c\x3d\xf1\xc6\x8d\xd4\xad\x26\xfd\x5c" + "\xd8\xf7\xc6\xb5\x4d\x92\x73\xd2\xe0\x8b\x26\xad\xe8\x45\x37\x7e" + "\xb8\xf2\x3c\x62\xc4\x16\x17\x41\xd5\xd6\xef\x59\xda\x30\xe7\xe5" + "\x75\xa5\x4b\x8c\x45\x1f\x18\x6b\x1e\xb8\xef\xe2\xb9\x33\x7f\x1b" + "\x8a\xd3\x99\x9e\x98\x73\xf9\xc0\xef\x5d\xca\x2e\xfd\x5e\xfe\xf0" + "\x9a\xcb\xd4\x2b\x8f\x27\x6e\x25\xc7\xd1\xc6\x9b\x39\xbd\x04\xed" + "\x90\x7e\x8b\xec\xbb\x35\x1a\xcc\x82\x70\x0e\x8d\x02\x77\x98\xff" + "\x47\x3b\x1b\x1d\xa3\x8f\x8a\x96\xae\x59\xbe\x76\xe5\xca\x4f\x57" + "\x45\x91\xfb\x6a\xf5\x6e\xad\x2a\xc0\xdf\xe8\xdc\xf6\xe4\xa6\x80" + "\xfb\x05\xb6\xff\x0b\xd5\xb8\xf9\x02\xf4\xdf\x93\xd9\xca\x96\x7c" + "\xb4\x47\x9d\x07\x7f\xa1\x3a\x42\x3f\x83\x47\x5e\x68\x10\xee\xef" + "\x9d\x18\xe9\xe3\x17\x96\x5f\xdc\xc7\x2f\x38\xe3\xf7\xf1\x0b\x8d" + "\xda\x06\x3e\x8f\xf3\x02\xe6\x3f\xeb\xa4\xad\xc9\xcf\xec\x07\x81" + "\x39\x73\x0f\xe6\xcb\xbd\x8b\xca\x5a\xef\x2c\x28\x4b\x90\x7b\xc5" + "\xfc\x0d\x96\xd0\x80\xe8\x66\x5f\x04\xde\x1f\xe3\x6f\xb0\xf0\xb7" + "\x97\xf8\x5b\xa1\x32\x0f\xee\xeb\x4e\x91\x9c\x3b\xe2\xbd\xa3\xe9" + "\x94\xfc\x2e\x37\x6c\x85\x17\x82\x86\x6d\x6d\xdd\xea\x90\xe7\xd4" + "\x6b\x55\x7f\x74\x71\x5f\x70\x7d\x05\x65\xad\xaa\x8e\x01\xfe\xb6" + "\x1a\x59\x95\x0d\x51\x9d\x75\xc9\xb5\xfb\xb4\xa5\xa3\x9d\x9f\xb7" + "\x08\x53\xe5\xd8\xe1\xbd\x4a\xfd\xfb\xc7\x2c\xfb\xec\x47\x0a\xb8" + "\x55\xb1\x7e\xa8\xca\x77\xa8\xba\xd9\xf0\xc9\xaa\x93\x3e\x50\x64" + "\x65\xfd\xc9\xf3\x9c\x53\x54\xcd\x6b\x18\x18\x2f\xab\xdb\x22\xf7" + "\x38\x1d\x9b\xb6\x8e\x39\x4b\xd5\x4f\x5f\x62\xdf\x34\x79\xc4\x07" + "\xb6\x72\x6c\xc0\x5d\x63\x1e\xf6\x11\x73\x57\x8e\x6d\x8a\xc0\x0d" + "\xef\x1c\x11\xbe\x8a\x3e\x1e\x8f\x79\xfe\xd8\xa4\xbe\xc1\xea\x3b" + "\x45\x35\xf3\x90\x86\xf9\x44\x8d\x3c\xf3\xb0\x31\x44\x93\x4a\xee" + "\xe0\x6f\xf7\xd4\x3c\xad\xcf\x43\x7b\x1d\x15\x8c\x4f\x4d\x0a\xc3" + "\xf5\x22\x9f\x90\xfb\x01\x35\xce\x61\x9c\x23\xea\x33\x60\x2b\x9a" + "\xd4\x34\x1a\x78\xa1\x9c\x9c\xab\xf2\xf7\xb5\x23\xdb\xe4\x5c\xb9" + "\xba\xa0\xa4\xa8\xac\x60\xf5\x9a\xd5\xa5\xe3\xc9\xb9\xf4\xd9\xd5" + "\xd3\x90\xe4\x78\xa2\x68\x75\x49\xc1\x6a\x19\xb5\x58\x06\x44\x2e" + "\x2d\x2b\xe1\xbd\x8f\x8b\xf6\xe0\x6d\xd2\x96\x37\xd5\x1c\x56\xe3" + "\x7d\x6d\xb2\xc1\xa7\xf2\x9b\xe3\x22\x9f\x46\x7c\xaf\xe4\xb7\x89" + "\x13\x4f\x51\xed\xd7\x99\x87\x55\x9c\x9f\xba\x3c\x65\x5f\xd4\xce" + "\xbd\xd8\x27\xab\x36\xdf\xf0\xc9\x02\x7f\xdb\x58\xd6\x23\x60\x81" + "\xff\x6b\x9d\x71\xca\x54\x0f\xfb\x77\xea\xdf\x3b\xe7\xbe\x92\x71" + "\xef\x77\xb2\xbe\xad\xf9\xad\xc7\x39\x8f\x63\xf7\xea\x72\x55\x7b" + "\x24\x02\x5f\xe9\xcb\xcb\xb0\xf8\xbc\xd4\xb4\x60\xa4\x2f\x5b\xdd" + "\x6c\x8c\xbd\x76\xa3\x1e\xc7\x66\x13\xf4\x5d\x5d\x9a\xdf\xd4\x9a" + "\x28\xfd\x90\x51\x2e\xe0\xae\xb3\x18\x7e\x34\xde\xe1\x76\xd5\x4d" + "\x8a\xc5\x11\xb8\x5f\x87\xf4\x19\x23\x7e\x82\xb5\xec\xe7\x89\x79" + "\x63\x1d\xc6\xff\xba\xfd\x91\x69\x91\xfd\x74\xd7\xbc\xf9\x30\xa0" + "\xd7\xaf\x40\x27\xcd\x59\x5a\x5c\xcc\x3a\x68\xe9\x8a\xe2\x67\xd7" + "\xad\x5d\xaf\x77\xdd\x5d\x2b\x39\x1c\xb5\xcc\x72\xbb\xfe\xc6\xb1" + "\x66\xc5\x8a\xe5\x2a\x49\xef\xc8\xe8\x3d\x2b\xe5\xc7\x50\x87\xf9" + "\x7f\xb5\x77\xc4\x56\xac\xb7\x0b\x53\xdd\x12\xfc\x56\x49\xfd\x23" + "\xfb\xb5\xae\x3b\x7a\x8e\x56\xe7\x37\x64\x5f\xf6\x33\xda\xcf\xf4" + "\xeb\x17\x72\x8f\x07\xfd\xba\xe3\x3e\xb4\x33\x09\xf3\xc7\x5c\x9e" + "\x9b\x8c\xc0\xa9\x9f\x32\x4c\xef\x6d\x8f\x76\x6d\x53\x3e\x13\x66" + "\xe8\x06\x33\xc7\x96\xc0\x7b\xcc\xff\xab\x17\x2b\x3d\x59\x9f\x3f" + "\xbc\xf7\x62\x4a\xc4\x7c\xb3\xbe\x08\x73\x8f\x03\x17\xcb\x77\x7d" + "\xe5\xc5\x72\xcf\xbe\x96\xf5\x0d\x06\x8d\x0d\x5e\x50\xfc\xb7\xe3" + "\x56\x63\xcd\xb8\x49\xff\x36\x02\xdf\x73\x59\x9e\x57\x88\xd4\x94" + "\x3b\xd9\xaf\xe1\x24\xed\x30\x2b\x9e\xaa\xf7\x46\xf8\x06\xda\x4e" + "\xd3\x0e\x52\x7d\x5b\x1f\x34\xe4\xcf\x4b\xf5\xd2\x96\x63\x18\x6a" + "\x5c\xaf\xdb\xa2\xf8\x6b\xc7\x24\x83\xb6\x3c\x87\xc7\xf3\x94\x11" + "\x3b\xa8\xae\x5d\xfa\x8b\xa8\xd8\x1a\x43\xdc\x7e\xc0\x39\x68\xc0" + "\x41\x5e\xb4\xdf\xe2\x33\x68\x65\xe4\x89\xe4\x89\x39\x4b\x4b\x30" + "\xc1\x5e\xbd\x72\xe5\x8a\x75\xeb\x8d\x78\xe3\x99\x6b\x8b\x97\xab" + "\xf8\xe2\xb7\xa3\xfb\x37\x42\x86\x67\x73\x88\x72\xa4\xaa\xdb\x18" + "\x7b\x77\x0a\xaf\x89\x48\xff\x51\x39\xe7\xda\xbd\x75\x9f\x3e\xff" + "\x3a\x49\x2f\x66\x28\xff\xab\x9d\xcf\x2b\xdb\xf6\x8a\x1f\x02\xa7" + "\x5e\xc3\xb6\xe5\xb5\xd6\x7e\xfa\x22\xc7\x55\x94\x67\x0a\xf6\xee" + "\x16\xdd\xbc\xb6\x1a\x70\xef\xb4\x19\xdf\xa4\x63\xbb\xa9\x66\xb7" + "\x8a\xa5\xdd\xba\x86\x7d\x45\x76\xbf\xaa\xd5\x88\x2c\x91\x7a\xb6" + "\x10\xf6\x59\x32\xcb\x44\x4a\x2f\xfb\xf0\x72\x0c\xac\x9d\x4b\xd8" + "\xae\x63\x5d\xc6\xdf\x6d\xe8\xa6\x9d\x53\xa0\xa3\x01\x6b\xf7\x7e" + "\x5f\x8a\xc8\xda\xbe\x89\x2c\x5c\x07\xf4\xb5\xb7\xad\x99\x69\xbb" + "\xd3\xf9\x3e\x74\x99\xae\xb3\xbd\x5c\x8f\x97\x76\xce\xd5\xd7\xfd" + "\xe7\x0a\xdb\x18\x27\xeb\x42\x75\x5e\x74\xe7\x41\x51\x83\xb4\xea" + "\xb3\x07\x40\x47\xfe\xe6\xe1\x01\xf5\xbd\xbf\x9d\x6d\x2a\x7f\x1f" + "\xaf\x6b\x04\x45\x4d\x5f\x0f\xd2\x27\x21\xdd\xab\xd2\xcf\x1d\x58" + "\x14\x0e\xf2\x3c\xf9\x5a\xfe\x76\x25\xea\x44\xfb\x53\x1a\x14\xdf" + "\xf7\xfd\xef\x2f\x57\x92\x93\xbf\x77\x29\xe7\x85\x3b\xc6\x59\x00" + "\xa7\x8b\xbf\x2b\x89\xfc\x98\x3b\xed\xe8\x05\xbc\x2e\xdd\x9f\x1c" + "\x7c\xf7\xe2\x0e\x75\x4e\x60\xc7\x07\x4c\x4f\xe0\x98\xa7\xaf\x05" + "\xe7\x05\xdc\x2f\x42\xff\x5d\xa3\xcf\xab\x5f\xcc\x33\xea\xc0\x58" + "\xea\x83\x0d\x3e\x83\xed\x70\xd0\x20\x13\xbf\x29\x75\x72\x5f\xde" + "\x8b\x31\xc4\x2a\xd8\x0f\x6e\xe4\x1b\x7e\x2f\x56\x19\xe3\x2a\xd7" + "\xad\xd3\x61\x3e\xaf\x1b\xf2\x9a\xa1\x5e\x17\xc7\xd2\x4c\x30\x60" + "\xe2\x39\x53\x1b\x38\xd3\x0c\x98\x16\xd8\x08\x3e\xfd\xdb\x6d\x53" + "\xea\xce\xb3\xcf\xa4\x17\x36\xc0\xb5\xa2\x20\x64\xe3\xfd\xac\x14" + "\xe3\xdb\x78\x4d\xe7\x99\xf6\x2f\xfa\x47\xf6\xa9\x50\x1e\x7d\x09" + "\xd9\xaa\xec\xa6\x5d\x29\x5c\x2f\xcb\x15\xf3\xc5\x20\xfa\x19\x7d" + "\x5d\x24\x06\xce\x1c\x72\xac\xa1\x94\x53\xb4\x6b\x3a\xf7\x37\xef" + "\x2d\xb3\x2f\x23\xd2\xac\x1c\xcb\xff\x24\xed\xba\x86\xfb\x9a\x71" + "\x01\x0d\x67\x86\x02\xf9\xf7\xf2\x39\x6e\xd6\xbf\x5b\xca\x61\xbf" + "\xaf\x64\xbd\xf4\xd2\xab\xbc\x1e\xc0\xdf\x60\xe2\x7b\xd7\x72\xa1" + "\x49\x5e\xd9\xc4\xbc\xf2\xd2\xab\x5b\x7a\x84\xf6\x89\x9b\xc4\x31" + "\x3f\xd1\x27\x26\x0a\x05\x4d\x09\x8c\xb7\xc9\x75\x86\xcf\x9a\x37" + "\x93\xc7\x59\xc5\x7e\x71\x96\xda\x4d\x64\xe3\x73\xfa\xfc\x7d\xa1" + "\x4e\x3f\x7f\xff\xb9\x91\xfe\x10\xda\x45\xad\x1b\x38\xe6\xca\xee" + "\xdc\x3f\x3a\x77\xf1\x7e\xdd\x38\xdc\x8f\x73\x7c\x8b\xeb\xda\xe5" + "\xfd\xe3\x89\x3f\xd3\x1f\x5b\xff\x4c\x8e\x47\xe4\xb3\xaf\x3d\xff" + "\x0f\xd4\x9e\xf3\x07\x72\x75\x0b\x8d\xe7\x88\x15\x4f\x73\x1d\x55" + "\x80\xd5\xcc\x67\xda\x6d\x5a\xbf\x7d\xbc\xfa\x6e\x2e\xfb\x46\xfa" + "\xa8\x75\xcd\xaf\x18\xc7\x67\xf6\x9d\x27\x4b\xeb\x9a\xdf\xca\x7b" + "\x35\x77\x3b\xd3\xec\x59\xde\xc5\xf6\x69\x88\xcf\xf3\xf3\xfe\x26" + "\xe6\x2b\x5a\x1d\xe3\x18\x56\x78\x83\x5e\x66\xa3\x3c\xec\x57\xa3" + "\xfc\x0c\x2e\xbf\x97\xe9\x01\x9c\x3a\x16\x2b\x9a\xb4\x63\x96\xaf" + "\x70\x06\x7d\xf2\x23\xe9\xb3\xab\x9e\xe9\xc3\x71\x60\x35\xf4\x17" + "\x70\xcb\x01\x0d\x34\xa3\x0e\xe0\x6c\xd1\xd7\x83\x2d\xb5\xe7\x29" + "\xb9\x75\x0d\x7f\x5f\xee\xa5\x0b\xd6\x3c\xb3\x45\x1b\x38\x7b\xa8" + "\xee\x02\x99\xb9\xdf\x78\x0f\xa8\x4e\xbe\x97\x34\xef\xe2\x3e\xf3" + "\xa5\x68\xcd\xf8\x41\x46\xb5\x03\xcc\x77\xb8\x1e\x44\x7f\x55\x01" + "\x87\x12\xf4\x55\x33\x5f\x75\x19\xeb\xe2\x58\x27\xfa\x7c\x6c\x24" + "\x1d\x72\x14\xe2\xef\xbf\xca\xf5\xae\x97\x4a\x34\xc8\x11\xaf\x07" + "\xed\xdb\x49\xc9\x9a\x7b\x47\xc9\x5e\xe8\xcd\xc6\x9d\xf2\xac\xb3" + "\x8d\xd7\x48\x5f\x91\xdf\xeb\xd8\x3d\xbc\xff\xf9\xbd\x09\x7c\x1e" + "\xf4\xa5\x66\x13\xaf\x21\x55\x8b\x5c\x9d\xcf\x73\x91\x07\xfa\xdf" + "\xae\xcb\xc3\x8b\x52\x2f\xb0\x1e\x19\x6d\x6e\x02\xbb\xb8\x5d\xec" + "\xc9\x27\xde\x4b\x4a\xde\x2a\x7c\xc9\xdd\x56\xd1\xe9\x6f\x97\xe7" + "\x80\x3b\xfd\x61\xb9\x97\x84\xf7\x09\x0b\xfd\x3e\x2b\xec\xe8\xe3" + "\x4c\x3b\x23\x9d\xf7\xa1\x78\x8d\x6e\xa1\x5f\xf8\x16\x95\x59\xf9" + "\xfb\x9a\x93\xe4\x3e\x84\x9e\xde\x69\xc7\x1c\xa4\xcc\x67\x45\xdb" + "\x43\xc3\xb0\xfa\xf3\x13\x59\xde\x90\x37\x63\x38\x6f\x7f\xbe\xd9" + "\xe3\x54\x75\x46\xa4\x25\x2d\x72\xa2\x2c\xf7\x95\x9e\xa6\xec\xef" + "\xef\x3b\x87\xe7\xa7\x7c\x16\xa2\x1f\x63\xf0\xfa\xfc\x04\xad\x3f" + "\xdf\x14\x06\x6c\xf0\xbe\x4d\x7e\xe7\x33\xe4\xd3\xbf\x9b\xc5\xdf" + "\xfa\xee\x22\xb1\x63\x4b\x1e\xf2\x99\x19\x2e\xc7\x97\xe0\xef\x8d" + "\x88\x34\x57\xdc\x18\x45\xa2\x7e\x95\xa5\xb5\xe2\x11\xf0\x53\x43" + "\x25\xcb\x73\xd8\x46\x85\x8e\x27\xd9\x1e\xfa\xfe\x27\x4c\xcf\x30" + "\x64\x2c\x9c\x46\x85\xd3\x7a\x28\xa1\x02\x7c\xab\xd6\xb3\x1a\x3e" + "\xe7\x81\x0c\xba\x34\x01\x9b\xb6\x21\x99\xf9\xc6\xda\xcb\x7e\x77" + "\xb4\x5c\xfa\xba\xa5\x3f\x41\x9e\x60\x0f\xb5\x57\xfe\x95\xda\x43" + "\x9e\xca\x23\xe7\x7d\x66\xe5\xf3\x66\x06\xdc\x86\x9b\xf8\x9d\x0b" + "\xbc\x5a\x10\x6e\xa6\xd1\xf6\x19\x78\xae\x0d\x7d\xfd\x0f\x35\xef" + "\x6c\xa8\x34\xe6\xd8\x9f\xd2\x86\x2e\x8e\xc9\x21\x84\x9d\xb4\x9d" + "\x77\xf1\xde\x94\x4b\x04\x32\x69\xda\x26\x5e\xdf\x6b\x38\x84\xf9" + "\x4e\x8e\x0e\xb7\x4f\x87\xdb\x75\x29\xb8\xcc\x33\xed\x0d\x72\x8f" + "\x0b\x6d\xca\xf1\x85\x01\x3b\x9c\x7e\x57\x16\x74\xbc\xcb\xf5\x09" + "\xaf\xff\xbe\x72\x8d\xb6\x33\xc7\xd7\x19\x3a\x4e\x1c\xdb\x67\x9f" + "\x86\xb1\xb6\xcf\x4e\xba\x7f\x9f\xeb\x2c\xbd\x3c\x4e\x13\x99\x36" + "\xcc\xfd\x79\x6f\xc7\xc5\x3a\x8e\xd7\x15\x2a\xc2\x34\xc6\x53\xea" + "\x25\x8e\x47\x01\x18\x69\xbf\xe3\x7d\x34\xe8\x89\xb0\xb0\x9b\xde" + "\x1d\x80\xd5\x00\xdd\x29\xe3\x53\x6c\xfb\xfc\x2b\xa9\x5b\xe9\x4e" + "\x61\xb2\x4a\xff\x50\x6d\xc7\x52\xf6\x3d\xcd\x97\xf8\xd4\x8a\xfc" + "\x08\x5f\xc2\x44\xd4\x55\xc3\xbe\x84\x22\x59\x4c\x6a\x94\x6b\x98" + "\x54\x18\x70\xbf\xdc\xe2\xa5\xef\xcb\xf3\x08\xd5\x7c\x5e\x44\xea" + "\xd8\x57\x6e\xf0\xa5\x65\xf3\xde\x1e\xc7\x9c\x4e\xd0\x36\x84\x0f" + "\xd5\x9d\x93\xb6\x3a\xbf\x4b\xea\xec\x0d\xb4\x8a\xfa\xec\xe3\x7c" + "\x36\x52\x87\x6d\x05\xec\xbf\x88\x1d\xd9\xc7\xbd\xf4\x8a\x8a\x67" + "\x5a\xcf\xf7\x2f\xfb\xf8\x7d\x68\x28\x93\x70\x5f\xdc\x38\xc8\xfb" + "\x0a\x2f\xdb\x85\xfb\xda\xd6\x7e\x5b\xf6\xf1\x87\xec\x6c\x9f\xbd" + "\x32\xd3\x6b\x6a\x9c\xa2\xaf\x29\xca\x58\x1b\xa3\xcd\xb7\xc4\x1e" + "\xfb\x78\x0f\x80\x60\x6e\x9c\x71\x9a\x1a\x7f\x3c\xe8\x26\xd3\x10" + "\xec\xca\x41\x13\xd9\x20\x5f\xc9\xb5\x13\x29\x0b\xef\x26\x9e\xa6" + "\x57\x6a\x42\x26\xca\xc0\xcf\xe6\xfb\x7c\xd1\x38\xc0\x95\xeb\xad" + "\x1d\xe7\x79\xbd\xec\x95\x33\xd2\xee\x7b\x85\x26\x6b\x80\xc7\x7b" + "\x47\x75\x13\x69\x32\xaf\x79\x22\x2d\xb3\x20\xac\xf6\x50\x8d\x75" + "\x8d\x6d\x13\x69\x4a\x74\xbd\xaf\x94\xaa\x35\xd1\x46\xb9\xaf\xb2" + "\xd1\x47\x5f\xc0\x3c\xed\xe4\x29\xda\x53\x24\xdc\x89\x42\x7c\xde" + "\x6e\x52\x7e\x0e\x7b\x1e\xb0\x36\x28\xbe\x93\x7b\x86\xe0\x37\xde" + "\x93\xd5\xf7\xa7\x12\x64\x8c\x91\x74\xb3\x8f\xbf\x6d\x1d\xb1\xe6" + "\x6c\x93\x78\xe8\x71\x01\xc2\xdb\xbe\x52\xc8\x30\x18\x9f\x82\xa5" + "\x6a\x6f\x8b\x63\x06\x80\xc6\xf2\xcc\x7e\xf5\x2b\x94\xfc\xc2\x2b" + "\x64\xeb\x58\xc9\xed\xda\xa3\xca\x98\xcc\xc4\xf8\x6a\xf5\x2c\x67" + "\xe0\x09\xe0\xcd\xf5\x31\x6f\x74\x86\xfa\x5a\x5d\xa5\x42\x6b\x7d" + "\x92\xed\xda\x3d\xef\xb7\xae\x3b\x48\x8b\xba\x43\xea\x7c\xeb\x12" + "\xf2\x35\x01\x5e\xd3\x44\xb2\x01\x56\x87\xa7\x98\x78\xef\xe3\xfa" + "\xd6\x75\x87\x19\xf6\x87\x3c\x16\xd4\x80\x3e\x6a\x4c\x68\xdc\xe5" + "\x09\x76\x51\x07\xe4\x7b\x61\x89\x08\x33\x9c\x53\xd4\xf8\x39\xd9" + "\xde\x3d\x76\x47\x81\x8a\xeb\x20\xdb\x3a\xbc\x67\xa8\xb7\xc3\x73" + "\x9e\xe1\x35\x4e\xf1\x14\xc2\x5e\xd4\xdb\x64\xd0\x5a\xf1\x57\xe3" + "\xea\xd6\x75\xfb\x89\xfb\x87\xf3\xe3\x39\xdf\x03\x2b\xa6\xe0\x4c" + "\x74\xbf\x70\x1e\xbc\x7b\x1e\x70\x6f\x1b\xd9\xf7\xe6\xfd\xd8\x91" + "\x3c\x8d\xaf\xf0\xd9\xb6\x57\xda\xf7\x80\x46\x6a\x9f\x60\xcf\x05" + "\xc6\xd5\x4b\x7b\xfc\x9e\xd2\xbf\xc6\xf7\x6f\x85\xec\x83\xef\xb7" + "\x76\xca\xfd\xbf\xc6\x8f\x16\x86\x34\xa1\xf4\xd9\xde\x06\x0d\x7a" + "\xc0\x8b\x2b\xeb\x02\xa9\x4f\xa6\xb2\x4f\xd1\xde\x97\xad\x09\xaa" + "\x7f\xb9\x2d\x6c\xaf\xc4\xeb\xe3\x88\xbd\x49\x1b\xe3\x6a\xf4\x31" + "\x7f\x17\x52\xe3\xfd\x65\xf6\xdd\x1f\xb2\x93\xe2\x3f\x51\x0f\xb8" + "\xcf\xeb\xb6\x5b\x83\x3e\x96\x35\xf4\xa7\x51\x31\x9f\xb5\x34\xfc" + "\x8c\x21\xbf\x45\x05\xca\x37\xdc\xce\x3a\xaa\xc9\xa4\x64\x87\x71" + "\xd4\xcb\xee\x52\xfe\x1d\x7b\xf3\x51\x7e\x57\xdc\xf6\x26\x42\xef" + "\xb8\xa1\xa6\xd1\x1e\xb6\x23\x05\x74\x15\xc6\x83\x31\x1e\xff\xa0" + "\xfe\x4d\xce\x7d\x57\xc1\x3e\x1f\xc3\x67\xad\x0c\xdc\x2e\x6f\x1f" + "\x71\xaf\x57\xcd\x93\xf6\x39\x8c\x75\x2a\x61\x03\x8d\xdd\x56\xc1" + "\xe7\x2e\xf9\xec\x8c\x3f\x6d\x95\xcd\x97\x56\x96\xa3\xe4\x66\x5f" + "\xae\x48\x53\xfa\xb6\x20\x48\x52\xa7\xf3\x3e\x31\xe6\x60\x63\xb8" + "\xcd\x80\x83\xf9\x5f\xc9\x61\x35\x9e\x2b\xd8\xa3\xae\x13\x19\x6d" + "\x43\x9b\x64\xdb\xd0\x46\xd9\x36\xfd\x9b\x55\xa8\xeb\x23\xb9\xf6" + "\x7e\x59\xed\xd9\xa7\x62\xa4\xd5\xaf\xb2\xf1\xf7\x78\x4f\x51\xf3" + "\x16\x79\x9e\x06\x7d\xa2\xf6\x54\x9a\x66\x8a\xf1\x2f\x8c\xbf\x3c" + "\x98\x4d\x66\x05\xb3\x2c\xe7\x25\x8e\x6f\xa9\x7f\xf7\x0e\xb0\x57" + "\x88\x1d\x65\x39\xf2\xbc\x22\xea\xe3\xef\x86\x8e\xe8\xa1\xa6\x1e" + "\xee\xab\xa9\x07\x29\x47\xf1\x61\xd3\xdf\x78\xdd\x5a\xcd\x19\x9b" + "\xaa\xc1\xf7\x79\x6a\x0f\xc1\xf0\x49\x4f\x90\x3e\xe9\x91\x3a\xf6" + "\x32\x71\x94\xfa\x4e\xa4\x17\x1e\xc2\x7d\xb9\x3c\x77\x09\x7c\x37" + "\x86\x0c\xfd\xd7\x54\xce\xfe\x4d\xc3\xbe\x05\x65\xe0\x95\x0a\x75" + "\x36\x3d\xe0\x6e\x1e\x8e\xff\x28\xbf\x73\xe6\x16\xc7\x38\xdf\xa2" + "\xb2\x3e\xe9\x7b\x50\x27\xe3\x28\x9c\xd6\xcf\xec\x35\x4f\xd7\xd7" + "\x48\x32\xf9\x3c\x00\xca\x62\xfe\x7b\x54\xce\xf7\x99\x06\x5c\xb7" + "\xc4\x5d\x7e\x6b\xac\xb9\x74\x64\x0f\xa9\x49\xae\xb5\x28\x1f\xd9" + "\xe6\x6a\x83\x47\xd0\xde\x31\x2a\xde\xe8\xbe\x0b\x47\xa7\x90\xe4" + "\x81\x7e\x61\x1f\xff\xc5\x46\xe6\xc9\xe6\xc3\x91\x74\x5a\x14\xd2" + "\x5c\x4a\x07\x35\x35\x0a\x29\xeb\x4d\x8d\x9f\x6e\x4f\xbc\x3a\xce" + "\xb0\x45\x14\x9d\x6d\xd0\x2f\x3f\x38\x21\x69\x5d\xdd\xc7\xdf\xdc" + "\xb5\x6e\xae\xe0\x38\x56\xaf\xfe\x9e\xe3\x85\x85\xaa\xfb\x1a\xc2" + "\x7c\xbe\x13\xe3\xac\x56\xdd\x77\xe0\x54\x09\x99\x0a\x4a\x78\xdf" + "\x2c\xbb\x99\xe7\x57\xc2\x05\x5b\x20\x15\xf6\x09\xe4\x7c\xcb\x6a" + "\xb2\x3e\x56\x04\xd8\xae\xcc\x0c\x8e\xe7\xc5\xb1\xbc\x38\x1e\x5f" + "\xd8\x95\x99\x8e\xfb\x09\xb0\xe7\x6c\x22\xb9\xaf\x8a\x7d\x6f\xc2" + "\x6e\x01\x7d\xfc\x01\xc7\x14\x33\x79\x7c\x41\xda\x72\x86\x2c\x1c" + "\x2f\x2c\xb4\x23\xbb\xa5\xd3\xff\x37\x39\xb7\x48\x2d\x81\x3d\xad" + "\xc9\x33\x3e\x76\x2d\x2d\xbb\x19\x63\xfc\x7e\xd5\xee\x3e\xa1\xda" + "\xad\xf0\x66\xfc\xa5\x8e\xc3\xbc\xb7\x42\xe2\xfe\x83\xa7\x43\x80" + "\xaf\x55\x0f\xec\x0f\x57\x0f\x34\xab\x73\xa1\xed\x54\x51\x2a\x7a" + "\x3c\xb0\x8d\xd9\x17\x94\xcf\xfe\xb2\x6f\x0f\xb7\x91\xdb\xc7\x75" + "\xff\xf1\xfc\x19\x19\xff\x2c\x84\x67\x57\xb1\x5e\xa6\x17\x65\x7a" + "\xdb\x69\xb0\x7a\x40\xb6\xbd\xd3\xaf\xca\x16\xc8\x7b\x94\x8f\xa4" + "\x83\xde\xe6\x61\x3a\xa0\xed\xdc\x3e\x6e\x7f\x88\x69\x02\x1a\xe8" + "\x6d\xb5\x0f\xe9\xed\xe4\x36\xfe\x01\xa3\xce\x2b\x68\x27\xda\x2a" + "\xdb\x39\x84\x76\x1e\x2b\x22\x0a\xee\x5c\xe5\xf8\x24\x75\xa0\x99" + "\xe7\x87\xae\x3f\xc1\x8e\x2e\xaf\x27\xcc\x03\xcd\xaf\x57\xd4\x9b" + "\xbe\x07\xdb\xa4\xc2\x87\xf9\xa0\x4f\xf4\xb0\xbd\xef\x29\xc1\x2f" + "\xd4\x28\xbf\x65\x2c\xed\x63\xfe\xee\xec\x33\x68\x93\xf6\x11\x55" + "\xf4\x88\x1e\xd8\xa6\x41\x4f\x08\x79\x8a\xd0\x7e\xcc\x1f\x4f\xe9" + "\xf8\x73\xde\x2d\xe7\x54\xbb\xac\xc5\x94\xf1\xde\x23\x55\x26\x4f" + "\x57\x15\x19\x6d\x79\x1c\xf9\xd0\x1e\x3b\x60\xa5\xc8\x6f\x3d\xa0" + "\x9d\x7b\x80\x67\x30\xa2\x4d\x1d\xbd\x41\xc0\xfc\x0b\x8d\xcf\xa3" + "\x84\x57\xce\xa2\x1d\x67\xc9\x5e\x5f\x01\xfb\xeb\x41\xb6\x17\xff" + "\xc7\x6b\x57\xe4\xd3\x64\x2f\xbd\x7a\x50\xe9\x78\x19\x8b\xe8\xaa" + "\xd3\xf4\x83\x8e\xe1\x78\x43\x1c\xc3\x2d\x2d\xfb\x08\xf3\x91\x8c" + "\x3b\xc4\x63\x46\x00\x3c\xc3\x7e\x39\x1b\x51\x47\x20\x73\x82\xc4" + "\xc7\x3d\x83\xf0\x9c\x8c\x67\xfe\x0e\x55\x06\xaf\x09\xa0\x5c\x8b" + "\x00\xcd\x18\x3e\xec\xb9\xfd\x7c\x65\x1a\xc6\x3d\xb7\xf2\x33\x9a" + "\x89\x3a\xf2\x79\xee\x7b\xa8\xc2\x67\x7a\xee\x67\x34\xe5\xf2\x74" + "\xca\x0f\x42\xa3\xe9\x6f\xde\x03\x61\x78\x68\x5b\xfa\x69\xda\xff" + "\x61\xb4\x8c\x39\xa4\x2e\x53\x7a\x70\xff\x01\xde\x77\xb8\xbc\x7a" + "\xf7\x4b\x1b\x8e\xfd\xa7\x2e\xb3\xdc\x41\x03\x0f\xdc\x8f\x7a\xf6" + "\xea\xf2\xe9\xf0\x9a\x79\x34\x58\x35\xbb\x65\x0c\x3a\x57\xed\x6e" + "\xe8\x0b\xd8\x0a\x47\xed\x1c\x17\x1c\x63\xe7\x7e\x3f\xad\xdf\x4b" + "\x16\xd7\x19\x5e\x93\x59\x40\x47\x1b\xb3\x68\x1f\xe6\xe4\xa2\x3f" + "\x33\xfd\xc5\xf3\xe8\x4b\x5d\x87\xb0\x4d\xca\xe7\x32\xc5\xfa\x4c" + "\x5b\xdd\x6e\xc3\x86\x7f\xad\xa3\xfc\x02\x99\xd4\x77\x57\x5e\x6b" + "\x9f\xeb\x10\xa1\x5d\x26\xad\xa8\x91\xe3\x68\xa5\x2f\xcd\xe3\x38" + "\x5a\x46\x6c\x2a\x69\xfb\x38\x21\x73\xfd\xf6\xf1\x35\xeb\x68\x0a" + "\xc7\xd3\xb3\xfa\x94\x2d\xa7\xc6\xeb\xd7\x58\xc7\xda\x74\xdf\x01" + "\x9b\x8a\x57\xb5\x7f\x6e\xd3\x79\xd4\x25\xdf\xff\xf0\xa6\x30\xe6" + "\x30\x12\xee\x3a\x9a\xdc\x78\x9e\x32\xd9\x0e\x2a\xf8\x48\xd9\x6c" + "\x3c\x2f\x5c\xd0\x6b\x15\xe1\x7f\x65\xd2\xde\xd3\x23\xf1\xf6\x7c" + "\xeb\x39\x46\x9f\xb0\x8f\xb6\xef\x52\x37\x41\xfa\x0f\xc9\x18\x2f" + "\xea\xbb\x7c\x44\xbb\x76\x92\x99\xbf\x43\xcb\xeb\x82\xbc\xce\xcc" + "\x67\x88\xd4\x18\xf2\xc3\x46\x23\x0e\xd9\xa8\x7b\x92\xf5\x6a\xbe" + "\xa3\x8d\xc1\xfc\xcb\x17\x68\x6d\xdd\xc0\x63\xc6\x0f\xbb\xf9\xdc" + "\xd2\xc8\x1c\xe7\x87\xbf\xe3\x77\x9c\xc6\x7e\xf5\x39\x92\x96\x3f" + "\x4a\xe6\x79\x8f\x3e\x67\x7c\xcf\x31\x9c\xa6\x6c\x18\x1e\xcb\x18" + "\x87\x26\xb5\x26\x9d\x1a\x70\xff\x28\xd3\x18\xcf\x78\x5c\x57\xdf" + "\xc0\xfd\x51\xb6\xd7\xb4\x6f\xd4\xf3\x81\xc6\x1a\xbd\xf4\x99\xe3" + "\xf8\x62\xee\x1f\x15\x1b\xe3\x9b\xfc\xc6\xc9\xb6\x89\x77\xaf\x2f" + "\xa3\x49\x0f\x7d\xce\x22\xe3\x78\xf0\xb7\x4c\xd5\xb8\xfb\xa3\x5d" + "\x23\x7b\x73\x39\x92\xde\xf2\xfb\x85\x3c\xc7\x30\x61\x0c\x56\x31" + "\xf5\x7a\xd5\xf8\x6b\x9c\x99\xff\xd1\x9b\x11\xf5\x9c\x18\x1e\x47" + "\x51\x07\xfb\x88\x30\x7c\x65\x9b\xfc\xa8\x8a\xeb\xe0\xb9\x95\x1a" + "\x5f\x7f\x74\xa9\xf3\x85\x99\x4c\x5f\x4d\x9f\x4f\x7a\x7a\x3f\x56" + "\xf4\x75\x52\xe2\xb4\x5d\x64\x7f\xaf\xc2\x6b\x4e\x55\xb1\xa1\xac" + "\x27\xe9\xc0\x0d\xfc\x9e\x79\xbd\x75\x2a\xaf\xc5\x1d\xd8\xea\xe1" + "\x71\x7b\x28\x3f\x79\x21\xcf\xf5\xa5\x2d\x7e\xa0\xe4\x26\x94\x43" + "\x5a\xfa\x6f\xce\x06\xcd\x75\x9b\x68\x0a\x7f\x27\x14\xe9\x72\x6f" + "\xcb\x77\xf5\x53\x81\x2f\x66\x90\xfd\x8b\xbb\xf8\x6c\xc1\x81\x06" + "\xcc\x2f\xd5\xb7\x69\xb9\xfe\x9d\x5b\x4a\x38\x9e\xe0\x1b\x83\xde" + "\x24\xd5\x57\x3f\xbe\x15\xcf\x99\x23\xcf\x07\xfe\x64\xec\x0b\x78" + "\xe9\xc7\x33\xe4\x3e\x28\xfb\x4f\x43\x56\xb4\xfa\xa5\xbe\x11\x9f" + "\xa3\x1f\xdf\xaa\x70\xf9\xf1\xad\x47\x4b\x88\xd7\xbd\x4f\xec\x93" + "\xb1\xc1\x7e\x0c\x79\xfe\x51\xae\xbe\x1e\x73\x5c\xf2\x15\xdb\xbb" + "\xdf\xe1\x39\xd8\xc7\x1c\xdb\xf8\x04\x8f\x13\x05\x4e\xca\x51\x36" + "\xfc\x32\x8b\x06\xfe\x89\x68\xff\xab\xbc\xd6\x17\x57\x27\xbe\x42" + "\x24\xcb\xec\x58\x9a\x23\xfd\xd7\x76\xb8\x8e\xe3\x8a\xf9\xfe\x32" + "\x1f\xae\xcc\x73\x3c\x6f\xb2\xe1\x7d\x10\xd7\x0c\xb1\x63\xcb\x21" + "\xe6\x4b\xcc\x61\xed\x98\x27\xf0\x9e\xea\xcc\xd1\xce\x3d\x32\x6d" + "\x3c\xdb\xbf\x45\xca\x1f\xf7\x27\xf6\x0e\x1f\xec\xb3\xbd\x44\xeb" + "\x43\x62\xd0\xf1\x05\x3e\x5f\xf4\x13\xbb\x6b\x2f\xfb\xc1\xfc\xb8" + "\x37\xda\x0f\xe6\x27\xc9\xf8\xcd\xc7\x0f\x52\xf7\x93\xe3\xf8\xd9" + "\x47\x7e\x3f\x4d\x0e\xb8\x7f\x62\x07\x1d\xa5\x8d\x75\x79\x3a\xf1" + "\x27\x32\x4e\x5b\x1d\xcf\x8b\xd2\x72\xbc\xaa\xbd\x65\x0e\x3c\x5b" + "\x44\xda\x96\x42\xbd\xbd\x36\x3c\xdb\x1c\x2e\x8c\x6b\x69\xa0\xc9" + "\x44\xb4\x39\xcd\x75\x9c\xdb\xcb\xf8\xf6\xa7\x2d\xf3\x45\x9e\xf9" + "\x64\x98\xdc\x7e\x5f\x1a\xca\x81\x96\x62\xea\x95\xc7\x0d\x7a\xea" + "\x74\xe2\x3d\x28\x53\x3f\x60\x28\x3b\x08\xf9\x01\xc3\xc8\x3f\x4c" + "\x7b\xe4\x93\xf3\x44\xe4\xc3\x9c\xd8\x62\x9c\x27\x0d\xb8\x7f\x6a" + "\x7e\xbf\x98\xf4\x98\x0a\x3f\xb1\xfb\x23\xca\x72\xfc\x8c\x78\xe5" + "\x51\xa7\x45\xd5\xb9\xcc\x77\x8a\x7e\xf2\x39\xbd\xde\xe0\x68\xb2" + "\x54\x71\x1d\xec\x3b\x68\xb3\x69\x6a\xde\x97\xed\x99\xe4\x27\x4f" + "\xa3\x86\x31\x7f\x99\x23\xa7\x42\xb4\x9e\xa2\x9f\xbe\xd3\x19\xec" + "\xb9\xcc\xf1\xf0\xa7\xea\x1b\xa1\x83\x95\xe4\x29\xbf\x59\x7e\x1f" + "\xfb\x2c\x1d\xfc\xa7\xc7\x27\xe3\xcc\xf3\xbd\xf4\x07\x67\x9f\x0f" + "\x1e\x1b\x30\xc7\x1e\x8e\xd3\xa8\x21\xef\x3e\x4e\x47\x9a\xc7\xef" + "\x93\xf1\x1c\x47\x7c\xd2\x0b\x75\x9f\x90\x83\xaf\xca\x58\x0e\x8c" + "\x6f\xe8\xde\x56\xc6\x59\xab\x2f\x0c\x72\x1b\x5c\x98\xff\x79\x42" + "\x81\x56\x96\x09\xc7\x06\x5e\x2b\x3c\xb8\x05\x7c\x27\xb4\x1d\x85" + "\xc1\xcb\x6b\xc3\x41\x79\x7e\xde\x15\x12\x67\x7d\x69\x85\x41\xb6" + "\x49\xea\x2a\x92\x2c\x73\x1a\x45\x6b\x7f\xfa\x32\x47\xc0\x7d\xb0" + "\xf9\x7d\xa7\xea\x9b\xcb\x84\xdb\x6c\xb4\x7d\x9f\xde\x76\xa4\x49" + "\xde\x9f\xd6\xa0\xe2\x57\xe2\xb9\x6b\xd4\x35\x2b\xf4\x33\xdb\x03" + "\xec\x2f\xab\x68\xf1\x7a\xe6\xf0\xd8\x70\x59\x78\xbc\x9e\xf9\x19" + "\xea\x18\xd2\xeb\xa8\xfe\x4f\xd6\x51\x7d\xa9\x3a\xa0\x1b\xae\x39" + "\x4d\x3f\xb3\x5f\xfe\xdc\xf1\x75\xf9\x8d\x20\xad\x7e\x99\x4d\xe9" + "\xcc\x37\x9e\x0f\x63\xfe\x16\xb2\x95\x39\xe4\xb7\xac\x4c\x54\xc9" + "\xb1\x3c\x43\xf5\x39\xde\x0e\xe7\x20\xb5\x6e\xf8\x33\x75\xd3\xcf" + "\xe4\x37\x73\x3b\x4a\x79\xce\xb6\xa5\x70\x68\xe7\xb2\x92\x21\xd3" + "\xeb\x92\xcf\xf6\xa2\x1f\xf6\x44\xf0\x59\xa7\xff\xcf\xe4\x29\xe4" + "\xf5\xd5\xe3\xbc\xae\x5d\x28\xd2\xca\x1c\x1a\x74\x03\x6c\xf4\xb0" + "\xa4\x07\xec\x17\x39\xdf\xc2\x9c\x4d\xce\xb7\x7c\xf2\xac\x63\x8a" + "\x8c\xd1\xe9\x2e\x29\xe6\xb5\xef\xf0\x50\x3e\x78\x84\xf2\x38\x76" + "\x27\xaf\x3b\x8b\x64\x31\x63\x51\x28\x51\xc8\xf9\x14\x6c\x7f\x8e" + "\xdd\xe9\xf1\x7b\x29\x0c\x3b\xba\x71\x80\x32\x1a\x61\x7b\x42\x67" + "\xdb\x58\xaf\x37\xe9\xf1\x3b\x6b\x06\x46\xe2\x77\xee\xe3\xb5\x9e" + "\x2e\xdc\x0f\x90\x39\xbc\x63\x95\x65\xcf\x00\x4d\xde\xbb\x81\x32" + "\xf7\xf0\x5a\xde\x3f\x95\xed\xc3\x76\x85\x8c\xe5\xb9\x36\x93\xd7" + "\xf3\x47\x6c\x9f\x8d\x99\xa6\x08\xbd\x65\x96\x6b\x20\x97\x45\xef" + "\x37\xe4\x38\x18\xaa\x5f\x9a\x13\xb2\xb9\x8e\x83\x76\x3e\x2f\xfd" + "\xac\x0a\xf4\x8b\x3b\xae\x18\x3e\x5d\xbb\x22\xe2\xaf\xbe\x3f\x59" + "\xe9\x77\xc0\x6a\x1f\x8d\x27\xc2\x7b\xf2\x69\x5a\x2f\x65\x29\xff" + "\x88\x71\x18\x13\x0f\x65\xf1\x5e\x7c\xc5\xd3\x64\x0f\xef\x59\x92" + "\xe0\x7a\x95\x12\xf9\xdb\xe9\xfc\xab\x38\x27\x7a\xa6\x15\x53\x16" + "\xef\x3f\xb0\x0f\x85\x63\xb3\xcc\x9f\x30\xb9\x9c\xa2\xf6\x62\x72" + "\x95\x93\xd5\xed\x8e\xf5\xa5\x4b\xcb\xd8\xbb\x61\xe3\xea\xd2\x22" + "\xc7\x13\xcf\xae\x5b\xc7\x27\x3e\x17\xcc\xc9\x8b\x3e\xd3\x69\xae" + "\xc5\xb8\x60\xdd\x3a\x6f\xb1\x35\x94\xeb\x50\xf1\x73\xdf\x6c\x88" + "\xf8\xce\x39\x3f\xab\xef\x69\xd4\x27\xb5\xf3\xb8\xcd\xef\xd5\xf3" + "\x18\xa7\xf2\xb9\x3a\x24\xc7\x7b\x6d\x8f\x7d\xbf\x3a\x43\xf9\xe6" + "\x7d\xec\xcb\xa0\xf8\x54\x95\x55\x7e\xea\x87\xb2\xd5\x5e\xfe\xa1" + "\x9e\x61\xdf\x85\x7a\x35\x96\xb0\xef\x02\xef\x27\x2b\xd9\x7b\xd3" + "\x62\xc8\x5e\xc0\xfd\x66\x06\xec\xa7\xfa\xcb\xd7\x39\x6f\x66\x48" + "\x1c\xd5\x59\x59\xc6\x69\x6b\x44\x8c\xb9\x31\xc3\x6d\xd8\x63\xff" + "\xa1\x5a\xef\x7e\xf3\x65\xc6\xd7\x4b\x87\x8e\x45\xa4\x4f\x42\xdb" + "\x8e\xa9\xf4\x37\xf3\xb9\x7c\x5c\x3a\xdf\xb7\xe6\x89\xb5\x4f\x97" + "\x2c\x2d\x5d\xbd\x6c\x75\xf1\xea\xd2\x32\x19\xf6\x62\x8a\xfc\x77" + "\xcf\x0d\xcb\x17\x4b\x47\x81\x48\x3b\x8e\xd7\x3d\x8c\xb8\x5b\x6a" + "\xdd\xe9\xe7\x37\x4a\x5f\xc9\xcb\x6b\x9f\x5f\xad\x09\xfe\x7c\x86" + "\xd7\xb4\xb7\x74\xc4\xe7\x44\xa5\xf7\xdb\xb6\x1c\x72\x4c\xa4\xec" + "\x93\xf4\x8b\x7c\xde\x6f\x02\x9d\xe5\xb8\x54\x3b\xc8\xe3\x47\x0f" + "\x75\x84\x6e\x26\xd5\x3f\x3f\x7f\x8d\xe3\x0c\xb3\xef\x1a\x68\xbf" + "\xff\x24\x9e\x65\xfb\xfb\xec\xfb\xf9\x7c\x93\x58\x6b\xff\x21\xf3" + "\x02\xe3\x07\xda\xed\x11\x22\xff\x15\xb1\xb6\x68\x8f\xe8\x2b\x7a" + "\x05\xf6\x5a\xcf\xbe\xdd\xa2\x1b\x38\xb4\x80\x6e\x85\x91\xbe\x3f" + "\x35\xea\x1b\xf7\xdd\x8a\xd6\x3f\xff\x0f\xe8\xaa\xdb\xf0\xbb\x5a" + "\x54\xf7\x1d\x53\x74\xfd\xb9\xdc\x43\x58\x50\x24\xfa\x46\x62\x5b" + "\xbc\xc5\xcf\x43\xf8\x69\xa2\xda\xd7\x13\xb1\xc7\xc9\xef\x6e\x12" + "\xb5\xbe\x8f\xd9\xde\x56\x3c\xf7\xd6\xad\x6a\xcf\xd3\xf7\xb1\xcf" + "\x55\x94\x88\x32\x61\xe9\x6f\x26\xdb\xf4\xd6\x52\xcf\xf6\x01\xf6" + "\x7f\xf0\xeb\x65\x0b\xf9\xb9\xf5\x49\xb6\xb1\xdf\x0a\x0b\x93\x4b" + "\xf0\xbe\xa8\xa7\x27\x44\xba\x3f\x13\x78\xf3\xcd\xfd\xfc\x0d\x72" + "\xe6\xcf\x7d\x3b\xc9\x52\x9f\x4e\xb0\xbb\xde\x1a\x8e\x7f\x02\xfb" + "\xd3\x67\xf0\x2a\xc7\x49\x97\xbe\x0f\xb0\x37\x18\x3e\xf3\x2a\xe0" + "\x1e\xe1\x7d\x53\xc5\xb3\x6f\x1d\xfb\xcf\xf1\xec\x5b\x92\xf7\xa6" + "\x55\x53\x21\xef\x35\xb0\x3f\x00\xc7\x11\x87\x1e\xcd\x54\x72\xf8" + "\x8b\xe9\xd2\xdf\x01\xba\x9e\xf7\xb1\x9a\x2a\x60\xbf\x25\x8b\x29" + "\x6c\x77\x86\xdc\x54\xc9\x7b\xce\xda\xc0\x99\x43\xec\x27\x20\xcf" + "\x8f\xca\xf8\xfb\x7f\xa0\xa6\x0b\x64\xee\xa6\xc3\x39\xbc\x37\x32" + "\x42\xeb\xc3\x2f\x31\x0c\x51\x7b\xb6\xd0\x5a\x6e\xaa\x62\x18\xda" + "\xc0\xd9\x99\x46\x39\xd8\x5a\x63\xb9\xdc\x49\x3a\x5c\x26\xcb\x71" + "\x5e\x19\xf7\xc6\xb6\x44\xd8\x96\xe6\xc8\x3a\xd5\x73\x9e\x80\x7e" + "\x0c\x0d\x84\x0f\xe1\x7e\x31\xd3\x09\xd7\x7c\xb9\x26\x3f\x64\x27" + "\x19\x6f\xc9\x96\x7d\xdc\xe3\xfd\xb8\x55\xe2\xc3\xfe\xd6\xa5\x18" + "\x4b\xa4\x9d\x7e\xb8\x63\xdf\x47\x64\x2e\x79\x92\xfb\xf3\x17\x85" + "\xd2\x56\x3d\x4b\x07\x14\x7e\xbf\x58\xda\x5f\x3b\xd0\xdc\x6f\x5b" + "\x46\x7e\x93\x85\x8e\xda\xf9\x7c\xc8\x96\x43\x47\xed\x83\xd0\x1f" + "\xbf\xc8\xf4\x26\x9e\x39\xae\x6c\x44\x55\x8e\xf7\xef\x99\x1f\x13" + "\xed\x36\x17\xde\xe7\x1a\xbe\x35\xcc\x87\x35\x78\xe7\xa5\xc3\x0e" + "\xa6\x9b\x97\x7e\xbe\xbc\xb3\x57\x9d\xbf\xc1\xf3\x18\x8e\xa9\x20" + "\x69\xbd\xed\xa9\x1e\xeb\xd6\x56\x3e\xe3\x3b\xd3\x1a\xca\x31\xf1" + "\xfe\x3c\xc7\x76\xe0\x78\x17\x1c\xdf\x81\xd7\x58\xf5\xf7\x59\x31" + "\xef\xa7\x18\xef\x51\x6f\xab\x11\x97\x81\xe3\x66\xb1\xef\x47\x58" + "\xf7\x07\x95\xf1\xa4\xce\xab\xfd\x6d\xf6\x07\xe5\xf5\x5d\x3e\xd7" + "\xca\x7b\xd0\x28\x37\x7c\xfe\x57\x9d\xe7\xfa\xe5\xb0\xff\x1b\xee" + "\x33\x86\x7d\xb7\x40\x8b\xfe\xfa\xa5\x41\x3f\x64\xdb\x5f\xbf\x74" + "\x26\xde\x65\x61\x6c\x39\x70\xc9\x39\x39\xc7\xdf\x7e\x96\x4c\x5a" + "\xaa\xc8\xe7\x38\x2c\x47\xfd\xa4\x9f\x65\xff\xe5\x0e\x3d\xee\x41" + "\xe2\x59\xfa\xe5\x82\x91\xbd\xe0\xb0\xbe\x8e\xf9\xcb\x16\x65\x47" + "\xff\xb2\x45\xae\x63\xee\x5c\xea\xfd\xc1\xa6\xa0\xe9\xd0\x26\xcc" + "\xb2\xe5\xf9\x96\x5f\x1e\xf4\xd2\x6f\xbc\x86\x6f\x12\xf2\x15\x8f" + "\x16\x5f\x0f\xe3\x46\xae\x82\xf9\xf6\xab\x72\x9c\x18\x9e\x97\xbe" + "\xad\xbe\x7b\xb8\x6d\x62\xa1\xc6\x36\x4c\x7a\x8e\x4f\xfa\xc6\x94" + "\x9c\xe7\xf5\xcc\x31\x6a\x8e\xac\xf2\xe8\xfe\xbc\x57\x9e\x8e\x7e" + "\x4e\xe7\x67\x45\xb3\xb7\xb3\x8d\xbd\x91\x5a\x93\xc6\x31\xd8\x85" + "\xab\x59\xf8\x3d\x25\x7e\x82\x7d\xec\xf3\xc0\x26\x42\x1d\xa2\x64" + "\x1d\x7f\x23\xe1\xed\x67\x98\xf6\x4a\xa6\xde\x96\xfb\x17\x9a\xfb" + "\x4e\xe1\xe2\x79\x81\x8f\x7d\x73\xce\x13\xf2\xa5\x21\xdf\xde\xb6" + "\xf2\x5e\xf6\x2f\x72\x70\x5c\xcb\x6e\xbd\x6e\x5f\x5a\x52\xee\x17" + "\x93\x79\xdf\xf7\xed\x43\x5e\xfa\x4e\xcb\xe5\xcb\xf9\xdb\xa3\xef" + "\xcf\x0e\xdb\x2c\x39\x34\xda\x3c\x93\xd7\x11\xa6\xa2\xfe\x05\x82" + "\xf1\x6f\xd9\x1b\x32\x05\x69\xc8\x34\x56\x7c\xb5\xd2\x09\x3d\x30" + "\x56\x84\x37\xa1\xbf\xfa\xed\xd0\xf7\xed\xd4\x19\x6a\x93\xbe\x3b" + "\x90\x61\x6b\x85\x5f\x9c\xf7\x84\x0e\x4b\x1f\x6e\x35\x4e\xb7\xbc" + "\xe4\x09\xbd\x4b\x9d\x25\x3e\x6a\x5d\xf7\x67\xd8\x12\x2d\x32\x5e" + "\xde\xd4\x92\x4a\xba\xe9\xac\x7c\x9f\xa3\xec\x97\x96\x46\xfd\x5a" + "\xcc\xf1\x4f\x23\x71\xba\xe7\xd9\x35\x4f\x94\xae\x5e\xbb\xe6\xa6" + "\xf9\x2b\x36\xac\x28\x76\x3c\xa8\xdc\x2a\xa3\xc6\x3b\xcb\x48\xac" + "\xf7\x77\x8a\x78\x2c\x62\x1b\x92\x63\xbe\x5f\x2a\xde\xbb\x11\xeb" + "\x1d\xf6\xdc\x64\x5e\x77\xfd\xef\x8c\xf7\x6e\xd8\x88\x1c\xeb\x7d" + "\x64\x0f\xe2\x57\x99\xc3\x32\xa0\xbd\x17\xe0\x67\x1e\xff\x34\x77" + "\xcb\x01\x96\xa3\x7d\xd2\x6e\x79\xa7\x39\x32\x1e\x16\xdb\x2c\xbc" + "\x6e\x85\xf4\x16\xe3\x2c\x35\x78\x11\xe3\xc6\x3b\xc7\x46\xce\x76" + "\xbd\x73\x02\x74\xcb\x50\xf2\x2b\xf3\x76\x1b\x7b\xf5\xfa\x37\xf6" + "\xa4\x6f\x81\xe6\xd6\x1c\x6a\x7d\xec\x9d\x7f\xee\xd3\xc6\x5a\xd4" + "\xde\xcc\xaf\x6c\xc6\xb9\x41\x25\x9b\xef\xe9\xb2\xf9\xab\xcc\x4b" + "\xf9\x53\x8c\xc8\xc6\xaf\x96\x8f\xc8\xf5\x3f\x8c\xb2\xcb\x3f\xcd" + "\x17\x43\x9f\xa7\x5c\x75\x9a\x8e\x94\xf1\x9a\x19\xee\xaf\xc5\xfd" + "\x52\x86\xa5\xce\x50\x1c\x99\xad\xdf\xa3\x8e\x23\x37\xe8\xf7\x9f" + "\xc7\x7d\x8a\x7e\x0f\x7b\xea\xd7\x17\xf4\x7b\xc8\xec\xaf\xff\xa6" + "\xdf\x67\xe0\xfe\x77\xfa\x3d\x74\xfe\xaf\x5f\xd7\xef\x27\xe0\xfe" + "\x25\xfd\xfe\x73\xb8\xdf\xa2\xdf\x43\x06\x7f\xbd\x42\xdf\xd7\xc6" + "\x18\xfb\xeb\x07\x2e\x7f\xde\xf4\xeb\x49\xca\x4e\xfa\xf5\x12\xd8" + "\x4c\xfa\x98\x31\x9c\x56\x82\xbe\x69\x35\xe8\x8b\xf4\x0c\xae\x07" + "\xe9\x55\x5e\xfa\xe1\x81\x88\x74\xb3\x9e\xbf\x19\x7a\x2e\x7b\x24" + "\xfd\x57\x41\x3d\x1d\xf6\xcf\xeb\xed\x11\xe9\xbd\x7a\xfa\x71\xe4" + "\x6f\x8b\x48\xd7\xf7\x71\x7f\xdd\xe3\xa5\xe6\x0f\x22\xd2\x4f\xa8" + "\xf4\x23\x64\xf8\x91\xe8\xe9\xc7\xf4\x74\xbb\x97\x1a\xaa\x23\xd2" + "\x8f\xe8\xe9\xd0\xff\xbf\x9a\x11\x91\xae\xbe\x55\x2f\xcf\x1b\x5a" + "\xc5\xd1\x72\x96\xad\x23\x8b\xbd\xb4\xaf\x3c\x22\xcf\x7e\xbd\x6c" + "\xb1\x97\xf6\xee\x8f\x48\xd7\xcf\xaa\x1e\xd9\xee\xa5\x7f\x85\x22" + "\xd2\x47\x9d\xcf\x26\x34\x50\xe1\x68\x6b\xcb\xfc\x4d\x32\xe9\x0b" + "\x2b\x6d\xd2\x77\xdf\xe7\xb3\x88\xd6\xbd\xe2\xa4\xa3\x42\x88\x93" + "\xf4\xee\x01\xdd\x6f\x73\x12\xfb\xd1\xa9\x33\x9d\xef\xd6\xcb\x73" + "\x7e\x6c\x67\xf2\x39\xcf\x4d\x32\xed\x2a\x69\x0f\x39\x2b\x55\xdc" + "\x55\xe5\x63\xdc\x2b\xd7\x58\xf4\xfd\x67\xe4\x99\xcd\xb6\x34\xc3" + "\xe1\x75\x58\x4f\xe9\xa0\xf4\x7b\xe5\x39\x2e\xa7\xf1\x5a\x83\x3c" + "\xfb\x17\x31\xd7\x55\x7a\xff\xdd\xf7\x35\x8e\xcd\xe0\x56\xeb\x31" + "\x2c\x8b\x9c\x9f\x7d\xa6\x22\xf3\x7a\xe9\xdd\x56\xbe\x26\xda\xd3" + "\xfe\x57\xc0\xfd\x6e\xf3\xc8\x79\xb4\x23\x41\x3d\xfd\x2f\x48\x6f" + "\x89\x48\xef\x1e\x55\xb7\x43\x0f\x8a\xe4\xb3\x07\x86\x06\x84\x3f" + "\x34\x20\x82\xb5\x7f\x07\xde\x2b\xe5\xd9\xaa\x2f\x84\xab\xcf\xb6" + "\xe8\x71\x4e\x3e\x0c\x6d\x10\xec\x3f\xc0\xdf\x13\xb9\x62\xa1\xdf" + "\x47\x0b\x4b\xa0\x2a\x97\xb1\xff\xe3\x05\x19\xf3\xcb\xd5\xcb\xb1" + "\xd6\xd9\xa7\xce\xcf\xfb\x76\xc9\x9d\x18\xe3\xf6\xad\xe4\xf7\x7f" + "\xa3\x05\x45\x3e\xfa\xbf\xec\x7d\x0f\x5c\x54\xd5\xb6\xff\x9e\x61" + "\x40\x54\x94\x91\xd0\x50\xa9\x06\xb3\xf7\xe6\x16\x16\xdd\xab\x46" + "\x3e\x7b\x51\x59\xcf\xba\xfe\xa1\xae\x76\xa9\x48\xc1\xf4\x86\x5e" + "\xff\x8c\x8a\x84\x88\x80\x68\x3c\xea\x02\xa2\x57\x7d\x58\xa8\xd8" + "\xb5\xf7\xa8\xd4\xe8\xdd\xfa\x3d\xec\xa9\x8d\x89\x85\xca\x3f\x4b" + "\x0b\x0d\x6d\x24\x24\x24\xb4\x51\x47\x19\x60\xe6\xec\xdf\x5a\x7b" + "\x9f\x33\x67\xce\x30\x03\x0c\x69\x76\xef\x7d\x7c\x3e\xf3\x39\xec" + "\x73\xf6\xd9\x67\x9f\xbd\xd6\xfe\xee\xb5\xd6\x59\x7b\xad\xca\x04" + "\x3b\xd9\x0a\x6d\x6f\x99\x25\xf9\xb3\xee\x77\xec\xff\xc1\x3e\xe0" + "\xf3\xd2\x59\x5e\xa0\xfd\xcc\x3f\x02\xf3\x1e\xd2\x75\xe9\x26\xfa" + "\x29\xca\xb2\xf1\x20\xe7\x10\x1d\xac\xed\x1b\xe8\xba\x38\x33\xff" + "\xc1\x35\x38\xef\xe9\x9d\xf8\x5c\xde\x5f\xc3\xbf\xa5\xfd\xa8\xe7" + "\x78\xb1\xbf\x86\xbe\x85\x7a\xd3\xfe\xe3\x70\x6f\xad\x79\x50\xbc" + "\x5b\xbf\xb8\x95\x5b\x88\xba\x23\x0f\x64\x93\x8b\xa5\x6a\x8e\x4f" + "\x9f\x18\x05\xb5\xff\x2a\xb4\xf7\xb2\x9c\x20\x79\x34\x61\xe7\x42" + "\xab\xba\x32\xa5\x81\xac\x18\x4a\x42\x62\xad\xb8\x5f\xe0\x93\x47" + "\x06\x26\x62\xfc\xd8\x78\x13\xc8\xa1\xea\xbf\xc2\xf5\xfd\x0b\x4b" + "\xd5\x36\x26\xaf\x7c\x62\x64\x36\xc2\x1c\x3a\x1e\xd7\x90\xea\x5a" + "\x3b\xae\x03\x4c\x4e\x06\xfc\xf7\xb7\xbf\x92\x10\x64\x5b\x9a\xd0" + "\x7f\xcb\x12\x12\x60\x5f\xaa\x0f\xfe\xf3\x35\x12\x29\xad\x3f\x5b" + "\x92\x60\x4d\x69\x0d\xe9\xb7\x16\xd6\x14\xb4\x3d\x0c\x54\x69\xd9" + "\xb7\x50\xfc\x5f\x50\xff\xa5\x69\x6b\x52\xd7\xf9\x8d\xec\xaf\xe8" + "\xd5\x18\x5f\x1c\xfb\xe2\xee\x5d\x73\x40\xcf\xb6\x8b\x7b\xa1\xd3" + "\xce\x91\x21\x86\x3f\x10\xf5\xc0\xab\xd4\xd8\x3c\x9f\xa8\x31\x27" + "\x4c\xda\x1c\x66\xdf\xf3\xad\x4c\xb0\x91\xea\xe4\x53\x24\x6d\x09" + "\xd2\xc8\x38\x18\xe5\x34\xf4\x67\x85\xfa\x5a\xe0\xfa\xbb\x02\xad" + "\xb0\x66\x58\x41\x96\x9e\x87\xba\xa3\xf1\x41\x0b\x8b\x6f\x6c\xc4" + "\xbd\xcf\x20\xef\x3f\x8a\xe7\xa6\xa7\x9f\x63\xbe\x2b\x3a\x3e\xb7" + "\x8c\x11\x58\x4e\xc7\xbd\xd9\x41\x1a\xc3\xee\x76\xab\x2f\xd7\x93" + "\x8c\xf7\xf3\xf5\x21\xbe\x86\xeb\x64\xc6\x08\x4f\xbc\x2b\xe4\x5c" + "\xc6\x58\xb2\x77\x54\x17\xda\xc8\x14\x0b\x35\xb1\xef\xcc\x18\x93" + "\x22\xf9\x61\x23\xbd\x96\x4f\xf8\x3e\x4a\xe3\x55\x21\xf7\x72\x39" + "\x8f\x49\x6a\x94\x7c\xc4\x34\x34\xf7\x72\x2d\xb3\xb1\xe7\x5e\x6e" + "\x62\x36\xe7\xdc\xcb\xd6\xd5\xc3\xd0\x1f\xdd\x68\xb9\x32\xe0\x0a" + "\xd0\xcc\x58\x7e\x25\xa8\xaf\xd6\x73\x6e\xe7\x1f\xad\xba\xdb\x49" + "\x30\x7e\xeb\x40\x7f\xf0\x6d\xdc\x0f\x1c\x9e\x71\x00\xfd\xcc\xf1" + "\xda\x1d\xf5\x06\xe2\x83\xf6\x61\x38\xf7\xf8\x7d\x85\x04\x6d\x62" + "\x03\x68\xc0\xe5\x62\xe6\x7b\x97\x73\xb9\xb4\xba\x85\x1a\xd1\xe7" + "\x93\x7f\x93\xfa\x54\x43\x07\x5c\x2e\x16\xeb\x6f\xac\x6a\x81\x77" + "\x08\xb8\x9c\x5c\x6d\xbd\x20\xca\x84\x07\x36\x40\x1f\x93\x69\xce" + "\xe5\x6c\x1e\xe3\xe0\xc0\x39\x09\x57\x39\x8f\x1e\x38\x29\xf2\xba" + "\x95\x8f\xdb\xa7\x1a\x71\xbd\xba\x03\xff\x87\xb5\x3b\x82\xfb\x50" + "\x1c\xa8\x91\x64\x64\x93\x58\x07\xef\x31\x91\x03\x1f\x72\xac\x3d" + "\x60\x86\x77\xcf\xe6\xd7\x0f\x6c\xc0\x73\xf0\x7e\x30\x1e\x07\xc2" + "\xf1\xbd\x3c\x61\x2b\x1b\x8b\x54\xe2\x03\x7d\x2e\x40\x5f\x5f\x94" + "\x53\xaa\x2d\x0f\x1b\x79\xde\xd2\x83\xb9\x6c\xaf\x37\x3c\x07\xe8" + "\xa3\x46\xdc\xc4\xbd\xe9\xd8\x9e\xdc\xff\x4f\x17\x4b\x7d\xc1\xe7" + "\xe1\x35\x78\xd7\x64\xa4\x27\x8c\x15\x8b\x8d\x8c\x74\x6d\x34\xa0" + "\xed\xe9\x2a\x8c\x19\xfa\x71\x1d\x2c\xc4\x31\xe1\x63\x76\x90\xed" + "\x35\x5e\xeb\xa0\xc3\xc1\x05\xca\xf1\xe0\x65\x21\x00\xb0\x61\x09" + "\xfa\xf3\x1c\x2c\x14\xc7\xaf\x85\x3f\xff\xe0\x93\x6c\xbc\xf8\x35" + "\x95\xd3\xbd\xb7\x39\xea\xf2\x1c\xb9\x6a\xfc\x36\x8e\xdf\x4a\x38" + "\xbf\x1e\x0c\x77\xba\x2f\x7c\xe6\x25\x90\x91\x41\x86\xc4\x9c\xa6" + "\x38\xe6\xad\x99\x07\xa3\xe4\xf1\xe6\xed\xb8\x79\xc6\xed\xd2\x33" + "\xa0\x0e\x91\xfa\x09\xf4\x11\xd7\xe0\x83\x6b\x64\x9a\x7c\xba\x43" + "\xba\x6f\x2b\xdb\x2f\xf6\x69\x34\xee\x73\x75\x8b\x83\xf8\x4d\x0e" + "\xa4\x8a\x2a\xdb\xc3\x46\xc6\x8f\xe4\xa0\x0d\x7d\x95\x61\x5c\x0b" + "\x38\x0f\x1d\x34\xf1\xb5\xf0\x20\xfb\x5e\x8f\xdf\xbb\x78\x4c\xdb" + "\x83\xa0\x3b\x7d\x2a\xc6\x7e\x28\xf3\xe7\x7d\x28\x43\x1e\x20\xae" + "\x7a\xdd\xa3\xf1\xb3\xd9\x86\xee\x51\xcb\x0c\xae\x7b\xc7\xfc\xe5" + "\xbd\xbb\x65\x13\x9c\xf6\x3e\xcf\xe7\xe3\x5d\x96\x0f\x7a\xea\x87" + "\x79\x3c\xf6\x71\x69\x1e\xd0\x2c\xfd\x2a\x19\x86\xb9\x80\xd2\x0c" + "\xb4\xb9\xca\x00\xba\x75\x00\x5d\x03\x78\x91\x9d\x76\x95\xf4\x43" + "\x5f\x18\xc4\x1b\xf4\xb5\xa5\x03\xe0\x7c\x2e\xcd\x96\xf7\x57\x7e" + "\x3e\x1e\x74\xdb\xe2\x5c\xd0\x65\xd3\x2f\x90\x61\xdc\xb7\xa5\xac" + "\x52\xb4\x17\xbe\x21\xe4\xd0\x1c\xdc\xbb\x5b\x05\x6f\x45\xd3\x13" + "\xde\x10\x72\xa1\xd5\x1c\x5a\x98\xbe\x80\x04\xe1\xfa\x86\x3e\xd4" + "\x9c\x67\x3e\x0f\x85\x76\x0b\x31\xae\x9e\x40\x63\x54\xf0\x7c\x93" + "\xa0\xf5\x9d\x90\x2b\x10\xe6\xbb\x0f\x7c\xa6\xae\x27\x87\x6e\x83" + "\xe7\x9b\x30\x47\x29\xda\x81\xaa\xad\x56\x8c\xfd\x61\x82\x6b\x03" + "\xe1\xda\x93\x70\x14\x30\xc6\x1e\xc6\xec\x87\xf6\x43\xb0\x7d\x78" + "\x96\x89\xf7\x9d\xc5\xbe\x31\x41\xbd\x95\x58\x47\x8a\xdd\x27\xa4" + "\xc7\xf8\xe0\x75\xdc\x0b\x6e\xc7\x1c\x18\x40\x79\x7e\x4f\xad\xe3" + "\x1e\x51\x7e\x86\xb9\xfc\xf9\x60\xba\xbe\xaf\x1e\xea\x96\xa2\xaf" + "\x30\x97\x65\x3f\xd7\x8a\x73\x1d\xe4\xe3\xcf\x07\x89\xff\x07\x38" + "\xea\xa6\xc7\x90\xb4\x36\x12\xc2\xbe\x77\xbf\xe2\x03\xd8\xfb\x59" + "\x02\xe6\xd3\x70\x6a\xf3\x21\x6c\x2f\x07\x63\x02\xce\x21\x01\x80" + "\xcb\xfd\xa1\xdf\x98\x0b\xe7\x2c\xda\xd0\xc5\xb1\x19\x0f\x74\x2a" + "\x59\xcb\xe3\x3e\x7e\x98\x0b\xbc\x9f\xb6\x12\xe4\x81\x95\x24\x60" + "\xa5\x9d\x84\xe2\x7b\x02\xdd\xd0\x3e\x16\x8c\xba\x1b\x8e\x8d\x48" + "\x43\xa0\x39\xd1\xac\x4c\xa0\x0d\x2b\x5b\x68\x53\x65\x42\x2d\x81" + "\x75\x26\xa8\xca\x50\x83\xf1\xe7\xcf\xe2\xbb\xa2\xed\x0f\xc6\x14" + "\x28\x0b\xcf\x58\xc7\xf3\x28\x33\x3b\x81\xba\x2c\x58\xda\x3b\xb6" + "\x95\xed\x2f\xfb\xcc\x91\xff\x0c\xfa\x52\x26\xf6\xa5\x5c\xc0\xff" + "\x93\xd8\x1e\xd4\x7e\xa8\xff\xa0\x4d\x63\xe6\xf2\x22\xc7\xde\x19" + "\x6e\x1b\xf8\xac\xdc\x29\xf6\x1a\xbb\x17\x6d\x04\x78\xef\x54\x1b" + "\xbd\xba\x56\xac\x8b\xf7\x4e\x5d\x3e\x93\xe2\xbd\x70\x8f\xcd\x71" + "\x8f\x62\x1f\xd7\x21\x2e\x57\xc0\xd8\xe2\xff\x66\x18\x4b\xd1\xb7" + "\x4d\xc7\xfd\x12\x3e\x1f\x2d\xf9\x02\xc0\xfc\x69\x41\x7e\x72\x1f" + "\x33\xfe\xf3\x58\x65\x1c\xac\xf2\x70\x8c\xd1\x05\xe7\x13\xa5\x78" + "\x55\xf0\x7f\x06\xb4\xc1\xfd\x2b\x9d\xe2\xd0\xe5\x39\xc5\xb4\x4c" + "\x37\xd3\xef\x90\x4f\x00\x57\x7c\x80\x96\x15\x74\x9d\xef\x04\xbe" + "\x17\xae\xfc\x36\xec\x67\x3d\xf9\x1c\x31\x2e\x90\xc7\xcb\xf8\xfc" + "\x34\xc7\x0f\x73\xc8\x54\xbb\x2d\xd0\x04\xcf\xc4\x7d\x5d\x72\xf9" + "\xf3\xe3\x80\x27\x5a\xb8\x77\x00\x8f\xf9\xf8\x79\x85\xb2\x3e\xbb" + "\x9e\xe1\x52\x8e\x72\x29\xeb\x2c\x30\x6f\x3c\xf9\x3c\xe4\x0e\x63" + "\xf6\xc3\xf1\x03\x57\x11\x43\xfa\x79\xe2\x03\xbc\x72\x0e\xfb\x56" + "\xd5\xd4\x82\xef\x14\x48\x33\x23\x08\xda\x41\x99\x6c\x09\x6b\x7a" + "\xfd\x48\xa8\x73\x9e\x0c\x41\x7f\x7c\xcc\x87\x03\xf5\x9b\x79\xac" + "\xfa\xc3\x1f\xc5\x2e\xeb\x47\x84\x97\x63\xfa\x53\xf5\x33\xf8\x9d" + "\xd7\x7f\x57\xbb\xc9\x17\xbf\x3f\xa6\x6d\x06\x9e\xb4\x93\x21\xc0" + "\x63\x0d\x98\x7b\x10\xee\x69\xf9\x4b\x7b\x93\x6f\xb5\xed\x14\x31" + "\xcc\x23\xea\x66\x72\xb8\x58\x93\x4a\x34\x6b\x1b\x89\x16\xe8\x6a" + "\x3b\x68\x8b\x24\x52\xbc\x8b\xc2\x20\xbe\x57\xbf\x10\xf0\x75\x69" + "\x08\xe6\x67\x3c\xac\x01\xdd\x2b\x46\xd2\xb1\x73\x78\xce\x1b\x0d" + "\x3c\x7f\xb1\x5a\x8c\xed\xc1\xc7\xf6\xf0\x23\x7c\x2f\x5d\xf0\xcb" + "\x70\x4f\xa4\x2c\x7f\x1f\x2e\x13\xbf\x55\x24\x70\xec\x3b\x5c\x76" + "\x10\xb4\xe0\x35\xdc\x77\x24\x18\xea\xce\x76\xf8\x8e\x30\xbb\xd5" + "\xe1\x32\xa0\x61\x02\x93\xcd\xb5\xbe\x09\x33\xed\xfe\xe2\x1c\x84" + "\xf3\xb0\xb6\xe0\xbd\x70\x5f\xa0\x85\xd9\x98\x0e\x17\xc9\xbc\x76" + "\x18\x73\xee\xa9\xe0\x9d\x02\x80\xae\x75\xf8\x5e\x38\x26\x50\x0f" + "\xfa\x5f\x6e\x3a\xb8\xc3\x43\xec\xdf\x80\x1f\xf5\x36\x66\x03\x89" + "\xaf\x05\x7e\xba\x00\x34\xb8\x05\xe3\x7b\x55\xc3\x73\x2a\xb7\xb6" + "\x93\xca\x90\x2b\xa4\x0a\xfe\x47\x1f\x71\xe3\xbc\xef\x48\x83\xce" + "\xfd\x7a\x03\x6b\x56\x31\xf4\xb9\x14\xdb\x42\x2c\x40\xbf\xba\xea" + "\x54\x58\x7f\xcc\xd0\x16\x68\x20\xd8\x46\xa5\xd0\x44\x2a\x93\x41" + "\xcf\xca\x4f\x37\x55\x6d\x3d\x45\xaa\x42\xbe\x64\xcf\x41\x99\xd0" + "\xb8\xe4\x4a\x57\x6d\x97\x43\xdb\xb5\x62\xdb\x2d\xd0\x76\xb0\xe7" + "\xb6\xe3\x89\x97\x6d\x7b\xd1\xef\x38\xb3\x37\x6d\x03\x8e\x87\x63" + "\x4e\x23\xdc\x6f\x97\x36\x94\x0c\xb0\x5f\xc3\xd8\xae\x77\x50\xee" + "\xa7\x7c\x74\x33\xdb\x93\x97\xc9\xfc\xc0\xf5\x6c\x6f\xde\x45\xc2" + "\x7c\x4d\xf9\x7e\xbc\x73\x04\xfd\x54\x5a\x33\x8f\xae\x71\xe0\x90" + "\xfc\xfd\x10\x64\xd5\xa3\xc5\xdc\x1f\x95\xea\x39\x5f\x1d\x7d\x11" + "\xdb\x72\x6f\xc3\x23\x71\xdc\xaf\xf9\xa8\xc3\xe7\xee\xca\x20\x12" + "\x27\xb6\xa5\x73\xb5\xeb\x49\xc9\x87\xe7\x24\x27\x4a\x79\x8c\x13" + "\xc5\x2d\xc6\xcf\xcc\x79\x69\xce\xdc\xa4\x39\xb3\x75\xd3\x96\x2d" + "\x59\x38\x6a\xd1\x1f\xfe\xa0\x9b\x3c\x67\xe9\xd2\xf8\x97\xe7\xf4" + "\x23\xd3\x96\xc4\x2f\x5c\x3a\x17\x6d\x6f\x3a\xdd\x84\xdf\xcc\x4c" + "\x58\x94\x38\xea\x5f\x27\x44\xb8\xd8\xde\x70\x3f\x6a\x1d\xca\xe0" + "\xb0\x76\x0c\x49\xb3\x93\x41\x18\xab\x29\x70\x39\x35\xae\x00\xfd" + "\x0f\xf8\xaf\x19\xd7\x29\x5c\x1b\x50\x37\xc0\x38\x91\x80\xdf\x15" + "\x6f\x6e\xa2\x35\x8d\xe4\xcc\x73\x20\x57\xd6\x6e\xe3\x31\x0f\xeb" + "\x40\x27\x37\xf3\x6f\x83\x67\xc6\x60\x3c\xc3\x3f\xc1\x39\xf3\x20" + "\xdf\x84\xb5\x67\x88\x06\xd6\x35\xd0\x4b\x2a\x2c\x54\xdd\x87\xe6" + "\x0c\xa1\x65\xf4\xbb\x10\x22\xc6\x89\x57\x57\x9b\xac\xe8\x67\x01" + "\xfa\x52\x3a\x45\x3c\xe5\x73\xab\xe2\x2a\xc7\xb9\xcb\xe5\xdc\xdf" + "\xfb\xcc\x60\xd4\x61\x56\xb3\xdc\xa7\x95\x30\x7f\x3e\xa9\x90\x71" + "\xfa\x2b\x9d\x28\x3b\xd6\xc2\xb8\xbf\x52\x0f\x65\x1e\x4b\xa6\x32" + "\x42\xe9\x43\x53\x0d\xeb\xf2\xa9\x09\xfc\x87\xf7\x9c\x9a\xcd\x7f" + "\xf8\xbf\xf3\xef\xb4\x95\xff\x5c\xcf\xff\xd4\x9f\xf4\xfc\x5e\xb7" + "\x51\xdb\xcd\xaf\x07\xcf\x67\xef\x7d\x13\xdf\xff\x27\xb5\x61\xea" + "\xea\x87\xfc\x06\xbc\x55\xf7\xa7\x33\xc4\x1f\xf8\x73\x43\xee\x2c" + "\xe0\xe9\xd3\x24\x24\xd5\x46\x1b\xd2\x5f\x24\xa1\x69\xe7\x09\xe6" + "\x9e\x6c\x4a\x4c\xa6\x0d\x69\xd7\x50\x26\xfd\xea\x03\xe0\xdf\xd2" + "\xbc\x7a\x12\x90\x5b\x4f\xb4\x55\x89\x98\x97\x1a\xe3\xb9\x41\x4f" + "\x5b\xe0\x07\xe5\x8a\x24\x2b\x39\x6a\xbe\x84\x7e\x67\xc6\xaa\x38" + "\xc0\x9d\x3a\x42\x90\x7f\x03\xe2\x48\x70\xe1\x10\xba\x97\x66\x1a" + "\x62\xa9\xda\x30\x09\xce\x1d\x7f\x5f\x88\xf2\x7d\x3f\xa5\xdc\x57" + "\x37\x0b\xd7\xf8\xea\x8f\x44\xde\x0c\xe3\x7b\xbd\xbe\x0a\x43\x1e" + "\x84\x79\x72\x9c\xdb\xd5\xbf\xda\xc2\xd7\xf3\xaf\x98\x1e\xc4\x63" + "\x35\x7f\xc5\x64\x45\x78\x8f\x52\xcc\xd5\x8b\x6d\xee\x16\x4a\x59" + "\xae\xde\xf7\x53\xa2\x7c\x53\xe3\x89\xba\xca\x04\x9a\x09\xe0\x20" + "\x7e\x8f\x85\x79\xb7\x13\xe6\x59\xc9\x96\x21\x34\x1f\xfa\x97\xb3" + "\x75\x08\xcd\x86\x3e\x15\xb7\x66\xd6\x8c\x34\x91\x23\x21\xe2\x77" + "\x17\x23\xcc\x8b\x9d\xb9\x50\x67\xea\x32\x72\x47\x2e\xd4\xcb\x83" + "\x7a\x28\x27\xf3\xfe\x7d\x79\x1e\xc6\xe0\x43\x78\x66\x8d\x6e\x06" + "\x96\x8f\xb1\x3d\x80\xf8\x6c\x78\x0f\x5d\x3d\x39\x96\x08\x6b\x9b" + "\x06\x9f\x21\x3d\x17\xda\x07\xfc\x3b\xc2\xec\xa4\xd8\x2e\x6f\xa7" + "\x86\xef\xd7\xc8\xa1\x3b\xd7\xca\xb9\x94\x77\xe6\xa6\xc0\x9a\xde" + "\xce\xe2\x9c\x6e\x40\x7b\x0b\xca\x18\x4c\xae\xb0\x93\x40\x6e\x1f" + "\x00\xd9\x22\x01\x70\x00\xe4\x09\xe6\xa3\x0e\xb2\x04\xf4\x65\x03" + "\xe6\xf4\xc4\xeb\xa0\xb7\x7d\x08\xeb\x72\x09\xca\x01\x33\xae\x3e" + "\x85\xdf\x5d\x09\xe6\xe3\x5d\x1a\x4b\xad\x3c\x2f\xd2\x31\xad\x24" + "\x0b\x20\x06\xe1\xfa\x0f\xb2\xb0\xa6\x03\x68\x08\x3c\x50\x0e\xb2" + "\xc5\xa0\x66\x72\x6c\x92\x38\xf6\xe5\x6c\xcd\x4f\x62\x71\xb9\x7d" + "\x38\x46\x1f\x7b\x0e\xde\x2f\x00\x9e\x01\xf2\xe8\x19\x66\x0b\xe7" + "\x18\x73\x2c\x41\x5a\xc7\x51\xe7\x35\x41\x1b\x14\xb0\x4c\xbc\x06" + "\xef\x5f\x2e\xed\xb9\xaf\x83\x6b\x21\xe2\x98\x55\xc0\x98\x61\x9b" + "\x4c\xf7\x07\x99\x2b\x81\x8f\xcd\xb1\x91\x28\x57\x88\xf7\x1a\xa5" + "\x76\x51\x2f\x17\x40\xae\xc0\xf1\xc2\x71\x82\x76\x46\x8a\x38\x76" + "\x9c\xcb\x2f\x5f\x32\x9f\x09\x1c\x7b\xa0\xf5\x1a\x79\xfc\xbf\xd0" + "\x38\x8f\x3f\xdc\xbf\x46\xa4\xe5\x4a\x27\xda\x81\x6e\xf4\xe5\x34" + "\xb4\x93\x42\x1f\xf7\x72\x1b\xcf\x17\x0f\x61\x3c\x3c\x8c\xbf\x0d" + "\x63\xbc\x37\x07\x63\x3d\x03\x36\xaf\x3e\x03\x98\x3b\x0b\xe5\xa7" + "\x2f\x1f\xe2\xf2\xe9\x17\x75\xc8\xc3\x8d\xe4\x0b\x66\x87\x6f\x80" + "\x7e\x61\x7b\x50\xde\x05\x47\x90\x63\xbf\x78\xdb\x39\x77\xb6\x9c" + "\x37\xfb\x8b\x42\x79\x9f\xc8\x31\x66\x97\xc6\x23\xda\xc0\x58\xfd" + "\x8e\x04\xec\x5b\x1d\xce\x4b\xe9\x5d\x31\x87\x36\x9c\x47\xd9\xbf" + "\x0e\xe9\x26\x9d\xc7\x38\xd1\x40\xa7\x00\xe8\xd3\x18\xde\xa7\x2f" + "\xb5\x3c\xcf\xe0\x17\x19\x58\xc6\x7c\xda\x6b\xf1\x9e\x34\xf9\x1e" + "\x9c\x37\xc0\xc3\x81\x70\xcf\x28\x38\x52\xa9\x2e\xcf\xb3\xfd\xc5" + "\x87\x7f\x6e\x47\x1b\xd8\x17\x15\x52\x9e\x6d\xcc\xb1\x8d\x98\x91" + "\x3b\x43\x31\xf6\x38\x36\x3b\x81\x56\x8c\xef\x0e\xda\x4a\x61\xbc" + "\xbf\x04\xf9\x7f\xaf\xb8\x17\xea\x8b\x0f\xc5\xfe\x19\x79\x8c\x9c" + "\xa3\x2d\x2c\xa6\x33\xd3\x87\xbe\x2c\x94\x7d\x56\x24\xd9\xf2\x0b" + "\x16\x7f\x0b\xda\xaa\x40\xfa\xa3\x9c\x08\xf5\xca\x1c\xbc\xc5\xf6" + "\x61\x7f\x39\x01\xe5\x4b\xb1\xff\xc8\x2f\x77\x89\x63\xd7\xe2\x3c" + "\xef\x9c\xe7\x79\x6b\xe6\x71\xd0\xff\x0f\x3b\x78\x40\x9a\xd7\x9c" + "\x0f\x4e\x30\x3a\x82\xdc\x85\xf1\x10\x6a\xa0\x5d\x23\xca\xe0\x7c" + "\x5d\x3d\xa1\x3d\x58\xc7\x7c\x1a\x8e\x43\x19\xe6\xf7\xf1\x96\x2b" + "\x41\x7d\x23\xd6\x30\xdc\x38\x0e\xfa\x4f\x04\xa3\x1f\x8e\x8b\x34" + "\x5f\xd7\xce\x40\xdd\x2f\x82\xcf\xd9\xe4\x06\x52\x65\x6d\x21\xe2" + "\x1e\x0c\x98\xb3\xe7\xf0\xdb\x69\x33\xf0\x90\x3f\xce\x5f\xa0\x2f" + "\xce\x7f\xc4\x9c\x9a\x35\x9b\xd8\xbc\x0d\xc0\x79\xdb\x81\x71\x42" + "\xe0\x39\x65\x71\x51\xe4\x60\xb2\x91\xcd\x63\x8c\x11\xf3\x26\x8c" + "\x1d\xe6\xb4\x86\x67\xd7\x4a\xbe\xe3\xc8\x23\x18\x13\x46\xe4\x13" + "\x1d\xce\x65\x71\xec\x34\xad\x99\x27\x88\x34\xf7\x9c\xe8\xcf\xea" + "\xb8\xcc\xb7\x40\x3e\xdf\x4e\x44\x48\x63\x6d\x63\xf3\xf8\x8b\x0a" + "\x1b\xcc\x63\xe7\x31\xc5\xf1\xc4\x71\x85\xba\xf0\xfe\x47\x12\xa5" + "\x31\x75\x1a\xcf\x4a\x91\xe6\x35\xdc\xc6\x74\x82\xc7\xc1\x76\x1a" + "\x43\x91\xff\x30\x17\x71\xe9\x6a\x7c\x77\x58\x1b\xf0\xf9\xc8\x23" + "\x6f\x8a\x98\x55\x66\x46\x1e\x39\x01\xf3\xff\x77\x05\x32\x76\x7c" + "\x51\xc3\x74\x16\xa0\x93\x48\x9f\x36\x16\x53\xc5\x0d\x76\x00\x9f" + "\x94\xca\xf8\xf4\x95\xbf\x34\x0e\x12\x4f\x4a\xf3\x1e\xd6\x91\xe9" + "\x4a\xfc\xf9\xea\x41\x68\x23\x08\xf1\x4d\x96\xa1\xbe\x9a\xa8\xc4" + "\xb7\xaf\x22\x10\xdf\x90\xaf\x0d\x49\x68\x63\xe3\xeb\x95\x89\x54" + "\xd7\x2a\x31\xa9\xba\x92\xfb\x06\x70\x99\x0b\x79\xcb\x30\x83\xd7" + "\xc7\x35\x0c\xea\x33\x5d\x5c\x5c\xf3\x74\xb8\xc6\xc1\xb9\x32\x71" + "\xbc\xea\xa0\x7e\x19\xee\x67\xc5\x18\x16\xfd\xeb\xb8\xae\x07\x38" + "\xbd\x17\x63\xb4\x43\xbd\x35\x55\x20\xe7\x77\x64\x71\xec\x96\xb0" + "\x82\xbe\x14\xd3\xff\x95\x26\xd2\xd7\xf0\xaf\xf4\xbb\x46\xf2\xf5" + "\x1c\x98\x33\x56\x8c\x13\x0a\x6d\xeb\x1a\xc9\xa9\x51\xf0\xdc\x60" + "\xf1\x18\x02\xc7\xc1\x70\x1c\xda\x48\x4e\xda\xe1\x38\x1c\x8e\xe7" + "\xa0\xbe\x20\xd6\x8f\x80\x72\x25\x9c\xff\x8d\x78\x84\x3e\x7e\x1d" + "\x0b\xc7\x68\x51\x76\xc4\xf3\xdb\xb1\x0c\xc7\x75\x22\xcd\x2b\x38" + "\xcd\xbf\x7e\x0d\xda\x49\x86\xfe\xd7\x56\xd7\xb1\xb6\x0c\x50\xe7" + "\x69\x6c\x1b\xf7\x97\xc3\xff\xbe\x44\x96\x41\xa1\x9d\xda\xfb\xe1" + "\x38\x1a\xee\xbb\x0a\xc7\x44\x38\x1e\x16\xc7\xa0\x06\xb1\x61\x76" + "\x32\x8e\xed\x89\x06\x1d\x97\x77\xa3\xa5\x39\x8f\xeb\xb0\x8c\x1d" + "\xc7\x46\xce\x8e\xe5\xf4\x86\xba\x8c\x0f\xa0\xee\x23\x58\x17\x8e" + "\x8f\x89\xc7\x28\xf1\xf8\xb8\x78\xfc\x37\xf1\x38\x41\x3c\x02\x9d" + "\xbf\xae\x10\x65\x0c\x18\x97\xaf\x59\xbe\x03\x98\xdb\xb3\xf9\x33" + "\x6a\x5b\x50\x47\x06\x1c\x1f\x03\xed\xfb\xb4\x66\xd6\xc6\x49\xf6" + "\x51\xb4\xf9\x74\x64\x56\xf4\x79\x93\x7d\xd7\xae\x4d\x76\xc2\xb6" + "\xc8\x00\x55\x14\x01\x19\x68\x70\xa1\x1a\xd6\x7f\xde\x4e\x8d\x5a" + "\xfc\x2e\x2c\xe6\x7f\xf0\xc1\x98\x88\x4c\x1f\x1a\xb4\x7c\x22\xce" + "\x55\x66\x3b\xc6\xf8\x7d\x83\x7c\xc7\xc3\x6f\x22\xe8\x06\x93\x24" + "\xfc\x46\xbd\x87\xeb\xea\x18\xff\xb7\xb6\x41\xd6\xd5\x6b\x99\xcd" + "\xdb\x27\xe4\xd6\xc5\x70\xde\xe6\x74\x3e\x1a\xfb\x0c\xe3\x59\x0b" + "\xef\x33\xba\x9e\x9c\x1c\x09\xc7\x5f\x37\xf0\x77\x8e\x90\xde\x59" + "\xa4\x87\x41\x1a\xdf\x06\xf2\xf5\x71\xc0\xc2\x25\xc8\xc3\xf5\x0e" + "\x9c\xfd\x9a\xd9\x75\x45\x1e\x01\x5a\x7e\x9d\x8b\x34\x75\x9a\x83" + "\xce\x18\x14\xdc\x9a\x79\x72\x8d\x12\x53\x8e\xad\x41\x4c\x41\xde" + "\x00\xfc\x46\x5a\xcf\x76\x99\x7f\x68\xeb\x0f\xe2\xf3\xee\xa4\x51" + "\x79\xef\x57\x11\x36\x3e\xef\x6a\x81\xcf\x80\x3f\xbf\x9e\x80\xf4" + "\x31\x91\x93\x45\xe2\x9c\xae\x85\x39\x3d\x06\xce\x87\xf3\xbe\xf2" + "\xf3\xe2\xb3\x80\xcf\xbe\xc6\xf7\x1e\x2e\x9d\x17\xdf\x17\xdb\x09" + "\x45\x7a\x4b\xe7\xc5\xf6\x91\x1f\x91\x87\x42\xa4\xf3\xe2\x3b\x81" + "\x1c\x75\x2a\x46\xc2\x93\x1c\xc6\x6f\xc7\x4d\xd2\x7d\x48\x37\x8c" + "\x81\xc6\x6d\xfc\xa7\x26\xc0\x5c\x2d\xc2\xf5\x61\xf5\x0c\x12\xf0" + "\x4a\x01\x19\xc0\xe7\xe5\xa9\x09\x4a\x8c\x3c\x7d\x17\xcd\x0c\xb4" + "\x51\xad\xef\xe8\x4a\xdb\x68\x49\x5e\x2d\x84\xe7\x18\xa5\x9c\xee" + "\x72\x2e\x89\x53\x57\x2b\x8b\x1c\xe3\x8b\x7d\x69\x90\xfa\xe2\xb4" + "\x3e\x33\x1a\x60\xdf\xb0\xad\xd5\x20\xaf\x5b\x00\x17\x38\x6e\x7f" + "\x13\x6c\x22\xfd\xf7\x4a\x98\x8a\xeb\x56\xa0\x8a\x18\xf2\x92\xd8" + "\xf7\xd1\x40\x5c\x1b\xd1\xc7\x47\x40\x3b\x56\xb2\x9d\x54\x19\x40" + "\x97\x4f\x3e\x47\x66\x2e\xef\x87\x31\x71\x62\xa0\xaf\x7d\xa1\x6f" + "\x3b\xec\x68\xfb\x5f\x88\x7a\x6a\xdd\x3e\x7b\x12\xb5\x8a\x63\x06" + "\xf3\xa8\x6e\xbb\x38\xb6\x88\x5f\x3b\x10\xd3\x57\xa7\xf1\xbc\x50" + "\x68\xcb\xc1\xf9\xf1\x67\x5c\xc7\x42\xa8\xb5\xac\x10\xe7\xca\x37" + "\x3b\x24\x99\x14\xfa\x5b\xc4\x65\xc2\x13\x2c\xd7\x0c\xcc\x9d\xd1" + "\xdc\x16\x58\x77\x3f\x7f\xf7\xba\x10\xf6\x9d\x9b\xc7\x41\xc5\xb2" + "\xc6\x27\x64\xc8\xd7\xdc\x2f\xab\x62\x04\xf7\x29\xf9\xc6\xe2\xf0" + "\x29\x91\x65\xc5\x50\x1e\x1b\xac\xce\x29\xfe\xe9\x37\x26\xbc\x0f" + "\xee\x6f\x86\xf3\x7a\xf9\x3c\x6e\x2b\x60\xf6\xae\xc8\x81\xab\xa2" + "\xd0\xb7\x6c\x30\xc6\x53\x17\x9f\x97\xcd\x9e\x8f\x36\x0f\x9c\x9b" + "\xe2\xfc\xc5\x71\xc6\x35\x9b\xcd\x61\x98\xbf\x38\x8f\x3b\xd6\xf9" + "\x8e\x87\x1f\x9f\xb7\x7c\x6d\x0e\x65\xf3\x96\xcd\xd9\xba\x02\xf9" + "\x79\x75\xd1\xcc\xee\x85\xf4\x5c\x11\x12\x00\xd7\x3e\x34\x91\xa3" + "\xe1\x62\x1f\x59\x1c\x1a\x8c\xfb\x62\xbb\x46\xcd\xf8\x6d\x1b\xbf" + "\x75\xe2\xde\xb9\x40\xe0\x6e\x8c\xd5\x22\x7d\xab\x9e\xdc\x92\x4e" + "\xed\xf8\xdd\xe9\x1a\xb5\xe4\x3b\xf2\x39\x9c\x26\x72\xdc\xa5\x6f" + "\xe2\xc4\xf7\x1a\x0d\xcf\x2a\xe4\xbe\x60\xdf\x3c\xcd\x65\xaa\x6f" + "\xa2\x91\x4f\xab\x81\xf7\xe0\x58\xc0\x73\x70\x9f\x1e\x2f\xf1\x1e" + "\xcc\xcb\xd9\x40\xf7\xca\x0d\x43\x68\x01\xd0\xb4\x00\xe6\xd2\x7c" + "\x28\xef\x81\xe3\x6c\x7e\x54\x69\xf1\x28\xce\x91\x02\xb8\x37\x19" + "\x78\x2c\x4e\x9a\x1f\x96\x41\xf1\xd1\xc8\x67\x79\x30\x0e\xc8\x6b" + "\xec\x3b\x32\xf4\x1b\xf9\x0b\xf9\x0c\x79\x2c\x70\xd5\x53\x8c\xcf" + "\x58\x5c\x08\x38\x8f\xfd\x45\x3e\x83\xb6\xca\xa4\x58\xce\x26\x72" + "\x9a\xed\x6f\x84\x73\xb5\x92\x8f\x2e\x7e\x4b\x4a\x0c\x23\x83\xa1" + "\x5d\x5d\x99\x8e\xc5\x4b\xfd\xb6\xda\xf6\x38\xc1\xba\xf8\x1d\x8e" + "\xe3\xe4\xad\x65\xad\x99\x67\x02\xe4\x31\x3f\xc6\xf6\x96\x1c\x8c" + "\x65\xb6\xc8\x5b\xe0\x9a\xde\x59\xcf\x30\x91\x0a\x8c\x77\x9c\x80" + "\xbe\x7d\x77\x06\x13\x1d\xf0\x2d\xe0\xd8\x99\x49\x92\x5c\x7b\x5f" + "\x30\x7e\xcf\xaf\x28\x82\xfe\xa1\x0e\x5d\x03\xff\xe7\x80\x2e\xe9" + "\x36\x57\x29\xf0\xd8\x68\xb4\xf5\x88\x39\x98\xea\xd0\x8e\x85\x39" + "\x2b\x1a\xc9\xd9\xca\x4a\x8c\xd1\xb2\xa8\x73\x2c\xef\xb4\x64\x7a" + "\x15\xe3\x79\xeb\x96\x90\x5b\xea\xc9\x59\xcc\xc9\x52\x9b\x7e\x09" + "\x6d\x34\x67\x8e\x2b\x6d\x34\xdf\x8e\x14\x7f\x91\xf0\x2b\x94\x7f" + "\xa6\x70\xf1\xff\xe2\xae\x7f\xa6\x09\xbc\xae\x29\x1a\x7e\xb1\x7c" + "\xac\x42\x60\x9e\x7c\xeb\xb0\xff\x22\x5f\xe2\xdc\x46\x3f\x0e\xb4" + "\x39\xa9\x6c\x04\x63\xc2\x00\x9d\xa0\xdf\xab\xef\x7e\xc6\x98\x82" + "\x7c\xf4\xed\x5c\xa6\x3b\xa8\xbd\xdd\xbb\xfa\x2d\xa3\x27\x8f\xf9" + "\xfa\x6d\x38\x3c\x3b\x78\xed\x45\xa2\x31\x2c\x21\xb7\xa1\xfd\x3b" + "\xd0\x4e\x8d\xa8\xe3\x8a\x71\x23\x6b\x9a\x89\x69\x54\xe2\x4a\xa2" + "\x86\xeb\x77\xc0\xff\xa1\x92\x9c\x04\xf7\x68\x7d\xac\x24\x18\xe5" + "\xa3\xc7\x56\x92\x3b\xa0\xff\x56\x89\x56\x28\x43\xa0\x1d\x4e\xb4" + "\x25\x60\x5f\x1f\xc4\xfb\x30\x17\x81\x89\x8d\x1b\xc3\x61\x6c\x03" + "\xf8\xe3\xdb\x06\x1f\x0b\xd1\xf2\xb5\xc7\x04\xfc\x5f\x21\xca\x8c" + "\x26\xcc\xc5\x7d\xdc\xa9\x9f\x4f\x38\xfd\x9f\x85\xf7\x07\x5a\x50" + "\x3e\xf3\x34\x3e\xa6\xd7\xa4\xf1\x41\x7f\xd5\x40\xd0\x13\x18\xbd" + "\x6d\xb4\x05\xfa\x56\x61\x48\x21\xfe\xcd\xe4\xec\xf2\x6d\x9b\xd8" + "\xfe\xc7\x72\x6e\x9f\x3f\xbb\x40\xd2\xc3\x79\xbf\xcf\x3e\x18\xb8" + "\xca\x87\xa0\x5d\x1d\x63\xda\x31\x5f\xbf\x1f\x43\x98\x2d\xbd\xda" + "\x36\x9e\x18\xd3\xc6\x61\x1d\x49\xae\xaa\xbb\x92\x1e\x42\x0e\x86" + "\x8c\x87\x79\x7c\x56\x03\x73\xa5\xce\x7b\x9f\xca\xb3\x1a\x71\x7c" + "\x2b\xb8\x2f\x82\xe9\x04\xae\x25\xa8\xfb\xc3\x3a\x52\x86\x6b\x34" + "\xb4\x1d\x27\xcd\x1b\x58\x37\x60\x9e\x9a\x78\x2e\x9b\x1c\xfc\xfe" + "\x6b\xaa\xc1\xd8\x1c\x4c\x6f\xe0\xf5\x03\xb8\xcd\xff\xec\x06\x87" + "\x2c\x0d\xf5\xf0\x3e\xee\xa3\x66\x2a\x9e\x69\x57\xc1\x98\x9a\x8a" + "\xf1\xdd\x44\x5e\x84\xf5\xea\x6c\x99\x3c\x6f\x4d\x8c\xef\x0f\xb6" + "\x38\xcf\xcb\xb3\x0d\xb2\xbe\x79\xa6\x60\xd4\x06\xa2\x73\x37\x0f" + "\x0d\x03\x71\xad\xaa\x9f\xbe\x76\x2d\x2d\xca\x57\x0b\x8f\xae\xce" + "\x23\x01\xaa\x1c\x18\x36\x9c\x67\x49\x71\x83\x1b\x49\xfd\x9c\xc0" + "\x80\x5b\xa3\x1f\x4b\xec\x43\xd3\x42\x88\x3a\xf7\x72\x1f\xff\x30" + "\xeb\xad\x45\xd4\xe7\xee\x67\x26\x27\x5a\x89\x6e\x5e\x3e\xf9\x7e" + "\x3e\xf1\x79\xcc\x0e\xcf\x0e\x20\x06\x13\x69\x30\xe0\x97\xe7\x83" + "\x01\x28\x7f\x34\x18\xb0\xcd\xd4\x42\xe2\x9f\xda\x40\x9b\x72\xfe" + "\xe0\xeb\x0f\xeb\x81\xf6\x4d\xe0\xb1\xfe\x01\xb7\x16\x75\x40\x1b" + "\x07\xe2\xd8\x7d\x25\x5d\xf4\xed\x92\xfb\xbe\x19\x86\x34\x92\xef" + "\x54\xde\xf5\xad\x51\x2b\xf7\xad\x51\xfb\xd3\xfb\xf6\x5d\xae\x53" + "\xdf\xb4\x72\xdf\x12\xb0\x6f\x5b\xbc\xeb\xdb\xf7\x25\x72\xdf\xbe" + "\x2f\xe9\x61\xdf\x76\x7a\xee\x5b\xc3\xaf\xdc\xf7\x2d\xf9\xd6\x46" + "\xd2\xf0\xa0\x77\x7d\x3b\x1f\x2d\xf7\xed\x7c\xf4\x4f\xe9\x1b\xea" + "\xf2\x69\xa1\xf4\x1c\xcb\x19\xb0\x84\xc7\xe4\x6d\x24\xe7\x36\xa7" + "\x15\xb2\x72\x10\xfc\x3f\x5d\x9c\xdf\xe6\x74\x0b\xfd\x8e\xcb\x39" + "\x0d\x07\xee\x35\xa0\xbf\x6b\x43\x29\xf0\xb2\x81\xf3\xf4\x39\xe6" + "\xdf\x90\x6e\xa6\xa2\xbf\x69\xc3\x59\xcc\x51\x4e\xf3\xfb\xd6\xf2" + "\xf2\xb9\x91\x57\x82\x7c\x0d\xe8\x0b\x22\xc0\x7c\xa6\x41\xbe\xa9" + "\x98\xa3\xf5\xfd\x25\x66\x35\xcd\xc4\x98\x6e\x18\x87\x51\x43\xe8" + "\x7a\xdf\x9c\xf7\x97\x58\x59\x7e\xf8\xd5\x6c\x1f\xf6\xb9\x50\x69" + "\xef\xa1\xf4\x0c\xf3\xa0\xbe\xb5\x70\x7e\xb4\x94\xeb\x97\xaa\x51" + "\x9e\xf1\x4d\xc4\xf6\xe1\xfc\x24\x29\xff\x2e\xf0\xbb\x49\xc4\x06" + "\x4b\xa0\xb5\x2b\xdc\x3b\xb7\x4a\xc2\xbd\xc7\x12\x49\x20\xe6\x1e" + "\x5d\x9b\xd6\x07\xbf\x39\x9a\xe1\x99\x5a\x1c\xf7\xa9\x96\x3e\x34" + "\x30\x95\xf8\xe0\x9e\x4b\xf4\xd1\xab\x0e\x31\x93\x91\xa9\xc4\x77" + "\x6a\x32\xb4\x69\x25\x71\x81\xc9\xd0\x1e\x8c\x35\xd7\x0d\xce\x31" + "\x1b\xdf\x06\x68\x0f\xbf\x7f\xfb\x24\x92\x80\xc7\x42\xd2\xe9\xea" + "\xcd\x44\x83\xfb\x33\x71\x9f\x25\xdf\x63\xe9\xe7\x0f\xfd\xb5\x49" + "\xef\xd7\x03\xfa\x0c\xe4\xf4\xf9\xfe\x41\x99\x3e\x8d\x57\x3b\xd3" + "\xa7\x31\x9e\xd3\xa7\x31\x46\xa6\xcf\xf7\x85\x4a\xfa\x34\xae\x52" + "\xd2\xa7\xb1\xac\x77\xf4\x69\xdc\x2b\xd3\x87\x3f\x83\xd3\xa7\xf1" + "\xb8\x7b\xfa\x34\xb6\xc8\xf4\x69\xcc\xe8\x19\x7d\xbe\x0f\xf3\x4c" + "\x9f\xc6\x92\x2e\xe8\xe3\xe7\x9e\x3e\xdf\x2f\xee\x39\x7d\xbe\x2f" + "\xf4\x82\x3e\x03\x38\x7d\x9a\x4e\xca\xf4\x69\xda\xd8\x99\x3e\x4d" + "\x2a\x4e\x9f\xef\xad\x32\x7d\xce\x8f\x57\xd2\xa7\x29\x4c\x49\x9f" + "\xa6\xd9\xbd\xa3\x4f\x53\xac\x4c\x1f\xfe\x0c\x4e\x9f\xa6\x44\xf7" + "\xf4\x69\xca\x91\xe9\xd3\xa4\xeb\x19\x7d\x9a\x0e\x78\xa6\x4f\x53" + "\xb4\xf7\xf4\x39\x3f\xc8\x85\x3e\x5a\xcf\xf4\x39\x3f\xde\x0b\xfa" + "\x04\x72\xfa\x34\x2f\x97\xe9\xd3\x3c\xa6\x33\x7d\xce\x6f\xe7\xf4" + "\x39\x5f\x20\xd3\xa7\xb9\x4e\x49\x9f\xf3\x07\x94\xf4\x69\xd6\xf4" + "\x8e\x3e\xe7\x6d\x32\x7d\xf8\x33\x38\x7d\x9a\x83\xdd\xd3\xa7\x39" + "\x5c\xa6\xcf\x79\x63\xcf\xe8\xd3\x1c\xef\x99\x3e\xe7\xcd\x5d\xd0" + "\xa7\x8f\x7b\xfa\x34\x7f\xd0\x73\xfa\x34\xd7\x75\x45\x1f\xef\x64" + "\xbd\x66\x96\xab\xe6\xa7\xb7\xf3\x43\xa4\xa7\x76\x70\xec\xd0\xff" + "\x50\xc8\xfc\x21\x72\xab\xe0\xe7\xcf\xf7\x68\x34\x9b\x75\x29\xe4" + "\xe1\x7a\xf2\xc3\xab\x5b\x05\x5f\x7f\x9a\xf9\xce\x87\x42\xe6\x7b" + "\xb1\x74\x95\x9f\x46\x58\xd5\x47\x83\x7b\xe6\xdd\xb5\xc5\xfd\x61" + "\x7f\x38\xe7\x33\x94\xdc\x8e\xfb\xe8\x56\x83\xbc\x8c\xff\xb7\x66" + "\xfe\x00\xe3\xbe\xb7\xb0\xab\xfd\x5b\xe8\xeb\x74\x70\x0d\xea\xb7" + "\x2d\xa1\x8e\x78\x25\x99\x34\x19\xe3\xbe\x19\x46\xe0\x3e\x8b\x96" + "\x09\x18\xcf\x1d\xf4\xd5\x86\xa8\x11\xf4\x5b\xd4\x3d\x1a\xc9\x85" + "\x47\x68\x2e\x8b\x15\x6d\x01\x59\xfd\x16\xa8\x93\xe3\xf0\xcf\xa3" + "\x31\x6f\x88\x36\xc2\x7c\x5e\xf7\xe2\x07\x50\x37\x1f\x73\xcd\x2e" + "\x4d\xc3\x1c\xaa\x17\x37\x83\xec\xfb\x4f\xf8\x0c\x8c\x69\xb5\x0d" + "\x8e\xe8\x27\xc3\x7d\x33\x5b\x78\xec\x9e\xd5\xc3\xdf\xe0\xbe\x70" + "\x17\x57\x49\x7c\x07\xcf\xe9\x07\xe5\xb9\xa2\x3c\x8f\xf5\xfb\x43" + "\xf9\x69\xa7\xeb\x01\x50\x46\x3b\xe4\x20\xf1\xfa\x00\x28\x0f\x45" + "\x39\x9b\xc5\x5f\xc9\xcb\x10\x7d\x88\x2f\xd8\xe0\x9c\x56\xac\x33" + "\xa8\x99\x5c\x38\x8b\xb2\xbb\xd8\x46\x10\x94\x0f\xa1\x0e\x2c\x5e" + "\x0f\x86\xf2\x3b\xf8\xed\x40\xbc\x3e\x18\xca\xb9\x50\xfe\x67\xbe" + "\xe7\xa5\x43\x9c\xa3\x17\x62\x7a\xb7\x97\xff\x02\x8b\xbd\x88\x34" + "\xe0\xba\xc0\x05\x27\xff\x9f\x0b\x51\x2e\xd7\xf6\x3a\x5d\x8b\x90" + "\xae\x71\x1f\xb5\x0b\xb5\x4e\xd7\x74\x2e\xd7\x2c\x4e\xd7\xb4\xca" + "\x36\x2f\x6a\x9d\xae\x11\xe5\x7d\x17\xc3\xe5\x6b\x2d\x2d\x2e\xd7" + "\x26\x3a\x5d\xab\x13\xaf\xf9\xc0\xf9\x38\xf9\x1b\x5e\x4b\x85\x78" + "\x5e\x0d\xe7\x93\x9d\xce\xef\x15\xcf\xe3\xf3\xf3\x4d\xa4\x50\xd4" + "\x55\x38\xed\xc5\xf6\x8b\x9d\xda\xcf\xe1\x36\x8e\x8b\x7b\x1d\xbe" + "\x73\x41\xbe\xe5\x42\x47\xcc\x1b\x70\x2d\x11\xf9\xca\x99\xb7\x17" + "\x26\xe9\x66\x2d\x7b\x59\xb7\x64\x4e\x22\xba\xaf\x2c\x98\x9b\xa8" + "\x5b\xb0\x68\xf6\x1c\x45\x2c\xfd\x60\x8c\x05\x89\x79\xf3\x30\xa6" + "\x0e\xcb\x51\xb1\x89\x36\x39\xf2\xba\x00\xae\xb6\x66\xfe\xa8\x37" + "\x91\x27\x22\xf1\x59\x1b\x78\xcc\xf9\x72\x8c\xc9\xc3\xe3\xef\x90" + "\xa7\xea\xc9\x8f\xa3\xc4\xf8\x3b\x46\xa8\x3b\xcd\x73\xfc\x9d\x4b" + "\x11\x2c\xee\x24\xd4\xe3\xf1\x77\x2e\x8d\x86\x79\xfe\x18\xed\xc7" + "\xf3\xb4\xf0\xfc\x75\x3f\x4a\xb2\x89\x79\x66\x1b\x8b\xdd\x98\xc1" + "\x6d\x19\x2e\x71\x74\x73\x68\x19\xde\x27\x7e\x2f\x2d\x73\xba\xdf" + "\xc8\xed\x58\xd2\xfa\x20\x3e\x33\x87\xe9\xcd\xfd\xea\xa1\xcc\xec" + "\xf7\xec\x9a\x99\xdb\xf2\x72\x69\x05\xbe\x13\xbe\xb7\xf2\xdd\xd4" + "\xbf\xaf\x27\xe6\xbe\xf2\xbb\x99\x23\x9c\x62\xf4\x89\xef\x60\x8e" + "\xe1\x73\xb4\xd3\xbb\x32\xff\x44\x1a\x40\x2b\xf0\xd9\x88\x67\xac" + "\xaf\x03\xa0\x9c\x4b\xcb\xa5\xfe\x38\xf5\x0f\xed\xb7\x1a\xe8\xdf" + "\x18\x36\x26\x40\x53\x0a\x34\x15\xfb\x79\x95\x66\x5e\xac\xe5\xf9" + "\x2a\x60\x3d\xc1\xbc\x3b\x6c\xad\x32\x1b\x25\x5b\x26\xae\x51\xdc" + "\x86\x69\x96\xe5\x3f\x8c\x9d\xb6\x4e\x5a\xbf\xcc\x4e\xf2\x1f\x7f" + "\x66\x6b\xe6\x25\xe2\xcc\x43\xf2\xf3\x2e\x8d\xc2\xe7\x99\x88\xb9" + "\x98\xef\x07\x60\x63\x02\xf3\xc6\x3c\x1f\x7d\x31\xf1\x5e\xec\xa3" + "\xa7\x5c\x8b\x9e\x62\x5b\xca\xe3\x78\x29\x59\x1a\xc7\x0d\x2c\x87" + "\xc9\xa5\x6c\xc9\x5e\x27\xe6\x39\x31\x6e\x70\xe4\x1e\xbf\xf4\x21" + "\xcb\xdf\x97\xbf\xb2\xf4\xbe\x00\x12\x27\x8e\xed\x3e\xc4\x78\x9c" + "\x33\x1c\xeb\x2f\x87\x8a\x34\x2f\x11\xfb\x7f\x0e\xcf\xcb\xfe\xf7" + "\x97\xc7\x4b\xf5\x24\x5c\xe6\xdf\xab\x2e\x0f\x66\xf5\x78\x3e\xe8" + "\x52\x4e\xf3\x7f\xd6\xd6\x93\xcb\x7a\xb1\xbe\x23\x77\xaf\x89\x5c" + "\x9e\x40\xd7\xf5\x2d\x6d\xcd\xbc\x0c\xfa\xcf\x45\x33\x1f\x47\xfe" + "\x5c\x38\xea\xb1\x2f\x38\x46\xb8\x97\x9c\xae\x5b\x59\x0a\xf4\x71" + "\xab\x2f\x8b\x7e\xdd\x77\x34\x93\x2b\x5c\x86\x50\x53\x2b\xda\x58" + "\xf9\xbb\x5e\x39\xe0\xe4\xfb\x1c\x20\xd5\xe1\xd8\xcd\xae\x31\x9f" + "\x72\x43\x12\xda\x83\xc4\x6b\x49\xb8\xbf\xd6\xf1\xbf\x9f\xd3\xff" + "\xbe\xf8\x3f\xf3\x6b\x4e\x61\x6b\xab\x46\xde\xdb\x7f\xc5\x08\xe5" + "\x00\x97\x72\xb0\xa2\xbc\x9c\xfb\x3d\x83\x6c\xd6\xc0\x7c\xc8\xc5" + "\xf3\x62\xdb\x7d\x59\x7f\x92\x68\x24\xf0\x06\xe6\xcc\x89\x15\xe7" + "\x61\x2d\xee\xd9\x0e\xb4\xbd\xc8\xf6\x6b\xc3\xf5\xd1\xe2\x31\x42" + "\x3c\x86\xf3\x5c\xbc\x57\x92\xa5\x7d\xdb\x57\x98\x8d\xe6\x4a\xb6" + "\xb4\x7f\x13\xf7\x78\xe3\xfe\x6e\x78\xd7\x48\xdc\xe3\x8d\xfb\xc1" + "\xc5\x63\x84\x78\x0c\x17\xf3\x11\xc7\xc2\x7d\x8e\xfd\xdf\x9e\xd6" + "\x73\xa8\xd3\x20\xed\xe7\xb6\xe7\xd0\x54\x21\xdf\x2f\x03\xf3\xbf" + "\x62\x0c\xb7\xf4\x16\x2a\xf0\x9c\xe1\x16\x52\x4d\xda\x49\x75\x62" + "\x6b\x06\xd0\x62\x60\x95\xc1\xc6\x6c\xf8\x55\x56\x1b\xa9\x32\x5c" + "\x60\xb9\x5f\x5f\x69\x91\x72\xdb\x58\x26\xd8\x73\x69\xaa\x38\x5f" + "\x36\x73\x1f\x7d\x0b\x8f\x45\x84\xb6\xb6\x16\xf6\xdd\xcb\xbf\x91" + "\x5c\x8d\x91\xea\xf0\xb1\xbb\xca\x70\x62\x5b\xa6\x94\xdf\xd3\x92" + "\x2a\xe5\x13\x37\x91\xab\xb1\x57\x07\x8d\x2f\x87\x73\xf9\x4a\x9f" + "\x69\xcb\x3b\xd8\x26\xf6\xdb\x44\x2c\x93\xb0\x6d\xa8\xf3\xa1\x63" + "\xce\x06\x40\x3f\x32\xc9\xc3\x7c\x1f\xca\xd5\x18\x9e\x3b\xd6\x02" + "\xf3\xff\x72\x9c\xe8\x0b\x5e\x42\xd1\x9f\x1a\xfd\xc1\x71\xec\x82" + "\x7c\x83\xd3\x2f\x91\xe0\x2b\x1d\x31\xe8\x9f\xde\xc0\xf6\x23\x2c" + "\xc6\x58\xf0\x56\x32\xc5\x40\xc4\xbc\x59\x57\x1f\xc4\xbd\x04\xab" + "\x59\x4e\x3f\xa2\x05\xec\x18\xd1\x9a\x79\x15\xf0\xff\x51\x39\x76" + "\xdb\x7a\x5f\x90\x91\xe1\xfd\xd2\x13\x08\xd4\x09\x80\x3a\x11\x50" + "\x67\x92\x54\x07\xaf\xb7\xe2\xb7\x27\x9a\x40\xf0\xbd\xae\xae\x9b" + "\x65\x85\xeb\xf3\x4d\x3e\xc7\xcc\xdc\xef\xfb\x2a\xd0\xbf\xd8\xbf" + "\x2b\xba\xc1\x7c\x6c\x82\xf9\x6c\x16\xf2\xfb\x9a\x78\x9c\xf7\xbe" + "\x4d\xdc\xce\x79\xf5\x10\xe6\x9e\x5c\x7b\x8d\x68\xd0\x0f\x83\xcf" + "\x9b\x6b\x2c\x9e\x29\x9e\x83\xf5\xa2\x18\xe6\x29\x93\x57\xbd\x93" + "\x3d\xae\x32\xdb\x24\xc6\xee\xc2\x71\xc4\xfd\x53\xad\x99\xd7\x74" + "\x8e\x3c\x1d\x0e\x2c\xb9\xf6\x24\x7e\xff\x80\x39\xca\xfa\xe8\xda" + "\x07\xec\x2f\xb4\x55\xe6\x51\xce\xd5\xf6\x35\xb1\x6f\x44\xeb\x7d" + "\x0b\xb9\x9f\xec\xb5\x75\x3e\x21\xc3\xaf\xc1\xb3\x72\x1c\xf9\x49" + "\xa0\x0e\xd2\x4c\x80\xf6\x1d\xef\xb9\x84\x3d\xe3\x43\x8e\x37\xd7" + "\xca\x85\x75\x7d\x4d\x6b\xdb\x89\x46\x3c\x5f\x5e\x65\xb3\x62\x5e" + "\x0a\xb7\xb1\x72\x58\x8e\x46\xf4\x4b\x5f\xdf\xd7\x84\x7b\x97\xee" + "\xb3\x4a\x7d\x6e\x2d\xc7\x3d\x33\xd8\x67\x3e\xb6\xad\xfb\xa4\x71" + "\xcc\xbd\x0c\x6d\xa7\x9d\x22\x0d\xa4\xf5\x71\xf4\xdd\x63\x63\x92" + "\x22\xf9\x93\xb6\x72\x5c\x6c\x77\xd4\x61\x32\x16\xcb\x97\x05\xed" + "\x6f\x65\x39\xff\xe0\x1d\x80\x16\xc6\x34\x8c\x3b\xd0\xca\xf2\x12" + "\xaf\x86\xeb\xec\xbd\x99\xaf\x6e\xab\xb8\x67\xb7\x75\x8d\xb4\x5e" + "\x99\xc4\x73\x6b\xf1\xd9\x49\xed\xe4\x22\x69\x9d\x53\x9d\xd1\x4e" + "\x60\x3c\xcc\x18\xbb\xb0\xca\x02\x73\x34\xb9\x1d\x79\xc1\x8c\x39" + "\x62\xa1\x3e\xdf\x6f\xad\xc5\x31\x6f\x9d\x88\xcf\xc7\xb1\x05\xfd" + "\xd0\xec\x13\x12\x0a\x73\xbf\xd5\x24\x8d\x69\xde\x10\xd4\xb9\xae" + "\x79\x8c\xdd\x89\x63\x64\x87\x3e\x57\x15\xc0\xfa\x3d\xec\x14\xf4" + "\xcf\xfa\x8e\x10\xd4\xd7\x84\x7e\xe1\xf0\xbf\x18\xaf\x81\xd3\x8e" + "\xf3\x81\x75\x15\x3c\xe3\xbe\x2a\xce\x0b\x84\xc7\xe9\xb1\xea\xc5" + "\xf1\x63\xb9\x46\xf2\x93\xf8\x38\x88\xf5\xeb\xb8\xcd\x3a\x74\x4c" + "\x6b\xa6\x35\x59\xb6\x59\x5b\x99\xbc\x88\x79\x11\xb6\x32\xbd\xd4" + "\xba\xc1\xa9\xcf\x16\xb6\x07\xf7\x32\xda\x1b\xad\xe3\xf1\x59\xb9" + "\x18\x5b\x0e\xf9\xa2\xd9\x99\xff\xad\xb7\x61\x3f\xd1\xef\xd8\x3e" + "\xc8\xb7\x10\xd6\xfc\x22\x1c\x67\xb8\x67\x1a\xcc\x05\x53\x17\xeb" + "\x31\xcb\xef\xd8\x9a\xd9\xe6\x2f\xad\xc7\xa0\xe3\xc0\xda\xd4\xae" + "\x62\xba\x2f\xc8\xf4\xd5\x02\xca\x54\xed\x2c\xf7\x36\x60\xbd\x51" + "\xc4\x79\x58\xc3\xdb\xc6\x4b\xdf\xdd\xec\xb8\x77\xe3\x22\xfb\xe6" + "\x6c\x91\xf2\x16\xf2\x58\x8e\x6d\x71\xf2\x5e\x8f\xb6\xf9\x9d\xf6" + "\x7a\xe0\xfe\xa3\x4d\x2c\xbf\xdd\x4e\x5c\xd7\x2a\x5b\x1a\x70\x9d" + "\x62\xf7\xe3\xfe\x0f\xc0\xa8\xef\xf8\x1e\xa6\x06\xfc\x46\xc0\x72" + "\xeb\x60\x5f\x78\x5e\x92\x7a\xf6\x3f\xf0\xad\x06\x8f\x9c\x97\xda" + "\x60\x9d\x5e\x96\x2d\xc9\x11\xf8\xbd\xef\xa0\xe6\x09\x62\x1c\x81" + "\x32\x43\xbb\x0a\xf3\xcc\x43\x1d\x8b\x94\x63\x9e\xe5\x94\xe7\xef" + "\xf3\xa1\x27\x1b\xc6\xda\x7b\x49\x04\xc6\x2c\xc0\x3d\x7e\x6c\x0c" + "\xb4\x2b\x63\x30\x0e\x38\xc6\x34\x35\xa6\x60\xee\x9f\xf6\x0f\xfe" + "\x3c\x84\xed\x93\xb6\x18\xef\xbd\x8c\xbe\x60\x2d\x8d\xa9\x2c\x56" + "\x97\xff\xd4\x64\x1b\xc5\xfb\x98\x4c\x33\x68\x25\xc6\xb1\x6c\x61" + "\x79\x30\xb0\xcd\x5e\xc7\xb4\x6e\x4f\x15\xe5\xe3\x16\xd0\xbf\x6e" + "\x05\x5a\x31\xbd\x08\xfe\x1f\xd2\x4c\x3a\x4e\xf2\x5c\xc7\x3c\x2f" + "\x83\xe8\x13\xee\xc7\xe3\x7c\xc0\x98\xb1\xb8\x0b\x1d\x93\x75\x77" + "\x63\x5e\xf0\x8e\xa7\x59\x8c\xf4\x1c\x2a\xe5\xd7\xa9\x59\xcb\xfb" + "\x15\x38\x33\x59\xcd\xfa\x88\xfd\xf3\xae\x6f\x1d\x21\xa2\x2e\xe3" + "\xd7\x9a\xd9\x11\x2b\xc5\x07\xe1\x32\x1d\x8f\x9d\xce\x69\xd1\x71" + "\x58\x94\xe1\x8f\x8b\xcf\x3e\x7e\x1d\x9e\xbd\x41\x6c\xb3\x98\xc7" + "\x8f\x6f\x8f\x82\x76\x8b\xa1\x1f\x0d\x92\x4e\x25\xee\x63\x0a\xe7" + "\xba\x5e\x87\x4d\xd6\xa9\xf8\x18\x2a\xf6\xfe\x2d\x5a\x94\xa8\x9b" + "\x3d\x77\xa9\x21\x3e\xf1\xa5\x04\xdd\x9c\x25\x4b\x16\x2d\xd1\x61" + "\x60\x29\xe7\xf9\xc3\xf3\x65\xd9\xb4\x62\x1e\xcc\x62\x39\x0f\xa6" + "\x2d\xc6\x39\x77\xac\x89\xd8\x62\xaf\x8f\xfd\xc4\xd6\x29\xe7\xac" + "\xd4\x4e\xbe\x5a\xc0\x6f\x25\xa5\xf0\x33\xc2\xaf\x1c\xed\x29\x33" + "\xad\x24\x0a\xe4\x0d\xe6\x43\x26\xc7\xbd\xb0\x61\x9e\x8f\xa8\x7a" + "\x62\x3b\xb1\x55\xd0\xa0\x9c\x83\xf9\xe9\x4b\x58\x7c\x2c\xb8\x1f" + "\x7e\x46\xf8\x95\xc3\x8f\xdd\x27\x7c\xca\xf6\xec\x97\x38\x5f\xe3" + "\x3e\x2c\x99\x98\x7f\xa2\x86\xae\xd2\xb0\xb9\x27\xac\xe7\xf5\x5c" + "\xfa\xa0\xa6\x99\x57\x73\xc4\x7a\xec\x7b\xe1\xc0\x55\x44\xe7\xa6" + "\x9e\x0f\xcd\x6c\xd1\x88\xf5\xd8\x9e\x4c\xe9\x7d\x30\x0f\x05\xd4" + "\x97\xea\x69\x68\x66\x7b\xb0\x58\x2f\x80\x3d\x37\x53\xed\xee\xb9" + "\xbe\x34\xf3\xe3\x64\xb1\x9e\xd6\xb9\x3d\xa7\x3a\x7e\x42\x66\x3d" + "\xbe\x73\x8d\xb0\x4a\xc3\x63\x97\x65\xda\x92\xa1\xbe\xdb\xf8\xbd" + "\xde\xd1\x49\xd0\xb9\xd2\xc9\xf0\xd2\xdc\x39\xe3\xe6\x2e\x4c\xc2" + "\x8c\x66\x89\x8b\x96\x25\xe2\x71\x61\xfc\x1f\xd9\x61\xd1\xcc\x3f" + "\xbc\xc4\xff\x49\x9c\x1f\x81\xff\xcc\x07\x7e\xc3\xe3\xec\x65\x06" + "\x3c\xbc\xb4\x08\x8b\xc9\x09\xe1\xcb\x5e\xc2\x83\xeb\x5e\x54\x7d" + "\x6b\xa6\x50\x0e\xbc\x51\xca\x71\x56\x00\xf9\xef\x87\x64\x26\x4b" + "\xaf\x32\x91\x43\x7a\x1b\x91\x6c\x6b\xca\xb8\x27\xc2\x59\x8c\x7b" + "\x12\xb8\xca\xf0\x52\xa0\x6d\xee\x1c\x58\x33\x2a\x5a\x33\xa9\xd6" + "\x44\xe6\x25\x8b\xd8\x68\x62\x31\x70\x33\x85\x38\xd1\xbf\x54\x23" + "\xe4\x30\xbf\xf3\x02\x8c\xd7\x85\xf9\xdc\xa1\x6c\x84\x72\x1d\x94" + "\x71\x0e\x04\x43\xb9\x10\xed\x62\x50\x0e\x81\x72\xa8\x90\x73\xb9" + "\x18\xf7\x39\x43\x59\x07\xe5\x91\xd0\xbe\x23\xff\xb3\xfb\x3d\x83" + "\x34\x5f\xca\x31\xcf\xf3\xc9\xd3\x22\x47\x3e\x79\xcc\xf5\x95\xa6" + "\x65\x3e\x08\x5c\x06\xa1\x65\x3e\x21\xb7\xad\x81\x3a\x8e\xef\xbf" + "\xdc\xe6\x42\x8f\x4b\x31\x5c\xb8\x4d\x05\x73\xab\x15\x34\x38\x95" + "\x01\xff\x7f\x28\x93\xec\x7a\x2c\x2f\x28\x1c\x69\x26\xc6\x1a\xa6" + "\xc5\x6e\xed\x89\x28\x17\xab\xc8\x73\x18\xb7\xd9\x9c\x3e\x5b\x75" + "\xe7\x56\xa2\x62\x65\x1e\x77\x94\x5e\x54\x11\x96\x1f\x5d\x8a\x49" + "\xe8\x1c\xcf\xc2\xed\x9e\xac\x2f\x40\x66\x60\xb9\xd0\xe6\x2f\x0a" + "\xb4\xc5\xcf\x61\x72\xa0\x8a\xec\xe1\x32\x86\xaf\x91\xc9\x0b\x2a" + "\xb2\x83\x3e\xc3\xf3\xe5\x98\x54\x2a\x3d\x8f\x7f\x35\x7f\x11\x85" + "\x7b\x03\x93\xe3\xe7\xb0\x73\x50\x6f\x35\xc8\x6a\x62\xff\x5e\xab" + "\x0e\xc5\x7d\xb6\x02\x8f\xd3\xa1\x22\xd9\x33\x6e\xcb\xc0\xe7\xf8" + "\x33\x39\xe4\x0b\x12\x80\x79\x5d\xb1\x6f\x5b\x9d\x62\x26\xae\x85" + "\x73\xe8\xc7\x7a\xe5\x19\x12\x80\x31\xa2\xc5\xbe\x64\xb3\x3c\x75" + "\x59\x2a\x9d\x14\xef\xca\x04\xe7\x5c\xdf\xe7\x99\xdf\x31\xae\xbc" + "\xeb\xa5\xf0\xe8\xc7\xe1\xbf\x70\x31\x35\xba\x33\x6f\x86\x5e\x09" + "\xea\x53\x72\x65\xf7\x2d\x5f\xb3\xfc\xb7\x59\x2a\x03\xb4\xc3\xf4" + "\x1b\x01\xf5\xf0\xd6\x98\x02\xe6\x07\xab\x52\xa1\x9e\x13\x25\x64" + "\xa2\x3c\xd9\x02\xcf\x57\x15\x20\xcf\x52\xad\x6f\xd9\xb6\x95\x18" + "\xff\x5b\x05\x63\xac\xca\xc5\x6b\x62\x1c\x31\x35\x8b\xb3\x65\x27" + "\x21\x6c\x9f\x32\xc8\x28\xb8\x0f\xb6\x51\xa5\xd9\x85\x72\x07\xda" + "\xb4\x84\x2c\xd5\x68\xe4\x5b\xa0\x31\xc6\x31\xb1\xd0\x81\x34\x83" + "\x0e\xf2\x9b\x8d\x7c\x8c\xb2\x2e\xee\x9e\x69\x54\xa9\x11\xff\x1e" + "\x83\xdf\xef\x79\x5e\xa2\x17\x9a\xa4\x36\xa1\x1c\x00\x32\x54\x05" + "\x1c\xb5\xad\x59\x6a\xbd\x53\xee\x47\xbe\x2f\x5b\xa5\x7e\x12\xe3" + "\xcf\x61\xdb\x4c\x76\x56\x69\x58\xdc\x45\xa8\x3b\xcd\x44\xb4\x2c" + "\x46\x0c\xfc\x0f\xf2\xcf\x9f\x88\xf8\x3f\xc8\x3f\xbf\x89\x73\x69" + "\xe3\x23\xc9\x5e\xcb\x78\x5a\xa5\xce\x07\x1e\x7d\x0c\x7e\xbf\x87" + "\xfa\x20\xbf\x3d\xc0\xea\xaf\x56\xb3\xbd\x9a\x8d\x3e\x21\x24\x02" + "\xce\x7f\x28\x9d\xf7\x55\x45\xc1\x98\xaa\xcb\xa4\xb9\x0f\x7a\x58" + "\x31\x94\x8f\x4b\x76\x1e\x66\xf7\xc9\x52\x37\x38\x95\x3f\x84\xb2" + "\x45\x2a\xb7\x66\xf9\x10\x09\x2b\xd0\x2e\x72\x25\x3d\x66\x33\xea" + "\xbd\x2f\x85\x80\x5c\x08\xf2\x0d\x5c\x07\xfa\xbf\x6e\xe4\xf7\xc6" + "\x6b\xaf\x64\xe6\x36\x59\x82\x96\x47\x5b\x00\xff\xe0\x1a\xc8\x7f" + "\x0b\xa6\x89\xed\x4c\x34\xf9\x1c\x1f\x29\xbd\x9b\x90\xe9\x13\x28" + "\xac\xf3\xcb\xe0\xef\xa8\x59\x03\xff\xaf\x31\x0f\xa0\x51\x50\xcf" + "\x60\x22\x94\xc7\xc6\x49\xba\x50\x94\xd3\xae\x9d\x56\x0d\x9a\xb3" + "\xf1\x0f\xc8\x73\x1a\x66\xbb\xce\x4d\xd1\x46\xa3\xdc\x89\xb1\x48" + "\x58\xbe\x3c\x8c\x7d\x6a\x23\x7e\x2c\xdf\xc4\xba\x59\xfe\x2c\xcf" + "\xc2\x2b\xfa\x00\x29\xee\x29\xe0\xcd\x68\xaa\x36\xcc\xc7\x58\xa8" + "\x2c\xaf\x4c\xab\x7e\x20\x8b\x7f\x2a\xc6\x3d\xdd\x92\x44\x82\x0b" + "\x05\x1e\xf7\x94\xc5\x29\xf1\x03\x3d\x25\xc9\x7d\xec\x53\x9a\xb9" + "\x2b\x40\x8a\x7d\x4a\xaf\xd9\xad\xf0\xff\x48\x18\x0f\x0d\x1c\xf5" + "\xac\x2c\xc7\xbc\xd2\xb8\x8d\x85\xaa\x06\xdc\x53\xf3\x58\xa8\x5e" + "\xad\x17\x2a\x0d\xcf\xb9\x9a\xa5\x01\xfc\x4b\xe5\x3e\x45\xf2\xb9" + "\x1d\x30\x67\xb8\xad\x58\xa5\x9e\x28\x9e\x2b\x05\xba\x04\x8b\x7a" + "\xa9\x19\xed\x0c\x68\x2f\x03\x4c\xa8\xa0\x1d\x09\x9b\xdd\x61\xce" + "\xe5\xa0\xf4\x9a\xcb\x18\x23\x23\x4b\x63\x35\xa9\x7c\x59\x4e\x5f" + "\xa6\x4b\xaa\x34\x9d\xe2\x36\xcf\x7a\x69\xd1\xec\x39\x33\xe7\x2d" + "\x30\xe8\x9e\x99\xf6\x18\x4b\xc8\x19\xae\x9b\x9b\x38\x87\x2d\x49" + "\xba\x67\x1e\x7f\x74\xea\xd4\x69\x33\x7f\x37\xed\x91\x69\xd3\x7f" + "\xf7\x10\xdf\x35\x39\x6d\x09\x0b\x7b\x9a\xb8\x48\x87\x37\xcd\x12" + "\xb3\xd6\xa7\xcc\x59\xb2\xc8\x15\x0f\x82\x99\xad\x4d\xcd\xec\xca" + "\x16\xfc\x9f\xd9\xf3\x54\xbe\x1b\x24\x3b\x1b\xc7\x3e\xdf\x57\x71" + "\x6c\x59\x4e\xfb\x2c\xdf\x00\x94\xaf\x58\x4c\xa1\x20\xb6\xee\x68" + "\x70\x4e\xe3\xfa\xd3\x9a\xe5\x6b\x74\x8e\x0f\x26\xde\xdb\xa0\xc6" + "\xfb\xc4\xb9\x2c\x9e\x6b\xa3\xc3\x86\xa5\xb3\x18\x5f\x59\xbe\x16" + "\xc9\xf6\x8e\xe7\xa4\x3e\xd4\x63\x9d\x2c\xdf\x87\x1c\x79\xab\xb3" + "\xfc\x42\xe5\x7c\xa7\xec\x4f\x31\x46\x84\xa0\x38\xe3\x0b\xb2\x8a" + "\x1f\xfc\xfa\xe0\x6f\xa2\x03\xdf\x93\x68\x2d\xea\x6c\x81\x2a\x58" + "\x83\x93\x7d\x78\x8e\xb3\xac\xe3\x2c\x2f\xc7\x54\xbb\xcd\x67\xa6" + "\x5d\x0d\x47\x1f\x3a\xd3\xae\x61\x7a\x22\x4d\x02\xf9\x17\xf5\xfd" + "\x24\x5a\x83\xb9\xfc\x80\x8f\xb3\xa7\xda\xd2\xb2\xa7\xda\xa9\x6d" + "\x26\xc8\xef\x70\xfc\x1e\xf7\xad\x4f\xb5\x7f\x4f\x59\x3e\x23\xb4" + "\xe7\xf0\x58\x87\xe5\xe8\xc7\x39\x03\x78\x78\xeb\x65\x9e\xfb\x7a" + "\xea\xf2\x1f\xbf\x9d\xb9\xdc\xc4\x73\x5f\x5f\xe4\xf9\xe2\xf1\xf9" + "\xd0\x66\x1a\xb4\x73\x78\xa6\xdd\x47\x37\xd5\xde\x41\xd9\xde\xdb" + "\xac\x3e\xa4\xab\x7c\xd6\x88\xb1\x4b\x87\x12\x35\xee\xe5\xb3\xbf" + "\xd5\x11\x81\x71\x0d\xd3\xcd\xd4\x8a\xf1\x71\x3e\x69\xaf\x55\xeb" + "\x92\x34\x30\x6e\x7d\xee\xaa\x32\x44\xb8\xdf\x7b\x9d\x07\xf3\x67" + "\x63\xdf\x44\x9a\xe7\x43\xe0\x68\xa1\xf9\x7e\x85\x88\xf7\x34\xcf" + "\xb7\x8e\x6e\xec\x07\xe7\xfd\x4b\xe1\x68\xa1\x79\xfd\x37\xd0\x8d" + "\xfd\xa1\x3c\xd0\x00\x47\x0b\x7d\xdd\x14\x0b\xf5\x0d\xf4\xf5\xb3" + "\x15\x70\x34\xd3\xd7\xbf\x1b\x0f\xf5\xa0\xdc\xb0\x13\x8e\x50\x6e" + "\x0c\x85\x7a\x50\xfe\x3e\xa7\x51\xd5\xc7\x0c\xff\x9b\x69\xde\xa0" + "\x49\xfc\x59\xc1\x31\xec\x59\x79\xb7\xce\xe6\xcf\x18\x66\xe0\xcf" + "\xb8\x2d\x95\x3f\x43\x97\xcd\x9f\xd1\x64\x83\x7a\xc9\xf4\xf5\xe6" + "\x26\x38\x5a\xe9\xeb\x2d\xc7\xa1\x1e\x94\x2f\x1a\xe1\x08\x65\x33" + "\x3c\xab\x3f\x94\x2f\x17\xc0\x11\xca\x96\x35\x50\x2f\x95\xbe\x7e" + "\x2d\x11\x8e\x36\xfa\xba\x15\xdb\x87\x72\xfb\x34\x38\x42\xd9\x36" + "\x01\xea\x41\x59\x18\x0d\x47\x1b\xcd\xbb\x13\xde\xa9\x6f\x06\xcd" + "\xbb\x6b\x22\x5c\x27\x34\xef\x9f\xe0\x79\xfd\xa0\xac\x2f\x81\xeb" + "\x50\xbe\x1b\xee\xef\x0f\xe5\xf0\x10\xba\x31\x00\xca\xa3\xf0\x5d" + "\xd7\xd0\xbc\xfb\xe0\x39\xfd\x34\x34\xef\x7e\x7c\x67\x28\xff\xda" + "\x02\xf5\xa0\x3c\x1a\xfb\x03\xe5\xb1\x70\x5f\x00\x94\x23\x61\x0c" + "\xfa\x66\xd3\xbc\x71\x2d\x50\x0f\xc6\xfa\xa1\xbd\x70\x84\x72\x54" + "\x0e\xd4\x83\xf2\x63\x30\x86\xfd\xa1\xfc\x44\x38\xd4\x87\xf2\x44" + "\x7c\xdf\x1c\x9a\xf7\xdb\x1a\xa8\x17\x40\xf3\xa6\xec\x80\x23\x94" + "\x9f\x4e\x86\x7a\x50\x9e\x06\xe3\xd7\x1f\xca\xbf\xd7\x41\xfd\x00" + "\xf7\xf4\x7c\x7e\x36\x5d\xe5\x07\x7d\x9d\xf3\x21\x5d\xd5\x07\x8e" + "\x2f\x43\xd9\x57\x4f\xf3\xfe\x18\x0c\xe7\xe1\x98\x10\x0d\xe5\x70" + "\xb1\x0c\xc7\xb9\xe3\xa1\x1c\x21\x96\xe1\x38\x4f\x0f\xe5\xd1\x62" + "\x19\x8e\x8b\xb0\x1c\x49\xf3\x0c\x70\xf4\x83\xe3\xa2\x62\x28\x8f" + "\x17\xcb\x70\x5c\x6c\x81\x23\x8c\xe5\x7c\x13\x9c\x8f\xa2\x79\x0b" + "\x8a\xa0\x0c\xc7\x85\x71\x50\x9e\x00\xc7\x32\x28\x4f\x30\x87\x59" + "\xa3\x91\x57\x85\xa0\x9a\x08\x3a\x64\x40\x49\xfa\x55\xa2\x46\x1e" + "\xc5\xfc\x2e\xb0\x36\xdf\x51\xaf\xea\x5b\x59\x92\x66\x62\x32\x83" + "\x7d\x53\x5f\x83\x30\xa4\x2f\xc6\x63\xf4\x83\x7a\x7d\x1a\x55\xfd" + "\xda\x10\x8f\xaa\x53\x4d\x2c\xc7\xa4\x18\xa3\xd3\x0f\xee\xb9\x0a" + "\xf2\x55\x24\xe0\xbf\x1a\xc6\x6d\x27\xcd\xf4\xbd\x0c\xe3\x15\x4e" + "\x33\xfb\xd7\xc3\x11\xca\x83\xbe\x80\xf1\x82\xf2\xd8\xd7\xe1\x08" + "\xe5\x17\x1e\x85\x71\x0b\x6f\xcd\xea\x37\xcd\xa4\xea\x33\x89\xe1" + "\xcb\xee\x5b\x40\xb7\xa6\x74\x2a\x20\x2d\xdd\xfe\x40\x74\xa0\xcd" + "\x08\xf3\x60\xb8\x31\x10\x63\x4d\x6e\x6f\x8b\xa6\x41\x27\x51\xe6" + "\x41\x19\xc4\x8f\x76\x8c\x54\xf3\x67\xf7\xa7\xf5\xaa\x7e\xab\x30" + "\x2f\x09\x0d\xba\xe4\xe9\xfa\x76\x76\x7d\xc4\x03\x35\xfc\xba\x3f" + "\x91\xaf\xbf\x80\xd7\x0f\x04\x62\x7c\xff\x11\x3f\xb2\xeb\xd5\x96" + "\x26\xf1\xbd\x7c\xf0\xda\x69\xac\x6b\x52\xf5\x27\x1c\xff\x81\xd7" + "\x32\x7d\xc8\x15\xad\x5f\x76\x6b\x56\x7f\x2d\xf4\x3d\x40\x94\xff" + "\x37\xd0\x00\x5a\xc0\x62\xb4\xac\xeb\xe7\x36\x2e\x26\xea\xbf\x42" + "\x70\x58\x64\x2e\x60\x28\xea\xd4\x81\x66\xcc\x93\x3e\xb2\xb4\x5e" + "\x15\x90\xb1\x05\x65\xae\xe0\xb1\xf9\x1c\x5b\xfb\x6f\xb7\xad\xf7" + "\x3b\xae\x4b\x09\x84\xe7\x07\xac\x4a\xb7\xd2\xab\xc6\xb4\x47\x01" + "\x97\xf1\x7c\x1f\x2d\xdb\x03\xc5\xeb\xd8\x98\x6f\x2b\xff\xbf\x89" + "\xd9\xd1\xa1\x2d\xbc\x97\xc9\x7b\x22\x5d\xed\x59\x47\x67\xd3\x21" + "\x63\x8b\x80\x4e\x0f\x43\xdb\x6f\xef\x13\xcc\xea\x81\x66\xe2\xab" + "\x4b\xfa\x04\xda\xef\xcf\x6c\x88\x52\x5d\xea\x77\x74\xb6\xc0\xea" + "\xb2\x6b\xc7\x3e\x01\x3e\xc0\xd8\x17\xf0\xae\x36\x47\x1e\xf0\x0d" + "\x61\x91\x18\xf7\x02\x9e\x11\x85\x6b\x3b\xdb\xdf\xa9\x0a\x88\xad" + "\xb4\x61\xde\xd0\x1a\xdd\x7d\x89\x44\x13\x68\xf5\x57\xa5\x2d\x63" + "\x7b\x9e\xaf\x1a\x53\xbe\x60\xbe\xd8\xd8\x3e\xd4\x7b\x9c\x06\xf9" + "\x19\x31\x5e\x02\x8e\xd5\x5a\x01\xda\x83\xe7\x19\x93\x4e\x61\x1b" + "\xb7\x7d\x72\xd9\xac\x6e\xcd\x0a\x48\x90\x9e\x85\xeb\x4d\x2e\x8c" + "\x0d\xca\xdc\x18\xaf\x63\xa6\xdd\x8e\xf1\xef\xb2\x9d\xc7\x77\xae" + "\x18\x9f\x60\xee\xc2\xc4\x25\x8b\x75\x4b\xe7\xa6\xcc\x79\xe8\xae" + "\x65\xe1\xba\x25\xc9\xba\x25\xb8\xcc\xf2\x13\xb0\x14\x2f\x9d\xbf" + "\x28\x51\x87\xd9\xed\x3b\xe7\xc6\x0e\x11\xb4\x7e\x05\x2c\x76\x94" + "\x2a\x88\xd9\x48\x85\xa2\x07\x26\x26\x26\x52\x81\xae\x87\xd1\x4f" + "\x9f\xc8\x75\x28\xd5\x00\x5f\xdd\x88\x3e\x20\x5b\x07\x3d\xd8\xe6" + "\x17\x90\xd3\x9a\x35\x00\xe8\xdf\x3f\x5c\xfc\x2e\xc7\x63\x09\xaa" + "\x82\x0c\x48\x5b\xf6\xdd\x3a\x6b\x40\x84\x89\xfc\x91\xcb\x79\x45" + "\x63\x79\xdc\x60\xd5\x80\x38\xa6\xb7\xe8\x1e\x98\x48\x8b\xda\xa2" + "\x41\x3e\x53\xb1\x6f\x84\xb6\x3b\x68\x35\xb9\xcc\xe2\x12\x00\xcf" + "\x47\x61\x3c\x10\xfb\xa6\x01\x5a\x61\xc8\xf0\x28\xe1\xad\x76\x6d" + "\xfa\x76\xa2\x7e\x1f\x68\xa1\xd1\x01\x5f\x8e\x20\x77\x7c\x92\xd6" + "\xa4\xbe\xa8\x1a\xb0\xf8\x93\xb4\x5a\x35\xdd\x30\xa0\xe8\xca\xc8" + "\xfe\x91\x56\x31\x4f\x7a\xb5\xcd\x4a\x3e\x9f\x40\x50\x3f\x2b\xb5" + "\x0c\xbe\xb3\xd6\x32\x38\xc0\x6a\xdd\x18\x4e\x8c\x23\x7e\x4d\x1e" + "\xff\x15\xfd\xf1\xb3\x32\x42\x5a\x54\x41\xe1\x9f\x4d\x40\x9d\xc1" + "\x2f\xdf\xaa\xf5\xdb\x60\xd9\x34\xcc\x88\xb1\xb8\xda\x36\x85\x6b" + "\xdb\x87\x04\x46\x1c\x84\x3a\x47\x40\xa7\x39\x0a\x9a\x39\xc6\x9d" + "\x6d\x1b\x61\x2d\x7a\xbf\x3d\x5f\x5d\x5e\x36\x9e\xdb\x73\xe3\x80" + "\x77\x71\x6f\x89\x6a\xe0\xe0\xcf\x3e\x2c\x23\xf0\x6c\xf2\x7e\xfb" + "\x44\xf5\xe7\x91\x9d\xae\x8f\xf9\x2c\xa2\x8c\xb4\x62\xfc\x66\xd0" + "\x19\xf7\x9f\x2a\x20\x74\x53\x98\x79\x57\x8a\x55\x1d\x6b\x22\xea" + "\xca\xda\x02\x92\x7a\x8e\x0c\xb0\xfd\xa8\xd7\xbc\x07\xf7\xb7\x61" + "\x7c\xd5\xa3\x21\x2c\xce\x62\x9a\x91\xe5\x2d\x0e\xac\x02\x39\x40" + "\xf8\x51\xef\x57\x35\xcd\x48\xe0\xfa\xbd\xb6\xdf\x86\x90\xca\x04" + "\x33\xa9\x8e\x29\x22\x6d\xea\x28\xb2\xe7\xf9\x22\xf2\x26\xe8\x1f" + "\x6f\x5e\x24\x01\x4c\xa6\xed\xd0\xfb\xd9\x3a\xf4\x1a\xdb\x0a\x3d" + "\xc6\xbd\xa2\xf4\x47\x7d\x3f\x94\x71\x6d\x8b\xf4\xfe\x55\xe6\x22" + "\x72\x5f\x13\xd1\xb7\xa9\x49\x60\xdb\x0a\x7d\xbf\x2a\x43\x01\xb4" + "\x05\x42\x2b\x8c\x2b\xc6\xdc\xc3\x58\x7c\x38\x4e\xfd\x63\xc8\xb4" + "\x16\xd5\x80\x0b\xfd\x8e\x93\xc1\x18\xf3\x15\xe5\x46\x8c\x17\x0d" + "\xf3\xd7\x6c\x0f\x1e\x66\x4c\xbb\x0a\xfd\xc2\x98\x46\xbb\x6f\x29" + "\x41\xb9\x1b\x64\x0a\x15\xbe\xb3\x40\xf5\xfd\x66\xe2\x31\x8f\xde" + "\x8b\xb2\xb7\xd0\x1a\x82\x39\xc1\xfc\xb1\x9f\x98\x9f\x7b\xe5\x59" + "\x18\xcb\x74\xbd\x06\xea\x05\xc0\xf9\x81\xd5\x2d\x56\x62\x1f\x75" + "\x8b\xf1\x5e\x03\xcb\xbb\x1c\xbc\x35\x8d\x68\xf3\xd3\x48\xb0\x6e" + "\x2c\xe3\xa5\x01\xf6\x5d\xb7\x94\xd0\xac\x3b\x82\xd1\xce\xc2\xcf" + "\x69\x2f\xe8\x9e\x20\x44\xf7\x6b\xf6\xff\x46\xdd\x38\xa0\x61\x70" + "\x58\x34\xd3\x0b\x98\x2e\xaa\x7d\x8d\xf3\xaa\x76\x55\x9b\xdf\xdc" + "\x18\x21\xab\x30\x51\x58\xa5\x09\xc5\xfc\xee\x17\x55\xda\x39\x34" + "\x2f\xb5\x90\x6e\xb8\x87\x7d\xb7\x84\x72\x7c\x9b\xdf\xb0\xbd\x34" + "\x6f\x25\x81\xf6\xc7\xb7\xa9\x34\xc7\xe1\x57\x2b\xde\x1f\x83\xef" + "\x6d\x2f\x6a\xd3\xe3\x7b\xb3\x3c\x52\xf0\x5e\x33\x81\x66\x74\x48" + "\x18\x61\xb9\x15\x3a\xf4\xfe\x52\x9e\x5d\x1c\x0f\x1c\x03\xa1\x43" + "\xdf\x8f\xbd\x6b\x87\x3e\x00\xc6\x17\xe3\x3b\x07\xa6\xc5\xc3\x3d" + "\x9b\xc2\x82\xe1\xda\xc0\xb6\xe0\xb0\x89\x98\xcf\xad\xda\x60\x26" + "\xf6\x8d\x61\x5a\x8c\x5f\xb8\x39\x85\x68\x85\xc1\x61\xc0\xf7\x61" + "\xa1\x26\x3e\x7f\x08\xf6\x53\xc8\x5b\x39\xa9\x0d\xf7\xed\x41\xdf" + "\xa0\x7f\xc7\xe1\x57\x6b\x52\x05\xd6\xb5\x85\xb5\x45\xc2\xb1\x04" + "\xfa\x1a\x4a\xb3\x1e\x98\x80\xff\xc3\xb5\x50\xe8\xf3\x21\x1c\x07" + "\x1c\x0f\x71\x2c\xf6\xc9\x63\xf1\x52\x06\xd4\xdb\x29\x64\xfd\x47" + "\x88\x49\xa5\xcd\xa1\x59\xbf\xd6\x38\xd5\x3b\x27\xd7\x5b\x34\x92" + "\xd7\xdb\x5e\xce\xeb\x8d\x4f\x6d\x54\x0d\x5a\xc5\xc7\x7b\xd0\xaf" + "\x3a\x8f\xf7\xa0\x30\xf9\xde\xdf\x57\xf0\x7b\x73\x62\xf8\xbd\xff" + "\x8c\xf7\x3e\xa7\xec\xd3\xa0\xa7\xe5\xfa\xcf\x10\x5e\xff\xdf\xfd" + "\x79\xfd\x11\x13\x9d\xea\x2d\x97\xeb\xbd\x98\xc3\xeb\xad\x2b\xe2" + "\xf5\xc2\x8b\xe1\xfa\x47\x6e\xfa\xb2\x4b\xbe\x67\x85\x96\xdf\xb3" + "\x73\x2f\xbf\xe7\xdf\x22\xe1\xfa\x39\x97\xbe\x9c\x96\xeb\x2f\x13" + "\xdf\xfb\xbf\x26\xf1\xfa\x8f\x34\xc8\xf5\x82\x7c\x79\x3d\xbc\xfe" + "\xdf\x50\x4f\x9b\xd1\xe6\x97\x61\xe1\xf5\x26\xad\x41\x7e\x84\x3a" + "\x77\x09\x59\xba\x1d\x6d\x7e\xb7\xe5\x43\x3b\x89\x40\x9b\x10\x3c" + "\x02\xed\x42\x84\x7c\x3f\x38\x37\xb0\x65\x2b\xb7\x35\x60\x6e\x6f" + "\xe0\x0b\x1d\xd9\x1a\x44\x02\x36\x07\xf1\x78\xf6\xad\x59\x41\xb1" + "\x0e\xfd\x41\xc4\x50\xc4\x60\x93\x2a\xa0\x09\x70\xd8\xee\xd6\xfe" + "\x95\x15\x94\xef\xb0\xbf\x09\xb0\xe6\x6f\xec\x1b\xe5\x31\xe7\x37" + "\xae\xfb\x9b\xfa\xe6\xe7\x0b\x04\xf3\xac\xab\x80\x9f\x41\x66\x09" + "\xda\x03\xeb\x17\xcb\x77\x2d\x6c\x18\x6e\x14\x74\x80\xc7\x17\x88" + "\x4f\x75\x6a\x13\x29\x11\x9a\xd4\xf9\xed\x44\x53\x05\xab\x1e\xd6" + "\x2f\x11\x4c\x6a\xdd\x42\x94\x07\x82\x8e\xe5\x5f\x13\xdb\x2b\x7a" + "\x20\x3a\x7d\x01\xcf\x97\x8e\xb2\x13\xe2\x38\xcc\xdd\x00\x96\xc7" + "\x6f\x61\x1f\xa8\x7b\x8b\x2f\xfc\xef\x8f\x75\xdb\x46\xb4\xd6\xb4" + "\xbd\xf5\x40\x74\xfb\x90\x81\x11\xed\x6f\xb5\x97\x74\x0c\x19\x6e" + "\xec\xd8\x34\x2c\xca\xf6\xd6\x58\xa3\x6d\x44\x5b\xb4\x7d\xc8\xc0" + "\x12\x78\x36\x60\x7c\x81\x7a\xb7\x50\xa2\xde\x9d\x66\x54\x63\xbb" + "\x9f\xa4\x15\xa9\xf7\xa7\xd5\xa8\xf7\x0b\xa5\xea\x4f\xd2\xf2\xe1" + "\x58\x8c\x39\xdd\x40\x46\xbb\x65\xfa\xfe\xb4\x72\x58\x63\x6e\xd9" + "\x00\xe3\x95\x2a\xd9\x2f\xe9\xa3\x36\x52\x55\x6c\x23\x87\x12\xaf" + "\x12\xf3\x20\xbf\x02\xf8\x15\x9a\x07\x87\x45\x9a\x07\x87\x13\xd6" + "\xe7\x21\x23\x6a\xf0\x1d\x71\x8f\xec\x7e\x81\xf7\x59\x1c\x0f\x6c" + "\x73\xdf\x56\xfc\x4e\x2b\xc5\xc3\x56\x05\x27\x77\x8a\x87\xad\xe6" + "\xf9\x04\x1d\x31\xb1\x7f\x8e\x78\xd8\xa2\x9d\x80\xc5\xc3\x06\x9d" + "\x8f\xe9\x7e\xb0\xd6\xb1\x1c\xa4\x36\x90\xa9\x36\x0e\x2d\x41\x1d" + "\x0f\x65\xa8\xd6\xac\xe0\x1d\x92\x8e\x86\x72\x83\x7d\x9d\x5f\x31" + "\xfc\x76\xc0\x79\x98\x07\xa5\x3a\xe9\x3c\x5d\x7f\x2c\x02\xed\xe8" + "\x76\x9a\xf0\xaf\xe2\xb7\xf7\x87\xed\x1b\x07\x00\x26\xdd\x63\x82" + "\x73\xe3\xe1\xf7\x90\x7d\xdd\xb1\xd1\xf0\x8b\x84\xdf\x78\xf8\x45" + "\xc1\x6f\x02\xfc\x26\xc2\x2f\x1a\x7e\xd3\xe0\x17\x03\xbf\x58\xf8" + "\xc5\xc1\x6f\x36\x1d\x74\x6c\x12\xc6\xf3\x84\xb6\x0d\x40\xf7\x10" + "\xa9\x5d\x79\x7c\x07\x87\xc1\xfb\x46\xa1\x4c\x23\xe4\xa5\x96\xb2" + "\xef\x02\xdb\xad\x31\x6c\x8e\x00\x7e\xd1\xbb\xfa\x47\x9a\xc3\x1e" + "\x88\x32\x0f\x1e\x61\x34\x87\x8d\x2d\x36\x0f\x1a\x97\x0f\x3f\xa0" + "\xe1\xb8\x22\xf3\xc6\xb0\x68\xf3\xe0\x7b\x9a\x80\x96\xa6\xd6\xac" + "\xc1\xd9\x26\x55\xe8\x7c\x6e\x4b\x1a\x0c\xf4\x0f\xcd\x11\xff\x07" + "\x7c\x08\xb1\xe0\xff\xd0\x46\x11\x94\x4b\x4c\xaa\x61\xac\xde\x95" + "\x21\x61\x71\xe2\x9e\xd1\x0c\x38\x5f\x6e\xf2\xb9\x10\xc3\xed\x58" + "\xe9\x56\xc9\xf7\xc0\x79\xee\x2c\x78\xc9\x30\x73\x41\x7c\xf2\xcc" + "\xa5\xf3\xe7\xbe\x34\x67\xe9\x38\xdd\x5d\xb3\x75\xfa\xb9\x4b\x16" + "\xcf\x5c\xbc\x6c\xce\xb2\x39\x4c\xa4\x82\x53\xbf\x52\xfa\xc5\xe1" + "\x1e\x59\x1b\xc8\xf0\x03\x67\x53\xba\xf2\x45\xa2\x9e\x64\x06\x7e" + "\x1b\xf1\x40\xf4\x80\x86\x6d\x74\x6f\xb3\x59\x3d\xa9\xc5\x44\x6c" + "\x28\xf7\x6c\x1a\x6e\x1c\xd8\xf0\x30\x9c\xb3\xaa\x27\x61\x1c\x46" + "\xe0\xff\xea\x06\x23\xc1\x3a\x5c\x0e\xfa\x94\x54\xa0\x1c\xb4\x69" + "\x78\x14\xd6\xa1\x20\xff\xb0\xe3\x90\x01\xda\xc9\xd0\x06\x85\x79" + "\x83\x75\xf7\xc1\x39\xf4\xc3\xa0\x30\xa7\xe8\xb5\x95\xb4\x02\xda" + "\xd8\x3f\xcf\xac\x46\xfb\xd8\x14\x6c\x17\xe6\x14\x7d\xab\xb5\x66" + "\x3f\xd4\xdd\x3f\x0f\xee\x1f\xd1\x0e\xe5\xb1\xc6\x7d\x50\xae\x57" + "\xdd\x3a\x7b\x3f\xdc\xcf\xf4\x01\xe8\xe3\xfb\x70\x0e\xf4\x75\x8d" + "\x34\x8f\x51\x56\x75\xcc\xe5\x24\x94\xf9\x86\x54\xe2\x5c\xa6\x6f" + "\x81\x1e\x02\x73\x77\x17\xdc\xbb\x1b\x9e\x25\xca\xd9\x3e\xa8\x0f" + "\x21\x5e\x20\x4e\x54\xa7\x72\xbd\xa8\x44\x40\x9d\xdf\x07\xee\xbd" + "\x75\x00\x5e\x7b\x13\xf8\x8e\xcb\xd2\xb7\x4e\x94\xe4\xdb\x3f\x89" + "\x31\xe4\xfa\xd7\x01\x8f\xcc\x20\x77\xc0\x73\xc2\x70\xfc\x70\x9c" + "\xf0\x7b\x2a\xcd\x1a\x6c\xc2\x38\x15\x85\x41\xc4\xbf\x63\xe3\xd8" + "\x02\x6e\x6b\xb9\x35\x5b\xc2\x4a\x4b\xf0\xd8\x02\x67\xba\x71\x7a" + "\xe9\xe6\x2c\x8c\x9f\x35\x7f\xce\x6c\xf6\x09\x2e\x7e\xe9\xd2\x65" + "\x0b\xe6\xe8\xe6\xc4\xbf\x94\xa0\x63\x97\x75\xcb\x96\x42\x95\xb9" + "\x89\x4b\x75\x8b\x5e\x59\xa8\x5b\xb0\x74\x2e\x4a\xce\x73\x96\x2c" + "\x59\x66\x48\xec\x47\xf8\x9d\xba\x05\xcb\xe6\x27\xce\x35\xc0\x3f" + "\x4b\xe7\x2c\x9c\xad\x63\x54\x5f\x0a\x4d\xcd\x9f\xaf\x13\x9f\xb0" + "\x34\x21\x7e\x09\x32\xc2\xc2\x97\xa1\x92\xd3\xfd\x4a\xb9\x3a\x00" + "\x63\xf4\xa1\x6f\xd8\x45\x55\xc8\xf9\x32\x0d\x8c\xf5\x86\xb1\x05" + "\xe8\xcf\x00\xe5\x26\xa6\x0f\x65\xdd\x8a\xdf\x47\xc8\x9f\x83\x88" + "\xe6\x0a\xf0\x7f\x6b\x56\xc8\x6c\xe9\xdd\x98\x1d\x1a\xe3\x96\x62" + "\x4c\x5c\x55\xc8\x09\xb6\x87\x19\xe6\x01\xf3\x77\xc9\xba\xf5\x3d" + "\x3e\x16\x21\x1b\x9c\x6d\x5a\xdc\x86\x1a\xb2\x0b\x7d\xfb\x60\x2e" + "\x34\xa1\x2c\x21\xe6\x99\x50\xc1\x3d\x27\xf1\x1e\x61\xe3\x3d\x4d" + "\x70\x5f\x85\xbc\xde\x84\xec\xc0\xfa\xac\x5e\xd6\xad\xd7\xe8\xe0" + "\xb0\x68\x38\x97\x8d\xfd\xf2\xb0\x9e\xe8\xae\x41\xbb\x47\x4b\x08" + "\xb9\x27\x98\xe8\xaf\xad\xef\xa7\x6d\x0d\xf2\x2b\x69\xcf\x24\x7d" + "\xda\x61\x4e\x5b\xd5\xe4\x8e\x36\xe0\x8b\xe5\xf7\x13\x9f\x95\x93" + "\x89\xba\x64\x5e\x09\xc6\x5d\x26\x15\x13\x0b\x48\x75\x1c\xe8\xcd" + "\xd6\x9d\xa4\xc2\x58\x4f\x2a\x6d\xef\xf2\x5c\x26\x29\x28\x8f\x0f" + "\x9b\x8c\x71\xf6\xd2\x57\x52\xfb\xfb\x1f\x9b\x7d\x77\x37\x97\x60" + "\x0e\x92\x3b\xaa\x6d\xdf\x1a\xab\x53\x77\x90\xea\xe4\x6a\x23\xc6" + "\x38\xb9\xa8\x1a\xfa\xe0\x7e\xb8\xd6\xb7\x02\xee\x9b\x42\xfa\x40" + "\x79\x14\x3e\x23\x7b\x13\xad\x7d\x6d\x08\xad\x7b\x6d\x13\x35\xe5" + "\x0c\xa1\x0d\x39\x62\x5e\x11\xf4\x17\x40\xbf\x08\xe4\x53\x43\x12" + "\x09\x69\x56\x0d\x2d\x63\xfa\xfb\x04\x56\x1e\x0a\x65\x1e\x7f\x20" + "\x79\x13\x96\x87\x41\xb9\x81\x97\xb7\x62\x79\x38\x94\x2d\xbc\xfc" + "\x19\x96\x43\x9b\x55\xc3\x34\xbc\x5c\x45\x58\xac\x0e\xd5\xb0\x60" + "\x5e\xfe\x0a\xcb\x30\xf6\xc3\x46\x1a\x93\xb0\xbf\x67\x80\x66\xc3" + "\xee\x4f\x3f\x4d\xd4\xd5\xc9\x8d\x6c\x3e\x7c\x92\x96\x80\xf6\x05" + "\x98\x0f\x43\x3f\x42\x7e\x07\x6c\x9a\xe6\x17\x81\xc7\xa1\x31\x81" + "\x56\xd2\x07\x64\xac\xfe\x70\xed\x2e\x1c\x3b\xb7\xf6\x94\xdd\xfd" + "\xd3\xa7\xda\xa8\x91\x6e\x6f\x9b\x48\x37\x86\x46\xd1\xed\xed\xf9" + "\x94\xad\x69\x7d\xa3\x4b\x52\xac\x2c\xf6\x35\xc8\xb5\x30\x87\x86" + "\xb1\xf8\x19\x66\x90\x13\x3d\xc4\xc2\xd5\xd2\x8d\x03\xf2\x41\xff" + "\x8a\x9c\xac\xb7\xa1\x0f\x36\xc8\xc6\xc3\xef\x3a\x94\x80\x32\xc2" + "\x88\xbf\x08\x45\xed\xf9\x42\x7a\x0c\xa1\xba\xb6\x89\x93\x13\xa8" + "\x11\xd6\x2b\x15\xb7\x5d\xd3\x6f\xe1\xf9\xdf\xb2\xe7\x86\xb5\x4d" + "\x14\x5e\x49\xc0\x9c\x62\x04\x31\x26\x0d\xd7\xee\x24\xc0\x93\x15" + "\x31\x81\xf6\x8d\x23\x8a\x0e\x25\x9c\xf3\x2e\x3f\x9f\x6a\xf8\x48" + "\x8f\x3e\x50\xd0\x27\x8c\x05\x6b\x83\xe7\xd8\xe0\x5d\x51\x4e\xd8" + "\x2d\x94\xab\x41\x5e\x99\xb8\x6b\x56\xad\x2f\x7d\x25\x26\x10\xde" + "\xe9\xfe\x6a\xfd\x55\x52\xd5\x8e\x73\x65\x78\xc3\xa1\x64\x42\x1e" + "\x4f\xb6\x19\x03\xcd\x2c\x66\xb7\x16\x73\xd8\xd0\xc1\x03\xf2\x9b" + "\x55\xa1\xa3\xa7\xa4\xc2\x3b\xc0\xbb\xef\xaf\xaf\xd5\x08\xf0\x1e" + "\xf7\xf1\x71\x83\xfb\x42\x43\x60\x6c\x23\x25\x7d\xc0\xcb\xfe\xf3" + "\xfc\x6f\x4b\x63\x08\xee\xad\x7e\x1f\x64\x13\xa1\x23\x26\x50\x80" + "\x75\x08\xaf\x1d\xd2\x5f\x20\xf8\x4c\x71\xac\xcf\x71\x1d\x18\xc6" + "\x19\x9e\x8f\xb1\xc2\xa5\x71\x85\xb5\x2c\xc4\xde\x91\xe0\x9e\xfe" + "\x9b\x46\x18\xa0\x7f\x11\x74\xdd\x31\xb7\x7b\x52\xe9\xfa\x1a\xca" + "\xf9\xc3\x9a\x00\xbf\x64\xba\x7d\x6c\x89\x39\xcc\x9a\xcd\x72\xbe" + "\x6e\x1a\x6a\x94\xbe\xe9\xc2\x7c\x03\x1e\x09\xfd\xa8\x04\x74\x68" + "\xf7\xf1\x11\xe3\x79\xae\x3d\xdf\x6f\x69\xa0\x1d\x73\x48\x5f\xc5" + "\xb8\xf3\xfe\x87\xf4\x16\x2f\x69\x1a\xea\x31\xc7\x23\xb6\x0f\xba" + "\x78\x87\x77\xed\xdd\x36\xd1\x23\x8f\x14\xc1\xb8\x68\x8f\xe9\xda" + "\xe9\x04\x15\x97\xd9\x6f\xbf\x80\x63\x85\xeb\x48\xca\x09\xa2\xb6" + "\xc2\x1a\xfa\xee\xb3\xd9\xea\xf0\x38\xa2\xb2\x83\x0c\x70\xb8\xa6" + "\x8c\x4c\x9d\x44\xd2\x2b\x13\x2e\x13\x29\x87\x1e\xac\x6b\x51\xef" + "\x3c\x6b\x56\xe3\x37\x24\xcc\x99\xc7\xf4\xdb\x4d\x3a\xc3\x7b\x5f" + "\xe1\xda\x1b\x16\xb7\xeb\x2b\xb3\xda\x76\x25\x46\xc7\xe2\xde\x83" + "\x2e\x9f\x9e\x40\x05\xc7\x77\x25\xcc\x8d\x92\x43\x47\x63\x4e\xf2" + "\xa3\xd1\x35\x2c\x16\xc1\xd1\x98\x32\x72\xb4\xae\x80\x54\x34\x9c" + "\xc6\x3d\xda\xdb\x8f\xc6\xe4\xa3\xec\x38\xd0\x06\xf2\xe1\x9b\x20" + "\x1f\xc2\x7c\xed\x2b\x68\xe3\xfd\xa5\x6f\x4b\x98\x63\x4f\x92\x0d" + "\x6d\x30\x47\x0b\xc5\x3c\x7a\xb6\xac\xd0\xba\x42\xf1\x3b\x13\xe6" + "\xd7\x7b\x23\x89\x8c\x7c\x43\x2d\xc4\xb8\xfb\xa6\x34\x70\x31\xf3" + "\xe3\x0e\x11\x06\xc5\xfb\x4b\x79\xf6\xa6\x2c\xd6\x91\xff\x85\x77" + "\x3f\xa4\xf7\x76\x4e\xde\xce\x62\x1e\xd9\x80\xef\x6c\xc0\x73\x36" + "\x18\x4f\xa0\x41\x31\xd0\xcd\xad\x3e\x22\xd1\xa0\x23\x5d\xa2\x81" + "\x6e\x25\xa3\x01\xe8\x31\x2b\x9e\x13\x69\x70\x0a\x68\xd0\x00\x34" + "\xc8\x24\x19\x47\xa6\x55\x90\xa9\xd1\x40\x83\x96\xcb\x98\x33\x81" + "\xe7\x31\x4c\xe4\x63\xcf\x68\x71\xca\xac\x46\x5f\x53\xa4\xc1\xce" + "\xe7\x39\x0d\x76\x3f\x6f\x06\x79\xc8\x5a\xf4\x0e\x94\xed\xaf\xc4" + "\xe8\x30\x8f\x15\xcd\x8c\xc3\x9c\xeb\x9c\x16\x1d\x40\x8b\x0e\x4e" + "\x8b\xb4\xc5\x40\x8b\xe3\xb5\x2c\x5e\xd6\xd1\xba\x0a\x52\x11\x57" + "\x44\x2a\x01\x97\x80\x16\xf1\x48\x17\xd4\xc7\xed\x2b\xf4\x41\xa0" + "\x7f\x07\x17\xa6\x90\x10\x89\x1e\xa0\xef\xf7\xcb\x4d\x21\xe8\x7b" + "\x1c\x01\x73\x53\xa2\x47\x30\xa3\xc7\x05\x91\x1e\xed\xe8\x3b\x07" + "\xf4\x68\x07\x7a\xb4\x03\x3d\x32\x39\x3d\x10\xe7\xa7\x58\x02\xa9" + "\xf0\x83\x1e\xe3\x69\x74\xa6\xc7\x0a\x91\x1e\xa7\x7a\x43\x0f\xdd" + "\xc4\xce\xf4\xb8\x23\xbc\x3b\x7a\xc8\x73\x62\x44\x18\xd2\xa3\xa3" + "\x48\x9c\x13\x23\x70\x4e\x64\xa8\xef\x81\xb5\x08\xc7\xf4\x70\xcd" + "\x5e\x36\x27\x30\x57\xd9\x3b\xcf\x5a\xd5\x15\x0d\x40\x97\xd9\xd4" + "\xce\x74\x5f\x91\x2e\x9c\x1e\xc3\xa3\x8a\xbf\xe2\xe3\xaf\x7b\x0a" + "\xd7\x0c\x9c\x1b\x48\x1f\xa0\x13\xcc\x1f\x77\x39\x28\x9d\xbf\xbf" + "\x42\x9b\x02\xce\x13\x9c\x23\x38\x1f\x2a\x13\x4e\x63\xde\x79\xf5" + "\xd1\xe8\x72\x82\xdf\x61\x8f\xc6\xec\x05\x5a\x15\x10\xfb\x2b\x40" + "\x9b\x24\xdc\x6f\x42\xc2\x30\x17\xe5\xd1\x98\x6c\x94\x17\xb4\xc0" + "\xf3\x7d\xed\x40\x27\x7b\x6b\x48\xbf\x1c\xd0\xa7\xf0\xfb\xac\xf3" + "\x77\x59\xcc\xbb\x4d\xfd\x42\xeb\xe0\xbc\xc6\x06\x34\x82\xb9\xa3" + "\x98\x33\x8e\x7c\xdc\xdf\xe9\xc9\x96\x7a\xe2\x3f\x60\x2e\xa7\x91" + "\xdd\x69\xce\x4c\x9e\x8b\x73\x26\x03\x68\x74\xc2\x4b\x1a\x85\x31" + "\x7b\x32\xe8\x99\x06\xd0\x87\x74\xb0\x4e\x02\x8d\x74\x7b\x3d\xd1" + "\xc8\x5e\x64\x4d\xb0\x6b\xfd\x36\x60\xee\x06\x61\xd1\x34\x95\x00" + "\xba\x53\x3b\xe8\xa8\x47\xcd\x36\x92\x0a\x3a\x44\xca\x69\xe2\x57" + "\x3d\xed\x0b\x52\x6d\x2a\x65\x71\xd7\xd1\x8e\x8c\xf9\x50\xaa\x6d" + "\xa5\x80\x57\xe1\x2c\xd6\xea\x16\x56\x36\x93\x15\x2f\x12\x1f\x96" + "\xa3\x36\xa6\x88\xe4\x00\x7f\xee\x7a\xbe\x48\x2d\x6c\x18\x50\x44" + "\x03\x30\x8f\x13\x31\xa2\x9f\x7a\xfa\x72\x12\x50\x99\x50\x81\xb1" + "\x36\xbf\xc5\xb8\xe6\x55\x16\x68\xd3\x4c\xdb\xed\xb0\x66\x6c\xcd" + "\xa4\xa5\x98\xdb\xe2\xbe\x64\x26\x8b\x23\xbf\xd8\x51\x16\x41\x7b" + "\x99\x31\xed\x0d\x90\xbd\xee\x64\xfb\x35\xe0\x9c\xaa\x72\x9e\x05" + "\xae\xff\xd3\x62\xec\x17\x8b\x23\x6b\xe3\xc7\xfb\x30\x46\xf9\x90" + "\xf0\x97\xf6\xa5\x99\x35\xf9\xa0\xfb\x82\x8c\x06\xf5\xee\x9c\x4c" + "\xb9\x5e\x98\x50\x7d\xdc\xca\xec\x96\xe6\xf4\x04\xbf\xfc\x14\xf4" + "\xcf\xc2\x3c\x19\xb8\x66\xff\x53\x18\xfa\x74\xd0\x22\x58\xaf\x86" + "\x0c\x35\x96\xcc\x32\xab\xe5\x75\xf9\x4e\x58\xcb\xac\xd9\x8f\xeb" + "\x69\x3a\xe6\x13\xd9\x0f\xef\x45\x37\x0d\xd0\xbe\x5b\x6f\x65\x98" + "\xf2\xde\xac\x6c\x35\x05\x9e\xb6\x02\x3e\x54\x7c\xf5\xdf\x2c\x6f" + "\x70\xa3\x6a\xe4\x6b\x47\x62\x6c\x04\x9f\x3f\xfd\x57\xf8\x8d\xe0" + "\xce\xbd\x6d\xea\x1d\xd6\x36\xbf\xdb\x22\xd3\x1b\xe4\x9c\xa9\xce" + "\xb9\x51\x11\x67\x76\xcd\x82\x36\x11\x67\xea\x33\xd4\x1c\x5b\xa2" + "\xd0\xb6\xe7\xef\x8a\x2d\x95\x2d\x17\x48\x1a\xf0\x71\x65\x42\x11" + "\xcb\xf9\x32\x10\xf0\x5d\x58\x01\x78\xd2\x01\xba\x3f\xe0\x09\xe2" + "\xc0\x56\xc0\x0f\x61\x05\xe8\xfc\xed\xa0\xf3\x8b\x38\x82\xb2\x17" + "\x1e\x5f\x04\x1e\x0d\x2c\x87\x73\x40\x27\x01\x70\x1d\xf0\x44\xff" + "\x66\x0a\x19\xf9\x26\xf0\xe8\x16\xc4\x11\x90\x8b\xa7\x18\x00\x47" + "\x5e\x01\x1c\x49\x62\xb9\xab\x43\xb6\xaa\x39\x7e\x7c\x5c\x9f\xad" + "\xce\x97\x72\xd7\xb3\xf1\xbd\xeb\xb6\x2a\xe4\x8f\xb8\x0c\xec\xab" + "\xda\x8e\xeb\xd3\x8a\x18\x9f\x2a\x0b\xf0\xc8\xa6\x70\x2d\x9e\x63" + "\xf3\xf6\x95\x84\x7e\x02\xe7\xb5\x28\x1c\x93\x6d\x17\x49\x04\xcb" + "\xef\xfa\x63\x48\xbf\xb5\x0b\x49\xf8\xd6\x8b\x64\xe4\xd6\x85\x44" + "\x0f\xf3\x55\xbd\x15\xfa\x30\x63\xb1\x96\xb0\xdc\x2a\x7e\xb7\x45" + "\xc1\x79\xb7\xb9\x55\x40\xae\x0e\xd9\x8a\x73\x66\x91\xde\xd1\x27" + "\x5b\xfe\xf8\x22\x3b\x8c\x1d\x8b\x43\xa7\xba\x6b\x19\x9b\x0f\x01" + "\x97\x8a\xb9\x9c\x7f\x57\x31\xf7\xbb\xbc\xb6\x13\x74\x95\x3e\xcd" + "\xaa\xbb\x5e\xa4\x79\x42\x91\x21\x85\xa8\x9a\xa5\x6b\x20\x7b\x0a" + "\x40\xab\x7b\x33\x48\x86\x30\xe8\x65\x7d\x75\xf2\x05\xcc\x55\xe0" + "\xe5\x3c\xbc\x0b\xa3\xda\xa8\xec\xf9\xe3\x77\x30\x5f\xa1\xf5\xe3" + "\x77\x6e\x6b\x26\x11\xf4\x8f\x40\x8f\x79\xf0\xae\xcd\x64\x64\x61" + "\x33\xbc\xeb\x2b\xfc\x5d\x11\x33\x90\x2e\x42\xe6\xdb\x88\xdb\x5d" + "\xe6\x25\x33\xff\x51\xaf\x46\x1b\x11\x60\xd8\x2d\x74\x04\xfa\x21" + "\xb3\x38\x41\xad\xd5\xb6\xd3\x04\x9f\x8b\x76\xa2\xea\xcb\x8c\xa7" + "\x9f\x46\x5e\x16\x8a\xc6\x96\xcc\xac\x03\xde\x6e\x4d\x00\x19\x70" + "\x6c\xc9\xfe\x7a\xd4\xf3\xb9\xcc\x67\x52\xdd\x99\x81\x72\xda\x27" + "\x70\x0e\x79\xdf\x89\xe7\x33\x90\xe7\xf1\x3a\xe3\x7b\xb8\xaf\xba" + "\xee\x1c\xc1\xf6\x9c\xdb\x41\xfa\x4b\x6d\x35\xaa\xfe\x79\x0c\xb6" + "\x85\xbc\x80\xf6\x1d\x9c\x6b\x9c\xf6\xa5\xe8\x73\x1e\x42\x87\x04" + "\x46\xf0\xb2\x19\x6d\x4d\x5a\xe4\x01\xc6\x2b\x80\xdf\x18\x07\x9a" + "\xd2\x18\x1f\xe0\x33\xec\x67\x3f\xa0\x77\x84\xc4\x17\x70\x2e\xd8" + "\x95\x37\x06\xae\xd2\xa2\x4e\x13\x8c\xff\xf7\x94\x3f\xbc\xa3\xdf" + "\x3f\x8f\xf6\xe8\x0f\xa7\xb3\x62\x6c\xf7\x3b\x10\x37\xed\x57\x9c" + "\x30\xb3\x85\x63\x26\x62\x92\x84\x9b\x0c\x9b\x58\xbe\x89\x52\xf4" + "\xdd\x4c\x60\x7d\xf4\x12\x37\x2b\x5b\x64\xdc\x9c\x62\x70\xc2\xcd" + "\x16\xda\x2e\x84\xb9\xc3\x4d\xfd\x18\x25\x6e\xea\x1f\x54\xe2\xe6" + "\x3d\x5b\x5c\x71\xb3\x33\x66\xea\x97\xbb\xc3\x4b\xd0\x63\xee\x68" + "\x56\xdd\x33\xc9\x33\x56\xea\x77\x78\x8f\x95\xbf\xfa\x48\x89\x95" + "\xfa\xa6\xbf\x5f\xac\xbc\xfb\x49\x05\x56\x6a\x7b\x88\x95\xcd\x0c" + "\x2b\x83\xe9\x0f\x30\x27\x44\xfc\xd8\x3a\xcf\x03\x56\xce\xeb\x66" + "\x2e\xfc\xd1\x13\x56\xde\xbd\x5d\x89\x95\x77\x1f\x57\x62\xe5\xdd" + "\xaf\xc9\x58\x29\x5e\xbb\x2e\x58\x79\x77\xd1\xcd\xc1\xca\xbb\x8b" + "\x18\x56\x5e\x44\xac\xbc\x67\x65\xf7\x58\xa9\xdf\xe9\x1e\x2b\xf1" + "\x3c\x62\xa5\x7e\xa7\x8c\x95\xa7\xbb\xc1\xca\xf0\x78\x2f\xb0\x32" + "\x98\x61\xa5\xd6\x03\x56\xce\x83\xb1\x12\xf9\x82\xf1\x9e\x0b\x6f" + "\x88\x58\x19\xe2\xc0\xca\x1e\xf0\x87\x77\xf4\x0b\x8f\xeb\x0a\x2b" + "\x85\x7c\x2e\x5f\x22\x56\xd2\x20\x11\x2b\xe7\xdb\x48\xca\x49\xc0" + "\xc8\xe3\xcd\xcc\x0f\x81\xf9\xf9\xc2\x2f\xf5\x39\xc4\xa2\x61\xc6" + "\xdd\x30\x5e\xd5\xa6\x12\x86\x4d\xcc\x5f\x75\x12\x62\x55\x09\xd4" + "\x2d\x70\xc8\x9d\x0c\x3b\x4f\x8a\xd8\x19\x2b\x62\xe7\x8c\x9f\x80" + "\x9d\xcf\x23\x2d\x47\x2d\x6e\x53\x4b\xd8\xb9\x1e\xb0\x73\x14\x93" + "\x1f\xf0\x3b\x28\xc7\xce\x88\x0b\x52\xbf\xd0\xa6\x59\x9d\xf8\x06" + "\xe1\xfd\xba\xdc\x19\x47\x9f\x62\xed\x1d\x32\xce\x6b\x21\x0e\x2c" + "\x8d\x95\xb1\x14\xda\xda\xe2\x19\x47\x47\xb5\x38\x70\x34\x13\x70" + "\xf4\x8c\x13\x8e\x82\xde\xf4\x1e\x62\x1e\xe0\x68\x2b\xc3\xd1\x8f" + "\x45\x1c\xbd\xd7\x7e\x24\x16\x70\xf4\x29\x09\x47\xef\x8d\xb0\x66" + "\xee\xb0\x5a\xb3\xba\xc7\xd1\x56\x86\xa3\x86\x1b\x8f\xa3\x65\x2e" + "\x38\x0a\xba\xeb\x9b\x99\x1e\x70\x54\xe2\x47\x86\xa3\x19\x32\x8e" + "\xb2\x71\xbd\x6f\x73\x55\x1c\x8c\x7b\x9c\x81\xe9\x6e\x0e\x1c\x35" + "\x94\x70\x1c\x85\x73\xcc\x7e\xb2\x14\x70\x14\xf8\x2f\xbd\x12\xe3" + "\x0d\x92\x28\xe8\xa3\x16\xf1\x75\x1b\xcc\x19\x1c\x23\x07\x9e\xce" + "\x83\x39\x83\x18\x73\x05\xe6\x0c\xe0\xe8\x8c\xab\x5a\xc2\xe6\x4b" + "\x16\xcc\x97\x66\x0f\x79\xfd\x24\xff\x59\x8f\x78\x7a\xdf\x25\x25" + "\x9e\x46\x8c\x54\xe2\xe9\x7d\x27\x65\x3c\x15\xaf\x21\x9e\x02\xcd" + "\x60\x7c\xf4\x88\xa9\xbd\xc3\xd3\xfb\xcc\x0e\x3c\x55\x8b\x78\x3a" + "\xaf\x7b\x3c\x65\xdf\x00\x3d\xe0\xa9\x33\x36\x78\xc6\xd3\xfb\xcc" + "\x32\x9e\x46\x54\x3a\xf0\xb4\xd6\x13\x9e\x8e\xb2\xb8\xc7\x53\x3c" + "\x8f\x78\x3a\xca\xe2\xc0\xd3\x5a\x37\x78\xfa\x94\x33\x9e\xde\xbf" + "\x8f\xe3\x69\x09\xc3\x51\xc4\xd4\x2a\x0b\xf0\x07\xce\xb9\xc4\x02" + "\x86\xa9\x02\x60\x2a\xe6\x3a\xc6\x3c\x57\xe8\x27\xef\x0e\x53\x39" + "\xe6\x9a\x08\xe2\x2a\xce\xcd\xf4\xc9\xa0\xef\xc2\x5a\x04\x63\xc2" + "\xd6\x5e\x69\xfc\xb6\x39\xe1\xeb\xcc\xe5\x5a\x94\xed\x14\xbc\x22" + "\x48\xbc\x72\x45\x8f\x3e\xb3\x0a\x5e\xf1\x8e\x96\xf7\xef\xf5\x84" + "\xad\x9e\x74\xf7\x23\xa8\xbb\x4f\x27\xea\x15\xd3\x01\x5f\x63\x50" + "\x77\x2f\x76\xd1\xdd\x8b\x3b\xeb\xee\x27\xba\xc6\x51\xaf\x74\xf7" + "\x67\x91\x86\xbf\xde\xa3\xc4\xd1\x5f\xef\x53\xe2\xe8\xd8\x07\xb1" + "\x5f\x1c\xc7\x8b\xdd\xeb\xee\x6c\x9e\xff\xa6\xaf\x43\x77\xaf\x55" + "\xe2\xa7\xac\xbb\x8f\x39\xef\x19\x47\x7f\x33\x5a\x21\x8f\xce\x10" + "\x71\x74\x96\x88\xa3\xb3\x64\x1c\x3d\xfa\x85\x24\x8f\x8e\x7e\xfa" + "\x70\xad\x33\x8e\xfe\x26\xd9\x81\xa3\x75\x9d\x71\x54\xc2\x50\xc4" + "\x53\x6c\x07\x6d\x59\x3b\x01\xa7\xdf\x9f\x65\x50\x73\x5b\x6d\x1c" + "\x8e\x9d\xbf\xab\xad\xb6\xb2\xe5\x2a\x49\x8b\x45\x3c\x2d\x60\x78" + "\x1a\xa8\x22\xf1\x80\x7d\x03\x71\x1f\x40\x21\x7e\xbf\x4f\xe2\x79" + "\xe2\xd0\xbe\x24\xbc\xc2\xf3\x8e\x4a\x76\x26\x78\x5f\xf6\xdd\xfe" + "\xc5\xd3\x22\xa6\x5e\x83\xf1\x00\x9e\x7b\xf3\x1a\x60\x6a\x92\x1b" + "\xd9\x74\x05\x60\x6a\x8a\x93\x6c\x0a\x73\xff\xe3\x59\xae\x98\x3a" + "\xfa\x5c\x15\xf2\x0a\x62\xaa\x42\x8f\x2f\xfe\x05\xe8\xf1\x63\x1e" + "\x52\x62\xe9\x18\x83\x12\x4b\xc7\xdc\x25\x63\xa9\x78\xed\xba\xc8" + "\xa6\x63\xc6\xdf\x1c\xd9\x74\xcc\x78\x59\x8f\x1f\x3b\xd4\x81\xa5" + "\xc7\x3d\x61\xe9\x6f\xc6\xbb\xc7\x52\x3c\x8f\x58\xfa\x9b\xf1\x0e" + "\x2c\x3d\xee\x46\x8f\x57\x60\xe9\x58\x3b\xc7\xd2\x62\x2e\x9b\xd6" + "\x4a\xb2\x69\xf1\xdf\xa0\x1e\x3f\xd6\xe3\x1e\x7a\x4f\x7a\xfc\x91" + "\x16\x8e\x9f\x88\x4f\x12\x86\xca\x7a\x7c\xb1\x67\x3d\xbe\x1b\x0c" + "\xf5\x4a\x16\x65\x18\xfa\x80\x5d\x89\xa1\x91\x2a\x25\x86\xfe\xcb" + "\x62\x57\x0c\xed\x8c\x9f\x91\x8f\xb8\xc3\x4e\xae\xc7\xff\x8b\xce" + "\x33\x6e\x46\xce\xf7\x1e\x37\x1f\x7c\x4d\x89\x9b\x91\x25\xff\x18" + "\xb8\x39\xee\x36\x05\x6e\x6a\x7b\x88\x9b\x3f\x8b\x4e\x3f\xce\xc5" + "\xfe\x39\xce\xc5\xfe\x39\xce\xc9\xfe\x39\xee\x3a\xda\x3f\xc7\xdd" + "\x24\xfb\xe7\xb8\x44\x59\x06\xfd\x97\xa7\xbb\xc7\xcd\xc8\x44\xf7" + "\xb8\x89\xe7\x11\x37\x23\x13\x65\xdc\xec\x4e\x06\x1d\x3f\xc6\x0b" + "\xdc\xfc\x85\xeb\xf4\xe3\xbb\xb4\x7f\xba\xd3\xe9\x11\x37\x19\x5e" + "\xd6\xba\xe8\xf4\xd3\x9d\x75\xfa\x62\x59\xa7\x9f\xc8\x71\xab\xda" + "\x96\xaf\xd4\xe9\xaf\x3b\x8e\x3e\xf4\xb8\xd5\x61\x0f\x7d\x1d\x70" + "\xf4\x21\x96\x5f\xda\xea\xb0\x87\x46\x55\x4a\xfd\xe2\x3a\xfd\x7a" + "\xc2\xfb\xe5\x46\xa7\x67\xbe\xb6\x0f\x6d\x76\xe8\xf4\xb5\xae\x3a" + "\x7d\xd4\x4a\xcf\x98\xfa\x90\xd1\xad\x4e\x8f\xfa\x37\xc3\x54\x03" + "\xc3\xd4\x6b\x9b\x9c\x31\xf5\x5f\x4f\x33\x4c\x7d\x42\xc2\xd4\x7f" + "\xd5\x58\x61\x6e\x5a\xfd\xba\xc7\x54\x6c\x47\xc6\xd4\x84\x9f\x07" + "\x53\x8d\x3d\xc7\x54\xe7\xfd\xa7\x1f\xc3\xbb\x3b\x30\x95\x8d\xf1" + "\xc3\xcb\xab\xe2\x10\x53\x13\x5c\xf4\xfb\x62\xf7\xfa\xfd\x61\xa2" + "\xc6\xf1\x91\xf4\x7b\xa4\x01\xc3\x9b\x1b\xaa\xdf\x3f\x7c\x4c\x89" + "\xad\x51\x1a\x25\xb6\x3e\xbc\x47\xc6\x56\xf1\xda\x75\xd1\xef\x1f" + "\xae\xb9\x39\xfa\xfd\xc3\x35\x32\xb6\x46\xed\xea\x1e\x5b\x1f\x2a" + "\x77\x8f\xad\x78\x1e\xb1\xf5\xa1\xf2\x2e\xb1\xf5\x09\x67\x6c\x7d" + "\x64\x8b\x84\xad\xb2\x7e\x0f\xfc\x81\xf3\x2f\x31\xbf\xf7\xfa\xfd" + "\x93\x37\x5b\xbf\x7f\xa4\xd0\x2b\xfd\x7e\x13\xe0\x2c\xe8\xe2\x2b" + "\x8e\x81\x7e\xff\xb4\xa8\xdf\xd7\x15\xb9\xe8\xf7\x45\x9d\xf4\xfb" + "\xd4\xa7\x45\x4c\x85\x39\xc5\x30\x75\x56\x71\xef\xf5\xfb\x67\x90" + "\x86\x8f\x6e\x56\x62\xea\xa3\x5b\x94\x98\xfa\xc4\x28\xec\x17\xc7" + "\xf4\x22\xf7\xfa\x3d\x9b\xe7\x8f\x9e\x57\xe8\xf7\xd0\xbf\xce\xfa" + "\xfd\xe3\xa7\x15\x98\x3a\xc3\x19\x53\x1f\x0b\x56\xc8\xa9\xf0\x5e" + "\x88\xa9\xef\x9c\xe1\x98\xfa\xee\x19\x27\x4c\x9d\xf2\xae\x88\xa9" + "\x13\x1e\x3f\x3c\xcd\x19\x53\x1f\x8b\x91\x30\x95\xe1\xe5\x0c\xab" + "\x3a\x3d\xa6\xb3\xdf\x09\xf3\xf7\x41\x5f\x20\x68\x1b\xf7\x56\x61" + "\x9b\xbb\xce\x24\x74\xef\x6f\x12\xe3\xde\xdf\xa4\x3a\xd1\x44\x2a" + "\x1a\xf2\x99\x9f\x49\x21\xfa\x99\xac\x22\x61\x85\xed\x7c\xef\x3f" + "\xcb\x11\x72\xcd\xfd\xbe\xff\x17\x9f\x93\x71\x16\x7d\xb2\xde\x44" + "\x9f\xac\x6b\xdc\x07\x08\xe8\xdd\x79\x9f\xbf\x24\x37\x01\x1e\xec" + "\x39\xe3\x8a\xb3\x13\x4e\x56\x21\xff\xc4\x26\xb8\xe8\xfc\x45\xbf" + "\x00\x9d\xff\xf1\xfb\x95\xf8\xfa\xf8\x6c\x25\xbe\x3e\x3e\x54\xc6" + "\x57\xf1\xda\x75\x91\x5d\x1f\x8f\xb8\x39\xb2\xeb\xe3\x11\xb2\xce" + "\xff\xc4\x00\x07\xbe\xd6\x38\xe1\xeb\x19\x67\x7c\x7d\x2c\x94\xe1" + "\xeb\x19\x57\x7c\xc5\xf3\x88\xaf\x8f\x85\x3a\xf0\xb5\xc6\x45\xe7" + "\x3f\xe3\x8a\xaf\x4f\x5c\x62\xf8\x0a\xbc\xa0\x94\x5d\x8b\xba\xd7" + "\xf9\xeb\x7e\x69\x3a\xff\x13\x1e\xe3\x7f\xbb\xd5\xf9\x11\x53\xe7" + "\x73\x4c\x45\xcc\x92\x70\x55\xd6\xf9\x8b\x3c\xea\xfc\xdd\xe1\xaa" + "\x57\xb2\x2a\xc3\xd5\x7f\xbb\xa4\xc4\xd5\x7f\xbb\xaa\xc4\xd5\xdf" + "\x2e\x77\xc5\xd5\xce\x98\x3a\x71\x8c\x3b\x3c\xe5\x3a\xff\x6f\xf5" + "\x9e\xb1\x74\x62\x9c\xf7\x58\xfa\xe4\x3a\x25\x96\x4e\xdc\xf1\x8f" + "\x8b\xa5\x4f\xdd\xa5\xc0\x52\x6d\x0f\xb1\xf4\x67\xb1\x03\x3c\xb5" + "\x52\x89\xa5\x4f\x95\x28\xb1\xf4\xa9\x39\x32\x96\x8a\xd7\xae\x0b" + "\x96\x3e\x95\x7a\x73\xb0\xf4\xa9\x54\x59\x56\xfd\xed\x73\xdd\x63" + "\xe9\xc4\x04\xf7\x58\x8a\xe7\x11\x4b\x27\x26\xc8\x58\x7a\xba\x1b" + "\x2c\x9d\xf4\x90\x17\x58\xaa\xb4\x03\xb8\x62\xe9\x4d\xb7\x03\x4c" + "\x1a\xef\x95\x1d\x40\xc2\xd2\xa7\x3b\xdb\x01\x10\x5f\x99\x1d\x00" + "\xc6\x4b\xc2\x30\x66\x07\x98\xc0\xb1\xac\xda\x96\xad\xb0\x03\x5c" + "\x7f\x6c\x9d\x3c\xd9\xea\xb0\xa7\x66\x02\xb6\x4e\x66\x31\x9c\xac" + "\x0e\x7b\x6a\xf4\x79\xa9\x5f\xdc\x0e\xf0\x3a\xe1\xfd\x72\x63\x07" + "\x78\x94\xb5\xb7\x5d\x61\x07\x70\xc2\x5a\x68\x6b\xb3\x67\x9c\x9d" + "\x5c\xae\xb0\x03\xd4\xcb\x38\x7b\x0d\x7d\xd4\x01\x07\x19\xce\x0e" + "\x71\xc6\xd9\x29\x6d\x0c\x67\x1f\x95\x70\x76\x4a\x40\x2b\xcc\xcd" + "\x56\x6f\x71\x16\xf7\x11\x9c\x89\xbb\x39\x38\x5b\xea\x05\xce\x3a" + "\xd9\x06\xf6\xc0\x78\x38\x70\x96\x8d\xfb\xd4\x8d\x55\xb1\x88\xb3" + "\x71\x2e\xb6\x81\x22\xf7\xb6\x81\x43\x37\xc3\x36\x30\xf5\x82\x12" + "\x6f\xa3\x75\x4a\xbc\x9d\x7a\x42\xc6\x5b\xf1\xda\x75\xb1\x0d\x4c" + "\x6d\xb9\x39\xb6\x81\xa9\x2d\x32\xde\x46\x1f\xee\x1e\x6f\x27\xd7" + "\xb8\xc7\x5b\x3c\x8f\x78\x3b\xb9\xa6\x4b\xbc\x7d\xd4\x19\x6f\x9f" + "\xde\x23\xe1\xad\x6c\x1b\x28\x12\x6d\x03\xd9\xdd\xdb\x06\xea\x3c" + "\xd8\x06\x1e\xbf\xd9\xb6\x81\xa7\x4b\xbd\xb1\x0d\xb4\x6d\xe2\x7e" + "\xfb\x2b\xd0\x6f\xff\x45\xc0\xdf\xe8\x2f\x60\x0c\xba\xf7\xdb\x4f" + "\x95\xfc\x4f\xe3\x0a\x44\x9c\x2d\x70\x6b\x1b\x38\xd2\xe4\xd9\x36" + "\x70\xe4\xb8\xb3\xff\xe9\x33\x1f\x29\xbf\x5b\x3d\xb3\x47\xfa\x6e" + "\x75\xe4\x2b\xc4\xd9\x67\x59\x1e\x28\x61\x43\x18\x8f\xe3\xad\x7a" + "\xd6\x88\xfd\x74\xe7\xc7\xff\xb1\xe0\xfc\x2d\xeb\x77\x83\x1d\xb6" + "\x82\x1a\xc4\xdb\x02\x22\xd0\x04\x3f\x8c\x23\xce\x6c\x05\xcf\x22" + "\xef\x3d\xbb\xd8\x19\x77\xf7\x9f\x72\xc6\xdd\xdf\x45\x49\xb8\x6b" + "\x07\xdc\xdd\x57\x5f\xc0\xed\xaf\xcf\x73\xdf\xd4\x9d\xcf\x3b\xf9" + "\xa6\x7e\xf1\xa9\x88\xbb\xd3\x1e\x3a\x6c\x82\xf7\xef\xca\x7f\x0a" + "\xee\xdf\x7d\xaa\xa7\x3e\xa8\x05\x6e\x7d\xa7\x44\x7c\x72\xeb\x3f" + "\x05\x7d\xd5\x6e\x11\xe7\xaa\x1d\xe6\xe9\x16\x27\xff\xa9\xc2\x14" + "\x98\xcf\xe2\xbe\x92\x2e\xfd\x50\x9f\x97\xfd\x50\xe9\x86\xb0\x50" + "\x5c\xdf\x84\x8d\x61\xa6\x76\x9a\xe0\x43\x83\xc3\x42\xf1\xf9\x1d" + "\x1d\xb0\xee\x3c\x16\xe3\x23\xea\x75\x88\x3d\x03\xf9\xb8\x4f\x4b" + "\xb6\xc3\x5a\x63\x87\xb5\x06\x68\x46\x6c\x28\x9b\x6c\x0a\xd3\x14" + "\x82\x9e\x67\xcb\x64\x39\x5f\xfb\xe5\x81\xae\xb7\x0d\xf5\xbc\x8b" + "\x30\x37\xd2\xf5\x6a\xec\x8f\x84\xa3\x81\x4d\xf0\x1e\x17\xbb\x96" + "\xe5\x6c\x3f\xca\x38\x6a\x7c\xea\x08\x3c\x73\xfa\x82\x2a\xe4\xdd" + "\x18\x79\x4f\x01\x93\x99\x3d\xf8\xca\x62\x5f\x78\xcc\x44\xe0\x85" + "\xeb\x60\x93\x70\xee\x8f\x12\xd7\xa7\x1f\x52\xe2\xfa\x74\xab\x12" + "\xd7\xa7\xef\x92\x71\x5d\xbc\x06\xb8\x6e\xcf\xe4\x72\x34\xac\x7d" + "\xbd\x94\xa3\xa7\x97\x49\xb8\x2e\x88\xb8\xbe\xb5\x07\xb8\xde\xa5" + "\x1c\xed\x84\x4b\x9e\x71\x7d\x7a\x99\x6c\x93\x78\x76\xbb\x5b\x1f" + "\xd9\x53\xce\xb8\xfe\xbb\x89\x0c\xd7\x4f\xb9\xe2\x3a\x9e\x47\x5c" + "\xff\xdd\x44\x8f\xfb\x09\x4e\xb9\x7e\x4f\xfb\xfd\xab\x0c\xd7\x6b" + "\x45\x1f\xd9\x1a\x2f\xf6\x13\xd4\x72\x4c\x97\xb0\x1c\xed\x55\x37" + "\xd7\x26\xf1\xfb\x35\xde\xd8\x24\x18\x96\xb7\x70\x2c\x47\x6c\x94" + "\xf0\xbc\x27\xfb\x09\xba\xc3\x73\x49\x6e\x46\x3c\xf7\x24\x37\x2b" + "\xf1\x3c\xe6\x55\x25\x9e\xc7\xbc\xa6\xc4\xf3\xd8\x57\x95\x78\x1e" + "\xbb\xc6\x15\xcf\x3b\x63\x79\xcc\x49\x77\x38\x6e\x78\x16\x6d\x14" + "\xb1\xa3\x3d\x63\xf8\x73\x1a\xef\x31\xfc\x79\xd5\x3f\x1c\x86\x6b" + "\x5d\x31\xfc\xf9\xf1\x88\x41\xf6\x2c\x17\x0c\x9f\x27\x62\xb8\x88" + "\x23\xdb\x9a\x45\x59\xd8\x15\xc3\x5b\xe0\x3d\xba\xd1\xc7\x6d\x3f" + "\xb8\x62\xf8\x0b\xf7\x2b\x30\x5c\xdb\x0d\x86\xcf\xe3\x76\x10\x85" + "\x5f\xae\x07\x5b\x08\xbc\x47\xd4\x16\x0f\xb2\xb9\x34\x66\xce\xfd" + "\x51\x62\xf8\x0b\xaf\x29\x31\xfc\x85\xbd\x4a\x0c\x7f\x61\xb1\x8c" + "\xe1\xe2\xb5\xeb\x22\x9b\xbf\x90\x7d\xdd\x65\x73\x89\x3f\xba\xc4" + "\xf0\x17\xb2\x65\xd9\x3c\x76\x4e\xf7\x18\xfe\x5c\x80\x7b\x0c\xc7" + "\xf3\x88\xe1\xcf\x05\x78\xdc\xe7\xd0\x09\xc3\x5f\x7c\xdc\x0b\x0c" + "\x57\xda\x42\x24\x0c\x17\x6d\x21\xdb\x9c\x6c\x21\xf6\x4c\x6e\x0b" + "\xd9\xd2\xcc\x79\x63\xa0\x8a\xf3\x29\xf0\x4f\xc8\x56\x75\xd7\xba" + "\xdb\x96\x5e\xd9\x41\x5e\x9c\xe0\x8d\x1d\x84\xe1\x37\xee\x71\x78" + "\x0e\x70\xbb\xa6\x87\x7b\x1c\x26\x4a\x7b\x1c\xf2\x3d\xec\x71\x10" + "\xf1\x7c\xc6\x4f\xc0\x73\xb6\xc7\x61\xc6\x74\xa5\x8d\x79\xc6\x73" + "\x92\x8d\x99\xe3\xf9\xac\xb9\x4a\x3c\x9f\x95\xe0\xd8\xf3\x00\x98" + "\x5f\x6d\x58\xdf\x69\xcf\x83\x03\xdb\x99\x1d\x74\xc6\x1e\xe3\xb3" + "\x0d\xc4\x81\xef\xb1\x32\xbe\x43\x5b\x43\x15\xd8\x5e\xef\x8c\xed" + "\x33\x4c\x0a\x6c\x3f\x53\xa0\xf4\x8f\xa8\x37\x38\x61\xbb\xb4\xe7" + "\x61\xe6\xe9\xc3\x75\xdd\x60\x3b\xdc\xdf\xf3\x3d\x62\xd7\x17\xdb" + "\xa5\xfd\x0d\x6e\xb1\xdd\x79\x7f\x83\x93\xff\x03\x62\x3b\x8b\x4d" + "\x35\xd8\x05\xdb\x57\x24\xa8\xed\x07\x61\x3e\x00\xae\xe3\x1c\xb1" + "\x53\xc0\x76\x36\xde\x71\x21\xce\xd8\xde\x91\xc9\xb1\xfd\xcd\xe6" + "\x9f\x8e\xed\x0e\x79\xd8\x19\xdb\x9f\x40\x6c\x8f\x1f\xcc\xf7\x5f" + "\x64\xf4\x6c\xff\x85\x8b\x7f\xc6\x9b\x3d\xb0\xbf\x74\x89\xf1\x6e" + "\xfa\xa5\xc4\xf8\xf8\x05\x4a\x8c\x8f\x2f\x52\x62\x7c\xfc\x74\x19" + "\xe3\xc5\x6b\xd7\x45\x4e\x8f\x9f\x7f\x73\xec\x2f\xf1\xf3\x65\x8c" + "\x9f\xf5\x64\xf7\x7b\x2f\x66\x34\xb9\xf7\xcd\xc0\xf3\x88\xf1\x33" + "\x9a\xba\xdc\x7b\xa1\xb0\x77\xbf\xf4\xa0\xdb\xbd\x17\x35\x3f\x9f" + "\x6f\x86\x33\xaf\xb8\xda\x5f\x7a\x6f\xfb\x7e\xc9\x63\xfe\x5f\x4f" + "\xf6\x17\xdc\x7b\xb1\xe2\x84\xd3\xde\x8b\xba\xee\xf7\x5e\xa4\x4e" + "\xef\xa1\xfd\xa5\x0b\xdf\x8c\x23\xd1\xce\xfe\x6e\xb3\xc7\x28\xf1" + "\x7d\xf6\x83\x0e\x7c\x7f\x06\xf1\x3d\x61\xb2\x12\xdf\x13\x26\x61" + "\x3f\xdd\xed\xc5\xf8\x58\xf1\x5d\x71\xf6\x46\xa5\xaf\x86\x8b\xfd" + "\xe5\x19\xe4\xbd\x97\xed\x0a\x7c\x3f\xe3\x8c\xef\xb3\x8d\xee\x64" + "\x77\xb4\x7b\x33\x9f\xe2\x19\x4e\x7b\xda\xa6\x48\xfe\x6f\x73\x0e" + "\x1f\x8e\x81\xf7\x37\x79\xf0\x75\x9b\xc1\x7d\xdd\x98\x6f\x1b\xda" + "\xc1\xa1\xad\xf7\x67\x18\xd4\x69\x71\x54\x40\x5f\x37\x57\x3f\x37" + "\xf4\x7d\x43\x5f\xb7\xca\x84\x7c\x8f\x7e\x6e\xc8\x9b\x9e\x7c\xdd" + "\xa0\xdf\xc1\x0c\xeb\xcf\x8a\x58\x2f\xfa\xba\x15\x26\xc9\xbe\x6e" + "\x0a\xac\x77\xe3\x3f\xbc\xe7\x4c\x86\x7b\x39\x3e\x5d\xc6\xfa\x76" + "\x94\xe3\xff\xc5\xc5\x16\xc3\x68\xf0\x07\xcd\xcf\x6a\x8b\x61\x58" + "\xff\x87\xb6\x2a\xe4\xe3\x58\x83\x1b\x5b\x4c\x67\x1f\xe7\x9f\xcf" + "\x16\xf3\xf2\xd3\x4a\x8c\x7f\x79\x8d\x12\xe3\x5f\x7e\x50\xc6\x78" + "\xf1\xda\x75\xc1\xf8\x97\xa3\x6f\x8e\x2d\xe6\xe5\x68\xd9\x16\x93" + "\x30\xca\xad\xff\x9d\xc2\xc6\x3e\xbb\xdc\xbd\x8d\x7d\xb6\xe8\x7f" + "\x37\xbb\xdc\xe3\x9e\x90\x4e\xdf\x34\xe7\x0e\xe2\x36\xf6\x5e\xec" + "\x09\xa9\xfb\xa5\xd9\x62\xe6\x6a\xbd\xb5\xc5\x30\xdf\xe6\x13\xe8" + "\x1f\xe2\xdd\x9e\x90\xee\xb0\xdd\x21\xbb\x77\xf1\x0d\x53\x89\xed" + "\xf3\x06\x29\xb1\x7d\xde\x60\x25\xb6\x2f\xbc\x4d\x89\xed\x0b\x43" + "\x5d\xb1\xbd\x33\xae\xcf\x9b\xe3\x0e\xd3\x0d\xcf\xa0\x2d\x66\x41" + "\x85\x67\x3c\x9f\x97\xef\x3d\x9e\xff\x71\xf3\x3f\x34\x9e\x6b\x5d" + "\xf1\xfc\x8f\xc7\x7f\x56\xbb\x0c\xc3\xf3\xf9\x87\x15\x78\xae\xed" + "\x06\xcf\x7f\x36\xbb\xcc\x82\x30\x25\x9e\x2f\x98\xa6\xc4\xf3\x05" + "\x7d\x65\x3c\x17\xaf\x5d\x17\xbb\xcc\x02\xdd\xcd\xb1\xcb\x2c\xd0" + "\xc9\x32\xfb\x02\x7b\xf7\x78\x3e\xaf\xc0\x3d\x9e\xe3\x79\xc4\xf3" + "\x79\x05\x1e\xfd\xa9\x3b\xe1\xf9\xc2\xd3\x5e\xe0\xb9\x5b\x1f\x95" + "\x5f\x86\x5d\x66\x61\x9d\xb7\x76\x19\x4f\xfb\x54\x10\xdf\x65\xff" + "\x14\xa7\x7d\x2a\x51\xd2\x3e\x95\x0c\xa5\x7f\xca\x75\xc7\xf6\x45" + "\x17\x94\xd8\xbe\xe8\x92\x12\xdb\x13\x07\x28\xb1\x3d\x31\x40\xea" + "\x27\xb7\xcb\x64\x76\xda\xb7\xa2\xc4\x79\xc3\xd3\xc6\x67\x1a\x88" + "\x3b\xac\x6f\x54\x2d\xdd\xe7\x19\xe7\x0d\xc9\x9e\x70\x1e\xfd\x55" + "\xde\x9b\x91\xe0\x06\xe7\x17\xaf\xfa\x7b\xc0\x79\x4f\x7e\x28\x4c" + "\x0f\x02\x8c\x47\xbc\x67\xf8\x2e\x62\x3d\xe2\xbc\xfd\x7f\xdd\xd9" + "\x68\x16\xef\xbd\x51\x38\xef\xd9\x46\xb3\x64\x4f\x55\xac\x88\xf3" + "\x3d\xd9\x43\x73\x40\x69\xa3\x29\x9c\x77\xa3\x6d\x34\x4b\x07\x29" + "\xf1\x7e\xe9\x04\x25\xde\x2f\x69\x93\xf1\x5e\xbc\x76\x5d\xe4\xf7" + "\xa5\xda\x9b\x63\xa3\x59\xaa\x95\xf1\x7e\xe9\x85\xee\xf1\xde\x90" + "\xe1\x1e\xef\x0d\x62\x6c\x36\x43\x46\xcf\xf1\x3e\xd1\x81\xf7\x9d" + "\xf7\xcf\x64\xf4\xde\x47\xe6\x91\x9b\x6d\xa3\x49\xf4\x88\xff\x5d" + "\xc5\xc7\xe8\xbd\x8d\x46\xdc\x93\x38\xcb\x7d\x7c\x8c\xc3\x5d\xf8" + "\xc8\x1c\xae\x70\xc6\xfa\x65\x27\x95\xbe\x88\xcb\x4e\x4b\xbe\x88" + "\x87\xab\x10\xeb\x53\x7c\x95\x58\x9f\xa2\xf1\x64\xa3\xd9\x23\x38" + "\xfb\x24\x26\x3d\xa8\xb4\xd1\x14\x29\x6d\x34\x53\x90\xf7\x96\x7f" + "\xe4\x19\xeb\x93\x66\x2b\x7d\xc0\xf9\x1e\xc5\x77\x66\x88\x3e\xe0" + "\x33\x9c\x7c\xc0\x9f\x7a\x4b\xc4\xfa\x57\x56\x95\xd7\xd8\x88\x37" + "\x7e\x88\x3f\xdd\xd7\x3b\xdb\xad\x0f\x22\x5b\x03\xba\xf0\x43\x9c" + "\x79\x52\x4b\x04\xf5\xdb\x68\x7f\x97\xfd\x10\xbb\x88\x67\xac\xc0" + "\xff\x19\x06\x8f\xf8\xdf\x46\x65\xfc\x17\x1e\x90\xed\x36\x02\xca" + "\xf9\x8c\x2e\xaf\xec\xbd\x51\x76\x1b\x77\x76\x12\xe3\xa3\x88\xff" + "\xc9\x1f\x70\x39\x3f\xe1\x17\x66\xb7\x59\xde\x57\x89\xfb\xcb\xc7" + "\x2b\x71\x3f\xf9\x92\x8c\xfb\xe2\xb5\xeb\xe2\x8b\xbe\xdc\xff\xe6" + "\xc8\xf9\xcb\xfd\x65\xbb\xcd\xf2\x73\xdd\xe3\x7e\xd2\x7c\xf7\xb8" + "\x9f\x34\x9f\xe3\x7e\xd2\xfc\x2e\xed\x36\x0a\xdf\xc8\x94\xc3\x3f" + "\xd9\x6e\x23\xc9\xf9\x37\x7d\x5f\x4f\x4a\xb9\x37\x76\x1b\xc7\x9e" + "\xf4\x9f\x64\xb7\x71\x8f\xf7\x92\x6c\x7f\xb8\x8b\x6f\xae\x4a\xbc" + "\x5f\x71\x58\x89\xf7\x2b\x2a\x95\x78\x9f\x7e\x5e\x89\xf7\xe9\x4d" + "\xee\xec\x36\x4a\xac\x4f\xbd\xcd\x1d\xce\x1b\xa6\xa0\xdd\x26\xbd" + "\xc0\x33\xc6\xa7\x4e\xf4\x1e\xe3\x57\xce\xf9\x3f\x8c\x77\xc1\x78" + "\xad\x2b\xc6\xaf\x2c\xfa\x59\x65\x7c\x86\xf1\x69\x1b\x15\x18\x7f" + "\x1d\x6d\x39\x3d\xd9\x4f\xe2\x59\xb6\x4f\x73\xf1\x7f\x4f\xd7\x29" + "\x31\x3e\xcd\xc9\xff\x5d\xbc\x76\x5d\x30\x3e\xed\xfa\xfb\xbf\xf7" + "\x08\xe3\xd3\x9c\xfc\xdf\xd3\x0f\x77\x8f\xf1\xa9\xd1\xee\x31\x1e" + "\xcf\x23\xc6\xa7\x46\x77\x29\xdb\x2b\x30\x3e\x63\xd7\x8d\xb0\xe5" + "\xdc\x9c\xfd\x46\x19\x3b\xbd\xb1\xe7\x74\x15\x77\xc4\xa3\x3d\x27" + "\x52\xb2\xe7\x18\x3c\xd8\x73\xae\x17\xe6\xaf\xda\xa7\xc4\xfc\x55" + "\x07\x94\x98\xff\xea\x25\x25\xe6\xbf\x6a\x56\xda\x73\x96\x74\xb2" + "\xe7\x28\xf1\x3f\x33\xcc\x38\xc5\xd9\x9e\x53\xe4\x64\xcf\x79\x75" + "\xbb\x67\xfc\xcf\xf4\x88\xff\xd7\x18\xfe\xc7\xb9\xc1\xff\xd5\xff" + "\x20\xf8\x1f\xf7\x13\xf0\x7f\xf5\x4d\xc0\xff\x35\x5b\xb8\x8d\xa7" + "\x87\x71\x52\xf6\x78\x6f\xe3\xf9\x69\xeb\xc0\x9a\xab\xca\x75\xe0" + "\x55\xbd\x72\x1d\x58\x73\x5a\x5e\x07\xc4\x6b\xd7\x65\x1d\x58\x63" + "\xb9\x39\xeb\xc0\x1a\x8b\xbc\x0e\xbc\x7a\xac\xfb\x75\x20\xd3\xc3" + "\x3a\x90\x29\xae\x03\x99\x5e\xac\x03\x59\x07\x3c\xdb\x78\x0c\xbd" + "\xb7\xf1\x3c\x78\xb3\xf7\x41\x65\x19\xbd\xb2\xf1\x6c\x1a\x51\x53" + "\x81\x31\x52\xce\x12\xf5\x8a\x78\xc9\xc6\x63\x74\xb1\xf1\x18\x3b" + "\xd9\x78\x96\x9f\x15\xf1\x7f\x92\xb8\xdf\x74\xca\x4f\x88\x91\xc2" + "\x72\x2f\xff\xfb\x3e\xa5\xdf\xfc\xbf\x33\xfc\x97\xe3\xf7\xfd\x69" + "\x32\xf6\x8b\xaf\x3f\xc6\x2e\x62\xa0\x66\x0f\x50\xd8\x74\x26\xb9" + "\x8b\x91\xf2\xba\xc2\xef\x46\xb9\xdf\x34\x3b\x52\x81\xf7\x53\xf8" + "\x7e\xd3\x77\xdd\x7d\xa7\x75\xc4\xe4\x7f\xed\x49\x16\x93\xdf\x11" + "\xcb\x2f\x3b\xb5\x47\xb1\xa4\x67\x88\xb1\xa4\xcf\xdc\x84\x58\xd2" + "\x3d\x8d\xc9\x7f\xc6\x35\x7e\xdf\x6b\xe7\xaa\x2b\x8c\xa4\x0a\x79" + "\x24\xd6\x35\xf6\xa9\xd1\xfd\xde\x7d\xb5\xb8\x77\x7f\xe1\x8d\x89" + "\x83\x82\xfd\x61\x6b\x7e\xd0\xcb\xba\x5d\x69\x66\xd6\x1f\xcc\x73" + "\x0d\x74\x9e\x5b\x01\xbc\x2a\x20\x9e\x2e\x41\x3c\x7d\xbd\x90\xd5" + "\x3d\x0b\xbc\x30\xf0\x5a\x11\xf2\x71\x9e\x40\x02\x0c\x49\x88\xad" + "\xaf\x33\xbf\x2f\x10\x23\x00\x5b\x79\xbd\x95\x67\xa9\xdd\x3e\x50" + "\x28\x82\xfe\xf7\xd9\xbd\xb0\xc6\xb7\xca\x64\x81\x79\xd1\x8c\x7b" + "\x62\x55\xd5\xb6\x56\x23\xd2\x62\xff\xc2\x1a\x0d\x05\xfc\xdd\xf6" + "\x07\xe2\xef\xdd\x3c\x7d\x3d\x81\xc9\x33\xb8\xee\x05\xbd\x1c\x8e" + "\x71\x40\x24\xd9\x4a\xf8\x51\xb6\x6f\x6d\x81\xf1\x11\x28\x5f\xfb" + "\x66\xce\xe5\xb8\x41\x61\xbd\x86\xb1\x64\x3e\xb6\x88\x1b\x2c\x87" + "\x15\xe0\xc6\xd6\xcb\xf2\x77\x6c\x6c\x1f\xc7\x88\xdb\x51\xfe\x24" + "\xfb\xbf\x98\x3c\x61\x6b\x76\x94\x7b\x6c\xcd\x8e\xe2\xd8\x9a\x1d" + "\xe5\xc0\x56\x93\x1b\x3b\x8a\xc2\x8f\x3d\x47\xf4\x7f\x31\xba\xc8" + "\xd8\xc6\xbf\xc1\xf8\x28\x39\x5e\xf9\xbf\x30\x3c\x9d\xcf\xf1\x14" + "\xf1\x4a\xc2\x54\xd9\x8e\x62\xf4\x68\x47\xe9\x0e\x53\xbd\xda\xc3" + "\xcf\x30\x35\x77\x90\x12\x53\x73\x07\x2b\x31\x35\x7f\xa3\x2b\xa6" + "\x76\xc6\xd3\xdc\xe9\xee\xb0\x94\xc7\x47\xc9\x9f\xe0\x19\x47\x73" + "\x33\x3c\xe1\x28\xf3\x4f\x9f\xe1\xe4\x9f\xee\xc0\xd1\xbc\x75\x4a" + "\x1c\xcd\x2d\xeb\x29\x8e\xb2\xdc\x26\x67\x7e\x86\xdc\x26\xbd\xc6" + "\x51\x83\x0b\x8e\xae\x1d\x25\xe3\xa8\x6b\x7e\x93\x6e\x70\x74\xde" + "\x8d\x89\x81\xa2\xc0\x51\xc1\xcc\xfa\xa3\x5b\xc8\xfa\xfa\x81\x12" + "\x47\xd7\x36\x78\xc6\xd1\xb5\xab\x64\x1c\xe5\xf5\x6e\x2c\x8e\xae" + "\x2d\x51\xe0\xe8\x3c\x27\x1c\xfd\x41\xd6\x21\xd0\xc7\xc2\x81\xa3" + "\x0b\x9c\x70\x74\x5e\x77\x38\xba\x96\x8d\x11\x97\x51\xf3\x97\x75" + "\x8f\xa3\xb9\xd9\xee\x71\x14\xcf\x23\x8e\xe6\x66\xcb\x38\xea\x46" + "\x46\x55\xe0\xe8\xba\xe7\xbc\xc0\xd1\x5f\x78\x6c\x94\x75\x31\x5e" + "\xd9\x2a\xe4\x3d\x9d\x9d\x63\xa4\xbe\xe8\xbc\x27\xa8\xd4\x25\xef" + "\x49\x69\xa7\xbc\x27\xcb\xa5\x3d\x9e\x13\x45\x5c\x7d\xea\x27\xe0" + "\x2a\xdb\xe3\xb9\x7e\xae\xd2\xf7\x64\xfd\x02\xc9\xf7\x84\xe3\xea" + "\x26\x95\xd4\x2f\x39\xef\x49\x69\x17\x31\x52\xd7\xef\x53\xc4\x46" + "\x99\xe8\x1c\x1b\x65\xe3\x07\x9e\x63\xa4\xae\x6f\x50\xc4\x46\x39" + "\x52\xec\xc8\x7b\xe2\x1a\x23\x55\xc6\xd8\x3f\x5f\x65\x18\xeb\x88" + "\x41\xf5\x67\xbd\x23\x46\x6a\x37\xfb\x82\xb0\x9d\xdd\xf5\x09\x37" + "\x1e\x63\x8d\x5e\x60\xac\x22\xef\x89\x6b\x8c\xa9\x0d\x9b\xab\xcb" + "\x4b\x49\x55\x5c\xa9\x9b\xd8\xa8\xa5\x37\x35\xf7\x09\xf6\xcb\x3d" + "\xd6\x6e\xbc\x4d\x89\xb5\x1b\xa3\x59\xdd\xd3\xee\xb0\x76\xc3\x05" + "\x19\x6b\x79\xbd\x95\xa7\x5d\xb0\xb6\xce\x03\xd6\xc2\xba\xba\xad" + "\xd1\x5b\xac\xdd\x18\xca\xb0\x36\x53\xc4\xda\xe6\xeb\x8d\xb5\x1b" + "\x43\x65\xac\xdd\x78\xb6\xfb\x1c\x53\xeb\x5b\xdc\xef\xcb\x59\xdf" + "\xc2\xb1\x76\x7d\x4b\x97\x39\xa6\x14\x3e\x1f\x9b\x8e\x49\x39\xa6" + "\x64\x7b\x40\xa9\x68\x0f\xf8\x5b\xce\x89\xb2\xa9\xc6\x5b\x7b\xc0" + "\x51\xd0\xdd\x71\xdf\xe5\x0a\xcc\x39\x15\x8b\x39\x51\x4a\x5c\xec" + "\x01\x25\x9d\xed\x01\xcf\x75\x8d\xb1\x5e\xd9\x03\xd8\xbe\xcb\xff" + "\xa8\x54\x62\xec\x7f\x1c\x53\x62\xec\x9b\x73\xa5\x7d\x96\xd8\x1f" + "\xcf\x31\x53\x0b\x6e\x73\xd8\x03\xea\x94\xd8\x2a\xdb\x03\xde\x1c" + "\xea\x19\x63\x0b\x94\xf6\xdf\xa7\x8a\x15\xfb\x2c\xdf\xad\x77\x8e" + "\x43\x2d\xc5\x9f\xda\x3c\xe7\xf0\x71\x67\x8c\x2d\xc8\xf9\x5b\x8a" + "\x43\xed\x88\x35\xd5\x8d\x2f\x77\xe7\x38\xd4\x6f\x00\xae\x95\x10" + "\xdc\xdb\xc6\xf0\x56\x61\x1b\x28\xb9\x39\xb6\x81\xf2\x12\x0f\xb6" + "\x81\x37\x5e\x55\xe2\xec\x1b\xa5\xac\xee\x49\x77\x38\xfb\xc6\x74" + "\x19\x67\x79\xbd\x95\x27\x5d\x70\xb6\xf6\x7a\xca\xb4\x6f\xac\xb9" + "\xb1\xb6\x81\x37\xd6\xc8\xb6\x81\x37\x7b\xb0\xff\xb1\x20\xda\x3d" + "\xce\x16\x88\x76\xd7\x02\xd9\xee\x5a\xeb\x26\x5f\x8a\x02\x67\x0b" + "\x47\x49\xfb\x1f\x99\x4c\x5b\x27\xc9\xb4\x25\x7f\x83\xf9\x52\x0a" + "\xc3\xbd\xb5\x0d\xe0\x3e\x77\xc4\x56\xc4\x2e\x09\x5f\x65\xdb\x40" + "\x89\x67\xdb\x40\x37\xf8\xea\x7d\xee\xbe\x2d\xa3\x94\xf8\xba\xe5" + "\x7e\x25\xbe\x16\xed\x73\xc5\xd7\xce\xd8\xba\x65\xb1\x3b\x5c\xe5" + "\xb6\x81\xa2\xf9\x9e\x31\x75\x4b\xa1\x27\x4c\x65\x31\xfd\xea\x65" + "\x1f\x69\x19\x53\xb7\xee\x51\x62\xea\x16\x53\x4f\x31\xf5\xa6\xe4" + "\x4b\xe9\x35\xa6\x26\xb8\x60\xea\xb6\xe9\x32\xa6\xba\xe6\x4c\xe9" + "\x06\x53\x6f\x94\x9d\xc0\x19\x53\x15\xb2\xeb\xb6\x93\x4a\x4c\x2d" + "\x0a\xf0\x8c\xa9\xdb\xde\x91\x31\x95\xd7\xbb\xb1\x98\xba\xad\xf6" + "\xc6\xda\x09\xb6\xd5\xca\xb2\x6b\xd1\x96\xee\x31\x75\xcb\x0e\xf7" + "\x98\xba\x65\x07\xc7\xd4\x2d\x3b\x7a\xbe\xa7\x7c\xfb\x2a\x2f\x30" + "\xf5\x17\x9e\x4b\x65\x7b\x86\xd7\x76\x02\xb4\xb7\x22\x96\xd6\xfd" + "\xb4\xd8\x21\xc9\x52\xec\x90\x09\x22\xc6\x3e\xf1\x53\x31\xf6\xad" + "\x75\x4a\x9f\x86\xb7\x36\x4a\x3e\x0d\x1c\x63\xff\x73\x8c\x32\x3f" + "\x6a\xe7\x58\x21\xca\x18\xaa\x6f\x9d\x73\xd8\x09\x10\x73\x27\x38" + "\xdb\x09\xde\x3e\xe7\x19\x6f\xff\x12\xa0\xb0\x13\x7c\xe6\x1e\x6f" + "\xaf\x29\xf0\x76\xc7\xaf\x18\xde\x3a\x62\xa8\xfe\x25\x5a\x8a\xa1" + "\xda\xad\x0c\xab\xc0\xdb\xb8\x9f\x07\x6f\x4b\x7b\x8e\xb7\xca\x5c" + "\x2a\xae\xf1\x52\x77\x54\x56\x97\x01\xde\xb2\x78\x1d\xae\x31\x53" + "\x7b\x16\xaf\xe3\x46\xc5\x4c\xc5\x7e\xb9\xc7\xdd\xb7\x9f\x56\xe2" + "\xee\xdb\x6b\x58\x5d\xb7\xb8\xfb\x76\x98\x8c\xbb\xbc\x5e\x8f\x71" + "\xb7\x57\x36\x83\xb7\xa3\x6f\xac\xcd\xe0\xed\x68\x19\x77\xff\x73" + "\x70\xf7\xb8\xfb\x97\x60\xf7\xb8\xfb\x97\x60\x8e\xbb\x7f\x09\xee" + "\x12\x77\x15\x3e\x04\xff\xe5\xeb\x36\x96\x47\xdd\xdf\x7a\x9e\x95" + "\xff\xd2\xf4\xc6\x66\x00\x18\xac\x4e\xc5\x18\x4e\x71\xe8\x43\xd0" + "\xbd\xcd\xa0\x3b\xbc\xf5\xde\x66\x50\xac\x52\xe2\x6d\xb1\xaf\x12" + "\x6f\xdf\xfb\x00\xfb\xd5\xa5\xcd\x80\x61\x40\xf1\xd3\x0e\x9b\x81" + "\x49\x89\xb3\xb2\xcd\xe0\xbd\x78\xcf\xdf\xbe\x8a\x53\x15\xf2\xed" + "\x13\x2e\x31\xab\x67\xc8\x78\x7b\xa4\x4a\xf2\x19\x7b\x67\xd7\xe1" + "\x68\x67\xbc\x2d\x36\x76\x8a\x59\x3d\xed\x3a\xc6\xac\x9e\x76\x9d" + "\x63\x56\x4f\x57\xc6\xac\x7e\xe3\x9a\xec\x47\xe6\x7d\xcc\xea\x77" + "\x9f\x64\x18\x8c\x3c\x84\x71\xab\x7b\x62\x47\xb8\xc1\xb9\x56\x14" + "\xd8\xab\xb0\x23\xbc\x5b\xa9\xc4\xde\xf7\x88\x67\xec\x7d\x77\x8b" + "\x8c\xbd\xbc\xde\x8d\x95\x79\xdf\xad\xb8\xb1\x76\x84\x77\x2b\x64" + "\x3b\xc2\x7b\xeb\xdc\x62\xaf\xe2\xdb\x58\xf1\x1a\xf7\xdf\xc6\xf0" + "\x3c\x62\x6f\xf1\x1a\x8f\x76\x84\x4e\xfe\x5b\x3b\x97\xf1\x6f\x63" + "\xa2\xcc\x6b\xf2\xc2\x8e\xf0\x8b\xf3\x31\xd8\x99\xd8\x1b\x3b\x02" + "\xe2\x2d\xe2\x99\x84\xb9\x3d\xb1\x23\x5c\x7f\x19\x77\xd7\x32\x25" + "\xe6\xee\x5a\xae\xc4\xdc\x0f\x86\xba\x62\x6e\x67\xbc\xdd\xb5\xc7" + "\x1d\xd6\x72\x3b\x42\x49\xb9\x67\x9c\xdd\xd5\xe0\x11\x67\x5d\x7c" + "\x73\x65\x9c\x7d\x7f\xb0\x12\x67\x77\xeb\x7b\x85\xb3\x3d\xcd\xc1" + "\xf2\x8b\xc2\xd9\x38\x17\x9c\x7d\xff\x03\x19\x67\x5d\xf3\xb0\x74" + "\x83\xb3\x37\x28\x0f\x8b\x67\x19\xb7\x64\x8c\x12\x67\x4b\x12\x3c" + "\xe3\x6c\x89\xaf\x8c\xb3\xbc\xde\x8d\xc5\xd9\x92\xd1\x37\xd6\xb6" + "\x50\x32\x5a\x96\x71\x4b\xda\xba\xc7\xd9\x5d\x2d\xee\x71\x76\x97" + "\xf8\x5d\x6c\x57\x8b\x47\x19\xb7\x13\xce\x7e\x70\xda\x0b\x9c\xfd" + "\x85\xfb\x20\x7c\xe0\x55\xfc\x0b\x27\x7b\xad\x5f\xb5\xc9\x65\xbf" + "\xc4\x49\xe7\xfd\x12\x4e\xb6\x85\x09\x92\x6d\x41\x99\x9f\x25\x59" + "\xb2\xdf\x46\x89\xb8\xfb\xe8\x4f\xc5\xdd\xff\xbe\xd0\xea\xc0\xdd" + "\x25\x80\xbb\xff\xcd\xf6\x47\xb4\x3a\x70\xf7\xff\xbd\x2d\xf5\x4b" + "\xce\xcf\xe2\xc1\xb6\x30\x0e\xdb\xfb\xeb\x23\x0e\xdb\x02\xe2\x70" + "\x94\xb3\x6d\xe1\xff\x4d\xf7\x8c\xc1\x7f\x4d\x50\xd8\x16\x3e\x75" + "\x8f\xc1\x16\x05\x06\x7f\xb8\x99\x61\xf0\x38\x09\x83\xff\xba\xf3" + "\x1a\xe8\x96\xd7\xb2\xbc\xc3\x60\x0b\xc3\xe0\x89\x37\x07\x83\x3f" + "\xbc\x0e\x18\xcc\xc6\xfd\xa3\x87\xaa\x8d\x80\xc1\xb1\x88\xc1\x13" + "\x7b\x66\x6f\xf8\x99\x72\xb4\x60\xbf\xdc\x63\xf1\x47\x07\x94\x58" + "\xfc\x91\x85\xd5\x75\x8b\xc5\x1f\xad\x93\xb1\x98\xd7\xbb\xb1\xf6" + "\x86\x8f\x8c\x37\xd6\xde\xf0\x91\x51\xc6\xe2\xff\xf7\x6a\xf7\x58" + "\xfc\x57\x83\x7b\x2c\xc6\xf3\x88\xc5\x7f\x35\x74\x89\xc5\xe3\x9c" + "\xb1\xf8\x7f\x1c\x32\xaf\xc2\xde\x60\xfa\x5b\xcf\xdd\xf2\x3f\x1e" + "\xe5\x5f\xdd\xed\x24\xa3\x5e\xf5\x3f\x95\xd5\x85\x84\x5c\xc9\x24" + "\x19\xd5\xb6\x71\x04\xce\xc1\xf8\xfd\xcf\xd5\xea\x90\x48\x22\xac" + "\xef\xa3\x47\x3c\xfe\x33\xfe\x40\xc6\xcd\x57\x8b\x73\x8b\x8d\x71" + "\x29\xf3\x77\xc5\xf3\x88\xbd\xdb\x9c\xae\xbb\x7b\x16\xcd\xf7\xdb" + "\x21\xde\xc7\x6c\x56\x50\x2e\x96\xca\xc8\x9b\x26\x55\xe9\x34\xba" + "\xce\xaf\xc8\x3c\xc8\xaf\xc8\xdd\xfd\x23\xb4\xc4\x7f\xe0\x2a\x4a" + "\xb7\x6e\xa2\x96\x2b\xff\xd4\x3f\xea\xca\xeb\x84\xe4\x6f\xa2\xe6" + "\xd6\xac\xd2\x1c\x78\xc7\x0f\xff\x03\xea\x5d\x09\xca\xd0\x5e\xc9" + "\x8c\x26\x70\xae\x48\x3a\x07\xe3\x46\x84\x4c\x1f\x2a\xc0\x35\xba" + "\xbe\xda\xb6\x2d\x0d\xb0\x2a\x95\x90\x7b\xaf\xe1\x9c\x29\x2d\x01" + "\x9e\x09\xce\x83\x36\xd7\x42\x5b\xf4\xd6\xe1\x16\xe0\x47\x4d\xd5" + "\x1a\x82\x73\x3a\x1b\xde\xab\x28\x0f\xc7\xde\xe7\xee\x02\xaa\xd6" + "\x10\x61\x7b\x7b\x01\x1d\x7c\x67\x0d\xd0\x83\xe4\x2f\x21\x6c\x0f" + "\xff\x5a\xa8\x47\xd5\xe9\x54\x08\x6b\xd3\x55\xdb\x2c\x7c\x4e\x43" + "\xff\xf6\x83\x1e\x4b\xe1\xb9\x5b\x97\x10\x2d\xfc\x02\xe8\xc6\x3b" + "\x6b\x5a\xb3\xf6\x44\xc2\x7b\xea\xb0\x5f\x9e\xde\x71\xed\x1b\xb0" + "\xee\x0c\x0f\xc1\xb5\x83\x3d\x1f\x9f\xcd\x9e\xa3\x16\xb2\xed\x70" + "\x9e\x66\xa6\xd3\xea\x64\x1b\x09\x84\xb1\xd8\x06\xfd\x46\x7e\x14" + "\xfe\xb3\x7f\xd4\xea\x61\x84\xec\x4e\x69\x52\x57\x43\xdf\xed\xff" + "\x31\xdc\x62\x4c\xfb\x35\x81\xeb\x66\xd4\x59\x1a\x55\x1f\x8f\x99" + "\x7a\x9e\x10\xc4\x13\xf8\xff\x11\x0b\xac\x63\x93\xa1\xbc\x16\xde" + "\x43\xb8\x12\xa2\xc1\xba\x8d\xaa\x3d\x17\x8c\x49\xa7\x48\xa0\x81" + "\xf8\xe7\xc1\xbb\xf1\xba\x7b\xf6\x62\x5d\x93\xea\xe3\x28\xec\x03" + "\x94\x6b\xa0\x8c\xf7\xa1\x0f\x19\xcc\xa3\xf6\x02\xc6\x9b\x1b\xee" + "\xac\x11\xc2\xda\x0b\x18\xf6\xc1\x7b\xae\x85\x77\x86\x3a\x01\x50" + "\x27\x80\x1d\xd3\x88\x76\x03\x9c\xc3\x76\xe0\x18\x60\x5c\xd8\x8e" + "\x6d\xef\xc4\xb6\x3d\x8c\x83\x86\x06\xdf\x59\x43\x81\xb7\x71\x4d" + "\xd5\xa5\xa9\x8e\xd5\xab\x3e\x36\x05\xaa\x28\xa5\x45\x6d\xba\xd5" + "\x69\x24\x20\x5f\x20\xc4\x38\x0c\xdb\xf9\x78\x0f\xb4\xaf\xc1\xb1" + "\x68\xcd\xfa\xb8\xc0\xa4\xda\x33\x01\xc7\x17\xe8\x69\xd1\x8d\x60" + "\xef\x6b\xc6\xe7\xe0\x3d\x62\x7d\x16\xfb\x1e\xfb\xac\x4b\xf3\xa1" + "\x50\x3e\xe9\xa3\x3a\x4b\x7c\x42\x06\xbc\x0f\xf7\xd7\x9a\xc8\xc2" + "\x0a\xbc\xdf\xc4\xef\x03\x5e\xfa\xb8\x05\x68\x16\x87\xe7\xb0\xec" + "\xa1\xbf\x01\x12\xdd\x2a\x43\x80\x37\x5c\x69\x27\xf1\x08\xf0\x85" + "\xc4\x23\xd8\xdf\xf7\xd3\x4c\x6a\xb6\x0e\xab\xfe\x97\xe9\x75\x79" + "\x40\x43\xfb\x9b\x21\x9a\xb5\x30\xb6\x42\x07\xd2\xa5\x1e\xae\xed" + "\xbd\x1f\xe9\xb2\x36\x05\x68\xc2\xeb\x4e\x93\xfb\x8f\xe5\xbd\x8c" + "\x9e\x02\xd0\x82\xef\xdd\xdc\xeb\x8b\xef\xb3\xf6\x1a\xd0\x71\x08" + "\xb5\x94\x25\x43\xbf\x90\x6f\x81\x47\x76\x2f\xb1\xaa\xd1\xaf\x0f" + "\xcf\xef\xbf\x6c\x55\xaf\x6d\x26\x28\x57\x92\x5c\xc0\xe5\x2d\x49" + "\x30\xe6\xd0\x26\xd5\xb5\xe9\xee\x93\xe8\x98\x02\xb4\x4b\x02\xde" + "\x85\x31\x5f\x0b\xe3\xb7\x15\x30\x0f\xff\xdf\x0a\xeb\x8f\x00\xf5" + "\x4c\xaa\xbd\x51\xd0\x9e\x76\xcb\x10\x6a\xde\x36\x84\xb6\xc0\x18" + "\x1e\x6c\xcd\xda\x1b\x2a\x8d\x21\xf6\x69\x2d\x9c\xcf\x85\xeb\x26" + "\xd5\xff\x16\x70\x1e\xfa\xdf\x04\xe9\x9d\x3d\x8d\x67\xce\x6e\x12" + "\x99\xbb\x9b\x84\xbe\xbe\x9b\x8c\x5f\xd1\x00\xf3\x32\xf3\x61\x7a" + "\x34\xd6\x46\x04\x6d\xbc\x7f\xfb\x90\x01\x5a\xfc\xf6\x24\xac\x1e" + "\x5e\xf4\xea\x6e\x12\x8e\x7b\x63\x31\xd3\x18\xae\xe1\x53\x7d\xbf" + "\xa5\xd5\x86\xab\x44\x18\x14\xef\x6f\x5f\x7d\x77\xd0\x94\xab\x84" + "\x1c\xd2\x5b\x48\x5a\x22\xac\xe5\x97\x9b\x48\x9a\x85\x9a\xab\x32" + "\xce\x13\xc0\x9e\x02\x3e\x76\xfb\xea\xa6\xce\x21\x04\xf7\x0c\x0a" + "\x3f\xe8\xc9\x80\x04\xa2\x49\x3d\x49\x42\xd2\x1b\x68\x93\x7d\xd3" + "\x50\x63\xda\x4a\xa2\xde\x7d\xb9\x96\xcb\x9e\xaa\x7d\xbb\xf6\xe1" + "\xfe\xd4\xd6\x18\x32\xd3\x26\xae\x47\x1b\xee\xac\x4d\x9f\x4b\x86" + "\xe2\xfb\x04\x32\xd9\x6b\xdf\x93\x30\x6e\xb5\xde\xe1\xf3\xbe\x60" + "\x46\xcf\x4d\xc3\xa3\x76\xcf\xb2\x82\xbc\x75\x4c\x97\x3e\x87\x36" + "\xa1\x5c\x07\xeb\x0b\x93\x05\xab\x9b\x6c\x20\x5b\xcd\x86\xf5\xdb" + "\x44\x3e\xa9\x2f\x52\x0b\xeb\x8e\xe9\xbc\x7c\x46\x32\x5b\xb7\x71" + "\x2d\x85\xbe\x4f\xd7\x93\x0c\xbe\x0e\x5a\xb3\x03\x13\x51\x9e\xa2" + "\xdf\x62\xff\xf7\xc3\xbb\xd2\xb0\xb1\xb0\x0e\xef\xb5\xe1\xfa\x39" + "\xb5\xce\x48\x2a\xac\x76\xf2\x46\x33\x1b\x23\x3f\x18\x23\x0d\x5c" + "\xab\x81\x71\xf2\x77\x47\x37\xa4\x99\x90\x1f\xef\x2f\xf8\x70\xda" + "\x30\xba\x58\x38\x5d\xa6\x2c\x26\xb0\x8e\x02\x6d\xd6\x71\xda\x08" + "\x83\x47\x94\x20\x6d\xbc\x7b\x8f\xfd\x51\x9e\xd6\x17\x7c\x36\x05" + "\xfe\x40\xbe\x10\x82\x47\x94\xe0\xb3\xb1\x0f\xf8\xfd\x0c\xf9\x60" + "\xea\xab\xdf\xd2\x2a\x43\x13\xa9\x86\xf7\xa1\x83\x9c\xfb\x60\xf3" + "\xb6\x0f\x65\x9e\xfa\x90\x73\x2f\xf0\xed\xbd\xc0\xb7\xf7\x02\xdf" + "\x9a\x38\xdf\x1e\xa9\xe3\x7c\x6b\x87\x7e\xb5\x81\xec\xbe\x62\x3a" + "\x51\x63\xbf\x76\x9e\xc2\x18\x7d\xd0\xcf\x26\x99\x77\x27\x5f\x80" + "\x31\x92\xf8\xd7\xe7\xee\x20\x1c\x9f\x2a\x4b\x2d\x49\x47\xfe\x6d" + "\x77\xc7\xbf\xc6\xc2\xa9\xf1\x40\x9b\x97\x81\x7f\xbf\xd7\x93\x80" + "\x06\xa2\x59\x39\x1d\xf8\xb7\xc9\x1d\xff\x1a\x17\xec\x85\x67\x76" + "\xe2\xdf\x39\xce\xfc\x6b\xec\xeb\x3d\xff\x7e\x72\xdc\xc1\xbf\xcf" + "\x8b\xfc\x3b\xd7\x85\x7f\x1b\x9c\xf8\x17\xdf\xdb\x6b\xfe\x35\x46" + "\x7a\xc7\xbf\x9f\xec\x75\xf0\x2f\xe8\x25\x6f\xfc\x81\x8d\x91\x1f" + "\x8c\x11\xf0\xef\x27\xf9\x30\x4e\x6e\xf9\xf7\xe7\xa7\xdf\xa7\xb1" + "\x3d\xa7\xdf\xa7\xa3\xba\xa7\xdf\x81\xc3\xde\xd3\xef\xc0\x86\x1b" + "\x4f\xbf\x03\x56\xef\xe8\x77\x20\xd5\x33\xfd\x0e\x44\xff\x72\xe8" + "\x57\x16\xda\x73\xfa\x1d\xbc\xd0\x3d\xfd\x0e\xbe\xe6\x3d\xfd\x0e" + "\x4e\xbb\xf1\xf4\x3b\x58\xea\x1d\xfd\x0e\x8e\xf7\x4c\xbf\x83\x5a" + "\x4f\xf4\x7b\x6c\xa8\x40\x05\xf4\x9b\x1b\xd2\xd7\x80\x32\x10\x97" + "\xd7\xca\xce\xa3\xce\x08\x65\x8d\x54\x66\x32\x15\xe8\xd5\x2e\xe5" + "\x00\x97\xb2\xd6\xa5\x1c\xec\x52\x0e\x71\x29\x87\x4a\x65\xa0\x97" + "\xef\x45\x55\xd9\x73\xa0\xb3\x65\x98\x54\x65\x16\xf1\xfa\xc8\x99" + "\x76\x1d\xea\x7d\x23\xdd\xf5\x7d\x6d\x26\xb5\x1a\xd2\xc8\xf0\x66" + "\xd5\xa1\x38\x46\x8f\xd5\xc3\xf4\x34\x25\x83\x00\x3d\xa6\x4d\x59" + "\x89\x7c\x65\x26\xb4\x23\xc4\x0f\xc6\xe9\x56\xd0\x37\xcd\xc8\x73" + "\xba\x25\x9f\xd0\x7a\xd5\xa1\xc9\xf8\x7e\xf7\x1a\x8c\x44\xf0\xb9" + "\x1b\x73\xa2\xab\x80\x3e\xd3\xcc\x3e\x77\x0f\xa3\xdb\x1f\x88\xca" + "\x53\x0b\xfe\x79\x99\x82\x6e\xa5\x99\x9a\x27\x5d\x82\x75\x0c\xd6" + "\xb2\xea\x16\x2b\xf0\x24\x35\x1b\x97\x5c\x80\xfe\x1e\xfa\xa8\x32" + "\x15\xda\x86\xe7\xc0\xb3\xa2\xa9\xf6\xd8\xe8\x6a\x5b\x0d\xa1\xd0" + "\x46\x95\xa5\x1c\x74\xff\x5a\x22\xb6\x19\x4d\x07\x1d\x1b\x8d\x6d" + "\xba\xd5\xcf\x36\xf4\xdd\x01\xcf\x1c\x37\x5d\xaf\x21\x74\x95\x26" + "\xd8\x3b\xfe\x38\x54\xeb\x51\xef\xdb\xd0\x6f\x24\x6f\xd7\xbf\x17" + "\xed\x7e\x16\xd1\x45\xbb\x62\x7f\xb5\xbd\x69\x37\xdb\x73\xbb\xfd" + "\xc5\xfe\xea\x7a\xd3\xae\xa9\x8b\x76\xc5\xfe\x46\xf5\xa2\xdd\xcf" + "\x3d\xe6\xff\xa0\x1b\x02\xc4\xfe\x66\xf4\xa6\xdd\x7c\xcf\xed\xf6" + "\xdd\xd1\x3b\x5e\xf8\xbc\xa1\x2b\x5e\xe8\x1d\x1f\x94\x77\xf1\xfe" + "\xfd\x76\xf4\x8e\x07\xca\x73\xba\xe2\x81\xde\xd1\xbf\xbc\x4b\xfa" + "\xf7\x8e\xf6\x87\x47\x77\x45\xfb\xde\xd1\xfd\xb0\x47\xfe\x47\x5d" + "\x16\x68\x1f\x45\x87\x8c\x2d\x12\xd6\x9f\x8c\x12\x86\xf4\x7d\x74" + "\xb5\x10\x45\x1e\x03\x0c\x0b\x2c\x20\x83\xa2\x98\x7d\xe8\x48\xe8" + "\xca\x42\xa2\xce\x57\x0b\xea\x5d\x29\xb5\xea\x6a\x5b\x24\x49\xb7" + "\x51\xfb\x8e\x24\xab\xea\x4e\x38\x7f\x20\x81\x10\xcb\x52\x3d\x61" + "\xed\x04\x9d\x8c\xca\x4b\x8b\x22\x53\xed\x04\xed\x11\x96\x83\xa9" + "\x80\x61\x80\x63\xd5\x05\x56\x5c\xf3\x06\xc1\x7d\x36\xe0\x5f\x68" + "\xc3\x4a\xde\x17\xcc\xaa\xa8\x25\xac\x9e\x19\xf4\x46\x33\xdd\xd4" + "\xf7\x51\x9a\xae\x27\x6b\xe0\x7f\x78\xe6\xab\x3e\x66\xa2\xde\x0a" + "\xfa\x64\x6b\xd6\x11\xc0\xe5\xa3\xb1\xa8\x63\x82\x2e\xdb\x92\x7e" + "\x09\x6d\xee\x63\x8b\x56\x83\x5e\x8b\x75\x77\x0b\x66\xf5\xbd\x06" + "\xa2\x3e\x68\x46\xfd\xfd\xc8\xce\x03\x89\x84\x74\x61\x73\xd1\x08" + "\xc1\x61\x23\xf1\x7e\x6c\x07\x6d\x99\x6b\x05\x18\xdb\xe0\x3b\x6b" + "\xb1\xbf\x30\xc6\x56\x63\x0a\xae\x0b\x47\x47\x3f\xfe\x2b\xda\x2a" + "\xe2\xfc\xb0\x66\x28\x33\x9d\x3d\x93\xd6\x50\x6d\x8d\x9e\xe6\x0d" + "\x88\xaa\xb2\x5c\x26\xc6\xa4\x76\x52\xaf\x3a\x3a\x06\x9f\x7d\x25" + "\x38\x4c\x67\x09\x0e\xd3\xb7\x66\x1d\x8d\x90\xfa\x8b\xcf\x92\xce" + "\xa3\x8d\x82\xf7\xf1\x68\xf4\x81\x54\xcf\x7d\x84\xb5\x24\x68\x6a" + "\x08\x35\xe3\x18\x1a\xd3\x2e\x43\x5f\x2a\x0e\xe1\x38\xd3\x0d\x3a" + "\xb3\x25\x5d\x7f\x3b\xb7\xd9\x1d\x6d\x41\xdb\x0f\xac\x03\x13\x98" + "\x1d\x66\xdd\xb1\x09\xcc\xcf\x06\xf0\x1e\x74\xf6\x48\x94\x57\x2e" + "\xaa\x8e\xb2\xfc\xc7\xd3\xf5\x6a\x2f\x75\x9e\xa3\x6c\xfd\x37\xde" + "\x8e\xe3\x50\xb1\x0b\x9e\xf7\x2f\xf5\xaa\x0a\x2d\xb7\xe3\x1d\x8b" + "\xc1\xe7\x41\x9d\x42\x78\x66\x0c\xcd\xaf\xd1\x61\x3d\xb8\x1e\x21" + "\x5e\x8f\x73\xba\x1e\x47\x37\x84\x45\x8a\xd7\x45\x3b\xe0\xb1\xd9" + "\x4e\xd7\x67\x1b\x6e\x47\xbb\x5c\x45\x32\xbe\x13\xac\x65\x51\xb8" + "\xae\xa1\xcd\x9f\xdb\xd5\x8f\x45\x89\xf5\xa6\xb5\xa8\x2a\xd6\x5d" + "\x01\xbe\x82\xeb\xb1\x4e\xf7\xc7\x1e\x4c\x8e\x20\x8f\x6d\xc1\x31" + "\xad\xd8\x61\xf2\x39\x9e\xca\x6d\x39\x47\x8b\xd8\x58\x68\x8f\x45" + "\x3a\xb7\x67\x52\x55\x18\xa0\xcd\x48\x0b\xc8\x7a\x50\x27\x1b\x9f" + "\xe9\x6e\xfc\x6d\x45\xd6\x8c\x76\x9d\x35\xbf\x7d\xc3\x3d\xe6\x7b" + "\x1a\xee\xb0\x3b\x7c\x34\xe3\x88\x7a\x6a\x1d\xf1\x49\x8f\x27\x6a" + "\x94\x73\xd2\x8e\x11\x75\x2a\xfc\x8f\xf6\x60\xaa\x36\xcc\xdf\x9d" + "\x64\x85\xf9\x61\xf4\xc5\x18\x5c\x1d\xc1\x7d\xa3\x6c\xe1\xfd\x8b" + "\xf0\x7b\x4a\x5b\x91\x35\xce\xba\x21\x74\x62\x5b\x70\x68\x4c\xe3" + "\x7c\xa2\x9e\xd9\xe2\xf6\xdb\x4a\xe4\x8a\x3a\x2a\xa4\x2d\x26\xfe" + "\x53\x63\x7d\x28\x7e\x5f\xa9\x4c\x38\x47\x56\x5e\x20\x6a\xfc\xa6" + "\xf2\xc6\x35\x12\x5c\x0d\xb2\x29\x7e\x73\x09\x88\xd3\x91\xc2\x34" + "\x12\x3c\xa0\x85\x68\x07\xa8\x54\x7e\xbf\x7d\x8e\x10\x7b\x6b\x42" + "\x5f\xe0\x57\xe1\xee\x06\x1d\xda\x35\x06\xd2\xf5\x2f\x91\xdd\x69" + "\xa5\xbe\x36\x90\x85\xf1\xbb\xcb\x9f\xae\x91\xf0\x2d\x49\x24\x62" + "\x66\x65\x06\x8b\x37\x84\xfe\x9c\x6d\xad\x7a\x5d\xc7\x2b\xfa\xdb" + "\xdb\x5b\xf5\x23\xa4\x6f\x32\x2f\x5e\xd0\x12\xf4\xf3\xa4\x59\x9f" + "\x04\xe0\x37\x19\xb4\x7d\x77\xac\xe3\xf1\x88\xd0\xf7\x53\x78\x45" + "\x1f\x4a\x67\xea\xc9\x7d\x56\x18\xdf\x56\x3d\x49\x79\x9a\xe0\x37" + "\x15\x6d\x78\x03\x51\x6f\x9b\x41\xfc\x2b\xe2\xea\x51\xfe\x08\xa9" + "\x68\x78\x9b\x2c\x7f\x92\xdc\x6e\x03\xd9\x1a\x6d\xfd\x15\x0d\x1b" + "\x09\x7e\xb3\x29\xbc\x46\x22\x0b\xae\x91\xf1\x34\x78\x84\x71\x52" + "\xbc\x8e\x08\x1b\x75\xe6\xea\xe4\x77\x49\x7a\x1b\x3d\x5b\xbd\x46" + "\x20\x68\xeb\x44\xfe\xa5\x83\x47\x18\x39\x0f\x57\xad\x3c\xa4\x3f" + "\x44\xbc\xe7\xe1\xaa\x54\x8f\x38\x5a\x64\xcd\xb7\xe9\xac\x71\xf6" + "\xe0\x7b\xcc\xfc\xfb\x5d\x58\x9c\xf0\xd6\x03\x35\xf8\x5d\xe6\xbd" + "\xfa\x26\x15\xfa\x22\xe1\xbe\x5c\x61\x67\xff\x22\xc5\xb7\xb0\x0e" + "\x91\x5e\x1d\x9c\x5e\xf8\x1d\xec\xc5\x16\x42\x67\xda\xd4\x20\xeb" + "\xe9\x07\xb2\xef\x60\x56\x13\x91\xf7\xe7\x86\x90\xad\x02\xff\x06" + "\x26\xac\x48\xe8\x2b\x00\x4d\x68\xa6\x9a\xec\xba\x66\xf5\xb5\x03" + "\x5d\x72\x70\xcf\xee\x2a\xd5\x00\xe0\xcd\x81\x42\x47\x48\x3f\x90" + "\x35\x23\x66\x9e\xcd\x10\xe3\x41\xf9\xb3\xa3\x6d\x85\x5e\x07\x6d" + "\x8f\xe8\xe8\xd0\xdf\x2e\xed\xef\x95\xfc\x01\x68\xd6\xfe\x6c\xdc" + "\xdb\x8b\x3a\x8b\x6d\x1d\xff\xc6\x02\x3c\xa1\x42\xdd\x04\xfa\x10" + "\x7a\x1f\xc8\x99\xf8\x4d\x0a\xfa\xa9\xdd\xda\x48\xfc\x2b\x13\x4e" + "\x31\xda\xd8\x45\x9a\xe0\x3e\x5f\xa4\xc3\xe4\xb9\x3a\x52\x55\x7c" + "\x82\xdc\x97\xec\xdf\x89\x0e\x1d\xdb\xad\x71\x12\x2d\x68\x56\x45" + "\x03\xac\x3d\x11\x17\x55\x35\x83\x0e\x01\xc6\x4e\x4f\xf4\x96\x26" + "\x35\x1e\xe3\x7f\xfc\x7c\x34\xd1\xfe\x9d\xd1\xa4\xaa\x8c\xd3\xe4" + "\xd8\xdb\xbd\xa3\xc9\xb1\x1d\x37\x9f\x26\xfe\x7f\x67\x34\xa9\x89" + "\xe1\x34\xf9\xf2\xc1\xde\xd1\xe4\x4b\xcf\xf9\xff\x84\x28\xf5\xd1" + "\x90\x5a\xf2\xfe\x30\xd0\xbd\xf3\x57\x46\x0b\xf9\xe9\xb5\xc2\x0b" + "\x21\x1a\x2e\xb3\x7c\xe3\xff\x79\x28\xc8\x0c\x4b\x9a\xd9\xff\x7c" + "\xbd\x1d\x57\x80\x7b\xd3\x8e\x96\xa1\x2c\xf1\x3a\x39\x32\x01\x65" + "\x87\xe3\x7d\xfb\xc7\x80\xdc\xf7\x42\x08\x69\x7b\x21\x46\xfd\xfa" + "\x29\xe2\x1f\x58\x4b\x26\x09\x02\xa5\xc6\xb4\x66\x58\xab\x6b\xa3" + "\x8d\xcf\x37\x13\x5d\x8a\x3f\xd4\xfd\xea\x03\x5d\xca\x2a\x3c\x6e" + "\xd4\xa5\x64\x7d\x0b\x47\xb6\x7f\x73\xe5\x69\xa2\xb6\x8d\x68\x2f" + "\xd9\xbd\xd0\x08\xeb\xdf\x70\xe3\xee\x8b\x56\x75\xce\x65\xa2\xa1" + "\xea\x3b\x68\xa0\x99\xf8\xe7\x82\x5c\x87\xdf\x3e\x0c\x7f\x40\xbf" + "\xb3\x13\x95\x68\x17\xde\x7f\xd1\xa8\xce\xc7\x3a\x23\x1e\xa8\xd9" + "\x39\xcc\xac\xc2\x75\x73\xf7\x42\xab\x5a\xe2\x23\xf4\x4f\x98\x69" + "\x21\x6a\x18\xcb\xfc\x2b\xdb\xad\x19\xd6\x8d\xa1\x31\xed\x83\x43" + "\x27\xda\x07\xdf\x63\xb6\xed\xea\x5f\xe4\x8e\xb7\xf0\xfb\x2b\xae" + "\x99\x03\x2c\x44\x3b\xc3\x20\xf3\x98\xb0\x82\xf3\x56\x95\xb5\x89" + "\xe0\xde\x87\x40\x58\x2b\x69\x47\x42\xdf\x17\xde\x01\xba\x8b\xfc" + "\x05\xeb\xb5\x67\xfe\xda\xac\xe4\xaf\x2b\x22\x7f\x01\x9f\x39\xf8" + "\x4b\x5e\x2b\xf7\x07\x70\xfe\x32\x39\xf8\x8b\xad\x95\x2b\xf4\xa1" + "\xc8\x63\x12\x7f\xe1\x3a\xc9\xf9\xab\xde\x23\x7f\x1d\xad\x73\xcf" + "\x5f\xb6\x30\x67\xfe\x3a\xd6\xc2\xf9\xeb\xc4\xe6\x43\xb1\xc0\x5f" + "\xb1\xde\xf2\xd7\x89\x02\xfe\x4d\x69\x68\x09\xb7\x6b\x7d\xf3\x11" + "\x2b\x83\x0c\x2c\xcb\xbf\x27\xec\xfc\x5b\x16\xc8\xbb\x83\x03\xac" + "\x74\x1d\xc8\xbc\xd0\x8f\x99\xbf\x22\xfe\x57\x06\x87\xe9\xae\x6c" + "\x0c\x1b\x69\x19\x1c\xa6\xe7\x6b\xf4\x57\x61\x87\x92\xa1\x1f\xc9" + "\xde\xf6\xe3\x2b\x1d\x7b\xee\x37\x31\xb7\xd0\x17\x62\x34\xc2\x37" + "\x31\xbe\x40\xe3\x90\x45\xf6\x0c\x72\x2d\x7f\x5c\x3e\xe8\x0a\x4d" + "\xba\x14\x72\x37\xf0\xdc\xaa\x23\xb0\x9a\x1f\x81\xb9\x54\x1d\x3d" + "\x9f\xd0\xf5\xe3\xb4\xef\x09\x66\x8d\x49\x75\x3c\x00\xf9\x10\x78" + "\x59\xe3\xcc\xcb\x9c\x6f\xf9\x35\x6b\xfe\xb8\x22\x6c\x6b\x6a\x39" + "\x09\xd4\x3d\x81\xfe\x31\xb5\x61\xcb\x57\x12\xdc\xf3\xe5\xdb\xa8" + "\xfa\xfa\x42\xdb\xfa\x7e\x5a\xb8\x7f\x20\xfd\x66\x9a\xca\xf0\x04" + "\xb9\x9d\xbe\x30\x4d\x85\x58\xf7\x6e\x5a\x81\x5a\x80\x73\xfc\xfb" + "\x7f\x01\xc1\xeb\x39\xed\x1a\xe6\x2b\x20\x40\x9d\x2a\x4b\x01\xc9" + "\x49\x02\xdd\x16\xfe\xe7\x3e\x25\x05\x04\xeb\xe7\x2e\xd1\xb2\xef" + "\x7d\xec\x3e\x5b\x01\xc1\x7b\xed\x70\xfe\x4f\x42\x00\xc9\x4b\x09" + "\x26\x47\xa2\xab\x58\x1b\x47\xa2\x3f\x23\xd8\x06\xca\x77\x47\xa2" + "\xf7\x93\xb5\x49\x21\xa4\xb2\xa5\x00\xae\x7f\x45\xd6\x5e\x0c\x85" + "\x63\x23\xfc\xae\x91\x66\xd5\xd7\xf9\x47\xa2\x05\x12\xb8\xea\x61" + "\x0a\xfc\x49\xab\x71\x1f\x51\x1a\xf1\x83\xbe\x6f\xae\xae\xcd\x27" + "\x30\x86\x19\xb8\xcf\x94\xa6\xbf\xd0\x22\xd0\x17\x2e\x08\xe9\x2f" + "\x5c\xc4\x67\xdb\xe9\x0b\x3f\xe2\xb3\x73\x53\x74\xa2\x8f\x59\x01" + "\xf3\x87\xc9\xb9\x36\x92\x60\x5f\xf1\xb9\xf8\xbc\xb5\x4b\xf4\xe2" + "\x33\xc3\x59\xdf\xf0\x99\xd8\xa6\xf3\x33\x31\x87\x33\xc8\xb4\xf0" + "\xcc\xda\x01\x70\x1c\x04\xf4\x58\x83\x74\xc0\xe7\x0b\x34\xc6\x97" + "\xa6\xc7\xf8\xb0\x7b\x92\x9b\xdc\xdd\xf3\x88\x78\x0f\xf7\x83\x81" + "\x7b\xda\x79\x7d\xd6\x06\x60\xcd\x8b\x78\xfe\x9e\x18\x23\xe9\x4c" + "\xc3\xda\x36\x8e\x3d\xb5\x87\x39\xf6\x70\x9a\x32\x5e\x79\x21\xc6" + "\x17\xe8\xa6\x45\x9c\x82\x36\xb6\x3b\xda\xf8\x26\xc6\x07\xe9\x8d" + "\x7c\x23\xf1\x12\xf2\x91\xc4\x43\xac\x9f\x06\x42\x9c\x79\x06\xfe" + "\xf7\x17\xdb\x39\x2f\xb5\x03\x7d\x10\xf1\xef\xb8\xff\x3d\x70\xbd" + "\x33\x1f\x9d\x3a\x20\xf3\xd1\xa9\x78\x6b\x1a\xa5\xc8\x47\xc6\xe7" + "\x33\xa1\x9d\x93\xf7\xcb\xfd\x99\xa6\x42\x1e\xfb\x1b\xe3\xad\x7c" + "\xa4\xd3\x3d\xa9\x24\x98\xbf\xcf\x29\x15\x7b\x9f\x54\x63\x30\xf6" + "\x55\x7a\x0f\xec\x43\x9e\xa0\x23\xd2\x7b\xac\x6d\x1f\x09\xed\x5e" + "\x24\xe2\x3d\x63\xb0\x6d\x69\x0c\x80\x66\x44\xba\x47\xaa\x9f\x27" + "\xe8\xa1\xdf\xe1\xec\x1e\xce\x73\x8d\x6e\xf8\xe7\xd4\x2a\x57\x9e" + "\xeb\x9f\x4a\x7c\x28\x8c\xb7\xf1\xf9\xcb\xf8\x9c\x2d\xbc\x6f\x9f" + "\xd8\xdb\xe1\x19\x40\x03\xb5\x78\xfe\x23\x27\x9e\x10\xdb\xb7\xba" + "\x6b\xff\xac\xa2\xfd\x18\x68\x3f\x19\xda\xc7\xb5\xf0\x79\xd4\x5b" + "\x4f\x31\x1c\xbc\x27\x99\xb7\x2f\xf1\x2d\xcd\xf7\xc3\xd8\xb1\x7d" + "\x9a\x55\xdf\x14\x71\x0c\xfd\xf2\x03\xac\xc7\x7c\x01\xd4\x42\x91" + "\xe0\xe2\x0b\xe0\xec\x2b\xf2\x7e\x9a\x59\xf4\x03\xf8\x86\xc5\xf7" + "\xda\xf5\x46\xad\x1a\xd7\x70\xd9\x0f\xe0\x14\x5e\x7b\xcd\x98\x54" + "\xef\xe4\x07\xf0\x4d\x2c\xd6\x35\xa9\xbe\xf9\xb0\x55\x4d\xd4\x50" + "\x36\xf0\xf3\x5f\x96\x38\x9f\x97\xfd\x6c\xf8\x79\xf4\x61\x44\x6b" + "\x7e\x6b\xd6\x37\x65\x92\x4d\xa2\x7b\x9d\xf7\xd6\x5f\xa0\xce\x1b" + "\xd2\x85\xce\x1b\xf2\x77\xa6\xf3\x9e\x5e\xdc\x3b\x9d\xf7\xb4\xe1" + "\xe6\xcb\xf2\x7f\x6f\xfa\xd5\x37\xb5\x5c\xd6\xfa\xd6\xb7\x77\xb2" + "\xfc\xb7\x1e\xf7\xff\xfd\x9f\x7e\xd5\x5b\x9a\x9c\x2e\xe5\x34\x31" + "\x6d\xee\x1d\x4d\x4c\x05\xbd\xd3\xaf\x9a\x12\x64\xfd\xaa\x29\xc1" + "\xb3\x7e\x75\x76\x6e\xd7\xfa\xd5\xb9\x12\x59\xbf\x6a\x18\xc4\x65" + "\x9c\xef\xae\x72\x19\xe7\xbb\x8f\xbc\xd7\xaf\xbe\x1b\xf5\x7f\xfa" + "\xd5\xf5\xd4\xaf\xbe\x9d\xc4\xf9\xab\xbe\xad\x77\xfa\x55\xbd\x55" + "\xa9\x5f\x9d\x1f\xdc\x59\xbf\xfa\xee\xc5\x9e\xeb\x57\xdf\xad\xea" + "\x9d\x7e\xf5\x5d\x46\xcf\xf4\xab\xef\xce\xba\xd7\xaf\xce\xce\xf7" + "\xac\x5f\xf1\x6b\x9d\xe5\xe2\x73\xab\x64\xb9\xf8\xdc\xe4\x5f\xbe" + "\x7e\xd5\x60\x76\x2f\x03\x37\xb4\x71\xfd\xea\x3b\xd3\xf5\xd7\xaf" + "\xbe\x33\xb9\xd7\xaf\xce\x2d\xe0\xb2\xe8\x77\x0d\x9d\xf5\x2b\xb8" + "\xc7\xad\x7e\x75\x6e\xbb\x78\x8f\x49\xa9\x5f\xf1\x36\x00\x6b\xf6" + "\x79\xd6\xaf\x1a\x9f\xe3\xd8\xd3\xf8\x2b\x8e\x3d\x9c\xa6\x9d\xf5" + "\xab\x46\x55\xf7\xfa\x15\xe7\x21\xd6\x4f\x8f\xfa\x55\xe3\x93\x9d" + "\xf5\xab\xb3\x09\xee\xf5\xab\x26\x27\x3d\xfd\xfb\x03\x4a\xfd\xaa" + "\x71\xdd\xdf\x86\x7e\xe5\x91\xb7\xcc\x4a\xfd\xea\xfb\x78\xef\xf5" + "\xab\xef\x37\x7a\xa7\x5f\x21\xcf\xb9\xd3\xaf\xbe\x3f\xeb\xca\x73" + "\x4a\xfd\xea\x7b\xbb\x7b\xfd\xaa\x69\xb0\x52\xbf\xc2\xf6\xdd\xe9" + "\x57\x4d\x8f\x28\xda\xef\xa4\x5f\x35\xbd\xa8\xd4\xaf\x78\x3d\x59" + "\xbf\x3a\x4f\x38\x86\x9e\x1d\xe4\xbd\x7e\xd5\x74\xd6\xb3\x7e\xd5" + "\x74\x5e\xa9\x5f\x35\xed\xe5\x7a\xd4\xf9\x60\xae\x5f\x35\xd5\xf0" + "\xf3\x67\xb5\xce\xe7\x65\xfd\x8a\x9f\x97\xf5\xab\xf3\x23\x7b\xae" + "\x5f\x05\xfe\x02\xf5\x2b\x6d\x17\xfa\x95\xf6\xef\x4c\xbf\x6a\x3e" + "\xd6\x3b\xfd\xaa\xd9\x63\xfc\xcf\xff\x93\xe5\x7b\x2b\xcb\x9f\x8f" + "\xe4\xb2\x56\xcb\x9c\xde\xc9\xf2\x2d\xb3\x7b\x27\xcb\x5b\x46\xcb" + "\xb2\xbc\x65\xb4\x67\x59\xfe\xc2\x98\xae\x65\xf9\x4b\xa9\xb2\x2c" + "\xff\xe3\x69\xbe\x9e\xfe\x78\x80\xaf\xa7\x3f\xae\xf2\x5e\x96\xbf" + "\xd8\xf6\xff\xd9\xfb\xfe\xb8\x28\xae\x73\xfd\xc3\x0c\x2a\x2c\xbf" + "\x16\x03\x16\x0d\xb1\x8b\xd1\x74\x35\x18\xd1\xaa\x41\xaf\x36\x68" + "\xb5\x31\x29\x2a\xa6\x9a\x62\xfc\x11\x30\x68\x20\x41\x45\x45\x45" + "\x45\x40\xab\xbd\x6a\x14\x21\x01\x2e\x46\x14\x4c\xf5\x16\x5b\x4d" + "\x48\xbf\xda\x62\xab\xc9\xda\x68\x8b\x29\x02\xa6\x9a\x62\x82\x71" + "\x25\x68\xd0\xa0\xae\xba\xca\x02\xbb\x3b\xdf\xf7\xcc\x99\x75\x76" + "\x76\x67\x96\x9d\x5d\x24\xe8\xf5\x8f\xf9\xc0\xce\x9c\x39\x73\xce" + "\xfb\x3e\xe7\x3d\xcf\x73\x66\xe6\x9d\xc7\x5c\xbe\x23\xb9\xfc\xf7" + "\x21\x04\x5f\x37\x4e\xba\xc6\xe5\x6f\x9c\x10\x72\x79\xfd\x25\x7b" + "\x2e\x7f\x73\xa0\xf3\x5c\xfe\xe6\x64\xd7\xb8\xfc\xcd\x68\xe7\xb8" + "\xfc\xcd\x83\xe2\x5c\xfe\x7a\xa4\x34\x97\x27\xc7\xec\x39\xd8\xad" + "\xc9\x3c\x07\xbb\xd5\xbb\xeb\x73\x79\xdd\x51\x71\xbe\xa5\x3b\x49" + "\xb8\xfc\xcd\x03\x1d\xcf\xe5\x6f\x1e\x10\xe7\xf2\xb7\x46\x11\xde" + "\x73\xb3\xcc\x9e\xcb\xc3\x39\xa2\x5c\xfe\x16\xc7\xff\x6f\x1e\x10" + "\x72\x79\x52\x07\xc4\x9a\xcd\xd2\x5c\xfe\xf6\x00\x12\x7b\x6e\x71" + "\xeb\x08\xc4\xa7\xf6\x5c\xfe\xd6\xe9\xf6\xb9\x3c\xc1\x10\xdb\x4e" + "\x49\x2e\x7f\x3b\xd8\x9e\xcb\x5f\x1f\x2e\xce\xe5\xef\x5c\xe7\x71" + "\x74\x67\x9b\x90\xcb\xdf\x9e\xf3\x70\x70\x79\x49\x6c\x1d\x15\x72" + "\xf9\x3b\x83\xe5\x73\xf9\x3b\xf1\xf2\xb8\x3c\xc6\x9c\x18\x97\xbf" + "\x73\xd0\x16\x73\x42\x2e\x7f\xe7\x94\x38\x97\xbf\x73\x49\xc8\xe5" + "\x71\xfd\x62\x5c\x5e\xef\x27\xa8\xdf\x8e\xcb\xeb\x07\x0a\xb9\x3c" + "\x29\xc7\x73\x79\x7d\x25\x89\xa1\x4d\x17\xe4\x73\x79\xfd\x41\x69" + "\x2e\xaf\x3f\x2c\xe4\xf2\xfa\x4d\x84\xb3\xeb\xb5\x84\xcb\xeb\x8b" + "\xc8\xfe\xa6\x3a\xeb\xfd\x3c\x97\x27\xfb\x79\x2e\xaf\xd7\x39\xcf" + "\xe5\x7b\x74\x41\x2e\xef\xe5\x80\xcb\x7b\x3d\x62\x5c\xfe\xde\x2e" + "\xd7\xb8\xfc\xbd\x22\xd7\x78\xa3\x39\x99\xe7\x8d\xe6\x64\x69\xde" + "\xd8\xbc\xd0\x31\x6f\x6c\x3b\xc4\xf3\xc6\xd6\x60\x12\xbb\x5b\x5a" + "\x48\xec\x6e\x39\x22\x9f\x37\xb6\x0c\x7d\xcc\x1b\x3b\x92\x37\xde" + "\xf5\x24\xbc\xd1\x60\x72\x8d\x37\x1a\x8c\x42\xde\xc8\xf4\xb6\xe7" + "\x8d\x2d\xf1\xce\xf3\xc6\x96\x8d\xae\xf1\xc6\x96\x0d\xce\xf1\xc6" + "\x96\xcb\xe2\xbc\xb1\x39\x45\x9a\x37\x92\x63\xf6\xf3\x7d\xdb\x46" + "\x7e\xbe\x6f\x9b\xd6\xf5\x79\x63\xab\x5e\x7c\x6e\x6f\x35\x11\xde" + "\xd8\xd2\xd0\xf1\xbc\xb1\xa5\x41\x9c\x37\xb6\x2d\x21\x73\x6c\x4b" + "\xa3\x3d\x6f\x84\x73\x44\x79\x63\xdb\x3e\xee\x9c\x06\x21\x6f\x24" + "\x75\x40\xac\x39\x2e\xcd\x1b\x8d\x73\x48\xec\x31\x0e\x26\xb1\x87" + "\xf8\xd4\x9e\x37\x1a\xbb\xb5\xcf\x1b\x09\x86\xd8\x76\x4a\xf2\x46" + "\xe3\x64\x7b\xde\xd8\x9c\x2c\xce\x1b\xcd\x03\x78\x1c\x99\x4e\x0a" + "\x79\xa3\x31\xff\xe1\xe0\x8d\x92\xd8\xd2\x0b\x79\xa3\x69\xbe\x7c" + "\xde\x68\xda\x21\x8f\x37\x62\xcc\x89\xf1\x46\xd3\x65\x5b\xcc\x09" + "\x79\xa3\xd9\x43\x9c\x37\x9a\x7b\x0b\x79\x23\xae\x5f\x8c\x37\x9a" + "\x27\x0a\xea\xb7\xe3\x8d\xe6\x78\x21\x6f\x24\xe5\x78\xde\xc8\x78" + "\x92\x18\xda\x1c\x2c\x9f\x37\x9a\x2f\x4b\xf3\x46\xf3\x75\x21\x6f" + "\x34\x6b\x08\x3f\x64\x42\x08\x6f\x34\x9f\x25\xfb\x9b\x83\xac\xf7" + "\xf3\xbc\x91\xec\xe7\x79\x23\xa3\x76\xc4\x1b\x1d\xf2\x0a\xaa\x7b" + "\xed\x7d\x5e\x01\xff\x5b\xf3\x8a\x53\x02\x5e\xc1\x9c\x74\xc8\x2b" + "\x28\x4f\xd5\x7d\x5e\x41\x51\xeb\xd8\xb1\x4d\x51\xf3\xd9\xb1\x4d" + "\x51\x03\x58\x5e\x31\x19\xe6\x7f\xe0\x15\x07\xaf\x95\x11\x5e\x71" + "\xcd\x40\xbd\x73\x83\xe3\x15\x4d\xc8\x6b\xeb\x22\x8e\x57\xcc\x05" + "\x5e\x41\x79\xec\xc2\xbc\xc2\xb7\x08\x78\xad\xe5\x9b\x66\x29\xc0" + "\x73\x1b\xe0\x37\x8c\x9b\x4f\xa0\x8e\x2a\xe0\xa2\x39\xf8\x7c\x9c" + "\x43\x0c\xea\xc2\xe3\x09\xf3\xdd\x83\xab\xb5\xdd\xd8\x6f\x67\x02" + "\xe7\x30\x03\xf7\xc0\xbc\x83\xe5\x17\x77\x38\x7e\x71\x87\x5f\xf3" + "\xc4\x79\xc4\xd2\x1b\x18\xb3\x69\x99\xba\xe7\xd4\x04\x80\xde\x5d" + "\x8c\x5f\x28\x8c\xdf\xc5\xd6\x35\x22\x66\x99\xda\xbf\x68\x29\x0a" + "\xda\x89\x79\x46\x23\x52\xfa\xaf\xf3\xf0\x67\xee\x24\x7a\xfb\xeb" + "\x09\x97\x3d\x68\xae\x20\x5c\x76\x59\x88\x02\x38\x52\xf8\xee\xdb" + "\x3c\xbf\x78\x0f\x73\x8b\x65\x6a\x95\x7e\x99\xba\xef\x9d\x3b\xc0" + "\x65\x75\x1c\xb7\x48\x02\x6e\xc1\xae\x79\x1e\x9d\x5e\x7c\x1b\x73" + "\x59\xb2\xe6\xc9\xe6\x1b\x7b\x53\x8d\x70\xee\x42\xbc\xf6\xf9\x1c" + "\x70\xd9\xcc\xd3\x48\xf9\x93\x50\x88\xf9\x77\xd4\xa1\x99\x13\x51" + "\xdf\xea\x72\x13\xd8\xe8\x2e\xbb\x0e\x8a\xf3\x5a\x55\xc6\x7d\x85" + "\x70\xce\x26\x96\xcf\x52\x4c\x19\xd4\x17\xa9\x5b\xa6\xa6\xde\x5f" + "\x6a\xc5\x65\x83\x31\x97\x1d\x2d\xcd\x65\x29\x8f\x24\x97\xb8\x2c" + "\xe5\x91\x28\xe0\x1a\x54\x8f\x8d\x76\x5c\x83\xf2\x38\xed\x34\xd7" + "\xa0\x3c\x6e\xb9\xc4\x35\x28\x0f\x9d\x53\x5c\x83\xa2\xa6\xd9\x72" + "\x8d\xfd\x2c\xd7\x60\x2a\x30\x36\xc5\xb9\x06\x39\x66\x37\x47\x50" + "\xf4\xad\xfb\x73\x04\x45\x1f\xeb\xf2\x5c\x83\xa2\xe3\x44\xe7\x03" + "\x8a\x4e\x62\xb9\x06\x45\xc5\x74\x38\xd7\x80\x3a\x45\xb9\x06\x45" + "\x5f\x60\xe3\x32\x45\x4d\xb7\xe3\x1a\xf8\x1c\x31\xae\x41\x79\x06" + "\x72\xe7\xc4\x08\xb8\x06\x57\x07\xc4\x9f\xc1\x92\x5c\x83\xf2\x3c" + "\x45\xe2\x91\xe7\x0e\xc2\x35\x88\x4f\xed\xb8\x06\xe5\xb9\xa4\x5d" + "\xae\xc1\x61\x88\x6d\xa7\x14\xd7\xa0\x3c\x8f\xd8\x73\x0d\xe6\x84" + "\x28\xd7\xa0\xba\xe7\xf2\x38\xea\x3e\x54\xc0\x35\xa8\x6e\x1e\x0f" + "\x05\xd7\x90\xc6\x56\x9c\x80\x6b\x50\xdd\xce\xc8\xe6\x1a\x54\xf7" + "\x6e\xb2\xb8\x06\x8b\x39\x11\xae\x41\x75\x9f\x66\x8b\x39\x01\xd7" + "\xa0\xba\x2f\x14\xe5\x1a\x54\xf7\x8d\x02\xae\xc1\xd6\x2f\xc2\x35" + "\xa8\xee\x1f\x0b\xea\xb7\xe5\x1a\x54\xf7\xd3\x02\xae\xc1\x95\xbb" + "\xcf\x35\xa8\x1e\x29\x9c\x5e\x5b\x28\x9b\x6b\x50\x3d\xa6\x49\x72" + "\x0d\xaa\xc7\x4c\x01\xd7\xa0\x7a\xb0\xdf\xbb\xd2\x52\x3d\x36\xb0" + "\x5c\x83\xea\x11\x45\xb8\x06\x93\x6c\xbd\x9f\xe7\x1a\x64\xff\x7d" + "\xae\xb1\xa5\x47\x9e\xf3\x6b\x54\x8f\xdf\x61\xfd\x41\xd7\xa8\x28" + "\xef\x71\xae\xcd\xeb\xde\x51\x3f\xfc\xfd\xe6\x47\xec\x1d\xd6\x2d" + "\x3d\x4a\xd9\x75\x1d\x4a\x71\xce\xa5\xfb\xcd\x94\xe2\xec\x0f\xef" + "\x93\x47\xec\x19\xeb\x2d\xde\x9b\x88\x4f\x7c\x93\x5c\xf3\x89\x6f" + "\xe2\x0f\xef\x93\x47\xec\xb9\x8c\x2d\x3e\xa1\xc4\x27\x7e\x26\xd7" + "\x7c\xe2\x67\x74\x69\x7d\x9d\x0a\x6e\xe4\x75\x70\x70\xa3\xa4\x0e" + "\xa6\xfc\x4f\x3b\xd6\xc1\x4f\x44\xf0\x3a\x38\x30\x97\xf0\xce\xc0" + "\xe5\x44\x07\x07\x8e\xc0\xf5\x66\x60\x1d\xfc\xc1\x48\xcd\x47\x4b" + "\xcb\x29\xe6\x83\x96\x98\x03\xb7\x0d\xd4\xb6\xd5\xc8\xd3\x88\x75" + "\x30\xd8\x7f\x5b\x2b\xd6\xc1\x27\x10\xfb\xed\x04\x4a\x79\xb0\xaa" + "\xc1\x80\x98\x3c\x3f\xf2\x3c\x1a\x15\xf0\x14\xe0\x84\xae\x36\x18" + "\xd8\x32\xf8\xd8\x27\xb7\xcb\xa9\x9c\x56\x9b\xb5\xf7\xa5\x06\x0a" + "\xe7\x79\xb6\x5e\x7b\x37\xe5\x3f\xab\xc3\x6b\xef\x2d\x7b\x0c\x39" + "\xf7\xd7\xdf\x07\x3b\x5e\x7b\xdf\xd5\x0a\x73\xa5\xc8\xfa\x3b\x5e" + "\x7b\xdf\xb5\xe2\x11\x5b\x7b\xdf\xe2\x5b\x46\xb0\xa7\x5c\xe5\xd2" + "\xda\x3b\xa5\x4c\x13\xea\xe1\x5e\xf9\xf6\x7a\x58\x79\xc1\x79\x3d" + "\x1c\xe8\xe1\x9a\x1e\xc6\x8f\x2c\x3a\xa3\x87\x03\xe3\x45\xf5\x30" + "\xe5\x5f\x93\x21\xa5\x87\xb9\x63\xf6\x3a\xe6\x09\x0f\x5e\xc7\xf4" + "\x3c\xdd\xf5\xf5\x70\xcf\x14\x71\xcd\xd2\x73\x15\xd1\xc3\x81\x71" + "\x1d\xaf\x87\x03\xe3\xc4\xf5\x70\xcf\xeb\x44\x3b\x04\x26\xd8\xeb" + "\x61\x38\x47\x54\x0f\x3f\x11\xc6\x9d\x13\x27\xd4\xc3\xa4\x0e\x88" + "\x43\x63\xa5\xf5\xf0\x13\xe7\x49\x5c\x7a\x62\x3f\x89\x4b\xc4\xa7" + "\xf6\x7a\xf8\x89\x75\xed\xeb\x61\x82\x21\xb6\x9d\x92\x7a\xf8\x89" + "\x53\x76\x7a\x98\xf2\xaf\x14\xd7\xc3\xc1\x7b\x78\x1c\x05\x8f\x13" + "\xea\xe1\xa0\xc0\x87\x43\x0f\x4b\x62\x2b\x45\xa8\x87\x83\x2e\xc9" + "\xd7\xc3\xc1\xc1\xf2\xf4\x30\xc6\x9c\x98\x1e\x0e\x8e\xb7\xc5\x9c" + "\x50\x0f\x07\xaf\x15\xd7\xc3\xc1\xf9\x42\x3d\x8c\xeb\x17\xd3\xc3" + "\xc1\xc7\x05\xf5\xdb\xe9\xe1\xe0\x0b\x42\x3d\x4c\xca\xf1\x7a\xb8" + "\x57\x16\x89\xa1\xfe\xcb\xe5\xeb\xe1\x5e\xf1\xd2\x7a\xb8\x57\x92" + "\x50\x0f\xf7\x1a\x43\x74\x6f\xaf\x3c\xa2\x87\x7b\xc5\x90\xfd\xfe" + "\xa9\xd6\xfb\xef\xeb\x61\x6e\x3f\xaf\x87\x7b\xed\x7d\xfc\x7e\xeb" + "\xc3\xa2\x87\x43\xa6\xb9\xa6\x87\x43\x62\x7e\x78\x9e\xff\xa8\x69" + "\xaf\x5e\xe4\x5d\x4a\xaa\xf7\x65\xd7\x78\x7e\x6f\xe9\xfc\x8f\x8f" + "\xb5\x97\x8b\x3e\x09\x29\x24\x3e\x79\x72\x95\x6b\x3e\x79\x32\xcd" + "\x35\xed\xf5\x74\x02\xaf\xbd\x9e\x4e\x90\xd6\x5e\xa1\x2f\x39\xd6" + "\x5e\xaa\x03\xbc\xf6\xfa\xb1\x1f\xe1\x38\x7d\x6f\x11\x8e\xd3\xf7" + "\x63\xf9\xda\xab\xef\x40\xa1\xf6\x0a\xdd\xf1\x58\x7b\x3d\x28\xed" + "\xd5\x27\x9c\x60\xef\xa9\xbb\xae\x69\xaf\xa7\xf4\x42\xed\xd5\x3f" + "\xd0\x5e\x7b\xf5\x9d\xe9\xbc\xf6\xea\xbb\xd6\x35\xed\xd5\x37\xdd" + "\x39\xed\xd5\xf7\x82\xb8\xf6\x0a\x8d\x96\xd6\x5e\xe4\x98\x3d\x67" + "\x56\xad\xe5\x39\xb3\xea\xa5\xae\xaf\xbd\x7e\xdc\x24\xce\x8f\x7f" + "\x7c\x97\x68\xaf\xbe\x75\x1d\xaf\xbd\xfa\xd6\x89\x6b\x2f\x55\x12" + "\xe1\xa9\x7d\xb5\xf6\xda\x0b\xce\x11\xd5\x5e\xaa\x5d\xdc\x39\x75" + "\x42\xed\x45\xea\x80\x38\x74\x44\x5a\x7b\x85\xcd\x20\x71\x29\x6c" + "\x00\x89\x4b\xc4\xa7\xf6\xda\x4b\x65\x6a\x5f\x7b\x11\x0c\xb1\xed" + "\x94\xd4\x5e\x61\x13\xed\xb5\x57\xe8\x24\x71\xed\xf5\xf4\x53\x3c" + "\x8e\xfa\x1d\x13\x6a\xaf\xb0\x6d\x0f\x87\xf6\x92\xc4\x56\x93\x50" + "\x7b\xf5\x9b\x23\x5f\x7b\xf5\xcb\x95\xa7\xbd\x30\xe6\xc4\xb4\x57" + "\xbf\x0b\xb6\x98\x13\x6a\xaf\x7e\x2d\xe2\xda\xeb\xe9\x40\xa1\xf6" + "\xc2\xf5\x8b\x69\xaf\xa7\xc7\x0a\xea\xb7\xd3\x5e\x4f\xcf\x14\x6a" + "\x2f\x52\x8e\xd7\x5e\x4f\x1b\x49\x0c\x7d\xf2\x96\x7c\xed\xf5\xf4" + "\x05\x69\xed\xf5\xf4\x65\xa1\xf6\x7a\xba\x9c\x68\xac\xfe\x4a\xa2" + "\xbd\x9e\xae\x24\xfb\x9f\xd4\x59\xef\xe7\xb5\x17\xd9\xcf\x6b\xaf" + "\xfe\xaa\xc7\xef\xbe\x3e\x2c\xda\x6b\xc0\x69\xd7\xb4\xd7\x80\xca" + "\xc7\x3c\xbf\xa3\x79\x7e\xff\xe1\x84\x6b\xfd\x24\xde\x35\x9e\xff" + "\x93\x38\xd7\x78\xfe\x90\x68\x9e\xe7\x0f\x89\x96\xe6\xf9\xea\xa1" + "\x8e\x79\x7e\x78\x1e\xcf\xf3\x07\xdd\x25\xf3\xe9\xa0\xf3\x64\x3e" + "\x1d\xb4\x43\x3e\xcf\x1f\x14\x28\xe4\xf9\xea\x75\x8f\x79\xfe\x83" + "\xe2\xf9\xcf\x04\x11\xec\x0d\xbc\xe0\x1a\xcf\x1f\x58\x27\xe4\xf9" + "\x43\x5a\xec\x79\xfe\xa0\x71\xce\xf3\xfc\x41\xf3\x5d\xe3\xf9\x83" + "\x12\x9c\xe3\xf9\x83\x4e\x8a\xf3\x7c\xf5\x70\x69\x9e\x4f\x8e\xd9" + "\xf3\xb3\xf0\xf9\x3c\x3f\x0b\x1f\xda\xf5\x79\xfe\xb3\x67\xc5\xb9" + "\xd8\xb3\x17\x08\xcf\x1f\x74\xa2\xe3\x79\xfe\xa0\x13\xe2\x3c\x3f" + "\x9c\x7b\xfe\x6b\x50\x85\x3d\xcf\x87\x73\x44\x79\x7e\xf8\x46\xee" + "\x9c\x13\x42\x9e\x4f\xea\x80\x38\xb4\x47\x9a\xe7\x0f\x1e\x4b\xe2" + "\xd2\x60\x3f\x12\x97\x88\x4f\xed\x79\x7e\xf8\xe5\xf6\x79\x3e\xc1" + "\x10\xdb\x4e\x49\x9e\x3f\x78\xb0\x3d\xcf\x57\x47\x88\xf3\xfc\x21" + "\xdd\x78\x1c\x3d\xb7\x4f\xc8\xf3\x07\x2f\x7f\x38\x78\xbe\x24\xb6" + "\xce\x0a\x79\xfe\x73\x13\xe5\xf3\xfc\xe7\x56\xc9\xe3\xf9\x18\x73" + "\x62\x3c\xff\xb9\x93\xb6\x98\x13\xf2\xfc\xe7\x2e\x89\xf3\xfc\xe7" + "\x5a\x84\x3c\x1f\xd7\x2f\xc6\xf3\x87\x0c\x10\xd4\x6f\xc7\xf3\x87" + "\x8c\x13\xf2\x7c\x52\x8e\xe7\xf9\x43\x1a\x48\x0c\xfd\xc9\x79\xf9" + "\x3c\x7f\xc8\x49\x69\x9e\x3f\xe4\xb4\x90\xe7\x0f\x29\x21\x7c\x7e" + "\x88\x81\xf0\xfc\x21\x87\xc8\xfe\x9f\xd4\x5a\xef\xe7\x79\x3e\xd9" + "\xcf\xf3\xfc\x08\xaf\xc7\xef\xc5\x3e\x2c\x3c\x7f\xe8\x61\xd7\x78" + "\xfe\xd0\x43\xae\x71\xca\x51\x25\x3c\xa7\x1c\x55\x22\xcd\x29\x87" + "\x6d\x74\xcc\x29\x47\x36\xf2\x9c\x72\xc4\x4b\x24\x76\x8f\x20\xef" + "\xa6\x51\xc3\xaf\xcb\xe7\x94\xc3\xe7\x0b\x39\xe5\xb0\x73\x8f\x39" + "\xe5\x83\xe2\x94\x11\xdc\x33\x63\xc3\x87\xba\xc6\x29\x87\x47\x08" + "\x39\xe5\xe8\xc9\xf6\x9c\x72\x78\xbe\xf3\x9c\x72\xf8\x11\xd7\x38" + "\xe5\xf0\x72\xe7\x38\xe5\x88\xde\xe2\x9c\x72\xd8\x26\x69\x4e\x49" + "\x8e\xd9\x73\x81\x91\x47\x78\x2e\x30\x72\x63\xd7\xe7\x94\x23\xd5" + "\xe2\xf3\xfe\xc8\xa1\x84\x53\x8e\x08\xe9\x78\x4e\x39\x22\x44\x9c" + "\x53\x8e\x24\xef\xbf\x52\x23\x42\xed\x39\x25\x9c\x23\xca\x29\x47" + "\x9e\xe7\xce\x09\x11\x72\x4a\x52\x07\xc4\xa1\xbb\xd2\x9c\xf2\x79" + "\xee\x79\xc2\xe7\xe3\x49\x5c\x22\x3e\xb5\xe7\x94\xcf\x8f\x6a\x9f" + "\x53\x12\x0c\xb1\xed\x94\xe4\x94\xcf\xaf\xb3\xe7\x94\xc3\x36\x88" + "\x73\xca\x51\x33\x79\x1c\x45\xb6\x08\x39\xe5\xf3\xa7\x1e\x0e\x4e" + "\x29\x89\x2d\xb5\x90\x53\x46\xee\x90\xcf\x29\x23\x4f\xcb\xe3\x94" + "\x18\x73\x62\x9c\x72\x54\x6f\x5b\xcc\x09\x39\xe5\xa8\x11\xe2\x9c" + "\x72\xd4\x64\x21\xa7\xc4\xf5\x8b\x71\xca\x51\xab\x04\xf5\xdb\x71" + "\xca\x51\xf9\x42\x4e\x49\xca\xf1\x9c\x72\x74\x24\x37\xdf\x0d\x96" + "\xcf\x29\x47\xf7\x96\xe6\x94\xa3\xc3\x84\x9c\x72\x94\x9e\x70\xc7" + "\xd1\xd1\x84\x53\x8e\xe6\xf6\x0f\x0b\xb7\xde\xcf\x73\x4a\xb2\x9f" + "\xe7\x94\xa3\x67\xbb\xfe\xce\xec\x78\x35\xcf\x39\xc6\xab\xa5\x39" + "\xc7\xe8\x16\xc7\x9c\xe3\x85\x14\x9e\x73\x8c\x3d\x43\xc6\xf6\xd8" + "\xc3\x64\x6c\x8f\x65\x75\xd8\xda\xd3\xf8\x9d\xd9\x91\x9a\x0f\x6f" + "\x94\xb1\x9c\xe3\xa3\x45\x06\x0a\xb8\xa1\xa7\x19\x73\x0e\xe0\x80" + "\x5b\x57\x60\xce\xd1\xc0\xbd\x33\x3b\xe6\xfa\xe9\x34\x6b\xce\xf1" + "\x5f\x93\xd9\xf7\x67\x31\xef\xd0\x1b\xd8\x72\xf8\xb8\xd8\xfb\xb4" + "\xc7\x16\x71\xef\xd3\x42\xdd\xd6\xef\xd1\xb2\xef\xd6\xde\x00\x4e" + "\x32\x0f\x7c\x61\xc5\x49\x1e\xbf\x4f\xeb\xe8\x7d\xda\x31\x47\x5c" + "\xe3\xc0\x63\xca\x85\x3c\x64\xfc\x39\x7b\x1e\x32\xf6\x29\xe7\x79" + "\xc8\xd8\x71\xae\xf1\x90\xb1\x51\xce\xf1\x90\xb1\x7b\xc4\x79\xc8" + "\x68\x23\xc6\xad\x38\x0f\x21\xc7\xec\xe7\x8f\x17\xc6\xf1\xf3\xc7" + "\x0b\x7e\x5d\x9f\x87\xfc\xac\x4c\x7c\xae\xf8\xd9\x11\xc2\x43\xc6" + "\x96\x74\x3c\x0f\x19\x5b\x22\xce\x43\x5e\x18\x4c\x62\xf6\xd8\xbd" + "\xf6\x3c\x04\xce\x11\xe5\x21\x2f\x70\xcf\x7f\x8e\x2d\x11\xf2\x10" + "\x52\x07\xc4\xa6\xb5\xd2\x3c\x24\xaa\x37\x89\x55\x2f\x5c\x25\xb1" + "\x8a\xf8\xd4\x9e\x87\xbc\x70\xbc\x7d\x1e\x42\x30\xc4\xb6\x53\x92" + "\x87\x44\x79\xdb\xf3\x90\xd1\x06\x71\x1e\x32\xee\x12\x8f\xa3\x71" + "\xeb\x84\x3c\x24\x6a\xda\xc3\xc1\x43\x24\xb1\x55\x26\xe4\x21\xe3" + "\xc2\xe4\xf3\x90\x71\x33\xe4\xf1\x10\x8c\x39\x31\x1e\x32\x6e\x8f" + "\x2d\xe6\x84\x3c\x64\xdc\x31\x71\x1e\x32\xee\x9c\x90\x87\xe0\xfa" + "\xc5\x78\xc8\x78\x0f\x41\xfd\x76\x3c\x64\xfc\x53\x42\x1e\x42\xca" + "\xf1\x3c\x64\xbc\x86\xd3\x72\x7b\xe4\xf3\x90\xf1\x7b\xa4\x79\xc8" + "\xf8\xfd\x42\x1e\x32\x3e\x9d\xf0\x8d\xf1\x67\x09\x0f\x19\x9f\xc3" + "\x71\x99\x12\xeb\xfd\x3c\x0f\x21\xfb\x79\x1e\x32\xbe\xc1\xc9\xb5" + "\x2d\xbd\x9c\xf7\x69\x0f\xde\x13\xae\x6d\x59\xd6\xb5\x8c\xe1\x3e" + "\x7b\xef\xaf\x6d\x59\xdf\x13\x15\x59\xdb\xc2\xf3\x39\xbf\xb6\x75" + "\x81\x8d\x53\xfc\xda\x96\x96\x5d\xdb\xc2\xeb\x5a\xf8\xbe\xa8\x65" + "\x5d\xcb\xbc\xd2\xfe\x5d\xda\x83\x66\xf9\xeb\x5a\xfc\xbd\x51\x4d" + "\x25\x59\xd7\xaa\xbd\xbf\xae\x85\xe7\x72\x53\xb3\xfd\xba\x16\x9e" + "\xc3\xf9\x75\xad\xaf\x3a\x78\x5d\x6b\xc2\x36\xd7\xe6\xf4\x09\xd2" + "\xdf\xff\x7e\xfc\x2e\xad\x8b\xf7\xaf\xc7\x1b\xc8\x7a\xcf\x2f\xc2" + "\x5c\xbb\x7f\xfd\x0b\xd5\x0f\xef\x93\x47\xed\x79\xee\x09\x67\x89" + "\x4f\x5e\x3c\xec\x9a\x4f\x5e\x94\x5c\xff\x7d\xfc\x9c\x87\xab\x3e" + "\xf9\x45\x22\xf1\xc9\x4b\x2f\xb9\xe6\x93\x97\x26\xb9\xb6\x26\x3f" + "\x2d\x96\xd7\xc7\xd3\x62\xad\xf5\x71\xc5\x04\x6b\x7d\xfc\x72\x6f" + "\xc7\xfa\x78\x4a\x09\xaf\x8f\x27\x7b\x10\xce\x19\x7d\x99\x70\xce" + "\xe8\x7d\xac\x3e\x1e\x87\x58\x5d\x6c\xc4\x1a\xf9\x2d\x03\xf5\xe1" + "\x35\x0d\x65\x5c\x4f\xb4\x71\xb5\xb1\x12\x9d\xd6\x19\xd0\x3b\x2b" + "\x90\xe7\xe6\x1b\xc8\xf3\x0f\xb7\x0d\x54\x40\x32\xf2\x82\x39\x08" + "\xec\x55\x09\x9c\x65\x17\x4a\xc9\xc0\xba\x39\xfa\xa9\xea\x14\x9d" + "\x95\x6e\x7e\x79\x1d\xaf\x99\xa1\x5c\x8a\x01\x7d\xfa\x96\x86\xc2" + "\xda\xb8\x2d\xff\x59\x5d\xdb\x60\x9f\x12\x36\xef\x94\xf5\xba\x3d" + "\x5c\x5b\x35\x57\xb8\x6e\xdf\x9a\xff\xac\xbe\xe5\xa0\xcf\x5e\x36" + "\xdf\x65\x18\xbf\x76\x2f\x27\xd7\xe5\xce\x56\x14\x64\x59\xb7\xdf" + "\xf9\xc8\xad\xdb\xbf\x68\x24\xf8\xfc\xe5\x55\xd7\xd6\xed\x7f\xd9" + "\x28\xd4\xcb\xaf\x74\xb3\xd7\xcb\xd1\x93\x9d\xd7\xcb\xd1\x4b\x5c" + "\xd3\xcb\xd1\x29\xce\xe9\xe5\xe8\x33\xb6\x7a\xb9\x34\x03\xeb\xe5" + "\x97\x43\x31\x8e\xc5\xf5\x32\x39\x66\xaf\x73\xa6\x2c\xe1\x75\xce" + "\x94\xb1\x5d\x5f\x2f\x4f\xd6\x8a\x6b\x9a\xc9\x57\x89\x5e\x8e\xae" + "\xe9\x78\xbd\x1c\x5d\x23\xae\x97\xa7\xcc\x21\xda\x22\xba\xc6\xa2" + "\x7d\x79\xbd\x0c\xe7\x88\xea\xe5\x29\xb9\xb6\xe7\x10\xbd\x1c\x7d" + "\x96\xe8\xe5\x29\x07\xa5\xf5\xf2\x54\xee\x7e\xe2\xd4\xde\x24\x76" + "\x11\x9f\xda\xeb\xe5\x29\xb7\xda\xd7\xcb\x04\x43\x6c\x3b\x25\xf5" + "\xf2\xd4\x51\xf6\x7a\xf9\xe5\x10\x71\xbd\x3c\x2d\x90\xc7\x51\xcc" + "\xc7\x42\xbd\x3c\x75\xdd\xc3\xa1\x97\x25\xb1\xa5\x15\xea\xe5\x98" + "\x69\xf2\xf5\x72\xcc\x46\x79\x7a\x19\x63\x4e\x4c\x2f\xc7\x9c\xe1" + "\xf0\x73\x56\x5c\x2f\xc7\x5c\x17\xd7\xcb\xd3\xba\x09\xf5\x32\xae" + "\x5f\x4c\x2f\x4f\x1b\x2a\xa8\xdf\x4e\x2f\x4f\x9b\x2c\xd4\xcb\xa4" + "\x1c\xaf\x97\xa7\xe9\x48\x0c\x7d\xe9\xb8\x7c\xbd\x3c\xed\x8c\xb4" + "\x5e\x9e\x76\x5e\xa8\x97\xa7\x1d\x20\xba\xf8\x15\x4f\xa2\x97\xa7" + "\x69\xc8\xfe\x97\x34\xd6\xfb\x79\xbd\x4c\xf6\xf3\x7a\xf9\x95\x20" + "\x27\xf5\xb2\xa1\x83\xf4\x72\xe9\xc3\xa5\x97\xff\xbe\xb5\x6b\xe8" + "\xe5\x5f\x1d\x73\x4d\x2f\xff\xea\xa8\x13\x3a\x40\xdf\x8e\x0e\xd8" + "\xfb\x58\x07\x58\xf3\xac\x57\xd4\x84\x67\xcd\x98\xe6\x9a\x0e\x98" + "\xe1\xcc\xfb\xcf\x0f\xd4\x27\x8f\x96\x3f\xa6\x93\x1c\xef\xd4\xab" + "\x97\x5c\xf3\xc7\xab\xda\xc7\x5a\xb9\xa3\x7d\x32\x83\x7b\xf7\x39" + "\x76\xb9\x6b\x3e\x89\x4d\x75\x4d\x2b\xc7\x95\xf2\x5a\x39\xae\xd4" + "\x5a\x2b\xff\x43\x70\x2f\x79\xe6\x44\xc7\x5a\x79\x8e\x8e\xd7\xca" + "\xb3\xa7\x11\xbe\x39\x7b\x04\xe1\x9b\xb3\xd8\x67\x4a\xd2\x0f\x13" + "\xad\x7c\x0f\x6b\xe5\x2b\xa0\x95\x17\xc4\x51\x46\xee\x9b\x0e\xf8" + "\x99\xb4\xd3\xa0\x77\xb1\x3e\xae\x4e\x83\xff\x53\x75\xe8\x9d\xa5" + "\xc8\x73\x0b\xe8\xdc\xfd\x30\x37\xee\x5f\xa1\xa3\x36\xbd\x05\xf3" + "\x4a\xed\x41\x14\x90\x08\x1a\xfa\x36\xd6\xd0\x27\x40\x1f\x6f\xe4" + "\x34\xf4\xac\x85\xd5\xa9\xd6\x1a\x7a\xe6\x49\x56\x43\xeb\xc8\xf3" + "\x6e\xd5\xa9\xa0\xa1\xe1\x7a\xf8\x1b\x11\xd6\x1a\xba\x05\x34\x72" + "\x2b\x68\xe4\x9c\x6b\x36\x7a\x7a\x81\xbd\x9e\x6e\x09\x7e\xd6\x60" + "\x18\xec\x53\x8a\xf5\xf4\xbd\x3d\x8f\xf5\xb4\xbd\x9e\xfe\x35\x17" + "\xe7\x67\x8d\x72\x4d\x4f\xcf\x8a\x14\xea\xe9\xf8\x19\xf6\x7a\x7a" + "\xd6\x2e\xe7\xf5\xf4\xac\xe3\xae\xe9\xe9\x59\x1a\xe7\xf4\xf4\xec" + "\x30\x5b\x3d\xfd\xbf\xec\xfd\xe7\x99\x93\x30\xd6\xc5\xf5\x34\x39" + "\x66\xaf\x83\xe6\x1c\xe7\x75\xd0\x9c\x6d\x5d\x5f\x4f\xcf\x89\x10" + "\xd7\x3c\x73\x46\x11\x3d\x3d\x5b\xd5\xf1\x7a\x7a\xb6\x4a\x5c\x4f" + "\xcf\x21\xdf\x7f\x82\xe3\xf6\x7a\x1a\xce\x11\xd5\xd3\x73\x2e\xd9" + "\x9e\x43\xf4\xf4\xec\xfe\x44\x4f\xcf\xe1\xdf\x7f\xb6\xf3\xe1\xdc" + "\x1d\x24\xbe\xcd\x4d\x22\xf1\x8d\xf8\xd4\x5e\x4f\xcf\x1d\xd7\xbe" + "\x9e\x26\x18\x62\xdb\x29\xa9\xa7\xe7\xde\xff\xfe\x19\xaf\xa7\x67" + "\x4e\x10\xd7\xd3\x71\xf1\x3c\x8e\xe2\x3c\x84\x7a\x7a\xee\x99\x87" + "\x43\x4f\x4b\x62\x2b\x42\xa8\xa7\x5f\xdf\x23\x5f\x4f\xbf\x7e\x4e" + "\x9e\x9e\xc6\x98\x13\xd3\xd3\x71\x5c\xfe\x33\x82\x17\x7b\x3d\x1d" + "\x37\x56\x5c\x4f\xc7\xcd\x10\xea\x69\x5c\xbf\x98\x9e\x8e\x5b\x27" + "\xa8\xdf\x4e\x4f\xc7\xed\x12\xea\x69\x52\x8e\xd7\xd3\xf1\x51\x24" + "\x86\xc6\x5e\x97\xaf\xa7\xe3\xc3\xa4\xf5\x74\xfc\x40\xa1\x9e\x8e" + "\x33\x12\xdd\x1c\x3f\x9d\xe8\xe9\x78\x25\xd9\x1f\xdb\x64\xbd\x9f" + "\xd7\xd3\x64\x3f\xaf\xa7\xe3\x13\x9c\xbf\xff\xec\x56\xfe\xaa\xbd" + "\x9d\xff\x6e\x45\x47\xe5\xaf\xb2\xdc\x83\xfe\xa1\xdf\xad\x78\x23" + "\xd0\x35\x4d\xfd\x86\xf2\xb1\x7e\xeb\x48\xad\x10\x9f\x46\x78\x56" + "\xc2\x1e\xd7\xb4\x42\x42\xc9\x63\xfd\xd6\xd1\x3e\x79\x23\x96\xf8" + "\x64\xc1\x08\xd7\x7c\xb2\x60\xb8\x6b\xfa\x6d\xd1\x04\x5e\xbf\x2d" + "\x9a\x20\x7d\xaf\xf3\xcd\x6e\x8e\xf5\xdb\xdb\x5b\x79\xfd\x96\x74" + "\x9d\xf0\x9b\xa4\x33\x84\xdf\x24\xe5\x76\xdc\xbd\xce\x24\x6f\xe1" + "\xbd\xce\x37\x17\x3e\xbe\xd7\xd9\x19\xda\x2c\xa1\x91\xe0\x33\xf1" + "\x9c\x6b\xda\x2c\xf1\xac\x50\x9b\x2d\xba\x65\xaf\xcd\x92\x46\x39" + "\xaf\xcd\x92\xe6\xb8\xa6\xcd\x92\x66\x3b\xa7\xcd\x92\x8e\x89\xdf" + "\xeb\x7c\xd3\x4b\xfa\x5e\x27\x39\x66\xcf\xa9\xdf\x9e\xc3\x73\xea" + "\xb7\x07\x76\x7d\x6d\xf6\x56\xa5\x38\x7f\x7e\xeb\x1c\xd1\x66\x49" + "\x47\x3b\x5e\x9b\x25\x1d\x15\xd7\x66\x6f\xbf\x44\x78\x6c\xd2\x51" + "\x7b\x6d\x06\xe7\x88\x6a\xb3\xb7\xd7\xda\x9e\x43\xb4\x59\x92\x86" + "\x68\xb3\xb7\x77\x48\x6b\xb3\xe4\x11\x24\x76\x25\x77\x23\xb1\x8b" + "\xf8\xd4\x5e\x9b\xbd\x7d\xa1\x7d\x6d\x46\x30\xc4\xb6\x53\x52\x9b" + "\x25\x0f\xb0\xd7\x66\x6f\x7a\x8a\x6b\xb3\x85\x26\x1e\x47\x0b\x77" + "\x09\xb5\x59\xf2\xc2\x87\x43\x9b\x49\x62\xab\x52\xa8\xcd\x16\x8e" + "\x95\xaf\xcd\x16\x2e\x91\xa7\xcd\x30\xe6\xc4\xb4\xd9\xc2\x63\x1c" + "\x7e\x34\xe2\xda\x6c\xe1\x79\x71\x6d\xb6\xf0\x96\x50\x9b\xe1\xfa" + "\xc5\xb4\xd9\xa2\xa7\x04\xf5\xdb\x69\xb3\x45\xa3\x84\xda\x8c\x94" + "\xe3\xb5\xd9\xa2\x3a\x12\x43\x17\x1c\x94\xaf\xcd\x16\x1d\x93\xd6" + "\x66\x8b\x4e\x0a\xb5\xd9\xa2\x42\xa2\xc1\x16\xe9\x88\x36\x5b\x74" + "\x80\xec\x5f\x70\xc0\x7a\x3f\xaf\xcd\xc8\x7e\x5e\x9b\x2d\x46\xce" + "\x6b\x33\xe7\xf3\x5b\xfd\xf0\xcf\x06\x2b\x1f\xb1\x67\x83\x53\xf6" + "\xbb\xa6\xcb\x52\x4a\x1f\xeb\x80\x8e\xd6\x01\x8b\xb9\xfc\x42\x4b" + "\xc7\xba\xa6\x03\x96\x8e\x71\x4d\x07\xac\xb6\xca\x6d\xb5\x3a\x5a" + "\x5a\x07\x2c\xf3\x73\xac\x03\x56\x5a\xe5\xb6\x5a\xce\xe5\xb6\x5a" + "\xce\xe5\xb6\x5a\xbe\xa3\xe3\x74\xc0\xf2\x40\xa1\x0e\x58\xb6\xfc" + "\xb1\x0e\xe8\x0c\x1d\x90\xa2\x23\xf8\x4c\x75\x31\xff\x55\xaa\x4d" + "\xfe\xab\xd5\x22\xf9\xaf\x96\xcb\xc8\x7f\xb5\xdc\xc5\xfc\x57\xcb" + "\x9d\xcc\x7f\xb5\xdc\x2e\xff\x15\xd1\x01\xcb\x94\xd2\x3a\x80\x1c" + "\xb3\xe7\x6f\x2b\xad\xf2\x5f\xad\x7c\x08\xf2\x5f\xad\x90\xc8\x51" + "\xb4\x82\xcb\x7f\xb5\xfc\x01\xe4\xbf\x5a\x2e\x91\xff\x6a\x25\x97" + "\xff\x6a\xf9\x09\x7b\x1d\xb0\x5c\x22\xff\xd5\xca\x8d\xb6\xe7\x10" + "\x1d\xb0\x9c\xcb\x7f\xb5\xd2\x41\xfe\xab\x34\x2e\xff\x55\x1a\x97" + "\xff\x8a\xf8\xd4\x5e\x07\xac\x74\x22\xff\xd5\x72\x2e\xff\xd5\x72" + "\x07\xf9\xaf\xd2\x44\xf2\x5f\x2d\xf3\x15\xd7\x01\xab\xad\xf2\x5f" + "\xad\xb2\xc9\x7f\x95\xf6\x90\xe4\xbf\x92\xc4\x96\x4d\xfe\xab\x55" + "\x2e\xe4\xbf\x5a\x25\x33\xff\xd5\x72\x89\xfc\x57\xab\xb8\xfc\x57" + "\xcb\x25\xf2\x5f\xad\x92\xc8\x7f\xb5\xca\x26\xff\xd5\x72\x89\xfc" + "\x57\xab\x07\x08\xea\xb7\xd3\x01\xab\x6d\xf2\x5f\x2d\xb7\xc9\x7f" + "\xb5\x9a\xcb\x7f\xb5\xf4\xb0\x7c\x1d\xb0\xda\x41\xfe\xab\xd5\x36" + "\xf9\xaf\x56\x73\xef\x02\xae\xe6\xf2\x5f\xad\xe6\xf2\x5f\x2d\x3d" + "\x64\xbd\x9f\xd7\x01\x64\x3f\xaf\x03\xd6\x3c\xce\x7f\xf5\xd0\xe4" + "\xbf\x4a\x77\x31\xff\x55\xba\x8b\xf9\xaf\x36\x58\xe5\xbf\xda\x50" + "\x62\xcd\x3b\x85\xb9\x28\xd6\xb6\x93\xff\x6a\x9d\x55\xfe\xab\x2c" + "\xee\x79\xf5\x2c\x2e\xff\x55\xa6\x0b\xf9\xaf\x32\x6d\xf2\x5f\xad" + "\x7d\x9c\xff\xea\x81\x71\xca\x35\x5c\xfe\xab\x4c\x17\xf3\x5f\x65" + "\xda\xe4\xbf\xda\x28\x92\xff\x2a\x53\x46\xfe\xab\x4c\x17\xf3\x5f" + "\x65\x3a\x99\xff\x2a\x4b\x22\xff\xd5\x5a\x07\xf9\xaf\xd6\x4a\xe4" + "\xbf\x5a\x67\x95\xff\x6a\xdd\x43\x90\xff\x6a\x9d\x44\x8e\xa2\x75" + "\x5c\xfe\xab\xac\x07\x90\xff\x2a\x4b\x22\xff\xd5\x3a\x2e\xff\x55" + "\x96\x48\xfe\xab\x2c\x89\xfc\x57\xeb\xb8\xfc\x57\x59\x36\xf9\xaf" + "\xb2\xb8\xfc\x57\xeb\x1c\xe4\xbf\x5a\xcf\xe5\xbf\x5a\xcf\xe5\xbf" + "\x5a\x2b\x91\xff\x6a\xbd\x13\xf9\xaf\xb2\xb8\xfc\x57\x59\x0e\xf2" + "\x5f\xad\x17\xc9\x7f\xb5\x56\x22\xff\xd5\x06\xab\xfc\x57\xbf\xb1" + "\xc9\x7f\xb5\xfe\x21\xc9\x7f\x25\x89\x2d\x9b\xfc\x57\xbf\x71\x21" + "\xff\xd5\x6f\x64\xe6\xbf\xca\x92\xc8\x7f\xb5\xa1\xb7\x2d\xe6\x84" + "\x9c\x72\x83\x44\xfe\xab\x0d\x36\xf9\xaf\xb2\x24\xf2\x5f\x6d\x58" + "\x25\xa8\xdf\x8e\x53\x6e\xb0\xc9\x7f\x95\x65\x93\xff\x6a\x23\x97" + "\xff\x6a\xad\x0b\xf9\xaf\x36\x3a\xc8\x7f\xb5\xd1\x26\xff\xd5\x06" + "\x2e\xff\xd5\x46\x2e\xff\xd5\x46\x6e\xff\xda\x70\xeb\xfd\x3c\xa7" + "\x5c\x6b\x93\xff\x6a\xa3\xc3\xfc\x57\xc2\xf7\x68\x3a\x64\x6d\xb9" + "\x93\xde\xa3\xe9\xa8\xb5\xe5\xae\xf2\x1e\xcd\x7f\x77\x73\x8d\x4f" + "\xfe\xb7\xe7\xe3\x67\x7e\x3a\x72\x5d\x79\x63\x0a\xe1\x58\x9b\xf2" + "\x5d\x5b\x57\xde\x94\xe7\x1a\xbf\xcf\xd1\xf0\xfc\x3e\x47\x23\xfd" + "\x7e\xc0\xe6\xf9\x8e\xf9\x7d\xb6\x17\xcf\xef\xb7\x26\x91\x79\x74" + "\xeb\x64\x32\x8f\x6e\xf5\x73\xe5\xfd\x80\x2d\xb7\x91\xe7\x3b\xb6" + "\xef\x07\x9c\x3d\x46\xde\x0f\x58\x6a\xfb\x7e\xc0\x3b\x1b\x85\xef" + "\x07\x6c\xbe\x2c\xf5\x7e\x00\x5e\x67\x6e\x3b\xe8\xb3\x17\xbf\x1b" + "\x20\xfa\x5e\xc0\x6b\x1d\xff\x5e\x00\xd6\x06\x3b\x01\xb3\x58\x1f" + "\xe0\x38\xf3\x68\xe9\x83\xff\x8e\x26\xd8\x7d\x67\x9a\x6b\xfa\xe0" + "\x9d\x18\xa1\x3e\xc8\x5d\x68\xaf\x0f\xde\x39\xec\xbc\x3e\x78\xe7" + "\xbc\x6b\xfa\xe0\x9d\x5a\xe7\xf4\xc1\xd6\x51\xe2\xef\x05\x6c\x4e" + "\x94\x7e\x2f\x80\x1c\xb3\xe7\x75\xdb\xce\xf3\xbc\x6e\xdb\xbe\xae" + "\xaf\x0f\xb6\x4d\x12\xe7\x70\xdb\xa6\x11\x7d\xb0\x35\xb2\xe3\xf5" + "\xc1\xd6\x48\x71\x7d\xb0\x8d\x5b\xff\xdb\x1a\x69\xbf\xe6\x0c\xe7" + "\x88\xea\x83\x6d\x2d\xb6\xe7\x10\x7d\xb0\x75\x0c\xd1\x07\xd9\xc1" + "\xd2\xfa\x20\xfb\x63\x12\xd7\xb2\xd7\x91\xb8\x46\x7c\x6a\xaf\x0f" + "\xb2\x67\xb6\xaf\x0f\x08\x86\xd8\x76\x4a\xea\x83\xec\x3d\xf6\xfa" + "\x60\x73\x82\xb8\x3e\xc8\x59\xc5\xe3\x28\xa7\xb7\x50\x1f\x64\x5f" + "\x7d\x38\xf4\x81\x24\xb6\x26\x09\xf5\xc1\xf6\x23\xf2\xf5\xc1\xf6" + "\xeb\xf2\xf4\x01\xc6\x9c\x98\x3e\xc8\x19\xc5\xe1\x67\x8c\xb8\x3e" + "\xc8\x99\x21\xae\x0f\x72\x16\x0a\xf5\x01\xae\x5f\x4c\x1f\xe4\xec" + "\x10\xd4\x6f\xa7\x0f\x72\x0e\x0b\xf5\x01\x29\xc7\xeb\x83\xdc\x58" + "\x6e\xfe\xf3\x93\xaf\x0f\x72\x47\x49\xeb\x83\xdc\x71\x42\x7d\x90" + "\x1b\x44\x74\x40\x6e\x32\xd1\x07\xb9\x6a\xb2\x7f\xb3\xaf\xf5\x7e" + "\x5e\x1f\x90\xfd\xbc\x3e\xc8\x4d\x77\xfe\xd9\x13\xe7\xd7\x9c\x7f" + "\xf8\x67\x4f\xbc\x1e\xb1\x67\x4f\xde\x1b\xe0\x9a\x3e\x78\xaf\xbf" + "\x6b\x7c\x74\x67\x38\xcf\x47\x77\x86\x4b\x3f\xe7\xf0\xde\x5d\xc7" + "\x7c\xb4\x30\x95\xe7\xa3\x05\xe7\x48\xdc\x2e\x38\x42\xe2\x76\xc1" + "\x2a\x67\x9f\x73\xd8\x72\x8f\xe3\xa0\x96\xe7\x1c\x56\x70\xcf\x39" + "\x00\x0f\x25\xbc\x33\xff\x96\xf0\x39\x87\xbc\x39\x52\xcf\x39\x88" + "\x3e\xdf\x60\xc3\x35\x2d\xbc\xd4\x9d\xe7\x1b\x1e\x6d\xae\x99\x9b" + "\x43\xb8\x66\xfe\x31\xd7\xb8\x66\xfe\x51\x21\xd7\xdc\x79\xde\x9e" + "\x6b\x16\x84\x39\xcf\x35\x0b\x26\xba\xc6\x35\x0b\x26\x38\xc7\x35" + "\x0b\xf6\x89\x3f\xdf\xf0\x9e\x41\xfa\xf9\x06\x72\xcc\x9e\x23\x14" + "\x4e\xe4\x39\x42\x61\x60\xd7\xe7\x9a\xff\x73\x48\x9c\x0f\xfc\xcf" + "\x31\xc2\x35\x0b\xf6\x76\x3c\xd7\x2c\xd8\x2b\xce\x35\x0b\xb9\xfc" + "\x37\x05\x7b\xed\xb9\x26\x9c\x23\xca\x35\x0b\xe7\xdb\x9e\x43\xb8" + "\x66\x41\x29\xe1\x9a\x85\xeb\xa4\xb9\xe6\x8e\xa7\x48\xcc\x2a\xbc" + "\x4e\x62\x16\xf1\xa9\x3d\xd7\x2c\x3c\xd9\x3e\xd7\x24\x18\x62\xdb" + "\x29\xc9\x35\x77\xf8\xd9\x73\xcd\xf7\xf4\xe2\x5c\xf3\xfd\xcb\x3c" + "\x8e\xde\xdf\x28\xe4\x9a\x3b\x66\x3c\x1c\x5c\x53\x12\x5b\x87\x84" + "\x5c\xf3\xfd\x01\xf2\xb9\xe6\xfb\x33\xe5\x71\x4d\x8c\x39\x31\xae" + "\xf9\x3e\x77\xff\x83\xe0\xc5\x9e\x6b\xbe\x7f\x5c\x9c\x6b\xbe\x7f" + "\x5e\xc8\x35\x71\xfd\x62\x5c\x73\x67\x37\x41\xfd\x76\x5c\x73\x67" + "\x98\x90\x6b\x92\x72\x3c\xd7\xdc\x79\x82\xc4\xd0\xf7\x76\xc9\xe7" + "\x9a\x3b\xf7\x49\x73\xcd\x9d\x07\x85\x5c\x73\x67\x16\xe1\x94\x3b" + "\x6b\x09\xd7\xdc\x99\x47\xf6\xbf\x57\x64\xbd\x9f\xe7\x9a\x64\x3f" + "\xcf\x35\x77\x36\x3a\xe2\x9a\x4c\xce\x99\xc4\x1c\xca\x5c\x06\x5b" + "\x39\xb4\xb3\x37\xcc\x6f\x1a\xf8\xbf\x02\xe6\x29\x25\xfc\x5f\x23" + "\xc5\x63\x74\x81\x67\x12\xcd\xc0\x4b\xcc\x70\x9d\x6a\xdd\x4d\x8d" + "\xa6\x8f\x11\xae\x5d\x94\x48\x38\xcb\x99\xc4\x00\x63\x8f\x49\x66" + "\x26\x11\xe6\x77\xf8\x3f\x0d\xf6\x41\x79\x7f\x98\x0f\x55\x2b\x90" + "\xff\x0d\xaa\x68\x93\xa5\x1c\xb4\xd9\xbf\x9e\x2a\x9a\x88\xeb\x68" + "\xde\x52\x94\x07\xfd\xd1\x4b\xb6\x15\xea\x9a\xba\xbf\x2f\x5a\x6b" + "\x64\xbe\xd3\x2c\xba\x8d\x1a\xa8\xa2\x0b\x01\x4d\x3d\x26\x41\x1c" + "\x42\x98\x1f\x96\xf5\xd1\x79\xe2\x3a\x35\x8b\x5a\xf1\x31\x0d\x3e" + "\x66\x82\x36\x66\x2c\x44\x54\xf6\xed\x1e\x5e\xc0\xb9\xba\x65\xea" + "\x99\xc6\xc5\x46\x68\x33\xcc\xaf\x9f\xf6\xad\xf5\xfc\xe8\xfd\x5a" + "\x76\xee\xa9\xd2\x9b\xd8\x3a\x54\x8b\xd8\xf6\x5c\xda\x0d\xe5\xc5" + "\xda\xb0\xf1\x43\x14\xde\x6d\x20\xa3\x95\x37\xdf\xed\x92\x7c\xff" + "\x2d\x60\x5d\x5f\xa4\x19\x04\xb6\x53\x21\x4a\xec\xb8\xcc\xeb\x14" + "\x49\x5d\xa7\x9f\x12\x79\xbd\xd7\x8b\xd1\x67\xee\x40\xd4\x76\x73" + "\x0f\xaf\xcf\x20\x26\x16\x17\x30\xba\xe6\x2d\xbb\xbd\xb4\x1e\x27" + "\x26\x60\x9b\xff\x06\x8e\x6f\xef\xc5\xe8\xee\xac\xc7\xb8\xd9\xad" + "\x3a\x0e\x73\xbb\xad\x2f\x96\x26\x2c\x8c\x57\xa5\x26\x2d\x9c\xbf" + "\x78\x79\xaa\x6a\x40\x82\x02\x4d\x5f\xbc\x58\xb5\x30\x7e\xd1\x2a" + "\x95\xf5\x91\xd1\xaa\x84\xa4\x65\xf1\xf3\x92\xe7\x0f\x5e\xf8\x46" + "\x8a\x02\xda\x84\xac\xda\x11\x84\xdb\x62\xde\xb2\x3b\x7c\xf7\xbb" + "\x08\xbd\xd7\x13\x79\xe2\x76\xc1\xf5\x72\xb4\xf4\xf7\x63\xf0\xf5" + "\xb2\x0b\x18\x3d\x05\x65\x32\x21\xa6\x6d\xcf\xe8\x01\x65\x77\x15" + "\x15\x43\xbb\x76\x43\xbb\xa1\x8d\xb8\xcd\x47\x2d\x6d\xb6\x60\x22" + "\x13\x63\x22\xe3\x36\x60\x70\xf7\x85\x00\x43\x8f\x17\x19\x26\x16" + "\xf7\x4f\x0f\x63\xc5\xe3\x0a\x55\xbc\x9c\xd5\x0c\xb9\x67\x12\xe1" + "\x5c\x83\x05\x63\xe6\xbc\xde\x1a\xe6\xdd\x33\x11\xc0\x2b\x3d\x9a" + "\x99\xc4\x9f\x01\x36\xe1\xfc\xe2\x89\x43\x10\xca\x62\x9a\x63\xd9" + "\x6f\x57\x30\xcd\x80\x61\x82\x53\x38\x56\x12\x72\x87\x42\x2f\x34" + "\x6f\x29\x1e\xa3\x45\x8b\x12\x70\x1d\x5a\xd8\x87\x6d\x6e\x2e\x19" + "\x59\x36\x43\x8d\xb2\x7e\x92\x85\xb2\x9a\xf1\x39\x25\x86\x4d\x01" + "\xa9\xc8\x63\x6a\x1a\x73\x11\xe2\x8e\x07\x13\x36\xb2\x8c\xd9\x63" + "\xd8\xa4\xa5\x8a\x55\xe6\xfc\xde\x1a\xe8\x4f\x13\xd4\xb3\x41\x8b" + "\xcc\x65\xb8\x9e\xed\x05\xac\xed\x9b\x70\xdf\xc1\x3e\xa0\x7d\x18" + "\x0d\xb3\x9e\x1b\x43\x5b\x6f\xa4\x99\x73\xc6\xd4\x54\x7b\xde\x43" + "\x53\x8d\x4c\x1b\xb3\xed\x46\x5a\x95\x5e\x0f\x31\x2d\xe5\x0d\x46" + "\xb1\x7b\x6c\x80\x31\x69\x7e\x71\x4f\x18\x8b\xb9\x63\x6a\x98\xdc" + "\x6e\x95\x33\x06\x22\x25\xd4\xad\xb5\xd8\x13\x6c\xe9\x29\x0f\x47" + "\xc5\x0d\xb8\x4f\x18\x0f\xd0\x1e\x0e\x0f\x25\x11\xc7\x53\xed\xf1" + "\x70\x7f\x6c\x16\x78\xa7\x18\x99\xd8\x17\xdb\xf2\xbc\x4b\x99\x20" + "\xef\xbc\x8c\xcb\xa8\x3b\xb6\x6d\x15\x68\x81\xec\x15\x28\x64\xdb" + "\x5c\xa4\x7a\x7d\x95\x12\xe9\xf2\xbd\x73\x02\xd6\x65\x79\x80\x4d" + "\x28\x88\x2f\x11\x10\x33\x23\xda\x7a\xf5\xd6\xa4\xcf\x47\xd4\xc1" + "\xfa\x32\x0a\xf3\x67\xfc\x8c\x0a\xd8\xfa\xd6\x6e\x38\x8f\xb9\x19" + "\x8b\xb0\x3f\x58\x5f\xdc\x4c\x44\x93\x93\x60\x7e\x7e\x0b\x1f\xdf" + "\x33\x60\x17\xd4\x29\xaf\x5f\x25\x2c\xff\x35\x81\xaf\x86\x80\x9f" + "\xaa\x1b\x4c\x6c\x9d\xac\xaf\x92\x79\x5f\x1d\x83\x76\xf0\xfe\x2a" + "\x39\x80\xfd\x2a\xd1\x67\x1d\xe9\xb3\x42\xcd\x04\x29\x82\xa4\xfb" + "\xac\x50\x92\x3e\x77\xbb\xed\xb8\xcf\x7b\x2e\x3b\xee\xf3\x07\xbd" + "\xe5\xf7\x79\x4f\x99\xfc\x3e\xef\x29\x91\xee\xb3\x82\xf3\xb3\x02" + "\xfc\xac\x70\xe0\x67\x05\xe7\x67\x9f\x7a\xc7\x7d\xfe\xe0\xbc\xe3" + "\x3e\xff\xce\x4f\x7e\x9f\x3f\xd8\x2b\xbf\xcf\x1f\xe4\x39\xe8\x33" + "\xe7\x67\x1f\xf0\xb3\x8f\x03\x3f\xfb\x70\x7e\x0e\xfc\xc2\x71\x9f" + "\x7f\x77\xda\x71\x9f\xf7\x7a\xc8\xef\xf3\xef\x0a\xe5\xf7\xf9\x77" + "\x9b\xa4\xfb\xec\xc3\xf9\xd9\x07\xfc\xec\xe3\xc0\xcf\x3e\x9c\x9f" + "\x47\x6e\x71\xdc\xe7\xbd\xc7\xdb\xe9\xf3\x5d\xf9\x7d\xde\xbb\x55" + "\x7e\x9f\xf7\xa6\x3b\xe8\x33\xe7\x67\x5f\xf0\xb3\xaf\x03\x3f\xfb" + "\x72\x7e\x9e\x35\xde\x71\x9f\xf7\x1d\x76\xdc\xe7\x7d\x57\xe5\xf7" + "\x79\x5f\x96\xfc\x3e\xef\x4b\x91\xea\x73\x2b\xc4\x6d\x5f\xe8\x4b" + "\xdb\x7f\x62\x5f\x34\x05\x79\x17\xf9\x36\x20\xaa\x68\xbd\x39\x31" + "\xa0\x11\x79\x43\xdf\x12\x99\x82\xd0\x14\xfc\xd7\x1c\xe4\x5d\xd8" + "\x1a\xe4\x5d\xda\xd2\xf3\x4c\xc4\x9a\x39\xa8\x3b\xe6\xe3\x9b\xcd" + "\x28\xc4\x9c\xe7\x9d\xb7\xf5\x15\xa4\xca\xd4\x21\x65\x55\x86\x16" + "\x65\xa4\x30\xba\x2a\x74\x09\xf9\x35\x62\xed\xf9\x15\xaa\x6c\xaa" + "\x40\x8b\x96\x32\xcc\x15\xea\xf7\x23\xf0\xba\x09\xf0\xe4\xac\x9c" + "\x2f\x91\x0a\xae\x11\xb1\x1b\x36\x5c\x4f\x40\x34\xcc\x9f\x05\xa1" + "\x4b\x8b\x33\x50\xc8\x27\x6f\x35\x22\xbc\x7f\x17\x6c\xa6\x82\xde" + "\x9a\x8c\x39\x88\xfa\xf0\x76\x2d\x45\xe6\xe6\xdf\x7b\xd8\xce\xcd" + "\xd1\xf1\x60\xcb\x79\xec\xb1\xc9\x45\xaf\xc8\xb5\xe5\xff\x56\x5a" + "\xe6\x6e\xd6\x96\x75\x26\x32\xdf\xdb\xcc\xdd\x9f\xc0\xf5\x79\x5b" + "\xfe\xef\x51\x6c\x4b\x26\xcf\xbb\xac\xba\xb1\x15\xeb\x26\xe5\x95" + "\x34\x44\xc1\xfe\xe4\xaa\x94\xdb\x48\xc2\xc6\x3a\xde\xc6\x8a\x50" + "\xdf\x86\x6e\xb7\xc5\x6d\xac\x08\x69\x0d\x52\xa8\xed\x6d\xac\x08" + "\x72\xce\xc6\xa5\x3b\xdc\xb7\x71\xe9\x7c\x69\x1b\x97\x7e\x2c\xdf" + "\xc6\xa5\x11\xf2\x6d\x5c\xaa\x22\x36\x56\x44\x08\x6d\xfc\xfb\x1a" + "\x69\x1b\x2b\xac\x70\xac\x00\x1c\xfb\xd4\x4b\xd8\x18\x70\xac\x10" + "\xc1\xb1\xc2\x49\x1c\xef\x37\xb9\x6f\xe3\xfd\xa7\xa4\x6d\xfc\x87" + "\x60\xf9\x36\xde\x9f\x27\xdf\xc6\xfb\x37\x70\x36\xb6\xc1\xf1\xfe" + "\xe1\x0e\x6c\x6c\x85\x63\x1f\xc0\x71\xe0\x17\xe2\x36\xf6\x01\x1c" + "\xfb\x88\xe0\xd8\xc7\x49\x1c\xff\x31\xde\x7d\x1b\xff\x71\xb0\xb4" + "\x8d\xff\xb8\x4a\xbe\x8d\xff\x60\x90\x6f\xe3\x3f\x34\x12\x1b\xfb" + "\xd8\xe0\xf8\x0f\x85\xd2\x36\xf6\xb1\xc2\xb1\x0f\xe0\x78\xe4\x16" + "\x09\x1b\x03\x8e\x7d\x44\x70\xec\xe3\x24\x8e\x0f\x9c\x74\xdf\xc6" + "\x07\x72\xa5\x6d\x7c\xe0\x82\x7c\x1b\x1f\x98\x2d\xdf\xc6\x07\xa2" + "\x39\x1b\xdb\xe0\xf8\x8f\x46\x07\x36\xb6\xc2\xb1\x2f\xe0\x78\xd6" + "\x78\x71\x1b\xfb\x02\x8e\x7d\x45\x70\xec\xeb\x24\x8e\x3f\x1c\xe8" + "\xbe\x8d\x0f\xde\x95\xb6\xf1\x87\xe3\xe4\xdb\xf8\xa0\x46\xbe\x8d" + "\x0f\x96\x11\x1b\xfb\xda\xe0\xf8\x60\x9c\x94\x8d\xdb\x40\x03\xfa" + "\x81\x8d\xfd\x9a\x10\xb5\x0b\xdb\xb6\x96\xd8\xd6\xd4\x2b\x34\x65" + "\x17\x65\x4e\xc4\x36\x61\xd7\x80\xbe\x0f\xf1\x37\xe5\x79\x17\x31" + "\x14\xf4\x29\x03\xaf\xbb\x7e\xb8\xdf\xb8\x1e\xf9\xab\x32\xf0\xfa" + "\x6f\xd9\x46\x5c\x46\x95\xf1\xdb\x0b\x70\x3d\x1a\xaf\x7b\x19\x73" + "\x6b\x94\xa6\x60\xbf\xc2\x2b\xd4\x47\x97\x98\xb0\xd6\x12\xd0\x9b" + "\x65\xcc\xdb\x21\x41\xd5\x4d\x65\x60\x9f\xcf\x51\x55\xed\x5f\x91" + "\xb9\x57\xe8\xd2\x21\x46\xa4\x66\xbe\x57\x07\x55\xa6\x6a\x91\xe9" + "\x8d\x10\xdf\xea\xb4\x0a\x54\x9d\xf6\x27\x34\xb5\x91\xb9\xc7\x7c" + "\xab\xf6\x6d\x0b\xee\x57\x6e\x0a\x0e\x8d\x33\xe5\x87\x7b\x19\x83" + "\xfb\x95\x1e\x5c\xa1\xa5\x7c\x0d\x48\x9d\xdc\xc0\x30\xd9\xf3\x90" + "\x67\x76\x3d\xf2\xda\x3e\x0f\xf9\x6e\xaf\x47\xca\xca\x86\x5a\x74" + "\xfa\x5a\x05\x3a\x7d\xfb\x3c\x3a\x7d\x0f\xb6\x56\xd8\xcc\xb0\x65" + "\x9d\x07\x5f\x23\x34\xf9\x3a\xc2\xdf\xfd\xd4\x3d\x5b\x87\x82\x2a" + "\x8d\xb5\x08\xbf\xb7\x7b\x83\xfa\x68\xad\x6f\x1c\x0a\x62\xbe\x0d" + "\x41\xcc\x1b\x21\x14\x1c\xf3\xc4\xfb\xab\x8d\x3a\x54\xd9\x60\xc0" + "\xc7\x67\xc3\x71\xcf\xcc\x06\xa8\xdf\x5c\x81\xbf\xeb\xa9\xab\xcc" + "\x3a\x05\xfd\xcb\xd4\x31\x58\x43\xf7\xf2\x4e\xc9\x01\x53\x9b\x99" + "\x90\x7e\x04\x07\x65\xf9\xbb\xcd\x72\x7d\xfd\x11\x9b\xf3\x00\xec" + "\xd3\x13\xec\xdc\xc7\xfc\x76\xac\x72\xca\xf9\x8b\x0c\x7e\xae\x0f" + "\xaf\x25\x54\xe9\x3f\x47\xf8\x5e\xd3\xd4\x55\x08\x45\x9b\x10\xc2" + "\xb6\xa8\x4e\x6b\x44\x53\x52\x50\x00\x5e\x7f\x36\x7f\xaf\xee\x59" + "\xdd\xa0\x43\x6b\x8d\xd0\xc6\x1b\x86\xfb\x6d\xac\xda\x50\x85\xe0" + "\x58\x9f\xaa\x44\x2d\xf2\x4d\x41\x4a\x6c\x5f\x63\x9e\x77\xe1\x14" + "\x18\x3f\x8b\xf4\x0c\x83\x6d\x8b\x6d\x8a\xed\x8b\xeb\xb3\xd8\xbc" + "\x3a\x41\x87\x32\x0d\x48\x59\x9d\x01\x7f\xd3\x18\x5d\x35\xba\x85" + "\xa0\x8d\x39\x4c\x60\xa6\x0e\x70\x91\x8a\xb1\xa0\xa5\x3e\x2c\x01" + "\xff\xf7\x14\xc7\x94\x22\x88\x60\xaa\xdb\xed\xf6\x31\xa5\x08\xe5" + "\x31\x55\x66\xe2\x31\xf5\xa7\xf3\xd2\x98\xfa\xd3\x08\x82\x29\x45" + "\x44\xd7\xc4\xd4\xc7\x67\x1c\x63\xea\xe3\x32\x69\x4c\x29\xd4\x80" + "\x29\x9d\x10\x53\x7f\xba\x2a\x1f\x53\x7f\x42\x9d\x87\x29\x45\x88" + "\x6b\x98\xfa\xb8\x41\x88\xa9\x32\xbd\x03\x4c\x71\x71\xca\xa7\xde" + "\x09\x4c\x59\xc5\xa9\xff\x37\x8d\xc7\xd4\xe1\xc1\xd2\x98\x3a\xb4" + "\x99\xc3\x54\x17\x8d\x53\x87\x06\x38\xc6\xd4\x21\x4f\x07\x98\x82" + "\x38\xa5\xb0\x89\x53\x87\xc7\xca\xc7\xd4\xa1\xe9\x9d\x88\x29\x17" + "\xe3\xd4\xa1\x48\x21\xa6\xfe\xdf\x24\x69\x4c\xf9\x70\x71\x2a\xf0" + "\x8b\xf6\x31\xe5\x63\x15\xa7\x0e\xef\xe3\x31\xf5\x97\x75\xd2\x98" + "\xfa\xf3\x05\x82\x29\x9f\x2e\x1a\xa7\xfe\xbc\xca\x31\xa6\xfe\x1c" + "\x2b\x8d\x29\x1f\x88\x53\x0a\x9b\x38\xf5\x97\x5c\xf9\x98\xfa\x73" + "\x69\xe7\x61\xca\xc7\xc5\x38\xf5\xe7\xad\x42\x4c\x1d\x2e\x72\x80" + "\x29\x2e\x4e\x8d\xdc\xe2\x04\xa6\xac\xe2\xd4\x5f\x5a\x78\x4c\x1d" + "\x39\x27\x8d\xa9\x23\x43\x39\x4c\x75\xd1\x38\x55\x7e\xda\x31\xa6" + "\xca\x0f\x38\xc0\x14\xc4\x29\x1f\x9b\x38\x75\xe4\xb2\x7c\x4c\x95" + "\x1b\x3b\x11\x53\x2e\xc6\xa9\x72\xad\x10\x53\x7f\xd1\x49\x63\xca" + "\x97\x8b\x53\xb3\xc6\xb7\x8f\x29\x5f\xab\x38\xf5\xd7\xc9\x3c\xa6" + "\x8e\x0e\x94\xc6\xd4\xdf\x36\x12\x4c\xf9\x76\xd1\x38\xf5\xb7\x30" + "\xc7\x98\xfa\x1b\x92\xc6\x94\x2f\xc4\x29\x1f\x9b\x38\x75\x74\x94" + "\x7c\x4c\xfd\x2d\xa6\xf3\x30\xe5\xeb\x62\x9c\xfa\xdb\x70\x21\xa6" + "\xfe\x3a\x41\x0a\x53\xad\x58\xf7\x79\x00\xa6\x12\x41\xf7\x01\x86" + "\x02\x6a\x08\xa6\xda\x00\x53\x3b\xad\x31\xf5\xb5\xad\xee\x3b\xba" + "\xc7\x7c\x1f\x53\x9f\x1c\xb4\xc5\x94\x19\x30\xd5\xc6\x62\xea\xd8" + "\x49\x8b\xee\xab\x6e\x2a\x01\x5f\x5d\x43\xd5\x31\x80\xa7\x02\x0e" + "\x4f\x5f\x03\x9e\xa0\x3f\x66\xe8\x6f\x65\x5d\x2d\x9a\xaa\x23\xfd" + "\x6a\x85\xfe\x9a\xad\xb1\xd4\xda\x48\x61\x0c\x61\xec\x58\x70\x74" + "\x7a\x11\xe0\x67\xe9\x19\x74\x7a\x05\x6c\xab\x61\xcb\x80\x0d\x9d" + "\x41\x95\x8d\x88\x5d\xb3\xe7\xf1\x53\xc3\xe1\xe7\x58\xbc\x63\xfc" + "\x1c\x8b\x92\xa7\xf1\x3e\x39\x26\x1f\x3f\xc7\x72\xb8\x67\xe9\x94" + "\x53\xa7\x5d\x64\xf0\x33\xb3\x04\x23\xd7\xd0\x54\x23\x0a\x60\x66" + "\xa9\x7b\xfa\xc6\x22\xe5\x1a\x13\xa2\xb6\xcd\x43\xca\x6d\x5f\x41" + "\x7f\x2d\x63\xa7\x1e\xf9\x7e\x6e\xf8\x2b\xaa\xbc\x5d\x8b\x2a\xef" + "\x9d\x42\x95\x66\xd8\xae\xc1\x06\x6d\x9c\x3a\xdf\xba\xbf\x3a\xae" + "\xbf\x9f\x4c\x83\xba\xfa\x4b\xf7\xf7\x93\x08\xb6\xbf\x09\xd0\xdf" + "\x56\xbe\xbf\xd5\x80\x45\xf0\x4b\x1f\x33\xa7\x13\xa7\xea\x90\xf7" + "\x62\x23\xc3\xb4\x72\x18\xc4\x7e\xf9\xfc\xac\x01\x4d\x4d\x01\x5f" + "\xbd\x01\x18\x6c\x28\x45\x99\xe9\x80\xc1\x56\x03\xbe\xaf\xaf\xab" + "\xce\x6a\x01\x0c\x1e\x4b\x65\xc0\x6e\x6d\x18\x83\x5f\x63\x0c\x1e" + "\x2d\x34\x4b\x62\x10\x74\x22\x8b\x41\xd0\x89\xed\x62\xd0\x5a\x27" + "\x7e\x3a\x80\xc7\xe0\xf1\xa1\xd2\x18\xd4\xbc\x64\xd1\x89\x3f\x3c" + "\x06\x3f\xbd\xec\x18\x83\x9f\x9e\x90\xa7\x09\x8f\x8f\x93\x8f\x41" + "\x4d\x50\xe7\x61\x50\x73\xce\x31\x06\x35\x87\xda\xc7\xa0\x22\xc4" + "\x35\x0c\x7e\x6a\x10\x62\xf0\xd3\x50\x07\x18\xe4\xe2\x20\xe8\xca" + "\xf6\x31\x68\x15\x07\x8f\xef\xe7\x31\xf8\xd9\x61\x69\x0c\xfe\xfd" + "\xb4\x45\x57\xfe\xf0\x18\xfc\x7b\x92\x63\x0c\xfe\x7d\x92\x3c\x0d" + "\xf9\xd9\x49\xf9\x18\xfc\x7b\x61\xe7\x61\xf0\xb3\x99\x8e\x31\xf8" + "\x59\xa4\x13\x18\x74\x31\x0e\xfe\x3d\x5d\x88\xc1\xe3\x25\xd2\x18" + "\xf4\xe1\xe2\x20\xe8\xd0\x76\x31\x68\xad\x43\x4f\x0c\xe6\x31\xf8" + "\x8f\x51\xd2\x18\x3c\x39\xcd\xa2\x43\x7f\x78\x0c\x9e\xb8\xee\x18" + "\x83\x27\x2a\xe5\x69\xce\x7f\xbc\x24\x1f\x83\x27\x43\x3b\x0f\x83" + "\x27\x2f\x38\xc6\xe0\xc9\xa3\xed\x63\xd0\xc7\xc5\x38\x78\x12\x09" + "\x31\x78\xa2\xbf\x03\x0c\x72\x71\x10\x74\x6b\xfb\x18\xb4\x8a\x83" + "\xff\xf8\x98\xc7\x60\xc5\x31\x69\x0c\xfe\xf3\x9c\x45\xb7\xfe\xf0" + "\x18\xfc\xe7\x12\xc7\x18\xfc\x67\x8c\x3c\x8d\x5a\x71\x5a\x3e\x06" + "\xff\x59\xd2\x79\x18\xac\x88\x77\x8c\xc1\x8a\x28\x27\x30\xe8\x62" + "\x1c\xfc\xe7\x06\x21\x06\xff\x51\x2a\x8d\x41\x5f\x2e\x0e\x82\xce" + "\x6d\x17\x83\xd6\x3a\xf7\xd4\x08\x1e\x83\xff\x1a\x27\x8d\xc1\xcf" + "\x67\x5a\x74\xee\x0f\x8f\xc1\x53\x77\x1d\x63\xf0\xd4\x59\x79\x9a" + "\xf6\x5f\xd3\xe4\x63\xf0\xf3\xfe\x9d\x87\xc1\xcf\x2f\x3b\xc6\xe0" + "\xe7\x27\xda\xc7\xa0\xaf\x8b\x71\xf0\x73\x2f\x21\x06\x4f\x85\x4b" + "\x61\xd0\x0c\xba\xb8\xad\xa4\xb5\xc4\x9c\xd7\xaf\x3c\xc0\x43\x85" + "\x8c\x41\x7e\x85\xd5\xa9\x7a\x34\xe5\x2e\xd8\x27\xe5\x2e\x9a\x7b" + "\x57\x89\x4c\x79\xfd\x4a\x41\x17\x16\x5a\xe9\x67\xf6\xd9\x32\x63" + "\x4e\xa6\x6e\xfb\x22\xe4\x09\xfa\x7b\x29\xde\x57\x7d\xc5\x80\xf0" + "\xf5\xd7\xe2\xf6\x5c\xe3\xdb\x83\xd7\x09\x98\x9b\x6a\x25\x7b\x8f" + "\xb9\x55\x8b\x1a\xc6\x20\xba\xb2\x41\x0b\x76\x58\xcd\xfa\x17\xdb" + "\xe5\x0a\x55\xd9\xbf\xf8\x06\xf2\x34\x7e\x1b\xd2\x07\xec\x1d\xe4" + "\xb7\x12\x79\x84\x36\x30\x66\x6c\x57\x6c\x2f\x6c\x63\xd5\x6a\x7c" + "\xef\xba\x72\x79\x15\x60\xcc\xf8\xad\xba\xcf\x6e\x28\x27\xae\x57" + "\x2b\xd7\xca\xc7\x46\x65\x14\x79\x6f\xa1\x32\xb4\xb2\x0e\x89\xde" + "\x3b\x36\x83\x7e\x73\xce\x56\x8a\x10\x2b\x9d\xf7\x00\x6c\x75\x3a" + "\xc6\x39\x5b\x9d\xde\x23\xb4\x95\x98\xae\x3a\xbd\x5f\xbe\xad\x4e" + "\x27\x13\x5b\x9d\x9e\xe4\xc0\x56\x4e\xe2\x4a\x51\x68\xa5\x47\x1e" + "\x80\xad\xaa\xd2\x9d\xb3\x55\xd5\x69\x1b\x5b\x89\xf0\xff\xaa\x73" + "\xf2\x6d\x55\xc5\x7d\x0f\xa0\x2a\x55\xda\x56\x3e\x4e\xe2\xca\x27" + "\xc4\x8a\x37\x3f\x00\x5b\x55\x97\x3a\x67\xab\xea\x16\xa1\xad\xc4" + "\x78\x6a\x8d\x87\x7c\x5b\x55\x9f\x20\xb6\xaa\x2e\x71\x60\x2b\x27" + "\x71\xe5\x53\x68\xc5\xef\x1e\x80\xad\x6a\xce\x3a\x67\xab\x33\x03" + "\x6c\x6c\x25\xc2\xa7\xce\x0c\x96\x6f\xab\x1a\x1d\xb1\x55\x4d\xa5" + "\xb4\xad\x7c\x9d\xc4\x95\x6f\x88\x15\x0f\x79\x00\xb6\xfa\x02\x39" + "\x67\xab\x2f\xa6\x09\x6d\x25\x36\xef\x7f\x31\x53\xbe\xad\xbe\x08" + "\x25\xb6\x3a\x63\x90\xb2\x95\x29\xcf\x3b\x2f\x00\x6c\xd0\x52\xe0" + "\x9d\x12\x90\x86\xa8\x56\x15\xd8\x2d\x08\xec\xb6\x4e\x85\xda\xf2" + "\xc0\x6e\x3a\x23\x9a\xb2\xe4\x22\x53\xd5\x64\x42\xad\x60\xb3\x96" + "\x20\x6f\xd8\xd7\x88\x9f\x39\xfa\xaf\x7a\xea\xec\xa8\x59\x4b\x94" + "\x08\xdb\x0d\xdb\x01\xdb\x8e\x01\xbb\xb1\x76\x0c\x0a\xf7\x32\x05" + "\x85\xc6\x4d\xbe\x7e\x91\x59\xac\x65\x18\xdc\x5f\x46\x59\xc3\xde" + "\x17\x98\xda\x88\xbc\x55\xaf\xe0\x3e\xfd\xfb\x2a\xde\x5f\xad\xab" + "\x05\x7e\x70\x1b\xb1\xdc\xec\xa2\x3a\xc8\xf4\x6b\xb5\xaf\xa9\x3a" + "\xf6\x45\xa6\xe7\x99\x08\x63\xaf\xde\x9a\xcc\xeb\xa8\x3b\xe6\x0f" + "\xd9\x66\x14\xb2\x76\x21\xa2\x3e\x7c\x4b\x43\xb1\xef\xae\x2d\x65" + "\xeb\x38\x0c\x76\x09\x61\xee\x58\x3d\xd3\x7d\x27\x11\x55\x5f\xc9" + "\x61\xfd\x66\xcb\x11\x58\xbf\xfd\x47\xad\x04\x9e\x19\xc1\x04\x79" + "\x97\xe6\x54\x21\x15\xd3\x06\x36\x66\xdf\x27\x3a\xbb\xa7\xb8\x55" + "\xae\x8d\xff\xcd\x72\x55\xb3\x8a\x7b\x7e\x0b\xec\x84\xaf\xcf\x3e" + "\xbf\x95\x62\xf5\xfc\x16\xb4\x99\x7f\x7e\xeb\xdf\x13\xf0\xf3\x5b" + "\xe6\x8b\x21\x7d\x2c\x7d\x5f\x9c\xcc\x30\xd0\xf7\x9e\x55\x7a\x1d" + "\xc2\xfd\xaf\xd2\x6b\x50\x66\x2a\x52\x56\xb5\x36\xa2\x0c\x3d\xa3" + "\xab\xca\xba\x8a\xa6\xde\xc5\x3c\x18\xe3\xe5\xec\x50\xe2\xd7\x7f" + "\x7b\x9a\x2f\xaa\xfb\x68\xa9\xb3\xea\xaa\x1a\x84\xac\xde\xe3\x49" + "\x04\xce\xec\x05\x7e\x48\xac\xce\xaa\x47\xe0\x93\x9a\x6a\xe3\x57" + "\xd8\x4f\x89\x70\x7c\xcc\x7d\x7e\xdd\x2b\xf4\x0b\xbc\x0f\xfb\x0c" + "\xdf\x6f\xc2\xb9\x03\x8a\xad\xf8\x37\xc6\x45\x40\x5a\x16\xaa\x4e" + "\x6b\x45\x55\x46\xfc\xce\xee\x17\x65\xff\x8a\xad\x95\xc0\x91\x22" + "\x88\xc3\x91\x2e\x20\xad\xdb\xed\xf6\x71\xa4\x08\xe1\x71\xf4\xe5" + "\x3a\xf7\x70\xf4\xe5\x50\xf7\x71\x74\xce\xe4\x3a\x8e\x14\x6a\x21" + "\x8e\xbe\xbc\x2a\x1f\x47\xe7\x2a\xe4\xe3\xe8\xdc\x56\xf7\x70\xf4" + "\xe5\x2a\x82\xa3\x73\xd1\x04\x47\x5f\xa6\xf0\x38\x62\xdf\x8d\x7a" + "\x40\x38\x3a\x6b\x70\x80\x23\x2e\x1e\x29\x20\x1e\xf9\xd4\x3b\x81" + "\x23\xab\x78\x54\x7b\xca\x3d\x1c\xd5\xae\x72\x1f\x47\xb5\x13\xdd" + "\xc0\x91\x4d\x3c\x3a\x3f\x54\x3e\x8e\x6a\x95\xf2\x71\xf4\x9f\xb3" + "\xee\xe1\xa8\xf6\x38\xc1\xd1\x7f\xf2\x08\x8e\x6a\xcb\x79\x1c\xb1" + "\xef\x9b\x3d\x20\x1c\xfd\x27\x4a\x1a\x47\x3e\x5c\x3c\x52\x40\x3c" + "\x0a\xfc\xa2\x7d\x1c\xf9\x58\xc5\xa3\xaf\x03\xdd\xc3\xd1\x57\xc7" + "\xdd\xc7\xd1\x57\xdb\x5c\xc7\x91\x8f\x4d\x3c\xfa\x7a\x95\x7c\x1c" + "\x7d\x15\x2b\x1f\x47\x5f\x85\xba\x87\xa3\xaf\xbd\x09\x8e\xce\xd7" + "\x11\x1c\x7d\x8d\x78\x1c\xb1\xef\xf0\x3d\x20\x1c\x9d\xdf\xe4\x00" + "\x47\x5c\x3c\xf2\x81\x78\x34\x72\x8b\x13\x38\xb2\x8a\x47\x17\x66" + "\xba\x87\xa3\x0b\xde\xee\xe3\xa8\xee\x9c\x1b\x38\xb2\x89\x47\x17" + "\x8e\xcb\xc7\x51\x5d\x89\x7c\x1c\xd5\x25\xb8\x87\xa3\x0b\xd3\x08" + "\x8e\xea\xfa\x13\x1c\x5d\x98\xc4\xe3\x88\x7d\x2f\xf2\x01\xe1\xe8" + "\xeb\x1a\x69\x1c\xf9\x72\xf1\xc8\x07\xe2\xd1\xac\xf1\xed\xe3\xc8" + "\xd7\x2a\x1e\x5d\xdc\xe3\x1e\x8e\x2e\x4e\x73\x1f\x47\x17\x9f\x72" + "\x1d\x47\xbe\x36\xf1\x48\xeb\x2d\x1f\x47\xdf\x34\xca\xc7\xd1\x37" + "\x07\xdc\xc3\xd1\xc5\x1d\x04\x47\xdf\x24\x13\x1c\x5d\xcc\xe1\x71" + "\xc4\xbe\x6b\xfa\x80\x70\xf4\x4d\x88\x14\x8e\x70\x2e\x82\xf7\x48" + "\x5e\x08\xfd\xf6\xd5\x28\xb2\x18\xff\x6d\x45\x11\xcd\x5b\xb4\x51" + "\xc7\xd3\x49\x3e\x00\x2d\xa5\x95\xcc\x77\xe6\xb3\x1f\xfc\x12\xe4" + "\x9d\x33\xf5\x02\xc9\xd1\x80\xf3\x82\xdc\xc9\x4c\x44\x43\xd8\xbc" + "\x0c\x97\xd2\x70\x1e\xab\xfb\xb9\x03\x82\x24\x72\x07\xbc\x26\x9d" + "\x3b\xa0\xb5\xc0\xf2\xde\x6d\xa9\xd5\x7b\xb7\x97\x26\x3a\x7e\xef" + "\xf6\xd2\xe0\x5d\xaf\xc9\xc5\x83\x96\x7d\xff\xeb\x4e\x2f\xef\x94" + "\xe6\x2d\x97\xc6\xc0\xef\x20\xd2\xf7\x4b\xec\x77\x15\xda\x7f\x1f" + "\xb7\xd4\x0a\x27\xda\xc6\x19\xb3\x51\x16\xb3\xa5\x64\x0c\x13\xec" + "\x9d\xc3\xe4\x7b\x97\xc8\x6b\xcb\xa5\x0d\x8e\xed\xad\x50\x8a\xdb" + "\xbb\xbe\x91\xb3\x37\x79\xcf\x39\x48\x22\x6f\xc1\x6b\xd2\x79\x0b" + "\xc4\xed\x5d\xdf\xce\x7b\xce\xf5\xbb\xe4\xdb\xbb\x3e\x91\xb3\xb7" + "\xae\x79\x4b\xfd\x01\xde\xde\xdf\xaa\xe5\xdb\xbb\x3e\x96\xd8\x7b" + "\x4f\x04\x13\xac\x50\x32\xf9\x0a\xb9\x6d\xd1\xb7\x63\x6f\x09\x7c" + "\x37\xc4\x12\x7b\x73\x39\x13\x82\x24\x72\x26\xbc\x26\x9d\x33\x41" + "\xdc\xde\x0d\x03\x1c\xdb\xbb\xc1\x4f\xbe\xbd\xbf\xad\x25\xf6\x56" + "\x00\xbe\x1b\x42\x79\x7b\x37\x38\x99\x57\xc0\xda\xde\xdf\x56\x10" + "\x7b\x7f\xd0\x1f\xec\x0d\xf8\x56\xc8\xc4\x77\x43\x82\x63\x7b\xfb" + "\x48\xe0\xfb\x72\x05\x67\x6f\x0e\xdf\x12\xf9\x1a\x5e\x93\xce\xd7" + "\x20\x6e\xef\xcb\xf9\x8e\xed\x7d\x79\xad\x7c\x7b\x5f\x9e\xc4\xd9" + "\x1b\xf0\x7d\x79\x2b\x6f\xef\x2b\x5e\xf2\xed\x7d\x39\x92\xd8\xfb" + "\x77\x21\x4c\xb0\x0f\xe0\xdb\x47\x6e\x5b\xce\xb6\x63\x6f\x09\x7c" + "\x7f\x17\x49\xec\xcd\xe5\x8a\x08\x92\xc8\x15\xf1\x9a\x74\xae\x08" + "\x71\x7b\x7f\xd7\xcd\xb1\xbd\xaf\x5c\x97\x6f\xef\x2b\xe5\xc4\xde" + "\x3e\x80\xef\x2b\x46\xde\xde\xdf\xa5\xc9\xb7\xf7\x95\x52\x62\xef" + "\xbd\xbe\x60\x6f\xc0\xb7\x8f\x4c\x7c\x7f\x37\xc1\xb1\xbd\x7d\x25" + "\xf0\xdd\x58\xca\xd9\x9b\xc3\xb7\x44\x9e\x8a\xd7\xa4\xf3\x54\x88" + "\xdb\xbb\x71\xb9\x63\x7b\x37\xce\x91\x6f\xef\x46\x35\x67\x6f\xc0" + "\x77\x63\x32\x6f\xef\xc6\x46\xf9\xf6\x6e\x0c\x21\xf6\xde\x87\x98" + "\x60\x5f\xc0\xb7\xaf\xdc\xb6\x48\x7e\xff\x2b\x00\xec\x7d\x12\x78" + "\x0c\xf0\x8e\x42\x73\x1e\xf0\x14\x93\xd0\xee\xd5\x69\x91\xe8\xb9" + "\x7b\xd8\xf6\xd7\xf2\x60\xae\x2e\xec\xbc\x7c\x19\xd7\xd6\xba\xff" + "\xee\xf0\xb5\x97\xa4\xdf\x1d\xbe\x36\x54\xfe\xbb\xc3\x57\x8d\x3c" + "\x07\xba\x16\xc5\xfb\xf4\x1a\x1b\x3f\xe4\xbd\x53\x7c\xb5\x49\x3c" + "\x8f\xc6\xd5\x22\xfc\x4e\x31\xf8\x5a\x6f\xce\x77\x85\x1b\x5d\x2b" + "\x69\xdf\xd7\x0a\x9c\xef\x41\x29\xed\xeb\xa6\x2c\x98\xb7\x42\x3a" + "\x2f\x6f\x47\x53\x92\xfb\xbe\x6e\x1a\x21\xed\xeb\xa6\xa7\xe4\xfb" + "\xfa\xfb\x46\x9e\x7f\x35\x85\xf3\xbe\x6e\xd2\xc8\xf7\xf5\xf7\xb5" + "\xe2\xf9\x3c\xbe\xdf\x44\x7c\xfd\xfb\x58\x73\xbe\x2b\xbc\xac\x69" + "\xab\x13\xbe\x86\x71\xad\x70\x30\xae\x6f\x24\x83\xaf\x0b\x3b\x2f" + "\x7f\xc8\x8d\x19\xee\xfb\xfa\x46\x98\xb4\xaf\x6f\x78\xcb\xf7\xf5" + "\xf5\xb3\x3c\xf7\xbb\x11\xc2\xfb\xfa\xc6\x01\xf9\xbe\xbe\x7e\x42" + "\x3c\xaf\xc8\xf5\x54\xe2\xeb\xd2\xa3\xe0\x6b\x17\x38\xe1\x8d\xb4" + "\xf6\x7d\xed\x83\xf3\x5f\x38\x18\xd7\xba\x58\x98\xaf\x43\x3a\x2f" + "\x8f\x89\x6e\x9c\xfb\xbe\xd6\xf9\x49\xfb\xfa\xe6\x5d\xf9\xbe\xbe" + "\xa9\xe1\x79\x27\xce\xa5\x6c\xf1\xb5\xae\x50\xbe\xaf\x6f\x96\x89" + "\xe7\x37\xb9\x19\x47\x7c\xfd\x07\x95\x39\xdf\x15\x3e\xaa\x93\xe4" + "\xff\x56\xbe\x86\x71\xed\xe3\x60\x5c\xdf\x9e\x00\xbe\x2e\xec\xbc" + "\x7c\x2a\xb7\x07\xbb\xef\xeb\x5b\x2d\xd2\xbe\xbe\x75\x49\xbe\xaf" + "\x6f\x1d\xe0\x39\xef\x2d\x1d\xef\xeb\xdb\x1b\xe4\xfb\xfa\x56\x91" + "\x78\x9e\x95\x5b\xd1\xc4\xd7\x7f\xdc\x00\xbe\x76\x81\x0b\xdf\x8e" + "\x69\xdf\xd7\xbe\x38\xe7\x8a\x83\x71\xad\x07\x5d\xef\x1b\xd2\x79" + "\x79\x5d\xf4\xbd\xdd\xf7\xf5\x9d\xcb\xd2\xbe\xbe\x73\x5a\xbe\xaf" + "\xef\x14\xf2\x7c\xfb\x4e\x1d\xef\x6b\x7d\x8a\x7c\x5f\xdf\xd9\x24" + "\x9e\xef\xe5\x4e\x24\xf1\xf5\x81\x46\x73\xbe\x2b\x3c\x5c\x3f\xc6" + "\x15\x1e\xbe\x6c\x17\xf2\x12\xfa\xfb\x9e\xaa\x73\xb9\xf8\x3d\x6f" + "\xf7\xfd\x7d\xf7\x9c\xb4\xbf\xef\x1e\x93\xef\xef\xbb\x9b\x78\x2e" + "\x7e\xb7\x92\xf7\xf7\xbd\x38\xf9\xfe\xbe\x9b\x26\xce\xc5\xef\xaa" + "\xdd\xe3\xe2\xf7\xc2\x5d\xe1\xe2\xf6\xfe\x36\x28\x3b\x97\x8f\x37" + "\xb7\xb8\xef\xef\xe6\x93\xd2\xfe\x6e\x3e\x28\xdf\xdf\xcd\x69\x3c" + "\x1f\x6f\x3e\xca\xfb\xdb\x10\x23\xdf\xdf\xcd\x89\xe2\x7c\xbc\x39" + "\xc4\x3d\x3e\x6e\x08\x75\x85\x8f\xdb\xfb\xbb\x15\x75\x2e\x27\x6f" + "\xb9\xea\xbe\xbf\x5b\x0e\x4b\xfb\xbb\x65\x97\x7c\x7f\xb7\x24\xf2" + "\x9c\xbc\xc5\x6a\xfd\xbb\x35\x4a\xbe\xbf\x5b\x62\xc5\x39\x79\x8b" + "\x97\x7b\x9c\xbc\xd5\xd7\x15\x4e\x6e\xef\xef\x36\x5d\xe7\xf2\xf2" + "\xb6\xf3\xee\xfb\xbb\x6d\x9f\xb4\xbf\xdb\xb6\xc9\xf7\x77\x5b\x2c" + "\xcf\xcb\xdb\x8a\x78\x7f\x1b\x5d\xc8\x9f\xd9\x36\x49\x9c\x97\xb7" + "\x1a\xdc\xe3\xe5\x6d\x46\x57\x78\xb9\xbd\xbf\x4d\xda\xce\xe5\xe6" + "\xa6\x53\xee\xfb\xdb\x94\x2f\xed\x6f\xd3\x5a\xf9\xfe\x36\x4d\xe2" + "\xb9\xb9\xc9\x6a\xfd\xdf\xac\x92\xef\x6f\x53\xa4\x38\x37\x37\x36" + "\xba\xc7\xcd\x4d\x4d\xae\x70\x73\x7b\x7f\xb3\xdf\x12\xea\x44\x7e" + "\xce\x1c\x71\xdf\xdf\xcc\x46\x69\x7f\x33\x0b\xe5\xfb\x9b\x89\xe4" + "\xf9\x39\x93\x7e\xdf\xdf\x34\x52\xca\xf7\x37\xa3\x16\xe7\xe7\xe6" + "\x5a\xf7\xf8\x39\x53\xe7\xf6\x3a\x39\x4d\x1d\xc0\xdc\x5c\x6e\xfe" + "\xc7\xea\x54\xee\x9d\x3b\x1a\xf1\xf9\x1f\x69\x8a\xfd\xb6\x8a\x68" + "\x6e\x19\xda\xa3\xa5\x4b\xe7\x7f\xa4\x3d\x1c\xe7\x7f\xa4\x3d\xe4" + "\xe5\x7f\xa4\x3d\x2e\xc9\x7e\x1e\x9f\xf6\x38\x70\x5f\x23\x64\x7b" + "\xf0\xfa\x9f\xa6\xd8\x71\xdd\xa5\xf3\x42\xd2\x1e\xc2\xbc\x90\x34" + "\x62\xf3\x42\x32\x5b\x3e\x8c\x76\x49\x8b\xd0\x54\xb9\xdb\xf7\x05" + "\xe8\x6e\x9b\xb0\x0e\x91\x9b\x87\x92\xc7\x36\xbd\x91\xc7\x76\xb7" + "\x55\xd2\xd8\xf6\x3c\xd7\xa5\xf3\x50\xd2\x9e\x33\x1d\x63\xdb\x33" + "\x52\x56\xce\x11\xda\x53\x7e\xde\x1b\xda\x73\xd3\x7d\x3d\x94\xed" + "\xc9\xeb\x5f\xba\x5b\x45\xe7\x61\xdb\xc5\xfc\x94\xb4\x67\xb2\x10" + "\xdb\x74\x3a\xc1\x76\x59\x89\x4b\xba\x8b\xee\x26\xf9\xfd\x73\xa7" + "\xef\x83\xd0\x5e\x09\x58\x73\xc9\xcd\x87\xc9\x63\xbb\x7b\x3c\x8f" + "\x6d\xaf\x19\xd2\xd8\xee\xf1\x71\x97\xce\x87\x49\xf7\x18\xe1\x18" + "\xdb\x3d\x82\x64\xe5\x32\xa1\x7b\xec\x90\x8f\xed\x1e\x09\xf7\xb5" + "\x5f\x76\x8f\x52\x1e\xdb\x5e\x7b\x3b\x11\xdb\x2e\xc6\xed\x1e\x93" + "\x84\xd8\xee\x1e\x4b\xb0\xfd\x27\xbd\x4b\x1a\x93\xf6\x4a\x71\xfb" + "\xbe\x0f\xed\x13\x85\xf5\xa5\xdc\xbc\x9c\x3c\xb6\xbd\xc7\xf2\xd8" + "\xf6\xb1\xcb\x0b\xc5\x63\x5b\xb1\xad\x4b\xe7\xe5\xa4\x15\x81\x8e" + "\xb1\xed\xad\x93\x95\x23\x85\x56\x2c\x97\x8f\x6d\x45\xd4\x7d\x9d" + "\x9b\xad\xd8\xc0\x63\xdb\x27\xab\xf3\xb0\xed\x62\xbe\x4e\x5a\xd1" + "\x5f\x88\x6d\xef\xe1\x04\xdb\x87\x27\xb9\xa4\xa7\x69\x9f\x68\xb7" + "\xef\x73\xd1\xfe\xa1\x58\x4b\xcb\xcd\x0f\xca\x63\xdb\xb7\x37\x8f" + "\x6d\x7f\x3f\x69\x6c\xfb\x25\x75\xe9\xfc\xa0\xb4\xaf\xe3\xfc\x3f" + "\xb4\xaf\xa3\xfc\x3f\xf6\xef\x0a\xd3\x7e\xf2\xf3\x5e\xd0\x7e\xa1" + "\xf7\x35\x7d\xb6\x5f\x1c\x8f\x6d\xff\xd9\x9d\x88\x6d\x17\xe3\xb6" + "\x1f\x12\x62\xdb\x57\x49\xb0\xfd\x97\x22\x97\xd6\x0e\x68\x7f\xb5" + "\xdb\xf7\xf5\x68\xa5\x01\xaf\x1b\xc8\xcd\x53\xca\x63\xdb\xff\x2e" + "\x8f\x6d\xe5\x55\x69\x6c\x2b\x27\x76\xe9\x3c\xa5\x74\xc0\x29\xc7" + "\xd8\x0e\x28\x95\x95\xd3\x85\x56\xca\x7f\x0f\x9e\x0e\x30\xdc\x5f" + "\xbf\xc8\x56\xf2\xcf\xbf\xd3\x81\x91\x9d\x87\x6d\x17\xf3\x97\xd2" + "\x01\x75\x42\x6c\xfb\x37\x11\x6c\x1f\xd1\xb9\xb4\x4e\x42\x07\x7a" + "\xba\xbf\x4e\x12\xe4\xc9\xde\xc3\x94\x99\x2f\x95\xc7\x76\xe0\x99" + "\xfb\xb9\x89\xe8\x27\xee\xda\x62\xfb\x7e\x6e\x22\xfa\x09\xbf\x2e" + "\x93\x2f\x95\xee\x99\xeb\x18\xc7\x3d\x53\xe4\xad\x89\xf4\xbc\x2b" + "\x1f\xc7\x3d\x35\xfc\x9a\xc8\x13\xfc\xf3\x2f\x74\x90\xe5\x9b\xe4" + "\x0f\x3e\x67\x11\xfd\xc4\x0e\x87\x39\x8b\xe8\x27\xd2\x1e\x58\x1e" + "\x55\xba\xe7\x5e\x41\xce\x22\x3a\xb0\xc2\xcc\x8e\x85\xa3\x13\x5c" + "\x5b\x57\x09\x52\xba\xbf\xae\xf2\x23\x72\x7f\x57\x66\xde\x56\x7e" + "\x2c\x04\x5d\xe0\xc7\xc2\x8f\x3c\xa4\xc7\x42\xaf\xde\x5d\x26\x6f" + "\x2b\x1d\xbc\xcb\xf1\x58\x08\x4e\x97\xb7\x86\xd2\x4b\x7e\x1e\x18" + "\x3a\xb8\x92\x5f\x43\xe9\xa5\xe4\xc7\xc2\x8f\x62\x3a\x6f\x2c\xf4" + "\xda\xe7\x78\x2c\xf4\xda\xf0\xc0\xf2\xb9\xd2\xc1\x65\xc2\xb1\x10" + "\x74\x96\x8c\x85\x4f\x2a\x5c\x5b\x87\xf9\x91\x4b\xf7\xbf\x85\x63" + "\xa1\x4f\x28\x7b\xef\x5b\x66\xfe\x58\x7e\x2c\xfc\xe8\x2a\x3f\x16" + "\xfa\xd8\xf1\x79\x7e\x2c\xf4\x1e\xd0\x65\xf2\xc7\xd2\x21\xfb\x1d" + "\x8f\x85\x90\x4d\xf2\xd6\x5c\x7a\xfb\xc9\x1f\x0b\x21\xfc\xfb\x4f" + "\xd9\xbd\xf9\xf7\x9f\xe8\x3e\xb3\x3b\x6f\x2c\xf4\xfe\xd8\xf1\x58" + "\xe8\x9d\xf3\xc0\xf2\xca\xd2\x21\x47\x85\x63\xe1\x47\x5a\x32\x16" + "\x8e\x47\xbb\xb6\x6e\xd3\xc7\x09\xfe\xdf\xde\xba\xcd\x53\x6a\xf6" + "\xb9\x00\x99\x79\x6c\xf9\xb1\xd0\xe7\x2e\x3f\x16\x9e\xea\x2d\x3d" + "\x16\x42\x87\x76\x99\x3c\xb6\xf4\x93\x87\x1d\x8f\x85\x27\xf3\xe4" + "\xad\xd1\x84\xf6\x96\x3f\x16\x9e\x6c\xe0\xd7\x68\x42\xd5\xfc\x58" + "\x78\x2a\xb1\xf3\xc6\x42\xe8\x31\xc7\x63\x21\xb4\xe8\x81\xe5\xb7" + "\xa5\x9f\xac\x10\x8e\x85\x3e\x4d\x64\x2c\x7c\x56\xe3\xda\x3a\xcf" + "\x53\xc3\xdd\x5f\xe7\x51\x0d\x67\x9f\x99\x90\x99\x4f\x97\x1f\x0b" + "\x7d\x3d\xf8\xb1\xa0\x1a\x20\x3d\x16\x7e\x3c\xb6\xcb\xe4\xd3\xa5" + "\xfb\x1e\x77\x3c\x16\xfa\x96\xc8\x5b\xd3\xf9\xf1\x00\xf9\x63\xa1" + "\xaf\x8e\x5f\xd3\xf9\xf1\x70\x7e\x2c\xa8\x52\x3b\x6f\x2c\xfc\xf8" + "\x94\xe3\xb1\xf0\xe3\xd2\x07\x96\x67\x97\xee\x7b\x56\x38\x16\x9e" + "\x32\x90\xb1\xf0\x8f\xe9\xae\xad\x0b\xa9\xa2\xdc\x5f\x17\x7a\x3a" + "\x8a\x7d\x9e\x44\x66\x5e\x5f\x7e\x2c\x84\xf9\xf1\x63\xe1\x69\xe9" + "\xef\x3c\xd0\xfd\x5e\xea\x32\x79\x7d\xe9\x30\xc7\xdf\x3f\xa2\xc3" + "\x1c\x7c\xff\x48\x6c\x0d\xa8\xdf\x50\xf9\x63\x21\xcc\xc8\xaf\x01" + "\xf5\xe3\xdf\xff\xa3\x9f\xce\xea\xbc\xb1\xd0\xcf\xf1\xf7\x1f\xe8" + "\x7e\x4e\x7c\xff\xc1\xc5\x7c\xbf\x74\x98\x56\x38\x16\xc2\x3c\xc9" + "\x58\xa8\xa8\x75\x6d\x1d\xe9\xe9\x76\xd7\xff\xb1\xce\x6f\x0b\xb2" + "\x5f\x47\xaa\x6c\x88\x44\xcf\xbe\x86\xc7\x42\x7f\xbd\x31\xdf\xbb" + "\x10\xe7\x17\x36\xa9\xb8\x1c\x94\xeb\xb8\x1c\x2f\x7a\x23\xc9\x41" + "\xa9\x33\xdd\xcf\x41\x49\x72\x7f\x20\x0a\xbf\x0b\x8c\xdf\x09\x36" + "\x2a\x49\xfe\x49\x06\x3f\x13\x85\x9f\x91\xaa\xaf\x60\xf3\xab\xa4" + "\x1b\xa1\xef\x57\xda\xc9\x3f\x19\xa7\x45\x95\x71\xab\x91\x31\x30" + "\x53\xc7\xbe\x27\x4c\xf7\xdf\xc0\xe6\x9f\x7c\x3d\xa4\x4f\xf6\x37" + "\x28\x28\x00\xe7\x9f\x8c\x63\xcc\x99\x5a\x46\x57\x65\x40\x50\x16" + "\xec\x1b\xcf\xe5\xa0\xa4\xfb\x5f\xc7\x7d\x37\xbe\xae\xee\xb3\xfb" + "\x1b\x89\xfc\xc2\x74\x7f\xf9\x79\x60\xe9\xfe\x25\xfc\xfa\x4e\xff" + "\x06\x1e\xa3\x03\xd8\x39\x18\x8e\xa7\x57\xc6\x42\x8c\xd9\xf2\xaf" + "\xd9\x6d\xae\xe4\xde\xa0\xf1\xd4\xd9\x9e\xcf\xd8\x67\x44\xec\xe2" + "\x17\xef\xb3\x67\x4a\x8d\xf9\x8a\x10\x9c\xe7\xd8\x79\x9f\x75\xbb" + "\xfd\x60\x7c\xf6\x4c\xa4\xf3\x3e\x7b\x66\x8f\xd0\x67\x62\xeb\x10" + "\xcf\x6c\x96\xef\xb3\x67\xa6\xf3\xeb\x10\xcf\x14\xf2\x3e\x7b\xa6" + "\x91\xf8\xec\x99\x08\xe2\xb3\xca\x4d\x6d\xae\xe4\xef\xa0\x9f\x69" + "\xf7\xfd\x6f\xac\x9b\xda\x82\xec\x75\x39\xef\x33\xf5\x6c\xf0\x59" + "\x21\xce\xb7\xec\xbc\xcf\x7c\xea\x1f\x8c\xcf\x7e\xd2\xe4\xbc\xcf" + "\xd4\x33\x6c\x7c\x26\xa2\x97\xd5\xf2\xbf\xd9\x49\xab\xbd\x78\xbd" + "\xac\x8e\xe6\x7d\xa6\x2e\x22\x3e\xfb\x49\x03\xf1\xd9\xe9\x43\x6d" + "\xae\xe4\x00\xa1\xd5\x89\xed\xfb\x8c\xbd\xa7\xef\x60\x9c\x0d\x52" + "\x1a\xf3\x41\x63\x82\x7e\x74\xde\x67\x81\x5f\x3c\x18\x9f\x0d\x2c" + "\x71\xde\x67\x83\xbc\x85\x3e\x13\xd3\x75\x03\x6f\xc9\xf7\xd9\xc0" + "\xa3\xbc\xae\x1b\x84\x78\x9f\x0d\x8a\x21\x3e\x1b\x58\x48\x7c\x56" + "\xa5\x6d\x73\x25\x8f\x08\x3d\xa8\xdd\xf5\x2f\xcc\x43\xdb\x82\xec" + "\x75\x0e\xef\xb3\x67\x4f\x80\xcf\x0a\x71\xfe\x69\xe7\x7d\x36\x72" + "\xcb\x83\xf1\xd9\xb3\xd3\x9d\xf7\xd9\xb3\xc7\x6c\x7c\x26\xa2\x3f" + "\x9e\xdd\x27\xdf\x67\xcf\xa6\xf0\xfa\xe3\xd9\x43\xbc\xcf\xc2\x3d" + "\x89\xcf\x9e\x8d\x26\x3e\xab\xf1\x6d\x73\x25\x17\x09\xfd\x6c\x4d" + "\xfb\x3e\x63\xef\xc1\x3a\x18\x67\x83\xd3\x8c\xf9\xc0\xd9\x81\x8f" + "\x3b\xef\xb3\x59\xe3\x1f\x8c\xcf\x06\x7b\x39\xef\xb3\xc1\x4b\x84" + "\x3e\x13\xe3\xc9\x83\xe5\xe7\xc1\xa6\x07\xf7\xe7\x79\xf2\xe0\x44" + "\xde\x67\x83\xcb\x89\xcf\x06\x23\xe2\xb3\x33\x91\x6d\xae\xe4\x33" + "\xa1\x07\x4b\xe6\xff\x72\xc4\x1b\x2d\xcf\xe5\xf3\x7e\x1b\x12\xd1" + "\x75\xb8\xe3\x73\x1a\xe7\xfd\x36\x64\x60\xfb\xdc\x71\x48\xa0\x7c" + "\xbf\x3d\x57\xc7\x73\xc7\x21\x2a\xde\x6f\x43\x52\x88\xdf\x9e\x2b" + "\x77\x8f\x3b\x0e\x69\xf7\xfd\x57\x31\xee\x68\xef\xb7\x88\xc6\xae" + "\xc3\x1f\x23\xd2\x9c\xf7\x5b\xc4\xa5\xf6\xf9\x63\xc4\x29\xf9\x7e" + "\x8b\xc8\xe3\xf9\x63\x44\x2d\xef\xb7\xa1\x6a\xe2\xb7\x88\x14\xf7" + "\xf8\x63\x84\x64\xfe\x37\x47\xfc\xd1\xde\x6f\xc3\x4a\xba\x0e\x87" + "\x1c\x16\xe1\xbc\xdf\x86\xed\x68\x9f\x43\x0e\x5b\x27\xdf\x6f\xc3" + "\xa2\x79\x0e\x39\x2c\x87\xf7\xdb\x30\x2d\xf1\xdb\x30\xb5\x7b\x1c" + "\x72\xd8\x01\x57\x38\xa4\xbd\xdf\x86\xc7\x76\x1d\x1e\xf9\xd3\x46" + "\xe7\xfd\x36\x7c\x5a\xfb\x3c\x72\xb8\xfc\x6f\x16\xd3\xc3\x3d\x79" + "\x1e\x39\x7c\x12\xef\xb7\xe1\xe4\x1b\x2c\xf4\x4f\xb5\xee\xf1\xc8" + "\xe1\xed\xe6\xff\x10\xe3\x91\xf6\x7e\x1b\xa9\xec\x3a\x5c\x72\x84" + "\x0c\xfe\x3f\xd2\x96\xff\x8b\x70\xc9\x11\x2e\xf0\xff\x11\x47\x79" + "\x2e\x39\xd2\x8a\xff\x8f\xe4\xf8\xff\x88\x42\xf7\xb8\xe4\x48\x27" + "\xf8\xbf\x3d\x97\xb4\xf7\xdb\xf3\x15\x5d\x87\x4f\x3e\x1f\xeb\xbc" + "\xdf\x9e\x3f\xde\x3e\x9f\x7c\x5e\xfe\x77\xa0\xe8\xe7\x53\x79\x3e" + "\xf9\x7c\x39\xef\xb7\x48\x2f\xe2\xb7\xe7\x63\xdc\xe3\x93\xcf\x4b" + "\xe6\x7f\xb4\xf8\xcd\x14\xe4\x5d\xc8\x88\xac\x43\x9e\x4e\x8c\x24" + "\xb9\x09\xe9\xd1\x85\xa6\x60\xef\x42\xb9\xdf\x77\xb1\xe4\x9c\x3e" + "\x05\x6a\xbf\x9e\x1e\x3d\xd4\xad\xbc\xd3\xf4\xa8\x4b\x6e\xe7\x9d" + "\xa6\x47\x1d\xec\xb0\xef\xbb\xd0\xa3\xf2\x65\xe7\x9d\xa6\x47\xc5" + "\xf1\x1c\x74\xd4\x5e\xde\xd7\xa3\xd9\xe7\x13\x64\xe5\xa3\xa6\x47" + "\xf5\x77\x2b\x1f\x35\x3d\x7a\x20\xc1\x57\x64\x03\x9b\x8f\x9a\x1e" + "\xad\xea\x94\xef\xbe\xd0\x91\x39\x38\x1f\x35\xb3\xe5\x8b\x04\x97" + "\xf2\x23\xd3\xa3\xf7\xb6\x8f\x67\x45\x08\x23\xb2\x46\xcb\xe3\x79" + "\x6c\xa2\x29\x58\x11\x22\xf7\x3b\x33\x42\x3c\x8f\xf5\x70\x0f\xcf" + "\x63\x3e\x76\x1f\xcf\x63\xd6\x76\xd8\x77\x66\xe8\x31\xf3\xe5\xe3" + "\x79\x4c\x04\xcf\xcd\xc7\xa4\xf2\x78\x1e\x5b\x2a\x1f\xcf\xff\xa5" + "\x77\x0f\xcf\x63\x5a\x08\x9e\xff\xeb\x10\xc1\xf3\x18\x5d\xa7\x7c" + "\x7f\x86\xfe\xaf\x38\x82\xe7\xb3\x07\x5c\xca\x3f\x4d\x8f\x4d\x75" + "\x02\xcf\x85\x8c\xc8\xfa\x35\x8f\xe7\xa8\x48\xc0\x73\xa1\xdc\xef" + "\xdd\x08\xf1\xfc\xc2\x19\xf7\xf0\xfc\xc2\x3a\xf7\xf1\xfc\xc2\xe4" + "\x0e\xfb\xde\x0d\xfd\xc2\x08\xf9\x78\x7e\x01\xf1\x9a\xe5\x85\x09" + "\x3c\x9e\xa3\xd2\xe4\xe3\xf9\x67\x27\xdc\xc3\xf3\x0b\xa7\x08\x9e" + "\x7f\xb6\x81\xe0\xf9\x05\x4d\xa7\x7c\x07\x87\xfe\x59\x04\xc1\xf3" + "\x97\x7a\x97\xf2\x7b\xd3\x51\x92\xf9\x8f\x79\x3c\xfb\x84\x30\x22" + "\x6b\xfb\x3c\x9e\x7f\xee\x65\x0a\xf6\x09\x91\xfb\xdd\x1d\x21\x9e" + "\xc7\xbb\xf7\x9d\x0b\x7a\xbc\xfb\xdf\xb9\xa0\xc7\xbb\xf1\x9d\x0b" + "\x9b\xef\xee\xd0\xe3\xbb\xc9\xc7\xf3\xb8\x1a\x5e\xcb\x8d\x0f\xe2" + "\xf1\xfc\xf3\x49\xf2\xf1\x3c\x2e\xcf\x3d\x3c\x8f\x27\xdf\xbf\xa0" + "\xc7\x4d\x27\x78\x1e\x9f\xd3\x29\xdf\xe3\xa1\xc7\x21\x82\xe7\xf3" + "\x63\x5c\xca\x9f\x4e\xff\x3c\xc8\x09\x3c\x17\x32\x22\xf7\x3d\x78" + "\x3c\x4f\xac\x05\x3c\x17\xca\xfd\xfe\x8f\x10\xcf\x13\x97\xb8\x87" + "\xe7\x89\x61\xee\xe3\x79\xc2\xf5\x0e\xfb\xfe\x0f\x3d\xe1\x9c\x7c" + "\x3c\x4f\x28\xe1\x35\xee\x04\xab\xfb\xff\xbf\x08\x91\x8f\xe7\x09" + "\xee\x7d\x17\x88\x9e\x98\x44\xf0\x3c\x81\x7c\x17\x88\x9e\x18\xd7" + "\x29\xdf\x05\xa2\x7f\x5e\x43\xf0\xfc\xf5\x06\x97\xf2\xd3\xd3\x13" + "\x1b\xda\xc7\xb3\x6f\x08\x23\x72\x4f\x88\xc7\xf3\xa4\x52\x53\xb0" + "\x6f\x88\xdc\xef\x10\x09\xf1\x3c\x69\x9c\x7b\x78\x7e\xf1\x96\xfb" + "\x78\x7e\xf1\x58\x87\x7d\x87\x88\x7e\x71\x9f\x7c\x3c\xbf\x68\xb9" + "\xff\x07\xf1\xf9\x45\xab\xfb\x7f\x93\xe4\x7f\x9f\x88\x7e\x71\xb8" + "\x7b\x78\x9e\x34\x8a\xe0\xf9\x17\x7a\x82\xe7\x49\x11\x9d\xf2\x7d" + "\x22\xfa\x17\x25\x04\xcf\x17\x2a\x5d\xca\xff\x4f\x4f\x6a\xf7\xf9" + "\x0f\xb1\xf5\x0d\xcb\xba\x14\x8f\xe9\x5f\xa6\xbb\xbf\xc6\xf1\xcb" + "\x60\xf7\x30\xfd\xf2\x49\xf7\x31\xfd\x72\x6e\xc7\xad\x71\xbc\x2c" + "\xff\x5b\x7f\xf4\xcb\x13\xf8\x35\x8e\x97\x37\xf1\x98\xfe\xe5\x51" + "\xf9\x98\x7e\xd9\xcb\x3d\x4c\xff\xd2\x8f\x60\xfa\xa5\x0a\x82\xe9" + "\x5f\x7a\x76\xce\x1a\xc7\x4b\xa9\xee\xad\x71\xfc\x72\x93\x2b\x6b" + "\x1c\xf6\x98\x9e\x12\xe3\xfe\x3a\xc7\xe4\xab\xee\x61\x7a\xf2\x0e" + "\xf7\x31\x3d\x79\x7e\xc7\xad\x73\x4c\x9e\x2c\x1f\xd3\x93\x43\xf8" + "\x75\x8e\xc9\xb3\x79\x4c\x4f\xc9\x91\x8f\xe9\xe8\x3a\xf7\x30\x3d" + "\xf9\x12\xc1\x74\x74\x11\xc1\xf4\xe4\xda\xce\x59\xe7\x88\x9e\xe4" + "\xde\x3a\xc7\x94\xd9\xae\xac\x73\xd8\x63\x7a\x5a\x7f\xf7\xd7\x3a" + "\x62\x8e\xb9\x87\xe9\x98\x85\xee\x63\x3a\x66\x54\xc7\xad\x75\xc4" + "\x84\xc9\xc7\xf4\xd4\x26\x7e\xad\x23\x26\x82\xc7\xf4\xb4\x04\xf9" + "\x98\x9e\x5a\xe6\x1e\xa6\x63\x0e\x13\x4c\x4f\x4d\x21\x98\x8e\x39" + "\xd0\x39\x6b\x1d\x53\x43\xdd\x5b\xeb\x98\x16\xe1\xca\x5a\x87\x3d" + "\xa6\x7f\x65\x70\x7f\xbd\xe3\x57\xb9\xee\x61\xfa\x57\xe3\xdc\xc7" + "\xf4\xaf\xfc\x3a\x6e\xbd\xe3\x95\xbb\xf2\x31\xfd\x8a\x86\x5f\xef" + "\xf8\x95\xd5\xfb\xff\xd3\x23\xe5\x63\xfa\x95\x0d\xee\x61\xfa\x57" + "\x9b\x09\xa6\x5f\x99\x40\x30\xfd\xab\xac\xce\x59\xef\x98\xa6\x73" + "\x6f\xbd\x63\x7a\xbb\xf9\x2f\xc4\xd6\x3b\xec\x31\xfd\x6a\xa5\xfb" + "\x6b\x1e\xaf\xce\x77\x0f\xd3\xaf\x06\xbb\x8f\xe9\x19\x97\x3a\x6e" + "\xcd\x63\xc6\x29\xf9\x98\x9e\x91\xc7\xaf\x79\xcc\xb0\x7a\xfe\xe9" + "\xd7\xbe\xf2\x31\x3d\x23\xd6\x3d\x4c\xbf\x3a\x87\x60\x7a\x46\x08" + "\xc1\xf4\xab\xd3\x3b\x67\xcd\x63\xfa\x09\xf7\xd6\x3c\x5e\xad\x75" + "\x65\xcd\xc3\x1e\xd3\x33\x4b\xdc\x5f\xf7\x98\x39\xca\x3d\x4c\xc7" + "\x5e\x75\x1f\xd3\xb1\x87\x3b\x6e\xdd\x23\x76\x97\x7c\x4c\xc7\x26" + "\xf2\xeb\x1e\xb1\x7c\xfe\x7b\x7a\xa6\x56\x3e\xa6\x63\xc3\xdd\xc3" + "\xf4\xcc\xa1\x04\xd3\xbf\x6e\x22\x98\x9e\xa9\xee\x9c\x75\x8f\x5f" + "\x17\xba\xb7\xee\x31\xd3\xee\xf9\xb7\x65\xf3\x17\x25\xa8\x16\x2f" + "\x58\xb0\x6c\x7e\xaa\x6a\x59\x72\xd2\x1b\xf3\xc7\x0e\xb0\xfc\x1e" + "\x1b\x91\x36\x20\x4d\x81\x12\x16\xc6\xbf\xbe\x62\x18\x7f\x30\x79" + "\xfe\x22\xf8\xa3\x40\x89\xf1\xcb\x12\x55\xa9\xab\x52\xe6\xab\xf0" + "\xaf\x85\x6f\xa4\x40\x91\xc5\xa9\xfc\x9e\xc9\xcb\x93\x53\x93\x52" + "\x92\xe7\xab\x26\x4c\x1e\x37\x78\xfa\xc4\x5f\x4d\x7f\xe1\x05\x05" + "\x42\x56\xdf\x91\x56\x31\x79\xe1\x18\xe3\x9e\x57\xe8\xf9\xf3\xab" + "\x40\x2d\x6d\x03\x9c\x6d\x5f\x8a\x94\x5b\x96\x22\xcf\xcd\xb7\x91" + "\xd7\xb6\xdb\xc8\xd7\xfc\x6e\x4d\x88\xea\x2d\x14\xc9\x04\x46\x69" + "\xb7\xdf\x46\x41\xe6\xdc\xb5\x71\x4c\xee\x2a\x95\x2e\x70\x9e\x12" + "\x97\x65\x02\xe3\xa3\xf0\x7e\xb0\xab\x27\x93\x9b\x59\x53\x4f\xcf" + "\x9f\x00\xc7\x74\x99\x57\x11\xc5\xf8\xbf\x56\xfb\xa1\x59\x47\x1d" + "\xc7\x77\x4b\xa1\xdf\x88\x9e\x55\x03\xdb\x51\x44\xcf\x4e\x86\x2d" + "\x1d\xb6\x0a\xd8\x74\xb0\x19\x10\x3d\x27\x01\xb6\x52\xd8\x6a\x61" + "\x6b\x80\x0d\xf6\xcd\xf5\x85\x2d\x08\x36\xd8\x3f\x17\xca\xce\x85" + "\x63\x73\x75\xa4\x9e\xb9\x70\xfc\xf5\x34\xd8\x4a\x60\x2b\x47\x74" + "\x1c\xd4\x19\xb7\x15\xd1\xf1\x21\xf0\x77\x2f\x6c\x65\xb0\xe1\xfd" + "\x67\x61\xc3\x75\x19\xc9\xb1\xf8\x13\x88\x9e\x87\x60\x53\xc1\x36" + "\x06\xb6\x14\xd8\x36\xc0\x96\x03\x5b\x21\x6c\xd0\xbe\x79\xb8\x0c" + "\x5c\xeb\x0d\x38\xf6\x06\x5c\xe3\x8d\x22\xd8\xf4\x88\x4e\x88\x85" + "\xed\x00\x82\x3e\x92\x2d\x01\xf6\xcd\x57\xf3\xbf\xe7\xcf\x0e\x58" + "\xf7\x63\xad\x66\x90\x11\xc6\xd8\xec\xc1\xcc\x7a\x44\x33\xb9\xf3" + "\x74\x29\x83\x90\xc7\x35\x7a\x56\x4b\xf5\x06\x04\xb1\x61\x95\x4a" + "\xb3\xba\x15\x8e\xcf\x62\xef\x7d\x37\x67\xcf\x32\x68\x51\x4a\x0e" + "\x1e\x4b\xf2\xb0\x34\xcb\x40\xce\x9f\x1d\xa9\xf5\xe8\xb9\x17\x9f" + "\xcf\xbc\xdb\xad\x82\xc9\x8c\xdd\x89\xdf\x99\x85\xfa\x6b\xf0\x3b" + "\xb5\x4c\x4e\xb7\x09\x8c\x2f\x73\x14\xc7\x03\xcd\x6a\xdc\xae\x59" + "\x67\xc8\xd8\x81\xe3\xd0\x36\x5d\x60\x4d\x08\x8c\x15\x4f\xfc\x9b" + "\x01\x9f\x32\x25\x23\x4b\x49\x8c\x98\xcd\x3e\x3b\xd8\x1a\xac\x4a" + "\xc1\xc7\x5a\xf6\x18\x4a\x98\xbd\x3e\x91\x9a\x45\xad\xa8\x81\x9e" + "\x75\x1a\xfa\x46\x41\xbc\xa2\x98\x7e\x86\x12\x73\x81\x2a\xe5\x08" + "\xf8\x19\x97\xfb\x6b\x46\x23\xfe\x5b\x89\x8f\x33\x79\x61\x91\x78" + "\xcd\x46\x93\xf1\x01\xc4\xd0\x59\x67\x5a\x83\x47\xe6\xa8\x5e\x09" + "\x60\xea\x49\xdb\xa0\xdc\xec\x04\x4b\x5b\x5a\x03\x6b\x54\xb8\x7e" + "\x46\xf5\x7c\x0c\x1c\xf3\x84\xb6\x29\xa1\x1d\x1e\x37\xe0\x3c\x06" + "\xda\xa8\x79\x05\x5f\x77\xce\x1c\x68\x2b\x95\x39\x0d\xea\xfe\xe0" + "\xf9\x98\x8f\x56\x1b\x28\x7c\xcc\x9c\x53\x13\x02\x78\xf6\x65\xb2" + "\x67\x36\xbd\xdf\x13\x79\x16\xbf\x8b\xd0\xee\x77\x91\x57\x73\xf6" + "\x9c\xe9\x5a\xfa\xfb\x31\x24\x4e\xcd\xaa\xa1\xa0\x8c\x96\x9e\x13" + "\x01\xfd\xd4\xb1\xd7\x0a\x7a\x52\xe3\xe0\x5a\x7b\xee\x5f\xab\xe0" + "\x49\x0d\xbe\x16\xb1\x51\x4d\x08\x67\x2b\xb6\x0e\x73\x49\x4b\x0c" + "\xb6\x1f\xb6\x9d\xa5\x0e\x73\xae\xa5\x8e\xd9\xc7\xf1\xf9\x70\xcd" + "\x3c\xe6\x83\x96\x18\x73\x41\xbf\x1a\xe8\x73\x0a\x3e\x1e\xb0\x0e" + "\xe9\x19\xf8\x8b\xaf\xcf\xf9\x42\xc9\x50\x59\x08\xd7\xcf\x70\xfb" + "\x00\x3b\x4a\x38\xb7\xce\xbc\x5e\x85\xf0\x3c\xd2\x44\xcf\xdd\xc6" + "\xbc\x9b\x69\x60\x94\xdd\x0b\x89\x8f\xe7\x8e\x58\x55\xc3\x98\x61" + "\x33\x0d\xa9\x41\x1e\x9a\x57\xb0\x7f\xe7\x4e\x57\x4d\xe9\x01\x36" + "\x9e\x3b\xe3\xbe\x6d\xc3\x9e\x9f\x04\xf6\x51\x16\xf7\x84\xf1\xfc" + "\x5b\xdf\xad\x0c\xa5\x42\xd8\x3f\xd8\x56\x60\x27\x04\xfb\xbd\x30" + "\x4e\x9b\xb3\xe7\x6e\xb0\xb1\x97\xf2\xe5\x69\x99\xcc\x90\x18\x5c" + "\xb7\x1e\xd7\x3d\x59\x07\x73\xab\xc5\xbf\x50\xfe\x90\xd6\xc3\xf7" + "\x04\x2e\xaf\xea\xc7\x62\xee\x0c\xf1\x2b\xc1\x16\xb6\x1f\x13\x1c" + "\x8e\xcb\xd7\xcc\x18\x88\x94\x01\x35\x88\x52\x65\xf4\x2f\x27\x58" + "\x08\x8b\xb4\xd4\xc3\xf6\xb1\xc0\xaf\xc4\xb4\x1e\xe6\xc5\xfb\xf8" + "\x7b\x3d\xc2\x94\xdb\x3d\x07\xca\xe9\x5a\xf2\xfb\x68\x98\x9c\xee" + "\x39\xf8\x5d\xf1\x7a\xfa\x75\xf6\x19\x28\x66\xbd\x17\x22\x36\xea" + "\x9e\x97\x91\xcc\xe8\x32\x6e\xc1\xb5\x7a\x85\xe9\xfe\xba\x42\x07" + "\xfe\xea\xa3\xc1\x78\x38\x72\xcf\x40\xe1\xfc\x7d\x10\x87\xfc\x77" + "\x43\x5f\x77\x01\x26\xa0\xaf\x08\xd7\xdb\x9c\xfd\x7a\x0a\xdf\xd7" + "\xd7\x83\x30\x36\xe0\x1a\xdc\xb5\xa1\xde\xf5\x70\x8d\xdc\xee\xa5" + "\x50\xae\x50\xeb\x51\xae\xb2\xd8\x84\xbd\x36\x5f\x8e\x1b\x4b\xaf" + "\x6f\xd5\x05\x76\x2f\x6d\x5b\xc1\xd4\x6c\xff\x0a\xea\x5f\x8f\x98" + "\xd6\x7b\x4c\x65\x7a\x0c\x63\xc8\x7e\x15\x3f\x93\x58\x87\x32\xe3" + "\x51\xa8\xcf\x3a\x46\x37\xd5\x84\x02\x7c\xea\x02\x98\xd3\x31\x75" + "\xec\x77\x0c\xd2\x6b\x98\xc6\xaa\x94\xa3\x28\xfd\x32\xf2\x5d\x9b" + "\x84\x82\x32\x63\xa0\x2f\x95\x8c\xa1\x3a\xad\x0e\x55\xe9\x61\x4b" + "\x39\x0d\xe5\xce\xc1\x76\x14\x65\xae\x42\x9e\x53\x60\x8e\xca\xb8" + "\x8b\x7c\xab\x52\xee\xc2\xbe\xeb\x28\x3d\x8e\x31\x9e\xae\xc4\xe5" + "\x4e\xa2\xa9\x46\x5d\xc0\xda\xeb\xe0\xd3\x57\xf1\xfb\xd7\x17\x50" + "\x31\xb4\xa5\x35\x70\x6d\x4c\x4b\x6e\x66\xed\x9d\x15\x8c\xb1\x39" + "\x3b\x2e\x41\x8b\xc6\x44\x08\xfa\x82\xdb\xdc\x8a\x10\xf8\xcd\x03" + "\x97\x31\xe7\xf7\x2e\x7b\xdd\x88\xe3\x4b\x5c\x2c\x70\x04\x64\x39" + "\x8e\x8f\xe9\x82\x7b\x97\xc1\xfe\x0d\x53\x8d\x4c\x33\xb6\x0f\xee" + "\x37\xd8\x68\x2f\xd7\xff\xbd\x74\x0a\xf2\x84\x6b\x54\x68\x3d\xfe" + "\x6a\xc4\xd7\x80\x3a\xbb\x03\xde\x67\x63\x6c\x70\xc7\x1a\xb4\x1e" + "\x47\x26\xf0\x78\x99\x53\x02\x18\xe9\x6e\x69\x4b\x73\x76\xbc\x27" + "\x9c\x1b\x6d\x85\x27\x8c\x8f\xfb\xc7\xb9\xf9\x0a\xc7\xa6\x04\x33" + "\x8e\xad\xe0\x31\x53\x70\x58\x14\x8c\x99\x32\xe6\x4e\x88\x2f\x43" + "\x31\x86\x29\x46\xc6\x60\xce\xf7\xd5\xc1\x9c\xe4\x5b\x6d\xd4\x73" + "\xe5\xe3\xf7\xc3\x58\x2b\x27\xcf\x7b\xc6\xe7\xe2\x3a\x81\x87\xa4" + "\x64\xdf\x46\xca\xa9\x35\x8c\x01\x8f\x5f\x73\xee\xf9\x88\xec\xa5" + "\x28\x88\xc9\x0f\x8b\x30\x07\x87\xc6\xb4\xec\x19\x59\x82\x63\x2c" + "\xc6\x2f\x93\x03\xe7\x72\xf5\xc0\x75\xbb\x69\xe9\xf8\x44\x33\x9c" + "\xcf\xe4\xf9\xea\x38\x1c\xb0\xf1\x90\xc4\xd1\xf8\x44\x26\x0c\x8e" + "\x6d\x65\xf2\xe0\x58\xb7\x7a\x3a\x5e\x0f\xfb\x11\xfc\xae\xd4\x64" + "\xdc\xc6\x75\xb0\x71\x1f\x7e\xe7\x08\x7e\x53\xd8\x9e\x73\x9a\xf0" + "\xf8\x27\x9c\x71\x5e\x6f\x7e\x4c\xb3\xfd\x65\xc7\x55\x6b\xb0\x1f" + "\x6a\xce\x9e\x17\xae\xf5\xe8\xe5\xc5\xd9\xd8\x43\xcf\xc6\x24\x88" + "\x2b\x7b\x46\x96\x7e\x16\x83\xd0\x67\x95\x08\x97\x89\xd1\x7a\x84" + "\x84\xf2\xb6\x9c\x97\x84\xcb\xb2\xed\x84\xb1\x69\x5e\xcf\xcd\x01" + "\x70\x0e\x8c\x1b\x2d\x8e\x39\x24\xb6\xcd\x4b\xc0\x71\x07\xc6\xdd" + "\x24\x12\xf7\x5b\xd4\xd0\x2e\x23\xd3\x73\xb4\x12\xda\x95\x55\xcf" + "\xb5\xc5\xba\x6d\x96\x38\xc3\xe4\x8e\xce\x21\x65\xbb\x97\xc1\xf5" + "\x6b\xe0\xfa\x7a\x6b\xac\x91\x7e\xbd\x31\x71\x48\x25\xfc\x0f\xbc" + "\xc3\x52\x17\x8c\x55\x2f\x18\xa3\xcf\x60\x4c\xe1\xf1\xb9\xe3\x5d" + "\xcc\x25\x46\x17\xb6\xe4\x8e\x2e\x69\xce\x7e\x23\xc4\x32\x4e\xcd" + "\x2b\x98\x5a\xf0\x2b\x32\xdf\x63\xce\x6e\x07\x5f\x4e\x35\xd1\xcc" + "\xeb\xa6\x70\x04\x1c\xd3\x58\x0c\xfb\x8b\x57\x60\x8e\x16\x37\x1d" + "\xc6\xb2\x97\x78\x59\x4f\x84\xcb\xb1\xe5\xb9\xb2\xad\x81\xa3\x0b" + "\xd9\x36\x53\xb4\x19\xda\xe7\x61\x69\x53\x6b\x60\xf7\x22\xb8\x76" + "\x9e\xd6\xa3\x47\xb4\x60\xbc\x64\x9b\xcb\x18\x26\x16\xe3\x8a\x86" + "\xbe\x1c\x81\xbf\x3d\x38\x1c\xfb\x7c\x06\x25\x26\x4c\x86\xb1\x02" + "\xfe\x7e\xbf\x17\x03\xf1\xf4\x8d\xb3\x5a\x14\xe7\x89\xcf\xdf\x02" + "\xbf\xf1\x7e\x5c\x06\xf6\x37\xc1\x7e\xce\x36\x73\x11\xf6\x9f\xb0" + "\xde\x84\x40\x52\x2f\xdb\x16\x1f\x5c\x27\x3e\x0f\xd7\xb9\xab\x80" + "\x69\xc2\xf5\x34\x67\x27\x44\x58\xea\xde\x06\xfb\x2c\xf5\x4f\x58" + "\x68\xb9\x46\x42\x0c\x1c\x4f\xb7\x6e\xfb\x8e\x02\x46\x4f\xda\x95" + "\x90\xac\x45\x89\x75\xf8\xd8\x66\xd8\x87\xcf\x25\x18\x49\xd8\x8c" + "\xf1\xa3\x25\xfd\xa1\x09\x8e\x12\x0a\xb5\xe8\xcd\x04\xeb\x18\x0f" + "\x7e\xf2\xe3\xe6\x27\x1d\x57\xdf\x51\x4b\x7d\x7c\x5d\xa4\x0e\x26" + "\xe7\xbf\x36\x71\x63\x04\x8f\x65\x5f\x5c\x3f\x94\x87\xfe\xcf\x3b" + "\x40\xda\x36\xa7\x49\x4f\x30\x0f\xb6\x67\xcf\x21\x78\xc8\x7e\x6d" + "\xb8\x65\x2e\x07\x5f\x14\x36\x67\xcf\x57\xd9\xcc\x4d\x5e\xb0\x7f" + "\x13\xa9\x6f\xfe\x18\xf0\x93\xaf\xc0\x4f\xeb\x59\x8c\xb1\x3c\x0b" + "\xb7\xd3\xb2\x9f\xcc\x35\x61\x71\x70\x0d\x4f\x73\xf6\x6b\xbf\xc0" + "\xf3\xdf\x7b\xbd\x98\x46\xa8\x23\xcb\x52\x3f\xd4\xed\x09\xb6\xfc" + "\x19\xec\xcb\xd3\xa2\x45\x6c\xdf\xb3\xa1\x8c\x96\x7e\x4d\xf2\x9b" + "\xb7\x19\x61\x88\xaa\x2e\xd2\x62\x6d\x87\xc7\xf2\x98\xea\x50\x3d" + "\xaa\x2e\x32\x23\xf3\x07\x2d\x35\x51\x19\x8c\xe6\x0a\xbd\x20\xb0" + "\xca\xd0\x88\xe4\x71\xbc\xf9\xec\xfb\x6f\x4c\x2b\x68\x90\xf4\x61" + "\x08\xcf\xf9\x37\xe8\x37\xc7\x55\xeb\x6e\xb3\x71\x0d\xfe\x1f\x8c" + "\x8f\xbf\x07\x9a\x05\xeb\x16\xd0\xa6\x89\x39\x14\xd1\x2e\x66\x28" + "\xbb\x1b\xef\xc7\xba\x06\x34\x55\xb1\xd5\x31\xe6\x03\x43\x0c\xb1" + "\xcd\x82\x16\x76\x9e\xc3\xed\x35\xbe\xa8\xc1\x6d\x36\x97\x18\x62" + "\x70\x1f\x32\xd3\x18\x73\xb5\xb1\x59\x53\xa5\x37\x21\xd5\x0a\xac" + "\xb9\x16\x9c\x9b\xba\x0b\x31\x10\xf7\x62\xe4\xf5\x61\x01\xfb\xfc" + "\x07\xe8\xd2\x1b\xba\x30\x43\x4c\xa6\x09\x51\xdb\x33\xba\x79\xfd" + "\xbc\x88\xd1\xdc\xe9\xd7\x52\xd3\x9c\xbd\xc0\x70\x1c\xac\x2a\x9f" + "\xff\x2e\x30\x58\xfa\xbe\x9b\xeb\x3b\xec\x63\xbf\xd9\x35\xa4\x30" + "\x8b\xed\xaf\x96\x7e\x53\x72\xad\x97\x59\x1f\xc0\x7c\x56\x64\x44" + "\xcb\x8a\x98\xd6\x65\xbb\x10\x65\x2a\xf0\x8f\xf8\x68\x77\x2d\x8e" + "\xe1\x51\x16\x7b\xb2\xb6\x03\x3d\x9e\x92\x81\x94\xd7\xe8\x37\xcf" + "\x4f\x4d\xcf\x62\xbf\x61\xf4\x29\x94\x93\xd7\xd6\x37\xd9\xe7\x9f" + "\xab\x40\xe7\x4e\x35\x66\x32\x64\x1e\x4a\xf4\x98\xc2\xd5\x87\x8f" + "\x59\xfc\xb7\x9b\xd3\x9f\xf2\xaf\x91\xe8\xe5\x42\x5f\x95\xe2\x7d" + "\x4d\x3c\xe9\x7a\x5f\x13\x73\x44\xfa\x7a\xbd\x83\xfb\x2a\xf9\xfe" + "\x9f\x83\xbe\xaa\xc4\xfb\x9a\xf4\xb1\xeb\x7d\x4d\x4a\xb7\xef\x6b" + "\xd2\xf9\x8e\xed\x6b\x92\xd6\x85\xbe\x46\x88\xf7\xf5\xad\x5d\xae" + "\xf7\xf5\xad\x44\xfb\xbe\xbe\x75\xb2\x63\xfb\xfa\x56\xa5\x64\x5f" + "\xa9\x00\x06\xc7\x27\x88\x4b\xad\x19\x2d\xc0\xdf\x0a\x9e\xd6\xae" + "\xdd\x83\xa8\x4a\xbd\x01\x55\x85\xd6\x62\x6e\x4c\x3d\x97\x82\x70" + "\x4e\xb5\x31\xcc\xbb\x35\x11\x55\x45\x4d\xb0\xff\x0a\x3a\x9d\x66" + "\x40\x51\x4b\x71\xfc\x7d\x3b\xb7\x3a\x41\x6e\xfc\x7d\x7b\xf6\xfd" + "\xf8\x6b\x1c\xc6\xc5\xdc\xe4\x63\x55\x4d\xad\x08\xf7\x1f\xfe\xdf" + "\x7f\x3f\xfe\xae\x27\xf6\xb6\x8d\xbf\xd8\x1e\xd5\x06\x83\x20\xfe" + "\x92\xf7\x98\x92\x97\xdb\xc6\xde\xec\x6b\x08\x89\xc7\xde\xe4\x69" + "\x38\xf6\xee\x86\xe3\xf2\xda\x9f\x1c\x6a\x89\xbd\x39\x70\x4d\xeb" + "\xd8\xfb\x59\x02\x9e\x37\x93\x53\x5d\x8b\xbd\xc9\xa9\x96\x7e\xef" + "\xe2\xfa\x0d\xb6\xaa\x15\xc6\xde\x64\xc9\x77\x3d\xad\x71\xcb\x14" + "\x78\xc7\x7c\xd4\xd7\xd0\xcd\x5c\xd2\x9a\x83\xe7\xb7\x66\xb0\xc9" + "\x5f\x76\x1b\x3c\xaf\xd0\x0b\xd9\x6f\xd5\xde\x69\x4e\xf0\x60\x4a" + "\x5a\x22\xa7\xa6\x32\x17\x99\xb0\xd6\x1c\xbc\x96\x88\x75\x36\x1c" + "\x8f\x67\xf6\xb4\x44\xca\x6b\x37\xa9\x93\xf9\xa0\xb9\x26\x03\xc6" + "\xcb\x47\x2b\x0c\x94\x79\x4d\x6c\x00\xf8\x41\xc9\xe4\xfb\xe5\x30" + "\xbf\x7d\x32\xf9\x4e\x7e\xbf\x92\x93\xea\xcb\x08\x97\x65\xd6\x79" + "\x8e\x71\xa3\xfd\x4d\x8e\xdb\xbf\x28\xcc\x85\xf6\x37\xc9\x68\x7f" + "\x93\x53\xed\xef\x05\xed\x6f\x8d\xec\x06\x9a\x8f\xfa\xb4\x35\xd2" + "\x53\x5e\x7b\x16\xa5\x3b\xe5\x63\xf7\xae\xe1\x74\xfc\x63\x7a\xf5" + "\x89\xfa\x68\xb7\x8e\x82\x18\xc0\xce\xe1\x78\xec\x91\xf8\xd7\x08" + "\x31\xeb\x22\x43\x62\x92\x4e\x66\x4c\x5a\x1c\xe7\xfc\xf5\xfd\xcb" + "\x1e\xc0\xf5\xa5\xfb\x6f\x1b\x13\x3f\xf4\x29\x93\x8c\x89\x05\x7e" + "\x65\xf6\x31\x31\x65\x9f\xfc\x98\x98\x92\x62\x1f\x13\x97\x9c\xe1" + "\x63\xe2\x92\x63\xae\xc7\xc4\x25\x9b\x9d\x8f\x89\x4b\xe6\xbb\x16" + "\x13\x97\x44\x38\x8e\x89\x4b\x36\xb9\x16\x13\x97\x6c\xb2\x8f\x89" + "\x29\x4d\xc2\x98\xb8\x44\x23\xe9\xcb\xad\x37\xd2\x60\x8e\xf6\xbd" + "\x46\x2f\xcd\x31\xae\x07\xdd\x9a\xf3\xa6\xd7\x54\x13\xd3\xcc\x6c" + "\xbb\x91\x66\xa6\x86\xe3\xb8\x12\xd5\xdc\x9c\xe8\x65\x5e\xa9\xf6" + "\x65\xfc\x99\x9f\x31\x6d\x21\x08\xec\xd4\x1f\xda\x1f\xc0\x34\xab" + "\xfd\x99\x95\xea\x9e\x45\xf7\x50\x10\x6c\x21\x45\xdc\x7c\x0c\xff" + "\x47\x30\x2b\x43\x14\xd9\x2b\x50\x78\x80\x1e\x79\x41\x1b\x62\x03" + "\xd6\x29\x11\xc4\xa0\x20\xfc\x3f\xb3\x7e\x1f\x2a\xbe\x87\x3c\x03" + "\xd2\xc0\x37\x81\x70\xbd\xb4\x00\x86\x59\xa6\x46\xc5\x4b\x41\x3f" + "\x53\x28\x64\x37\xc5\x94\x19\x9b\xd5\x94\x29\x28\x2c\x86\xf8\x67" + "\xd9\x04\xa6\x57\x58\x1c\x93\x17\x16\x6a\xee\x15\xe6\x69\xca\x4c" + "\xa4\x99\x35\xb1\x34\x6e\xab\x29\x2f\x0c\x31\x05\xb0\x65\x26\xfa" + "\x63\x0e\x0d\xfa\x3a\x82\x69\x0e\x51\x80\xf6\x0e\xdf\xbd\x02\xf5" + "\xdf\x75\x0f\xa9\x99\x3b\x6a\x0a\xfc\x1f\x8b\xbf\x05\x0a\x36\x8a" + "\x35\x53\xfb\x10\x1c\xf3\xc4\x31\x91\xc1\xd7\x37\xc2\xf5\xdb\xe0" + "\xfa\xad\x18\xdb\x28\xa4\x18\xae\x6f\x5a\xa9\x96\x39\x5e\x96\xb1" + "\xf9\xef\x2d\xed\x32\x87\x3f\x51\xc6\x7c\x08\x1b\x6e\x17\xd8\xb0" + "\x18\xdb\xe4\xb9\x27\x0e\xe1\xb6\x6d\xbb\x87\xc2\xa1\x9d\xfd\xa1" + "\x0d\x6a\xb8\x2e\xce\xa3\x12\x3b\x77\x89\x12\x63\x54\xd0\x36\x53" + "\x2e\xd7\xb6\x9b\xd0\xb6\x1b\x7c\xdb\xf0\xb5\xb0\x7d\xa4\xee\x51" + "\x4e\x5d\xdb\x17\x8f\xcd\xef\x02\xd2\x7a\x4c\xc2\xf7\x2b\xef\xac" + "\x49\x94\x89\xd5\x65\x92\xdf\xff\xdc\xfe\x21\x0a\x65\x94\xf1\x5e" + "\x53\x36\x5e\x64\xa6\x1a\x11\xda\xf8\x21\x0a\xaf\x86\x71\x5d\x65" + "\xb8\x8e\x98\xc0\x78\xaf\x93\xea\x26\x99\xd7\x4a\x9d\x24\x75\xad" + "\x2d\xeb\x99\x9a\x36\x15\x5e\xef\xea\x57\xb8\x9d\x62\xd2\x5a\x55" + "\x2d\x51\x9f\x9f\x6d\x45\xaf\xa7\xe1\x7b\xa2\x4c\x9a\xea\x35\xe4" + "\x55\x4f\xaf\x36\x66\x9e\xc7\xf7\x7c\x52\x2b\x85\xf7\x7c\x52\x75" + "\x88\x5e\x91\x87\xe8\x95\x27\x10\xbd\x2a\x1a\x41\x39\x9b\x6d\xc3" + "\xd4\xfd\x7d\x51\x86\x91\xf9\x8e\xc9\x39\x93\x98\x4d\x31\x86\xa9" + "\x03\x3d\xb4\x9a\x15\xf8\x1e\xc9\x8a\x6d\x60\xbf\xef\x61\x5e\x0d" + "\xc0\xff\xe3\xfa\x52\x96\xa2\x27\xae\xd1\x2b\xb6\x06\xe8\x7b\x4c" + "\x32\x06\xf5\xd3\x18\x99\x58\xd4\xa6\x1a\x59\xd2\x92\x17\x16\xd1" + "\x86\xd7\xe3\xe6\xe1\x18\xb4\x7c\x63\x80\x47\x16\x62\xc0\xff\x0c" + "\x13\x82\xef\xe9\xc5\x16\xc1\x86\x7d\xc9\xfa\xb1\xa7\xa7\x0e\xfb" + "\x1b\x8f\x85\x62\xb2\x5f\x89\xc7\xc3\x76\x6e\xdc\xe8\xe8\x41\x71" + "\x26\x0a\x21\x13\x9c\x9f\x79\x19\x85\xe2\x6f\xc0\xee\x82\x72\xaf" + "\x9b\xbc\xf0\x38\x8e\xd5\xbc\xf6\x05\xba\x92\x82\xa8\xcc\x5b\xc8" + "\x0f\x30\xc1\x8e\x47\x33\x8c\xc7\xa9\x75\x01\x06\x88\x2b\xe6\x8c" + "\xbb\x28\x00\xc7\x29\xfc\x3d\x95\xea\x26\x2d\x32\xdf\x54\xfb\xef" + "\x5c\x84\x82\x8c\x37\x13\x7b\xea\x6e\x26\x3e\xb1\xc3\x8c\x82\xfc" + "\x53\x90\x72\xd7\x22\xc0\xe2\x62\x18\x9f\x37\x60\x7c\x36\x91\xf1" + "\x69\xc1\x1f\xb3\x65\x57\x38\x7e\xcf\x9d\x1d\x9b\xb9\xdc\xd8\x5c" + "\xa9\xc6\x6b\x5c\xf7\xf1\x67\x5c\xac\xa6\x76\x51\x0c\x82\x36\x82" + "\xdd\x97\x1d\x2d\xce\xe8\xe1\x85\xd7\x24\x99\x7e\x6d\x11\x78\x7d" + "\x6f\xaa\x91\x31\x7e\x04\xbe\xe8\x36\x90\x52\x31\xf9\xfd\x34\x9f" + "\xc7\x34\x22\x7e\x5d\x64\xb5\xa9\x35\xac\x25\x4a\xf5\x0a\x73\xb3" + "\x9e\x5e\xb1\x01\xf6\x7b\xa9\x5e\xfd\x89\x12\xfc\x68\x22\xeb\x24" + "\xab\x8d\x78\x8d\x54\x4b\xaf\x88\x85\xba\x10\xbe\x4f\xfe\x2f\xf6" + "\xbe\xd6\xca\xa3\x50\x16\x99\xc0\xe6\x46\x65\x4d\xb9\x39\x28\x2c" + "\x4e\xf3\x56\x2b\x1b\xaf\xda\xc0\x07\x57\x92\x11\xf5\x7a\x13\xd8" + "\xc6\x04\xb6\x69\x56\xfb\x42\xdc\x8a\xc1\x71\x8b\xd9\xca\x44\xa6" + "\x6b\x19\xf3\xd4\x04\x9a\x01\xbb\x78\x55\xa7\x99\xd0\xdc\x14\xc4" + "\xac\xbd\x0e\x36\xd2\xd7\x22\xe8\x9b\x3f\xc4\xb6\x9e\xbb\x56\xa0" + "\xa0\x9d\x60\x1f\xbf\x26\xe0\x34\xef\xbe\x81\x3e\xcc\xa8\xe8\x66" + "\x02\x9c\xe3\x38\x16\xb0\xce\xc3\x1b\x7c\xe5\xbf\x15\x8f\x5b\x18" + "\xc7\x01\xeb\xd8\xb8\xca\xfa\xd6\xb8\x52\xdd\xaf\x6d\xa5\x5a\x05" + "\x5b\x5f\x4b\xac\xb3\xc4\x19\x26\x3b\xb5\x3f\x8e\x73\xd5\x69\x5a" + "\x64\x04\x5b\xfa\xe3\x39\x71\xa5\x3a\x94\xb5\xe9\x9b\x60\xd3\x05" + "\xc8\x6b\x88\x01\x79\x40\xbb\x94\xd0\x66\x74\x3a\xb1\x1e\xc7\xd6" + "\x10\x13\x8c\x23\x6c\x67\xa8\x93\x62\x00\x6b\xe6\x9c\x9a\xf2\xc9" + "\x49\x2a\x74\x52\x7d\x0e\xe1\x5c\xaa\x99\x2d\xcc\x25\x7c\x5f\xad" + "\x3a\xcd\x88\x98\xe0\x7e\x1a\xb2\x26\xbe\x62\xf6\xe7\x31\x06\x24" + "\x8d\xe9\x55\x13\x79\x4c\xaf\x9a\xc8\x63\x7a\x15\xfb\x0c\xb6\x35" + "\xae\x5b\x4a\x00\xd7\x41\xd6\xb8\x4e\x9b\xf3\x40\x71\x3d\x45\x3e" + "\xae\x77\xdc\xb0\xc2\x75\xc6\x0f\x83\xeb\x7f\xc5\xb2\xb8\xa6\xdb" + "\xc2\x58\xbc\xc6\x55\x1b\xff\x04\xfc\x77\x55\x84\x05\xb7\xa7\xfe" + "\x80\x71\xbb\x3a\xb5\xab\xe2\xb6\xa5\x59\xad\x82\xad\xc3\x71\x0b" + "\x75\x3a\x8d\xdb\x7f\xc5\xb6\x22\x8b\xfd\x30\x7e\x99\x9c\x78\x2f" + "\x55\x26\x7a\x01\xec\x66\x0c\x58\xd7\x17\x9d\x26\x36\x34\xaa\x5e" + "\x65\xcc\x10\x23\x0e\xb2\xf7\x86\xd7\x33\x8c\x39\x28\x34\x26\xf3" + "\x0c\x52\x9a\x73\xce\x47\x54\x1b\x0f\xa2\x80\x14\xbc\x76\x5f\x13" + "\xc2\x04\x66\xd6\x80\x0e\x0f\x21\xf7\x56\xe2\xa3\x4c\xb9\xf3\x74" + "\x26\x88\x27\xa6\xfc\x70\x64\xce\x8d\xd2\x9a\x03\x57\xa9\x18\xfc" + "\x2c\x41\xe0\x3c\x65\x73\xf6\x6a\xa3\xe5\x1e\xb8\x28\x37\x0a\x0a" + "\xc7\x6b\x9f\xa0\xa9\xd2\x97\xc3\x5f\xea\x0a\xbd\x26\x1f\xfe\xd2" + "\xf0\x77\x3e\xab\xb1\x64\xcd\x73\x6b\x22\xc8\xbd\xa4\x7e\x67\x49" + "\x1c\x5c\xc3\x3e\x4b\x92\x32\x08\xf9\x5d\xe3\xfe\x6f\xce\x5e\xb3" + "\xd5\x72\x4f\xfd\x7e\xf9\xfb\xf6\x58\xa3\xc6\xd7\x06\x9b\x78\x92" + "\xfb\xfc\xe4\x37\x7e\xde\x85\xab\x8f\xfd\x6d\xee\xef\x13\xa9\xc9" + "\xa8\x47\x4d\xf4\x1a\x43\x35\xcc\xfd\xe6\x82\x7e\x67\xb7\xdf\x03" + "\x3c\xa6\x59\xe2\xef\x9a\xa1\xfe\xe0\x6f\xcd\x6a\xb6\xcc\x79\x96" + "\x1f\xe7\xf5\xd6\x30\xef\x9e\x89\xc0\x1a\xb2\x99\x49\xfc\x19\xf7" + "\x77\x2c\xc6\x36\x59\x6f\x49\x9f\xc8\x80\xfd\xf0\x37\xd0\xef\x3f" + "\x03\x84\xbf\x4d\x9e\xe5\x19\x7a\x3c\x9d\xcc\xb7\x96\xf6\xe2\xef" + "\x97\xe3\x67\x6c\x7e\x92\x85\xb2\x9a\x45\xbe\x5f\xce\x3f\x8b\x93" + "\x1e\x61\xce\xef\xad\x69\xce\x4e\xcf\x02\x0e\xb0\xc9\xba\xcf\x62" + "\xbe\x80\xf2\x45\x52\xc7\xe4\xf9\x21\x5d\xf2\xfb\xcf\x13\xd5\x26" + "\x46\x5e\x5d\x6b\x25\x9f\x7f\x64\x54\xcd\x35\x53\x4b\x4d\x1a\x73" + "\x5b\x6c\xc0\xc9\xf4\xeb\x32\x39\xd1\x5a\xc9\xe7\xdf\x4d\x79\xa1" + "\x89\xc6\x7e\x50\xf7\xc0\xbe\xc8\xb4\x38\xf6\x45\x7c\x6f\x03\x73" + "\xbd\xb5\x49\xe4\xb9\xad\xca\x52\x23\xc2\xbc\x6f\xff\xa2\x0a\xaa" + "\xb5\x2d\x16\xf9\xeb\x90\x72\x8a\x3e\x93\xd9\x7e\x03\xf5\x67\x56" + "\xc6\x06\x6c\xbd\x81\xc6\xb4\xdd\x09\x51\xbc\xb3\x14\x79\xb6\x42" + "\x4c\x6e\x5d\x96\x18\x80\x9f\x11\xfb\xe4\x9a\x86\xaa\x36\x96\x63" + "\x9e\xd9\x1f\xcf\x03\xb8\xed\xa6\x3b\xb1\xfe\x9b\x6f\x23\xf6\x7e" + "\xb1\x66\xde\x07\x30\x0f\x64\x24\x75\x5b\x0b\xb1\x0f\x62\x17\x3b" + "\x1f\xb8\x30\x17\xb4\xc2\x5c\x30\x39\x96\x31\x54\xd5\x7e\x81\x32" + "\xaf\x23\x65\xe6\x72\xe4\x87\xeb\xaf\x36\x1e\x23\xf3\xc3\x0c\x98" + "\x1f\xe0\x37\x68\x89\xfb\xf3\x83\x6a\x0a\xb2\x9b\x1f\xb0\x0e\xa9" + "\xaa\x6b\x44\x80\xe5\x1e\x53\xf4\x01\x86\x0c\x3d\x63\xc6\x9a\x04" + "\xdf\x9b\x86\x32\xfe\x96\xb9\x02\xcf\x13\xad\xdc\x3c\xb1\x8b\x9b" + "\x27\xde\xef\x80\x79\xe2\x7d\x3c\x4f\x9c\x43\xd4\x0e\x3c\x47\xc0" + "\xfc\xf0\xc7\x6f\x74\x54\x1b\xcc\x09\xf2\xfc\x9c\x29\xf9\xfe\x3b" + "\x53\xd0\xef\x77\x66\x98\x8b\xb1\x9f\xd7\x80\x7f\xb1\x9f\xab\xd5" + "\xe0\xdb\xda\x1e\x93\x5a\x60\xbf\xb1\xc0\x3b\xa5\xf4\x8a\x8e\x62" + "\xf2\xfc\x72\x5a\x00\x0f\xab\xef\x22\xca\x18\x14\x9a\x78\xf0\xd5" + "\x1c\x0a\xeb\x56\x73\xbe\xf7\x21\xa2\x91\xd7\x1d\xc1\x6b\x34\x01" + "\x8d\x48\x89\xd7\x4f\x4d\x4c\x6c\x80\xf9\xfb\x58\x3f\xf3\xdb\x21" + "\x5e\x6d\xdf\x87\x28\xb6\xbc\x85\x3c\x75\x6f\x27\x06\x64\xce\x44" + "\xca\x4f\xbf\xcc\xa1\xaa\xf4\x30\xb6\xbb\x9f\xac\x60\xa0\xfe\xe2" + "\x7a\x14\x59\x3c\x0f\x0d\xdf\x7d\x05\xa9\x76\x2f\x40\xe1\x3b\xaf" + "\x00\x86\xde\x8e\xf5\x6f\x63\xf1\xd1\xa2\x61\xef\xf5\x2f\x40\x51" + "\x4c\x2f\xdf\x14\xf8\x1b\x99\xb3\x00\xe1\x3c\x7e\x29\x4c\x70\x68" + "\xa2\x19\xca\x6d\x05\xed\x06\x1c\x1d\xda\x90\xb5\x47\x0c\x37\x3b" + "\x65\x72\x88\xc9\x31\x80\x9b\x1a\xc0\xcd\x2d\x21\x6e\xb0\x6e\x65" + "\xb1\x33\x99\x60\x07\xdf\xcb\x2b\xb6\xe6\x17\xf3\x3e\x77\x19\x3f" + "\x45\xc0\x9f\x5b\x6c\xf0\x53\x74\xc3\x3d\xfc\xb4\x01\x7e\x8a\xd6" + "\x03\x7e\x4e\x23\xaa\xd0\xec\x0e\x7e\xd6\xb1\xf9\x3f\xf1\x3a\x1f" + "\x79\x06\x28\xf3\x12\xf6\x33\xe0\x4a\x3b\x43\xed\x81\x5c\xc4\x95" + "\xce\x31\xae\x14\xc3\x09\xae\x36\x04\xca\xc7\xd5\x3f\x54\x80\x2b" + "\x9d\x63\x5c\xdd\x95\xc2\x95\xce\x1e\x57\xeb\x5b\x3a\x17\x57\x6c" + "\xee\xcc\xff\x03\xb8\xfa\x4d\x9d\x10\x57\xeb\x47\x11\x5c\xad\x8f" + "\x74\x1d\x57\x8a\x76\xe2\x95\x82\x8b\x57\xbf\x4d\x72\x01\x57\x69" + "\x0c\xd4\xef\x18\x57\xd7\x25\x70\xa5\x10\x89\x57\x1b\xa7\x75\x2e" + "\xae\xd8\xdc\x9e\xff\x07\x70\xf5\xdb\xe1\x42\x5c\x6d\xc8\x25\xb8" + "\xda\x90\xe3\x06\xae\xda\x89\x57\x3e\x5c\xbc\xda\x74\xdc\x05\x5c" + "\xd5\x00\xae\xda\x89\x57\x17\xa4\x70\x25\x12\xaf\xfe\x7b\x7f\xe7" + "\xe2\x8a\xcd\x3d\xfa\x7f\x00\x57\x9b\xb6\x0a\x71\xf5\xdb\xab\x04" + "\x57\xbf\x6d\x74\x1d\x57\x3e\xed\xc4\x2b\x1f\x2e\x5e\xbd\xd3\x5b" + "\x3e\xae\xfe\xa9\x66\xa0\x7e\xc7\xb8\x3a\x26\x81\x2b\x1f\x91\x78" + "\xb5\xc5\xa3\x73\x71\xc5\xe6\x46\xfd\x3f\x80\xab\x2d\x0d\x42\x5c" + "\x6d\x1e\x47\x70\xb5\x39\xca\x0d\x5c\xb5\x13\xaf\x7c\xb9\x78\xb5" + "\x6d\x89\x0b\xb8\xca\x02\x5c\xb5\x13\xaf\xd6\x4a\xe1\x4a\x24\x5e" + "\x6d\x9d\xd9\xb9\xb8\x62\x73\xb7\xfe\x1f\xc0\xd5\xb6\x31\x42\x5c" + "\xbd\xb3\x83\xe0\xea\x9d\x42\xa7\x70\x65\xb0\xc2\x55\x5d\x8f\x49" + "\xad\x99\x44\x0f\xee\x5f\xc0\xe1\xea\x83\xe6\x9a\x35\xcb\x11\x75" + "\xf0\xb5\x42\x1b\x2d\xb8\xfd\x98\x2d\xa6\x00\x17\x2c\xa6\x8c\x6f" + "\x03\xa6\xae\x11\x4c\x65\x5c\x00\x4c\x7d\x55\x48\x55\xa7\x5d\xc7" + "\x38\x61\x31\x54\xb4\x00\x30\x84\x75\xa1\x87\x67\x90\x1c\x0d\xf8" + "\xce\x35\x0b\x96\xb2\xf7\x75\x08\x96\xa6\x03\x96\xce\xda\x62\xe9" + "\x24\x8f\xa5\x69\x12\x1a\x70\xae\x04\x96\xb4\xed\x63\x69\x27\x5e" + "\x43\x58\xfc\x80\xb0\x74\x86\x5f\x43\x38\x30\x4f\x47\x19\x83\xe5" + "\x62\x69\xfb\x26\x21\x96\xb6\x5d\x27\x58\xda\xd6\xe4\x3a\x96\x14" + "\x3a\x69\x2c\x59\xf8\xd4\xbb\xde\xee\x61\x09\xb8\x95\x00\x4b\xed" + "\xf3\x28\x1e\x4b\x39\xb7\x3a\x17\x4b\x36\x3c\xea\x91\xc5\x52\xee" + "\x59\x21\x96\x72\x38\xdd\x97\x23\xa9\xfb\xcc\x30\x77\xe1\x7b\x4e" + "\xf8\x3d\x58\xd3\x9d\xd8\x17\x4d\x30\xa7\xe1\xf7\x61\xf1\x7d\x8a" + "\x8f\x16\xd5\x50\x18\x4f\xd9\xb7\x51\xff\xad\x4b\xd1\x98\x00\x03" + "\xc1\x8a\x11\xb0\xb2\xe9\x36\xf2\x6c\x6b\x03\x9c\xb4\x22\xcf\x16" + "\xb0\x77\x4b\x5b\x62\x40\x65\x5c\x23\xfa\xf4\x46\x0d\xcc\x65\xe5" + "\x68\x37\x9c\xd3\xc6\xad\x43\x9a\xd7\xc4\xfa\x6f\x5e\x8d\xd7\x21" + "\x4f\x23\xcd\x6b\xef\x63\xec\xb9\xed\xff\x96\xdf\x48\xf9\xff\x98" + "\xc0\xf7\x45\x56\x7e\x57\xbd\xec\xfa\x3a\x24\x7b\x9f\x6a\x11\xf1" + "\xbd\xc5\xef\x3b\x3a\xc0\xef\x3b\x38\xbf\xbb\x37\x1f\xbd\x27\xfd" + "\xfc\xa3\x55\xac\x60\x9f\x29\x30\x90\x18\x61\x89\x0b\x38\x46\x60" + "\xfe\xd2\x12\xe4\x9d\x6a\x3b\xdf\xe0\xf8\x70\x83\x2e\x18\x85\xe7" + "\x26\x49\x1e\xc3\xc5\x89\xcc\x55\x24\x4e\x70\x3c\xa6\xb6\x63\xd7" + "\x1f\xf3\xc3\x1e\x5c\xbc\x38\xd6\xfe\xdc\xe3\x06\x8f\xc1\xb8\x29" + "\xb2\xc1\xcd\x83\x88\x17\xae\xe1\xa6\xc0\x53\x18\x2f\xf2\xe2\x49" + "\xbc\xc8\x8b\x73\x66\xee\x69\x07\x4f\x7a\x1e\x4f\x64\xcd\x91\xe0" + "\xa9\x70\x33\x5e\xa3\x94\x87\xa7\x8a\xf0\x8e\x5d\x77\xfc\x9f\x25" + "\x9d\x8b\xa7\x8e\x5b\x77\xec\xda\x78\x2a\x9c\x2e\xc4\x53\xc1\xc7" + "\x04\x4f\x05\x65\xee\xe3\x49\x61\x15\x9f\x14\x56\xf1\xe9\xfd\xf3" + "\x78\x6d\x52\x26\x9e\xb2\x3a\x76\xbd\x71\xc7\xf1\xce\xc5\x53\xc7" + "\xad\x37\x76\x6d\x3c\xbd\xbf\x57\x88\xa7\x1d\x1e\x04\x4f\x3b\x50" + "\x07\xe0\x49\x6f\xcb\x89\x09\x9e\x76\x0d\xc4\xfc\x59\x26\x9e\xce" + "\x76\xec\x3a\x63\x51\x60\xe7\xe2\xa9\xe3\xd6\x19\xbb\x36\x9e\x8a" + "\xf4\x42\x3c\xed\x9c\x46\xf0\xb4\x33\xc6\x7d\x3c\xf9\x58\xc5\x27" + "\x1f\xab\xf8\x54\xbc\x0a\xaf\x45\xca\xc3\xd3\xa9\x0e\x5e\x5f\xdc" + "\x1d\xdf\xb9\x78\xea\xb8\xf5\xc5\xae\x8d\xa7\xe2\x09\x42\x3c\xed" + "\xda\x43\xf0\xb4\xab\xa4\x03\xf0\x64\x15\x9f\x7c\xad\xe2\xd3\x9e" + "\x53\x78\x0d\x52\x26\x9e\xd2\x3b\x76\x5d\xb1\xe4\xe3\xce\xc5\x53" + "\xc7\xad\x2b\x76\x6d\x3c\xed\xc9\x13\xe2\xa9\xf8\x16\xc1\x53\xb1" + "\xce\xd9\xb5\x20\xcb\x1a\x90\x35\x9e\xa4\xb5\xdd\x5e\x3f\x5b\x6d" + "\x27\x6f\x0d\x08\x74\x9e\xcb\xeb\x89\x1f\xdc\x7d\x58\xd7\x13\x31" + "\x86\x2c\xeb\x40\x5d\x6f\x0d\xe8\x77\xb5\x42\x0c\x7d\x30\x96\x60" + "\xe8\x83\x31\x52\x18\x32\x5a\x3f\x93\xf6\x9d\xd5\x33\x69\xd7\x11" + "\x75\x70\x91\x86\xaa\xe2\x9e\x49\xc3\xcf\xa3\x55\x35\x34\xa2\xcd" + "\xf7\x90\xd2\x3f\x11\x29\xa7\xa4\x64\x32\xdb\x71\x0c\x59\x16\x1b" + "\xf0\xce\x15\x34\xa6\x0d\x30\x93\x7d\x8d\x7b\x2e\x0d\x70\xf3\xaf" + "\x3a\x03\xfa\x64\x11\x7e\x2e\xad\x0c\x15\x43\x39\x63\x1e\x59\x0f" + "\xc2\x71\x84\x7d\x26\x6d\x01\x7e\x26\x6d\xaf\x49\xf4\x99\xb4\xf5" + "\x32\x9f\x49\x4b\x05\x1c\xe8\x01\x07\x77\x31\x06\x0e\x0b\x9e\x45" + "\xdb\xb9\xde\x6a\x0d\x68\x9e\xc4\x1a\x50\xad\x73\xf7\x24\x3a\xfc" + "\x59\xb4\x9b\x56\xcf\xa2\x59\xd6\x80\x5e\x83\xd8\x21\xdb\xef\xfb" + "\x24\xbf\xff\x8c\x63\x84\x09\x62\xc2\x14\xfc\x6c\xb9\x9e\x5f\x2f" + "\x4e\x4f\xc2\xef\xfe\x7a\xa7\x18\x21\x56\xe0\xe7\xc7\x3f\x9c\x57" + "\xc1\xae\xf7\x55\xa7\xd5\xa2\xcd\xad\x48\x19\xa0\xe3\xe2\x42\xb0" + "\xf7\xa1\x36\x88\x0d\x26\x98\x97\xc0\xd7\x7e\x6d\xcb\x20\x36\xdc" + "\x86\xd8\xb0\x0c\x62\xc3\x5d\x88\x0d\xf5\x15\x6c\x6c\x60\x7e\x7b" + "\xb2\x02\xe7\xc0\x2e\xbe\x86\x86\xef\xba\x86\x22\x71\x0c\x30\xe5" + "\x87\x26\xb6\x05\x7b\xe7\xe9\x82\xbd\x0b\xe1\x58\x29\xc1\x40\x8b" + "\x66\xeb\x52\xc4\xc6\x7a\xec\x7b\xd5\x02\x1c\x0f\x7e\xdf\xad\x0d" + "\xc6\xac\x3b\x38\x68\xb3\x5e\x13\xb4\xc6\x81\x44\x0c\x70\x1b\x0b" + "\x36\xeb\xc0\x3b\xdd\x8c\x01\x18\x0b\x3b\x2d\x31\xc0\x2d\x2c\xfc" + "\x5e\xf2\xfd\x9f\x76\xb0\xa0\x6b\x1f\x0b\x8a\xe1\xce\x61\xe1\x1f" + "\x2a\x9c\x3b\xda\x1e\x0b\x8a\x20\x5d\xb0\x22\x04\x8e\xa9\x09\x16" + "\xee\x8a\x60\x61\x7f\xe0\x83\xc7\x82\x70\x4d\xe6\xd1\xc5\xc2\xfe" + "\x46\xd7\xb0\xa0\x70\x22\x2e\x28\x9c\x8c\x0b\xff\x48\xc3\x39\x97" + "\x45\xb0\x00\x71\x41\x01\x71\x41\xc1\xc5\x85\xeb\x22\x58\xf8\xe3" + "\x53\x0f\x1e\x0b\xc2\xf5\x94\x47\x17\x0b\x7f\x94\xce\x7f\xe1\x18" + "\x0b\x4e\xc4\x05\x1f\x67\xe3\x42\x0d\xce\x55\x6c\x8f\x05\x1f\x88" + "\x0b\x3e\x10\x17\x7c\xb8\xb8\x70\x41\x04\x0b\x07\x07\x3e\x78\x2c" + "\x08\xd7\x42\x1e\x5d\x2c\x7c\x88\x5c\xc3\x82\x8f\x13\x71\xc1\xc7" + "\xc9\xb8\xf0\x4f\x35\xce\xf1\x2b\x82\x05\x88\x0b\x3e\x10\x17\x7c" + "\xb8\xb8\x70\x4c\x04\x0b\x1f\x8d\x78\xf0\x58\x10\xae\x63\x3c\xba" + "\x58\x28\xf3\x75\x11\x0b\x4e\xc4\x05\x5f\x27\xe3\xc2\x3f\xb3\x70" + "\x6e\x5c\x7b\x2c\xf8\x42\x5c\xf0\x85\xb8\xe0\xcb\xc5\x85\xb5\x22" + "\x58\xf8\x78\xdc\x83\xc7\x82\x70\x0d\xe2\xd1\xc5\xc2\x9f\x42\x1c" + "\x62\x81\xb1\xc7\x02\x5e\x43\xc0\xfa\x11\xe7\x9e\x66\xb1\xf0\x96" + "\x86\x6a\x65\x30\x16\x2a\xd0\x96\xd5\x56\x58\xc8\x27\x3a\xc2\x82" + "\x83\x6d\xd6\x38\xc0\xef\x2f\x61\x1c\x80\x7e\x30\x82\xdf\x99\x02" + "\xdf\x14\xf6\x79\xa5\x7c\xef\x52\xac\x1f\xf0\x3a\x03\xd6\x10\xd2" + "\xfa\xe1\xff\x4d\xec\x10\x0c\x24\x03\x06\x9a\xc4\x75\x64\x87\xeb" + "\x87\x9b\x0f\x08\x03\xa0\x25\xdf\xcf\x70\x07\x03\x87\x24\xbf\xff" + "\x2e\x8d\x01\xe0\x08\x4e\x61\x80\xf0\x04\xc7\x18\xf0\x51\xf2\x18" + "\x00\xbe\x90\xef\xa3\xc6\xfc\x80\x60\xc0\x27\x44\x9a\x1f\x1c\x7e" + "\xe9\xc1\x63\xa0\x83\xf9\x41\x97\xc5\xc0\x9f\x55\x92\xef\x30\xe2" + "\x58\x0e\x71\x7f\xca\xc0\xbe\x88\x79\x3b\xf6\xc5\xec\x6b\xa8\xff" + "\x3b\x6f\xa1\x31\x38\x6f\xcc\xc1\x56\x03\x95\x91\xc2\x7c\x87\xdf" + "\xad\x36\x42\x3f\x70\x7e\x50\x16\x1f\x37\x43\xbc\xaa\x13\x75\x68" + "\x33\x60\xe1\x1d\xe8\x03\xce\xd3\xee\x9f\xd2\x63\x52\x95\xfe\x73" + "\xd4\x7a\x27\x16\x55\xc6\x5d\x43\x53\xd5\x4c\x5b\x75\x9d\x06\xbf" + "\xc3\xe8\xa9\x59\xf1\x39\x7e\x4f\x5c\xf1\x7a\x1a\xa2\x6e\xd0\x7f" + "\x6e\xc0\x6b\x4a\x43\xd2\x90\xb2\xe8\x1a\x59\x47\xda\x7c\x03\xa1" + "\x93\x69\x08\x11\xbf\xff\x65\x5c\xb7\x55\x1d\xb0\x86\x34\x1b\xfc" + "\x5e\x67\xf1\xfb\x49\xe1\x1a\x12\xe5\xc4\xfb\x8c\x4e\xac\x1d\x3e" + "\x90\xf7\x19\x6f\xda\xbf\xcf\xe8\xda\xda\x61\xb9\xe4\xf7\x4f\xd9" + "\x75\x66\x8e\x07\xac\x49\x65\xc7\x3d\xeb\xd7\x36\x88\xfd\xd5\x69" + "\xe5\xec\xf3\xd1\x78\x9c\xe3\x31\x8f\xf1\x91\xb9\x04\xe7\xda\x6e" + "\xae\xc1\x78\x98\x52\xda\xd6\x36\x57\x8f\x28\x73\xb0\xf7\x21\x8c" + "\x09\xf3\xe2\x10\xaf\xad\xd0\xa7\xea\xb8\x7a\xf0\xfb\x6d\x54\xdd" + "\xc0\xf9\x7c\x75\x3d\xf8\xb2\xbc\x86\x59\xac\x56\x3c\xa7\x47\xca" + "\xcc\xf3\x48\xf9\x3a\x7e\xe7\x18\xe6\x81\x9d\xc0\x09\x8a\xdf\x42" + "\xc3\x61\x3e\xc8\x69\xe3\x62\x83\xd9\xb2\xae\x84\xe7\x08\xc0\xc4" + "\x3b\x8b\x00\x13\xa9\x80\x89\xb9\x18\x13\x47\x66\x74\x5b\x2e\xb2" + "\xbe\x2c\x03\x13\xec\xfa\x72\x02\x60\xa2\x81\xc7\xc4\xfd\x75\x65" + "\x89\x39\x41\xf3\x9a\x1b\xcf\x16\x8a\xc4\x03\xb7\xd7\x95\x6f\x72" + "\xeb\xca\x56\xf1\xc0\x35\x6c\xfc\x55\x3a\x27\xa6\x34\x36\x74\xed" + "\x63\xa3\x99\xc3\x86\x62\x78\xfb\xd8\xf8\x6b\x93\x3d\x36\xfe\xa1" + "\xe2\xb1\xa1\x50\xf2\xd8\xe0\xd6\x99\xf2\x15\x6a\x7b\x6c\xfc\x6d" + "\x49\xe7\x60\xc3\xe6\xb9\x9f\x47\x16\x1b\x47\xa3\xe5\x63\x43\xe1" + "\x44\xdc\xb8\x69\xc1\x86\x13\x71\xe3\x98\x97\x08\x36\xd2\xac\xb0" + "\x61\x15\x37\xb8\x75\xa7\x7c\x85\x48\xdc\x38\xb6\xad\x73\xb0\x61" + "\xf3\x0c\xcf\x23\x8b\x8d\x4f\x12\x5d\xc0\x86\x13\x71\xe3\x22\x87" + "\x0d\x1f\x27\xe2\xc6\xa7\xfd\x45\xb0\x51\xc3\x63\xc3\xc7\x2a\x6e" + "\x70\xeb\x50\x98\x73\xda\x61\xe3\xd3\xfd\x9d\x83\x0d\x9b\xe7\x71" + "\x1e\x59\x6c\x68\x36\xc8\xc7\x86\x8f\x13\x71\xe3\x53\x0b\x36\x9c" + "\x88\x1b\xc7\xa3\xec\xb1\xf1\x4f\xb5\x15\x36\xac\xe2\x06\xb7\x2e" + "\x95\xef\x23\x12\x37\x8e\x9f\xec\x1c\x6c\xd8\x3c\x5b\xf3\xc8\x62" + "\xe3\xef\x25\x2e\x60\xc3\x89\xb8\x91\xc9\x61\xc3\xd7\x89\xb8\xf1" + "\xd9\x6c\x11\x6c\x64\xf1\xd8\xf0\xb5\x8a\x1b\xdc\x3a\x55\xbe\xaf" + "\x48\xdc\xf8\xec\x52\xe7\x60\xc3\xe6\x39\x99\x47\x16\x1b\x27\x8e" + "\x3a\x83\x8d\x74\xbd\x88\x4e\x69\x20\xd8\x68\x83\x32\xd6\xb8\xb0" + "\xd6\x26\xd0\x3f\xcf\xa9\xa0\x59\x30\x26\xe6\xa4\x23\x8a\xc5\x85" + "\xde\x1a\x17\x27\x53\x31\x2e\x06\x27\x02\x2e\x2e\x73\xb8\xb0\xe8" + "\x12\x36\xf7\x0a\xd1\x26\x96\x35\x2b\x8b\x3e\xd9\x82\x35\x6b\xa2" + "\x05\x13\x27\xef\x76\x4b\xea\x00\x4c\x08\x9e\x7b\xb0\xc2\xc4\x4c" + "\x09\x7d\xf2\xaa\xeb\x98\x78\x1f\xb4\x6b\x5b\x47\xbf\xfb\x64\xc1" + "\xc4\x79\x77\x31\xf1\x0f\x87\xcf\x3f\x88\x63\x82\xe3\x19\x92\x98" + "\xe0\xb9\x05\xc1\xc4\x45\x07\x98\xf8\xe7\x26\x7b\x4c\x70\xbc\x82" + "\xcd\x43\x40\xb8\x85\x65\x0d\xcb\xc2\x2f\x84\x98\xa8\xf0\xee\x1c" + "\x4c\xd8\xf0\x8b\x47\x16\x13\x15\x0d\x92\x6b\x58\xeb\x11\xb5\x6b" + "\xbd\xb9\x2c\x87\x32\x97\xc3\xa6\x81\xad\x02\xf6\x75\x83\x7d\x2c" + "\x8e\xe0\x37\x7b\xcc\xac\x60\x73\x0f\x6b\x02\x3c\xe2\xb0\xbd\x71" + "\x99\xee\x96\x32\x01\xeb\x50\x54\x31\x57\x07\xec\xcf\x82\xfd\x1a" + "\x7f\x8f\xa8\xee\x50\xbe\x82\xc9\x4e\xc7\xfb\x7a\xe0\xb2\xcc\x3a" + "\x4f\x76\x4d\x9d\xa1\x28\x5c\x87\xed\x35\xbd\xb8\x32\xa1\xd6\xd7" + "\xf5\x5b\x17\x85\x73\xf9\x59\xca\x78\x9b\xa9\x7a\xfc\xbb\xc6\xec" + "\xe1\xa9\x32\xaf\x47\x2a\xeb\xb2\xcc\x78\x84\xeb\xb5\x94\x55\x70" + "\xf5\xf5\xb7\x2e\x63\xfa\x00\x21\x7f\x0f\x15\x5b\xa7\x7f\x0a\x85" + "\xfb\x84\xcb\xfa\x30\xfe\x6b\x94\x6c\x79\x0f\x4f\xb5\xa0\xfc\x6f" + "\x11\x5b\x96\x2b\xe7\xcb\x74\xff\x5c\xc3\x95\x63\x73\xa1\xc3\x3e" + "\x4f\x6b\xfb\x71\xe5\xfc\x2c\xb6\xc1\xf9\xfb\xac\xfb\x6a\x5a\x4f" + "\xe1\xfa\x70\x19\x7f\x73\xf7\x53\x35\x5c\x5f\x86\x5b\x5f\x13\x97" + "\x83\xf3\x86\x72\x76\x0e\x80\x3e\x44\xde\xaf\x2f\xe7\x4c\xa2\xa5" + "\x1c\xe0\xb0\x77\x31\x6f\x1b\x25\x93\xbd\x36\x1a\xe7\x2c\xb7\xf5" + "\x9d\xbf\x87\x87\x16\xfb\xae\xba\x09\x21\x5c\x96\xf1\x5f\x8b\xbf" + "\xb1\x15\xc8\xf5\x23\x8a\xf4\x83\xcd\x99\x48\x7c\x4d\x19\x9f\xd8" + "\xcd\xb6\xd5\x43\xc5\xb5\xb5\x27\x94\x9b\x60\xa9\xd7\x4c\xb1\x18" + "\xe6\xca\x7a\xb2\x65\xab\x92\xf1\x77\xbb\xee\x97\x7f\x02\x97\x35" + "\x65\x6f\x2b\x32\xad\xf3\x9c\x64\x5b\xbf\x69\xbd\x17\x3e\x6e\x5d" + "\x7f\x10\x29\x9f\xb9\x15\xca\x47\xdb\x97\x57\xda\x96\x0f\x26\xe5" + "\xd7\x35\x40\xf9\x18\xfb\xf2\xc6\x9e\x36\xe5\x7b\x91\xf2\x1b\xc6" + "\x40\xf9\xe9\xf6\xe5\x55\xb6\xe5\x7f\x44\xca\x6f\x6f\x84\xf2\xb1" + "\xf6\xe5\xa3\x6c\xcb\x87\x90\xf2\xbf\xcd\x83\xf2\xb3\xed\xcb\x67" + "\xd9\x96\xef\x4d\xca\x6f\x6a\x82\xf2\x71\xb6\xe5\x8b\xd9\xb2\xa8" + "\x1f\x57\xb6\x0f\x29\xfb\xce\x04\x28\x9b\x20\xd2\x57\x9a\xab\x3b" + "\x82\x2b\xff\x24\x29\xbf\x76\x2f\x94\x4f\xb4\x2f\xef\x69\x5b\x3e" + "\x94\x94\xdf\xa3\x87\xf2\xc9\x22\xbe\xb2\x2d\xff\x14\x29\x9f\x17" + "\x04\xe5\x53\x44\x7c\x65\x5b\xbe\x2f\x29\x5f\x90\x00\xe5\x53\x45" + "\x6c\x6f\x5b\xfe\xc7\xa4\x7c\xe1\x21\x28\x9f\x26\x62\x7b\x61\xf9" + "\xec\x9d\x9e\x50\x2e\x7d\x37\x87\x4d\x1b\xbb\xdb\xd6\x1d\x46\xea" + "\xde\x35\x1d\xce\xc9\xb2\x2f\x8f\x3c\x48\x79\x34\x8c\x2b\xdf\x8f" + "\x94\x2f\xc6\xb6\xdc\x20\x62\xfb\xa7\x71\xf9\x62\x52\xf6\x69\x52" + "\xf6\xdd\xe1\x50\x76\x93\x88\xdd\xad\xcb\xf6\x27\x65\xff\x14\x07" + "\x65\xb7\x8a\xd8\xdc\xba\xec\x00\x52\xf6\x7f\x43\xa0\x6c\x8e\x88" + "\xbd\xad\xcb\x3e\x43\xca\x96\xf6\x87\xb2\x79\x22\xed\xed\x67\x55" + "\xf6\x27\xa4\xec\x1f\x22\xa0\x6c\xa1\x88\x5f\xac\xcb\xaa\x49\xd9" + "\x43\xd8\x87\x45\x22\x3e\xb1\x2e\x3b\x90\x94\x3d\x80\xc7\x5a\x89" + "\x88\x4f\xac\xcb\x0e\x62\xb2\x3f\x9c\xc4\xc5\xe9\xbd\xb6\x65\x77" + "\xf3\x71\xf7\x59\xb3\x7f\xd9\x74\x2e\x56\x96\xb2\x71\x10\xca\xf1" + "\x73\x8e\xf1\xa7\x96\x39\xc2\x4c\xa1\x70\x26\x7b\x6f\x24\x9c\x87" + "\xeb\x3c\x60\x1f\xdb\x3c\x7f\xba\x9b\x9f\x23\x06\x33\xd9\x27\x3d" + "\xb9\xeb\x97\xd9\x97\xf5\xb2\x2e\xfb\x1c\x93\x5d\x3e\x9b\x2b\x7b" + "\xc8\xbe\xac\xd2\xba\xec\x10\x26\xfb\xaf\x69\x5c\xd9\x72\x91\xf8" + "\x3a\xcc\xaa\x6c\x04\x93\x7d\x34\x0f\xca\x1d\x15\x8b\xaf\xcc\x7a" + "\xd5\x30\x1c\x0f\x2c\xb1\x1b\xca\x0f\x25\xf6\xfd\x27\xc6\x83\x06" + "\x97\xb7\x94\x05\x3f\x0c\xb3\x9a\x2b\x87\x99\xfd\x3f\x29\xe3\x6c" + "\x76\xc2\xbe\x0d\x59\xd6\x6d\xf8\x29\xa9\x53\x53\x09\x75\x56\xd8" + "\xb6\x81\x8b\x47\x98\x27\x60\xfb\x0e\x37\x65\xff\xbd\x11\xdb\x17" + "\xca\x56\x0a\x38\x02\xe5\x41\xe3\x3a\x39\xdf\x8e\x60\xb2\xff\x9c" + "\xc8\xd9\x40\x30\x1f\xc1\x78\x64\xe3\x21\xf8\xb7\x82\xf9\x6d\x9f" + "\xa3\x50\x76\x24\x57\xee\xac\xed\x3c\xc8\xb5\xef\x79\x38\x56\x7b" + "\x7f\x0e\xf4\xf0\xac\x13\xe3\x32\x29\x83\x90\xcf\x35\xfa\x0b\x76" + "\x3e\xe3\xbf\xcd\x7b\x96\xe5\x1c\xe6\x12\x43\xca\x54\x3d\x63\xb4" + "\xde\xb7\x9d\x62\x6a\x86\xe8\x91\x27\xce\xd3\xcd\x04\xf7\x2b\xd4" + "\xc2\x7e\x5d\x58\x4b\x54\x73\xf6\x17\xd1\x5a\x8f\x93\xec\x37\x0c" + "\xe0\xff\x58\x2d\x7a\xbb\x12\xff\xbf\x7d\x3d\x63\xc0\xf9\x93\x4d" + "\xef\x9e\x89\xa8\x36\x37\x01\xfe\x18\x03\xd4\x61\x00\xce\x48\xe3" + "\x6f\x4c\xe3\xef\x48\x54\xa7\x35\xa1\x2b\xf4\x17\xbb\x98\xc5\x89" + "\x63\x98\xbc\x67\xb5\x70\xbd\x84\x7a\xf8\x4d\x6c\x0a\x9c\x3a\xe7" + "\x4c\xb4\x66\x29\xce\x63\xfd\xc5\x65\x5d\xf0\xb3\x5a\xe6\x37\xb3" + "\x1a\x53\x32\xd0\x8f\xa1\xdd\x2c\x47\xc3\x39\x6c\xcd\x81\x67\xa2" + "\xd9\xdc\xb5\x37\x13\x7f\x46\xf2\xd6\xfe\xfb\x2a\xce\x57\x8b\xf3" + "\xd6\xde\xcf\x59\x5b\xf2\x7c\x14\xc9\x83\xfb\xef\x51\x6c\x5f\xd6" + "\x33\x35\x8c\xca\x10\x6b\x6e\xdd\x90\x85\xbf\x07\xad\xc9\xb8\x86" + "\xea\xb9\x63\xb8\x4e\xae\x9e\x23\xb6\xf5\xe0\xf3\x74\x61\xcf\x47" + "\x81\x0d\x62\x4d\x5b\x99\x42\xb3\x2f\x93\xc7\xe4\x28\xbc\xaa\x93" + "\xb5\x88\x7c\x5f\xf1\x6c\x6f\xc6\x7f\x66\xb5\x79\x2b\x93\xce\xe4" + "\x78\x1b\xaa\xf5\xad\xec\x7e\xa8\x7b\x03\xe6\xbd\x77\x94\xdd\x37" + "\x31\x39\xdd\xb7\x6a\xfa\xe0\xef\xb5\xfe\x9b\x8d\x4f\x78\x3f\x93" + "\xab\xf0\xc2\xf6\x34\xe7\x7a\x1b\xe8\x10\xe4\x79\x27\xb0\xfb\xa6" + "\xe6\xec\x7f\xef\xb5\x7c\x67\xce\x72\x2d\x5c\xaf\x96\xab\xcb\xf9" + "\x9c\xbb\xff\x0e\xc7\x39\x77\x9d\x2f\xff\x45\x03\x2e\x2f\xfe\x0d" + "\x12\xe0\x57\xb9\x67\x12\x9b\xb3\xcf\x46\x69\xe9\x53\xfd\x89\xcf" + "\xcf\x82\xff\xbb\x4f\xe0\xfe\x8f\xd5\x7a\x78\x87\x72\xff\x27\x68" + "\x3d\xca\xe3\xb8\xff\x53\x2c\x39\x8e\x45\xeb\x55\x9e\x19\x03\xbe" + "\x9e\x6e\xde\x19\xeb\x85\x39\x3e\xf9\x46\xc3\x99\x31\xaa\xbe\xf8" + "\xdb\x35\x67\xf5\x70\xcd\xe9\xc4\x27\x67\x4f\xc3\xdf\x00\xee\xaf" + "\x8e\xfb\xcb\xe0\x32\x2c\x8e\x83\x9e\xae\x05\x7f\x58\x7c\x71\x99" + "\xd5\x36\x18\x37\x80\x2d\x26\x50\x81\xd8\x7a\xf3\x9f\xd5\x5a\xb7" + "\x21\x62\xe8\xb0\x9f\x0e\x1f\x31\xf2\xf9\xc8\x51\xf1\xf3\xde\x48" + "\x98\xbf\xe0\xcd\xc4\xa4\xb7\xde\x4e\x5e\xb8\x68\x71\xca\x92\xa5" + "\xcb\x52\x97\xaf\x58\x99\xb6\x6a\x35\x7e\xe8\xed\x7e\x5b\x77\x4e" + "\xf0\xd0\x53\x08\xae\x31\x1e\xae\x71\x8e\xfd\xee\x2d\xde\x47\xf0" + "\x75\x6e\x82\xa7\x4a\x5c\x3b\x54\xc3\x28\xc2\xdf\x2a\x6c\xa2\xcf" + "\xed\xc1\xdf\x4e\x04\x7c\x7b\x54\x17\xbd\xa8\xc1\xdf\x67\x6e\xa0" + "\xcf\xe5\x55\xe9\x5e\xd4\xe0\x6f\x7f\x7f\x16\xd2\x88\xfa\xf7\xc3" + "\xdf\x70\x3e\x97\x85\x8f\x17\x3f\x83\xd0\x09\x38\x57\xac\xce\x7e" + "\x4a\x14\xf2\x5e\x2f\x46\x97\xd7\x8b\x69\xc2\xf5\xe7\x15\x30\x8d" + "\xba\x35\x89\x28\x1b\x7e\xc3\x18\x53\x5e\xa1\xbf\x9c\xf1\x59\x28" + "\xfb\xbd\xd5\xd0\xdd\x05\x4c\xc3\x86\x5e\x4c\xc3\x6f\x0a\x98\xa6" + "\xe2\x5e\x8c\xb6\x7f\x1e\xf2\x6d\xce\xfe\x12\x70\x77\x8e\xf5\xd1" + "\x76\x38\x6e\xf6\x3f\x87\xb6\xc3\xb1\x21\x46\x44\x17\xc3\x6f\xd8" + "\xa7\xff\x4c\x45\xda\xfd\xd1\x6d\x43\x37\xe8\x5f\x13\xd3\x96\xec" + "\x91\x0d\xd7\x21\xfe\xf8\x72\xd5\x09\x60\x1d\x70\x3d\x5d\xb5\xa1" + "\x1e\x69\xe9\x2f\xd3\x8a\xef\xb1\xd7\x0b\xa8\x2e\x6c\x42\xb8\xbe" + "\x0f\x97\x1a\xba\x2d\xeb\xc3\x18\xa1\x6c\xac\x79\x4d\xb2\x07\x94" + "\x19\x0e\x75\xeb\xad\xfb\xa3\x5e\xb0\x30\x55\xb5\x68\x79\x72\xf2" + "\x40\x05\x52\xb3\x7f\x05\xdf\x0e\x4f\xc5\xb9\xd5\xdf\x2b\x60\x4e" + "\x40\x3f\x35\xd0\xdf\x8a\xd3\xa0\x52\x00\x1b\x08\xfa\x94\x03\xf5" + "\x9e\x86\xfd\x47\xe1\xff\xa3\xd0\xf6\x0a\xf2\xad\xe2\xef\x5a\x98" + "\xec\x2f\x37\x40\x3b\x2b\xf0\xb7\xd8\x70\x2e\xf6\x3b\x2b\xa7\x7b" + "\x40\xbf\xf3\xa0\x5c\x85\xaa\x0f\x1a\x70\x85\xfe\xcf\x0c\x68\xc7" + "\x5e\xf8\x1f\xca\x37\x7a\x60\x3f\x42\xf9\x13\xa4\x5f\xdf\x5d\xc5" + "\xbf\xc1\x56\x9a\x5d\xbd\x98\xad\xcd\xd9\xff\x89\xc0\xdf\x98\x60" + "\xbf\x7f\x09\xbf\xc1\x2e\x15\x50\x36\xe7\x4e\xe6\x74\x0f\xd0\xba" + "\x1e\xc5\x7c\x9d\x6c\x9b\x70\x3b\xb0\x7e\xfe\x17\x30\x50\x73\x5b" + "\x2c\x1a\x6c\x40\x1e\xff\x82\x88\x55\x54\xc0\x94\xc0\x56\x04\x5b" + "\xe1\xe7\x70\xec\x14\x6c\x58\x6d\x56\xc2\xdf\xcf\xe1\xef\x29\xd8" + "\x40\x7f\x87\xe0\x76\x2f\x4b\x67\x1a\x87\x14\xa2\xa7\x71\xfd\x80" + "\xad\x5f\xd7\xd3\xdf\xc5\xe0\xb6\xe3\x6f\xc8\x30\xfe\xff\x39\x21" + "\xfc\xee\xc5\xf9\x48\x04\xc7\xe1\x6f\x34\xf9\x6b\xbd\x9d\xcf\x83" + "\xed\x10\xf7\x3f\x78\xf6\x7c\x7f\xf2\xff\x57\x4a\xd8\x42\xdb\xdf" + "\x6c\xeb\x93\xda\xbe\xda\xe4\x7c\x59\xa7\xb6\x13\xce\x95\xab\x8b" + "\x42\xf4\x37\x85\xb0\xd5\x08\xf7\x7f\x53\x4a\xf6\x7d\x9b\x4a\x7e" + "\x7f\x9b\xc5\xfd\x3d\x80\xe8\x06\xb0\x53\x03\xd4\xdf\xd0\x48\xf6" + "\x35\xe8\xe1\xef\x18\xd8\x26\xd9\x5c\x1f\xd7\x59\x87\xfd\xd9\x06" + "\x73\x0c\xf6\xa5\x96\xfe\x4f\x1e\xf6\xd1\x76\x82\x2d\x0f\xfc\x1e" + "\x1d\xec\xcb\x01\x6c\x15\xf1\xf8\x39\xbf\x51\x88\x9f\xf3\x29\x36" + "\xf8\x61\xbf\xcd\x05\x63\xa1\xae\x98\xe0\xe5\xe8\x9d\x35\x09\xf0" + "\xfb\x7c\x2a\xd4\x73\x14\xaf\xeb\x40\x1d\xec\x33\xf8\xdb\xaf\x21" + "\xe4\x97\x88\x3c\x71\x7c\x69\xa2\xcf\x9f\xc4\x98\xc5\xd7\xe6\xae" + "\x4b\xda\x02\xed\x83\x7d\x25\xb8\x7d\x8b\xa1\x5e\xf8\xbd\x17\xca" + "\x95\x54\xa3\xdb\x96\xb6\xb1\xe7\x6c\x79\x0b\xf0\xc8\xb5\x17\xd7" + "\x89\xcf\x63\xf8\x7e\xe5\xe0\x73\xc8\xb5\xbf\x5a\x05\xfb\x23\x20" + "\x46\xe1\x77\xe4\xe8\x6a\xa3\x16\x61\x4c\xe2\xbf\xd5\xc6\x08\x18" + "\x4b\x93\x90\x19\xe7\x85\x0f\x41\x11\x30\xde\xbc\xeb\xe9\xaf\x66" + "\x3f\x97\x8e\x22\x70\x7d\x38\x7e\x6b\xe9\xaf\x54\xc5\x78\x2c\x92" + "\xba\x96\xe0\x7e\xe0\xfa\x3f\x4f\x41\xec\x75\x76\xe3\xf6\xc0\x71" + "\xab\xeb\xe6\x55\x83\xfa\xda\xbe\x9a\xf4\x15\xae\xb5\x17\xce\x2f" + "\xc3\x7d\xc7\xf6\x84\xe3\xe5\x50\x4f\x39\x3e\x86\xbf\x23\xc9\xf5" + "\x67\x2f\x7e\x37\x11\xdb\x03\x97\xc7\xdf\xbb\x27\xdf\xbc\xf8\xf2" + "\x02\x6b\x37\x38\x1f\xfb\x83\x81\x6b\xe0\x3a\x32\x8d\x8c\x91\x81" + "\x78\xf4\xbb\xd5\xf8\x7b\x69\x75\x43\x85\xfe\xf9\x5a\x69\xed\x1f" + "\x38\xaf\x0c\xce\x3f\x81\xe7\x7e\x1c\x4f\xe0\x9a\x01\xf8\xfb\xce" + "\xb0\x2f\xc7\x9c\x0d\x75\xac\x30\xb0\x6b\x51\x50\x4f\x18\xb4\x25" + "\x07\xd7\x03\xed\x39\xc1\xd5\x35\x1b\xe7\xc7\xb7\xf6\x35\x57\xdf" + "\x5e\xec\x73\x76\x3c\xaf\x66\xfb\x04\xb1\xeb\xeb\x5b\xbb\xc9\xb1" + "\x72\x28\x53\xce\xb4\x4d\x42\xcc\x9a\x58\xee\x3b\xd2\xec\xb1\x43" + "\x99\x2d\xac\x7f\x4f\x90\xb8\x56\x17\xb8\x6c\x2d\xd3\x68\xd5\xee" + "\x0a\xcb\xf7\xa3\xb8\x76\x1f\xc2\xd7\x63\x56\xce\x66\xe7\x50\x7c" + "\x0d\x7c\x3e\x57\xdf\x5e\x5c\x9f\xc5\x56\xcf\x41\x3b\x88\xbd\xbe" + "\xaa\x85\xfd\x7b\x31\x16\x59\xbb\x41\x1c\xbd\x93\x89\xb1\xf8\x75" + "\x25\x9c\x7f\x34\x1b\xff\x5e\xc9\xfe\x8e\x63\x63\x2c\x7f\x3c\x08" + "\x1f\xaf\x06\x94\x6e\x7f\x1b\xb0\x64\x46\xe8\xe9\x20\x14\xa1\x5f" + "\xcf\xf6\xed\x80\x7e\xcd\x04\x8f\xcf\x8c\x08\xe1\x76\x82\x8d\xca" + "\x9b\xb3\xeb\x52\x61\xae\x39\x84\xdb\x0a\xf1\xfa\x10\xf3\xbb\x58" + "\x84\xdb\x0c\xf1\x8c\x6b\x5f\xdd\x65\xce\xf7\x87\x70\x1f\xb1\x3d" + "\x9f\x23\xb1\x0f\x8e\x7d\xb3\x19\xb7\x9d\xef\x77\x9d\xc6\xda\xc6" + "\x6c\xbf\xc1\x0f\xd8\x5f\xd8\x2f\x56\x75\x62\xec\xe7\x40\x5d\x07" + "\xc8\x6f\x82\x0d\x6c\xeb\x9c\x5e\x4c\x25\x2e\xcf\x97\xbd\xc0\x7e" + "\x1b\x3b\x03\xae\x3d\x24\x85\x7c\xd3\x17\x7f\x03\x0c\xea\x3d\xa0" + "\x59\x6d\x44\x50\x47\x39\xb6\x29\xb4\x65\x32\xc6\x23\xfc\xae\xe4" + "\xce\x8b\x86\xf9\x3c\x1c\xb6\x31\xfc\xf8\xff\x66\xac\x10\x5f\x17" + "\x6c\xc7\x3f\xf6\x77\x8e\x39\x73\x12\x62\xf1\xb0\x14\xa9\x6e\xd0" + "\x17\xce\x73\x73\x07\xe7\xeb\x6f\x06\x7f\x06\xe3\xc5\xaa\x8e\x43" + "\x36\xbe\x2e\x67\xf1\xb8\x32\xda\x03\xf7\x19\xce\x2d\xe7\xea\x61" + "\xfb\xcc\xe2\x69\x3d\x8b\x81\x4a\x66\x25\xf4\xf3\x3e\x0e\x2e\x28" + "\x39\x3f\x57\xda\xd8\xc4\x12\xbb\x66\xe3\xef\x11\xe3\x98\x04\xbc" + "\xfa\x67\xcd\x6d\x7c\x5c\xc2\xbe\x37\xb3\xbe\xbf\x50\x5e\x4c\xe6" + "\x5b\x2e\x6e\x5d\x20\xc7\x7b\x09\x30\x8c\xdb\x72\x9d\xc5\x2f\x6e" + "\x4b\xe6\x6c\xdc\x96\x72\xb6\x1d\x99\x2a\x74\x83\xfe\x26\x01\x5f" + "\x1f\xce\xd5\x71\xe3\x95\xab\xab\xee\x04\xae\xeb\x37\x10\xab\x70" + "\x9b\xe0\xda\x31\x6c\xfc\xfb\x05\x6b\x93\x93\x5c\xdb\x2b\x0c\xeb" + "\xf1\xb9\xe7\xcb\x5b\x28\xf6\xdc\x0a\xf8\x3f\xdc\x40\xbe\xe7\xa6" + "\x80\xf3\x4b\xd9\x67\x2c\xe9\x6f\xfb\xe3\x18\x8d\xdf\x1d\x86\xff" + "\xfd\x54\xaf\x02\x56\xaf\x21\x4f\xa8\xcf\x0b\x63\xd4\x82\x8b\x26" + "\xba\xde\x84\xb5\x0a\xd8\xfa\x00\x70\xa4\x52\x6c\x6f\x8c\x65\xe0" + "\x48\xc3\x9b\xb3\x2f\x86\x5b\x70\x0b\xd7\x29\xc2\xb6\x27\xfe\xb9" + "\xb8\x04\x70\x5c\xce\x63\xeb\xe2\x12\xce\x8e\xa5\x60\x47\xaf\x2b" + "\x74\xfd\x2d\xae\x5f\xa5\x50\x1e\xb8\x58\xfd\x25\xae\xed\x85\x5c" + "\xf9\x6d\x16\x3f\x70\x63\xb5\x32\x1b\xc7\x5f\xd6\x07\xda\xfe\xdc" + "\xb9\x7b\xc9\xb5\xb4\x03\x2c\x65\x31\x47\x24\xdf\x66\xd6\x0e\xc0" + "\x71\x70\x08\xf8\x9e\x8d\x7d\xab\x5b\xd9\x72\x5c\x6c\x3c\x41\xae" + "\x51\x7f\x9a\xc5\x21\xf0\x1e\x1e\x47\x17\x8d\x36\xf1\x09\xc7\xe2" + "\x9c\xaa\x0d\xe4\xdb\x77\x18\x4b\x38\xa6\x62\x4d\x04\x6d\x3c\xcb" + "\x8d\x1f\xae\xcd\xda\x24\x21\x56\xea\x8f\x00\x56\x06\xf3\x75\x6b" + "\x63\xc5\xe6\xb9\x62\x12\x03\x8b\xb8\xbe\xed\xe7\xfa\x76\x80\xeb" + "\xdb\x7e\xae\x6f\xa5\x70\x0d\x6c\xb7\x85\x56\x76\x04\xbb\x5d\x3a" + "\xcf\x95\x2f\xc7\xb1\x9c\x1f\xaf\x97\x82\x2d\x63\xd9\x3e\x5e\x5c" + "\x3a\x85\xc7\x83\x55\xbb\x74\x36\xf1\xa2\x5c\x3c\x5e\x68\x35\x5c" + "\x7f\x4b\x6c\xc6\xc6\x5e\x8e\xef\x5e\xb0\xf8\xa1\x4a\x6f\xf9\x06" + "\xe1\x97\x17\x70\xfc\xc4\xd7\xb6\x9e\x83\x76\x13\xbb\x72\x63\xf9" + "\xd2\x61\x7b\x3f\x5c\xda\x60\x3d\x9e\xb1\xaf\x71\x4c\xc0\x75\x60" + "\x9f\xb2\xbc\x12\xf6\x11\xbf\x5e\x9a\x8d\x63\x83\x75\x8c\x86\xb2" + "\x79\x66\x06\x8f\x97\x4b\x9b\x84\x63\x51\xab\xe7\xc6\x22\x77\xed" + "\xfa\x99\xe0\xa3\x08\xab\xeb\x1a\x6d\xae\x8b\x7d\x73\x82\xfd\x56" + "\x0c\xf1\xe9\x44\xcb\x9c\x86\xcb\xc3\xb9\x69\xcd\xd9\xf5\x11\x36" + "\xf3\x63\x0e\x6e\x1f\x5c\xab\x94\x8d\x59\x05\x6c\xac\x48\x6b\x66" + "\xdb\x53\x3f\xbc\x98\x9b\x27\x60\x5f\x04\xb7\x0f\x71\x73\x89\x05" + "\x37\xfb\x84\x6d\xaa\xcf\x11\xe7\x47\xda\x52\x0b\x3f\x62\xeb\x62" + "\x63\x51\x7d\x1e\xd7\x3f\xbc\x6f\x30\xd9\xa7\x9d\x8d\xf7\x65\x13" + "\x3b\xe4\x31\xec\x7c\xa5\x45\xdc\x7c\x85\xc7\x17\xa5\xa5\x2f\xa6" + "\xe0\x31\x86\x7f\x43\x1d\x8d\xb8\xfe\xea\xac\x56\x5c\xa6\x10\x8e" + "\xf9\xe2\x78\x80\xe3\x05\x7e\x36\x98\xfd\x3b\x85\xfd\x3b\x02\xc7" + "\x1d\xcc\x43\xf0\x71\x2d\xfd\x8d\x11\xc7\x22\xd8\xff\x12\xce\x0b" + "\xc8\x7c\xef\x05\xf5\x7e\x1b\xce\x9d\x3b\x87\xe5\x0a\xdf\x4f\xa2" + "\x2d\xfb\x2c\xe7\xc1\x38\xf2\xc3\xe7\xe1\xf3\x2d\xf1\x0b\xc7\x2e" + "\x23\x8e\x4d\xe4\x7a\x7b\x38\x8c\xb3\xba\xc1\xc2\x8b\xda\x28\xab" + "\xb2\xf8\x5b\x6a\x24\xa6\x35\x71\xf1\xec\x02\x3e\x97\xf5\x1f\xc4" + "\xca\x8c\x16\xe6\x52\xf1\x52\xe4\xb9\xfb\x36\x8e\x8b\x5f\xd6\x91" + "\x76\x36\x44\x92\x7e\x34\x78\xb0\xfd\x20\x31\x35\x87\xb4\xe5\xcb" + "\xba\xdd\xad\xec\xb1\xa7\x70\x5f\xf0\xb1\xed\x56\xc7\xf0\xb7\x11" + "\xe1\x18\x59\x2f\xb1\x39\xcf\xdc\x96\x68\x57\xbe\xb8\x95\xd5\x7d" + "\x5e\xbb\x0b\x2c\xb1\xb7\xa1\x9c\xb4\xb3\x61\xb9\x25\xee\x82\x5d" + "\xd8\xd8\xcb\x1e\x5b\xc0\x95\x99\xc2\xfd\x65\xe3\x7b\xc3\x3e\x62" + "\xd7\x10\x8a\xd8\xfb\xa2\x2f\xd7\x8f\x23\xac\xce\xfe\x3e\x16\x6c" + "\xdb\x50\x64\xb1\xad\xf5\xff\x78\xfc\xc0\xf5\x95\xf8\x37\x8b\xfb" + "\x74\x56\xc3\x16\xe1\x32\xb8\x4d\x64\x8e\xf8\x36\xcf\x96\x53\x83" + "\xd6\x1b\x8a\xe7\x25\xc2\x55\xbf\x0b\xe4\xd6\x9e\x90\x66\xe9\x07" + "\x30\x2f\x5c\x9e\x6d\x89\x31\x4c\xf3\x24\x84\xbf\xb1\x74\x85\xbe" + "\x3c\x07\xef\xc3\xdf\xc7\xb2\x2e\x83\xe3\xd3\x47\xad\x5a\xae\xce" + "\xcb\x91\x96\xb8\x81\x63\x49\x95\xbe\x9e\xe3\x74\x97\x1b\x77\x73" + "\xb1\xe4\x06\x7d\xf9\xaa\x90\x87\x5d\xbe\x2a\x8c\x19\x57\x4c\xb6" + "\x31\x03\x78\xf3\x86\xe6\xec\xcb\x47\x05\x3c\x00\xf6\x39\x8e\x1d" + "\x97\x73\xf0\x18\xc5\xdf\x66\x65\xe3\x13\xbb\x9e\x76\x65\x9a\xa5" + "\xcd\x38\x6e\xde\x59\x63\x59\xbf\xb8\x72\x1d\x73\x35\xe1\xf5\xae" + "\x84\x0b\x62\x27\xbe\x9e\xa5\x3e\x4f\xc4\xae\xa9\x68\x96\xe2\xf5" + "\x96\xcb\x46\x2e\xce\x97\x08\x62\x25\x37\x87\xe1\x38\x29\x9c\xab" + "\xbe\xbc\x20\x9c\xab\xae\x9c\xb7\x8f\x91\x57\x4a\x9d\x9f\xab\xae" + "\x64\xe1\xb8\x65\x89\x91\xc2\x58\x70\xe5\xc0\x6e\x01\x97\xbd\x32" + "\xdc\xc2\x65\xf9\x38\x7a\xf9\x04\x8e\x51\x70\xfd\x72\x72\xed\xef" + "\xfa\xc3\xbc\xaf\xb6\x5c\x1b\x8e\xcf\xae\x52\x01\x36\xb3\xbf\x84" + "\x6b\x5c\xf6\xe2\x38\x20\x3b\x36\x5b\xd9\x6f\xf1\x35\xc4\x00\xfe" + "\x14\x18\x67\x9a\x45\xb7\x51\x03\x3f\x57\x9c\xb8\xb3\xd8\x62\xdf" + "\xef\x0e\x5b\xf3\xc2\x5d\x05\xcc\x26\xb8\xce\x56\xeb\x3e\x6e\x83" + "\x7d\xdb\xb9\x35\x04\xd6\xb6\x6c\x5d\xdf\xc5\x15\x17\x08\xfb\x46" + "\xfa\xf1\x1d\x5e\xcf\x38\x8a\x35\x11\x5c\x7f\x3a\xe6\x3d\xf8\xfb" + "\xcc\x10\x67\x6a\x8b\xef\x63\xfe\x7c\x78\xcb\x7a\x6b\x7e\xf5\x9f" + "\xe1\x38\x56\x72\xda\xb3\x02\xf8\x4e\x8e\xf5\x5a\xcc\xe4\x9f\xc7" + "\xa8\x52\x96\x26\x2d\x4a\x5d\x30\x4c\x95\xb4\x28\x29\x35\x29\x3e" + "\x39\x69\x75\x7c\x6a\xd2\xe2\x45\xe1\x0b\xe3\xdf\x4c\x7a\x43\xb5" + "\x32\x7e\x99\x2a\x22\x6d\x40\x9a\xe2\xff\xb3\xf7\x3e\x70\x51\x57" + "\x59\xc3\xf8\x99\x3f\xc8\x68\x28\x03\x51\x4d\x45\x36\x1a\xd6\xa8" + "\xa0\x58\xb6\x6b\x0a\x8a\x89\x85\xe5\x1f\xca\x3f\x51\x9a\x4a\x82" + "\x8e\x89\x42\x30\xea\x88\x28\x38\x6a\xd9\x66\xf2\x27\x52\x2a\x04" + "\x2c\x6b\xad\x6c\x73\x5b\x2b\xda\xb5\x8d\x82\x5c\x76\x57\x18\x9f" + "\x5d\xf7\x7d\x78\xf6\xe7\x6e\x13\x2f\xb1\xe4\x83\x3a\xc5\xe8\x4c" + "\x3a\x33\xf7\x77\xce\xbd\xdf\x2f\xf3\x87\x19\xad\xf7\xe9\x7d\x9f" + "\xf7\xf3\xfb\x45\x8d\xdf\xef\xf7\xde\x73\xcf\x3d\xf7\x9c\x73\xcf" + "\x3d\xf7\x3f\xf8\x40\x27\xeb\xb3\x8b\x8a\xd6\xaf\xcd\xcd\xd1\xaf" + "\x5b\xbd\x22\xa9\x30\xb7\x28\xd7\xa4\xcf\x2e\xcc\x5f\xbf\x2e\x47" + "\x3f\x2a\x67\xdc\xa8\xe4\x9f\xe5\x0c\xf1\x1f\x43\x1b\xa9\x85\x5e" + "\xef\xc5\xaf\x7b\xca\x2f\x82\x26\x5a\x51\x50\x18\x6d\x5e\xbd\x4e" + "\x8c\xd9\xf5\x78\xc6\x57\x43\x01\xc6\x47\xd5\x57\x11\xaf\x7b\xb4" + "\xf8\x54\x13\x1c\x96\x53\x8f\xef\x1a\xa4\x3d\xde\xb9\xa7\xa7\xc9" + "\xa6\xea\x3d\x44\x3c\x43\x5e\xe8\xb1\x6c\xf1\xec\xe2\x1f\x7b\xd0" + "\x67\x2b\xa0\x35\x01\xf5\x17\x21\xae\x62\x03\xa8\xf1\x17\x85\x3f" + "\xad\x52\x4b\x63\x5d\x3d\x0e\x9b\xea\x8c\x56\xdc\x39\xf6\x75\xb5" + "\x3d\x26\xf2\x10\xab\x88\x3c\x24\xe4\xf2\x75\xa5\x3c\xc6\x3d\x6f" + "\x27\xcc\x23\xfd\xec\x54\x7d\xcd\xc7\x67\xb7\xa3\x2e\xd3\xb8\x6f" + "\xdf\xef\xef\x4d\x43\x7f\xf0\x34\x8d\xdd\x62\x5c\xa5\x43\x09\x51" + "\x48\x97\xba\xb9\x24\x19\x5e\xc0\xbc\x8a\x74\x8c\x39\xf7\x7c\x9d" + "\x25\x8f\xa7\x61\x19\xb4\x58\x96\x0e\xa9\x1c\x53\x78\x39\xf6\xb2" + "\x84\xea\x58\xa4\xaf\x8a\xe8\xf9\x7a\x87\x5c\x06\xa4\xbb\xc3\xa6" + "\xea\xe9\x41\x3a\xb5\x44\x57\xa8\xb1\x3e\x1a\xef\x42\x3a\xdb\xbc" + "\x1b\x90\x6f\xc3\xc5\xfd\xae\xe5\x75\xa2\xfe\x61\xb9\xd4\xf5\xf8" + "\xbe\xe7\x5b\x88\x7a\xbe\x10\xe2\x98\xe5\x56\xd6\xe6\x70\x83\xd5" + "\xd8\x01\xd1\x9b\x98\x9d\x7d\xf0\x75\x8f\x54\x26\x17\xd9\x86\xdf" + "\x3c\xd9\xa1\xa6\x32\x61\x5b\x11\x55\xff\x6d\xd8\xb1\x45\xf5\x0b" + "\xd7\x33\x07\x7b\xc5\xdf\xe7\x3a\x93\x4d\x3c\x21\x7f\xab\xcf\x42" + "\xf7\x17\x9f\xc9\x40\x5e\x36\x48\xbe\xb1\x83\x5d\x5e\xe2\xe7\x4b" + "\x9d\x21\x3d\x73\x84\xc1\xad\x91\x71\x33\x25\xbf\x17\x59\x27\xe4" + "\x7f\xa6\x0d\xd3\xd8\xfd\xf0\x1f\x0a\xc6\x4f\x38\xf1\xdd\x2e\xe7" + "\x23\xfa\xe1\x67\xc8\x27\xb0\xa3\x2e\xdb\xc3\xe4\x97\x50\xb5\x97" + "\x9d\xb2\x62\x78\xf9\x77\xa0\x46\xd8\x53\xf5\x7b\x09\xff\x7f\x6a" + "\x90\xef\x79\x84\x7f\xfb\xf5\x00\x3b\x10\xa6\x6f\xcf\xd7\x0d\x34" + "\xbe\x8b\x71\x58\xff\xff\x47\x4d\xf0\x98\xb5\xa4\xcf\x93\x83\xf4" + "\x39\xad\x8a\x7c\x42\x6c\x5d\x48\x87\xca\x2f\x60\x3b\x8c\xdf\xe3" + "\xaa\xc1\x40\xf9\xe0\xfb\x49\x1a\x0f\x41\x9c\x66\x39\x3f\x86\xfa" + "\xbf\xc7\x2b\xc6\x60\x24\xdd\x4a\xb4\x9a\x7b\x68\x5e\x84\x35\xa3" + "\x7d\x27\x1a\x49\xc7\x30\xcd\x61\x59\xa7\x50\xd7\x4f\x71\xbd\x8a" + "\x03\x03\xdb\xf3\x9f\xc9\xf5\xb1\x08\x87\x7a\x55\x87\xfa\x44\x7a" + "\x85\xb0\x1d\xb2\x4e\xa1\xae\x9d\x24\x38\xa4\x61\xc8\x91\xe2\x34" + "\x35\xd9\xc8\x2e\x55\xef\x1c\xd2\x31\xb6\xef\xc1\x0e\x76\xc3\xe2" + "\x0e\x21\xa7\xde\x39\x56\x97\x90\x81\x8f\xef\xbd\x7a\x3f\xbe\x9f" + "\x44\x3d\x1e\x42\x7c\x16\x63\xd5\xbd\x73\x90\xb6\x93\xdc\x17\xdf" + "\x82\x32\xe0\x6d\x55\x6f\x14\xa5\x97\x78\x78\xc2\xc7\xc3\x5e\x63" + "\x28\x1e\x06\xf1\x4e\x4d\x3f\xb6\xa7\xd7\x44\x75\x05\xd3\x60\x9b" + "\xfd\x9f\x29\xe1\xe6\x0a\x30\x0f\xb5\xba\x1a\x34\x94\x47\x4b\x1c" + "\x87\x3f\x21\xe7\x51\x8e\xbc\xb6\x97\x1a\xaf\xa8\xcf\x2d\x0d\x00" + "\x34\x26\x4e\xe9\x13\xe2\x88\xbf\x67\xa3\x7c\xe9\x99\x23\x38\xfd" + "\xa8\x15\x01\xb4\xf2\x1f\xdb\x73\x56\xff\x42\x2c\xea\x11\xa7\xf7" + "\xec\xec\x2b\xd1\x9b\xa0\x17\xed\x64\xd3\x48\xd2\xef\xb3\x3b\xad" + "\x35\x00\x14\x26\x7d\x9b\xfa\xb0\xed\x09\x1e\xdf\x0f\x3f\xdf\x70" + "\xf6\xf3\xc0\xf9\x86\xb3\x47\xc3\xcd\x37\x04\xe6\x7b\x4e\x41\xf9" + "\x7a\xeb\x17\x28\xfc\xf2\xee\xf5\x86\xc8\x5b\x4e\x3f\xae\xc1\xbf" + "\x3f\x73\xee\x21\xa2\xa1\x1d\xdb\x29\x76\xf3\x02\x05\x43\x3c\x2d" + "\xbc\x0d\x3f\x97\x29\xfc\x17\xf2\x8b\xce\x25\x13\x4c\x70\x39\xfa" + "\xff\x34\x71\x9f\xd2\xe3\x3b\xfe\x11\x71\x1f\xd0\x28\x04\xe8\x3b" + "\xe4\x68\x65\x00\x30\xb0\x10\x1f\x51\x00\x23\x38\x3c\xc3\x3f\x11" + "\x24\x7d\xdb\xf9\x87\xba\x1f\xbe\x3f\xfe\xbf\xf0\x37\x58\xd0\xcb" + "\xf1\xb9\x40\x21\xe5\xe7\x5f\xa6\xf4\x2b\xa4\x66\x20\x27\x09\xf5" + "\x47\x23\x05\x65\x0b\x22\x00\x46\xea\x38\x30\x63\x6e\x11\xd1\xff" + "\xcd\xfc\xbf\x29\x24\xf0\x1b\xff\x54\x4b\xfc\x32\xb8\x55\x95\xc3" + "\x97\x77\x8d\xca\xec\x0f\x52\x36\x68\xfd\xb3\xd4\x42\x59\x04\x7f" + "\x89\xa6\x7f\x5c\x88\xcf\x80\xf1\x23\x27\xf5\x03\x5c\xeb\xd8\xe6" + "\x07\xfe\x67\x41\xfe\x6d\xbb\xae\x50\xc6\x1f\xfa\x37\xdc\xef\xfd" + "\x56\xf1\xb8\x2d\xe3\x47\xc4\x7f\xe5\x3f\xfd\xc9\xc1\xf2\xab\x4f" + "\x3d\x6e\x3b\x19\x0a\xd4\xc7\xff\x84\x64\x39\xc8\x5f\x43\x7d\xf1" + "\x77\x1c\x0e\xfc\x1e\x6d\x0c\xfc\x1e\xdb\xf8\x63\x90\xde\x44\xff" + "\x94\xda\xb0\x6f\x32\x66\x47\x7f\x60\x74\x50\x95\x89\xae\x08\xaa" + "\x42\xbe\x3f\x89\x1a\x15\x40\x62\x94\x5f\xb0\x3a\x34\xf4\xff\x9e" + "\xbf\x9b\xb6\x49\x15\xe2\x56\xbb\x76\x40\xe4\xb4\xa0\x30\xfa\x1e" + "\xa4\x97\xc2\x26\x7c\x3a\x00\x9e\x87\xe9\xfd\xbe\x15\x69\xf8\x4f" + "\x03\xea\xff\xe9\x1f\x83\xd6\x9f\xfe\xfe\x7f\xf8\xa7\xa0\xfa\xf1" + "\xd3\xdf\xff\xa6\x3f\x26\x5a\x71\xb4\x44\xfc\x41\xff\xb1\x7e\x43" + "\xc9\xa4\x08\x26\x05\x30\xe9\xe5\x47\x69\xc7\x7f\xfa\xfb\xe9\xef" + "\xa7\xbf\x9f\xfe\x7e\xfa\xfb\xe9\xef\xa7\xbf\xff\x0f\xfc\x29\x78" + "\x3f\x82\x49\x7f\xfd\xef\xfd\xf1\xd4\x0d\x5a\x1d\xc7\x94\x0a\x60" + "\x7e\x11\x65\x77\x83\x42\x03\x83\xd4\x3f\x9e\x97\xa7\xef\x27\xe8" + "\x7b\x26\xa0\xbe\x24\xad\x3b\xba\x0b\x7f\x37\xfb\x85\x27\xfc\x58" + "\x14\xfd\x68\x7f\x0a\x64\xa2\x0a\xfb\x87\x11\x30\x08\x22\x41\x03" + "\x83\x61\x08\x5c\x03\x51\x30\x14\x86\x61\xbf\x53\x0b\x31\x10\x0b" + "\xd7\x42\x1c\x5c\x07\xd7\xc3\x0d\xa0\x83\x1b\xe1\x26\x2c\x51\x3c" + "\xdc\x82\x7d\xfc\x5b\x91\x31\x23\x60\x24\xdc\x16\xba\x5c\x65\x90" + "\xa6\xc3\x7f\xf0\xff\x4c\x48\xe3\xdf\xcb\x7f\x0a\xff\x3f\x1a\xde" + "\x24\x85\x9f\x94\xc2\x6d\x3f\x85\xff\x1f\x0d\xd7\xff\x37\x3f\x47" + "\xfc\xb7\x3e\x15\x68\xbe\x85\x05\x57\x84\xb4\x9b\xc1\xa1\x0a\xe9" + "\xaf\xff\x1b\xae\x92\x7e\x00\xbe\xc0\xf4\xc1\x7f\x69\xf8\x9b\x28" + "\x5e\x4b\x01\xa4\x31\x5f\xe6\xff\xe7\x3e\x17\xf0\x17\x0e\x51\xff" + "\x9f\x65\x09\xfe\x8c\xf8\x33\xe1\x6f\x23\xfe\xb6\xe3\xef\x79\x19" + "\xad\x80\xd1\xe0\xef\x9b\x2c\x80\x4e\x7c\xfe\xcf\x49\xf8\xac\xc5" + "\xe7\x29\x80\x2e\x4c\xf7\xaf\x43\x00\xdd\x08\xf0\xb5\xdf\xd8\xe8" + "\xc5\xe5\x3e\x6a\xfb\x4e\x88\x77\x3d\xfe\x5c\xb4\x46\x18\x6c\x0a" + "\xb5\x0d\x1f\x4d\x33\x17\x64\xe8\x27\x8c\x9b\x38\xee\xee\xbb\xf5" + "\x49\x99\x49\xfa\x3b\x93\x27\xdc\x39\x3e\x79\xe2\xf8\x3b\x27\xe8" + "\x93\x27\x4c\x9e\x38\x69\xf2\x5d\x13\xf5\x6b\x37\x15\xae\x9e\x90" + "\xbc\x2a\x57\xbf\x2e\x67\x75\x91\x7e\xe5\xea\xc2\xb5\x1b\xb3\x0b" + "\x73\xaf\x5a\xa6\x1f\xf8\x47\xa4\xdd\xe2\x05\x2e\x8d\x40\xce\x4f" + "\x03\xd5\xc5\x06\x50\x47\x1e\x81\x01\xa2\x52\x54\x48\x63\xac\x06" + "\xe9\x17\xf2\x6f\xed\x63\x8b\xfe\x3e\x6a\xf1\xb0\xcf\xa6\xaf\x1a" + "\x95\x3a\xe3\xb5\xf2\x23\xa0\x60\x29\xa0\xb8\xd8\x05\x8a\xde\xc3" + "\xa0\xb0\xd9\x40\xf1\xd7\x32\x50\x4e\x2e\x00\xe5\x04\x37\x28\xef" + "\x38\x04\xca\x9b\x9b\x40\x39\x2c\x7d\x60\xd8\xac\x0a\x11\x56\x82" + "\x61\x85\x3b\x40\xb9\xb2\x04\x94\x59\xc7\x44\xd8\x0b\x79\xa0\xdc" + "\xf5\x7f\xdb\x58\xe2\xf7\xf5\x33\x06\xfc\xd9\xb8\xbe\x61\x7a\xf5" + "\xcc\xa8\x10\x83\xa9\x3f\xfd\xfd\xf4\xf7\xd3\xdf\x4f\x7f\x3f\xfd" + "\xfd\xf4\xf7\xd3\xdf\xff\xe5\x7f\x76\x05\x4c\xfc\x56\xa9\x86\xcf" + "\xd0\x5b\x72\x5a\x34\xf1\x36\x45\xca\x6e\x5a\x7b\x02\xb4\xc7\x0a" + "\x34\xfc\x3c\x18\xf1\x53\xe3\x23\x02\x1b\xfe\x41\xf8\x8b\xd4\xf8" + "\xaf\x61\xa1\x35\x4a\xcd\xba\x64\x50\xe9\x40\xac\xa7\xb2\xb0\x93" + "\x62\x1f\xf4\x9d\xd0\x0b\x1a\xbe\x46\x96\xf6\x95\x22\x7e\xb3\x0d" + "\xde\xd6\xc9\xeb\xaf\x64\x38\x5a\x7f\x45\xeb\xb5\x10\x96\xaf\xd5" + "\x0f\xb3\xde\x46\xcb\xf6\xe9\x94\x33\xf6\x03\xd0\xfe\xd4\x17\xf6" + "\x32\x7b\x4b\x09\x40\xf3\x41\xb1\x4f\x95\xd6\xe2\x20\xfe\x0e\x1b" + "\x3c\x1b\x27\xd6\x5f\x31\xc7\x76\x0c\xc7\xb0\x5e\x1b\xfc\x42\x2d" + "\xe5\xd9\x2b\x87\x5b\x77\x5c\x84\x16\x3d\xdf\x87\x63\x6f\xd1\x7b" + "\x20\x7d\x04\x95\x7f\xb0\x0e\xd3\xef\x0e\xb7\xf6\x46\x5e\x67\x46" + "\x79\x4b\xf0\x19\x41\xf9\x61\x19\x07\x2f\x91\xf3\x0b\x83\x23\x8a" + "\xd2\xca\x78\x90\xf6\x5e\x4c\x53\x21\xe3\x41\x7a\x64\x1a\xed\xe9" + "\x5b\x78\x1e\x87\x43\xd1\xa4\xff\x3c\x25\x22\xf7\x67\xe3\xbb\x52" + "\x4e\xad\x4c\xd0\x5f\x37\x61\x66\x6e\xc2\x1d\x2c\x39\x3a\xf1\xb9" + "\xe4\x6b\xd2\x06\xa7\x0d\x1b\xff\x70\xb2\x52\xab\x1c\xa9\x4c\x8e" + "\xd5\x2a\x6f\x7f\x82\xfe\x3d\x39\xdc\xc0\x9f\x7a\x75\xca\x8e\x9c" + "\x9f\xe9\x23\xa7\x3d\xf3\xf4\x86\xb4\x0f\x7f\x79\x5f\xda\xfd\x8b" + "\x8a\x46\x7f\x96\xac\xbc\xf6\x2f\xcf\x7d\x6c\xf8\x96\x20\x46\x8c" + "\xa4\x7f\x97\x34\xab\xe2\x46\x5b\x08\xcb\xc9\x1b\xf5\x9f\x51\xc8" + "\x18\x75\x8a\x29\xe7\xee\xf1\x07\x29\xc7\x85\x2b\x92\x2c\x94\xe6" + "\xbe\x39\x22\x8d\x80\x18\x7f\xd4\x3f\x6e\xdc\x7b\x94\x5a\xcf\x69" + "\x00\xb5\xc0\xd5\x8f\xfb\x06\x41\xa1\x08\x1d\xd9\x96\x7c\x8b\x94" + "\xf7\xab\xf4\xef\x63\xaf\x8d\x53\x22\x86\xd8\xa4\x7b\x29\x76\xbc" + "\x33\xd9\xa9\x6f\x49\x51\xaf\x4a\x30\x44\x4e\xf8\x25\xbe\x25\xac" + "\x4a\xd0\x2a\xf1\xfd\x19\xf1\x4e\x3c\xc8\xf9\xb9\x80\xd0\x2a\x47" + "\xc5\xa5\xe4\xe4\xfc\xec\x0b\x47\xce\xcf\xb4\xca\xb4\x83\x39\x29" + "\x69\xd7\xef\xce\x1b\x9b\x90\x92\x90\x73\xb7\x56\xc9\x9f\x93\xd3" + "\x46\xfd\xe2\x31\xad\xf2\x8e\x4f\x93\x63\xb4\x8a\x3f\x34\x28\xe0" + "\x73\xe5\xfc\xc3\x9f\xab\xfe\xf6\xb7\xe3\x30\x66\xed\x71\xc5\x98" + "\xd9\xc7\x95\x8a\x98\xe3\x51\x8f\xc2\x1f\xb4\x91\xf0\x07\x1d\xfe" + "\xf4\xf7\x43\xab\xa2\x34\xb3\x55\xb9\x71\x79\xab\xaa\xb4\xbd\x55" + "\xfd\x08\xb4\x46\x2c\x8b\x69\x1d\x74\xff\x43\xad\x91\x8f\x7c\xd9" + "\xaa\xb9\x03\x5a\x07\x03\xb4\x8e\x00\x65\xeb\x48\x88\x6b\xbd\x33" + "\xe6\xe9\xd6\xfb\x87\x2b\x9b\xae\xed\x9b\xde\x74\x93\xfa\xbe\xa6" + "\x04\x2d\x34\x8d\x1a\x02\x4d\xb7\x47\x45\x35\xdd\x81\xbf\xd1\xd0" + "\xd0\x94\x8c\xdf\x29\x10\xdf\x14\x51\x3c\x08\x40\xd0\x72\x5c\x0f" + "\x70\x7c\x04\x4c\x3b\x3e\x12\x9f\xb7\xe1\x2f\x01\x7f\xa3\xf0\x77" + "\x07\xfe\xb0\xff\x72\x9c\xce\x3c\x02\xc3\xa0\x94\x0f\x3e\xcd\xce" + "\x9e\x98\x7d\xf7\x82\x19\x2a\x55\x6e\x02\x5c\x83\x5c\x53\xa7\x24" + "\x8c\x88\x98\x14\x91\x9b\xf0\x85\x23\x0d\xff\xd5\x2a\x1f\xff\xab" + "\x6a\xd0\x78\xe7\x24\xe7\xf2\x0f\xbf\xf0\xc0\x10\xe4\x3f\x04\xeb" + "\x70\x9f\x05\x14\x0e\xa4\xd1\x61\xe9\x9b\xee\xb4\x44\x69\x6d\x30" + "\xd8\x28\xeb\xb1\x88\xfb\x4c\xeb\xb0\x94\xa1\xfe\x45\x25\x86\x8e" + "\xdb\x46\x71\x19\x57\x48\x97\x13\x3a\x8e\x74\x3a\xaa\x4c\x8e\xeb" + "\x53\x36\x67\xe2\x37\xea\xbf\x66\x52\x20\x6c\x93\xca\x61\x51\x6c" + "\xc3\xb8\xc3\x03\xf1\x34\x21\x9e\xf4\x5f\x60\x5c\x6b\x88\xb8\x07" + "\x1c\x96\x87\x29\x8f\xae\xa0\x3c\x1c\x72\x1e\xb4\xff\xbb\x0e\xeb" + "\x17\xd9\x1d\xaf\x65\x70\x23\xa5\xb5\xba\xec\x70\xd0\xdb\xa3\x50" + "\x9b\x4f\x00\xe1\x71\x5a\x86\x26\xc8\xe9\x09\x8e\xce\x2a\xa0\x7d" + "\x7b\x7c\x7d\x28\x0c\x5d\x48\xeb\x43\xf7\x20\x0e\xfd\x06\xc5\x0d" + "\x9d\x10\xe5\xa1\x34\x36\x18\x6a\x74\x28\xff\x84\x79\x0f\x5d\x2e" + "\xdb\x39\x0c\x4b\x01\xb1\x0e\xdd\x81\x65\x2f\xc3\xb8\x92\x81\x34" + "\xff\x29\x56\xf0\x65\x68\x8d\x1c\x77\xa5\x35\x87\x22\x0d\x63\x0e" + "\xcb\x9f\xbc\x98\xe6\xc4\x40\x7c\xac\xcc\x61\x51\x3e\x8d\x71\x3d" + "\x21\xe2\xb6\x89\xbc\x86\xa9\x43\xc4\x59\x30\x4e\x89\x71\xfa\x30" + "\x71\x2a\x8c\x4b\x09\x15\xd7\x52\xcb\x71\x66\xf5\xf3\x7c\xd8\xd0" + "\x34\xfc\x36\xca\x3c\xbf\x7a\x79\x48\xde\x13\x90\xef\xc3\x6a\x83" + "\xf1\x13\x6e\x87\xb2\x8d\xf0\x35\x0e\xcc\xfb\x84\xc2\x61\xc9\x40" + "\x5d\x18\x76\x6a\x60\xdc\x9f\x6f\x46\x3e\x10\x5d\xf6\x10\x71\xf1" + "\x58\x1e\xb4\xd7\xd1\x51\x21\x70\x0e\xc2\x38\x1b\xc6\x19\xae\x22" + "\x0f\x2d\xb7\xe1\x74\x3e\xc2\x70\x88\xe8\x86\xd8\x54\x2a\x8f\xd0" + "\x0b\x18\xd4\x0d\x31\x6d\x7d\x62\xad\xbc\x5d\x5f\x0c\x2a\xfc\x3e" + "\xc0\x2c\x4d\xd7\x61\x7c\x2f\xea\x93\xc6\x7a\xd1\x0d\xdd\x10\xbd" + "\x1b\x61\x54\xb4\xb7\x95\xda\x27\x0c\x57\x59\x5d\x6e\xda\xdf\x81" + "\x7a\x16\xfd\x6b\x7c\x2a\x31\xdd\x4b\xa4\x43\xf3\x6b\x21\x81\x68" + "\xe4\xeb\x5b\x2d\x4d\x0a\x5a\x2f\x4a\xed\xa1\x43\x09\x77\x38\xb8" + "\xce\x46\x63\xfb\xa7\x69\x90\xd6\xf6\x12\x0d\x6a\x4c\xbb\x45\xa9" + "\xe5\x6b\xc5\xed\x88\x8b\x68\x78\xc8\x6b\x69\x52\xf6\xe3\x51\x36" + "\x5d\x43\xeb\x7e\xfb\x2c\xca\x59\x0e\x65\x34\x13\x78\xb4\x7a\x19" + "\x0f\xc1\x61\x5e\x7c\xfd\x7c\x9f\x45\x5d\xe5\x07\x93\xee\x9f\xd7" + "\x78\x07\xa8\x88\xe6\x4e\xd0\xd6\x52\x7e\x52\x19\xf9\x5a\x5c\xeb" + "\x06\x37\x58\xd1\xbf\xe8\x06\xad\x19\xcb\xaa\x6f\x76\xd1\x1e\xe8" + "\xa6\x98\xfa\xad\x00\xbc\x5e\x28\x41\x2f\xe1\xac\x91\x71\x12\x0e" + "\xbf\xb2\xc6\x8a\xfc\xa9\xac\x1a\x90\x60\x5b\xfc\x69\x24\xbc\x58" + "\xae\x1b\xea\x10\xae\x05\xbd\x16\x09\xa6\x47\x86\xf1\x93\xc1\x08" + "\x89\x3e\xe2\x0f\xc9\x6c\x89\x5c\x3f\x9d\x96\x18\x6c\xff\xaf\xe9" + "\x11\xf5\xd6\x17\x2e\xd1\xa0\x13\x34\x28\x90\x06\x45\x93\xc0\x1f" + "\x93\x21\xe3\xb7\x81\xd6\xe5\x4f\x73\x1d\x87\xd5\x0e\x16\xf5\x94" + "\xc3\x9a\x7c\xb0\xd1\x01\xb0\xc8\x0b\xa5\x90\x01\x28\x6d\x10\x93" + "\x83\xfc\x50\x21\xcc\x11\x94\xb7\x5e\x86\x91\xca\xaf\xc3\xb8\x69" + "\x12\xbe\x16\x3f\x7c\x26\xc2\x47\xeb\x65\x85\xed\x8d\xb1\xf9\x6c" + "\x1f\xb4\xe2\xb7\x7d\xa0\x7d\xa5\xfa\x1a\xab\x41\x38\x7e\xee\x4a" + "\xc1\x48\xd0\x9e\x81\x98\xaf\xfa\x94\xaa\x1e\xc1\x8b\x58\xb4\x7f" + "\x43\x0f\xca\x69\xf0\x7b\xa2\x0d\xf4\x2e\x29\xbf\x1c\xe2\x8d\xcf" + "\xde\x52\x9e\xb1\x0b\xe4\x3c\xe5\x78\xff\x3a\x93\x36\x78\x3c\xfa" + "\x27\x69\x6f\xa5\xc5\xa7\x0d\x97\x7d\x97\xd4\x96\x95\x09\xe3\x1d" + "\xa9\x2d\xfa\xbb\x93\x5f\xcf\x4d\x48\xe4\x6d\xff\x1d\x9d\xc9\x23" + "\xb1\x75\xff\x0b\xff\xb7\x8a\x42\x12\x78\x08\x86\xd3\xfb\x48\x7a" + "\x97\xfc\x05\x7c\x5b\x38\x5f\x15\x39\xaa\x90\xde\x84\xe7\x90\x76" + "\xfd\xd2\x15\xaa\x74\xe9\x7d\x98\x88\x19\xcb\x7d\x0e\xc3\xbd\xf4" + "\x7e\x3b\xc7\x35\xfe\x20\xe5\x3c\xee\xb9\xe4\x29\x8b\x7e\xa3\x3a" + "\xfe\xf4\x9a\xb4\xa8\x3b\x2c\x04\x93\xf8\x60\xf2\x2b\x18\xd2\x4c" + "\x21\x23\x5f\xe5\x14\xf8\xa7\x3a\x4a\xa9\xa4\xf8\xf8\xc4\x99\xc9" + "\x2f\x2e\x9e\x7f\xdb\x5f\x92\x63\xaf\xfd\x6c\x49\x33\xa5\xbf\x36" + "\x36\x20\xa7\x91\x3e\xaa\x9e\x28\x1f\xbd\xf3\xae\xd7\x05\x96\x45" + "\xf3\x55\x7f\x49\x1b\x9e\x5f\x48\xa1\xb7\x71\x5f\x8c\x7c\x95\xf1" + "\x17\x92\x23\x9e\x5e\xf4\xc5\x6f\x17\xbd\x76\xf2\xb1\xd1\x58\xd2" + "\x6b\xab\x4e\x3e\xb6\xe8\xb5\x2f\x7e\xab\xda\x4e\x90\x63\x72\x92" + "\xe3\xf4\x11\xa9\xeb\x5b\x1e\x1a\xcd\xa9\xba\x61\xb7\xae\xe6\xc6" + "\x83\x37\x1d\xb9\xf9\x58\x7c\xeb\x2d\x7f\x1d\xfe\xcf\x5b\xbf\xd6" + "\x3b\x46\x30\xf4\x23\xa6\x27\x8f\xe8\xf7\x23\x00\xfd\x88\x4e\xf4" + "\x23\x4a\xd1\x8f\x68\xf7\xf7\x23\xfe\x38\x64\x72\x89\xf0\x25\x04" + "\xbc\xf0\x7f\x12\xff\x8a\xfe\xcf\x3a\xf4\x7f\x12\x8f\x47\x2c\x7c" + "\xe4\x78\xd4\x02\xe1\xff\xc4\x44\x0f\xe2\x3e\xd0\x8d\xf8\x44\x3f" + "\xe8\x0f\x23\xf0\x69\xc0\xef\xd1\xb1\x91\x81\x3e\xd1\xc3\xc3\x5a" + "\x23\x96\xa0\x4f\x94\x82\x3e\x51\x5a\x76\xab\x66\xd6\xa7\xad\x83" + "\x27\xa5\xb5\x0e\xe9\xf7\x8b\xee\x6b\x4d\xd7\x8d\x6f\x9d\xa5\x86" + "\xd6\x07\x40\xf8\x46\x3b\x20\xf9\x8f\xea\x38\xc5\x9f\xa3\x40\xfd" + "\xe7\x61\x0d\x43\xfe\x1c\xdd\xd4\xf4\x67\x2d\xfe\x62\xa0\xe1\xcf" + "\xb1\x10\xf9\xd9\xf4\x06\xf8\x6c\x46\xa9\xed\xb8\x1a\x86\x1d\x1f" + "\x0c\x17\x8e\xc7\xe0\x73\xf9\x5e\x38\xfe\x0c\xa8\x8f\x0f\x51\x5f" + "\xf0\x95\x37\xee\xab\xe3\x23\x3e\x4f\x3d\x3e\x32\xe5\xf7\xc7\x6f" + "\x4b\x7f\xf8\x78\xc2\xe7\x9f\x1f\x1f\x65\x1b\xee\xef\x37\x51\x99" + "\x01\xc6\xee\x20\x0f\x16\xf9\x7d\xb7\x61\x50\xf2\xa0\x9d\xb9\xdc" + "\x1f\xfc\x99\xe4\x17\xfe\x2c\x6d\xe6\xd3\x8b\x16\xad\x50\x29\xd3" + "\x86\x73\xef\x52\xf2\x34\x7d\xde\x67\xa0\xcf\x99\xda\xe2\xf3\x39" + "\x13\x1c\x3e\x9f\x53\x3f\x28\x75\x43\x80\x7f\x76\x19\xc3\x4e\xa5" + "\x24\xe8\x47\x25\x73\xcf\xec\xe4\x8d\xc1\xde\xda\xb8\xe7\x93\x53" + "\x13\x34\x77\x77\xa0\xcf\x16\xb9\xeb\x99\x15\xbf\xa4\x1f\x7a\x6d" + "\xdf\x69\x95\x4f\x3f\x99\x3d\x29\x6b\xfb\x18\x94\xf9\xb5\xe4\x05" + "\x47\x3e\xb3\xb3\xf1\x99\x67\x9e\x6e\x3c\xfe\xd8\xfc\xd1\xef\x61" + "\xd8\x67\x09\x26\xd4\x9f\x7f\xcf\xf9\xf7\xf1\x17\x52\x22\x9e\x79" + "\xa4\xf1\xe9\x7d\xab\x56\xb5\x90\xbe\x90\x6c\xe5\x36\xaa\xcf\x12" + "\x8b\x3e\x89\xe2\x43\xa7\xe5\x3a\xf4\x7f\x6e\x6c\x0d\x6e\xcb\x7e" + "\xaa\x97\x3f\xd5\xcb\x9f\xea\xe5\x7f\x47\xbd\xbc\x1e\x44\xbd\xbc" + "\x71\x77\xa8\x7a\x39\x6b\xee\x7d\xf3\x26\xeb\xd7\xaf\xd0\x17\x14" + "\xe6\xaf\x2a\xcc\x5e\xab\xcf\xcb\xcf\xce\xc9\xcd\x19\x02\xfd\x11" + "\xd9\x2b\x4c\xab\x37\x64\x9b\x72\x07\xec\x85\xd4\xc9\x3e\xe9\x40" + "\xdf\xfa\x46\x57\x78\xdf\xfa\xa6\xb8\xd0\xfd\x12\x05\xb6\xed\x37" + "\x25\x87\x88\x1b\x29\xc5\xcd\x0e\x11\x77\xaf\x14\x67\x0c\xd1\x07" + "\x1c\x2a\xfa\x18\x37\xed\x08\x15\x87\xe1\xb5\xb2\x4f\x82\xfd\x34" + "\x65\xcb\xc8\x5e\x20\x9f\xa4\x1b\x6e\xfa\x1c\xcb\xd4\x83\xf1\xc7" + "\x64\x5f\xc6\x06\x37\xed\x90\x7d\x34\xa9\x1f\x62\x70\x58\xd2\xb0" + "\x9c\x37\xd9\x42\xf4\x51\xc6\x48\xf9\xba\x7d\xbe\xd1\x5c\xbd\xd3" + "\x72\x73\xd4\x40\xdf\xe8\x24\x88\x3e\xe4\xcd\x86\x20\xd8\x49\x32" + "\x2c\xfa\x93\x74\x46\x44\x2f\xed\x61\xeb\x85\x9b\x8f\x31\xcb\x8d" + "\x35\xe4\x53\x52\x3f\x92\xf0\x88\xbe\x64\x07\xef\x4b\x62\x5f\xb1" + "\x0b\xd3\x9a\xfc\xfa\x93\x5d\xe8\x1b\x47\x52\x7f\xb2\x1b\x6e\x3e" + "\x40\x7d\xca\x3d\x1c\xd7\x19\xc2\x35\x87\x70\xd9\xe0\xe6\x26\xee" + "\xf7\x89\xb4\x47\xfc\xc6\xcd\xb0\x5f\x7b\x33\x3f\xe3\x54\xf6\x0b" + "\x31\xfe\xa4\x4d\x7d\xc7\x31\xb9\x0c\xe4\x0b\x4a\xe5\x28\x13\x72" + "\xb8\x39\x44\xff\xe7\x64\x95\xe8\x07\xc6\xf7\xf7\x7f\x08\x9f\xd7" + "\x72\xe3\xaf\xeb\x38\xce\xf8\x04\x19\xa7\xbf\x5e\xae\xc8\x5f\xb7" + "\x72\xf5\xaa\xf5\x85\xb9\xfa\xa2\xd9\xb3\xf5\x6b\xf3\x73\x72\xc7" + "\x8d\x1b\x37\x24\x40\xff\xa2\x84\x4f\xfb\xa7\x34\xd2\x43\xf2\x6b" + "\x25\x3d\x4c\x43\x9f\x53\xf2\x9b\xe3\xcb\x02\xfb\x17\x7f\x4a\x93" + "\xfc\x5b\x2d\xc2\x24\x4b\x30\x07\x03\x60\x10\x9f\xe4\x23\x93\x9f" + "\x3b\x4c\x82\x69\x0d\xc6\x83\x71\xbc\x5f\x44\xfb\xf2\xfa\x44\xf9" + "\x7a\x83\xf0\x4c\x97\xfa\x3b\xa8\xf7\x83\xa4\x7e\xc2\x2d\xda\x20" + "\x3c\xd3\x7d\xfd\x0d\x85\x0c\x33\xd1\xbf\x6f\x82\xdf\xe9\xb2\x4c" + "\x7c\x7e\x7c\x73\x8f\xc0\xad\xd0\xfa\xfc\xfe\x5b\xf2\x82\xfa\x52" + "\xd7\xfb\x70\x83\x56\x82\xa9\x08\xa4\xb1\xf9\x8c\x54\x56\x8d\x1f" + "\x9e\xa3\x81\x78\x9a\xff\x53\xc2\xa3\xf2\x83\xe9\x08\xa2\xb1\x67" + "\x20\x8d\x4d\xc3\x04\xee\x06\xcc\xdf\x26\x95\x6d\x78\x50\xf9\x11" + "\x86\xe3\x8e\x43\x98\x78\x19\x66\xa2\x7f\x5f\x8a\xfa\x73\x7c\xaf" + "\x26\x0c\x9f\x4d\xfa\x84\xbf\x41\x48\xf7\xbf\xfc\xfa\x74\x91\x52" + "\xba\xe0\xf2\x0f\xed\xc3\xfe\x42\x7d\x40\x3f\x6d\x78\x50\xf9\xb1" + "\x6f\x18\x2b\xf3\x48\x2d\xc3\x04\x97\xdf\x26\x68\x8c\x89\xf1\x95" + "\x7f\x78\x47\x10\x9e\xeb\x49\xa7\x08\x97\x5f\x5e\xee\x20\x3c\x9d" + "\x12\x1f\xfd\x78\x7d\xab\x3e\x48\x1e\xff\x53\xa2\xc7\x8f\xd7\xb7" + "\xa6\x07\xe1\x39\x4f\xf1\x81\xe5\xba\xd5\x18\x84\xe7\xbc\xaf\x5c" + "\xa8\xc7\x02\x66\x77\x50\x3f\x56\xc9\x2c\x9f\x0d\x0d\xc2\x73\x44" + "\x86\xe9\x1b\xf4\x74\x83\x90\xed\xad\x2d\xb2\x2d\x12\x72\x8d\xe7" + "\xfb\x77\x31\xfc\xb4\xbf\x2d\x40\xba\x7a\x06\xf2\x49\x0f\xc1\x7c" + "\xf2\xa3\x4b\xea\x8b\xeb\x13\x82\xca\x77\x46\xe2\xd3\x10\x3f\x3c" + "\x19\x41\xe5\xfb\x4f\x09\x4f\x84\x1f\x4c\x90\xfc\x9b\x7b\x25\x3c" + "\x6a\x3f\x98\x60\xfd\x3f\x2b\xe1\xf1\xcf\xeb\xe8\xd5\xf9\xa4\x0f" + "\xd0\x7f\xe2\x15\x86\xf5\x5e\x65\x0c\x4a\x23\xe6\x0e\x46\x60\xfb" + "\x77\x90\x8f\xc1\xb3\xd8\xd4\x25\x74\xe6\x14\xda\xe8\x34\x3e\x36" + "\x78\x89\xec\xf4\x08\x73\x3d\xda\x33\x51\x06\x48\x16\xb6\x7b\x04" + "\xdf\xbf\x8e\x69\x33\x6d\x30\xcc\xe4\x3f\x0f\x60\x83\x11\xbb\xa5" + "\x38\x2c\xff\x75\x1d\x72\x1c\x85\x8b\xf1\xc5\x11\xd8\xfe\xdd\x58" + "\x20\xda\xb1\x11\x79\x12\x2c\xda\xfd\xf8\x8c\x50\xfb\x9b\xc3\xcd" + "\xbf\x14\xe9\x98\xb7\xf4\x46\x94\x7f\xd5\x18\x9b\xd7\xc2\xc0\x6a" + "\x76\x81\xfe\x26\x28\xed\x84\x91\x1a\xea\xe3\xef\x29\x06\x4d\x69" + "\x01\x73\xd1\xd9\xb8\xed\xf6\x5e\x28\xb5\xb3\x1e\x3a\x7f\x76\xeb" + "\x05\xd0\xd0\x3d\x0a\x5b\x9f\x02\x5d\x4b\xc9\x57\x21\xf7\xec\x7a" + "\xe9\x3e\xc7\x78\x4a\xdb\x05\xed\xb5\x5d\x50\x5a\x1b\x98\xb6\xf4" + "\x16\xd0\xb5\xd1\x59\xb6\x16\x88\x26\x3a\x68\x3e\xc5\x1d\x3b\xc6" + "\x56\xf2\x12\xa8\x4b\xd1\xbb\x6c\xcb\x69\x92\x69\x39\x49\xb4\xec" + "\x38\x03\x9a\xd7\x56\x36\x29\xb7\x9f\x21\x7a\xef\xb4\xbd\x5b\xec" + "\x52\x36\xeb\x66\x43\xb3\xee\x34\xb4\xe8\x52\xa1\xc5\x9c\x0e\x7b" + "\xce\x40\x54\xb3\x2b\x05\x5a\xd4\xf7\x41\x4b\x42\x3a\x58\x7b\xf1" + "\x5d\xef\x41\x18\x07\x3f\x1f\xa9\x1b\x46\x36\x55\x3f\x09\x1a\x9b" + "\xc0\x89\x3c\x1b\x79\x42\x3e\xeb\x87\xbe\x43\x95\xa3\xe8\x46\xd0" + "\x21\x7d\x3d\x48\xcb\x3d\x9d\x70\x5b\x44\x82\x0e\x92\xa9\xfd\xb5" + "\xd6\xb8\x41\x5d\x02\x83\xc3\xe8\x45\x1c\x3f\x27\x14\xfd\xa8\xba" + "\xbd\xd8\xd6\xe3\xb3\x0f\x75\xc2\x69\xb9\x2d\x05\xf3\x3e\x2d\x8d" + "\x7b\xf5\x96\x1e\x40\x3d\xdb\x98\x45\xe7\x86\x60\x3b\x7d\x5b\x96" + "\x1c\x47\xe7\x9f\xd2\xb9\xa6\xe3\xe3\x40\x6b\x75\xa7\xc1\x27\x97" + "\x7a\x68\x6f\x7e\x2f\x9d\x97\x40\xf8\xb0\xcd\x57\xd1\xf8\x13\xd2" + "\x33\x1a\xdb\xf8\xde\xdb\x10\x0e\xd3\xa3\xfc\xff\xca\xc7\x5c\xd8" + "\x0d\x8b\x1d\xde\x1b\x16\x5f\xf0\xee\x5b\xdc\xc7\xf6\x2d\xfe\xd6" + "\xb3\x6f\xf1\x37\xa5\x9b\x40\xe3\xb9\x61\xb1\xbd\xbd\x80\xcb\x40" + "\xdb\x5e\x70\x96\xf6\xd9\x6b\xb6\x9c\x05\xed\xd2\xa7\x50\xf6\xee" + "\x7f\xc0\x96\xd5\xa0\xf3\xc6\x4c\xa8\xb1\xba\xff\x06\x4b\x4b\x80" + "\xe1\x7b\xc8\xf3\x1f\xfa\x62\xef\xd2\xcb\xe3\x69\x4e\x4b\x82\xd6" + "\xa6\x1e\xcd\x75\xd4\x1e\x33\x45\x8f\xbf\x04\xfc\x19\xf0\x97\xc8" + "\x62\xef\x4a\x44\x5e\x95\x0e\xdb\xa6\x00\x3a\xdf\x67\xbc\x17\x14" + "\x67\x20\x21\x11\xe9\xd7\x86\xe1\x5b\xbc\xb7\xaa\xb8\xe0\x8e\x32" + "\xd8\x4a\xe7\x02\x93\x0f\x40\xf5\x8b\xfc\x51\xcc\xc7\x6c\x53\x8f" + "\x11\xed\xd1\x5e\xac\x47\xb1\xc5\x05\xe4\xd3\x39\x36\x1b\x15\xf6" + "\xcd\x46\x65\x5f\x6c\x71\x11\xc2\xd4\x22\x4c\xa6\xc4\xc3\x1e\xc2" + "\x85\xf5\xc6\x3e\xd4\x0d\x2a\xc4\x59\xf0\xe1\xc5\x0e\xf5\xfe\xbd" + "\xec\x34\xc2\xb5\xf4\xe3\x42\xdc\xd5\xdc\x4f\x4a\xe8\x90\xc3\xc8" + "\x4f\x7a\x1e\xe1\x28\xbd\xd5\x95\x46\x73\x86\x36\x6b\x5e\x0f\x9d" + "\x6f\x31\x84\x5d\x16\xf9\x91\x0f\x47\x75\x75\xa8\x0b\x06\x39\x2d" + "\x90\x49\xb8\x29\x9d\xb5\xb7\x07\x30\x5d\x11\x2b\x35\xa2\xbf\x08" + "\x73\x9d\xcc\xa8\xa0\xb3\x6e\x9b\x31\xbd\xc8\x7b\x54\x9a\x4c\x23" + "\xe5\xc1\xcf\xba\x25\x3a\x51\x1f\x9a\xf3\x5c\x30\xb4\x86\xc6\xc9" + "\x61\x3e\xe1\x23\x5c\xa8\x07\x36\x2c\x6b\x51\x73\x9e\x1d\xbc\x2c" + "\x00\xa7\x4d\xc2\x57\x11\x80\x0f\xc3\x19\xe2\x23\xfd\x6b\xc1\x34" + "\x43\x1b\x38\xbe\x87\x3f\xf4\x12\x3e\x17\xa8\xf5\x9c\xde\x45\x84" + "\x83\x9f\x55\x8d\x38\x9b\x36\xdc\x8b\xbe\xe3\x28\x97\xbd\xd4\xa8" + "\xe2\xfb\xea\x31\xfd\xbb\x5b\x7b\x22\x58\x5f\x96\x6a\x18\xdf\x53" + "\x7f\x2f\xd0\x5c\x2b\xc2\xfc\x07\xeb\x33\xaa\x86\xf6\xa2\xaf\x87" + "\x30\x74\xce\x16\xd1\xe9\x2f\xcb\x87\x67\x2e\x4a\x85\x45\xe9\xb3" + "\xd2\x53\x61\xce\xf4\x19\xa9\x90\x7c\x4f\x52\xf2\xc4\xbb\x7e\x7e" + "\x17\x7f\xb9\xeb\xe7\x93\xee\x82\xcc\x47\x1e\x4e\x85\xcc\xb9\xa9" + "\x30\x1f\x7f\x99\xf3\x67\x3e\x9c\x3e\x73\x7e\x2a\x64\xdd\x37\x0b" + "\xbf\x66\xa4\x4e\x48\xbe\x3f\x29\x73\xc6\xac\x99\xf0\xd0\x82\x3b" + "\x93\xef\xbc\x13\xa6\xcf\x9c\x3d\x21\x39\x59\x7a\x4e\x48\x26\x90" + "\xc7\x26\xcd\x9c\x9f\x94\x59\x98\x6f\xca\x4f\x9a\x3b\x6b\x06\x85" + "\xc0\xcc\x99\xa9\x99\x01\x7e\xa4\xc1\x73\xd1\x43\xfc\x76\xb0\xf3" + "\x19\x74\xbe\x31\xd4\xa1\x1e\xe0\xaf\x97\x9f\x9b\x04\x77\xfc\x5b" + "\x1d\xc9\x8f\xb7\x05\xb7\xc7\x51\x7b\xea\xb4\xdc\x4e\xf2\xaf\x20" + "\x3e\xd2\x19\xc3\xdd\x30\xee\x59\x8c\xbb\x51\xf2\x47\x22\x30\xde" + "\x15\x18\x3f\x7a\x09\xc6\xdf\x4a\xe7\xf0\x58\xf1\x87\xbc\x77\xa0" + "\x3d\x44\x1e\xdb\xa1\xaf\x34\x2b\x82\x9f\x83\x88\x72\xa7\xf3\x29" + "\x9c\x96\x3b\x26\xfa\xd5\xfb\x2e\x3a\xc7\x82\xc6\x93\xcf\xc1\x1d" + "\x43\xdb\x4d\x69\x74\x56\x15\x58\x4d\x12\x8e\x0b\xfd\x38\x86\x48" + "\x67\x29\xda\xea\xe8\x8c\x10\x81\xa7\xc4\xcf\x46\xd8\x08\xcf\x1e" + "\x8c\x93\x70\x3d\xd4\x8e\xb6\x02\x6d\xf9\x19\x6f\xa9\x01\x58\xec" + "\x98\x1e\xef\x65\x03\x88\xf1\xd7\x3b\x8e\xfa\xe9\xb6\xa3\xc5\x8c" + "\x70\xaf\x65\x28\xe8\xbc\x06\x7e\x76\x03\xdc\xde\x84\x3a\xee\xf0" + "\x54\x4d\x99\xc0\xce\xf3\xf3\x12\x07\x61\xf9\x92\xb0\x7c\x09\xde" + "\xaa\x29\xc9\xfc\xec\x51\x0e\x67\x88\x63\xf4\x1d\x8b\x70\x97\xfb" + "\xc3\xae\xa3\x30\x27\xcd\xef\xd0\x59\xde\x8c\x87\xab\x30\xfc\x6f" + "\x68\xd7\x3a\x10\x36\x99\x60\xc7\xbb\x21\x92\x9f\x93\x52\xaa\x80" + "\x4e\x30\x2c\xf1\xc6\x4e\xb9\xd3\x2f\x3f\xc2\xb3\x44\xb4\x63\x28" + "\x8b\xf3\x88\xa7\x8f\x87\x2b\x31\xfc\x23\xc4\x7f\x17\xd9\x4b\x61" + "\xc3\xc7\xc9\x67\xf6\xd9\x85\x0f\x39\x4e\x3e\xb3\xaf\x47\xe0\x19" + "\xf7\x66\x33\xf2\x92\xe6\x09\x68\x8e\xdf\x69\x31\xa0\xff\x93\x90" + "\x21\xda\xca\x71\xfc\x0e\x02\x3a\x77\x96\x69\x3f\x6e\x40\xbc\x13" + "\x9b\x8a\x7b\xf9\xdd\x41\x36\x30\xe4\x79\x4b\x8d\x10\x44\x93\x81" + "\xe8\x27\x1b\x82\xbc\x48\x42\x3d\x18\xec\xb4\x8c\x86\x20\x3d\x88" + "\x47\x3c\x13\x90\xbe\x0e\x2c\xd3\x04\xc4\x93\xe0\xed\x33\x62\xbe" + "\xd8\x5f\x64\x46\xf4\x95\x7c\x38\xa4\xf4\x69\x81\xe9\xef\xe8\xa2" + "\x74\x08\x1f\xe1\xec\x23\xf8\x3b\x7a\x88\xe7\x92\xde\xa1\x5e\x8e" + "\x2e\x08\xd2\xcb\xb5\x48\xcb\xcf\xfc\xe2\x2b\x82\xe2\x1f\xc2\xf8" + "\x29\x52\x3c\xd6\xfd\xd1\x47\x82\xe8\x3d\x81\xf1\xd3\x90\x5e\x07" + "\xd6\x6d\x15\xe6\x47\x67\xb1\xda\xfd\xe0\x6d\x41\xf0\x6e\x84\x9f" + "\x41\x7a\x43\xed\x0e\xc1\xd7\x4b\x75\x07\xe1\x35\x4e\xcb\x18\x6d" + "\x50\xfe\x13\x10\x7e\xb6\x8f\xbe\x31\xc9\x81\xf1\x63\x5c\x18\xff" + "\x10\xe9\x3a\x3e\x1f\x27\x5f\x9f\xec\x09\xd9\xb2\xe6\x3c\x92\xd7" + "\x98\xe5\x41\xf0\x65\x08\x97\x23\xf1\x48\x29\xf1\xe8\xa0\xd4\x77" + "\x3f\x2d\xd1\x50\x1d\x94\xe6\x28\xa6\xc9\x43\x3e\x4e\x90\xf5\x32" + "\x44\x9a\xd6\xa0\x34\x3d\x24\x47\x26\xf2\x51\x3b\x2f\xfb\xd2\x48" + "\x76\xd2\x1f\x07\x95\xed\x1a\xa7\x65\x6c\x54\x20\x8e\xa4\x0a\xcc" + "\xd7\xf4\xbc\xb0\x3b\xd7\xa0\x0e\xdd\x89\x61\xdb\x10\xe7\xdd\x54" + "\x07\xf6\x90\x3f\x68\x77\x01\x2b\xcd\x88\x12\xba\x3b\x76\xed\x30" + "\x37\xd0\x7b\x12\xbd\x13\x6e\xe6\x9c\x2d\xd5\xc9\xb1\x6b\xf1\x49" + "\xe1\xfc\xde\x1b\xb2\xc3\xcc\xf9\xa0\x57\xe0\x1c\x5b\x49\xf7\xa2" + "\xe1\xb7\x47\xca\x63\x13\x9d\x2d\x8a\xf4\xdf\x89\xed\x0e\xb0\x8d" + "\x08\x57\x0c\x33\x30\xfc\x71\x0c\xfb\x99\x04\xe7\xfb\xde\xf8\xa0" + "\x5b\x8a\x4f\x12\x79\x66\x90\xbe\x4f\xc4\xef\x51\x12\xbe\x5b\x08" + "\x3f\xbe\x4f\x90\xde\x15\x1e\xc2\x7d\x5e\xae\x93\x49\xfc\xbc\x4b" + "\xaa\x97\x3c\x3f\x4c\x4f\xe7\xba\x4a\x79\x10\xfd\xb3\xba\x21\xf1" + "\x2c\x3e\x1f\xc2\xe7\x1f\xe9\x9c\xd5\x52\x0f\xaf\x9f\xf4\xfd\x3e" + "\x3e\x1f\xc6\xe7\x01\x7c\xce\xc7\xe7\xf3\xf8\xbc\x17\x9f\xab\xa9" + "\x9e\xd0\x99\xf1\x74\xf6\x0d\xb6\xb5\x42\xd7\x68\x2e\xd0\x99\x41" + "\x38\x67\x22\x0c\xe7\x85\x57\xd8\x1b\x8d\x90\x6b\x22\xbf\xe7\x07" + "\xf5\x83\xc2\x22\x85\x7e\x88\x30\x8f\x6c\x97\xce\xfb\xc2\x24\x5b" + "\x25\xd5\x4d\x29\x4c\xe0\xcf\x44\xfc\x89\x44\x2b\x13\xb8\x22\x84" + "\x0e\x48\xf8\x45\x3a\x75\x88\x3c\x15\xfe\x79\xe2\x93\x9f\x9b\x64" + "\x83\xb1\xdc\x5f\xb3\x41\x52\x3c\xdd\x25\xe5\x25\x99\x14\xc2\x6c" + "\x94\x5d\x2b\xc9\x40\xd6\x29\x26\x74\x74\x10\xbd\x7b\x37\xae\x41" + "\x1b\x85\xf1\x1b\xd7\x78\x25\x3d\xe4\x30\x3c\x9e\xd3\xc2\xcf\xf0" + "\x40\x9c\x63\x2b\x48\x3e\x3c\x5e\x84\x27\xfa\xe9\x65\xac\xd3\x92" + "\x74\x30\x48\x2f\x3b\x50\x2f\x9f\x26\xfd\x23\x99\x11\x5f\x86\x15" + "\x70\xbf\x40\xd9\x8f\xff\xbc\xd0\xef\x3a\x69\x9d\x93\xb0\x05\x49" + "\xbd\x41\x75\x5b\x83\x78\x7e\x11\x64\x3b\x7a\x7d\x6d\xe4\xb8\xf8" + "\x20\xdb\x76\x10\xf3\x3b\x68\xc3\xba\x25\xd9\x68\x87\xaa\x84\xea" + "\xde\x38\xec\xff\x9e\xcd\xe2\xbe\x6a\xd5\x94\x9f\x13\x1e\x47\x29" + "\xbf\x2b\xc0\xa1\x2a\x20\x9b\x31\x2e\x47\x8e\xe7\x71\x31\xc5\x76" + "\xaa\x53\xaa\x3c\x1e\x57\x66\x83\xdb\xb4\x72\x1c\x88\x33\xe8\x1c" + "\x2a\x13\x8f\xab\xf5\xe1\x1d\xab\x91\xf0\xaa\x42\xde\xf3\x50\x31" + "\xc6\x85\xca\xaf\x1c\x53\x06\x11\x56\xf7\x29\x98\xe7\x66\x9e\xb1" + "\x65\x30\xd8\xea\x3e\x0c\xa3\x01\x62\xac\xee\x63\xb4\xf0\x7f\x84" + "\xd5\x5d\x8d\xbe\xcf\x0e\x8a\xff\x64\x74\x99\x42\x81\xcf\xd2\x3b" + "\x40\xa9\xb0\xba\x6b\xe1\x76\x50\xe3\xd3\x04\xf7\xed\x64\x4e\xab" + "\x3b\x07\xe1\xf2\x60\x9e\x87\x9d\x4f\x8f\x60\x5f\x2c\xf3\x80\x76" + "\xf6\x4e\x56\x6a\x75\x63\x3f\xc4\x7d\x02\xc3\xbd\x6c\x9e\xe7\x3b" + "\xfc\x39\x99\xb7\x62\xac\x66\x9e\xe7\x3c\x9b\xb1\xf3\x13\xfc\xfe" + "\x82\xcd\x88\x28\x65\x28\x4f\x66\x75\xa7\x40\xbb\xc3\x81\xf0\x13" + "\x81\x55\x8e\x71\x2d\xbd\xa0\x84\xcb\x74\x3f\x43\xe5\x58\x0d\x96" + "\x47\x77\x19\xcb\xc2\x62\xc7\xde\x70\x79\x33\x3e\xab\xc6\x5e\xcf" + "\xbf\xb5\x63\x0d\xac\x62\xac\x2e\xa9\x0c\xfb\x24\x66\x2c\x87\xc7" + "\xce\xd0\xdf\x51\x5b\xcd\xa7\x61\xd8\x36\xf2\xeb\x53\xb0\x5f\xf7" + "\x15\x9d\xed\x1c\x2d\xf0\x8e\xd5\x51\x7f\x8e\xc5\x60\xba\xaa\xb1" + "\xa3\x38\x8e\x8a\xb1\x19\xd1\x0a\x66\x47\xfb\x1e\x4d\xbc\xb0\xba" + "\x4f\xe3\xef\x2b\x20\x1e\xd0\x59\xe3\xf3\x3c\x74\xd7\xc6\xd8\x8c" + "\xcb\x31\x63\x27\xe1\x2f\x0b\x7f\xbb\x90\x8e\x97\x99\x25\xee\x53" + "\x3a\x9b\x13\xd3\x1f\xc2\xef\x46\x07\x3f\xa7\x9a\x68\x80\x48\x84" + "\x3f\x84\x7a\x95\x8e\xfa\x49\xb4\x76\xf0\x7c\xaa\xc6\xfe\xbb\x83" + "\xf1\x32\xfc\x0f\xa9\x0c\x7f\x93\xca\xe4\x92\xea\x1b\x85\x39\xf1" + "\x7d\x81\x93\x71\xba\x5c\x4c\x9b\xa8\x71\x61\x1d\x46\xbe\x96\x11" + "\x1f\x91\xaf\x65\xc4\x4b\xc4\x8f\x7d\xcb\xdd\x58\x8e\x44\xcd\xe5" + "\x98\x44\x1d\xab\x4a\x1c\x73\x99\xfb\x3d\x89\x93\x1c\x1c\x4f\xe2" + "\xcf\x11\xcf\x12\x8e\x47\x9b\x38\x89\x55\x24\x66\x78\x2c\x7a\x98" + "\xb7\x89\xb9\xe6\xb9\xb7\xb9\x97\x6d\x02\x55\x22\x94\x29\xa8\xdf" + "\x63\x35\xe7\x61\x39\x5b\xf0\x99\x8e\xf1\x70\x2d\xe6\xf5\x09\xe2" + "\x9d\x44\xf9\xb1\xca\xc4\x0c\xc4\x39\x13\x71\xe5\x10\x7d\x97\x94" + "\xa0\xc5\xef\xac\x4b\x44\x7f\x45\xa2\x19\x71\xd7\x78\xb5\x89\xbb" + "\x64\x1d\x22\xfd\x11\x7c\x23\xbd\x79\x1d\x5b\x2f\xd0\xce\x33\x33" + "\x37\xc6\x69\xad\x66\x0a\xaf\x85\xf6\x02\x84\x31\x53\xbc\x09\xdf" + "\xe7\xe0\xfb\x0e\x20\xfd\x99\x5b\xe0\xd8\x36\xae\xac\x80\xee\x41" + "\xf9\x64\x99\x5b\x03\x4b\x0b\xd4\x65\xed\x05\xbd\x18\xd7\x0b\x18" + "\x56\x6a\x35\xd7\xf2\x7e\x1a\xca\xd5\xed\xd1\x26\xe9\x3c\x15\x89" + "\xc6\x61\x8e\x52\x66\x35\x9b\x10\xb6\x00\x46\x97\x69\x14\x1c\xde" + "\x9c\xc3\xcb\xe3\xdd\x53\x06\x94\xa6\xcd\x78\x18\xa8\xbf\x87\x65" + "\xb7\xb7\xf5\xee\x20\x1d\xf5\x7a\x2b\x12\x7b\x50\x3f\x2f\xb7\x19" + "\xab\x61\x4e\x6f\x59\x24\xf2\x43\x81\xe1\x9e\xb6\xde\x16\x84\x3d" + "\x21\x74\x76\x93\x3b\xba\xcd\xb8\x03\xdc\xda\xc4\x2c\x77\x45\xa2" + "\x6b\xde\xa6\xcb\x6c\x8e\x91\x7d\xf2\x78\x6f\x19\xea\xe9\x61\x98" + "\x73\xd6\xad\x6a\x2f\x40\x9d\xdf\xe4\xc4\x70\x37\xd7\xff\x39\x67" + "\xfb\xd8\xdc\xa7\xd8\xf9\x79\x9b\xbe\x60\x6d\xc6\x1c\x58\xea\x80" + "\x61\xd7\x6c\x63\x5e\xaa\x17\x27\xba\x0e\xc3\x35\xa7\x7b\x80\xea" + "\xc4\xec\x6c\x2f\x9b\x73\xf6\x3c\x5b\xfa\x14\xf6\x71\xcd\x29\x48" + "\x23\xf2\xc5\x51\x4d\xfc\x36\xb7\x19\x8f\x21\x0d\x58\x6f\xcc\x13" + "\x31\xec\x75\x84\x6d\x8a\x7e\xfc\xac\x16\x4e\x74\x55\x83\x3b\x26" + "\x31\xcb\x53\x99\x68\xf4\xc6\x24\xee\x42\x19\xd5\x78\x2b\x13\x7b" + "\x3c\x31\x49\x3a\x77\x65\xa2\x8b\x55\x25\x19\x51\x4e\x83\x49\xe6" + "\x97\x2c\xa0\xc7\xef\x95\x97\xb8\x1e\x25\xa1\x9c\x92\x6a\xd0\xcf" + "\x66\xc4\x4b\x56\x99\x64\x16\x75\x20\xa9\xe6\x72\x4c\xd2\x2e\x84" + "\xab\x11\x7a\x98\x74\x88\xf4\x92\xee\x4c\xc2\xb0\x5f\x7a\x30\x2d" + "\xc6\x37\xe2\xaf\x15\x7f\x1d\xac\x6a\x9c\x01\xf1\xc7\x10\x7e\x6f" + "\xc5\xb8\x49\x4c\x3b\x2e\x63\x1c\x80\xa6\xdd\xd1\x05\x34\xce\xc1" + "\xc7\x05\xcc\xff\x40\x9a\x49\xa7\xdc\xf8\x74\x63\xdd\x18\x67\xf0" + "\x4e\xad\xe0\x75\x90\xc5\x8c\xcb\x98\xe7\x99\xc6\x96\x5e\xa0\xfa" + "\x84\xe1\x95\x88\x23\x76\x9c\xd1\xc5\xf5\x75\xdc\x2a\xa2\xe1\xf2" + "\x66\x03\xe1\x51\x63\xbc\x19\xc3\xce\x38\x98\x01\x30\xaf\x1e\xaf" + "\x76\x7c\x06\xe2\xc2\xfa\x30\x5e\xe3\xa9\x18\xaf\x7b\x30\x82\xd9" + "\xc9\x7e\x5d\x7e\x1a\x30\x9f\xa3\xe0\x9e\xca\x58\x7b\xc1\x0e\x7c" + "\xff\x18\x78\x1d\x36\x9f\xe2\x7a\xd5\xd6\x7b\x0a\x79\xf9\x0e\x86" + "\xb7\x70\x3b\x46\xbc\x67\x31\xe3\x35\x4b\x2f\xdc\x54\x46\xba\xb0" + "\xb4\x00\xca\x30\x2f\x17\xd2\xd2\xe3\xa9\x1c\x8f\xfd\x7f\xcc\x27" + "\x76\xc2\x2f\x5c\xbc\x5e\x4f\x40\xbd\x3e\x8a\x69\x3e\xe6\xfa\xc4" + "\x2a\x27\xec\x0a\x67\x4b\xc9\xa6\x91\x0d\x9b\xe7\x76\x91\x7e\xfd" + "\x8b\xec\x1f\xd9\x32\xb4\x05\xcb\x64\x5b\x46\x76\x8c\xfa\x62\x64" + "\xcb\xbc\x92\x2d\xf3\x4a\xb6\xcc\xeb\x67\xcb\xe8\x6e\x46\xd4\x77" + "\x17\xb7\x5f\xc8\x4f\xb2\x5d\xf3\x3c\xc9\x2c\xd8\x76\x51\x1a\x0f" + "\xda\x25\x2f\xda\x25\xfc\x65\x79\x85\x5d\xaa\x91\xec\x92\x52\xb6" + "\x4b\x74\x3f\x1c\xd6\x3f\x6f\x28\xbb\xe4\x95\xec\x92\x47\xb2\x4b" + "\x12\x3d\x7f\xf3\x5e\xc9\x2e\x69\xc7\x62\x79\x13\xe9\x0e\x22\x15" + "\xd6\x9b\x32\x92\xf3\xbc\x4d\xde\x32\xa4\x0b\xf9\x98\xa8\xf1\x0a" + "\x7b\x64\xc0\x7e\x98\x92\xec\x91\x07\xd3\x7b\x65\x7b\xe4\xe4\x76" + "\x23\x83\x6c\x12\xc9\x6e\x99\x5b\x0f\x64\x8b\xb8\xdd\x71\x8f\x70" + "\x93\xdd\x41\xfe\x4d\x0b\xb6\x3b\x88\x2f\x0b\xdf\xb5\x92\x3d\xdb" + "\x15\x8d\x36\x20\xda\x5d\xca\xe6\x99\x1d\x9c\x47\xcb\xcc\xa6\x32" + "\xd2\x39\xb4\x09\x35\xac\xbd\x0c\xd0\x26\x19\x91\x46\xd4\x73\x0f" + "\x60\xdd\xed\x71\xa3\xbd\xc0\x7c\x5d\x1e\xac\xcb\x73\x7a\xfb\xac" + "\x73\x0b\x20\x72\xa9\xc3\xa0\x9d\x73\x96\xd9\x91\x37\xb6\xa5\x05" + "\x65\x30\xd7\x61\x40\xfb\xf0\x31\xcc\xee\x62\xde\xd9\xcb\x6d\x7a" + "\xa4\xc1\x35\x67\x75\x53\x34\xdd\x7d\x3a\xf7\x02\x6b\x42\xfb\xf1" + "\xd7\x39\x67\xb5\xd1\x4b\xba\x60\xf8\xec\x6c\xe6\xf5\x60\x5d\xc4" + "\xb2\x1a\xb1\xcc\x66\xa4\x7b\x17\xd6\xcb\x1a\xac\x87\x3d\x6e\xac" + "\x8f\xfe\x75\x11\xeb\xd5\x4a\x7c\xd7\xf3\x72\x54\x24\xd5\x60\x5d" + "\x34\x7b\x79\x7b\xd7\xc5\xfb\xbe\x58\x1f\x6b\x78\xfd\x89\xc1\xf0" + "\x4a\x51\x1f\xbd\x22\xdd\x21\x2f\xf1\x4e\x29\xea\x23\xc9\x04\xe3" + "\x1b\xf1\xd7\x8a\xbf\x80\xfa\x48\xf5\x8c\x51\x3d\x2b\xb8\xe0\xab" + "\x67\x4f\x49\xf5\x2c\x46\xd4\x33\x0f\xfa\x34\x9e\xcd\xa2\xae\x11" + "\x7e\xea\x1f\xf7\xd7\xb5\xd8\x71\x3d\x74\x47\x81\xd0\x1b\xaa\x6f" + "\xbc\xae\xa1\x8d\x1d\xaf\xf1\x56\x8c\x47\x7c\xcc\x4e\xf5\x00\xf5" + "\xf2\x9f\xd4\x1e\xce\x2d\x60\xff\x5c\xe6\xb9\x09\x65\x3e\x5e\x87" + "\xf6\xee\x8b\x39\xbd\xec\x9f\x68\xeb\x1a\x10\x57\x0f\xe6\xe7\xc2" + "\xba\xa4\xf1\x56\xf2\xba\xb4\xcb\xb3\x99\x70\x4e\xd8\xd5\x8f\x83" + "\xb7\xa7\x81\x75\xe9\x4a\xe3\xb4\x4e\xcb\xcf\x4d\x36\x70\x8b\x7b" + "\xad\x2c\x3f\x47\xff\xc7\xa3\x93\xde\x77\xdb\xe0\x9f\x0b\xb8\xbf" + "\x83\x75\xb0\x60\x2b\x5c\x77\x06\x26\xa5\xa1\xbe\x03\xbe\x47\xe1" + "\x7b\xfa\xbc\xd1\x9f\xa0\xbf\xf1\x46\x07\xe6\xed\xa4\x7a\xc8\x2c" + "\x13\xc9\xdf\x4b\x43\x3d\xd4\x30\xa7\x21\x8a\xc5\x4e\xbd\x97\xee" + "\xca\xa5\xbb\x71\xf1\x7b\x18\xf2\x20\x01\x9f\xb1\xfb\x2f\x42\x1c" + "\xfe\xe8\x7e\xcc\x32\xf2\xb1\xf0\x3d\x99\x6d\xd4\x0d\xd9\xb3\x01" + "\x12\xa3\x1d\xe2\x4e\x5c\xba\xc3\x17\xfd\xf4\x38\x7a\x67\x96\x4e" + "\xba\x6f\x49\xdc\x8b\x1b\x83\xf9\xd1\xbd\xb8\x45\x06\xa8\x2f\xe4" + "\x77\x75\xe9\xea\x2d\xec\x88\xc7\x49\x7c\x18\xe3\x92\x69\x21\xda" + "\x90\xce\x5b\x90\xce\x05\x0b\x37\xa5\xc1\xe7\xe6\xd0\xe7\x3f\x3a" + "\x2d\x93\xfa\xcb\x1f\x26\xbe\x5a\xe6\x49\x98\xf8\xa3\x32\x9f\xc2" + "\xad\x25\xa5\xb6\xdc\xb3\x81\xf5\xd2\x59\xe2\x34\x4e\x51\xea\x66" + "\xff\x93\xee\xc4\xdd\xea\x01\xcd\x3c\xb3\x8b\x59\x7b\x59\x93\xd5" + "\x7c\x16\xea\xe9\x7c\xf3\x12\x6c\x3f\x63\xa6\x26\xb0\xca\xa9\xfa" + "\xbe\x0d\xcc\x4d\xe3\x4c\x4e\xcb\x3d\x3a\x1b\x2c\xd1\x0a\x59\x24" + "\x9a\x79\xff\x56\x3b\x55\x8f\xb8\x62\x08\x57\x1b\xa6\xf7\x54\x4e" + "\x45\x7d\xbd\x27\xcd\xa6\xb8\x86\xaf\xc9\xc7\x7a\x6c\x2e\x28\x86" + "\x9b\xcf\xc0\x3d\xfc\xbe\x4c\x56\x31\x75\x12\xd9\x03\x0c\xd3\x62" + "\xd8\x0e\xc4\x9f\x82\xf0\x05\x36\xb8\x28\xad\x8d\xbb\x67\x87\x0c" + "\x87\xef\x59\xc1\xeb\xe4\xa4\x5d\x99\x65\x01\xe7\xd1\x29\x20\xf0" + "\x74\x3d\x3a\xc9\x2e\x2d\x74\xb4\xcf\x9e\x27\xba\xe8\x5e\xb0\xd2" + "\x2d\x10\x8f\xf2\x21\xfa\xbe\xc3\x3e\x4d\x37\xb3\xdc\x53\xf1\x5a" + "\xb1\x0b\xfb\x1d\x93\xd5\x36\x68\xd3\x84\xe3\xa7\xf7\x22\xeb\x42" + "\x1c\x35\xe5\x1b\x00\x88\x3f\xc4\x4f\xac\x37\x5e\xe4\xc3\x97\x64" + "\x8f\xea\x37\x50\x3f\x7f\x72\x86\xcc\xaf\xf0\x32\x99\x3a\x51\xf4" + "\x85\x27\x1f\x62\x16\x06\x4d\xc3\x69\xde\x64\xf2\x9b\x82\x07\x49" + "\xbb\xfa\xd0\x8e\xd0\x18\x36\xdd\xe1\x55\xa4\x63\x68\xab\x27\xa3" + "\xff\x3f\x63\x92\x34\x3e\xe6\xb0\xba\x67\x92\x6d\x09\xd9\x66\xf1" + "\xb3\x53\xfb\xf1\x4f\x69\x6d\x8f\x47\x3b\xc4\x6d\xd3\xe6\x89\x5b" + "\x85\xfc\x5d\x84\x97\xf6\x96\x74\x61\x7c\x91\x83\xf5\xb0\x8a\xcd" + "\x06\xea\x6b\xd0\x39\xa4\x18\xf6\x47\xd4\x6b\xd6\x54\x48\x34\x4d" + "\xf9\x63\xd3\xf0\x4b\xd0\x6d\x06\x55\x7d\xff\xb8\xd4\x94\xa3\x34" + "\x0e\x25\xc6\xdf\xa6\x4c\xb4\xc1\xcc\x53\x32\x5d\xe4\x87\x20\x6f" + "\x35\xe4\x97\x90\x3f\x42\xf3\x22\x45\x25\xcc\x45\x7e\x09\xc2\x2e" + "\x97\xcb\x40\xe5\x13\xe5\x9a\x62\xf2\x2f\x17\xad\x15\x88\x2e\x11" + "\x3c\x28\xda\x04\x1a\x7e\xa7\x90\x87\xe6\x55\x66\xf2\xb2\x50\x99" + "\x79\x59\xb8\x8d\xa5\xfe\xc4\xdd\xd8\xb7\xe3\xe1\x35\x88\xab\xc9" + "\x06\xe9\x69\x42\x9f\xa6\x4c\x0c\xb7\x67\x06\x75\x33\x03\xfb\xc2" + "\xc3\x4b\xbd\xac\xb3\x1b\x52\xe6\x88\x31\xbd\x94\x39\x5e\xf2\xc5" + "\x5d\xa4\xbb\xe9\x99\xd4\x16\x5b\x4b\xc8\xde\x72\xd8\x6b\x11\xb6" + "\x0b\x61\x52\x25\xd8\x54\x7e\x67\xa3\x78\x46\xd2\x13\xdb\xb0\x99" + "\x36\x48\x59\x60\xe7\x6d\x7d\xb1\x5d\xfe\x66\xf8\x8d\xcf\x28\x56" + "\x99\x9e\x19\x9a\x96\xf1\x19\xd4\x96\x79\x2e\xb2\x5e\xcc\xe7\x06" + "\xd2\xa3\xd2\x4d\x70\x23\xea\xe4\x97\x5b\xb7\xc0\x75\xa4\x63\x2c" + "\x66\x6a\x9a\xe0\x7b\x4a\x03\xb3\xa0\xdf\x8b\x16\xb5\x60\x03\xdc" + "\x8c\x75\x68\xd2\x19\x48\x79\x7f\x59\x89\x1e\x69\x05\x28\x3f\x07" + "\xe4\x9f\x7c\x81\xf0\x29\xd4\xc7\xa9\x3f\x47\xba\x98\x72\x4a\xd6" + "\x45\x7c\xb7\x5d\xc9\x56\x20\x5f\x5b\xc5\x18\x48\xea\x1c\x9a\x03" + "\xe9\x84\xd4\x49\x54\x5e\xb1\xe6\x3a\x75\x34\xbb\xc8\xe2\x99\x68" + "\xd3\x1a\x6d\x90\x9a\x83\xcf\x56\xfe\x43\x5b\x22\x7d\x37\x22\x9c" + "\x8e\x5d\xf4\x10\x4c\x2b\x86\x25\x33\x8b\x82\xea\x49\xad\xd3\x92" + "\xba\xc4\x06\xcb\x0c\x42\x36\xa9\x06\xc2\x15\x86\x86\x46\xc6\xcf" + "\xe1\xfd\x16\xcb\x9b\xfa\xb9\x7e\x2b\x8d\xa9\xa6\xf2\x75\xde\x84" + "\xab\x5e\x29\x6c\xb6\x17\x69\xad\xb3\x78\x8d\x68\x9f\x8d\xde\xaa" + "\xfb\x0d\xfc\x5d\x8a\x63\x52\x3b\x1a\x1a\xff\xe6\x89\xfc\x5e\x48" + "\x98\xaa\x17\x78\x36\x1b\x9a\x6e\x3a\x43\xdf\x74\x70\x82\xc2\xa1" + "\xcd\x30\x58\x6b\xd2\xc4\x5d\x95\x08\x23\xfa\xfa\x53\x47\xf4\x61" + "\x1e\x4e\xcb\x54\xbd\x0d\xee\xd7\x8a\xf9\xa0\x0c\x43\xd8\xfd\x58" + "\x58\x07\xa8\xce\x89\x3a\x3d\xed\x42\x5b\x03\xaf\x7f\x87\x50\xe7" + "\x5b\x25\xfb\x4b\xe3\x45\x51\x9d\x30\xcd\xd1\xa6\xe3\xfa\xad\x64" + "\xca\xa9\x65\x01\x77\xcd\x61\xdc\xc0\xdf\xd4\xa3\xf8\x6b\xc1\xdf" + "\x49\xe9\xfb\x34\xfe\xec\xf8\x8e\x56\x6f\x5a\x17\xe7\xdd\x2b\x39" + "\x0a\x1b\xc6\xf5\xa1\x5f\x4f\xdf\x36\x98\x7a\x8c\xbd\x92\xa0\x94" + "\xdf\xeb\x5f\xa2\xb1\x84\xa9\x3d\x28\x03\x69\x8e\x75\x1a\xbf\xd3" + "\x11\x69\x23\xbe\xb3\xd2\x1a\xe6\x6a\xd9\xea\x20\xba\x75\x2d\x35" + "\x0e\xd0\xdf\x4e\xe5\x9f\x46\x72\x67\xb4\x66\x86\x9e\x45\x35\xcc" + "\xde\x5c\xeb\x06\x9a\x3b\x74\x5a\xa6\x61\xfd\xaf\xaf\x15\xe3\x12" + "\x9b\x97\x13\x3e\x49\x27\x98\x5c\x7e\xc1\xe7\x0c\x83\x7e\x83\x82" + "\xbe\xb7\xd5\xed\xe5\x63\x35\x07\x59\x69\x96\xb4\x56\x62\xda\x26" + "\xac\xe7\xd3\xe8\xce\xc9\x73\x30\xed\x63\x86\xbc\x6e\x36\xf2\x3b" + "\xad\xec\xd8\xfe\xf4\xd6\xf1\xf5\x4d\xd3\xd0\xfe\xa5\x9e\xe4\x73" + "\x41\x18\xce\x6d\x0d\xe2\xdc\x83\x71\xd8\x1e\xf5\xb6\x19\x5d\xe0" + "\xa1\x32\x63\xda\x8f\x2f\xba\xd4\x74\xe7\xe6\xd6\x02\xb4\x3b\x48" + "\x07\x43\x59\x09\x5b\x36\x2d\x73\xcb\x59\xe6\x92\xcb\xdc\xdc\x40" + "\xf5\x63\x9a\xc3\x06\x6f\xcd\x0e\x5b\x27\xfa\xcb\x31\x3d\xa6\x39" + "\x41\xc8\xd1\x8b\xbc\x0a\x94\xe3\x74\xad\x90\x61\x5a\x7a\xa0\x0c" + "\xa7\x63\x8b\x94\xb6\x1b\x7f\x07\xf1\x77\x54\x7c\xfb\xff\xd2\xcc" + "\x7e\xef\x28\xd7\x34\xac\xa3\x69\x3b\xd0\x5e\xf4\x0a\xd9\x4c\xe7" + "\x77\x48\x31\xd2\x9b\x6f\xb0\xed\xb9\x4c\x77\xa4\x9e\x05\x0a\x27" + "\x1d\xa7\x70\x2f\xfa\x37\x36\x48\xab\xc1\x78\x2d\xd5\x5f\xba\x1f" + "\xcc\x3f\xbe\xff\x1e\x08\x48\xe3\x77\x2d\x46\x6f\xdb\xb5\x8b\x74" + "\x17\xd3\xd4\x46\xbb\x77\xed\xc2\xfc\x1c\x32\x5f\x31\xec\x34\xc5" + "\x93\x9e\x3a\x2d\xd3\xa3\x90\x2f\xbc\x2d\x77\x60\x3f\x31\xb4\xef" + "\x31\x3d\xb9\xdf\x47\xd3\x8e\x33\x90\x2c\x7b\xe1\xde\x14\xb4\x63" + "\x68\xbf\xef\xd7\x8b\xf6\xe7\xde\x54\xfa\x46\xfb\xf9\x25\xbe\x4f" + "\x6a\x43\x3b\x75\xa9\x6a\x8a\xfe\xb2\x12\x22\x2f\x29\xb1\xc0\x55" + "\x6f\xb8\xdd\xb1\x77\x25\x5a\x7b\x8e\x42\xbb\xfb\x3d\xd0\x3f\xc9" + "\x71\x4c\xa0\x7b\xea\x4a\x37\x31\xcf\xbb\x97\x0e\xa9\xad\xee\xf3" + "\x4d\xfc\x3e\x5a\xb8\x97\xf3\xe3\xb9\x4e\xf4\x02\x96\x72\xdc\x12" + "\x7f\xde\xe8\xd8\xb3\x92\xb9\xf7\x74\xd3\xd9\xf5\xba\x21\xcf\x5f" + "\x82\xc4\x97\x8b\x21\xb9\xf6\x12\x24\xd4\x5d\x02\x03\xfb\x97\x41" + "\x59\x8b\x7e\xdc\xd2\x0b\x5a\x40\x3b\x91\x35\xac\x00\x34\x75\xc5" + "\xe8\xcf\xb9\x41\xe1\xa9\x44\x7f\xce\x8d\xfe\xdc\x79\x03\xd9\xcb" + "\x7e\x7f\xee\x32\xf7\x95\xa7\x1e\xe6\x77\x99\x56\x4e\x3d\x3c\xd4" + "\x08\x8a\xa8\xe5\xa0\x45\xfa\x4a\xcf\xc1\xf4\xa7\xa2\xba\xd0\x97" + "\xc4\x32\xdb\xa4\xf2\x22\xcf\x77\x44\x1b\x21\x92\x97\x15\x6d\x38" + "\xab\xbc\x5f\x1f\xb6\x6d\x56\x92\x4e\x39\xa8\x2e\x51\x19\x9e\xa5" + "\x39\xee\xa3\x37\xb9\xd4\x45\xb5\xcc\x45\xe1\xa6\x11\xcc\x85\xe1" + "\x05\x94\xf7\x11\x0c\x77\x5a\xee\xad\xb1\xa9\x6f\xef\x0d\xa7\xa3" + "\xd8\x5f\x92\x6c\xcd\x8c\x1b\x99\xb2\x8c\xfa\xe5\xc6\x2d\x6e\xf4" + "\xc7\xcf\x51\x3d\x9e\xa1\x9b\x97\xc7\xdc\xfa\x75\xb4\xde\x60\x86" + "\x86\xd6\x42\xd0\x1c\xe8\xaf\xd0\xd7\xb9\xda\xfa\x07\x6a\x43\xa8" + "\xff\x10\x9d\x87\x38\xab\xc6\x19\x59\xa9\x21\xc4\xb9\xe3\x61\xf7" + "\xbf\x46\x89\xbd\xad\x33\x16\xd8\x60\x1d\x3f\x2b\x9f\xef\x07\xe2" + "\xf6\x34\x7d\xa2\x03\x79\x10\x68\x03\xd2\x35\x74\x8e\x7a\x5f\xc5" + "\x94\xc3\x4d\xc3\xc9\xf6\xa7\x2b\x84\x2f\x34\xe5\x90\x68\x0b\x66" + "\x7c\x29\xe6\x2b\x66\x1c\xb4\xc1\x7c\xde\xc6\x17\x8c\x24\x9d\x98" + "\x71\x9a\xc5\x4e\x79\x9b\xe0\xc6\x95\x41\x59\xbe\x1b\x96\xb3\xca" + "\x29\x87\x18\xaf\x2b\xe7\x80\xed\x5b\xe3\xa4\x3d\x3e\x8e\x1b\x16" + "\x3b\xd1\x37\x98\x88\x71\x87\x29\x0f\x3b\xc2\x20\xdf\x07\x8b\xb5" + "\x12\x33\xd0\x26\x3c\x24\xd9\xc3\x19\x27\xc4\x38\xf4\x8c\x13\x7d" + "\x98\x16\x7d\xc5\x6b\x9d\x96\x74\xf4\x7f\xd7\x94\x48\x73\xea\xf6" + "\xed\x7c\x6f\x6a\x7a\xa2\x0d\xf2\x9a\x28\xcc\x34\x02\x74\x26\x3d" + "\xeb\x09\xeb\xeb\x05\x94\x73\xe6\xaf\xf9\xba\x3f\x25\xdc\x80\x38" + "\x0a\x64\xbc\xd8\xde\xbe\xd5\xa7\x5c\xb8\x10\xc3\x76\xc8\x78\x11" + "\xe6\x3a\xfc\xae\xee\x87\x11\x69\x0e\xfa\xa5\x59\xd8\xa7\x1c\xf3" + "\x16\x86\x35\x06\xa5\x69\x0d\x4a\xd3\xe1\x97\xa6\x4c\xca\xa7\x37" + "\x28\x8d\x3b\x30\xcd\xcc\xa8\x81\xb4\xcd\xd4\x07\xa6\x99\x99\x1c" + "\x94\x26\x6d\x20\x6d\x33\x17\x04\xa5\xc9\x09\x4a\x63\xf2\xe3\x2d" + "\xad\x5f\x4a\xc6\xb0\x5d\x41\x69\x6a\x82\xd2\x1c\x92\xbf\xd1\xf7" + "\x6c\x15\xbe\x01\xea\x13\xca\x14\xe5\x7a\x18\xe3\xb1\xfc\x0b\x4f" + "\x5f\xc1\xff\xc6\xbe\xe1\x94\x83\xa5\xfb\xc5\xbd\xbe\x64\x57\x69" + "\xbd\x03\xd9\x73\x9a\x93\x21\x9d\x20\xbf\x93\xf2\xea\x86\xfb\x2e" + "\x90\x0e\x39\x2d\xf7\xc5\x0f\xe4\xc7\x7d\xc9\x81\x74\xde\x97\x16" + "\x48\xe7\x7d\x99\x03\xf9\x71\x5f\x4e\x50\x1a\x53\x50\x9a\x1d\x7e" + "\x69\x1a\xa4\x7c\x6a\x82\xd2\x1c\x0a\x4a\xd3\x38\x50\x3f\xef\x3b" + "\x11\x94\xe6\x74\x50\x9a\x5e\x1f\x0f\xef\xa7\x4a\xac\xa0\xfa\xe0" + "\xb4\xdc\x8f\xfd\x9f\x05\x89\x57\xe0\x9d\x56\xd6\x67\x79\xaf\xb6" + "\xd0\xeb\xfb\x9f\xad\x16\xfb\xf4\xf8\x1d\x0a\x5d\x70\xff\x7e\x79" + "\x2e\xfb\xb5\x4b\xae\x08\x9a\x63\x45\xde\xf6\x34\x9b\x5d\xd8\xe6" + "\xde\x6f\xb4\xc1\x9c\x06\x79\x2d\x0b\xad\xff\xe1\x77\xf0\xf0\xfe" + "\xc8\xfd\x19\xa2\xfe\xdd\x5f\x2b\xcd\xfb\x50\x79\xb0\x9f\x71\x7f" + "\xed\xff\x1a\x5d\x19\xa9\x44\x17\xdd\x45\x81\x38\x6c\xfd\x7d\x8d" + "\x7e\x5a\x29\xcf\x8c\x59\x32\xad\xf5\x62\x0d\x12\xad\x4d\xb6\xd3" + "\xfd\x20\x4e\x4b\x46\x9c\x5f\xff\x84\x68\x75\x1c\x2d\x76\xa9\x83" + "\x68\x76\x08\x9a\x33\x32\x84\x8d\xca\xc8\x90\xed\x49\x58\xfd\xab" + "\xd8\xac\x6b\xc7\x12\xd2\x1a\x8b\xb6\x5a\xf4\x37\xb1\x8f\x45\x74" + "\x77\x42\x46\x05\xf7\x7f\xd7\x5d\x02\x7a\xb7\x96\x4c\xe6\x6b\x30" + "\xa4\xb2\xb4\xd2\x3d\xd0\xe4\xfb\xb4\x14\x7c\x4b\xeb\x00\x19\xbf" + "\x13\x0a\x32\x2e\x34\x97\xd8\x89\xd6\x26\x79\xbd\x12\xd2\x22\xfc" + "\xba\x8a\xcd\x5a\x5a\x1f\x42\x6b\xa9\x9a\x1d\x93\x08\xa6\x0b\x79" + "\x7b\x48\xe6\x01\xdd\x29\x8d\xb0\xb5\xe1\xfa\x4a\xfe\x7c\x15\x34" + "\x3c\x98\x2d\xf4\x67\x56\x62\x60\x7d\x88\x40\x3d\x9d\x95\x16\xa8" + "\x73\xb3\x32\x03\x75\x6e\xd6\xf2\xc0\xfa\xa0\xc4\xfa\x30\xcb\x14" + "\x94\x66\x47\x50\x9a\x6a\xbf\x34\x15\x52\x3e\x87\x82\xd2\x34\x06" + "\xa5\xf1\xb7\x7f\x58\xe6\x59\x1d\xfd\xfd\x4e\x6e\xef\x67\xf5\xf8" + "\x7d\x2b\xab\x79\x3b\x35\xcb\x2d\x87\x49\xfb\xa0\xf9\xda\x2c\x81" + "\xef\x01\x5d\x90\x8d\x42\xf8\x07\x12\x03\x69\x78\x20\x25\x90\x86" + "\x07\x66\xcb\xdf\xd2\x7a\x8e\xcf\xba\xe1\x81\x4a\x49\xcf\x1c\xd1" + "\xdb\xe0\xa1\x68\xf7\xc3\x8f\x92\x6f\x46\xed\x13\x5f\x33\xb7\x05" + "\x7d\xca\x0b\x34\x67\xe0\x82\x6e\x13\xa8\xe8\x9e\x1a\x1b\x3c\xd8" + "\x82\xfd\xb9\x43\xb4\xa6\x1e\xfd\xa9\x79\x88\x63\x09\xe6\x5f\x83" + "\x79\x20\xef\x1e\x38\x12\x44\x43\x53\x10\x0d\x27\xfd\xbe\xb5\xf8" + "\x6d\xf3\x2b\xb7\x96\xce\xa5\x78\x81\xfb\xd6\x0f\xb8\xe4\x70\x1a" + "\x03\xc0\x32\xf6\x94\x72\x3f\x20\x8d\xd6\x29\xc6\x76\xc2\x03\x5f" + "\xd1\x78\x81\xc0\xf9\x60\x82\x3f\x6f\x05\x2f\x1e\x9c\x14\x48\xc7" + "\x83\x19\x81\x74\x3c\x98\xe5\xb3\x35\x0f\x48\x6b\x61\x1e\xcc\xb3" + "\xc1\x22\x7e\x1f\x0c\xf2\x42\x1f\xed\xd6\x5f\xdb\x34\x92\xfc\xd4" + "\x07\x3f\x72\x60\x79\xd9\xd3\xca\x58\xe9\xfb\x63\x36\x92\xfc\xee" + "\xa9\x87\xd0\x3e\xd3\x5e\xdd\x5b\x31\xac\x45\xc8\xf5\x41\x2c\xff" + "\xfc\x23\x02\xef\x83\x2d\xbc\x1d\x18\x49\xfe\xef\x83\x15\x2c\x66" + "\x73\xd8\xfe\x59\x5f\xec\x66\xbd\xbc\xa6\x17\x71\x38\xe4\xfa\xe0" + "\xad\xda\xac\xf7\x56\xce\x6c\x72\x5a\x66\x6b\x6c\x30\x0b\x44\x9f" + "\x66\x66\x14\xea\x7e\x0d\xca\x0f\xfb\xc0\xb3\xa5\xbe\xcc\x66\xba" + "\xd7\x8c\xd6\xc8\xd1\x5d\x58\x51\x62\x2d\xc8\xec\x14\xbf\x7a\xe5" + "\xd0\x17\x4f\x63\x9d\x30\x87\x6c\xaa\x96\xec\x06\xad\x79\x6c\x76" + "\xdb\x81\xc6\x59\xac\xee\x33\xdc\x27\xc7\x78\x90\xd2\x9a\xfd\xd2" + "\xda\xa5\x71\x90\x1e\x8a\x1b\xef\x06\x75\xb3\xc3\x4e\x77\xfe\xc6" + "\x09\x3f\x7e\x8e\xa2\x19\xed\x05\xa6\x39\x2c\xa7\xa1\x31\x13\xbe" + "\xae\xc0\x04\xea\x71\x25\xa0\x6e\x2a\xee\xe4\xb8\xe5\xb5\x43\xd4" + "\x3f\xb2\x96\xf4\x80\xd5\xd1\x41\x63\x9a\x6a\xb1\x4e\x6c\x0e\xa8" + "\x5c\xa0\xe9\xab\xdc\xac\x45\x5b\x0c\x9e\xca\xcd\x3a\xa4\x0d\xdb" + "\xb3\xd9\x09\x64\x03\xfd\x79\x37\x73\x66\xe6\xc3\xf3\xe6\x24\x3d" + "\xf2\xf0\xac\x05\x33\x27\xeb\x17\xac\x5e\x9b\x9b\x93\x94\xbf\xde" + "\xa4\xdf\x58\xb8\xda\xb4\x7a\xdd\x2a\x7e\x4d\x99\x3e\xdb\x24\x9e" + "\x86\xbc\xec\x22\x53\x2a\xbd\x26\xea\x0b\x0a\x73\x37\xf0\xd7\xd1" + "\x43\x20\x10\xc9\x6a\x53\x6e\xa1\x7e\x54\x4e\xa2\xfe\xbe\xec\xd5" + "\x79\xb4\x6b\x22\x14\xae\xc9\xfa\xc2\xdc\xc2\xdc\xec\x1c\x7d\xaa" + "\x3e\x99\x30\xfb\xa3\xf3\x93\x67\xb2\x6c\x9f\x8a\xb0\x3d\x47\x1f" + "\xba\x87\xec\x14\xb5\xeb\xdd\x30\xef\x2b\xf2\xe1\xf8\xbd\x62\xa8" + "\x87\xd8\x26\xd8\x9c\x96\x39\x5d\x03\xdb\xf1\x39\xae\x40\xfd\x9d" + "\xab\x09\xd4\xdf\xb9\xba\x81\xed\xf8\xdc\xa0\xfa\x3f\x37\xa8\xfe" + "\xcf\x9d\x3d\xb0\x1d\x9f\xbb\x3c\x28\x4d\x41\x50\x9a\xb2\x7e\x3b" + "\x83\xb4\x6e\xe7\x76\x69\x6e\x75\x50\x9a\x83\x41\x69\x8e\x06\x7d" + "\xb7\xf8\x7d\xa3\xef\x3a\xf7\x94\xbf\x6f\x80\xdf\x5d\x72\x5d\xf7" + "\xd9\xb7\xb9\x2e\x19\x86\xda\x1e\xda\x5b\x23\x60\xe7\x69\xfd\x60" + "\x7b\x04\xec\xbc\xfe\xfa\x4f\x36\x89\xd6\x8a\x0a\xff\x7c\xde\x8b" + "\x92\x6d\xeb\x2a\xf7\xb5\xa1\x5d\x28\x8b\x5b\xcf\xc1\x3c\x5a\x07" + "\x4c\xb0\x76\x5a\x3f\xcc\xf6\x2d\x76\xd6\xc7\x82\x86\xd2\xd2\xbd" + "\x5a\xcc\x32\x87\xef\xa3\xc7\xb0\x28\xfc\xa1\x9d\x9a\xb7\x4b\x5e" + "\xab\xbf\x03\x61\x6c\xc0\xaf\xdb\x51\x50\xba\x1d\x7c\x9d\x23\xe5" + "\x97\x49\xfb\x7c\x68\xef\xb9\xa6\x5c\x9c\x59\xd1\x45\xf7\xbd\x51" + "\xde\x88\x43\xcd\x94\x73\x1e\x92\xee\xed\xa2\xbb\xed\xe2\x10\x67" + "\xff\xfa\x7f\x1b\xcc\xe3\xfb\x84\xc8\xe7\x23\x5f\x4f\xf8\x3d\xf3" + "\xdc\xb2\x7f\x41\x7d\x85\x50\xb6\x23\xf4\x5a\x70\x88\x2e\xb7\x78" + "\x3b\x9a\xb6\x76\x11\x4d\xb4\x26\x98\x59\x75\x6e\x68\xaf\x75\x63" + "\xff\x15\xb4\xbc\x3f\x65\x3e\x0b\xd6\x06\x37\xd0\xf8\xf0\x32\x33" + "\x94\xd5\x2b\xbd\x1d\xac\x3f\x1d\xf5\xd1\x32\xf9\xbe\xf0\x1d\x14" + "\x8e\xe9\xb1\x2f\x61\xa7\x35\xe3\x61\xc6\x23\xa2\x09\xae\x69\x24" + "\xf5\xf7\x32\x6b\x25\xdf\x77\x57\x3d\xe2\x0a\xb9\x9e\x59\x09\x56" + "\xa7\x25\x13\xdb\x3f\x73\x9a\x6c\xb3\x9b\x6b\xb8\xed\x53\x62\x38" + "\xb6\xfd\x99\xfa\x70\x7e\x8a\x64\xdf\x0b\x68\x1d\x9b\xd3\xf2\x50" + "\xfc\x95\x60\x89\xee\x66\x2c\x37\xd6\xc5\x23\xaf\x6d\x4d\x8e\x90" + "\xec\xab\x06\xd3\x2d\x90\xd3\x7d\x9f\xf2\x91\x6f\x44\xed\x31\xd6" + "\x55\x87\xe8\x2b\x3e\xfc\xc7\x17\xf8\x1a\xe9\x87\xd0\xff\xcb\x94" + "\xeb\xc1\x35\xf8\x8d\xf6\xef\x21\x3e\x9e\xc8\xd7\xfe\x60\x7f\xb2" + "\xa8\x00\x7d\x36\x9d\x03\x6d\xe3\x43\xad\x72\x1c\x1f\x27\xa2\xb8" + "\x12\xe6\x6a\xd6\x75\x51\x5c\x57\x7f\x9c\xd8\xb3\xc0\x9a\xcd\x6e" + "\x0a\x77\xcb\xe1\xa2\x6d\x79\x38\x2a\xe8\x3b\x5e\xfe\xc6\x77\xec" + "\xf7\x67\x56\x48\xf8\xed\x68\x73\x15\xe2\x8c\x87\x87\x9f\xad\xe3" + "\xf5\xe6\xe1\x0c\x39\x9e\x8f\xa9\x1d\xa0\xb9\x31\x07\x78\x63\xa7" + "\x1c\xe1\x3e\x17\xa6\x79\xf7\x5b\x57\x04\xf6\x31\x14\x8c\xee\x78" + "\xc5\x30\xc2\x43\x75\x86\xee\xdb\x24\x5f\x0d\x71\xa5\xd0\xbe\x0a" + "\xd2\x91\x8d\x6e\x88\x2f\x98\x4a\xe3\xcf\x0f\x73\xbd\xa5\x30\xc2" + "\x4b\xf8\xa8\x4d\x24\xdc\x84\x6f\x0f\xf9\xb4\x7c\x7d\xe6\xc3\x58" + "\xfe\x4c\x77\x38\x59\x61\x7c\x8f\x1f\x2f\x23\xf0\xdb\x15\x58\xd6" + "\xf9\x9a\xa0\x6f\x9d\xfc\x4d\x63\xbd\x42\xf7\xe6\x47\x49\x71\x13" + "\xaf\x94\xd7\x48\xbe\x27\x67\x7e\x56\x60\x7e\xf3\x8d\x41\xf8\xcd" + "\x41\xdf\xbb\xe4\xef\x6a\x3e\xc7\x30\xbf\x46\xce\xa3\x5c\xac\xf3" + "\x3a\x72\x70\xab\x3d\xe2\x4a\x67\xa7\x60\x9a\x13\x7e\x79\x0e\xc2" + "\xef\xd3\x3e\xf9\xcd\xef\x91\xf1\xe1\xbb\xc3\x0f\x0e\xfd\x92\x05" + "\x6a\x19\x4e\xcc\x6f\x2c\x88\xf3\xa5\x5b\xa0\xbf\x4a\x59\x83\x74" + "\x77\xe1\x5a\xa1\xbb\x0b\xb2\x02\x69\x59\x60\xf4\xc3\x69\xf2\xd1" + "\xb2\xa0\xcc\x0f\x0e\xeb\xe7\x82\x8a\x60\x5d\x2d\x32\x93\x8e\x93" + "\xbe\x2e\x38\x1c\x22\xce\x25\xc5\xb5\x86\xd6\xf1\x05\x36\xbf\x70" + "\xa9\x7f\xb4\x70\xa6\xe4\x27\x90\x7d\x76\xf4\x95\x2e\x90\xef\x7b" + "\xe5\x3a\x49\xe7\x96\x8d\x17\x77\x8b\xa3\x5e\x2f\xd4\x07\xe3\x15" + "\xfb\x7d\x24\x1c\xfd\x38\x17\xd8\x85\x8f\xb7\x30\xd3\x57\xb6\x85" + "\x4b\x6c\xf0\xb0\x3c\x4f\x64\x17\x63\x83\x0b\x66\x87\xeb\x77\x20" + "\xfc\xee\x40\x9e\x2d\xac\xf5\xf1\x6c\xe1\x21\x3f\xbc\x47\xfd\xe0" + "\xfe\x80\xdf\x2d\x7e\x70\x27\xaf\xa6\x9b\x42\x57\x16\xba\x02\xf3" + "\x5a\xa4\xf1\xe1\x58\x14\xe7\xcb\x6b\x91\xde\x0f\xae\x03\xbf\x93" + "\xc3\xcb\x67\xd1\xec\xf0\xf2\x59\x64\x0c\x2d\x9f\x45\x65\x7e\xf9" + "\xee\xbe\x7a\xbd\x5a\x74\xc4\x8f\x9e\x7a\xfc\x6e\x0a\xac\x47\x8b" + "\x4e\x06\x7d\xf7\xcb\x9f\xa1\xed\x38\x58\x9c\x16\x41\xe1\xa6\x11" + "\xa0\x15\xf5\xec\x11\xf0\x8f\x7f\xf7\x92\x88\x27\x1a\xf9\x1c\x1c" + "\xcd\x6f\x0a\x38\x43\x30\x1c\xc1\xf8\xc5\x67\xc8\xb4\x63\x7b\x1d" + "\xf2\x6e\x52\xb9\xfd\xb3\x7a\xa9\xfd\x7b\x24\x47\xcc\xdb\xa4\x74" + "\x31\xcb\x27\x59\xe1\xda\x32\xc4\xdb\x60\x83\x47\xb2\x04\x7f\x1e" + "\x41\xfd\xcf\xe7\xbe\x09\xab\x48\xe9\x42\x7d\xba\xd4\x0d\x59\x33" + "\xf1\x79\x19\x9f\xa3\x03\xdb\xd7\x47\x5a\x98\x45\x31\xbf\xde\x12" + "\xdc\xee\x3e\x72\x1a\xfb\x1e\x97\xa2\xdd\x65\x59\x21\xe2\x5c\xcc" + "\xa2\x7a\x78\x60\x78\x16\xcd\xef\x5c\xb2\x41\x56\x3a\xd1\xeb\x17" + "\x6e\x60\x96\x61\x0b\x08\xde\x46\xf9\x61\x9a\x70\x72\x93\xf7\x5d" + "\x09\xdd\xcb\x32\x05\x95\xe3\x3b\xc4\xf5\x8d\x28\xc7\xa3\x73\x82" + "\xf2\xde\x1d\xba\x1c\x59\x07\xb1\x1c\xdf\x85\x2e\x47\x56\x13\xe7" + "\xad\x12\xcb\x32\xc0\xef\xc8\x3a\x8d\x65\xf9\x8e\xf3\x3d\x30\xdc" + "\x21\xf7\x53\x4b\xbf\xc3\xfe\xbf\x12\x78\xda\xf9\x25\x3e\xb9\x09" + "\xb8\x47\xe3\xa3\x6b\x20\x73\x60\x9e\x8f\x4e\x64\x96\xc8\xf9\x36" + "\x78\x34\x4f\x6e\xaf\xa4\xf0\xd9\x82\x16\xe4\x93\x92\xf8\x84\xe5" + "\xc1\x74\xe1\xe4\x2d\xd7\x4f\x31\xcf\xf4\x28\xd6\xff\x2c\x79\xff" + "\x93\x03\xdb\x73\xbb\xcc\x47\x8c\x6b\x0c\x8a\x73\xf9\xc5\x9d\x0a" + "\x88\xdb\xd2\x1f\xde\x2b\x87\x7f\x3f\x39\x3d\x16\x1f\x24\x27\x94" + "\xcf\x63\xef\x04\x96\xfb\xb1\x44\x51\x3e\x94\xd1\x00\x5e\x3f\x96" + "\x81\x32\xba\x1c\x5a\x46\x8f\xe5\x84\xd6\xb5\xc7\x4a\x38\xbe\x58" + "\x08\x85\xaf\x06\x65\x77\x99\xeb\xa0\x24\xa7\x81\xf2\x79\xec\x98" + "\x2c\x9f\xef\x57\xc6\xc5\x10\x54\x46\x4f\x37\x2c\xde\x22\xca\xba" + "\xb8\x2d\x10\xf7\x62\x5d\x68\x5d\x5c\x9c\x8c\xe5\xf4\x84\x2e\xe7" + "\xe2\xd9\xe1\x75\x71\xb1\x11\xcb\xe3\x19\xa8\x8b\x8b\xc5\x9c\xae" + "\xa4\x83\x41\x71\xb5\xcc\x12\x32\x9f\xa3\xe4\x17\xd9\x60\x71\x2f" + "\xcd\xd3\xf9\x85\x9f\x08\xd4\x3f\x2c\x03\xa5\x23\xfe\xb9\x45\x3f" + "\x86\xe4\xd0\xad\x07\xe5\xd5\x74\xd2\x69\x59\x92\x18\xc4\xab\xf3" + "\xdd\xb0\xe4\x9d\x3e\xa5\xf2\x3e\xc1\xaf\xc7\x9f\x0a\xa4\x69\x49" + "\x46\x68\x7e\x2d\x59\x8e\xfc\x3a\x1f\x9a\x5f\x4b\x4a\xc2\xf3\x6b" + "\x09\xc9\xff\xfc\x40\x7e\x2d\x39\xe2\xcf\x2f\xaf\x45\x94\xef\x36" + "\x1d\xea\xc6\xe5\x65\xac\x5e\xd8\x72\x6d\x34\xea\x8a\x48\xd3\x4b" + "\x69\xba\xa2\x5d\x42\x4f\xf4\x37\x81\xe6\x1c\x2c\x39\x21\xd7\xff" + "\x61\x35\x10\xc9\x2e\x2f\xa6\x35\xdc\x74\xe7\xb4\xd6\x6a\x3e\xdf" + "\x64\x75\x27\x03\x8d\x37\x06\xe6\xfb\xb8\x21\xb4\x2d\x78\x3c\x0d" + "\x79\x5a\x15\x22\x5c\xda\x53\xf0\x78\x45\xa0\x8d\x78\xbc\x20\x50" + "\x46\xc8\x37\x25\xbf\x4d\x55\xf1\x7d\x7e\x57\x96\xd9\xe3\xb6\x81" + "\x32\x5b\xba\x4d\xc8\x6b\x69\x76\x10\x7d\xae\xd0\xf2\x5a\xaa\x0d" + "\x2f\xaf\xa5\x89\xe1\xe5\xb5\x34\x83\xe4\x65\x83\xa5\x65\x81\xed" + "\xc6\xd2\xe5\x81\xe5\xc5\x7c\x31\x1d\x53\x0e\xba\x96\xbe\xbf\x6f" + "\xb9\xe5\x1f\xd9\x38\x92\x15\x9d\x37\x80\xf4\x8f\x20\x1a\x7f\x28" + "\x8e\xb0\xb8\x91\x87\x15\xc5\x61\xef\x31\x8f\x6a\xc7\x7e\x25\xad" + "\xcf\xd3\x0f\xa7\xb1\xb2\x65\x0b\xbd\x4a\xc5\x64\x7c\x57\x76\x43" + "\xf6\x08\xaf\x52\x55\x46\x6b\xc9\xf8\x5e\x45\x3e\x3f\xb1\x2c\xcf" + "\x5f\x16\xb4\xa6\x6c\x8f\x38\x3b\x92\xc6\x39\xbf\xc0\xf4\x17\x84" + "\x5c\xb2\x15\x81\x7c\x5c\x56\x11\x5a\x2e\xcb\x0e\xa1\x5c\xbe\x08" + "\x2d\x97\x65\x2d\xe1\xe5\xb2\xcc\x86\x72\xf9\x62\x60\x3d\x5a\xe6" + "\x92\xea\xd1\x76\x4a\xa3\x5f\x47\xfe\xea\xf2\xd5\x04\x83\xef\x58" + "\x47\x96\x3f\x44\xf1\x49\xbd\x72\x3d\xa2\x34\xcb\xa9\xff\xcf\xf3" + "\x97\x60\x0c\x12\x0e\x3f\xbc\xcb\x33\xa3\x7b\x43\xd5\x93\xe5\x74" + "\xa7\xad\x62\x5c\x01\x68\x90\x87\x59\xfb\x09\x47\x21\x00\xe2\xf8" + "\x98\xe0\x28\x9c\xee\x80\xf6\x83\xaf\x91\xe1\xf8\xb8\xa8\x80\xad" + "\x60\x4e\x23\x10\x5c\x10\x6e\xa9\xfc\x91\xbc\x1d\x21\x78\x82\x0b" + "\x82\xe9\x11\xf5\x31\x3b\x31\xb0\x3e\x66\x43\xa0\x7e\x2e\xa3\xf9" + "\x89\x68\x2f\xda\x39\x7c\x5f\xe0\xb1\x28\x26\xff\x38\x75\x33\xbb" + "\x24\xa8\x6e\xa2\x0e\x3c\x71\x8b\xa4\x03\x9e\x40\x5a\xb3\xab\x43" + "\xeb\x40\xf6\xe1\xf0\x3a\x90\xdd\x1a\x5e\x07\xb2\xe9\xdc\x99\x2f" + "\x6c\xf0\x44\x7c\x60\xdd\xcc\x76\x07\x96\x1d\xf3\xe5\x75\x13\x62" + "\x7e\x48\xdd\x44\x5f\xe8\xda\x70\xf5\x50\xf2\xff\x15\xf5\x97\x00" + "\x7e\x00\xcf\x34\x58\xaf\x90\xbe\x27\x8e\xd0\x1c\x12\xda\x78\x23" + "\xf1\xb0\x8e\xf7\xd1\x9e\x68\xf1\xe7\xe3\x1e\xd1\xd7\x2a\xed\x86" + "\x15\xb3\x68\xcd\x9e\xe0\x67\x4e\x4c\x60\xf9\x9f\xe8\x0a\xcd\xcf" + "\x27\x68\x6c\xbe\x34\x34\x3f\x57\xe8\xc2\xf3\x73\xc5\x44\xda\x1b" + "\x3f\xb0\x4e\xad\x98\xad\xdf\xc0\x7d\x14\x9e\xe6\x1c\xac\x78\xfd" + "\xfb\xb5\x4f\x2b\x76\x04\xb6\x4f\x2b\xf2\x7e\x78\xfb\xb4\xa2\x35" + "\x74\xfb\xb4\xc2\x16\xba\x7d\x5a\xe1\x12\xf5\x21\x27\x39\xb0\x3e" + "\xe4\x68\x03\x75\xe2\x89\xae\x1f\xaf\x7d\xca\x29\x0b\xaa\x03\xe5" + "\xdd\x90\xab\x40\x9f\x62\xa7\x90\x5b\xee\xe7\x81\x34\xe6\xd4\x86" + "\x96\x5b\xce\x51\x94\x5b\x79\x68\xb9\xe5\x9c\x0c\x2f\xb7\x1c\x9a" + "\x13\x2d\x1f\x28\xb7\x5c\xf5\x0f\xf7\x29\x72\x27\x05\xca\x2c\x57" + "\xff\xc3\x65\x96\x5b\x12\x5a\x66\xb9\xd5\xa1\x65\x96\x7b\x58\xc8" + "\x2c\xb7\x2b\x50\x66\xb9\x2d\x81\x32\x43\xbe\xfd\x68\x32\x5b\x39" + "\x31\x48\x66\xf9\xdd\xb0\xf2\x7d\x94\xd9\x49\x21\xb3\x55\x9b\x02" + "\x69\x5c\x99\x19\x5a\x66\x2b\x8d\x28\xb3\xfc\xd0\x32\x5b\xb9\x23" + "\xbc\xcc\x56\x36\xa0\xcc\xf2\x07\xca\x6c\x65\xe3\x0f\x97\xd9\xca" + "\xde\x40\x99\xad\x3c\xf5\xc3\x65\xb6\x2a\x39\xb4\xcc\x56\x65\x84" + "\x96\xd9\xaa\xe5\x42\x66\xab\x6a\x02\x65\xb6\xca\x1c\x28\x33\xe4" + "\xdb\x7f\x51\x66\x28\x9f\x1e\xb1\x5e\x77\xd5\x77\x7d\x7c\x4c\x7b" + "\x15\xf6\x11\x8c\x8d\x62\x4e\xc0\xc8\x75\x47\x92\xe1\xbb\x08\xd3" + "\x35\xb0\xed\x36\x46\x49\x61\x8f\x0c\x94\x83\xd1\x80\xed\x6a\x6f" + "\x4b\x09\x5f\xd7\x25\x64\x48\x3c\x47\x38\x31\x46\x66\xe4\x6b\x03" + "\x50\xc6\x8c\xce\x31\xa6\xb6\x18\xe1\x1d\x84\x87\xce\x71\x09\xc2" + "\x65\xfa\x21\x7e\x59\xf8\x35\xe6\x29\x3d\x74\xd7\x40\x37\xac\x7e" + "\x56\xe8\xaa\x31\xd8\xff\xad\xc7\xb8\xc7\x85\x9e\xae\x09\x1a\x33" + "\x31\x86\xf1\x7f\x57\x93\xff\x5b\x1f\x5a\x4f\x57\x5f\xc1\xff\x5d" + "\x4d\xfe\x6f\xbd\x5f\x7f\x35\x76\xa9\xdb\x16\xd4\x5f\x5d\x9d\x17" + "\xed\x10\xba\xc3\xfd\xd8\xca\x14\xec\xa7\xaf\xae\x0e\xa2\x19\x65" + "\xf3\x64\x8c\x44\xf3\xe0\xa0\xf4\x87\xc3\xd0\xdc\x82\x34\xbf\x1b" + "\x86\x66\xdb\x15\x68\xa6\xf1\xee\x77\x07\xd6\xad\x27\xe3\x24\x3d" + "\x08\xd1\x2f\x7f\x32\x39\xb4\xfc\x9f\x0c\x92\x3f\x64\x99\x4a\x98" + "\x9d\xa7\x0f\x84\x2b\xf0\x87\xa3\xb5\xfa\x04\x4b\x3a\x12\x02\xb6" + "\x36\x18\x67\x18\xb8\x96\x01\xba\x47\x7b\x0b\x42\xea\xde\x93\x76" + "\x51\x1f\xd7\x64\x04\xd6\xc7\x35\x9a\xc0\xfa\x88\xbc\x0e\x48\xb7" + "\xc6\x10\x18\x6f\x74\xfd\x78\x36\x76\x4d\x4d\x90\x0e\x7c\xd2\x0d" + "\x79\xd7\x09\x1d\xc8\x5b\x1b\x44\xc7\x91\xd0\x3a\xb0\xa6\x15\xcb" + "\xff\x49\x68\x1d\x58\xd3\x15\x5e\x07\xf2\xa8\x3e\x7f\xe2\xaf\xb7" + "\xf3\x4b\xd2\x22\x83\x60\x12\x42\xdb\xbc\xbc\x94\xd0\xe3\x3a\x79" + "\x0b\x04\x8f\xf3\x76\x07\xf2\x38\x2f\x2f\x90\x87\x58\x96\xff\x3a" + "\x0f\xfb\xef\xe6\x70\x5a\xf2\x82\xeb\xbf\xb5\x1b\xd6\x4a\xf5\x7f" + "\xdd\xc2\x20\x1a\xa5\xfe\x4f\xa8\xb1\xac\xb5\x71\xc8\x4b\x6b\x68" + "\x5e\xae\x4d\x0e\x5d\xe6\xb5\x19\xd8\x06\x59\xbd\x03\xea\xd2\xda" + "\xe5\x18\x3e\x9f\xe6\x0e\x68\x0c\xab\x0e\xc3\xe7\xbb\x41\xc3\xdb" + "\xab\xfe\x76\x69\xed\x0e\x1a\x23\xe7\x63\xcc\xa8\xbf\xd1\xf1\x90" + "\x49\x6d\x10\xd1\xb5\xac\x24\x78\x4e\x74\x2d\x1f\xff\xa0\x75\x2c" + "\xb4\xaf\x26\xda\x0c\x99\x56\x87\x1b\x64\x7d\x27\xf8\x20\xdc\x36" + "\xaa\x17\x04\x2f\xc3\x8a\xb1\xce\xb2\x20\xdb\xb4\x4e\x13\x5a\xc6" + "\xeb\xf4\xe1\x75\x67\x5d\x8a\x90\xf3\xba\x82\x40\x39\xaf\x5b\xe0" + "\xb5\x0c\x5b\x40\x65\x45\x1d\xf8\x41\xf5\x84\xe6\x4e\xc3\xda\xfb" + "\xed\x8b\x3b\x0a\xb6\xc2\xf0\x33\xb0\x8e\xf7\x35\xca\x95\xcc\x15" + "\xbd\x4d\x01\x2d\xdc\x06\xe4\x8b\xf3\x30\x10\x66\x99\x1b\x94\x6c" + "\xfb\x9a\x0e\x8a\xab\xb7\x30\x17\xdd\x53\x23\xdf\x39\x83\xba\x70" + "\x6d\x27\xac\xfb\x26\x20\x3d\x7a\x7f\x56\x81\x23\x51\x8c\xef\xe7" + "\x1b\xe4\x71\xf8\x70\xe3\xfb\x08\x33\x5b\x5e\xf7\x2b\xe6\xc2\xf2" + "\xd3\xc2\xb6\xcb\x48\x13\xed\x2f\x27\x9a\xae\x6c\x07\xf2\x1b\x64" + "\xfd\x15\x73\x73\xf9\x47\x7c\x7b\x5b\xf2\x8f\x61\x5c\xce\x15\xc6" + "\x73\xfd\xea\x41\x7e\x8f\x3f\x1e\x71\x3f\x4d\xbe\x5b\xde\x9f\xe2" + "\xb4\x14\x68\xae\x82\x4b\xa2\xa7\x20\x39\x90\x9e\x82\x34\xf4\x2d" + "\x73\x24\x1c\xb3\xaf\x82\x23\xce\x7a\x70\x32\x8c\xf3\x82\xea\x0c" + "\x14\xbe\x44\xf7\xdd\x58\x6b\x7b\x20\xca\x0d\x6a\xd1\xb7\x2b\x38" + "\x40\x7b\x43\x18\x3f\x77\x60\x5a\x13\xcd\xc1\xf1\x35\x04\xba\x69" + "\x4d\x6d\x66\x8f\x74\xe6\x5b\xc1\xaf\x89\xa7\x6d\xc6\xf3\x4d\xb5" + "\x7b\x59\xcf\x7e\x7e\xd6\x57\x41\x40\xff\x6f\x37\xad\xff\xa1\x75" + "\x18\x5b\x61\x5a\x37\x3c\x35\x4b\xd4\xf5\xc2\x20\x9f\xb4\x20\x4c" + "\xff\xaf\x80\xfa\x7f\xd3\x42\xd7\xf3\xa7\xae\xd0\xff\x7b\x8a\xfa" + "\x7f\xd3\xfc\xdb\x4d\x31\xcf\xf3\xd4\x6c\x7f\x9f\x94\xce\xe3\xd2" + "\xaf\x24\x3f\xf3\xa9\x4f\xc7\x56\x83\xd6\x4d\x73\xda\x58\x37\xad" + "\x3d\x2d\x54\x5f\xb5\x6d\xf6\x46\x40\x5d\xd5\x0c\x2b\x20\x5d\xa4" + "\xb6\x8c\xea\xeb\x53\x7c\xbc\x30\xda\x2d\xea\x62\xa9\x99\xd9\x13" + "\xbb\x50\x87\xf2\x8d\x32\xae\x92\x2d\x46\xb1\xef\x63\x58\x17\x44" + "\x5a\x7b\x78\xbb\xa8\x20\x7f\x95\xfb\xad\xee\x0b\x40\x78\x9b\x4b" + "\xda\x80\xf0\x7a\xfb\xdb\x49\x8e\xbb\x97\xea\x38\xe1\x24\xdc\xed" + "\x08\x47\x78\x09\x4e\x2e\x87\xd8\x1b\x53\x18\xe7\x5f\x76\x3e\xfe" + "\x82\x79\x63\xf8\x43\x34\xae\x62\xa5\x74\xa5\x8b\xd9\xb8\x2e\x9a" + "\x33\x3b\xdf\xc4\x4a\xd7\xb0\x71\x85\x34\x26\x56\x78\x80\xd2\xbd" + "\xfb\x4f\x5b\x84\x69\x04\x68\xa4\xb0\x25\x2d\x7a\x17\xd8\xa0\xb0" + "\x21\xd0\x46\x14\x06\xf9\xbf\x05\x9c\x97\xf8\x34\xd1\xfa\x44\x69" + "\xfd\x2a\xd9\x03\x66\x75\x3b\xb9\x7e\x5c\x69\x4d\x05\xcd\x49\xd3" + "\x9a\x28\x71\xde\x5c\x61\x4f\xd0\xd8\x9b\x7d\x0f\x5f\x57\xf3\x77" + "\xcc\xb7\x68\xbd\xd0\x11\xd3\xfa\x40\x99\x16\x69\x4a\xcf\xd2\x5c" + "\x90\x68\x0f\x96\xba\x83\xed\x63\x91\x41\xf6\xdd\x82\xc2\xd3\xe4" + "\xf6\x40\xbf\x8e\xe3\x0d\x6a\x67\x8a\xb8\xff\xef\x19\xd0\x2e\x14" + "\x99\xb1\x7c\x01\x3a\xd9\xce\x75\xa8\xa8\xa2\xcd\x81\x7a\x53\x48" + "\xfa\x6f\x1a\x8c\x30\xdb\x68\xcf\x21\x7e\x47\x9e\x83\xa2\x26\x8f" + "\x05\x34\x6d\x76\xbe\xa7\x4a\x8b\x3a\xc2\xf5\x96\xda\x8d\xf1\x62" + "\x3d\x92\x23\x28\x8f\xd3\x32\xcf\x09\xa6\xbd\xf0\xef\x20\xd6\x53" + "\x90\x2e\x14\x1d\xa1\xb5\x19\xc3\x7a\xf9\xd9\x5e\x5a\x59\x87\xac" + "\xee\x0e\x68\x77\x07\xf7\x79\x4c\x09\xa1\xcb\x6e\xa2\xf6\xbf\xca" + "\x06\xa6\xea\x40\xd9\x9a\x78\xfb\x2f\xcf\xeb\xd8\x90\x07\x41\xe9" + "\x4c\x81\xb2\x2f\xe2\xbc\x0e\xbb\xc6\xa7\x22\x85\xd6\x71\x2d\x73" + "\xf0\xf5\x5e\x26\xac\xff\x85\x2d\x57\xb2\x83\x4c\x9b\xd2\xeb\x45" + "\x58\x69\x5d\x30\xda\x2d\x93\x2b\x60\xcc\xe8\x7a\x3e\x66\xb4\xac" + "\x1b\xd6\x4b\x73\x3f\x1b\x52\x03\xe9\x5b\x1f\x17\xde\x37\x58\x4f" + "\xf3\x3f\xcb\x42\xdb\x8c\xf5\xb3\x43\xfb\x06\xeb\x73\x24\xbb\xb0" + "\x8c\xc5\x04\xeb\xc1\xfa\x32\x94\x31\x4f\x23\xf7\x61\x69\x2c\x34" + "\x7c\x1f\x76\xfd\x91\xfe\x3e\x6c\x21\xd9\x83\xf5\x35\xfd\x7d\x58" + "\x7b\xa8\x3e\xac\x2d\x84\x3c\xd7\x3b\x42\xcb\x73\x43\x54\xe8\x3e" + "\xec\x86\x04\xd1\xce\x6f\xc8\x0a\x94\xf3\x86\x14\xdf\x9c\xf0\xfa" + "\xb8\x1f\xcf\x1f\xde\x70\x68\xa0\x3f\xbc\x71\x94\x90\xd5\xc6\xdc" + "\x20\xda\x9a\x42\xdb\xf6\x0d\x1d\xe1\xfd\xe1\x0d\x8e\xf0\xb6\x7d" + "\xa3\x76\xa0\x3f\xac\x1f\x14\x04\x33\xb1\xdf\x57\x0a\xf0\xcd\x36" + "\xce\x16\x7c\xda\x48\xfe\x9c\xca\x0f\x3e\x27\x50\xdf\x91\x66\xc4" + "\x87\xb6\xed\x0c\xd9\x34\x59\x67\xc2\xf1\x84\xce\x67\xba\xad\x1a" + "\x06\x63\x1d\xf8\xc4\x69\xd9\xd8\xaf\xff\xb4\x8e\x8f\xf2\x21\x1b" + "\x19\x76\x3d\x9d\x52\xa6\x8f\xd3\xd1\x7b\xa5\xf9\x52\x95\x0e\x32" + "\x5f\x18\xc0\x0f\x33\xf7\xff\x08\xc7\x95\x65\x66\x5e\x12\x54\xc7" + "\x1c\x62\x1d\xee\xa6\xd1\x42\x6e\x9b\x82\xfa\xb2\x66\x33\xdf\xd3" + "\x17\xd6\xde\x9a\x6b\x42\xeb\xa8\xf9\x48\xbf\xbd\x2d\x24\xbc\xe6" + "\xaf\x83\xe2\x4f\x0a\x19\x6c\x32\x78\x63\xfc\xc7\xba\xcd\x3d\x81" + "\x36\xc9\x7c\x32\x30\xdd\xa6\xa0\xfe\x9f\xd9\x4c\xf1\xdf\xaf\xbd" + "\xd9\x94\x15\xbe\xbd\xd9\xf4\x95\x28\x7f\x71\xd0\xfc\xf2\x26\xf3" + "\x95\xdb\x9b\x4d\x61\xca\xbf\xe9\x48\x60\x7b\x53\x1c\x34\x47\xbf" + "\xe9\x64\xe8\xf6\x66\x53\x8f\x6c\x67\x84\xdd\x28\x9e\xfe\xfd\xec" + "\x4d\xb1\x3e\xd0\xde\x14\x6b\xae\x66\x6f\x9a\x07\xd8\x9b\xe2\x9c" + "\xe8\xda\x50\x65\x29\x2e\x09\x6d\x6f\x8a\xab\x85\x0c\xd1\x69\x09" + "\xb0\x37\xc5\x87\x03\x65\xb8\x29\x48\x86\xc5\x41\xf3\xdf\x9b\xcc" + "\xff\xab\x36\x49\xa5\x52\x29\x55\x0a\xa5\x42\x85\x51\x58\x3c\x88" + "\x54\xa9\x55\x11\xf8\x1b\x24\x3d\x23\x95\x2a\xa5\x1a\x7f\x11\xd2" + "\x73\x50\xd0\x77\x24\xa5\xc5\x9f\x5a\x7a\x46\x04\x7d\x0f\xba\x4a" + "\x7c\xa4\x94\xaf\x9c\xbf\x3a\xe8\x3b\xe2\x2a\xf1\x83\xfe\x8b\xe9" + "\x61\xc0\x77\xe0\x3e\xc8\x59\xeb\x36\x64\xe7\xad\xce\xe1\xeb\xda" + "\x73\xf5\xd9\x2b\x56\xe4\x16\x15\xe9\x4d\xf9\xfa\x7b\xa7\x3f\x7c" + "\xe7\x64\xbd\x58\x1e\x9f\x97\x3a\x2a\x67\x08\xcc\xd9\x58\x48\x11" + "\x73\xe6\xcf\xca\xd2\x67\xde\x3b\x3d\x30\x52\x46\xc3\x97\xc1\x5f" + "\x09\x8b\x5f\xdd\x4b\x7b\xf6\x7a\x80\xdd\x7b\xb9\xdd\xe9\xa2\xbd" + "\xe7\xa2\x3f\xb1\x6d\xd6\x09\xda\xbf\x7c\xa9\x94\xd1\xbe\x8a\x4e" + "\x28\x39\x4b\x85\x48\x6a\x28\x83\x82\x27\xe8\x3c\x95\x2d\x83\xd9" + "\xef\xed\xa0\x7f\x00\x94\x9d\xf0\xf4\xa3\x2d\x19\x08\x8b\xdf\x56" + "\x9b\x1b\xf4\xa5\xe4\xdb\x96\x7d\x87\x71\x0a\x36\xd5\x8b\x61\x0e" + "\x69\x7f\x7e\xd9\x60\x1e\xf6\xfb\x32\x19\x2e\xba\x1b\xb6\xbc\xc3" + "\x7e\xcf\xf8\x37\x9d\x59\x23\xe0\xb6\x6c\x63\xca\x92\x34\xb2\x0b" + "\xb5\xb1\xa0\xa6\x75\xd9\x2f\xc5\x82\xe6\xa5\xeb\xe9\x8c\xdf\x2d" + "\x26\x79\x5d\xf6\xb3\xf8\x6d\x83\xa7\xb3\x28\x6f\x82\xf5\x2a\x4b" + "\x9e\x24\xf8\xba\x40\xf8\x83\xbe\x75\xdc\x5b\xe8\x7e\xaf\xa8\x79" + "\x5f\x42\x74\xb4\x87\x7d\xe3\x8a\xbd\x4b\x3f\x2e\x03\xfd\x34\x14" + "\xc5\x09\x77\x19\x88\xbd\x51\x5b\xce\x6e\xf2\x30\x37\x9d\x99\x30" + "\xa7\xb7\x94\x95\xaf\x05\x35\xd6\x67\x45\x53\x21\xed\xa5\xd8\x72" + "\xaa\x3e\x17\xd4\x58\xfe\xf8\x33\x50\xaa\xd6\xcf\x45\xbf\x71\x0e" + "\xa8\xff\x64\xa6\xfd\xae\x53\xef\xdd\xf3\x17\x50\xbf\x7d\xa9\x4c" + "\x79\x89\xe9\xa0\xc4\xc4\x7a\x18\x9d\xfb\xed\x60\x2e\x5a\x6f\x7b" + "\x62\xb9\x87\x60\xee\x74\x96\xea\xa0\xdd\xe4\x80\x2d\xa7\x99\x6b" + "\xd7\x5f\xc4\x79\x15\x6d\xbd\x0e\xda\x3f\xab\xd9\x32\x07\x54\xdd" + "\x59\xa0\x6c\x33\xd6\x80\x75\x89\x03\x4a\x4e\xb3\x9e\x13\xcb\xbf" + "\x82\x76\xe3\x11\x58\xd6\x01\xca\x13\x5d\xff\x00\x7e\x76\x75\xd5" + "\x1b\xf6\xad\x17\x40\xb7\x65\x35\x85\x5d\x80\xe2\x2d\x30\xb4\xf8" + "\x6f\xd4\x0f\xea\xc0\x7c\xce\xc2\x63\xa7\x40\x81\xf8\x94\x9b\xff" + "\x01\xba\xcd\x8f\xf2\x7d\xe6\x50\xbb\x15\x74\xac\xd4\x10\x75\xa9" + "\xd4\xa0\xbd\xc4\x0c\xb1\xce\x52\x43\x5c\x7b\x01\xc2\x77\x7d\x0c" + "\xc3\x3a\x20\xee\xf7\x67\x3a\x94\x35\xdf\x42\x3c\x95\xa9\x1b\xcb" + "\x56\xfb\x2d\xc2\x57\x95\x14\x78\x31\xad\x7f\x1a\x77\x4c\xc9\x2e" + "\x6b\x96\x0b\xbc\x88\xab\xe6\x12\xc4\xd7\x5e\x02\x9d\xb7\xb2\xa4" + "\x80\xd2\xf5\xd2\x19\x72\x68\x31\x4a\xb6\x30\xcf\xe5\xaa\x29\x7a" + "\xb4\x87\x91\xef\x3e\xd1\xa8\xb6\x9e\xe8\x85\x36\xc7\x25\x68\x87" + "\xbf\x83\xd5\xfc\xaf\xa6\xb7\x9f\x68\x8c\x40\x7f\x52\xd1\x54\x4c" + "\x6b\xe0\x85\xee\x94\xb6\x81\xda\x8a\x32\x28\xdf\x0a\x51\x05\xc5" + "\x10\x79\x06\xc3\xb9\xed\xa9\x18\x67\xb0\xba\xff\xd5\x54\xcc\xf7" + "\x83\x3f\x9d\xb5\xb5\x0d\x54\xed\x8e\x1a\xda\x77\xac\xf4\xc4\xbe" + "\x61\xb7\x3a\x4e\x82\xb5\xe0\x8b\x26\xaf\xf6\x8d\x8e\xdd\x5e\xd0" + "\xbc\x73\xf1\xa4\xd2\xaa\xbe\x08\xd6\x2c\x07\x7c\x82\x79\xb3\xaa" + "\x37\x68\x4d\x75\x5a\xbb\xc3\x45\xe7\xef\x24\xb3\x3e\xdd\x90\xf2" + "\x42\x48\xac\xfb\x16\x12\xf6\x7f\x0b\x06\xe6\x34\x28\x69\x8f\x37" + "\x9d\xa9\xb6\x1f\x9f\x51\xd8\x07\xc3\xb2\xf3\xbd\xde\x2c\x46\xda" + "\xeb\x7d\xd9\x00\xf5\x97\x7c\x7b\xbd\x2f\xf5\xf9\xf6\x7a\xa3\x4e" + "\x99\x69\xbf\xb7\x0d\x4a\xa3\xa2\x4f\x40\x64\x27\x6c\x49\x26\xfd" + "\x2e\x3f\x07\xea\xed\xe7\x00\xc6\x95\x29\xa9\x9f\xa9\x46\xdd\x3f" + "\x6b\x45\xd9\xd0\x7b\x27\x94\x1d\xc4\x67\x14\xfe\xb0\x3f\x57\xc6" + "\xcf\xaa\xe8\x92\xf4\x18\xc3\x94\x18\xf6\x3c\x3e\x55\xf8\xdc\x59" + "\x5a\xcb\xec\xac\x62\x1a\xed\x2d\x1d\x42\xfa\x2c\xf6\x97\x4f\x03" + "\xa7\xa5\xac\xc4\x06\x87\xbb\x64\xbd\x16\xf6\x7d\x8b\xf9\x93\xce" + "\xb3\x74\xbe\xbc\x9d\xd3\x75\xd9\xa8\xa0\xb3\xe6\xa5\x70\xa2\xe1" + "\x2b\xca\x17\xf3\x6f\xc5\x67\xb4\xe8\x83\x96\x2d\x91\xd3\xf6\x5d" + "\x36\x52\x9e\xff\xc0\x70\x26\x87\x63\xb9\xd5\x14\xf7\x9b\xce\xb3" + "\x4a\x01\x63\x50\x22\x4e\x97\x84\x1f\xeb\xfe\x96\x78\xaa\xe3\x7d" + "\xca\x68\xd6\xbc\x7c\x22\xd4\xee\x65\x27\xf6\xef\x65\x2d\xa2\xee" + "\x6d\xd3\xdb\xe0\x57\xbb\x88\x46\x6c\xc3\x5b\x76\x63\x5c\x33\x7a" + "\x3f\xc4\x97\x96\x1c\x5a\x5f\xba\x2d\xcd\x06\x23\xe3\xfc\xcb\xc0" + "\x2c\x9b\x49\x6f\xa2\x7f\xb5\xb5\x35\x02\x6d\x80\xbe\xbd\xab\x17" + "\xde\xbe\xd4\x13\x51\xfa\x47\x50\x5a\xdd\x9d\x30\x3e\x4e\xdc\xcb" + "\x53\xbf\x97\xd9\x5e\xa0\xfb\x8a\xf7\xb2\x5e\xd4\x97\x5b\xce\xc0" + "\xb6\xe7\xc7\xc6\x41\xdc\x9f\xb1\x17\x2c\xec\xd3\xb6\xd7\xfd\xec" + "\x53\x52\x9b\xad\xd1\xcf\x36\xed\xfc\xc7\x40\xdb\xb4\xe3\x3f\x84" + "\x6d\xc2\xba\xcf\x6d\x91\xc7\x26\x85\x7f\x1e\x14\x2e\xed\x5f\xd9" + "\xf1\x66\x50\xb8\x4b\x0a\x7f\x31\x28\xdc\x2e\xc2\xb7\xff\x4d\xb6" + "\x7d\xed\x44\xc7\x46\xb2\x7d\xdb\x3f\x22\xdb\xd7\xbe\x5c\xb2\x7d" + "\xdc\xfe\x6c\xdf\xcf\x5e\x45\x5b\xb4\x81\xec\xcd\xf6\xf5\x44\x3f" + "\xfb\x3d\xc8\xb4\x0f\xc6\xb0\xbb\x29\xac\xe2\xef\xa0\xc6\x9f\x6c" + "\xf7\x9e\x21\xbb\x47\x36\x8f\x6c\xdf\x2b\xd7\xb3\x8e\x57\xf6\xb2" + "\x53\xb5\xfc\x9c\x6c\x4b\xbf\xfd\x7b\x0e\xc3\x76\x63\xd8\x73\x18" + "\x4f\x76\x90\x78\xd2\x96\xd5\x08\xfc\x1e\x9d\x8a\xa9\x69\x5e\x65" + "\x32\xec\x41\x79\xd3\xf9\x57\x3b\x90\xbf\xd1\x0a\x28\xb0\x9a\x1c" + "\x7c\x1f\x0a\x9d\xcd\xde\x6e\xea\xa2\x7a\x77\xfd\x76\x2f\x8d\x53" + "\x7c\x05\x5b\x1d\xec\x0c\xed\x55\x21\x1a\x96\x6d\x7a\x80\xce\x16" + "\x57\xb4\x18\x01\xe8\x5c\x02\xb2\xd9\x48\x8b\xba\x02\x69\x12\x67" + "\x19\x6f\x4f\xb4\x41\xa7\x64\x87\x9f\xce\xa2\x7b\x0c\x3a\xc1\x52" + "\xc0\x2c\x68\x1f\xb1\x6c\xd1\x9e\x32\xa0\xb3\x59\xe8\x3e\x4f\x7a" + "\xbe\xa2\xf4\x1a\x2b\xe4\xf3\x59\x2c\x68\x1b\x10\xc6\xda\xe1\x02" + "\xa2\xd9\x06\x96\x63\x6d\x25\x8d\x94\x7e\x39\xf1\x86\x59\x4a\x65" + "\x1c\x0a\x8e\x43\xc9\xc7\x6e\x8d\x36\xd8\x9e\x29\xfc\x9b\x29\xfa" + "\xb6\x25\x76\x20\xbb\x6f\xed\x41\x1c\x25\x9d\x02\x07\xe2\x62\xd8" + "\x06\x04\xc4\x49\xf8\x87\x6e\x61\xdf\x20\xfe\x44\x92\x17\x9d\xd3" + "\x45\xeb\x94\x90\x2f\x51\x74\x56\x83\xf0\x43\x2d\xef\xd7\xff\x1d" + "\x40\x3a\x6b\x0c\xf5\xcd\x72\x94\xce\xf2\xa2\xf3\xc5\xae\x74\xb6" + "\x18\xf2\x28\x41\x3e\x5f\xcc\xbb\xf1\xc7\x3d\x5b\x0c\x71\xeb\xea" + "\x94\xec\x08\xd2\x7f\x94\xce\x17\x43\xfa\xe3\x48\x0f\xa5\x32\x35" + "\xbe\xf8\x18\xf1\x7c\x9b\x9b\xc2\xca\x2d\xac\x55\x96\x3f\x95\x97" + "\xca\x82\x71\x36\xe1\x1f\xb2\x93\x36\xd8\xd1\x48\xf1\x18\x76\x82" + "\xe0\xc7\xa3\x1d\xb3\x62\x1b\xf6\x6e\xa7\x47\x59\x5e\x0c\x6a\x61" + "\xd3\x76\xfe\x1b\xa5\x17\x36\x6d\xe7\x2e\x9f\x4d\xdb\xb9\x45\xd8" + "\x34\xc1\x63\x61\xd3\x76\x3e\x25\x6c\xda\xce\xd5\x7c\x3d\x11\xda" + "\x34\x8a\x23\xbb\x26\xdb\xb4\xfd\xd7\xb3\x56\xb2\x1d\x4e\xcb\xce" + "\x2c\xd9\xb6\x3d\x8f\x61\x64\x3b\x88\x46\x61\xa7\xb6\x1f\x61\xff" + "\x8f\x01\xc4\x7a\x4d\x7a\x37\xd2\xf9\x19\x3d\xd2\x3b\xca\x65\xe7" + "\x1f\x85\x8d\xdb\x79\xd8\x67\xe3\x76\x26\xfb\xd2\x92\x8d\xdb\xf9" + "\xa9\xb0\x71\x22\xbc\xfe\x31\xb2\x71\xdb\x8f\x10\x0f\x24\xfc\x4a" + "\x9a\x47\x93\xe0\x91\x8f\xdb\x1a\xfd\x6d\x5c\x60\xfd\x7a\x5a\x2d" + "\xdb\x38\xb2\x6d\xf8\x1d\x67\x83\x11\x7c\x8e\x98\xea\x59\x35\xf2" + "\x5c\xae\x77\x24\x03\x2a\x33\xdd\x57\x40\x7c\x9b\x71\x16\x22\xa5" + "\x73\x6b\xa4\x72\x3f\x9d\x29\xef\xd1\xb4\xc1\xce\x81\x67\x9a\x81" + "\xef\x5c\x32\x94\xf5\xad\x74\x96\xa3\xb5\xac\x13\xac\x35\xac\xac" + "\xdd\x7d\x1a\xbc\xdb\xd7\x7c\x49\x72\xc5\xfe\xc6\x14\x7a\x92\xdd" + "\xc1\x76\xb4\x72\x99\x83\x8f\xdf\x7f\x59\xae\xc4\x38\x73\x40\xdc" + "\x3b\x94\x07\x8d\x2b\xe2\xbb\x39\xdc\x38\xc2\x0f\xc8\xcb\x13\x3e" + "\xaf\x67\x6e\xe4\x79\xa1\x2f\x85\xfd\x9e\x98\x73\xf0\x34\x9f\x43" + "\xe3\xe7\x36\x87\xc4\xf5\xcc\x2c\x29\x5e\x15\x26\x7e\xf5\x55\xd2" + "\x3f\x7b\x95\xf4\x6f\x92\x0d\xa2\xfd\x78\x1e\x4b\x20\x9e\x61\x6e" + "\x19\xee\x0c\xc1\xfd\x9b\x34\x0f\xf2\x65\xe9\x08\xde\x2f\xd3\xc9" + "\x38\x49\xef\xf6\x20\x1c\x3f\x23\x18\x6d\x64\xfa\x26\xa0\xf3\x39" + "\xfd\xd2\xee\x1a\xea\xe3\xef\x33\x4d\x57\x18\xa7\x89\xb2\xd6\x00" + "\xd0\x7d\xf6\xcd\xe8\x8b\xd2\x5e\x9a\xea\xfe\xb9\x87\x5d\x39\x68" + "\x2f\xf9\x99\x77\xd2\xbe\xdd\x5e\xb4\x6f\xb7\x8a\xb3\x91\x1d\xf2" + "\x5e\x8b\x1b\xd0\x2e\xc7\xd2\x39\x2c\x34\x5e\xbd\xcc\x93\xa9\x6c" + "\xe6\xe7\xfd\xef\x6a\x90\xd3\x86\x1b\xdb\xa3\x7c\xa5\x3c\xf9\x3e" + "\x24\x4c\x73\x4a\x4e\x43\xb8\x69\xef\x0d\xb6\xc7\xb7\xf2\xf3\xcd" + "\xdc\xbd\x64\x03\x6f\x40\x1f\x34\x56\xe4\xb3\x1c\x44\x3e\xcf\x6a" + "\x30\xcd\xa9\x2b\xed\x73\x0a\x5f\xbe\x67\xd3\x7f\x78\xf9\x40\x2a" + "\xdf\xb3\x65\x57\x29\xdf\x95\xf2\x3d\xf6\xc3\xf3\xd5\xca\xf9\xba" + "\x7e\x38\x5f\x7f\x91\xf8\xfd\xf9\x9a\x2c\xf1\xf5\x17\xcb\xaf\xc2" + "\xd7\x50\xf9\x54\x7f\xff\x7c\xf4\x72\x3e\xad\xa1\xf2\x01\xfe\x17" + "\xf6\xbc\x1e\x8d\x7c\x27\x8d\x74\x0f\xf2\x60\xa7\xe5\x39\xad\x0d" + "\x9e\x8d\x93\xe7\xb7\xc4\xfd\x4c\xcf\x25\xd8\xe0\x17\xea\xc0\x7d" + "\x5c\xcf\x4d\x5f\xd6\x40\xed\x3a\xf3\xda\xe0\xb9\x74\x1a\x6b\x4b" + "\xdf\x22\xce\x07\x94\xd2\xa0\xfd\x7f\x76\xf7\x95\xe6\xd3\xf8\xdd" + "\x1b\xd2\xd9\x1d\xb4\x3f\x95\x55\x6d\xce\xec\x2b\x35\x82\xb8\x9b" + "\xfa\xb9\x37\x69\x1f\x12\xbe\x47\xd2\x3b\x3e\xb1\x0d\xd8\x2d\xd6" + "\xe1\xd1\xbd\x06\xe2\x6c\x8a\x41\x18\xf7\x1d\xdd\x7b\x21\xf6\xf1" + "\x3d\x77\x02\xe9\xe4\x77\x56\x8b\xb3\xfc\xf9\x19\x2f\x0e\x84\x53" + "\x52\x5a\x71\xb6\xc7\x73\x76\x19\xc6\x26\xe3\xeb\x3f\xe7\xe2\xb9" + "\x4f\x45\x1b\xf3\x5c\x53\x5f\x98\xfb\x93\xe8\xbc\xb3\x83\x5b\x93" + "\x03\xf6\x21\xce\x2c\x2c\xcc\x2f\x9c\xac\x2f\x5a\xfb\x44\x52\x91" + "\x29\xdb\xb4\xbe\x88\x6f\x58\x1f\x02\x18\xa0\x37\xad\x5e\x9b\x9b" + "\xbf\xde\x64\xd8\x98\xbd\x5a\x6c\x70\x1f\x8d\x80\xfe\x40\x10\x78" + "\x5f\x25\xda\x22\x1a\xbf\xa1\xb3\x28\xf8\x9d\x95\x74\x26\x89\xbc" + "\x7f\xb7\x45\xc7\xef\xf6\x42\xdb\xb5\xfb\xa8\x0d\x0a\xb2\x64\x79" + "\xd0\x39\x89\xe8\xbf\xe8\xce\xc0\xee\x7f\x23\x1d\x9a\x87\xae\x68" + "\xbd\x38\x5f\x82\x9f\x11\x60\x35\x61\x40\x3b\x68\x9a\x36\xd0\x78" + "\xec\xf3\x19\x5e\xcb\xee\x49\xfc\xdc\xc7\xe2\x33\xf4\xbd\x56\xf6" + "\x17\x68\x7e\x49\xcc\x07\xdf\x3a\xad\x13\x76\xef\xa7\x7c\xa9\xfe" + "\xd5\x55\x89\x3b\xc2\x99\x65\x77\x26\xed\xd9\xc6\x6f\x8d\xd3\xf2" + "\xfc\x24\xd9\x27\x45\x7a\xa3\x58\xcc\x66\x94\xf7\xf3\x79\x9f\x69" + "\xed\x20\xed\xf9\xd6\xd4\x89\xfd\xdd\x6a\x84\xcd\xe9\x87\xb5\x20" + "\x6c\xe5\xe6\x2c\x6c\x3f\x43\xce\x69\xb3\xd8\x8c\x0c\xef\xe5\xac" + "\x08\xff\x32\x63\xff\x1a\xe5\xb7\xe7\x16\x2c\x7b\x9c\xac\x33\x42" + "\xf6\x7b\x22\xc4\xf9\xcb\x19\x19\x18\x36\x08\x9f\xcb\xfb\x30\x8e" + "\xce\x42\xc0\x72\xd1\x38\xb4\xa2\xbd\xe4\x7c\x53\xb3\xae\x13\xe5" + "\xfe\x3c\xfa\x17\x1b\xc4\x39\xa5\x98\x07\xc3\x3c\xac\x65\x97\xa0" + "\x45\xcf\x68\xdc\x19\x65\xbe\x67\x62\x8b\xde\x01\x4c\xb5\xf8\x4b" + "\x4a\x87\xf5\x4b\x57\x6a\x26\x9f\x04\xc3\xf9\x3e\xbd\x3d\x06\x99" + "\xe7\x26\x3d\x3b\x4b\x30\xe1\xc6\x97\xa9\xdd\x2c\xe7\x6d\xca\xb7" + "\x40\x6b\xb1\xba\x60\xcf\x80\x3d\x8f\xa3\x72\x26\xeb\x73\xb2\x4d" + "\xfa\xbc\xd5\xeb\x72\xf5\x39\xab\x73\xf4\xeb\xf2\x4d\xfa\x55\xf9" + "\x34\xd0\x43\x43\x3b\x01\x3a\xe1\xa5\xf2\x6d\xcc\x8a\x90\xe7\xb2" + "\xfb\x36\x1a\x07\x09\x9d\x2e\x7f\xbd\xcf\x69\x8c\x0c\xe4\x49\xb9" + "\xd4\x66\xee\xe9\x40\x79\x48\x67\x02\xa8\x7a\xf0\x9b\xca\x92\x16" + "\x58\x87\xcb\xff\x26\x60\xcb\xd5\x32\x2c\xd7\x8b\x91\x67\xfa\xe3" + "\xca\x25\x7d\xac\x17\xfb\x95\xf9\xf9\x37\xf5\x7c\x2d\x7f\xf9\xa4" + "\xb0\x69\xe8\xcc\xaf\x62\x58\x71\x0e\xca\x47\x30\xcb\x9e\x3c\x49" + "\x87\x34\xde\x8a\x8c\x2c\x49\x7f\x50\x27\xca\xcd\x03\xf5\xa7\xfc" + "\x14\xe9\x0f\x73\x66\x69\xf8\xba\x0f\xb7\x0b\xed\x1d\x7e\x63\x3b" + "\x8d\xb4\x9f\xa6\x72\x38\x36\x66\x69\x4a\x5f\xe2\xe7\xf0\x7d\x4d" + "\x73\xa8\x74\x2f\x0e\xea\xca\x60\x71\x7f\x67\xf9\x09\x59\x46\x32" + "\x7c\xe8\x3a\xcc\xf5\x25\x50\xc7\x38\x3f\x2b\x46\x71\x1d\x43\x3f" + "\x01\x69\x52\xca\xe7\xfd\x51\x5b\x62\x83\x8a\x14\xd3\x16\xc6\x9c" + "\x96\x8a\x64\x3f\x3d\x38\x17\x4a\x0f\x50\xb6\x2b\xf2\xf2\x57\xac" + "\xc1\x8a\x5e\x98\x6b\x5a\x61\xa4\x33\x2e\xc8\x0e\xf0\x03\x34\x46" + "\xe5\xe8\xd7\x17\xe5\xae\x18\x02\xa1\xa0\xfa\x23\xfd\xe5\xaf\xf5" + "\xa2\xbe\xf6\xf5\x65\x45\xd0\x5e\x0b\xb1\xb7\xa2\xf2\x42\x5f\x11" + "\xf6\x49\x02\xe4\x5e\xf9\xb5\x55\x97\x8c\xbe\x5d\x32\x70\x5f\x1c" + "\x79\x26\xd6\x0b\x54\x25\x11\x1f\xfa\x94\x0a\x6c\x57\x2a\x7a\x65" + "\x1d\xc0\x77\x6c\xff\xca\x6d\xbe\xb5\x1a\x55\x89\x7d\xca\x88\xd3" + "\x64\x7f\xc4\xba\x90\x33\x68\x07\xa2\xeb\x3b\xa1\x92\xf7\xbf\xea" + "\x78\xbb\x54\x99\x28\xa7\xd9\xd3\xbf\xdf\xb9\xb2\x5a\xd6\x13\xbf" + "\x34\xb7\x50\x18\x3f\xf3\xc8\x52\x91\x41\x32\x67\x42\xf6\x6a\x19" + "\x0e\xf9\xca\xea\xb9\x1d\xa9\x2c\x0b\xb6\x0d\x9f\x69\x69\x6e\x5c" + "\xd0\xc3\xf5\x4f\x9b\x91\xcc\xcf\x4f\x41\x9f\x0f\x71\x3f\x2f\xad" + "\x53\x39\xc9\x7d\x03\x33\xe2\x72\x09\x5c\x98\xd7\x3a\x39\x2f\x16" + "\x93\x91\x5c\xcf\xf5\xac\xd2\xe6\x1b\x3b\xac\xdc\x4d\x7d\x66\xd6" + "\x97\x35\x08\xe5\x79\x82\xeb\x16\xbe\x9b\x6e\x14\x67\xb9\x91\xbe" + "\x51\x39\x49\xaf\x7c\x3a\x55\xa5\x97\xe5\x4d\x65\xc6\x74\xa7\xf4" + "\xfc\xbc\xdf\xaa\x49\x32\x2f\xc3\x9d\x39\xc3\xeb\xad\x16\x69\x71" + "\x8a\xba\xcb\xfb\x7b\xe2\x9c\x21\xda\xef\xa2\x42\x1a\xb3\xba\xe1" + "\x85\x59\xb4\x86\x3f\xda\x45\xfd\xa7\x8c\x2c\x3a\x43\x41\xb4\x65" + "\x55\x35\x88\x7f\xb7\x6f\x8f\x7a\xd5\x21\xcc\x7b\xb7\x90\x5d\xd5" + "\x51\xbf\xba\x67\x97\xd6\x05\x44\x12\x8f\xc8\x9e\x59\xcd\x33\x79" + "\x7d\x15\xfb\x7f\xab\x6c\x72\x3a\x7e\xde\x00\xea\x06\xad\x87\x3d" + "\x07\x2f\x70\x7f\x83\xe8\x43\x5e\x97\x51\xfe\x54\x3e\x6a\xbb\xb9" + "\xde\xe8\xe8\xbe\x94\x17\xe2\x03\x69\x78\x21\x51\xc6\x25\x70\xbf" + "\x90\x22\x7f\xd3\xf9\x63\x36\xa8\x6e\xa5\xfb\x27\x9b\x1d\xbc\x0c" + "\xd7\xb4\x98\xb0\x6e\x39\x38\x5c\x8e\xcc\x43\x0c\x2f\xc3\x6f\x13" + "\xb6\xbd\x66\x31\x37\xb4\x39\x4b\xd8\xa2\xea\x16\x3a\xdb\xaa\x54" + "\x4f\xe7\x13\xa6\x08\x7b\xc3\xcf\xd4\xe1\x71\xdb\xa4\x3a\x3b\x98" + "\xf6\x0a\xf1\xf5\x31\x0e\x37\xb7\x0d\xe2\x0c\x06\x8c\xc7\x3a\xe2" + "\xa4\xfb\x5f\x2e\x1b\x07\x4b\xb4\x75\xf4\xe7\x41\xf7\x62\xf2\xb9" + "\xc8\x17\x5a\xc5\x99\x26\x91\xd8\xe7\x7b\xc1\x25\xcb\x6f\xc7\x5e" + "\x0c\xa3\x7b\x5b\x95\xa0\x69\xe1\x67\x86\x55\xc7\xc9\xf4\x4a\x71" + "\x4a\xae\x0f\x9c\x07\xd5\xfd\xf5\xbf\x8f\xdf\x31\x5a\x9d\x26\xe7" + "\xc3\x61\x11\x8e\xe0\x5b\x12\x78\xdc\x92\x7e\x3c\xe2\x2c\x15\x0d" + "\xbf\x67\xba\x81\xc7\x99\x7d\xb6\xea\x05\xbe\x66\x8c\xaf\x5f\xc3" + "\x72\xd8\x37\x1b\x07\x73\x19\xe8\x41\x85\x69\xe8\xfe\x62\xa5\xd0" + "\xc5\xea\xc3\x72\x1a\x95\x82\xf8\x58\x7d\x4c\xce\x5b\xc6\x41\xf4" + "\x5f\xd1\xe6\x89\xb2\xa8\xa9\x8e\x48\x77\x85\x72\x7b\x21\x7c\xae" + "\x17\x67\x72\x1d\xe4\xe5\x7c\x51\xe7\x2f\x6b\xe1\xd3\xbd\x98\xe8" + "\xa7\x0f\x48\xcf\x8b\xfd\xf2\xb7\xc1\x8b\xd2\xbd\x9d\x2f\x66\xfa" + "\xd1\x98\x86\xdf\xcb\x7d\x72\xe0\x32\xa2\x3b\x80\x42\xde\x33\xc9" + "\xeb\x0a\xc2\x78\x19\xa7\x93\xe4\x81\x7d\xb2\x49\xd0\x42\xbe\x21" + "\xd6\x15\xe4\x09\xd1\xf8\x15\xe9\x15\xe2\x6d\x0c\xd4\xcd\x17\x5b" + "\xfd\xe8\x55\x90\x5d\xc7\xb0\xd3\x32\x8c\x0d\xf6\xf2\x39\x3a\x99" + "\x9f\x18\xe7\xea\x97\xe3\x9d\x04\xbb\x57\x23\xd3\x79\x95\x36\x43" + "\xe2\xd5\xde\xe9\x22\x8f\xbd\x69\x72\x1e\xf8\x3e\x1b\xeb\xc0\x00" + "\x1f\xfc\x89\x4d\xa6\x5c\x71\xc8\x11\x35\xf2\xd9\x2b\xd6\xe4\xe6" + "\x24\xea\xb3\x57\xd2\x71\x48\x45\x79\xb9\xb9\x05\x7c\x32\x27\xd0" + "\x0f\x8c\xe3\xf9\x21\x1f\xc4\xd9\xd3\xfb\xe8\x3c\x14\x87\xd4\x0e" + "\x53\x7d\xb7\x53\x7d\x6f\x2e\xf9\x96\xf7\x71\xac\x65\x77\x82\xd5" + "\xc5\xca\xa8\x1f\xc0\x6d\x1f\x95\x5f\xe7\x10\xed\x00\xca\x93\xda" + "\x48\xa4\xad\x27\x90\x5f\x7b\x5d\x81\x75\x79\x9f\x26\xb4\x9d\xd8" + "\xfb\x26\xb7\x13\x15\x42\x2f\xc8\x3e\xd1\x1e\x00\xc2\x8b\x69\x52" + "\x02\x71\xee\x9b\xed\xb3\x51\xfb\xb2\x64\x1b\x25\xda\x89\x7d\x25" + "\xd8\x06\x55\x48\x79\x99\x7c\x7a\xb3\xcf\x21\xf4\x66\xdf\x2e\x1b" + "\xbc\xd3\x7f\xde\x87\x68\x3b\xf6\x66\x91\xff\x28\xee\xf5\xde\x77" + "\x48\xc6\x57\x1d\x4b\xed\xc6\xbe\xc6\x81\xfe\xc3\xbe\x1c\xf2\x1f" + "\x68\x7d\x22\xf1\x82\xdf\x63\xcc\xeb\xcd\xbe\x2e\x3f\xfb\xa3\xc5" + "\x6f\x47\x28\x59\x3f\x41\xcd\x71\x12\x4d\xbb\x25\xad\x58\x67\x4a" + "\xa5\xa3\xaa\x72\xcd\x05\xb9\x2b\x4c\xb9\x39\xc1\xf3\x6d\x06\xd9" + "\x17\xa3\xb9\xee\x6a\xac\xf7\xf6\x18\xe2\x47\x0d\x96\xff\x65\x93" + "\x5c\x06\x6e\xa7\xcc\x74\x67\x0a\xb7\x71\x51\xdd\xf0\xf2\x74\x71" + "\x87\x79\x8d\x49\xd6\x13\x82\x9b\x61\x66\x5e\x0c\xc3\xf2\xef\x2d" + "\x93\xfa\x5d\xd8\xb7\xad\xa9\x91\xbf\x7d\xe9\x6b\xfe\xc1\xdb\xbe" + "\xbd\x7c\x6d\x1f\xf2\xf4\xa5\x25\x7e\xfe\x16\x7d\x4f\x94\xbe\xf9" + "\x79\x4c\xe2\x3e\xf6\x9a\x6f\x04\x7f\x6b\x50\xfe\x2f\x4a\xb6\xe2" + "\xe5\x34\x81\x07\xe0\xb5\xad\xf6\x88\x7a\x3e\xce\xff\x92\x46\xce" + "\x0f\xd3\x9f\xf6\xcf\x93\xda\xad\x60\x7c\x36\xa8\xe1\xeb\xa8\xb6" + "\xf3\xb3\xe4\x5e\x4a\x0f\x41\x6b\xab\x3f\x1c\xc2\x18\x11\x26\x4e" + "\x2e\xf3\x7c\x33\x0f\x2b\xb9\x42\x19\x7b\xa5\x32\xd2\xd9\xfd\x3c" + "\x7f\xd2\x7f\x89\x86\xd3\xd2\xf9\x24\x36\xba\x37\x92\xe8\xe7\xe7" + "\xa4\xe9\xa8\x5e\xbf\x74\x12\xdb\xb3\x74\xb9\x1c\x54\xc6\xa3\x5b" + "\xed\x6a\xf9\x7c\x2a\x91\xfe\xa5\xf7\x03\x69\x7b\x59\xed\x97\xa6" + "\xa7\x69\x24\x8d\xe1\xbf\xb4\x9f\x59\x6a\x78\xff\x87\xce\xad\xaa" + "\xee\xd7\xc3\x97\x93\x07\xea\xdd\x4b\xb5\xa4\x77\xfe\xba\xb4\xfa" + "\xce\x15\xa8\x49\x45\xb9\xa6\xc9\xdc\xbb\x47\xc7\x8e\x8e\x3f\xcb" + "\x36\xad\xce\x5f\x57\x94\xa8\x2f\xca\xc9\x96\x2a\x7d\x40\x9d\xb7" + "\xf0\x31\x00\x87\x5c\xcf\x30\xaf\x5a\x9f\x6d\x79\xd9\xa7\xff\xb4" + "\x56\x6b\x24\x8d\xd1\xbe\xfc\x8d\xa8\x4f\x2f\xb7\xf8\xd5\x5d\x9e" + "\x9e\xea\x68\x3d\xf7\xd9\x5e\xf6\x6f\xff\x1d\xc8\xd3\xc1\xe7\xe0" + "\xe5\xe7\x25\x9e\x3a\x04\x8f\x5f\xb9\x87\x97\x93\x9f\xcb\xf5\xf2" + "\x6c\x2a\x27\x3f\x07\x86\xfb\x67\xaf\xe8\xe5\xf2\xfa\xfa\x0d\xaf" + "\x4c\xe2\x7e\x94\xe4\xaf\x5d\xad\x7f\x2f\xfc\xd3\x57\x4e\x49\x63" + "\x70\x1d\x72\x1f\x4f\xf6\xaf\x91\x96\x1c\xe1\xab\xbe\xf2\xfc\xbc" + "\x12\x76\x79\x99\x99\xce\xab\x23\x19\xbc\xf2\x91\xec\x5b\xf2\x75" + "\x7c\x95\x19\x93\x90\x9e\x23\xfe\x76\x82\xa9\xd6\x74\x48\x3e\xe2" + "\x24\xd1\x77\xbd\xe6\xc3\x4e\xcc\x8b\xe6\x20\xae\x40\x1b\x95\x0b" + "\xed\xdf\x11\x7e\xf6\x17\xf9\xd7\xac\x4f\x27\xdd\x91\x59\xcb\xd7" + "\x6b\xd6\x21\x6e\x3b\xca\xd6\x69\xa9\x45\xff\xef\x15\xae\x1b\x5e" + "\xd4\x51\x5a\xc3\xe3\x90\x7d\x24\xa8\x9d\x43\x6d\x11\xbe\xa3\xde" + "\xd6\x36\x08\x9d\xaa\x6d\xb0\x17\x19\xa0\xaf\x4f\xa7\xec\x2b\xca" + "\x52\xd3\x78\x01\xf1\xc2\x5a\xeb\x02\xa1\x3f\xb5\x05\xa8\x77\x7a" + "\x7f\x7c\x12\x2e\xe2\xa9\x9a\xe8\x60\x45\x3a\x25\xe9\x37\xe9\x2b" + "\xeb\x33\xa0\x2f\x5c\x3b\x89\x15\x19\x94\x61\xce\xe0\xba\x52\x39" + "\xa3\xe8\x9e\x49\xba\x7b\x94\xec\x95\x38\xe7\x7f\xbf\xe7\x05\x31" + "\x36\x20\xe5\xbb\x5f\xc1\x94\x07\x78\xbb\xb2\x87\xb7\x2b\x0c\xc4" + "\xb9\xe9\xfb\xf5\x7c\x3d\x6d\xc1\x01\x7e\xd7\xac\xb4\x4f\xdb\xde" + "\x52\xe0\xe6\xf7\xda\x95\x9a\xc8\x4f\x73\xd3\xfc\x11\xdf\x87\xdc" + "\x6c\x72\xc3\x7c\x17\xe9\xe4\xfe\x4c\x3a\x33\x5e\xdc\x41\xbe\x7f" + "\x89\x7c\x4e\x3c\xdd\x5d\x49\xf7\xae\x62\xb9\x54\xbe\x7b\x53\xeb" + "\xe8\x4c\x68\x10\xfd\x71\x1d\xec\x41\x9f\x5e\xc8\x60\xff\xeb\x74" + "\x6f\x9f\xe8\x2b\x74\xa2\x5c\x54\xff\xea\x84\xfd\x1f\x8b\xb9\x64" + "\xd9\x4e\xd4\xdd\x4d\x6b\xd4\x6d\x12\x0e\xcc\x0b\xdb\xff\x57\x6c" + "\x22\x2f\xc4\xe7\x94\xe5\xb9\xff\xf5\x81\xe3\x1b\x3e\x7c\x36\xd8" + "\x7f\x50\xf2\x0b\x40\x8c\x81\x7d\x86\xb8\xea\xe2\xe4\x31\x30\x9f" + "\xef\x53\x67\x90\xc7\xc0\xc4\x19\xd4\xb5\xbd\x94\x7f\xb8\x31\x22" + "\x56\xfa\x28\xf0\x31\x2b\xf4\xe1\xc2\xfa\x13\xd8\xbe\x13\xed\xb2" + "\x5f\x28\xe4\x53\xf7\x29\xf9\x87\x74\xd7\xab\xec\x4b\x0a\x1f\xa0" + "\xee\x84\x68\xcb\xea\x8e\xc8\x6d\x19\xa6\x3d\x2a\xd9\x0a\xa9\x9d" + "\xab\xeb\xef\xff\x86\x5e\x9f\x5f\xd7\x2b\xf3\x48\xe6\xb9\xe0\x51" + "\xfd\xcc\xbe\xd8\xd4\xe5\x3e\xde\xd6\xf3\xb3\x9d\xfc\xe2\xb7\xf8" + "\xf1\x9e\xbe\x4b\x84\xdd\xac\xc7\xf6\xbf\xf6\xb0\x68\x53\xea\xa5" + "\x73\x4b\x36\x2f\xe6\xf7\xc5\x73\x1e\xac\xe6\x63\x33\xf6\x52\x03" + "\xd2\x56\x6f\xb4\x29\xee\x32\x0b\x5b\x56\x8f\xed\x5f\x5d\x8e\x94" + "\x4e\x4b\xb4\xf8\xd3\xbb\x70\xdd\x9a\x75\xf9\x1b\xd7\xd1\x80\xda" + "\xfa\x22\xfd\x8a\xfc\x9c\xdc\x21\x21\xc6\x43\x74\x74\x9f\xb6\xa3" + "\xba\xff\xfc\xa9\x57\xcb\x68\x3d\xbd\xb8\xbb\xe0\xd5\x6d\xfa\xdb" + "\x49\xbf\xea\xbf\xa2\xb1\x02\x7e\x87\x04\x9d\xb5\x2a\xc6\x0d\x7a" + "\x28\xbd\xe0\xf5\xab\x6b\xfb\x36\x1a\x25\x1f\xeb\xd5\xd1\xc4\x47" + "\xa9\xcf\xc1\xba\xa1\x21\x5b\x6e\x87\x88\x3e\xee\x9b\x5f\x36\x70" + "\xbb\xe8\xbd\x6c\x54\x73\x7e\x5d\x36\x60\x7b\xd3\x90\x66\x53\xdc" + "\xb9\x40\x94\xab\x61\xb6\xcc\x0f\x2a\xbf\x93\xee\xf4\x64\xab\x51" + "\x47\x5f\x2d\x93\x70\x91\xfd\x24\xdc\x71\xf2\x7a\x6e\x3a\x53\xb4" + "\x69\x03\x9d\x27\x7c\x60\x8e\xb7\x92\xec\x4d\x43\x85\x6c\x97\xa8" + "\x2d\xf2\x22\x9e\x77\x2f\xda\x23\xb0\xde\x4c\xc7\xb4\xd7\x77\xc2" + "\x81\xd3\xe2\xde\x81\x86\x63\x81\xf7\x0e\x1c\x40\x6f\xf4\xc0\x69" + "\xe9\xe7\xf6\x7b\xbf\xd2\x4f\x4e\xd3\xea\x17\xa6\x0b\x82\xc1\x72" + "\x1d\x48\xe8\xf7\x57\xc4\xb9\xa6\xd2\x39\xc8\x74\x87\xc6\x81\x6c" + "\x3a\x3b\xd4\xa7\x1b\x0d\x3b\x25\x1f\xa4\x87\x78\x47\xed\x2d\xc2" + "\x88\xbd\xac\x55\xa8\x1b\x2c\x0b\xa8\x4c\xcc\xb9\x1a\x75\xe2\x40" + "\x89\x4f\x0f\x04\x8f\x30\xac\xc2\xe7\xa7\x1c\xc8\xa1\x34\xfe\x7c" + "\xc0\x3c\xa6\x8b\xbe\xe9\x81\x46\xb9\xcd\xa6\x73\x53\xc5\x3d\x14" + "\x07\x12\x8e\x6e\xed\xc1\x3e\xff\x81\x53\x7e\x38\x12\xa4\xb1\x08" + "\x35\x53\xd6\xef\xaa\xe7\x7d\xb6\x03\x0e\xdf\x98\xc0\x81\x04\xb2" + "\xbb\x1c\x47\xec\xe6\xe5\x56\x07\xbf\xab\x5a\x21\xdf\x4d\xef\xb4" + "\xbc\xaa\x97\x7d\x14\x19\x57\x8b\x18\x73\xe2\x67\x5d\x62\x1d\xac" + "\x40\x98\xf4\xfe\xf1\x58\x0c\xeb\xef\x03\x9a\xb1\x1e\x73\xdf\xfb" + "\xd5\x1c\x5f\x5f\xaf\x81\xef\xab\xe6\xfd\x40\x81\x07\xfd\xae\x57" + "\xb3\x82\xfb\x6d\xe8\x3f\xe8\x57\xaf\x5b\x8d\xee\xc3\xaa\x82\xfc" + "\x54\xec\x3a\xac\x2a\x58\x9d\x4a\x4b\xbf\xe6\xa4\xcf\xe2\x4f\xac" + "\x1c\xa9\x21\xc6\x8f\x69\xdc\x9b\xdf\x07\x4d\x63\x46\xd8\xcf\xa5" + "\xb1\x53\xa7\xb8\x57\x35\x52\x7a\x6a\xa4\xe7\x20\x6c\xf7\x96\x77" + "\xc3\x6b\x11\x74\x07\x8e\x0d\x5e\xd3\x79\x2d\xe2\x3e\x59\xa9\xcd" + "\x46\x5b\xfe\xaa\x47\x9e\x37\xe3\x6b\xe1\xe9\x3c\xc3\x3e\x23\x1f" + "\x8f\x73\x5a\x5e\xeb\x1f\xff\x10\xe3\x8b\x62\xee\x0d\xc3\x33\xe5" + "\x70\x79\x3c\x16\xc3\x72\xe4\xb1\x57\x01\xfb\x9a\xc9\x97\x36\x60" + "\x6c\x3b\x4e\x9e\x97\x43\x98\x1a\x99\x67\x32\x9e\x52\x3d\x3b\x27" + "\xf9\x49\x2a\xee\x57\x5b\x5e\xdd\xcd\xcf\x10\x25\x5f\x9c\x8f\x33" + "\xbf\x76\x42\xce\x87\xfa\x08\x44\xb7\x34\x07\xc4\xeb\x3d\x9d\x15" + "\x2a\xce\x1a\x7d\xad\x5f\xfe\x41\x3c\x37\xdc\x35\x9a\x8f\xcb\x1b" + "\x8a\xd0\x3f\x1b\x1d\x34\x0e\x47\x3a\x34\xbe\x1a\x06\xf3\x31\x26" + "\xd1\x4f\x8f\x20\x1f\x01\xcb\x70\x00\xe5\xa9\x22\x5b\x2e\xda\xbd" + "\x83\x0b\xfa\xdb\x78\xed\xe6\x2c\x16\x9b\xba\x84\xce\x9b\x17\xfb" + "\x17\x0e\x3e\x45\xfa\x66\xbf\x61\x8d\x93\xd1\x5a\xe5\x7d\x8b\x9d" + "\x62\x1c\xfe\xe0\x3b\xbe\x31\xb3\x83\x20\x9d\x8d\x4a\xeb\xe0\x50" + "\x5e\x07\xfb\xd7\x7f\x10\x3c\xf7\xbd\x10\x27\xed\x55\xa0\xfc\x7f" + "\xc0\x7c\x0f\xf6\xfb\x1b\x5c\xa2\x9e\xbe\x3e\x89\xe3\x40\x5b\x2d" + "\xf6\x03\xbc\x8e\x7a\x78\x30\x4e\xb4\x0d\x84\x3b\x0b\xfa\x62\x1b" + "\x6c\x7d\x96\xb6\x64\xe2\xa1\x23\xf6\x23\xbd\x38\x8b\xf8\xf5\x7b" + "\x1c\x16\x35\xca\xf4\x75\x94\xff\xdb\x61\xe7\xb5\x2e\x6f\x60\x2d" + "\xee\x8b\xac\x71\xcf\xdf\xd1\xce\xad\x04\x70\x6f\x60\x47\x2e\x5f" + "\x64\x47\xf9\xdd\xe7\x4f\x00\x3c\xff\x4f\x00\x8f\x6a\xf1\xd7\x97" + "\x50\x57\xe7\x5e\xf0\x9e\xa3\x3b\x03\xeb\x11\x6e\xae\xe3\x3c\xab" + "\xc3\x34\x73\x0b\xd8\xb9\x3a\x84\x9b\x73\xf6\x1c\xdb\x8f\xb0\x73" + "\x8c\xa8\x2b\x1b\x98\xdb\xa3\x5a\xf3\xb5\x7e\x11\xd9\xee\xd7\x8f" + "\xd9\x2b\xd3\x77\x31\x8b\xb2\x9c\x6d\x1f\x3b\x06\xe9\x69\xed\xbf" + "\xaf\x0c\xf1\x92\x5e\xd1\x3d\xa5\xe8\x1f\x7e\x8d\x7a\xf0\xf5\x32" + "\xf4\x3b\x50\x6f\xbf\x46\x38\xbb\x0d\x9e\xe3\x36\xc7\xae\x1a\x13" + "\x8b\xbf\x90\x67\x46\x23\xad\x2d\x9e\x0d\xac\xb1\x7c\x29\xd2\x7f" + "\x06\xe9\xbf\xc8\x8e\x60\x19\x8e\xee\xe9\x06\x20\xfa\x3d\x84\xd3" + "\x43\xf7\x25\x2a\x62\xea\x31\x7e\x99\x59\x0b\xf5\x08\xbb\xd4\x01" + "\x31\x75\x08\xb3\xf4\xa9\x18\xe0\xf4\xf7\x22\xdd\x31\xe9\xbb\x3c" + "\x98\x37\xd1\xef\xb4\xbc\x51\x20\xd3\x29\xe7\x4f\xf4\xca\xf5\x76" + "\x19\x8d\x11\xc6\xa6\x1e\x24\xba\xc5\xbc\xc7\x1b\xff\x61\x2f\x42" + "\x39\xab\xc6\x8e\x11\x7d\xec\x37\x8e\xc8\xf4\x07\xce\x83\xbd\xe1" + "\x12\xf6\xf3\x0d\xec\xff\x1c\x94\xce\x83\x17\x61\x54\x7e\x3b\xd6" + "\x5b\x69\x0f\xe0\xd7\x32\xcf\x30\xfe\x60\xf0\x3c\x57\x66\x7e\x21" + "\x1f\xa3\xce\x5e\x61\x5a\xbd\x21\x1b\x7b\xbe\x43\xa0\x80\x82\x78" + "\xdf\x38\x37\x47\x9f\xbf\x4e\xbf\x32\x7b\x75\x5e\xfe\x86\xdc\xc2" + "\x44\x3e\x9c\x51\x94\xbb\x2e\x87\x86\xae\x0b\xb3\x0b\x0b\x86\x04" + "\xf5\x67\x2a\xd2\x77\xb5\xd3\x5d\x34\x5b\x49\xbf\xdf\x9a\x2e\x8d" + "\xdb\xba\x98\x25\x8d\xf7\x8b\x85\x8d\xf9\xe5\x3b\xfa\xe2\x34\x8a" + "\xbf\x5b\xb4\xe3\x6f\xa5\xb1\xaa\xd4\xd7\x19\xe3\x77\x78\x2b\xce" + "\xc1\x5b\x49\x9c\x1f\x7d\x19\x32\x1e\xde\x77\x25\x9d\x2d\x28\x26" + "\x3f\xec\x97\xa7\x18\xc5\x07\xf0\xe2\xad\x08\xe1\x8b\x60\xf8\xe5" + "\x0c\xf0\xad\xbb\x7f\x6b\x3a\x53\x62\xd9\x91\x97\x52\x9f\xc1\x28" + "\xed\x7f\xfc\x43\x27\xbc\x49\x7d\x29\x9a\xb7\x39\xc9\x7d\x72\xbe" + "\x4f\xeb\xcd\x2f\xb1\xcf\x61\x64\x96\x41\x51\xc4\xaf\x3d\xa2\x4f" + "\xaf\x8c\x56\xd0\x3d\xbb\x9d\xb4\x67\x34\x99\xe6\x79\xeb\x2d\xde" + "\x64\xdf\x3a\xa7\x5f\xaa\xa9\x7f\xc1\xe7\x39\xb8\x4d\x3a\xb4\x5c" + "\xae\xbb\x4a\xda\x87\xb3\xfd\xa6\xc9\xa2\xfe\x1d\xca\x25\x78\x94" + "\xff\x64\x51\x3e\x7e\xdf\x38\xfa\x06\x6f\x6e\xc1\xf2\xbf\xc1\x4a" + "\x33\xa4\x39\xc9\x37\xb7\x78\x63\x3f\xd6\x7b\x8a\xb0\x5f\xa0\xfd" + "\xb8\x01\xe3\x7e\xef\xad\x4a\xfd\x95\x07\x7d\x2a\x2f\xf6\x13\x58" + "\xd5\xc7\xaf\x79\xaa\x52\x0f\x79\x37\x1a\x94\xd4\xb6\x96\x9a\x91" + "\xbf\xf9\xc6\x21\xec\xbc\xf1\x1a\xcf\x46\x03\xfa\x5f\xa9\x47\x18" + "\xc3\xb4\xb1\xa9\x4d\xfc\x6e\xe3\xaa\xd4\xf7\xa4\xef\xcf\xe8\xdb" + "\x8b\x7e\x32\x86\xb5\xe2\xf7\x9f\xbc\xcc\x0f\x3e\x10\xf6\x04\x7d" + "\x47\x2b\xf8\xfa\xca\x64\xec\x97\xa4\x50\xd9\xe5\x32\xf3\xfe\x19" + "\x8d\x11\xf5\x97\xed\x4d\xb3\x1c\x4e\xfd\x06\xe1\xc3\xc3\x0a\xe4" + "\xf1\x6e\xa1\x8f\xfd\x70\x0f\xc9\x3c\x10\x77\x79\xa7\x1e\xb4\xa1" + "\x7c\xbd\x74\x07\xfb\xf6\x9b\xc7\x30\xe5\x2f\x6f\x20\x9b\x35\xcf" + "\xc3\x6d\x21\x88\x79\xa7\x37\x8f\xc8\xfc\xa4\xfd\x04\x64\x4b\x51" + "\x6e\x86\x65\x76\x18\x22\xec\xc0\x9b\x27\xfd\xfa\x87\xbd\x24\x6b" + "\x1b\xbc\xc9\xcf\x59\x62\x4a\xcd\x76\xf1\x7d\x48\x2f\xea\xca\x9b" + "\x6e\x19\x16\xc3\xc4\x79\x27\x15\x53\x77\x6c\x74\xc3\x4d\x05\x53" + "\x59\x37\xea\xe6\x49\x01\xf7\x56\x82\xaf\x4e\x09\x7d\xc3\xe7\x11" + "\xea\x5f\xd3\xfc\x23\xbd\xd7\x85\xd9\x13\xbb\xb5\x96\x31\x6a\xaf" + "\xa8\xfd\xd4\xdf\x04\xfc\x0e\x5d\xd4\xc3\xb2\xe6\x5a\x07\x70\x39" + "\xc7\xa6\xbe\xde\x47\x77\xa5\xa3\x2d\x0f\x95\x9e\xd2\x20\xfc\x31" + "\xde\x4f\xc2\x7a\xe1\xc5\x7a\x81\x69\xde\x20\xbd\xde\x7a\x81\xfa" + "\x2f\x6f\xb9\x5b\x4a\x7a\xe8\xcc\x7e\xd4\xd7\xb7\xdc\xc4\x43\xaa" + "\x07\x7b\x2c\x7c\x3f\x24\x6f\x27\x9b\x36\x4c\x24\x1c\x5f\x0f\x73" + "\x81\xba\x1d\x2d\x02\xca\x85\xd6\xbb\xc5\x9c\x41\x78\xb5\x09\x34" + "\xd4\x87\x0d\x6c\x43\x42\xb7\x1f\x7d\xda\x8c\x9a\xbe\xaa\x8c\x02" + "\xa7\xe5\xed\x89\x36\x38\x1c\xb6\x9f\xb1\xfd\x7a\xf4\x6b\x10\xae" + "\xe2\x26\x9a\xab\x7e\x7b\xf9\x95\x60\xe5\x3d\xba\xa4\x2b\xe3\x75" + "\x34\x9e\x92\x51\xc3\xe7\xbc\x63\x33\x0a\xc4\xb8\xe5\xdb\x0d\x72" + "\x7a\x1a\xf7\xa4\xf5\x05\xe5\x97\x40\x57\xde\xdf\x57\x7c\xbb\x55" + "\xc8\xe8\xed\x56\xb9\x7f\x11\x2a\x1f\xd3\x41\xe6\x2d\x1d\x05\x4a" + "\xab\xde\x0e\xe3\x5c\x10\x55\xf7\x32\x40\x45\x31\x73\xbd\x50\x8c" + "\x7a\x84\x3c\x66\xca\xb7\xd3\x68\x1d\x46\x3d\xb6\xd1\x7b\xbc\x00" + "\x2a\xa4\xe5\x85\x8b\x98\xe7\x56\x01\xc7\xc4\xf9\x6a\x3a\x84\xcb" + "\xc3\x67\x1c\xda\x11\xa8\xde\x0a\x9a\x6a\x2f\xa8\x2b\xb6\x42\x3c" + "\x86\xa1\x5f\x71\x78\xb6\xdc\x17\x08\x39\x2f\x5c\x87\xf6\x11\xf3" + "\xdd\xb6\x95\xb9\x3f\xc3\xde\x92\xc5\xcb\x5c\xdf\x87\xef\x58\xfe" + "\xc3\xa2\x8c\x87\x0f\xcb\x7d\x03\x7c\x6f\x0c\xdc\x6b\x7d\xb8\x21" + "\x78\x8e\xf9\x89\xfc\x7c\xd3\xb2\xc2\x5c\x7a\x18\x46\xad\x1f\x1d" + "\xec\x2b\x46\x89\x7b\xa9\x0e\x9f\xa4\xba\x45\xfe\x93\xd8\xb3\xf4" + "\x8e\xd6\x6f\xbc\x87\xc6\x9c\xa7\x91\xdf\x47\x6b\x4e\x30\x2e\xf1" + "\xd3\x92\x2d\xbc\xbf\xf1\xa5\x06\x94\xc1\xf9\xad\xcc\x36\x65\xe7" + "\x4d\x16\xcb\x1a\x06\xe6\xf3\x4e\x5a\x50\x3e\xfd\xf3\xbf\x52\xdf" + "\xdc\xc1\xed\x63\xe5\xc7\x15\x2c\xe6\xd5\x64\xd1\xd6\xbd\x53\x2b" + "\xaf\x21\x0c\x7d\xb6\xcb\xd4\x78\x4f\x55\xc9\x11\xaa\x23\xa5\x5b" + "\x40\xf9\x9b\xe2\x0e\x25\xf5\x4b\xb6\xe2\x3b\xad\xe9\xe2\xe3\xdf" + "\xd2\x9d\x91\xbf\xff\xb6\x03\xdb\xd2\x77\xec\xac\x72\x6a\x3c\xd6" + "\xf9\x9e\x70\xeb\xb8\xfc\xf7\xc5\x8b\xb9\xfb\x5f\x69\xae\xb0\xe6" + "\x8b\xc3\xcb\xeb\x34\x82\xd2\x6d\x11\x32\xfb\x15\xea\xff\xdb\x3a" + "\x59\x7f\x65\x98\xf2\xeb\xe5\xbb\x38\x7f\xb5\x20\x1c\x7e\x56\x91" + "\xd1\x20\x74\xfc\x57\x1f\xf3\x39\xea\x9b\xe0\x99\x4e\xf8\xd5\x47" + "\x6a\x1d\xe8\xf0\xfd\x97\xf8\xce\xc7\x30\x28\x2e\x40\x8f\x6e\xe9" + "\x6d\x50\xa3\xc5\x41\xcb\xa3\x60\xe2\x0f\x1d\x3f\xf1\xa7\xc2\x9f" + "\x92\x29\xf8\xee\x15\x15\x4a\x30\x72\x90\x1a\xa2\x87\x45\x69\x6e" + "\x1d\x1e\xaf\x9b\x36\x35\x65\x52\xe9\xd6\x12\x33\xf3\xba\x5d\xd1" + "\xcc\xff\xfe\xd4\x03\x1d\x0b\x47\x97\x09\xff\xa1\xf2\x40\xc8\x3d" + "\x6f\xcf\x5b\x58\x01\xf5\x69\xbd\xb1\x1f\x41\xe9\x7a\x50\xbe\x7b" + "\xc9\xa6\xa4\x3e\x14\xf9\x30\x74\xc7\x7b\x27\xbc\x3b\xeb\x13\x0c" + "\x43\x7e\x99\x59\xc5\x47\x20\xf6\x26\xbd\xfb\xac\xb7\xea\x23\xf0" + "\xe1\x57\x03\xe1\xc7\x7e\xba\xf2\xe0\xd6\x1e\xa5\x55\x3d\x15\xac" + "\x7a\x07\x7c\x82\xef\x21\x65\x85\x79\xd2\x98\x30\xe1\xc0\x36\x78" + "\x57\xe9\x77\xd8\x36\x9b\xf9\xfc\x8c\xf2\x1c\xbc\xfb\xe9\x91\x30" + "\xe9\xf8\x1c\x6b\x6c\xfa\x58\xa7\xe5\x5d\xb4\xe7\x4f\x54\x4b\xfd" + "\x10\xec\x27\x1d\x89\x92\xdb\x03\x8c\x1f\x23\xe6\x89\x8e\xe8\x65" + "\x98\x90\x32\xfa\x05\xad\x79\x66\x4d\xa4\x07\xec\x62\x4f\x0f\x9d" + "\xc1\x18\x6e\x2c\x8e\xd6\xdc\x17\xe9\x98\x97\xed\x5b\xe3\xd8\x5a" + "\xc3\x5c\x5b\xe3\x59\x4f\x69\x3c\x5f\x2b\x43\xfd\x0a\x6d\xdf\x0d" + "\x6b\xbe\xe9\xdb\xb7\xa6\xcf\xbb\x6f\xcd\xb7\xec\x86\x35\x17\xbc" + "\x37\xac\xb9\x28\xc6\x0c\x21\xda\xb9\x6f\x8d\x1d\xe9\x99\x81\x74" + "\x9e\xa3\x79\x48\xec\x67\x60\x7f\xee\xc8\x31\xb9\x9f\x11\xd0\x8f" + "\xc9\x31\x2d\xa3\x45\x05\xd9\x6b\x17\x27\x3f\x2e\x5d\xcb\xf1\xd4" + "\xfa\xec\x35\xb9\xcb\xb0\x87\xb3\x4c\x5a\x7d\x44\xc3\xcf\xe8\xcc" + "\x11\x2c\xcd\x78\x4c\xd6\x6f\xcc\x2d\x2c\x4c\xca\x5f\x37\x59\x4f" + "\x97\x79\xf0\x70\xb1\x8f\xc9\x98\x9d\xc3\x5d\xbe\xdc\x01\xe3\xd5" + "\x54\x16\xba\x3b\x12\xcb\xf3\xad\x7f\x19\x24\x9a\x6f\xe5\x34\x23" + "\xbd\x44\xb7\x44\x33\xf6\xdb\x7f\xdd\x3f\xfe\xe9\x1b\x33\xf8\xb5" + "\x8b\xda\x71\x19\x07\xa5\xc7\x74\xe7\xfd\xd2\x61\x59\x7f\x7d\xc8" + "\x7f\xdc\x54\x8c\x5d\xbe\x97\xc9\xc7\x4c\xf7\x2d\xb6\xd3\x3d\x3a" + "\xe8\x0f\x2a\xce\xc0\x7b\xdc\x6f\xa2\x3e\x1f\xe7\xb9\x5b\xbe\x6f" + "\xe2\x48\x2b\xad\x41\x11\xb4\xfd\xda\xe1\xe7\x93\xa1\xcc\xdf\x5b" + "\x42\x63\x79\xbd\xf0\xde\xdd\x08\xf7\x0d\xe2\x73\x78\xf7\x2d\xee" + "\xc3\xfe\x19\xca\x60\xf1\x45\x3a\x47\x84\xf6\x9e\xd0\xdd\x0e\xed" + "\x0e\x3b\xbf\x27\x8f\xa7\xc1\x5e\x2c\xd1\x2c\x70\xbe\x97\xe1\x1b" + "\x53\x78\x4f\x23\xd3\x65\x83\x5f\x9f\x24\x5a\xfc\xe5\x33\x2b\x7d" + "\x41\xd2\xba\xfc\xa4\x15\xeb\x4d\x49\x26\x63\x61\xfe\xfa\x55\xc6" + "\x00\x7b\x99\xe1\xae\x9a\x72\x37\xfb\x57\x16\x0c\xdb\xa6\x1d\x14" + "\xad\x48\x5e\xdb\xb6\x83\xd6\xa4\x5e\x07\xd1\xe6\xc7\x69\x8c\x10" + "\xf6\xef\x65\x27\x69\x6c\x82\xe6\xc8\xa3\xb7\x25\xaf\x8e\xda\x96" + "\x9c\xed\xb5\xa4\xdc\x45\x7b\xa0\xa2\xdd\xb3\x14\x51\x5d\xd3\x15" + "\x1e\xcb\xc4\xbb\xc8\x27\xab\x45\x1b\x5e\x71\x3d\xeb\xc0\x34\xa7" + "\x31\x8d\x0d\x7f\x5d\x98\xee\x44\x37\xfc\x66\x30\x3e\x5b\xa3\xb7" + "\xb1\xfa\x68\x37\xf3\x26\x96\x61\xff\x0b\xf1\xd2\xde\x0f\x16\x3b" + "\x25\x99\xfa\x7f\xe3\xdd\x10\xe1\x1b\xab\xfd\x4d\x22\xd6\xb5\x41" + "\x73\x76\xb2\x4f\x10\x57\xab\xf7\xa2\xb7\x95\xee\x3d\x96\xe6\x2c" + "\x4e\xed\xc6\xdf\xb8\x6a\xa0\xbb\xee\xa1\xe4\x2b\x50\xb6\x77\xf5" + "\xd0\x3e\x92\x26\xcc\xaf\x05\xe1\x8f\xe1\xaf\x51\xbf\x0e\x54\xe7" + "\xe0\x37\x5b\xe4\xb5\x79\xc2\xff\x7f\x9f\xfb\xc1\x98\xbe\x89\xf6" + "\x85\x6c\x59\x8b\xb6\xa3\xdb\xae\x24\xfc\x18\xd6\x6a\x35\xf6\x80" + "\xd5\x7d\x82\xf6\xee\xd0\x18\x0d\xc1\x18\xdc\x18\x47\xe3\x34\x5e" + "\xa6\x53\xa2\x1d\x3d\x81\xed\x54\x23\xad\xf9\x6c\x2f\xe9\x80\xf6" + "\x82\x56\xf0\xf6\x19\x12\x38\x3e\xa4\x07\xd3\x9c\x7a\x77\xa5\x4b" + "\x49\xfa\x82\x70\x27\xc9\x1f\xa2\xb3\x1e\x58\x91\xe1\x76\x84\x69" + "\xc1\xf8\x93\xec\x5f\x3a\x25\xad\xab\x3c\x07\x47\x77\xb2\x3e\x83" + "\x61\x7c\xaf\xb8\xff\xb6\x13\x8e\x2e\x41\x5a\x7f\xee\x47\xeb\x42" + "\x2c\x03\xea\x12\x34\x61\xbe\xc7\x88\x8e\x76\x63\x2b\xb4\xbb\x30" + "\x5f\x47\x2b\xad\x1b\x4e\x60\x1b\x75\x6a\x5a\x47\xcc\x36\x1a\xd4" + "\xe5\xdf\x82\x1a\x6d\x66\x53\x3d\x3e\xb1\xfc\x47\xb1\xff\x17\xef" + "\xb4\x1c\x2d\x90\xcf\x0b\xa1\xfe\x06\x7e\x97\xc9\x36\xe7\x79\x84" + "\x41\x7a\x1a\x09\xf7\xd0\x5e\xa0\x31\xa8\x08\xb4\x67\x11\x98\x67" + "\x24\xf2\xb1\x11\x79\x97\x8d\x32\x3b\x46\xbc\x46\xfe\xf4\x78\x11" + "\x5f\xf9\x45\xa4\xa7\x48\xa7\x8e\xea\x02\xc5\x3c\xb7\x93\x21\xcf" + "\x4f\xcd\x33\x3b\x19\xed\x2f\xa0\xb5\xfa\x98\x26\x15\xcb\xaa\x16" + "\x6b\x1e\x8e\xf6\xca\x79\x79\x48\xc7\xce\x67\x49\xe3\xbb\xef\x3f" + "\x4f\x6b\x28\x7d\xeb\x20\xdf\xdf\x8d\xdf\x3f\xf3\xff\x26\x3d\xf7" + "\x5a\xde\x33\xd6\x71\x5d\x7f\x7f\x22\xea\xfa\x12\xa9\xfe\x20\x6e" + "\xb5\xba\xcf\xb2\x9c\xc2\x67\xa3\x7f\xb2\x40\xd4\x81\xf7\xb9\xaf" + "\xdf\x0d\x47\x0d\xe2\xae\xe0\xa3\x89\xd2\xb8\xe0\x29\x81\xf3\x37" + "\x5b\x48\xd6\xc4\x43\xd4\xf3\xa7\xad\x3d\xad\x5c\xc7\x6d\xf0\x9b" + "\x86\x3a\xf4\xa9\xc2\xd8\x7b\x97\x15\xdb\x3a\xef\x45\xd6\x43\x7d" + "\x69\xb1\xe6\xf1\xfd\xa6\x65\x66\x55\x1a\xf6\x9b\x95\xc8\x0b\xaa" + "\xa3\xd7\x63\x7f\x61\x1a\xad\x8d\x45\x1e\x10\x4d\xb6\x2b\xdd\xcb" + "\x8d\x32\x40\x1f\xf5\x03\x35\xd2\xcb\xef\xa5\xa2\x7b\x8b\xc5\x78" + "\xff\x07\x3a\xf9\x6c\x18\x76\x91\x95\x90\x1f\x88\xf9\x96\xed\xd8" + "\xc0\xf3\xa0\xbb\x9a\x7b\x4c\x7a\xf6\x65\x8b\xde\x1e\xd6\xde\xfb" + "\xad\xe5\xb4\x4b\xf7\x3f\xf2\x75\x2d\x81\x6b\x39\x3f\x28\xf3\x1b" + "\x3b\xa4\xb5\x2d\x65\xb4\x7e\x47\x9c\xe1\xf5\x01\x3f\xeb\x6b\x9e" + "\x59\x9c\x55\x64\x75\xf5\x4a\x7d\xe0\x0f\xda\xf8\x9d\x70\xd4\xbf" + "\xe2\xeb\x3f\xcf\x48\x6b\x36\x3f\xc8\xa5\x3c\x5a\x82\xee\x9d\xcf" + "\x5d\x97\xfd\x44\x5e\xae\x18\x4e\x4f\x7a\xd2\x94\xbd\x2a\xb0\x9f" + "\xce\xed\x2e\xb3\x7c\xd0\x21\xec\xd8\x87\x5a\x3f\xdb\xa8\xee\x9f" + "\x5f\x50\xc2\x51\x31\xc7\xf0\x61\x72\xa8\x39\x86\x59\xab\xd6\xe5" + "\x17\xf2\x3c\xf8\xf2\xd6\x5c\xb1\x53\x75\x08\x2c\x4c\x9f\x95\x9e" + "\x54\x94\x6b\xe2\x17\x3d\x89\x01\xfd\xec\x9c\x9c\x42\x69\xf1\xeb" + "\x6a\x4a\x45\x31\x2b\x37\xf2\xa4\x05\x6b\x4c\x62\xd9\x6c\x51\x5e" + "\xf6\x86\x5c\x09\x85\x3f\xad\xf1\xd4\x76\xb7\xd4\xf2\xf6\x61\x88" + "\x58\xab\xf3\x61\x93\xdf\xdc\xbe\xff\x58\xe2\x8d\x18\x77\x5a\x8e" + "\x2b\x18\x49\xba\xd2\xb8\xb6\xbd\x81\xdb\x2c\x75\xf3\xab\xc4\xdf" + "\xc6\x59\x74\x37\x09\xfa\x59\x4d\x74\x97\xb6\xb4\x0e\x06\x7d\x87" + "\xc6\x51\xd8\xef\x6f\x42\xfe\x9a\xe7\x79\xbc\x0c\xdb\x77\xb3\x0d" + "\x8e\xe9\xa4\xf1\x39\x8d\x57\xf9\x61\x0a\xad\x61\xac\xe3\x63\xc9" + "\x8d\x69\x3e\xbb\x7f\x4c\x47\x3e\x2c\xd9\x58\xa2\x8d\xe8\xc4\xf8" + "\xe5\x7e\xeb\xc7\xba\x6c\xf0\x21\x1f\x93\xa1\x75\x4e\xfc\xde\x20" + "\xb4\x47\xd2\x19\x25\xca\xf6\x57\xc9\x27\xfa\xed\x2e\x5a\x1f\xe6" + "\xad\xc8\x68\x14\x6d\xdc\x47\x07\x58\x55\xfa\xe4\xf1\x0e\x88\x13" + "\x36\xa9\xf1\x2c\x86\x5f\x8b\x34\xb6\x62\xf8\x94\x77\xb7\xf6\x44" + "\x90\x9f\x2e\xe6\x4b\x1b\xcf\x4a\x63\xcb\xc4\x9f\x08\x3f\x1a\xba" + "\x7c\xe3\xcf\xc7\x74\xf6\x98\x8c\xc6\x1d\x62\x7d\x18\x5f\x0b\x23" + "\xd6\x23\x7d\xa4\xe9\x1f\x6f\xc5\xbc\xa5\xf5\x1f\x71\xdd\x08\x8f" + "\xbc\x68\x94\xd6\x64\x50\xd9\x17\x50\xb9\xc5\xba\xde\x8f\x52\xfc" + "\xfb\xe2\xe2\x9e\x96\xf4\xc9\x5e\xb1\x86\x9b\x68\x5f\xcd\x7d\x7a" + "\x1a\xeb\xbe\x44\xfc\xfe\x08\x6d\x7f\xfa\x3d\x98\x0e\x5b\xce\x0f" + "\x7a\x65\x7a\x88\x66\x93\x19\x1d\x53\x4c\x47\x7e\x58\x1f\x6f\xef" + "\x3f\xaa\xf1\xd1\xfc\x91\xe8\xbf\x33\xd9\x5e\xfd\x36\x4a\xcc\x39" + "\x64\xb4\xfa\xc9\x4d\x7d\x0e\x3e\x3a\x8b\xb4\xb6\x6e\x17\xeb\xb0" + "\x22\xe4\xf5\x4d\x88\x2b\xa0\xfc\xbe\xf9\x80\x0f\x0b\xc5\x7c\xc0" + "\x6f\xd5\x3e\x19\x7e\xd4\x4a\x7a\x4f\x6b\xd8\xe4\xf5\x6b\x24\x4f" + "\x71\x87\xcd\x6f\x13\x65\x3c\xde\xd8\x8c\x43\x34\x66\xb3\x47\xac" + "\xc5\x40\xb9\xfc\x76\xad\x4a\xf1\x25\xf7\xeb\xc7\xbb\x80\xfc\xf6" + "\x41\x18\x96\x4d\x70\x94\x27\x1f\x37\x47\xde\x50\x59\xbc\xd8\xdf" + "\x57\xe9\x06\xcd\x46\x7c\x25\x68\x8f\x67\xfb\x74\xe3\xb7\xe9\x7c" + "\x1d\x98\xc4\x6b\x66\xf9\xf0\x19\xdf\x38\xd2\x6f\x0f\xf5\x8f\x01" + "\x23\x1e\x5f\x9b\xf4\xdb\x36\xe2\x71\x79\xff\x78\xd8\x31\xe0\x74" + "\x88\xb9\xfd\xcf\xba\xe1\x77\xdf\xb0\xd8\xf4\x7b\xa8\x3d\xa7\xb1" + "\x0a\x92\x3d\xef\x7b\xf0\xb1\xdc\xdf\xbd\x59\x27\xe6\xcf\xf6\xe2" + "\xfb\x3b\x5e\x65\x28\xdd\xf9\x9d\xde\x7f\xad\xb9\xe0\xff\xef\x8c" + "\x5e\xc2\x89\xe5\x27\x5c\xd8\xc6\x29\xe4\x31\x76\x09\xef\xa3\x88" + "\x73\x5f\xb7\xc4\x6b\x3e\xaf\x5c\x25\xf1\x81\x64\xcc\x79\xfe\x3b" + "\xac\x53\x1f\xf0\xf9\x9b\xd2\x06\x76\x36\x1f\x71\x88\xfb\x9e\x7f" + "\x57\xc3\x88\xb7\x12\xbc\x9d\xc6\x82\x90\x76\xb1\x4f\x17\x75\xf1" + "\xb2\x91\xef\x51\xf4\x56\x65\xd0\x98\x8b\x9d\xe6\x94\x7d\xe3\x7b" + "\xbf\x6b\xa3\xb4\xf6\xcd\x22\x4d\xb9\x98\xf3\x46\xd9\xfc\x2e\x82" + "\x6d\x34\x82\x34\xd7\x8a\xb6\xfe\xa3\x53\xa4\xf7\x84\xc7\xc1\xc7" + "\x6f\x7e\xd7\xe5\x45\xbe\xa0\x4c\xa2\x9d\x96\x63\x5a\x59\x26\x28" + "\x8f\x13\x57\xe8\xfb\xa1\x4c\x8e\xa5\xc8\xe7\x7d\x51\xdb\x84\x75" + "\xb8\x4c\xf4\x6b\x8e\x79\xa2\xb7\x4d\x63\xd1\xee\xbb\xc8\x07\x73" + "\xd4\x2b\xf9\xb8\xbc\xbc\x96\xfa\x56\xe4\xd3\x79\x79\x7f\x8a\x77" + "\xfb\xe2\x0e\x5a\x87\x6e\x75\x89\x75\xe8\x14\x3e\xd7\xc1\xbc\xed" + "\x0e\x0f\xed\xcf\xea\xc0\x3c\x1a\xe4\x3e\x3f\xd9\x37\xd5\x36\xc5" + "\xff\x4b\xde\xfb\xc0\x55\x55\x65\xfd\xc3\xfb\x5c\x10\x51\x91\x7b" + "\x21\xc4\x9b\x51\x5e\x0b\x9b\x9b\x91\x92\x5a\x59\x19\x32\x85\x85" + "\xe5\x1f\x6a\x6c\xa2\xc6\x04\x53\x1a\x34\xd4\x9b\x22\xa2\x21\x20" + "\x3a\x3c\xce\x33\x8a\x17\x47\x7d\x19\x45\xc5\x79\xac\x9f\xcd\x58" + "\x31\xbf\xd7\x79\x3f\xf6\xbc\x9a\xb7\x51\x0b\x13\xb8\xd4\x58\x51" + "\x83\xd3\x8d\x41\x23\x06\xf5\x26\x28\x57\xbc\xf7\xec\xf7\xbb\xf6" + "\x3e\xe7\xde\x8b\x81\x0d\xf3\xcc\xfb\x7b\xde\x3f\x7c\x3e\x97\x73" + "\xce\x3e\xfb\xec\x3f\x6b\xaf\xbd\xf6\x5a\x6b\xaf\xbd\x16\x60\x77" + "\xf8\xa0\x8b\xbd\x33\x51\xa3\x6b\x03\x31\xe6\x67\xb4\xf2\x83\xdb" + "\xa0\xf9\xda\x3f\xec\x95\x72\xe8\xe1\x56\xd0\x9e\x0a\xa9\x3b\x38" + "\xdc\xa9\xb7\x1b\xef\x1d\xd7\xf7\x31\xed\xb1\x69\x59\x96\x1c\x22" + "\xd1\x89\xe3\xf3\x2d\xd6\xd1\x0b\xc6\x89\x83\x0b\x96\xc7\x1f\x7b" + "\xc8\x92\xf6\xc8\xe8\xfc\xec\x84\x99\xf2\xf2\x58\xda\x74\xba\x5e" + "\x27\x17\x58\xba\x4a\x8e\xcc\xee\xa9\x9b\xf8\x93\xd6\x86\x23\x39" + "\x2e\x65\x86\xc4\x61\x53\x52\x3a\xb7\x27\x54\x60\x4d\x6d\x27\x99" + "\x6d\x96\xef\x2b\xce\xcb\x13\x2a\x78\x54\x52\xba\x3b\x6a\x6f\x23" + "\x7e\x55\xee\xa8\x94\xcc\xcd\xa0\x81\xe0\x51\x3d\x46\xef\x40\x49" + "\x2b\xf1\x0c\xbe\xa7\x15\xbc\x15\x8d\x25\x9b\x7a\x57\x11\x9f\xe5" + "\xe3\x4e\xf0\x58\x80\xcb\x91\x5a\x7d\x1d\x17\x3a\x75\x7b\x52\xfa" + "\xac\x7c\x7e\x8d\x70\x07\xfc\x41\x38\x64\xff\x74\xd2\xab\x23\x1f" + "\xfa\xff\xce\x7e\x09\x8b\xf7\x30\xfe\x87\xe3\x35\xf8\xa6\xe1\x19" + "\xe3\x9f\x16\x21\xe6\x78\x89\x59\xac\x15\xea\xba\x31\xcf\x40\x2e" + "\xad\xd2\xcb\x44\x59\x11\x5a\x8c\x70\x51\x9e\xdc\x7f\xfd\xe1\x9f" + "\xba\x65\x4a\x3e\xe9\x50\xe9\xac\xba\x31\x5f\xa1\x98\x70\xe9\x7e" + "\xbd\x31\xde\x81\x0f\x22\x39\x36\x3d\xb2\x53\x29\xa6\x3c\x01\xfd" + "\xaa\xea\xda\x6c\x50\x3d\xe0\x27\x4c\x84\x1f\xc4\xab\x4a\xdb\x9e" + "\xf7\x0e\xfb\xf7\x8a\x7b\x8c\xfd\x7b\x02\x1f\x2e\x95\x84\xa2\x6f" + "\x47\x52\x6e\x8f\x91\xbc\x93\x5a\xa2\x30\xe9\xbf\xe4\x3d\xe1\x43" + "\x4e\xe3\x4f\x46\x02\xbe\x6e\xb2\xe3\x80\x1c\xe0\x26\x3e\x5a\x0d" + "\x01\x4e\xb2\x36\xe6\x2c\xe8\x2a\x26\x1f\x0a\x7e\xbc\xb4\x01\x2f" + "\x6d\xc0\x4b\xb2\xb9\x41\xfd\xee\x90\x31\x99\x98\xb3\x90\xb9\xde" + "\x2b\xa6\xf6\x13\x6c\xd4\x12\x16\xa1\x02\x56\xc2\xb6\x9a\xe0\x13" + "\x9d\xec\xa1\xb3\xaf\xd4\x57\xa3\x17\x7d\x0e\xee\x97\x41\x75\x95" + "\x95\xa0\x5f\x06\xf4\x2b\xff\xbc\xd0\x4b\xd2\x99\x64\xd0\x92\xd8" + "\x40\x5c\xa1\xa3\x55\xc1\x7d\x54\x29\x16\x99\xe8\xc3\xd1\xf7\x7b" + "\xeb\x23\x37\x28\x9a\x6e\xe1\xe8\x36\x6d\xcf\x5d\xb4\x93\xe8\x56" + "\x3b\x3b\x3a\x3b\x72\x2d\x9d\x05\x4e\x02\x8c\xd9\x63\x34\x86\xbb" + "\x4b\xb8\x9d\xda\xd9\xdb\x78\x51\x79\xb2\x2c\x47\xa6\x71\x6d\x71" + "\x66\x57\x89\x23\xa1\x77\x78\x3b\x66\xdc\x18\xde\x8e\x51\xf4\x3d" + "\xb5\x83\xce\x35\x1b\xc9\xe9\x1d\xf0\x1b\x7c\xc5\x86\xde\xea\x8d" + "\x5c\x5b\x45\xed\xea\xf5\x1d\x70\xbf\x7d\xf3\xb2\x9e\x73\x42\xdd" + "\xed\x61\x04\x3f\xd2\x5d\xca\x3d\x26\xc7\x69\xff\x5e\x98\x3d\xa9" + "\xd8\xa8\x58\x42\x68\x8e\x09\x9e\x18\xfd\xed\xad\x5c\xa3\x62\x27" + "\xbf\x99\x8f\x81\x56\xf5\xfa\x1e\xf3\xc0\xc2\xd7\xdd\x7d\x3b\xca" + "\x4b\x89\x5c\xab\x70\x77\xc8\xdd\x83\x23\x3b\xbd\xf1\x04\x57\xb4" + "\x35\x1f\x73\xfc\x5b\xb1\x76\x0b\xbd\xdd\xfb\x98\xff\xf5\x22\x16" + "\x9e\x3b\x2a\x29\x45\xda\xa8\xbd\x9f\xed\x62\x9f\xcd\xd1\xe9\x18" + "\x9e\xf3\x5d\xca\x98\x39\x72\xae\xde\xb2\x03\x6b\x5a\xb8\x5a\x62" + "\xe4\x96\xd5\x46\x8e\xb2\xa2\x54\x6e\x35\x60\xdd\x0a\x0f\xe0\x8e" + "\x3c\x3b\xad\xe3\x0e\xbe\x3f\xd4\x3b\x5e\xbc\xff\xc5\x8d\xf1\xe2" + "\xfd\xb7\xb4\x3d\x87\x4c\x29\x13\xfd\x89\xe9\x32\x11\x5f\x77\xcb" + "\x0e\x4b\x21\xd5\xff\xfe\x56\x59\x37\x60\xe2\x4d\x26\x3a\x33\x1d" + "\x70\x2b\x46\xde\x04\x9d\x36\x10\x0e\x19\x7d\x24\x73\x31\x81\xe7" + "\x78\x97\x0a\xda\xd3\x2e\xd7\xe7\xa9\xa4\xf3\x8c\x53\x4b\x8e\x84" + "\x63\xfd\xda\x49\x32\x53\x67\x54\xd2\x71\xe4\x01\xfd\x1b\x18\xa7" + "\xd1\xbf\xc3\x28\xc3\xb1\x55\xfa\x46\x09\x17\x71\x2c\x31\xcf\x29" + "\x76\x25\xcd\x75\xa4\xc5\xa0\xdd\xa4\x0b\x81\x8c\xf0\x27\xff\xfe" + "\xaf\x5a\x92\x4c\xf0\xde\x4f\x7d\x30\x10\x3f\x0c\xd8\x6d\x33\xa8" + "\xfb\xaf\x8c\x33\x33\xea\xf3\x95\x75\x23\xf6\xff\xdb\x58\x16\xfa" + "\x81\xf9\x25\x66\x1b\xcf\x62\xd6\xde\x1f\xca\xfe\x3e\x89\x19\x08" + "\x0e\x2e\xf6\xa7\x83\x12\x76\x7f\xea\xd4\xc7\xc7\xc5\xde\x9f\x43" + "\xe3\x41\x7b\x84\xb3\xbc\xbc\x43\xee\x91\x1e\x8b\x71\xb1\x03\xda" + "\xfb\x23\x99\xbd\xac\x0f\x53\x2d\x0b\x97\x5b\x16\x2c\x5d\xb9\x64" + "\xd4\xa8\xc1\xbd\xc8\x12\xc7\xac\x52\x96\x38\x36\x27\x58\x96\xc0" + "\x73\x0e\xca\x9b\x7c\xbd\xec\x30\x3d\x43\x73\x79\x93\x91\xc8\x02" + "\xf7\xf7\xb2\xe9\xf7\x06\x3d\x4e\x60\xd3\xc7\x4f\xc8\x78\x26\x6b" + "\xde\x82\x55\x41\xa9\xf7\x05\xeb\xb4\x37\xef\x40\xdd\x21\x23\x1e" + "\x05\xfd\x50\x66\xbe\x46\xeb\xce\xf1\xa7\x0b\xbd\xfc\x1b\xe0\xee" + "\x24\xf2\x33\x57\x97\xeb\x65\x75\xa0\x6f\xfc\x16\xa2\xeb\x03\xa5" + "\xaf\x65\x1f\x23\x9d\xb1\x11\x7d\x77\x43\xa6\xbb\x2c\xcf\x01\x1d" + "\x5f\x51\x5f\xe1\x01\x9d\x48\xc9\x96\xfc\xce\xf1\x44\xa4\x47\xe1" + "\xfa\xbc\xdc\x5f\x3c\xfe\x22\x64\xf2\x64\xe1\x57\x27\x8f\xfc\xea" + "\x1c\x17\xf6\x52\x63\x3b\x8b\x99\xf4\xef\x78\xac\x95\xe2\x2e\xb8" + "\xd8\xf1\x0a\xe2\x2f\x28\x2f\xbe\xb9\xd7\xb2\x88\x25\xd2\x95\xf8" + "\x61\xbc\x4b\xe4\xe5\x29\xd9\x7c\x67\x3a\xd9\x77\xc5\x23\x7d\x1b" + "\xf1\x6d\x21\xe6\xf0\x41\x5d\x25\xc7\xb7\xea\x3c\x48\x67\x1f\xe7" + "\x10\x85\x3c\xae\xad\x83\x91\xa0\xdf\x91\x9d\x46\x9e\x41\x7e\xaa" + "\x14\x16\x4f\xeb\x83\x31\x3f\x4d\x9c\x77\xa5\x75\x91\x68\xc2\x6e" + "\x41\x4b\x8f\xb7\xeb\x74\xa1\x4c\xca\xa3\x83\xe9\x7b\xac\x9f\x17" + "\xe5\xfa\x79\xc2\xaf\xff\xc4\xbd\x59\xc7\xd5\x1e\x67\x1d\x97\xe4" + "\x66\x2d\xcb\x5a\x60\x19\xbd\x7c\x30\x0b\x8a\x0a\x9c\x9d\xb5\xc4" + "\xb2\x2c\xeb\xd5\x15\x59\xcb\x85\xa0\x47\x6f\x7b\xea\x0a\x41\x83" + "\x02\x31\xda\x47\x10\x8c\x4f\xac\x91\xfa\xab\x51\x62\x5f\x4f\xee" + "\xc7\xbe\x6b\x56\xcb\x86\x26\x4b\x1d\x7a\x1b\xe0\xfa\x81\xdc\xbf" + "\xb6\xa7\x90\x9e\x10\x70\xfd\xa0\x5c\xda\x6d\x9d\x38\xa9\xc1\xaa" + "\x1c\xed\x74\x04\xf8\xb5\x0f\xc5\xde\xb0\xb4\x9f\x3e\xd1\xe8\x62" + "\xc7\x0e\x05\x78\x90\x0f\x7f\x4c\x74\x50\xd0\xc3\x1f\xa0\x85\x1a" + "\xef\x8c\x7a\x3e\xf8\x05\xcf\xe3\x2d\x9b\xbb\x99\xd0\x4d\x53\xbc" + "\x0e\x49\x5f\x3f\x98\xa8\xc3\x11\xfc\x4b\x0b\xe9\x1d\x74\xf9\x68" + "\x96\xf7\x2a\x2f\x5c\xc5\x0c\xa4\x7b\x00\x0d\xc9\x79\x7b\x99\xdb" + "\xc0\x4b\x4e\xc4\x83\x97\x49\xa7\x3c\xbb\x35\x3b\x62\x1e\x95\x32" + "\x1b\xe5\x14\x04\xe4\x8e\x0f\x93\x05\x1f\xdf\x4d\x78\xf3\x81\x25" + "\x83\xd6\x08\x49\xbb\x87\xfc\x50\x7b\xf9\x60\xb9\xa7\x27\xe9\xdb" + "\x07\x87\xb5\x3e\xb4\x13\xcd\xd2\xec\xd0\x0d\x12\xaf\x3f\x4c\x06" + "\xce\xa5\xd3\x58\x80\xce\x6f\xd0\xe1\x45\xfd\xa5\xb6\xd3\x1e\x0a" + "\xe8\x70\xce\x3b\xab\x3d\x06\x19\x4f\xf7\x44\xa2\x94\x8f\x3e\x8c" + "\x0f\xde\xc3\x96\xb2\xd0\x87\x93\x02\xbe\x6b\x4e\x54\x5c\x4f\x23" + "\x96\x2e\xa1\xa3\x8d\xaf\x64\xac\x24\xb5\xf3\x0a\x5b\x82\x65\xc5" + "\x12\x61\x42\x20\xd4\x00\xb9\x2b\xe6\xbf\x62\x21\x2a\x92\x91\x32" + "\x7d\x7a\xc6\xa3\xcf\xfe\xe4\xf9\xc1\xec\xd1\x79\x48\xcb\x5d\x6a" + "\x99\x9e\x98\x20\x5f\x3d\x33\xf5\xb1\x9f\x66\x3c\x36\xeb\xd9\x99" + "\xb3\x7b\x39\x1f\x11\x01\x9c\x98\x8d\x31\x1a\xd0\xcc\x4e\xda\xa5" + "\x3d\xdc\x87\xb5\x3d\xed\xe1\x3e\x6c\x61\x8c\xb6\x06\x6b\x20\xc9" + "\x9c\xcc\xc7\x0f\xb0\x3b\xb9\x5e\xe2\xcd\xa0\xa1\x68\xbf\x27\x80" + "\x37\x27\x05\x5c\x49\x77\x20\xf7\x01\x6a\x40\xff\x4e\xa4\x05\xbf" + "\x0b\xd0\x82\x93\xc2\x56\x54\xc7\x0b\xc2\x87\x0c\x6f\xb8\xc0\x0d" + "\xc9\xaf\xd4\xa4\xe9\xb8\xb1\x59\xee\x55\x32\xd2\xcb\xd1\x7b\xe0" + "\x77\x28\xed\x75\x00\x17\x66\x93\x9d\x07\xa5\xf3\xa8\x77\x43\x65" + "\xb9\x35\x1b\x68\xef\x83\xf8\x59\x6d\x7f\x36\xb2\x8d\xd5\x9c\xe0" + "\x25\x1f\x4e\x97\xb2\xe0\x87\x6b\x04\xde\xac\x1b\xf1\xa8\xd8\x0f" + "\x17\x67\xdb\x6a\x0e\x07\xf0\xe7\xa4\x9d\xc6\x26\xa0\x8f\xae\x69" + "\xbc\x4e\x8f\x13\x82\xb4\x76\x3d\xf6\x41\xee\x28\x66\x08\x1d\x65" + "\x67\x5b\x0d\xbc\xd8\xc5\x6a\x2a\xa5\x4d\xf4\xc9\x08\x9d\x7f\xc6" + "\x3d\xe6\xbf\xe1\xc0\xf5\xfa\xaf\xb2\x20\xfd\x57\xa1\x8d\x7f\x5d" + "\x6f\x73\x13\x8f\xec\x70\xba\x85\xcf\xdd\x29\xf5\xb6\x4e\xb2\x73" + "\x1a\x0c\x38\xcd\x2b\xf2\xf1\x6e\xdc\x8f\x40\xdf\xc4\x1a\x32\x4e" + "\xea\x14\x20\x8f\x9d\x2c\x97\xb2\x89\x4c\x27\xb8\xe3\x9e\xf0\x2a" + "\x94\xc6\x07\x78\xd9\x8e\x31\x9a\xde\x1b\xdd\x8b\x5c\x6b\xd0\x7c" + "\x9b\x9d\x3c\x4b\x32\x2a\xc1\xea\xd7\x06\x35\xfb\xd7\x25\xf8\xe1" + "\x4a\xb4\x2f\xc0\x5f\x72\xcd\xd6\xe9\x64\xcb\xf1\xfc\x76\x5a\x37" + "\x3d\x7d\xd1\x52\x8c\x67\x93\x3e\x9e\xb3\x7c\xee\x29\x34\x5e\x5d" + "\x25\x1f\xc5\xe9\x63\xd9\x31\xf6\x69\x7b\xc8\x5a\x66\x39\x56\x39" + "\x9e\xd2\x31\xff\x4f\x0a\xbb\x66\xf2\x45\x70\xfd\xb7\xa0\xc3\xc9" + "\xda\xf7\x73\xf4\xef\xaf\xf7\x99\x2d\x0e\x8b\x93\x92\xeb\x21\x69" + "\x6f\xa6\x85\x38\xef\x61\x6f\x46\xfb\xd1\xc7\x25\x4e\xea\x3a\x38" + "\x93\xec\xcf\xa9\x67\xd5\x2d\x90\xbf\xb7\x3c\x3c\x5e\xd3\x03\x60" + "\x6e\x7f\x74\x75\x2c\x63\x39\x9d\x2b\xd3\xfd\x3a\x14\xd2\x7d\x90" + "\x1f\x4c\xb4\x23\xf8\xfc\x8b\xdf\x5e\xd8\xc5\x4e\xcd\x26\xfb\x45" + "\x5d\xf7\x4b\xf3\x4a\xea\x6d\x4e\xc5\x38\x3b\x19\x43\x79\x4b\x84" + "\x2d\x46\xc9\x47\x39\x02\xf7\x20\x6b\x0b\x39\xbf\x80\x7f\xa3\xef" + "\xab\x10\xef\x22\xcf\x86\x9e\xf2\xef\x7f\xc8\x73\x92\x1f\x1d\xa7" + "\xbd\x15\xa4\x67\xf6\xa6\x2f\x04\x7d\xc8\x9e\xb7\x64\xc1\xd2\x97" + "\x5f\xfe\x61\xd2\x10\xbc\xdf\x6a\x2f\x51\x37\xa0\x4c\x92\x7f\x5d" + "\x12\x4f\x4f\x81\xfe\xff\xf6\x90\xe4\xdf\x7e\xf6\x2d\xe6\xcd\xad" + "\x6d\xac\x36\x4e\xe7\xdf\xe5\x3c\xaa\xb5\xf2\x92\x53\x39\x81\xb9" + "\x71\xaa\xf3\xfb\x73\xa3\x36\xbc\xf7\xb9\x51\x9b\x80\x75\xb6\x09" + "\xef\xad\x2e\xf6\x3f\xc5\xf9\x0b\x7a\xd6\x78\x70\x87\xd1\x3b\x45" + "\xf0\xe0\x19\xab\x98\x42\xfc\x37\xe9\xa6\x69\x3d\xf0\x41\xae\xf5" + "\x81\x46\x64\x78\x99\x89\xd6\x82\xcd\x4b\x48\xef\x38\x92\x7b\xaf" + "\x70\x57\xc6\x2a\xd0\x0b\x3c\x97\xb5\x49\x7b\x90\xb9\x97\x21\x87" + "\xe0\x7e\xf3\x39\xa2\x15\x2a\x05\xe8\x60\x72\xbd\xae\xad\xd4\x79" + "\x5c\xe3\x5a\x8b\xf0\xdb\x4e\xeb\xb6\x4f\xda\xd6\x55\xd3\xda\x8d" + "\x7a\x0e\x0a\x1a\xe4\x33\xd2\x3e\x03\xdb\xbc\x08\xe5\x92\x8d\xda" + "\x12\x6a\x5f\xc8\x04\xa3\x37\x51\xf8\x35\xd9\xb3\x48\xd8\xa6\x4d" + "\x90\xb6\x69\x13\xd8\xee\x25\x04\x87\x5a\xef\x0d\x75\xe3\x51\x7b" + "\x1d\xc1\xe9\xf9\x2f\x2f\xcc\xb0\x65\xaf\xca\x20\xbb\xd4\xeb\xd6" + "\x77\x39\x87\x4a\xea\x2c\x12\xbe\x75\xb3\x03\xba\x2a\x69\x4f\x4a" + "\x34\x73\x9c\x47\xf8\x55\xd6\xf6\x93\xea\xc5\x79\x87\xa2\xab\xf4" + "\x1c\x0e\x9c\xab\xbf\x17\x3c\x7c\x58\x07\xd9\x71\xed\x49\x67\xf6" + "\x12\xee\x20\x1d\x1a\xd2\x6f\xd6\xfd\x3b\x74\x20\x1d\x73\x9f\xd2" + "\x84\x4f\x16\xd2\xcf\x49\xdc\xab\x3b\xee\x62\xc6\x89\x5a\x7d\x13" + "\xc8\x56\x54\x9c\x6f\x10\x7c\x46\xdd\x77\xf2\xbc\x60\x5d\xab\x0e" + "\x4b\xf0\xbe\x93\xc9\xd7\x04\xd9\x8c\x75\x70\xb2\x4f\xad\x0f\xd5" + "\xbf\x77\xb1\x3a\x71\x26\x68\x66\xa7\xb8\xaf\x9e\xdb\x19\xec\x1f" + "\xa2\xae\x52\xd2\xad\xba\x2a\xa4\x03\x5f\xea\xd6\xa3\xcd\x91\xd2" + "\x6f\x85\x28\x67\xba\x6e\x9b\x17\x0c\xb7\xc7\xe6\xd9\xc0\x2c\x2f" + "\x7c\xf9\xe5\xac\x65\xcb\x2d\xf3\xa4\x1b\x08\xeb\xd2\x9c\x05\x8f" + "\x68\xfe\x20\x96\x64\xad\xcc\x58\xb8\x40\x9c\x37\x43\xaa\xbc\xbd" + "\x0e\xbe\x09\x24\xdf\x88\x33\x1c\xa2\x4f\x7f\x5e\xb1\x5b\xe3\xa3" + "\x9a\x59\x43\xa8\xb4\xfd\x71\xbe\x2a\xd7\xb6\x21\x6f\xa0\x1d\xa7" + "\xf5\xb5\x8d\x74\x2c\x1d\xec\x41\x3b\xed\xcb\x91\xaf\x90\x5d\xdb" + "\x79\x0b\xe9\x59\x90\x07\xeb\x5f\x5d\xb8\x3e\x5f\x37\x21\x9d\xec" + "\x13\x1c\x4b\xc8\x26\xe1\xcf\xdb\xd4\xf2\xa4\x89\x3c\x7a\x8c\x0b" + "\x74\x4d\xc4\xfc\xa6\xfd\x28\x19\x57\xc6\x99\x42\xf4\x9a\x74\x81" + "\x8e\x25\x64\xdb\xed\x8c\x01\x7f\x62\x72\xb1\x3f\x57\x40\xd6\x9b" + "\xb8\x7e\x35\x0b\xdf\x25\xf7\x18\x5d\x52\xaf\xec\xcc\x7c\xbf\x80" + "\x31\x6d\x3d\x74\x6d\x12\x7a\x4e\xa7\x8c\x19\x63\x4f\x4a\xe5\xa6" + "\xa9\x87\x49\x0e\x97\xfe\xdf\x9c\x5b\x21\x4b\xa5\x72\xfb\xdd\x56" + "\xf0\xe3\x5d\xbc\xfc\x6e\x2b\xd2\x6f\x41\xba\x16\xa7\x27\x21\x7b" + "\x16\xc5\x46\x29\x4f\xc8\x46\x7a\x1c\xd2\x65\x7c\x37\xfb\x58\xeb" + "\x2c\x9f\x87\x7c\xca\x8c\xe4\xe5\x63\xad\xa8\x13\xfd\xbf\xc3\x2d" + "\xfb\x7f\x77\xb8\xc0\x39\x41\x37\x9d\x1e\xbe\xe5\xee\x0a\x61\xcb" + "\xbf\xe5\xee\x70\x95\x67\x87\xd0\x33\xd6\xad\xc1\xc0\x89\xd3\xbc" + "\xc8\xca\x34\xfb\xff\x90\x73\xac\x61\x2d\xe9\x94\x81\x6b\xc7\x09" + "\xae\x68\xeb\x6c\x4d\xe7\x03\xbe\xad\x01\xf4\x7f\x22\x93\xf4\xa7" + "\x21\x59\xaf\x0b\x73\xdf\x8d\xb5\x3d\x8d\xd6\x77\xc0\x22\x01\xbf" + "\x44\xa9\xbf\xf2\x40\x8e\x1c\xe9\xd7\x5f\x49\x1e\xb2\x21\x5f\x9f" + "\x7b\x54\xb7\x06\x8f\x34\xb5\x44\xf8\x27\x56\xb4\xba\xd2\x48\x97" + "\xa2\x97\xc9\x51\x26\xbf\xd2\x5e\x85\xb5\x38\x1c\x34\xc8\x1d\xb9" + "\x16\x6b\x2e\xd5\x41\x32\x40\xe7\x48\x8e\x35\xd9\x97\xe1\x0b\x95" + "\x3e\x62\x56\xb1\xa1\xc1\xfc\x3f\xea\x6b\x0d\xf0\xac\x28\xe3\x0a" + "\x68\x7d\x21\x2b\x6e\x61\x1f\x0b\x1e\x92\xf6\x8a\x09\x47\xba\x31" + "\xe6\x18\xf7\x56\xd4\x53\x0d\xb9\x65\xe8\x39\xf6\xf1\x68\x1a\x7b" + "\xb2\x89\xda\xdd\x2d\x64\x19\x23\xda\x16\xda\xcc\x3e\x8e\xa2\x71" + "\xa7\xb2\x00\xe3\x43\xde\xae\xf4\x27\xc8\x47\x23\xc1\x7a\x4d\x01" + "\x6f\xb5\xbc\x4c\xf0\xfe\x64\x1b\xf1\xf8\x90\x7b\xc4\x7d\xd1\x02" + "\xae\x0a\xbc\x11\x67\x02\x3e\xd9\xb6\xa6\x95\xab\x57\x4b\x18\xaf" + "\xc1\x5a\x73\xd5\xc0\xbc\x1e\xc8\xe8\x68\xb7\xa1\xe8\x3c\xf9\x91" + "\xac\x02\xdd\xda\x40\xb6\x58\xe1\x65\xab\x99\x89\x7c\x70\x16\xd9" + "\xb8\xa7\xbe\xb3\x92\xd5\xdb\x2a\xd9\x47\xde\xad\xcc\x91\x47\x3a" + "\xdf\x3f\x4f\x3e\x95\xbf\x95\xce\x60\x0d\x42\x1d\x3e\xcb\x4f\xa9" + "\xae\x8f\x4f\x9f\x3a\xfd\x09\x3b\xe5\xf8\x84\x59\x5e\x10\xcf\x2d" + "\xb5\xe9\x1f\xb1\xda\xe4\x8f\x58\x51\x0b\x57\x89\x5f\x2c\x5c\x4c" + "\x75\x6c\x40\x59\x55\xe4\xaf\xd2\xa4\x76\x98\x07\xa3\xff\xa1\xb3" + "\xf2\x89\x26\xbb\x99\x63\xc9\x7f\x52\x1b\xb3\x76\x5f\x62\xe1\x8e" + "\x25\x7f\x12\xf7\x42\xff\x82\xfe\x3a\x17\x34\x0a\xdb\x62\xf2\xd5" + "\xe9\xcc\x6f\x25\x5f\x06\xea\x66\x6a\xa3\x4f\xb6\x1b\xf0\x0a\xd5" + "\xbf\xdf\x53\xe8\xff\x5e\xc4\xca\xd9\x45\xf0\x40\x9b\xea\x66\x4b" + "\x98\xd4\x36\x02\xa6\x3f\xd5\xe0\x93\x1e\x0c\x9f\x8f\xd7\x13\x7c" + "\xe8\xac\x85\x9a\xd7\x5e\x85\xb6\x25\x03\x06\xaa\x5e\x07\xe1\x00" + "\xed\x0b\x52\xf9\x65\x97\x58\x84\x63\x09\x9d\xc5\xf8\xe4\x5b\x63" + "\x5a\x68\xb8\x7a\xe5\x7c\xf5\xe6\xcb\x2c\x94\xc6\x8d\xf8\x90\xcd" + "\xe2\xbd\x80\x79\x2d\x8d\x99\x3b\xea\x61\x0b\x7e\x90\x49\x1e\xb6" + "\x12\xee\xe1\x9a\x80\xf1\xda\x80\x36\x2c\xc0\x58\x55\xd1\x55\x9b" + "\x6f\xe9\xe4\xc3\x98\xd6\x7a\xe0\x4a\x20\x7d\x4b\xc2\x73\x5e\xcc" + "\x1d\x55\xc8\xb1\x9f\x2c\x50\xcb\x53\xab\xa4\x5d\x7e\x7d\xfa\x2e" + "\xc8\x0d\x95\x5b\x84\xef\x97\x08\xc8\x3a\xc2\x96\x63\x87\x38\x23" + "\xfa\xe7\x6c\x7d\x4d\xf8\xf7\x58\xf2\xab\xf2\xc9\x56\x83\xb0\x11" + "\x4e\x9a\xae\xe1\xfa\x74\xe4\xd9\xe8\x62\x63\x0f\xca\x39\xd1\x20" + "\xce\xb2\x12\x4d\xe9\x8b\x67\xc3\x3a\x58\x4b\xb6\xd9\xfc\x96\x74" + "\x16\xa1\x70\x77\x44\xa6\x91\x3b\xbd\xc7\x09\x87\x22\x04\xee\xcb" + "\x77\xe0\xb3\xdd\x46\xac\x93\x0d\x48\x0f\xd5\xd3\x69\x3d\x56\x21" + "\x7b\x93\xdc\x3f\x6b\x95\x91\x17\x5e\x66\x71\x42\x87\xa6\xa7\xaf" + "\x72\x1b\xeb\xcd\x8c\xce\xb7\x79\xc9\x77\x14\x7d\x83\xf4\x10\xac" + "\xbb\x87\x51\xaf\x03\xf9\x63\xf4\xfc\xbc\x23\x3d\xd4\x99\x7f\x5c" + "\xcc\x33\xf2\x2f\x28\xd6\x5b\x99\x3e\x60\x56\xbe\xdb\x28\xc6\x4c" + "\x4f\x5b\x9e\x2e\xd6\x79\xf2\x2f\x03\x3e\x9e\x8b\xf6\x9c\x13\xe9" + "\x0a\xe4\x70\x61\x63\x12\x94\x66\x20\x5f\x3e\xe4\x2f\x36\x28\x2d" + "\x04\x6d\x66\xfe\x67\xd4\x4d\x6b\x3e\xcd\xbb\x59\xab\x68\x3f\x51" + "\xae\xf5\xa2\xee\x55\x9c\x49\x1f\xd4\x32\x4d\xf2\x14\xa7\xdd\xc1" + "\x3a\x00\xda\xc3\xa1\xba\xd5\x8e\x74\x83\xaf\x23\x3d\x84\xea\xa7" + "\xb2\x48\x7f\x8b\x3e\xa2\x5e\xb2\xbf\x68\x64\xbc\xfc\x88\x85\xd3" + "\x79\x46\x94\x2b\xda\x93\xef\x01\xed\x39\x52\xd5\xbb\xdd\xda\x1b" + "\x8d\x8e\xc2\x17\x80\xd3\x9f\x0a\x9f\x8b\x3e\xd3\x94\x6c\xcb\x22" + "\x5a\xf3\x3f\x7d\x95\xc6\xd4\x87\x79\xee\x8b\x9a\x92\x3d\xae\x95" + "\x29\x85\x98\x3b\x72\x9f\xf3\xd3\x72\xe2\x39\x8b\x54\xce\x71\xbf" + "\x9e\x70\xd7\xd8\x4e\xf6\x66\x53\x72\x84\x8d\x57\xf4\x6f\x1b\x9c" + "\x9e\x56\x56\x5b\xfc\x25\xab\xf5\x3a\x8b\x0f\x5f\x72\x87\x4a\x5b" + "\xaf\x50\x2a\xf7\x75\x7a\x57\x84\xf9\x92\xe1\xab\xea\x5b\x4e\x86" + "\xec\x05\xd8\x7d\x25\xd7\x82\x4f\x3d\xba\xbc\x75\xe3\x3e\x7c\x96" + "\x46\x3e\x7f\xc9\x0e\x5a\xdd\x52\x4c\xfa\xf2\x22\xde\x65\x65\xe3" + "\x84\xad\xd1\x67\xd6\xc8\x4e\x96\xac\x95\x7b\x51\x96\x8b\xfc\x37" + "\x28\x97\xf0\xb6\xb6\x42\xe8\xd4\xd1\xa7\x62\x87\x0f\x65\xfb\xa2" + "\xd7\x12\x7f\x51\x04\x5e\x08\xbc\xcd\xe7\xdb\x50\x8f\xa3\xde\xdb" + "\xc0\xc8\x6f\xf8\x6e\x15\x6b\xff\x45\x33\xd3\xec\xda\x8a\x2e\xb0" + "\xcf\xd6\xaa\xdc\x6a\x82\x1c\x48\xba\xe4\x22\xa2\xb3\xa4\x9b\x2f" + "\xf4\xb1\x30\x67\xae\x8b\x91\xbf\x5b\x94\xf1\xcb\x13\xa4\xb7\x07" + "\xad\xf2\x71\xb3\xe1\xc8\x15\x17\xdb\x0c\xfa\x2d\xfc\xdf\xae\xbb" + "\x65\x47\xe4\x5a\x36\x85\x1b\x8c\xc2\x2e\x52\x2d\xaf\x6a\xc4\xd8" + "\x5a\xa5\x1d\x5d\xd2\x9c\x20\x1b\xba\x90\x0b\xec\xf3\x01\x64\x43" + "\xc7\x4d\x49\x16\xb2\x23\xe2\x18\xb3\xae\x92\xcf\x13\x5d\xec\x53" + "\x71\x76\x67\x23\xf1\x58\x82\xce\x7f\xbe\xcb\x1d\x55\x50\x45\x65" + "\x90\x1f\x3e\x35\xcf\x5b\xbd\xf9\x3b\xa6\xc9\xb5\x9f\xaf\xa9\x6f" + "\xef\x72\x70\x7b\x41\x15\xcd\x23\xad\x6c\x23\xca\x9e\xc1\xcb\x0b" + "\xaa\x5c\xec\xf3\x4a\x39\x36\xe2\x3e\x9b\xde\x7b\xaf\xd1\x99\xd7" + "\xcf\x5a\x2a\xbb\x89\xc7\xfa\xcc\x0e\xbe\xd9\xd1\x61\x2a\xa8\xfa" + "\x89\xb9\x18\xfc\xc4\xe7\xd5\x2e\xc3\xe7\x0e\xb1\xb6\x6b\xbe\x7c" + "\xaf\xd7\x3d\xf8\xc7\x70\xa7\x79\xb0\x13\x85\x40\x06\x88\x69\x63" + "\x5f\x8e\xea\x2e\x61\x86\x6b\x58\x5b\xbb\x21\x47\xf1\x9d\xe9\x11" + "\x65\x23\x58\x22\xde\x8d\x68\x63\x8d\x03\xbc\x06\x16\x83\x9f\xc9" + "\x7d\x4b\x36\xc5\x17\x49\x26\xfd\x70\xdd\x25\xda\xb3\x6e\x14\x74" + "\x7f\xf3\x0e\x16\xaf\xa2\x3c\xd2\x4b\x6f\x1e\xc1\xe2\x49\x27\x8d" + "\x34\x6b\x86\x4f\xee\xd9\xe8\x32\xe7\xba\x11\x2c\xa1\x67\xbd\x9f" + "\xb7\x4b\x9e\xf1\x4b\x0b\x5d\x57\xba\xd9\x6d\xb6\x24\xde\x8c\x72" + "\x29\x06\x29\xe7\xb7\x98\x0d\x92\xb7\x6c\x3c\x69\xac\x90\x78\x27" + "\xf6\x28\x80\x6f\xb4\x07\xa4\xe9\xbe\x15\xe1\xc3\x38\xfa\x31\x0f" + "\x9d\x39\x14\x69\x8a\x89\x60\x69\x12\xed\xd0\xfc\x8e\xfa\xd6\x8d" + "\xc9\xa4\x32\xa8\x3d\x19\xf3\xa4\xde\x9c\x7c\x92\xba\x58\xa3\xd0" + "\xf3\x6c\xdc\xc1\x22\x7e\xb5\x83\x99\xea\x5e\x16\xfd\xf2\xc8\xb9" + "\x18\xca\xa8\xbd\xaa\x9d\xe6\x19\x70\x02\xed\xa6\xfa\x08\x37\xea" + "\xbd\x17\x1d\x45\xb9\x5c\x75\x2c\x22\xbf\x3b\x5f\x3c\xe8\x58\x76" + "\x80\xcd\x6a\xf1\x4a\x3f\x7a\x73\x98\x7b\x0f\xca\xdb\x33\x82\x99" + "\xce\xb1\x2f\xa6\x3a\x73\x88\xd6\x9a\x6f\x77\x2c\x3b\x88\xb2\xbf" + "\x78\x9e\xd6\xa3\x4d\x80\x8f\x5c\x97\xbe\x8c\x70\x7a\x1a\x19\xc5" + "\x70\x99\x69\xe3\x3e\x2a\x07\x79\xca\x45\x7f\x77\x9a\x2d\x19\xd2" + "\x6f\xac\xe8\xab\x7f\x3f\x42\xeb\x87\xf3\x92\x28\x6f\x9f\x33\x13" + "\xfc\xab\xd6\x27\x1d\xd6\x12\xbf\xbe\xf8\xda\xb1\x6c\x1f\xa3\xf1" + "\xa1\xfc\x78\x6e\x70\x02\xe2\x19\xe7\x7b\x8e\x0b\xe5\x39\xc7\xbe" + "\xa4\x72\x1f\x08\xec\xb3\xd1\xfe\x4f\x20\x4f\xe5\x0e\xb2\x05\x6c" + "\x4c\xd9\x09\x18\x49\xfd\xe3\x17\x8b\xa9\xad\x2e\xf6\x45\x8e\x33" + "\xf7\xcb\xde\xcf\xfa\x62\xee\x03\xef\xd7\xd6\x0b\xdd\xdb\x97\x2f" + "\xce\xf4\xaa\x5c\xd2\xb3\xbf\x98\xc0\xbb\x35\xba\x70\x25\x5a\x20" + "\xe8\xc9\x58\xda\x1b\xff\x4b\x94\x51\x91\xe3\x4b\x7d\x21\x9e\xa9" + "\xb7\x31\x0e\xda\xf7\x30\x51\x5b\xf5\x31\xe6\xa6\x37\x1a\x55\xda" + "\xcf\x22\x9b\xf5\x6b\x66\x26\xf1\x8f\xdb\x51\xae\x46\xe3\x92\xaa" + "\xb4\xf5\xb4\xaa\x23\x6a\x4a\x2e\x7f\xcd\xec\xb7\xaf\xc5\xfc\xb5" + "\x65\x48\x9b\x68\x33\xd1\xa8\x3d\x06\x39\x77\xa8\x8d\xda\xb7\x95" + "\x72\x9f\xfd\xcb\x06\x7c\x5f\xd9\x6b\x7f\x43\x40\x77\x4a\x40\xa6" + "\xd1\x1f\x71\x06\x0f\xb4\x0a\xeb\x41\x98\xb3\xb3\x9b\xc9\xbd\xff" + "\xbf\x90\x6f\x81\x30\x3a\x7f\xad\xb7\xad\x7f\x7b\x14\x7f\x49\x97" + "\x7b\x14\x7f\xa9\xd0\xe5\x71\x6e\x02\x8c\x4b\x8c\x22\x9e\x07\xf8" + "\x2e\xb5\x33\xea\x0d\x97\x3b\xea\x5d\x93\x9c\x37\x7f\x71\xf0\x28" + "\x49\x6f\x33\x3c\xac\x98\xfa\xa5\xe9\x38\xc2\xa8\xcf\x28\xc7\xa5" + "\xef\x95\xeb\x65\xf7\x19\x23\x47\xef\x1b\xfa\x24\xfd\x76\xbc\xd1" + "\x28\xfa\x46\xbe\xa7\x44\xdf\x9a\x5e\xa4\xef\xfb\xd7\x9f\x26\x19" + "\x23\xd1\xfe\x86\xcb\x31\x82\xca\x38\x73\x99\xda\x47\x63\x02\xfa" + "\x30\xbc\x8d\x35\x55\xf3\xc1\xbf\x1a\xdc\xcf\x32\xe5\x59\x6b\xfb" + "\xbb\xa6\x6d\xa0\xc1\xf2\x2c\x2e\xd9\xff\x9c\x39\xc3\xcb\xdf\x35" + "\x91\x0c\xd3\x81\xfa\x80\x1f\x41\x74\xe8\x4c\x26\x8d\xd5\xd8\x03" + "\x2c\x59\xe2\xe1\x99\x67\x49\x76\x96\x31\xcc\xce\x40\xfe\xfd\xbc" + "\x46\xca\x4b\xba\x2d\xb6\x22\x6c\xb1\x83\x69\x6c\xff\xda\x78\x46" + "\xd0\x3b\x1e\x5d\x05\xfa\xd3\xd4\x29\x6c\x9c\xd0\xde\x95\x5e\x9d" + "\xfe\x35\x75\x72\xd2\x9d\x17\x6a\x3a\x54\xa2\x65\x85\xd2\x07\x26" + "\xda\xb3\xd5\xaf\x43\x25\x5f\x05\x25\xbc\x86\xf2\x61\xec\x2f\x52" + "\x1e\xe9\x5b\xaf\x4d\x3b\xc7\x7f\xe6\x4d\xed\x8c\xbe\x95\xec\xbe" + "\xf0\x6d\x83\x4b\x31\x08\x3b\x61\x82\x01\xd5\x2d\xda\x6e\x20\x7d" + "\xe9\x99\xf6\x80\xce\xba\x49\xc8\x8e\xd2\xcf\xc6\x5f\x43\x75\x1c" + "\x41\x7f\xc3\x64\xdc\x9a\xa6\xc5\xc7\x12\x98\xc0\x81\x0e\x6e\x1e" + "\x7c\x47\x25\xe1\xe4\x5f\x13\x82\xe1\x34\xcb\xab\x16\x49\x1a\x74" + "\x26\x86\x8b\xb9\x7e\x26\xe6\x87\xf9\x89\xbf\xae\xd5\x79\x11\x09" + "\x67\x13\xe8\xcb\xd7\xd3\x05\xac\xed\x77\x7b\xc8\xaf\xf4\x6b\x85" + "\xe4\x27\xff\xab\x1f\x53\x3c\x02\xaf\x3d\xc1\xec\x2b\x32\x93\xff" + "\x65\xa6\xda\x13\xac\xe7\x6c\xcc\x90\x61\x23\x3d\x7d\x81\x8d\x64" + "\x3c\xc8\xac\x26\x1e\x0d\xfe\x04\xf3\x7c\xcd\x42\x66\x7c\x31\x9b" + "\xf4\x15\xd6\x18\x8a\x17\x40\xb1\x02\x28\xd6\x87\xaf\xc8\x1a\x8d" + "\xfb\x58\xf0\x73\x26\x6e\x4a\x08\xa7\xbd\x7e\x5f\x09\x07\x3d\x6e" + "\x22\x5b\x66\x83\xd3\xed\x61\x6b\xce\xb3\x70\x8a\x47\xe0\x2d\x2f" + "\xd8\x50\xdf\x79\x46\xc8\x37\x91\x36\x16\x03\xfe\x83\xce\xb6\x98" + "\xd5\xa8\x02\x1b\xd6\xf8\x5c\xd9\xef\x8b\x5c\xf6\x5b\xb6\x9b\xda" + "\x2f\x69\xdc\x58\x6b\xa1\x68\xbb\xeb\xac\x17\xe5\xab\xf6\x09\xf1" + "\x3e\xfb\x04\x8b\xf4\x15\x51\xcb\x0a\x73\x79\xab\xb3\xb3\x16\x32" + "\xd7\x65\x11\x9b\x91\x6c\x09\xa8\x8f\xd4\x3f\xaa\xfb\xd4\xa5\xf3" + "\x22\xbe\x82\x17\xcf\x45\x39\xda\x37\xed\xf8\xa6\xbd\x96\x75\xdb" + "\x27\x88\xbe\xd7\x77\xca\x6f\x33\xc4\x3d\x7d\x1f\x04\x07\xad\xcf" + "\x7e\x38\xa0\xef\xd4\x3f\xea\xbf\x97\x60\x02\x18\x68\x7d\x35\x5f" + "\xd3\xfa\x49\x7d\xfc\x08\x54\x61\x07\xfa\x89\xbe\x8a\x7e\x5e\x43" + "\x3f\x6b\xb2\x19\xf3\x6c\x79\xc3\x7d\x35\x7a\x82\x85\x64\xd4\xa2" + "\x8f\xc1\xc3\x17\xd8\x19\x64\xd1\xd0\xb7\x0a\xed\x86\x7f\x07\x6f" + "\x52\xe8\x86\x4c\xea\xe6\xad\xf5\xe8\x93\xd3\x86\x9f\xb7\x92\x11" + "\x8f\xa3\xf3\xeb\x64\x27\x7e\x4a\x3d\xcb\x0a\x5b\x79\x2b\x78\x53" + "\x0f\xd9\x31\x3b\xb3\xd1\x7f\xc8\xb0\xe7\xb4\xf6\x53\xde\x35\xdf" + "\xc9\x7e\x19\x73\x58\xcc\xd1\x17\x36\x18\x9c\x8d\x1b\x98\xde\x97" + "\xb9\xc8\x87\xfe\x98\x51\xd6\x50\xea\x8f\x8a\x7e\xee\x44\x3b\x3d" + "\x41\x7d\xaa\x6b\xf7\xa0\xcc\x4f\xd9\xe0\x34\xa6\xec\xb8\x80\x7e" + "\x5c\x60\x66\x7b\x21\xf8\xaf\x67\x88\x5f\x74\xdd\x3a\x24\x9d\xc5" + "\xbb\xd8\x57\xf1\x12\xef\x84\xaf\xf3\x61\x6d\xec\xeb\xa9\x7e\x7f" + "\xe6\x14\x23\x22\xaa\x60\x23\xe1\x91\xf0\x6b\x4e\x6b\x46\x17\x70" + "\x86\xf6\xfc\x57\xa2\x8e\x2e\x6b\xac\x68\x4f\xc9\x44\xb2\x6b\x8e" + "\xc0\x33\xc5\x46\xa3\x73\xd8\x0a\xbe\xdb\xc0\x01\x33\x2a\x1f\xfc" + "\x5c\x2e\x5d\x09\x86\xbd\xda\xef\xbe\xcd\x26\xa1\x8e\x39\x24\x7f" + "\x57\x17\xba\x0d\xbf\x78\x9b\x25\xf4\x8f\xa6\x7c\x9d\xdb\x17\xfd" + "\x26\x5d\x2f\x95\x87\xbe\x45\x63\xe5\x7e\xbe\xe7\x1c\xb3\x08\x5a" + "\x26\xe9\x60\xb3\x85\x74\xa9\xfd\xac\x57\xf0\x70\x64\xaf\xd1\xbf" + "\xef\x9a\xe3\xf5\x76\xa0\x0c\x57\x5f\x6d\xef\x3f\x1c\x9a\x0b\xfa" + "\x2a\x6b\xd3\x76\x61\x6f\x59\x54\xb6\x1d\xf4\x02\xbc\xc2\x31\x33" + "\xed\xcb\x60\xed\xdc\xd7\xc9\x96\xef\x62\x14\xcf\x6f\xa8\xd3\x3b" + "\x83\x1d\xab\x4c\x64\xbb\x2f\x91\x2f\x44\x6b\xf4\xaf\x2f\x61\x2c" + "\x35\x1a\x42\x3c\x29\xe9\xa4\xf9\x72\xab\x69\xf3\x76\x9d\x87\xff" + "\xdb\xd4\x82\xcb\xcc\x60\x59\x22\xee\x53\x52\x2c\xdc\xbb\xd5\xa0" + "\x66\x57\x92\x9f\xfe\xe8\xbd\x16\xf2\xd3\xaf\xfb\xbe\x17\xbc\x4f" + "\x3e\xe6\x5c\x87\x79\xf0\xa6\x65\x2c\x81\xe2\x75\x18\xdd\x92\x97" + "\x93\xeb\xf5\xdf\x72\xd1\x3e\x93\xe6\x0f\xdf\x24\xfd\xe1\x7f\x7d" + "\x98\x6c\xe4\xb5\xf7\xaf\xfb\x20\xc3\x88\x72\x97\xb1\xf8\xca\x4b" + "\xcc\x4a\x7c\x50\xc6\x59\xc9\xb3\x91\x5c\x38\xa3\xdd\xc8\x7d\x7f" + "\xb7\xb2\x5d\x6d\x81\x78\x1e\xee\xe5\x14\x03\x84\x9b\xfb\xb2\xc5" + "\xde\x1c\x2b\x6c\x13\x84\x2f\x69\xda\xb3\xc0\x33\xdb\xba\x85\x85" + "\x1e\x23\x3b\xc7\x2a\x79\xbe\xf4\x98\x57\xda\x0e\x77\x95\xb4\xc4" + "\xe8\x71\x0e\xfa\xdc\x7b\xb7\x4b\x79\x47\x0d\x83\xfc\xe5\xee\x72" + "\x48\xdf\xba\x2d\x73\x9c\xeb\xd5\x20\x19\xa7\xe5\x11\x7a\x47\x69" + "\xe4\xaf\x30\x59\xc0\xb2\x65\x3d\xc9\x3d\x9a\xcc\x78\xd4\xe2\x4f" + "\x93\x3c\x8c\xb0\xdf\x36\xcb\xbd\x44\xac\x4d\x91\x68\x4b\x95\xbe" + "\x9e\xd1\xba\x2e\x7d\x18\xb7\x1c\x74\x19\xbe\xf0\xdc\xa0\x7d\x26" + "\xcd\xde\x9c\xf6\x81\x92\x91\xbf\x45\x5f\xdf\xc4\x7e\xf0\xba\x11" + "\x8f\x2e\x5f\xc5\xe2\x7e\x72\x73\x38\xa3\xbd\x44\xe4\x6d\x95\xeb" + "\xee\xd9\x88\xc0\x7e\x43\xb2\x80\x37\xf9\xde\x10\x32\x06\xf9\xb4" + "\x95\x31\x3b\xda\x75\xdf\xb6\x72\xfd\x3d\x7b\x57\xa0\x9e\xb3\xd3" + "\xfd\xeb\x28\xea\x20\x7b\x76\x2a\x5f\xf2\x26\x67\xa5\xbf\x49\xe4" + "\x93\xeb\xeb\x59\x76\x03\x5e\xcc\x4a\xf0\x55\x35\x79\xd2\xd9\xfe" + "\x8d\x84\x6f\x3e\x0b\xa1\x33\x1d\x47\x0b\x5d\xa1\x91\xd2\x07\xbd" + "\x11\xf5\xef\xa2\xf7\x84\xeb\x8e\xb1\xa4\x0f\x3c\x7b\x95\xb4\xcb" + "\xfc\x5a\x7a\xc4\x4c\x92\xf5\x05\x2f\x7e\xb6\xf5\x1e\x7c\x87\xb4" + "\xe8\xf7\x2e\x78\x42\x37\xaf\x66\x09\xd2\x47\xf0\x59\x61\xdf\x49" + "\xbe\x18\xee\x88\x61\xe6\x3b\xb6\x32\x6b\x57\xc9\x39\x93\xcb\xd0" + "\x28\xfa\x20\xea\xdf\x72\x24\x99\xce\xa5\xbc\xd3\xed\x1a\x20\xc7" + "\xea\xdc\x5b\x74\x06\x25\xe8\x79\x9a\xb6\xd7\xd4\xe0\x62\xe7\x0e" + "\xec\xb9\x20\xed\xf2\x85\x7e\xc9\xbe\xd7\x11\xb0\x65\x38\xf7\x96" + "\x6c\xcb\xb9\xb7\x8e\xd9\xc4\x19\x9e\xd3\xbb\x45\xec\x81\x73\xe0" + "\x8f\x5a\x1c\x9a\x3e\xa6\x41\xe0\x15\xf1\xbb\xa5\x24\x83\x7d\xe3" + "\xd8\x84\x7c\xb4\x4e\x80\x3f\x4a\x96\x3c\xfc\xde\x46\x15\xf8\x13" + "\xe8\xff\xb9\x9b\x49\xdf\xd8\x2b\x4d\xdc\xc1\x98\xf8\xa6\x7c\xaf" + "\x49\xd8\xc6\x94\x1f\xa9\xc0\x35\x9c\x97\xff\xd6\x81\x6b\x04\xd2" + "\x1b\x70\x35\xe1\x5a\x83\x2b\x78\x98\x23\xc5\x84\x97\x90\x61\xcd" + "\x14\x83\xb5\x23\x6a\x6f\x78\x5f\xe7\xfd\x08\x36\xce\xf5\x3f\x65" + "\xd2\xfe\xef\x1b\x3b\xc5\xdf\x9c\xb5\x8b\xb1\xe5\x5e\xde\x6d\xb9" + "\x8d\x62\xe8\x7c\x63\x2f\xda\x45\xfb\xf2\xdf\x2c\xe8\xb9\x2f\xff" + "\xcd\x7a\xfc\x8e\x33\xd6\x0a\x2c\x6f\x4d\xc5\xbd\x3d\xf0\x6b\x5d" + "\xdf\x55\xf2\x8d\x1d\x70\x14\x3c\x56\xff\x68\xe2\x37\x42\xe7\xb3" + "\x99\xe4\xa2\xa8\xe2\x6a\xd9\xdf\x43\x6e\x3c\x87\xf3\xa8\x23\x89" + "\x5a\x7f\x5d\x78\x36\x59\x8a\xb0\xae\x45\x01\x26\x23\xd0\xe7\xa8" + "\x23\x15\xd4\x5f\x6a\x6f\x47\xd4\x6f\x1d\xc1\x67\x1d\xa9\x4c\xea" + "\xbf\x3b\x0a\xdf\x01\x96\x7c\xec\xd3\x76\x1d\x9e\x1a\x9c\xe8\x7c" + "\x8f\xa1\x03\x65\x48\x3e\xe8\x1b\x3a\xbb\xea\xd0\xf3\xfb\x61\x3f" + "\x82\x89\x7d\x7f\xaa\x0b\x32\x71\xb8\x7e\x8e\xb2\xab\xa4\xb5\xe0" + "\xfd\x1c\xb9\x37\x42\xdf\x76\x06\x7d\x4b\xbe\x42\x7a\xfb\x1e\x75" + "\x86\xcb\x3a\x7f\xeb\x38\xc7\xbe\x29\x97\xf5\xb6\xda\xfa\x9a\x4b" + "\x85\xa3\xc0\xdf\x55\xba\xe8\x2c\x17\xf1\x43\x93\x9d\x71\x9d\xcc" + "\x59\xa9\x62\xcd\xdf\xeb\x4e\x2e\xe4\x28\xe3\xdb\x7b\xeb\x3d\xad" + "\xfd\x5c\x0f\x5b\x85\x3d\x2f\xef\x2e\x66\xce\x82\xf1\x62\x6f\xec" + "\x02\x6b\x9b\xe7\x74\x0b\x5f\x0a\x74\x2f\xec\x21\x69\x3f\x9e\xd6" + "\x06\xc8\xd8\xfe\x38\x30\x2a\xf2\xee\xa6\x74\xa4\xd1\x19\xae\x3d" + "\x41\xef\xf8\x96\xaa\x1a\x39\xa7\xda\x6e\x26\xde\x42\xb4\xd7\xfb" + "\x84\x83\xda\xac\xda\xab\x6a\xa8\x0f\x45\x90\xff\x28\xf6\x2d\xcd" + "\x09\x4b\x1e\xe9\x0a\xbf\xbd\x0c\xbc\xe3\x6a\x79\x55\x4d\xff\xfa" + "\xf0\xad\x83\xea\x2c\xf2\xf2\x0b\xee\xa8\xaa\x1a\xe2\x49\x36\x17" + "\x0e\x08\x7f\xac\x92\x3b\x3a\xa2\xf7\x82\x16\xb6\x99\xdf\xcf\x97" + "\x63\xd3\xbf\x72\xdb\xcc\x7a\xdf\x77\x6b\x7d\x47\x5d\xc2\x1f\xc2" + "\xb8\x0a\x19\x1f\x07\x79\xd2\xfa\xd4\x59\x61\x9c\x89\x1f\xc0\xda" + "\x70\x55\x83\x45\x95\x7f\x6d\xe8\x5f\x3b\xaa\xfe\x81\x3a\xae\xc9" + "\x3a\xfe\x1e\xfa\xcf\xd5\xf1\xf7\xd0\x1b\xd5\x21\xf7\xe2\xff\x6e" + "\xef\xbf\xec\xf8\x77\xe1\xd7\x12\xf4\xd3\x25\x69\xe6\x79\xc5\x07" + "\xf9\xcd\x6b\x3a\x44\xeb\x47\x11\xd9\xdd\x52\xac\x20\xaf\xbd\xb8" + "\xba\x2e\xbf\x9b\x39\xf2\x3e\x61\x2d\xec\xef\x27\xe9\x9b\xba\x5c" + "\x92\xd9\x8e\x24\x5e\xdb\xf2\xdb\xe4\x6b\x86\x36\x17\xc1\x7b\x17" + "\xc6\x61\x67\x10\x9e\xd5\x77\x7e\xc2\x9c\x99\xa4\x5f\x6d\x20\xbd" + "\x76\x22\x8f\x3a\xe4\x56\x41\x1b\xc0\xa3\xfb\x04\x3c\xc0\xbf\x48" + "\x79\xeb\x8d\x46\x21\x6f\xb9\x85\x2f\xf0\xa1\x22\x06\x50\xc9\xdb" + "\xed\xa4\xfb\xf6\x5d\x4b\xb7\x74\x95\xb0\x34\x8a\x0d\x44\x7a\x67" + "\x6e\x4a\x9a\x34\xcb\x1b\xc2\x85\x3c\x05\xde\x9f\x62\x03\x39\x3b" + "\x5d\xcc\x07\x3e\xba\xf2\x0a\x8b\xa9\x04\xef\x09\x9a\x6d\x22\xba" + "\xbe\x47\x8b\x0f\xb4\xe9\x4a\x20\x3e\xd0\x6e\xd2\xf5\x34\xe2\xfe" + "\x0a\x0b\xf5\x95\xbf\xd1\xb8\xf3\x0a\x8b\xdf\x95\xc7\xac\x3b\x49" + "\x97\xf7\xad\xe4\x7d\x84\x9d\x3c\xc5\x0a\x5a\x6a\xa5\xbd\x84\x00" + "\xef\x43\xbe\x3f\x02\x74\x4b\x8c\x65\xff\xe0\xdd\x2e\xd6\x41\xaf" + "\x7d\xaf\xc9\x6b\x3a\x52\x01\xd8\x39\x90\xc6\x00\xbf\x82\xde\xc6" + "\x56\xb7\xb7\xd9\x1a\x14\xdf\xe9\xfd\x78\x49\xdf\x5d\xec\x7c\x4a" + "\x5f\x38\xe1\xdb\x99\xce\xc6\xb5\xb3\x44\x69\x03\x30\x08\x6b\xe2" + "\xf9\xfd\x64\x1f\x59\xb8\x98\x99\x7d\x3b\xe7\x28\x45\x7b\x59\x88" + "\xd3\x9b\xcc\xe8\x57\xf8\x1d\x6f\x1d\x97\xc3\x12\x69\xff\x81\xf6" + "\x4a\x2c\xaf\x89\xfc\xab\xe2\x0b\x58\x62\x70\xd9\xa9\xd2\x88\x44" + "\x04\x55\x58\x45\x16\x24\x2b\x17\xe6\x66\x5b\xe6\xaf\x58\xb6\x2c" + "\x6b\x49\xae\x65\xc6\x63\x69\xd7\x9d\x75\x2b\xc3\xba\x60\x5c\x3b" + "\x75\xb6\xd1\x9b\x6a\x91\xf1\xb9\x2e\x26\x92\xbd\x2e\x2f\x4a\xaf" + "\x90\xfc\xe7\xc5\x7b\x25\xcf\x3e\xd5\x24\xcf\xda\x5d\x4c\xd4\x9e" + "\x0f\x03\x9f\x6f\x6b\x63\x17\xc4\x7a\xaf\xee\x34\xef\x03\x6e\x2a" + "\xe7\xd8\x85\xaf\xc9\xc6\x41\xe2\xe9\x85\xf7\xc9\x6f\x84\xb4\x85" + "\x38\x7f\x50\xda\x42\x5c\xf0\xfb\x7f\x91\xb6\x5f\x7b\x5d\x64\xf7" + "\x40\xfb\xdb\x72\xee\x5d\x28\xd6\xe7\x1e\xf2\x6e\x04\xff\x64\xea" + "\x3f\xcd\xb9\xb0\x51\xea\xcc\x2e\xd4\x02\xfe\xe9\x9a\xcd\xe3\xc8" + "\x66\xb4\x9d\xda\x82\xf7\x69\xd4\x9e\xc0\x99\xa1\x8b\x37\xf7\xf4" + "\x97\xa3\xf5\x71\xa7\xf9\x0d\xa9\x0f\xbf\x78\x2f\xf5\x07\xdf\x25" + "\x07\xa5\xc7\xa1\xef\xc9\x5a\xba\x9b\xbe\xef\x75\x1c\xa6\x2d\x99" + "\xbf\x74\xb1\x6d\x5e\xee\xc2\x97\x16\xe6\x2c\xcc\x5d\x25\xdc\x41" + "\x24\x88\x7f\x8f\x8f\x5e\x30\xfb\xfa\xd8\x06\x56\xd2\x8b\x68\x3e" + "\xd1\x3b\xc9\xa6\x41\xea\xa6\x2e\x9e\xf0\x96\xb0\x29\xfd\x83\xc1" + "\x45\x41\x67\x2a\x85\x8f\x98\x8b\xa7\xc1\x1f\x87\x6b\x7b\x14\xed" + "\xd2\xfe\x53\xbe\xef\x30\x1d\x29\xb6\x8c\x60\x93\x9b\x59\xc7\x06" + "\xda\x9b\xc2\x98\x34\xd0\x1a\xb6\x69\x35\xad\x35\x0d\xac\xce\x8b" + "\xf5\x4c\xec\x57\xbb\xdf\xa5\x98\x67\xc4\xc7\x01\x46\xfb\x9a\x99" + "\x5b\x8c\x3b\xbf\x68\xde\x27\xfc\xbe\x5c\x34\xbf\x41\x78\x43\x6d" + "\x56\x79\xfa\x4e\xce\xd3\x77\xa8\x17\xb3\x77\xf2\x8b\xd9\x3b\x02" + "\x7e\x55\xdd\x07\xf1\xed\x81\x66\xad\xac\xb2\x0b\xec\x00\xd1\x2a" + "\x7a\x36\xe6\x9a\x20\x9f\xed\xad\xa1\xf6\x38\xdd\x89\x4c\xfa\x82" + "\x70\x1f\x74\x76\x8e\x67\xe0\xff\x1a\xc4\x79\x4f\xb1\xc7\x06\x1e" + "\x0d\xdf\x39\xd1\x2e\xa7\xbb\x9b\xf8\x81\x1a\x15\x7c\x1a\xfa\xdb" + "\x02\x9a\x25\xe2\xb2\x51\x9f\x77\x81\x4f\x27\xbb\x8b\xae\x12\x37" + "\xf8\xd0\xf3\x8d\xc1\xb6\x37\x04\x83\x4d\x78\x4f\xb6\x17\x72\xfc" + "\xdd\x97\x69\xfc\x00\xe3\x07\x02\x38\xf0\xdd\x20\xea\xdf\xf4\x16" + "\xfe\x15\xb7\x27\xa4\xca\xf1\xfe\xee\x56\x2d\xed\x62\xc0\x17\xc5" + "\x77\xf7\xe2\xf9\x1a\x7e\x2a\xb7\xdf\x93\x1d\xb4\x3f\x4c\xef\x84" + "\xdc\x4d\x76\x24\xb6\xd5\x34\x57\xbe\xcb\x92\xeb\xfa\x3d\x3f\x77" + "\x17\x65\x87\xe0\x1b\x1f\x9d\x57\x95\xf0\xfd\xee\x17\xce\xf5\x17" + "\x74\x7b\x0b\xb4\xe9\xd2\x68\xc7\xcb\x5e\xb2\x41\x8b\x71\xb6\x78" + "\x85\x7d\xa3\xe6\x7f\x44\x51\x4b\x2e\x4e\x26\xbb\x78\xc8\x68\x11" + "\xbb\xa2\x65\x5c\x91\xae\x92\xef\x02\xfe\x9f\x4d\x92\x6f\xa3\xb9" + "\x45\x71\x23\x85\xed\x08\xf8\x23\x6a\x13\xcd\x2d\xd4\xd5\x42\x7b" + "\xcd\x72\x8e\x7d\xe7\xfe\xe7\xe6\xd8\x77\x6e\xea\x0b\xca\x5a\xcf" + "\x0d\x45\x7c\xdc\x46\x96\x29\x6c\x01\xbc\x9d\x74\xce\x38\x14\xf4" + "\x3f\x41\xd2\x8f\x8e\x79\xc2\x5e\x24\xaf\xbd\x8a\xce\xf2\xee\xe9" + "\x66\x11\xaa\x3d\x29\x91\xf8\xe5\xba\x02\x61\x43\x11\x8e\xef\xaa" + "\xc9\xc6\x82\x6c\x06\x23\x45\x5c\xd2\x4f\xd8\x9e\xcb\x2c\xb4\x85" + "\x5d\xb2\xd1\x9e\x4e\x00\xd6\x97\x4e\xd0\x1e\x1e\xdf\x32\xc6\x65" + "\x2c\x30\x6c\xa0\x32\xd4\x2b\xe7\x27\xe9\xdf\x81\x47\x1c\x48\xdf" + "\x35\xb3\x4b\x6f\x8a\xef\x28\xaf\xf0\x53\x63\x9a\x83\xb5\xd3\x44" + "\xf9\xbd\x78\xde\xad\x9a\xd2\x38\xe8\xba\x2f\xcf\x5b\x8d\x77\xb3" + "\x55\xfb\x6f\x1d\x48\x4b\x17\x7b\x09\xd7\xcc\xb4\xc7\x08\x9c\x2b" + "\xa8\x72\xba\xbe\x71\x88\xf6\xd0\xd9\xe3\x5c\xac\x81\x42\xbe\xb8" + "\xe4\xdb\xfd\x2d\x0b\xb5\xbd\x4c\xe3\xd9\x21\x79\xec\x0b\x6c\xbf" + "\x6c\x5f\x47\x79\xc7\x96\x09\x96\x0e\xe0\x6b\xa7\x21\x9c\x1d\x33" + "\x93\xcd\xfc\x91\xe2\x63\xe6\x6e\x8c\x4f\x47\xba\x2b\x74\x8c\x66" + "\x43\xdb\xe1\x9f\x9b\x84\xa3\x21\x66\x53\x11\xde\xe7\xeb\x36\x4a" + "\x84\x97\x1b\x45\xfc\x80\x4b\x69\x04\x37\x17\x73\x87\xd7\xe5\x04" + "\xfc\x77\x77\xc8\x73\x7a\x26\x7c\xe3\xf7\x7f\xef\xbb\xa2\xd6\xa2" + "\x1d\xe4\xe7\x28\xdf\x97\xa7\x36\xd1\x1e\xf8\xcc\xcb\x2a\xa7\x33" + "\x0c\x74\x1e\x85\xe4\x97\x59\xf9\xbc\x83\xe4\x31\x3a\xfb\x45\xfb" + "\xdf\x74\xfe\x3e\x30\x4f\x3a\x3c\xfa\x39\x7c\x7d\x6e\xd0\xf9\xae" + "\xb2\x45\x62\x9e\x92\x4d\x6b\x84\xd8\x03\x08\x79\xe5\xdb\x99\x9d" + "\x28\xf3\x82\xd8\xbb\xea\xd8\xad\x95\x43\xfe\xd8\xba\x4a\x3a\x27" + "\xeb\x65\xa8\x64\x0f\xbc\x4c\xd8\xe3\xb9\xe4\xf7\xd2\xde\x67\x66" + "\xa7\x2a\xce\xe5\xd0\xf7\xd2\x0e\xa7\xd3\xef\xff\x4d\x9e\x95\xe9" + "\x2c\xd6\x6d\xc6\x70\xbf\xd1\x7f\xd6\x0f\x30\xed\xb0\xef\xad\xe9" + "\x04\x7d\xe8\xb4\xef\x0d\xc7\xbb\xfd\x98\xd7\xdf\xf3\xf5\xd1\x43" + "\x27\x41\xf1\x0d\x57\x30\x83\x1a\x9d\x34\x87\xfc\xaf\xd0\x19\x56" + "\x69\xc7\x7e\x79\x90\xe6\x8b\x25\xe4\x02\xeb\x3c\x11\xd8\x0b\xf7" + "\x69\x7a\xdc\xcb\x89\x52\x8e\xb8\x9c\x28\xf4\xb8\x5b\xf6\x56\xff" + "\xc7\x6a\x8f\xa1\x7a\xb5\xcb\x20\xed\xeb\x2e\xc7\x83\x93\x09\x8a" + "\x81\xd1\xd9\x42\x65\xf5\xce\xf7\xa5\x2c\x90\x65\x5e\x11\xb1\xe2" + "\x02\x72\xf9\x15\xc1\xd3\xd1\xbe\xb5\x4a\x3c\x5c\x74\xb1\x83\xec" + "\x94\x9c\xb6\x4b\xa4\xcf\x0d\x93\x3a\x02\x99\x47\xb3\xdb\xbc\xa9" + "\xad\xe7\x73\x34\x3d\x4b\x98\x5d\x3e\xa8\xef\x0d\x95\x19\x54\x8a" + "\x71\xc9\x8b\xaa\x40\x2f\x6d\x9d\xc2\xb7\x83\x13\x3c\x21\xea\xe0" + "\xb6\x65\x74\x36\xf2\xf2\xb7\x14\x37\x4b\xce\xcd\x2b\x62\xff\x46" + "\x2d\x99\xc2\x8b\x48\x2e\x72\x53\x3c\xad\x4b\x0c\xf9\xa2\x50\xf6" + "\xb0\xe3\x05\xed\x64\xe7\x15\x4f\xb1\x92\x5b\xb4\xba\xdd\x51\x29" + "\x0b\xee\x88\x60\x99\x5d\x25\x57\xac\x2e\xf6\x61\x55\xff\xe9\xc6" + "\x15\xeb\x8d\x78\x64\xc9\xb3\x25\xb3\xbe\xe4\x6c\xd2\xa3\x8c\x45" + "\xfd\x33\x38\xb5\xbf\x6b\x98\xd7\xe0\x01\x5f\x36\x90\xdf\x5d\x9c" + "\xcf\xbc\x25\x03\xb9\x6f\x35\xc6\xab\xc3\x0c\x39\xac\x96\xd5\x4b" + "\xdb\x17\xda\xbf\x37\x16\x76\xf2\x4b\x4e\xef\x41\xd2\xe3\xbb\x25" + "\x9f\xd2\x35\xd4\xe9\x3d\xc2\xc8\x5e\x9b\xe8\x4d\x33\xbb\x72\x95" + "\xda\x35\xd6\x56\xcc\xee\xb9\x40\xef\xaf\x1c\x92\xfc\x5b\x57\x8c" + "\xbc\x5e\x69\x21\xdf\xd3\xc1\x6d\x7a\x7c\xc5\x92\xf9\xe4\xc0\xfc" + "\x9e\xe9\x59\x79\x59\x39\x96\x67\xc8\xbd\xf9\xf5\x76\xa0\x81\x58" + "\x9a\x5d\x2e\x5a\x5f\x89\x87\xa6\x98\x9a\x37\x8a\xa7\xa9\xc7\xd2" + "\xc4\x9c\x8b\x27\xbd\xf3\xbf\x32\x9e\xa6\xce\x23\x53\x2c\xcd\xc0" + "\x1e\x8c\xa7\xca\x3f\x07\xd4\xa3\x5d\xf4\x2c\xd6\xf4\x92\x2e\x0b" + "\xcd\x23\xb9\xbe\x78\xcc\xc1\x7e\xb0\x84\x3f\x97\xf2\x82\x2a\xa4" + "\x27\xea\x67\x58\x81\x8b\x11\x78\x4e\x0e\x9c\x99\xf1\x4c\x07\xdc" + "\xa4\x9f\x53\x93\xc8\x3b\x47\xb7\x55\x10\x7e\x48\x35\xdb\x0a\xb5" + "\x74\xd2\x69\xa9\x1f\xf4\xcc\xdb\xad\x0e\x0c\x97\x7b\x53\x9e\x0d" + "\xfa\x99\x2c\x39\x37\x8f\x6a\x73\xd3\x53\x75\x23\x7b\x92\xc0\xdc" + "\xf0\x34\x05\xe6\xf5\x57\xfa\xb7\x4d\x3f\x64\x8b\xa2\xc9\x69\xc3" + "\xda\x58\xf7\x77\xa4\x33\x94\x67\xb0\xbb\xc5\x19\x3a\xe9\x5f\xa3" + "\xfb\x8f\xda\x3d\xea\xe8\xde\xa5\xdd\xdf\x82\xfb\x5f\x68\xf7\xe0" + "\x17\xbb\x17\x6b\xf7\x98\xb3\xdd\xcf\x6a\xf7\x31\xb8\x7f\x44\xbb" + "\xc7\xda\xd1\x3d\x5a\xbb\x8f\xc5\xfd\x50\xed\xfe\xe6\x36\x76\xf5" + "\xb2\x76\x8f\x39\x78\xf5\x8c\xb6\xaf\x1f\x7e\x8e\x5d\x3d\xd9\x7f" + "\xb9\xf1\xea\x56\xc9\x07\x5f\x3d\x0d\xfe\x28\x5b\xae\x3d\xfe\xb4" + "\x56\xe0\xf6\x24\x1d\xbe\x48\xdf\x48\xf5\x74\x95\x74\x83\x9f\x6d" + "\xb1\x04\xa5\x6b\xbe\xad\xbb\xcd\xa0\x73\x07\x83\xd2\x6d\x5a\x7a" + "\x22\xe4\xd3\x94\xa0\xf4\x05\x5a\x7a\x2a\xe8\xe7\xe4\xa0\x74\x6d" + "\x1f\xbb\x3b\xd3\xc5\xfe\x3a\x3b\x28\x7d\xba\x96\x9e\xaf\xdb\xd1" + "\x68\xe9\xc9\x5a\xba\xdd\xc5\x3e\x0b\x0d\x4a\x9f\xa8\xa5\x83\xfe" + "\x7b\x0e\x04\xa5\x0b\xba\x22\xfd\xfd\x1b\xf9\xb1\x02\x9a\x5b\xdd" + "\xe0\xff\xff\xd2\x19\x94\x27\x4e\xfb\xb6\x05\xe9\x71\x41\xe9\x26" + "\x2d\xdd\xeb\x52\xc6\x04\x97\xd9\xa7\x3c\xaf\x54\xb0\xcc\xbe\x74" + "\xeb\x14\x03\x43\xd8\x26\x0b\x3e\xdb\xfb\x20\x9d\xf1\x32\xee\xe2" + "\xcd\x96\x42\xce\x9b\x99\xd7\xa2\xd9\xcf\x5a\xc8\x96\x51\x9e\x97" + "\xf3\x86\x6b\xbe\x12\xdc\xe2\x0c\xdd\x6a\x4a\xbb\x26\xe2\x3a\x8d" + "\xcb\x2f\x96\xbe\xe8\xf5\xb8\x46\xa4\x63\xd2\xf6\xdf\x91\xe7\x8f" + "\xa4\x73\xa7\x72\x48\x0f\xed\xcc\xed\x96\x71\x0a\x20\x8b\x52\x1a" + "\xe9\x5a\x08\x1e\xc1\x3a\x25\x49\xf7\xbd\x0f\xaa\xdd\x74\x4e\x55" + "\xea\xa3\x68\x2e\x52\x7e\xb2\x19\x0b\xce\xeb\x62\xde\x49\x74\x0d" + "\x31\x47\x7d\xd6\x55\xe2\x35\x07\xce\x07\x5d\xb3\x69\xe9\x9f\x22" + "\x3d\x31\x28\x7d\x4e\xdf\xb4\x1d\xf4\xce\x74\xb7\xf5\xda\x15\xde" + "\xe9\xbd\xc2\x3d\x65\x7f\x45\xbb\x5f\x16\x76\x7a\xb7\xf9\xec\x77" + "\x4f\xa2\xf3\x33\x14\x87\xd8\x9b\xc7\xdd\x64\x97\x88\xf4\x21\x33" + "\x3b\xdd\xe0\x31\xba\xf8\xa6\x97\xc8\x06\xf5\x32\xa3\xfd\xd1\xa2" + "\x76\x8a\x69\x69\xe4\x74\x2e\x7b\xcd\x79\x16\x41\xe7\x6b\x76\xbf" + "\x4c\xef\xcf\xb0\x19\xd9\x6e\x56\x97\xed\x63\xbb\x51\xf6\xae\x97" + "\x74\xfe\xc2\xdb\x10\x38\xfb\x3b\x86\xf6\x93\x6f\x2b\x12\x71\xd7" + "\x7d\xd2\xae\x66\x2d\xed\xeb\x1f\xd9\xcf\xff\x44\xbc\x71\x55\x83" + "\x71\x2d\xb3\x60\x6d\x8f\xc0\xbd\x43\xfe\xf0\x0e\xe9\x7d\xf5\x49" + "\xce\x65\x5f\xaa\xa4\x35\x77\xef\x97\xf4\xc2\x97\xca\x7f\x4b\x72" + "\xa1\x8f\xf6\x83\xf7\x83\x0f\xdf\xdf\xdb\xf7\x6b\x76\x31\xc3\xb5" + "\x2d\xe0\x4d\x2e\x1c\x32\x48\xfa\xa4\x4e\x52\x0d\xe1\x6b\x49\xdf" + "\x2d\x62\x2e\x6f\x49\xca\x39\xb0\xc4\x63\xa8\x5b\xdd\xc2\x5e\xbb" + "\x99\x99\xe7\x78\x0c\xc8\xe3\x7b\x37\x32\x97\xfc\xe5\xef\xad\x06" + "\x3f\x6b\xf8\xdf\xf1\xfe\xbd\x25\x87\x0c\x5e\xc1\xaf\xa8\x93\x84" + "\x8e\xd4\x9e\x44\x76\xc7\x46\x67\xa3\x8f\x78\xf1\x08\xf0\xe2\x89" + "\xa0\xff\xe1\xbe\x95\xd9\xd1\xde\xe5\xd9\x43\x76\x2d\x63\x11\xbe" + "\xe5\xd6\x98\x5f\x5f\x61\x93\xf4\xf5\x67\x57\x1e\xd6\x94\x2e\xf3" + "\xe0\xcd\x58\x53\x48\xf7\x12\xa9\x98\xc4\x5e\x30\xdd\xab\x86\xaf" + "\x33\x77\xe7\xdd\x38\x7e\xbc\x6f\xa5\x55\xf8\x8f\xa0\xb6\xf4\xd6" + "\xd7\x8d\x3b\x58\xa8\x4f\x3b\x67\x5a\x78\x96\xc5\x82\x7f\x36\x44" + "\x5e\xe6\x8e\xb6\x1c\x66\xa0\x98\xdb\x85\x59\x42\xbf\x39\xa0\x2e" + "\xdb\xcb\x9c\xf9\x5f\xb2\xc2\x65\x34\x46\xea\x26\xe2\xd3\xc8\xa6" + "\x18\xf9\x4d\x6d\x4c\xdd\x65\xf4\x60\xcd\xf0\x80\x27\x5f\x44\x72" + "\xb1\xfa\x07\xe9\xaf\x42\xed\xa4\x73\xa1\x8e\x65\x8f\x52\x5a\x5d" + "\xd1\x59\x61\xbb\x13\x2f\xe7\x96\xba\x9f\x9e\x8b\xe8\xdc\x6b\xf4" + "\x63\xf9\x6f\x77\x7b\x06\x48\xdd\x84\xfa\xa6\xb6\x3e\x54\x49\xd9" + "\x4e\xdd\xdf\x17\xee\xaa\xf6\x71\xa9\x9c\xe2\x8d\x56\x12\xff\xca" + "\x5d\x62\x9f\x9d\x7c\x00\xe4\x4f\x71\xf0\x2b\x76\xcd\x37\x11\x5f" + "\xac\x96\x8f\x4b\x95\xfe\x49\xb9\x6e\x23\x87\x35\x72\x5c\xba\xdc" + "\x63\x18\x97\x2d\x75\xee\xe3\xf2\xd7\x8d\xa0\xf3\x01\x3c\xa7\x23" + "\x6a\x1c\xd6\x38\x9e\xdc\x11\x9d\xda\x2b\x7e\xc9\xf5\x28\x21\xdf" + "\x72\x1b\x8b\xa1\xbd\x9e\x0c\x9f\xf4\xf3\x2b\xe6\xb0\xc2\x6c\xbc" + "\x5c\xbc\x1b\xd9\x6c\x63\x21\xd2\x97\x36\x3f\x32\xae\x92\x51\x9c" + "\x8a\xa1\xdc\x34\xce\x2a\x6c\x0f\xed\xe3\x26\x39\xdb\x29\x06\x9a" + "\x8f\x89\x3d\x23\x85\x15\xf0\xa8\x71\x56\x91\x5f\x61\x43\xeb\xdb" + "\xd1\x07\xd3\x58\x8f\xd3\x73\x9e\x69\xe5\xa2\x8d\x63\x3d\xdc\x3e" + "\x2e\x5c\x9c\x1f\x57\xd8\x8b\x3a\x5d\x15\x38\xaa\xb0\xa7\x25\xdc" + "\x12\xf2\x05\xdc\x50\x9e\xb6\x5e\x8d\xa4\x7b\xac\xdd\x89\xc2\x86" + "\xa4\x94\xa5\xea\x3c\xb2\x4b\xcb\x43\xdf\xe0\x5e\x9c\x75\xc0\xfb" + "\x6c\xf4\x9d\x69\xef\x23\x28\x0d\xfd\xc3\x9a\xc5\xf7\x51\xbf\xfa" + "\xa2\xad\x02\x16\x05\x2c\x04\xfd\x13\xfe\xd9\x89\x4f\x71\x76\x4e" + "\x71\x38\x69\x0c\x14\x03\xc5\xee\x69\xa7\x7a\xc8\x7f\x10\xd1\x4d" + "\x94\x19\x4a\xe5\x05\xb5\xff\x5b\xbd\x2d\x54\x1f\xbd\xe3\xf6\xb1" + "\xc2\x9f\x29\x60\x15\x4e\x79\x68\x5c\xcf\xd9\x48\xf7\x76\x19\x30" + "\xeb\xa4\x72\x63\x08\x26\x12\x66\x8a\x5b\x93\xe9\xb5\x71\x50\xce" + "\xf6\x84\x87\x7c\x56\x4d\xa0\x0d\xcb\xd8\xf0\x36\xc5\x10\xa3\xc1" + "\x4f\xc6\xef\x51\x14\xe1\xa7\x41\xbe\x53\x56\x05\x7d\x7b\xab\x3f" + "\x2f\xda\x4d\xbc\x11\xd9\x06\xd0\x5e\x91\xc0\x57\x45\xd9\x17\xf4" + "\xdd\xbe\x8c\xef\x88\x47\x1e\xe3\x59\xb7\x5d\xc4\x43\x4d\xec\x2a" + "\x55\x0e\x05\xe0\x2d\xcb\xe9\xa5\x8e\xdb\xf4\x3a\x5c\x8a\x92\xaf" + "\xb7\x13\xf7\x72\x0d\x2e\x55\xbc\x81\x31\x51\xe2\xf4\xef\x48\xa7" + "\x83\x31\xaa\xa1\x18\xc5\x7d\xc4\x5c\x51\x9c\xc8\x5d\xef\x9d\xe2" + "\x10\xf8\xa8\x18\x72\xc9\x56\x1c\x38\x64\x96\x38\x64\x48\x17\x6b" + "\x21\xd2\xa9\x4c\xda\xef\x13\xbe\x6c\x4b\x0d\x39\x28\x77\x83\xd6" + "\xe6\x62\xd9\x06\x03\xe4\x3f\xfe\x3d\xbf\xb5\x8f\xce\x5b\x60\x49" + "\xbb\x57\x9c\xa1\xbd\x67\x85\x8d\x8e\xc7\x2e\x08\x3c\xf4\xe4\xb9" + "\x4d\x7e\x9f\x65\xa5\x86\x5a\xbf\xcf\x32\x7b\xca\x06\x09\xff\x10" + "\x33\xbf\xc2\xb7\xd2\xf9\x0d\x9e\xc7\x2b\xca\xc8\x37\xe2\x65\x36" + "\x9c\x62\xaf\x17\xda\xf8\x37\xf5\x36\xc8\xec\xa6\xa4\x8d\xa0\x1f" + "\xf6\xc2\xcb\x6c\x20\xd9\x06\x11\xfd\x21\xdb\x63\x1e\x85\xf4\xf2" + "\x24\xbb\xff\x5c\x9d\x32\xd0\x44\x67\x41\x79\x51\x3a\x78\xe9\xa4" + "\x7d\x84\x0f\x64\x27\x7e\x4e\x09\x23\xbf\xaa\xfb\xf0\x2e\x77\x93" + "\xd0\x25\x24\xb5\xfa\x4c\x29\x99\x45\xe7\x59\x98\x88\x9f\x99\xef" + "\x21\x9d\x9a\xa1\x59\x09\x59\x85\x32\x5b\x91\x1e\x29\xd2\x3d\x1e" + "\xf2\x9d\xd0\x8a\x77\x91\x78\xf7\x47\x5c\x55\x94\x91\x5f\x86\x76" + "\x17\x9e\x67\xb7\xa1\x2d\xad\xa8\x87\xce\x99\x9e\x2b\x5a\xcc\x62" + "\xeb\x6d\xad\x24\xdf\xa1\x3c\x17\xd3\xfc\x8b\xb4\x36\x2b\xa1\x83" + "\xd0\xaf\x7c\xd2\x89\xe0\x5a\xb0\x09\xd7\x42\x1f\x8b\x2c\x5c\x83" + "\x75\x6f\x0d\xea\xa7\x73\xaa\x28\x87\x7c\x8a\xc8\xb6\xa0\x6f\xa4" + "\x57\x43\xb9\x6b\xda\xf9\x39\x94\xdd\x5a\xd7\x8e\xf2\xf2\x1b\xfd" + "\x65\x6a\x3c\x35\xe6\x77\xd8\xb7\x7c\x4b\x6a\x2b\xda\x54\x41\xf6" + "\xd3\x48\x33\x21\xad\xc5\xcf\x0f\x2b\x61\x67\xb5\xfb\x41\xfe\xbc" + "\x45\xe9\xac\xf0\x2a\x33\x0b\x1b\x80\x95\x21\xac\x59\x09\xcb\x25" + "\xbf\x56\x81\x32\x43\xbf\xa3\xf2\x36\xa2\xbc\xa2\x2c\x36\x08\xb4" + "\x3a\x1c\x6d\xa4\x38\xe4\x5f\x0b\x38\x89\x39\x16\xea\x46\x5f\xec" + "\xd4\x27\x15\x63\xb7\x09\xf3\x01\xfd\x51\xd0\x9f\x41\x6b\x7c\xfe" + "\xb3\xb7\xd4\xa7\x28\x92\xe7\xa8\x5f\x72\x1c\xa7\x80\x7e\x4e\x89" + "\x58\x93\xcd\xbf\x46\xdf\x5a\xeb\xb2\x1b\x19\xd6\x1e\x63\xbd\xad" + "\x81\xce\x31\x7c\x2d\xe1\xd6\x4a\x76\xa0\xa0\x11\x53\x22\xfc\x7e" + "\xa0\x95\xb0\xc5\x68\xbb\x1b\xed\xda\xa8\xf5\x93\xd2\xb2\xfd\x3c" + "\xbd\x12\xb6\x50\xbb\x1f\xec\xcf\xfb\xbd\x7e\x0e\x68\x0a\xea\x27" + "\xbe\x1f\x18\x45\xe5\x69\xfd\x1c\x8c\x7e\x0e\xfa\x7e\x3f\x81\x4f" + "\x79\x7c\xbd\xd6\xcf\x0d\x5a\x3f\x0d\xe8\xe7\x60\xf4\x73\x44\x50" + "\x3f\xa3\xaf\xeb\x27\x78\x91\x29\x26\xf4\xb3\x39\xa8\x9f\xa6\x5e" + "\xfa\x19\xee\xa2\x3a\xca\xa7\x88\xd8\x0d\x3c\xcc\xb0\x51\x9c\x67" + "\x2f\x1d\xe0\x3f\xff\xa9\xd2\x39\xca\x2b\xc2\xa7\xd0\x41\xd2\xdf" + "\x90\xde\x88\x64\x3d\x3a\xb3\x99\xb1\x6a\x43\xb1\xd0\xdd\xc4\x4a" + "\xdd\xb4\xe0\xaf\x4a\xc3\x12\xfd\xe7\x27\xb6\x8b\xb8\x48\x9d\x94" + "\x2e\x7c\x00\x2c\x63\x42\xf7\x38\x6b\xd5\xca\x22\xfa\x9e\xbe\x45" + "\xfe\x4c\xff\x39\x2f\x65\x40\x8a\xd4\x87\xa6\xba\xe9\x9e\x7c\x5b" + "\x89\x76\x95\x1a\x2a\xc5\x5e\x41\x69\xd8\x46\xbf\x4e\x33\x8f\x1f" + "\x27\xb8\x88\xf3\xa9\xe2\x7c\x27\xdb\x90\xe1\xdd\xa0\x9f\x33\x6f" + "\x47\xde\x43\x41\xe7\xcc\xdb\x45\x1b\xba\x85\x2f\x87\x95\xb3\xbc" + "\x2b\xc5\x79\x73\xe4\x69\x0a\xd4\x1d\x3a\x47\xab\xbb\x95\xee\xdd" + "\xd2\xd7\x1a\xe9\xd8\x2c\xc2\xe6\xa5\x74\x60\xb8\x6e\x67\xe2\x52" + "\x42\x52\x68\x2e\xf7\x1a\x43\xa8\x74\x60\x62\x0f\xdf\x4e\x4a\xb8" + "\x88\x61\x82\xf4\x54\xff\xd9\xf1\xd2\x81\xb3\x7f\xe8\xec\x78\x91" + "\x1b\xe3\x84\xf9\x06\x9a\xad\x00\x57\x20\xe3\xa6\x64\x8a\x38\x3c" + "\xca\x40\x11\x5f\xae\x59\x19\x48\xfa\x5b\xa3\xf0\xfb\xa0\x0c\xfc" + "\x83\x46\x9b\x2b\x66\xf9\xbc\x46\x17\xea\x14\xbe\xa2\xfc\xcf\x03" + "\xf7\x93\xef\x0b\xe4\xfb\x5a\xf8\xd0\x47\x79\x3d\xf3\x8b\xf7\xc5" + "\xd7\x3d\x27\x5f\xf7\x6c\xe9\x04\xcd\xea\xcb\x9e\x66\xd3\x08\xa1" + "\xe3\x4d\x8e\x5c\xcb\x6c\x45\xdf\xb2\x10\xe0\xe2\x59\x6a\x5b\x7d" + "\xab\x38\x6b\x67\xe4\x25\x89\xcc\xd9\xea\x95\x7c\x3b\xf8\xa5\xe6" + "\x78\xe4\xf9\x96\xc5\xd2\x59\x0f\x8a\x53\x84\xfc\x6d\x22\x36\x91" + "\x32\xe8\x97\x73\x56\x0c\x66\xea\xcf\xd3\x87\x70\xc3\x6b\x16\xda" + "\xcf\x7f\xab\xdb\x45\xf1\x7d\x94\xc2\xdf\xb0\x38\xa2\x53\xc0\xe1" + "\x16\x6e\x28\xb0\xe0\x9b\xf6\xff\xe8\x6e\x1d\xe0\xf4\x7e\xc9\x6c" + "\xa0\x9f\x6d\xca\xa0\x82\xd0\x02\x16\xba\xf9\x1c\x33\x01\xcf\xbc" + "\xc7\x20\xae\xe8\xbe\x1b\x2a\xa3\xa5\x4f\x80\x4a\xe0\xe4\x72\x33" + "\xf7\x74\x95\x86\x83\x3f\xfe\x5b\x83\xae\xbf\xd8\x28\x7d\xb7\x85" + "\xa2\xfe\xa9\xc2\xcf\x84\xe4\x0f\x00\xdb\x41\xc3\xe4\xb9\xd1\x98" + "\x9f\x77\x95\x0e\x8a\xf0\xcb\x36\xca\xa0\x0a\x09\xc3\x94\xf5\x72" + "\x1d\x19\x54\x71\x0c\x92\xee\x7a\x69\x97\x14\x83\xbc\x93\xfc\x76" + "\x49\xa4\x13\xc4\x7b\x8c\xe1\x7a\x29\xf7\xa4\xac\xcf\xf0\x85\x6b" + "\x73\x9c\xd2\xc7\x78\xe8\x5b\x7c\x67\x14\x31\x54\x4b\x07\xe5\x06" + "\x70\x6d\xd0\x64\x5a\x4f\xd1\xa7\x08\x8c\x6b\x35\xf5\x8b\x60\xd2" + "\x49\x7e\xda\x94\xf0\x83\xc7\xf6\xf5\x11\x63\xcb\x74\xf7\x7e\xaf" + "\xd0\x2f\xed\xdd\x0f\x7c\x3a\x8f\x31\xb8\x89\x7c\x55\x39\x51\x4f" + "\xdd\xee\x6e\x56\x67\xee\x60\xf5\xb8\xa7\xf3\x07\x8e\x45\x7f\x83" + "\x84\xdf\xfb\x5a\xae\x42\x46\x83\x1c\x33\x89\xca\x22\x5a\x43\x36" + "\x9b\xe4\x53\xb0\x1e\x5c\x8f\x13\x94\x9e\xca\xa8\x53\x5b\x59\x5d" + "\x3e\xc9\xb0\x47\xf6\xd7\xef\xfe\x92\xd5\x9b\xff\x2c\xea\x21\x7e" + "\xdb\xb1\xac\xe3\x46\x65\xd3\x59\xd6\x74\xad\xec\x76\x94\x1d\xd3" + "\x77\xd9\x55\x0d\xfd\x2c\xbb\x1f\xed\xae\x72\xf4\xa7\xec\xa2\x0a" + "\xee\x03\x1d\x1e\x8a\x35\x32\x91\xfc\xad\xd2\x39\x53\xdf\x15\xf2" + "\x31\x33\x52\xc8\xea\xe7\x94\x21\xaf\x12\xbd\x11\x36\x1a\xe5\x49" + "\x09\xe2\x0c\x2a\xe9\xd9\xb5\xb3\xa7\x4e\xef\x59\x46\x7a\xf7\xae" + "\xd2\x21\x73\x02\xb2\xa8\x7f\x7f\xda\xe4\x52\x86\x14\x4b\x7b\xe7" + "\xa4\x04\x89\x5b\x43\xee\xa3\xb2\x7a\x97\x39\xa7\x64\x0b\xbb\x79" + "\x65\xc8\xbb\xba\x7e\xab\x23\x6a\x4a\xb6\x56\x96\xe5\x7a\xbd\xa9" + "\xe6\x18\xc8\x92\x95\x9f\x6b\x91\xfe\xab\xb5\x03\xd7\x83\xd9\x33" + "\x59\xf3\xb3\x16\xe6\x65\x2d\xb0\xcc\x5e\xb1\x6c\xc9\x3d\x4b\x5f" + "\x7e\xd9\x32\x23\x6b\xf9\xf2\x79\x3f\xcf\x1a\xcc\x66\x2f\x9b\xb7" + "\x64\xf9\x42\xd2\x6d\x5a\x2c\x29\x13\x32\xb2\x97\xe6\xde\x93\x94" + "\x92\x78\x9d\x6e\x93\xce\x5f\x37\x91\x8c\x83\xf5\x29\x16\x3c\x46" + "\x14\xf9\x19\x32\xae\xe2\x8e\xd7\x20\x5f\x03\x07\xdb\x68\x2d\xa4" + "\xf5\x87\x64\x2f\xd0\xe8\xd3\x58\x33\x6a\x77\x6e\xe7\x0d\xe7\x94" + "\xdb\x5e\x05\xdf\xde\x48\xfe\x96\xb1\x66\x34\xf1\xee\x22\xb7\xd8" + "\x7b\x56\x6e\x9b\x41\xfe\x91\x7f\x85\x34\x77\x54\xca\xfa\xcd\x7f" + "\x65\xa1\x92\xc7\x88\xa8\xe5\x86\x81\x7c\x63\x2c\x3f\xce\xff\x66" + "\x66\x9a\xff\x7d\x83\xd3\xe5\x21\x3b\x9e\xf0\x59\xde\x22\x4e\x34" + "\x55\xce\xaf\x88\x3a\x09\x97\x71\xa9\xe2\x3c\x81\x72\xdb\x3d\x24" + "\x23\xae\xa3\x98\x9e\xa5\x11\xa0\xff\x6a\x4a\x80\x56\xc7\xea\xbc" + "\x79\x23\xe0\xbe\xb2\x19\xcf\xc2\x77\x4a\xd8\xd0\xf0\x1e\x36\x5a" + "\x4a\x64\x2b\x53\x46\xa4\xc9\x1f\xbe\x51\x46\xcc\x91\x3f\xba\x0f" + "\xfe\xdd\x66\x92\xbf\xeb\xd3\xff\xab\x3f\xbd\xfe\x7f\xba\x8c\xda" + "\x1f\xf8\xfd\x03\xf5\x8b\x7e\xff\x37\xf6\xff\xbf\x54\xc6\xe9\x1b" + "\xfd\x08\xdf\x80\x5b\x4d\xbf\xfa\x2b\x0b\x07\x7e\x6e\xdd\xf4\x12" + "\x70\xfa\x0c\x33\x17\x78\x79\x4b\xd1\x8b\x2c\xae\xf0\x5b\xf0\x60" + "\xe0\xb5\x72\xf3\x79\x4b\xe1\x15\xfe\x35\xf0\xe6\x75\xe0\xef\xa1" + "\xb2\x66\x16\xb1\xa9\x19\x7c\x56\xae\x8c\x6b\x44\xfb\x4d\x74\xd6" + "\xca\x89\xe7\xda\x3c\x0f\x3b\xe5\xfe\x8e\xec\x1a\x1d\xf5\x99\x4c" + "\x78\x51\x20\xfc\x8d\xc8\x64\x31\x95\xb1\xfc\x30\x2f\x79\xbb\x89" + "\x1b\xde\xae\x45\xda\xe9\x77\xd4\xe4\x01\xef\xac\xae\x19\x60\x79" + "\x89\xd6\x79\xe3\x26\x0d\x37\x87\x89\xb3\x84\xb8\x12\x0e\x92\xdf" + "\x6e\xb1\x6f\xa1\xc4\x96\xcb\x35\x3d\x76\x9e\xa6\xcf\xa3\x7b\x11" + "\xdf\x07\xfd\x38\xc4\x4b\x5e\xb3\x50\x99\x6f\xab\x87\x06\xd0\x9a" + "\xf9\xce\xea\xe4\x01\x05\xf3\x98\xa1\xde\xd5\xc6\x8e\x81\x16\xd2" + "\xfe\x38\xe6\xdd\x01\xcc\xb3\xea\x5d\xb1\xdc\x8e\xf6\x6d\x04\x3f" + "\xb7\x01\x6d\xda\xdf\x55\x6a\xa4\xf5\xa7\x5d\xe3\xe5\x1c\x98\x17" + "\x07\x36\x21\xcf\xac\x15\x6c\xe4\x26\xe4\x03\x6f\xb7\x81\x64\x14" + "\xd9\xbe\x9b\x2e\x03\x06\x07\x51\x67\x83\x65\x2e\x3d\x47\x09\x1e" + "\x83\xea\x46\x3f\x2c\xcd\x4a\x94\x90\xf9\xa9\x0e\xbd\xde\xae\x52" + "\xd3\x1c\x97\x32\x78\x9f\xb6\xc7\x68\x97\xe5\x98\x36\xc8\xf9\x9a" + "\x74\x90\xe2\xd3\x6a\x67\xb5\x0e\x6e\x5a\x8d\x75\xbd\x9b\x85\xa3" + "\x8e\xad\xa8\xc3\x61\x5c\xcb\xb8\x91\xce\xf9\x36\x79\x21\xd7\xa8" + "\xd2\x86\x56\x89\x5a\xac\x7d\x2b\xf8\x10\xc1\x7b\xf8\xc0\xdf\x0b" + "\xfd\x0c\xf8\x8f\x6c\xd0\x09\xf0\x1c\xe2\x8c\x04\xf8\x0d\x4a\x47" + "\x1d\x5b\xc9\xef\x39\xe4\xe6\x83\x58\xbb\xab\x89\x57\x98\x7b\xf9" + "\x49\x46\x7b\x1c\xc4\x2f\x2c\xcf\xe7\x1e\x11\xb3\xac\x34\x2a\x5c" + "\xe7\x17\x08\x3f\x88\x47\xd8\x34\x97\x85\x5e\xc3\x18\x03\x47\x6a" + "\xc0\x7f\x80\xa7\x8f\x4a\xd1\xc6\xa6\x46\xf0\x05\x5a\x8c\x72\x49" + "\xc3\xa3\x9e\xc6\xfa\x1e\x81\x3a\x6a\x5c\xca\x6d\x02\x16\x92\x06" + "\x45\x65\xea\x6b\x3d\xe9\x1c\x5c\x28\x83\x83\xd6\x01\x6e\x07\x13" + "\x32\x15\xe6\x52\x4c\xfb\x31\x16\x07\x29\x2f\xbe\x0f\x45\x7e\x3b" + "\xd6\x7d\x9d\xbf\x6e\x82\x4c\x00\x3e\x20\xca\x4c\xed\xc0\x37\xb5" + "\x80\x35\x8d\x45\x8d\x46\xc7\x4e\x4b\x1e\xe6\xa6\x3f\xe8\xb0\xc7" + "\x58\xaf\x0f\xc0\x3f\xaa\x29\x18\xfe\x80\xc5\x7a\x6d\x2c\x5f\x0c" + "\x1a\x3b\xc8\xa5\x37\x4d\x24\x3d\x34\xea\x3b\x2c\x74\x68\x4a\xf4" + "\x30\xf2\xe5\x06\x9c\x39\x0c\x58\x1c\x46\xbe\x43\x44\x9b\xd7\xfd" + "\x15\x34\xf7\x25\xe2\xa1\x6e\xba\x55\xf2\xa8\xd1\x87\x09\x87\xcf" + "\x29\xd1\x22\xc6\x68\x8b\x12\x15\x47\xe5\xe1\x79\x13\xae\xe0\x65" + "\xa3\x7f\x51\x54\x49\xb1\xb3\xa7\x08\x7f\xd5\x72\xac\xa7\xa0\x5d" + "\xd1\xb9\xfa\x39\x24\xc2\x01\x1a\x7b\xf4\x31\x4e\xea\x29\xa2\x73" + "\x49\xd7\x28\xbe\xbb\x96\x4d\x6d\x6c\xa2\xf9\xa9\xbf\x47\x7a\x2b" + "\xf9\xc0\x0d\x82\x4d\x9c\x36\x26\x87\x44\x1c\x5a\xe5\xa6\x61\x5a" + "\xdb\x68\xdf\x2f\x1c\x6d\x10\xfb\x10\x1d\xd7\xb2\x43\x36\xd3\x37" + "\x85\x81\x6f\x68\xfe\x00\x97\x8d\xf8\x66\x28\xae\x5c\xcf\x4b\xbe" + "\xf6\xd1\x8e\xad\xbf\x26\x5f\x64\x4a\xf4\x81\x8e\x6b\x56\x03\xc5" + "\xae\x40\xbd\x06\xc2\x0d\xc2\x0b\xbd\x8c\xcd\x12\x46\x07\x30\x7e" + "\x02\xbf\x8e\x79\x0f\xa1\x7f\x37\xcd\x76\xb1\x6b\xd2\xd7\x0a\xca" + "\xd1\xda\xe7\x10\xfb\x83\x61\x43\x8e\xef\x96\x7e\x83\x28\x5f\x41" + "\xc0\x36\x4a\xe7\x33\xa3\xc9\x2f\x40\x38\xca\xaa\xd5\x70\xc2\x88" + "\x7c\xfb\xfc\x38\x44\x3e\x07\x94\x9b\xe2\x89\xd7\xd4\xda\x4f\xb8" + "\x77\xab\x84\x5d\xd4\x71\xc2\x01\xf0\xf1\xda\x38\x47\x91\xbf\xf0" + "\x18\x89\x87\x37\xb5\xea\x65\x08\xbf\x05\x80\xb3\x8a\x32\x74\x5c" + "\x09\xa6\x0d\x5d\xa5\x31\x31\xa0\x0b\x7e\xbc\xd1\x69\x81\x2c\x73" + "\xd8\x0c\x8d\x0f\xd9\x8f\xb1\x69\x10\x31\x09\xc8\xaf\x95\xc0\xcb" + "\x61\x96\x63\x9d\x5e\xf6\x2b\xc2\xcb\xb9\x44\x13\x62\xd6\x74\x44" + "\xa7\x7a\x02\xb8\x1d\x93\xa3\xe3\x76\xd0\xb8\x0a\xdc\x5e\x2f\xe8" + "\x51\xcc\x46\x17\x4b\x9d\xad\xe3\x3e\xcd\x73\x15\xf3\x7a\x73\x9e" + "\xd8\x1f\x30\x92\x3e\x50\xcc\x7b\x4f\xbb\x90\x31\x68\x3c\xeb\xf3" + "\x5b\x84\xcf\xfb\x75\x2a\xc5\xa8\x38\x4b\xfa\x91\x36\x9a\xff\xfa" + "\x1c\xa7\xb1\x41\x5d\x0e\x8a\x73\xb0\x1e\x34\x90\xe6\x60\x27\xda" + "\x24\x62\x61\x44\xb3\xd0\xe3\x73\x92\xd9\x72\x8c\xed\xb1\x4c\x1a" + "\xb7\x61\x11\xfa\xb9\x87\xcd\x92\x06\x44\x68\xf8\x22\xda\x78\x1d" + "\x5c\x8d\x12\xae\xc3\x92\x7b\xce\xef\x68\x17\xcd\xef\x60\xb8\x12" + "\x4c\x09\xb6\xc8\x8b\xfe\x0f\x4e\xd5\xe1\x1a\x04\xd3\x33\x1a\x3e" + "\x6a\xb4\x75\x58\xaf\xb4\x95\x62\x07\x50\xac\x87\x75\xd4\x17\xac" + "\x29\x54\xbf\x88\xb5\xa6\xc9\x3e\xc7\xdd\x84\x53\xc3\x1a\x5c\xac" + "\xa0\x5a\xa7\x63\xc0\x15\x2b\xe1\x13\x8d\x95\x4e\x3b\x48\x57\xa6" + "\xb5\xdd\xab\x8f\x07\xb5\x3b\x98\x26\x60\x8d\x11\xf6\x5e\x81\x3e" + "\xc7\xde\x83\xef\xa2\x89\xb6\x05\xf8\xab\xd8\xc9\x3d\xfb\x1e\x1b" + "\x4f\x7d\x27\x9c\xb0\xe5\x91\xbe\x4c\xae\x65\x2e\xc5\x58\xdd\x93" + "\x5e\x19\x5f\x17\x76\x19\x1a\x3f\x46\xf4\xde\x36\x57\xe6\xa7\xf5" + "\x0d\xf9\x85\x6e\x5e\x5b\x0f\xc9\xef\x3b\xa5\x55\x6a\x30\x68\x42" + "\xfe\xe3\x74\x96\x9a\x7c\xf3\x0c\x69\x92\xb2\x20\x68\xf4\x61\xac" + "\x1d\x0e\xe4\x9b\x53\x0f\x68\x79\xc3\x18\xab\xd4\xf8\x4d\xa2\x13" + "\x7c\x65\xfa\x90\x95\xad\x6c\x90\x2d\x89\xff\xed\x9c\x32\xfc\x79" + "\xcc\x23\x0f\xf9\xbf\x44\xd9\x96\x73\xca\x88\x07\x51\x6f\x8c\x76" + "\x35\xe3\x3a\x0a\xd7\x9b\x71\x1d\x84\xeb\x2d\xe7\x94\x9b\xbf\x43" + "\x7e\x55\xcb\x9f\x88\xe7\x2f\x90\x3e\x41\xbb\xa2\x8d\xc3\xd3\x70" + "\x4d\xfb\x15\xf1\x95\x73\x45\xfa\x5b\xf4\x8c\xeb\x2e\xad\xdf\xb5" + "\x72\x6e\x0f\x5f\x83\x72\xf2\x29\x1f\xad\x6b\x48\xb3\x21\xcf\x3c" + "\x2a\x9b\x7c\x1b\xe0\x7e\x58\x10\x7f\x8a\x72\xcc\x14\xf3\x76\x22" + "\xae\x74\xd6\x22\x17\xdf\x9f\xa4\x72\x01\x83\x86\x00\xbd\x88\x8a" + "\x5b\x90\x2f\xc7\x13\x63\x5d\x41\xf3\x5d\xa7\x07\x84\x4f\x3d\xf2" + "\xcd\x91\xf9\xa4\xfc\x3a\xdc\xa3\x8f\x9d\x57\xe2\xed\x01\x2f\xc6" + "\x0e\xe5\xff\x98\xbe\xc7\xf5\x31\xed\x9a\xac\x5d\xa7\x6a\xd7\x27" + "\xb4\x6b\x8a\x76\x4d\x75\x29\xc3\x6b\x34\xde\x04\x30\x1b\x5e\x43" + "\x30\xc1\xdc\x95\xfe\x02\x15\xb3\x97\xe4\x6b\xd0\xff\xfb\x28\x46" + "\x68\x57\xa9\xd9\xa6\xeb\xad\x49\xf7\x73\xad\x74\xc8\x57\x3b\x85" + "\xee\xc7\xbc\x21\x88\x16\xce\x8e\x50\x92\x19\x78\xa7\xb0\x4a\x03" + "\xf8\x06\x59\x8e\xb0\x1b\x25\xf9\x87\x62\x0d\x51\xcc\x56\xf2\x3b" + "\x28\xe4\xa8\xa8\x77\xcd\x34\x5f\x85\x4e\xbf\x9c\xfc\x04\xa5\xa4" + "\xe3\xb7\x00\x32\x45\xb6\x4e\xef\x49\x5e\x92\x72\xfe\xc0\x06\xd4" + "\xd5\x19\x90\xf3\xcd\xfb\xe4\xde\xe6\xf0\x57\xbb\x4a\x6f\x0e\x92" + "\xff\xcd\x99\xd4\x66\xc0\xba\x11\xfd\x99\xd8\xac\xdc\x3c\x11\xd7" + "\xf1\x2d\xb2\xcf\x89\x7a\x9f\xb5\xb1\xb2\xe9\x30\x6f\x51\x86\x37" + "\x80\x1e\x2e\x23\xfc\x6e\xf6\xd3\xe5\xe1\x22\x8e\x9e\x86\x3f\x18" + "\xe7\xe1\xe4\x5b\xa9\x28\x88\x9e\xc4\x04\xe8\xf4\xcd\xf6\x9e\xe3" + "\x12\x65\xf7\x4a\x7e\xa1\x11\xf3\x92\x70\x20\xfd\xba\x79\x19\x4f" + "\xf3\x52\xfb\xb6\xb6\x27\x8d\x8f\x8d\x27\x1a\xaf\xb5\x11\x78\x3b" + "\x7c\x12\x8d\x8d\x4b\xb9\xf9\x80\xb6\x26\x35\x62\x8d\xbc\x0f\xe9" + "\x16\xd9\x4e\x99\xae\xd5\x05\xfc\x1b\x6e\x26\xfc\xd7\xd3\x35\xfc" + "\xa6\x72\xe8\xec\xf9\xcd\x7a\xba\x56\x3e\xf0\x74\x78\x38\xcd\x1f" + "\x3d\x5d\xe2\x64\x4c\x26\xd1\x1b\xfa\xd6\x2b\x6c\x19\x21\x7f\xcf" + "\x3d\x8e\x76\x8f\xd8\x08\xfe\xa2\x8a\xe6\xf3\xba\xd5\x2c\x62\x65" + "\x05\x1b\x2a\xe7\xe6\x88\xb7\xf4\x6f\xa5\x4e\x7f\x44\x95\x4e\xa3" + "\x36\x0b\x7a\x36\x2c\xa6\x27\xad\xbc\xf5\x11\x5e\x62\xf4\x7a\x4d" + "\x29\x69\x75\xde\x89\x82\xe6\x62\xde\x57\xe2\xbb\x46\x17\x7b\x7b" + "\x83\xb6\x96\xd4\xca\x3d\x95\x5b\x86\xd6\x55\x49\xda\xa5\x95\xed" + "\xa7\x7f\x41\x7c\x88\xa0\xf5\x54\x17\x95\x85\x75\xc5\xd4\x59\x94" + "\x3e\x44\xd2\xef\x5b\x12\x5c\xec\xf6\x18\x9d\xb6\xd2\xfa\x64\x54" + "\x98\xad\x6c\xae\x5c\x9f\x54\xd2\x81\xd9\x3a\x85\xbf\xb9\x7a\x5b" + "\x3b\xa3\x75\x93\xfc\x79\x67\xac\x1a\x4c\x7e\xa3\xd2\xd1\xd6\x51" + "\xe0\xcf\xf6\x69\x7b\x33\x90\x73\xe3\x3e\x26\x59\x56\x83\x2b\xe6" + "\x53\xdc\x1f\xb5\x71\x69\x42\x7b\xf6\x11\x6d\x5f\x97\x27\xe3\x75" + "\x91\x3e\x48\xc4\x8f\x23\x9e\xd5\xcc\x3d\x22\x36\x41\xe9\x2d\x87" + "\x83\x74\x5c\xd2\x66\x52\x19\xb1\x57\xc4\x9c\xb0\xa7\xa4\x49\x7d" + "\x62\xdc\x34\x99\x1e\x97\x20\xed\x10\x84\xdf\x50\x7a\x36\x87\x98" + "\x63\x3f\x97\x7a\xe1\x21\xdd\x92\x1f\x89\x8b\x08\xb2\xf9\x11\xb0" + "\x16\x7e\x8b\x4b\xe3\xe2\x03\xf3\xe2\x16\x0f\x7d\x83\x6f\xdb\x90" + "\x3e\x59\x4f\x97\x6b\x4d\x94\xe6\x47\x21\x65\xf6\x90\xb5\xc9\x0c" + "\xb4\x39\x6c\x67\x89\x3e\x7f\xe3\x2a\x65\xfd\x72\xfe\x52\x1f\x09" + "\x1f\x68\x0e\x7b\x85\x6f\xaf\x77\x85\x4f\x06\xdc\xa7\x7b\xf5\xb9" + "\x2b\xf9\xbb\x18\x31\x77\xc5\xbc\x8d\x3b\x10\x68\x47\xdc\x02\x0d" + "\x57\x9b\x3a\xe6\x9b\x23\xf0\x0e\x7c\xf7\x10\x6d\x2f\xeb\x16\x29" + "\x63\x94\x27\xe4\xab\x57\xb8\x87\x74\xd3\xa4\x4f\x20\x9d\x8d\x66" + "\xaf\x4a\x7b\x25\x9d\xe4\xaf\xcc\x8e\xf9\x10\xf0\x51\x66\x62\xba" + "\x8f\xb2\xae\xd2\x5b\xcd\x01\xdd\xf1\x2d\xf9\x5a\xbf\xd2\x50\x5f" + "\xa5\xa3\xf0\x4f\x84\x4b\x0b\xe5\x1c\xbb\x25\x9b\xf0\xd8\x09\xdc" + "\xc3\xfa\x53\x71\xac\x40\x7c\x3b\x5b\xc7\x3d\xcc\xd1\x05\x18\xf7" + "\xb3\x5b\x63\x79\x05\xc6\x94\x6c\xec\x73\xf0\xfc\x31\xae\x0b\xe4" + "\x55\x31\xd1\x55\xc3\xf9\x0a\x7c\x6b\x77\xb1\x51\x87\xf4\x31\xe8" + "\x8c\xda\x6b\x11\x38\x56\x48\xf6\x8d\x89\x62\xaf\x9f\x70\x8c\xf0" + "\x4b\xec\xf9\x03\xd7\x8c\x6b\x9f\x64\x84\x67\xc2\x6f\x09\x9e\xa9" + "\xbd\x84\x67\x28\xab\x49\xf7\x61\xec\x52\x6e\xd5\xf6\xdb\x6e\x75" + "\xeb\xb6\xe1\x84\x87\xb9\xa3\xd8\x30\x94\x6f\x39\x6e\xe9\x24\xdd" + "\xf9\x57\x4e\xef\x54\x46\x79\x09\x76\x92\x5e\x0e\x3f\xde\x55\x7a" + "\x5b\xd0\xf8\x47\x49\x5f\xb1\x73\x84\x3e\xf3\x26\xbc\x4b\xee\x49" + "\x73\x22\x6a\x05\x5f\x89\xf5\xf9\x8e\x18\x66\x01\xde\x62\xad\xb9" + "\x6d\x81\xce\x0f\x8f\x43\x1a\xf2\x50\xfb\x48\x06\x6f\xc0\xfd\x02" + "\x5a\xa7\xfb\xd0\x3b\x93\x5c\xe2\x26\x9a\x41\xba\x27\xd2\x83\x01" + "\xd6\xa7\xcf\x29\xa3\xce\xd6\x91\x0f\xa1\xa5\xdf\xf7\x63\x5d\x98" + "\xcf\x2f\x93\x4f\x2b\xcb\x32\x76\x53\xb3\x32\xaa\x86\xf4\x4e\x45" + "\xdf\x91\x8e\xe7\xb6\xf6\x9e\x3a\x9e\x91\x93\xb5\x5f\x1a\x7e\x07" + "\x03\x3f\x4b\x8a\x76\xef\xb8\xf1\xcf\x32\x47\xe6\xb5\x64\xe3\x97" + "\x2b\x61\x65\xc6\x5c\x19\x99\xa6\xc3\x8a\x68\x0a\xd1\x58\xb2\xb3" + "\xa1\x79\xae\x78\x19\xf9\x2c\xc2\x38\xa1\xdd\xeb\xc6\x3c\xe3\x58" + "\x4d\x32\xed\x48\xe1\x0f\x81\xfc\x11\xf7\xcb\xd6\x4b\x19\x29\xc6" + "\x53\xf8\x8b\x55\x46\xa6\xa0\xee\x98\xcd\x17\x58\xa8\x6d\x19\xbb" + "\x95\x74\xe8\x46\x1f\x77\x90\x0c\x4c\x38\x41\x71\xcd\xda\x14\xcb" + "\xd4\xdc\x35\xcc\x80\xf7\x23\x71\x3f\x51\xe7\xa5\xf0\x8d\x29\xc4" + "\xc3\x62\x88\x87\x7a\x6c\x0d\x1b\xd9\x55\x6a\x31\xe9\x63\x45\x7c" + "\x06\xe9\xf1\x34\x5d\x04\xb5\x55\xd8\x02\x90\x6f\x7e\x17\xc1\x4d" + "\xa7\x55\x17\x48\x77\x3d\xd2\x1b\xd2\xc9\x4c\x72\x1d\xb2\xcc\xc6" + "\xb8\xc6\x48\x7c\xb1\x98\x81\xfb\xa7\x83\xda\xf9\x78\xd0\x7d\x29" + "\x7d\x6f\xec\x24\x1e\xae\x2f\xf8\x58\xf6\xea\xf0\xd9\x2c\x7c\x7a" + "\x32\x9b\x18\x6f\x2f\x6f\xa7\x38\x6e\xb6\xd5\x2c\xbc\x4d\x19\x55" + "\x8e\x3e\xd2\xf9\xdc\x1a\xa9\xe3\x1f\xf5\x0b\x5d\x4e\x97\xed\x1e" + "\xf5\xb4\x71\x6d\x08\x23\xdd\x3c\xf9\x80\x14\xb6\x98\x17\xcd\x42" + "\x1f\xef\xf4\x4e\x66\x8e\xc2\x87\x28\xcf\xad\xda\x5a\xd6\xd4\x51" + "\x64\x66\xc7\xcc\x93\x31\x8f\x47\xc5\x61\xae\xd8\xfa\x6d\xf3\xaa" + "\x8c\x8a\xd3\xe0\x5b\x2b\x6c\x45\x14\xcb\x79\x5a\x4b\x48\x37\x80" + "\x75\xe4\x38\xad\xd7\x28\x3b\x5f\x9f\x37\x58\x27\x8e\x03\x4e\xed" + "\x92\xc6\xd0\xfe\xbc\xa5\x95\x7c\xc7\x08\xf9\x41\xe6\x8f\x90\xfb" + "\x06\xa3\x0e\xf8\xf9\x6d\xe4\xa3\xef\x84\x0d\xa1\x62\x71\x64\xf8" + "\x48\x97\x60\x71\x50\xdf\x34\x5c\xc4\x7a\x35\xaa\x29\x30\x6f\x2d" + "\xe2\x5c\xde\xb1\xf6\xe0\x79\x39\xca\x1b\x90\x53\x6f\xab\xbe\x67" + "\x2b\xb3\xf4\x36\x0f\x6d\x91\xb4\x56\xdd\xbe\x78\xf3\x66\x5e\x65" + "\x37\xa8\x8f\xae\x2b\x63\x11\xca\x46\x80\x8d\xe6\x59\x5e\xe6\xb0" + "\x73\xca\xed\x6b\x8c\x11\xc3\xd3\x1e\xcb\x1d\xc8\x0b\xcd\xcc\xb0" + "\xe9\xd2\xc0\xf0\x51\x9e\xe1\x55\x3c\x64\xcc\x33\x33\x72\x69\xef" + "\xdb\xce\xbe\xc9\x61\x21\x8f\xf9\x50\x77\x04\xb3\xb9\x94\xf8\x0d" + "\x74\xd6\xfc\x58\x04\xf1\x22\xf1\x1b\xa8\xcc\x82\x4a\x16\x5e\xd0" + "\xc2\x5b\x37\xbe\x3c\x20\x1c\xeb\xaf\x09\xeb\xc6\x86\x21\x11\xc3" + "\xab\xae\xa1\x8c\xf7\x33\xc5\x77\xd5\x7d\xb7\xed\x8e\x41\xbd\xb7" + "\xcd\x16\x7b\x4e\xb9\xe3\xe6\xfe\xb5\x6d\x74\x4d\xa0\x6d\xa3\x6b" + "\xfe\x05\x6d\x7b\x3d\xa8\x6d\xa6\x40\xdb\xb2\xa9\x6d\x7f\xec\x5f" + "\xdb\x7e\x14\x1e\x68\xdb\x8f\xc2\xff\xc1\xb6\x1d\xe8\xbb\x6d\xf1" + "\x3f\xee\xbd\x6d\xf9\xc3\xcf\x29\xf1\x4f\xf7\xaf\x6d\xd6\xd4\x40" + "\xdb\xac\xa9\xff\x95\xb6\x15\x56\xf2\xb3\xf5\x98\x41\xa4\xcf\x21" + "\x3a\x7f\x4e\x19\xfd\xec\x9a\x38\x61\xc7\x1d\x8d\xfb\x41\x45\x95" + "\xfc\x6f\x92\xb7\x89\xaf\x93\x6b\x5a\x3c\xe6\xcf\x6d\x9a\x5d\xc9" + "\x68\x11\xe3\x41\x0d\x19\xb1\x9f\x97\x70\xef\xd8\x4e\xb2\x19\xf4" + "\x92\x7f\x15\xf2\xed\xbe\xf1\x9d\x2b\x1e\x8a\xab\x51\xb9\xe7\x52" + "\x28\x7b\xe7\x8a\xdb\xd0\x55\x3a\x9a\xe9\xfe\x59\xf5\x6f\x8d\x15" + "\x37\xa2\x47\xa3\xef\x7b\x2c\x9b\x19\x89\x1e\xd1\x95\x62\xb5\x6e" + "\x2e\x1c\x18\xfe\xd8\x77\xb4\xee\x8f\x9e\xae\x9f\x99\xd5\xcb\x9a" + "\xd5\x3a\x90\x1b\x0b\x58\x08\x9d\xdb\x15\xfe\x17\xcd\x6e\x16\x5f" + "\xc0\x06\xcc\xca\x47\xf9\x1e\x96\x69\xcc\x47\xd9\x80\x87\xe4\xe5" + "\x47\x97\x87\xe4\xb0\x88\xad\x28\x9b\xae\x8f\x99\x8b\xf8\xba\xdf" + "\xb0\x50\x3a\xdf\x4b\xe7\x74\xe5\x19\xdd\xb0\x70\xd4\x73\x50\xaf" + "\xe7\x07\xe0\x17\x29\xe1\x77\xe7\xb6\x00\xfc\xee\x9c\x16\x80\xdf" + "\x9d\x43\x25\xfc\xee\x0c\x0d\xc0\xef\xce\xce\xfe\xc1\xef\xce\xe4" + "\x00\xfc\xe4\xb7\x37\x86\xdf\x9d\x2b\xfa\x86\xdf\x9d\x1b\x03\xf0" + "\x93\x65\xf5\x01\xbf\xb0\xde\xe1\x77\xe7\xc7\xff\x18\xfc\xee\xec" + "\xfc\x07\xe1\x37\x54\xc2\xef\x47\x9f\x06\xe0\xf7\xa3\x5f\x06\xe0" + "\xf7\xa3\x19\x12\x7e\x3f\x4a\x09\xc0\xcf\x3a\xb1\x7f\xf0\xfb\x51" + "\x71\x00\x7e\xf2\xdb\x1b\xc3\xef\x47\x7f\xec\x1b\x7e\x3f\xaa\x0d" + "\xc0\x4f\x96\xd5\x3f\xf8\x59\xa3\x00\x37\x93\x06\x3f\x53\xdf\xf0" + "\xb3\x4e\xfc\x07\xe1\x67\x94\xf0\xbb\x6b\x58\x00\x7e\xd6\x93\x01" + "\xf8\x59\x37\x49\xf8\x59\xd7\x07\xe0\x77\x57\x6e\xff\xe0\x67\x75" + "\x04\xe0\x27\xbf\xbd\x31\xfc\xac\x97\xfb\x86\xdf\x5d\x11\x01\xf8" + "\xc9\xb2\xfa\x80\xdf\xc0\xde\xe1\x77\xd7\xd3\xff\x18\xfc\xee\xca" + "\xbd\x11\xfc\xfa\xc7\x6b\xdc\x25\x64\x9d\x7f\x41\x39\x0d\x7d\x95" + "\x43\x30\x24\xfb\x44\xb5\xf4\xae\x86\xdd\x6a\x58\xb8\x3c\xc3\x71" + "\xd7\x06\xc8\x30\x53\x9a\x95\x31\xb7\xee\x56\x07\x84\xf3\x92\x6f" + "\x12\xd4\x92\xd6\xd3\x7c\x6d\x58\xa8\xba\x76\x60\x28\xf9\x14\xe8" + "\xad\x2c\x61\x2f\xab\x8c\x59\x13\x72\x33\xbb\x8d\xce\xeb\xad\x03" + "\xbf\x46\xf7\x5d\xa5\x63\x36\x80\x17\x89\xb9\x1e\x26\x0b\x16\x2e" + "\x17\xc1\x3b\x97\x65\x2d\x58\xb1\x64\xc1\xbc\x25\xb9\x96\x79\xf3" + "\x5f\x59\xde\xd3\x27\xbe\x88\x7b\xb9\x9e\xc6\x6f\x4c\xad\xdf\xcf" + "\x4b\x09\xcf\x27\x7f\x79\xb6\xdb\xc9\x36\xed\xee\x08\x11\xa7\x20" + "\x7a\x6a\x04\xbf\x96\xbe\x23\xf9\x0e\x7e\x54\xf8\x01\xbc\x96\xbd" + "\x03\xf2\xd4\x56\xf2\xed\xa2\xed\x43\x6d\x3d\xa7\xdc\x33\x9a\x47" + "\x4d\xab\x20\x9b\x0e\x71\xb6\x43\xb9\x5b\x3f\x83\x55\xc3\x4d\x49" + "\xed\xaa\x7d\x5a\x05\x2f\x9f\x66\x27\x18\xd4\x93\x0f\xb6\xbc\x90" + "\x91\xcd\xca\xd8\x56\x1e\x95\xd4\x8e\xb2\xdc\x5a\x39\x64\xbb\xdf" + "\x99\xbc\x9a\x7f\x45\xe5\x69\xbc\x20\xc5\x21\x71\x48\x7e\xf0\xee" + "\xbd\xc6\xb5\x96\x10\xca\x4b\xbe\x10\xc9\x47\xa0\x1e\x7b\x8a\xda" + "\x4d\x79\xc1\x8f\x4f\xc1\xf7\x53\x28\xf6\xa6\xbf\x0c\xd9\xa6\x9b" + "\xd0\xa6\x46\xd1\x17\x7b\x52\x45\xc7\x6b\xe9\x3b\x44\xfc\x47\x01" + "\xd7\xb1\x75\xa8\xbb\x42\xc4\xed\xf4\x5e\x14\x71\x3b\xb5\x6f\x6e" + "\xc5\x37\x82\x9e\x92\xff\x53\x59\xc6\xd8\x3f\xea\xed\x02\x0f\x3d" + "\x18\xcf\xbb\x82\xea\x18\x82\xe7\x5f\x04\xbd\x8f\xc0\xf3\x42\xf0" + "\xa1\x51\xda\xfb\xa1\x78\x9e\x41\x7c\xa9\xe8\x57\x59\xb1\xb4\x89" + "\x56\xc6\x92\x2d\xb0\x49\xcb\x13\x85\x3c\xc3\x88\xd7\xd5\xca\x88" + "\x6e\x53\xee\xb9\x4a\x32\xa3\xf6\x3e\x06\xcf\x67\x68\x5f\x40\x7b" + "\x3f\x0c\xcf\xef\xe3\xf9\x47\xda\x7b\xf0\xf5\x09\x32\xfe\x8d\x29" + "\xa9\x85\xfa\x04\xd8\xe7\x13\xdc\x01\xeb\x16\xa4\x6d\x85\xbc\x5a" + "\x44\xe3\x48\xfd\x74\xac\x6e\x63\xcd\x4a\x02\xc5\x06\x0d\x91\x63" + "\x35\xad\x42\xfa\xe8\x31\xa4\x23\xbd\x9d\xd2\xc9\xb6\x5c\x2d\x9f" + "\x96\x4f\xf7\x80\xe9\x2f\x08\x86\x5a\x5d\x90\x89\xee\x89\xd1\xc6" + "\x19\xb0\x23\x3f\xba\xac\x78\x8f\x36\x16\x68\xdb\x40\xbc\x7f\x55" + "\xdb\xf7\x68\x9c\xe5\xbd\x26\xcf\x17\x29\xf7\x4c\xfe\xa7\xfc\x46" + "\xe0\x3b\x49\xf7\xee\x29\xd0\x63\x12\x22\x4d\xfa\xca\x02\x7e\x92" + "\x7e\xc5\x1d\x95\x54\x2c\xfc\xa4\x00\x47\x75\x5c\x21\x3c\xe1\x61" + "\x63\xb6\x4a\x5d\xcd\x3d\xfe\xf3\xbf\x2e\x25\xa1\x53\x8b\xe3\xc0" + "\xa4\x9c\x70\xcf\xe9\x80\x7d\x51\x82\xa0\x0f\x41\xef\xdc\x41\xef" + "\xf2\xf5\x77\xd2\x06\x6e\x6c\x44\xd0\xbb\xec\xeb\xde\x59\x83\xde" + "\xa5\xf7\x2c\x73\x6c\x4a\xd0\xbb\xd4\xeb\xbe\xcb\x0c\x7a\x37\xf1" + "\xba\x77\x05\x41\xef\xe2\xb5\x77\x21\x48\xdf\xea\xf7\x53\xa8\x24" + "\xc4\x68\xe9\xa0\xf5\x63\x0f\x04\xa5\x87\x6a\xe9\x54\xff\x71\x17" + "\xfb\x52\x93\x63\x24\x9e\x03\x8f\xee\xd4\xea\x70\x05\xea\xb8\x5b" + "\xf7\x33\x5f\x2c\xc7\xef\xee\xe9\x46\xc5\x32\x90\x70\xca\xb8\xb6" + "\x98\x62\x02\xd9\xa5\x4f\x2e\x39\x0f\x45\xec\x6a\x8a\x7d\x8b\x7c" + "\x7d\xd1\xc6\x3e\x63\x63\x96\x8e\x4b\xd7\xcf\xb2\xfa\xec\x49\xeb" + "\x55\xfb\xd4\xe3\x14\x6b\x90\xfc\x77\x15\xb5\x73\x55\xc4\x18\xa4" + "\x58\x86\xac\x9b\x39\x73\xbb\x8a\x41\x1b\x22\x69\x9d\xa3\xfd\xbd" + "\x7a\xc8\xb7\xf5\xb6\xf3\x32\xce\x20\x9d\xef\x2d\x4f\x5a\xbf\xb2" + "\x9d\xc5\xd9\x92\x78\x0b\xc9\x79\x92\x26\x8c\xab\x41\x5e\xa3\x46" + "\xd3\x7e\x23\x6d\xbd\x13\x29\x36\xb7\xd1\xd9\x2e\xf4\xcc\xe1\xe7" + "\x94\xc4\x46\xfd\xbd\xec\x6f\x62\xa3\x90\xa5\xb5\x73\x85\x68\xa3" + "\xd7\x1f\x07\x53\x49\x6c\xba\x1c\x55\x50\xd1\x55\x9a\x68\xea\x69" + "\xdf\x98\x78\x17\x95\x49\x7d\x70\x29\xe3\x6a\xa9\x6c\xe4\x99\xe8" + "\xb7\x6f\x34\x25\xad\xc7\xfb\x29\xd2\x1e\x3f\xb1\x51\xc4\x00\x2a" + "\x4d\x84\xfc\x3f\x2e\x41\xb3\xe3\x5c\xcf\xc9\xf6\xb1\x9b\x31\xb2" + "\x6b\xc6\xda\x1d\x57\xf4\x1d\x8b\xee\xb8\x96\x4e\xb6\xaa\xcd\xc2" + "\x0e\xfb\x55\xf2\xff\xe7\x61\x33\x6d\x4c\xc6\xb6\x51\x12\xdf\xad" + "\xef\x74\xb1\x75\x74\x26\xb1\x7c\x8a\xb9\x23\x3a\x65\x0c\xca\xdc" + "\xef\x62\x2f\x6d\xd5\xf4\x12\x14\x67\x37\xce\x45\xfd\x2b\xca\x66" + "\xc8\x13\x83\x3c\x93\x90\xa7\x56\xcf\x43\xef\xbb\x48\xc7\xcb\xb3" + "\x19\xf5\xeb\x72\xf9\x6f\x6b\xf0\xbe\xdd\x15\x1a\x99\x2a\x6d\x34" + "\x13\x3d\x2e\x76\xb6\xb8\xaf\x35\x58\xe8\x45\x4d\xd3\xaa\xb9\x7d" + "\xda\x21\xd0\x9d\xfd\xd2\x17\xc1\xb4\x6a\xa9\x4f\xb8\x77\x2a\xc5" + "\x37\xa3\xd8\xe3\xb4\xf7\x29\x69\xdf\xbd\xbf\x14\xf4\x03\x69\x18" + "\x9f\xfd\x58\x23\xc4\x79\xd2\xfe\xd1\x85\x7b\x67\x8b\x32\x46\x48" + "\xff\x67\x74\x8e\xa4\xab\xf4\xde\x2a\x7f\xfc\x08\xff\x99\x86\x7b" + "\x4f\x92\x9e\x71\xb3\x2a\xdb\x78\x7d\x1b\xa8\xbd\x28\xab\x4f\x3f" + "\x24\xf8\x66\xbf\xd0\xc5\x6e\x49\x39\x20\xed\xd9\xc6\x47\x85\x98" + "\x6f\xb9\xd2\x55\x3a\xde\xbf\xff\x41\x79\x68\xcc\x54\x94\xef\xef" + "\xe7\x32\xaa\x63\xfc\x44\xb9\x57\x30\x3e\x15\xb4\x74\xff\xe6\x6e" + "\x16\xaa\xa5\xa7\xd6\x7b\x3d\x74\xbe\xbf\x57\x5f\x5c\xb4\x4e\x0b" + "\x3f\x4e\x5b\xa6\xed\xa7\x33\x1c\xe3\x3c\x7a\x9b\x27\xa4\xd2\xd9" + "\x01\x6a\xb3\x84\xed\x84\x47\x74\x38\x6e\xba\x84\xb2\x0b\xbf\x64" + "\x2d\xca\xf8\x13\x64\x63\x23\x60\xb2\x5a\xb7\xfb\x1a\x2f\xce\x71" + "\x8b\xfa\x65\x1e\xb1\x67\x4a\x36\xc7\x04\xa7\xdd\x84\x6b\x28\xb3" + "\x0c\x63\x21\x62\xe3\x2a\x13\x84\xac\xb3\x0e\xef\x45\xbf\x85\x4d" + "\xdd\x84\x1c\x39\x0f\x26\x40\xfe\x99\x90\x2f\xe7\x81\x4c\xa3\xd8" + "\xf5\x64\x0b\x71\x41\x19\x7f\x96\xe2\xd3\x02\x1e\x87\xc8\x87\x5d" + "\x7d\x27\xe6\x6b\x7e\x37\xe1\xc2\x21\x8a\x43\x08\x38\xb4\xc8\x35" + "\x8a\x60\x3e\xbe\x86\xea\x27\xd8\x52\x6c\xde\x10\x73\x1c\xe8\xc0" + "\x84\x4c\x7f\x8c\xe3\x58\x3a\x57\x31\xbe\x4f\xdf\x85\x04\x23\x1f" + "\xda\x5c\x0f\x9e\xd9\x31\xe2\x4b\xb4\x6f\xe2\x5d\x6a\xf4\xb4\xfd" + "\x64\xc3\x89\xb6\x6a\x76\x6e\x72\xec\x24\x1e\x4c\x54\x50\xc7\xb8" + "\x7a\x89\x0b\x32\x36\xba\x32\x61\xbf\x06\x3f\x11\xfb\xc2\x9e\x27" + "\xe1\xa0\xe5\x9f\x23\x75\x43\x71\xf7\xa1\x5d\x81\xf8\x5f\x48\x17" + "\x7a\x3d\xcd\xce\xbb\xab\x74\x62\x4c\x50\x9b\x3b\xc5\x59\xc4\x4b" + "\x24\xd7\x4f\x38\x4c\x75\x6d\x22\x1f\x63\x84\x17\x6d\xc1\xf8\x3f" + "\x61\x17\xb5\x93\xec\x03\x7d\x51\x29\x07\x78\x79\x4a\x35\xc1\x19" + "\xdf\x9c\xc6\x5c\xe8\xf5\x3c\x1c\xd1\x6e\x8a\xa5\x82\xfa\xd6\x07" + "\xc5\xf3\xc5\x5a\x3c\xf1\x8f\xfa\x5a\x4b\x7c\x02\xf9\x9a\xf0\xa7" + "\x95\x1f\xd9\x00\xfa\xad\xf3\x6b\x7d\xe9\x8d\x23\x36\x8f\x65\x89" + "\x74\xde\x99\x6c\xc5\x09\xdf\xb8\xe9\x88\x95\x7c\x28\x93\x3f\x48" + "\xc7\xea\xf1\x68\xef\x7d\x59\xbf\x8e\x15\x67\x2c\x3b\x1d\x63\x2f" + "\x91\x9d\x50\xfb\xb9\x02\xe1\xe7\x28\x7c\x56\xbe\x97\xef\x91\xf1" + "\xbc\xdd\x3c\xea\x88\x95\xde\x89\x18\x02\x54\xe6\x3f\xeb\x0f\x58" + "\xb9\x2f\x51\xe3\xa7\xda\xc1\x4f\x0c\x47\x7f\xc4\x3a\x85\xfb\xd8" + "\x36\xe5\xfe\x4d\x32\x06\xa5\xf4\x69\xaf\xd9\x3b\x86\x49\x1f\x01" + "\x6e\x26\xce\x6c\x2b\xf7\x2b\x96\x31\x8c\xb5\x2b\xf7\x0f\x10\xfe" + "\xa5\xed\x49\x8d\x1a\x0c\x1a\x37\xcb\x76\x19\x33\xf2\x0d\xa2\x8d" + "\xd4\xbe\x7e\xb6\xad\x56\x5b\x4b\xc3\xba\x4a\xef\x37\xe9\xbe\x05" + "\x44\xff\x35\xbf\xd3\x8e\xdb\x49\x76\xba\x7f\x8d\xb6\x7e\xea\x76" + "\x5b\x4d\xff\xf5\xba\xef\xd7\xce\x52\x26\x55\x0b\xdf\xdb\x80\x0b" + "\xca\xad\x46\x3b\x2a\xf4\x35\x5d\xb3\xd3\x4f\x90\xbc\xc6\xfd\xd5" + "\x81\xf5\x5c\xc2\xb0\xc7\xb9\xa1\xa5\x4b\x73\x2d\x10\x1a\x6c\xf3" + "\x72\xe7\x67\x5b\xb2\x96\x2d\x5b\xba\xcc\x42\x4e\x77\xae\x8b\xd5" + "\x14\xce\x4b\xef\x3f\xae\xc5\x93\xdb\xef\x8f\x27\x57\xfa\x40\x44" + "\x70\x9c\x3f\x97\xf2\x80\xe9\x5f\x23\x5b\x3d\x90\xd0\x57\x39\x76" + "\x83\x5a\x8d\xdf\x21\xfc\x1c\xf8\xd5\x90\xac\x95\xe1\x61\xc9\x58" + "\xa3\x85\x3c\x16\x38\x33\x7f\x3f\xf9\xae\x49\x6e\x56\x1e\xf8\xe5" + "\x6e\x35\x94\x09\xdf\x2a\x25\x2a\xd9\xb3\x90\x9f\xf4\x43\xf8\x39" + "\xf0\xab\xc1\x4f\x7c\xa7\xfe\x49\x9c\xf7\xad\x0e\x7e\x47\xfb\xe3" + "\xbc\xe4\x18\xf9\x5b\x6f\xe0\x6b\x43\xc5\x3e\x88\xba\x45\xe6\xbb" + "\xae\x0d\x06\x5e\x7a\x6f\x84\x96\x4f\xf0\x59\x91\x6b\x99\xa5\x97" + "\x7c\x21\xbc\x74\xcc\x41\x2d\x5f\x38\xe5\xd3\xfb\x43\x3e\xfc\x91" + "\x5f\xcf\x17\xca\x4b\x27\xd6\x68\xf9\xc4\xd9\x3f\xb5\xc4\xd0\x5b" + "\xbd\x03\x78\x89\xc7\xad\xe5\x33\x05\x97\x17\x94\x27\x4c\x2d\xbd" + "\xdd\x4c\x79\xd4\xb5\xa1\x82\x37\xe4\xa5\x0f\x24\x20\x7f\xaf\xbe" + "\x4f\xfb\x37\x4e\x93\x4e\x5f\x3f\x4e\xb6\xf9\x0b\xb3\x1e\x5a\xb8" + "\x24\x8f\xa2\x53\xe5\x2e\x5d\x91\x4b\xd7\x25\xf3\x5e\x11\x97\xa5" + "\x19\x2f\xcf\x97\x37\xb9\x39\x89\x74\x93\x03\x7c\xa3\xeb\x82\x15" + "\x36\xba\xcc\x5f\x4a\x8f\xf9\xd9\x09\x2b\xe6\xeb\x61\xc2\x7b\xf8" + "\x7e\xea\x2a\x7d\x10\xfc\xef\x03\x39\x92\x1f\x79\x70\x83\x4b\x19" + "\x23\xf6\x1b\x8d\x6b\x5d\xec\x84\x55\xc4\x13\x64\xdf\xf3\x99\xa0" + "\x3c\xb8\x8d\x7c\x26\x18\xd7\xda\xe6\x1b\xbd\x0b\xb3\x78\xf9\x54" + "\x13\xbe\x05\xff\xfb\xba\x76\x26\x3f\xa9\x55\xf8\x0f\x2d\x7d\x30" + "\x46\xb7\x71\x54\xed\x49\x95\xe4\x17\x5f\xd8\x3c\x6d\x11\xfe\x78" + "\x6a\xf0\xdc\xb2\x7b\x8b\x88\x4f\x13\x83\xe7\x7d\x78\x6e\xc7\xb3" + "\x19\xcf\x71\xaa\x7d\x9c\x95\xce\x48\xe2\x99\xe2\x99\xc5\x77\x95" + "\x3e\xe4\x8f\x7f\x19\x0c\x1b\x2d\x80\xdd\x43\xbd\xca\xe8\xd7\xf9" + "\x1d\x43\x19\xd9\x7a\x7c\x60\x11\x0b\xb8\xf4\xa1\x7c\x7f\x2c\x60" + "\x11\xd3\xc9\x24\xd6\x26\xb9\xb6\x3f\x74\x39\xc4\x7c\xeb\x7a\x29" + "\x0b\x3c\x54\xa5\xfb\x85\x90\xbc\xfe\x43\xd5\x41\x71\x94\xe9\xd9" + "\xe1\x8f\xa3\x2c\xfd\x98\xed\x10\xbe\x97\x94\x87\x31\xc7\x1f\x4a" + "\xf4\xc7\xbc\x2b\x7d\xa8\x35\x38\xe6\x9d\x0b\xef\x49\xc6\xea\x2a" + "\x7d\x98\x05\xd6\xc1\x87\xb6\x52\x9d\xbd\xc5\x8c\xde\x6c\x80\x3c" + "\xb0\x0a\xf2\x00\xae\x42\x36\xd0\xf8\x70\x4a\xe7\x25\xc9\xe4\x63" + "\xc7\x42\xef\x88\xf7\xeb\x55\xef\x21\xf8\xda\x87\x7f\x43\xfe\x77" + "\xdd\x45\x0b\x94\x3b\x76\x93\x1d\x14\x9e\xa5\xff\x48\x7e\x41\x79" + "\x58\x9c\x31\xd3\x7d\xcb\x05\x9f\xcb\xef\xf5\xfc\xc3\x27\xfa\xbe" + "\x75\xce\x52\xa3\x77\x5e\x96\xe4\xe3\x1e\xbe\xaa\xed\x53\x37\xc8" + "\xf5\xfe\xe1\x16\xfe\x8c\x8c\x7b\xe2\x52\x26\x67\xd3\x99\x28\xa3" + "\x92\xb3\x94\xe3\x5b\x63\xfe\xbc\x2c\x91\x86\x7c\xeb\xc0\x6b\x69" + "\xed\x3b\xe9\x8c\x6b\x65\xfc\x8a\x4f\xfa\x1b\x50\x1e\xae\x99\x7b" + "\x6b\x31\xd5\x13\x2e\xf8\x88\x4f\x58\x04\xc5\x1f\xa4\xb6\xed\x0e" + "\xf2\x7d\xb7\x19\x69\x64\x13\xd6\xf1\x0c\x8b\x20\x5f\xbf\x5a\x5b" + "\x6a\x44\xfc\xb3\xd2\xc9\x99\xba\xdf\x1e\xc0\xbc\xe6\xfa\xfe\x3c" + "\xf3\x13\x31\x43\x46\xcf\x4f\x48\x9b\x8a\xbb\x04\x2d\x74\x6e\x30" + "\xee\xc4\x75\x44\x3f\x61\xe9\x78\xfb\xe9\xff\x4d\xc4\x9e\x2c\x9d" + "\x0c\xfa\xff\xb0\xf4\x27\xb1\xee\x67\xdf\x12\x6d\x11\x31\x19\xe9" + "\x6c\xa3\x4a\x67\x77\xa7\xec\x15\x7e\x76\x0d\x92\x5f\x14\x71\x99" + "\x4a\x27\xe7\xf2\xe8\xa4\x0d\x32\xee\xec\xd4\xfd\x18\x3f\xb1\xee" + "\xd3\xdc\x10\x67\x38\x4d\xd4\xf7\x47\xe8\x5c\xeb\x63\xf8\x3d\x27" + "\xe3\xc4\xfc\xec\x5b\xbd\x5c\xf2\x61\x05\xdc\x32\xe1\x8a\xb9\xf6" + "\x48\xa2\xdf\x4e\xc9\x7f\x2e\xf4\x91\xa7\xc9\xbf\x56\xe0\x8c\xf0" + "\x14\x4d\xaf\xf9\xc8\x1c\x17\xbb\xd3\x2e\xe7\xf7\x23\xc0\xff\x53" + "\xda\xf9\xb0\x47\x72\x5d\xec\xa9\x86\xeb\xca\x38\xa2\xeb\x5f\xe4" + "\xd8\x3d\x52\x01\x5c\x7c\x0c\xbf\xe7\x90\x7f\x9f\x1e\x77\x7b\x9d" + "\x41\x9c\x6f\x3a\x17\x62\xa6\x33\xc0\x8f\x1c\xd6\xd3\x07\x28\xc9" + "\x80\xcd\x23\xb5\x3a\x3d\x81\x3c\x74\x08\xcf\x4d\xe0\x37\x67\x6b" + "\xcf\x98\x73\x8f\xb4\xeb\xcf\xb8\xf7\xe8\xf4\x86\x64\xc4\x8e\xd7" + "\xd2\x7f\x43\xb2\xe7\x7c\x33\x78\x32\x33\xc9\x78\x49\x66\x17\xfb" + "\x68\xbd\xfc\xb6\xca\xd5\x51\x52\x97\xd8\x19\xfd\xae\xa5\x13\x34" + "\x14\xef\x26\xba\xd8\xef\x4f\xcb\x72\x92\x92\x5d\xa1\xa6\x7d\x81" + "\xf1\x08\x31\x02\xc6\xc7\x65\x9f\xa6\xe4\xe3\xbe\x86\x62\xa0\x23" + "\x5f\x36\xe6\x57\x9a\x94\x09\xdb\xab\x36\x76\x9b\x66\x3b\xd7\x83" + "\x67\x7d\x99\x70\x65\x8a\x88\x1f\xbd\x69\xb5\x29\x8d\x78\x3e\xf2" + "\x85\x20\x7c\xa4\x91\xef\x49\x2f\x0b\x13\xfe\xfe\xcb\xf7\x36\x0a" + "\x3f\xf7\x2b\xad\x11\xba\xdf\x49\xcc\xd3\x49\xdc\xf0\x76\x3b\xf9" + "\xa2\x14\xfa\xbc\x2e\x6b\xa4\xf0\x3f\xa9\xf9\x9d\xdc\x95\xc7\x62" + "\x2a\x55\xe9\x77\x52\xf8\x49\xb8\x81\xef\x49\x5e\xd2\xb6\x5e\xf7" + "\x3d\x09\x38\xd0\xf9\x47\x2b\xbf\xe2\xf5\xe0\x1a\x1f\xe4\x6f\x27" + "\xb4\x57\x3f\x94\x06\xd0\x4d\x83\xf4\x43\xd9\xbf\xf5\x66\x4a\x8a" + "\xc4\x93\x29\xeb\xf5\xb8\xe0\x41\x69\x15\xc0\xf3\x7d\x32\xed\x91" + "\x34\x2d\xed\x80\x8b\x9d\x74\xfb\x79\x33\xd0\x3b\xd2\x6b\x62\x1e" + "\x9f\x86\x1c\xfc\x9b\xe0\x79\xc5\xc4\x1f\x2d\xdd\x03\xb0\x2e\x87" + "\xe1\x37\x90\x7e\xa9\x7e\xfa\x71\x85\x37\x92\x8c\x60\x54\xb0\xde" + "\xe4\x87\xf0\x59\x5e\x6f\x48\x86\x57\x39\x4d\xbc\x27\x9d\xfb\x9e" + "\xe5\xf3\x92\xff\x81\xd0\x59\xbe\x0e\x8a\xd9\x79\x9a\xce\xb3\x6d" + "\x7e\x99\xce\x57\x8e\xe4\x14\xaf\x66\x96\xef\x22\xdf\x23\xcf\x8d" + "\x36\x68\x71\x38\x6b\x7d\x79\xbc\x06\xe3\x10\x41\x72\x07\xf9\x00" + "\x8b\x54\x3c\x2c\xd2\x16\x72\x74\xe6\xe5\xa3\x9c\xfc\x7f\x51\xac" + "\x32\xb5\xd4\x03\x5a\x69\x51\x32\xbc\x21\xc5\x4e\x6f\x8b\x88\x17" + "\x30\xcb\x37\x90\xcf\xca\x7f\x84\x8b\x18\x63\x79\xfc\x38\xe8\x6c" + "\x88\x88\xcb\xbd\x8a\x77\xe0\x3e\x7c\xd6\xaa\x0e\x4e\x31\x43\x51" + "\x76\xcd\x2c\xaf\xda\x3d\x2b\x5f\x2d\xca\xc8\x57\xf0\xdd\xdf\xf0" + "\xdd\xdf\xd0\x9e\x44\x94\x69\xc2\xf3\x14\xbe\xe7\x65\x3a\x87\x55" + "\x2c\x64\x1f\xf4\xd1\xa1\x9d\x6d\x3d\x44\x71\x42\xc9\xdf\x78\x86" + "\xd7\x51\xbc\x47\x3b\xab\x2a\xe2\xd5\xe6\x5f\xe3\x5a\x3d\x93\x66" + "\xad\x62\x53\x32\x56\x8d\x14\x67\x5e\xe9\x3c\xd7\x2c\xaf\x05\x75" + "\x16\x13\x3c\x22\x44\x8c\x70\x71\xa6\xeb\xc7\x89\x37\x8a\x19\x4a" + "\xb6\x2a\xcb\x6f\x66\x06\x3a\x23\xe2\x7b\x63\x92\x9b\xfc\x91\x15" + "\xb9\xb9\x87\x74\x8f\x47\xbb\x1b\x0d\x96\xbc\x50\xd0\xd5\x1f\x3f" + "\x5b\x6f\x4b\xec\xfd\x5c\x5f\xd9\xc3\x87\xf8\xb6\x27\x26\xf2\xb2" + "\xa4\xad\xb8\x1e\xe4\xf6\xa9\x2e\xb2\x99\xe5\x65\x3f\xb6\xf1\x6d" + "\xa9\x48\x4f\x99\x8e\xeb\x41\x5e\xf6\x84\x95\x6f\x9b\x86\xe7\x27" + "\x43\x71\xc5\xf3\x2d\x6e\xe4\x4f\xe4\x65\xb7\x66\xe2\x5a\xcd\xcb" + "\x6e\x6b\x40\x3e\x3c\x5b\x92\x71\xc5\xf3\xa8\x6a\xe4\xc3\xf3\x1d" + "\x96\x73\xca\xa3\x16\xdc\x23\x6d\xba\x4b\xd6\x35\xab\x5d\xd4\x55" + "\xf6\x8c\x47\xd6\xf1\xd3\x50\x59\xc7\xf3\x26\x59\xc7\x9c\x38\x59" + "\x47\xbc\x1d\xf9\x26\xf1\xb2\x3b\x0b\x70\x3d\xc4\xcb\xac\xd9\xc8" + "\x87\xe7\x31\xb3\x71\xc5\x73\x02\xea\x9a\x86\xe7\xb1\x09\xb8\xe2" + "\x39\xd1\x8c\x7c\x93\x79\xd9\xf8\x70\x5c\x0f\xf3\xb2\x09\x54\x3e" + "\x9e\xef\x6b\xc5\x15\xcf\x0f\x34\x22\x1f\x9e\x1f\xac\xc1\x15\xcf" + "\x19\xe8\xd3\x13\xc9\xbc\x2c\xb3\x09\x57\x07\x2f\x7b\x09\xf5\xa5" + "\xe2\x79\x41\x0a\xae\x78\xce\xc2\xf7\xd3\xf0\xfc\xf3\x03\xb8\xe2" + "\x79\x21\xf5\x35\x85\x97\xbd\x42\xf5\x1c\xe7\x65\x39\xd4\x67\x3c" + "\x2f\xd9\x80\x2b\x9e\x6d\xd4\x1e\x3c\xbf\x4a\xdf\xe1\x79\x39\x60" + "\xf0\x44\x2a\x2f\xcb\x2b\xc6\xb5\x86\x97\xad\x4a\x43\x3e\x3c\x17" + "\x00\x1e\xa9\x78\x2e\x04\x0c\xa7\xe1\x79\xad\x03\x57\x3c\xaf\xa7" + "\xfe\x4e\xe7\x65\xff\xb6\x00\xd7\x5a\x5e\xf6\xef\x93\x90\x0f\xcf" + "\x9b\x22\x70\xc5\xf3\x66\xc0\x6f\x1a\x9e\xb7\x1c\xc4\xb5\xb6\xf7" + "\xf1\xdc\xe6\xe1\x6b\xc3\x18\x2f\xdb\xeb\xe2\x6b\x07\xe2\xfa\x1f" + "\x76\xbe\x76\x80\x95\x97\xfd\x8f\x64\xa4\xe3\xba\xaf\x00\xcf\x09" + "\xda\x33\xae\xaf\x67\xe3\x39\x51\x7b\xc6\xf5\x8d\xd9\x78\x9e\xa8" + "\x3d\xe3\xfa\x7b\x7a\x06\x8c\x0f\xe0\x1a\x86\xeb\xef\x4f\xe3\x79" + "\xb2\xf6\x8c\xeb\xdb\x16\x5c\xbd\xbc\xec\xcd\x08\xa4\x03\x56\x6f" + "\xd6\xe2\x19\xd7\xdf\x6d\xc4\x33\x60\xf1\x3b\x37\x9e\x53\xdc\xa3" + "\xef\x37\x11\xae\xaa\xb1\x43\xdd\x3c\xf6\x29\x5b\xd1\x65\x66\x20" + "\x1c\xa5\xb8\x14\x96\x3c\xf2\xe9\xf0\x98\xaf\xba\xd0\x65\xa0\x3c" + "\xbe\xed\x4f\x24\xaa\xb1\x4f\x90\xee\x2b\x0c\xf9\x06\x9e\x53\xa6" + "\xde\x45\xeb\xab\xb3\xc0\x25\x62\xe3\x69\xbe\xf5\xc2\x9a\x95\x94" + "\xd1\xe0\x27\x26\x51\xbc\x75\xc0\x2b\x87\x97\x0c\xb8\x84\x6b\x3b" + "\x2f\x19\xd2\x0c\x78\xe1\x39\xea\x13\x5c\xf1\x7c\xff\xbf\x03\x5e" + "\x78\xfe\xd9\xa3\xb8\xb6\x77\x95\xa6\xac\x77\x29\x3f\x16\xb1\x85" + "\xf9\xdb\x4f\xdb\x8d\x5e\x0e\x7a\x84\xb5\x7a\xef\x0a\x93\xd1\xeb" + "\x60\x7c\xdb\xf3\xc5\x46\xf2\x11\xf7\xfa\x03\x26\x1e\x3b\x9c\x7c" + "\xdb\x91\xfc\x13\xc6\xaf\xc5\x1b\x64\xdd\x43\x38\xea\xfe\x03\xe9" + "\x6e\x79\xec\xb8\xbe\xde\x7f\x2c\xde\xdf\xbe\xc2\x2e\xdf\x87\xb3" + "\xc0\xfb\x9f\xd1\xfb\xef\x8c\xa4\x6f\xbf\xf3\x1e\xf1\xde\xd9\xd9" + "\xaa\xf5\x2b\x04\xef\xa6\x0e\xa5\xbc\x2e\x65\x6a\xa2\xd4\x7d\xa5" + "\x4c\xe4\x25\x21\xac\xc3\x34\xb5\xb6\xab\x74\x6a\x32\xda\xae\xf9" + "\xbd\x02\x9f\x6d\x4a\xaa\x92\x7e\x14\xa6\xf5\xe5\xe3\x25\x5c\x8d" + "\x99\xeb\xd9\x54\xc2\x1b\x48\x9e\x35\xba\x99\xc1\x52\x18\x7f\xa8" + "\x59\x79\xbc\x7a\x17\xe9\x29\x62\x72\xd3\xe8\xac\x13\xea\xfc\xd8" + "\xbb\xe5\xf1\x18\xcb\x6a\x23\xea\x7f\xfc\x0f\x45\x1e\x7e\xd9\x51" + "\xf8\x28\xd6\x4a\x91\x9e\x26\xed\xe7\xc5\xfd\x64\x69\xf3\x24\xee" + "\xad\x52\xef\xfb\x78\x35\x7d\x2b\xfc\x21\x6a\xe3\xea\xfb\xf7\x30" + "\x0f\x8f\xcd\xcd\xc4\x38\x4d\x41\xd9\x9f\x1e\x51\xdd\x86\x48\x37" + "\x1b\x60\xc9\x3b\x4a\xe5\xcb\xb3\x35\x5a\x5e\x3e\x38\xcc\xa3\x8a" + "\xbc\xe2\x9d\x72\x14\x78\x50\x29\xf4\x42\x8f\x27\xe8\x3a\x6d\xbe" + "\x75\xae\x87\xce\x54\xa3\x8e\x64\x5a\x17\xe5\xb9\xa1\xc7\x37\xd6" + "\x61\xdc\x7c\x31\x43\x5d\xe3\x72\x59\xa8\xd1\x13\xae\x14\xae\x10" + "\x67\xe9\x2e\x3b\x56\x7f\x22\x6c\xf4\xa8\x7c\xe4\x5b\xc1\xa3\x1f" + "\x17\x67\x71\x09\x56\x9b\x55\x94\x87\xfa\x1c\x79\x5f\x52\x19\x33" + "\x8e\x5e\xa2\x7d\xdd\xc7\x2b\xf4\xba\x28\x9e\xc0\x26\xc0\x86\x78" + "\x4c\x3a\x0b\x9e\xe1\xf3\x91\xdf\xaa\x0d\xc1\xf0\x5d\xa8\x9d\x7b" + "\x5d\xb8\x24\x77\xd9\xab\x96\xe5\x0b\x57\x67\x3d\x32\x7a\x45\x82" + "\x65\x59\xbe\x65\x99\x88\xab\x2d\x12\x16\x24\x58\x96\xe7\x2c\xcd" + "\xb5\xe4\xae\xb2\x65\x7d\x3f\xc6\xb0\x59\x35\x4d\x6d\x92\x3e\x5f" + "\xa6\x8b\x33\x3b\x6a\xd5\x8a\xf0\xdc\x5c\xae\xf2\x2d\x47\x0e\xf1" + "\xa2\x54\x4d\x36\x79\xe2\x3e\xcb\xed\x03\xc1\xaf\x4f\x5f\x78\x35" + "\xec\xf1\xc3\x5d\xa5\x4f\x60\xfc\xa7\x0a\xf9\x63\xab\xee\x03\x4c" + "\x99\x5e\x45\x63\x2b\xf7\x2c\x9e\x00\xff\xfb\x86\xf4\x67\x56\x95" + "\xab\xd9\xc4\x3f\x21\x6c\x28\xb9\x65\x45\x38\xdf\xf7\x80\x09\x7c" + "\x8d\x42\x70\x10\x31\x72\xd9\x25\x71\xde\x15\x38\x2f\xce\x9a\xfb" + "\xb6\x3f\xd9\xa0\xc6\x3e\xcf\xd4\x37\x1e\x68\x28\xda\xcb\x0c\xef" + "\x60\x2c\x42\x2d\xc0\xcb\xdb\xd9\xc8\xa3\x85\xad\x86\x0b\xca\x13" + "\x7b\x8f\x16\x36\x1a\xf8\xd6\xa7\x32\x3b\xe2\x53\x3d\x9e\x12\xe1" + "\x2b\x14\x65\x78\xd8\x87\xe0\x24\x20\x8f\x1c\xea\x1c\x36\xaf\xa2" + "\x73\xd8\x93\x87\x3c\xdb\x16\x3a\x1c\xb7\x8f\x67\x98\xbd\x17\x3f" + "\x38\x4e\xba\xa4\xe9\x73\x3e\x48\x21\x5d\xde\xd4\xd3\x1e\xd3\xd4" + "\xc6\xce\xed\xe9\xc5\xe4\x43\xe7\xea\xf6\x85\x0d\xdd\xb1\xd3\xdd" + "\xc7\x90\xe7\x23\xf0\xf0\xa7\x2c\xc0\xa3\x51\xcc\x70\xf5\xce\xfb" + "\x33\xdf\xe9\xb6\x1b\x6a\x8e\x4f\x96\xfa\xc7\x4c\xe0\xae\x38\x53" + "\x92\x3a\xf5\x83\x83\xc7\x19\xea\x66\xef\x74\xa7\x1a\x3e\x9c\xf4" + "\xbd\xf7\x59\x1f\x24\x1e\x67\x5d\xe4\xbf\x15\xb2\xd2\x7b\x5f\x56" + "\x30\xbe\x3d\xa3\xfa\xad\xd5\x1e\x03\x18\x64\x43\x5d\x63\x05\x2b" + "\x38\xcb\x86\x7a\x2f\x5a\x43\x7f\x8f\xef\xaf\x92\x5f\xc4\x53\x66" + "\xe1\x1f\xad\xd0\x21\x62\xbe\x1a\xeb\xc1\x27\xa8\x17\xad\x61\xf5" + "\xb3\x1d\x0c\xef\xc7\x7b\x9f\x32\xb3\xba\x6c\x37\x73\xa6\x57\xb1" + "\xab\x86\x64\xf6\xee\x0b\x55\x6c\x27\xf8\xf4\x9d\x17\x58\x84\xdc" + "\xdb\xb5\x86\x79\xaf\x59\x43\xbd\xaf\x59\x89\xaf\xe7\xfc\xa2\x75" + "\x30\xf1\x86\xde\xa5\xd6\xf0\x7a\x77\x15\x1b\xd7\xca\xac\x57\x0d" + "\xcc\x78\xf5\x35\xeb\xe0\x7a\x5b\x05\xca\x02\xd3\x07\xb8\x92\xaf" + "\x2c\xf2\xa1\x45\x70\x1a\x92\xce\x66\xb7\x2b\xa9\xb7\x0e\x3e\xcd" + "\x86\x91\xaf\x46\xf2\xb5\x46\xfe\x62\xd5\x98\x8c\x6a\x5f\x4c\x7a" + "\x71\xe1\x65\xf2\x2d\xe2\x61\xa0\x59\x36\x8b\x8c\x2f\xae\x50\x9f" + "\x55\x6e\x1d\x9c\x41\xd7\x2d\x49\xe3\x89\x67\x55\xbb\xcc\x14\xcb" + "\x28\x9c\xda\x09\xba\x19\xbe\xe6\x6b\xc0\xb2\xc8\x1a\x8a\x7c\x90" + "\x57\xad\x91\xce\x76\x0f\xf3\xdd\xf3\x74\xf1\x58\x9b\x88\x59\x1b" + "\xb3\xbb\x90\x99\xec\x85\x2c\xc6\x72\xbf\xc0\xa5\x47\x7c\x6f\x3d" + "\x6d\xe3\xa5\x2f\x4c\xe7\x6b\x43\xe3\x64\xda\x53\xb7\x5a\x1e\x67" + "\xcc\x32\x9e\xee\x9f\x3c\x61\x79\x08\x63\x18\x93\x61\x12\xfc\xb4" + "\x90\xbd\x9e\x7c\x57\xe2\xea\x93\x7f\xb8\x1a\xb6\xcf\xae\x96\x7e" + "\x7e\x40\x5d\x1b\x6a\xa1\x38\xd9\x17\x94\x27\xb7\xf1\xb2\x43\x35" + "\x7c\xeb\x42\xa1\x13\xc6\x73\xf9\xd5\xb0\x67\x3b\x79\xd9\xbb\xa4" + "\x43\x49\xbe\xaa\x84\x36\xe2\xd7\xa4\x7d\xbf\x81\xfa\xed\xdb\x77" + "\x7f\x2b\xf5\x5b\xc4\xbf\x41\xbf\x32\x30\x66\x3c\x76\xae\x43\xf8" + "\x84\xbf\x06\xf8\x6a\xf1\x41\x09\x1e\x04\x03\xf5\x9a\x75\xb0\xe8" + "\xeb\x35\x6b\x04\xe0\x4b\x7e\x59\x8d\x85\xf3\xf0\xcd\xf6\xb9\xa7" + "\xf1\x2e\xf2\x6a\x4c\x46\x38\xc5\xa1\x72\xda\xdc\xcc\xb7\x6d\x6e" + "\x03\xf9\x1d\xfb\xcd\x6a\x66\x52\x87\xcd\xc5\xba\x3b\x17\x32\x8b" + "\x98\x3f\x8c\xda\xa9\x96\xbd\x9b\x7f\x95\xce\x0d\xa0\x6d\x68\x5f" + "\x23\x7e\x78\xff\x64\xc4\xd5\xd1\xf7\x43\x7e\x99\xe6\x42\x5b\x2d" + "\xbc\x74\x59\x01\xdd\xe3\x1d\x78\x9b\x27\x2f\x13\x1c\x08\x1e\x1a" + "\x2c\xce\x07\x60\xb1\xfb\x10\xf2\x35\xa9\xa5\x9f\xa4\xa1\x8c\xc3" + "\xbc\x74\xf1\xe4\x40\xbe\xa7\x86\x05\xf2\xfd\x6e\x8e\xcc\x77\x86" + "\xc9\x7c\x2b\x0f\xe2\xfd\x1f\x24\xbc\x9f\x7a\xfe\xfb\xf0\x7e\xea" + "\xe9\xc0\xb7\xbf\x0e\x95\xdf\x7e\x68\x97\xdf\xbe\x44\xdf\xfe\xb2" + "\x67\x9b\x9e\x5a\x1b\xc8\xbf\x69\x92\xcc\xff\xa7\x64\x99\xff\xc5" + "\xe2\xa0\x7c\x6f\x06\xf2\x55\x1c\x97\xf9\x6a\x1b\x65\xbe\x9f\xbb" + "\xf0\xfe\x6c\x2f\x6d\x39\x13\xf8\xe6\xff\x48\x95\xdf\x7c\xd3\x29" + "\xbf\x29\xb1\x01\x9f\x86\xf5\x6c\xcb\xf4\xa1\x81\xfc\xd5\x5a\xbf" + "\x9b\xd7\xcb\xfc\x6b\xe2\x82\xf2\xdd\x27\xf3\xd1\xfb\xf3\xc8\xf7" + "\x64\xf5\xd5\xb0\xc3\x09\x32\xdf\xbf\x1d\x26\x7c\x44\x9e\x67\xd5" + "\xd2\x9f\x35\x5d\x0d\x4b\xaf\x41\x39\xfb\x30\x36\x71\x74\xc5\xd8" + "\xc5\xa9\xf6\xa9\xa7\x71\x1f\x47\xfb\x0b\xe4\x4f\x84\xce\x40\xaa" + "\x25\x16\xb6\x3b\x9a\x45\xfc\x26\x9a\xd1\x59\xbd\xf0\xae\xd2\xe9" + "\x1b\x03\x7b\xda\x92\x86\x12\x0d\x76\x29\x4f\x98\x41\x87\x7d\xbd" + "\xfb\x63\x99\xee\xf0\xeb\xbe\x54\xac\xf9\xdb\x9e\xe8\x9d\xaf\xde" + "\xf2\xc8\x3e\xb2\x91\x20\xfa\x73\x4e\x99\x71\x2f\xf9\xae\x0b\xd0" + "\xf4\x19\x42\xc7\x49\xbe\x23\x48\x27\xa9\xa5\x09\x7b\x59\x15\x78" + "\x0c\xf9\xf0\x10\xf9\x0b\x24\x1d\x24\xd6\x1d\xf4\x6d\x46\x0a\x68" + "\xca\x80\x5f\x1b\xd4\x6a\xfc\x0e\xe1\xe7\xf8\x35\xe9\x26\x4b\xd8" + "\x54\x5d\x6f\xdb\x7b\x5b\x67\xe4\xb8\xd8\xff\x48\x09\xe8\xae\x66" + "\x00\x6f\xa7\x9f\xee\xbf\x7d\xf1\x8c\x1b\xed\x21\x85\x0a\xbf\xee" + "\xdb\x9f\x48\xb3\xab\x32\x6e\x3d\xe6\x2d\x78\xb3\x19\xc4\xff\x14" + "\x0b\x9f\xb4\x5b\x9f\x2f\x56\xe3\xb1\xee\x9c\x67\x21\xce\x82\x56" + "\x56\xad\xb6\x1a\xec\xdd\x2c\xb4\xde\xeb\x12\xf9\xab\x55\x97\xc1" + "\xb2\x84\xf8\x9e\x19\xdf\xda\xaf\x68\xe5\x55\xad\x30\x15\x2d\x96" + "\x31\xb5\x89\x47\xa4\xf5\x0a\x34\x2a\x42\xc4\x59\x5b\x32\x10\x79" + "\x67\xde\x8a\xfb\x70\xca\x7b\xf5\xce\xfb\xec\x57\x7f\xbb\xc2\xd4" + "\xbd\xfd\x29\x77\xf7\x9d\x93\x6c\xd7\x62\x9f\x2f\xbe\xb6\x3d\x9d" + "\x79\x7f\x9b\x5b\xec\xbd\xf3\x01\x93\x2f\x76\xba\x0d\x75\x63\x2d" + "\xab\x30\xbc\xad\x56\x1b\xde\x2e\x74\x18\xa8\xdc\xa3\x85\xfb\x0d" + "\xef\x15\x36\x18\xde\x53\x0f\x19\x8e\x16\xda\x71\xad\xa2\x98\x5b" + "\xe0\x45\x67\x2e\x7e\xaf\xb0\x06\x6b\xe9\xcc\x03\x80\xd7\x01\x5d" + "\x47\xca\x1f\xf5\xb2\xfa\xfd\x5e\x76\x22\xf7\x32\x73\x47\x4d\x6d" + "\xc2\xcf\xe5\x1e\x36\xd7\xe3\x1e\xb6\xd0\x21\xda\x1c\x9b\x69\xa7" + "\x3e\xd2\x59\xb1\xf7\x54\xd9\x66\x0d\x1e\x54\xe6\xa7\xbb\x69\xff" + "\x54\xf7\xd7\xab\xcc\xb2\x7f\xcf\x5f\xaf\x41\xc6\x7b\xf3\xfb\xec" + "\xfd\x5f\xe1\xaf\x57\xd3\x25\x90\xbf\x5e\xc8\xaf\x0d\x9a\xfc\xea" + "\xd0\x7c\x33\x45\x90\xcc\x2a\x7c\x33\xe5\x3b\x84\x7f\x25\xe1\x83" + "\x64\xdb\x73\x36\xe2\x1d\xbb\x4a\x67\xd5\xea\xb2\x29\xf1\x4b\xbe" + "\xf2\xa9\xed\xf8\xb5\x22\xbd\xc5\xa5\x74\xa4\xeb\xe9\x7c\x7b\x24" + "\xf1\x6d\x21\x3e\x9e\x9d\xa4\xed\x91\x4f\xf1\x6d\x7b\xd2\xe1\xdb" + "\xb6\xb0\x0a\x69\x93\xf1\x7b\xc4\xb7\x2d\xb2\x13\x3f\x0f\x7e\x5e" + "\xdf\x36\x23\xe8\xb4\x31\x14\xbf\x70\xfc\x4c\xf8\xc5\xe0\x67\xc6" + "\x2f\x0e\x3f\x0b\x7e\xf1\xea\x36\x63\x04\xf9\x1f\xe4\xdb\x8d\x89" + "\xc0\x03\xb3\x5e\x6e\x00\xde\x69\xd3\xd0\xff\x64\xe2\xe5\x78\xe4" + "\xa1\x16\x0e\xda\xc0\x5f\xbf\xdf\x2c\xda\xff\x7a\xaa\x07\xcf\x16" + "\xf7\xa8\x15\xcc\x3d\x2c\xb3\xd8\x3d\x2a\x37\xdb\x1d\xb5\x3a\x1d" + "\xbf\x4c\xfc\xb2\xdd\xdb\x32\x4c\x18\xd3\xfd\xee\x61\x19\x55\x5d" + "\xa5\x69\xd5\x2e\xe5\xb9\x7d\x52\xf7\x94\x76\x18\xf7\xc7\xb5\x7b" + "\xcc\xcb\xd9\x82\x5f\x44\x19\x99\x78\x06\x9d\x7c\x56\xe4\xeb\x88" + "\xcd\xb0\x68\x67\xa8\x8a\x91\xee\x76\x85\xde\xd5\xa8\xef\x2b\x75" + "\x95\x3e\xcd\xf4\x39\x48\x7c\x9e\x6e\x33\x10\x3c\xb7\x16\xcf\xb7" + "\x65\x2c\x9e\x97\x9f\xb1\x3c\x67\xe1\xfc\xac\xe5\x0f\x59\x46\x2f" + "\xb0\x58\x17\x2e\x7b\x35\xe3\xd5\x15\x59\x2b\xb2\x04\x6b\x89\xa4" + "\xbb\x7a\xec\x31\xc5\xd0\x19\x32\x2f\x64\x99\xc8\x05\x9c\xaf\x79" + "\x91\x19\xa6\x83\xb6\x40\xf6\x30\x0d\x6d\xd9\xc3\x0f\xb7\xb9\x0d" + "\xd3\xdb\x5d\xcc\x4b\xfc\xdf\xf6\xe7\x8b\x23\x5b\xa6\x20\xcd\x63" + "\x98\xde\x09\x9c\xc6\xfc\x70\xb6\x38\x18\xe5\x91\xfc\xe0\x9f\x58" + "\x2d\xf1\x83\xdb\x9f\x67\x94\x87\x83\x0f\x14\xd7\xd8\x27\x1b\x66" + "\xa0\x0c\x8e\x79\x45\x79\x8f\x20\x8d\xec\x27\x20\xcb\xb9\xf9\x95" + "\x02\x5e\x8b\x32\xde\x5b\xe4\x36\x90\x7e\x6d\x26\x95\x8b\x39\xc7" + "\xdf\xb8\xcf\xfe\x1e\xf2\xbe\xb7\x08\xdf\x63\x5e\x72\xcc\xc7\x23" + "\x78\x6e\x56\x9e\xa9\x7c\x0f\xdf\x0b\xb9\x08\x6d\x7c\x07\x69\x45" + "\x2b\x58\xa8\x3e\xcf\x89\x67\xf7\xcf\xf5\x3c\xe2\x7d\x9f\x19\x40" + "\x73\x1d\x6d\x81\xbc\xf5\x7c\xf1\x5b\xf8\xf6\x6d\xd4\xa5\xc9\x1b" + "\x21\x24\x17\x12\x3d\x21\x3a\xe2\x2c\x90\xf2\x61\xb5\x4a\xba\x8f" + "\x10\xfa\x76\x2a\xbd\xdb\x09\x3c\x94\x32\xc5\x33\xc5\x3a\x9f\xff" + "\x2b\xcd\x4f\xd3\x90\x26\xe0\xcc\x5c\x36\xf2\x82\xf2\xf4\xf3\x04" + "\x3f\x82\x13\xed\xe9\xf2\xd2\xa7\xcd\x3b\xc9\xc7\x53\x34\x0b\xbf" + "\xb6\x2d\x37\x5d\xea\xf5\x9f\x71\xe8\x6b\x46\x67\x4c\x6e\x7a\xf0" + "\xb8\xc9\xf1\xb2\x64\x2d\xa1\xdd\x89\x05\x62\x1b\x70\xde\xf2\xe5" + "\x2b\x16\x67\x59\xb2\xe6\xcd\xcf\xb6\x88\xd7\x96\x15\xcb\x91\x65" + "\x61\xee\x72\xcb\xd2\x95\x4b\x2c\x8b\x97\x2f\x24\x09\x22\x6b\xd9" + "\xb2\x15\xb6\xdc\xc1\x4c\x7e\x69\x59\xbc\x22\x27\x77\xa1\x0d\x37" + "\xcb\xb3\x96\x2c\xb0\x88\x51\x5f\x8e\xa2\x72\x72\x2c\x5a\x0d\xcb" + "\xb3\xe7\x2d\x23\x44\x58\xf2\x73\x64\x0a\xfa\xbe\xa7\x7c\x11\x41" + "\x7e\xb0\x68\x0d\xba\xa0\xcc\x1e\x75\x1c\x2b\x0e\xdf\x9a\x9b\x4e" + "\x76\x08\x78\xb6\x08\xb9\xb0\xf4\x99\x06\xda\xb3\xf9\x75\x34\x0b" + "\xed\x18\x9d\xea\xe9\x2a\xfd\x49\xa5\xde\x37\xf2\x3b\x2f\xfc\x2e" + "\x0a\x9f\x9e\xb3\x87\x8a\x33\x7e\x98\x17\xd2\x7f\xda\x33\x7f\x93" + "\xb0\xf8\x49\x6d\xb0\xcf\x6e\x69\x13\xf4\x93\xb3\x72\xbf\x63\x36" + "\x9d\xf9\x60\x9a\x9f\x7c\x85\x97\xfe\x24\x8a\xbe\x51\xb7\x2d\xdc" + "\xdf\x55\x3a\x3b\x34\xb0\xee\xfe\x84\xce\xbd\x87\x8a\x7c\xa5\x3f" + "\x19\xcb\x87\x65\x98\x90\xe6\xa0\x76\xf5\xb1\xde\x58\xae\xa0\xdc" + "\x53\xd5\x8c\xdd\x1d\xc3\xac\x57\xb6\x4c\x6b\xec\x8a\x9e\xea\xee" + "\x2e\x61\x03\xbb\xb1\xc6\x79\x0c\x6c\xe4\x55\xe0\xc5\xaa\x7b\x59" + "\xc8\x9a\x19\xcc\x50\xbd\xa8\x9a\xfc\xc6\xb2\xda\xd4\x0a\xe6\x84" + "\x64\xe4\xf4\x1c\x60\xb5\x8e\x66\x56\xe7\xfd\x9d\x8c\xe9\xb0\x9a" + "\xe4\x92\x67\x7f\x41\xbe\xac\x8a\xd6\x70\xdf\x3b\xff\xe9\x1e\xf0" + "\x76\x5b\x35\xc5\x62\x18\xe9\xf4\x7e\xe5\x70\x16\xec\x63\xce\x7c" + "\xa7\x83\xce\xf8\x03\x6e\xaf\xbe\x87\x77\x83\x6a\xf1\xdd\x4c\x36" + "\x10\xcf\x59\x54\xc7\x86\xed\xbc\xf1\x97\xb1\xbc\xe9\x97\xdb\xb9" + "\x6b\x63\xac\x88\xad\xd0\xba\x29\x96\xb7\x6f\xd2\xfc\xd5\x11\x9e" + "\xda\xf2\x98\xb9\x4d\x99\xed\x15\x7a\x8c\x14\xf1\x7c\x73\x9b\xf2" + "\xac\xd8\x9b\x74\xe6\x6f\xa7\xe7\x11\x78\x8e\x93\xcf\xbb\xe9\xf9" + "\x16\x3c\x27\xc8\xe7\x0f\xe8\x39\x0e\xcf\x93\xe5\x73\x3d\x93\xe7" + "\xdd\x9f\x9d\x2e\x9f\x3f\xa3\x67\xc0\xfe\xd9\x39\x8e\x3c\x6a\xef" + "\x5f\x31\x66\xcf\x2e\x2c\x3a\xc3\x0c\xce\xfc\x73\x62\x3e\x1c\x2d" + "\xcc\x26\x3d\x0b\xe6\xc3\xec\xf3\x84\xef\xa0\x55\x1b\xc3\x12\xe9" + "\x3a\xdb\x6e\xf4\xb0\x81\xe0\x35\x87\xe0\xdd\x8b\x04\xbb\x5e\xf9" + "\x99\xb7\xa7\x4d\x99\xe5\xe5\x0e\xfe\xfa\x03\xc0\x83\x17\x18\x7f" + "\x7d\x52\x1a\x17\x6b\xde\x13\xa6\xea\xd5\x1e\xe1\xbb\x17\xfc\x3d" + "\xe6\xd0\xb3\xc2\x8f\xb8\x1b\xfc\x72\x1f\xbe\x3c\x4d\x7c\xdb\x53" + "\x69\x7c\xdf\xfd\x9e\x19\x56\x2f\xd9\x35\x42\x46\xf8\xe9\x8b\x27" + "\xb2\x89\x87\xc8\x9c\xaf\xee\x9b\x94\xa6\x16\xa5\x33\x1e\xff\x40" + "\xf8\x8c\x6c\xee\xc0\x7a\xa6\x48\xfd\x37\xff\x0a\xf5\x7f\x25\xea" + "\x1d\xfd\x40\xb8\xba\x32\x9b\x62\x42\x31\xa2\x31\x85\xb4\xb6\xe7" + "\x81\x9e\xbc\x96\x6e\xf4\x6d\xcb\xcc\x3c\x91\x7d\xb6\x7f\xf1\xd5" + "\x94\x9f\xf6\xed\x57\x1a\x6d\xf2\x71\xf0\x12\xa8\xc7\x8b\xbe\x12" + "\x1f\xf1\xb6\x5a\x63\x00\x3f\x13\xfe\xd6\x4b\x8d\x03\xf8\xca\x74" + "\x23\xfa\x74\xaf\xd3\x7a\x99\xd5\x77\xd3\x5c\x79\x2e\xee\x44\x3e" + "\x63\x53\xf3\xbd\x0e\xa3\x5b\xf8\x1c\x36\xd9\x16\xb1\xdb\xf8\xb0" + "\xa7\xd2\xda\x94\xe7\x72\x66\x16\xa0\x0f\xe8\xfb\x7b\xcd\x8d\xa1" + "\x2a\xfa\x31\x4e\xc2\x8d\xbe\x4b\xc3\xfa\xe4\xd1\xe5\xa2\xfe\xb5" + "\xff\x39\x81\x37\xea\xf2\x74\x46\x67\x0f\xdf\x01\xef\xa2\x5e\x4b" + "\x37\xaa\x58\x97\xe8\xdd\x09\xeb\x79\x46\x75\x4a\x58\x3f\x27\xce" + "\x9d\xf1\x78\xc0\x19\xf5\x93\xaf\x63\x1d\xae\xc8\x9b\xe6\xbb\x96" + "\xdd\xfb\xf8\x6f\xcf\x4c\x44\xfb\xdc\x7c\x5b\xa4\xab\xf7\xf7\x91" + "\x47\x25\x7e\xdc\x6f\xc5\x6f\x12\xdf\x9b\x6b\x03\x0e\xa4\x8a\x98" + "\x9d\xdb\x9f\x2b\xd6\xf7\x95\x31\xdf\x80\x23\xcf\x9d\xaf\x2e\x6c" + "\xed\xdd\xd7\xab\xbd\x4a\xc6\x4a\x1b\xf0\x15\x37\xfa\x28\x06\xf0" + "\x65\xf2\x9b\xdd\x78\xc2\xda\xd9\xcf\x31\x4d\x4f\xec\x6b\x4c\xa9" + "\xfc\xa9\x77\xf1\x6b\xfd\x2c\xaf\xcf\xbd\x51\xc0\xd6\xcd\x63\x22" + "\x5d\xdd\x3c\x45\x91\xb2\xcb\x0b\xa3\x09\x56\xb4\x8e\xac\xfe\x94" + "\x19\x3c\x58\x43\x7f\xf7\xd3\x0d\x86\x84\x4c\x46\x71\xd5\x8a\x4f" + "\x36\x1c\x67\xb3\xa6\xb3\xa2\xba\xec\x4b\x4c\x8f\x81\x86\x75\x8d" + "\xbd\xf9\x53\xb7\x81\xf6\xa0\x28\xe6\x99\x90\xf3\xb7\xcf\x4d\xfc" + "\xfd\x67\xb4\xf6\x66\x58\xde\xfa\xcc\x6d\xf0\x76\xa4\x5b\x84\xdf" + "\x6e\xc8\x14\x45\xd9\x5c\xf5\xef\x4b\x51\x6c\x07\x7b\xd2\x24\x8a" + "\x29\x7d\x2a\xad\x41\x9c\x07\x3f\x95\x7e\x9c\x9d\x6a\xaa\x60\xb5" + "\x2d\x67\xe8\x0c\xe3\xde\x53\xe9\x76\xe2\x2d\x23\xbd\xe0\x1f\x77" + "\x82\x7f\xc4\x7c\x1d\xa4\x9a\xaa\x1a\xf5\xbd\x29\xda\xa7\xd2\x79" + "\x47\x2f\xe6\x68\xa5\x16\x07\xcd\x5b\x9a\x1e\x53\xa9\xed\x53\x51" + "\x7c\xb4\x1d\x79\x2c\x7e\x87\x41\x4d\xef\x6d\x5f\x2a\xf2\x55\xe1" + "\x2f\xc6\xac\x46\x55\x35\xea\x71\xd2\x66\xbe\x6a\x61\xff\x27\xfa" + "\x7e\xc2\xda\xdf\x39\xf9\xbc\xf0\x83\xec\x05\xde\x79\x81\x73\x5e" + "\xc0\x13\x63\xe0\xc2\xb8\xf5\x2a\x97\xe9\x63\x70\xad\x48\x1f\x83" + "\x9f\xfd\x51\x8c\x01\xe4\xb9\xd7\x9e\xd7\xc6\xe0\x4b\x8c\x41\x0b" + "\xc6\xa0\x84\x15\x7f\x34\xbb\x96\xcd\x4a\xc3\x18\xb4\x5f\x22\x9f" + "\xef\x32\x0e\x5d\xae\x84\xbd\x18\x8b\x2f\xdd\xc2\x46\x94\xc6\xe0" + "\xc0\x0b\x72\x0c\xde\x7e\xc1\x0d\x7e\xe8\xfe\xcc\x37\xf1\xec\x5b" + "\x99\x6e\xa1\x78\x3e\xbc\x24\x93\x62\x66\xcb\xb1\xb8\x86\xb1\xb8" + "\x26\xc7\xa2\xf0\x55\x8c\xc5\xe9\x46\xe1\x37\xe6\x54\x53\x2d\xab" + "\xcd\xac\x62\x75\xa0\x4b\x18\x8b\x79\x34\x2e\xa4\x97\xf0\xbd\x66" + "\x8d\xfe\xcd\x6a\x16\x53\xb9\x9a\x99\xf5\xf1\x50\xaf\x61\x3c\x56" + "\x63\x3c\xba\x31\x1e\x1e\xff\x78\xc4\x88\xf1\x38\xaf\x8d\x47\x37" + "\xd9\xbc\x61\x3c\xba\x31\x1e\xdd\x18\x8f\x12\x39\x1e\x44\xe7\x67" + "\x76\x1a\xb9\xfa\x77\x2b\xdb\xdd\xd6\xcb\x78\xbc\xa6\x8d\xc7\x97" + "\xff\xcc\x78\xfc\xac\xf8\xfb\xe3\xf1\xc2\x82\x1f\x1a\x8f\xc0\x9c" + "\x78\xf1\x79\x1a\x8f\x6b\x55\xda\x9c\xb8\x93\xe6\x44\xb1\xe1\x6e" + "\xac\x45\x04\xd3\x93\x0d\x87\xc5\x9c\x40\x5f\x8b\xdf\xfc\xa9\xc7" + "\x50\xdb\x82\x71\x59\x80\x71\x59\x1d\x18\x17\x39\x1e\xcf\xb3\xfd" + "\x9f\x49\xf8\x5b\x9e\xa4\x35\x83\xe6\x06\x8d\x0f\xc6\x09\xf3\xa7" + "\xb7\x18\x82\xc1\xfb\xb7\x28\x53\xa5\x79\x42\x73\x84\xe6\x43\x5d" + "\xf6\x19\x11\x93\xfd\x54\x5a\x0d\xa3\x7d\xdc\x53\xe9\x87\x31\x56" + "\x15\xcc\xb7\x12\x63\x93\x87\x79\xa2\xb0\x51\x14\x4b\xf0\x54\xfa" + "\x06\xe2\x17\x4c\xc0\xf9\x41\x3e\x8c\x93\xaf\xcb\x3c\x78\x23\xe4" + "\xad\x3d\x79\x81\x79\xb3\x5b\x8b\x9b\xcc\xc3\xd2\x63\x90\x1e\xea" + "\xc5\x18\x61\xee\xf4\x98\x33\xfe\x78\xca\x7f\xb3\xb2\x5d\xcd\x2c" + "\x7c\xe8\x42\x39\x46\xbe\xa0\x39\x33\x63\x21\xcd\x99\x62\x8c\xd1" + "\xa7\xfd\x1c\xa3\x17\xa5\x4d\x7f\x2c\x68\xf5\xb0\x48\x17\x1f\x4d" + "\x63\xf4\xb3\xce\xbe\xc6\xc8\xb7\xef\x7e\xab\xcf\x34\x95\xf6\x9f" + "\x47\xaa\x4b\x67\x2b\x2a\x64\xa9\x6e\xc8\xb0\xa7\xdc\x5e\x56\x00" + "\x19\x62\xf5\x19\x16\xe6\x9c\xfd\x09\x73\xba\x0e\x31\xf2\xe3\x4c" + "\xfa\x74\x8a\xe7\xe0\xf4\x1e\x02\xbd\x5a\xe8\xa2\xe7\x5d\xe2\xd9" + "\xcd\x5e\x7b\x91\x85\x88\x18\xa3\xe9\x55\x6c\x23\xf0\xf3\xad\x17" + "\xaa\x0c\xea\xd6\xa7\x32\xb9\x89\xe2\xd0\x30\x07\xd9\x9a\x17\xad" + "\x62\x11\x75\xd9\xb5\xe4\xcb\xee\x2b\xf2\x4d\x5c\xdf\x89\x32\xdd" + "\xbc\xdb\x87\x35\x63\x77\x09\x3f\x44\xbe\xf9\xc7\xe5\x0b\x5e\x1c" + "\xf8\x32\xf7\x3e\xe2\x45\x48\x6f\xe8\x28\xdc\x01\xde\x6b\xee\x83" + "\xd4\x37\xa4\x29\x75\x8b\xc8\xee\x62\xde\x9b\xd4\x2e\xe1\xa7\xd1" + "\x2b\xaf\xe3\x28\x16\x63\xec\xa2\x3b\x8e\x14\xba\x43\xed\x90\x8d" + "\xc1\xa3\x51\x39\xbf\xe0\x52\x4e\xb4\x3a\x4f\x7b\x84\xfe\xd6\x5d" + "\x94\x1d\x66\x5f\x4d\x31\x03\xc9\xcf\x3f\xad\xd9\xf3\xc8\x3f\x4f" + "\x32\x70\x36\x95\xc7\x3e\x57\x5c\xfd\x92\xdb\x10\x58\x97\xe7\x56" + "\x03\x6f\x53\xa7\x5a\x79\x11\xc5\x43\x78\x0f\xfd\xe2\xdb\x9f\x6c" + "\xf8\x5d\xb3\x47\xd0\x94\xdf\xbf\xb4\xc1\xc0\x81\xd3\x1e\xd0\x87" + "\xda\xcf\xfe\xa7\x88\xfb\x7a\x4e\xc9\x78\xff\xa3\x74\x2f\xa3\xfa" + "\x9f\xbd\x8b\xf6\x4a\xe6\x76\x5e\x35\x34\xdb\xae\x86\xa5\xdb\x8a" + "\x5a\x02\x31\x2f\x83\x63\x5b\x12\x9d\x79\xeb\x25\x94\x49\x74\xa6" + "\xb9\xd8\x20\x69\x4b\x32\xe9\x38\xc3\xaf\xa7\x2d\x75\xed\xe7\x59" + "\x21\xf0\xb8\x2e\xbb\x4a\xc4\xac\x88\x04\x7d\x57\x5f\x03\x3d\xb9" + "\x66\x8d\xde\x05\x7a\x42\x74\x60\x37\xe8\x87\xfa\x9a\x79\x70\x59" + "\x37\x4b\xd0\xe9\x08\xf1\x5e\x74\x7d\x11\x38\x6a\xac\x41\x1a\xc6" + "\x49\x05\x5d\x07\x3d\xb1\xee\x5c\xcd\xe2\x77\x02\x47\x77\x11\x1d" + "\x01\x5f\x3c\xd3\x06\x3a\xb2\x12\x74\x24\x4f\xc4\x1e\x36\xef\x36" + "\x48\xfa\xf1\x9f\xcd\x1b\x0c\x76\x3d\xf6\xb8\x80\x6f\xe6\xb3\xf5" + "\x84\x1f\x99\xc5\xe2\xcc\x9c\x8f\xd6\xa7\xd7\xd2\x43\xea\x3b\x81" + "\x23\xdb\x17\x36\x50\x9a\x98\xb7\x2b\xb3\x07\xab\x12\xd7\x92\x09" + "\x26\x7b\x2e\xb0\x44\x11\x9f\xf3\xa2\x79\xf0\xe6\x25\x2c\x61\xf7" + "\x05\x16\xbf\x7b\x09\xb3\x62\xbe\x1a\x76\xa3\x0d\x73\x5f\x35\x31" + "\x11\x1b\x22\x2c\x3d\x1f\xe9\xbd\xc6\x86\x00\x5f\x6d\xde\x4d\x73" + "\x66\xa9\xd5\xdf\x26\xaf\xbd\xc0\xe6\x03\xec\xa4\x2f\xa7\xcc\xb7" + "\xa4\xad\xf4\x58\xab\xe4\xf3\x21\x00\x08\x7b\xa5\x09\x14\xb7\x7e" + "\x60\x9b\x92\xb9\x8d\x6f\x79\xd8\x62\x5b\x4d\x3e\x91\xb5\x77\xe0" + "\x3d\x55\x8c\xd5\xd8\x62\x56\xac\x46\xbd\xe1\x71\xe6\x83\x77\x22" + "\xdf\xcd\xfd\x9a\x87\x99\xc2\x1f\x8d\xcf\x5e\x40\xb1\xd7\x93\xd5" + "\x2d\x05\x05\x7b\xda\x58\x22\x7f\x05\xe3\xb1\x08\x7d\x6d\x63\xf1" + "\x95\x6d\xe8\xeb\x4a\xd9\x57\x3d\xd6\xba\x5a\xd2\x9c\x8f\x77\x37" + "\x8c\xab\xe4\x7e\x85\xe2\x2a\x8d\xf1\x80\x86\xdd\xc4\x6f\x67\xac" + "\xae\x5d\xf8\xd1\xe8\x72\x7a\x49\x77\x9c\x79\x80\xf4\x48\xce\x4b" + "\x02\xa7\x7f\x49\xb8\xac\x56\xe5\xda\x32\x9a\x80\xdb\x5d\xd9\x8c" + "\xe3\xfe\xbd\x66\x92\xf3\x25\xcf\xe7\x52\xe6\x1e\x22\x3e\xed\x28" + "\xd2\x08\xf7\x83\x70\xfe\x10\xe1\x3c\xbd\x17\x78\x8f\xef\x9c\x4d" + "\x67\x19\x95\x17\x5c\x0e\x8d\xbf\x5e\xd6\x39\xe5\xa5\xc5\x54\x16" + "\xe1\x02\xe9\x7b\x68\xae\xc9\xb1\x3f\x44\xb6\xe2\x66\x1e\x3b\xdd" + "\x2d\x9f\xdd\xe4\x0f\xc5\x44\x38\x20\x70\x05\xf4\x9b\xfc\xac\x72" + "\x9e\x1e\x02\x3c\xa3\x76\x0e\xc6\x78\x27\xea\x78\x81\xb4\x98\xeb" + "\x71\x23\x72\xad\x89\x64\x9a\x18\xba\xff\x47\xf1\xa3\x7f\xe3\xf7" + "\x52\x4e\x9f\x76\x70\xf1\xe0\x6f\x41\x2f\x89\x6e\xfa\x3a\x82\x68" + "\x66\xbb\xa4\x99\x44\x93\x74\xba\x29\x68\x93\xf0\xed\x7f\x88\x6c" + "\x66\xb3\x45\x1b\xfb\x49\x37\xeb\xda\x03\x74\x73\xa6\x2d\x88\x6e" + "\xb6\xf3\x6e\x75\x74\x6f\x74\x73\xfe\xe2\x9e\x74\x73\xfe\xab\x3d" + "\xe9\xe6\xcb\x9f\x5e\x4f\x37\xbf\x4f\x33\xe7\xff\xa1\x37\x7a\x09" + "\x39\x66\x64\x9b\xf2\xf2\xfa\xbe\x69\xe5\xfc\xa6\xfe\xd3\xca\x05" + "\xe7\x7b\xd2\xca\x05\x96\xff\xef\xd2\xca\xac\xb5\x3d\x68\xa5\xe9" + "\x1f\xa4\x95\x6d\x82\x56\xc6\xf0\xbf\x63\x4e\x68\xf4\x63\xf7\xa2" + "\x3e\x68\xe5\xa2\x1f\x98\x0b\xaf\xf4\x45\x2b\xb3\xbe\xe8\x49\x2b" + "\x5f\x8e\xe8\x49\x2b\xb3\xde\x0f\xd0\x4a\xed\xdd\xbf\x84\x56\x66" + "\x35\xfe\xf7\xd0\xca\xac\x46\x41\x2b\x2f\x10\xad\x7c\xf9\x8f\x3f" + "\x4c\x2b\xe7\xb7\xf4\x4e\x2b\x91\x2e\x68\xe5\xfc\x96\x00\xad\x3c" + "\xf3\x03\xb4\xf2\xe7\xbf\xe9\x07\xad\x8c\x11\xb4\xd2\xd4\x07\xad" + "\x5c\x04\x58\x69\x78\x21\x70\xef\x3a\xdc\xd0\x68\xa5\xd9\x4f\x2b" + "\xff\x01\xfc\xe8\xdf\xf8\xfd\xbc\xe2\x46\xb4\x52\xb5\x4b\xfe\x92" + "\x68\x25\x8f\xd5\x68\x65\x8e\x97\xad\xfe\x02\x34\xf2\x74\x9b\xb0" + "\xc7\x10\xf6\xbd\xf8\x15\x3c\x4f\xb4\x28\xbd\xf8\x6d\xc0\xcb\xe9" + "\xaa\x16\xb4\x49\x9c\xd1\x9a\x4e\xb4\xaa\x1a\x79\x2b\xfc\x7c\xa7" + "\xa0\x9d\x5f\x68\xb4\x73\x8e\x46\x3b\xe7\xfe\x17\x68\xe7\x0b\x34" + "\x96\xd9\x6f\x5e\x35\xe8\xb4\x73\x0b\x68\x67\xb6\xe0\x1f\x68\x3f" + "\x58\xd2\xce\x9c\xd1\x7a\xbb\x48\xa7\xe9\xcc\xdd\xc1\x64\xbb\x2e" + "\x7d\x9f\x8e\x3e\x29\xca\xf3\x39\x16\xb5\x33\x3f\x2d\x9d\x13\xa0" + "\xa5\xe7\x94\x57\x3e\xed\x9b\x8e\x2e\x8c\xf7\xd3\xd1\x12\xd0\xd1" + "\xbf\x06\xd1\x51\xc8\x4d\xbf\x27\x9a\x07\x3a\xda\x25\xe8\xe8\x7f" + "\x6a\x74\x74\xd1\x7d\x1f\xcd\x01\x1d\x7d\x52\xa7\xa3\x0b\xb3\x3d" + "\x25\xcd\x36\x4f\xe9\x0f\xd3\xd1\x2e\x41\x47\x6d\xff\xf7\xd3\xd1" + "\xe3\xd7\xd1\x51\xc8\xae\x14\x6f\xbd\x57\x3a\xaa\xe3\xa3\xa0\xa3" + "\xc5\x01\x3a\x2a\xe0\xba\xe8\xe3\xfa\x4c\xc0\x3d\xd3\x26\x64\x37" + "\x3f\x1d\xb5\x55\x4b\x3a\x4a\xe7\x3b\x49\x7f\xb2\x1c\x74\x14\xf8" + "\x57\x54\x87\x7e\x63\xbe\xa0\x8d\x26\xa2\xaf\x7b\x30\x67\x08\x46" + "\x7e\x7a\xba\x08\x73\x86\x68\x4c\x07\xe6\x0c\xe8\xe8\xdc\xcb\x26" + "\x26\xe6\x4b\x69\xba\xa4\x31\xbd\xc5\x25\xd3\x6d\x70\xfb\xa4\xa7" + "\xaf\xdc\xd5\x93\x9e\xbe\x32\xa7\x27\x3d\x7d\x25\x2a\x40\x4f\xb5" + "\x77\x44\x4f\x31\x66\x80\x8f\x87\x68\xea\x3f\x47\x4f\x5f\xb1\xfa" + "\xe9\xa9\x41\xa3\xa7\x8b\x7e\x98\x9e\x8a\x3d\xc2\x3e\xe8\x69\x30" + "\x6d\xe8\x9b\x9e\xbe\x62\x0d\xd0\xd3\x9c\x01\x7e\x7a\xda\xd8\x17" + "\x3d\x5d\x98\xd0\x3b\x3d\x45\xba\xa0\xa7\x0b\x13\xfc\xf4\xb4\xb1" + "\x17\x7a\xfa\x64\x30\x3d\xcd\xb9\x2c\xe9\x69\xb5\xf4\xdb\x01\x9a" + "\x5a\xdf\x09\xfc\xa0\x39\x97\x5b\x21\x68\xaa\x0a\x9a\x4a\xb1\x5a" + "\x29\x56\x0d\xd9\xd5\xf7\x46\x53\x25\xcd\x75\x31\xa2\xab\x34\x37" + "\x8b\x66\x40\xde\xc5\x5a\x04\x98\x88\xb5\x57\x87\xdf\x9e\x20\xfa" + "\x9a\xb1\xca\x44\xbc\x5d\x0f\x5c\x51\x75\x5c\xe9\xb0\x92\x5d\x70" + "\x0f\x5c\xe9\xdf\x58\xe6\x7c\xef\xbc\xd9\x0f\xc9\xee\x1f\x91\xec" + "\xfe\x2c\x33\xbc\xf6\x2c\xe8\x6b\x3a\xc9\xee\xfb\xaf\x93\xdd\xf7" + "\x7f\x5f\x76\xff\xf4\xc6\x74\xb4\x5f\xb2\xfb\x4f\x69\x0c\x17\x7f" + "\xd7\x93\x8e\x2e\xbe\xdc\x93\x8e\xbe\xfa\x2a\xb5\x4b\xd2\xf1\xfd" + "\xbd\xcb\xee\x62\x9e\x2f\xf9\xb1\x5f\x76\x6f\xec\x49\x3f\x03\xb2" + "\xfb\xab\xa3\xfa\xa6\xa3\x4b\x72\x7a\xf0\xa3\x73\x35\x3a\xfa\x92" + "\x46\x47\x5f\x0a\xd0\xd1\x53\x9f\xe8\xfc\xe8\xd2\x5f\x9e\x6c\x0c" + "\xa6\xa3\x4b\xaa\xfd\x74\xb4\xe9\xfb\x74\x54\xa7\xa1\x44\x4f\xa9" + "\x1c\xd2\x65\x1d\x00\x9d\x7e\xe7\x25\x9b\x41\xea\x6a\x33\x09\x76" + "\xe1\xd7\xeb\x6a\xeb\xda\x2f\xb3\xc2\x39\x44\x4f\x2b\x04\x3d\x35" + "\x2a\x6c\x1e\x68\x5f\x24\x9d\x23\xa8\xa4\xfd\xfd\x3c\x19\xeb\x89" + "\xf4\x4b\xea\x4a\x19\x37\x51\xd7\x33\xa1\xbf\x62\x5f\xff\xc5\x33" + "\x1a\x4d\xa5\x78\xe8\xc0\xb9\x9d\x57\x40\x53\xf3\x7a\xe1\x4d\x5f" + "\x03\x4d\x5d\x1d\xc4\x9b\x62\xee\xff\xe7\x4b\xd7\xd3\x54\xdb\xad" + "\xf5\x84\x2b\x44\x53\x7b\xc8\xf1\xfb\xff\x1f\x20\xc7\xdb\x56\xf4" + "\xa4\xa5\xb6\xfd\x3d\x69\xa9\xed\xc5\x00\x2d\xd5\xde\xfd\x4b\x78" + "\x53\x5b\xee\x7f\x0f\x6f\x6a\xcb\x0d\xc8\xf1\xaf\x3e\xed\xa7\xa5" + "\xa7\xfb\xa2\xa5\x4b\x72\x7b\xa7\xa5\x48\x17\xb4\x74\x49\xae\x9f" + "\x96\x9e\xee\x45\x8e\xef\x41\x4b\x97\xdd\x27\x69\xe9\x7e\xc9\x9b" + "\x36\xea\xbc\xe9\xfe\xff\x17\xca\xf1\xcb\x26\xf6\x57\x8e\xff\xa8" + "\x5d\xd2\x4f\xa2\x4f\x3a\x0d\x0d\xc8\xf1\xfb\xfb\x96\xe3\x7f\x80" + "\x86\xf6\x8b\x17\x15\x34\x74\xf9\x7d\x3d\x69\xe8\xf2\x07\x7b\xd2" + "\xd0\xbc\x37\xaf\xa7\xa1\xdf\xa7\x9f\xcb\x57\xf5\x46\x3b\xa5\x1c" + "\x9f\x97\xde\x37\xdd\x5c\xbe\xaf\xff\x74\x33\xf7\xfd\x9e\x74\x73" + "\x79\xeb\xff\x3f\xe8\xe6\x8a\x67\x7b\xd0\x4d\xd3\x3f\x48\x37\xff" + "\x97\xc8\xf4\x2b\xae\xd3\x7f\xae\xb8\x4e\xff\xb9\xe2\xff\x62\xef" + "\xfb\xe3\xa2\xa8\xf6\xf7\x0f\xbb\x6b\x61\x81\x80\x17\x0c\xbd\x64" + "\x58\x78\xc3\xd4\xc4\x52\xd3\xd2\x42\xd3\x04\x53\x91\x2e\x5e\x11" + "\x15\xb1\xa4\xc0\xd4\x50\xc1\x8b\x08\x88\x3f\x2f\x1a\x20\x18\x28" + "\x1a\x28\xf6\xd1\xae\x76\xd5\xf0\x5e\xed\x62\x4a\xad\x37\xbd\xa1" + "\xf1\xcb\xd2\xc2\x42\x5b\x09\xbd\x68\x68\xab\xa2\x2c\xb0\xbb\xf3" + "\x7d\x9f\x39\xb3\xcc\xce\xee\xcc\xee\xce\x2c\x20\xf6\xf5\x8f\x7d" + "\x29\x33\xb3\x67\xcf\x9c\xf7\x33\xcf\x3c\xcf\x7b\xce\x79\x8f\x51" + "\xfe\x33\xae\x0d\xf3\x9f\x71\xf7\x28\xff\x19\xb7\x8f\xd5\xa0\x4b" + "\xd7\x5b\xe7\xcd\x25\xfb\xf8\x79\x13\xb6\xd3\xbc\xb9\x64\x1f\xcb" + "\x9b\xd6\x34\xe8\x5f\x17\x88\xe0\xcd\x4e\xee\xe9\xff\x6a\x31\xff" + "\xc9\xe7\xe9\x31\x6f\xd2\x7c\x59\x65\xe2\xe9\xa7\x1a\x7b\xfa\x3d" + "\xac\xa7\x0f\x20\xbc\x55\xa1\xcd\xe4\x7a\xfa\x36\xe7\xd1\xf8\x24" + "\x4d\x6b\x3e\x74\x03\xf0\x68\x3c\x5d\xff\x58\xd3\x9a\x0f\x4d\xec" + "\x62\xe8\x17\xf1\xf4\x9b\x10\xe9\x17\x8f\xa7\xa7\xe7\x1c\xc7\x9f" + "\x69\xf5\xf4\x55\xa6\x9e\x7e\xf9\x61\x61\x4e\x8d\xd7\xf0\x7a\x7a" + "\xec\xbf\x69\x4e\x8d\xa1\x39\xf5\xee\x66\x63\x4e\x4d\xf0\xa0\x39" + "\xf5\x35\x03\xa7\x2e\x1b\xa9\x81\x6b\x53\xf3\x90\x75\x4e\xc5\xed" + "\xb0\x9c\x1a\xd5\x31\x9c\xaa\xb4\x9d\x53\x8d\xd7\xb0\x7e\x0e\xe7" + "\xde\xca\xa9\xf4\x18\x27\x1c\x2c\x8f\xc0\x9c\x1a\x65\xe2\xef\xf7" + "\xf0\xfb\xfb\x53\x48\x86\xc7\xc7\xe0\xef\x71\x0c\x68\xbe\x69\x57" + "\x7f\xbf\xbc\x2b\x97\x5b\x97\x8f\xe4\x72\x6b\xc2\x4d\x96\x5b\x99" + "\x7d\x6d\xe2\xef\x97\x3b\xde\x1b\x7f\xbf\xdc\x91\xe5\xd6\xe5\x97" + "\xad\x73\xeb\x32\xc4\xcf\xad\xb0\x9d\xe6\xd6\x65\xc8\x22\xb7\xbe" + "\x66\xcc\xad\x89\xe7\x0c\xdc\xca\xfa\x7b\xc0\x07\xbe\xfe\x62\x33" + "\xa5\xfb\xfb\xc0\x7b\xed\xef\x13\xcd\xea\x7f\x58\xf4\xf7\x9b\x81" + "\x67\xc1\x8b\x2f\x3f\x03\xfe\x3e\x98\xf1\xf7\xd5\x05\x26\xfe\xbe" + "\xc0\xcc\xdf\x27\x06\x33\x9c\x0a\xd7\x14\xcd\xa9\x6f\xee\x91\xee" + "\xef\xdf\xc0\x31\x4c\x3a\xc3\xe5\xd4\xa4\x73\x5c\x4e\x5d\x19\x89" + "\xfb\x45\x38\xbd\x80\xdf\xdf\xd3\xd7\x79\x72\x1f\x8e\xbf\x87\xfe" + "\x99\xfb\xfb\x95\x1e\x1c\x4e\x0d\x37\xe6\xd4\xe4\x89\x1c\x9d\x0a" + "\xe7\x85\x39\x75\xef\x45\xc2\xa9\x9f\x5c\x34\xe2\xd4\xc9\x9f\x30" + "\x9c\xba\x22\xe9\x54\x88\x31\xa7\x26\x67\x1a\x38\x95\xe6\xcb\x70" + "\x8d\x6c\x45\xa8\xf9\xbc\x13\x7a\xbe\x0f\x9e\x0b\x04\x6d\xe3\x35" + "\x66\xb8\xcd\xfd\x17\xa3\xac\xcf\x37\x09\xe5\x9f\x6f\x52\x11\xab" + "\x42\xa5\xb5\x99\xf4\x3c\x93\x3c\x3c\xcf\x64\x25\xea\x93\xd7\x4c" + "\x6a\x07\xd0\xb5\x17\x05\xea\x06\xcc\x9a\xce\xf2\x2c\x9e\x93\xf5" + "\x21\x9e\x93\x75\x97\xcc\x01\x82\x78\x9b\xd7\x0a\x30\xe8\x26\xe0" + "\x83\x23\x17\x4d\x79\x36\xc5\xad\x1c\xe3\x67\x66\x94\x89\xe7\x2f" + "\xe8\x04\x9e\x3f\x25\x9a\xcb\xaf\x29\x79\x5c\x7e\x4d\x09\x66\xf9" + "\x95\xd9\xd7\x26\xda\x35\x25\xea\xde\x68\xd7\x94\x28\xd6\xf3\xaf" + "\x1c\xd7\xca\xaf\x95\x46\xfc\x7a\xd1\x98\x5f\x93\x43\x68\x7e\xbd" + "\x68\xca\xaf\xb0\x9d\xe6\xd7\xe4\x90\x56\x7e\xad\x34\xf1\xfc\x17" + "\x4d\xf9\x75\x55\x3f\x9a\x5f\xab\x0b\x4c\xb4\x6b\x81\x75\xcf\x5f" + "\xdd\xd9\x3c\xff\x2a\x5f\x51\x9e\x1f\x73\xea\x7c\xc2\xa9\x98\xb3" + "\x0c\xbc\xca\x7a\xfe\x02\x41\xcf\x6f\x8d\x57\x45\x69\x55\x9a\x57" + "\x57\xf7\xe3\xf2\xea\xea\x81\x5c\x5e\x5d\x77\xd0\x94\x57\xcd\x39" + "\x75\xf5\x02\x3e\x3e\x25\x9e\x7f\x5d\x84\x30\x97\xae\xce\x15\xcf" + "\xa5\x6b\x4e\x71\xb9\x74\x75\xf5\xff\xbf\x5c\xba\x76\x16\x87\x4b" + "\x5d\x6d\xe4\xd2\x0e\xc9\x03\xac\x3d\xcc\xe5\xd2\xb5\x75\x5c\x2e" + "\x5d\x9b\xcf\x72\x29\xb3\xaf\x4d\xb8\x74\xed\xa1\x7b\xc3\xa5\x6b" + "\x0f\xb1\x5a\x75\x5d\x96\x75\x2e\x5d\x5d\xc0\xcf\xa5\xb0\x9d\xe6" + "\xd2\xd5\x05\x2c\x97\x5e\xb0\xc2\xa5\x7f\x8b\x13\xc1\xa5\xdc\x3c" + "\x80\x29\x97\xde\xf3\x3c\xc0\xdf\x62\x45\xe5\x01\x0c\x5c\x1a\x6c" + "\x9e\x07\xc0\xfc\x4a\xe7\x01\x60\xbc\x0c\x1c\x46\xe7\x01\xc6\x12" + "\x2e\xab\xd0\xa6\x72\xf2\x00\x6d\xcf\xad\xa9\x6b\x35\xad\xf9\xd4" + "\x55\xc0\xad\xa9\x74\xed\x5a\x4d\x6b\x3e\x35\xad\x8f\xa1\x5f\x24" + "\x0f\xb0\x01\x91\x7e\xf1\xe4\x01\xc6\xd0\xed\x9d\xe7\xe4\x01\x8c" + "\xb8\xf6\x8a\xc3\xfb\x67\x84\x79\x76\x3d\xe2\xe4\x01\x6a\x58\x9e" + "\xbd\x8b\xe7\xa8\x03\x0f\xd2\x3c\xdb\xc3\x98\x67\x37\x0c\xa6\x79" + "\x76\x8c\x81\x67\xd7\x8f\x6d\x84\x6b\xb3\x51\x2c\xcf\xe2\x75\x04" + "\x17\x23\xee\x0d\xcf\x16\x89\xe0\x59\xa3\xdc\xc0\x11\x18\x8f\x56" + "\x9e\xa5\xc7\x7d\x43\x59\xf9\x4c\xcc\xb3\x11\x26\xb9\x81\x02\xfe" + "\xdc\xc0\xc9\x7b\x91\x1b\x78\xbf\x2f\x97\x6f\xdf\x0f\xe5\xf2\xed" + "\xfb\xce\x2c\xdf\x32\xfb\xda\x24\x37\xf0\xbe\xcf\xbd\xc9\x0d\xbc" + "\xef\xc3\xf2\x6d\x9a\x83\x75\xbe\x5d\xef\xc8\xcf\xb7\xb0\x9d\xe6" + "\xdb\xf5\x8e\x16\xf9\x76\x8c\x31\xdf\xa6\xdd\x34\xf0\x2d\x9b\x1b" + "\x28\x60\x72\x03\xa9\xd6\x73\x03\xd5\x02\xb9\x81\x71\xf7\x3a\x37" + "\x90\xa6\x16\x93\x1b\x68\xda\x4c\xe6\xed\x2f\xc7\xf3\xf6\x67\x01" + "\xff\x4e\xf9\x16\xc6\xc0\xfa\xbc\xfd\x44\xc3\xfc\xd3\x88\x5c\x86" + "\x67\x73\x79\x73\x03\xa7\xeb\x84\x73\x03\xa7\xcf\x1a\xcf\x3f\x4d" + "\xbf\xce\x7d\x6e\x95\x7e\xd3\xf0\xdc\xea\xf4\xf7\x98\x67\xb3\xe8" + "\x9a\x91\xfa\xec\xd9\x05\xa4\xfe\x76\x96\x06\xf7\x93\x6f\x1e\xff" + "\xe7\x7a\xe3\x67\x59\x19\x93\x5a\x73\x05\x95\x98\x6f\x73\x91\x9e" + "\x8a\x7a\x08\xd7\xff\xa6\x73\x05\x7f\xc1\xd8\xcb\xda\x6b\xcc\xbb" + "\x5f\xfc\x68\xcc\xbb\x19\xf1\x06\xde\xd5\x01\xef\x16\xd7\xe4\x92" + "\xfc\x6b\x18\x99\x9b\xba\x2f\xcc\x68\x6e\xea\xb7\xff\x61\x78\x77" + "\x63\xdc\x29\x15\x9c\xbf\xa5\xf9\x53\xf0\xfd\x03\x3f\xda\x3a\x07" + "\x35\x97\x77\xee\x14\xc3\x4f\xbc\xf3\xa7\xa0\xaf\xae\xf9\xcc\xb5" + "\xaa\x83\xeb\x34\xdf\x68\xfe\x54\x5e\x02\x5c\xcf\xcc\xba\x12\x8b" + "\xf3\x50\xc3\xd8\x79\xa8\x54\x76\x78\x35\xbe\xbf\xe9\x73\x66\x17" + "\x34\x53\x51\x72\xca\x3d\xbc\x1a\xff\x7e\x4b\x0b\xdc\x77\x5e\x0d" + "\x95\x13\x5f\x17\xae\x04\xee\xe9\x46\xc6\x7d\x63\xa1\x0e\xee\x35" + "\x3a\xb8\xd7\xe8\xb3\xc3\x95\x5a\xac\x4d\x36\x87\x9f\xc8\x03\x9f" + "\xa7\x5d\x45\xbf\x13\xf1\x91\x0c\xf0\x7a\x3b\xb0\xcf\xbb\x01\xd7" + "\xc6\x0a\x5f\x19\xee\x8f\x81\x47\x5d\xea\xe0\x3c\x6e\x58\xd6\x72" + "\xda\xdf\x58\x1e\x55\x4e\x38\x0d\xbf\x99\xb9\xbb\x1c\x63\x37\x94" + "\x5d\x53\x40\x6b\x66\x81\xb9\xb2\xb8\x2f\xa4\xe6\x22\x60\xa1\x0d" + "\x72\x12\xc6\xfd\xe1\xf2\x7a\xa6\x8e\xcb\xeb\x59\x7e\x5c\x5e\xcf" + "\xbc\xcc\xf2\x3a\xb3\x0f\x78\x1d\xe2\x46\xeb\x68\xb8\xf7\x49\xd4" + "\xd1\x99\x5a\x03\xaf\xeb\x19\x5e\xdf\x6e\x03\xaf\x5b\xd4\xd1\x46" + "\xbc\x24\xcc\xeb\x99\x5a\x36\x27\x91\x75\x9e\x77\x8e\xec\x8f\xc6" + "\xbc\x9e\x91\x42\xf3\xfa\x8f\xa6\xbc\x0e\xdb\x69\x5e\xcf\x48\x11" + "\x5c\x4f\xf0\xa3\xe9\xf3\xb4\x4d\xc5\x34\xaf\x57\x31\x73\x64\x2b" + "\x45\xac\x27\xa8\x22\x9c\x6e\xe0\x72\x9c\xaf\xba\xb7\x39\x89\x4d" + "\xc7\xc4\xe4\x24\x68\x2e\xaf\x27\x5c\x8e\xb9\xd1\xc0\xe7\xb6\xac" + "\x27\xb0\xc6\xe7\x06\xdd\x8c\xf9\x5c\x48\x37\x73\xf9\xfc\x83\x62" + "\x2e\x9f\x7f\x70\x9c\xcb\xe7\x5b\x8a\xb9\x7c\xbe\xe5\x98\x29\x9f" + "\x9b\x73\x79\xb6\x1b\x1f\x8f\xc7\xfc\x05\xe7\x28\xb6\xcc\x17\xe6" + "\xf0\xec\x91\xe2\x39\x3c\x67\xc4\xff\x77\x1c\xee\x6a\xca\xe1\x39" + "\xb1\x98\x83\x74\xeb\x4c\x38\x7c\x1e\xc3\xe1\x0c\x8f\xec\xb8\xc6" + "\x68\x61\x53\x0e\xaf\x87\xf3\xb0\xe2\xc7\xb5\xbf\x9a\x72\xf8\xe6" + "\x68\x0e\x87\xbb\x5a\xe1\xf0\x79\x24\x0f\xc2\x99\x97\x2b\x90\x0b" + "\x81\xf3\x88\xcf\x17\xd0\xe6\x86\x31\x33\xee\x0f\x97\xc3\x37\x1f" + "\xe7\x72\xf8\xe6\x06\x2e\x87\x6f\xde\xcb\x72\x38\xb3\xaf\x4d\xb4" + "\xf9\x66\x65\x9b\x6b\x73\x03\x3e\x2c\x72\xf8\x66\x25\xab\xcd\xb7" + "\xe4\x5b\xe7\xf0\xec\xb1\xfc\x1c\x0e\xdb\x69\x0e\xcf\x1e\x2b\xb8" + "\xce\xc1\x8c\xc3\x73\x93\x44\x70\x38\x37\x17\x62\xe0\x70\x26\x17" + "\xb2\xc3\x28\x17\xa2\x5b\x45\x72\x21\xf9\xd7\x08\x36\xba\x39\x10" + "\x9c\x02\x7e\x3c\xb7\xcb\x2c\x7b\xb7\x7c\x49\x79\x90\x5c\xc1\xfa" + "\x57\x7c\x79\x10\x9a\xbf\xf1\x1a\x87\xe9\xc0\xdb\x95\x36\xae\x71" + "\x08\x30\xac\x71\xc8\x14\x58\xe3\xc0\xf0\x79\xb8\x1d\x7c\x4e\xaf" + "\x71\xd8\x9a\xce\xcd\x31\x6f\xcd\x32\xe4\x98\x09\x9f\xe7\xef\xe4" + "\xf2\x79\x7e\x41\xeb\x9a\x07\xe0\xfc\x8a\x98\x4d\x66\x6b\x1e\x5a" + "\xb9\x9d\xce\x83\x6e\xbd\xa9\xfc\x4b\x2d\x6a\xe5\xf7\x99\x2c\xbf" + "\x43\x5b\xc1\x1c\x6e\xaf\x31\xe6\xf6\x6d\x9e\x1c\x6e\xbf\x98\xcb" + "\x9d\x1f\x51\x13\x63\xc4\xed\x86\x35\x0f\x1f\x7a\x9c\xaa\xb6\xc2" + "\xed\xf0\x7d\xdb\xd7\x88\xb5\x2d\xb7\x1b\xd6\x37\xf0\x72\xbb\xf1" + "\xfa\x06\xa3\xf9\x0f\x98\xdb\xe9\xf7\x66\x78\x98\x70\xfb\xf2\x28" + "\x99\xee\x2b\xb8\x1e\x80\xd7\xf1\x35\xa2\xa3\x80\xdb\xe9\xf1\xfe" + "\x70\x8a\x31\xb7\xb7\xac\x22\xdc\xfe\xe1\x35\xfb\xb9\xbd\x55\x0f" + "\x1b\x73\xfb\x6b\x98\xdb\xf3\x26\x91\xf5\x17\x29\xb6\xad\xbf\x30" + "\x99\x9f\xf1\xa1\x0d\xf9\x17\x8b\x1c\xcf\xd3\x2f\x2e\xc7\xe7\xed" + "\xe6\x72\x7c\x5e\x15\x97\xe3\xf3\xd2\x59\x8e\x67\xf6\xb5\x89\x4e" + "\xcf\xdb\x75\x6f\xf2\x2f\x79\xbb\x58\x8e\xcf\x5f\x69\x7d\xed\xc5" + "\x36\x6f\xfe\xb9\x19\xb0\x9d\xe6\xf8\x6d\xde\x16\xd7\x5e\x70\xf2" + "\xdd\xdb\x17\xf1\xae\xbd\xa8\xec\xb8\xb9\x19\xc6\x58\x31\xcd\xbf" + "\x48\xcf\x7d\x6f\x8f\x11\x9b\x7f\xc1\x6b\x2f\x96\x9f\x33\x5a\x7b" + "\x51\x6d\x7d\xed\x45\xe2\x54\x1b\xf3\x2f\x16\xe6\x66\x9c\x9e\x62" + "\x3c\xdf\x6d\xc7\x02\x2e\xbf\xef\x58\xd4\xca\xef\x6f\x60\x7e\xff" + "\xbf\xb5\x5c\x7e\xff\xbf\x35\xb8\x9f\x7c\x6b\x31\x3e\xe7\x3c\x57" + "\xdc\x51\xc6\x9d\xab\x61\x92\x7f\x79\x03\x63\xef\xff\x86\x72\xf8" + "\xfd\xa2\x31\xbf\xef\xd0\xf0\x69\x77\x9c\xf7\xa6\xe7\x14\x87\x1b" + "\xad\x69\x9b\x6c\x98\xff\xb6\xd3\xe1\x54\x28\x9c\xbf\x4a\x60\xae" + "\x5b\x38\x99\xeb\x46\xcf\x6d\xc3\x79\x70\x68\xeb\xd3\xf0\x18\x59" + "\x72\x04\xa5\xc7\x73\xdd\x4c\xe7\xb9\xe1\xb9\x6f\x78\xae\x5b\x59" + "\x54\xa6\xe0\x3c\x37\x8c\x4d\xa1\xb9\x6e\xd0\x6f\x77\x9a\xeb\x2f" + "\x31\x5c\xcf\xcc\x75\xcb\x5b\xca\xce\x75\xe3\x70\x3d\xcf\xfc\xe1" + "\x23\x17\x53\xf8\x75\xfc\x0a\x96\xeb\x9b\xb1\x8e\x7f\xc9\x24\x17" + "\x43\xc7\x60\xe7\xc8\x0e\xcd\xc5\xd0\x5c\xff\xd1\xe0\x72\x8c\xe3" + "\x99\x31\x3c\xb9\x18\xf3\x39\xce\x1d\x97\x8b\xf9\x68\x3d\x97\xe3" + "\x3f\x3a\xc6\xe5\xf8\x8f\x16\xb1\x1c\xcf\xec\x6b\x13\x8e\xff\x28" + "\xf5\xde\xe4\x62\x3e\x4a\x65\x73\x31\xff\x17\xc9\x3b\xff\x8e\x93" + "\x63\x2f\x40\xfc\x39\xf6\x02\x66\xfe\x5d\x01\x12\x5c\x13\x62\xf6" + "\x4c\x73\x57\x20\xc9\xb1\x4b\x58\x13\x52\xdd\xd9\x72\x31\xbb\x02" + "\xc4\xe6\x62\xe8\xb9\xcd\xe7\xf0\xfc\x10\x71\x6b\x42\xac\x71\x7b" + "\xab\x76\xb7\xf0\x0c\x93\xcb\xed\xbb\x03\xb9\xdc\xbe\x7b\x12\x97" + "\xdb\xf7\x4e\xe5\x72\xfb\xde\x10\x53\x6e\x37\xe7\xf5\xdd\xf9\x7c" + "\x9c\x1e\xf3\x06\xce\xc5\xec\x55\x08\xf3\xf9\xee\x12\xf1\x7c\xfe" + "\xf1\x99\xff\xaf\xf9\xdc\xd5\x94\xcf\xff\xee\xd4\xa1\x79\x19\x9a" + "\xcf\xf7\x38\x70\xf8\xdc\xd5\x0a\x9f\x77\x58\x5e\x66\xcf\x74\x2e" + "\x9f\xef\x49\xe3\xf2\xf9\x9e\xd1\x2c\x9f\x33\xfb\xda\x24\x2f\xb3" + "\x27\xf4\xde\xe4\x65\xf6\x84\xb2\x9a\x7d\xef\x50\xeb\x7c\xbe\xbb" + "\x92\x9f\xcf\x61\x3b\xcd\xe7\xbb\x2b\x05\xe7\x53\x9b\xf1\xf9\x27" + "\x1e\x22\xf8\x9c\x77\x8e\x4a\xe7\xc8\xcb\x7c\xe2\x2e\x36\x2f\x23" + "\xb4\x4e\x05\xf3\x3b\x3b\x3f\xc5\x68\x9d\x8a\xbf\x61\x9d\x4a\x0a" + "\x77\x7e\x4a\x9b\x73\xfb\x3f\xfa\x72\xb9\xfd\x1f\xfd\xb8\xdc\xfe" + "\xe9\x38\x2e\xb7\x7f\x3a\xd6\xd0\x4f\x92\x97\x59\x65\xb6\x6e\x85" + "\xcb\xf3\xff\x58\xaf\x7c\xa3\x16\xf1\x71\xfd\x15\x87\x03\x77\x84" + "\x79\xfe\x1f\x85\x42\x3c\x8f\xe7\xab\xfc\x23\x3c\x8a\x87\xe7\xf7" + "\x1d\xf9\x3d\xf0\xbc\xd0\x3c\x14\xda\x07\x01\xc7\x63\xbe\xa7\xf9" + "\x9d\xe1\x7a\xcc\xf3\xba\xa3\x7c\x39\x9a\x7d\x0d\xed\xc5\xf3\xc2" + "\x39\x9a\xfd\x37\xcb\x67\x32\x3c\x6f\xcb\x1a\x9a\xe3\xdc\x1c\x4d" + "\xde\xbc\xf6\xce\xd1\x1c\x08\xe4\xf2\xfd\x81\x44\x2e\xdf\x1f\x18" + "\xcc\xf2\x3d\xb3\xaf\x4d\xf4\xfb\x81\x80\x7b\x93\xa3\x39\x10\xc0" + "\xf2\xfd\xa7\x7d\xad\xf3\xfd\x3f\x8a\xf8\xf9\xfe\x1f\x4c\x6d\xb6" + "\x7f\x14\xd9\xce\xf7\x85\xad\x7c\x6f\xbe\x7e\x26\x45\xfa\x1c\x99" + "\xd1\xf7\x3a\x47\x53\x28\xc8\xff\x96\xea\x63\x48\xcf\xd1\x30\x6b" + "\x12\xdf\xe4\xaf\x8f\x71\xca\xc2\x1c\x99\x53\xa5\xc6\x5c\x7f\xd0" + "\x8d\x3b\x17\xf1\xa0\x87\x61\x2e\xe2\xa9\x72\xcc\xf5\x87\x47\x71" + "\xb9\xfe\xf0\x48\xa1\x1c\xcd\x11\xbd\xf1\x9c\xc4\x83\x8b\xb8\x39" + "\x9a\x02\x6e\x8e\x66\x32\xc6\xde\xa1\xeb\xc2\x5c\x7f\x30\x8f\x3b" + "\x07\x9c\xac\x51\xdc\x1b\xce\xcc\x01\x0f\x37\x9a\x03\x3e\xe1\x23" + "\x86\xeb\xff\x79\xa4\xa4\x52\x8b\xc4\xcc\x43\xb4\x7f\xae\x77\x2a" + "\xef\x1c\x44\xfa\x1e\x60\x61\x1e\xe2\xec\xf3\xae\x78\x4e\x73\xfc" + "\xf6\xa5\x46\xf3\x10\x2d\xd4\x33\xe6\xf0\x7f\x78\x8c\x20\xff\x37" + "\x51\x2c\xff\xeb\x5f\x60\xf3\x36\x7a\xac\xf3\xe9\xb8\xfc\xb3\xa1" + "\xbd\xf2\x36\x7c\x79\x12\xe5\x18\xcc\xff\xff\xba\x4a\x74\x7e\x54" + "\x27\xcb\xdb\x1c\x1a\xcd\xe5\xfd\x43\xb1\x5c\xde\x3f\xd4\x8f\xe5" + "\x7d\x66\x5f\x9b\xcc\x45\x3f\xe4\x7f\x6f\x74\xfe\x21\x7f\x36\x6f" + "\x73\xf8\x71\xeb\xbc\x7f\x70\x17\x3f\xef\x1f\xdc\x45\x78\xff\xe0" + "\x2e\x8b\x79\x1b\xce\xdc\xc8\xcf\x1c\xec\xce\xdb\x18\x74\xfe\x3d" + "\x5f\xd7\xf3\x19\x12\x93\xb7\x69\x5d\x93\x6e\x57\xde\x86\x9f\xef" + "\x0d\xda\xfe\x94\x85\x67\xae\x5c\xbe\xff\xb7\x03\x97\xef\xff\xdd" + "\x85\xcb\xf7\x47\xfb\x70\xf9\xfe\xa8\x37\x5f\xde\x86\xcb\xf5\xff" + "\x9e\xca\xc7\xf3\x31\x93\x71\xde\xe6\xf3\x4a\x61\x8e\xff\x77\x8a" + "\x78\x8e\x2f\xca\x7f\xc0\xf1\x26\x1c\xef\x6a\xca\xf1\x45\x55\x1d" + "\xaa\xf1\x69\x8e\x3f\x52\xc6\xe1\xf8\x36\xcc\xe5\xd8\xb2\x9e\x44" + "\x58\xdb\x7f\x6e\x32\xff\xfd\x73\x93\xf9\xef\x9f\x1b\xcd\x7f\xff" + "\x3c\xb4\xed\x38\xfe\xf3\xb6\x9f\xff\x6e\x13\xc7\x7f\x6e\x34\xff" + "\xfd\xa8\x83\x75\x8e\xff\x77\x2a\x3f\xc7\xc3\x76\x9a\xe3\xff\x9d" + "\x6a\x51\xdb\x73\x38\xfe\xe8\xe5\xf6\xc8\xe5\xdc\x9b\xf5\x46\x47" + "\x6b\xc5\xe4\x73\x2c\xd5\x1d\x11\xcc\xe7\x0c\x37\xe4\x73\x62\x04" + "\xf2\x39\x6d\xc5\xf9\xc7\xee\x70\x39\xff\x58\x13\x97\xf3\x8f\xf7" + "\xe3\x72\xfe\x71\x5f\x6e\x3e\x67\xb1\x59\x3e\x87\xcb\xff\xc5\xd3" + "\x95\x93\x8d\xf3\x39\x05\x46\xf9\x1c\xe5\x79\x61\xfe\x2f\x16\xe4" + "\xff\xbb\x34\xff\x47\xf0\xf0\xff\x17\xff\x9f\xf0\x7f\x84\x1d\xfc" + "\xff\xc5\x3d\xe0\xff\x2f\xcf\x91\x1c\x8f\x8d\x75\x52\x8e\x88\xcf" + "\xf1\xd8\x77\x1f\x50\x0e\xe4\xde\x07\x94\x11\xdc\xfb\x80\xd2\x83" + "\xbd\x0f\x30\xfb\xda\xe4\x3e\xa0\x1c\x70\x6f\xee\x03\xca\x01\xec" + "\x7d\xe0\x78\x57\xeb\xf7\x81\x62\x81\xfb\x40\x31\x73\x1f\x28\x16" + "\x71\x1f\x38\xde\x24\x9c\xe3\x89\x91\x9e\xe3\x19\x71\xaf\xd7\x41" + "\x1d\xd7\x88\xca\xf1\x6c\x8e\xc8\x2c\xc5\x35\x52\x2e\x21\xd9\xf2" + "\x39\x86\x1c\x8f\xd2\x24\xc7\xa3\x34\xcb\xf1\x2c\xbb\xc4\xf0\xff" + "\x44\x66\xbd\xe9\x64\x3b\x6a\xa4\xd0\xef\xa0\xfe\xcf\x1d\xee\xbc" + "\xf9\xff\xd0\xfc\xcf\xd6\xef\xfb\xef\x5a\xdc\x2f\x72\xff\x51\x5a" + "\xa8\x81\xfa\xd5\x38\x4e\x4e\x67\x22\x5f\x8d\x94\xff\x72\xe6\xdd" + "\x70\xd7\x9b\x7e\x15\xc3\xe1\xfb\xc9\x64\xbd\xe9\x27\x7c\xcf\x69" + "\x5b\x6b\xf2\x9f\x58\x49\xd7\xe4\x6f\xad\xe5\xf7\xd5\x21\x9b\x6a" + "\x49\x87\x33\xb5\xa4\x2f\xde\x83\x5a\xd2\xb6\xd6\xe4\xbf\x68\x5a" + "\xbf\xef\xe4\xe3\x15\xa5\x4a\x54\x8e\x31\x32\xd3\xb4\xf6\xa9\x92" + "\x7f\xed\xbe\x8c\x59\xbb\xbf\xb0\x7d\xea\xa0\xe0\xfe\xd0\xf7\xfc" + "\xee\x1f\xab\xf7\x27\xab\xe9\xfe\xe0\xf7\x7d\x43\x5f\x77\x96\x02" + "\x56\xf5\x98\x4f\x17\x63\x3e\x3d\x79\x96\x3e\xf6\x12\x60\xa1\xfb" + "\xf3\xde\x18\xc7\x19\x7a\xe4\x14\xb3\x14\x73\xeb\x49\x7a\xde\x17" + "\xc8\x08\xe0\x56\x72\x5c\xd2\x25\x4a\xa7\xeb\xfe\x92\x37\xf4\xff" + "\xe1\x03\x0b\x2b\xbb\x94\xab\x1a\xe0\xba\xb8\x46\xbf\xd3\xb5\x42" + "\xdb\xa8\xc4\xb1\xf8\x62\x61\xa5\x82\x02\xfe\xdd\xf1\x36\x72\x14" + "\x77\x9d\x9e\x2c\xa0\xf5\x0c\xbe\xef\x75\xff\x58\x8b\xeb\x80\x18" + "\xb4\x95\xfe\x37\x36\xbf\x95\x0f\xe3\xa3\xa7\xc8\xbd\x6f\x76\x34" + "\xe1\x0d\xf8\xbd\x78\x18\x4b\x7a\x8e\x2d\xe6\x0d\xfa\x1d\x56\xc0" + "\x1b\xdb\x6f\xb1\xcf\xb1\x71\xfb\x78\x8c\x48\x1e\xe5\xbf\xec\xfc" + "\x17\x95\x10\xb7\x7e\x15\xcf\xcf\xad\x5f\xc5\x13\x6e\xfd\x2a\xbe" + "\x95\x5b\x55\x3c\x79\x14\xce\x3c\xf6\xaf\x99\xf9\x2f\x4a\x13\x8d" + "\xad\xbc\x0f\xeb\xa3\x7c\x2d\x6a\xfe\x0b\xcd\xa7\xf3\x09\x9f\x62" + "\xbe\x32\x70\x2a\x9b\x47\x51\x0a\xe6\x51\xac\x71\xaa\xa8\x35\xfc" + "\x34\xa7\x96\x04\x72\x39\xb5\x64\x12\x97\x53\xbf\x29\x33\xe5\x54" + "\x73\x3e\x2d\x49\xe7\xe3\x52\x52\x1f\xe5\x9b\x44\x61\x1e\x2d\x29" + "\x12\xe2\x51\x7a\x7e\x7a\xb8\xd1\xfc\xf4\x56\x1e\x3d\x75\x8a\xcb" + "\xa3\x25\x5a\x5b\x79\x94\x7e\xb7\xc9\xc5\x0e\x78\xb7\x89\x64\x1e" + "\x8d\x31\xe1\xd1\xd3\x91\x2c\x8f\x9a\xbe\xdf\xc4\x0a\x8f\xce\x6b" + "\x9f\x1a\x28\x1c\x1e\xd5\xab\xe9\xfe\x78\x2f\xa4\xfb\x7a\x95\xcb" + "\xa3\xdf\x78\x09\xf3\xe8\xe9\x23\x2c\x8f\x92\xe3\xda\x97\x47\x4f" + "\xd7\x71\x78\x74\x9e\x11\x8f\xfe\xca\x7a\x08\x3c\xc7\xa2\x95\x47" + "\x17\x18\xf1\xe8\x3c\x6b\x3c\x7a\xba\x0e\x8f\x11\xd1\xa8\xdf\xec" + "\xb7\xce\xa3\x25\x4a\x7e\x1e\x2d\x51\x12\x1e\x2d\x51\xb2\x3c\xca" + "\xa3\x51\x39\x3c\x5a\x9a\x25\x82\x47\x3b\x79\x6d\x94\xd2\x4c\x51" + "\xb9\x0a\x76\x4d\xa7\x79\x8d\xd4\x59\xc6\x6b\x82\x8a\x4c\xde\x7b" + "\x52\x64\xf6\xde\x93\x65\x86\x35\x9e\x01\x0c\xaf\x4e\xb0\x83\x57" + "\xe9\x35\x9e\x65\x3b\xb9\x73\x4f\xca\x76\x1b\xe6\x9e\x10\x5e\x3d" + "\x33\xc2\xd0\x2f\xf6\xbd\x27\x45\x16\x6a\xa4\x96\xdd\xe1\xd4\x46" + "\x09\x30\xae\x8d\x52\x79\x55\xb8\x46\x6a\xb9\x17\xa7\x36\xca\xe9" + "\x3d\xad\xef\x3d\x31\xad\x91\xca\x72\x6c\xc5\x40\x9a\x63\x5b\x6b" + "\x50\x95\x47\xb4\xd6\x48\xb5\xb2\x2e\x08\xb7\x73\xa0\x26\xaa\xfd" + "\x39\x56\x29\x82\x63\x39\xef\x3d\x31\xad\x31\x55\x71\xa6\xa2\xa4" + "\x08\x95\x47\x14\xf1\xd4\x46\x2d\xba\xa7\xef\x3e\xc1\xfd\xe2\xe7" + "\xda\xca\xa9\x5c\xae\xad\x4c\xa5\x8f\xbd\xc0\xc7\xb5\x95\x7d\x59" + "\xae\x25\xc7\x25\x5d\x30\xe1\xda\x6a\x01\xae\x85\xfb\xea\x8e\x2b" + "\x62\xb9\xb6\x32\x84\xe6\xda\x55\x0c\xd7\x5e\x6b\x6b\xae\xad\x0c" + "\x61\xb9\xf6\x4c\x4f\xeb\xef\x98\x2a\xf7\xe1\x5f\x97\x53\xee\x43" + "\xb8\xb6\xdc\xc7\xe2\x3b\xa6\x38\x73\x3e\xbe\xed\x6a\x78\xc7\x14" + "\x9b\x0f\x28\x62\xf2\x01\xf7\xf3\x3b\x51\xbe\x75\x14\x9b\x0f\xf8" + "\x06\xbc\x3b\x5e\x77\xb9\x1c\xbf\x73\x6a\x26\x7e\x27\x4a\xa1\x49" + "\x3e\xa0\xd0\x3c\x1f\x30\xdd\x32\xc7\x8a\xca\x07\xd0\xeb\x2e\xbf" + "\xeb\xc2\xe5\xd8\xef\xba\x72\x39\xf6\xfb\x9d\x86\x75\x96\xb8\x3f" + "\xc2\x35\x53\xbf\x9b\xda\x9a\x0f\xa8\xe6\x72\x2b\x9b\x0f\xf8\x3e" + "\x58\x98\x63\xbf\xe3\xe6\x7f\x27\xec\xe1\xac\xb3\xfc\xa4\xc6\xb8" + "\x0e\xb5\xa1\xfe\xd4\xd9\xfc\x53\x67\x8d\x39\xf6\xbb\x13\xf7\x53" + "\x1d\xea\xd6\x5a\x53\x56\xe6\x72\x9b\xd7\xa1\x3e\x37\xa2\xa2\xa4" + "\x10\xe1\xb5\x6d\x34\xdf\x72\x72\x03\x85\xf7\x26\x37\x50\x52\x28" + "\x90\x1b\x38\x57\xcc\xe5\xd9\x73\x6a\xfa\xd8\xf3\x7c\x3c\x7b\x2e" + "\x9d\xe5\x59\x72\x5c\xd2\x79\x13\x9e\xad\x6a\x4b\x4d\x7b\xee\x58" + "\xfb\xe6\x06\xce\x1d\x63\x73\x03\xdf\xdb\xb0\xfe\xf1\xbb\x54\x7e" + "\x9e\xfd\x8e\xc9\xbb\x7e\xc7\xe6\x5d\xab\x78\xde\x97\xc2\xe1\xd9" + "\x1f\x22\x0d\xeb\x1f\x69\x4d\x5b\x6d\xd0\xb4\x85\xf7\xe1\xfb\x52" + "\x7e\x98\x2b\x36\x37\x80\xd7\xb9\x63\x6e\xc5\xdc\x65\xe0\x57\x36" + "\x37\x50\x28\x9c\x1b\xb0\xc2\xaf\xe2\xdf\xdd\x57\x15\xc9\xe5\xd7" + "\xaa\x68\x2e\xbf\xfe\x74\xc7\x94\x5f\xcd\xb9\xb5\x6a\x2f\x1f\xaf" + "\x92\xdc\xc0\x4f\xbb\x84\x39\xb5\xea\xac\x10\xa7\xd2\x35\xfd\x6a" + "\xd8\x39\xd2\x2c\xa7\x9e\xbf\xc9\xe5\xd4\xf3\x9e\xb6\x72\xea\x3d" + "\x79\x5f\x8a\x64\x4e\x8d\x32\xe1\xd4\x1f\xd3\x59\x4e\x35\x7d\x67" + "\x8a\x15\x4e\x6d\xaf\x3c\x81\x31\xa7\x72\xb4\xeb\x4f\x6e\x5c\x4e" + "\xfd\x69\xac\x30\xa7\xfe\x78\x89\xe5\x54\x72\x5c\xfb\x72\xea\x4f" + "\xae\xed\x9b\x27\xf8\xc9\x95\xd5\xae\x3f\x9d\xb3\xce\xa9\x55\xd5" + "\xfc\x9c\x5a\x55\x4d\x38\xb5\xaa\xda\xf6\x35\xe5\xd5\x47\x44\x70" + "\x6a\x27\x7f\x97\x4a\x75\x91\xe8\x3c\x01\xce\xb7\x62\x2e\xad\xb6" + "\xaf\x76\x48\xbc\xa1\x76\xc8\x58\x86\x63\x5f\xb3\x97\x63\x2f\x9c" + "\xe2\xce\x69\xb8\x50\x66\x98\xd3\x40\x38\xf6\xd2\x02\xee\xfb\x51" + "\xcd\x6b\x85\x70\x6b\xa8\x5e\x7c\xbc\x35\x4f\x80\x39\x77\xac\x71" + "\x9e\xe0\xd2\xe3\xc2\x7c\x7b\x71\x2c\x27\x4f\xf0\x5f\x7e\xbe\xbd" + "\xcb\xe1\xdb\x9f\xe7\xd0\x7c\xdb\x5a\x43\xf5\x62\xaa\xa1\x86\xaa" + "\x55\x0d\xcb\xe1\xdb\x88\x8e\xe1\xdb\x22\xdb\xf9\x96\xfb\x2e\x15" + "\xd3\x7a\xa9\xaa\x2e\x15\x27\x80\x6f\xe9\x7a\x1d\xa6\x35\x53\x6d" + "\xab\xd7\xd1\x5e\x35\x53\x71\xbf\xf8\x79\x57\xb5\x9e\xcb\xbb\xaa" + "\x63\xf4\xb1\xbc\xbc\xab\x9a\xce\xf2\x2e\x39\xce\x66\xde\x95\x94" + "\x33\x50\xa5\xb6\x6f\xce\x40\x95\xca\xf2\xee\xa5\x49\xd6\x79\xf7" + "\xe2\x44\x7e\xde\xbd\x38\x91\xf0\xee\xc5\x89\x16\x79\x97\x33\x87" + "\xa0\x66\x14\x6f\x2d\x8f\xea\xfb\xfd\x3d\x2b\x35\x23\xa5\xe4\x0c" + "\x80\x83\x65\x89\xb8\x86\x53\x04\x9e\x43\x60\x3d\x67\x60\x8d\x6f" + "\xc5\xe7\x0c\x7e\x19\xc1\xe5\xdb\x5f\x46\x71\xf9\xf6\xca\x55\xdc" + "\x2f\x8b\x39\x03\x9a\x03\x7e\x59\xdf\x9a\x33\x50\x71\x79\x96\xcd" + "\x19\x5c\xd9\x2a\xfc\xec\xeb\x97\x43\x1c\x7d\xfb\x9a\x49\xcd\xea" + "\x70\x96\x6f\x4f\x97\x1b\xe6\x8c\xd5\x5e\x3e\x35\xc5\x98\x6f\x7f" + "\xd1\x98\xd5\xac\x0e\x69\xc3\x9a\xd5\x21\x6d\x5c\xb3\x7a\x2a\xb7" + "\x66\xf5\xb6\xbb\xec\x3c\x32\xf1\x35\xab\x2f\xaf\xa4\x39\x18\x63" + "\x08\xd7\xad\xb6\x25\x8f\xd0\xce\xef\x5a\xe1\x70\x2f\x27\x8f\x70" + "\xa5\x0b\x97\x7b\xaf\x0c\x17\xe6\xde\xcb\xe7\x58\xee\x25\xc7\xb5" + "\xaf\xe6\xbd\xa2\x68\xdf\x3c\xc2\x15\x05\x9b\x47\xb8\x72\x8a\x97" + "\x7b\x39\xcf\xc6\x7e\x39\xc6\xff\x6c\x0c\xb6\xd3\xdc\xfb\xcb\x31" + "\xc1\x3c\x82\xd9\xfc\xad\xff\xed\x27\xcf\xc6\x18\xcd\xab\x12\x91" + "\x47\xe8\x74\x73\x0c\xfe\xb7\x4f\x4a\x1e\x01\xf3\x2d\xe6\x33\x03" + "\xe7\xda\x92\x47\x68\x7b\x8d\x5b\xb7\x9f\xcb\xb9\x75\x07\xb9\x9c" + "\x5b\x1f\x6c\xca\xb9\xe6\x7c\x5b\x77\x93\x8f\x6b\x49\x1e\xa1\x1e" + "\x09\xf3\xec\x55\x2f\x41\x9e\x35\x99\x9b\xcb\xf2\xec\xb5\x49\x5c" + "\x9e\xbd\x1a\x21\x89\x67\x6d\x7d\x07\x4b\xa7\xe2\xd9\x08\x13\x9e" + "\xbd\x76\x95\xe5\x59\xd3\xf7\xb0\x58\xe1\xd9\x76\x7a\x0f\x8b\xb0" + "\xc6\xfd\x75\x01\x97\x67\x7f\x2d\x10\xe6\xd9\x5f\x47\xb1\x3c\x4b" + "\x8e\x6b\x5f\x9e\xfd\x75\x7e\xfb\xe6\x16\x7e\x9d\xcf\x6a\xdc\xfa" + "\xc1\xd6\x79\xf6\xaa\x0f\x3f\xcf\x5e\x65\x9e\x8b\x5d\xf5\x11\xd4" + "\xb8\x66\x3c\x7b\xdd\x43\x04\xcf\x76\xf2\x39\x08\xd7\x45\xd5\xbf" + "\x30\xca\xd7\x3e\x54\xa1\x32\x59\x2f\x71\xde\x78\xbd\x84\x51\x6e" + "\x61\xac\x21\xb7\xc0\x7d\x3f\x4b\xbc\x21\x7f\xeb\xcf\xf0\xee\x18" + "\x7b\x79\xf7\x46\xdf\xc6\x56\xde\x5d\x0c\xbc\x7b\x83\x5e\x1f\xd1" + "\xd8\xca\xbb\x37\x2f\x18\xfa\xc5\xbe\x9f\x45\x20\xb7\xf0\x22\xdd" + "\xde\xb2\xd6\xdc\x02\xe6\x61\x7f\xe3\xdc\xc2\xcd\x74\x61\x0e\xbe" + "\x51\xc0\xc9\x2d\xfc\x87\x9f\x83\x1b\x38\x1c\xfc\xdb\x19\x9a\x83" + "\x5f\x34\x70\xf0\x8d\xda\xbb\xe0\x2d\xef\xae\x13\xc7\xc1\x0d\x34" + "\x07\x07\xdc\x1b\x0e\x3e\xd4\x06\x1c\x4c\x8f\xbb\x3a\xae\x42\x09" + "\x1c\x3c\x13\x73\x70\x80\x6d\xf9\x86\x0e\x7a\x47\x0b\xee\x17\x3f" + "\x17\xab\x9b\xb8\x5c\x7c\x73\x00\x7d\x2c\x2f\x17\xab\x4f\xb1\x5c" + "\x4c\x8e\x6b\xdf\x7c\x83\x5a\xd3\xbe\xf9\x06\xb5\x86\xe5\xe2\x9b" + "\xc5\xd6\xb9\xf8\xc6\x1e\x7e\x2e\x86\xed\x34\x17\xdf\xd8\x63\x91" + "\x8b\x5f\x34\xe6\xe2\x5b\xad\x9a\x97\x93\x6f\x50\xdd\xef\xef\x6e" + "\xb9\x25\xa8\x7f\xbd\x7b\xa3\x94\x1a\x87\xdb\x5d\x2a\xf2\x10\xba" + "\xbd\x0a\xa5\x54\x68\x5f\x44\xb0\x0d\xc6\xef\xf6\xc0\x0a\xcf\xe1" + "\x48\xbf\xe9\x35\x9a\x8f\x3f\xc0\x1f\xd0\xb8\x99\x32\xe6\xda\xa2" + "\xc7\xf8\x36\x3d\xdf\x15\x6f\xc7\xdc\xbb\xc3\x68\x3f\xdf\x6f\x51" + "\x99\xe3\xea\x98\xef\xa5\x92\x75\x37\xe3\xea\x0d\x7f\x63\x6c\xaa" + "\x1c\x6e\xa7\x51\x59\xe3\x6a\xd5\x6e\xe3\x6a\xf9\xbe\xff\xa4\x2b" + "\x72\xec\xb6\x92\xa2\xb6\x6f\xa6\x1a\x6e\xff\x29\x10\xdd\xde\x80" + "\x50\xe6\x66\x4a\xdd\xb8\xee\xf6\x09\x38\xc7\xfa\x2d\x70\xdc\xed" + "\xee\xc5\x95\xb7\x57\x4d\x41\xb0\xad\xca\xb0\x0d\xc6\x0d\xe9\x57" + "\xc9\x29\x3d\xec\xa3\x36\x3b\x1f\xdb\x91\x0c\x5c\x95\x88\xd0\xb3" + "\x77\xf1\x35\x73\xbb\x0e\x30\xe3\x9e\x01\x6d\x6e\x84\xb6\xa8\xc7" + "\xfe\xd8\x00\x78\x54\x94\xaf\x41\xf8\x9a\x4e\x85\xf3\x2a\xc8\xc0" + "\x63\x2f\x7f\x26\x97\x92\x29\x90\x7e\xf7\xf0\x50\xca\x63\x4e\x26" + "\xc4\x03\x65\x2e\x46\xf4\xdc\x8f\x8d\x70\x1c\x25\x5b\x41\xc1\x7d" + "\x44\x55\xa1\x6d\x20\xd7\x34\xf4\xef\x0b\xf0\xb1\x14\xfc\xee\xf6" + "\xc5\xc8\x15\x3e\x4e\x54\xce\x9c\xcc\xc6\x75\x0d\x31\x70\x9e\xa1" + "\xb8\x5f\x42\xe7\xb8\x71\x1b\xdc\x77\xfe\xe8\x89\xef\x1d\xf4\xef" + "\xe3\xdf\xa6\x7f\x47\xa6\x4f\xd5\xc1\x76\x6a\xd5\x0a\xaa\x22\x5e" + "\x8b\x5c\x60\x2c\x76\x40\xbf\x31\x1e\xf5\x1f\x07\xa2\xd5\xbd\x10" + "\x3a\x90\x50\x27\xab\x80\xbe\xeb\xb6\xfc\xb1\x41\x99\xfc\x1c\x82" + "\xfd\x6a\xec\x59\xae\x38\xdc\x59\x10\x74\x15\x21\xcc\x27\xf0\xff" + "\x65\x0d\x70\x1f\x9b\x04\x7f\x6f\x84\xf3\xd0\xdf\xf6\x54\xe0\x63" + "\x61\x7b\x5f\xe5\xd2\x1f\x91\x4b\x0c\x72\xcc\x80\x73\x23\xc7\x36" + "\x34\xe0\x63\x55\x0e\x77\xe2\x71\x1f\xe0\x18\x47\xf8\x1b\x7f\x0f" + "\xcf\x21\x43\xd4\xae\xe1\xa1\x34\x36\xb3\xe7\x64\xea\xfb\x0e\x0f" + "\xa5\xb9\x0f\xce\x73\x23\x9c\x33\x1c\xe3\x04\xc7\x38\xd1\xff\x26" + "\x23\xd7\x6c\xd8\x86\xdb\x81\x7f\x9d\x94\x0b\x9b\x71\xdb\xb5\xb8" + "\x6d\x81\x71\x50\x50\xee\x73\x32\x29\xc0\x36\xbe\xa7\x7a\x27\x3b" + "\x9c\xa9\x71\xb8\xeb\xe9\xe2\x40\x51\x70\x9d\xab\x56\x27\x23\xa7" + "\x4c\x3d\x42\xca\x5e\xb8\x9d\x3b\x37\xa1\x7d\x05\x1e\x8b\xc6\x75" + "\x77\x2a\x55\x0e\x0d\x89\x78\x7c\x21\x9e\x0d\xde\x4f\xe2\x73\xb8" + "\xeb\x8b\x7f\x07\x7f\x87\x39\x5e\x49\xe3\x0f\xfa\xec\x9d\x2c\xa7" + "\x60\xbf\x9b\xdc\xe1\x12\x92\x7b\x3a\x7f\xda\xb8\xee\xae\xab\x0a" + "\xed\x9f\x88\xbf\xaf\x22\xdf\x03\x2c\xdd\xf5\x81\x98\xe5\xe2\x6d" + "\xf8\x6f\x81\xfe\x3a\x19\xe2\x56\xe6\x09\xd8\x30\x8d\x9d\x01\x23" + "\x80\x0b\x03\x46\x70\x7f\x3f\x4d\x56\xc9\xe8\xfb\xb0\xc3\x5d\xda" + "\xd7\x65\x40\x0c\x75\x1f\x7a\x2a\x36\xc2\xd8\xea\x5b\x70\x5c\x6a" + "\x60\x5f\x63\x34\x8e\xcb\xc6\x04\x88\x09\x39\x36\x8d\xed\x3f\xfe" + "\xbb\x91\x8e\xa7\x1e\x62\x41\xd6\x6e\x36\x8e\xc2\xe7\xb3\xf1\x2e" + "\xc4\xb1\x07\xd5\x70\x02\x22\x47\x61\xdc\x02\x46\x0e\x2c\xd6\xc8" + "\xf0\xbc\x3e\xbc\xfd\x8b\x5b\x1a\xd9\xc6\x6b\x08\xeb\x4a\x94\x0e" + "\xbc\x9c\xbf\x14\xc6\x1c\xda\xa4\x7c\x86\xa9\x06\x19\xe2\x98\x00" + "\xb1\x5b\x0a\xd8\x85\x31\xdf\x08\xe3\xb7\x1d\x38\x0f\xff\x7f\x3b" + "\xdc\x7f\x40\xd3\xa9\x54\x0e\x8d\x78\x6d\xa3\x6b\x7e\x0f\x4a\xbd" + "\xa3\x07\x55\x0f\x63\xf8\x55\xe3\xba\xc6\x10\xc3\x18\xe2\x3e\x6d" + "\x84\xed\xe9\xb0\x1f\xc6\xb3\x92\x60\xe8\x6e\x81\xe1\x9c\x85\xc6" + "\x33\xed\x00\x1a\x9e\x7e\x00\x79\x6d\x38\x80\x46\x2e\xaf\x85\xeb" + "\x72\xd5\x2b\xd4\x37\x33\xb5\x70\x4f\x2c\xa8\x6a\xee\x31\xa1\x12" + "\x3f\x7b\xd2\xaf\xfe\x63\xc1\xda\x03\x68\x00\x5e\x1b\x1b\x54\x8f" + "\x10\xbe\x87\x07\x75\xf9\x99\xaa\x88\xb9\x83\xf4\x6e\x05\x55\xba" + "\xd5\xcf\x74\x9f\x7c\x07\xa1\x93\xbe\x0d\x28\x39\x16\xee\xe5\xb7" + "\xea\x50\x72\x03\xa5\x2e\x4f\xb9\x8a\x80\x7b\xaa\xc9\xd8\x35\xb9" + "\x07\x45\x22\x84\xd7\x0c\xea\x7f\xf5\x45\xce\x51\x48\x91\x78\x1e" + "\x79\xae\xa8\xa5\xea\x74\x9b\xa7\xa5\x24\x27\x21\xd9\x81\x5b\x55" + "\x44\x7b\x3a\x68\x2e\x17\xe3\xf5\xa9\x8d\xa1\x68\xb6\x96\xb9\x1f" + "\x65\xcf\xc9\x5d\x11\x8d\x7a\xe2\xf3\x71\xa1\xb5\x97\x66\x25\x8c" + "\x5b\xae\x38\x7e\xd6\x4c\xa4\xe3\xb9\x79\x3a\x3a\xf0\xa6\x06\x74" + "\x6b\x37\xd5\x8a\x48\xaa\x0e\xeb\x3a\xb8\xbf\xd0\x5a\xb0\xa2\x4e" + "\x0b\xda\x6a\x2e\xdc\xbf\x55\xe8\xcb\x9a\x02\x99\x3e\xa7\x9b\x4a" + "\xe4\x6f\x14\xd2\xf7\x6d\x7c\x2f\x85\xbe\x4f\xf5\x45\xe4\x3e\x08" + "\xf7\x4c\x97\x58\xac\xa7\xa8\x9f\x71\xff\xbf\x80\x73\xa5\xfa\xc4" + "\x02\x47\x69\x86\xe0\xfb\x67\x50\xb5\x12\x95\x6a\x74\x68\xdb\x35" + "\x7a\x8c\x1e\x82\x31\x52\xc0\x3e\x47\x18\x27\x47\xbe\xb8\xe1\x98" + "\xe9\x33\x0b\xaa\xf4\x72\x12\x1b\x3a\x2e\x0d\x24\x2e\x93\x17\x21" + "\xb8\x8f\x42\x6c\xb2\x48\x6c\xf4\x1e\x11\x31\x38\x36\xe2\xce\xa3" + "\x29\x5e\xe8\xfe\x82\x7f\x9b\x02\x7c\x60\x5c\xe8\xdd\x23\x62\xf0" + "\x6f\xe3\x3e\xe0\xe7\x67\x18\x07\x41\x6b\x7f\xa6\xca\x63\xea\x50" + "\x05\x9c\x0f\xe5\x66\xdc\x07\xad\xd8\x3e\x68\x85\xfa\x90\xf6\x2c" + "\xe0\xf6\x59\xc0\xed\xb3\x80\x5b\x15\xc1\xed\xe9\x6a\x82\x5b\x1d" + "\xf4\xab\x09\xb4\xfb\xf2\xa9\x48\x86\xfb\xb5\xef\x47\x5c\xa3\x0f" + "\xfa\x59\xc7\x62\x77\xd2\x75\x18\x23\x03\x7e\xe5\xcf\x74\xc7\xe3" + "\x53\xde\x50\x85\x56\x60\xfc\x36\xf3\xe1\xb7\xe5\x6c\xd0\x1c\x88" + "\xcd\x3b\x80\xdf\xff\xf9\x22\xa7\x5a\xa4\x48\x9a\x0a\xf8\xad\xe3" + "\xc3\x6f\xcb\xee\x63\xf0\x9b\x66\xf8\x8d\x34\xc6\x6f\xcb\x68\xf1" + "\xf8\x6d\x71\x6a\xc5\x6f\x18\x83\xdf\x68\x13\xfc\xd6\x1a\xe1\x17" + "\x9f\xb7\x68\xfc\xb6\xc4\x88\xc3\x6f\x73\x43\x2b\x7e\xc1\x97\x6c" + "\x7b\x9b\x1e\xa3\x87\x60\x8c\x00\xbf\xcd\x25\x30\x4e\xbc\xf8\xed" + "\xf8\xf8\xe9\xb2\x6d\x8f\x9f\x2e\xd2\x7a\xfc\x74\x0e\xe2\xe3\xa7" + "\x2d\x6d\xff\xf8\xe9\xfc\xc4\xc5\x4f\x7b\x48\x38\x7e\xda\xd4\xce" + "\x13\x3f\x2a\xc4\xf6\xf8\x51\x7d\xad\xc7\x4f\x7f\x5c\x7c\xfc\xf4" + "\x69\xed\x1f\x3f\xbd\x5a\x5c\xfc\xf4\xb1\xc2\xf1\xd3\x07\x08\xc5" + "\xef\xd5\x9e\x7a\x4a\x8f\xe7\xcd\xf5\x18\xef\x87\x35\x10\xad\xd7" + "\x64\xa8\x0f\xf6\x8c\xf0\xb7\xc2\xf0\x37\xad\xa9\xc0\x57\x9b\xfc" + "\xed\x64\xf2\xb7\xab\xc9\xdf\xee\x26\x7f\x7b\x9a\xfc\xed\x65\xf8" + "\x1b\xe2\xd5\xe5\x86\x03\x95\x05\x9e\x2d\x45\x25\x43\x03\x98\xfd" + "\x3e\xb3\x75\xde\xd8\xf7\xf9\xf0\xf5\x7d\xe3\x2a\x4a\xe3\xec\x80" + "\xa8\x16\x19\x85\x62\x92\xd1\x1f\xaf\xc9\x50\x41\xf3\x2a\xb0\x84" + "\xf2\x5e\xbe\x54\x73\x0a\xd2\x67\xbb\xb8\x4f\x5e\x06\xf8\x02\x0b" + "\x4d\xad\xf0\x7c\x08\xda\x7e\x0c\xc6\x4d\x5d\x1e\xa3\x06\x5d\xfe" + "\x25\x55\x23\x43\xe9\xf8\x3c\x9f\x8d\x51\x22\xbd\xfc\x19\xfc\x5c" + "\xc2\x41\x9f\xe3\xe2\xae\x96\x3f\xd3\x8b\xda\x19\x87\xd2\x57\xe9" + "\x1d\x2b\xea\xcf\xa2\x0c\x99\xde\x3b\x31\x11\x74\x7d\xfd\x21\xb4" + "\xbc\x9e\xaa\x4b\xd4\x52\x9a\x8a\x99\x4a\xfc\xdc\xb6\xae\x22\xbe" + "\x04\x95\xab\xcf\x22\x7c\xcf\xc3\x58\xad\x50\x1f\x22\xcf\x89\xf1" + "\x31\xb0\xad\x5c\xbd\x0f\x95\xc1\xdf\xca\x85\x97\xe1\x3c\x1d\x46" + "\x55\xd4\xef\x43\xba\x6c\x17\x57\xbd\x7b\xb7\x06\xca\xbd\x9b\xa6" + "\xac\x1e\xfa\x96\xdd\x4d\x8b\xfb\x5a\x0e\xfd\xa0\xdf\xd1\x99\xd3" + "\x4d\x4b\xb7\xdb\x50\x49\xe7\x10\x74\x39\x70\xbc\x07\x1c\xef\xd1" + "\x4d\x83\xfb\x87\xfb\xc6\xeb\xf7\xb2\xc7\xcf\x85\xbe\xbf\x38\xd5" + "\x57\x81\xa8\x95\x0a\x4f\x51\x78\x93\x39\x44\x08\xfa\xc8\xec\xf1" + "\xb5\xa4\x5d\x47\x29\xed\x0a\xce\x7f\xa2\xb2\x03\x98\xfe\xba\x4a" + "\x68\x57\xe6\x6a\xa1\x5d\xa6\xbf\xde\x52\xda\x8d\x12\x6e\x37\x90" + "\xe9\xaf\xbf\x94\x76\x95\x16\xda\x65\xfa\x9b\x22\xa1\x5d\xb9\xa7" + "\x85\xb8\xcd\x95\x86\x05\xf9\x7c\x4b\x58\x90\x86\x03\xb9\x85\xf3" + "\x0f\x98\x2b\x0d\x03\x0a\xc1\xfc\x37\xc6\x80\xb4\xf8\x2b\x2c\xc6" + "\x5f\x5a\xec\x15\x82\xef\x7f\xc4\xb1\x97\x16\xf7\x2e\x82\xf8\xc7" + "\xde\x18\xe2\x04\x9c\x1e\x1b\xa1\xdf\xfc\x18\xd2\xf7\x18\x2f\x5b" + "\xad\xf7\x47\xaf\x26\xc1\x3d\x2f\x17\xb9\xbd\x9a\xff\x33\xe5\x8f" + "\x73\x4e\xb2\x2e\x7b\x92\xf2\x90\x2c\x53\xa6\x97\xed\x4f\xa8\x92" + "\x55\x68\x87\x63\xde\xd2\xed\x5a\xaa\x71\x78\x0a\xb6\x1f\x87\x91" + "\x68\x58\xe2\x8b\x48\x5b\x8f\xa1\x8c\x64\x7f\x14\xa4\x43\x38\xc7" + "\xd1\x30\x79\xd1\xcf\xd4\x57\x89\xa0\xf1\x6f\x02\xbf\xe6\x6a\xf0" + "\xbd\xd4\x0d\xbe\xab\x05\x1c\x43\x3b\x1a\xf4\xa9\x5e\xed\x30\x59" + "\x4d\x1f\xab\x06\x3f\xaa\xa6\x36\x8f\xa7\xef\xc9\xd4\x0a\x5f\xb4" + "\x06\xfe\xbe\x22\x7b\xa8\xa7\x5c\x8d\x64\xdb\xc1\xab\x36\x6e\x78" + "\xc8\x5d\x25\x7b\x48\x8d\xfd\x2b\xf8\xe4\xfa\x15\x37\x71\x3e\x3f" + "\x36\xe2\x80\x5e\x2d\x5b\x0d\xbe\x19\x1f\xff\x6c\x0c\x92\x7d\x05" + "\xed\xc1\xb1\xfe\xc7\x63\x11\xb2\x90\xcf\x51\xe8\xdd\xc3\x6b\xf1" + "\xf7\x71\x3b\x38\x4f\xba\x51\x0f\xe3\xec\x3e\x27\x17\xf7\x9b\xca" + "\x9e\x50\xa4\x4c\xc0\xf7\x9c\x87\x4a\xc6\xf5\xa3\x1a\xf1\x3d\x04" + "\xee\x1d\xbd\xae\xc1\xdf\x74\x3e\x60\x15\x55\x49\xb9\x3b\xd7\x51" + "\x19\xce\xfe\xe5\x0d\xb7\x90\x72\x69\x33\xaa\x91\x3d\x74\x0a\xff" + "\xf6\x6d\xf7\x70\x55\x83\x7b\x78\x1d\xf4\xe1\x84\xa1\xbf\xf8\xb7" + "\x0c\xdb\x71\xfe\x83\xe9\x63\xed\xf1\x44\xe1\x3e\x52\xab\x7b\x75" + "\x0f\xf2\xa4\xd4\x78\x2c\x95\xc9\xb7\xa0\x2f\x8e\xd3\xf1\x78\x53" + "\xd9\xe1\x85\x0d\x2b\x7c\x7b\xd3\xf9\x40\xd9\xc3\x29\x38\xaf\x44" + "\x65\xbb\x90\xfc\x76\x8e\x0b\x3d\x57\x07\x73\x3f\x68\x00\x0d\xd6" + "\x42\x37\x64\x0f\xd3\xf9\xc0\xa9\xbe\x32\x71\x7e\x4a\xf6\x30\xed" + "\x7f\x95\xbd\xf1\x38\x38\x8e\x86\xdf\x7b\xa9\x46\xf6\xf0\x2e\x92" + "\xe3\x70\xf1\xc4\xbf\x07\xc7\xf8\xc1\x6f\x7a\x52\xd9\xce\x2a\x7c" + "\x1c\xec\x3f\xc1\xec\xf7\x36\xda\xef\x0d\x7d\xd6\x30\xfb\x6b\x99" + "\xfd\x3e\x46\xfb\x7d\x62\x7a\x23\x87\x6b\x32\x47\x27\x7c\x4e\x94" + "\xbb\x0b\x3e\x1f\x77\xfc\x3c\x81\x3e\x27\x0f\x17\xc4\x1c\xe7\x5e" + "\x2f\x73\xec\x7b\x1b\xf0\x05\xfb\xbd\x8c\xbe\xef\xf5\x55\xbc\x1f" + "\x7a\x35\x1f\x8f\xa9\xe3\x70\x95\xc2\x55\x4b\xe7\x89\x64\x0f\x0f" + "\xa1\xc7\x02\xee\x9f\xc6\xed\xa9\x64\x8e\x0a\x7c\x8f\x6c\x00\x1d" + "\x09\xc7\x78\xe1\xdf\xe4\x1b\x7f\xed\xae\x61\xfe\xcd\x3e\xc3\xa6" + "\x34\x67\x47\x17\xf6\xaf\x7d\x42\xd7\x3a\xff\x33\x02\xc9\x82\xaa" + "\x91\x7c\xc5\x1c\x24\xc3\x1a\x2a\xf9\x0c\x92\x25\xce\xc1\x79\xe9" + "\xd9\xde\x94\xec\x40\xfd\x81\xa5\x1a\xb8\x4e\x94\x5d\x70\x7d\xaf" + "\x16\xf7\xf1\x48\x3b\x20\x30\x02\x3f\xab\x69\xda\x35\xcc\x5b\x93" + "\x1d\xe6\xd8\xe4\x1e\xe6\x79\x65\x3e\x92\xcd\xae\xe7\x7d\x6e\x33" + "\x72\x79\x35\xa5\x4f\x5e\x84\x1c\x83\x66\xca\x29\xfc\xec\xa6\x2c" + "\xea\x32\x4a\xba\x8e\x64\xf8\x79\xcd\xb6\xbb\xc8\xbd\x02\x74\x2f" + "\x7e\x9e\xe3\x14\xe1\x8d\xf2\x92\x91\xbb\x73\x3d\x72\x75\x76\x70" + "\x78\xe8\xf5\xe9\x08\xe9\x1a\xa3\xba\x02\x5e\xf5\xcf\xd4\x7a\xe3" + "\x9c\x49\x37\x6a\xd3\x47\x95\x07\x92\x8b\xba\x68\x41\x67\xe3\x67" + "\x3a\xef\xdf\x45\x03\xf2\x97\x22\xbf\xd9\x65\x29\x74\x2d\x23\x3c" + "\x57\xb4\xa9\xd1\xd7\xbb\xe5\xaf\xbe\xbd\x9b\x1b\x7d\x9f\x34\x3c" + "\xef\x99\x75\xdd\x15\xe1\x39\xa4\xd4\xba\xe6\xb1\xf8\x79\x0f\xce" + "\xab\xb7\x64\x91\x5a\x47\x78\x5e\xa9\xfe\xaf\xbe\x5e\xd4\x6c\x5f" + "\x34\x48\x03\xe3\xdb\xe8\x8b\x12\x82\x91\x2b\xf4\xd9\x75\x40\x2d" + "\x92\xed\x08\x47\x8e\xa5\x11\x35\x58\x93\x78\x96\xd6\xee\x46\xcb" + "\x02\x51\x6f\x2d\xe8\x76\xfc\x1c\xa1\xb4\x36\x07\xe1\xe7\x41\x79" + "\x77\xd1\xf0\xdc\xbb\x68\x24\xe5\x1e\x91\x32\x71\x8e\x37\xd2\xe7" + "\x84\x17\x56\xc4\x7f\x82\x56\x34\x51\x97\x2a\xd6\xe8\x11\xce\xa3" + "\x62\xfc\x52\x1e\x11\x29\x04\xc3\x8f\xb8\x9d\xf4\x3d\x89\xc4\x63" + "\xf8\x11\xe1\xfb\xff\xae\x61\x53\xb4\x3e\xc3\xbc\x75\xee\xd1\x85" + "\xe4\xd9\xe0\x6c\x6f\xfd\x47\x71\x99\xf8\x99\xcf\x3f\x6a\xea\x1c" + "\xf0\x3c\x27\xbc\xe6\x57\xbf\x2f\x30\x82\xf3\x9c\xad\x85\x89\x57" + "\x0b\x89\x17\x7e\xc6\x36\xab\x1e\x51\xb3\xb5\x32\x10\x99\xbe\xdd" + "\xe8\x67\x6c\x1a\x15\x62\xd7\xfe\x7a\xa2\xed\x7a\xf2\x7c\x4d\xbf" + "\x3c\xaa\xab\x1e\x62\x42\xad\x92\xa1\xfd\x77\x35\x5d\x74\x10\x97" + "\x34\xbc\x1e\x78\xa5\x83\x33\x60\xb3\x9b\xbe\xc5\xf3\x11\xd0\xb1" + "\x7e\xb3\x2f\xa5\x30\xb5\xa6\x1c\xe9\x7f\xb5\xcb\x7d\xbd\xa1\xed" + "\x27\x5b\x5a\x7c\x7b\x1b\xd6\x0e\x1b\xe6\x1a\x50\xeb\x9a\x94\x78" + "\xdd\x30\xf6\x43\xda\x2c\xf2\xfc\x06\x30\xe1\x80\x7d\x0f\xf4\xc1" + "\x6b\x10\x68\x57\xfc\xbc\x0b\xfa\xe9\xba\xfd\x0a\x72\x2c\x8b\xfa" + "\x91\x8e\x8d\x8e\x89\x09\x5e\x43\x8c\xe3\x30\x29\xda\x1b\x95\xef" + "\x39\x87\x06\xc5\x3b\x9a\xc5\xa1\x65\xf7\x30\x6f\x43\x2c\xa8\x0d" + "\x8e\xf1\x70\x1f\x1a\x72\x43\xf6\xe8\xee\x93\xc0\xb1\x53\x63\xc5" + "\xc6\xe4\xd1\x5d\xf7\x3e\x26\xae\xbf\xb3\x98\x3c\x12\x4a\x62\xe2" + "\x3c\x42\x5a\x4c\x9c\x87\xdf\xfb\x98\x38\xfe\xce\x62\xf2\x68\x3d" + "\x89\x49\xb7\x32\x69\x31\xe9\x56\x2a\x38\x1f\x59\xef\x2f\xfb\xc6" + "\xb3\x0a\x7d\xda\x0b\x7c\x7d\x66\xb1\xb7\x3e\xb3\xb8\x40\x3f\xc3" + "\x53\x41\x34\x4b\x8f\xbc\xaf\xbd\x40\x33\x2c\xbe\x46\xff\x9f\x3c" + "\xd3\x4b\x88\xc0\xeb\xde\xbe\x39\x81\xb5\xc4\x06\x74\x7a\x2c\xd6" + "\x0e\x2e\xf9\x8f\x86\x82\x06\x9c\xe1\x89\x9a\x66\x84\xca\x36\xfc" + "\x88\x1c\x5d\xaa\xd0\x44\xbd\x9e\xa2\x94\xc9\xd7\xe0\x5e\xfd\x87" + "\x5a\x65\xd8\x35\xe4\x9d\xe0\x08\xc7\x76\x1f\xe7\x9d\xb0\x12\xff" + "\xdb\xcf\x3b\x61\xdd\xcf\x57\x64\x6e\x57\x71\xbb\x49\x17\x90\x4c" + "\xfb\xa7\xe1\x31\x07\x16\x2a\xe1\xfe\x37\x3d\xe5\xc0\x0d\x8d\x2c" + "\xed\x16\x52\x50\xb2\x27\x28\x17\x35\x72\x4c\x5f\x8c\xe8\xe7\x2a" + "\x31\x6f\xa3\x27\xae\xc9\xdc\xe6\xe0\x9c\xf3\x17\x37\x94\xb2\x4c" + "\x7c\xcc\x93\x71\x99\xfb\x7a\xa9\x1d\xf0\x7d\xf3\xc0\x42\x8d\xcc" + "\x80\x23\x3c\xf7\x61\x76\x03\x92\xc1\x58\x4e\xb9\xbd\x7b\x98\xbf" + "\x26\x27\xcc\xb3\xd9\x23\xcc\x51\xe7\x11\x5d\xa8\xdd\x1f\x18\xc1" + "\x87\x2d\xfc\x6c\x17\xdf\x33\x9d\x1b\x90\x6b\x78\x0c\x8b\x31\xfd" + "\x72\x82\xad\x72\x4d\x1d\xc2\xeb\x2a\x5c\xe0\x5e\x49\xb5\x44\x75" + "\x9d\xb1\x17\xe2\xce\xe0\x0b\xee\xd7\xc2\xf8\xda\xca\xc5\xd7\x6d" + "\x06\x5f\x80\xb3\x56\x7c\xb1\xf7\xca\xa6\xb1\x04\x5f\xaa\x56\x7c" + "\xd1\xf7\xca\xe5\xbe\x5e\x18\x63\x06\x7c\xe1\xfb\x24\xc1\x57\x8d" + "\x20\xbe\xbe\xa9\xe6\xc7\x97\xb6\xaf\x31\xbe\x9c\x53\x08\xbe\xdc" + "\x06\x9e\x9c\x09\xf8\x9a\x29\x16\x5f\x6e\x03\x88\x16\x9b\x16\x43" + "\xeb\x1a\xd9\x63\xe4\x5d\x1b\xa0\x81\x59\xfd\xeb\x96\x45\x9e\x93" + "\x81\xde\xf5\x98\x50\x44\xe5\x80\xe6\x85\x7e\xcc\xee\x87\x1c\x6f" + "\x7b\x84\xab\x6e\xe7\x84\xd7\x36\x78\x84\xd7\x91\x7b\xb4\xdb\xe1" + "\x93\xf1\xd0\x8f\x78\xd1\xfd\x38\x44\xff\xee\x4f\xa1\x7f\xa0\x66" + "\x84\x2a\xf4\x3f\x85\x76\x81\x18\x7b\xbe\xa7\x4b\x41\x77\x33\x13" + "\x42\xc1\x2f\xd4\x79\x27\xa0\x67\x00\x7b\x1e\xa7\x41\x2f\x9f\x86" + "\x6b\xa9\x62\xca\x7c\x44\x6d\x5a\x56\xf5\x0f\xbd\x5a\xa1\x92\xb9" + "\x14\x60\x1c\x02\x96\x15\xc6\x58\x26\xb8\x25\xfb\x34\x99\x09\x51" + "\xb8\xad\xa0\x12\xe4\xe2\xfd\x1a\x52\x5c\x91\xfd\xe1\xf0\xb2\x24" + "\x84\xd7\x93\x75\x81\xff\xaf\x6c\xda\x14\x58\x05\xdf\xef\x46\xfd" + "\x14\xe2\x10\xf3\x1a\xea\x4d\xcd\x08\x71\xc0\x5c\xf7\x49\x72\xae" + "\x4c\x0f\xdb\xc8\xdc\x82\x5c\x84\xf7\xa7\x35\x2b\xe8\x79\x08\x7a" + "\x38\xa6\xbc\x21\x17\xa5\x2d\x05\x9f\x0b\xff\x27\xf3\x55\x72\x11" + "\x3e\x3e\x7d\xb1\x2b\xfd\x2c\x91\xfe\x9e\x36\x17\xe1\xef\xea\x60" + "\xfb\xfb\x7a\x27\x94\x91\xe0\x8e\x4e\x4f\x29\xa7\xdb\x38\x3d\xe5" + "\xbf\x08\xb7\x81\xf5\xdd\xe9\x29\x5f\xa0\x8d\x4b\x3d\x51\x59\x7d" + "\x2e\xec\xff\x1e\x6d\xbc\xe1\x05\xff\x5e\x81\xcf\x5d\x74\x4d\xf6" + "\x07\x9f\xd3\x53\xf4\xc8\x65\xe5\x2b\x14\xe0\x93\xaa\xc0\x6b\x94" + "\x92\xd1\x43\xd0\xf7\x81\x15\x55\x99\xa0\x8f\xbb\xbb\xe3\x35\xac" + "\xd4\x8a\x19\xf5\x7a\x6a\xc6\x75\xfd\x8a\x19\x37\xf0\x6f\xeb\xa8" + "\x19\xbf\xe1\xdf\x4e\x4f\xf0\x66\xe6\xaf\xe5\xd2\x73\x6d\xd2\xee" + "\xfa\x20\xdc\x57\xfc\xbb\xf8\xf7\x36\x2e\xf6\x65\x7e\x73\x00\xdd" + "\x37\xfc\x9b\xb8\x4d\xe3\xdf\xc4\xef\x87\x06\x4d\x8b\x7f\x73\x27" + "\xfc\xeb\x06\xf1\xf0\xc4\x71\xc0\xbf\xaf\xa7\x42\xbb\x50\x2b\x42" + "\xe5\xf4\x77\xe2\xeb\xf8\xbe\x73\x8e\xf9\x0e\xed\xc5\xf1\x77\x9a" + "\xc9\xf1\x74\x1b\xc0\x35\x37\xf1\xf6\xfe\xa1\x4a\x64\x1e\x43\xf7" + "\x74\xc2\x3d\xee\xb3\x08\xf7\x90\x98\xd2\x58\x99\x11\xda\x05\xe2" + "\xe6\x8a\x79\xaa\x46\xe6\x3e\xb4\xb5\x8d\x9f\x42\xe5\x38\xde\x18" + "\x37\x06\x2c\x61\x1c\x19\x30\x44\xf7\x33\x06\x21\x63\xcc\xc0\xff" + "\x1d\x99\x76\x92\x0c\xed\x40\x1f\x18\xfe\x73\xc9\xeb\x0f\xfb\xcd" + "\x71\xd4\x63\x2a\x8b\x23\x8f\x3b\x9a\x64\x8a\xc2\x38\x52\x86\xad" + "\xc2\xed\x9c\x64\xfb\x13\xe2\x80\x31\x76\x9f\x61\xcb\x07\xc7\xa9" + "\x7f\x22\x72\x27\xe7\xe3\x91\x43\x9f\x4f\xa2\xd2\x1d\xf7\xd5\x70" + "\x1e\xb8\x0f\x19\x7a\x6f\x64\x38\x8f\x8d\xcd\x3e\xd0\xee\x0d\xc4" + "\x7c\xe7\x14\x6e\xdb\x30\x06\x10\x33\x64\xf8\x8e\xe1\xf8\x0c\xbd" + "\x2f\xf4\x7b\x00\xfd\x1d\x82\xb9\x2b\x3c\xf8\xe9\xe1\x61\x8a\xb9" + "\x47\x13\x91\x9c\x82\xf1\x56\x86\xdd\x82\xdf\xe9\x31\x98\xf4\xed" + "\x4b\x5d\x33\xfc\x06\xc4\x40\xc6\x6c\x0f\x34\xc2\x04\xd3\xbe\x86" + "\xaf\xfd\x38\x4e\xfb\xa1\xd0\x7e\x3c\xb4\x8f\xef\x85\x61\xd8\xb7" + "\xf6\xa0\x79\xb0\x7f\x3c\x69\xdf\x80\x5b\x2a\x73\x5c\x6d\x4c\x02" + "\x7a\xf8\x9a\xec\xb1\x21\x84\x43\x5d\xe8\xf7\x6f\xd1\xf3\x0c\x64" + "\xfa\x02\xbd\xc9\x3c\x03\xe3\x79\x28\x9f\x26\xab\xc9\x1c\x03\xd9" + "\x63\xf4\x7b\x5d\xf6\x6f\xab\x92\xe1\x7b\x38\x3b\xc7\xe0\x47\xbc" + "\xef\x71\xe5\xd2\x1a\x76\x8e\x81\xac\x07\x9d\xef\x57\xc9\x1e\x0b" + "\x68\x94\x21\x19\xec\x57\x90\xed\x2e\x63\x8d\xb7\xb7\xce\xe1\x61" + "\xb6\xe3\xf9\x91\x5f\x15\x61\x7f\xfc\x58\xa8\x21\x27\x61\xdd\xf3" + "\x3e\xd6\x09\x3d\xaf\xa7\x05\xcf\xeb\xf9\x3b\xf3\xbc\x3d\xbb\x48" + "\xf3\xbc\x3d\x15\xf7\x5e\xcb\xff\xde\xfc\xd5\x63\xf3\x89\xd6\xea" + "\xb5\x55\x9a\x96\xef\x95\x7b\xef\x63\xf2\x7b\xf3\x57\x3d\x27\x92" + "\x98\x78\x0d\x94\x16\x13\xaf\x01\xd2\xfc\xd5\x53\x5a\xd6\x5f\x3d" + "\xa5\x15\xf6\x57\x5e\x3a\xcb\xfe\xaa\xcf\x58\xd6\x5f\x3d\xb1\x9b" + "\x68\x9c\x27\xd6\x13\x8d\xf3\x44\xa0\x78\x7f\xd5\xfb\xf8\x03\x7f" + "\xd5\x96\xfe\xaa\x97\x8a\xe0\xab\x77\xba\x34\x7f\xd5\x3b\x8d\xeb" + "\xaf\x7c\xf6\x9a\xfb\xab\xde\x37\x6d\xf7\x57\x4f\x78\x48\xf3\x57" + "\x4f\xb8\xdb\xe6\xaf\x9e\x88\xe3\xf7\x57\x8f\x23\x61\x7f\x45\xf6" + "\x99\xeb\xe2\x3e\x1e\xac\x2e\xf6\xbe\xd4\xf9\xfd\x95\xf7\x1a\x7e" + "\x0d\xec\x9d\x4e\xfc\xd5\x13\xb1\x6d\xef\xaf\x9e\x88\xe5\xf7\x57" + "\x7d\x1c\x88\x16\x7d\x22\xde\xdc\x5f\xc1\x77\x78\xfd\x55\x9f\xa1" + "\xcc\x77\x62\xb9\xfe\x8a\xb4\x01\x5c\x13\x2c\xec\xaf\xfa\x5c\x27" + "\xdc\xd3\xa7\x98\x70\x0f\x89\xa9\xb9\xbf\xea\x93\x63\xdd\x5f\x11" + "\x0c\xd1\xfd\x14\xf4\x57\x7d\x2e\x98\xfb\x2b\x2f\x2d\xbf\xbf\x7a" + "\xca\xc8\xa7\x3f\x35\x95\xeb\xaf\x9e\xec\x7b\x7f\xf8\x2b\x41\x6c" + "\xad\xe1\xfa\xab\x27\xef\x88\xf7\x57\x4f\xf5\x13\xe7\xaf\x30\xe6" + "\xf8\xfc\xd5\x53\x71\xa6\x98\xe3\xfa\xab\xa7\xb2\xf8\xfd\xd5\x53" + "\x7b\xb9\xfe\x0a\xb7\xcf\xe7\xaf\x9e\x3a\xc7\x69\xdf\xcc\x5f\x3d" + "\x75\x93\xeb\xaf\xc8\x71\xac\xbf\xf2\xc9\x26\x1c\xea\xb5\x5b\xbc" + "\xbf\xf2\x89\x13\xf6\x57\x3e\x49\x5c\x7f\xe5\x33\x85\xf8\x28\x9f" + "\x3d\xc4\x5f\xf9\xcc\x25\xdb\xbd\x76\x19\x6f\x67\xfd\x15\xd9\xce" + "\xfa\x2b\x9f\x22\xdb\xfd\x95\x4b\x27\xf4\x57\xae\x16\xfc\x95\xeb" + "\xef\xcc\x5f\xfd\x29\x52\x9a\xbf\xfa\x93\x60\xfd\xbb\x07\x5a\x5e" + "\xaa\x96\xf7\x29\x25\x5a\xeb\xe9\x26\x69\x5a\xfe\x69\xe1\xf7\xbf" + "\x58\xd4\xf2\x83\x4a\x58\x2d\x3f\xa8\x44\x58\xcb\xfb\x9e\xb2\xac" + "\xe5\x07\xba\xb2\x5a\xbe\xff\x22\x72\x3f\xed\x3f\x95\xdc\x4f\xfb" + "\x7b\x88\xd7\xf2\xcf\xa4\x3f\xd0\xf2\x6d\xa9\xe5\xff\xb4\x8f\xe0" + "\xeb\x99\xe9\xd2\xb4\xfc\x33\xa1\x5c\x2d\xef\x17\x67\xae\xe5\x9f" + "\x29\xb6\x5d\xcb\x3f\x73\x49\x9a\x96\x7f\x46\x65\x9b\x96\xef\x3f" + "\x9a\x5f\xcb\xfb\x96\x0a\x6b\x79\xb2\xcf\x5c\x83\x0d\xb8\xc4\x6a" + "\xb0\x01\xfb\x3b\xbf\x96\x1f\x30\x85\x5f\x6f\x0d\x98\x4e\xb4\x7c" + "\x7f\xff\xb6\xd7\xf2\xfd\xfd\xf9\xb5\xfc\x80\x32\xa2\x7b\xfa\x8f" + "\x35\xd7\xf2\xf0\x1d\x5e\x2d\x3f\x90\xd1\xff\xfd\xfd\xb9\x5a\x9e" + "\xb4\x01\x5c\xf3\xb8\xb0\x96\x1f\x78\x84\x70\xcf\x40\x26\x8f\x40" + "\x62\x6a\xae\xe5\x07\xce\xb1\xae\xe5\x09\x86\xe8\x7e\x0a\x6a\xf9" + "\x81\x7b\xcd\xb5\xbc\x6f\x09\xbf\x96\x1f\xb4\x92\xc5\xd1\xa0\x3e" + "\x5c\x2d\x3f\xf0\xe6\xfd\xa1\xe5\x05\xb1\x35\x85\xab\xe5\x9f\x3d" + "\x2e\x5e\xcb\x3f\x7b\x47\x9c\x96\xc7\x98\xe3\xd3\xf2\x83\x46\x9b" + "\x62\x8e\xab\xe5\x07\xcd\xe2\xd7\xf2\x83\xe2\xb8\x5a\x1e\xb7\xcf" + "\xa7\xe5\x07\xed\xe4\xb4\x6f\xa6\xe5\x07\x15\x73\xb5\x3c\x39\x8e" + "\xd5\xf2\x7e\x11\x84\x43\x7d\x17\x89\xd7\xf2\x7e\xa3\x85\xb5\xbc" + "\x5f\x20\x57\xcb\xfb\x79\x11\xcd\xee\x17\x4b\xb4\xbc\x9f\x1f\xd9" + "\xee\x1b\x63\xbc\x9d\xd5\xf2\x64\x3b\xab\xe5\xfd\xd6\xd8\xae\xe5" + "\x1f\xee\x84\x5a\xde\xd1\x82\x96\x77\xfc\x9d\x69\xf9\xe7\x06\x4b" + "\xd3\xf2\xcf\xf9\x49\xd3\x8d\x2f\x22\x56\x37\xbe\x88\x84\x75\xe3" + "\xf3\x0e\x96\x75\xe3\x0b\x01\xac\x6e\x1c\xba\x97\x70\xf7\xd0\x74" + "\xc2\xdd\x43\x27\x89\xd7\x8d\x43\x4e\x3e\xd0\x8d\x6d\xa9\x1b\xfd" + "\x72\x89\x6e\x1c\x92\x25\x4d\x37\x0e\xc9\xe4\xea\xc6\x17\xf7\x9b" + "\xeb\xc6\x21\x77\x6c\xd7\x8d\x43\x7b\x4a\xd3\x8d\x43\x3d\x6d\xd3" + "\x8d\x43\x97\xf1\xeb\xc6\xe7\x15\xc2\xba\x91\xec\x33\xbf\xdf\xbf" + "\xd0\x93\xbd\xdf\x0f\xbb\xdc\xf9\x75\xe3\xb0\x54\xfe\x7b\xfb\xb0" + "\x2c\xa2\x1b\x87\xc6\xb7\xbd\x6e\x1c\x1a\xcf\xaf\x1b\x5f\xe8\x42" + "\xee\xb1\x43\x13\xcd\x75\x23\x7c\x87\x57\x37\xbe\x30\x82\xf9\x4e" + "\x3c\x57\x37\x92\x36\x80\x6b\xa6\x0a\xeb\xc6\x17\x6e\x12\xee\x79" + "\xe1\x38\xe1\x1e\x12\x53\x73\xdd\xf8\xc2\x56\xeb\xba\x91\x60\x88" + "\xee\xa7\xa0\x6e\x7c\xe1\x92\xb9\x6e\x7c\x1e\xf1\xeb\xc6\x11\x47" + "\x58\x1c\x8d\x98\xce\xd5\x8d\xc3\xfb\xdd\x1f\xba\x51\x10\x5b\xa9" + "\x5c\xdd\x38\xbc\x49\xbc\x6e\x1c\x31\x50\x9c\x6e\xc4\x98\xe3\xd3" + "\x8d\x23\x96\x99\x62\x8e\xab\x1b\x47\xe4\xf0\xeb\xc6\x11\xfb\xb9" + "\xba\x11\xb7\xcf\xa7\x1b\x47\x9c\xe7\xb4\x6f\xa6\x1b\x47\xdc\xe1" + "\xea\x46\x72\x1c\xab\x1b\x5f\xcc\x25\x1c\xfa\xdc\x5e\xf1\xba\xf1" + "\xc5\x65\xc2\xba\xf1\xc5\x95\x5c\xdd\xf8\x62\x08\xd1\x87\x2f\xee" + "\x23\xba\xf1\xc5\x28\xb2\xfd\xb9\x3d\xc6\xdb\x59\xdd\x48\xb6\xb3" + "\xba\xf1\xc5\x63\x96\x74\xa3\x65\x5d\x31\x66\x3e\xab\x2b\xc6\xcc" + "\x37\xd6\x15\xa7\x38\xba\xe2\xa5\xe9\x96\x75\xc5\x2b\x87\x58\x5d" + "\xf1\xb2\x07\xb9\xb6\x47\x35\x91\x6b\x7b\x14\xfd\xae\xc2\xa4\x49" + "\x70\xff\x07\x5d\xb1\xff\x5a\x21\xd1\x15\xd7\x34\xb2\xf7\x6f\x30" + "\xba\xa2\x1e\x39\xa6\x2d\x64\x74\x45\x38\xd6\x15\xa3\x06\x63\x5d" + "\xe1\x94\x07\xba\xd6\xf0\xbe\xb4\x18\xd0\xb9\xb5\xf0\x37\x5c\x37" + "\x5f\x40\x1b\xe5\xa0\x45\x33\xf1\xf7\x71\x7d\x32\x68\x0b\x5f\x4f" + "\x58\xef\xee\x4f\x50\x75\xa1\xdf\xcb\x09\x9a\x43\x0f\xda\x03\xeb" + "\x0e\x5a\x5f\xdc\x66\xf4\xc5\x6d\x36\xe7\x89\x6b\x94\x25\xd6\x52" + "\x7a\xdd\x12\xdf\xee\x41\x73\x01\x7a\x77\x30\x7e\xe1\x60\xbc\xce" + "\x5b\x5d\x87\xa8\x25\xbe\xdd\xf2\x16\x23\xf7\x0f\xb1\xce\xa8\x43" + "\xae\xdd\x56\x3a\x74\xa3\x6e\x47\x75\xed\xd6\x40\xb4\xec\x7e\x7d" + "\x09\xd1\xb2\x4b\x3c\x1f\x01\x8d\x34\x60\xfb\x2d\x56\x5f\x7c\x80" + "\xb5\xc5\x12\x5f\xef\x86\x25\xbe\xbd\x6f\xdf\x06\x2d\xab\x66\xb4" + "\x45\x34\x68\x0b\x3a\xe7\xd9\x98\xb6\xe3\x16\xd6\xb2\x24\xe7\x49" + "\xd7\x32\x7b\xc7\x17\xe1\xba\x88\x38\xf7\xf9\x2c\x68\xd9\x15\x65" + "\xc8\xf5\x69\x2f\xe0\xfc\xdb\xbe\x5e\x2b\xc6\xa1\xde\x15\x45\x3a" + "\x18\xa3\x3b\x74\x1e\x14\xd7\xcc\x2a\x8d\xf8\x11\xe1\x7a\x50\xb4" + "\x9e\x95\x51\x85\xd0\xde\x70\xf5\x12\x5f\xd9\xb6\xc5\x46\x5a\xd6" + "\x03\x6b\xd9\x17\x2d\x68\xd9\x91\x3a\x69\x5a\x76\xa4\x96\xab\x35" + "\x5e\xed\x69\xae\x35\x46\xcd\xb1\x5d\x6b\x8c\x5a\x2b\x4d\x6b\x8c" + "\x5a\x63\x9b\xd6\x18\x75\xd9\x54\x6b\xec\xa5\xb5\xc6\x4b\x33\x31" + "\x36\xf9\xb5\x06\xd9\x67\x7e\x8f\x78\x65\x2d\x7b\x8f\x78\x25\xb8" + "\xf3\x6b\x8d\x97\x1b\xf8\xef\x07\x2f\xeb\x88\xd6\x18\x55\xdb\xf6" + "\x5a\x63\x54\x2d\xbf\xd6\x78\x65\x11\xe1\xe5\x51\x75\xe6\x5a\x03" + "\xbe\xc3\xab\x35\x5e\xd9\xcd\x7c\xa7\x96\xab\x35\x48\x1b\xc0\x3f" + "\xc7\x85\xb5\x86\xff\x2c\xc2\x47\xfe\x03\x09\x1f\x91\x98\x9a\x6b" + "\x0d\xff\x2e\xd6\xb5\x06\xc1\x10\xdd\x4f\x41\xad\xe1\x3f\xc9\x5c" + "\x6b\xbc\x14\xca\xaf\x35\xc6\xf4\x65\x71\x34\xfa\x24\x57\x6b\xf8" + "\xe7\xdc\x1f\x5a\x43\x10\x5b\x0d\x5c\xad\x31\x3a\x52\xbc\xd6\x18" + "\xbd\x55\x9c\xd6\xc0\x98\xe3\xd3\x1a\xa3\x2f\x9b\x62\x8e\xab\x35" + "\xc6\x38\xf0\x6b\x8d\x31\x3d\xb9\x5a\x03\xb7\xcf\xa7\x35\xc6\x8c" + "\xe3\xb4\x6f\xa6\x35\xc6\xcc\xe1\x6a\x0d\x72\x1c\xab\x35\x5e\x55" + "\x10\x0e\x7d\xc9\x41\xbc\xd6\x18\x73\x59\x58\x6b\x8c\xb9\xce\xd5" + "\x1a\x63\x94\x44\x53\xbc\xea\x49\xb4\xc6\x98\xb3\x64\xfb\x4b\xc8" + "\x78\x3b\xab\x35\xc8\x76\x56\x6b\xbc\xea\x6b\x7b\x8e\xea\xc1\x1a" + "\xd6\x7b\x9b\xa3\x1a\x7b\x4e\xda\x7d\x7d\xec\xd9\x7b\xff\xbc\xf9" + "\xf7\xb6\x86\xf5\xd5\x91\x24\xaf\xf3\x5a\xb4\xb4\xe7\xcd\xaf\x09" + "\xd7\x7f\x78\x30\xc7\x5a\x62\x4c\xc6\x79\x91\x98\x8c\xd7\x49\x8b" + "\xc9\x78\xc1\xfa\x6f\x0f\xe6\x65\x48\x8d\xc9\x6b\x85\x24\x26\x81" + "\x59\xd2\x62\x12\x28\xf8\xfe\x73\xcb\x3e\x38\x38\x91\xf5\xc1\xc1" + "\x89\xc2\x3e\x78\xc2\x1c\xcb\x3e\x78\xf2\x09\xd6\x07\x4f\xea\x4b" + "\x74\xe7\xa4\xae\x44\x77\x4e\xa4\x6b\x34\x27\x63\x1f\xfc\x51\x6c" + "\xca\xa7\x8b\x8b\x64\xd4\xc7\x2f\xb8\xee\xbb\xa5\x91\xa5\x27\x20" + "\x85\x16\xfb\x60\x18\xff\xf4\x66\xec\x83\x4f\x20\xfa\xbd\x0c\xb2" + "\x89\xa3\xcb\x6b\x71\x2d\xa6\x09\x4a\x72\x3f\x9e\x70\x10\x70\x22" + "\xaf\xd0\x68\xe8\x63\xf0\xbe\x2f\x6e\x15\xc9\x32\x9b\x4d\x72\xef" + "\x8b\x35\x32\x5c\x43\xda\x38\xf7\xae\xcb\x89\x2e\xc4\xb9\xf7\xa6" + "\xdd\xc3\xa6\xb4\xe6\xdf\x07\x5a\xce\xbd\xe7\x37\xc3\xbd\x92\x27" + "\xff\x8e\x73\xef\xf9\x4b\x7f\x6f\xb9\xf7\x80\xb1\x04\x7b\x13\x9d" + "\xa5\xe5\xde\x27\x3a\x71\xfd\xf0\x1b\xfd\xcc\xfd\xf0\xc4\x45\xb6" + "\xfb\xe1\x89\x39\xd2\xfc\xf0\xc4\x6c\xdb\xfc\xf0\xc4\x3b\xfc\x7e" + "\x78\xc2\xdc\x64\x41\x3f\x4c\xf6\x99\xfb\x98\xc9\x39\xac\x8f\x99" + "\x3c\xa7\xf3\xfb\xe1\xc9\x0a\x7e\xcf\x32\xd9\x99\xf8\xe1\x89\x0d" + "\x6d\xef\x87\x27\x36\xf0\xfb\xe1\xc9\x2b\x89\x77\x98\xa8\x31\xf7" + "\xc3\xf0\x1d\x5e\x3f\x3c\xf9\x30\xf3\x9d\x06\xae\x1f\x26\x6d\x00" + "\x0f\x9d\x11\xf6\xc3\x41\x0b\x08\x2f\x05\x8d\x22\xbc\x44\x62\x6a" + "\xee\x87\x83\x3c\xac\xfb\x61\x82\x21\xba\x9f\x82\x7e\x38\x68\x96" + "\xb9\x1f\x9e\x10\xc1\xef\x87\x83\x87\xb2\x38\x9a\x72\x8e\xeb\x87" + "\x83\x76\xdf\x1f\x7e\x58\x10\x5b\x0a\xae\x1f\x9e\x12\x27\xde\x0f" + "\x4f\xd9\x2b\xce\x0f\x63\xcc\xf1\xf9\xe1\x29\x77\x4c\x31\xc7\xf5" + "\xc3\xc1\x6e\xfc\x7e\x38\xb8\x1f\xd7\x0f\xe3\xf6\xf9\xfc\x70\xf0" + "\x54\x4e\xfb\x66\x7e\x38\x78\x11\xd7\x0f\x93\xe3\x58\x3f\xfc\x86" + "\x3b\x73\xbf\xeb\x2a\xde\x0f\x07\xdf\x11\xf6\xc3\xc1\x3a\xae\x1f" + "\x0e\xae\x24\xbe\xf7\x0d\x5f\xe2\x87\x83\x6b\xc9\xf6\x09\x8e\xc6" + "\xdb\x59\x3f\x4c\xb6\xb3\x7e\xf8\x8d\xe1\x0f\xd6\xb7\xde\x2f\x7e" + "\xf8\xcf\x97\xa5\xf9\xe1\x3f\xd7\xde\x7b\x9d\xff\x7b\xf3\x5e\x6f" + "\x30\x6b\x29\xa7\x2e\x93\xa6\xf3\xa7\x0a\xd6\xff\x7e\xe0\xbd\xa4" + "\xc6\x24\x64\x00\x89\xc9\x34\x67\x69\x31\x99\xe6\x24\xcd\x7b\x85" + "\x6b\x58\xef\x15\xae\x11\xf6\x5e\xd3\x2e\x58\xf6\x5e\x33\xfd\x59" + "\xef\x15\xb6\x93\x68\x9c\xb0\xb5\x44\xe3\x84\x8d\x13\xef\xbd\xa6" + "\x17\x73\xbd\x57\xe8\xc0\x07\xde\xab\xbd\xbc\xd7\x54\x25\xc1\xde" + "\xf4\xf5\xd2\xbc\xd7\xf4\x54\xae\xf7\x9a\xbd\xdb\xdc\x7b\x4d\xbf" + "\x6e\xbb\xf7\x0a\x73\x93\xe6\xbd\xc2\x5c\x6d\xf3\x5e\x61\x8b\xf8" + "\xbd\xd7\x34\x95\xb0\xf7\x22\xfb\xcc\x35\xf3\x4c\x37\x56\x33\xcf" + "\xb8\xd0\xf9\xbd\xd7\x8c\x14\x7e\x7d\x3c\x63\x3d\xf1\x5e\x61\x31" + "\x6d\xef\xbd\xc2\x62\xf8\xbd\xd7\x0c\x1d\xd1\xa9\x61\xb1\xe6\xde" + "\x0b\xbe\xc3\xeb\xbd\x66\x0e\x66\xbe\x13\xc3\xf5\x5e\xa4\x0d\xe0" + "\xa1\x49\xc2\xde\x6b\xe6\x55\xc2\x4b\x33\x8f\x10\x5e\x22\x31\x35" + "\xf7\x5e\x33\xb3\xac\x7b\x2f\x82\x21\xba\x9f\x82\xde\x6b\xe6\x79" + "\x73\xef\x35\xad\x9a\xdf\x7b\x85\x1f\x64\x71\x14\x1e\xcc\xf5\x5e" + "\xb3\xfa\xdc\x1f\xde\x4b\x10\x5b\x29\x5c\xef\x35\xeb\xa6\x78\xef" + "\x15\xde\x57\x9c\xf7\xc2\x98\xe3\xf3\x5e\xe1\x8b\x4c\x31\xc7\xf5" + "\x5e\xe1\xe9\xfc\xde\x2b\x7c\x37\xd7\x7b\xe1\xf6\xf9\xbc\x57\xf8" + "\x19\x4e\xfb\x66\xde\x2b\xfc\x3a\xd7\x7b\x91\xe3\x58\xef\x35\x9b" + "\xbc\x4f\x48\x36\x6d\xad\x78\xef\x35\x7b\x91\xb0\xf7\x9a\xbd\x8c" + "\xeb\xbd\x66\x4f\x24\x1e\x6b\xf6\x2e\xe2\xbd\x66\x47\x90\xed\xd3" + "\xd6\x18\x6f\x67\xbd\x17\xd9\xce\x7a\xaf\xd9\x87\x1e\xac\x7d\xbd" + "\x5f\xbc\xd7\x9c\x39\xd2\xbc\xd7\x9c\x88\x07\x3a\xbf\xad\x75\xfe" + "\xec\x12\xa2\xb5\xde\xbc\x23\x4d\xe7\xbf\xd9\x20\x4d\xe7\xcf\x53" + "\xb1\x3a\x7f\x9e\x4a\x58\xe7\xbf\x75\xd2\xb2\xce\x8f\xf2\x65\x75" + "\xfe\xdb\xeb\xc9\xfd\xf4\xed\x05\xe4\x7e\xfa\xf6\x40\xf1\x3a\x3f" + "\x72\x37\x57\xe7\xcf\xf5\x78\xa0\xf3\xdb\x4b\xe7\xcf\xd9\x43\xb0" + "\x17\xb9\x48\x9a\xce\x8f\x8c\xe1\xea\xfc\x77\xd3\xcd\x75\x7e\xe4" + "\x39\xdb\x75\x7e\x64\x93\x34\x9d\x1f\xa9\xb1\x4d\xe7\xbf\x3d\x9d" + "\x5f\xe7\xbf\x55\x22\xac\xf3\xc9\x3e\x73\x7d\xf6\x4e\x13\xab\xcf" + "\xde\x39\xd9\xf9\x75\xfe\x3b\x51\xfc\x5a\xec\x9d\x45\x44\xe7\xbf" + "\x1d\xda\xf6\x3a\xff\xed\x50\x7e\x9d\xff\x0e\x33\xff\xeb\xed\x99" + "\xe6\x3a\x1f\xbe\xc3\xab\xf3\xa3\x7a\x32\xdf\x09\xe5\xea\x7c\xd2" + "\x06\xf0\xd0\x50\x61\x9d\x1f\x75\x86\xf0\x52\xd4\x4e\xc2\x4b\x24" + "\xa6\xe6\x3a\x3f\x6a\x99\x75\x9d\x4f\x30\x44\xf7\x53\x50\xe7\x47" + "\x1d\x37\xd7\xf9\x6f\x9d\xe0\xd7\xf9\xf3\xb6\xb2\x38\x9a\x37\x82" + "\xab\xf3\xa3\xbb\xde\x1f\x3a\x5f\x10\x5b\x51\x5c\x9d\x1f\x7d\x5e" + "\xbc\xce\x9f\xe7\x2c\x4e\xe7\x63\xcc\xf1\xe9\xfc\x79\xd3\x4d\x31" + "\xc7\xd5\xf9\xf3\xe2\xf8\x75\xfe\xbc\x74\xae\xce\xc7\xed\xf3\xe9" + "\xfc\x79\x47\x38\xed\x9b\xe9\xfc\x79\xe7\xb8\x3a\x9f\x1c\xc7\xea" + "\xfc\x77\xe3\x09\x87\xbe\xb5\x40\xbc\xce\x7f\x77\xba\xb0\xce\x7f" + "\x77\x0e\x57\xe7\xbf\x3b\x84\xe8\xf9\x77\xd3\x88\xce\x7f\x37\x80" + "\x6c\x7f\x6b\xbe\xf1\x76\x56\xe7\x93\xed\xac\xce\x7f\x37\xef\xc1" + "\xba\xd8\xfb\x45\xe7\x2f\x08\x94\xa6\xf3\x17\x04\x48\xd3\x94\x71" + "\x43\x58\x4d\x19\x37\x44\x58\x53\x2e\xec\x69\x59\x53\x2e\x4e\x64" + "\x35\x65\xcc\x05\xc2\xdd\x31\xcc\xda\xb4\x98\x95\xe2\x35\xe5\x7b" + "\x4d\x5c\x4d\xb9\x30\xfa\x81\xa6\x6c\x2f\x4d\xf9\x2e\x33\x67\xec" + "\xbd\x93\xd2\x34\xe5\x7b\x27\xb8\x9a\x32\xee\x92\xb9\xa6\x8c\xe9" + "\x67\xbb\xa6\x8c\x99\x24\x4d\x53\xc6\x4c\xb4\x4d\x53\xc6\xec\xe7" + "\xd7\x94\x0b\xbd\x84\x35\x25\xd9\x67\xae\x05\x16\x4f\x62\xb5\xc0" + "\xe2\x9e\x9d\x5f\x53\x2e\x3a\xc6\x7f\xdf\x5f\x74\x92\x68\xca\x98" + "\x7d\x6d\xaf\x29\x63\xf6\xf1\x6b\xca\xc5\xcc\xfa\xd7\x98\x42\x73" + "\x4d\x09\xdf\xe1\xd5\x94\x8b\x17\x30\xdf\xd9\xc7\xd5\x94\xa4\x0d" + "\xe0\xa1\xf5\xc2\x9a\x72\x09\x33\x9f\x70\xf1\x1d\xc2\x4b\x24\xa6" + "\xe6\x9a\x72\x71\x99\x75\x4d\x49\x30\x44\xf7\x53\x50\x53\x2e\xf1" + "\x30\xd7\x94\x0b\x3d\xf9\x35\x65\xec\x75\x16\x47\xb1\xe9\x5c\x4d" + "\xb9\x64\xd6\xfd\xa1\x29\x05\xb1\x75\x8c\xab\x29\x63\x07\x8a\xd7" + "\x94\xb1\x73\xc4\x69\x4a\x8c\x39\x3e\x4d\x19\xbb\xdf\x14\x73\x5c" + "\x4d\x19\x7b\x8a\x5f\x53\xc6\x5e\xe2\x6a\x4a\xdc\x3e\x9f\xa6\x8c" + "\x73\xe6\xb4\x6f\xa6\x29\xe3\xfa\x71\x35\x25\x39\x8e\xd5\x94\x71" + "\xa5\x84\x43\x17\x1c\x17\xaf\x29\xe3\xf6\x0b\x6b\xca\xb8\xc3\x5c" + "\x4d\x19\x97\x4a\xb4\x63\x9c\x8a\x68\xca\xb8\x3c\xb2\x7d\x81\xd2" + "\x78\x3b\xab\x29\xc9\x76\x56\x53\xc6\xa9\xa5\xaf\x99\x4d\x3a\xc6" + "\x6a\x8e\xa4\x63\xc2\x9a\x63\x69\xba\x65\xcd\xb1\x5c\xc1\x6a\x8e" + "\x65\x91\xe4\xda\x5e\x16\x48\xae\xed\x65\xb4\x0f\x4b\x2a\x03\xcd" + "\xf1\x64\x6c\xca\x81\x1b\x85\xb4\xe6\xf8\x74\xa1\x46\x06\xda\x50" + "\xa1\xc7\x9a\x03\x34\x60\xda\x52\xac\x39\x6a\x99\x35\xb3\xf1\x2b" + "\xcb\xe2\x8d\x35\xc7\xd2\x4b\xf4\xfa\x59\xac\x3b\x1a\x34\xf4\x71" + "\x78\x3f\xdf\x7a\xda\xe2\x85\xcc\x7a\x5a\x68\xdb\x78\x1d\x2d\xbd" + "\xb6\xf6\x06\x68\x92\x37\x21\x16\x46\x9a\xe4\xc1\x7a\x5a\x4b\xeb" + "\x69\xe3\x27\x49\xd3\xc0\xf1\x13\xb9\x3a\x24\x39\xda\x5c\x87\xc4" + "\x1f\xb4\x5d\x87\xc4\x9f\x93\xa6\x43\xe2\xcf\xda\xa6\x43\x96\x0d" + "\xe5\xd7\x21\x4b\x33\x31\x6e\xf9\x75\x08\xd9\x67\x7e\xff\x48\x38" + "\xc7\xde\x3f\x12\x76\x76\x7e\x1d\x92\x30\x96\xff\x5e\x91\x30\x89" + "\xe8\x90\x65\x43\xda\x5e\x87\x2c\x1b\xc2\xaf\x43\x12\x8e\x13\xce" + "\x5e\x36\xdc\x5c\x87\xc0\x77\x78\x75\x48\x02\x33\xff\x73\xd9\x10" + "\xae\x0e\x21\x6d\x00\x37\xb9\x09\xeb\x90\xe5\xfb\x09\x57\x2d\x4f" + "\x22\x5c\x45\x62\x6a\xae\x43\x96\x4f\xb5\xae\x43\x08\x86\xe8\x7e" + "\x0a\xea\x90\xe5\xf9\xe6\x3a\x64\x69\x1a\xbf\x0e\x49\x8a\x63\x71" + "\x94\xe4\xc1\xd5\x21\xcb\x2f\xdf\x1f\x3a\x44\x10\x5b\x63\xb9\x3a" + "\x24\xf1\xb0\x78\x1d\x92\x78\x55\x9c\x0e\xc1\x98\xe3\xd3\x21\x49" + "\x43\x4d\x31\xc7\xd5\x21\x49\xc1\xfc\x3a\x24\x29\x9a\xab\x43\x70" + "\xfb\x7c\x3a\x24\x29\x87\xd3\xbe\x99\x0e\x49\x3a\xc8\xd5\x21\xe4" + "\x38\x56\x87\x24\x87\x30\xf7\xc0\xa1\xe2\x75\x48\xf2\x50\x61\x1d" + "\x92\x3c\x8a\xab\x43\x92\x5d\x89\xde\x48\x8e\x22\x3a\x24\xd9\x87" + "\x6c\x5f\x3a\xc4\x78\x3b\xab\x43\xc8\x76\x56\x87\x24\xc7\xdb\x98" + "\xdb\x3a\x24\x66\x3d\xed\xfe\xbb\xdc\xdc\x96\x21\xaf\xa5\x1d\x10" + "\x38\xb7\x35\xb7\x65\xfc\x4c\x94\x27\xb7\x85\xef\xe7\x6c\x6e\xeb" + "\x02\xcd\x53\x6c\x6e\x4b\x45\xe7\xb6\x70\x5e\x0b\x3f\x17\x35\xe4" + "\xb5\xf4\x7f\x35\x5f\x4b\xbb\x5f\x2f\x3e\xaf\xc5\x3e\x1b\xd5\x2a" + "\x48\x5e\xab\xaa\x35\xaf\x85\xef\xe5\xba\x46\xf3\xbc\x16\xbe\x87" + "\xb3\x79\xad\x1f\xdb\x38\xaf\x95\xd2\x47\xda\x3d\x3d\xc5\xfb\xde" + "\x3f\xbf\xfe\xbd\xad\xa5\x4d\x4e\x23\xf9\x9e\x95\x87\xa5\x3d\xbf" + "\x5e\x79\xe8\xde\xc7\xe4\xf7\x36\x9f\x3b\x25\x8a\xc4\x64\x75\xa0" + "\xb4\x98\xac\x16\xcc\xff\x3e\x98\xe7\x21\x35\x26\x2b\xb5\x24\x26" + "\x6b\x2e\x48\x8b\xc9\x9a\x6a\x69\x39\xf9\xb4\x7a\xd6\x1f\xa7\xd5" + "\x1b\xfb\xe3\x92\xb1\xc6\xfe\x78\xed\x7e\xcb\xfe\x78\xc3\x10\xd6" + "\x1f\xa7\xe6\x10\xcd\x99\xba\x8c\x68\xce\xd4\x11\xb4\x3f\x1e\x8d" + "\x68\x5f\xac\xc5\x1e\x79\x9e\x46\x76\xe0\x9a\x52\xa6\x5d\x45\xbc" + "\x71\x85\xb6\x14\x95\xa9\x35\xe8\xfd\xa5\x48\xb1\xfe\x06\x52\x7c" + "\x72\x4b\x23\x73\x99\x8f\x1c\xe1\x1e\x04\xe3\x55\x0a\x9a\x25\x1f" + "\xc5\x24\x63\xdf\xfc\xb7\x83\x15\x31\x6a\x23\xdf\xbc\xce\x83\xf5" + "\xcc\x70\x5c\x8c\x06\x7d\x39\x4f\x29\xc3\xde\xb8\x25\x27\xba\xb0" + "\x65\x60\x60\x04\x5d\x77\xca\x38\x6f\x0f\xbf\xed\x1d\xce\xcd\xdb" + "\x37\xe7\x44\x1f\x6a\xda\x1f\x38\x97\xae\x77\xd9\x97\xcd\xdd\x8b" + "\xa9\x75\xf9\x61\x33\x72\x37\xe4\xed\x3f\xfc\xdd\xe5\xed\x57\x67" + "\x12\x7c\xfe\x2d\x49\x5a\xde\xfe\x6f\x89\x5c\xbf\x9c\xbe\xd5\xdc" + "\x2f\xff\xed\x92\xed\x7e\x39\xb5\x8b\x34\xbf\x9c\xaa\xb0\xcd\x2f" + "\xa7\x46\x9a\xfa\xe5\x3d\xc9\xd8\x2f\xaf\x2d\xc4\x38\xe6\xf7\xcb" + "\x64\x9f\xb9\xcf\xd9\xd0\x85\xf5\x39\xeb\xcf\x74\x7e\xbf\xbc\x3e" + "\x96\xdf\xd3\xac\x4f\x22\x7e\x39\x75\x6e\xdb\xfb\xe5\xd4\xb9\xfc" + "\x7e\x79\xfd\x4d\xe2\x2d\x52\xe7\x1a\xbc\x2f\xeb\x97\xe1\x3b\xbc" + "\x7e\x79\x43\x5f\xd3\xef\x10\xbf\x9c\x1a\x45\xfc\xf2\x86\xd1\xc2" + "\x7e\x79\x03\xf3\x3c\x71\xc3\x7e\xc2\x5d\x24\xa6\xe6\x7e\x79\xc3" + "\x5a\xeb\x7e\x99\x60\x88\xee\xa7\xa0\x5f\xde\x50\x66\xee\x97\xd7" + "\xee\xe3\xf7\xcb\x69\xbb\x59\x1c\xa5\x8d\xe3\xfa\xe5\xf7\x3d\xee" + "\x0f\xbf\x2c\x88\xad\x58\xae\x5f\x7e\xff\xb2\x78\xbf\x9c\xd6\x53" + "\x9c\x5f\xc6\x98\xe3\xf3\xcb\x69\x91\x0c\x7e\xa2\xf8\xfd\x72\xda" + "\x4a\x7e\xbf\x9c\xb6\x95\xeb\x97\x71\xfb\x7c\x7e\x39\xed\x24\xa7" + "\x7d\x33\xbf\x9c\x76\x89\xeb\x97\xc9\x71\xac\x5f\x4e\x5f\x43\x38" + "\x74\xed\x54\xf1\x7e\x39\x3d\x52\xd8\x2f\xa7\x2f\xe0\xfa\xe5\x74" + "\x7f\xe2\x8b\xd3\x73\x89\x5f\x4e\x0f\x21\xdb\xd7\x86\x18\x6f\x67" + "\xfd\x32\xd9\xce\xfa\xe5\xf4\x3d\x36\xfa\xe5\xa2\x36\xf2\xcb\x51" + "\xf7\x97\x5f\xd6\x9d\xe8\x1c\x7e\x79\x63\xb0\x34\xbf\xbc\x71\x8a" + "\x0d\x3e\xe0\x90\x15\x1f\x30\xf7\x81\x0f\x30\xd6\x59\xe9\xc7\x88" + "\xce\xca\xbc\x2c\xcd\x07\x64\xda\xb2\xfe\xb9\x5d\x63\xf2\xfb\x8a" + "\xc7\x46\xa6\xc6\xfb\xa6\x38\x69\xf1\xd8\x14\xfb\xc0\x2b\xb7\x75" + "\x4c\xb2\x98\xb5\xcf\xd9\x5d\xa5\xc5\x24\xdb\x51\x9a\x57\xce\x1b" + "\xc9\x7a\xe5\xbc\x91\xc6\x5e\xf9\xbf\x9c\x67\xc9\xd9\xe7\x2d\x7b" + "\xe5\xad\x6b\x58\xaf\xbc\xe5\x32\xd1\x9b\x5b\x4e\x11\xbd\xb9\x85" + "\x9e\x53\x92\x78\x98\x78\xe5\xbb\xd8\x2b\x5f\x01\xaf\xfc\x76\x84" + "\x4c\xcb\xbc\xd3\x01\xcf\x49\x2b\x03\xbf\x8b\xfd\x71\x45\x3c\xfc" + "\x3f\x56\x8d\xde\x5f\x8c\x14\x1b\xc0\xe7\xee\x85\x7b\xe3\xde\xa5" + "\x6a\x59\xea\x3c\xb8\xaf\x54\xed\x47\x2e\x51\xe0\xa1\x6f\x61\x0f" + "\x7d\x02\xfc\xf1\x5a\xc6\x43\x6f\x71\xa8\x88\x35\xf6\xd0\x39\xd3" + "\x69\x0f\xad\x26\xf3\xdd\x2a\x62\xc1\x43\xc3\xef\xe1\x77\x44\x18" + "\x7b\xe8\x26\xf0\xc8\xcd\xe0\x91\x33\xaf\x99\xf8\xe9\xb7\xcd\xfd" + "\x74\x93\x47\x74\x91\x66\x60\x60\x14\xf6\xd3\x77\x77\x3f\xf0\xd3" + "\xe6\x7e\x7a\x13\xc3\xf3\x9b\xcb\xa4\xf9\xe9\xcd\xa5\x5c\x3f\x9d" + "\x77\xd5\xdc\x4f\x6f\x19\x6c\xbb\x9f\xde\x32\x55\x9a\x9f\xde\x12" + "\x62\x9b\x9f\xde\x72\xd8\xd4\x4f\x7f\x4c\x3f\x7f\xce\xae\xc6\x58" + "\xe7\xf7\xd3\x64\x9f\xb9\x0f\xda\x3a\x95\xf5\x41\x5b\xfb\x74\x7e" + "\x3f\x9d\x7b\x82\xdf\xf3\xe4\x96\x11\x3f\xbd\xe5\x50\xdb\xfb\xe9" + "\x2d\x87\xf8\xfd\xf4\x56\xe6\xfd\x4f\x5b\x0e\x99\xfb\x69\xf8\x0e" + "\xaf\x9f\xde\x1a\x67\xfa\x1d\xe2\xa7\xb7\x14\x11\x3f\xbd\x35\x4b" + "\xd8\x4f\x6f\x1b\x48\xf8\x6d\xab\x8e\xf0\x1b\x89\xa9\xb9\x9f\xde" + "\x7a\xce\xba\x9f\x26\x18\xa2\xfb\x29\xe8\xa7\xb7\x3d\x6e\xee\xa7" + "\xb3\xab\xf8\xfd\xf4\x87\x77\x58\x1c\x7d\x98\xc3\xf5\xd3\xdb\x22" + "\xef\x0f\x3f\x2d\x88\xad\x13\x5c\x3f\xfd\xe1\x50\xf1\x7e\xfa\xc3" + "\x68\x71\x7e\x1a\x63\x8e\xcf\x4f\x7f\xc8\xd4\x3f\x23\x78\x31\xf7" + "\xd3\x1f\x9e\xe1\xf7\xd3\x1f\x5e\xe5\xfa\x69\xdc\x3e\x9f\x9f\xce" + "\xf3\xe0\xb4\x6f\xe6\xa7\xf3\x06\x73\xfd\x34\x39\x8e\xf5\xd3\x79" + "\x67\x09\x87\x66\xaf\x14\xef\xa7\xf3\x0e\x0b\xfb\xe9\xbc\x62\xae" + "\x9f\xce\xcb\x24\xbe\x39\xaf\x8e\xf8\xe9\xbc\x5d\x64\x7b\x76\x8a" + "\xf1\x76\xd6\x4f\x93\xed\xac\x9f\xce\xd3\xd8\xfe\xfc\xd9\xae\xfa" + "\x55\x73\x3b\x7e\x6d\x45\x5b\xd5\xaf\x32\x3c\x83\xbe\xd7\x6b\x2b" + "\xb6\xef\x96\xe6\xa9\xb7\xef\x7a\xe0\xdf\xda\xd2\x2b\xe4\x3b\x11" + "\x9d\x55\x30\x54\x9a\x57\x28\x18\xf2\xc0\xbf\xb5\x75\x4c\xb6\xd7" + "\x93\x98\xec\x3c\x25\x2d\x26\x3b\x4b\xa4\xf9\xb7\xbd\x55\xac\x7f" + "\xdb\x5b\x25\xfc\xac\xf3\xa3\xad\x96\xfd\xdb\xdf\xbd\x59\xff\xb6" + "\x7b\x25\xd1\x37\xbb\x23\x89\xbe\xd9\xdd\xb7\xed\x9e\x75\xee\xca" + "\xe7\x3e\xeb\xfc\x3f\x87\x07\xcf\x3a\x3b\xc2\x9b\x15\x24\x12\x7c" + "\xee\x8a\x96\xe6\xcd\x76\x45\x71\xbd\xd9\x27\x6b\xcd\xbd\xd9\xae" + "\x32\xdb\xbd\xd9\xae\x9b\xd2\xbc\xd9\x2e\xb5\x6d\xde\x6c\x77\x30" + "\xff\xb3\xce\x8f\xf2\x84\x9f\x75\x92\x7d\xe6\x9a\xfa\xe3\x9b\xac" + "\xa6\xfe\xb8\xb8\xf3\x7b\xb3\x8f\x23\xf8\xf5\xf3\xc7\xd1\xc4\x9b" + "\xed\x9e\xd2\xf6\xde\x6c\xf7\x14\x7e\x6f\xf6\xf1\x05\xa2\x63\x77" + "\x4f\x31\xf7\x66\xf0\x1d\x5e\x6f\xf6\x77\x37\xd3\xef\x10\x6f\xb6" + "\x3b\x84\x78\xb3\xbf\x0f\x14\xf6\x66\x7f\x3f\x45\xb8\xeb\xef\x5b" + "\x09\x77\x91\x98\x9a\x7b\xb3\xbf\x2f\xb2\xee\xcd\x08\x86\xe8\x7e" + "\x0a\x7a\xb3\xbf\x1f\x31\xf7\x66\x1f\xe5\xf2\x7b\xb3\xbd\x59\x2c" + "\x8e\xf6\x0e\xe6\x7a\xb3\x3d\x0e\xf7\x87\x37\x13\xc4\x56\x04\xd7" + "\x9b\xed\x39\x23\xde\x9b\xed\xed\x22\xce\x9b\x61\xcc\xf1\x79\xb3" + "\xbd\xc1\x0c\x7e\x42\xf8\xbd\xd9\xde\x05\xfc\xde\x6c\xef\x5a\xae" + "\x37\xc3\xed\xf3\x79\xb3\xbd\x07\x39\xed\x9b\x79\xb3\xbd\x65\x5c" + "\x6f\x46\x8e\x63\xbd\xd9\x27\x0c\x87\x7e\x34\x5a\xbc\x37\xfb\x24" + "\x58\xd8\x9b\x7d\x32\x9d\xeb\xcd\x3e\x19\x40\x3c\xd8\x27\x6b\x88" + "\x37\xfb\xc4\x9f\x6c\xff\xc8\xdf\x78\x3b\xeb\xcd\xc8\x76\xd6\x9b" + "\x7d\x92\x6d\xbb\x37\xb3\xbd\xbe\xd5\xbd\x9f\x1b\xec\xfa\x3b\x9b" + "\x1b\xbc\x6f\x94\x34\x5f\xb6\x6f\xe4\x03\x1f\xd0\xd6\x3e\xe0\x13" + "\xa6\xbe\xd0\xfe\x33\xd2\x7c\xc0\xfe\x4a\x69\x3e\xe0\xb0\x51\x6d" + "\xab\xc3\x2a\x61\x1f\x70\x60\xa7\x65\x1f\xf0\x2f\xa3\xda\x56\x07" + "\x99\xda\x56\x07\x99\xda\x56\x07\x07\xb6\x9d\x0f\x28\xdc\xcd\xf5" + "\x01\x9f\x76\x7d\xe0\x03\x3a\xc2\x07\xec\x5b\x43\xf0\x59\x28\xb1" + "\xfe\x55\xa1\x49\xfd\xab\xcf\x78\xea\x5f\x15\x8a\xa8\x7f\x55\x28" + "\xb1\xfe\x55\xa1\x8d\xf5\xaf\x0e\x9a\xd5\xbf\x22\x3e\xe0\xc0\x2e" + "\x61\x1f\x40\xf6\x99\xeb\xb7\x7f\x1a\xd5\xbf\xfa\xe7\x7d\x50\xff" + "\xea\x9f\x02\x35\x8a\xfe\xc9\xd4\xbf\x3a\xd8\x0e\xf5\xaf\x0e\x0a" + "\xd4\xbf\xfa\x27\x53\xff\xea\x60\xa8\xb9\x0f\x38\x28\x50\xff\xea" + "\x5f\x3d\x4d\xbf\x43\x7c\xc0\x41\xa6\xfe\xd5\xbf\x2c\xd4\xbf\xfa" + "\x17\x53\xff\xea\x5f\x4c\xfd\x2b\x12\x53\x73\x1f\xf0\x2f\x1b\xea" + "\x5f\x1d\x64\xea\x5f\x1d\xb4\x50\xff\xea\x5f\x3c\xf5\xaf\x0e\x14" + "\xf0\xfb\x80\xc3\x46\xf5\xaf\x0e\x9b\xd4\xbf\x3a\x74\x9f\xd4\xbf" + "\x12\xc4\x96\x49\xfd\xab\x43\x12\xea\x5f\x1d\x16\x59\xff\xea\xa0" + "\x40\xfd\xab\xc3\x4c\xfd\xab\x83\x02\xf5\xaf\x0e\x0b\xd4\xbf\x3a" + "\x6c\x52\xff\xea\xa0\x40\xfd\xab\xc3\x47\x38\xed\x9b\xf9\x80\xc3" + "\x26\xf5\xaf\x0e\x9a\xd4\xbf\xfa\x8c\xa9\x7f\x75\x20\x50\xbc\x0f" + "\xf8\xcc\x42\xfd\xab\xcf\x4c\xea\x5f\x7d\xc6\xac\x05\xfc\x8c\xa9" + "\x7f\xf5\x19\x53\xff\xea\x40\x80\xf1\x76\xd6\x07\x90\xed\xac\x0f" + "\xf8\xec\x41\xfd\xab\xfb\xa6\xfe\x55\x91\xc4\xfa\x57\x45\x12\xeb" + "\x5f\x29\x8d\xea\x5f\x29\x2d\xd4\xbf\x3a\x62\xa5\xfe\x55\xb1\x51" + "\xfd\xab\xa3\xcc\x7c\xf5\xa3\x4c\xfd\xab\xa3\x12\xea\x5f\x7d\x6e" + "\x52\xff\xea\xc8\x83\xfa\x57\xed\xa6\x29\x3f\x63\xea\x5f\x7d\x2e" + "\xb1\xfe\xd5\xe7\x26\xf5\xaf\x94\x3c\xf5\xaf\x8e\x8a\xa8\x7f\x75" + "\x54\x62\xfd\xab\xa3\x36\xd6\xbf\x3a\x2a\x50\xff\xea\x88\x85\xfa" + "\x57\x47\x04\xea\x5f\x15\x1b\xd5\xbf\x2a\xbe\x0f\xea\x5f\x1d\x13" + "\xa8\x51\x74\x8c\xa9\x7f\x75\xb4\x1d\xea\x5f\x1d\x15\xa8\x7f\x55" + "\xcc\xd4\xbf\x3a\xca\x53\xff\xea\xa8\x40\xfd\xab\x62\xa6\xfe\xd5" + "\x51\x93\xfa\x57\x47\x99\xfa\x57\xc5\x16\xea\x5f\x7d\xc1\xd4\xbf" + "\x2a\x66\xea\x5f\x1d\x11\xa8\x7f\x55\x6c\x43\xfd\xab\xa3\x4c\xfd" + "\xab\xa3\x16\xea\x5f\x7d\xc1\x53\xff\xea\x88\x40\xfd\xab\x2f\x8d" + "\xea\x5f\x7d\x69\x52\xff\xea\x8b\xfb\xa4\xfe\x95\x20\xb6\x4c\xea" + "\x5f\x7d\x29\xa1\xfe\xd5\x97\x22\xeb\x5f\x1d\x15\xa8\x7f\xf5\xe5" + "\x7e\x53\xcc\x71\x35\xe5\x97\x02\xf5\xaf\xbe\x34\xa9\x7f\x75\x54" + "\xa0\xfe\x95\xd2\x99\xd3\xbe\x99\xa6\x54\x9a\xd4\xbf\x3a\x6a\x52" + "\xff\x4a\xc9\xd4\xbf\x2a\x92\x50\xff\x4a\x69\xa1\xfe\x95\xd2\xa4" + "\xfe\x95\x92\xa9\x7f\xa5\x64\xea\x5f\x29\x99\xfa\x57\x45\x4a\xe3" + "\xed\xac\xa6\x24\xdb\x59\x4d\xa9\xb4\x58\xff\x8a\xbb\x8e\xa6\x4d" + "\x72\xcb\x1d\xb4\x8e\xa6\xad\x72\xcb\x9d\x65\x1d\xcd\x7f\xb6\x4a" + "\xd3\x93\xff\xc9\x7d\x30\xe7\xa7\x2d\xf3\xca\xc7\x15\x44\x63\x9d" + "\xe8\x27\x2d\xaf\x7c\xc2\x57\x9a\xbe\x2f\x0d\x61\xf5\x7d\x69\x88" + "\xf0\xfa\x80\x13\x4d\x96\xf5\xfd\xa9\x3c\x56\xdf\x7f\xad\x23\xf7" + "\xd1\xaf\x2f\x91\xfb\xe8\xd7\x3b\xa5\xac\x0f\xd8\x70\x0b\x29\xde" + "\x37\x5d\x1f\x70\xb6\x98\xac\x0f\x58\x6c\xba\x3e\xe0\xeb\x9e\xdc" + "\xf5\x01\x27\x97\x09\xad\x0f\xc0\x79\xe6\x96\xfd\x81\x73\xf1\xda" + "\x00\xde\x75\x01\x61\x6d\xbf\x2e\x00\x7b\x83\x0f\x01\xb3\xd8\x1f" + "\x60\x9e\xf9\x7d\xf9\x83\xff\xa8\x08\x76\xff\x7b\x59\x9a\x3f\xf8" + "\x6f\x2d\xd7\x1f\x94\x39\x98\xfb\x83\xaf\x03\x6d\xf7\x07\x5f\x2f" + "\x90\xe6\x0f\xbe\x9e\x6f\x9b\x3f\xf8\xba\x8c\x7f\x5d\xc0\x09\xad" + "\xf0\xba\x00\xb2\xcf\x5c\xd7\x9d\x5a\xc0\xea\xba\x53\x23\x3a\xbf" + "\x3f\x28\xa9\xe6\xd7\x70\x25\x97\x89\x3f\xf8\xba\xb4\xed\xfd\xc1" + "\xd7\xa5\xfc\xfe\xe0\x14\x93\xff\xfb\xba\xd4\x3c\xe7\x0c\xdf\xe1" + "\xf5\x07\xa7\xd2\x4d\xbf\x43\xfc\xc1\xd7\x95\xc4\x1f\x9c\xda\x2b" + "\xec\x0f\x4e\x8f\x23\xbc\x76\xda\x83\xf0\x1a\x89\xa9\xb9\x3f\x38" + "\x75\xdd\xba\x3f\x20\x18\xa2\xfb\x29\xe8\x0f\x4e\x0f\x35\xf7\x07" + "\x27\x34\xfc\xfe\xa0\xd4\x99\xc5\xd1\x37\xfb\xb9\xfe\xe0\x74\xd2" + "\xfd\xe1\x0f\x04\xb1\x55\xcd\xf5\x07\xdf\x4c\x12\xef\x0f\xbe\x59" + "\x29\xce\x1f\x60\xcc\xf1\xf9\x83\x6f\xca\x18\xfc\x54\xf2\xfb\x83" + "\x6f\xae\xf2\xfb\x83\x52\x07\xae\x3f\xc0\xed\xf3\xf9\x83\xd2\x81" + "\x9c\xf6\xcd\xfc\x41\x69\x20\xd7\x1f\x90\xe3\x58\x7f\x50\xca\xe8" + "\xf1\x13\x3b\xc5\xfb\x83\xd2\x32\x61\x7f\x50\x7a\x8e\xeb\x0f\x4a" + "\xf7\x10\x1f\x50\x86\x88\x3f\x28\x3d\x46\xb6\x9f\x28\x30\xde\xce" + "\xfa\x03\xb2\x9d\xf5\x07\x65\xae\xb6\xcf\x3d\xb1\x3d\xe7\x7c\xef" + "\xe7\x9e\x38\xfe\xce\xe6\x9e\x94\x1f\x91\xe6\x0f\xca\x8b\xa4\xe9" + "\xd1\xef\x95\xac\x1e\xfd\x5e\x29\x3c\xcf\xa1\x62\xbd\x65\x3d\x7a" + "\xd6\x91\xd5\xa3\xdf\x46\x13\xde\xfe\x76\x12\xe1\xed\x6f\x9d\x6d" + "\x9d\xe7\xb0\xe1\x2e\xa3\x41\x0d\xf3\x1c\x96\x32\xf3\x1c\x40\x87" + "\x12\xdd\x79\x66\x2d\x77\x9e\x43\xc5\x4d\xa1\x79\x0e\xbc\xf3\x1b" + "\x4c\xb4\xa6\x41\x97\xda\x33\xbf\xe1\xf7\xad\x35\xcb\x7c\x88\xd6" + "\x3c\x13\x2c\x4d\x6b\x9e\x99\xc2\xd5\x9a\x3f\x2c\x30\xd7\x9a\x67" + "\x0e\xdb\xae\x35\xcf\x9c\x97\xa6\x35\xcf\x54\xd9\xa6\x35\xbf\x1d" + "\xc1\x3f\xbf\xa1\x22\x4d\x78\x7e\x03\xd9\x67\xae\x11\xbe\x3b\xcf" + "\x6a\x84\xef\x76\x77\x7e\xad\xf9\x5d\x00\xbf\x1e\xf8\x2e\x98\x68" + "\xcd\x6f\x87\xb7\xbd\xd6\xfc\x76\x38\xbf\xd6\xfc\x8e\xa9\x7f\xf3" + "\xed\x70\x73\xad\x09\xdf\xe1\xd5\x9a\xdf\x35\x99\x7e\x87\x68\xcd" + "\x6f\x47\x12\xad\x79\xd6\x43\x58\x6b\x9e\x3d\x48\x38\xeb\xec\x4a" + "\xc2\x59\x24\xa6\xe6\x5a\xf3\xec\x74\xeb\x5a\x93\x60\x88\xee\xa7" + "\xa0\xd6\x3c\xbb\xd3\x5c\x6b\x56\xa4\xf2\x6b\xcd\xef\x97\xb1\x38" + "\xfa\xbe\x27\x57\x6b\x9e\xbd\x7a\x7f\x68\x4d\x41\x6c\x05\x70\xb5" + "\xe6\xb9\x23\xe2\xb5\xe6\xb9\xeb\xe2\xb4\x26\xc6\x1c\x9f\xd6\xfc" + "\x9e\x79\xfe\x41\xf0\x62\xae\x35\xbf\x9f\xca\xaf\x35\xbf\x5f\xc0" + "\xd5\x9a\xb8\x7d\x3e\xad\xf9\xfd\x56\x4e\xfb\x66\x5a\xf3\xfb\xc3" + "\x5c\xad\x49\x8e\x63\xb5\xe6\x0f\xa1\xcc\x3d\x6f\xb0\x78\xad\xf9" + "\xc3\x08\x61\xad\xf9\xc3\x68\xae\xd6\xfc\xc1\x9d\x68\xca\x1f\xe6" + "\x13\xad\xf9\x83\x2f\xd9\x5e\xe1\x67\xbc\x9d\xd5\x9a\x64\x3b\xab" + "\x35\x7f\x48\xb4\xa4\x35\xa9\x6c\x17\xdf\x4c\x99\xbe\x10\x3e\x45" + "\xd0\xcf\x9e\x70\x7f\x53\xc2\xff\x4b\xe0\x3e\xe5\x06\xff\x17\x9c" + "\xaf\xa9\xf6\x70\xf1\xd5\x83\x2e\xd1\xc3\xef\x54\xa8\x7f\x53\x2a" + "\x7b\x69\x71\x5f\xb5\xe4\xfe\xe2\xe2\xeb\xa2\x7d\x38\x40\x4f\x45" + "\x21\xca\x1d\xfe\x1f\x0f\xdb\xe0\xf8\x6e\x70\x3f\xf4\x5e\x8a\xba" + "\xdd\x90\x55\x79\x19\x8e\x83\x3e\x77\xab\x91\xfd\x70\x1e\xb7\xd1" + "\xb8\xa1\xca\x17\xce\x27\x55\xb0\xaf\xd0\x56\xd0\xde\xde\x28\x49" + "\x4b\xfd\x4f\xb9\xf0\x16\xaa\x95\x55\x2d\x72\xa9\x7f\x38\x00\x78" + "\x08\x61\x7d\x58\xd8\x4b\xad\xc0\x6d\x2a\x17\x36\xe3\x7d\x21\x78" + "\x9f\x0e\xfa\x98\xbc\x00\xc9\x32\x6e\x3d\xec\x08\x9a\xab\xcb\x8a" + "\x06\xaa\xee\x3d\x2d\xf4\x19\xee\xaf\x5f\xf6\xae\x52\x7c\xba\xad" + "\x8a\xbe\xf7\x94\x37\xe8\xe8\x36\xbc\x17\xe2\xfe\x54\xc5\x6d\x87" + "\xe3\xf9\xfa\xb0\xf6\x00\x1a\xd0\xa5\x1f\xa5\x12\x77\xbf\xab\x12" + "\x5c\xff\xe6\xb2\xb2\x37\x52\x3e\x03\x63\xe7\x8d\x64\x7c\xfb\xc5" + "\xfd\xce\x79\x3f\xa1\xdf\x79\xd2\x15\x39\x7e\xd0\x83\x6a\x58\xb1" + "\x15\xc9\x36\xea\x1f\x76\xfc\x0a\x38\x71\xc7\x66\x4a\xdd\xb8\xe1" + "\x7c\x9e\xca\x81\x4a\xc4\x63\xbe\x1a\xf6\x6f\xec\x41\xa9\x6f\xaf" + "\xc2\xb8\x39\x7f\xe8\x38\xdc\xdb\x4d\x63\xb1\x78\xee\x82\x39\xde" + "\xb1\xd1\x0b\x22\xdf\x8b\x8b\xf5\xee\x3b\xf7\x11\x14\xf2\xde\x7b" + "\xde\x0b\xe6\x2c\x5c\xe6\x6d\xbc\xe7\x45\xef\xb9\xd1\x4b\xe6\xbc" + "\x39\x3f\x72\xe0\x82\xb7\x62\x1e\x81\x3e\x21\xa3\x7e\xb8\xe3\xbe" + "\xe8\x37\x9c\x57\x6e\xdf\x84\xd0\x07\xdd\x91\x02\xf7\xab\x71\xc3" + "\x8f\x3e\x2a\xc5\xd3\xc7\xf0\xef\x65\x6c\xa6\x1a\x64\x70\xcc\x0a" + "\xe0\xb4\x8d\xc9\x0f\xe3\x63\xfd\x76\x40\xbf\xb6\x43\xbf\xa1\x8f" + "\xd0\xe7\x1f\xa7\x18\xfa\x6c\xc0\xc4\x0a\x8c\x89\xe4\x5b\x80\xc1" + "\x1f\x17\xb9\x68\x1e\x1e\x4f\x51\xa1\xf8\xfc\x1a\xe0\x5a\x71\xb8" + "\x22\xfb\xa9\x2b\xed\x19\x72\x5c\x7c\xe1\xbb\x69\x06\x8c\xe9\xb3" + "\xa7\xa5\x50\x9b\xbb\xa9\x41\x57\x3a\x34\x52\x51\x2f\x03\x36\xf1" + "\xf7\xcf\x0f\x42\x28\x85\x6a\x0c\xa5\xdf\x5d\x41\x35\x02\x86\x09" + "\x4e\x61\xdf\x4f\xfb\x6e\xcb\xd0\x2b\xd0\x46\xa5\x0a\xed\xab\xc5" + "\x6d\xa8\x60\x1b\x1e\x73\x7d\x41\x6c\xcc\x54\x5f\x94\xf2\x74\x0a" + "\x4a\x69\xc4\xdf\xd9\x35\x2c\xc0\x25\x16\x39\x04\xc5\x53\x3f\x03" + "\xef\x38\x50\x7d\x62\x63\xa8\xdd\xc3\x02\x54\xb2\x1f\x0f\xe9\x73" + "\xa6\xa5\xc0\xf9\xd4\x37\x6e\xf8\xc9\x53\xe5\x30\x62\x2e\x6e\x67" + "\xe3\x66\x7a\xec\xeb\xf1\xb9\xc3\xf8\x80\xf7\xa1\x94\xd4\x2a\xe6" + "\x1a\xca\x7c\x46\xa3\xcf\x4c\x2c\xa8\x50\xdc\x45\x41\x5a\xaa\x85" + "\xca\x7a\x46\x53\xde\xd0\x00\x9c\x16\xf3\x16\xf5\xc8\xf9\x33\x2e" + "\xda\xe8\xc8\x1d\xdd\xe1\x5a\xcc\x4a\x2c\xa0\xb2\xc6\xb9\x4e\xed" + "\x87\x5c\xa1\xed\x58\xc3\x78\xc2\x58\x2a\xc4\xe1\xe8\xa7\x78\x7c" + "\x4e\x18\x0f\xd0\x1f\x06\x0f\x3f\x9d\x38\x1e\x6b\x8e\x87\xd6\x6b" + "\x73\xf3\x78\x3f\x2d\x15\x3a\xbe\x25\x7b\x7c\x14\xe5\x3e\x3e\x24" + "\xf9\x32\x7a\x08\x8f\x6d\x39\x78\x81\x8c\xa5\xc8\x33\x3d\x1c\x79" + "\xcf\x5e\xe6\x8a\xd4\x39\xe3\xa7\xb8\xac\x4c\x71\x80\x31\x91\x01" + "\xbf\xf8\x01\x67\xfa\xb5\xf4\x98\x96\x92\x18\x89\x64\xfb\x6b\x0a" + "\x65\x58\x3f\xe3\x39\x2a\x57\x64\xd5\x6b\xb7\xc3\xf7\xa8\xdf\x42" + "\x11\x8e\x07\x1d\x8b\xdf\xa2\xd0\xa4\x68\xb8\x3f\xcf\xa3\xf7\x1f" + "\xc9\x87\x36\xc5\x9d\x57\x35\xad\x7f\x75\x10\xab\x41\x10\xa7\x8a" + "\x5a\x1d\xdd\x26\x1d\xab\xf9\x6c\xac\x8a\xa1\x1f\x6c\xbc\xaa\xfd" + "\x71\x5c\x05\xce\xb9\x90\x39\xe7\x3a\x38\xe7\xb3\x16\xce\xb9\x92" + "\x9c\x73\x97\x5b\x96\xcf\xf9\xc2\x32\xcb\xe7\x7c\x61\xbf\xf8\x73" + "\xbe\x30\x56\xfc\x39\x5f\x18\x22\x7c\xce\x01\x4c\x9c\x03\x20\xce" + "\x01\x16\xe2\x1c\xc0\xc4\xf9\xd1\x1a\xcb\xe7\x7c\x71\x81\xe5\x73" + "\xbe\xb8\x53\xfc\x39\x5f\x1c\x2e\xfe\x9c\x2f\xfa\x5a\x38\x67\x26" + "\xce\x01\x10\xe7\x00\x0b\x71\x0e\x60\xe2\xec\xf6\xad\xe5\x73\xfe" + "\x79\x8e\xe5\x73\xfe\x39\x47\xfc\x39\xff\x3c\x40\xfc\x39\xff\xec" + "\x25\x7c\xce\x81\x4c\x9c\x03\x21\xce\x81\x16\xe2\x1c\xc8\xc4\x79" + "\xd8\x06\xcb\xe7\xac\x9a\x6a\xf9\x9c\x55\xeb\xc5\x9f\xb3\xca\x5b" + "\xfc\x39\xab\x5c\x2d\x9c\x33\x13\xe7\x40\x88\x73\xa0\x85\x38\x07" + "\x32\x71\x9e\x31\xc6\xf2\x39\x5f\x0a\xb4\x7c\xce\x97\x92\xc4\x9f" + "\xf3\x25\x77\xf1\xe7\x7c\x49\x21\x74\xce\xcd\xc0\xdb\x4e\x70\x2e" + "\x2d\x3f\x84\x8e\xd7\xb9\x8f\x9f\xe9\x54\x8b\x64\x79\xab\xf4\x51" + "\x2e\x75\xa8\x2b\x9c\x5b\x14\xb5\x39\xcc\x0f\xff\xab\x77\x1f\x1f" + "\xda\xec\x3e\x3e\xaa\xa9\x47\x37\xf5\xf2\x59\xe8\x21\xac\xc7\xd7" + "\xeb\x91\xa7\x3e\x7b\x7c\x48\xda\x1b\xc8\x7b\x85\x1a\xb9\x96\x27" + "\xab\x50\x72\x0c\xa5\x2e\x47\x97\x90\x73\x1d\xf6\x9e\x3f\xa2\xd2" + "\xfa\x12\xb4\x70\x31\x45\x5d\x91\xd5\x9c\xc2\x79\x13\xd0\xc9\x29" + "\x99\xdf\x23\x6f\xf8\x0d\xbf\xed\xf0\xc1\xed\xb8\x4c\x84\xfb\xe7" + "\xe6\xb0\xe7\x76\x24\x23\xcf\x2f\xe6\xd5\x21\xbc\x3d\x1f\x3e\xba" + "\xcd\xd3\x52\x92\x67\x21\xd9\x81\x5b\x55\x32\x72\x6f\xae\xc9\x31" + "\xbd\x37\x4f\x9c\x03\x63\xf9\x26\xbd\xef\x52\xde\x1b\x62\xc7\xb2" + "\x26\xc2\x70\xef\xa6\xc7\xb2\x5a\x47\xee\xf7\x26\xf7\xee\x2f\xe0" + "\xf7\xd9\xb1\xac\x99\x82\xc7\x92\xca\x1e\x1f\x53\x51\xd7\x8c\x7d" + "\x93\xeb\x95\x78\x24\x83\xed\xe0\xaf\x6f\x21\x81\x31\x2e\x34\x1a" + "\xe3\x6a\xa7\xda\x2e\xb7\x04\xc6\xb8\x0a\xc6\xb8\x8e\x67\x8c\xcf" + "\xda\x36\xc6\xb5\x03\xed\x1f\xe3\x5f\x9a\x84\xc7\xb8\x76\x9c\xf8" + "\x31\xfe\xe5\x84\xf8\x31\xfe\xe5\x10\x33\xc6\x6a\xee\x18\xff\x32" + "\x57\x78\x8c\x03\x8c\x70\x1c\x00\x38\x7e\xb4\x86\x7f\x8c\x03\x00" + "\xc7\x01\x3c\x38\x0e\xb0\x11\xc7\x97\xb3\xec\x1f\xe3\xcb\xb3\x84" + "\xc7\xf8\xf2\x5e\xf1\x63\x7c\xd9\x57\xfc\x18\x5f\xf6\x24\x63\x1c" + "\x60\x82\xe3\xda\x12\x0b\x63\x6c\x84\xe3\x00\xc0\xb1\xdb\xb7\x02" + "\x63\x0c\x38\x0e\xe0\xc1\x71\x80\x8d\x38\xbe\x72\xc7\xfe\x31\xbe" + "\x72\x5c\x78\x8c\xff\xe7\x2c\x7e\x8c\xaf\xa4\x89\x1f\xe3\x2b\x89" + "\xcc\x18\x9b\xe0\xf8\xca\x00\xe1\x31\x0e\x34\xc2\x71\x20\xe0\x78" + "\xd8\x06\xfe\x31\x0e\x04\x1c\x07\xf2\xe0\x38\xd0\x46\x1c\xd7\x4d" + "\xb7\x7f\x8c\xeb\xfa\x0a\x8f\x71\xdd\x22\xf1\x63\xfc\x3f\xb5\xf8" + "\x31\xfe\x9f\x8a\x8c\x71\xa0\x09\x8e\xff\x97\x69\x61\x8c\x8d\x70" + "\x1c\x08\x38\x9e\x31\x46\x60\x8c\x01\xc7\x81\x3c\x38\x0e\xb4\x11" + "\xc7\x57\x8b\xed\x1f\xe3\xab\xeb\x85\xc7\xf8\xea\x39\xf1\x63\x7c" + "\x35\x44\xfc\x18\x5f\x1d\xcb\x8c\xb1\x09\x8e\xeb\x1a\x84\xc6\xb8" + "\x05\x3c\xa0\x33\x8c\xb1\x73\x3d\x92\xe5\xe3\xb1\xad\x22\x63\xab" + "\xeb\x11\xe6\x97\x2f\xd3\x47\xe1\x31\xa1\x73\x40\xbf\x7a\x76\xd3" + "\x65\x8f\x9f\x49\xc9\xe0\x9c\x92\x71\xde\xf5\xda\x28\xed\x2a\xd4" + "\xcd\x3b\x19\xe7\x7f\xeb\x7b\xe2\x63\xbc\x93\xd7\x5d\x80\xdf\x93" + "\xe3\xbc\x97\x36\xc7\xb9\x52\xe7\xf1\x7a\xe8\x15\xd9\xaf\x71\x54" + "\xdf\xe1\x11\xe0\xbd\x62\xa8\x77\x3d\xdd\x2b\xea\x0b\x61\x7c\x4e" + "\xa3\xf2\xaa\xcf\x91\xbe\x47\xd8\x73\x83\xb4\xc8\x97\xfa\xd5\xd7" + "\xbd\x34\x56\x85\x74\x6f\x79\x3a\x55\xc4\x97\xa0\x8a\xf8\x7f\xa2" + "\xa0\x3a\xea\x2e\xf5\x8b\xaf\x53\x8b\x47\x44\xbc\xce\x23\xcc\x5b" + "\x97\x13\x5d\xa2\xf5\x88\x88\xda\xbf\x54\x25\x73\xd2\x20\xdf\xf9" + "\xb5\x14\x95\xf1\x26\x52\x64\xd4\x20\xc7\x8d\x6f\x22\xa7\x8d\x35" + "\xc8\xb5\xb4\xb6\x0a\x95\x5d\x2b\x41\x65\xb7\xce\xa3\xb2\xbb\xf0" + "\x69\x86\x8f\x1e\x3e\x29\xe7\x21\xd6\x08\x4d\xba\x8e\xf0\x7b\x3f" + "\xd5\xfd\xab\x91\x7b\xa9\xb6\x0a\xe1\x75\xbb\x37\x64\xbf\xba\x39" + "\x45\x20\x77\xea\x17\x4f\x44\xbd\xe5\x29\x83\x7d\x0a\xbc\xbd\x42" + "\xab\x46\xa5\xb5\x1a\xd8\x7f\x4d\x0d\xfb\x15\x2b\x6a\xa1\x7d\x7d" + "\x09\x7e\xaf\xa7\xba\x34\xe5\x14\xd2\x66\x15\x17\x52\xd8\x43\xf7" + "\x18\xef\x97\x09\x43\xad\xa7\x3c\x9f\x24\x38\xa8\xef\xb7\x5d\x2f" + "\x36\xd6\xbf\xfa\xd3\x63\xfc\xae\x67\x77\x18\xe7\x5e\xfa\x77\x43" + "\x5d\x27\x9f\xff\x99\xc2\xf3\xfa\x70\x2e\xa1\xbc\xe1\x34\xc2\xcf" + "\x9a\x82\x96\x21\x34\x51\x87\x10\x1e\x8b\x8a\xf8\x3a\x34\x39\x06" + "\xb9\xe0\xfc\xb3\xfe\x57\xdf\xee\x15\xb5\x6a\x94\xa4\x85\x3e\xde" + "\xd0\xb4\xf6\xb1\x7c\x4d\x39\x82\x7d\xbd\xca\xa3\x54\xc8\x29\x06" + "\xb9\xe2\xf1\xd5\x66\x8f\x0f\x9d\x0c\xd7\xcf\xc2\x06\x8a\xc2\x63" + "\x8b\xc7\x14\x8f\x2f\x6e\xcf\x30\xe6\x15\x73\xd5\x68\x85\x06\xb9" + "\x56\x24\xc3\xbf\xf1\x94\xba\x02\xdd\x44\xd0\x47\x1f\xca\xad\xb8" + "\x10\x70\x31\x04\x63\x41\x25\xbb\x36\x04\xe2\xdf\x5d\x00\x53\x67" + "\x09\xa6\xba\xdc\xb2\x01\x53\xd5\x2c\xa6\xea\xb3\x58\x4c\xdd\x58" + "\x20\x8c\xa9\xeb\xa7\x18\x4c\xa9\x3b\x27\xa6\xae\x47\x5a\xc6\xd4" + "\xf5\xb1\x16\x30\x55\x07\x98\x2a\xe4\x62\xea\x46\x92\x78\x4c\x5d" + "\xcf\xee\x40\x4c\x55\x49\xc3\xd4\xf5\x78\x2e\xa6\xea\x53\x85\x31" + "\x15\xc0\xf0\xd4\xa3\x35\xd6\x31\x15\x60\xc4\x53\x37\x2e\xb3\x98" + "\x52\x1f\x17\xc6\x94\xfa\x71\x82\xa9\x80\x4e\xca\x53\xbf\x1d\xb1" + "\x8c\xa9\xdf\x72\x85\x31\x15\x00\x3c\x15\x60\xc2\x53\xea\x33\xe2" + "\x31\xf5\x5b\x5d\xc7\x61\x2a\x40\x22\x4f\xfd\x56\xca\xc5\xd4\x8d" + "\x6a\x0b\x98\x62\x78\xca\xed\x5b\x1b\x30\x65\xc4\x53\x37\x47\xb0" + "\x98\xba\xed\x21\x8c\xa9\x5b\x8b\x18\x4c\x75\x52\x9e\xba\xe5\x6c" + "\x19\x53\x37\xeb\x2d\x60\x0a\x78\x2a\xc0\x84\xa7\x6e\xf7\x15\x8f" + "\xa9\x5b\x23\x3b\x10\x53\x12\x79\xea\x96\x37\x17\x53\x37\xfd\x84" + "\x31\x15\xc8\xf0\xd4\xb0\x0d\xd6\x31\x15\x68\xc4\x53\xb7\xd3\x59" + "\x4c\xdd\x89\x16\xc6\x54\xc3\x49\x82\xa9\xc0\x4e\xca\x53\x0d\x73" + "\x2c\x63\xaa\xc1\x5f\x18\x53\x81\xc0\x53\x81\x26\x3c\x75\x67\x99" + "\x78\x4c\x35\x64\x76\x1c\xa6\x02\x25\xf2\x54\x43\x2c\x17\x53\xb7" + "\xd7\x58\xc0\x14\xc3\x53\x33\xc6\xd8\x80\x29\x23\x9e\xba\x73\x89" + "\xc5\x54\x63\xb1\x30\xa6\x1a\x7b\x32\x98\xea\xa4\x3c\x75\xf7\xb0" + "\x65\x4c\xdd\xcd\xb6\x80\x29\xe0\xa9\x40\x13\x9e\x6a\x2c\x13\x8f" + "\xa9\xbb\xb5\x1d\x88\x29\x89\x3c\x75\xb7\x84\x8b\xa9\x3b\x55\x42" + "\x98\x6a\xc6\xbe\xcf\x01\x30\x15\x05\xbe\x0f\x30\xe4\x52\x49\x30" + "\xd5\x02\x98\xfa\xd0\x18\x53\x3f\x99\xfa\x3e\xcd\x50\x7d\x2b\xa6" + "\x9a\x47\x9b\x62\x4a\x0f\x98\x6a\xa1\x31\xd5\x34\xdd\xe0\xfb\x2a" + "\xea\x0b\x20\x56\xd7\x50\xc5\x14\xc0\xd3\x66\x06\x4f\x3f\x01\x9e" + "\xe0\x7c\xf4\x70\xbe\xa5\xd5\x55\x28\x48\x4d\xce\xab\x19\xce\x57" + "\x6f\x8c\xa5\xe6\x3a\x19\xc6\x10\xc6\x8e\x01\x47\x65\x0b\x01\x3f" + "\x8b\xcf\xa0\xb2\xa5\xf0\x49\x80\x4f\x32\x7c\xd0\x19\x54\x0a\xea" + "\x04\xe7\xec\x59\xfc\x54\x32\xf8\xd1\xdc\xb1\x8c\x1f\xcd\x59\x71" + "\x1e\xaf\x39\x58\x3c\x7e\x9a\x7c\x98\xb9\x74\xae\x41\xc1\x3f\x53" + "\x78\xce\x2c\xc1\xc8\x35\x14\xa4\x45\x2e\xd4\x0c\xdf\xee\x4e\xa1" + "\xc8\x75\xb9\x0e\xc9\xd2\xdf\x44\xae\xe9\x3f\xc2\xf9\x1a\xae\x9d" + "\x1a\xe4\x74\x5a\xf3\x39\x2a\xbd\x55\x85\x4a\xef\x9e\x42\xa5\x7a" + "\xf8\x5c\x83\x0f\xf4\x31\x28\xd2\xf8\x7c\xd5\xcc\xf9\x36\x5d\x86" + "\xb6\x7c\x84\xcf\xb7\xe9\x04\x7d\xbe\x73\xe1\x7c\x9b\xd9\xf3\xad" + "\x00\x2c\x42\x5c\x7a\xe9\x19\x9f\x18\xa4\x46\x5d\xdf\xd3\x52\x54" + "\x33\x83\x41\x1c\x97\xd3\x67\x35\x28\x28\x06\x62\xf5\x16\x60\xb0" + "\x76\x0f\x5a\x91\x08\x18\x6c\xd6\xe0\xe7\xfa\xea\x8a\x94\x26\xc0" + "\x60\x93\x23\x05\xe3\xd6\x82\x31\xf8\x13\xc6\xa0\x66\x80\x5e\x18" + "\x83\x67\x09\x06\xc1\x27\x5a\xc7\xa0\x11\xaf\x35\x1f\x61\x31\xa8" + "\x3d\x29\x8c\xc1\x96\x0b\x06\x9f\x78\xef\x31\xd8\xb2\xcc\x32\x06" + "\x5b\x42\xc5\x79\x42\xed\x39\xf1\x18\x6c\xd9\xd3\x71\x18\xd4\x46" + "\x5b\xc6\xa0\x36\xc0\x06\x0c\x56\x49\xc3\x60\x4b\x1a\x17\x83\xcd" + "\x85\xc2\x18\x0c\x60\x78\x10\x7c\xa5\x55\x0c\x1a\xfb\x4a\xdd\x28" + "\x16\x83\x54\xa0\x30\x06\xf5\x73\x0c\xbe\xf2\xde\x63\x50\xa7\xb3" + "\x8c\x41\x5d\xb5\x38\x0f\x49\x4d\x17\x8f\x41\xfd\x80\x8e\xc3\xa0" + "\xfe\xba\x65\x0c\xea\x4b\xad\x63\x30\x40\x22\x0f\xea\x5d\xb9\x18" + "\xd4\x0d\xb1\x80\x41\x86\x07\xc1\x87\x5a\xc7\xa0\x11\x0f\x52\xc7" + "\x5b\x31\x28\x77\x28\x13\xc4\xa0\x1c\x5d\x36\xf8\xd0\x7b\x8e\x41" + "\x39\x5a\x69\x11\x83\x72\x14\x21\xca\x73\xca\x1d\x2e\x88\xc6\xa0" + "\x1c\x15\x76\x18\x06\xe5\x0e\x8b\x2c\x62\x50\xee\x30\xc5\x06\x0c" + "\x4a\xe3\x41\x39\xca\xe6\x62\x90\x2a\x12\xc6\x60\x20\xc3\x83\xe0" + "\x5b\xad\x62\xd0\xc8\xb7\xca\x65\xe3\x58\x0c\x2a\x82\x85\x31\x28" + "\x8f\x36\xf8\xd6\x7b\x8f\x41\x79\x17\xcb\x18\x94\xd5\x8a\xf2\xa8" + "\x72\xc5\x1c\xf1\x18\x94\x0f\xe9\x38\x0c\xca\xef\x58\xc6\xa0\xfc" + "\xac\x75\x0c\x06\x4a\xe3\x41\xb9\xdc\x93\x83\x41\xb9\x6c\xa4\x05" + "\x0c\x32\x3c\x08\x3e\xd7\x3a\x06\x59\x1e\x94\x2b\x4e\xb1\x18\x7c" + "\xe8\x9c\x30\x06\xbb\x5c\x37\xf8\xdc\x7b\x8f\xc1\x2e\xeb\x2d\x63" + "\xb0\x4b\x94\x28\x4f\x2b\x7f\xe8\xb2\x78\x0c\x76\x29\xea\x38\x0c" + "\x3e\xb4\xcc\x32\x06\x1f\x0a\xb5\x01\x83\x12\x79\xb0\x4b\x1e\x17" + "\x83\x0a\xa5\x10\x06\xf5\xe0\x8b\x5b\x76\x0d\x8f\xd0\x67\x47\xc4" + "\xbb\x38\x78\x23\xad\xfb\xeb\xa1\x15\xb1\x0d\x68\xf2\x1d\x18\x9f" + "\x98\x3b\x28\xfc\x8e\x2b\xd2\x65\x47\x44\x81\x26\x0f\x35\xf2\xcf" + "\xf4\xdc\x32\x6d\x66\x71\xe1\xc6\x85\x48\x01\xfe\xfb\x39\xbc\xad" + "\xe2\x8a\x06\xe1\xdf\x4f\xc2\xfd\xb9\xc6\xf6\x07\xe7\x09\xa8\xdf" + "\x7c\x5d\xe9\x67\xcc\xcd\x2a\x54\x3b\x12\xc9\x4b\x6b\x55\x30\x0e" + "\x09\x74\x7c\xf1\xb8\x5c\x91\x3f\x5c\xb4\xe3\x06\x52\x68\x7f\xf1" + "\xec\x05\xe3\xed\xee\xfc\x57\xe4\xe0\x55\x4b\xe9\xf1\xb8\xe2\xf1" + "\xc2\x63\xec\x9d\x40\x51\x57\xe4\x8e\x5d\xcb\x01\x63\xda\x5f\x7c" + "\x7b\x6d\x87\xe3\x78\xfd\xaa\xdc\xd1\x4d\x3c\x36\x1e\x3e\x4b\xaf" + "\x5b\x90\x3f\x5c\x58\x5a\x8d\x78\x9f\x1d\xc3\x58\x9d\xb5\x71\xac" + "\xaa\x8c\x7c\x5e\x3b\x8c\x95\x63\xad\x6d\x63\xd5\x75\xa8\xc9\x58" + "\x99\xfb\x2a\x79\xd7\x51\xe2\xc7\x0a\x97\x4b\xc5\x63\xe5\x58\x2d" + "\x3c\x56\x01\x36\xe2\x2a\x20\xd4\xc8\x8f\xb4\xc3\x58\x3d\xe2\x6a" + "\xdb\x58\x3d\x32\x87\x3b\x56\x3c\xfa\x5f\xfe\x48\xb4\xf8\xb1\x7a" + "\x84\xbc\x0f\x40\xfe\x88\xa3\x85\xb1\xb2\x11\x57\x01\x55\x46\xba" + "\xb9\x1d\xc6\xea\xd1\x91\xb6\x8d\xd5\xa3\xe9\x26\x63\xc5\xa3\x53" + "\x1f\xcd\x11\x3f\x56\x8f\x86\x92\xb1\x7a\x74\x88\xf0\x58\x05\xda" + "\x88\xab\xc0\x50\x23\x7d\xd7\x0e\x63\xe5\x14\x65\xdb\x58\x39\x1d" + "\xe1\x8e\x15\x9f\x9e\x72\x3a\x2e\x7e\xac\x9c\xd6\x90\xb1\x72\x8a" + "\xb0\x30\x56\x36\xe2\x2a\xb0\xca\x48\x87\xb4\xc3\x58\x39\x67\xdb" + "\x36\x56\xce\x97\x4d\xc6\x8a\xe7\xbe\xef\x7c\x5d\xfc\x58\x39\x17" + "\x92\xb1\x72\x4e\x13\x1a\x2b\x5d\xf6\xf8\x10\x17\x18\x83\xa6\xcd" + "\xe3\xfd\x5c\xe2\x91\xac\xd9\x07\xc6\xcd\x1d\xc6\x6d\xa5\x37\x6a" + "\xc9\x86\x71\x53\x6b\xd1\xe4\x45\x3f\x53\xe5\xf5\x3a\xd4\x0c\x63" + "\xd6\xe4\x3e\x1e\xb6\xd5\xe1\x39\x47\x2f\xd5\xc8\x5d\xca\x66\x2c" + "\x72\x45\x78\xdc\xf0\x38\xe0\xb1\xa3\x60\xdc\xe8\x71\x74\x8f\x2e" + "\xd1\xb9\x87\x79\x4f\xba\xfe\x33\xf5\x9e\x8a\xa2\xf0\xf9\x52\xee" + "\xce\x95\xf8\xb9\x40\x50\x1d\xea\xea\xfd\x06\x3e\x27\x97\x24\xbc" + "\xbd\x42\x5d\x05\xfa\xe0\x16\xa2\xb5\xd9\xcf\xbe\xee\xba\x69\xbe" + "\x4e\xba\x8a\xd0\xf1\x54\x8f\x6e\x6a\x6d\x8f\x69\x29\x2b\xae\xa3" + "\x87\xb0\x7e\xc8\xd0\x23\xcf\xa4\x05\x48\x76\x60\x9e\x52\x46\xaf" + "\x5d\x5b\x4c\xb7\x11\x08\xe3\xe2\x49\xdd\x36\x9a\xd3\x7d\x3b\x0a" + "\x55\x5c\xc9\xa4\xe3\x66\xaa\x11\xe8\xb8\xfd\xe0\xeb\x0a\x3a\xd3" + "\x8f\x72\x1f\x1f\x95\x59\x8e\xbc\xa9\x16\x18\x63\xbc\x9e\x48\xee" + "\x3a\x74\x47\xb3\xd8\x31\x76\xa1\xe7\x7f\xeb\xbd\x99\xf9\x5b\x30" + "\x4e\xf8\xf7\xe9\xf9\x5b\x31\x46\xf3\xb7\xa0\xcf\xad\xf3\xb7\xe4" + "\xdd\xaa\xf0\xfc\x2d\xfd\xcf\x9e\xbd\x0c\xe7\xfe\xde\x7c\x8a\x82" + "\x73\xef\x5e\xde\xa0\x46\xf8\xfc\xcb\x1b\x94\x68\x45\x2c\x72\x2d" + "\x6f\xae\x43\xc9\x0d\x94\xba\x3c\xe5\x2a\x0a\xba\x83\x75\x30\xc6" + "\x8b\xcb\x49\x12\xd7\x6e\xb9\xfa\x9f\x7d\x7b\x41\x1f\x8e\x95\x57" + "\x22\x64\xb4\x8e\x27\x0a\x34\xb3\x23\xc4\x21\xaa\x22\xa5\x06\x41" + "\x4c\x32\x2b\xb4\x3f\xe2\x38\x45\xc1\xfe\x91\xad\xfa\xba\x47\xd8" + "\x26\xbc\x0d\xc7\x0c\x3f\x6f\xc2\xb5\x03\x76\x18\xe9\x6f\x8c\x0b" + "\x97\xf8\x14\x54\x11\xdf\x8c\xca\xb5\x08\xf4\x55\xb7\xb1\xdf\x84" + "\x56\x09\xe1\xe8\x2c\x83\xa3\x42\x97\xf8\x2e\xb7\x6c\xc0\x51\x15" + "\x8b\xa3\xee\x1e\xf6\xe1\xc8\xed\xa4\xfd\x38\x72\xcb\xb2\x03\x47" + "\x75\x5c\x1c\x75\x4f\x12\x8f\x23\xb7\x99\xe2\x71\xe4\xe6\x6d\x1f" + "\x8e\xba\x3b\x13\x1c\xb9\xaa\x08\x8e\xba\x2b\x58\x1c\xd1\x6b\xa3" + "\xda\x09\x47\xae\x69\xc2\x38\x0a\x60\xf8\x28\x00\xf8\xe8\xd1\x1a" + "\xeb\x38\x0a\x30\xe2\x23\xf7\x59\xf6\xe1\xc8\xdd\xd9\x7e\x1c\xfd" + "\xe1\xbc\x74\x1c\x05\x98\xf0\x91\xfb\x49\xf1\x38\xfa\xc3\x2e\xf1" + "\x38\xfa\x43\x94\x7d\x38\x72\x9f\x4a\x70\xf4\x07\x5f\x82\x23\xf7" + "\x89\x2c\x8e\xe8\xf5\x66\xed\x84\xa3\xee\x67\x2d\xe0\x88\xe1\xa3" + "\x00\xe0\x23\xb7\x6f\x6d\xc0\x91\x11\x1f\xf5\xd8\x6d\x1f\x8e\x7a" + "\x4c\xb5\x1f\x47\x3d\xfa\xd8\x81\x23\x13\x3e\x7a\xcc\x59\x3c\x8e" + "\x3c\xea\xc5\xe3\xc8\xa3\xd0\x3e\x1c\xf5\xc8\x27\x38\xf2\x88\x21" + "\x38\xea\x91\xcd\xe2\x88\x5e\xc3\xd7\x4e\x38\xf2\xf0\x12\xc6\x51" + "\x20\xc3\x47\x81\xc0\x47\xc3\x36\x58\xc7\x51\xa0\x11\x1f\x79\x5e" + "\xb7\x0f\x47\x9e\xf9\xf6\xe3\xc8\x33\x5a\x3a\x8e\x02\x4d\xf8\xa8" + "\xe7\x54\xf1\x38\xf2\x1c\x22\x1e\x47\x8f\x69\xec\xc3\x91\xe7\x65" + "\x82\xa3\xc7\x8a\x08\x8e\x3c\xab\x59\x1c\xd1\xeb\x22\xdb\x09\x47" + "\x8f\xcd\xb5\x80\x23\x86\x8f\x02\x81\x8f\x66\x8c\xb1\x01\x47\x46" + "\x7c\xf4\xc7\xa1\xf6\xe1\xa8\xd7\x65\xfb\x71\xd4\xeb\xa0\x1d\x38" + "\x32\xe1\xa3\x3f\xe6\x8b\xc7\x51\xaf\x44\xf1\x38\xea\xe5\x6f\x1f" + "\x8e\xfe\x38\x90\xe0\xa8\x17\x22\x38\xfa\xa3\x0f\x8b\x23\x7a\xad" + "\x69\x3b\xe1\xa8\xe7\x3e\x21\x1c\xe1\x5a\x04\x1f\x90\xba\x10\x0d" + "\x1b\x13\xd0\xf0\x1d\xf8\xdf\x66\xe4\xd7\x98\xf1\xc7\xb3\xc7\x13" + "\x49\x3d\x00\xe8\xa7\x60\xbd\xb3\x47\xf7\x42\x5c\xdc\xc7\x4f\x09" + "\xba\x40\x6a\x34\xe0\xba\x20\xb7\x57\x44\xa1\x41\xb8\x2e\x83\xfc" + "\x71\x27\x5c\xc7\xaa\xb5\x76\x80\xbb\x40\xed\x80\x30\xe1\xda\x01" + "\xcd\x9b\x0d\xeb\x6e\xf7\xb0\xeb\x6e\xe5\x5e\xe7\x2d\xae\xbb\x95" + "\x7b\x1d\xcf\x0f\x13\x8b\x07\x2f\x7a\xfd\xd7\xed\x1e\xe3\xe1\xdc" + "\xbd\x2a\xe1\x9c\xf7\x90\x73\x7f\x9c\x7e\xaf\x82\xf5\xf5\xb8\x7b" + "\x8c\x70\xe2\x95\x38\x75\x26\x4a\xa1\x36\xfc\x54\x49\x79\x8c\x9f" + "\x42\xe5\x8c\x8f\x10\xd7\x97\xc7\x3d\xad\x8c\x77\x25\xff\x78\xf7" + "\x4e\x64\xc6\xbb\x90\x19\x6f\xfe\xba\x05\x61\xc2\x75\x0b\xf8\xc7" + "\xbb\xb7\xe5\x75\xce\xf2\xde\x83\xc5\x8f\xf7\xe3\x5a\x66\xbc\x0b" + "\x1b\x33\x7a\xfb\xb3\xe3\xdd\xfb\x98\xf8\xf1\x7e\xbc\x9e\x8c\x77" + "\xf5\x09\x18\xef\x4a\x18\x6f\x71\xf5\x5b\xe4\xbd\x53\x2d\x8f\x77" + "\x80\x00\xbe\x9f\xa8\x27\xe3\xcd\xd4\x4c\x70\x17\xa8\x99\x10\x26" + "\x5c\x33\x81\x7f\xbc\x9f\x38\x62\x79\xbc\x9f\xd8\x29\x7e\xbc\x9f" + "\x98\x4f\xc6\x3b\x00\xf0\xfd\x44\x21\x3b\xde\xde\x36\xd6\x15\x30" + "\x1e\xef\x27\x66\x92\xf1\xbe\x50\x44\x79\x04\x00\xbe\x03\x44\xe2" + "\xfb\x09\x8d\x95\xf1\x16\xc0\x77\x9f\x99\xcc\x78\x33\xf8\x16\xa8" + "\xd7\x10\x26\x5c\xaf\x81\x7f\xbc\xfb\xf4\xb3\x3c\xde\x7d\xdc\xc4" + "\x8f\xb7\x77\x35\x33\xde\x80\xef\x3e\xde\xec\x78\xf7\xc9\x13\x3f" + "\xde\xde\xa5\x64\xbc\x2f\xee\x83\xf1\x06\x7c\x07\x88\xc4\x77\x9f" + "\x28\xcb\xe3\x1d\x28\x80\xef\x27\x4b\xc9\x78\x33\xb5\x22\xdc\x05" + "\x6a\x45\x84\x09\xd7\x8a\xe0\x1f\xef\x27\xb7\x5a\x1e\xef\x27\x57" + "\x8a\x1f\xef\x27\x27\x92\xf1\x0e\x04\x7c\x3f\x99\xc9\x8e\xf7\x53" + "\x4e\xe2\xc7\xfb\xc9\x91\x64\xbc\x7f\x2e\xa0\x3c\x02\x01\xdf\x81" + "\x22\xf1\xfd\x64\x95\x95\xf1\x16\xc0\xb7\xcf\x48\x66\xbc\x19\x7c" + "\x0b\xd4\xa9\x08\x13\xae\x53\xc1\x3f\xde\x3e\x5d\x2d\x8f\xf7\x53" + "\x37\xc5\x8f\xf7\x53\xc7\x98\xf1\x06\x7c\xfb\x20\x76\xbc\x7d\x12" + "\xc5\x8f\xf7\x53\xfb\xc8\x78\xab\xb2\x61\xbc\x01\xdf\x81\x22\xf1" + "\xed\x23\xf8\xfe\x2f\x17\x18\xef\x93\xd0\x23\xb8\x0f\x86\xea\xb3" + "\x41\xa7\xe8\xb8\xe3\x5e\x11\x3f\x1c\x3d\x7b\x17\x8f\xfd\x9f\x7c" + "\xe1\xde\x11\xda\x61\xf5\x32\xe4\x7f\x72\xb3\x7b\xed\xb0\xbc\xef" + "\x05\xc1\xb5\xc3\xf2\xbe\x27\x45\xaf\x1d\x96\xf7\xcd\x64\x35\x50" + "\xdf\xb3\x6c\x4c\xff\x44\xf3\x87\xa8\x35\xc5\xf2\xbe\x29\xbc\x75" + "\x34\xe4\x7d\xfd\xf0\x9a\x62\x6a\xc3\xa5\x54\x7d\x8e\x14\x6d\xf4" + "\xa7\x21\x36\xc4\xba\x0a\xe2\x50\x29\x1c\x6b\x5f\x77\x88\x75\x55" + "\x87\xd5\xed\x90\x3f\xad\xb3\x3f\xd6\x4f\x9f\x12\x8e\xf5\xd3\x07" + "\xc5\xc7\xfa\xe9\x44\x56\x7f\x3d\xad\x64\x63\xed\x2b\x7e\xfd\xb8" + "\xfc\xe9\xf9\xbc\xf5\x3c\xe4\x4f\x7b\x91\x58\xd7\xd4\x43\xac\x25" + "\xe8\x32\x5f\x6f\xeb\xb1\x0e\x80\xeb\x3a\xc0\xc2\x75\xfd\x0c\x82" + "\x7b\x66\x68\x87\xd5\x0f\x91\xf7\xbb\x6a\x7f\xac\xfb\x1d\x16\x8e" + "\x75\xbf\x7c\xf1\xb1\xee\x17\xc5\x6a\xbf\x7e\xfb\xd8\x58\x3f\xe3" + "\x2f\x3e\xd6\xfd\x42\x79\xeb\x8a\xc8\xfb\x39\x92\x58\xd7\x4e\xd1" + "\xe7\x48\xd1\x84\xcf\x38\xd9\x10\x6b\xb8\xae\x03\x2c\x5c\xd7\xfd" + "\xeb\x21\xd6\x55\x1d\x56\xc7\x44\xde\xff\x9c\xfd\xb1\xee\xbf\x53" + "\x38\xd6\xfd\xd7\x8b\x8f\x75\xff\x10\x56\x77\xf6\xcf\x65\x63\x3d" + "\x60\x80\xf8\x58\xf7\x1f\xcb\x5b\xdf\x44\xfe\x4c\x03\x89\xf5\xe5" + "\x43\x10\x6b\x09\x7a\xb4\xbf\xa0\xfe\x67\x63\x1d\x08\xd7\x75\xa0" + "\x85\xeb\x7a\x60\x15\x68\x85\xd0\x0e\xab\xa7\x22\x1f\x78\xdc\xfe" + "\x58\x0f\x4c\x17\x8e\xf5\xc0\x38\xf1\xb1\x1e\xe8\xcf\x6a\xde\x81" + "\x6b\xd8\x58\x3f\xeb\x29\x3e\xd6\x03\xfd\x78\xeb\xac\xc8\x07\xa8" + "\x48\xac\xff\xe7\xa9\xcf\x91\xa2\x85\x07\xd6\xda\x10\x6b\xb8\xae" + "\x03\x2d\x5c\xd7\x83\xc0\xd7\x07\x56\x75\x58\x5d\x17\xf9\xa0\xfd" + "\xf6\xc7\x7a\xd0\x32\xe1\x58\x0f\x9a\x23\x3e\xd6\x83\x06\xb0\x7a" + "\x7b\x50\x0c\x1b\x6b\x3f\x85\xf8\x58\x0f\xf2\xe2\xad\xf7\x22\x7f" + "\xb6\x94\xc4\xba\x2e\x11\x62\x2d\x41\x87\x0f\x12\xac\x27\x6c\x49" + "\x87\x2f\xc9\x47\x8e\xdc\x78\x0f\x3e\xd4\xb1\x5a\x7c\x70\xbe\xfd" + "\xf1\x1e\x1c\x2d\x1c\xef\xc1\xc1\xe2\xe3\x3d\xd8\x8b\xd5\xe2\x83" + "\x23\xd8\x78\x0f\x6e\x10\x1f\xef\xc1\x4e\xfc\x5a\xdc\xef\x98\x7d" + "\x5a\x7c\xb0\x52\x8a\x16\x37\x8f\xf7\xf3\xbb\x3a\x56\x8f\x3f\x9f" + "\x6e\x7f\xbc\x9f\x9f\x2e\x1c\xef\xe7\x47\x8b\x8f\xf7\xf3\x4e\xac" + "\x1e\x7f\x7e\x0a\x1b\xef\xe7\x6b\xc5\xc7\xfb\x39\x2d\xbf\x1e\x7f" + "\x6e\x9f\x7d\x7a\xfc\xf9\x42\x29\x7a\xdc\x3c\xde\x43\xb3\x3b\x56" + "\x93\x0f\x4d\xb2\x3f\xde\x43\x03\x85\xe3\x3d\x74\xb0\xf8\x78\x0f" + "\xd1\xb2\x9a\x7c\xa8\x51\xfe\x7b\xe8\x59\xf1\xf1\x1e\x52\xcf\xaf" + "\xc9\x87\xe4\xd9\xa7\xc9\x87\x16\x48\xd1\xe4\xe6\xf1\x7e\x61\x4d" + "\xc7\xea\xf2\x17\x16\xd8\x1f\xef\x17\x46\x08\xc7\xfb\x85\x3e\xe2" + "\xe3\x3d\xac\x9e\xd5\xe5\x2f\xf8\xb1\xf1\x7e\x41\x7c\xfd\x4c\xf9" + "\xb0\x6a\x7e\x5d\x3e\x2c\xcd\x3e\x5d\xfe\x42\xa6\x14\x5d\x6e\x1e" + "\xef\x11\xb1\x1d\xab\xcd\x47\xcc\xb2\x3f\xde\x23\xfa\x09\xc7\x7b" + "\x84\x9b\xf8\x78\x0f\xaf\x66\xb5\xf9\x08\xa3\xfc\xff\x88\x43\xe2" + "\xe3\x3d\xbc\x94\x5f\x9b\x0f\x4f\xb4\x4f\x9b\x8f\x48\x91\xa2\xcd" + "\xcd\xe3\xfd\xd2\xdc\x8e\xd5\xe7\x2f\x4d\xb2\x3f\xde\x2f\xf5\x14" + "\x8e\xf7\x4b\x0e\xe2\xe3\xfd\x62\x29\xab\xcf\x5f\x72\x65\xe3\xfd" + "\xd2\x2e\xf1\xf1\x7e\xf1\x18\xbf\x3e\x7f\x71\xbe\x7d\xfa\xfc\xa5" + "\x18\xfb\xf3\xe4\x2f\xfb\x63\x6d\x2e\xb6\xfe\x63\x45\xac\x61\xcd" + "\xdd\x48\xb6\xfe\xa3\xfc\x65\xfa\xdd\x2a\xbc\xb5\x65\xe4\xa3\xd2" + "\x3b\x75\xfd\x47\xf9\x28\xcb\xf5\x1f\xe5\x23\xc5\xd5\x7f\x94\x8f" + "\x8a\x13\x3f\x1f\x7f\x94\x3f\xeb\x11\x46\x19\xf9\xff\x97\xc9\xd8" + "\x77\xe6\xba\x90\xf2\x51\xdc\xba\x90\xf2\x91\x74\x5d\x48\x6a\xc3" + "\x55\x95\x34\x2f\xf2\xf2\x44\xfb\x9f\x0b\x8c\xf6\xc2\x3e\x44\x6c" + "\x1d\x4a\x16\xdb\xaf\xf4\x64\xb1\x3d\xda\x59\x18\xdb\xfe\xd1\x9d" + "\xba\x0e\xa5\xfc\x95\xeb\x96\xb1\xfd\x4a\xa9\xa8\x9a\x23\x72\x7f" + "\xf1\x75\x6f\xe4\xfe\x5e\xac\x1f\xf2\x37\xf2\xbf\xa3\x67\x76\x20" + "\xb6\xa5\xd5\x53\x92\xfb\x23\x2e\xb6\x5f\x71\x25\xd8\xae\x1f\x22" + "\xcd\x77\x8d\x16\x7c\xff\xb9\xed\xcf\x41\x5e\xd5\x60\xcf\x25\xb6" + "\x1e\x26\x8b\xed\xd1\x77\x58\x6c\xbf\x7a\x55\x18\xdb\xaf\x8e\xeb" + "\xd4\xf5\x30\xe5\x63\x4e\x59\xc6\xf6\x98\x3d\xa2\x6a\x99\xc8\x5f" + "\x1d\x28\x1e\xdb\x63\x34\xac\xf7\x7b\x75\x24\x8b\xed\xb1\xc3\x3b" + "\x0e\xdb\x12\xeb\x64\xca\xc7\x54\x73\xb1\x3d\xba\x9e\x60\xfb\x46" + "\xaa\x34\x8f\x39\x56\x61\xff\x73\x9f\xd7\xce\x62\x7f\x29\xb6\x2e" + "\x27\x8b\xed\xb1\x67\x58\x6c\xbf\x66\x56\x17\x8a\xc5\xf6\x6b\x7d" + "\x3a\x75\x5d\x4e\xf9\xb8\xdd\x96\xb1\x3d\x6e\x8d\xb8\x1a\x29\xaf" + "\x75\x15\x8f\xed\x71\x67\x59\x9f\xfb\x9a\x27\x8b\xed\xf1\xee\x1d" + "\x88\x6d\x89\xbc\x3d\xae\x88\x8b\xed\xb1\x25\x04\xdb\xea\x6a\x69" + "\x7e\xfa\x35\x95\xfd\xcf\xb9\x02\x0b\xb1\x97\x16\x5b\x1f\x94\xc5" + "\xf6\xf8\xfd\x2c\xb6\x03\x77\x0a\x63\x3b\x40\xd7\xa9\xeb\x83\xca" + "\x03\xac\xd4\xff\x09\xb0\x50\xff\x87\x6f\xad\x70\x80\x84\xba\x17" + "\x01\x85\xac\xa7\x0f\x68\x60\xb1\x1d\xa8\xee\x38\x6c\x4b\xac\x1b" + "\x2a\x0f\xc8\xe6\x62\x7b\xfc\x2e\x82\xed\xdb\x7e\xd2\x72\x07\x81" + "\xc7\xec\x7f\xae\x37\x31\x0d\xe7\x0d\xc4\xd6\x29\x65\xb1\x3d\x61" + "\x3d\x8b\xed\x89\x49\xc2\xd8\x7e\xfd\x7c\xa7\xae\x53\x2a\x7f\x7d" + "\x96\x65\x6c\xbf\x3e\x52\x5c\x4d\x97\xd7\x25\xac\x83\x7f\x3d\x8d" + "\xcd\x5f\xbc\x6e\x34\xff\x7d\x62\x69\x07\x62\x5b\x22\x6f\xbf\x1e" + "\xc3\xc5\xf6\x84\x14\x82\xed\x3b\x6b\xa4\xe5\x49\x26\xe6\xda\x9f" + "\x27\x09\xca\xa5\x9f\x61\x8a\xac\x97\xca\x62\x7b\x52\x24\x5b\x9b" + "\x28\x68\xbd\x29\xb6\xd9\xda\x44\x93\x77\x76\x9a\x7a\xa9\xf2\xc9" + "\x7d\x2d\xe3\x78\xb2\x42\x5c\x4e\x64\xf2\x7a\xf1\x38\x9e\x1c\xc2" + "\xe6\x44\x26\x1b\xcd\x7f\x09\x32\xbc\x93\xbc\x03\x6a\x16\x05\x0d" + "\xb4\x5c\xb3\x28\xc8\xa9\xdd\xea\xa8\xca\x27\x0f\xe7\xd6\x2c\x9a" + "\x34\x53\x4f\x5f\x0b\x8d\x55\xd2\xf2\x2a\x41\xbb\xec\xcf\xab\xbc" + "\x41\x9e\xef\x8a\xac\xdb\xca\x5e\x0b\x53\x16\xb1\xd7\xc2\x1b\x39" + "\xc2\xd7\x42\xf0\xfe\x4e\x53\xb7\x55\x1e\x3c\xd8\xf2\xb5\x10\xec" + "\x2a\x2e\x87\x12\x2c\xa1\x0e\x4c\x70\x04\x9b\x43\x09\xde\xc5\x5e" + "\x0b\x6f\xd4\x76\xdc\xb5\xf0\xc6\x08\xcb\xd7\xc2\x1b\x9e\xed\x56" + "\xcf\x55\x1e\x3c\x96\x7b\x2d\x4c\x89\x22\xd7\x42\xf3\x4c\x69\x79" + "\x98\x37\x24\x3d\xff\xe6\x5e\x0b\x53\x0b\xe9\x67\xdf\x22\xeb\xc7" + "\xb2\xd7\xc2\x9f\x93\xd8\x6b\x61\xaa\x99\x9e\x67\xaf\x85\x90\x23" + "\x9d\xa6\x7e\xac\x3c\x64\x94\xe5\x6b\x21\xc4\x4b\x5c\xce\x25\x64" + "\xa7\xf8\x6b\x21\xc4\x68\xfd\x53\x88\xd1\xfa\xa7\xa9\xea\x8e\xbb" + "\x16\xa6\x8e\xb3\x7c\x2d\x4c\xf5\x69\xb7\xba\xb2\xf2\x90\x29\xdc" + "\x6b\xe1\xcf\xb1\xe4\x5a\xd0\xaa\xa4\xe5\x6d\xa6\xda\xa0\xff\xad" + "\xe5\x6d\x42\x8f\xd1\xf3\x02\x44\xd6\xb1\x65\xaf\x85\xbf\xac\x67" + "\xaf\x85\xd0\xfd\xc2\xd7\xc2\xb4\x93\x9d\xa7\x8e\xed\xb4\x40\xcb" + "\xd7\xc2\x34\x5f\x71\x39\x9a\x69\xfb\xc5\x5f\x0b\xd3\xe2\xd9\x1c" + "\xcd\xb4\x63\xec\xb5\x10\xaa\xed\xb8\x6b\x21\x34\xd8\xf2\xb5\x10" + "\xea\xd7\x7e\xf5\x6d\xa7\xcd\xe4\x5e\x0b\x7f\x49\x21\xd7\x02\x35" + "\x57\x5a\x9e\x27\xb4\xc4\xfe\x3c\xcf\x8c\x12\x7a\xce\x84\xc8\x7a" + "\xba\xec\xb5\x30\x3d\x87\xbd\x16\x66\x1c\x11\xbe\x16\xc2\xce\x74" + "\x9e\x7a\xba\x61\x53\x2d\x5f\x0b\x61\x43\xc4\xe5\x74\xc2\x8e\x88" + "\xbf\x16\xc2\xd6\xb0\x39\x9d\xb0\x12\xf6\x5a\x98\xe9\xd8\x71\xd7" + "\xc2\x8c\x59\x96\xaf\x85\x19\x23\xdb\xaf\xce\x6e\x58\x14\xf7\x5a" + "\x98\x9e\x46\x5f\x0b\x19\x0e\x75\xd2\xf2\x42\x33\xce\xda\x9f\x17" + "\x0a\x3f\x4b\xcf\x27\x11\x59\xd7\x97\xbd\x16\x66\xee\x64\xaf\x85" + "\x70\xe1\xf7\x3c\xc8\x67\x5d\xe8\x3c\x75\x7d\x67\x59\x7e\xff\x91" + "\x7c\x96\xa5\xf7\x1f\xf1\xe4\x80\x66\x9d\x14\x7f\x2d\xcc\xca\x64" + "\x73\x40\xb3\x8c\xd6\xff\xcd\x76\xef\xb8\x6b\x21\xdc\xf2\xfb\x1f" + "\xe4\xe1\x36\xbc\xff\x41\x6a\xbd\xdf\x59\xb1\xdc\x6b\x61\x66\x2e" + "\xb9\x16\x14\xf3\xa5\xe5\x91\xc2\xad\xe6\xff\xb1\xcf\x6f\x71\x37" + "\xcf\x23\x95\xd6\x0e\x47\xfd\xc3\xf0\xb5\x10\x91\xaa\xcd\x19\x1f" + "\x8a\xeb\x0b\xeb\x7c\x98\x1a\x94\x2b\x99\x1a\x2f\x0d\x5a\x52\x83" + "\x52\xad\x6b\xad\x41\x49\x6a\x7f\x20\x19\x5e\x0b\x8c\xd7\x04\x6b" + "\x5d\x49\xfd\x49\x0a\xcf\x89\xc2\x73\xa4\x6a\x4a\xe8\xfa\x2a\x89" + "\x5a\x38\xf7\x2b\x56\xea\x4f\x46\xa8\x50\x69\x44\x02\xd2\xba\x15" + "\x17\x92\x75\xc2\x11\x9e\x74\xfd\xc9\xd9\x9e\xbd\x32\x2e\x22\x77" + "\x17\x5c\x7f\x32\x82\xd2\xaf\x50\x51\xea\x72\x0d\x82\x63\x61\x7c" + "\xe7\x18\x6a\x50\x46\xac\xc4\xe7\xae\x9d\xed\xdb\x6b\xfb\x45\xa1" + "\xfa\xc2\x11\x12\xea\xc0\x46\x0c\x61\xf3\x3b\x11\xf1\x2c\x46\x23" + "\xe8\x7b\x30\xfc\xeb\x5a\x1a\x0a\x1c\x93\xf1\x90\xba\x45\x52\xed" + "\x8d\x88\x6c\x1b\x62\x86\xe7\x88\x98\xf1\x17\x1b\xb3\x37\x47\x42" + "\xcc\xaa\x70\x9d\x63\xdb\x63\xd6\xe5\x56\xfb\xc4\x6c\x4e\xa9\xed" + "\x31\x7b\x73\xa8\x49\xcc\x78\xf2\x10\x6f\x3e\x2e\x3e\x66\x73\xea" + "\xd8\x3c\xc4\x9b\x03\xd8\x98\xbd\x99\x48\x62\x36\xe7\x04\x89\x99" + "\xa3\x57\x8b\xa4\xfa\x1d\x6f\x5a\x5d\xff\x8d\x7d\x53\x8b\xbb\xb9" + "\x2f\x67\x63\xf6\x96\x5a\x9b\x03\xde\x1d\x7c\xb9\xed\x31\x7b\xb4" + "\xa6\x7d\x62\xf6\x56\x8a\xed\x31\x7b\xeb\x2a\x37\x66\x7c\x7e\xf9" + "\x2d\xf1\xef\xec\x94\xbf\x95\xc7\xfa\xe5\xb7\x54\x6c\xcc\xe6\xfa" + "\x91\x98\xbd\x15\x4f\x62\xd6\x35\xa0\x45\x52\x0d\x90\xb7\xb4\x36" + "\xc4\x0c\x3f\xd3\xb7\x70\x9d\x45\xee\x82\x98\x55\xe1\xba\xcf\xb6" + "\xc7\xcc\xed\xdb\xf6\x89\x59\xe4\x10\xdb\x63\x16\x99\x6f\x12\x33" + "\x1e\x5f\x17\xb9\x56\x7c\xcc\x22\xa7\xb0\xbe\x2e\x32\x9b\x8d\x59" + "\x64\x2d\x89\x59\xe4\x00\x12\xb3\x47\x62\x5b\x24\xd5\x11\x89\xb4" + "\x9a\xff\xc2\x3a\xb4\xc5\xdd\xdc\xe7\xb0\x31\x7b\x27\x54\x9b\x03" + "\x5e\x08\x7c\x8e\xed\x31\x1b\xb6\xa1\x7d\x62\xf6\x76\x9d\xed\x31" + "\x7b\x27\x98\x1b\x33\x3e\xff\xf1\xce\x08\xf1\x31\x7b\x47\xc1\xfa" + "\x8f\x77\x02\xd8\x98\xbd\x93\x4b\x62\xf6\xb6\x8a\xc4\xec\xd1\x82" + "\x16\x49\xb5\x48\xde\x99\x6b\x43\xcc\xf0\x33\x58\x0b\xd7\x59\xb4" + "\x13\xc4\xac\x0a\xd7\xc1\xb6\x3d\x66\x33\xc6\xb4\x4f\xcc\xa2\xf2" + "\x6c\x8f\x59\x74\x17\x93\x98\xf1\xe8\xe4\x28\x09\x75\xb0\xa3\x8a" + "\x58\x9d\x1c\xa5\x65\x63\x16\x3d\x91\xc4\x2c\x2a\x9b\xc4\xcc\xa9" + "\xb4\x45\x52\x3d\x93\x68\xc1\xfa\x5f\x96\x74\xa3\x61\x5e\x3e\x1b" + "\xb7\x79\x27\x3a\x8f\x76\x9c\x17\x62\x7b\xdc\xe6\x15\x5b\xd7\x8e" + "\xf3\x76\x8b\x8f\xdb\xbc\x18\x56\x3b\xce\x3b\xc4\xc6\xed\x5d\x05" + "\x89\xdb\xbc\x89\xf6\x69\xc7\x79\x56\xd7\xbf\xf2\x69\x47\xf3\xb8" + "\xcd\x4f\xec\x3c\xfa\x71\xbe\x93\xed\x71\x9b\x1f\x67\x5d\x3f\xce" + "\x9f\x25\x3e\x6e\xf3\x7d\x59\xfd\x38\x7f\x3e\x1b\xb7\xf9\xc7\x48" + "\xdc\xe6\x2b\xec\xd3\x8f\xf3\x05\xeb\xbf\x59\xd2\x8f\xe6\x71\x5b" + "\x38\xa4\xf3\x68\xc8\x05\x27\x6c\x8f\xdb\xc2\x81\xd6\x35\xe4\x42" + "\x0f\xf1\x71\x5b\xa0\x62\x35\xe4\x42\x1f\x36\x6e\x0b\x63\x49\xdc" + "\x16\x1c\xb3\x4f\x43\x2e\xf4\x97\xa2\x21\xcd\xe3\xf6\x5e\x7d\xe7" + "\xd1\x91\xef\x25\xda\x1e\xb7\xf7\x2e\x5b\xd7\x91\xef\x89\x7f\x67" + "\xb1\xfc\xbd\x5c\x56\x47\xbe\x57\xcd\xc6\x2d\x86\x79\x07\xcb\x7b" + "\xb1\xf6\xe9\xc8\xf7\xac\xd6\xff\xe0\xd3\x91\xe6\x71\x5b\xb4\xab" + "\xf3\x68\xc9\x45\x22\xf4\xff\xa2\x7c\xeb\x5a\x72\x91\x04\xfd\xbf" + "\x68\x0a\xab\x25\x17\x19\xe9\xff\x45\x8c\xfe\x5f\x34\xc0\x3e\x2d" + "\xb9\xc8\x16\xfd\x6f\xa6\x25\xcd\xe3\xb6\x64\x66\xe7\xd1\x93\x8b" + "\xeb\x6d\x8f\xdb\x92\xa9\xd6\xf5\xe4\x12\x09\xef\x81\x5a\xe2\xc8" + "\xea\xc9\x25\x13\xd9\xb8\x2d\xc9\x23\x71\x5b\x5c\x6b\x9f\x9e\x5c" + "\x22\x58\xff\xd1\x10\x37\x9d\xfb\xf8\x50\x8a\x27\x0f\x59\x16\x35" + "\x9c\xa9\x4d\xb8\x74\x80\xce\x63\x7c\xa8\xd8\xf7\xbb\x18\x6a\x4e" + "\x9f\x82\x1e\xd4\xc8\xe3\x4e\xda\x57\x77\x3a\x2e\xce\xfe\xba\xd3" + "\x71\xa3\xdb\xee\xfd\x2e\x71\xfd\xc4\xd7\x9d\x8e\x6d\x60\x35\x68" + "\xdc\x70\x36\xd6\x4b\xe9\xf9\x09\xe2\xea\x51\xc7\x16\xd9\x57\x8f" + "\x3a\xae\x98\xe0\x2b\x36\x9e\xd4\xa3\x8e\x3b\xd4\x31\xef\x7d\x89" + "\xf5\xc1\xf5\xa8\xa9\x0c\x67\x8d\xb4\xfa\xc8\x4b\x87\xdb\x80\xe7" + "\x2a\x8a\x27\x47\xcb\xe2\x39\x5e\x0b\x78\xae\x12\xfb\x9e\x19\x2e" + "\x9e\xe3\x73\xec\xc3\x73\xfc\x38\xfb\xf1\x1c\xef\xd6\x76\xef\x99" + "\xf9\x6b\x93\x78\x3c\xff\xf5\x04\xab\xcd\xe3\x1d\x59\x3c\x2f\x1b" + "\x29\x1e\xcf\x7f\x4d\xb5\x0f\xcf\xf1\xe9\x04\xcf\x7f\x0d\x20\x78" + "\x8e\x5f\xd3\x31\xef\x9f\x59\xda\x40\xf0\xec\xea\x2f\xad\xfe\xf4" + "\x32\x47\xeb\x78\x0e\x08\xa5\x78\xf2\xd7\x2c\x9e\x97\x97\xea\x3c" + "\x02\x42\xc5\xbe\xef\x86\x8b\xe7\xe5\x91\xf6\xe1\x79\xb9\x87\xfd" + "\x78\x4e\xb8\xd4\x76\xef\xbb\x49\x38\x25\x1e\xcf\x09\xd9\xac\x67" + "\x49\xa8\x62\xf1\x9c\xe8\x24\x1e\xcf\x09\xa1\xf6\xe1\x79\xf9\x2c" + "\x82\xe7\x04\x4f\x82\xe7\xe5\x21\x1d\xf3\x1e\x9c\x65\x27\x08\x9e" + "\xbb\xa7\x4a\xab\xef\xbd\x5c\xb0\xfe\xb1\x11\x9e\xab\x28\x9e\xdc" + "\x3e\x8b\xe7\xe4\x3c\xc0\x73\x95\xd8\xf7\xee\x70\xf1\x9c\x6c\xe7" + "\x7b\x2e\x92\xda\xe0\x3d\x17\x49\x76\xbc\xe7\xc2\xf4\xbd\x3b\x49" + "\x5b\xc5\xe3\x39\x69\x2e\xeb\xe5\x92\xf6\xb0\x78\x4e\xae\x16\x8f" + "\xe7\x24\x5f\xfb\xf0\x9c\xcc\xbc\xff\x22\xb1\x8e\xe0\x39\xd9\xa7" + "\x63\xde\xc7\x93\x98\x4d\xf0\xec\x5e\x29\xad\x7e\x7a\xf2\x1e\xeb" + "\x78\x0e\x0c\xa5\x78\x9e\x7b\xb0\x78\x5e\x39\x5f\xe7\x11\x18\x2a" + "\xf6\xfd\x3f\x5c\x3c\xaf\xec\x62\x1f\x9e\x53\x0e\xdb\x8f\xe7\x94" + "\x95\x6d\xf7\xfe\x9f\x94\x68\xf1\x78\x4e\x19\xc2\x7a\xdc\x14\xa3" + "\xe7\xff\x2b\xf7\x89\xc7\xf3\x0a\x3b\xdf\x0b\x94\xa2\x23\x78\x5e" + "\xc1\xbc\x17\x28\xa5\xa1\x63\xde\x0b\xb4\x62\x2e\xc1\xf3\x63\x9e" + "\xd2\xea\xd3\xaf\x8c\xb7\x01\xcf\x55\x14\xcf\x33\x21\x16\xcf\x6b" + "\x46\x02\x9e\xab\xc4\xbe\x87\x88\x8b\xe7\xd5\xe7\xec\xc3\xf3\xea" + "\xb5\xf6\xe3\x79\x75\x70\xdb\xbd\x87\x68\xf5\x08\xf1\x78\x5e\x6d" + "\x78\xfe\x07\xfc\xbc\xda\xe8\xf9\xdf\x1a\x09\xef\x27\x5a\x55\x62" + "\x1f\x9e\x57\x97\x11\x3c\xaf\x4a\x25\x78\x5e\x7d\xa2\x63\xde\x4f" + "\xb4\x6a\x08\xc1\x73\xcf\x08\x69\xf5\xff\xd7\x58\x9d\xff\xc1\x97" + "\xdf\x30\xe4\xa5\x58\x4c\xff\xcd\xd5\xfe\x1c\xc7\xba\xbd\xf6\x61" + "\x7a\xdd\x74\xfb\x31\xbd\xae\x6f\xdb\xe5\x38\xd6\x49\x78\xd7\xdf" + "\xda\x2a\x36\xc7\xb1\xce\x8b\xc5\xf4\xdf\xa6\x88\xc7\xf4\xda\x3c" + "\xfb\x30\xbd\x6e\x27\xc1\xf4\xda\x99\x04\xd3\xeb\x72\x3b\x26\xc7" + "\xb1\xd6\xd1\xbe\x1c\xc7\xdf\xbc\xa4\xe4\x38\xcc\x31\xbd\xbe\xd6" + "\xfe\x3c\xc7\xfa\x24\xfb\x30\xbd\x7e\xa0\xfd\x98\x4e\x6d\x6a\xbb" + "\x3c\x47\xea\x25\xf1\x98\x4e\xdd\xc7\xe6\x39\x52\xd5\x2c\xa6\x37" + "\xf8\x88\xc7\x74\x6a\x8c\x7d\x98\x5e\x1f\x47\x30\x9d\xea\x47\x30" + "\xbd\x7e\x7e\xc7\xe4\x39\xfe\x56\x6d\x5f\x9e\x63\xbd\x5a\x4a\x9e" + "\xc3\x1c\xd3\x69\x45\xf6\xe7\x3a\xd2\x82\xed\xc3\x74\x9a\x83\xfd" + "\x98\x7e\xbf\xac\xed\x72\x1d\xef\x1f\x16\x8f\xe9\xf7\x53\xd8\x5c" + "\xc7\xfb\x27\x58\x4c\xa7\x69\xc4\x63\xfa\xfd\xb1\xf6\x61\x3a\x2d" + "\x90\x60\xfa\x7d\x05\xc1\x74\x9a\x7f\xc7\xe4\x3a\x36\x14\xda\x97" + "\xeb\x48\x3b\x21\x25\xd7\x61\x8e\xe9\x8d\x69\xf6\xe7\x3b\x36\xf6" + "\xb5\x0f\xd3\x19\xe7\xec\xc7\x74\xc6\xce\xb6\xcb\x77\x64\xac\x17" + "\x8f\xe9\x0c\xa3\xf7\x5f\x64\x18\xad\xff\xdf\x58\x2a\x1e\xd3\x19" + "\x9e\xf6\x61\x7a\xe3\xe3\x04\xd3\xe9\x55\x04\xd3\x1b\xdd\x3b\x26" + "\xdf\x91\xbe\xc6\xbe\x7c\xc7\x46\xab\xf5\x2f\xf8\xf2\x1d\xe6\x98" + "\xde\x14\x61\x7f\xce\x23\xab\xc9\x3e\x4c\x67\xed\xb5\x1f\xd3\x59" + "\x71\x6d\x97\xf3\xc8\x9a\x25\x1e\xd3\x59\xbe\x6c\xce\x23\xcb\x68" + "\xfe\xd3\xa6\x02\xf1\x98\xce\xac\xb7\x0f\xd3\x59\x37\x09\xa6\x33" + "\xf7\x11\x4c\x67\xd5\x75\x4c\xce\x23\x33\xd4\xbe\x9c\xc7\xa6\xf9" + "\x52\x72\x1e\xe6\x98\xce\x19\x62\x7f\xde\x23\xbb\xcc\x3e\x4c\x67" + "\x27\xd9\x8f\xe9\xec\xc0\xb6\xcb\x7b\x64\x0f\x16\x8f\xe9\x0f\xb4" + "\x6c\xde\x23\xdb\xa8\xfe\x7d\x4e\xac\x78\x4c\x7f\xa0\xb4\x0f\xd3" + "\xd9\x27\x09\xa6\x3f\x48\x21\x98\xce\x3e\xd6\x31\x79\x8f\x0f\x06" + "\xd8\x97\xf7\xc8\xf1\x37\xc5\xf4\x92\xc8\x85\x73\xbd\xdf\x7b\xfb" + "\xed\x25\x91\xb1\xde\x4b\xe6\x47\xbf\x15\x39\xaa\xaf\xe1\xef\x51" + "\x7e\xf1\x7d\xe3\x1f\x41\x73\x17\xcc\x99\xbd\xf4\x39\x76\xe7\xfc" + "\xc8\x85\xf0\xcf\x23\x28\x6a\xce\x92\x28\xef\xd8\x65\x31\x91\xde" + "\xf8\xaf\x05\x6f\xc5\xc0\x21\xef\xc5\xb2\x5b\x26\xc5\xcd\x8f\x8d" + "\x8e\x99\x1f\xe9\x3d\x76\xd2\xe8\x81\x21\xe3\xfe\x1c\xf2\xca\x2b" + "\x8f\x20\x64\xf4\x1e\x69\x6f\x2a\x3b\x5a\x09\x78\x50\x5c\x91\xef" + "\xcc\x2a\xf7\x44\x28\x1d\x70\xb6\x71\x31\x72\x5d\xbf\x18\x29\x52" + "\x6f\x21\xc7\xf4\x5b\xc8\xc9\x7b\x1e\x1a\x4e\xb9\xa5\x14\x6e\xbc" + "\x85\xdc\xa9\x1e\xce\x55\x54\x56\x91\x9a\x72\x2b\xf6\x53\xbb\xed" + "\x54\xc1\x36\x57\x2a\x6b\xa7\x2b\xde\x07\xe3\xaa\xa0\xb2\x8a\x73" + "\x6b\xe4\x3b\x63\xd4\x6e\x1f\x29\x57\x5c\x45\x32\xaa\xdb\xe6\xf9" + "\x07\xf4\x6a\xd9\x71\x8c\x10\x38\x6f\x24\xdf\x32\x17\x3e\x53\x90" + "\x1c\x6e\x57\xf2\x5c\x57\xf8\x84\xc2\x27\x05\x3e\xa9\xf0\x69\x40" + "\xf2\xad\x23\xe1\x33\x1f\x3e\xb0\x6d\x6b\x36\x7c\x0a\xe0\xb3\x07" + "\xc9\xb7\xc1\xf6\x6d\x33\xe1\x03\xfb\xb6\xad\x21\xed\x6c\x4b\x43" + "\xf2\x0f\x9d\xe0\x13\x02\x1f\xf8\x7e\x1e\x6c\xcf\x2b\x44\xf2\x7c" + "\x38\x2e\xaf\x12\x3e\xf5\xf0\x81\x36\xf3\x3d\xe1\x83\xbf\x9f\x49" + "\xf6\x6d\x77\x84\xcf\x58\xf8\x40\x1b\xdb\xe1\x77\xb6\x1f\x82\x4f" + "\x09\x7c\xce\xc2\xa7\x1a\xc9\x77\x40\xdf\x76\xc0\x31\x3b\xbc\xe0" + "\x03\x7d\xd8\x91\x07\x1f\x25\x92\x17\x40\x3b\x05\xf0\x1b\x05\x55" + "\x08\xce\x91\xf9\x78\xc3\x27\xc4\xe8\xef\x54\x97\x95\x4f\xa8\x94" + "\xcf\x68\xe1\x1a\xdb\x72\x5c\xb7\x0a\xc9\x75\x59\x1f\x29\x63\x9e" + "\x41\x0e\xd7\xe4\x5b\xd2\x2b\xd6\x20\x44\xb9\x16\xa9\x95\x09\xcd" + "\x78\x3f\xfd\xec\xbb\x31\x63\x4b\x9a\x0a\x7d\xea\x8a\xaf\x25\x71" + "\x58\xda\x92\xc6\x7c\xbf\x54\xe5\x30\xe9\x18\xfe\x3e\xb5\x69\x9c" + "\x13\xb5\x22\xf4\x43\xbc\x66\xf6\x0a\x1e\x23\x8c\xf1\xcc\xb1\x11" + "\x94\xeb\xcb\x27\x30\x1f\x28\x13\xe8\x7e\x45\xc2\xb5\xd1\x0d\xbe" + "\x3f\x97\x82\x38\xa9\x3d\x20\xa6\xab\x90\x82\xfe\x3b\x6b\xa7\x8a" + "\x2a\x88\x8d\x22\x1c\x91\x4b\xcf\x1d\x6c\xf2\x08\xf7\xc3\xfb\x34" + "\xbb\x87\x45\x50\xbb\x02\x34\xca\x85\xcd\xa8\x56\x9e\x1b\x0c\x5c" + "\x25\xa3\xfe\x34\x2c\x42\xbf\x39\xdc\xaf\x08\x62\x8c\x8f\x39\x92" + "\x5c\x87\xff\x8d\x80\xf3\x96\x51\xd9\xe1\x1a\x9c\xaf\x51\x26\x6f" + "\x02\xfe\xdc\x12\xd9\xe4\x11\x3b\xc5\x7b\x82\x0b\x55\x83\x7f\x47" + "\x86\x6b\xa3\x6f\xd1\x90\x6b\x78\xcb\xdc\x26\x0f\x67\x15\x6e\x5b" + "\x57\x10\xe7\x0a\xfb\x14\x14\x60\x0b\xfa\xe0\x70\x03\xbe\xa7\xcb" + "\x71\xae\x52\x4e\xa0\x7f\xf3\x3a\xf4\x53\xb6\x22\x10\xda\xfe\x28" + "\xce\xf5\xd3\x04\x8d\x8c\xc2\x7d\x77\x77\xae\x02\x2c\x3b\xe9\x32" + "\x72\x52\xb6\x76\x47\x8a\xfc\x4d\x08\xed\xe8\x8e\x1c\x1b\x33\x72" + "\x6b\x55\x8a\xa7\x8f\x11\x8e\xda\x32\x57\x06\xc7\xa8\xe4\xb9\x4a" + "\x0a\xe2\x41\xff\x56\xf6\xf4\x14\xe1\xdf\xda\x3a\xb4\xf5\xb7\x36" + "\x4f\x4f\xc1\xbf\x45\x8f\x0f\x19\x2b\xf2\x7f\x43\x3b\xbb\x5e\xb0" + "\xd0\xe7\xad\x83\x71\x1b\x2a\xf9\x56\x1f\xea\xe3\x17\x5c\x75\x9b" + "\x23\x32\xf1\x3e\x7c\x3c\x19\xff\x9d\x2a\x97\x95\xa8\x81\x82\x6d" + "\x3a\x26\x06\x3a\x1c\x03\x59\x0a\x70\x4d\xae\x02\xff\x1e\x7c\x37" + "\x46\xb7\xca\x1b\x79\x4f\x40\xa8\x5e\xbe\xad\x0f\xb5\xa9\xb8\x88" + "\x72\x1d\x57\x4d\x62\xbc\xf5\x54\x7c\x09\xa5\x87\x8f\x6e\x50\x09" + "\x72\x50\x4e\xc0\xf1\xdd\x5a\xe7\xfd\xda\xc3\x30\xce\x5b\xaf\xb6" + "\x8e\x6f\x9f\x38\x7c\xbd\xbb\xc2\xb8\x38\xe9\xd6\xbd\x76\x8c\x92" + "\x79\x23\x7c\x1e\xc6\xe3\x85\xcf\xa7\x31\x63\x9b\xa7\xc9\x98\xb9" + "\x06\x06\xae\xa0\x06\x05\xe0\xb6\x1b\x70\xdb\x97\xd4\x70\x6f\x85" + "\x3e\x0d\xc1\xdf\x87\xe3\x03\x54\x0e\xaf\x35\xe0\xe3\xbd\x9f\xa4" + "\x31\x17\xa9\x63\xc6\x07\xe3\x1e\xc7\x99\xf2\x88\x56\xe2\xbf\xa7" + "\xf6\x43\xae\x2e\x25\x48\xe6\x9d\xec\x53\x44\xf0\x10\xae\x31\xb4" + "\x43\x9f\xe3\xe6\xd7\x31\x6e\x7c\x59\xfc\x6d\x3b\xa1\xcb\x1a\x77" + "\xb6\xc9\x63\x76\xa1\x26\x27\x34\x85\xca\x1c\x77\x16\xaf\x15\xaf" + "\x91\x6f\xa3\xe7\x40\x51\xab\x1c\x11\x89\xc3\xb8\xaa\xe4\xf9\x94" + "\x3a\xf9\x26\xfc\x56\x8f\xd9\x85\x47\x96\xaa\x21\x66\xa1\x29\x18" + "\x13\x45\x77\x35\x32\x5c\xbf\x8f\xea\x96\xf3\xd1\x76\x72\xae\x8e" + "\x70\xae\x08\xb7\xdb\x98\xf1\xa1\x82\x3d\xd7\x6d\x7b\x30\x3e\xe0" + "\x37\xea\xc9\x6f\x43\xbb\xab\xe0\x37\xb2\xc6\xd5\xc3\x71\x03\x54" + "\x0e\xb7\x43\xe9\xeb\x6b\x29\x75\x76\x63\x33\x42\xb7\x97\x52\xda" + "\x20\xed\xcf\x7a\xb8\x87\x22\xd8\x3f\x51\x85\x66\xba\x1a\xc6\x8c" + "\x5c\x73\xad\xed\x44\xe2\xbf\xd5\x6e\x74\x3b\xb1\x7c\xed\xa8\xe4" + "\x1f\x8e\x9c\xad\xf5\x76\x68\xbe\x4b\x55\x6e\xfc\x0b\xf4\x6d\x15" + "\xa2\x9a\x97\x52\xa5\x49\x01\x94\x26\xe3\x5b\x04\x3a\xa6\x1a\x01" + "\x97\x7a\x75\x73\xa0\xd4\x41\xcb\x90\x4b\xb7\x18\x17\xea\x54\x49" + "\x35\x5a\x1e\x40\xd5\x55\xc4\xeb\x50\x79\x43\x2d\x4a\x3c\x8f\x9c" + "\x56\x94\x21\xf7\xc4\x00\x4a\x5d\x1a\x51\x8d\xc8\xf6\x32\xb4\xe2" + "\x12\x52\x2c\x3f\x41\x69\x26\xc3\x3d\xf5\x9b\x6a\xbc\xbd\x16\xb6" + "\xeb\xd0\x8a\x3a\x4a\x9b\x3c\x0b\x39\xe1\xff\x97\x9d\xc0\xdb\x2f" + "\x23\xb8\x9e\x15\x41\xf1\x6a\x97\xed\xf0\x9b\xf8\xfb\x3b\xa0\x2f" + "\xfa\xbb\xd4\xb1\x8d\x77\x11\x5a\x3e\x1d\x79\x26\xce\x41\xae\x41" + "\x70\x6b\xaf\xd0\x1e\x46\x41\x3a\x0a\xee\xd9\x27\x51\x52\x34\x72" + "\x0c\xd2\xe2\xb5\xde\xe7\xe0\x93\x8f\x76\xc0\xb1\x70\x6e\x4a\x7c" + "\x6e\xcb\x2f\x80\x86\xb9\x6e\xf8\x4e\x31\xf3\x9d\x0b\x08\x8f\x59" + "\x93\x5b\xb1\xb7\x26\xab\xb8\x00\xce\xdd\x1f\x8f\x01\xfc\x4e\xa5" + "\x1e\x7f\xef\x2e\x7d\xff\xc1\x63\xe0\x30\x5b\x0b\x58\xcd\x99\x16" + "\x33\x3b\x5e\x49\xb7\xab\x92\xe7\x25\xee\x58\x4c\xf7\x89\x73\x6c" + "\x90\x96\xba\xad\xf6\x98\x16\x03\xfb\x77\x05\xc5\xbf\x42\x31\x71" + "\xab\x6b\xcc\xc8\xab\x35\x8c\xb7\x21\x2e\x70\x4c\x15\xc4\xa2\x4e" + "\x1e\x83\x14\x8d\x19\xf9\x0a\x95\xc3\xdd\x21\x46\xd8\xc5\xf8\x7b" + "\xc8\x70\x2c\x73\x8c\xaf\xca\xa1\x21\xd1\xe8\x18\x0d\x60\xba\xf5" + "\x18\xd8\x0f\xf8\xbf\xb3\x86\xdd\x4f\xe3\xb9\x75\x3f\x73\x7f\x35" + "\xb4\x2d\x07\x1e\xce\xd5\x79\xcc\x46\x94\x47\xb7\x18\xea\xb6\xa7" + "\x13\x25\x83\xd8\x68\x29\x8d\x3e\x67\x02\xbe\xbf\x3a\x55\x68\x1b" + "\x10\x39\x3e\xff\x3a\x95\xd3\x2d\x9e\xcc\x4f\xcd\x3f\x87\xdb\x04" + "\xdd\xe4\x07\xf7\x63\xd7\xa0\x12\x0a\xf7\x41\xa1\xcb\xe9\xa1\xce" + "\x58\x0c\xf7\xe4\x9c\x70\xb5\xde\x23\xcc\x55\xb3\x33\x36\x02\xdf" + "\x13\xf0\xf5\x46\x65\xc3\x77\x99\x76\xe0\x77\xbb\xa8\xe4\xf9\xfb" + "\x74\xf0\x7d\x2a\x7b\x42\x21\xd9\x4e\xf8\x8d\xf0\x50\xfe\x3e\xaa" + "\x2f\xec\xcb\x7c\x39\x0f\xf6\x75\xa9\x91\x6f\x1f\x0e\xdb\x11\xfc" + "\x7d\x56\x99\x7c\x0b\x8e\xdd\x3e\x8a\x60\xfa\xe5\x5c\xce\xdf\x32" + "\x3c\x9e\x5b\x53\x31\x47\x61\x6e\x82\xed\xb3\x58\x0e\x22\xf7\x00" + "\xc2\xed\x13\x80\x57\xb6\xc7\xa8\x1c\x82\xfd\xf1\x38\xe1\xd8\x36" + "\x10\x5e\x8b\xd5\xed\x8c\x8d\xfa\x2a\x00\xa1\xaf\x4e\xe0\xeb\x68" + "\x7b\xb6\xca\xe1\xcf\x21\xec\x58\x6e\xdf\x8f\x8f\xa5\xfb\x09\x5c" + "\x82\xff\x4f\xf3\x0a\x7c\x07\xae\xf3\x02\x7c\xcf\x22\xfc\xb8\x7d" + "\x0f\xbe\x6f\x01\x4f\x38\x32\xf7\xa9\x3a\x68\x3b\x97\xea\xbe\x0c" + "\xf7\x2b\xa5\x86\xe9\x8b\x71\xdf\x0c\xbc\x48\x65\x25\x84\x92\x63" + "\xc7\xa9\x1b\x33\x76\xb8\xab\x1c\x42\x06\x18\xe3\x85\x9c\xd7\x8e" + "\x24\xc0\x74\xd5\xa0\x13\xf0\x37\x68\x25\x43\x7b\xc0\x2f\x8e\xc0" + "\x2b\x9f\x63\xbc\x61\x4e\xc9\xdd\x84\xf5\x4f\x42\x84\x26\x2b\x21" + "\x0a\xda\x8a\x30\x70\x0b\xfe\x2e\xbe\x1e\x80\x5f\x1c\x69\xde\xd0" + "\x69\xe5\xf4\x35\xaf\x43\x03\x5a\xb9\x04\xb6\x35\xb9\x25\x44\x30" + "\xdb\x15\x74\x9f\x64\x72\x3d\xfc\xbe\x83\xe1\xf7\x9a\xdc\xc6\xa9" + "\xa0\xdd\x22\x95\xc3\xe8\x44\x0e\xd7\x6c\x7a\xc9\x8f\xa2\x42\x31" + "\x6e\xe4\xd0\xd7\x0b\xf0\xef\xc3\x0c\x4e\x1f\xfd\xaa\x04\xa1\xb1" + "\xe3\xe0\x37\x20\x9e\x5b\x7b\x50\xf8\x1c\x35\x2a\xb4\xde\x1d\x7f" + "\x7f\x3d\xfc\x8d\xb7\xe3\x63\x1a\x33\x0a\x5c\x55\x68\x83\x82\xb4" + "\x9b\xab\xc0\xf1\xe1\xb6\x5b\x30\x8a\xb4\x5b\x30\x1a\xb7\xc7\xdc" + "\xe3\x1f\xc5\xff\xc7\xdf\xc7\x6d\xe7\x6f\xa6\xea\x71\x7b\xd0\xd6" + "\x4c\xc3\x6f\xa4\xc3\x36\xc3\xef\x8c\x5d\xd0\xfa\x5b\x89\xb0\x3f" + "\xcd\xf8\x1c\x72\x37\x53\x0d\xa4\x7f\x05\xb9\x2a\xb4\x9d\xc6\x49" + "\x2a\x6c\xc3\xdf\x25\x58\x28\x38\x8c\x71\xa2\x22\xe7\x25\x27\x78" + "\x29\x38\xa1\x42\x79\x25\xc6\xf7\x1e\x88\x85\xb3\xe1\xde\xcc\xb4" + "\x57\x67\x68\x8f\x6d\x8b\xb4\x41\x65\x2e\x0f\x65\xae\x05\x7c\xcd" + "\x3a\xe1\xf6\x1b\x33\x76\x7a\xaa\x50\x9a\x17\xe9\xdb\xd6\xd4\x06" + "\x82\x6d\x1c\x03\xfc\x1d\x12\xf3\x8c\x9c\x12\x7c\xdf\xdc\xb1\x09" + "\xf3\xd8\xb8\x6a\xf8\xce\x44\x93\x7b\xa6\x23\x6c\x2f\x65\xda\x8b" + "\x82\x78\x8d\xe4\xc4\x6b\x15\x8d\x23\x5a\xff\xe1\x7e\xb2\xdc\x84" + "\xef\x81\xb3\xbd\xe1\x37\x14\xa0\x65\x7e\xc4\xf7\xe5\x0f\x7a\x50" + "\xc0\x63\x3b\xf7\x19\xda\x87\xb6\x15\x30\x96\x2f\xc3\x36\xa5\x0a" + "\xed\xab\xc5\xdb\x32\xe0\x18\x95\x7c\xb3\xe0\xbb\x78\x93\xfb\x20" + "\x59\x45\x9e\x0a\x7b\x4e\x7c\xcd\x8e\xac\xf0\x6a\x40\x15\x79\x7a" + "\xa4\xff\xf8\x85\x4c\xff\x64\x4a\x79\x45\xfe\xd1\xa8\x72\x4d\x1d" + "\x12\xa7\x3d\x3f\x22\xb5\x76\x9a\xc1\x1b\x25\xfe\xbf\xf6\xbe\x06" + "\x20\xaa\x2a\xed\xff\xcc\xe5\x52\xe4\x2a\x33\x22\xd2\xa8\xa8\x23" + "\x82\x8d\xbe\x7e\xa0\xa9\x59\xaf\x15\x5b\xba\xc0\x6e\x2a\xfb\xfe" + "\xad\x9d\x5c\xb7\xb0\xcc\xa0\xfc\x20\x44\x25\xbf\x40\xb2\xfd\x5b" + "\x19\x8c\x84\xbc\x96\x7c\xb5\x51\x4b\xbb\x9a\xd4\xd2\x46\xef\x6a" + "\x4d\x89\x6f\x64\xe8\x50\xaf\xee\xe2\x2e\x6e\xe4\x6b\x46\x84\x3a" + "\xc9\x28\x03\xf3\x71\xfe\xcf\x73\xce\xbd\xcc\x9d\x61\x46\xf9\x92" + "\xed\x6f\x5e\xbd\xdc\x7b\xcf\x7d\xee\x73\x9e\x73\xce\xef\xfc\xce" + "\x39\xcf\xbd\x73\xce\x34\x82\x7d\x91\x73\x01\xaf\xad\x30\x5b\x2e" + "\x30\xfe\x82\xf3\x07\xf1\xfe\x4b\x30\x96\xc2\xf1\x14\x8c\x99\x93" + "\x8c\x02\x1f\x53\xb9\x40\xb6\x08\xc3\x71\xbc\x05\xed\x52\xb1\xe2" + "\x1e\x7d\x63\xa6\x86\xe7\xcd\x6b\x51\x8c\xc7\xd1\x5e\x47\xac\x09" + "\x6d\x76\x95\xce\xd4\x60\x1a\x32\xd2\xa9\xcb\xec\x68\x35\x61\xdb" + "\xa5\x5b\x8b\x63\xc1\xd7\x54\x0b\x0a\x09\x75\xbd\x3e\x53\xd3\xcd" + "\x34\x30\xff\x22\x8c\x97\xcf\x59\xa2\x66\x6a\x32\x9c\x44\xc8\xd9" + "\x1c\x18\x74\x6f\x01\x35\xb5\x8c\xbb\xcd\xd8\x9a\xfd\x5a\xe4\x47" + "\xe9\x84\x74\xbf\x5f\xfe\x5a\xa4\x9c\xf6\x22\x29\xed\x10\x17\x9b" + "\xb3\x68\x0a\x0c\x75\x8a\xd9\xf5\x6b\x8b\xfd\x95\x17\xcd\x52\xd3" + "\x83\x05\x0e\xb2\xba\x80\xb6\xaf\x2e\x24\x02\xf4\x8b\x2c\xfb\x8a" + "\xea\x90\xab\x63\xe4\xfc\x64\x79\xe7\xb0\x90\x94\xcd\x44\xd3\x14" + "\x50\x1a\xb8\x60\x63\x26\x5b\x5b\xe9\x43\x90\xeb\xa6\xad\xec\xf7" + "\x8f\x47\x61\xfc\xbd\xc0\x91\x41\x79\x7b\x53\x3a\x69\xbe\xa4\x0f" + "\xef\xc9\xe5\x57\x24\x8d\x8b\xbb\x1f\x47\xa9\xdf\xf5\xdf\x2f\x93" + "\x56\x8d\x9f\xb4\x7e\xdf\xf3\xb4\x96\xee\xef\x9c\xd6\xd7\x87\xf5" + "\x6d\x5a\x5f\xd7\xf5\x20\xad\x3a\xdf\x69\x7d\xfd\x64\xcf\xd3\xfa" + "\x7a\x59\xe7\xb4\xbe\x11\xd8\xb7\x69\x7d\xc3\x2f\xe7\x5c\x26\xad" + "\xd1\xbe\xd3\xfa\xc6\xa7\x3d\x4f\xeb\x1b\x79\x3e\xd2\xfa\x7d\x1f" + "\xa7\xd5\xef\xef\xdf\xa8\xa0\xa6\xc8\x4f\xc0\x4b\xed\x9b\xdb\xa0" + "\x9f\x96\xbf\xa4\x64\xd3\xab\x44\xa8\xb1\xda\xc8\xd1\xf0\x3a\x92" + "\xf1\x34\x11\x26\xa7\x00\xef\x65\x91\xd9\x34\x7f\x90\xe5\x68\x41" + "\x33\x84\x9f\x21\x47\xd2\x6d\x24\x26\x15\xf9\xf7\xf7\x07\xcc\x4b" + "\xbb\xcb\xbf\xbf\xdf\xd6\xc1\xbf\x8e\x69\x12\xe7\x96\x7d\x7b\xb4" + "\xb9\x9d\x60\xfa\xe1\xfc\x78\x07\xff\x66\xf1\xfc\xf6\xe6\x5f\xcc" + "\x0f\xb3\xcd\xe6\xc1\xbf\xfc\xf7\x55\x65\xaf\x7a\x73\x6f\x76\x13" + "\x21\xbe\xb9\xb7\x6c\x13\x72\x6f\x11\xdc\xef\x9e\xfd\x65\x71\x32" + "\xf7\x1a\x21\x4e\x25\xf7\x1e\x5c\x8a\xed\x66\x59\x49\xcf\xb8\xb7" + "\xac\x44\x4e\x77\xa1\x94\x6e\x08\x13\x3d\xb9\xb7\xcc\xef\xb7\xce" + "\x4a\xdc\xd2\xfc\x58\xcd\xbe\x51\xb6\x40\x57\xe9\xac\x04\x6c\xdf" + "\x5a\x21\x4f\xde\x2b\xb2\x89\x67\x02\xde\x34\x30\x3f\x68\xeb\x52" + "\x15\x2d\x9d\x69\x5b\x90\x46\xbf\xa4\x51\xb3\x12\xd0\xc7\x89\xe3" + "\x7f\xb8\xff\x22\xf4\xd5\x6d\xdd\xb3\x9b\xeb\xa4\x6f\xcc\x30\x6e" + "\x86\xfa\xb2\x6f\xad\x4d\x70\x6d\x30\xa8\xa1\x1c\x34\x74\xe7\x2f" + "\x12\xe8\x6f\x1f\x28\x6d\xd9\x99\x98\x78\x48\xff\x35\x41\x59\xba" + "\x45\x8c\xe9\xb9\xfd\x7f\xd0\x5e\xde\xfe\x3f\xcc\xeb\xbe\xfd\x5c" + "\x67\xd7\xec\xff\x83\xb6\x4b\xf6\x87\x81\xfd\xed\xb3\x02\x61\x1c" + "\x28\x7c\xd8\x3e\x4b\xec\xa6\x3d\x7e\xbf\xff\xed\xbb\x38\xfe\xd8" + "\x65\xfe\xa3\x61\x06\xb2\xaf\xc8\x22\x00\x07\xb0\x36\x1c\xeb\x1e" + "\xe7\xbf\x46\xe0\xac\x2f\x29\xe7\x24\x4b\x37\x39\xe9\x8f\xdb\xbb" + "\x1e\xff\x7d\x29\x7d\x1f\xff\x1e\xff\xe9\xf7\xe6\xc4\xb7\xe2\x53" + "\xfc\x73\xe2\x2f\x52\x3a\x73\xe2\x9e\xcf\xbb\xcf\x89\x7b\x0a\x3a" + "\x73\xe2\x5e\xa7\x9b\x13\xf7\x7e\xdb\x73\x4e\xdc\xfb\x6e\xd7\x39" + "\x71\xef\x8e\x9e\x71\xe2\xde\xc5\x97\xe7\xc4\xbd\x15\x3d\xe3\xc4" + "\xbd\x15\x9d\x39\x71\xaf\xd6\x93\x13\xf7\x36\xfb\x2d\x4b\xe3\x04" + "\x1b\xb4\xd1\x03\x9b\x02\xde\xda\xef\xc8\x22\xc4\x65\x7c\xa3\x6e" + "\x81\x93\xb6\xd2\x1d\x13\x6c\x2e\x61\x3a\xf2\x4a\x4c\x6b\x6b\x52" + "\x90\x6b\x9d\x7e\x20\x0d\xb9\xeb\x1e\x6a\xd7\x12\xc8\xa7\x48\xb0" + "\x5f\x4d\x5b\xf5\xc1\x74\x9d\x3e\xa4\xe0\x12\x09\x85\x5d\x5b\x20" + "\xb5\xc7\x70\x1e\x4d\xd7\x69\x07\x64\xaf\x25\x13\xd5\x56\x12\x04" + "\x36\x18\xd4\x5b\x34\x04\x38\x28\x14\xcf\x69\xd6\xa9\xf4\xe2\x4b" + "\x44\x54\xa7\x43\xd9\x0c\x86\xf8\xd2\xd5\x94\xae\xd6\x93\xe2\x54" + "\x12\xe4\x12\x88\xb6\x48\xa0\xe5\x8e\x56\xbd\xe0\x0c\x7d\x58\xc3" + "\xcb\x67\x5f\x0a\x0d\x7b\x58\x47\xf3\x1e\xaa\x77\x85\x3d\x54\xe5" + "\xcc\x48\x0a\xa0\x1b\x0c\x01\x68\xab\x33\xef\x21\x13\xcd\x87\x3d" + "\x23\x29\x18\xfb\xd0\xc5\x6b\x21\xee\x56\xed\x80\x1c\x88\xbb\x68" + "\x2d\x89\x2c\xbc\x44\xf4\xb4\x45\x2f\x40\xf9\x1b\x70\x8d\x52\xc8" + "\x23\x83\x4b\x38\x95\x0e\xf7\x44\xe4\x44\x8a\xf1\x3b\x20\x7e\xbb" + "\x1e\x7d\x57\x80\x6d\xa2\x2d\x86\xf8\x9d\xeb\xf4\xdd\xac\x2f\xfb" + "\xd8\xef\xeb\x64\xbb\x5c\x13\x7f\x99\x42\xdf\x82\x1d\xed\x82\x3c" + "\x2c\xc6\x3c\x99\xfc\xcb\x34\xb4\xed\xc5\x4b\x64\x22\xd8\x19\x09" + "\x36\xe8\x21\x5e\x9c\xdf\xc5\xf0\xd0\x53\x1a\xc4\xa8\x87\x6d\xce" + "\x1d\x92\x6d\xe7\xc1\xb6\x73\x6e\xdb\x30\x2e\xcc\x1f\x7f\xef\x4e" + "\x17\x6c\x1a\x85\x75\xf3\x1b\x75\xfa\x8d\x71\xf8\x1e\xb5\x65\x43" + "\x52\x37\xb1\x5a\xee\xf7\xf7\x6f\x39\x6f\x91\x70\xaa\x29\xa9\x9b" + "\xff\xec\x97\x14\x7d\x83\xcf\xbe\x45\x26\x9a\xa1\x5e\x1f\xb5\x9d" + "\x25\x74\x70\x49\xdd\x21\x7d\x73\x77\xe3\x4a\xf3\x17\xd7\xf3\x59" + "\xb4\xd6\x1e\x89\x7e\xad\x44\x43\x8e\x40\xd3\xdb\x23\x6f\x23\x87" + "\x8f\xb5\x93\x87\xd3\xf1\x5d\x2d\x4d\xd7\x2d\x22\x41\xa7\x02\xde" + "\xd3\x67\x9c\xc0\x77\x51\xe5\x36\xcf\x77\x51\x6f\x87\x93\x80\x77" + "\x4c\x24\xe0\x4f\x16\x12\xf0\x6e\x3a\x01\x39\xcf\xfd\xcf\xe5\x0b" + "\xde\x1c\x45\x36\x3b\xe8\x37\x34\x4f\xad\xcf\x16\xa8\x6d\xc1\x78" + "\x55\x83\x69\x2d\xbe\xbb\x79\xe7\x7d\xc8\xbf\xef\xa0\x5d\x55\xe3" + "\x39\xea\x4b\x49\x25\x43\x9a\x02\xde\xa9\x54\x5b\x6f\x8c\x73\x84" + "\x26\x66\x3a\xa8\x81\xd8\x75\x69\x89\x6d\x79\x0f\x59\xec\xe8\x77" + "\x7b\x04\x39\xe8\xed\xb7\xd5\xaa\x4c\x42\xa1\xfc\x29\xd5\xe2\xbb" + "\x46\x43\x01\xec\x58\x96\xac\x1c\x43\xee\xb5\x61\x79\x63\x5d\x28" + "\xe6\xe1\x1a\xac\x0f\x39\x52\xbd\xb1\x04\x4c\x48\x74\x0a\x84\x38" + "\xe1\xf9\x8c\xaf\x49\x38\xae\x4d\x5b\x08\x72\x0f\x3b\x83\xb0\x1e" + "\x1b\x4c\x8b\xbe\x20\x67\x52\x88\x90\xf1\x3d\x19\x04\x98\x60\xf5" + "\xd1\x05\xf5\x71\x41\xbd\xda\x06\xbc\xe2\xda\x7c\x91\xa8\x91\xa7" + "\x70\x9d\x17\x73\x73\x03\x71\x9d\xd7\x07\xef\x5e\x49\x42\x1d\xe7" + "\x93\x42\x2c\xe7\x93\x86\xbc\xec\x22\xa1\xc1\x29\x44\x53\xb8\x12" + "\xb0\xb8\x0a\xea\xe7\x39\xa8\x9f\xcd\xbc\x7e\xca\xf8\xa3\xcf\xd7" + "\x99\xf0\xf7\xf7\xac\x6e\xee\x90\xea\xe6\x3a\xc0\xdf\x5a\x37\xfe" + "\x1c\xab\xf4\x42\xa1\x40\x09\xd8\x08\xf9\xbe\xaf\xb1\x78\xf3\x8d" + "\x41\xe8\x7b\xa4\xe3\x66\x59\x80\xf3\x21\xad\xd4\xb1\x0f\xca\x22" + "\x70\xbc\xa0\xa3\x3b\x13\x33\x0f\x27\x34\x12\xb7\x5f\xe4\xbd\xf1" + "\xed\x51\xb7\x11\xdd\x7f\xd0\xf3\xa7\x02\xde\x29\x87\xf0\x20\xdd" + "\x03\xb7\x68\xa0\x1c\xc7\x73\x3f\xc9\x7b\x7a\xf4\x85\x36\x04\xbc" + "\xb3\x15\x74\x11\x7c\x7f\xff\x19\x7b\xdf\xf6\xa7\x46\x90\x25\x4e" + "\xc8\x73\x47\x68\x70\xba\x2b\xf4\x61\x9d\xe9\x89\x76\xc6\x57\x76" + "\x28\x83\x33\xcb\x89\xf0\x70\x33\xe4\x8d\x13\xf2\xa6\x55\x3f\x10" + "\x78\x2b\x01\x79\x8b\x1a\xef\x9a\xbd\xb1\x81\xba\x16\x2c\x0d\xa0" + "\x90\x2f\x41\xe8\xfb\x7e\x28\x85\xd0\x4d\x67\x21\x8f\xac\x75\x04" + "\xd2\x16\x0c\xdc\x16\x52\xb8\x96\x84\xee\x86\xfc\x19\xd4\x0c\x7d" + "\x9a\xdc\xdf\xd5\xbe\xb5\xb9\x3a\xd0\x09\x38\x47\x1e\x53\x6f\x51" + "\xdd\x04\x65\x15\xbc\x1d\xeb\x2d\xd4\x63\xf5\x16\xc6\xab\xac\x6c" + "\x1d\xeb\xf4\x11\xf6\x75\x7a\x1d\xec\xa3\x64\xae\x93\x79\x86\x66" + "\x97\x27\x20\xcf\x99\xd3\x1b\x88\x03\xf2\x32\x18\xdb\xc4\x75\xfa" + "\x70\x96\xa7\x8f\x43\x9e\x2e\x23\x41\x53\x6c\x44\x05\x76\x69\xc0" + "\x66\x72\x24\xe9\x14\x72\xab\xd6\x09\xf5\x08\xf3\x19\x74\x0a\x14" + "\xb0\xe6\xca\x0b\x4e\x9f\x97\xac\x23\x87\xf4\xc7\x09\xce\xf1\x9a" + "\xd1\x46\xbf\xc2\xf7\x7d\xe6\x74\x07\xa1\x43\x13\x33\x29\xf3\x9d" + "\xbe\xb3\xed\x70\x82\x8d\xf8\xc7\xf4\xbb\x4f\xb9\x31\xfd\xee\x53" + "\x6e\x4c\xbf\xcb\xe6\x60\x52\xe2\xba\xad\x04\x70\x1d\xaa\xc4\x75" + "\xc5\x73\x57\x15\xd7\xf3\xbb\x8f\xeb\x97\xcf\x29\x70\xbd\xf9\x5f" + "\x83\xeb\xcf\x0c\x0c\xd7\x01\xf6\x28\x86\xd7\xed\x66\xc7\x3b\xd0" + "\xff\x7d\x77\xb1\x8c\xdb\x4f\xff\x80\xb8\xfd\x73\xc9\x0f\x15\xb7" + "\x6d\xad\x7a\x1d\xec\x7d\x8e\x5b\xd0\xd9\x65\xdc\x7e\x66\x68\x27" + "\x72\xfe\x21\x7e\xa9\xb1\xa4\x4e\x97\x41\xee\x06\x9e\xd0\xab\xb7" + "\x8c\x22\x47\x58\x1e\xbe\xa7\xd7\x3d\x40\x5d\xa7\x02\xfe\x7c\x02" + "\xf1\xd4\x9e\x45\xa9\x2b\x74\x91\x26\xe3\x73\xa2\x71\xe5\x85\x59" + "\xcc\x8e\xbd\x44\x9d\x42\x44\x7c\xcf\x4a\x07\x1f\xd8\x05\xe3\x70" + "\xf6\x0e\xd6\xb5\xe3\x55\x0d\xbe\xa7\xc4\x77\x23\xce\x9d\xc9\x26" + "\xd7\x8e\xcc\x72\xd7\xe0\x4a\x0b\xdd\x71\x20\x1a\xdf\xcd\xb6\x66" + "\xbf\xa7\x97\xdf\xcd\xfb\xec\x1b\x85\x26\x9b\xa0\xbe\xc0\x98\xaa" + "\xf2\x55\x38\x0a\x60\xc7\x47\x70\x0c\x80\xe3\x0e\x36\xc6\xea\x56" + "\x3b\xf7\x1e\x5f\x27\x37\x2f\x31\x4f\xe2\x41\xf6\x5b\xe2\x94\x09" + "\x64\x50\x93\x74\x0e\xf6\x54\xca\xef\xfa\x3b\xe4\xdd\xf9\xb1\x10" + "\xe3\x86\x3c\x11\xf9\xf7\x07\xfc\x1a\xbf\xc3\x91\xf4\xb1\x6b\x57" + "\x64\x9c\xcd\xb4\xf9\x14\x69\x0e\xa8\x8c\x34\x43\xdb\xef\xca\x4f" + "\xcc\xc3\x77\x69\x88\x7b\x39\xde\x60\x28\x6f\xd3\x7a\x26\xc3\xe6" + "\xe3\x73\xe5\xfd\x2a\x93\xe6\x07\x5b\x70\x0c\xd9\x4a\x93\xee\x92" + "\x8e\x77\x22\xb6\xb9\xbf\xa5\xf2\x29\x0a\xf9\x87\x6b\xb3\x77\x7c" + "\x9b\x84\x6b\xa6\x67\x8a\xba\x8f\x36\xf2\xf6\x56\xb6\x17\xd7\x55" + "\xc7\x6f\x7f\x6e\xc9\x24\x99\xad\x3e\xd6\x55\x77\x7f\x23\x54\xb9" + "\xd8\xb5\xf3\x57\x99\xad\xd9\x95\x7b\xa0\x0f\x50\xa1\x4c\xb3\xaf" + "\xb2\x00\x79\xbf\x73\xfa\x77\xaf\x1c\x2a\x4f\xfb\xd3\x33\x57\xef" + "\xa4\xdd\xd3\xf5\x7e\xb4\xdf\x7e\x75\xe4\x0c\xe3\x82\x32\xa7\xc9" + "\x65\x37\xa8\x0f\x6d\x3c\xdb\xcd\x3e\xd1\xfb\x7e\xe7\x3f\x73\xe6" + "\x2d\xd2\x3b\xc6\x81\xee\xf1\xa3\x88\x73\x95\x21\x16\xdf\x6d\x60" + "\x5f\x6f\x53\x32\xff\x9e\xac\xa6\xcc\x41\xb0\xdf\xf7\xe6\xca\x6a" + "\xa1\xdd\x6e\x20\xc1\x16\xa2\x99\x6f\xcd\xa0\x39\xe7\x48\x24\x5d" + "\x67\x50\x6f\x3f\x47\x66\xdb\x5b\xb4\x03\x5e\x48\x25\x62\x3b\x70" + "\x72\xfb\xea\x24\x35\x7e\xbb\xf6\x41\x93\x49\x30\x3b\x2a\xb1\x9f" + "\x19\x89\xed\x00\xda\xee\x6c\x31\x04\x3f\x77\x01\xdf\xff\x5e\x24" + "\xa6\x47\x7e\x07\xed\xc0\x7f\xed\x0c\xdc\x04\xdc\x07\xdc\xc5\xda" + "\x83\x1e\xb4\x05\xed\xd0\x16\xcc\x33\x50\xdb\xd1\xba\x2f\xf0\x9d" + "\xb4\x26\x63\x0d\x19\x84\xfa\xf1\x1d\x32\x6b\x1f\xee\x87\xf6\x01" + "\xae\x61\x2c\xd1\xd1\x3e\xe8\xe6\x93\x4e\xed\x03\x8e\x43\x8e\xd6" + "\x37\x12\xc0\xf2\x8d\xf3\xad\x6a\xdb\x66\x2b\x75\xe1\x98\xc4\xec" + "\x38\x8b\x73\x0c\x05\xcb\x6d\x05\xb6\x13\xed\x52\x3b\x51\x28\xb5" + "\x13\xaf\xf4\x41\x3b\xf1\x0a\xb6\x13\xc7\x89\xf0\x32\xb6\x11\xd0" + "\x3e\xfc\xf1\x9f\x16\xc1\x0e\x6d\x42\xf7\xca\xf9\x2f\x29\x7e\xf1" + "\x93\x9f\xf8\xa8\x0b\xda\x62\x2c\xe7\x0d\x50\xbe\x58\xce\x66\x3d" + "\x94\x6d\xdd\x8d\x71\x6d\x10\xee\xc8\x8f\x8d\x2e\x3b\x63\x11\x68" + "\xde\x2f\x12\xda\x00\x0f\xeb\x2f\x12\xc1\x11\xba\x48\xbf\xf7\x01" + "\xa3\x80\xe3\x56\xd7\xce\xd8\x34\x3e\x46\x3e\xf0\x35\xfa\x68\xd4" + "\x8d\x44\x83\xfe\x53\x27\x35\xa8\x5d\xdf\x19\x06\xb9\x9e\xd4\x06" + "\xd9\xbf\xd3\x0e\x78\xfe\x09\x22\x5a\x9e\x4c\x52\x67\x3c\x48\x34" + "\x1f\xfe\xd5\x28\x1c\xb5\x42\xdd\x1e\xa0\x4a\xa0\xa0\xbf\xf8\x14" + "\x99\x55\xfc\x08\x99\x5e\x74\x86\xe8\x8a\x96\x91\x89\xbb\xcf\x00" + "\x86\x9e\x34\x04\xdb\x19\x3e\xda\x4c\xec\x7d\xff\x32\x12\x43\xc3" + "\x7e\x1e\x0d\xc7\x59\xc6\x65\x30\x9e\x09\x8b\x8d\xa6\x43\x17\xe9" + "\x5d\x20\xb7\x1d\xc6\x6e\xd0\x47\x07\x1b\xf6\x1f\xf1\x85\x9b\xdd" + "\xdd\xec\x43\xcc\x4b\x00\xdc\xd4\x02\x6e\xbe\xf7\xc4\x0d\x8e\x5b" + "\x19\x76\xe6\x71\xec\xe0\xbb\xbc\x62\x65\xff\xe2\x91\xc3\x3d\xc6" + "\x4f\x01\xf4\x9f\xdb\xbc\xf0\x53\x70\xae\x77\xf8\xb1\x03\x7e\x0a" + "\xb2\x00\x3f\x47\x88\xb0\xcb\xd5\x1b\xfc\x1c\x60\xf3\x7f\xa1\x9f" + "\x8f\x7f\x9b\xb4\x7f\x10\x96\x73\x43\xc0\xfe\x81\xf7\xeb\x55\xa4" + "\x87\xb8\x2a\xbf\x02\xae\xac\x1c\x57\xa6\x3b\x7b\x80\xab\x32\xc0" + "\x55\xf9\xe5\x71\x75\xd1\x1f\xae\xca\x3b\xe3\xea\xc3\xa8\xfe\xc5" + "\x15\x9b\xd3\xf3\x47\x80\x2b\x53\x90\x27\xae\x3e\x78\x8c\xe3\xea" + "\x83\xa5\x3d\xc7\x55\xdc\x15\xf8\x2a\x4e\xe2\xab\x8f\x77\x76\x1f" + "\x57\x02\xa1\xa0\xff\xf2\xb8\x3a\xeb\x07\x57\x71\x3e\xf8\xea\xa3" + "\x4d\xfd\x8b\x2b\x36\xe7\xe8\x8f\x00\x57\x1f\x27\x7a\xe2\xca\x74" + "\x80\xe3\xca\xb4\xbf\x17\xb8\xba\x02\x5f\xc5\x49\x7c\x55\x75\xb6" + "\x07\xb8\x32\x00\xae\xae\xc0\x57\x27\xfd\xe1\xca\x07\x5f\x1d\x3c" + "\xde\xbf\xb8\x62\x73\xa2\xfe\x08\x70\x55\x55\xe9\x89\xab\x83\x43" + "\x39\xae\x0e\x86\xf6\x1c\x57\xf1\x57\xe0\xab\x78\x89\xaf\x3e\x99" + "\xdb\x03\x5c\x95\x53\xd0\x7f\x79\x5c\x1d\xf0\x83\xab\x78\x1f\x7c" + "\xf5\xdf\x93\xfa\x17\x57\x6c\xce\xd6\x1f\x01\xae\x3e\xd1\x78\xe2" + "\xea\xd0\x0a\x8e\xab\x43\xcb\x7b\x81\xab\x2b\xf0\x55\xbc\xc4\x57" + "\x9f\x16\x76\x1f\x57\x01\x10\x7f\xfc\x15\xf8\x6a\x93\x3f\x5c\xf9" + "\xe0\xab\xea\x67\xfb\x17\x57\x6c\x4e\xd9\x1f\x01\xae\x3e\x4d\xf2" + "\xc4\xd5\x27\x87\x38\xae\x3e\xa9\xea\x12\xae\x6c\x0a\x5c\xd5\xdf" + "\x18\xd7\x9e\xc1\xc7\x83\x6f\x2e\x93\x70\xf5\xc6\x0c\xe3\x86\x35" + "\x44\xd8\xbb\x68\x97\xd7\x58\xf0\xb3\x6f\xbd\x31\x05\xb8\x60\x98" + "\x72\x3c\x09\x98\x6a\xe2\x98\xda\x7c\x12\x30\xf5\xf7\x5d\x82\x39" + "\xfd\x2c\xe2\x84\x61\xa8\x60\x19\x60\x08\xc7\x85\x2a\x51\xdb\x9d" + "\x31\xe0\x0b\x4d\x32\x96\x0e\x7f\xde\x27\x58\x5a\x08\x58\x3a\xe6" + "\x8d\xa5\x43\x6e\x2c\xfd\xd2\xcf\x18\xf0\x21\x3f\x58\x6a\xb8\x32" + "\x96\x76\xa3\x0f\x61\xd5\x55\xc2\xd2\xe7\x6e\x1f\xc2\x9e\x47\x2c" + "\x82\x63\x68\x77\xb1\xf4\x59\x85\x27\x96\x0e\x0f\xe3\x58\x3a\xac" + "\xed\x39\x96\xe2\xca\xfd\x63\x49\xee\x4f\x1d\x9d\xd1\x3b\x2c\x41" + "\xdf\xca\x03\x4b\x57\xee\x47\xb9\xb1\x74\x64\x64\xff\x62\xc9\xab" + "\x1f\x75\xcd\x62\xe9\x28\xf1\xc4\x52\x8d\x34\xee\xab\xf1\x3b\xee" + "\x73\x41\xdb\x85\xef\x9c\xf0\xf7\xb9\xce\x16\x43\xac\x13\xda\x34" + "\xfc\x9d\x2e\xbe\xa7\xd8\xb7\xb2\x56\x40\x3c\x65\x5f\x20\x91\xdb" + "\x53\xc9\x6c\xb5\x8d\x63\xc5\x01\x58\xd9\x76\x81\x88\x76\x3b\xe0" + "\xa4\x9d\x88\x6d\x90\xdf\x6d\xf6\x24\x75\x4d\x62\x23\xf9\xf0\x5c" + "\x2d\xb4\x65\x95\xa4\x08\x9e\xb1\x4b\x7e\x48\xd7\x06\x43\xf0\x73" + "\xeb\xd1\x0f\x79\x84\x98\x16\xbd\x02\xe5\x6f\xee\x75\xf9\xb7\x3d" + "\xe3\xaf\xfc\x0f\x78\x94\x7d\x81\xa2\xdc\xd9\xef\x05\x7a\xd8\x1e" + "\xb1\xf7\x54\x2b\x79\xd9\xcb\xe5\xfe\x72\x1f\x94\xfb\xcb\x52\xb9" + "\xf7\xae\x3d\x32\xfb\xff\xfe\x51\xc1\x15\xec\x9b\x02\x1b\xe7\x08" + "\x99\x17\x90\x23\xb0\xff\xd2\x16\x1a\x3b\xdd\xbb\xbd\x41\x7e\x38" + "\x17\xf0\xc5\x63\xd8\x36\xf9\xed\xc7\x48\x3c\x91\xf1\x34\xe7\x09" + "\xa9\x1f\x93\xd8\xb7\xfe\xc7\xcf\xe7\x5d\x3d\xbe\x38\x70\xe5\xb6" + "\xa7\x17\xfd\x18\xc4\x4d\x81\x17\x6e\xae\x06\x5f\xf4\x0c\x37\x5f" + "\x44\x7b\xf2\x45\xed\x8b\x9c\x2f\x6a\xb7\x77\xa5\xed\xb9\x02\x9e" + "\x2a\x14\x78\xb2\xba\xf1\x74\xec\x5d\xf4\x51\x76\x13\x4f\x15\x7d" + "\xeb\x77\xfc\x9f\xc2\xfe\xc5\x53\xdf\xf9\x1d\x7f\xd8\x78\x3a\x96" + "\xe9\x89\xa7\x2f\x4e\x72\x3c\x7d\x51\xdf\x7b\x3c\xc5\x29\xf8\x29" + "\x4e\xc1\x4f\x7f\x0b\x44\xdf\x64\xf7\xf0\x24\x06\xf5\xad\xbf\xf1" + "\xf8\xd9\xfe\xc5\x53\xdf\xf9\x1b\x7f\xd8\x78\xfa\x6b\xad\x27\x9e" + "\x8e\x4f\xe2\x78\x3a\x3e\xb1\x0f\xf0\x54\xe1\xdd\x27\xe6\x78\x3a" + "\x71\x3f\xf6\x9f\xbb\x89\xa7\xc5\x7d\xeb\x67\xac\xbb\xb3\x7f\xf1" + "\xd4\x77\x7e\xc6\x1f\x36\x9e\x4e\xe8\x3c\xf1\xf4\xb7\x4d\x1c\x4f" + "\x7f\xdb\xd8\x7b\x3c\xc5\x2b\xf8\x29\x5e\xc1\x4f\xff\x78\x1d\x7d" + "\x91\xdd\xc4\x53\x1f\xfb\x17\xff\xfe\x62\xff\xe2\xa9\xef\xfc\x8b" + "\x3f\x6c\x3c\xfd\x23\xc5\x13\x4f\x27\x8e\x70\x3c\x9d\xa8\xe9\x03" + "\x3c\x29\xf8\x29\x5e\xc1\x4f\x27\x2f\xa2\x0f\xb2\x7b\x78\x0a\x14" + "\xfb\xd6\xaf\x58\x7f\xb2\x7f\xf1\xd4\x77\x7e\xc5\x1f\x36\x9e\x4e" + "\x9a\x3c\xf1\x54\x3f\x92\xe3\xa9\x3e\xbc\xab\xbe\x20\xd9\x07\xa4" + "\xc4\x93\xff\xb1\x5d\xc3\xed\xde\x63\xbb\xee\xf9\x80\x60\x9c\xd7" + "\x63\x7f\xe2\x97\x63\xfe\x7f\xf5\x27\x22\x86\x64\x3f\xd0\x0f\xcf" + "\x07\xd4\x20\x7a\x62\xe8\x9f\xc9\x1c\x43\xff\x4c\xf2\x87\x21\x87" + "\xf2\x9b\xb4\x6f\x14\xdf\xa4\x9d\x25\xc2\xde\x95\x26\xe1\xa8\xf4" + "\x4d\x1a\x7e\x8f\x76\xf4\x74\x23\x79\xee\x12\xd1\x04\x27\x11\xcd" + "\xfc\x94\x0c\x9a\x83\x1c\xb2\xda\xa0\x7e\xe1\x0c\x99\x6d\x07\xcc" + "\x64\x37\x49\xdf\xa5\x01\x6e\x3e\xab\xb7\x91\x0f\x56\xe2\x77\x69" + "\xe5\xa4\x18\xe4\x1c\x79\xdc\x1f\x84\x3c\xc2\xbe\x49\x5b\x86\xdf" + "\xa4\x7d\x35\xde\xe7\x37\x69\x59\xdd\xfc\x26\x2d\x0d\x70\x60\x05" + "\x1c\x5c\x44\x0c\xbc\xeb\xf1\x2d\xda\xee\x2c\x85\x0f\xe8\x11\x3f" + "\x3e\xa0\xba\xae\xbd\x93\xe8\xf3\x6f\xd1\xce\x2b\xbe\x45\x93\x7d" + "\x40\x8b\x80\x3b\xba\x5d\xee\x5f\xf9\x5d\xff\x1d\x39\xc2\x09\x9c" + "\x30\x1f\xbf\x2d\xb7\xba\xfd\xc5\x1b\x93\xf1\xb7\xbf\xb1\xd1\x0e" + "\xe0\x0a\xfc\x7e\xfc\xad\x47\xaa\x99\xbf\xcf\x9c\x5e\x47\x9e\x6b" + "\x27\x1a\xb5\x45\xe2\x85\xa1\xb1\x69\x76\xe0\x06\x27\xb4\x4b\x50" + "\xd6\x83\xec\xab\x81\x1b\x2e\x00\x37\xac\x06\x6e\xb8\x08\xdc\x70" + "\xaa\x9a\x71\x03\x7d\x5e\x95\x80\x73\x73\x17\x37\x91\xe9\x85\x4d" + "\x64\x16\x72\x80\x73\xe7\x22\xbd\x7d\x68\xec\x42\xcb\xd0\x58\x03" + "\xdc\x4b\xe2\x18\x68\x33\x6d\x4f\x25\x8c\xeb\xb1\xec\x75\xcb\x90" + "\x0f\xfe\x77\xaa\x3d\x8b\x90\xde\xe0\xc0\xae\xf4\x09\x2a\x71\xe0" + "\x87\x03\x7a\x8d\x05\x2f\x3f\xf0\xee\x5e\x72\x00\x62\x61\xb7\xcc" + "\x01\xbd\xc2\xc2\x69\xbf\xbf\xff\xb9\x02\x16\xca\xbb\x80\x05\x6b" + "\x17\xb1\x50\x86\x73\x5a\xfb\xc0\xc2\x31\xc0\x42\x1d\xdc\x6b\xe4" + "\x58\xb8\xe8\x03\x0b\x5f\xdf\x79\xf5\xb1\xe0\xe9\x93\xb9\x76\xb1" + "\x70\x26\xb4\x67\x58\x88\xeb\x02\x2f\xc4\x75\x91\x17\x04\x82\x73" + "\x41\x77\xc6\x42\x1c\xf0\x42\x1c\xf0\x42\x9c\xc4\x0b\x67\x7d\x60" + "\xe1\x9b\xf8\xab\x8f\x05\x4f\x7f\xca\xb5\x8b\x85\x46\x5d\x0f\xb1" + "\xd0\x05\x5e\x88\xeb\x22\x2f\x08\x58\xde\x3e\x78\x21\x0e\x78\x21" + "\x0e\x78\x21\x4e\xe2\x85\x93\x3e\xb0\xf0\xed\xfd\x57\x1f\x0b\x9e" + "\xbe\x90\x6b\x17\x0b\x4d\x13\x7b\x86\x85\xf8\x2e\xf0\x42\x7c\x57" + "\x79\xa1\x1c\xe7\x1e\xee\x8c\x85\x78\xe0\x85\x78\xc0\x49\xbc\xc4" + "\x0b\x07\x7c\x60\xe1\xbb\x25\x57\x1f\x0b\x9e\x7e\x8c\x6b\x17\x0b" + "\xcd\x7e\xd7\x7f\xbd\x02\x16\xba\xc0\x0b\xf1\x5d\xe4\x85\x80\x20" + "\x9c\xb3\xd7\x07\x16\x80\x17\xe2\x81\x17\xe2\x25\x5e\xd8\xe4\x03" + "\x0b\x67\x57\x5c\x7d\x2c\x78\xfa\x20\xae\x5d\x2c\x9c\x9b\x73\x59" + "\x2c\xd0\xce\x58\x40\x1f\x02\x8e\x1f\x71\x4e\x6c\x86\x85\x27\x4c" + "\x42\x3b\x45\x2c\x54\x93\xe7\xd7\x2b\xb0\xb0\x93\x8f\x23\x64\x1c" + "\xbc\xa8\xc4\x01\xfe\x7e\x09\x71\x00\xe3\x07\x07\x94\x3b\xcd\xff" + "\x79\x34\xfb\x5e\x69\x67\x6c\x12\x8e\x1f\xd0\xcf\x80\x63\x08\xff" + "\xe3\x87\xf3\x4f\xf5\x09\x06\x96\x03\x06\x9a\x7d\x8f\x23\xfb\x7c" + "\xfc\x70\xfe\x2a\x61\x00\xc6\x92\xaf\x6c\xee\x0d\x06\x2c\x7e\xd7" + "\xff\xf2\x8f\x01\xe8\x23\x74\x09\x03\xbc\x9f\x70\x79\x0c\xc4\xd5" + "\xba\x31\x00\xfd\x85\x9d\x71\x8d\xd8\x3f\xe0\x18\x88\xab\xf3\xdf" + "\x3f\xf8\x7e\xcd\xd5\xc7\x40\x1f\xf7\x0f\x7e\xb0\x18\xb8\x70\x9f" + "\xdf\xdf\x30\x22\x97\x03\xef\xcf\x1f\x3f\x8a\xd0\x27\x0d\xb1\xd9" + "\x4d\x24\xf2\x85\x27\xc8\x6c\x9c\x37\x66\x6f\xbb\x4d\xd8\x9c\x42" + "\xbf\xc1\xdf\x56\x3b\x20\x1d\x38\x0f\x28\xc3\xc7\x79\x6d\x90\x39" + "\xc9\x42\x9e\x03\x2c\xbc\x00\x69\xc0\xf9\xe3\x83\x53\x6e\x8c\x3b" + "\x6a\x3d\x4c\xda\x5b\x0c\xa4\x26\xb1\x89\x2c\xd0\x53\xbb\xb9\xde" + "\x84\xbf\x61\x14\x4d\x6b\x0f\xe3\xef\xc4\x07\x3c\x9c\x4e\x84\x73" + "\x01\x2d\x1a\xf4\x29\x4d\x49\x27\x9a\x82\x26\xee\x47\x7a\xee\x1c" + "\x21\x87\xd2\x09\xe1\xe5\xde\xb2\x22\xf0\xe9\x3e\xf0\x21\x2d\x86" + "\x72\xaf\x97\xcb\xfd\x90\xa7\x0f\x49\xe8\xc2\xef\x19\xbb\xe0\x3b" + "\xbc\x2a\xbf\x67\x3c\xdf\xf9\xf7\x8c\x3d\xf3\x1d\x5a\x63\x2e\xfb" + "\x1d\x91\xd4\x0f\xd8\x90\xc6\xea\x3d\x2b\x57\x3b\x70\xbf\x39\xbd" + "\x92\x7d\x1f\x8d\xf5\x1c\xeb\x3c\xe2\x23\x03\xd2\x8b\x18\x41\x3c" + "\xcc\x2f\xb3\xdb\x1f\xb2\x12\xc1\x35\x34\x36\x0d\x31\xe1\x5a\xa5" + "\x0d\xda\x0e\x69\x32\x27\x9e\x82\x72\xbf\x40\xcc\xa7\xa5\x32\x5f" + "\x7f\x0a\xca\xd2\xea\xa0\xab\xf4\x03\x26\x5b\x89\x26\xe3\x04\xd1" + "\x3c\x8c\xbf\x39\x86\x76\x60\x37\xf4\x09\x8a\x9f\x20\xd3\xa1\x3d" + "\x48\xb0\x4b\xdc\xe0\x92\xfd\x4a\xd8\x46\x00\x26\x5e\x58\x09\x98" + "\x48\x03\x4c\x3c\x84\x98\xb8\xb8\x25\x70\x8d\x0f\xff\x72\x37\x30" + "\xc1\xfc\xcb\x4b\x01\x13\xa7\xdd\x98\xe8\xf0\x2b\xfb\x69\x13\x4c" + "\x8b\x7a\xf1\x6d\xa1\x0f\x3e\xe8\xb5\x5f\xf9\xbc\xe4\x57\x56\xf0" + "\x41\xcf\xb0\x71\xc9\xff\x9c\x98\xfe\xb1\x51\x7e\x65\x6c\xb4\xca" + "\xd8\xb0\x5e\x19\x1b\xad\x5a\x1f\xd8\x28\x53\x60\xa3\x56\x81\x0d" + "\xee\x67\xda\x19\xdb\xd8\x19\x1b\xad\x85\xfd\x83\x0d\xaf\xef\x7e" + "\xae\x59\x6c\xd8\xfc\xae\x7f\xeb\x1f\x1b\x71\x5d\xe0\x8d\xf3\x12" + "\x36\xe2\xba\xc0\x1b\x6d\xd3\x3b\x63\x43\x20\x6e\x6c\xc4\x29\x78" + "\x43\xf2\x3b\xed\x8c\xf3\xc1\x1b\x6d\xef\xf7\x0f\x36\xbc\xbe\xe1" + "\xb9\x66\xb1\xd1\x9e\xd7\x03\x6c\x74\x81\x37\xbe\x94\xb1\xd1\x05" + "\xde\xb0\x27\xf8\xc0\x86\x41\x81\x0d\x05\x6f\x48\x7e\x28\xec\x73" + "\x76\xc2\x86\xfd\x78\xff\x60\xc3\xeb\x7b\x9c\x6b\x16\x1b\x8e\xf2" + "\xee\x63\x23\xbe\x0b\xbc\xf1\xa1\x84\x8d\xf8\x2e\xf0\x86\x73\xb9" + "\x0f\x6c\x94\xbb\xb1\x11\xaf\xe0\x0d\xc9\x2f\xb5\x33\xde\x07\x6f" + "\x38\xbf\xef\x1f\x6c\x78\x7d\x5b\x73\xcd\x62\xc3\x55\xd3\x03\x6c" + "\x74\x81\x37\x32\x64\x6c\x74\x81\x37\xe8\xb6\xce\xd8\x08\x08\x52" + "\x60\x43\xc1\x1b\x92\x9f\x6a\x67\x7c\x67\xde\x10\xc9\xa0\xfe\xc1" + "\x86\xd7\x77\x32\xd7\x2a\x36\x44\xd2\xd8\x15\x6c\x6c\xb4\xfa\x18" + "\xa7\x9c\xe6\xd8\xb0\x83\x8c\x12\x17\xca\xb1\x09\xa4\x4f\x5c\x00" + "\x63\x16\xc4\xc4\x6f\x36\x12\x81\xe1\xc2\xaa\xc0\x85\xa8\x2a\x41" + "\x5c\x4c\x4a\x02\x5c\x7c\x2d\xe1\x42\x1e\x97\xb0\xb9\x57\xf8\xd8" + "\x44\xf6\x59\xc9\xe3\x93\xe7\x71\xcc\x9a\x24\x63\x42\x18\x13\x98" + "\xdc\x07\x98\xf0\xf8\xee\x41\x81\x89\x07\xfd\x8c\x4f\x1e\xe8\x39" + "\x26\x5e\x81\xb1\xab\xbd\xaf\x7f\xfb\x24\x63\xe2\x44\x6f\x31\x21" + "\x5c\xf6\xfb\x07\xdf\x98\x90\xfa\x19\x7e\x31\xe1\xee\x5b\x70\x4c" + "\x7c\x79\x19\x4c\x04\x54\x74\xc6\x84\xd4\xaf\x60\xf3\x10\xf0\xbe" + "\x85\xec\xc3\x92\xfb\x17\x9e\x98\x10\x67\xf4\x0f\x26\xbc\xfa\x17" + "\xd7\x2c\x26\x02\x35\xfe\x30\x61\x14\x5c\xe5\xb0\x57\xc2\x6e\x82" + "\xbd\xda\x29\x90\xb9\x85\x82\x8b\x7f\x6f\xce\xeb\x8c\xf7\xfd\x1b" + "\xe8\x6f\xe7\x25\xa2\x0c\xdd\x22\xb2\x77\xea\xb2\x0e\xe7\x00\x82" + "\xf3\x21\x9a\xd4\xaa\x44\x2c\x13\x94\xbd\x51\xd6\xa5\xde\x42\x62" + "\x20\xfd\x5c\x4e\x20\x99\x5c\x2e\xe6\x06\x94\xa3\xd9\x95\xa7\x21" + "\x2c\x48\xd2\xc9\xd6\xa7\x77\x0a\x02\xea\xf2\x8e\xfb\x26\x49\x46" + "\xe7\xcc\x22\x3a\x65\xdc\xa0\x0b\xe3\x94\xe5\x06\xa0\x9c\xf3\x86" + "\x08\xad\x53\x25\x46\x2a\xe5\xe8\x3d\x44\x29\xf7\x13\x49\x9f\xde" + "\x23\x1d\x11\x84\xa8\x55\x3a\x9e\x96\x74\x41\x4e\xcb\x40\xa6\x33" + "\xf8\xbd\xd9\xa0\x73\xa2\x87\xce\x1b\x08\x19\x04\xf2\xa8\x77\x50" + "\x12\xb3\x1b\xe5\x07\xd1\x01\x37\x2c\x64\xfa\x55\x62\xb4\x4b\x20" + "\xd1\x3c\x5d\x44\x2c\xec\xb0\x59\x47\x8c\x9e\x71\x04\xcb\xf9\xa5" + "\x94\x43\x19\x2a\x74\xc8\xa8\x99\x1d\x03\x02\x0d\x60\xc7\x2c\xa5" + "\x1d\x5c\x8e\x4c\x95\xe4\x34\x90\xae\xd9\x1d\x65\x99\xa7\xd6\xcb" + "\x72\x80\xdf\x61\x50\x16\x26\x33\xd4\x37\x29\x1f\x06\xd3\xec\xf7" + "\xd3\xa5\xbc\x88\x51\xea\x1c\xa4\x52\x35\x14\x4a\xf9\xe5\xca\x7e" + "\x7f\x22\xc8\x86\xb8\xb6\x88\x73\x3a\xf4\x66\x69\x88\x5c\xae\x34" + "\xcb\x31\x84\xe9\x85\x56\xc9\x29\xa8\x74\x52\x3e\x0c\x41\x59\x78" + "\x26\x8e\xa7\x4b\xd3\x51\xae\x4e\x41\xc4\x7b\x26\x85\x6c\x28\xcf" + "\xe3\x4f\xab\x21\x6d\xf7\x75\x96\x0f\xf2\x96\x1f\xca\xe5\xff\x52" + "\x09\xf2\x09\x9d\xe5\x35\xde\xf2\x61\x5c\xfe\x03\x0d\xc8\x2f\xec" + "\x2c\xef\x08\xf1\x92\xbf\x99\xcb\x9b\x92\x40\xde\xd0\x59\x5e\xe7" + "\x2d\xaf\xe5\xf2\x35\xa1\x20\xbf\xb8\xb3\x7c\x8c\xb7\xfc\x30\x2e" + "\xff\xb1\x09\xe4\x13\x3b\xcb\x67\x7a\xcb\x0f\xe7\xf2\x87\x10\xd7" + "\x4b\xbd\xe5\x8b\x99\x2c\x89\x90\x64\x47\x70\xd9\x4f\x52\x40\x36" + "\xc9\x47\x5a\x03\x24\xdd\xd1\x92\x7c\x38\x97\x7f\xbf\x16\xe4\x97" + "\xfb\x28\x2b\x6f\xf9\x91\x5c\xfe\x9f\x3a\x90\x4f\xf1\x51\x56\xde" + "\xf2\xa3\xb8\x7c\x6d\x0c\xc8\xa7\xf9\x28\x2b\x6f\xf9\xd1\x5c\xfe" + "\x0b\x23\xc8\xa7\xfb\xc8\x7b\x4f\xf9\xe0\x63\x0d\x20\xb7\xb1\x30" + "\x4b\xae\x3f\x1e\xf9\xee\xad\x7b\x0c\xd7\xfd\xb7\x68\x78\x26\xd3" + "\x47\xbe\x7b\xcb\x47\x70\xf9\x13\x99\x20\xbf\xb5\xb3\x3c\x51\x71" + "\x79\x32\x4d\x92\x1f\xcb\xe5\xff\x81\x79\xb9\xcd\x47\xde\xe3\x7d" + "\x93\x54\x4f\x23\xb9\xec\xd1\x44\x90\xdd\xee\x23\xdf\x95\xb2\x51" + "\x5c\xf6\xdc\x76\x90\x35\xfa\xc8\x73\xa5\xec\x38\x2e\x7b\x6a\x0e" + "\xc8\xe6\xf9\xc8\x6f\xa5\xec\x2d\x5c\xf6\x74\x02\xc8\xee\xf2\x61" + "\x6f\x84\x42\x56\xcf\x65\xcf\x2c\x06\xd9\x02\x1f\xe5\xa2\x94\x1d" + "\xcf\x65\x2d\x58\x86\x25\x3e\xca\x45\x29\x3b\x81\xcb\x36\x62\x5d" + "\x2b\xf5\x51\x26\x4a\xd9\x7f\xa3\xc1\x4d\x69\x12\xb7\x96\x79\xcb" + "\x02\x06\x4c\xc0\x43\xd5\xc0\x85\x13\x69\x76\x73\x66\x31\xe7\xb5" + "\x3d\x28\x27\xcb\x50\xc1\x71\xab\xa2\x1d\x98\x44\xb3\x1b\x96\x4a" + "\xfc\x57\xee\xad\x8f\x0a\xa2\x52\x76\x32\xcd\x65\xb8\x40\xd9\x8a" + "\xce\xb2\x41\x4a\xd9\x29\x34\xdb\xba\x4d\x92\xad\xec\x2c\xab\xe9" + "\x90\xa5\xd9\x97\x4a\x41\x66\x7f\x91\xc4\xab\x0a\x3b\xa7\x29\xf4" + "\x4d\xa5\xd9\x36\x93\xa4\xcf\xd4\x59\x9f\x4e\x29\x3b\x8d\xe6\x06" + "\xcc\x91\x64\xab\x3a\xcb\xc6\x28\x65\x6f\xa5\xd9\xed\xf5\x92\x6c" + "\x75\x67\xd9\x4c\xa5\xec\x74\x9a\xed\xb0\x49\xb2\x35\xde\xb2\x45" + "\xbc\x0d\x12\xa4\x72\x9a\x41\xb3\x69\xa8\x24\x5b\xeb\xd1\xc6\x0a" + "\x2a\x56\xc7\x8a\xb8\xdc\x4c\x1a\x7c\x21\x4f\x2a\xcf\x63\x1e\x6d" + "\x6b\x96\x2a\x04\xdb\x94\x42\x2c\xcf\xdf\xde\x6f\x05\xd9\xdb\x24" + "\x7d\x75\xde\x6d\x9f\x64\xdf\x2c\xb8\x57\x2f\xb7\x4f\xd0\xee\x34" + "\xf8\xea\xf7\xa4\x4c\x20\x3f\x69\x12\x83\x77\xf1\xb6\x51\x5a\x5f" + "\x58\xd4\xb0\x6b\x57\xe9\xcc\xe8\x05\x56\xea\x50\x86\xe5\x08\xb4" + "\x76\x8a\x95\x88\x38\xa7\x37\x1d\x9a\x68\x68\x80\x70\x4b\xd4\x6d" + "\xa4\x35\x37\xb8\xb4\x01\xe2\xc4\x79\x5f\xe1\xbc\xbc\x81\xfc\x7e" + "\x0e\x9e\xe7\x64\xe1\xfa\x87\x31\x2a\x67\x7e\xb0\x05\xd7\x4b\x2c" + "\x86\xeb\x6c\xd8\xd9\xda\x84\xd0\xc7\xa4\xbf\x25\x31\xa6\xb5\x0e" + "\x72\x26\x9d\x08\x6c\xdd\x6c\x31\xd8\x49\x57\x25\xcd\x06\x5b\x4a" + "\x20\xde\xa5\xa7\xe0\x9a\xd9\x82\x6b\x93\xe6\xa9\x07\x9a\x52\xdb" + "\x41\x46\xfd\x4b\xcb\xd0\xe4\x12\xfa\xcc\xaf\xbf\x4d\xd9\x4c\x46" + "\x37\x89\x6a\xd6\xe6\xe1\xbc\xb7\xae\xa1\xea\x81\x6c\xbe\xdb\xf3" + "\x49\x77\xb1\xb9\x6e\x45\x4d\x32\xce\x71\x8b\x73\xdd\xca\xf3\xdc" + "\xf2\x78\x34\x0b\x5b\x80\xaf\x68\xc9\x1a\xbe\x86\xa3\xa8\x7e\x9d" + "\xa5\x2f\x8b\xd6\xd2\xc8\x99\x5a\x57\xfb\xd6\x4c\x5c\xe7\xda\xb4" + "\xb9\x89\x9c\x92\xee\xa1\x7e\x49\x67\x94\xb7\x4e\x7c\xce\x32\x66" + "\x0d\x81\x7c\xd1\x3a\x8d\x77\x95\xb8\x34\x77\x15\x50\x63\x7c\xad" + "\x79\x79\x03\x61\x69\x15\x35\x2f\xd3\xe0\x07\xcd\x2e\xe3\x5d\x5b" + "\x21\xdc\x64\xb6\xb6\xb3\x70\xd0\x6d\xc1\x7e\x73\x8b\x66\x6e\x0d" + "\x35\xce\xad\x35\x0d\x6f\x27\xa7\x71\xb5\x00\x88\x0f\xc3\xe9\x8e" + "\xf8\x5a\xcc\x63\xd7\x8e\x78\x53\x80\x96\x88\x2d\x83\xe7\xd6\xb4" + "\xe6\x6a\x34\xf2\x3a\x75\x72\x5c\xa8\xb7\x41\xd2\xd5\xe5\x39\x7b" + "\x45\xf5\x2e\x36\x67\x6f\xae\x26\xb1\x41\x75\xdf\x31\x36\x67\xaf" + "\x9c\x97\x5d\xd7\x31\x07\x75\xf8\x5e\xd7\x84\xa8\xe9\x4e\xb5\x1e" + "\xf4\x9b\xa0\xef\x9d\xc0\xb1\xa1\xa9\x69\x50\xdd\x7d\x5a\x3a\xaf" + "\x6b\x50\xdd\x7b\x9f\x74\x8e\xeb\x7f\xee\x92\xce\x2d\xf2\xbc\xc9" + "\xbe\xe7\x71\x0e\x76\x00\x16\x42\x5d\xbb\x0d\x41\x38\x6e\x60\xf6" + "\x0c\x0d\x76\xe8\x46\x11\xd5\x19\x71\x70\x1a\xc4\x19\xca\xcb\x69" + "\xf0\x3c\x38\xaa\xa5\xa3\x45\x3a\x52\x94\x61\x78\x0f\x5d\xb2\x0b" + "\xca\xa2\x9a\x97\xcf\x60\xbe\xf6\x2b\xe2\x0a\xb0\x47\x07\xc7\x57" + "\x33\xbd\x3b\x93\x4b\x94\x36\x44\x4f\x9d\x76\xeb\xf4\x19\x33\x6f" + "\x9b\x75\xfb\x92\x47\x1e\x5d\xfa\xd8\xb2\xc7\x93\x92\x9f\x78\x72" + "\xf9\x8a\x95\xab\x52\x9e\x4a\x5d\x9d\xb6\x66\xed\xba\xf4\xa7\xd7" + "\x83\x9e\x8e\x75\xbb\xe9\xee\x39\x2a\xab\x40\xa0\xac\xef\xc1\x38" + "\xd8\x3a\x4f\x18\xc6\x31\x37\xb8\x4a\xd4\xf9\x1e\x8f\x98\xb5\x30" + "\x06\x84\xfe\x77\xb3\x18\x32\x06\xd7\x63\x04\xfc\xab\xcc\x05\xb1" + "\x26\x5c\x8b\xfa\xb4\x18\x12\x7a\xd4\x12\x6b\xc2\x75\xce\x0f\x6a" + "\x1b\x49\x64\x04\x51\x35\x89\x21\x04\xef\x17\x8f\x23\xa4\x0a\x9e" + "\xf5\xa5\x33\x42\x43\xb4\x2f\x85\x51\x4b\x5e\x18\x6d\x46\xfd\x79" + "\xf9\xb4\xd1\xb2\x21\x89\x64\xc3\x35\xd4\x09\xcd\x19\x31\xe4\xf8" + "\x41\x18\x75\xb8\xb2\x48\x78\x51\x3e\x3d\xbd\x35\x8c\x9e\x7e\x26" + "\x9f\x36\x17\x87\xd1\x86\xc8\x3c\x32\xb0\x35\x37\x64\x5b\x83\x38" + "\xb8\x81\xd5\x6b\xb8\xef\x0a\x19\x9c\x99\x03\xf7\xa6\x38\x48\x40" + "\x31\x5c\x43\x98\xf5\xa0\x8e\xdb\xbd\xef\x82\x2d\x10\xf4\x2d\xa7" + "\xf6\xe5\xaa\x6c\x88\x87\x97\x47\x48\x5b\x15\xf4\x60\x20\x3e\x8b" + "\xd9\x76\x8a\x34\x88\x21\x36\x5c\x2b\x16\xe2\x53\x9b\x77\x35\x13" + "\xd4\xf7\x56\xaa\x2d\x70\xf5\x70\xea\x00\xd9\x3a\xd7\x86\xe5\x2a" + "\x90\xa9\x00\xdd\x56\x65\x7a\xf4\xcb\x56\xa4\xe9\x56\xae\x59\xbe" + "\x7c\xfc\x00\xa2\x67\x47\x8f\x75\xd2\xd3\x70\xbe\xf6\x97\xf2\x69" + "\x15\xa4\xd3\x04\xe9\xad\x3e\x02\x23\x1f\xc0\x06\x81\x34\x19\xcf" + "\x88\x43\xe6\x41\xf8\x7e\x38\xdf\x0f\xb6\x57\xb3\x75\x99\xc5\xc8" + "\xa7\x69\xee\x10\x11\xec\xc4\xb6\x52\x87\xf3\xbb\xb7\xac\x5b\xa8" + "\x82\x74\xe7\x81\x5c\xb5\x6e\x38\x89\x82\xe7\x8e\x83\x1d\xa5\x70" + "\x8e\xf2\x5b\xb0\x1c\x41\xbe\x8a\xa7\x2b\x32\x19\xaf\x21\xaf\x4c" + "\x85\x61\x74\x7b\x6b\xee\x90\x72\x5c\xb7\x82\xad\xa9\x09\xd7\x90" + "\x2f\xd5\x20\x6b\x6c\xc9\x58\xa8\x82\xf1\xb3\xaa\xd8\xad\x33\x13" + "\x6d\x42\x3b\x70\x4c\xfe\x19\xf4\x64\x5d\x76\x03\x99\x64\x23\xaa" + "\xcf\x4e\x13\x52\x90\x4f\x4b\x60\x2f\x80\x7d\xd7\x61\xb8\xf7\x29" + "\xec\xd5\x10\x5e\x03\xc7\xc3\x70\xfc\x14\x76\x18\xd3\x6b\xd1\xee" + "\xd5\x1b\x69\xe3\x94\x5d\x64\x2c\xea\x07\x6c\xfd\xea\x94\x38\xb6" + "\x16\x6d\xc7\x75\x69\x68\x48\xe8\x1c\x8f\xb5\x34\xc4\xa1\x95\x04" + "\xee\xc3\xb1\x86\x1f\x95\x7b\x58\x28\xec\xd3\xa5\xf3\x8d\x20\x53" + "\x2a\x9d\x1b\x61\x2f\xb8\xf2\xee\xad\xcf\xdf\x7e\x73\x50\xd7\x65" + "\xbb\xb2\x47\xce\xe9\x9a\x9c\xd6\x44\xc4\x11\xc0\xa4\x23\x12\x3c" + "\xc3\x47\xe8\x79\xd8\x68\x2b\xbf\x06\x20\xf3\xe3\x44\xd8\x21\x9f" + "\xc6\x80\xfe\x31\x49\x3c\x6c\x4c\x1a\x1c\xf7\xc3\x5e\xed\x19\x7f" + "\x24\x3c\x1f\xb9\x18\xcb\xd3\x0e\x6d\x10\x96\x65\x83\x18\x1a\x8a" + "\x65\x94\xc3\xb1\xa5\xc2\xdf\xe6\x41\x98\x06\xb0\x55\xe0\xc6\x4f" + "\x58\xa0\x27\x7e\x86\x5a\xbc\xf0\x63\x44\x2e\x6a\x10\x87\x2c\x2e" + "\xe6\x78\xd9\xdf\xb2\x61\x29\x5c\x0f\xb5\x82\x9e\xfd\xe8\x2b\x02" + "\x1d\x6c\x6c\x93\xd3\x04\x63\x70\xb0\x12\xf9\xa5\x59\x0c\x9b\x8b" + "\x98\xc5\xb8\xa5\x78\xb9\x2d\x60\x1f\x84\x95\xa0\x7d\xab\x40\x2f" + "\x5c\x97\x82\x5c\x89\x99\x5c\x90\x6d\x63\xcf\x3c\xff\x04\xe0\x51" + "\xb2\x17\x75\xe2\x73\xd4\x9d\x2e\x0d\x3e\x23\xc5\xdd\x06\xe1\x38" + "\xb6\xc7\xdf\xdd\x05\x98\x1d\x0d\x04\x31\x89\x47\xb3\x23\x1a\xea" + "\x52\x1c\x71\xe1\x5c\xf3\x5a\x12\x0d\xf5\xed\xa6\x53\x62\x58\xfd" + "\xe4\x8d\x24\x1a\xf5\x21\x7f\x37\x88\x61\x25\xc5\x58\x17\xb9\xae" + "\xef\x31\x1d\xa8\xff\x30\x8c\xa6\xf0\x58\x84\xf6\xc0\x7d\x45\xbc" + "\x79\x38\x66\xcf\x59\xcf\xd3\x0a\x71\x95\xc2\xf3\xe5\x98\x76\xcc" + "\x4f\xb8\x5f\x79\x46\xbc\x79\x16\xde\xc3\xb5\x29\xa5\xf4\x94\xe2" + "\xef\x1d\x31\x3f\x50\xde\x0c\xa3\x17\xb6\x8e\x86\x38\x84\xcd\xd5" + "\x0f\xfa\xcb\xb1\x3c\x28\xc4\x81\x3a\x32\x1c\xd4\x41\x81\x8f\x5e" + "\x5b\x6f\x83\xbe\x8f\xf6\x6d\xcf\xf2\xb9\xd9\xa8\x2c\x1f\x78\xae" + "\x1c\x9e\xaf\xc2\xfe\x00\xf2\x09\xc4\xa9\xc6\xbe\x0e\x84\x19\x5d" + "\xb9\xa0\x63\xad\x8d\xf9\xb7\x40\xcf\xab\x60\x8b\x11\xf5\x80\x3d" + "\x55\x92\xae\x7a\x9c\x73\x5f\x59\xd6\x92\xbe\x52\x2c\x73\x56\x9f" + "\xd7\xb3\x34\x01\x77\x69\x9f\x2a\xe2\xf7\x2a\x41\xa6\x92\xda\xe3" + "\x08\xdd\x60\x90\xfa\x2f\xec\x5e\x45\x46\x1b\x2b\xdf\x2a\xce\x6b" + "\xda\x1d\xab\x37\xd1\x46\xb7\xdd\xda\x38\x79\x4d\x2a\xc9\xee\x0a" + "\x8c\x8f\xae\x5b\xcc\xda\x50\x8c\x03\x9f\x97\xf4\x45\xa2\x3e\x39" + "\xaf\x26\x83\x1d\x3c\xbf\x6e\x36\x40\x78\x29\x62\x91\xe5\x1b\xf0" + "\x68\x4b\x06\x62\x51\x7b\x1f\x3c\xbf\x3f\x1b\xaf\xd7\xe1\xf5\xcd" + "\x0d\x8c\x63\x3b\xee\xdf\x9c\x87\xf7\xd1\x27\x92\xf3\x24\x60\xc9" + "\x45\xc8\xd8\x50\x12\x6d\xcd\x62\x69\xdb\x63\xdd\x30\x47\x75\x10" + "\x7a\x3d\x68\x27\xe4\x51\x25\xd8\x6a\x05\xee\x67\xeb\x7d\x03\x5f" + "\x57\xd0\xd7\x0c\x04\x6d\x06\x3e\x93\xec\x1b\xf6\x98\x54\xf6\x15" + "\x98\x46\xcc\xcf\xc9\x9c\xfb\xe0\xde\x88\x9b\xd0\x76\x77\xba\x87" + "\xc5\x28\xf3\x98\xa5\x1b\xca\x01\xcb\x0b\xcb\x45\xa1\x13\xb1\x62" + "\x04\x5d\x7b\xf8\x35\xc7\x06\xe6\xb5\x31\x8c\xd6\xa0\xbc\x5b\x76" + "\xf8\xd3\x78\x6f\x33\xc4\x3d\x25\x85\xaf\x13\x8c\xeb\x8a\x81\xde" + "\x3d\xa6\xf5\x0e\x02\x3a\x2a\x31\x4f\x41\xee\x08\xe2\x11\xae\x6b" + "\xa4\x38\x6a\xa0\x3d\x9f\x08\xfb\x6c\x77\xfd\x1f\x7e\xc0\x13\x5f" + "\xc3\xbc\xeb\x3f\x96\xb7\xd1\x95\x11\x47\x18\x1e\x52\x89\xee\x9c" + "\x38\xfc\x41\xa9\xed\x90\xca\x7a\xf8\xde\x83\x50\x5f\xdc\x3a\x86" + "\x4f\xf7\x2a\xeb\x4a\x86\xc7\x75\xf7\xa9\x30\xcd\xf0\x6c\xa5\xa4" + "\x87\xa5\x99\xe1\x29\x8b\x61\xa0\x86\xae\x83\x74\x76\xe0\x60\x98" + "\x51\x2a\xe7\x1a\xaf\x3c\x91\x6c\x1f\x5a\x8f\x6b\x1c\x23\x27\x41" + "\xbf\xfb\xae\x56\xbb\x9b\x97\xb0\xec\x5d\xac\xec\x87\xcf\x2a\xe6" + "\xed\xad\xc4\x5b\xc3\xf8\xfd\x30\x0f\x0c\xa3\x2d\x2b\x18\x7e\xd1" + "\x96\x8c\xc5\x68\x4b\x25\xb3\x23\x43\x47\xe0\xde\x69\x8c\x1f\x74" + "\xa5\x48\xf5\x55\xd6\x35\x07\x75\x3d\x03\x5c\x85\x36\x41\xdc\xb5" + "\x8c\xff\x7e\xc6\x70\x30\x57\xb2\xbd\xda\x96\x85\xcf\x86\xcd\x6a" + "\x13\xd8\xb3\xd5\x20\xb7\xc7\xc6\xd7\x88\x1b\x00\xcf\x97\xb1\xef" + "\x36\xc5\xd1\xa5\xc8\xd1\xf8\x7b\x64\x38\x7f\x51\xf7\x00\x60\xb5" + "\x89\x88\xa0\x2f\x08\x31\x2a\xe3\xa2\x59\x1c\xbd\x09\xd7\x8f\x81" + "\xbc\xde\x03\x7d\xa4\x32\xcc\x6f\xc4\x32\xf4\x91\xa6\xb7\xe6\x8e" + "\xd8\x23\xe3\x16\xe2\x29\xc0\xbc\xe7\xe5\x33\xe2\x7b\xc0\x71\xa5" + "\x1b\x5b\x23\xbe\x97\xf2\xb1\x0c\xf2\x31\x08\xe2\x7b\x4a\x4a\x57" + "\x19\xc8\x43\x5f\x6c\xf4\x12\xc9\xf6\x5d\x5c\x3e\x7c\x90\x5c\x0e" + "\x52\x5d\xad\xc9\x46\xfe\x65\x65\x10\x5e\x2a\x3d\x5b\xca\xe3\x0a" + "\x7f\x5d\x96\xc5\x3e\x22\x5b\xef\x19\xc2\x90\x07\xa7\x40\xd9\x33" + "\xee\x5b\xdf\xce\xe4\x24\x6e\xac\xe2\x71\x8c\x9e\xc7\x70\x08\xfd" + "\x1e\x37\x8e\xc2\x37\x7a\xf1\x13\x72\xb1\xf1\xe8\x56\xbe\x9e\x1e" + "\x62\x09\x39\x15\xc7\x49\xa0\x6f\xa1\x54\x7f\x64\x9b\xbf\xf5\xc4" + "\xca\xe8\xdb\x01\x2b\x93\x14\xba\xeb\x7c\xb5\x73\xc5\x9c\x03\x0b" + "\xf8\x33\x23\xc7\x4b\x69\xdb\xc3\xd3\x26\x5d\x63\xbe\x6d\xc6\x7c" + "\x1b\x75\x56\x91\x8f\x90\x6f\xa3\x1e\x94\xe4\x2b\x91\xcb\xdd\xf5" + "\x75\xe4\x4e\xb9\x2e\x77\xe6\x8b\x51\xf1\x58\x1f\xdc\x76\x8d\x4c" + "\xf1\xe2\x8b\x4a\xdf\x7c\x31\x32\x46\x4a\x6f\x89\x57\xdd\x28\xe5" + "\xb6\x4b\x6d\x0b\x94\xc3\x51\xab\xb4\xae\x21\x84\x21\x7f\x62\xdc" + "\xca\x36\xa8\x88\xe7\xab\x54\x97\x47\xcd\xe8\x5c\x0e\xa3\x44\x65" + "\x7d\xc6\xb2\x46\x4e\x40\x1d\x58\xa6\xac\x5f\x09\x61\xbc\x5c\x47" + "\xd6\x23\x37\x28\x39\x1a\x64\xf3\x5c\x14\xeb\xcb\xa8\x20\xcf\xba" + "\x38\x32\x4d\xaa\x8b\x72\xdc\x27\xa0\x8c\xa2\x15\xf1\x6e\xf4\x8a" + "\x17\xcb\xa6\x8a\xad\x3f\xc3\xd2\x38\xea\x90\xdc\xa6\xa1\x3c\x3c" + "\x9b\x0e\xcf\x94\x7b\xb5\x8f\x46\xb4\x0f\xe2\xd2\x33\xce\xca\x67" + "\x5c\x91\xde\xca\xed\xa9\x28\x96\xda\x09\x08\x8b\x96\xc2\x32\xa5" + "\xb6\x44\xc6\x4d\x94\xa7\x4d\xa3\x35\xbe\xfb\x47\x23\xf5\x72\xff" + "\x88\xe9\x62\x5c\x34\x3a\x54\x4a\x1f\x86\x4d\xe2\x61\xe1\xf5\x18" + "\x96\xcd\xf3\x21\x8f\xb2\xf6\x2a\x3c\x53\x6a\xaf\xb0\x7e\x09\x0d" + "\xe2\x08\x0b\xd6\x31\xbc\x06\x1d\x49\xa8\xdf\x9c\xd9\x8e\x63\x88" + "\x5d\x70\x6f\x3b\xf2\x01\xf2\x05\x7e\x6f\xcc\x8e\xf3\xd9\xf1\x5d" + "\xe4\x1d\xec\x87\xe0\x7d\x90\xdb\x88\x5c\x04\xe1\x9f\xe2\x5c\x83" + "\xf4\xbb\x20\xd0\x3b\x7a\x8f\xf4\xec\x49\xd6\x57\xf8\x2e\x2e\x40" + "\x0e\x93\x9f\x03\x6e\x78\x11\x9f\xc3\xe7\x65\xfe\x42\xee\x72\x20" + "\x37\xb1\xf8\x74\x63\x24\x8c\xb3\x71\x83\xdc\x2f\xb2\x0b\x0a\x59" + "\x5c\x9f\x8d\x71\x9a\x6e\x39\xe7\x33\xdd\x6f\xf0\x59\x56\x7e\xc0" + "\x95\x9b\xdb\xe8\x57\xc5\xa9\x44\x2c\xba\x80\xbc\x38\x64\x31\xb7" + "\x53\x57\xc9\xd3\xa1\xdb\xc2\xd2\xc1\x39\xd5\xc8\x6d\x19\xb2\xb8" + "\xa8\x9d\xdd\x2b\xc4\xb4\xe0\xbd\x1c\xc5\x3d\x5c\x6f\x11\xee\xb1" + "\xb5\xf5\xbc\x9f\x73\xd9\x93\x3a\xc9\x17\xb7\xb3\x71\x5f\x50\x51" + "\xbe\xcc\xbd\x63\x66\x49\x76\x5e\x94\x79\x17\xf2\x65\x2b\x72\x2f" + "\xbb\xb7\x4c\x92\x99\x2f\x1d\x19\xbf\x8f\x89\xe2\xf9\xaa\x15\xa4" + "\xfc\xde\xce\xd3\x31\xe6\x76\x36\xce\xfe\xce\x00\x79\x3b\x26\x5c" + "\xce\x5b\xe5\x39\xd6\x1f\x88\x1f\xfb\x92\x9c\x57\x36\xb2\x31\x6c" + "\x01\xca\xa0\x4d\xbc\x8d\xd0\x85\x7a\xf7\xa9\xcf\x88\x63\xdf\xc6" + "\x76\x89\xf7\x55\xc7\xee\x90\x7c\x53\xc4\x94\xfa\x3b\x68\x17\xc6" + "\xd4\xcb\x1c\x43\x5b\xe3\x08\xae\xdb\x04\xb6\x9c\xc4\x30\x5c\x73" + "\x4b\x29\x83\xfc\xb4\xaf\xbd\x41\xd2\x39\xa6\x52\xe6\x0d\xe4\x92" + "\xa3\xd6\x53\x52\x9f\x2e\x22\xa9\x48\xe2\x92\x73\x62\x44\xb2\x67" + "\x3f\x2c\x22\xd9\x93\x33\xc6\x6e\xf2\xe6\x0c\xe8\x37\x6f\x6d\xcd" + "\x8d\x98\xed\xd1\x0f\x80\xb0\xcb\x73\x47\x84\x06\xeb\x28\xae\xf7" + "\xca\xf8\x89\xf9\xdb\x22\x3e\x97\x6d\x46\xde\x6c\xd9\x20\xfb\x2f" + "\xc6\xae\xc0\xbe\x9a\x57\x7c\x7b\x3c\xb8\x13\xe3\x93\xf5\x89\x04" + "\xd7\x0c\x85\x7c\x40\x7f\x4b\xc4\x46\x89\xe7\x4b\x3c\xb8\x52\x6a" + "\xc3\x90\x27\x3d\xdb\xaa\x21\xbf\xf1\x6c\xab\xc6\x3e\xd8\x99\x23" + "\xc7\xea\xbb\xde\x56\x8d\x25\xc8\x5b\x32\x47\x7a\x72\xc1\xd8\x89" + "\x45\x1e\x7d\xd9\x88\x0a\xb9\x2f\xeb\xe6\xd1\x88\x39\xc8\x51\x10" + "\x7f\xa5\x14\x37\xf4\x89\x07\x97\xc9\x71\x03\x8e\xea\x8f\xc2\x10" + "\x92\xe6\x0e\xd1\xc0\xf9\x36\xa9\x0f\xc8\xea\x66\x3b\xae\xef\x27" + "\xea\x6a\x01\x7f\x03\x10\x67\xa6\x95\x17\xc8\x69\x77\x5b\x51\xd5" + "\xb2\x4a\xce\xdf\xc8\x19\xca\x7e\x61\x61\x3e\xdd\xd6\x9a\x1b\x39" + "\x50\x99\xc6\x17\x21\x2c\x47\xf2\x21\xb0\xbc\x65\xba\xc6\x36\x14" + "\xe7\x7b\xa6\x8d\xa7\x23\x32\x14\xd3\x81\x63\x22\x88\xff\x18\xf6" + "\x7b\x70\xcd\x67\xa8\x37\x86\xe2\x0e\xcc\x0f\xdd\xd3\x96\xa5\xec" + "\x5f\x0d\xa9\x40\xae\x94\xc6\x9e\xd5\xd0\xdf\x31\x2a\x7d\x31\xf3" + "\xee\x4d\xd0\xa5\xa4\x26\xaf\x4c\x5b\x36\x4d\x97\xbc\x32\x39\x2d" + "\x79\xc9\xf2\xe4\xf5\x4b\xd2\x92\x57\xad\x9c\xb8\x62\xc9\xe3\xc9" + "\x8f\xea\xd6\x2d\x59\xad\x8b\x4e\x8f\x4a\x1f\x40\xdc\xa2\x77\xe8" + "\x96\xac\x5e\xbd\x66\xc5\x63\x4b\x75\x2b\x93\x1f\x9d\x94\xfa\xd8" + "\xea\xc7\xd2\x74\x4b\x52\x57\xad\x59\xb9\x54\x17\xb5\x74\x72\x54" + "\xf4\xcc\xa5\x03\x94\x3e\xb4\x08\x0d\x69\x76\x5d\x6a\x6c\xcc\xb9" + "\x44\x82\xd4\xaa\x94\x54\x75\x7a\xf2\x4a\xee\xb3\x8b\xda\x34\x25" + "\x8f\xa4\xc0\xfd\x81\xc5\xb9\x98\xd7\x91\x46\x38\x8a\x28\x07\xe9" + "\xd4\xc1\x79\x10\xd8\x1e\xde\x9a\x1b\x15\xd3\x20\x8e\xd7\x63\x9e" + "\x41\x5e\xe8\x20\x6d\xe1\xf4\x52\x75\x23\xf4\xd9\x52\xf0\x3b\x83" + "\xe2\x4b\x24\xd4\xb8\x96\x88\xb0\x0f\x84\x5d\x23\x68\xd0\xd7\x15" + "\x95\xd6\x20\x8e\x33\x72\x9f\xe8\xb8\x50\xcb\xe0\xd8\x70\x6a\x8c" + "\x0d\xe7\xe5\x32\x6e\xb0\xec\x0b\x5f\xf0\x2c\x59\x80\xf8\x3c\x25" + "\x8e\x63\xdf\x16\x3c\x03\x58\x46\x5f\x70\xcb\x07\xf7\xc4\x40\x7f" + "\xb0\x1e\xfd\xb9\x70\x6f\xb0\x55\x20\x03\xc1\x2e\xf1\xe0\xc6\x68" + "\xf2\x12\xc4\xb5\x5a\x4b\x29\xc4\x51\x27\xfb\xd3\x20\x0d\x1a\x48" + "\x4b\x9d\x94\x8e\xbf\xb0\x74\xe4\xd3\xc8\xbc\x10\xb0\x2f\x17\xed" + "\x19\x27\xca\x69\x00\xbb\xe1\xb9\xa8\x24\xb0\x53\x83\x76\xf9\xf2" + "\xf5\xa1\xbf\x0b\xec\x9c\xe7\x5a\x0b\xf9\x36\x8a\xaf\x19\x9b\x53" + "\xc4\xeb\x1f\xa4\x67\x6b\x31\x9c\x67\x5f\x20\x03\x5f\x4c\x25\xa1" + "\x34\x6b\x34\x3d\x62\x75\x10\x73\x52\x1d\x51\x3f\x4d\x2d\xf4\xcf" + "\x8d\x8d\x52\x9a\xd2\x91\x1b\xfe\xf4\x44\x9d\x88\x69\x82\xb6\x62" + "\x60\xf1\x05\xbf\xbe\x45\xf1\xa5\x30\x6a\xa5\xbb\x95\x7d\xae\x71" + "\x5f\x61\x9e\x60\x7f\xab\x05\xda\x29\x48\x03\xe0\x6b\x9c\x4e\xea" + "\x1b\x5b\xa9\x7d\xb1\xa2\x2f\x35\x0e\x71\x66\xf5\xa3\x3b\x48\xd6" + "\x4d\x05\xb6\xd6\xb2\x96\x97\xff\x2d\xf3\xe0\x19\x8b\x5b\xff\x2d" + "\x7a\x6f\xfd\xa8\x13\xce\x2d\x72\x3c\x7c\x1c\x7e\x0b\xf6\x09\x2c" + "\x80\x65\x8b\x9f\xf8\x22\x73\xf3\xe9\x31\x33\x84\xe7\xb4\x11\x11" + "\x64\x8f\x15\xe7\x33\xfd\xdb\xa0\x0e\x35\xa3\xfe\x67\xc2\x08\xd9" + "\x0a\x32\x2d\xb9\xe3\x74\xe8\xdf\x85\x7b\x38\x26\xd6\x7a\xfb\xac" + "\x25\x3c\xdf\xe1\x85\xe7\x98\x5c\xec\x13\xe6\x81\x7e\xc0\x50\xce" + "\x45\x68\x87\xe1\x7a\x72\x1e\xd1\x63\x3c\x70\x5e\x8b\xfe\x10\xd0" + "\x69\x93\xe3\xa3\x80\xff\x6c\x17\xf7\xc1\x48\xd8\x9a\x68\x4e\x6f" + "\xc4\x39\xc3\xe8\x41\xe0\x77\xb4\x11\x31\xd6\x9a\xab\x9f\x28\x63" + "\x0a\xb0\x7e\x8c\xe1\x2a\x94\xe8\x69\xee\x2d\xe5\xc5\x21\x20\x07" + "\xb8\x2a\x02\x3c\x21\xae\x40\xd6\x20\x63\x0a\xb0\x56\x8b\x72\x60" + "\xc3\x80\xf2\xf5\x31\x22\x72\xe4\x69\x51\x7f\x04\x31\x46\xff\xf3" + "\x17\x75\xf4\xe6\x5f\xd7\xf1\x72\xd2\x1f\xc1\xd9\x85\x31\x3f\xdd" + "\xf9\xae\x2f\x51\xe4\x7b\x2d\xe0\x78\x00\xe6\x33\xf7\x55\xeb\x8f" + "\x80\x6d\xb5\xac\x2f\xbe\x09\xca\x80\xb5\x55\x7a\x36\x8e\x97\xf2" + "\xb0\xc6\x9d\x87\xfa\x46\x5f\x79\xe8\x95\x77\x22\xee\x34\x57\x6f" + "\xc5\xba\xd2\x9a\x3b\x3e\xbc\x41\xbc\xc5\xef\xbb\x02\x88\x43\x14" + "\xf3\x48\x10\xc6\x51\x15\xca\xe4\xef\x93\xe3\xc8\x81\xbc\xb6\x64" + "\x24\x5d\x16\xcf\x55\x25\x84\xa0\x4f\x1c\x9f\x8f\x0c\xc5\xfc\x1d" + "\xbf\xdd\xfd\x3c\xb5\x7a\x3f\x1f\xf5\xa8\x87\xad\x6c\xa7\xb9\xe3" + "\x4b\x5e\x0a\x01\x1c\x71\x7b\x6b\x2e\x67\x6f\xa4\x8e\xb7\x93\xa6" + "\x08\xc4\xf7\x84\x40\xf3\x2e\x42\x30\x8c\x5f\x8f\xb7\xb6\x40\xdb" + "\xe3\xed\xdf\xf7\xff\xbe\x61\xc2\x5c\xcf\xf7\x0d\x13\xa6\xfb\x7b" + "\xdf\xe0\x15\xef\x16\x8c\xd7\x55\xbc\x50\xe5\x8e\x7b\xc2\x72\x97" + "\x8f\xb8\xe5\xe7\x27\x97\x28\xc7\x33\x13\x3e\x47\x1b\x8e\x42\x3b" + "\x45\x47\x2c\x54\x51\xd0\x53\xc5\xda\xf0\x09\xb5\xbc\xff\x82\xfd" + "\xa2\x09\xe5\x28\xe3\x9d\x8e\x8e\x2d\x28\xf4\x23\x3c\xb4\xb1\x8b" + "\xc0\x9f\x11\x64\x57\x72\x5b\xa2\x7c\x5b\xf0\x10\x26\xd4\xc7\xc5" + "\x40\x42\x66\x31\x79\x0a\x1b\x0f\x92\xae\x2d\xec\x42\xec\x90\xef" + "\xb8\xdf\x8b\xed\x26\x6e\x2f\xd3\x67\x23\x2a\x29\xbe\x4c\x85\xc4" + "\x9c\xcb\x3c\x4d\x89\xfc\x88\xaf\x0d\x3d\x03\x99\x0b\x03\x41\x5f" + "\x09\x13\xa6\xd4\x21\xe9\x97\xaf\xa9\xf2\x1a\x43\x3c\xaf\x61\x0b" + "\x58\xac\x88\x60\x74\xc0\x52\xf6\xd9\xd8\xbf\x1f\xeb\x08\x12\x4a" + "\x34\xca\x28\x35\x24\x33\x90\x9d\xa8\xf1\x8f\x0d\xf4\xe9\xe1\xfe" + "\x2c\x53\x87\xc0\x10\xeb\x16\x85\xf8\x67\xdc\xfc\x3b\x3c\x74\xf4" + "\x72\x1b\xa5\x38\x1f\xcd\x0f\xb7\xd7\xf6\xa1\xfe\xcb\x6f\xba\xda" + "\x9b\xe4\x53\x37\x3c\xee\x58\xe8\x4b\xd4\x9d\xff\x77\x54\xc8\x41" + "\x4a\x84\xba\xef\xdf\x15\xed\x79\x1d\xe3\x75\xff\x9e\x84\x3e\xb0" + "\x9c\x98\xf0\x4f\x46\x03\xf4\x51\x7e\x1a\xde\x11\xa8\xf6\xaa\x32" + "\x6a\xa3\x57\x15\x72\x6f\x92\x35\x01\x60\x4f\xa9\x22\x58\xf4\x2d" + "\x7d\x75\xb6\xe1\x5b\xa4\x0a\x31\xda\xd2\x19\x53\x77\x7b\x85\xe1" + "\xf5\x0d\x3a\x29\x6c\xea\x47\x9d\xe4\x59\x98\x4e\x71\xad\x8a\x81" + "\x3f\x25\x84\xcc\x4e\xec\x03\x53\xaf\x6f\x3f\xc6\x4d\x85\xf5\xe3" + "\xfa\x76\x95\x36\xca\x5b\x71\x60\x22\x76\xc0\x7f\xb4\x83\x28\xa9" + "\x74\x83\x4a\x01\x54\x3a\xe9\x93\x76\xfc\xfa\x76\x7d\xbb\xbe\x5d" + "\xdf\xae\x6f\xd7\xb7\xeb\xdb\x35\xb0\xa9\x94\x03\x6b\x9c\x07\xf7" + "\x46\xe9\xa8\x1c\xff\xa8\xa4\x5d\x19\x26\xf4\xe6\x39\x2a\x6d\x24" + "\x33\xc6\xa4\x2b\x49\x6c\xd0\x18\x13\x6a\xa3\xcb\x53\x2c\x41\xdb" + "\xe2\xaa\xf5\x65\x49\x8d\xda\x5d\x86\xba\x59\x95\xe9\x36\x71\xeb" + "\x9c\xaa\xc8\xd2\xa5\xa7\x43\xf3\x16\x1e\x9b\x5e\x91\x66\x1d\xb8" + "\xfd\xbe\x9a\x89\x7b\x96\x37\x87\x17\x2c\xae\x9f\xbd\x7f\xa3\x43" + "\xc8\xba\xe7\xe3\x88\xdf\x3d\x72\x2a\x24\xf7\x3f\xbe\x98\xf6\x4e" + "\xea\x85\x01\xcf\xff\xfc\xf0\x84\x3f\x3c\xd1\x34\xfc\x95\x45\x7f" + "\xbf\xe3\xbf\xd6\xb7\xdf\xf0\xdb\x9f\xfd\xf7\xb8\x37\x96\x9d\x09" + "\xcb\x7f\xe0\xaf\x33\xff\xbc\xf6\x52\x70\xf6\xfc\xa3\x93\xdf\x5a" + "\x79\x6e\x54\xd1\x43\xff\xbc\xeb\x83\xcd\x2e\xd5\x96\x9f\x7e\x34" + "\xe6\xd5\x25\x5f\x0d\xde\xf1\xcb\xcf\xa7\xbe\xfd\xd4\xf7\x37\x3d" + "\x17\xff\xe9\xf8\x37\x93\xbf\x1d\xf6\xf2\x83\x27\x6e\x7f\xff\xe9" + "\xb6\xc0\x67\xe7\x1e\x8a\x7a\xfd\xb1\xaf\x87\xee\xbc\xff\xf8\x8c" + "\x77\xd7\x5c\x1c\xf4\xe2\xbc\x23\x93\xf6\xae\x38\x3b\xb2\xf0\x37" + "\x27\xef\x3c\xb0\xc9\x19\xf0\xcc\xbd\x07\xc7\xbe\xf6\xe8\xff\x0e" + "\x79\xe9\xff\xfc\xcf\xad\x7f\x5a\xdd\xf2\x93\x17\x7e\xf1\xd9\xbf" + "\xfd\xf1\xc9\xef\x46\xec\xfe\xf5\x3f\xfe\xfd\x2f\x1b\xec\x37\xfe" + "\xdf\xd8\x4f\x6e\xf9\xfd\xe3\xdf\xdc\xfc\x9f\xbf\xfa\xdb\x6d\xef" + "\xad\x6b\x55\xe7\x2c\x30\x4f\xd9\xb7\xea\xfc\xe8\xe2\x87\xbf\xbc" + "\xfb\xc3\x0c\xda\x9b\xfc\x23\xe2\x86\x7b\xfb\xb3\xdc\xdc\x9d\x47" + "\x0c\x2e\xaa\xeb\xb1\x1e\x41\x25\x95\x3f\x0f\xc8\x9c\x41\x54\x41" + "\xe4\x06\xb1\x07\x23\x86\x9e\xa6\xdb\xcf\xa6\x53\x3e\xdf\x95\x0d" + "\xfd\x15\x53\x61\xbf\x15\xf6\x11\x2c\xc4\xed\x05\x88\xec\xa2\x8e" + "\xfe\xdb\x54\x90\x07\x01\x60\x61\x20\xb9\x01\x72\x2d\x88\xdc\x44" + "\x06\x90\x9f\x90\x81\x64\x10\x09\x26\x6a\xa2\x21\x83\x49\x08\x19" + "\x42\x42\xc9\x50\x12\x46\x6e\x26\x5a\x32\x8c\x0c\x87\x54\x85\x93" + "\x91\x64\x14\x19\x0d\x99\x33\x86\x44\x90\xb1\xbe\xd3\x95\x49\x62" + "\xb4\xf0\x07\xfe\x27\x30\xaf\x4d\x26\x49\xbc\x1e\xde\xaf\xe1\x26" + "\x29\xbc\x56\x0a\x6f\xb8\x1e\xde\xaf\xe1\xba\x7f\xf1\x71\xcc\xbf" + "\xf4\xa8\x82\x6e\x04\xef\x49\x78\xf4\x27\x3a\x36\xef\x50\x95\xb4" + "\x75\x5c\x93\x2b\x3c\xdf\x49\x9f\xe7\xf3\xde\x5b\x0c\xec\xd3\xf9" + "\x69\x06\x21\xd2\xbb\x07\xaa\xdc\x1c\xe7\x3c\xb6\x7c\xd5\xc7\xe2" + "\xe0\x4c\x7c\xab\x12\x44\x42\xd9\xdf\x2e\x6c\xf8\x66\xf1\xe0\x56" + "\xd8\x8d\xb0\xbf\x04\x7b\x31\xec\x6f\xca\x51\x11\x55\x84\x96\xa8" + "\xc6\x26\xc0\xb1\x02\x8e\xcd\x44\x15\x99\x49\x54\xb7\x80\xf1\x51" + "\x26\xa2\xd2\xc7\xb8\x13\x33\xb5\xa1\xc3\x6a\xd5\x14\x29\x5c\x07" + "\xe7\xd3\x93\xbc\x22\xec\x6e\x7b\x67\x9a\xbb\x30\x4e\x37\x75\xf2" + "\xf4\xc9\x33\x66\xe8\x26\x25\x4c\xd2\x4d\x8b\x9e\x3a\x6d\x4a\xf4" + "\xf4\x29\xd3\xa6\xea\xa2\xa7\xde\x31\x7d\xd6\x1d\xb7\x4e\xd7\xad" + "\x78\x3a\x35\x79\x6a\xf4\xe3\x8f\xe9\x56\x2e\x4d\x5e\xad\x5b\x96" + "\x9c\xba\x62\xdd\x92\xd4\xc7\xba\x92\xfc\xee\x6c\x90\x1c\x32\xd2" + "\xc9\xcd\x54\x96\x9a\x8a\xdc\x4d\xc4\x5b\x75\x44\x8c\xd5\x91\x4e" + "\xc5\xac\x32\x4a\x49\xd2\x4b\x7b\xa7\x6d\xc5\xa2\x07\xfe\x1e\xf5" + "\xeb\xe0\x8f\x7f\xfa\x78\xd4\x9d\xf7\xbe\x96\x53\x4e\x84\x3b\x6a" + "\x89\x30\x2d\x9d\x08\x90\xbf\x42\x78\x1a\x11\xd4\xa1\x44\x58\x2b" + "\x12\x61\x85\x91\x08\x8f\xce\x26\xc2\xaf\x16\x12\x21\xbe\xae\x73" + "\xd8\xb3\x91\x3c\xac\x12\xc2\xde\xd2\x12\xe1\x77\x1a\x22\xe4\x25" + "\xf0\x30\x33\x98\x51\x95\xd2\xd7\x59\xd2\x07\x5b\x77\xf1\xa0\xfa" + "\x7f\x32\xf2\xad\x0d" ; diff --git a/sys/dev/nand/nand.c b/sys/dev/nand/nand.c new file mode 100644 index 00000000000..f46d0f05419 --- /dev/null +++ b/sys/dev/nand/nand.c @@ -0,0 +1,834 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "nfc_if.h" +#include "nand_if.h" +#include "nandbus_if.h" +#include + +#define NAND_RESET_DELAY 1000 /* tRST */ +#define NAND_ERASE_DELAY 3000 /* tBERS */ +#define NAND_PROG_DELAY 700 /* tPROG */ +#define NAND_READ_DELAY 50 /* tR */ + +#define BIT0(x) ((x) & 0x1) +#define BIT1(x) (BIT0(x >> 1)) +#define BIT2(x) (BIT0(x >> 2)) +#define BIT3(x) (BIT0(x >> 3)) +#define BIT4(x) (BIT0(x >> 4)) +#define BIT5(x) (BIT0(x >> 5)) +#define BIT6(x) (BIT0(x >> 6)) +#define BIT7(x) (BIT0(x >> 7)) + +#define SOFTECC_SIZE 256 +#define SOFTECC_BYTES 3 + +int nand_debug_flag = 0; +SYSCTL_INT(_debug, OID_AUTO, nand_debug, CTLFLAG_RW, &nand_debug_flag, 0, + "NAND subsystem debug flag"); + +static void +nand_tunable_init(void *arg) +{ + + TUNABLE_INT_FETCH("debug.nand", &nand_debug_flag); +} + +SYSINIT(nand_tunables, SI_SUB_VFS, SI_ORDER_ANY, nand_tunable_init, NULL); + +MALLOC_DEFINE(M_NAND, "NAND", "NAND dynamic data"); + +static void calculate_ecc(const uint8_t *, uint8_t *); +static int correct_ecc(uint8_t *, uint8_t *, uint8_t *); + +void +nand_debug(int level, const char *fmt, ...) +{ + va_list ap; + + if (!(nand_debug_flag & level)) + return; + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); + printf("\n"); +} + +void +nand_init(struct nand_softc *nand, device_t dev, int ecc_mode, + int ecc_bytes, int ecc_size, uint16_t *eccposition, char *cdev_name) +{ + + nand->ecc.eccmode = ecc_mode; + nand->chip_cdev_name = cdev_name; + + if (ecc_mode == NAND_ECC_SOFT) { + nand->ecc.eccbytes = SOFTECC_BYTES; + nand->ecc.eccsize = SOFTECC_SIZE; + } else if (ecc_mode != NAND_ECC_NONE) { + nand->ecc.eccbytes = ecc_bytes; + nand->ecc.eccsize = ecc_size; + if (eccposition) + nand->ecc.eccpositions = eccposition; + } +} + +void +nand_onfi_set_params(struct nand_chip *chip, struct onfi_params *params) +{ + struct chip_geom *cg; + + cg = &chip->chip_geom; + + init_chip_geom(cg, params->luns, params->blocks_per_lun, + params->pages_per_block, params->bytes_per_page, + params->spare_bytes_per_page); + chip->t_bers = params->t_bers; + chip->t_prog = params->t_prog; + chip->t_r = params->t_r; + chip->t_ccs = params->t_ccs; + + if (params->features & ONFI_FEAT_16BIT) + chip->flags |= NAND_16_BIT; +} + +void +nand_set_params(struct nand_chip *chip, struct nand_params *params) +{ + struct chip_geom *cg; + uint32_t blocks_per_chip; + + cg = &chip->chip_geom; + blocks_per_chip = (params->chip_size << 20) / + (params->page_size * params->pages_per_block); + + init_chip_geom(cg, 1, blocks_per_chip, + params->pages_per_block, params->page_size, + params->oob_size); + + chip->t_bers = NAND_ERASE_DELAY; + chip->t_prog = NAND_PROG_DELAY; + chip->t_r = NAND_READ_DELAY; + chip->t_ccs = 0; + + if (params->flags & NAND_16_BIT) + chip->flags |= NAND_16_BIT; +} + +int +nand_init_stat(struct nand_chip *chip) +{ + struct block_stat *blk_stat; + struct page_stat *pg_stat; + struct chip_geom *cg; + uint32_t blks, pgs; + + cg = &chip->chip_geom; + blks = cg->blks_per_lun * cg->luns; + blk_stat = malloc(sizeof(struct block_stat) * blks, M_NAND, + M_WAITOK | M_ZERO); + if (!blk_stat) + return (ENOMEM); + + pgs = blks * cg->pgs_per_blk; + pg_stat = malloc(sizeof(struct page_stat) * pgs, M_NAND, + M_WAITOK | M_ZERO); + if (!pg_stat) { + free(blk_stat, M_NAND); + return (ENOMEM); + } + + chip->blk_stat = blk_stat; + chip->pg_stat = pg_stat; + + return (0); +} + +void +nand_destroy_stat(struct nand_chip *chip) +{ + + free(chip->pg_stat, M_NAND); + free(chip->blk_stat, M_NAND); +} + +int +init_chip_geom(struct chip_geom *cg, uint32_t luns, uint32_t blks_per_lun, + uint32_t pgs_per_blk, uint32_t pg_size, uint32_t oob_size) +{ + int shift; + + if (!cg) + return (-1); + + cg->luns = luns; + cg->blks_per_lun = blks_per_lun; + cg->blks_per_chip = blks_per_lun * luns; + cg->pgs_per_blk = pgs_per_blk; + + cg->page_size = pg_size; + cg->oob_size = oob_size; + cg->block_size = cg->page_size * cg->pgs_per_blk; + cg->chip_size = cg->block_size * cg->blks_per_chip; + + shift = fls(cg->pgs_per_blk - 1); + cg->pg_mask = (1 << shift) - 1; + cg->blk_shift = shift; + + if (cg->blks_per_lun > 0) { + shift = fls(cg->blks_per_lun - 1); + cg->blk_mask = ((1 << shift) - 1) << cg->blk_shift; + } else { + shift = 0; + cg->blk_mask = 0; + } + + cg->lun_shift = shift + cg->blk_shift; + shift = fls(cg->luns - 1); + cg->lun_mask = ((1 << shift) - 1) << cg->lun_shift; + + nand_debug(NDBG_NAND, "Masks: lun 0x%x blk 0x%x page 0x%x\n" + "Shifts: lun %d blk %d", + cg->lun_mask, cg->blk_mask, cg->pg_mask, + cg->lun_shift, cg->blk_shift); + + return (0); +} + +int +nand_row_to_blkpg(struct chip_geom *cg, uint32_t row, uint32_t *lun, + uint32_t *blk, uint32_t *pg) +{ + + if (!cg || !lun || !blk || !pg) + return (-1); + + if (row & ~(cg->lun_mask | cg->blk_mask | cg->pg_mask)) { + nand_debug(NDBG_NAND,"Address out of bounds\n"); + return (-1); + } + + *lun = (row & cg->lun_mask) >> cg->lun_shift; + *blk = (row & cg->blk_mask) >> cg->blk_shift; + *pg = (row & cg->pg_mask); + + nand_debug(NDBG_NAND,"address %x-%x-%x\n", *lun, *blk, *pg); + + return (0); +} + +int page_to_row(struct chip_geom *cg, uint32_t page, uint32_t *row) +{ + uint32_t lun, block, pg_in_blk; + + if (!cg || !row) + return (-1); + + block = page / cg->pgs_per_blk; + pg_in_blk = page % cg->pgs_per_blk; + + lun = block / cg->blks_per_lun; + block = block % cg->blks_per_lun; + + *row = (lun << cg->lun_shift) & cg->lun_mask; + *row |= ((block << cg->blk_shift) & cg->blk_mask); + *row |= (pg_in_blk & cg->pg_mask); + + return (0); +} + +int +nand_check_page_boundary(struct nand_chip *chip, uint32_t page) +{ + struct chip_geom* cg; + + cg = &chip->chip_geom; + if (page >= (cg->pgs_per_blk * cg->blks_per_lun * cg->luns)) { + nand_debug(NDBG_GEN,"%s: page number too big %#x\n", + __func__, page); + return (1); + } + + return (0); +} + +void +nand_get_chip_param(struct nand_chip *chip, struct chip_param_io *param) +{ + struct chip_geom *cg; + + cg = &chip->chip_geom; + param->page_size = cg->page_size; + param->oob_size = cg->oob_size; + + param->blocks = cg->blks_per_lun * cg->luns; + param->pages_per_block = cg->pgs_per_blk; +} + +static uint16_t * +default_software_ecc_positions(struct nand_chip *chip) +{ + struct nand_ecc_data *eccd; + + eccd = &chip->nand->ecc; + + if (eccd->eccpositions) + return (eccd->eccpositions); + + switch (chip->chip_geom.oob_size) { + case 16: + return ((uint16_t *)&default_software_ecc_positions_16); + case 64: + return ((uint16_t *)&default_software_ecc_positions_64); + case 128: + return ((uint16_t *)&default_software_ecc_positions_128); + default: + return (NULL); /* No ecc bytes positions defs available */ + } + + return (NULL); +} + +static void +calculate_ecc(const uint8_t *buf, uint8_t *ecc) +{ + uint8_t p8, byte; + int i; + + memset(ecc, 0, 3); + + for (i = 0; i < 256; i++) { + byte = buf[i]; + ecc[0] ^= (BIT0(byte) ^ BIT2(byte) ^ BIT4(byte) ^ + BIT6(byte)) << 2; + ecc[0] ^= (BIT1(byte) ^ BIT3(byte) ^ BIT5(byte) ^ + BIT7(byte)) << 3; + ecc[0] ^= (BIT0(byte) ^ BIT1(byte) ^ BIT4(byte) ^ + BIT5(byte)) << 4; + ecc[0] ^= (BIT2(byte) ^ BIT3(byte) ^ BIT6(byte) ^ + BIT7(byte)) << 5; + ecc[0] ^= (BIT0(byte) ^ BIT1(byte) ^ BIT2(byte) ^ + BIT3(byte)) << 6; + ecc[0] ^= (BIT4(byte) ^ BIT5(byte) ^ BIT6(byte) ^ + BIT7(byte)) << 7; + + p8 = BIT0(byte) ^ BIT1(byte) ^ BIT2(byte) ^ + BIT3(byte) ^ BIT4(byte) ^ BIT5(byte) ^ BIT6(byte) ^ + BIT7(byte); + + if (p8) { + ecc[2] ^= (0x1 << BIT0(i)); + ecc[2] ^= (0x4 << BIT1(i)); + ecc[2] ^= (0x10 << BIT2(i)); + ecc[2] ^= (0x40 << BIT3(i)); + + ecc[1] ^= (0x1 << BIT4(i)); + ecc[1] ^= (0x4 << BIT5(i)); + ecc[1] ^= (0x10 << BIT6(i)); + ecc[1] ^= (0x40 << BIT7(i)); + } + } + ecc[0] = ~ecc[0]; + ecc[1] = ~ecc[1]; + ecc[2] = ~ecc[2]; + ecc[0] |= 3; +} + +static int +correct_ecc(uint8_t *buf, uint8_t *calc_ecc, uint8_t *read_ecc) +{ + uint8_t ecc0, ecc1, ecc2, onesnum, bit, byte; + uint16_t addr = 0; + + ecc0 = calc_ecc[0] ^ read_ecc[0]; + ecc1 = calc_ecc[1] ^ read_ecc[1]; + ecc2 = calc_ecc[2] ^ read_ecc[2]; + + if (!ecc0 && !ecc1 && !ecc2) + return (ECC_OK); + + addr = BIT3(ecc0) | (BIT5(ecc0) << 1) | (BIT7(ecc0) << 2); + addr |= (BIT1(ecc2) << 3) | (BIT3(ecc2) << 4) | + (BIT5(ecc2) << 5) | (BIT7(ecc2) << 6); + addr |= (BIT1(ecc1) << 7) | (BIT3(ecc1) << 8) | + (BIT5(ecc1) << 9) | (BIT7(ecc1) << 10); + + onesnum = 0; + while (ecc0 || ecc1 || ecc2) { + if (ecc0 & 1) + onesnum++; + if (ecc1 & 1) + onesnum++; + if (ecc2 & 1) + onesnum++; + + ecc0 >>= 1; + ecc1 >>= 1; + ecc2 >>= 1; + } + + if (onesnum == 11) { + /* Correctable error */ + bit = addr & 7; + byte = addr >> 3; + buf[byte] ^= (1 << bit); + return (ECC_CORRECTABLE); + } else if (onesnum == 1) { + /* ECC error */ + return (ECC_ERROR_ECC); + } else { + /* Uncorrectable error */ + return (ECC_UNCORRECTABLE); + } + + return (0); +} + +int +nand_softecc_get(device_t dev, uint8_t *buf, int pagesize, uint8_t *ecc) +{ + int steps = pagesize / SOFTECC_SIZE; + int i = 0, j = 0; + + for (; i < (steps * SOFTECC_BYTES); + i += SOFTECC_BYTES, j += SOFTECC_SIZE) { + calculate_ecc(&buf[j], &ecc[i]); + } + + return (0); +} + +int +nand_softecc_correct(device_t dev, uint8_t *buf, int pagesize, + uint8_t *readecc, uint8_t *calcecc) +{ + int steps = pagesize / SOFTECC_SIZE; + int i = 0, j = 0, ret = 0; + + for (i = 0; i < (steps * SOFTECC_BYTES); + i += SOFTECC_BYTES, j += SOFTECC_SIZE) { + ret += correct_ecc(&buf[j], &calcecc[i], &readecc[i]); + if (ret < 0) + return (ret); + } + + return (ret); +} + +static int +offset_to_page(struct chip_geom *cg, uint32_t offset) +{ + + return (offset / cg->page_size); +} + +int +nand_read_pages(struct nand_chip *chip, uint32_t offset, void *buf, + uint32_t len) +{ + struct chip_geom *cg; + struct nand_ecc_data *eccd; + struct page_stat *pg_stat; + device_t nandbus; + void *oob = NULL; + uint8_t *ptr; + uint16_t *eccpos = NULL; + uint32_t page, num, steps = 0; + int i, retval = 0, needwrite; + + nand_debug(NDBG_NAND,"%p read page %x[%x]", chip, offset, len); + cg = &chip->chip_geom; + eccd = &chip->nand->ecc; + page = offset_to_page(cg, offset); + num = len / cg->page_size; + + if (eccd->eccmode != NAND_ECC_NONE) { + steps = cg->page_size / eccd->eccsize; + eccpos = default_software_ecc_positions(chip); + oob = malloc(cg->oob_size, M_NAND, M_WAITOK); + } + + nandbus = device_get_parent(chip->dev); + NANDBUS_LOCK(nandbus); + NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num); + + ptr = (uint8_t *)buf; + while (num--) { + pg_stat = &(chip->pg_stat[page]); + + if (NAND_READ_PAGE(chip->dev, page, ptr, cg->page_size, 0)) { + retval = ENXIO; + break; + } + + if (eccd->eccmode != NAND_ECC_NONE) { + if (NAND_GET_ECC(chip->dev, ptr, eccd->ecccalculated, + &needwrite)) { + retval = ENXIO; + break; + } + nand_debug(NDBG_ECC,"%s: ECC calculated:", + __func__); + if (nand_debug_flag & NDBG_ECC) + for (i = 0; i < (eccd->eccbytes * steps); i++) + printf("%x ", eccd->ecccalculated[i]); + + nand_debug(NDBG_ECC,"\n"); + + if (NAND_READ_OOB(chip->dev, page, oob, cg->oob_size, + 0)) { + retval = ENXIO; + break; + } + for (i = 0; i < (eccd->eccbytes * steps); i++) + eccd->eccread[i] = ((uint8_t *)oob)[eccpos[i]]; + + nand_debug(NDBG_ECC,"%s: ECC read:", __func__); + if (nand_debug_flag & NDBG_ECC) + for (i = 0; i < (eccd->eccbytes * steps); i++) + printf("%x ", eccd->eccread[i]); + nand_debug(NDBG_ECC,"\n"); + + retval = NAND_CORRECT_ECC(chip->dev, ptr, eccd->eccread, + eccd->ecccalculated); + + nand_debug(NDBG_ECC, "NAND_CORRECT_ECC() returned %d", + retval); + + if (retval == 0) + pg_stat->ecc_stat.ecc_succeded++; + else if (retval > 0) { + pg_stat->ecc_stat.ecc_corrected += retval; + retval = ECC_CORRECTABLE; + } else { + pg_stat->ecc_stat.ecc_failed++; + break; + } + } + + pg_stat->page_read++; + page++; + ptr += cg->page_size; + } + + NANDBUS_UNLOCK(nandbus); + + if (oob) + free(oob, M_NAND); + + return (retval); +} + +int +nand_read_pages_raw(struct nand_chip *chip, uint32_t offset, void *buf, + uint32_t len) +{ + struct chip_geom *cg; + device_t nandbus; + uint8_t *ptr; + uint32_t page, num, end, begin = 0, begin_off; + int retval = 0; + + cg = &chip->chip_geom; + page = offset_to_page(cg, offset); + begin_off = offset - page * cg->page_size; + if (begin_off) { + begin = cg->page_size - begin_off; + len -= begin; + } + num = len / cg->page_size; + end = len % cg->page_size; + + nandbus = device_get_parent(chip->dev); + NANDBUS_LOCK(nandbus); + NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num); + + ptr = (uint8_t *)buf; + if (begin_off) { + if (NAND_READ_PAGE(chip->dev, page, ptr, begin, begin_off)) { + NANDBUS_UNLOCK(nandbus); + return (ENXIO); + } + + page++; + ptr += begin; + } + + while (num--) { + if (NAND_READ_PAGE(chip->dev, page, ptr, cg->page_size, 0)) { + NANDBUS_UNLOCK(nandbus); + return (ENXIO); + } + + page++; + ptr += cg->page_size; + } + + if (end) + if (NAND_READ_PAGE(chip->dev, page, ptr, end, 0)) { + NANDBUS_UNLOCK(nandbus); + return (ENXIO); + } + + NANDBUS_UNLOCK(nandbus); + + return (retval); +} + + +int +nand_prog_pages(struct nand_chip *chip, uint32_t offset, uint8_t *buf, + uint32_t len) +{ + struct chip_geom *cg; + struct page_stat *pg_stat; + struct nand_ecc_data *eccd; + device_t nandbus; + uint32_t page, num; + uint8_t *oob = NULL; + uint16_t *eccpos = NULL; + int steps = 0, i, needwrite, err = 0; + + nand_debug(NDBG_NAND,"%p prog page %x[%x]", chip, offset, len); + + eccd = &chip->nand->ecc; + cg = &chip->chip_geom; + page = offset_to_page(cg, offset); + num = len / cg->page_size; + + if (eccd->eccmode != NAND_ECC_NONE) { + steps = cg->page_size / eccd->eccsize; + oob = malloc(cg->oob_size, M_NAND, M_WAITOK); + eccpos = default_software_ecc_positions(chip); + } + + nandbus = device_get_parent(chip->dev); + NANDBUS_LOCK(nandbus); + NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num); + + while (num--) { + if (NAND_PROGRAM_PAGE(chip->dev, page, buf, cg->page_size, 0)) { + err = ENXIO; + break; + } + + if (eccd->eccmode != NAND_ECC_NONE) { + if (NAND_GET_ECC(chip->dev, buf, &eccd->ecccalculated, + &needwrite)) { + err = ENXIO; + break; + } + nand_debug(NDBG_ECC,"ECC calculated:"); + if (nand_debug_flag & NDBG_ECC) + for (i = 0; i < (eccd->eccbytes * steps); i++) + printf("%x ", eccd->ecccalculated[i]); + + nand_debug(NDBG_ECC,"\n"); + + if (needwrite) { + if (NAND_READ_OOB(chip->dev, page, oob, cg->oob_size, + 0)) { + err = ENXIO; + break; + } + + for (i = 0; i < (eccd->eccbytes * steps); i++) + oob[eccpos[i]] = eccd->ecccalculated[i]; + + if (NAND_PROGRAM_OOB(chip->dev, page, oob, + cg->oob_size, 0)) { + err = ENXIO; + break; + } + } + } + + pg_stat = &(chip->pg_stat[page]); + pg_stat->page_written++; + + page++; + buf += cg->page_size; + } + + NANDBUS_UNLOCK(nandbus); + + if (oob) + free(oob, M_NAND); + + return (err); +} + +int +nand_prog_pages_raw(struct nand_chip *chip, uint32_t offset, void *buf, + uint32_t len) +{ + struct chip_geom *cg; + device_t nandbus; + uint8_t *ptr; + uint32_t page, num, end, begin = 0, begin_off; + int retval = 0; + + cg = &chip->chip_geom; + page = offset_to_page(cg, offset); + begin_off = offset - page * cg->page_size; + if (begin_off) { + begin = cg->page_size - begin_off; + len -= begin; + } + num = len / cg->page_size; + end = len % cg->page_size; + + nandbus = device_get_parent(chip->dev); + NANDBUS_LOCK(nandbus); + NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num); + + ptr = (uint8_t *)buf; + if (begin_off) { + if (NAND_PROGRAM_PAGE(chip->dev, page, ptr, begin, begin_off)) { + NANDBUS_UNLOCK(nandbus); + return (ENXIO); + } + + page++; + ptr += begin; + } + + while (num--) { + if (NAND_PROGRAM_PAGE(chip->dev, page, ptr, cg->page_size, 0)) { + NANDBUS_UNLOCK(nandbus); + return (ENXIO); + } + + page++; + ptr += cg->page_size; + } + + if (end) + retval = NAND_PROGRAM_PAGE(chip->dev, page, ptr, end, 0); + + NANDBUS_UNLOCK(nandbus); + + return (retval); +} + +int +nand_read_oob(struct nand_chip *chip, uint32_t page, void *buf, + uint32_t len) +{ + device_t nandbus; + int retval = 0; + + nandbus = device_get_parent(chip->dev); + NANDBUS_LOCK(nandbus); + NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num); + + retval = NAND_READ_OOB(chip->dev, page, buf, len, 0); + + NANDBUS_UNLOCK(nandbus); + + return (retval); +} + + +int +nand_prog_oob(struct nand_chip *chip, uint32_t page, void *buf, + uint32_t len) +{ + device_t nandbus; + int retval = 0; + + nandbus = device_get_parent(chip->dev); + NANDBUS_LOCK(nandbus); + NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num); + + retval = NAND_PROGRAM_OOB(chip->dev, page, buf, len, 0); + + NANDBUS_UNLOCK(nandbus); + + return (retval); +} + +int +nand_erase_blocks(struct nand_chip *chip, off_t offset, size_t len) +{ + device_t nandbus; + struct chip_geom *cg; + uint32_t block, num_blocks; + int err = 0; + + cg = &chip->chip_geom; + if ((offset % cg->block_size) || (len % cg->block_size)) + return (EINVAL); + + block = offset / cg->block_size; + num_blocks = len / cg->block_size; + nand_debug(NDBG_NAND,"%p erase blocks %d[%d]", chip, block, num_blocks); + + nandbus = device_get_parent(chip->dev); + NANDBUS_LOCK(nandbus); + NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num); + + while (num_blocks--) { + if (!nand_check_bad_block(chip, block)) { + if (NAND_ERASE_BLOCK(chip->dev, block)) { + nand_debug(NDBG_NAND,"%p erase blocks %d error", + chip, block); + nand_mark_bad_block(chip, block); + err = ENXIO; + } + } else + err = ENXIO; + + block++; + }; + + NANDBUS_UNLOCK(nandbus); + + if (err) + nand_update_bbt(chip); + + return (err); +} + +MODULE_VERSION(nand, 1); diff --git a/sys/dev/nand/nand.h b/sys/dev/nand/nand.h new file mode 100644 index 00000000000..05101acddad --- /dev/null +++ b/sys/dev/nand/nand.h @@ -0,0 +1,385 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _DEV_NAND_H_ +#define _DEV_NAND_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +MALLOC_DECLARE(M_NAND); + +/* Read commands */ +#define NAND_CMD_READ 0x00 +#define NAND_CMD_CHNG_READ_COL 0x05 +#define NAND_CMD_READ_END 0x30 +#define NAND_CMD_READ_CACHE 0x31 +#define NAND_CMD_READ_CPBK 0x35 +#define NAND_CMD_READ_CACHE_END 0x3F +#define NAND_CMD_CHNG_READ_COL_END 0xE0 + +/* Erase commands */ +#define NAND_CMD_ERASE 0x60 +#define NAND_CMD_ERASE_END 0xD0 +#define NAND_CMD_ERASE_INTLV 0xD1 + +/* Program commands */ +#define NAND_CMD_PROG 0x80 +#define NAND_CMD_CHNG_WRITE_COL 0x85 +#define NAND_CMD_PROG_END 0x10 +#define NAND_CMD_PROG_INTLV 0x11 +#define NAND_CMD_PROG_CACHE 0x15 + +/* Misc commands */ +#define NAND_CMD_STATUS 0x70 +#define NAND_CMD_STATUS_ENH 0x78 +#define NAND_CMD_READ_ID 0x90 +#define NAND_CMD_READ_PARAMETER 0xec +#define NAND_CMD_READ_UNIQUE_ID 0xed +#define NAND_CMD_GET_FEATURE 0xee +#define NAND_CMD_SET_FEATURE 0xef + +/* Reset commands */ +#define NAND_CMD_SYNCH_RESET 0xfc +#define NAND_CMD_RESET 0xff + +/* Small page flash commands */ +#define NAND_CMD_SMALLA 0x00 +#define NAND_CMD_SMALLB 0x01 +#define NAND_CMD_SMALLOOB 0x50 + +#define NAND_STATUS_FAIL 0x1 +#define NAND_STATUS_FAILC 0x2 +#define NAND_STATUS_ARDY 0x20 +#define NAND_STATUS_RDY 0x40 +#define NAND_STATUS_WP 0x80 + +#define NAND_LP_OOB_COLUMN_START 0x800 +#define NAND_LP_OOBSZ 0x40 +#define NAND_SP_OOB_COLUMN_START 0x200 +#define NAND_SP_OOBSZ 0x10 + +#define PAGE_PARAM_LENGTH 0x100 +#define PAGE_PARAMETER_DEF 0x0 +#define PAGE_PARAMETER_RED_1 0x100 +#define PAGE_PARAMETER_RED_2 0x200 + +#define ONFI_SIG_ADDR 0x20 + +#define NAND_MAX_CHIPS 0x4 +#define NAND_MAX_OOBSZ 512 +#define NAND_MAX_PAGESZ 16384 + +#define NAND_SMALL_PAGE_SIZE 0x200 + +#define NAND_16_BIT 0x00000001 + +#define NAND_ECC_NONE 0x0 +#define NAND_ECC_SOFT 0x1 +#define NAND_ECC_FULLHW 0x2 +#define NAND_ECC_PARTHW 0x4 +#define NAND_ECC_MODE_MASK 0x7 + +#define ECC_OK 0 +#define ECC_CORRECTABLE 1 +#define ECC_ERROR_ECC (-1) +#define ECC_UNCORRECTABLE (-2) + +#define NAND_MAN_SAMSUNG 0xec +#define NAND_MAN_HYNIX 0xad +#define NAND_MAN_STMICRO 0x20 + +struct nand_id { + uint8_t man_id; + uint8_t dev_id; +}; + +struct nand_params { + struct nand_id id; + char *name; + uint32_t chip_size; + uint32_t page_size; + uint32_t oob_size; + uint32_t pages_per_block; + uint32_t flags; +}; + +/* nand debug levels */ +#define NDBG_NAND 0x01 +#define NDBG_CDEV 0x02 +#define NDBG_GEN 0x04 +#define NDBG_GEOM 0x08 +#define NDBG_BUS 0x10 +#define NDBG_SIM 0x20 +#define NDBG_CTRL 0x40 +#define NDBG_DRV 0x80 +#define NDBG_ECC 0x100 + +/* nand_debug_function */ +void nand_debug(int level, const char *fmt, ...); +extern int nand_debug_flag; + +/* ONFI features bit*/ +#define ONFI_FEAT_16BIT 0x01 +#define ONFI_FEAT_MULT_LUN 0x02 +#define ONFI_FEAT_INTLV_OPS 0x04 +#define ONFI_FEAT_CPBK_RESTRICT 0x08 +#define ONFI_FEAT_SRC_SYNCH 0x10 + +/* ONFI optional commands bits */ +#define ONFI_OPTCOM_PROG_CACHE 0x01 +#define ONFI_OPTCOM_READ_CACHE 0x02 +#define ONFI_OPTCOM_GETSET_FEAT 0x04 +#define ONFI_OPTCOM_STATUS_ENH 0x08 +#define ONFI_OPTCOM_COPYBACK 0x10 +#define ONFI_OPTCOM_UNIQUE_ID 0x20 + + +/* Layout of parameter page is defined in ONFI */ +struct onfi_params { + char signature[4]; + uint16_t rev; + uint16_t features; + uint16_t optional_commands; + uint8_t res1[22]; + char manufacturer_name[12]; + char device_model[20]; + uint8_t manufacturer_id; + uint16_t date; + uint8_t res2[13]; + uint32_t bytes_per_page; + uint16_t spare_bytes_per_page; + uint32_t bytes_per_partial_page; + uint16_t spare_bytes_per_partial_page; + uint32_t pages_per_block; + uint32_t blocks_per_lun; + uint8_t luns; + uint8_t address_cycles; + uint8_t bits_per_cell; + uint16_t max_bad_block_per_lun; + uint16_t block_endurance; + uint8_t guaranteed_valid_blocks; + uint16_t valid_block_endurance; + uint8_t programs_per_page; + uint8_t partial_prog_attr; + uint8_t bits_of_ecc; + uint8_t interleaved_addr_bits; + uint8_t interleaved_oper_attr; + uint8_t res3[13]; + uint8_t pin_capacitance; + uint16_t asynch_timing_mode_support; + uint16_t asynch_prog_cache_timing_mode_support; + uint16_t t_prog; /* us, max page program time */ + uint16_t t_bers; /* us, max block erase time */ + uint16_t t_r; /* us, max page read time */ + uint16_t t_ccs; /* ns, min change column setup time */ + uint16_t source_synch_timing_mode_support; + uint8_t source_synch_feat; + uint16_t clk_input_capacitance; + uint16_t io_capacitance; + uint16_t input_capacitance; + uint8_t input_capacitance_max; + uint8_t driver_strength_support; + uint8_t res4[12]; + uint16_t vendor_rev; + uint8_t vendor_spec[8]; + uint16_t crc; +}; + +struct nand_ecc_data { + int eccsize; /* Number of data bytes per ECC step */ + int eccmode; + int eccbytes; /* Number of ECC bytes per step */ + + uint16_t *eccpositions; /* Positions of ecc bytes */ + uint8_t ecccalculated[NAND_MAX_OOBSZ]; + uint8_t eccread[NAND_MAX_OOBSZ]; +}; + +struct ecc_stat { + uint32_t ecc_succeded; + uint32_t ecc_corrected; + uint32_t ecc_failed; +}; + +struct page_stat { + struct ecc_stat ecc_stat; + uint32_t page_read; + uint32_t page_raw_read; + uint32_t page_written; + uint32_t page_raw_written; +}; + +struct block_stat { + uint32_t block_erased; +}; + +struct chip_geom { + uint32_t chip_size; + uint32_t block_size; + uint32_t page_size; + uint32_t oob_size; + + uint32_t luns; + uint32_t blks_per_lun; + uint32_t blks_per_chip; + uint32_t pgs_per_blk; + + uint32_t pg_mask; + uint32_t blk_mask; + uint32_t lun_mask; + uint8_t blk_shift; + uint8_t lun_shift; +}; + +struct nand_chip { + device_t dev; + struct nand_id id; + struct chip_geom chip_geom; + + uint16_t t_prog; /* us, max page program time */ + uint16_t t_bers; /* us, max block erase time */ + uint16_t t_r; /* us, max page read time */ + uint16_t t_ccs; /* ns, min change column setup time */ + uint8_t num; + uint8_t flags; + + struct page_stat *pg_stat; + struct block_stat *blk_stat; + struct nand_softc *nand; + struct nand_bbt *bbt; + struct nand_ops *ops; + struct cdev *cdev; + + struct disk *ndisk; + struct disk *rdisk; + struct bio_queue_head bioq; /* bio queue */ + struct mtx qlock; /* bioq lock */ + struct taskqueue *tq; /* private task queue for i/o request */ + struct task iotask; /* i/o processing */ + +}; + +struct nand_softc { + uint8_t flags; + + char *chip_cdev_name; + struct nand_ecc_data ecc; +}; + +/* NAND ops */ +int nand_erase_blocks(struct nand_chip *chip, off_t offset, size_t len); +int nand_prog_pages(struct nand_chip *chip, uint32_t offset, uint8_t *buf, + uint32_t len); +int nand_read_pages(struct nand_chip *chip, uint32_t offset, void *buf, + uint32_t len); +int nand_read_pages_raw(struct nand_chip *chip, uint32_t offset, void *buf, + uint32_t len); +int nand_prog_pages_raw(struct nand_chip *chip, uint32_t offset, void *buf, + uint32_t len); +int nand_read_oob(struct nand_chip *chip, uint32_t page, void *buf, + uint32_t len); +int nand_prog_oob(struct nand_chip *chip, uint32_t page, void *buf, + uint32_t len); + +int nand_select_cs(device_t dev, uint8_t cs); + +int nand_read_parameter(struct nand_softc *nand, struct onfi_params *param); +int nand_synch_reset(struct nand_softc *nand); +int nand_chng_read_col(device_t dev, uint32_t col, void *buf, size_t len); +int nand_chng_write_col(device_t dev, uint32_t col, void *buf, size_t len); +int nand_get_feature(device_t dev, uint8_t feat, void* buf); +int nand_set_feature(device_t dev, uint8_t feat, void* buf); + + +int nand_erase_block_intlv(device_t dev, uint32_t block); +int nand_copyback_read(device_t dev, uint32_t page, uint32_t col, + void *buf, size_t len); +int nand_copyback_prog(device_t dev, uint32_t page, uint32_t col, + void *buf, size_t len); +int nand_copyback_prog_intlv(device_t dev, uint32_t page); +int nand_prog_cache(device_t dev, uint32_t page, uint32_t col, + void *buf, size_t len, uint8_t end); +int nand_prog_intlv(device_t dev, uint32_t page, uint32_t col, + void *buf, size_t len); +int nand_read_cache(device_t dev, uint32_t page, uint32_t col, + void *buf, size_t len, uint8_t end); + +int nand_write_ecc(struct nand_softc *nand, uint32_t page, uint8_t *data); +int nand_read_ecc(struct nand_softc *nand, uint32_t page, uint8_t *data); + +int nand_softecc_get(device_t dev, uint8_t *buf, int pagesize, uint8_t *ecc); +int nand_softecc_correct(device_t dev, uint8_t *buf, int pagesize, + uint8_t *readecc, uint8_t *calcecc); + +/* Chip initialization */ +void nand_init(struct nand_softc *nand, device_t dev, int ecc_mode, + int ecc_bytes, int ecc_size, uint16_t* eccposition, char* cdev_name); +void nand_detach(struct nand_softc *nand); +struct nand_params *nand_get_params(struct nand_id *id); + +void nand_onfi_set_params(struct nand_chip *chip, struct onfi_params *params); +void nand_set_params(struct nand_chip *chip, struct nand_params *params); +int nand_init_stat(struct nand_chip *chip); +void nand_destroy_stat(struct nand_chip *chip); + +/* BBT */ +int nand_init_bbt(struct nand_chip *chip); +void nand_destroy_bbt(struct nand_chip *chip); +int nand_update_bbt(struct nand_chip *chip); +int nand_mark_bad_block(struct nand_chip* chip, uint32_t block_num); +int nand_check_bad_block(struct nand_chip* chip, uint32_t block_num); + +/* cdev creation/removal */ +int nand_make_dev(struct nand_chip* chip); +void nand_destroy_dev(struct nand_chip *chip); + +int create_geom_disk(struct nand_chip* chip); +int create_geom_raw_disk(struct nand_chip *chip); +void destroy_geom_disk(struct nand_chip *chip); +void destroy_geom_raw_disk(struct nand_chip *chip); + +int init_chip_geom(struct chip_geom* cg, uint32_t luns, uint32_t blks_per_lun, + uint32_t pgs_per_blk, uint32_t pg_size, uint32_t oob_size); +int nand_row_to_blkpg(struct chip_geom *cg, uint32_t row, uint32_t *lun, + uint32_t *blk, uint32_t *pg); +int page_to_row(struct chip_geom *cg, uint32_t page, uint32_t *row); +int nand_check_page_boundary(struct nand_chip *chip, uint32_t page); +void nand_get_chip_param(struct nand_chip *chip, struct chip_param_io *param); + +#endif /* _DEV_NAND_H_ */ diff --git a/sys/dev/nand/nand_bbt.c b/sys/dev/nand/nand_bbt.c new file mode 100644 index 00000000000..d3f163af3b1 --- /dev/null +++ b/sys/dev/nand/nand_bbt.c @@ -0,0 +1,273 @@ +/*- + * Copyright (c) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "nand_if.h" + +#define BBT_PRIMARY_PATTERN 0x01020304 +#define BBT_SECONDARY_PATTERN 0x05060708 + +enum bbt_place { + BBT_NONE, + BBT_PRIMARY, + BBT_SECONDARY +}; + +struct nand_bbt { + struct nand_chip *chip; + uint32_t primary_map; + uint32_t secondary_map; + enum bbt_place active; + struct bbt_header *hdr; + uint32_t tab_len; + uint32_t *table; +}; + +struct bbt_header { + uint32_t pattern; + int32_t seq_nr; +}; + +static int nand_bbt_save(struct nand_bbt *); +static int nand_bbt_load_hdr(struct nand_bbt *, struct bbt_header *, int8_t); +static int nand_bbt_load_table(struct nand_bbt *); +static int nand_bbt_prescan(struct nand_bbt *); + +int +nand_init_bbt(struct nand_chip *chip) +{ + struct chip_geom *cg; + struct nand_bbt *bbt; + int err; + + cg = &chip->chip_geom; + + bbt = malloc(sizeof(struct nand_bbt), M_NAND, M_ZERO | M_WAITOK); + if (!bbt) { + device_printf(chip->dev, + "Cannot allocate memory for bad block struct"); + return (ENOMEM); + } + + bbt->chip = chip; + bbt->active = BBT_NONE; + bbt->primary_map = cg->chip_size - cg->block_size; + bbt->secondary_map = cg->chip_size - 2 * cg->block_size; + bbt->tab_len = cg->blks_per_chip * sizeof(uint32_t); + bbt->hdr = malloc(sizeof(struct bbt_header) + bbt->tab_len, M_NAND, + M_WAITOK); + if (!bbt->hdr) { + device_printf(chip->dev, "Cannot allocate %d bytes for BB " + "Table", bbt->tab_len); + free(bbt, M_NAND); + return (ENOMEM); + } + bbt->hdr->seq_nr = 0; + bbt->table = (uint32_t *)((uint8_t *)bbt->hdr + + sizeof(struct bbt_header)); + + err = nand_bbt_load_table(bbt); + if (err) { + free(bbt->table, M_NAND); + free(bbt, M_NAND); + return (err); + } + + chip->bbt = bbt; + if (bbt->active == BBT_NONE) { + bbt->active = BBT_PRIMARY; + memset(bbt->table, 0xff, bbt->tab_len); + nand_bbt_prescan(bbt); + nand_bbt_save(bbt); + } else + device_printf(chip->dev, "Found BBT table for chip\n"); + + return (0); +} + +void +nand_destroy_bbt(struct nand_chip *chip) +{ + + if (chip->bbt) { + nand_bbt_save(chip->bbt); + + free(chip->bbt->hdr, M_NAND); + free(chip->bbt, M_NAND); + chip->bbt = NULL; + } +} + +int +nand_update_bbt(struct nand_chip *chip) +{ + + nand_bbt_save(chip->bbt); + + return (0); +} + +static int +nand_bbt_save(struct nand_bbt *bbt) +{ + enum bbt_place next; + uint32_t addr; + int32_t err; + + if (bbt->active == BBT_PRIMARY) { + addr = bbt->secondary_map; + bbt->hdr->pattern = BBT_SECONDARY_PATTERN; + next = BBT_SECONDARY; + } else { + addr = bbt->primary_map; + bbt->hdr->pattern = BBT_PRIMARY_PATTERN; + next = BBT_PRIMARY; + } + + err = nand_erase_blocks(bbt->chip, addr, + bbt->chip->chip_geom.block_size); + if (err) + return (err); + + bbt->hdr->seq_nr++; + + err = nand_prog_pages_raw(bbt->chip, addr, bbt->hdr, + bbt->tab_len + sizeof(struct bbt_header)); + if (err) + return (err); + + bbt->active = next; + return (0); +} + +static int +nand_bbt_load_hdr(struct nand_bbt *bbt, struct bbt_header *hdr, int8_t primary) +{ + uint32_t addr; + + if (primary) + addr = bbt->primary_map; + else + addr = bbt->secondary_map; + + return (nand_read_pages_raw(bbt->chip, addr, hdr, + sizeof(struct bbt_header))); +} + +static int +nand_bbt_load_table(struct nand_bbt *bbt) +{ + struct bbt_header hdr1, hdr2; + uint32_t address = 0; + int err = 0; + + bzero(&hdr1, sizeof(hdr1)); + bzero(&hdr2, sizeof(hdr2)); + + nand_bbt_load_hdr(bbt, &hdr1, 1); + if (hdr1.pattern == BBT_PRIMARY_PATTERN) { + bbt->active = BBT_PRIMARY; + address = bbt->primary_map; + } else + bzero(&hdr1, sizeof(hdr1)); + + + nand_bbt_load_hdr(bbt, &hdr2, 0); + if ((hdr2.pattern == BBT_SECONDARY_PATTERN) && + (hdr2.seq_nr > hdr1.seq_nr)) { + bbt->active = BBT_SECONDARY; + address = bbt->secondary_map; + } else + bzero(&hdr2, sizeof(hdr2)); + + if (bbt->active != BBT_NONE) + err = nand_read_pages_raw(bbt->chip, address, bbt->hdr, + bbt->tab_len + sizeof(struct bbt_header)); + + return (err); +} + +static int +nand_bbt_prescan(struct nand_bbt *bbt) +{ + int32_t i; + uint8_t bad; + bool printed_hash = 0; + + device_printf(bbt->chip->dev, "No BBT found. Prescan chip...\n"); + for (i = 0; i < bbt->chip->chip_geom.blks_per_chip; i++) { + if (NAND_IS_BLK_BAD(bbt->chip->dev, i, &bad)) + return (ENXIO); + + if (bad) { + device_printf(bbt->chip->dev, "Bad block(%d)\n", i); + bbt->table[i] = 0x0FFFFFFF; + } + if (!(i % 100)) { + printf("#"); + printed_hash = 1; + } + } + + if (printed_hash) + printf("\n"); + + return (0); +} + +int +nand_check_bad_block(struct nand_chip *chip, uint32_t block_number) +{ + + if (!chip || !chip->bbt) + return (0); + + if ((chip->bbt->table[block_number] & 0xF0000000) == 0) + return (1); + + return (0); +} + +int +nand_mark_bad_block(struct nand_chip *chip, uint32_t block_number) +{ + + chip->bbt->table[block_number] = 0x0FFFFFFF; + + return (0); +} diff --git a/sys/dev/nand/nand_cdev.c b/sys/dev/nand/nand_cdev.c new file mode 100644 index 00000000000..ac27ff36153 --- /dev/null +++ b/sys/dev/nand/nand_cdev.c @@ -0,0 +1,413 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "nand_if.h" +#include "nandbus_if.h" + +static int nand_page_stat(struct nand_chip *, struct page_stat_io *); +static int nand_block_stat(struct nand_chip *, struct block_stat_io *); + +static d_ioctl_t nand_ioctl; +static d_open_t nand_open; +static d_strategy_t nand_strategy; + +static struct cdevsw nand_cdevsw = { + .d_version = D_VERSION, + .d_name = "nand", + .d_open = nand_open, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = nand_ioctl, + .d_strategy = nand_strategy, +}; + +static int +offset_to_page(struct chip_geom *cg, uint32_t offset) +{ + + return (offset / cg->page_size); +} + +static int +offset_to_page_off(struct chip_geom *cg, uint32_t offset) +{ + + return (offset % cg->page_size); +} + +int +nand_make_dev(struct nand_chip *chip) +{ + struct nandbus_ivar *ivar; + device_t parent, nandbus; + int parent_unit, unit; + char *name; + + ivar = device_get_ivars(chip->dev); + nandbus = device_get_parent(chip->dev); + + if (ivar->chip_cdev_name) { + name = ivar->chip_cdev_name; + + /* + * If we got distinct name for chip device we can enumarete it + * based on contoller number. + */ + parent = device_get_parent(nandbus); + } else { + name = "nand"; + parent = nandbus; + } + + parent_unit = device_get_unit(parent); + unit = parent_unit * 4 + chip->num; + chip->cdev = make_dev(&nand_cdevsw, unit, UID_ROOT, GID_WHEEL, + 0666, "%s%d.%d", name, parent_unit, chip->num); + + if (chip->cdev == NULL) + return (ENXIO); + + if (bootverbose) + device_printf(chip->dev, "Created cdev %s%d.%d for chip " + "[0x%0x, 0x%0x]\n", name, parent_unit, chip->num, + ivar->man_id, ivar->dev_id); + + chip->cdev->si_drv1 = chip; + + return (0); +} + +void +nand_destroy_dev(struct nand_chip *chip) +{ + + if (chip->cdev) + destroy_dev(chip->cdev); +} + +static int +nand_open(struct cdev *dev, int oflags, int devtype, struct thread *td) +{ + + return (0); +} + +static int +nand_read(struct nand_chip *chip, uint32_t offset, void *buf, uint32_t len) +{ + struct chip_geom *cg; + device_t nandbus; + int start_page, count, off, err = 0; + uint8_t *ptr, *tmp; + + nand_debug(NDBG_CDEV, "Read from chip%d [%p] at %d\n", chip->num, + chip, offset); + + nandbus = device_get_parent(chip->dev); + NANDBUS_LOCK(nandbus); + NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num); + + cg = &chip->chip_geom; + start_page = offset_to_page(cg, offset); + off = offset_to_page_off(cg, offset); + count = (len > cg->page_size - off) ? cg->page_size - off : len; + + ptr = (uint8_t *)buf; + while (len > 0) { + if (len < cg->page_size) { + tmp = malloc(cg->page_size, M_NAND, M_WAITOK); + if (!tmp) { + err = ENOMEM; + break; + } + err = NAND_READ_PAGE(chip->dev, start_page, + tmp, cg->page_size, 0); + if (err) { + free(tmp, M_NAND); + break; + } + bcopy(tmp + off, ptr, count); + free(tmp, M_NAND); + } else { + err = NAND_READ_PAGE(chip->dev, start_page, + ptr, cg->page_size, 0); + if (err) + break; + } + + len -= count; + start_page++; + ptr += count; + count = (len > cg->page_size) ? cg->page_size : len; + off = 0; + } + + NANDBUS_UNLOCK(nandbus); + return (err); +} + +static int +nand_write(struct nand_chip *chip, uint32_t offset, void* buf, uint32_t len) +{ + struct chip_geom *cg; + device_t nandbus; + int off, start_page, err = 0; + uint8_t *ptr; + + nand_debug(NDBG_CDEV, "Write to chip %d [%p] at %d\n", chip->num, + chip, offset); + + nandbus = device_get_parent(chip->dev); + NANDBUS_LOCK(nandbus); + NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num); + + cg = &chip->chip_geom; + start_page = offset_to_page(cg, offset); + off = offset_to_page_off(cg, offset); + + if (off != 0 || (len % cg->page_size) != 0) { + printf("Not aligned write start [0x%08x] size [0x%08x]\n", + off, len); + NANDBUS_UNLOCK(nandbus); + return (EINVAL); + } + + ptr = (uint8_t *)buf; + while (len > 0) { + err = NAND_PROGRAM_PAGE(chip->dev, start_page, ptr, + cg->page_size, 0); + if (err) + break; + + len -= cg->page_size; + start_page++; + ptr += cg->page_size; + } + + NANDBUS_UNLOCK(nandbus); + return (err); +} + +static void +nand_strategy(struct bio *bp) +{ + struct nand_chip *chip; + struct cdev *dev; + int err = 0; + + dev = bp->bio_dev; + chip = dev->si_drv1; + + nand_debug(NDBG_CDEV, "Strategy %s on chip %d [%p]\n", + (bp->bio_cmd & BIO_READ) == BIO_READ ? "READ" : "WRITE", + chip->num, chip); + + if ((bp->bio_cmd & BIO_READ) == BIO_READ) { + err = nand_read(chip, + bp->bio_offset & 0xffffffff, + bp->bio_data, bp->bio_bcount); + } else { + err = nand_write(chip, + bp->bio_offset & 0xffffffff, + bp->bio_data, bp->bio_bcount); + } + + if (err == 0) + bp->bio_resid = 0; + else { + bp->bio_error = EIO; + bp->bio_flags |= BIO_ERROR; + bp->bio_resid = bp->bio_bcount; + } + + biodone(bp); +} + +static int +nand_oob_access(struct nand_chip *chip, uint32_t page, uint32_t offset, + uint32_t len, uint8_t *data, uint8_t write) +{ + struct chip_geom *cg; + uint8_t *buf = NULL; + int ret = 0; + + cg = &chip->chip_geom; + + buf = malloc(cg->oob_size, M_NAND, M_WAITOK); + if (!buf) + return (ENOMEM); + + memset(buf, 0xff, cg->oob_size); + + if (!write) { + ret = nand_read_oob(chip, page, buf, cg->oob_size); + copyout(buf, data, len); + } else { + copyin(data, buf, len); + ret = nand_prog_oob(chip, page, buf, cg->oob_size); + } + + free(buf, M_NAND); + + return (ret); +} + +static int +nand_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, + struct thread *td) +{ + struct nand_chip *chip; + struct nand_oob_rw *oob_rw = NULL; + struct nand_raw_rw *raw_rw = NULL; + device_t nandbus; + uint8_t *buf = NULL; + int ret = 0; + uint8_t status; + + chip = (struct nand_chip *)dev->si_drv1; + nandbus = device_get_parent(chip->dev); + + if ((cmd == NAND_IO_RAW_READ) || (cmd == NAND_IO_RAW_PROG)) { + raw_rw = (struct nand_raw_rw *)data; + buf = malloc(raw_rw->len, M_NAND, M_WAITOK); + } + switch(cmd) { + case NAND_IO_ERASE: + ret = nand_erase_blocks(chip, ((off_t *)data)[0], + ((off_t *)data)[1]); + break; + + case NAND_IO_OOB_READ: + oob_rw = (struct nand_oob_rw *)data; + ret = nand_oob_access(chip, oob_rw->page, 0, + oob_rw->len, oob_rw->data, 0); + break; + + case NAND_IO_OOB_PROG: + oob_rw = (struct nand_oob_rw *)data; + ret = nand_oob_access(chip, oob_rw->page, 0, + oob_rw->len, oob_rw->data, 1); + break; + + case NAND_IO_GET_STATUS: + NANDBUS_LOCK(nandbus); + ret = NANDBUS_GET_STATUS(nandbus, &status); + if (ret == 0) + *(uint8_t *)data = status; + NANDBUS_UNLOCK(nandbus); + break; + + case NAND_IO_RAW_PROG: + ret = copyin(raw_rw->data, buf, raw_rw->len); + if (ret) + break; + ret = nand_prog_pages_raw(chip, raw_rw->off, buf, + raw_rw->len); + break; + + case NAND_IO_RAW_READ: + ret = nand_read_pages_raw(chip, raw_rw->off, buf, + raw_rw->len); + if (ret) + break; + ret = copyout(buf, raw_rw->data, raw_rw->len); + break; + + case NAND_IO_PAGE_STAT: + ret = nand_page_stat(chip, (struct page_stat_io *)data); + break; + + case NAND_IO_BLOCK_STAT: + ret = nand_block_stat(chip, (struct block_stat_io *)data); + break; + + case NAND_IO_GET_CHIP_PARAM: + nand_get_chip_param(chip, (struct chip_param_io *)data); + break; + + default: + printf("Unknown nand_ioctl request \n"); + ret = EIO; + } + + if (buf) + free(buf, M_NAND); + + return (ret); +} + +static int +nand_page_stat(struct nand_chip *chip, struct page_stat_io *page_stat) +{ + struct chip_geom *cg; + struct page_stat *stat; + int num_pages; + + cg = &chip->chip_geom; + num_pages = cg->pgs_per_blk * cg->blks_per_lun * cg->luns; + if (page_stat->page_num >= num_pages) + return (EINVAL); + + stat = &chip->pg_stat[page_stat->page_num]; + page_stat->page_read = stat->page_read; + page_stat->page_written = stat->page_written; + page_stat->page_raw_read = stat->page_raw_read; + page_stat->page_raw_written = stat->page_raw_written; + page_stat->ecc_succeded = stat->ecc_stat.ecc_succeded; + page_stat->ecc_corrected = stat->ecc_stat.ecc_corrected; + page_stat->ecc_failed = stat->ecc_stat.ecc_failed; + + return (0); +} + +static int +nand_block_stat(struct nand_chip *chip, struct block_stat_io *block_stat) +{ + struct chip_geom *cg; + uint32_t block_num = block_stat->block_num; + + cg = &chip->chip_geom; + if (block_num >= cg->blks_per_lun * cg->luns) + return (EINVAL); + + block_stat->block_erased = chip->blk_stat[block_num].block_erased; + + return (0); +} diff --git a/sys/dev/nand/nand_dev.h b/sys/dev/nand/nand_dev.h new file mode 100644 index 00000000000..bc7d6c49c06 --- /dev/null +++ b/sys/dev/nand/nand_dev.h @@ -0,0 +1,90 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _DEV_NAND_CDEV_H_ +#define _DEV_NAND_CDEV_H_ + +#include +#include + +struct nand_raw_rw { + off_t off; + off_t len; + uint8_t *data; +}; + +struct nand_oob_rw { + uint32_t page; + off_t len; + uint8_t *data; +}; + +#define NAND_IOCTL_GROUP 'N' +#define NAND_IO_ERASE _IOWR(NAND_IOCTL_GROUP, 0x0, off_t[2]) + +#define NAND_IO_OOB_READ _IOWR(NAND_IOCTL_GROUP, 0x1, struct nand_oob_rw) + +#define NAND_IO_OOB_PROG _IOWR(NAND_IOCTL_GROUP, 0x2, struct nand_oob_rw) + +#define NAND_IO_RAW_READ _IOWR(NAND_IOCTL_GROUP, 0x3, struct nand_raw_rw) + +#define NAND_IO_RAW_PROG _IOWR(NAND_IOCTL_GROUP, 0x4, struct nand_raw_rw) + +#define NAND_IO_GET_STATUS _IOWR(NAND_IOCTL_GROUP, 0x5, uint8_t) + +struct page_stat_io { + uint32_t page_num; + uint32_t page_read; + uint32_t page_written; + uint32_t page_raw_read; + uint32_t page_raw_written; + uint32_t ecc_succeded; + uint32_t ecc_corrected; + uint32_t ecc_failed; +}; +#define NAND_IO_PAGE_STAT _IOWR(NAND_IOCTL_GROUP, 0x6, \ + struct page_stat_io) + +struct block_stat_io { + uint32_t block_num; + uint32_t block_erased; +}; +#define NAND_IO_BLOCK_STAT _IOWR(NAND_IOCTL_GROUP, 0x7, \ + struct block_stat_io) + +struct chip_param_io { + uint32_t page_size; + uint32_t oob_size; + + uint32_t blocks; + uint32_t pages_per_block; +}; +#define NAND_IO_GET_CHIP_PARAM _IOWR(NAND_IOCTL_GROUP, 0x8, \ + struct chip_param_io) + +#endif /* _DEV_NAND_CDEV_H_ */ diff --git a/sys/dev/nand/nand_ecc_pos.h b/sys/dev/nand/nand_ecc_pos.h new file mode 100644 index 00000000000..f40415cc4f3 --- /dev/null +++ b/sys/dev/nand/nand_ecc_pos.h @@ -0,0 +1,56 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _DEV_NAND_ECC_POS_H_ +#define _DEV_NAND_ECC_POS_H_ + +static uint16_t default_software_ecc_positions_16[] = {2, 0, 1, 7, 4, 6}; + +static uint16_t default_software_ecc_positions_64[] = { + + 42, 40, 41, 45, 43, 44, 48, 46, + 47, 51, 49, 50, 54, 52, 53, 57, + 55, 56, 60, 58, 59, 63, 61, 62 +}; + +static uint16_t default_software_ecc_positions_128[] = { + 8, 9, 10, 11, 12, 13, + 18, 19, 20, 21, 22, 23, + 28, 29, 30, 31, 32, 33, + 38, 39, 40, 41, 42, 43, + 48, 49, 50, 51, 52, 53, + 58, 59, 60, 61, 62, 63, + 68, 69, 70, 71, 72, 73, + 78, 79, 80, 81, 82, 83, + 88, 89, 90, 91, 92, 93, + 98, 99, 100, 101, 102, 103, + 108, 109, 110, 111, 112, 113, + 118, 119, 120, 121, 122, 123, +}; +#endif /* _DEV_NAND_ECC_POS_H_ */ + diff --git a/sys/dev/nand/nand_generic.c b/sys/dev/nand/nand_generic.c new file mode 100644 index 00000000000..85e81beb6b6 --- /dev/null +++ b/sys/dev/nand/nand_generic.c @@ -0,0 +1,1320 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Generic NAND driver */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "nfc_if.h" +#include "nand_if.h" +#include "nandbus_if.h" + + +static int onfi_nand_probe(device_t dev); +static int large_nand_probe(device_t dev); +static int small_nand_probe(device_t dev); +static int generic_nand_attach(device_t dev); +static int generic_nand_detach(device_t dev); + +static int generic_erase_block(device_t, uint32_t); +static int generic_erase_block_intlv(device_t, uint32_t); +static int generic_read_page (device_t, uint32_t, void *, uint32_t, uint32_t); +static int generic_read_oob(device_t, uint32_t, void *, uint32_t, uint32_t); +static int generic_program_page(device_t, uint32_t, void *, uint32_t, uint32_t); +static int generic_program_page_intlv(device_t, uint32_t, void *, uint32_t, + uint32_t); +static int generic_program_oob(device_t, uint32_t, void *, uint32_t, uint32_t); +static int generic_is_blk_bad(device_t, uint32_t, uint8_t *); +static int generic_get_ecc(device_t, void *, void *, int *); +static int generic_correct_ecc(device_t, void *, void *, void *); + +static int small_read_page(device_t, uint32_t, void *, uint32_t, uint32_t); +static int small_read_oob(device_t, uint32_t, void *, uint32_t, uint32_t); +static int small_program_page(device_t, uint32_t, void *, uint32_t, uint32_t); +static int small_program_oob(device_t, uint32_t, void *, uint32_t, uint32_t); + +static int onfi_is_blk_bad(device_t, uint32_t, uint8_t *); +static int onfi_read_parameter(struct nand_chip *, struct onfi_params *); + +static int nand_send_address(device_t, int32_t, int32_t, int8_t); + +static device_method_t onand_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, onfi_nand_probe), + DEVMETHOD(device_attach, generic_nand_attach), + DEVMETHOD(device_detach, generic_nand_detach), + + DEVMETHOD(nand_read_page, generic_read_page), + DEVMETHOD(nand_program_page, generic_program_page), + DEVMETHOD(nand_program_page_intlv, generic_program_page_intlv), + DEVMETHOD(nand_read_oob, generic_read_oob), + DEVMETHOD(nand_program_oob, generic_program_oob), + DEVMETHOD(nand_erase_block, generic_erase_block), + DEVMETHOD(nand_erase_block_intlv, generic_erase_block_intlv), + + DEVMETHOD(nand_is_blk_bad, onfi_is_blk_bad), + DEVMETHOD(nand_get_ecc, generic_get_ecc), + DEVMETHOD(nand_correct_ecc, generic_correct_ecc), + { 0, 0 } +}; + +static device_method_t lnand_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, large_nand_probe), + DEVMETHOD(device_attach, generic_nand_attach), + DEVMETHOD(device_detach, generic_nand_detach), + + DEVMETHOD(nand_read_page, generic_read_page), + DEVMETHOD(nand_program_page, generic_program_page), + DEVMETHOD(nand_read_oob, generic_read_oob), + DEVMETHOD(nand_program_oob, generic_program_oob), + DEVMETHOD(nand_erase_block, generic_erase_block), + + DEVMETHOD(nand_is_blk_bad, generic_is_blk_bad), + DEVMETHOD(nand_get_ecc, generic_get_ecc), + DEVMETHOD(nand_correct_ecc, generic_correct_ecc), + { 0, 0 } +}; + +static device_method_t snand_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, small_nand_probe), + DEVMETHOD(device_attach, generic_nand_attach), + DEVMETHOD(device_detach, generic_nand_detach), + + DEVMETHOD(nand_read_page, small_read_page), + DEVMETHOD(nand_program_page, small_program_page), + DEVMETHOD(nand_read_oob, small_read_oob), + DEVMETHOD(nand_program_oob, small_program_oob), + DEVMETHOD(nand_erase_block, generic_erase_block), + + DEVMETHOD(nand_is_blk_bad, generic_is_blk_bad), + DEVMETHOD(nand_get_ecc, generic_get_ecc), + DEVMETHOD(nand_correct_ecc, generic_correct_ecc), + { 0, 0 } +}; + +devclass_t onand_devclass; +devclass_t lnand_devclass; +devclass_t snand_devclass; + +driver_t onand_driver = { + "onand", + onand_methods, + sizeof(struct nand_chip) +}; + +driver_t lnand_driver = { + "lnand", + lnand_methods, + sizeof(struct nand_chip) +}; + +driver_t snand_driver = { + "snand", + snand_methods, + sizeof(struct nand_chip) +}; + +DRIVER_MODULE(onand, nandbus, onand_driver, onand_devclass, 0, 0); +DRIVER_MODULE(lnand, nandbus, lnand_driver, lnand_devclass, 0, 0); +DRIVER_MODULE(snand, nandbus, snand_driver, snand_devclass, 0, 0); + +static int +onfi_nand_probe(device_t dev) +{ + struct nandbus_ivar *ivar; + + ivar = device_get_ivars(dev); + if (ivar && ivar->is_onfi) { + device_set_desc(dev, "ONFI compliant NAND"); + return (BUS_PROBE_DEFAULT); + } + + return (ENODEV); +} + +static int +large_nand_probe(device_t dev) +{ + struct nandbus_ivar *ivar; + + ivar = device_get_ivars(dev); + if (ivar && !ivar->is_onfi && ivar->params->page_size >= 512) { + device_set_desc(dev, ivar->params->name); + return (BUS_PROBE_DEFAULT); + } + + return (ENODEV); +} + +static int +small_nand_probe(device_t dev) +{ + struct nandbus_ivar *ivar; + + ivar = device_get_ivars(dev); + if (ivar && !ivar->is_onfi && ivar->params->page_size == 512) { + device_set_desc(dev, ivar->params->name); + return (BUS_PROBE_DEFAULT); + } + + return (ENODEV); +} + +static int +generic_nand_attach(device_t dev) +{ + struct nand_chip *chip; + struct nandbus_ivar *ivar; + struct onfi_params *onfi_params; + device_t nandbus, nfc; + int err; + + chip = device_get_softc(dev); + chip->dev = dev; + + ivar = device_get_ivars(dev); + chip->id.man_id = ivar->man_id; + chip->id.dev_id = ivar->dev_id; + chip->num = ivar->cs; + + /* TODO remove when HW ECC supported */ + nandbus = device_get_parent(dev); + nfc = device_get_parent(nandbus); + + chip->nand = device_get_softc(nfc); + + if (ivar->is_onfi) { + onfi_params = malloc(sizeof(struct onfi_params), + M_NAND, M_WAITOK | M_ZERO); + if (onfi_params == NULL) + return (ENXIO); + + if (onfi_read_parameter(chip, onfi_params)) { + nand_debug(NDBG_GEN,"Could not read parameter page!\n"); + free(onfi_params, M_NAND); + return (ENXIO); + } + + nand_onfi_set_params(chip, onfi_params); + /* Set proper column and row cycles */ + ivar->cols = (onfi_params->address_cycles >> 4) & 0xf; + ivar->rows = onfi_params->address_cycles & 0xf; + free(onfi_params, M_NAND); + + } else { + + nand_set_params(chip, ivar->params); + } + + err = nand_init_stat(chip); + if (err) { + generic_nand_detach(dev); + return (err); + } + + err = nand_init_bbt(chip); + if (err) { + generic_nand_detach(dev); + return (err); + } + + err = nand_make_dev(chip); + if (err) { + generic_nand_detach(dev); + return (err); + } + + err = create_geom_disk(chip); + if (err) { + generic_nand_detach(dev); + return (err); + } + + return (0); +} + +static int +generic_nand_detach(device_t dev) +{ + struct nand_chip *chip; + + chip = device_get_softc(dev); + + nand_destroy_bbt(chip); + destroy_geom_disk(chip); + nand_destroy_dev(chip); + nand_destroy_stat(chip); + + return (0); +} + +static int +can_write(device_t nandbus) +{ + uint8_t status; + + if (NANDBUS_WAIT_READY(nandbus, &status)) + return (0); + + if (!(status & NAND_STATUS_WP)) { + nand_debug(NDBG_GEN,"Chip is write-protected"); + return (0); + } + + return (1); +} + +static int +check_fail(device_t nandbus) +{ + uint8_t status; + + NANDBUS_WAIT_READY(nandbus, &status); + if (status & NAND_STATUS_FAIL) { + nand_debug(NDBG_GEN,"Status failed %x", status); + return (ENXIO); + } + + return (0); +} + +static int +onfi_read_parameter(struct nand_chip *chip, struct onfi_params *params) +{ + device_t nandbus; + + nand_debug(NDBG_GEN,"read parameter"); + + nandbus = device_get_parent(chip->dev); + + NANDBUS_SELECT_CS(nandbus, chip->num); + + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_READ_PARAMETER)) + return (ENXIO); + + if (nand_send_address(chip->dev, -1, -1, PAGE_PARAMETER_DEF)) + return (ENXIO); + + if (NANDBUS_START_COMMAND(nandbus)) + return (ENXIO); + + NANDBUS_READ_BUFFER(nandbus, params, sizeof(struct onfi_params)); + + /* TODO */ + /* Check for signature */ + /* Check CRC */ + /* Use redundant page if necessary */ + + return (0); +} + +static int +send_read_page(device_t nand, uint8_t start_command, uint8_t end_command, + uint32_t row, uint32_t column) +{ + device_t nandbus = device_get_parent(nand); + + if (NANDBUS_SEND_COMMAND(nandbus, start_command)) + return (ENXIO); + + if (nand_send_address(nand, row, column, -1)) + return (ENXIO); + + if (NANDBUS_SEND_COMMAND(nandbus, end_command)) + return (ENXIO); + + if (NANDBUS_START_COMMAND(nandbus)) + return (ENXIO); + + return (0); +} + +static int +generic_read_page(device_t nand, uint32_t page, void *buf, uint32_t len, + uint32_t offset) +{ + struct nand_chip *chip; + struct page_stat *pg_stat; + device_t nandbus; + uint32_t row; + + nand_debug(NDBG_GEN,"%p raw read page %x[%x] at %x", nand, page, len, offset); + chip = device_get_softc(nand); + nandbus = device_get_parent(nand); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + + if (send_read_page(nand, NAND_CMD_READ, NAND_CMD_READ_END, row, + offset)) + return (ENXIO); + + DELAY(chip->t_r); + + NANDBUS_READ_BUFFER(nandbus, buf, len); + + if (check_fail(nandbus)) + return (ENXIO); + + pg_stat = &(chip->pg_stat[page]); + pg_stat->page_raw_read++; + + return (0); +} + +static int +generic_read_oob(device_t nand, uint32_t page, void* buf, uint32_t len, + uint32_t offset) +{ + struct nand_chip *chip; + device_t nandbus; + uint32_t row; + + nand_debug(NDBG_GEN,"%p raw read oob %x[%x] at %x", nand, page, len, offset); + chip = device_get_softc(nand); + nandbus = device_get_parent(nand); + + if (nand_check_page_boundary(chip, page)) { + nand_debug(NDBG_GEN,"page boundary check failed: %08x\n", page); + return (ENXIO); + } + + page_to_row(&chip->chip_geom, page, &row); + + offset += chip->chip_geom.page_size; + + if (send_read_page(nand, NAND_CMD_READ, NAND_CMD_READ_END, row, + offset)) + return (ENXIO); + + DELAY(chip->t_r); + + NANDBUS_READ_BUFFER(nandbus, buf, len); + + if (check_fail(nandbus)) + return (ENXIO); + + return (0); +} + +static int +send_start_program_page(device_t nand, uint32_t row, uint32_t column) +{ + device_t nandbus = device_get_parent(nand); + + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_PROG)) + return (ENXIO); + + if (nand_send_address(nand, row, column, -1)) + return (ENXIO); + + return (0); +} + +static int +send_end_program_page(device_t nandbus, uint8_t end_command) +{ + + if (NANDBUS_SEND_COMMAND(nandbus, end_command)) + return (ENXIO); + + if (NANDBUS_START_COMMAND(nandbus)) + return (ENXIO); + + return (0); +} + +static int +generic_program_page(device_t nand, uint32_t page, void *buf, uint32_t len, + uint32_t offset) +{ + struct nand_chip *chip; + struct page_stat *pg_stat; + device_t nandbus; + uint32_t row; + + nand_debug(NDBG_GEN,"%p raw prog page %x[%x] at %x", nand, page, len, + offset); + chip = device_get_softc(nand); + nandbus = device_get_parent(nand); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + + if (!can_write(nandbus)) + return (ENXIO); + + if (send_start_program_page(nand, row, offset)) + return (ENXIO); + + NANDBUS_WRITE_BUFFER(nandbus, buf, len); + + if (send_end_program_page(nandbus, NAND_CMD_PROG_END)) + return (ENXIO); + + DELAY(chip->t_prog); + + if (check_fail(nandbus)) + return (ENXIO); + + pg_stat = &(chip->pg_stat[page]); + pg_stat->page_raw_written++; + + return (0); +} + +static int +generic_program_page_intlv(device_t nand, uint32_t page, void *buf, + uint32_t len, uint32_t offset) +{ + struct nand_chip *chip; + struct page_stat *pg_stat; + device_t nandbus; + uint32_t row; + + nand_debug(NDBG_GEN,"%p raw prog page %x[%x] at %x", nand, page, len, offset); + chip = device_get_softc(nand); + nandbus = device_get_parent(nand); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + + if (!can_write(nandbus)) + return (ENXIO); + + if (send_start_program_page(nand, row, offset)) + return (ENXIO); + + NANDBUS_WRITE_BUFFER(nandbus, buf, len); + + if (send_end_program_page(nandbus, NAND_CMD_PROG_INTLV)) + return (ENXIO); + + DELAY(chip->t_prog); + + if (check_fail(nandbus)) + return (ENXIO); + + pg_stat = &(chip->pg_stat[page]); + pg_stat->page_raw_written++; + + return (0); +} + +static int +generic_program_oob(device_t nand, uint32_t page, void* buf, uint32_t len, + uint32_t offset) +{ + struct nand_chip *chip; + device_t nandbus; + uint32_t row; + + nand_debug(NDBG_GEN,"%p raw prog oob %x[%x] at %x", nand, page, len, + offset); + chip = device_get_softc(nand); + nandbus = device_get_parent(nand); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + offset += chip->chip_geom.page_size; + + if (!can_write(nandbus)) + return (ENXIO); + + if (send_start_program_page(nand, row, offset)) + return (ENXIO); + + NANDBUS_WRITE_BUFFER(nandbus, buf, len); + + if (send_end_program_page(nandbus, NAND_CMD_PROG_END)) + return (ENXIO); + + DELAY(chip->t_prog); + + if (check_fail(nandbus)) + return (ENXIO); + + return (0); +} + +static int +send_erase_block(device_t nand, uint32_t row, uint8_t second_command) +{ + device_t nandbus = device_get_parent(nand); + + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_ERASE)) + return (ENXIO); + + if (nand_send_address(nand, row, -1, -1)) + return (ENXIO); + + if (NANDBUS_SEND_COMMAND(nandbus, second_command)) + return (ENXIO); + + if (NANDBUS_START_COMMAND(nandbus)) + return (ENXIO); + + return (0); +} + +static int +generic_erase_block(device_t nand, uint32_t block) +{ + struct block_stat *blk_stat; + struct nand_chip *chip; + device_t nandbus; + int row; + + nand_debug(NDBG_GEN,"%p erase block %x", nand, block); + nandbus = device_get_parent(nand); + chip = device_get_softc(nand); + + if (block >= (chip->chip_geom.blks_per_lun * chip->chip_geom.luns)) + return (ENXIO); + + row = (block << chip->chip_geom.blk_shift) & + chip->chip_geom.blk_mask; + + nand_debug(NDBG_GEN,"%p erase block row %x", nand, row); + + if (!can_write(nandbus)) + return (ENXIO); + + send_erase_block(nand, row, NAND_CMD_ERASE_END); + + DELAY(chip->t_bers); + + if (check_fail(nandbus)) + return (ENXIO); + + blk_stat = &(chip->blk_stat[block]); + blk_stat->block_erased++; + + return (0); +} + +static int +generic_erase_block_intlv(device_t nand, uint32_t block) +{ + struct block_stat *blk_stat; + struct nand_chip *chip; + device_t nandbus; + int row; + + nand_debug(NDBG_GEN,"%p erase block %x", nand, block); + nandbus = device_get_parent(nand); + chip = device_get_softc(nand); + + if (block >= (chip->chip_geom.blks_per_lun * chip->chip_geom.luns)) + return (ENXIO); + + row = (block << chip->chip_geom.blk_shift) & + chip->chip_geom.blk_mask; + + if (!can_write(nandbus)) + return (ENXIO); + + send_erase_block(nand, row, NAND_CMD_ERASE_INTLV); + + DELAY(chip->t_bers); + + if (check_fail(nandbus)) + return (ENXIO); + + blk_stat = &(chip->blk_stat[block]); + blk_stat->block_erased++; + + return (0); + +} + +static int +onfi_is_blk_bad(device_t device, uint32_t block_number, uint8_t *bad) +{ + struct nand_chip *chip; + int page_number, i, j, err; + uint8_t *oob; + + chip = device_get_softc(device); + + oob = malloc(chip->chip_geom.oob_size, M_NAND, M_WAITOK); + if (!oob) { + device_printf(device, "%s: cannot allocate oob\n", __func__); + return (ENOMEM); + } + + page_number = block_number * chip->chip_geom.pgs_per_blk; + *bad = 0; + /* Check OOB of first and last page */ + for (i = 0; i < 2; i++, page_number+= chip->chip_geom.pgs_per_blk - 1) { + err = generic_read_oob(device, page_number, oob, + chip->chip_geom.oob_size, 0); + if (err) { + device_printf(device, "%s: cannot allocate oob\n", + __func__); + free(oob, M_NAND); + return (ENOMEM); + } + + for (j = 0; j < chip->chip_geom.oob_size; j++) { + if (!oob[j]) { + *bad = 1; + free(oob, M_NAND); + return (0); + } + } + } + + free(oob, M_NAND); + + return (0); +} + +static int +send_small_read_page(device_t nand, uint8_t start_command, + uint32_t row, uint32_t column) +{ + device_t nandbus = device_get_parent(nand); + + if (NANDBUS_SEND_COMMAND(nandbus, start_command)) + return (ENXIO); + + if (nand_send_address(nand, row, column, -1)) + return (ENXIO); + + if (NANDBUS_START_COMMAND(nandbus)) + return (ENXIO); + + return (0); +} + + +static int +small_read_page(device_t nand, uint32_t page, void *buf, uint32_t len, + uint32_t offset) +{ + struct nand_chip *chip; + struct page_stat *pg_stat; + device_t nandbus; + uint32_t row; + + nand_debug(NDBG_GEN,"%p small read page %x[%x] at %x", nand, page, len, offset); + chip = device_get_softc(nand); + nandbus = device_get_parent(nand); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + + if (offset < 256) { + if (send_small_read_page(nand, NAND_CMD_SMALLA, row, offset)) + return (ENXIO); + } else { + offset -= 256; + if (send_small_read_page(nandbus, NAND_CMD_SMALLB, row, offset)) + return (ENXIO); + } + + DELAY(chip->t_r); + + NANDBUS_READ_BUFFER(nandbus, buf, len); + + if (check_fail(nandbus)) + return (ENXIO); + + pg_stat = &(chip->pg_stat[page]); + pg_stat->page_raw_read++; + + return (0); +} + +static int +small_read_oob(device_t nand, uint32_t page, void *buf, uint32_t len, + uint32_t offset) +{ + struct nand_chip *chip; + struct page_stat *pg_stat; + device_t nandbus; + uint32_t row; + + nand_debug(NDBG_GEN,"%p small read oob %x[%x] at %x", nand, page, len, offset); + chip = device_get_softc(nand); + nandbus = device_get_parent(nand); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + + if (send_small_read_page(nand, NAND_CMD_SMALLOOB, row, 0)) + return (ENXIO); + + DELAY(chip->t_r); + + NANDBUS_READ_BUFFER(nandbus, buf, len); + + if (check_fail(nandbus)) + return (ENXIO); + + pg_stat = &(chip->pg_stat[page]); + pg_stat->page_raw_read++; + + return (0); +} + +static int +small_program_page(device_t nand, uint32_t page, void* buf, uint32_t len, + uint32_t offset) +{ + struct nand_chip *chip; + device_t nandbus; + uint32_t row; + + nand_debug(NDBG_GEN,"%p small prog page %x[%x] at %x", nand, page, len, offset); + chip = device_get_softc(nand); + nandbus = device_get_parent(nand); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + + if (!can_write(nandbus)) + return (ENXIO); + + if (offset < 256) { + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_SMALLA)) + return (ENXIO); + } else { + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_SMALLB)) + return (ENXIO); + } + + if (send_start_program_page(nand, row, offset)) + return (ENXIO); + + NANDBUS_WRITE_BUFFER(nandbus, buf, len); + + if (send_end_program_page(nandbus, NAND_CMD_PROG_END)) + return (ENXIO); + + DELAY(chip->t_prog); + + if (check_fail(nandbus)) + return (ENXIO); + + return (0); +} + +static int +small_program_oob(device_t nand, uint32_t page, void* buf, uint32_t len, + uint32_t offset) +{ + struct nand_chip *chip; + device_t nandbus; + uint32_t row; + + nand_debug(NDBG_GEN,"%p small prog oob %x[%x] at %x", nand, page, len, offset); + chip = device_get_softc(nand); + nandbus = device_get_parent(nand); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + + if (!can_write(nandbus)) + return (ENXIO); + + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_SMALLOOB)) + return (ENXIO); + + if (send_start_program_page(nand, row, offset)) + return (ENXIO); + + NANDBUS_WRITE_BUFFER(nandbus, buf, len); + + if (send_end_program_page(nandbus, NAND_CMD_PROG_END)) + return (ENXIO); + + DELAY(chip->t_prog); + + if (check_fail(nandbus)) + return (ENXIO); + + return (0); +} + +int +nand_send_address(device_t nand, int32_t row, int32_t col, int8_t id) +{ + struct nandbus_ivar *ivar; + device_t nandbus; + uint8_t addr; + int err = 0; + int i; + + nandbus = device_get_parent(nand); + ivar = device_get_ivars(nand); + + if (id != -1) { + nand_debug(NDBG_GEN,"send_address: send id %02x", id); + err = NANDBUS_SEND_ADDRESS(nandbus, id); + } + + if (!err && col != -1) { + for (i = 0; i < ivar->cols; i++, col >>= 8) { + addr = (uint8_t)(col & 0xff); + nand_debug(NDBG_GEN,"send_address: send address column " + "%02x", addr); + err = NANDBUS_SEND_ADDRESS(nandbus, addr); + if (err) + break; + } + } + + if (!err && row != -1) { + for (i = 0; i < ivar->rows; i++, row >>= 8) { + addr = (uint8_t)(row & 0xff); + nand_debug(NDBG_GEN,"send_address: send address row " + "%02x", addr); + err = NANDBUS_SEND_ADDRESS(nandbus, addr); + if (err) + break; + } + } + + return (err); +} + +static int +generic_is_blk_bad(device_t dev, uint32_t block, uint8_t *bad) +{ + struct nand_chip *chip; + int page_number, err, i; + uint8_t *oob; + + chip = device_get_softc(dev); + + oob = malloc(chip->chip_geom.oob_size, M_NAND, M_WAITOK); + if (!oob) { + device_printf(dev, "%s: cannot allocate OOB\n", __func__); + return (ENOMEM); + } + + page_number = block * chip->chip_geom.pgs_per_blk; + *bad = 0; + + /* Check OOB of first and second page */ + for (i = 0; i < 2; i++) { + err = NAND_READ_OOB(dev, page_number + i, oob, + chip->chip_geom.oob_size, 0); + if (err) { + device_printf(dev, "%s: cannot allocate OOB\n", + __func__); + free(oob, M_NAND); + return (ENOMEM); + } + + if (!oob[0]) { + *bad = 1; + free(oob, M_NAND); + return (0); + } + } + + free(oob, M_NAND); + + return (0); +} + +static int +generic_get_ecc(device_t dev, void *buf, void *ecc, int *needwrite) +{ + struct nand_chip *chip = device_get_softc(dev); + struct chip_geom *cg = &chip->chip_geom; + + return (NANDBUS_GET_ECC(device_get_parent(dev), buf, cg->page_size, + ecc, needwrite)); +} + +static int +generic_correct_ecc(device_t dev, void *buf, void *readecc, void *calcecc) +{ + struct nand_chip *chip = device_get_softc(dev); + struct chip_geom *cg = &chip->chip_geom; + + return (NANDBUS_CORRECT_ECC(device_get_parent(dev), buf, + cg->page_size, readecc, calcecc)); +} + + +#if 0 +int +nand_chng_read_col(device_t nand, uint32_t col, void *buf, size_t len) +{ + struct nand_chip *chip; + device_t nandbus; + + chip = device_get_softc(nand); + nandbus = device_get_parent(nand); + + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_READ_COL)) + return (ENXIO); + + if (NANDBUS_SEND_ADDRESS(nandbus, -1, col, -1)) + return (ENXIO); + + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_READ_COL_END)) + return (ENXIO); + + if (NANDBUS_START_COMMAND(nandbus)) + return (ENXIO); + + if (buf != NULL && len > 0) + NANDBUS_READ_BUFFER(nandbus, buf, len); + + return (0); +} + +int +nand_chng_write_col(device_t dev, uint32_t col, void *buf, + size_t len) +{ + struct nand_chip *chip; + device_t nandbus; + + chip = device_get_softc(dev); + nandbus = device_get_parent(dev); + + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_WRITE_COL)) + return (ENXIO); + + if (NANDBUS_SEND_ADDRESS(nandbus, -1, col, -1)) + return (ENXIO); + + if (buf != NULL && len > 0) + NANDBUS_WRITE_BUFFER(nandbus, buf, len); + + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_READ_COL_END)) + return (ENXIO); + + if (NANDBUS_START_COMMAND(nandbus)) + return (ENXIO); + + return (0); +} + +int +nand_copyback_read(device_t dev, uint32_t page, uint32_t col, + void *buf, size_t len) +{ + struct nand_chip *chip; + struct page_stat *pg_stat; + device_t nandbus; + uint32_t row; + + nand_debug(NDBG_GEN," raw read page %x[%x] at %x", page, col, len); + chip = device_get_softc(dev); + nandbus = device_get_parent(dev); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + + if (send_read_page(nand, NAND_CMD_READ, NAND_CMD_READ_CPBK, row, 0)) + return (ENXIO); + + DELAY(chip->t_r); + if (check_fail(nandbus)) + return (ENXIO); + + if (buf != NULL && len > 0) + NANDBUS_READ_BUFFER(nandbus, buf, len); + + pg_stat = &(chip->pg_stat[page]); + pg_stat->page_raw_read++; + + return (0); +} + +int +nand_copyback_prog(device_t dev, uint32_t page, uint32_t col, + void *buf, size_t len) +{ + struct nand_chip *chip; + struct page_stat *pg_stat; + device_t nandbus; + uint32_t row; + + nand_debug(NDBG_GEN,"copyback prog page %x[%x]", page, len); + chip = device_get_softc(dev); + nandbus = device_get_parent(dev); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + + if (!can_write(nandbus)) + return (ENXIO); + + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_WRITE_COL)) + return (ENXIO); + + if (NANDBUS_SEND_ADDRESS(nandbus, row, col, -1)) + return (ENXIO); + + if (buf != NULL && len > 0) + NANDBUS_WRITE_BUFFER(nandbus, buf, len); + + if (send_end_program_page(nandbus, NAND_CMD_PROG_END)) + return (ENXIO); + + DELAY(chip->t_prog); + + if (check_fail(nandbus)) + return (ENXIO); + + pg_stat = &(chip->pg_stat[page]); + pg_stat->page_raw_written++; + + return (0); +} + +int +nand_copyback_prog_intlv(device_t dev, uint32_t page) +{ + struct nand_chip *chip; + struct page_stat *pg_stat; + device_t nandbus; + uint32_t row; + + nand_debug(NDBG_GEN,"cache prog page %x", page); + chip = device_get_softc(dev); + nandbus = device_get_parent(dev); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + + if (!can_write(nandbus)) + return (ENXIO); + + if (send_start_program_page(nand, row, 0)) + return (ENXIO); + + if (send_end_program_page(nandbus, NAND_CMD_PROG_INTLV)) + return (ENXIO); + + DELAY(chip->t_prog); + + if (check_fail(nandbus)) + return (ENXIO); + + pg_stat = &(chip->pg_stat[page]); + pg_stat->page_raw_written++; + + return (0); +} + +int +nand_prog_cache(device_t dev, uint32_t page, uint32_t col, + void *buf, size_t len, uint8_t end) +{ + struct nand_chip *chip; + struct page_stat *pg_stat; + device_t nandbus; + uint32_t row; + uint8_t command; + + nand_debug(NDBG_GEN,"cache prog page %x[%x]", page, len); + chip = device_get_softc(dev); + nandbus = device_get_parent(dev); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + + if (!can_write(nandbus)) + return (ENXIO); + + if (send_start_program_page(dev, row, 0)) + return (ENXIO); + + NANDBUS_WRITE_BUFFER(nandbus, buf, len); + + if (end) + command = NAND_CMD_PROG_END; + else + command = NAND_CMD_PROG_CACHE; + + if (send_end_program_page(nandbus, command)) + return (ENXIO); + + DELAY(chip->t_prog); + + if (check_fail(nandbus)) + return (ENXIO); + + pg_stat = &(chip->pg_stat[page]); + pg_stat->page_raw_written++; + + return (0); +} + +int +nand_read_cache(device_t dev, uint32_t page, uint32_t col, + void *buf, size_t len, uint8_t end) +{ + struct nand_chip *chip; + struct page_stat *pg_stat; + device_t nandbus; + uint32_t row; + uint8_t command; + + nand_debug(NDBG_GEN,"cache read page %x[%x] ", page, len); + chip = device_get_softc(dev); + nandbus = device_get_parent(dev); + + if (nand_check_page_boundary(chip, page)) + return (ENXIO); + + page_to_row(&chip->chip_geom, page, &row); + + if (page != -1) { + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_READ)) + return (ENXIO); + + if (NANDBUS_SEND_ADDRESS(nandbus, row, col, -1)) + return (ENXIO); + } + + if (end) + command = NAND_CMD_READ_CACHE_END; + else + command = NAND_CMD_READ_CACHE; + + if (NANDBUS_SEND_COMMAND(nandbus, command)) + return (ENXIO); + + if (NANDBUS_START_COMMAND(nandbus)) + return (ENXIO); + + DELAY(chip->t_r); + if (check_fail(nandbus)) + return (ENXIO); + + if (buf != NULL && len > 0) + NANDBUS_READ_BUFFER(nandbus, buf, len); + + pg_stat = &(chip->pg_stat[page]); + pg_stat->page_raw_read++; + + return (0); +} + +int +nand_get_feature(device_t dev, uint8_t feat, void *buf) +{ + struct nand_chip *chip; + device_t nandbus; + + nand_debug(NDBG_GEN,"nand get feature"); + + chip = device_get_softc(dev); + nandbus = device_get_parent(dev); + + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_GET_FEATURE)) + return (ENXIO); + + if (NANDBUS_SEND_ADDRESS(nandbus, -1, -1, feat)) + return (ENXIO); + + if (NANDBUS_START_COMMAND(nandbus)) + return (ENXIO); + + DELAY(chip->t_r); + NANDBUS_READ_BUFFER(nandbus, buf, 4); + + return (0); +} + +int +nand_set_feature(device_t dev, uint8_t feat, void *buf) +{ + struct nand_chip *chip; + device_t nandbus; + + nand_debug(NDBG_GEN,"nand set feature"); + + chip = device_get_softc(dev); + nandbus = device_get_parent(dev); + + if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_SET_FEATURE)) + return (ENXIO); + + if (NANDBUS_SEND_ADDRESS(nandbus, -1, -1, feat)) + return (ENXIO); + + NANDBUS_WRITE_BUFFER(nandbus, buf, 4); + + if (NANDBUS_START_COMMAND(nandbus)) + return (ENXIO); + + return (0); +} +#endif diff --git a/sys/dev/nand/nand_geom.c b/sys/dev/nand/nand_geom.c new file mode 100644 index 00000000000..a8bdba28d29 --- /dev/null +++ b/sys/dev/nand/nand_geom.c @@ -0,0 +1,414 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "nand_if.h" +#include "nandbus_if.h" + +#define BIO_NAND_STD ((void *)1) +#define BIO_NAND_RAW ((void *)2) + +static disk_ioctl_t nand_ioctl; +static disk_getattr_t nand_getattr; +static disk_strategy_t nand_strategy; +static disk_strategy_t nand_strategy_raw; + +static int +nand_read(struct nand_chip *chip, uint32_t offset, void *buf, uint32_t len) +{ + + nand_debug(NDBG_GEOM, "Read from chip %d [%p] at %d", chip->num, chip, + offset); + + return (nand_read_pages(chip, offset, buf, len)); +} + +static int +nand_write(struct nand_chip *chip, uint32_t offset, void* buf, uint32_t len) +{ + + nand_debug(NDBG_GEOM, "Write to chip %d [%p] at %d", chip->num, chip, + offset); + + return (nand_prog_pages(chip, offset, buf, len)); +} + +static int +nand_read_raw(struct nand_chip *chip, uint32_t offset, void *buf, uint32_t len) +{ + nand_debug(NDBG_GEOM, "Raw read from chip %d [%p] at %d", chip->num, + chip, offset); + + return (nand_read_pages_raw(chip, offset, buf, len)); +} + +static int +nand_write_raw(struct nand_chip *chip, uint32_t offset, void *buf, uint32_t len) +{ + + nand_debug(NDBG_GEOM, "Raw write to chip %d [%p] at %d", chip->num, + chip, offset); + + return (nand_prog_pages_raw(chip, offset, buf, len)); +} + +static void +nand_strategy(struct bio *bp) +{ + struct nand_chip *chip; + + chip = (struct nand_chip *)bp->bio_disk->d_drv1; + + bp->bio_driver1 = BIO_NAND_STD; + + nand_debug(NDBG_GEOM, "Strategy %s on chip %d [%p]", + (bp->bio_cmd & BIO_READ) == BIO_READ ? "READ" : + ((bp->bio_cmd & BIO_WRITE) == BIO_WRITE ? "WRITE" : + ((bp->bio_cmd & BIO_DELETE) == BIO_DELETE ? "DELETE" : "UNKNOWN")), + chip->num, chip); + + mtx_lock(&chip->qlock); + bioq_insert_tail(&chip->bioq, bp); + mtx_unlock(&chip->qlock); + taskqueue_enqueue(chip->tq, &chip->iotask); +} + +static void +nand_strategy_raw(struct bio *bp) +{ + struct nand_chip *chip; + + chip = (struct nand_chip *)bp->bio_disk->d_drv1; + + /* Inform taskqueue that it's a raw access */ + bp->bio_driver1 = BIO_NAND_RAW; + + nand_debug(NDBG_GEOM, "Strategy %s on chip %d [%p]", + (bp->bio_cmd & BIO_READ) == BIO_READ ? "READ" : + ((bp->bio_cmd & BIO_WRITE) == BIO_WRITE ? "WRITE" : + ((bp->bio_cmd & BIO_DELETE) == BIO_DELETE ? "DELETE" : "UNKNOWN")), + chip->num, chip); + + mtx_lock(&chip->qlock); + bioq_insert_tail(&chip->bioq, bp); + mtx_unlock(&chip->qlock); + taskqueue_enqueue(chip->tq, &chip->iotask); +} + +static int +nand_oob_access(struct nand_chip *chip, uint32_t page, uint32_t offset, + uint32_t len, uint8_t *data, uint8_t write) +{ + struct chip_geom *cg; + int ret = 0; + + cg = &chip->chip_geom; + + if (!write) + ret = nand_read_oob(chip, page, data, cg->oob_size); + else + ret = nand_prog_oob(chip, page, data, cg->oob_size); + + return (ret); +} + +static int +nand_getattr(struct bio *bp) +{ + struct nand_chip *chip; + struct chip_geom *cg; + device_t dev; + + if (bp->bio_disk == NULL || bp->bio_disk->d_drv1 == NULL) + return (ENXIO); + + chip = (struct nand_chip *)bp->bio_disk->d_drv1; + cg = &(chip->chip_geom); + + dev = device_get_parent(chip->dev); + dev = device_get_parent(dev); + + do { + if (g_handleattr_int(bp, "NAND::oobsize", cg->oob_size)) + break; + else if (g_handleattr_int(bp, "NAND::pagesize", cg->page_size)) + break; + else if (g_handleattr_int(bp, "NAND::blocksize", + cg->block_size)) + break; + else if (g_handleattr(bp, "NAND::device", &(dev), + sizeof(device_t))) + break; + + return (ERESTART); + } while (0); + + return (EJUSTRETURN); +} + +static int +nand_ioctl(struct disk *ndisk, u_long cmd, void *data, int fflag, + struct thread *td) +{ + struct nand_chip *chip; + struct nand_oob_rw *oob_rw = NULL; + struct nand_raw_rw *raw_rw = NULL; + device_t nandbus; + uint8_t *buf = NULL; + int ret = 0; + uint8_t status; + + chip = (struct nand_chip *)ndisk->d_drv1; + nandbus = device_get_parent(chip->dev); + + if ((cmd == NAND_IO_RAW_READ) || (cmd == NAND_IO_RAW_PROG)) { + raw_rw = (struct nand_raw_rw *)data; + buf = malloc(raw_rw->len, M_NAND, M_WAITOK); + } + switch (cmd) { + case NAND_IO_ERASE: + ret = nand_erase_blocks(chip, ((off_t *)data)[0], + ((off_t *)data)[1]); + break; + + case NAND_IO_OOB_READ: + oob_rw = (struct nand_oob_rw *)data; + ret = nand_oob_access(chip, oob_rw->page, 0, + oob_rw->len, oob_rw->data, 0); + break; + + case NAND_IO_OOB_PROG: + oob_rw = (struct nand_oob_rw *)data; + ret = nand_oob_access(chip, oob_rw->page, 0, + oob_rw->len, oob_rw->data, 1); + break; + + case NAND_IO_GET_STATUS: + NANDBUS_LOCK(nandbus); + ret = NANDBUS_GET_STATUS(nandbus, &status); + if (ret == 0) + *(uint8_t *)data = status; + NANDBUS_UNLOCK(nandbus); + break; + + case NAND_IO_RAW_PROG: + copyin(raw_rw->data, buf, raw_rw->len); + ret = nand_prog_pages_raw(chip, raw_rw->off, buf, + raw_rw->len); + break; + + case NAND_IO_RAW_READ: + ret = nand_read_pages_raw(chip, raw_rw->off, buf, + raw_rw->len); + copyout(buf, raw_rw->data, raw_rw->len); + break; + + case NAND_IO_GET_CHIP_PARAM: + nand_get_chip_param(chip, (struct chip_param_io *)data); + break; + + default: + printf("Unknown nand_ioctl request \n"); + ret = EIO; + } + + if (buf) + free(buf, M_NAND); + + return (ret); +} + +static void +nand_io_proc(void *arg, int pending) +{ + struct nand_chip *chip = arg; + struct bio *bp; + int err = 0; + + for (;;) { + mtx_lock(&chip->qlock); + bp = bioq_takefirst(&chip->bioq); + mtx_unlock(&chip->qlock); + if (bp == NULL) + break; + + if (bp->bio_driver1 == BIO_NAND_STD) { + if ((bp->bio_cmd & BIO_READ) == BIO_READ) { + err = nand_read(chip, + bp->bio_offset & 0xffffffff, + bp->bio_data, bp->bio_bcount); + } else if ((bp->bio_cmd & BIO_WRITE) == BIO_WRITE) { + err = nand_write(chip, + bp->bio_offset & 0xffffffff, + bp->bio_data, bp->bio_bcount); + } + } else if (bp->bio_driver1 == BIO_NAND_RAW) { + if ((bp->bio_cmd & BIO_READ) == BIO_READ) { + err = nand_read_raw(chip, + bp->bio_offset & 0xffffffff, + bp->bio_data, bp->bio_bcount); + } else if ((bp->bio_cmd & BIO_WRITE) == BIO_WRITE) { + err = nand_write_raw(chip, + bp->bio_offset & 0xffffffff, + bp->bio_data, bp->bio_bcount); + } + } else + panic("Unknown access type in bio->bio_driver1\n"); + + if ((bp->bio_cmd & BIO_DELETE) == BIO_DELETE) { + nand_debug(NDBG_GEOM, "Delete on chip%d offset %lld " + "length %ld\n", chip->num, bp->bio_offset, + bp->bio_bcount); + err = nand_erase_blocks(chip, + bp->bio_offset & 0xffffffff, + bp->bio_bcount); + } + + if (err == 0 || err == ECC_CORRECTABLE) + bp->bio_resid = 0; + else { + nand_debug(NDBG_GEOM,"nand_[read|write|erase_blocks] " + "error: %d\n", err); + + bp->bio_error = EIO; + bp->bio_flags |= BIO_ERROR; + bp->bio_resid = bp->bio_bcount; + } + biodone(bp); + } +} + +int +create_geom_disk(struct nand_chip *chip) +{ + struct disk *ndisk, *rdisk; + + /* Create the disk device */ + ndisk = disk_alloc(); + ndisk->d_strategy = nand_strategy; + ndisk->d_ioctl = nand_ioctl; + ndisk->d_getattr = nand_getattr; + ndisk->d_name = "gnand"; + ndisk->d_drv1 = chip; + ndisk->d_maxsize = chip->chip_geom.block_size; + ndisk->d_sectorsize = chip->chip_geom.page_size; + ndisk->d_mediasize = chip->chip_geom.chip_size; + ndisk->d_unit = chip->num + + 10 * device_get_unit(device_get_parent(chip->dev)); + + /* + * When using BBT, make two last blocks of device unavailable + * to user (because those are used to store BBT table). + */ + if (chip->bbt != NULL) + ndisk->d_mediasize -= (2 * chip->chip_geom.block_size); + + ndisk->d_flags = DISKFLAG_CANDELETE; + + snprintf(ndisk->d_ident, sizeof(ndisk->d_ident), + "nand: Man:0x%02x Dev:0x%02x", chip->id.man_id, chip->id.dev_id); + + disk_create(ndisk, DISK_VERSION); + + /* Create the RAW disk device */ + rdisk = disk_alloc(); + rdisk->d_strategy = nand_strategy_raw; + rdisk->d_ioctl = nand_ioctl; + rdisk->d_getattr = nand_getattr; + rdisk->d_name = "gnand.raw"; + rdisk->d_drv1 = chip; + rdisk->d_maxsize = chip->chip_geom.block_size; + rdisk->d_sectorsize = chip->chip_geom.page_size; + rdisk->d_mediasize = chip->chip_geom.chip_size; + rdisk->d_unit = chip->num + + 10 * device_get_unit(device_get_parent(chip->dev)); + + rdisk->d_flags = DISKFLAG_CANDELETE; + + snprintf(rdisk->d_ident, sizeof(rdisk->d_ident), + "nand_raw: Man:0x%02x Dev:0x%02x", chip->id.man_id, + chip->id.dev_id); + + disk_create(rdisk, DISK_VERSION); + + chip->ndisk = ndisk; + chip->rdisk = rdisk; + + mtx_init(&chip->qlock, "NAND I/O lock", NULL, MTX_DEF); + bioq_init(&chip->bioq); + + TASK_INIT(&chip->iotask, 0, nand_io_proc, chip); + chip->tq = taskqueue_create("nand_taskq", M_WAITOK, + taskqueue_thread_enqueue, &chip->tq); + taskqueue_start_threads(&chip->tq, 1, PI_DISK, "nand taskq"); + + if (bootverbose) + device_printf(chip->dev, "Created gnand%d for chip [0x%0x, " + "0x%0x]\n", ndisk->d_unit, chip->id.man_id, + chip->id.dev_id); + + return (0); +} + +void +destroy_geom_disk(struct nand_chip *chip) +{ + struct bio *bp; + + taskqueue_free(chip->tq); + disk_destroy(chip->ndisk); + disk_destroy(chip->rdisk); + + mtx_lock(&chip->qlock); + for (;;) { + bp = bioq_takefirst(&chip->bioq); + if (bp == NULL) + break; + bp->bio_error = EIO; + bp->bio_flags |= BIO_ERROR; + bp->bio_resid = bp->bio_bcount; + + biodone(bp); + } + mtx_unlock(&chip->qlock); + + mtx_destroy(&chip->qlock); +} diff --git a/sys/dev/nand/nand_id.c b/sys/dev/nand/nand_id.c new file mode 100644 index 00000000000..75c58342556 --- /dev/null +++ b/sys/dev/nand/nand_id.c @@ -0,0 +1,60 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include + +struct nand_params nand_ids[] = { + { { NAND_MAN_SAMSUNG, 0x75 }, "Samsung K9F5608U0B", + 0x20, 0x200, 0x10, 0x20, 0 }, + { { NAND_MAN_SAMSUNG, 0xd3 }, "Samsung NAND 1GiB 3,3V 8-bit", + 0x400, 0x800, 0x40, 0x40, 0 }, + { { NAND_MAN_HYNIX, 0x76 }, "Hynix NAND 64MiB 3,3V 8-bit", + 0x40, 0x200, 0x10, 0x20, 0 }, + { { NAND_MAN_HYNIX, 0xdc }, "Hynix NAND 512MiB 3,3V 8-bit", + 0x200, 0x800, 0x40, 0x40, 0 }, + { { NAND_MAN_HYNIX, 0x79 }, "NAND 128MB 3,3V 8-bit", + 0x80, 0x200, 0x10, 0x20, 0 }, + { { NAND_MAN_STMICRO, 0xf1 }, "STMicro 128MB 3,3V 8-bit", + 0x80, 2048, 64, 0x40, 0 }, +}; + +struct nand_params *nand_get_params(struct nand_id *id) +{ + int i; + + for (i = 0; i < sizeof(nand_ids) / sizeof(nand_ids[0]); i++) + if (nand_ids[i].id.man_id == id->man_id && + nand_ids[i].id.dev_id == id->dev_id) + return (&nand_ids[i]); + + return (NULL); +} diff --git a/sys/dev/nand/nand_if.m b/sys/dev/nand/nand_if.m new file mode 100644 index 00000000000..49c8879b689 --- /dev/null +++ b/sys/dev/nand/nand_if.m @@ -0,0 +1,168 @@ +#- +# Copyright (C) 2009-2012 Semihalf +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ + +# NAND chip interface description +# + +#include +#include + +INTERFACE nand; + +CODE { + static int nand_method_not_supported(device_t dev) + { + return (ENOENT); + } +}; + +# Read NAND page +# +# Return values: +# 0: Success +# +METHOD int read_page { + device_t dev; + uint32_t page; + void* buf; + uint32_t len; + uint32_t offset; +}; + +# Program NAND page +# +# Return values: +# 0: Success +# +METHOD int program_page { + device_t dev; + uint32_t page; + void* buf; + uint32_t len; + uint32_t offset; +}; + +# Program NAND page interleaved +# +# Return values: +# 0: Success +# +METHOD int program_page_intlv { + device_t dev; + uint32_t page; + void* buf; + uint32_t len; + uint32_t offset; +} DEFAULT nand_method_not_supported; + +# Read NAND oob +# +# Return values: +# 0: Success +# +METHOD int read_oob { + device_t dev; + uint32_t page; + void* buf; + uint32_t len; + uint32_t offset; +}; + +# Program NAND oob +# +# Return values: +# 0: Success +# +METHOD int program_oob { + device_t dev; + uint32_t page; + void* buf; + uint32_t len; + uint32_t offset; +}; + +# Erase NAND block +# +# Return values: +# 0: Success +# +METHOD int erase_block { + device_t dev; + uint32_t block; +}; + +# Erase NAND block interleaved +# +# Return values: +# 0: Success +# +METHOD int erase_block_intlv { + device_t dev; + uint32_t block; +} DEFAULT nand_method_not_supported; + +# NAND get status +# +# Return values: +# 0: Success +# +METHOD int get_status { + device_t dev; + uint8_t *status; +}; + +# NAND check if block is bad +# +# Return values: +# 0: Success +# +METHOD int is_blk_bad { + device_t dev; + uint32_t block_number; + uint8_t *bad; +}; + +# NAND get ECC +# +# +METHOD int get_ecc { + device_t dev; + void *buf; + void *ecc; + int *needwrite; +}; + +# NAND correct ECC +# +# +METHOD int correct_ecc { + device_t dev; + void *buf; + void *readecc; + void *calcecc; +}; + diff --git a/sys/dev/nand/nandbus.c b/sys/dev/nand/nandbus.c new file mode 100644 index 00000000000..322d708b165 --- /dev/null +++ b/sys/dev/nand/nandbus.c @@ -0,0 +1,530 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "nand_if.h" +#include "nandbus_if.h" +#include "nfc_if.h" + +#define NAND_NCS 4 + +static int nandbus_probe(device_t dev); +static int nandbus_attach(device_t dev); +static int nandbus_detach(device_t dev); + +static int nandbus_child_location_str(device_t, device_t, char *, size_t); +static int nandbus_child_pnpinfo_str(device_t, device_t, char *, size_t); + +static int nandbus_get_status(device_t, uint8_t *); +static void nandbus_read_buffer(device_t, void *, uint32_t); +static int nandbus_select_cs(device_t, uint8_t); +static int nandbus_send_command(device_t, uint8_t); +static int nandbus_send_address(device_t, uint8_t); +static int nandbus_start_command(device_t); +static int nandbus_wait_ready(device_t, uint8_t *); +static void nandbus_write_buffer(device_t, void *, uint32_t); +static int nandbus_get_ecc(device_t, void *, uint32_t, void *, int *); +static int nandbus_correct_ecc(device_t, void *, int, void *, void *); +static void nandbus_lock(device_t); +static void nandbus_unlock(device_t); + +static int nand_readid(device_t, uint8_t *, uint8_t *); +static int nand_probe_onfi(device_t, uint8_t *); +static int nand_reset(device_t); + +struct nandbus_softc { + device_t dev; + struct cv nandbus_cv; + struct mtx nandbus_mtx; + uint8_t busy; +}; + +static device_method_t nandbus_methods[] = { + /* device interface */ + DEVMETHOD(device_probe, nandbus_probe), + DEVMETHOD(device_attach, nandbus_attach), + DEVMETHOD(device_detach, nandbus_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + + /* bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + DEVMETHOD(bus_driver_added, bus_generic_driver_added), + DEVMETHOD(bus_child_pnpinfo_str, nandbus_child_pnpinfo_str), + DEVMETHOD(bus_child_location_str, nandbus_child_location_str), + + /* nandbus interface */ + DEVMETHOD(nandbus_get_status, nandbus_get_status), + DEVMETHOD(nandbus_read_buffer, nandbus_read_buffer), + DEVMETHOD(nandbus_select_cs, nandbus_select_cs), + DEVMETHOD(nandbus_send_command, nandbus_send_command), + DEVMETHOD(nandbus_send_address, nandbus_send_address), + DEVMETHOD(nandbus_start_command,nandbus_start_command), + DEVMETHOD(nandbus_wait_ready, nandbus_wait_ready), + DEVMETHOD(nandbus_write_buffer, nandbus_write_buffer), + DEVMETHOD(nandbus_get_ecc, nandbus_get_ecc), + DEVMETHOD(nandbus_correct_ecc, nandbus_correct_ecc), + DEVMETHOD(nandbus_lock, nandbus_lock), + DEVMETHOD(nandbus_unlock, nandbus_unlock), + { 0, 0 } +}; + +devclass_t nandbus_devclass; + +driver_t nandbus_driver = { + "nandbus", + nandbus_methods, + sizeof(struct nandbus_softc) +}; + +DRIVER_MODULE(nandbus, nand, nandbus_driver, nandbus_devclass, 0, 0); + +int +nandbus_create(device_t nfc) +{ + device_t child; + + child = device_add_child(nfc, "nandbus", -1); + if (!child) + return (ENODEV); + + bus_generic_attach(nfc); + + return(0); +} + +void +nandbus_destroy(device_t nfc) +{ + device_t *children; + int nchildren, i; + + mtx_lock(&Giant); + /* Detach & delete all children */ + if (!device_get_children(nfc, &children, &nchildren)) { + for (i = 0; i < nchildren; i++) + device_delete_child(nfc, children[i]); + + free(children, M_TEMP); + } + mtx_unlock(&Giant); +} + +static int +nandbus_probe(device_t dev) +{ + + device_set_desc(dev, "NAND bus"); + + return (0); +} + +static int +nandbus_attach(device_t dev) +{ + device_t child, nfc; + struct nand_id chip_id; + struct nandbus_softc *sc; + struct nandbus_ivar *ivar; + struct nand_softc *nfc_sc; + struct nand_params *chip_params; + uint8_t cs, onfi; + + sc = device_get_softc(dev); + sc->dev = dev; + + nfc = device_get_parent(dev); + nfc_sc = device_get_softc(nfc); + + mtx_init(&sc->nandbus_mtx, "nandbus lock", MTX_DEF, 0); + cv_init(&sc->nandbus_cv, "nandbus cv"); + + /* Check each possible CS for existing nand devices */ + for (cs = 0; cs < NAND_NCS; cs++) { + nand_debug(NDBG_BUS,"probe chip select %x", cs); + + /* Select & reset chip */ + if (nandbus_select_cs(dev, cs)) + break; + + if (nand_reset(dev)) + continue; + + /* Read manufacturer and device id */ + if (nand_readid(dev, &chip_id.man_id, &chip_id.dev_id)) + continue; + + if (chip_id.man_id == 0xff) + continue; + + /* Check if chip is ONFI compliant */ + if (nand_probe_onfi(dev, &onfi) != 0) { + continue; + } + + ivar = malloc(sizeof(struct nandbus_ivar), + M_NAND, M_WAITOK); + + if (onfi == 1) { + ivar->cs = cs; + ivar->cols = 0; + ivar->rows = 0; + ivar->params = NULL; + ivar->man_id = chip_id.man_id; + ivar->dev_id = chip_id.dev_id; + ivar->is_onfi = onfi; + ivar->chip_cdev_name = nfc_sc->chip_cdev_name; + + child = device_add_child(dev, NULL, -1); + device_set_ivars(child, ivar); + continue; + } + + chip_params = nand_get_params(&chip_id); + if (chip_params == NULL) { + nand_debug(NDBG_BUS,"Chip description not found! " + "(manuf: 0x%0x, chipid: 0x%0x)\n", + chip_id.man_id, chip_id.dev_id); + free(ivar, M_NAND); + continue; + } + + ivar->cs = cs; + ivar->cols = 1; + ivar->rows = 2; + ivar->params = chip_params; + ivar->man_id = chip_id.man_id; + ivar->dev_id = chip_id.dev_id; + ivar->is_onfi = onfi; + ivar->chip_cdev_name = nfc_sc->chip_cdev_name; + + /* + * Check what type of device we have. + * devices bigger than 32MiB have on more row (3) + */ + if (chip_params->chip_size > 32) + ivar->rows++; + /* Large page devices have one more col (2) */ + if (chip_params->chip_size >= 128 && + chip_params->page_size > 512) + ivar->cols++; + + child = device_add_child(dev, NULL, -1); + device_set_ivars(child, ivar); + } + + bus_generic_attach(dev); + return (0); +} + +static int +nandbus_detach(device_t dev) +{ + struct nandbus_softc *sc; + + sc = device_get_softc(dev); + + bus_generic_detach(dev); + + mtx_destroy(&sc->nandbus_mtx); + cv_destroy(&sc->nandbus_cv); + + return (0); +} + +static int +nandbus_child_location_str(device_t bus, device_t child, char *buf, + size_t buflen) +{ + struct nandbus_ivar *ivar = device_get_ivars(child); + + snprintf(buf, buflen, "at cs#%d", ivar->cs); + return (0); +} + +static int +nandbus_child_pnpinfo_str(device_t bus, device_t child, char *buf, + size_t buflen) +{ + // XXX man id, model id ???? + *buf = '\0'; + return (0); +} + +static int +nand_readid(device_t bus, uint8_t *man_id, uint8_t *dev_id) +{ + device_t nfc; + + if (!bus || !man_id || !dev_id) + return (EINVAL); + + nand_debug(NDBG_BUS,"read id"); + + nfc = device_get_parent(bus); + + if (NFC_SEND_COMMAND(nfc, NAND_CMD_READ_ID)) { + nand_debug(NDBG_BUS,"Error : could not send READ ID command"); + return (ENXIO); + } + + if (NFC_SEND_ADDRESS(nfc, 0)) { + nand_debug(NDBG_BUS,"Error : could not sent address to chip"); + return (ENXIO); + } + + if (NFC_START_COMMAND(nfc) != 0) { + nand_debug(NDBG_BUS,"Error : could not start command"); + return (ENXIO); + } + + DELAY(25); + + *man_id = NFC_READ_BYTE(nfc); + *dev_id = NFC_READ_BYTE(nfc); + + nand_debug(NDBG_BUS,"manufacturer id: %x chip id: %x", *man_id, + *dev_id); + + return (0); +} + +static int +nand_probe_onfi(device_t bus, uint8_t *onfi_compliant) +{ + device_t nfc; + char onfi_id[] = {'o', 'n', 'f', 'i', '\0'}; + int i; + + nand_debug(NDBG_BUS,"probing ONFI"); + + nfc = device_get_parent(bus); + + if (NFC_SEND_COMMAND(nfc, NAND_CMD_READ_ID)) { + nand_debug(NDBG_BUS,"Error : could not sent READ ID command"); + return (ENXIO); + } + + if (NFC_SEND_ADDRESS(nfc, ONFI_SIG_ADDR)) { + nand_debug(NDBG_BUS,"Error : could not sent address to chip"); + return (ENXIO); + } + + if (NFC_START_COMMAND(nfc) != 0) { + nand_debug(NDBG_BUS,"Error : could not start command"); + return (ENXIO); + } + for (i = 0; onfi_id[i] != '\0'; i++) + if (NFC_READ_BYTE(nfc) != onfi_id[i]) { + nand_debug(NDBG_BUS,"ONFI non-compliant"); + *onfi_compliant = 0; + return (0); + } + + nand_debug(NDBG_BUS,"ONFI compliant"); + *onfi_compliant = 1; + + return (0); +} + +static int +nand_reset(device_t bus) +{ + device_t nfc; + nand_debug(NDBG_BUS,"resetting..."); + + nfc = device_get_parent(bus); + + if (NFC_SEND_COMMAND(nfc, NAND_CMD_RESET) != 0) { + nand_debug(NDBG_BUS,"Error : could not sent RESET command"); + return (ENXIO); + } + + if (NFC_START_COMMAND(nfc) != 0) { + nand_debug(NDBG_BUS,"Error : could not start RESET command"); + return (ENXIO); + } + + DELAY(1000); + + return (0); +} + +void +nandbus_lock(device_t dev) +{ + struct nandbus_softc *sc; + + sc = device_get_softc(dev); + + mtx_lock(&sc->nandbus_mtx); + if (sc->busy) + cv_wait(&sc->nandbus_cv, &sc->nandbus_mtx); + sc->busy = 1; + mtx_unlock(&sc->nandbus_mtx); +} + +void +nandbus_unlock(device_t dev) +{ + struct nandbus_softc *sc; + + sc = device_get_softc(dev); + + mtx_lock(&sc->nandbus_mtx); + sc->busy = 0; + cv_signal(&sc->nandbus_cv); + mtx_unlock(&sc->nandbus_mtx); +} + +int +nandbus_select_cs(device_t dev, uint8_t cs) +{ + + return (NFC_SELECT_CS(device_get_parent(dev), cs)); +} + +int +nandbus_send_command(device_t dev, uint8_t command) +{ + int err; + + if ((err = NFC_SEND_COMMAND(device_get_parent(dev), command))) + nand_debug(NDBG_BUS,"Err: Could not send command %x, err %x", + command, err); + + return (err); +} + +int +nandbus_send_address(device_t dev, uint8_t address) +{ + int err; + + if ((err = NFC_SEND_ADDRESS(device_get_parent(dev), address))) + nand_debug(NDBG_BUS,"Err: Could not send address %x, err %x", + address, err); + + return (err); +} + +int +nandbus_start_command(device_t dev) +{ + int err; + + if ((err = NFC_START_COMMAND(device_get_parent(dev)))) + nand_debug(NDBG_BUS,"Err: Could not start command, err %x", + err); + + return (err); +} + +void +nandbus_read_buffer(device_t dev, void *buf, uint32_t len) +{ + + NFC_READ_BUF(device_get_parent(dev), buf, len); +} + +void +nandbus_write_buffer(device_t dev, void *buf, uint32_t len) +{ + + NFC_WRITE_BUF(device_get_parent(dev), buf, len); +} + +int +nandbus_get_status(device_t dev, uint8_t *status) +{ + int err; + + if ((err = NANDBUS_SEND_COMMAND(dev, NAND_CMD_STATUS))) + return (err); + if ((err = NANDBUS_START_COMMAND(dev))) + return (err); + + *status = NFC_READ_BYTE(device_get_parent(dev)); + + return (0); +} + +int +nandbus_wait_ready(device_t dev, uint8_t *status) +{ + struct timeval tv, tv2; + + tv2.tv_sec = 0; + tv2.tv_usec = 50 * 5000; /* 10ms */ + + getmicrotime(&tv); + timevaladd(&tv, &tv2); + + do { + if (NANDBUS_GET_STATUS(dev, status)) + return (ENXIO); + + if (*status & NAND_STATUS_RDY) + return (0); + + getmicrotime(&tv2); + } while (timevalcmp(&tv2, &tv, <=)); + + return (EBUSY); +} + +int +nandbus_get_ecc(device_t dev, void *buf, uint32_t pagesize, void *ecc, + int *needwrite) +{ + + return (NFC_GET_ECC(device_get_parent(dev), buf, pagesize, ecc, needwrite)); +} + +int +nandbus_correct_ecc(device_t dev, void *buf, int pagesize, void *readecc, + void *calcecc) +{ + + return (NFC_CORRECT_ECC(device_get_parent(dev), buf, pagesize, + readecc, calcecc)); +} + diff --git a/sys/dev/nand/nandbus.h b/sys/dev/nand/nandbus.h new file mode 100644 index 00000000000..417fbf5e14b --- /dev/null +++ b/sys/dev/nand/nandbus.h @@ -0,0 +1,49 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _NANDBUS_H_ +#define _NANDBUS_H_ + +struct nandbus_ivar { + uint8_t cs; + uint8_t cols; + uint8_t rows; + uint8_t man_id; + uint8_t dev_id; + uint8_t is_onfi; + char *chip_cdev_name; + struct nand_params *params; +}; + +extern devclass_t nandbus_devclass; +extern driver_t nandbus_driver; + +int nandbus_create(device_t nfc); +void nandbus_destroy(device_t nfc); + +#endif /* _NANDBUS_H_ */ diff --git a/sys/dev/nand/nandbus_if.m b/sys/dev/nand/nandbus_if.m new file mode 100644 index 00000000000..e914e18de66 --- /dev/null +++ b/sys/dev/nand/nandbus_if.m @@ -0,0 +1,100 @@ +#- +# Copyright (C) 2009-2012 Semihalf +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ + +# NAND bus interface description +# + +#include +#include + +INTERFACE nandbus; + +METHOD int get_status { + device_t dev; + uint8_t * status; +}; + +METHOD void read_buffer { + device_t dev; + void * buf; + uint32_t len; +}; + +METHOD int select_cs { + device_t dev; + uint8_t cs; +}; + +METHOD int send_command { + device_t dev; + uint8_t command; +}; + +METHOD int send_address { + device_t dev; + uint8_t address; +}; + +METHOD int start_command { + device_t dev; +}; + +METHOD int wait_ready { + device_t dev; + uint8_t * status; +} + +METHOD void write_buffer { + device_t dev; + void * buf; + uint32_t len; +}; + +METHOD int get_ecc { + device_t dev; + void * buf; + uint32_t pagesize; + void * ecc; + int * needwrite; +}; + +METHOD int correct_ecc { + device_t dev; + void * buf; + int pagesize; + void * readecc; + void * calcecc; +}; + +METHOD void lock { + device_t dev; +}; + +METHOD void unlock { + device_t dev; +}; + diff --git a/sys/dev/nand/nandsim.c b/sys/dev/nand/nandsim.c new file mode 100644 index 00000000000..aeb35f352b7 --- /dev/null +++ b/sys/dev/nand/nandsim.c @@ -0,0 +1,667 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Simulated NAND controller driver */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +struct sim_param sim; +struct sim_ctrl_conf ctrls[MAX_SIM_DEV]; + +static struct cdev *nandsim_dev; +static d_ioctl_t nandsim_ioctl; + +static void nandsim_init_sim_param(struct sim_param *); +static int nandsim_create_ctrl(struct sim_ctrl *); +static int nandsim_destroy_ctrl(int); +static int nandsim_ctrl_status(struct sim_ctrl *); +static int nandsim_create_chip(struct sim_chip *); +static int nandsim_destroy_chip(struct sim_ctrl_chip *); +static int nandsim_chip_status(struct sim_chip *); +static int nandsim_start_ctrl(int); +static int nandsim_stop_ctrl(int); +static int nandsim_inject_error(struct sim_error *); +static int nandsim_get_block_state(struct sim_block_state *); +static int nandsim_set_block_state(struct sim_block_state *); +static int nandsim_modify(struct sim_mod *); +static int nandsim_dump(struct sim_dump *); +static int nandsim_restore(struct sim_dump *); +static int nandsim_freeze(struct sim_ctrl_chip *); +static void nandsim_print_log(struct sim_log *); +static struct nandsim_chip *get_nandsim_chip(uint8_t, uint8_t); + +static struct cdevsw nandsim_cdevsw = { + .d_version = D_VERSION, + .d_ioctl = nandsim_ioctl, + .d_name = "nandsim", +}; + +int +nandsim_ioctl(struct cdev *dev, u_long cmd, caddr_t data, + int flags, struct thread *td) +{ + int ret = 0; + + switch (cmd) { + case NANDSIM_SIM_PARAM: + nandsim_init_sim_param((struct sim_param *)data); + break; + case NANDSIM_CREATE_CTRL: + ret = nandsim_create_ctrl((struct sim_ctrl *)data); + break; + case NANDSIM_DESTROY_CTRL: + ret = nandsim_destroy_ctrl(*(int *)data); + break; + case NANDSIM_STATUS_CTRL: + ret = nandsim_ctrl_status((struct sim_ctrl *)data); + break; + case NANDSIM_CREATE_CHIP: + ret = nandsim_create_chip((struct sim_chip *)data); + break; + case NANDSIM_DESTROY_CHIP: + ret = nandsim_destroy_chip((struct sim_ctrl_chip *)data); + break; + case NANDSIM_STATUS_CHIP: + ret = nandsim_chip_status((struct sim_chip *)data); + break; + case NANDSIM_MODIFY: + ret = nandsim_modify((struct sim_mod *)data); + break; + case NANDSIM_START_CTRL: + ret = nandsim_start_ctrl(*(int *)data); + break; + case NANDSIM_STOP_CTRL: + ret = nandsim_stop_ctrl(*(int *)data); + break; + case NANDSIM_INJECT_ERROR: + ret = nandsim_inject_error((struct sim_error *)data); + break; + case NANDSIM_SET_BLOCK_STATE: + ret = nandsim_set_block_state((struct sim_block_state *)data); + break; + case NANDSIM_GET_BLOCK_STATE: + ret = nandsim_get_block_state((struct sim_block_state *)data); + break; + case NANDSIM_PRINT_LOG: + nandsim_print_log((struct sim_log *)data); + break; + case NANDSIM_DUMP: + ret = nandsim_dump((struct sim_dump *)data); + break; + case NANDSIM_RESTORE: + ret = nandsim_restore((struct sim_dump *)data); + break; + case NANDSIM_FREEZE: + ret = nandsim_freeze((struct sim_ctrl_chip *)data); + break; + default: + ret = EINVAL; + break; + } + + return (ret); +} + +static void +nandsim_init_sim_param(struct sim_param *param) +{ + + if (!param) + return; + + nand_debug(NDBG_SIM,"log level:%d output %d", param->log_level, + param->log_output); + nandsim_log_level = param->log_level; + nandsim_log_output = param->log_output; +} + +static int +nandsim_create_ctrl(struct sim_ctrl *ctrl) +{ + struct sim_ctrl_conf *sim_ctrl; + + nand_debug(NDBG_SIM,"create controller num:%d cs:%d",ctrl->num, + ctrl->num_cs); + + if (ctrl->num >= MAX_SIM_DEV) { + return (EINVAL); + } + + sim_ctrl = &ctrls[ctrl->num]; + if(sim_ctrl->created) + return (EEXIST); + + sim_ctrl->num = ctrl->num; + sim_ctrl->num_cs = ctrl->num_cs; + sim_ctrl->ecc = ctrl->ecc; + memcpy(sim_ctrl->ecc_layout, ctrl->ecc_layout, + MAX_ECC_BYTES * sizeof(ctrl->ecc_layout[0])); + strlcpy(sim_ctrl->filename, ctrl->filename, + FILENAME_SIZE); + sim_ctrl->created = 1; + + return (0); +} + +static int +nandsim_destroy_ctrl(int ctrl_num) +{ + + nand_debug(NDBG_SIM,"destroy controller num:%d", ctrl_num); + + if (ctrl_num >= MAX_SIM_DEV) { + return (EINVAL); + } + + if (!ctrls[ctrl_num].created) { + return (ENODEV); + } + + if (ctrls[ctrl_num].running) { + return (EBUSY); + } + + memset(&ctrls[ctrl_num], 0, sizeof(ctrls[ctrl_num])); + + return (0); +} + +static int +nandsim_ctrl_status(struct sim_ctrl *ctrl) +{ + + nand_debug(NDBG_SIM,"status controller num:%d cs:%d",ctrl->num, + ctrl->num_cs); + + if (ctrl->num >= MAX_SIM_DEV) { + return (EINVAL); + } + + ctrl->num_cs = ctrls[ctrl->num].num_cs; + ctrl->ecc = ctrls[ctrl->num].ecc; + memcpy(ctrl->ecc_layout, ctrls[ctrl->num].ecc_layout, + MAX_ECC_BYTES * sizeof(ctrl->ecc_layout[0])); + strlcpy(ctrl->filename, ctrls[ctrl->num].filename, + FILENAME_SIZE); + ctrl->running = ctrls[ctrl->num].running; + ctrl->created = ctrls[ctrl->num].created; + + return (0); +} + +static int +nandsim_create_chip(struct sim_chip *chip) +{ + struct sim_chip *sim_chip; + + nand_debug(NDBG_SIM,"create chip num:%d at ctrl:%d", chip->num, + chip->ctrl_num); + + if (chip->ctrl_num >= MAX_SIM_DEV || + chip->num >= MAX_CTRL_CS) { + return (EINVAL); + } + + if (ctrls[chip->ctrl_num].chips[chip->num]) { + return (EEXIST); + } + + sim_chip = malloc(sizeof(*sim_chip), M_NANDSIM, + M_WAITOK); + if (sim_chip == NULL) { + return (ENOMEM); + } + + memcpy(sim_chip, chip, sizeof(*sim_chip)); + ctrls[chip->ctrl_num].chips[chip->num] = sim_chip; + sim_chip->created = 1; + + return (0); +} + +static int +nandsim_destroy_chip(struct sim_ctrl_chip *chip) +{ + struct sim_ctrl_conf *ctrl_conf; + + nand_debug(NDBG_SIM,"destroy chip num:%d at ctrl:%d", chip->chip_num, + chip->ctrl_num); + + if (chip->ctrl_num >= MAX_SIM_DEV || + chip->chip_num >= MAX_CTRL_CS) + return (EINVAL); + + ctrl_conf = &ctrls[chip->ctrl_num]; + + if (!ctrl_conf->created || !ctrl_conf->chips[chip->chip_num]) + return (ENODEV); + + if (ctrl_conf->running) + return (EBUSY); + + free(ctrl_conf->chips[chip->chip_num], M_NANDSIM); + ctrl_conf->chips[chip->chip_num] = NULL; + + return (0); +} + +static int +nandsim_chip_status(struct sim_chip *chip) +{ + struct sim_ctrl_conf *ctrl_conf; + + nand_debug(NDBG_SIM,"status for chip num:%d at ctrl:%d", chip->num, + chip->ctrl_num); + + if (chip->ctrl_num >= MAX_SIM_DEV && + chip->num >= MAX_CTRL_CS) + return (EINVAL); + + ctrl_conf = &ctrls[chip->ctrl_num]; + if (!ctrl_conf->chips[chip->num]) + chip->created = 0; + else + memcpy(chip, ctrl_conf->chips[chip->num], sizeof(*chip)); + + return (0); +} + +static int +nandsim_start_ctrl(int num) +{ + device_t nexus, ndev; + devclass_t nexus_devclass; + int ret = 0; + + nand_debug(NDBG_SIM,"start ctlr num:%d", num); + + if (num >= MAX_SIM_DEV) + return (EINVAL); + + if (!ctrls[num].created) + return (ENODEV); + + if (ctrls[num].running) + return (EBUSY); + + /* We will add our device as a child of the nexus0 device */ + if (!(nexus_devclass = devclass_find("nexus")) || + !(nexus = devclass_get_device(nexus_devclass, 0))) + return (EFAULT); + + /* + * Create a newbus device representing this frontend instance + * + * XXX powerpc nexus doesn't implement bus_add_child, so child + * must be added by device_add_child(). + */ +#if defined(__powerpc__) + ndev = device_add_child(nexus, "nandsim", num); +#else + ndev = BUS_ADD_CHILD(nexus, 0, "nandsim", num); +#endif + if (!ndev) + return (EFAULT); + + mtx_lock(&Giant); + ret = device_probe_and_attach(ndev); + mtx_unlock(&Giant); + + if (ret == 0) { + ctrls[num].sim_ctrl_dev = ndev; + ctrls[num].running = 1; + } + + return (ret); +} + +static int +nandsim_stop_ctrl(int num) +{ + device_t nexus; + devclass_t nexus_devclass; + int ret = 0; + + nand_debug(NDBG_SIM,"stop controller num:%d", num); + + if (num >= MAX_SIM_DEV) { + return (EINVAL); + } + + if (!ctrls[num].created || !ctrls[num].running) { + return (ENODEV); + } + + /* We will add our device as a child of the nexus0 device */ + if (!(nexus_devclass = devclass_find("nexus")) || + !(nexus = devclass_get_device(nexus_devclass, 0))) { + return (ENODEV); + } + + mtx_lock(&Giant); + if (ctrls[num].sim_ctrl_dev) { + ret = device_delete_child(nexus, ctrls[num].sim_ctrl_dev); + ctrls[num].sim_ctrl_dev = NULL; + } + mtx_unlock(&Giant); + + ctrls[num].running = 0; + + return (ret); +} + +static struct nandsim_chip * +get_nandsim_chip(uint8_t ctrl_num, uint8_t chip_num) +{ + struct nandsim_softc *sc; + + if (!ctrls[ctrl_num].sim_ctrl_dev) + return (NULL); + + sc = device_get_softc(ctrls[ctrl_num].sim_ctrl_dev); + return (sc->chips[chip_num]); +} + +static void +nandsim_print_log(struct sim_log *sim_log) +{ + struct nandsim_softc *sc; + int len1, len2; + + if (!ctrls[sim_log->ctrl_num].sim_ctrl_dev) + return; + + sc = device_get_softc(ctrls[sim_log->ctrl_num].sim_ctrl_dev); + if (sc->log_buff) { + len1 = strlen(&sc->log_buff[sc->log_idx + 1]); + if (len1 >= sim_log->len) + len1 = sim_log->len; + copyout(&sc->log_buff[sc->log_idx + 1], sim_log->log, len1); + len2 = strlen(sc->log_buff); + if (len2 >= (sim_log->len - len1)) + len2 = (sim_log->len - len1); + copyout(sc->log_buff, &sim_log->log[len1], len2); + sim_log->len = len1 + len2; + } +} + +static int +nandsim_inject_error(struct sim_error *error) +{ + struct nandsim_chip *chip; + struct block_space *bs; + struct onfi_params *param; + int page, page_size, block, offset; + + nand_debug(NDBG_SIM,"inject error for chip %d at ctrl %d\n", + error->chip_num, error->ctrl_num); + + if (error->ctrl_num >= MAX_SIM_DEV || + error->chip_num >= MAX_CTRL_CS) + return (EINVAL); + + if (!ctrls[error->ctrl_num].created || !ctrls[error->ctrl_num].running) + return (ENODEV); + + chip = get_nandsim_chip(error->ctrl_num, error->chip_num); + param = &chip->params; + page_size = param->bytes_per_page + param->spare_bytes_per_page; + block = error->page_num / param->pages_per_block; + page = error->page_num % param->pages_per_block; + + bs = get_bs(chip->swap, block, 1); + if (!bs) + return (EINVAL); + + offset = (page * page_size) + error->column; + memset(&bs->blk_ptr[offset], error->pattern, error->len); + + return (0); +} + +static int +nandsim_set_block_state(struct sim_block_state *bs) +{ + struct onfi_params *params; + struct nandsim_chip *chip; + int blocks; + + nand_debug(NDBG_SIM,"set block state for %d:%d block %d\n", + bs->chip_num, bs->ctrl_num, bs->block_num); + + if (bs->ctrl_num >= MAX_SIM_DEV || + bs->chip_num >= MAX_CTRL_CS) + return (EINVAL); + + chip = get_nandsim_chip(bs->ctrl_num, bs->chip_num); + params = &chip->params; + blocks = params->luns * params->blocks_per_lun; + + if (bs->block_num > blocks) + return (EINVAL); + + chip->blk_state[bs->block_num].is_bad = bs->state; + + if (bs->wearout >= 0) + chip->blk_state[bs->block_num].wear_lev = bs->wearout; + + return (0); +} + +static int +nandsim_get_block_state(struct sim_block_state *bs) +{ + struct onfi_params *params; + struct nandsim_chip *chip; + int blocks; + + if (bs->ctrl_num >= MAX_SIM_DEV || + bs->chip_num >= MAX_CTRL_CS) + return (EINVAL); + + nand_debug(NDBG_SIM,"get block state for %d:%d block %d\n", + bs->chip_num, bs->ctrl_num, bs->block_num); + + chip = get_nandsim_chip(bs->ctrl_num, bs->chip_num); + params = &chip->params; + blocks = params->luns * params->blocks_per_lun; + + if (bs->block_num > blocks) + return (EINVAL); + + bs->state = chip->blk_state[bs->block_num].is_bad; + bs->wearout = chip->blk_state[bs->block_num].wear_lev; + + return (0); +} + +static int +nandsim_dump(struct sim_dump *dump) +{ + struct nandsim_chip *chip; + struct block_space *bs; + int blk_size; + + nand_debug(NDBG_SIM,"dump chip %d %d\n", dump->ctrl_num, dump->chip_num); + + if (dump->ctrl_num >= MAX_SIM_DEV || + dump->chip_num >= MAX_CTRL_CS) + return (EINVAL); + + chip = get_nandsim_chip(dump->ctrl_num, dump->chip_num); + blk_size = chip->cg.block_size + + (chip->cg.oob_size * chip->cg.pgs_per_blk); + + bs = get_bs(chip->swap, dump->block_num, 0); + if (!bs) + return (EINVAL); + + if (dump->len > blk_size) + dump->len = blk_size; + + copyout(bs->blk_ptr, dump->data, dump->len); + + return (0); +} + +static int +nandsim_restore(struct sim_dump *dump) +{ + struct nandsim_chip *chip; + struct block_space *bs; + int blk_size; + + nand_debug(NDBG_SIM,"restore chip %d %d\n", dump->ctrl_num, + dump->chip_num); + + if (dump->ctrl_num >= MAX_SIM_DEV || + dump->chip_num >= MAX_CTRL_CS) + return (EINVAL); + + chip = get_nandsim_chip(dump->ctrl_num, dump->chip_num); + blk_size = chip->cg.block_size + + (chip->cg.oob_size * chip->cg.pgs_per_blk); + + bs = get_bs(chip->swap, dump->block_num, 1); + if (!bs) + return (EINVAL); + + if (dump->len > blk_size) + dump->len = blk_size; + + + copyin(dump->data, bs->blk_ptr, dump->len); + + return (0); +} + +static int +nandsim_freeze(struct sim_ctrl_chip *ctrl_chip) +{ + struct nandsim_chip *chip; + + if (ctrl_chip->ctrl_num >= MAX_SIM_DEV || + ctrl_chip->chip_num >= MAX_CTRL_CS) + return (EINVAL); + + chip = get_nandsim_chip(ctrl_chip->ctrl_num, ctrl_chip->chip_num); + nandsim_chip_freeze(chip); + + return (0); +} + +static int +nandsim_modify(struct sim_mod *mod) +{ + struct sim_chip *sim_conf = NULL; + struct nandsim_chip *sim_chip = NULL; + + nand_debug(NDBG_SIM,"modify ctlr %d chip %d", mod->ctrl_num, + mod->chip_num); + + if (mod->field != SIM_MOD_LOG_LEVEL) { + if (mod->ctrl_num >= MAX_SIM_DEV || + mod->chip_num >= MAX_CTRL_CS) + return (EINVAL); + + sim_conf = ctrls[mod->ctrl_num].chips[mod->chip_num]; + sim_chip = get_nandsim_chip(mod->ctrl_num, mod->chip_num); + } + + switch (mod->field) { + case SIM_MOD_LOG_LEVEL: + nandsim_log_level = mod->new_value; + break; + case SIM_MOD_ERASE_TIME: + sim_conf->erase_time = sim_chip->erase_delay = mod->new_value; + break; + case SIM_MOD_PROG_TIME: + sim_conf->prog_time = sim_chip->prog_delay = mod->new_value; + break; + case SIM_MOD_READ_TIME: + sim_conf->read_time = sim_chip->read_delay = mod->new_value; + break; + case SIM_MOD_ERROR_RATIO: + sim_conf->error_ratio = mod->new_value; + sim_chip->error_ratio = mod->new_value; + break; + default: + break; + } + + return (0); +} +static int +nandsim_modevent(module_t mod __unused, int type, void *data __unused) +{ + struct sim_ctrl_chip chip_ctrl; + int i, j; + + switch (type) { + case MOD_LOAD: + nandsim_dev = make_dev(&nandsim_cdevsw, 0, + UID_ROOT, GID_WHEEL, 0666, "nandsim.ioctl"); + break; + case MOD_UNLOAD: + for (i = 0; i < MAX_SIM_DEV; i++) { + nandsim_stop_ctrl(i); + chip_ctrl.ctrl_num = i; + for (j = 0; j < MAX_CTRL_CS; j++) { + chip_ctrl.chip_num = j; + nandsim_destroy_chip(&chip_ctrl); + } + nandsim_destroy_ctrl(i); + } + destroy_dev(nandsim_dev); + break; + case MOD_SHUTDOWN: + break; + default: + return (EOPNOTSUPP); + } + return (0); +} + +DEV_MODULE(nandsim, nandsim_modevent, NULL); +MODULE_VERSION(nandsim, 1); +MODULE_DEPEND(nandsim, nand, 1, 1, 1); +MODULE_DEPEND(nandsim, alq, 1, 1, 1); diff --git a/sys/dev/nand/nandsim.h b/sys/dev/nand/nandsim.h new file mode 100644 index 00000000000..fbbb6d4bc7a --- /dev/null +++ b/sys/dev/nand/nandsim.h @@ -0,0 +1,175 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _NANDSIM_H_ +#define _NANDSIM_H_ + +#include +#include + +#define MAX_SIM_DEV 4 +#define MAX_CTRL_CS 4 +#define MAX_ECC_BYTES 512 +#define MAX_BAD_BLOCKS 512 +#define DEV_MODEL_STR_SIZE 21 +#define MAN_STR_SIZE 13 +#define FILENAME_SIZE 20 + +#define MAX_CHIPS (MAX_SIM_DEV*MAX_CTRL_CS) + +#define NANDSIM_OUTPUT_NONE 0x0 +#define NANDSIM_OUTPUT_CONSOLE 0x1 +#define NANDSIM_OUTPUT_RAM 0x2 +#define NANDSIM_OUTPUT_FILE 0x3 + +struct sim_ctrl_chip { + uint8_t ctrl_num; + uint8_t chip_num; +}; + +#define NANDSIM_BASE 'A' + +struct sim_param { + uint8_t log_level; + uint8_t log_output; +}; + +#define NANDSIM_SIM_PARAM _IOW(NANDSIM_BASE, 1, struct sim_param) + +struct sim_ctrl { + uint8_t running; + uint8_t created; + uint8_t num; + uint8_t num_cs; + uint8_t ecc; + char filename[FILENAME_SIZE]; + uint16_t ecc_layout[MAX_ECC_BYTES]; +}; +#define NANDSIM_CREATE_CTRL _IOW(NANDSIM_BASE, 2, struct sim_ctrl) +#define NANDSIM_DESTROY_CTRL _IOW(NANDSIM_BASE, 3, int) + +struct sim_chip { + uint8_t num; + uint8_t ctrl_num; + uint8_t created; + uint8_t device_id; + uint8_t manufact_id; + char device_model[DEV_MODEL_STR_SIZE]; + char manufacturer[MAN_STR_SIZE]; + uint8_t col_addr_cycles; + uint8_t row_addr_cycles; + uint8_t features; + uint8_t width; + uint32_t page_size; + uint32_t oob_size; + uint32_t pgs_per_blk; + uint32_t blks_per_lun; + uint32_t luns; + + uint32_t prog_time; + uint32_t erase_time; + uint32_t read_time; + uint32_t ccs_time; + + uint32_t error_ratio; + uint32_t wear_level; + uint32_t bad_block_map[MAX_BAD_BLOCKS]; + uint8_t is_wp; +}; + +#define NANDSIM_CREATE_CHIP _IOW(NANDSIM_BASE, 3, struct sim_chip) + +struct sim_chip_destroy { + uint8_t ctrl_num; + uint8_t chip_num; +}; +#define NANDSIM_DESTROY_CHIP _IOW(NANDSIM_BASE, 4, struct sim_chip_destroy) + +#define NANDSIM_START_CTRL _IOW(NANDSIM_BASE, 5, int) +#define NANDSIM_STOP_CTRL _IOW(NANDSIM_BASE, 6, int) +#define NANDSIM_RESTART_CTRL _IOW(NANDSIM_BASE, 7, int) + +#define NANDSIM_STATUS_CTRL _IOWR(NANDSIM_BASE, 8, struct sim_ctrl) +#define NANDSIM_STATUS_CHIP _IOWR(NANDSIM_BASE, 9, struct sim_chip) + +struct sim_mod { + uint8_t chip_num; + uint8_t ctrl_num; + uint32_t field; + uint32_t new_value; +}; +#define SIM_MOD_LOG_LEVEL 0 +#define SIM_MOD_ERASE_TIME 1 +#define SIM_MOD_PROG_TIME 2 +#define SIM_MOD_READ_TIME 3 +#define SIM_MOD_CCS_TIME 4 +#define SIM_MOD_ERROR_RATIO 5 + +#define NANDSIM_MODIFY _IOW(NANDSIM_BASE, 10, struct sim_mod) +#define NANDSIM_FREEZE _IOW(NANDSIM_BASE, 11, struct sim_ctrl_chip) + +struct sim_error { + uint8_t ctrl_num; + uint8_t chip_num; + uint32_t page_num; + uint32_t column; + uint32_t len; + uint32_t pattern; +}; +#define NANDSIM_INJECT_ERROR _IOW(NANDSIM_BASE, 20, struct sim_error) + +#define NANDSIM_GOOD_BLOCK 0 +#define NANDSIM_BAD_BLOCK 1 +struct sim_block_state { + uint8_t ctrl_num; + uint8_t chip_num; + uint32_t block_num; + int wearout; + uint8_t state; +}; +#define NANDSIM_SET_BLOCK_STATE _IOW(NANDSIM_BASE, 21, struct sim_block_state) +#define NANDSIM_GET_BLOCK_STATE _IOWR(NANDSIM_BASE, 22, struct sim_block_state) + +struct sim_log { + uint8_t ctrl_num; + char* log; + size_t len; +}; +#define NANDSIM_PRINT_LOG _IOWR(NANDSIM_BASE, 23, struct sim_log) + +struct sim_dump { + uint8_t ctrl_num; + uint8_t chip_num; + uint32_t block_num; + uint32_t len; + void* data; +}; +#define NANDSIM_DUMP _IOWR(NANDSIM_BASE, 24, struct sim_dump) +#define NANDSIM_RESTORE _IOWR(NANDSIM_BASE, 25, struct sim_dump) + +#endif /* _NANDSIM_H_ */ diff --git a/sys/dev/nand/nandsim_chip.c b/sys/dev/nand/nandsim_chip.c new file mode 100644 index 00000000000..f04ad805b16 --- /dev/null +++ b/sys/dev/nand/nandsim_chip.c @@ -0,0 +1,901 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +MALLOC_DEFINE(M_NANDSIM, "NANDsim", "NANDsim dynamic data"); + +#define NANDSIM_CHIP_LOCK(chip) mtx_lock(&(chip)->ns_lock) +#define NANDSIM_CHIP_UNLOCK(chip) mtx_unlock(&(chip)->ns_lock) + +static nandsim_evh_t erase_evh; +static nandsim_evh_t idle_evh; +static nandsim_evh_t poweron_evh; +static nandsim_evh_t reset_evh; +static nandsim_evh_t read_evh; +static nandsim_evh_t readid_evh; +static nandsim_evh_t readparam_evh; +static nandsim_evh_t write_evh; + +static void nandsim_loop(void *); +static void nandsim_undefined(struct nandsim_chip *, uint8_t); +static void nandsim_bad_address(struct nandsim_chip *, uint8_t *); +static void nandsim_ignore_address(struct nandsim_chip *, uint8_t); +static void nandsim_sm_error(struct nandsim_chip *); +static void nandsim_start_handler(struct nandsim_chip *, nandsim_evh_t); + +static void nandsim_callout_eh(void *); +static int nandsim_delay(struct nandsim_chip *, int); + +static int nandsim_bbm_init(struct nandsim_chip *, uint32_t, uint32_t *); +static int nandsim_blk_state_init(struct nandsim_chip *, uint32_t, uint32_t); +static void nandsim_blk_state_destroy(struct nandsim_chip *); +static int nandchip_is_block_valid(struct nandsim_chip *, int); + +static void nandchip_set_status(struct nandsim_chip *, uint8_t); +static void nandchip_clear_status(struct nandsim_chip *, uint8_t); + +struct proc *nandsim_proc; + +struct nandsim_chip * +nandsim_chip_init(struct nandsim_softc* sc, uint8_t chip_num, + struct sim_chip *sim_chip) +{ + struct nandsim_chip *chip; + struct onfi_params *chip_param; + char swapfile[20]; + uint32_t size; + int error; + + chip = malloc(sizeof(*chip), M_NANDSIM, M_WAITOK | M_ZERO); + if (!chip) + return (NULL); + + mtx_init(&chip->ns_lock, "nandsim lock", NULL, MTX_DEF); + callout_init(&chip->ns_callout, CALLOUT_MPSAFE); + STAILQ_INIT(&chip->nandsim_events); + + chip->chip_num = chip_num; + chip->ctrl_num = sim_chip->ctrl_num; + chip->sc = sc; + + if (!sim_chip->is_wp) + nandchip_set_status(chip, NAND_STATUS_WP); + + chip_param = &chip->params; + + chip->id.dev_id = sim_chip->device_id; + chip->id.man_id = sim_chip->manufact_id; + + chip->error_ratio = sim_chip->error_ratio; + chip->wear_level = sim_chip->wear_level; + chip->prog_delay = sim_chip->prog_time; + chip->erase_delay = sim_chip->erase_time; + chip->read_delay = sim_chip->read_time; + + chip_param->t_prog = sim_chip->prog_time; + chip_param->t_bers = sim_chip->erase_time; + chip_param->t_r = sim_chip->read_time; + bcopy("onfi", &chip_param->signature, 4); + + chip_param->manufacturer_id = sim_chip->manufact_id; + strncpy(chip_param->manufacturer_name, sim_chip->manufacturer, 12); + chip_param->manufacturer_name[11] = 0; + strncpy(chip_param->device_model, sim_chip->device_model, 20); + chip_param->device_model[19] = 0; + + chip_param->bytes_per_page = sim_chip->page_size; + chip_param->spare_bytes_per_page = sim_chip->oob_size; + chip_param->pages_per_block = sim_chip->pgs_per_blk; + chip_param->blocks_per_lun = sim_chip->blks_per_lun; + chip_param->luns = sim_chip->luns; + + init_chip_geom(&chip->cg, chip_param->luns, chip_param->blocks_per_lun, + chip_param->pages_per_block, chip_param->bytes_per_page, + chip_param->spare_bytes_per_page); + + chip_param->address_cycles = sim_chip->row_addr_cycles | + (sim_chip->col_addr_cycles << 4); + chip_param->features = sim_chip->features; + if (sim_chip->width == 16) + chip_param->features |= ONFI_FEAT_16BIT; + + size = chip_param->blocks_per_lun * chip_param->luns; + + error = nandsim_blk_state_init(chip, size, sim_chip->wear_level); + if (error) { + mtx_destroy(&chip->ns_lock); + free(chip, M_NANDSIM); + return (NULL); + } + + error = nandsim_bbm_init(chip, size, sim_chip->bad_block_map); + if (error) { + mtx_destroy(&chip->ns_lock); + nandsim_blk_state_destroy(chip); + free(chip, M_NANDSIM); + return (NULL); + } + + nandsim_start_handler(chip, poweron_evh); + + nand_debug(NDBG_SIM,"Create thread for chip%d [%8p]", chip->chip_num, + chip); + /* Create chip thread */ + error = kproc_kthread_add(nandsim_loop, chip, &nandsim_proc, + &chip->nandsim_td, RFSTOPPED | RFHIGHPID, + 0, "nandsim", "chip"); + if (error) { + mtx_destroy(&chip->ns_lock); + nandsim_blk_state_destroy(chip); + free(chip, M_NANDSIM); + return (NULL); + } + + thread_lock(chip->nandsim_td); + sched_class(chip->nandsim_td, PRI_REALTIME); + sched_add(chip->nandsim_td, SRQ_BORING); + thread_unlock(chip->nandsim_td); + + size = (chip_param->bytes_per_page + + chip_param->spare_bytes_per_page) * + chip_param->pages_per_block; + + sprintf(swapfile, "chip%d%d.swp", chip->ctrl_num, chip->chip_num); + chip->swap = nandsim_swap_init(swapfile, chip_param->blocks_per_lun * + chip_param->luns, size); + if (!chip->swap) + nandsim_chip_destroy(chip); + + /* Wait for new thread to enter main loop */ + tsleep(chip->nandsim_td, PWAIT, "ns_chip", 1 * hz); + + return (chip); +} + +static int +nandsim_blk_state_init(struct nandsim_chip *chip, uint32_t size, + uint32_t wear_lev) +{ + int i; + + if (!chip || size == 0) + return (-1); + + chip->blk_state = malloc(size * sizeof(struct nandsim_block_state), + M_NANDSIM, M_WAITOK | M_ZERO); + if (!chip->blk_state) { + return (-1); + } + + for (i = 0; i < size; i++) { + if (wear_lev) + chip->blk_state[i].wear_lev = wear_lev; + else + chip->blk_state[i].wear_lev = -1; + } + + return (0); +} + +static void +nandsim_blk_state_destroy(struct nandsim_chip *chip) +{ + + if (chip && chip->blk_state) + free(chip->blk_state, M_NANDSIM); +} + +static int +nandsim_bbm_init(struct nandsim_chip *chip, uint32_t size, + uint32_t *sim_bbm) +{ + uint32_t index; + int i; + + if ((chip == NULL) || (size == 0)) + return (-1); + + if (chip->blk_state == NULL) + return (-1); + + if (sim_bbm == NULL) + return (0); + + for (i = 0; i < MAX_BAD_BLOCKS; i++) { + index = sim_bbm[i]; + + if (index == 0xffffffff) + break; + else if (index > size) + return (-1); + else + chip->blk_state[index].is_bad = 1; + } + + return (0); +} + +void +nandsim_chip_destroy(struct nandsim_chip *chip) +{ + struct nandsim_ev *ev; + + ev = create_event(chip, NANDSIM_EV_EXIT, 0); + if (ev) + send_event(ev); +} + +void +nandsim_chip_freeze(struct nandsim_chip *chip) +{ + + chip->flags |= NANDSIM_CHIP_FROZEN; +} + +static void +nandsim_loop(void *arg) +{ + struct nandsim_chip *chip = (struct nandsim_chip *)arg; + struct nandsim_ev *ev; + + nand_debug(NDBG_SIM,"Start main loop for chip%d [%8p]", chip->chip_num, + chip); + for(;;) { + NANDSIM_CHIP_LOCK(chip); + if (!(chip->flags & NANDSIM_CHIP_ACTIVE)) { + chip->flags |= NANDSIM_CHIP_ACTIVE; + wakeup(chip->nandsim_td); + } + + if (STAILQ_EMPTY(&chip->nandsim_events)) { + nand_debug(NDBG_SIM,"Chip%d [%8p] going sleep", + chip->chip_num, chip); + msleep(chip, &chip->ns_lock, PRIBIO, "nandev", 0); + } + + ev = STAILQ_FIRST(&chip->nandsim_events); + STAILQ_REMOVE_HEAD(&chip->nandsim_events, links); + NANDSIM_CHIP_UNLOCK(chip); + if (ev->type == NANDSIM_EV_EXIT) { + NANDSIM_CHIP_LOCK(chip); + destroy_event(ev); + wakeup(ev); + while (!STAILQ_EMPTY(&chip->nandsim_events)) { + ev = STAILQ_FIRST(&chip->nandsim_events); + STAILQ_REMOVE_HEAD(&chip->nandsim_events, + links); + destroy_event(ev); + wakeup(ev); + }; + NANDSIM_CHIP_UNLOCK(chip); + nandsim_log(chip, NANDSIM_LOG_SM, "destroyed\n"); + mtx_destroy(&chip->ns_lock); + nandsim_blk_state_destroy(chip); + nandsim_swap_destroy(chip->swap); + free(chip, M_NANDSIM); + nandsim_proc = NULL; + + kthread_exit(); + } + + if (!(chip->flags & NANDSIM_CHIP_FROZEN)) { + nand_debug(NDBG_SIM,"Chip [%x] get event [%x]", + chip->chip_num, ev->type); + chip->ev_handler(chip, ev->type, ev->data); + } + + wakeup(ev); + destroy_event(ev); + } + +} + +struct nandsim_ev * +create_event(struct nandsim_chip *chip, uint8_t type, uint8_t data_size) +{ + struct nandsim_ev *ev; + + ev = malloc(sizeof(*ev), M_NANDSIM, M_NOWAIT | M_ZERO); + if (!ev) { + nand_debug(NDBG_SIM,"Cannot create event"); + return (NULL); + } + + if (data_size > 0) + ev->data = malloc(sizeof(*ev), M_NANDSIM, M_NOWAIT | M_ZERO); + ev->type = type; + ev->chip = chip; + + return (ev); +} + +void +destroy_event(struct nandsim_ev *ev) +{ + + if (ev->data) + free(ev->data, M_NANDSIM); + free(ev, M_NANDSIM); +} + +int +send_event(struct nandsim_ev *ev) +{ + struct nandsim_chip *chip = ev->chip; + + if (!(chip->flags & NANDSIM_CHIP_FROZEN)) { + nand_debug(NDBG_SIM,"Chip%d [%p] send event %x", + chip->chip_num, chip, ev->type); + + NANDSIM_CHIP_LOCK(chip); + STAILQ_INSERT_TAIL(&chip->nandsim_events, ev, links); + NANDSIM_CHIP_UNLOCK(chip); + + wakeup(chip); + if ((ev->type != NANDSIM_EV_TIMEOUT) && chip->nandsim_td && + (curthread != chip->nandsim_td)) + tsleep(ev, PWAIT, "ns_ev", 5 * hz); + } + + return (0); +} + +static void +nandsim_callout_eh(void *arg) +{ + struct nandsim_ev *ev = (struct nandsim_ev *)arg; + + send_event(ev); +} + +static int +nandsim_delay(struct nandsim_chip *chip, int timeout) +{ + struct nandsim_ev *ev; + struct timeval delay; + int tm; + + nand_debug(NDBG_SIM,"Chip[%d] Set delay: %d", chip->chip_num, timeout); + + ev = create_event(chip, NANDSIM_EV_TIMEOUT, 0); + if (!ev) + return (-1); + + chip->sm_state = NANDSIM_STATE_TIMEOUT; + tm = (timeout/10000) * (hz / 100); + if (callout_reset(&chip->ns_callout, tm, nandsim_callout_eh, ev)) + return (-1); + + delay.tv_sec = chip->read_delay / 1000000; + delay.tv_usec = chip->read_delay % 1000000; + timevaladd(&chip->delay_tv, &delay); + + return (0); +} + +static void +nandsim_start_handler(struct nandsim_chip *chip, nandsim_evh_t evh) +{ + struct nandsim_ev *ev; + + chip->ev_handler = evh; + + nand_debug(NDBG_SIM,"Start handler %p for chip%d [%p]", evh, + chip->chip_num, chip); + ev = create_event(chip, NANDSIM_EV_START, 0); + if (!ev) + nandsim_sm_error(chip); + + send_event(ev); +} + +static void +nandchip_set_data(struct nandsim_chip *chip, uint8_t *data, uint32_t len, + uint32_t idx) +{ + + nand_debug(NDBG_SIM,"Chip [%x] data %p [%x] at %x", chip->chip_num, + data, len, idx); + chip->data.data_ptr = data; + chip->data.size = len; + chip->data.index = idx; +} + +static int +nandchip_chip_space(struct nandsim_chip *chip, int32_t row, int32_t column, + size_t size, uint8_t writing) +{ + struct block_space *blk_space; + uint32_t lun, block, page, offset, block_size; + int err; + + block_size = chip->cg.block_size + + (chip->cg.oob_size * chip->cg.pgs_per_blk); + + err = nand_row_to_blkpg(&chip->cg, row, &lun, &block, &page); + if (err) { + nand_debug(NDBG_SIM,"cannot get address\n"); + return (-1); + } + + if (!nandchip_is_block_valid(chip, block)) { + nandchip_set_data(chip, NULL, 0, 0); + return (-1); + } + + blk_space = get_bs(chip->swap, block, writing); + if (!blk_space) { + nandchip_set_data(chip, NULL, 0, 0); + return (-1); + } + + if (size > block_size) + size = block_size; + + if (size == block_size) { + offset = 0; + column = 0; + } else + offset = page * (chip->cg.page_size + chip->cg.oob_size); + + nandchip_set_data(chip, &blk_space->blk_ptr[offset], size, column); + + return (0); +} + +static int +nandchip_get_addr_byte(struct nandsim_chip *chip, void *data, uint32_t *value) +{ + int ncycles = 0; + uint8_t byte; + uint8_t *buffer; + + buffer = (uint8_t *)value; + byte = *((uint8_t *)data); + + KASSERT((chip->sm_state == NANDSIM_STATE_WAIT_ADDR_ROW || + chip->sm_state == NANDSIM_STATE_WAIT_ADDR_COL), + ("unexpected state")); + + if (chip->sm_state == NANDSIM_STATE_WAIT_ADDR_ROW) { + ncycles = chip->params.address_cycles & 0xf; + buffer[chip->sm_addr_cycle++] = byte; + } else if (chip->sm_state == NANDSIM_STATE_WAIT_ADDR_COL) { + ncycles = (chip->params.address_cycles >> 4) & 0xf; + buffer[chip->sm_addr_cycle++] = byte; + } + + nand_debug(NDBG_SIM, "Chip [%x] read addr byte: %02x (%d of %d)\n", + chip->chip_num, byte, chip->sm_addr_cycle, ncycles); + + if (chip->sm_addr_cycle == ncycles) { + chip->sm_addr_cycle = 0; + return (0); + } + + return (1); +} + +static int +nandchip_is_block_valid(struct nandsim_chip *chip, int block_num) +{ + + if (!chip || !chip->blk_state) + return (0); + + if (chip->blk_state[block_num].wear_lev == 0 || + chip->blk_state[block_num].is_bad) + return (0); + + return (1); +} + +static void +nandchip_set_status(struct nandsim_chip *chip, uint8_t flags) +{ + + chip->chip_status |= flags; +} + +static void +nandchip_clear_status(struct nandsim_chip *chip, uint8_t flags) +{ + + chip->chip_status &= ~flags; +} + +uint8_t +nandchip_get_status(struct nandsim_chip *chip) +{ + return (chip->chip_status); +} + +void +nandsim_chip_timeout(struct nandsim_chip *chip) +{ + struct timeval tv; + + getmicrotime(&tv); + + if (chip->sm_state == NANDSIM_STATE_TIMEOUT && + timevalcmp(&tv, &chip->delay_tv, >=)) { + nandchip_set_status(chip, NAND_STATUS_RDY); + } +} +void +poweron_evh(struct nandsim_chip *chip, uint32_t type, void *data) +{ + uint8_t cmd; + + if (type == NANDSIM_EV_START) + chip->sm_state = NANDSIM_STATE_IDLE; + else if (type == NANDSIM_EV_CMD) { + cmd = *(uint8_t *)data; + switch(cmd) { + case NAND_CMD_RESET: + nandsim_log(chip, NANDSIM_LOG_SM, "in RESET state\n"); + nandsim_start_handler(chip, reset_evh); + break; + default: + nandsim_undefined(chip, type); + break; + } + } else + nandsim_undefined(chip, type); +} + +void +idle_evh(struct nandsim_chip *chip, uint32_t type, void *data) +{ + uint8_t cmd; + + if (type == NANDSIM_EV_START) { + nandsim_log(chip, NANDSIM_LOG_SM, "in IDLE state\n"); + chip->sm_state = NANDSIM_STATE_WAIT_CMD; + } else if (type == NANDSIM_EV_CMD) { + nandchip_clear_status(chip, NAND_STATUS_FAIL); + getmicrotime(&chip->delay_tv); + cmd = *(uint8_t *)data; + switch(cmd) { + case NAND_CMD_READ_ID: + nandsim_start_handler(chip, readid_evh); + break; + case NAND_CMD_READ_PARAMETER: + nandsim_start_handler(chip, readparam_evh); + break; + case NAND_CMD_READ: + nandsim_start_handler(chip, read_evh); + break; + case NAND_CMD_PROG: + nandsim_start_handler(chip, write_evh); + break; + case NAND_CMD_ERASE: + nandsim_start_handler(chip, erase_evh); + break; + default: + nandsim_undefined(chip, type); + break; + } + } else + nandsim_undefined(chip, type); +} + +void +readid_evh(struct nandsim_chip *chip, uint32_t type, void *data) +{ + struct onfi_params *params; + uint8_t addr; + + params = &chip->params; + + if (type == NANDSIM_EV_START) { + nandsim_log(chip, NANDSIM_LOG_SM, "in READID state\n"); + chip->sm_state = NANDSIM_STATE_WAIT_ADDR_BYTE; + } else if (type == NANDSIM_EV_ADDR) { + + addr = *((uint8_t *)data); + + if (addr == 0x0) + nandchip_set_data(chip, (uint8_t *)&chip->id, 2, 0); + else if (addr == ONFI_SIG_ADDR) + nandchip_set_data(chip, (uint8_t *)¶ms->signature, + 4, 0); + else + nandsim_bad_address(chip, &addr); + + nandsim_start_handler(chip, idle_evh); + } else + nandsim_undefined(chip, type); +} + +void +readparam_evh(struct nandsim_chip *chip, uint32_t type, void *data) +{ + struct onfi_params *params; + uint8_t addr; + + params = &chip->params; + + if (type == NANDSIM_EV_START) { + nandsim_log(chip, NANDSIM_LOG_SM, "in READPARAM state\n"); + chip->sm_state = NANDSIM_STATE_WAIT_ADDR_BYTE; + } else if (type == NANDSIM_EV_ADDR) { + addr = *((uint8_t *)data); + + if (addr == 0) { + nandchip_set_data(chip, (uint8_t *)params, + sizeof(*params), 0); + } else + nandsim_bad_address(chip, &addr); + + nandsim_start_handler(chip, idle_evh); + } else + nandsim_undefined(chip, type); +} + +void +read_evh(struct nandsim_chip *chip, uint32_t type, void *data) +{ + static uint32_t column = 0, row = 0; + uint32_t size; + uint8_t cmd; + + size = chip->cg.page_size + chip->cg.oob_size; + + switch (type) { + case NANDSIM_EV_START: + nandsim_log(chip, NANDSIM_LOG_SM, "in READ state\n"); + chip->sm_state = NANDSIM_STATE_WAIT_ADDR_COL; + break; + case NANDSIM_EV_ADDR: + if (chip->sm_state == NANDSIM_STATE_WAIT_ADDR_COL) { + if (nandchip_get_addr_byte(chip, data, &column)) + break; + + chip->sm_state = NANDSIM_STATE_WAIT_ADDR_ROW; + } else if (chip->sm_state == NANDSIM_STATE_WAIT_ADDR_ROW) { + if (nandchip_get_addr_byte(chip, data, &row)) + break; + + chip->sm_state = NANDSIM_STATE_WAIT_CMD; + } else + nandsim_ignore_address(chip, *((uint8_t *)data)); + break; + case NANDSIM_EV_CMD: + cmd = *(uint8_t *)data; + if (chip->sm_state == NANDSIM_STATE_WAIT_CMD && + cmd == NAND_CMD_READ_END) { + if (chip->read_delay != 0 && + nandsim_delay(chip, chip->read_delay) == 0) + nandchip_clear_status(chip, NAND_STATUS_RDY); + else { + nandchip_chip_space(chip, row, column, size, 0); + nandchip_set_status(chip, NAND_STATUS_RDY); + nandsim_start_handler(chip, idle_evh); + } + } else + nandsim_undefined(chip, type); + break; + case NANDSIM_EV_TIMEOUT: + if (chip->sm_state == NANDSIM_STATE_TIMEOUT) { + nandchip_chip_space(chip, row, column, size, 0); + nandchip_set_status(chip, NAND_STATUS_RDY); + nandsim_start_handler(chip, idle_evh); + } else + nandsim_undefined(chip, type); + break; + } +} +void +write_evh(struct nandsim_chip *chip, uint32_t type, void *data) +{ + static uint32_t column, row; + uint32_t size; + uint8_t cmd; + int err; + + size = chip->cg.page_size + chip->cg.oob_size; + + switch(type) { + case NANDSIM_EV_START: + nandsim_log(chip, NANDSIM_LOG_SM, "in WRITE state\n"); + chip->sm_state = NANDSIM_STATE_WAIT_ADDR_COL; + break; + case NANDSIM_EV_ADDR: + if (chip->sm_state == NANDSIM_STATE_WAIT_ADDR_COL) { + if (nandchip_get_addr_byte(chip, data, &column)) + break; + + chip->sm_state = NANDSIM_STATE_WAIT_ADDR_ROW; + } else if (chip->sm_state == NANDSIM_STATE_WAIT_ADDR_ROW) { + if (nandchip_get_addr_byte(chip, data, &row)) + break; + + err = nandchip_chip_space(chip, row, column, size, 1); + if (err == -1) + nandchip_set_status(chip, NAND_STATUS_FAIL); + + chip->sm_state = NANDSIM_STATE_WAIT_CMD; + } else + nandsim_ignore_address(chip, *((uint8_t *)data)); + break; + case NANDSIM_EV_CMD: + cmd = *(uint8_t *)data; + if (chip->sm_state == NANDSIM_STATE_WAIT_CMD && + cmd == NAND_CMD_PROG_END) { + if (chip->prog_delay != 0 && + nandsim_delay(chip, chip->prog_delay) == 0) + nandchip_clear_status(chip, NAND_STATUS_RDY); + else { + nandchip_set_status(chip, NAND_STATUS_RDY); + nandsim_start_handler(chip, idle_evh); + } + } else + nandsim_undefined(chip, type); + break; + case NANDSIM_EV_TIMEOUT: + if (chip->sm_state == NANDSIM_STATE_TIMEOUT) { + nandsim_start_handler(chip, idle_evh); + nandchip_set_status(chip, NAND_STATUS_RDY); + } else + nandsim_undefined(chip, type); + break; + } +} + +void +erase_evh(struct nandsim_chip *chip, uint32_t type, void *data) +{ + static uint32_t row, block_size; + uint32_t lun, block, page; + int err; + uint8_t cmd; + + block_size = chip->cg.block_size + + (chip->cg.oob_size * chip->cg.pgs_per_blk); + + switch (type) { + case NANDSIM_EV_START: + nandsim_log(chip, NANDSIM_LOG_SM, "in ERASE state\n"); + chip->sm_state = NANDSIM_STATE_WAIT_ADDR_ROW; + break; + case NANDSIM_EV_CMD: + cmd = *(uint8_t *)data; + if (chip->sm_state == NANDSIM_STATE_WAIT_CMD && + cmd == NAND_CMD_ERASE_END) { + if (chip->data.data_ptr != NULL && + chip->data.size == block_size) + memset(chip->data.data_ptr, 0xff, block_size); + else + nand_debug(NDBG_SIM,"Bad block erase data\n"); + + err = nand_row_to_blkpg(&chip->cg, row, &lun, + &block, &page); + if (!err) { + if (chip->blk_state[block].wear_lev > 0) + chip->blk_state[block].wear_lev--; + } + + if (chip->erase_delay != 0 && + nandsim_delay(chip, chip->erase_delay) == 0) + nandchip_clear_status(chip, NAND_STATUS_RDY); + else { + nandchip_set_status(chip, NAND_STATUS_RDY); + nandsim_start_handler(chip, idle_evh); + } + } else + nandsim_undefined(chip, type); + break; + case NANDSIM_EV_ADDR: + if (chip->sm_state == NANDSIM_STATE_WAIT_ADDR_ROW) { + if (nandchip_get_addr_byte(chip, data, &row)) + break; + + err = nandchip_chip_space(chip, row, 0, block_size, 1); + if (err == -1) { + nandchip_set_status(chip, NAND_STATUS_FAIL); + } + chip->sm_state = NANDSIM_STATE_WAIT_CMD; + } else + nandsim_ignore_address(chip, *((uint8_t *)data)); + break; + case NANDSIM_EV_TIMEOUT: + if (chip->sm_state == NANDSIM_STATE_TIMEOUT) { + nandchip_set_status(chip, NAND_STATUS_RDY); + nandsim_start_handler(chip, idle_evh); + } else + nandsim_undefined(chip, type); + break; + } +} + +void +reset_evh(struct nandsim_chip *chip, uint32_t type, void *data) +{ + + if (type == NANDSIM_EV_START) { + nandsim_log(chip, NANDSIM_LOG_SM, "in RESET state\n"); + chip->sm_state = NANDSIM_STATE_TIMEOUT; + nandchip_set_data(chip, NULL, 0, 0); + DELAY(500); + nandsim_start_handler(chip, idle_evh); + } else + nandsim_undefined(chip, type); +} + +static void +nandsim_undefined(struct nandsim_chip *chip, uint8_t type) +{ + + nandsim_log(chip, NANDSIM_LOG_ERR, + "ERR: Chip received ev %x in state %x\n", + type, chip->sm_state); + nandsim_start_handler(chip, idle_evh); +} + +static void +nandsim_bad_address(struct nandsim_chip *chip, uint8_t *addr) +{ + + nandsim_log(chip, NANDSIM_LOG_ERR, + "ERR: Chip received out of range address" + "%02x%02x - %02x%02x%02x\n", addr[0], addr[1], addr[2], + addr[3], addr[4]); +} + +static void +nandsim_ignore_address(struct nandsim_chip *chip, uint8_t byte) +{ + nandsim_log(chip, NANDSIM_LOG_SM, "ignored address byte: %d\n", byte); +} + +static void +nandsim_sm_error(struct nandsim_chip *chip) +{ + + nandsim_log(chip, NANDSIM_LOG_ERR, "ERR: State machine error." + "Restart required.\n"); +} diff --git a/sys/dev/nand/nandsim_chip.h b/sys/dev/nand/nandsim_chip.h new file mode 100644 index 00000000000..a6fb2346ded --- /dev/null +++ b/sys/dev/nand/nandsim_chip.h @@ -0,0 +1,159 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _NANDSIM_CHIP_H +#define _NANDSIM_CHIP_H + +#include +#include +#include +#include +#include + +MALLOC_DECLARE(M_NANDSIM); + +#define MAX_CS_NUM 4 +struct nandsim_chip; + +typedef void nandsim_evh_t(struct nandsim_chip *chip, uint32_t ev, void *data); + +enum addr_type { + ADDR_NONE, + ADDR_ID, + ADDR_ROW, + ADDR_ROWCOL +}; + +struct nandsim_softc { + struct nand_softc nand_dev; + device_t dev; + + struct nandsim_chip *chips[MAX_CS_NUM]; + struct nandsim_chip *active_chip; + + uint8_t address_cycle; + enum addr_type address_type; + int log_idx; + char *log_buff; + struct alq *alq; +}; + +struct nandsim_ev { + STAILQ_ENTRY(nandsim_ev) links; + struct nandsim_chip *chip; + uint8_t type; + void *data; +}; + +struct nandsim_data { + uint8_t *data_ptr; + uint32_t index; + uint32_t size; +}; + +struct nandsim_block_state { + int32_t wear_lev; + uint8_t is_bad; +}; + +#define NANDSIM_CHIP_ACTIVE 0x1 +#define NANDSIM_CHIP_FROZEN 0x2 +#define NANDSIM_CHIP_GET_STATUS 0x4 + +struct nandsim_chip { + struct nandsim_softc *sc; + struct thread *nandsim_td; + + STAILQ_HEAD(, nandsim_ev) nandsim_events; + nandsim_evh_t *ev_handler; + struct mtx ns_lock; + struct callout ns_callout; + + struct chip_geom cg; + struct nand_id id; + struct onfi_params params; + struct nandsim_data data; + struct nandsim_block_state *blk_state; + + struct chip_swap *swap; + + uint32_t error_ratio; + uint32_t wear_level; + uint32_t sm_state; + uint32_t sm_addr_cycle; + + uint32_t erase_delay; + uint32_t prog_delay; + uint32_t read_delay; + struct timeval delay_tv; + + uint8_t flags; + uint8_t chip_status; + uint8_t ctrl_num; + uint8_t chip_num; +}; + +struct sim_ctrl_conf { + uint8_t num; + uint8_t num_cs; + uint8_t ecc; + uint8_t running; + uint8_t created; + device_t sim_ctrl_dev; + struct sim_chip *chips[MAX_CTRL_CS]; + uint16_t ecc_layout[MAX_ECC_BYTES]; + char filename[FILENAME_SIZE]; +}; + +#define NANDSIM_STATE_IDLE 0x0 +#define NANDSIM_STATE_WAIT_ADDR_BYTE 0x1 +#define NANDSIM_STATE_WAIT_CMD 0x2 +#define NANDSIM_STATE_TIMEOUT 0x3 +#define NANDSIM_STATE_WAIT_ADDR_ROW 0x4 +#define NANDSIM_STATE_WAIT_ADDR_COL 0x5 + +#define NANDSIM_EV_START 0x1 +#define NANDSIM_EV_CMD 0x2 +#define NANDSIM_EV_ADDR 0x3 +#define NANDSIM_EV_TIMEOUT 0x4 +#define NANDSIM_EV_EXIT 0xff + +struct nandsim_chip *nandsim_chip_init(struct nandsim_softc *, + uint8_t, struct sim_chip *); +void nandsim_chip_destroy(struct nandsim_chip *); +void nandsim_chip_freeze(struct nandsim_chip *); +void nandsim_chip_timeout(struct nandsim_chip *); +int nandsim_chip_check_bad_block(struct nandsim_chip *, int); + +uint8_t nandchip_get_status(struct nandsim_chip *); + +void destroy_event(struct nandsim_ev *); +int send_event(struct nandsim_ev *); +struct nandsim_ev *create_event(struct nandsim_chip *, uint8_t, uint8_t); + +#endif /* _NANDSIM_CHIP_H */ diff --git a/sys/dev/nand/nandsim_ctrl.c b/sys/dev/nand/nandsim_ctrl.c new file mode 100644 index 00000000000..5f7b0197920 --- /dev/null +++ b/sys/dev/nand/nandsim_ctrl.c @@ -0,0 +1,396 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Simulated NAND controller driver */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "nfc_if.h" + +#define ADDRESS_SIZE 5 + +extern struct sim_ctrl_conf ctrls[MAX_SIM_DEV]; + +static void byte_corrupt(struct nandsim_chip *, uint8_t *); + +static int nandsim_attach(device_t); +static int nandsim_detach(device_t); +static int nandsim_probe(device_t); + +static uint8_t nandsim_read_byte(device_t); +static uint16_t nandsim_read_word(device_t); +static int nandsim_select_cs(device_t, uint8_t); +static void nandsim_write_byte(device_t, uint8_t); +static void nandsim_write_word(device_t, uint16_t); +static void nandsim_read_buf(device_t, void *, uint32_t); +static void nandsim_write_buf(device_t, void *, uint32_t); +static int nandsim_send_command(device_t, uint8_t); +static int nandsim_send_address(device_t, uint8_t); + +static device_method_t nandsim_methods[] = { + DEVMETHOD(device_probe, nandsim_probe), + DEVMETHOD(device_attach, nandsim_attach), + DEVMETHOD(device_detach, nandsim_detach), + + DEVMETHOD(nfc_select_cs, nandsim_select_cs), + DEVMETHOD(nfc_send_command, nandsim_send_command), + DEVMETHOD(nfc_send_address, nandsim_send_address), + DEVMETHOD(nfc_read_byte, nandsim_read_byte), + DEVMETHOD(nfc_read_word, nandsim_read_word), + DEVMETHOD(nfc_write_byte, nandsim_write_byte), + DEVMETHOD(nfc_read_buf, nandsim_read_buf), + DEVMETHOD(nfc_write_buf, nandsim_write_buf), + + { 0, 0 }, +}; + +static driver_t nandsim_driver = { + "nandsim", + nandsim_methods, + sizeof(struct nandsim_softc), +}; + +static devclass_t nandsim_devclass; +DRIVER_MODULE(nandsim, nexus, nandsim_driver, nandsim_devclass, 0, 0); +DRIVER_MODULE(nandbus, nandsim, nandbus_driver, nandbus_devclass, 0, 0); + +static int +nandsim_probe(device_t dev) +{ + + device_set_desc(dev, "NAND controller simulator"); + return (BUS_PROBE_DEFAULT); +} + +static int +nandsim_attach(device_t dev) +{ + struct nandsim_softc *sc; + struct sim_ctrl_conf *params; + struct sim_chip *chip; + uint16_t *eccpos; + int i, err; + + sc = device_get_softc(dev); + params = &ctrls[device_get_unit(dev)]; + + if (strlen(params->filename) == 0) + snprintf(params->filename, FILENAME_SIZE, "ctrl%d.log", + params->num); + + nandsim_log_init(sc, params->filename); + for (i = 0; i < params->num_cs; i++) { + chip = params->chips[i]; + if (chip && chip->device_id != 0) { + sc->chips[i] = nandsim_chip_init(sc, i, chip); + if (chip->features & ONFI_FEAT_16BIT) + sc->nand_dev.flags |= NAND_16_BIT; + } + } + + if (params->ecc_layout[0] != 0xffff) + eccpos = params->ecc_layout; + else + eccpos = NULL; + + nand_init(&sc->nand_dev, dev, params->ecc, 0, 0, eccpos, "nandsim"); + + err = nandbus_create(dev); + + return (err); +} + +static int +nandsim_detach(device_t dev) +{ + struct nandsim_softc *sc; + struct sim_ctrl_conf *params; + int i; + + sc = device_get_softc(dev); + params = &ctrls[device_get_unit(dev)]; + + for (i = 0; i < params->num_cs; i++) + if (sc->chips[i] != NULL) + nandsim_chip_destroy(sc->chips[i]); + + nandsim_log_close(sc); + + return (0); +} + +static int +nandsim_select_cs(device_t dev, uint8_t cs) +{ + struct nandsim_softc *sc; + + sc = device_get_softc(dev); + + if (cs >= MAX_CS_NUM) + return (EINVAL); + + sc->active_chip = sc->chips[cs]; + + if (sc->active_chip) + nandsim_log(sc->active_chip, NANDSIM_LOG_EV, + "Select cs %d\n", cs); + + return (0); +} + +static int +nandsim_send_command(device_t dev, uint8_t command) +{ + struct nandsim_softc *sc; + struct nandsim_chip *chip; + struct nandsim_ev *ev; + + sc = device_get_softc(dev); + chip = sc->active_chip; + + if (chip == NULL) + return (0); + + nandsim_log(chip, NANDSIM_LOG_EV, "Send command %x\n", command); + + switch (command) { + case NAND_CMD_READ_ID: + case NAND_CMD_READ_PARAMETER: + sc->address_type = ADDR_ID; + break; + case NAND_CMD_ERASE: + sc->address_type = ADDR_ROW; + break; + case NAND_CMD_READ: + case NAND_CMD_PROG: + sc->address_type = ADDR_ROWCOL; + break; + default: + sc->address_type = ADDR_NONE; + break; + } + + if (command == NAND_CMD_STATUS) + chip->flags |= NANDSIM_CHIP_GET_STATUS; + else { + ev = create_event(chip, NANDSIM_EV_CMD, 1); + *(uint8_t *)ev->data = command; + send_event(ev); + } + + return (0); +} + +static int +nandsim_send_address(device_t dev, uint8_t addr) +{ + struct nandsim_ev *ev; + struct nandsim_softc *sc; + struct nandsim_chip *chip; + + sc = device_get_softc(dev); + chip = sc->active_chip; + + if (chip == NULL) + return (0); + + KASSERT((sc->address_type != ADDR_NONE), ("unexpected address")); + nandsim_log(chip, NANDSIM_LOG_EV, "Send addr %x\n", addr); + + ev = create_event(chip, NANDSIM_EV_ADDR, 1); + + *((uint8_t *)(ev->data)) = addr; + + send_event(ev); + return (0); +} + +static uint8_t +nandsim_read_byte(device_t dev) +{ + struct nandsim_softc *sc; + struct nandsim_chip *chip; + uint8_t ret = 0xff; + + sc = device_get_softc(dev); + chip = sc->active_chip; + + if (chip && !(chip->flags & NANDSIM_CHIP_FROZEN)) { + if (chip->flags & NANDSIM_CHIP_GET_STATUS) { + nandsim_chip_timeout(chip); + ret = nandchip_get_status(chip); + chip->flags &= ~NANDSIM_CHIP_GET_STATUS; + } else if (chip->data.index < chip->data.size) { + ret = chip->data.data_ptr[chip->data.index++]; + byte_corrupt(chip, &ret); + } + nandsim_log(chip, NANDSIM_LOG_DATA, "read %02x\n", ret); + } + + return (ret); +} + +static uint16_t +nandsim_read_word(device_t dev) +{ + struct nandsim_softc *sc; + struct nandsim_chip *chip; + uint16_t *data_ptr; + uint16_t ret = 0xffff; + uint8_t *byte_ret = (uint8_t *)&ret; + + sc = device_get_softc(dev); + chip = sc->active_chip; + + if (chip && !(chip->flags & NANDSIM_CHIP_FROZEN)) { + if (chip->data.index < chip->data.size - 1) { + data_ptr = + (uint16_t *)&(chip->data.data_ptr[chip->data.index]); + ret = *data_ptr; + chip->data.index += 2; + byte_corrupt(chip, byte_ret); + byte_corrupt(chip, byte_ret + 1); + } + nandsim_log(chip, NANDSIM_LOG_DATA, "read %04x\n", ret); + } + + return (ret); +} + +static void +nandsim_write_byte(device_t dev, uint8_t byte) +{ + struct nandsim_softc *sc; + struct nandsim_chip *chip; + + sc = device_get_softc(dev); + chip = sc->active_chip; + + if (chip && !(chip->flags & NANDSIM_CHIP_FROZEN) && + (chip->data.index < chip->data.size)) { + byte_corrupt(chip, &byte); + chip->data.data_ptr[chip->data.index] &= byte; + chip->data.index++; + nandsim_log(chip, NANDSIM_LOG_DATA, "write %02x\n", byte); + } +} + +static void +nandsim_write_word(device_t dev, uint16_t word) +{ + struct nandsim_softc *sc; + struct nandsim_chip *chip; + uint16_t *data_ptr; + uint8_t *byte_ptr = (uint8_t *)&word; + + sc = device_get_softc(dev); + chip = sc->active_chip; + + if (chip && !(chip->flags & NANDSIM_CHIP_FROZEN)) { + if ((chip->data.index + 1) < chip->data.size) { + byte_corrupt(chip, byte_ptr); + byte_corrupt(chip, byte_ptr + 1); + data_ptr = + (uint16_t *)&(chip->data.data_ptr[chip->data.index]); + *data_ptr &= word; + chip->data.index += 2; + } + + nandsim_log(chip, NANDSIM_LOG_DATA, "write %04x\n", word); + } +} + +static void +nandsim_read_buf(device_t dev, void *buf, uint32_t len) +{ + struct nandsim_softc *sc; + uint16_t *buf16 = (uint16_t *)buf; + uint8_t *buf8 = (uint8_t *)buf; + int i; + + sc = device_get_softc(dev); + + if (sc->nand_dev.flags & NAND_16_BIT) { + for (i = 0; i < len / 2; i++) + buf16[i] = nandsim_read_word(dev); + } else { + for (i = 0; i < len; i++) + buf8[i] = nandsim_read_byte(dev); + } +} + +static void +nandsim_write_buf(device_t dev, void *buf, uint32_t len) +{ + struct nandsim_softc *sc; + uint16_t *buf16 = (uint16_t *)buf; + uint8_t *buf8 = (uint8_t *)buf; + int i; + + sc = device_get_softc(dev); + + if (sc->nand_dev.flags & NAND_16_BIT) { + for (i = 0; i < len / 2; i++) + nandsim_write_word(dev, buf16[i]); + } else { + for (i = 0; i < len; i++) + nandsim_write_byte(dev, buf8[i]); + } +} + +static void +byte_corrupt(struct nandsim_chip *chip, uint8_t *byte) +{ + uint32_t rand; + uint8_t bit; + + rand = random(); + if ((rand % 1000000) < chip->error_ratio) { + bit = rand % 8; + if (*byte & (1 << bit)) + *byte &= ~(1 << bit); + else + *byte |= (1 << bit); + } +} diff --git a/sys/dev/nand/nandsim_log.c b/sys/dev/nand/nandsim_log.c new file mode 100644 index 00000000000..c51118f0dda --- /dev/null +++ b/sys/dev/nand/nandsim_log.c @@ -0,0 +1,186 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +int nandsim_log_level; +int nandsim_log_output; +int log_size = NANDSIM_RAM_LOG_SIZE; + +static int nandsim_entry_size = NANDSIM_ENTRY_SIZE; +static int nandsim_entry_count = NANDSIM_ENTRY_COUNT; +static int str_index = 0; +static char string[NANDSIM_ENTRY_SIZE + 1] = {0}; + +int +nandsim_log_init(struct nandsim_softc *sc, char *filename) +{ + int error = 0; + + if (nandsim_log_output == NANDSIM_OUTPUT_FILE) { + error = alq_open(&sc->alq, filename, + curthread->td_ucred, 0644, + nandsim_entry_size, nandsim_entry_count); + } else if (nandsim_log_output == NANDSIM_OUTPUT_RAM) { + sc->log_buff = malloc(log_size, M_NANDSIM, M_WAITOK | M_ZERO); + if (!sc->log_buff) + error = ENOMEM; + } + + return (error); +} + +void +nandsim_log_close(struct nandsim_softc *sc) +{ + + if (nandsim_log_output == NANDSIM_OUTPUT_FILE) { + memset(&string[str_index], 0, NANDSIM_ENTRY_SIZE - str_index); + alq_write(sc->alq, (void *) string, ALQ_NOWAIT); + str_index = 0; + string[0] = '\0'; + alq_close(sc->alq); + } else if (nandsim_log_output == NANDSIM_OUTPUT_RAM) { + free(sc->log_buff, M_NANDSIM); + sc->log_buff = NULL; + } +} + +void +nandsim_log(struct nandsim_chip *chip, int level, const char *fmt, ...) +{ + char hdr[TIME_STR_SIZE]; + char tmp[NANDSIM_ENTRY_SIZE]; + struct nandsim_softc *sc; + struct timeval currtime; + va_list ap; + int hdr_len, len, rest; + + if (nandsim_log_output == NANDSIM_OUTPUT_NONE) + return; + + if (chip == NULL) + return; + + sc = chip->sc; + if (!sc->alq && nandsim_log_output == NANDSIM_OUTPUT_FILE) + return; + + if (level <= nandsim_log_level) { + microtime(&currtime); + hdr_len = sprintf(hdr, "%08jd.%08li [chip:%d, ctrl:%d]: ", + (intmax_t)currtime.tv_sec, currtime.tv_usec, + chip->chip_num, chip->ctrl_num); + + switch(nandsim_log_output) { + case NANDSIM_OUTPUT_CONSOLE: + printf("%s", hdr); + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); + break; + case NANDSIM_OUTPUT_RAM: + va_start(ap, fmt); + len = vsnprintf(tmp, NANDSIM_ENTRY_SIZE - 1, fmt, ap); + tmp[NANDSIM_ENTRY_SIZE - 1] = 0; + va_end(ap); + + rest = log_size - sc->log_idx - 1; + if (rest >= hdr_len) { + bcopy(hdr, &sc->log_buff[sc->log_idx], + hdr_len); + sc->log_idx += hdr_len; + sc->log_buff[sc->log_idx] = 0; + } else { + bcopy(hdr, &sc->log_buff[sc->log_idx], rest); + bcopy(&hdr[rest], sc->log_buff, + hdr_len - rest); + sc->log_idx = hdr_len - rest; + sc->log_buff[sc->log_idx] = 0; + } + + rest = log_size - sc->log_idx - 1; + if (rest >= len) { + bcopy(tmp, &sc->log_buff[sc->log_idx], len); + sc->log_idx += len; + sc->log_buff[sc->log_idx] = 0; + } else { + bcopy(tmp, &sc->log_buff[sc->log_idx], rest); + bcopy(&tmp[rest], sc->log_buff, len - rest); + sc->log_idx = len - rest; + sc->log_buff[sc->log_idx] = 0; + } + + break; + + case NANDSIM_OUTPUT_FILE: + va_start(ap, fmt); + len = vsnprintf(tmp, NANDSIM_ENTRY_SIZE - 1, fmt, ap); + tmp[NANDSIM_ENTRY_SIZE - 1] = 0; + va_end(ap); + + rest = NANDSIM_ENTRY_SIZE - str_index; + if (rest >= hdr_len) { + strcat(string, hdr); + str_index += hdr_len; + } else { + strlcat(string, hdr, NANDSIM_ENTRY_SIZE + 1); + alq_write(sc->alq, (void *) string, + ALQ_NOWAIT); + strcpy(string, &hdr[rest]); + str_index = hdr_len - rest; + } + rest = NANDSIM_ENTRY_SIZE - str_index; + if (rest >= len) { + strcat(string, tmp); + str_index += len; + } else { + strlcat(string, tmp, NANDSIM_ENTRY_SIZE + 1); + alq_write(sc->alq, (void *) string, + ALQ_NOWAIT); + strcpy(string, &tmp[rest]); + str_index = len - rest; + } + break; + default: + break; + } + } +} diff --git a/sys/dev/nand/nandsim_log.h b/sys/dev/nand/nandsim_log.h new file mode 100644 index 00000000000..8cf108200df --- /dev/null +++ b/sys/dev/nand/nandsim_log.h @@ -0,0 +1,52 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _NANDSIM_LOG_H +#define _NANDSIM_LOG_H + +#include + +#define NANDSIM_ENTRY_SIZE 128 +#define NANDSIM_ENTRY_COUNT 1024 +#define NANDSIM_RAM_LOG_SIZE 16384 +#define TIME_STR_SIZE 40 + +#define NANDSIM_LOG_ERR 1 +#define NANDSIM_LOG_SM 5 +#define NANDSIM_LOG_EV 10 +#define NANDSIM_LOG_DATA 15 + +extern int nandsim_log_level; +extern int nandsim_log_output; + +int nandsim_log_init(struct nandsim_softc *, char *); +void nandsim_log_close(struct nandsim_softc *); +void nandsim_log(struct nandsim_chip *, int, const char *, ...); + +#endif /* _NANDSIM_LOG_H */ + diff --git a/sys/dev/nand/nandsim_swap.c b/sys/dev/nand/nandsim_swap.c new file mode 100644 index 00000000000..cc4201dbed8 --- /dev/null +++ b/sys/dev/nand/nandsim_swap.c @@ -0,0 +1,389 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +static int init_block_state(struct chip_swap *); +static void destroy_block_state(struct chip_swap *); + +static int create_buffers(struct chip_swap *); +static void destroy_buffers(struct chip_swap *); + +static int swap_file_open(struct chip_swap *, const char *); +static void swap_file_close(struct chip_swap *); +static int swap_file_write(struct chip_swap *, struct block_state *); +static int swap_file_read(struct chip_swap *, struct block_state *); + +#define CHIP_SWAP_CMODE 0600 +#define CHIP_SWAP_BLOCKSPACES 2 + +static int +init_block_state(struct chip_swap *swap) +{ + struct block_state *blk_state; + int i; + + if (swap == NULL) + return (-1); + + blk_state = malloc(swap->nof_blks * sizeof(struct block_state), + M_NANDSIM, M_WAITOK | M_ZERO); + + for (i = 0; i < swap->nof_blks; i++) + blk_state[i].offset = 0xffffffff; + + swap->blk_state = blk_state; + + return (0); +} + +static void +destroy_block_state(struct chip_swap *swap) +{ + + if (swap == NULL) + return; + + if (swap->blk_state != NULL) + free(swap->blk_state, M_NANDSIM); +} + +static int +create_buffers(struct chip_swap *swap) +{ + struct block_space *block_space; + void *block; + int i; + + for (i = 0; i < CHIP_SWAP_BLOCKSPACES; i++) { + block_space = malloc(sizeof(*block_space), M_NANDSIM, M_WAITOK); + block = malloc(swap->blk_size, M_NANDSIM, M_WAITOK); + block_space->blk_ptr = block; + SLIST_INSERT_HEAD(&swap->free_bs, block_space, free_link); + nand_debug(NDBG_SIM,"created blk_space %p[%p]\n", block_space, + block); + } + + if (i == 0) + return (-1); + + return (0); +} + +static void +destroy_buffers(struct chip_swap *swap) +{ + struct block_space *blk_space; + + if (swap == NULL) + return; + + blk_space = SLIST_FIRST(&swap->free_bs); + while (blk_space) { + SLIST_REMOVE_HEAD(&swap->free_bs, free_link); + nand_debug(NDBG_SIM,"destroyed blk_space %p[%p]\n", + blk_space, blk_space->blk_ptr); + free(blk_space->blk_ptr, M_NANDSIM); + free(blk_space, M_NANDSIM); + blk_space = SLIST_FIRST(&swap->free_bs); + } + + blk_space = STAILQ_FIRST(&swap->used_bs); + while (blk_space) { + STAILQ_REMOVE_HEAD(&swap->used_bs, used_link); + nand_debug(NDBG_SIM,"destroyed blk_space %p[%p]\n", + blk_space, blk_space->blk_ptr); + free(blk_space->blk_ptr, M_NANDSIM); + free(blk_space, M_NANDSIM); + blk_space = STAILQ_FIRST(&swap->used_bs); + } +} + +static int +swap_file_open(struct chip_swap *swap, const char *swap_file) +{ + struct nameidata nd; + int vfslocked, flags, error; + + NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, swap_file, + curthread); + + flags = FWRITE | FREAD | O_NOFOLLOW | O_CREAT | O_TRUNC; + + error = vn_open(&nd, &flags, CHIP_SWAP_CMODE, NULL); + if (error) { + nand_debug(NDBG_SIM,"Cannot create swap file %s", swap_file); + NDFREE(&nd, NDF_ONLY_PNBUF); + return (error); + } + + swap->swap_cred = crhold(curthread->td_ucred); + vfslocked = NDHASGIANT(&nd); + NDFREE(&nd, NDF_ONLY_PNBUF); + + /* We just unlock so we hold a reference */ + VOP_UNLOCK(nd.ni_vp, 0); + VFS_UNLOCK_GIANT(vfslocked); + + swap->swap_vp = nd.ni_vp; + + return (0); +} + +static void +swap_file_close(struct chip_swap *swap) +{ + + if (swap == NULL) + return; + + if (swap->swap_vp == NULL) + return; + + vn_close(swap->swap_vp, FWRITE, swap->swap_cred, curthread); + crfree(swap->swap_cred); +} + +static int +swap_file_write(struct chip_swap *swap, struct block_state *blk_state) +{ + struct block_space *blk_space; + struct thread *td; + struct mount *mp; + struct vnode *vp; + struct uio auio; + struct iovec aiov; + int vfslocked; + + if (swap == NULL || blk_state == NULL) + return (-1); + + blk_space = blk_state->blk_sp; + if (blk_state->offset == -1) { + blk_state->offset = swap->swap_offset; + swap->swap_offset += swap->blk_size; + } + + nand_debug(NDBG_SIM,"saving %p[%p] at %x\n", + blk_space, blk_space->blk_ptr, blk_state->offset); + + bzero(&aiov, sizeof(aiov)); + bzero(&auio, sizeof(auio)); + + aiov.iov_base = blk_space->blk_ptr; + aiov.iov_len = swap->blk_size; + td = curthread; + vp = swap->swap_vp; + + auio.uio_iov = &aiov; + auio.uio_offset = blk_state->offset; + auio.uio_segflg = UIO_SYSSPACE; + auio.uio_rw = UIO_WRITE; + auio.uio_iovcnt = 1; + auio.uio_resid = swap->blk_size; + auio.uio_td = td; + + vfslocked = VFS_LOCK_GIANT(vp->v_mount); + vn_start_write(vp, &mp, V_WAIT); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + VOP_WRITE(vp, &auio, IO_UNIT, swap->swap_cred); + VOP_UNLOCK(vp, 0); + vn_finished_write(mp); + VFS_UNLOCK_GIANT(vfslocked); + + return (0); +} + +static int +swap_file_read(struct chip_swap *swap, struct block_state *blk_state) +{ + struct block_space *blk_space; + struct thread *td; + struct vnode *vp; + struct uio auio; + struct iovec aiov; + int vfslocked; + + if (swap == NULL || blk_state == NULL) + return (-1); + + blk_space = blk_state->blk_sp; + + nand_debug(NDBG_SIM,"restore %p[%p] at %x\n", + blk_space, blk_space->blk_ptr, blk_state->offset); + + bzero(&aiov, sizeof(aiov)); + bzero(&auio, sizeof(auio)); + + aiov.iov_base = blk_space->blk_ptr; + aiov.iov_len = swap->blk_size; + td = curthread; + vp = swap->swap_vp; + + auio.uio_iov = &aiov; + auio.uio_offset = blk_state->offset; + auio.uio_segflg = UIO_SYSSPACE; + auio.uio_rw = UIO_READ; + auio.uio_iovcnt = 1; + auio.uio_resid = swap->blk_size; + auio.uio_td = td; + + vfslocked = VFS_LOCK_GIANT(vp->v_mount); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + VOP_READ(vp, &auio, 0, swap->swap_cred); + VOP_UNLOCK(vp, 0); + VFS_UNLOCK_GIANT(vfslocked); + + return (0); +} + +struct chip_swap * +nandsim_swap_init(const char *swap_file, uint32_t nof_blks, uint32_t blk_size) +{ + struct chip_swap *swap; + int err = 0; + + if ((swap_file == NULL) || (nof_blks == 0) || (blk_size == 0)) + return (NULL); + + swap = malloc(sizeof(*swap), M_NANDSIM, M_WAITOK | M_ZERO); + + SLIST_INIT(&swap->free_bs); + STAILQ_INIT(&swap->used_bs); + swap->blk_size = blk_size; + swap->nof_blks = nof_blks; + + err = init_block_state(swap); + if (err) { + nandsim_swap_destroy(swap); + return (NULL); + } + + err = create_buffers(swap); + if (err) { + nandsim_swap_destroy(swap); + return (NULL); + } + + err = swap_file_open(swap, swap_file); + if (err) { + nandsim_swap_destroy(swap); + return (NULL); + } + + return (swap); +} + +void +nandsim_swap_destroy(struct chip_swap *swap) +{ + + if (swap == NULL) + return; + + destroy_block_state(swap); + destroy_buffers(swap); + swap_file_close(swap); + free(swap, M_NANDSIM); +} + +struct block_space * +get_bs(struct chip_swap *swap, uint32_t block, uint8_t writing) +{ + struct block_state *blk_state, *old_blk_state = NULL; + struct block_space *blk_space; + + if (swap == NULL || (block >= swap->nof_blks)) + return (NULL); + + blk_state = &swap->blk_state[block]; + nand_debug(NDBG_SIM,"blk_state %x\n", blk_state->status); + + if (blk_state->status & BLOCK_ALLOCATED) { + blk_space = blk_state->blk_sp; + } else { + blk_space = SLIST_FIRST(&swap->free_bs); + if (blk_space) { + SLIST_REMOVE_HEAD(&swap->free_bs, free_link); + STAILQ_INSERT_TAIL(&swap->used_bs, blk_space, + used_link); + } else { + blk_space = STAILQ_FIRST(&swap->used_bs); + old_blk_state = blk_space->blk_state; + STAILQ_REMOVE_HEAD(&swap->used_bs, used_link); + STAILQ_INSERT_TAIL(&swap->used_bs, blk_space, + used_link); + if (old_blk_state->status & BLOCK_DIRTY) { + swap_file_write(swap, old_blk_state); + old_blk_state->status &= ~BLOCK_DIRTY; + old_blk_state->status |= BLOCK_SWAPPED; + } + } + } + + if (blk_space == NULL) + return (NULL); + + if (old_blk_state != NULL) { + old_blk_state->status &= ~BLOCK_ALLOCATED; + old_blk_state->blk_sp = NULL; + } + + blk_state->blk_sp = blk_space; + blk_space->blk_state = blk_state; + + if (!(blk_state->status & BLOCK_ALLOCATED)) { + if (blk_state->status & BLOCK_SWAPPED) + swap_file_read(swap, blk_state); + else + memset(blk_space->blk_ptr, 0xff, swap->blk_size); + blk_state->status |= BLOCK_ALLOCATED; + } + + if (writing) + blk_state->status |= BLOCK_DIRTY; + + nand_debug(NDBG_SIM,"get_bs returned %p[%p] state %x\n", blk_space, + blk_space->blk_ptr, blk_state->status); + + return (blk_space); +} diff --git a/sys/dev/nand/nandsim_swap.h b/sys/dev/nand/nandsim_swap.h new file mode 100644 index 00000000000..4fbae2a6827 --- /dev/null +++ b/sys/dev/nand/nandsim_swap.h @@ -0,0 +1,64 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _NANDSIM_SWAP_CHIP_H_ +#define _NANDSIM_SWAP_CHIP_H_ + +struct block_space { + SLIST_ENTRY(block_space) free_link; + STAILQ_ENTRY(block_space) used_link; + struct block_state *blk_state; + uint8_t *blk_ptr; +}; + +#define BLOCK_ALLOCATED 0x1 +#define BLOCK_SWAPPED 0x2 +#define BLOCK_DIRTY 0x4 + +struct block_state { + struct block_space *blk_sp; + uint32_t offset; + uint8_t status; +}; + +struct chip_swap { + struct block_state *blk_state; + SLIST_HEAD(,block_space) free_bs; + STAILQ_HEAD(,block_space) used_bs; + struct ucred *swap_cred; + struct vnode *swap_vp; + uint32_t swap_offset; + uint32_t blk_size; + uint32_t nof_blks; +}; + +struct chip_swap *nandsim_swap_init(const char *, uint32_t, uint32_t); +void nandsim_swap_destroy(struct chip_swap *); +struct block_space *get_bs(struct chip_swap *, uint32_t, uint8_t); + +#endif /* _NANDSIM_SWAP_CHIP_H_ */ diff --git a/sys/dev/nand/nfc_fsl.c b/sys/dev/nand/nfc_fsl.c new file mode 100644 index 00000000000..19a3a459123 --- /dev/null +++ b/sys/dev/nand/nfc_fsl.c @@ -0,0 +1,716 @@ +/*- + * Copyright (C) 2012 Juniper Networks, Inc. + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/* + * TODO : + * + * -- test support for small pages + * -- support for reading ONFI parameters + * -- support for cached and interleaving commands + * -- proper setting of AL bits in FMR + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include + +#include +#include + +#include "nfc_fsl.h" + +#include "nfc_if.h" + +#define LBC_READ(regname) lbc_read_reg(dev, (LBC85XX_ ## regname)) +#define LBC_WRITE(regname, val) lbc_write_reg(dev, (LBC85XX_ ## regname), val) + +enum addr_type { + ADDR_NONE, + ADDR_ID, + ADDR_ROW, + ADDR_ROWCOL +}; + +struct fsl_nfc_fcm { + /* Read-only after initialization */ + uint32_t reg_fmr; + + /* To be preserved across "start_command" */ + u_int buf_ofs; + u_int read_ptr; + u_int status:1; + + /* Command state -- cleared by "start_command" */ + uint32_t fcm_startzero; + uint32_t reg_fcr; + uint32_t reg_fir; + uint32_t reg_mdr; + uint32_t reg_fbcr; + uint32_t reg_fbar; + uint32_t reg_fpar; + u_int cmdnr; + u_int opnr; + u_int pg_ofs; + enum addr_type addr_type; + u_int addr_bytes; + u_int row_addr; + u_int column_addr; + u_int data_fir:8; + uint32_t fcm_endzero; +}; + +struct fsl_nand_softc { + struct nand_softc nand_dev; + device_t dev; + struct resource *res; + int rid; /* Resourceid */ + struct lbc_devinfo *dinfo; + struct fsl_nfc_fcm fcm; + uint8_t col_cycles; + uint8_t row_cycles; + uint16_t pgsz; /* Page size */ +}; + +static int fsl_nand_attach(device_t dev); +static int fsl_nand_probe(device_t dev); +static int fsl_nand_detach(device_t dev); + +static int fsl_nfc_select_cs(device_t dev, uint8_t cs); +static int fsl_nfc_read_rnb(device_t dev); +static int fsl_nfc_send_command(device_t dev, uint8_t command); +static int fsl_nfc_send_address(device_t dev, uint8_t address); +static uint8_t fsl_nfc_read_byte(device_t dev); +static int fsl_nfc_start_command(device_t dev); +static void fsl_nfc_read_buf(device_t dev, void *buf, uint32_t len); +static void fsl_nfc_write_buf(device_t dev, void *buf, uint32_t len); + +static device_method_t fsl_nand_methods[] = { + DEVMETHOD(device_probe, fsl_nand_probe), + DEVMETHOD(device_attach, fsl_nand_attach), + DEVMETHOD(device_detach, fsl_nand_detach), + + DEVMETHOD(nfc_select_cs, fsl_nfc_select_cs), + DEVMETHOD(nfc_read_rnb, fsl_nfc_read_rnb), + DEVMETHOD(nfc_start_command, fsl_nfc_start_command), + DEVMETHOD(nfc_send_command, fsl_nfc_send_command), + DEVMETHOD(nfc_send_address, fsl_nfc_send_address), + DEVMETHOD(nfc_read_byte, fsl_nfc_read_byte), + DEVMETHOD(nfc_read_buf, fsl_nfc_read_buf), + DEVMETHOD(nfc_write_buf, fsl_nfc_write_buf), + { 0, 0 }, +}; + +static driver_t fsl_nand_driver = { + "nand", + fsl_nand_methods, + sizeof(struct fsl_nand_softc), +}; + +static devclass_t fsl_nand_devclass; + +DRIVER_MODULE(fsl_nand, lbc, fsl_nand_driver, fsl_nand_devclass, + 0, 0); + +static int fsl_nand_build_address(device_t dev, uint32_t page, uint32_t column); +static int fsl_nand_chip_preprobe(device_t dev, struct nand_id *id); + +#ifdef NAND_DEBUG_TIMING +static device_t fcm_devs[8]; +#endif + +#define CMD_SHIFT(cmd_num) (24 - ((cmd_num) * 8)) +#define OP_SHIFT(op_num) (28 - ((op_num) * 4)) + +#define FSL_LARGE_PAGE_SIZE (2112) +#define FSL_SMALL_PAGE_SIZE (528) + +static void +fsl_nand_init_regs(struct fsl_nand_softc *sc) +{ + uint32_t or_v, br_v; + device_t dev; + + dev = sc->dev; + + sc->fcm.reg_fmr = (15 << FMR_CWTO_SHIFT); + + /* + * Setup 4 row cycles and hope that chip ignores superfluous address + * bytes. + */ + sc->fcm.reg_fmr |= (2 << FMR_AL_SHIFT); + + /* Reprogram BR(x) */ + br_v = lbc_read_reg(dev, LBC85XX_BR(sc->dinfo->di_bank)); + br_v &= 0xffff8000; + br_v |= 1 << 11; /* 8-bit port size */ + br_v |= 0 << 9; /* No ECC checking and generation */ + br_v |= 1 << 5; /* FCM machine */ + br_v |= 1; /* Valid */ + lbc_write_reg(dev, LBC85XX_BR(sc->dinfo->di_bank), br_v); + + /* Reprogram OR(x) */ + or_v = lbc_read_reg(dev, LBC85XX_OR(sc->dinfo->di_bank)); + or_v &= 0xfffffc00; + or_v |= 0x03AE; /* Default POR timing */ + lbc_write_reg(dev, LBC85XX_OR(sc->dinfo->di_bank), or_v); + + if (or_v & OR_FCM_PAGESIZE) { + sc->pgsz = FSL_LARGE_PAGE_SIZE; + sc->col_cycles = 2; + nand_debug(NDBG_DRV, "%s: large page NAND device at #%d", + device_get_nameunit(dev), sc->dinfo->di_bank); + } else { + sc->pgsz = FSL_SMALL_PAGE_SIZE; + sc->col_cycles = 1; + nand_debug(NDBG_DRV, "%s: small page NAND device at #%d", + device_get_nameunit(dev), sc->dinfo->di_bank); + } +} + +static int +fsl_nand_probe(device_t dev) +{ + + if (!ofw_bus_is_compatible(dev, "fsl,elbc-fcm-nand")) + return (ENXIO); + + device_set_desc(dev, "Freescale localbus FCM Controller"); + return (BUS_PROBE_DEFAULT); +} + +static int +fsl_nand_attach(device_t dev) +{ + struct fsl_nand_softc *sc; + struct nand_id id; + struct nand_params *param; + uint32_t num_pages; + + sc = device_get_softc(dev); + sc->dev = dev; + sc->dinfo = device_get_ivars(dev); + + sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->rid, + RF_ACTIVE); + if (sc->res == NULL) { + device_printf(dev, "could not allocate resources!\n"); + return (ENXIO); + } + + bzero(&sc->fcm, sizeof(sc->fcm)); + + /* Init register and check if HW ECC turned on */ + fsl_nand_init_regs(sc); + + /* Chip is probed, so determine number of row address cycles */ + fsl_nand_chip_preprobe(dev, &id); + param = nand_get_params(&id); + if (param != NULL) { + num_pages = (param->chip_size << 20) / param->page_size; + while(num_pages) { + sc->row_cycles++; + num_pages >>= 8; + } + + sc->fcm.reg_fmr &= ~(FMR_AL); + sc->fcm.reg_fmr |= (sc->row_cycles - 2) << FMR_AL_SHIFT; + } + + nand_init(&sc->nand_dev, dev, NAND_ECC_SOFT, 0, 0, NULL, NULL); + +#ifdef NAND_DEBUG_TIMING + fcm_devs[sc->dinfo->di_bank] = dev; +#endif + + return (nandbus_create(dev)); +} + +static int +fsl_nand_detach(device_t dev) +{ + struct fsl_nand_softc *sc; + + sc = device_get_softc(dev); + + if (sc->res != NULL) + bus_release_resource(dev, SYS_RES_MEMORY, sc->rid, sc->res); + + return (0); +} + +static int +fsl_nfc_select_cs(device_t dev, uint8_t cs) +{ + + // device_printf(dev, "%s(cs=%u)\n", __func__, cs); + return ((cs > 0) ? EINVAL : 0); +} + +static int +fsl_nfc_read_rnb(device_t dev) +{ + + // device_printf(dev, "%s()\n", __func__); + return (0); +} + +static int +fsl_nfc_send_command(device_t dev, uint8_t command) +{ + struct fsl_nand_softc *sc; + struct fsl_nfc_fcm *fcm; + uint8_t fir_op; + + // device_printf(dev, "%s(command=%u)\n", __func__, command); + + sc = device_get_softc(dev); + fcm = &sc->fcm; + + if (command == NAND_CMD_PROG_END) { + fcm->reg_fir |= (FIR_OP_WB << OP_SHIFT(fcm->opnr)); + fcm->opnr++; + } + fcm->reg_fcr |= command << CMD_SHIFT(fcm->cmdnr); + fir_op = (fcm->cmdnr == 0) ? FIR_OP_CW0 : FIR_OP_CM(fcm->cmdnr); + fcm->cmdnr++; + + fcm->reg_fir |= (fir_op << OP_SHIFT(fcm->opnr)); + fcm->opnr++; + + switch (command) { + case NAND_CMD_READ_ID: + fcm->data_fir = FIR_OP_RBW; + fcm->addr_type = ADDR_ID; + break; + case NAND_CMD_SMALLOOB: + fcm->pg_ofs += 256; + /*FALLTHROUGH*/ + case NAND_CMD_SMALLB: + fcm->pg_ofs += 256; + /*FALLTHROUGH*/ + case NAND_CMD_READ: /* NAND_CMD_SMALLA */ + fcm->data_fir = FIR_OP_RBW; + fcm->addr_type = ADDR_ROWCOL; + break; + case NAND_CMD_STATUS: + fcm->data_fir = FIR_OP_RS; + fcm->status = 1; + break; + case NAND_CMD_ERASE: + fcm->addr_type = ADDR_ROW; + break; + case NAND_CMD_PROG: + fcm->addr_type = ADDR_ROWCOL; + break; + } + return (0); +} + +static int +fsl_nfc_send_address(device_t dev, uint8_t addr) +{ + struct fsl_nand_softc *sc; + struct fsl_nfc_fcm *fcm; + uint32_t addr_bits; + + // device_printf(dev, "%s(address=%u)\n", __func__, addr); + + sc = device_get_softc(dev); + fcm = &sc->fcm; + + KASSERT(fcm->addr_type != ADDR_NONE, + ("controller doesn't expect address cycle")); + + addr_bits = addr; + + if (fcm->addr_type == ADDR_ID) { + fcm->reg_fir |= (FIR_OP_UA << OP_SHIFT(fcm->opnr)); + fcm->opnr++; + + fcm->reg_fbcr = 5; + fcm->reg_fbar = 0; + fcm->reg_fpar = 0; + fcm->reg_mdr = addr_bits; + fcm->buf_ofs = 0; + fcm->read_ptr = 0; + return (0); + } + + if (fcm->addr_type == ADDR_ROW) { + addr_bits <<= fcm->addr_bytes * 8; + fcm->row_addr |= addr_bits; + fcm->addr_bytes++; + if (fcm->addr_bytes < sc->row_cycles) + return (0); + } else { + if (fcm->addr_bytes < sc->col_cycles) { + addr_bits <<= fcm->addr_bytes * 8; + fcm->column_addr |= addr_bits; + } else { + addr_bits <<= (fcm->addr_bytes - sc->col_cycles) * 8; + fcm->row_addr |= addr_bits; + } + fcm->addr_bytes++; + if (fcm->addr_bytes < (sc->row_cycles + sc->col_cycles)) + return (0); + } + + return (fsl_nand_build_address(dev, fcm->row_addr, fcm->column_addr)); +} + +static int +fsl_nand_build_address(device_t dev, uint32_t row, uint32_t column) +{ + struct fsl_nand_softc *sc; + struct fsl_nfc_fcm *fcm; + uint32_t byte_count = 0; + uint32_t block_address = 0; + uint32_t page_address = 0; + + sc = device_get_softc(dev); + fcm = &sc->fcm; + + fcm->read_ptr = 0; + fcm->buf_ofs = 0; + + if (fcm->addr_type == ADDR_ROWCOL) { + fcm->reg_fir |= (FIR_OP_CA << OP_SHIFT(fcm->opnr)); + fcm->opnr++; + + column += fcm->pg_ofs; + fcm->pg_ofs = 0; + + page_address |= column; + + if (column != 0) { + byte_count = sc->pgsz - column; + fcm->read_ptr = column; + } + } + + fcm->reg_fir |= (FIR_OP_PA << OP_SHIFT(fcm->opnr)); + fcm->opnr++; + + if (sc->pgsz == FSL_LARGE_PAGE_SIZE) { + block_address = row >> 6; + page_address |= ((row << FPAR_LP_PI_SHIFT) & FPAR_LP_PI); + fcm->buf_ofs = (row & 1) * 4096; + } else { + block_address = row >> 5; + page_address |= ((row << FPAR_SP_PI_SHIFT) & FPAR_SP_PI); + fcm->buf_ofs = (row & 7) * 1024; + } + + fcm->reg_fbcr = byte_count; + fcm->reg_fbar = block_address; + fcm->reg_fpar = page_address; + return (0); +} + +static int +fsl_nfc_start_command(device_t dev) +{ + struct fsl_nand_softc *sc; + struct fsl_nfc_fcm *fcm; + uint32_t fmr, ltesr_v; + int error, timeout; + + // device_printf(dev, "%s()\n", __func__); + + sc = device_get_softc(dev); + fcm = &sc->fcm; + + fmr = fcm->reg_fmr | FMR_OP; + + if (fcm->data_fir) + fcm->reg_fir |= (fcm->data_fir << OP_SHIFT(fcm->opnr)); + + LBC_WRITE(FIR, fcm->reg_fir); + LBC_WRITE(FCR, fcm->reg_fcr); + + LBC_WRITE(FMR, fmr); + + LBC_WRITE(FBCR, fcm->reg_fbcr); + LBC_WRITE(FBAR, fcm->reg_fbar); + LBC_WRITE(FPAR, fcm->reg_fpar); + + if (fcm->addr_type == ADDR_ID) + LBC_WRITE(MDR, fcm->reg_mdr); + + nand_debug(NDBG_DRV, "BEFORE:\nFMR=%#x, FIR=%#x, FCR=%#x", fmr, + fcm->reg_fir, fcm->reg_fcr); + nand_debug(NDBG_DRV, "MDR=%#x, FBAR=%#x, FPAR=%#x, FBCR=%#x", + LBC_READ(MDR), fcm->reg_fbar, fcm->reg_fpar, fcm->reg_fbcr); + + LBC_WRITE(LSOR, sc->dinfo->di_bank); + + timeout = (cold) ? FSL_FCM_WAIT_TIMEOUT : ~0; + error = 0; + ltesr_v = LBC_READ(LTESR); + while (!error && (ltesr_v & LTESR_CC) == 0) { + if (cold) { + DELAY(1000); + timeout--; + if (timeout < 0) + error = EWOULDBLOCK; + } else + error = tsleep(device_get_parent(sc->dev), PRIBIO, + "nfcfsl", hz); + ltesr_v = LBC_READ(LTESR); + } + if (error) + nand_debug(NDBG_DRV, "Command complete wait timeout\n"); + + nand_debug(NDBG_DRV, "AFTER:\nLTESR=%#x, LTEDR=%#x, LTEIR=%#x," + " LTEATR=%#x, LTEAR=%#x, LTECCR=%#x", ltesr_v, + LBC_READ(LTEDR), LBC_READ(LTEIR), LBC_READ(LTEATR), + LBC_READ(LTEAR), LBC_READ(LTECCR)); + + bzero(&fcm->fcm_startzero, + __rangeof(struct fsl_nfc_fcm, fcm_startzero, fcm_endzero)); + + if (fcm->status) + sc->fcm.reg_mdr = LBC_READ(MDR); + + /* Even if timeout occured, we should perform steps below */ + LBC_WRITE(LTESR, ltesr_v); + LBC_WRITE(LTEATR, 0); + + return (error); +} + +static uint8_t +fsl_nfc_read_byte(device_t dev) +{ + struct fsl_nand_softc *sc = device_get_softc(dev); + uint32_t offset; + + // device_printf(dev, "%s()\n", __func__); + + /* + * LBC controller allows us to read status into a MDR instead of FCM + * buffer. If last operation requested before read_byte() was STATUS, + * then return MDR instead of reading a single byte from a buffer. + */ + if (sc->fcm.status) { + sc->fcm.status = 0; + return (sc->fcm.reg_mdr); + } + + KASSERT(sc->fcm.read_ptr < sc->pgsz, + ("Attempt to read beyond buffer %x %x", sc->fcm.read_ptr, + sc->pgsz)); + + offset = sc->fcm.buf_ofs + sc->fcm.read_ptr; + sc->fcm.read_ptr++; + return (bus_read_1(sc->res, offset)); +} + +static void +fsl_nfc_read_buf(device_t dev, void *buf, uint32_t len) +{ + struct fsl_nand_softc *sc = device_get_softc(dev); + uint32_t offset; + int bytesleft = 0; + + // device_printf(dev, "%s(buf=%p, len=%u)\n", __func__, buf, len); + + nand_debug(NDBG_DRV, "REQUEST OF 0x%0x B (BIB=0x%0x, NTR=0x%0x)", + len, sc->pgsz, sc->fcm.read_ptr); + + bytesleft = MIN((unsigned int)len, sc->pgsz - sc->fcm.read_ptr); + + offset = sc->fcm.buf_ofs + sc->fcm.read_ptr; + bus_read_region_1(sc->res, offset, buf, bytesleft); + sc->fcm.read_ptr += bytesleft; +} + +static void +fsl_nfc_write_buf(device_t dev, void *buf, uint32_t len) +{ + struct fsl_nand_softc *sc = device_get_softc(dev); + uint32_t offset; + int bytesleft = 0; + + // device_printf(dev, "%s(buf=%p, len=%u)\n", __func__, buf, len); + + KASSERT(len <= sc->pgsz - sc->fcm.read_ptr, + ("Attempt to write beyond buffer")); + + bytesleft = MIN((unsigned int)len, sc->pgsz - sc->fcm.read_ptr); + + nand_debug(NDBG_DRV, "REQUEST TO WRITE 0x%0x (BIB=0x%0x, NTR=0x%0x)", + bytesleft, sc->pgsz, sc->fcm.read_ptr); + + offset = sc->fcm.buf_ofs + sc->fcm.read_ptr; + bus_write_region_1(sc->res, offset, buf, bytesleft); + sc->fcm.read_ptr += bytesleft; +} + +static int +fsl_nand_chip_preprobe(device_t dev, struct nand_id *id) +{ + + if (fsl_nfc_send_command(dev, NAND_CMD_RESET) != 0) + return (ENXIO); + + if (fsl_nfc_start_command(dev) != 0) + return (ENXIO); + + DELAY(1000); + + if (fsl_nfc_send_command(dev, NAND_CMD_READ_ID)) + return (ENXIO); + + if (fsl_nfc_send_address(dev, 0)) + return (ENXIO); + + if (fsl_nfc_start_command(dev) != 0) + return (ENXIO); + + DELAY(25); + + id->man_id = fsl_nfc_read_byte(dev); + id->dev_id = fsl_nfc_read_byte(dev); + + nand_debug(NDBG_DRV, "manufacturer id: %x chip id: %x", + id->man_id, id->dev_id); + + return (0); +} + +#ifdef NAND_DEBUG_TIMING + +static SYSCTL_NODE(_debug, OID_AUTO, fcm, CTLFLAG_RD, 0, "FCM timing"); + +static u_int csct = 1; /* 22: Chip select to command time (trlx). */ +SYSCTL_UINT(_debug_fcm, OID_AUTO, csct, CTLFLAG_RW, &csct, 1, + "Chip select to command time: determines how far in advance -LCSn is " + "asserted prior to any bus activity during a NAND Flash access handled " + "by the FCM. This helps meet chip-select setup times for slow memories."); + +static u_int cst = 1; /* 23: Command setup time (trlx). */ +SYSCTL_UINT(_debug_fcm, OID_AUTO, cst, CTLFLAG_RW, &cst, 1, + "Command setup time: determines the delay of -LFWE assertion relative to " + "the command, address, or data change when the external memory access " + "is handled by the FCM."); + +static u_int cht = 1; /* 24: Command hold time (trlx). */ +SYSCTL_UINT(_debug_fcm, OID_AUTO, cht, CTLFLAG_RW, &cht, 1, + "Command hold time: determines the -LFWE negation prior to the command, " + "address, or data change when the external memory access is handled by " + "the FCM."); + +static u_int scy = 2; /* 25-27: Cycle length in bus clocks */ +SYSCTL_UINT(_debug_fcm, OID_AUTO, scy, CTLFLAG_RW, &scy, 2, + "Cycle length in bus clocks: see RM"); + +static u_int rst = 1; /* 28: Read setup time (trlx). */ +SYSCTL_UINT(_debug_fcm, OID_AUTO, rst, CTLFLAG_RW, &rst, 1, + "Read setup time: determines the delay of -LFRE assertion relative to " + "sampling of read data when the external memory access is handled by " + "the FCM."); + +static u_int trlx = 1; /* 29: Timing relaxed. */ +SYSCTL_UINT(_debug_fcm, OID_AUTO, trlx, CTLFLAG_RW, &trlx, 1, + "Timing relaxed: modifies the settings of timing parameters for slow " + "memories. See RM"); + +static u_int ehtr = 1; /* 30: Extended hold time on read accesses. */ +SYSCTL_UINT(_debug_fcm, OID_AUTO, ehtr, CTLFLAG_RW, &ehtr, 1, + "Extended hold time on read accesses: indicates with TRLX how many " + "cycles are inserted between a read access from the current bank and " + "the next access."); + +static u_int +fsl_nand_get_timing(void) +{ + u_int timing; + + timing = ((csct & 1) << 9) | ((cst & 1) << 8) | ((cht & 1) << 7) | + ((scy & 7) << 4) | ((rst & 1) << 3) | ((trlx & 1) << 2) | + ((ehtr & 1) << 1); + + printf("nfc_fsl: timing = %u\n", timing); + return (timing); +} + +static int +fsl_sysctl_program(SYSCTL_HANDLER_ARGS) +{ + struct fsl_nand_softc *sc; + int error, i; + device_t dev; + uint32_t or_v; + + error = sysctl_wire_old_buffer(req, sizeof(int)); + if (error == 0) { + i = 0; + error = sysctl_handle_int(oidp, &i, 0, req); + } + if (error != 0 || req->newptr == NULL) + return (error); + + for (i = 0; i < 8; i++) { + dev = fcm_devs[i]; + if (dev == NULL) + continue; + sc = device_get_softc(dev); + + /* Reprogram OR(x) */ + or_v = lbc_read_reg(dev, LBC85XX_OR(sc->dinfo->di_bank)); + or_v &= 0xfffffc00; + or_v |= fsl_nand_get_timing(); + lbc_write_reg(dev, LBC85XX_OR(sc->dinfo->di_bank), or_v); + } + return (0); +} + +SYSCTL_PROC(_debug_fcm, OID_AUTO, program, CTLTYPE_INT | CTLFLAG_RW, NULL, 0, + fsl_sysctl_program, "I", "write to program FCM with current values"); + +#endif /* NAND_DEBUG_TIMING */ diff --git a/sys/dev/nand/nfc_fsl.h b/sys/dev/nand/nfc_fsl.h new file mode 100644 index 00000000000..e334c2602e1 --- /dev/null +++ b/sys/dev/nand/nfc_fsl.h @@ -0,0 +1,97 @@ +/*- + * Copyright (C) 2012 Juniper Networks, Inc. + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _NAND_NFC_FSL_H_ +#define _NAND_NFC_FSL_H_ + +/* LBC BR/OR Registers layout definitions */ +#define BR_V 0x00000001 +#define BR_V_SHIFT 0 +#define BR_MSEL 0x000000E0 +#define BR_MSEL_SHIFT 5 +#define BR_DECC_CHECK_MODE 0x00000600 +#define BR_DECC_CHECK_GEN 0x00000400 + +#define OR_FCM_PAGESIZE 0x00000400 + +/* Options definitions */ +#define NAND_OPT_ECC_MODE_HW 1 +#define NAND_OPT_ECC_MODE_SOFT (1 << 1) + +/* FMR - Flash Mode Register */ +#define FMR_CWTO 0xF000 +#define FMR_CWTO_SHIFT 12 +#define FMR_BOOT 0x0800 +#define FMR_ECCM 0x0100 +#define FMR_AL 0x0030 +#define FMR_AL_SHIFT 4 +#define FMR_OP 0x0003 +#define FMR_OP_SHIFT 0 + +#define FIR_OP_NOP 0x0 /* No operation and end of sequence */ +#define FIR_OP_CA 0x1 /* Issue current column address */ +#define FIR_OP_PA 0x2 /* Issue current block+page address */ +#define FIR_OP_UA 0x3 /* Issue user defined address */ +#define FIR_OP_CM(x) (4 + (x)) /* Issue command from FCR[CMD(x)] */ +#define FIR_OP_WB 0x8 /* Write FBCR bytes from FCM buffer */ +#define FIR_OP_WS 0x9 /* Write 1 or 2 bytes from MDR[AS] */ +#define FIR_OP_RB 0xA /* Read FBCR bytes to FCM buffer */ +#define FIR_OP_RS 0xB /* Read 1 or 2 bytes to MDR[AS] */ +#define FIR_OP_CW0 0xC /* Wait then issue FCR[CMD0] */ +#define FIR_OP_CW1 0xD /* Wait then issue FCR[CMD1] */ +#define FIR_OP_RBW 0xE /* Wait then read FBCR bytes */ +#define FIR_OP_RSW 0xF /* Wait then read 1 or 2 bytes */ + +/* LTESR - Transfer Error Status Register */ +#define LTESR_BM 0x80000000 +#define LTESR_FCT 0x40000000 +#define LTESR_PAR 0x20000000 +#define LTESR_WP 0x04000000 +#define LTESR_ATMW 0x00800000 +#define LTESR_ATMR 0x00400000 +#define LTESR_CS 0x00080000 +#define LTESR_CC 0x00000001 + +#define LTESR_NAND_MASK (LTESR_FCT | LTESR_CC | LTESR_CS) + +/* FPAR - Flash Page Address Register */ +#define FPAR_SP_PI 0x00007C00 +#define FPAR_SP_PI_SHIFT 10 +#define FPAR_SP_MS 0x00000200 +#define FPAR_SP_CI 0x000001FF +#define FPAR_SP_CI_SHIFT 0 +#define FPAR_LP_PI 0x0003F000 +#define FPAR_LP_PI_SHIFT 12 +#define FPAR_LP_MS 0x00000800 +#define FPAR_LP_CI 0x000007FF +#define FPAR_LP_CI_SHIFT 0 + +#define FSL_FCM_WAIT_TIMEOUT 10 + +#endif /* _NAND_NFC_FSL_H_ */ diff --git a/sys/dev/nand/nfc_if.m b/sys/dev/nand/nfc_if.m new file mode 100644 index 00000000000..a4e1099220a --- /dev/null +++ b/sys/dev/nand/nfc_if.m @@ -0,0 +1,165 @@ +#- +# Copyright (C) 2009-2012 Semihalf +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ + +# NAND controller interface description +# + +#include +#include + +INTERFACE nfc; + +CODE { + static int nfc_default_method(device_t dev) + { + return (0); + } + + static int nfc_softecc_get(device_t dev, void *buf, int pagesize, + void *ecc, int *needwrite) + { + *needwrite = 1; + return (nand_softecc_get(dev, buf, pagesize, ecc)); + } + + static int nfc_softecc_correct(device_t dev, void *buf, int pagesize, + void *readecc, void *calcecc) + { + return (nand_softecc_correct(dev, buf, pagesize, readecc, + calcecc)); + } +}; + +# Send command to a NAND chip +# +# Return values: +# 0: Success +# +METHOD int send_command { + device_t dev; + uint8_t command; +}; + +# Send address to a NAND chip +# +# Return values: +# 0: Success +# +METHOD int send_address { + device_t dev; + uint8_t address; +}; + +# Read byte +# +# Return values: +# byte read +# +METHOD uint8_t read_byte { + device_t dev; +}; + +# Write byte +# +METHOD void write_byte { + device_t dev; + uint8_t byte; +}; + +# Read word +# +# Return values: +# word read +# +METHOD uint16_t read_word { + device_t dev; +}; + +# Write word +# +METHOD void write_word { + device_t dev; + uint16_t word; +}; + +# Read buf +# +METHOD void read_buf { + device_t dev; + void *buf; + uint32_t len; +}; + +# Write buf +# +METHOD void write_buf { + device_t dev; + void *buf; + uint32_t len; +}; + +# Select CS +# +METHOD int select_cs { + device_t dev; + uint8_t cs; +}; + +# Read ready/busy signal +# +METHOD int read_rnb { + device_t dev; +}; + +# Start command +# +# Return values: +# 0: Success +# +METHOD int start_command { + device_t dev; +} DEFAULT nfc_default_method; + +# Generate ECC or get it from H/W +# +METHOD int get_ecc { + device_t dev; + void *buf; + int pagesize; + void *ecc; + int *needwrite; +} DEFAULT nfc_softecc_get; + +# Correct ECC +# +METHOD int correct_ecc { + device_t dev; + void *buf; + int pagesize; + void *readecc; + void *calcecc; +} DEFAULT nfc_softecc_correct; diff --git a/sys/dev/nand/nfc_mv.c b/sys/dev/nand/nfc_mv.c new file mode 100644 index 00000000000..7f68e824cf9 --- /dev/null +++ b/sys/dev/nand/nfc_mv.c @@ -0,0 +1,236 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Integrated NAND controller driver */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include "nfc_if.h" + +#define MV_NAND_DATA (0x00) +#define MV_NAND_COMMAND (0x01) +#define MV_NAND_ADDRESS (0x02) + +struct mv_nand_softc { + struct nand_softc nand_dev; + bus_space_handle_t sc_handle; + bus_space_tag_t sc_tag; + struct resource *res; + int rid; +}; + +static int mv_nand_attach(device_t); +static int mv_nand_probe(device_t); +static int mv_nand_send_command(device_t, uint8_t); +static int mv_nand_send_address(device_t, uint8_t); +static uint8_t mv_nand_read_byte(device_t); +static void mv_nand_read_buf(device_t, void *, uint32_t); +static void mv_nand_write_buf(device_t, void *, uint32_t); +static int mv_nand_select_cs(device_t, uint8_t); +static int mv_nand_read_rnb(device_t); + +static device_method_t mv_nand_methods[] = { + DEVMETHOD(device_probe, mv_nand_probe), + DEVMETHOD(device_attach, mv_nand_attach), + + DEVMETHOD(nfc_send_command, mv_nand_send_command), + DEVMETHOD(nfc_send_address, mv_nand_send_address), + DEVMETHOD(nfc_read_byte, mv_nand_read_byte), + DEVMETHOD(nfc_read_buf, mv_nand_read_buf), + DEVMETHOD(nfc_write_buf, mv_nand_write_buf), + DEVMETHOD(nfc_select_cs, mv_nand_select_cs), + DEVMETHOD(nfc_read_rnb, mv_nand_read_rnb), + + { 0, 0 }, +}; + +static driver_t mv_nand_driver = { + "nand", + mv_nand_methods, + sizeof(struct mv_nand_softc), +}; + +static devclass_t mv_nand_devclass; +DRIVER_MODULE(mv_nand, localbus, mv_nand_driver, mv_nand_devclass, 0, 0); + +static int +mv_nand_probe(device_t dev) +{ + + if (!ofw_bus_is_compatible(dev, "mrvl,nfc")) + return (ENXIO); + + device_set_desc(dev, "Marvell NAND controller"); + return (BUS_PROBE_DEFAULT); +} + +static int +mv_nand_attach(device_t dev) +{ + struct mv_nand_softc *sc; + int err; + + sc = device_get_softc(dev); + sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->rid, + RF_ACTIVE); + if (sc->res == NULL) { + device_printf(dev, "could not allocate resources!\n"); + return (ENXIO); + } + + sc->sc_tag = rman_get_bustag(sc->res); + sc->sc_handle = rman_get_bushandle(sc->res); + + nand_init(&sc->nand_dev, dev, NAND_ECC_SOFT, 0, 0, NULL, NULL); + + err = nandbus_create(dev); + + return (err); +} + +static int +mv_nand_send_command(device_t dev, uint8_t command) +{ + struct mv_nand_softc *sc; + + nand_debug(NDBG_DRV,"mv_nand: send command %x", command); + + sc = device_get_softc(dev); + bus_space_write_1(sc->sc_tag, sc->sc_handle, MV_NAND_COMMAND, command); + return (0); +} + +static int +mv_nand_send_address(device_t dev, uint8_t addr) +{ + struct mv_nand_softc *sc; + + nand_debug(NDBG_DRV,"mv_nand: send address %x", addr); + + sc = device_get_softc(dev); + bus_space_write_1(sc->sc_tag, sc->sc_handle, MV_NAND_ADDRESS, addr); + return (0); +} + +static uint8_t +mv_nand_read_byte(device_t dev) +{ + struct mv_nand_softc *sc; + uint8_t data; + + sc = device_get_softc(dev); + data = bus_space_read_1(sc->sc_tag, sc->sc_handle, MV_NAND_DATA); + + nand_debug(NDBG_DRV,"mv_nand: read %x", data); + + return (data); +} + +static void +mv_nand_read_buf(device_t dev, void* buf, uint32_t len) +{ + struct mv_nand_softc *sc; + int i; + uint8_t *b = (uint8_t*)buf; + + sc = device_get_softc(dev); + + for (i = 0; i < len; i++) { + b[i] = bus_space_read_1(sc->sc_tag, sc->sc_handle, + MV_NAND_DATA); +#ifdef NAND_DEBUG + if (!(i % 16)) + printf("%s", i == 0 ? "mv_nand:\n" : "\n"); + printf(" %x", b[i]); + if (i == len - 1) + printf("\n"); +#endif + } +} + +static void +mv_nand_write_buf(device_t dev, void* buf, uint32_t len) +{ + struct mv_nand_softc *sc; + int i; + uint8_t *b = (uint8_t*)buf; + + sc = device_get_softc(dev); + + for (i = 0; i < len; i++) { +#ifdef NAND_DEBUG + if (!(i % 16)) + printf("%s", i == 0 ? "mv_nand:\n" : "\n"); + printf(" %x", b[i]); + if (i == len - 1) + printf("\n"); +#endif + bus_space_write_1(sc->sc_tag, sc->sc_handle, MV_NAND_DATA, + b[i]); + } +} + +static int +mv_nand_select_cs(device_t dev, uint8_t cs) +{ + + if (cs > 0) + return (ENODEV); + + return (0); +} + +static int +mv_nand_read_rnb(device_t dev) +{ + + /* no-op */ + return (0); /* ready */ +} diff --git a/sys/dev/netmap/head.diff b/sys/dev/netmap/head.diff deleted file mode 100644 index 51a8e34e74d..00000000000 --- a/sys/dev/netmap/head.diff +++ /dev/null @@ -1,654 +0,0 @@ -Index: conf/NOTES -=================================================================== ---- conf/NOTES (revision 227552) -+++ conf/NOTES (working copy) -@@ -799,6 +799,12 @@ - # option. DHCP requires bpf. - device bpf - -+# The `netmap' device implements memory-mapped access to network -+# devices from userspace, enabling wire-speed packet capture and -+# generation even at 10Gbit/s. Requires support in the device -+# driver. Supported drivers are ixgbe, e1000, re. -+device netmap -+ - # The `disc' device implements a minimal network interface, - # which throws away all packets sent and never receives any. It is - # included for testing and benchmarking purposes. -Index: conf/files -=================================================================== ---- conf/files (revision 227552) -+++ conf/files (working copy) -@@ -1507,6 +1507,7 @@ - dev/my/if_my.c optional my - dev/ncv/ncr53c500.c optional ncv - dev/ncv/ncr53c500_pccard.c optional ncv pccard -+dev/netmap/netmap.c optional netmap - dev/nge/if_nge.c optional nge - dev/nxge/if_nxge.c optional nxge - dev/nxge/xgehal/xgehal-device.c optional nxge -Index: conf/options -=================================================================== ---- conf/options (revision 227552) -+++ conf/options (working copy) -@@ -689,6 +689,7 @@ - - # various 'device presence' options. - DEV_BPF opt_bpf.h -+DEV_NETMAP opt_global.h - DEV_MCA opt_mca.h - DEV_CARP opt_carp.h - DEV_SPLASH opt_splash.h -Index: dev/e1000/if_igb.c -=================================================================== ---- dev/e1000/if_igb.c (revision 227552) -+++ dev/e1000/if_igb.c (working copy) -@@ -369,6 +369,9 @@ - &igb_rx_process_limit, 0, - "Maximum number of received packets to process at a time, -1 means unlimited"); - -+#ifdef DEV_NETMAP -+#include -+#endif /* DEV_NETMAP */ - /********************************************************************* - * Device identification routine - * -@@ -664,6 +667,9 @@ - adapter->led_dev = led_create(igb_led_func, adapter, - device_get_nameunit(dev)); - -+#ifdef DEV_NETMAP -+ igb_netmap_attach(adapter); -+#endif /* DEV_NETMAP */ - INIT_DEBUGOUT("igb_attach: end"); - - return (0); -@@ -742,6 +748,9 @@ - - callout_drain(&adapter->timer); - -+#ifdef DEV_NETMAP -+ netmap_detach(adapter->ifp); -+#endif /* DEV_NETMAP */ - igb_free_pci_resources(adapter); - bus_generic_detach(dev); - if_free(ifp); -@@ -3212,6 +3221,10 @@ - struct adapter *adapter = txr->adapter; - struct igb_tx_buffer *txbuf; - int i; -+#ifdef DEV_NETMAP -+ struct netmap_slot *slot = netmap_reset(NA(adapter->ifp), -+ NR_TX, txr->me, 0); -+#endif - - /* Clear the old descriptor contents */ - IGB_TX_LOCK(txr); -@@ -3231,6 +3244,13 @@ - m_freem(txbuf->m_head); - txbuf->m_head = NULL; - } -+#ifdef DEV_NETMAP -+ if (slot) { -+ netmap_load_map(txr->txtag, txbuf->map, -+ NMB(slot), adapter->rx_mbuf_sz); -+ slot++; -+ } -+#endif /* DEV_NETMAP */ - /* clear the watch index */ - txbuf->next_eop = -1; - } -@@ -3626,6 +3646,19 @@ - - IGB_TX_LOCK_ASSERT(txr); - -+#ifdef DEV_NETMAP -+ if (ifp->if_capenable & IFCAP_NETMAP) { -+ struct netmap_adapter *na = NA(ifp); -+ -+ selwakeuppri(&na->tx_rings[txr->me].si, PI_NET); -+ IGB_TX_UNLOCK(txr); -+ IGB_CORE_LOCK(adapter); -+ selwakeuppri(&na->tx_rings[na->num_queues + 1].si, PI_NET); -+ IGB_CORE_UNLOCK(adapter); -+ IGB_TX_LOCK(txr); // the caller is supposed to own the lock -+ return FALSE; -+ } -+#endif /* DEV_NETMAP */ - if (txr->tx_avail == adapter->num_tx_desc) { - txr->queue_status = IGB_QUEUE_IDLE; - return FALSE; -@@ -3949,6 +3982,10 @@ - bus_dma_segment_t pseg[1], hseg[1]; - struct lro_ctrl *lro = &rxr->lro; - int rsize, nsegs, error = 0; -+#ifdef DEV_NETMAP -+ struct netmap_slot *slot = netmap_reset(NA(rxr->adapter->ifp), -+ NR_RX, rxr->me, 0); -+#endif - - adapter = rxr->adapter; - dev = adapter->dev; -@@ -3974,6 +4011,18 @@ - struct mbuf *mh, *mp; - - rxbuf = &rxr->rx_buffers[j]; -+#ifdef DEV_NETMAP -+ if (slot) { -+ netmap_load_map(rxr->ptag, -+ rxbuf->pmap, NMB(slot), -+ adapter->rx_mbuf_sz); -+ /* Update descriptor */ -+ rxr->rx_base[j].read.pkt_addr = -+ htole64(vtophys(NMB(slot))); -+ slot++; -+ continue; -+ } -+#endif /* DEV_NETMAP */ - if (rxr->hdr_split == FALSE) - goto skip_head; - -@@ -4436,6 +4485,19 @@ - bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, - BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); - -+#ifdef DEV_NETMAP -+ if (ifp->if_capenable & IFCAP_NETMAP) { -+ struct netmap_adapter *na = NA(ifp); -+ -+ selwakeuppri(&na->rx_rings[rxr->me].si, PI_NET); -+ IGB_RX_UNLOCK(rxr); -+ IGB_CORE_LOCK(adapter); -+ selwakeuppri(&na->rx_rings[na->num_queues + 1].si, PI_NET); -+ IGB_CORE_UNLOCK(adapter); -+ return (0); -+ } -+#endif /* DEV_NETMAP */ -+ - /* Main clean loop */ - for (i = rxr->next_to_check; count != 0;) { - struct mbuf *sendmp, *mh, *mp; -Index: dev/e1000/if_lem.c -=================================================================== ---- dev/e1000/if_lem.c (revision 227552) -+++ dev/e1000/if_lem.c (working copy) -@@ -316,6 +316,10 @@ - /* Global used in WOL setup with multiport cards */ - static int global_quad_port_a = 0; - -+#ifdef DEV_NETMAP -+#include -+#endif /* DEV_NETMAP */ -+ - /********************************************************************* - * Device identification routine - * -@@ -646,6 +650,9 @@ - adapter->led_dev = led_create(lem_led_func, adapter, - device_get_nameunit(dev)); - -+#ifdef DEV_NETMAP -+ lem_netmap_attach(adapter); -+#endif /* DEV_NETMAP */ - INIT_DEBUGOUT("lem_attach: end"); - - return (0); -@@ -724,6 +731,9 @@ - callout_drain(&adapter->timer); - callout_drain(&adapter->tx_fifo_timer); - -+#ifdef DEV_NETMAP -+ netmap_detach(ifp); -+#endif /* DEV_NETMAP */ - lem_free_pci_resources(adapter); - bus_generic_detach(dev); - if_free(ifp); -@@ -2637,6 +2647,9 @@ - lem_setup_transmit_structures(struct adapter *adapter) - { - struct em_buffer *tx_buffer; -+#ifdef DEV_NETMAP -+ struct netmap_slot *slot = netmap_reset(NA(adapter->ifp), NR_TX, 0, 0); -+#endif - - /* Clear the old ring contents */ - bzero(adapter->tx_desc_base, -@@ -2650,6 +2663,15 @@ - bus_dmamap_unload(adapter->txtag, tx_buffer->map); - m_freem(tx_buffer->m_head); - tx_buffer->m_head = NULL; -+#ifdef DEV_NETMAP -+ if (slot) { -+ /* reload the map for netmap mode */ -+ netmap_load_map(adapter->txtag, -+ tx_buffer->map, NMB(slot), -+ NA(adapter->ifp)->buff_size); -+ slot++; -+ } -+#endif /* DEV_NETMAP */ - tx_buffer->next_eop = -1; - } - -@@ -2951,6 +2973,12 @@ - - EM_TX_LOCK_ASSERT(adapter); - -+#ifdef DEV_NETMAP -+ if (ifp->if_capenable & IFCAP_NETMAP) { -+ selwakeuppri(&NA(ifp)->tx_rings[0].si, PI_NET); -+ return; -+ } -+#endif /* DEV_NETMAP */ - if (adapter->num_tx_desc_avail == adapter->num_tx_desc) - return; - -@@ -3181,6 +3209,9 @@ - { - struct em_buffer *rx_buffer; - int i, error; -+#ifdef DEV_NETMAP -+ struct netmap_slot *slot = netmap_reset(NA(adapter->ifp), NR_RX, 0, 0); -+#endif - - /* Reset descriptor ring */ - bzero(adapter->rx_desc_base, -@@ -3200,6 +3231,18 @@ - - /* Allocate new ones. */ - for (i = 0; i < adapter->num_rx_desc; i++) { -+#ifdef DEV_NETMAP -+ if (slot) { -+ netmap_load_map(adapter->rxtag, -+ rx_buffer->map, NMB(slot), -+ NA(adapter->ifp)->buff_size); -+ /* Update descriptor */ -+ adapter->rx_desc_base[i].buffer_addr = -+ htole64(vtophys(NMB(slot))); -+ slot++; -+ continue; -+ } -+#endif /* DEV_NETMAP */ - error = lem_get_buf(adapter, i); - if (error) - return (error); -@@ -3407,6 +3450,14 @@ - bus_dmamap_sync(adapter->rxdma.dma_tag, adapter->rxdma.dma_map, - BUS_DMASYNC_POSTREAD); - -+#ifdef DEV_NETMAP -+ if (ifp->if_capenable & IFCAP_NETMAP) { -+ selwakeuppri(&NA(ifp)->rx_rings[0].si, PI_NET); -+ EM_RX_UNLOCK(adapter); -+ return (0); -+ } -+#endif /* DEV_NETMAP */ -+ - if (!((current_desc->status) & E1000_RXD_STAT_DD)) { - if (done != NULL) - *done = rx_sent; -Index: dev/e1000/if_em.c -=================================================================== ---- dev/e1000/if_em.c (revision 227552) -+++ dev/e1000/if_em.c (working copy) -@@ -399,6 +399,10 @@ - /* Global used in WOL setup with multiport cards */ - static int global_quad_port_a = 0; - -+#ifdef DEV_NETMAP -+#include -+#endif /* DEV_NETMAP */ -+ - /********************************************************************* - * Device identification routine - * -@@ -714,6 +718,9 @@ - - adapter->led_dev = led_create(em_led_func, adapter, - device_get_nameunit(dev)); -+#ifdef DEV_NETMAP -+ em_netmap_attach(adapter); -+#endif /* DEV_NETMAP */ - - INIT_DEBUGOUT("em_attach: end"); - -@@ -785,6 +792,10 @@ - ether_ifdetach(adapter->ifp); - callout_drain(&adapter->timer); - -+#ifdef DEV_NETMAP -+ netmap_detach(ifp); -+#endif /* DEV_NETMAP */ -+ - em_free_pci_resources(adapter); - bus_generic_detach(dev); - if_free(ifp); -@@ -3213,6 +3224,10 @@ - struct adapter *adapter = txr->adapter; - struct em_buffer *txbuf; - int i; -+#ifdef DEV_NETMAP -+ struct netmap_slot *slot = netmap_reset(NA(adapter->ifp), -+ NR_TX, txr->me, 0); -+#endif - - /* Clear the old descriptor contents */ - EM_TX_LOCK(txr); -@@ -3232,6 +3247,16 @@ - m_freem(txbuf->m_head); - txbuf->m_head = NULL; - } -+#ifdef DEV_NETMAP -+ if (slot) { -+ /* reload the map for netmap mode */ -+ netmap_load_map(txr->txtag, -+ txbuf->map, NMB(slot), -+ adapter->rx_mbuf_sz); -+ slot++; -+ } -+#endif /* DEV_NETMAP */ -+ - /* clear the watch index */ - txbuf->next_eop = -1; - } -@@ -3682,6 +3707,12 @@ - struct ifnet *ifp = adapter->ifp; - - EM_TX_LOCK_ASSERT(txr); -+#ifdef DEV_NETMAP -+ if (ifp->if_capenable & IFCAP_NETMAP) { -+ selwakeuppri(&NA(ifp)->tx_rings[txr->me].si, PI_NET); -+ return (FALSE); -+ } -+#endif /* DEV_NETMAP */ - - /* No work, make sure watchdog is off */ - if (txr->tx_avail == adapter->num_tx_desc) { -@@ -3978,6 +4009,33 @@ - if (++j == adapter->num_rx_desc) - j = 0; - } -+#ifdef DEV_NETMAP -+ { -+ /* slot is NULL if we are not in netmap mode */ -+ struct netmap_slot *slot = netmap_reset(NA(adapter->ifp), -+ NR_RX, rxr->me, rxr->next_to_check); -+ /* -+ * we need to restore all buffer addresses in the ring as they might -+ * be in the wrong state if we are exiting from netmap mode. -+ */ -+ for (j = 0; j != adapter->num_rx_desc; ++j) { -+ void *addr; -+ rxbuf = &rxr->rx_buffers[j]; -+ if (rxbuf->m_head == NULL && !slot) -+ continue; -+ addr = slot ? NMB(slot) : rxbuf->m_head->m_data; -+ // XXX load or reload ? -+ netmap_load_map(rxr->rxtag, rxbuf->map, addr, adapter->rx_mbuf_sz); -+ /* Update descriptor */ -+ rxr->rx_base[j].buffer_addr = htole64(vtophys(addr)); -+ bus_dmamap_sync(rxr->rxtag, rxbuf->map, BUS_DMASYNC_PREREAD); -+ if (slot) -+ slot++; -+ } -+ /* Setup our descriptor indices */ -+ NA(adapter->ifp)->rx_rings[rxr->me].nr_hwcur = rxr->next_to_check; -+ } -+#endif /* DEV_NETMAP */ - - fail: - rxr->next_to_refresh = i; -@@ -4247,6 +4305,14 @@ - - EM_RX_LOCK(rxr); - -+#ifdef DEV_NETMAP -+ if (ifp->if_capenable & IFCAP_NETMAP) { -+ selwakeuppri(&NA(ifp)->rx_rings[rxr->me].si, PI_NET); -+ EM_RX_UNLOCK(rxr); -+ return (0); -+ } -+#endif /* DEV_NETMAP */ -+ - for (i = rxr->next_to_check, processed = 0; count != 0;) { - - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) -Index: dev/re/if_re.c -=================================================================== ---- dev/re/if_re.c (revision 227552) -+++ dev/re/if_re.c (working copy) -@@ -291,6 +291,10 @@ - static void re_setwol (struct rl_softc *); - static void re_clrwol (struct rl_softc *); - -+#ifdef DEV_NETMAP -+#include -+#endif /* !DEV_NETMAP */ -+ - #ifdef RE_DIAG - static int re_diag (struct rl_softc *); - #endif -@@ -1583,6 +1587,9 @@ - */ - ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); - -+#ifdef DEV_NETMAP -+ re_netmap_attach(sc); -+#endif /* DEV_NETMAP */ - #ifdef RE_DIAG - /* - * Perform hardware diagnostic on the original RTL8169. -@@ -1778,6 +1785,9 @@ - bus_dma_tag_destroy(sc->rl_ldata.rl_stag); - } - -+#ifdef DEV_NETMAP -+ netmap_detach(ifp); -+#endif /* DEV_NETMAP */ - if (sc->rl_parent_tag) - bus_dma_tag_destroy(sc->rl_parent_tag); - -@@ -1952,6 +1962,9 @@ - sc->rl_ldata.rl_tx_desc_cnt * sizeof(struct rl_desc)); - for (i = 0; i < sc->rl_ldata.rl_tx_desc_cnt; i++) - sc->rl_ldata.rl_tx_desc[i].tx_m = NULL; -+#ifdef DEV_NETMAP -+ re_netmap_tx_init(sc); -+#endif /* DEV_NETMAP */ - /* Set EOR. */ - desc = &sc->rl_ldata.rl_tx_list[sc->rl_ldata.rl_tx_desc_cnt - 1]; - desc->rl_cmdstat |= htole32(RL_TDESC_CMD_EOR); -@@ -1979,6 +1992,9 @@ - if ((error = re_newbuf(sc, i)) != 0) - return (error); - } -+#ifdef DEV_NETMAP -+ re_netmap_rx_init(sc); -+#endif /* DEV_NETMAP */ - - /* Flush the RX descriptors */ - -@@ -2035,6 +2051,12 @@ - RL_LOCK_ASSERT(sc); - - ifp = sc->rl_ifp; -+#ifdef DEV_NETMAP -+ if (ifp->if_capenable & IFCAP_NETMAP) { -+ selwakeuppri(&NA(ifp)->rx_rings->si, PI_NET); -+ return 0; -+ } -+#endif /* DEV_NETMAP */ - if (ifp->if_mtu > RL_MTU && (sc->rl_flags & RL_FLAG_JUMBOV2) != 0) - jumbo = 1; - else -@@ -2276,6 +2298,12 @@ - return; - - ifp = sc->rl_ifp; -+#ifdef DEV_NETMAP -+ if (ifp->if_capenable & IFCAP_NETMAP) { -+ selwakeuppri(&NA(ifp)->tx_rings[0].si, PI_NET); -+ return; -+ } -+#endif /* DEV_NETMAP */ - /* Invalidate the TX descriptor list */ - bus_dmamap_sync(sc->rl_ldata.rl_tx_list_tag, - sc->rl_ldata.rl_tx_list_map, -@@ -2794,6 +2822,20 @@ - - sc = ifp->if_softc; - -+#ifdef DEV_NETMAP -+ if (ifp->if_capenable & IFCAP_NETMAP) { -+ struct netmap_kring *kring = &NA(ifp)->tx_rings[0]; -+ if (sc->rl_ldata.rl_tx_prodidx != kring->nr_hwcur) { -+ /* kick the tx unit */ -+ CSR_WRITE_1(sc, sc->rl_txstart, RL_TXSTART_START); -+#ifdef RE_TX_MODERATION -+ CSR_WRITE_4(sc, RL_TIMERCNT, 1); -+#endif -+ sc->rl_watchdog_timer = 5; -+ } -+ return; -+ } -+#endif /* DEV_NETMAP */ - if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != - IFF_DRV_RUNNING || (sc->rl_flags & RL_FLAG_LINK) == 0) - return; -Index: dev/ixgbe/ixgbe.c -=================================================================== ---- dev/ixgbe/ixgbe.c (revision 227552) -+++ dev/ixgbe/ixgbe.c (working copy) -@@ -313,6 +313,10 @@ - static int fdir_pballoc = 1; - #endif - -+#ifdef DEV_NETMAP -+#include -+#endif /* DEV_NETMAP */ -+ - /********************************************************************* - * Device identification routine - * -@@ -578,6 +582,9 @@ - - ixgbe_add_hw_stats(adapter); - -+#ifdef DEV_NETMAP -+ ixgbe_netmap_attach(adapter); -+#endif /* DEV_NETMAP */ - INIT_DEBUGOUT("ixgbe_attach: end"); - return (0); - err_late: -@@ -652,6 +659,9 @@ - - ether_ifdetach(adapter->ifp); - callout_drain(&adapter->timer); -+#ifdef DEV_NETMAP -+ netmap_detach(adapter->ifp); -+#endif /* DEV_NETMAP */ - ixgbe_free_pci_resources(adapter); - bus_generic_detach(dev); - if_free(adapter->ifp); -@@ -1719,6 +1729,7 @@ - if (++i == adapter->num_tx_desc) - i = 0; - -+ // XXX should we sync each buffer ? - txbuf->m_head = NULL; - txbuf->eop_index = -1; - } -@@ -2813,6 +2824,10 @@ - struct adapter *adapter = txr->adapter; - struct ixgbe_tx_buf *txbuf; - int i; -+#ifdef DEV_NETMAP -+ struct netmap_slot *slot = netmap_reset(NA(adapter->ifp), -+ NR_TX, txr->me, 0); -+#endif - - /* Clear the old ring contents */ - IXGBE_TX_LOCK(txr); -@@ -2832,6 +2847,13 @@ - m_freem(txbuf->m_head); - txbuf->m_head = NULL; - } -+#ifdef DEV_NETMAP -+ if (slot) { -+ netmap_load_map(txr->txtag, txbuf->map, -+ NMB(slot), adapter->rx_mbuf_sz); -+ slot++; -+ } -+#endif /* DEV_NETMAP */ - /* Clear the EOP index */ - txbuf->eop_index = -1; - } -@@ -3310,6 +3332,20 @@ - - mtx_assert(&txr->tx_mtx, MA_OWNED); - -+#ifdef DEV_NETMAP -+ if (ifp->if_capenable & IFCAP_NETMAP) { -+ struct netmap_adapter *na = NA(ifp); -+ -+ selwakeuppri(&na->tx_rings[txr->me].si, PI_NET); -+ IXGBE_TX_UNLOCK(txr); -+ IXGBE_CORE_LOCK(adapter); -+ selwakeuppri(&na->tx_rings[na->num_queues + 1].si, PI_NET); -+ IXGBE_CORE_UNLOCK(adapter); -+ IXGBE_TX_LOCK(txr); // the caller is supposed to own the lock -+ return (FALSE); -+ } -+#endif /* DEV_NETMAP */ -+ - if (txr->tx_avail == adapter->num_tx_desc) { - txr->queue_status = IXGBE_QUEUE_IDLE; - return FALSE; -@@ -3698,6 +3734,10 @@ - bus_dma_segment_t pseg[1], hseg[1]; - struct lro_ctrl *lro = &rxr->lro; - int rsize, nsegs, error = 0; -+#ifdef DEV_NETMAP -+ struct netmap_slot *slot = netmap_reset(NA(rxr->adapter->ifp), -+ NR_RX, rxr->me, 0); -+#endif /* DEV_NETMAP */ - - adapter = rxr->adapter; - ifp = adapter->ifp; -@@ -3721,6 +3761,18 @@ - struct mbuf *mh, *mp; - - rxbuf = &rxr->rx_buffers[j]; -+#ifdef DEV_NETMAP -+ if (slot) { -+ netmap_load_map(rxr->ptag, -+ rxbuf->pmap, NMB(slot), -+ adapter->rx_mbuf_sz); -+ /* Update descriptor */ -+ rxr->rx_base[j].read.pkt_addr = -+ htole64(vtophys(NMB(slot))); -+ slot++; -+ continue; -+ } -+#endif /* DEV_NETMAP */ - /* - ** Don't allocate mbufs if not - ** doing header split, its wasteful -@@ -4148,6 +4200,18 @@ - - IXGBE_RX_LOCK(rxr); - -+#ifdef DEV_NETMAP -+ if (ifp->if_capenable & IFCAP_NETMAP) { -+ struct netmap_adapter *na = NA(ifp); -+ -+ selwakeuppri(&na->rx_rings[rxr->me].si, PI_NET); -+ IXGBE_RX_UNLOCK(rxr); -+ IXGBE_CORE_LOCK(adapter); -+ selwakeuppri(&na->rx_rings[na->num_queues + 1].si, PI_NET); -+ IXGBE_CORE_UNLOCK(adapter); -+ return (0); -+ } -+#endif /* DEV_NETMAP */ - for (i = rxr->next_to_check; count != 0;) { - struct mbuf *sendmp, *mh, *mp; - u32 rsc, ptype; diff --git a/sys/dev/netmap/netmap.c b/sys/dev/netmap/netmap.c index 0e8dcf2787e..1cd0a92d0a3 100644 --- a/sys/dev/netmap/netmap.c +++ b/sys/dev/netmap/netmap.c @@ -1067,7 +1067,8 @@ netmap_start(struct ifnet *ifp, struct mbuf *m) kring->nr_hwcur + kring->nr_hwavail, len); na->nm_lock(ifp, NETMAP_CORE_LOCK, 0); if (kring->nr_hwavail >= lim) { - D("stack ring %s full\n", ifp->if_xname); + if (netmap_verbose) + D("stack ring %s full\n", ifp->if_xname); goto done; /* no space */ } if (len > NETMAP_BUF_SIZE) { diff --git a/sys/dev/pccard/pccard.c b/sys/dev/pccard/pccard.c index 43bc4b3d9f3..0c49d2f38a7 100644 --- a/sys/dev/pccard/pccard.c +++ b/sys/dev/pccard/pccard.c @@ -473,6 +473,8 @@ pccard_function_init(struct pccard_function *pf, int entry) struct resource_list *rl = &devi->resources; struct resource_list_entry *rle; struct resource *r = 0; + struct pccard_ce_iospace *ios; + struct pccard_ce_memspace *mems; device_t bus; u_long start, end, len; int i, rid, spaces; @@ -501,44 +503,50 @@ pccard_function_init(struct pccard_function *pf, int entry) continue; spaces = 0; for (i = 0; i < cfe->num_iospace; i++) { - start = cfe->iospace[i].start; + ios = cfe->iospace + i; + start = ios->start; if (start) - end = start + cfe->iospace[i].length - 1; + end = start + ios->length - 1; else end = ~0UL; DEVPRINTF((bus, "I/O rid %d start %#lx end %#lx\n", i, start, end)); rid = i; - len = cfe->iospace[i].length; + len = ios->length; r = bus_alloc_resource(bus, SYS_RES_IOPORT, &rid, start, end, len, rman_make_alignment_flags(len)); - if (r == NULL) + if (r == NULL) { + DEVPRINTF((bus, "I/O rid %d failed\n", i)); goto not_this_one; + } rle = resource_list_add(rl, SYS_RES_IOPORT, - rid, rman_get_start(r), rman_get_end(r), - cfe->iospace[i].length); + rid, rman_get_start(r), rman_get_end(r), len); if (rle == NULL) panic("Cannot add resource rid %d IOPORT", rid); rle->res = r; spaces++; } for (i = 0; i < cfe->num_memspace; i++) { - start = cfe->memspace[i].hostaddr; + mems = cfe->memspace + i; + start = mems->cardaddr + mems->hostaddr; if (start) - end = start + cfe->memspace[i].length - 1; + end = start + mems->length - 1; else end = ~0UL; - DEVPRINTF((bus, "Memory rid %d start %#lx end %#lx\n", - i, start, end)); + DEVPRINTF((bus, "Memory rid %d start %#lx end %#lx\ncardaddr %#lx hostaddr %#lx length %#lx\n", + i, start, end, mems->cardaddr, mems->hostaddr, + mems->length)); rid = i; - len = cfe->memspace[i].length; + len = mems->length; r = bus_alloc_resource(bus, SYS_RES_MEMORY, &rid, start, end, len, rman_make_alignment_flags(len)); - if (r == NULL) - goto not_this_one; + if (r == NULL) { + DEVPRINTF((bus, "Memory rid %d failed\n", i)); +// goto not_this_one; + continue; + } rle = resource_list_add(rl, SYS_RES_MEMORY, - rid, rman_get_start(r), rman_get_end(r), - cfe->memspace[i].length); + rid, rman_get_start(r), rman_get_end(r), len); if (rle == NULL) panic("Cannot add resource rid %d MEM", rid); rle->res = r; @@ -552,8 +560,10 @@ pccard_function_init(struct pccard_function *pf, int entry) rid = 0; r = bus_alloc_resource_any(bus, SYS_RES_IRQ, &rid, RF_SHAREABLE); - if (r == NULL) + if (r == NULL) { + DEVPRINTF((bus, "IRQ rid %d failed\n", rid)); goto not_this_one; + } rle = resource_list_add(rl, SYS_RES_IRQ, rid, rman_get_start(r), rman_get_end(r), 1); if (rle == NULL) diff --git a/sys/dev/pccard/pccardvarp.h b/sys/dev/pccard/pccardvarp.h index 7996efb8120..54d7f7501ae 100644 --- a/sys/dev/pccard/pccardvarp.h +++ b/sys/dev/pccard/pccardvarp.h @@ -47,29 +47,32 @@ #define PCCARD_CFE_READONLY 0x0400 #define PCCARD_CFE_AUDIO 0x0800 +struct pccard_ce_iospace { + u_long length; + u_long start; +}; + +struct pccard_ce_memspace { + u_long length; + u_long cardaddr; + u_long hostaddr; +}; + struct pccard_config_entry { int number; uint32_t flags; int iftype; int num_iospace; - /* * The card will only decode this mask in any case, so we can * do dynamic allocation with this in mind, in case the suggestions * below are no good. */ u_long iomask; - struct { - u_long length; - u_long start; - } iospace[4]; /* XXX this could be as high as 16 */ + struct pccard_ce_iospace iospace[4]; /* XXX up to 16 */ uint16_t irqmask; int num_memspace; - struct { - u_long length; - u_long cardaddr; - u_long hostaddr; - } memspace[2]; /* XXX this could be as high as 8 */ + struct pccard_ce_memspace memspace[2]; /* XXX up to 8 */ int maxtwins; STAILQ_ENTRY(pccard_config_entry) cfe_list; }; diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c index efb0b580c21..650342101cd 100644 --- a/sys/dev/pci/pci.c +++ b/sys/dev/pci/pci.c @@ -4260,7 +4260,7 @@ pci_activate_resource(device_t dev, device_t child, int type, int rid, if (device_get_parent(child) == dev) { /* Device ROMs need their decoding explicitly enabled. */ dinfo = device_get_ivars(child); - if (PCIR_IS_BIOS(&dinfo->cfg, rid)) + if (type == SYS_RES_MEMORY && PCIR_IS_BIOS(&dinfo->cfg, rid)) pci_write_bar(child, pci_find_bar(child, rid), rman_get_start(r) | PCIM_BIOS_ENABLE); switch (type) { @@ -4287,7 +4287,7 @@ pci_deactivate_resource(device_t dev, device_t child, int type, /* Disable decoding for device ROMs. */ if (device_get_parent(child) == dev) { dinfo = device_get_ivars(child); - if (PCIR_IS_BIOS(&dinfo->cfg, rid)) + if (type == SYS_RES_MEMORY && PCIR_IS_BIOS(&dinfo->cfg, rid)) pci_write_bar(child, pci_find_bar(child, rid), rman_get_start(r)); } diff --git a/sys/dev/pci/pci_pci.c b/sys/dev/pci/pci_pci.c index d624104f25c..6d058c41ac1 100644 --- a/sys/dev/pci/pci_pci.c +++ b/sys/dev/pci/pci_pci.c @@ -815,7 +815,7 @@ static int pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type, u_long start, u_long end, u_long count, u_int flags) { - u_long align, start_free, end_free, front, back; + u_long align, start_free, end_free, front, back, wmask; int error, rid; /* @@ -828,6 +828,7 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type, end = w->rman.rm_end; if (start + count - 1 > end || start + count < start) return (EINVAL); + wmask = (1ul << w->step) - 1; /* * If there is no resource at all, just try to allocate enough @@ -838,8 +839,8 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type, flags &= ~RF_ALIGNMENT_MASK; flags |= RF_ALIGNMENT_LOG2(w->step); } - start &= ~((1ul << w->step) - 1); - end |= ((1ul << w->step) - 1); + start &= ~wmask; + end |= wmask; count = roundup2(count, 1ul << w->step); rid = w->reg; w->res = bus_alloc_resource(sc->dev, type, &rid, start, end, @@ -893,9 +894,9 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type, if (start < rman_get_start(w->res)) { if (rman_first_free_region(&w->rman, &start_free, &end_free) != 0 || start_free != rman_get_start(w->res)) - end_free = rman_get_start(w->res) - 1; + end_free = rman_get_start(w->res); if (end_free > end) - end_free = end; + end_free = end + 1; /* Move end_free down until it is properly aligned. */ end_free &= ~(align - 1); @@ -913,7 +914,7 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type, if (bootverbose) printf("\tfront candidate range: %#lx-%#lx\n", front, end_free); - front &= (1ul << w->step) - 1; + front &= ~wmask; front = rman_get_start(w->res) - front; } else front = 0; @@ -941,7 +942,7 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type, if (bootverbose) printf("\tback candidate range: %#lx-%#lx\n", start_free, back); - back = roundup2(back + 1, 1ul << w->step) - 1; + back |= wmask; back -= rman_get_end(w->res); } else back = 0; @@ -1000,10 +1001,8 @@ updatewin: /* Save the new window. */ w->base = rman_get_start(w->res); w->limit = rman_get_end(w->res); - KASSERT((w->base & ((1ul << w->step) - 1)) == 0, - ("start address is not aligned")); - KASSERT((w->limit & ((1ul << w->step) - 1)) == (1ul << w->step) - 1, - ("end address is not aligned")); + KASSERT((w->base & wmask) == 0, ("start address is not aligned")); + KASSERT((w->limit & wmask) == wmask, ("end address is not aligned")); pcib_write_windows(sc, w->mask); return (0); } @@ -1039,7 +1038,7 @@ pcib_alloc_resource(device_t dev, device_t child, int type, int *rid, case SYS_RES_IOPORT: r = pcib_suballoc_resource(sc, &sc->io, child, type, rid, start, end, count, flags); - if (r != NULL) + if (r != NULL || (sc->flags & PCIB_SUBTRACTIVE) != 0) break; if (pcib_grow_window(sc, &sc->io, type, start, end, count, flags) == 0) @@ -1063,7 +1062,7 @@ pcib_alloc_resource(device_t dev, device_t child, int type, int *rid, } r = pcib_suballoc_resource(sc, &sc->mem, child, type, rid, start, end, count, flags); - if (r != NULL) + if (r != NULL || (sc->flags & PCIB_SUBTRACTIVE) != 0) break; if (flags & RF_PREFETCHABLE) { if (pcib_grow_window(sc, &sc->pmem, type, start, end, diff --git a/sys/dev/pci/vga_pci.c b/sys/dev/pci/vga_pci.c index fc968482859..6d796c8cbe6 100644 --- a/sys/dev/pci/vga_pci.c +++ b/sys/dev/pci/vga_pci.c @@ -105,6 +105,7 @@ vga_pci_attach(device_t dev) /* Always create a drm child for now to make it easier on drm. */ device_add_child(dev, "drm", -1); + device_add_child(dev, "drmn", -1); bus_generic_attach(dev); return (0); } diff --git a/sys/dev/powermac_nvram/powermac_nvram.c b/sys/dev/powermac_nvram/powermac_nvram.c index 0c7949f78fa..56dc929c58f 100644 --- a/sys/dev/powermac_nvram/powermac_nvram.c +++ b/sys/dev/powermac_nvram/powermac_nvram.c @@ -36,6 +36,7 @@ #include #include +#include #include #include @@ -118,7 +119,7 @@ powermac_nvram_probe(device_t dev) if (strcmp(type, "nvram") != 0) return ENXIO; if (strcmp(compatible, "amd-0137") != 0 && - strcmp(compatible, "nvram,flash") != 0) + !ofw_bus_is_compatible(dev, "nvram,flash")) return ENXIO; device_set_desc(dev, "Apple NVRAM"); diff --git a/sys/dev/puc/puc_cfg.h b/sys/dev/puc/puc_cfg.h index 4c2c65ee3bb..f4969f641d1 100644 --- a/sys/dev/puc/puc_cfg.h +++ b/sys/dev/puc/puc_cfg.h @@ -79,7 +79,7 @@ struct puc_cfg { int8_t ports; int8_t rid; /* Rid of first port */ int8_t d_rid; /* Delta rid of next ports */ - int8_t d_ofs; /* Delta offset of next ports */ + int16_t d_ofs; /* Delta offset of next ports */ puc_config_f *config_function; }; diff --git a/sys/dev/puc/pucdata.c b/sys/dev/puc/pucdata.c index 94d1c2c8335..4040a2f25be 100644 --- a/sys/dev/puc/pucdata.c +++ b/sys/dev/puc/pucdata.c @@ -507,6 +507,18 @@ const struct puc_cfg puc_pci_devices[] = { .config_function = puc_config_quatech }, + { 0x1393, 0x1024, 0xffff, 0, + "Moxa Technologies, Smartio CP-102E/PCIe", + DEFAULT_RCLK * 8, + PUC_PORT_2S, 0x14, 0, 0x200 + }, + + { 0x1393, 0x1025, 0xffff, 0, + "Moxa Technologies, Smartio CP-102EL/PCIe", + DEFAULT_RCLK * 8, + PUC_PORT_2S, 0x14, 0, 0x200, + }, + { 0x1393, 0x1040, 0xffff, 0, "Moxa Technologies, Smartio C104H/PCI", DEFAULT_RCLK * 8, @@ -550,6 +562,19 @@ const struct puc_cfg puc_pci_devices[] = { PUC_PORT_4S, 0x18, 0, 8, }, + { 0x1393, 0x1144, 0xffff, 0, + "Moxa Technologies, Smartio CP-114EL/PCIe", + DEFAULT_RCLK * 8, + PUC_PORT_4S, 0x14, 0, -1, + .config_function = puc_config_moxa + }, + + { 0x1393, 0x1182, 0xffff, 0, + "Moxa Technologies, Smartio CP-118EL-A/PCIe", + DEFAULT_RCLK * 8, + PUC_PORT_8S, 0x14, 0, 0x200, + }, + { 0x1393, 0x1680, 0xffff, 0, "Moxa Technologies, C168H/PCI", DEFAULT_RCLK * 8, @@ -568,6 +593,12 @@ const struct puc_cfg puc_pci_devices[] = { PUC_PORT_8S, 0x18, 0, 8, }, + { 0x1393, 0x1683, 0xffff, 0, + "Moxa Technologies, Smartio CP-168EL-A/PCIe", + DEFAULT_RCLK * 8, + PUC_PORT_8S, 0x14, 0, 0x200, + }, + { 0x13a8, 0x0152, 0xffff, 0, "Exar XR17C/D152", DEFAULT_RCLK * 8, @@ -901,6 +932,18 @@ const struct puc_cfg puc_pci_devices[] = { .config_function = puc_config_syba }, + { 0x1fd4, 0x1999, 0xffff, 0, + "Sunix SER5437A", + DEFAULT_RCLK * 8, + PUC_PORT_2S, 0x10, 0, 8, + }, + + { 0x5372, 0x6873, 0xffff, 0, + "Sun 1040 PCI Quad Serial", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 4, 0, + }, + { 0x6666, 0x0001, 0xffff, 0, "Decision Computer Inc, PCCOM 4-port serial", DEFAULT_RCLK, @@ -1115,9 +1158,7 @@ static int puc_config_moxa(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port, intptr_t *res) { - const struct puc_cfg *cfg = sc->sc_cfg; - - if (cmd == PUC_CFG_GET_OFS && cfg->device == 0x1045) { + if (cmd == PUC_CFG_GET_OFS) { *res = ((port == 3) ? 7 : port) * 0x200; return 0; } diff --git a/sys/dev/ral/if_ral_pci.c b/sys/dev/ral/if_ral_pci.c index 68b662261f8..cd892b50d93 100644 --- a/sys/dev/ral/if_ral_pci.c +++ b/sys/dev/ral/if_ral_pci.c @@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include MODULE_DEPEND(ral, pci, 1, 1, 1); MODULE_DEPEND(ral, firmware, 1, 1, 1); @@ -70,11 +71,37 @@ struct ral_pci_ident { }; static const struct ral_pci_ident ral_pci_ids[] = { + { 0x1432, 0x7708, "Edimax RT2860" }, + { 0x1432, 0x7711, "Edimax RT3591" }, + { 0x1432, 0x7722, "Edimax RT3591" }, + { 0x1432, 0x7727, "Edimax RT2860" }, + { 0x1432, 0x7728, "Edimax RT2860" }, + { 0x1432, 0x7738, "Edimax RT2860" }, + { 0x1432, 0x7748, "Edimax RT2860" }, + { 0x1432, 0x7758, "Edimax RT2860" }, + { 0x1432, 0x7768, "Edimax RT2860" }, + { 0x1462, 0x891a, "MSI RT3090" }, { 0x1814, 0x0201, "Ralink Technology RT2560" }, { 0x1814, 0x0301, "Ralink Technology RT2561S" }, { 0x1814, 0x0302, "Ralink Technology RT2561" }, { 0x1814, 0x0401, "Ralink Technology RT2661" }, - + { 0x1814, 0x0601, "Ralink Technology RT2860" }, + { 0x1814, 0x0681, "Ralink Technology RT2890" }, + { 0x1814, 0x0701, "Ralink Technology RT2760" }, + { 0x1814, 0x0781, "Ralink Technology RT2790" }, + { 0x1814, 0x3060, "Ralink Technology RT3060" }, + { 0x1814, 0x3062, "Ralink Technology RT3062" }, + { 0x1814, 0x3090, "Ralink Technology RT3090" }, + { 0x1814, 0x3091, "Ralink Technology RT3091" }, + { 0x1814, 0x3092, "Ralink Technology RT3092" }, + { 0x1814, 0x3390, "Ralink Technology RT3390" }, + { 0x1814, 0x3562, "Ralink Technology RT3562" }, + { 0x1814, 0x3592, "Ralink Technology RT3592" }, + { 0x1814, 0x3593, "Ralink Technology RT3593" }, + { 0x1814, 0x5390, "Ralink Technology RT5390" }, + { 0x1814, 0x539a, "Ralink Technology RT5390" }, + { 0x1814, 0x539f, "Ralink Technology RT5390" }, + { 0x1a3b, 0x1059, "AWT RT2890" }, { 0, 0, NULL } }; @@ -101,12 +128,20 @@ static struct ral_opns { rt2661_suspend, rt2661_resume, rt2661_intr +}, ral_rt2860_opns = { + rt2860_attach, + rt2860_detach, + rt2860_shutdown, + rt2860_suspend, + rt2860_resume, + rt2860_intr }; struct ral_pci_softc { union { struct rt2560_softc sc_rt2560; struct rt2661_softc sc_rt2661; + struct rt2860_softc sc_rt2860; } u; struct ral_opns *sc_opns; @@ -180,8 +215,19 @@ ral_pci_attach(device_t dev) /* enable bus-mastering */ pci_enable_busmaster(dev); - psc->sc_opns = (pci_get_device(dev) == 0x0201) ? &ral_rt2560_opns : - &ral_rt2661_opns; + switch (pci_get_device(dev)) { + case 0x0201: + psc->sc_opns = &ral_rt2560_opns; + break; + case 0x0301: + case 0x0302: + case 0x0401: + psc->sc_opns = &ral_rt2661_opns; + break; + default: + psc->sc_opns = &ral_rt2860_opns; + break; + } psc->mem_rid = RAL_PCI_BAR0; psc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &psc->mem_rid, diff --git a/sys/dev/ral/rt2860.c b/sys/dev/ral/rt2860.c new file mode 100644 index 00000000000..4a5aa259c0e --- /dev/null +++ b/sys/dev/ral/rt2860.c @@ -0,0 +1,4103 @@ +/*- + * Copyright (c) 2007-2010 Damien Bergamini + * Copyright (c) 2012 Bernhard Schmidt + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $OpenBSD: rt2860.c,v 1.65 2010/10/23 14:24:54 damien Exp $ + */ + +#include +__FBSDID("$FreeBSD$"); + +/*- + * Ralink Technology RT2860/RT3090/RT3390/RT3562 chipset driver + * http://www.ralinktech.com/ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#define RAL_DEBUG +#ifdef RAL_DEBUG +#define DPRINTF(x) do { if (sc->sc_debug > 0) printf x; } while (0) +#define DPRINTFN(n, x) do { if (sc->sc_debug >= (n)) printf x; } while (0) +#else +#define DPRINTF(x) +#define DPRINTFN(n, x) +#endif + +static struct ieee80211vap *rt2860_vap_create(struct ieee80211com *, + const char [IFNAMSIZ], int, enum ieee80211_opmode, + int, const uint8_t [IEEE80211_ADDR_LEN], + const uint8_t [IEEE80211_ADDR_LEN]); +static void rt2860_vap_delete(struct ieee80211vap *); +static void rt2860_dma_map_addr(void *, bus_dma_segment_t *, int, int); +static int rt2860_alloc_tx_ring(struct rt2860_softc *, + struct rt2860_tx_ring *); +static void rt2860_reset_tx_ring(struct rt2860_softc *, + struct rt2860_tx_ring *); +static void rt2860_free_tx_ring(struct rt2860_softc *, + struct rt2860_tx_ring *); +static int rt2860_alloc_tx_pool(struct rt2860_softc *); +static void rt2860_free_tx_pool(struct rt2860_softc *); +static int rt2860_alloc_rx_ring(struct rt2860_softc *, + struct rt2860_rx_ring *); +static void rt2860_reset_rx_ring(struct rt2860_softc *, + struct rt2860_rx_ring *); +static void rt2860_free_rx_ring(struct rt2860_softc *, + struct rt2860_rx_ring *); +static void rt2860_updatestats(struct rt2860_softc *); +static void rt2860_newassoc(struct ieee80211_node *, int); +static void rt2860_node_free(struct ieee80211_node *); +#ifdef IEEE80211_HT +static int rt2860_ampdu_rx_start(struct ieee80211com *, + struct ieee80211_node *, uint8_t); +static void rt2860_ampdu_rx_stop(struct ieee80211com *, + struct ieee80211_node *, uint8_t); +#endif +static int rt2860_newstate(struct ieee80211vap *, enum ieee80211_state, + int); +static uint16_t rt3090_efuse_read_2(struct rt2860_softc *, uint16_t); +static uint16_t rt2860_eeprom_read_2(struct rt2860_softc *, uint16_t); +static void rt2860_intr_coherent(struct rt2860_softc *); +static void rt2860_drain_stats_fifo(struct rt2860_softc *); +static void rt2860_tx_intr(struct rt2860_softc *, int); +static void rt2860_rx_intr(struct rt2860_softc *); +static void rt2860_tbtt_intr(struct rt2860_softc *); +static void rt2860_gp_intr(struct rt2860_softc *); +static int rt2860_tx(struct rt2860_softc *, struct mbuf *, + struct ieee80211_node *); +static int rt2860_raw_xmit(struct ieee80211_node *, struct mbuf *, + const struct ieee80211_bpf_params *); +static int rt2860_tx_raw(struct rt2860_softc *, struct mbuf *, + struct ieee80211_node *, + const struct ieee80211_bpf_params *params); +static void rt2860_start(struct ifnet *); +static void rt2860_start_locked(struct ifnet *); +static void rt2860_watchdog(void *); +static int rt2860_ioctl(struct ifnet *, u_long, caddr_t); +static void rt2860_mcu_bbp_write(struct rt2860_softc *, uint8_t, uint8_t); +static uint8_t rt2860_mcu_bbp_read(struct rt2860_softc *, uint8_t); +static void rt2860_rf_write(struct rt2860_softc *, uint8_t, uint32_t); +static uint8_t rt3090_rf_read(struct rt2860_softc *, uint8_t); +static void rt3090_rf_write(struct rt2860_softc *, uint8_t, uint8_t); +static int rt2860_mcu_cmd(struct rt2860_softc *, uint8_t, uint16_t, int); +static void rt2860_enable_mrr(struct rt2860_softc *); +static void rt2860_set_txpreamble(struct rt2860_softc *); +static void rt2860_set_basicrates(struct rt2860_softc *, + const struct ieee80211_rateset *); +static void rt2860_scan_start(struct ieee80211com *); +static void rt2860_scan_end(struct ieee80211com *); +static void rt2860_set_channel(struct ieee80211com *); +static void rt2860_select_chan_group(struct rt2860_softc *, int); +static void rt2860_set_chan(struct rt2860_softc *, u_int); +static void rt3090_set_chan(struct rt2860_softc *, u_int); +static int rt3090_rf_init(struct rt2860_softc *); +static void rt3090_rf_wakeup(struct rt2860_softc *); +static int rt3090_filter_calib(struct rt2860_softc *, uint8_t, uint8_t, + uint8_t *); +static void rt3090_rf_setup(struct rt2860_softc *); +static void rt2860_set_leds(struct rt2860_softc *, uint16_t); +static void rt2860_set_gp_timer(struct rt2860_softc *, int); +static void rt2860_set_bssid(struct rt2860_softc *, const uint8_t *); +static void rt2860_set_macaddr(struct rt2860_softc *, const uint8_t *); +static void rt2860_update_promisc(struct ifnet *); +static void rt2860_updateslot(struct ifnet *); +static void rt2860_updateprot(struct ifnet *); +static int rt2860_updateedca(struct ieee80211com *); +#ifdef HW_CRYPTO +static int rt2860_set_key(struct ieee80211com *, struct ieee80211_node *, + struct ieee80211_key *); +static void rt2860_delete_key(struct ieee80211com *, + struct ieee80211_node *, struct ieee80211_key *); +#endif +static int8_t rt2860_rssi2dbm(struct rt2860_softc *, uint8_t, uint8_t); +static const char *rt2860_get_rf(uint8_t); +static int rt2860_read_eeprom(struct rt2860_softc *, + uint8_t macaddr[IEEE80211_ADDR_LEN]); +static int rt2860_bbp_init(struct rt2860_softc *); +static int rt2860_txrx_enable(struct rt2860_softc *); +static void rt2860_init(void *); +static void rt2860_init_locked(struct rt2860_softc *); +static void rt2860_stop(void *); +static void rt2860_stop_locked(struct rt2860_softc *); +static int rt2860_load_microcode(struct rt2860_softc *); +#ifdef NOT_YET +static void rt2860_calib(struct rt2860_softc *); +#endif +static void rt3090_set_rx_antenna(struct rt2860_softc *, int); +static void rt2860_switch_chan(struct rt2860_softc *, + struct ieee80211_channel *); +static int rt2860_setup_beacon(struct rt2860_softc *, + struct ieee80211vap *); +static void rt2860_enable_tsf_sync(struct rt2860_softc *); + +static const struct { + uint32_t reg; + uint32_t val; +} rt2860_def_mac[] = { + RT2860_DEF_MAC +}; + +static const struct { + uint8_t reg; + uint8_t val; +} rt2860_def_bbp[] = { + RT2860_DEF_BBP +}; + +static const struct rfprog { + uint8_t chan; + uint32_t r1, r2, r3, r4; +} rt2860_rf2850[] = { + RT2860_RF2850 +}; + +struct { + uint8_t n, r, k; +} rt3090_freqs[] = { + RT3070_RF3052 +}; + +static const struct { + uint8_t reg; + uint8_t val; +} rt3090_def_rf[] = { + RT3070_DEF_RF +}; + +int +rt2860_attach(device_t dev, int id) +{ + struct rt2860_softc *sc = device_get_softc(dev); + struct ieee80211com *ic; + struct ifnet *ifp; + uint32_t tmp; + int error, ntries, qid; + uint8_t bands; + uint8_t macaddr[IEEE80211_ADDR_LEN]; + + sc->sc_dev = dev; + sc->sc_debug = 0; + + ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211); + if (ifp == NULL) { + device_printf(sc->sc_dev, "can not if_alloc()\n"); + return ENOMEM; + } + ic = ifp->if_l2com; + + mtx_init(&sc->sc_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, + MTX_DEF | MTX_RECURSE); + + callout_init_mtx(&sc->watchdog_ch, &sc->sc_mtx, 0); + + /* wait for NIC to initialize */ + for (ntries = 0; ntries < 100; ntries++) { + tmp = RAL_READ(sc, RT2860_ASIC_VER_ID); + if (tmp != 0 && tmp != 0xffffffff) + break; + DELAY(10); + } + if (ntries == 100) { + device_printf(sc->sc_dev, + "timeout waiting for NIC to initialize\n"); + error = EIO; + goto fail1; + } + sc->mac_ver = tmp >> 16; + sc->mac_rev = tmp & 0xffff; + + if (sc->mac_ver != 0x2860 && + (id == 0x0681 || id == 0x0781 || id == 0x1059)) + sc->sc_flags |= RT2860_ADVANCED_PS; + + /* retrieve RF rev. no and various other things from EEPROM */ + rt2860_read_eeprom(sc, macaddr); + if (bootverbose) { + device_printf(sc->sc_dev, "MAC/BBP RT%X (rev 0x%04X), " + "RF %s (MIMO %dT%dR), address %6D\n", + sc->mac_ver, sc->mac_rev, rt2860_get_rf(sc->rf_rev), + sc->ntxchains, sc->nrxchains, macaddr, ":"); + } + + /* + * Allocate Tx (4 EDCAs + HCCA + Mgt) and Rx rings. + */ + for (qid = 0; qid < 6; qid++) { + if ((error = rt2860_alloc_tx_ring(sc, &sc->txq[qid])) != 0) { + device_printf(sc->sc_dev, + "could not allocate Tx ring %d\n", qid); + goto fail2; + } + } + + if ((error = rt2860_alloc_rx_ring(sc, &sc->rxq)) != 0) { + device_printf(sc->sc_dev, "could not allocate Rx ring\n"); + goto fail2; + } + + if ((error = rt2860_alloc_tx_pool(sc)) != 0) { + device_printf(sc->sc_dev, "could not allocate Tx pool\n"); + goto fail3; + } + + /* mgmt ring is broken on RT2860C, use EDCA AC VO ring instead */ + sc->mgtqid = (sc->mac_ver == 0x2860 && sc->mac_rev == 0x0100) ? + WME_AC_VO : 5; + + ifp->if_softc = sc; + if_initname(ifp, device_get_name(dev), device_get_unit(dev)); + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_init = rt2860_init; + ifp->if_ioctl = rt2860_ioctl; + ifp->if_start = rt2860_start; + IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); + ifp->if_snd.ifq_drv_maxlen = ifqmaxlen; + IFQ_SET_READY(&ifp->if_snd); + + ic->ic_ifp = ifp; + ic->ic_opmode = IEEE80211_M_STA; + ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ + + /* set device capabilities */ + ic->ic_caps = + IEEE80211_C_STA /* station mode */ + | IEEE80211_C_IBSS /* ibss, nee adhoc, mode */ + | IEEE80211_C_HOSTAP /* hostap mode */ + | IEEE80211_C_MONITOR /* monitor mode */ + | IEEE80211_C_AHDEMO /* adhoc demo mode */ + | IEEE80211_C_WDS /* 4-address traffic works */ + | IEEE80211_C_MBSS /* mesh point link mode */ + | IEEE80211_C_SHPREAMBLE /* short preamble supported */ + | IEEE80211_C_SHSLOT /* short slot time supported */ + | IEEE80211_C_WPA /* capable of WPA1+WPA2 */ +#if 0 + | IEEE80211_C_BGSCAN /* capable of bg scanning */ +#endif + | IEEE80211_C_WME /* 802.11e */ + ; + + bands = 0; + setbit(&bands, IEEE80211_MODE_11B); + setbit(&bands, IEEE80211_MODE_11G); + if (sc->rf_rev == RT2860_RF_2750 || sc->rf_rev == RT2860_RF_2850) + setbit(&bands, IEEE80211_MODE_11A); + ieee80211_init_channels(ic, NULL, &bands); + + ieee80211_ifattach(ic, macaddr); + + ic->ic_wme.wme_update = rt2860_updateedca; + ic->ic_scan_start = rt2860_scan_start; + ic->ic_scan_end = rt2860_scan_end; + ic->ic_set_channel = rt2860_set_channel; + ic->ic_updateslot = rt2860_updateslot; + ic->ic_update_promisc = rt2860_update_promisc; + ic->ic_raw_xmit = rt2860_raw_xmit; + sc->sc_node_free = ic->ic_node_free; + ic->ic_node_free = rt2860_node_free; + ic->ic_newassoc = rt2860_newassoc; + + ic->ic_vap_create = rt2860_vap_create; + ic->ic_vap_delete = rt2860_vap_delete; + + ieee80211_radiotap_attach(ic, + &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap), + RT2860_TX_RADIOTAP_PRESENT, + &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), + RT2860_RX_RADIOTAP_PRESENT); + +#ifdef RAL_DEBUG + SYSCTL_ADD_INT(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, + "debug", CTLFLAG_RW, &sc->sc_debug, 0, "debug msgs"); +#endif + if (bootverbose) + ieee80211_announce(ic); + + return 0; + +fail3: rt2860_free_rx_ring(sc, &sc->rxq); +fail2: while (--qid >= 0) + rt2860_free_tx_ring(sc, &sc->txq[qid]); +fail1: mtx_destroy(&sc->sc_mtx); + if_free(ifp); + return error; +} + +int +rt2860_detach(void *xsc) +{ + struct rt2860_softc *sc = xsc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + int qid; + + RAL_LOCK(sc); + rt2860_stop_locked(sc); + RAL_UNLOCK(sc); + + ieee80211_ifdetach(ic); + + for (qid = 0; qid < 6; qid++) + rt2860_free_tx_ring(sc, &sc->txq[qid]); + rt2860_free_rx_ring(sc, &sc->rxq); + rt2860_free_tx_pool(sc); + + if_free(ifp); + + mtx_destroy(&sc->sc_mtx); + + return 0; +} + +void +rt2860_shutdown(void *xsc) +{ + struct rt2860_softc *sc = xsc; + + rt2860_stop(sc); +} + +void +rt2860_suspend(void *xsc) +{ + struct rt2860_softc *sc = xsc; + + rt2860_stop(sc); +} + +void +rt2860_resume(void *xsc) +{ + struct rt2860_softc *sc = xsc; + struct ifnet *ifp = sc->sc_ifp; + + if (ifp->if_flags & IFF_UP) + rt2860_init(sc); +} + +static struct ieee80211vap * +rt2860_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit, + enum ieee80211_opmode opmode, int flags, + const uint8_t bssid[IEEE80211_ADDR_LEN], + const uint8_t mac[IEEE80211_ADDR_LEN]) +{ + struct ifnet *ifp = ic->ic_ifp; + struct rt2860_vap *rvp; + struct ieee80211vap *vap; + + switch (opmode) { + case IEEE80211_M_STA: + case IEEE80211_M_IBSS: + case IEEE80211_M_AHDEMO: + case IEEE80211_M_MONITOR: + case IEEE80211_M_HOSTAP: + case IEEE80211_M_MBSS: + /* XXXRP: TBD */ + if (!TAILQ_EMPTY(&ic->ic_vaps)) { + if_printf(ifp, "only 1 vap supported\n"); + return NULL; + } + if (opmode == IEEE80211_M_STA) + flags |= IEEE80211_CLONE_NOBEACONS; + break; + case IEEE80211_M_WDS: + if (TAILQ_EMPTY(&ic->ic_vaps) || + ic->ic_opmode != IEEE80211_M_HOSTAP) { + if_printf(ifp, "wds only supported in ap mode\n"); + return NULL; + } + /* + * Silently remove any request for a unique + * bssid; WDS vap's always share the local + * mac address. + */ + flags &= ~IEEE80211_CLONE_BSSID; + break; + default: + if_printf(ifp, "unknown opmode %d\n", opmode); + return NULL; + } + rvp = malloc(sizeof(struct rt2860_vap), M_80211_VAP, M_NOWAIT | M_ZERO); + if (rvp == NULL) + return NULL; + vap = &rvp->ral_vap; + ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac); + + /* override state transition machine */ + rvp->ral_newstate = vap->iv_newstate; + vap->iv_newstate = rt2860_newstate; +#if 0 + vap->iv_update_beacon = rt2860_beacon_update; +#endif + + /* HW supports up to 255 STAs (0-254) in HostAP and IBSS modes */ + vap->iv_max_aid = min(IEEE80211_AID_MAX, RT2860_WCID_MAX); + + ieee80211_ratectl_init(vap); + /* complete setup */ + ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status); + if (TAILQ_FIRST(&ic->ic_vaps) == vap) + ic->ic_opmode = opmode; + return vap; +} + +static void +rt2860_vap_delete(struct ieee80211vap *vap) +{ + struct rt2860_vap *rvp = RT2860_VAP(vap); + + ieee80211_ratectl_deinit(vap); + ieee80211_vap_detach(vap); + free(rvp, M_80211_VAP); +} + +static void +rt2860_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error) +{ + if (error != 0) + return; + + KASSERT(nseg == 1, ("too many DMA segments, %d should be 1", nseg)); + + *(bus_addr_t *)arg = segs[0].ds_addr; +} + + +static int +rt2860_alloc_tx_ring(struct rt2860_softc *sc, struct rt2860_tx_ring *ring) +{ + int size, error; + + size = RT2860_TX_RING_COUNT * sizeof (struct rt2860_txd); + + error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 16, 0, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, + size, 1, size, 0, NULL, NULL, &ring->desc_dmat); + if (error != 0) { + device_printf(sc->sc_dev, "could not create desc DMA map\n"); + goto fail; + } + + error = bus_dmamem_alloc(ring->desc_dmat, (void **)&ring->txd, + BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->desc_map); + if (error != 0) { + device_printf(sc->sc_dev, "could not allocate DMA memory\n"); + goto fail; + } + + error = bus_dmamap_load(ring->desc_dmat, ring->desc_map, ring->txd, + size, rt2860_dma_map_addr, &ring->paddr, 0); + if (error != 0) { + device_printf(sc->sc_dev, "could not load desc DMA map\n"); + goto fail; + } + + bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_PREWRITE); + + return 0; + +fail: rt2860_free_tx_ring(sc, ring); + return error; +} + +void +rt2860_reset_tx_ring(struct rt2860_softc *sc, struct rt2860_tx_ring *ring) +{ + struct rt2860_tx_data *data; + int i; + + for (i = 0; i < RT2860_TX_RING_COUNT; i++) { + if ((data = ring->data[i]) == NULL) + continue; /* nothing mapped in this slot */ + + if (data->m != NULL) { + bus_dmamap_sync(sc->txwi_dmat, data->map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->txwi_dmat, data->map); + m_freem(data->m); + data->m = NULL; + } + if (data->ni != NULL) { + ieee80211_free_node(data->ni); + data->ni = NULL; + } + + SLIST_INSERT_HEAD(&sc->data_pool, data, next); + ring->data[i] = NULL; + } + + ring->queued = 0; + ring->cur = ring->next = 0; +} + +void +rt2860_free_tx_ring(struct rt2860_softc *sc, struct rt2860_tx_ring *ring) +{ + struct rt2860_tx_data *data; + int i; + + if (ring->txd != NULL) { + bus_dmamap_sync(ring->desc_dmat, ring->desc_map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(ring->desc_dmat, ring->desc_map); + bus_dmamem_free(ring->desc_dmat, ring->txd, ring->desc_map); + } + if (ring->desc_dmat != NULL) + bus_dma_tag_destroy(ring->desc_dmat); + + for (i = 0; i < RT2860_TX_RING_COUNT; i++) { + if ((data = ring->data[i]) == NULL) + continue; /* nothing mapped in this slot */ + + if (data->m != NULL) { + bus_dmamap_sync(sc->txwi_dmat, data->map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->txwi_dmat, data->map); + m_freem(data->m); + } + if (data->ni != NULL) + ieee80211_free_node(data->ni); + + SLIST_INSERT_HEAD(&sc->data_pool, data, next); + } +} + +/* + * Allocate a pool of TX Wireless Information blocks. + */ +int +rt2860_alloc_tx_pool(struct rt2860_softc *sc) +{ + caddr_t vaddr; + bus_addr_t paddr; + int i, size, error; + + size = RT2860_TX_POOL_COUNT * RT2860_TXWI_DMASZ; + + /* init data_pool early in case of failure.. */ + SLIST_INIT(&sc->data_pool); + + error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, + size, 1, size, 0, NULL, NULL, &sc->txwi_dmat); + if (error != 0) { + device_printf(sc->sc_dev, "could not create txwi DMA tag\n"); + goto fail; + } + + error = bus_dmamem_alloc(sc->txwi_dmat, (void **)&sc->txwi_vaddr, + BUS_DMA_NOWAIT | BUS_DMA_ZERO, &sc->txwi_map); + if (error != 0) { + device_printf(sc->sc_dev, "could not allocate DMA memory\n"); + goto fail; + } + + error = bus_dmamap_load(sc->txwi_dmat, sc->txwi_map, + sc->txwi_vaddr, size, rt2860_dma_map_addr, &paddr, 0); + if (error != 0) { + device_printf(sc->sc_dev, "could not load txwi DMA map\n"); + goto fail; + } + + bus_dmamap_sync(sc->txwi_dmat, sc->txwi_map, BUS_DMASYNC_PREWRITE); + + vaddr = sc->txwi_vaddr; + for (i = 0; i < RT2860_TX_POOL_COUNT; i++) { + struct rt2860_tx_data *data = &sc->data[i]; + + error = bus_dmamap_create(sc->txwi_dmat, 0, &data->map); + if (error != 0) { + device_printf(sc->sc_dev, "could not create DMA map\n"); + goto fail; + } + data->txwi = (struct rt2860_txwi *)vaddr; + data->paddr = paddr; + vaddr += RT2860_TXWI_DMASZ; + paddr += RT2860_TXWI_DMASZ; + + SLIST_INSERT_HEAD(&sc->data_pool, data, next); + } + + return 0; + +fail: rt2860_free_tx_pool(sc); + return error; +} + +void +rt2860_free_tx_pool(struct rt2860_softc *sc) +{ + if (sc->txwi_vaddr != NULL) { + bus_dmamap_sync(sc->txwi_dmat, sc->txwi_map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->txwi_dmat, sc->txwi_map); + bus_dmamem_free(sc->txwi_dmat, sc->txwi_vaddr, sc->txwi_map); + } + if (sc->txwi_dmat != NULL) + bus_dma_tag_destroy(sc->txwi_dmat); + + while (!SLIST_EMPTY(&sc->data_pool)) { + struct rt2860_tx_data *data; + data = SLIST_FIRST(&sc->data_pool); + bus_dmamap_destroy(sc->txwi_dmat, data->map); + SLIST_REMOVE_HEAD(&sc->data_pool, next); + } +} + +int +rt2860_alloc_rx_ring(struct rt2860_softc *sc, struct rt2860_rx_ring *ring) +{ + bus_addr_t physaddr; + int i, size, error; + + size = RT2860_RX_RING_COUNT * sizeof (struct rt2860_rxd); + + error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 16, 0, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, + size, 1, size, 0, NULL, NULL, &ring->desc_dmat); + if (error != 0) { + device_printf(sc->sc_dev, "could not create desc DMA tag\n"); + goto fail; + } + + error = bus_dmamem_alloc(ring->desc_dmat, (void **)&ring->rxd, + BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->desc_map); + if (error != 0) { + device_printf(sc->sc_dev, "could not allocate DMA memory\n"); + goto fail; + } + + error = bus_dmamap_load(ring->desc_dmat, ring->desc_map, ring->rxd, + size, rt2860_dma_map_addr, &ring->paddr, 0); + if (error != 0) { + device_printf(sc->sc_dev, "could not load desc DMA map\n"); + goto fail; + } + + error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, + 1, MCLBYTES, 0, NULL, NULL, &ring->data_dmat); + if (error != 0) { + device_printf(sc->sc_dev, "could not create data DMA tag\n"); + goto fail; + } + + for (i = 0; i < RT2860_RX_RING_COUNT; i++) { + struct rt2860_rx_data *data = &ring->data[i]; + struct rt2860_rxd *rxd = &ring->rxd[i]; + + error = bus_dmamap_create(ring->data_dmat, 0, &data->map); + if (error != 0) { + device_printf(sc->sc_dev, "could not create DMA map\n"); + goto fail; + } + + data->m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (data->m == NULL) { + device_printf(sc->sc_dev, + "could not allocate rx mbuf\n"); + error = ENOMEM; + goto fail; + } + + error = bus_dmamap_load(ring->data_dmat, data->map, + mtod(data->m, void *), MCLBYTES, rt2860_dma_map_addr, + &physaddr, 0); + if (error != 0) { + device_printf(sc->sc_dev, + "could not load rx buf DMA map"); + goto fail; + } + + rxd->sdp0 = htole32(physaddr); + rxd->sdl0 = htole16(MCLBYTES); + } + + bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_PREWRITE); + + return 0; + +fail: rt2860_free_rx_ring(sc, ring); + return error; +} + +void +rt2860_reset_rx_ring(struct rt2860_softc *sc, struct rt2860_rx_ring *ring) +{ + int i; + + for (i = 0; i < RT2860_RX_RING_COUNT; i++) + ring->rxd[i].sdl0 &= ~htole16(RT2860_RX_DDONE); + + bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_PREWRITE); + + ring->cur = 0; +} + +void +rt2860_free_rx_ring(struct rt2860_softc *sc, struct rt2860_rx_ring *ring) +{ + int i; + + if (ring->rxd != NULL) { + bus_dmamap_sync(ring->desc_dmat, ring->desc_map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(ring->desc_dmat, ring->desc_map); + bus_dmamem_free(ring->desc_dmat, ring->rxd, ring->desc_map); + } + if (ring->desc_dmat != NULL) + bus_dma_tag_destroy(ring->desc_dmat); + + for (i = 0; i < RT2860_RX_RING_COUNT; i++) { + struct rt2860_rx_data *data = &ring->data[i]; + + if (data->m != NULL) { + bus_dmamap_sync(ring->data_dmat, data->map, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(ring->data_dmat, data->map); + m_freem(data->m); + } + if (data->map != NULL) + bus_dmamap_destroy(ring->data_dmat, data->map); + } + if (ring->data_dmat != NULL) + bus_dma_tag_destroy(ring->data_dmat); +} + +static void +rt2860_updatestats(struct rt2860_softc *sc) +{ + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + + /* + * In IBSS or HostAP modes (when the hardware sends beacons), the + * MAC can run into a livelock and start sending CTS-to-self frames + * like crazy if protection is enabled. Fortunately, we can detect + * when such a situation occurs and reset the MAC. + */ + if (ic->ic_curmode != IEEE80211_M_STA) { + /* check if we're in a livelock situation.. */ + uint32_t tmp = RAL_READ(sc, RT2860_DEBUG); + if ((tmp & (1 << 29)) && (tmp & (1 << 7 | 1 << 5))) { + /* ..and reset MAC/BBP for a while.. */ + DPRINTF(("CTS-to-self livelock detected\n")); + RAL_WRITE(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_SRST); + RAL_BARRIER_WRITE(sc); + DELAY(1); + RAL_WRITE(sc, RT2860_MAC_SYS_CTRL, + RT2860_MAC_RX_EN | RT2860_MAC_TX_EN); + } + } +} + +static void +rt2860_newassoc(struct ieee80211_node *ni, int isnew) +{ + struct ieee80211com *ic = ni->ni_ic; + struct rt2860_softc *sc = ic->ic_ifp->if_softc; + uint8_t wcid; + + wcid = IEEE80211_AID(ni->ni_associd); + if (isnew && ni->ni_associd != 0) { + sc->wcid2ni[wcid] = ni; + + /* init WCID table entry */ + RAL_WRITE_REGION_1(sc, RT2860_WCID_ENTRY(wcid), + ni->ni_macaddr, IEEE80211_ADDR_LEN); + } + DPRINTF(("new assoc isnew=%d addr=%s WCID=%d\n", + isnew, ether_sprintf(ni->ni_macaddr), wcid)); +} + +static void +rt2860_node_free(struct ieee80211_node *ni) +{ + struct ieee80211com *ic = ni->ni_ic; + struct rt2860_softc *sc = ic->ic_ifp->if_softc; + uint8_t wcid; + + if (ni->ni_associd != 0) { + wcid = IEEE80211_AID(ni->ni_associd); + + /* clear Rx WCID search table entry */ + RAL_SET_REGION_4(sc, RT2860_WCID_ENTRY(wcid), 0, 2); + } + sc->sc_node_free(ni); +} + +#ifdef IEEE80211_HT +static int +rt2860_ampdu_rx_start(struct ieee80211com *ic, struct ieee80211_node *ni, + uint8_t tid) +{ + struct rt2860_softc *sc = ic->ic_softc; + uint8_t wcid = ((struct rt2860_node *)ni)->wcid; + uint32_t tmp; + + /* update BA session mask */ + tmp = RAL_READ(sc, RT2860_WCID_ENTRY(wcid) + 4); + tmp |= (1 << tid) << 16; + RAL_WRITE(sc, RT2860_WCID_ENTRY(wcid) + 4, tmp); + return 0; +} + +static void +rt2860_ampdu_rx_stop(struct ieee80211com *ic, struct ieee80211_node *ni, + uint8_t tid) +{ + struct rt2860_softc *sc = ic->ic_softc; + uint8_t wcid = ((struct rt2860_node *)ni)->wcid; + uint32_t tmp; + + /* update BA session mask */ + tmp = RAL_READ(sc, RT2860_WCID_ENTRY(wcid) + 4); + tmp &= ~((1 << tid) << 16); + RAL_WRITE(sc, RT2860_WCID_ENTRY(wcid) + 4, tmp); +} +#endif + +int +rt2860_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) +{ + struct rt2860_vap *rvp = RT2860_VAP(vap); + struct ieee80211com *ic = vap->iv_ic; + struct rt2860_softc *sc = ic->ic_ifp->if_softc; + uint32_t tmp; + int error; + + if (vap->iv_state == IEEE80211_S_RUN) { + /* turn link LED off */ + rt2860_set_leds(sc, RT2860_LED_RADIO); + } + + if (nstate == IEEE80211_S_INIT && vap->iv_state == IEEE80211_S_RUN) { + /* abort TSF synchronization */ + tmp = RAL_READ(sc, RT2860_BCN_TIME_CFG); + RAL_WRITE(sc, RT2860_BCN_TIME_CFG, + tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN | + RT2860_TBTT_TIMER_EN)); + } + + rt2860_set_gp_timer(sc, 0); + + error = rvp->ral_newstate(vap, nstate, arg); + if (error != 0) + return (error); + + if (nstate == IEEE80211_S_RUN) { + struct ieee80211_node *ni = vap->iv_bss; + + if (ic->ic_opmode != IEEE80211_M_MONITOR) { + rt2860_enable_mrr(sc); + rt2860_set_txpreamble(sc); + rt2860_set_basicrates(sc, &ni->ni_rates); + rt2860_set_bssid(sc, ni->ni_bssid); + } + + if (vap->iv_opmode == IEEE80211_M_HOSTAP || + vap->iv_opmode == IEEE80211_M_IBSS || + vap->iv_opmode == IEEE80211_M_MBSS) { + error = rt2860_setup_beacon(sc, vap); + if (error != 0) + return error; + } + + if (ic->ic_opmode != IEEE80211_M_MONITOR) { + rt2860_enable_tsf_sync(sc); + rt2860_set_gp_timer(sc, 500); + } + + /* turn link LED on */ + rt2860_set_leds(sc, RT2860_LED_RADIO | + (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan) ? + RT2860_LED_LINK_2GHZ : RT2860_LED_LINK_5GHZ)); + } + return error; +} + +/* Read 16-bit from eFUSE ROM (>=RT3071 only.) */ +static uint16_t +rt3090_efuse_read_2(struct rt2860_softc *sc, uint16_t addr) +{ + uint32_t tmp; + uint16_t reg; + int ntries; + + addr *= 2; + /*- + * Read one 16-byte block into registers EFUSE_DATA[0-3]: + * DATA0: F E D C + * DATA1: B A 9 8 + * DATA2: 7 6 5 4 + * DATA3: 3 2 1 0 + */ + tmp = RAL_READ(sc, RT3070_EFUSE_CTRL); + tmp &= ~(RT3070_EFSROM_MODE_MASK | RT3070_EFSROM_AIN_MASK); + tmp |= (addr & ~0xf) << RT3070_EFSROM_AIN_SHIFT | RT3070_EFSROM_KICK; + RAL_WRITE(sc, RT3070_EFUSE_CTRL, tmp); + for (ntries = 0; ntries < 500; ntries++) { + tmp = RAL_READ(sc, RT3070_EFUSE_CTRL); + if (!(tmp & RT3070_EFSROM_KICK)) + break; + DELAY(2); + } + if (ntries == 500) + return 0xffff; + + if ((tmp & RT3070_EFUSE_AOUT_MASK) == RT3070_EFUSE_AOUT_MASK) + return 0xffff; /* address not found */ + + /* determine to which 32-bit register our 16-bit word belongs */ + reg = RT3070_EFUSE_DATA3 - (addr & 0xc); + tmp = RAL_READ(sc, reg); + + return (addr & 2) ? tmp >> 16 : tmp & 0xffff; +} + +/* + * Read 16 bits at address 'addr' from the serial EEPROM (either 93C46, + * 93C66 or 93C86). + */ +static uint16_t +rt2860_eeprom_read_2(struct rt2860_softc *sc, uint16_t addr) +{ + uint32_t tmp; + uint16_t val; + int n; + + /* clock C once before the first command */ + RT2860_EEPROM_CTL(sc, 0); + + RT2860_EEPROM_CTL(sc, RT2860_S); + RT2860_EEPROM_CTL(sc, RT2860_S | RT2860_C); + RT2860_EEPROM_CTL(sc, RT2860_S); + + /* write start bit (1) */ + RT2860_EEPROM_CTL(sc, RT2860_S | RT2860_D); + RT2860_EEPROM_CTL(sc, RT2860_S | RT2860_D | RT2860_C); + + /* write READ opcode (10) */ + RT2860_EEPROM_CTL(sc, RT2860_S | RT2860_D); + RT2860_EEPROM_CTL(sc, RT2860_S | RT2860_D | RT2860_C); + RT2860_EEPROM_CTL(sc, RT2860_S); + RT2860_EEPROM_CTL(sc, RT2860_S | RT2860_C); + + /* write address (A5-A0 or A7-A0) */ + n = ((RAL_READ(sc, RT2860_PCI_EECTRL) & 0x30) == 0) ? 5 : 7; + for (; n >= 0; n--) { + RT2860_EEPROM_CTL(sc, RT2860_S | + (((addr >> n) & 1) << RT2860_SHIFT_D)); + RT2860_EEPROM_CTL(sc, RT2860_S | + (((addr >> n) & 1) << RT2860_SHIFT_D) | RT2860_C); + } + + RT2860_EEPROM_CTL(sc, RT2860_S); + + /* read data Q15-Q0 */ + val = 0; + for (n = 15; n >= 0; n--) { + RT2860_EEPROM_CTL(sc, RT2860_S | RT2860_C); + tmp = RAL_READ(sc, RT2860_PCI_EECTRL); + val |= ((tmp & RT2860_Q) >> RT2860_SHIFT_Q) << n; + RT2860_EEPROM_CTL(sc, RT2860_S); + } + + RT2860_EEPROM_CTL(sc, 0); + + /* clear Chip Select and clock C */ + RT2860_EEPROM_CTL(sc, RT2860_S); + RT2860_EEPROM_CTL(sc, 0); + RT2860_EEPROM_CTL(sc, RT2860_C); + + return val; +} + +static __inline uint16_t +rt2860_srom_read(struct rt2860_softc *sc, uint8_t addr) +{ + /* either eFUSE ROM or EEPROM */ + return sc->sc_srom_read(sc, addr); +} + +static void +rt2860_intr_coherent(struct rt2860_softc *sc) +{ + uint32_t tmp; + + /* DMA finds data coherent event when checking the DDONE bit */ + + DPRINTF(("Tx/Rx Coherent interrupt\n")); + + /* restart DMA engine */ + tmp = RAL_READ(sc, RT2860_WPDMA_GLO_CFG); + tmp &= ~(RT2860_TX_WB_DDONE | RT2860_RX_DMA_EN | RT2860_TX_DMA_EN); + RAL_WRITE(sc, RT2860_WPDMA_GLO_CFG, tmp); + + (void)rt2860_txrx_enable(sc); +} + +static void +rt2860_drain_stats_fifo(struct rt2860_softc *sc) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211_node *ni; + uint32_t stat; + int retrycnt; + uint8_t wcid, mcs, pid; + + /* drain Tx status FIFO (maxsize = 16) */ + while ((stat = RAL_READ(sc, RT2860_TX_STAT_FIFO)) & RT2860_TXQ_VLD) { + DPRINTFN(4, ("tx stat 0x%08x\n", stat)); + + wcid = (stat >> RT2860_TXQ_WCID_SHIFT) & 0xff; + ni = sc->wcid2ni[wcid]; + + /* if no ACK was requested, no feedback is available */ + if (!(stat & RT2860_TXQ_ACKREQ) || wcid == 0xff || ni == NULL) + continue; + + /* update per-STA AMRR stats */ + if (stat & RT2860_TXQ_OK) { + /* + * Check if there were retries, ie if the Tx success + * rate is different from the requested rate. Note + * that it works only because we do not allow rate + * fallback from OFDM to CCK. + */ + mcs = (stat >> RT2860_TXQ_MCS_SHIFT) & 0x7f; + pid = (stat >> RT2860_TXQ_PID_SHIFT) & 0xf; + if (mcs + 1 != pid) + retrycnt = 1; + else + retrycnt = 0; + ieee80211_ratectl_tx_complete(ni->ni_vap, ni, + IEEE80211_RATECTL_TX_SUCCESS, &retrycnt, NULL); + } else { + ieee80211_ratectl_tx_complete(ni->ni_vap, ni, + IEEE80211_RATECTL_TX_FAILURE, &retrycnt, NULL); + ifp->if_oerrors++; + } + } +} + +static void +rt2860_tx_intr(struct rt2860_softc *sc, int qid) +{ + struct ifnet *ifp = sc->sc_ifp; + struct rt2860_tx_ring *ring = &sc->txq[qid]; + uint32_t hw; + + rt2860_drain_stats_fifo(sc); + + hw = RAL_READ(sc, RT2860_TX_DTX_IDX(qid)); + while (ring->next != hw) { + struct rt2860_tx_data *data = ring->data[ring->next]; + + if (data != NULL) { + bus_dmamap_sync(sc->txwi_dmat, data->map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->txwi_dmat, data->map); + if (data->m->m_flags & M_TXCB) { + ieee80211_process_callback(data->ni, data->m, + 0); + } + m_freem(data->m); + ieee80211_free_node(data->ni); + data->m = NULL; + data->ni = NULL; + + SLIST_INSERT_HEAD(&sc->data_pool, data, next); + ring->data[ring->next] = NULL; + + ifp->if_opackets++; + } + ring->queued--; + ring->next = (ring->next + 1) % RT2860_TX_RING_COUNT; + } + + sc->sc_tx_timer = 0; + if (ring->queued < RT2860_TX_RING_COUNT) + sc->qfullmsk &= ~(1 << qid); + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + rt2860_start_locked(ifp); +} + +/* + * Return the Rx chain with the highest RSSI for a given frame. + */ +static __inline uint8_t +rt2860_maxrssi_chain(struct rt2860_softc *sc, const struct rt2860_rxwi *rxwi) +{ + uint8_t rxchain = 0; + + if (sc->nrxchains > 1) { + if (rxwi->rssi[1] > rxwi->rssi[rxchain]) + rxchain = 1; + if (sc->nrxchains > 2) + if (rxwi->rssi[2] > rxwi->rssi[rxchain]) + rxchain = 2; + } + return rxchain; +} + +static void +rt2860_rx_intr(struct rt2860_softc *sc) +{ + struct rt2860_rx_radiotap_header *tap; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211_frame *wh; + struct ieee80211_node *ni; + struct mbuf *m, *m1; + bus_addr_t physaddr; + uint32_t hw; + uint16_t phy; + uint8_t ant; + int8_t rssi, nf; + int error; + + hw = RAL_READ(sc, RT2860_FS_DRX_IDX) & 0xfff; + while (sc->rxq.cur != hw) { + struct rt2860_rx_data *data = &sc->rxq.data[sc->rxq.cur]; + struct rt2860_rxd *rxd = &sc->rxq.rxd[sc->rxq.cur]; + struct rt2860_rxwi *rxwi; + + bus_dmamap_sync(sc->rxq.desc_dmat, sc->rxq.desc_map, + BUS_DMASYNC_POSTREAD); + + if (__predict_false(!(rxd->sdl0 & htole16(RT2860_RX_DDONE)))) { + DPRINTF(("RXD DDONE bit not set!\n")); + break; /* should not happen */ + } + + if (__predict_false(rxd->flags & + htole32(RT2860_RX_CRCERR | RT2860_RX_ICVERR))) { + ifp->if_ierrors++; + goto skip; + } + +#ifdef HW_CRYPTO + if (__predict_false(rxd->flags & htole32(RT2860_RX_MICERR))) { + /* report MIC failures to net80211 for TKIP */ + ic->ic_stats.is_rx_locmicfail++; + ieee80211_michael_mic_failure(ic, 0/* XXX */); + ifp->if_ierrors++; + goto skip; + } +#endif + + m1 = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (__predict_false(m1 == NULL)) { + ifp->if_ierrors++; + goto skip; + } + + bus_dmamap_sync(sc->rxq.data_dmat, data->map, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(sc->rxq.data_dmat, data->map); + + error = bus_dmamap_load(sc->rxq.data_dmat, data->map, + mtod(m1, void *), MCLBYTES, rt2860_dma_map_addr, + &physaddr, 0); + if (__predict_false(error != 0)) { + m_freem(m1); + + /* try to reload the old mbuf */ + error = bus_dmamap_load(sc->rxq.data_dmat, data->map, + mtod(data->m, void *), MCLBYTES, + rt2860_dma_map_addr, &physaddr, 0); + if (__predict_false(error != 0)) { + panic("%s: could not load old rx mbuf", + device_get_name(sc->sc_dev)); + } + /* physical address may have changed */ + rxd->sdp0 = htole32(physaddr); + ifp->if_ierrors++; + goto skip; + } + + /* + * New mbuf successfully loaded, update Rx ring and continue + * processing. + */ + m = data->m; + data->m = m1; + rxd->sdp0 = htole32(physaddr); + + rxwi = mtod(m, struct rt2860_rxwi *); + + /* finalize mbuf */ + m->m_pkthdr.rcvif = ifp; + m->m_data = (caddr_t)(rxwi + 1); + m->m_pkthdr.len = m->m_len = le16toh(rxwi->len) & 0xfff; + + wh = mtod(m, struct ieee80211_frame *); +#ifdef HW_CRYPTO + if (wh->i_fc[1] & IEEE80211_FC1_WEP) { + /* frame is decrypted by hardware */ + wh->i_fc[1] &= ~IEEE80211_FC1_WEP; + } +#endif + + /* HW may insert 2 padding bytes after 802.11 header */ + if (rxd->flags & htole32(RT2860_RX_L2PAD)) { + u_int hdrlen = ieee80211_hdrsize(wh); + ovbcopy(wh, (caddr_t)wh + 2, hdrlen); + m->m_data += 2; + wh = mtod(m, struct ieee80211_frame *); + } + + ant = rt2860_maxrssi_chain(sc, rxwi); + rssi = rt2860_rssi2dbm(sc, rxwi->rssi[ant], ant); + nf = RT2860_NOISE_FLOOR; + + if (ieee80211_radiotap_active(ic)) { + tap = &sc->sc_rxtap; + tap->wr_flags = 0; + tap->wr_antenna = ant; + tap->wr_antsignal = nf + rssi; + tap->wr_antnoise = nf; + /* in case it can't be found below */ + tap->wr_rate = 2; + phy = le16toh(rxwi->phy); + switch (phy & RT2860_PHY_MODE) { + case RT2860_PHY_CCK: + switch ((phy & RT2860_PHY_MCS) & ~RT2860_PHY_SHPRE) { + case 0: tap->wr_rate = 2; break; + case 1: tap->wr_rate = 4; break; + case 2: tap->wr_rate = 11; break; + case 3: tap->wr_rate = 22; break; + } + if (phy & RT2860_PHY_SHPRE) + tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; + break; + case RT2860_PHY_OFDM: + switch (phy & RT2860_PHY_MCS) { + case 0: tap->wr_rate = 12; break; + case 1: tap->wr_rate = 18; break; + case 2: tap->wr_rate = 24; break; + case 3: tap->wr_rate = 36; break; + case 4: tap->wr_rate = 48; break; + case 5: tap->wr_rate = 72; break; + case 6: tap->wr_rate = 96; break; + case 7: tap->wr_rate = 108; break; + } + break; + } + } + + RAL_UNLOCK(sc); + wh = mtod(m, struct ieee80211_frame *); + + /* send the frame to the 802.11 layer */ + ni = ieee80211_find_rxnode(ic, + (struct ieee80211_frame_min *)wh); + if (ni != NULL) { + (void)ieee80211_input(ni, m, rssi - nf, nf); + ieee80211_free_node(ni); + } else + (void)ieee80211_input_all(ic, m, rssi - nf, nf); + + RAL_LOCK(sc); + +skip: rxd->sdl0 &= ~htole16(RT2860_RX_DDONE); + + bus_dmamap_sync(sc->rxq.desc_dmat, sc->rxq.desc_map, + BUS_DMASYNC_PREWRITE); + + sc->rxq.cur = (sc->rxq.cur + 1) % RT2860_RX_RING_COUNT; + } + + /* tell HW what we have processed */ + RAL_WRITE(sc, RT2860_RX_CALC_IDX, + (sc->rxq.cur - 1) % RT2860_RX_RING_COUNT); +} + +static void +rt2860_tbtt_intr(struct rt2860_softc *sc) +{ +#if 0 + struct ieee80211com *ic = &sc->sc_ic; + +#ifndef IEEE80211_STA_ONLY + if (ic->ic_opmode == IEEE80211_M_HOSTAP) { + /* one less beacon until next DTIM */ + if (ic->ic_dtim_count == 0) + ic->ic_dtim_count = ic->ic_dtim_period - 1; + else + ic->ic_dtim_count--; + + /* update dynamic parts of beacon */ + rt2860_setup_beacon(sc); + + /* flush buffered multicast frames */ + if (ic->ic_dtim_count == 0) + ieee80211_notify_dtim(ic); + } +#endif + /* check if protection mode has changed */ + if ((sc->sc_ic_flags ^ ic->ic_flags) & IEEE80211_F_USEPROT) { + rt2860_updateprot(ic); + sc->sc_ic_flags = ic->ic_flags; + } +#endif +} + +static void +rt2860_gp_intr(struct rt2860_softc *sc) +{ + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + + DPRINTFN(2, ("GP timeout state=%d\n", vap->iv_state)); + + if (vap->iv_state == IEEE80211_S_RUN) + rt2860_updatestats(sc); +} + +void +rt2860_intr(void *arg) +{ + struct rt2860_softc *sc = arg; + uint32_t r; + + RAL_LOCK(sc); + + r = RAL_READ(sc, RT2860_INT_STATUS); + if (__predict_false(r == 0xffffffff)) { + RAL_UNLOCK(sc); + return; /* device likely went away */ + } + if (r == 0) { + RAL_UNLOCK(sc); + return; /* not for us */ + } + + /* acknowledge interrupts */ + RAL_WRITE(sc, RT2860_INT_STATUS, r); + + if (r & RT2860_TX_RX_COHERENT) + rt2860_intr_coherent(sc); + + if (r & RT2860_MAC_INT_2) /* TX status */ + rt2860_drain_stats_fifo(sc); + + if (r & RT2860_TX_DONE_INT5) + rt2860_tx_intr(sc, 5); + + if (r & RT2860_RX_DONE_INT) + rt2860_rx_intr(sc); + + if (r & RT2860_TX_DONE_INT4) + rt2860_tx_intr(sc, 4); + + if (r & RT2860_TX_DONE_INT3) + rt2860_tx_intr(sc, 3); + + if (r & RT2860_TX_DONE_INT2) + rt2860_tx_intr(sc, 2); + + if (r & RT2860_TX_DONE_INT1) + rt2860_tx_intr(sc, 1); + + if (r & RT2860_TX_DONE_INT0) + rt2860_tx_intr(sc, 0); + + if (r & RT2860_MAC_INT_0) /* TBTT */ + rt2860_tbtt_intr(sc); + + if (r & RT2860_MAC_INT_3) /* Auto wakeup */ + /* TBD wakeup */; + + if (r & RT2860_MAC_INT_4) /* GP timer */ + rt2860_gp_intr(sc); + + RAL_UNLOCK(sc); +} + +static int +rt2860_tx(struct rt2860_softc *sc, struct mbuf *m, struct ieee80211_node *ni) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = ni->ni_vap; + struct rt2860_tx_ring *ring; + struct rt2860_tx_data *data; + struct rt2860_txd *txd; + struct rt2860_txwi *txwi; + struct ieee80211_frame *wh; + const struct ieee80211_txparam *tp; + struct ieee80211_key *k; + struct mbuf *m1; + bus_dma_segment_t segs[RT2860_MAX_SCATTER]; + bus_dma_segment_t *seg; + u_int hdrlen; + uint16_t qos, dur; + uint8_t type, qsel, mcs, pid, tid, qid; + int i, nsegs, ntxds, pad, rate, ridx, error; + + /* the data pool contains at least one element, pick the first */ + data = SLIST_FIRST(&sc->data_pool); + + wh = mtod(m, struct ieee80211_frame *); + + if (wh->i_fc[1] & IEEE80211_FC1_WEP) { + k = ieee80211_crypto_encap(ni, m); + if (k == NULL) { + m_freem(m); + return ENOBUFS; + } + + /* packet header may have moved, reset our local pointer */ + wh = mtod(m, struct ieee80211_frame *); + } + + hdrlen = ieee80211_anyhdrsize(wh); + type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + + tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)]; + if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { + rate = tp->mcastrate; + } else if (m->m_flags & M_EAPOL) { + rate = tp->mgmtrate; + } else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) { + rate = tp->ucastrate; + } else { + (void) ieee80211_ratectl_rate(ni, NULL, 0); + rate = ni->ni_txrate; + } + rate &= IEEE80211_RATE_VAL; + + qid = M_WME_GETAC(m); + if (IEEE80211_QOS_HAS_SEQ(wh)) { + qos = ((const struct ieee80211_qosframe *)wh)->i_qos[0]; + tid = qos & IEEE80211_QOS_TID; + } else { + qos = 0; + tid = 0; + } + ring = &sc->txq[qid]; + ridx = ic->ic_rt->rateCodeToIndex[rate]; + + /* get MCS code from rate index */ + mcs = rt2860_rates[ridx].mcs; + + /* setup TX Wireless Information */ + txwi = data->txwi; + txwi->flags = 0; + /* let HW generate seq numbers for non-QoS frames */ + txwi->xflags = qos ? 0 : RT2860_TX_NSEQ; + if (type == IEEE80211_FC0_TYPE_DATA) + txwi->wcid = IEEE80211_AID(ni->ni_associd); + else + txwi->wcid = 0xff; + txwi->len = htole16(m->m_pkthdr.len); + if (rt2860_rates[ridx].phy == IEEE80211_T_DS) { + txwi->phy = htole16(RT2860_PHY_CCK); + if (ridx != RT2860_RIDX_CCK1 && + (ic->ic_flags & IEEE80211_F_SHPREAMBLE)) + mcs |= RT2860_PHY_SHPRE; + } else + txwi->phy = htole16(RT2860_PHY_OFDM); + txwi->phy |= htole16(mcs); + + /* + * We store the MCS code into the driver-private PacketID field. + * The PacketID is latched into TX_STAT_FIFO when Tx completes so + * that we know at which initial rate the frame was transmitted. + * We add 1 to the MCS code because setting the PacketID field to + * 0 means that we don't want feedback in TX_STAT_FIFO. + */ + pid = (mcs + 1) & 0xf; + txwi->len |= htole16(pid << RT2860_TX_PID_SHIFT); + + /* check if RTS/CTS or CTS-to-self protection is required */ + if (!IEEE80211_IS_MULTICAST(wh->i_addr1) && + (m->m_pkthdr.len + IEEE80211_CRC_LEN > vap->iv_rtsthreshold || + ((ic->ic_flags & IEEE80211_F_USEPROT) && + rt2860_rates[ridx].phy == IEEE80211_T_OFDM))) + txwi->txop = RT2860_TX_TXOP_HT; + else + txwi->txop = RT2860_TX_TXOP_BACKOFF; + + if (!IEEE80211_IS_MULTICAST(wh->i_addr1) && + (!qos || (qos & IEEE80211_QOS_ACKPOLICY) != + IEEE80211_QOS_ACKPOLICY_NOACK)) { + txwi->xflags |= RT2860_TX_ACK; + + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) + dur = rt2860_rates[ridx].sp_ack_dur; + else + dur = rt2860_rates[ridx].lp_ack_dur; + *(uint16_t *)wh->i_dur = htole16(dur); + } + /* ask MAC to insert timestamp into probe responses */ + if ((wh->i_fc[0] & + (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) == + (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP)) + /* NOTE: beacons do not pass through tx_data() */ + txwi->flags |= RT2860_TX_TS; + + if (ieee80211_radiotap_active_vap(vap)) { + struct rt2860_tx_radiotap_header *tap = &sc->sc_txtap; + + tap->wt_flags = 0; + tap->wt_rate = rate; + if (mcs & RT2860_PHY_SHPRE) + tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; + + ieee80211_radiotap_tx(vap, m); + } + + pad = (hdrlen + 3) & ~3; + + /* copy and trim 802.11 header */ + memcpy(txwi + 1, wh, hdrlen); + m_adj(m, hdrlen); + + error = bus_dmamap_load_mbuf_sg(sc->txwi_dmat, data->map, m, segs, + &nsegs, 0); + if (__predict_false(error != 0 && error != EFBIG)) { + device_printf(sc->sc_dev, "can't map mbuf (error %d)\n", + error); + m_freem(m); + return error; + } + if (__predict_true(error == 0)) { + /* determine how many TXDs are required */ + ntxds = 1 + (nsegs / 2); + + if (ring->queued + ntxds >= RT2860_TX_RING_COUNT) { + /* not enough free TXDs, force mbuf defrag */ + bus_dmamap_unload(sc->txwi_dmat, data->map); + error = EFBIG; + } + } + if (__predict_false(error != 0)) { + m1 = m_defrag(m, M_DONTWAIT); + if (m1 == NULL) { + device_printf(sc->sc_dev, + "could not defragment mbuf\n"); + m_freem(m); + return ENOBUFS; + } + m = m1; + + error = bus_dmamap_load_mbuf_sg(sc->txwi_dmat, data->map, m, + segs, &nsegs, 0); + if (__predict_false(error != 0)) { + device_printf(sc->sc_dev, "can't map mbuf (error %d)\n", + error); + m_freem(m); + return error; + } + + /* determine how many TXDs are now required */ + ntxds = 1 + (nsegs / 2); + + if (ring->queued + ntxds >= RT2860_TX_RING_COUNT) { + /* this is a hopeless case, drop the mbuf! */ + bus_dmamap_unload(sc->txwi_dmat, data->map); + m_freem(m); + return ENOBUFS; + } + } + + qsel = (qid < WME_NUM_AC) ? RT2860_TX_QSEL_EDCA : RT2860_TX_QSEL_MGMT; + + /* first segment is TXWI + 802.11 header */ + txd = &ring->txd[ring->cur]; + txd->sdp0 = htole32(data->paddr); + txd->sdl0 = htole16(sizeof (struct rt2860_txwi) + pad); + txd->flags = qsel; + + /* setup payload segments */ + seg = &segs[0]; + for (i = nsegs; i >= 2; i -= 2) { + txd->sdp1 = htole32(seg->ds_addr); + txd->sdl1 = htole16(seg->ds_len); + seg++; + ring->cur = (ring->cur + 1) % RT2860_TX_RING_COUNT; + /* grab a new Tx descriptor */ + txd = &ring->txd[ring->cur]; + txd->sdp0 = htole32(seg->ds_addr); + txd->sdl0 = htole16(seg->ds_len); + txd->flags = qsel; + seg++; + } + /* finalize last segment */ + if (i > 0) { + txd->sdp1 = htole32(seg->ds_addr); + txd->sdl1 = htole16(seg->ds_len | RT2860_TX_LS1); + } else { + txd->sdl0 |= htole16(RT2860_TX_LS0); + txd->sdl1 = 0; + } + + /* remove from the free pool and link it into the SW Tx slot */ + SLIST_REMOVE_HEAD(&sc->data_pool, next); + data->m = m; + data->ni = ni; + ring->data[ring->cur] = data; + + bus_dmamap_sync(sc->txwi_dmat, sc->txwi_map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(sc->txwi_dmat, data->map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_PREWRITE); + + DPRINTFN(4, ("sending frame qid=%d wcid=%d nsegs=%d ridx=%d\n", + qid, txwi->wcid, nsegs, ridx)); + + ring->cur = (ring->cur + 1) % RT2860_TX_RING_COUNT; + ring->queued += ntxds; + if (ring->queued >= RT2860_TX_RING_COUNT) + sc->qfullmsk |= 1 << qid; + + /* kick Tx */ + RAL_WRITE(sc, RT2860_TX_CTX_IDX(qid), ring->cur); + + return 0; +} + +static int +rt2860_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, + const struct ieee80211_bpf_params *params) +{ + struct ieee80211com *ic = ni->ni_ic; + struct ifnet *ifp = ic->ic_ifp; + struct rt2860_softc *sc = ifp->if_softc; + int error; + + RAL_LOCK(sc); + + /* prevent management frames from being sent if we're not ready */ + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { + RAL_UNLOCK(sc); + m_freem(m); + ieee80211_free_node(ni); + return ENETDOWN; + } + if (params == NULL) { + /* + * Legacy path; interpret frame contents to decide + * precisely how to send the frame. + */ + error = rt2860_tx(sc, m, ni); + } else { + /* + * Caller supplied explicit parameters to use in + * sending the frame. + */ + error = rt2860_tx_raw(sc, m, ni, params); + } + if (error != 0) { + /* NB: m is reclaimed on tx failure */ + ieee80211_free_node(ni); + ifp->if_oerrors++; + } + sc->sc_tx_timer = 5; + RAL_UNLOCK(sc); + return error; +} + +static int +rt2860_tx_raw(struct rt2860_softc *sc, struct mbuf *m, + struct ieee80211_node *ni, const struct ieee80211_bpf_params *params) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = ni->ni_vap; + struct rt2860_tx_ring *ring; + struct rt2860_tx_data *data; + struct rt2860_txd *txd; + struct rt2860_txwi *txwi; + struct ieee80211_frame *wh; + struct mbuf *m1; + bus_dma_segment_t segs[RT2860_MAX_SCATTER]; + bus_dma_segment_t *seg; + u_int hdrlen; + uint16_t dur; + uint8_t type, qsel, mcs, pid, tid, qid; + int i, nsegs, ntxds, pad, rate, ridx, error; + + /* the data pool contains at least one element, pick the first */ + data = SLIST_FIRST(&sc->data_pool); + + wh = mtod(m, struct ieee80211_frame *); + hdrlen = ieee80211_hdrsize(wh); + type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + + /* Choose a TX rate index. */ + rate = params->ibp_rate0; + ridx = ic->ic_rt->rateCodeToIndex[rate]; + if (ridx == (uint8_t)-1) { + /* XXX fall back to mcast/mgmt rate? */ + m_freem(m); + return EINVAL; + } + + qid = params->ibp_pri & 3; + tid = 0; + ring = &sc->txq[qid]; + + /* get MCS code from rate index */ + mcs = rt2860_rates[ridx].mcs; + + /* setup TX Wireless Information */ + txwi = data->txwi; + txwi->flags = 0; + /* let HW generate seq numbers for non-QoS frames */ + txwi->xflags = params->ibp_pri & 3 ? 0 : RT2860_TX_NSEQ; + txwi->wcid = 0xff; + txwi->len = htole16(m->m_pkthdr.len); + if (rt2860_rates[ridx].phy == IEEE80211_T_DS) { + txwi->phy = htole16(RT2860_PHY_CCK); + if (ridx != RT2860_RIDX_CCK1 && + (ic->ic_flags & IEEE80211_F_SHPREAMBLE)) + mcs |= RT2860_PHY_SHPRE; + } else + txwi->phy = htole16(RT2860_PHY_OFDM); + txwi->phy |= htole16(mcs); + + /* + * We store the MCS code into the driver-private PacketID field. + * The PacketID is latched into TX_STAT_FIFO when Tx completes so + * that we know at which initial rate the frame was transmitted. + * We add 1 to the MCS code because setting the PacketID field to + * 0 means that we don't want feedback in TX_STAT_FIFO. + */ + pid = (mcs + 1) & 0xf; + txwi->len |= htole16(pid << RT2860_TX_PID_SHIFT); + + /* check if RTS/CTS or CTS-to-self protection is required */ + if (params->ibp_flags & IEEE80211_BPF_RTS || + params->ibp_flags & IEEE80211_BPF_CTS) + txwi->txop = RT2860_TX_TXOP_HT; + else + txwi->txop = RT2860_TX_TXOP_BACKOFF; + if ((params->ibp_flags & IEEE80211_BPF_NOACK) == 0) { + txwi->xflags |= RT2860_TX_ACK; + + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) + dur = rt2860_rates[ridx].sp_ack_dur; + else + dur = rt2860_rates[ridx].lp_ack_dur; + *(uint16_t *)wh->i_dur = htole16(dur); + } + /* ask MAC to insert timestamp into probe responses */ + if ((wh->i_fc[0] & + (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) == + (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP)) + /* NOTE: beacons do not pass through tx_data() */ + txwi->flags |= RT2860_TX_TS; + + if (ieee80211_radiotap_active_vap(vap)) { + struct rt2860_tx_radiotap_header *tap = &sc->sc_txtap; + + tap->wt_flags = 0; + tap->wt_rate = rate; + if (mcs & RT2860_PHY_SHPRE) + tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; + + ieee80211_radiotap_tx(vap, m); + } + + pad = (hdrlen + 3) & ~3; + + /* copy and trim 802.11 header */ + memcpy(txwi + 1, wh, hdrlen); + m_adj(m, hdrlen); + + error = bus_dmamap_load_mbuf_sg(sc->txwi_dmat, data->map, m, segs, + &nsegs, 0); + if (__predict_false(error != 0 && error != EFBIG)) { + device_printf(sc->sc_dev, "can't map mbuf (error %d)\n", + error); + m_freem(m); + return error; + } + if (__predict_true(error == 0)) { + /* determine how many TXDs are required */ + ntxds = 1 + (nsegs / 2); + + if (ring->queued + ntxds >= RT2860_TX_RING_COUNT) { + /* not enough free TXDs, force mbuf defrag */ + bus_dmamap_unload(sc->txwi_dmat, data->map); + error = EFBIG; + } + } + if (__predict_false(error != 0)) { + m1 = m_defrag(m, M_DONTWAIT); + if (m1 == NULL) { + device_printf(sc->sc_dev, + "could not defragment mbuf\n"); + m_freem(m); + return ENOBUFS; + } + m = m1; + + error = bus_dmamap_load_mbuf_sg(sc->txwi_dmat, data->map, m, + segs, &nsegs, 0); + if (__predict_false(error != 0)) { + device_printf(sc->sc_dev, "can't map mbuf (error %d)\n", + error); + m_freem(m); + return error; + } + + /* determine how many TXDs are now required */ + ntxds = 1 + (nsegs / 2); + + if (ring->queued + ntxds >= RT2860_TX_RING_COUNT) { + /* this is a hopeless case, drop the mbuf! */ + bus_dmamap_unload(sc->txwi_dmat, data->map); + m_freem(m); + return ENOBUFS; + } + } + + qsel = (qid < WME_NUM_AC) ? RT2860_TX_QSEL_EDCA : RT2860_TX_QSEL_MGMT; + + /* first segment is TXWI + 802.11 header */ + txd = &ring->txd[ring->cur]; + txd->sdp0 = htole32(data->paddr); + txd->sdl0 = htole16(sizeof (struct rt2860_txwi) + pad); + txd->flags = qsel; + + /* setup payload segments */ + seg = &segs[0]; + for (i = nsegs; i >= 2; i -= 2) { + txd->sdp1 = htole32(seg->ds_addr); + txd->sdl1 = htole16(seg->ds_len); + seg++; + ring->cur = (ring->cur + 1) % RT2860_TX_RING_COUNT; + /* grab a new Tx descriptor */ + txd = &ring->txd[ring->cur]; + txd->sdp0 = htole32(seg->ds_addr); + txd->sdl0 = htole16(seg->ds_len); + txd->flags = qsel; + seg++; + } + /* finalize last segment */ + if (i > 0) { + txd->sdp1 = htole32(seg->ds_addr); + txd->sdl1 = htole16(seg->ds_len | RT2860_TX_LS1); + } else { + txd->sdl0 |= htole16(RT2860_TX_LS0); + txd->sdl1 = 0; + } + + /* remove from the free pool and link it into the SW Tx slot */ + SLIST_REMOVE_HEAD(&sc->data_pool, next); + data->m = m; + data->ni = ni; + ring->data[ring->cur] = data; + + bus_dmamap_sync(sc->txwi_dmat, sc->txwi_map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(sc->txwi_dmat, data->map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_PREWRITE); + + DPRINTFN(4, ("sending frame qid=%d wcid=%d nsegs=%d ridx=%d\n", + qid, txwi->wcid, nsegs, ridx)); + + ring->cur = (ring->cur + 1) % RT2860_TX_RING_COUNT; + ring->queued += ntxds; + if (ring->queued >= RT2860_TX_RING_COUNT) + sc->qfullmsk |= 1 << qid; + + /* kick Tx */ + RAL_WRITE(sc, RT2860_TX_CTX_IDX(qid), ring->cur); + + return 0; +} + +static void +rt2860_start(struct ifnet *ifp) +{ + struct rt2860_softc *sc = ifp->if_softc; + + RAL_LOCK(sc); + rt2860_start_locked(ifp); + RAL_UNLOCK(sc); +} + +static void +rt2860_start_locked(struct ifnet *ifp) +{ + struct rt2860_softc *sc = ifp->if_softc; + struct ieee80211_node *ni; + struct mbuf *m; + + RAL_LOCK_ASSERT(sc); + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || + (ifp->if_drv_flags & IFF_DRV_OACTIVE)) + return; + + for (;;) { + if (SLIST_EMPTY(&sc->data_pool) || sc->qfullmsk != 0) { + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + break; + } + IFQ_DRV_DEQUEUE(&ifp->if_snd, m); + if (m == NULL) + break; + ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; + if (rt2860_tx(sc, m, ni) != 0) { + ieee80211_free_node(ni); + ifp->if_oerrors++; + continue; + } + sc->sc_tx_timer = 5; + } +} + +static void +rt2860_watchdog(void *arg) +{ + struct rt2860_softc *sc = arg; + struct ifnet *ifp = sc->sc_ifp; + + RAL_LOCK_ASSERT(sc); + + KASSERT(ifp->if_drv_flags & IFF_DRV_RUNNING, ("not running")); + + if (sc->sc_invalid) /* card ejected */ + return; + + if (sc->sc_tx_timer > 0 && --sc->sc_tx_timer == 0) { + if_printf(ifp, "device timeout\n"); + rt2860_stop_locked(sc); + rt2860_init_locked(sc); + ifp->if_oerrors++; + return; + } + callout_reset(&sc->watchdog_ch, hz, rt2860_watchdog, sc); +} + +static int +rt2860_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) +{ + struct rt2860_softc *sc = ifp->if_softc; + struct ieee80211com *ic = ifp->if_l2com; + struct ifreq *ifr = (struct ifreq *)data; + int error = 0, startall = 0; + + switch (cmd) { + case SIOCSIFFLAGS: + RAL_LOCK(sc); + if (ifp->if_flags & IFF_UP) { + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { + rt2860_init_locked(sc); + startall = 1; + } else + rt2860_update_promisc(ifp); + } else { + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + rt2860_stop_locked(sc); + } + RAL_UNLOCK(sc); + if (startall) + ieee80211_start_all(ic); + break; + case SIOCGIFMEDIA: + error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd); + break; + case SIOCSIFADDR: + error = ether_ioctl(ifp, cmd, data); + break; + default: + error = EINVAL; + break; + } + return error; +} + +/* + * Reading and writing from/to the BBP is different from RT2560 and RT2661. + * We access the BBP through the 8051 microcontroller unit which means that + * the microcode must be loaded first. + */ +void +rt2860_mcu_bbp_write(struct rt2860_softc *sc, uint8_t reg, uint8_t val) +{ + int ntries; + + for (ntries = 0; ntries < 100; ntries++) { + if (!(RAL_READ(sc, RT2860_H2M_BBPAGENT) & RT2860_BBP_CSR_KICK)) + break; + DELAY(1); + } + if (ntries == 100) { + device_printf(sc->sc_dev, + "could not write to BBP through MCU\n"); + return; + } + + RAL_WRITE(sc, RT2860_H2M_BBPAGENT, RT2860_BBP_RW_PARALLEL | + RT2860_BBP_CSR_KICK | reg << 8 | val); + RAL_BARRIER_WRITE(sc); + + rt2860_mcu_cmd(sc, RT2860_MCU_CMD_BBP, 0, 0); + DELAY(1000); +} + +uint8_t +rt2860_mcu_bbp_read(struct rt2860_softc *sc, uint8_t reg) +{ + uint32_t val; + int ntries; + + for (ntries = 0; ntries < 100; ntries++) { + if (!(RAL_READ(sc, RT2860_H2M_BBPAGENT) & RT2860_BBP_CSR_KICK)) + break; + DELAY(1); + } + if (ntries == 100) { + device_printf(sc->sc_dev, + "could not read from BBP through MCU\n"); + return 0; + } + + RAL_WRITE(sc, RT2860_H2M_BBPAGENT, RT2860_BBP_RW_PARALLEL | + RT2860_BBP_CSR_KICK | RT2860_BBP_CSR_READ | reg << 8); + RAL_BARRIER_WRITE(sc); + + rt2860_mcu_cmd(sc, RT2860_MCU_CMD_BBP, 0, 0); + DELAY(1000); + + for (ntries = 0; ntries < 100; ntries++) { + val = RAL_READ(sc, RT2860_H2M_BBPAGENT); + if (!(val & RT2860_BBP_CSR_KICK)) + return val & 0xff; + DELAY(1); + } + device_printf(sc->sc_dev, "could not read from BBP through MCU\n"); + + return 0; +} + +/* + * Write to one of the 4 programmable 24-bit RF registers. + */ +static void +rt2860_rf_write(struct rt2860_softc *sc, uint8_t reg, uint32_t val) +{ + uint32_t tmp; + int ntries; + + for (ntries = 0; ntries < 100; ntries++) { + if (!(RAL_READ(sc, RT2860_RF_CSR_CFG0) & RT2860_RF_REG_CTRL)) + break; + DELAY(1); + } + if (ntries == 100) { + device_printf(sc->sc_dev, "could not write to RF\n"); + return; + } + + /* RF registers are 24-bit on the RT2860 */ + tmp = RT2860_RF_REG_CTRL | 24 << RT2860_RF_REG_WIDTH_SHIFT | + (val & 0x3fffff) << 2 | (reg & 3); + RAL_WRITE(sc, RT2860_RF_CSR_CFG0, tmp); +} + +static uint8_t +rt3090_rf_read(struct rt2860_softc *sc, uint8_t reg) +{ + uint32_t tmp; + int ntries; + + for (ntries = 0; ntries < 100; ntries++) { + if (!(RAL_READ(sc, RT3070_RF_CSR_CFG) & RT3070_RF_KICK)) + break; + DELAY(1); + } + if (ntries == 100) { + device_printf(sc->sc_dev, "could not read RF register\n"); + return 0xff; + } + tmp = RT3070_RF_KICK | reg << 8; + RAL_WRITE(sc, RT3070_RF_CSR_CFG, tmp); + + for (ntries = 0; ntries < 100; ntries++) { + tmp = RAL_READ(sc, RT3070_RF_CSR_CFG); + if (!(tmp & RT3070_RF_KICK)) + break; + DELAY(1); + } + if (ntries == 100) { + device_printf(sc->sc_dev, "could not read RF register\n"); + return 0xff; + } + return tmp & 0xff; +} + +void +rt3090_rf_write(struct rt2860_softc *sc, uint8_t reg, uint8_t val) +{ + uint32_t tmp; + int ntries; + + for (ntries = 0; ntries < 10; ntries++) { + if (!(RAL_READ(sc, RT3070_RF_CSR_CFG) & RT3070_RF_KICK)) + break; + DELAY(10); + } + if (ntries == 10) { + device_printf(sc->sc_dev, "could not write to RF\n"); + return; + } + + tmp = RT3070_RF_WRITE | RT3070_RF_KICK | reg << 8 | val; + RAL_WRITE(sc, RT3070_RF_CSR_CFG, tmp); +} + +/* + * Send a command to the 8051 microcontroller unit. + */ +int +rt2860_mcu_cmd(struct rt2860_softc *sc, uint8_t cmd, uint16_t arg, int wait) +{ + int slot, ntries; + uint32_t tmp; + uint8_t cid; + + for (ntries = 0; ntries < 100; ntries++) { + if (!(RAL_READ(sc, RT2860_H2M_MAILBOX) & RT2860_H2M_BUSY)) + break; + DELAY(2); + } + if (ntries == 100) + return EIO; + + cid = wait ? cmd : RT2860_TOKEN_NO_INTR; + RAL_WRITE(sc, RT2860_H2M_MAILBOX, RT2860_H2M_BUSY | cid << 16 | arg); + RAL_BARRIER_WRITE(sc); + RAL_WRITE(sc, RT2860_HOST_CMD, cmd); + + if (!wait) + return 0; + /* wait for the command to complete */ + for (ntries = 0; ntries < 200; ntries++) { + tmp = RAL_READ(sc, RT2860_H2M_MAILBOX_CID); + /* find the command slot */ + for (slot = 0; slot < 4; slot++, tmp >>= 8) + if ((tmp & 0xff) == cid) + break; + if (slot < 4) + break; + DELAY(100); + } + if (ntries == 200) { + /* clear command and status */ + RAL_WRITE(sc, RT2860_H2M_MAILBOX_STATUS, 0xffffffff); + RAL_WRITE(sc, RT2860_H2M_MAILBOX_CID, 0xffffffff); + return ETIMEDOUT; + } + /* get command status (1 means success) */ + tmp = RAL_READ(sc, RT2860_H2M_MAILBOX_STATUS); + tmp = (tmp >> (slot * 8)) & 0xff; + DPRINTF(("MCU command=0x%02x slot=%d status=0x%02x\n", + cmd, slot, tmp)); + /* clear command and status */ + RAL_WRITE(sc, RT2860_H2M_MAILBOX_STATUS, 0xffffffff); + RAL_WRITE(sc, RT2860_H2M_MAILBOX_CID, 0xffffffff); + return (tmp == 1) ? 0 : EIO; +} + +static void +rt2860_enable_mrr(struct rt2860_softc *sc) +{ +#define CCK(mcs) (mcs) +#define OFDM(mcs) (1 << 3 | (mcs)) + RAL_WRITE(sc, RT2860_LG_FBK_CFG0, + OFDM(6) << 28 | /* 54->48 */ + OFDM(5) << 24 | /* 48->36 */ + OFDM(4) << 20 | /* 36->24 */ + OFDM(3) << 16 | /* 24->18 */ + OFDM(2) << 12 | /* 18->12 */ + OFDM(1) << 8 | /* 12-> 9 */ + OFDM(0) << 4 | /* 9-> 6 */ + OFDM(0)); /* 6-> 6 */ + + RAL_WRITE(sc, RT2860_LG_FBK_CFG1, + CCK(2) << 12 | /* 11->5.5 */ + CCK(1) << 8 | /* 5.5-> 2 */ + CCK(0) << 4 | /* 2-> 1 */ + CCK(0)); /* 1-> 1 */ +#undef OFDM +#undef CCK +} + +static void +rt2860_set_txpreamble(struct rt2860_softc *sc) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint32_t tmp; + + tmp = RAL_READ(sc, RT2860_AUTO_RSP_CFG); + tmp &= ~RT2860_CCK_SHORT_EN; + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) + tmp |= RT2860_CCK_SHORT_EN; + RAL_WRITE(sc, RT2860_AUTO_RSP_CFG, tmp); +} + +void +rt2860_set_basicrates(struct rt2860_softc *sc, + const struct ieee80211_rateset *rs) +{ +#define RV(r) ((r) & IEEE80211_RATE_VAL) + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint32_t mask = 0; + uint8_t rate; + int i; + + for (i = 0; i < rs->rs_nrates; i++) { + rate = rs->rs_rates[i]; + + if (!(rate & IEEE80211_RATE_BASIC)) + continue; + + mask |= 1 << ic->ic_rt->rateCodeToIndex[RV(rate)]; + } + + RAL_WRITE(sc, RT2860_LEGACY_BASIC_RATE, mask); +#undef RV +} + +static void +rt2860_scan_start(struct ieee80211com *ic) +{ + struct ifnet *ifp = ic->ic_ifp; + struct rt2860_softc *sc = ifp->if_softc; + uint32_t tmp; + + tmp = RAL_READ(sc, RT2860_BCN_TIME_CFG); + RAL_WRITE(sc, RT2860_BCN_TIME_CFG, + tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN | + RT2860_TBTT_TIMER_EN)); + rt2860_set_gp_timer(sc, 0); +} + +static void +rt2860_scan_end(struct ieee80211com *ic) +{ + struct ifnet *ifp = ic->ic_ifp; + struct rt2860_softc *sc = ifp->if_softc; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + + if (vap->iv_state == IEEE80211_S_RUN) { + rt2860_enable_tsf_sync(sc); + rt2860_set_gp_timer(sc, 500); + } +} + +static void +rt2860_set_channel(struct ieee80211com *ic) +{ + struct ifnet *ifp = ic->ic_ifp; + struct rt2860_softc *sc = ifp->if_softc; + + RAL_LOCK(sc); + rt2860_switch_chan(sc, ic->ic_curchan); + RAL_UNLOCK(sc); +} + +static void +rt2860_select_chan_group(struct rt2860_softc *sc, int group) +{ + uint32_t tmp; + uint8_t agc; + + rt2860_mcu_bbp_write(sc, 62, 0x37 - sc->lna[group]); + rt2860_mcu_bbp_write(sc, 63, 0x37 - sc->lna[group]); + rt2860_mcu_bbp_write(sc, 64, 0x37 - sc->lna[group]); + rt2860_mcu_bbp_write(sc, 86, 0x00); + + if (group == 0) { + if (sc->ext_2ghz_lna) { + rt2860_mcu_bbp_write(sc, 82, 0x62); + rt2860_mcu_bbp_write(sc, 75, 0x46); + } else { + rt2860_mcu_bbp_write(sc, 82, 0x84); + rt2860_mcu_bbp_write(sc, 75, 0x50); + } + } else { + if (sc->ext_5ghz_lna) { + rt2860_mcu_bbp_write(sc, 82, 0xf2); + rt2860_mcu_bbp_write(sc, 75, 0x46); + } else { + rt2860_mcu_bbp_write(sc, 82, 0xf2); + rt2860_mcu_bbp_write(sc, 75, 0x50); + } + } + + tmp = RAL_READ(sc, RT2860_TX_BAND_CFG); + tmp &= ~(RT2860_5G_BAND_SEL_N | RT2860_5G_BAND_SEL_P); + tmp |= (group == 0) ? RT2860_5G_BAND_SEL_N : RT2860_5G_BAND_SEL_P; + RAL_WRITE(sc, RT2860_TX_BAND_CFG, tmp); + + /* enable appropriate Power Amplifiers and Low Noise Amplifiers */ + tmp = RT2860_RFTR_EN | RT2860_TRSW_EN | RT2860_LNA_PE0_EN; + if (sc->nrxchains > 1) + tmp |= RT2860_LNA_PE1_EN; + if (sc->mac_ver == 0x3593 && sc->nrxchains > 2) + tmp |= RT3593_LNA_PE2_EN; + if (group == 0) { /* 2GHz */ + tmp |= RT2860_PA_PE_G0_EN; + if (sc->ntxchains > 1) + tmp |= RT2860_PA_PE_G1_EN; + if (sc->mac_ver == 0x3593 && sc->ntxchains > 2) + tmp |= RT3593_PA_PE_G2_EN; + } else { /* 5GHz */ + tmp |= RT2860_PA_PE_A0_EN; + if (sc->ntxchains > 1) + tmp |= RT2860_PA_PE_A1_EN; + if (sc->mac_ver == 0x3593 && sc->ntxchains > 2) + tmp |= RT3593_PA_PE_A2_EN; + } + RAL_WRITE(sc, RT2860_TX_PIN_CFG, tmp); + + if (sc->mac_ver == 0x3593) { + tmp = RAL_READ(sc, RT2860_GPIO_CTRL); + if (sc->sc_flags & RT2860_PCIE) { + tmp &= ~0x01010000; + if (group == 0) + tmp |= 0x00010000; + } else { + tmp &= ~0x00008080; + if (group == 0) + tmp |= 0x00000080; + } + tmp = (tmp & ~0x00001000) | 0x00000010; + RAL_WRITE(sc, RT2860_GPIO_CTRL, tmp); + } + + /* set initial AGC value */ + if (group == 0) { /* 2GHz band */ + if (sc->mac_ver >= 0x3071) + agc = 0x1c + sc->lna[0] * 2; + else + agc = 0x2e + sc->lna[0]; + } else { /* 5GHz band */ + agc = 0x32 + (sc->lna[group] * 5) / 3; + } + rt2860_mcu_bbp_write(sc, 66, agc); + + DELAY(1000); +} + +static void +rt2860_set_chan(struct rt2860_softc *sc, u_int chan) +{ + const struct rfprog *rfprog = rt2860_rf2850; + uint32_t r2, r3, r4; + int8_t txpow1, txpow2; + u_int i; + + /* find the settings for this channel (we know it exists) */ + for (i = 0; rfprog[i].chan != chan; i++); + + r2 = rfprog[i].r2; + if (sc->ntxchains == 1) + r2 |= 1 << 12; /* 1T: disable Tx chain 2 */ + if (sc->nrxchains == 1) + r2 |= 1 << 15 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */ + else if (sc->nrxchains == 2) + r2 |= 1 << 4; /* 2R: disable Rx chain 3 */ + + /* use Tx power values from EEPROM */ + txpow1 = sc->txpow1[i]; + txpow2 = sc->txpow2[i]; + if (chan > 14) { + if (txpow1 >= 0) + txpow1 = txpow1 << 1 | 1; + else + txpow1 = (7 + txpow1) << 1; + if (txpow2 >= 0) + txpow2 = txpow2 << 1 | 1; + else + txpow2 = (7 + txpow2) << 1; + } + r3 = rfprog[i].r3 | txpow1 << 7; + r4 = rfprog[i].r4 | sc->freq << 13 | txpow2 << 4; + + rt2860_rf_write(sc, RT2860_RF1, rfprog[i].r1); + rt2860_rf_write(sc, RT2860_RF2, r2); + rt2860_rf_write(sc, RT2860_RF3, r3); + rt2860_rf_write(sc, RT2860_RF4, r4); + + DELAY(200); + + rt2860_rf_write(sc, RT2860_RF1, rfprog[i].r1); + rt2860_rf_write(sc, RT2860_RF2, r2); + rt2860_rf_write(sc, RT2860_RF3, r3 | 1); + rt2860_rf_write(sc, RT2860_RF4, r4); + + DELAY(200); + + rt2860_rf_write(sc, RT2860_RF1, rfprog[i].r1); + rt2860_rf_write(sc, RT2860_RF2, r2); + rt2860_rf_write(sc, RT2860_RF3, r3); + rt2860_rf_write(sc, RT2860_RF4, r4); +} + +static void +rt3090_set_chan(struct rt2860_softc *sc, u_int chan) +{ + int8_t txpow1, txpow2; + uint8_t rf; + int i; + + /* RT3090 is 2GHz only */ + KASSERT(chan >= 1 && chan <= 14, ("chan %d not support", chan)); + + /* find the settings for this channel (we know it exists) */ + for (i = 0; rt2860_rf2850[i].chan != chan; i++); + + /* use Tx power values from EEPROM */ + txpow1 = sc->txpow1[i]; + txpow2 = sc->txpow2[i]; + + rt3090_rf_write(sc, 2, rt3090_freqs[i].n); + rf = rt3090_rf_read(sc, 3); + rf = (rf & ~0x0f) | rt3090_freqs[i].k; + rt3090_rf_write(sc, 3, rf); + rf = rt3090_rf_read(sc, 6); + rf = (rf & ~0x03) | rt3090_freqs[i].r; + rt3090_rf_write(sc, 6, rf); + + /* set Tx0 power */ + rf = rt3090_rf_read(sc, 12); + rf = (rf & ~0x1f) | txpow1; + rt3090_rf_write(sc, 12, rf); + + /* set Tx1 power */ + rf = rt3090_rf_read(sc, 13); + rf = (rf & ~0x1f) | txpow2; + rt3090_rf_write(sc, 13, rf); + + rf = rt3090_rf_read(sc, 1); + rf &= ~0xfc; + if (sc->ntxchains == 1) + rf |= RT3070_TX1_PD | RT3070_TX2_PD; + else if (sc->ntxchains == 2) + rf |= RT3070_TX2_PD; + if (sc->nrxchains == 1) + rf |= RT3070_RX1_PD | RT3070_RX2_PD; + else if (sc->nrxchains == 2) + rf |= RT3070_RX2_PD; + rt3090_rf_write(sc, 1, rf); + + /* set RF offset */ + rf = rt3090_rf_read(sc, 23); + rf = (rf & ~0x7f) | sc->freq; + rt3090_rf_write(sc, 23, rf); + + /* program RF filter */ + rf = rt3090_rf_read(sc, 24); /* Tx */ + rf = (rf & ~0x3f) | sc->rf24_20mhz; + rt3090_rf_write(sc, 24, rf); + rf = rt3090_rf_read(sc, 31); /* Rx */ + rf = (rf & ~0x3f) | sc->rf24_20mhz; + rt3090_rf_write(sc, 31, rf); + + /* enable RF tuning */ + rf = rt3090_rf_read(sc, 7); + rt3090_rf_write(sc, 7, rf | RT3070_TUNE); +} + +static int +rt3090_rf_init(struct rt2860_softc *sc) +{ +#define N(a) (sizeof (a) / sizeof ((a)[0])) + uint32_t tmp; + uint8_t rf, bbp; + int i; + + rf = rt3090_rf_read(sc, 30); + /* toggle RF R30 bit 7 */ + rt3090_rf_write(sc, 30, rf | 0x80); + DELAY(1000); + rt3090_rf_write(sc, 30, rf & ~0x80); + + tmp = RAL_READ(sc, RT3070_LDO_CFG0); + tmp &= ~0x1f000000; + if (sc->patch_dac && sc->mac_rev < 0x0211) + tmp |= 0x0d000000; /* 1.35V */ + else + tmp |= 0x01000000; /* 1.2V */ + RAL_WRITE(sc, RT3070_LDO_CFG0, tmp); + + /* patch LNA_PE_G1 */ + tmp = RAL_READ(sc, RT3070_GPIO_SWITCH); + RAL_WRITE(sc, RT3070_GPIO_SWITCH, tmp & ~0x20); + + /* initialize RF registers to default value */ + for (i = 0; i < N(rt3090_def_rf); i++) { + rt3090_rf_write(sc, rt3090_def_rf[i].reg, + rt3090_def_rf[i].val); + } + + /* select 20MHz bandwidth */ + rt3090_rf_write(sc, 31, 0x14); + + rf = rt3090_rf_read(sc, 6); + rt3090_rf_write(sc, 6, rf | 0x40); + + if (sc->mac_ver != 0x3593) { + /* calibrate filter for 20MHz bandwidth */ + sc->rf24_20mhz = 0x1f; /* default value */ + rt3090_filter_calib(sc, 0x07, 0x16, &sc->rf24_20mhz); + + /* select 40MHz bandwidth */ + bbp = rt2860_mcu_bbp_read(sc, 4); + rt2860_mcu_bbp_write(sc, 4, (bbp & ~0x08) | 0x10); + rf = rt3090_rf_read(sc, 31); + rt3090_rf_write(sc, 31, rf | 0x20); + + /* calibrate filter for 40MHz bandwidth */ + sc->rf24_40mhz = 0x2f; /* default value */ + rt3090_filter_calib(sc, 0x27, 0x19, &sc->rf24_40mhz); + + /* go back to 20MHz bandwidth */ + bbp = rt2860_mcu_bbp_read(sc, 4); + rt2860_mcu_bbp_write(sc, 4, bbp & ~0x18); + } + if (sc->mac_rev < 0x0211) + rt3090_rf_write(sc, 27, 0x03); + + tmp = RAL_READ(sc, RT3070_OPT_14); + RAL_WRITE(sc, RT3070_OPT_14, tmp | 1); + + if (sc->rf_rev == RT3070_RF_3020) + rt3090_set_rx_antenna(sc, 0); + + bbp = rt2860_mcu_bbp_read(sc, 138); + if (sc->mac_ver == 0x3593) { + if (sc->ntxchains == 1) + bbp |= 0x60; /* turn off DAC1 and DAC2 */ + else if (sc->ntxchains == 2) + bbp |= 0x40; /* turn off DAC2 */ + if (sc->nrxchains == 1) + bbp &= ~0x06; /* turn off ADC1 and ADC2 */ + else if (sc->nrxchains == 2) + bbp &= ~0x04; /* turn off ADC2 */ + } else { + if (sc->ntxchains == 1) + bbp |= 0x20; /* turn off DAC1 */ + if (sc->nrxchains == 1) + bbp &= ~0x02; /* turn off ADC1 */ + } + rt2860_mcu_bbp_write(sc, 138, bbp); + + rf = rt3090_rf_read(sc, 1); + rf &= ~(RT3070_RX0_PD | RT3070_TX0_PD); + rf |= RT3070_RF_BLOCK | RT3070_RX1_PD | RT3070_TX1_PD; + rt3090_rf_write(sc, 1, rf); + + rf = rt3090_rf_read(sc, 15); + rt3090_rf_write(sc, 15, rf & ~RT3070_TX_LO2); + + rf = rt3090_rf_read(sc, 17); + rf &= ~RT3070_TX_LO1; + if (sc->mac_rev >= 0x0211 && !sc->ext_2ghz_lna) + rf |= 0x20; /* fix for long range Rx issue */ + if (sc->txmixgain_2ghz >= 2) + rf = (rf & ~0x7) | sc->txmixgain_2ghz; + rt3090_rf_write(sc, 17, rf); + + rf = rt3090_rf_read(sc, 20); + rt3090_rf_write(sc, 20, rf & ~RT3070_RX_LO1); + + rf = rt3090_rf_read(sc, 21); + rt3090_rf_write(sc, 21, rf & ~RT3070_RX_LO2); + + return 0; +#undef N +} + +void +rt3090_rf_wakeup(struct rt2860_softc *sc) +{ + uint32_t tmp; + uint8_t rf; + + if (sc->mac_ver == 0x3593) { + /* enable VCO */ + rf = rt3090_rf_read(sc, 1); + rt3090_rf_write(sc, 1, rf | RT3593_VCO); + + /* initiate VCO calibration */ + rf = rt3090_rf_read(sc, 3); + rt3090_rf_write(sc, 3, rf | RT3593_VCOCAL); + + /* enable VCO bias current control */ + rf = rt3090_rf_read(sc, 6); + rt3090_rf_write(sc, 6, rf | RT3593_VCO_IC); + + /* initiate res calibration */ + rf = rt3090_rf_read(sc, 2); + rt3090_rf_write(sc, 2, rf | RT3593_RESCAL); + + /* set reference current control to 0.33 mA */ + rf = rt3090_rf_read(sc, 22); + rf &= ~RT3593_CP_IC_MASK; + rf |= 1 << RT3593_CP_IC_SHIFT; + rt3090_rf_write(sc, 22, rf); + + /* enable RX CTB */ + rf = rt3090_rf_read(sc, 46); + rt3090_rf_write(sc, 46, rf | RT3593_RX_CTB); + + rf = rt3090_rf_read(sc, 20); + rf &= ~(RT3593_LDO_RF_VC_MASK | RT3593_LDO_PLL_VC_MASK); + rt3090_rf_write(sc, 20, rf); + } else { + /* enable RF block */ + rf = rt3090_rf_read(sc, 1); + rt3090_rf_write(sc, 1, rf | RT3070_RF_BLOCK); + + /* enable VCO bias current control */ + rf = rt3090_rf_read(sc, 7); + rt3090_rf_write(sc, 7, rf | 0x30); + + rf = rt3090_rf_read(sc, 9); + rt3090_rf_write(sc, 9, rf | 0x0e); + + /* enable RX CTB */ + rf = rt3090_rf_read(sc, 21); + rt3090_rf_write(sc, 21, rf | RT3070_RX_CTB); + + /* fix Tx to Rx IQ glitch by raising RF voltage */ + rf = rt3090_rf_read(sc, 27); + rf &= ~0x77; + if (sc->mac_rev < 0x0211) + rf |= 0x03; + rt3090_rf_write(sc, 27, rf); + } + if (sc->patch_dac && sc->mac_rev < 0x0211) { + tmp = RAL_READ(sc, RT3070_LDO_CFG0); + tmp = (tmp & ~0x1f000000) | 0x0d000000; + RAL_WRITE(sc, RT3070_LDO_CFG0, tmp); + } +} + +int +rt3090_filter_calib(struct rt2860_softc *sc, uint8_t init, uint8_t target, + uint8_t *val) +{ + uint8_t rf22, rf24; + uint8_t bbp55_pb, bbp55_sb, delta; + int ntries; + + /* program filter */ + rf24 = rt3090_rf_read(sc, 24); + rf24 = (rf24 & 0xc0) | init; /* initial filter value */ + rt3090_rf_write(sc, 24, rf24); + + /* enable baseband loopback mode */ + rf22 = rt3090_rf_read(sc, 22); + rt3090_rf_write(sc, 22, rf22 | RT3070_BB_LOOPBACK); + + /* set power and frequency of passband test tone */ + rt2860_mcu_bbp_write(sc, 24, 0x00); + for (ntries = 0; ntries < 100; ntries++) { + /* transmit test tone */ + rt2860_mcu_bbp_write(sc, 25, 0x90); + DELAY(1000); + /* read received power */ + bbp55_pb = rt2860_mcu_bbp_read(sc, 55); + if (bbp55_pb != 0) + break; + } + if (ntries == 100) + return ETIMEDOUT; + + /* set power and frequency of stopband test tone */ + rt2860_mcu_bbp_write(sc, 24, 0x06); + for (ntries = 0; ntries < 100; ntries++) { + /* transmit test tone */ + rt2860_mcu_bbp_write(sc, 25, 0x90); + DELAY(1000); + /* read received power */ + bbp55_sb = rt2860_mcu_bbp_read(sc, 55); + + delta = bbp55_pb - bbp55_sb; + if (delta > target) + break; + + /* reprogram filter */ + rf24++; + rt3090_rf_write(sc, 24, rf24); + } + if (ntries < 100) { + if (rf24 != init) + rf24--; /* backtrack */ + *val = rf24; + rt3090_rf_write(sc, 24, rf24); + } + + /* restore initial state */ + rt2860_mcu_bbp_write(sc, 24, 0x00); + + /* disable baseband loopback mode */ + rf22 = rt3090_rf_read(sc, 22); + rt3090_rf_write(sc, 22, rf22 & ~RT3070_BB_LOOPBACK); + + return 0; +} + +static void +rt3090_rf_setup(struct rt2860_softc *sc) +{ + uint8_t bbp; + int i; + + if (sc->mac_rev >= 0x0211) { + /* enable DC filter */ + rt2860_mcu_bbp_write(sc, 103, 0xc0); + + /* improve power consumption */ + bbp = rt2860_mcu_bbp_read(sc, 31); + rt2860_mcu_bbp_write(sc, 31, bbp & ~0x03); + } + + RAL_WRITE(sc, RT2860_TX_SW_CFG1, 0); + if (sc->mac_rev < 0x0211) { + RAL_WRITE(sc, RT2860_TX_SW_CFG2, + sc->patch_dac ? 0x2c : 0x0f); + } else + RAL_WRITE(sc, RT2860_TX_SW_CFG2, 0); + + /* initialize RF registers from ROM */ + for (i = 0; i < 10; i++) { + if (sc->rf[i].reg == 0 || sc->rf[i].reg == 0xff) + continue; + rt3090_rf_write(sc, sc->rf[i].reg, sc->rf[i].val); + } +} + +static void +rt2860_set_leds(struct rt2860_softc *sc, uint16_t which) +{ + rt2860_mcu_cmd(sc, RT2860_MCU_CMD_LEDS, + which | (sc->leds & 0x7f), 0); +} + +/* + * Hardware has a general-purpose programmable timer interrupt that can + * periodically raise MAC_INT_4. + */ +static void +rt2860_set_gp_timer(struct rt2860_softc *sc, int ms) +{ + uint32_t tmp; + + /* disable GP timer before reprogramming it */ + tmp = RAL_READ(sc, RT2860_INT_TIMER_EN); + RAL_WRITE(sc, RT2860_INT_TIMER_EN, tmp & ~RT2860_GP_TIMER_EN); + + if (ms == 0) + return; + + tmp = RAL_READ(sc, RT2860_INT_TIMER_CFG); + ms *= 16; /* Unit: 64us */ + tmp = (tmp & 0xffff) | ms << RT2860_GP_TIMER_SHIFT; + RAL_WRITE(sc, RT2860_INT_TIMER_CFG, tmp); + + /* enable GP timer */ + tmp = RAL_READ(sc, RT2860_INT_TIMER_EN); + RAL_WRITE(sc, RT2860_INT_TIMER_EN, tmp | RT2860_GP_TIMER_EN); +} + +static void +rt2860_set_bssid(struct rt2860_softc *sc, const uint8_t *bssid) +{ + RAL_WRITE(sc, RT2860_MAC_BSSID_DW0, + bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24); + RAL_WRITE(sc, RT2860_MAC_BSSID_DW1, + bssid[4] | bssid[5] << 8); +} + +static void +rt2860_set_macaddr(struct rt2860_softc *sc, const uint8_t *addr) +{ + RAL_WRITE(sc, RT2860_MAC_ADDR_DW0, + addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24); + RAL_WRITE(sc, RT2860_MAC_ADDR_DW1, + addr[4] | addr[5] << 8 | 0xff << 16); +} + +static void +rt2860_updateslot(struct ifnet *ifp) +{ + struct rt2860_softc *sc = ifp->if_softc; + struct ieee80211com *ic = ifp->if_l2com; + uint32_t tmp; + + tmp = RAL_READ(sc, RT2860_BKOFF_SLOT_CFG); + tmp &= ~0xff; + tmp |= (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20; + RAL_WRITE(sc, RT2860_BKOFF_SLOT_CFG, tmp); +} + +static void +rt2860_updateprot(struct ifnet *ifp) +{ + struct rt2860_softc *sc = ifp->if_softc; + struct ieee80211com *ic = ifp->if_l2com; + uint32_t tmp; + + tmp = RT2860_RTSTH_EN | RT2860_PROT_NAV_SHORT | RT2860_TXOP_ALLOW_ALL; + /* setup protection frame rate (MCS code) */ + tmp |= IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? + rt2860_rates[RT2860_RIDX_OFDM6].mcs : + rt2860_rates[RT2860_RIDX_CCK11].mcs; + + /* CCK frames don't require protection */ + RAL_WRITE(sc, RT2860_CCK_PROT_CFG, tmp); + + if (ic->ic_flags & IEEE80211_F_USEPROT) { + if (ic->ic_protmode == IEEE80211_PROT_RTSCTS) + tmp |= RT2860_PROT_CTRL_RTS_CTS; + else if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) + tmp |= RT2860_PROT_CTRL_CTS; + } + RAL_WRITE(sc, RT2860_OFDM_PROT_CFG, tmp); +} + +static void +rt2860_update_promisc(struct ifnet *ifp) +{ + struct rt2860_softc *sc = ifp->if_softc; + uint32_t tmp; + + tmp = RAL_READ(sc, RT2860_RX_FILTR_CFG); + tmp &= ~RT2860_DROP_NOT_MYBSS; + if (!(ifp->if_flags & IFF_PROMISC)) + tmp |= RT2860_DROP_NOT_MYBSS; + RAL_WRITE(sc, RT2860_RX_FILTR_CFG, tmp); +} + +static int +rt2860_updateedca(struct ieee80211com *ic) +{ + struct rt2860_softc *sc = ic->ic_ifp->if_softc; + const struct wmeParams *wmep; + int aci; + + wmep = ic->ic_wme.wme_chanParams.cap_wmeParams; + + /* update MAC TX configuration registers */ + for (aci = 0; aci < WME_NUM_AC; aci++) { + RAL_WRITE(sc, RT2860_EDCA_AC_CFG(aci), + wmep[aci].wmep_logcwmax << 16 | + wmep[aci].wmep_logcwmin << 12 | + wmep[aci].wmep_aifsn << 8 | + wmep[aci].wmep_txopLimit); + } + + /* update SCH/DMA registers too */ + RAL_WRITE(sc, RT2860_WMM_AIFSN_CFG, + wmep[WME_AC_VO].wmep_aifsn << 12 | + wmep[WME_AC_VI].wmep_aifsn << 8 | + wmep[WME_AC_BK].wmep_aifsn << 4 | + wmep[WME_AC_BE].wmep_aifsn); + RAL_WRITE(sc, RT2860_WMM_CWMIN_CFG, + wmep[WME_AC_VO].wmep_logcwmin << 12 | + wmep[WME_AC_VI].wmep_logcwmin << 8 | + wmep[WME_AC_BK].wmep_logcwmin << 4 | + wmep[WME_AC_BE].wmep_logcwmin); + RAL_WRITE(sc, RT2860_WMM_CWMAX_CFG, + wmep[WME_AC_VO].wmep_logcwmax << 12 | + wmep[WME_AC_VI].wmep_logcwmax << 8 | + wmep[WME_AC_BK].wmep_logcwmax << 4 | + wmep[WME_AC_BE].wmep_logcwmax); + RAL_WRITE(sc, RT2860_WMM_TXOP0_CFG, + wmep[WME_AC_BK].wmep_txopLimit << 16 | + wmep[WME_AC_BE].wmep_txopLimit); + RAL_WRITE(sc, RT2860_WMM_TXOP1_CFG, + wmep[WME_AC_VO].wmep_txopLimit << 16 | + wmep[WME_AC_VI].wmep_txopLimit); + + return 0; +} + +#ifdef HW_CRYPTO +static int +rt2860_set_key(struct ieee80211com *ic, struct ieee80211_node *ni, + struct ieee80211_key *k) +{ + struct rt2860_softc *sc = ic->ic_softc; + bus_size_t base; + uint32_t attr; + uint8_t mode, wcid, iv[8]; + + /* defer setting of WEP keys until interface is brought up */ + if ((ic->ic_if.if_flags & (IFF_UP | IFF_RUNNING)) != + (IFF_UP | IFF_RUNNING)) + return 0; + + /* map net80211 cipher to RT2860 security mode */ + switch (k->k_cipher) { + case IEEE80211_CIPHER_WEP40: + mode = RT2860_MODE_WEP40; + break; + case IEEE80211_CIPHER_WEP104: + mode = RT2860_MODE_WEP104; + break; + case IEEE80211_CIPHER_TKIP: + mode = RT2860_MODE_TKIP; + break; + case IEEE80211_CIPHER_CCMP: + mode = RT2860_MODE_AES_CCMP; + break; + default: + return EINVAL; + } + + if (k->k_flags & IEEE80211_KEY_GROUP) { + wcid = 0; /* NB: update WCID0 for group keys */ + base = RT2860_SKEY(0, k->k_id); + } else { + wcid = ((struct rt2860_node *)ni)->wcid; + base = RT2860_PKEY(wcid); + } + + if (k->k_cipher == IEEE80211_CIPHER_TKIP) { + RAL_WRITE_REGION_1(sc, base, k->k_key, 16); +#ifndef IEEE80211_STA_ONLY + if (ic->ic_opmode == IEEE80211_M_HOSTAP) { + RAL_WRITE_REGION_1(sc, base + 16, &k->k_key[16], 8); + RAL_WRITE_REGION_1(sc, base + 24, &k->k_key[24], 8); + } else +#endif + { + RAL_WRITE_REGION_1(sc, base + 16, &k->k_key[24], 8); + RAL_WRITE_REGION_1(sc, base + 24, &k->k_key[16], 8); + } + } else + RAL_WRITE_REGION_1(sc, base, k->k_key, k->k_len); + + if (!(k->k_flags & IEEE80211_KEY_GROUP) || + (k->k_flags & IEEE80211_KEY_TX)) { + /* set initial packet number in IV+EIV */ + if (k->k_cipher == IEEE80211_CIPHER_WEP40 || + k->k_cipher == IEEE80211_CIPHER_WEP104) { + uint32_t val = arc4random(); + /* skip weak IVs from Fluhrer/Mantin/Shamir */ + if (val >= 0x03ff00 && (val & 0xf8ff00) == 0x00ff00) + val += 0x000100; + iv[0] = val; + iv[1] = val >> 8; + iv[2] = val >> 16; + iv[3] = k->k_id << 6; + iv[4] = iv[5] = iv[6] = iv[7] = 0; + } else { + if (k->k_cipher == IEEE80211_CIPHER_TKIP) { + iv[0] = k->k_tsc >> 8; + iv[1] = (iv[0] | 0x20) & 0x7f; + iv[2] = k->k_tsc; + } else /* CCMP */ { + iv[0] = k->k_tsc; + iv[1] = k->k_tsc >> 8; + iv[2] = 0; + } + iv[3] = k->k_id << 6 | IEEE80211_WEP_EXTIV; + iv[4] = k->k_tsc >> 16; + iv[5] = k->k_tsc >> 24; + iv[6] = k->k_tsc >> 32; + iv[7] = k->k_tsc >> 40; + } + RAL_WRITE_REGION_1(sc, RT2860_IVEIV(wcid), iv, 8); + } + + if (k->k_flags & IEEE80211_KEY_GROUP) { + /* install group key */ + attr = RAL_READ(sc, RT2860_SKEY_MODE_0_7); + attr &= ~(0xf << (k->k_id * 4)); + attr |= mode << (k->k_id * 4); + RAL_WRITE(sc, RT2860_SKEY_MODE_0_7, attr); + } else { + /* install pairwise key */ + attr = RAL_READ(sc, RT2860_WCID_ATTR(wcid)); + attr = (attr & ~0xf) | (mode << 1) | RT2860_RX_PKEY_EN; + RAL_WRITE(sc, RT2860_WCID_ATTR(wcid), attr); + } + return 0; +} + +static void +rt2860_delete_key(struct ieee80211com *ic, struct ieee80211_node *ni, + struct ieee80211_key *k) +{ + struct rt2860_softc *sc = ic->ic_softc; + uint32_t attr; + uint8_t wcid; + + if (k->k_flags & IEEE80211_KEY_GROUP) { + /* remove group key */ + attr = RAL_READ(sc, RT2860_SKEY_MODE_0_7); + attr &= ~(0xf << (k->k_id * 4)); + RAL_WRITE(sc, RT2860_SKEY_MODE_0_7, attr); + + } else { + /* remove pairwise key */ + wcid = ((struct rt2860_node *)ni)->wcid; + attr = RAL_READ(sc, RT2860_WCID_ATTR(wcid)); + attr &= ~0xf; + RAL_WRITE(sc, RT2860_WCID_ATTR(wcid), attr); + } +} +#endif + +static int8_t +rt2860_rssi2dbm(struct rt2860_softc *sc, uint8_t rssi, uint8_t rxchain) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211_channel *c = ic->ic_curchan; + int delta; + + if (IEEE80211_IS_CHAN_5GHZ(c)) { + u_int chan = ieee80211_chan2ieee(ic, c); + delta = sc->rssi_5ghz[rxchain]; + + /* determine channel group */ + if (chan <= 64) + delta -= sc->lna[1]; + else if (chan <= 128) + delta -= sc->lna[2]; + else + delta -= sc->lna[3]; + } else + delta = sc->rssi_2ghz[rxchain] - sc->lna[0]; + + return -12 - delta - rssi; +} + +/* + * Add `delta' (signed) to each 4-bit sub-word of a 32-bit word. + * Used to adjust per-rate Tx power registers. + */ +static __inline uint32_t +b4inc(uint32_t b32, int8_t delta) +{ + int8_t i, b4; + + for (i = 0; i < 8; i++) { + b4 = b32 & 0xf; + b4 += delta; + if (b4 < 0) + b4 = 0; + else if (b4 > 0xf) + b4 = 0xf; + b32 = b32 >> 4 | b4 << 28; + } + return b32; +} + +static const char * +rt2860_get_rf(uint8_t rev) +{ + switch (rev) { + case RT2860_RF_2820: return "RT2820"; + case RT2860_RF_2850: return "RT2850"; + case RT2860_RF_2720: return "RT2720"; + case RT2860_RF_2750: return "RT2750"; + case RT3070_RF_3020: return "RT3020"; + case RT3070_RF_2020: return "RT2020"; + case RT3070_RF_3021: return "RT3021"; + case RT3070_RF_3022: return "RT3022"; + case RT3070_RF_3052: return "RT3052"; + case RT3070_RF_3320: return "RT3320"; + case RT3070_RF_3053: return "RT3053"; + default: return "unknown"; + } +} + +static int +rt2860_read_eeprom(struct rt2860_softc *sc, uint8_t macaddr[IEEE80211_ADDR_LEN]) +{ + int8_t delta_2ghz, delta_5ghz; + uint32_t tmp; + uint16_t val; + int ridx, ant, i; + + /* check whether the ROM is eFUSE ROM or EEPROM */ + sc->sc_srom_read = rt2860_eeprom_read_2; + if (sc->mac_ver >= 0x3071) { + tmp = RAL_READ(sc, RT3070_EFUSE_CTRL); + DPRINTF(("EFUSE_CTRL=0x%08x\n", tmp)); + if (tmp & RT3070_SEL_EFUSE) + sc->sc_srom_read = rt3090_efuse_read_2; + } + + /* read EEPROM version */ + val = rt2860_srom_read(sc, RT2860_EEPROM_VERSION); + DPRINTF(("EEPROM rev=%d, FAE=%d\n", val & 0xff, val >> 8)); + + /* read MAC address */ + val = rt2860_srom_read(sc, RT2860_EEPROM_MAC01); + macaddr[0] = val & 0xff; + macaddr[1] = val >> 8; + val = rt2860_srom_read(sc, RT2860_EEPROM_MAC23); + macaddr[2] = val & 0xff; + macaddr[3] = val >> 8; + val = rt2860_srom_read(sc, RT2860_EEPROM_MAC45); + macaddr[4] = val & 0xff; + macaddr[5] = val >> 8; + + /* read country code */ + val = rt2860_srom_read(sc, RT2860_EEPROM_COUNTRY); + DPRINTF(("EEPROM region code=0x%04x\n", val)); + + /* read vendor BBP settings */ + for (i = 0; i < 8; i++) { + val = rt2860_srom_read(sc, RT2860_EEPROM_BBP_BASE + i); + sc->bbp[i].val = val & 0xff; + sc->bbp[i].reg = val >> 8; + DPRINTF(("BBP%d=0x%02x\n", sc->bbp[i].reg, sc->bbp[i].val)); + } + if (sc->mac_ver >= 0x3071) { + /* read vendor RF settings */ + for (i = 0; i < 10; i++) { + val = rt2860_srom_read(sc, RT3071_EEPROM_RF_BASE + i); + sc->rf[i].val = val & 0xff; + sc->rf[i].reg = val >> 8; + DPRINTF(("RF%d=0x%02x\n", sc->rf[i].reg, + sc->rf[i].val)); + } + } + + /* read RF frequency offset from EEPROM */ + val = rt2860_srom_read(sc, RT2860_EEPROM_FREQ_LEDS); + sc->freq = ((val & 0xff) != 0xff) ? val & 0xff : 0; + DPRINTF(("EEPROM freq offset %d\n", sc->freq & 0xff)); + if ((val >> 8) != 0xff) { + /* read LEDs operating mode */ + sc->leds = val >> 8; + sc->led[0] = rt2860_srom_read(sc, RT2860_EEPROM_LED1); + sc->led[1] = rt2860_srom_read(sc, RT2860_EEPROM_LED2); + sc->led[2] = rt2860_srom_read(sc, RT2860_EEPROM_LED3); + } else { + /* broken EEPROM, use default settings */ + sc->leds = 0x01; + sc->led[0] = 0x5555; + sc->led[1] = 0x2221; + sc->led[2] = 0xa9f8; + } + DPRINTF(("EEPROM LED mode=0x%02x, LEDs=0x%04x/0x%04x/0x%04x\n", + sc->leds, sc->led[0], sc->led[1], sc->led[2])); + + /* read RF information */ + val = rt2860_srom_read(sc, RT2860_EEPROM_ANTENNA); + if (val == 0xffff) { + DPRINTF(("invalid EEPROM antenna info, using default\n")); + if (sc->mac_ver == 0x3593) { + /* default to RF3053 3T3R */ + sc->rf_rev = RT3070_RF_3053; + sc->ntxchains = 3; + sc->nrxchains = 3; + } else if (sc->mac_ver >= 0x3071) { + /* default to RF3020 1T1R */ + sc->rf_rev = RT3070_RF_3020; + sc->ntxchains = 1; + sc->nrxchains = 1; + } else { + /* default to RF2820 1T2R */ + sc->rf_rev = RT2860_RF_2820; + sc->ntxchains = 1; + sc->nrxchains = 2; + } + } else { + sc->rf_rev = (val >> 8) & 0xf; + sc->ntxchains = (val >> 4) & 0xf; + sc->nrxchains = val & 0xf; + } + DPRINTF(("EEPROM RF rev=0x%02x chains=%dT%dR\n", + sc->rf_rev, sc->ntxchains, sc->nrxchains)); + + /* check if RF supports automatic Tx access gain control */ + val = rt2860_srom_read(sc, RT2860_EEPROM_CONFIG); + DPRINTF(("EEPROM CFG 0x%04x\n", val)); + /* check if driver should patch the DAC issue */ + if ((val >> 8) != 0xff) + sc->patch_dac = (val >> 15) & 1; + if ((val & 0xff) != 0xff) { + sc->ext_5ghz_lna = (val >> 3) & 1; + sc->ext_2ghz_lna = (val >> 2) & 1; + /* check if RF supports automatic Tx access gain control */ + sc->calib_2ghz = sc->calib_5ghz = 0; /* XXX (val >> 1) & 1 */; + /* check if we have a hardware radio switch */ + sc->rfswitch = val & 1; + } + if (sc->sc_flags & RT2860_ADVANCED_PS) { + /* read PCIe power save level */ + val = rt2860_srom_read(sc, RT2860_EEPROM_PCIE_PSLEVEL); + if ((val & 0xff) != 0xff) { + sc->pslevel = val & 0x3; + val = rt2860_srom_read(sc, RT2860_EEPROM_REV); + if ((val & 0xff80) != 0x9280) + sc->pslevel = MIN(sc->pslevel, 1); + DPRINTF(("EEPROM PCIe PS Level=%d\n", sc->pslevel)); + } + } + + /* read power settings for 2GHz channels */ + for (i = 0; i < 14; i += 2) { + val = rt2860_srom_read(sc, + RT2860_EEPROM_PWR2GHZ_BASE1 + i / 2); + sc->txpow1[i + 0] = (int8_t)(val & 0xff); + sc->txpow1[i + 1] = (int8_t)(val >> 8); + + val = rt2860_srom_read(sc, + RT2860_EEPROM_PWR2GHZ_BASE2 + i / 2); + sc->txpow2[i + 0] = (int8_t)(val & 0xff); + sc->txpow2[i + 1] = (int8_t)(val >> 8); + } + /* fix broken Tx power entries */ + for (i = 0; i < 14; i++) { + if (sc->txpow1[i] < 0 || sc->txpow1[i] > 31) + sc->txpow1[i] = 5; + if (sc->txpow2[i] < 0 || sc->txpow2[i] > 31) + sc->txpow2[i] = 5; + DPRINTF(("chan %d: power1=%d, power2=%d\n", + rt2860_rf2850[i].chan, sc->txpow1[i], sc->txpow2[i])); + } + /* read power settings for 5GHz channels */ + for (i = 0; i < 40; i += 2) { + val = rt2860_srom_read(sc, + RT2860_EEPROM_PWR5GHZ_BASE1 + i / 2); + sc->txpow1[i + 14] = (int8_t)(val & 0xff); + sc->txpow1[i + 15] = (int8_t)(val >> 8); + + val = rt2860_srom_read(sc, + RT2860_EEPROM_PWR5GHZ_BASE2 + i / 2); + sc->txpow2[i + 14] = (int8_t)(val & 0xff); + sc->txpow2[i + 15] = (int8_t)(val >> 8); + } + /* fix broken Tx power entries */ + for (i = 0; i < 40; i++) { + if (sc->txpow1[14 + i] < -7 || sc->txpow1[14 + i] > 15) + sc->txpow1[14 + i] = 5; + if (sc->txpow2[14 + i] < -7 || sc->txpow2[14 + i] > 15) + sc->txpow2[14 + i] = 5; + DPRINTF(("chan %d: power1=%d, power2=%d\n", + rt2860_rf2850[14 + i].chan, sc->txpow1[14 + i], + sc->txpow2[14 + i])); + } + + /* read Tx power compensation for each Tx rate */ + val = rt2860_srom_read(sc, RT2860_EEPROM_DELTAPWR); + delta_2ghz = delta_5ghz = 0; + if ((val & 0xff) != 0xff && (val & 0x80)) { + delta_2ghz = val & 0xf; + if (!(val & 0x40)) /* negative number */ + delta_2ghz = -delta_2ghz; + } + val >>= 8; + if ((val & 0xff) != 0xff && (val & 0x80)) { + delta_5ghz = val & 0xf; + if (!(val & 0x40)) /* negative number */ + delta_5ghz = -delta_5ghz; + } + DPRINTF(("power compensation=%d (2GHz), %d (5GHz)\n", + delta_2ghz, delta_5ghz)); + + for (ridx = 0; ridx < 5; ridx++) { + uint32_t reg; + + val = rt2860_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2); + reg = val; + val = rt2860_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2 + 1); + reg |= (uint32_t)val << 16; + + sc->txpow20mhz[ridx] = reg; + sc->txpow40mhz_2ghz[ridx] = b4inc(reg, delta_2ghz); + sc->txpow40mhz_5ghz[ridx] = b4inc(reg, delta_5ghz); + + DPRINTF(("ridx %d: power 20MHz=0x%08x, 40MHz/2GHz=0x%08x, " + "40MHz/5GHz=0x%08x\n", ridx, sc->txpow20mhz[ridx], + sc->txpow40mhz_2ghz[ridx], sc->txpow40mhz_5ghz[ridx])); + } + + /* read factory-calibrated samples for temperature compensation */ + val = rt2860_srom_read(sc, RT2860_EEPROM_TSSI1_2GHZ); + sc->tssi_2ghz[0] = val & 0xff; /* [-4] */ + sc->tssi_2ghz[1] = val >> 8; /* [-3] */ + val = rt2860_srom_read(sc, RT2860_EEPROM_TSSI2_2GHZ); + sc->tssi_2ghz[2] = val & 0xff; /* [-2] */ + sc->tssi_2ghz[3] = val >> 8; /* [-1] */ + val = rt2860_srom_read(sc, RT2860_EEPROM_TSSI3_2GHZ); + sc->tssi_2ghz[4] = val & 0xff; /* [+0] */ + sc->tssi_2ghz[5] = val >> 8; /* [+1] */ + val = rt2860_srom_read(sc, RT2860_EEPROM_TSSI4_2GHZ); + sc->tssi_2ghz[6] = val & 0xff; /* [+2] */ + sc->tssi_2ghz[7] = val >> 8; /* [+3] */ + val = rt2860_srom_read(sc, RT2860_EEPROM_TSSI5_2GHZ); + sc->tssi_2ghz[8] = val & 0xff; /* [+4] */ + sc->step_2ghz = val >> 8; + DPRINTF(("TSSI 2GHz: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x " + "0x%02x 0x%02x step=%d\n", sc->tssi_2ghz[0], sc->tssi_2ghz[1], + sc->tssi_2ghz[2], sc->tssi_2ghz[3], sc->tssi_2ghz[4], + sc->tssi_2ghz[5], sc->tssi_2ghz[6], sc->tssi_2ghz[7], + sc->tssi_2ghz[8], sc->step_2ghz)); + /* check that ref value is correct, otherwise disable calibration */ + if (sc->tssi_2ghz[4] == 0xff) + sc->calib_2ghz = 0; + + val = rt2860_srom_read(sc, RT2860_EEPROM_TSSI1_5GHZ); + sc->tssi_5ghz[0] = val & 0xff; /* [-4] */ + sc->tssi_5ghz[1] = val >> 8; /* [-3] */ + val = rt2860_srom_read(sc, RT2860_EEPROM_TSSI2_5GHZ); + sc->tssi_5ghz[2] = val & 0xff; /* [-2] */ + sc->tssi_5ghz[3] = val >> 8; /* [-1] */ + val = rt2860_srom_read(sc, RT2860_EEPROM_TSSI3_5GHZ); + sc->tssi_5ghz[4] = val & 0xff; /* [+0] */ + sc->tssi_5ghz[5] = val >> 8; /* [+1] */ + val = rt2860_srom_read(sc, RT2860_EEPROM_TSSI4_5GHZ); + sc->tssi_5ghz[6] = val & 0xff; /* [+2] */ + sc->tssi_5ghz[7] = val >> 8; /* [+3] */ + val = rt2860_srom_read(sc, RT2860_EEPROM_TSSI5_5GHZ); + sc->tssi_5ghz[8] = val & 0xff; /* [+4] */ + sc->step_5ghz = val >> 8; + DPRINTF(("TSSI 5GHz: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x " + "0x%02x 0x%02x step=%d\n", sc->tssi_5ghz[0], sc->tssi_5ghz[1], + sc->tssi_5ghz[2], sc->tssi_5ghz[3], sc->tssi_5ghz[4], + sc->tssi_5ghz[5], sc->tssi_5ghz[6], sc->tssi_5ghz[7], + sc->tssi_5ghz[8], sc->step_5ghz)); + /* check that ref value is correct, otherwise disable calibration */ + if (sc->tssi_5ghz[4] == 0xff) + sc->calib_5ghz = 0; + + /* read RSSI offsets and LNA gains from EEPROM */ + val = rt2860_srom_read(sc, RT2860_EEPROM_RSSI1_2GHZ); + sc->rssi_2ghz[0] = val & 0xff; /* Ant A */ + sc->rssi_2ghz[1] = val >> 8; /* Ant B */ + val = rt2860_srom_read(sc, RT2860_EEPROM_RSSI2_2GHZ); + if (sc->mac_ver >= 0x3071) { + /* + * On RT3090 chips (limited to 2 Rx chains), this ROM + * field contains the Tx mixer gain for the 2GHz band. + */ + if ((val & 0xff) != 0xff) + sc->txmixgain_2ghz = val & 0x7; + DPRINTF(("tx mixer gain=%u (2GHz)\n", sc->txmixgain_2ghz)); + } else + sc->rssi_2ghz[2] = val & 0xff; /* Ant C */ + sc->lna[2] = val >> 8; /* channel group 2 */ + + val = rt2860_srom_read(sc, RT2860_EEPROM_RSSI1_5GHZ); + sc->rssi_5ghz[0] = val & 0xff; /* Ant A */ + sc->rssi_5ghz[1] = val >> 8; /* Ant B */ + val = rt2860_srom_read(sc, RT2860_EEPROM_RSSI2_5GHZ); + sc->rssi_5ghz[2] = val & 0xff; /* Ant C */ + sc->lna[3] = val >> 8; /* channel group 3 */ + + val = rt2860_srom_read(sc, RT2860_EEPROM_LNA); + if (sc->mac_ver >= 0x3071) + sc->lna[0] = RT3090_DEF_LNA; + else /* channel group 0 */ + sc->lna[0] = val & 0xff; + sc->lna[1] = val >> 8; /* channel group 1 */ + + /* fix broken 5GHz LNA entries */ + if (sc->lna[2] == 0 || sc->lna[2] == 0xff) { + DPRINTF(("invalid LNA for channel group %d\n", 2)); + sc->lna[2] = sc->lna[1]; + } + if (sc->lna[3] == 0 || sc->lna[3] == 0xff) { + DPRINTF(("invalid LNA for channel group %d\n", 3)); + sc->lna[3] = sc->lna[1]; + } + + /* fix broken RSSI offset entries */ + for (ant = 0; ant < 3; ant++) { + if (sc->rssi_2ghz[ant] < -10 || sc->rssi_2ghz[ant] > 10) { + DPRINTF(("invalid RSSI%d offset: %d (2GHz)\n", + ant + 1, sc->rssi_2ghz[ant])); + sc->rssi_2ghz[ant] = 0; + } + if (sc->rssi_5ghz[ant] < -10 || sc->rssi_5ghz[ant] > 10) { + DPRINTF(("invalid RSSI%d offset: %d (5GHz)\n", + ant + 1, sc->rssi_5ghz[ant])); + sc->rssi_5ghz[ant] = 0; + } + } + + return 0; +} + +int +rt2860_bbp_init(struct rt2860_softc *sc) +{ +#define N(a) (sizeof (a) / sizeof ((a)[0])) + int i, ntries; + + /* wait for BBP to wake up */ + for (ntries = 0; ntries < 20; ntries++) { + uint8_t bbp0 = rt2860_mcu_bbp_read(sc, 0); + if (bbp0 != 0 && bbp0 != 0xff) + break; + } + if (ntries == 20) { + device_printf(sc->sc_dev, + "timeout waiting for BBP to wake up\n"); + return ETIMEDOUT; + } + + /* initialize BBP registers to default values */ + for (i = 0; i < N(rt2860_def_bbp); i++) { + rt2860_mcu_bbp_write(sc, rt2860_def_bbp[i].reg, + rt2860_def_bbp[i].val); + } + + /* fix BBP84 for RT2860E */ + if (sc->mac_ver == 0x2860 && sc->mac_rev != 0x0101) + rt2860_mcu_bbp_write(sc, 84, 0x19); + + if (sc->mac_ver >= 0x3071) { + rt2860_mcu_bbp_write(sc, 79, 0x13); + rt2860_mcu_bbp_write(sc, 80, 0x05); + rt2860_mcu_bbp_write(sc, 81, 0x33); + } else if (sc->mac_ver == 0x2860 && sc->mac_rev == 0x0100) { + rt2860_mcu_bbp_write(sc, 69, 0x16); + rt2860_mcu_bbp_write(sc, 73, 0x12); + } + + return 0; +#undef N +} + +static int +rt2860_txrx_enable(struct rt2860_softc *sc) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint32_t tmp; + int ntries; + + /* enable Tx/Rx DMA engine */ + RAL_WRITE(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_TX_EN); + RAL_BARRIER_READ_WRITE(sc); + for (ntries = 0; ntries < 200; ntries++) { + tmp = RAL_READ(sc, RT2860_WPDMA_GLO_CFG); + if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0) + break; + DELAY(1000); + } + if (ntries == 200) { + device_printf(sc->sc_dev, "timeout waiting for DMA engine\n"); + return ETIMEDOUT; + } + + DELAY(50); + + tmp |= RT2860_RX_DMA_EN | RT2860_TX_DMA_EN | + RT2860_WPDMA_BT_SIZE64 << RT2860_WPDMA_BT_SIZE_SHIFT; + RAL_WRITE(sc, RT2860_WPDMA_GLO_CFG, tmp); + + /* set Rx filter */ + tmp = RT2860_DROP_CRC_ERR | RT2860_DROP_PHY_ERR; + if (ic->ic_opmode != IEEE80211_M_MONITOR) { + tmp |= RT2860_DROP_UC_NOME | RT2860_DROP_DUPL | + RT2860_DROP_CTS | RT2860_DROP_BA | RT2860_DROP_ACK | + RT2860_DROP_VER_ERR | RT2860_DROP_CTRL_RSV | + RT2860_DROP_CFACK | RT2860_DROP_CFEND; + if (ic->ic_opmode == IEEE80211_M_STA) + tmp |= RT2860_DROP_RTS | RT2860_DROP_PSPOLL; + } + RAL_WRITE(sc, RT2860_RX_FILTR_CFG, tmp); + + RAL_WRITE(sc, RT2860_MAC_SYS_CTRL, + RT2860_MAC_RX_EN | RT2860_MAC_TX_EN); + + return 0; +} + +static void +rt2860_init(void *arg) +{ + struct rt2860_softc *sc = arg; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + + RAL_LOCK(sc); + rt2860_init_locked(sc); + RAL_UNLOCK(sc); + + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + ieee80211_start_all(ic); +} + +static void +rt2860_init_locked(struct rt2860_softc *sc) +{ +#define N(a) (sizeof (a) / sizeof ((a)[0])) + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint32_t tmp; + uint8_t bbp1, bbp3; + int i, qid, ridx, ntries, error; + + RAL_LOCK_ASSERT(sc); + + if (sc->rfswitch) { + /* hardware has a radio switch on GPIO pin 2 */ + if (!(RAL_READ(sc, RT2860_GPIO_CTRL) & (1 << 2))) { + device_printf(sc->sc_dev, + "radio is disabled by hardware switch\n"); +#ifdef notyet + rt2860_stop_locked(sc); + return; +#endif + } + } + RAL_WRITE(sc, RT2860_PWR_PIN_CFG, RT2860_IO_RA_PE); + + /* disable DMA */ + tmp = RAL_READ(sc, RT2860_WPDMA_GLO_CFG); + tmp &= 0xff0; + RAL_WRITE(sc, RT2860_WPDMA_GLO_CFG, tmp); + + /* PBF hardware reset */ + RAL_WRITE(sc, RT2860_SYS_CTRL, 0xe1f); + RAL_BARRIER_WRITE(sc); + RAL_WRITE(sc, RT2860_SYS_CTRL, 0xe00); + + if ((error = rt2860_load_microcode(sc)) != 0) { + device_printf(sc->sc_dev, "could not load 8051 microcode\n"); + rt2860_stop_locked(sc); + return; + } + + rt2860_set_macaddr(sc, IF_LLADDR(ifp)); + + /* init Tx power for all Tx rates (from EEPROM) */ + for (ridx = 0; ridx < 5; ridx++) { + if (sc->txpow20mhz[ridx] == 0xffffffff) + continue; + RAL_WRITE(sc, RT2860_TX_PWR_CFG(ridx), sc->txpow20mhz[ridx]); + } + + for (ntries = 0; ntries < 100; ntries++) { + tmp = RAL_READ(sc, RT2860_WPDMA_GLO_CFG); + if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0) + break; + DELAY(1000); + } + if (ntries == 100) { + device_printf(sc->sc_dev, "timeout waiting for DMA engine\n"); + rt2860_stop_locked(sc); + return; + } + tmp &= 0xff0; + RAL_WRITE(sc, RT2860_WPDMA_GLO_CFG, tmp); + + /* reset Rx ring and all 6 Tx rings */ + RAL_WRITE(sc, RT2860_WPDMA_RST_IDX, 0x1003f); + + /* PBF hardware reset */ + RAL_WRITE(sc, RT2860_SYS_CTRL, 0xe1f); + RAL_BARRIER_WRITE(sc); + RAL_WRITE(sc, RT2860_SYS_CTRL, 0xe00); + + RAL_WRITE(sc, RT2860_PWR_PIN_CFG, RT2860_IO_RA_PE | RT2860_IO_RF_PE); + + RAL_WRITE(sc, RT2860_MAC_SYS_CTRL, RT2860_BBP_HRST | RT2860_MAC_SRST); + RAL_BARRIER_WRITE(sc); + RAL_WRITE(sc, RT2860_MAC_SYS_CTRL, 0); + + for (i = 0; i < N(rt2860_def_mac); i++) + RAL_WRITE(sc, rt2860_def_mac[i].reg, rt2860_def_mac[i].val); + if (sc->mac_ver >= 0x3071) { + /* set delay of PA_PE assertion to 1us (unit of 0.25us) */ + RAL_WRITE(sc, RT2860_TX_SW_CFG0, + 4 << RT2860_DLY_PAPE_EN_SHIFT); + } + + if (!(RAL_READ(sc, RT2860_PCI_CFG) & RT2860_PCI_CFG_PCI)) { + sc->sc_flags |= RT2860_PCIE; + /* PCIe has different clock cycle count than PCI */ + tmp = RAL_READ(sc, RT2860_US_CYC_CNT); + tmp = (tmp & ~0xff) | 0x7d; + RAL_WRITE(sc, RT2860_US_CYC_CNT, tmp); + } + + /* wait while MAC is busy */ + for (ntries = 0; ntries < 100; ntries++) { + if (!(RAL_READ(sc, RT2860_MAC_STATUS_REG) & + (RT2860_RX_STATUS_BUSY | RT2860_TX_STATUS_BUSY))) + break; + DELAY(1000); + } + if (ntries == 100) { + device_printf(sc->sc_dev, "timeout waiting for MAC\n"); + rt2860_stop_locked(sc); + return; + } + + /* clear Host to MCU mailbox */ + RAL_WRITE(sc, RT2860_H2M_BBPAGENT, 0); + RAL_WRITE(sc, RT2860_H2M_MAILBOX, 0); + + rt2860_mcu_cmd(sc, RT2860_MCU_CMD_RFRESET, 0, 0); + DELAY(1000); + + if ((error = rt2860_bbp_init(sc)) != 0) { + rt2860_stop_locked(sc); + return; + } + + /* clear RX WCID search table */ + RAL_SET_REGION_4(sc, RT2860_WCID_ENTRY(0), 0, 512); + /* clear pairwise key table */ + RAL_SET_REGION_4(sc, RT2860_PKEY(0), 0, 2048); + /* clear IV/EIV table */ + RAL_SET_REGION_4(sc, RT2860_IVEIV(0), 0, 512); + /* clear WCID attribute table */ + RAL_SET_REGION_4(sc, RT2860_WCID_ATTR(0), 0, 256); + /* clear shared key table */ + RAL_SET_REGION_4(sc, RT2860_SKEY(0, 0), 0, 8 * 32); + /* clear shared key mode */ + RAL_SET_REGION_4(sc, RT2860_SKEY_MODE_0_7, 0, 4); + + /* init Tx rings (4 EDCAs + HCCA + Mgt) */ + for (qid = 0; qid < 6; qid++) { + RAL_WRITE(sc, RT2860_TX_BASE_PTR(qid), sc->txq[qid].paddr); + RAL_WRITE(sc, RT2860_TX_MAX_CNT(qid), RT2860_TX_RING_COUNT); + RAL_WRITE(sc, RT2860_TX_CTX_IDX(qid), 0); + } + + /* init Rx ring */ + RAL_WRITE(sc, RT2860_RX_BASE_PTR, sc->rxq.paddr); + RAL_WRITE(sc, RT2860_RX_MAX_CNT, RT2860_RX_RING_COUNT); + RAL_WRITE(sc, RT2860_RX_CALC_IDX, RT2860_RX_RING_COUNT - 1); + + /* setup maximum buffer sizes */ + RAL_WRITE(sc, RT2860_MAX_LEN_CFG, 1 << 12 | + (MCLBYTES - sizeof (struct rt2860_rxwi) - 2)); + + for (ntries = 0; ntries < 100; ntries++) { + tmp = RAL_READ(sc, RT2860_WPDMA_GLO_CFG); + if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0) + break; + DELAY(1000); + } + if (ntries == 100) { + device_printf(sc->sc_dev, "timeout waiting for DMA engine\n"); + rt2860_stop_locked(sc); + return; + } + tmp &= 0xff0; + RAL_WRITE(sc, RT2860_WPDMA_GLO_CFG, tmp); + + /* disable interrupts mitigation */ + RAL_WRITE(sc, RT2860_DELAY_INT_CFG, 0); + + /* write vendor-specific BBP values (from EEPROM) */ + for (i = 0; i < 8; i++) { + if (sc->bbp[i].reg == 0 || sc->bbp[i].reg == 0xff) + continue; + rt2860_mcu_bbp_write(sc, sc->bbp[i].reg, sc->bbp[i].val); + } + + /* select Main antenna for 1T1R devices */ + if (sc->rf_rev == RT3070_RF_2020 || + sc->rf_rev == RT3070_RF_3020 || + sc->rf_rev == RT3070_RF_3320) + rt3090_set_rx_antenna(sc, 0); + + /* send LEDs operating mode to microcontroller */ + rt2860_mcu_cmd(sc, RT2860_MCU_CMD_LED1, sc->led[0], 0); + rt2860_mcu_cmd(sc, RT2860_MCU_CMD_LED2, sc->led[1], 0); + rt2860_mcu_cmd(sc, RT2860_MCU_CMD_LED3, sc->led[2], 0); + + if (sc->mac_ver >= 0x3071) + rt3090_rf_init(sc); + + rt2860_mcu_cmd(sc, RT2860_MCU_CMD_SLEEP, 0x02ff, 1); + rt2860_mcu_cmd(sc, RT2860_MCU_CMD_WAKEUP, 0, 1); + + if (sc->mac_ver >= 0x3071) + rt3090_rf_wakeup(sc); + + /* disable non-existing Rx chains */ + bbp3 = rt2860_mcu_bbp_read(sc, 3); + bbp3 &= ~(1 << 3 | 1 << 4); + if (sc->nrxchains == 2) + bbp3 |= 1 << 3; + else if (sc->nrxchains == 3) + bbp3 |= 1 << 4; + rt2860_mcu_bbp_write(sc, 3, bbp3); + + /* disable non-existing Tx chains */ + bbp1 = rt2860_mcu_bbp_read(sc, 1); + if (sc->ntxchains == 1) + bbp1 = (bbp1 & ~(1 << 3 | 1 << 4)); + else if (sc->mac_ver == 0x3593 && sc->ntxchains == 2) + bbp1 = (bbp1 & ~(1 << 4)) | 1 << 3; + else if (sc->mac_ver == 0x3593 && sc->ntxchains == 3) + bbp1 = (bbp1 & ~(1 << 3)) | 1 << 4; + rt2860_mcu_bbp_write(sc, 1, bbp1); + + if (sc->mac_ver >= 0x3071) + rt3090_rf_setup(sc); + + /* select default channel */ + rt2860_switch_chan(sc, ic->ic_curchan); + + /* reset RF from MCU */ + rt2860_mcu_cmd(sc, RT2860_MCU_CMD_RFRESET, 0, 0); + + /* set RTS threshold */ + tmp = RAL_READ(sc, RT2860_TX_RTS_CFG); + tmp &= ~0xffff00; + tmp |= IEEE80211_RTS_DEFAULT << 8; + RAL_WRITE(sc, RT2860_TX_RTS_CFG, tmp); + + /* setup initial protection mode */ + rt2860_updateprot(ifp); + + /* turn radio LED on */ + rt2860_set_leds(sc, RT2860_LED_RADIO); + + /* enable Tx/Rx DMA engine */ + if ((error = rt2860_txrx_enable(sc)) != 0) { + rt2860_stop_locked(sc); + return; + } + + /* clear pending interrupts */ + RAL_WRITE(sc, RT2860_INT_STATUS, 0xffffffff); + /* enable interrupts */ + RAL_WRITE(sc, RT2860_INT_MASK, 0x3fffc); + + if (sc->sc_flags & RT2860_ADVANCED_PS) + rt2860_mcu_cmd(sc, RT2860_MCU_CMD_PSLEVEL, sc->pslevel, 0); + + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + ifp->if_drv_flags |= IFF_DRV_RUNNING; + + callout_reset(&sc->watchdog_ch, hz, rt2860_watchdog, sc); +#undef N +} + +static void +rt2860_stop(void *arg) +{ + struct rt2860_softc *sc = arg; + + RAL_LOCK(sc); + rt2860_stop_locked(sc); + RAL_UNLOCK(sc); +} + +static void +rt2860_stop_locked(struct rt2860_softc *sc) +{ + struct ifnet *ifp = sc->sc_ifp; + uint32_t tmp; + int qid; + + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + rt2860_set_leds(sc, 0); /* turn all LEDs off */ + + callout_stop(&sc->watchdog_ch); + sc->sc_tx_timer = 0; + ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + + /* disable interrupts */ + RAL_WRITE(sc, RT2860_INT_MASK, 0); + + /* disable GP timer */ + rt2860_set_gp_timer(sc, 0); + + /* disable Rx */ + tmp = RAL_READ(sc, RT2860_MAC_SYS_CTRL); + tmp &= ~(RT2860_MAC_RX_EN | RT2860_MAC_TX_EN); + RAL_WRITE(sc, RT2860_MAC_SYS_CTRL, tmp); + + /* reset adapter */ + RAL_WRITE(sc, RT2860_MAC_SYS_CTRL, RT2860_BBP_HRST | RT2860_MAC_SRST); + RAL_BARRIER_WRITE(sc); + RAL_WRITE(sc, RT2860_MAC_SYS_CTRL, 0); + + /* reset Tx and Rx rings (and reclaim TXWIs) */ + sc->qfullmsk = 0; + for (qid = 0; qid < 6; qid++) + rt2860_reset_tx_ring(sc, &sc->txq[qid]); + rt2860_reset_rx_ring(sc, &sc->rxq); +} + +int +rt2860_load_microcode(struct rt2860_softc *sc) +{ + const struct firmware *fp; + int ntries, error; + + RAL_LOCK_ASSERT(sc); + + RAL_UNLOCK(sc); + fp = firmware_get("rt2860fw"); + RAL_LOCK(sc); + if (fp == NULL) { + device_printf(sc->sc_dev, + "unable to receive rt2860fw firmware image\n"); + return EINVAL; + } + + /* set "host program ram write selection" bit */ + RAL_WRITE(sc, RT2860_SYS_CTRL, RT2860_HST_PM_SEL); + /* write microcode image */ + RAL_WRITE_REGION_1(sc, RT2860_FW_BASE, fp->data, fp->datasize); + /* kick microcontroller unit */ + RAL_WRITE(sc, RT2860_SYS_CTRL, 0); + RAL_BARRIER_WRITE(sc); + RAL_WRITE(sc, RT2860_SYS_CTRL, RT2860_MCU_RESET); + + RAL_WRITE(sc, RT2860_H2M_BBPAGENT, 0); + RAL_WRITE(sc, RT2860_H2M_MAILBOX, 0); + + /* wait until microcontroller is ready */ + RAL_BARRIER_READ_WRITE(sc); + for (ntries = 0; ntries < 1000; ntries++) { + if (RAL_READ(sc, RT2860_SYS_CTRL) & RT2860_MCU_READY) + break; + DELAY(1000); + } + if (ntries == 1000) { + device_printf(sc->sc_dev, + "timeout waiting for MCU to initialize\n"); + error = ETIMEDOUT; + } else + error = 0; + + firmware_put(fp, FIRMWARE_UNLOAD); + return error; +} + +/* + * This function is called periodically to adjust Tx power based on + * temperature variation. + */ +#ifdef NOT_YET +static void +rt2860_calib(struct rt2860_softc *sc) +{ + struct ieee80211com *ic = &sc->sc_ic; + const uint8_t *tssi; + uint8_t step, bbp49; + int8_t ridx, d; + + /* read current temperature */ + bbp49 = rt2860_mcu_bbp_read(sc, 49); + + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_bss->ni_chan)) { + tssi = &sc->tssi_2ghz[4]; + step = sc->step_2ghz; + } else { + tssi = &sc->tssi_5ghz[4]; + step = sc->step_5ghz; + } + + if (bbp49 < tssi[0]) { /* lower than reference */ + /* use higher Tx power than default */ + for (d = 0; d > -4 && bbp49 <= tssi[d - 1]; d--); + } else if (bbp49 > tssi[0]) { /* greater than reference */ + /* use lower Tx power than default */ + for (d = 0; d < +4 && bbp49 >= tssi[d + 1]; d++); + } else { + /* use default Tx power */ + d = 0; + } + d *= step; + + DPRINTF(("BBP49=0x%02x, adjusting Tx power by %d\n", bbp49, d)); + + /* write adjusted Tx power values for each Tx rate */ + for (ridx = 0; ridx < 5; ridx++) { + if (sc->txpow20mhz[ridx] == 0xffffffff) + continue; + RAL_WRITE(sc, RT2860_TX_PWR_CFG(ridx), + b4inc(sc->txpow20mhz[ridx], d)); + } +} +#endif + +static void +rt3090_set_rx_antenna(struct rt2860_softc *sc, int aux) +{ + uint32_t tmp; + + if (aux) { + tmp = RAL_READ(sc, RT2860_PCI_EECTRL); + RAL_WRITE(sc, RT2860_PCI_EECTRL, tmp & ~RT2860_C); + tmp = RAL_READ(sc, RT2860_GPIO_CTRL); + RAL_WRITE(sc, RT2860_GPIO_CTRL, (tmp & ~0x0808) | 0x08); + } else { + tmp = RAL_READ(sc, RT2860_PCI_EECTRL); + RAL_WRITE(sc, RT2860_PCI_EECTRL, tmp | RT2860_C); + tmp = RAL_READ(sc, RT2860_GPIO_CTRL); + RAL_WRITE(sc, RT2860_GPIO_CTRL, tmp & ~0x0808); + } +} + +static void +rt2860_switch_chan(struct rt2860_softc *sc, struct ieee80211_channel *c) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + u_int chan, group; + + chan = ieee80211_chan2ieee(ic, c); + if (chan == 0 || chan == IEEE80211_CHAN_ANY) + return; + + if (sc->mac_ver >= 0x3071) + rt3090_set_chan(sc, chan); + else + rt2860_set_chan(sc, chan); + + /* determine channel group */ + if (chan <= 14) + group = 0; + else if (chan <= 64) + group = 1; + else if (chan <= 128) + group = 2; + else + group = 3; + + /* XXX necessary only when group has changed! */ + rt2860_select_chan_group(sc, group); + + DELAY(1000); +} + +static int +rt2860_setup_beacon(struct rt2860_softc *sc, struct ieee80211vap *vap) +{ + struct ieee80211com *ic = vap->iv_ic; + struct ieee80211_beacon_offsets bo; + struct rt2860_txwi txwi; + struct mbuf *m; + int ridx; + + if ((m = ieee80211_beacon_alloc(vap->iv_bss, &bo)) == NULL) + return ENOBUFS; + + memset(&txwi, 0, sizeof txwi); + txwi.wcid = 0xff; + txwi.len = htole16(m->m_pkthdr.len); + /* send beacons at the lowest available rate */ + ridx = IEEE80211_IS_CHAN_5GHZ(ic->ic_bsschan) ? + RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1; + txwi.phy = htole16(rt2860_rates[ridx].mcs); + if (rt2860_rates[ridx].phy == IEEE80211_T_OFDM) + txwi.phy |= htole16(RT2860_PHY_OFDM); + txwi.txop = RT2860_TX_TXOP_HT; + txwi.flags = RT2860_TX_TS; + txwi.xflags = RT2860_TX_NSEQ; + + RAL_WRITE_REGION_1(sc, RT2860_BCN_BASE(0), + (uint8_t *)&txwi, sizeof txwi); + RAL_WRITE_REGION_1(sc, RT2860_BCN_BASE(0) + sizeof txwi, + mtod(m, uint8_t *), m->m_pkthdr.len); + + m_freem(m); + + return 0; +} + +static void +rt2860_enable_tsf_sync(struct rt2860_softc *sc) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + uint32_t tmp; + + tmp = RAL_READ(sc, RT2860_BCN_TIME_CFG); + + tmp &= ~0x1fffff; + tmp |= vap->iv_bss->ni_intval * 16; + tmp |= RT2860_TSF_TIMER_EN | RT2860_TBTT_TIMER_EN; + if (vap->iv_opmode == IEEE80211_M_STA) { + /* + * Local TSF is always updated with remote TSF on beacon + * reception. + */ + tmp |= 1 << RT2860_TSF_SYNC_MODE_SHIFT; + } + else if (vap->iv_opmode == IEEE80211_M_IBSS || + vap->iv_opmode == IEEE80211_M_MBSS) { + tmp |= RT2860_BCN_TX_EN; + /* + * Local TSF is updated with remote TSF on beacon reception + * only if the remote TSF is greater than local TSF. + */ + tmp |= 2 << RT2860_TSF_SYNC_MODE_SHIFT; + } else if (vap->iv_opmode == IEEE80211_M_HOSTAP) { + tmp |= RT2860_BCN_TX_EN; + /* SYNC with nobody */ + tmp |= 3 << RT2860_TSF_SYNC_MODE_SHIFT; + } + + RAL_WRITE(sc, RT2860_BCN_TIME_CFG, tmp); +} diff --git a/sys/dev/ral/rt2860reg.h b/sys/dev/ral/rt2860reg.h new file mode 100644 index 00000000000..06c275d47f0 --- /dev/null +++ b/sys/dev/ral/rt2860reg.h @@ -0,0 +1,1255 @@ +/*- + * Copyright (c) 2007 Damien Bergamini + * Copyright (c) 2012 Bernhard Schmidt + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $OpenBSD: rt2860reg.h,v 1.30 2010/05/10 18:17:10 damien Exp $ + * $FreeBSD$ + */ + +#define RT2860_NOISE_FLOOR -95 + +/* PCI registers */ +#define RT2860_PCI_CFG 0x0000 +#define RT2860_PCI_EECTRL 0x0004 +#define RT2860_PCI_MCUCTRL 0x0008 +#define RT2860_PCI_SYSCTRL 0x000c +#define RT2860_PCIE_JTAG 0x0010 + +#define RT3090_AUX_CTRL 0x010c + +#define RT3070_OPT_14 0x0114 + +/* SCH/DMA registers */ +#define RT2860_INT_STATUS 0x0200 +#define RT2860_INT_MASK 0x0204 +#define RT2860_WPDMA_GLO_CFG 0x0208 +#define RT2860_WPDMA_RST_IDX 0x020c +#define RT2860_DELAY_INT_CFG 0x0210 +#define RT2860_WMM_AIFSN_CFG 0x0214 +#define RT2860_WMM_CWMIN_CFG 0x0218 +#define RT2860_WMM_CWMAX_CFG 0x021c +#define RT2860_WMM_TXOP0_CFG 0x0220 +#define RT2860_WMM_TXOP1_CFG 0x0224 +#define RT2860_GPIO_CTRL 0x0228 +#define RT2860_MCU_CMD_REG 0x022c +#define RT2860_TX_BASE_PTR(qid) (0x0230 + (qid) * 16) +#define RT2860_TX_MAX_CNT(qid) (0x0234 + (qid) * 16) +#define RT2860_TX_CTX_IDX(qid) (0x0238 + (qid) * 16) +#define RT2860_TX_DTX_IDX(qid) (0x023c + (qid) * 16) +#define RT2860_RX_BASE_PTR 0x0290 +#define RT2860_RX_MAX_CNT 0x0294 +#define RT2860_RX_CALC_IDX 0x0298 +#define RT2860_FS_DRX_IDX 0x029c +#define RT2860_USB_DMA_CFG 0x02a0 /* RT2870 only */ +#define RT2860_US_CYC_CNT 0x02a4 + +/* PBF registers */ +#define RT2860_SYS_CTRL 0x0400 +#define RT2860_HOST_CMD 0x0404 +#define RT2860_PBF_CFG 0x0408 +#define RT2860_MAX_PCNT 0x040c +#define RT2860_BUF_CTRL 0x0410 +#define RT2860_MCU_INT_STA 0x0414 +#define RT2860_MCU_INT_ENA 0x0418 +#define RT2860_TXQ_IO(qid) (0x041c + (qid) * 4) +#define RT2860_RX0Q_IO 0x0424 +#define RT2860_BCN_OFFSET0 0x042c +#define RT2860_BCN_OFFSET1 0x0430 +#define RT2860_TXRXQ_STA 0x0434 +#define RT2860_TXRXQ_PCNT 0x0438 +#define RT2860_PBF_DBG 0x043c +#define RT2860_CAP_CTRL 0x0440 + +/* RT3070 registers */ +#define RT3070_RF_CSR_CFG 0x0500 +#define RT3070_EFUSE_CTRL 0x0580 +#define RT3070_EFUSE_DATA0 0x0590 +#define RT3070_EFUSE_DATA1 0x0594 +#define RT3070_EFUSE_DATA2 0x0598 +#define RT3070_EFUSE_DATA3 0x059c +#define RT3090_OSC_CTRL 0x05a4 +#define RT3070_LDO_CFG0 0x05d4 +#define RT3070_GPIO_SWITCH 0x05dc + +/* MAC registers */ +#define RT2860_ASIC_VER_ID 0x1000 +#define RT2860_MAC_SYS_CTRL 0x1004 +#define RT2860_MAC_ADDR_DW0 0x1008 +#define RT2860_MAC_ADDR_DW1 0x100c +#define RT2860_MAC_BSSID_DW0 0x1010 +#define RT2860_MAC_BSSID_DW1 0x1014 +#define RT2860_MAX_LEN_CFG 0x1018 +#define RT2860_BBP_CSR_CFG 0x101c +#define RT2860_RF_CSR_CFG0 0x1020 +#define RT2860_RF_CSR_CFG1 0x1024 +#define RT2860_RF_CSR_CFG2 0x1028 +#define RT2860_LED_CFG 0x102c + +/* undocumented registers */ +#define RT2860_DEBUG 0x10f4 + +/* MAC Timing control registers */ +#define RT2860_XIFS_TIME_CFG 0x1100 +#define RT2860_BKOFF_SLOT_CFG 0x1104 +#define RT2860_NAV_TIME_CFG 0x1108 +#define RT2860_CH_TIME_CFG 0x110c +#define RT2860_PBF_LIFE_TIMER 0x1110 +#define RT2860_BCN_TIME_CFG 0x1114 +#define RT2860_TBTT_SYNC_CFG 0x1118 +#define RT2860_TSF_TIMER_DW0 0x111c +#define RT2860_TSF_TIMER_DW1 0x1120 +#define RT2860_TBTT_TIMER 0x1124 +#define RT2860_INT_TIMER_CFG 0x1128 +#define RT2860_INT_TIMER_EN 0x112c +#define RT2860_CH_IDLE_TIME 0x1130 + +/* MAC Power Save configuration registers */ +#define RT2860_MAC_STATUS_REG 0x1200 +#define RT2860_PWR_PIN_CFG 0x1204 +#define RT2860_AUTO_WAKEUP_CFG 0x1208 + +/* MAC TX configuration registers */ +#define RT2860_EDCA_AC_CFG(aci) (0x1300 + (aci) * 4) +#define RT2860_EDCA_TID_AC_MAP 0x1310 +#define RT2860_TX_PWR_CFG(ridx) (0x1314 + (ridx) * 4) +#define RT2860_TX_PIN_CFG 0x1328 +#define RT2860_TX_BAND_CFG 0x132c +#define RT2860_TX_SW_CFG0 0x1330 +#define RT2860_TX_SW_CFG1 0x1334 +#define RT2860_TX_SW_CFG2 0x1338 +#define RT2860_TXOP_THRES_CFG 0x133c +#define RT2860_TXOP_CTRL_CFG 0x1340 +#define RT2860_TX_RTS_CFG 0x1344 +#define RT2860_TX_TIMEOUT_CFG 0x1348 +#define RT2860_TX_RTY_CFG 0x134c +#define RT2860_TX_LINK_CFG 0x1350 +#define RT2860_HT_FBK_CFG0 0x1354 +#define RT2860_HT_FBK_CFG1 0x1358 +#define RT2860_LG_FBK_CFG0 0x135c +#define RT2860_LG_FBK_CFG1 0x1360 +#define RT2860_CCK_PROT_CFG 0x1364 +#define RT2860_OFDM_PROT_CFG 0x1368 +#define RT2860_MM20_PROT_CFG 0x136c +#define RT2860_MM40_PROT_CFG 0x1370 +#define RT2860_GF20_PROT_CFG 0x1374 +#define RT2860_GF40_PROT_CFG 0x1378 +#define RT2860_EXP_CTS_TIME 0x137c +#define RT2860_EXP_ACK_TIME 0x1380 + +/* MAC RX configuration registers */ +#define RT2860_RX_FILTR_CFG 0x1400 +#define RT2860_AUTO_RSP_CFG 0x1404 +#define RT2860_LEGACY_BASIC_RATE 0x1408 +#define RT2860_HT_BASIC_RATE 0x140c +#define RT2860_HT_CTRL_CFG 0x1410 +#define RT2860_SIFS_COST_CFG 0x1414 +#define RT2860_RX_PARSER_CFG 0x1418 + +/* MAC Security configuration registers */ +#define RT2860_TX_SEC_CNT0 0x1500 +#define RT2860_RX_SEC_CNT0 0x1504 +#define RT2860_CCMP_FC_MUTE 0x1508 + +/* MAC HCCA/PSMP configuration registers */ +#define RT2860_TXOP_HLDR_ADDR0 0x1600 +#define RT2860_TXOP_HLDR_ADDR1 0x1604 +#define RT2860_TXOP_HLDR_ET 0x1608 +#define RT2860_QOS_CFPOLL_RA_DW0 0x160c +#define RT2860_QOS_CFPOLL_A1_DW1 0x1610 +#define RT2860_QOS_CFPOLL_QC 0x1614 + +/* MAC Statistics Counters */ +#define RT2860_RX_STA_CNT0 0x1700 +#define RT2860_RX_STA_CNT1 0x1704 +#define RT2860_RX_STA_CNT2 0x1708 +#define RT2860_TX_STA_CNT0 0x170c +#define RT2860_TX_STA_CNT1 0x1710 +#define RT2860_TX_STA_CNT2 0x1714 +#define RT2860_TX_STAT_FIFO 0x1718 + +/* RX WCID search table */ +#define RT2860_WCID_ENTRY(wcid) (0x1800 + (wcid) * 8) + +#define RT2860_FW_BASE 0x2000 +#define RT2870_FW_BASE 0x3000 + +/* Pair-wise key table */ +#define RT2860_PKEY(wcid) (0x4000 + (wcid) * 32) + +/* IV/EIV table */ +#define RT2860_IVEIV(wcid) (0x6000 + (wcid) * 8) + +/* WCID attribute table */ +#define RT2860_WCID_ATTR(wcid) (0x6800 + (wcid) * 4) + +/* Shared Key Table */ +#define RT2860_SKEY(vap, kidx) (0x6c00 + (vap) * 128 + (kidx) * 32) + +/* Shared Key Mode */ +#define RT2860_SKEY_MODE_0_7 0x7000 +#define RT2860_SKEY_MODE_8_15 0x7004 +#define RT2860_SKEY_MODE_16_23 0x7008 +#define RT2860_SKEY_MODE_24_31 0x700c + +/* Shared Memory between MCU and host */ +#define RT2860_H2M_MAILBOX 0x7010 +#define RT2860_H2M_MAILBOX_CID 0x7014 +#define RT2860_H2M_MAILBOX_STATUS 0x701c +#define RT2860_H2M_BBPAGENT 0x7028 +#define RT2860_BCN_BASE(vap) (0x7800 + (vap) * 512) + + +/* possible flags for RT2860_PCI_CFG */ +#define RT2860_PCI_CFG_USB (1 << 17) +#define RT2860_PCI_CFG_PCI (1 << 16) + +/* possible flags for register RT2860_PCI_EECTRL */ +#define RT2860_C (1 << 0) +#define RT2860_S (1 << 1) +#define RT2860_D (1 << 2) +#define RT2860_SHIFT_D 2 +#define RT2860_Q (1 << 3) +#define RT2860_SHIFT_Q 3 + +/* possible flags for registers INT_STATUS/INT_MASK */ +#define RT2860_TX_COHERENT (1 << 17) +#define RT2860_RX_COHERENT (1 << 16) +#define RT2860_MAC_INT_4 (1 << 15) +#define RT2860_MAC_INT_3 (1 << 14) +#define RT2860_MAC_INT_2 (1 << 13) +#define RT2860_MAC_INT_1 (1 << 12) +#define RT2860_MAC_INT_0 (1 << 11) +#define RT2860_TX_RX_COHERENT (1 << 10) +#define RT2860_MCU_CMD_INT (1 << 9) +#define RT2860_TX_DONE_INT5 (1 << 8) +#define RT2860_TX_DONE_INT4 (1 << 7) +#define RT2860_TX_DONE_INT3 (1 << 6) +#define RT2860_TX_DONE_INT2 (1 << 5) +#define RT2860_TX_DONE_INT1 (1 << 4) +#define RT2860_TX_DONE_INT0 (1 << 3) +#define RT2860_RX_DONE_INT (1 << 2) +#define RT2860_TX_DLY_INT (1 << 1) +#define RT2860_RX_DLY_INT (1 << 0) + +/* possible flags for register WPDMA_GLO_CFG */ +#define RT2860_HDR_SEG_LEN_SHIFT 8 +#define RT2860_BIG_ENDIAN (1 << 7) +#define RT2860_TX_WB_DDONE (1 << 6) +#define RT2860_WPDMA_BT_SIZE_SHIFT 4 +#define RT2860_WPDMA_BT_SIZE16 0 +#define RT2860_WPDMA_BT_SIZE32 1 +#define RT2860_WPDMA_BT_SIZE64 2 +#define RT2860_WPDMA_BT_SIZE128 3 +#define RT2860_RX_DMA_BUSY (1 << 3) +#define RT2860_RX_DMA_EN (1 << 2) +#define RT2860_TX_DMA_BUSY (1 << 1) +#define RT2860_TX_DMA_EN (1 << 0) + +/* possible flags for register DELAY_INT_CFG */ +#define RT2860_TXDLY_INT_EN (1 << 31) +#define RT2860_TXMAX_PINT_SHIFT 24 +#define RT2860_TXMAX_PTIME_SHIFT 16 +#define RT2860_RXDLY_INT_EN (1 << 15) +#define RT2860_RXMAX_PINT_SHIFT 8 +#define RT2860_RXMAX_PTIME_SHIFT 0 + +/* possible flags for register GPIO_CTRL */ +#define RT2860_GPIO_D_SHIFT 8 +#define RT2860_GPIO_O_SHIFT 0 + +/* possible flags for register USB_DMA_CFG */ +#define RT2860_USB_TX_BUSY (1 << 31) +#define RT2860_USB_RX_BUSY (1 << 30) +#define RT2860_USB_EPOUT_VLD_SHIFT 24 +#define RT2860_USB_TX_EN (1 << 23) +#define RT2860_USB_RX_EN (1 << 22) +#define RT2860_USB_RX_AGG_EN (1 << 21) +#define RT2860_USB_TXOP_HALT (1 << 20) +#define RT2860_USB_TX_CLEAR (1 << 19) +#define RT2860_USB_PHY_WD_EN (1 << 16) +#define RT2860_USB_PHY_MAN_RST (1 << 15) +#define RT2860_USB_RX_AGG_LMT(x) ((x) << 8) /* in unit of 1KB */ +#define RT2860_USB_RX_AGG_TO(x) ((x) & 0xff) /* in unit of 33ns */ + +/* possible flags for register US_CYC_CNT */ +#define RT2860_TEST_EN (1 << 24) +#define RT2860_TEST_SEL_SHIFT 16 +#define RT2860_BT_MODE_EN (1 << 8) +#define RT2860_US_CYC_CNT_SHIFT 0 + +/* possible flags for register SYS_CTRL */ +#define RT2860_HST_PM_SEL (1 << 16) +#define RT2860_CAP_MODE (1 << 14) +#define RT2860_PME_OEN (1 << 13) +#define RT2860_CLKSELECT (1 << 12) +#define RT2860_PBF_CLK_EN (1 << 11) +#define RT2860_MAC_CLK_EN (1 << 10) +#define RT2860_DMA_CLK_EN (1 << 9) +#define RT2860_MCU_READY (1 << 7) +#define RT2860_ASY_RESET (1 << 4) +#define RT2860_PBF_RESET (1 << 3) +#define RT2860_MAC_RESET (1 << 2) +#define RT2860_DMA_RESET (1 << 1) +#define RT2860_MCU_RESET (1 << 0) + +/* possible values for register HOST_CMD */ +#define RT2860_MCU_CMD_SLEEP 0x30 +#define RT2860_MCU_CMD_WAKEUP 0x31 +#define RT2860_MCU_CMD_LEDS 0x50 +#define RT2860_MCU_CMD_LED_RSSI 0x51 +#define RT2860_MCU_CMD_LED1 0x52 +#define RT2860_MCU_CMD_LED2 0x53 +#define RT2860_MCU_CMD_LED3 0x54 +#define RT2860_MCU_CMD_RFRESET 0x72 +#define RT2860_MCU_CMD_ANTSEL 0x73 +#define RT2860_MCU_CMD_BBP 0x80 +#define RT2860_MCU_CMD_PSLEVEL 0x83 + +/* possible flags for register PBF_CFG */ +#define RT2860_TX1Q_NUM_SHIFT 21 +#define RT2860_TX2Q_NUM_SHIFT 16 +#define RT2860_NULL0_MODE (1 << 15) +#define RT2860_NULL1_MODE (1 << 14) +#define RT2860_RX_DROP_MODE (1 << 13) +#define RT2860_TX0Q_MANUAL (1 << 12) +#define RT2860_TX1Q_MANUAL (1 << 11) +#define RT2860_TX2Q_MANUAL (1 << 10) +#define RT2860_RX0Q_MANUAL (1 << 9) +#define RT2860_HCCA_EN (1 << 8) +#define RT2860_TX0Q_EN (1 << 4) +#define RT2860_TX1Q_EN (1 << 3) +#define RT2860_TX2Q_EN (1 << 2) +#define RT2860_RX0Q_EN (1 << 1) + +/* possible flags for register BUF_CTRL */ +#define RT2860_WRITE_TXQ(qid) (1 << (11 - (qid))) +#define RT2860_NULL0_KICK (1 << 7) +#define RT2860_NULL1_KICK (1 << 6) +#define RT2860_BUF_RESET (1 << 5) +#define RT2860_READ_TXQ(qid) (1 << (3 - (qid)) +#define RT2860_READ_RX0Q (1 << 0) + +/* possible flags for registers MCU_INT_STA/MCU_INT_ENA */ +#define RT2860_MCU_MAC_INT_8 (1 << 24) +#define RT2860_MCU_MAC_INT_7 (1 << 23) +#define RT2860_MCU_MAC_INT_6 (1 << 22) +#define RT2860_MCU_MAC_INT_4 (1 << 20) +#define RT2860_MCU_MAC_INT_3 (1 << 19) +#define RT2860_MCU_MAC_INT_2 (1 << 18) +#define RT2860_MCU_MAC_INT_1 (1 << 17) +#define RT2860_MCU_MAC_INT_0 (1 << 16) +#define RT2860_DTX0_INT (1 << 11) +#define RT2860_DTX1_INT (1 << 10) +#define RT2860_DTX2_INT (1 << 9) +#define RT2860_DRX0_INT (1 << 8) +#define RT2860_HCMD_INT (1 << 7) +#define RT2860_N0TX_INT (1 << 6) +#define RT2860_N1TX_INT (1 << 5) +#define RT2860_BCNTX_INT (1 << 4) +#define RT2860_MTX0_INT (1 << 3) +#define RT2860_MTX1_INT (1 << 2) +#define RT2860_MTX2_INT (1 << 1) +#define RT2860_MRX0_INT (1 << 0) + +/* possible flags for register TXRXQ_PCNT */ +#define RT2860_RX0Q_PCNT_MASK 0xff000000 +#define RT2860_TX2Q_PCNT_MASK 0x00ff0000 +#define RT2860_TX1Q_PCNT_MASK 0x0000ff00 +#define RT2860_TX0Q_PCNT_MASK 0x000000ff + +/* possible flags for register CAP_CTRL */ +#define RT2860_CAP_ADC_FEQ (1 << 31) +#define RT2860_CAP_START (1 << 30) +#define RT2860_MAN_TRIG (1 << 29) +#define RT2860_TRIG_OFFSET_SHIFT 16 +#define RT2860_START_ADDR_SHIFT 0 + +/* possible flags for register RF_CSR_CFG */ +#define RT3070_RF_KICK (1 << 17) +#define RT3070_RF_WRITE (1 << 16) + +/* possible flags for register EFUSE_CTRL */ +#define RT3070_SEL_EFUSE (1 << 31) +#define RT3070_EFSROM_KICK (1 << 30) +#define RT3070_EFSROM_AIN_MASK 0x03ff0000 +#define RT3070_EFSROM_AIN_SHIFT 16 +#define RT3070_EFSROM_MODE_MASK 0x000000c0 +#define RT3070_EFUSE_AOUT_MASK 0x0000003f + +/* possible flags for register MAC_SYS_CTRL */ +#define RT2860_RX_TS_EN (1 << 7) +#define RT2860_WLAN_HALT_EN (1 << 6) +#define RT2860_PBF_LOOP_EN (1 << 5) +#define RT2860_CONT_TX_TEST (1 << 4) +#define RT2860_MAC_RX_EN (1 << 3) +#define RT2860_MAC_TX_EN (1 << 2) +#define RT2860_BBP_HRST (1 << 1) +#define RT2860_MAC_SRST (1 << 0) + +/* possible flags for register MAC_BSSID_DW1 */ +#define RT2860_MULTI_BCN_NUM_SHIFT 18 +#define RT2860_MULTI_BSSID_MODE_SHIFT 16 + +/* possible flags for register MAX_LEN_CFG */ +#define RT2860_MIN_MPDU_LEN_SHIFT 16 +#define RT2860_MAX_PSDU_LEN_SHIFT 12 +#define RT2860_MAX_PSDU_LEN8K 0 +#define RT2860_MAX_PSDU_LEN16K 1 +#define RT2860_MAX_PSDU_LEN32K 2 +#define RT2860_MAX_PSDU_LEN64K 3 +#define RT2860_MAX_MPDU_LEN_SHIFT 0 + +/* possible flags for registers BBP_CSR_CFG/H2M_BBPAGENT */ +#define RT2860_BBP_RW_PARALLEL (1 << 19) +#define RT2860_BBP_PAR_DUR_112_5 (1 << 18) +#define RT2860_BBP_CSR_KICK (1 << 17) +#define RT2860_BBP_CSR_READ (1 << 16) +#define RT2860_BBP_ADDR_SHIFT 8 +#define RT2860_BBP_DATA_SHIFT 0 + +/* possible flags for register RF_CSR_CFG0 */ +#define RT2860_RF_REG_CTRL (1 << 31) +#define RT2860_RF_LE_SEL1 (1 << 30) +#define RT2860_RF_LE_STBY (1 << 29) +#define RT2860_RF_REG_WIDTH_SHIFT 24 +#define RT2860_RF_REG_0_SHIFT 0 + +/* possible flags for register RF_CSR_CFG1 */ +#define RT2860_RF_DUR_5 (1 << 24) +#define RT2860_RF_REG_1_SHIFT 0 + +/* possible flags for register LED_CFG */ +#define RT2860_LED_POL (1 << 30) +#define RT2860_Y_LED_MODE_SHIFT 28 +#define RT2860_G_LED_MODE_SHIFT 26 +#define RT2860_R_LED_MODE_SHIFT 24 +#define RT2860_LED_MODE_OFF 0 +#define RT2860_LED_MODE_BLINK_TX 1 +#define RT2860_LED_MODE_SLOW_BLINK 2 +#define RT2860_LED_MODE_ON 3 +#define RT2860_SLOW_BLK_TIME_SHIFT 16 +#define RT2860_LED_OFF_TIME_SHIFT 8 +#define RT2860_LED_ON_TIME_SHIFT 0 + +/* possible flags for register XIFS_TIME_CFG */ +#define RT2860_BB_RXEND_EN (1 << 29) +#define RT2860_EIFS_TIME_SHIFT 20 +#define RT2860_OFDM_XIFS_TIME_SHIFT 16 +#define RT2860_OFDM_SIFS_TIME_SHIFT 8 +#define RT2860_CCK_SIFS_TIME_SHIFT 0 + +/* possible flags for register BKOFF_SLOT_CFG */ +#define RT2860_CC_DELAY_TIME_SHIFT 8 +#define RT2860_SLOT_TIME 0 + +/* possible flags for register NAV_TIME_CFG */ +#define RT2860_NAV_UPD (1 << 31) +#define RT2860_NAV_UPD_VAL_SHIFT 16 +#define RT2860_NAV_CLR_EN (1 << 15) +#define RT2860_NAV_TIMER_SHIFT 0 + +/* possible flags for register CH_TIME_CFG */ +#define RT2860_EIFS_AS_CH_BUSY (1 << 4) +#define RT2860_NAV_AS_CH_BUSY (1 << 3) +#define RT2860_RX_AS_CH_BUSY (1 << 2) +#define RT2860_TX_AS_CH_BUSY (1 << 1) +#define RT2860_CH_STA_TIMER_EN (1 << 0) + +/* possible values for register BCN_TIME_CFG */ +#define RT2860_TSF_INS_COMP_SHIFT 24 +#define RT2860_BCN_TX_EN (1 << 20) +#define RT2860_TBTT_TIMER_EN (1 << 19) +#define RT2860_TSF_SYNC_MODE_SHIFT 17 +#define RT2860_TSF_SYNC_MODE_DIS 0 +#define RT2860_TSF_SYNC_MODE_STA 1 +#define RT2860_TSF_SYNC_MODE_IBSS 2 +#define RT2860_TSF_SYNC_MODE_HOSTAP 3 +#define RT2860_TSF_TIMER_EN (1 << 16) +#define RT2860_BCN_INTVAL_SHIFT 0 + +/* possible flags for register TBTT_SYNC_CFG */ +#define RT2860_BCN_CWMIN_SHIFT 20 +#define RT2860_BCN_AIFSN_SHIFT 16 +#define RT2860_BCN_EXP_WIN_SHIFT 8 +#define RT2860_TBTT_ADJUST_SHIFT 0 + +/* possible flags for register INT_TIMER_CFG */ +#define RT2860_GP_TIMER_SHIFT 16 +#define RT2860_PRE_TBTT_TIMER_SHIFT 0 + +/* possible flags for register INT_TIMER_EN */ +#define RT2860_GP_TIMER_EN (1 << 1) +#define RT2860_PRE_TBTT_INT_EN (1 << 0) + +/* possible flags for register MAC_STATUS_REG */ +#define RT2860_RX_STATUS_BUSY (1 << 1) +#define RT2860_TX_STATUS_BUSY (1 << 0) + +/* possible flags for register PWR_PIN_CFG */ +#define RT2860_IO_ADDA_PD (1 << 3) +#define RT2860_IO_PLL_PD (1 << 2) +#define RT2860_IO_RA_PE (1 << 1) +#define RT2860_IO_RF_PE (1 << 0) + +/* possible flags for register AUTO_WAKEUP_CFG */ +#define RT2860_AUTO_WAKEUP_EN (1 << 15) +#define RT2860_SLEEP_TBTT_NUM_SHIFT 8 +#define RT2860_WAKEUP_LEAD_TIME_SHIFT 0 + +/* possible flags for register TX_PIN_CFG */ +#define RT3593_LNA_PE_G2_POL (1 << 31) +#define RT3593_LNA_PE_A2_POL (1 << 30) +#define RT3593_LNA_PE_G2_EN (1 << 29) +#define RT3593_LNA_PE_A2_EN (1 << 28) +#define RT3593_LNA_PE2_EN (RT3593_LNA_PE_A2_EN | RT3593_LNA_PE_G2_EN) +#define RT3593_PA_PE_G2_POL (1 << 27) +#define RT3593_PA_PE_A2_POL (1 << 26) +#define RT3593_PA_PE_G2_EN (1 << 25) +#define RT3593_PA_PE_A2_EN (1 << 24) +#define RT2860_TRSW_POL (1 << 19) +#define RT2860_TRSW_EN (1 << 18) +#define RT2860_RFTR_POL (1 << 17) +#define RT2860_RFTR_EN (1 << 16) +#define RT2860_LNA_PE_G1_POL (1 << 15) +#define RT2860_LNA_PE_A1_POL (1 << 14) +#define RT2860_LNA_PE_G0_POL (1 << 13) +#define RT2860_LNA_PE_A0_POL (1 << 12) +#define RT2860_LNA_PE_G1_EN (1 << 11) +#define RT2860_LNA_PE_A1_EN (1 << 10) +#define RT2860_LNA_PE1_EN (RT2860_LNA_PE_A1_EN | RT2860_LNA_PE_G1_EN) +#define RT2860_LNA_PE_G0_EN (1 << 9) +#define RT2860_LNA_PE_A0_EN (1 << 8) +#define RT2860_LNA_PE0_EN (RT2860_LNA_PE_A0_EN | RT2860_LNA_PE_G0_EN) +#define RT2860_PA_PE_G1_POL (1 << 7) +#define RT2860_PA_PE_A1_POL (1 << 6) +#define RT2860_PA_PE_G0_POL (1 << 5) +#define RT2860_PA_PE_A0_POL (1 << 4) +#define RT2860_PA_PE_G1_EN (1 << 3) +#define RT2860_PA_PE_A1_EN (1 << 2) +#define RT2860_PA_PE_G0_EN (1 << 1) +#define RT2860_PA_PE_A0_EN (1 << 0) + +/* possible flags for register TX_BAND_CFG */ +#define RT2860_5G_BAND_SEL_N (1 << 2) +#define RT2860_5G_BAND_SEL_P (1 << 1) +#define RT2860_TX_BAND_SEL (1 << 0) + +/* possible flags for register TX_SW_CFG0 */ +#define RT2860_DLY_RFTR_EN_SHIFT 24 +#define RT2860_DLY_TRSW_EN_SHIFT 16 +#define RT2860_DLY_PAPE_EN_SHIFT 8 +#define RT2860_DLY_TXPE_EN_SHIFT 0 + +/* possible flags for register TX_SW_CFG1 */ +#define RT2860_DLY_RFTR_DIS_SHIFT 16 +#define RT2860_DLY_TRSW_DIS_SHIFT 8 +#define RT2860_DLY_PAPE_DIS SHIFT 0 + +/* possible flags for register TX_SW_CFG2 */ +#define RT2860_DLY_LNA_EN_SHIFT 24 +#define RT2860_DLY_LNA_DIS_SHIFT 16 +#define RT2860_DLY_DAC_EN_SHIFT 8 +#define RT2860_DLY_DAC_DIS_SHIFT 0 + +/* possible flags for register TXOP_THRES_CFG */ +#define RT2860_TXOP_REM_THRES_SHIFT 24 +#define RT2860_CF_END_THRES_SHIFT 16 +#define RT2860_RDG_IN_THRES 8 +#define RT2860_RDG_OUT_THRES 0 + +/* possible flags for register TXOP_CTRL_CFG */ +#define RT2860_EXT_CW_MIN_SHIFT 16 +#define RT2860_EXT_CCA_DLY_SHIFT 8 +#define RT2860_EXT_CCA_EN (1 << 7) +#define RT2860_LSIG_TXOP_EN (1 << 6) +#define RT2860_TXOP_TRUN_EN_MIMOPS (1 << 4) +#define RT2860_TXOP_TRUN_EN_TXOP (1 << 3) +#define RT2860_TXOP_TRUN_EN_RATE (1 << 2) +#define RT2860_TXOP_TRUN_EN_AC (1 << 1) +#define RT2860_TXOP_TRUN_EN_TIMEOUT (1 << 0) + +/* possible flags for register TX_RTS_CFG */ +#define RT2860_RTS_FBK_EN (1 << 24) +#define RT2860_RTS_THRES_SHIFT 8 +#define RT2860_RTS_RTY_LIMIT_SHIFT 0 + +/* possible flags for register TX_TIMEOUT_CFG */ +#define RT2860_TXOP_TIMEOUT_SHIFT 16 +#define RT2860_RX_ACK_TIMEOUT_SHIFT 8 +#define RT2860_MPDU_LIFE_TIME_SHIFT 4 + +/* possible flags for register TX_RTY_CFG */ +#define RT2860_TX_AUTOFB_EN (1 << 30) +#define RT2860_AGG_RTY_MODE_TIMER (1 << 29) +#define RT2860_NAG_RTY_MODE_TIMER (1 << 28) +#define RT2860_LONG_RTY_THRES_SHIFT 16 +#define RT2860_LONG_RTY_LIMIT_SHIFT 8 +#define RT2860_SHORT_RTY_LIMIT_SHIFT 0 + +/* possible flags for register TX_LINK_CFG */ +#define RT2860_REMOTE_MFS_SHIFT 24 +#define RT2860_REMOTE_MFB_SHIFT 16 +#define RT2860_TX_CFACK_EN (1 << 12) +#define RT2860_TX_RDG_EN (1 << 11) +#define RT2860_TX_MRQ_EN (1 << 10) +#define RT2860_REMOTE_UMFS_EN (1 << 9) +#define RT2860_TX_MFB_EN (1 << 8) +#define RT2860_REMOTE_MFB_LT_SHIFT 0 + +/* possible flags for registers *_PROT_CFG */ +#define RT2860_RTSTH_EN (1 << 26) +#define RT2860_TXOP_ALLOW_GF40 (1 << 25) +#define RT2860_TXOP_ALLOW_GF20 (1 << 24) +#define RT2860_TXOP_ALLOW_MM40 (1 << 23) +#define RT2860_TXOP_ALLOW_MM20 (1 << 22) +#define RT2860_TXOP_ALLOW_OFDM (1 << 21) +#define RT2860_TXOP_ALLOW_CCK (1 << 20) +#define RT2860_TXOP_ALLOW_ALL (0x3f << 20) +#define RT2860_PROT_NAV_SHORT (1 << 18) +#define RT2860_PROT_NAV_LONG (2 << 18) +#define RT2860_PROT_CTRL_RTS_CTS (1 << 16) +#define RT2860_PROT_CTRL_CTS (2 << 16) + +/* possible flags for registers EXP_{CTS,ACK}_TIME */ +#define RT2860_EXP_OFDM_TIME_SHIFT 16 +#define RT2860_EXP_CCK_TIME_SHIFT 0 + +/* possible flags for register RX_FILTR_CFG */ +#define RT2860_DROP_CTRL_RSV (1 << 16) +#define RT2860_DROP_BAR (1 << 15) +#define RT2860_DROP_BA (1 << 14) +#define RT2860_DROP_PSPOLL (1 << 13) +#define RT2860_DROP_RTS (1 << 12) +#define RT2860_DROP_CTS (1 << 11) +#define RT2860_DROP_ACK (1 << 10) +#define RT2860_DROP_CFEND (1 << 9) +#define RT2860_DROP_CFACK (1 << 8) +#define RT2860_DROP_DUPL (1 << 7) +#define RT2860_DROP_BC (1 << 6) +#define RT2860_DROP_MC (1 << 5) +#define RT2860_DROP_VER_ERR (1 << 4) +#define RT2860_DROP_NOT_MYBSS (1 << 3) +#define RT2860_DROP_UC_NOME (1 << 2) +#define RT2860_DROP_PHY_ERR (1 << 1) +#define RT2860_DROP_CRC_ERR (1 << 0) + +/* possible flags for register AUTO_RSP_CFG */ +#define RT2860_CTRL_PWR_BIT (1 << 7) +#define RT2860_BAC_ACK_POLICY (1 << 6) +#define RT2860_CCK_SHORT_EN (1 << 4) +#define RT2860_CTS_40M_REF_EN (1 << 3) +#define RT2860_CTS_40M_MODE_EN (1 << 2) +#define RT2860_BAC_ACKPOLICY_EN (1 << 1) +#define RT2860_AUTO_RSP_EN (1 << 0) + +/* possible flags for register SIFS_COST_CFG */ +#define RT2860_OFDM_SIFS_COST_SHIFT 8 +#define RT2860_CCK_SIFS_COST_SHIFT 0 + +/* possible flags for register TXOP_HLDR_ET */ +#define RT2860_TXOP_ETM1_EN (1 << 25) +#define RT2860_TXOP_ETM0_EN (1 << 24) +#define RT2860_TXOP_ETM_THRES_SHIFT 16 +#define RT2860_TXOP_ETO_EN (1 << 8) +#define RT2860_TXOP_ETO_THRES_SHIFT 1 +#define RT2860_PER_RX_RST_EN (1 << 0) + +/* possible flags for register TX_STAT_FIFO */ +#define RT2860_TXQ_MCS_SHIFT 16 +#define RT2860_TXQ_WCID_SHIFT 8 +#define RT2860_TXQ_ACKREQ (1 << 7) +#define RT2860_TXQ_AGG (1 << 6) +#define RT2860_TXQ_OK (1 << 5) +#define RT2860_TXQ_PID_SHIFT 1 +#define RT2860_TXQ_VLD (1 << 0) + +/* possible flags for register WCID_ATTR */ +#define RT2860_MODE_NOSEC 0 +#define RT2860_MODE_WEP40 1 +#define RT2860_MODE_WEP104 2 +#define RT2860_MODE_TKIP 3 +#define RT2860_MODE_AES_CCMP 4 +#define RT2860_MODE_CKIP40 5 +#define RT2860_MODE_CKIP104 6 +#define RT2860_MODE_CKIP128 7 +#define RT2860_RX_PKEY_EN (1 << 0) + +/* possible flags for register H2M_MAILBOX */ +#define RT2860_H2M_BUSY (1 << 24) +#define RT2860_TOKEN_NO_INTR 0xff + + +/* possible flags for MCU command RT2860_MCU_CMD_LEDS */ +#define RT2860_LED_RADIO (1 << 13) +#define RT2860_LED_LINK_2GHZ (1 << 14) +#define RT2860_LED_LINK_5GHZ (1 << 15) + + +/* possible flags for RT3020 RF register 1 */ +#define RT3070_RF_BLOCK (1 << 0) +#define RT3070_RX0_PD (1 << 2) +#define RT3070_TX0_PD (1 << 3) +#define RT3070_RX1_PD (1 << 4) +#define RT3070_TX1_PD (1 << 5) +#define RT3070_RX2_PD (1 << 6) +#define RT3070_TX2_PD (1 << 7) + +/* possible flags for RT3020 RF register 7 */ +#define RT3070_TUNE (1 << 0) + +/* possible flags for RT3020 RF register 15 */ +#define RT3070_TX_LO2 (1 << 3) + +/* possible flags for RT3020 RF register 17 */ +#define RT3070_TX_LO1 (1 << 3) + +/* possible flags for RT3020 RF register 20 */ +#define RT3070_RX_LO1 (1 << 3) + +/* possible flags for RT3020 RF register 21 */ +#define RT3070_RX_LO2 (1 << 3) +#define RT3070_RX_CTB (1 << 7) + +/* possible flags for RT3020 RF register 22 */ +#define RT3070_BB_LOOPBACK (1 << 0) + +/* possible flags for RT3053 RF register 1 */ +#define RT3593_VCO (1 << 0) + +/* possible flags for RT3053 RF register 2 */ +#define RT3593_RESCAL (1 << 7) + +/* possible flags for RT3053 RF register 3 */ +#define RT3593_VCOCAL (1 << 7) + +/* possible flags for RT3053 RF register 6 */ +#define RT3593_VCO_IC (1 << 6) + +/* possible flags for RT3053 RF register 20 */ +#define RT3593_LDO_PLL_VC_MASK 0x0e +#define RT3593_LDO_RF_VC_MASK 0xe0 + +/* possible flags for RT3053 RF register 22 */ +#define RT3593_CP_IC_MASK 0xe0 +#define RT3593_CP_IC_SHIFT 5 + +/* possible flags for RT3053 RF register 46 */ +#define RT3593_RX_CTB (1 << 5) + +#define RT3090_DEF_LNA 10 + +/* RT2860 TX descriptor */ +struct rt2860_txd { + uint32_t sdp0; /* Segment Data Pointer 0 */ + uint16_t sdl1; /* Segment Data Length 1 */ +#define RT2860_TX_BURST (1 << 15) +#define RT2860_TX_LS1 (1 << 14) /* SDP1 is the last segment */ + + uint16_t sdl0; /* Segment Data Length 0 */ +#define RT2860_TX_DDONE (1 << 15) +#define RT2860_TX_LS0 (1 << 14) /* SDP0 is the last segment */ + + uint32_t sdp1; /* Segment Data Pointer 1 */ + uint8_t reserved[3]; + uint8_t flags; +#define RT2860_TX_QSEL_SHIFT 1 +#define RT2860_TX_QSEL_MGMT (0 << 1) +#define RT2860_TX_QSEL_HCCA (1 << 1) +#define RT2860_TX_QSEL_EDCA (2 << 1) +#define RT2860_TX_WIV (1 << 0) +} __packed; + +/* RT2870 TX descriptor */ +struct rt2870_txd { + uint16_t len; + uint8_t pad; + uint8_t flags; +} __packed; + +/* TX Wireless Information */ +struct rt2860_txwi { + uint8_t flags; +#define RT2860_TX_MPDU_DSITY_SHIFT 5 +#define RT2860_TX_AMPDU (1 << 4) +#define RT2860_TX_TS (1 << 3) +#define RT2860_TX_CFACK (1 << 2) +#define RT2860_TX_MMPS (1 << 1) +#define RT2860_TX_FRAG (1 << 0) + + uint8_t txop; +#define RT2860_TX_TXOP_HT 0 +#define RT2860_TX_TXOP_PIFS 1 +#define RT2860_TX_TXOP_SIFS 2 +#define RT2860_TX_TXOP_BACKOFF 3 + + uint16_t phy; +#define RT2860_PHY_MODE 0xc000 +#define RT2860_PHY_CCK (0 << 14) +#define RT2860_PHY_OFDM (1 << 14) +#define RT2860_PHY_HT (2 << 14) +#define RT2860_PHY_HT_GF (3 << 14) +#define RT2860_PHY_SGI (1 << 8) +#define RT2860_PHY_BW40 (1 << 7) +#define RT2860_PHY_MCS 0x7f +#define RT2860_PHY_SHPRE (1 << 3) + + uint8_t xflags; +#define RT2860_TX_BAWINSIZE_SHIFT 2 +#define RT2860_TX_NSEQ (1 << 1) +#define RT2860_TX_ACK (1 << 0) + + uint8_t wcid; /* Wireless Client ID */ + uint16_t len; +#define RT2860_TX_PID_SHIFT 12 + + uint32_t iv; + uint32_t eiv; +} __packed; + +/* RT2860 RX descriptor */ +struct rt2860_rxd { + uint32_t sdp0; + uint16_t sdl1; /* unused */ + uint16_t sdl0; +#define RT2860_RX_DDONE (1 << 15) +#define RT2860_RX_LS0 (1 << 14) + + uint32_t sdp1; /* unused */ + uint32_t flags; +#define RT2860_RX_DEC (1 << 16) +#define RT2860_RX_AMPDU (1 << 15) +#define RT2860_RX_L2PAD (1 << 14) +#define RT2860_RX_RSSI (1 << 13) +#define RT2860_RX_HTC (1 << 12) +#define RT2860_RX_AMSDU (1 << 11) +#define RT2860_RX_MICERR (1 << 10) +#define RT2860_RX_ICVERR (1 << 9) +#define RT2860_RX_CRCERR (1 << 8) +#define RT2860_RX_MYBSS (1 << 7) +#define RT2860_RX_BC (1 << 6) +#define RT2860_RX_MC (1 << 5) +#define RT2860_RX_UC2ME (1 << 4) +#define RT2860_RX_FRAG (1 << 3) +#define RT2860_RX_NULL (1 << 2) +#define RT2860_RX_DATA (1 << 1) +#define RT2860_RX_BA (1 << 0) +} __packed; + +/* RT2870 RX descriptor */ +struct rt2870_rxd { + /* single 32-bit field */ + uint32_t flags; +} __packed; + +/* RX Wireless Information */ +struct rt2860_rxwi { + uint8_t wcid; + uint8_t keyidx; +#define RT2860_RX_UDF_SHIFT 5 +#define RT2860_RX_BSS_IDX_SHIFT 2 + + uint16_t len; +#define RT2860_RX_TID_SHIFT 12 + + uint16_t seq; + uint16_t phy; + uint8_t rssi[3]; + uint8_t reserved1; + uint8_t snr[2]; + uint16_t reserved2; +} __packed; + + +/* first DMA segment contains TXWI + 802.11 header + 32-bit padding */ +#define RT2860_TXWI_DMASZ \ + (sizeof (struct rt2860_txwi) + \ + sizeof (struct ieee80211_frame) + 6 + \ + sizeof (uint16_t)) + +#define RT2860_RF1 0 +#define RT2860_RF2 2 +#define RT2860_RF3 1 +#define RT2860_RF4 3 + +#define RT2860_RF_2820 1 /* 2T3R */ +#define RT2860_RF_2850 2 /* dual-band 2T3R */ +#define RT2860_RF_2720 3 /* 1T2R */ +#define RT2860_RF_2750 4 /* dual-band 1T2R */ +#define RT3070_RF_3020 5 /* 1T1R */ +#define RT3070_RF_2020 6 /* b/g */ +#define RT3070_RF_3021 7 /* 1T2R */ +#define RT3070_RF_3022 8 /* 2T2R */ +#define RT3070_RF_3052 9 /* dual-band 2T2R */ +#define RT3070_RF_3320 11 /* 1T1R */ +#define RT3070_RF_3053 13 /* dual-band 3T3R */ + +/* USB commands for RT2870 only */ +#define RT2870_RESET 1 +#define RT2870_WRITE_2 2 +#define RT2870_WRITE_REGION_1 6 +#define RT2870_READ_REGION_1 7 +#define RT2870_EEPROM_READ 9 + +#define RT2860_EEPROM_DELAY 1 /* minimum hold time (microsecond) */ + +#define RT2860_EEPROM_VERSION 0x01 +#define RT2860_EEPROM_MAC01 0x02 +#define RT2860_EEPROM_MAC23 0x03 +#define RT2860_EEPROM_MAC45 0x04 +#define RT2860_EEPROM_PCIE_PSLEVEL 0x11 +#define RT2860_EEPROM_REV 0x12 +#define RT2860_EEPROM_ANTENNA 0x1a +#define RT2860_EEPROM_CONFIG 0x1b +#define RT2860_EEPROM_COUNTRY 0x1c +#define RT2860_EEPROM_FREQ_LEDS 0x1d +#define RT2860_EEPROM_LED1 0x1e +#define RT2860_EEPROM_LED2 0x1f +#define RT2860_EEPROM_LED3 0x20 +#define RT2860_EEPROM_LNA 0x22 +#define RT2860_EEPROM_RSSI1_2GHZ 0x23 +#define RT2860_EEPROM_RSSI2_2GHZ 0x24 +#define RT2860_EEPROM_RSSI1_5GHZ 0x25 +#define RT2860_EEPROM_RSSI2_5GHZ 0x26 +#define RT2860_EEPROM_DELTAPWR 0x28 +#define RT2860_EEPROM_PWR2GHZ_BASE1 0x29 +#define RT2860_EEPROM_PWR2GHZ_BASE2 0x30 +#define RT2860_EEPROM_TSSI1_2GHZ 0x37 +#define RT2860_EEPROM_TSSI2_2GHZ 0x38 +#define RT2860_EEPROM_TSSI3_2GHZ 0x39 +#define RT2860_EEPROM_TSSI4_2GHZ 0x3a +#define RT2860_EEPROM_TSSI5_2GHZ 0x3b +#define RT2860_EEPROM_PWR5GHZ_BASE1 0x3c +#define RT2860_EEPROM_PWR5GHZ_BASE2 0x53 +#define RT2860_EEPROM_TSSI1_5GHZ 0x6a +#define RT2860_EEPROM_TSSI2_5GHZ 0x6b +#define RT2860_EEPROM_TSSI3_5GHZ 0x6c +#define RT2860_EEPROM_TSSI4_5GHZ 0x6d +#define RT2860_EEPROM_TSSI5_5GHZ 0x6e +#define RT2860_EEPROM_RPWR 0x6f +#define RT2860_EEPROM_BBP_BASE 0x78 +#define RT3071_EEPROM_RF_BASE 0x82 + +#define RT2860_RIDX_CCK1 0 +#define RT2860_RIDX_CCK11 3 +#define RT2860_RIDX_OFDM6 4 +#define RT2860_RIDX_MAX 11 +static const struct rt2860_rate { + uint8_t rate; + uint8_t mcs; + enum ieee80211_phytype phy; + uint8_t ctl_ridx; + uint16_t sp_ack_dur; + uint16_t lp_ack_dur; +} rt2860_rates[] = { + { 2, 0, IEEE80211_T_DS, 0, 314, 314 }, + { 4, 1, IEEE80211_T_DS, 1, 258, 162 }, + { 11, 2, IEEE80211_T_DS, 2, 223, 127 }, + { 22, 3, IEEE80211_T_DS, 3, 213, 117 }, + { 12, 0, IEEE80211_T_OFDM, 4, 60, 60 }, + { 18, 1, IEEE80211_T_OFDM, 4, 52, 52 }, + { 24, 2, IEEE80211_T_OFDM, 6, 48, 48 }, + { 36, 3, IEEE80211_T_OFDM, 6, 44, 44 }, + { 48, 4, IEEE80211_T_OFDM, 8, 44, 44 }, + { 72, 5, IEEE80211_T_OFDM, 8, 40, 40 }, + { 96, 6, IEEE80211_T_OFDM, 8, 40, 40 }, + { 108, 7, IEEE80211_T_OFDM, 8, 40, 40 } +}; + +/* + * Control and status registers access macros. + */ +#define RAL_READ(sc, reg) \ + bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg)) + +#define RAL_WRITE(sc, reg, val) \ + bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val)) + +#define RAL_BARRIER_WRITE(sc) \ + bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, 0x1800, \ + BUS_SPACE_BARRIER_WRITE) + +#define RAL_BARRIER_READ_WRITE(sc) \ + bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, 0x1800, \ + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE) + +#define RAL_WRITE_REGION_1(sc, offset, datap, count) \ + bus_space_write_region_1((sc)->sc_st, (sc)->sc_sh, (offset), \ + (datap), (count)) + +#define RAL_SET_REGION_4(sc, offset, val, count) \ + bus_space_set_region_4((sc)->sc_st, (sc)->sc_sh, (offset), \ + (val), (count)) + +/* + * EEPROM access macro. + */ +#define RT2860_EEPROM_CTL(sc, val) do { \ + RAL_WRITE((sc), RT2860_PCI_EECTRL, (val)); \ + RAL_BARRIER_READ_WRITE((sc)); \ + DELAY(RT2860_EEPROM_DELAY); \ +} while (/* CONSTCOND */0) + +/* + * Default values for MAC registers; values taken from the reference driver. + */ +#define RT2860_DEF_MAC \ + { RT2860_BCN_OFFSET0, 0xf8f0e8e0 }, \ + { RT2860_LEGACY_BASIC_RATE, 0x0000013f }, \ + { RT2860_HT_BASIC_RATE, 0x00008003 }, \ + { RT2860_MAC_SYS_CTRL, 0x00000000 }, \ + { RT2860_BKOFF_SLOT_CFG, 0x00000209 }, \ + { RT2860_TX_SW_CFG0, 0x00000000 }, \ + { RT2860_TX_SW_CFG1, 0x00080606 }, \ + { RT2860_TX_LINK_CFG, 0x00001020 }, \ + { RT2860_TX_TIMEOUT_CFG, 0x000a2090 }, \ + { RT2860_LED_CFG, 0x7f031e46 }, \ + { RT2860_WMM_AIFSN_CFG, 0x00002273 }, \ + { RT2860_WMM_CWMIN_CFG, 0x00002344 }, \ + { RT2860_WMM_CWMAX_CFG, 0x000034aa }, \ + { RT2860_MAX_PCNT, 0x1f3fbf9f }, \ + { RT2860_TX_RTY_CFG, 0x47d01f0f }, \ + { RT2860_AUTO_RSP_CFG, 0x00000013 }, \ + { RT2860_CCK_PROT_CFG, 0x05740003 }, \ + { RT2860_OFDM_PROT_CFG, 0x05740003 }, \ + { RT2860_GF20_PROT_CFG, 0x01744004 }, \ + { RT2860_GF40_PROT_CFG, 0x03f44084 }, \ + { RT2860_MM20_PROT_CFG, 0x01744004 }, \ + { RT2860_MM40_PROT_CFG, 0x03f54084 }, \ + { RT2860_TXOP_CTRL_CFG, 0x0000583f }, \ + { RT2860_TXOP_HLDR_ET, 0x00000002 }, \ + { RT2860_TX_RTS_CFG, 0x00092b20 }, \ + { RT2860_EXP_ACK_TIME, 0x002400ca }, \ + { RT2860_XIFS_TIME_CFG, 0x33a41010 }, \ + { RT2860_PWR_PIN_CFG, 0x00000003 } + +/* XXX only a few registers differ from above, try to merge? */ +#define RT2870_DEF_MAC \ + { RT2860_BCN_OFFSET0, 0xf8f0e8e0 }, \ + { RT2860_LEGACY_BASIC_RATE, 0x0000013f }, \ + { RT2860_HT_BASIC_RATE, 0x00008003 }, \ + { RT2860_MAC_SYS_CTRL, 0x00000000 }, \ + { RT2860_BKOFF_SLOT_CFG, 0x00000209 }, \ + { RT2860_TX_SW_CFG0, 0x00000000 }, \ + { RT2860_TX_SW_CFG1, 0x00080606 }, \ + { RT2860_TX_LINK_CFG, 0x00001020 }, \ + { RT2860_TX_TIMEOUT_CFG, 0x000a2090 }, \ + { RT2860_LED_CFG, 0x7f031e46 }, \ + { RT2860_WMM_AIFSN_CFG, 0x00002273 }, \ + { RT2860_WMM_CWMIN_CFG, 0x00002344 }, \ + { RT2860_WMM_CWMAX_CFG, 0x000034aa }, \ + { RT2860_MAX_PCNT, 0x1f3fbf9f }, \ + { RT2860_TX_RTY_CFG, 0x47d01f0f }, \ + { RT2860_AUTO_RSP_CFG, 0x00000013 }, \ + { RT2860_CCK_PROT_CFG, 0x05740003 }, \ + { RT2860_OFDM_PROT_CFG, 0x05740003 }, \ + { RT2860_PBF_CFG, 0x00f40006 }, \ + { RT2860_WPDMA_GLO_CFG, 0x00000030 }, \ + { RT2860_GF20_PROT_CFG, 0x01744004 }, \ + { RT2860_GF40_PROT_CFG, 0x03f44084 }, \ + { RT2860_MM20_PROT_CFG, 0x01744004 }, \ + { RT2860_MM40_PROT_CFG, 0x03f44084 }, \ + { RT2860_TXOP_CTRL_CFG, 0x0000583f }, \ + { RT2860_TXOP_HLDR_ET, 0x00000002 }, \ + { RT2860_TX_RTS_CFG, 0x00092b20 }, \ + { RT2860_EXP_ACK_TIME, 0x002400ca }, \ + { RT2860_XIFS_TIME_CFG, 0x33a41010 }, \ + { RT2860_PWR_PIN_CFG, 0x00000003 } + +/* + * Default values for BBP registers; values taken from the reference driver. + */ +#define RT2860_DEF_BBP \ + { 65, 0x2c }, \ + { 66, 0x38 }, \ + { 69, 0x12 }, \ + { 70, 0x0a }, \ + { 73, 0x10 }, \ + { 81, 0x37 }, \ + { 82, 0x62 }, \ + { 83, 0x6a }, \ + { 84, 0x99 }, \ + { 86, 0x00 }, \ + { 91, 0x04 }, \ + { 92, 0x00 }, \ + { 103, 0x00 }, \ + { 105, 0x05 }, \ + { 106, 0x35 } + +/* + * Default settings for RF registers; values derived from the reference driver. + */ +#define RT2860_RF2850 \ + { 1, 0x100bb3, 0x1301e1, 0x05a014, 0x001402 }, \ + { 2, 0x100bb3, 0x1301e1, 0x05a014, 0x001407 }, \ + { 3, 0x100bb3, 0x1301e2, 0x05a014, 0x001402 }, \ + { 4, 0x100bb3, 0x1301e2, 0x05a014, 0x001407 }, \ + { 5, 0x100bb3, 0x1301e3, 0x05a014, 0x001402 }, \ + { 6, 0x100bb3, 0x1301e3, 0x05a014, 0x001407 }, \ + { 7, 0x100bb3, 0x1301e4, 0x05a014, 0x001402 }, \ + { 8, 0x100bb3, 0x1301e4, 0x05a014, 0x001407 }, \ + { 9, 0x100bb3, 0x1301e5, 0x05a014, 0x001402 }, \ + { 10, 0x100bb3, 0x1301e5, 0x05a014, 0x001407 }, \ + { 11, 0x100bb3, 0x1301e6, 0x05a014, 0x001402 }, \ + { 12, 0x100bb3, 0x1301e6, 0x05a014, 0x001407 }, \ + { 13, 0x100bb3, 0x1301e7, 0x05a014, 0x001402 }, \ + { 14, 0x100bb3, 0x1301e8, 0x05a014, 0x001404 }, \ + { 36, 0x100bb3, 0x130266, 0x056014, 0x001408 }, \ + { 38, 0x100bb3, 0x130267, 0x056014, 0x001404 }, \ + { 40, 0x100bb2, 0x1301a0, 0x056014, 0x001400 }, \ + { 44, 0x100bb2, 0x1301a0, 0x056014, 0x001408 }, \ + { 46, 0x100bb2, 0x1301a1, 0x056014, 0x001402 }, \ + { 48, 0x100bb2, 0x1301a1, 0x056014, 0x001406 }, \ + { 52, 0x100bb2, 0x1301a2, 0x056014, 0x001404 }, \ + { 54, 0x100bb2, 0x1301a2, 0x056014, 0x001408 }, \ + { 56, 0x100bb2, 0x1301a3, 0x056014, 0x001402 }, \ + { 60, 0x100bb2, 0x1301a4, 0x056014, 0x001400 }, \ + { 62, 0x100bb2, 0x1301a4, 0x056014, 0x001404 }, \ + { 64, 0x100bb2, 0x1301a4, 0x056014, 0x001408 }, \ + { 100, 0x100bb2, 0x1301ac, 0x05e014, 0x001400 }, \ + { 102, 0x100bb2, 0x1701ac, 0x15e014, 0x001404 }, \ + { 104, 0x100bb2, 0x1701ac, 0x15e014, 0x001408 }, \ + { 108, 0x100bb3, 0x17028c, 0x15e014, 0x001404 }, \ + { 110, 0x100bb3, 0x13028d, 0x05e014, 0x001400 }, \ + { 112, 0x100bb3, 0x13028d, 0x05e014, 0x001406 }, \ + { 116, 0x100bb3, 0x13028e, 0x05e014, 0x001408 }, \ + { 118, 0x100bb3, 0x13028f, 0x05e014, 0x001404 }, \ + { 120, 0x100bb1, 0x1300e0, 0x05e014, 0x001400 }, \ + { 124, 0x100bb1, 0x1300e0, 0x05e014, 0x001404 }, \ + { 126, 0x100bb1, 0x1300e0, 0x05e014, 0x001406 }, \ + { 128, 0x100bb1, 0x1300e0, 0x05e014, 0x001408 }, \ + { 132, 0x100bb1, 0x1300e1, 0x05e014, 0x001402 }, \ + { 134, 0x100bb1, 0x1300e1, 0x05e014, 0x001404 }, \ + { 136, 0x100bb1, 0x1300e1, 0x05e014, 0x001406 }, \ + { 140, 0x100bb1, 0x1300e2, 0x05e014, 0x001400 }, \ + { 149, 0x100bb1, 0x1300e2, 0x05e014, 0x001409 }, \ + { 151, 0x100bb1, 0x1300e3, 0x05e014, 0x001401 }, \ + { 153, 0x100bb1, 0x1300e3, 0x05e014, 0x001403 }, \ + { 157, 0x100bb1, 0x1300e3, 0x05e014, 0x001407 }, \ + { 159, 0x100bb1, 0x1300e3, 0x05e014, 0x001409 }, \ + { 161, 0x100bb1, 0x1300e4, 0x05e014, 0x001401 }, \ + { 165, 0x100bb1, 0x1300e4, 0x05e014, 0x001405 }, \ + { 167, 0x100bb1, 0x1300f4, 0x05e014, 0x001407 }, \ + { 169, 0x100bb1, 0x1300f4, 0x05e014, 0x001409 }, \ + { 171, 0x100bb1, 0x1300f5, 0x05e014, 0x001401 }, \ + { 173, 0x100bb1, 0x1300f5, 0x05e014, 0x001403 } + +#define RT3070_RF3052 \ + { 0xf1, 2, 2 }, \ + { 0xf1, 2, 7 }, \ + { 0xf2, 2, 2 }, \ + { 0xf2, 2, 7 }, \ + { 0xf3, 2, 2 }, \ + { 0xf3, 2, 7 }, \ + { 0xf4, 2, 2 }, \ + { 0xf4, 2, 7 }, \ + { 0xf5, 2, 2 }, \ + { 0xf5, 2, 7 }, \ + { 0xf6, 2, 2 }, \ + { 0xf6, 2, 7 }, \ + { 0xf7, 2, 2 }, \ + { 0xf8, 2, 4 }, \ + { 0x56, 0, 4 }, \ + { 0x56, 0, 6 }, \ + { 0x56, 0, 8 }, \ + { 0x57, 0, 0 }, \ + { 0x57, 0, 2 }, \ + { 0x57, 0, 4 }, \ + { 0x57, 0, 8 }, \ + { 0x57, 0, 10 }, \ + { 0x58, 0, 0 }, \ + { 0x58, 0, 4 }, \ + { 0x58, 0, 6 }, \ + { 0x58, 0, 8 }, \ + { 0x5b, 0, 8 }, \ + { 0x5b, 0, 10 }, \ + { 0x5c, 0, 0 }, \ + { 0x5c, 0, 4 }, \ + { 0x5c, 0, 6 }, \ + { 0x5c, 0, 8 }, \ + { 0x5d, 0, 0 }, \ + { 0x5d, 0, 2 }, \ + { 0x5d, 0, 4 }, \ + { 0x5d, 0, 8 }, \ + { 0x5d, 0, 10 }, \ + { 0x5e, 0, 0 }, \ + { 0x5e, 0, 4 }, \ + { 0x5e, 0, 6 }, \ + { 0x5e, 0, 8 }, \ + { 0x5f, 0, 0 }, \ + { 0x5f, 0, 9 }, \ + { 0x5f, 0, 11 }, \ + { 0x60, 0, 1 }, \ + { 0x60, 0, 5 }, \ + { 0x60, 0, 7 }, \ + { 0x60, 0, 9 }, \ + { 0x61, 0, 1 }, \ + { 0x61, 0, 3 }, \ + { 0x61, 0, 5 }, \ + { 0x61, 0, 7 }, \ + { 0x61, 0, 9 } + +#define RT3070_DEF_RF \ + { 4, 0x40 }, \ + { 5, 0x03 }, \ + { 6, 0x02 }, \ + { 7, 0x70 }, \ + { 9, 0x0f }, \ + { 10, 0x41 }, \ + { 11, 0x21 }, \ + { 12, 0x7b }, \ + { 14, 0x90 }, \ + { 15, 0x58 }, \ + { 16, 0xb3 }, \ + { 17, 0x92 }, \ + { 18, 0x2c }, \ + { 19, 0x02 }, \ + { 20, 0xba }, \ + { 21, 0xdb }, \ + { 24, 0x16 }, \ + { 25, 0x01 }, \ + { 29, 0x1f } + +#define RT3572_DEF_RF \ + { 0, 0x70 }, \ + { 1, 0x81 }, \ + { 2, 0xf1 }, \ + { 3, 0x02 }, \ + { 4, 0x4c }, \ + { 5, 0x05 }, \ + { 6, 0x4a }, \ + { 7, 0xd8 }, \ + { 9, 0xc3 }, \ + { 10, 0xf1 }, \ + { 11, 0xb9 }, \ + { 12, 0x70 }, \ + { 13, 0x65 }, \ + { 14, 0xa0 }, \ + { 15, 0x53 }, \ + { 16, 0x4c }, \ + { 17, 0x23 }, \ + { 18, 0xac }, \ + { 19, 0x93 }, \ + { 20, 0xb3 }, \ + { 21, 0xd0 }, \ + { 22, 0x00 }, \ + { 23, 0x3c }, \ + { 24, 0x16 }, \ + { 25, 0x15 }, \ + { 26, 0x85 }, \ + { 27, 0x00 }, \ + { 28, 0x00 }, \ + { 29, 0x9b }, \ + { 30, 0x09 }, \ + { 31, 0x10 } diff --git a/sys/dev/ral/rt2860var.h b/sys/dev/ral/rt2860var.h new file mode 100644 index 00000000000..28a3d59b826 --- /dev/null +++ b/sys/dev/ral/rt2860var.h @@ -0,0 +1,210 @@ +/*- + * Copyright (c) 2007 Damien Bergamini + * Copyright (c) 2012 Bernhard Schmidt + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $OpenBSD: rt2860var.h,v 1.20 2010/09/07 16:21:42 deraadt Exp $ + * $FreeBSD$ + */ + +#define RT2860_TX_RING_COUNT 64 +#define RT2860_RX_RING_COUNT 128 +#define RT2860_TX_POOL_COUNT (RT2860_TX_RING_COUNT * 2) + +#define RT2860_MAX_SCATTER ((RT2860_TX_RING_COUNT * 2) - 1) + +/* HW supports up to 255 STAs */ +#define RT2860_WCID_MAX 254 +#define RT2860_AID2WCID(aid) ((aid) & 0xff) + +struct rt2860_rx_radiotap_header { + struct ieee80211_radiotap_header wr_ihdr; + uint64_t wr_tsf; + uint8_t wr_flags; + uint8_t wr_rate; + uint16_t wr_chan_freq; + uint16_t wr_chan_flags; + uint8_t wr_antenna; + int8_t wr_antsignal; + int8_t wr_antnoise; +} __packed; + +#define RT2860_RX_RADIOTAP_PRESENT \ + ((1 << IEEE80211_RADIOTAP_TSFT) | \ + (1 << IEEE80211_RADIOTAP_FLAGS) | \ + (1 << IEEE80211_RADIOTAP_RATE) | \ + (1 << IEEE80211_RADIOTAP_CHANNEL) | \ + (1 << IEEE80211_RADIOTAP_ANTENNA) | \ + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)) + +struct rt2860_tx_radiotap_header { + struct ieee80211_radiotap_header wt_ihdr; + uint8_t wt_flags; + uint8_t wt_rate; + uint16_t wt_chan_freq; + uint16_t wt_chan_flags; +} __packed; + +#define RT2860_TX_RADIOTAP_PRESENT \ + ((1 << IEEE80211_RADIOTAP_FLAGS) | \ + (1 << IEEE80211_RADIOTAP_RATE) | \ + (1 << IEEE80211_RADIOTAP_CHANNEL)) + +struct rt2860_tx_data { + struct rt2860_txwi *txwi; + struct mbuf *m; + struct ieee80211_node *ni; + bus_dmamap_t map; + bus_addr_t paddr; + SLIST_ENTRY(rt2860_tx_data) next; +}; + +struct rt2860_tx_ring { + struct rt2860_txd *txd; + bus_addr_t paddr; + bus_dma_tag_t desc_dmat; + bus_dmamap_t desc_map; + bus_dma_segment_t seg; + struct rt2860_tx_data *data[RT2860_TX_RING_COUNT]; + int cur; + int next; + int queued; +}; + +struct rt2860_rx_data { + struct mbuf *m; + bus_dmamap_t map; +}; + +struct rt2860_rx_ring { + struct rt2860_rxd *rxd; + bus_addr_t paddr; + bus_dma_tag_t desc_dmat; + bus_dmamap_t desc_map; + bus_dma_tag_t data_dmat; + bus_dma_segment_t seg; + unsigned int cur; /* must be unsigned */ + struct rt2860_rx_data data[RT2860_RX_RING_COUNT]; +}; + +struct rt2860_node { + struct ieee80211_node ni; + uint8_t wcid; + uint8_t ridx[IEEE80211_RATE_MAXSIZE]; + uint8_t ctl_ridx[IEEE80211_RATE_MAXSIZE]; +}; + +struct rt2860_vap { + struct ieee80211vap ral_vap; + + int (*ral_newstate)(struct ieee80211vap *, + enum ieee80211_state, int); +}; +#define RT2860_VAP(vap) ((struct rt2860_vap *)(vap)) + +struct rt2860_softc { + struct ifnet *sc_ifp; + device_t sc_dev; + bus_space_tag_t sc_st; + bus_space_handle_t sc_sh; + + struct mtx sc_mtx; + + struct callout watchdog_ch; + + int sc_invalid; + int sc_debug; +/* + * The same in both up to here + * ------------------------------------------------ + */ + + uint16_t (*sc_srom_read)(struct rt2860_softc *, + uint16_t); + void (*sc_node_free)(struct ieee80211_node *); + + int sc_flags; +#define RT2860_ENABLED (1 << 0) +#define RT2860_ADVANCED_PS (1 << 1) +#define RT2860_PCIE (1 << 2) + + struct ieee80211_node *wcid2ni[RT2860_WCID_MAX]; + + struct rt2860_tx_ring txq[6]; + struct rt2860_rx_ring rxq; + + SLIST_HEAD(, rt2860_tx_data) data_pool; + struct rt2860_tx_data data[RT2860_TX_POOL_COUNT]; + bus_dma_tag_t txwi_dmat; + bus_dmamap_t txwi_map; + bus_dma_segment_t txwi_seg; + caddr_t txwi_vaddr; + + int sc_tx_timer; + int mgtqid; + uint8_t qfullmsk; + + uint16_t mac_ver; + uint16_t mac_rev; + uint8_t rf_rev; + uint8_t freq; + uint8_t ntxchains; + uint8_t nrxchains; + uint8_t pslevel; + int8_t txpow1[54]; + int8_t txpow2[54]; + int8_t rssi_2ghz[3]; + int8_t rssi_5ghz[3]; + uint8_t lna[4]; + uint8_t rf24_20mhz; + uint8_t rf24_40mhz; + uint8_t patch_dac; + uint8_t rfswitch; + uint8_t ext_2ghz_lna; + uint8_t ext_5ghz_lna; + uint8_t calib_2ghz; + uint8_t calib_5ghz; + uint8_t txmixgain_2ghz; + uint8_t txmixgain_5ghz; + uint8_t tssi_2ghz[9]; + uint8_t tssi_5ghz[9]; + uint8_t step_2ghz; + uint8_t step_5ghz; + struct { + uint8_t reg; + uint8_t val; + } bbp[8], rf[10]; + uint8_t leds; + uint16_t led[3]; + uint32_t txpow20mhz[5]; + uint32_t txpow40mhz_2ghz[5]; + uint32_t txpow40mhz_5ghz[5]; + + struct rt2860_rx_radiotap_header sc_rxtap; + int sc_rxtap_len; + struct rt2860_tx_radiotap_header sc_txtap; + int sc_txtap_len; +}; + +int rt2860_attach(device_t, int); +int rt2860_detach(void *); +void rt2860_shutdown(void *); +void rt2860_suspend(void *); +void rt2860_resume(void *); +void rt2860_intr(void *); + +#define RAL_LOCK(sc) mtx_lock(&(sc)->sc_mtx) +#define RAL_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) +#define RAL_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c index 995fa530205..e9ded440445 100644 --- a/sys/dev/re/if_re.c +++ b/sys/dev/re/if_re.c @@ -1527,7 +1527,7 @@ re_attach(device_t dev) re_read_eeprom(sc, (caddr_t)as, RL_EE_EADDR, 3); for (i = 0; i < ETHER_ADDR_LEN / 2; i++) as[i] = le16toh(as[i]); - bcopy(as, eaddr, sizeof(eaddr)); + bcopy(as, eaddr, ETHER_ADDR_LEN); } if (sc->rl_type == RL_8169) { @@ -1753,8 +1753,12 @@ re_detach(device_t dev) bus_teardown_intr(dev, sc->rl_irq[0], sc->rl_intrhand[0]); sc->rl_intrhand[0] = NULL; } - if (ifp != NULL) + if (ifp != NULL) { +#ifdef DEV_NETMAP + netmap_detach(ifp); +#endif /* DEV_NETMAP */ if_free(ifp); + } if ((sc->rl_flags & (RL_FLAG_MSI | RL_FLAG_MSIX)) == 0) rid = 0; else @@ -1843,9 +1847,6 @@ re_detach(device_t dev) bus_dma_tag_destroy(sc->rl_ldata.rl_stag); } -#ifdef DEV_NETMAP - netmap_detach(ifp); -#endif /* DEV_NETMAP */ if (sc->rl_parent_tag) bus_dma_tag_destroy(sc->rl_parent_tag); diff --git a/sys/dev/sec/sec.c b/sys/dev/sec/sec.c index 3b8c1036578..1f684d05b40 100644 --- a/sys/dev/sec/sec.c +++ b/sys/dev/sec/sec.c @@ -227,6 +227,10 @@ sec_probe(device_t dev) device_set_desc(dev, "Freescale Security Engine 3.0"); sc->sc_version = 3; break; + case SEC_31_ID: + device_set_desc(dev, "Freescale Security Engine 3.1"); + sc->sc_version = 3; + break; default: device_printf(dev, "unknown SEC ID 0x%016llx!\n", id); return (ENXIO); diff --git a/sys/dev/sec/sec.h b/sys/dev/sec/sec.h index 3a40d92f5f5..fecfd86cb98 100644 --- a/sys/dev/sec/sec.h +++ b/sys/dev/sec/sec.h @@ -46,6 +46,7 @@ /* SEC information */ #define SEC_20_ID 0x0000000000000040ULL #define SEC_30_ID 0x0030030000000000ULL +#define SEC_31_ID 0x0030030100000000ULL #define SEC_CHANNELS 4 #define SEC_POINTERS 7 #define SEC_MAX_DMA_BLOCK_SIZE 0xFFFF diff --git a/sys/dev/sf/if_sf.c b/sys/dev/sf/if_sf.c index 4f8002e0ddc..ec3aa27abb2 100644 --- a/sys/dev/sf/if_sf.c +++ b/sys/dev/sf/if_sf.c @@ -1984,7 +1984,6 @@ static void sf_init_locked(struct sf_softc *sc) { struct ifnet *ifp; - struct mii_data *mii; uint8_t eaddr[ETHER_ADDR_LEN]; bus_addr_t addr; int i; @@ -1993,7 +1992,6 @@ sf_init_locked(struct sf_softc *sc) ifp = sc->sf_ifp; if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) return; - mii = device_get_softc(sc->sf_miibus); sf_stop(sc); /* Reset the hardware to a known state. */ diff --git a/sys/dev/siis/siis.c b/sys/dev/siis/siis.c index 17c1a39ef93..a8a1ed22b82 100644 --- a/sys/dev/siis/siis.c +++ b/sys/dev/siis/siis.c @@ -830,7 +830,9 @@ siis_ch_intr_locked(void *data) struct siis_channel *ch = device_get_softc(dev); mtx_lock(&ch->mtx); + xpt_batch_start(ch->sim); siis_ch_intr(data); + xpt_batch_done(ch->sim); mtx_unlock(&ch->mtx); } @@ -1882,7 +1884,7 @@ siisaction(struct cam_sim *sim, union ccb *ccb) d = &ch->curr[ccb->ccb_h.target_id]; else d = &ch->user[ccb->ccb_h.target_id]; - cts->protocol = PROTO_ATA; + cts->protocol = PROTO_UNSPECIFIED; cts->protocol_version = PROTO_VERSION_UNSPECIFIED; cts->transport = XPORT_SATA; cts->transport_version = XPORT_VERSION_UNSPECIFIED; diff --git a/sys/dev/sio/sio.c b/sys/dev/sio/sio.c index d389f4547e1..d187a2bab31 100644 --- a/sys/dev/sio/sio.c +++ b/sys/dev/sio/sio.c @@ -278,6 +278,11 @@ static int sio_inited; /* table and macro for fast conversion from a unit number to its com struct */ devclass_t sio_devclass; +/* + * XXX Assmues that devclass_get_device, devclass_get_softc and + * device_get_softc are fast interrupt safe. The current implementation + * of these functions are. + */ #define com_addr(unit) ((struct com_s *) \ devclass_get_softc(sio_devclass, unit)) /* XXX */ diff --git a/sys/dev/sound/pci/hda/hdaa.c b/sys/dev/sound/pci/hda/hdaa.c index 67724054a2a..169adc6968d 100644 --- a/sys/dev/sound/pci/hda/hdaa.c +++ b/sys/dev/sound/pci/hda/hdaa.c @@ -6203,12 +6203,14 @@ hdaa_resume(device_t dev) static int hdaa_probe(device_t dev) { + const char *pdesc; char buf[128]; if (hda_get_node_type(dev) != HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) return (ENXIO); - snprintf(buf, sizeof(buf), "%s Audio Function Group", - device_get_desc(device_get_parent(dev))); + pdesc = device_get_desc(device_get_parent(dev)); + snprintf(buf, sizeof(buf), "%.*s Audio Function Group", + (int)(strlen(pdesc) - 10), pdesc); device_set_desc_copy(dev, buf); return (BUS_PROBE_DEFAULT); } @@ -6565,6 +6567,7 @@ hdaa_pcm_probe(device_t dev) struct hdaa_pcm_devinfo *pdevinfo = (struct hdaa_pcm_devinfo *)device_get_ivars(dev); struct hdaa_devinfo *devinfo = pdevinfo->devinfo; + const char *pdesc; char chans1[8], chans2[8]; char buf[128]; int loc1, loc2, t1, t2; @@ -6610,8 +6613,9 @@ hdaa_pcm_probe(device_t dev) t1 = -2; if (pdevinfo->digital) t1 = -2; - snprintf(buf, sizeof(buf), "%s PCM (%s%s%s%s%s%s%s%s%s)", - device_get_desc(device_get_parent(device_get_parent(dev))), + pdesc = device_get_desc(device_get_parent(dev)); + snprintf(buf, sizeof(buf), "%.*s (%s%s%s%s%s%s%s%s%s)", + (int)(strlen(pdesc) - 21), pdesc, loc1 >= 0 ? HDA_LOCS[loc1] : "", loc1 >= 0 ? " " : "", (pdevinfo->digital == 0x7)?"HDMI/DP": ((pdevinfo->digital == 0x5)?"DisplayPort": diff --git a/sys/dev/sound/pci/hda/hdaa_patches.c b/sys/dev/sound/pci/hda/hdaa_patches.c index cd03913ca7e..86330391970 100644 --- a/sys/dev/sound/pci/hda/hdaa_patches.c +++ b/sys/dev/sound/pci/hda/hdaa_patches.c @@ -401,12 +401,9 @@ hdaa_patch(struct hdaa_devinfo *devinfo) if (!(HDA_DEV_MATCH(hdac_quirks[i].model, subid) && HDA_DEV_MATCH(hdac_quirks[i].id, id))) continue; - if (hdac_quirks[i].set != 0) - devinfo->quirks |= - hdac_quirks[i].set; - if (hdac_quirks[i].unset != 0) - devinfo->quirks &= - ~(hdac_quirks[i].unset); + devinfo->quirks |= hdac_quirks[i].set; + devinfo->quirks &= ~(hdac_quirks[i].unset); + devinfo->gpio = hdac_quirks[i].gpio; } /* Apply per-widget patch. */ diff --git a/sys/dev/sound/pci/hdspe.c b/sys/dev/sound/pci/hdspe.c index 69c372d7b4e..f3377fb49ea 100644 --- a/sys/dev/sound/pci/hdspe.c +++ b/sys/dev/sound/pci/hdspe.c @@ -347,7 +347,7 @@ hdspe_attach(device_t dev) hdspe_map_dmabuf(sc); - return 0; + return (bus_generic_attach(dev)); } static void @@ -407,4 +407,6 @@ static driver_t hdspe_driver = { PCM_SOFTC_SIZE, }; -DRIVER_MODULE(snd_hdspe, pci, hdspe_driver, pcm_devclass, 0, 0); +static devclass_t hdspe_devclass; + +DRIVER_MODULE(snd_hdspe, pci, hdspe_driver, hdspe_devclass, 0, 0); diff --git a/sys/dev/sound/pcm/sndstat.c b/sys/dev/sound/pcm/sndstat.c index 11d17642770..71710654293 100644 --- a/sys/dev/sound/pcm/sndstat.c +++ b/sys/dev/sound/pcm/sndstat.c @@ -53,6 +53,7 @@ static struct cdevsw sndstat_cdevsw = { .d_close = sndstat_close, .d_read = sndstat_read, .d_name = "sndstat", + .d_flags = D_TRACKCLOSE, }; struct sndstat_entry { @@ -63,7 +64,7 @@ struct sndstat_entry { int type, unit; }; -static struct mtx sndstat_lock; +static struct sx sndstat_lock; static struct sbuf sndstat_sbuf; static struct cdev *sndstat_dev = NULL; static int sndstat_bufptr = -1; @@ -93,16 +94,14 @@ sysctl_hw_snd_sndstat_pid(SYSCTL_HANDLER_ARGS) if (sndstat_dev == NULL) return (EINVAL); - mtx_lock(&sndstat_lock); + sx_xlock(&sndstat_lock); val = (int)SNDSTAT_PID(sndstat_dev); - mtx_unlock(&sndstat_lock); err = sysctl_handle_int(oidp, &val, 0, req); if (err == 0 && req->newptr != NULL && val == 0) { - mtx_lock(&sndstat_lock); SNDSTAT_FLUSH(); SNDSTAT_PID_SET(sndstat_dev, 0); - mtx_unlock(&sndstat_lock); } + sx_unlock(&sndstat_lock); return (err); } SYSCTL_PROC(_hw_snd, OID_AUTO, sndstat_pid, CTLTYPE_INT | CTLFLAG_RW, @@ -119,12 +118,10 @@ sysctl_hw_sndverbose(SYSCTL_HANDLER_ARGS) verbose = snd_verbose; error = sysctl_handle_int(oidp, &verbose, 0, req); if (error == 0 && req->newptr != NULL) { - mtx_lock(&sndstat_lock); if (verbose < 0 || verbose > 4) error = EINVAL; else snd_verbose = verbose; - mtx_unlock(&sndstat_lock); } return error; } @@ -137,20 +134,19 @@ sndstat_open(struct cdev *i_dev, int flags, int mode, struct thread *td) if (sndstat_dev == NULL || i_dev != sndstat_dev) return EBADF; - mtx_lock(&sndstat_lock); + sx_xlock(&sndstat_lock); if (SNDSTAT_PID(i_dev) != 0) { - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return EBUSY; } SNDSTAT_PID_SET(i_dev, td->td_proc->p_pid); - mtx_unlock(&sndstat_lock); if (sbuf_new(&sndstat_sbuf, NULL, 4096, SBUF_AUTOEXTEND) == NULL) { - mtx_lock(&sndstat_lock); SNDSTAT_PID_SET(i_dev, 0); - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return ENXIO; } sndstat_bufptr = 0; + sx_unlock(&sndstat_lock); return 0; } @@ -160,16 +156,16 @@ sndstat_close(struct cdev *i_dev, int flags, int mode, struct thread *td) if (sndstat_dev == NULL || i_dev != sndstat_dev) return EBADF; - mtx_lock(&sndstat_lock); + sx_xlock(&sndstat_lock); if (SNDSTAT_PID(i_dev) == 0) { - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return EBADF; } SNDSTAT_FLUSH(); SNDSTAT_PID_SET(i_dev, 0); - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return 0; } @@ -182,20 +178,18 @@ sndstat_read(struct cdev *i_dev, struct uio *buf, int flag) if (sndstat_dev == NULL || i_dev != sndstat_dev) return EBADF; - mtx_lock(&sndstat_lock); + sx_xlock(&sndstat_lock); if (SNDSTAT_PID(i_dev) != buf->uio_td->td_proc->p_pid || sndstat_bufptr == -1) { - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return EBADF; } - mtx_unlock(&sndstat_lock); if (sndstat_bufptr == 0) { err = (sndstat_prepare(&sndstat_sbuf) > 0) ? 0 : ENOMEM; if (err) { - mtx_lock(&sndstat_lock); SNDSTAT_FLUSH(); - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return err; } } @@ -203,6 +197,7 @@ sndstat_read(struct cdev *i_dev, struct uio *buf, int flag) l = min(buf->uio_resid, sbuf_len(&sndstat_sbuf) - sndstat_bufptr); err = (l > 0)? uiomove(sbuf_data(&sndstat_sbuf) + sndstat_bufptr, l, buf) : 0; sndstat_bufptr += l; + sx_unlock(&sndstat_lock); return err; } @@ -228,13 +223,13 @@ sndstat_acquire(struct thread *td) if (sndstat_dev == NULL) return EBADF; - mtx_lock(&sndstat_lock); + sx_xlock(&sndstat_lock); if (SNDSTAT_PID(sndstat_dev) != 0) { - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return EBUSY; } SNDSTAT_PID_SET(sndstat_dev, td->td_proc->p_pid); - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return 0; } @@ -244,13 +239,13 @@ sndstat_release(struct thread *td) if (sndstat_dev == NULL) return EBADF; - mtx_lock(&sndstat_lock); + sx_xlock(&sndstat_lock); if (SNDSTAT_PID(sndstat_dev) != td->td_proc->p_pid) { - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return EBADF; } SNDSTAT_PID_SET(sndstat_dev, 0); - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return 0; } @@ -284,12 +279,12 @@ sndstat_register(device_t dev, char *str, sndstat_handler handler) ent->unit = unit; ent->handler = handler; - mtx_lock(&sndstat_lock); + sx_xlock(&sndstat_lock); SLIST_INSERT_HEAD(&sndstat_devlist, ent, link); if (type == SS_TYPE_MODULE) sndstat_files++; sndstat_maxunit = (unit > sndstat_maxunit)? unit : sndstat_maxunit; - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return 0; } @@ -305,17 +300,17 @@ sndstat_unregister(device_t dev) { struct sndstat_entry *ent; - mtx_lock(&sndstat_lock); + sx_xlock(&sndstat_lock); SLIST_FOREACH(ent, &sndstat_devlist, link) { if (ent->dev == dev) { SLIST_REMOVE(&sndstat_devlist, ent, sndstat_entry, link); - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); free(ent, M_DEVBUF); return 0; } } - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return ENXIO; } @@ -325,18 +320,18 @@ sndstat_unregisterfile(char *str) { struct sndstat_entry *ent; - mtx_lock(&sndstat_lock); + sx_xlock(&sndstat_lock); SLIST_FOREACH(ent, &sndstat_devlist, link) { if (ent->dev == NULL && ent->str == str) { SLIST_REMOVE(&sndstat_devlist, ent, sndstat_entry, link); sndstat_files--; - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); free(ent, M_DEVBUF); return 0; } } - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return ENXIO; } @@ -399,7 +394,7 @@ sndstat_init(void) { if (sndstat_dev != NULL) return EINVAL; - mtx_init(&sndstat_lock, "sndstat", "sndstat lock", MTX_DEF); + sx_init(&sndstat_lock, "sndstat lock"); sndstat_dev = make_dev(&sndstat_cdevsw, SND_DEV_STATUS, UID_ROOT, GID_WHEEL, 0444, "sndstat"); return 0; @@ -411,20 +406,20 @@ sndstat_uninit(void) if (sndstat_dev == NULL) return EINVAL; - mtx_lock(&sndstat_lock); + sx_xlock(&sndstat_lock); if (SNDSTAT_PID(sndstat_dev) != curthread->td_proc->p_pid) { - mtx_unlock(&sndstat_lock); + sx_unlock(&sndstat_lock); return EBUSY; } - SNDSTAT_FLUSH(); - - mtx_unlock(&sndstat_lock); - + /* XXXPHO: use destroy_dev_sched() */ destroy_dev(sndstat_dev); sndstat_dev = NULL; - mtx_destroy(&sndstat_lock); + SNDSTAT_FLUSH(); + + sx_unlock(&sndstat_lock); + sx_destroy(&sndstat_lock); return 0; } diff --git a/sys/dev/sym/sym_conf.h b/sys/dev/sym/sym_conf.h index 768baa7b10a..b1b2102a9a3 100644 --- a/sys/dev/sym/sym_conf.h +++ b/sys/dev/sym/sym_conf.h @@ -83,11 +83,19 @@ #define SYM_CONF_MAX_TAG_ORDER (6) /* - * Max number of scatter/gather entries for en IO. - * Each entry costs 8 bytes in the internal CCB data structure. - * For now 65 should suffice given the BSD O/Ses capabilities. + * DMA boundary + * We need to ensure 16 MB boundaries not to be crossed during DMA of + * each segment, due to some chips being flawed. */ -#define SYM_CONF_MAX_SG (33) +#define SYM_CONF_DMA_BOUNDARY (1UL << 24) + +/* + * Max number of scatter/gather entries for an I/O. + * Each entry costs 8 bytes in the internal CCB data structure. + * We use at most 33 segments but also no more than required for handling + * MAXPHYS. + */ +#define SYM_CONF_MAX_SG (MIN(33, (MAXPHYS / PAGE_SIZE) + 1)) /* * Max number of targets. diff --git a/sys/dev/sym/sym_hipd.c b/sys/dev/sym/sym_hipd.c index d4e1acae591..8ac59b9a269 100644 --- a/sys/dev/sym/sym_hipd.c +++ b/sys/dev/sym/sym_hipd.c @@ -70,7 +70,6 @@ __FBSDID("$FreeBSD$"); #include "opt_sym.h" #include - #include #include #include @@ -128,7 +127,6 @@ typedef u_int32_t u32; * requires memory barriers (and also IO barriers when they * make sense) to be used. */ - #if defined __i386__ || defined __amd64__ #define MEMORY_BARRIER() do { ; } while(0) #elif defined __powerpc__ @@ -144,7 +142,6 @@ typedef u_int32_t u32; /* * A la VMS/CAM-3 queue management. */ - typedef struct sym_quehead { struct sym_quehead *flink; /* Forward pointer */ struct sym_quehead *blink; /* Backward pointer */ @@ -206,7 +203,6 @@ static __inline void sym_que_splice(struct sym_quehead *list, #define sym_que_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(size_t)(&((type *)0)->member))) - #define sym_insque(new, pos) __sym_que_add(new, pos, (pos)->flink) #define sym_remque(el) __sym_que_del((el)->blink, (el)->flink) @@ -373,7 +369,6 @@ static void MDELAY(int ms) { while (ms--) UDELAY(1000); } * pages of memory that will be useful if we ever need to deal * with IO MMUs for PCI. */ - #define MEMO_SHIFT 4 /* 16 bytes minimum memory chunk */ #define MEMO_PAGE_ORDER 0 /* 1 PAGE maximum */ #if 0 @@ -567,7 +562,6 @@ static m_pool_s mp0 = {0, 0, ___mp0_getp, ___mp0_freep}; static m_pool_s mp0 = {0, 0, ___mp0_getp}; #endif - /* * Actual memory allocation routine for non-DMAed memory. */ @@ -768,7 +762,6 @@ static m_addr_t __vtobus(bus_dma_tag_t dev_dmat, void *m) return vp ? vp->baddr + (((m_addr_t) m) - a) : 0; } - /* * Verbs for DMAable memory handling. * The _uvptv_ macro avoids a nasty warning about pointer to volatile @@ -783,7 +776,6 @@ static m_addr_t __vtobus(bus_dma_tag_t dev_dmat, void *m) #define _vtobus(np, p) __vtobus(np->bus_dmat, _uvptv_(p)) #define vtobus(p) _vtobus(np, p) - /* * Print a buffer in hexadecimal format. */ @@ -858,14 +850,12 @@ struct sym_nvram { * Symbios chips (never seen, by the way). * For now, this stuff does not deserve any comments. :) */ - #define sym_offb(o) (o) #define sym_offw(o) (o) /* * Some provision for support for BIG ENDIAN CPU. */ - #define cpu_to_scr(dw) htole32(dw) #define scr_to_cpu(dw) le32toh(dw) @@ -874,8 +864,6 @@ struct sym_nvram { * We use the `bus space' interface under FreeBSD-4 and * later kernel versions. */ - - #if defined(SYM_CONF_IOMAPPED) #define INB_OFF(o) bus_read_1(np->io_res, (o)) @@ -901,7 +889,6 @@ struct sym_nvram { #define OUTRAM_OFF(o, a, l) \ bus_write_region_1(np->ram_res, (o), (a), (l)) - /* * Common definitions for both bus space and legacy IO methods. */ @@ -1333,7 +1320,6 @@ struct sym_pmc { * For SYMBIOS chips that support LOAD/STORE this copy is * not needed and thus not performed. */ - struct sym_ccbh { /* * Start and restart SCRIPTS addresses (must be at 0). @@ -1748,7 +1734,6 @@ static __inline const char *sym_name(hcb_p np) #define PADDR_A(label) SYM_GEN_PADDR_A(struct SYM_FWA_SCR, label) #define PADDR_B(label) SYM_GEN_PADDR_B(struct SYM_FWB_SCR, label) - #ifdef SYM_CONF_GENERIC_SUPPORT /* * Allocate firmware #1 script area. @@ -2452,7 +2437,6 @@ static __inline void sym_init_burst(hcb_p np, u_char bc) } } - /* * Print out the list of targets that have some flag disabled by user. */ @@ -2847,7 +2831,6 @@ static int sym_prepare_setting(hcb_p np, struct sym_nvram *nvram) * negotiation and the nego_status field of the CCB. * Returns the size of the message in bytes. */ - static int sym_prepare_nego(hcb_p np, ccb_p cp, int nego, u_char *msgptr) { tcb_p tp = &np->target[cp->target]; @@ -2965,7 +2948,6 @@ static void sym_put_start_queue(hcb_p np, ccb_p cp) OUTB (nc_istat, SIGP|np->istat_sem); } - /* * Soft reset the chip. * @@ -3841,7 +3823,6 @@ static void sym_log_hard_error(hcb_p np, u_short sist, u_char dstat) * ask me for any guarantee that it will never fail. :-) * Use at your own decision and risk. */ - static void sym_intr1 (hcb_p np) { u_char istat, istatc; @@ -4003,7 +3984,6 @@ static void sym_poll(struct cam_sim *sim) sym_intr1(cam_sim_softc(sim)); } - /* * generic recovery from scsi interrupt * @@ -5291,7 +5271,6 @@ static void sym_sir_task_recovery(hcb_p np, int num) * offset (basically from the MDP message) and returns * the corresponding values of dp_sg and dp_ofs. */ - static int sym_evaluate_dp(hcb_p np, ccb_p cp, u32 scr, int *ofs) { u32 dp_scr; @@ -5409,7 +5388,6 @@ out_err: * Btw, we assume in that situation that such a message * is equivalent to a MODIFY DATA POINTER (offset=-1). */ - static void sym_modify_dp(hcb_p np, tcb_p tp, ccb_p cp, int ofs) { int dp_ofs = ofs; @@ -5493,7 +5471,6 @@ out_reject: OUTL_DSP (SCRIPTB_BA (np, msg_bad)); } - /* * chip calculation of the data residual. * @@ -5508,7 +5485,6 @@ out_reject: * any software that considers this data residual as * a relevant information. :) */ - static int sym_compute_residual(hcb_p np, ccb_p cp) { int dp_sg, dp_sgmin, resid = 0; @@ -5574,7 +5550,6 @@ static int sym_compute_residual(hcb_p np, ccb_p cp) /* * Print out the content of a SCSI message. */ - static int sym_show_msg (u_char * msg) { u_char i; @@ -7770,7 +7745,6 @@ sym_setup_data_pointers(hcb_p np, ccb_p cp, int dir) cp->startp = cp->phys.head.savep; } - /* * Call back routine for the DMA map service. * If bounce buffers are used (why ?), we may sleep and then @@ -7985,13 +7959,9 @@ sym_fast_scatter_sg_physical(hcb_p np, ccb_p cp, return 0; } - /* * Scatter a SG list with physical addresses into bus addressable chunks. - * We need to ensure 16MB boundaries not to be crossed during DMA of - * each segment, due to some chips being flawed. */ -#define BOUND_MASK ((1UL<<24)-1) static int sym_scatter_sg_physical(hcb_p np, ccb_p cp, bus_dma_segment_t *psegs, int nsegs) { @@ -8007,7 +7977,7 @@ sym_scatter_sg_physical(hcb_p np, ccb_p cp, bus_dma_segment_t *psegs, int nsegs) pe = ps + psegs[t].ds_len; while (s >= 0) { - pn = (pe - 1) & ~BOUND_MASK; + pn = (pe - 1) & ~(SYM_CONF_DMA_BOUNDARY - 1); if (pn <= ps) pn = ps; k = pe - pn; @@ -8032,17 +8002,21 @@ sym_scatter_sg_physical(hcb_p np, ccb_p cp, bus_dma_segment_t *psegs, int nsegs) return t >= 0 ? -1 : 0; } -#undef BOUND_MASK /* * SIM action for non performance critical stuff. */ static void sym_action2(struct cam_sim *sim, union ccb *ccb) { + union ccb *abort_ccb; + struct ccb_hdr *ccb_h; + struct ccb_pathinq *cpi; + struct ccb_trans_settings *cts; + struct sym_trans *tip; hcb_p np; tcb_p tp; lcb_p lp; - struct ccb_hdr *ccb_h; + u_char dflags; /* * Retrieve our controller data structure. @@ -8055,9 +8029,6 @@ static void sym_action2(struct cam_sim *sim, union ccb *ccb) switch (ccb_h->func_code) { case XPT_SET_TRAN_SETTINGS: - { - struct ccb_trans_settings *cts; - cts = &ccb->cts; tp = &np->target[ccb_h->target_id]; @@ -8079,13 +8050,7 @@ static void sym_action2(struct cam_sim *sim, union ccb *ccb) sym_xpt_done2(np, ccb, CAM_REQ_CMP); break; - } case XPT_GET_TRAN_SETTINGS: - { - struct ccb_trans_settings *cts; - struct sym_trans *tip; - u_char dflags; - cts = &ccb->cts; tp = &np->target[ccb_h->target_id]; lp = sym_lp(np, tp, ccb_h->target_lun); @@ -8129,16 +8094,12 @@ static void sym_action2(struct cam_sim *sim, union ccb *ccb) #undef cts__scsi sym_xpt_done2(np, ccb, CAM_REQ_CMP); break; - } case XPT_CALC_GEOMETRY: - { cam_calc_geometry(&ccb->ccg, /*extended*/1); sym_xpt_done2(np, ccb, CAM_REQ_CMP); break; - } case XPT_PATH_INQ: - { - struct ccb_pathinq *cpi = &ccb->cpi; + cpi = &ccb->cpi; cpi->version_num = 1; cpi->hba_inquiry = PI_MDP_ABLE|PI_SDTR_ABLE|PI_TAG_ABLE; if ((np->features & FE_WIDE) != 0) @@ -8173,12 +8134,11 @@ static void sym_action2(struct cam_sim *sim, union ccb *ccb) cpi->xport_specific.spi.ppr_options = SID_SPI_CLOCK_DT_ST; } + cpi->maxio = SYM_CONF_MAX_SG * PAGE_SIZE; sym_xpt_done2(np, ccb, CAM_REQ_CMP); break; - } case XPT_ABORT: - { - union ccb *abort_ccb = ccb->cab.abort_ccb; + abort_ccb = ccb->cab.abort_ccb; switch(abort_ccb->ccb_h.func_code) { case XPT_SCSI_IO: if (sym_abort_scsiio(np, abort_ccb, 0) == 0) { @@ -8190,14 +8150,10 @@ static void sym_action2(struct cam_sim *sim, union ccb *ccb) break; } break; - } case XPT_RESET_DEV: - { sym_reset_dev(np, ccb); break; - } case XPT_RESET_BUS: - { sym_reset_scsi_bus(np, 0); if (sym_verbose) { xpt_print_path(np->path); @@ -8206,7 +8162,6 @@ static void sym_action2(struct cam_sim *sim, union ccb *ccb) sym_init (np, 1); sym_xpt_done2(np, ccb, CAM_REQ_CMP); break; - } case XPT_ACCEPT_TARGET_IO: case XPT_CONT_TARGET_IO: case XPT_EN_LUN: @@ -8355,14 +8310,12 @@ sym_update_dflags(hcb_p np, u_char *flags, struct ccb_trans_settings *cts) #undef cts__scsi } - /*============= DRIVER INITIALISATION ==================*/ - static device_method_t sym_pci_methods[] = { DEVMETHOD(device_probe, sym_pci_probe), DEVMETHOD(device_attach, sym_pci_attach), - { 0, 0 } + DEVMETHOD_END }; static driver_t sym_pci_driver = { @@ -8373,11 +8326,10 @@ static driver_t sym_pci_driver = { static devclass_t sym_devclass; -DRIVER_MODULE(sym, pci, sym_pci_driver, sym_devclass, 0, 0); +DRIVER_MODULE(sym, pci, sym_pci_driver, sym_devclass, NULL, NULL); MODULE_DEPEND(sym, cam, 1, 1, 1); MODULE_DEPEND(sym, pci, 1, 1, 1); - static const struct sym_pci_chip sym_pci_dev_table[] = { {PCI_ID_SYM53C810, 0x0f, "810", 4, 8, 4, 64, FE_ERL} @@ -8458,9 +8410,6 @@ static const struct sym_pci_chip sym_pci_dev_table[] = { FE_RAM|FE_IO256|FE_LEDC} }; -#define sym_pci_num_devs \ - (sizeof(sym_pci_dev_table) / sizeof(sym_pci_dev_table[0])) - /* * Look up the chip table. * @@ -8481,7 +8430,7 @@ sym_find_pci_chip(device_t dev) device_id = pci_get_device(dev); revision = pci_get_revid(dev); - for (i = 0; i < sym_pci_num_devs; i++) { + for (i = 0; i < nitems(sym_pci_dev_table); i++) { chip = &sym_pci_dev_table[i]; if (device_id != chip->device_id) continue; @@ -8586,15 +8535,14 @@ sym_pci_attach(device_t dev) /* * Allocate a tag for the DMA of user data. */ - if (bus_dma_tag_create(np->bus_dmat, 1, (1<<24), - BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, - NULL, NULL, - BUS_SPACE_MAXSIZE, SYM_CONF_MAX_SG, - (1<<24), 0, busdma_lock_mutex, &np->mtx, - &np->data_dmat)) { + if (bus_dma_tag_create(np->bus_dmat, 1, SYM_CONF_DMA_BOUNDARY, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, + BUS_SPACE_MAXSIZE, SYM_CONF_MAX_SG, SYM_CONF_DMA_BOUNDARY, + BUS_DMA_ALLOCNOW, busdma_lock_mutex, &np->mtx, &np->data_dmat)) { device_printf(dev, "failed to create DMA tag.\n"); goto attach_failed; } + /* * Read and apply some fix-ups to the PCI COMMAND * register. We want the chip to be enabled for: @@ -8603,9 +8551,8 @@ sym_pci_attach(device_t dev) * - Write And Invalidate. */ command = pci_read_config(dev, PCIR_COMMAND, 2); - command |= PCIM_CMD_BUSMASTEREN; - command |= PCIM_CMD_PERRESPEN; - command |= /* PCIM_CMD_MWIEN */ 0x0010; + command |= PCIM_CMD_BUSMASTEREN | PCIM_CMD_PERRESPEN | + PCIM_CMD_MWRICEN; pci_write_config(dev, PCIR_COMMAND, command, 2); /* @@ -9277,7 +9224,6 @@ static void sym_display_Tekram_nvram(hcb_p np, Tekram_nvram *nvram) #endif /* SYM_CONF_DEBUG_NVRAM */ #endif /* SYM_CONF_NVRAM_SUPPORT */ - /* * Try reading Symbios or Tekram NVRAM */ @@ -9315,7 +9261,6 @@ static int sym_read_nvram(hcb_p np, struct sym_nvram *nvp) return nvp->type; } - #ifdef SYM_CONF_NVRAM_SUPPORT /* * 24C16 EEPROM reading. diff --git a/sys/dev/tsec/if_tsec.c b/sys/dev/tsec/if_tsec.c index 2e54129e575..1d87b30d5e8 100644 --- a/sys/dev/tsec/if_tsec.c +++ b/sys/dev/tsec/if_tsec.c @@ -289,17 +289,17 @@ int tsec_detach(struct tsec_softc *sc) { + if (sc->tsec_ifp != NULL) { #ifdef DEVICE_POLLING - if (sc->tsec_ifp->if_capenable & IFCAP_POLLING) - ether_poll_deregister(sc->tsec_ifp); + if (sc->tsec_ifp->if_capenable & IFCAP_POLLING) + ether_poll_deregister(sc->tsec_ifp); #endif - /* Stop TSEC controller and free TX queue */ - if (sc->sc_rres && sc->tsec_ifp) - tsec_shutdown(sc->dev); + /* Stop TSEC controller and free TX queue */ + if (sc->sc_rres) + tsec_shutdown(sc->dev); - /* Detach network interface */ - if (sc->tsec_ifp) { + /* Detach network interface */ ether_ifdetach(sc->tsec_ifp); if_free(sc->tsec_ifp); sc->tsec_ifp = NULL; @@ -358,6 +358,9 @@ tsec_init_locked(struct tsec_softc *sc) struct ifnet *ifp = sc->tsec_ifp; uint32_t timeout, val, i; + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + return; + TSEC_GLOBAL_LOCK_ASSERT(sc); tsec_stop(sc); diff --git a/sys/dev/twa/tw_osl_cam.c b/sys/dev/twa/tw_osl_cam.c index 8b81ccca4f0..2c2d5aea415 100644 --- a/sys/dev/twa/tw_osl_cam.c +++ b/sys/dev/twa/tw_osl_cam.c @@ -678,9 +678,9 @@ tw_osl_complete_io(struct tw_cl_req_handle *req_handle) ccb->ccb_h.status = CAM_REQ_CMP; else { if (req_pkt->status & TW_CL_ERR_REQ_INVALID_TARGET) - ccb->ccb_h.status |= CAM_TID_INVALID; + ccb->ccb_h.status |= CAM_SEL_TIMEOUT; else if (req_pkt->status & TW_CL_ERR_REQ_INVALID_LUN) - ccb->ccb_h.status |= CAM_LUN_INVALID; + ccb->ccb_h.status |= CAM_DEV_NOT_THERE; else if (req_pkt->status & TW_CL_ERR_REQ_SCSI_ERROR) ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR; else if (req_pkt->status & TW_CL_ERR_REQ_BUS_RESET) diff --git a/sys/dev/usb/controller/ehci.c b/sys/dev/usb/controller/ehci.c index da379543a1d..a6470b88eab 100644 --- a/sys/dev/usb/controller/ehci.c +++ b/sys/dev/usb/controller/ehci.c @@ -2398,9 +2398,9 @@ ehci_device_isoc_fs_open(struct usb_xfer *xfer) EHCI_SITD_SET_HUBA(xfer->xroot->udev->hs_hub_addr) | EHCI_SITD_SET_PORT(xfer->xroot->udev->hs_port_no); - if (UE_GET_DIR(xfer->endpointno) == UE_DIR_IN) { + if (UE_GET_DIR(xfer->endpointno) == UE_DIR_IN) sitd_portaddr |= EHCI_SITD_SET_DIR_IN; - } + sitd_portaddr = htohc32(sc, sitd_portaddr); /* initialize all TD's */ @@ -2436,9 +2436,6 @@ ehci_device_isoc_fs_enter(struct usb_xfer *xfer) { struct usb_page_search buf_res; ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus); - struct usb_fs_isoc_schedule *fss_start; - struct usb_fs_isoc_schedule *fss_end; - struct usb_fs_isoc_schedule *fss; ehci_sitd_t *td; ehci_sitd_t *td_last = NULL; ehci_sitd_t **pp_last; @@ -2450,7 +2447,6 @@ ehci_device_isoc_fs_enter(struct usb_xfer *xfer) uint16_t tlen; uint8_t sa; uint8_t sb; - uint8_t error; #ifdef USB_DEBUG uint8_t once = 1; @@ -2495,9 +2491,8 @@ ehci_device_isoc_fs_enter(struct usb_xfer *xfer) * pre-compute when the isochronous transfer will be finished: */ xfer->isoc_time_complete = - usbd_fs_isoc_schedule_isoc_time_expand - (xfer->xroot->udev, &fss_start, &fss_end, nframes) + buf_offset + - xfer->nframes; + usb_isoc_time_expand(&sc->sc_bus, nframes) + + buf_offset + xfer->nframes; /* get the real number of frames */ @@ -2520,19 +2515,14 @@ ehci_device_isoc_fs_enter(struct usb_xfer *xfer) xfer->qh_pos = xfer->endpoint->isoc_next; - fss = fss_start + (xfer->qh_pos % USB_ISOC_TIME_MAX); - while (nframes--) { if (td == NULL) { panic("%s:%d: out of TD's\n", __FUNCTION__, __LINE__); } - if (pp_last >= &sc->sc_isoc_fs_p_last[EHCI_VIRTUAL_FRAMELIST_COUNT]) { + if (pp_last >= &sc->sc_isoc_fs_p_last[EHCI_VIRTUAL_FRAMELIST_COUNT]) pp_last = &sc->sc_isoc_fs_p_last[0]; - } - if (fss >= fss_end) { - fss = fss_start; - } + /* reuse sitd_portaddr and sitd_back from last transfer */ if (*plen > xfer->max_frame_size) { @@ -2547,17 +2537,19 @@ ehci_device_isoc_fs_enter(struct usb_xfer *xfer) #endif *plen = xfer->max_frame_size; } - /* - * We currently don't care if the ISOCHRONOUS schedule is - * full! - */ - error = usbd_fs_isoc_schedule_alloc(fss, &sa, *plen); - if (error) { + + /* allocate a slot */ + + sa = usbd_fs_isoc_schedule_alloc_slot(xfer, + xfer->isoc_time_complete - nframes - 1); + + if (sa == 255) { /* - * The FULL speed schedule is FULL! Set length - * to zero. + * Schedule is FULL, set length to zero: */ + *plen = 0; + sa = USB_FS_ISOC_UFRAME_MAX - 1; } if (*plen) { /* @@ -2637,7 +2629,6 @@ ehci_device_isoc_fs_enter(struct usb_xfer *xfer) pp_last++; plen++; - fss++; td_last = td; td = td->obj_next; } @@ -2647,11 +2638,29 @@ ehci_device_isoc_fs_enter(struct usb_xfer *xfer) /* update isoc_next */ xfer->endpoint->isoc_next = (pp_last - &sc->sc_isoc_fs_p_last[0]) & (EHCI_VIRTUAL_FRAMELIST_COUNT - 1); + + /* + * We don't allow cancelling of the SPLIT transaction USB FULL + * speed transfer, because it disturbs the bandwidth + * computation algorithm. + */ + xfer->flags_int.can_cancel_immed = 0; } static void ehci_device_isoc_fs_start(struct usb_xfer *xfer) { + /* + * We don't allow cancelling of the SPLIT transaction USB FULL + * speed transfer, because it disturbs the bandwidth + * computation algorithm. + */ + xfer->flags_int.can_cancel_immed = 0; + + /* set a default timeout */ + if (xfer->timeout == 0) + xfer->timeout = 500; /* ms */ + /* put transfer on interrupt queue */ ehci_transfer_intr_enqueue(xfer); } diff --git a/sys/dev/usb/controller/ehci_fsl.c b/sys/dev/usb/controller/ehci_fsl.c new file mode 100644 index 00000000000..6b485b59baa --- /dev/null +++ b/sys/dev/usb/controller/ehci_fsl.c @@ -0,0 +1,423 @@ +/*- + * Copyright (c) 2010-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_bus.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "opt_platform.h" + +/* + * Register the driver + */ +/* Forward declarations */ +static int fsl_ehci_attach(device_t self); +static int fsl_ehci_detach(device_t self); +static int fsl_ehci_probe(device_t self); + +static device_method_t ehci_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, fsl_ehci_probe), + DEVMETHOD(device_attach, fsl_ehci_attach), + DEVMETHOD(device_detach, fsl_ehci_detach), + DEVMETHOD(device_suspend, bus_generic_suspend), + DEVMETHOD(device_resume, bus_generic_resume), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + + /* Bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + + { 0, 0 } +}; + +/* kobj_class definition */ +static driver_t ehci_driver = { + "ehci", + ehci_methods, + sizeof(struct ehci_softc) +}; + +static devclass_t ehci_devclass; + +DRIVER_MODULE(ehci, simplebus, ehci_driver, ehci_devclass, 0, 0); +MODULE_DEPEND(ehci, usb, 1, 1, 1); + +/* + * Private defines + */ +#define FSL_EHCI_REG_OFF 0x100 +#define FSL_EHCI_REG_SIZE 0x300 + +/* + * Internal interface registers' offsets. + * Offsets from 0x000 ehci dev space, big-endian access. + */ +enum internal_reg { + SNOOP1 = 0x400, + SNOOP2 = 0x404, + AGE_CNT_THRESH = 0x408, + SI_CTRL = 0x410, + CONTROL = 0x500 +}; + +/* CONTROL register bit flags */ +enum control_flags { + USB_EN = 0x00000004, + UTMI_PHY_EN = 0x00000200, + ULPI_INT_EN = 0x00000001 +}; + +/* SI_CTRL register bit flags */ +enum si_ctrl_flags { + FETCH_32 = 1, + FETCH_64 = 0 +}; + +#define SNOOP_RANGE_2GB 0x1E + +/* + * Operational registers' offsets. + * Offsets from USBCMD register, little-endian access. + */ +enum special_op_reg { + USBMODE = 0x0A8, + PORTSC = 0x084, + ULPI_VIEWPORT = 0x70 +}; + +/* USBMODE register bit flags */ +enum usbmode_flags { + HOST_MODE = 0x3, + DEVICE_MODE = 0x2 +}; + +#define PORT_POWER_MASK 0x00001000 + +/* + * Private methods + */ + +static void +set_to_host_mode(ehci_softc_t *sc) +{ + int tmp; + + tmp = bus_space_read_4(sc->sc_io_tag, sc->sc_io_hdl, USBMODE); + bus_space_write_4(sc->sc_io_tag, sc->sc_io_hdl, USBMODE, tmp | HOST_MODE); +} + +static void +enable_usb(device_t dev, bus_space_tag_t iot, bus_space_handle_t ioh) +{ + int tmp; + phandle_t node; + char *phy_type; + + phy_type = NULL; + tmp = bus_space_read_4(iot, ioh, CONTROL) | USB_EN; + + node = ofw_bus_get_node(dev); + if ((node != 0) && + (OF_getprop_alloc(node, "phy_type", 1, (void **)&phy_type) > 0)) { + if (strncasecmp(phy_type, "utmi", strlen("utmi")) == 0) + tmp |= UTMI_PHY_EN; + free(phy_type, M_OFWPROP); + } + bus_space_write_4(iot, ioh, CONTROL, tmp); +} + +static void +set_32b_prefetch(bus_space_tag_t iot, bus_space_handle_t ioh) +{ + + bus_space_write_4(iot, ioh, SI_CTRL, FETCH_32); +} + +static void +set_snooping(bus_space_tag_t iot, bus_space_handle_t ioh) +{ + + bus_space_write_4(iot, ioh, SNOOP1, SNOOP_RANGE_2GB); + bus_space_write_4(iot, ioh, SNOOP2, 0x80000000 | SNOOP_RANGE_2GB); +} + +static void +clear_port_power(ehci_softc_t *sc) +{ + int tmp; + + tmp = bus_space_read_4(sc->sc_io_tag, sc->sc_io_hdl, PORTSC); + bus_space_write_4(sc->sc_io_tag, sc->sc_io_hdl, PORTSC, tmp & ~PORT_POWER_MASK); +} + +/* + * Public methods + */ +static int +fsl_ehci_probe(device_t dev) +{ + + if (((ofw_bus_is_compatible(dev, "fsl-usb2-dr")) == 0) && + ((ofw_bus_is_compatible(dev, "fsl-usb2-mph")) == 0)) + return (ENXIO); + + device_set_desc(dev, "Freescale integrated EHCI controller"); + + return (BUS_PROBE_DEFAULT); +} + +static int +fsl_ehci_attach(device_t self) +{ + ehci_softc_t *sc; + int rid; + int err; + bus_space_handle_t ioh; + bus_space_tag_t iot; + + sc = device_get_softc(self); + rid = 0; + + sc->sc_bus.parent = self; + sc->sc_bus.devices = sc->sc_devices; + sc->sc_bus.devices_max = EHCI_MAX_DEVICES; + + if (usb_bus_mem_alloc_all(&sc->sc_bus, + USB_GET_DMA_TAG(self), &ehci_iterate_hw_softc)) + return (ENOMEM); + + /* Allocate io resource for EHCI */ + sc->sc_io_res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid, + RF_ACTIVE); + if (sc->sc_io_res == NULL) { + err = fsl_ehci_detach(self); + if (err) { + device_printf(self, + "Detach of the driver failed with error %d\n", + err); + } + return (ENXIO); + } + iot = rman_get_bustag(sc->sc_io_res); + + /* + * Set handle to USB related registers subregion used by generic + * EHCI driver + */ + ioh = rman_get_bushandle(sc->sc_io_res); + + err = bus_space_subregion(iot, ioh, FSL_EHCI_REG_OFF, FSL_EHCI_REG_SIZE, + &sc->sc_io_hdl); + if (err != 0) { + err = fsl_ehci_detach(self); + if (err) { + device_printf(self, + "Detach of the driver failed with error %d\n", + err); + } + return (ENXIO); + } + + /* Set little-endian tag for use by the generic EHCI driver */ + sc->sc_io_tag = &bs_le_tag; + + /* Allocate irq */ + sc->sc_irq_res = bus_alloc_resource_any(self, SYS_RES_IRQ, &rid, + RF_ACTIVE); + if (sc->sc_irq_res == NULL) { + err = fsl_ehci_detach(self); + if (err) { + device_printf(self, + "Detach of the driver failed with error %d\n", + err); + } + return (ENXIO); + } + + /* Setup interrupt handler */ + err = bus_setup_intr(self, sc->sc_irq_res, INTR_TYPE_BIO, + NULL, (driver_intr_t *)ehci_interrupt, sc, &sc->sc_intr_hdl); + if (err) { + device_printf(self, "Could not setup irq, %d\n", err); + sc->sc_intr_hdl = NULL; + err = fsl_ehci_detach(self); + if (err) { + device_printf(self, + "Detach of the driver failed with error %d\n", + err); + } + return (ENXIO); + } + + /* Add USB device */ + sc->sc_bus.bdev = device_add_child(self, "usbus", -1); + if (!sc->sc_bus.bdev) { + device_printf(self, "Could not add USB device\n"); + err = fsl_ehci_detach(self); + if (err) { + device_printf(self, + "Detach of the driver failed with error %d\n", + err); + } + return (ENOMEM); + } + device_set_ivars(sc->sc_bus.bdev, &sc->sc_bus); + + sc->sc_id_vendor = 0x1234; + strlcpy(sc->sc_vendor, "Freescale", sizeof(sc->sc_vendor)); + + /* Enable USB */ + err = ehci_reset(sc); + if (err) { + device_printf(self, "Could not reset the controller\n"); + err = fsl_ehci_detach(self); + if (err) { + device_printf(self, + "Detach of the driver failed with error %d\n", + err); + } + return (ENXIO); + } + + enable_usb(self, iot, ioh); + set_snooping(iot, ioh); + set_to_host_mode(sc); + set_32b_prefetch(iot, ioh); + + /* + * If usb subsystem is enabled in U-Boot, port power has to be turned + * off to allow proper discovery of devices during boot up. + */ + clear_port_power(sc); + + /* Set flags */ + sc->sc_flags |= EHCI_SCFLG_DONTRESET | EHCI_SCFLG_NORESTERM; + + err = ehci_init(sc); + if (!err) { + sc->sc_flags |= EHCI_SCFLG_DONEINIT; + err = device_probe_and_attach(sc->sc_bus.bdev); + } + + if (err) { + device_printf(self, "USB init failed err=%d\n", err); + err = fsl_ehci_detach(self); + if (err) { + device_printf(self, + "Detach of the driver failed with error %d\n", + err); + } + return (EIO); + } + + return (0); +} + +static int +fsl_ehci_detach(device_t self) +{ + + int err; + ehci_softc_t *sc; + + sc = device_get_softc(self); + /* + * only call ehci_detach() after ehci_init() + */ + if (sc->sc_flags & EHCI_SCFLG_DONEINIT) { + ehci_detach(sc); + sc->sc_flags &= ~EHCI_SCFLG_DONEINIT; + } + + /* Disable interrupts that might have been switched on in ehci_init */ + if (sc->sc_io_tag && sc->sc_io_hdl) + bus_space_write_4(sc->sc_io_tag, sc->sc_io_hdl, EHCI_USBINTR, 0); + + if (sc->sc_irq_res && sc->sc_intr_hdl) { + err = bus_teardown_intr(self, sc->sc_irq_res, sc->sc_intr_hdl); + if (err) { + device_printf(self, "Could not tear down irq, %d\n", + err); + return (err); + } + sc->sc_intr_hdl = NULL; + } + + if (sc->sc_bus.bdev) { + device_delete_child(self, sc->sc_bus.bdev); + sc->sc_bus.bdev = NULL; + } + + /* During module unload there are lots of children leftover */ + device_delete_children(self); + + if (sc->sc_irq_res) { + bus_release_resource(self, SYS_RES_IRQ, 0, sc->sc_irq_res); + sc->sc_irq_res = NULL; + } + + if (sc->sc_io_res) { + bus_release_resource(self, SYS_RES_MEMORY, 0, sc->sc_io_res); + sc->sc_io_res = NULL; + sc->sc_io_tag = 0; + sc->sc_io_hdl = 0; + } + + return (0); +} + diff --git a/sys/dev/usb/controller/ehci_pci.c b/sys/dev/usb/controller/ehci_pci.c index e293ec8d2c2..e2fdd546fa3 100644 --- a/sys/dev/usb/controller/ehci_pci.c +++ b/sys/dev/usb/controller/ehci_pci.c @@ -104,9 +104,6 @@ ehci_pci_match(device_t self) uint32_t device_id = pci_get_devid(self); switch (device_id) { - case 0x268c8086: - return ("Intel 63XXESB USB 2.0 controller"); - case 0x523910b9: return "ALi M5239 USB 2.0 controller"; @@ -120,7 +117,13 @@ ehci_pci_match(device_t self) return "ATI SB200 USB 2.0 controller"; case 0x43731002: return "ATI SB400 USB 2.0 controller"; + case 0x43961002: + return ("AMD SB7x0/SB8x0/SB9x0 USB 2.0 controller"); + case 0x1e268086: + return ("Intel Panther Point USB 2.0 controller"); + case 0x1e2d8086: + return ("Intel Panther Point USB 2.0 controller"); case 0x25ad8086: return "Intel 6300ESB USB 2.0 controller"; case 0x24cd8086: @@ -129,9 +132,10 @@ ehci_pci_match(device_t self) return "Intel 82801EB/R (ICH5) USB 2.0 controller"; case 0x265c8086: return "Intel 82801FB (ICH6) USB 2.0 controller"; + case 0x268c8086: + return ("Intel 63XXESB USB 2.0 controller"); case 0x27cc8086: return "Intel 82801GB/R (ICH7) USB 2.0 controller"; - case 0x28368086: return "Intel 82801H (ICH8) USB 2.0 controller USB2-A"; case 0x283a8086: @@ -243,6 +247,7 @@ ehci_pci_via_quirk(device_t self) val = pci_read_config(self, 0x4b, 1); if (val & 0x20) return; + val |= 0x20; pci_write_config(self, 0x4b, val, 1); device_printf(self, "VIA-quirk applied\n"); } diff --git a/sys/dev/usb/controller/ohci_pci.c b/sys/dev/usb/controller/ohci_pci.c index 864376b9204..c01b080aa27 100644 --- a/sys/dev/usb/controller/ohci_pci.c +++ b/sys/dev/usb/controller/ohci_pci.c @@ -132,6 +132,10 @@ ohci_pci_match(device_t self) return "ATI SB400 USB Controller"; case 0x43751002: return "ATI SB400 USB Controller"; + case 0x43971002: + return ("AMD SB7x0/SB8x0/SB9x0 USB controller"); + case 0x43991002: + return ("AMD SB7x0/SB8x0/SB9x0 USB controller"); case 0x06701095: return ("CMD Tech 670 (USB0670) USB controller"); diff --git a/sys/dev/usb/controller/xhci.c b/sys/dev/usb/controller/xhci.c index aed7edfa991..1a4e43261b9 100644 --- a/sys/dev/usb/controller/xhci.c +++ b/sys/dev/usb/controller/xhci.c @@ -115,6 +115,7 @@ struct xhci_std_temp { uint8_t tbc; uint8_t tlbpc; uint8_t step_td; + uint8_t do_isoc_sync; }; static void xhci_do_poll(struct usb_bus *); @@ -1657,11 +1658,15 @@ restart: td->td_trb[x].dwTrb2 = htole32(dword); dword = XHCI_TRB_3_CHAIN_BIT | XHCI_TRB_3_CYCLE_BIT | - XHCI_TRB_3_TYPE_SET(temp->trb_type) | - XHCI_TRB_3_FRID_SET(temp->isoc_frame / 8) | + XHCI_TRB_3_TYPE_SET(temp->trb_type) | + (temp->do_isoc_sync ? + XHCI_TRB_3_FRID_SET(temp->isoc_frame / 8) : + XHCI_TRB_3_ISO_SIA_BIT) | XHCI_TRB_3_TBC_SET(temp->tbc) | XHCI_TRB_3_TLBPC_SET(temp->tlbpc); + temp->do_isoc_sync = 0; + if (temp->direction == UE_DIR_IN) { dword |= XHCI_TRB_3_DIR_IN; @@ -1764,6 +1769,7 @@ xhci_setup_generic_chain(struct usb_xfer *xfer) uint32_t y; uint8_t mult; + temp.do_isoc_sync = 0; temp.step_td = 0; temp.tbc = 0; temp.tlbpc = 0; @@ -1841,6 +1847,8 @@ xhci_setup_generic_chain(struct usb_xfer *xfer) */ xfer->endpoint->isoc_next = XHCI_MFINDEX_GET(x + (3 * 8)); xfer->endpoint->is_synced = 1; + temp.do_isoc_sync = 1; + DPRINTFN(3, "start next=%d\n", xfer->endpoint->isoc_next); } @@ -1931,7 +1939,10 @@ xhci_setup_generic_chain(struct usb_xfer *xfer) uint8_t tdpc; - /* isochronous transfers don't have short packet termination */ + /* + * Isochronous transfers don't have short + * packet termination: + */ temp.shortpkt = 1; @@ -2271,12 +2282,29 @@ xhci_configure_device(struct usb_device *udev) switch (udev->speed) { case USB_SPEED_LOW: temp |= XHCI_SCTX_0_SPEED_SET(2); + if (udev->parent_hs_hub != NULL && + udev->parent_hs_hub->ddesc.bDeviceProtocol == + UDPROTO_HSHUBMTT) { + DPRINTF("Device inherits MTT\n"); + temp |= XHCI_SCTX_0_MTT_SET(1); + } break; case USB_SPEED_HIGH: temp |= XHCI_SCTX_0_SPEED_SET(3); + if (sc->sc_hw.devs[index].nports != 0 && + udev->ddesc.bDeviceProtocol == UDPROTO_HSHUBMTT) { + DPRINTF("HUB supports MTT\n"); + temp |= XHCI_SCTX_0_MTT_SET(1); + } break; case USB_SPEED_FULL: temp |= XHCI_SCTX_0_SPEED_SET(1); + if (udev->parent_hs_hub != NULL && + udev->parent_hs_hub->ddesc.bDeviceProtocol == + UDPROTO_HSHUBMTT) { + DPRINTF("Device inherits MTT\n"); + temp |= XHCI_SCTX_0_MTT_SET(1); + } break; default: temp |= XHCI_SCTX_0_SPEED_SET(4); @@ -2287,15 +2315,8 @@ xhci_configure_device(struct usb_device *udev) (udev->speed == USB_SPEED_SUPER || udev->speed == USB_SPEED_HIGH); - if (is_hub) { + if (is_hub) temp |= XHCI_SCTX_0_HUB_SET(1); -#if 0 - if (udev->ddesc.bDeviceProtocol == UDPROTO_HSHUBMTT) { - DPRINTF("HUB supports MTT\n"); - temp |= XHCI_SCTX_0_MTT_SET(1); - } -#endif - } xhci_ctx_set_le32(sc, &pinp->ctx_slot.dwSctx0, temp); @@ -2327,8 +2348,10 @@ xhci_configure_device(struct usb_device *udev) temp = XHCI_SCTX_2_IRQ_TARGET_SET(0); - if (is_hub) - temp |= XHCI_SCTX_2_TT_THINK_TIME_SET(sc->sc_hw.devs[index].tt); + if (is_hub) { + temp |= XHCI_SCTX_2_TT_THINK_TIME_SET( + sc->sc_hw.devs[index].tt); + } hubdev = udev->parent_hs_hub; diff --git a/sys/dev/usb/controller/xhci_pci.c b/sys/dev/usb/controller/xhci_pci.c index 80877acabd5..c9e067e16b8 100644 --- a/sys/dev/usb/controller/xhci_pci.c +++ b/sys/dev/usb/controller/xhci_pci.c @@ -93,6 +93,19 @@ MODULE_DEPEND(xhci, usb, 1, 1, 1); static const char * xhci_pci_match(device_t self) { + uint32_t device_id = pci_get_devid(self); + + switch (device_id) { + case 0x01941033: + return ("NEC uPD720200 USB 3.0 controller"); + + case 0x1e318086: + return ("Intel Panther Point USB 3.0 controller"); + + default: + break; + } + if ((pci_get_class(self) == PCIC_SERIALBUS) && (pci_get_subclass(self) == PCIS_SERIALBUS_USB) && (pci_get_progif(self) == PCIP_SERIALBUS_USB_XHCI)) { diff --git a/sys/dev/usb/input/uhid.c b/sys/dev/usb/input/uhid.c index a1050c67225..bd5af206f0a 100644 --- a/sys/dev/usb/input/uhid.c +++ b/sys/dev/usb/input/uhid.c @@ -87,6 +87,7 @@ SYSCTL_INT(_hw_usb_uhid, OID_AUTO, debug, CTLFLAG_RW, #define UHID_FRAME_NUM 50 /* bytes, frame number */ enum { + UHID_INTR_DT_WR, UHID_INTR_DT_RD, UHID_CTRL_DT_WR, UHID_CTRL_DT_RD, @@ -128,7 +129,8 @@ static device_probe_t uhid_probe; static device_attach_t uhid_attach; static device_detach_t uhid_detach; -static usb_callback_t uhid_intr_callback; +static usb_callback_t uhid_intr_write_callback; +static usb_callback_t uhid_intr_read_callback; static usb_callback_t uhid_write_callback; static usb_callback_t uhid_read_callback; @@ -152,7 +154,36 @@ static struct usb_fifo_methods uhid_fifo_methods = { }; static void -uhid_intr_callback(struct usb_xfer *xfer, usb_error_t error) +uhid_intr_write_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct uhid_softc *sc = usbd_xfer_softc(xfer); + struct usb_page_cache *pc; + int actlen; + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + case USB_ST_SETUP: +tr_setup: + pc = usbd_xfer_get_frame(xfer, 0); + if (usb_fifo_get_data(sc->sc_fifo.fp[USB_FIFO_TX], pc, + 0, usbd_xfer_max_len(xfer), &actlen, 0)) { + usbd_xfer_set_frame_len(xfer, 0, actlen); + usbd_transfer_submit(xfer); + } + return; + + default: /* Error */ + if (error != USB_ERR_CANCELLED) { + /* try to clear stall first */ + usbd_xfer_set_stall(xfer); + goto tr_setup; + } + return; + } +} + +static void +uhid_intr_read_callback(struct usb_xfer *xfer, usb_error_t error) { struct uhid_softc *sc = usbd_xfer_softc(xfer); struct usb_page_cache *pc; @@ -327,13 +358,22 @@ uhid_read_callback(struct usb_xfer *xfer, usb_error_t error) static const struct usb_config uhid_config[UHID_N_TRANSFER] = { + [UHID_INTR_DT_WR] = { + .type = UE_INTERRUPT, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_OUT, + .flags = {.pipe_bof = 1,.no_pipe_ok = 1, }, + .bufsize = UHID_BSIZE, + .callback = &uhid_intr_write_callback, + }, + [UHID_INTR_DT_RD] = { .type = UE_INTERRUPT, .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, .flags = {.pipe_bof = 1,.short_xfer_ok = 1,}, .bufsize = UHID_BSIZE, - .callback = &uhid_intr_callback, + .callback = &uhid_intr_read_callback, }, [UHID_CTRL_DT_WR] = { @@ -381,7 +421,12 @@ uhid_start_write(struct usb_fifo *fifo) { struct uhid_softc *sc = usb_fifo_softc(fifo); - usbd_transfer_start(sc->sc_xfer[UHID_CTRL_DT_WR]); + if ((sc->sc_flags & UHID_FLAG_IMMED) || + sc->sc_xfer[UHID_INTR_DT_WR] == NULL) { + usbd_transfer_start(sc->sc_xfer[UHID_CTRL_DT_WR]); + } else { + usbd_transfer_start(sc->sc_xfer[UHID_INTR_DT_WR]); + } } static void @@ -390,6 +435,7 @@ uhid_stop_write(struct usb_fifo *fifo) struct uhid_softc *sc = usb_fifo_softc(fifo); usbd_transfer_stop(sc->sc_xfer[UHID_CTRL_DT_WR]); + usbd_transfer_stop(sc->sc_xfer[UHID_INTR_DT_WR]); } static int diff --git a/sys/dev/usb/input/ums.c b/sys/dev/usb/input/ums.c index 27731448f1e..2f1e67ba69d 100644 --- a/sys/dev/usb/input/ums.c +++ b/sys/dev/usb/input/ums.c @@ -134,6 +134,7 @@ struct ums_softc { struct usb_xfer *sc_xfer[UMS_N_TRANSFER]; int sc_pollrate; + int sc_fflags; uint8_t sc_buttons; uint8_t sc_iid; @@ -677,32 +678,13 @@ ums_attach(device_t dev) DPRINTF("size=%d, id=%d\n", isize, sc->sc_iid); #endif - if (sc->sc_buttons > MOUSE_MSC_MAXBUTTON) - sc->sc_hw.buttons = MOUSE_MSC_MAXBUTTON; - else - sc->sc_hw.buttons = sc->sc_buttons; - - sc->sc_hw.iftype = MOUSE_IF_USB; - sc->sc_hw.type = MOUSE_MOUSE; - sc->sc_hw.model = MOUSE_MODEL_GENERIC; - sc->sc_hw.hwid = 0; - - sc->sc_mode.protocol = MOUSE_PROTO_MSC; - sc->sc_mode.rate = -1; - sc->sc_mode.resolution = MOUSE_RES_UNKNOWN; - sc->sc_mode.accelfactor = 0; - sc->sc_mode.level = 0; - sc->sc_mode.packetsize = MOUSE_MSC_PACKETSIZE; - sc->sc_mode.syncmask[0] = MOUSE_MSC_SYNCMASK; - sc->sc_mode.syncmask[1] = MOUSE_MSC_SYNC; - err = usb_fifo_attach(uaa->device, sc, &sc->sc_mtx, &ums_fifo_methods, &sc->sc_fifo, device_get_unit(dev), -1, uaa->info.bIfaceIndex, UID_ROOT, GID_OPERATOR, 0644); - if (err) { + if (err) goto detach; - } + SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "parseinfo", CTLTYPE_STRING|CTLFLAG_RD, @@ -825,7 +807,7 @@ ums_put_queue(struct ums_softc *sc, int32_t dx, int32_t dy, static void ums_reset_buf(struct ums_softc *sc) { - /* reset read queue */ + /* reset read queue, must be called locked */ usb_fifo_reset(sc->sc_fifo.fp[USB_FIFO_RX]); } @@ -836,7 +818,33 @@ ums_open(struct usb_fifo *fifo, int fflags) DPRINTFN(2, "\n"); - if (fflags & FREAD) { + /* check for duplicate open, should not happen */ + if (sc->sc_fflags & fflags) + return (EBUSY); + + /* check for first open */ + if (sc->sc_fflags == 0) { + + /* reset all USB mouse parameters */ + + if (sc->sc_buttons > MOUSE_MSC_MAXBUTTON) + sc->sc_hw.buttons = MOUSE_MSC_MAXBUTTON; + else + sc->sc_hw.buttons = sc->sc_buttons; + + sc->sc_hw.iftype = MOUSE_IF_USB; + sc->sc_hw.type = MOUSE_MOUSE; + sc->sc_hw.model = MOUSE_MODEL_GENERIC; + sc->sc_hw.hwid = 0; + + sc->sc_mode.protocol = MOUSE_PROTO_MSC; + sc->sc_mode.rate = -1; + sc->sc_mode.resolution = MOUSE_RES_UNKNOWN; + sc->sc_mode.accelfactor = 0; + sc->sc_mode.level = 0; + sc->sc_mode.packetsize = MOUSE_MSC_PACKETSIZE; + sc->sc_mode.syncmask[0] = MOUSE_MSC_SYNCMASK; + sc->sc_mode.syncmask[1] = MOUSE_MSC_SYNC; /* reset status */ @@ -847,21 +855,31 @@ ums_open(struct usb_fifo *fifo, int fflags) sc->sc_status.dy = 0; sc->sc_status.dz = 0; /* sc->sc_status.dt = 0; */ + } + if (fflags & FREAD) { + /* allocate RX buffer */ if (usb_fifo_alloc_buffer(fifo, UMS_BUF_SIZE, UMS_IFQ_MAXLEN)) { return (ENOMEM); } } + + sc->sc_fflags |= fflags & (FREAD | FWRITE); return (0); } static void ums_close(struct usb_fifo *fifo, int fflags) { - if (fflags & FREAD) { + struct ums_softc *sc = usb_fifo_softc(fifo); + + DPRINTFN(2, "\n"); + + if (fflags & FREAD) usb_fifo_free_buffer(fifo); - } + + sc->sc_fflags &= ~(fflags & (FREAD | FWRITE)); } static int @@ -891,7 +909,7 @@ ums_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr, int fflags) /* don't change the current setting */ } else if ((mode.level < 0) || (mode.level > 1)) { error = EINVAL; - goto done; + break; } else { sc->sc_mode.level = mode.level; } @@ -928,7 +946,7 @@ ums_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr, int fflags) case MOUSE_SETLEVEL: if (*(int *)addr < 0 || *(int *)addr > 1) { error = EINVAL; - goto done; + break; } sc->sc_mode.level = *(int *)addr; @@ -975,9 +993,9 @@ ums_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr, int fflags) } default: error = ENOTTY; + break; } -done: mtx_unlock(&sc->sc_mtx); return (error); } diff --git a/sys/dev/usb/net/if_rue.c b/sys/dev/usb/net/if_rue.c index 894e368200d..a08d8510a5f 100644 --- a/sys/dev/usb/net/if_rue.c +++ b/sys/dev/usb/net/if_rue.c @@ -202,8 +202,9 @@ static driver_t rue_driver = { static devclass_t rue_devclass; -DRIVER_MODULE(rue, uhub, rue_driver, rue_devclass, NULL, 0); -DRIVER_MODULE(miibus, rue, miibus_driver, miibus_devclass, 0, 0); +DRIVER_MODULE_ORDERED(rue, uhub, rue_driver, rue_devclass, NULL, NULL, + SI_ORDER_ANY); +DRIVER_MODULE(miibus, rue, miibus_driver, miibus_devclass, NULL, NULL); MODULE_DEPEND(rue, uether, 1, 1, 1); MODULE_DEPEND(rue, usb, 1, 1, 1); MODULE_DEPEND(rue, ether, 1, 1, 1); diff --git a/sys/dev/usb/quirk/usb_quirk.c b/sys/dev/usb/quirk/usb_quirk.c index e07aa2da35b..41f5002c48a 100644 --- a/sys/dev/usb/quirk/usb_quirk.c +++ b/sys/dev/usb/quirk/usb_quirk.c @@ -437,6 +437,9 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { USB_QUIRK(MEIZU, M6_SL, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(TOSHIBA, TRANSMEMORY, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(VIALABS, USB30SATABRIDGE, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), + /* Non-standard USB MIDI devices */ USB_QUIRK(ROLAND, UM1, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS), USB_QUIRK(ROLAND, SC8850, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS), @@ -454,7 +457,13 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { USB_QUIRK(ROLAND, SD20, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS), USB_QUIRK(ROLAND, SD80, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS), USB_QUIRK(ROLAND, UA700, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS), + USB_QUIRK(EGO, M4U, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI), + USB_QUIRK(LOGILINK, U2M, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI), USB_QUIRK(MEDELI, DD305, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI, UQ_MATCH_VENDOR_ONLY), + USB_QUIRK(REDOCTANE, GHMIDI, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI), + USB_QUIRK(TEXTECH, U2M_1, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI), + USB_QUIRK(TEXTECH, U2M_2, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI), + USB_QUIRK(WCH2, U2M, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI), /* * Quirks for manufacturers which USB devices does not respond diff --git a/sys/dev/usb/serial/u3g.c b/sys/dev/usb/serial/u3g.c index f23e6c51dfc..cb39ba0faf5 100644 --- a/sys/dev/usb/serial/u3g.c +++ b/sys/dev/usb/serial/u3g.c @@ -290,6 +290,7 @@ static const STRUCT_USB_HOST_ID u3g_devs[] = { U3G_DEV(HUAWEI, E1820, U3GINIT_HUAWEISCSI), U3G_DEV(HUAWEI, K3765, U3GINIT_HUAWEI), U3G_DEV(HUAWEI, K3765_INIT, U3GINIT_HUAWEISCSI), + U3G_DEV(HUAWEI, ETS2055, U3GINIT_HUAWEI), U3G_DEV(KYOCERA2, CDMA_MSM_K, 0), U3G_DEV(KYOCERA2, KPC680, 0), U3G_DEV(LONGCHEER, WM66, U3GINIT_HUAWEI), diff --git a/sys/dev/usb/serial/uftdi.c b/sys/dev/usb/serial/uftdi.c index 85b06ff72df..5905aa14fde 100644 --- a/sys/dev/usb/serial/uftdi.c +++ b/sys/dev/usb/serial/uftdi.c @@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$"); */ /* - * FTDI FT8U100AX serial adapter driver + * FTDI FT2232x, FT8U100AX and FT8U232AM serial adapter driver */ #include @@ -81,7 +81,7 @@ SYSCTL_INT(_hw_usb_uftdi, OID_AUTO, debug, CTLFLAG_RW, #endif #define UFTDI_CONFIG_INDEX 0 -#define UFTDI_IFACE_INDEX 0 +#define UFTDI_IFACE_INDEX_JTAG 0 #define UFTDI_OBUFSIZE 64 /* bytes, cannot be increased due to * do size encoding */ @@ -102,10 +102,10 @@ struct uftdi_softc { struct mtx sc_mtx; uint32_t sc_unit; - enum uftdi_type sc_type; uint16_t sc_last_lcr; + uint8_t sc_type; uint8_t sc_iface_index; uint8_t sc_hdrlen; uint8_t sc_msr; @@ -190,7 +190,7 @@ static device_method_t uftdi_methods[] = { DEVMETHOD(device_attach, uftdi_attach), DEVMETHOD(device_detach, uftdi_detach), - {0, 0} + DEVMETHOD_END }; static devclass_t uftdi_devclass; @@ -201,59 +201,61 @@ static driver_t uftdi_driver = { .size = sizeof(struct uftdi_softc), }; -DRIVER_MODULE(uftdi, uhub, uftdi_driver, uftdi_devclass, NULL, 0); +DRIVER_MODULE(uftdi, uhub, uftdi_driver, uftdi_devclass, NULL, NULL); MODULE_DEPEND(uftdi, ucom, 1, 1, 1); MODULE_DEPEND(uftdi, usb, 1, 1, 1); MODULE_VERSION(uftdi, 1); -static STRUCT_USB_HOST_ID uftdi_devs[] = { -#define UFTDI_DEV(v,p,t) \ - { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, UFTDI_TYPE_##t) } - UFTDI_DEV(ATMEL, STK541, 8U232AM), - UFTDI_DEV(DRESDENELEKTRONIK, SENSORTERMINALBOARD, 8U232AM), - UFTDI_DEV(DRESDENELEKTRONIK, WIRELESSHANDHELDTERMINAL, 8U232AM), - UFTDI_DEV(FALCOM, TWIST, 8U232AM), - UFTDI_DEV(FTDI, GAMMASCOUT, 8U232AM), - UFTDI_DEV(FTDI, SERIAL_8U100AX, SIO), - UFTDI_DEV(FTDI, SERIAL_2232C, 8U232AM), - UFTDI_DEV(FTDI, SERIAL_2232D, 8U232AM), - UFTDI_DEV(FTDI, BEAGLEBONE, 8U232AM), - UFTDI_DEV(FTDI, SERIAL_4232H, 8U232AM), - UFTDI_DEV(FTDI, SERIAL_8U232AM, 8U232AM), - UFTDI_DEV(FTDI, SERIAL_8U232AM4, 8U232AM), - UFTDI_DEV(FTDI, SERIAL_BEAGLEBONE, 8U232AM), - UFTDI_DEV(FTDI, SEMC_DSS20, 8U232AM), - UFTDI_DEV(FTDI, CFA_631, 8U232AM), - UFTDI_DEV(FTDI, CFA_632, 8U232AM), - UFTDI_DEV(FTDI, CFA_633, 8U232AM), - UFTDI_DEV(FTDI, CFA_634, 8U232AM), - UFTDI_DEV(FTDI, CFA_635, 8U232AM), - UFTDI_DEV(FTDI, USB_UIRT, 8U232AM), - UFTDI_DEV(FTDI, USBSERIAL, 8U232AM), - UFTDI_DEV(FTDI, KBS, 8U232AM), - UFTDI_DEV(FTDI, MX2_3, 8U232AM), - UFTDI_DEV(FTDI, MX4_5, 8U232AM), - UFTDI_DEV(FTDI, LK202, 8U232AM), - UFTDI_DEV(FTDI, LK204, 8U232AM), - UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13M, 8U232AM), - UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13S, 8U232AM), - UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13U, 8U232AM), - UFTDI_DEV(FTDI, EISCOU, 8U232AM), - UFTDI_DEV(FTDI, UOPTBR, 8U232AM), - UFTDI_DEV(FTDI, EMCU2D, 8U232AM), - UFTDI_DEV(FTDI, PCMSFU, 8U232AM), - UFTDI_DEV(FTDI, EMCU2H, 8U232AM), - UFTDI_DEV(FTDI, MAXSTREAM, 8U232AM), - UFTDI_DEV(FTDI, CTI_USB_NANO_485, 8U232AM), - UFTDI_DEV(FTDI, CTI_USB_MINI_485, 8U232AM), - UFTDI_DEV(SIIG2, US2308, 8U232AM), - UFTDI_DEV(INTREPIDCS, VALUECAN, 8U232AM), - UFTDI_DEV(INTREPIDCS, NEOVI, 8U232AM), - UFTDI_DEV(BBELECTRONICS, USOTL4, 8U232AM), - UFTDI_DEV(MATRIXORBITAL, MOUA, 8U232AM), - UFTDI_DEV(MARVELL, SHEEVAPLUG, 8U232AM), - UFTDI_DEV(MELCO, PCOPRS1, 8U232AM), - UFTDI_DEV(RATOC, REXUSB60F, 8U232AM), +static const STRUCT_USB_HOST_ID uftdi_devs[] = { +#define UFTDI_DEV(v, p, i) \ + { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) } + UFTDI_DEV(ATMEL, STK541, UFTDI_TYPE_8U232AM), + UFTDI_DEV(BBELECTRONICS, USOTL4, UFTDI_TYPE_8U232AM), + UFTDI_DEV(DRESDENELEKTRONIK, SENSORTERMINALBOARD, + UFTDI_TYPE_8U232AM), + UFTDI_DEV(DRESDENELEKTRONIK, WIRELESSHANDHELDTERMINAL, + UFTDI_TYPE_8U232AM), + UFTDI_DEV(FALCOM, TWIST, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, BEAGLEBONE, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, CFA_631, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, CFA_632, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, CFA_633, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, CFA_634, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, CFA_635, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, CTI_USB_MINI_485, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, CTI_USB_NANO_485, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, EISCOU, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, EMCU2D, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, EMCU2H, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, GAMMASCOUT, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, KBS, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, LK202, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, LK204, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, MAXSTREAM, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, MX2_3, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, MX4_5, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, PCMSFU, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, SEMC_DSS20, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, SERIAL_2232C, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, SERIAL_2232D, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, SERIAL_4232H, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, SERIAL_8U100AX, UFTDI_TYPE_SIO), + UFTDI_DEV(FTDI, SERIAL_8U232AM, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, SERIAL_8U232AM4, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13M, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13S, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13U, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, TURTELIZER2, UFTDI_TYPE_8U232AM | UFTDI_FLAG_JTAG), + UFTDI_DEV(FTDI, UOPTBR, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, USBSERIAL, UFTDI_TYPE_8U232AM), + UFTDI_DEV(FTDI, USB_UIRT, UFTDI_TYPE_8U232AM), + UFTDI_DEV(INTREPIDCS, NEOVI, UFTDI_TYPE_8U232AM), + UFTDI_DEV(INTREPIDCS, VALUECAN, UFTDI_TYPE_8U232AM), + UFTDI_DEV(MARVELL, SHEEVAPLUG, UFTDI_TYPE_8U232AM), + UFTDI_DEV(MATRIXORBITAL, MOUA, UFTDI_TYPE_8U232AM), + UFTDI_DEV(MELCO, PCOPRS1, UFTDI_TYPE_8U232AM), + UFTDI_DEV(RATOC, REXUSB60F, UFTDI_TYPE_8U232AM), + UFTDI_DEV(SIIG2, US2308, UFTDI_TYPE_8U232AM) #undef UFTDI_DEV }; @@ -261,6 +263,7 @@ static int uftdi_probe(device_t dev) { struct usb_attach_arg *uaa = device_get_ivars(dev); + const struct usb_device_id *id; if (uaa->usb_mode != USB_MODE_HOST) { return (ENXIO); @@ -268,9 +271,24 @@ uftdi_probe(device_t dev) if (uaa->info.bConfigIndex != UFTDI_CONFIG_INDEX) { return (ENXIO); } - /* attach to all present interfaces */ - return (usbd_lookup_id_by_uaa(uftdi_devs, sizeof(uftdi_devs), uaa)); + /* + * Attach to all present interfaces unless this is a JTAG one, which + * we leave for userland. + */ + id = usbd_lookup_id_by_info(uftdi_devs, sizeof(uftdi_devs), + &uaa->info); + if (id == NULL) + return (ENXIO); + if ((id->driver_info & UFTDI_FLAG_JTAG) != 0 && + uaa->info.bIfaceIndex == UFTDI_IFACE_INDEX_JTAG) { + printf("%s: skipping JTAG interface at %u.%u\n", + device_get_name(dev), usbd_get_bus_index(uaa->device), + usbd_get_device_index(uaa->device)); + return (ENXIO); + } + uaa->driver_info = id->driver_info; + return (BUS_PROBE_SPECIFIC); } static int @@ -293,7 +311,7 @@ uftdi_attach(device_t dev) DPRINTF("\n"); sc->sc_iface_index = uaa->info.bIfaceIndex; - sc->sc_type = USB_GET_DRIVER_INFO(uaa); + sc->sc_type = USB_GET_DRIVER_INFO(uaa) & UFTDI_TYPE_MASK; switch (sc->sc_type) { case UFTDI_TYPE_SIO: @@ -562,6 +580,7 @@ static int uftdi_set_parm_soft(struct termios *t, struct uftdi_param_config *cfg, uint8_t type) { + memset(cfg, 0, sizeof(*cfg)); switch (type) { @@ -824,5 +843,6 @@ static void uftdi_poll(struct ucom_softc *ucom) { struct uftdi_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UFTDI_N_TRANSFER); } diff --git a/sys/dev/usb/serial/uftdi_reg.h b/sys/dev/usb/serial/uftdi_reg.h index 0074bc5d701..2398d455cca 100644 --- a/sys/dev/usb/serial/uftdi_reg.h +++ b/sys/dev/usb/serial/uftdi_reg.h @@ -35,10 +35,12 @@ #define FTDI_PIT_SIOB 2 /* SIOB */ #define FTDI_PIT_PARALLEL 3 /* Parallel */ -enum uftdi_type { - UFTDI_TYPE_SIO, - UFTDI_TYPE_8U232AM -}; +/* Values for driver_info */ +#define UFTDI_TYPE_MASK 0x000000ff +#define UFTDI_TYPE_SIO 0x00000001 +#define UFTDI_TYPE_8U232AM 0x00000002 +#define UFTDI_FLAG_MASK 0x0000ff00 +#define UFTDI_FLAG_JTAG 0x00000100 /* * BmRequestType: 0100 0000B @@ -63,14 +65,12 @@ enum uftdi_type { * baud and data format not reset * * The Purge RX and TX buffer commands affect nothing except the buffers - * */ /* FTDI_SIO_RESET */ #define FTDI_SIO_RESET_SIO 0 #define FTDI_SIO_RESET_PURGE_RX 1 #define FTDI_SIO_RESET_PURGE_TX 2 - /* * BmRequestType: 0100 0000B * bRequest: FTDI_SIO_SET_BAUDRATE @@ -135,7 +135,6 @@ enum { #define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11) #define FTDI_SIO_SET_BREAK (0x1 << 14) - /* * BmRequestType: 0100 0000B * bRequest: FTDI_SIO_MODEM_CTRL @@ -172,7 +171,6 @@ enum { #define FTDI_SIO_SET_RTS_HIGH (2 | ( FTDI_SIO_SET_RTS_MASK << 8)) #define FTDI_SIO_SET_RTS_LOW (0 | ( FTDI_SIO_SET_RTS_MASK << 8)) - /* * BmRequestType: 0100 0000b * bRequest: FTDI_SIO_SET_FLOW_CTRL @@ -203,7 +201,6 @@ enum { #define FTDI_SIO_DTR_DSR_HS 0x2 #define FTDI_SIO_XON_XOFF_HS 0x4 - /* * BmRequestType: 0100 0000b * bRequest: FTDI_SIO_SET_EVENT_CHAR @@ -227,8 +224,6 @@ enum { * which is what normally happens. */ - - /* * BmRequestType: 0100 0000b * bRequest: FTDI_SIO_SET_ERROR_CHAR @@ -243,14 +238,11 @@ enum { * 0 = disabled * 1 = enabled * B9..15 Reserved - * - * * FTDI_SIO_SET_ERROR_CHAR * Set the parity error replacement character for the specified communications * port. */ - /* * BmRequestType: 1100 0000b * bRequest: FTDI_SIO_GET_MODEM_STATUS @@ -282,10 +274,7 @@ enum { #define FTDI_SIO_RI_MASK 0x40 #define FTDI_SIO_RLSD_MASK 0x80 - - /* - * * DATA FORMAT * * IN Endpoint @@ -317,8 +306,6 @@ enum { * B5 Transmitter Holding Register (THRE) * B6 Transmitter Empty (TEMT) * B7 Error in RCVR FIFO - * - * * OUT Endpoint * * This device reserves the first bytes of data on this endpoint contain the @@ -330,7 +317,6 @@ enum { * Offset Description * B0..1 Port * B2..7 Length of message - (not including Byte 0) - * */ #define FTDI_PORT_MASK 0x0f #define FTDI_MSR_MASK 0xf0 diff --git a/sys/dev/usb/usb_controller.h b/sys/dev/usb/usb_controller.h index 4ffc041ebb4..bbbf66b43f5 100644 --- a/sys/dev/usb/usb_controller.h +++ b/sys/dev/usb/usb_controller.h @@ -231,7 +231,8 @@ void usb_bus_mem_flush_all(struct usb_bus *bus, usb_bus_mem_cb_t *cb); uint8_t usb_bus_mem_alloc_all(struct usb_bus *bus, bus_dma_tag_t dmat, usb_bus_mem_cb_t *cb); void usb_bus_mem_free_all(struct usb_bus *bus, usb_bus_mem_cb_t *cb); uint16_t usb_isoc_time_expand(struct usb_bus *bus, uint16_t isoc_time_curr); -uint16_t usbd_fs_isoc_schedule_isoc_time_expand(struct usb_device *udev, struct usb_fs_isoc_schedule **pp_start, struct usb_fs_isoc_schedule **pp_end, uint16_t isoc_time); -uint8_t usbd_fs_isoc_schedule_alloc(struct usb_fs_isoc_schedule *fss, uint8_t *pstart, uint16_t len); +#if USB_HAVE_TT_SUPPORT +uint8_t usbd_fs_isoc_schedule_alloc_slot(struct usb_xfer *isoc_xfer, uint16_t isoc_time); +#endif #endif /* _USB_CONTROLLER_H_ */ diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c index 1a7c1b69b4d..4cbf0dab7b5 100644 --- a/sys/dev/usb/usb_device.c +++ b/sys/dev/usb/usb_device.c @@ -750,10 +750,13 @@ usb_config_parse(struct usb_device *udev, uint8_t iface_index, uint8_t cmd) if (do_init) { /* setup the USB interface structure */ iface->idesc = id; - /* default setting */ - iface->parent_iface_index = USB_IFACE_INDEX_ANY; /* set alternate index */ iface->alt_index = alt_index; + /* set default interface parent */ + if (iface_index == USB_IFACE_INDEX_ANY) { + iface->parent_iface_index = + USB_IFACE_INDEX_ANY; + } } DPRINTFN(5, "found idesc nendpt=%d\n", id->bNumEndpoints); @@ -1229,10 +1232,13 @@ usbd_set_parent_iface(struct usb_device *udev, uint8_t iface_index, { struct usb_interface *iface; - iface = usbd_get_iface(udev, iface_index); - if (iface) { - iface->parent_iface_index = parent_index; + if (udev == NULL) { + /* nothing to do */ + return; } + iface = usbd_get_iface(udev, iface_index); + if (iface != NULL) + iface->parent_iface_index = parent_index; } static void diff --git a/sys/dev/usb/usb_generic.c b/sys/dev/usb/usb_generic.c index f175eb94b0a..5f156b17265 100644 --- a/sys/dev/usb/usb_generic.c +++ b/sys/dev/usb/usb_generic.c @@ -2166,7 +2166,16 @@ ugen_ioctl_post(struct usb_fifo *f, u_long cmd, void *addr, int fflags) break; } + /* + * Detach the currently attached driver. + */ usb_detach_device(f->udev, n, 0); + + /* + * Set parent to self, this should keep attach away + * until the next set configuration event. + */ + usbd_set_parent_iface(f->udev, n, n); break; case USB_SET_POWER_MODE: diff --git a/sys/dev/usb/usb_hid.c b/sys/dev/usb/usb_hid.c index 165919bc662..6552546d250 100644 --- a/sys/dev/usb/usb_hid.c +++ b/sys/dev/usb/usb_hid.c @@ -425,7 +425,7 @@ hid_get_item(struct hid_data *s, struct hid_item *h) s->loc_size = dval & mask; break; case 8: - hid_switch_rid(s, c, dval); + hid_switch_rid(s, c, dval & mask); break; case 9: /* mask because value is unsigned */ diff --git a/sys/dev/usb/usb_hub.c b/sys/dev/usb/usb_hub.c index bc9d98cec6f..85448b9b646 100644 --- a/sys/dev/usb/usb_hub.c +++ b/sys/dev/usb/usb_hub.c @@ -109,6 +109,7 @@ struct uhub_softc { #define UHUB_PROTO(sc) ((sc)->sc_udev->ddesc.bDeviceProtocol) #define UHUB_IS_HIGH_SPEED(sc) (UHUB_PROTO(sc) != UDPROTO_FSHUB) #define UHUB_IS_SINGLE_TT(sc) (UHUB_PROTO(sc) == UDPROTO_HSHUBSTT) +#define UHUB_IS_MULTI_TT(sc) (UHUB_PROTO(sc) == UDPROTO_HSHUBMTT) #define UHUB_IS_SUPER_SPEED(sc) (UHUB_PROTO(sc) == UDPROTO_SSHUB) /* prototypes for type checking: */ @@ -948,6 +949,16 @@ uhub_attach(device_t dev) "bus powered HUB. HUB ignored\n"); goto error; } + + if (UHUB_IS_MULTI_TT(sc)) { + err = usbd_set_alt_interface_index(udev, 0, 1); + if (err) { + device_printf(dev, "MTT could not be enabled\n"); + goto error; + } + device_printf(dev, "MTT enabled\n"); + } + /* get HUB descriptor */ DPRINTFN(2, "Getting HUB descriptor\n"); @@ -1057,10 +1068,6 @@ uhub_attach(device_t dev) } udev->hub = hub; -#if USB_HAVE_TT_SUPPORT - /* init FULL-speed ISOCHRONOUS schedule */ - usbd_fs_isoc_schedule_init_all(hub->fs_isoc_schedule); -#endif /* initialize HUB structure */ hub->hubsoftc = sc; hub->explore = &uhub_explore; @@ -1655,42 +1662,6 @@ usb_hs_bandwidth_free(struct usb_xfer *xfer) } } -/*------------------------------------------------------------------------* - * usbd_fs_isoc_schedule_init_sub - * - * This function initialises an USB FULL speed isochronous schedule - * entry. - *------------------------------------------------------------------------*/ -#if USB_HAVE_TT_SUPPORT -static void -usbd_fs_isoc_schedule_init_sub(struct usb_fs_isoc_schedule *fss) -{ - fss->total_bytes = (USB_FS_ISOC_UFRAME_MAX * - USB_FS_BYTES_PER_HS_UFRAME); - fss->frame_bytes = (USB_FS_BYTES_PER_HS_UFRAME); - fss->frame_slot = 0; -} -#endif - -/*------------------------------------------------------------------------* - * usbd_fs_isoc_schedule_init_all - * - * This function will reset the complete USB FULL speed isochronous - * bandwidth schedule. - *------------------------------------------------------------------------*/ -#if USB_HAVE_TT_SUPPORT -void -usbd_fs_isoc_schedule_init_all(struct usb_fs_isoc_schedule *fss) -{ - struct usb_fs_isoc_schedule *fss_end = fss + USB_ISOC_TIME_MAX; - - while (fss != fss_end) { - usbd_fs_isoc_schedule_init_sub(fss); - fss++; - } -} -#endif - /*------------------------------------------------------------------------* * usb_isoc_time_expand * @@ -1723,114 +1694,130 @@ usb_isoc_time_expand(struct usb_bus *bus, uint16_t isoc_time_curr) } /*------------------------------------------------------------------------* - * usbd_fs_isoc_schedule_isoc_time_expand - * - * This function does multiple things. First of all it will expand the - * passed isochronous time, which is the return value. Then it will - * store where the current FULL speed isochronous schedule is - * positioned in time and where the end is. See "pp_start" and - * "pp_end" arguments. - * - * Returns: - * Expanded version of "isoc_time". - * - * NOTE: This function depends on being called regularly with - * intervals less than "USB_ISOC_TIME_MAX". - *------------------------------------------------------------------------*/ -#if USB_HAVE_TT_SUPPORT -uint16_t -usbd_fs_isoc_schedule_isoc_time_expand(struct usb_device *udev, - struct usb_fs_isoc_schedule **pp_start, - struct usb_fs_isoc_schedule **pp_end, - uint16_t isoc_time) -{ - struct usb_fs_isoc_schedule *fss_end; - struct usb_fs_isoc_schedule *fss_a; - struct usb_fs_isoc_schedule *fss_b; - struct usb_hub *hs_hub; - - isoc_time = usb_isoc_time_expand(udev->bus, isoc_time); - - hs_hub = udev->parent_hs_hub->hub; - - if (hs_hub != NULL) { - - fss_a = hs_hub->fs_isoc_schedule + - (hs_hub->isoc_last_time % USB_ISOC_TIME_MAX); - - hs_hub->isoc_last_time = isoc_time; - - fss_b = hs_hub->fs_isoc_schedule + - (isoc_time % USB_ISOC_TIME_MAX); - - fss_end = hs_hub->fs_isoc_schedule + USB_ISOC_TIME_MAX; - - *pp_start = hs_hub->fs_isoc_schedule; - *pp_end = fss_end; - - while (fss_a != fss_b) { - if (fss_a == fss_end) { - fss_a = hs_hub->fs_isoc_schedule; - continue; - } - usbd_fs_isoc_schedule_init_sub(fss_a); - fss_a++; - } - - } else { - - *pp_start = NULL; - *pp_end = NULL; - } - return (isoc_time); -} -#endif - -/*------------------------------------------------------------------------* - * usbd_fs_isoc_schedule_alloc + * usbd_fs_isoc_schedule_alloc_slot * * This function will allocate bandwidth for an isochronous FULL speed - * transaction in the FULL speed schedule. The microframe slot where - * the transaction should be started is stored in the byte pointed to - * by "pstart". The "len" argument specifies the length of the - * transaction in bytes. + * transaction in the FULL speed schedule. * * Returns: - * 0: Success + * <8: Success * Else: Error *------------------------------------------------------------------------*/ #if USB_HAVE_TT_SUPPORT uint8_t -usbd_fs_isoc_schedule_alloc(struct usb_fs_isoc_schedule *fss, - uint8_t *pstart, uint16_t len) +usbd_fs_isoc_schedule_alloc_slot(struct usb_xfer *isoc_xfer, uint16_t isoc_time) { - uint8_t slot = fss->frame_slot; + struct usb_xfer *xfer; + struct usb_xfer *pipe_xfer; + struct usb_bus *bus; + usb_frlength_t len; + usb_frlength_t data_len; + uint16_t delta; + uint16_t slot; + uint8_t retval; - /* Compute overhead and bit-stuffing */ + data_len = 0; + slot = 0; - len += 8; + bus = isoc_xfer->xroot->bus; - len *= 7; - len /= 6; + TAILQ_FOREACH(xfer, &bus->intr_q.head, wait_entry) { - if (len > fss->total_bytes) { - *pstart = 0; /* set some dummy value */ - return (1); /* error */ - } - if (len > 0) { + /* skip self, if any */ - fss->total_bytes -= len; + if (xfer == isoc_xfer) + continue; - while (len >= fss->frame_bytes) { - len -= fss->frame_bytes; - fss->frame_bytes = USB_FS_BYTES_PER_HS_UFRAME; - fss->frame_slot++; + /* check if this USB transfer is going through the same TT */ + + if (xfer->xroot->udev->parent_hs_hub != + isoc_xfer->xroot->udev->parent_hs_hub) { + continue; + } + if ((isoc_xfer->xroot->udev->parent_hs_hub-> + ddesc.bDeviceProtocol == UDPROTO_HSHUBMTT) && + (xfer->xroot->udev->hs_port_no != + isoc_xfer->xroot->udev->hs_port_no)) { + continue; + } + if (xfer->endpoint->methods != isoc_xfer->endpoint->methods) + continue; + + /* check if isoc_time is part of this transfer */ + + delta = xfer->isoc_time_complete - isoc_time; + if (delta > 0 && delta <= xfer->nframes) { + delta = xfer->nframes - delta; + + len = xfer->frlengths[delta]; + len += 8; + len *= 7; + len /= 6; + + data_len += len; } - fss->frame_bytes -= len; + /* check double buffered transfers */ + + TAILQ_FOREACH(pipe_xfer, &xfer->endpoint->endpoint_q.head, + wait_entry) { + + /* skip self, if any */ + + if (pipe_xfer == isoc_xfer) + continue; + + /* check if isoc_time is part of this transfer */ + + delta = pipe_xfer->isoc_time_complete - isoc_time; + if (delta > 0 && delta <= pipe_xfer->nframes) { + delta = pipe_xfer->nframes - delta; + + len = pipe_xfer->frlengths[delta]; + len += 8; + len *= 7; + len /= 6; + + data_len += len; + } + } } - *pstart = slot; - return (0); /* success */ + + while (data_len >= USB_FS_BYTES_PER_HS_UFRAME) { + data_len -= USB_FS_BYTES_PER_HS_UFRAME; + slot++; + } + + /* check for overflow */ + + if (slot >= USB_FS_ISOC_UFRAME_MAX) + return (255); + + retval = slot; + + delta = isoc_xfer->isoc_time_complete - isoc_time; + if (delta > 0 && delta <= isoc_xfer->nframes) { + delta = isoc_xfer->nframes - delta; + + len = isoc_xfer->frlengths[delta]; + len += 8; + len *= 7; + len /= 6; + + data_len += len; + } + + while (data_len >= USB_FS_BYTES_PER_HS_UFRAME) { + data_len -= USB_FS_BYTES_PER_HS_UFRAME; + slot++; + } + + /* check for overflow */ + + if (slot >= USB_FS_ISOC_UFRAME_MAX) + return (255); + + return (retval); } #endif diff --git a/sys/dev/usb/usb_hub.h b/sys/dev/usb/usb_hub.h index 0f595997708..23a1fa4f1c5 100644 --- a/sys/dev/usb/usb_hub.h +++ b/sys/dev/usb/usb_hub.h @@ -37,23 +37,10 @@ struct usb_port { enum usb_hc_mode usb_mode; /* host or device mode */ }; -/* - * The following structure defines how many bytes are - * left in an 1ms USB time slot. - */ -struct usb_fs_isoc_schedule { - uint16_t total_bytes; - uint8_t frame_bytes; - uint8_t frame_slot; -}; - /* * The following structure defines an USB HUB. */ struct usb_hub { -#if USB_HAVE_TT_SUPPORT - struct usb_fs_isoc_schedule fs_isoc_schedule[USB_ISOC_TIME_MAX]; -#endif struct usb_device *hubudev; /* the HUB device */ usb_error_t (*explore) (struct usb_device *hub); void *hubsoftc; @@ -68,7 +55,6 @@ struct usb_hub { void usb_hs_bandwidth_alloc(struct usb_xfer *xfer); void usb_hs_bandwidth_free(struct usb_xfer *xfer); -void usbd_fs_isoc_schedule_init_all(struct usb_fs_isoc_schedule *fss); void usb_bus_port_set_device(struct usb_bus *bus, struct usb_port *up, struct usb_device *udev, uint8_t device_index); struct usb_device *usb_bus_port_get_device(struct usb_bus *bus, diff --git a/sys/dev/usb/usb_pf.c b/sys/dev/usb/usb_pf.c index 6d654393668..b7b29d7bfec 100644 --- a/sys/dev/usb/usb_pf.c +++ b/sys/dev/usb/usb_pf.c @@ -44,8 +44,10 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include +#include #include #include @@ -58,35 +60,146 @@ __FBSDID("$FreeBSD$"); #include #include -static int usb_no_pf; +#define USBUSNAME "usbus" -SYSCTL_INT(_hw_usb, OID_AUTO, no_pf, CTLFLAG_RW, - &usb_no_pf, 0, "Set to disable USB packet filtering"); +static void usbpf_init(void); +static void usbpf_uninit(void); +static int usbpf_ioctl(struct ifnet *, u_long, caddr_t); +static int usbpf_clone_match(struct if_clone *, const char *); +static int usbpf_clone_create(struct if_clone *, char *, size_t, caddr_t); +static int usbpf_clone_destroy(struct if_clone *, struct ifnet *); +static struct usb_bus *usbpf_ifname2ubus(const char *); +static uint32_t usbpf_aggregate_xferflags(struct usb_xfer_flags *); +static uint32_t usbpf_aggregate_status(struct usb_xfer_flags_int *); +static int usbpf_xfer_frame_is_read(struct usb_xfer *, uint32_t); +static uint32_t usbpf_xfer_precompute_size(struct usb_xfer *, int); -TUNABLE_INT("hw.usb.no_pf", &usb_no_pf); +static struct if_clone usbpf_cloner = IFC_CLONE_INITIALIZER( + USBUSNAME, NULL, IF_MAXUNIT, + NULL, usbpf_clone_match, usbpf_clone_create, usbpf_clone_destroy); -void -usbpf_attach(struct usb_bus *ubus) +SYSINIT(usbpf_init, SI_SUB_PSEUDO, SI_ORDER_MIDDLE, usbpf_init, NULL); +SYSUNINIT(usbpf_uninit, SI_SUB_PSEUDO, SI_ORDER_MIDDLE, usbpf_uninit, NULL); + +static void +usbpf_init(void) { - struct ifnet *ifp; - if (usb_no_pf != 0) { - ubus->ifp = NULL; + if_clone_attach(&usbpf_cloner); +} + +static void +usbpf_uninit(void) +{ + int devlcnt; + device_t *devlp; + devclass_t dc; + struct usb_bus *ubus; + int error; + int i; + + if_clone_detach(&usbpf_cloner); + + dc = devclass_find(USBUSNAME); + if (dc == NULL) return; + error = devclass_get_devices(dc, &devlp, &devlcnt); + if (error) + return; + for (i = 0; i < devlcnt; i++) { + ubus = device_get_softc(devlp[i]); + if (ubus != NULL && ubus->ifp != NULL) + usbpf_clone_destroy(&usbpf_cloner, ubus->ifp); } +} - ifp = ubus->ifp = if_alloc(IFT_USB); - if (ifp == NULL) { +static int +usbpf_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) +{ + + /* No configuration allowed. */ + return (EINVAL); +} + +static struct usb_bus * +usbpf_ifname2ubus(const char *ifname) +{ + device_t dev; + devclass_t dc; + int unit; + int error; + + if (strncmp(ifname, USBUSNAME, sizeof(USBUSNAME) - 1) != 0) + return (NULL); + error = ifc_name2unit(ifname, &unit); + if (error || unit < 0) + return (NULL); + dc = devclass_find(USBUSNAME); + if (dc == NULL) + return (NULL); + dev = devclass_get_device(dc, unit); + if (dev == NULL) + return (NULL); + + return (device_get_softc(dev)); +} + +static int +usbpf_clone_match(struct if_clone *ifc, const char *name) +{ + struct usb_bus *ubus; + + ubus = usbpf_ifname2ubus(name); + if (ubus == NULL) + return (0); + if (ubus->ifp != NULL) + return (0); + + return (1); +} + +static int +usbpf_clone_create(struct if_clone *ifc, char *name, size_t len, caddr_t params) +{ + int error; + int unit; + struct ifnet *ifp; + struct usb_bus *ubus; + + error = ifc_name2unit(name, &unit); + if (error) + return (error); + if (unit < 0) + return (EINVAL); + + ubus = usbpf_ifname2ubus(name); + if (ubus == NULL) + return (1); + if (ubus->ifp != NULL) + return (1); + + error = ifc_alloc_unit(ifc, &unit); + if (error) { + ifc_free_unit(ifc, unit); device_printf(ubus->parent, "usbpf: Could not allocate " "instance\n"); - return; + return (error); } - - if_initname(ifp, "usbus", device_get_unit(ubus->bdev)); - ifp->if_flags = IFF_CANTCONFIG; + ifp = ubus->ifp = if_alloc(IFT_USB); + if (ifp == NULL) { + ifc_free_unit(ifc, unit); + device_printf(ubus->parent, "usbpf: Could not allocate " + "instance\n"); + return (ENOSPC); + } + strlcpy(ifp->if_xname, name, sizeof(ifp->if_xname)); + ifp->if_softc = ubus; + ifp->if_dname = ifc->ifc_name; + ifp->if_dunit = unit; + ifp->if_ioctl = usbpf_ioctl; if_attach(ifp); - if_up(ifp); - + ifp->if_flags |= IFF_UP; + rt_ifmsg(ifp); /* * XXX According to the specification of DLT_USB, it indicates * packets beginning with USB setup header. But not sure all @@ -94,6 +207,31 @@ usbpf_attach(struct usb_bus *ubus) */ bpfattach(ifp, DLT_USB, USBPF_HDR_LEN); + return (0); +} + +static int +usbpf_clone_destroy(struct if_clone *ifc, struct ifnet *ifp) +{ + struct usb_bus *ubus; + int unit; + + ubus = ifp->if_softc; + unit = ifp->if_dunit; + + ubus->ifp = NULL; + bpfdetach(ifp); + if_detach(ifp); + if_free(ifp); + ifc_free_unit(ifc, unit); + + return (0); +} + +void +usbpf_attach(struct usb_bus *ubus) +{ + if (bootverbose) device_printf(ubus->parent, "usbpf: Attached\n"); } @@ -101,15 +239,11 @@ usbpf_attach(struct usb_bus *ubus) void usbpf_detach(struct usb_bus *ubus) { - struct ifnet *ifp = ubus->ifp; - if (ifp != NULL) { - bpfdetach(ifp); - if_down(ifp); - if_detach(ifp); - if_free(ifp); - } - ubus->ifp = NULL; + if (ubus->ifp != NULL) + usbpf_clone_destroy(&usbpf_cloner, ubus->ifp); + if (bootverbose) + device_printf(ubus->parent, "usbpf: Detached\n"); } static uint32_t @@ -259,8 +393,6 @@ usbpf_xfertap(struct usb_xfer *xfer, int type) bus = xfer->xroot->bus; /* sanity checks */ - if (usb_no_pf != 0) - return; if (bus->ifp == NULL) return; if (!bpf_peers_present(bus->ifp->if_bpf)) diff --git a/sys/dev/usb/usb_transfer.c b/sys/dev/usb/usb_transfer.c index 3e5398cfd73..b799897c7f8 100644 --- a/sys/dev/usb/usb_transfer.c +++ b/sys/dev/usb/usb_transfer.c @@ -217,12 +217,12 @@ usbd_transfer_setup_sub_malloc(struct usb_setup_params *parm, * Try multi-allocation chunks to reduce the number of DMA * allocations, hence DMA allocations are slow. */ - if (size >= PAGE_SIZE) { + if (size >= USB_PAGE_SIZE) { n_dma_pc = count; n_obj = 1; } else { /* compute number of objects per page */ - n_obj = (PAGE_SIZE / size); + n_obj = (USB_PAGE_SIZE / size); /* * Compute number of DMA chunks, rounded up * to nearest one: @@ -1681,11 +1681,12 @@ usbd_pipe_enter(struct usb_xfer *xfer) DPRINTF("enter\n"); + /* the transfer can now be cancelled */ + xfer->flags_int.can_cancel_immed = 1; + /* enter the transfer */ (ep->methods->enter) (xfer); - xfer->flags_int.can_cancel_immed = 1; - /* check for transfer error */ if (xfer->error) { /* some error has happened */ @@ -2418,13 +2419,15 @@ usbd_transfer_start_cb(void *arg) #if USB_HAVE_PF usbpf_xfertap(xfer, USBPF_XFERTAP_SUBMIT); #endif + + /* the transfer can now be cancelled */ + xfer->flags_int.can_cancel_immed = 1; + /* start USB transfer, if no error */ if (xfer->error == 0) (ep->methods->start) (xfer); - xfer->flags_int.can_cancel_immed = 1; - - /* check for error */ + /* check for transfer error */ if (xfer->error) { /* some error has happened */ usbd_transfer_done(xfer, 0); @@ -2599,13 +2602,14 @@ usbd_pipe_start(struct usb_xfer_queue *pq) #if USB_HAVE_PF usbpf_xfertap(xfer, USBPF_XFERTAP_SUBMIT); #endif + /* the transfer can now be cancelled */ + xfer->flags_int.can_cancel_immed = 1; + /* start USB transfer, if no error */ if (xfer->error == 0) (ep->methods->start) (xfer); - xfer->flags_int.can_cancel_immed = 1; - - /* check for error */ + /* check for transfer error */ if (xfer->error) { /* some error has happened */ usbd_transfer_done(xfer, 0); diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs index a1ccbfeb4f6..aedea58185b 100644 --- a/sys/dev/usb/usbdevs +++ b/sys/dev/usb/usbdevs @@ -487,6 +487,7 @@ vendor BROADCOM 0x0a5c Broadcom vendor GREENHOUSE 0x0a6b GREENHOUSE vendor MEDELI 0x0a67 Medeli vendor GEOCAST 0x0a79 Geocast Network Systems +vendor EGO 0x0a92 EGO systems vendor IDQUANTIQUE 0x0aba id Quantique vendor ZYDAS 0x0ace Zydas Technology Corporation vendor NEODIO 0x0aec Neodio @@ -559,6 +560,7 @@ vendor APACER 0x1005 Apacer vendor MOTOROLA4 0x100d Motorola vendor AIRPLUS 0x1011 Airplus vendor DESKNOTE 0x1019 Desknote +vendor NEC3 0x1033 NEC vendor GIGABYTE 0x1044 GIGABYTE vendor WESTERN 0x1058 Western Digital vendor MOTOROLA 0x1063 Motorola @@ -611,6 +613,7 @@ vendor INITIO 0x13fd Initio Corporation vendor EMTEC 0x13fe Emtec vendor NOVATEL 0x1410 Novatel Wireless vendor MERLIN 0x1416 Merlin +vendor REDOCTANE 0x1430 RedOctane vendor WISTRONNEWEB 0x1435 Wistron NeWeb vendor RADIOSHACK 0x1453 Radio Shack vendor HUAWEI3COM 0x1472 Huawei-3Com @@ -633,6 +636,7 @@ vendor FIBERLINE 0x1582 Fiberline vendor SPARKLAN 0x15a9 SparkLAN vendor SOUNDGRAPH 0x15c2 Soundgraph, Inc. vendor AMIT2 0x15c5 AMIT +vendor TEXTECH 0x15ca Textech International Ltd. vendor SOHOWARE 0x15e8 SOHOware vendor UMAX 0x1606 UMAX Data Systems vendor INSIDEOUT 0x1608 Inside Out Networks @@ -687,6 +691,7 @@ vendor TLAYTECH 0x20b9 Tlay Tech vendor ENCORE 0x203d Encore vendor PARA 0x20b8 PARA Industrial vendor SIMTEC 0x20df Simtec Electronics +vendor VIALABS 0x2109 VIA Labs vendor ERICSSON 0x2282 Ericsson vendor MOTOROLA2 0x22b8 Motorola vendor TRIPPLITE 0x2478 Tripp-Lite @@ -723,6 +728,7 @@ vendor MARVELL 0x9e88 Marvell Technology Group Ltd. vendor 3COM3 0xa727 3Com vendor DATAAPEX 0xdaae DataApex vendor HP2 0xf003 Hewlett Packard +vendor LOGILINK 0xfc08 LogiLink vendor USRP 0xfffe GNU Radio USRP /* @@ -1472,6 +1478,10 @@ product EGALAX TPANEL 0x0001 Touch Panel product EGALAX TPANEL2 0x0002 Touch Panel product EGALAX2 TPANEL 0x0001 Touch Panel +/* EGO Products */ +product EGO DUMMY 0x0000 Dummy Product +product EGO M4U 0x1020 ESI M4U + /* Eicon Networks */ product EICON DIVA852 0x4905 Diva 852 ISDN TA @@ -1604,9 +1614,9 @@ product FTDI SERIAL_8U232AM 0x6001 8U232AM Serial product FTDI SERIAL_8U232AM4 0x6004 8U232AM Serial product FTDI SERIAL_2232C 0x6010 FT2232C Dual port Serial product FTDI SERIAL_2232D 0x9e90 FT2232D Dual port Serial -product FTDI BEAGLEBONE 0xA6D0 BeagleBone product FTDI SERIAL_4232H 0x6011 FT4232H Quad port Serial -product FTDI SERIAL_BEAGLEBONE 0xa6d0 BeagleBone FTDI Serial +product FTDI BEAGLEBONE 0xa6d0 BeagleBone +product FTDI TURTELIZER2 0xbdc8 egnite Turtelizer 2 JTAG/RS232 Adapter /* Gude Analog- und Digitalsysteme products also uses FTDI's id: */ product FTDI TACTRIX_OPENPORT_13M 0xcc48 OpenPort 1.3 Mitsubishi product FTDI TACTRIX_OPENPORT_13S 0xcc49 OpenPort 1.3 Subaru @@ -1885,6 +1895,7 @@ product HUAWEI E1752 0x1446 3G modem product HUAWEI K3765 0x1465 3G modem product HUAWEI E1820 0x14ac E1820 HSPA+ USB Slider product HUAWEI K3765_INIT 0x1520 K3765 Initial +product HUAWEI ETS2055 0x1803 CDMA modem product HUAWEI E173 0x1c05 3G modem product HUAWEI E173_INIT 0x1c0b 3G modem initial @@ -1916,6 +1927,7 @@ product INSYSTEM STORAGE_V2 0x5701 USB Storage Adapter V2 product INTEL EASYPC_CAMERA 0x0110 Easy PC Camera product INTEL TESTBOARD 0x9890 82930 test board product INTEL2 IRMH 0x0020 Integrated Rate Matching Hub +product INTEL2 IRMH2 0x0024 Integrated Rate Matching Hub /* Intersil products */ product INTERSIL PRISM_GT 0x1000 PrismGT USB 2.0 WLAN @@ -2090,6 +2102,10 @@ product LINKSYS4 WUSB54GCV3 0x0077 WUSB54GC v3 product LINKSYS4 RT3070 0x0078 RT3070 product LINKSYS4 WUSB600NV2 0x0079 WUSB600N v2 +/* Logilink products */ +product LOGILINK DUMMY 0x0000 Dummy product +product LOGILINK U2M 0x0101 LogiLink USB MIDI Cable + /* Logitech products */ product LOGITECH M2452 0x0203 M2452 keyboard product LOGITECH M4848 0x0301 M4848 mouse @@ -2124,6 +2140,7 @@ product LOGITEC RT2870_1 0x0162 RT2870 product LOGITEC RT2870_2 0x0163 RT2870 product LOGITEC RT2870_3 0x0164 RT2870 product LOGITEC LANW300NU2 0x0166 LAN-W300N/U2 +product LOGITEC LANW150NU2 0x0168 LAN-W150N/U2 /* Longcheer Holdings, Ltd. products */ product LONGCHEER WM66 0x6061 Longcheer WM66 HSDPA @@ -2188,7 +2205,8 @@ product MELCO RT2870_1 0x0148 RT2870 product MELCO RT2870_2 0x0150 RT2870 product MELCO WLIUCGN 0x015d WLI-UC-GN product MELCO WLIUCG301N 0x016f WLI-UC-G301N -product MELCO WLIUCGNM 0x01a2 WLI-UC-GNM +product MELCO WLIUCGNM 0x01a2 WLI-UC-GNM +product MELCO WLIUCGNM2 0x01ee WLI-UC-GNM2 /* Merlin products */ product MERLIN V620 0x1110 Merlin V620 @@ -2602,6 +2620,7 @@ product PLANEX2 GWUS54GD 0xed01 GW-US54GD product PLANEX2 GWUSMM 0xed02 GW-USMM product PLANEX2 RT2870 0xed06 RT2870 product PLANEX2 GWUSMICRON 0xed14 GW-USMicroN +product PLANEX2 GWUSVALUEEZ 0xed17 GW-USValue-EZ product PLANEX3 GWUS54GZ 0xab10 GW-US54GZ product PLANEX3 GU1000T 0xab11 GU-1000T product PLANEX3 GWUS54MINI 0xab13 GW-US54Mini @@ -2813,6 +2832,10 @@ product REALTEK RTL8187B_0 0x8189 RTL8187B Wireless Adapter product REALTEK RTL8187B_1 0x8197 RTL8187B Wireless Adapter product REALTEK RTL8187B_2 0x8198 RTL8187B Wireless Adapter +/* RedOctane products */ +product REDOCTANE DUMMY 0x0000 Dummy product +product REDOCTANE GHMIDI 0x474b GH MIDI INTERFACE + /* Renesas products */ product RENESAS RX610 0x0053 RX610 RX-Stick @@ -3249,6 +3272,11 @@ product SYNTECH CYPHERLAB100 0x1000 CipherLab USB Barcode Scanner /* Teclast products */ product TECLAST TLC300 0x3203 USB Media Player +/* TexTech products */ +product TEXTECH DUMMY 0x0000 Dummy product +product TEXTECH U2M_1 0x0101 Textech USB MIDI cable +product TEXTECH U2M_2 0x1806 Textech USB MIDI cable + /* Supra products */ product DIAMOND2 SUPRAEXPRESS56K 0x07da Supra Express 56K modem product DIAMOND2 SUPRA2890 0x0b4a SupraMax 2890 56K Modem @@ -3322,6 +3350,7 @@ product TOSHIBA POCKETPC_E740 0x0706 PocketPC e740 product TOSHIBA RT3070 0x0a07 RT3070 product TOSHIBA G450 0x0d45 G450 modem product TOSHIBA HSDPA 0x1302 G450 modem +product TOSHIBA TRANSMEMORY 0x6545 USB ThumbDrive /* Trek Technology products */ product TREK THUMBDRIVE 0x1111 ThumbDrive @@ -3378,6 +3407,9 @@ product USR USR5423 0x0121 USR5423 WLAN /* VIA Technologies products */ product VIA USB2IDEBRIDGE 0x6204 USB 2.0 IDE Bridge +/* VIA Labs */ +product VIALABS USB30SATABRIDGE 0x0700 USB 3.0 SATA Bridge + /* Vaisala products */ product VAISALA CABLE 0x0200 USB Interface cable @@ -3421,7 +3453,9 @@ product WAVESENSE JAZZ 0xaaaa Jazz blood glucose meter /* WCH products */ product WCH CH341SER 0x5523 CH341/CH340 USB-Serial Bridge +product WCH2 DUMMY 0x0000 Dummy product product WCH2 CH341SER 0x7523 CH341/CH340 USB-Serial Bridge +product WCH2 U2M 0X752d CH345 USB2.0-MIDI /* Western Digital products */ product WESTERN COMBO 0x0200 Firewire USB Combo diff --git a/sys/dev/usb/wlan/if_rum.c b/sys/dev/usb/wlan/if_rum.c index edd85cc57a4..93e66de8287 100644 --- a/sys/dev/usb/wlan/if_rum.c +++ b/sys/dev/usb/wlan/if_rum.c @@ -726,6 +726,12 @@ rum_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) ni = ieee80211_ref_node(vap->iv_bss); if (vap->iv_opmode != IEEE80211_M_MONITOR) { + if (ic->ic_bsschan == IEEE80211_CHAN_ANYC) { + RUM_UNLOCK(sc); + IEEE80211_LOCK(ic); + ieee80211_free_node(ni); + return (-1); + } rum_update_slot(ic->ic_ifp); rum_enable_mrr(sc); rum_set_txpreamble(sc); @@ -2135,11 +2141,12 @@ rum_prepare_beacon(struct rum_softc *sc, struct ieee80211vap *vap) if (vap->iv_bss->ni_chan == IEEE80211_CHAN_ANYC) return; + if (ic->ic_bsschan == IEEE80211_CHAN_ANYC) + return; m0 = ieee80211_beacon_alloc(vap->iv_bss, &RUM_VAP(vap)->bo); - if (m0 == NULL) { + if (m0 == NULL) return; - } tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_bsschan)]; rum_setup_tx_desc(sc, &desc, RT2573_TX_TIMESTAMP, RT2573_TX_HWSEQ, diff --git a/sys/dev/usb/wlan/if_run.c b/sys/dev/usb/wlan/if_run.c index ddb73950a09..c3a714d4208 100644 --- a/sys/dev/usb/wlan/if_run.c +++ b/sys/dev/usb/wlan/if_run.c @@ -209,6 +209,7 @@ static const STRUCT_USB_HOST_ID run_devs[] = { RUN_DEV(LOGITEC, RT2870_2), RUN_DEV(LOGITEC, RT2870_3), RUN_DEV(LOGITEC, LANW300NU2), + RUN_DEV(LOGITEC, LANW150NU2), RUN_DEV(MELCO, RT2870_1), RUN_DEV(MELCO, RT2870_2), RUN_DEV(MELCO, WLIUCAG300N), @@ -216,6 +217,7 @@ static const STRUCT_USB_HOST_ID run_devs[] = { RUN_DEV(MELCO, WLIUCG301N), RUN_DEV(MELCO, WLIUCGN), RUN_DEV(MELCO, WLIUCGNM), + RUN_DEV(MELCO, WLIUCGNM2), RUN_DEV(MOTOROLA4, RT2770), RUN_DEV(MOTOROLA4, RT3070), RUN_DEV(MSI, RT3070_1), @@ -1830,6 +1832,11 @@ run_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) if (vap->iv_opmode != IEEE80211_M_MONITOR) { struct ieee80211_node *ni; + if (ic->ic_bsschan == IEEE80211_CHAN_ANYC) { + RUN_UNLOCK(sc); + IEEE80211_LOCK(ic); + return (-1); + } run_updateslot(ic->ic_ifp); run_enable_mrr(sc); run_set_txpreamble(sc); @@ -2523,8 +2530,8 @@ run_rx_frame(struct run_softc *sc, struct mbuf *m, uint32_t dmalen) struct run_rx_radiotap_header *tap = &sc->sc_rxtap; tap->wr_flags = 0; - tap->wr_chan_freq = htole16(ic->ic_bsschan->ic_freq); - tap->wr_chan_flags = htole16(ic->ic_bsschan->ic_flags); + tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq); + tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags); tap->wr_antsignal = rssi; tap->wr_antenna = ant; tap->wr_dbm_antsignal = run_rssi2dbm(sc, rssi, ant); @@ -2778,8 +2785,8 @@ tr_setup: tap->wt_flags = 0; tap->wt_rate = rt2860_rates[data->ridx].rate; - tap->wt_chan_freq = htole16(vap->iv_bss->ni_chan->ic_freq); - tap->wt_chan_flags = htole16(vap->iv_bss->ni_chan->ic_flags); + tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq); + tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags); tap->wt_hwqueue = index; if (le16toh(txwi->phy) & RT2860_PHY_SHPRE) tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; @@ -3967,6 +3974,8 @@ run_update_beacon_cb(void *arg) if (vap->iv_bss->ni_chan == IEEE80211_CHAN_ANYC) return; + if (ic->ic_bsschan == IEEE80211_CHAN_ANYC) + return; /* * No need to call ieee80211_beacon_update(), run_update_beacon() diff --git a/sys/dev/usb/wlan/if_ural.c b/sys/dev/usb/wlan/if_ural.c index d1cb91ee39d..60096bda385 100644 --- a/sys/dev/usb/wlan/if_ural.c +++ b/sys/dev/usb/wlan/if_ural.c @@ -713,6 +713,12 @@ ural_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) ni = ieee80211_ref_node(vap->iv_bss); if (vap->iv_opmode != IEEE80211_M_MONITOR) { + if (ic->ic_bsschan == IEEE80211_CHAN_ANYC) { + RAL_UNLOCK(sc); + IEEE80211_LOCK(ic); + ieee80211_free_node(ni); + return (-1); + } ural_update_slot(ic->ic_ifp); ural_set_txpreamble(sc); ural_set_basicrates(sc, ic->ic_bsschan); @@ -1054,7 +1060,12 @@ ural_tx_bcn(struct ural_softc *sc, struct mbuf *m0, struct ieee80211_node *ni) ifp->if_drv_flags |= IFF_DRV_OACTIVE; m_freem(m0); ieee80211_free_node(ni); - return EIO; + return (EIO); + } + if (ic->ic_bsschan == IEEE80211_CHAN_ANYC) { + m_freem(m0); + ieee80211_free_node(ni); + return (ENXIO); } data = STAILQ_FIRST(&sc->tx_free); STAILQ_REMOVE_HEAD(&sc->tx_free, next); diff --git a/sys/dev/viawd/viawd.c b/sys/dev/viawd/viawd.c index d56b6775fe4..46d7644f77e 100644 --- a/sys/dev/viawd/viawd.c +++ b/sys/dev/viawd/viawd.c @@ -168,14 +168,18 @@ viawd_attach(device_t dev) } /* Allocate I/O register space. */ - sc->wd_rid = 0; - sc->wd_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->wd_rid, - pmbase, pmbase + VIAWD_MEM_LEN - 1, VIAWD_MEM_LEN, + sc->wd_rid = VIAWD_CONFIG_BASE; + sc->wd_res = bus_alloc_resource_any(sb_dev, SYS_RES_MEMORY, &sc->wd_rid, RF_ACTIVE | RF_SHAREABLE); if (sc->wd_res == NULL) { device_printf(dev, "Unable to map watchdog memory\n"); goto fail; } + if (rman_get_size(sc->wd_res) < VIAWD_MEM_LEN) { + device_printf(dev, "Bad size for watchdog memory: %#x\n", + (unsigned)rman_get_size(sc->wd_res)); + goto fail; + } /* Check if watchdog fired last boot. */ reg = viawd_read_4(sc, VIAWD_MEM_CTRL); @@ -192,7 +196,7 @@ viawd_attach(device_t dev) return (0); fail: if (sc->wd_res != NULL) - bus_release_resource(dev, SYS_RES_MEMORY, + bus_release_resource(sb_dev, SYS_RES_MEMORY, sc->wd_rid, sc->wd_res); return (ENXIO); } @@ -224,7 +228,7 @@ viawd_detach(device_t dev) } if (sc->wd_res != NULL) - bus_release_resource(sc->dev, SYS_RES_MEMORY, + bus_release_resource(sc->sb_dev, SYS_RES_MEMORY, sc->wd_rid, sc->wd_res); return (0); diff --git a/sys/dev/virtio/balloon/virtio_balloon.c b/sys/dev/virtio/balloon/virtio_balloon.c index d589a733c25..9b454591a9d 100644 --- a/sys/dev/virtio/balloon/virtio_balloon.c +++ b/sys/dev/virtio/balloon/virtio_balloon.c @@ -412,7 +412,6 @@ vtballoon_send_page_frames(struct vtballoon_softc *sc, struct virtqueue *vq, * interrupt handler will wake us up. */ VTBALLOON_LOCK(sc); - while ((c = virtqueue_dequeue(vq, NULL)) == NULL) msleep_spin(sc, VTBALLOON_MTX(sc), "vtbspf", 0); VTBALLOON_UNLOCK(sc); diff --git a/sys/dev/virtio/balloon/virtio_balloon.h b/sys/dev/virtio/balloon/virtio_balloon.h index 1a527335956..f143341572c 100644 --- a/sys/dev/virtio/balloon/virtio_balloon.h +++ b/sys/dev/virtio/balloon/virtio_balloon.h @@ -31,8 +31,6 @@ #ifndef _VIRTIO_BALLOON_H #define _VIRTIO_BALLOON_H -#include - /* Feature bits. */ #define VIRTIO_BALLOON_F_MUST_TELL_HOST 0x1 /* Tell before reclaiming pages */ #define VIRTIO_BALLOON_F_STATS_VQ 0x2 /* Memory stats virtqueue */ diff --git a/sys/dev/virtio/block/virtio_blk.c b/sys/dev/virtio/block/virtio_blk.c index d05fa7a4ec4..d35421a7659 100644 --- a/sys/dev/virtio/block/virtio_blk.c +++ b/sys/dev/virtio/block/virtio_blk.c @@ -42,7 +42,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include @@ -119,7 +118,7 @@ static int vtblk_shutdown(device_t); static int vtblk_open(struct disk *); static int vtblk_close(struct disk *); static int vtblk_ioctl(struct disk *, u_long, void *, int, - struct thread *); + struct thread *); static int vtblk_dump(void *, void *, vm_offset_t, off_t, size_t); static void vtblk_strategy(struct bio *); @@ -193,7 +192,7 @@ TUNABLE_INT("hw.vtblk.no_ident", &vtblk_no_ident); mtx_assert(VTBLK_MTX((_sc)), MA_NOTOWNED) #define VTBLK_DISK_NAME "vtbd" -#define VTBLK_QUIESCE_TIMEOUT (30 * hz) +#define VTBLK_QUIESCE_TIMEOUT (30 * hz) /* * Each block request uses at least two segments - one for the header @@ -201,8 +200,6 @@ TUNABLE_INT("hw.vtblk.no_ident", &vtblk_no_ident); */ #define VTBLK_MIN_SEGMENTS 2 -static uma_zone_t vtblk_req_zone; - static device_method_t vtblk_methods[] = { /* Device methods. */ DEVMETHOD(device_probe, vtblk_probe), @@ -236,19 +233,8 @@ vtblk_modevent(module_t mod, int type, void *unused) switch (type) { case MOD_LOAD: - vtblk_req_zone = uma_zcreate("vtblk_request", - sizeof(struct vtblk_request), - NULL, NULL, NULL, NULL, 0, 0); - break; case MOD_QUIESCE: case MOD_UNLOAD: - if (uma_zone_get_cur(vtblk_req_zone) > 0) - error = EBUSY; - else if (type == MOD_UNLOAD) { - uma_zdestroy(vtblk_req_zone); - vtblk_req_zone = NULL; - } - break; case MOD_SHUTDOWN: break; default: @@ -316,7 +302,7 @@ vtblk_attach(device_t dev) } sc->vtblk_max_nsegs = vtblk_maximum_segments(sc, &blkcfg); - if (sc->vtblk_max_nsegs <= VTBLK_MIN_SEGMENTS) { + if (sc->vtblk_max_nsegs <= VTBLK_MIN_SEGMENTS) { error = EINVAL; device_printf(dev, "fewer than minimum number of segments " "allowed: %d\n", sc->vtblk_max_nsegs); @@ -493,7 +479,6 @@ vtblk_dump(void *arg, void *virtual, vm_offset_t physical, off_t offset, int error; dp = arg; - error = 0; if ((sc = dp->d_drv1) == NULL) return (ENXIO); @@ -539,7 +524,7 @@ vtblk_strategy(struct bio *bp) return; } -#ifdef INVARIANTS +#ifdef INVARIANTS /* * Prevent read/write buffers spanning too many segments from * getting into the queue. This should only trip if d_maxsize @@ -547,13 +532,13 @@ vtblk_strategy(struct bio *bp) */ if (bp->bio_cmd == BIO_READ || bp->bio_cmd == BIO_WRITE) { int nsegs, max_nsegs; - + nsegs = sglist_count(bp->bio_data, bp->bio_bcount); max_nsegs = sc->vtblk_max_nsegs - VTBLK_MIN_SEGMENTS; KASSERT(nsegs <= max_nsegs, - ("bio spanned too many segments: %d, max: %d", - nsegs, max_nsegs)); + ("bio %p spanned too many segments: %d, max: %d", + bp, nsegs, max_nsegs)); } #endif @@ -800,27 +785,22 @@ vtblk_execute_request(struct vtblk_softc *sc, struct vtblk_request *req) VTBLK_LOCK_ASSERT(sc); sglist_reset(sg); - error = sglist_append(sg, &req->vbr_hdr, - sizeof(struct virtio_blk_outhdr)); - KASSERT(error == 0, ("error adding header to sglist")); - KASSERT(sg->sg_nseg == 1, - ("header spanned multiple segments: %d", sg->sg_nseg)); + + sglist_append(sg, &req->vbr_hdr, sizeof(struct virtio_blk_outhdr)); if (bp->bio_cmd == BIO_READ || bp->bio_cmd == BIO_WRITE) { error = sglist_append(sg, bp->bio_data, bp->bio_bcount); - KASSERT(error == 0, ("error adding buffer to sglist")); + if (error || sg->sg_nseg == sg->sg_maxseg) + panic("%s: data buffer too big bio:%p error:%d", + __FUNCTION__, bp, error); /* BIO_READ means the host writes into our buffer. */ if (bp->bio_cmd == BIO_READ) - writable += sg->sg_nseg - 1; + writable = sg->sg_nseg - 1; } - error = sglist_append(sg, &req->vbr_ack, sizeof(uint8_t)); - KASSERT(error == 0, ("error adding ack to sglist")); writable++; - - KASSERT(sg->sg_nseg >= VTBLK_MIN_SEGMENTS, - ("fewer than min segments: %d", sg->sg_nseg)); + sglist_append(sg, &req->vbr_ack, sizeof(uint8_t)); readable = sg->sg_nseg - writable; @@ -995,12 +975,10 @@ vtblk_flush_dump(struct vtblk_softc *sc) static int vtblk_poll_request(struct vtblk_softc *sc, struct vtblk_request *req) { - device_t dev; struct virtqueue *vq; struct vtblk_request *r; int error; - dev = sc->vtblk_dev; vq = sc->vtblk_vq; if (!virtqueue_empty(vq)) @@ -1013,12 +991,12 @@ vtblk_poll_request(struct vtblk_softc *sc, struct vtblk_request *req) virtqueue_notify(vq); r = virtqueue_poll(vq, NULL); - KASSERT(r == req, ("unexpected request response")); + KASSERT(r == req, ("unexpected request response: %p/%p", r, req)); error = vtblk_request_error(req); if (error && bootverbose) { - device_printf(dev, "vtblk_poll_request: IO error: %d\n", - error); + device_printf(sc->vtblk_dev, + "%s: IO error: %d\n", __FUNCTION__, error); } return (error); @@ -1090,6 +1068,20 @@ vtblk_drain(struct vtblk_softc *sc) vtblk_free_requests(sc); } +#ifdef INVARIANTS +static void +vtblk_request_invariants(struct vtblk_request *req) +{ + int hdr_nsegs, ack_nsegs; + + hdr_nsegs = sglist_count(&req->vbr_hdr, sizeof(req->vbr_hdr)); + ack_nsegs = sglist_count(&req->vbr_ack, sizeof(req->vbr_ack)); + + KASSERT(hdr_nsegs == 1, ("request header crossed page boundary")); + KASSERT(ack_nsegs == 1, ("request ack crossed page boundary")); +} +#endif + static int vtblk_alloc_requests(struct vtblk_softc *sc) { @@ -1107,10 +1099,14 @@ vtblk_alloc_requests(struct vtblk_softc *sc) nreqs /= VTBLK_MIN_SEGMENTS; for (i = 0; i < nreqs; i++) { - req = uma_zalloc(vtblk_req_zone, M_NOWAIT); + req = malloc(sizeof(struct vtblk_request), M_DEVBUF, M_NOWAIT); if (req == NULL) return (ENOMEM); +#ifdef INVARIANTS + vtblk_request_invariants(req); +#endif + sc->vtblk_request_count++; vtblk_enqueue_request(sc, req); } @@ -1128,10 +1124,11 @@ vtblk_free_requests(struct vtblk_softc *sc) while ((req = vtblk_dequeue_request(sc)) != NULL) { sc->vtblk_request_count--; - uma_zfree(vtblk_req_zone, req); + free(req, M_DEVBUF); } - KASSERT(sc->vtblk_request_count == 0, ("leaked requests")); + KASSERT(sc->vtblk_request_count == 0, + ("leaked requests: %d", sc->vtblk_request_count)); } static struct vtblk_request * diff --git a/sys/dev/virtio/block/virtio_blk.h b/sys/dev/virtio/block/virtio_blk.h index f26c6498372..fdac9e5e5f8 100644 --- a/sys/dev/virtio/block/virtio_blk.h +++ b/sys/dev/virtio/block/virtio_blk.h @@ -31,8 +31,6 @@ #ifndef _VIRTIO_BLK_H #define _VIRTIO_BLK_H -#include - /* Feature bits */ #define VIRTIO_BLK_F_BARRIER 0x0001 /* Does host support barriers? */ #define VIRTIO_BLK_F_SIZE_MAX 0x0002 /* Indicates maximum segment size */ diff --git a/sys/dev/virtio/network/if_vtnet.c b/sys/dev/virtio/network/if_vtnet.c index 64a82ac028f..e6fef9094db 100644 --- a/sys/dev/virtio/network/if_vtnet.c +++ b/sys/dev/virtio/network/if_vtnet.c @@ -748,11 +748,9 @@ vtnet_is_link_up(struct vtnet_softc *sc) static void vtnet_update_link_status(struct vtnet_softc *sc) { - device_t dev; struct ifnet *ifp; int link; - dev = sc->vtnet_dev; ifp = sc->vtnet_ifp; link = vtnet_is_link_up(sc); diff --git a/sys/dev/virtio/network/virtio_net.h b/sys/dev/virtio/network/virtio_net.h index 058f29f7ad0..15a73ccbb8e 100644 --- a/sys/dev/virtio/network/virtio_net.h +++ b/sys/dev/virtio/network/virtio_net.h @@ -31,8 +31,6 @@ #ifndef _VIRTIO_NET_H #define _VIRTIO_NET_H -#include - /* The feature bitmap for virtio net */ #define VIRTIO_NET_F_CSUM 0x00001 /* Host handles pkts w/ partial csum */ #define VIRTIO_NET_F_GUEST_CSUM 0x00002 /* Guest handles pkts w/ partial csum*/ diff --git a/sys/dev/virtio/pci/virtio_pci.c b/sys/dev/virtio/pci/virtio_pci.c index 56813e4a1a7..917ca84af7f 100644 --- a/sys/dev/virtio/pci/virtio_pci.c +++ b/sys/dev/virtio/pci/virtio_pci.c @@ -57,12 +57,15 @@ struct vtpci_softc { struct resource *vtpci_msix_res; uint64_t vtpci_features; uint32_t vtpci_flags; -#define VIRTIO_PCI_FLAG_NO_MSI 0x0001 -#define VIRTIO_PCI_FLAG_MSI 0x0002 -#define VIRTIO_PCI_FLAG_NO_MSIX 0x0010 -#define VIRTIO_PCI_FLAG_MSIX 0x0020 -#define VIRTIO_PCI_FLAG_SHARED_MSIX 0x0040 +#define VTPCI_FLAG_NO_MSI 0x0001 +#define VTPCI_FLAG_NO_MSIX 0x0002 +#define VTPCI_FLAG_LEGACY 0x1000 +#define VTPCI_FLAG_MSI 0x2000 +#define VTPCI_FLAG_MSIX 0x4000 +#define VTPCI_FLAG_SHARED_MSIX 0x8000 +#define VTPCI_FLAG_ITYPE_MASK 0xF000 + /* This "bus" will only ever have one child. */ device_t vtpci_child_dev; struct virtio_feature_desc *vtpci_child_feat_desc; @@ -80,7 +83,8 @@ struct vtpci_softc { int vtpci_nvqs; struct vtpci_virtqueue { struct virtqueue *vq; - + /* Device did not provide a callback for this virtqueue. */ + int no_intr; /* Index into vtpci_intr_res[] below. Unused, then -1. */ int ires_idx; } vtpci_vqx[VIRTIO_MAX_VIRTQUEUES]; @@ -130,24 +134,39 @@ static void vtpci_describe_features(struct vtpci_softc *, const char *, uint64_t); static void vtpci_probe_and_attach_child(struct vtpci_softc *); -static int vtpci_alloc_interrupts(struct vtpci_softc *, int, int, - struct vq_alloc_info *); -static int vtpci_alloc_intr_resources(struct vtpci_softc *, int, - struct vq_alloc_info *); -static int vtpci_alloc_msi(struct vtpci_softc *); -static int vtpci_alloc_msix(struct vtpci_softc *, int); +static int vtpci_alloc_msix(struct vtpci_softc *, int); +static int vtpci_alloc_msi(struct vtpci_softc *); +static int vtpci_alloc_intr_msix_pervq(struct vtpci_softc *); +static int vtpci_alloc_intr_msix_shared(struct vtpci_softc *); +static int vtpci_alloc_intr_msi(struct vtpci_softc *); +static int vtpci_alloc_intr_legacy(struct vtpci_softc *); +static int vtpci_alloc_intr_resources(struct vtpci_softc *); + +static int vtpci_setup_legacy_interrupt(struct vtpci_softc *, + enum intr_type); +static int vtpci_setup_msix_interrupts(struct vtpci_softc *, + enum intr_type); +static int vtpci_setup_interrupts(struct vtpci_softc *, enum intr_type); + static int vtpci_register_msix_vector(struct vtpci_softc *, int, int); +static int vtpci_set_host_msix_vectors(struct vtpci_softc *); +static int vtpci_reinit_virtqueue(struct vtpci_softc *, int); static void vtpci_free_interrupts(struct vtpci_softc *); static void vtpci_free_virtqueues(struct vtpci_softc *); +static void vtpci_cleanup_setup_intr_attempt(struct vtpci_softc *); static void vtpci_release_child_resources(struct vtpci_softc *); static void vtpci_reset(struct vtpci_softc *); +static void vtpci_select_virtqueue(struct vtpci_softc *, int); + static int vtpci_legacy_intr(void *); static int vtpci_vq_shared_intr(void *); static int vtpci_vq_intr(void *); static int vtpci_config_intr(void *); +#define vtpci_setup_msi_interrupt vtpci_setup_legacy_interrupt + /* * I/O port read/write wrappers. */ @@ -252,7 +271,7 @@ vtpci_attach(device_t dev) } if (pci_find_cap(dev, PCIY_MSI, NULL) != 0) - sc->vtpci_flags |= VIRTIO_PCI_FLAG_NO_MSI; + sc->vtpci_flags |= VTPCI_FLAG_NO_MSI; if (pci_find_cap(dev, PCIY_MSIX, NULL) == 0) { rid = PCIR_BAR(1); @@ -261,7 +280,7 @@ vtpci_attach(device_t dev) } if (sc->vtpci_msix_res == NULL) - sc->vtpci_flags |= VIRTIO_PCI_FLAG_NO_MSIX; + sc->vtpci_flags |= VTPCI_FLAG_NO_MSIX; vtpci_reset(sc); @@ -372,6 +391,16 @@ vtpci_read_ivar(device_t dev, device_t child, int index, uintptr_t *result) switch (index) { case VIRTIO_IVAR_DEVTYPE: + case VIRTIO_IVAR_SUBDEVICE: + *result = pci_get_subdevice(dev); + break; + case VIRTIO_IVAR_VENDOR: + *result = pci_get_vendor(dev); + break; + case VIRTIO_IVAR_DEVICE: + *result = pci_get_device(dev); + break; + case VIRTIO_IVAR_SUBVENDOR: *result = pci_get_subdevice(dev); break; default: @@ -442,102 +471,97 @@ vtpci_alloc_virtqueues(device_t dev, int flags, int nvqs, struct vq_alloc_info *vq_info) { struct vtpci_softc *sc; + struct virtqueue *vq; struct vtpci_virtqueue *vqx; struct vq_alloc_info *info; - int queue, error; - uint16_t vq_size; + int idx, error; + uint16_t size; sc = device_get_softc(dev); + error = 0; - if (sc->vtpci_nvqs != 0 || nvqs <= 0 || - nvqs > VIRTIO_MAX_VIRTQUEUES) + if (sc->vtpci_nvqs != 0) + return (EALREADY); + if (nvqs <= 0 || nvqs > VIRTIO_MAX_VIRTQUEUES) return (EINVAL); - error = vtpci_alloc_interrupts(sc, flags, nvqs, vq_info); - if (error) { - device_printf(dev, "cannot allocate interrupts\n"); - return (error); - } + if (flags & VIRTIO_ALLOC_VQS_DISABLE_MSIX) + sc->vtpci_flags |= VTPCI_FLAG_NO_MSIX; - if (sc->vtpci_flags & VIRTIO_PCI_FLAG_MSIX) { - error = vtpci_register_msix_vector(sc, - VIRTIO_MSI_CONFIG_VECTOR, 0); - if (error) - return (error); - } + for (idx = 0; idx < nvqs; idx++) { + vqx = &sc->vtpci_vqx[idx]; + info = &vq_info[idx]; - for (queue = 0; queue < nvqs; queue++) { - vqx = &sc->vtpci_vqx[queue]; - info = &vq_info[queue]; + vtpci_select_virtqueue(sc, idx); + size = vtpci_read_config_2(sc, VIRTIO_PCI_QUEUE_NUM); - vtpci_write_config_2(sc, VIRTIO_PCI_QUEUE_SEL, queue); - - vq_size = vtpci_read_config_2(sc, VIRTIO_PCI_QUEUE_NUM); - error = virtqueue_alloc(dev, queue, vq_size, - VIRTIO_PCI_VRING_ALIGN, 0xFFFFFFFFUL, info, &vqx->vq); - if (error) - return (error); - - if (sc->vtpci_flags & VIRTIO_PCI_FLAG_MSIX) { - error = vtpci_register_msix_vector(sc, - VIRTIO_MSI_QUEUE_VECTOR, vqx->ires_idx); - if (error) - return (error); + error = virtqueue_alloc(dev, idx, size, VIRTIO_PCI_VRING_ALIGN, + 0xFFFFFFFFUL, info, &vq); + if (error) { + device_printf(dev, + "cannot allocate virtqueue %d: %d\n", idx, error); + break; } vtpci_write_config_4(sc, VIRTIO_PCI_QUEUE_PFN, - virtqueue_paddr(vqx->vq) >> VIRTIO_PCI_QUEUE_ADDR_SHIFT); + virtqueue_paddr(vq) >> VIRTIO_PCI_QUEUE_ADDR_SHIFT); + + vqx->vq = *info->vqai_vq = vq; + vqx->no_intr = info->vqai_intr == NULL; - *info->vqai_vq = vqx->vq; sc->vtpci_nvqs++; } - return (0); + return (error); } static int vtpci_setup_intr(device_t dev, enum intr_type type) { struct vtpci_softc *sc; - struct vtpci_intr_resource *ires; - struct vtpci_virtqueue *vqx; - int i, flags, error; + int attempt, error; sc = device_get_softc(dev); - flags = type | INTR_MPSAFE; - ires = &sc->vtpci_intr_res[0]; - if ((sc->vtpci_flags & VIRTIO_PCI_FLAG_MSIX) == 0) { - error = bus_setup_intr(dev, ires->irq, flags, - vtpci_legacy_intr, NULL, sc, &ires->intrhand); + for (attempt = 0; attempt < 5; attempt++) { + /* + * Start with the most desirable interrupt configuration and + * fallback towards less desirable ones. + */ + switch (attempt) { + case 0: + error = vtpci_alloc_intr_msix_pervq(sc); + break; + case 1: + error = vtpci_alloc_intr_msix_shared(sc); + break; + case 2: + error = vtpci_alloc_intr_msi(sc); + break; + case 3: + error = vtpci_alloc_intr_legacy(sc); + break; + default: + device_printf(dev, + "exhausted all interrupt allocation attempts\n"); + return (ENXIO); + } - return (error); + if (error == 0 && vtpci_setup_interrupts(sc, type) == 0) + break; + + vtpci_cleanup_setup_intr_attempt(sc); } - error = bus_setup_intr(dev, ires->irq, flags, vtpci_config_intr, - NULL, sc, &ires->intrhand); - if (error) - return (error); - - if (sc->vtpci_flags & VIRTIO_PCI_FLAG_SHARED_MSIX) { - ires = &sc->vtpci_intr_res[1]; - error = bus_setup_intr(dev, ires->irq, flags, - vtpci_vq_shared_intr, NULL, sc, &ires->intrhand); - - return (error); - } - - /* Setup an interrupt handler for each virtqueue. */ - for (i = 0; i < sc->vtpci_nvqs; i++) { - vqx = &sc->vtpci_vqx[i]; - if (vqx->ires_idx < 1) - continue; - - ires = &sc->vtpci_intr_res[vqx->ires_idx]; - error = bus_setup_intr(dev, ires->irq, flags, - vtpci_vq_intr, NULL, vqx->vq, &ires->intrhand); - if (error) - return (error); + if (bootverbose) { + if (sc->vtpci_flags & VTPCI_FLAG_LEGACY) + device_printf(dev, "using legacy interrupt\n"); + else if (sc->vtpci_flags & VTPCI_FLAG_MSI) + device_printf(dev, "using MSI interrupt\n"); + else if (sc->vtpci_flags & VTPCI_FLAG_SHARED_MSIX) + device_printf(dev, "using shared MSIX interrupts\n"); + else + device_printf(dev, "using per VQ MSIX interrupts\n"); } return (0); @@ -554,20 +578,19 @@ static int vtpci_reinit(device_t dev, uint64_t features) { struct vtpci_softc *sc; - struct vtpci_virtqueue *vqx; - struct virtqueue *vq; - int queue, error; - uint16_t vq_size; + int idx, error; sc = device_get_softc(dev); /* - * Redrive the device initialization. This is a bit of an abuse - * of the specification, but both VirtualBox and QEMU/KVM seem - * to play nice. We do not allow the host device to change from - * what was originally negotiated beyond what the guest driver - * changed (MSIX state should not change, number of virtqueues - * and their size remain the same, etc). + * Redrive the device initialization. This is a bit of an abuse of + * the specification, but VirtualBox, QEMU/KVM, and BHyVe seem to + * play nice. + * + * We do not allow the host device to change from what was originally + * negotiated beyond what the guest driver changed. MSIX state should + * not change, number of virtqueues and their size remain the same, etc. + * This will need to be rethought when we want to support migration. */ if (vtpci_get_status(dev) != VIRTIO_CONFIG_STATUS_RESET) @@ -582,34 +605,16 @@ vtpci_reinit(device_t dev, uint64_t features) vtpci_negotiate_features(dev, features); - if (sc->vtpci_flags & VIRTIO_PCI_FLAG_MSIX) { - error = vtpci_register_msix_vector(sc, - VIRTIO_MSI_CONFIG_VECTOR, 0); + for (idx = 0; idx < sc->vtpci_nvqs; idx++) { + error = vtpci_reinit_virtqueue(sc, idx); if (error) return (error); } - for (queue = 0; queue < sc->vtpci_nvqs; queue++) { - vqx = &sc->vtpci_vqx[queue]; - vq = vqx->vq; - - KASSERT(vq != NULL, ("vq %d not allocated", queue)); - vtpci_write_config_2(sc, VIRTIO_PCI_QUEUE_SEL, queue); - - vq_size = vtpci_read_config_2(sc, VIRTIO_PCI_QUEUE_NUM); - error = virtqueue_reinit(vq, vq_size); + if (sc->vtpci_flags & VTPCI_FLAG_MSIX) { + error = vtpci_set_host_msix_vectors(sc); if (error) return (error); - - if (sc->vtpci_flags & VIRTIO_PCI_FLAG_MSIX) { - error = vtpci_register_msix_vector(sc, - VIRTIO_MSI_QUEUE_VECTOR, vqx->ires_idx); - if (error) - return (error); - } - - vtpci_write_config_4(sc, VIRTIO_PCI_QUEUE_PFN, - virtqueue_paddr(vqx->vq) >> VIRTIO_PCI_QUEUE_ADDR_SHIFT); } return (0); @@ -744,7 +749,6 @@ vtpci_probe_and_attach_child(struct vtpci_softc *sc) vtpci_set_status(dev, VIRTIO_CONFIG_STATUS_FAILED); vtpci_reset(sc); vtpci_release_child_resources(sc); - /* Reset status for future attempt. */ vtpci_set_status(dev, VIRTIO_CONFIG_STATUS_ACK); } else @@ -752,42 +756,126 @@ vtpci_probe_and_attach_child(struct vtpci_softc *sc) } static int -vtpci_alloc_interrupts(struct vtpci_softc *sc, int flags, int nvqs, - struct vq_alloc_info *vq_info) +vtpci_alloc_msix(struct vtpci_softc *sc, int nvectors) { - int i, nvectors, error; + device_t dev; + int nmsix, cnt, required; - /* - * Only allocate a vector for virtqueues that are actually - * expecting an interrupt. - */ - for (nvectors = 0, i = 0; i < nvqs; i++) - if (vq_info[i].vqai_intr != NULL) - nvectors++; + dev = sc->vtpci_dev; - if (vtpci_disable_msix != 0 || - sc->vtpci_flags & VIRTIO_PCI_FLAG_NO_MSIX || - flags & VIRTIO_ALLOC_VQS_DISABLE_MSIX || - vtpci_alloc_msix(sc, nvectors) != 0) { - /* - * Use MSI interrupts if available. Otherwise, we fallback - * to legacy interrupts. - */ - if ((sc->vtpci_flags & VIRTIO_PCI_FLAG_NO_MSI) == 0 && - vtpci_alloc_msi(sc) == 0) - sc->vtpci_flags |= VIRTIO_PCI_FLAG_MSI; + /* Allocate an additional vector for the config changes. */ + required = nvectors + 1; - sc->vtpci_nintr_res = 1; + nmsix = pci_msix_count(dev); + if (nmsix < required) + return (1); + + cnt = required; + if (pci_alloc_msix(dev, &cnt) == 0 && cnt >= required) { + sc->vtpci_nintr_res = required; + return (0); } - error = vtpci_alloc_intr_resources(sc, nvqs, vq_info); + pci_release_msi(dev); - return (error); + return (1); } static int -vtpci_alloc_intr_resources(struct vtpci_softc *sc, int nvqs, - struct vq_alloc_info *vq_info) +vtpci_alloc_msi(struct vtpci_softc *sc) +{ + device_t dev; + int nmsi, cnt, required; + + dev = sc->vtpci_dev; + required = 1; + + nmsi = pci_msi_count(dev); + if (nmsi < required) + return (1); + + cnt = required; + if (pci_alloc_msi(dev, &cnt) == 0 && cnt >= required) { + sc->vtpci_nintr_res = required; + return (0); + } + + pci_release_msi(dev); + + return (1); +} + +static int +vtpci_alloc_intr_msix_pervq(struct vtpci_softc *sc) +{ + int i, nvectors, error; + + if (vtpci_disable_msix != 0 || + sc->vtpci_flags & VTPCI_FLAG_NO_MSIX) + return (ENOTSUP); + + for (nvectors = 0, i = 0; i < sc->vtpci_nvqs; i++) { + if (sc->vtpci_vqx[i].no_intr == 0) + nvectors++; + } + + error = vtpci_alloc_msix(sc, nvectors); + if (error) + return (error); + + sc->vtpci_flags |= VTPCI_FLAG_MSIX; + + return (0); +} + +static int +vtpci_alloc_intr_msix_shared(struct vtpci_softc *sc) +{ + int error; + + if (vtpci_disable_msix != 0 || + sc->vtpci_flags & VTPCI_FLAG_NO_MSIX) + return (ENOTSUP); + + error = vtpci_alloc_msix(sc, 1); + if (error) + return (error); + + sc->vtpci_flags |= VTPCI_FLAG_MSIX | VTPCI_FLAG_SHARED_MSIX; + + return (0); +} + +static int +vtpci_alloc_intr_msi(struct vtpci_softc *sc) +{ + int error; + + /* Only BHyVe supports MSI. */ + if (sc->vtpci_flags & VTPCI_FLAG_NO_MSI) + return (ENOTSUP); + + error = vtpci_alloc_msi(sc); + if (error) + return (error); + + sc->vtpci_flags |= VTPCI_FLAG_MSI; + + return (0); +} + +static int +vtpci_alloc_intr_legacy(struct vtpci_softc *sc) +{ + + sc->vtpci_flags |= VTPCI_FLAG_LEGACY; + sc->vtpci_nintr_res = 1; + + return (0); +} + +static int +vtpci_alloc_intr_resources(struct vtpci_softc *sc) { device_t dev; struct resource *irq; @@ -795,14 +883,14 @@ vtpci_alloc_intr_resources(struct vtpci_softc *sc, int nvqs, int i, rid, flags, res_idx; dev = sc->vtpci_dev; - flags = RF_ACTIVE; - if ((sc->vtpci_flags & - (VIRTIO_PCI_FLAG_MSI | VIRTIO_PCI_FLAG_MSIX)) == 0) { + if (sc->vtpci_flags & VTPCI_FLAG_LEGACY) { rid = 0; - flags |= RF_SHAREABLE; - } else + flags = RF_ACTIVE | RF_SHAREABLE; + } else { rid = 1; + flags = RF_ACTIVE; + } for (i = 0; i < sc->vtpci_nintr_res; i++) { irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, flags); @@ -814,16 +902,16 @@ vtpci_alloc_intr_resources(struct vtpci_softc *sc, int nvqs, } /* - * Map the virtqueue into the correct index in vq_intr_res[]. Note the - * first index is reserved for configuration changes notifications. + * Map the virtqueue into the correct index in vq_intr_res[]. The + * first index is reserved for configuration changed notifications. */ - for (i = 0, res_idx = 1; i < nvqs; i++) { + for (i = 0, res_idx = 1; i < sc->vtpci_nvqs; i++) { vqx = &sc->vtpci_vqx[i]; - if (sc->vtpci_flags & VIRTIO_PCI_FLAG_MSIX) { - if (vq_info[i].vqai_intr == NULL) + if (sc->vtpci_flags & VTPCI_FLAG_MSIX) { + if (vqx->no_intr != 0) vqx->ires_idx = -1; - else if (sc->vtpci_flags & VIRTIO_PCI_FLAG_SHARED_MSIX) + else if (sc->vtpci_flags & VTPCI_FLAG_SHARED_MSIX) vqx->ires_idx = res_idx; else vqx->ires_idx = res_idx++; @@ -835,110 +923,180 @@ vtpci_alloc_intr_resources(struct vtpci_softc *sc, int nvqs, } static int -vtpci_alloc_msi(struct vtpci_softc *sc) +vtpci_setup_legacy_interrupt(struct vtpci_softc *sc, enum intr_type type) { device_t dev; - int nmsi, cnt; + struct vtpci_intr_resource *ires; + int error; dev = sc->vtpci_dev; - nmsi = pci_msi_count(dev); - if (nmsi < 1) - return (1); + ires = &sc->vtpci_intr_res[0]; + error = bus_setup_intr(dev, ires->irq, type, vtpci_legacy_intr, NULL, + sc, &ires->intrhand); - cnt = 1; - if (pci_alloc_msi(dev, &cnt) == 0 && cnt == 1) - return (0); - - return (1); + return (error); } static int -vtpci_alloc_msix(struct vtpci_softc *sc, int nvectors) +vtpci_setup_msix_interrupts(struct vtpci_softc *sc, enum intr_type type) { device_t dev; - int nmsix, cnt, required; + struct vtpci_intr_resource *ires; + struct vtpci_virtqueue *vqx; + int i, error; dev = sc->vtpci_dev; - nmsix = pci_msix_count(dev); - if (nmsix < 1) - return (1); + /* + * The first resource is used for configuration changed interrupts. + */ + ires = &sc->vtpci_intr_res[0]; + error = bus_setup_intr(dev, ires->irq, type, vtpci_config_intr, + NULL, sc, &ires->intrhand); + if (error) + return (error); - /* An additional vector is needed for the config changes. */ - required = nvectors + 1; - if (nmsix >= required) { - cnt = required; - if (pci_alloc_msix(dev, &cnt) == 0 && cnt >= required) - goto out; + if (sc->vtpci_flags & VTPCI_FLAG_SHARED_MSIX) { + ires = &sc->vtpci_intr_res[1]; - pci_release_msi(dev); - } + error = bus_setup_intr(dev, ires->irq, type, + vtpci_vq_shared_intr, NULL, sc, &ires->intrhand); + if (error) + return (error); + } else { + /* + * Each remaining resource is assigned to a specific virtqueue. + */ + for (i = 0; i < sc->vtpci_nvqs; i++) { + vqx = &sc->vtpci_vqx[i]; + if (vqx->ires_idx < 1) + continue; - /* Attempt shared MSIX configuration. */ - required = 2; - if (nmsix >= required) { - cnt = required; - if (pci_alloc_msix(dev, &cnt) == 0 && cnt >= required) { - sc->vtpci_flags |= VIRTIO_PCI_FLAG_SHARED_MSIX; - goto out; + ires = &sc->vtpci_intr_res[vqx->ires_idx]; + error = bus_setup_intr(dev, ires->irq, type, + vtpci_vq_intr, NULL, vqx->vq, &ires->intrhand); + if (error) + return (error); } - - pci_release_msi(dev); } - return (1); - -out: - sc->vtpci_nintr_res = required; - sc->vtpci_flags |= VIRTIO_PCI_FLAG_MSIX; - - if (bootverbose) { - if (sc->vtpci_flags & VIRTIO_PCI_FLAG_SHARED_MSIX) - device_printf(dev, "using shared virtqueue MSIX\n"); - else - device_printf(dev, "using per virtqueue MSIX\n"); - } + error = vtpci_set_host_msix_vectors(sc); + if (error) + return (error); return (0); } +static int +vtpci_setup_interrupts(struct vtpci_softc *sc, enum intr_type type) +{ + int error; + + type |= INTR_MPSAFE; + KASSERT(sc->vtpci_flags & VTPCI_FLAG_ITYPE_MASK, + ("no interrupt type selected: %#x", sc->vtpci_flags)); + + error = vtpci_alloc_intr_resources(sc); + if (error) + return (error); + + if (sc->vtpci_flags & VTPCI_FLAG_LEGACY) + error = vtpci_setup_legacy_interrupt(sc, type); + else if (sc->vtpci_flags & VTPCI_FLAG_MSI) + error = vtpci_setup_msi_interrupt(sc, type); + else + error = vtpci_setup_msix_interrupts(sc, type); + + return (error); +} + static int vtpci_register_msix_vector(struct vtpci_softc *sc, int offset, int res_idx) { device_t dev; - uint16_t vector; + uint16_t vector, rdvector; dev = sc->vtpci_dev; - if (offset != VIRTIO_MSI_CONFIG_VECTOR && - offset != VIRTIO_MSI_QUEUE_VECTOR) - return (EINVAL); - if (res_idx != -1) { - /* Map from rid to host vector. */ + /* Map from guest rid to host vector. */ vector = sc->vtpci_intr_res[res_idx].rid - 1; } else vector = VIRTIO_MSI_NO_VECTOR; - /* The first resource is special; make sure it is used correctly. */ + /* + * Assert the first resource is always used for the configuration + * changed interrupts. + */ if (res_idx == 0) { - KASSERT(vector == 0, ("unexpected config vector")); - KASSERT(offset == VIRTIO_MSI_CONFIG_VECTOR, - ("unexpected config offset")); - } + KASSERT(vector == 0 && offset == VIRTIO_MSI_CONFIG_VECTOR, + ("bad first res use vector:%d offset:%d", vector, offset)); + } else + KASSERT(offset == VIRTIO_MSI_QUEUE_VECTOR, ("bad offset")); vtpci_write_config_2(sc, offset, vector); - if (vtpci_read_config_2(sc, offset) != vector) { - device_printf(dev, "insufficient host resources for " - "MSIX interrupts\n"); + /* Read vector to determine if the host had sufficient resources. */ + rdvector = vtpci_read_config_2(sc, offset); + if (rdvector != vector) { + device_printf(dev, + "insufficient host resources for MSIX interrupts\n"); return (ENODEV); } return (0); } +static int +vtpci_set_host_msix_vectors(struct vtpci_softc *sc) +{ + struct vtpci_virtqueue *vqx; + int idx, error; + + error = vtpci_register_msix_vector(sc, VIRTIO_MSI_CONFIG_VECTOR, 0); + if (error) + return (error); + + for (idx = 0; idx < sc->vtpci_nvqs; idx++) { + vqx = &sc->vtpci_vqx[idx]; + + vtpci_select_virtqueue(sc, idx); + error = vtpci_register_msix_vector(sc, VIRTIO_MSI_QUEUE_VECTOR, + vqx->ires_idx); + if (error) + return (error); + } + + return (0); +} + +static int +vtpci_reinit_virtqueue(struct vtpci_softc *sc, int idx) +{ + struct vtpci_virtqueue *vqx; + struct virtqueue *vq; + int error; + uint16_t size; + + vqx = &sc->vtpci_vqx[idx]; + vq = vqx->vq; + + KASSERT(vq != NULL, ("vq %d not allocated", idx)); + + vtpci_select_virtqueue(sc, idx); + size = vtpci_read_config_2(sc, VIRTIO_PCI_QUEUE_NUM); + + error = virtqueue_reinit(vq, size); + if (error) + return (error); + + vtpci_write_config_4(sc, VIRTIO_PCI_QUEUE_PFN, + virtqueue_paddr(vq) >> VIRTIO_PCI_QUEUE_ADDR_SHIFT); + + return (0); +} + static void vtpci_free_interrupts(struct vtpci_softc *sc) { @@ -947,15 +1105,8 @@ vtpci_free_interrupts(struct vtpci_softc *sc) int i; dev = sc->vtpci_dev; - sc->vtpci_nintr_res = 0; - if (sc->vtpci_flags & (VIRTIO_PCI_FLAG_MSI | VIRTIO_PCI_FLAG_MSIX)) { - pci_release_msi(dev); - sc->vtpci_flags &= ~(VIRTIO_PCI_FLAG_MSI | - VIRTIO_PCI_FLAG_MSIX | VIRTIO_PCI_FLAG_SHARED_MSIX); - } - - for (i = 0; i < 1 + VIRTIO_MAX_VIRTQUEUES; i++) { + for (i = 0; i < sc->vtpci_nintr_res; i++) { ires = &sc->vtpci_intr_res[i]; if (ires->intrhand != NULL) { @@ -971,6 +1122,12 @@ vtpci_free_interrupts(struct vtpci_softc *sc) ires->rid = -1; } + + if (sc->vtpci_flags & (VTPCI_FLAG_MSI | VTPCI_FLAG_MSIX)) + pci_release_msi(dev); + + sc->vtpci_nintr_res = 0; + sc->vtpci_flags &= ~VTPCI_FLAG_ITYPE_MASK; } static void @@ -979,16 +1136,33 @@ vtpci_free_virtqueues(struct vtpci_softc *sc) struct vtpci_virtqueue *vqx; int i; - sc->vtpci_nvqs = 0; - - for (i = 0; i < VIRTIO_MAX_VIRTQUEUES; i++) { + for (i = 0; i < sc->vtpci_nvqs; i++) { vqx = &sc->vtpci_vqx[i]; - if (vqx->vq != NULL) { - virtqueue_free(vqx->vq); - vqx->vq = NULL; + virtqueue_free(vqx->vq); + vqx->vq = NULL; + } + + sc->vtpci_nvqs = 0; +} + +static void +vtpci_cleanup_setup_intr_attempt(struct vtpci_softc *sc) +{ + int idx; + + if (sc->vtpci_flags & VTPCI_FLAG_MSIX) { + vtpci_write_config_2(sc, VIRTIO_MSI_CONFIG_VECTOR, + VIRTIO_MSI_NO_VECTOR); + + for (idx = 0; idx < sc->vtpci_nvqs; idx++) { + vtpci_select_virtqueue(sc, idx); + vtpci_write_config_2(sc, VIRTIO_MSI_QUEUE_VECTOR, + VIRTIO_MSI_NO_VECTOR); } } + + vtpci_free_interrupts(sc); } static void @@ -1010,6 +1184,13 @@ vtpci_reset(struct vtpci_softc *sc) vtpci_set_status(sc->vtpci_dev, VIRTIO_CONFIG_STATUS_RESET); } +static void +vtpci_select_virtqueue(struct vtpci_softc *sc, int idx) +{ + + vtpci_write_config_2(sc, VIRTIO_PCI_QUEUE_SEL, idx); +} + static int vtpci_legacy_intr(void *xsc) { diff --git a/sys/dev/virtio/pci/virtio_pci.h b/sys/dev/virtio/pci/virtio_pci.h index d8daa31e2d1..485cf4ff5b1 100644 --- a/sys/dev/virtio/pci/virtio_pci.h +++ b/sys/dev/virtio/pci/virtio_pci.h @@ -73,7 +73,7 @@ * configuration space. */ #define VIRTIO_PCI_CONFIG(sc) \ - (((sc)->vtpci_flags & VIRTIO_PCI_FLAG_MSIX) ? 24 : 20) + (((sc)->vtpci_flags & VTPCI_FLAG_MSIX) ? 24 : 20) /* * How many bits to shift physical queue address written to QUEUE_PFN. diff --git a/sys/dev/virtio/virtio.c b/sys/dev/virtio/virtio.c index e3855754244..1cac3c7d15a 100644 --- a/sys/dev/virtio/virtio.c +++ b/sys/dev/virtio/virtio.c @@ -86,28 +86,6 @@ virtio_device_name(uint16_t devid) return (NULL); } -int -virtio_get_device_type(device_t dev) -{ - uintptr_t devtype; - - devtype = -1; - - BUS_READ_IVAR(device_get_parent(dev), dev, - VIRTIO_IVAR_DEVTYPE, &devtype); - - return ((int) devtype); -} - -void -virtio_set_feature_desc(device_t dev, - struct virtio_feature_desc *feature_desc) -{ - - BUS_WRITE_IVAR(device_get_parent(dev), dev, - VIRTIO_IVAR_FEATURE_DESC, (uintptr_t) feature_desc); -} - void virtio_describe(device_t dev, const char *msg, uint64_t features, struct virtio_feature_desc *feature_desc) @@ -184,6 +162,21 @@ virtio_feature_name(uint64_t val, struct virtio_feature_desc *feature_desc) * VirtIO bus method wrappers. */ +void +virtio_read_ivar(device_t dev, int ivar, uintptr_t *val) +{ + + *val = -1; + BUS_READ_IVAR(device_get_parent(dev), dev, ivar, val); +} + +void +virtio_write_ivar(device_t dev, int ivar, uintptr_t val) +{ + + BUS_WRITE_IVAR(device_get_parent(dev), dev, ivar, val); +} + uint64_t virtio_negotiate_features(device_t dev, uint64_t child_features) { diff --git a/sys/dev/virtio/virtio.h b/sys/dev/virtio/virtio.h index 00d2d5fd782..8c22b12e7c9 100644 --- a/sys/dev/virtio/virtio.h +++ b/sys/dev/virtio/virtio.h @@ -31,8 +31,6 @@ #ifndef _VIRTIO_H_ #define _VIRTIO_H_ -#include - struct vq_alloc_info; /* VirtIO device IDs. */ @@ -93,6 +91,10 @@ struct vq_alloc_info; */ #define VIRTIO_IVAR_DEVTYPE 1 #define VIRTIO_IVAR_FEATURE_DESC 2 +#define VIRTIO_IVAR_VENDOR 3 +#define VIRTIO_IVAR_DEVICE 4 +#define VIRTIO_IVAR_SUBVENDOR 5 +#define VIRTIO_IVAR_SUBDEVICE 6 struct virtio_feature_desc { uint64_t vfd_val; @@ -100,15 +102,14 @@ struct virtio_feature_desc { }; const char *virtio_device_name(uint16_t devid); -int virtio_get_device_type(device_t dev); -void virtio_set_feature_desc(device_t dev, - struct virtio_feature_desc *feature_desc); void virtio_describe(device_t dev, const char *msg, uint64_t features, struct virtio_feature_desc *feature_desc); /* * VirtIO Bus Methods. */ +void virtio_read_ivar(device_t dev, int ivar, uintptr_t *val); +void virtio_write_ivar(device_t dev, int ivar, uintptr_t val); uint64_t virtio_negotiate_features(device_t dev, uint64_t child_features); int virtio_alloc_virtqueues(device_t dev, int flags, int nvqs, struct vq_alloc_info *info); @@ -150,4 +151,28 @@ VIRTIO_RDWR_DEVICE_CONFIG(1, uint8_t); VIRTIO_RDWR_DEVICE_CONFIG(2, uint16_t); VIRTIO_RDWR_DEVICE_CONFIG(4, uint32_t); +#define VIRTIO_READ_IVAR(name, ivar) \ +static inline int \ +__CONCAT(virtio_get_,name)(device_t dev) \ +{ \ + uintptr_t val; \ + virtio_read_ivar(dev, ivar, &val); \ + return ((int) val); \ +} + +VIRTIO_READ_IVAR(device_type, VIRTIO_IVAR_DEVTYPE); +VIRTIO_READ_IVAR(vendor, VIRTIO_IVAR_VENDOR); +VIRTIO_READ_IVAR(device, VIRTIO_IVAR_DEVICE); +VIRTIO_READ_IVAR(subvendor, VIRTIO_IVAR_SUBVENDOR); +VIRTIO_READ_IVAR(subdevice, VIRTIO_IVAR_SUBDEVICE); + +#define VIRTIO_WRITE_IVAR(name, ivar) \ +static inline void \ +__CONCAT(virtio_set_,name)(device_t dev, void *val) \ +{ \ + virtio_write_ivar(dev, ivar, (uintptr_t) val); \ +} + +VIRTIO_WRITE_IVAR(feature_desc, VIRTIO_IVAR_FEATURE_DESC); + #endif /* _VIRTIO_H_ */ diff --git a/sys/dev/virtio/virtio_ring.h b/sys/dev/virtio/virtio_ring.h index 52580856a86..8e902ab59c2 100644 --- a/sys/dev/virtio/virtio_ring.h +++ b/sys/dev/virtio/virtio_ring.h @@ -33,8 +33,6 @@ #ifndef VIRTIO_RING_H #define VIRTIO_RING_H -#include - /* This marks a buffer as continuing via the next field. */ #define VRING_DESC_F_NEXT 1 /* This marks a buffer as write-only (otherwise read-only). */ @@ -122,8 +120,8 @@ struct vring { * We publish the used event index at the end of the available ring, and vice * versa. They are at the end for backwards compatibility. */ -#define vring_used_event(vr) ((vr)->avail->ring[(vr)->num]) -#define vring_avail_event(vr) (*(uint16_t *)&(vr)->used->ring[(vr)->num]) +#define vring_used_event(vr) ((vr)->avail->ring[(vr)->num]) +#define vring_avail_event(vr) (*(uint16_t *)&(vr)->used->ring[(vr)->num]) static inline int vring_size(unsigned int num, unsigned long align) @@ -131,10 +129,11 @@ vring_size(unsigned int num, unsigned long align) int size; size = num * sizeof(struct vring_desc); - size += sizeof(struct vring_avail) + (num * sizeof(uint16_t)); + size += sizeof(struct vring_avail) + (num * sizeof(uint16_t)) + + sizeof(uint16_t); size = (size + align - 1) & ~(align - 1); size += sizeof(struct vring_used) + - (num * sizeof(struct vring_used_elem)); + (num * sizeof(struct vring_used_elem)) + sizeof(uint16_t); return (size); } diff --git a/sys/dev/virtio/virtqueue.c b/sys/dev/virtio/virtqueue.c index 31f47d0380d..83d39ba2ed9 100644 --- a/sys/dev/virtio/virtqueue.c +++ b/sys/dev/virtio/virtqueue.c @@ -127,6 +127,7 @@ static uint16_t vq_ring_enqueue_segments(struct virtqueue *, static int vq_ring_use_indirect(struct virtqueue *, int); static void vq_ring_enqueue_indirect(struct virtqueue *, void *, struct sglist *, int, int); +static int vq_ring_enable_interrupt(struct virtqueue *, uint16_t); static int vq_ring_must_notify_host(struct virtqueue *); static void vq_ring_notify_host(struct virtqueue *); static void vq_ring_free_chain(struct virtqueue *, uint16_t); @@ -311,7 +312,7 @@ virtqueue_reinit(struct virtqueue *vq, uint16_t size) /* Warn if the virtqueue was not properly cleaned up. */ if (vq->vq_free_cnt != vq->vq_nentries) { device_printf(vq->vq_dev, - "%s: warning, '%s' virtqueue not empty, " + "%s: warning '%s' virtqueue not empty, " "leaking %d entries\n", __func__, vq->vq_name, vq->vq_nentries - vq->vq_free_cnt); } @@ -390,6 +391,7 @@ virtqueue_full(struct virtqueue *vq) void virtqueue_notify(struct virtqueue *vq) { + /* Ensure updated avail->idx is visible to host. */ mb(); @@ -428,58 +430,22 @@ int virtqueue_enable_intr(struct virtqueue *vq) { - /* - * Enable interrupts, making sure we get the latest - * index of what's already been consumed. - */ - vq->vq_ring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; - if (vq->vq_flags & VIRTQUEUE_FLAG_EVENT_IDX) - vring_used_event(&vq->vq_ring) = vq->vq_used_cons_idx; - else - vq->vq_ring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; - - mb(); - - /* - * Additional items may have been consumed in the time between - * since we last checked and enabled interrupts above. Let our - * caller know so it processes the new entries. - */ - if (vq->vq_used_cons_idx != vq->vq_ring.used->idx) - return (1); - - return (0); + return (vq_ring_enable_interrupt(vq, 0)); } int virtqueue_postpone_intr(struct virtqueue *vq) { - uint16_t ndesc; + uint16_t ndesc, avail_idx; /* - * Postpone until at least half of the available descriptors - * have been consumed. - * - * XXX Adaptive factor? (Linux uses 3/4) + * Request the next interrupt be postponed until at least half + * of the available descriptors have been consumed. */ - ndesc = (uint16_t)(vq->vq_ring.avail->idx - vq->vq_used_cons_idx) / 2; + avail_idx = vq->vq_ring.avail->idx; + ndesc = (uint16_t)(avail_idx - vq->vq_used_cons_idx) / 2; - if (vq->vq_flags & VIRTQUEUE_FLAG_EVENT_IDX) - vring_used_event(&vq->vq_ring) = vq->vq_used_cons_idx + ndesc; - else - vq->vq_ring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; - - mb(); - - /* - * Enough items may have already been consumed to meet our - * threshold since we last checked. Let our caller know so - * it processes the new entries. - */ - if (virtqueue_nused(vq) > ndesc) - return (1); - - return (0); + return (vq_ring_enable_interrupt(vq, ndesc)); } void @@ -751,6 +717,32 @@ vq_ring_enqueue_indirect(struct virtqueue *vq, void *cookie, vq_ring_update_avail(vq, head_idx); } +static int +vq_ring_enable_interrupt(struct virtqueue *vq, uint16_t ndesc) +{ + + /* + * Enable interrupts, making sure we get the latest index of + * what's already been consumed. + */ + if (vq->vq_flags & VIRTQUEUE_FLAG_EVENT_IDX) + vring_used_event(&vq->vq_ring) = vq->vq_used_cons_idx + ndesc; + else + vq->vq_ring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; + + mb(); + + /* + * Enough items may have already been consumed to meet our threshold + * since we last checked. Let our caller know so it processes the new + * entries. + */ + if (virtqueue_nused(vq) > ndesc) + return (1); + + return (0); +} + static int vq_ring_must_notify_host(struct virtqueue *vq) { @@ -788,8 +780,8 @@ vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx) VQ_RING_ASSERT_CHAIN_TERM(vq); vq->vq_free_cnt += dxp->ndescs; - dxp->ndescs--; +#ifdef INVARIANTS if ((dp->flags & VRING_DESC_F_INDIRECT) == 0) { while (dp->flags & VRING_DESC_F_NEXT) { VQ_RING_ASSERT_VALID_IDX(vq, dp->next); @@ -797,7 +789,10 @@ vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx) dxp->ndescs--; } } - VQASSERT(vq, dxp->ndescs == 0, "failed to free entire desc chain"); + VQASSERT(vq, dxp->ndescs == 1, + "failed to free entire desc chain, remaining: %d", dxp->ndescs); +#endif + dxp->ndescs = 0; /* * We must append the existing free chain, if any, to the end of diff --git a/sys/dev/virtio/virtqueue.h b/sys/dev/virtio/virtqueue.h index eab57b22a23..0296b8c2fba 100644 --- a/sys/dev/virtio/virtqueue.h +++ b/sys/dev/virtio/virtqueue.h @@ -29,19 +29,13 @@ #ifndef _VIRTIO_VIRTQUEUE_H #define _VIRTIO_VIRTQUEUE_H -#include - struct virtqueue; struct sglist; /* Support for indirect buffer descriptors. */ #define VIRTIO_RING_F_INDIRECT_DESC (1 << 28) -/* The guest publishes the used index for which it expects an interrupt - * at the end of the avail ring. Host should ignore the avail->flags field. - * The host publishes the avail index for which it expects a kick - * at the end of the used ring. Guest should ignore the used->flags field. - */ +/* Support to suppress interrupt until specific index is reached. */ #define VIRTIO_RING_F_EVENT_IDX (1 << 29) /* Device callback for a virtqueue interrupt. */ diff --git a/sys/dev/vr/if_vr.c b/sys/dev/vr/if_vr.c index 6d99216178a..787dda5698f 100644 --- a/sys/dev/vr/if_vr.c +++ b/sys/dev/vr/if_vr.c @@ -165,7 +165,8 @@ static void vr_txeof(struct vr_softc *); static void vr_tick(void *); static int vr_error(struct vr_softc *, uint16_t); static void vr_tx_underrun(struct vr_softc *); -static void vr_intr(void *); +static int vr_intr(void *); +static void vr_int_task(void *, int); static void vr_start(struct ifnet *); static void vr_start_locked(struct ifnet *); static int vr_encap(struct vr_softc *, struct mbuf **); @@ -658,6 +659,8 @@ vr_attach(device_t dev) ifp->if_snd.ifq_maxlen = VR_TX_RING_CNT - 1; IFQ_SET_READY(&ifp->if_snd); + TASK_INIT(&sc->vr_inttask, 0, vr_int_task, sc); + /* Configure Tx FIFO threshold. */ sc->vr_txthresh = VR_TXTHRESH_MIN; if (sc->vr_revid < REV_ID_VT6105_A0) { @@ -784,7 +787,7 @@ vr_attach(device_t dev) /* Hook interrupt last to avoid having to lock softc. */ error = bus_setup_intr(dev, sc->vr_irq, INTR_TYPE_NET | INTR_MPSAFE, - NULL, vr_intr, sc, &sc->vr_intrhand); + vr_intr, NULL, sc, &sc->vr_intrhand); if (error) { device_printf(dev, "couldn't set up irq\n"); @@ -826,6 +829,7 @@ vr_detach(device_t dev) vr_stop(sc); VR_UNLOCK(sc); callout_drain(&sc->vr_stat_callout); + taskqueue_drain(taskqueue_fast, &sc->vr_inttask); ether_ifdetach(ifp); } if (sc->vr_miibus) @@ -1653,8 +1657,28 @@ vr_tx_underrun(struct vr_softc *sc) vr_tx_start(sc); } -static void +static int vr_intr(void *arg) +{ + struct vr_softc *sc; + uint16_t status; + + sc = (struct vr_softc *)arg; + + status = CSR_READ_2(sc, VR_ISR); + if (status == 0 || status == 0xffff || (status & VR_INTRS) == 0) + return (FILTER_STRAY); + + /* Disable interrupts. */ + CSR_WRITE_2(sc, VR_IMR, 0x0000); + + taskqueue_enqueue_fast(taskqueue_fast, &sc->vr_inttask); + + return (FILTER_HANDLED); +} + +static void +vr_int_task(void *arg, int npending) { struct vr_softc *sc; struct ifnet *ifp; @@ -1668,9 +1692,6 @@ vr_intr(void *arg) goto done_locked; status = CSR_READ_2(sc, VR_ISR); - if (status == 0 || status == 0xffff || (status & VR_INTRS) == 0) - goto done_locked; - ifp = sc->vr_ifp; #ifdef DEVICE_POLLING if ((ifp->if_capenable & IFCAP_POLLING) != 0) @@ -1685,9 +1706,6 @@ vr_intr(void *arg) goto done_locked; } - /* Disable interrupts. */ - CSR_WRITE_2(sc, VR_IMR, 0x0000); - for (; (status & VR_INTRS) != 0;) { CSR_WRITE_2(sc, VR_ISR, status); if ((status & (VR_ISR_BUSERR | VR_ISR_LINKSTAT2 | @@ -1707,15 +1725,16 @@ vr_intr(void *arg) vr_rx_start(sc); } vr_txeof(sc); + + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + vr_start_locked(ifp); + status = CSR_READ_2(sc, VR_ISR); } /* Re-enable interrupts. */ CSR_WRITE_2(sc, VR_IMR, VR_INTRS); - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - vr_start_locked(ifp); - done_locked: VR_UNLOCK(sc); } diff --git a/sys/dev/vr/if_vrreg.h b/sys/dev/vr/if_vrreg.h index 2445babd7a7..3618c1bae93 100644 --- a/sys/dev/vr/if_vrreg.h +++ b/sys/dev/vr/if_vrreg.h @@ -738,6 +738,7 @@ struct vr_softc { #ifdef DEVICE_POLLING int rxcycles; #endif + struct task vr_inttask; }; #define VR_LOCK(_sc) mtx_lock(&(_sc)->vr_mtx) diff --git a/sys/dev/vxge/vxgehal/vxgehal-channel.h b/sys/dev/vxge/vxgehal/vxgehal-channel.h index bce3ad2d1f6..552b550e4d8 100644 --- a/sys/dev/vxge/vxgehal/vxgehal-channel.h +++ b/sys/dev/vxge/vxgehal/vxgehal-channel.h @@ -291,7 +291,7 @@ __hal_channel_dtr_restore(__hal_channel_t *channel, __hal_dtr_h dtrh) else dtr_index = channel->reserve_index - 1; - if ((channel->dtr_arr[dtr_index].dtr == dtrh)) { + if ((channel->dtr_arr[dtr_index].dtr = dtrh) != NULL) { channel->reserve_index = dtr_index; channel->dtr_arr[dtr_index].state = VXGE_HAL_CHANNEL_DTR_FREE; diff --git a/sys/dev/wbwd/wbwd.c b/sys/dev/wbwd/wbwd.c index f6bf5a2f2de..266f87e79fb 100644 --- a/sys/dev/wbwd/wbwd.c +++ b/sys/dev/wbwd/wbwd.c @@ -78,6 +78,7 @@ __FBSDID("$FreeBSD$"); #define WB_LDN8_CRF5 0xF5 #define WB_LDN8_CRF5_SCALE 0x08 /* 0: 1s, 1: 60s */ #define WB_LDN8_CRF5_KEYB_P20 0x04 /* 1: keyb P20 forces timeout */ +#define WB_LDN8_CRF5_KBRST 0x02 /* 1: timeout causes pin60 kbd reset */ /* CRF6: Watchdog Timeout (0 == off). Mapped to reg_timeout. */ #define WB_LDN8_CRF6 0xF6 @@ -180,6 +181,12 @@ struct winbond_vendor_device_id { .device_rev = 0x25, .descr = "Winbond 83627DHG IC ver. 5", }, + { + .vendor_id = 0x5ca3, + .device_id = 0xb0, + .device_rev = 0x73, + .descr = "Winbond 83627DHG-P", + }, }; /* @@ -637,8 +644,9 @@ wb_attach(device_t dev) * Disable all all interrupt reset sources (defaults). */ sc->reg_1 &= ~(WB_LDN8_CRF5_KEYB_P20); + sc->reg_1 |= WB_LDN8_CRF5_KBRST; write_efir_1(sc, WB_LDN8_CRF5); - write_efir_1(sc, sc->reg_1); + write_efdr_1(sc, sc->reg_1); sc->reg_2 &= ~WB_LDN8_CRF7_CLEAR_MASK; write_efir_1(sc, WB_LDN8_CRF7); diff --git a/sys/dev/wpi/if_wpi.c b/sys/dev/wpi/if_wpi.c index df6c99549ce..365e03e4d36 100644 --- a/sys/dev/wpi/if_wpi.c +++ b/sys/dev/wpi/if_wpi.c @@ -59,6 +59,8 @@ __FBSDID("$FreeBSD$"); * via the firmware. */ +#include "opt_wlan.h" + #include #include #include diff --git a/sys/dev/xen/balloon/balloon.c b/sys/dev/xen/balloon/balloon.c index f31c72ba9d4..d4f94ab9ee0 100644 --- a/sys/dev/xen/balloon/balloon.c +++ b/sys/dev/xen/balloon/balloon.c @@ -436,6 +436,9 @@ balloon_init_watcher(void *arg) { int err; + if (!is_running_on_xen()) + return; + err = xs_register_watch(&target_watch); if (err) printf("Failed to set balloon watcher\n"); diff --git a/sys/dev/xen/blkfront/blkfront.c b/sys/dev/xen/blkfront/blkfront.c index f36ffb12808..6e0c265d930 100644 --- a/sys/dev/xen/blkfront/blkfront.c +++ b/sys/dev/xen/blkfront/blkfront.c @@ -230,7 +230,7 @@ xlvbd_add(struct xb_softc *sc, blkif_sector_t sectors, sc->xb_disk->d_mediasize = sectors * sector_size; sc->xb_disk->d_maxsize = sc->max_request_size; sc->xb_disk->d_flags = 0; - disk_create(sc->xb_disk, DISK_VERSION_00); + disk_create(sc->xb_disk, DISK_VERSION); return error; } diff --git a/sys/dev/xl/if_xl.c b/sys/dev/xl/if_xl.c index 7a913f4d5c3..22591d0f0b3 100644 --- a/sys/dev/xl/if_xl.c +++ b/sys/dev/xl/if_xl.c @@ -327,8 +327,9 @@ static driver_t xl_driver = { static devclass_t xl_devclass; -DRIVER_MODULE(xl, pci, xl_driver, xl_devclass, 0, 0); -DRIVER_MODULE(miibus, xl, miibus_driver, miibus_devclass, 0, 0); +DRIVER_MODULE_ORDERED(xl, pci, xl_driver, xl_devclass, NULL, NULL, + SI_ORDER_ANY); +DRIVER_MODULE(miibus, xl, miibus_driver, miibus_devclass, NULL, NULL); static void xl_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error) diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index 4a58a4297a6..d3e6cf56075 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -1170,18 +1170,14 @@ devfs_read_f(struct file *fp, struct uio *uio, struct ucred *cred, int flags, st if (ioflag & O_DIRECT) ioflag |= IO_DIRECT; - if ((flags & FOF_OFFSET) == 0) - uio->uio_offset = fp->f_offset; - + foffset_lock_uio(fp, uio, flags | FOF_NOLOCK); error = dsw->d_read(dev, uio, ioflag); if (uio->uio_resid != resid || (error == 0 && resid != 0)) vfs_timestamp(&dev->si_atime); td->td_fpop = fpop; dev_relthread(dev, ref); - if ((flags & FOF_OFFSET) == 0) - fp->f_offset = uio->uio_offset; - fp->f_nextoff = uio->uio_offset; + foffset_unlock_uio(fp, uio, flags | FOF_NOLOCK | FOF_NEXTOFF); return (error); } @@ -1648,8 +1644,7 @@ devfs_write_f(struct file *fp, struct uio *uio, struct ucred *cred, int flags, s ioflag = fp->f_flag & (O_NONBLOCK | O_DIRECT | O_FSYNC); if (ioflag & O_DIRECT) ioflag |= IO_DIRECT; - if ((flags & FOF_OFFSET) == 0) - uio->uio_offset = fp->f_offset; + foffset_lock_uio(fp, uio, flags | FOF_NOLOCK); resid = uio->uio_resid; @@ -1661,9 +1656,7 @@ devfs_write_f(struct file *fp, struct uio *uio, struct ucred *cred, int flags, s td->td_fpop = fpop; dev_relthread(dev, ref); - if ((flags & FOF_OFFSET) == 0) - fp->f_offset = uio->uio_offset; - fp->f_nextoff = uio->uio_offset; + foffset_unlock_uio(fp, uio, flags | FOF_NOLOCK | FOF_NEXTOFF); return (error); } diff --git a/sys/fs/ext2fs/ext2_lookup.c b/sys/fs/ext2fs/ext2_lookup.c index 35ab63125f0..c279998fb3f 100644 --- a/sys/fs/ext2fs/ext2_lookup.c +++ b/sys/fs/ext2fs/ext2_lookup.c @@ -115,6 +115,8 @@ static u_char dt_to_ext2_ft[] = { static int ext2_dirbadentry(struct vnode *dp, struct ext2fs_direct_2 *de, int entryoffsetinblock); +static int ext2_lookup_ino(struct vnode *vdp, struct vnode **vpp, + struct componentname *cnp, ino_t *dd_ino); /* * Vnode op for reading directories. @@ -285,7 +287,14 @@ ext2_lookup(ap) struct componentname *a_cnp; } */ *ap; { - struct vnode *vdp; /* vnode for directory being searched */ + + return (ext2_lookup_ino(ap->a_dvp, ap->a_vpp, ap->a_cnp, NULL)); +} + +static int +ext2_lookup_ino(struct vnode *vdp, struct vnode **vpp, struct componentname *cnp, + ino_t *dd_ino) +{ struct inode *dp; /* inode for directory being searched */ struct buf *bp; /* a buffer of directory entries */ struct ext2fs_direct_2 *ep; /* the current directory entry */ @@ -305,22 +314,22 @@ ext2_lookup(ap) doff_t enduseful; /* pointer past last used dir slot */ u_long bmask; /* block offset mask */ int namlen, error; - struct vnode **vpp = ap->a_vpp; - struct componentname *cnp = ap->a_cnp; struct ucred *cred = cnp->cn_cred; int flags = cnp->cn_flags; int nameiop = cnp->cn_nameiop; - ino_t ino; + ino_t ino, ino1; int ltype; - int DIRBLKSIZ = VTOI(ap->a_dvp)->i_e2fs->e2fs_bsize; + int DIRBLKSIZ = VTOI(vdp)->i_e2fs->e2fs_bsize; + + if (vpp != NULL) + *vpp = NULL; - bp = NULL; - slotoffset = -1; - *vpp = NULL; - vdp = ap->a_dvp; dp = VTOI(vdp); bmask = VFSTOEXT2(vdp->v_mount)->um_mountp->mnt_stat.f_iosize - 1; +restart: + bp = NULL; + slotoffset = -1; /* * We now have a segment name to search for, and a directory to search. @@ -536,10 +545,12 @@ searchloop: * Insert name into cache (as non-existent) if appropriate. */ if ((cnp->cn_flags & MAKEENTRY) && nameiop != CREATE) - cache_enter(vdp, *vpp, cnp); + cache_enter(vdp, NULL, cnp); return (ENOENT); found: + if (dd_ino != NULL) + *dd_ino = ino; if (numdirpasses == 2) nchstats.ncs_pass2++; /* @@ -582,6 +593,8 @@ found: dp->i_count = 0; else dp->i_count = dp->i_offset - prevoff; + if (dd_ino != NULL) + return (0); if (dp->i_number == ino) { VREF(vdp); *vpp = vdp; @@ -622,6 +635,8 @@ found: */ if (dp->i_number == ino) return (EISDIR); + if (dd_ino != NULL) + return (0); if ((error = VFS_VGET(vdp->v_mount, ino, LK_EXCLUSIVE, &tdp)) != 0) return (error); @@ -629,6 +644,8 @@ found: cnp->cn_flags |= SAVENAME; return (0); } + if (dd_ino != NULL) + return (0); /* * Step through the translation in the name. We do not `vput' the @@ -655,8 +672,27 @@ found: VOP_UNLOCK(pdp, 0); /* race to get the inode */ error = VFS_VGET(vdp->v_mount, ino, cnp->cn_lkflags, &tdp); vn_lock(pdp, ltype | LK_RETRY); - if (error != 0) + if (pdp->v_iflag & VI_DOOMED) { + if (error == 0) + vput(tdp); + error = ENOENT; + } + if (error) return (error); + /* + * Recheck that ".." entry in the vdp directory points + * to the inode we looked up before vdp lock was + * dropped. + */ + error = ext2_lookup_ino(pdp, NULL, cnp, &ino1); + if (error) { + vput(tdp); + return (error); + } + if (ino1 != ino) { + vput(tdp); + goto restart; + } *vpp = tdp; } else if (dp->i_number == ino) { VREF(vdp); /* we want ourself, ie "." */ diff --git a/sys/fs/ext2fs/ext2_vfsops.c b/sys/fs/ext2fs/ext2_vfsops.c index 10ba705319c..17ffb623df0 100644 --- a/sys/fs/ext2fs/ext2_vfsops.c +++ b/sys/fs/ext2fs/ext2_vfsops.c @@ -767,7 +767,7 @@ ext2_statfs(struct mount *mp, struct statfs *sbp) ump = VFSTOEXT2(mp); fs = ump->um_e2fs; if (fs->e2fs->e2fs_magic != E2FS_MAGIC) - panic("ext2fs_statvfs"); + panic("ext2fs_statfs"); /* * Compute the overhead (FS structures) @@ -830,7 +830,6 @@ ext2_sync(struct mount *mp, int waitfor) /* * Write back each (modified) inode. */ - MNT_ILOCK(mp); loop: MNT_VNODE_FOREACH_ALL(vp, mp, mvp) { if (vp->v_type == VNON) { @@ -847,7 +846,6 @@ loop: } error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK, td); if (error) { - MNT_ILOCK(mp); if (error == ENOENT) { MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp); goto loop; diff --git a/sys/fs/ext2fs/ext2_vnops.c b/sys/fs/ext2fs/ext2_vnops.c index 21b7687a314..4f8f6a90dfe 100644 --- a/sys/fs/ext2fs/ext2_vnops.c +++ b/sys/fs/ext2fs/ext2_vnops.c @@ -1336,7 +1336,11 @@ ext2_rmdir(ap) error = ext2_truncate(vp, (off_t)0, IO_SYNC, cnp->cn_cred, cnp->cn_thread); cache_purge(ITOV(ip)); - vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY); + if (vn_lock(dvp, LK_EXCLUSIVE | LK_NOWAIT) != 0) { + VOP_UNLOCK(vp, 0); + vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + } out: return (error); } diff --git a/sys/fs/hpfs/hpfs_vnops.c b/sys/fs/hpfs/hpfs_vnops.c index ccf4f3cabe9..9abe77c3a1e 100644 --- a/sys/fs/hpfs/hpfs_vnops.c +++ b/sys/fs/hpfs/hpfs_vnops.c @@ -797,10 +797,21 @@ hpfs_de_uiomove ( } -static struct dirent hpfs_de_dot = - { 0, sizeof(struct dirent), DT_DIR, 1, "." }; -static struct dirent hpfs_de_dotdot = - { 0, sizeof(struct dirent), DT_DIR, 2, ".." }; +static struct dirent hpfs_de_dot = { + .d_fileno = 0, + .d_reclen = sizeof(struct dirent), + .d_type = DT_DIR, + .d_namlen = 1, + .d_name = "." +}; +static struct dirent hpfs_de_dotdot = { + .d_fileno = 0, + .d_reclen = sizeof(struct dirent), + .d_type = DT_DIR, + .d_namlen = 2, + .d_name = ".." +}; + int hpfs_readdir(ap) struct vop_readdir_args /* { diff --git a/sys/fs/nandfs/bmap.c b/sys/fs/nandfs/bmap.c new file mode 100644 index 00000000000..84e4a9e7e31 --- /dev/null +++ b/sys/fs/nandfs/bmap.c @@ -0,0 +1,621 @@ +/*- + * Copyright (c) 2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "nandfs_mount.h" +#include "nandfs.h" +#include "nandfs_subr.h" +#include "bmap.h" + +static int bmap_getlbns(struct nandfs_node *, nandfs_lbn_t, + struct nandfs_indir *, int *); + +int +bmap_lookup(struct nandfs_node *node, nandfs_lbn_t lblk, nandfs_daddr_t *vblk) +{ + struct nandfs_inode *ip; + struct nandfs_indir a[NIADDR + 1], *ap; + nandfs_daddr_t daddr; + struct buf *bp; + int error; + int num, *nump; + + DPRINTF(BMAP, ("%s: node %p lblk %jx enter\n", __func__, node, lblk)); + ip = &node->nn_inode; + + ap = a; + nump = # + + error = bmap_getlbns(node, lblk, ap, nump); + if (error) + return (error); + + if (num == 0) { + *vblk = ip->i_db[lblk]; + return (0); + } + + DPRINTF(BMAP, ("%s: node %p lblk=%jx trying ip->i_ib[%x]\n", __func__, + node, lblk, ap->in_off)); + daddr = ip->i_ib[ap->in_off]; + for (bp = NULL, ++ap; --num; ap++) { + if (daddr == 0) { + DPRINTF(BMAP, ("%s: node %p lblk=%jx returning with " + "vblk 0\n", __func__, node, lblk)); + *vblk = 0; + return (0); + } + if (ap->in_lbn == lblk) { + DPRINTF(BMAP, ("%s: node %p lblk=%jx ap->in_lbn=%jx " + "returning address of indirect block (%jx)\n", + __func__, node, lblk, ap->in_lbn, daddr)); + *vblk = daddr; + return (0); + } + + DPRINTF(BMAP, ("%s: node %p lblk=%jx reading block " + "ap->in_lbn=%jx\n", __func__, node, lblk, ap->in_lbn)); + + error = nandfs_bread_meta(node, ap->in_lbn, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + + daddr = ((nandfs_daddr_t *)bp->b_data)[ap->in_off]; + brelse(bp); + } + + DPRINTF(BMAP, ("%s: node %p lblk=%jx returning with %jx\n", __func__, + node, lblk, daddr)); + *vblk = daddr; + + return (0); +} + +int +bmap_dirty_meta(struct nandfs_node *node, nandfs_lbn_t lblk, int force) +{ + struct nandfs_indir a[NIADDR+1], *ap; +#ifdef DEBUG + nandfs_daddr_t daddr; +#endif + struct buf *bp; + int error; + int num, *nump; + + DPRINTF(BMAP, ("%s: node %p lblk=%jx\n", __func__, node, lblk)); + + ap = a; + nump = # + + error = bmap_getlbns(node, lblk, ap, nump); + if (error) + return (error); + + /* + * Direct block, nothing to do + */ + if (num == 0) + return (0); + + DPRINTF(BMAP, ("%s: node %p reading blocks\n", __func__, node)); + + for (bp = NULL, ++ap; --num; ap++) { + error = nandfs_bread_meta(node, ap->in_lbn, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + +#ifdef DEBUG + daddr = ((nandfs_daddr_t *)bp->b_data)[ap->in_off]; + MPASS(daddr != 0 || node->nn_ino == 3); +#endif + + error = nandfs_dirty_buf_meta(bp, force); + if (error) + return (error); + } + + return (0); +} + +int +bmap_insert_block(struct nandfs_node *node, nandfs_lbn_t lblk, + nandfs_daddr_t vblk) +{ + struct nandfs_inode *ip; + struct nandfs_indir a[NIADDR+1], *ap; + struct buf *bp; + nandfs_daddr_t daddr; + int error; + int num, *nump, i; + + DPRINTF(BMAP, ("%s: node %p lblk=%jx vblk=%jx\n", __func__, node, lblk, + vblk)); + + ip = &node->nn_inode; + + ap = a; + nump = # + + error = bmap_getlbns(node, lblk, ap, nump); + if (error) + return (error); + + DPRINTF(BMAP, ("%s: node %p lblk=%jx vblk=%jx got num=%d\n", __func__, + node, lblk, vblk, num)); + + if (num == 0) { + DPRINTF(BMAP, ("%s: node %p lblk=%jx direct block\n", __func__, + node, lblk)); + ip->i_db[lblk] = vblk; + return (0); + } + + DPRINTF(BMAP, ("%s: node %p lblk=%jx indirect block level %d\n", + __func__, node, lblk, ap->in_off)); + + if (num == 1) { + DPRINTF(BMAP, ("%s: node %p lblk=%jx indirect block: inserting " + "%jx as vblk for indirect block %d\n", __func__, node, + lblk, vblk, ap->in_off)); + ip->i_ib[ap->in_off] = vblk; + return (0); + } + + bp = NULL; + daddr = ip->i_ib[a[0].in_off]; + for (i = 1; i < num; i++) { + if (bp) + brelse(bp); + if (daddr == 0) { + DPRINTF(BMAP, ("%s: node %p lblk=%jx vblk=%jx create " + "block %jx %d\n", __func__, node, lblk, vblk, + a[i].in_lbn, a[i].in_off)); + error = nandfs_bcreate_meta(node, a[i].in_lbn, NOCRED, + 0, &bp); + if (error) + return (error); + } else { + DPRINTF(BMAP, ("%s: node %p lblk=%jx vblk=%jx read " + "block %jx %d\n", __func__, node, daddr, vblk, + a[i].in_lbn, a[i].in_off)); + error = nandfs_bread_meta(node, a[i].in_lbn, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + } + daddr = ((nandfs_daddr_t *)bp->b_data)[a[i].in_off]; + } + i--; + + DPRINTF(BMAP, + ("%s: bmap node %p lblk=%jx vblk=%jx inserting vblk level %d at " + "offset %d at %jx\n", __func__, node, lblk, vblk, i, a[i].in_off, + daddr)); + + if (!bp) { + nandfs_error("%s: cannot find indirect block\n", __func__); + return (-1); + } + ((nandfs_daddr_t *)bp->b_data)[a[i].in_off] = vblk; + + error = nandfs_dirty_buf_meta(bp, 0); + if (error) { + nandfs_warning("%s: dirty failed buf: %p\n", __func__, bp); + return (error); + } + DPRINTF(BMAP, ("%s: exiting node %p lblk=%jx vblk=%jx\n", __func__, + node, lblk, vblk)); + + return (error); +} + +CTASSERT(NIADDR <= 3); +#define SINGLE 0 /* index of single indirect block */ +#define DOUBLE 1 /* index of double indirect block */ +#define TRIPLE 2 /* index of triple indirect block */ + +static __inline nandfs_lbn_t +lbn_offset(struct nandfs_device *fsdev, int level) +{ + nandfs_lbn_t res; + + for (res = 1; level > 0; level--) + res *= MNINDIR(fsdev); + return (res); +} + +static nandfs_lbn_t +blocks_inside(struct nandfs_device *fsdev, int level, struct nandfs_indir *nip) +{ + nandfs_lbn_t blocks; + + for (blocks = 1; level >= SINGLE; level--, nip++) { + MPASS(nip->in_off >= 0 && nip->in_off < MNINDIR(fsdev)); + blocks += nip->in_off * lbn_offset(fsdev, level); + } + + return (blocks); +} + +static int +bmap_truncate_indirect(struct nandfs_node *node, int level, nandfs_lbn_t *left, + int *cleaned, struct nandfs_indir *ap, struct nandfs_indir *fp, + nandfs_daddr_t *copy) +{ + struct buf *bp; + nandfs_lbn_t i, lbn, nlbn, factor, tosub; + struct nandfs_device *fsdev; + int error, lcleaned, modified; + + DPRINTF(BMAP, ("%s: node %p level %d left %jx\n", __func__, + node, level, *left)); + + fsdev = node->nn_nandfsdev; + + MPASS(ap->in_off >= 0 && ap->in_off < MNINDIR(fsdev)); + + factor = lbn_offset(fsdev, level); + lbn = ap->in_lbn; + + error = nandfs_bread_meta(node, lbn, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + + bcopy(bp->b_data, copy, fsdev->nd_blocksize); + bqrelse(bp); + + modified = 0; + + i = ap->in_off; + + if (ap != fp) + ap++; + for (nlbn = lbn + 1 - i * factor; i >= 0 && *left > 0; i--, + nlbn += factor) { + lcleaned = 0; + + DPRINTF(BMAP, + ("%s: node %p i=%jx nlbn=%jx left=%jx ap=%p vblk %jx\n", + __func__, node, i, nlbn, *left, ap, copy[i])); + + if (copy[i] == 0) { + tosub = blocks_inside(fsdev, level - 1, ap); + if (tosub > *left) + tosub = 0; + + *left -= tosub; + } else { + if (level > SINGLE) { + if (ap == fp) + ap->in_lbn = nlbn; + + error = bmap_truncate_indirect(node, level - 1, + left, &lcleaned, ap, fp, + copy + MNINDIR(fsdev)); + if (error) + return (error); + } else { + error = nandfs_bdestroy(node, copy[i]); + if (error) + return (error); + lcleaned = 1; + *left -= 1; + } + } + + if (lcleaned) { + if (level > SINGLE) { + error = nandfs_vblock_end(fsdev, copy[i]); + if (error) + return (error); + } + copy[i] = 0; + modified++; + } + + ap = fp; + } + + if (i == -1) + *cleaned = 1; + + error = nandfs_bread_meta(node, lbn, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + if (modified) + bcopy(copy, bp->b_data, fsdev->nd_blocksize); + + error = nandfs_dirty_buf_meta(bp, 0); + if (error) + return (error); + + return (error); +} + +int +bmap_truncate_mapping(struct nandfs_node *node, nandfs_lbn_t lastblk, + nandfs_lbn_t todo) +{ + struct nandfs_inode *ip; + struct nandfs_indir a[NIADDR + 1], f[NIADDR], *ap; + nandfs_daddr_t indir_lbn[NIADDR]; + nandfs_daddr_t *copy; + int error, level; + nandfs_lbn_t left, tosub; + struct nandfs_device *fsdev; + int cleaned, i; + int num, *nump; + + DPRINTF(BMAP, ("%s: node %p lastblk %jx truncating by %jx\n", __func__, + node, lastblk, todo)); + + ip = &node->nn_inode; + fsdev = node->nn_nandfsdev; + + ap = a; + nump = # + + error = bmap_getlbns(node, lastblk, ap, nump); + if (error) + return (error); + + indir_lbn[SINGLE] = -NDADDR; + indir_lbn[DOUBLE] = indir_lbn[SINGLE] - MNINDIR(fsdev) - 1; + indir_lbn[TRIPLE] = indir_lbn[DOUBLE] - MNINDIR(fsdev) + * MNINDIR(fsdev) - 1; + + for (i = 0; i < NIADDR; i++) { + f[i].in_off = MNINDIR(fsdev) - 1; + f[i].in_lbn = 0xdeadbeef; + } + + left = todo; + +#ifdef DEBUG + a[num].in_off = -1; +#endif + + ap++; + num -= 2; + + if (num < 0) + goto direct; + + copy = malloc(MNINDIR(fsdev) * sizeof(nandfs_daddr_t) * (num + 1), + M_NANDFSTEMP, M_WAITOK); + + for (level = num; level >= SINGLE && left > 0; level--) { + cleaned = 0; + + if (ip->i_ib[level] == 0) { + tosub = blocks_inside(fsdev, level, ap); + if (tosub > left) + left = 0; + else + left -= tosub; + } else { + if (ap == f) + ap->in_lbn = indir_lbn[level]; + error = bmap_truncate_indirect(node, level, &left, + &cleaned, ap, f, copy); + if (error) { + nandfs_error("%s: error %d when truncate " + "at level %d\n", __func__, error, level); + return (error); + } + } + + if (cleaned) { + nandfs_vblock_end(fsdev, ip->i_ib[level]); + ip->i_ib[level] = 0; + } + + ap = f; + } + + free(copy, M_NANDFSTEMP); + +direct: + if (num < 0) + i = lastblk; + else + i = NDADDR - 1; + + for (; i >= 0 && left > 0; i--) { + if (ip->i_db[i] != 0) { + error = nandfs_bdestroy(node, ip->i_db[i]); + if (error) { + nandfs_error("%s: cannot destroy " + "block %jx, error %d\n", __func__, + (uintmax_t)ip->i_db[i], error); + return (error); + } + ip->i_db[i] = 0; + } + + left--; + } + + KASSERT(left == 0, + ("truncated wrong number of blocks (%jd should be 0)", left)); + + return (error); +} + +nandfs_lbn_t +get_maxfilesize(struct nandfs_device *fsdev) +{ + struct nandfs_indir f[NIADDR]; + nandfs_lbn_t max; + int i; + + max = NDADDR; + + for (i = 0; i < NIADDR; i++) { + f[i].in_off = MNINDIR(fsdev) - 1; + max += blocks_inside(fsdev, i, f); + } + + max *= fsdev->nd_blocksize; + + return (max); +} + +/* + * This is ufs_getlbns with minor modifications. + */ +/* + * Create an array of logical block number/offset pairs which represent the + * path of indirect blocks required to access a data block. The first "pair" + * contains the logical block number of the appropriate single, double or + * triple indirect block and the offset into the inode indirect block array. + * Note, the logical block number of the inode single/double/triple indirect + * block appears twice in the array, once with the offset into the i_ib and + * once with the offset into the page itself. + */ +static int +bmap_getlbns(struct nandfs_node *node, nandfs_lbn_t bn, struct nandfs_indir *ap, int *nump) +{ + nandfs_daddr_t blockcnt; + nandfs_lbn_t metalbn, realbn; + struct nandfs_device *fsdev; + int i, numlevels, off; + + fsdev = node->nn_nandfsdev; + + DPRINTF(BMAP, ("%s: node %p bn=%jx mnindir=%zd enter\n", __func__, + node, bn, MNINDIR(fsdev))); + + *nump = 0; + numlevels = 0; + realbn = bn; + + if (bn < 0) + bn = -bn; + + /* The first NDADDR blocks are direct blocks. */ + if (bn < NDADDR) + return (0); + + /* + * Determine the number of levels of indirection. After this loop + * is done, blockcnt indicates the number of data blocks possible + * at the previous level of indirection, and NIADDR - i is the number + * of levels of indirection needed to locate the requested block. + */ + for (blockcnt = 1, i = NIADDR, bn -= NDADDR;; i--, bn -= blockcnt) { + DPRINTF(BMAP, ("%s: blockcnt=%jd i=%d bn=%jd\n", __func__, + blockcnt, i, bn)); + if (i == 0) + return (EFBIG); + blockcnt *= MNINDIR(fsdev); + if (bn < blockcnt) + break; + } + + /* Calculate the address of the first meta-block. */ + if (realbn >= 0) + metalbn = -(realbn - bn + NIADDR - i); + else + metalbn = -(-realbn - bn + NIADDR - i); + + /* + * At each iteration, off is the offset into the bap array which is + * an array of disk addresses at the current level of indirection. + * The logical block number and the offset in that block are stored + * into the argument array. + */ + ap->in_lbn = metalbn; + ap->in_off = off = NIADDR - i; + + DPRINTF(BMAP, ("%s: initial: ap->in_lbn=%jx ap->in_off=%d\n", __func__, + metalbn, off)); + + ap++; + for (++numlevels; i <= NIADDR; i++) { + /* If searching for a meta-data block, quit when found. */ + if (metalbn == realbn) + break; + + blockcnt /= MNINDIR(fsdev); + off = (bn / blockcnt) % MNINDIR(fsdev); + + ++numlevels; + ap->in_lbn = metalbn; + ap->in_off = off; + + DPRINTF(BMAP, ("%s: in_lbn=%jx in_off=%d\n", __func__, + ap->in_lbn, ap->in_off)); + ++ap; + + metalbn -= -1 + off * blockcnt; + } + if (nump) + *nump = numlevels; + + DPRINTF(BMAP, ("%s: numlevels=%d\n", __func__, numlevels)); + + return (0); +} diff --git a/sys/fs/nandfs/bmap.h b/sys/fs/nandfs/bmap.h new file mode 100644 index 00000000000..c27c61cad29 --- /dev/null +++ b/sys/fs/nandfs/bmap.h @@ -0,0 +1,40 @@ +/*- + * Copyright (c) 2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _BMAP_H +#define _BMAP_H + +#include "nandfs_fs.h" + +int bmap_lookup(struct nandfs_node *, nandfs_lbn_t, nandfs_daddr_t *); +int bmap_insert_block(struct nandfs_node *, nandfs_lbn_t, nandfs_daddr_t); +int bmap_truncate_mapping(struct nandfs_node *, nandfs_lbn_t, nandfs_lbn_t); +int bmap_dirty_meta(struct nandfs_node *, nandfs_lbn_t, int); + +nandfs_lbn_t get_maxfilesize(struct nandfs_device *); + +#endif /* _BMAP_H */ diff --git a/sys/fs/nandfs/nandfs.h b/sys/fs/nandfs/nandfs.h new file mode 100644 index 00000000000..beb4e163914 --- /dev/null +++ b/sys/fs/nandfs/nandfs.h @@ -0,0 +1,310 @@ +/*- + * Copyright (c) 2010-2012 Semihalf + * Copyright (c) 2008, 2009 Reinoud Zandijk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * From: NetBSD: nilfs.h,v 1.1 2009/07/18 16:31:42 reinoud + * + * $FreeBSD$ + */ + +#ifndef _FS_NANDFS_NANDFS_H_ +#define _FS_NANDFS_NANDFS_H_ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include "nandfs_fs.h" + +MALLOC_DECLARE(M_NANDFSTEMP); + +/* Debug categories */ +#define NANDFS_DEBUG_VOLUMES 0x000001 +#define NANDFS_DEBUG_BLOCK 0x000004 +#define NANDFS_DEBUG_LOCKING 0x000008 +#define NANDFS_DEBUG_NODE 0x000010 +#define NANDFS_DEBUG_LOOKUP 0x000020 +#define NANDFS_DEBUG_READDIR 0x000040 +#define NANDFS_DEBUG_TRANSLATE 0x000080 +#define NANDFS_DEBUG_STRATEGY 0x000100 +#define NANDFS_DEBUG_READ 0x000200 +#define NANDFS_DEBUG_WRITE 0x000400 +#define NANDFS_DEBUG_IFILE 0x000800 +#define NANDFS_DEBUG_ATTR 0x001000 +#define NANDFS_DEBUG_EXTATTR 0x002000 +#define NANDFS_DEBUG_ALLOC 0x004000 +#define NANDFS_DEBUG_CPFILE 0x008000 +#define NANDFS_DEBUG_DIRHASH 0x010000 +#define NANDFS_DEBUG_NOTIMPL 0x020000 +#define NANDFS_DEBUG_SHEDULE 0x040000 +#define NANDFS_DEBUG_SEG 0x080000 +#define NANDFS_DEBUG_SYNC 0x100000 +#define NANDFS_DEBUG_PARANOIA 0x200000 +#define NANDFS_DEBUG_VNCALL 0x400000 +#define NANDFS_DEBUG_BUF 0x1000000 +#define NANDFS_DEBUG_BMAP 0x2000000 +#define NANDFS_DEBUG_DAT 0x4000000 +#define NANDFS_DEBUG_GENERIC 0x8000000 +#define NANDFS_DEBUG_CLEAN 0x10000000 + +extern int nandfs_verbose; + +#define DPRINTF(name, arg) { \ + if (nandfs_verbose & NANDFS_DEBUG_##name) {\ + printf arg;\ + };\ + } +#define DPRINTFIF(name, cond, arg) { \ + if (nandfs_verbose & NANDFS_DEBUG_##name) { \ + if (cond) printf arg;\ + };\ + } + +#define VFSTONANDFS(mp) ((struct nandfsmount *)((mp)->mnt_data)) +#define VTON(vp) ((struct nandfs_node *)(vp)->v_data) +#define NTOV(xp) ((xp)->nn_vnode) + +int nandfs_init(struct vfsconf *); +int nandfs_uninit(struct vfsconf *); + +extern struct vop_vector nandfs_vnodeops; +extern struct vop_vector nandfs_system_vnodeops; + +struct nandfs_node; + +/* Structure and derivatives */ +struct nandfs_mdt { + uint32_t entries_per_block; + uint32_t entries_per_group; + uint32_t blocks_per_group; + uint32_t groups_per_desc_block; /* desc is super group */ + uint32_t blocks_per_desc_block; /* desc is super group */ +}; + +struct nandfs_segment { + LIST_ENTRY(nandfs_segment) seg_link; + + struct nandfs_device *fsdev; + + TAILQ_HEAD(, buf) segsum; + TAILQ_HEAD(, buf) data; + + uint64_t seg_num; + uint64_t seg_next; + uint64_t start_block; + uint32_t num_blocks; + + uint32_t nblocks; + uint32_t nbinfos; + uint32_t segsum_blocks; + uint32_t segsum_bytes; + uint32_t bytes_left; + char *current_off; +}; + +struct nandfs_seginfo { + LIST_HEAD( ,nandfs_segment) seg_list; + struct nandfs_segment *curseg; + struct nandfs_device *fsdev; + uint32_t blocks; + uint8_t reiterate; +}; + +#define NANDFS_FSSTOR_FAILED 1 +struct nandfs_fsarea { + int offset; + int flags; + int last_used; +}; + +extern int nandfs_cleaner_enable; +extern int nandfs_cleaner_interval; +extern int nandfs_cleaner_segments; + +struct nandfs_device { + struct vnode *nd_devvp; + struct g_consumer *nd_gconsumer; + + struct thread *nd_syncer; + struct thread *nd_cleaner; + int nd_syncer_exit; + int nd_cleaner_exit; + + int nd_is_nand; + + struct nandfs_fsarea nd_fsarea[NANDFS_NFSAREAS]; + int nd_last_fsarea; + + STAILQ_HEAD(nandfs_mnts, nandfsmount) nd_mounts; + SLIST_ENTRY(nandfs_device) nd_next_device; + + /* FS structures */ + struct nandfs_fsdata nd_fsdata; + struct nandfs_super_block nd_super; + struct nandfs_segment_summary nd_last_segsum; + struct nandfs_super_root nd_super_root; + struct nandfs_node *nd_dat_node; + struct nandfs_node *nd_cp_node; + struct nandfs_node *nd_su_node; + struct nandfs_node *nd_gc_node; + + struct nandfs_mdt nd_dat_mdt; + struct nandfs_mdt nd_ifile_mdt; + + struct timespec nd_ts; + + /* Synchronization */ + struct mtx nd_mutex; + struct mtx nd_sync_mtx; + struct cv nd_sync_cv; + struct mtx nd_clean_mtx; + struct cv nd_clean_cv; + struct lock nd_seg_const; + + struct nandfs_seginfo *nd_seginfo; + + /* FS geometry */ + uint64_t nd_devsize; + uint64_t nd_maxfilesize; + uint32_t nd_blocksize; + uint32_t nd_erasesize; + + uint32_t nd_devblocksize; + + /* Segment usage */ + uint64_t nd_clean_segs; + uint64_t *nd_free_base; + uint64_t nd_free_count; + uint64_t nd_dirty_bufs; + + /* Running values */ + uint64_t nd_seg_sequence; + uint64_t nd_seg_num; + uint64_t nd_next_seg_num; + uint64_t nd_last_pseg; + uint64_t nd_last_cno; + uint64_t nd_last_ino; + uint64_t nd_fakevblk; + + int nd_mount_state; + int nd_refcnt; + int nd_syncing; + int nd_cleaning; +}; + +extern SLIST_HEAD(_nandfs_devices, nandfs_device) nandfs_devices; + +#define NANDFS_FORCE_SYNCER 0x1 +#define NANDFS_UMOUNT 0x2 + +#define SYNCER_UMOUNT 0x0 +#define SYNCER_VFS_SYNC 0x1 +#define SYNCER_BDFLUSH 0x2 +#define SYNCER_FFORCE 0x3 +#define SYNCER_FSYNC 0x4 +#define SYNCER_ROUPD 0x5 + +static __inline int +nandfs_writelockflags(struct nandfs_device *fsdev, int flags) +{ + int error = 0; + + if (lockstatus(&fsdev->nd_seg_const) != LK_EXCLUSIVE) + error = lockmgr(&fsdev->nd_seg_const, flags | LK_SHARED, NULL); + + return (error); +} + +static __inline void +nandfs_writeunlock(struct nandfs_device *fsdev) +{ + + if (lockstatus(&fsdev->nd_seg_const) != LK_EXCLUSIVE) + lockmgr(&(fsdev)->nd_seg_const, LK_RELEASE, NULL); +} + +#define NANDFS_WRITELOCKFLAGS(fsdev, flags) nandfs_writelockflags(fsdev, flags) + +#define NANDFS_WRITELOCK(fsdev) NANDFS_WRITELOCKFLAGS(fsdev, 0) + +#define NANDFS_WRITEUNLOCK(fsdev) nandfs_writeunlock(fsdev) + +#define NANDFS_WRITEASSERT(fsdev) lockmgr_assert(&(fsdev)->nd_seg_const, KA_LOCKED) + +/* Specific mountpoint; head or a checkpoint/snapshot */ +struct nandfsmount { + STAILQ_ENTRY(nandfsmount) nm_next_mount; + + struct mount *nm_vfs_mountp; + struct nandfs_device *nm_nandfsdev; + struct nandfs_args nm_mount_args; + struct nandfs_node *nm_ifile_node; + + uint8_t nm_flags; + int8_t nm_ronly; +}; + +struct nandfs_node { + struct vnode *nn_vnode; + struct nandfsmount *nn_nmp; + struct nandfs_device *nn_nandfsdev; + struct lockf *nn_lockf; + + uint64_t nn_ino; + struct nandfs_inode nn_inode; + + uint64_t nn_diroff; + uint32_t nn_flags; +}; + +#define IN_ACCESS 0x0001 /* Inode access time update request */ +#define IN_CHANGE 0x0002 /* Inode change time update request */ +#define IN_UPDATE 0x0004 /* Inode was written to; update mtime*/ +#define IN_MODIFIED 0x0008 /* node has been modified */ +#define IN_RENAME 0x0010 /* node is being renamed. */ + +/* File permissions. */ +#define IEXEC 0000100 /* Executable. */ +#define IWRITE 0000200 /* Writeable. */ +#define IREAD 0000400 /* Readable. */ +#define ISVTX 0001000 /* Sticky bit. */ +#define ISGID 0002000 /* Set-gid. */ +#define ISUID 0004000 /* Set-uid. */ + +#define PRINT_NODE_FLAGS \ + "\10\1IN_ACCESS\2IN_CHANGE\3IN_UPDATE\4IN_MODIFIED\5IN_RENAME" + +#define NANDFS_GATHER(x) ((x)->b_flags |= B_00800000) +#define NANDFS_UNGATHER(x) ((x)->b_flags &= ~B_00800000) +#define NANDFS_ISGATHERED(x) ((x)->b_flags & B_00800000) + +#endif /* !_FS_NANDFS_NANDFS_H_ */ diff --git a/sys/fs/nandfs/nandfs_alloc.c b/sys/fs/nandfs/nandfs_alloc.c new file mode 100644 index 00000000000..3417266c960 --- /dev/null +++ b/sys/fs/nandfs/nandfs_alloc.c @@ -0,0 +1,364 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +static void +nandfs_get_desc_block_nr(struct nandfs_mdt *mdt, uint64_t desc, + uint64_t *desc_block) +{ + + *desc_block = desc * mdt->blocks_per_desc_block; +} + +static void +nandfs_get_group_block_nr(struct nandfs_mdt *mdt, uint64_t group, + uint64_t *group_block) +{ + uint64_t desc, group_off; + + desc = group / mdt->groups_per_desc_block; + group_off = group % mdt->groups_per_desc_block; + *group_block = desc * mdt->blocks_per_desc_block + + 1 + group_off * mdt->blocks_per_group; +} + +static void +init_desc_block(struct nandfs_mdt *mdt, uint8_t *block_data) +{ + struct nandfs_block_group_desc *desc; + uint32_t i; + + desc = (struct nandfs_block_group_desc *) block_data; + for (i = 0; i < mdt->groups_per_desc_block; i++) + desc[i].bg_nfrees = mdt->entries_per_group; +} + +int +nandfs_find_free_entry(struct nandfs_mdt *mdt, struct nandfs_node *node, + struct nandfs_alloc_request *req) +{ + nandfs_daddr_t desc, group, maxgroup, maxdesc, pos = 0; + nandfs_daddr_t start_group, start_desc; + nandfs_daddr_t desc_block, group_block; + nandfs_daddr_t file_blocks; + struct nandfs_block_group_desc *descriptors; + struct buf *bp, *bp2; + uint32_t *mask, i, mcount, msize; + int error; + + file_blocks = node->nn_inode.i_blocks; + maxgroup = 0x100000000ull / mdt->entries_per_group; + maxdesc = maxgroup / mdt->groups_per_desc_block; + start_group = req->entrynum / mdt->entries_per_group; + start_desc = start_group / mdt->groups_per_desc_block; + + bp = bp2 = NULL; +restart: + for (desc = start_desc; desc < maxdesc; desc++) { + nandfs_get_desc_block_nr(mdt, desc, &desc_block); + + if (bp) + brelse(bp); + if (desc_block < file_blocks) { + error = nandfs_bread(node, desc_block, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + } else { + error = nandfs_bcreate(node, desc_block, NOCRED, 0, + &bp); + if (error) + return (error); + file_blocks++; + init_desc_block(mdt, bp->b_data); + } + + descriptors = (struct nandfs_block_group_desc *) bp->b_data; + for (group = start_group; group < mdt->groups_per_desc_block; + group++) { + if (descriptors[group].bg_nfrees > 0) { + nandfs_get_group_block_nr(mdt, group, + &group_block); + + if (bp2) + brelse(bp2); + if (group_block < file_blocks) { + error = nandfs_bread(node, group_block, + NOCRED, 0, &bp2); + if (error) { + brelse(bp); + return (error); + } + } else { + error = nandfs_bcreate(node, + group_block, NOCRED, 0, &bp2); + if (error) + return (error); + file_blocks++; + } + mask = (uint32_t *)bp2->b_data; + msize = (sizeof(uint32_t) * __CHAR_BIT); + mcount = mdt->entries_per_group / msize; + for (i = 0; i < mcount; i++) { + if (mask[i] == UINT32_MAX) + continue; + + pos = ffs(~mask[i]) - 1; + pos += (msize * i); + pos += (group * mdt->entries_per_group); + pos += desc * group * + mdt->groups_per_desc_block * + mdt->entries_per_group; + goto found; + } + } + } + start_group = 0; + } + + if (start_desc != 0) { + maxdesc = start_desc; + start_desc = 0; + req->entrynum = 0; + goto restart; + } + + return (ENOENT); + +found: + req->entrynum = pos; + req->bp_desc = bp; + req->bp_bitmap = bp2; + DPRINTF(ALLOC, ("%s: desc: %p bitmap: %p entry: %#jx\n", + __func__, req->bp_desc, req->bp_bitmap, (uintmax_t)pos)); + + return (0); +} + +int +nandfs_find_entry(struct nandfs_mdt* mdt, struct nandfs_node *nnode, + struct nandfs_alloc_request *req) +{ + uint64_t dblock, bblock, eblock; + uint32_t offset; + int error; + + nandfs_mdt_trans_blk(mdt, req->entrynum, &dblock, &bblock, &eblock, + &offset); + + error = nandfs_bread(nnode, dblock, NOCRED, 0, &req->bp_desc); + if (error) { + brelse(req->bp_desc); + return (error); + } + + error = nandfs_bread(nnode, bblock, NOCRED, 0, &req->bp_bitmap); + if (error) { + brelse(req->bp_desc); + brelse(req->bp_bitmap); + return (error); + } + + error = nandfs_bread(nnode, eblock, NOCRED, 0, &req->bp_entry); + if (error) { + brelse(req->bp_desc); + brelse(req->bp_bitmap); + brelse(req->bp_entry); + return (error); + } + + DPRINTF(ALLOC, + ("%s: desc_buf: %p bitmap_buf %p entry_buf %p offset %x\n", + __func__, req->bp_desc, req->bp_bitmap, req->bp_entry, offset)); + + return (0); +} + +static __inline void +nandfs_calc_idx_entry(struct nandfs_mdt* mdt, uint32_t entrynum, + uint64_t *group, uint64_t *bitmap_idx, uint64_t *bitmap_off) +{ + + /* Find group_desc index */ + entrynum = entrynum % + (mdt->entries_per_group * mdt->groups_per_desc_block); + *group = entrynum / mdt->entries_per_group; + /* Find bitmap index and bit offset */ + entrynum = entrynum % mdt->entries_per_group; + *bitmap_idx = entrynum / (sizeof(uint32_t) * __CHAR_BIT); + *bitmap_off = entrynum % (sizeof(uint32_t) * __CHAR_BIT); +} + +int +nandfs_free_entry(struct nandfs_mdt* mdt, struct nandfs_alloc_request *req) +{ + struct nandfs_block_group_desc *descriptors; + uint64_t bitmap_idx, bitmap_off; + uint64_t group; + uint32_t *mask, maskrw; + + nandfs_calc_idx_entry(mdt, req->entrynum, &group, &bitmap_idx, + &bitmap_off); + + DPRINTF(ALLOC, ("nandfs_free_entry: req->entrynum=%jx bitmap_idx=%jx" + " bitmap_off=%jx group=%jx\n", (uintmax_t)req->entrynum, + (uintmax_t)bitmap_idx, (uintmax_t)bitmap_off, (uintmax_t)group)); + + /* Update counter of free entries for group */ + descriptors = (struct nandfs_block_group_desc *) req->bp_desc->b_data; + descriptors[group].bg_nfrees++; + + /* Set bit to indicate that entry is taken */ + mask = (uint32_t *)req->bp_bitmap->b_data; + maskrw = mask[bitmap_idx]; + KASSERT(maskrw & (1 << bitmap_off), ("freeing unallocated vblock")); + maskrw &= ~(1 << bitmap_off); + mask[bitmap_idx] = maskrw; + + /* Make descriptor, bitmap and entry buffer dirty */ + if (nandfs_dirty_buf(req->bp_desc, 0) == 0) { + nandfs_dirty_buf(req->bp_bitmap, 1); + nandfs_dirty_buf(req->bp_entry, 1); + } else { + brelse(req->bp_bitmap); + brelse(req->bp_entry); + return (-1); + } + + return (0); +} + +int +nandfs_alloc_entry(struct nandfs_mdt* mdt, struct nandfs_alloc_request *req) +{ + struct nandfs_block_group_desc *descriptors; + uint64_t bitmap_idx, bitmap_off; + uint64_t group; + uint32_t *mask, maskrw; + + nandfs_calc_idx_entry(mdt, req->entrynum, &group, &bitmap_idx, + &bitmap_off); + + DPRINTF(ALLOC, ("nandfs_alloc_entry: req->entrynum=%jx bitmap_idx=%jx" + " bitmap_off=%jx group=%jx\n", (uintmax_t)req->entrynum, + (uintmax_t)bitmap_idx, (uintmax_t)bitmap_off, (uintmax_t)group)); + + /* Update counter of free entries for group */ + descriptors = (struct nandfs_block_group_desc *) req->bp_desc->b_data; + descriptors[group].bg_nfrees--; + + /* Clear bit to indicate that entry is free */ + mask = (uint32_t *)req->bp_bitmap->b_data; + maskrw = mask[bitmap_idx]; + maskrw |= 1 << bitmap_off; + mask[bitmap_idx] = maskrw; + + /* Make descriptor, bitmap and entry buffer dirty */ + if (nandfs_dirty_buf(req->bp_desc, 0) == 0) { + nandfs_dirty_buf(req->bp_bitmap, 1); + nandfs_dirty_buf(req->bp_entry, 1); + } else { + brelse(req->bp_bitmap); + brelse(req->bp_entry); + return (-1); + } + + return (0); +} + +void +nandfs_abort_entry(struct nandfs_alloc_request *req) +{ + + brelse(req->bp_desc); + brelse(req->bp_bitmap); + brelse(req->bp_entry); +} + +int +nandfs_get_entry_block(struct nandfs_mdt *mdt, struct nandfs_node *node, + struct nandfs_alloc_request *req, uint32_t *entry, int create) +{ + struct buf *bp; + nandfs_lbn_t blocknr; + int error; + + /* Find buffer number for given entry */ + nandfs_mdt_trans(mdt, req->entrynum, &blocknr, entry); + DPRINTF(ALLOC, ("%s: ino %#jx entrynum:%#jx block:%#jx entry:%x\n", + __func__, (uintmax_t)node->nn_ino, (uintmax_t)req->entrynum, + (uintmax_t)blocknr, *entry)); + + /* Read entry block or create if 'create' parameter is not zero */ + bp = NULL; + + if (blocknr < node->nn_inode.i_blocks) + error = nandfs_bread(node, blocknr, NOCRED, 0, &bp); + else if (create) + error = nandfs_bcreate(node, blocknr, NOCRED, 0, &bp); + else + error = E2BIG; + + if (error) { + DPRINTF(ALLOC, ("%s: ino %#jx block %#jx entry %x error %d\n", + __func__, (uintmax_t)node->nn_ino, (uintmax_t)blocknr, + *entry, error)); + if (bp) + brelse(bp); + return (error); + } + + MPASS(nandfs_vblk_get(bp) != 0 || node->nn_ino == NANDFS_DAT_INO); + + req->bp_entry = bp; + return (0); +} diff --git a/sys/fs/nandfs/nandfs_bmap.c b/sys/fs/nandfs/nandfs_bmap.c new file mode 100644 index 00000000000..9f800b844ad --- /dev/null +++ b/sys/fs/nandfs/nandfs_bmap.c @@ -0,0 +1,230 @@ +/*- + * Copyright (c) 2010-2012 Semihalf + * Copyright (c) 2008, 2009 Reinoud Zandijk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * From: NetBSD: nilfs_subr.c,v 1.4 2009/07/29 17:06:57 reinoud + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "nandfs_mount.h" +#include "nandfs.h" +#include "nandfs_subr.h" +#include "bmap.h" + +nandfs_lbn_t +nandfs_get_maxfilesize(struct nandfs_device *fsdev) +{ + + return (get_maxfilesize(fsdev)); +} + +int +nandfs_bmap_lookup(struct nandfs_node *node, nandfs_lbn_t lblk, + nandfs_daddr_t *vblk) +{ + int error = 0; + + if (node->nn_ino == NANDFS_GC_INO && lblk >= 0) + *vblk = lblk; + else + error = bmap_lookup(node, lblk, vblk); + + DPRINTF(TRANSLATE, ("%s: error %d ino %#jx lblocknr %#jx -> %#jx\n", + __func__, error, (uintmax_t)node->nn_ino, (uintmax_t)lblk, + (uintmax_t)*vblk)); + + if (error) + nandfs_error("%s: returned %d", __func__, error); + + return (error); +} + +int +nandfs_bmap_insert_block(struct nandfs_node *node, nandfs_lbn_t lblk, + struct buf *bp) +{ + struct nandfs_device *fsdev; + nandfs_daddr_t vblk; + int error; + + fsdev = node->nn_nandfsdev; + + vblk = 0; + if (node->nn_ino != NANDFS_DAT_INO) { + error = nandfs_vblock_alloc(fsdev, &vblk); + if (error) + return (error); + } + + nandfs_buf_set(bp, NANDFS_VBLK_ASSIGNED); + nandfs_vblk_set(bp, vblk); + + error = bmap_insert_block(node, lblk, vblk); + if (error) { + nandfs_vblock_free(fsdev, vblk); + return (error); + } + + return (0); +} + +int +nandfs_bmap_dirty_blocks(struct nandfs_node *node, struct buf *bp, int force) +{ + int error; + + error = bmap_dirty_meta(node, bp->b_lblkno, force); + if (error) + nandfs_error("%s: cannot dirty buffer %p\n", + __func__, bp); + + return (error); +} + +static int +nandfs_bmap_update_mapping(struct nandfs_node *node, nandfs_lbn_t lblk, + nandfs_daddr_t blknr) +{ + int error; + + DPRINTF(BMAP, + ("%s: node: %p ino: %#jx lblk: %#jx vblk: %#jx\n", + __func__, node, (uintmax_t)node->nn_ino, (uintmax_t)lblk, + (uintmax_t)blknr)); + + error = bmap_insert_block(node, lblk, blknr); + + return (error); +} + +int +nandfs_bmap_update_block(struct nandfs_node *node, struct buf *bp, + nandfs_lbn_t blknr) +{ + nandfs_lbn_t lblk; + int error; + + lblk = bp->b_lblkno; + nandfs_vblk_set(bp, blknr); + + DPRINTF(BMAP, ("%s: node: %p ino: %#jx bp: %p lblk: %#jx blk: %#jx\n", + __func__, node, (uintmax_t)node->nn_ino, bp, + (uintmax_t)lblk, (uintmax_t)blknr)); + + error = nandfs_bmap_update_mapping(node, lblk, blknr); + if (error) { + nandfs_error("%s: cannot update lblk:%jx to blk:%jx for " + "node:%p, error:%d\n", __func__, (uintmax_t)lblk, + (uintmax_t)blknr, node, error); + return (error); + } + + return (error); +} + +int +nandfs_bmap_update_dat(struct nandfs_node *node, nandfs_daddr_t oldblk, + struct buf *bp) +{ + struct nandfs_device *fsdev; + nandfs_daddr_t vblk = 0; + int error; + + if (node->nn_ino == NANDFS_DAT_INO) + return (0); + + if (nandfs_buf_check(bp, NANDFS_VBLK_ASSIGNED)) { + nandfs_buf_clear(bp, NANDFS_VBLK_ASSIGNED); + return (0); + } + + fsdev = node->nn_nandfsdev; + + /* First alloc new virtual block.... */ + error = nandfs_vblock_alloc(fsdev, &vblk); + if (error) + return (error); + + error = nandfs_bmap_update_block(node, bp, vblk); + if (error) + return (error); + + /* Then we can end up with old one */ + nandfs_vblock_end(fsdev, oldblk); + + DPRINTF(BMAP, + ("%s: ino %#jx block %#jx: update vblk %#jx to %#jx\n", + __func__, (uintmax_t)node->nn_ino, (uintmax_t)bp->b_lblkno, + (uintmax_t)oldblk, (uintmax_t)vblk)); + return (error); +} + +int +nandfs_bmap_truncate_mapping(struct nandfs_node *node, nandfs_lbn_t oblk, + nandfs_lbn_t nblk) +{ + nandfs_lbn_t todo; + int error; + + todo = oblk - nblk; + + DPRINTF(BMAP, ("%s: node %p oblk %jx nblk %jx truncate by %jx\n", + __func__, node, oblk, nblk, todo)); + + error = bmap_truncate_mapping(node, oblk, todo); + if (error) + return (error); + + return (error); +} diff --git a/sys/fs/nandfs/nandfs_buffer.c b/sys/fs/nandfs/nandfs_buffer.c new file mode 100644 index 00000000000..b0d72668df8 --- /dev/null +++ b/sys/fs/nandfs/nandfs_buffer.c @@ -0,0 +1,83 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +struct buf * +nandfs_geteblk(int size, int flags) +{ + struct buf *bp; + + /* + * XXX + * Right now we can call geteblk with GB_NOWAIT_BD flag, which means + * it can return NULL. But we cannot afford to get NULL, hence this panic. + */ + bp = geteblk(size, flags); + if (bp == NULL) + panic("geteblk returned NULL"); + + return (bp); +} + +void +nandfs_dirty_bufs_increment(struct nandfs_device *fsdev) +{ + + mtx_lock(&fsdev->nd_mutex); + KASSERT(fsdev->nd_dirty_bufs >= 0, ("negative nd_dirty_bufs")); + fsdev->nd_dirty_bufs++; + mtx_unlock(&fsdev->nd_mutex); +} + +void +nandfs_dirty_bufs_decrement(struct nandfs_device *fsdev) +{ + + mtx_lock(&fsdev->nd_mutex); + KASSERT(fsdev->nd_dirty_bufs > 0, + ("decrementing not-positive nd_dirty_bufs")); + fsdev->nd_dirty_bufs--; + mtx_unlock(&fsdev->nd_mutex); +} diff --git a/sys/fs/nandfs/nandfs_cleaner.c b/sys/fs/nandfs/nandfs_cleaner.c new file mode 100644 index 00000000000..b3d31356369 --- /dev/null +++ b/sys/fs/nandfs/nandfs_cleaner.c @@ -0,0 +1,620 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define NANDFS_CLEANER_KILL 1 + +static void nandfs_cleaner(struct nandfs_device *); +static int nandfs_cleaner_clean_segments(struct nandfs_device *, + struct nandfs_vinfo *, uint32_t, struct nandfs_period *, uint32_t, + struct nandfs_bdesc *, uint32_t, uint64_t *, uint32_t); + +static int +nandfs_process_bdesc(struct nandfs_device *nffsdev, struct nandfs_bdesc *bd, + uint64_t nmembs); + +static void +nandfs_wakeup_wait_cleaner(struct nandfs_device *fsdev, int reason) +{ + + mtx_lock(&fsdev->nd_clean_mtx); + if (reason == NANDFS_CLEANER_KILL) + fsdev->nd_cleaner_exit = 1; + if (fsdev->nd_cleaning == 0) { + fsdev->nd_cleaning = 1; + wakeup(&fsdev->nd_cleaning); + } + cv_wait(&fsdev->nd_clean_cv, &fsdev->nd_clean_mtx); + mtx_unlock(&fsdev->nd_clean_mtx); +} + +int +nandfs_start_cleaner(struct nandfs_device *fsdev) +{ + int error; + + MPASS(fsdev->nd_cleaner == NULL); + + fsdev->nd_cleaner_exit = 0; + + error = kthread_add((void(*)(void *))nandfs_cleaner, fsdev, NULL, + &fsdev->nd_cleaner, 0, 0, "nandfs_cleaner"); + if (error) + printf("nandfs: could not start cleaner: %d\n", error); + + return (error); +} + +int +nandfs_stop_cleaner(struct nandfs_device *fsdev) +{ + + MPASS(fsdev->nd_cleaner != NULL); + nandfs_wakeup_wait_cleaner(fsdev, NANDFS_CLEANER_KILL); + fsdev->nd_cleaner = NULL; + + DPRINTF(CLEAN, ("cleaner stopped\n")); + return (0); +} + +static int +nandfs_cleaner_finished(struct nandfs_device *fsdev) +{ + int exit; + + mtx_lock(&fsdev->nd_clean_mtx); + fsdev->nd_cleaning = 0; + if (!fsdev->nd_cleaner_exit) { + DPRINTF(CLEAN, ("%s: sleep\n", __func__)); + msleep(&fsdev->nd_cleaning, &fsdev->nd_clean_mtx, PRIBIO, "-", + hz * nandfs_cleaner_interval); + } + exit = fsdev->nd_cleaner_exit; + cv_broadcast(&fsdev->nd_clean_cv); + mtx_unlock(&fsdev->nd_clean_mtx); + if (exit) { + DPRINTF(CLEAN, ("%s: no longer active\n", __func__)); + return (1); + } + + return (0); +} + +static void +print_suinfo(struct nandfs_suinfo *suinfo, int nsegs) +{ + int i; + + for (i = 0; i < nsegs; i++) { + DPRINTF(CLEAN, ("%jx %jd %c%c%c %10u\n", + suinfo[i].nsi_num, suinfo[i].nsi_lastmod, + (suinfo[i].nsi_flags & + (NANDFS_SEGMENT_USAGE_ACTIVE) ? 'a' : '-'), + (suinfo[i].nsi_flags & + (NANDFS_SEGMENT_USAGE_DIRTY) ? 'd' : '-'), + (suinfo[i].nsi_flags & + (NANDFS_SEGMENT_USAGE_ERROR) ? 'e' : '-'), + suinfo[i].nsi_blocks)); + } +} + +static int +nandfs_cleaner_vblock_is_alive(struct nandfs_device *fsdev, + struct nandfs_vinfo *vinfo, struct nandfs_cpinfo *cp, uint32_t ncps) +{ + int64_t idx, min, max; + + if (vinfo->nvi_end >= fsdev->nd_last_cno) + return (1); + + if (ncps == 0) + return (0); + + if (vinfo->nvi_end < cp[0].nci_cno || + vinfo->nvi_start > cp[ncps - 1].nci_cno) + return (0); + + idx = min = 0; + max = ncps - 1; + while (min <= max) { + idx = (min + max) / 2; + if (vinfo->nvi_start == cp[idx].nci_cno) + return (1); + if (vinfo->nvi_start < cp[idx].nci_cno) + max = idx - 1; + else + min = idx + 1; + } + + return (vinfo->nvi_end >= cp[idx].nci_cno); +} + +static void +nandfs_cleaner_vinfo_mark_alive(struct nandfs_device *fsdev, + struct nandfs_vinfo *vinfo, uint32_t nmembs, struct nandfs_cpinfo *cp, + uint32_t ncps) +{ + uint32_t i; + + for (i = 0; i < nmembs; i++) + vinfo[i].nvi_alive = + nandfs_cleaner_vblock_is_alive(fsdev, &vinfo[i], cp, ncps); +} + +static int +nandfs_cleaner_bdesc_is_alive(struct nandfs_device *fsdev, + struct nandfs_bdesc *bdesc) +{ + int alive; + + alive = bdesc->bd_oblocknr == bdesc->bd_blocknr; + if (!alive) + MPASS(abs(bdesc->bd_oblocknr - bdesc->bd_blocknr) > 2); + + return (alive); +} + +static void +nandfs_cleaner_bdesc_mark_alive(struct nandfs_device *fsdev, + struct nandfs_bdesc *bdesc, uint32_t nmembs) +{ + uint32_t i; + + for (i = 0; i < nmembs; i++) + bdesc[i].bd_alive = nandfs_cleaner_bdesc_is_alive(fsdev, + &bdesc[i]); +} + +static void +nandfs_cleaner_iterate_psegment(struct nandfs_device *fsdev, + struct nandfs_segment_summary *segsum, union nandfs_binfo *binfo, + nandfs_daddr_t blk, struct nandfs_vinfo **vipp, struct nandfs_bdesc **bdpp) +{ + int i; + + DPRINTF(CLEAN, ("%s nbinfos %x\n", __func__, segsum->ss_nbinfos)); + for (i = 0; i < segsum->ss_nbinfos; i++) { + if (binfo[i].bi_v.bi_ino == NANDFS_DAT_INO) { + (*bdpp)->bd_oblocknr = blk + segsum->ss_nblocks - + segsum->ss_nbinfos + i; + /* + * XXX Hack + */ + if (segsum->ss_flags & NANDFS_SS_SR) + (*bdpp)->bd_oblocknr--; + (*bdpp)->bd_level = binfo[i].bi_dat.bi_level; + (*bdpp)->bd_offset = binfo[i].bi_dat.bi_blkoff; + (*bdpp)++; + } else { + (*vipp)->nvi_ino = binfo[i].bi_v.bi_ino; + (*vipp)->nvi_vblocknr = binfo[i].bi_v.bi_vblocknr; + (*vipp)++; + } + } +} + +static int +nandfs_cleaner_iterate_segment(struct nandfs_device *fsdev, uint64_t segno, + struct nandfs_vinfo **vipp, struct nandfs_bdesc **bdpp, int *select) +{ + struct nandfs_segment_summary *segsum; + union nandfs_binfo *binfo; + struct buf *bp; + uint32_t nblocks; + nandfs_daddr_t curr, start, end; + int error = 0; + + nandfs_get_segment_range(fsdev, segno, &start, &end); + + DPRINTF(CLEAN, ("%s: segno %jx start %jx end %jx\n", __func__, segno, + start, end)); + + *select = 0; + + for (curr = start; curr < end; curr += nblocks) { + error = nandfs_dev_bread(fsdev, curr, NOCRED, 0, &bp); + if (error) { + brelse(bp); + nandfs_error("%s: couldn't load segment summary of %jx: %d\n", + __func__, segno, error); + return (error); + } + + segsum = (struct nandfs_segment_summary *)bp->b_data; + binfo = (union nandfs_binfo *)(bp->b_data + segsum->ss_bytes); + + if (!nandfs_segsum_valid(segsum)) { + brelse(bp); + nandfs_error("nandfs: invalid summary of segment %jx\n", segno); + return (error); + } + + DPRINTF(CLEAN, ("%s: %jx magic %x bytes %x nblocks %x nbinfos " + "%x\n", __func__, segno, segsum->ss_magic, segsum->ss_bytes, + segsum->ss_nblocks, segsum->ss_nbinfos)); + + nandfs_cleaner_iterate_psegment(fsdev, segsum, binfo, curr, + vipp, bdpp); + nblocks = segsum->ss_nblocks; + brelse(bp); + } + + if (error == 0) + *select = 1; + + return (error); +} + +static int +nandfs_cleaner_choose_segment(struct nandfs_device *fsdev, uint64_t **segpp, + uint64_t nsegs, uint64_t *rseg) +{ + struct nandfs_suinfo *suinfo; + uint64_t i, ssegs; + int error; + + suinfo = malloc(sizeof(*suinfo) * nsegs, M_NANDFSTEMP, + M_ZERO | M_WAITOK); + + if (*rseg >= fsdev->nd_fsdata.f_nsegments) + *rseg = 0; + +retry: + error = nandfs_get_segment_info_filter(fsdev, suinfo, nsegs, *rseg, + &ssegs, NANDFS_SEGMENT_USAGE_DIRTY, + NANDFS_SEGMENT_USAGE_ACTIVE | NANDFS_SEGMENT_USAGE_ERROR | + NANDFS_SEGMENT_USAGE_GC); + if (error) { + nandfs_error("%s:%d", __FILE__, __LINE__); + goto out; + } + if (ssegs == 0 && *rseg != 0) { + *rseg = 0; + goto retry; + } + if (ssegs > 0) { + print_suinfo(suinfo, ssegs); + + for (i = 0; i < ssegs; i++) { + (**segpp) = suinfo[i].nsi_num; + (*segpp)++; + } + *rseg = suinfo[i - 1].nsi_num + 1; + } + +out: + free(suinfo, M_NANDFSTEMP); + return (error); +} + +static int +nandfs_cleaner_body(struct nandfs_device *fsdev, uint64_t *rseg) +{ + struct nandfs_vinfo *vinfo, *vip, *vipi; + struct nandfs_bdesc *bdesc, *bdp, *bdpi; + struct nandfs_cpstat cpstat; + struct nandfs_cpinfo *cpinfo = NULL; + uint64_t *segnums, *segp; + int select, selected; + int error = 0; + int nsegs; + int i; + + nsegs = nandfs_cleaner_segments; + + vip = vinfo = malloc(sizeof(*vinfo) * + fsdev->nd_fsdata.f_blocks_per_segment * nsegs, M_NANDFSTEMP, + M_ZERO | M_WAITOK); + bdp = bdesc = malloc(sizeof(*bdesc) * + fsdev->nd_fsdata.f_blocks_per_segment * nsegs, M_NANDFSTEMP, + M_ZERO | M_WAITOK); + segp = segnums = malloc(sizeof(*segnums) * nsegs, M_NANDFSTEMP, + M_WAITOK); + + error = nandfs_cleaner_choose_segment(fsdev, &segp, nsegs, rseg); + if (error) { + nandfs_error("%s:%d", __FILE__, __LINE__); + goto out; + } + + if (segnums == segp) + goto out; + + selected = 0; + for (i = 0; i < segp - segnums; i++) { + error = nandfs_cleaner_iterate_segment(fsdev, segnums[i], &vip, + &bdp, &select); + if (error) { + /* + * XXX deselect (see below)? + */ + goto out; + } + if (!select) + segnums[i] = NANDFS_NOSEGMENT; + else { + error = nandfs_markgc_segment(fsdev, segnums[i]); + if (error) { + nandfs_error("%s:%d\n", __FILE__, __LINE__); + goto out; + } + selected++; + } + } + + if (selected == 0) { + MPASS(vinfo == vip); + MPASS(bdesc == bdp); + goto out; + } + + error = nandfs_get_cpstat(fsdev->nd_cp_node, &cpstat); + if (error) { + nandfs_error("%s:%d\n", __FILE__, __LINE__); + goto out; + } + + if (cpstat.ncp_nss != 0) { + cpinfo = malloc(sizeof(struct nandfs_cpinfo) * cpstat.ncp_nss, + M_NANDFSTEMP, M_WAITOK); + error = nandfs_get_cpinfo(fsdev->nd_cp_node, 1, NANDFS_SNAPSHOT, + cpinfo, cpstat.ncp_nss, NULL); + if (error) { + nandfs_error("%s:%d\n", __FILE__, __LINE__); + goto out_locked; + } + } + + NANDFS_WRITELOCK(fsdev); + DPRINTF(CLEAN, ("%s: got lock\n", __func__)); + + error = nandfs_get_dat_vinfo(fsdev, vinfo, vip - vinfo); + if (error) { + nandfs_error("%s:%d\n", __FILE__, __LINE__); + goto out_locked; + } + + nandfs_cleaner_vinfo_mark_alive(fsdev, vinfo, vip - vinfo, cpinfo, + cpstat.ncp_nss); + + error = nandfs_get_dat_bdescs(fsdev, bdesc, bdp - bdesc); + if (error) { + nandfs_error("%s:%d\n", __FILE__, __LINE__); + goto out_locked; + } + + nandfs_cleaner_bdesc_mark_alive(fsdev, bdesc, bdp - bdesc); + + DPRINTF(CLEAN, ("got:\n")); + for (vipi = vinfo; vipi < vip; vipi++) { + DPRINTF(CLEAN, ("v ino %jx vblocknr %jx start %jx end %jx " + "alive %d\n", vipi->nvi_ino, vipi->nvi_vblocknr, + vipi->nvi_start, vipi->nvi_end, vipi->nvi_alive)); + } + for (bdpi = bdesc; bdpi < bdp; bdpi++) { + DPRINTF(CLEAN, ("b oblocknr %jx blocknr %jx offset %jx " + "alive %d\n", bdpi->bd_oblocknr, bdpi->bd_blocknr, + bdpi->bd_offset, bdpi->bd_alive)); + } + DPRINTF(CLEAN, ("end list\n")); + + error = nandfs_cleaner_clean_segments(fsdev, vinfo, vip - vinfo, NULL, + 0, bdesc, bdp - bdesc, segnums, segp - segnums); + if (error) + nandfs_error("%s:%d\n", __FILE__, __LINE__); + +out_locked: + NANDFS_WRITEUNLOCK(fsdev); +out: + free(cpinfo, M_NANDFSTEMP); + free(segnums, M_NANDFSTEMP); + free(bdesc, M_NANDFSTEMP); + free(vinfo, M_NANDFSTEMP); + + return (error); +} + +static void +nandfs_cleaner(struct nandfs_device *fsdev) +{ + uint64_t checked_seg = 0; + int error; + + while (!nandfs_cleaner_finished(fsdev)) { + if (!nandfs_cleaner_enable || rebooting) + continue; + + DPRINTF(CLEAN, ("%s: run started\n", __func__)); + + fsdev->nd_cleaning = 1; + + error = nandfs_cleaner_body(fsdev, &checked_seg); + + DPRINTF(CLEAN, ("%s: run finished error %d\n", __func__, + error)); + } + + DPRINTF(CLEAN, ("%s: exiting\n", __func__)); + kthread_exit(); +} + +static int +nandfs_cleaner_clean_segments(struct nandfs_device *nffsdev, + struct nandfs_vinfo *vinfo, uint32_t nvinfo, + struct nandfs_period *pd, uint32_t npd, + struct nandfs_bdesc *bdesc, uint32_t nbdesc, + uint64_t *segments, uint32_t nsegs) +{ + struct nandfs_node *gc; + struct buf *bp; + uint32_t i; + int error = 0; + + gc = nffsdev->nd_gc_node; + + DPRINTF(CLEAN, ("%s: enter\n", __func__)); + + VOP_LOCK(NTOV(gc), LK_EXCLUSIVE); + for (i = 0; i < nvinfo; i++) { + if (!vinfo[i].nvi_alive) + continue; + DPRINTF(CLEAN, ("%s: read vblknr:%#jx blk:%#jx\n", + __func__, (uintmax_t)vinfo[i].nvi_vblocknr, + (uintmax_t)vinfo[i].nvi_blocknr)); + error = nandfs_bread(nffsdev->nd_gc_node, vinfo[i].nvi_blocknr, + NULL, 0, &bp); + if (error) { + nandfs_error("%s:%d", __FILE__, __LINE__); + VOP_UNLOCK(NTOV(gc), 0); + goto out; + } + nandfs_vblk_set(bp, vinfo[i].nvi_vblocknr); + nandfs_buf_set(bp, NANDFS_VBLK_ASSIGNED); + nandfs_dirty_buf(bp, 1); + } + VOP_UNLOCK(NTOV(gc), 0); + + /* Delete checkpoints */ + for (i = 0; i < npd; i++) { + DPRINTF(CLEAN, ("delete checkpoint: %jx\n", + (uintmax_t)pd[i].p_start)); + error = nandfs_delete_cp(nffsdev->nd_cp_node, pd[i].p_start, + pd[i].p_end); + if (error) { + nandfs_error("%s:%d", __FILE__, __LINE__); + goto out; + } + } + + /* Update vblocks */ + for (i = 0; i < nvinfo; i++) { + if (vinfo[i].nvi_alive) + continue; + DPRINTF(CLEAN, ("freeing vblknr: %jx\n", vinfo[i].nvi_vblocknr)); + error = nandfs_vblock_free(nffsdev, vinfo[i].nvi_vblocknr); + if (error) { + nandfs_error("%s:%d", __FILE__, __LINE__); + goto out; + } + } + + error = nandfs_process_bdesc(nffsdev, bdesc, nbdesc); + if (error) { + nandfs_error("%s:%d", __FILE__, __LINE__); + goto out; + } + + /* Add segments to clean */ + if (nffsdev->nd_free_count) { + nffsdev->nd_free_base = realloc(nffsdev->nd_free_base, + (nffsdev->nd_free_count + nsegs) * sizeof(uint64_t), + M_NANDFSTEMP, M_WAITOK | M_ZERO); + memcpy(&nffsdev->nd_free_base[nffsdev->nd_free_count], segments, + nsegs * sizeof(uint64_t)); + nffsdev->nd_free_count += nsegs; + } else { + nffsdev->nd_free_base = malloc(nsegs * sizeof(uint64_t), + M_NANDFSTEMP, M_WAITOK|M_ZERO); + memcpy(nffsdev->nd_free_base, segments, + nsegs * sizeof(uint64_t)); + nffsdev->nd_free_count = nsegs; + } + +out: + + DPRINTF(CLEAN, ("%s: exit error %d\n", __func__, error)); + + return (error); +} + +static int +nandfs_process_bdesc(struct nandfs_device *nffsdev, struct nandfs_bdesc *bd, + uint64_t nmembs) +{ + struct nandfs_node *dat_node; + struct buf *bp; + uint64_t i; + int error; + + dat_node = nffsdev->nd_dat_node; + + VOP_LOCK(NTOV(dat_node), LK_EXCLUSIVE); + + for (i = 0; i < nmembs; i++) { + if (!bd[i].bd_alive) + continue; + DPRINTF(CLEAN, ("%s: idx %jx offset %jx\n", + __func__, i, bd[i].bd_offset)); + if (bd[i].bd_level) { + error = nandfs_bread_meta(dat_node, bd[i].bd_offset, + NULL, 0, &bp); + if (error) { + nandfs_error("%s: cannot read dat node " + "level:%d\n", __func__, bd[i].bd_level); + brelse(bp); + VOP_UNLOCK(NTOV(dat_node), 0); + return (error); + } + nandfs_dirty_buf_meta(bp, 1); + nandfs_bmap_dirty_blocks(VTON(bp->b_vp), bp, 1); + } else { + error = nandfs_bread(dat_node, bd[i].bd_offset, NULL, + 0, &bp); + if (error) { + nandfs_error("%s: cannot read dat node\n", + __func__); + brelse(bp); + VOP_UNLOCK(NTOV(dat_node), 0); + return (error); + } + nandfs_dirty_buf(bp, 1); + } + DPRINTF(CLEAN, ("%s: bp: %p\n", __func__, bp)); + } + + VOP_UNLOCK(NTOV(dat_node), 0); + + return (0); +} diff --git a/sys/fs/nandfs/nandfs_cpfile.c b/sys/fs/nandfs/nandfs_cpfile.c new file mode 100644 index 00000000000..8814fc053ce --- /dev/null +++ b/sys/fs/nandfs/nandfs_cpfile.c @@ -0,0 +1,776 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "nandfs_mount.h" +#include "nandfs.h" +#include "nandfs_subr.h" + + +static int +nandfs_checkpoint_size(struct nandfs_device *fsdev) +{ + + return (fsdev->nd_fsdata.f_checkpoint_size); +} + +static int +nandfs_checkpoint_blk_offset(struct nandfs_device *fsdev, uint64_t cn, + uint64_t *blk, uint64_t *offset) +{ + uint64_t off; + uint16_t cp_size, cp_per_blk; + + KASSERT((cn), ("checkpoing cannot be zero")); + + cp_size = fsdev->nd_fsdata.f_checkpoint_size; + cp_per_blk = fsdev->nd_blocksize / cp_size; + off = roundup(sizeof(struct nandfs_cpfile_header), cp_size) / cp_size; + off += (cn - 1); + + *blk = off / cp_per_blk; + *offset = (off % cp_per_blk) * cp_size; + + return (0); +} + +static int +nandfs_checkpoint_blk_remaining(struct nandfs_device *fsdev, uint64_t cn, + uint64_t blk, uint64_t offset) +{ + uint16_t cp_size, cp_remaining; + + cp_size = fsdev->nd_fsdata.f_checkpoint_size; + cp_remaining = (fsdev->nd_blocksize - offset) / cp_size; + + return (cp_remaining); +} + +int +nandfs_get_checkpoint(struct nandfs_device *fsdev, struct nandfs_node *cp_node, + uint64_t cn) +{ + struct buf *bp; + uint64_t blk, offset; + int error; + + if (cn != fsdev->nd_last_cno && cn != (fsdev->nd_last_cno + 1)) { + return (-1); + } + + error = nandfs_bread(cp_node, 0, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (-1); + } + + error = nandfs_dirty_buf(bp, 0); + if (error) + return (-1); + + + nandfs_checkpoint_blk_offset(fsdev, cn, &blk, &offset); + + if (blk != 0) { + if (blk < cp_node->nn_inode.i_blocks) + error = nandfs_bread(cp_node, blk, NOCRED, 0, &bp); + else + error = nandfs_bcreate(cp_node, blk, NOCRED, 0, &bp); + if (error) { + if (bp) + brelse(bp); + return (-1); + } + + nandfs_dirty_buf(bp, 1); + } + + DPRINTF(CPFILE, ("%s: cn:%#jx entry block:%#jx offset:%#jx\n", + __func__, (uintmax_t)cn, (uintmax_t)blk, (uintmax_t)offset)); + + return (0); +} + +int +nandfs_set_checkpoint(struct nandfs_device *fsdev, struct nandfs_node *cp_node, + uint64_t cn, struct nandfs_inode *ifile_inode, uint64_t nblocks) +{ + struct nandfs_cpfile_header *cnh; + struct nandfs_checkpoint *cnp; + struct buf *bp; + uint64_t blk, offset; + int error; + + if (cn != fsdev->nd_last_cno && cn != (fsdev->nd_last_cno + 1)) { + nandfs_error("%s: trying to set invalid chekpoint %jx - %jx\n", + __func__, cn, fsdev->nd_last_cno); + return (-1); + } + + error = nandfs_bread(cp_node, 0, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return error; + } + + cnh = (struct nandfs_cpfile_header *) bp->b_data; + cnh->ch_ncheckpoints++; + + nandfs_checkpoint_blk_offset(fsdev, cn, &blk, &offset); + + if(blk != 0) { + brelse(bp); + error = nandfs_bread(cp_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return error; + } + } + + cnp = (struct nandfs_checkpoint *)((uint8_t *)bp->b_data + offset); + cnp->cp_flags = 0; + cnp->cp_checkpoints_count = 1; + memset(&cnp->cp_snapshot_list, 0, sizeof(struct nandfs_snapshot_list)); + cnp->cp_cno = cn; + cnp->cp_create = fsdev->nd_ts.tv_sec; + cnp->cp_nblk_inc = nblocks; + cnp->cp_blocks_count = 0; + memcpy (&cnp->cp_ifile_inode, ifile_inode, sizeof(cnp->cp_ifile_inode)); + + DPRINTF(CPFILE, ("%s: cn:%#jx ctime:%#jx nblk:%#jx\n", + __func__, (uintmax_t)cn, (uintmax_t)cnp->cp_create, + (uintmax_t)nblocks)); + + brelse(bp); + return (0); +} + +static int +nandfs_cp_mounted(struct nandfs_device *nandfsdev, uint64_t cno) +{ + struct nandfsmount *nmp; + int mounted = 0; + + mtx_lock(&nandfsdev->nd_mutex); + /* No double-mounting of the same checkpoint */ + STAILQ_FOREACH(nmp, &nandfsdev->nd_mounts, nm_next_mount) { + if (nmp->nm_mount_args.cpno == cno) { + mounted = 1; + break; + } + } + mtx_unlock(&nandfsdev->nd_mutex); + + return (mounted); +} + +static int +nandfs_cp_set_snapshot(struct nandfs_node *cp_node, uint64_t cno) +{ + struct nandfs_device *fsdev; + struct nandfs_cpfile_header *cnh; + struct nandfs_checkpoint *cnp; + struct nandfs_snapshot_list *list; + struct buf *bp; + uint64_t blk, prev_blk, offset; + uint64_t curr, prev; + int error; + + fsdev = cp_node->nn_nandfsdev; + + /* Get snapshot data */ + nandfs_checkpoint_blk_offset(fsdev, cno, &blk, &offset); + error = nandfs_bread(cp_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + cnp = (struct nandfs_checkpoint *)(bp->b_data + offset); + if (cnp->cp_flags & NANDFS_CHECKPOINT_INVALID) { + brelse(bp); + return (ENOENT); + } + if ((cnp->cp_flags & NANDFS_CHECKPOINT_SNAPSHOT)) { + brelse(bp); + return (EINVAL); + } + + brelse(bp); + /* Get list from header */ + error = nandfs_bread(cp_node, 0, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + + cnh = (struct nandfs_cpfile_header *) bp->b_data; + list = &cnh->ch_snapshot_list; + prev = list->ssl_prev; + brelse(bp); + prev_blk = ~(0); + curr = 0; + while (prev > cno) { + curr = prev; + nandfs_checkpoint_blk_offset(fsdev, prev, &prev_blk, &offset); + error = nandfs_bread(cp_node, prev_blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + cnp = (struct nandfs_checkpoint *)(bp->b_data + offset); + list = &cnp->cp_snapshot_list; + prev = list->ssl_prev; + brelse(bp); + } + + if (curr == 0) { + nandfs_bread(cp_node, 0, NOCRED, 0, &bp); + cnh = (struct nandfs_cpfile_header *) bp->b_data; + list = &cnh->ch_snapshot_list; + } else { + nandfs_checkpoint_blk_offset(fsdev, curr, &blk, &offset); + error = nandfs_bread(cp_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + cnp = (struct nandfs_checkpoint *)(bp->b_data + offset); + list = &cnp->cp_snapshot_list; + } + + list->ssl_prev = cno; + error = nandfs_dirty_buf(bp, 0); + if (error) + return (error); + + + /* Update snapshot for cno */ + nandfs_checkpoint_blk_offset(fsdev, cno, &blk, &offset); + error = nandfs_bread(cp_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + cnp = (struct nandfs_checkpoint *)(bp->b_data + offset); + list = &cnp->cp_snapshot_list; + list->ssl_prev = prev; + list->ssl_next = curr; + cnp->cp_flags |= NANDFS_CHECKPOINT_SNAPSHOT; + nandfs_dirty_buf(bp, 1); + + if (prev == 0) { + nandfs_bread(cp_node, 0, NOCRED, 0, &bp); + cnh = (struct nandfs_cpfile_header *) bp->b_data; + list = &cnh->ch_snapshot_list; + } else { + /* Update snapshot list for prev */ + nandfs_checkpoint_blk_offset(fsdev, prev, &blk, &offset); + error = nandfs_bread(cp_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + cnp = (struct nandfs_checkpoint *)(bp->b_data + offset); + list = &cnp->cp_snapshot_list; + } + list->ssl_next = cno; + nandfs_dirty_buf(bp, 1); + + /* Update header */ + error = nandfs_bread(cp_node, 0, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + cnh = (struct nandfs_cpfile_header *) bp->b_data; + cnh->ch_nsnapshots++; + nandfs_dirty_buf(bp, 1); + + return (0); +} + +static int +nandfs_cp_clr_snapshot(struct nandfs_node *cp_node, uint64_t cno) +{ + struct nandfs_device *fsdev; + struct nandfs_cpfile_header *cnh; + struct nandfs_checkpoint *cnp; + struct nandfs_snapshot_list *list; + struct buf *bp; + uint64_t blk, offset, snapshot_cnt; + uint64_t next, prev; + int error; + + fsdev = cp_node->nn_nandfsdev; + + /* Get snapshot data */ + nandfs_checkpoint_blk_offset(fsdev, cno, &blk, &offset); + error = nandfs_bread(cp_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + cnp = (struct nandfs_checkpoint *)(bp->b_data + offset); + if (cnp->cp_flags & NANDFS_CHECKPOINT_INVALID) { + brelse(bp); + return (ENOENT); + } + if (!(cnp->cp_flags & NANDFS_CHECKPOINT_SNAPSHOT)) { + brelse(bp); + return (EINVAL); + } + + list = &cnp->cp_snapshot_list; + next = list->ssl_next; + prev = list->ssl_prev; + brelse(bp); + + /* Get previous snapshot */ + if (prev != 0) { + nandfs_checkpoint_blk_offset(fsdev, prev, &blk, &offset); + error = nandfs_bread(cp_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + cnp = (struct nandfs_checkpoint *)(bp->b_data + offset); + list = &cnp->cp_snapshot_list; + } else { + nandfs_bread(cp_node, 0, NOCRED, 0, &bp); + cnh = (struct nandfs_cpfile_header *) bp->b_data; + list = &cnh->ch_snapshot_list; + } + + list->ssl_next = next; + error = nandfs_dirty_buf(bp, 0); + if (error) + return (error); + + /* Get next snapshot */ + if (next != 0) { + nandfs_checkpoint_blk_offset(fsdev, next, &blk, &offset); + error = nandfs_bread(cp_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + cnp = (struct nandfs_checkpoint *)(bp->b_data + offset); + list = &cnp->cp_snapshot_list; + } else { + nandfs_bread(cp_node, 0, NOCRED, 0, &bp); + cnh = (struct nandfs_cpfile_header *) bp->b_data; + list = &cnh->ch_snapshot_list; + } + list->ssl_prev = prev; + nandfs_dirty_buf(bp, 1); + + /* Update snapshot list for cno */ + nandfs_checkpoint_blk_offset(fsdev, cno, &blk, &offset); + error = nandfs_bread(cp_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + cnp = (struct nandfs_checkpoint *)(bp->b_data + offset); + list = &cnp->cp_snapshot_list; + list->ssl_prev = 0; + list->ssl_next = 0; + cnp->cp_flags &= !NANDFS_CHECKPOINT_SNAPSHOT; + nandfs_dirty_buf(bp, 1); + + /* Update header */ + error = nandfs_bread(cp_node, 0, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + cnh = (struct nandfs_cpfile_header *) bp->b_data; + snapshot_cnt = cnh->ch_nsnapshots; + snapshot_cnt--; + cnh->ch_nsnapshots = snapshot_cnt; + nandfs_dirty_buf(bp, 1); + + return (0); +} + +int +nandfs_chng_cpmode(struct nandfs_node *node, struct nandfs_cpmode *ncpm) +{ + struct nandfs_device *fsdev; + uint64_t cno = ncpm->ncpm_cno; + int mode = ncpm->ncpm_mode; + int ret; + + fsdev = node->nn_nandfsdev; + VOP_LOCK(NTOV(node), LK_EXCLUSIVE); + switch (mode) { + case NANDFS_CHECKPOINT: + if (nandfs_cp_mounted(fsdev, cno)) { + ret = EBUSY; + } else + ret = nandfs_cp_clr_snapshot(node, cno); + break; + case NANDFS_SNAPSHOT: + ret = nandfs_cp_set_snapshot(node, cno); + break; + default: + ret = EINVAL; + break; + } + VOP_UNLOCK(NTOV(node), 0); + + return (ret); +} + +static void +nandfs_cpinfo_fill(struct nandfs_checkpoint *cnp, struct nandfs_cpinfo *nci) +{ + + nci->nci_flags = cnp->cp_flags; + nci->nci_pad = 0; + nci->nci_cno = cnp->cp_cno; + nci->nci_create = cnp->cp_create; + nci->nci_nblk_inc = cnp->cp_nblk_inc; + nci->nci_blocks_count = cnp->cp_blocks_count; + nci->nci_next = cnp->cp_snapshot_list.ssl_next; + DPRINTF(CPFILE, ("%s: cn:%#jx ctime:%#jx\n", + __func__, (uintmax_t)cnp->cp_cno, + (uintmax_t)cnp->cp_create)); +} + +static int +nandfs_get_cpinfo_cp(struct nandfs_node *node, uint64_t cno, + struct nandfs_cpinfo *nci, uint32_t mnmembs, uint32_t *nmembs) +{ + struct nandfs_device *fsdev; + struct buf *bp; + uint64_t blk, offset, last_cno, i; + uint16_t remaining; + int error; +#ifdef INVARIANTS + uint64_t testblk, testoffset; +#endif + + if (cno == 0) { + return (ENOENT); + } + + if (mnmembs < 1) { + return (EINVAL); + } + + fsdev = node->nn_nandfsdev; + last_cno = fsdev->nd_last_cno; + DPRINTF(CPFILE, ("%s: cno:%#jx mnmembs: %#jx last:%#jx\n", __func__, + (uintmax_t)cno, (uintmax_t)mnmembs, + (uintmax_t)fsdev->nd_last_cno)); + + /* + * do { + * get block + * read checkpoints until we hit last checkpoint, end of block or + * requested number + * } while (last read checkpoint <= last checkpoint on fs && + * read checkpoints < request number); + */ + *nmembs = i = 0; + do { + nandfs_checkpoint_blk_offset(fsdev, cno, &blk, &offset); + remaining = nandfs_checkpoint_blk_remaining(fsdev, cno, + blk, offset); + error = nandfs_bread(node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + + while (cno <= last_cno && i < mnmembs && remaining) { +#ifdef INVARIANTS + nandfs_checkpoint_blk_offset(fsdev, cno, &testblk, + &testoffset); + KASSERT(testblk == blk, ("testblk != blk")); + KASSERT(testoffset == offset, ("testoffset != offset")); +#endif + DPRINTF(CPFILE, ("%s: cno %#jx\n", __func__, + (uintmax_t)cno)); + + nandfs_cpinfo_fill((struct nandfs_checkpoint *) + (bp->b_data + offset), nci); + offset += nandfs_checkpoint_size(fsdev); + i++; + nci++; + cno++; + (*nmembs)++; + remaining--; + } + brelse(bp); + } while (cno <= last_cno && i < mnmembs); + + return (0); +} + +static int +nandfs_get_cpinfo_sp(struct nandfs_node *node, uint64_t cno, + struct nandfs_cpinfo *nci, uint32_t mnmembs, uint32_t *nmembs) +{ + struct nandfs_checkpoint *cnp; + struct nandfs_cpfile_header *cnh; + struct nandfs_device *fsdev; + struct buf *bp = NULL; + uint64_t curr = 0; + uint64_t blk, offset, curr_cno; + uint32_t flag; + int i, error; + + if (cno == 0 || cno == ~(0)) + return (ENOENT); + + fsdev = node->nn_nandfsdev; + curr_cno = cno; + + if (nmembs) + *nmembs = 0; + if (curr_cno == 1) { + /* Get list from header */ + error = nandfs_bread(node, 0, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + cnh = (struct nandfs_cpfile_header *) bp->b_data; + curr_cno = cnh->ch_snapshot_list.ssl_next; + brelse(bp); + bp = NULL; + + /* No snapshots */ + if (curr_cno == 0) + return (0); + } + + for (i = 0; i < mnmembs; i++, nci++) { + nandfs_checkpoint_blk_offset(fsdev, curr_cno, &blk, &offset); + if (i == 0 || curr != blk) { + if (bp) + brelse(bp); + error = nandfs_bread(node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (ENOENT); + } + curr = blk; + } + cnp = (struct nandfs_checkpoint *)(bp->b_data + offset); + flag = cnp->cp_flags; + if (!(flag & NANDFS_CHECKPOINT_SNAPSHOT) || + (flag & NANDFS_CHECKPOINT_INVALID)) + break; + + nci->nci_flags = flag; + nci->nci_pad = 0; + nci->nci_cno = cnp->cp_cno; + nci->nci_create = cnp->cp_create; + nci->nci_nblk_inc = cnp->cp_nblk_inc; + nci->nci_blocks_count = cnp->cp_blocks_count; + nci->nci_next = cnp->cp_snapshot_list.ssl_next; + if (nmembs) + (*nmembs)++; + + curr_cno = nci->nci_next; + if (!curr_cno) + break; + } + + brelse(bp); + + return (0); +} + +int +nandfs_get_cpinfo(struct nandfs_node *node, uint64_t cno, uint16_t flags, + struct nandfs_cpinfo *nci, uint32_t nmembs, uint32_t *nnmembs) +{ + int error; + + VOP_LOCK(NTOV(node), LK_EXCLUSIVE); + switch (flags) { + case NANDFS_CHECKPOINT: + error = nandfs_get_cpinfo_cp(node, cno, nci, nmembs, nnmembs); + break; + case NANDFS_SNAPSHOT: + error = nandfs_get_cpinfo_sp(node, cno, nci, nmembs, nnmembs); + break; + default: + error = EINVAL; + break; + } + VOP_UNLOCK(NTOV(node), 0); + + return (error); +} + +int +nandfs_get_cpinfo_ioctl(struct nandfs_node *node, struct nandfs_argv *nargv) +{ + struct nandfs_cpinfo *nci; + uint64_t cno = nargv->nv_index; + void *buf = (void *)((uintptr_t)nargv->nv_base); + uint16_t flags = nargv->nv_flags; + uint32_t nmembs = 0; + int error; + + if (nargv->nv_nmembs > NANDFS_CPINFO_MAX) + return (EINVAL); + + nci = malloc(sizeof(struct nandfs_cpinfo) * nargv->nv_nmembs, + M_NANDFSTEMP, M_WAITOK | M_ZERO); + + error = nandfs_get_cpinfo(node, cno, flags, nci, nargv->nv_nmembs, &nmembs); + + if (error == 0) { + nargv->nv_nmembs = nmembs; + error = copyout(nci, buf, + sizeof(struct nandfs_cpinfo) * nmembs); + } + + free(nci, M_NANDFSTEMP); + return (error); +} + +int +nandfs_delete_cp(struct nandfs_node *node, uint64_t start, uint64_t end) +{ + struct nandfs_checkpoint *cnp; + struct nandfs_device *fsdev; + struct buf *bp; + uint64_t cno = start, blk, offset; + int error; + + DPRINTF(CPFILE, ("%s: delete cno %jx-%jx\n", __func__, start, end)); + VOP_LOCK(NTOV(node), LK_EXCLUSIVE); + fsdev = node->nn_nandfsdev; + for (cno = start; cno <= end; cno++) { + if (!cno) + continue; + + nandfs_checkpoint_blk_offset(fsdev, cno, &blk, &offset); + error = nandfs_bread(node, blk, NOCRED, 0, &bp); + if (error) { + VOP_UNLOCK(NTOV(node), 0); + brelse(bp); + return (error); + } + + cnp = (struct nandfs_checkpoint *)(bp->b_data + offset); + if (cnp->cp_flags & NANDFS_CHECKPOINT_SNAPSHOT) { + brelse(bp); + VOP_UNLOCK(NTOV(node), 0); + return (0); + } + + cnp->cp_flags |= NANDFS_CHECKPOINT_INVALID; + + error = nandfs_dirty_buf(bp, 0); + if (error) + return (error); + } + VOP_UNLOCK(NTOV(node), 0); + + return (0); +} + +int +nandfs_make_snap(struct nandfs_device *fsdev, uint64_t *cno) +{ + struct nandfs_cpmode cpm; + int error; + + *cno = cpm.ncpm_cno = fsdev->nd_last_cno; + cpm.ncpm_mode = NANDFS_SNAPSHOT; + error = nandfs_chng_cpmode(fsdev->nd_cp_node, &cpm); + return (error); +} + +int +nandfs_delete_snap(struct nandfs_device *fsdev, uint64_t cno) +{ + struct nandfs_cpmode cpm; + int error; + + cpm.ncpm_cno = cno; + cpm.ncpm_mode = NANDFS_CHECKPOINT; + error = nandfs_chng_cpmode(fsdev->nd_cp_node, &cpm); + return (error); +} + +int nandfs_get_cpstat(struct nandfs_node *cp_node, struct nandfs_cpstat *ncp) +{ + struct nandfs_device *fsdev; + struct nandfs_cpfile_header *cnh; + struct buf *bp; + int error; + + VOP_LOCK(NTOV(cp_node), LK_EXCLUSIVE); + fsdev = cp_node->nn_nandfsdev; + + /* Get header */ + error = nandfs_bread(cp_node, 0, NOCRED, 0, &bp); + if (error) { + brelse(bp); + VOP_UNLOCK(NTOV(cp_node), 0); + return (error); + } + cnh = (struct nandfs_cpfile_header *) bp->b_data; + ncp->ncp_cno = fsdev->nd_last_cno; + ncp->ncp_ncps = cnh->ch_ncheckpoints; + ncp->ncp_nss = cnh->ch_nsnapshots; + DPRINTF(CPFILE, ("%s: cno:%#jx ncps:%#jx nss:%#jx\n", + __func__, ncp->ncp_cno, ncp->ncp_ncps, ncp->ncp_nss)); + brelse(bp); + VOP_UNLOCK(NTOV(cp_node), 0); + + return (0); +} diff --git a/sys/fs/nandfs/nandfs_dat.c b/sys/fs/nandfs/nandfs_dat.c new file mode 100644 index 00000000000..799113db780 --- /dev/null +++ b/sys/fs/nandfs/nandfs_dat.c @@ -0,0 +1,344 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +int +nandfs_vblock_alloc(struct nandfs_device *nandfsdev, nandfs_daddr_t *vblock) +{ + struct nandfs_node *dat; + struct nandfs_mdt *mdt; + struct nandfs_alloc_request req; + struct nandfs_dat_entry *dat_entry; + uint64_t start; + uint32_t entry; + int locked, error; + + dat = nandfsdev->nd_dat_node; + mdt = &nandfsdev->nd_dat_mdt; + start = nandfsdev->nd_last_cno + 1; + + locked = NANDFS_VOP_ISLOCKED(NTOV(dat)); + if (!locked) + VOP_LOCK(NTOV(dat), LK_EXCLUSIVE); + req.entrynum = 0; + + /* Alloc vblock number */ + error = nandfs_find_free_entry(mdt, dat, &req); + if (error) { + nandfs_error("%s: cannot find free vblk entry\n", + __func__); + if (!locked) + VOP_UNLOCK(NTOV(dat), 0); + return (error); + } + + /* Read/create buffer */ + error = nandfs_get_entry_block(mdt, dat, &req, &entry, 1); + if (error) { + nandfs_error("%s: cannot get free vblk entry\n", + __func__); + nandfs_abort_entry(&req); + if (!locked) + VOP_UNLOCK(NTOV(dat), 0); + return (error); + } + + /* Fill out vblock data */ + dat_entry = (struct nandfs_dat_entry *) req.bp_entry->b_data; + dat_entry[entry].de_start = start; + dat_entry[entry].de_end = UINTMAX_MAX; + dat_entry[entry].de_blocknr = 0; + + /* Commit allocation */ + error = nandfs_alloc_entry(mdt, &req); + if (error) { + nandfs_error("%s: cannot get free vblk entry\n", + __func__); + if (!locked) + VOP_UNLOCK(NTOV(dat), 0); + return (error); + } + + /* Return allocated vblock */ + *vblock = req.entrynum; + DPRINTF(DAT, ("%s: allocated vblock %#jx\n", + __func__, (uintmax_t)*vblock)); + + if (!locked) + VOP_UNLOCK(NTOV(dat), 0); + return (error); +} + +int +nandfs_vblock_assign(struct nandfs_device *nandfsdev, nandfs_daddr_t vblock, + nandfs_lbn_t block) +{ + struct nandfs_node *dat; + struct nandfs_mdt *mdt; + struct nandfs_alloc_request req; + struct nandfs_dat_entry *dat_entry; + uint32_t entry; + int locked, error; + + dat = nandfsdev->nd_dat_node; + mdt = &nandfsdev->nd_dat_mdt; + + locked = NANDFS_VOP_ISLOCKED(NTOV(dat)); + if (!locked) + VOP_LOCK(NTOV(dat), LK_EXCLUSIVE); + req.entrynum = vblock; + + error = nandfs_get_entry_block(mdt, dat, &req, &entry, 0); + if (!error) { + dat_entry = (struct nandfs_dat_entry *) req.bp_entry->b_data; + dat_entry[entry].de_blocknr = block; + + DPRINTF(DAT, ("%s: assing vblock %jx->%jx\n", + __func__, (uintmax_t)vblock, (uintmax_t)block)); + + /* + * It is mostly called from syncer() so + * we want to force making buf dirty + */ + error = nandfs_dirty_buf(req.bp_entry, 1); + } + + if (!locked) + VOP_UNLOCK(NTOV(dat), 0); + + return (error); +} + +int +nandfs_vblock_end(struct nandfs_device *nandfsdev, nandfs_daddr_t vblock) +{ + struct nandfs_node *dat; + struct nandfs_mdt *mdt; + struct nandfs_alloc_request req; + struct nandfs_dat_entry *dat_entry; + uint64_t end; + uint32_t entry; + int locked, error; + + dat = nandfsdev->nd_dat_node; + mdt = &nandfsdev->nd_dat_mdt; + end = nandfsdev->nd_last_cno; + + locked = NANDFS_VOP_ISLOCKED(NTOV(dat)); + if (!locked) + VOP_LOCK(NTOV(dat), LK_EXCLUSIVE); + req.entrynum = vblock; + + error = nandfs_get_entry_block(mdt, dat, &req, &entry, 0); + if (!error) { + dat_entry = (struct nandfs_dat_entry *) req.bp_entry->b_data; + dat_entry[entry].de_end = end; + DPRINTF(DAT, ("%s: end vblock %#jx at checkpoint %#jx\n", + __func__, (uintmax_t)vblock, (uintmax_t)end)); + + /* + * It is mostly called from syncer() so + * we want to force making buf dirty + */ + error = nandfs_dirty_buf(req.bp_entry, 1); + } + + if (!locked) + VOP_UNLOCK(NTOV(dat), 0); + + return (error); +} + +int +nandfs_vblock_free(struct nandfs_device *nandfsdev, nandfs_daddr_t vblock) +{ + struct nandfs_node *dat; + struct nandfs_mdt *mdt; + struct nandfs_alloc_request req; + int error; + + dat = nandfsdev->nd_dat_node; + mdt = &nandfsdev->nd_dat_mdt; + + VOP_LOCK(NTOV(dat), LK_EXCLUSIVE); + req.entrynum = vblock; + + error = nandfs_find_entry(mdt, dat, &req); + if (!error) { + DPRINTF(DAT, ("%s: vblk %#jx\n", __func__, (uintmax_t)vblock)); + nandfs_free_entry(mdt, &req); + } + + VOP_UNLOCK(NTOV(dat), 0); + return (error); +} + +int +nandfs_get_dat_vinfo_ioctl(struct nandfs_device *nandfsdev, struct nandfs_argv *nargv) +{ + struct nandfs_vinfo *vinfo; + size_t size; + int error; + + if (nargv->nv_nmembs > NANDFS_VINFO_MAX) + return (EINVAL); + + size = sizeof(struct nandfs_vinfo) * nargv->nv_nmembs; + vinfo = malloc(size, M_NANDFSTEMP, M_WAITOK|M_ZERO); + + error = copyin((void *)(uintptr_t)nargv->nv_base, vinfo, size); + if (error) { + free(vinfo, M_NANDFSTEMP); + return (error); + } + + error = nandfs_get_dat_vinfo(nandfsdev, vinfo, nargv->nv_nmembs); + if (error == 0) + error = copyout(vinfo, (void *)(uintptr_t)nargv->nv_base, size); + free(vinfo, M_NANDFSTEMP); + return (error); +} + +int +nandfs_get_dat_vinfo(struct nandfs_device *nandfsdev, struct nandfs_vinfo *vinfo, + uint32_t nmembs) +{ + struct nandfs_node *dat; + struct nandfs_mdt *mdt; + struct nandfs_alloc_request req; + struct nandfs_dat_entry *dat_entry; + uint32_t i, idx; + int error = 0; + + dat = nandfsdev->nd_dat_node; + mdt = &nandfsdev->nd_dat_mdt; + + DPRINTF(DAT, ("%s: nmembs %#x\n", __func__, nmembs)); + + VOP_LOCK(NTOV(dat), LK_EXCLUSIVE); + + for (i = 0; i < nmembs; i++) { + req.entrynum = vinfo[i].nvi_vblocknr; + + error = nandfs_get_entry_block(mdt, dat,&req, &idx, 0); + if (error) + break; + + dat_entry = ((struct nandfs_dat_entry *) req.bp_entry->b_data); + vinfo[i].nvi_start = dat_entry[idx].de_start; + vinfo[i].nvi_end = dat_entry[idx].de_end; + vinfo[i].nvi_blocknr = dat_entry[idx].de_blocknr; + + DPRINTF(DAT, ("%s: vinfo: %jx[%jx-%jx]->%jx\n", + __func__, vinfo[i].nvi_vblocknr, vinfo[i].nvi_start, + vinfo[i].nvi_end, vinfo[i].nvi_blocknr)); + + brelse(req.bp_entry); + } + + VOP_UNLOCK(NTOV(dat), 0); + return (error); +} + +int +nandfs_get_dat_bdescs_ioctl(struct nandfs_device *nffsdev, + struct nandfs_argv *nargv) +{ + struct nandfs_bdesc *bd; + size_t size; + int error; + + size = nargv->nv_nmembs * sizeof(struct nandfs_bdesc); + bd = malloc(size, M_NANDFSTEMP, M_WAITOK); + error = copyin((void *)(uintptr_t)nargv->nv_base, bd, size); + if (error) { + free(bd, M_NANDFSTEMP); + return (error); + } + + error = nandfs_get_dat_bdescs(nffsdev, bd, nargv->nv_nmembs); + + if (error == 0) + error = copyout(bd, (void *)(uintptr_t)nargv->nv_base, size); + + free(bd, M_NANDFSTEMP); + return (error); +} + +int +nandfs_get_dat_bdescs(struct nandfs_device *nffsdev, struct nandfs_bdesc *bd, + uint32_t nmembs) +{ + struct nandfs_node *dat_node; + uint64_t map; + uint32_t i; + int error = 0; + + dat_node = nffsdev->nd_dat_node; + + VOP_LOCK(NTOV(dat_node), LK_EXCLUSIVE); + + for (i = 0; i < nmembs; i++) { + DPRINTF(CLEAN, + ("%s: bd ino:%#jx oblk:%#jx blocknr:%#jx off:%#jx\n", + __func__, (uintmax_t)bd[i].bd_ino, + (uintmax_t)bd[i].bd_oblocknr, (uintmax_t)bd[i].bd_blocknr, + (uintmax_t)bd[i].bd_offset)); + + error = nandfs_bmap_lookup(dat_node, bd[i].bd_offset, &map); + if (error) + break; + bd[i].bd_blocknr = map; + } + + VOP_UNLOCK(NTOV(dat_node), 0); + return (error); +} diff --git a/sys/fs/nandfs/nandfs_dir.c b/sys/fs/nandfs/nandfs_dir.c new file mode 100644 index 00000000000..e279510f2e1 --- /dev/null +++ b/sys/fs/nandfs/nandfs_dir.c @@ -0,0 +1,314 @@ +/*- + * Copyright (c) 2010-2012 Semihalf + * Copyright (c) 2008, 2009 Reinoud Zandijk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * From: NetBSD: nilfs_subr.c,v 1.4 2009/07/29 17:06:57 reinoud + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "nandfs_mount.h" +#include "nandfs.h" +#include "nandfs_subr.h" + +int +nandfs_add_dirent(struct vnode *dvp, uint64_t ino, char *nameptr, long namelen, + uint8_t type) +{ + struct nandfs_node *dir_node = VTON(dvp); + struct nandfs_dir_entry *dirent, *pdirent; + uint32_t blocksize = dir_node->nn_nandfsdev->nd_blocksize; + uint64_t filesize = dir_node->nn_inode.i_size; + uint64_t inode_blks = dir_node->nn_inode.i_blocks; + uint32_t off, rest; + uint8_t *pos; + struct buf *bp; + int error; + + pdirent = NULL; + bp = NULL; + if (inode_blks) { + error = nandfs_bread(dir_node, inode_blks - 1, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + + pos = bp->b_data; + off = 0; + while (off < blocksize) { + pdirent = (struct nandfs_dir_entry *) (pos + off); + if (!pdirent->rec_len) { + pdirent = NULL; + break; + } + off += pdirent->rec_len; + } + + if (pdirent) + rest = pdirent->rec_len - + NANDFS_DIR_REC_LEN(pdirent->name_len); + else + rest = blocksize; + + if (rest < NANDFS_DIR_REC_LEN(namelen)) { + /* Do not update pdirent as new block is created */ + pdirent = NULL; + brelse(bp); + /* Set to NULL to create new */ + bp = NULL; + filesize += rest; + } + } + + /* If no bp found create new */ + if (!bp) { + error = nandfs_bcreate(dir_node, inode_blks, NOCRED, 0, &bp); + if (error) + return (error); + off = 0; + pos = bp->b_data; + } + + /* Modify pdirent if exists */ + if (pdirent) { + DPRINTF(LOOKUP, ("modify pdirent %p\n", pdirent)); + /* modify last de */ + off -= pdirent->rec_len; + pdirent->rec_len = + NANDFS_DIR_REC_LEN(pdirent->name_len); + off += pdirent->rec_len; + } + + /* Create new dirent */ + dirent = (struct nandfs_dir_entry *) (pos + off); + dirent->rec_len = blocksize - off; + dirent->inode = ino; + dirent->name_len = namelen; + memset(dirent->name, 0, NANDFS_DIR_NAME_LEN(namelen)); + memcpy(dirent->name, nameptr, namelen); + dirent->file_type = type; + + filesize += NANDFS_DIR_REC_LEN(dirent->name_len); + + DPRINTF(LOOKUP, ("create dir_entry '%.*s' at %p with size %x " + "new filesize: %jx\n", + (int)namelen, dirent->name, dirent, dirent->rec_len, + (uintmax_t)filesize)); + + error = nandfs_dirty_buf(bp, 0); + if (error) + return (error); + + dir_node->nn_inode.i_size = filesize; + dir_node->nn_flags |= IN_CHANGE | IN_UPDATE; + vnode_pager_setsize(dvp, filesize); + + return (0); +} + +int +nandfs_remove_dirent(struct vnode *dvp, struct nandfs_node *node, + struct componentname *cnp) +{ + struct nandfs_node *dir_node; + struct nandfs_dir_entry *dirent, *pdirent; + struct buf *bp; + uint64_t filesize, blocknr, ino, offset; + uint32_t blocksize, limit, off; + uint16_t newsize; + uint8_t *pos; + int error, found; + + dir_node = VTON(dvp); + filesize = dir_node->nn_inode.i_size; + if (!filesize) + return (0); + + if (node) { + offset = node->nn_diroff; + ino = node->nn_ino; + } else { + offset = dir_node->nn_diroff; + ino = NANDFS_WHT_INO; + } + + dirent = pdirent = NULL; + blocksize = dir_node->nn_nandfsdev->nd_blocksize; + blocknr = offset / blocksize; + + DPRINTF(LOOKUP, ("rm direntry dvp %p node %p ino %#jx at off %#jx\n", + dvp, node, (uintmax_t)ino, (uintmax_t)offset)); + + error = nandfs_bread(dir_node, blocknr, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + + pos = bp->b_data; + off = 0; + found = 0; + limit = offset % blocksize; + pdirent = (struct nandfs_dir_entry *) bp->b_data; + while (off <= limit) { + dirent = (struct nandfs_dir_entry *) (pos + off); + + if ((off == limit) && + (dirent->inode == ino)) { + found = 1; + break; + } + if (dirent->inode != 0) + pdirent = dirent; + off += dirent->rec_len; + } + + if (!found) { + nandfs_error("cannot find entry to remove"); + brelse(bp); + return (error); + } + DPRINTF(LOOKUP, + ("rm dirent ino %#jx at %#x with size %#x\n", + (uintmax_t)dirent->inode, off, dirent->rec_len)); + + newsize = (uintptr_t)dirent - (uintptr_t)pdirent; + newsize += dirent->rec_len; + pdirent->rec_len = newsize; + dirent->inode = 0; + error = nandfs_dirty_buf(bp, 0); + if (error) + return (error); + + dir_node->nn_flags |= IN_CHANGE | IN_UPDATE; + /* If last one modify filesize */ + if ((offset + NANDFS_DIR_REC_LEN(dirent->name_len)) == filesize) { + filesize = blocknr * blocksize + + ((uintptr_t)pdirent - (uintptr_t)pos) + + NANDFS_DIR_REC_LEN(pdirent->name_len); + dir_node->nn_inode.i_size = filesize; + } + + return (0); +} + +int +nandfs_update_parent_dir(struct vnode *dvp, uint64_t newparent) +{ + struct nandfs_dir_entry *dirent; + struct nandfs_node *dir_node; + struct buf *bp; + int error; + + dir_node = VTON(dvp); + error = nandfs_bread(dir_node, 0, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + dirent = (struct nandfs_dir_entry *)bp->b_data; + dirent->inode = newparent; + error = nandfs_dirty_buf(bp, 0); + if (error) + return (error); + + return (0); +} + +int +nandfs_update_dirent(struct vnode *dvp, struct nandfs_node *fnode, + struct nandfs_node *tnode) +{ + struct nandfs_node *dir_node; + struct nandfs_dir_entry *dirent; + struct buf *bp; + uint64_t file_size, blocknr; + uint32_t blocksize, off; + uint8_t *pos; + int error; + + dir_node = VTON(dvp); + file_size = dir_node->nn_inode.i_size; + if (!file_size) + return (0); + + DPRINTF(LOOKUP, + ("chg direntry dvp %p ino %#jx to in %#jx at off %#jx\n", + dvp, (uintmax_t)tnode->nn_ino, (uintmax_t)fnode->nn_ino, + (uintmax_t)tnode->nn_diroff)); + + blocksize = dir_node->nn_nandfsdev->nd_blocksize; + blocknr = tnode->nn_diroff / blocksize; + off = tnode->nn_diroff % blocksize; + error = nandfs_bread(dir_node, blocknr, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + + pos = bp->b_data; + dirent = (struct nandfs_dir_entry *) (pos + off); + KASSERT((dirent->inode == tnode->nn_ino), + ("direntry mismatch")); + + dirent->inode = fnode->nn_ino; + error = nandfs_dirty_buf(bp, 0); + if (error) + return (error); + + return (0); +} + +int +nandfs_init_dir(struct vnode *dvp, uint64_t ino, uint64_t parent_ino) +{ + + if (nandfs_add_dirent(dvp, parent_ino, "..", 2, DT_DIR) || + nandfs_add_dirent(dvp, ino, ".", 1, DT_DIR)) { + nandfs_error("%s: cannot initialize dir ino:%jd(pino:%jd)\n", + __func__, ino, parent_ino); + return (-1); + } + return (0); +} diff --git a/sys/fs/nandfs/nandfs_fs.h b/sys/fs/nandfs/nandfs_fs.h new file mode 100644 index 00000000000..b72be40cefb --- /dev/null +++ b/sys/fs/nandfs/nandfs_fs.h @@ -0,0 +1,565 @@ +/*- + * Copyright (c) 2010-2012 Semihalf + * Copyright (c) 2008, 2009 Reinoud Zandijk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Original definitions written by Koji Sato + * and Ryusuke Konishi + * From: NetBSD: nandfs_fs.h,v 1.1 2009/07/18 16:31:42 reinoud + * + * $FreeBSD$ + */ + +#ifndef _NANDFS_FS_H +#define _NANDFS_FS_H + +#include + +#define MNINDIR(fsdev) ((fsdev)->nd_blocksize / sizeof(nandfs_daddr_t)) + +/* + * Inode structure. There are a few dedicated inode numbers that are + * defined here first. + */ +#define NANDFS_WHT_INO 1 /* Whiteout ino */ +#define NANDFS_ROOT_INO 2 /* Root file inode */ +#define NANDFS_DAT_INO 3 /* DAT file */ +#define NANDFS_CPFILE_INO 4 /* checkpoint file */ +#define NANDFS_SUFILE_INO 5 /* segment usage file */ +#define NANDFS_IFILE_INO 6 /* ifile */ +#define NANDFS_GC_INO 7 /* Cleanerd node */ +#define NANDFS_ATIME_INO 8 /* Atime file (reserved) */ +#define NANDFS_XATTR_INO 9 /* Xattribute file (reserved) */ +#define NANDFS_SKETCH_INO 10 /* Sketch file (obsolete) */ +#define NANDFS_USER_INO 11 /* First user's file inode number */ + +#define NANDFS_SYS_NODE(ino) \ + (((ino) >= NANDFS_DAT_INO) && ((ino) <= NANDFS_GC_INO)) + +#define NDADDR 12 /* Direct addresses in inode. */ +#define NIADDR 3 /* Indirect addresses in inode. */ + +typedef int64_t nandfs_daddr_t; +typedef int64_t nandfs_lbn_t; + +struct nandfs_inode { + uint64_t i_blocks; /* 0: size in device blocks */ + uint64_t i_size; /* 8: size in bytes */ + uint64_t i_ctime; /* 16: creation time in seconds */ + uint64_t i_mtime; /* 24: modification time in seconds part*/ + uint32_t i_ctime_nsec; /* 32: creation time nanoseconds part */ + uint32_t i_mtime_nsec; /* 36: modification time in nanoseconds */ + uint32_t i_uid; /* 40: user id */ + uint32_t i_gid; /* 44: group id */ + uint16_t i_mode; /* 48: file mode */ + uint16_t i_links_count; /* 50: number of references to the inode*/ + uint32_t i_flags; /* 52: NANDFS_*_FL flags */ + nandfs_daddr_t i_special; /* 56: special */ + nandfs_daddr_t i_db[NDADDR]; /* 64: Direct disk blocks. */ + nandfs_daddr_t i_ib[NIADDR]; /* 160: Indirect disk blocks. */ + uint64_t i_xattr; /* 184: reserved for extended attributes*/ + uint32_t i_generation; /* 192: file generation for NFS */ + uint32_t i_pad[15]; /* 196: make it 64 bits aligned */ +}; + +#ifdef _KERNEL +CTASSERT(sizeof(struct nandfs_inode) == 256); +#endif + +/* + * Each checkpoint/snapshot has a super root. + * + * The super root holds the inodes of the three system files: `dat', `cp' and + * 'su' files. All other FS state is defined by those. + * + * It is CRC checksum'ed and time stamped. + */ + +struct nandfs_super_root { + uint32_t sr_sum; /* check-sum */ + uint16_t sr_bytes; /* byte count of this structure */ + uint16_t sr_flags; /* reserved for flags */ + uint64_t sr_nongc_ctime; /* timestamp, not for cleaner(?) */ + struct nandfs_inode sr_dat; /* DAT, virt->phys translation inode */ + struct nandfs_inode sr_cpfile; /* CP, checkpoints inode */ + struct nandfs_inode sr_sufile; /* SU, segment usage inode */ +}; + +#define NANDFS_SR_MDT_OFFSET(inode_size, i) \ + ((uint32_t)&((struct nandfs_super_root *)0)->sr_dat + \ + (inode_size) * (i)) + +#define NANDFS_SR_DAT_OFFSET(inode_size) NANDFS_SR_MDT_OFFSET(inode_size, 0) +#define NANDFS_SR_CPFILE_OFFSET(inode_size) NANDFS_SR_MDT_OFFSET(inode_size, 1) +#define NANDFS_SR_SUFILE_OFFSET(inode_size) NANDFS_SR_MDT_OFFSET(inode_size, 2) +#define NANDFS_SR_BYTES (sizeof(struct nandfs_super_root)) + +/* + * The superblock describes the basic structure and mount history. It also + * records some sizes of structures found on the disc for sanity checks. + * + * The superblock is stored at two places: NANDFS_SB_OFFSET_BYTES and + * NANDFS_SB2_OFFSET_BYTES. + */ + +/* File system states stored on media in superblock's sbp->s_state */ +#define NANDFS_VALID_FS 0x0001 /* cleanly unmounted and all is ok */ +#define NANDFS_ERROR_FS 0x0002 /* there were errors detected, fsck */ +#define NANDFS_RESIZE_FS 0x0004 /* resize required, XXX unknown flag*/ +#define NANDFS_MOUNT_STATE_BITS "\20\1VALID_FS\2ERROR_FS\3RESIZE_FS" + +/* + * Brief description of control structures: + * + * NANDFS_NFSAREAS first blocks contain fsdata and some amount of super blocks. + * Simple round-robin policy is used in order to choose which block will + * contain new super block. + * + * Simple case with 2 blocks: + * 1: fsdata sblock1 [sblock3 [sblock5 ..]] + * 2: fsdata sblock2 [sblock4 [sblock6 ..]] + */ +struct nandfs_fsdata { + uint16_t f_magic; + uint16_t f_bytes; + + uint32_t f_sum; /* checksum of fsdata */ + uint32_t f_rev_level; /* major disk format revision */ + + uint64_t f_ctime; /* creation time (execution time + of newfs) */ + /* Block size represented as: blocksize = 1 << (f_log_block_size + 10) */ + uint32_t f_log_block_size; + + uint16_t f_inode_size; /* size of an inode */ + uint16_t f_dat_entry_size; /* size of a dat entry */ + uint16_t f_checkpoint_size; /* size of a checkpoint */ + uint16_t f_segment_usage_size; /* size of a segment usage */ + + uint16_t f_sbbytes; /* byte count of CRC calculation + for super blocks. s_reserved + is excluded! */ + + uint16_t f_errors; /* behaviour on detecting errors */ + + uint32_t f_erasesize; + uint64_t f_nsegments; /* number of segm. in filesystem */ + nandfs_daddr_t f_first_data_block; /* 1st seg disk block number */ + uint32_t f_blocks_per_segment; /* number of blocks per segment */ + uint32_t f_r_segments_percentage; /* reserved segments percentage */ + + struct uuid f_uuid; /* 128-bit uuid for volume */ + char f_volume_name[16]; /* volume name */ + uint32_t f_pad[104]; +} __packed; + +#ifdef _KERNEL +CTASSERT(sizeof(struct nandfs_fsdata) == 512); +#endif + +struct nandfs_super_block { + uint16_t s_magic; /* magic value for identification */ + + uint32_t s_sum; /* check sum of super block */ + + uint64_t s_last_cno; /* last checkpoint number */ + uint64_t s_last_pseg; /* addr part. segm. written last */ + uint64_t s_last_seq; /* seq.number of seg written last */ + uint64_t s_free_blocks_count; /* free blocks count */ + + uint64_t s_mtime; /* mount time */ + uint64_t s_wtime; /* write time */ + uint16_t s_state; /* file system state */ + + char s_last_mounted[64]; /* directory where last mounted */ + + uint32_t s_c_interval; /* commit interval of segment */ + uint32_t s_c_block_max; /* threshold of data amount for + the segment construction */ + uint32_t s_reserved[32]; /* padding to end of the block */ +} __packed; + +#ifdef _KERNEL +CTASSERT(sizeof(struct nandfs_super_block) == 256); +#endif + +#define NANDFS_FSDATA_MAGIC 0xf8da +#define NANDFS_SUPER_MAGIC 0x8008 + +#define NANDFS_NFSAREAS 4 +#define NANDFS_DATA_OFFSET_BYTES(esize) (NANDFS_NFSAREAS * (esize)) + +#define NANDFS_SBLOCK_OFFSET_BYTES (sizeof(struct nandfs_fsdata)) + +#define NANDFS_DEF_BLOCKSIZE 4096 +#define NANDFS_MIN_BLOCKSIZE 512 + +#define NANDFS_DEF_ERASESIZE (2 << 16) + +#define NANDFS_MIN_SEGSIZE NANDFS_DEF_ERASESIZE + +#define NANDFS_CURRENT_REV 9 /* current major revision */ + +#define NANDFS_FSDATA_CRC_BYTES offsetof(struct nandfs_fsdata, f_pad) +/* Bytes count of super_block for CRC-calculation */ +#define NANDFS_SB_BYTES offsetof(struct nandfs_super_block, s_reserved) + +/* Maximal count of links to a file */ +#define NANDFS_LINK_MAX 32000 + +/* + * Structure of a directory entry. + * + * Note that they can't span blocks; the rec_len fills out. + */ + +#define NANDFS_NAME_LEN 255 +struct nandfs_dir_entry { + uint64_t inode; /* inode number */ + uint16_t rec_len; /* directory entry length */ + uint8_t name_len; /* name length */ + uint8_t file_type; + char name[NANDFS_NAME_LEN]; /* file name */ + char pad; +}; + +/* + * NANDFS_DIR_PAD defines the directory entries boundaries + * + * NOTE: It must be a multiple of 8 + */ +#define NANDFS_DIR_PAD 8 +#define NANDFS_DIR_ROUND (NANDFS_DIR_PAD - 1) +#define NANDFS_DIR_NAME_OFFSET (offsetof(struct nandfs_dir_entry, name)) +#define NANDFS_DIR_REC_LEN(name_len) \ + (((name_len) + NANDFS_DIR_NAME_OFFSET + NANDFS_DIR_ROUND) \ + & ~NANDFS_DIR_ROUND) +#define NANDFS_DIR_NAME_LEN(name_len) \ + (NANDFS_DIR_REC_LEN(name_len) - NANDFS_DIR_NAME_OFFSET) + +/* + * NiLFS/NANDFS devides the disc into fixed length segments. Each segment is + * filled with one or more partial segments of variable lengths. + * + * Each partial segment has a segment summary header followed by updates of + * files and optionally a super root. + */ + +/* + * Virtual to physical block translation information. For data blocks it maps + * logical block number bi_blkoff to virtual block nr bi_vblocknr. For non + * datablocks it is the virtual block number assigned to an indirect block + * and has no bi_blkoff. The physical block number is the next + * available data block in the partial segment after all the binfo's. + */ +struct nandfs_binfo_v { + uint64_t bi_ino; /* file's inode */ + uint64_t bi_vblocknr; /* assigned virtual block number */ + uint64_t bi_blkoff; /* for file's logical block number */ +}; + +/* + * DAT allocation. For data blocks just the logical block number that maps on + * the next available data block in the partial segment after the binfo's. + */ +struct nandfs_binfo_dat { + uint64_t bi_ino; + uint64_t bi_blkoff; /* DAT file's logical block number */ + uint8_t bi_level; /* whether this is meta block */ + uint8_t bi_pad[7]; +}; + +#ifdef _KERNEL +CTASSERT(sizeof(struct nandfs_binfo_v) == sizeof(struct nandfs_binfo_dat)); +#endif + +/* Convenience union for both types of binfo's */ +union nandfs_binfo { + struct nandfs_binfo_v bi_v; + struct nandfs_binfo_dat bi_dat; +}; + +/* Indirect buffers path */ +struct nandfs_indir { + nandfs_daddr_t in_lbn; + int in_off; +}; + +/* The (partial) segment summary */ +struct nandfs_segment_summary { + uint32_t ss_datasum; /* CRC of complete data block */ + uint32_t ss_sumsum; /* CRC of segment summary only */ + uint32_t ss_magic; /* magic to identify segment summary */ + uint16_t ss_bytes; /* size of segment summary structure */ + uint16_t ss_flags; /* NANDFS_SS_* flags */ + uint64_t ss_seq; /* sequence number of this segm. sum */ + uint64_t ss_create; /* creation timestamp in seconds */ + uint64_t ss_next; /* blocknumber of next segment */ + uint32_t ss_nblocks; /* number of blocks used by summary */ + uint32_t ss_nbinfos; /* number of binfo structures */ + uint32_t ss_sumbytes; /* total size of segment summary */ + uint32_t ss_pad; + /* stream of binfo structures */ +}; + +#define NANDFS_SEGSUM_MAGIC 0x8e680011 /* segment summary magic number */ + +/* Segment summary flags */ +#define NANDFS_SS_LOGBGN 0x0001 /* begins a logical segment */ +#define NANDFS_SS_LOGEND 0x0002 /* ends a logical segment */ +#define NANDFS_SS_SR 0x0004 /* has super root */ +#define NANDFS_SS_SYNDT 0x0008 /* includes data only updates */ +#define NANDFS_SS_GC 0x0010 /* segment written for cleaner operation */ +#define NANDFS_SS_FLAG_BITS "\20\1LOGBGN\2LOGEND\3SR\4SYNDT\5GC" + +/* Segment summary constrains */ +#define NANDFS_SEG_MIN_BLOCKS 16 /* minimum number of blocks in a + full segment */ +#define NANDFS_PSEG_MIN_BLOCKS 2 /* minimum number of blocks in a + partial segment */ +#define NANDFS_MIN_NRSVSEGS 8 /* minimum number of reserved + segments */ + +/* + * Structure of DAT/inode file. + * + * A DAT file is devided into groups. The maximum number of groups is the + * number of block group descriptors that fit into one block; this descriptor + * only gives the number of free entries in the associated group. + * + * Each group has a block sized bitmap indicating if an entry is taken or + * empty. Each bit stands for a DAT entry. + * + * The inode file has exactly the same format only the entries are inode + * entries. + */ + +struct nandfs_block_group_desc { + uint32_t bg_nfrees; /* num. free entries in block group */ +}; + +/* DAT entry in a super root's DAT file */ +struct nandfs_dat_entry { + uint64_t de_blocknr; /* block number */ + uint64_t de_start; /* valid from checkpoint */ + uint64_t de_end; /* valid till checkpoint */ + uint64_t de_rsv; /* reserved for future use */ +}; + +/* + * Structure of CP file. + * + * A snapshot is just a checkpoint only it's protected against removal by the + * cleaner. The snapshots are kept on a double linked list of checkpoints. + */ +struct nandfs_snapshot_list { + uint64_t ssl_next; /* checkpoint nr. forward */ + uint64_t ssl_prev; /* checkpoint nr. back */ +}; + +/* Checkpoint entry structure */ +struct nandfs_checkpoint { + uint32_t cp_flags; /* NANDFS_CHECKPOINT_* flags */ + uint32_t cp_checkpoints_count; /* ZERO, not used anymore? */ + struct nandfs_snapshot_list cp_snapshot_list; /* list of snapshots */ + uint64_t cp_cno; /* checkpoint number */ + uint64_t cp_create; /* creation timestamp */ + uint64_t cp_nblk_inc; /* number of blocks incremented */ + uint64_t cp_blocks_count; /* reserved (might be deleted) */ + struct nandfs_inode cp_ifile_inode; /* inode file inode */ +}; + +/* Checkpoint flags */ +#define NANDFS_CHECKPOINT_SNAPSHOT 1 +#define NANDFS_CHECKPOINT_INVALID 2 +#define NANDFS_CHECKPOINT_SKETCH 4 +#define NANDFS_CHECKPOINT_MINOR 8 +#define NANDFS_CHECKPOINT_BITS "\20\1SNAPSHOT\2INVALID\3SKETCH\4MINOR" + +/* Header of the checkpoint file */ +struct nandfs_cpfile_header { + uint64_t ch_ncheckpoints; /* number of checkpoints */ + uint64_t ch_nsnapshots; /* number of snapshots */ + struct nandfs_snapshot_list ch_snapshot_list; /* snapshot list */ +}; + +#define NANDFS_CPFILE_FIRST_CHECKPOINT_OFFSET \ + ((sizeof(struct nandfs_cpfile_header) + \ + sizeof(struct nandfs_checkpoint) - 1) / \ + sizeof(struct nandfs_checkpoint)) + + +#define NANDFS_NOSEGMENT 0xffffffff + +/* + * Structure of SU file. + * + * The segment usage file sums up how each of the segments are used. They are + * indexed by their segment number. + */ + +/* Segment usage entry */ +struct nandfs_segment_usage { + uint64_t su_lastmod; /* last modified timestamp */ + uint32_t su_nblocks; /* number of blocks in segment */ + uint32_t su_flags; /* NANDFS_SEGMENT_USAGE_* flags */ +}; + +/* Segment usage flag */ +#define NANDFS_SEGMENT_USAGE_ACTIVE 1 +#define NANDFS_SEGMENT_USAGE_DIRTY 2 +#define NANDFS_SEGMENT_USAGE_ERROR 4 +#define NANDFS_SEGMENT_USAGE_GC 8 +#define NANDFS_SEGMENT_USAGE_BITS "\20\1ACTIVE\2DIRTY\3ERROR" + +/* Header of the segment usage file */ +struct nandfs_sufile_header { + uint64_t sh_ncleansegs; /* number of segments marked clean */ + uint64_t sh_ndirtysegs; /* number of segments marked dirty */ + uint64_t sh_last_alloc; /* last allocated segment number */ +}; + +#define NANDFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET \ + ((sizeof(struct nandfs_sufile_header) + \ + sizeof(struct nandfs_segment_usage) - 1) / \ + sizeof(struct nandfs_segment_usage)) + +struct nandfs_seg_stat { + uint64_t nss_nsegs; + uint64_t nss_ncleansegs; + uint64_t nss_ndirtysegs; + uint64_t nss_ctime; + uint64_t nss_nongc_ctime; + uint64_t nss_prot_seq; +}; + +enum { + NANDFS_CHECKPOINT, + NANDFS_SNAPSHOT +}; + +#define NANDFS_CPINFO_MAX 512 + +struct nandfs_cpinfo { + uint32_t nci_flags; + uint32_t nci_pad; + uint64_t nci_cno; + uint64_t nci_create; + uint64_t nci_nblk_inc; + uint64_t nci_blocks_count; + uint64_t nci_next; +}; + +#define NANDFS_SEGMENTS_MAX 512 + +struct nandfs_suinfo { + uint64_t nsi_num; + uint64_t nsi_lastmod; + uint32_t nsi_blocks; + uint32_t nsi_flags; +}; + +#define NANDFS_VINFO_MAX 512 + +struct nandfs_vinfo { + uint64_t nvi_ino; + uint64_t nvi_vblocknr; + uint64_t nvi_start; + uint64_t nvi_end; + uint64_t nvi_blocknr; + int nvi_alive; +}; + +struct nandfs_cpmode { + uint64_t ncpm_cno; + uint32_t ncpm_mode; + uint32_t ncpm_pad; +}; + +struct nandfs_argv { + uint64_t nv_base; + uint32_t nv_nmembs; + uint16_t nv_size; + uint16_t nv_flags; + uint64_t nv_index; +}; + +struct nandfs_cpstat { + uint64_t ncp_cno; + uint64_t ncp_ncps; + uint64_t ncp_nss; +}; + +struct nandfs_period { + uint64_t p_start; + uint64_t p_end; +}; + +struct nandfs_vdesc { + uint64_t vd_ino; + uint64_t vd_cno; + uint64_t vd_vblocknr; + struct nandfs_period vd_period; + uint64_t vd_blocknr; + uint64_t vd_offset; + uint32_t vd_flags; + uint32_t vd_pad; +}; + +struct nandfs_bdesc { + uint64_t bd_ino; + uint64_t bd_oblocknr; + uint64_t bd_blocknr; + uint64_t bd_offset; + uint32_t bd_level; + uint32_t bd_alive; +}; + +#ifndef _KERNEL +#ifndef MNAMELEN +#define MNAMELEN 88 +#endif +#endif + +struct nandfs_fsinfo { + struct nandfs_fsdata fs_fsdata; + struct nandfs_super_block fs_super; + char fs_dev[MNAMELEN]; +}; + +#define NANDFS_MAX_MOUNTS 65535 + +#define NANDFS_IOCTL_GET_SUSTAT _IOR('N', 100, struct nandfs_seg_stat) +#define NANDFS_IOCTL_CHANGE_CPMODE _IOWR('N', 101, struct nandfs_cpmode) +#define NANDFS_IOCTL_GET_CPINFO _IOWR('N', 102, struct nandfs_argv) +#define NANDFS_IOCTL_DELETE_CP _IOWR('N', 103, uint64_t[2]) +#define NANDFS_IOCTL_GET_CPSTAT _IOR('N', 104, struct nandfs_cpstat) +#define NANDFS_IOCTL_GET_SUINFO _IOWR('N', 105, struct nandfs_argv) +#define NANDFS_IOCTL_GET_VINFO _IOWR('N', 106, struct nandfs_argv) +#define NANDFS_IOCTL_GET_BDESCS _IOWR('N', 107, struct nandfs_argv) +#define NANDFS_IOCTL_GET_FSINFO _IOR('N', 108, struct nandfs_fsinfo) +#define NANDFS_IOCTL_MAKE_SNAP _IOWR('N', 109, uint64_t) +#define NANDFS_IOCTL_DELETE_SNAP _IOWR('N', 110, uint64_t) +#define NANDFS_IOCTL_SYNC _IOWR('N', 111, uint64_t) + +#endif /* _NANDFS_FS_H */ diff --git a/sys/fs/nandfs/nandfs_ifile.c b/sys/fs/nandfs/nandfs_ifile.c new file mode 100644 index 00000000000..7e4db879f60 --- /dev/null +++ b/sys/fs/nandfs/nandfs_ifile.c @@ -0,0 +1,213 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +int +nandfs_node_create(struct nandfsmount *nmp, struct nandfs_node **node, + uint16_t mode) +{ + struct nandfs_alloc_request req; + struct nandfs_device *nandfsdev; + struct nandfs_mdt *mdt; + struct nandfs_node *ifile; + struct nandfs_inode *inode; + struct vnode *vp; + uint32_t entry; + int error = 0; + + nandfsdev = nmp->nm_nandfsdev; + mdt = &nandfsdev->nd_ifile_mdt; + ifile = nmp->nm_ifile_node; + vp = NTOV(ifile); + + VOP_LOCK(vp, LK_EXCLUSIVE); + /* Allocate new inode in ifile */ + req.entrynum = nandfsdev->nd_last_ino + 1; + error = nandfs_find_free_entry(mdt, ifile, &req); + if (error) { + VOP_UNLOCK(vp, 0); + return (error); + } + + error = nandfs_get_entry_block(mdt, ifile, &req, &entry, 1); + if (error) { + VOP_UNLOCK(vp, 0); + return (error); + } + + /* Inode initialization */ + inode = ((struct nandfs_inode *) req.bp_entry->b_data) + entry; + nandfs_inode_init(inode, mode); + + error = nandfs_alloc_entry(mdt, &req); + if (error) { + VOP_UNLOCK(vp, 0); + return (error); + } + + VOP_UNLOCK(vp, 0); + + nandfsdev->nd_last_ino = req.entrynum; + error = nandfs_get_node(nmp, req.entrynum, node); + DPRINTF(IFILE, ("%s: node: %p ino: %#jx\n", + __func__, node, (uintmax_t)((*node)->nn_ino))); + + return (error); +} + +int +nandfs_node_destroy(struct nandfs_node *node) +{ + struct nandfs_alloc_request req; + struct nandfsmount *nmp; + struct nandfs_mdt *mdt; + struct nandfs_node *ifile; + struct vnode *vp; + int error = 0; + + nmp = node->nn_nmp; + req.entrynum = node->nn_ino; + mdt = &nmp->nm_nandfsdev->nd_ifile_mdt; + ifile = nmp->nm_ifile_node; + vp = NTOV(ifile); + + DPRINTF(IFILE, ("%s: destroy node: %p ino: %#jx\n", + __func__, node, (uintmax_t)node->nn_ino)); + VOP_LOCK(vp, LK_EXCLUSIVE); + + error = nandfs_find_entry(mdt, ifile, &req); + if (error) { + nandfs_error("%s: finding entry error:%d node %p(%jx)", + __func__, error, node, node->nn_ino); + VOP_UNLOCK(vp, 0); + return (error); + } + + nandfs_inode_destroy(&node->nn_inode); + + error = nandfs_free_entry(mdt, &req); + if (error) { + nandfs_error("%s: freing entry error:%d node %p(%jx)", + __func__, error, node, node->nn_ino); + VOP_UNLOCK(vp, 0); + return (error); + } + + VOP_UNLOCK(vp, 0); + DPRINTF(IFILE, ("%s: freed node %p ino %#jx\n", + __func__, node, (uintmax_t)node->nn_ino)); + return (error); +} + +int +nandfs_node_update(struct nandfs_node *node) +{ + struct nandfs_alloc_request req; + struct nandfsmount *nmp; + struct nandfs_mdt *mdt; + struct nandfs_node *ifile; + struct nandfs_inode *inode; + uint32_t index; + int error = 0; + + nmp = node->nn_nmp; + ifile = nmp->nm_ifile_node; + ASSERT_VOP_LOCKED(NTOV(ifile), __func__); + + req.entrynum = node->nn_ino; + mdt = &nmp->nm_nandfsdev->nd_ifile_mdt; + + DPRINTF(IFILE, ("%s: node:%p ino:%#jx\n", + __func__, &node->nn_inode, (uintmax_t)node->nn_ino)); + + error = nandfs_get_entry_block(mdt, ifile, &req, &index, 0); + if (error) { + printf("nandfs_get_entry_block returned with ERROR=%d\n", + error); + return (error); + } + + inode = ((struct nandfs_inode *) req.bp_entry->b_data) + index; + memcpy(inode, &node->nn_inode, sizeof(*inode)); + error = nandfs_dirty_buf(req.bp_entry, 0); + + return (error); +} + +int +nandfs_get_node_entry(struct nandfsmount *nmp, struct nandfs_inode **inode, + uint64_t ino, struct buf **bp) +{ + struct nandfs_alloc_request req; + struct nandfs_mdt *mdt; + struct nandfs_node *ifile; + struct vnode *vp; + uint32_t index; + int error = 0; + + req.entrynum = ino; + mdt = &nmp->nm_nandfsdev->nd_ifile_mdt; + ifile = nmp->nm_ifile_node; + vp = NTOV(ifile); + + VOP_LOCK(vp, LK_EXCLUSIVE); + error = nandfs_get_entry_block(mdt, ifile, &req, &index, 0); + if (error) { + VOP_UNLOCK(vp, 0); + return (error); + } + + *inode = ((struct nandfs_inode *) req.bp_entry->b_data) + index; + *bp = req.bp_entry; + VOP_UNLOCK(vp, 0); + return (0); +} + diff --git a/sys/fs/nandfs/nandfs_mount.h b/sys/fs/nandfs/nandfs_mount.h new file mode 100644 index 00000000000..f733e22b166 --- /dev/null +++ b/sys/fs/nandfs/nandfs_mount.h @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 2008, 2009 Reinoud Zandijk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed for the + * NetBSD Project. See http://www.NetBSD.org/ for + * information about NetBSD. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * From: NetBSD: nilfs_mount.h,v 1.1 2009/07/18 16:31:42 reinoud + * + * $FreeBSD$ + */ + +#ifndef _FS_NANDFS_NANDFS_MOUNT_H_ +#define _FS_NANDFS_NANDFS_MOUNT_H_ + +/* + * Arguments to mount NANDFS filingsystem. + */ + +struct nandfs_args { + char *fspec; /* mount specifier */ + int64_t cpno; /* checkpoint number */ +}; + +#endif /* !_FS_NANDFS_NANDFS_MOUNT_H_ */ + diff --git a/sys/fs/nandfs/nandfs_segment.c b/sys/fs/nandfs/nandfs_segment.c new file mode 100644 index 00000000000..836beada1aa --- /dev/null +++ b/sys/fs/nandfs/nandfs_segment.c @@ -0,0 +1,1329 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_ddb.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +static int +nandfs_new_segment(struct nandfs_device *fsdev) +{ + int error = 0; + uint64_t new; + + error = nandfs_alloc_segment(fsdev, &new); + if (!error) { + fsdev->nd_seg_num = fsdev->nd_next_seg_num; + fsdev->nd_next_seg_num = new; + } + DPRINTF(SYNC, ("%s: new segment %jx next %jx error %d\n", + __func__, (uintmax_t)fsdev->nd_seg_num, (uintmax_t)new, error)); + if (error) + nandfs_error("%s: cannot create segment error %d\n", + __func__, error); + + return (error); +} + +static int +create_segment(struct nandfs_seginfo *seginfo) +{ + struct nandfs_segment *seg; + struct nandfs_device *fsdev; + struct nandfs_segment *prev; + struct buf *bp; + uint64_t start_block, curr; + uint32_t blks_per_seg, nblocks; + int error; + + fsdev = seginfo->fsdev; + prev = seginfo->curseg; + blks_per_seg = fsdev->nd_fsdata.f_blocks_per_segment; + nblocks = fsdev->nd_last_segsum.ss_nblocks; + + if (!prev) { + vfs_timestamp(&fsdev->nd_ts); + /* Touch current segment */ + error = nandfs_touch_segment(fsdev, fsdev->nd_seg_num); + if (error) { + nandfs_error("%s: cannot preallocate segment %jx\n", + __func__, fsdev->nd_seg_num); + return (error); + } + error = nandfs_touch_segment(fsdev, 0); + if (error) { + nandfs_error("%s: cannot dirty block with segment 0\n", + __func__); + return (error); + } + start_block = fsdev->nd_last_pseg + (uint64_t)nblocks; + /* + * XXX Hack + */ + if (blks_per_seg - (start_block % blks_per_seg) - 1 == 0) + start_block++; + curr = nandfs_get_segnum_of_block(fsdev, start_block); + /* Allocate new segment if last one is full */ + if (fsdev->nd_seg_num != curr) { + error = nandfs_new_segment(fsdev); + if (error) { + nandfs_error("%s: cannot create new segment\n", + __func__); + return (error); + } + /* + * XXX Hack + */ + nandfs_get_segment_range(fsdev, fsdev->nd_seg_num, &start_block, NULL); + } + } else { + nandfs_get_segment_range(fsdev, fsdev->nd_next_seg_num, + &start_block, NULL); + + /* Touch current segment and allocate and touch new one */ + error = nandfs_new_segment(fsdev); + if (error) { + nandfs_error("%s: cannot create next segment\n", + __func__); + return (error); + } + + /* Reiterate in case new buf is dirty */ + seginfo->reiterate = 1; + } + + /* Allocate and initialize nandfs_segment structure */ + seg = malloc(sizeof(*seg), M_DEVBUF, M_WAITOK|M_ZERO); + TAILQ_INIT(&seg->segsum); + TAILQ_INIT(&seg->data); + seg->fsdev = fsdev; + seg->start_block = start_block; + seg->num_blocks = blks_per_seg - (start_block % blks_per_seg) - 1; + seg->seg_num = fsdev->nd_seg_num; + seg->seg_next = fsdev->nd_next_seg_num; + seg->segsum_blocks = 1; + seg->bytes_left = fsdev->nd_blocksize - + sizeof(struct nandfs_segment_summary); + seg->segsum_bytes = sizeof(struct nandfs_segment_summary); + + /* Allocate buffer for segment summary */ + bp = getblk(fsdev->nd_devvp, nandfs_block_to_dblock(fsdev, + seg->start_block), fsdev->nd_blocksize, 0, 0, 0); + bzero(bp->b_data, seginfo->fsdev->nd_blocksize); + bp->b_bufobj = &seginfo->fsdev->nd_devvp->v_bufobj; + bp->b_flags |= B_MANAGED; + + /* Add buffer to segment */ + TAILQ_INSERT_TAIL(&seg->segsum, bp, b_cluster.cluster_entry); + seg->current_off = bp->b_data + sizeof(struct nandfs_segment_summary); + + DPRINTF(SYNC, ("%s: seg %p : initial settings: start %#jx size :%#x\n", + __func__, seg, (uintmax_t)seg->start_block, seg->num_blocks)); + DPRINTF(SYNC, ("%s: seg->seg_num %#jx cno %#jx next %#jx\n", __func__, + (uintmax_t)seg->seg_num, (uintmax_t)(fsdev->nd_last_cno + 1), + (uintmax_t)seg->seg_next)); + + if (!prev) + LIST_INSERT_HEAD(&seginfo->seg_list, seg, seg_link); + else + LIST_INSERT_AFTER(prev, seg, seg_link); + + seginfo->curseg = seg; + + return (0); +} + +static int +delete_segment(struct nandfs_seginfo *seginfo) +{ + struct nandfs_segment *seg, *tseg; + struct buf *bp, *tbp; + + LIST_FOREACH_SAFE(seg, &seginfo->seg_list, seg_link, tseg) { + TAILQ_FOREACH_SAFE(bp, &seg->segsum, b_cluster.cluster_entry, + tbp) { + TAILQ_REMOVE(&seg->segsum, bp, b_cluster.cluster_entry); + bp->b_flags &= ~B_MANAGED; + brelse(bp); + }; + + LIST_REMOVE(seg, seg_link); + free(seg, M_DEVBUF); + } + + return (0); +} + +static int +create_seginfo(struct nandfs_device *fsdev, struct nandfs_seginfo **seginfo) +{ + struct nandfs_seginfo *info; + + info = malloc(sizeof(*info), M_DEVBUF, M_WAITOK); + + LIST_INIT(&info->seg_list); + info->fsdev = fsdev; + info->curseg = NULL; + info->blocks = 0; + *seginfo = info; + fsdev->nd_seginfo = info; + return (0); +} + +static int +delete_seginfo(struct nandfs_seginfo *seginfo) +{ + struct nandfs_device *nffsdev; + + nffsdev = seginfo->fsdev; + delete_segment(seginfo); + nffsdev->nd_seginfo = NULL; + free(seginfo, M_DEVBUF); + + return (0); +} + +static int +nandfs_create_superroot_block(struct nandfs_seginfo *seginfo, + struct buf **newbp) +{ + struct buf *bp; + int error; + + bp = nandfs_geteblk(seginfo->fsdev->nd_blocksize, GB_NOWAIT_BD); + + bzero(bp->b_data, seginfo->fsdev->nd_blocksize); + bp->b_bufobj = &seginfo->fsdev->nd_devvp->v_bufobj; + bp->b_flags |= B_MANAGED; + + if (!(seginfo->curseg) || !seginfo->curseg->num_blocks) { + error = create_segment(seginfo); + if (error) { + brelse(bp); + nandfs_error("%s: no segment for superroot\n", + __func__); + return (error); + } + } + + TAILQ_INSERT_TAIL(&seginfo->curseg->data, bp, b_cluster.cluster_entry); + + seginfo->curseg->nblocks++; + seginfo->curseg->num_blocks--; + seginfo->blocks++; + + *newbp = bp; + return (0); +} + +static int +nandfs_add_superroot(struct nandfs_seginfo *seginfo) +{ + struct nandfs_device *fsdev; + struct nandfs_super_root *sr; + struct buf *bp = NULL; + uint64_t crc_skip; + uint32_t crc_calc; + int error; + + fsdev = seginfo->fsdev; + + error = nandfs_create_superroot_block(seginfo, &bp); + if (error) { + nandfs_error("%s: cannot add superroot\n", __func__); + return (error); + } + + sr = (struct nandfs_super_root *)bp->b_data; + /* Save superroot CRC */ + sr->sr_bytes = NANDFS_SR_BYTES; + sr->sr_flags = 0; + sr->sr_nongc_ctime = 0; + + memcpy(&sr->sr_dat, &fsdev->nd_dat_node->nn_inode, + sizeof(struct nandfs_inode)); + memcpy(&sr->sr_cpfile, &fsdev->nd_cp_node->nn_inode, + sizeof(struct nandfs_inode)); + memcpy(&sr->sr_sufile, &fsdev->nd_su_node->nn_inode, + sizeof(struct nandfs_inode)); + + crc_skip = sizeof(sr->sr_sum); + crc_calc = crc32((uint8_t *)sr + crc_skip, NANDFS_SR_BYTES - crc_skip); + + sr->sr_sum = crc_calc; + + bp->b_flags |= B_MANAGED; + bp->b_bufobj = &seginfo->fsdev->nd_devvp->v_bufobj; + + bp->b_flags &= ~B_INVAL; + nandfs_dirty_bufs_increment(fsdev); + DPRINTF(SYNC, ("%s: bp:%p\n", __func__, bp)); + + return (0); +} + +static int +nandfs_add_segsum_block(struct nandfs_seginfo *seginfo, struct buf **newbp) +{ + struct nandfs_device *fsdev; + nandfs_daddr_t blk; + struct buf *bp; + int error; + + if (!(seginfo->curseg) || seginfo->curseg->num_blocks <= 1) { + error = create_segment(seginfo); + if (error) { + nandfs_error("%s: error:%d when creating segment\n", + __func__, error); + return (error); + } + *newbp = TAILQ_FIRST(&seginfo->curseg->segsum); + return (0); + } + + fsdev = seginfo->fsdev; + blk = nandfs_block_to_dblock(fsdev, seginfo->curseg->start_block + + seginfo->curseg->segsum_blocks); + + bp = getblk(fsdev->nd_devvp, blk, fsdev->nd_blocksize, 0, 0, 0); + + bzero(bp->b_data, seginfo->fsdev->nd_blocksize); + bp->b_bufobj = &seginfo->fsdev->nd_devvp->v_bufobj; + bp->b_flags |= B_MANAGED; + + TAILQ_INSERT_TAIL(&seginfo->curseg->segsum, bp, + b_cluster.cluster_entry); + seginfo->curseg->num_blocks--; + + seginfo->curseg->segsum_blocks++; + seginfo->curseg->bytes_left = seginfo->fsdev->nd_blocksize; + seginfo->curseg->current_off = bp->b_data; + seginfo->blocks++; + + *newbp = bp; + + DPRINTF(SYNC, ("%s: bp %p\n", __func__, bp)); + + return (0); +} + +static int +nandfs_add_blocks(struct nandfs_seginfo *seginfo, struct nandfs_node *node, + struct buf *bp) +{ + union nandfs_binfo *binfo; + struct buf *seg_bp; + int error; + + if (!(seginfo->curseg) || !seginfo->curseg->num_blocks) { + error = create_segment(seginfo); + if (error) { + nandfs_error("%s: error:%d when creating segment\n", + __func__, error); + return (error); + } + } + + if (seginfo->curseg->bytes_left < sizeof(union nandfs_binfo)) { + error = nandfs_add_segsum_block(seginfo, &seg_bp); + if (error) { + nandfs_error("%s: error:%d when adding segsum\n", + __func__, error); + return (error); + } + } + binfo = (union nandfs_binfo *)seginfo->curseg->current_off; + + if (node->nn_ino != NANDFS_DAT_INO) { + binfo->bi_v.bi_blkoff = bp->b_lblkno; + binfo->bi_v.bi_ino = node->nn_ino; + } else { + binfo->bi_dat.bi_blkoff = bp->b_lblkno; + binfo->bi_dat.bi_ino = node->nn_ino; + if (NANDFS_IS_INDIRECT(bp)) + binfo->bi_dat.bi_level = 1; + else + binfo->bi_dat.bi_level = 0; + } + binfo++; + + seginfo->curseg->bytes_left -= sizeof(union nandfs_binfo); + seginfo->curseg->segsum_bytes += sizeof(union nandfs_binfo); + seginfo->curseg->current_off = (char *)binfo; + + TAILQ_INSERT_TAIL(&seginfo->curseg->data, bp, b_cluster.cluster_entry); + + seginfo->curseg->nbinfos++; + seginfo->curseg->nblocks++; + seginfo->curseg->num_blocks--; + seginfo->blocks++; + + DPRINTF(SYNC, ("%s: bp (%p) number %x (left %x)\n", + __func__, bp, seginfo->curseg->nblocks, + seginfo->curseg->num_blocks)); + return (0); +} + +static int +nandfs_iterate_dirty_buf(struct vnode *vp, struct nandfs_seginfo *seginfo, + uint8_t hold) +{ + struct buf *bp, *tbd; + struct bufobj *bo; + struct nandfs_node *node; + int error; + + node = VTON(vp); + bo = &vp->v_bufobj; + + ASSERT_VOP_ELOCKED(vp, __func__); + + /* Iterate dirty data bufs */ + TAILQ_FOREACH_SAFE(bp, &bo->bo_dirty.bv_hd, b_bobufs, tbd) { + DPRINTF(SYNC, ("%s: vp (%p): bp (%p) with lblkno %jx ino %jx " + "add buf\n", __func__, vp, bp, bp->b_lblkno, node->nn_ino)); + + if (!(NANDFS_ISGATHERED(bp))) { + error = nandfs_bmap_update_dat(node, + nandfs_vblk_get(bp), bp); + if (error) + return (error); + NANDFS_GATHER(bp); + nandfs_add_blocks(seginfo, node, bp); + } + } + + return (0); +} + +static int +nandfs_iterate_system_vnode(struct nandfs_node *node, + struct nandfs_seginfo *seginfo) +{ + struct vnode *vp; + int nblocks; + uint8_t hold = 0; + + if (node->nn_ino != NANDFS_IFILE_INO) + hold = 1; + + vp = NTOV(node); + + nblocks = vp->v_bufobj.bo_dirty.bv_cnt; + DPRINTF(SYNC, ("%s: vp (%p): nblocks %x ino %jx\n", + __func__, vp, nblocks, node->nn_ino)); + + if (nblocks) + nandfs_iterate_dirty_buf(vp, seginfo, hold); + + return (0); +} + +static int +nandfs_iterate_dirty_vnodes(struct mount *mp, struct nandfs_seginfo *seginfo) +{ + struct nandfs_node *nandfs_node; + struct vnode *vp, *mvp; + struct thread *td; + int error, lockreq, update; + + td = curthread; + lockreq = LK_EXCLUSIVE | LK_INTERLOCK | LK_RETRY; + + MNT_ILOCK(mp); + + MNT_VNODE_FOREACH(vp, mp, mvp) { + update = 0; + + if (mp->mnt_syncer == vp) + continue; + if (VOP_ISLOCKED(vp)) + continue; + + VI_LOCK(vp); + MNT_IUNLOCK(mp); + if (vp->v_iflag & VI_DOOMED) { + VI_UNLOCK(vp); + MNT_ILOCK(mp); + continue; + } + + if ((error = vget(vp, lockreq, td)) != 0) { + MNT_ILOCK(mp); + continue; + } + + if (vp->v_iflag & VI_DOOMED) { + vput(vp); + MNT_ILOCK(mp); + continue; + } + + nandfs_node = VTON(vp); + if (nandfs_node->nn_flags & IN_MODIFIED) { + nandfs_node->nn_flags &= ~(IN_MODIFIED); + update = 1; + } + + if (vp->v_bufobj.bo_dirty.bv_cnt) { + error = nandfs_iterate_dirty_buf(vp, seginfo, 0); + if (error) { + nandfs_error("%s: cannot iterate vnode:%p " + "err:%d\n", __func__, vp, error); + vput(vp); + return (error); + } + update = 1; + } else + vput(vp); + + if (update) + nandfs_node_update(nandfs_node); + + MNT_ILOCK(mp); + } + + MNT_IUNLOCK(mp); + + return (0); +} + +static int +nandfs_update_phys_block(struct nandfs_device *fsdev, struct buf *bp, + uint64_t phys_blknr, union nandfs_binfo *binfo) +{ + struct nandfs_node *node, *dat; + struct vnode *vp; + uint64_t new_blknr; + int error; + + vp = bp->b_vp; + node = VTON(vp); + new_blknr = nandfs_vblk_get(bp); + dat = fsdev->nd_dat_node; + + DPRINTF(BMAP, ("%s: ino %#jx lblk %#jx: vblk %#jx -> %#jx\n", + __func__, (uintmax_t)node->nn_ino, (uintmax_t)bp->b_lblkno, + (uintmax_t)new_blknr, (uintmax_t)phys_blknr)); + + if (node->nn_ino != NANDFS_DAT_INO) { + KASSERT((new_blknr != 0), ("vblk for bp %p is 0", bp)); + + nandfs_vblock_assign(fsdev, new_blknr, phys_blknr); + binfo->bi_v.bi_vblocknr = new_blknr; + binfo->bi_v.bi_blkoff = bp->b_lblkno; + binfo->bi_v.bi_ino = node->nn_ino; + } else { + VOP_LOCK(NTOV(dat), LK_EXCLUSIVE); + error = nandfs_bmap_update_block(node, bp, phys_blknr); + if (error) { + nandfs_error("%s: error updating block:%jx for bp:%p\n", + __func__, (uintmax_t)phys_blknr, bp); + VOP_UNLOCK(NTOV(dat), 0); + return (error); + } + VOP_UNLOCK(NTOV(dat), 0); + binfo->bi_dat.bi_blkoff = bp->b_lblkno; + binfo->bi_dat.bi_ino = node->nn_ino; + if (NANDFS_IS_INDIRECT(bp)) + binfo->bi_dat.bi_level = 1; + else + binfo->bi_dat.bi_level = 0; + } + + return (0); +} + +#define NBINFO(off) ((off) + sizeof(union nandfs_binfo)) +static int +nandfs_segment_assign_pblk(struct nandfs_segment *nfsseg) +{ + struct nandfs_device *fsdev; + union nandfs_binfo *binfo; + struct buf *bp, *seg_bp; + uint64_t blocknr; + uint32_t curr_off, blocksize; + int error; + + fsdev = nfsseg->fsdev; + blocksize = fsdev->nd_blocksize; + + blocknr = nfsseg->start_block + nfsseg->segsum_blocks; + seg_bp = TAILQ_FIRST(&nfsseg->segsum); + DPRINTF(SYNC, ("%s: seg:%p segsum bp:%p data:%p\n", + __func__, nfsseg, seg_bp, seg_bp->b_data)); + + binfo = (union nandfs_binfo *)(seg_bp->b_data + + sizeof(struct nandfs_segment_summary)); + curr_off = sizeof(struct nandfs_segment_summary); + + TAILQ_FOREACH(bp, &nfsseg->data, b_cluster.cluster_entry) { + KASSERT((bp->b_vp), ("bp %p has not vp", bp)); + + DPRINTF(BMAP, ("\n\n%s: assign buf %p for ino %#jx next %p\n", + __func__, bp, (uintmax_t)VTON(bp->b_vp)->nn_ino, + TAILQ_NEXT(bp, b_cluster.cluster_entry))); + + if (NBINFO(curr_off) > blocksize) { + seg_bp = TAILQ_NEXT(seg_bp, b_cluster.cluster_entry); + binfo = (union nandfs_binfo *)seg_bp->b_data; + curr_off = 0; + DPRINTF(SYNC, ("%s: next segsum %p data %p\n", + __func__, seg_bp, seg_bp->b_data)); + } + + error = nandfs_update_phys_block(fsdev, bp, blocknr, binfo); + if (error) { + nandfs_error("%s: err:%d when updatinng phys block:%jx" + " for bp:%p and binfo:%p\n", __func__, error, + (uintmax_t)blocknr, bp, binfo); + return (error); + } + binfo++; + curr_off = NBINFO(curr_off); + + blocknr++; + } + + return (0); +} + +static int +nandfs_seginfo_assign_pblk(struct nandfs_seginfo *seginfo) +{ + struct nandfs_segment *nfsseg; + int error = 0; + + LIST_FOREACH(nfsseg, &seginfo->seg_list, seg_link) { + error = nandfs_segment_assign_pblk(nfsseg); + if (error) + break; + } + + return (error); +} + +static struct nandfs_segment_summary * +nandfs_fill_segsum(struct nandfs_segment *seg, int has_sr) +{ + struct nandfs_segment_summary *ss; + struct nandfs_device *fsdev; + struct buf *bp; + uint32_t rest, segsum_size, blocksize, crc_calc; + uint16_t flags; + uint8_t *crc_area, crc_skip; + + DPRINTF(SYNC, ("%s: seg %#jx nblocks %#x sumbytes %#x\n", + __func__, (uintmax_t) seg->seg_num, + seg->nblocks + seg->segsum_blocks, + seg->segsum_bytes)); + + fsdev = seg->fsdev; + + flags = NANDFS_SS_LOGBGN | NANDFS_SS_LOGEND; + if (has_sr) + flags |= NANDFS_SS_SR; + + bp = TAILQ_FIRST(&seg->segsum); + ss = (struct nandfs_segment_summary *) bp->b_data; + ss->ss_magic = NANDFS_SEGSUM_MAGIC; + ss->ss_bytes = sizeof(struct nandfs_segment_summary); + ss->ss_flags = flags; + ss->ss_seq = ++(fsdev->nd_seg_sequence); + ss->ss_create = fsdev->nd_ts.tv_sec; + nandfs_get_segment_range(fsdev, seg->seg_next, &ss->ss_next, NULL); + ss->ss_nblocks = seg->nblocks + seg->segsum_blocks; + ss->ss_nbinfos = seg->nbinfos; + ss->ss_sumbytes = seg->segsum_bytes; + + crc_skip = sizeof(ss->ss_datasum) + sizeof(ss->ss_sumsum); + blocksize = seg->fsdev->nd_blocksize; + + segsum_size = seg->segsum_bytes - crc_skip; + rest = min(seg->segsum_bytes, blocksize) - crc_skip; + crc_area = (uint8_t *)ss + crc_skip; + crc_calc = ~0U; + while (segsum_size > 0) { + crc_calc = crc32_raw(crc_area, rest, crc_calc); + segsum_size -= rest; + if (!segsum_size) + break; + bp = TAILQ_NEXT(bp, b_cluster.cluster_entry); + crc_area = (uint8_t *)bp->b_data; + rest = segsum_size <= blocksize ? segsum_size : blocksize; + } + ss->ss_sumsum = crc_calc ^ ~0U; + + return (ss); + +} + +static int +nandfs_save_buf(struct buf *bp, uint64_t blocknr, struct nandfs_device *fsdev) +{ + struct bufobj *bo; + int error; + + bo = &fsdev->nd_devvp->v_bufobj; + + bp->b_blkno = nandfs_block_to_dblock(fsdev, blocknr); + bp->b_iooffset = dbtob(bp->b_blkno); + + KASSERT(bp->b_bufobj != NULL, ("no bufobj for %p", bp)); + if (bp->b_bufobj != bo) { + BO_LOCK(bp->b_bufobj); + BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK, + BO_MTX(bp->b_bufobj)); + KASSERT(BUF_ISLOCKED(bp), ("Problem with locking buffer")); + } + + DPRINTF(SYNC, ("%s: buf: %p offset %#jx blk %#jx size %#x\n", + __func__, bp, (uintmax_t)bp->b_offset, (uintmax_t)blocknr, + fsdev->nd_blocksize)); + + NANDFS_UNGATHER(bp); + nandfs_buf_clear(bp, 0xffffffff); + bp->b_flags &= ~(B_ASYNC|B_INVAL|B_MANAGED); + error = bwrite(bp); + if (error) { + nandfs_error("%s: error:%d when writing buffer:%p\n", + __func__, error, bp); + return (error); + } + return (error); +} + +static void +nandfs_clean_buf(struct nandfs_device *fsdev, struct buf *bp) +{ + + DPRINTF(SYNC, ("%s: buf: %p\n", __func__, bp)); + + NANDFS_UNGATHER(bp); + nandfs_buf_clear(bp, 0xffffffff); + bp->b_flags &= ~(B_ASYNC|B_INVAL|B_MANAGED); + nandfs_undirty_buf_fsdev(fsdev, bp); +} + +static void +nandfs_clean_segblocks(struct nandfs_segment *seg, uint8_t unlock) +{ + struct nandfs_device *fsdev = seg->fsdev; + struct nandfs_segment *next_seg; + struct buf *bp, *tbp, *next_bp; + struct vnode *vp, *next_vp; + + VOP_LOCK(fsdev->nd_devvp, LK_EXCLUSIVE); + TAILQ_FOREACH_SAFE(bp, &seg->segsum, b_cluster.cluster_entry, tbp) { + TAILQ_REMOVE(&seg->segsum, bp, b_cluster.cluster_entry); + nandfs_clean_buf(fsdev, bp); + }; + + TAILQ_FOREACH_SAFE(bp, &seg->data, b_cluster.cluster_entry, tbp) { + TAILQ_REMOVE(&seg->data, bp, b_cluster.cluster_entry); + + /* + * If bp is not super-root and vnode is not currently + * locked lock it. + */ + vp = bp->b_vp; + next_vp = NULL; + next_bp = TAILQ_NEXT(bp, b_cluster.cluster_entry); + if (!next_bp) { + next_seg = LIST_NEXT(seg, seg_link); + if (next_seg) + next_bp = TAILQ_FIRST(&next_seg->data); + } + + if (next_bp) + next_vp = next_bp->b_vp; + + nandfs_clean_buf(fsdev, bp); + + if (unlock && vp != NULL && next_vp != vp && + !NANDFS_SYS_NODE(VTON(vp)->nn_ino)) + vput(vp); + + nandfs_dirty_bufs_decrement(fsdev); + } + + VOP_UNLOCK(fsdev->nd_devvp, 0); +} + +static int +nandfs_save_segblocks(struct nandfs_segment *seg, uint8_t unlock) +{ + struct nandfs_device *fsdev = seg->fsdev; + struct nandfs_segment *next_seg; + struct buf *bp, *tbp, *next_bp; + struct vnode *vp, *next_vp; + uint64_t blocknr; + uint32_t i = 0; + int error = 0; + + VOP_LOCK(fsdev->nd_devvp, LK_EXCLUSIVE); + TAILQ_FOREACH_SAFE(bp, &seg->segsum, b_cluster.cluster_entry, tbp) { + TAILQ_REMOVE(&seg->segsum, bp, b_cluster.cluster_entry); + blocknr = seg->start_block + i; + error = nandfs_save_buf(bp, blocknr, fsdev); + if (error) { + nandfs_error("%s: error saving buf: %p blocknr:%jx\n", + __func__, bp, (uintmax_t)blocknr); + goto out; + } + i++; + }; + + i = 0; + TAILQ_FOREACH_SAFE(bp, &seg->data, b_cluster.cluster_entry, tbp) { + TAILQ_REMOVE(&seg->data, bp, b_cluster.cluster_entry); + + blocknr = seg->start_block + seg->segsum_blocks + i; + /* + * If bp is not super-root and vnode is not currently + * locked lock it. + */ + vp = bp->b_vp; + next_vp = NULL; + next_bp = TAILQ_NEXT(bp, b_cluster.cluster_entry); + if (!next_bp) { + next_seg = LIST_NEXT(seg, seg_link); + if (next_seg) + next_bp = TAILQ_FIRST(&next_seg->data); + } + + if (next_bp) + next_vp = next_bp->b_vp; + + error = nandfs_save_buf(bp, blocknr, fsdev); + if (error) { + nandfs_error("%s: error saving buf: %p blknr: %jx\n", + __func__, bp, (uintmax_t)blocknr); + if (unlock && vp != NULL && next_vp != vp && + !NANDFS_SYS_NODE(VTON(vp)->nn_ino)) + vput(vp); + goto out; + } + + if (unlock && vp != NULL && next_vp != vp && + !NANDFS_SYS_NODE(VTON(vp)->nn_ino)) + vput(vp); + + i++; + nandfs_dirty_bufs_decrement(fsdev); + } +out: + if (error) { + nandfs_clean_segblocks(seg, unlock); + VOP_UNLOCK(fsdev->nd_devvp, 0); + return (error); + } + + VOP_UNLOCK(fsdev->nd_devvp, 0); + return (error); +} + + +static void +clean_seginfo(struct nandfs_seginfo *seginfo, uint8_t unlock) +{ + struct nandfs_segment *seg; + + DPRINTF(SYNC, ("%s: seginfo %p\n", __func__, seginfo)); + + LIST_FOREACH(seg, &seginfo->seg_list, seg_link) { + nandfs_clean_segblocks(seg, unlock); + } +} + +static int +save_seginfo(struct nandfs_seginfo *seginfo, uint8_t unlock) +{ + struct nandfs_segment *seg; + struct nandfs_device *fsdev; + struct nandfs_segment_summary *ss; + int error = 0; + + fsdev = seginfo->fsdev; + + DPRINTF(SYNC, ("%s: seginfo %p\n", __func__, seginfo)); + + LIST_FOREACH(seg, &seginfo->seg_list, seg_link) { + if (LIST_NEXT(seg, seg_link)) { + nandfs_fill_segsum(seg, 0); + error = nandfs_save_segblocks(seg, unlock); + if (error) { + nandfs_error("%s: error:%d saving seg:%p\n", + __func__, error, seg); + goto out; + } + } else { + ss = nandfs_fill_segsum(seg, 1); + fsdev->nd_last_segsum = *ss; + error = nandfs_save_segblocks(seg, unlock); + if (error) { + nandfs_error("%s: error:%d saving seg:%p\n", + __func__, error, seg); + goto out; + } + fsdev->nd_last_cno++; + fsdev->nd_last_pseg = seg->start_block; + } + } +out: + if (error) + clean_seginfo(seginfo, unlock); + return (error); +} + +static void +nandfs_invalidate_bufs(struct nandfs_device *fsdev, uint64_t segno) +{ + uint64_t start, end; + struct buf *bp, *tbd; + struct bufobj *bo; + + nandfs_get_segment_range(fsdev, segno, &start, &end); + + bo = &NTOV(fsdev->nd_gc_node)->v_bufobj; + + BO_LOCK(bo); +restart_locked_gc: + TAILQ_FOREACH_SAFE(bp, &bo->bo_clean.bv_hd, b_bobufs, tbd) { + if (!(bp->b_lblkno >= start && bp->b_lblkno <= end)) + continue; + + if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL)) + goto restart_locked_gc; + + bremfree(bp); + bp->b_flags |= (B_INVAL | B_RELBUF); + bp->b_flags &= ~(B_ASYNC | B_MANAGED); + BO_UNLOCK(bo); + brelse(bp); + BO_LOCK(bo); + } + BO_UNLOCK(bo); +} + +/* Process segments marks to free by cleaner */ +static void +nandfs_process_segments(struct nandfs_device *fsdev) +{ + uint64_t saved_segment; + int i; + + if (fsdev->nd_free_base) { + saved_segment = nandfs_get_segnum_of_block(fsdev, + fsdev->nd_super.s_last_pseg); + for (i = 0; i < fsdev->nd_free_count; i++) { + if (fsdev->nd_free_base[i] == NANDFS_NOSEGMENT) + continue; + /* Update superblock if clearing segment point by it */ + if (fsdev->nd_free_base[i] == saved_segment) { + nandfs_write_superblock(fsdev); + saved_segment = nandfs_get_segnum_of_block( + fsdev, fsdev->nd_super.s_last_pseg); + } + nandfs_invalidate_bufs(fsdev, fsdev->nd_free_base[i]); + nandfs_clear_segment(fsdev, fsdev->nd_free_base[i]); + } + + free(fsdev->nd_free_base, M_NANDFSTEMP); + fsdev->nd_free_base = NULL; + fsdev->nd_free_count = 0; + } +} + +/* Collect and write dirty buffers */ +int +nandfs_sync_file(struct vnode *vp) +{ + struct nandfs_device *fsdev; + struct nandfs_node *nandfs_node; + struct nandfsmount *nmp; + struct nandfs_node *dat, *su, *ifile, *cp; + struct nandfs_seginfo *seginfo = NULL; + struct nandfs_segment *seg; + int update, error; + int cno_changed; + + ASSERT_VOP_LOCKED(vp, __func__); + DPRINTF(SYNC, ("%s: START\n", __func__)); + + error = 0; + nmp = VFSTONANDFS(vp->v_mount); + fsdev = nmp->nm_nandfsdev; + + dat = fsdev->nd_dat_node; + su = fsdev->nd_su_node; + cp = fsdev->nd_cp_node; + ifile = nmp->nm_ifile_node; + + NANDFS_WRITEASSERT(fsdev); + if (lockmgr(&fsdev->nd_seg_const, LK_UPGRADE, NULL) != 0) { + DPRINTF(SYNC, ("%s: lost shared lock\n", __func__)); + if (lockmgr(&fsdev->nd_seg_const, LK_EXCLUSIVE, NULL) != 0) + panic("couldn't lock exclusive"); + } + DPRINTF(SYNC, ("%s: got lock\n", __func__)); + + VOP_LOCK(NTOV(su), LK_EXCLUSIVE); + create_seginfo(fsdev, &seginfo); + + update = 0; + + nandfs_node = VTON(vp); + if (nandfs_node->nn_flags & IN_MODIFIED) { + nandfs_node->nn_flags &= ~(IN_MODIFIED); + update = 1; + } + + if (vp->v_bufobj.bo_dirty.bv_cnt) { + error = nandfs_iterate_dirty_buf(vp, seginfo, 0); + if (error) { + clean_seginfo(seginfo, 0); + delete_seginfo(seginfo); + VOP_UNLOCK(NTOV(su), 0); + lockmgr(&fsdev->nd_seg_const, LK_DOWNGRADE, NULL); + nandfs_error("%s: err:%d iterating dirty bufs vp:%p", + __func__, error, vp); + return (error); + } + update = 1; + } + + if (update) { + VOP_LOCK(NTOV(ifile), LK_EXCLUSIVE); + error = nandfs_node_update(nandfs_node); + if (error) { + clean_seginfo(seginfo, 0); + delete_seginfo(seginfo); + VOP_UNLOCK(NTOV(ifile), 0); + VOP_UNLOCK(NTOV(su), 0); + lockmgr(&fsdev->nd_seg_const, LK_DOWNGRADE, NULL); + nandfs_error("%s: err:%d updating vp:%p", + __func__, error, vp); + return (error); + } + VOP_UNLOCK(NTOV(ifile), 0); + } + + cno_changed = 0; + if (seginfo->blocks) { + VOP_LOCK(NTOV(cp), LK_EXCLUSIVE); + cno_changed = 1; + /* Create new checkpoint */ + error = nandfs_get_checkpoint(fsdev, cp, fsdev->nd_last_cno + 1); + if (error) { + clean_seginfo(seginfo, 0); + delete_seginfo(seginfo); + VOP_UNLOCK(NTOV(cp), 0); + VOP_UNLOCK(NTOV(su), 0); + lockmgr(&fsdev->nd_seg_const, LK_DOWNGRADE, NULL); + nandfs_error("%s: err:%d getting cp:%jx", + __func__, error, fsdev->nd_last_cno + 1); + return (error); + } + + /* Reiterate all blocks and assign physical block number */ + nandfs_seginfo_assign_pblk(seginfo); + + /* Fill checkpoint data */ + error = nandfs_set_checkpoint(fsdev, cp, fsdev->nd_last_cno + 1, + &ifile->nn_inode, seginfo->blocks); + if (error) { + clean_seginfo(seginfo, 0); + delete_seginfo(seginfo); + VOP_UNLOCK(NTOV(cp), 0); + VOP_UNLOCK(NTOV(su), 0); + lockmgr(&fsdev->nd_seg_const, LK_DOWNGRADE, NULL); + nandfs_error("%s: err:%d setting cp:%jx", + __func__, error, fsdev->nd_last_cno + 1); + return (error); + } + + VOP_UNLOCK(NTOV(cp), 0); + LIST_FOREACH(seg, &seginfo->seg_list, seg_link) + nandfs_update_segment(fsdev, seg->seg_num, + seg->nblocks + seg->segsum_blocks); + + VOP_LOCK(NTOV(dat), LK_EXCLUSIVE); + error = save_seginfo(seginfo, 0); + if (error) { + clean_seginfo(seginfo, 0); + delete_seginfo(seginfo); + VOP_UNLOCK(NTOV(dat), 0); + VOP_UNLOCK(NTOV(su), 0); + lockmgr(&fsdev->nd_seg_const, LK_DOWNGRADE, NULL); + nandfs_error("%s: err:%d updating seg", + __func__, error); + return (error); + } + VOP_UNLOCK(NTOV(dat), 0); + } + + VOP_UNLOCK(NTOV(su), 0); + + delete_seginfo(seginfo); + lockmgr(&fsdev->nd_seg_const, LK_DOWNGRADE, NULL); + + if (cno_changed && !error) { + if (nandfs_cps_between_sblocks != 0 && + fsdev->nd_last_cno % nandfs_cps_between_sblocks == 0) + nandfs_write_superblock(fsdev); + } + + ASSERT_VOP_LOCKED(vp, __func__); + DPRINTF(SYNC, ("%s: END error %d\n", __func__, error)); + return (error); +} + +int +nandfs_segment_constructor(struct nandfsmount *nmp, int flags) +{ + struct nandfs_device *fsdev; + struct nandfs_seginfo *seginfo = NULL; + struct nandfs_segment *seg; + struct nandfs_node *dat, *su, *ifile, *cp, *gc; + int cno_changed, error; + + DPRINTF(SYNC, ("%s: START\n", __func__)); + fsdev = nmp->nm_nandfsdev; + + lockmgr(&fsdev->nd_seg_const, LK_EXCLUSIVE, NULL); + DPRINTF(SYNC, ("%s: git lock\n", __func__)); +again: + create_seginfo(fsdev, &seginfo); + + dat = fsdev->nd_dat_node; + su = fsdev->nd_su_node; + cp = fsdev->nd_cp_node; + gc = fsdev->nd_gc_node; + ifile = nmp->nm_ifile_node; + + VOP_LOCK(NTOV(su), LK_EXCLUSIVE); + VOP_LOCK(NTOV(ifile), LK_EXCLUSIVE); + VOP_LOCK(NTOV(gc), LK_EXCLUSIVE); + VOP_LOCK(NTOV(cp), LK_EXCLUSIVE); + + nandfs_iterate_system_vnode(gc, seginfo); + nandfs_iterate_dirty_vnodes(nmp->nm_vfs_mountp, seginfo); + nandfs_iterate_system_vnode(ifile, seginfo); + nandfs_iterate_system_vnode(su, seginfo); + + cno_changed = 0; + if (seginfo->blocks || flags) { + cno_changed = 1; + /* Create new checkpoint */ + error = nandfs_get_checkpoint(fsdev, cp, fsdev->nd_last_cno + 1); + if (error) { + clean_seginfo(seginfo, 0); + delete_seginfo(seginfo); + goto error_locks; + } + + /* Collect blocks from system files */ + nandfs_iterate_system_vnode(cp, seginfo); + nandfs_iterate_system_vnode(su, seginfo); + VOP_LOCK(NTOV(dat), LK_EXCLUSIVE); + nandfs_iterate_system_vnode(dat, seginfo); + VOP_UNLOCK(NTOV(dat), 0); +reiterate: + seginfo->reiterate = 0; + nandfs_iterate_system_vnode(su, seginfo); + VOP_LOCK(NTOV(dat), LK_EXCLUSIVE); + nandfs_iterate_system_vnode(dat, seginfo); + VOP_UNLOCK(NTOV(dat), 0); + if (seginfo->reiterate) + goto reiterate; + if (!(seginfo->curseg) || !seginfo->curseg->num_blocks) { + error = create_segment(seginfo); + if (error) { + clean_seginfo(seginfo, 0); + delete_seginfo(seginfo); + goto error_locks; + } + goto reiterate; + } + + /* Reiterate all blocks and assign physical block number */ + nandfs_seginfo_assign_pblk(seginfo); + + /* Fill superroot */ + error = nandfs_add_superroot(seginfo); + if (error) { + clean_seginfo(seginfo, 0); + delete_seginfo(seginfo); + goto error_locks; + } + KASSERT(!(seginfo->reiterate), ("reiteration after superroot")); + + /* Fill checkpoint data */ + nandfs_set_checkpoint(fsdev, cp, fsdev->nd_last_cno + 1, + &ifile->nn_inode, seginfo->blocks); + + LIST_FOREACH(seg, &seginfo->seg_list, seg_link) + nandfs_update_segment(fsdev, seg->seg_num, + seg->nblocks + seg->segsum_blocks); + + VOP_LOCK(NTOV(dat), LK_EXCLUSIVE); + error = save_seginfo(seginfo, 1); + if (error) { + clean_seginfo(seginfo, 1); + delete_seginfo(seginfo); + goto error_dat; + } + VOP_UNLOCK(NTOV(dat), 0); + } + + VOP_UNLOCK(NTOV(cp), 0); + VOP_UNLOCK(NTOV(gc), 0); + VOP_UNLOCK(NTOV(ifile), 0); + + nandfs_process_segments(fsdev); + + VOP_UNLOCK(NTOV(su), 0); + + delete_seginfo(seginfo); + + /* + * XXX: a hack, will go away soon + */ + if ((NTOV(dat)->v_bufobj.bo_dirty.bv_cnt != 0 || + NTOV(cp)->v_bufobj.bo_dirty.bv_cnt != 0 || + NTOV(gc)->v_bufobj.bo_dirty.bv_cnt != 0 || + NTOV(ifile)->v_bufobj.bo_dirty.bv_cnt != 0 || + NTOV(su)->v_bufobj.bo_dirty.bv_cnt != 0) && + (flags & NANDFS_UMOUNT)) { + DPRINTF(SYNC, ("%s: RERUN\n", __func__)); + goto again; + } + + MPASS(fsdev->nd_free_base == NULL); + + lockmgr(&fsdev->nd_seg_const, LK_RELEASE, NULL); + + if (cno_changed) { + if ((nandfs_cps_between_sblocks != 0 && + fsdev->nd_last_cno % nandfs_cps_between_sblocks == 0) || + flags & NANDFS_UMOUNT) + nandfs_write_superblock(fsdev); + } + + DPRINTF(SYNC, ("%s: END\n", __func__)); + return (0); +error_dat: + VOP_UNLOCK(NTOV(dat), 0); +error_locks: + VOP_UNLOCK(NTOV(cp), 0); + VOP_UNLOCK(NTOV(gc), 0); + VOP_UNLOCK(NTOV(ifile), 0); + VOP_UNLOCK(NTOV(su), 0); + lockmgr(&fsdev->nd_seg_const, LK_RELEASE, NULL); + + return (error); +} + +#ifdef DDB +/* + * Show details about the given NANDFS mount point. + */ +DB_SHOW_COMMAND(nandfs, db_show_nandfs) +{ + struct mount *mp; + struct nandfs_device *nffsdev; + struct nandfs_segment *seg; + struct nandfsmount *nmp; + struct buf *bp; + struct vnode *vp; + + if (!have_addr) { + db_printf("\nUsage: show nandfs \n"); + return; + } + + mp = (struct mount *)addr; + db_printf("%p %s on %s (%s)\n", mp, mp->mnt_stat.f_mntfromname, + mp->mnt_stat.f_mntonname, mp->mnt_stat.f_fstypename); + + + nmp = (struct nandfsmount *)(mp->mnt_data); + nffsdev = nmp->nm_nandfsdev; + db_printf("dev vnode:%p\n", nffsdev->nd_devvp); + db_printf("blocksize:%jx last cno:%jx last pseg:%jx seg num:%jx\n", + (uintmax_t)nffsdev->nd_blocksize, (uintmax_t)nffsdev->nd_last_cno, + (uintmax_t)nffsdev->nd_last_pseg, (uintmax_t)nffsdev->nd_seg_num); + db_printf("system nodes: dat:%p cp:%p su:%p ifile:%p gc:%p\n", + nffsdev->nd_dat_node, nffsdev->nd_cp_node, nffsdev->nd_su_node, + nmp->nm_ifile_node, nffsdev->nd_gc_node); + + if (nffsdev->nd_seginfo != NULL) { + LIST_FOREACH(seg, &nffsdev->nd_seginfo->seg_list, seg_link) { + db_printf("seg: %p\n", seg); + TAILQ_FOREACH(bp, &seg->segsum, + b_cluster.cluster_entry) + db_printf("segbp %p\n", bp); + TAILQ_FOREACH(bp, &seg->data, + b_cluster.cluster_entry) { + vp = bp->b_vp; + db_printf("bp:%p bp->b_vp:%p ino:%jx\n", bp, vp, + (uintmax_t)(vp ? VTON(vp)->nn_ino : 0)); + } + } + } +} +#endif diff --git a/sys/fs/nandfs/nandfs_subr.c b/sys/fs/nandfs/nandfs_subr.c new file mode 100644 index 00000000000..b485422caab --- /dev/null +++ b/sys/fs/nandfs/nandfs_subr.c @@ -0,0 +1,1120 @@ +/*- + * Copyright (c) 2010-2012 Semihalf + * Copyright (c) 2008, 2009 Reinoud Zandijk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * From: NetBSD: nilfs_subr.c,v 1.4 2009/07/29 17:06:57 reinoud + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include "nandfs_mount.h" +#include "nandfs.h" +#include "nandfs_subr.h" + +MALLOC_DEFINE(M_NANDFSMNT, "nandfs_mount", "NANDFS mount");; +MALLOC_DEFINE(M_NANDFSTEMP, "nandfs_tmt", "NANDFS tmp"); + +uma_zone_t nandfs_node_zone; + +void nandfs_bdflush(struct bufobj *bo, struct buf *bp); +int nandfs_bufsync(struct bufobj *bo, int waitfor); + +struct buf_ops buf_ops_nandfs = { + .bop_name = "buf_ops_nandfs", + .bop_write = bufwrite, + .bop_strategy = bufstrategy, + .bop_sync = nandfs_bufsync, + .bop_bdflush = nandfs_bdflush, +}; + +int +nandfs_bufsync(struct bufobj *bo, int waitfor) +{ + struct vnode *vp; + int error = 0; + + vp = bo->__bo_vnode; + + ASSERT_VOP_LOCKED(vp, __func__); + error = nandfs_sync_file(vp); + if (error) + nandfs_warning("%s: cannot flush buffers err:%d\n", + __func__, error); + + return (error); +} + +void +nandfs_bdflush(bo, bp) + struct bufobj *bo; + struct buf *bp; +{ + struct vnode *vp; + int error; + + if (bo->bo_dirty.bv_cnt <= ((dirtybufthresh * 8) / 10)) + return; + + vp = bp->b_vp; + if (NANDFS_SYS_NODE(VTON(vp)->nn_ino)) + return; + + if (NANDFS_IS_INDIRECT(bp)) + return; + + error = nandfs_sync_file(vp); + if (error) + nandfs_warning("%s: cannot flush buffers err:%d\n", + __func__, error); +} + +int +nandfs_init(struct vfsconf *vfsp) +{ + + nandfs_node_zone = uma_zcreate("nandfs node zone", + sizeof(struct nandfs_node), NULL, NULL, NULL, NULL, 0, 0); + + return (0); +} + +int +nandfs_uninit(struct vfsconf *vfsp) +{ + + uma_zdestroy(nandfs_node_zone); + return (0); +} + +/* Basic calculators */ +uint64_t +nandfs_get_segnum_of_block(struct nandfs_device *nandfsdev, + nandfs_daddr_t blocknr) +{ + uint64_t segnum, blks_per_seg; + + MPASS(blocknr >= nandfsdev->nd_fsdata.f_first_data_block); + + blks_per_seg = nandfsdev->nd_fsdata.f_blocks_per_segment; + + segnum = blocknr / blks_per_seg; + segnum -= nandfsdev->nd_fsdata.f_first_data_block / blks_per_seg; + + DPRINTF(SYNC, ("%s: returning blocknr %jx -> segnum %jx\n", __func__, + blocknr, segnum)); + + return (segnum); +} + +void +nandfs_get_segment_range(struct nandfs_device *nandfsdev, uint64_t segnum, + uint64_t *seg_start, uint64_t *seg_end) +{ + uint64_t blks_per_seg; + + blks_per_seg = nandfsdev->nd_fsdata.f_blocks_per_segment; + *seg_start = nandfsdev->nd_fsdata.f_first_data_block + + blks_per_seg * segnum; + if (seg_end != NULL) + *seg_end = *seg_start + blks_per_seg -1; +} + +void nandfs_calc_mdt_consts(struct nandfs_device *nandfsdev, + struct nandfs_mdt *mdt, int entry_size) +{ + uint32_t blocksize = nandfsdev->nd_blocksize; + + mdt->entries_per_group = blocksize * 8; + mdt->entries_per_block = blocksize / entry_size; + + mdt->blocks_per_group = + (mdt->entries_per_group -1) / mdt->entries_per_block + 1 + 1; + mdt->groups_per_desc_block = + blocksize / sizeof(struct nandfs_block_group_desc); + mdt->blocks_per_desc_block = + mdt->groups_per_desc_block * mdt->blocks_per_group + 1; +} + +int +nandfs_dev_bread(struct nandfs_device *nandfsdev, nandfs_lbn_t blocknr, + struct ucred *cred, int flags, struct buf **bpp) +{ + int blk2dev = nandfsdev->nd_blocksize / DEV_BSIZE; + int error; + + DPRINTF(BLOCK, ("%s: read from block %jx vp %p\n", __func__, + blocknr * blk2dev, nandfsdev->nd_devvp)); + error = bread(nandfsdev->nd_devvp, blocknr * blk2dev, + nandfsdev->nd_blocksize, NOCRED, bpp); + if (error) + nandfs_error("%s: cannot read from device - blk:%jx\n", + __func__, blocknr); + return (error); +} + +/* Read on a node */ +int +nandfs_bread(struct nandfs_node *node, nandfs_lbn_t blocknr, + struct ucred *cred, int flags, struct buf **bpp) +{ + nandfs_daddr_t vblk; + int error; + + DPRINTF(BLOCK, ("%s: vp:%p lbn:%#jx\n", __func__, NTOV(node), + blocknr)); + + error = bread(NTOV(node), blocknr, node->nn_nandfsdev->nd_blocksize, + cred, bpp); + + KASSERT(error == 0, ("%s: vp:%p lbn:%#jx err:%d\n", __func__, + NTOV(node), blocknr, error)); + + if (!nandfs_vblk_get(*bpp) && + ((*bpp)->b_flags & B_CACHE) && node->nn_ino != NANDFS_DAT_INO) { + nandfs_bmap_lookup(node, blocknr, &vblk); + nandfs_vblk_set(*bpp, vblk); + } + return (error); +} + +int +nandfs_bread_meta(struct nandfs_node *node, nandfs_lbn_t blocknr, + struct ucred *cred, int flags, struct buf **bpp) +{ + nandfs_daddr_t vblk; + int error; + + DPRINTF(BLOCK, ("%s: vp:%p lbn:%#jx\n", __func__, NTOV(node), + blocknr)); + + error = bread(NTOV(node), blocknr, node->nn_nandfsdev->nd_blocksize, + cred, bpp); + + KASSERT(error == 0, ("%s: vp:%p lbn:%#jx err:%d\n", __func__, + NTOV(node), blocknr, error)); + + if (!nandfs_vblk_get(*bpp) && + ((*bpp)->b_flags & B_CACHE) && node->nn_ino != NANDFS_DAT_INO) { + nandfs_bmap_lookup(node, blocknr, &vblk); + nandfs_vblk_set(*bpp, vblk); + } + + return (error); +} + +int +nandfs_bdestroy(struct nandfs_node *node, nandfs_daddr_t vblk) +{ + int error; + + if (!NANDFS_SYS_NODE(node->nn_ino)) + NANDFS_WRITEASSERT(node->nn_nandfsdev); + + error = nandfs_vblock_end(node->nn_nandfsdev, vblk); + if (error) { + nandfs_error("%s: ending vblk: %jx failed\n", + __func__, (uintmax_t)vblk); + return (error); + } + node->nn_inode.i_blocks--; + + return (0); +} + +int +nandfs_bcreate(struct nandfs_node *node, nandfs_lbn_t blocknr, + struct ucred *cred, int flags, struct buf **bpp) +{ + int error; + + ASSERT_VOP_LOCKED(NTOV(node), __func__); + if (!NANDFS_SYS_NODE(node->nn_ino)) + NANDFS_WRITEASSERT(node->nn_nandfsdev); + + DPRINTF(BLOCK, ("%s: vp:%p lbn:%#jx\n", __func__, NTOV(node), + blocknr)); + + *bpp = getblk(NTOV(node), blocknr, node->nn_nandfsdev->nd_blocksize, + 0, 0, 0); + + KASSERT((*bpp), ("%s: vp:%p lbn:%#jx\n", __func__, + NTOV(node), blocknr)); + + if (*bpp) { + vfs_bio_clrbuf(*bpp); + (*bpp)->b_blkno = ~(0); /* To avoid VOP_BMAP in bdwrite */ + error = nandfs_bmap_insert_block(node, blocknr, *bpp); + if (error) { + nandfs_warning("%s: failed bmap insert node:%p" + " blk:%jx\n", __func__, node, blocknr); + brelse(*bpp); + return (error); + } + node->nn_inode.i_blocks++; + + return (0); + } + + return (-1); +} + +int +nandfs_bcreate_meta(struct nandfs_node *node, nandfs_lbn_t blocknr, + struct ucred *cred, int flags, struct buf **bpp) +{ + struct nandfs_device *fsdev; + nandfs_daddr_t vblk; + int error; + + ASSERT_VOP_LOCKED(NTOV(node), __func__); + NANDFS_WRITEASSERT(node->nn_nandfsdev); + + DPRINTF(BLOCK, ("%s: vp:%p lbn:%#jx\n", __func__, NTOV(node), + blocknr)); + + fsdev = node->nn_nandfsdev; + + *bpp = getblk(NTOV(node), blocknr, node->nn_nandfsdev->nd_blocksize, + 0, 0, 0); + + KASSERT((*bpp), ("%s: vp:%p lbn:%#jx\n", __func__, + NTOV(node), blocknr)); + + memset((*bpp)->b_data, 0, fsdev->nd_blocksize); + + vfs_bio_clrbuf(*bpp); + (*bpp)->b_blkno = ~(0); /* To avoid VOP_BMAP in bdwrite */ + + nandfs_buf_set(*bpp, NANDFS_VBLK_ASSIGNED); + + if (node->nn_ino != NANDFS_DAT_INO) { + error = nandfs_vblock_alloc(fsdev, &vblk); + if (error) { + nandfs_buf_clear(*bpp, NANDFS_VBLK_ASSIGNED); + brelse(*bpp); + return (error); + } + } else + vblk = fsdev->nd_fakevblk++; + + nandfs_vblk_set(*bpp, vblk); + + nandfs_bmap_insert_block(node, blocknr, *bpp); + return (0); +} + +/* Translate index to a file block number and an entry */ +void +nandfs_mdt_trans(struct nandfs_mdt *mdt, uint64_t index, + nandfs_lbn_t *blocknr, uint32_t *entry_in_block) +{ + uint64_t blknr; + uint64_t group, group_offset, blocknr_in_group; + uint64_t desc_block, desc_offset; + + /* Calculate our offset in the file */ + group = index / mdt->entries_per_group; + group_offset = index % mdt->entries_per_group; + desc_block = group / mdt->groups_per_desc_block; + desc_offset = group % mdt->groups_per_desc_block; + blocknr_in_group = group_offset / mdt->entries_per_block; + + /* To descgroup offset */ + blknr = 1 + desc_block * mdt->blocks_per_desc_block; + + /* To group offset */ + blknr += desc_offset * mdt->blocks_per_group; + + /* To actual file block */ + blknr += 1 + blocknr_in_group; + + *blocknr = blknr; + *entry_in_block = group_offset % mdt->entries_per_block; +} + +void +nandfs_mdt_trans_blk(struct nandfs_mdt *mdt, uint64_t index, + uint64_t *desc, uint64_t *bitmap, nandfs_lbn_t *blocknr, + uint32_t *entry_in_block) +{ + uint64_t blknr; + uint64_t group, group_offset, blocknr_in_group; + uint64_t desc_block, desc_offset; + + /* Calculate our offset in the file */ + group = index / mdt->entries_per_group; + group_offset = index % mdt->entries_per_group; + desc_block = group / mdt->groups_per_desc_block; + desc_offset = group % mdt->groups_per_desc_block; + blocknr_in_group = group_offset / mdt->entries_per_block; + + /* To descgroup offset */ + *desc = desc_block * mdt->blocks_per_desc_block; + blknr = 1 + desc_block * mdt->blocks_per_desc_block; + + /* To group offset */ + blknr += desc_offset * mdt->blocks_per_group; + *bitmap = blknr; + + /* To actual file block */ + blknr += 1 + blocknr_in_group; + + *blocknr = blknr; + *entry_in_block = group_offset % mdt->entries_per_block; + + DPRINTF(ALLOC, + ("%s: desc_buf: %jx bitmap_buf: %jx entry_buf: %jx entry: %x\n", + __func__, (uintmax_t)*desc, (uintmax_t)*bitmap, + (uintmax_t)*blocknr, *entry_in_block)); +} + +int +nandfs_vtop(struct nandfs_node *node, nandfs_daddr_t vblocknr, + nandfs_daddr_t *pblocknr) +{ + struct nandfs_node *dat_node; + struct nandfs_dat_entry *entry; + struct buf *bp; + nandfs_lbn_t ldatblknr; + uint32_t entry_in_block; + int locked, error; + + if (node->nn_ino == NANDFS_DAT_INO || node->nn_ino == NANDFS_GC_INO) { + *pblocknr = vblocknr; + return (0); + } + + /* only translate valid vblocknrs */ + if (vblocknr == 0) + return (0); + + dat_node = node->nn_nandfsdev->nd_dat_node; + nandfs_mdt_trans(&node->nn_nandfsdev->nd_dat_mdt, vblocknr, &ldatblknr, + &entry_in_block); + + locked = NANDFS_VOP_ISLOCKED(NTOV(dat_node)); + if (!locked) + VOP_LOCK(NTOV(dat_node), LK_SHARED); + error = nandfs_bread(dat_node, ldatblknr, NOCRED, 0, &bp); + if (error) { + DPRINTF(TRANSLATE, ("vtop: can't read in DAT block %#jx!\n", + (uintmax_t)ldatblknr)); + brelse(bp); + VOP_UNLOCK(NTOV(dat_node), 0); + return (error); + } + + /* Get our translation */ + entry = ((struct nandfs_dat_entry *) bp->b_data) + entry_in_block; + DPRINTF(TRANSLATE, ("\tentry %p data %p entry_in_block %x\n", + entry, bp->b_data, entry_in_block)) + DPRINTF(TRANSLATE, ("\tvblk %#jx -> %#jx for cp [%#jx-%#jx]\n", + (uintmax_t)vblocknr, (uintmax_t)entry->de_blocknr, + (uintmax_t)entry->de_start, (uintmax_t)entry->de_end)); + + *pblocknr = entry->de_blocknr; + brelse(bp); + if (!locked) + VOP_UNLOCK(NTOV(dat_node), 0); + + MPASS(*pblocknr >= node->nn_nandfsdev->nd_fsdata.f_first_data_block || + *pblocknr == 0); + + return (0); +} + +int +nandfs_segsum_valid(struct nandfs_segment_summary *segsum) +{ + + return (segsum->ss_magic == NANDFS_SEGSUM_MAGIC); +} + +int +nandfs_load_segsum(struct nandfs_device *fsdev, nandfs_daddr_t blocknr, + struct nandfs_segment_summary *segsum) +{ + struct buf *bp; + int error; + + DPRINTF(VOLUMES, ("nandfs: try segsum at block %jx\n", + (uintmax_t)blocknr)); + + error = nandfs_dev_bread(fsdev, blocknr, NOCRED, 0, &bp); + if (error) + return (error); + + memcpy(segsum, bp->b_data, sizeof(struct nandfs_segment_summary)); + brelse(bp); + + if (!nandfs_segsum_valid(segsum)) { + DPRINTF(VOLUMES, ("%s: bad magic pseg:%jx\n", __func__, + blocknr)); + return (EINVAL); + } + + return (error); +} + +static int +nandfs_load_super_root(struct nandfs_device *nandfsdev, + struct nandfs_segment_summary *segsum, uint64_t pseg) +{ + struct nandfs_super_root super_root; + struct buf *bp; + uint64_t blocknr; + uint32_t super_root_crc, comp_crc; + int off, error; + + /* Check if there is a superroot */ + if ((segsum->ss_flags & NANDFS_SS_SR) == 0) { + DPRINTF(VOLUMES, ("%s: no super root in pseg:%jx\n", __func__, + pseg)); + return (ENOENT); + } + + /* Get our super root, located at the end of the pseg */ + blocknr = pseg + segsum->ss_nblocks - 1; + DPRINTF(VOLUMES, ("%s: try at %#jx\n", __func__, (uintmax_t)blocknr)); + + error = nandfs_dev_bread(nandfsdev, blocknr, NOCRED, 0, &bp); + if (error) + return (error); + + memcpy(&super_root, bp->b_data, sizeof(struct nandfs_super_root)); + brelse(bp); + + /* Check super root CRC */ + super_root_crc = super_root.sr_sum; + off = sizeof(super_root.sr_sum); + comp_crc = crc32((uint8_t *)&super_root + off, + NANDFS_SR_BYTES - off); + + if (super_root_crc != comp_crc) { + DPRINTF(VOLUMES, ("%s: invalid crc:%#x [expect:%#x]\n", + __func__, super_root_crc, comp_crc)); + return (EINVAL); + } + + nandfsdev->nd_super_root = super_root; + DPRINTF(VOLUMES, ("%s: got valid superroot\n", __func__)); + + return (0); +} + +/* + * Search for the last super root recorded. + */ +int +nandfs_search_super_root(struct nandfs_device *nandfsdev) +{ + struct nandfs_super_block *super; + struct nandfs_segment_summary segsum; + uint64_t seg_start, seg_end, cno, seq, create, pseg; + uint64_t segnum; + int error, found; + + error = found = 0; + + /* Search for last super root */ + pseg = nandfsdev->nd_super.s_last_pseg; + segnum = nandfs_get_segnum_of_block(nandfsdev, pseg); + + cno = nandfsdev->nd_super.s_last_cno; + create = seq = 0; + DPRINTF(VOLUMES, ("%s: start in pseg %#jx\n", __func__, + (uintmax_t)pseg)); + + for (;;) { + error = nandfs_load_segsum(nandfsdev, pseg, &segsum); + if (error) + break; + + if (segsum.ss_seq < seq || segsum.ss_create < create) + break; + + /* Try to load super root */ + if (segsum.ss_flags & NANDFS_SS_SR) { + error = nandfs_load_super_root(nandfsdev, &segsum, pseg); + if (error) + break; /* confused */ + found = 1; + + super = &nandfsdev->nd_super; + nandfsdev->nd_last_segsum = segsum; + super->s_last_pseg = pseg; + super->s_last_cno = cno++; + super->s_last_seq = segsum.ss_seq; + super->s_state = NANDFS_VALID_FS; + seq = segsum.ss_seq; + create = segsum.ss_create; + } else { + seq = segsum.ss_seq; + create = segsum.ss_create; + } + + /* Calculate next partial segment location */ + pseg += segsum.ss_nblocks; + DPRINTF(VOLUMES, ("%s: next partial seg is %jx\n", __func__, + (uintmax_t)pseg)); + + /* Did we reach the end of the segment? if so, go to the next */ + nandfs_get_segment_range(nandfsdev, segnum, &seg_start, + &seg_end); + if (pseg >= seg_end) { + pseg = segsum.ss_next; + DPRINTF(VOLUMES, + (" partial seg oor next is %jx[%jx - %jx]\n", + (uintmax_t)pseg, (uintmax_t)seg_start, + (uintmax_t)seg_end)); + } + segnum = nandfs_get_segnum_of_block(nandfsdev, pseg); + } + + if (error && !found) + return (error); + + return (0); +} + +int +nandfs_get_node_raw(struct nandfs_device *nandfsdev, struct nandfsmount *nmp, + uint64_t ino, struct nandfs_inode *inode, struct nandfs_node **nodep) +{ + struct nandfs_node *node; + struct vnode *nvp; + struct mount *mp; + int error; + + *nodep = NULL; + + /* Associate with mountpoint if present */ + if (nmp) { + mp = nmp->nm_vfs_mountp; + error = getnewvnode("nandfs", mp, &nandfs_vnodeops, &nvp); + if (error) { + return (error); + } + } else { + mp = NULL; + error = getnewvnode("snandfs", mp, &nandfs_system_vnodeops, + &nvp); + if (error) { + return (error); + } + } + + if (mp) + NANDFS_WRITELOCK(nandfsdev); + + DPRINTF(IFILE, ("%s: ino: %#jx -> vp: %p\n", + __func__, (uintmax_t)ino, nvp)); + /* Lock node */ + lockmgr(nvp->v_vnlock, LK_EXCLUSIVE, NULL); + + if (mp) { + error = insmntque(nvp, mp); + if (error != 0) { + *nodep = NULL; + return (error); + } + } + + node = uma_zalloc(nandfs_node_zone, M_WAITOK | M_ZERO); + + /* Crosslink */ + node->nn_vnode = nvp; + nvp->v_bufobj.bo_ops = &buf_ops_nandfs; + node->nn_nmp = nmp; + node->nn_nandfsdev = nandfsdev; + nvp->v_data = node; + + /* Initiase NANDFS node */ + node->nn_ino = ino; + if (inode != NULL) + node->nn_inode = *inode; + + nandfs_vinit(nvp, ino); + + /* Return node */ + *nodep = node; + DPRINTF(IFILE, ("%s: ino:%#jx vp:%p node:%p\n", + __func__, (uintmax_t)ino, nvp, *nodep)); + + return (0); +} + +int +nandfs_get_node(struct nandfsmount *nmp, uint64_t ino, + struct nandfs_node **nodep) +{ + struct nandfs_device *nandfsdev; + struct nandfs_inode inode, *entry; + struct vnode *nvp, *vpp; + struct thread *td; + struct buf *bp; + uint64_t ivblocknr; + uint32_t entry_in_block; + int error; + + /* Look up node in hash table */ + td = curthread; + *nodep = NULL; + + if ((ino < NANDFS_ATIME_INO) && (ino != NANDFS_ROOT_INO)) { + printf("nandfs_get_node: system ino %"PRIu64" not in mount " + "point!\n", ino); + return (ENOENT); + } + + error = vfs_hash_get(nmp->nm_vfs_mountp, ino, LK_EXCLUSIVE, td, &nvp, + NULL, NULL); + if (error) + return (error); + + if (nvp != NULL) { + *nodep = (struct nandfs_node *)nvp->v_data; + return (0); + } + + /* Look up inode structure in mountpoints ifile */ + nandfsdev = nmp->nm_nandfsdev; + nandfs_mdt_trans(&nandfsdev->nd_ifile_mdt, ino, &ivblocknr, + &entry_in_block); + + VOP_LOCK(NTOV(nmp->nm_ifile_node), LK_SHARED); + error = nandfs_bread(nmp->nm_ifile_node, ivblocknr, NOCRED, 0, &bp); + if (error) { + brelse(bp); + VOP_UNLOCK(NTOV(nmp->nm_ifile_node), 0); + return (ENOENT); + } + + /* Get inode entry */ + entry = (struct nandfs_inode *) bp->b_data + entry_in_block; + memcpy(&inode, entry, sizeof(struct nandfs_inode)); + brelse(bp); + VOP_UNLOCK(NTOV(nmp->nm_ifile_node), 0); + + /* Get node */ + error = nandfs_get_node_raw(nmp->nm_nandfsdev, nmp, ino, &inode, nodep); + if (error) { + *nodep = NULL; + return (error); + } + + nvp = (*nodep)->nn_vnode; + error = vfs_hash_insert(nvp, ino, 0, td, &vpp, NULL, NULL); + if (error) { + *nodep = NULL; + return (error); + } + + return (error); +} + +void +nandfs_dispose_node(struct nandfs_node **nodep) +{ + struct nandfs_node *node; + struct vnode *vp; + + /* Protect against rogue values */ + node = *nodep; + if (!node) { + return; + } + DPRINTF(NODE, ("nandfs_dispose_node: %p\n", *nodep)); + + vp = NTOV(node); + vp->v_data = NULL; + + /* Free our associated memory */ + uma_zfree(nandfs_node_zone, node); + + *nodep = NULL; +} + +int +nandfs_lookup_name_in_dir(struct vnode *dvp, const char *name, int namelen, + uint64_t *ino, int *found, uint64_t *off) +{ + struct nandfs_node *dir_node = VTON(dvp); + struct nandfs_dir_entry *ndirent; + struct buf *bp; + uint64_t file_size, diroffset, blkoff; + uint64_t blocknr; + uint32_t blocksize = dir_node->nn_nandfsdev->nd_blocksize; + uint8_t *pos, name_len; + int error; + + *found = 0; + + DPRINTF(VNCALL, ("%s: %s file\n", __func__, name)); + if (dvp->v_type != VDIR) { + return (ENOTDIR); + } + + /* Get directory filesize */ + file_size = dir_node->nn_inode.i_size; + + /* Walk the directory */ + diroffset = 0; + blocknr = 0; + blkoff = 0; + error = nandfs_bread(dir_node, blocknr, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (EIO); + } + + while (diroffset < file_size) { + if (blkoff >= blocksize) { + blkoff = 0; blocknr++; + brelse(bp); + error = nandfs_bread(dir_node, blocknr, NOCRED, 0, + &bp); + if (error) { + brelse(bp); + return (EIO); + } + } + + /* Read in one dirent */ + pos = (uint8_t *) bp->b_data + blkoff; + ndirent = (struct nandfs_dir_entry *) pos; + name_len = ndirent->name_len; + + if ((name_len == namelen) && + (strncmp(name, ndirent->name, name_len) == 0) && + (ndirent->inode != 0)) { + *ino = ndirent->inode; + *off = diroffset; + DPRINTF(LOOKUP, ("found `%.*s` with ino %"PRIx64"\n", + name_len, ndirent->name, *ino)); + *found = 1; + break; + } + + /* Advance */ + diroffset += ndirent->rec_len; + blkoff += ndirent->rec_len; + } + brelse(bp); + + return (error); +} + +int +nandfs_get_fsinfo(struct nandfsmount *nmp, struct nandfs_fsinfo *fsinfo) +{ + struct nandfs_device *fsdev; + + fsdev = nmp->nm_nandfsdev; + + memcpy(&fsinfo->fs_fsdata, &fsdev->nd_fsdata, sizeof(fsdev->nd_fsdata)); + memcpy(&fsinfo->fs_super, &fsdev->nd_super, sizeof(fsdev->nd_super)); + snprintf(fsinfo->fs_dev, sizeof(fsinfo->fs_dev), + "%s", nmp->nm_vfs_mountp->mnt_stat.f_mntfromname); + + return (0); +} + +void +nandfs_inode_init(struct nandfs_inode *inode, uint16_t mode) +{ + struct timespec ts; + + vfs_timestamp(&ts); + + inode->i_blocks = 0; + inode->i_size = 0; + inode->i_ctime = ts.tv_sec; + inode->i_ctime_nsec = ts.tv_nsec; + inode->i_mtime = ts.tv_sec; + inode->i_mtime_nsec = ts.tv_nsec; + inode->i_mode = mode; + inode->i_links_count = 1; + if (S_ISDIR(mode)) + inode->i_links_count = 2; + inode->i_flags = 0; + + inode->i_special = 0; + memset(inode->i_db, 0, sizeof(inode->i_db)); + memset(inode->i_ib, 0, sizeof(inode->i_ib)); +} + +void +nandfs_inode_destroy(struct nandfs_inode *inode) +{ + + MPASS(inode->i_blocks == 0); + bzero(inode, sizeof(*inode)); +} + +int +nandfs_fs_full(struct nandfs_device *nffsdev) +{ + uint64_t space, bps; + + bps = nffsdev->nd_fsdata.f_blocks_per_segment; + space = (nffsdev->nd_clean_segs - 1) * bps; + + DPRINTF(BUF, ("%s: bufs:%jx space:%jx\n", __func__, + (uintmax_t)nffsdev->nd_dirty_bufs, (uintmax_t)space)); + + if (nffsdev->nd_dirty_bufs + (10 * bps) >= space) + return (1); + + return (0); +} + +static int +_nandfs_dirty_buf(struct buf *bp, int dirty_meta, int force) +{ + struct nandfs_device *nffsdev; + struct nandfs_node *node; + uint64_t ino, bps; + + if (NANDFS_ISGATHERED(bp)) { + bqrelse(bp); + return (0); + } + if ((bp->b_flags & (B_MANAGED | B_DELWRI)) == (B_MANAGED | B_DELWRI)) { + bqrelse(bp); + return (0); + } + + node = VTON(bp->b_vp); + nffsdev = node->nn_nandfsdev; + DPRINTF(BUF, ("%s: buf:%p\n", __func__, bp)); + ino = node->nn_ino; + + if (nandfs_fs_full(nffsdev) && !NANDFS_SYS_NODE(ino) && !force) { + brelse(bp); + return (ENOSPC); + } + + bp->b_flags |= B_MANAGED; + bdwrite(bp); + + nandfs_dirty_bufs_increment(nffsdev); + + KASSERT((bp->b_vp), ("vp missing for bp")); + KASSERT((nandfs_vblk_get(bp) || ino == NANDFS_DAT_INO), + ("bp vblk is 0")); + + /* + * To maintain consistency of FS we need to force making + * meta buffers dirty, even if free space is low. + */ + if (dirty_meta && ino != NANDFS_GC_INO) + nandfs_bmap_dirty_blocks(VTON(bp->b_vp), bp, 1); + + bps = nffsdev->nd_fsdata.f_blocks_per_segment; + + if (nffsdev->nd_dirty_bufs >= (bps * nandfs_max_dirty_segs)) { + mtx_lock(&nffsdev->nd_sync_mtx); + if (nffsdev->nd_syncing == 0) { + DPRINTF(SYNC, ("%s: wakeup gc\n", __func__)); + nffsdev->nd_syncing = 1; + wakeup(&nffsdev->nd_syncing); + } + mtx_unlock(&nffsdev->nd_sync_mtx); + } + + return (0); +} + +int +nandfs_dirty_buf(struct buf *bp, int force) +{ + + return (_nandfs_dirty_buf(bp, 1, force)); +} + +int +nandfs_dirty_buf_meta(struct buf *bp, int force) +{ + + return (_nandfs_dirty_buf(bp, 0, force)); +} + +void +nandfs_undirty_buf_fsdev(struct nandfs_device *nffsdev, struct buf *bp) +{ + + BUF_ASSERT_HELD(bp); + + if (bp->b_flags & B_DELWRI) { + bp->b_flags &= ~(B_DELWRI|B_MANAGED); + nandfs_dirty_bufs_decrement(nffsdev); + } + /* + * Since it is now being written, we can clear its deferred write flag. + */ + bp->b_flags &= ~B_DEFERRED; + + brelse(bp); +} + +void +nandfs_undirty_buf(struct buf *bp) +{ + struct nandfs_node *node; + + node = VTON(bp->b_vp); + + nandfs_undirty_buf_fsdev(node->nn_nandfsdev, bp); +} + +void +nandfs_vblk_set(struct buf *bp, nandfs_daddr_t blocknr) +{ + + nandfs_daddr_t *vblk = (nandfs_daddr_t *)(&bp->b_fsprivate1); + *vblk = blocknr; +} + +nandfs_daddr_t +nandfs_vblk_get(struct buf *bp) +{ + + nandfs_daddr_t *vblk = (nandfs_daddr_t *)(&bp->b_fsprivate1); + return (*vblk); +} + +void +nandfs_buf_set(struct buf *bp, uint32_t bits) +{ + uintptr_t flags; + + flags = (uintptr_t)bp->b_fsprivate3; + flags |= (uintptr_t)bits; + bp->b_fsprivate3 = (void *)flags; +} + +void +nandfs_buf_clear(struct buf *bp, uint32_t bits) +{ + uintptr_t flags; + + flags = (uintptr_t)bp->b_fsprivate3; + flags &= ~(uintptr_t)bits; + bp->b_fsprivate3 = (void *)flags; +} + +int +nandfs_buf_check(struct buf *bp, uint32_t bits) +{ + uintptr_t flags; + + flags = (uintptr_t)bp->b_fsprivate3; + if (flags & bits) + return (1); + return (0); +} + +int +nandfs_erase(struct nandfs_device *fsdev, off_t offset, size_t size) +{ + struct buf *bp; + int read_size, error, i; + + DPRINTF(BLOCK, ("%s: performing erase at offset %jx size %zx\n", + __func__, offset, size)); + + MPASS(size % fsdev->nd_erasesize == 0); + + if (fsdev->nd_is_nand) { + error = g_delete_data(fsdev->nd_gconsumer, offset, size); + return (error); + } + + if (size > MAXBSIZE) + read_size = MAXBSIZE; + else + read_size = size; + + error = 0; + for (i = 0; i < size / MAXBSIZE; i++) { + error = bread(fsdev->nd_devvp, btodb(offset + i * read_size), + read_size, NOCRED, &bp); + if (error) { + brelse(bp); + return (error); + } + memset(bp->b_data, 0xff, read_size); + error = bwrite(bp); + if (error) { + nandfs_error("%s: err:%d from bwrite\n", + __func__, error); + return (error); + } + } + + return (error); +} + +int +nandfs_vop_islocked(struct vnode *vp) +{ + int islocked; + + islocked = VOP_ISLOCKED(vp); + return (islocked == LK_EXCLUSIVE || islocked == LK_SHARED); +} + +nandfs_daddr_t +nandfs_block_to_dblock(struct nandfs_device *fsdev, nandfs_lbn_t block) +{ + + return (btodb(block * fsdev->nd_blocksize)); +} diff --git a/sys/fs/nandfs/nandfs_subr.h b/sys/fs/nandfs/nandfs_subr.h new file mode 100644 index 00000000000..0bcda181269 --- /dev/null +++ b/sys/fs/nandfs/nandfs_subr.h @@ -0,0 +1,238 @@ +/*- + * Copyright (c) 2010-2012 Semihalf + * Copyright (c) 2008, 2009 Reinoud Zandijk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * From: NetBSD: nilfs_subr.h,v 1.1 2009/07/18 16:31:42 reinoud + * + * $FreeBSD$ + */ + +#ifndef _FS_NANDFS_NANDFS_SUBR_H_ +#define _FS_NANDFS_NANDFS_SUBR_H_ + +struct nandfs_mdt; + +struct nandfs_alloc_request +{ + uint64_t entrynum; + struct buf *bp_desc; + struct buf *bp_bitmap; + struct buf *bp_entry; +}; + +/* Segment creation */ +void nandfs_wakeup_wait_sync(struct nandfs_device *, int); +int nandfs_segment_constructor(struct nandfsmount *, int); +int nandfs_sync_file(struct vnode *); + +/* Basic calculators */ +uint64_t nandfs_get_segnum_of_block(struct nandfs_device *, nandfs_daddr_t); +void nandfs_get_segment_range(struct nandfs_device *, uint64_t, uint64_t *, + uint64_t *); +void nandfs_calc_mdt_consts(struct nandfs_device *, struct nandfs_mdt *, int); + +/* Log reading / volume helpers */ +int nandfs_search_super_root(struct nandfs_device *); + +/* Reading */ +int nandfs_dev_bread(struct nandfs_device *, nandfs_daddr_t, struct ucred *, + int, struct buf **); +int nandfs_bread(struct nandfs_node *, nandfs_lbn_t, struct ucred *, int, + struct buf **); +int nandfs_bread_meta(struct nandfs_node *, nandfs_lbn_t, struct ucred *, int, + struct buf **); +int nandfs_bdestroy(struct nandfs_node *, nandfs_daddr_t); +int nandfs_bcreate(struct nandfs_node *, nandfs_lbn_t, struct ucred *, int, + struct buf **); +int nandfs_bcreate_meta(struct nandfs_node *, nandfs_lbn_t, struct ucred *, + int, struct buf **); +int nandfs_bread_create(struct nandfs_node *, nandfs_lbn_t, struct ucred *, + int, struct buf **); + +/* vtop operations */ +int nandfs_vtop(struct nandfs_node *, nandfs_daddr_t, nandfs_daddr_t *); + +/* Node action implementators */ +int nandfs_vinit(struct vnode *, uint64_t); +int nandfs_get_node(struct nandfsmount *, uint64_t, struct nandfs_node **); +int nandfs_get_node_raw(struct nandfs_device *, struct nandfsmount *, uint64_t, + struct nandfs_inode *, struct nandfs_node **); +void nandfs_dispose_node(struct nandfs_node **); + +void nandfs_itimes(struct vnode *); +int nandfs_lookup_name_in_dir(struct vnode *, const char *, int, uint64_t *, + int *, uint64_t *); +int nandfs_create_node(struct vnode *, struct vnode **, struct vattr *, + struct componentname *); +void nandfs_delete_node(struct nandfs_node *); + +int nandfs_chsize(struct vnode *, u_quad_t, struct ucred *); +int nandfs_dir_detach(struct nandfsmount *, struct nandfs_node *, + struct nandfs_node *, struct componentname *); +int nandfs_dir_attach(struct nandfsmount *, struct nandfs_node *, + struct nandfs_node *, struct vattr *, struct componentname *); + +int nandfs_dirty_buf(struct buf *, int); +int nandfs_dirty_buf_meta(struct buf *, int); +int nandfs_fs_full(struct nandfs_device *); +void nandfs_undirty_buf_fsdev(struct nandfs_device *, struct buf *); +void nandfs_undirty_buf(struct buf *); + +void nandfs_clear_buf(struct buf *); +void nandfs_buf_set(struct buf *, uint32_t); +void nandfs_buf_clear(struct buf *, uint32_t); +int nandfs_buf_check(struct buf *, uint32_t); + +int nandfs_find_free_entry(struct nandfs_mdt *, struct nandfs_node *, + struct nandfs_alloc_request *); +int nandfs_find_entry(struct nandfs_mdt *, struct nandfs_node *, + struct nandfs_alloc_request *); +int nandfs_alloc_entry(struct nandfs_mdt *, struct nandfs_alloc_request *); +void nandfs_abort_entry(struct nandfs_alloc_request *); +int nandfs_free_entry(struct nandfs_mdt *, struct nandfs_alloc_request *); +int nandfs_get_entry_block(struct nandfs_mdt *, struct nandfs_node *, + struct nandfs_alloc_request *, uint32_t *, int); + +/* inode managment */ +int nandfs_node_create(struct nandfsmount *, struct nandfs_node **, uint16_t); +int nandfs_node_destroy(struct nandfs_node *); +int nandfs_node_update(struct nandfs_node *); +int nandfs_get_node_entry(struct nandfsmount *, struct nandfs_inode **, + uint64_t, struct buf **); +void nandfs_mdt_trans_blk(struct nandfs_mdt *, uint64_t, uint64_t *, + uint64_t *, nandfs_lbn_t *, uint32_t *); + +/* vblock management */ +void nandfs_mdt_trans(struct nandfs_mdt *, uint64_t, nandfs_lbn_t *, uint32_t *); +int nandfs_vblock_alloc(struct nandfs_device *, nandfs_daddr_t *); +int nandfs_vblock_end(struct nandfs_device *, nandfs_daddr_t); +int nandfs_vblock_assign(struct nandfs_device *, nandfs_daddr_t, + nandfs_lbn_t); +int nandfs_vblock_free(struct nandfs_device *, nandfs_daddr_t); + +/* Checkpoint management */ +int nandfs_get_checkpoint(struct nandfs_device *, struct nandfs_node *, + uint64_t); +int nandfs_set_checkpoint(struct nandfs_device *, struct nandfs_node *, + uint64_t, struct nandfs_inode *, uint64_t); + +/* Segment management */ +int nandfs_alloc_segment(struct nandfs_device *, uint64_t *); +int nandfs_update_segment(struct nandfs_device *, uint64_t, uint32_t); +int nandfs_free_segment(struct nandfs_device *, uint64_t); +int nandfs_clear_segment(struct nandfs_device *, uint64_t); +int nandfs_touch_segment(struct nandfs_device *, uint64_t); +int nandfs_markgc_segment(struct nandfs_device *, uint64_t); + +int nandfs_bmap_insert_block(struct nandfs_node *, nandfs_lbn_t, struct buf *); +int nandfs_bmap_update_block(struct nandfs_node *, struct buf *, nandfs_lbn_t); +int nandfs_bmap_update_dat(struct nandfs_node *, nandfs_daddr_t, struct buf *); +int nandfs_bmap_dirty_blocks(struct nandfs_node *, struct buf *, int); +int nandfs_bmap_truncate_mapping(struct nandfs_node *, nandfs_lbn_t, + nandfs_lbn_t); +int nandfs_bmap_lookup(struct nandfs_node *, nandfs_lbn_t, nandfs_daddr_t *); + +/* dirent */ +int nandfs_add_dirent(struct vnode *, uint64_t, char *, long, uint8_t); +int nandfs_remove_dirent(struct vnode *, struct nandfs_node *, + struct componentname *); +int nandfs_update_dirent(struct vnode *, struct nandfs_node *, + struct nandfs_node *); +int nandfs_init_dir(struct vnode *, uint64_t, uint64_t); +int nandfs_update_parent_dir(struct vnode *, uint64_t); + +void nandfs_vblk_set(struct buf *, nandfs_daddr_t); +nandfs_daddr_t nandfs_vblk_get(struct buf *); + +void nandfs_inode_init(struct nandfs_inode *, uint16_t); +void nandfs_inode_destroy(struct nandfs_inode *); + +/* ioctl */ +int nandfs_get_seg_stat(struct nandfs_device *, struct nandfs_seg_stat *); +int nandfs_chng_cpmode(struct nandfs_node *, struct nandfs_cpmode *); +int nandfs_get_cpinfo_ioctl(struct nandfs_node *, struct nandfs_argv *); +int nandfs_delete_cp(struct nandfs_node *, uint64_t start, uint64_t); +int nandfs_make_snap(struct nandfs_device *, uint64_t *); +int nandfs_delete_snap(struct nandfs_device *, uint64_t); +int nandfs_get_cpstat(struct nandfs_node *, struct nandfs_cpstat *); +int nandfs_get_segment_info_ioctl(struct nandfs_device *, struct nandfs_argv *); +int nandfs_get_dat_vinfo_ioctl(struct nandfs_device *, struct nandfs_argv *); +int nandfs_get_dat_bdescs_ioctl(struct nandfs_device *, struct nandfs_argv *); +int nandfs_get_fsinfo(struct nandfsmount *, struct nandfs_fsinfo *); + +int nandfs_get_cpinfo(struct nandfs_node *, uint64_t, uint16_t, + struct nandfs_cpinfo *, uint32_t, uint32_t *); + +nandfs_lbn_t nandfs_get_maxfilesize(struct nandfs_device *); + +int nandfs_write_superblock(struct nandfs_device *); + +extern int nandfs_sync_interval; +extern int nandfs_max_dirty_segs; +extern int nandfs_cps_between_sblocks; + +struct buf *nandfs_geteblk(int, int); + +void nandfs_dirty_bufs_increment(struct nandfs_device *); +void nandfs_dirty_bufs_decrement(struct nandfs_device *); + +int nandfs_start_cleaner(struct nandfs_device *); +int nandfs_stop_cleaner(struct nandfs_device *); + +int nandfs_segsum_valid(struct nandfs_segment_summary *); +int nandfs_load_segsum(struct nandfs_device *, nandfs_daddr_t, + struct nandfs_segment_summary *); +int nandfs_get_segment_info(struct nandfs_device *, struct nandfs_suinfo *, + uint32_t, uint64_t); +int nandfs_get_segment_info_filter(struct nandfs_device *, + struct nandfs_suinfo *, uint32_t, uint64_t, uint64_t *, uint32_t, uint32_t); +int nandfs_get_dat_vinfo(struct nandfs_device *, struct nandfs_vinfo *, + uint32_t); +int nandfs_get_dat_bdescs(struct nandfs_device *, struct nandfs_bdesc *, + uint32_t); + +#define NANDFS_VBLK_ASSIGNED 1 + +#define NANDFS_IS_INDIRECT(bp) ((bp)->b_lblkno < 0) + +int nandfs_erase(struct nandfs_device *, off_t, size_t); + +#define NANDFS_VOP_ISLOCKED(vp) nandfs_vop_islocked((vp)) +int nandfs_vop_islocked(struct vnode *vp); + +nandfs_daddr_t nandfs_block_to_dblock(struct nandfs_device *, nandfs_lbn_t); + +#define DEBUG_MODE +#if defined(DEBUG_MODE) +#define nandfs_error panic +#define nandfs_warning printf +#elif defined(TEST_MODE) +#define nandfs_error printf +#define nandfs_warning printf +#else +#define nandfs_error(...) +#define nandfs_warning(...) +#endif + +#endif /* !_FS_NANDFS_NANDFS_SUBR_H_ */ diff --git a/sys/fs/nandfs/nandfs_sufile.c b/sys/fs/nandfs/nandfs_sufile.c new file mode 100644 index 00000000000..d4f432620a8 --- /dev/null +++ b/sys/fs/nandfs/nandfs_sufile.c @@ -0,0 +1,569 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#define SU_USAGE_OFF(bp, offset) \ + ((struct nandfs_segment_usage *)((bp)->b_data + offset)) + +static int +nandfs_seg_usage_blk_offset(struct nandfs_device *fsdev, uint64_t seg, + uint64_t *blk, uint64_t *offset) +{ + uint64_t off; + uint16_t seg_size; + + seg_size = fsdev->nd_fsdata.f_segment_usage_size; + + off = roundup(sizeof(struct nandfs_sufile_header), seg_size); + off += (seg * seg_size); + + *blk = off / fsdev->nd_blocksize; + *offset = off % fsdev->nd_blocksize; + return (0); +} + +/* Alloc new segment */ +int +nandfs_alloc_segment(struct nandfs_device *fsdev, uint64_t *seg) +{ + struct nandfs_node *su_node; + struct nandfs_sufile_header *su_header; + struct nandfs_segment_usage *su_usage; + struct buf *bp_header, *bp; + uint64_t blk, vblk, offset, i, rest, nsegments; + uint16_t seg_size; + int error, found; + + seg_size = fsdev->nd_fsdata.f_segment_usage_size; + nsegments = fsdev->nd_fsdata.f_nsegments; + + su_node = fsdev->nd_su_node; + ASSERT_VOP_LOCKED(NTOV(su_node), __func__); + + /* Read header buffer */ + error = nandfs_bread(su_node, 0, NOCRED, 0, &bp_header); + if (error) { + brelse(bp_header); + return (error); + } + + su_header = (struct nandfs_sufile_header *)bp_header->b_data; + + /* Get last allocated segment */ + i = su_header->sh_last_alloc + 1; + + found = 0; + bp = NULL; + while (!found) { + nandfs_seg_usage_blk_offset(fsdev, i, &blk, &offset); + if(blk != 0) { + error = nandfs_bmap_lookup(su_node, blk, &vblk); + if (error) { + nandfs_error("%s: cannot find vblk for blk " + "blk:%jx\n", __func__, blk); + return (error); + } + if (vblk) + error = nandfs_bread(su_node, blk, NOCRED, 0, + &bp); + else + error = nandfs_bcreate(su_node, blk, NOCRED, 0, + &bp); + if (error) { + nandfs_error("%s: cannot create/read " + "vblk:%jx\n", __func__, vblk); + if (bp) + brelse(bp); + return (error); + } + + su_usage = SU_USAGE_OFF(bp, offset); + } else { + su_usage = SU_USAGE_OFF(bp_header, offset); + bp = bp_header; + } + + rest = (fsdev->nd_blocksize - offset) / seg_size; + /* Go through all su usage in block */ + while (rest) { + /* When last check start from beggining */ + if (i == nsegments) + break; + + if (!su_usage->su_flags) { + su_usage->su_flags = 1; + found = 1; + break; + } + su_usage++; + i++; + + /* If all checked return error */ + if (i == su_header->sh_last_alloc) { + DPRINTF(SEG, ("%s: cannot allocate segment \n", + __func__)); + brelse(bp_header); + if (blk != 0) + brelse(bp); + return (1); + } + rest--; + } + if (!found) { + /* Otherwise read another block */ + if (blk != 0) + brelse(bp); + if (i == nsegments) { + blk = 0; + i = 0; + } else + blk++; + offset = 0; + } + } + + if (found) { + *seg = i; + su_header->sh_last_alloc = i; + su_header->sh_ncleansegs--; + su_header->sh_ndirtysegs++; + + fsdev->nd_super.s_free_blocks_count = su_header->sh_ncleansegs * + fsdev->nd_fsdata.f_blocks_per_segment; + fsdev->nd_clean_segs--; + + /* + * It is mostly called from syncer() so we want to force + * making buf dirty. + */ + error = nandfs_dirty_buf(bp_header, 1); + if (error) { + if (bp && bp != bp_header) + brelse(bp); + return (error); + } + if (bp && bp != bp_header) + nandfs_dirty_buf(bp, 1); + + DPRINTF(SEG, ("%s: seg:%#jx\n", __func__, (uintmax_t)i)); + + return (0); + } + + DPRINTF(SEG, ("%s: failed\n", __func__)); + + return (1); +} + +/* + * Make buffer dirty, it will be updated soon but first it need to be + * gathered by syncer. + */ +int +nandfs_touch_segment(struct nandfs_device *fsdev, uint64_t seg) +{ + struct nandfs_node *su_node; + struct buf *bp; + uint64_t blk, offset; + int error; + + su_node = fsdev->nd_su_node; + ASSERT_VOP_LOCKED(NTOV(su_node), __func__); + + nandfs_seg_usage_blk_offset(fsdev, seg, &blk, &offset); + + error = nandfs_bread(su_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + nandfs_error("%s: cannot preallocate new segment\n", __func__); + return (error); + } else + nandfs_dirty_buf(bp, 1); + + DPRINTF(SEG, ("%s: seg:%#jx\n", __func__, (uintmax_t)seg)); + return (error); +} + +/* Update block count of segment */ +int +nandfs_update_segment(struct nandfs_device *fsdev, uint64_t seg, uint32_t nblks) +{ + struct nandfs_node *su_node; + struct nandfs_segment_usage *su_usage; + struct buf *bp; + uint64_t blk, offset; + int error; + + su_node = fsdev->nd_su_node; + ASSERT_VOP_LOCKED(NTOV(su_node), __func__); + + nandfs_seg_usage_blk_offset(fsdev, seg, &blk, &offset); + + error = nandfs_bread(su_node, blk, NOCRED, 0, &bp); + if (error) { + nandfs_error("%s: read block:%jx to update\n", + __func__, blk); + brelse(bp); + return (error); + } + + su_usage = SU_USAGE_OFF(bp, offset); + su_usage->su_lastmod = fsdev->nd_ts.tv_sec; + su_usage->su_flags = NANDFS_SEGMENT_USAGE_DIRTY; + su_usage->su_nblocks += nblks; + + DPRINTF(SEG, ("%s: seg:%#jx inc:%#x cur:%#x\n", __func__, + (uintmax_t)seg, nblks, su_usage->su_nblocks)); + + nandfs_dirty_buf(bp, 1); + + return (0); +} + +/* Make segment free */ +int +nandfs_free_segment(struct nandfs_device *fsdev, uint64_t seg) +{ + struct nandfs_node *su_node; + struct nandfs_sufile_header *su_header; + struct nandfs_segment_usage *su_usage; + struct buf *bp_header, *bp; + uint64_t blk, offset; + int error; + + su_node = fsdev->nd_su_node; + ASSERT_VOP_LOCKED(NTOV(su_node), __func__); + + /* Read su header */ + error = nandfs_bread(su_node, 0, NOCRED, 0, &bp_header); + if (error) { + brelse(bp_header); + return (error); + } + + su_header = (struct nandfs_sufile_header *)bp_header->b_data; + nandfs_seg_usage_blk_offset(fsdev, seg, &blk, &offset); + + /* Read su usage block if other than su header block */ + if (blk != 0) { + error = nandfs_bread(su_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + brelse(bp_header); + return (error); + } + } else + bp = bp_header; + + /* Reset su usage data */ + su_usage = SU_USAGE_OFF(bp, offset); + su_usage->su_lastmod = fsdev->nd_ts.tv_sec; + su_usage->su_nblocks = 0; + su_usage->su_flags = 0; + + /* Update clean/dirty counter in header */ + su_header->sh_ncleansegs++; + su_header->sh_ndirtysegs--; + + /* + * Make buffers dirty, called by cleaner + * so force dirty even if no much space left + * on device + */ + nandfs_dirty_buf(bp_header, 1); + if (bp != bp_header) + nandfs_dirty_buf(bp, 1); + + /* Update free block count */ + fsdev->nd_super.s_free_blocks_count = su_header->sh_ncleansegs * + fsdev->nd_fsdata.f_blocks_per_segment; + fsdev->nd_clean_segs++; + + DPRINTF(SEG, ("%s: seg:%#jx\n", __func__, (uintmax_t)seg)); + + return (0); +} + +static int +nandfs_bad_segment(struct nandfs_device *fsdev, uint64_t seg) +{ + struct nandfs_node *su_node; + struct nandfs_segment_usage *su_usage; + struct buf *bp; + uint64_t blk, offset; + int error; + + su_node = fsdev->nd_su_node; + ASSERT_VOP_LOCKED(NTOV(su_node), __func__); + + nandfs_seg_usage_blk_offset(fsdev, seg, &blk, &offset); + + error = nandfs_bread(su_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (error); + } + + su_usage = SU_USAGE_OFF(bp, offset); + su_usage->su_lastmod = fsdev->nd_ts.tv_sec; + su_usage->su_flags = NANDFS_SEGMENT_USAGE_ERROR; + + DPRINTF(SEG, ("%s: seg:%#jx\n", __func__, (uintmax_t)seg)); + + nandfs_dirty_buf(bp, 1); + + return (0); +} + +int +nandfs_markgc_segment(struct nandfs_device *fsdev, uint64_t seg) +{ + struct nandfs_node *su_node; + struct nandfs_segment_usage *su_usage; + struct buf *bp; + uint64_t blk, offset; + int error; + + su_node = fsdev->nd_su_node; + + VOP_LOCK(NTOV(su_node), LK_EXCLUSIVE); + + nandfs_seg_usage_blk_offset(fsdev, seg, &blk, &offset); + + error = nandfs_bread(su_node, blk, NOCRED, 0, &bp); + if (error) { + brelse(bp); + VOP_UNLOCK(NTOV(su_node), 0); + return (error); + } + + su_usage = SU_USAGE_OFF(bp, offset); + MPASS((su_usage->su_flags & NANDFS_SEGMENT_USAGE_GC) == 0); + su_usage->su_flags |= NANDFS_SEGMENT_USAGE_GC; + + brelse(bp); + VOP_UNLOCK(NTOV(su_node), 0); + + DPRINTF(SEG, ("%s: seg:%#jx\n", __func__, (uintmax_t)seg)); + + return (0); +} + +int +nandfs_clear_segment(struct nandfs_device *fsdev, uint64_t seg) +{ + uint64_t offset, segsize; + uint32_t bps, bsize; + int error = 0; + + bps = fsdev->nd_fsdata.f_blocks_per_segment; + bsize = fsdev->nd_blocksize; + segsize = bsize * bps; + nandfs_get_segment_range(fsdev, seg, &offset, NULL); + offset *= bsize; + + DPRINTF(SEG, ("%s: seg:%#jx\n", __func__, (uintmax_t)seg)); + + /* Erase it and mark it bad when fail */ + if (nandfs_erase(fsdev, offset, segsize)) + error = nandfs_bad_segment(fsdev, seg); + + if (error) + return (error); + + /* Mark it free */ + error = nandfs_free_segment(fsdev, seg); + + return (error); +} + +int +nandfs_get_seg_stat(struct nandfs_device *nandfsdev, + struct nandfs_seg_stat *nss) +{ + struct nandfs_sufile_header *suhdr; + struct nandfs_node *su_node; + struct buf *bp; + int err; + + su_node = nandfsdev->nd_su_node; + + NANDFS_WRITELOCK(nandfsdev); + VOP_LOCK(NTOV(su_node), LK_SHARED); + err = nandfs_bread(nandfsdev->nd_su_node, 0, NOCRED, 0, &bp); + if (err) { + brelse(bp); + VOP_UNLOCK(NTOV(su_node), 0); + NANDFS_WRITEUNLOCK(nandfsdev); + return (-1); + } + + suhdr = (struct nandfs_sufile_header *)bp->b_data; + nss->nss_nsegs = nandfsdev->nd_fsdata.f_nsegments; + nss->nss_ncleansegs = suhdr->sh_ncleansegs; + nss->nss_ndirtysegs = suhdr->sh_ndirtysegs; + nss->nss_ctime = 0; + nss->nss_nongc_ctime = nandfsdev->nd_ts.tv_sec; + nss->nss_prot_seq = nandfsdev->nd_seg_sequence; + + brelse(bp); + VOP_UNLOCK(NTOV(su_node), 0); + + NANDFS_WRITEUNLOCK(nandfsdev); + + return (0); +} + +int +nandfs_get_segment_info_ioctl(struct nandfs_device *fsdev, + struct nandfs_argv *nargv) +{ + struct nandfs_suinfo *nsi; + int error; + + if (nargv->nv_nmembs > NANDFS_SEGMENTS_MAX) + return (EINVAL); + + nsi = malloc(sizeof(struct nandfs_suinfo) * nargv->nv_nmembs, + M_NANDFSTEMP, M_WAITOK | M_ZERO); + + error = nandfs_get_segment_info(fsdev, nsi, nargv->nv_nmembs, + nargv->nv_index); + + if (error == 0) + error = copyout(nsi, (void *)(uintptr_t)nargv->nv_base, + sizeof(struct nandfs_suinfo) * nargv->nv_nmembs); + + free(nsi, M_NANDFSTEMP); + return (error); +} + +int +nandfs_get_segment_info(struct nandfs_device *fsdev, struct nandfs_suinfo *nsi, + uint32_t nmembs, uint64_t segment) +{ + + return (nandfs_get_segment_info_filter(fsdev, nsi, nmembs, segment, + NULL, 0, 0)); +} + +int +nandfs_get_segment_info_filter(struct nandfs_device *fsdev, + struct nandfs_suinfo *nsi, uint32_t nmembs, uint64_t segment, + uint64_t *nsegs, uint32_t filter, uint32_t nfilter) +{ + struct nandfs_segment_usage *su; + struct nandfs_node *su_node; + struct buf *bp; + uint64_t curr, blocknr, blockoff, i; + uint32_t flags; + int err = 0; + + curr = ~(0); + + lockmgr(&fsdev->nd_seg_const, LK_EXCLUSIVE, NULL); + su_node = fsdev->nd_su_node; + + VOP_LOCK(NTOV(su_node), LK_SHARED); + + bp = NULL; + if (nsegs != NULL) + *nsegs = 0; + for (i = 0; i < nmembs; segment++) { + if (segment == fsdev->nd_fsdata.f_nsegments) + break; + + nandfs_seg_usage_blk_offset(fsdev, segment, &blocknr, + &blockoff); + + if (i == 0 || curr != blocknr) { + if (bp != NULL) + brelse(bp); + err = nandfs_bread(su_node, blocknr, NOCRED, + 0, &bp); + if (err) { + goto out; + } + curr = blocknr; + } + + su = SU_USAGE_OFF(bp, blockoff); + flags = su->su_flags; + if (segment == fsdev->nd_seg_num || + segment == fsdev->nd_next_seg_num) + flags |= NANDFS_SEGMENT_USAGE_ACTIVE; + + if (nfilter != 0 && (flags & nfilter) != 0) + continue; + if (filter != 0 && (flags & filter) == 0) + continue; + + nsi->nsi_num = segment; + nsi->nsi_lastmod = su->su_lastmod; + nsi->nsi_blocks = su->su_nblocks; + nsi->nsi_flags = flags; + nsi++; + i++; + if (nsegs != NULL) + (*nsegs)++; + } + +out: + if (bp != NULL) + brelse(bp); + VOP_UNLOCK(NTOV(su_node), 0); + lockmgr(&fsdev->nd_seg_const, LK_RELEASE, NULL); + + return (err); +} diff --git a/sys/fs/nandfs/nandfs_vfsops.c b/sys/fs/nandfs/nandfs_vfsops.c new file mode 100644 index 00000000000..ba53546c9b3 --- /dev/null +++ b/sys/fs/nandfs/nandfs_vfsops.c @@ -0,0 +1,1590 @@ +/*- + * Copyright (c) 2010-2012 Semihalf + * Copyright (c) 2008, 2009 Reinoud Zandijk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * From: NetBSD: nilfs_vfsops.c,v 1.1 2009/07/18 16:31:42 reinoud Exp + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include + +static MALLOC_DEFINE(M_NANDFSMNT, "nandfs_mount", "NANDFS mount structure"); + +#define NANDFS_SET_SYSTEMFILE(vp) { \ + (vp)->v_vflag |= VV_SYSTEM; \ + vref(vp); \ + vput(vp); } + +#define NANDFS_UNSET_SYSTEMFILE(vp) { \ + VOP_LOCK(vp, LK_EXCLUSIVE); \ + MPASS(vp->v_bufobj.bo_dirty.bv_cnt == 0); \ + (vp)->v_vflag &= ~VV_SYSTEM; \ + vgone(vp); \ + vput(vp); } + +/* Globals */ +struct _nandfs_devices nandfs_devices; + +/* Parameters */ +int nandfs_verbose = 0; + +static void +nandfs_tunable_init(void *arg) +{ + + TUNABLE_INT_FETCH("vfs.nandfs.verbose", &nandfs_verbose); +} +SYSINIT(nandfs_tunables, SI_SUB_VFS, SI_ORDER_ANY, nandfs_tunable_init, NULL); + +static SYSCTL_NODE(_vfs, OID_AUTO, nandfs, CTLFLAG_RD, 0, "NAND filesystem"); +static SYSCTL_NODE(_vfs_nandfs, OID_AUTO, mount, CTLFLAG_RD, 0, + "NANDFS mountpoints"); +SYSCTL_INT(_vfs_nandfs, OID_AUTO, verbose, CTLFLAG_RW, &nandfs_verbose, 0, ""); + +#define NANDFS_CONSTR_INTERVAL 5 +int nandfs_sync_interval = NANDFS_CONSTR_INTERVAL; /* sync every 5 seconds */ +SYSCTL_UINT(_vfs_nandfs, OID_AUTO, sync_interval, CTLFLAG_RW, + &nandfs_sync_interval, 0, ""); + +#define NANDFS_MAX_DIRTY_SEGS 5 +int nandfs_max_dirty_segs = NANDFS_MAX_DIRTY_SEGS; /* sync when 5 dirty seg */ +SYSCTL_UINT(_vfs_nandfs, OID_AUTO, max_dirty_segs, CTLFLAG_RW, + &nandfs_max_dirty_segs, 0, ""); + +#define NANDFS_CPS_BETWEEN_SBLOCKS 5 +int nandfs_cps_between_sblocks = NANDFS_CPS_BETWEEN_SBLOCKS; /* write superblock every 5 checkpoints */ +SYSCTL_UINT(_vfs_nandfs, OID_AUTO, cps_between_sblocks, CTLFLAG_RW, + &nandfs_cps_between_sblocks, 0, ""); + +#define NANDFS_CLEANER_ENABLE 1 +int nandfs_cleaner_enable = NANDFS_CLEANER_ENABLE; +SYSCTL_UINT(_vfs_nandfs, OID_AUTO, cleaner_enable, CTLFLAG_RW, + &nandfs_cleaner_enable, 0, ""); + +#define NANDFS_CLEANER_INTERVAL 5 +int nandfs_cleaner_interval = NANDFS_CLEANER_INTERVAL; +SYSCTL_UINT(_vfs_nandfs, OID_AUTO, cleaner_interval, CTLFLAG_RW, + &nandfs_cleaner_interval, 0, ""); + +#define NANDFS_CLEANER_SEGMENTS 5 +int nandfs_cleaner_segments = NANDFS_CLEANER_SEGMENTS; +SYSCTL_UINT(_vfs_nandfs, OID_AUTO, cleaner_segments, CTLFLAG_RW, + &nandfs_cleaner_segments, 0, ""); + +static int nandfs_mountfs(struct vnode *devvp, struct mount *mp); +static vfs_mount_t nandfs_mount; +static vfs_root_t nandfs_root; +static vfs_statfs_t nandfs_statfs; +static vfs_unmount_t nandfs_unmount; +static vfs_vget_t nandfs_vget; +static vfs_sync_t nandfs_sync; +static const char *nandfs_opts[] = { + "snap", "from", "noatime", NULL +}; + +/* System nodes */ +static int +nandfs_create_system_nodes(struct nandfs_device *nandfsdev) +{ + int error; + + error = nandfs_get_node_raw(nandfsdev, NULL, NANDFS_DAT_INO, + &nandfsdev->nd_super_root.sr_dat, &nandfsdev->nd_dat_node); + if (error) + goto errorout; + + error = nandfs_get_node_raw(nandfsdev, NULL, NANDFS_CPFILE_INO, + &nandfsdev->nd_super_root.sr_cpfile, &nandfsdev->nd_cp_node); + if (error) + goto errorout; + + error = nandfs_get_node_raw(nandfsdev, NULL, NANDFS_SUFILE_INO, + &nandfsdev->nd_super_root.sr_sufile, &nandfsdev->nd_su_node); + if (error) + goto errorout; + + error = nandfs_get_node_raw(nandfsdev, NULL, NANDFS_GC_INO, + NULL, &nandfsdev->nd_gc_node); + if (error) + goto errorout; + + NANDFS_SET_SYSTEMFILE(NTOV(nandfsdev->nd_dat_node)); + NANDFS_SET_SYSTEMFILE(NTOV(nandfsdev->nd_cp_node)); + NANDFS_SET_SYSTEMFILE(NTOV(nandfsdev->nd_su_node)); + NANDFS_SET_SYSTEMFILE(NTOV(nandfsdev->nd_gc_node)); + + DPRINTF(VOLUMES, ("System vnodes: dat: %p cp: %p su: %p\n", + NTOV(nandfsdev->nd_dat_node), NTOV(nandfsdev->nd_cp_node), + NTOV(nandfsdev->nd_su_node))); + return (0); + +errorout: + nandfs_dispose_node(&nandfsdev->nd_gc_node); + nandfs_dispose_node(&nandfsdev->nd_dat_node); + nandfs_dispose_node(&nandfsdev->nd_cp_node); + nandfs_dispose_node(&nandfsdev->nd_su_node); + + return (error); +} + +static void +nandfs_release_system_nodes(struct nandfs_device *nandfsdev) +{ + + if (!nandfsdev) + return; + if (nandfsdev->nd_refcnt > 0) + return; + + if (nandfsdev->nd_gc_node) + NANDFS_UNSET_SYSTEMFILE(NTOV(nandfsdev->nd_gc_node)); + if (nandfsdev->nd_dat_node) + NANDFS_UNSET_SYSTEMFILE(NTOV(nandfsdev->nd_dat_node)); + if (nandfsdev->nd_cp_node) + NANDFS_UNSET_SYSTEMFILE(NTOV(nandfsdev->nd_cp_node)); + if (nandfsdev->nd_su_node) + NANDFS_UNSET_SYSTEMFILE(NTOV(nandfsdev->nd_su_node)); +} + +static int +nandfs_check_fsdata_crc(struct nandfs_fsdata *fsdata) +{ + uint32_t fsdata_crc, comp_crc; + + if (fsdata->f_magic != NANDFS_FSDATA_MAGIC) + return (0); + + /* Preserve CRC */ + fsdata_crc = fsdata->f_sum; + + /* Calculate */ + fsdata->f_sum = (0); + comp_crc = crc32((uint8_t *)fsdata, fsdata->f_bytes); + + /* Restore */ + fsdata->f_sum = fsdata_crc; + + /* Check CRC */ + return (fsdata_crc == comp_crc); +} + +static int +nandfs_check_superblock_crc(struct nandfs_fsdata *fsdata, + struct nandfs_super_block *super) +{ + uint32_t super_crc, comp_crc; + + /* Check super block magic */ + if (super->s_magic != NANDFS_SUPER_MAGIC) + return (0); + + /* Preserve CRC */ + super_crc = super->s_sum; + + /* Calculate */ + super->s_sum = (0); + comp_crc = crc32((uint8_t *)super, fsdata->f_sbbytes); + + /* Restore */ + super->s_sum = super_crc; + + /* Check CRC */ + return (super_crc == comp_crc); +} + +static void +nandfs_calc_superblock_crc(struct nandfs_fsdata *fsdata, + struct nandfs_super_block *super) +{ + uint32_t comp_crc; + + /* Calculate */ + super->s_sum = 0; + comp_crc = crc32((uint8_t *)super, fsdata->f_sbbytes); + + /* Restore */ + super->s_sum = comp_crc; +} + +static int +nandfs_is_empty(u_char *area, int size) +{ + int i; + + for (i = 0; i < size; i++) + if (area[i] != 0xff) + return (0); + + return (1); +} + +static __inline int +nandfs_sblocks_in_esize(struct nandfs_device *fsdev) +{ + + return ((fsdev->nd_erasesize - NANDFS_SBLOCK_OFFSET_BYTES) / + sizeof(struct nandfs_super_block)); +} + +static __inline int +nandfs_max_sblocks(struct nandfs_device *fsdev) +{ + + return (NANDFS_NFSAREAS * nandfs_sblocks_in_esize(fsdev)); +} + +static __inline int +nandfs_sblocks_in_block(struct nandfs_device *fsdev) +{ + + return (fsdev->nd_devblocksize / sizeof(struct nandfs_super_block)); +} + +static __inline int +nandfs_sblocks_in_first_block(struct nandfs_device *fsdev) +{ + int n; + + n = nandfs_sblocks_in_block(fsdev) - + NANDFS_SBLOCK_OFFSET_BYTES / sizeof(struct nandfs_super_block); + if (n < 0) + n = 0; + + return (n); +} + +static int +nandfs_write_superblock_at(struct nandfs_device *fsdev, + struct nandfs_fsarea *fstp) +{ + struct nandfs_super_block *super, *supert; + struct buf *bp; + int sb_per_sector, sbs_in_fsd, read_block; + int index, pos, error; + off_t offset; + + DPRINTF(SYNC, ("%s: last_used %d nandfs_sblocks_in_esize %d\n", + __func__, fstp->last_used, nandfs_sblocks_in_esize(fsdev))); + if (fstp->last_used == nandfs_sblocks_in_esize(fsdev) - 1) + index = 0; + else + index = fstp->last_used + 1; + + super = &fsdev->nd_super; + supert = NULL; + + sb_per_sector = nandfs_sblocks_in_block(fsdev); + sbs_in_fsd = sizeof(struct nandfs_fsdata) / + sizeof(struct nandfs_super_block); + index += sbs_in_fsd; + offset = fstp->offset; + + DPRINTF(SYNC, ("%s: offset %#jx s_last_pseg %#jx s_last_cno %#jx " + "s_last_seq %#jx wtime %jd index %d\n", __func__, offset, + super->s_last_pseg, super->s_last_cno, super->s_last_seq, + super->s_wtime, index)); + + read_block = btodb(offset + ((index / sb_per_sector) * sb_per_sector) + * sizeof(struct nandfs_super_block)); + + DPRINTF(SYNC, ("%s: read_block %#x\n", __func__, read_block)); + + if (index == sbs_in_fsd) { + error = nandfs_erase(fsdev, offset, fsdev->nd_erasesize); + if (error) + return (error); + + error = bread(fsdev->nd_devvp, btodb(offset), + fsdev->nd_devblocksize, NOCRED, &bp); + if (error) { + printf("NANDFS: couldn't read initial data: %d\n", + error); + brelse(bp); + return (error); + } + memcpy(bp->b_data, &fsdev->nd_fsdata, sizeof(fsdev->nd_fsdata)); + /* + * 0xff-out the rest. This bp could be cached, so potentially + * b_data contains stale super blocks. + * + * We don't mind cached bp since most of the time we just add + * super blocks to already 0xff-out b_data and don't need to + * perform actual read. + */ + if (fsdev->nd_devblocksize > sizeof(fsdev->nd_fsdata)) + memset(bp->b_data + sizeof(fsdev->nd_fsdata), 0xff, + fsdev->nd_devblocksize - sizeof(fsdev->nd_fsdata)); + error = bwrite(bp); + if (error) { + printf("NANDFS: cannot rewrite initial data at %jx\n", + offset); + return (error); + } + } + + error = bread(fsdev->nd_devvp, read_block, fsdev->nd_devblocksize, + NOCRED, &bp); + if (error) { + brelse(bp); + return (error); + } + + supert = (struct nandfs_super_block *)(bp->b_data); + pos = index % sb_per_sector; + + DPRINTF(SYNC, ("%s: storing at %d\n", __func__, pos)); + memcpy(&supert[pos], super, sizeof(struct nandfs_super_block)); + + /* + * See comment above in code that performs erase. + */ + if (pos == 0) + memset(&supert[1], 0xff, + (sb_per_sector - 1) * sizeof(struct nandfs_super_block)); + + error = bwrite(bp); + if (error) { + printf("NANDFS: cannot update superblock at %jx\n", offset); + return (error); + } + + DPRINTF(SYNC, ("%s: fstp->last_used %d -> %d\n", __func__, + fstp->last_used, index - sbs_in_fsd)); + fstp->last_used = index - sbs_in_fsd; + + return (0); +} + +int +nandfs_write_superblock(struct nandfs_device *fsdev) +{ + struct nandfs_super_block *super; + struct timespec ts; + int error; + int i, j; + + vfs_timestamp(&ts); + + super = &fsdev->nd_super; + + super->s_last_pseg = fsdev->nd_last_pseg; + super->s_last_cno = fsdev->nd_last_cno; + super->s_last_seq = fsdev->nd_seg_sequence; + super->s_wtime = ts.tv_sec; + + nandfs_calc_superblock_crc(&fsdev->nd_fsdata, super); + + error = 0; + for (i = 0, j = fsdev->nd_last_fsarea; i < NANDFS_NFSAREAS; + i++, j = (j + 1 % NANDFS_NFSAREAS)) { + if (fsdev->nd_fsarea[j].flags & NANDFS_FSSTOR_FAILED) { + DPRINTF(SYNC, ("%s: skipping %d\n", __func__, j)); + continue; + } + error = nandfs_write_superblock_at(fsdev, &fsdev->nd_fsarea[j]); + if (error) { + printf("NANDFS: writing superblock at offset %d failed:" + "%d\n", j * fsdev->nd_erasesize, error); + fsdev->nd_fsarea[j].flags |= NANDFS_FSSTOR_FAILED; + } else + break; + } + + if (i == NANDFS_NFSAREAS) { + printf("NANDFS: superblock was not written\n"); + /* + * TODO: switch to read-only? + */ + return (error); + } else + fsdev->nd_last_fsarea = (j + 1) % NANDFS_NFSAREAS; + + return (0); +} + +static int +nandfs_select_fsdata(struct nandfs_device *fsdev, + struct nandfs_fsdata *fsdatat, struct nandfs_fsdata **fsdata, int nfsds) +{ + int i; + + *fsdata = NULL; + for (i = 0; i < nfsds; i++) { + DPRINTF(VOLUMES, ("%s: i %d f_magic %x f_crc %x\n", __func__, + i, fsdatat[i].f_magic, fsdatat[i].f_sum)); + if (!nandfs_check_fsdata_crc(&fsdatat[i])) + continue; + *fsdata = &fsdatat[i]; + break; + } + + return (*fsdata != NULL ? 0 : EINVAL); +} + +static int +nandfs_select_sb(struct nandfs_device *fsdev, + struct nandfs_super_block *supert, struct nandfs_super_block **super, + int nsbs) +{ + int i; + + *super = NULL; + for (i = 0; i < nsbs; i++) { + if (!nandfs_check_superblock_crc(&fsdev->nd_fsdata, &supert[i])) + continue; + DPRINTF(SYNC, ("%s: i %d s_last_cno %jx s_magic %x " + "s_wtime %jd\n", __func__, i, supert[i].s_last_cno, + supert[i].s_magic, supert[i].s_wtime)); + if (*super == NULL || supert[i].s_last_cno > + (*super)->s_last_cno) + *super = &supert[i]; + } + + return (*super != NULL ? 0 : EINVAL); +} + +static int +nandfs_read_structures_at(struct nandfs_device *fsdev, + struct nandfs_fsarea *fstp, struct nandfs_fsdata *fsdata, + struct nandfs_super_block *super) +{ + struct nandfs_super_block *tsuper, *tsuperd; + struct buf *bp; + int error, read_size; + int i; + int offset; + + offset = fstp->offset; + + if (fsdev->nd_erasesize > MAXBSIZE) + read_size = MAXBSIZE; + else + read_size = fsdev->nd_erasesize; + + error = bread(fsdev->nd_devvp, btodb(offset), read_size, NOCRED, &bp); + if (error) { + printf("couldn't read: %d\n", error); + brelse(bp); + fstp->flags |= NANDFS_FSSTOR_FAILED; + return (error); + } + + tsuper = super; + + memcpy(fsdata, bp->b_data, sizeof(struct nandfs_fsdata)); + memcpy(tsuper, (bp->b_data + sizeof(struct nandfs_fsdata)), + read_size - sizeof(struct nandfs_fsdata)); + brelse(bp); + + tsuper += (read_size - sizeof(struct nandfs_fsdata)) / + sizeof(struct nandfs_super_block); + + for (i = 1; i < fsdev->nd_erasesize / read_size; i++) { + error = bread(fsdev->nd_devvp, btodb(offset + i * read_size), + read_size, NOCRED, &bp); + if (error) { + printf("couldn't read: %d\n", error); + brelse(bp); + fstp->flags |= NANDFS_FSSTOR_FAILED; + return (error); + } + memcpy(tsuper, bp->b_data, read_size); + tsuper += read_size / sizeof(struct nandfs_super_block); + brelse(bp); + } + + tsuper -= 1; + fstp->last_used = nandfs_sblocks_in_esize(fsdev) - 1; + for (tsuperd = super - 1; (tsuper != tsuperd); tsuper -= 1) { + if (nandfs_is_empty((u_char *)tsuper, sizeof(*tsuper))) + fstp->last_used--; + else + break; + } + + DPRINTF(VOLUMES, ("%s: last_used %d\n", __func__, fstp->last_used)); + + return (0); +} + +static int +nandfs_read_structures(struct nandfs_device *fsdev) +{ + struct nandfs_fsdata *fsdata, *fsdatat; + struct nandfs_super_block *sblocks, *ssblock; + int nsbs, nfsds, i; + int error = 0; + int nrsbs; + + nfsds = NANDFS_NFSAREAS; + nsbs = nandfs_max_sblocks(fsdev); + + fsdatat = malloc(sizeof(struct nandfs_fsdata) * nfsds, M_NANDFSTEMP, + M_WAITOK | M_ZERO); + sblocks = malloc(sizeof(struct nandfs_super_block) * nsbs, M_NANDFSTEMP, + M_WAITOK | M_ZERO); + + nrsbs = 0; + for (i = 0; i < NANDFS_NFSAREAS; i++) { + fsdev->nd_fsarea[i].offset = i * fsdev->nd_erasesize; + error = nandfs_read_structures_at(fsdev, &fsdev->nd_fsarea[i], + &fsdatat[i], sblocks + nrsbs); + if (error) + continue; + nrsbs += (fsdev->nd_fsarea[i].last_used + 1); + if (fsdev->nd_fsarea[fsdev->nd_last_fsarea].last_used > + fsdev->nd_fsarea[i].last_used) + fsdev->nd_last_fsarea = i; + } + + if (nrsbs == 0) { + printf("nandfs: no valid superblocks found\n"); + error = EINVAL; + goto out; + } + + error = nandfs_select_fsdata(fsdev, fsdatat, &fsdata, nfsds); + if (error) + goto out; + memcpy(&fsdev->nd_fsdata, fsdata, sizeof(struct nandfs_fsdata)); + + error = nandfs_select_sb(fsdev, sblocks, &ssblock, nsbs); + if (error) + goto out; + + memcpy(&fsdev->nd_super, ssblock, sizeof(struct nandfs_super_block)); +out: + free(fsdatat, M_NANDFSTEMP); + free(sblocks, M_NANDFSTEMP); + + if (error == 0) + DPRINTF(VOLUMES, ("%s: selected sb with w_time %jd " + "last_pseg %#jx\n", __func__, fsdev->nd_super.s_wtime, + fsdev->nd_super.s_last_pseg)); + + return (error); +} + +static void +nandfs_unmount_base(struct nandfs_device *nandfsdev) +{ + int error; + + if (!nandfsdev) + return; + + /* Remove all our information */ + error = vinvalbuf(nandfsdev->nd_devvp, V_SAVE, 0, 0); + if (error) { + /* + * Flushing buffers failed when fs was umounting, can't do + * much now, just printf error and continue with umount. + */ + nandfs_error("%s(): error:%d when umounting FS\n", + __func__, error); + } + + /* Release the device's system nodes */ + nandfs_release_system_nodes(nandfsdev); +} + +static void +nandfs_get_ncleanseg(struct nandfs_device *nandfsdev) +{ + struct nandfs_seg_stat nss; + + nandfs_get_seg_stat(nandfsdev, &nss); + nandfsdev->nd_clean_segs = nss.nss_ncleansegs; + DPRINTF(VOLUMES, ("nandfs_mount: clean segs: %jx\n", + (uintmax_t)nandfsdev->nd_clean_segs)); +} + + +static int +nandfs_mount_base(struct nandfs_device *nandfsdev, struct mount *mp, + struct nandfs_args *args) +{ + uint32_t log_blocksize; + int error; + + /* Flush out any old buffers remaining from a previous use. */ + if ((error = vinvalbuf(nandfsdev->nd_devvp, V_SAVE, 0, 0))) + return (error); + + error = nandfs_read_structures(nandfsdev); + if (error) { + printf("nandfs: could not get valid filesystem structures\n"); + return (error); + } + + if (nandfsdev->nd_fsdata.f_rev_level != NANDFS_CURRENT_REV) { + printf("nandfs: unsupported file system revision: %d " + "(supported is %d).\n", nandfsdev->nd_fsdata.f_rev_level, + NANDFS_CURRENT_REV); + return (EINVAL); + } + + if (nandfsdev->nd_fsdata.f_erasesize != nandfsdev->nd_erasesize) { + printf("nandfs: erasesize mismatch (device %#x, fs %#x)\n", + nandfsdev->nd_erasesize, nandfsdev->nd_fsdata.f_erasesize); + return (EINVAL); + } + + /* Get our blocksize */ + log_blocksize = nandfsdev->nd_fsdata.f_log_block_size; + nandfsdev->nd_blocksize = (uint64_t) 1 << (log_blocksize + 10); + DPRINTF(VOLUMES, ("%s: blocksize:%x\n", __func__, + nandfsdev->nd_blocksize)); + + DPRINTF(VOLUMES, ("%s: accepted super block with cp %#jx\n", __func__, + (uintmax_t)nandfsdev->nd_super.s_last_cno)); + + /* Calculate dat structure parameters */ + nandfs_calc_mdt_consts(nandfsdev, &nandfsdev->nd_dat_mdt, + nandfsdev->nd_fsdata.f_dat_entry_size); + nandfs_calc_mdt_consts(nandfsdev, &nandfsdev->nd_ifile_mdt, + nandfsdev->nd_fsdata.f_inode_size); + + /* Search for the super root and roll forward when needed */ + if (nandfs_search_super_root(nandfsdev)) { + printf("Cannot find valid SuperRoot\n"); + return (EINVAL); + } + + nandfsdev->nd_mount_state = nandfsdev->nd_super.s_state; + if (nandfsdev->nd_mount_state != NANDFS_VALID_FS) { + printf("FS is seriously damaged, needs repairing\n"); + printf("aborting mount\n"); + return (EINVAL); + } + + /* + * FS should be ok now. The superblock and the last segsum could be + * updated from the repair so extract running values again. + */ + nandfsdev->nd_last_pseg = nandfsdev->nd_super.s_last_pseg; + nandfsdev->nd_seg_sequence = nandfsdev->nd_super.s_last_seq; + nandfsdev->nd_seg_num = nandfs_get_segnum_of_block(nandfsdev, + nandfsdev->nd_last_pseg); + nandfsdev->nd_next_seg_num = nandfs_get_segnum_of_block(nandfsdev, + nandfsdev->nd_last_segsum.ss_next); + nandfsdev->nd_ts.tv_sec = nandfsdev->nd_last_segsum.ss_create; + nandfsdev->nd_last_cno = nandfsdev->nd_super.s_last_cno; + nandfsdev->nd_fakevblk = 1; + nandfsdev->nd_last_ino = NANDFS_USER_INO; + DPRINTF(VOLUMES, ("%s: last_pseg %#jx last_cno %#jx last_seq %#jx\n" + "fsdev: last_seg: seq %#jx num %#jx, next_seg_num %#jx\n", + __func__, (uintmax_t)nandfsdev->nd_last_pseg, + (uintmax_t)nandfsdev->nd_last_cno, + (uintmax_t)nandfsdev->nd_seg_sequence, + (uintmax_t)nandfsdev->nd_seg_sequence, + (uintmax_t)nandfsdev->nd_seg_num, + (uintmax_t)nandfsdev->nd_next_seg_num)); + + DPRINTF(VOLUMES, ("nandfs_mount: accepted super root\n")); + + /* Create system vnodes for DAT, CP and SEGSUM */ + error = nandfs_create_system_nodes(nandfsdev); + if (error) + nandfs_unmount_base(nandfsdev); + + nandfs_get_ncleanseg(nandfsdev); + + return (error); +} + +static void +nandfs_unmount_device(struct nandfs_device *nandfsdev) +{ + + /* Is there anything? */ + if (nandfsdev == NULL) + return; + + /* Remove the device only if we're the last reference */ + nandfsdev->nd_refcnt--; + if (nandfsdev->nd_refcnt >= 1) + return; + + MPASS(nandfsdev->nd_syncer == NULL); + MPASS(nandfsdev->nd_cleaner == NULL); + MPASS(nandfsdev->nd_free_base == NULL); + + /* Unmount our base */ + nandfs_unmount_base(nandfsdev); + + /* Remove from our device list */ + SLIST_REMOVE(&nandfs_devices, nandfsdev, nandfs_device, nd_next_device); + + DROP_GIANT(); + g_topology_lock(); + g_vfs_close(nandfsdev->nd_gconsumer); + g_topology_unlock(); + PICKUP_GIANT(); + + DPRINTF(VOLUMES, ("closing device\n")); + + /* Clear our mount reference and release device node */ + vrele(nandfsdev->nd_devvp); + + dev_rel(nandfsdev->nd_devvp->v_rdev); + + /* Free our device info */ + cv_destroy(&nandfsdev->nd_sync_cv); + mtx_destroy(&nandfsdev->nd_sync_mtx); + cv_destroy(&nandfsdev->nd_clean_cv); + mtx_destroy(&nandfsdev->nd_clean_mtx); + mtx_destroy(&nandfsdev->nd_mutex); + lockdestroy(&nandfsdev->nd_seg_const); + free(nandfsdev, M_NANDFSMNT); +} + +static int +nandfs_check_mounts(struct nandfs_device *nandfsdev, struct mount *mp, + struct nandfs_args *args) +{ + struct nandfsmount *nmp; + uint64_t last_cno; + + /* no double-mounting of the same checkpoint */ + STAILQ_FOREACH(nmp, &nandfsdev->nd_mounts, nm_next_mount) { + if (nmp->nm_mount_args.cpno == args->cpno) + return (EBUSY); + } + + /* Allow readonly mounts without questioning here */ + if (mp->mnt_flag & MNT_RDONLY) + return (0); + + /* Read/write mount */ + STAILQ_FOREACH(nmp, &nandfsdev->nd_mounts, nm_next_mount) { + /* Only one RW mount on this device! */ + if ((nmp->nm_vfs_mountp->mnt_flag & MNT_RDONLY)==0) + return (EROFS); + /* RDONLY on last mountpoint is device busy */ + last_cno = nmp->nm_nandfsdev->nd_super.s_last_cno; + if (nmp->nm_mount_args.cpno == last_cno) + return (EBUSY); + } + + /* OK for now */ + return (0); +} + +static int +nandfs_mount_device(struct vnode *devvp, struct mount *mp, + struct nandfs_args *args, struct nandfs_device **nandfsdev_p) +{ + struct nandfs_device *nandfsdev; + struct g_provider *pp; + struct g_consumer *cp; + struct cdev *dev; + uint32_t erasesize; + int error, size; + int ronly; + + DPRINTF(VOLUMES, ("Mounting NANDFS device\n")); + + ronly = (mp->mnt_flag & MNT_RDONLY) != 0; + + /* Look up device in our nandfs_mountpoints */ + *nandfsdev_p = NULL; + SLIST_FOREACH(nandfsdev, &nandfs_devices, nd_next_device) + if (nandfsdev->nd_devvp == devvp) + break; + + if (nandfsdev) { + DPRINTF(VOLUMES, ("device already mounted\n")); + error = nandfs_check_mounts(nandfsdev, mp, args); + if (error) + return error; + nandfsdev->nd_refcnt++; + *nandfsdev_p = nandfsdev; + + if (!ronly) { + DROP_GIANT(); + g_topology_lock(); + error = g_access(nandfsdev->nd_gconsumer, 0, 1, 0); + g_topology_unlock(); + PICKUP_GIANT(); + } + return (error); + } + + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); + dev = devvp->v_rdev; + dev_ref(dev); + DROP_GIANT(); + g_topology_lock(); + error = g_vfs_open(devvp, &cp, "nandfs", ronly ? 0 : 1); + pp = g_dev_getprovider(dev); + g_topology_unlock(); + PICKUP_GIANT(); + VOP_UNLOCK(devvp, 0); + if (error) { + dev_rel(dev); + return (error); + } + + nandfsdev = malloc(sizeof(struct nandfs_device), M_NANDFSMNT, M_WAITOK | M_ZERO); + + /* Initialise */ + nandfsdev->nd_refcnt = 1; + nandfsdev->nd_devvp = devvp; + nandfsdev->nd_syncing = 0; + nandfsdev->nd_cleaning = 0; + nandfsdev->nd_gconsumer = cp; + cv_init(&nandfsdev->nd_sync_cv, "nandfssync"); + mtx_init(&nandfsdev->nd_sync_mtx, "nffssyncmtx", NULL, MTX_DEF); + cv_init(&nandfsdev->nd_clean_cv, "nandfsclean"); + mtx_init(&nandfsdev->nd_clean_mtx, "nffscleanmtx", NULL, MTX_DEF); + mtx_init(&nandfsdev->nd_mutex, "nandfsdev lock", NULL, MTX_DEF); + lockinit(&nandfsdev->nd_seg_const, PVFS, "nffssegcon", VLKTIMEOUT, + LK_CANRECURSE); + STAILQ_INIT(&nandfsdev->nd_mounts); + + nandfsdev->nd_devsize = pp->mediasize; + nandfsdev->nd_devblocksize = pp->sectorsize; + + size = sizeof(erasesize); + error = g_io_getattr("NAND::blocksize", nandfsdev->nd_gconsumer, &size, + &erasesize); + if (error) { + DPRINTF(VOLUMES, ("couldn't get erasesize: %d\n", error)); + + if (error == ENOIOCTL || error == EOPNOTSUPP) { + /* + * We conclude that this is not NAND storage + */ + nandfsdev->nd_erasesize = NANDFS_DEF_ERASESIZE; + nandfsdev->nd_is_nand = 0; + } else { + DROP_GIANT(); + g_topology_lock(); + g_vfs_close(nandfsdev->nd_gconsumer); + g_topology_unlock(); + PICKUP_GIANT(); + dev_rel(dev); + free(nandfsdev, M_NANDFSMNT); + return (error); + } + } else { + nandfsdev->nd_erasesize = erasesize; + nandfsdev->nd_is_nand = 1; + } + + DPRINTF(VOLUMES, ("%s: erasesize %x\n", __func__, + nandfsdev->nd_erasesize)); + + /* Register nandfs_device in list */ + SLIST_INSERT_HEAD(&nandfs_devices, nandfsdev, nd_next_device); + + error = nandfs_mount_base(nandfsdev, mp, args); + if (error) { + /* Remove all our information */ + nandfs_unmount_device(nandfsdev); + return (EINVAL); + } + + nandfsdev->nd_maxfilesize = nandfs_get_maxfilesize(nandfsdev); + + *nandfsdev_p = nandfsdev; + DPRINTF(VOLUMES, ("NANDFS device mounted ok\n")); + + return (0); +} + +static int +nandfs_mount_checkpoint(struct nandfsmount *nmp) +{ + struct nandfs_cpfile_header *cphdr; + struct nandfs_checkpoint *cp; + struct nandfs_inode ifile_inode; + struct nandfs_node *cp_node; + struct buf *bp; + uint64_t ncp, nsn, cpno, fcpno, blocknr, last_cno; + uint32_t off, dlen; + int cp_per_block, error; + + cpno = nmp->nm_mount_args.cpno; + if (cpno == 0) + cpno = nmp->nm_nandfsdev->nd_super.s_last_cno; + + DPRINTF(VOLUMES, ("%s: trying to mount checkpoint number %"PRIu64"\n", + __func__, cpno)); + + cp_node = nmp->nm_nandfsdev->nd_cp_node; + + VOP_LOCK(NTOV(cp_node), LK_SHARED); + /* Get cpfile header from 1st block of cp file */ + error = nandfs_bread(cp_node, 0, NOCRED, 0, &bp); + if (error) { + brelse(bp); + VOP_UNLOCK(NTOV(cp_node), 0); + return (error); + } + + cphdr = (struct nandfs_cpfile_header *) bp->b_data; + ncp = cphdr->ch_ncheckpoints; + nsn = cphdr->ch_nsnapshots; + + brelse(bp); + + DPRINTF(VOLUMES, ("mount_nandfs: checkpoint header read in\n")); + DPRINTF(VOLUMES, ("\tNumber of checkpoints %"PRIu64"\n", ncp)); + DPRINTF(VOLUMES, ("\tNumber of snapshots %"PRIu64"\n", nsn)); + + /* Read in our specified checkpoint */ + dlen = nmp->nm_nandfsdev->nd_fsdata.f_checkpoint_size; + cp_per_block = nmp->nm_nandfsdev->nd_blocksize / dlen; + + fcpno = cpno + NANDFS_CPFILE_FIRST_CHECKPOINT_OFFSET - 1; + blocknr = fcpno / cp_per_block; + off = (fcpno % cp_per_block) * dlen; + error = nandfs_bread(cp_node, blocknr, NOCRED, 0, &bp); + if (error) { + brelse(bp); + VOP_UNLOCK(NTOV(cp_node), 0); + printf("mount_nandfs: couldn't read cp block %"PRIu64"\n", + fcpno); + return (EINVAL); + } + + /* Needs to be a valid checkpoint */ + cp = (struct nandfs_checkpoint *) ((uint8_t *) bp->b_data + off); + if (cp->cp_flags & NANDFS_CHECKPOINT_INVALID) { + printf("mount_nandfs: checkpoint marked invalid\n"); + brelse(bp); + VOP_UNLOCK(NTOV(cp_node), 0); + return (EINVAL); + } + + /* Is this really the checkpoint we want? */ + if (cp->cp_cno != cpno) { + printf("mount_nandfs: checkpoint file corrupt? " + "expected cpno %"PRIu64", found cpno %"PRIu64"\n", + cpno, cp->cp_cno); + brelse(bp); + VOP_UNLOCK(NTOV(cp_node), 0); + return (EINVAL); + } + + /* Check if it's a snapshot ! */ + last_cno = nmp->nm_nandfsdev->nd_super.s_last_cno; + if (cpno != last_cno) { + /* Only allow snapshots if not mounting on the last cp */ + if ((cp->cp_flags & NANDFS_CHECKPOINT_SNAPSHOT) == 0) { + printf( "mount_nandfs: checkpoint %"PRIu64" is not a " + "snapshot\n", cpno); + brelse(bp); + VOP_UNLOCK(NTOV(cp_node), 0); + return (EINVAL); + } + } + + ifile_inode = cp->cp_ifile_inode; + brelse(bp); + + /* Get ifile inode */ + error = nandfs_get_node_raw(nmp->nm_nandfsdev, NULL, NANDFS_IFILE_INO, + &ifile_inode, &nmp->nm_ifile_node); + if (error) { + printf("mount_nandfs: can't read ifile node\n"); + VOP_UNLOCK(NTOV(cp_node), 0); + return (EINVAL); + } + + NANDFS_SET_SYSTEMFILE(NTOV(nmp->nm_ifile_node)); + VOP_UNLOCK(NTOV(cp_node), 0); + /* Get root node? */ + + return (0); +} + +static void +free_nandfs_mountinfo(struct mount *mp) +{ + struct nandfsmount *nmp = VFSTONANDFS(mp); + + if (nmp == NULL) + return; + + free(nmp, M_NANDFSMNT); +} + +void +nandfs_wakeup_wait_sync(struct nandfs_device *nffsdev, int reason) +{ + char *reasons[] = { + "umount", + "vfssync", + "bdflush", + "fforce", + "fsync", + "ro_upd" + }; + + DPRINTF(SYNC, ("%s: %s\n", __func__, reasons[reason])); + mtx_lock(&nffsdev->nd_sync_mtx); + if (nffsdev->nd_syncing) + cv_wait(&nffsdev->nd_sync_cv, &nffsdev->nd_sync_mtx); + if (reason == SYNCER_UMOUNT) + nffsdev->nd_syncer_exit = 1; + nffsdev->nd_syncing = 1; + wakeup(&nffsdev->nd_syncing); + cv_wait(&nffsdev->nd_sync_cv, &nffsdev->nd_sync_mtx); + + mtx_unlock(&nffsdev->nd_sync_mtx); +} + +static void +nandfs_gc_finished(struct nandfs_device *nffsdev, int exit) +{ + int error; + + mtx_lock(&nffsdev->nd_sync_mtx); + nffsdev->nd_syncing = 0; + DPRINTF(SYNC, ("%s: cleaner finish\n", __func__)); + cv_broadcast(&nffsdev->nd_sync_cv); + mtx_unlock(&nffsdev->nd_sync_mtx); + if (!exit) { + error = tsleep(&nffsdev->nd_syncing, PRIBIO, "-", + hz * nandfs_sync_interval); + DPRINTF(SYNC, ("%s: cleaner waked up: %d\n", + __func__, error)); + } +} + +static void +nandfs_syncer(struct nandfsmount *nmp) +{ + struct nandfs_device *nffsdev; + struct mount *mp; + int flags, error; + + mp = nmp->nm_vfs_mountp; + nffsdev = nmp->nm_nandfsdev; + tsleep(&nffsdev->nd_syncing, PRIBIO, "-", hz * nandfs_sync_interval); + + while (!nffsdev->nd_syncer_exit) { + DPRINTF(SYNC, ("%s: syncer run\n", __func__)); + nffsdev->nd_syncing = 1; + + flags = (nmp->nm_flags & (NANDFS_FORCE_SYNCER | NANDFS_UMOUNT)); + + error = nandfs_segment_constructor(nmp, flags); + if (error) + nandfs_error("%s: error:%d when creating segments\n", + __func__, error); + + nmp->nm_flags &= ~flags; + + nandfs_gc_finished(nffsdev, 0); + } + + MPASS(nffsdev->nd_cleaner == NULL); + error = nandfs_segment_constructor(nmp, + NANDFS_FORCE_SYNCER | NANDFS_UMOUNT); + if (error) + nandfs_error("%s: error:%d when creating segments\n", + __func__, error); + nandfs_gc_finished(nffsdev, 1); + nffsdev->nd_syncer = NULL; + MPASS(nffsdev->nd_free_base == NULL); + + DPRINTF(SYNC, ("%s: exiting\n", __func__)); + kthread_exit(); +} + +static int +start_syncer(struct nandfsmount *nmp) +{ + int error; + + MPASS(nmp->nm_nandfsdev->nd_syncer == NULL); + + DPRINTF(SYNC, ("%s: start syncer\n", __func__)); + + nmp->nm_nandfsdev->nd_syncer_exit = 0; + + error = kthread_add((void(*)(void *))nandfs_syncer, nmp, NULL, + &nmp->nm_nandfsdev->nd_syncer, 0, 0, "nandfs_syncer"); + + if (error) + printf("nandfs: could not start syncer: %d\n", error); + + return (error); +} + +static int +stop_syncer(struct nandfsmount *nmp) +{ + + MPASS(nmp->nm_nandfsdev->nd_syncer != NULL); + + nandfs_wakeup_wait_sync(nmp->nm_nandfsdev, SYNCER_UMOUNT); + + DPRINTF(SYNC, ("%s: stop syncer\n", __func__)); + return (0); +} + +/* + * Mount null layer + */ +static int +nandfs_mount(struct mount *mp) +{ + struct nandfsmount *nmp; + struct vnode *devvp; + struct nameidata nd; + struct vfsoptlist *opts; + struct thread *td; + char *from; + int error = 0, flags; + + DPRINTF(VOLUMES, ("%s: mp = %p\n", __func__, (void *)mp)); + + td = curthread; + opts = mp->mnt_optnew; + + if (vfs_filteropt(opts, nandfs_opts)) + return (EINVAL); + + /* + * Update is a no-op + */ + if (mp->mnt_flag & MNT_UPDATE) { + nmp = VFSTONANDFS(mp); + if (vfs_flagopt(mp->mnt_optnew, "export", NULL, 0)) { + return (error); + } + if (!(nmp->nm_ronly) && vfs_flagopt(opts, "ro", NULL, 0)) { + vn_start_write(NULL, &mp, V_WAIT); + error = VFS_SYNC(mp, MNT_WAIT); + if (error) + return (error); + vn_finished_write(mp); + + flags = WRITECLOSE; + if (mp->mnt_flag & MNT_FORCE) + flags |= FORCECLOSE; + + nandfs_wakeup_wait_sync(nmp->nm_nandfsdev, + SYNCER_ROUPD); + error = vflush(mp, 0, flags, td); + if (error) + return (error); + + nandfs_stop_cleaner(nmp->nm_nandfsdev); + stop_syncer(nmp); + DROP_GIANT(); + g_topology_lock(); + g_access(nmp->nm_nandfsdev->nd_gconsumer, 0, -1, 0); + g_topology_unlock(); + PICKUP_GIANT(); + MNT_ILOCK(mp); + mp->mnt_flag |= MNT_RDONLY; + MNT_IUNLOCK(mp); + nmp->nm_ronly = 1; + + } else if ((nmp->nm_ronly) && + !vfs_flagopt(opts, "ro", NULL, 0)) { + /* + * Don't allow read-write snapshots. + */ + if (nmp->nm_mount_args.cpno != 0) + return (EROFS); + /* + * If upgrade to read-write by non-root, then verify + * that user has necessary permissions on the device. + */ + devvp = nmp->nm_nandfsdev->nd_devvp; + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); + error = VOP_ACCESS(devvp, VREAD | VWRITE, + td->td_ucred, td); + if (error) { + error = priv_check(td, PRIV_VFS_MOUNT_PERM); + if (error) { + VOP_UNLOCK(devvp, 0); + return (error); + } + } + + VOP_UNLOCK(devvp, 0); + DROP_GIANT(); + g_topology_lock(); + error = g_access(nmp->nm_nandfsdev->nd_gconsumer, 0, 1, + 0); + g_topology_unlock(); + PICKUP_GIANT(); + if (error) + return (error); + + MNT_ILOCK(mp); + mp->mnt_flag &= ~MNT_RDONLY; + MNT_IUNLOCK(mp); + error = start_syncer(nmp); + if (error == 0) + error = nandfs_start_cleaner(nmp->nm_nandfsdev); + if (error) { + DROP_GIANT(); + g_topology_lock(); + g_access(nmp->nm_nandfsdev->nd_gconsumer, 0, -1, + 0); + g_topology_unlock(); + PICKUP_GIANT(); + return (error); + } + + nmp->nm_ronly = 0; + } + return (0); + } + + from = vfs_getopts(opts, "from", &error); + if (error) + return (error); + + /* + * Find device node + */ + NDINIT(&nd, LOOKUP, FOLLOW|LOCKLEAF, UIO_SYSSPACE, from, curthread); + error = namei(&nd); + if (error) + return (error); + NDFREE(&nd, NDF_ONLY_PNBUF); + + devvp = nd.ni_vp; + + if (!vn_isdisk(devvp, &error)) { + vput(devvp); + return (error); + } + + /* Check the access rights on the mount device */ + error = VOP_ACCESS(devvp, VREAD, curthread->td_ucred, curthread); + if (error) + error = priv_check(curthread, PRIV_VFS_MOUNT_PERM); + if (error) { + vput(devvp); + return (error); + } + + vfs_getnewfsid(mp); + + error = nandfs_mountfs(devvp, mp); + if (error) + return (error); + vfs_mountedfrom(mp, from); + + return (0); +} + +static int +nandfs_mountfs(struct vnode *devvp, struct mount *mp) +{ + struct nandfsmount *nmp = NULL; + struct nandfs_args *args = NULL; + struct nandfs_device *nandfsdev; + char *from; + int error, ronly; + char *cpno; + + ronly = (mp->mnt_flag & MNT_RDONLY) != 0; + + if (devvp->v_rdev->si_iosize_max != 0) + mp->mnt_iosize_max = devvp->v_rdev->si_iosize_max; + VOP_UNLOCK(devvp, 0); + + if (mp->mnt_iosize_max > MAXPHYS) + mp->mnt_iosize_max = MAXPHYS; + + from = vfs_getopts(mp->mnt_optnew, "from", &error); + if (error) + goto error; + + error = vfs_getopt(mp->mnt_optnew, "snap", (void **)&cpno, NULL); + if (error == ENOENT) + cpno = NULL; + else if (error) + goto error; + + args = (struct nandfs_args *)malloc(sizeof(struct nandfs_args), + M_NANDFSMNT, M_WAITOK | M_ZERO); + + if (cpno != NULL) + args->cpno = strtoul(cpno, (char **)NULL, 10); + else + args->cpno = 0; + args->fspec = from; + + if (args->cpno != 0 && !ronly) { + error = EROFS; + goto error; + } + + printf("WARNING: NANDFS is considered to be a highly experimental " + "feature in FreeBSD.\n"); + + error = nandfs_mount_device(devvp, mp, args, &nandfsdev); + if (error) + goto error; + + nmp = (struct nandfsmount *) malloc(sizeof(struct nandfsmount), + M_NANDFSMNT, M_WAITOK | M_ZERO); + + mp->mnt_data = nmp; + nmp->nm_vfs_mountp = mp; + nmp->nm_ronly = ronly; + MNT_ILOCK(mp); + mp->mnt_flag |= MNT_LOCAL; + mp->mnt_kern_flag |= MNTK_MPSAFE; + MNT_IUNLOCK(mp); + nmp->nm_nandfsdev = nandfsdev; + /* Add our mountpoint */ + STAILQ_INSERT_TAIL(&nandfsdev->nd_mounts, nmp, nm_next_mount); + + if (args->cpno > nandfsdev->nd_last_cno) { + printf("WARNING: supplied checkpoint number (%jd) is greater " + "than last known checkpoint on filesystem (%jd). Mounting" + " checkpoint %jd\n", (uintmax_t)args->cpno, + (uintmax_t)nandfsdev->nd_last_cno, + (uintmax_t)nandfsdev->nd_last_cno); + args->cpno = nandfsdev->nd_last_cno; + } + + /* Setting up other parameters */ + nmp->nm_mount_args = *args; + free(args, M_NANDFSMNT); + error = nandfs_mount_checkpoint(nmp); + if (error) { + nandfs_unmount(mp, MNT_FORCE); + goto unmounted; + } + + if (!ronly) { + error = start_syncer(nmp); + if (error == 0) + error = nandfs_start_cleaner(nmp->nm_nandfsdev); + if (error) + nandfs_unmount(mp, MNT_FORCE); + } + + return (0); + +error: + if (args != NULL) + free(args, M_NANDFSMNT); + + if (nmp != NULL) { + free(nmp, M_NANDFSMNT); + mp->mnt_data = NULL; + } +unmounted: + return (error); +} + +static int +nandfs_unmount(struct mount *mp, int mntflags) +{ + struct nandfs_device *nandfsdev; + struct nandfsmount *nmp; + int error; + int flags = 0; + + DPRINTF(VOLUMES, ("%s: mp = %p\n", __func__, (void *)mp)); + + if (mntflags & MNT_FORCE) + flags |= FORCECLOSE; + + nmp = mp->mnt_data; + nandfsdev = nmp->nm_nandfsdev; + + error = vflush(mp, 0, flags | SKIPSYSTEM, curthread); + if (error) + return (error); + + if (!(nmp->nm_ronly)) { + nandfs_stop_cleaner(nandfsdev); + stop_syncer(nmp); + } + + if (nmp->nm_ifile_node) + NANDFS_UNSET_SYSTEMFILE(NTOV(nmp->nm_ifile_node)); + + /* Remove our mount point */ + STAILQ_REMOVE(&nandfsdev->nd_mounts, nmp, nandfsmount, nm_next_mount); + + /* Unmount the device itself when we're the last one */ + nandfs_unmount_device(nandfsdev); + + free_nandfs_mountinfo(mp); + + /* + * Finally, throw away the null_mount structure + */ + mp->mnt_data = 0; + MNT_ILOCK(mp); + mp->mnt_flag &= ~MNT_LOCAL; + MNT_IUNLOCK(mp); + + return (0); +} + +static int +nandfs_statfs(struct mount *mp, struct statfs *sbp) +{ + struct nandfsmount *nmp; + struct nandfs_device *nandfsdev; + struct nandfs_fsdata *fsdata; + struct nandfs_super_block *sb; + struct nandfs_block_group_desc *groups; + struct nandfs_node *ifile; + struct nandfs_mdt *mdt; + struct buf *bp; + int i, error; + uint32_t entries_per_group; + uint64_t files = 0; + + nmp = mp->mnt_data; + nandfsdev = nmp->nm_nandfsdev; + fsdata = &nandfsdev->nd_fsdata; + sb = &nandfsdev->nd_super; + ifile = nmp->nm_ifile_node; + mdt = &nandfsdev->nd_ifile_mdt; + entries_per_group = mdt->entries_per_group; + + VOP_LOCK(NTOV(ifile), LK_SHARED); + error = nandfs_bread(ifile, 0, NOCRED, 0, &bp); + if (error) { + brelse(bp); + VOP_UNLOCK(NTOV(ifile), 0); + return (error); + } + + groups = (struct nandfs_block_group_desc *)bp->b_data; + + for (i = 0; i < mdt->groups_per_desc_block; i++) + files += (entries_per_group - groups[i].bg_nfrees); + + brelse(bp); + VOP_UNLOCK(NTOV(ifile), 0); + + sbp->f_bsize = nandfsdev->nd_blocksize; + sbp->f_iosize = sbp->f_bsize; + sbp->f_blocks = fsdata->f_blocks_per_segment * fsdata->f_nsegments; + sbp->f_bfree = sb->s_free_blocks_count; + sbp->f_bavail = sbp->f_bfree; + sbp->f_files = files; + sbp->f_ffree = 0; + return (0); +} + +static int +nandfs_root(struct mount *mp, int flags, struct vnode **vpp) +{ + struct nandfsmount *nmp = VFSTONANDFS(mp); + struct nandfs_node *node; + int error; + + error = nandfs_get_node(nmp, NANDFS_ROOT_INO, &node); + if (error) + return (error); + + KASSERT(NTOV(node)->v_vflag & VV_ROOT, + ("root_vp->v_vflag & VV_ROOT")); + + *vpp = NTOV(node); + + return (error); +} + +static int +nandfs_vget(struct mount *mp, ino_t ino, int flags, struct vnode **vpp) +{ + struct nandfsmount *nmp = VFSTONANDFS(mp); + struct nandfs_node *node; + int error; + + error = nandfs_get_node(nmp, ino, &node); + if (node) + *vpp = NTOV(node); + + return (error); +} + +static int +nandfs_sync(struct mount *mp, int waitfor) +{ + struct nandfsmount *nmp = VFSTONANDFS(mp); + + DPRINTF(SYNC, ("%s: mp %p waitfor %d\n", __func__, mp, waitfor)); + + /* + * XXX: A hack to be removed soon + */ + if (waitfor == MNT_LAZY) + return (0); + if (waitfor == MNT_SUSPEND) + return (0); + nandfs_wakeup_wait_sync(nmp->nm_nandfsdev, SYNCER_VFS_SYNC); + return (0); +} + +static struct vfsops nandfs_vfsops = { + .vfs_init = nandfs_init, + .vfs_mount = nandfs_mount, + .vfs_root = nandfs_root, + .vfs_statfs = nandfs_statfs, + .vfs_uninit = nandfs_uninit, + .vfs_unmount = nandfs_unmount, + .vfs_vget = nandfs_vget, + .vfs_sync = nandfs_sync, +}; + +VFS_SET(nandfs_vfsops, nandfs, VFCF_LOOPBACK); diff --git a/sys/fs/nandfs/nandfs_vnops.c b/sys/fs/nandfs/nandfs_vnops.c new file mode 100644 index 00000000000..b226d30afca --- /dev/null +++ b/sys/fs/nandfs/nandfs_vnops.c @@ -0,0 +1,2455 @@ +/*- + * Copyright (c) 2010-2012 Semihalf + * Copyright (c) 2008, 2009 Reinoud Zandijk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * From: NetBSD: nilfs_vnops.c,v 1.2 2009/08/26 03:40:48 elad + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include +#include +#include + +extern uma_zone_t nandfs_node_zone; +static void nandfs_read_filebuf(struct nandfs_node *, struct buf *); +static void nandfs_itimes_locked(struct vnode *); +static int nandfs_truncate(struct vnode *, uint64_t); + +static vop_pathconf_t nandfs_pathconf; + +#define UPDATE_CLOSE 0 +#define UPDATE_WAIT 0 + +static int +nandfs_inactive(struct vop_inactive_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct nandfs_node *node = VTON(vp); + int error = 0; + + DPRINTF(VNCALL, ("%s: vp:%p node:%p\n", __func__, vp, node)); + + if (node == NULL) { + DPRINTF(NODE, ("%s: inactive NULL node\n", __func__)); + return (0); + } + + if (node->nn_inode.i_mode != 0 && !(node->nn_inode.i_links_count)) { + nandfs_truncate(vp, 0); + error = nandfs_node_destroy(node); + if (error) + nandfs_error("%s: destroy node: %p\n", __func__, node); + node->nn_flags = 0; + vrecycle(vp); + } + + return (error); +} + +static int +nandfs_reclaim(struct vop_reclaim_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct nandfs_node *nandfs_node = VTON(vp); + struct nandfs_device *fsdev = nandfs_node->nn_nandfsdev; + uint64_t ino = nandfs_node->nn_ino; + + DPRINTF(VNCALL, ("%s: vp:%p node:%p\n", __func__, vp, nandfs_node)); + + /* Invalidate all entries to a particular vnode. */ + cache_purge(vp); + + /* Destroy the vm object and flush associated pages. */ + vnode_destroy_vobject(vp); + + /* Remove from vfs hash if not system vnode */ + if (!NANDFS_SYS_NODE(nandfs_node->nn_ino)) + vfs_hash_remove(vp); + + /* Dispose all node knowledge */ + nandfs_dispose_node(&nandfs_node); + + if (!NANDFS_SYS_NODE(ino)) + NANDFS_WRITEUNLOCK(fsdev); + + return (0); +} + +static int +nandfs_read(struct vop_read_args *ap) +{ + register struct vnode *vp = ap->a_vp; + register struct nandfs_node *node = VTON(vp); + struct nandfs_device *nandfsdev = node->nn_nandfsdev; + struct uio *uio = ap->a_uio; + struct buf *bp; + uint64_t size; + uint32_t blocksize; + off_t bytesinfile; + ssize_t toread, off; + daddr_t lbn; + ssize_t resid; + int error = 0; + + if (uio->uio_resid == 0) + return (0); + + size = node->nn_inode.i_size; + if (uio->uio_offset >= size) + return (0); + + blocksize = nandfsdev->nd_blocksize; + bytesinfile = size - uio->uio_offset; + + resid = omin(uio->uio_resid, bytesinfile); + + while (resid) { + lbn = uio->uio_offset / blocksize; + off = uio->uio_offset & (blocksize - 1); + + toread = omin(resid, blocksize - off); + + DPRINTF(READ, ("nandfs_read bn: 0x%jx toread: 0x%zx (0x%x)\n", + (uintmax_t)lbn, toread, blocksize)); + + error = nandfs_bread(node, lbn, NOCRED, 0, &bp); + if (error) { + brelse(bp); + break; + } + + error = uiomove(bp->b_data + off, toread, uio); + if (error) { + brelse(bp); + break; + } + + brelse(bp); + resid -= toread; + } + + return (error); +} + +static int +nandfs_write(struct vop_write_args *ap) +{ + struct nandfs_device *fsdev; + struct nandfs_node *node; + struct vnode *vp; + struct uio *uio; + struct buf *bp; + uint64_t file_size, vblk; + uint32_t blocksize; + ssize_t towrite, off; + daddr_t lbn; + ssize_t resid; + int error, ioflag, modified; + + vp = ap->a_vp; + uio = ap->a_uio; + ioflag = ap->a_ioflag; + node = VTON(vp); + fsdev = node->nn_nandfsdev; + + if (nandfs_fs_full(fsdev)) + return (ENOSPC); + + DPRINTF(WRITE, ("nandfs_write called %#zx at %#jx\n", + uio->uio_resid, (uintmax_t)uio->uio_offset)); + + if (uio->uio_offset < 0) + return (EINVAL); + if (uio->uio_resid == 0) + return (0); + + blocksize = fsdev->nd_blocksize; + file_size = node->nn_inode.i_size; + + switch (vp->v_type) { + case VREG: + if (ioflag & IO_APPEND) + uio->uio_offset = file_size; + break; + case VDIR: + return (EISDIR); + case VLNK: + break; + default: + panic("%s: bad file type vp: %p", __func__, vp); + } + + /* If explicitly asked to append, uio_offset can be wrong? */ + if (ioflag & IO_APPEND) + uio->uio_offset = file_size; + + resid = uio->uio_resid; + modified = error = 0; + + while (uio->uio_resid) { + lbn = uio->uio_offset / blocksize; + off = uio->uio_offset & (blocksize - 1); + + towrite = omin(uio->uio_resid, blocksize - off); + + DPRINTF(WRITE, ("%s: lbn: 0x%jd toread: 0x%zx (0x%x)\n", + __func__, (uintmax_t)lbn, towrite, blocksize)); + + error = nandfs_bmap_lookup(node, lbn, &vblk); + if (error) + break; + + DPRINTF(WRITE, ("%s: lbn: 0x%jd toread: 0x%zx (0x%x) " + "vblk=%jx\n", __func__, (uintmax_t)lbn, towrite, blocksize, + vblk)); + + if (vblk != 0) + error = nandfs_bread(node, lbn, NOCRED, 0, &bp); + else + error = nandfs_bcreate(node, lbn, NOCRED, 0, &bp); + + DPRINTF(WRITE, ("%s: vp %p bread bp %p lbn %#jx\n", __func__, + vp, bp, (uintmax_t)lbn)); + if (error) { + if (bp) + brelse(bp); + break; + } + + error = uiomove((char *)bp->b_data + off, (int)towrite, uio); + if (error) + break; + + error = nandfs_dirty_buf(bp, 0); + if (error) + break; + + modified++; + } + + /* XXX proper handling when only part of file was properly written */ + if (modified) { + if (resid > uio->uio_resid && ap->a_cred && + ap->a_cred->cr_uid != 0) + node->nn_inode.i_mode &= ~(ISUID | ISGID); + + if (file_size < uio->uio_offset + uio->uio_resid) { + node->nn_inode.i_size = uio->uio_offset + + uio->uio_resid; + node->nn_flags |= IN_CHANGE | IN_UPDATE; + vnode_pager_setsize(vp, uio->uio_offset + + uio->uio_resid); + nandfs_itimes(vp); + } + } + + DPRINTF(WRITE, ("%s: return:%d\n", __func__, error)); + + return (error); +} + +static int +nandfs_lookup(struct vop_cachedlookup_args *ap) +{ + struct vnode *dvp, **vpp; + struct componentname *cnp; + struct ucred *cred; + struct thread *td; + struct nandfs_node *dir_node, *node; + struct nandfsmount *nmp; + uint64_t ino, off; + const char *name; + int namelen, nameiop, islastcn, mounted_ro; + int error, found; + + DPRINTF(VNCALL, ("%s\n", __func__)); + + dvp = ap->a_dvp; + vpp = ap->a_vpp; + *vpp = NULL; + + cnp = ap->a_cnp; + cred = cnp->cn_cred; + td = cnp->cn_thread; + + dir_node = VTON(dvp); + nmp = dir_node->nn_nmp; + + /* Simplify/clarification flags */ + nameiop = cnp->cn_nameiop; + islastcn = cnp->cn_flags & ISLASTCN; + mounted_ro = dvp->v_mount->mnt_flag & MNT_RDONLY; + + /* + * If requesting a modify on the last path element on a read-only + * filingsystem, reject lookup; + */ + if (islastcn && mounted_ro && (nameiop == DELETE || nameiop == RENAME)) + return (EROFS); + + if (dir_node->nn_inode.i_links_count == 0) + return (ENOENT); + + /* + * Obviously, the file is not (anymore) in the namecache, we have to + * search for it. There are three basic cases: '.', '..' and others. + * + * Following the guidelines of VOP_LOOKUP manpage and tmpfs. + */ + error = 0; + if ((cnp->cn_namelen == 1) && (cnp->cn_nameptr[0] == '.')) { + DPRINTF(LOOKUP, ("\tlookup '.'\n")); + /* Special case 1 '.' */ + VREF(dvp); + *vpp = dvp; + /* Done */ + } else if (cnp->cn_flags & ISDOTDOT) { + /* Special case 2 '..' */ + DPRINTF(LOOKUP, ("\tlookup '..'\n")); + + /* Get our node */ + name = ".."; + namelen = 2; + error = nandfs_lookup_name_in_dir(dvp, name, namelen, &ino, + &found, &off); + if (error) + goto out; + if (!found) + error = ENOENT; + + /* First unlock parent */ + VOP_UNLOCK(dvp, 0); + + if (error == 0) { + DPRINTF(LOOKUP, ("\tfound '..'\n")); + /* Try to create/reuse the node */ + error = nandfs_get_node(nmp, ino, &node); + + if (!error) { + DPRINTF(LOOKUP, + ("\tnode retrieved/created OK\n")); + *vpp = NTOV(node); + } + } + + /* Try to relock parent */ + vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY); + } else { + DPRINTF(LOOKUP, ("\tlookup file\n")); + /* All other files */ + /* Look up filename in the directory returning its inode */ + name = cnp->cn_nameptr; + namelen = cnp->cn_namelen; + error = nandfs_lookup_name_in_dir(dvp, name, namelen, + &ino, &found, &off); + if (error) + goto out; + if (!found) { + DPRINTF(LOOKUP, ("\tNOT found\n")); + /* + * UGH, didn't find name. If we're creating or + * renaming on the last name this is OK and we ought + * to return EJUSTRETURN if its allowed to be created. + */ + error = ENOENT; + if ((nameiop == CREATE || nameiop == RENAME) && + islastcn) { + error = VOP_ACCESS(dvp, VWRITE, cred, + td); + if (!error) { + /* keep the component name */ + cnp->cn_flags |= SAVENAME; + error = EJUSTRETURN; + } + } + /* Done */ + } else { + if (ino == NANDFS_WHT_INO) + cnp->cn_flags |= ISWHITEOUT; + + if ((cnp->cn_flags & ISWHITEOUT) && + (nameiop == LOOKUP)) + return (ENOENT); + + if ((nameiop == DELETE) && islastcn) { + if ((cnp->cn_flags & ISWHITEOUT) && + (cnp->cn_flags & DOWHITEOUT)) { + cnp->cn_flags |= SAVENAME; + dir_node->nn_diroff = off; + return (EJUSTRETURN); + } + + error = VOP_ACCESS(dvp, VWRITE, cred, + cnp->cn_thread); + if (error) + return (error); + + /* Try to create/reuse the node */ + error = nandfs_get_node(nmp, ino, &node); + if (!error) { + *vpp = NTOV(node); + node->nn_diroff = off; + } + + if ((dir_node->nn_inode.i_mode & ISVTX) && + cred->cr_uid != 0 && + cred->cr_uid != dir_node->nn_inode.i_uid && + node->nn_inode.i_uid != cred->cr_uid) { + vput(*vpp); + *vpp = NULL; + return (EPERM); + } + } else if ((nameiop == RENAME) && islastcn) { + error = VOP_ACCESS(dvp, VWRITE, cred, + cnp->cn_thread); + if (error) + return (error); + + /* Try to create/reuse the node */ + error = nandfs_get_node(nmp, ino, &node); + if (!error) { + *vpp = NTOV(node); + node->nn_diroff = off; + } + } else { + /* Try to create/reuse the node */ + error = nandfs_get_node(nmp, ino, &node); + if (!error) { + *vpp = NTOV(node); + node->nn_diroff = off; + } + } + } + } + +out: + /* + * Store result in the cache if requested. If we are creating a file, + * the file might not be found and thus putting it into the namecache + * might be seen as negative caching. + */ + if ((cnp->cn_flags & MAKEENTRY) && nameiop != CREATE) + cache_enter(dvp, *vpp, cnp); + + return (error); + +} + +static int +nandfs_getattr(struct vop_getattr_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct vattr *vap = ap->a_vap; + struct nandfs_node *node = VTON(vp); + struct nandfs_inode *inode = &node->nn_inode; + + DPRINTF(VNCALL, ("%s: vp: %p\n", __func__, vp)); + nandfs_itimes(vp); + + /* Basic info */ + VATTR_NULL(vap); + vap->va_atime.tv_sec = inode->i_mtime; + vap->va_atime.tv_nsec = inode->i_mtime_nsec; + vap->va_mtime.tv_sec = inode->i_mtime; + vap->va_mtime.tv_nsec = inode->i_mtime_nsec; + vap->va_ctime.tv_sec = inode->i_ctime; + vap->va_ctime.tv_nsec = inode->i_ctime_nsec; + vap->va_type = IFTOVT(inode->i_mode); + vap->va_mode = inode->i_mode & ~S_IFMT; + vap->va_nlink = inode->i_links_count; + vap->va_uid = inode->i_uid; + vap->va_gid = inode->i_gid; + vap->va_rdev = inode->i_special; + vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; + vap->va_fileid = node->nn_ino; + vap->va_size = inode->i_size; + vap->va_blocksize = node->nn_nandfsdev->nd_blocksize; + vap->va_gen = 0; + vap->va_flags = inode->i_flags; + vap->va_bytes = inode->i_blocks * vap->va_blocksize; + vap->va_filerev = 0; + vap->va_vaflags = 0; + + return (0); +} + +static int +nandfs_vtruncbuf(struct vnode *vp, uint64_t nblks) +{ + struct nandfs_device *nffsdev; + struct bufobj *bo; + struct buf *bp, *nbp; + + bo = &vp->v_bufobj; + nffsdev = VTON(vp)->nn_nandfsdev; + + ASSERT_VOP_LOCKED(vp, "nandfs_truncate"); +restart: + BO_LOCK(bo); +restart_locked: + TAILQ_FOREACH_SAFE(bp, &bo->bo_clean.bv_hd, b_bobufs, nbp) { + if (bp->b_lblkno < nblks) + continue; + if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL)) + goto restart_locked; + + bremfree(bp); + bp->b_flags |= (B_INVAL | B_RELBUF); + bp->b_flags &= ~(B_ASYNC | B_MANAGED); + BO_UNLOCK(bo); + brelse(bp); + BO_LOCK(bo); + } + + TAILQ_FOREACH_SAFE(bp, &bo->bo_dirty.bv_hd, b_bobufs, nbp) { + if (bp->b_lblkno < nblks) + continue; + if (BUF_LOCK(bp, + LK_EXCLUSIVE | LK_SLEEPFAIL | LK_INTERLOCK, + BO_MTX(bo)) == ENOLCK) + goto restart; + bp->b_flags |= (B_INVAL | B_RELBUF); + bp->b_flags &= ~(B_ASYNC | B_MANAGED); + brelse(bp); + nandfs_dirty_bufs_decrement(nffsdev); + BO_LOCK(bo); + } + + BO_UNLOCK(bo); + + return (0); +} + +static int +nandfs_truncate(struct vnode *vp, uint64_t newsize) +{ + struct nandfs_device *nffsdev; + struct nandfs_node *node; + struct nandfs_inode *inode; + struct buf *bp = NULL; + uint64_t oblks, nblks, vblk, size, rest; + int error; + + node = VTON(vp); + nffsdev = node->nn_nandfsdev; + inode = &node->nn_inode; + + /* Calculate end of file */ + size = inode->i_size; + + if (newsize == size) { + node->nn_flags |= IN_CHANGE | IN_UPDATE; + nandfs_itimes(vp); + return (0); + } + + if (newsize > size) { + inode->i_size = newsize; + vnode_pager_setsize(vp, newsize); + node->nn_flags |= IN_CHANGE | IN_UPDATE; + nandfs_itimes(vp); + return (0); + } + + nblks = howmany(newsize, nffsdev->nd_blocksize); + oblks = howmany(size, nffsdev->nd_blocksize); + rest = newsize % nffsdev->nd_blocksize; + + if (rest) { + error = nandfs_bmap_lookup(node, nblks - 1, &vblk); + if (error) + return (error); + + if (vblk != 0) + error = nandfs_bread(node, nblks - 1, NOCRED, 0, &bp); + else + error = nandfs_bcreate(node, nblks - 1, NOCRED, 0, &bp); + + if (error) { + if (bp) + brelse(bp); + return (error); + } + + bzero((char *)bp->b_data + rest, + (u_int)(nffsdev->nd_blocksize - rest)); + error = nandfs_dirty_buf(bp, 0); + if (error) + return (error); + } + + DPRINTF(VNCALL, ("%s: vp %p oblks %jx nblks %jx\n", __func__, vp, oblks, + nblks)); + + error = nandfs_bmap_truncate_mapping(node, oblks - 1, nblks - 1); + if (error) { + if (bp) + nandfs_undirty_buf(bp); + return (error); + } + + error = nandfs_vtruncbuf(vp, nblks); + if (error) { + if (bp) + nandfs_undirty_buf(bp); + return (error); + } + + inode->i_size = newsize; + vnode_pager_setsize(vp, newsize); + node->nn_flags |= IN_CHANGE | IN_UPDATE; + nandfs_itimes(vp); + + return (error); +} + +static void +nandfs_itimes_locked(struct vnode *vp) +{ + struct nandfs_node *node; + struct nandfs_inode *inode; + struct timespec ts; + + ASSERT_VI_LOCKED(vp, __func__); + + node = VTON(vp); + inode = &node->nn_inode; + + if ((node->nn_flags & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) == 0) + return; + + if (((vp->v_mount->mnt_kern_flag & + (MNTK_SUSPENDED | MNTK_SUSPEND)) == 0) || + (node->nn_flags & (IN_CHANGE | IN_UPDATE))) + node->nn_flags |= IN_MODIFIED; + + vfs_timestamp(&ts); + if (node->nn_flags & IN_UPDATE) { + inode->i_mtime = ts.tv_sec; + inode->i_mtime_nsec = ts.tv_nsec; + } + if (node->nn_flags & IN_CHANGE) { + inode->i_ctime = ts.tv_sec; + inode->i_ctime_nsec = ts.tv_nsec; + } + + node->nn_flags &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); +} + +void +nandfs_itimes(struct vnode *vp) +{ + + VI_LOCK(vp); + nandfs_itimes_locked(vp); + VI_UNLOCK(vp); +} + +static int +nandfs_chmod(struct vnode *vp, int mode, struct ucred *cred, struct thread *td) +{ + struct nandfs_node *node = VTON(vp); + struct nandfs_inode *inode = &node->nn_inode; + uint16_t nmode; + int error = 0; + + DPRINTF(VNCALL, ("%s: vp %p, mode %x, cred %p, td %p\n", __func__, vp, + mode, cred, td)); + /* + * To modify the permissions on a file, must possess VADMIN + * for that file. + */ + if ((error = VOP_ACCESS(vp, VADMIN, cred, td))) + return (error); + + /* + * Privileged processes may set the sticky bit on non-directories, + * as well as set the setgid bit on a file with a group that the + * process is not a member of. Both of these are allowed in + * jail(8). + */ + if (vp->v_type != VDIR && (mode & S_ISTXT)) { + if (priv_check_cred(cred, PRIV_VFS_STICKYFILE, 0)) + return (EFTYPE); + } + if (!groupmember(inode->i_gid, cred) && (mode & ISGID)) { + error = priv_check_cred(cred, PRIV_VFS_SETGID, 0); + if (error) + return (error); + } + + /* + * Deny setting setuid if we are not the file owner. + */ + if ((mode & ISUID) && inode->i_uid != cred->cr_uid) { + error = priv_check_cred(cred, PRIV_VFS_ADMIN, 0); + if (error) + return (error); + } + + nmode = inode->i_mode; + nmode &= ~ALLPERMS; + nmode |= (mode & ALLPERMS); + inode->i_mode = nmode; + node->nn_flags |= IN_CHANGE; + + DPRINTF(VNCALL, ("%s: to mode %x\n", __func__, nmode)); + + return (error); +} + +static int +nandfs_chown(struct vnode *vp, uid_t uid, gid_t gid, struct ucred *cred, + struct thread *td) +{ + struct nandfs_node *node = VTON(vp); + struct nandfs_inode *inode = &node->nn_inode; + uid_t ouid; + gid_t ogid; + int error = 0; + + if (uid == (uid_t)VNOVAL) + uid = inode->i_uid; + if (gid == (gid_t)VNOVAL) + gid = inode->i_gid; + /* + * To modify the ownership of a file, must possess VADMIN for that + * file. + */ + if ((error = VOP_ACCESSX(vp, VWRITE_OWNER, cred, td))) + return (error); + /* + * To change the owner of a file, or change the group of a file to a + * group of which we are not a member, the caller must have + * privilege. + */ + if (((uid != inode->i_uid && uid != cred->cr_uid) || + (gid != inode->i_gid && !groupmember(gid, cred))) && + (error = priv_check_cred(cred, PRIV_VFS_CHOWN, 0))) + return (error); + ogid = inode->i_gid; + ouid = inode->i_uid; + + inode->i_gid = gid; + inode->i_uid = uid; + + node->nn_flags |= IN_CHANGE; + if ((inode->i_mode & (ISUID | ISGID)) && + (ouid != uid || ogid != gid)) { + if (priv_check_cred(cred, PRIV_VFS_RETAINSUGID, 0)) { + inode->i_mode &= ~(ISUID | ISGID); + } + } + DPRINTF(VNCALL, ("%s: vp %p, cred %p, td %p - ret OK\n", __func__, vp, + cred, td)); + return (0); +} + +static int +nandfs_setattr(struct vop_setattr_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct nandfs_node *node = VTON(vp); + struct nandfs_inode *inode = &node->nn_inode; + struct vattr *vap = ap->a_vap; + struct ucred *cred = ap->a_cred; + struct thread *td = curthread; + uint32_t flags; + int error = 0; + + if ((vap->va_type != VNON) || (vap->va_nlink != VNOVAL) || + (vap->va_fsid != VNOVAL) || (vap->va_fileid != VNOVAL) || + (vap->va_blocksize != VNOVAL) || (vap->va_rdev != VNOVAL) || + (vap->va_bytes != VNOVAL) || (vap->va_gen != VNOVAL)) { + DPRINTF(VNCALL, ("%s: unsettable attribute\n", __func__)); + return (EINVAL); + } + + if (vap->va_flags != VNOVAL) { + DPRINTF(VNCALL, ("%s: vp:%p td:%p flags:%lx\n", __func__, vp, + td, vap->va_flags)); + + if (vp->v_mount->mnt_flag & MNT_RDONLY) + return (EROFS); + /* + * Callers may only modify the file flags on objects they + * have VADMIN rights for. + */ + if ((error = VOP_ACCESS(vp, VADMIN, cred, td))) + return (error); + /* + * Unprivileged processes are not permitted to unset system + * flags, or modify flags if any system flags are set. + * Privileged non-jail processes may not modify system flags + * if securelevel > 0 and any existing system flags are set. + * Privileged jail processes behave like privileged non-jail + * processes if the security.jail.chflags_allowed sysctl is + * is non-zero; otherwise, they behave like unprivileged + * processes. + */ + + flags = inode->i_flags; + if (!priv_check_cred(cred, PRIV_VFS_SYSFLAGS, 0)) { + if (flags & (SF_NOUNLINK | SF_IMMUTABLE | SF_APPEND)) { + error = securelevel_gt(cred, 0); + if (error) + return (error); + } + /* Snapshot flag cannot be set or cleared */ + if (((vap->va_flags & SF_SNAPSHOT) != 0 && + (flags & SF_SNAPSHOT) == 0) || + ((vap->va_flags & SF_SNAPSHOT) == 0 && + (flags & SF_SNAPSHOT) != 0)) + return (EPERM); + + inode->i_flags = vap->va_flags; + } else { + if (flags & (SF_NOUNLINK | SF_IMMUTABLE | SF_APPEND) || + (vap->va_flags & UF_SETTABLE) != vap->va_flags) + return (EPERM); + + flags &= SF_SETTABLE; + flags |= (vap->va_flags & UF_SETTABLE); + inode->i_flags = flags; + } + node->nn_flags |= IN_CHANGE; + if (vap->va_flags & (IMMUTABLE | APPEND)) + return (0); + } + if (inode->i_flags & (IMMUTABLE | APPEND)) + return (EPERM); + + if (vap->va_size != (u_quad_t)VNOVAL) { + DPRINTF(VNCALL, ("%s: vp:%p td:%p size:%jx\n", __func__, vp, td, + (uintmax_t)vap->va_size)); + + switch (vp->v_type) { + case VDIR: + return (EISDIR); + case VLNK: + case VREG: + if (vp->v_mount->mnt_flag & MNT_RDONLY) + return (EROFS); + if ((inode->i_flags & SF_SNAPSHOT) != 0) + return (EPERM); + break; + default: + return (0); + } + + if (vap->va_size > node->nn_nandfsdev->nd_maxfilesize) + return (EFBIG); + + KASSERT((vp->v_type == VREG), ("Set size %d", vp->v_type)); + nandfs_truncate(vp, vap->va_size); + node->nn_flags |= IN_CHANGE; + + return (0); + } + + if (vap->va_uid != (uid_t)VNOVAL || vap->va_gid != (gid_t)VNOVAL) { + if (vp->v_mount->mnt_flag & MNT_RDONLY) + return (EROFS); + DPRINTF(VNCALL, ("%s: vp:%p td:%p uid/gid %x/%x\n", __func__, + vp, td, vap->va_uid, vap->va_gid)); + error = nandfs_chown(vp, vap->va_uid, vap->va_gid, cred, td); + if (error) + return (error); + } + + if (vap->va_mode != (mode_t)VNOVAL) { + if (vp->v_mount->mnt_flag & MNT_RDONLY) + return (EROFS); + DPRINTF(VNCALL, ("%s: vp:%p td:%p mode %x\n", __func__, vp, td, + vap->va_mode)); + + error = nandfs_chmod(vp, (int)vap->va_mode, cred, td); + if (error) + return (error); + } + if (vap->va_atime.tv_sec != VNOVAL || + vap->va_mtime.tv_sec != VNOVAL || + vap->va_birthtime.tv_sec != VNOVAL) { + DPRINTF(VNCALL, ("%s: vp:%p td:%p time a/m/b %jx/%jx/%jx\n", + __func__, vp, td, (uintmax_t)vap->va_atime.tv_sec, + (uintmax_t)vap->va_mtime.tv_sec, + (uintmax_t)vap->va_birthtime.tv_sec)); + + if (vap->va_atime.tv_sec != VNOVAL) + node->nn_flags |= IN_ACCESS; + if (vap->va_mtime.tv_sec != VNOVAL) + node->nn_flags |= IN_CHANGE | IN_UPDATE; + if (vap->va_birthtime.tv_sec != VNOVAL) + node->nn_flags |= IN_MODIFIED; + nandfs_itimes(vp); + return (0); + } + + return (0); +} + +static int +nandfs_open(struct vop_open_args *ap) +{ + struct nandfs_node *node = VTON(ap->a_vp); + uint64_t filesize; + + DPRINTF(VNCALL, ("nandfs_open called ap->a_mode %x\n", ap->a_mode)); + + if (ap->a_vp->v_type == VCHR || ap->a_vp->v_type == VBLK) + return (EOPNOTSUPP); + + if ((node->nn_inode.i_flags & APPEND) && + (ap->a_mode & (FWRITE | O_APPEND)) == FWRITE) + return (EPERM); + + filesize = node->nn_inode.i_size; + vnode_create_vobject(ap->a_vp, filesize, ap->a_td); + + return (0); +} + +static int +nandfs_close(struct vop_close_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct nandfs_node *node = VTON(vp); + + DPRINTF(VNCALL, ("%s: vp %p node %p\n", __func__, vp, node)); + + mtx_lock(&vp->v_interlock); + if (vp->v_usecount > 1) + nandfs_itimes_locked(vp); + mtx_unlock(&vp->v_interlock); + + return (0); +} + +static int +nandfs_check_possible(struct vnode *vp, struct vattr *vap, mode_t mode) +{ + + /* Check if we are allowed to write */ + switch (vap->va_type) { + case VDIR: + case VLNK: + case VREG: + /* + * Normal nodes: check if we're on a read-only mounted + * filingsystem and bomb out if we're trying to write. + */ + if ((mode & VWRITE) && (vp->v_mount->mnt_flag & MNT_RDONLY)) + return (EROFS); + break; + case VBLK: + case VCHR: + case VSOCK: + case VFIFO: + /* + * Special nodes: even on read-only mounted filingsystems + * these are allowed to be written to if permissions allow. + */ + break; + default: + /* No idea what this is */ + return (EINVAL); + } + + /* Noone may write immutable files */ + if ((mode & VWRITE) && (VTON(vp)->nn_inode.i_flags & IMMUTABLE)) + return (EPERM); + + return (0); +} + +static int +nandfs_check_permitted(struct vnode *vp, struct vattr *vap, mode_t mode, + struct ucred *cred) +{ + + return (vaccess(vp->v_type, vap->va_mode, vap->va_uid, vap->va_gid, mode, + cred, NULL)); +} + +static int +nandfs_advlock(struct vop_advlock_args *ap) +{ + struct nandfs_node *nvp; + quad_t size; + + nvp = VTON(ap->a_vp); + size = nvp->nn_inode.i_size; + return (lf_advlock(ap, &(nvp->nn_lockf), size)); +} + +static int +nandfs_access(struct vop_access_args *ap) +{ + struct vnode *vp = ap->a_vp; + accmode_t accmode = ap->a_accmode; + struct ucred *cred = ap->a_cred; + struct vattr vap; + int error; + + DPRINTF(VNCALL, ("%s: vp:%p mode: %x\n", __func__, vp, accmode)); + + error = VOP_GETATTR(vp, &vap, NULL); + if (error) + return (error); + + error = nandfs_check_possible(vp, &vap, accmode); + if (error) { + return (error); + } + + error = nandfs_check_permitted(vp, &vap, accmode, cred); + + return (error); +} + +static int +nandfs_print(struct vop_print_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct nandfs_node *nvp = VTON(vp); + + printf("\tvp=%p, nandfs_node=%p\n", vp, nvp); + printf("nandfs inode %#jx\n", (uintmax_t)nvp->nn_ino); + printf("flags = 0x%b\n", (u_int)nvp->nn_flags, PRINT_NODE_FLAGS); + + return (0); +} + +static void +nandfs_read_filebuf(struct nandfs_node *node, struct buf *bp) +{ + struct nandfs_device *nandfsdev = node->nn_nandfsdev; + struct buf *nbp; + nandfs_daddr_t vblk, pblk; + nandfs_lbn_t from; + uint32_t blocksize; + int error = 0; + int blk2dev = nandfsdev->nd_blocksize / DEV_BSIZE; + + /* + * Translate all the block sectors into a series of buffers to read + * asynchronously from the nandfs device. Note that this lookup may + * induce readin's too. + */ + + blocksize = nandfsdev->nd_blocksize; + if (bp->b_bcount / blocksize != 1) + panic("invalid b_count in bp %p\n", bp); + + from = bp->b_blkno; + + DPRINTF(READ, ("\tread in from inode %#jx blkno %#jx" + " count %#lx\n", (uintmax_t)node->nn_ino, from, + bp->b_bcount)); + + /* Get virtual block numbers for the vnode's buffer span */ + error = nandfs_bmap_lookup(node, from, &vblk); + if (error) { + bp->b_error = EINVAL; + bp->b_ioflags |= BIO_ERROR; + bufdone(bp); + return; + } + + /* Translate virtual block numbers to physical block numbers */ + error = nandfs_vtop(node, vblk, &pblk); + if (error) { + bp->b_error = EINVAL; + bp->b_ioflags |= BIO_ERROR; + bufdone(bp); + return; + } + + /* Issue translated blocks */ + bp->b_resid = bp->b_bcount; + + /* Note virtual block 0 marks not mapped */ + if (vblk == 0) { + vfs_bio_clrbuf(bp); + bufdone(bp); + return; + } + + nbp = bp; + nbp->b_blkno = pblk * blk2dev; + bp->b_iooffset = dbtob(nbp->b_blkno); + MPASS(bp->b_iooffset >= 0); + BO_STRATEGY(&nandfsdev->nd_devvp->v_bufobj, nbp); + nandfs_vblk_set(bp, vblk); + DPRINTF(READ, ("read_filebuf : ino %#jx blk %#jx -> " + "%#jx -> %#jx [bp %p]\n", (uintmax_t)node->nn_ino, + (uintmax_t)(from), (uintmax_t)vblk, + (uintmax_t)pblk, nbp)); +} + +static void +nandfs_write_filebuf(struct nandfs_node *node, struct buf *bp) +{ + struct nandfs_device *nandfsdev = node->nn_nandfsdev; + + bp->b_iooffset = dbtob(bp->b_blkno); + MPASS(bp->b_iooffset >= 0); + BO_STRATEGY(&nandfsdev->nd_devvp->v_bufobj, bp); +} + +static int +nandfs_strategy(struct vop_strategy_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct buf *bp = ap->a_bp; + struct nandfs_node *node = VTON(vp); + + + /* check if we ought to be here */ + KASSERT((vp->v_type != VBLK && vp->v_type != VCHR), + ("nandfs_strategy on type %d", vp->v_type)); + + /* Translate if needed and pass on */ + if (bp->b_iocmd == BIO_READ) { + nandfs_read_filebuf(node, bp); + return (0); + } + + /* Send to segment collector */ + nandfs_write_filebuf(node, bp); + return (0); +} + +static int +nandfs_readdir(struct vop_readdir_args *ap) +{ + struct uio *uio = ap->a_uio; + struct vnode *vp = ap->a_vp; + struct nandfs_node *node = VTON(vp); + struct nandfs_dir_entry *ndirent; + struct dirent dirent; + struct buf *bp; + uint64_t file_size, diroffset, transoffset, blkoff; + uint64_t blocknr; + uint32_t blocksize = node->nn_nandfsdev->nd_blocksize; + uint8_t *pos, name_len; + int error; + + DPRINTF(READDIR, ("nandfs_readdir called\n")); + + if (vp->v_type != VDIR) + return (ENOTDIR); + + file_size = node->nn_inode.i_size; + DPRINTF(READDIR, ("nandfs_readdir filesize %jd resid %zd\n", + (uintmax_t)file_size, uio->uio_resid )); + + /* We are called just as long as we keep on pushing data in */ + error = 0; + if ((uio->uio_offset < file_size) && + (uio->uio_resid >= sizeof(struct dirent))) { + diroffset = uio->uio_offset; + transoffset = diroffset; + + blocknr = diroffset / blocksize; + blkoff = diroffset % blocksize; + error = nandfs_bread(node, blocknr, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (EIO); + } + while (diroffset < file_size) { + DPRINTF(READDIR, ("readdir : offset = %"PRIu64"\n", + diroffset)); + if (blkoff >= blocksize) { + blkoff = 0; blocknr++; + brelse(bp); + error = nandfs_bread(node, blocknr, NOCRED, 0, + &bp); + if (error) { + brelse(bp); + return (EIO); + } + } + + /* Read in one dirent */ + pos = (uint8_t *)bp->b_data + blkoff; + ndirent = (struct nandfs_dir_entry *)pos; + + name_len = ndirent->name_len; + memset(&dirent, 0, sizeof(struct dirent)); + dirent.d_fileno = ndirent->inode; + if (dirent.d_fileno) { + dirent.d_type = ndirent->file_type; + dirent.d_namlen = name_len; + strncpy(dirent.d_name, ndirent->name, name_len); + dirent.d_reclen = GENERIC_DIRSIZ(&dirent); + DPRINTF(READDIR, ("copying `%*.*s`\n", name_len, + name_len, dirent.d_name)); + } + + /* + * If there isn't enough space in the uio to return a + * whole dirent, break off read + */ + if (uio->uio_resid < GENERIC_DIRSIZ(&dirent)) + break; + + /* Transfer */ + if (dirent.d_fileno) + uiomove(&dirent, GENERIC_DIRSIZ(&dirent), uio); + + /* Advance */ + diroffset += ndirent->rec_len; + blkoff += ndirent->rec_len; + + /* Remember the last entry we transfered */ + transoffset = diroffset; + } + brelse(bp); + + /* Pass on last transfered offset */ + uio->uio_offset = transoffset; + } + + if (ap->a_eofflag) + *ap->a_eofflag = (uio->uio_offset >= file_size); + + return (error); +} + +static int +nandfs_dirempty(struct vnode *dvp, uint64_t parentino, struct ucred *cred) +{ + struct nandfs_node *dnode = VTON(dvp); + struct nandfs_dir_entry *dirent; + uint64_t file_size = dnode->nn_inode.i_size; + uint64_t blockcount = dnode->nn_inode.i_blocks; + uint64_t blocknr; + uint32_t blocksize = dnode->nn_nandfsdev->nd_blocksize; + uint32_t limit; + uint32_t off; + uint8_t *pos; + struct buf *bp; + int error; + + DPRINTF(LOOKUP, ("%s: dvp %p parentino %#jx cred %p\n", __func__, dvp, + (uintmax_t)parentino, cred)); + + KASSERT((file_size != 0), ("nandfs_dirempty for NULL dir %p", dvp)); + + blocknr = 0; + while (blocknr < blockcount) { + error = nandfs_bread(dnode, blocknr, NOCRED, 0, &bp); + if (error) { + brelse(bp); + return (0); + } + + pos = (uint8_t *)bp->b_data; + off = 0; + + if (blocknr == (blockcount - 1)) + limit = file_size % blocksize; + else + limit = blocksize; + + while (off < limit) { + dirent = (struct nandfs_dir_entry *)(pos + off); + off += dirent->rec_len; + + if (dirent->inode == 0) + continue; + + switch (dirent->name_len) { + case 0: + break; + case 1: + if (dirent->name[0] != '.') + goto notempty; + + KASSERT(dirent->inode == dnode->nn_ino, + (".'s inode does not match dir")); + break; + case 2: + if (dirent->name[0] != '.' && + dirent->name[1] != '.') + goto notempty; + + KASSERT(dirent->inode == parentino, + ("..'s inode does not match parent")); + break; + default: + goto notempty; + } + } + + brelse(bp); + blocknr++; + } + + return (1); +notempty: + brelse(bp); + return (0); +} + +static int +nandfs_link(struct vop_link_args *ap) +{ + struct vnode *tdvp = ap->a_tdvp; + struct vnode *vp = ap->a_vp; + struct componentname *cnp = ap->a_cnp; + struct nandfs_node *node = VTON(vp); + struct nandfs_inode *inode = &node->nn_inode; + int error; + + if (tdvp->v_mount != vp->v_mount) + return (EXDEV); + + if (inode->i_links_count >= LINK_MAX) + return (EMLINK); + + if (inode->i_flags & (IMMUTABLE | APPEND)) + return (EPERM); + + /* Update link count */ + inode->i_links_count++; + + /* Add dir entry */ + error = nandfs_add_dirent(tdvp, node->nn_ino, cnp->cn_nameptr, + cnp->cn_namelen, IFTODT(inode->i_mode)); + if (error) { + inode->i_links_count--; + } + + node->nn_flags |= IN_CHANGE; + nandfs_itimes(vp); + DPRINTF(VNCALL, ("%s: tdvp %p vp %p cnp %p\n", + __func__, tdvp, vp, cnp)); + + return (0); +} + +static int +nandfs_create(struct vop_create_args *ap) +{ + struct vnode *dvp = ap->a_dvp; + struct vnode **vpp = ap->a_vpp; + struct componentname *cnp = ap->a_cnp; + uint16_t mode = MAKEIMODE(ap->a_vap->va_type, ap->a_vap->va_mode); + struct nandfs_node *dir_node = VTON(dvp); + struct nandfsmount *nmp = dir_node->nn_nmp; + struct nandfs_node *node; + int error; + + DPRINTF(VNCALL, ("%s: dvp %p\n", __func__, dvp)); + + if (nandfs_fs_full(dir_node->nn_nandfsdev)) + return (ENOSPC); + + /* Create new vnode/inode */ + error = nandfs_node_create(nmp, &node, mode); + if (error) + return (error); + node->nn_inode.i_gid = dir_node->nn_inode.i_gid; + node->nn_inode.i_uid = cnp->cn_cred->cr_uid; + + /* Add new dir entry */ + error = nandfs_add_dirent(dvp, node->nn_ino, cnp->cn_nameptr, + cnp->cn_namelen, IFTODT(mode)); + if (error) { + if (nandfs_node_destroy(node)) { + nandfs_error("%s: error destroying node %p\n", + __func__, node); + } + return (error); + } + *vpp = NTOV(node); + + DPRINTF(VNCALL, ("created file vp %p nandnode %p ino %jx\n", *vpp, node, + (uintmax_t)node->nn_ino)); + return (0); +} + +static int +nandfs_remove(struct vop_remove_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct vnode *dvp = ap->a_dvp; + struct nandfs_node *node = VTON(vp); + struct nandfs_node *dnode = VTON(dvp); + struct componentname *cnp = ap->a_cnp; + + DPRINTF(VNCALL, ("%s: dvp %p vp %p nandnode %p ino %#jx link %d\n", + __func__, dvp, vp, node, (uintmax_t)node->nn_ino, + node->nn_inode.i_links_count)); + + if (vp->v_type == VDIR) + return (EISDIR); + + /* Files marked as immutable or append-only cannot be deleted. */ + if ((node->nn_inode.i_flags & (IMMUTABLE | APPEND | NOUNLINK)) || + (dnode->nn_inode.i_flags & APPEND)) + return (EPERM); + + nandfs_remove_dirent(dvp, node, cnp); + node->nn_inode.i_links_count--; + node->nn_flags |= IN_CHANGE; + + return (0); +} + +/* + * Check if source directory is in the path of the target directory. + * Target is supplied locked, source is unlocked. + * The target is always vput before returning. + */ +static int +nandfs_checkpath(struct nandfs_node *src, struct nandfs_node *dest, + struct ucred *cred) +{ + struct vnode *vp; + int error, rootino; + struct nandfs_dir_entry dirent; + + vp = NTOV(dest); + if (src->nn_ino == dest->nn_ino) { + error = EEXIST; + goto out; + } + rootino = NANDFS_ROOT_INO; + error = 0; + if (dest->nn_ino == rootino) + goto out; + + for (;;) { + if (vp->v_type != VDIR) { + error = ENOTDIR; + break; + } + + error = vn_rdwr(UIO_READ, vp, (caddr_t)&dirent, + NANDFS_DIR_REC_LEN(2), (off_t)0, UIO_SYSSPACE, + IO_NODELOCKED | IO_NOMACCHECK, cred, NOCRED, + NULL, NULL); + if (error != 0) + break; + if (dirent.name_len != 2 || + dirent.name[0] != '.' || + dirent.name[1] != '.') { + error = ENOTDIR; + break; + } + if (dirent.inode == src->nn_ino) { + error = EINVAL; + break; + } + if (dirent.inode == rootino) + break; + vput(vp); + if ((error = VFS_VGET(vp->v_mount, dirent.inode, + LK_EXCLUSIVE, &vp)) != 0) { + vp = NULL; + break; + } + } + +out: + if (error == ENOTDIR) + printf("checkpath: .. not a directory\n"); + if (vp != NULL) + vput(vp); + return (error); +} + +static int +nandfs_rename(struct vop_rename_args *ap) +{ + struct vnode *tvp = ap->a_tvp; + struct vnode *tdvp = ap->a_tdvp; + struct vnode *fvp = ap->a_fvp; + struct vnode *fdvp = ap->a_fdvp; + struct componentname *tcnp = ap->a_tcnp; + struct componentname *fcnp = ap->a_fcnp; + int doingdirectory = 0, oldparent = 0, newparent = 0; + int error = 0; + + struct nandfs_node *fdnode, *fnode, *fnode1; + struct nandfs_node *tdnode = VTON(tdvp); + struct nandfs_node *tnode; + + uint32_t tdflags, fflags, fdflags; + uint16_t mode; + + DPRINTF(VNCALL, ("%s: fdvp:%p fvp:%p tdvp:%p tdp:%p\n", __func__, fdvp, + fvp, tdvp, tvp)); + + /* + * Check for cross-device rename. + */ + if ((fvp->v_mount != tdvp->v_mount) || + (tvp && (fvp->v_mount != tvp->v_mount))) { + error = EXDEV; +abortit: + if (tdvp == tvp) + vrele(tdvp); + else + vput(tdvp); + if (tvp) + vput(tvp); + vrele(fdvp); + vrele(fvp); + return (error); + } + + tdflags = tdnode->nn_inode.i_flags; + if (tvp && + ((VTON(tvp)->nn_inode.i_flags & (NOUNLINK | IMMUTABLE | APPEND)) || + (tdflags & APPEND))) { + error = EPERM; + goto abortit; + } + + /* + * Renaming a file to itself has no effect. The upper layers should + * not call us in that case. Temporarily just warn if they do. + */ + if (fvp == tvp) { + printf("nandfs_rename: fvp == tvp (can't happen)\n"); + error = 0; + goto abortit; + } + + if ((error = vn_lock(fvp, LK_EXCLUSIVE)) != 0) + goto abortit; + + fdnode = VTON(fdvp); + fnode = VTON(fvp); + + if (fnode->nn_inode.i_links_count >= LINK_MAX) { + VOP_UNLOCK(fvp, 0); + error = EMLINK; + goto abortit; + } + + fflags = fnode->nn_inode.i_flags; + fdflags = fdnode->nn_inode.i_flags; + + if ((fflags & (NOUNLINK | IMMUTABLE | APPEND)) || + (fdflags & APPEND)) { + VOP_UNLOCK(fvp, 0); + error = EPERM; + goto abortit; + } + + mode = fnode->nn_inode.i_mode; + if ((mode & S_IFMT) == S_IFDIR) { + /* + * Avoid ".", "..", and aliases of "." for obvious reasons. + */ + + if ((fcnp->cn_namelen == 1 && fcnp->cn_nameptr[0] == '.') || + (fdvp == fvp) || + ((fcnp->cn_flags | tcnp->cn_flags) & ISDOTDOT) || + (fnode->nn_flags & IN_RENAME)) { + VOP_UNLOCK(fvp, 0); + error = EINVAL; + goto abortit; + } + fnode->nn_flags |= IN_RENAME; + doingdirectory = 1; + DPRINTF(VNCALL, ("%s: doingdirectory dvp %p\n", __func__, + tdvp)); + oldparent = fdnode->nn_ino; + } + + vrele(fdvp); + + tnode = NULL; + if (tvp) + tnode = VTON(tvp); + + /* + * Bump link count on fvp while we are moving stuff around. If we + * crash before completing the work, the link count may be wrong + * but correctable. + */ + fnode->nn_inode.i_links_count++; + + /* Check for in path moving XXX */ + error = VOP_ACCESS(fvp, VWRITE, tcnp->cn_cred, tcnp->cn_thread); + VOP_UNLOCK(fvp, 0); + if (oldparent != tdnode->nn_ino) + newparent = tdnode->nn_ino; + if (doingdirectory && newparent) { + if (error) /* write access check above */ + goto bad; + if (tnode != NULL) + vput(tvp); + + error = nandfs_checkpath(fnode, tdnode, tcnp->cn_cred); + if (error) + goto out; + + VREF(tdvp); + error = relookup(tdvp, &tvp, tcnp); + if (error) + goto out; + vrele(tdvp); + tdnode = VTON(tdvp); + tnode = NULL; + if (tvp) + tnode = VTON(tvp); + } + + /* + * If the target doesn't exist, link the target to the source and + * unlink the source. Otherwise, rewrite the target directory to + * reference the source and remove the original entry. + */ + + if (tvp == NULL) { + /* + * Account for ".." in new directory. + */ + if (doingdirectory && fdvp != tdvp) + tdnode->nn_inode.i_links_count++; + + DPRINTF(VNCALL, ("%s: new entry in dvp:%p\n", __func__, tdvp)); + /* + * Add name in new directory. + */ + error = nandfs_add_dirent(tdvp, fnode->nn_ino, tcnp->cn_nameptr, + tcnp->cn_namelen, IFTODT(fnode->nn_inode.i_mode)); + if (error) { + if (doingdirectory && fdvp != tdvp) + tdnode->nn_inode.i_links_count--; + goto bad; + } + + vput(tdvp); + } else { + /* + * If the parent directory is "sticky", then the user must + * own the parent directory, or the destination of the rename, + * otherwise the destination may not be changed (except by + * root). This implements append-only directories. + */ + if ((tdnode->nn_inode.i_mode & S_ISTXT) && + tcnp->cn_cred->cr_uid != 0 && + tcnp->cn_cred->cr_uid != tdnode->nn_inode.i_uid && + tnode->nn_inode.i_uid != tcnp->cn_cred->cr_uid) { + error = EPERM; + goto bad; + } + /* + * Target must be empty if a directory and have no links + * to it. Also, ensure source and target are compatible + * (both directories, or both not directories). + */ + mode = tnode->nn_inode.i_mode; + if ((mode & S_IFMT) == S_IFDIR) { + if (!nandfs_dirempty(tvp, tdnode->nn_ino, + tcnp->cn_cred)) { + error = ENOTEMPTY; + goto bad; + } + if (!doingdirectory) { + error = ENOTDIR; + goto bad; + } + /* + * Update name cache since directory is going away. + */ + cache_purge(tdvp); + } else if (doingdirectory) { + error = EISDIR; + goto bad; + } + + DPRINTF(VNCALL, ("%s: update entry dvp:%p\n", __func__, tdvp)); + /* + * Change name tcnp in tdvp to point at fvp. + */ + error = nandfs_update_dirent(tdvp, fnode, tnode); + if (error) + goto bad; + + if (doingdirectory && !newparent) + tdnode->nn_inode.i_links_count--; + + vput(tdvp); + + tnode->nn_inode.i_links_count--; + vput(tvp); + tnode = NULL; + } + + /* + * Unlink the source. + */ + fcnp->cn_flags &= ~MODMASK; + fcnp->cn_flags |= LOCKPARENT | LOCKLEAF; + VREF(fdvp); + error = relookup(fdvp, &fvp, fcnp); + if (error == 0) + vrele(fdvp); + if (fvp != NULL) { + fnode1 = VTON(fvp); + fdnode = VTON(fdvp); + } else { + /* + * From name has disappeared. + */ + if (doingdirectory) + panic("nandfs_rename: lost dir entry"); + vrele(ap->a_fvp); + return (0); + } + + DPRINTF(VNCALL, ("%s: unlink source fnode:%p\n", __func__, fnode)); + + /* + * Ensure that the directory entry still exists and has not + * changed while the new name has been entered. If the source is + * a file then the entry may have been unlinked or renamed. In + * either case there is no further work to be done. If the source + * is a directory then it cannot have been rmdir'ed; its link + * count of three would cause a rmdir to fail with ENOTEMPTY. + * The IN_RENAME flag ensures that it cannot be moved by another + * rename. + */ + if (fnode != fnode1) { + if (doingdirectory) + panic("nandfs: lost dir entry"); + } else { + /* + * If the source is a directory with a + * new parent, the link count of the old + * parent directory must be decremented + * and ".." set to point to the new parent. + */ + if (doingdirectory && newparent) { + DPRINTF(VNCALL, ("%s: new parent %#jx -> %#jx\n", + __func__, (uintmax_t) oldparent, + (uintmax_t) newparent)); + error = nandfs_update_parent_dir(fvp, newparent); + if (!error) { + fdnode->nn_inode.i_links_count--; + fdnode->nn_flags |= IN_CHANGE; + } + } + error = nandfs_remove_dirent(fdvp, fnode, fcnp); + if (!error) { + fnode->nn_inode.i_links_count--; + fnode->nn_flags |= IN_CHANGE; + } + fnode->nn_flags &= ~IN_RENAME; + } + if (fdnode) + vput(fdvp); + if (fnode) + vput(fvp); + vrele(ap->a_fvp); + return (error); + +bad: + DPRINTF(VNCALL, ("%s: error:%d\n", __func__, error)); + if (tnode) + vput(NTOV(tnode)); + vput(NTOV(tdnode)); +out: + if (doingdirectory) + fnode->nn_flags &= ~IN_RENAME; + if (vn_lock(fvp, LK_EXCLUSIVE) == 0) { + fnode->nn_inode.i_links_count--; + fnode->nn_flags |= IN_CHANGE; + fnode->nn_flags &= ~IN_RENAME; + vput(fvp); + } else + vrele(fvp); + return (error); +} + +static int +nandfs_mkdir(struct vop_mkdir_args *ap) +{ + struct vnode *dvp = ap->a_dvp; + struct vnode **vpp = ap->a_vpp; + struct componentname *cnp = ap->a_cnp; + struct nandfs_node *dir_node = VTON(dvp); + struct nandfs_inode *dir_inode = &dir_node->nn_inode; + struct nandfs_node *node; + struct nandfsmount *nmp = dir_node->nn_nmp; + uint16_t mode = MAKEIMODE(ap->a_vap->va_type, ap->a_vap->va_mode); + int error; + + DPRINTF(VNCALL, ("%s: dvp %p\n", __func__, dvp)); + + if (nandfs_fs_full(dir_node->nn_nandfsdev)) + return (ENOSPC); + + if (dir_inode->i_links_count >= LINK_MAX) + return (EMLINK); + + error = nandfs_node_create(nmp, &node, mode); + if (error) + return (error); + + node->nn_inode.i_gid = dir_node->nn_inode.i_gid; + node->nn_inode.i_uid = cnp->cn_cred->cr_uid; + + *vpp = NTOV(node); + + error = nandfs_add_dirent(dvp, node->nn_ino, cnp->cn_nameptr, + cnp->cn_namelen, IFTODT(mode)); + if (error) { + vput(*vpp); + return (error); + } + + dir_node->nn_inode.i_links_count++; + dir_node->nn_flags |= IN_CHANGE; + + error = nandfs_init_dir(NTOV(node), node->nn_ino, dir_node->nn_ino); + if (error) { + vput(NTOV(node)); + return (error); + } + + DPRINTF(VNCALL, ("created dir vp %p nandnode %p ino %jx\n", *vpp, node, + (uintmax_t)node->nn_ino)); + return (0); +} + +static int +nandfs_mknod(struct vop_mknod_args *ap) +{ + struct vnode *dvp = ap->a_dvp; + struct vnode **vpp = ap->a_vpp; + struct vattr *vap = ap->a_vap; + uint16_t mode = MAKEIMODE(vap->va_type, vap->va_mode); + struct componentname *cnp = ap->a_cnp; + struct nandfs_node *dir_node = VTON(dvp); + struct nandfsmount *nmp = dir_node->nn_nmp; + struct nandfs_node *node; + int error; + + if (nandfs_fs_full(dir_node->nn_nandfsdev)) + return (ENOSPC); + + error = nandfs_node_create(nmp, &node, mode); + if (error) + return (error); + node->nn_inode.i_gid = dir_node->nn_inode.i_gid; + node->nn_inode.i_uid = cnp->cn_cred->cr_uid; + if (vap->va_rdev != VNOVAL) + node->nn_inode.i_special = vap->va_rdev; + + *vpp = NTOV(node); + + if (nandfs_add_dirent(dvp, node->nn_ino, cnp->cn_nameptr, + cnp->cn_namelen, IFTODT(mode))) { + vput(*vpp); + return (ENOTDIR); + } + + node->nn_flags |= IN_ACCESS | IN_CHANGE | IN_UPDATE; + + return (0); +} + +static int +nandfs_symlink(struct vop_symlink_args *ap) +{ + struct vnode **vpp = ap->a_vpp; + struct vnode *dvp = ap->a_dvp; + uint16_t mode = MAKEIMODE(ap->a_vap->va_type, ap->a_vap->va_mode); + struct componentname *cnp = ap->a_cnp; + struct nandfs_node *dir_node = VTON(dvp); + struct nandfsmount *nmp = dir_node->nn_nmp; + struct nandfs_node *node; + int len, error; + + if (nandfs_fs_full(dir_node->nn_nandfsdev)) + return (ENOSPC); + + error = nandfs_node_create(nmp, &node, S_IFLNK | mode); + if (error) + return (error); + node->nn_inode.i_gid = dir_node->nn_inode.i_gid; + node->nn_inode.i_uid = cnp->cn_cred->cr_uid; + + *vpp = NTOV(node); + + if (nandfs_add_dirent(dvp, node->nn_ino, cnp->cn_nameptr, + cnp->cn_namelen, IFTODT(mode))) { + vput(*vpp); + return (ENOTDIR); + } + + + len = strlen(ap->a_target); + error = vn_rdwr(UIO_WRITE, *vpp, ap->a_target, len, (off_t)0, + UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK, + cnp->cn_cred, NOCRED, NULL, NULL); + if (error) + vput(*vpp); + + return (error); +} + +static int +nandfs_readlink(struct vop_readlink_args *ap) +{ + struct vnode *vp = ap->a_vp; + + return (VOP_READ(vp, ap->a_uio, 0, ap->a_cred)); +} + +static int +nandfs_rmdir(struct vop_rmdir_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct vnode *dvp = ap->a_dvp; + struct componentname *cnp = ap->a_cnp; + struct nandfs_node *node, *dnode; + uint32_t dflag, flag; + int error = 0; + + node = VTON(vp); + dnode = VTON(dvp); + + /* Files marked as immutable or append-only cannot be deleted. */ + if ((node->nn_inode.i_flags & (IMMUTABLE | APPEND | NOUNLINK)) || + (dnode->nn_inode.i_flags & APPEND)) + return (EPERM); + + DPRINTF(VNCALL, ("%s: dvp %p vp %p nandnode %p ino %#jx\n", __func__, + dvp, vp, node, (uintmax_t)node->nn_ino)); + + if (node->nn_inode.i_links_count < 2) + return (EINVAL); + + if (!nandfs_dirempty(vp, dnode->nn_ino, cnp->cn_cred)) + return (ENOTEMPTY); + + /* Files marked as immutable or append-only cannot be deleted. */ + dflag = dnode->nn_inode.i_flags; + flag = node->nn_inode.i_flags; + if ((dflag & APPEND) || + (flag & (NOUNLINK | IMMUTABLE | APPEND))) { + return (EPERM); + } + + if (vp->v_mountedhere != 0) + return (EINVAL); + + nandfs_remove_dirent(dvp, node, cnp); + dnode->nn_inode.i_links_count -= 1; + dnode->nn_flags |= IN_CHANGE; + + cache_purge(dvp); + + error = nandfs_truncate(vp, (uint64_t)0); + if (error) + return (error); + + node->nn_inode.i_links_count -= 2; + node->nn_flags |= IN_CHANGE; + + cache_purge(vp); + + return (error); +} + +static int +nandfs_fsync(struct vop_fsync_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct nandfs_node *node = VTON(vp); + int locked; + + DPRINTF(VNCALL, ("%s: vp %p nandnode %p ino %#jx\n", __func__, vp, + node, (uintmax_t)node->nn_ino)); + + /* + * Start syncing vnode only if inode was modified or + * there are some dirty buffers + */ + if (VTON(vp)->nn_flags & IN_MODIFIED || + vp->v_bufobj.bo_dirty.bv_cnt) { + locked = VOP_ISLOCKED(vp); + VOP_UNLOCK(vp, 0); + nandfs_wakeup_wait_sync(node->nn_nandfsdev, SYNCER_FSYNC); + VOP_LOCK(vp, locked | LK_RETRY); + } + + return (0); +} + +static int +nandfs_bmap(struct vop_bmap_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct nandfs_node *nnode = VTON(vp); + struct nandfs_device *nandfsdev = nnode->nn_nandfsdev; + nandfs_daddr_t l2vmap, v2pmap; + int error; + int blk2dev = nandfsdev->nd_blocksize / DEV_BSIZE; + + DPRINTF(VNCALL, ("%s: vp %p nandnode %p ino %#jx\n", __func__, vp, + nnode, (uintmax_t)nnode->nn_ino)); + + if (ap->a_bop != NULL) + *ap->a_bop = &nandfsdev->nd_devvp->v_bufobj; + if (ap->a_bnp == NULL) + return (0); + if (ap->a_runp != NULL) + *ap->a_runp = 0; + if (ap->a_runb != NULL) + *ap->a_runb = 0; + + /* + * Translate all the block sectors into a series of buffers to read + * asynchronously from the nandfs device. Note that this lookup may + * induce readin's too. + */ + + /* Get virtual block numbers for the vnode's buffer span */ + error = nandfs_bmap_lookup(nnode, ap->a_bn, &l2vmap); + if (error) + return (-1); + + /* Translate virtual block numbers to physical block numbers */ + error = nandfs_vtop(nnode, l2vmap, &v2pmap); + if (error) + return (-1); + + /* Note virtual block 0 marks not mapped */ + if (l2vmap == 0) + *ap->a_bnp = -1; + else + *ap->a_bnp = v2pmap * blk2dev; /* in DEV_BSIZE */ + + DPRINTF(VNCALL, ("%s: vp %p nandnode %p ino %#jx lblk %jx -> blk %jx\n", + __func__, vp, nnode, (uintmax_t)nnode->nn_ino, (uintmax_t)ap->a_bn, + (uintmax_t)*ap->a_bnp )); + + return (0); +} + +static void +nandfs_force_syncer(struct nandfsmount *nmp) +{ + + nmp->nm_flags |= NANDFS_FORCE_SYNCER; + nandfs_wakeup_wait_sync(nmp->nm_nandfsdev, SYNCER_FFORCE); +} + +static int +nandfs_ioctl(struct vop_ioctl_args *ap) +{ + struct vnode *vp = ap->a_vp; + u_long command = ap->a_command; + caddr_t data = ap->a_data; + struct nandfs_node *node = VTON(vp); + struct nandfs_device *nandfsdev = node->nn_nandfsdev; + struct nandfsmount *nmp = node->nn_nmp; + uint64_t *tab, *cno; + struct nandfs_seg_stat *nss; + struct nandfs_cpmode *ncpm; + struct nandfs_argv *nargv; + struct nandfs_cpstat *ncp; + int error; + + DPRINTF(VNCALL, ("%s: %x\n", __func__, (uint32_t)command)); + + error = priv_check(ap->a_td, PRIV_VFS_MOUNT); + if (error) + return (error); + + if (nmp->nm_ronly) { + switch (command) { + case NANDFS_IOCTL_GET_FSINFO: + case NANDFS_IOCTL_GET_SUSTAT: + case NANDFS_IOCTL_GET_CPINFO: + case NANDFS_IOCTL_GET_CPSTAT: + case NANDFS_IOCTL_GET_SUINFO: + case NANDFS_IOCTL_GET_VINFO: + case NANDFS_IOCTL_GET_BDESCS: + break; + default: + return (EROFS); + } + } + + switch (command) { + case NANDFS_IOCTL_GET_FSINFO: + error = nandfs_get_fsinfo(nmp, (struct nandfs_fsinfo *)data); + break; + case NANDFS_IOCTL_GET_SUSTAT: + nss = (struct nandfs_seg_stat *)data; + error = nandfs_get_seg_stat(nandfsdev, nss); + break; + case NANDFS_IOCTL_CHANGE_CPMODE: + ncpm = (struct nandfs_cpmode *)data; + error = nandfs_chng_cpmode(nandfsdev->nd_cp_node, ncpm); + nandfs_force_syncer(nmp); + break; + case NANDFS_IOCTL_GET_CPINFO: + nargv = (struct nandfs_argv *)data; + error = nandfs_get_cpinfo_ioctl(nandfsdev->nd_cp_node, nargv); + break; + case NANDFS_IOCTL_DELETE_CP: + tab = (uint64_t *)data; + error = nandfs_delete_cp(nandfsdev->nd_cp_node, tab[0], tab[1]); + nandfs_force_syncer(nmp); + break; + case NANDFS_IOCTL_GET_CPSTAT: + ncp = (struct nandfs_cpstat *)data; + error = nandfs_get_cpstat(nandfsdev->nd_cp_node, ncp); + break; + case NANDFS_IOCTL_GET_SUINFO: + nargv = (struct nandfs_argv *)data; + error = nandfs_get_segment_info_ioctl(nandfsdev, nargv); + break; + case NANDFS_IOCTL_GET_VINFO: + nargv = (struct nandfs_argv *)data; + error = nandfs_get_dat_vinfo_ioctl(nandfsdev, nargv); + break; + case NANDFS_IOCTL_GET_BDESCS: + nargv = (struct nandfs_argv *)data; + error = nandfs_get_dat_bdescs_ioctl(nandfsdev, nargv); + break; + case NANDFS_IOCTL_SYNC: + cno = (uint64_t *)data; + nandfs_force_syncer(nmp); + *cno = nandfsdev->nd_last_cno; + error = 0; + break; + case NANDFS_IOCTL_MAKE_SNAP: + cno = (uint64_t *)data; + error = nandfs_make_snap(nandfsdev, cno); + nandfs_force_syncer(nmp); + break; + case NANDFS_IOCTL_DELETE_SNAP: + cno = (uint64_t *)data; + error = nandfs_delete_snap(nandfsdev, *cno); + nandfs_force_syncer(nmp); + break; + default: + error = ENOTTY; + break; + } + + return (error); +} + +/* + * Whiteout vnode call + */ +static int +nandfs_whiteout(struct vop_whiteout_args *ap) +{ + struct vnode *dvp = ap->a_dvp; + struct componentname *cnp = ap->a_cnp; + int error = 0; + + switch (ap->a_flags) { + case LOOKUP: + return (0); + case CREATE: + /* Create a new directory whiteout */ +#ifdef INVARIANTS + if ((cnp->cn_flags & SAVENAME) == 0) + panic("ufs_whiteout: missing name"); +#endif + error = nandfs_add_dirent(dvp, NANDFS_WHT_INO, cnp->cn_nameptr, + cnp->cn_namelen, DT_WHT); + break; + + case DELETE: + /* Remove an existing directory whiteout */ + cnp->cn_flags &= ~DOWHITEOUT; + error = nandfs_remove_dirent(dvp, NULL, cnp); + break; + default: + panic("nandf_whiteout: unknown op: %d", ap->a_flags); + } + + return (error); +} + +static int +nandfs_pathconf(struct vop_pathconf_args *ap) +{ + int error; + + error = 0; + switch (ap->a_name) { + case _PC_LINK_MAX: + *ap->a_retval = LINK_MAX; + break; + case _PC_NAME_MAX: + *ap->a_retval = NAME_MAX; + break; + case _PC_PATH_MAX: + *ap->a_retval = PATH_MAX; + break; + case _PC_PIPE_BUF: + *ap->a_retval = PIPE_BUF; + break; + case _PC_CHOWN_RESTRICTED: + *ap->a_retval = 1; + break; + case _PC_NO_TRUNC: + *ap->a_retval = 1; + break; + case _PC_ACL_EXTENDED: + *ap->a_retval = 0; + break; + case _PC_ALLOC_SIZE_MIN: + *ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_bsize; + break; + case _PC_FILESIZEBITS: + *ap->a_retval = 64; + break; + case _PC_REC_INCR_XFER_SIZE: + *ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_iosize; + break; + case _PC_REC_MAX_XFER_SIZE: + *ap->a_retval = -1; /* means ``unlimited'' */ + break; + case _PC_REC_MIN_XFER_SIZE: + *ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_iosize; + break; + default: + error = EINVAL; + break; + } + return (error); +} + +static int +nandfs_vnlock1(struct vop_lock1_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct nandfs_node *node = VTON(vp); + int error, vi_locked; + + /* + * XXX can vnode go away while we are sleeping? + */ + vi_locked = mtx_owned(&vp->v_interlock); + if (vi_locked) + VI_UNLOCK(vp); + error = NANDFS_WRITELOCKFLAGS(node->nn_nandfsdev, + ap->a_flags & LK_NOWAIT); + if (vi_locked && !error) + VI_LOCK(vp); + if (error) + return (error); + + error = vop_stdlock(ap); + if (error) { + NANDFS_WRITEUNLOCK(node->nn_nandfsdev); + return (error); + } + + return (0); +} + +static int +nandfs_vnunlock(struct vop_unlock_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct nandfs_node *node = VTON(vp); + int error; + + error = vop_stdunlock(ap); + if (error) + return (error); + + NANDFS_WRITEUNLOCK(node->nn_nandfsdev); + + return (0); +} + +/* + * Global vfs data structures + */ +struct vop_vector nandfs_vnodeops = { + .vop_default = &default_vnodeops, + .vop_access = nandfs_access, + .vop_advlock = nandfs_advlock, + .vop_bmap = nandfs_bmap, + .vop_close = nandfs_close, + .vop_create = nandfs_create, + .vop_fsync = nandfs_fsync, + .vop_getattr = nandfs_getattr, + .vop_inactive = nandfs_inactive, + .vop_cachedlookup = nandfs_lookup, + .vop_ioctl = nandfs_ioctl, + .vop_link = nandfs_link, + .vop_lookup = vfs_cache_lookup, + .vop_mkdir = nandfs_mkdir, + .vop_mknod = nandfs_mknod, + .vop_open = nandfs_open, + .vop_pathconf = nandfs_pathconf, + .vop_print = nandfs_print, + .vop_read = nandfs_read, + .vop_readdir = nandfs_readdir, + .vop_readlink = nandfs_readlink, + .vop_reclaim = nandfs_reclaim, + .vop_remove = nandfs_remove, + .vop_rename = nandfs_rename, + .vop_rmdir = nandfs_rmdir, + .vop_whiteout = nandfs_whiteout, + .vop_write = nandfs_write, + .vop_setattr = nandfs_setattr, + .vop_strategy = nandfs_strategy, + .vop_symlink = nandfs_symlink, + .vop_lock1 = nandfs_vnlock1, + .vop_unlock = nandfs_vnunlock, +}; + +struct vop_vector nandfs_system_vnodeops = { + .vop_default = &default_vnodeops, + .vop_close = nandfs_close, + .vop_inactive = nandfs_inactive, + .vop_reclaim = nandfs_reclaim, + .vop_strategy = nandfs_strategy, + .vop_fsync = nandfs_fsync, + .vop_bmap = nandfs_bmap, + .vop_access = VOP_PANIC, + .vop_advlock = VOP_PANIC, + .vop_create = VOP_PANIC, + .vop_getattr = VOP_PANIC, + .vop_cachedlookup = VOP_PANIC, + .vop_ioctl = VOP_PANIC, + .vop_link = VOP_PANIC, + .vop_lookup = VOP_PANIC, + .vop_mkdir = VOP_PANIC, + .vop_mknod = VOP_PANIC, + .vop_open = VOP_PANIC, + .vop_pathconf = VOP_PANIC, + .vop_print = VOP_PANIC, + .vop_read = VOP_PANIC, + .vop_readdir = VOP_PANIC, + .vop_readlink = VOP_PANIC, + .vop_remove = VOP_PANIC, + .vop_rename = VOP_PANIC, + .vop_rmdir = VOP_PANIC, + .vop_whiteout = VOP_PANIC, + .vop_write = VOP_PANIC, + .vop_setattr = VOP_PANIC, + .vop_symlink = VOP_PANIC, +}; + +static int +nandfsfifo_close(struct vop_close_args *ap) +{ + struct vnode *vp = ap->a_vp; + struct nandfs_node *node = VTON(vp); + + DPRINTF(VNCALL, ("%s: vp %p node %p\n", __func__, vp, node)); + + mtx_lock(&vp->v_interlock); + if (vp->v_usecount > 1) + nandfs_itimes_locked(vp); + mtx_unlock(&vp->v_interlock); + + return (fifo_specops.vop_close(ap)); +} + +struct vop_vector nandfs_fifoops = { + .vop_default = &fifo_specops, + .vop_fsync = VOP_PANIC, + .vop_access = nandfs_access, + .vop_close = nandfsfifo_close, + .vop_getattr = nandfs_getattr, + .vop_inactive = nandfs_inactive, + .vop_print = nandfs_print, + .vop_read = VOP_PANIC, + .vop_reclaim = nandfs_reclaim, + .vop_setattr = nandfs_setattr, + .vop_write = VOP_PANIC, + .vop_lock1 = nandfs_vnlock1, + .vop_unlock = nandfs_vnunlock, +}; + +int +nandfs_vinit(struct vnode *vp, uint64_t ino) +{ + struct nandfs_node *node; + + ASSERT_VOP_LOCKED(vp, __func__); + + node = VTON(vp); + + /* Check if we're fetching the root */ + if (ino == NANDFS_ROOT_INO) + vp->v_vflag |= VV_ROOT; + + if (ino != NANDFS_GC_INO) + vp->v_type = IFTOVT(node->nn_inode.i_mode); + else + vp->v_type = VREG; + + if (vp->v_type == VFIFO) + vp->v_op = &nandfs_fifoops; + + return (0); +} diff --git a/sys/fs/nfs/nfs_commonacl.c b/sys/fs/nfs/nfs_commonacl.c index 1d731c55877..886e5821ee2 100644 --- a/sys/fs/nfs/nfs_commonacl.c +++ b/sys/fs/nfs/nfs_commonacl.c @@ -468,9 +468,7 @@ nfsrv_setacl(vnode_t vp, NFSACL_T *aclp, struct ucred *cred, error = NFSERR_ATTRNOTSUPP; goto out; } - error = VOP_ACLCHECK(vp, ACL_TYPE_NFS4, aclp, cred, p); - if (!error) - error = VOP_SETACL(vp, ACL_TYPE_NFS4, aclp, cred, p); + error = VOP_SETACL(vp, ACL_TYPE_NFS4, aclp, cred, p); out: NFSEXITCODE(error); diff --git a/sys/fs/nfsclient/nfs_clbio.c b/sys/fs/nfsclient/nfs_clbio.c index a160d37094c..f7af6fb94c2 100644 --- a/sys/fs/nfsclient/nfs_clbio.c +++ b/sys/fs/nfsclient/nfs_clbio.c @@ -281,7 +281,11 @@ ncl_putpages(struct vop_putpages_args *ap) vp = ap->a_vp; np = VTONFS(vp); td = curthread; /* XXX */ - cred = curthread->td_ucred; /* XXX */ + /* Set the cred to n_writecred for the write rpcs. */ + if (np->n_writecred != NULL) + cred = crhold(np->n_writecred); + else + cred = crhold(curthread->td_ucred); /* XXX */ nmp = VFSTONFS(vp->v_mount); pages = ap->a_m; count = ap->a_count; @@ -345,6 +349,7 @@ ncl_putpages(struct vop_putpages_args *ap) iomode = NFSWRITE_FILESYNC; error = ncl_writerpc(vp, &uio, cred, &iomode, &must_commit, 0); + crfree(cred); pmap_qremove(kva, npages); relpbuf(bp, &ncl_pbuf_freecnt); @@ -717,7 +722,7 @@ ncl_bioread(struct vnode *vp, struct uio *uio, int ioflag, struct ucred *cred) }; if (n > 0) { - error = uiomove(bp->b_data + on, (int)n, uio); + error = vn_io_fault_uiomove(bp->b_data + on, (int)n, uio); } if (vp->v_type == VLNK) n = 0; @@ -892,8 +897,9 @@ ncl_write(struct vop_write_args *ap) struct nfsmount *nmp = VFSTONFS(vp->v_mount); daddr_t lbn; int bcount; - int n, on, error = 0; - off_t tmp_off; + int bp_cached, n, on, error = 0, error1; + size_t orig_resid, local_resid; + off_t orig_size, tmp_off; KASSERT(uio->uio_rw == UIO_WRITE, ("ncl_write mode")); KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread, @@ -945,6 +951,11 @@ flush_and_restart: mtx_unlock(&np->n_mtx); } + orig_resid = uio->uio_resid; + mtx_lock(&np->n_mtx); + orig_size = np->n_size; + mtx_unlock(&np->n_mtx); + /* * If IO_APPEND then load uio_offset. We restart here if we cannot * get the append lock. @@ -1122,7 +1133,10 @@ again: * normally. */ + bp_cached = 1; if (on == 0 && n == bcount) { + if ((bp->b_flags & B_CACHE) == 0) + bp_cached = 0; bp->b_flags |= B_CACHE; bp->b_flags &= ~B_INVAL; bp->b_ioflags &= ~BIO_ERROR; @@ -1173,7 +1187,7 @@ again: * significant cache coherency problems with multiple clients, * especially if locking is implemented later on. * - * as an optimization we could theoretically maintain + * As an optimization we could theoretically maintain * a linked list of discontinuous areas, but we would still * have to commit them separately so there isn't much * advantage to it except perhaps a bit of asynchronization. @@ -1188,7 +1202,23 @@ again: goto again; } - error = uiomove((char *)bp->b_data + on, n, uio); + local_resid = uio->uio_resid; + error = vn_io_fault_uiomove((char *)bp->b_data + on, n, uio); + + if (error != 0 && !bp_cached) { + /* + * This block has no other content then what + * possibly was written by the faulty uiomove. + * Release it, forgetting the data pages, to + * prevent the leak of uninitialized data to + * usermode. + */ + bp->b_ioflags |= BIO_ERROR; + brelse(bp); + uio->uio_offset -= local_resid - uio->uio_resid; + uio->uio_resid = local_resid; + break; + } /* * Since this block is being modified, it must be written @@ -1198,17 +1228,18 @@ again: */ bp->b_flags &= ~(B_NEEDCOMMIT | B_CLUSTEROK); - if (error) { - bp->b_ioflags |= BIO_ERROR; - brelse(bp); - break; - } + /* + * Get the partial update on the progress made from + * uiomove, if an error occured. + */ + if (error != 0) + n = local_resid - uio->uio_resid; /* * Only update dirtyoff/dirtyend if not a degenerate * condition. */ - if (n) { + if (n > 0) { if (bp->b_dirtyend > 0) { bp->b_dirtyoff = min(on, bp->b_dirtyoff); bp->b_dirtyend = max((on + n), bp->b_dirtyend); @@ -1228,17 +1259,34 @@ again: if ((ioflag & IO_SYNC)) { if (ioflag & IO_INVAL) bp->b_flags |= B_NOCACHE; - error = bwrite(bp); - if (error) + error1 = bwrite(bp); + if (error1 != 0) { + if (error == 0) + error = error1; break; + } } else if ((n + on) == biosize) { bp->b_flags |= B_ASYNC; (void) ncl_writebp(bp, 0, NULL); } else { bdwrite(bp); } + + if (error != 0) + break; } while (uio->uio_resid > 0 && n > 0); + if (error != 0) { + if (ioflag & IO_UNIT) { + VATTR_NULL(&vattr); + vattr.va_size = orig_size; + /* IO_SYNC is handled implicitely */ + (void)VOP_SETATTR(vp, &vattr, cred); + uio->uio_offset -= orig_resid - uio->uio_resid; + uio->uio_resid = orig_resid; + } + } + return (error); } diff --git a/sys/fs/nfsclient/nfs_clnode.c b/sys/fs/nfsclient/nfs_clnode.c index 21de25ef289..d7219318bf2 100644 --- a/sys/fs/nfsclient/nfs_clnode.c +++ b/sys/fs/nfsclient/nfs_clnode.c @@ -210,18 +210,28 @@ ncl_inactive(struct vop_inactive_args *ap) struct nfsnode *np; struct sillyrename *sp; struct vnode *vp = ap->a_vp; + boolean_t retv; np = VTONFS(vp); if (NFS_ISV4(vp) && vp->v_type == VREG) { /* * Since mmap()'d files do I/O after VOP_CLOSE(), the NFSv4 - * Close operations are delayed until now. Any dirty buffers - * must be flushed before the close, so that the stateid is - * available for the writes. + * Close operations are delayed until now. Any dirty + * buffers/pages must be flushed before the close, so that the + * stateid is available for the writes. */ - (void) ncl_flush(vp, MNT_WAIT, NULL, ap->a_td, 1, 0); - (void) nfsrpc_close(vp, 1, ap->a_td); + if (vp->v_object != NULL) { + VM_OBJECT_LOCK(vp->v_object); + retv = vm_object_page_clean(vp->v_object, 0, 0, + OBJPC_SYNC); + VM_OBJECT_UNLOCK(vp->v_object); + } else + retv = TRUE; + if (retv == TRUE) { + (void)ncl_flush(vp, MNT_WAIT, NULL, ap->a_td, 1, 0); + (void)nfsrpc_close(vp, 1, ap->a_td); + } } mtx_lock(&np->n_mtx); @@ -257,15 +267,6 @@ ncl_reclaim(struct vop_reclaim_args *ap) struct nfsnode *np = VTONFS(vp); struct nfsdmap *dp, *dp2; - if (NFS_ISV4(vp) && vp->v_type == VREG) - /* - * Since mmap()'d files do I/O after VOP_CLOSE(), the NFSv4 - * Close operations are delayed until ncl_inactive(). - * However, since VOP_INACTIVE() is not guaranteed to be - * called, we need to do it again here. - */ - (void) nfsrpc_close(vp, 1, ap->a_td); - /* * If the NLM is running, give it a chance to abort pending * locks. @@ -278,6 +279,15 @@ ncl_reclaim(struct vop_reclaim_args *ap) */ vnode_destroy_vobject(vp); + if (NFS_ISV4(vp) && vp->v_type == VREG) + /* + * We can now safely close any remaining NFSv4 Opens for + * this file. Most opens will have already been closed by + * ncl_inactive(), but there are cases where it is not + * called, so we need to do it again here. + */ + (void) nfsrpc_close(vp, 1, ap->a_td); + vfs_hash_remove(vp); /* @@ -300,6 +310,8 @@ ncl_reclaim(struct vop_reclaim_args *ap) FREE((caddr_t)dp2, M_NFSDIROFF); } } + if (np->n_writecred != NULL) + crfree(np->n_writecred); FREE((caddr_t)np->n_fhp, M_NFSFH); if (np->n_v4 != NULL) FREE((caddr_t)np->n_v4, M_NFSV4NODE); diff --git a/sys/fs/nfsclient/nfs_clvfsops.c b/sys/fs/nfsclient/nfs_clvfsops.c index af0e33b5ba8..966688f2d4e 100644 --- a/sys/fs/nfsclient/nfs_clvfsops.c +++ b/sys/fs/nfsclient/nfs_clvfsops.c @@ -1136,7 +1136,8 @@ nfs_mount(struct mount *mp) out: if (!error) { MNT_ILOCK(mp); - mp->mnt_kern_flag |= (MNTK_MPSAFE|MNTK_LOOKUP_SHARED); + mp->mnt_kern_flag |= MNTK_MPSAFE | MNTK_LOOKUP_SHARED | + MNTK_NO_IOPF; MNT_IUNLOCK(mp); } return (error); diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c index b8f4c2ce6a0..12e018c7ad3 100644 --- a/sys/fs/nfsclient/nfs_clvnops.c +++ b/sys/fs/nfsclient/nfs_clvnops.c @@ -513,6 +513,7 @@ nfs_open(struct vop_open_args *ap) struct vattr vattr; int error; int fmode = ap->a_mode; + struct ucred *cred; if (vp->v_type != VREG && vp->v_type != VDIR && vp->v_type != VLNK) return (EOPNOTSUPP); @@ -604,7 +605,22 @@ nfs_open(struct vop_open_args *ap) } np->n_directio_opens++; } + + /* + * If this is an open for writing, capture a reference to the + * credentials, so they can be used by ncl_putpages(). Using + * these write credentials is preferable to the credentials of + * whatever thread happens to be doing the VOP_PUTPAGES() since + * the write RPCs are less likely to fail with EACCES. + */ + if ((fmode & FWRITE) != 0) { + cred = np->n_writecred; + np->n_writecred = crhold(ap->a_cred); + } else + cred = NULL; mtx_unlock(&np->n_mtx); + if (cred != NULL) + crfree(cred); vnode_create_vobject(vp, vattr.va_size, ap->a_td); return (0); } @@ -1546,7 +1562,10 @@ again: (void) nfscl_loadattrcache(&dvp, &dnfsva, NULL, NULL, 0, 1); if (!error) { newvp = NFSTOV(np); - if (attrflag) + if (attrflag == 0) + error = nfsrpc_getattr(newvp, cnp->cn_cred, + cnp->cn_thread, &nfsva, NULL); + if (error == 0) error = nfscl_loadattrcache(&newvp, &nfsva, NULL, NULL, 0, 1); } diff --git a/sys/fs/nfsclient/nfsnode.h b/sys/fs/nfsclient/nfsnode.h index f2992c98be5..209945a2d6a 100644 --- a/sys/fs/nfsclient/nfsnode.h +++ b/sys/fs/nfsclient/nfsnode.h @@ -123,6 +123,7 @@ struct nfsnode { int n_directio_asyncwr; u_int64_t n_change; /* old Change attribute */ struct nfsv4node *n_v4; /* extra V4 stuff */ + struct ucred *n_writecred; /* Cred. for putpages */ }; #define n_atim n_un1.nf_atim diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c index 2c0e33d1c26..93c7af50679 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -505,11 +505,10 @@ nfsvno_namei(struct nfsrv_descript *nd, struct nameidata *ndp, out: if (error) { - uma_zfree(namei_zone, cnp->cn_pnbuf); + nfsvno_relpathbuf(ndp); ndp->ni_vp = NULL; ndp->ni_dvp = NULL; ndp->ni_startdir = NULL; - cnp->cn_flags &= ~HASBUF; } else if ((ndp->ni_cnd.cn_flags & (WANTPARENT|LOCKPARENT)) == 0) { ndp->ni_dvp = NULL; } @@ -1047,6 +1046,8 @@ nfsvno_removesub(struct nameidata *ndp, int is_v4, struct ucred *cred, else vput(ndp->ni_dvp); vput(vp); + if ((ndp->ni_cnd.cn_flags & SAVENAME) != 0) + nfsvno_relpathbuf(ndp); NFSEXITCODE(error); return (error); } @@ -1086,6 +1087,8 @@ out: else vput(ndp->ni_dvp); vput(vp); + if ((ndp->ni_cnd.cn_flags & SAVENAME) != 0) + nfsvno_relpathbuf(ndp); NFSEXITCODE(error); return (error); } diff --git a/sys/fs/nfsserver/nfs_nfsdstate.c b/sys/fs/nfsserver/nfs_nfsdstate.c index f44917e34a9..e9962c720cc 100644 --- a/sys/fs/nfsserver/nfs_nfsdstate.c +++ b/sys/fs/nfsserver/nfs_nfsdstate.c @@ -331,11 +331,13 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp, * Must wait until any outstanding callback on the old clp * completes. */ + NFSLOCKSTATE(); while (clp->lc_cbref) { clp->lc_flags |= LCL_WAKEUPWANTED; - (void) tsleep((caddr_t)clp, PZERO - 1, + (void)mtx_sleep(clp, NFSSTATEMUTEXPTR, PZERO - 1, "nfsd clp", 10 * hz); } + NFSUNLOCKSTATE(); nfsrv_zapclient(clp, p); *new_clpp = NULL; goto out; @@ -385,10 +387,13 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp, * Must wait until any outstanding callback on the old clp * completes. */ + NFSLOCKSTATE(); while (clp->lc_cbref) { clp->lc_flags |= LCL_WAKEUPWANTED; - (void) tsleep((caddr_t)clp, PZERO - 1, "nfsd clp", 10 * hz); + (void)mtx_sleep(clp, NFSSTATEMUTEXPTR, PZERO - 1, "nfsd clp", + 10 * hz); } + NFSUNLOCKSTATE(); nfsrv_zapclient(clp, p); *new_clpp = NULL; @@ -3816,11 +3821,9 @@ nfsrv_docallback(struct nfsclient *clp, int procnum, clp->lc_cbref--; if ((clp->lc_flags & LCL_WAKEUPWANTED) && clp->lc_cbref == 0) { clp->lc_flags &= ~LCL_WAKEUPWANTED; - NFSUNLOCKSTATE(); - wakeup((caddr_t)clp); - } else { - NFSUNLOCKSTATE(); + wakeup(clp); } + NFSUNLOCKSTATE(); NFSEXITCODE(error); return (error); diff --git a/sys/fs/ntfs/ntfs.h b/sys/fs/ntfs/ntfs.h index 61127113ede..26e86a952ff 100644 --- a/sys/fs/ntfs/ntfs.h +++ b/sys/fs/ntfs/ntfs.h @@ -30,11 +30,11 @@ /*#define NTFS_DEBUG 1*/ -typedef u_int64_t cn_t; -typedef u_int16_t wchar; +typedef uint64_t cn_t; +typedef uint16_t wchar; #pragma pack(1) -#define BBSIZE 1024 +#define BBSIZE 1024 #define BBOFF ((off_t)(0)) #define BBLOCK 0 #define NTFS_MFTINO 0 @@ -45,157 +45,157 @@ typedef u_int16_t wchar; #define NTFS_BOOTINO 7 #define NTFS_BADCLUSINO 8 #define NTFS_UPCASEINO 10 -#define NTFS_MAXFILENAME 255 +#define NTFS_MAXFILENAME 255 struct fixuphdr { - u_int32_t fh_magic; - u_int16_t fh_foff; - u_int16_t fh_fnum; + uint32_t fh_magic; + uint16_t fh_foff; + uint16_t fh_fnum; }; -#define NTFS_AF_INRUN 0x00000001 +#define NTFS_AF_INRUN 0x00000001 struct attrhdr { - u_int32_t a_type; - u_int32_t reclen; - u_int8_t a_flag; - u_int8_t a_namelen; - u_int8_t a_nameoff; - u_int8_t reserved1; - u_int8_t a_compression; - u_int8_t reserved2; - u_int16_t a_index; + uint32_t a_type; + uint32_t reclen; + uint8_t a_flag; + uint8_t a_namelen; + uint8_t a_nameoff; + uint8_t reserved1; + uint8_t a_compression; + uint8_t reserved2; + uint16_t a_index; }; -#define NTFS_A_STD 0x10 -#define NTFS_A_ATTRLIST 0x20 -#define NTFS_A_NAME 0x30 -#define NTFS_A_VOLUMENAME 0x60 -#define NTFS_A_DATA 0x80 +#define NTFS_A_STD 0x10 +#define NTFS_A_ATTRLIST 0x20 +#define NTFS_A_NAME 0x30 +#define NTFS_A_VOLUMENAME 0x60 +#define NTFS_A_DATA 0x80 #define NTFS_A_INDXROOT 0x90 #define NTFS_A_INDX 0xA0 -#define NTFS_A_INDXBITMAP 0xB0 +#define NTFS_A_INDXBITMAP 0xB0 -#define NTFS_MAXATTRNAME 255 +#define NTFS_MAXATTRNAME 255 struct attr { - struct attrhdr a_hdr; + struct attrhdr a_hdr; union { struct { - u_int16_t a_datalen; - u_int16_t reserved1; - u_int16_t a_dataoff; - u_int16_t a_indexed; - } a_S_r; + uint16_t a_datalen; + uint16_t reserved1; + uint16_t a_dataoff; + uint16_t a_indexed; + } a_S_r; struct { - cn_t a_vcnstart; - cn_t a_vcnend; - u_int16_t a_dataoff; - u_int16_t a_compressalg; - u_int32_t reserved1; - u_int64_t a_allocated; - u_int64_t a_datalen; - u_int64_t a_initialized; - } a_S_nr; - } a_S; + cn_t a_vcnstart; + cn_t a_vcnend; + uint16_t a_dataoff; + uint16_t a_compressalg; + uint32_t reserved1; + uint64_t a_allocated; + uint64_t a_datalen; + uint64_t a_initialized; + } a_S_nr; + } a_S; }; -#define a_r a_S.a_S_r -#define a_nr a_S.a_S_nr +#define a_r a_S.a_S_r +#define a_nr a_S.a_S_nr typedef struct { - u_int64_t t_create; - u_int64_t t_write; - u_int64_t t_mftwrite; - u_int64_t t_access; -} ntfs_times_t; + uint64_t t_create; + uint64_t t_write; + uint64_t t_mftwrite; + uint64_t t_access; +} ntfs_times_t; -#define NTFS_FFLAG_RDONLY 0x01LL -#define NTFS_FFLAG_HIDDEN 0x02LL -#define NTFS_FFLAG_SYSTEM 0x04LL -#define NTFS_FFLAG_ARCHIVE 0x20LL -#define NTFS_FFLAG_COMPRESSED 0x0800LL -#define NTFS_FFLAG_DIR 0x10000000LL +#define NTFS_FFLAG_RDONLY 0x01LL +#define NTFS_FFLAG_HIDDEN 0x02LL +#define NTFS_FFLAG_SYSTEM 0x04LL +#define NTFS_FFLAG_ARCHIVE 0x20LL +#define NTFS_FFLAG_COMPRESSED 0x0800LL +#define NTFS_FFLAG_DIR 0x10000000LL struct attr_name { - u_int32_t n_pnumber; /* Parent ntnode */ - u_int32_t reserved; - ntfs_times_t n_times; - u_int64_t n_size; - u_int64_t n_attrsz; - u_int64_t n_flag; - u_int8_t n_namelen; - u_int8_t n_nametype; - u_int16_t n_name[1]; + uint32_t n_pnumber; /* Parent ntnode */ + uint32_t reserved; + ntfs_times_t n_times; + uint64_t n_size; + uint64_t n_attrsz; + uint64_t n_flag; + uint8_t n_namelen; + uint8_t n_nametype; + uint16_t n_name[1]; }; -#define NTFS_IRFLAG_INDXALLOC 0x00000001 +#define NTFS_IRFLAG_INDXALLOC 0x00000001 struct attr_indexroot { - u_int32_t ir_unkn1; /* always 0x30 */ - u_int32_t ir_unkn2; /* always 0x1 */ - u_int32_t ir_size;/* ??? */ - u_int32_t ir_unkn3; /* number of cluster */ - u_int32_t ir_unkn4; /* always 0x10 */ - u_int32_t ir_datalen; /* sizeof simething */ - u_int32_t ir_allocated; /* same as above */ - u_int16_t ir_flag;/* ?? always 1 */ - u_int16_t ir_unkn7; + uint32_t ir_unkn1; /* always 0x30 */ + uint32_t ir_unkn2; /* always 0x1 */ + uint32_t ir_size;/* ??? */ + uint32_t ir_unkn3; /* number of cluster */ + uint32_t ir_unkn4; /* always 0x10 */ + uint32_t ir_datalen; /* sizeof simething */ + uint32_t ir_allocated; /* same as above */ + uint16_t ir_flag;/* ?? always 1 */ + uint16_t ir_unkn7; }; struct attr_attrlist { - u_int32_t al_type; /* Attribute type */ - u_int16_t reclen; /* length of this entry */ - u_int8_t al_namelen; /* Attribute name len */ - u_int8_t al_nameoff; /* Name offset from entry start */ - u_int64_t al_vcnstart; /* VCN number */ - u_int32_t al_inumber; /* Parent ntnode */ - u_int32_t reserved; - u_int16_t al_index; /* Attribute index in MFT record */ - u_int16_t al_name[1]; /* Name */ + uint32_t al_type; /* Attribute type */ + uint16_t reclen; /* length of this entry */ + uint8_t al_namelen; /* Attribute name len */ + uint8_t al_nameoff; /* Name offset from entry start */ + uint64_t al_vcnstart; /* VCN number */ + uint32_t al_inumber; /* Parent ntnode */ + uint32_t reserved; + uint16_t al_index; /* Attribute index in MFT record */ + uint16_t al_name[1]; /* Name */ }; -#define NTFS_INDXMAGIC (u_int32_t)(0x58444E49) +#define NTFS_INDXMAGIC (uint32_t)(0x58444E49) struct attr_indexalloc { struct fixuphdr ia_fixup; - u_int64_t unknown1; - cn_t ia_bufcn; - u_int16_t ia_hdrsize; - u_int16_t unknown2; - u_int32_t ia_inuse; - u_int32_t ia_allocated; + uint64_t unknown1; + cn_t ia_bufcn; + uint16_t ia_hdrsize; + uint16_t unknown2; + uint32_t ia_inuse; + uint32_t ia_allocated; }; #define NTFS_IEFLAG_SUBNODE 0x00000001 #define NTFS_IEFLAG_LAST 0x00000002 struct attr_indexentry { - u_int32_t ie_number; - u_int32_t unknown1; - u_int16_t reclen; - u_int16_t ie_size; - u_int32_t ie_flag;/* 1 - has subnodes, 2 - last */ - u_int32_t ie_fpnumber; - u_int32_t unknown2; - ntfs_times_t ie_ftimes; - u_int64_t ie_fallocated; - u_int64_t ie_fsize; - u_int64_t ie_fflag; - u_int8_t ie_fnamelen; - u_int8_t ie_fnametype; - wchar ie_fname[NTFS_MAXFILENAME]; + uint32_t ie_number; + uint32_t unknown1; + uint16_t reclen; + uint16_t ie_size; + uint32_t ie_flag; /* 1 - has subnodes, 2 - last */ + uint32_t ie_fpnumber; + uint32_t unknown2; + ntfs_times_t ie_ftimes; + uint64_t ie_fallocated; + uint64_t ie_fsize; + uint64_t ie_fflag; + uint8_t ie_fnamelen; + uint8_t ie_fnametype; + wchar ie_fname[NTFS_MAXFILENAME]; /* cn_t ie_bufcn; buffer with subnodes */ }; -#define NTFS_FILEMAGIC (u_int32_t)(0x454C4946) +#define NTFS_FILEMAGIC (uint32_t)(0x454C4946) #define NTFS_BLOCK_SIZE 512 #define NTFS_FRFLAG_DIR 0x0002 struct filerec { - struct fixuphdr fr_fixup; - u_int8_t reserved[8]; - u_int16_t fr_seqnum; /* Sequence number */ - u_int16_t fr_nlink; - u_int16_t fr_attroff; /* offset to attributes */ - u_int16_t fr_flags; /* 1-nonresident attr, 2-directory */ - u_int32_t fr_size;/* hdr + attributes */ - u_int32_t fr_allocated; /* allocated length of record */ - u_int64_t fr_mainrec; /* main record */ - u_int16_t fr_attrnum; /* maximum attr number + 1 ??? */ + struct fixuphdr fr_fixup; + uint8_t reserved[8]; + uint16_t fr_seqnum; /* Sequence number */ + uint16_t fr_nlink; + uint16_t fr_attroff; /* offset to attributes */ + uint16_t fr_flags; /* 1-nonresident attr, 2-directory */ + uint32_t fr_size;/* hdr + attributes */ + uint32_t fr_allocated; /* allocated length of record */ + uint64_t fr_mainrec; /* main record */ + uint16_t fr_attrnum; /* maximum attr number + 1 ??? */ }; #define NTFS_ATTRNAME_MAXLEN 0x40 @@ -203,66 +203,66 @@ struct filerec { #define NTFS_ADFLAG_INDEX 0x0002 /* Attrib can be indexed */ struct attrdef { wchar ad_name[NTFS_ATTRNAME_MAXLEN]; - u_int32_t ad_type; - u_int32_t reserved1[2]; - u_int32_t ad_flag; - u_int64_t ad_minlen; - u_int64_t ad_maxlen; /* -1 for nonlimited */ + uint32_t ad_type; + uint32_t reserved1[2]; + uint32_t ad_flag; + uint64_t ad_minlen; + uint64_t ad_maxlen; /* -1 for nonlimited */ }; struct ntvattrdef { char ad_name[0x40]; int ad_namelen; - u_int32_t ad_type; + uint32_t ad_type; }; #define NTFS_BBID "NTFS " #define NTFS_BBIDLEN 8 struct bootfile { - u_int8_t reserved1[3]; /* asm jmp near ... */ - u_int8_t bf_sysid[8]; /* 'NTFS ' */ - u_int16_t bf_bps; /* bytes per sector */ - u_int8_t bf_spc; /* sectors per cluster */ - u_int8_t reserved2[7]; /* unused (zeroed) */ - u_int8_t bf_media; /* media desc. (0xF8) */ - u_int8_t reserved3[2]; - u_int16_t bf_spt; /* sectors per track */ - u_int16_t bf_heads; /* number of heads */ - u_int8_t reserver4[12]; - u_int64_t bf_spv; /* sectors per volume */ - cn_t bf_mftcn; /* $MFT cluster number */ - cn_t bf_mftmirrcn; /* $MFTMirr cn */ - u_int8_t bf_mftrecsz; /* MFT record size (clust) */ + uint8_t reserved1[3]; /* asm jmp near ... */ + uint8_t bf_sysid[8]; /* 'NTFS ' */ + uint16_t bf_bps; /* bytes per sector */ + uint8_t bf_spc; /* sectors per cluster */ + uint8_t reserved2[7]; /* unused (zeroed) */ + uint8_t bf_media; /* media desc. (0xF8) */ + uint8_t reserved3[2]; + uint16_t bf_spt; /* sectors per track */ + uint16_t bf_heads; /* number of heads */ + uint8_t reserver4[12]; + uint64_t bf_spv; /* sectors per volume */ + cn_t bf_mftcn; /* $MFT cluster number */ + cn_t bf_mftmirrcn; /* $MFTMirr cn */ + uint8_t bf_mftrecsz; /* MFT record size (clust) */ /* 0xF6 inducates 1/4 */ - u_int32_t bf_ibsz; /* index buffer size */ - u_int32_t bf_volsn; /* volume ser. num. */ + uint32_t bf_ibsz; /* index buffer size */ + uint32_t bf_volsn; /* volume ser. num. */ }; #define NTFS_SYSNODESNUM 0x0B struct ntfsmount { struct mount *ntm_mountp; /* filesystem vfs structure */ - struct bootfile ntm_bootfile; + struct bootfile ntm_bootfile; struct g_consumer *ntm_cp; struct bufobj *ntm_bo; struct vnode *ntm_devvp; /* block device mounted vnode */ struct vnode *ntm_sysvn[NTFS_SYSNODESNUM]; - u_int32_t ntm_bpmftrec; - uid_t ntm_uid; - gid_t ntm_gid; - mode_t ntm_mode; + uint32_t ntm_bpmftrec; + uid_t ntm_uid; + gid_t ntm_gid; + mode_t ntm_mode; uint64_t ntm_flag; cn_t ntm_cfree; struct ntvattrdef *ntm_ad; int ntm_adnum; - wchar * ntm_82u; /* 8bit to Unicode */ - char ** ntm_u28; /* Unicode to 8 bit */ + wchar * ntm_82u; /* 8bit to Unicode */ + char ** ntm_u28; /* Unicode to 8 bit */ void * ntm_ic_l2u; /* Local to Unicode (iconv) */ void * ntm_ic_u2l; /* Unicode to Local (iconv) */ - u_int8_t ntm_multiplier; /* NTFS blockno to DEV_BSIZE sectorno */ + uint8_t ntm_multiplier; /* NTFS blockno to DEV_BSIZE sectorno */ }; -#define ntm_mftcn ntm_bootfile.bf_mftcn -#define ntm_mftmirrcn ntm_bootfile.bf_mftmirrcn +#define ntm_mftcn ntm_bootfile.bf_mftcn +#define ntm_mftmirrcn ntm_bootfile.bf_mftmirrcn #define ntm_mftrecsz ntm_bootfile.bf_mftrecsz #define ntm_spc ntm_bootfile.bf_spc #define ntm_bps ntm_bootfile.bf_bps @@ -272,17 +272,17 @@ struct ntfsmount { #define NTFS_NEXTREC(s, type) ((type)(((caddr_t) s) + (s)->reclen)) /* Convert mount ptr to ntfsmount ptr. */ -#define VFSTONTFS(mp) ((struct ntfsmount *)((mp)->mnt_data)) -#define VTONT(v) FTONT(VTOF(v)) +#define VFSTONTFS(mp) ((struct ntfsmount *)((mp)->mnt_data)) +#define VTONT(v) FTONT(VTOF(v)) #define VTOF(v) ((struct fnode *)((v)->v_data)) #define FTOV(f) ((f)->f_vp) #define FTONT(f) ((f)->f_ip) -#define ntfs_cntobn(cn) (daddr_t)((cn) * (ntmp->ntm_spc)) -#define ntfs_cntob(cn) (off_t)((cn) * (ntmp)->ntm_spc * (ntmp)->ntm_bps) -#define ntfs_btocn(off) (cn_t)((off) / ((ntmp)->ntm_spc * (ntmp)->ntm_bps)) -#define ntfs_btocl(off) (cn_t)((off + ntfs_cntob(1) - 1) / ((ntmp)->ntm_spc * (ntmp)->ntm_bps)) -#define ntfs_btocnoff(off) (off_t)((off) % ((ntmp)->ntm_spc * (ntmp)->ntm_bps)) -#define ntfs_bntob(bn) (daddr_t)((bn) * (ntmp)->ntm_bps) +#define ntfs_cntobn(cn) (daddr_t)((cn) * (ntmp->ntm_spc)) +#define ntfs_cntob(cn) (off_t)((cn) * (ntmp)->ntm_spc * (ntmp)->ntm_bps) +#define ntfs_btocn(off) (cn_t)((off) / ((ntmp)->ntm_spc * (ntmp)->ntm_bps)) +#define ntfs_btocl(off) (cn_t)((off + ntfs_cntob(1) - 1) / ((ntmp)->ntm_spc * (ntmp)->ntm_bps)) +#define ntfs_btocnoff(off) (off_t)((off) % ((ntmp)->ntm_spc * (ntmp)->ntm_bps)) +#define ntfs_bntob(bn) (daddr_t)((bn) * (ntmp)->ntm_bps) #define ntfs_bpbl (daddr_t)((ntmp)->ntm_bps) @@ -294,15 +294,15 @@ MALLOC_DECLARE(M_NTFSNTHASH); #endif #if defined(NTFS_DEBUG) -#define dprintf(a) printf a +#define dprintf(a) printf a #if NTFS_DEBUG > 1 -#define ddprintf(a) printf a +#define ddprintf(a) printf a #else -#define ddprintf(a) (void)0 +#define ddprintf(a) (void)0 #endif #else -#define dprintf(a) (void)0 -#define ddprintf(a) (void)0 +#define dprintf(a) (void)0 +#define ddprintf(a) (void)0 #endif extern struct vop_vector ntfs_vnodeops; diff --git a/sys/fs/ntfs/ntfs_subr.c b/sys/fs/ntfs/ntfs_subr.c index 9d81f71f342..f3ac64665d4 100644 --- a/sys/fs/ntfs/ntfs_subr.c +++ b/sys/fs/ntfs/ntfs_subr.c @@ -1352,174 +1352,6 @@ ntfs_filesize( return (0); } -/* - * This is one of write routine. - */ -int -ntfs_writeattr_plain( - struct ntfsmount * ntmp, - struct ntnode * ip, - u_int32_t attrnum, - char *attrname, - off_t roff, - size_t rsize, - void *rdata, - size_t * initp, - struct uio *uio) -{ - size_t init; - int error = 0; - off_t off = roff, left = rsize, towrite; - caddr_t data = rdata; - struct ntvattr *vap; - *initp = 0; - - while (left) { - error = ntfs_ntvattrget(ntmp, ip, attrnum, attrname, - ntfs_btocn(off), &vap); - if (error) - return (error); - towrite = MIN(left, ntfs_cntob(vap->va_vcnend + 1) - off); - ddprintf(("ntfs_writeattr_plain: o: %d, s: %d (%d - %d)\n", - (u_int32_t) off, (u_int32_t) towrite, - (u_int32_t) vap->va_vcnstart, - (u_int32_t) vap->va_vcnend)); - error = ntfs_writentvattr_plain(ntmp, ip, vap, - off - ntfs_cntob(vap->va_vcnstart), - towrite, data, &init, uio); - if (error) { - printf("ntfs_writeattr_plain: " \ - "ntfs_writentvattr_plain failed: o: %d, s: %d\n", - (u_int32_t) off, (u_int32_t) towrite); - printf("ntfs_writeattr_plain: attrib: %d - %d\n", - (u_int32_t) vap->va_vcnstart, - (u_int32_t) vap->va_vcnend); - ntfs_ntvattrrele(vap); - break; - } - ntfs_ntvattrrele(vap); - left -= towrite; - off += towrite; - data = data + towrite; - *initp += init; - } - - return (error); -} - -/* - * This is one of write routine. - * - * ntnode should be locked. - */ -int -ntfs_writentvattr_plain( - struct ntfsmount * ntmp, - struct ntnode * ip, - struct ntvattr * vap, - off_t roff, - size_t rsize, - void *rdata, - size_t * initp, - struct uio *uio) -{ - int error = 0; - off_t off; - int cnt; - cn_t ccn, ccl, cn, left, cl; - caddr_t data = rdata; - struct buf *bp; - size_t tocopy; - - *initp = 0; - - if ((vap->va_flag & NTFS_AF_INRUN) == 0) { - printf("ntfs_writevattr_plain: CAN'T WRITE RES. ATTRIBUTE\n"); - return ENOTTY; - } - - ddprintf(("ntfs_writentvattr_plain: data in run: %ld chains\n", - vap->va_vruncnt)); - - off = roff; - left = rsize; - ccl = 0; - ccn = 0; - cnt = 0; - for (; left && (cnt < vap->va_vruncnt); cnt++) { - ccn = vap->va_vruncn[cnt]; - ccl = vap->va_vruncl[cnt]; - - ddprintf(("ntfs_writentvattr_plain: " \ - "left %d, cn: 0x%x, cl: %d, off: %d\n", \ - (u_int32_t) left, (u_int32_t) ccn, \ - (u_int32_t) ccl, (u_int32_t) off)); - - if (ntfs_cntob(ccl) < off) { - off -= ntfs_cntob(ccl); - cnt++; - continue; - } - if (!ccn && ip->i_number != NTFS_BOOTINO) - continue; /* XXX */ - - ccl -= ntfs_btocn(off); - cn = ccn + ntfs_btocn(off); - off = ntfs_btocnoff(off); - - while (left && ccl) { - /* - * Always read and write single clusters at a time - - * we need to avoid requesting differently-sized - * blocks at the same disk offsets to avoid - * confusing the buffer cache. - */ - tocopy = MIN(left, ntfs_cntob(1) - off); - cl = ntfs_btocl(tocopy + off); - KASSERT(cl == 1 && tocopy <= ntfs_cntob(1), - ("single cluster limit mistake")); - ddprintf(("ntfs_writentvattr_plain: write: " \ - "cn: 0x%x cl: %d, off: %d len: %d, left: %d\n", - (u_int32_t) cn, (u_int32_t) cl, - (u_int32_t) off, (u_int32_t) tocopy, - (u_int32_t) left)); - if ((off == 0) && (tocopy == ntfs_cntob(cl))) - { - bp = getblk(ntmp->ntm_devvp, ntfs_cntobn(cn) - * ntmp->ntm_multiplier, - ntfs_cntob(cl), 0, 0, 0); - clrbuf(bp); - } else { - error = bread(ntmp->ntm_devvp, ntfs_cntobn(cn) - * ntmp->ntm_multiplier, - ntfs_cntob(cl), NOCRED, &bp); - if (error) { - brelse(bp); - return (error); - } - } - if (uio) - uiomove(bp->b_data + off, tocopy, uio); - else - memcpy(bp->b_data + off, data, tocopy); - bawrite(bp); - data = data + tocopy; - *initp += tocopy; - off = 0; - left -= tocopy; - cn += cl; - ccl -= cl; - } - } - - if (left) { - printf("ntfs_writentvattr_plain: POSSIBLE RUN ERROR\n"); - error = EINVAL; - } - - return (error); -} - /* * This is one of read routines. * diff --git a/sys/fs/ntfs/ntfs_subr.h b/sys/fs/ntfs/ntfs_subr.h index ce46986f213..9ccbb420643 100644 --- a/sys/fs/ntfs/ntfs_subr.h +++ b/sys/fs/ntfs/ntfs_subr.h @@ -99,8 +99,6 @@ void ntfs_ntref(struct ntnode *); void ntfs_ntrele(struct ntnode *); void ntfs_ntput(struct ntnode *); int ntfs_loadntnode( struct ntfsmount *, struct ntnode * ); -int ntfs_writentvattr_plain(struct ntfsmount *, struct ntnode *, struct ntvattr *, off_t, size_t, void *, size_t *, struct uio *); -int ntfs_writeattr_plain(struct ntfsmount *, struct ntnode *, u_int32_t, char *, off_t, size_t, void *, size_t *, struct uio *); void ntfs_toupper_init(void); void ntfs_toupper_destroy(void); int ntfs_toupper_use(struct mount *, struct ntfsmount *); diff --git a/sys/fs/ntfs/ntfs_vfsops.c b/sys/fs/ntfs/ntfs_vfsops.c index 20061cc9bef..d664f2c9b37 100644 --- a/sys/fs/ntfs/ntfs_vfsops.c +++ b/sys/fs/ntfs/ntfs_vfsops.c @@ -152,7 +152,6 @@ static int ntfs_mount(struct mount *mp) { int err = 0, error; - accmode_t accmode; struct vnode *devvp; struct nameidata ndp; struct thread *td; @@ -162,6 +161,11 @@ ntfs_mount(struct mount *mp) if (vfs_filteropt(mp->mnt_optnew, ntfs_opts)) return (EINVAL); + /* Force mount as read-only. */ + MNT_ILOCK(mp); + mp->mnt_flag |= MNT_RDONLY; + MNT_IUNLOCK(mp); + from = vfs_getopts(mp->mnt_optnew, "from", &error); if (error) return (error); @@ -173,11 +177,10 @@ ntfs_mount(struct mount *mp) if (mp->mnt_flag & MNT_UPDATE) { if (vfs_flagopt(mp->mnt_optnew, "export", NULL, 0)) { /* Process export requests in vfs_mount.c */ - goto success; + return (0); } else { printf("ntfs_mount(): MNT_UPDATE not supported\n"); - err = EINVAL; - goto error_1; + return (EINVAL); } } @@ -187,10 +190,8 @@ ntfs_mount(struct mount *mp) */ NDINIT(&ndp, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, from, td); err = namei(&ndp); - if (err) { - /* can't get devvp!*/ - goto error_1; - } + if (err) + return (err); NDFREE(&ndp, NDF_ONLY_PNBUF); devvp = ndp.ni_vp; @@ -203,10 +204,7 @@ ntfs_mount(struct mount *mp) * If mount by non-root, then verify that user has necessary * permissions on the device. */ - accmode = VREAD; - if ((mp->mnt_flag & MNT_RDONLY) == 0) - accmode |= VWRITE; - err = VOP_ACCESS(devvp, accmode, td->td_ucred, td); + err = VOP_ACCESS(devvp, VREAD, td->td_ucred, td); if (err) err = priv_check(td, PRIV_VFS_MOUNT_PERM); if (err) { @@ -214,52 +212,23 @@ ntfs_mount(struct mount *mp) return (err); } - if (mp->mnt_flag & MNT_UPDATE) { -#if 0 - /* - ******************** - * UPDATE - ******************** - */ - if (devvp != ntmp->um_devvp) - err = EINVAL; /* needs translation */ - vput(devvp); - if (err) - return (err); -#endif - } else { - /* - ******************** - * NEW MOUNT - ******************** - */ + /* + * Since this is a new mount, we want the names for the device and + * the mount point copied in. If an error occurs, the mountpoint is + * discarded by the upper level code. Note that vfs_mount() handles + * copying the mountpoint f_mntonname for us, so we don't have to do + * it here unless we want to set it to something other than "path" + * for some rason. + */ - /* - * Since this is a new mount, we want the names for - * the device and the mount point copied in. If an - * error occurs, the mountpoint is discarded by the - * upper level code. Note that vfs_mount() handles - * copying the mountpoint f_mntonname for us, so we - * don't have to do it here unless we want to set it - * to something other than "path" for some rason. - */ - /* Save "mounted from" info for mount point (NULL pad)*/ + err = ntfs_mountfs(devvp, mp, td); + if (err == 0) { + + /* Save "mounted from" info for mount point. */ vfs_mountedfrom(mp, from); - - err = ntfs_mountfs(devvp, mp, td); - } - if (err) { + } else vrele(devvp); - return (err); - } - - goto success; - -error_1: /* no state to back out*/ - /* XXX: missing NDFREE(&ndp, ...) */ - -success: return (err); } @@ -275,13 +244,12 @@ ntfs_mountfs(devvp, mp, td) struct buf *bp; struct ntfsmount *ntmp; struct cdev *dev = devvp->v_rdev; - int error, ronly, i, v; + int error, i, v; struct vnode *vp; struct g_consumer *cp; struct g_provider *pp; char *cs_ntfs, *cs_local; - ronly = (mp->mnt_flag & MNT_RDONLY) != 0; DROP_GIANT(); g_topology_lock(); @@ -296,7 +264,7 @@ ntfs_mountfs(devvp, mp, td) if ((pp != NULL) && ((pp->acr | pp->acw | pp->ace ) != 0)) error = EPERM; else - error = g_vfs_open(devvp, &cp, "ntfs", ronly ? 0 : 1); + error = g_vfs_open(devvp, &cp, "ntfs", 0); g_topology_unlock(); PICKUP_GIANT(); diff --git a/sys/fs/ntfs/ntfs_vnops.c b/sys/fs/ntfs/ntfs_vnops.c index 76776a14c01..edcf137d8f8 100644 --- a/sys/fs/ntfs/ntfs_vnops.c +++ b/sys/fs/ntfs/ntfs_vnops.c @@ -67,7 +67,6 @@ #include /* for pathconf(2) constants */ static vop_read_t ntfs_read; -static vop_write_t ntfs_write; static vop_getattr_t ntfs_getattr; static vop_inactive_t ntfs_inactive; static vop_reclaim_t ntfs_reclaim; @@ -78,7 +77,6 @@ static vop_open_t ntfs_open; static vop_close_t ntfs_close; static vop_readdir_t ntfs_readdir; static vop_cachedlookup_t ntfs_lookup; -static vop_fsync_t ntfs_fsync; static vop_pathconf_t ntfs_pathconf; static vop_vptofh_t ntfs_vptofh; @@ -272,6 +270,7 @@ ntfs_strategy(ap) register struct fnode *fp = VTOF(vp); register struct ntnode *ip = FTONT(fp); struct ntfsmount *ntmp = ip->i_mp; + u_int32_t toread; int error; dprintf(("ntfs_strategy: offset: %d, blkno: %d, lblkno: %d\n", @@ -281,99 +280,33 @@ ntfs_strategy(ap) dprintf(("strategy: bcount: %d flags: 0x%x\n", (u_int32_t)bp->b_bcount,bp->b_flags)); - if (bp->b_iocmd == BIO_READ) { - u_int32_t toread; + KASSERT(bp->b_iocmd == BIO_READ, ("Invalid buffer\n")); - if (ntfs_cntob(bp->b_blkno) >= fp->f_size) { - clrbuf(bp); - error = 0; - } else { - toread = MIN(bp->b_bcount, - fp->f_size-ntfs_cntob(bp->b_blkno)); - dprintf(("ntfs_strategy: toread: %d, fsize: %d\n", - toread,(u_int32_t)fp->f_size)); - - error = ntfs_readattr(ntmp, ip, fp->f_attrtype, - fp->f_attrname, ntfs_cntob(bp->b_blkno), - toread, bp->b_data, NULL); - - if (error) { - printf("ntfs_strategy: ntfs_readattr failed\n"); - bp->b_error = error; - bp->b_ioflags |= BIO_ERROR; - } - - bzero(bp->b_data + toread, bp->b_bcount - toread); - } + if (ntfs_cntob(bp->b_blkno) >= fp->f_size) { + clrbuf(bp); + error = 0; } else { - size_t tmp; - u_int32_t towrite; + toread = MIN(bp->b_bcount, + fp->f_size-ntfs_cntob(bp->b_blkno)); + dprintf(("ntfs_strategy: toread: %d, fsize: %d\n", + toread,(u_int32_t)fp->f_size)); - if (ntfs_cntob(bp->b_blkno) + bp->b_bcount >= fp->f_size) { - printf("ntfs_strategy: CAN'T EXTEND FILE\n"); - bp->b_error = error = EFBIG; + error = ntfs_readattr(ntmp, ip, fp->f_attrtype, + fp->f_attrname, ntfs_cntob(bp->b_blkno), + toread, bp->b_data, NULL); + + if (error) { + printf("ntfs_strategy: ntfs_readattr failed\n"); + bp->b_error = error; bp->b_ioflags |= BIO_ERROR; - } else { - towrite = MIN(bp->b_bcount, - fp->f_size-ntfs_cntob(bp->b_blkno)); - dprintf(("ntfs_strategy: towrite: %d, fsize: %d\n", - towrite,(u_int32_t)fp->f_size)); - - error = ntfs_writeattr_plain(ntmp, ip, fp->f_attrtype, - fp->f_attrname, ntfs_cntob(bp->b_blkno),towrite, - bp->b_data, &tmp, NULL); - - if (error) { - printf("ntfs_strategy: ntfs_writeattr fail\n"); - bp->b_error = error; - bp->b_ioflags |= BIO_ERROR; - } } + + bzero(bp->b_data + toread, bp->b_bcount - toread); } bufdone(bp); return (0); } -static int -ntfs_write(ap) - struct vop_write_args /* { - struct vnode *a_vp; - struct uio *a_uio; - int a_ioflag; - struct ucred *a_cred; - } */ *ap; -{ - register struct vnode *vp = ap->a_vp; - register struct fnode *fp = VTOF(vp); - register struct ntnode *ip = FTONT(fp); - struct uio *uio = ap->a_uio; - struct ntfsmount *ntmp = ip->i_mp; - u_int64_t towrite; - size_t written; - int error; - - dprintf(("ntfs_write: ino: %d, off: %d resid: %d, segflg: %d\n",ip->i_number,(u_int32_t)uio->uio_offset,uio->uio_resid,uio->uio_segflg)); - dprintf(("ntfs_write: filesize: %d",(u_int32_t)fp->f_size)); - - if (uio->uio_resid + uio->uio_offset > fp->f_size) { - printf("ntfs_write: CAN'T WRITE BEYOND END OF FILE\n"); - return (EFBIG); - } - - towrite = MIN(uio->uio_resid, fp->f_size - uio->uio_offset); - - dprintf((", towrite: %d\n",(u_int32_t)towrite)); - - error = ntfs_writeattr_plain(ntmp, ip, fp->f_attrtype, - fp->f_attrname, uio->uio_offset, towrite, NULL, &written, uio); -#ifdef NTFS_DEBUG - if (error) - printf("ntfs_write: ntfs_writeattr failed: %d\n", error); -#endif - - return (error); -} - int ntfs_access(ap) struct vop_access_args /* { @@ -390,7 +323,7 @@ ntfs_access(ap) dprintf(("ntfs_access: %d\n",ip->i_number)); /* - * Disallow write attempts on read-only filesystems; + * Disallow write attempts as we assume read-only filesystems; * unless the file is a socket, fifo, or a block or * character device resident on the filesystem. */ @@ -399,8 +332,8 @@ ntfs_access(ap) case VDIR: case VLNK: case VREG: - if (vp->v_mount->mnt_flag & MNT_RDONLY) - return (EROFS); + return (EROFS); + default: break; } } @@ -493,8 +426,13 @@ ntfs_readdir(ap) /* Simulate . in every dir except ROOT */ if( ip->i_number != NTFS_ROOTINO ) { - struct dirent dot = { NTFS_ROOTINO, - sizeof(struct dirent), DT_DIR, 1, "." }; + struct dirent dot = { + .d_fileno = NTFS_ROOTINO, + .d_reclen = sizeof(struct dirent), + .d_type = DT_DIR, + .d_namlen = 1, + .d_name = "." + }; if( uio->uio_offset < sizeof(struct dirent) ) { dot.d_fileno = ip->i_number; @@ -508,8 +446,13 @@ ntfs_readdir(ap) /* Simulate .. in every dir including ROOT */ if( uio->uio_offset < 2 * sizeof(struct dirent) ) { - struct dirent dotdot = { NTFS_ROOTINO, - sizeof(struct dirent), DT_DIR, 2, ".." }; + struct dirent dotdot = { + .d_fileno = NTFS_ROOTINO, + .d_reclen = sizeof(struct dirent), + .d_type = DT_DIR, + .d_namlen = 2, + .d_name = ".." + }; error = uiomove((char *)&dotdot,sizeof(struct dirent),uio); if(error) @@ -620,7 +563,6 @@ ntfs_lookup(ap) return (error); if ((cnp->cn_flags & ISLASTCN) && - (dvp->v_mount->mnt_flag & MNT_RDONLY) && (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) return (EROFS); @@ -668,24 +610,6 @@ ntfs_lookup(ap) return (error); } -/* - * Flush the blocks of a file to disk. - * - * This function is worthless for vnodes that represent directories. Maybe we - * could just do a sync if they try an fsync on a directory file. - */ -static int -ntfs_fsync(ap) - struct vop_fsync_args /* { - struct vnode *a_vp; - struct ucred *a_cred; - int a_waitfor; - struct thread *a_td; - } */ *ap; -{ - return (0); -} - /* * Return POSIX pathconf information applicable to NTFS filesystem */ @@ -746,7 +670,6 @@ struct vop_vector ntfs_vnodeops = { .vop_bmap = ntfs_bmap, .vop_cachedlookup = ntfs_lookup, .vop_close = ntfs_close, - .vop_fsync = ntfs_fsync, .vop_getattr = ntfs_getattr, .vop_inactive = ntfs_inactive, .vop_lookup = vfs_cache_lookup, @@ -756,6 +679,5 @@ struct vop_vector ntfs_vnodeops = { .vop_readdir = ntfs_readdir, .vop_reclaim = ntfs_reclaim, .vop_strategy = ntfs_strategy, - .vop_write = ntfs_write, .vop_vptofh = ntfs_vptofh, }; diff --git a/sys/fs/unionfs/union_subr.c b/sys/fs/unionfs/union_subr.c index 074958cc373..528271cda4d 100644 --- a/sys/fs/unionfs/union_subr.c +++ b/sys/fs/unionfs/union_subr.c @@ -2,8 +2,8 @@ * Copyright (c) 1994 Jan-Simon Pendry * Copyright (c) 1994 * The Regents of the University of California. All rights reserved. - * Copyright (c) 2005, 2006 Masanori Ozawa , ONGS Inc. - * Copyright (c) 2006 Daichi Goto + * Copyright (c) 2005, 2006, 2012 Masanori Ozawa , ONGS Inc. + * Copyright (c) 2006, 2012 Daichi Goto * * This code is derived from software contributed to Berkeley by * Jan-Simon Pendry. @@ -350,19 +350,22 @@ unionfs_noderem(struct vnode *vp, struct thread *td) uvp = unp->un_uppervp; dvp = unp->un_dvp; unp->un_lowervp = unp->un_uppervp = NULLVP; - vp->v_vnlock = &(vp->v_lock); vp->v_data = NULL; - lockmgr(vp->v_vnlock, LK_EXCLUSIVE | LK_INTERLOCK, VI_MTX(vp)); - if (lvp != NULLVP) - VOP_UNLOCK(lvp, 0); - if (uvp != NULLVP) - VOP_UNLOCK(uvp, 0); vp->v_object = NULL; + VI_UNLOCK(vp); + + if (lvp != NULLVP) + VOP_UNLOCK(lvp, LK_RELEASE); + if (uvp != NULLVP) + VOP_UNLOCK(uvp, LK_RELEASE); if (dvp != NULLVP && unp->un_hash.le_prev != NULL) unionfs_rem_cached_vnode(unp, dvp); + if (lockmgr(vp->v_vnlock, LK_EXCLUSIVE, VI_MTX(vp)) != 0) + panic("the lock for deletion is unacquirable."); + if (lvp != NULLVP) { vfslocked = VFS_LOCK_GIANT(lvp->v_mount); vrele(lvp); @@ -550,7 +553,7 @@ unionfs_relookup(struct vnode *dvp, struct vnode **vpp, cn->cn_flags |= (cnp->cn_flags & SAVESTART); vref(dvp); - VOP_UNLOCK(dvp, 0); + VOP_UNLOCK(dvp, LK_RELEASE); if ((error = relookup(dvp, vpp, cn))) { uma_zfree(namei_zone, cn->cn_pnbuf); @@ -957,7 +960,7 @@ unionfs_vn_create_on_upper(struct vnode **vpp, struct vnode *udvp, *vpp = vp; unionfs_vn_create_on_upper_free_out1: - VOP_UNLOCK(udvp, 0); + VOP_UNLOCK(udvp, LK_RELEASE); unionfs_vn_create_on_upper_free_out2: if (cn.cn_flags & HASBUF) { @@ -1181,7 +1184,7 @@ unionfs_check_rmdir(struct vnode *vp, struct ucred *cred, struct thread *td) edp = (struct dirent*)&buf[sizeof(buf) - uio.uio_resid]; for (dp = (struct dirent*)buf; !error && dp < edp; dp = (struct dirent*)((caddr_t)dp + dp->d_reclen)) { - if (dp->d_type == DT_WHT || + if (dp->d_type == DT_WHT || dp->d_fileno == 0 || (dp->d_namlen == 1 && dp->d_name[0] == '.') || (dp->d_namlen == 2 && !bcmp(dp->d_name, "..", 2))) continue; diff --git a/sys/fs/unionfs/union_vfsops.c b/sys/fs/unionfs/union_vfsops.c index 3c37d8fa170..936df4c2fb9 100644 --- a/sys/fs/unionfs/union_vfsops.c +++ b/sys/fs/unionfs/union_vfsops.c @@ -1,8 +1,8 @@ /*- * Copyright (c) 1994, 1995 The Regents of the University of California. * Copyright (c) 1994, 1995 Jan-Simon Pendry. - * Copyright (c) 2005, 2006 Masanori Ozawa , ONGS Inc. - * Copyright (c) 2006 Daichi Goto + * Copyright (c) 2005, 2006, 2012 Masanori Ozawa , ONGS Inc. + * Copyright (c) 2006, 2012 Daichi Goto * All rights reserved. * * This code is derived from software donated to Berkeley by @@ -165,7 +165,7 @@ unionfs_domount(struct mount *mp) uid = va.va_uid; gid = va.va_gid; } - VOP_UNLOCK(mp->mnt_vnodecovered, 0); + VOP_UNLOCK(mp->mnt_vnodecovered, LK_RELEASE); if (error) return (error); @@ -250,7 +250,7 @@ unionfs_domount(struct mount *mp) * Save reference */ if (below) { - VOP_UNLOCK(upperrootvp, 0); + VOP_UNLOCK(upperrootvp, LK_RELEASE); vn_lock(lowerrootvp, LK_EXCLUSIVE | LK_RETRY); ump->um_lowervp = upperrootvp; ump->um_uppervp = lowerrootvp; @@ -281,7 +281,7 @@ unionfs_domount(struct mount *mp) /* * Unlock the node */ - VOP_UNLOCK(ump->um_uppervp, 0); + VOP_UNLOCK(ump->um_uppervp, LK_RELEASE); /* * Get the unionfs root vnode. diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c index 47cb3d18e97..36ca3026209 100644 --- a/sys/fs/unionfs/union_vnops.c +++ b/sys/fs/unionfs/union_vnops.c @@ -2,8 +2,8 @@ * Copyright (c) 1992, 1993, 1994, 1995 Jan-Simon Pendry. * Copyright (c) 1992, 1993, 1994, 1995 * The Regents of the University of California. - * Copyright (c) 2005, 2006 Masanori Ozawa , ONGS Inc. - * Copyright (c) 2006 Daichi Goto + * Copyright (c) 2005, 2006, 2012 Masanori Ozawa , ONGS Inc. + * Copyright (c) 2006, 2012 Daichi Goto * All rights reserved. * * This code is derived from software contributed to Berkeley by @@ -75,21 +75,6 @@ KASSERT(((vp)->v_op == &unionfs_vnodeops), \ ("unionfs: it is not unionfs-vnode")) -/* lockmgr lock <-> reverse table */ -struct lk_lr_table { - int lock; - int revlock; -}; - -static struct lk_lr_table un_llt[] = { - {LK_SHARED, LK_RELEASE}, - {LK_EXCLUSIVE, LK_RELEASE}, - {LK_UPGRADE, LK_DOWNGRADE}, - {LK_DOWNGRADE, LK_UPGRADE}, - {0, 0} -}; - - static int unionfs_lookup(struct vop_cachedlookup_args *ap) { @@ -141,7 +126,7 @@ unionfs_lookup(struct vop_cachedlookup_args *ap) if (udvp != NULLVP) { dtmpvp = udvp; if (ldvp != NULLVP) - VOP_UNLOCK(ldvp, 0); + VOP_UNLOCK(ldvp, LK_RELEASE); } else dtmpvp = ldvp; @@ -149,7 +134,7 @@ unionfs_lookup(struct vop_cachedlookup_args *ap) error = VOP_LOOKUP(dtmpvp, &vp, cnp); if (dtmpvp == udvp && ldvp != NULLVP) { - VOP_UNLOCK(udvp, 0); + VOP_UNLOCK(udvp, LK_RELEASE); vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY); } @@ -161,10 +146,10 @@ unionfs_lookup(struct vop_cachedlookup_args *ap) */ if (nameiop == DELETE || nameiop == RENAME || (cnp->cn_lkflags & LK_TYPE_MASK)) - VOP_UNLOCK(vp, 0); + VOP_UNLOCK(vp, LK_RELEASE); vrele(vp); - VOP_UNLOCK(dvp, 0); + VOP_UNLOCK(dvp, LK_RELEASE); *(ap->a_vpp) = dunp->un_dvp; vref(dunp->un_dvp); @@ -202,7 +187,7 @@ unionfs_lookup(struct vop_cachedlookup_args *ap) } if (nameiop == DELETE || nameiop == RENAME || (cnp->cn_lkflags & LK_TYPE_MASK)) - VOP_UNLOCK(uvp, 0); + VOP_UNLOCK(uvp, LK_RELEASE); } /* check whiteout */ @@ -246,7 +231,7 @@ unionfs_lookup(struct vop_cachedlookup_args *ap) return (lerror); } if (cnp->cn_lkflags & LK_TYPE_MASK) - VOP_UNLOCK(lvp, 0); + VOP_UNLOCK(lvp, LK_RELEASE); } } @@ -281,7 +266,7 @@ unionfs_lookup(struct vop_cachedlookup_args *ap) goto unionfs_lookup_out; if (LK_SHARED == (cnp->cn_lkflags & LK_TYPE_MASK)) - VOP_UNLOCK(vp, 0); + VOP_UNLOCK(vp, LK_RELEASE); if (LK_EXCLUSIVE != VOP_ISLOCKED(vp)) { vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); lockflag = 1; @@ -289,7 +274,7 @@ unionfs_lookup(struct vop_cachedlookup_args *ap) error = unionfs_mkshadowdir(MOUNTTOUNIONFSMOUNT(dvp->v_mount), udvp, VTOUNIONFS(vp), cnp, td); if (lockflag != 0) - VOP_UNLOCK(vp, 0); + VOP_UNLOCK(vp, LK_RELEASE); if (error != 0) { UNIONFSDEBUG("unionfs_lookup: Unable to create shadow dir."); if ((cnp->cn_lkflags & LK_TYPE_MASK) == LK_EXCLUSIVE) @@ -386,7 +371,7 @@ unionfs_create(struct vop_create_args *ap) if (vp->v_type == VSOCK) *(ap->a_vpp) = vp; else { - VOP_UNLOCK(vp, 0); + VOP_UNLOCK(vp, LK_RELEASE); error = unionfs_nodeget(ap->a_dvp->v_mount, vp, NULLVP, ap->a_dvp, ap->a_vpp, cnp, curthread); vrele(vp); @@ -460,7 +445,7 @@ unionfs_mknod(struct vop_mknod_args *ap) if (vp->v_type == VSOCK) *(ap->a_vpp) = vp; else { - VOP_UNLOCK(vp, 0); + VOP_UNLOCK(vp, LK_RELEASE); error = unionfs_nodeget(ap->a_dvp->v_mount, vp, NULLVP, ap->a_dvp, ap->a_vpp, cnp, curthread); vrele(vp); @@ -564,6 +549,7 @@ unionfs_close(struct vop_close_args *ap) struct unionfs_node_status *unsp; struct ucred *cred; struct thread *td; + struct vnode *vp; struct vnode *ovp; UNIONFS_INTERNAL_DEBUG("unionfs_close: enter\n"); @@ -571,12 +557,14 @@ unionfs_close(struct vop_close_args *ap) KASSERT_UNIONFS_VNODE(ap->a_vp); locked = 0; - unp = VTOUNIONFS(ap->a_vp); + vp = ap->a_vp; + unp = VTOUNIONFS(vp); cred = ap->a_cred; td = ap->a_td; - if (VOP_ISLOCKED(ap->a_vp) != LK_EXCLUSIVE) { - vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY); + if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) { + if (vn_lock(vp, LK_UPGRADE) != 0) + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); locked = 1; } unionfs_get_node_status(unp, td, &unsp); @@ -599,7 +587,7 @@ unionfs_close(struct vop_close_args *ap) if (error != 0) goto unionfs_close_abort; - ap->a_vp->v_object = ovp->v_object; + vp->v_object = ovp->v_object; if (ovp == unp->un_uppervp) { unsp->uns_upper_opencnt--; @@ -610,7 +598,7 @@ unionfs_close(struct vop_close_args *ap) unsp->uns_lower_opencnt--; } if (unsp->uns_lower_opencnt > 0) - ap->a_vp->v_object = unp->un_lowervp->v_object; + vp->v_object = unp->un_lowervp->v_object; } } else unsp->uns_lower_opencnt--; @@ -619,7 +607,7 @@ unionfs_close_abort: unionfs_tryrem_node_status(unp, unsp); if (locked != 0) - VOP_UNLOCK(ap->a_vp, 0); + vn_lock(vp, LK_DOWNGRADE | LK_RETRY); UNIONFS_INTERNAL_DEBUG("unionfs_close: leave (%d)\n", error); @@ -914,7 +902,7 @@ unionfs_ioctl(struct vop_ioctl_args *ap) unionfs_get_node_status(unp, ap->a_td, &unsp); ovp = (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowervp); unionfs_tryrem_node_status(unp, unsp); - VOP_UNLOCK(ap->a_vp, 0); + VOP_UNLOCK(ap->a_vp, LK_RELEASE); if (ovp == NULLVP) return (EBADF); @@ -941,7 +929,7 @@ unionfs_poll(struct vop_poll_args *ap) unionfs_get_node_status(unp, ap->a_td, &unsp); ovp = (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowervp); unionfs_tryrem_node_status(unp, unsp); - VOP_UNLOCK(ap->a_vp, 0); + VOP_UNLOCK(ap->a_vp, LK_RELEASE); if (ovp == NULLVP) return (EBADF); @@ -1001,7 +989,7 @@ unionfs_remove(struct vop_remove_args *ap) ump = NULL; vp = uvp = lvp = NULLVP; /* search vnode */ - VOP_UNLOCK(ap->a_vp, 0); + VOP_UNLOCK(ap->a_vp, LK_RELEASE); error = unionfs_relookup(udvp, &vp, cnp, &cn, td, cnp->cn_nameptr, strlen(cnp->cn_nameptr), DELETE); if (error != 0 && error != ENOENT) { @@ -1204,7 +1192,7 @@ unionfs_rename(struct vop_rename_args *ap) if ((error = vn_lock(fvp, LK_EXCLUSIVE)) != 0) goto unionfs_rename_abort; error = unionfs_copyfile(unp, 1, fcnp->cn_cred, td); - VOP_UNLOCK(fvp, 0); + VOP_UNLOCK(fvp, LK_RELEASE); if (error != 0) goto unionfs_rename_abort; break; @@ -1212,7 +1200,7 @@ unionfs_rename(struct vop_rename_args *ap) if ((error = vn_lock(fvp, LK_EXCLUSIVE)) != 0) goto unionfs_rename_abort; error = unionfs_mkshadowdir(ump, rfdvp, unp, fcnp, td); - VOP_UNLOCK(fvp, 0); + VOP_UNLOCK(fvp, LK_RELEASE); if (error != 0) goto unionfs_rename_abort; break; @@ -1269,13 +1257,13 @@ unionfs_rename(struct vop_rename_args *ap) if ((error = vn_lock(fdvp, LK_EXCLUSIVE)) != 0) goto unionfs_rename_abort; error = unionfs_relookup_for_delete(fdvp, fcnp, td); - VOP_UNLOCK(fdvp, 0); + VOP_UNLOCK(fdvp, LK_RELEASE); if (error != 0) goto unionfs_rename_abort; /* Locke of tvp is canceled in order to avoid recursive lock. */ if (tvp != NULLVP && tvp != tdvp) - VOP_UNLOCK(tvp, 0); + VOP_UNLOCK(tvp, LK_RELEASE); error = unionfs_relookup_for_rename(tdvp, tcnp, td); if (tvp != NULLVP && tvp != tdvp) vn_lock(tvp, LK_EXCLUSIVE | LK_RETRY); @@ -1293,11 +1281,11 @@ unionfs_rename(struct vop_rename_args *ap) } if (ltdvp != NULLVP) - VOP_UNLOCK(ltdvp, 0); + VOP_UNLOCK(ltdvp, LK_RELEASE); if (tdvp != rtdvp) vrele(tdvp); if (ltvp != NULLVP) - VOP_UNLOCK(ltvp, 0); + VOP_UNLOCK(ltvp, LK_RELEASE); if (tvp != rtvp && tvp != NULLVP) { if (rtvp == NULLVP) vput(tvp); @@ -1371,7 +1359,7 @@ unionfs_mkdir(struct vop_mkdir_args *ap) } if ((error = VOP_MKDIR(udvp, &uvp, cnp, ap->a_vap)) == 0) { - VOP_UNLOCK(uvp, 0); + VOP_UNLOCK(uvp, LK_RELEASE); cnp->cn_lkflags = LK_EXCLUSIVE; error = unionfs_nodeget(ap->a_dvp->v_mount, uvp, NULLVP, ap->a_dvp, ap->a_vpp, cnp, td); @@ -1427,7 +1415,9 @@ unionfs_rmdir(struct vop_rmdir_args *ap) ump = MOUNTTOUNIONFSMOUNT(ap->a_vp->v_mount); if (ump->um_whitemode == UNIONFS_WHITE_ALWAYS || lvp != NULLVP) cnp->cn_flags |= DOWHITEOUT; - error = VOP_RMDIR(udvp, uvp, cnp); + error = unionfs_relookup_for_delete(ap->a_dvp, cnp, td); + if (!error) + error = VOP_RMDIR(udvp, uvp, cnp); } else if (lvp != NULLVP) error = unionfs_mkwhiteout(udvp, cnp, td, unp->un_path); @@ -1467,7 +1457,7 @@ unionfs_symlink(struct vop_symlink_args *ap) if (udvp != NULLVP) { error = VOP_SYMLINK(udvp, &uvp, cnp, ap->a_vap, ap->a_target); if (error == 0) { - VOP_UNLOCK(uvp, 0); + VOP_UNLOCK(uvp, LK_RELEASE); cnp->cn_lkflags = LK_EXCLUSIVE; error = unionfs_nodeget(ap->a_dvp->v_mount, uvp, NULLVP, ap->a_dvp, ap->a_vpp, cnp, td); @@ -1487,9 +1477,11 @@ unionfs_readdir(struct vop_readdir_args *ap) int error; int eofflag; int locked; + int uio_offset_bk; struct unionfs_node *unp; struct unionfs_node_status *unsp; struct uio *uio; + struct vnode *vp; struct vnode *uvp; struct vnode *lvp; struct thread *td; @@ -1505,17 +1497,42 @@ unionfs_readdir(struct vop_readdir_args *ap) error = 0; eofflag = 0; locked = 0; - unp = VTOUNIONFS(ap->a_vp); + uio_offset_bk = 0; uio = ap->a_uio; - uvp = unp->un_uppervp; - lvp = unp->un_lowervp; + uvp = NULLVP; + lvp = NULLVP; td = uio->uio_td; ncookies_bk = 0; cookies_bk = NULL; - if (ap->a_vp->v_type != VDIR) + vp = ap->a_vp; + if (vp->v_type != VDIR) return (ENOTDIR); + /* check the open count. unionfs needs to open before readdir. */ + if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) { + if (vn_lock(vp, LK_UPGRADE) != 0) + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + locked = 1; + } + unp = VTOUNIONFS(vp); + if (unp == NULL) + error = EBADF; + else { + uvp = unp->un_uppervp; + lvp = unp->un_lowervp; + unionfs_get_node_status(unp, td, &unsp); + if ((uvp != NULLVP && unsp->uns_upper_opencnt <= 0) || + (lvp != NULLVP && unsp->uns_lower_opencnt <= 0)) { + unionfs_tryrem_node_status(unp, unsp); + error = EBADF; + } + } + if (locked) + vn_lock(vp, LK_DOWNGRADE | LK_RETRY); + if (error != 0) + goto unionfs_readdir_exit; + /* check opaque */ if (uvp != NULLVP && lvp != NULLVP) { if ((error = VOP_GETATTR(uvp, &va, ap->a_cred)) != 0) @@ -1524,22 +1541,6 @@ unionfs_readdir(struct vop_readdir_args *ap) lvp = NULLVP; } - /* check the open count. unionfs needs to open before readdir. */ - if (VOP_ISLOCKED(ap->a_vp) != LK_EXCLUSIVE) { - vn_lock(ap->a_vp, LK_UPGRADE | LK_RETRY); - locked = 1; - } - unionfs_get_node_status(unp, td, &unsp); - if ((uvp != NULLVP && unsp->uns_upper_opencnt <= 0) || - (lvp != NULLVP && unsp->uns_lower_opencnt <= 0)) { - unionfs_tryrem_node_status(unp, unsp); - error = EBADF; - } - if (locked == 1) - vn_lock(ap->a_vp, LK_DOWNGRADE | LK_RETRY); - if (error != 0) - goto unionfs_readdir_exit; - /* upper only */ if (uvp != NULLVP && lvp == NULLVP) { error = VOP_READDIR(uvp, uio, ap->a_cred, ap->a_eofflag, @@ -1576,7 +1577,7 @@ unionfs_readdir(struct vop_readdir_args *ap) unsp->uns_readdir_status = 1; /* - * ufs(and other fs) needs size of uio_resid larger than + * UFS(and other FS) needs size of uio_resid larger than * DIRBLKSIZ. * size of DIRBLKSIZ equals DEV_BSIZE. * (see: ufs/ufs/ufs_vnops.c ufs_readdir func , ufs/ufs/dir.h) @@ -1585,7 +1586,7 @@ unionfs_readdir(struct vop_readdir_args *ap) goto unionfs_readdir_exit; /* - * backup cookies + * Backup cookies. * It prepares to readdir in lower. */ if (ap->a_ncookies != NULL) { @@ -1601,6 +1602,11 @@ unionfs_readdir(struct vop_readdir_args *ap) /* initialize for readdir in lower */ if (unsp->uns_readdir_status == 1) { unsp->uns_readdir_status = 2; + /* + * Backup uio_offset. See the comment after the + * VOP_READDIR call on the lower layer. + */ + uio_offset_bk = uio->uio_offset; uio->uio_offset = 0; } @@ -1612,6 +1618,19 @@ unionfs_readdir(struct vop_readdir_args *ap) error = VOP_READDIR(lvp, uio, ap->a_cred, ap->a_eofflag, ap->a_ncookies, ap->a_cookies); + /* + * We can't return an uio_offset of 0: this would trigger an + * infinite loop, because the next call to unionfs_readdir would + * always restart with the upper layer (uio_offset == 0) and + * always return some data. + * + * This happens when the lower layer root directory is removed. + * (A root directory deleting of unionfs should not be permitted. + * But current VFS can not do it.) + */ + if (uio->uio_offset == 0) + uio->uio_offset = uio_offset_bk; + if (cookies_bk != NULL) { /* merge cookies */ int size; @@ -1623,7 +1642,7 @@ unionfs_readdir(struct vop_readdir_args *ap) pos = newcookies; memcpy(pos, cookies_bk, ncookies_bk * sizeof(u_long)); - pos += ncookies_bk * sizeof(u_long); + pos += ncookies_bk; memcpy(pos, *(ap->a_cookies), *(ap->a_ncookies) * sizeof(u_long)); free(cookies_bk, M_TEMP); free(*(ap->a_cookies), M_TEMP); @@ -1743,18 +1762,66 @@ unionfs_print(struct vop_print_args *ap) } static int -unionfs_get_llt_revlock(int flags) +unionfs_islocked(struct vop_islocked_args *ap) { - int count; + struct unionfs_node *unp; - flags &= LK_TYPE_MASK; - for (count = 0; un_llt[count].lock != 0; count++) { - if (flags == un_llt[count].lock) { - return un_llt[count].revlock; - } + KASSERT_UNIONFS_VNODE(ap->a_vp); + + unp = VTOUNIONFS(ap->a_vp); + if (unp == NULL) + return (vop_stdislocked(ap)); + + if (unp->un_uppervp != NULLVP) + return (VOP_ISLOCKED(unp->un_uppervp)); + if (unp->un_lowervp != NULLVP) + return (VOP_ISLOCKED(unp->un_lowervp)); + return (vop_stdislocked(ap)); +} + +static int +unionfs_get_llt_revlock(struct vnode *vp, int flags) +{ + int revlock; + + revlock = 0; + + switch (flags & LK_TYPE_MASK) { + case LK_SHARED: + if (VOP_ISLOCKED(vp) == LK_EXCLUSIVE) + revlock = LK_UPGRADE; + else + revlock = LK_RELEASE; + break; + case LK_EXCLUSIVE: + case LK_UPGRADE: + revlock = LK_RELEASE; + break; + case LK_DOWNGRADE: + revlock = LK_UPGRADE; + break; + default: + break; } - return 0; + return (revlock); +} + +/* + * The state of an acquired lock is adjusted similarly to + * the time of error generating. + * flags: LK_RELEASE or LK_UPGRADE + */ +static void +unionfs_revlock(struct vnode *vp, int flags) +{ + if (flags & LK_RELEASE) + VOP_UNLOCK(vp, flags); + else { + /* UPGRADE */ + if (vn_lock(vp, flags) != 0) + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + } } static int @@ -1763,6 +1830,7 @@ unionfs_lock(struct vop_lock1_args *ap) int error; int flags; int revlock; + int interlock; int uhold; struct mount *mp; struct unionfs_mount *ump; @@ -1774,15 +1842,13 @@ unionfs_lock(struct vop_lock1_args *ap) KASSERT_UNIONFS_VNODE(ap->a_vp); error = 0; + interlock = 1; uhold = 0; flags = ap->a_flags; vp = ap->a_vp; if (LK_RELEASE == (flags & LK_TYPE_MASK) || !(flags & LK_TYPE_MASK)) - return (VOP_UNLOCK(vp, flags)); - - if ((revlock = unionfs_get_llt_revlock(flags)) == 0) - panic("unknown lock type: 0x%x", flags & LK_TYPE_MASK); + return (VOP_UNLOCK(vp, flags | LK_RELEASE)); if ((flags & LK_INTERLOCK) == 0) VI_LOCK(vp); @@ -1798,6 +1864,9 @@ unionfs_lock(struct vop_lock1_args *ap) lvp = unp->un_lowervp; uvp = unp->un_uppervp; + if ((revlock = unionfs_get_llt_revlock(vp, flags)) == 0) + panic("unknown lock type: 0x%x", flags & LK_TYPE_MASK); + if ((mp->mnt_kern_flag & MNTK_MPSAFE) != 0 && (vp->v_iflag & VI_OWEINACT) != 0) flags |= LK_NOWAIT; @@ -1811,6 +1880,23 @@ unionfs_lock(struct vop_lock1_args *ap) flags |= LK_CANRECURSE; if (lvp != NULLVP) { + if (uvp != NULLVP && flags & LK_UPGRADE) { + /* Share Lock is once released and a deadlock is avoided. */ + VI_LOCK_FLAGS(uvp, MTX_DUPOK); + vholdl(uvp); + uhold = 1; + VI_UNLOCK(vp); + VOP_UNLOCK(uvp, LK_RELEASE | LK_INTERLOCK); + VI_LOCK(vp); + unp = VTOUNIONFS(vp); + if (unp == NULL) { + /* vnode is released. */ + VI_UNLOCK(vp); + VOP_UNLOCK(lvp, LK_RELEASE); + vdrop(uvp); + return (EBUSY); + } + } VI_LOCK_FLAGS(lvp, MTX_DUPOK); flags |= LK_INTERLOCK; vholdl(lvp); @@ -1823,19 +1909,28 @@ unionfs_lock(struct vop_lock1_args *ap) VI_LOCK(vp); unp = VTOUNIONFS(vp); if (unp == NULL) { + /* vnode is released. */ VI_UNLOCK(vp); if (error == 0) - VOP_UNLOCK(lvp, 0); + VOP_UNLOCK(lvp, LK_RELEASE); vdrop(lvp); + if (uhold != 0) + vdrop(uvp); return (vop_stdlock(ap)); } } if (error == 0 && uvp != NULLVP) { + if (uhold && flags & LK_UPGRADE) { + flags &= ~LK_TYPE_MASK; + flags |= LK_EXCLUSIVE; + } VI_LOCK_FLAGS(uvp, MTX_DUPOK); flags |= LK_INTERLOCK; - vholdl(uvp); - uhold = 1; + if (uhold == 0) { + vholdl(uvp); + uhold = 1; + } VI_UNLOCK(vp); ap->a_flags &= ~LK_INTERLOCK; @@ -1845,30 +1940,27 @@ unionfs_lock(struct vop_lock1_args *ap) VI_LOCK(vp); unp = VTOUNIONFS(vp); if (unp == NULL) { + /* vnode is released. */ VI_UNLOCK(vp); - if (error == 0) { - VOP_UNLOCK(uvp, 0); - if (lvp != NULLVP) - VOP_UNLOCK(lvp, 0); - } - if (lvp != NULLVP) - vdrop(lvp); + if (error == 0) + VOP_UNLOCK(uvp, LK_RELEASE); vdrop(uvp); + if (lvp != NULLVP) { + VOP_UNLOCK(lvp, LK_RELEASE); + vdrop(lvp); + } return (vop_stdlock(ap)); } - if (error != 0 && lvp != NULLVP) { + /* rollback */ VI_UNLOCK(vp); - if ((revlock & LK_TYPE_MASK) == LK_RELEASE) - VOP_UNLOCK(lvp, revlock); - else - vn_lock(lvp, revlock | LK_RETRY); - goto unionfs_lock_abort; + unionfs_revlock(lvp, revlock); + interlock = 0; } } - VI_UNLOCK(vp); -unionfs_lock_abort: + if (interlock) + VI_UNLOCK(vp); if (lvp != NULLVP) vdrop(lvp); if (uhold != 0) @@ -2013,7 +2105,7 @@ unionfs_advlock(struct vop_advlock_args *ap) unionfs_tryrem_node_status(unp, unsp); } - VOP_UNLOCK(vp, 0); + VOP_UNLOCK(vp, LK_RELEASE); error = VOP_ADVLOCK(uvp, ap->a_id, ap->a_op, ap->a_fl, ap->a_flags); @@ -2022,7 +2114,7 @@ unionfs_advlock(struct vop_advlock_args *ap) return error; unionfs_advlock_abort: - VOP_UNLOCK(vp, 0); + VOP_UNLOCK(vp, LK_RELEASE); UNIONFS_INTERNAL_DEBUG("unionfs_advlock: leave (%d)\n", error); @@ -2150,7 +2242,8 @@ unionfs_openextattr(struct vop_openextattr_args *ap) error = VOP_OPENEXTATTR(tvp, ap->a_cred, ap->a_td); if (error == 0) { - vn_lock(vp, LK_UPGRADE | LK_RETRY); + if (vn_lock(vp, LK_UPGRADE) != 0) + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); if (tvp == unp->un_uppervp) unp->un_flag |= UNIONFS_OPENEXTU; else @@ -2186,7 +2279,8 @@ unionfs_closeextattr(struct vop_closeextattr_args *ap) error = VOP_CLOSEEXTATTR(tvp, ap->a_commit, ap->a_cred, ap->a_td); if (error == 0) { - vn_lock(vp, LK_UPGRADE | LK_RETRY); + if (vn_lock(vp, LK_UPGRADE) != 0) + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); if (tvp == unp->un_uppervp) unp->un_flag &= ~UNIONFS_OPENEXTU; else @@ -2435,6 +2529,7 @@ struct vop_vector unionfs_vnodeops = { .vop_getextattr = unionfs_getextattr, .vop_getwritemount = unionfs_getwritemount, .vop_inactive = unionfs_inactive, + .vop_islocked = unionfs_islocked, .vop_ioctl = unionfs_ioctl, .vop_link = unionfs_link, .vop_listextattr = unionfs_listextattr, diff --git a/sys/geom/bde/g_bde.c b/sys/geom/bde/g_bde.c index bd4b10770f6..99064f4505d 100644 --- a/sys/geom/bde/g_bde.c +++ b/sys/geom/bde/g_bde.c @@ -77,19 +77,15 @@ g_bde_orphan(struct g_consumer *cp) struct g_geom *gp; struct g_provider *pp; struct g_bde_softc *sc; - int error; g_trace(G_T_TOPOLOGY, "g_bde_orphan(%p/%s)", cp, cp->provider->name); g_topology_assert(); - KASSERT(cp->provider->error != 0, - ("g_bde_orphan with error == 0")); gp = cp->geom; sc = gp->softc; gp->flags |= G_GEOM_WITHER; - error = cp->provider->error; LIST_FOREACH(pp, &gp->provider, provider) - g_orphan_provider(pp, error); + g_orphan_provider(pp, ENXIO); bzero(sc, sizeof(struct g_bde_softc)); /* destroy evidence */ return; } diff --git a/sys/geom/eli/g_eli.c b/sys/geom/eli/g_eli.c index 72f93f42e01..6819fcc4424 100644 --- a/sys/geom/eli/g_eli.c +++ b/sys/geom/eli/g_eli.c @@ -726,6 +726,8 @@ g_eli_create(struct gctl_req *req, struct g_class *mp, struct g_provider *bpp, (sc->sc_flags & G_ELI_FLAG_AUTH) != 0) { sc->sc_flags |= G_ELI_FLAG_FIRST_KEY; } + if (md->md_version < G_ELI_VERSION_07) + sc->sc_flags |= G_ELI_FLAG_ENC_IVKEY; sc->sc_ealgo = md->md_ealgo; sc->sc_nkey = nkey; diff --git a/sys/geom/eli/g_eli.h b/sys/geom/eli/g_eli.h index a5aad8f3263..835a1b31632 100644 --- a/sys/geom/eli/g_eli.h +++ b/sys/geom/eli/g_eli.h @@ -68,6 +68,8 @@ * 5 - Added multiple encrypton keys and AES-XTS support. * 6 - Fixed usage of multiple keys for authenticated providers (the * G_ELI_FLAG_FIRST_KEY flag will be set for older versions). + * 7 - Encryption keys are now generated from the Data Key and not from the + * IV Key (the G_ELI_FLAG_ENC_IVKEY flag will be set for older versions). */ #define G_ELI_VERSION_00 0 #define G_ELI_VERSION_01 1 @@ -76,7 +78,8 @@ #define G_ELI_VERSION_04 4 #define G_ELI_VERSION_05 5 #define G_ELI_VERSION_06 6 -#define G_ELI_VERSION G_ELI_VERSION_06 +#define G_ELI_VERSION_07 7 +#define G_ELI_VERSION G_ELI_VERSION_07 /* ON DISK FLAGS. */ /* Use random, onetime keys. */ @@ -104,6 +107,8 @@ #define G_ELI_FLAG_SUSPEND 0x00100000 /* Provider uses first encryption key. */ #define G_ELI_FLAG_FIRST_KEY 0x00200000 +/* Provider uses IV-Key for encryption key generation. */ +#define G_ELI_FLAG_ENC_IVKEY 0x00400000 #define G_ELI_NEW_BIO 255 @@ -237,7 +242,7 @@ eli_metadata_encode_v0(struct g_eli_metadata *md, u_char **datap) *datap = p; } static __inline void -eli_metadata_encode_v1v2v3v4v5v6(struct g_eli_metadata *md, u_char **datap) +eli_metadata_encode_v1v2v3v4v5v6v7(struct g_eli_metadata *md, u_char **datap) { u_char *p; @@ -275,7 +280,8 @@ eli_metadata_encode(struct g_eli_metadata *md, u_char *data) case G_ELI_VERSION_04: case G_ELI_VERSION_05: case G_ELI_VERSION_06: - eli_metadata_encode_v1v2v3v4v5v6(md, &p); + case G_ELI_VERSION_07: + eli_metadata_encode_v1v2v3v4v5v6v7(md, &p); break; default: #ifdef _KERNEL @@ -315,7 +321,7 @@ eli_metadata_decode_v0(const u_char *data, struct g_eli_metadata *md) } static __inline int -eli_metadata_decode_v1v2v3v4v5v6(const u_char *data, struct g_eli_metadata *md) +eli_metadata_decode_v1v2v3v4v5v6v7(const u_char *data, struct g_eli_metadata *md) { MD5_CTX ctx; const u_char *p; @@ -357,7 +363,8 @@ eli_metadata_decode(const u_char *data, struct g_eli_metadata *md) case G_ELI_VERSION_04: case G_ELI_VERSION_05: case G_ELI_VERSION_06: - error = eli_metadata_decode_v1v2v3v4v5v6(data, md); + case G_ELI_VERSION_07: + error = eli_metadata_decode_v1v2v3v4v5v6v7(data, md); break; default: error = EOPNOTSUPP; diff --git a/sys/geom/eli/g_eli_ctl.c b/sys/geom/eli/g_eli_ctl.c index 65672d54923..520d2371973 100644 --- a/sys/geom/eli/g_eli_ctl.c +++ b/sys/geom/eli/g_eli_ctl.c @@ -1020,6 +1020,12 @@ g_eli_config(struct gctl_req *req, struct g_class *mp, const char *verb) /* Compatible. */ break; } + if (G_ELI_VERSION == G_ELI_VERSION_07 && + (*version == G_ELI_VERSION_05 || + *version == G_ELI_VERSION_06)) { + /* Compatible. */ + break; + } gctl_error(req, "Userland and kernel parts are out of sync."); return; } diff --git a/sys/geom/eli/g_eli_integrity.c b/sys/geom/eli/g_eli_integrity.c index 50f2a31de0e..aeb5c2a41f3 100644 --- a/sys/geom/eli/g_eli_integrity.c +++ b/sys/geom/eli/g_eli_integrity.c @@ -205,8 +205,8 @@ g_eli_auth_read_done(struct cryptop *crp) * Report previous corruption if there was one. */ if (coroff != -1) { - G_ELI_DEBUG(0, "%s: %jd bytes " - "corrupted at offset %jd.", + G_ELI_DEBUG(0, "%s: Failed to authenticate %jd " + "bytes of data at offset %jd.", sc->sc_name, (intmax_t)corsize, (intmax_t)coroff); coroff = -1; @@ -221,7 +221,8 @@ g_eli_auth_read_done(struct cryptop *crp) } /* Report previous corruption if there was one. */ if (coroff != -1) { - G_ELI_DEBUG(0, "%s: %jd bytes corrupted at offset %jd.", + G_ELI_DEBUG(0, "%s: Failed to authenticate %jd " + "bytes of data at offset %jd.", sc->sc_name, (intmax_t)corsize, (intmax_t)coroff); } } diff --git a/sys/geom/eli/g_eli_key.c b/sys/geom/eli/g_eli_key.c index 3696e2e9c4b..d4103746278 100644 --- a/sys/geom/eli/g_eli_key.c +++ b/sys/geom/eli/g_eli_key.c @@ -197,7 +197,7 @@ g_eli_mkey_propagate(struct g_eli_softc *sc, const unsigned char *mkey) mkey += sizeof(sc->sc_ivkey); /* - * The authentication key is: akey = HMAC_SHA512(Master-Key, 0x11) + * The authentication key is: akey = HMAC_SHA512(Data-Key, 0x11) */ if ((sc->sc_flags & G_ELI_FLAG_AUTH) != 0) { g_eli_crypto_hmac(mkey, G_ELI_MAXKEYLEN, "\x11", 1, @@ -209,7 +209,7 @@ g_eli_mkey_propagate(struct g_eli_softc *sc, const unsigned char *mkey) /* Initialize encryption keys. */ g_eli_key_init(sc); - if (sc->sc_flags & G_ELI_FLAG_AUTH) { + if ((sc->sc_flags & G_ELI_FLAG_AUTH) != 0) { /* * Precalculate SHA256 for HMAC key generation. * This is expensive operation and we can do it only once now or diff --git a/sys/geom/eli/g_eli_key_cache.c b/sys/geom/eli/g_eli_key_cache.c index de4989b72f6..d7158e4ac84 100644 --- a/sys/geom/eli/g_eli_key_cache.c +++ b/sys/geom/eli/g_eli_key_cache.c @@ -91,14 +91,20 @@ RB_GENERATE(g_eli_key_tree, g_eli_key, gek_link, g_eli_key_cmp); static void g_eli_key_fill(struct g_eli_softc *sc, struct g_eli_key *key, uint64_t keyno) { + const uint8_t *ekey; struct { char magic[4]; uint8_t keyno[8]; } __packed hmacdata; + if ((sc->sc_flags & G_ELI_FLAG_ENC_IVKEY) != 0) + ekey = sc->sc_mkey; + else + ekey = sc->sc_ekey; + bcopy("ekey", hmacdata.magic, 4); le64enc(hmacdata.keyno, keyno); - g_eli_crypto_hmac(sc->sc_mkey, G_ELI_MAXKEYLEN, (uint8_t *)&hmacdata, + g_eli_crypto_hmac(ekey, G_ELI_MAXKEYLEN, (uint8_t *)&hmacdata, sizeof(hmacdata), key->gek_key, 0); key->gek_keyno = keyno; key->gek_count = 0; @@ -200,7 +206,7 @@ g_eli_key_init(struct g_eli_softc *sc) bcopy(mkey, sc->sc_ekey, G_ELI_DATAKEYLEN); else { /* - * The encryption key is: ekey = HMAC_SHA512(Master-Key, 0x10) + * The encryption key is: ekey = HMAC_SHA512(Data-Key, 0x10) */ g_eli_crypto_hmac(mkey, G_ELI_MAXKEYLEN, "\x10", 1, sc->sc_ekey, 0); diff --git a/sys/geom/gate/g_gate.c b/sys/geom/gate/g_gate.c index 52df914aa96..b3c09df44ba 100644 --- a/sys/geom/gate/g_gate.c +++ b/sys/geom/gate/g_gate.c @@ -60,7 +60,7 @@ static MALLOC_DEFINE(M_GATE, "gg_data", "GEOM Gate Data"); SYSCTL_DECL(_kern_geom); static SYSCTL_NODE(_kern_geom, OID_AUTO, gate, CTLFLAG_RW, 0, - "GEOM_GATE stuff"); + "GEOM_GATE configuration"); static int g_gate_debug = 0; TUNABLE_INT("kern.geom.gate.debug", &g_gate_debug); SYSCTL_INT(_kern_geom_gate, OID_AUTO, debug, CTLFLAG_RW, &g_gate_debug, 0, @@ -92,6 +92,7 @@ static int g_gate_destroy(struct g_gate_softc *sc, boolean_t force) { struct g_provider *pp; + struct g_consumer *cp; struct g_geom *gp; struct bio *bp; @@ -138,6 +139,12 @@ g_gate_destroy(struct g_gate_softc *sc, boolean_t force) mtx_unlock(&g_gate_units_lock); mtx_destroy(&sc->sc_queue_mtx); g_topology_lock(); + if ((cp = sc->sc_readcons) != NULL) { + sc->sc_readcons = NULL; + (void)g_access(cp, -1, 0, 0); + g_detach(cp); + g_destroy_consumer(cp); + } G_GATE_DEBUG(1, "Device %s destroyed.", gp->name); gp->softc = NULL; g_wither_geom(gp, ENXIO); @@ -167,7 +174,7 @@ g_gate_access(struct g_provider *pp, int dr, int dw, int de) } static void -g_gate_start(struct bio *bp) +g_gate_queue_io(struct bio *bp) { struct g_gate_softc *sc; @@ -176,27 +183,9 @@ g_gate_start(struct bio *bp) g_io_deliver(bp, ENXIO); return; } - G_GATE_LOGREQ(2, bp, "Request received."); - switch (bp->bio_cmd) { - case BIO_READ: - break; - case BIO_DELETE: - case BIO_WRITE: - case BIO_FLUSH: - /* XXX: Hack to allow read-only mounts. */ - if ((sc->sc_flags & G_GATE_FLAG_READONLY) != 0) { - g_io_deliver(bp, EPERM); - return; - } - break; - case BIO_GETATTR: - default: - G_GATE_LOGREQ(2, bp, "Ignoring request."); - g_io_deliver(bp, EOPNOTSUPP); - return; - } mtx_lock(&sc->sc_queue_mtx); + if (sc->sc_queue_size > 0 && sc->sc_queue_count > sc->sc_queue_size) { mtx_unlock(&sc->sc_queue_mtx); G_GATE_LOGREQ(1, bp, "Queue full, request canceled."); @@ -214,6 +203,74 @@ g_gate_start(struct bio *bp) mtx_unlock(&sc->sc_queue_mtx); } +static void +g_gate_done(struct bio *cbp) +{ + struct bio *pbp; + + pbp = cbp->bio_parent; + if (cbp->bio_error == 0) { + pbp->bio_completed = cbp->bio_completed; + g_destroy_bio(cbp); + pbp->bio_inbed++; + g_io_deliver(pbp, 0); + } else { + /* If direct read failed, pass it through userland daemon. */ + g_destroy_bio(cbp); + pbp->bio_children--; + g_gate_queue_io(pbp); + } +} + +static void +g_gate_start(struct bio *pbp) +{ + struct g_gate_softc *sc; + + sc = pbp->bio_to->geom->softc; + if (sc == NULL || (sc->sc_flags & G_GATE_FLAG_DESTROY) != 0) { + g_io_deliver(pbp, ENXIO); + return; + } + G_GATE_LOGREQ(2, pbp, "Request received."); + switch (pbp->bio_cmd) { + case BIO_READ: + if (sc->sc_readcons != NULL) { + struct bio *cbp; + + cbp = g_clone_bio(pbp); + if (cbp == NULL) { + g_io_deliver(pbp, ENOMEM); + return; + } + cbp->bio_done = g_gate_done; + cbp->bio_offset = pbp->bio_offset + sc->sc_readoffset; + cbp->bio_data = pbp->bio_data; + cbp->bio_length = pbp->bio_length; + cbp->bio_to = sc->sc_readcons->provider; + g_io_request(cbp, sc->sc_readcons); + return; + } + break; + case BIO_DELETE: + case BIO_WRITE: + case BIO_FLUSH: + /* XXX: Hack to allow read-only mounts. */ + if ((sc->sc_flags & G_GATE_FLAG_READONLY) != 0) { + g_io_deliver(pbp, EPERM); + return; + } + break; + case BIO_GETATTR: + default: + G_GATE_LOGREQ(2, pbp, "Ignoring request."); + g_io_deliver(pbp, EOPNOTSUPP); + return; + } + + g_gate_queue_io(pbp); +} + static struct g_gate_softc * g_gate_hold(int unit, const char *name) { @@ -311,6 +368,27 @@ g_gate_guard(void *arg) g_gate_release(sc); } +static void +g_gate_orphan(struct g_consumer *cp) +{ + struct g_gate_softc *sc; + struct g_geom *gp; + + g_topology_assert(); + gp = cp->geom; + sc = gp->softc; + if (sc == NULL) + return; + KASSERT(cp == sc->sc_readcons, ("cp=%p sc_readcons=%p", cp, + sc->sc_readcons)); + sc->sc_readcons = NULL; + G_GATE_DEBUG(1, "Destroying read consumer on provider %s orphan.", + cp->provider->name); + (void)g_access(cp, -1, 0, 0); + g_detach(cp); + g_destroy_consumer(cp); +} + static void g_gate_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, struct g_consumer *cp, struct g_provider *pp) @@ -330,6 +408,12 @@ g_gate_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, sbuf_printf(sb, "%s%s\n", indent, "read-write"); } + if (sc->sc_readcons != NULL) { + sbuf_printf(sb, "%s%jd\n", + indent, (intmax_t)sc->sc_readoffset); + sbuf_printf(sb, "%s%s\n", + indent, sc->sc_readcons->provider->name); + } sbuf_printf(sb, "%s%u\n", indent, sc->sc_timeout); sbuf_printf(sb, "%s%s\n", indent, sc->sc_info); sbuf_printf(sb, "%s%u\n", indent, @@ -348,15 +432,20 @@ g_gate_create(struct g_gate_ctl_create *ggio) { struct g_gate_softc *sc; struct g_geom *gp; - struct g_provider *pp; + struct g_provider *pp, *ropp; + struct g_consumer *cp; char name[NAME_MAX]; int error = 0, unit; - if (ggio->gctl_mediasize == 0) { + if (ggio->gctl_mediasize <= 0) { G_GATE_DEBUG(1, "Invalid media size."); return (EINVAL); } - if (ggio->gctl_sectorsize > 0 && !powerof2(ggio->gctl_sectorsize)) { + if (ggio->gctl_sectorsize <= 0) { + G_GATE_DEBUG(1, "Invalid sector size."); + return (EINVAL); + } + if (!powerof2(ggio->gctl_sectorsize)) { G_GATE_DEBUG(1, "Invalid sector size."); return (EINVAL); } @@ -381,6 +470,31 @@ g_gate_create(struct g_gate_ctl_create *ggio) return (EINVAL); } + g_topology_lock(); + + if (ggio->gctl_readprov[0] == '\0') { + ropp = NULL; + } else { + ropp = g_provider_by_name(ggio->gctl_readprov); + if (ropp == NULL) { + g_topology_unlock(); + G_GATE_DEBUG(1, "Provider %s doesn't exist.", + ggio->gctl_readprov); + return (EINVAL); + } + if ((ggio->gctl_readoffset % ggio->gctl_sectorsize) != 0) { + g_topology_unlock(); + G_GATE_DEBUG(1, "Invalid read offset."); + return (EINVAL); + } + if (ggio->gctl_mediasize + ggio->gctl_readoffset > + ropp->mediasize) { + g_topology_unlock(); + G_GATE_DEBUG(1, "Invalid read offset or media size."); + return (EINVAL); + } + } + sc = malloc(sizeof(*sc), M_GATE, M_WAITOK | M_ZERO); sc->sc_flags = (ggio->gctl_flags & G_GATE_USERFLAGS); strlcpy(sc->sc_info, ggio->gctl_info, sizeof(sc->sc_info)); @@ -394,10 +508,50 @@ g_gate_create(struct g_gate_ctl_create *ggio) sc->sc_queue_size = G_GATE_MAX_QUEUE_SIZE; sc->sc_timeout = ggio->gctl_timeout; callout_init(&sc->sc_callout, CALLOUT_MPSAFE); + + gp = g_new_geomf(&g_gate_class, "%s", name); + gp->start = g_gate_start; + gp->access = g_gate_access; + gp->orphan = g_gate_orphan; + gp->dumpconf = g_gate_dumpconf; + gp->softc = sc; + + if (ropp != NULL) { + cp = g_new_consumer(gp); + error = g_attach(cp, ropp); + if (error != 0) { + G_GATE_DEBUG(1, "Unable to attach to %s.", ropp->name); + } else { + error = g_access(cp, 1, 0, 0); + if (error != 0) { + G_GATE_DEBUG(1, "Unable to access %s.", + ropp->name); + g_detach(cp); + } + } + if (error != 0) { + g_destroy_consumer(cp); + g_destroy_geom(gp); + g_topology_unlock(); + mtx_destroy(&sc->sc_queue_mtx); + free(sc, M_GATE); + return (error); + } + sc->sc_readcons = cp; + sc->sc_readoffset = ggio->gctl_readoffset; + } + mtx_lock(&g_gate_units_lock); sc->sc_unit = g_gate_getunit(ggio->gctl_unit, &error); if (sc->sc_unit < 0) { mtx_unlock(&g_gate_units_lock); + if (sc->sc_readcons != NULL) { + (void)g_access(sc->sc_readcons, -1, 0, 0); + g_detach(sc->sc_readcons); + g_destroy_consumer(sc->sc_readcons); + } + g_destroy_geom(gp); + g_topology_unlock(); mtx_destroy(&sc->sc_queue_mtx); free(sc, M_GATE); return (error); @@ -415,6 +569,13 @@ g_gate_create(struct g_gate_ctl_create *ggio) if (strcmp(name, g_gate_units[unit]->sc_name) != 0) continue; mtx_unlock(&g_gate_units_lock); + if (sc->sc_readcons != NULL) { + (void)g_access(sc->sc_readcons, -1, 0, 0); + g_detach(sc->sc_readcons); + g_destroy_consumer(sc->sc_readcons); + } + g_destroy_geom(gp); + g_topology_unlock(); mtx_destroy(&sc->sc_queue_mtx); free(sc, M_GATE); return (EEXIST); @@ -426,17 +587,12 @@ g_gate_create(struct g_gate_ctl_create *ggio) ggio->gctl_unit = sc->sc_unit; - g_topology_lock(); - gp = g_new_geomf(&g_gate_class, "%s", name); - gp->start = g_gate_start; - gp->access = g_gate_access; - gp->dumpconf = g_gate_dumpconf; - gp->softc = sc; pp = g_new_providerf(gp, "%s", name); pp->mediasize = ggio->gctl_mediasize; pp->sectorsize = ggio->gctl_sectorsize; sc->sc_provider = pp; g_error_provider(pp, 0); + g_topology_unlock(); mtx_lock(&g_gate_units_lock); sc->sc_name = sc->sc_provider->name; @@ -450,6 +606,98 @@ g_gate_create(struct g_gate_ctl_create *ggio) return (0); } +static int +g_gate_modify(struct g_gate_softc *sc, struct g_gate_ctl_modify *ggio) +{ + struct g_provider *pp; + struct g_consumer *cp; + int error; + + if ((ggio->gctl_modify & GG_MODIFY_MEDIASIZE) != 0) { + if (ggio->gctl_mediasize <= 0) { + G_GATE_DEBUG(1, "Invalid media size."); + return (EINVAL); + } + pp = sc->sc_provider; + if ((ggio->gctl_mediasize % pp->sectorsize) != 0) { + G_GATE_DEBUG(1, "Invalid media size."); + return (EINVAL); + } + /* TODO */ + return (EOPNOTSUPP); + } + + if ((ggio->gctl_modify & GG_MODIFY_INFO) != 0) + (void)strlcpy(sc->sc_info, ggio->gctl_info, sizeof(sc->sc_info)); + + cp = NULL; + + if ((ggio->gctl_modify & GG_MODIFY_READPROV) != 0) { + g_topology_lock(); + if (sc->sc_readcons != NULL) { + cp = sc->sc_readcons; + sc->sc_readcons = NULL; + (void)g_access(cp, -1, 0, 0); + g_detach(cp); + g_destroy_consumer(cp); + } + if (ggio->gctl_readprov[0] != '\0') { + pp = g_provider_by_name(ggio->gctl_readprov); + if (pp == NULL) { + g_topology_unlock(); + G_GATE_DEBUG(1, "Provider %s doesn't exist.", + ggio->gctl_readprov); + return (EINVAL); + } + cp = g_new_consumer(sc->sc_provider->geom); + error = g_attach(cp, pp); + if (error != 0) { + G_GATE_DEBUG(1, "Unable to attach to %s.", + pp->name); + } else { + error = g_access(cp, 1, 0, 0); + if (error != 0) { + G_GATE_DEBUG(1, "Unable to access %s.", + pp->name); + g_detach(cp); + } + } + if (error != 0) { + g_destroy_consumer(cp); + g_topology_unlock(); + return (error); + } + } + } else { + cp = sc->sc_readcons; + } + + if ((ggio->gctl_modify & GG_MODIFY_READOFFSET) != 0) { + if (cp == NULL) { + G_GATE_DEBUG(1, "No read provider."); + return (EINVAL); + } + pp = sc->sc_provider; + if ((ggio->gctl_readoffset % pp->sectorsize) != 0) { + G_GATE_DEBUG(1, "Invalid read offset."); + return (EINVAL); + } + if (pp->mediasize + ggio->gctl_readoffset > + cp->provider->mediasize) { + G_GATE_DEBUG(1, "Invalid read offset or media size."); + return (EINVAL); + } + sc->sc_readoffset = ggio->gctl_readoffset; + } + + if ((ggio->gctl_modify & GG_MODIFY_READPROV) != 0) { + sc->sc_readcons = cp; + g_topology_unlock(); + } + + return (0); +} + #define G_GATE_CHECK_VERSION(ggio) do { \ if ((ggio)->gctl_version != G_GATE_VERSION) { \ printf("Version mismatch %d != %d.\n", \ @@ -483,6 +731,18 @@ g_gate_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct threa td->td_pflags &= ~TDP_GEOM; return (error); } + case G_GATE_CMD_MODIFY: + { + struct g_gate_ctl_modify *ggio = (void *)addr; + + G_GATE_CHECK_VERSION(ggio); + sc = g_gate_hold(ggio->gctl_unit, NULL); + if (sc == NULL) + return (ENXIO); + error = g_gate_modify(sc, ggio); + g_gate_release(sc); + return (error); + } case G_GATE_CMD_DESTROY: { struct g_gate_ctl_destroy *ggio = (void *)addr; diff --git a/sys/geom/gate/g_gate.h b/sys/geom/gate/g_gate.h index 0a57ce31bd7..b0c563bb601 100644 --- a/sys/geom/gate/g_gate.h +++ b/sys/geom/gate/g_gate.h @@ -41,7 +41,7 @@ #define G_GATE_MOD_NAME "ggate" #define G_GATE_CTL_NAME "ggctl" -#define G_GATE_VERSION 2 +#define G_GATE_VERSION 3 /* * Maximum number of request that can be stored in @@ -64,10 +64,11 @@ #define G_GATE_NAME_GIVEN (-2) #define G_GATE_CMD_CREATE _IOWR('m', 0, struct g_gate_ctl_create) -#define G_GATE_CMD_DESTROY _IOWR('m', 1, struct g_gate_ctl_destroy) -#define G_GATE_CMD_CANCEL _IOWR('m', 2, struct g_gate_ctl_cancel) -#define G_GATE_CMD_START _IOWR('m', 3, struct g_gate_ctl_io) -#define G_GATE_CMD_DONE _IOWR('m', 4, struct g_gate_ctl_io) +#define G_GATE_CMD_MODIFY _IOWR('m', 1, struct g_gate_ctl_modify) +#define G_GATE_CMD_DESTROY _IOWR('m', 2, struct g_gate_ctl_destroy) +#define G_GATE_CMD_CANCEL _IOWR('m', 3, struct g_gate_ctl_cancel) +#define G_GATE_CMD_START _IOWR('m', 4, struct g_gate_ctl_io) +#define G_GATE_CMD_DONE _IOWR('m', 5, struct g_gate_ctl_io) #define G_GATE_INFOSIZE 2048 @@ -88,6 +89,8 @@ struct g_gate_softc { uint32_t sc_queue_count; /* P: sc_queue_mtx */ uint32_t sc_queue_size; /* P: (read-only) */ u_int sc_timeout; /* P: (read-only) */ + struct g_consumer *sc_readcons; /* P: XXX */ + off_t sc_readoffset; /* P: XXX */ struct callout sc_callout; /* P: (modified only from callout thread) */ @@ -131,9 +134,25 @@ struct g_gate_ctl_create { u_int gctl_timeout; char gctl_name[NAME_MAX]; char gctl_info[G_GATE_INFOSIZE]; + char gctl_readprov[NAME_MAX]; + off_t gctl_readoffset; int gctl_unit; /* in/out */ }; +#define GG_MODIFY_MEDIASIZE 0x01 +#define GG_MODIFY_INFO 0x02 +#define GG_MODIFY_READPROV 0x04 +#define GG_MODIFY_READOFFSET 0x08 +struct g_gate_ctl_modify { + u_int gctl_version; + int gctl_unit; + uint32_t gctl_modify; + off_t gctl_mediasize; + char gctl_info[G_GATE_INFOSIZE]; + char gctl_readprov[NAME_MAX]; + off_t gctl_readoffset; +}; + struct g_gate_ctl_destroy { u_int gctl_version; int gctl_unit; diff --git a/sys/geom/geom.h b/sys/geom/geom.h index 2546b5603ad..5d97f50fd71 100644 --- a/sys/geom/geom.h +++ b/sys/geom/geom.h @@ -76,8 +76,10 @@ typedef void g_orphan_t (struct g_consumer *); typedef void g_start_t (struct bio *); typedef void g_spoiled_t (struct g_consumer *); typedef void g_attrchanged_t (struct g_consumer *, const char *attr); +typedef void g_provgone_t (struct g_provider *); typedef void g_dumpconf_t (struct sbuf *, const char *indent, struct g_geom *, struct g_consumer *, struct g_provider *); +typedef void g_resize_t(struct g_consumer *cp); /* * The g_class structure describes a transformation class. In other words @@ -106,8 +108,8 @@ struct g_class { g_access_t *access; g_orphan_t *orphan; g_ioctl_t *ioctl; - void *spare1; - void *spare2; + g_provgone_t *providergone; + g_resize_t *resize; /* * The remaining elements are private */ @@ -137,8 +139,8 @@ struct g_geom { g_access_t *access; g_orphan_t *orphan; g_ioctl_t *ioctl; - void *spare0; - void *spare1; + g_provgone_t *providergone; + g_resize_t *resize; void *softc; unsigned flags; #define G_GEOM_WITHER 1 @@ -264,6 +266,7 @@ int g_handleattr_str(struct bio *bp, const char *attribute, const char *str); struct g_consumer * g_new_consumer(struct g_geom *gp); struct g_geom * g_new_geomf(struct g_class *mp, const char *fmt, ...); struct g_provider * g_new_providerf(struct g_geom *gp, const char *fmt, ...); +void g_resize_provider(struct g_provider *pp, off_t size); int g_retaste(struct g_class *mp); void g_spoil(struct g_provider *pp, struct g_consumer *cp); int g_std_access(struct g_provider *pp, int dr, int dw, int de); diff --git a/sys/geom/geom_aes.c b/sys/geom/geom_aes.c index 50b85e6e58e..77e55f79156 100644 --- a/sys/geom/geom_aes.c +++ b/sys/geom/geom_aes.c @@ -241,12 +241,10 @@ g_aes_orphan(struct g_consumer *cp) g_trace(G_T_TOPOLOGY, "g_aes_orphan(%p/%s)", cp, cp->provider->name); g_topology_assert(); - KASSERT(cp->provider->error != 0, - ("g_aes_orphan with error == 0")); gp = cp->geom; sc = gp->softc; - g_wither_geom(gp, cp->provider->error); + g_wither_geom(gp, ENXIO); bzero(sc, sizeof(struct g_aes_softc)); /* destroy evidence */ g_free(sc); return; diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c index 210f2ee0441..f3165a0578e 100644 --- a/sys/geom/geom_dev.c +++ b/sys/geom/geom_dev.c @@ -497,7 +497,7 @@ g_dev_strategy(struct bio *bp) * * Called from below when the provider orphaned us. * - Clear any dump settings. - * - Destroy the struct cdev *to prevent any more request from coming in. The + * - Destroy the struct cdev to prevent any more request from coming in. The * provider is already marked with an error, so anything which comes in * in the interrim will be returned immediately. * - Wait for any outstanding I/O to finish. diff --git a/sys/geom/geom_disk.c b/sys/geom/geom_disk.c index 8eb486a4b90..1d6f867ada3 100644 --- a/sys/geom/geom_disk.c +++ b/sys/geom/geom_disk.c @@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -65,6 +66,7 @@ struct g_disk_softc { struct sysctl_oid *sysctl_tree; char led[64]; uint32_t state; + struct task resize_task; }; static struct mtx g_disk_done_mtx; @@ -75,6 +77,7 @@ static g_fini_t g_disk_fini; static g_start_t g_disk_start; static g_ioctl_t g_disk_ioctl; static g_dumpconf_t g_disk_dumpconf; +static g_provgone_t g_disk_providergone; static struct g_class g_disk_class = { .name = "DISK", @@ -84,6 +87,7 @@ static struct g_class g_disk_class = { .start = g_disk_start, .access = g_disk_access, .ioctl = g_disk_ioctl, + .providergone = g_disk_providergone, .dumpconf = g_disk_dumpconf, }; @@ -442,6 +446,27 @@ g_disk_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, struct g } } +static void +g_disk_resize_task(void *context, int pending) +{ + struct g_geom *gp; + struct g_provider *pp; + struct disk *dp; + struct g_disk_softc *sc; + + sc = (struct g_disk_softc *)context; + dp = sc->dp; + gp = dp->d_geom; + + LIST_FOREACH(pp, &gp->provider, provider) { + if (pp->sectorsize != 0 && + pp->sectorsize != dp->d_sectorsize) + g_wither_provider(pp, ENXIO); + else + g_resize_provider(pp, dp->d_mediasize); + } +} + static void g_disk_create(void *arg, int flag) { @@ -482,11 +507,39 @@ g_disk_create(void *arg, int flag) CTLFLAG_RW | CTLFLAG_TUN, sc->led, sizeof(sc->led), "LED name"); } + TASK_INIT(&sc->resize_task, 0, g_disk_resize_task, sc); pp->private = sc; dp->d_geom = gp; g_error_provider(pp, 0); } +/* + * We get this callback after all of the consumers have gone away, and just + * before the provider is freed. If the disk driver provided a d_gone + * callback, let them know that it is okay to free resources -- they won't + * be getting any more accesses from GEOM. + */ +static void +g_disk_providergone(struct g_provider *pp) +{ + struct disk *dp; + struct g_disk_softc *sc; + + sc = (struct g_disk_softc *)pp->geom->softc; + + /* + * If the softc is already NULL, then we've probably been through + * g_disk_destroy already; there is nothing for us to do anyway. + */ + if (sc == NULL) + return; + + dp = sc->dp; + + if (dp->d_gone != NULL) + dp->d_gone(dp); +} + static void g_disk_destroy(void *ptr, int flag) { @@ -550,7 +603,7 @@ void disk_create(struct disk *dp, int version) { - if (version != DISK_VERSION_00 && version != DISK_VERSION_01) { + if (version != DISK_VERSION_02) { printf("WARNING: Attempt to add disk %s%d %s", dp->d_name, dp->d_unit, " using incompatible ABI version of disk(9)\n"); @@ -606,6 +659,24 @@ disk_attr_changed(struct disk *dp, const char *attr, int flag) (void)g_attr_changed(pp, attr, flag); } +void +disk_resize(struct disk *dp) +{ + struct g_geom *gp; + struct g_disk_softc *sc; + int error; + + gp = dp->d_geom; + + if (gp == NULL) + return; + + sc = gp->softc; + + error = taskqueue_enqueue(taskqueue_thread, &sc->resize_task); + KASSERT(error == 0, ("taskqueue_enqueue(9) failed.")); +} + static void g_kern_disks(void *p, int flag __unused) { diff --git a/sys/geom/geom_disk.h b/sys/geom/geom_disk.h index e92f4aa5cc7..4862fc5ad56 100644 --- a/sys/geom/geom_disk.h +++ b/sys/geom/geom_disk.h @@ -50,6 +50,7 @@ typedef int disk_open_t(struct disk *); typedef int disk_close_t(struct disk *); typedef void disk_strategy_t(struct bio *bp); typedef int disk_getattr_t(struct bio *bp); +typedef void disk_gone_t(struct disk *); typedef int disk_ioctl_t(struct disk *, u_long cmd, void *data, int fflag, struct thread *td); /* NB: disk_ioctl_t SHALL be cast'able to d_ioctl_t */ @@ -77,6 +78,7 @@ struct disk { disk_ioctl_t *d_ioctl; dumper_t *d_dump; disk_getattr_t *d_getattr; + disk_gone_t *d_gone; /* Info fields from driver to geom_disk.c. Valid when open */ u_int d_sectorsize; @@ -107,10 +109,12 @@ void disk_create(struct disk *disk, int version); void disk_destroy(struct disk *disk); void disk_gone(struct disk *disk); void disk_attr_changed(struct disk *dp, const char *attr, int flag); +void disk_resize(struct disk *dp); #define DISK_VERSION_00 0x58561059 #define DISK_VERSION_01 0x5856105a -#define DISK_VERSION DISK_VERSION_01 +#define DISK_VERSION_02 0x5856105b +#define DISK_VERSION DISK_VERSION_02 #endif /* _KERNEL */ #endif /* _GEOM_GEOM_DISK_H_ */ diff --git a/sys/geom/geom_flashmap.c b/sys/geom/geom_flashmap.c new file mode 100644 index 00000000000..341a5da9190 --- /dev/null +++ b/sys/geom/geom_flashmap.c @@ -0,0 +1,256 @@ +/*- + * Copyright (c) 2012 Semihalf + * Copyright (c) 2009 Jakub Klama + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define FLASHMAP_CLASS_NAME "Flashmap" + +struct g_flashmap_slice { + off_t sl_start; + off_t sl_end; + const char *sl_name; + + STAILQ_ENTRY(g_flashmap_slice) sl_link; +}; + +STAILQ_HEAD(g_flashmap_head, g_flashmap_slice); + +static void g_flashmap_print(struct g_flashmap_slice *); +static int g_flashmap_modify(struct g_geom *, const char *, + int, struct g_flashmap_head *); +static int g_flashmap_start(struct bio *); +static int g_flashmap_ioctl(struct g_provider *, u_long, void *, + int, struct thread *); +static void g_flashmap_dumpconf(struct sbuf *, const char *, + struct g_geom *, struct g_consumer *, struct g_provider *); +static struct g_geom *g_flashmap_taste(struct g_class *, + struct g_provider *, int); +static void g_flashmap_config(struct gctl_req *, struct g_class *, + const char *); +static int g_flashmap_load(device_t, struct g_flashmap_head *); + +MALLOC_DECLARE(M_FLASHMAP); +MALLOC_DEFINE(M_FLASHMAP, "geom_flashmap", "GEOM flash memory slicer class"); + +static void +g_flashmap_print(struct g_flashmap_slice *slice) +{ + + printf("%08jx-%08jx: %s (%juKB)\n", (uintmax_t)slice->sl_start, + (uintmax_t)slice->sl_end, slice->sl_name, + (uintmax_t)(slice->sl_end - slice->sl_start) / 1024); +} + +static int +g_flashmap_modify(struct g_geom *gp, const char *devname, int secsize, + struct g_flashmap_head *slices) +{ + struct g_flashmap_slice *slice; + int i, error; + + g_topology_assert(); + + i = 0; + STAILQ_FOREACH(slice, slices, sl_link) { + if (bootverbose) { + printf("%s: slice ", devname); + g_flashmap_print(slice); + } + + error = g_slice_config(gp, i++, G_SLICE_CONFIG_CHECK, + slice->sl_start, + slice->sl_end - slice->sl_start + 1, + secsize, "%ss.%s", gp->name, slice->sl_name); + + if (error) + return (error); + } + + i = 0; + STAILQ_FOREACH(slice, slices, sl_link) { + error = g_slice_config(gp, i++, G_SLICE_CONFIG_SET, + slice->sl_start, + slice->sl_end - slice->sl_start + 1, + secsize, "%ss.%s", gp->name, slice->sl_name); + + if (error) + return (error); + } + + return (0); +} + +static int +g_flashmap_start(struct bio *bp) +{ + + return (0); +} + +static void +g_flashmap_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, + struct g_consumer *cp __unused, struct g_provider *pp) +{ + struct g_slicer *gsp; + + gsp = gp->softc; + g_slice_dumpconf(sb, indent, gp, cp, pp); +} + +static int +g_flashmap_ioctl(struct g_provider *pp, u_long cmd, void *data, int fflag, + struct thread *td) +{ + struct g_consumer *cp; + struct g_geom *gp; + + if (cmd != NAND_IO_GET_CHIP_PARAM) + return (ENOIOCTL); + + cp = LIST_FIRST(&pp->geom->consumer); + if (cp == NULL) + return (ENOIOCTL); + gp = cp->provider->geom; + if (gp->ioctl == NULL) + return (ENOIOCTL); + + return (gp->ioctl(cp->provider, cmd, data, fflag, td)); +} + + +static struct g_geom * +g_flashmap_taste(struct g_class *mp, struct g_provider *pp, int flags) +{ + struct g_geom *gp = NULL; + struct g_consumer *cp; + struct g_flashmap_head head; + struct g_flashmap_slice *slice, *slice_temp; + device_t dev; + int nslices, size; + + g_trace(G_T_TOPOLOGY, "flashmap_taste(%s,%s)", mp->name, pp->name); + g_topology_assert(); + + if (flags == G_TF_NORMAL && + !strcmp(pp->geom->class->name, FLASHMAP_CLASS_NAME)) + return (NULL); + + gp = g_slice_new(mp, FLASH_SLICES_MAX_NUM, pp, &cp, NULL, 0, + g_flashmap_start); + if (gp == NULL) + return (NULL); + + STAILQ_INIT(&head); + + do { + size = sizeof(device_t); + if (g_io_getattr("NAND::device", cp, &size, &dev)) + break; + + nslices = g_flashmap_load(dev, &head); + if (nslices == 0) + break; + + g_flashmap_modify(gp, cp->provider->name, + cp->provider->sectorsize, &head); + } while (0); + + g_access(cp, -1, 0, 0); + + STAILQ_FOREACH_SAFE(slice, &head, sl_link, slice_temp) { + free(slice, M_FLASHMAP); + } + + if (LIST_EMPTY(&gp->provider)) { + g_slice_spoiled(cp); + return (NULL); + } + return (gp); +} + +static void +g_flashmap_config(struct gctl_req *req, struct g_class *mp, const char *verb) +{ + + gctl_error(req, "unknown config verb"); +} + +static int +g_flashmap_load(device_t dev, struct g_flashmap_head *head) +{ + struct flash_slice *slices; + struct g_flashmap_slice *slice; + uint32_t i, buf_size; + int nslices = 0; + + buf_size = sizeof(struct flash_slice) * FLASH_SLICES_MAX_NUM; + slices = malloc(buf_size, M_FLASHMAP, M_WAITOK | M_ZERO); + if (flash_fill_slices(dev, slices, &nslices) == 0) { + for (i = 0; i < nslices; i++) { + slice = malloc(sizeof(struct g_flashmap_slice), + M_FLASHMAP, M_WAITOK); + + slice->sl_name = slices[i].label; + slice->sl_start = slices[i].base; + slice->sl_end = slices[i].base + slices[i].size - 1; + + STAILQ_INSERT_TAIL(head, slice, sl_link); + } + } + + free(slices, M_FLASHMAP); + return (nslices); +} + +static struct g_class g_flashmap_class = { + .name = FLASHMAP_CLASS_NAME, + .version = G_VERSION, + .taste = g_flashmap_taste, + .dumpconf = g_flashmap_dumpconf, + .ioctl = g_flashmap_ioctl, + .ctlreq = g_flashmap_config, +}; + +DECLARE_GEOM_CLASS(g_flashmap_class, g_flashmap); diff --git a/sys/geom/geom_map.c b/sys/geom/geom_map.c index 7f1b24012ce..afc26b66633 100644 --- a/sys/geom/geom_map.c +++ b/sys/geom/geom_map.c @@ -119,13 +119,13 @@ g_map_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, g_slice_dumpconf(sb, indent, gp, cp, pp); if (pp != NULL) { if (indent == NULL) { - sbuf_printf(sb, " entry %lld", sc->entry[pp->index]); - sbuf_printf(sb, " dsize %lld", sc->dsize[pp->index]); + sbuf_printf(sb, " entry %jd", (intmax_t)sc->entry[pp->index]); + sbuf_printf(sb, " dsize %jd", (intmax_t)sc->dsize[pp->index]); } else { - sbuf_printf(sb, "%s%lld\n", indent, - sc->entry[pp->index]); - sbuf_printf(sb, "%s%lld\n", indent, - sc->dsize[pp->index]); + sbuf_printf(sb, "%s%jd\n", indent, + (intmax_t)sc->entry[pp->index]); + sbuf_printf(sb, "%s%jd\n", indent, + (intmax_t)sc->dsize[pp->index]); } } } @@ -153,8 +153,8 @@ find_marker(struct g_consumer *cp, const char *line, off_t *offset) return (1); if (bootverbose) { - printf("MAP: search key \"%s\" from 0x%llx, step 0x%llx\n", - search_key, search_start, search_step); + printf("MAP: search key \"%s\" from 0x%jx, step 0x%jx\n", + search_key, (intmax_t)search_start, (intmax_t)search_step); } /* error if search_key is empty */ @@ -321,9 +321,10 @@ g_map_parse_part(struct g_class *mp, struct g_provider *pp, } if (bootverbose) { - printf("MAP: %llxx%llx, data=%llxx%llx " + printf("MAP: %jxx%jx, data=%jxx%jx " "\"/dev/map/%s\"\n", - start, size, offset, dsize, name); + (intmax_t)start, (intmax_t)size, (intmax_t)offset, + (intmax_t)dsize, name); } sc->offset[i] = start; diff --git a/sys/geom/geom_slice.c b/sys/geom/geom_slice.c index 8a490180a68..407afdc1b8f 100644 --- a/sys/geom/geom_slice.c +++ b/sys/geom/geom_slice.c @@ -522,10 +522,8 @@ g_slice_orphan(struct g_consumer *cp) g_trace(G_T_TOPOLOGY, "g_slice_orphan(%p/%s)", cp, cp->provider->name); g_topology_assert(); - KASSERT(cp->provider->error != 0, - ("g_slice_orphan with error == 0")); /* XXX: Not good enough we leak the softc and its suballocations */ g_slice_free(cp->geom->softc); - g_wither_geom(cp->geom, cp->provider->error); + g_wither_geom(cp->geom, ENXIO); } diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c index 6e2589b023f..37a9ce09c0f 100644 --- a/sys/geom/geom_subr.c +++ b/sys/geom/geom_subr.c @@ -68,9 +68,11 @@ static struct g_tailq_head geoms = TAILQ_HEAD_INITIALIZER(geoms); char *g_wait_event, *g_wait_up, *g_wait_down, *g_wait_sim; struct g_hh00 { - struct g_class *mp; - int error; - int post; + struct g_class *mp; + struct g_provider *pp; + off_t size; + int error; + int post; }; /* @@ -351,10 +353,12 @@ g_new_geomf(struct g_class *mp, const char *fmt, ...) gp->start = mp->start; gp->spoiled = mp->spoiled; gp->attrchanged = mp->attrchanged; + gp->providergone = mp->providergone; gp->dumpconf = mp->dumpconf; gp->access = mp->access; gp->orphan = mp->orphan; gp->ioctl = mp->ioctl; + gp->resize = mp->resize; return (gp); } @@ -600,6 +604,76 @@ g_error_provider(struct g_provider *pp, int error) pp->error = error; } +static void +g_resize_provider_event(void *arg, int flag) +{ + struct g_hh00 *hh; + struct g_class *mp; + struct g_geom *gp; + struct g_provider *pp; + struct g_consumer *cp, *cp2; + off_t size; + + g_topology_assert(); + if (flag == EV_CANCEL) + return; + if (g_shutdown) + return; + + hh = arg; + pp = hh->pp; + size = hh->size; + + G_VALID_PROVIDER(pp); + g_trace(G_T_TOPOLOGY, "g_resize_provider_event(%p)", pp); + + LIST_FOREACH_SAFE(cp, &pp->consumers, consumers, cp2) { + gp = cp->geom; + if (gp->resize == NULL && size < pp->mediasize) + cp->geom->orphan(cp); + } + + pp->mediasize = size; + + LIST_FOREACH_SAFE(cp, &pp->consumers, consumers, cp2) { + gp = cp->geom; + if (gp->resize != NULL) + gp->resize(cp); + } + + /* + * After resizing, the previously invalid GEOM class metadata + * might become valid. This means we should retaste. + */ + LIST_FOREACH(mp, &g_classes, class) { + if (mp->taste == NULL) + continue; + LIST_FOREACH(cp, &pp->consumers, consumers) + if (cp->geom->class == mp) + break; + if (cp != NULL) + continue; + mp->taste(mp, pp, 0); + g_topology_assert(); + } +} + +void +g_resize_provider(struct g_provider *pp, off_t size) +{ + struct g_hh00 *hh; + + G_VALID_PROVIDER(pp); + + if (size == pp->mediasize) + return; + + hh = g_malloc(sizeof *hh, M_WAITOK | M_ZERO); + hh->pp = pp; + hh->size = size; + g_post_event(g_resize_provider_event, hh, M_WAITOK, NULL); +} + struct g_provider * g_provider_by_name(char const *arg) { @@ -634,6 +708,13 @@ g_destroy_provider(struct g_provider *pp) LIST_REMOVE(pp, provider); gp = pp->geom; devstat_remove_entry(pp->stat); + /* + * If a callback was provided, send notification that the provider + * is now gone. + */ + if (gp->providergone != NULL) + gp->providergone(pp); + g_free(pp); if ((gp->flags & G_GEOM_WITHER)) g_do_wither(); diff --git a/sys/geom/label/g_label_ufs.c b/sys/geom/label/g_label_ufs.c index b9b04437f0a..6a313e228a9 100644 --- a/sys/geom/label/g_label_ufs.c +++ b/sys/geom/label/g_label_ufs.c @@ -81,7 +81,11 @@ g_label_ufs_taste_common(struct g_consumer *cp, char *label, size_t size, int wh fs = (struct fs *)g_read_data(cp, superblock, SBLOCKSIZE, NULL); if (fs == NULL) continue; - /* Check for magic and make sure things are the right size */ + /* Check for magic. We also need to check if file system size is equal + * to providers size, because sysinstall(8) used to bogusly put first + * partition at offset 0 instead of 16, and glabel/ufs would find file + * system on slice instead of partition. + */ if (fs->fs_magic == FS_UFS1_MAGIC && fs->fs_fsize > 0 && pp->mediasize / fs->fs_fsize == fs->fs_old_size) { /* Valid UFS1. */ diff --git a/sys/geom/mirror/g_mirror.c b/sys/geom/mirror/g_mirror.c index 1eb46deaedc..3f60fd25549 100644 --- a/sys/geom/mirror/g_mirror.c +++ b/sys/geom/mirror/g_mirror.c @@ -440,7 +440,7 @@ g_mirror_init_disk(struct g_mirror_softc *sc, struct g_provider *pp, struct g_mirror_metadata *md, int *errorp) { struct g_mirror_disk *disk; - int error; + int i, error; disk = malloc(sizeof(*disk), M_MIRROR, M_NOWAIT | M_ZERO); if (disk == NULL) { @@ -455,6 +455,11 @@ g_mirror_init_disk(struct g_mirror_softc *sc, struct g_provider *pp, disk->d_state = G_MIRROR_DISK_STATE_NONE; disk->d_priority = md->md_priority; disk->d_flags = md->md_dflags; + error = g_getattr("GEOM::candelete", disk->d_consumer, &i); + if (error != 0) + goto fail; + if (i) + disk->d_flags |= G_MIRROR_DISK_FLAG_CANDELETE; if (md->md_provider[0] != '\0') disk->d_flags |= G_MIRROR_DISK_FLAG_HARDCODED; disk->d_sync.ds_consumer = NULL; @@ -891,7 +896,8 @@ g_mirror_regular_request(struct bio *bp) if (pbp->bio_children == pbp->bio_inbed) { G_MIRROR_LOGREQ(3, pbp, "Request delivered."); pbp->bio_completed = pbp->bio_length; - if (pbp->bio_cmd == BIO_WRITE) { + if (pbp->bio_cmd == BIO_WRITE || + pbp->bio_cmd == BIO_DELETE) { bioq_remove(&sc->sc_inflight, pbp); /* Release delayed sync requests if possible. */ g_mirror_sync_release(sc); @@ -1084,7 +1090,9 @@ g_mirror_start(struct bio *bp) g_mirror_flush(sc, bp); return; case BIO_GETATTR: - if (strcmp("GEOM::kerneldump", bp->bio_attribute) == 0) { + if (g_handleattr_int(bp, "GEOM::candelete", 1)) + return; + else if (strcmp("GEOM::kerneldump", bp->bio_attribute) == 0) { g_mirror_kernel_dump(bp); return; } @@ -1631,6 +1639,9 @@ g_mirror_register_request(struct bio *bp) default: continue; } + if (bp->bio_cmd == BIO_DELETE && + (disk->d_flags & G_MIRROR_DISK_FLAG_CANDELETE) == 0) + continue; cbp = g_clone_bio(bp); if (cbp == NULL) { for (cbp = bioq_first(&queue); cbp != NULL; @@ -1693,6 +1704,8 @@ g_mirror_can_destroy(struct g_mirror_softc *sc) gp = sc->sc_geom; if (gp->softc == NULL) return (1); + if ((sc->sc_flags & G_MIRROR_DEVICE_FLAG_TASTING) != 0) + return (0); LIST_FOREACH(cp, &gp->consumer, consumer) { if (g_mirror_is_busy(sc, cp)) return (0); @@ -3054,6 +3067,7 @@ g_mirror_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) G_MIRROR_DEBUG(1, "Adding disk %s to %s.", pp->name, gp->name); g_topology_unlock(); sx_xlock(&sc->sc_lock); + sc->sc_flags |= G_MIRROR_DEVICE_FLAG_TASTING; error = g_mirror_add_disk(sc, pp, &md); if (error != 0) { G_MIRROR_DEBUG(0, "Cannot add disk %s to %s (error=%d).", @@ -3066,6 +3080,12 @@ g_mirror_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) } gp = NULL; } + sc->sc_flags &= ~G_MIRROR_DEVICE_FLAG_TASTING; + if ((sc->sc_flags & G_MIRROR_DEVICE_FLAG_DESTROY) != 0) { + g_mirror_destroy(sc, G_MIRROR_DESTROY_HARD); + g_topology_lock(); + return (NULL); + } sx_xunlock(&sc->sc_lock); g_topology_lock(); return (gp); diff --git a/sys/geom/mirror/g_mirror.h b/sys/geom/mirror/g_mirror.h index 8cd9a691e40..44ea18adbf1 100644 --- a/sys/geom/mirror/g_mirror.h +++ b/sys/geom/mirror/g_mirror.h @@ -59,10 +59,12 @@ #define G_MIRROR_DISK_FLAG_INACTIVE 0x0000000000000008ULL #define G_MIRROR_DISK_FLAG_HARDCODED 0x0000000000000010ULL #define G_MIRROR_DISK_FLAG_BROKEN 0x0000000000000020ULL +#define G_MIRROR_DISK_FLAG_CANDELETE 0x0000000000000040ULL #define G_MIRROR_DISK_FLAG_MASK (G_MIRROR_DISK_FLAG_DIRTY | \ G_MIRROR_DISK_FLAG_SYNCHRONIZING | \ G_MIRROR_DISK_FLAG_FORCE_SYNC | \ - G_MIRROR_DISK_FLAG_INACTIVE) + G_MIRROR_DISK_FLAG_INACTIVE | \ + G_MIRROR_DISK_FLAG_CANDELETE) #define G_MIRROR_DEVICE_FLAG_NOAUTOSYNC 0x0000000000000001ULL #define G_MIRROR_DEVICE_FLAG_NOFAILSYNC 0x0000000000000002ULL @@ -157,6 +159,7 @@ struct g_mirror_event { #define G_MIRROR_DEVICE_FLAG_DESTROY 0x0100000000000000ULL #define G_MIRROR_DEVICE_FLAG_WAIT 0x0200000000000000ULL #define G_MIRROR_DEVICE_FLAG_DESTROYING 0x0400000000000000ULL +#define G_MIRROR_DEVICE_FLAG_TASTING 0x0800000000000000ULL #define G_MIRROR_DEVICE_STATE_STARTING 0 #define G_MIRROR_DEVICE_STATE_RUNNING 1 diff --git a/sys/geom/mirror/g_mirror_ctl.c b/sys/geom/mirror/g_mirror_ctl.c index dc59e185133..c024bd9d318 100644 --- a/sys/geom/mirror/g_mirror_ctl.c +++ b/sys/geom/mirror/g_mirror_ctl.c @@ -560,7 +560,7 @@ g_mirror_ctl_remove(struct gctl_req *req, struct g_class *mp) const char *name; char param[16]; int *nargs; - u_int i; + u_int i, active; nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs)); if (nargs == NULL) { @@ -587,6 +587,7 @@ g_mirror_ctl_remove(struct gctl_req *req, struct g_class *mp) "first."); return; } + active = g_mirror_ndisks(sc, G_MIRROR_DISK_STATE_ACTIVE); for (i = 1; i < (u_int)*nargs; i++) { snprintf(param, sizeof(param), "arg%u", i); name = gctl_get_asciiparam(req, param); @@ -599,6 +600,16 @@ g_mirror_ctl_remove(struct gctl_req *req, struct g_class *mp) gctl_error(req, "No such provider: %s.", name); continue; } + if (disk->d_state == G_MIRROR_DISK_STATE_ACTIVE) { + if (active > 1) + active--; + else { + gctl_error(req, "%s: Can't remove the last " + "ACTIVE component %s.", sc->sc_geom->name, + name); + continue; + } + } g_mirror_event_send(disk, G_MIRROR_DISK_STATE_DESTROY, G_MIRROR_EVENT_DONTWAIT); } diff --git a/sys/geom/mountver/g_mountver.c b/sys/geom/mountver/g_mountver.c index 37cb924de1e..6858b315d08 100644 --- a/sys/geom/mountver/g_mountver.c +++ b/sys/geom/mountver/g_mountver.c @@ -59,6 +59,7 @@ static eventhandler_tag g_mountver_pre_sync = NULL; static void g_mountver_queue(struct bio *bp); static void g_mountver_orphan(struct g_consumer *cp); +static void g_mountver_resize(struct g_consumer *cp); static int g_mountver_destroy(struct g_geom *gp, boolean_t force); static g_taste_t g_mountver_taste; static int g_mountver_destroy_geom(struct gctl_req *req, struct g_class *mp, @@ -257,6 +258,7 @@ g_mountver_create(struct gctl_req *req, struct g_class *mp, struct g_provider *p gp->softc = sc; gp->start = g_mountver_start; gp->orphan = g_mountver_orphan; + gp->resize = g_mountver_resize; gp->access = g_mountver_access; gp->dumpconf = g_mountver_dumpconf; @@ -457,6 +459,18 @@ g_mountver_orphan(struct g_consumer *cp) G_MOUNTVER_DEBUG(0, "%s is offline. Mount verification in progress.", sc->sc_provider_name); } +static void +g_mountver_resize(struct g_consumer *cp) +{ + struct g_geom *gp; + struct g_provider *pp; + + gp = cp->geom; + + LIST_FOREACH(pp, &gp->provider, provider) + g_resize_provider(pp, cp->provider->mediasize); +} + static int g_mountver_ident_matches(struct g_geom *gp) { diff --git a/sys/geom/multipath/g_multipath.c b/sys/geom/multipath/g_multipath.c index 74bbb13ca63..913dad775fe 100644 --- a/sys/geom/multipath/g_multipath.c +++ b/sys/geom/multipath/g_multipath.c @@ -944,7 +944,7 @@ g_multipath_ctl_configure(struct gctl_req *req, struct g_class *mp) struct g_geom *gp; struct g_consumer *cp; struct g_provider *pp; - struct g_multipath_metadata *md; + struct g_multipath_metadata md; const char *name; int error, *val; void *buf; @@ -980,14 +980,15 @@ g_multipath_ctl_configure(struct gctl_req *req, struct g_class *mp) return; } g_topology_unlock(); - md = buf = g_malloc(pp->sectorsize, M_WAITOK | M_ZERO); - strlcpy(md->md_magic, G_MULTIPATH_MAGIC, sizeof(md->md_magic)); - memcpy(md->md_uuid, sc->sc_uuid, sizeof (sc->sc_uuid)); - strlcpy(md->md_name, name, sizeof(md->md_name)); - md->md_version = G_MULTIPATH_VERSION; - md->md_size = pp->mediasize; - md->md_sectorsize = pp->sectorsize; - md->md_active_active = sc->sc_active_active; + buf = g_malloc(pp->sectorsize, M_WAITOK | M_ZERO); + strlcpy(md.md_magic, G_MULTIPATH_MAGIC, sizeof(md.md_magic)); + memcpy(md.md_uuid, sc->sc_uuid, sizeof (sc->sc_uuid)); + strlcpy(md.md_name, name, sizeof(md.md_name)); + md.md_version = G_MULTIPATH_VERSION; + md.md_size = pp->mediasize; + md.md_sectorsize = pp->sectorsize; + md.md_active_active = sc->sc_active_active; + multipath_metadata_encode(&md, buf); error = g_write_data(cp, pp->mediasize - pp->sectorsize, buf, pp->sectorsize); g_topology_lock(); @@ -1313,7 +1314,7 @@ g_multipath_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, if (sc == NULL) return; if (cp != NULL) { - sbuf_printf(sb, "%s%s", indent, + sbuf_printf(sb, "%s%s\n", indent, (cp->index & MP_NEW) ? "NEW" : (cp->index & MP_LOST) ? "LOST" : (cp->index & MP_FAIL) ? "FAIL" : @@ -1322,17 +1323,17 @@ g_multipath_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, sc->sc_active_active == 2 ? "READ" : "PASSIVE"); } else { good = g_multipath_good(gp); - sbuf_printf(sb, "%s%s", indent, + sbuf_printf(sb, "%s%s\n", indent, good == 0 ? "BROKEN" : (good != sc->sc_ndisks || sc->sc_ndisks == 1) ? "DEGRADED" : "OPTIMAL"); } if (cp == NULL && pp == NULL) { - sbuf_printf(sb, "%s%s", indent, sc->sc_uuid); - sbuf_printf(sb, "%sActive/%s", indent, + sbuf_printf(sb, "%s%s\n", indent, sc->sc_uuid); + sbuf_printf(sb, "%sActive/%s\n", indent, sc->sc_active_active == 2 ? "Read" : sc->sc_active_active == 1 ? "Active" : "Passive"); - sbuf_printf(sb, "%s%s", indent, + sbuf_printf(sb, "%s%s\n", indent, sc->sc_uuid[0] == 0 ? "MANUAL" : "AUTOMATIC"); } } diff --git a/sys/geom/nop/g_nop.c b/sys/geom/nop/g_nop.c index c28a77fc292..c43fb2d713a 100644 --- a/sys/geom/nop/g_nop.c +++ b/sys/geom/nop/g_nop.c @@ -71,6 +71,30 @@ g_nop_orphan(struct g_consumer *cp) g_nop_destroy(cp->geom, 1); } +static void +g_nop_resize(struct g_consumer *cp) +{ + struct g_nop_softc *sc; + struct g_geom *gp; + struct g_provider *pp; + off_t size; + + g_topology_assert(); + + gp = cp->geom; + sc = gp->softc; + + if (sc->sc_explicitsize != 0) + return; + if (cp->provider->mediasize < sc->sc_offset) { + g_nop_destroy(gp, 1); + return; + } + size = cp->provider->mediasize - sc->sc_offset; + LIST_FOREACH(pp, &gp->provider, provider) + g_resize_provider(pp, size); +} + static void g_nop_start(struct bio *bp) { @@ -146,6 +170,7 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp, struct g_consumer *cp; char name[64]; int error; + off_t explicitsize; g_topology_assert(); @@ -165,6 +190,7 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp, gctl_error(req, "Invalid offset for provider %s.", pp->name); return (EINVAL); } + explicitsize = size; if (size == 0) size = pp->mediasize - offset; if (offset + size > pp->mediasize) { @@ -192,6 +218,7 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp, gp = g_new_geomf(mp, name); sc = g_malloc(sizeof(*sc), M_WAITOK); sc->sc_offset = offset; + sc->sc_explicitsize = explicitsize; sc->sc_error = ioerror; sc->sc_rfailprob = rfailprob; sc->sc_wfailprob = wfailprob; @@ -202,6 +229,7 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp, gp->softc = sc; gp->start = g_nop_start; gp->orphan = g_nop_orphan; + gp->resize = g_nop_resize; gp->access = g_nop_access; gp->dumpconf = g_nop_dumpconf; diff --git a/sys/geom/nop/g_nop.h b/sys/geom/nop/g_nop.h index fa66f597216..4bfc4e16680 100644 --- a/sys/geom/nop/g_nop.h +++ b/sys/geom/nop/g_nop.h @@ -57,6 +57,7 @@ struct g_nop_softc { int sc_error; off_t sc_offset; + off_t sc_explicitsize; u_int sc_rfailprob; u_int sc_wfailprob; uintmax_t sc_reads; diff --git a/sys/geom/part/g_part.c b/sys/geom/part/g_part.c index a21fe2600ad..8d86c4a3e3b 100644 --- a/sys/geom/part/g_part.c +++ b/sys/geom/part/g_part.c @@ -83,6 +83,7 @@ struct g_part_alias_list { { "fat32", G_PART_ALIAS_MS_FAT32 }, { "freebsd", G_PART_ALIAS_FREEBSD }, { "freebsd-boot", G_PART_ALIAS_FREEBSD_BOOT }, + { "freebsd-nandfs", G_PART_ALIAS_FREEBSD_NANDFS }, { "freebsd-swap", G_PART_ALIAS_FREEBSD_SWAP }, { "freebsd-ufs", G_PART_ALIAS_FREEBSD_UFS }, { "freebsd-vinum", G_PART_ALIAS_FREEBSD_VINUM }, diff --git a/sys/geom/part/g_part.h b/sys/geom/part/g_part.h index e475a3e7296..39bcc9df9ff 100644 --- a/sys/geom/part/g_part.h +++ b/sys/geom/part/g_part.h @@ -46,6 +46,7 @@ enum g_part_alias { G_PART_ALIAS_EFI, /* A EFI system partition entry. */ G_PART_ALIAS_FREEBSD, /* A BSD labeled partition entry. */ G_PART_ALIAS_FREEBSD_BOOT, /* A FreeBSD boot partition entry. */ + G_PART_ALIAS_FREEBSD_NANDFS, /* A FreeBSD nandfs partition entry. */ G_PART_ALIAS_FREEBSD_SWAP, /* A swap partition entry. */ G_PART_ALIAS_FREEBSD_UFS, /* A UFS/UFS2 file system entry. */ G_PART_ALIAS_FREEBSD_VINUM, /* A Vinum partition entry. */ diff --git a/sys/geom/part/g_part_apm.c b/sys/geom/part/g_part_apm.c index d99ddda7ac7..35d0e3c3046 100644 --- a/sys/geom/part/g_part_apm.c +++ b/sys/geom/part/g_part_apm.c @@ -159,6 +159,11 @@ apm_parse_type(const char *type, char *buf, size_t bufsz) strcpy(buf, APM_ENT_TYPE_FREEBSD); return (0); } + alias = g_part_alias_name(G_PART_ALIAS_FREEBSD_NANDFS); + if (!strcasecmp(type, alias)) { + strcpy(buf, APM_ENT_TYPE_FREEBSD_NANDFS); + return (0); + } alias = g_part_alias_name(G_PART_ALIAS_FREEBSD_SWAP); if (!strcasecmp(type, alias)) { strcpy(buf, APM_ENT_TYPE_FREEBSD_SWAP); @@ -485,6 +490,8 @@ g_part_apm_type(struct g_part_table *basetable, struct g_part_entry *baseentry, return (g_part_alias_name(G_PART_ALIAS_APPLE_UFS)); if (!strcmp(type, APM_ENT_TYPE_FREEBSD)) return (g_part_alias_name(G_PART_ALIAS_FREEBSD)); + if (!strcmp(type, APM_ENT_TYPE_FREEBSD_NANDFS)) + return (g_part_alias_name(G_PART_ALIAS_FREEBSD_NANDFS)); if (!strcmp(type, APM_ENT_TYPE_FREEBSD_SWAP)) return (g_part_alias_name(G_PART_ALIAS_FREEBSD_SWAP)); if (!strcmp(type, APM_ENT_TYPE_FREEBSD_UFS)) diff --git a/sys/geom/part/g_part_bsd.c b/sys/geom/part/g_part_bsd.c index f638216eaac..a53781c7c52 100644 --- a/sys/geom/part/g_part_bsd.c +++ b/sys/geom/part/g_part_bsd.c @@ -126,6 +126,11 @@ bsd_parse_type(const char *type, uint8_t *fstype) *fstype = (u_int)lt; return (0); } + alias = g_part_alias_name(G_PART_ALIAS_FREEBSD_NANDFS); + if (!strcasecmp(type, alias)) { + *fstype = FS_NANDFS; + return (0); + } alias = g_part_alias_name(G_PART_ALIAS_FREEBSD_SWAP); if (!strcasecmp(type, alias)) { *fstype = FS_SWAP; @@ -450,6 +455,8 @@ g_part_bsd_type(struct g_part_table *basetable, struct g_part_entry *baseentry, entry = (struct g_part_bsd_entry *)baseentry; type = entry->part.p_fstype; + if (type == FS_NANDFS) + return (g_part_alias_name(G_PART_ALIAS_FREEBSD_NANDFS)); if (type == FS_SWAP) return (g_part_alias_name(G_PART_ALIAS_FREEBSD_SWAP)); if (type == FS_BSDFFS) diff --git a/sys/geom/part/g_part_gpt.c b/sys/geom/part/g_part_gpt.c index 559b6163836..405b49212e2 100644 --- a/sys/geom/part/g_part_gpt.c +++ b/sys/geom/part/g_part_gpt.c @@ -155,6 +155,7 @@ static struct uuid gpt_uuid_bios_boot = GPT_ENT_TYPE_BIOS_BOOT; static struct uuid gpt_uuid_efi = GPT_ENT_TYPE_EFI; static struct uuid gpt_uuid_freebsd = GPT_ENT_TYPE_FREEBSD; static struct uuid gpt_uuid_freebsd_boot = GPT_ENT_TYPE_FREEBSD_BOOT; +static struct uuid gpt_uuid_freebsd_nandfs = GPT_ENT_TYPE_FREEBSD_NANDFS; static struct uuid gpt_uuid_freebsd_swap = GPT_ENT_TYPE_FREEBSD_SWAP; static struct uuid gpt_uuid_freebsd_ufs = GPT_ENT_TYPE_FREEBSD_UFS; static struct uuid gpt_uuid_freebsd_vinum = GPT_ENT_TYPE_FREEBSD_VINUM; @@ -195,6 +196,7 @@ static struct g_part_uuid_alias { { &gpt_uuid_efi, G_PART_ALIAS_EFI, 0xee }, { &gpt_uuid_freebsd, G_PART_ALIAS_FREEBSD, 0xa5 }, { &gpt_uuid_freebsd_boot, G_PART_ALIAS_FREEBSD_BOOT, 0 }, + { &gpt_uuid_freebsd_nandfs, G_PART_ALIAS_FREEBSD_NANDFS, 0 }, { &gpt_uuid_freebsd_swap, G_PART_ALIAS_FREEBSD_SWAP, 0 }, { &gpt_uuid_freebsd_ufs, G_PART_ALIAS_FREEBSD_UFS, 0 }, { &gpt_uuid_freebsd_vinum, G_PART_ALIAS_FREEBSD_VINUM, 0 }, @@ -339,9 +341,6 @@ gpt_update_bootcamp(struct g_part_table *basetable) disable: table->bootcamp = 0; - bzero(table->mbr + DOSPARTOFF, DOSPARTSIZE * NDOSPART); - gpt_write_mbr_entry(table->mbr, 0, 0xee, 1ull, - MIN(table->lba[GPT_ELT_SECHDR], UINT32_MAX)); } static struct gpt_hdr * @@ -587,10 +586,6 @@ g_part_gpt_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp) codesz = MIN(codesz, gpp->gpp_codesize); if (codesz > 0) bcopy(gpp->gpp_codeptr, table->mbr, codesz); - - /* Mark the PMBR active since some BIOS require it. */ - if (!table->bootcamp) - table->mbr[DOSPARTOFF] = 0x80; /* status */ return (0); } @@ -599,7 +594,6 @@ g_part_gpt_create(struct g_part_table *basetable, struct g_part_parms *gpp) { struct g_provider *pp; struct g_part_gpt_table *table; - quad_t last; size_t tblsz; /* We don't nest, which means that our depth should be 0. */ @@ -615,11 +609,6 @@ g_part_gpt_create(struct g_part_table *basetable, struct g_part_parms *gpp) pp->sectorsize) return (ENOSPC); - last = (pp->mediasize / pp->sectorsize) - 1; - - le16enc(table->mbr + DOSMAGICOFFSET, DOSMAGIC); - gpt_write_mbr_entry(table->mbr, 0, 0xee, 1, MIN(last, UINT32_MAX)); - /* Allocate space for the header */ table->hdr = g_malloc(sizeof(struct gpt_hdr), M_WAITOK | M_ZERO); @@ -1045,6 +1034,16 @@ g_part_gpt_write(struct g_part_table *basetable, struct g_consumer *cp) if (table->bootcamp) gpt_update_bootcamp(basetable); + /* Update partition entries in the PMBR if Boot Camp disabled. */ + if (!table->bootcamp) { + bzero(table->mbr + DOSPARTOFF, DOSPARTSIZE * NDOSPART); + gpt_write_mbr_entry(table->mbr, 0, 0xee, 1, + MIN(pp->mediasize / pp->sectorsize - 1, UINT32_MAX)); + /* Mark the PMBR active since some BIOS require it. */ + table->mbr[DOSPARTOFF] = 0x80; + } + le16enc(table->mbr + DOSMAGICOFFSET, DOSMAGIC); + /* Write the PMBR */ buf = g_malloc(pp->sectorsize, M_WAITOK | M_ZERO); bcopy(table->mbr, buf, MBRSIZE); diff --git a/sys/geom/part/g_part_vtoc8.c b/sys/geom/part/g_part_vtoc8.c index 0c442a73630..e993eff6bee 100644 --- a/sys/geom/part/g_part_vtoc8.c +++ b/sys/geom/part/g_part_vtoc8.c @@ -114,6 +114,11 @@ vtoc8_parse_type(const char *type, uint16_t *tag) *tag = (uint16_t)lt; return (0); } + alias = g_part_alias_name(G_PART_ALIAS_FREEBSD_NANDFS); + if (!strcasecmp(type, alias)) { + *tag = VTOC_TAG_FREEBSD_NANDFS; + return (0); + } alias = g_part_alias_name(G_PART_ALIAS_FREEBSD_SWAP); if (!strcasecmp(type, alias)) { *tag = VTOC_TAG_FREEBSD_SWAP; @@ -487,6 +492,8 @@ g_part_vtoc8_type(struct g_part_table *basetable, struct g_part_entry *entry, table = (struct g_part_vtoc8_table *)basetable; tag = be16dec(&table->vtoc.part[entry->gpe_index - 1].tag); + if (tag == VTOC_TAG_FREEBSD_NANDFS) + return (g_part_alias_name(G_PART_ALIAS_FREEBSD_NANDFS)); if (tag == VTOC_TAG_FREEBSD_SWAP) return (g_part_alias_name(G_PART_ALIAS_FREEBSD_SWAP)); if (tag == VTOC_TAG_FREEBSD_UFS) diff --git a/sys/geom/raid/g_raid.c b/sys/geom/raid/g_raid.c index 31b9f3401a9..c3b627f15fc 100644 --- a/sys/geom/raid/g_raid.c +++ b/sys/geom/raid/g_raid.c @@ -376,17 +376,17 @@ g_raid_volume_str2level(const char *str, int *level, int *qual) else if (strcasecmp(str, "RAID3-P0") == 0) { *level = G_RAID_VOLUME_RL_RAID3; *qual = G_RAID_VOLUME_RLQ_R3P0; - } else if (strcasecmp(str, "RAID3-PN") == 0 && + } else if (strcasecmp(str, "RAID3-PN") == 0 || strcasecmp(str, "RAID3") == 0) { *level = G_RAID_VOLUME_RL_RAID3; - *qual = G_RAID_VOLUME_RLQ_R3P0; + *qual = G_RAID_VOLUME_RLQ_R3PN; } else if (strcasecmp(str, "RAID4-P0") == 0) { *level = G_RAID_VOLUME_RL_RAID4; *qual = G_RAID_VOLUME_RLQ_R4P0; - } else if (strcasecmp(str, "RAID4-PN") == 0 && + } else if (strcasecmp(str, "RAID4-PN") == 0 || strcasecmp(str, "RAID4") == 0) { *level = G_RAID_VOLUME_RL_RAID4; - *qual = G_RAID_VOLUME_RLQ_R4P0; + *qual = G_RAID_VOLUME_RLQ_R4PN; } else if (strcasecmp(str, "RAID5-RA") == 0) { *level = G_RAID_VOLUME_RL_RAID5; *qual = G_RAID_VOLUME_RLQ_R5RA; @@ -1823,8 +1823,8 @@ g_raid_create_node(struct g_class *mp, sc->sc_flags = 0; TAILQ_INIT(&sc->sc_volumes); TAILQ_INIT(&sc->sc_disks); - sx_init(&sc->sc_lock, "gmirror:lock"); - mtx_init(&sc->sc_queue_mtx, "gmirror:queue", NULL, MTX_DEF); + sx_init(&sc->sc_lock, "graid:lock"); + mtx_init(&sc->sc_queue_mtx, "graid:queue", NULL, MTX_DEF); TAILQ_INIT(&sc->sc_events); bioq_init(&sc->sc_queue); gp->softc = sc; @@ -1856,6 +1856,7 @@ g_raid_create_volume(struct g_raid_softc *sc, const char *name, int id) vol->v_state = G_RAID_VOLUME_S_STARTING; vol->v_raid_level = G_RAID_VOLUME_RL_UNKNOWN; vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_UNKNOWN; + vol->v_rotate_parity = 1; bioq_init(&vol->v_inflight); bioq_init(&vol->v_locked); LIST_INIT(&vol->v_locks); @@ -2143,7 +2144,7 @@ g_raid_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) g_trace(G_T_TOPOLOGY, "%s(%s, %s)", __func__, mp->name, pp->name); G_RAID_DEBUG(2, "Tasting provider %s.", pp->name); - gp = g_new_geomf(mp, "mirror:taste"); + gp = g_new_geomf(mp, "raid:taste"); /* * This orphan function should be never called. */ @@ -2173,7 +2174,8 @@ g_raid_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) } int -g_raid_create_node_format(const char *format, struct g_geom **gp) +g_raid_create_node_format(const char *format, struct gctl_req *req, + struct g_geom **gp) { struct g_raid_md_class *class; struct g_raid_md_object *obj; @@ -2191,7 +2193,7 @@ g_raid_create_node_format(const char *format, struct g_geom **gp) obj = (void *)kobj_create((kobj_class_t)class, M_RAID, M_WAITOK); obj->mdo_class = class; - status = G_RAID_MD_CREATE(obj, &g_raid_class, gp); + status = G_RAID_MD_CREATE_REQ(obj, &g_raid_class, req, gp); if (status != G_RAID_MD_TASTE_NEW) kobj_delete((kobj_t)obj, M_RAID); return (status); diff --git a/sys/geom/raid/g_raid.h b/sys/geom/raid/g_raid.h index 157232013f4..a981f2affb8 100644 --- a/sys/geom/raid/g_raid.h +++ b/sys/geom/raid/g_raid.h @@ -278,7 +278,13 @@ struct g_raid_volume { u_int v_raid_level; /* Array RAID level. */ u_int v_raid_level_qualifier; /* RAID level det. */ u_int v_disks_count; /* Number of disks in array. */ + u_int v_mdf_pdisks; /* Number of parity disks + in RAIDMDF array. */ + uint16_t v_mdf_polynomial; /* Polynomial for RAIDMDF. */ + uint8_t v_mdf_method; /* Generation method for RAIDMDF. */ u_int v_strip_size; /* Array strip size. */ + u_int v_rotate_parity; /* Rotate RAID5R parity + after numer of stripes. */ u_int v_sectorsize; /* Volume sector size. */ off_t v_mediasize; /* Volume media size. */ struct bio_queue_head v_inflight; /* In-flight write requests. */ @@ -382,7 +388,8 @@ const char * g_raid_disk_state2str(int state); struct g_raid_softc * g_raid_create_node(struct g_class *mp, const char *name, struct g_raid_md_object *md); -int g_raid_create_node_format(const char *format, struct g_geom **gp); +int g_raid_create_node_format(const char *format, struct gctl_req *req, + struct g_geom **gp); struct g_raid_volume * g_raid_create_volume(struct g_raid_softc *sc, const char *name, int id); struct g_raid_disk * g_raid_create_disk(struct g_raid_softc *sc); diff --git a/sys/geom/raid/g_raid_ctl.c b/sys/geom/raid/g_raid_ctl.c index 028aa94c308..4d0147fe502 100644 --- a/sys/geom/raid/g_raid_ctl.c +++ b/sys/geom/raid/g_raid_ctl.c @@ -88,7 +88,7 @@ g_raid_ctl_label(struct gctl_req *req, struct g_class *mp) gctl_error(req, "No format recieved."); return; } - crstatus = g_raid_create_node_format(format, &geom); + crstatus = g_raid_create_node_format(format, req, &geom); if (crstatus == G_RAID_MD_TASTE_FAIL) { gctl_error(req, "Failed to create array with format '%s'.", format); diff --git a/sys/geom/raid/g_raid_md_if.m b/sys/geom/raid/g_raid_md_if.m index 05e9f66957c..3fcbab4b57c 100644 --- a/sys/geom/raid/g_raid_md_if.m +++ b/sys/geom/raid/g_raid_md_if.m @@ -49,12 +49,21 @@ HEADER { # Default implementations of methods. CODE { static int - g_raid_md_create_default(struct g_raid_md_object *md) + g_raid_md_create_default(struct g_raid_md_object *md, + struct g_class *mp, struct g_geom **gp) { return (G_RAID_MD_TASTE_FAIL); } + static int + g_raid_md_create_req_default(struct g_raid_md_object *md, + struct g_class *mp, struct gctl_req *req, struct g_geom **gp) + { + + return (G_RAID_MD_CREATE(md, mp, gp)); + } + static int g_raid_md_ctl_default(struct g_raid_md_object *md, struct gctl_req *req) @@ -95,6 +104,14 @@ METHOD int create { struct g_geom **gp; } DEFAULT g_raid_md_create_default; +# create_req() - create new node from scratch, with request argument. +METHOD int create_req { + struct g_raid_md_object *md; + struct g_class *mp; + struct gctl_req *req; + struct g_geom **gp; +} DEFAULT g_raid_md_create_req_default; + # taste() - taste disk and, if needed, create new node. METHOD int taste { struct g_raid_md_object *md; diff --git a/sys/geom/raid/md_ddf.c b/sys/geom/raid/md_ddf.c new file mode 100644 index 00000000000..603bd49bfca --- /dev/null +++ b/sys/geom/raid/md_ddf.c @@ -0,0 +1,3068 @@ +/*- + * Copyright (c) 2012 Alexander Motin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "geom/raid/g_raid.h" +#include "geom/raid/md_ddf.h" +#include "g_raid_md_if.h" + +static MALLOC_DEFINE(M_MD_DDF, "md_ddf_data", "GEOM_RAID DDF metadata"); + +#define DDF_MAX_DISKS_HARD 128 + +#define DDF_MAX_DISKS 16 +#define DDF_MAX_VDISKS 7 +#define DDF_MAX_PARTITIONS 1 + +#define DECADE (3600*24*(365*10+2)) /* 10 years in seconds. */ + +struct ddf_meta { + u_int sectorsize; + u_int bigendian; + struct ddf_header *hdr; + struct ddf_cd_record *cdr; + struct ddf_pd_record *pdr; + struct ddf_vd_record *vdr; + void *cr; + struct ddf_pdd_record *pdd; + struct ddf_bbm_log *bbm; +}; + +struct ddf_vol_meta { + u_int sectorsize; + u_int bigendian; + struct ddf_header *hdr; + struct ddf_cd_record *cdr; + struct ddf_vd_entry *vde; + struct ddf_vdc_record *vdc; + struct ddf_vdc_record *bvdc[DDF_MAX_DISKS_HARD]; +}; + +struct g_raid_md_ddf_perdisk { + struct ddf_meta pd_meta; +}; + +struct g_raid_md_ddf_pervolume { + struct ddf_vol_meta pv_meta; + int pv_started; + struct callout pv_start_co; /* STARTING state timer. */ +}; + +struct g_raid_md_ddf_object { + struct g_raid_md_object mdio_base; + u_int mdio_bigendian; + struct ddf_meta mdio_meta; + int mdio_starting; + struct callout mdio_start_co; /* STARTING state timer. */ + int mdio_started; + struct root_hold_token *mdio_rootmount; /* Root mount delay token. */ +}; + +static g_raid_md_create_req_t g_raid_md_create_req_ddf; +static g_raid_md_taste_t g_raid_md_taste_ddf; +static g_raid_md_event_t g_raid_md_event_ddf; +static g_raid_md_volume_event_t g_raid_md_volume_event_ddf; +static g_raid_md_ctl_t g_raid_md_ctl_ddf; +static g_raid_md_write_t g_raid_md_write_ddf; +static g_raid_md_fail_disk_t g_raid_md_fail_disk_ddf; +static g_raid_md_free_disk_t g_raid_md_free_disk_ddf; +static g_raid_md_free_volume_t g_raid_md_free_volume_ddf; +static g_raid_md_free_t g_raid_md_free_ddf; + +static kobj_method_t g_raid_md_ddf_methods[] = { + KOBJMETHOD(g_raid_md_create_req, g_raid_md_create_req_ddf), + KOBJMETHOD(g_raid_md_taste, g_raid_md_taste_ddf), + KOBJMETHOD(g_raid_md_event, g_raid_md_event_ddf), + KOBJMETHOD(g_raid_md_volume_event, g_raid_md_volume_event_ddf), + KOBJMETHOD(g_raid_md_ctl, g_raid_md_ctl_ddf), + KOBJMETHOD(g_raid_md_write, g_raid_md_write_ddf), + KOBJMETHOD(g_raid_md_fail_disk, g_raid_md_fail_disk_ddf), + KOBJMETHOD(g_raid_md_free_disk, g_raid_md_free_disk_ddf), + KOBJMETHOD(g_raid_md_free_volume, g_raid_md_free_volume_ddf), + KOBJMETHOD(g_raid_md_free, g_raid_md_free_ddf), + { 0, 0 } +}; + +static struct g_raid_md_class g_raid_md_ddf_class = { + "DDF", + g_raid_md_ddf_methods, + sizeof(struct g_raid_md_ddf_object), + .mdc_priority = 100 +}; + +#define GET8(m, f) ((m)->f) +#define GET16(m, f) ((m)->bigendian ? be16dec(&(m)->f) : le16dec(&(m)->f)) +#define GET32(m, f) ((m)->bigendian ? be32dec(&(m)->f) : le32dec(&(m)->f)) +#define GET64(m, f) ((m)->bigendian ? be64dec(&(m)->f) : le64dec(&(m)->f)) +#define GET8D(m, f) (f) +#define GET16D(m, f) ((m)->bigendian ? be16dec(&f) : le16dec(&f)) +#define GET32D(m, f) ((m)->bigendian ? be32dec(&f) : le32dec(&f)) +#define GET64D(m, f) ((m)->bigendian ? be64dec(&f) : le64dec(&f)) +#define GET8P(m, f) (*(f)) +#define GET16P(m, f) ((m)->bigendian ? be16dec(f) : le16dec(f)) +#define GET32P(m, f) ((m)->bigendian ? be32dec(f) : le32dec(f)) +#define GET64P(m, f) ((m)->bigendian ? be64dec(f) : le64dec(f)) + +#define SET8P(m, f, v) \ + (*(f) = (v)) +#define SET16P(m, f, v) \ + do { \ + if ((m)->bigendian) \ + be16enc((f), (v)); \ + else \ + le16enc((f), (v)); \ + } while (0) +#define SET32P(m, f, v) \ + do { \ + if ((m)->bigendian) \ + be32enc((f), (v)); \ + else \ + le32enc((f), (v)); \ + } while (0) +#define SET64P(m, f, v) \ + do { \ + if ((m)->bigendian) \ + be64enc((f), (v)); \ + else \ + le64enc((f), (v)); \ + } while (0) +#define SET8(m, f, v) SET8P((m), &((m)->f), (v)) +#define SET16(m, f, v) SET16P((m), &((m)->f), (v)) +#define SET32(m, f, v) SET32P((m), &((m)->f), (v)) +#define SET64(m, f, v) SET64P((m), &((m)->f), (v)) +#define SET8D(m, f, v) SET8P((m), &(f), (v)) +#define SET16D(m, f, v) SET16P((m), &(f), (v)) +#define SET32D(m, f, v) SET32P((m), &(f), (v)) +#define SET64D(m, f, v) SET64P((m), &(f), (v)) + +#define GETCRNUM(m) (GET32((m), hdr->cr_length) / \ + GET16((m), hdr->Configuration_Record_Length)) + +#define GETVDCPTR(m, n) ((struct ddf_vdc_record *)((uint8_t *)(m)->cr + \ + (n) * GET16((m), hdr->Configuration_Record_Length) * \ + (m)->sectorsize)) + +#define GETSAPTR(m, n) ((struct ddf_sa_record *)((uint8_t *)(m)->cr + \ + (n) * GET16((m), hdr->Configuration_Record_Length) * \ + (m)->sectorsize)) + +static int +isff(uint8_t *buf, int size) +{ + int i; + + for (i = 0; i < size; i++) + if (buf[i] != 0xff) + return (0); + return (1); +} + +static void +print_guid(uint8_t *buf) +{ + int i, ascii; + + ascii = 1; + for (i = 0; i < 24; i++) { + if (buf[i] != 0 && (buf[i] < ' ' || buf[i] > 127)) { + ascii = 0; + break; + } + } + if (ascii) { + printf("'%.24s'", buf); + } else { + for (i = 0; i < 24; i++) + printf("%02x", buf[i]); + } +} + +static void +g_raid_md_ddf_print(struct ddf_meta *meta) +{ + struct ddf_vdc_record *vdc; + struct ddf_vuc_record *vuc; + struct ddf_sa_record *sa; + uint64_t *val2; + uint32_t val; + int i, j, k, num, num2; + + if (g_raid_debug < 1) + return; + + printf("********* DDF Metadata *********\n"); + printf("**** Header ****\n"); + printf("DDF_Header_GUID "); + print_guid(meta->hdr->DDF_Header_GUID); + printf("\n"); + printf("DDF_rev %8.8s\n", (char *)&meta->hdr->DDF_rev[0]); + printf("Sequence_Number 0x%08x\n", GET32(meta, hdr->Sequence_Number)); + printf("TimeStamp 0x%08x\n", GET32(meta, hdr->TimeStamp)); + printf("Open_Flag 0x%02x\n", GET16(meta, hdr->Open_Flag)); + printf("Foreign_Flag 0x%02x\n", GET16(meta, hdr->Foreign_Flag)); + printf("Diskgrouping 0x%02x\n", GET16(meta, hdr->Diskgrouping)); + printf("Primary_Header_LBA %ju\n", GET64(meta, hdr->Primary_Header_LBA)); + printf("Secondary_Header_LBA %ju\n", GET64(meta, hdr->Secondary_Header_LBA)); + printf("WorkSpace_Length %u\n", GET32(meta, hdr->WorkSpace_Length)); + printf("WorkSpace_LBA %ju\n", GET64(meta, hdr->WorkSpace_LBA)); + printf("Max_PD_Entries %u\n", GET16(meta, hdr->Max_PD_Entries)); + printf("Max_VD_Entries %u\n", GET16(meta, hdr->Max_VD_Entries)); + printf("Max_Partitions %u\n", GET16(meta, hdr->Max_Partitions)); + printf("Configuration_Record_Length %u\n", GET16(meta, hdr->Configuration_Record_Length)); + printf("Max_Primary_Element_Entries %u\n", GET16(meta, hdr->Max_Primary_Element_Entries)); + printf("Controller Data %u:%u\n", GET32(meta, hdr->cd_section), GET32(meta, hdr->cd_length)); + printf("Physical Disk %u:%u\n", GET32(meta, hdr->pdr_section), GET32(meta, hdr->pdr_length)); + printf("Virtual Disk %u:%u\n", GET32(meta, hdr->vdr_section), GET32(meta, hdr->vdr_length)); + printf("Configuration Recs %u:%u\n", GET32(meta, hdr->cr_section), GET32(meta, hdr->cr_length)); + printf("Physical Disk Recs %u:%u\n", GET32(meta, hdr->pdd_section), GET32(meta, hdr->pdd_length)); + printf("BBM Log %u:%u\n", GET32(meta, hdr->bbmlog_section), GET32(meta, hdr->bbmlog_length)); + printf("Diagnostic Space %u:%u\n", GET32(meta, hdr->Diagnostic_Space), GET32(meta, hdr->Diagnostic_Space_Length)); + printf("Vendor_Specific_Logs %u:%u\n", GET32(meta, hdr->Vendor_Specific_Logs), GET32(meta, hdr->Vendor_Specific_Logs_Length)); + printf("**** Controler Data ****\n"); + printf("Controller_GUID "); + print_guid(meta->cdr->Controller_GUID); + printf("\n"); + printf("Controller_Type 0x%04x%04x 0x%04x%04x\n", + GET16(meta, cdr->Controller_Type.Vendor_ID), + GET16(meta, cdr->Controller_Type.Device_ID), + GET16(meta, cdr->Controller_Type.SubVendor_ID), + GET16(meta, cdr->Controller_Type.SubDevice_ID)); + printf("Product_ID '%.16s'\n", (char *)&meta->cdr->Product_ID[0]); + printf("**** Physical Disk Records ****\n"); + printf("Populated_PDEs %u\n", GET16(meta, pdr->Populated_PDEs)); + printf("Max_PDE_Supported %u\n", GET16(meta, pdr->Max_PDE_Supported)); + for (j = 0; j < GET16(meta, pdr->Populated_PDEs); j++) { + if (isff(meta->pdr->entry[j].PD_GUID, 24)) + continue; + if (GET32(meta, pdr->entry[j].PD_Reference) == 0xffffffff) + continue; + printf("PD_GUID "); + print_guid(meta->pdr->entry[j].PD_GUID); + printf("\n"); + printf("PD_Reference 0x%08x\n", + GET32(meta, pdr->entry[j].PD_Reference)); + printf("PD_Type 0x%04x\n", + GET16(meta, pdr->entry[j].PD_Type)); + printf("PD_State 0x%04x\n", + GET16(meta, pdr->entry[j].PD_State)); + printf("Configured_Size %ju\n", + GET64(meta, pdr->entry[j].Configured_Size)); + printf("Block_Size %u\n", + GET16(meta, pdr->entry[j].Block_Size)); + } + printf("**** Virtual Disk Records ****\n"); + printf("Populated_VDEs %u\n", GET16(meta, vdr->Populated_VDEs)); + printf("Max_VDE_Supported %u\n", GET16(meta, vdr->Max_VDE_Supported)); + for (j = 0; j < GET16(meta, vdr->Populated_VDEs); j++) { + if (isff(meta->vdr->entry[j].VD_GUID, 24)) + continue; + printf("VD_GUID "); + print_guid(meta->vdr->entry[j].VD_GUID); + printf("\n"); + printf("VD_Number 0x%04x\n", + GET16(meta, vdr->entry[j].VD_Number)); + printf("VD_Type 0x%04x\n", + GET16(meta, vdr->entry[j].VD_Type)); + printf("VD_State 0x%02x\n", + GET8(meta, vdr->entry[j].VD_State)); + printf("Init_State 0x%02x\n", + GET8(meta, vdr->entry[j].Init_State)); + printf("Drive_Failures_Remaining %u\n", + GET8(meta, vdr->entry[j].Drive_Failures_Remaining)); + printf("VD_Name '%.16s'\n", + (char *)&meta->vdr->entry[j].VD_Name); + } + printf("**** Configuration Records ****\n"); + num = GETCRNUM(meta); + for (j = 0; j < num; j++) { + vdc = GETVDCPTR(meta, j); + val = GET32D(meta, vdc->Signature); + switch (val) { + case DDF_VDCR_SIGNATURE: + printf("** Virtual Disk Configuration **\n"); + printf("VD_GUID "); + print_guid(vdc->VD_GUID); + printf("\n"); + printf("Timestamp 0x%08x\n", + GET32D(meta, vdc->Timestamp)); + printf("Sequence_Number 0x%08x\n", + GET32D(meta, vdc->Sequence_Number)); + printf("Primary_Element_Count %u\n", + GET16D(meta, vdc->Primary_Element_Count)); + printf("Stripe_Size %u\n", + GET8D(meta, vdc->Stripe_Size)); + printf("Primary_RAID_Level 0x%02x\n", + GET8D(meta, vdc->Primary_RAID_Level)); + printf("RLQ 0x%02x\n", + GET8D(meta, vdc->RLQ)); + printf("Secondary_Element_Count %u\n", + GET8D(meta, vdc->Secondary_Element_Count)); + printf("Secondary_Element_Seq %u\n", + GET8D(meta, vdc->Secondary_Element_Seq)); + printf("Secondary_RAID_Level 0x%02x\n", + GET8D(meta, vdc->Secondary_RAID_Level)); + printf("Block_Count %ju\n", + GET64D(meta, vdc->Block_Count)); + printf("VD_Size %ju\n", + GET64D(meta, vdc->VD_Size)); + printf("Block_Size %u\n", + GET16D(meta, vdc->Block_Size)); + printf("Rotate_Parity_count %u\n", + GET8D(meta, vdc->Rotate_Parity_count)); + printf("Associated_Spare_Disks"); + for (i = 0; i < 8; i++) { + if (GET32D(meta, vdc->Associated_Spares[i]) != 0xffffffff) + printf(" 0x%08x", GET32D(meta, vdc->Associated_Spares[i])); + } + printf("\n"); + printf("Cache_Flags %016jx\n", + GET64D(meta, vdc->Cache_Flags)); + printf("BG_Rate %u\n", + GET8D(meta, vdc->BG_Rate)); + printf("MDF_Parity_Disks %u\n", + GET8D(meta, vdc->MDF_Parity_Disks)); + printf("MDF_Parity_Generator_Polynomial 0x%04x\n", + GET16D(meta, vdc->MDF_Parity_Generator_Polynomial)); + printf("MDF_Constant_Generation_Method 0x%02x\n", + GET8D(meta, vdc->MDF_Constant_Generation_Method)); + printf("Physical_Disks "); + num2 = GET16D(meta, vdc->Primary_Element_Count); + val2 = (uint64_t *)&(vdc->Physical_Disk_Sequence[GET16(meta, hdr->Max_Primary_Element_Entries)]); + for (i = 0; i < num2; i++) + printf(" 0x%08x @ %ju", + GET32D(meta, vdc->Physical_Disk_Sequence[i]), + GET64P(meta, val2 + i)); + printf("\n"); + break; + case DDF_VUCR_SIGNATURE: + printf("** Vendor Unique Configuration **\n"); + vuc = (struct ddf_vuc_record *)vdc; + printf("VD_GUID "); + print_guid(vuc->VD_GUID); + printf("\n"); + break; + case DDF_SA_SIGNATURE: + printf("** Spare Assignment Configuration **\n"); + sa = (struct ddf_sa_record *)vdc; + printf("Timestamp 0x%08x\n", + GET32D(meta, sa->Timestamp)); + printf("Spare_Type 0x%02x\n", + GET8D(meta, sa->Spare_Type)); + printf("Populated_SAEs %u\n", + GET16D(meta, sa->Populated_SAEs)); + printf("MAX_SAE_Supported %u\n", + GET16D(meta, sa->MAX_SAE_Supported)); + for (i = 0; i < GET16D(meta, sa->Populated_SAEs); i++) { + if (isff(sa->entry[i].VD_GUID, 24)) + continue; + printf("VD_GUID "); + for (k = 0; k < 24; k++) + printf("%02x", sa->entry[i].VD_GUID[k]); + printf("\n"); + printf("Secondary_Element %u\n", + GET16D(meta, sa->entry[i].Secondary_Element)); + } + break; + case 0x00000000: + case 0xFFFFFFFF: + break; + default: + printf("Unknown configuration signature %08x\n", val); + break; + } + } + printf("**** Physical Disk Data ****\n"); + printf("PD_GUID "); + print_guid(meta->pdd->PD_GUID); + printf("\n"); + printf("PD_Reference 0x%08x\n", + GET32(meta, pdd->PD_Reference)); + printf("Forced_Ref_Flag 0x%02x\n", + GET8(meta, pdd->Forced_Ref_Flag)); + printf("Forced_PD_GUID_Flag 0x%02x\n", + GET8(meta, pdd->Forced_PD_GUID_Flag)); +} + +static int +ddf_meta_find_pd(struct ddf_meta *meta, uint8_t *GUID, uint32_t PD_Reference) +{ + int i; + + for (i = 0; i < GET16(meta, pdr->Populated_PDEs); i++) { + if (GUID != NULL) { + if (memcmp(meta->pdr->entry[i].PD_GUID, GUID, 24) == 0) + return (i); + } else if (PD_Reference != 0xffffffff) { + if (GET32(meta, pdr->entry[i].PD_Reference) == PD_Reference) + return (i); + } else + if (isff(meta->pdr->entry[i].PD_GUID, 24)) + return (i); + } + if (GUID == NULL && PD_Reference == 0xffffffff) { + if (i >= GET16(meta, pdr->Max_PDE_Supported)) + return (-1); + SET16(meta, pdr->Populated_PDEs, i + 1); + return (i); + } + return (-1); +} + +static int +ddf_meta_find_vd(struct ddf_meta *meta, uint8_t *GUID) +{ + int i; + + for (i = 0; i < GET16(meta, vdr->Populated_VDEs); i++) { + if (GUID != NULL) { + if (memcmp(meta->vdr->entry[i].VD_GUID, GUID, 24) == 0) + return (i); + } else + if (isff(meta->vdr->entry[i].VD_GUID, 24)) + return (i); + } + if (GUID == NULL) { + if (i >= GET16(meta, vdr->Max_VDE_Supported)) + return (-1); + SET16(meta, vdr->Populated_VDEs, i + 1); + return (i); + } + return (-1); +} + +static struct ddf_vdc_record * +ddf_meta_find_vdc(struct ddf_meta *meta, uint8_t *GUID) +{ + struct ddf_vdc_record *vdc; + int i, num; + + num = GETCRNUM(meta); + for (i = 0; i < num; i++) { + vdc = GETVDCPTR(meta, i); + if (GUID != NULL) { + if (GET32D(meta, vdc->Signature) == DDF_VDCR_SIGNATURE && + memcmp(vdc->VD_GUID, GUID, 24) == 0) + return (vdc); + } else + if (GET32D(meta, vdc->Signature) == 0xffffffff || + GET32D(meta, vdc->Signature) == 0) + return (vdc); + } + return (NULL); +} + +static int +ddf_meta_count_vdc(struct ddf_meta *meta, uint8_t *GUID) +{ + struct ddf_vdc_record *vdc; + int i, num, cnt; + + cnt = 0; + num = GETCRNUM(meta); + for (i = 0; i < num; i++) { + vdc = GETVDCPTR(meta, i); + if (GET32D(meta, vdc->Signature) != DDF_VDCR_SIGNATURE) + continue; + if (GUID == NULL || memcmp(vdc->VD_GUID, GUID, 24) == 0) + cnt++; + } + return (cnt); +} + +static int +ddf_meta_find_disk(struct ddf_vol_meta *vmeta, uint32_t PD_Reference, + int *bvdp, int *posp) +{ + int i, bvd, pos; + + i = 0; + for (bvd = 0; bvd < GET16(vmeta, vdc->Secondary_Element_Count); bvd++) { + if (vmeta->bvdc[bvd] == NULL) { + i += GET16(vmeta, vdc->Primary_Element_Count); // XXX + continue; + } + for (pos = 0; pos < GET16(vmeta, bvdc[bvd]->Primary_Element_Count); + pos++, i++) { + if (GET32(vmeta, bvdc[bvd]->Physical_Disk_Sequence[pos]) == + PD_Reference) { + if (bvdp != NULL) + *bvdp = bvd; + if (posp != NULL) + *posp = pos; + return (i); + } + } + } + return (-1); +} + +static struct ddf_sa_record * +ddf_meta_find_sa(struct ddf_meta *meta, int create) +{ + struct ddf_sa_record *sa; + int i, num; + + num = GETCRNUM(meta); + for (i = 0; i < num; i++) { + sa = GETSAPTR(meta, i); + if (GET32D(meta, sa->Signature) == DDF_SA_SIGNATURE) + return (sa); + } + if (create) { + for (i = 0; i < num; i++) { + sa = GETSAPTR(meta, i); + if (GET32D(meta, sa->Signature) == 0xffffffff || + GET32D(meta, sa->Signature) == 0) + return (sa); + } + } + return (NULL); +} + +static void +ddf_meta_create(struct g_raid_disk *disk, struct ddf_meta *sample) +{ + struct timespec ts; + struct clocktime ct; + struct g_raid_md_ddf_perdisk *pd; + struct g_raid_md_ddf_object *mdi; + struct ddf_meta *meta; + struct ddf_pd_entry *pde; + off_t anchorlba; + u_int ss, pos, size; + int len, error; + char serial_buffer[24]; + + if (sample->hdr == NULL) + sample = NULL; + + mdi = (struct g_raid_md_ddf_object *)disk->d_softc->sc_md; + pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; + meta = &pd->pd_meta; + ss = disk->d_consumer->provider->sectorsize; + anchorlba = disk->d_consumer->provider->mediasize / ss - 1; + + meta->sectorsize = ss; + meta->bigendian = sample ? sample->bigendian : mdi->mdio_bigendian; + getnanotime(&ts); + clock_ts_to_ct(&ts, &ct); + + /* Header */ + meta->hdr = malloc(ss, M_MD_DDF, M_WAITOK); + memset(meta->hdr, 0xff, ss); + if (sample) { + memcpy(meta->hdr, sample->hdr, sizeof(struct ddf_header)); + if (ss != sample->sectorsize) { + SET32(meta, hdr->WorkSpace_Length, + (GET32(sample, hdr->WorkSpace_Length) * + sample->sectorsize + ss - 1) / ss); + SET16(meta, hdr->Configuration_Record_Length, + (GET16(sample, hdr->Configuration_Record_Length) * + sample->sectorsize + ss - 1) / ss); + SET32(meta, hdr->cd_length, + (GET32(sample, hdr->cd_length) * + sample->sectorsize + ss - 1) / ss); + SET32(meta, hdr->pdr_length, + (GET32(sample, hdr->pdr_length) * + sample->sectorsize + ss - 1) / ss); + SET32(meta, hdr->vdr_length, + (GET32(sample, hdr->vdr_length) * + sample->sectorsize + ss - 1) / ss); + SET32(meta, hdr->cr_length, + (GET32(sample, hdr->cr_length) * + sample->sectorsize + ss - 1) / ss); + SET32(meta, hdr->pdd_length, + (GET32(sample, hdr->pdd_length) * + sample->sectorsize + ss - 1) / ss); + SET32(meta, hdr->bbmlog_length, + (GET32(sample, hdr->bbmlog_length) * + sample->sectorsize + ss - 1) / ss); + SET32(meta, hdr->Diagnostic_Space, + (GET32(sample, hdr->bbmlog_length) * + sample->sectorsize + ss - 1) / ss); + SET32(meta, hdr->Vendor_Specific_Logs, + (GET32(sample, hdr->bbmlog_length) * + sample->sectorsize + ss - 1) / ss); + } + } else { + SET32(meta, hdr->Signature, DDF_HEADER_SIGNATURE); + snprintf(meta->hdr->DDF_Header_GUID, 25, "FreeBSD %08x%08x", + (u_int)(ts.tv_sec - DECADE), arc4random()); + memcpy(meta->hdr->DDF_rev, "02.00.00", 8); + SET32(meta, hdr->TimeStamp, (ts.tv_sec - DECADE)); + SET32(meta, hdr->WorkSpace_Length, 16 * 1024 * 1024 / ss); + SET16(meta, hdr->Max_PD_Entries, DDF_MAX_DISKS - 1); + SET16(meta, hdr->Max_VD_Entries, DDF_MAX_VDISKS); + SET16(meta, hdr->Max_Partitions, DDF_MAX_PARTITIONS); + SET16(meta, hdr->Max_Primary_Element_Entries, DDF_MAX_DISKS); + SET16(meta, hdr->Configuration_Record_Length, + (sizeof(struct ddf_vdc_record) + + (4 + 8) * GET16(meta, hdr->Max_Primary_Element_Entries) + + ss - 1) / ss); + SET32(meta, hdr->cd_length, + (sizeof(struct ddf_cd_record) + ss - 1) / ss); + SET32(meta, hdr->pdr_length, + (sizeof(struct ddf_pd_record) + + sizeof(struct ddf_pd_entry) * + GET16(meta, hdr->Max_PD_Entries) + ss - 1) / ss); + SET32(meta, hdr->vdr_length, + (sizeof(struct ddf_vd_record) + + sizeof(struct ddf_vd_entry) * + GET16(meta, hdr->Max_VD_Entries) + ss - 1) / ss); + SET32(meta, hdr->cr_length, + GET16(meta, hdr->Configuration_Record_Length) * + (GET16(meta, hdr->Max_Partitions) + 1)); + SET32(meta, hdr->pdd_length, + (sizeof(struct ddf_pdd_record) + ss - 1) / ss); + SET32(meta, hdr->bbmlog_length, 0); + SET32(meta, hdr->Diagnostic_Space_Length, 0); + SET32(meta, hdr->Vendor_Specific_Logs_Length, 0); + } + pos = 1; + SET32(meta, hdr->cd_section, pos); + pos += GET32(meta, hdr->cd_length); + SET32(meta, hdr->pdr_section, pos); + pos += GET32(meta, hdr->pdr_length); + SET32(meta, hdr->vdr_section, pos); + pos += GET32(meta, hdr->vdr_length); + SET32(meta, hdr->cr_section, pos); + pos += GET32(meta, hdr->cr_length); + SET32(meta, hdr->pdd_section, pos); + pos += GET32(meta, hdr->pdd_length); + SET32(meta, hdr->bbmlog_section, + GET32(meta, hdr->bbmlog_length) != 0 ? pos : 0xffffffff); + pos += GET32(meta, hdr->bbmlog_length); + SET32(meta, hdr->Diagnostic_Space, + GET32(meta, hdr->Diagnostic_Space_Length) != 0 ? pos : 0xffffffff); + pos += GET32(meta, hdr->Diagnostic_Space_Length); + SET32(meta, hdr->Vendor_Specific_Logs, + GET32(meta, hdr->Vendor_Specific_Logs_Length) != 0 ? pos : 0xffffffff); + pos += min(GET32(meta, hdr->Vendor_Specific_Logs_Length), 1); + SET64(meta, hdr->Primary_Header_LBA, + anchorlba - pos); + SET64(meta, hdr->Secondary_Header_LBA, + 0xffffffffffffffffULL); + SET64(meta, hdr->WorkSpace_LBA, + anchorlba + 1 - 32 * 1024 * 1024 / ss); + + /* Controller Data */ + size = GET32(meta, hdr->cd_length) * ss; + meta->cdr = malloc(size, M_MD_DDF, M_WAITOK); + memset(meta->cdr, 0xff, size); + SET32(meta, cdr->Signature, DDF_CONTROLLER_DATA_SIGNATURE); + memcpy(meta->cdr->Controller_GUID, "FreeBSD GEOM RAID SERIAL", 24); + memcpy(meta->cdr->Product_ID, "FreeBSD GEOMRAID", 16); + + /* Physical Drive Records. */ + size = GET32(meta, hdr->pdr_length) * ss; + meta->pdr = malloc(size, M_MD_DDF, M_WAITOK); + memset(meta->pdr, 0xff, size); + SET32(meta, pdr->Signature, DDF_PDR_SIGNATURE); + SET16(meta, pdr->Populated_PDEs, 1); + SET16(meta, pdr->Max_PDE_Supported, + GET16(meta, hdr->Max_PD_Entries)); + + pde = &meta->pdr->entry[0]; + len = sizeof(serial_buffer); + error = g_io_getattr("GEOM::ident", disk->d_consumer, &len, serial_buffer); + if (error == 0 && (len = strlen (serial_buffer)) >= 6 && len <= 20) + snprintf(pde->PD_GUID, 25, "DISK%20s", serial_buffer); + else + snprintf(pde->PD_GUID, 25, "DISK%04d%02d%02d%08x%04x", + ct.year, ct.mon, ct.day, + arc4random(), arc4random() & 0xffff); + SET32D(meta, pde->PD_Reference, arc4random()); + SET16D(meta, pde->PD_Type, DDF_PDE_GUID_FORCE); + SET16D(meta, pde->PD_State, 0); + SET64D(meta, pde->Configured_Size, + anchorlba + 1 - 32 * 1024 * 1024 / ss); + SET16D(meta, pde->Block_Size, ss); + + /* Virtual Drive Records. */ + size = GET32(meta, hdr->vdr_length) * ss; + meta->vdr = malloc(size, M_MD_DDF, M_WAITOK); + memset(meta->vdr, 0xff, size); + SET32(meta, vdr->Signature, DDF_VD_RECORD_SIGNATURE); + SET32(meta, vdr->Populated_VDEs, 0); + SET16(meta, vdr->Max_VDE_Supported, + GET16(meta, hdr->Max_VD_Entries)); + + /* Configuration Records. */ + size = GET32(meta, hdr->cr_length) * ss; + meta->cr = malloc(size, M_MD_DDF, M_WAITOK); + memset(meta->cr, 0xff, size); + + /* Physical Disk Data. */ + size = GET32(meta, hdr->pdd_length) * ss; + meta->pdd = malloc(size, M_MD_DDF, M_WAITOK); + memset(meta->pdd, 0xff, size); + SET32(meta, pdd->Signature, DDF_PDD_SIGNATURE); + memcpy(meta->pdd->PD_GUID, pde->PD_GUID, 24); + SET32(meta, pdd->PD_Reference, GET32D(meta, pde->PD_Reference)); + SET8(meta, pdd->Forced_Ref_Flag, DDF_PDD_FORCED_REF); + SET8(meta, pdd->Forced_PD_GUID_Flag, DDF_PDD_FORCED_GUID); + + /* Bad Block Management Log. */ + if (GET32(meta, hdr->bbmlog_length) != 0) { + size = GET32(meta, hdr->bbmlog_length) * ss; + meta->bbm = malloc(size, M_MD_DDF, M_WAITOK); + memset(meta->bbm, 0xff, size); + SET32(meta, bbm->Signature, DDF_BBML_SIGNATURE); + SET32(meta, bbm->Entry_Count, 0); + SET32(meta, bbm->Spare_Block_Count, 0); + } +} + +static void +ddf_meta_copy(struct ddf_meta *dst, struct ddf_meta *src) +{ + struct ddf_header *hdr; + u_int ss; + + hdr = src->hdr; + dst->bigendian = src->bigendian; + ss = dst->sectorsize = src->sectorsize; + dst->hdr = malloc(ss, M_MD_DDF, M_WAITOK); + memcpy(dst->hdr, src->hdr, ss); + dst->cdr = malloc(GET32(src, hdr->cd_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(dst->cdr, src->cdr, GET32(src, hdr->cd_length) * ss); + dst->pdr = malloc(GET32(src, hdr->pdr_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(dst->pdr, src->pdr, GET32(src, hdr->pdr_length) * ss); + dst->vdr = malloc(GET32(src, hdr->vdr_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(dst->vdr, src->vdr, GET32(src, hdr->vdr_length) * ss); + dst->cr = malloc(GET32(src, hdr->cr_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(dst->cr, src->cr, GET32(src, hdr->cr_length) * ss); + dst->pdd = malloc(GET32(src, hdr->pdd_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(dst->pdd, src->pdd, GET32(src, hdr->pdd_length) * ss); + if (src->bbm != NULL) { + dst->bbm = malloc(GET32(src, hdr->bbmlog_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(dst->bbm, src->bbm, GET32(src, hdr->bbmlog_length) * ss); + } +} + +static void +ddf_meta_update(struct ddf_meta *meta, struct ddf_meta *src) +{ + struct ddf_pd_entry *pde, *spde; + int i, j; + + for (i = 0; i < GET16(src, pdr->Populated_PDEs); i++) { + spde = &src->pdr->entry[i]; + if (isff(spde->PD_GUID, 24)) + continue; + j = ddf_meta_find_pd(meta, NULL, + GET32(src, pdr->entry[i].PD_Reference)); + if (j < 0) { + j = ddf_meta_find_pd(meta, NULL, 0xffffffff); + pde = &meta->pdr->entry[j]; + memcpy(pde, spde, sizeof(*pde)); + } else { + pde = &meta->pdr->entry[j]; + SET16D(meta, pde->PD_State, + GET16D(meta, pde->PD_State) | + GET16D(src, pde->PD_State)); + } + } +} + +static void +ddf_meta_free(struct ddf_meta *meta) +{ + + if (meta->hdr != NULL) { + free(meta->hdr, M_MD_DDF); + meta->hdr = NULL; + } + if (meta->cdr != NULL) { + free(meta->cdr, M_MD_DDF); + meta->cdr = NULL; + } + if (meta->pdr != NULL) { + free(meta->pdr, M_MD_DDF); + meta->pdr = NULL; + } + if (meta->vdr != NULL) { + free(meta->vdr, M_MD_DDF); + meta->vdr = NULL; + } + if (meta->cr != NULL) { + free(meta->cr, M_MD_DDF); + meta->cr = NULL; + } + if (meta->pdd != NULL) { + free(meta->pdd, M_MD_DDF); + meta->pdd = NULL; + } + if (meta->bbm != NULL) { + free(meta->bbm, M_MD_DDF); + meta->bbm = NULL; + } +} + +static void +ddf_vol_meta_create(struct ddf_vol_meta *meta, struct ddf_meta *sample) +{ + struct timespec ts; + struct clocktime ct; + struct ddf_header *hdr; + u_int ss, size; + + hdr = sample->hdr; + meta->bigendian = sample->bigendian; + ss = meta->sectorsize = sample->sectorsize; + meta->hdr = malloc(ss, M_MD_DDF, M_WAITOK); + memcpy(meta->hdr, sample->hdr, ss); + meta->cdr = malloc(GET32(sample, hdr->cd_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(meta->cdr, sample->cdr, GET32(sample, hdr->cd_length) * ss); + meta->vde = malloc(sizeof(struct ddf_vd_entry), M_MD_DDF, M_WAITOK); + memset(meta->vde, 0xff, sizeof(struct ddf_vd_entry)); + getnanotime(&ts); + clock_ts_to_ct(&ts, &ct); + snprintf(meta->vde->VD_GUID, 25, "FreeBSD%04d%02d%02d%08x%01x", + ct.year, ct.mon, ct.day, + arc4random(), arc4random() & 0xf); + size = GET16(sample, hdr->Configuration_Record_Length) * ss; + meta->vdc = malloc(size, M_MD_DDF, M_WAITOK); + memset(meta->vdc, 0xff, size); + SET32(meta, vdc->Signature, DDF_VDCR_SIGNATURE); + memcpy(meta->vdc->VD_GUID, meta->vde->VD_GUID, 24); + SET32(meta, vdc->Sequence_Number, 0); +} + +static void +ddf_vol_meta_update(struct ddf_vol_meta *dst, struct ddf_meta *src, + uint8_t *GUID, int started) +{ + struct ddf_header *hdr; + struct ddf_vd_entry *vde; + struct ddf_vdc_record *vdc; + int vnew, bvnew, bvd, size; + u_int ss; + + hdr = src->hdr; + vde = &src->vdr->entry[ddf_meta_find_vd(src, GUID)]; + vdc = ddf_meta_find_vdc(src, GUID); + bvd = GET8D(src, vdc->Secondary_Element_Seq); + size = GET16(src, hdr->Configuration_Record_Length) * src->sectorsize; + + if (dst->vdc == NULL || + (!started && ((int32_t)(GET32D(src, vdc->Sequence_Number) - + GET32(dst, vdc->Sequence_Number))) > 0)) + vnew = 1; + else + vnew = 0; + + if (dst->bvdc[bvd] == NULL || + (!started && ((int32_t)(GET32D(src, vdc->Sequence_Number) - + GET32(dst, bvdc[bvd]->Sequence_Number))) > 0)) + bvnew = 1; + else + bvnew = 0; + + if (vnew) { + dst->bigendian = src->bigendian; + ss = dst->sectorsize = src->sectorsize; + if (dst->hdr != NULL) + free(dst->hdr, M_MD_DDF); + dst->hdr = malloc(ss, M_MD_DDF, M_WAITOK); + memcpy(dst->hdr, src->hdr, ss); + if (dst->cdr != NULL) + free(dst->cdr, M_MD_DDF); + dst->cdr = malloc(GET32(src, hdr->cd_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(dst->cdr, src->cdr, GET32(src, hdr->cd_length) * ss); + if (dst->vde != NULL) + free(dst->vde, M_MD_DDF); + dst->vde = malloc(sizeof(struct ddf_vd_entry), M_MD_DDF, M_WAITOK); + memcpy(dst->vde, vde, sizeof(struct ddf_vd_entry)); + if (dst->vdc != NULL) + free(dst->vdc, M_MD_DDF); + dst->vdc = malloc(size, M_MD_DDF, M_WAITOK); + memcpy(dst->vdc, vdc, size); + } + if (bvnew) { + if (dst->bvdc[bvd] != NULL) + free(dst->bvdc[bvd], M_MD_DDF); + dst->bvdc[bvd] = malloc(size, M_MD_DDF, M_WAITOK); + memcpy(dst->bvdc[bvd], vdc, size); + } +} + +static void +ddf_vol_meta_free(struct ddf_vol_meta *meta) +{ + int i; + + if (meta->hdr != NULL) { + free(meta->hdr, M_MD_DDF); + meta->hdr = NULL; + } + if (meta->cdr != NULL) { + free(meta->cdr, M_MD_DDF); + meta->cdr = NULL; + } + if (meta->vde != NULL) { + free(meta->vde, M_MD_DDF); + meta->vde = NULL; + } + if (meta->vdc != NULL) { + free(meta->vdc, M_MD_DDF); + meta->vdc = NULL; + } + for (i = 0; i < DDF_MAX_DISKS_HARD; i++) { + if (meta->bvdc[i] != NULL) { + free(meta->bvdc[i], M_MD_DDF); + meta->bvdc[i] = NULL; + } + } +} + +static int +ddf_meta_unused_range(struct ddf_meta *meta, off_t *off, off_t *size) +{ + struct ddf_vdc_record *vdc; + off_t beg[32], end[32], beg1, end1; + uint64_t *offp; + int i, j, n, num, pos; + uint32_t ref; + + *off = 0; + *size = 0; + ref = GET32(meta, pdd->PD_Reference); + pos = ddf_meta_find_pd(meta, NULL, ref); + beg[0] = 0; + end[0] = GET64(meta, pdr->entry[pos].Configured_Size); + n = 1; + num = GETCRNUM(meta); + for (i = 0; i < num; i++) { + vdc = GETVDCPTR(meta, i); + if (GET32D(meta, vdc->Signature) != DDF_VDCR_SIGNATURE) + continue; + for (pos = 0; pos < GET16D(meta, vdc->Primary_Element_Count); pos++) + if (GET32D(meta, vdc->Physical_Disk_Sequence[pos]) == ref) + break; + if (pos == GET16D(meta, vdc->Primary_Element_Count)) + continue; + offp = (uint64_t *)&(vdc->Physical_Disk_Sequence[ + GET16(meta, hdr->Max_Primary_Element_Entries)]); + beg1 = GET64P(meta, offp + pos); + end1 = beg1 + GET64D(meta, vdc->Block_Count); + for (j = 0; j < n; j++) { + if (beg[j] >= end1 || end[j] <= beg1 ) + continue; + if (beg[j] < beg1 && end[j] > end1) { + beg[n] = end1; + end[n] = end[j]; + end[j] = beg1; + n++; + } else if (beg[j] < beg1) + end[j] = beg1; + else + beg[j] = end1; + } + } + for (j = 0; j < n; j++) { + if (end[j] - beg[j] > *size) { + *off = beg[j]; + *size = end[j] - beg[j]; + } + } + return ((*size > 0) ? 1 : 0); +} + +static void +ddf_meta_get_name(struct ddf_meta *meta, int num, char *buf) +{ + const char *b; + int i; + + b = meta->vdr->entry[num].VD_Name; + for (i = 15; i >= 0; i--) + if (b[i] != 0x20) + break; + memcpy(buf, b, i + 1); + buf[i + 1] = 0; +} + +static void +ddf_meta_put_name(struct ddf_vol_meta *meta, char *buf) +{ + int len; + + len = min(strlen(buf), 16); + memset(meta->vde->VD_Name, 0x20, 16); + memcpy(meta->vde->VD_Name, buf, len); +} + +static int +ddf_meta_read(struct g_consumer *cp, struct ddf_meta *meta) +{ + struct g_provider *pp; + struct ddf_header *ahdr, *hdr; + char *abuf, *buf; + off_t plba, slba, lba; + int error, len, i; + u_int ss; + uint32_t val; + + ddf_meta_free(meta); + pp = cp->provider; + ss = meta->sectorsize = pp->sectorsize; + /* Read anchor block. */ + abuf = g_read_data(cp, pp->mediasize - ss, ss, &error); + if (abuf == NULL) { + G_RAID_DEBUG(1, "Cannot read metadata from %s (error=%d).", + pp->name, error); + return (error); + } + ahdr = (struct ddf_header *)abuf; + + /* Check if this is an DDF RAID struct */ + if (be32dec(&ahdr->Signature) == DDF_HEADER_SIGNATURE) + meta->bigendian = 1; + else if (le32dec(&ahdr->Signature) == DDF_HEADER_SIGNATURE) + meta->bigendian = 0; + else { + G_RAID_DEBUG(1, "DDF signature check failed on %s", pp->name); + error = EINVAL; + goto done; + } + if (ahdr->Header_Type != DDF_HEADER_ANCHOR) { + G_RAID_DEBUG(1, "DDF header type check failed on %s", pp->name); + error = EINVAL; + goto done; + } + meta->hdr = ahdr; + plba = GET64(meta, hdr->Primary_Header_LBA); + slba = GET64(meta, hdr->Secondary_Header_LBA); + val = GET32(meta, hdr->CRC); + SET32(meta, hdr->CRC, 0xffffffff); + meta->hdr = NULL; + if (crc32(ahdr, ss) != val) { + G_RAID_DEBUG(1, "DDF CRC mismatch on %s", pp->name); + error = EINVAL; + goto done; + } + if ((plba + 6) * ss >= pp->mediasize) { + G_RAID_DEBUG(1, "DDF primary header LBA is wrong on %s", pp->name); + error = EINVAL; + goto done; + } + if (slba != -1 && (slba + 6) * ss >= pp->mediasize) { + G_RAID_DEBUG(1, "DDF secondary header LBA is wrong on %s", pp->name); + error = EINVAL; + goto done; + } + lba = plba; + +doread: + error = 0; + ddf_meta_free(meta); + + /* Read header block. */ + buf = g_read_data(cp, lba * ss, ss, &error); + if (buf == NULL) { +readerror: + G_RAID_DEBUG(1, "DDF %s metadata read error on %s (error=%d).", + (lba == plba) ? "primary" : "secondary", pp->name, error); + if (lba == plba && slba != -1) { + lba = slba; + goto doread; + } + G_RAID_DEBUG(1, "DDF metadata read error on %s.", pp->name); + goto done; + } + meta->hdr = malloc(ss, M_MD_DDF, M_WAITOK); + memcpy(meta->hdr, buf, ss); + g_free(buf); + hdr = meta->hdr; + val = GET32(meta, hdr->CRC); + SET32(meta, hdr->CRC, 0xffffffff); + if (hdr->Signature != ahdr->Signature || + crc32(meta->hdr, ss) != val || + memcmp(hdr->DDF_Header_GUID, ahdr->DDF_Header_GUID, 24) || + GET64(meta, hdr->Primary_Header_LBA) != plba || + GET64(meta, hdr->Secondary_Header_LBA) != slba) { +hdrerror: + G_RAID_DEBUG(1, "DDF %s metadata check failed on %s", + (lba == plba) ? "primary" : "secondary", pp->name); + if (lba == plba && slba != -1) { + lba = slba; + goto doread; + } + G_RAID_DEBUG(1, "DDF metadata check failed on %s", pp->name); + error = EINVAL; + goto done; + } + if ((lba == plba && hdr->Header_Type != DDF_HEADER_PRIMARY) || + (lba == slba && hdr->Header_Type != DDF_HEADER_SECONDARY)) + goto hdrerror; + len = 1; + len = max(len, GET32(meta, hdr->cd_section) + GET32(meta, hdr->cd_length)); + len = max(len, GET32(meta, hdr->pdr_section) + GET32(meta, hdr->pdr_length)); + len = max(len, GET32(meta, hdr->vdr_section) + GET32(meta, hdr->vdr_length)); + len = max(len, GET32(meta, hdr->cr_section) + GET32(meta, hdr->cr_length)); + len = max(len, GET32(meta, hdr->pdd_section) + GET32(meta, hdr->pdd_length)); + if ((val = GET32(meta, hdr->bbmlog_section)) != 0xffffffff) + len = max(len, val + GET32(meta, hdr->bbmlog_length)); + if ((val = GET32(meta, hdr->Diagnostic_Space)) != 0xffffffff) + len = max(len, val + GET32(meta, hdr->Diagnostic_Space_Length)); + if ((val = GET32(meta, hdr->Vendor_Specific_Logs)) != 0xffffffff) + len = max(len, val + GET32(meta, hdr->Vendor_Specific_Logs_Length)); + if ((plba + len) * ss >= pp->mediasize) + goto hdrerror; + if (slba != -1 && (slba + len) * ss >= pp->mediasize) + goto hdrerror; + /* Workaround for Adaptec implementation. */ + if (GET16(meta, hdr->Max_Primary_Element_Entries) == 0xffff) { + SET16(meta, hdr->Max_Primary_Element_Entries, + min(GET16(meta, hdr->Max_PD_Entries), + (GET16(meta, hdr->Configuration_Record_Length) * ss - 512) / 12)); + } + + /* Read controller data. */ + buf = g_read_data(cp, (lba + GET32(meta, hdr->cd_section)) * ss, + GET32(meta, hdr->cd_length) * ss, &error); + if (buf == NULL) + goto readerror; + meta->cdr = malloc(GET32(meta, hdr->cd_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(meta->cdr, buf, GET32(meta, hdr->cd_length) * ss); + g_free(buf); + if (GET32(meta, cdr->Signature) != DDF_CONTROLLER_DATA_SIGNATURE) + goto hdrerror; + + /* Read physical disk records. */ + buf = g_read_data(cp, (lba + GET32(meta, hdr->pdr_section)) * ss, + GET32(meta, hdr->pdr_length) * ss, &error); + if (buf == NULL) + goto readerror; + meta->pdr = malloc(GET32(meta, hdr->pdr_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(meta->pdr, buf, GET32(meta, hdr->pdr_length) * ss); + g_free(buf); + if (GET32(meta, pdr->Signature) != DDF_PDR_SIGNATURE) + goto hdrerror; + + /* Read virtual disk records. */ + buf = g_read_data(cp, (lba + GET32(meta, hdr->vdr_section)) * ss, + GET32(meta, hdr->vdr_length) * ss, &error); + if (buf == NULL) + goto readerror; + meta->vdr = malloc(GET32(meta, hdr->vdr_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(meta->vdr, buf, GET32(meta, hdr->vdr_length) * ss); + g_free(buf); + if (GET32(meta, vdr->Signature) != DDF_VD_RECORD_SIGNATURE) + goto hdrerror; + + /* Read configuration records. */ + buf = g_read_data(cp, (lba + GET32(meta, hdr->cr_section)) * ss, + GET32(meta, hdr->cr_length) * ss, &error); + if (buf == NULL) + goto readerror; + meta->cr = malloc(GET32(meta, hdr->cr_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(meta->cr, buf, GET32(meta, hdr->cr_length) * ss); + g_free(buf); + + /* Read physical disk data. */ + buf = g_read_data(cp, (lba + GET32(meta, hdr->pdd_section)) * ss, + GET32(meta, hdr->pdd_length) * ss, &error); + if (buf == NULL) + goto readerror; + meta->pdd = malloc(GET32(meta, hdr->pdd_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(meta->pdd, buf, GET32(meta, hdr->pdd_length) * ss); + g_free(buf); + if (GET32(meta, pdd->Signature) != DDF_PDD_SIGNATURE) + goto hdrerror; + i = ddf_meta_find_pd(meta, NULL, GET32(meta, pdd->PD_Reference)); + if (i < 0) + goto hdrerror; + + /* Read BBM Log. */ + if (GET32(meta, hdr->bbmlog_section) != 0xffffffff && + GET32(meta, hdr->bbmlog_length) != 0) { + buf = g_read_data(cp, (lba + GET32(meta, hdr->bbmlog_section)) * ss, + GET32(meta, hdr->bbmlog_length) * ss, &error); + if (buf == NULL) + goto readerror; + meta->bbm = malloc(GET32(meta, hdr->bbmlog_length) * ss, M_MD_DDF, M_WAITOK); + memcpy(meta->bbm, buf, GET32(meta, hdr->bbmlog_length) * ss); + g_free(buf); + if (GET32(meta, bbm->Signature) != DDF_BBML_SIGNATURE) + goto hdrerror; + } + +done: + g_free(abuf); + if (error != 0) + ddf_meta_free(meta); + return (error); +} + +static int +ddf_meta_write(struct g_consumer *cp, struct ddf_meta *meta) +{ + struct g_provider *pp; + struct ddf_vdc_record *vdc; + off_t alba, plba, slba, lba; + u_int ss, size; + int error, i, num; + + pp = cp->provider; + ss = pp->sectorsize; + lba = alba = pp->mediasize / ss - 1; + plba = GET64(meta, hdr->Primary_Header_LBA); + slba = GET64(meta, hdr->Secondary_Header_LBA); + +next: + SET8(meta, hdr->Header_Type, (lba == alba) ? DDF_HEADER_ANCHOR : + (lba == plba) ? DDF_HEADER_PRIMARY : DDF_HEADER_SECONDARY); + SET32(meta, hdr->CRC, 0xffffffff); + SET32(meta, hdr->CRC, crc32(meta->hdr, ss)); + error = g_write_data(cp, lba * ss, meta->hdr, ss); + if (error != 0) { +err: + G_RAID_DEBUG(1, "Cannot write metadata to %s (error=%d).", + pp->name, error); + if (lba != alba) + goto done; + } + if (lba == alba) { + lba = plba; + goto next; + } + + size = GET32(meta, hdr->cd_length) * ss; + SET32(meta, cdr->CRC, 0xffffffff); + SET32(meta, cdr->CRC, crc32(meta->cdr, size)); + error = g_write_data(cp, (lba + GET32(meta, hdr->cd_section)) * ss, + meta->cdr, size); + if (error != 0) + goto err; + + size = GET32(meta, hdr->pdr_length) * ss; + SET32(meta, pdr->CRC, 0xffffffff); + SET32(meta, pdr->CRC, crc32(meta->pdr, size)); + error = g_write_data(cp, (lba + GET32(meta, hdr->pdr_section)) * ss, + meta->pdr, size); + if (error != 0) + goto err; + + size = GET32(meta, hdr->vdr_length) * ss; + SET32(meta, vdr->CRC, 0xffffffff); + SET32(meta, vdr->CRC, crc32(meta->vdr, size)); + error = g_write_data(cp, (lba + GET32(meta, hdr->vdr_section)) * ss, + meta->vdr, size); + if (error != 0) + goto err; + + size = GET16(meta, hdr->Configuration_Record_Length) * ss; + num = GETCRNUM(meta); + for (i = 0; i < num; i++) { + vdc = GETVDCPTR(meta, i); + SET32D(meta, vdc->CRC, 0xffffffff); + SET32D(meta, vdc->CRC, crc32(vdc, size)); + } + error = g_write_data(cp, (lba + GET32(meta, hdr->cr_section)) * ss, + meta->cr, size * num); + if (error != 0) + goto err; + + size = GET32(meta, hdr->pdd_length) * ss; + SET32(meta, pdd->CRC, 0xffffffff); + SET32(meta, pdd->CRC, crc32(meta->pdd, size)); + error = g_write_data(cp, (lba + GET32(meta, hdr->pdd_section)) * ss, + meta->pdd, size); + if (error != 0) + goto err; + + if (GET32(meta, hdr->bbmlog_length) != 0) { + size = GET32(meta, hdr->bbmlog_length) * ss; + SET32(meta, bbm->CRC, 0xffffffff); + SET32(meta, bbm->CRC, crc32(meta->bbm, size)); + error = g_write_data(cp, + (lba + GET32(meta, hdr->bbmlog_section)) * ss, + meta->bbm, size); + if (error != 0) + goto err; + } + +done: + if (lba == plba && slba != -1) { + lba = slba; + goto next; + } + + return (error); +} + +static int +ddf_meta_erase(struct g_consumer *cp) +{ + struct g_provider *pp; + char *buf; + int error; + + pp = cp->provider; + buf = malloc(pp->sectorsize, M_MD_DDF, M_WAITOK | M_ZERO); + error = g_write_data(cp, pp->mediasize - pp->sectorsize, + buf, pp->sectorsize); + if (error != 0) { + G_RAID_DEBUG(1, "Cannot erase metadata on %s (error=%d).", + pp->name, error); + } + free(buf, M_MD_DDF); + return (error); +} + +static struct g_raid_volume * +g_raid_md_ddf_get_volume(struct g_raid_softc *sc, uint8_t *GUID) +{ + struct g_raid_volume *vol; + struct g_raid_md_ddf_pervolume *pv; + + TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { + pv = vol->v_md_data; + if (memcmp(pv->pv_meta.vde->VD_GUID, GUID, 24) == 0) + break; + } + return (vol); +} + +static struct g_raid_disk * +g_raid_md_ddf_get_disk(struct g_raid_softc *sc, uint8_t *GUID, uint32_t id) +{ + struct g_raid_disk *disk; + struct g_raid_md_ddf_perdisk *pd; + struct ddf_meta *meta; + + TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { + pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; + meta = &pd->pd_meta; + if (GUID != NULL) { + if (memcmp(meta->pdd->PD_GUID, GUID, 24) == 0) + break; + } else { + if (GET32(meta, pdd->PD_Reference) == id) + break; + } + } + return (disk); +} + +static int +g_raid_md_ddf_purge_volumes(struct g_raid_softc *sc) +{ + struct g_raid_volume *vol, *tvol; + struct g_raid_md_ddf_pervolume *pv; + int i, res; + + res = 0; + TAILQ_FOREACH_SAFE(vol, &sc->sc_volumes, v_next, tvol) { + pv = vol->v_md_data; + if (vol->v_stopping) + continue; + for (i = 0; i < vol->v_disks_count; i++) { + if (vol->v_subdisks[i].sd_state != G_RAID_SUBDISK_S_NONE) + break; + } + if (i >= vol->v_disks_count) { + g_raid_destroy_volume(vol); + res = 1; + } + } + return (res); +} + +static int +g_raid_md_ddf_purge_disks(struct g_raid_softc *sc) +{ +#if 0 + struct g_raid_disk *disk, *tdisk; + struct g_raid_volume *vol; + struct g_raid_md_ddf_perdisk *pd; + int i, j, res; + + res = 0; + TAILQ_FOREACH_SAFE(disk, &sc->sc_disks, d_next, tdisk) { + if (disk->d_state == G_RAID_DISK_S_SPARE) + continue; + pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; + + /* Scan for deleted volumes. */ + for (i = 0; i < pd->pd_subdisks; ) { + vol = g_raid_md_ddf_get_volume(sc, + pd->pd_meta[i]->volume_id); + if (vol != NULL && !vol->v_stopping) { + i++; + continue; + } + free(pd->pd_meta[i], M_MD_DDF); + for (j = i; j < pd->pd_subdisks - 1; j++) + pd->pd_meta[j] = pd->pd_meta[j + 1]; + pd->pd_meta[DDF_MAX_SUBDISKS - 1] = NULL; + pd->pd_subdisks--; + pd->pd_updated = 1; + } + + /* If there is no metadata left - erase and delete disk. */ + if (pd->pd_subdisks == 0) { + ddf_meta_erase(disk->d_consumer); + g_raid_destroy_disk(disk); + res = 1; + } + } + return (res); +#endif + return (0); +} + +static int +g_raid_md_ddf_supported(int level, int qual, int disks, int force) +{ + + if (disks > DDF_MAX_DISKS_HARD) + return (0); + switch (level) { + case G_RAID_VOLUME_RL_RAID0: + if (qual != G_RAID_VOLUME_RLQ_NONE) + return (0); + if (disks < 1) + return (0); + if (!force && disks < 2) + return (0); + break; + case G_RAID_VOLUME_RL_RAID1: + if (disks < 1) + return (0); + if (qual == G_RAID_VOLUME_RLQ_R1SM) { + if (!force && disks != 2) + return (0); + } else if (qual == G_RAID_VOLUME_RLQ_R1MM) { + if (!force && disks != 3) + return (0); + } else + return (0); + break; + case G_RAID_VOLUME_RL_RAID3: + if (qual != G_RAID_VOLUME_RLQ_R3P0 && + qual != G_RAID_VOLUME_RLQ_R3PN) + return (0); + if (disks < 3) + return (0); + break; + case G_RAID_VOLUME_RL_RAID4: + if (qual != G_RAID_VOLUME_RLQ_R4P0 && + qual != G_RAID_VOLUME_RLQ_R4PN) + return (0); + if (disks < 3) + return (0); + break; + case G_RAID_VOLUME_RL_RAID5: + if (qual != G_RAID_VOLUME_RLQ_R5RA && + qual != G_RAID_VOLUME_RLQ_R5RS && + qual != G_RAID_VOLUME_RLQ_R5LA && + qual != G_RAID_VOLUME_RLQ_R5LS) + return (0); + if (disks < 3) + return (0); + break; + case G_RAID_VOLUME_RL_RAID6: + if (qual != G_RAID_VOLUME_RLQ_R6RA && + qual != G_RAID_VOLUME_RLQ_R6RS && + qual != G_RAID_VOLUME_RLQ_R6LA && + qual != G_RAID_VOLUME_RLQ_R6LS) + return (0); + if (disks < 4) + return (0); + break; + case G_RAID_VOLUME_RL_RAIDMDF: + if (qual != G_RAID_VOLUME_RLQ_RMDFRA && + qual != G_RAID_VOLUME_RLQ_RMDFRS && + qual != G_RAID_VOLUME_RLQ_RMDFLA && + qual != G_RAID_VOLUME_RLQ_RMDFLS) + return (0); + if (disks < 4) + return (0); + break; + case G_RAID_VOLUME_RL_RAID1E: + if (qual != G_RAID_VOLUME_RLQ_R1EA && + qual != G_RAID_VOLUME_RLQ_R1EO) + return (0); + if (disks < 3) + return (0); + break; + case G_RAID_VOLUME_RL_SINGLE: + if (qual != G_RAID_VOLUME_RLQ_NONE) + return (0); + if (disks != 1) + return (0); + break; + case G_RAID_VOLUME_RL_CONCAT: + if (qual != G_RAID_VOLUME_RLQ_NONE) + return (0); + if (disks < 2) + return (0); + break; + case G_RAID_VOLUME_RL_RAID5E: + if (qual != G_RAID_VOLUME_RLQ_R5ERA && + qual != G_RAID_VOLUME_RLQ_R5ERS && + qual != G_RAID_VOLUME_RLQ_R5ELA && + qual != G_RAID_VOLUME_RLQ_R5ELS) + return (0); + if (disks < 4) + return (0); + break; + case G_RAID_VOLUME_RL_RAID5EE: + if (qual != G_RAID_VOLUME_RLQ_R5EERA && + qual != G_RAID_VOLUME_RLQ_R5EERS && + qual != G_RAID_VOLUME_RLQ_R5EELA && + qual != G_RAID_VOLUME_RLQ_R5EELS) + return (0); + if (disks < 4) + return (0); + break; + case G_RAID_VOLUME_RL_RAID5R: + if (qual != G_RAID_VOLUME_RLQ_R5RRA && + qual != G_RAID_VOLUME_RLQ_R5RRS && + qual != G_RAID_VOLUME_RLQ_R5RLA && + qual != G_RAID_VOLUME_RLQ_R5RLS) + return (0); + if (disks < 3) + return (0); + break; + default: + return (0); + } + return (1); +} + +static int +g_raid_md_ddf_start_disk(struct g_raid_disk *disk, struct g_raid_volume *vol) +{ + struct g_raid_softc *sc; + struct g_raid_subdisk *sd; + struct g_raid_md_ddf_perdisk *pd; + struct g_raid_md_ddf_pervolume *pv; + struct g_raid_md_ddf_object *mdi; + struct ddf_vol_meta *vmeta; + struct ddf_meta *pdmeta, *gmeta; + struct ddf_vdc_record *vdc1; + struct ddf_sa_record *sa; + off_t size, eoff = 0, esize = 0; + uint64_t *val2; + int disk_pos, md_disk_bvd = -1, md_disk_pos = -1, md_pde_pos; + int i, resurrection = 0; + uint32_t reference; + + sc = disk->d_softc; + mdi = (struct g_raid_md_ddf_object *)sc->sc_md; + pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; + pdmeta = &pd->pd_meta; + reference = GET32(&pd->pd_meta, pdd->PD_Reference); + + pv = vol->v_md_data; + vmeta = &pv->pv_meta; + gmeta = &mdi->mdio_meta; + + /* Find disk position in metadata by it's reference. */ + disk_pos = ddf_meta_find_disk(vmeta, reference, + &md_disk_bvd, &md_disk_pos); + md_pde_pos = ddf_meta_find_pd(gmeta, NULL, reference); + + if (disk_pos < 0) { + G_RAID_DEBUG1(1, sc, + "Disk %s is not a present part of the volume %s", + g_raid_get_diskname(disk), vol->v_name); + + /* Failed stale disk is useless for us. */ + if ((GET16(gmeta, pdr->entry[md_pde_pos].PD_State) & DDF_PDE_PFA) != 0) { + g_raid_change_disk_state(disk, G_RAID_DISK_S_STALE_FAILED); + return (0); + } + + /* If disk has some metadata for this volume - erase. */ + if ((vdc1 = ddf_meta_find_vdc(pdmeta, vmeta->vdc->VD_GUID)) != NULL) + SET32D(pdmeta, vdc1->Signature, 0xffffffff); + + /* If we are in the start process, that's all for now. */ + if (!pv->pv_started) + goto nofit; + /* + * If we have already started - try to get use of the disk. + * Try to replace OFFLINE disks first, then FAILED. + */ + if (ddf_meta_count_vdc(&pd->pd_meta, NULL) >= + GET16(&pd->pd_meta, hdr->Max_Partitions)) { + G_RAID_DEBUG1(1, sc, "No free partitions on disk %s", + g_raid_get_diskname(disk)); + goto nofit; + } + ddf_meta_unused_range(&pd->pd_meta, &eoff, &esize); + if (esize == 0) { + G_RAID_DEBUG1(1, sc, "No free space on disk %s", + g_raid_get_diskname(disk)); + goto nofit; + } + eoff *= pd->pd_meta.sectorsize; + esize *= pd->pd_meta.sectorsize; + size = INT64_MAX; + for (i = 0; i < vol->v_disks_count; i++) { + sd = &vol->v_subdisks[i]; + if (sd->sd_state != G_RAID_SUBDISK_S_NONE) + size = sd->sd_size; + if (sd->sd_state <= G_RAID_SUBDISK_S_FAILED && + (disk_pos < 0 || + vol->v_subdisks[i].sd_state < sd->sd_state)) + disk_pos = i; + } + if (disk_pos >= 0 && + vol->v_raid_level != G_RAID_VOLUME_RL_CONCAT && + esize < size) { + G_RAID_DEBUG1(1, sc, "Disk %s free space " + "is too small (%ju < %ju)", + g_raid_get_diskname(disk), esize, size); + disk_pos = -1; + } + if (disk_pos >= 0) { + if (vol->v_raid_level != G_RAID_VOLUME_RL_CONCAT) + esize = size; + md_disk_bvd = disk_pos / GET16(vmeta, vdc->Primary_Element_Count); // XXX + md_disk_pos = disk_pos % GET16(vmeta, vdc->Primary_Element_Count); // XXX + } else { +nofit: + if (disk->d_state == G_RAID_DISK_S_NONE) + g_raid_change_disk_state(disk, + G_RAID_DISK_S_STALE); + return (0); + } + + /* + * If spare is committable, delete spare record. + * Othersize, mark it active and leave there. + */ + sa = ddf_meta_find_sa(&pd->pd_meta, 0); + if (sa != NULL) { + if ((GET8D(&pd->pd_meta, sa->Spare_Type) & + DDF_SAR_TYPE_REVERTIBLE) == 0) { + SET32D(&pd->pd_meta, sa->Signature, 0xffffffff); + } else { + SET8D(&pd->pd_meta, sa->Spare_Type, + GET8D(&pd->pd_meta, sa->Spare_Type) | + DDF_SAR_TYPE_ACTIVE); + } + } + + G_RAID_DEBUG1(1, sc, "Disk %s takes pos %d in the volume %s", + g_raid_get_diskname(disk), disk_pos, vol->v_name); + resurrection = 1; + } + + sd = &vol->v_subdisks[disk_pos]; + + if (resurrection && sd->sd_disk != NULL) { + g_raid_change_disk_state(sd->sd_disk, + G_RAID_DISK_S_STALE_FAILED); + TAILQ_REMOVE(&sd->sd_disk->d_subdisks, + sd, sd_next); + } + vol->v_subdisks[disk_pos].sd_disk = disk; + TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); + + /* Welcome the new disk. */ + if (resurrection) + g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE); + else if (GET8(gmeta, pdr->entry[md_pde_pos].PD_State) & DDF_PDE_PFA) + g_raid_change_disk_state(disk, G_RAID_DISK_S_FAILED); + else + g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE); + + if (resurrection) { + sd->sd_offset = eoff; + sd->sd_size = esize; + } else if (pdmeta->cr != NULL && + (vdc1 = ddf_meta_find_vdc(pdmeta, vmeta->vdc->VD_GUID)) != NULL) { + val2 = (uint64_t *)&(vdc1->Physical_Disk_Sequence[GET16(vmeta, hdr->Max_Primary_Element_Entries)]); + sd->sd_offset = (off_t)GET64P(pdmeta, val2 + md_disk_pos) * 512; + sd->sd_size = (off_t)GET64D(pdmeta, vdc1->Block_Count) * 512; + } + + if (resurrection) { + /* Stale disk, almost same as new. */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_NEW); + } else if (GET8(gmeta, pdr->entry[md_pde_pos].PD_State) & DDF_PDE_PFA) { + /* Failed disk. */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_FAILED); + } else if ((GET8(gmeta, pdr->entry[md_pde_pos].PD_State) & + (DDF_PDE_FAILED | DDF_PDE_REBUILD)) != 0) { + /* Rebuilding disk. */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_REBUILD); + sd->sd_rebuild_pos = 0; + } else if ((GET8(vmeta, vde->VD_State) & DDF_VDE_DIRTY) != 0 || + (GET8(vmeta, vde->Init_State) & DDF_VDE_INIT_MASK) != + DDF_VDE_INIT_FULL) { + /* Stale disk or dirty volume (unclean shutdown). */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_STALE); + } else { + /* Up to date disk. */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_ACTIVE); + } + g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW, + G_RAID_EVENT_SUBDISK); + + return (resurrection); +} + +static void +g_raid_md_ddf_refill(struct g_raid_softc *sc) +{ + struct g_raid_volume *vol; + struct g_raid_subdisk *sd; + struct g_raid_disk *disk; + struct g_raid_md_object *md; + struct g_raid_md_ddf_perdisk *pd; + struct g_raid_md_ddf_pervolume *pv; + int update, updated, i, bad; + + md = sc->sc_md; +restart: + updated = 0; + TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { + pv = vol->v_md_data; + if (!pv->pv_started || vol->v_stopping) + continue; + + /* Search for subdisk that needs replacement. */ + bad = 0; + for (i = 0; i < vol->v_disks_count; i++) { + sd = &vol->v_subdisks[i]; + if (sd->sd_state == G_RAID_SUBDISK_S_NONE || + sd->sd_state == G_RAID_SUBDISK_S_FAILED) + bad = 1; + } + if (!bad) + continue; + + G_RAID_DEBUG1(1, sc, "Volume %s is not complete, " + "trying to refill.", vol->v_name); + + TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { + /* Skip failed. */ + if (disk->d_state < G_RAID_DISK_S_SPARE) + continue; + /* Skip already used by this volume. */ + for (i = 0; i < vol->v_disks_count; i++) { + sd = &vol->v_subdisks[i]; + if (sd->sd_disk == disk) + break; + } + if (i < vol->v_disks_count) + continue; + + /* Try to use disk if it has empty extents. */ + pd = disk->d_md_data; + if (ddf_meta_count_vdc(&pd->pd_meta, NULL) < + GET16(&pd->pd_meta, hdr->Max_Partitions)) { + update = g_raid_md_ddf_start_disk(disk, vol); + } else + update = 0; + if (update) { + updated = 1; + g_raid_md_write_ddf(md, vol, NULL, disk); + break; + } + } + } + if (updated) + goto restart; +} + +static void +g_raid_md_ddf_start(struct g_raid_volume *vol) +{ + struct g_raid_softc *sc; + struct g_raid_subdisk *sd; + struct g_raid_disk *disk; + struct g_raid_md_object *md; + struct g_raid_md_ddf_perdisk *pd; + struct g_raid_md_ddf_pervolume *pv; + struct g_raid_md_ddf_object *mdi; + struct ddf_vol_meta *vmeta; + struct ddf_vdc_record *vdc; + uint64_t *val2; + int i, j, bvd; + + sc = vol->v_softc; + md = sc->sc_md; + mdi = (struct g_raid_md_ddf_object *)md; + pv = vol->v_md_data; + vmeta = &pv->pv_meta; + vdc = vmeta->vdc; + + vol->v_raid_level = GET8(vmeta, vdc->Primary_RAID_Level); + vol->v_raid_level_qualifier = GET8(vmeta, vdc->RLQ); + if (GET8(vmeta, vdc->Secondary_Element_Count) > 1 && + vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 && + GET8(vmeta, vdc->Secondary_RAID_Level) == 0) + vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E; + vol->v_sectorsize = GET16(vmeta, vdc->Block_Size); + if (vol->v_sectorsize == 0xffff) + vol->v_sectorsize = vmeta->sectorsize; + vol->v_strip_size = vol->v_sectorsize << GET8(vmeta, vdc->Stripe_Size); + vol->v_disks_count = GET16(vmeta, vdc->Primary_Element_Count) * + GET8(vmeta, vdc->Secondary_Element_Count); + vol->v_mdf_pdisks = GET8(vmeta, vdc->MDF_Parity_Disks); + vol->v_mdf_polynomial = GET16(vmeta, vdc->MDF_Parity_Generator_Polynomial); + vol->v_mdf_method = GET8(vmeta, vdc->MDF_Constant_Generation_Method); + if (GET8(vmeta, vdc->Rotate_Parity_count) > 31) + vol->v_rotate_parity = 1; + else + vol->v_rotate_parity = 1 << GET8(vmeta, vdc->Rotate_Parity_count); + vol->v_mediasize = GET64(vmeta, vdc->VD_Size) * vol->v_sectorsize; + for (i = 0, j = 0, bvd = 0; i < vol->v_disks_count; i++, j++) { + if (j == GET16(vmeta, vdc->Primary_Element_Count)) { + j = 0; + bvd++; + } + sd = &vol->v_subdisks[i]; + if (vmeta->bvdc[bvd] == NULL) { + sd->sd_offset = 0; + sd->sd_size = GET64(vmeta, vdc->Block_Count) * + vol->v_sectorsize; + continue; + } + val2 = (uint64_t *)&(vmeta->bvdc[bvd]->Physical_Disk_Sequence[ + GET16(vmeta, hdr->Max_Primary_Element_Entries)]); + sd->sd_offset = GET64P(vmeta, val2 + j) * vol->v_sectorsize; + sd->sd_size = GET64(vmeta, bvdc[bvd]->Block_Count) * + vol->v_sectorsize; + } + g_raid_start_volume(vol); + + /* Make all disks found till the moment take their places. */ + TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { + pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; + if (ddf_meta_find_vdc(&pd->pd_meta, vmeta->vdc->VD_GUID) != NULL) + g_raid_md_ddf_start_disk(disk, vol); + } + + pv->pv_started = 1; + mdi->mdio_starting--; + callout_stop(&pv->pv_start_co); + G_RAID_DEBUG1(0, sc, "Volume started."); + g_raid_md_write_ddf(md, vol, NULL, NULL); + + /* Pickup any STALE/SPARE disks to refill array if needed. */ + g_raid_md_ddf_refill(sc); + + g_raid_event_send(vol, G_RAID_VOLUME_E_START, G_RAID_EVENT_VOLUME); +} + +static void +g_raid_ddf_go(void *arg) +{ + struct g_raid_volume *vol; + struct g_raid_softc *sc; + struct g_raid_md_ddf_pervolume *pv; + + vol = arg; + pv = vol->v_md_data; + sc = vol->v_softc; + if (!pv->pv_started) { + G_RAID_DEBUG1(0, sc, "Force volume start due to timeout."); + g_raid_event_send(vol, G_RAID_VOLUME_E_STARTMD, + G_RAID_EVENT_VOLUME); + } +} + +static void +g_raid_md_ddf_new_disk(struct g_raid_disk *disk) +{ + struct g_raid_softc *sc; + struct g_raid_md_object *md; + struct g_raid_md_ddf_perdisk *pd; + struct g_raid_md_ddf_pervolume *pv; + struct g_raid_md_ddf_object *mdi; + struct g_raid_volume *vol; + struct ddf_meta *pdmeta; + struct ddf_vol_meta *vmeta; + struct ddf_vdc_record *vdc; + struct ddf_vd_entry *vde; + int i, j, k, num, have, need, cnt, spare; + uint32_t val; + char buf[17]; + + sc = disk->d_softc; + md = sc->sc_md; + mdi = (struct g_raid_md_ddf_object *)md; + pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; + pdmeta = &pd->pd_meta; + spare = -1; + + if (mdi->mdio_meta.hdr == NULL) + ddf_meta_copy(&mdi->mdio_meta, pdmeta); + else + ddf_meta_update(&mdi->mdio_meta, pdmeta); + + num = GETCRNUM(pdmeta); + for (j = 0; j < num; j++) { + vdc = GETVDCPTR(pdmeta, j); + val = GET32D(pdmeta, vdc->Signature); + + if (val == DDF_SA_SIGNATURE && spare == -1) + spare = 1; + + if (val != DDF_VDCR_SIGNATURE) + continue; + spare = 0; + k = ddf_meta_find_vd(pdmeta, vdc->VD_GUID); + if (k < 0) + continue; + vde = &pdmeta->vdr->entry[k]; + + /* Look for volume with matching ID. */ + vol = g_raid_md_ddf_get_volume(sc, vdc->VD_GUID); + if (vol == NULL) { + ddf_meta_get_name(pdmeta, k, buf); + vol = g_raid_create_volume(sc, buf, + GET16D(pdmeta, vde->VD_Number)); + pv = malloc(sizeof(*pv), M_MD_DDF, M_WAITOK | M_ZERO); + vol->v_md_data = pv; + callout_init(&pv->pv_start_co, 1); + callout_reset(&pv->pv_start_co, + g_raid_start_timeout * hz, + g_raid_ddf_go, vol); + mdi->mdio_starting++; + } else + pv = vol->v_md_data; + + /* If we haven't started yet - check metadata freshness. */ + vmeta = &pv->pv_meta; + ddf_vol_meta_update(vmeta, pdmeta, vdc->VD_GUID, pv->pv_started); + } + + if (spare == 1) { + g_raid_change_disk_state(disk, G_RAID_DISK_S_SPARE); + g_raid_md_ddf_refill(sc); + } + + TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { + pv = vol->v_md_data; + vmeta = &pv->pv_meta; + + if (ddf_meta_find_vdc(pdmeta, vmeta->vdc->VD_GUID) == NULL) + continue; + + if (pv->pv_started) { + if (g_raid_md_ddf_start_disk(disk, vol)) + g_raid_md_write_ddf(md, vol, NULL, NULL); + continue; + } + + /* If we collected all needed disks - start array. */ + need = 0; + have = 0; + for (k = 0; k < GET8(vmeta, vdc->Secondary_Element_Count); k++) { + if (vmeta->bvdc[k] == NULL) { + need += GET16(vmeta, vdc->Primary_Element_Count); + continue; + } + cnt = GET16(vmeta, bvdc[k]->Primary_Element_Count); + need += cnt; + for (i = 0; i < cnt; i++) { + val = GET32(vmeta, bvdc[k]->Physical_Disk_Sequence[i]); + if (g_raid_md_ddf_get_disk(sc, NULL, val) != NULL) + have++; + } + } + G_RAID_DEBUG1(1, sc, "Volume %s now has %d of %d disks", + vol->v_name, have, need); + if (have == need) + g_raid_md_ddf_start(vol); + } +} + +static int +g_raid_md_create_req_ddf(struct g_raid_md_object *md, struct g_class *mp, + struct gctl_req *req, struct g_geom **gp) +{ + struct g_geom *geom; + struct g_raid_softc *sc; + struct g_raid_md_ddf_object *mdi, *mdi1; + char name[16]; + const char *fmtopt; + int be = 1; + + mdi = (struct g_raid_md_ddf_object *)md; + fmtopt = gctl_get_asciiparam(req, "fmtopt"); + if (fmtopt == NULL || strcasecmp(fmtopt, "BE") == 0) + be = 1; + else if (strcasecmp(fmtopt, "LE") == 0) + be = 0; + else { + gctl_error(req, "Incorrect fmtopt argument."); + return (G_RAID_MD_TASTE_FAIL); + } + + /* Search for existing node. */ + LIST_FOREACH(geom, &mp->geom, geom) { + sc = geom->softc; + if (sc == NULL) + continue; + if (sc->sc_stopping != 0) + continue; + if (sc->sc_md->mdo_class != md->mdo_class) + continue; + mdi1 = (struct g_raid_md_ddf_object *)sc->sc_md; + if (mdi1->mdio_bigendian != be) + continue; + break; + } + if (geom != NULL) { + *gp = geom; + return (G_RAID_MD_TASTE_EXISTING); + } + + /* Create new one if not found. */ + mdi->mdio_bigendian = be; + snprintf(name, sizeof(name), "DDF%s", be ? "" : "-LE"); + sc = g_raid_create_node(mp, name, md); + if (sc == NULL) + return (G_RAID_MD_TASTE_FAIL); + md->mdo_softc = sc; + *gp = sc->sc_geom; + return (G_RAID_MD_TASTE_NEW); +} + +static int +g_raid_md_taste_ddf(struct g_raid_md_object *md, struct g_class *mp, + struct g_consumer *cp, struct g_geom **gp) +{ + struct g_consumer *rcp; + struct g_provider *pp; + struct g_raid_softc *sc; + struct g_raid_disk *disk; + struct ddf_meta meta; + struct g_raid_md_ddf_perdisk *pd; + struct g_raid_md_ddf_object *mdi; + struct g_geom *geom; + int error, result, len, be; + char name[16]; + + G_RAID_DEBUG(1, "Tasting DDF on %s", cp->provider->name); + mdi = (struct g_raid_md_ddf_object *)md; + pp = cp->provider; + + /* Read metadata from device. */ + if (g_access(cp, 1, 0, 0) != 0) + return (G_RAID_MD_TASTE_FAIL); + g_topology_unlock(); + bzero(&meta, sizeof(meta)); + error = ddf_meta_read(cp, &meta); + g_topology_lock(); + g_access(cp, -1, 0, 0); + if (error != 0) + return (G_RAID_MD_TASTE_FAIL); + be = meta.bigendian; + + /* Metadata valid. Print it. */ + g_raid_md_ddf_print(&meta); + + /* Search for matching node. */ + sc = NULL; + LIST_FOREACH(geom, &mp->geom, geom) { + sc = geom->softc; + if (sc == NULL) + continue; + if (sc->sc_stopping != 0) + continue; + if (sc->sc_md->mdo_class != md->mdo_class) + continue; + mdi = (struct g_raid_md_ddf_object *)sc->sc_md; + if (mdi->mdio_bigendian != be) + continue; + break; + } + + /* Found matching node. */ + if (geom != NULL) { + G_RAID_DEBUG(1, "Found matching array %s", sc->sc_name); + result = G_RAID_MD_TASTE_EXISTING; + + } else { /* Not found matching node -- create one. */ + result = G_RAID_MD_TASTE_NEW; + mdi->mdio_bigendian = be; + snprintf(name, sizeof(name), "DDF%s", be ? "" : "-LE"); + sc = g_raid_create_node(mp, name, md); + md->mdo_softc = sc; + geom = sc->sc_geom; + } + + rcp = g_new_consumer(geom); + g_attach(rcp, pp); + if (g_access(rcp, 1, 1, 1) != 0) + ; //goto fail1; + + g_topology_unlock(); + sx_xlock(&sc->sc_lock); + + pd = malloc(sizeof(*pd), M_MD_DDF, M_WAITOK | M_ZERO); + pd->pd_meta = meta; + disk = g_raid_create_disk(sc); + disk->d_md_data = (void *)pd; + disk->d_consumer = rcp; + rcp->private = disk; + + /* Read kernel dumping information. */ + disk->d_kd.offset = 0; + disk->d_kd.length = OFF_MAX; + len = sizeof(disk->d_kd); + error = g_io_getattr("GEOM::kerneldump", rcp, &len, &disk->d_kd); + if (disk->d_kd.di.dumper == NULL) + G_RAID_DEBUG1(2, sc, "Dumping not supported by %s: %d.", + rcp->provider->name, error); + + g_raid_md_ddf_new_disk(disk); + + sx_xunlock(&sc->sc_lock); + g_topology_lock(); + *gp = geom; + return (result); +} + +static int +g_raid_md_event_ddf(struct g_raid_md_object *md, + struct g_raid_disk *disk, u_int event) +{ + struct g_raid_softc *sc; + + sc = md->mdo_softc; + if (disk == NULL) + return (-1); + switch (event) { + case G_RAID_DISK_E_DISCONNECTED: + /* Delete disk. */ + g_raid_change_disk_state(disk, G_RAID_DISK_S_NONE); + g_raid_destroy_disk(disk); + g_raid_md_ddf_purge_volumes(sc); + + /* Write updated metadata to all disks. */ + g_raid_md_write_ddf(md, NULL, NULL, NULL); + + /* Check if anything left. */ + if (g_raid_ndisks(sc, -1) == 0) + g_raid_destroy_node(sc, 0); + else + g_raid_md_ddf_refill(sc); + return (0); + } + return (-2); +} + +static int +g_raid_md_volume_event_ddf(struct g_raid_md_object *md, + struct g_raid_volume *vol, u_int event) +{ + struct g_raid_md_ddf_pervolume *pv; + + pv = (struct g_raid_md_ddf_pervolume *)vol->v_md_data; + switch (event) { + case G_RAID_VOLUME_E_STARTMD: + if (!pv->pv_started) + g_raid_md_ddf_start(vol); + return (0); + } + return (-2); +} + +static int +g_raid_md_ctl_ddf(struct g_raid_md_object *md, + struct gctl_req *req) +{ + struct g_raid_softc *sc; + struct g_raid_volume *vol, *vol1; + struct g_raid_subdisk *sd; + struct g_raid_disk *disk, *disks[DDF_MAX_DISKS_HARD]; + struct g_raid_md_ddf_perdisk *pd; + struct g_raid_md_ddf_pervolume *pv; + struct g_raid_md_ddf_object *mdi; + struct ddf_sa_record *sa; + struct g_consumer *cp; + struct g_provider *pp; + char arg[16]; + const char *verb, *volname, *levelname, *diskname; + char *tmp; + int *nargs, *force; + off_t size, sectorsize, strip, offs[DDF_MAX_DISKS_HARD], esize; + intmax_t *sizearg, *striparg; + int i, numdisks, len, level, qual; + int error; + + sc = md->mdo_softc; + mdi = (struct g_raid_md_ddf_object *)md; + verb = gctl_get_param(req, "verb", NULL); + nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs)); + error = 0; + + if (strcmp(verb, "label") == 0) { + + if (*nargs < 4) { + gctl_error(req, "Invalid number of arguments."); + return (-1); + } + volname = gctl_get_asciiparam(req, "arg1"); + if (volname == NULL) { + gctl_error(req, "No volume name."); + return (-2); + } + levelname = gctl_get_asciiparam(req, "arg2"); + if (levelname == NULL) { + gctl_error(req, "No RAID level."); + return (-3); + } + if (g_raid_volume_str2level(levelname, &level, &qual)) { + gctl_error(req, "Unknown RAID level '%s'.", levelname); + return (-4); + } + numdisks = *nargs - 3; + force = gctl_get_paraml(req, "force", sizeof(*force)); + if (!g_raid_md_ddf_supported(level, qual, numdisks, + force ? *force : 0)) { + gctl_error(req, "Unsupported RAID level " + "(0x%02x/0x%02x), or number of disks (%d).", + level, qual, numdisks); + return (-5); + } + + /* Search for disks, connect them and probe. */ + size = INT64_MAX; + sectorsize = 0; + bzero(disks, sizeof(disks)); + bzero(offs, sizeof(offs)); + for (i = 0; i < numdisks; i++) { + snprintf(arg, sizeof(arg), "arg%d", i + 3); + diskname = gctl_get_asciiparam(req, arg); + if (diskname == NULL) { + gctl_error(req, "No disk name (%s).", arg); + error = -6; + break; + } + if (strcmp(diskname, "NONE") == 0) + continue; + + TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { + if (disk->d_consumer != NULL && + disk->d_consumer->provider != NULL && + strcmp(disk->d_consumer->provider->name, + diskname) == 0) + break; + } + if (disk != NULL) { + if (disk->d_state != G_RAID_DISK_S_ACTIVE) { + gctl_error(req, "Disk '%s' is in a " + "wrong state (%s).", diskname, + g_raid_disk_state2str(disk->d_state)); + error = -7; + break; + } + pd = disk->d_md_data; + if (ddf_meta_count_vdc(&pd->pd_meta, NULL) >= + GET16(&pd->pd_meta, hdr->Max_Partitions)) { + gctl_error(req, "No free partitions " + "on disk '%s'.", + diskname); + error = -7; + break; + } + pp = disk->d_consumer->provider; + disks[i] = disk; + ddf_meta_unused_range(&pd->pd_meta, + &offs[i], &esize); + offs[i] *= pp->sectorsize; + size = MIN(size, (off_t)esize * pp->sectorsize); + sectorsize = MAX(sectorsize, pp->sectorsize); + continue; + } + + g_topology_lock(); + cp = g_raid_open_consumer(sc, diskname); + if (cp == NULL) { + gctl_error(req, "Can't open disk '%s'.", + diskname); + g_topology_unlock(); + error = -8; + break; + } + pp = cp->provider; + pd = malloc(sizeof(*pd), M_MD_DDF, M_WAITOK | M_ZERO); + disk = g_raid_create_disk(sc); + disk->d_md_data = (void *)pd; + disk->d_consumer = cp; + disks[i] = disk; + cp->private = disk; + ddf_meta_create(disk, &mdi->mdio_meta); + if (mdi->mdio_meta.hdr == NULL) + ddf_meta_copy(&mdi->mdio_meta, &pd->pd_meta); + else + ddf_meta_update(&mdi->mdio_meta, &pd->pd_meta); + g_topology_unlock(); + + /* Read kernel dumping information. */ + disk->d_kd.offset = 0; + disk->d_kd.length = OFF_MAX; + len = sizeof(disk->d_kd); + g_io_getattr("GEOM::kerneldump", cp, &len, &disk->d_kd); + if (disk->d_kd.di.dumper == NULL) + G_RAID_DEBUG1(2, sc, + "Dumping not supported by %s.", + cp->provider->name); + + /* Reserve some space for metadata. */ + size = MIN(size, GET64(&pd->pd_meta, + pdr->entry[0].Configured_Size) * pp->sectorsize); + sectorsize = MAX(sectorsize, pp->sectorsize); + } + if (error != 0) { + for (i = 0; i < numdisks; i++) { + if (disks[i] != NULL && + disks[i]->d_state == G_RAID_DISK_S_NONE) + g_raid_destroy_disk(disks[i]); + } + return (error); + } + + if (sectorsize <= 0) { + gctl_error(req, "Can't get sector size."); + return (-8); + } + + /* Handle size argument. */ + len = sizeof(*sizearg); + sizearg = gctl_get_param(req, "size", &len); + if (sizearg != NULL && len == sizeof(*sizearg) && + *sizearg > 0) { + if (*sizearg > size) { + gctl_error(req, "Size too big %lld > %lld.", + (long long)*sizearg, (long long)size); + return (-9); + } + size = *sizearg; + } + + /* Handle strip argument. */ + strip = 131072; + len = sizeof(*striparg); + striparg = gctl_get_param(req, "strip", &len); + if (striparg != NULL && len == sizeof(*striparg) && + *striparg > 0) { + if (*striparg < sectorsize) { + gctl_error(req, "Strip size too small."); + return (-10); + } + if (*striparg % sectorsize != 0) { + gctl_error(req, "Incorrect strip size."); + return (-11); + } + strip = *striparg; + } + + /* Round size down to strip or sector. */ + if (level == G_RAID_VOLUME_RL_RAID1 || + level == G_RAID_VOLUME_RL_RAID3 || + level == G_RAID_VOLUME_RL_SINGLE || + level == G_RAID_VOLUME_RL_CONCAT) + size -= (size % sectorsize); + else if (level == G_RAID_VOLUME_RL_RAID1E && + (numdisks & 1) != 0) + size -= (size % (2 * strip)); + else + size -= (size % strip); + if (size <= 0) { + gctl_error(req, "Size too small."); + return (-13); + } + + /* We have all we need, create things: volume, ... */ + pv = malloc(sizeof(*pv), M_MD_DDF, M_WAITOK | M_ZERO); + ddf_vol_meta_create(&pv->pv_meta, &mdi->mdio_meta); + pv->pv_started = 1; + vol = g_raid_create_volume(sc, volname, -1); + vol->v_md_data = pv; + vol->v_raid_level = level; + vol->v_raid_level_qualifier = qual; + vol->v_strip_size = strip; + vol->v_disks_count = numdisks; + if (level == G_RAID_VOLUME_RL_RAID0 || + level == G_RAID_VOLUME_RL_CONCAT || + level == G_RAID_VOLUME_RL_SINGLE) + vol->v_mediasize = size * numdisks; + else if (level == G_RAID_VOLUME_RL_RAID1) + vol->v_mediasize = size; + else if (level == G_RAID_VOLUME_RL_RAID3 || + level == G_RAID_VOLUME_RL_RAID4 || + level == G_RAID_VOLUME_RL_RAID5) + vol->v_mediasize = size * (numdisks - 1); + else if (level == G_RAID_VOLUME_RL_RAID5R) { + vol->v_mediasize = size * (numdisks - 1); + vol->v_rotate_parity = 1024; + } else if (level == G_RAID_VOLUME_RL_RAID6 || + level == G_RAID_VOLUME_RL_RAID5E || + level == G_RAID_VOLUME_RL_RAID5EE) + vol->v_mediasize = size * (numdisks - 2); + else if (level == G_RAID_VOLUME_RL_RAIDMDF) { + if (numdisks < 5) + vol->v_mdf_pdisks = 2; + else + vol->v_mdf_pdisks = 3; + vol->v_mdf_polynomial = 0x11d; + vol->v_mdf_method = 0x00; + vol->v_mediasize = size * (numdisks - vol->v_mdf_pdisks); + } else { /* RAID1E */ + vol->v_mediasize = ((size * numdisks) / strip / 2) * + strip; + } + vol->v_sectorsize = sectorsize; + g_raid_start_volume(vol); + + /* , and subdisks. */ + for (i = 0; i < numdisks; i++) { + disk = disks[i]; + sd = &vol->v_subdisks[i]; + sd->sd_disk = disk; + sd->sd_offset = offs[i]; + sd->sd_size = size; + if (disk == NULL) + continue; + TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); + g_raid_change_disk_state(disk, + G_RAID_DISK_S_ACTIVE); + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_ACTIVE); + g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW, + G_RAID_EVENT_SUBDISK); + } + + /* Write metadata based on created entities. */ + G_RAID_DEBUG1(0, sc, "Array started."); + g_raid_md_write_ddf(md, vol, NULL, NULL); + + /* Pickup any STALE/SPARE disks to refill array if needed. */ + g_raid_md_ddf_refill(sc); + + g_raid_event_send(vol, G_RAID_VOLUME_E_START, + G_RAID_EVENT_VOLUME); + return (0); + } + if (strcmp(verb, "add") == 0) { + + gctl_error(req, "`add` command is not applicable, " + "use `label` instead."); + return (-99); + } + if (strcmp(verb, "delete") == 0) { + + /* Full node destruction. */ + if (*nargs == 1) { + /* Check if some volume is still open. */ + force = gctl_get_paraml(req, "force", sizeof(*force)); + if (force != NULL && *force == 0 && + g_raid_nopens(sc) != 0) { + gctl_error(req, "Some volume is still open."); + return (-4); + } + + TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { + if (disk->d_consumer) + ddf_meta_erase(disk->d_consumer); + } + g_raid_destroy_node(sc, 0); + return (0); + } + + /* Destroy specified volume. If it was last - all node. */ + if (*nargs != 2) { + gctl_error(req, "Invalid number of arguments."); + return (-1); + } + volname = gctl_get_asciiparam(req, "arg1"); + if (volname == NULL) { + gctl_error(req, "No volume name."); + return (-2); + } + + /* Search for volume. */ + TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { + if (strcmp(vol->v_name, volname) == 0) + break; + } + if (vol == NULL) { + i = strtol(volname, &tmp, 10); + if (verb != volname && tmp[0] == 0) { + TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { + if (vol->v_global_id == i) + break; + } + } + } + if (vol == NULL) { + gctl_error(req, "Volume '%s' not found.", volname); + return (-3); + } + + /* Check if volume is still open. */ + force = gctl_get_paraml(req, "force", sizeof(*force)); + if (force != NULL && *force == 0 && + vol->v_provider_open != 0) { + gctl_error(req, "Volume is still open."); + return (-4); + } + + /* Destroy volume and potentially node. */ + i = 0; + TAILQ_FOREACH(vol1, &sc->sc_volumes, v_next) + i++; + if (i >= 2) { + g_raid_destroy_volume(vol); + g_raid_md_ddf_purge_disks(sc); + g_raid_md_write_ddf(md, NULL, NULL, NULL); + } else { + TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { + if (disk->d_consumer) + ddf_meta_erase(disk->d_consumer); + } + g_raid_destroy_node(sc, 0); + } + return (0); + } + if (strcmp(verb, "remove") == 0 || + strcmp(verb, "fail") == 0) { + if (*nargs < 2) { + gctl_error(req, "Invalid number of arguments."); + return (-1); + } + for (i = 1; i < *nargs; i++) { + snprintf(arg, sizeof(arg), "arg%d", i); + diskname = gctl_get_asciiparam(req, arg); + if (diskname == NULL) { + gctl_error(req, "No disk name (%s).", arg); + error = -2; + break; + } + if (strncmp(diskname, "/dev/", 5) == 0) + diskname += 5; + + TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { + if (disk->d_consumer != NULL && + disk->d_consumer->provider != NULL && + strcmp(disk->d_consumer->provider->name, + diskname) == 0) + break; + } + if (disk == NULL) { + gctl_error(req, "Disk '%s' not found.", + diskname); + error = -3; + break; + } + + if (strcmp(verb, "fail") == 0) { + g_raid_md_fail_disk_ddf(md, NULL, disk); + continue; + } + + /* Erase metadata on deleting disk and destroy it. */ + ddf_meta_erase(disk->d_consumer); + g_raid_destroy_disk(disk); + } + g_raid_md_ddf_purge_volumes(sc); + + /* Write updated metadata to remaining disks. */ + g_raid_md_write_ddf(md, NULL, NULL, NULL); + + /* Check if anything left. */ + if (g_raid_ndisks(sc, -1) == 0) + g_raid_destroy_node(sc, 0); + else + g_raid_md_ddf_refill(sc); + return (error); + } + if (strcmp(verb, "insert") == 0) { + if (*nargs < 2) { + gctl_error(req, "Invalid number of arguments."); + return (-1); + } + for (i = 1; i < *nargs; i++) { + /* Get disk name. */ + snprintf(arg, sizeof(arg), "arg%d", i); + diskname = gctl_get_asciiparam(req, arg); + if (diskname == NULL) { + gctl_error(req, "No disk name (%s).", arg); + error = -3; + break; + } + + /* Try to find provider with specified name. */ + g_topology_lock(); + cp = g_raid_open_consumer(sc, diskname); + if (cp == NULL) { + gctl_error(req, "Can't open disk '%s'.", + diskname); + g_topology_unlock(); + error = -4; + break; + } + pp = cp->provider; + g_topology_unlock(); + + pd = malloc(sizeof(*pd), M_MD_DDF, M_WAITOK | M_ZERO); + + disk = g_raid_create_disk(sc); + disk->d_consumer = cp; + disk->d_md_data = (void *)pd; + cp->private = disk; + + /* Read kernel dumping information. */ + disk->d_kd.offset = 0; + disk->d_kd.length = OFF_MAX; + len = sizeof(disk->d_kd); + g_io_getattr("GEOM::kerneldump", cp, &len, &disk->d_kd); + if (disk->d_kd.di.dumper == NULL) + G_RAID_DEBUG1(2, sc, + "Dumping not supported by %s.", + cp->provider->name); + + /* Welcome the "new" disk. */ + g_raid_change_disk_state(disk, G_RAID_DISK_S_SPARE); + ddf_meta_create(disk, &mdi->mdio_meta); + sa = ddf_meta_find_sa(&pd->pd_meta, 1); + if (sa != NULL) { + SET32D(&pd->pd_meta, sa->Signature, + DDF_SA_SIGNATURE); + SET8D(&pd->pd_meta, sa->Spare_Type, 0); + SET16D(&pd->pd_meta, sa->Populated_SAEs, 0); + SET16D(&pd->pd_meta, sa->MAX_SAE_Supported, + (GET16(&pd->pd_meta, hdr->Configuration_Record_Length) * + pd->pd_meta.sectorsize - + sizeof(struct ddf_sa_record)) / + sizeof(struct ddf_sa_entry)); + } + if (mdi->mdio_meta.hdr == NULL) + ddf_meta_copy(&mdi->mdio_meta, &pd->pd_meta); + else + ddf_meta_update(&mdi->mdio_meta, &pd->pd_meta); + g_raid_md_write_ddf(md, NULL, NULL, NULL); + g_raid_md_ddf_refill(sc); + } + return (error); + } + return (-100); +} + +static int +g_raid_md_write_ddf(struct g_raid_md_object *md, struct g_raid_volume *tvol, + struct g_raid_subdisk *tsd, struct g_raid_disk *tdisk) +{ + struct g_raid_softc *sc; + struct g_raid_volume *vol; + struct g_raid_subdisk *sd; + struct g_raid_disk *disk; + struct g_raid_md_ddf_perdisk *pd; + struct g_raid_md_ddf_pervolume *pv; + struct g_raid_md_ddf_object *mdi; + struct ddf_meta *gmeta; + struct ddf_vol_meta *vmeta; + struct ddf_vdc_record *vdc; + struct ddf_sa_record *sa; + uint64_t *val2; + int i, j, pos, bvd, size; + + sc = md->mdo_softc; + mdi = (struct g_raid_md_ddf_object *)md; + gmeta = &mdi->mdio_meta; + + if (sc->sc_stopping == G_RAID_DESTROY_HARD) + return (0); + + /* + * Clear disk flags to let only really needed ones to be reset. + * Do it only if there are no volumes in starting state now, + * as they can update disk statuses yet and we may kill innocent. + */ + if (mdi->mdio_starting == 0) { + for (i = 0; i < GET16(gmeta, pdr->Populated_PDEs); i++) { + if (isff(gmeta->pdr->entry[i].PD_GUID, 24)) + continue; + SET16(gmeta, pdr->entry[i].PD_Type, + GET16(gmeta, pdr->entry[i].PD_Type) & + ~(DDF_PDE_PARTICIPATING | + DDF_PDE_GLOBAL_SPARE | DDF_PDE_CONFIG_SPARE)); + if ((GET16(gmeta, pdr->entry[i].PD_State) & + DDF_PDE_PFA) == 0) + SET16(gmeta, pdr->entry[i].PD_State, 0); + } + } + + /* Generate/update new per-volume metadata. */ + TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { + pv = (struct g_raid_md_ddf_pervolume *)vol->v_md_data; + if (vol->v_stopping || !pv->pv_started) + continue; + vmeta = &pv->pv_meta; + + SET32(vmeta, vdc->Sequence_Number, + GET32(vmeta, vdc->Sequence_Number) + 1); + if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E && + vol->v_disks_count % 2 == 0) + SET16(vmeta, vdc->Primary_Element_Count, 2); + else + SET16(vmeta, vdc->Primary_Element_Count, + vol->v_disks_count); + SET8(vmeta, vdc->Stripe_Size, + ffs(vol->v_strip_size / vol->v_sectorsize) - 1); + if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E && + vol->v_disks_count % 2 == 0) { + SET8(vmeta, vdc->Primary_RAID_Level, + DDF_VDCR_RAID1); + SET8(vmeta, vdc->RLQ, 0); + SET8(vmeta, vdc->Secondary_Element_Count, + vol->v_disks_count / 2); + SET8(vmeta, vdc->Secondary_RAID_Level, 0); + } else { + SET8(vmeta, vdc->Primary_RAID_Level, + vol->v_raid_level); + SET8(vmeta, vdc->RLQ, + vol->v_raid_level_qualifier); + SET8(vmeta, vdc->Secondary_Element_Count, 1); + SET8(vmeta, vdc->Secondary_RAID_Level, 0); + } + SET8(vmeta, vdc->Secondary_Element_Seq, 0); + SET64(vmeta, vdc->Block_Count, 0); + SET64(vmeta, vdc->VD_Size, vol->v_mediasize / vol->v_sectorsize); + SET16(vmeta, vdc->Block_Size, vol->v_sectorsize); + SET8(vmeta, vdc->Rotate_Parity_count, + fls(vol->v_rotate_parity) - 1); + SET8(vmeta, vdc->MDF_Parity_Disks, vol->v_mdf_pdisks); + SET16(vmeta, vdc->MDF_Parity_Generator_Polynomial, + vol->v_mdf_polynomial); + SET8(vmeta, vdc->MDF_Constant_Generation_Method, + vol->v_mdf_method); + + SET16(vmeta, vde->VD_Number, vol->v_global_id); + if (vol->v_state <= G_RAID_VOLUME_S_BROKEN) + SET8(vmeta, vde->VD_State, DDF_VDE_FAILED); + else if (vol->v_state <= G_RAID_VOLUME_S_DEGRADED) + SET8(vmeta, vde->VD_State, DDF_VDE_DEGRADED); + else if (vol->v_state <= G_RAID_VOLUME_S_SUBOPTIMAL) + SET8(vmeta, vde->VD_State, DDF_VDE_PARTIAL); + else + SET8(vmeta, vde->VD_State, DDF_VDE_OPTIMAL); + if (vol->v_dirty || + g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_STALE) > 0 || + g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_RESYNC) > 0) + SET8(vmeta, vde->VD_State, + GET8(vmeta, vde->VD_State) | DDF_VDE_DIRTY); + SET8(vmeta, vde->Init_State, DDF_VDE_INIT_FULL); // XXX + ddf_meta_put_name(vmeta, vol->v_name); + + for (i = 0; i < vol->v_disks_count; i++) { + sd = &vol->v_subdisks[i]; + bvd = i / GET16(vmeta, vdc->Primary_Element_Count); + pos = i % GET16(vmeta, vdc->Primary_Element_Count); + disk = sd->sd_disk; + if (disk != NULL) { + pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; + if (vmeta->bvdc[bvd] == NULL) { + size = GET16(vmeta, + hdr->Configuration_Record_Length) * + vmeta->sectorsize; + vmeta->bvdc[bvd] = malloc(size, + M_MD_DDF, M_WAITOK); + memset(vmeta->bvdc[bvd], 0xff, size); + } + memcpy(vmeta->bvdc[bvd], vmeta->vdc, + sizeof(struct ddf_vdc_record)); + SET8(vmeta, bvdc[bvd]->Secondary_Element_Seq, bvd); + SET64(vmeta, bvdc[bvd]->Block_Count, + sd->sd_size / vol->v_sectorsize); + SET32(vmeta, bvdc[bvd]->Physical_Disk_Sequence[pos], + GET32(&pd->pd_meta, pdd->PD_Reference)); + val2 = (uint64_t *)&(vmeta->bvdc[bvd]->Physical_Disk_Sequence[ + GET16(vmeta, hdr->Max_Primary_Element_Entries)]); + SET64P(vmeta, val2 + pos, + sd->sd_offset / vol->v_sectorsize); + } + if (vmeta->bvdc[bvd] == NULL) + continue; + + j = ddf_meta_find_pd(gmeta, NULL, + GET32(vmeta, bvdc[bvd]->Physical_Disk_Sequence[pos])); + if (j < 0) + continue; + SET32(gmeta, pdr->entry[j].PD_Type, + GET32(gmeta, pdr->entry[j].PD_Type) | + DDF_PDE_PARTICIPATING); + if (sd->sd_state == G_RAID_SUBDISK_S_NONE) + SET32(gmeta, pdr->entry[j].PD_State, + GET32(gmeta, pdr->entry[j].PD_State) | + (DDF_PDE_FAILED | DDF_PDE_MISSING)); + else if (sd->sd_state == G_RAID_SUBDISK_S_FAILED) + SET32(gmeta, pdr->entry[j].PD_State, + GET32(gmeta, pdr->entry[j].PD_State) | + (DDF_PDE_FAILED | DDF_PDE_PFA)); + else if (sd->sd_state <= G_RAID_SUBDISK_S_REBUILD) + SET32(gmeta, pdr->entry[j].PD_State, + GET32(gmeta, pdr->entry[j].PD_State) | + DDF_PDE_REBUILD); + else + SET32(gmeta, pdr->entry[j].PD_State, + GET32(gmeta, pdr->entry[j].PD_State) | + DDF_PDE_ONLINE); + } + } + + /* Mark spare and failed disks as such. */ + TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { + pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; + i = ddf_meta_find_pd(gmeta, NULL, + GET32(&pd->pd_meta, pdd->PD_Reference)); + if (i < 0) + continue; + if (disk->d_state == G_RAID_DISK_S_FAILED) { + SET32(gmeta, pdr->entry[i].PD_State, + GET32(gmeta, pdr->entry[i].PD_State) | + (DDF_PDE_FAILED | DDF_PDE_PFA)); + } + if (disk->d_state != G_RAID_DISK_S_SPARE) + continue; + sa = ddf_meta_find_sa(&pd->pd_meta, 0); + if (sa == NULL || + (GET8D(&pd->pd_meta, sa->Spare_Type) & + DDF_SAR_TYPE_DEDICATED) == 0) { + SET16(gmeta, pdr->entry[i].PD_Type, + GET16(gmeta, pdr->entry[i].PD_Type) | + DDF_PDE_GLOBAL_SPARE); + } else { + SET16(gmeta, pdr->entry[i].PD_Type, + GET16(gmeta, pdr->entry[i].PD_Type) | + DDF_PDE_CONFIG_SPARE); + } + SET32(gmeta, pdr->entry[i].PD_State, + GET32(gmeta, pdr->entry[i].PD_State) | + DDF_PDE_ONLINE); + } + + /* Remove disks without "participating" flag (unused). */ + for (i = 0, j = -1; i < GET16(gmeta, pdr->Populated_PDEs); i++) { + if (isff(gmeta->pdr->entry[i].PD_GUID, 24)) + continue; + if ((GET16(gmeta, pdr->entry[i].PD_Type) & + (DDF_PDE_PARTICIPATING | + DDF_PDE_GLOBAL_SPARE | DDF_PDE_CONFIG_SPARE)) != 0 || + g_raid_md_ddf_get_disk(sc, + NULL, GET32(gmeta, pdr->entry[i].PD_Reference)) != NULL) + j = i; + else + memset(&gmeta->pdr->entry[i], 0xff, + sizeof(struct ddf_pd_entry)); + } + SET16(gmeta, pdr->Populated_PDEs, j + 1); + + /* Update per-disk metadata and write them. */ + TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { + pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; + if (disk->d_state != G_RAID_DISK_S_ACTIVE && + disk->d_state != G_RAID_DISK_S_SPARE) + continue; + /* Update PDR. */ + memcpy(pd->pd_meta.pdr, gmeta->pdr, + GET32(&pd->pd_meta, hdr->pdr_length) * + pd->pd_meta.sectorsize); + /* Update VDR. */ + SET16(&pd->pd_meta, vdr->Populated_VDEs, 0); + TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { + if (vol->v_stopping) + continue; + pv = (struct g_raid_md_ddf_pervolume *)vol->v_md_data; + i = ddf_meta_find_vd(&pd->pd_meta, + pv->pv_meta.vde->VD_GUID); + if (i < 0) + i = ddf_meta_find_vd(&pd->pd_meta, NULL); + if (i >= 0) + memcpy(&pd->pd_meta.vdr->entry[i], + pv->pv_meta.vde, + sizeof(struct ddf_vd_entry)); + } + /* Update VDC. */ + if (mdi->mdio_starting == 0) { + /* Remove all VDCs to restore needed later. */ + j = GETCRNUM(&pd->pd_meta); + for (i = 0; i < j; i++) { + vdc = GETVDCPTR(&pd->pd_meta, i); + if (GET32D(&pd->pd_meta, vdc->Signature) != + DDF_VDCR_SIGNATURE) + continue; + SET32D(&pd->pd_meta, vdc->Signature, 0xffffffff); + } + } + TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { + vol = sd->sd_volume; + if (vol->v_stopping) + continue; + pv = (struct g_raid_md_ddf_pervolume *)vol->v_md_data; + vmeta = &pv->pv_meta; + vdc = ddf_meta_find_vdc(&pd->pd_meta, + vmeta->vde->VD_GUID); + if (vdc == NULL) + vdc = ddf_meta_find_vdc(&pd->pd_meta, NULL); + if (vdc != NULL) { + bvd = sd->sd_pos / GET16(vmeta, + vdc->Primary_Element_Count); + memcpy(vdc, vmeta->bvdc[bvd], + GET16(&pd->pd_meta, + hdr->Configuration_Record_Length) * + pd->pd_meta.sectorsize); + } + } + G_RAID_DEBUG(1, "Writing DDF metadata to %s", + g_raid_get_diskname(disk)); + g_raid_md_ddf_print(&pd->pd_meta); + ddf_meta_write(disk->d_consumer, &pd->pd_meta); + } + return (0); +} + +static int +g_raid_md_fail_disk_ddf(struct g_raid_md_object *md, + struct g_raid_subdisk *tsd, struct g_raid_disk *tdisk) +{ + struct g_raid_softc *sc; + struct g_raid_md_ddf_perdisk *pd; + struct g_raid_subdisk *sd; + int i; + + sc = md->mdo_softc; + pd = (struct g_raid_md_ddf_perdisk *)tdisk->d_md_data; + + /* We can't fail disk that is not a part of array now. */ + if (tdisk->d_state != G_RAID_DISK_S_ACTIVE) + return (-1); + + /* + * Mark disk as failed in metadata and try to write that metadata + * to the disk itself to prevent it's later resurrection as STALE. + */ + G_RAID_DEBUG(1, "Writing DDF metadata to %s", + g_raid_get_diskname(tdisk)); + i = ddf_meta_find_pd(&pd->pd_meta, NULL, GET32(&pd->pd_meta, pdd->PD_Reference)); + SET16(&pd->pd_meta, pdr->entry[i].PD_State, DDF_PDE_FAILED | DDF_PDE_PFA); + if (tdisk->d_consumer != NULL) + ddf_meta_write(tdisk->d_consumer, &pd->pd_meta); + + /* Change states. */ + g_raid_change_disk_state(tdisk, G_RAID_DISK_S_FAILED); + TAILQ_FOREACH(sd, &tdisk->d_subdisks, sd_next) { + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_FAILED); + g_raid_event_send(sd, G_RAID_SUBDISK_E_FAILED, + G_RAID_EVENT_SUBDISK); + } + + /* Write updated metadata to remaining disks. */ + g_raid_md_write_ddf(md, NULL, NULL, tdisk); + + g_raid_md_ddf_refill(sc); + return (0); +} + +static int +g_raid_md_free_disk_ddf(struct g_raid_md_object *md, + struct g_raid_disk *disk) +{ + struct g_raid_md_ddf_perdisk *pd; + + pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; + ddf_meta_free(&pd->pd_meta); + free(pd, M_MD_DDF); + disk->d_md_data = NULL; + return (0); +} + +static int +g_raid_md_free_volume_ddf(struct g_raid_md_object *md, + struct g_raid_volume *vol) +{ + struct g_raid_md_ddf_object *mdi; + struct g_raid_md_ddf_pervolume *pv; + + mdi = (struct g_raid_md_ddf_object *)md; + pv = (struct g_raid_md_ddf_pervolume *)vol->v_md_data; + ddf_vol_meta_free(&pv->pv_meta); + if (!pv->pv_started) { + pv->pv_started = 1; + mdi->mdio_starting--; + callout_stop(&pv->pv_start_co); + } + free(pv, M_MD_DDF); + vol->v_md_data = NULL; + return (0); +} + +static int +g_raid_md_free_ddf(struct g_raid_md_object *md) +{ + struct g_raid_md_ddf_object *mdi; + + mdi = (struct g_raid_md_ddf_object *)md; + if (!mdi->mdio_started) { + mdi->mdio_started = 0; + callout_stop(&mdi->mdio_start_co); + G_RAID_DEBUG1(1, md->mdo_softc, + "root_mount_rel %p", mdi->mdio_rootmount); + root_mount_rel(mdi->mdio_rootmount); + mdi->mdio_rootmount = NULL; + } + ddf_meta_free(&mdi->mdio_meta); + return (0); +} + +G_RAID_MD_DECLARE(g_raid_md_ddf); diff --git a/sys/geom/raid/md_ddf.h b/sys/geom/raid/md_ddf.h new file mode 100644 index 00000000000..2027d0c099d --- /dev/null +++ b/sys/geom/raid/md_ddf.h @@ -0,0 +1,345 @@ +/*- + * Copyright (c) 2012 Alexander Motin + * Copyright (c) 2008 Scott Long + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification, immediately at the beginning of the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef MD_DDF_H +#define MD_DDF_H + +/* Definitions from the SNIA DDF spec, rev 1.2/2.0 */ + +#define DDF_HEADER_LENGTH 512 +struct ddf_header { + uint32_t Signature; +#define DDF_HEADER_SIGNATURE 0xde11de11 + uint32_t CRC; + uint8_t DDF_Header_GUID[24]; + uint8_t DDF_rev[8]; + uint32_t Sequence_Number; + uint32_t TimeStamp; + uint8_t Open_Flag; +#define DDF_HEADER_CLOSED 0x00 +#define DDF_HEADER_OPENED_MASK 0x0f +#define DDF_HEADER_OPEN_ANCHOR 0xff + uint8_t Foreign_Flag; + uint8_t Diskgrouping; + uint8_t pad1[13]; + uint8_t Header_ext[32]; + uint64_t Primary_Header_LBA; + uint64_t Secondary_Header_LBA; + uint8_t Header_Type; +#define DDF_HEADER_ANCHOR 0x00 +#define DDF_HEADER_PRIMARY 0x01 +#define DDF_HEADER_SECONDARY 0x02 + uint8_t pad2[3]; + uint32_t WorkSpace_Length; + uint64_t WorkSpace_LBA; + uint16_t Max_PD_Entries; + uint16_t Max_VD_Entries; + uint16_t Max_Partitions; + uint16_t Configuration_Record_Length; + uint16_t Max_Primary_Element_Entries; + uint32_t Max_Mapped_Block_Entries; /* DDF 2.0 */ + uint8_t pad3[50]; + uint32_t cd_section; /* Controller_Data_Section */ + uint32_t cd_length; /* Controller_Data_Section_Length */ + uint32_t pdr_section; /* Physical_Drive_Records_Section */ + uint32_t pdr_length; /* Physical_Drive_Records_Length */ + uint32_t vdr_section; /* Virtual_Drive_Records_Section */ + uint32_t vdr_length; /* Virtual_Drive_Records_Length */ + uint32_t cr_section; /* Configuration_Records_Section */ + uint32_t cr_length; /* Configuration_Records_Length */ + uint32_t pdd_section; /* Physical_Drive_Data_Section */ + uint32_t pdd_length; /* Physical_Drive_Data_Length */ + uint32_t bbmlog_section; /* BBM_Log_Section */ + uint32_t bbmlog_length; /* BBM_Log_Section_Length */ + uint32_t Diagnostic_Space; + uint32_t Diagnostic_Space_Length; + uint32_t Vendor_Specific_Logs; + uint32_t Vendor_Specific_Logs_Length; + uint8_t pad4[256]; +} __packed; + +struct ddf_cd_record { + uint32_t Signature; +#define DDF_CONTROLLER_DATA_SIGNATURE 0xad111111 + uint32_t CRC; + uint8_t Controller_GUID[24]; + struct { + uint16_t Vendor_ID; + uint16_t Device_ID; + uint16_t SubVendor_ID; + uint16_t SubDevice_ID; + } Controller_Type __packed; + uint8_t Product_ID[16]; + uint8_t pad1[8]; + uint8_t Controller_Data[448]; +} __packed; + +struct ddf_device_scsi { + uint8_t Lun; + uint8_t Id; + uint8_t Channel; + uint8_t Path_Flags; +#define DDF_DEVICE_SCSI_FLAG_BROKEN (1 << 7) +} __packed; + +struct ddf_device_sas { + uint64_t Initiator_Path; +} __packed; + +union ddf_pathinfo { + struct { + struct ddf_device_scsi Path0; + struct ddf_device_scsi Path1; + uint8_t pad[10]; + } __packed scsi; + struct { + struct ddf_device_sas Path0; + struct ddf_device_sas Path1; + uint8_t Path0_Flags; + uint8_t Path1_Flags; +#define DDF_DEVICE_SAS_PHY_ID 0x7f +#define DDF_DEVICE_SAS_FLAG_BROKEN (1 << 7) + } __packed sas; +} __packed; + +struct ddf_pd_entry { + uint8_t PD_GUID[24]; + uint32_t PD_Reference; + uint16_t PD_Type; +#define DDF_PDE_GUID_FORCE (1 << 0) +#define DDF_PDE_PARTICIPATING (1 << 1) +#define DDF_PDE_GLOBAL_SPARE (1 << 2) +#define DDF_PDE_CONFIG_SPARE (1 << 3) +#define DDF_PDE_FOREIGN (1 << 4) +#define DDF_PDE_LEGACY (1 << 5) +#define DDF_PDE_TYPE_MASK (0x0f << 12) +#define DDF_PDE_UNKNOWN (0x00 << 12) +#define DDF_PDE_SCSI (0x01 << 12) +#define DDF_PDE_SAS (0x02 << 12) +#define DDF_PDE_SATA (0x03 << 12) +#define DDF_PDE_FC (0x04 << 12) + uint16_t PD_State; +#define DDF_PDE_ONLINE (1 << 0) +#define DDF_PDE_FAILED (1 << 1) +#define DDF_PDE_REBUILD (1 << 2) +#define DDF_PDE_TRANSITION (1 << 3) +#define DDF_PDE_PFA (1 << 4) +#define DDF_PDE_UNRECOVERED (1 << 5) +#define DDF_PDE_MISSING (1 << 6) + uint64_t Configured_Size; + union ddf_pathinfo Path_Information; + uint16_t Block_Size; /* DDF 2.0 */ + uint8_t pad1[4]; +} __packed; + +struct ddf_pd_record { + uint32_t Signature; +#define DDF_PDR_SIGNATURE 0x22222222 + uint32_t CRC; + uint16_t Populated_PDEs; + uint16_t Max_PDE_Supported; + uint8_t pad1[52]; + struct ddf_pd_entry entry[0]; +} __packed; + +struct ddf_vd_entry { + uint8_t VD_GUID[24]; + uint16_t VD_Number; + uint8_t pad1[2]; + uint16_t VD_Type; +#define DDF_VDE_SHARED (1 << 0) +#define DDF_VDE_ENFORCE_GROUP (1 << 1) +#define DDF_VDE_UNICODE_NAME (1 << 2) +#define DDF_VDE_OWNER_ID_VALID (1 << 3) + uint16_t Controller_GUID_CRC; + uint8_t VD_State; +#define DDF_VDE_OPTIMAL 0x00 +#define DDF_VDE_DEGRADED 0x01 +#define DDF_VDE_DELETED 0x02 +#define DDF_VDE_MISSING 0x03 +#define DDF_VDE_FAILED 0x04 +#define DDF_VDE_PARTIAL 0x05 +#define DDF_VDE_OFFLINE 0x06 +#define DDF_VDE_STATE_MASK 0x07 +#define DDF_VDE_MORPH (1 << 3) +#define DDF_VDE_DIRTY (1 << 4) + uint8_t Init_State; +#define DDF_VDE_UNINTIALIZED 0x00 +#define DDF_VDE_INIT_QUICK 0x01 +#define DDF_VDE_INIT_FULL 0x02 +#define DDF_VDE_INIT_MASK 0x03 +#define DDF_VDE_UACCESS_RW 0x00 +#define DDF_VDE_UACCESS_RO 0x80 +#define DDF_VDE_UACCESS_BLOCKED 0xc0 +#define DDF_VDE_UACCESS_MASK 0xc0 + uint8_t Drive_Failures_Remaining; /* DDF 2.0 */ + uint8_t pad2[13]; + uint8_t VD_Name[16]; +} __packed; + +struct ddf_vd_record { + uint32_t Signature; +#define DDF_VD_RECORD_SIGNATURE 0xdddddddd + uint32_t CRC; + uint16_t Populated_VDEs; + uint16_t Max_VDE_Supported; + uint8_t pad1[52]; + struct ddf_vd_entry entry[0]; +} __packed; + +#define DDF_CR_INVALID 0xffffffff + +struct ddf_vdc_record { + uint32_t Signature; +#define DDF_VDCR_SIGNATURE 0xeeeeeeee + uint32_t CRC; + uint8_t VD_GUID[24]; + uint32_t Timestamp; + uint32_t Sequence_Number; + uint8_t pad1[24]; + uint16_t Primary_Element_Count; + uint8_t Stripe_Size; + uint8_t Primary_RAID_Level; +#define DDF_VDCR_RAID0 0x00 +#define DDF_VDCR_RAID1 0x01 +#define DDF_VDCR_RAID3 0x03 +#define DDF_VDCR_RAID4 0x04 +#define DDF_VDCR_RAID5 0x05 +#define DDF_VDCR_RAID6 0x06 +#define DDF_VDCR_RAID1E 0x11 +#define DDF_VDCR_SINGLE 0x0f +#define DDF_VDCR_CONCAT 0x1f +#define DDF_VDCR_RAID5E 0x15 +#define DDF_VDCR_RAID5EE 0x25 + uint8_t RLQ; + uint8_t Secondary_Element_Count; + uint8_t Secondary_Element_Seq; + uint8_t Secondary_RAID_Level; + uint64_t Block_Count; + uint64_t VD_Size; + uint16_t Block_Size; /* DDF 2.0 */ + uint8_t Rotate_Parity_count; /* DDF 2.0 */ + uint8_t pad2[5]; + uint32_t Associated_Spares[8]; + uint64_t Cache_Flags; +#define DDF_VDCR_CACHE_WB (1 << 0) +#define DDF_VDCR_CACHE_WB_ADAPTIVE (1 << 1) +#define DDF_VDCR_CACHE_RA (1 << 2) +#define DDF_VDCR_CACHE_RA_ADAPTIVE (1 << 3) +#define DDF_VDCR_CACHE_WCACHE_NOBATTERY (1 << 4) +#define DDF_VDCR_CACHE_WCACHE_ALLOW (1 << 5) +#define DDF_VDCR_CACHE_RCACHE_ALLOW (1 << 6) +#define DDF_VDCR_CACHE_VENDOR (1 << 7) + uint8_t BG_Rate; + uint8_t pad3[3]; + uint8_t MDF_Parity_Disks; /* DDF 2.0 */ + uint16_t MDF_Parity_Generator_Polynomial; /* DDF 2.0 */ + uint8_t pad4; + uint8_t MDF_Constant_Generation_Method; /* DDF 2.0 */ + uint8_t pad5[47]; + uint8_t pad6[192]; + uint8_t V0[32]; + uint8_t V1[32]; + uint8_t V2[16]; + uint8_t V3[16]; + uint8_t Vendor_Scratch[32]; + uint32_t Physical_Disk_Sequence[0]; +} __packed; + +struct ddf_vuc_record { + uint32_t Signature; +#define DDF_VUCR_SIGNATURE 0x88888888 + uint32_t CRC; + uint8_t VD_GUID[24]; +} __packed; + +struct ddf_sa_entry { + uint8_t VD_GUID[24]; + uint16_t Secondary_Element; + uint8_t rsrvd2[6]; +} __packed; + +struct ddf_sa_record { + uint32_t Signature; +#define DDF_SA_SIGNATURE 0x55555555 + uint32_t CRC; + uint32_t Timestamp; + uint8_t pad1[7]; + uint8_t Spare_Type; +#define DDF_SAR_TYPE_DEDICATED (1 << 0) +#define DDF_SAR_TYPE_REVERTIBLE (1 << 1) +#define DDF_SAR_TYPE_ACTIVE (1 << 2) +#define DDF_SAR_TYPE_ENCL_AFFINITY (1 << 3) + uint16_t Populated_SAEs; + uint16_t MAX_SAE_Supported; + uint8_t pad2[8]; + struct ddf_sa_entry entry[0]; +} __packed; + +struct ddf_pdd_record { + uint32_t Signature; +#define DDF_PDD_SIGNATURE 0x33333333 + uint32_t CRC; + uint8_t PD_GUID[24]; + uint32_t PD_Reference; + uint8_t Forced_Ref_Flag; +#define DDF_PDD_FORCED_REF 0x01 + uint8_t Forced_PD_GUID_Flag; +#define DDF_PDD_FORCED_GUID 0x01 + uint8_t Vendor_Scratch[32]; + uint8_t pad2[442]; +} __packed; + +struct ddf_bbm_entry { + uint64_t Defective_Block_Start; + uint32_t Spare_Block_Offset; + uint16_t Remapped_Count; + uint8_t pad[2]; +}; + +struct ddf_bbm_log { + uint32_t Signature; +#define DDF_BBML_SIGNATURE 0xabadb10c + uint32_t CRC; + uint32_t Entry_Count; + uint32_t Spare_Block_Count; + uint8_t pad1[8]; + uint64_t First_Spare_LBA; + uint64_t Mapped_Block_Entry[0]; +} __packed; + +struct ddf_vendor_log { + uint32_t Signature; +#define DDF_VENDOR_LOG_SIGNATURE 0x01dbeef0 + uint32_t CRC; + uint64_t Log_Owner; + uint8_t pad1[16]; +} __packed; + +#endif diff --git a/sys/geom/raid/md_intel.c b/sys/geom/raid/md_intel.c index 11b93f33681..3623a218575 100644 --- a/sys/geom/raid/md_intel.c +++ b/sys/geom/raid/md_intel.c @@ -1490,7 +1490,7 @@ g_raid_md_ctl_intel(struct g_raid_md_object *md, return (-3); } if (strcasecmp(levelname, "RAID5") == 0) - levelname = "RAID5LA"; + levelname = "RAID5-LA"; if (g_raid_volume_str2level(levelname, &level, &qual)) { gctl_error(req, "Unknown RAID level '%s'.", levelname); return (-4); @@ -1705,7 +1705,7 @@ g_raid_md_ctl_intel(struct g_raid_md_object *md, return (-3); } if (strcasecmp(levelname, "RAID5") == 0) - levelname = "RAID5LA"; + levelname = "RAID5-LA"; if (g_raid_volume_str2level(levelname, &level, &qual)) { gctl_error(req, "Unknown RAID level '%s'.", levelname); return (-4); diff --git a/sys/geom/raid/md_jmicron.c b/sys/geom/raid/md_jmicron.c index fa2dc3a80b1..32921716090 100644 --- a/sys/geom/raid/md_jmicron.c +++ b/sys/geom/raid/md_jmicron.c @@ -1062,7 +1062,7 @@ g_raid_md_ctl_jmicron(struct g_raid_md_object *md, return (-3); } if (strcasecmp(levelname, "RAID5") == 0) - levelname = "RAID5LA"; + levelname = "RAID5-LA"; if (g_raid_volume_str2level(levelname, &level, &qual)) { gctl_error(req, "Unknown RAID level '%s'.", levelname); return (-4); diff --git a/sys/geom/raid/md_nvidia.c b/sys/geom/raid/md_nvidia.c index a100800395b..d8a64325adf 100644 --- a/sys/geom/raid/md_nvidia.c +++ b/sys/geom/raid/md_nvidia.c @@ -1065,7 +1065,7 @@ g_raid_md_ctl_nvidia(struct g_raid_md_object *md, return (-3); } if (strcasecmp(levelname, "RAID5") == 0) - levelname = "RAID5LS"; + levelname = "RAID5-LS"; if (g_raid_volume_str2level(levelname, &level, &qual)) { gctl_error(req, "Unknown RAID level '%s'.", levelname); return (-4); diff --git a/sys/geom/raid/md_promise.c b/sys/geom/raid/md_promise.c index 54420b6bee7..1c933893943 100644 --- a/sys/geom/raid/md_promise.c +++ b/sys/geom/raid/md_promise.c @@ -1246,7 +1246,7 @@ g_raid_md_ctl_promise(struct g_raid_md_object *md, return (-3); } if (strcasecmp(levelname, "RAID5") == 0) - levelname = "RAID5LA"; + levelname = "RAID5-LA"; if (g_raid_volume_str2level(levelname, &level, &qual)) { gctl_error(req, "Unknown RAID level '%s'.", levelname); return (-4); @@ -1955,6 +1955,8 @@ g_raid_md_free_volume_promise(struct g_raid_md_object *md, pv->pv_started = 1; callout_stop(&pv->pv_start_co); } + free(pv, M_MD_PROMISE); + vol->v_md_data = NULL; return (0); } diff --git a/sys/geom/raid/md_sii.c b/sys/geom/raid/md_sii.c index 051b047589e..ce38aeacba3 100644 --- a/sys/geom/raid/md_sii.c +++ b/sys/geom/raid/md_sii.c @@ -1149,7 +1149,7 @@ g_raid_md_ctl_sii(struct g_raid_md_object *md, return (-3); } if (strcasecmp(levelname, "RAID5") == 0) - levelname = "RAID5LS"; + levelname = "RAID5-LS"; if (g_raid_volume_str2level(levelname, &level, &qual)) { gctl_error(req, "Unknown RAID level '%s'.", levelname); return (-4); diff --git a/sys/geom/raid/tr_raid1.c b/sys/geom/raid/tr_raid1.c index ccd31579dca..02527f2f9db 100644 --- a/sys/geom/raid/tr_raid1.c +++ b/sys/geom/raid/tr_raid1.c @@ -894,7 +894,16 @@ rebuild_round_done: g_raid_unlock_range(sd->sd_volume, bp->bio_offset, bp->bio_length); } - error = bp->bio_error; + if (pbp->bio_cmd != BIO_READ) { + if (pbp->bio_inbed == 1 || pbp->bio_error != 0) + pbp->bio_error = bp->bio_error; + if (bp->bio_error != 0) { + G_RAID_LOGREQ(0, bp, "Write failed: failing subdisk."); + g_raid_tr_raid1_fail_disk(sd->sd_softc, sd, sd->sd_disk); + } + error = pbp->bio_error; + } else + error = bp->bio_error; g_destroy_bio(bp); if (pbp->bio_children == pbp->bio_inbed) { pbp->bio_completed = pbp->bio_length; diff --git a/sys/geom/raid/tr_raid1e.c b/sys/geom/raid/tr_raid1e.c index 141ff7ab842..981e2053ee2 100644 --- a/sys/geom/raid/tr_raid1e.c +++ b/sys/geom/raid/tr_raid1e.c @@ -338,6 +338,9 @@ static void g_raid_tr_raid1e_fail_disk(struct g_raid_softc *sc, struct g_raid_subdisk *sd, struct g_raid_disk *disk) { + struct g_raid_volume *vol; + + vol = sd->sd_volume; /* * We don't fail the last disk in the pack, since it still has decent * data on it and that's better than failing the disk if it is the root @@ -347,8 +350,12 @@ g_raid_tr_raid1e_fail_disk(struct g_raid_softc *sc, struct g_raid_subdisk *sd, * the volume that has / on it. I can't think of a case where we'd * want the volume to go away on this kind of event. */ - if (g_raid_nsubdisks(sd->sd_volume, G_RAID_SUBDISK_S_ACTIVE) == 1 && - g_raid_get_subdisk(sd->sd_volume, G_RAID_SUBDISK_S_ACTIVE) == sd) + if ((g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_ACTIVE) + + g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_RESYNC) + + g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_STALE) + + g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_UNINITIALIZED) < + vol->v_disks_count) && + (sd->sd_state >= G_RAID_SUBDISK_S_UNINITIALIZED)) return; g_raid_fail_disk(sc, sd, disk); } @@ -1113,7 +1120,16 @@ rebuild_round_done: G_RAID_LOGREQ(2, bp, "REMAP done %d.", bp->bio_error); g_raid_unlock_range(sd->sd_volume, virtual, bp->bio_length); } - error = bp->bio_error; + if (pbp->bio_cmd != BIO_READ) { + if (pbp->bio_inbed == 1 || pbp->bio_error != 0) + pbp->bio_error = bp->bio_error; + if (bp->bio_error != 0) { + G_RAID_LOGREQ(0, bp, "Write failed: failing subdisk."); + g_raid_tr_raid1e_fail_disk(sd->sd_softc, sd, sd->sd_disk); + } + error = pbp->bio_error; + } else + error = bp->bio_error; g_destroy_bio(bp); if (pbp->bio_children == pbp->bio_inbed) { pbp->bio_completed = pbp->bio_length; diff --git a/sys/geom/raid/tr_raid5.c b/sys/geom/raid/tr_raid5.c index eb628fd65a6..a8f946bf776 100644 --- a/sys/geom/raid/tr_raid5.c +++ b/sys/geom/raid/tr_raid5.c @@ -106,9 +106,17 @@ g_raid_tr_taste_raid5(struct g_raid_tr_object *tr, struct g_raid_volume *vol) trs = (struct g_raid_tr_raid5_object *)tr; qual = tr->tro_volume->v_raid_level_qualifier; - if (tr->tro_volume->v_raid_level == G_RAID_VOLUME_RL_RAID5 && + if (tr->tro_volume->v_raid_level == G_RAID_VOLUME_RL_RAID4 && + qual >= 0 && qual <= 1) { + /* RAID4 */ + } else if ((tr->tro_volume->v_raid_level == G_RAID_VOLUME_RL_RAID5 || + tr->tro_volume->v_raid_level == G_RAID_VOLUME_RL_RAID5E || + tr->tro_volume->v_raid_level == G_RAID_VOLUME_RL_RAID5EE || + tr->tro_volume->v_raid_level == G_RAID_VOLUME_RL_RAID5R || + tr->tro_volume->v_raid_level == G_RAID_VOLUME_RL_RAID6 || + tr->tro_volume->v_raid_level == G_RAID_VOLUME_RL_RAIDMDF) && qual >= 0 && qual <= 3) { - /* RAID5 */ + /* RAID5/5E/5EE/5R/6/MDF */ } else return (G_RAID_TR_TASTE_FAIL); trs->trso_starting = 1; @@ -203,30 +211,58 @@ g_raid_tr_iostart_raid5_read(struct g_raid_tr_object *tr, struct bio *bp) struct bio *cbp; char *addr; off_t offset, start, length, nstripe, remain; - int no, pno; - u_int strip_size, qual; + int no, pno, ddisks, pdisks, protate, pleft; + u_int strip_size, lvl, qual; vol = tr->tro_volume; addr = bp->bio_data; strip_size = vol->v_strip_size; + lvl = tr->tro_volume->v_raid_level; qual = tr->tro_volume->v_raid_level_qualifier; + protate = tr->tro_volume->v_rotate_parity; /* Stripe number. */ nstripe = bp->bio_offset / strip_size; /* Start position in stripe. */ start = bp->bio_offset % strip_size; + /* Number of data and parity disks. */ + if (lvl == G_RAID_VOLUME_RL_RAIDMDF) + pdisks = tr->tro_volume->v_mdf_pdisks; + else if (lvl == G_RAID_VOLUME_RL_RAID5EE || + lvl == G_RAID_VOLUME_RL_RAID6) + pdisks = 2; + else + pdisks = 1; + ddisks = vol->v_disks_count - pdisks; /* Parity disk number. */ - pno = nstripe / (vol->v_disks_count - 1) % vol->v_disks_count; - if (qual >= 2) - pno = (vol->v_disks_count - 1) - pno; - /* Disk number. */ - no = nstripe % (vol->v_disks_count - 1); - if (qual & 1) { - no = (pno + no + 1) % vol->v_disks_count; - } else if (no >= pno) - no++; + if (lvl == G_RAID_VOLUME_RL_RAID4) { + if (qual == 0) /* P0 */ + pno = 0; + else /* PN */ + pno = ddisks; + pleft = -1; + } else { + pno = (nstripe / (ddisks * protate)) % vol->v_disks_count; + pleft = protate - (nstripe / ddisks) % protate; + if (qual >= 2) { /* PN/Left */ + pno = ddisks - pno; + if (pno < 0) + pno += vol->v_disks_count; + } + } + /* Data disk number. */ + no = nstripe % ddisks; + if (lvl == G_RAID_VOLUME_RL_RAID4) { + if (qual == 0) + no += pdisks; + } else if (qual & 1) { /* Continuation/Symmetric */ + no = (pno + pdisks + no) % vol->v_disks_count; + } else if (no >= pno) /* Restart/Asymmetric */ + no += pdisks; + else + no += imax(0, pno + pdisks - vol->v_disks_count); /* Stripe start position in disk. */ - offset = (nstripe / (vol->v_disks_count - 1)) * strip_size; + offset = (nstripe / ddisks) * strip_size; /* Length of data to operate. */ remain = bp->bio_length; @@ -242,33 +278,43 @@ g_raid_tr_iostart_raid5_read(struct g_raid_tr_object *tr, struct bio *bp) cbp->bio_caller1 = &vol->v_subdisks[no]; bioq_insert_tail(&queue, cbp); no++; - if (qual & 1) { + if (lvl == G_RAID_VOLUME_RL_RAID4) { + no %= vol->v_disks_count; + if (no == pno) + no = (no + pdisks) % vol->v_disks_count; + } else if (qual & 1) { /* Continuation/Symmetric */ no %= vol->v_disks_count; if (no == pno) { - if (qual < 2) { - pno = (pno + 1) % vol->v_disks_count; - no = (no + 2) % vol->v_disks_count; - } else if (pno == 0) - pno = vol->v_disks_count - 1; - else - pno--; + if ((--pleft) <= 0) { + pleft += protate; + if (qual < 2) /* P0/Right */ + pno++; + else /* PN/Left */ + pno += vol->v_disks_count - 1; + pno %= vol->v_disks_count; + } + no = (pno + pdisks) % vol->v_disks_count; offset += strip_size; } - } else { + } else { /* Restart/Asymmetric */ if (no == pno) - no++; + no += pdisks; if (no >= vol->v_disks_count) { - no %= vol->v_disks_count; - if (qual < 2) - pno = (pno + 1) % vol->v_disks_count; - else if (pno == 0) - pno = vol->v_disks_count - 1; + no -= vol->v_disks_count; + if ((--pleft) <= 0) { + pleft += protate; + if (qual < 2) /* P0/Right */ + pno++; + else /* PN/Left */ + pno += vol->v_disks_count - 1; + pno %= vol->v_disks_count; + } + if (no == pno) + no += pdisks; else - pno--; + no += imax(0, pno + pdisks - vol->v_disks_count); offset += strip_size; } - if (no == pno) - no++; } remain -= length; addr += length; diff --git a/sys/geom/uncompress/g_uncompress.c b/sys/geom/uncompress/g_uncompress.c index 778d5c6f442..f8227029e70 100644 --- a/sys/geom/uncompress/g_uncompress.c +++ b/sys/geom/uncompress/g_uncompress.c @@ -406,13 +406,11 @@ g_uncompress_orphan(struct g_consumer *cp) g_trace(G_T_TOPOLOGY, "%s(%p/%s)", __func__, cp, cp->provider->name); g_topology_assert(); - KASSERT(cp->provider->error != 0, - ("g_uncompress_orphan with error == 0")); gp = cp->geom; g_uncompress_softc_free(gp->softc, gp); gp->softc = NULL; - g_wither_geom(gp, cp->provider->error); + g_wither_geom(gp, ENXIO); } static int diff --git a/sys/geom/uzip/g_uzip.c b/sys/geom/uzip/g_uzip.c index f19e14c60a8..03272115edb 100644 --- a/sys/geom/uzip/g_uzip.c +++ b/sys/geom/uzip/g_uzip.c @@ -313,13 +313,11 @@ g_uzip_orphan(struct g_consumer *cp) g_trace(G_T_TOPOLOGY, "g_uzip_orphan(%p/%s)", cp, cp->provider->name); g_topology_assert(); - KASSERT(cp->provider->error != 0, - ("g_uzip_orphan with error == 0")); gp = cp->geom; g_uzip_softc_free(gp->softc, gp); gp->softc = NULL; - g_wither_geom(gp, cp->provider->error); + g_wither_geom(gp, ENXIO); } static int diff --git a/sys/gnu/fs/xfs/FreeBSD/xfs_buf.c b/sys/gnu/fs/xfs/FreeBSD/xfs_buf.c index ff06865e1ac..b1821a827f2 100644 --- a/sys/gnu/fs/xfs/FreeBSD/xfs_buf.c +++ b/sys/gnu/fs/xfs/FreeBSD/xfs_buf.c @@ -50,8 +50,8 @@ xfs_buf_read_flags(xfs_buftarg_t *target, xfs_daddr_t blkno, size_t len, int fla KASSERT((target != NULL), ("got NULL buftarg_t")); if (bread(target->specvp, blkno, BBTOB(len), NOCRED, &bp)) { - printf("bread failed specvp %p blkno %qd BBTOB(len) %ld\n", - target->specvp, blkno, (long)BBTOB(len)); + printf("bread failed specvp %p blkno %jd BBTOB(len) %ld\n", + target->specvp, (intmax_t)blkno, (long)BBTOB(len)); bp = NULL; } diff --git a/sys/i386/acpica/acpi_machdep.c b/sys/i386/acpica/acpi_machdep.c index 0f5d5b8c3e4..08721279b6c 100644 --- a/sys/i386/acpica/acpi_machdep.c +++ b/sys/i386/acpica/acpi_machdep.c @@ -44,8 +44,6 @@ __FBSDID("$FreeBSD$"); #include -SYSCTL_DECL(_debug_acpi); - uint32_t acpi_resume_beep; TUNABLE_INT("debug.acpi.resume_beep", &acpi_resume_beep); SYSCTL_UINT(_debug_acpi, OID_AUTO, resume_beep, CTLFLAG_RW, &acpi_resume_beep, diff --git a/sys/i386/acpica/acpi_wakecode.S b/sys/i386/acpica/acpi_wakecode.S index e23b138870f..88f32d7c119 100644 --- a/sys/i386/acpica/acpi_wakecode.S +++ b/sys/i386/acpica/acpi_wakecode.S @@ -1,6 +1,8 @@ /*- * Copyright (c) 2001 Takanori Watanabe - * Copyright (c) 2001 Mitsuru IWASAKI + * Copyright (c) 2001-2012 Mitsuru IWASAKI + * Copyright (c) 2003 Peter Wemm + * Copyright (c) 2008-2012 Jung-uk Kim * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -28,7 +30,9 @@ */ #include +#include #include +#include #include "assym.s" @@ -39,221 +43,166 @@ * Depending on the previous sleep state, we may need to initialize more * of the system (i.e., S3 suspend-to-RAM vs. S4 suspend-to-disk). */ - .align 4 - .code16 -wakeup_16: - nop - cli - cld + .data /* So we can modify it */ + + ALIGN_TEXT + .code16 +wakeup_start: /* * Set up segment registers for real mode, a small stack for * any calls we make, and clear any flags. */ - movw %cs,%ax - movw %ax,%ds - movw %ax,%ss - movw $PAGE_SIZE,%sp - pushl $0 - popfl + cli /* make sure no interrupts */ + mov %cs, %ax /* copy %cs to %ds. Remember these */ + mov %ax, %ds /* are offsets rather than selectors */ + mov %ax, %ss + movw $PAGE_SIZE, %sp + xorw %ax, %ax + pushw %ax + popfw /* To debug resume hangs, beep the speaker if the user requested. */ - cmpl $1,resume_beep - jne nobeep - movb $0xc0,%al - outb %al,$0x42 - movb $0x04,%al - outb %al,$0x42 - inb $0x61,%al - orb $0x3,%al - outb %al,$0x61 -nobeep: + testb $~0, resume_beep - wakeup_start + jz 1f + movb $0, resume_beep - wakeup_start + + /* Set PIC timer2 to beep. */ + movb $(TIMER_SEL2 | TIMER_SQWAVE | TIMER_16BIT), %al + outb %al, $TIMER_MODE + + /* Turn on speaker. */ + inb $IO_PPI, %al + orb $PIT_SPKR, %al + outb %al, $IO_PPI + + /* Set frequency. */ + movw $0x4c0, %ax + outb %al, $TIMER_CNTR2 + shrw $8, %ax + outb %al, $TIMER_CNTR2 +1: /* Re-initialize video BIOS if the reset_video tunable is set. */ - cmpl $1,reset_video - jne nobiosreset - lcall $0xc000,$3 + testb $~0, reset_video - wakeup_start + jz 1f + movb $0, reset_video - wakeup_start + lcall $0xc000, $3 - /* - * Set up segment registers for real mode again in case the - * previous BIOS call clobbers them. - */ - movw %cs,%ax - movw %ax,%ds - movw %ax,%ss -nobiosreset: + /* When we reach here, int 0x10 should be ready. Hide cursor. */ + movb $0x01, %ah + movb $0x20, %ch + int $0x10 - /* Load GDT for real mode. Use 32 bit prefix for addresses >16 MB. */ - lgdtl physical_gdt - - /* Restore CR2, CR3 and CR4 */ - movl previous_cr2,%eax - movl %eax,%cr2 - movl previous_cr3,%eax - movl %eax,%cr3 - movl previous_cr4,%eax - movl %eax,%cr4 - - /* Transfer some values to protected mode with an inline stack */ -#define NVALUES 9 -#define TRANSFER_STACK32(val, idx) \ - movl val,%eax; \ - movl %eax,wakeup_32stack+(idx+1)+(idx*4) - - TRANSFER_STACK32(previous_ss, (NVALUES - 9)) - TRANSFER_STACK32(previous_fs, (NVALUES - 8)) - TRANSFER_STACK32(previous_ds, (NVALUES - 7)) - TRANSFER_STACK32(physical_gdt+2, (NVALUES - 6)) - TRANSFER_STACK32(where_to_recover, (NVALUES - 5)) - TRANSFER_STACK32(previous_idt+2, (NVALUES - 4)) - TRANSFER_STACK32(previous_ldt, (NVALUES - 3)) - TRANSFER_STACK32(previous_gdt+2, (NVALUES - 2)) - TRANSFER_STACK32(previous_tr, (NVALUES - 1)) - TRANSFER_STACK32(previous_cr0, (NVALUES - 0)) - - mov physical_esp,%esi /* to be used in 32bit code */ - - /* Enable protected mode */ - movl %cr0,%eax - orl $(CR0_PE),%eax - movl %eax,%cr0 - -wakeup_sw32: - /* Switch to protected mode by intersegmental jump */ - ljmpl $KCSEL,$0x12345678 /* Code location, to be replaced */ - - /* - * Now switched to protected mode without paging enabled. - * %esi: KERNEL stack pointer (physical address) - */ - .code32 -wakeup_32: - nop - - /* Set up segment registers for protected mode */ - movw $KDSEL,%ax /* KDSEL to segment registers */ - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movw %ax,%ss - movw $KPSEL,%ax /* KPSEL to %fs */ - movw %ax,%fs - movl %esi,%esp /* physical address stack pointer */ - -wakeup_32stack: - /* Operands are overwritten in 16 bit code by TRANSFER_STACK32 macro */ - pushl $0xabcdef09 /* ss + dummy */ - pushl $0xabcdef08 /* fs + gs */ - pushl $0xabcdef07 /* ds + es */ - pushl $0xabcdef06 /* gdt:base (physical address) */ - pushl $0xabcdef05 /* recover address */ - pushl $0xabcdef04 /* idt:base */ - pushl $0xabcdef03 /* ldt + idt:limit */ - pushl $0xabcdef02 /* gdt:base */ - pushl $0xabcdef01 /* TR + gdt:limit */ - pushl $0xabcdef00 /* CR0 */ - - movl %esp,%ebp -#define CR0_REGISTER 0(%ebp) -#define TASK_REGISTER 4(%ebp) -#define PREVIOUS_GDT 6(%ebp) -#define PREVIOUS_LDT 12(%ebp) -#define PREVIOUS_IDT 14(%ebp) -#define RECOVER_ADDR 20(%ebp) -#define PHYSICAL_GDT_BASE 24(%ebp) -#define PREVIOUS_DS 28(%ebp) -#define PREVIOUS_ES 30(%ebp) -#define PREVIOUS_FS 32(%ebp) -#define PREVIOUS_GS 34(%ebp) -#define PREVIOUS_SS 36(%ebp) - - /* Fixup TSS type field */ -#define TSS_TYPEFIX_MASK 0xf9 - xorl %esi,%esi - movl PHYSICAL_GDT_BASE,%ebx - movw TASK_REGISTER,%si - leal (%ebx,%esi),%eax /* get TSS segment descriptor */ - andb $TSS_TYPEFIX_MASK,5(%eax) - - /* Prepare to return to sleep/wakeup code point */ - lgdtl PREVIOUS_GDT - lidtl PREVIOUS_IDT - - /* Pack values from the GDT to be loaded into segment registers. */ - movl PREVIOUS_DS,%ebx - movl PREVIOUS_FS,%ecx - movl PREVIOUS_SS,%edx - movw TASK_REGISTER,%si - shll $16,%esi - movw PREVIOUS_LDT,%si - movl RECOVER_ADDR,%edi - - /* Enable paging and etc. */ - movl CR0_REGISTER,%eax - movl %eax,%cr0 - - /* Flush the prefetch queue */ - jmp 1f -1: jmp 1f + /* Re-start in case the previous BIOS call clobbers them. */ + jmp wakeup_start 1: /* - * Now we are in kernel virtual memory addressing with the following - * original register values: - * %ebx: ds + es - * %ecx: fs + gs - * %edx: ss + dummy - * %esi: LDTR + TR - * %edi: recover address - * We'll load these back into the segment registers now. + * Find relocation base and patch the gdt descript and ljmp targets */ - nop + xorl %ebx, %ebx + mov %cs, %bx + sall $4, %ebx /* %ebx is now our relocation base */ - movl %esi,%eax /* LDTR + TR */ - lldt %ax /* load LDT register */ - shrl $16,%eax - ltr %ax /* load task register */ + /* + * Load the descriptor table pointer. We'll need it when running + * in 16-bit protected mode. + */ + lgdtl bootgdtdesc - wakeup_start - /* Restore segment registers */ - movl %ebx,%eax /* ds + es */ - movw %ax,%ds - shrl $16,%eax - movw %ax,%es - movl %ecx,%eax /* fs + gs */ - movw %ax,%fs - shrl $16,%eax - movw %ax,%gs - movl %edx,%eax /* ss */ - movw %ax,%ss + /* Enable protected mode */ + movl $CR0_PE, %eax + mov %eax, %cr0 - /* Jump to acpi_restorecpu() */ - jmp *%edi + /* + * Now execute a far jump to turn on protected mode. This + * causes the segment registers to turn into selectors and causes + * %cs to be loaded from the gdt. + * + * The following instruction is: + * ljmpl $bootcode32 - bootgdt, $wakeup_32 - wakeup_start + * but gas cannot assemble that. And besides, we patch the targets + * in early startup and its a little clearer what we are patching. + */ +wakeup_sw32: + .byte 0x66 /* size override to 32 bits */ + .byte 0xea /* opcode for far jump */ + .long wakeup_32 - wakeup_start /* offset in segment */ + .word bootcode32 - bootgdt /* index in gdt for 32 bit code */ -/* used in real mode */ -physical_gdt: .word 0 - .long 0 -physical_esp: .long 0 -previous_cr2: .long 0 -previous_cr3: .long 0 -previous_cr4: .long 0 -resume_beep: .long 0 -reset_video: .long 0 + /* + * At this point, we are running in 32 bit legacy protected mode. + */ + ALIGN_TEXT + .code32 +wakeup_32: -/* - * Transfer from real mode to protected mode. The order of these variables - * is very important, DO NOT INSERT OR CHANGE unless you know why. - */ -previous_cr0: .long 0 -previous_tr: .word 0 -previous_gdt: .word 0 - .long 0 -previous_ldt: .word 0 -previous_idt: .word 0 - .long 0 -where_to_recover: .long 0 -previous_ds: .word 0 -previous_es: .word 0 -previous_fs: .word 0 -previous_gs: .word 0 -previous_ss: .word 0 -dummy: .word 0 + mov $bootdata32 - bootgdt, %eax + mov %ax, %ds + + /* Get PCB and return address. */ + movl wakeup_pcb - wakeup_start(%ebx), %ecx + movl wakeup_ret - wakeup_start(%ebx), %edx + + /* Restore CR4 and CR3. */ + movl wakeup_cr4 - wakeup_start(%ebx), %eax + mov %eax, %cr4 + movl wakeup_cr3 - wakeup_start(%ebx), %eax + mov %eax, %cr3 + + /* + * Finally, switch to long bit mode by enabling paging. We have + * to be very careful here because all the segmentation disappears + * out from underneath us. The spec says we can depend on the + * subsequent pipelined branch to execute, but *only if* everthing + * is still identity mapped. If any mappings change, the pipeline + * will flush. + */ + mov %cr0, %eax + orl $CR0_PG, %eax + mov %eax, %cr0 + + jmp 1f +1: + /* Jump to return address. */ + jmp *%edx + + .data + +resume_beep: + .byte 0 +reset_video: + .byte 0 + + ALIGN_DATA +bootgdt: + .long 0x00000000 + .long 0x00000000 + +bootcode32: + .long 0x0000ffff + .long 0x00cf9b00 + +bootdata32: + .long 0x0000ffff + .long 0x00cf9300 +bootgdtend: + +bootgdtdesc: + .word bootgdtend - bootgdt /* Length */ + .long bootgdt - wakeup_start /* Offset plus %ds << 4 */ + + ALIGN_DATA +wakeup_cr4: + .long 0 +wakeup_cr3: + .long 0 +wakeup_pcb: + .long 0 +wakeup_ret: + .long 0 +wakeup_gdt: /* not used */ + .word 0 + .long 0 +dummy: diff --git a/sys/i386/acpica/acpi_wakeup.c b/sys/i386/acpica/acpi_wakeup.c deleted file mode 100644 index 31502f7692e..00000000000 --- a/sys/i386/acpica/acpi_wakeup.c +++ /dev/null @@ -1,371 +0,0 @@ -/*- - * Copyright (c) 2001 Takanori Watanabe - * Copyright (c) 2001 Mitsuru IWASAKI - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include - -#include "acpi_wakecode.h" -#include "acpi_wakedata.h" - -/* Make sure the code is less than one page and leave room for the stack. */ -CTASSERT(sizeof(wakecode) < PAGE_SIZE - 1024); - -#ifndef _SYS_CDEFS_H_ -#error this file needs sys/cdefs.h as a prerequisite -#endif - -extern uint32_t acpi_resume_beep; -extern uint32_t acpi_reset_video; -extern void initializecpu(void); - -static struct region_descriptor __used saved_idt, saved_gdt; -static struct region_descriptor *p_gdt; -static uint16_t __used saved_ldt; - -static uint32_t __used r_eax, r_ebx, r_ecx, r_edx, r_ebp, r_esi, r_edi, - r_efl, r_cr0, r_cr2, r_cr3, r_cr4, ret_addr; - -static uint16_t __used r_cs, r_ds, r_es, r_fs, r_gs, r_ss, r_tr; -static uint32_t __used r_esp; - -static void acpi_printcpu(void); -static void acpi_realmodeinst(void *arg, bus_dma_segment_t *segs, - int nsegs, int error); -static void acpi_alloc_wakeup_handler(void); - -/* XXX shut gcc up */ -extern int acpi_savecpu(void); -extern int acpi_restorecpu(void); - -#ifdef __GNUCLIKE_ASM -__asm__(" \n\ - .text \n\ - .p2align 2, 0x90 \n\ - .type acpi_restorecpu, @function\n\ -acpi_restorecpu: \n\ - .align 4 \n\ - movl r_eax,%eax \n\ - movl r_ebx,%ebx \n\ - movl r_ecx,%ecx \n\ - movl r_edx,%edx \n\ - movl r_ebp,%ebp \n\ - movl r_esi,%esi \n\ - movl r_edi,%edi \n\ - movl r_esp,%esp \n\ - \n\ - pushl r_efl \n\ - popfl \n\ - \n\ - movl ret_addr,%eax \n\ - movl %eax,(%esp) \n\ - xorl %eax,%eax \n\ - ret \n\ - \n\ - .text \n\ - .p2align 2, 0x90 \n\ - .type acpi_savecpu, @function \n\ -acpi_savecpu: \n\ - movw %cs,r_cs \n\ - movw %ds,r_ds \n\ - movw %es,r_es \n\ - movw %fs,r_fs \n\ - movw %gs,r_gs \n\ - movw %ss,r_ss \n\ - \n\ - movl %eax,r_eax \n\ - movl %ebx,r_ebx \n\ - movl %ecx,r_ecx \n\ - movl %edx,r_edx \n\ - movl %ebp,r_ebp \n\ - movl %esi,r_esi \n\ - movl %edi,r_edi \n\ - \n\ - movl %cr0,%eax \n\ - movl %eax,r_cr0 \n\ - movl %cr2,%eax \n\ - movl %eax,r_cr2 \n\ - movl %cr3,%eax \n\ - movl %eax,r_cr3 \n\ - movl %cr4,%eax \n\ - movl %eax,r_cr4 \n\ - \n\ - pushfl \n\ - popl r_efl \n\ - \n\ - movl %esp,r_esp \n\ - \n\ - sgdt saved_gdt \n\ - sidt saved_idt \n\ - sldt saved_ldt \n\ - str r_tr \n\ - \n\ - movl (%esp),%eax \n\ - movl %eax,ret_addr \n\ - movl $1,%eax \n\ - ret \n\ -"); -#endif /* __GNUCLIKE_ASM */ - -static void -acpi_printcpu(void) -{ - printf("======== acpi_printcpu() debug dump ========\n"); - printf("gdt[%04x:%08x] idt[%04x:%08x] ldt[%04x] tr[%04x] efl[%08x]\n", - saved_gdt.rd_limit, saved_gdt.rd_base, - saved_idt.rd_limit, saved_idt.rd_base, - saved_ldt, r_tr, r_efl); - printf("eax[%08x] ebx[%08x] ecx[%08x] edx[%08x]\n", - r_eax, r_ebx, r_ecx, r_edx); - printf("esi[%08x] edi[%08x] ebp[%08x] esp[%08x]\n", - r_esi, r_edi, r_ebp, r_esp); - printf("cr0[%08x] cr2[%08x] cr3[%08x] cr4[%08x]\n", - r_cr0, r_cr2, r_cr3, r_cr4); - printf("cs[%04x] ds[%04x] es[%04x] fs[%04x] gs[%04x] ss[%04x]\n", - r_cs, r_ds, r_es, r_fs, r_gs, r_ss); -} - -#define WAKECODE_FIXUP(offset, type, val) do { \ - type *addr; \ - addr = (type *)(sc->acpi_wakeaddr + offset); \ - *addr = val; \ -} while (0) - -#define WAKECODE_BCOPY(offset, type, val) do { \ - void *addr; \ - addr = (void *)(sc->acpi_wakeaddr + offset); \ - bcopy(&(val), addr, sizeof(type)); \ -} while (0) - -/* Turn off bits 1&2 of the PIT, stopping the beep. */ -static void -acpi_stop_beep(void *arg) -{ - outb(0x61, inb(0x61) & ~0x3); -} - -int -acpi_sleep_machdep(struct acpi_softc *sc, int state) -{ - ACPI_STATUS status; - struct pmap *pm; - int ret; - uint32_t cr3; - u_long ef; - - ret = -1; - if (sc->acpi_wakeaddr == 0) - return (ret); - - AcpiSetFirmwareWakingVector(sc->acpi_wakephys); - - ef = intr_disable(); - intr_suspend(); - - /* - * Temporarily switch to the kernel pmap because it provides an - * identity mapping (setup at boot) for the low physical memory - * region containing the wakeup code. - */ - pm = kernel_pmap; - cr3 = rcr3(); -#ifdef PAE - load_cr3(vtophys(pm->pm_pdpt)); -#else - load_cr3(vtophys(pm->pm_pdir)); -#endif - - ret_addr = 0; - if (acpi_savecpu()) { - /* Execute Sleep */ - - p_gdt = (struct region_descriptor *) - (sc->acpi_wakeaddr + physical_gdt); - p_gdt->rd_limit = saved_gdt.rd_limit; - p_gdt->rd_base = vtophys(saved_gdt.rd_base); - - WAKECODE_FIXUP(physical_esp, uint32_t, vtophys(r_esp)); - WAKECODE_FIXUP(previous_cr0, uint32_t, r_cr0); - WAKECODE_FIXUP(previous_cr2, uint32_t, r_cr2); - WAKECODE_FIXUP(previous_cr3, uint32_t, r_cr3); - WAKECODE_FIXUP(previous_cr4, uint32_t, r_cr4); - - WAKECODE_FIXUP(resume_beep, uint32_t, acpi_resume_beep); - WAKECODE_FIXUP(reset_video, uint32_t, acpi_reset_video); - - WAKECODE_FIXUP(previous_tr, uint16_t, r_tr); - WAKECODE_BCOPY(previous_gdt, struct region_descriptor, saved_gdt); - WAKECODE_FIXUP(previous_ldt, uint16_t, saved_ldt); - WAKECODE_BCOPY(previous_idt, struct region_descriptor, saved_idt); - - WAKECODE_FIXUP(where_to_recover, void *, acpi_restorecpu); - - WAKECODE_FIXUP(previous_ds, uint16_t, r_ds); - WAKECODE_FIXUP(previous_es, uint16_t, r_es); - WAKECODE_FIXUP(previous_fs, uint16_t, r_fs); - WAKECODE_FIXUP(previous_gs, uint16_t, r_gs); - WAKECODE_FIXUP(previous_ss, uint16_t, r_ss); - - if (bootverbose) - acpi_printcpu(); - - /* Call ACPICA to enter the desired sleep state */ - if (state == ACPI_STATE_S4 && sc->acpi_s4bios) - status = AcpiEnterSleepStateS4bios(); - else - status = AcpiEnterSleepState(state, acpi_sleep_flags); - - if (status != AE_OK) { - device_printf(sc->acpi_dev, - "AcpiEnterSleepState failed - %s\n", - AcpiFormatException(status)); - goto out; - } - - for (;;) - ia32_pause(); - } else { - pmap_init_pat(); - PCPU_SET(switchtime, 0); - PCPU_SET(switchticks, ticks); - if (bootverbose) { - acpi_savecpu(); - acpi_printcpu(); - } - ret = 0; - } - -out: - load_cr3(cr3); - mca_resume(); - intr_resume(); - intr_restore(ef); - - if (ret == 0 && mem_range_softc.mr_op != NULL && - mem_range_softc.mr_op->reinit != NULL) - mem_range_softc.mr_op->reinit(&mem_range_softc); - - /* If we beeped, turn it off after a delay. */ - if (acpi_resume_beep) - timeout(acpi_stop_beep, NULL, 3 * hz); - - return (ret); -} - -static bus_dma_tag_t acpi_waketag; -static bus_dmamap_t acpi_wakemap; -static vm_offset_t acpi_wakeaddr; - -static void -acpi_alloc_wakeup_handler(void) -{ - void *wakeaddr; - - if (!cold) - return; - - /* - * Specify the region for our wakeup code. We want it in the low 1 MB - * region, excluding video memory and above (0xa0000). We ask for - * it to be page-aligned, just to be safe. - */ - if (bus_dma_tag_create(/*parent*/ NULL, - /*alignment*/ PAGE_SIZE, /*no boundary*/ 0, - /*lowaddr*/ 0x9ffff, /*highaddr*/ BUS_SPACE_MAXADDR, NULL, NULL, - /*maxsize*/ PAGE_SIZE, /*segments*/ 1, /*maxsegsize*/ PAGE_SIZE, - 0, busdma_lock_mutex, &Giant, &acpi_waketag) != 0) { - printf("acpi_alloc_wakeup_handler: can't create wake tag\n"); - return; - } - if (bus_dmamem_alloc(acpi_waketag, &wakeaddr, BUS_DMA_NOWAIT, - &acpi_wakemap) != 0) { - printf("acpi_alloc_wakeup_handler: can't alloc wake memory\n"); - return; - } - acpi_wakeaddr = (vm_offset_t)wakeaddr; -} - -SYSINIT(acpiwakeup, SI_SUB_KMEM, SI_ORDER_ANY, acpi_alloc_wakeup_handler, 0); - -static void -acpi_realmodeinst(void *arg, bus_dma_segment_t *segs, int nsegs, int error) -{ - struct acpi_softc *sc; - uint32_t *addr; - - /* Overwrite the ljmp target with the real address */ - sc = arg; - sc->acpi_wakephys = segs[0].ds_addr; - addr = (uint32_t *)&wakecode[wakeup_sw32 + 2]; - *addr = sc->acpi_wakephys + wakeup_32; - - /* Copy the wake code into our low page and save its physical addr. */ - bcopy(wakecode, (void *)sc->acpi_wakeaddr, sizeof(wakecode)); - if (bootverbose) { - device_printf(sc->acpi_dev, "wakeup code va %#x pa %#jx\n", - acpi_wakeaddr, (uintmax_t)sc->acpi_wakephys); - } -} - -void -acpi_install_wakeup_handler(struct acpi_softc *sc) -{ - if (acpi_wakeaddr == 0) - return; - - sc->acpi_waketag = acpi_waketag; - sc->acpi_wakeaddr = acpi_wakeaddr; - sc->acpi_wakemap = acpi_wakemap; - - bus_dmamap_load(sc->acpi_waketag, sc->acpi_wakemap, - (void *)sc->acpi_wakeaddr, PAGE_SIZE, acpi_realmodeinst, sc, 0); -} diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC index 58b66a10b26..3ff96c9c959 100644 --- a/sys/i386/conf/GENERIC +++ b/sys/i386/conf/GENERIC @@ -30,6 +30,7 @@ options SCHED_ULE # ULE scheduler options PREEMPTION # Enable kernel thread preemption options INET # InterNETworking options INET6 # IPv6 communications protocols +options TCP_OFFLOAD # TCP offload options SCTP # Stream Control Transmission Protocol options FFS # Berkeley Fast Filesystem options SOFTUPDATES # Enable FFS soft updates support @@ -46,6 +47,7 @@ options CD9660 # ISO 9660 Filesystem options PROCFS # Process filesystem (requires PSEUDOFS) options PSEUDOFS # Pseudo-filesystem framework options GEOM_PART_GPT # GUID Partition Tables. +options GEOM_RAID # Soft RAID functionality. options GEOM_LABEL # Provides labelization options COMPAT_FREEBSD4 # Compatible with FreeBSD4 options COMPAT_FREEBSD5 # Compatible with FreeBSD5 @@ -66,6 +68,7 @@ options CAPABILITY_MODE # Capsicum capability mode options CAPABILITIES # Capsicum capabilities options MAC # TrustedBSD MAC Framework options KDTRACE_HOOKS # Kernel DTrace hooks +options DDB_CTF # Kernel ELF linker loads CTF data options INCLUDE_CONFIG_FILE # Include this file in kernel # Debugging support. Always need this: @@ -75,7 +78,6 @@ options KDB # Enable kernel debugger support. # For full debugger support use this instead: options DDB # Support DDB. options GDB # Support remote GDB. -options DDB_CTF # kernel ELF linker loads CTF data options DEADLKRES # Enable the deadlock resolver options INVARIANTS # Enable calls of extra sanity checking options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS @@ -284,6 +286,8 @@ device ath # Atheros NIC's device ath_pci # Atheros pci/cardbus glue device ath_hal # pci/cardbus chip support options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors +options AH_AR5416_INTERRUPT_MITIGATION # AR5416 interrupt mitigation +options ATH_ENABLE_11N # Enable 802.11n support for AR5416 and later device ath_rate_sample # SampleRate tx rate control for ath #device bwi # Broadcom BCM430x/BCM431x wireless NICs. #device bwn # Broadcom BCM43xx wireless NICs. diff --git a/sys/i386/conf/XEN b/sys/i386/conf/XEN index 80d4113de94..a9c838cfa77 100644 --- a/sys/i386/conf/XEN +++ b/sys/i386/conf/XEN @@ -7,7 +7,7 @@ cpu I686_CPU ident XEN makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols -makeoptions WITHOUT_MODULES="aha ahb amd cxgb dpt drm hptmv ida malo mps mwl nve sound sym trm xfs" +makeoptions WITHOUT_MODULES="aha ahb amd cxgb dpt drm drm2 hptmv ida malo mps mwl nve rdma sound sym trm xfs" options SCHED_ULE # ULE scheduler options PREEMPTION # Enable kernel thread preemption diff --git a/sys/i386/i386/apic_vector.s b/sys/i386/i386/apic_vector.s index 86e78c4beb2..618436d830a 100644 --- a/sys/i386/i386/apic_vector.s +++ b/sys/i386/i386/apic_vector.s @@ -333,6 +333,26 @@ IDTVEC(cpustop) POP_FRAME iret +/* + * Executed by a CPU when it receives an IPI_SUSPEND from another CPU. + */ +#ifndef XEN + .text + SUPERALIGN_TEXT +IDTVEC(cpususpend) + PUSH_FRAME + SET_KERNEL_SREGS + cld + + movl lapic, %eax + movl $0, LA_EOI(%eax) /* End Of Interrupt to APIC */ + + call cpususpend_handler + + POP_FRAME + jmp doreti_iret +#endif + /* * Executed by a CPU when it receives a RENDEZVOUS IPI from another CPU. * diff --git a/sys/i386/i386/bios.c b/sys/i386/i386/bios.c index a6d09785337..ffe42bae8d7 100644 --- a/sys/i386/i386/bios.c +++ b/sys/i386/i386/bios.c @@ -372,9 +372,11 @@ bios16(struct bios_args *args, char *fmt, ...) break; default: + va_end(ap); return (EINVAL); } } + va_end(ap); if (flags & BIOSARGS_FLAG) { if (arg_end - arg_start > ctob(16)) @@ -448,9 +450,11 @@ bios16(struct bios_args *args, char *fmt, ...) break; default: + va_end(ap); return (EINVAL); } } + va_end(ap); set_bios_selectors(&args->seg, flags); bioscall_vector.vec16.offset = (u_short)args->entry; diff --git a/sys/i386/i386/elf_machdep.c b/sys/i386/i386/elf_machdep.c index a782445acd8..034b4c47d87 100644 --- a/sys/i386/i386/elf_machdep.c +++ b/sys/i386/i386/elf_machdep.c @@ -74,12 +74,15 @@ struct sysentvec elf32_freebsd_sysvec = { .sv_setregs = exec_setregs, .sv_fixlimit = NULL, .sv_maxssiz = NULL, - .sv_flags = SV_ABI_FREEBSD | SV_IA32 | SV_ILP32, + .sv_flags = SV_ABI_FREEBSD | SV_IA32 | SV_ILP32 | SV_SHP, .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, + .sv_shared_page_base = SHAREDPAGE, + .sv_shared_page_len = PAGE_SIZE, .sv_schedtail = NULL, }; +INIT_SYSENTVEC(elf32_sysvec, &elf32_freebsd_sysvec); static Elf32_Brandinfo freebsd_brand_info = { .brand = ELFOSABI_FREEBSD, diff --git a/sys/i386/i386/genassym.c b/sys/i386/i386/genassym.c index 9acc4f4e272..2394c09f480 100644 --- a/sys/i386/i386/genassym.c +++ b/sys/i386/i386/genassym.c @@ -121,7 +121,10 @@ ASSYM(VM_MAXUSER_ADDRESS, VM_MAXUSER_ADDRESS); ASSYM(KERNBASE, KERNBASE); ASSYM(KERNLOAD, KERNLOAD); ASSYM(MCLBYTES, MCLBYTES); +ASSYM(PCB_CR0, offsetof(struct pcb, pcb_cr0)); +ASSYM(PCB_CR2, offsetof(struct pcb, pcb_cr2)); ASSYM(PCB_CR3, offsetof(struct pcb, pcb_cr3)); +ASSYM(PCB_CR4, offsetof(struct pcb, pcb_cr4)); ASSYM(PCB_EDI, offsetof(struct pcb, pcb_edi)); ASSYM(PCB_ESI, offsetof(struct pcb, pcb_esi)); ASSYM(PCB_EBP, offsetof(struct pcb, pcb_ebp)); @@ -130,7 +133,11 @@ ASSYM(PCB_EBX, offsetof(struct pcb, pcb_ebx)); ASSYM(PCB_EIP, offsetof(struct pcb, pcb_eip)); ASSYM(TSS_ESP0, offsetof(struct i386tss, tss_esp0)); +ASSYM(PCB_DS, offsetof(struct pcb, pcb_ds)); +ASSYM(PCB_ES, offsetof(struct pcb, pcb_es)); +ASSYM(PCB_FS, offsetof(struct pcb, pcb_fs)); ASSYM(PCB_GS, offsetof(struct pcb, pcb_gs)); +ASSYM(PCB_SS, offsetof(struct pcb, pcb_ss)); ASSYM(PCB_DR0, offsetof(struct pcb, pcb_dr0)); ASSYM(PCB_DR1, offsetof(struct pcb, pcb_dr1)); ASSYM(PCB_DR2, offsetof(struct pcb, pcb_dr2)); @@ -143,6 +150,7 @@ ASSYM(PCB_DBREGS, PCB_DBREGS); ASSYM(PCB_EXT, offsetof(struct pcb, pcb_ext)); ASSYM(PCB_FSD, offsetof(struct pcb, pcb_fsd)); +ASSYM(PCB_GSD, offsetof(struct pcb, pcb_gsd)); ASSYM(PCB_VM86, offsetof(struct pcb, pcb_vm86)); ASSYM(PCB_FLAGS, offsetof(struct pcb, pcb_flags)); ASSYM(PCB_SAVEFPU, offsetof(struct pcb, pcb_save)); @@ -152,6 +160,11 @@ ASSYM(PCB_ONFAULT, offsetof(struct pcb, pcb_onfault)); ASSYM(PCB_SIZE, sizeof(struct pcb)); ASSYM(PCB_VM86CALL, PCB_VM86CALL); +ASSYM(PCB_GDT, offsetof(struct pcb, pcb_gdt)); +ASSYM(PCB_IDT, offsetof(struct pcb, pcb_idt)); +ASSYM(PCB_LDT, offsetof(struct pcb, pcb_ldt)); +ASSYM(PCB_TR, offsetof(struct pcb, pcb_tr)); + ASSYM(TF_TRAPNO, offsetof(struct trapframe, tf_trapno)); ASSYM(TF_ERR, offsetof(struct trapframe, tf_err)); ASSYM(TF_EIP, offsetof(struct trapframe, tf_eip)); diff --git a/sys/i386/i386/initcpu.c b/sys/i386/i386/initcpu.c index ec77adbea91..97454bc112c 100644 --- a/sys/i386/i386/initcpu.c +++ b/sys/i386/i386/initcpu.c @@ -48,7 +48,6 @@ __FBSDID("$FreeBSD$"); #define CPU_ENABLE_SSE #endif -void initializecpu(void); #if defined(I586_CPU) && defined(CPU_WT_ALLOC) void enable_K5_wt_alloc(void); void enable_K6_wt_alloc(void); diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c index b1757caddb2..40c8c46cab3 100644 --- a/sys/i386/i386/machdep.c +++ b/sys/i386/i386/machdep.c @@ -75,6 +75,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -180,7 +181,6 @@ extern void dblfault_handler(void); extern void printcpuinfo(void); /* XXX header file */ extern void finishidentcpu(void); extern void panicifcpuunsupported(void); -extern void initializecpu(void); #define CS_SECURE(cs) (ISPL(cs) == SEL_UPL) #define EFL_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0) @@ -248,6 +248,8 @@ struct pcpu __pcpu[MAXCPU]; struct mtx icu_lock; +struct mem_range_softc mem_range_softc; + static void cpu_startup(dummy) void *dummy; @@ -337,12 +339,10 @@ cpu_startup(dummy) cpu_setregs(); #endif -#ifdef SMP /* * Add BSP as an interrupt target. */ intr_add_cpu(0); -#endif } /* @@ -472,7 +472,13 @@ osendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) } regs->tf_esp = (int)fp; - regs->tf_eip = PS_STRINGS - szosigcode; + if (p->p_sysent->sv_sigcode_base != 0) { + regs->tf_eip = p->p_sysent->sv_sigcode_base + szsigcode - + szosigcode; + } else { + /* a.out sysentvec does not use shared page */ + regs->tf_eip = p->p_sysent->sv_psstrings - szosigcode; + } regs->tf_eflags &= ~(PSL_T | PSL_D); regs->tf_cs = _ucodesel; regs->tf_ds = _udatasel; @@ -599,7 +605,8 @@ freebsd4_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) } regs->tf_esp = (int)sfp; - regs->tf_eip = PS_STRINGS - szfreebsd4_sigcode; + regs->tf_eip = p->p_sysent->sv_sigcode_base + szsigcode - + szfreebsd4_sigcode; regs->tf_eflags &= ~(PSL_T | PSL_D); regs->tf_cs = _ucodesel; regs->tf_ds = _udatasel; @@ -750,7 +757,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) } regs->tf_esp = (int)sfp; - regs->tf_eip = PS_STRINGS - *(p->p_sysent->sv_szsigcode); + regs->tf_eip = p->p_sysent->sv_sigcode_base; regs->tf_eflags &= ~(PSL_T | PSL_D); regs->tf_cs = _ucodesel; regs->tf_ds = _udatasel; @@ -2178,7 +2185,7 @@ getmemsize(int first) pt_entry_t *pte; quad_t dcons_addr, dcons_size; #ifndef XEN - int hasbrokenint12, i; + int hasbrokenint12, i, res; u_int extmem; struct vm86frame vmf; struct vm86context vmc; @@ -2263,7 +2270,8 @@ getmemsize(int first) pmap_kenter(KERNBASE + (1 << PAGE_SHIFT), 1 << PAGE_SHIFT); vmc.npages = 0; smap = (void *)vm86_addpage(&vmc, 1, KERNBASE + (1 << PAGE_SHIFT)); - vm86_getptr(&vmc, (vm_offset_t)smap, &vmf.vmf_es, &vmf.vmf_di); + res = vm86_getptr(&vmc, (vm_offset_t)smap, &vmf.vmf_es, &vmf.vmf_di); + KASSERT(res != 0, ("vm86_getptr() failed: address not found")); vmf.vmf_ebx = 0; do { diff --git a/sys/i386/i386/mem.c b/sys/i386/i386/mem.c index dbbe242fd4d..9c83f47428f 100644 --- a/sys/i386/i386/mem.c +++ b/sys/i386/i386/mem.c @@ -72,8 +72,6 @@ __FBSDID("$FreeBSD$"); */ MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors"); -struct mem_range_softc mem_range_softc; - static struct sx memsxlock; SX_SYSINIT(memsxlockinit, &memsxlock, "/dev/mem lock"); diff --git a/sys/i386/i386/minidump_machdep.c b/sys/i386/i386/minidump_machdep.c index d57de3ab7c9..e0cd1ff5d31 100644 --- a/sys/i386/i386/minidump_machdep.c +++ b/sys/i386/i386/minidump_machdep.c @@ -36,9 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#ifdef SW_WATCHDOG #include -#endif #include #include #include @@ -143,9 +141,9 @@ blk_write(struct dumperinfo *di, char *ptr, vm_paddr_t pa, size_t sz) printf(" %lld", PG2MB(progress >> PAGE_SHIFT)); counter &= (1<<24) - 1; } -#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); -#endif + if (ptr) { error = dump_write(di, ptr, 0, dumplo, len); if (error) diff --git a/sys/i386/i386/mp_machdep.c b/sys/i386/i386/mp_machdep.c index 0bf6e2246a5..727c05da112 100644 --- a/sys/i386/i386/mp_machdep.c +++ b/sys/i386/i386/mp_machdep.c @@ -146,6 +146,7 @@ void *bootstacks[MAXCPU]; static void *dpcpu; struct pcb stoppcbs[MAXCPU]; +struct pcb **susppcbs = NULL; /* Variables needed for SMP tlb shootdown. */ vm_offset_t smp_tlb_addr1; @@ -587,6 +588,9 @@ cpu_mp_start(void) setidt(IPI_STOP, IDTVEC(cpustop), SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL)); + /* Install an inter-CPU IPI for CPU suspend/resume */ + setidt(IPI_SUSPEND, IDTVEC(cpususpend), + SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL)); /* Set boot_cpu_id if needed. */ if (boot_cpu_id == -1) { @@ -1077,6 +1081,60 @@ start_ap(int apic_id) /* used as a watchpoint to signal AP startup */ cpus = mp_naps; + ipi_startup(apic_id, vector); + + /* Wait up to 5 seconds for it to start. */ + for (ms = 0; ms < 5000; ms++) { + if (mp_naps > cpus) + return 1; /* return SUCCESS */ + DELAY(1000); + } + return 0; /* return FAILURE */ +} + +#ifdef COUNT_XINVLTLB_HITS +u_int xhits_gbl[MAXCPU]; +u_int xhits_pg[MAXCPU]; +u_int xhits_rng[MAXCPU]; +static SYSCTL_NODE(_debug, OID_AUTO, xhits, CTLFLAG_RW, 0, ""); +SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, global, CTLFLAG_RW, &xhits_gbl, + sizeof(xhits_gbl), "IU", ""); +SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, page, CTLFLAG_RW, &xhits_pg, + sizeof(xhits_pg), "IU", ""); +SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, range, CTLFLAG_RW, &xhits_rng, + sizeof(xhits_rng), "IU", ""); + +u_int ipi_global; +u_int ipi_page; +u_int ipi_range; +u_int ipi_range_size; +SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_global, CTLFLAG_RW, &ipi_global, 0, ""); +SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_page, CTLFLAG_RW, &ipi_page, 0, ""); +SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_range, CTLFLAG_RW, &ipi_range, 0, ""); +SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_range_size, CTLFLAG_RW, &ipi_range_size, + 0, ""); + +u_int ipi_masked_global; +u_int ipi_masked_page; +u_int ipi_masked_range; +u_int ipi_masked_range_size; +SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_global, CTLFLAG_RW, + &ipi_masked_global, 0, ""); +SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_page, CTLFLAG_RW, + &ipi_masked_page, 0, ""); +SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_range, CTLFLAG_RW, + &ipi_masked_range, 0, ""); +SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_range_size, CTLFLAG_RW, + &ipi_masked_range_size, 0, ""); +#endif /* COUNT_XINVLTLB_HITS */ + +/* + * Init and startup IPI. + */ +void +ipi_startup(int apic_id, int vector) +{ + /* * first we do an INIT/RESET IPI this INIT IPI might be run, reseting * and running the target CPU. OR this INIT IPI might be latched (P5 @@ -1127,52 +1185,8 @@ start_ap(int apic_id) vector, apic_id); lapic_ipi_wait(-1); DELAY(200); /* wait ~200uS */ - - /* Wait up to 5 seconds for it to start. */ - for (ms = 0; ms < 5000; ms++) { - if (mp_naps > cpus) - return 1; /* return SUCCESS */ - DELAY(1000); - } - return 0; /* return FAILURE */ } -#ifdef COUNT_XINVLTLB_HITS -u_int xhits_gbl[MAXCPU]; -u_int xhits_pg[MAXCPU]; -u_int xhits_rng[MAXCPU]; -static SYSCTL_NODE(_debug, OID_AUTO, xhits, CTLFLAG_RW, 0, ""); -SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, global, CTLFLAG_RW, &xhits_gbl, - sizeof(xhits_gbl), "IU", ""); -SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, page, CTLFLAG_RW, &xhits_pg, - sizeof(xhits_pg), "IU", ""); -SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, range, CTLFLAG_RW, &xhits_rng, - sizeof(xhits_rng), "IU", ""); - -u_int ipi_global; -u_int ipi_page; -u_int ipi_range; -u_int ipi_range_size; -SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_global, CTLFLAG_RW, &ipi_global, 0, ""); -SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_page, CTLFLAG_RW, &ipi_page, 0, ""); -SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_range, CTLFLAG_RW, &ipi_range, 0, ""); -SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_range_size, CTLFLAG_RW, &ipi_range_size, - 0, ""); - -u_int ipi_masked_global; -u_int ipi_masked_page; -u_int ipi_masked_range; -u_int ipi_masked_range_size; -SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_global, CTLFLAG_RW, - &ipi_masked_global, 0, ""); -SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_page, CTLFLAG_RW, - &ipi_masked_page, 0, ""); -SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_range, CTLFLAG_RW, - &ipi_masked_range, 0, ""); -SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_range_size, CTLFLAG_RW, - &ipi_masked_range_size, 0, ""); -#endif /* COUNT_XINVLTLB_HITS */ - /* * Send an IPI to specified CPU handling the bitmap logic. */ @@ -1497,6 +1511,39 @@ cpustop_handler(void) } } +/* + * Handle an IPI_SUSPEND by saving our current context and spinning until we + * are resumed. + */ +void +cpususpend_handler(void) +{ + u_int cpu; + + cpu = PCPU_GET(cpuid); + + if (savectx(susppcbs[cpu])) { + wbinvd(); + CPU_SET_ATOMIC(cpu, &suspended_cpus); + } else { + pmap_init_pat(); + PCPU_SET(switchtime, 0); + PCPU_SET(switchticks, ticks); + + /* Indicate that we are resumed */ + CPU_CLR_ATOMIC(cpu, &suspended_cpus); + } + + /* Wait for resume */ + while (!CPU_ISSET(cpu, &started_cpus)) + ia32_pause(); + + CPU_CLR_ATOMIC(cpu, &started_cpus); + + /* Resume MCA and local APIC */ + mca_resume(); + lapic_setup(0); +} /* * This is called once the rest of the system is up and running and we're * ready to let the AP's out of the pen. diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 89e7a2f820f..2929789d31f 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -118,6 +118,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -230,9 +231,21 @@ SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RDTUN, &pg_ps_enabled, 0, #define PAT_INDEX_SIZE 8 static int pat_index[PAT_INDEX_SIZE]; /* cache mode to PAT index conversion */ +/* + * Isolate the global pv list lock from data and other locks to prevent false + * sharing within the cache. + */ +static struct { + struct rwlock lock; + char padding[CACHE_LINE_SIZE - sizeof(struct rwlock)]; +} pvh_global __aligned(CACHE_LINE_SIZE); + +#define pvh_global_lock pvh_global.lock + /* * Data for the pv entry allocation mechanism */ +static TAILQ_HEAD(pch, pv_chunk) pv_chunks = TAILQ_HEAD_INITIALIZER(pv_chunks); static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0; static struct md_page *pv_table; static int shpgperproc = PMAP_SHPGPERPROC; @@ -283,8 +296,9 @@ SYSCTL_INT(_debug, OID_AUTO, PMAP1unchanged, CTLFLAG_RD, "Number of times pmap_pte_quick didn't change PMAP1"); static struct mtx PMAP2mutex; +static void free_pv_chunk(struct pv_chunk *pc); static void free_pv_entry(pmap_t pmap, pv_entry_t pv); -static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try); +static pv_entry_t get_pv_entry(pmap_t pmap, boolean_t try); static void pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); static boolean_t pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); static void pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); @@ -391,6 +405,12 @@ pmap_bootstrap(vm_paddr_t firstaddr) kernel_pmap->pm_root = NULL; CPU_FILL(&kernel_pmap->pm_active); /* don't allow deactivation */ TAILQ_INIT(&kernel_pmap->pm_pvchunk); + + /* + * Initialize the global pv list lock. + */ + rw_init(&pvh_global_lock, "pmap pv global"); + LIST_INIT(&allpmaps); /* @@ -1275,7 +1295,7 @@ invlcaddr(void *caddr) * scans are across different pmaps. It is very wasteful * to do an entire invltlb for checking a single mapping. * - * If the given pmap is not the current pmap, vm_page_queue_mtx + * If the given pmap is not the current pmap, pvh_global_lock * must be held and curthread pinned to a CPU. */ static pt_entry_t * @@ -1291,7 +1311,7 @@ pmap_pte_quick(pmap_t pmap, vm_offset_t va) /* are we current address space or kernel? */ if (pmap_is_current(pmap)) return (vtopte(va)); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); KASSERT(curthread->td_pinned > 0, ("curthread not pinned")); newpf = *pde & PG_FRAME; if ((*PMAP1 & PG_FRAME) != newpf) { @@ -1840,9 +1860,9 @@ _pmap_allocpte(pmap_t pmap, u_int ptepindex, int flags) VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) { if (flags & M_WAITOK) { PMAP_UNLOCK(pmap); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); VM_WAIT; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); } @@ -2143,6 +2163,7 @@ pmap_growkernel(vm_offset_t addr) CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE); CTASSERT(_NPCM == 11); +CTASSERT(_NPCPV == 336); static __inline struct pv_chunk * pv_to_chunk(pv_entry_t pv) @@ -2156,7 +2177,7 @@ pv_to_chunk(pv_entry_t pv) #define PC_FREE0_9 0xfffffffful /* Free values for index 0 through 9 */ #define PC_FREE10 0x0000fffful /* Free values for index 10 */ -static uint32_t pc_freemask[11] = { +static const uint32_t pc_freemask[_NPCM] = { PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, @@ -2187,71 +2208,144 @@ SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0 "Current number of pv entry allocs"); SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0, "Current number of spare pv entries"); - -static int pmap_collect_inactive, pmap_collect_active; - -SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_inactive, CTLFLAG_RD, &pmap_collect_inactive, 0, - "Current number times pmap_collect called on inactive queue"); -SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_active, CTLFLAG_RD, &pmap_collect_active, 0, - "Current number times pmap_collect called on active queue"); #endif /* * We are in a serious low memory condition. Resort to * drastic measures to free some pages so we can allocate - * another pv entry chunk. This is normally called to - * unmap inactive pages, and if necessary, active pages. + * another pv entry chunk. */ -static void -pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) +static vm_page_t +pmap_pv_reclaim(pmap_t locked_pmap) { + struct pch newtail; + struct pv_chunk *pc; + struct md_page *pvh; pd_entry_t *pde; pmap_t pmap; pt_entry_t *pte, tpte; - pv_entry_t next_pv, pv; + pv_entry_t pv; vm_offset_t va; - vm_page_t m, free; + vm_page_t free, m, m_pc; + uint32_t inuse; + int bit, field, freed; + PMAP_LOCK_ASSERT(locked_pmap, MA_OWNED); + pmap = NULL; + free = m_pc = NULL; + TAILQ_INIT(&newtail); sched_pin(); - TAILQ_FOREACH(m, &vpq->pl, pageq) { - if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy) - continue; - TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) { - va = pv->pv_va; - pmap = PV_PMAP(pv); + while ((pc = TAILQ_FIRST(&pv_chunks)) != NULL && (pv_vafree == 0 || + free == NULL)) { + TAILQ_REMOVE(&pv_chunks, pc, pc_lru); + if (pmap != pc->pc_pmap) { + if (pmap != NULL) { + pmap_invalidate_all(pmap); + if (pmap != locked_pmap) + PMAP_UNLOCK(pmap); + } + pmap = pc->pc_pmap; /* Avoid deadlock and lock recursion. */ if (pmap > locked_pmap) PMAP_LOCK(pmap); - else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap)) + else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap)) { + pmap = NULL; + TAILQ_INSERT_TAIL(&newtail, pc, pc_lru); continue; - pmap->pm_stats.resident_count--; - pde = pmap_pde(pmap, va); - KASSERT((*pde & PG_PS) == 0, ("pmap_collect: found" - " a 4mpage in page %p's pv list", m)); - pte = pmap_pte_quick(pmap, va); - tpte = pte_load_clear(pte); - KASSERT((tpte & PG_W) == 0, - ("pmap_collect: wired pte %#jx", (uintmax_t)tpte)); - if (tpte & PG_A) - vm_page_aflag_set(m, PGA_REFERENCED); - if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) - vm_page_dirty(m); - free = NULL; - pmap_unuse_pt(pmap, va, &free); - pmap_invalidate_page(pmap, va); - pmap_free_zero_pages(free); - TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - free_pv_entry(pmap, pv); - if (pmap != locked_pmap) - PMAP_UNLOCK(pmap); + } } - if (TAILQ_EMPTY(&m->md.pv_list) && - TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list)) - vm_page_aflag_clear(m, PGA_WRITEABLE); - } - sched_unpin(); -} + /* + * Destroy every non-wired, 4 KB page mapping in the chunk. + */ + freed = 0; + for (field = 0; field < _NPCM; field++) { + for (inuse = ~pc->pc_map[field] & pc_freemask[field]; + inuse != 0; inuse &= ~(1UL << bit)) { + bit = bsfl(inuse); + pv = &pc->pc_pventry[field * 32 + bit]; + va = pv->pv_va; + pde = pmap_pde(pmap, va); + if ((*pde & PG_PS) != 0) + continue; + pte = pmap_pte_quick(pmap, va); + if ((*pte & PG_W) != 0) + continue; + tpte = pte_load_clear(pte); + if ((tpte & PG_G) != 0) + pmap_invalidate_page(pmap, va); + m = PHYS_TO_VM_PAGE(tpte & PG_FRAME); + if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) + vm_page_dirty(m); + if ((tpte & PG_A) != 0) + vm_page_aflag_set(m, PGA_REFERENCED); + TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); + if (TAILQ_EMPTY(&m->md.pv_list) && + (m->flags & PG_FICTITIOUS) == 0) { + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + if (TAILQ_EMPTY(&pvh->pv_list)) { + vm_page_aflag_clear(m, + PGA_WRITEABLE); + } + } + pc->pc_map[field] |= 1UL << bit; + pmap_unuse_pt(pmap, va, &free); + freed++; + } + } + if (freed == 0) { + TAILQ_INSERT_TAIL(&newtail, pc, pc_lru); + continue; + } + /* Every freed mapping is for a 4 KB page. */ + pmap->pm_stats.resident_count -= freed; + PV_STAT(pv_entry_frees += freed); + PV_STAT(pv_entry_spare += freed); + pv_entry_count -= freed; + TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); + for (field = 0; field < _NPCM; field++) + if (pc->pc_map[field] != pc_freemask[field]) { + TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, + pc_list); + TAILQ_INSERT_TAIL(&newtail, pc, pc_lru); + + /* + * One freed pv entry in locked_pmap is + * sufficient. + */ + if (pmap == locked_pmap) + goto out; + break; + } + if (field == _NPCM) { + PV_STAT(pv_entry_spare -= _NPCPV); + PV_STAT(pc_chunk_count--); + PV_STAT(pc_chunk_frees++); + /* Entire chunk is free; return it. */ + m_pc = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)pc)); + pmap_qremove((vm_offset_t)pc, 1); + pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc); + break; + } + } +out: + sched_unpin(); + TAILQ_CONCAT(&pv_chunks, &newtail, pc_lru); + if (pmap != NULL) { + pmap_invalidate_all(pmap); + if (pmap != locked_pmap) + PMAP_UNLOCK(pmap); + } + if (m_pc == NULL && pv_vafree != 0 && free != NULL) { + m_pc = free; + free = m_pc->right; + /* Recycle a freed page table page. */ + m_pc->wire_count = 1; + atomic_add_int(&cnt.v_wire_count, 1); + } + pmap_free_zero_pages(free); + return (m_pc); +} /* * free the pv_entry back to the free list @@ -2259,11 +2353,10 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) static void free_pv_entry(pmap_t pmap, pv_entry_t pv) { - vm_page_t m; struct pv_chunk *pc; int idx, field, bit; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); PV_STAT(pv_entry_frees++); PV_STAT(pv_entry_spare++); @@ -2273,13 +2366,30 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv) field = idx / 32; bit = idx % 32; pc->pc_map[field] |= 1ul << bit; - /* move to head of list */ - TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); for (idx = 0; idx < _NPCM; idx++) if (pc->pc_map[idx] != pc_freemask[idx]) { - TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list); + /* + * 98% of the time, pc is already at the head of the + * list. If it isn't already, move it to the head. + */ + if (__predict_false(TAILQ_FIRST(&pmap->pm_pvchunk) != + pc)) { + TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); + TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, + pc_list); + } return; } + TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); + free_pv_chunk(pc); +} + +static void +free_pv_chunk(struct pv_chunk *pc) +{ + vm_page_t m; + + TAILQ_REMOVE(&pv_chunks, pc, pc_lru); PV_STAT(pv_entry_spare -= _NPCPV); PV_STAT(pc_chunk_count--); PV_STAT(pc_chunk_frees++); @@ -2296,18 +2406,17 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv) * when needed. */ static pv_entry_t -get_pv_entry(pmap_t pmap, int try) +get_pv_entry(pmap_t pmap, boolean_t try) { static const struct timeval printinterval = { 60, 0 }; static struct timeval lastprint; - struct vpgqueues *pq; int bit, field; pv_entry_t pv; struct pv_chunk *pc; vm_page_t m; + rw_assert(&pvh_global_lock, RA_WLOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); PV_STAT(pv_entry_allocs++); pv_entry_count++; if (pv_entry_count > pv_entry_high_water) @@ -2315,7 +2424,6 @@ get_pv_entry(pmap_t pmap, int try) printf("Approaching the limit on PV entries, consider " "increasing either the vm.pmap.shpgperproc or the " "vm.pmap.pv_entry_max tunable.\n"); - pq = NULL; retry: pc = TAILQ_FIRST(&pmap->pm_pvchunk); if (pc != NULL) { @@ -2341,33 +2449,20 @@ retry: } } /* - * Access to the ptelist "pv_vafree" is synchronized by the page - * queues lock. If "pv_vafree" is currently non-empty, it will + * Access to the ptelist "pv_vafree" is synchronized by the pvh + * global lock. If "pv_vafree" is currently non-empty, it will * remain non-empty until pmap_ptelist_alloc() completes. */ - if (pv_vafree == 0 || (m = vm_page_alloc(NULL, 0, (pq == - &vm_page_queues[PQ_ACTIVE] ? VM_ALLOC_SYSTEM : VM_ALLOC_NORMAL) | + if (pv_vafree == 0 || (m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED)) == NULL) { if (try) { pv_entry_count--; PV_STAT(pc_chunk_tryfail++); return (NULL); } - /* - * Reclaim pv entries: At first, destroy mappings to - * inactive pages. After that, if a pv chunk entry - * is still needed, destroy mappings to active pages. - */ - if (pq == NULL) { - PV_STAT(pmap_collect_inactive++); - pq = &vm_page_queues[PQ_INACTIVE]; - } else if (pq == &vm_page_queues[PQ_INACTIVE]) { - PV_STAT(pmap_collect_active++); - pq = &vm_page_queues[PQ_ACTIVE]; - } else - panic("get_pv_entry: increase vm.pmap.shpgperproc"); - pmap_collect(pmap, pq); - goto retry; + m = pmap_pv_reclaim(pmap); + if (m == NULL) + goto retry; } PV_STAT(pc_chunk_count++); PV_STAT(pc_chunk_allocs++); @@ -2377,6 +2472,7 @@ retry: pc->pc_map[0] = pc_freemask[0] & ~1ul; /* preallocated bit 0 */ for (field = 1; field < _NPCM; field++) pc->pc_map[field] = pc_freemask[field]; + TAILQ_INSERT_TAIL(&pv_chunks, pc, pc_lru); pv = &pc->pc_pventry[0]; TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list); PV_STAT(pv_entry_spare += _NPCPV - 1); @@ -2388,7 +2484,7 @@ pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va) { pv_entry_t pv; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) { if (pmap == PV_PMAP(pv) && va == pv->pv_va) { TAILQ_REMOVE(&pvh->pv_list, pv, pv_list); @@ -2406,7 +2502,7 @@ pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) vm_offset_t va_last; vm_page_t m; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); KASSERT((pa & PDRMASK) == 0, ("pmap_pv_demote_pde: pa is not 4mpage aligned")); @@ -2439,7 +2535,7 @@ pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) vm_offset_t va_last; vm_page_t m; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); KASSERT((pa & PDRMASK) == 0, ("pmap_pv_promote_pde: pa is not 4mpage aligned")); @@ -2480,7 +2576,7 @@ pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) { struct md_page *pvh; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); pmap_pvh_free(&m->md, pmap, va); if (TAILQ_EMPTY(&m->md.pv_list) && (m->flags & PG_FICTITIOUS) == 0) { pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); @@ -2498,8 +2594,8 @@ pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m) { pv_entry_t pv; + rw_assert(&pvh_global_lock, RA_WLOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); pv = get_pv_entry(pmap, FALSE); pv->pv_va = va; TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); @@ -2513,8 +2609,8 @@ pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m) { pv_entry_t pv; + rw_assert(&pvh_global_lock, RA_WLOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); if (pv_entry_count < pv_entry_high_water && (pv = get_pv_entry(pmap, TRUE)) != NULL) { pv->pv_va = va; @@ -2533,7 +2629,7 @@ pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) struct md_page *pvh; pv_entry_t pv; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); if (pv_entry_count < pv_entry_high_water && (pv = get_pv_entry(pmap, TRUE)) != NULL) { pv->pv_va = va; @@ -2611,7 +2707,7 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) */ if (va >= KERNBASE) firstpte = &KPTmap[i386_btop(trunc_4mpage(va))]; - else if (curthread->td_pinned > 0 && mtx_owned(&vm_page_queue_mtx)) { + else if (curthread->td_pinned > 0 && rw_wowned(&pvh_global_lock)) { if ((*PMAP1 & PG_FRAME) != mptepa) { *PMAP1 = mptepa | PG_RW | PG_V | PG_A | PG_M; #ifdef SMP @@ -2770,7 +2866,7 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, vm_page_t *free) pt_entry_t oldpte; vm_page_t m; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); oldpte = pte_load_clear(ptq); if (oldpte & PG_W) @@ -2801,7 +2897,7 @@ pmap_remove_page(pmap_t pmap, vm_offset_t va, vm_page_t *free) { pt_entry_t *pte; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); KASSERT(curthread->td_pinned > 0, ("curthread not pinned")); PMAP_LOCK_ASSERT(pmap, MA_OWNED); if ((pte = pmap_pte_quick(pmap, va)) == NULL || *pte == 0) @@ -2833,7 +2929,7 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) anyvalid = 0; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); sched_pin(); PMAP_LOCK(pmap); @@ -2922,7 +3018,7 @@ out: sched_unpin(); if (anyvalid) pmap_invalidate_all(pmap); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pmap); pmap_free_zero_pages(free); } @@ -2954,7 +3050,7 @@ pmap_remove_all(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_all: page %p is not managed", m)); free = NULL; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); sched_pin(); if ((m->flags & PG_FICTITIOUS) != 0) goto small_mappings; @@ -2995,7 +3091,7 @@ small_mappings: } vm_page_aflag_clear(m, PGA_WRITEABLE); sched_unpin(); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); pmap_free_zero_pages(free); } @@ -3050,7 +3146,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) vm_offset_t pdnxt; pd_entry_t ptpaddr; pt_entry_t *pte; - int anychanged; + boolean_t anychanged, pv_lists_locked; if ((prot & VM_PROT_READ) == VM_PROT_NONE) { pmap_remove(pmap, sva, eva); @@ -3066,10 +3162,16 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) return; #endif - anychanged = 0; + if (pmap_is_current(pmap)) + pv_lists_locked = FALSE; + else { + pv_lists_locked = TRUE; +resume: + rw_wlock(&pvh_global_lock); + sched_pin(); + } + anychanged = FALSE; - vm_page_lock_queues(); - sched_pin(); PMAP_LOCK(pmap); for (; sva < eva; sva = pdnxt) { pt_entry_t obits, pbits; @@ -3104,12 +3206,27 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) */ if (pmap_protect_pde(pmap, &pmap->pm_pdir[pdirindex], sva, prot)) - anychanged = 1; - continue; - } else if (!pmap_demote_pde(pmap, - &pmap->pm_pdir[pdirindex], sva)) { - /* The large page mapping was destroyed. */ + anychanged = TRUE; continue; + } else { + if (!pv_lists_locked) { + pv_lists_locked = TRUE; + if (!rw_try_wlock(&pvh_global_lock)) { + if (anychanged) + pmap_invalidate_all( + pmap); + PMAP_UNLOCK(pmap); + goto resume; + } + } + if (!pmap_demote_pde(pmap, + &pmap->pm_pdir[pdirindex], sva)) { + /* + * The large page mapping was + * destroyed. + */ + continue; + } } } @@ -3155,14 +3272,16 @@ retry: if (obits & PG_G) pmap_invalidate_page(pmap, sva); else - anychanged = 1; + anychanged = TRUE; } } } - sched_unpin(); if (anychanged) pmap_invalidate_all(pmap); - vm_page_unlock_queues(); + if (pv_lists_locked) { + sched_unpin(); + rw_wunlock(&pvh_global_lock); + } PMAP_UNLOCK(pmap); } @@ -3332,7 +3451,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, mpte = NULL; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); sched_pin(); @@ -3502,7 +3621,7 @@ validate: pmap_promote_pde(pmap, pde, va); sched_unpin(); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -3517,7 +3636,7 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) { pd_entry_t *pde, newpde; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); pde = pmap_pde(pmap, va); if (*pde != 0) { @@ -3586,7 +3705,7 @@ pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, psize = atop(end - start); mpte = NULL; m = m_start; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { va = start + ptoa(diff); @@ -3600,7 +3719,7 @@ pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, mpte); m = TAILQ_NEXT(m, listq); } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -3617,10 +3736,10 @@ void pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) { - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); (void)pmap_enter_quick_locked(pmap, va, m, prot, NULL); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -3635,7 +3754,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva || (m->oflags & VPO_UNMANAGED) != 0, ("pmap_enter_quick_locked: managed mapping within the clean submap")); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); /* @@ -3841,9 +3960,9 @@ retry: if (!wired != ((*pde & PG_W) == 0)) { if (!are_queues_locked) { are_queues_locked = TRUE; - if (!mtx_trylock(&vm_page_queue_mtx)) { + if (!rw_try_wlock(&pvh_global_lock)) { PMAP_UNLOCK(pmap); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); goto retry; } } @@ -3867,7 +3986,7 @@ retry: pmap_pte_release(pte); out: if (are_queues_locked) - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -3896,7 +4015,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len, if (!pmap_is_current(src_pmap)) return; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); if (dst_pmap < src_pmap) { PMAP_LOCK(dst_pmap); PMAP_LOCK(src_pmap); @@ -3986,7 +4105,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len, } out: sched_unpin(); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(src_pmap); PMAP_UNLOCK(dst_pmap); } @@ -4128,7 +4247,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_page_exists_quick: page %p is not managed", m)); rv = FALSE; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { if (PV_PMAP(pv) == pmap) { rv = TRUE; @@ -4150,7 +4269,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) break; } } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (rv); } @@ -4168,13 +4287,13 @@ pmap_page_wired_mappings(vm_page_t m) count = 0; if ((m->oflags & VPO_UNMANAGED) != 0) return (count); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); count = pmap_pvh_wired_mappings(&m->md, count); if ((m->flags & PG_FICTITIOUS) == 0) { count = pmap_pvh_wired_mappings(pa_to_pvh(VM_PAGE_TO_PHYS(m)), count); } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (count); } @@ -4190,7 +4309,7 @@ pmap_pvh_wired_mappings(struct md_page *pvh, int count) pt_entry_t *pte; pv_entry_t pv; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); sched_pin(); TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) { pmap = PV_PMAP(pv); @@ -4215,11 +4334,11 @@ pmap_page_is_mapped(vm_page_t m) if ((m->oflags & VPO_UNMANAGED) != 0) return (FALSE); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); rv = !TAILQ_EMPTY(&m->md.pv_list) || ((m->flags & PG_FICTITIOUS) == 0 && !TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list)); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (rv); } @@ -4249,13 +4368,13 @@ pmap_remove_pages(pmap_t pmap) printf("warning: pmap_remove_pages called with non-current pmap\n"); return; } - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); sched_pin(); TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) { allfree = 1; for (field = 0; field < _NPCM; field++) { - inuse = (~(pc->pc_map[field])) & pc_freemask[field]; + inuse = ~pc->pc_map[field] & pc_freemask[field]; while (inuse != 0) { bit = bsfl(inuse); bitmask = 1UL << bit; @@ -4347,20 +4466,13 @@ pmap_remove_pages(pmap_t pmap) } } if (allfree) { - PV_STAT(pv_entry_spare -= _NPCPV); - PV_STAT(pc_chunk_count--); - PV_STAT(pc_chunk_frees++); TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); - m = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)pc)); - pmap_qremove((vm_offset_t)pc, 1); - vm_page_unwire(m, 0); - vm_page_free(m); - pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc); + free_pv_chunk(pc); } } sched_unpin(); pmap_invalidate_all(pmap); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pmap); pmap_free_zero_pages(free); } @@ -4388,11 +4500,11 @@ pmap_is_modified(vm_page_t m) if ((m->oflags & VPO_BUSY) == 0 && (m->aflags & PGA_WRITEABLE) == 0) return (FALSE); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); rv = pmap_is_modified_pvh(&m->md) || ((m->flags & PG_FICTITIOUS) == 0 && pmap_is_modified_pvh(pa_to_pvh(VM_PAGE_TO_PHYS(m)))); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (rv); } @@ -4409,7 +4521,7 @@ pmap_is_modified_pvh(struct md_page *pvh) pmap_t pmap; boolean_t rv; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); rv = FALSE; sched_pin(); TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) { @@ -4462,11 +4574,11 @@ pmap_is_referenced(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_referenced: page %p is not managed", m)); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); rv = pmap_is_referenced_pvh(&m->md) || ((m->flags & PG_FICTITIOUS) == 0 && pmap_is_referenced_pvh(pa_to_pvh(VM_PAGE_TO_PHYS(m)))); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (rv); } @@ -4482,7 +4594,7 @@ pmap_is_referenced_pvh(struct md_page *pvh) pmap_t pmap; boolean_t rv; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); rv = FALSE; sched_pin(); TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) { @@ -4523,7 +4635,7 @@ pmap_remove_write(vm_page_t m) if ((m->oflags & VPO_BUSY) == 0 && (m->aflags & PGA_WRITEABLE) == 0) return; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); sched_pin(); if ((m->flags & PG_FICTITIOUS) != 0) goto small_mappings; @@ -4564,7 +4676,7 @@ retry: } vm_page_aflag_clear(m, PGA_WRITEABLE); sched_unpin(); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* @@ -4593,7 +4705,7 @@ pmap_ts_referenced(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_ts_referenced: page %p is not managed", m)); pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); sched_pin(); if ((m->flags & PG_FICTITIOUS) != 0) goto small_mappings; @@ -4652,7 +4764,7 @@ small_mappings: } out: sched_unpin(); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (rtval); } @@ -4682,7 +4794,7 @@ pmap_clear_modify(vm_page_t m) */ if ((m->aflags & PGA_WRITEABLE) == 0) return; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); sched_pin(); if ((m->flags & PG_FICTITIOUS) != 0) goto small_mappings; @@ -4743,7 +4855,7 @@ small_mappings: PMAP_UNLOCK(pmap); } sched_unpin(); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* @@ -4763,7 +4875,7 @@ pmap_clear_reference(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_reference: page %p is not managed", m)); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); sched_pin(); if ((m->flags & PG_FICTITIOUS) != 0) goto small_mappings; @@ -4810,7 +4922,7 @@ small_mappings: PMAP_UNLOCK(pmap); } sched_unpin(); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* diff --git a/sys/i386/i386/swtch.s b/sys/i386/i386/swtch.s index 680b032557c..80aa6c418e6 100644 --- a/sys/i386/i386/swtch.s +++ b/sys/i386/i386/swtch.s @@ -386,6 +386,36 @@ ENTRY(savectx) pushfl popl PCB_PSL(%ecx) + movl %cr0,%eax + movl %eax,PCB_CR0(%ecx) + movl %cr2,%eax + movl %eax,PCB_CR2(%ecx) + movl %cr4,%eax + movl %eax,PCB_CR4(%ecx) + + movl %dr0,%eax + movl %eax,PCB_DR0(%ecx) + movl %dr1,%eax + movl %eax,PCB_DR1(%ecx) + movl %dr2,%eax + movl %eax,PCB_DR2(%ecx) + movl %dr3,%eax + movl %eax,PCB_DR3(%ecx) + movl %dr6,%eax + movl %eax,PCB_DR6(%ecx) + movl %dr7,%eax + movl %eax,PCB_DR7(%ecx) + + mov %ds,PCB_DS(%ecx) + mov %es,PCB_ES(%ecx) + mov %fs,PCB_FS(%ecx) + mov %ss,PCB_SS(%ecx) + + sgdt PCB_GDT(%ecx) + sidt PCB_IDT(%ecx) + sldt PCB_LDT(%ecx) + str PCB_TR(%ecx) + #ifdef DEV_NPX /* * If fpcurthread == NULL, then the npx h/w state is irrelevant and the @@ -425,5 +455,84 @@ ENTRY(savectx) popfl #endif /* DEV_NPX */ + movl $1,%eax ret END(savectx) + +/* + * resumectx(pcb) __fastcall + * Resuming processor state from pcb. + */ +ENTRY(resumectx) + /* Restore GDT. */ + lgdt PCB_GDT(%ecx) + + /* Restore segment registers */ + movzwl PCB_DS(%ecx),%eax + mov %ax,%ds + movzwl PCB_ES(%ecx),%eax + mov %ax,%es + movzwl PCB_FS(%ecx),%eax + mov %ax,%fs + movzwl PCB_GS(%ecx),%eax + movw %ax,%gs + movzwl PCB_SS(%ecx),%eax + mov %ax,%ss + + /* Restore CR2, CR4, CR3 and CR0 */ + movl PCB_CR2(%ecx),%eax + movl %eax,%cr2 + movl PCB_CR4(%ecx),%eax + movl %eax,%cr4 + movl PCB_CR3(%ecx),%eax + movl %eax,%cr3 + movl PCB_CR0(%ecx),%eax + movl %eax,%cr0 + jmp 1f +1: + + /* Restore descriptor tables */ + lidt PCB_IDT(%ecx) + lldt PCB_LDT(%ecx) + +#define SDT_SYS386TSS 9 +#define SDT_SYS386BSY 11 + /* Clear "task busy" bit and reload TR */ + movl PCPU(TSS_GDT),%eax + andb $(~SDT_SYS386BSY | SDT_SYS386TSS),5(%eax) + movzwl PCB_TR(%ecx),%eax + ltr %ax +#undef SDT_SYS386TSS +#undef SDT_SYS386BSY + + /* Restore debug registers */ + movl PCB_DR0(%ecx),%eax + movl %eax,%dr0 + movl PCB_DR1(%ecx),%eax + movl %eax,%dr1 + movl PCB_DR2(%ecx),%eax + movl %eax,%dr2 + movl PCB_DR3(%ecx),%eax + movl %eax,%dr3 + movl PCB_DR6(%ecx),%eax + movl %eax,%dr6 + movl PCB_DR7(%ecx),%eax + movl %eax,%dr7 + +#ifdef DEV_NPX + /* XXX FIX ME */ +#endif + + /* Restore other registers */ + movl PCB_EDI(%ecx),%edi + movl PCB_ESI(%ecx),%esi + movl PCB_EBP(%ecx),%ebp + movl PCB_ESP(%ecx),%esp + movl PCB_EBX(%ecx),%ebx + + /* reload code selector by turning return into intersegmental return */ + pushl PCB_EIP(%ecx) + movl $KCSEL,4(%esp) + xorl %eax,%eax + lret +END(resumectx) diff --git a/sys/i386/i386/vm86.c b/sys/i386/i386/vm86.c index 62968c50482..1aaf31a2932 100644 --- a/sys/i386/i386/vm86.c +++ b/sys/i386/i386/vm86.c @@ -650,7 +650,6 @@ vm86_getptr(vmc, kva, sel, off) return (1); } return (0); - panic("vm86_getptr: address not found"); } int diff --git a/sys/i386/include/apicvar.h b/sys/i386/include/apicvar.h index a12e36a4057..a0e622e8785 100644 --- a/sys/i386/include/apicvar.h +++ b/sys/i386/include/apicvar.h @@ -126,7 +126,8 @@ #define IPI_IS_BITMAPED(x) ((x) <= IPI_BITMAP_LAST) #define IPI_STOP (APIC_IPI_INTS + 7) /* Stop CPU until restarted. */ -#define IPI_STOP_HARD (APIC_IPI_INTS + 8) /* Stop CPU with a NMI. */ +#define IPI_SUSPEND (APIC_IPI_INTS + 8) /* Suspend CPU until restarted. */ +#define IPI_STOP_HARD (APIC_IPI_INTS + 9) /* Stop CPU with a NMI. */ /* * The spurious interrupt can share the priority class with the IPIs since diff --git a/sys/i386/include/atomic.h b/sys/i386/include/atomic.h index 9cb96d29f10..6ef59622649 100644 --- a/sys/i386/include/atomic.h +++ b/sys/i386/include/atomic.h @@ -32,9 +32,9 @@ #error this file needs sys/cdefs.h as a prerequisite #endif -#define mb() __asm __volatile("lock; addl $0,(%%esp)" : : : "memory") -#define wmb() __asm __volatile("lock; addl $0,(%%esp)" : : : "memory") -#define rmb() __asm __volatile("lock; addl $0,(%%esp)" : : : "memory") +#define mb() __asm __volatile("lock; addl $0,(%%esp)" : : : "memory", "cc") +#define wmb() __asm __volatile("lock; addl $0,(%%esp)" : : : "memory", "cc") +#define rmb() __asm __volatile("lock; addl $0,(%%esp)" : : : "memory", "cc") /* * Various simple operations on memory, each of which is atomic in the @@ -79,8 +79,9 @@ void atomic_##NAME##_barr_##TYPE(volatile u_##TYPE *p, u_##TYPE v) int atomic_cmpset_int(volatile u_int *dst, u_int expect, u_int src); u_int atomic_fetchadd_int(volatile u_int *p, u_int v); -#define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \ -u_##TYPE atomic_load_acq_##TYPE(volatile u_##TYPE *p); \ +#define ATOMIC_LOAD(TYPE, LOP) \ +u_##TYPE atomic_load_acq_##TYPE(volatile u_##TYPE *p) +#define ATOMIC_STORE(TYPE) \ void atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v) #else /* !KLD_MODULE && __GNUCLIKE_ASM */ @@ -280,16 +281,29 @@ atomic_fetchadd_int(volatile u_int *p, u_int v) return (v); } +/* + * We assume that a = b will do atomic loads and stores. Due to the + * IA32 memory model, a simple store guarantees release semantics. + * + * However, loads may pass stores, so for atomic_load_acq we have to + * ensure a Store/Load barrier to do the load in SMP kernels. We use + * "lock cmpxchg" as recommended by the AMD Software Optimization + * Guide, and not mfence. For UP kernels, however, the cache of the + * single processor is always consistent, so we only need to take care + * of the compiler. + */ +#define ATOMIC_STORE(TYPE) \ +static __inline void \ +atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ +{ \ + __asm __volatile("" : : : "memory"); \ + *p = v; \ +} \ +struct __hack + #if defined(_KERNEL) && !defined(SMP) -/* - * We assume that a = b will do atomic loads and stores. However, on a - * PentiumPro or higher, reads may pass writes, so for that case we have - * to use a serializing instruction (i.e. with LOCK) to do the load in - * SMP kernels. For UP kernels, however, the cache of the single processor - * is always consistent, so we only need to take care of compiler. - */ -#define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \ +#define ATOMIC_LOAD(TYPE, LOP) \ static __inline u_##TYPE \ atomic_load_acq_##TYPE(volatile u_##TYPE *p) \ { \ @@ -298,19 +312,12 @@ atomic_load_acq_##TYPE(volatile u_##TYPE *p) \ tmp = *p; \ __asm __volatile("" : : : "memory"); \ return (tmp); \ -} \ - \ -static __inline void \ -atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ -{ \ - __asm __volatile("" : : : "memory"); \ - *p = v; \ } \ struct __hack #else /* !(_KERNEL && !SMP) */ -#define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \ +#define ATOMIC_LOAD(TYPE, LOP) \ static __inline u_##TYPE \ atomic_load_acq_##TYPE(volatile u_##TYPE *p) \ { \ @@ -323,19 +330,6 @@ atomic_load_acq_##TYPE(volatile u_##TYPE *p) \ : "memory", "cc"); \ \ return (res); \ -} \ - \ -/* \ - * The XCHG instruction asserts LOCK automagically. \ - */ \ -static __inline void \ -atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ -{ \ - __asm __volatile(SOP \ - : "=m" (*p), /* 0 */ \ - "+r" (v) /* 1 */ \ - : "m" (*p) /* 2 */ \ - : "memory"); \ } \ struct __hack @@ -363,13 +357,19 @@ ATOMIC_ASM(clear, long, "andl %1,%0", "ir", ~v); ATOMIC_ASM(add, long, "addl %1,%0", "ir", v); ATOMIC_ASM(subtract, long, "subl %1,%0", "ir", v); -ATOMIC_STORE_LOAD(char, "cmpxchgb %b0,%1", "xchgb %b1,%0"); -ATOMIC_STORE_LOAD(short,"cmpxchgw %w0,%1", "xchgw %w1,%0"); -ATOMIC_STORE_LOAD(int, "cmpxchgl %0,%1", "xchgl %1,%0"); -ATOMIC_STORE_LOAD(long, "cmpxchgl %0,%1", "xchgl %1,%0"); +ATOMIC_LOAD(char, "cmpxchgb %b0,%1"); +ATOMIC_LOAD(short, "cmpxchgw %w0,%1"); +ATOMIC_LOAD(int, "cmpxchgl %0,%1"); +ATOMIC_LOAD(long, "cmpxchgl %0,%1"); + +ATOMIC_STORE(char); +ATOMIC_STORE(short); +ATOMIC_STORE(int); +ATOMIC_STORE(long); #undef ATOMIC_ASM -#undef ATOMIC_STORE_LOAD +#undef ATOMIC_LOAD +#undef ATOMIC_STORE #ifndef WANT_FUNCTIONS diff --git a/sys/i386/include/bootinfo.h b/sys/i386/include/bootinfo.h index 9c36e282712..ef595d5f52b 100644 --- a/sys/i386/include/bootinfo.h +++ b/sys/i386/include/bootinfo.h @@ -65,13 +65,13 @@ struct bootinfo { u_int32_t bi_kernend; /* end of kernel space */ u_int32_t bi_envp; /* environment */ u_int32_t bi_modulep; /* preloaded modules */ + uint32_t bi_memdesc_version; /* EFI memory desc version */ + uint64_t bi_memdesc_size; /* sizeof EFI memory desc */ + uint64_t bi_memmap; /* pa of EFI memory map */ + uint64_t bi_memmap_size; /* size of EFI memory map */ uint64_t bi_hcdp; /* DIG64 HCDP table */ uint64_t bi_fpswa; /* FPSWA interface */ uint64_t bi_systab; /* pa of EFI system table */ - uint64_t bi_memmap; /* pa of EFI memory map */ - uint64_t bi_memmap_size; /* size of EFI memory map */ - uint64_t bi_memdesc_size; /* sizeof EFI memory desc */ - uint32_t bi_memdesc_version; /* EFI memory desc version */ }; #ifdef _KERNEL diff --git a/sys/i386/include/cpufunc.h b/sys/i386/include/cpufunc.h index 7116f76b4a9..62d268d39d5 100644 --- a/sys/i386/include/cpufunc.h +++ b/sys/i386/include/cpufunc.h @@ -96,6 +96,13 @@ clflush(u_long addr) __asm __volatile("clflush %0" : : "m" (*(char *)addr)); } +static __inline void +clts(void) +{ + + __asm __volatile("clts"); +} + static __inline void disable_intr(void) { @@ -688,6 +695,9 @@ intr_restore(register_t eflags) int breakpoint(void); u_int bsfl(u_int mask); u_int bsrl(u_int mask); +void clflush(u_long addr); +void clts(void); +void cpuid_count(u_int ax, u_int cx, u_int *p); void disable_intr(void); void do_cpuid(u_int ax, u_int *p); void enable_intr(void); diff --git a/sys/i386/include/elf.h b/sys/i386/include/elf.h index 94278118f32..93fa1fd8f5a 100644 --- a/sys/i386/include/elf.h +++ b/sys/i386/include/elf.h @@ -96,6 +96,7 @@ __ElfType(Auxinfo); #define AT_NCPUS 19 /* Number of CPUs. */ #define AT_PAGESIZES 20 /* Pagesizes. */ #define AT_PAGESIZESLEN 21 /* Number of pagesizes. */ +#define AT_TIMEKEEP 22 /* Pointer to timehands. */ #define AT_STACKPROT 23 /* Initial stack protection. */ #define AT_COUNT 24 /* Count of defined aux entry types. */ diff --git a/sys/i386/include/in_cksum.h b/sys/i386/include/in_cksum.h index c692f69abe5..34d85be25a1 100644 --- a/sys/i386/include/in_cksum.h +++ b/sys/i386/include/in_cksum.h @@ -54,6 +54,7 @@ * therefore always exactly five 32-bit words. */ #if defined(__GNUCLIKE_ASM) && !defined(__INTEL_COMPILER) +#if defined(IPVERSION) && (IPVERSION == 4) static __inline u_int in_cksum_hdr(const struct ip *ip) { @@ -88,6 +89,7 @@ in_cksum_update(struct ip *ip) __tmpsum = (int)ntohs(ip->ip_sum) + 256; ip->ip_sum = htons(__tmpsum + (__tmpsum >> 16)); } +#endif static __inline u_short in_addword(u_short sum, u_short b) @@ -121,6 +123,7 @@ in_pseudo(u_int sum, u_int b, u_int c) } #else +#if defined(IPVERSION) && (IPVERSION == 4) #define in_cksum_update(ip) \ do { \ int __tmpsum; \ @@ -129,10 +132,13 @@ in_pseudo(u_int sum, u_int b, u_int c) } while(0) #endif +#endif #ifdef _KERNEL #if !defined(__GNUCLIKE_ASM) || defined(__INTEL_COMPILER) +#if defined(IPVERSION) && (IPVERSION == 4) u_int in_cksum_hdr(const struct ip *ip); +#endif u_short in_addword(u_short sum, u_short b); u_short in_pseudo(u_int sum, u_int b, u_int c); #endif diff --git a/sys/i386/include/intr_machdep.h b/sys/i386/include/intr_machdep.h index 004ed52e60c..b5ba3c13790 100644 --- a/sys/i386/include/intr_machdep.h +++ b/sys/i386/include/intr_machdep.h @@ -131,9 +131,7 @@ int elcr_probe(void); enum intr_trigger elcr_read_trigger(u_int irq); void elcr_resume(void); void elcr_write_trigger(u_int irq, enum intr_trigger trigger); -#ifdef SMP void intr_add_cpu(u_int cpu); -#endif int intr_add_handler(const char *name, int vector, driver_filter_t filter, driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep); #ifdef SMP diff --git a/sys/i386/include/md_var.h b/sys/i386/include/md_var.h index 168ee6298f4..3563e6ce7a7 100644 --- a/sys/i386/include/md_var.h +++ b/sys/i386/include/md_var.h @@ -91,6 +91,7 @@ void doreti_popl_fs(void) __asm(__STRING(doreti_popl_fs)); void doreti_popl_fs_fault(void) __asm(__STRING(doreti_popl_fs_fault)); void dump_add_page(vm_paddr_t); void dump_drop_page(vm_paddr_t); +void initializecpu(void); void enable_sse(void); void fillw(int /*u_short*/ pat, void *base, size_t cnt); void i686_pagezero(void *addr); diff --git a/sys/i386/include/pcb.h b/sys/i386/include/pcb.h index 1311ab1ed21..9cefed17688 100644 --- a/sys/i386/include/pcb.h +++ b/sys/i386/include/pcb.h @@ -45,7 +45,10 @@ #include struct pcb { + int pcb_cr0; + int pcb_cr2; int pcb_cr3; + int pcb_cr4; int pcb_edi; int pcb_esi; int pcb_ebp; @@ -71,20 +74,30 @@ struct pcb { #define PCB_KERNNPX 0x40 /* kernel uses npx */ caddr_t pcb_onfault; /* copyin/out fault recovery */ + int pcb_ds; + int pcb_es; + int pcb_fs; int pcb_gs; + int pcb_ss; struct segment_descriptor pcb_fsd; struct segment_descriptor pcb_gsd; struct pcb_ext *pcb_ext; /* optional pcb extension */ int pcb_psl; /* process status long */ u_long pcb_vm86[2]; /* vm86bios scratch space */ union savefpu *pcb_save; + + struct region_descriptor pcb_gdt; + struct region_descriptor pcb_idt; + uint16_t pcb_ldt; + uint16_t pcb_tr; }; #ifdef _KERNEL struct trapframe; void makectx(struct trapframe *, struct pcb *); -void savectx(struct pcb *); +int savectx(struct pcb *) __returns_twice; +void resumectx(struct pcb *) __fastcall; #endif #endif /* _I386_PCB_H_ */ diff --git a/sys/i386/include/pmap.h b/sys/i386/include/pmap.h index 3012a000ae5..7a827f8b994 100644 --- a/sys/i386/include/pmap.h +++ b/sys/i386/include/pmap.h @@ -481,7 +481,7 @@ struct pv_chunk { pmap_t pc_pmap; TAILQ_ENTRY(pv_chunk) pc_list; uint32_t pc_map[_NPCM]; /* bitmap; 1 = free */ - uint32_t pc_spare[2]; + TAILQ_ENTRY(pv_chunk) pc_lru; struct pv_entry pc_pventry[_NPCPV]; }; @@ -498,6 +498,7 @@ extern vm_offset_t virtual_avail; extern vm_offset_t virtual_end; #define pmap_page_get_memattr(m) ((vm_memattr_t)(m)->md.pat_mode) +#define pmap_page_is_write_mapped(m) (((m)->aflags & PGA_WRITEABLE) != 0) #define pmap_unmapbios(va, sz) pmap_unmapdev((va), (sz)) /* diff --git a/sys/i386/include/smp.h b/sys/i386/include/smp.h index 04d67c9f2f2..7c11820ddc6 100644 --- a/sys/i386/include/smp.h +++ b/sys/i386/include/smp.h @@ -53,13 +53,18 @@ inthand_t IDTVEC(invlcache), /* Write back and invalidate cache */ IDTVEC(ipi_intr_bitmap_handler), /* Bitmap based IPIs */ IDTVEC(cpustop), /* CPU stops & waits to be restarted */ + IDTVEC(cpususpend), /* CPU suspends & waits to be resumed */ IDTVEC(rendezvous), /* handle CPU rendezvous */ IDTVEC(lazypmap); /* handle lazy pmap release */ /* functions in mp_machdep.c */ void cpu_add(u_int apic_id, char boot_cpu); void cpustop_handler(void); +#ifndef XEN +void cpususpend_handler(void); +#endif void init_secondary(void); +void ipi_startup(int apic_id, int vector); void ipi_all_but_self(u_int ipi); #ifndef XEN void ipi_bitmap_handler(struct trapframe frame); diff --git a/sys/i386/include/vdso.h b/sys/i386/include/vdso.h new file mode 100644 index 00000000000..b81c455a92a --- /dev/null +++ b/sys/i386/include/vdso.h @@ -0,0 +1,6 @@ +/*- + * This file is in the public domain. + */ +/* $FreeBSD$ */ + +#include diff --git a/sys/i386/include/vmparam.h b/sys/i386/include/vmparam.h index 56ab4b3ddab..ce6672d4ece 100644 --- a/sys/i386/include/vmparam.h +++ b/sys/i386/include/vmparam.h @@ -165,7 +165,8 @@ #define VM_MAXUSER_ADDRESS VADDR(PTDPTDI, 0) -#define USRSTACK VM_MAXUSER_ADDRESS +#define SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE) +#define USRSTACK SHAREDPAGE #define VM_MAX_ADDRESS VADDR(PTDPTDI, PTDPTDI) #define VM_MIN_ADDRESS ((vm_offset_t)0) diff --git a/sys/i386/isa/npx.c b/sys/i386/isa/npx.c index 0da580f48c9..50c812c6cb5 100644 --- a/sys/i386/isa/npx.c +++ b/sys/i386/isa/npx.c @@ -100,15 +100,6 @@ __FBSDID("$FreeBSD$"); #define fxrstor(addr) __asm __volatile("fxrstor %0" : : "m" (*(addr))) #define fxsave(addr) __asm __volatile("fxsave %0" : "=m" (*(addr))) #endif -#ifdef XEN -#define start_emulating() (HYPERVISOR_fpu_taskswitch(1)) -#define stop_emulating() (HYPERVISOR_fpu_taskswitch(0)) -#else -#define start_emulating() __asm __volatile( \ - "smsw %%ax; orb %0,%%al; lmsw %%ax" \ - : : "n" (CR0_TS) : "ax") -#define stop_emulating() __asm __volatile("clts") -#endif #else /* !(__GNUCLIKE_ASM && !lint) */ void fldcw(u_short cw); @@ -123,11 +114,17 @@ void frstor(caddr_t addr); void fxsave(caddr_t addr); void fxrstor(caddr_t addr); #endif -void start_emulating(void); -void stop_emulating(void); #endif /* __GNUCLIKE_ASM && !lint */ +#ifdef XEN +#define start_emulating() (HYPERVISOR_fpu_taskswitch(1)) +#define stop_emulating() (HYPERVISOR_fpu_taskswitch(0)) +#else +#define start_emulating() load_cr0(rcr0() | CR0_TS) +#define stop_emulating() clts() +#endif + #ifdef CPU_ENABLE_SSE #define GET_FPU_CW(thread) \ (cpu_fxsr ? \ diff --git a/sys/i386/linux/linux.h b/sys/i386/linux/linux.h index 8b5bcbfd87d..799259c653d 100644 --- a/sys/i386/linux/linux.h +++ b/sys/i386/linux/linux.h @@ -42,6 +42,7 @@ extern u_char linux_debug_map[]; #define ldebug(name) isclr(linux_debug_map, LINUX_SYS_linux_ ## name) #define ARGS(nm, fmt) "linux(%ld): "#nm"("fmt")\n", (long)td->td_proc->p_pid #define LMSG(fmt) "linux(%ld): "fmt"\n", (long)td->td_proc->p_pid +#define LINUX_DTRACE linuxulator #ifdef MALLOC_DECLARE MALLOC_DECLARE(M_LINUX); diff --git a/sys/i386/linux/linux_dummy.c b/sys/i386/linux/linux_dummy.c index 31bbf6fb32b..ab77790c3e5 100644 --- a/sys/i386/linux/linux_dummy.c +++ b/sys/i386/linux/linux_dummy.c @@ -29,14 +29,23 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_compat.h" +#include "opt_kdtrace.h" + #include +#include +#include #include #include #include #include +#include #include +/* DTrace init */ +LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE); + DUMMY(stime); DUMMY(fstat); DUMMY(olduname); diff --git a/sys/i386/xen/pmap.c b/sys/i386/xen/pmap.c index 189f311da0a..4f123b047f5 100644 --- a/sys/i386/xen/pmap.c +++ b/sys/i386/xen/pmap.c @@ -179,7 +179,6 @@ __FBSDID("$FreeBSD$"); #define PMAP_INLINE #endif -#define PV_STATS #ifdef PV_STATS #define PV_STAT(x) do { x ; } while (0) #else @@ -230,6 +229,7 @@ static int pat_works; /* Is page attribute table sane? */ /* * Data for the pv entry allocation mechanism */ +static TAILQ_HEAD(pch, pv_chunk) pv_chunks = TAILQ_HEAD_INITIALIZER(pv_chunks); static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0; static int shpgperproc = PMAP_SHPGPERPROC; @@ -277,8 +277,9 @@ SYSCTL_INT(_debug, OID_AUTO, PMAP1unchanged, CTLFLAG_RD, "Number of times pmap_pte_quick didn't change PMAP1"); static struct mtx PMAP2mutex; +static void free_pv_chunk(struct pv_chunk *pc); static void free_pv_entry(pmap_t pmap, pv_entry_t pv); -static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try); +static pv_entry_t get_pv_entry(pmap_t pmap, boolean_t try); static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va); static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va); @@ -1914,6 +1915,7 @@ pmap_growkernel(vm_offset_t addr) CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE); CTASSERT(_NPCM == 11); +CTASSERT(_NPCPV == 336); static __inline struct pv_chunk * pv_to_chunk(pv_entry_t pv) @@ -1927,7 +1929,7 @@ pv_to_chunk(pv_entry_t pv) #define PC_FREE0_9 0xfffffffful /* Free values for index 0 through 9 */ #define PC_FREE10 0x0000fffful /* Free values for index 10 */ -static uint32_t pc_freemask[11] = { +static const uint32_t pc_freemask[_NPCM] = { PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, PC_FREE0_9, @@ -1958,66 +1960,133 @@ SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0 "Current number of pv entry allocs"); SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0, "Current number of spare pv entries"); - -static int pmap_collect_inactive, pmap_collect_active; - -SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_inactive, CTLFLAG_RD, &pmap_collect_inactive, 0, - "Current number times pmap_collect called on inactive queue"); -SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_active, CTLFLAG_RD, &pmap_collect_active, 0, - "Current number times pmap_collect called on active queue"); #endif /* * We are in a serious low memory condition. Resort to * drastic measures to free some pages so we can allocate - * another pv entry chunk. This is normally called to - * unmap inactive pages, and if necessary, active pages. + * another pv entry chunk. */ -static void -pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) +static vm_page_t +pmap_pv_reclaim(pmap_t locked_pmap) { + struct pch newtail; + struct pv_chunk *pc; pmap_t pmap; pt_entry_t *pte, tpte; - pv_entry_t next_pv, pv; + pv_entry_t pv; vm_offset_t va; - vm_page_t m, free; + vm_page_t free, m, m_pc; + uint32_t inuse; + int bit, field, freed; + PMAP_LOCK_ASSERT(locked_pmap, MA_OWNED); + pmap = NULL; + free = m_pc = NULL; + TAILQ_INIT(&newtail); sched_pin(); - TAILQ_FOREACH(m, &vpq->pl, pageq) { - if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy) - continue; - TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) { - va = pv->pv_va; - pmap = PV_PMAP(pv); + while ((pc = TAILQ_FIRST(&pv_chunks)) != NULL && (pv_vafree == 0 || + free == NULL)) { + TAILQ_REMOVE(&pv_chunks, pc, pc_lru); + if (pmap != pc->pc_pmap) { + if (pmap != NULL) { + pmap_invalidate_all(pmap); + if (pmap != locked_pmap) + PMAP_UNLOCK(pmap); + } + pmap = pc->pc_pmap; /* Avoid deadlock and lock recursion. */ if (pmap > locked_pmap) PMAP_LOCK(pmap); - else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap)) + else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap)) { + pmap = NULL; + TAILQ_INSERT_TAIL(&newtail, pc, pc_lru); continue; - pmap->pm_stats.resident_count--; - pte = pmap_pte_quick(pmap, va); - tpte = pte_load_clear(pte); - KASSERT((tpte & PG_W) == 0, - ("pmap_collect: wired pte %#jx", (uintmax_t)tpte)); - if (tpte & PG_A) - vm_page_aflag_set(m, PGA_REFERENCED); - if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) - vm_page_dirty(m); - free = NULL; - pmap_unuse_pt(pmap, va, &free); - pmap_invalidate_page(pmap, va); - pmap_free_zero_pages(free); - TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - free_pv_entry(pmap, pv); - if (pmap != locked_pmap) - PMAP_UNLOCK(pmap); + } } - if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_aflag_clear(m, PGA_WRITEABLE); - } - sched_unpin(); -} + /* + * Destroy every non-wired, 4 KB page mapping in the chunk. + */ + freed = 0; + for (field = 0; field < _NPCM; field++) { + for (inuse = ~pc->pc_map[field] & pc_freemask[field]; + inuse != 0; inuse &= ~(1UL << bit)) { + bit = bsfl(inuse); + pv = &pc->pc_pventry[field * 32 + bit]; + va = pv->pv_va; + pte = pmap_pte_quick(pmap, va); + if ((*pte & PG_W) != 0) + continue; + tpte = pte_load_clear(pte); + if ((tpte & PG_G) != 0) + pmap_invalidate_page(pmap, va); + m = PHYS_TO_VM_PAGE(tpte & PG_FRAME); + if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) + vm_page_dirty(m); + if ((tpte & PG_A) != 0) + vm_page_aflag_set(m, PGA_REFERENCED); + TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); + if (TAILQ_EMPTY(&m->md.pv_list)) + vm_page_aflag_clear(m, PGA_WRITEABLE); + pc->pc_map[field] |= 1UL << bit; + pmap_unuse_pt(pmap, va, &free); + freed++; + } + } + if (freed == 0) { + TAILQ_INSERT_TAIL(&newtail, pc, pc_lru); + continue; + } + /* Every freed mapping is for a 4 KB page. */ + pmap->pm_stats.resident_count -= freed; + PV_STAT(pv_entry_frees += freed); + PV_STAT(pv_entry_spare += freed); + pv_entry_count -= freed; + TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); + for (field = 0; field < _NPCM; field++) + if (pc->pc_map[field] != pc_freemask[field]) { + TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, + pc_list); + TAILQ_INSERT_TAIL(&newtail, pc, pc_lru); + + /* + * One freed pv entry in locked_pmap is + * sufficient. + */ + if (pmap == locked_pmap) + goto out; + break; + } + if (field == _NPCM) { + PV_STAT(pv_entry_spare -= _NPCPV); + PV_STAT(pc_chunk_count--); + PV_STAT(pc_chunk_frees++); + /* Entire chunk is free; return it. */ + m_pc = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)pc)); + pmap_qremove((vm_offset_t)pc, 1); + pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc); + break; + } + } +out: + sched_unpin(); + TAILQ_CONCAT(&pv_chunks, &newtail, pc_lru); + if (pmap != NULL) { + pmap_invalidate_all(pmap); + if (pmap != locked_pmap) + PMAP_UNLOCK(pmap); + } + if (m_pc == NULL && pv_vafree != 0 && free != NULL) { + m_pc = free; + free = m_pc->right; + /* Recycle a freed page table page. */ + m_pc->wire_count = 1; + atomic_add_int(&cnt.v_wire_count, 1); + } + pmap_free_zero_pages(free); + return (m_pc); +} /* * free the pv_entry back to the free list @@ -2025,7 +2094,6 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) static void free_pv_entry(pmap_t pmap, pv_entry_t pv) { - vm_page_t m; struct pv_chunk *pc; int idx, field, bit; @@ -2039,13 +2107,30 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv) field = idx / 32; bit = idx % 32; pc->pc_map[field] |= 1ul << bit; - /* move to head of list */ - TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); for (idx = 0; idx < _NPCM; idx++) if (pc->pc_map[idx] != pc_freemask[idx]) { - TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list); + /* + * 98% of the time, pc is already at the head of the + * list. If it isn't already, move it to the head. + */ + if (__predict_false(TAILQ_FIRST(&pmap->pm_pvchunk) != + pc)) { + TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); + TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, + pc_list); + } return; } + TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); + free_pv_chunk(pc); +} + +static void +free_pv_chunk(struct pv_chunk *pc) +{ + vm_page_t m; + + TAILQ_REMOVE(&pv_chunks, pc, pc_lru); PV_STAT(pv_entry_spare -= _NPCPV); PV_STAT(pc_chunk_count--); PV_STAT(pc_chunk_frees++); @@ -2062,11 +2147,10 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv) * when needed. */ static pv_entry_t -get_pv_entry(pmap_t pmap, int try) +get_pv_entry(pmap_t pmap, boolean_t try) { static const struct timeval printinterval = { 60, 0 }; static struct timeval lastprint; - struct vpgqueues *pq; int bit, field; pv_entry_t pv; struct pv_chunk *pc; @@ -2081,7 +2165,6 @@ get_pv_entry(pmap_t pmap, int try) printf("Approaching the limit on PV entries, consider " "increasing either the vm.pmap.shpgperproc or the " "vm.pmap.pv_entry_max tunable.\n"); - pq = NULL; retry: pc = TAILQ_FIRST(&pmap->pm_pvchunk); if (pc != NULL) { @@ -2111,29 +2194,16 @@ retry: * queues lock. If "pv_vafree" is currently non-empty, it will * remain non-empty until pmap_ptelist_alloc() completes. */ - if (pv_vafree == 0 || (m = vm_page_alloc(NULL, 0, (pq == - &vm_page_queues[PQ_ACTIVE] ? VM_ALLOC_SYSTEM : VM_ALLOC_NORMAL) | + if (pv_vafree == 0 || (m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED)) == NULL) { if (try) { pv_entry_count--; PV_STAT(pc_chunk_tryfail++); return (NULL); } - /* - * Reclaim pv entries: At first, destroy mappings to - * inactive pages. After that, if a pv chunk entry - * is still needed, destroy mappings to active pages. - */ - if (pq == NULL) { - PV_STAT(pmap_collect_inactive++); - pq = &vm_page_queues[PQ_INACTIVE]; - } else if (pq == &vm_page_queues[PQ_INACTIVE]) { - PV_STAT(pmap_collect_active++); - pq = &vm_page_queues[PQ_ACTIVE]; - } else - panic("get_pv_entry: increase vm.pmap.shpgperproc"); - pmap_collect(pmap, pq); - goto retry; + m = pmap_pv_reclaim(pmap); + if (m == NULL) + goto retry; } PV_STAT(pc_chunk_count++); PV_STAT(pc_chunk_allocs++); @@ -2145,6 +2215,7 @@ retry: pc->pc_map[0] = pc_freemask[0] & ~1ul; /* preallocated bit 0 */ for (field = 1; field < _NPCM; field++) pc->pc_map[field] = pc_freemask[field]; + TAILQ_INSERT_TAIL(&pv_chunks, pc, pc_lru); pv = &pc->pc_pventry[0]; TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list); PV_STAT(pv_entry_spare += _NPCPV - 1); @@ -3470,7 +3541,7 @@ pmap_remove_pages(pmap_t pmap) TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) { allfree = 1; for (field = 0; field < _NPCM; field++) { - inuse = (~(pc->pc_map[field])) & pc_freemask[field]; + inuse = ~pc->pc_map[field] & pc_freemask[field]; while (inuse != 0) { bit = bsfl(inuse); bitmask = 1UL << bit; @@ -3531,15 +3602,8 @@ pmap_remove_pages(pmap_t pmap) } PT_UPDATES_FLUSH(); if (allfree) { - PV_STAT(pv_entry_spare -= _NPCPV); - PV_STAT(pc_chunk_count--); - PV_STAT(pc_chunk_frees++); TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); - m = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)pc)); - pmap_qremove((vm_offset_t)pc, 1); - vm_page_unwire(m, 0); - vm_page_free(m); - pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc); + free_pv_chunk(pc); } } PT_UPDATES_FLUSH(); diff --git a/sys/ia64/acpica/acpi_wakeup.c b/sys/ia64/acpica/acpi_wakeup.c index c81c3b39f87..6c70ca70114 100644 --- a/sys/ia64/acpica/acpi_wakeup.c +++ b/sys/ia64/acpica/acpi_wakeup.c @@ -39,6 +39,13 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state) return (0); } +int +acpi_wakeup_machdep(struct acpi_softc *sc, int state, int sleep_result, + int intr_enabled) +{ + return (0); +} + void acpi_install_wakeup_handler(struct acpi_softc *sc) { diff --git a/sys/ia64/ia64/busdma_machdep.c b/sys/ia64/ia64/busdma_machdep.c index d504e89677d..eaaf03f54c9 100644 --- a/sys/ia64/ia64/busdma_machdep.c +++ b/sys/ia64/ia64/busdma_machdep.c @@ -262,7 +262,7 @@ bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, atomic_add_int(&parent->ref_count, 1); } - if (newtag->lowaddr < ptoa(Maxmem) && (flags & BUS_DMA_ALLOCNOW) != 0) { + if (newtag->lowaddr < paddr_max && (flags & BUS_DMA_ALLOCNOW) != 0) { /* Must bounce */ if (ptoa(total_bpages) < maxsize) { @@ -340,7 +340,7 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) * exclusion region, a data alignment that is stricter than 1, and/or * an active address boundary. */ - if (dmat->lowaddr < ptoa(Maxmem)) { + if (dmat->lowaddr < paddr_max) { /* Must bounce */ int maxpages; @@ -356,7 +356,7 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) * Attempt to add pages to our pool on a per-instance * basis up to a sane limit. */ - maxpages = MIN(MAX_BPAGES, Maxmem - atop(dmat->lowaddr)); + maxpages = MIN(MAX_BPAGES, atop(paddr_max - dmat->lowaddr)); if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0 || (dmat->map_count > 0 && total_bpages < maxpages)) { int pages; @@ -438,7 +438,7 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, */ if ((dmat->maxsize <= PAGE_SIZE) && (dmat->alignment < dmat->maxsize) && - dmat->lowaddr >= ptoa(Maxmem)) { + dmat->lowaddr >= paddr_max) { *vaddr = malloc(dmat->maxsize, M_DEVBUF, mflags); } else { /* @@ -473,7 +473,7 @@ bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) panic("bus_dmamem_free: Invalid map freed\n"); if ((dmat->maxsize <= PAGE_SIZE) && (dmat->alignment < dmat->maxsize) && - dmat->lowaddr >= ptoa(Maxmem)) + dmat->lowaddr >= paddr_max) free(vaddr, M_DEVBUF); else { contigfree(vaddr, dmat->maxsize, M_DEVBUF); @@ -506,7 +506,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, else pmap = NULL; - if ((dmat->lowaddr < ptoa(Maxmem) || dmat->boundary > 0 || + if ((dmat->lowaddr < paddr_max || dmat->boundary > 0 || dmat->alignment > 1) && map != &nobounce_dmamap && map->pagesneeded == 0) { vm_offset_t vendaddr; diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c index 26fb5257d00..fbc35d179a0 100644 --- a/sys/ia64/ia64/machdep.c +++ b/sys/ia64/ia64/machdep.c @@ -152,22 +152,11 @@ SYSCTL_STRING(_hw, OID_AUTO, family, CTLFLAG_RD, cpu_family, 0, extern vm_offset_t ksym_start, ksym_end; #endif - struct msgbuf *msgbufp = NULL; /* Other subsystems (e.g., ACPI) can hook this later. */ void (*cpu_idle_hook)(void) = NULL; -long Maxmem = 0; -long realmem = 0; - -#define PHYSMAP_SIZE (2 * VM_PHYSSEG_MAX) - -vm_paddr_t phys_avail[PHYSMAP_SIZE + 2]; - -/* must be 2 less so 0 0 can signal end of chunks */ -#define PHYS_AVAIL_ARRAY_END ((sizeof(phys_avail) / sizeof(vm_offset_t)) - 2) - struct kva_md_info kmi; #define Mhz 1000000L @@ -270,25 +259,8 @@ cpu_startup(void *dummy) #ifdef PERFMON perfmon_init(); #endif - printf("real memory = %ld (%ld MB)\n", ia64_ptob(Maxmem), - ia64_ptob(Maxmem) / 1048576); - realmem = Maxmem; - - /* - * Display any holes after the first chunk of extended memory. - */ - if (bootverbose) { - int indx; - - printf("Physical memory chunk(s):\n"); - for (indx = 0; phys_avail[indx + 1] != 0; indx += 2) { - long size1 = phys_avail[indx + 1] - phys_avail[indx]; - - printf("0x%08lx - 0x%08lx, %ld bytes (%ld pages)\n", - phys_avail[indx], phys_avail[indx + 1] - 1, size1, - size1 >> PAGE_SHIFT); - } - } + printf("real memory = %ld (%ld MB)\n", ptoa(realmem), + ptoa(realmem) / 1048576); vm_ksubmap_init(&kmi); @@ -533,6 +505,14 @@ cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size) pcpu->pc_acpi_id = 0xffffffff; } +void +cpu_pcpu_setup(struct pcpu *pc, u_int acpi_id, u_int sapic_id) +{ + + pc->pc_acpi_id = acpi_id; + pc->pc_md.lid = IA64_LID_SET_SAPIC_ID(sapic_id); +} + void spinlock_enter(void) { @@ -700,43 +680,86 @@ struct ia64_init_return ia64_init(void) { struct ia64_init_return ret; - int phys_avail_cnt; - vm_offset_t kernstart, kernend; - vm_offset_t kernstartpfn, kernendpfn, pfn0, pfn1; - char *p; struct efi_md *md; + pt_entry_t *pbvm_pgtbl_ent, *pbvm_pgtbl_lim; + char *p; + vm_size_t mdlen; int metadata_missing; - /* NO OUTPUT ALLOWED UNTIL FURTHER NOTICE */ - /* - * TODO: Disable interrupts, floating point etc. - * Maybe flush cache and tlb + * NO OUTPUT ALLOWED UNTIL FURTHER NOTICE. */ + ia64_set_fpsr(IA64_FPSR_DEFAULT); /* - * TODO: Get critical system information (if possible, from the - * information provided by the boot program). + * Region 6 is direct mapped UC and region 7 is direct mapped + * WC. The details of this is controlled by the Alt {I,D}TLB + * handlers. Here we just make sure that they have the largest + * possible page size to minimise TLB usage. */ + ia64_set_rr(IA64_RR_BASE(6), (6 << 8) | (PAGE_SHIFT << 2)); + ia64_set_rr(IA64_RR_BASE(7), (7 << 8) | (PAGE_SHIFT << 2)); + ia64_srlz_d(); + + /* Initialize/setup physical memory datastructures */ + ia64_physmem_init(); /* - * Look for the I/O ports first - we need them for console - * probing. + * Process the memory map. This gives us the PAL locations, + * the I/O port base address, the available memory regions + * for initializing the physical memory map. */ for (md = efi_md_first(); md != NULL; md = efi_md_next(md)) { + mdlen = md->md_pages * EFI_PAGE_SIZE; switch (md->md_type) { case EFI_MD_TYPE_IOPORT: ia64_port_base = (uintptr_t)pmap_mapdev(md->md_phys, - md->md_pages * EFI_PAGE_SIZE); + mdlen); break; case EFI_MD_TYPE_PALCODE: - ia64_pal_size = md->md_pages * EFI_PAGE_SIZE; ia64_pal_base = md->md_phys; + ia64_pal_size = mdlen; + /*FALLTHROUGH*/ + case EFI_MD_TYPE_BAD: + case EFI_MD_TYPE_FIRMWARE: + case EFI_MD_TYPE_RECLAIM: + case EFI_MD_TYPE_RT_CODE: + case EFI_MD_TYPE_RT_DATA: + /* Don't use these memory regions. */ + ia64_physmem_track(md->md_phys, mdlen); + break; + case EFI_MD_TYPE_BS_CODE: + case EFI_MD_TYPE_BS_DATA: + case EFI_MD_TYPE_CODE: + case EFI_MD_TYPE_DATA: + case EFI_MD_TYPE_FREE: + /* These are ok to use. */ + ia64_physmem_add(md->md_phys, mdlen); break; } } + /* + * Remove the PBVM and its page table from phys_avail. The loader + * passes the physical address of the page table to us. The virtual + * address of the page table is fixed. + * Track and the PBVM limit for later use. + */ + ia64_physmem_delete(bootinfo->bi_pbvm_pgtbl, bootinfo->bi_pbvm_pgtblsz); + pbvm_pgtbl_ent = (void *)IA64_PBVM_PGTBL; + pbvm_pgtbl_lim = (void *)(IA64_PBVM_PGTBL + bootinfo->bi_pbvm_pgtblsz); + while (pbvm_pgtbl_ent < pbvm_pgtbl_lim) { + if ((*pbvm_pgtbl_ent & PTE_PRESENT) == 0) + break; + ia64_physmem_delete(*pbvm_pgtbl_ent & PTE_PPN_MASK, + IA64_PBVM_PAGE_SIZE); + pbvm_pgtbl_ent++; + } + + /* Finalize physical memory datastructures */ + ia64_physmem_fini(); + metadata_missing = 0; if (bootinfo->bi_modulep) preload_metadata = (caddr_t)bootinfo->bi_modulep; @@ -756,31 +779,6 @@ ia64_init(void) if (boothowto & RB_VERBOSE) bootverbose = 1; - /* - * Find the beginning and end of the kernel. - */ - kernstart = trunc_page(kernel_text); -#ifdef DDB - ksym_start = bootinfo->bi_symtab; - ksym_end = bootinfo->bi_esymtab; - kernend = (vm_offset_t)round_page(ksym_end); -#else - kernend = (vm_offset_t)round_page(_end); -#endif - /* But if the bootstrap tells us otherwise, believe it! */ - if (bootinfo->bi_kernend) - kernend = round_page(bootinfo->bi_kernend); - - /* - * Region 6 is direct mapped UC and region 7 is direct mapped - * WC. The details of this is controlled by the Alt {I,D}TLB - * handlers. Here we just make sure that they have the largest - * possible page size to minimise TLB usage. - */ - ia64_set_rr(IA64_RR_BASE(6), (6 << 8) | (PAGE_SHIFT << 2)); - ia64_set_rr(IA64_RR_BASE(7), (7 << 8) | (PAGE_SHIFT << 2)); - ia64_srlz_d(); - /* * Wire things up so we can call the firmware. */ @@ -800,9 +798,8 @@ ia64_init(void) pcpup = &pcpu0; ia64_set_k4((u_int64_t)pcpup); pcpu_init(pcpup, 0, sizeof(pcpu0)); - dpcpu_init((void *)kernend, 0); - PCPU_SET(md.lid, ia64_get_lid()); - kernend += DPCPU_SIZE; + dpcpu_init(ia64_physmem_alloc(DPCPU_SIZE, PAGE_SIZE), 0); + cpu_pcpu_setup(pcpup, ~0U, ia64_get_lid()); PCPU_SET(curthread, &thread0); /* @@ -828,105 +825,20 @@ ia64_init(void) freeenv(p); } - kernstartpfn = atop(IA64_RR_MASK(kernstart)); - kernendpfn = atop(IA64_RR_MASK(kernend)); - - /* - * Size the memory regions and load phys_avail[] with the results. - */ - - /* - * Find out how much memory is available, by looking at - * the memory descriptors. - */ - -#ifdef DEBUG_MD - printf("Memory descriptor count: %d\n", mdcount); -#endif - - phys_avail_cnt = 0; - for (md = efi_md_first(); md != NULL; md = efi_md_next(md)) { -#ifdef DEBUG_MD - printf("MD %p: type %d pa 0x%lx cnt 0x%lx\n", md, - md->md_type, md->md_phys, md->md_pages); -#endif - - pfn0 = ia64_btop(round_page(md->md_phys)); - pfn1 = ia64_btop(trunc_page(md->md_phys + md->md_pages * 4096)); - if (pfn1 <= pfn0) - continue; - - if (md->md_type != EFI_MD_TYPE_FREE) - continue; - - /* - * We have a memory descriptor that describes conventional - * memory that is for general use. We must determine if the - * loader has put the kernel in this region. - */ - physmem += (pfn1 - pfn0); - if (pfn0 <= kernendpfn && kernstartpfn <= pfn1) { - /* - * Must compute the location of the kernel - * within the segment. - */ -#ifdef DEBUG_MD - printf("Descriptor %p contains kernel\n", mp); -#endif - if (pfn0 < kernstartpfn) { - /* - * There is a chunk before the kernel. - */ -#ifdef DEBUG_MD - printf("Loading chunk before kernel: " - "0x%lx / 0x%lx\n", pfn0, kernstartpfn); -#endif - phys_avail[phys_avail_cnt] = ia64_ptob(pfn0); - phys_avail[phys_avail_cnt+1] = ia64_ptob(kernstartpfn); - phys_avail_cnt += 2; - } - if (kernendpfn < pfn1) { - /* - * There is a chunk after the kernel. - */ -#ifdef DEBUG_MD - printf("Loading chunk after kernel: " - "0x%lx / 0x%lx\n", kernendpfn, pfn1); -#endif - phys_avail[phys_avail_cnt] = ia64_ptob(kernendpfn); - phys_avail[phys_avail_cnt+1] = ia64_ptob(pfn1); - phys_avail_cnt += 2; - } - } else { - /* - * Just load this cluster as one chunk. - */ -#ifdef DEBUG_MD - printf("Loading descriptor %d: 0x%lx / 0x%lx\n", i, - pfn0, pfn1); -#endif - phys_avail[phys_avail_cnt] = ia64_ptob(pfn0); - phys_avail[phys_avail_cnt+1] = ia64_ptob(pfn1); - phys_avail_cnt += 2; - - } - } - phys_avail[phys_avail_cnt] = 0; - - Maxmem = physmem; init_param2(physmem); /* * Initialize error message buffer (at end of core). */ - msgbufp = (struct msgbuf *)pmap_steal_memory(msgbufsize); + msgbufp = ia64_physmem_alloc(msgbufsize, PAGE_SIZE); msgbufinit(msgbufp, msgbufsize); proc_linkup0(&proc0, &thread0); /* * Init mapping for kernel stack for proc 0 */ - thread0.td_kstack = pmap_steal_memory(KSTACK_PAGES * PAGE_SIZE); + p = ia64_physmem_alloc(KSTACK_PAGES * PAGE_SIZE, PAGE_SIZE); + thread0.td_kstack = (uintptr_t)p; thread0.td_kstack_pages = KSTACK_PAGES; mutex_init(); @@ -952,6 +864,11 @@ ia64_init(void) /* * Initialize debuggers, and break into them if appropriate. */ +#ifdef DDB + ksym_start = bootinfo->bi_symtab; + ksym_end = bootinfo->bi_esymtab; +#endif + kdb_init(); #ifdef KDB diff --git a/sys/ia64/ia64/mp_machdep.c b/sys/ia64/ia64/mp_machdep.c index 0d8f241b1b1..8f924600c41 100644 --- a/sys/ia64/ia64/mp_machdep.c +++ b/sys/ia64/ia64/mp_machdep.c @@ -309,9 +309,8 @@ cpu_mp_add(u_int acpi_id, u_int id, u_int eid) } else pc = pcpup; - pc->pc_acpi_id = acpi_id; - pc->pc_md.lid = IA64_LID_SET_SAPIC_ID(sapic_id); - + cpu_pcpu_setup(pc, acpi_id, sapic_id); + CPU_SET(pc->pc_cpuid, &all_cpus); } @@ -466,6 +465,7 @@ cpu_mp_unleash(void *dummy) */ ia64_bind_intr(); } +SYSINIT(start_aps, SI_SUB_KICK_SCHEDULER, SI_ORDER_ANY, cpu_mp_unleash, NULL); /* * send an IPI to a set of cpus. @@ -522,5 +522,3 @@ ipi_send(struct pcpu *cpu, int xiv) ia64_mf_a(); CTR3(KTR_SMP, "ipi_send(%p, %d): cpuid=%d", cpu, xiv, PCPU_GET(cpuid)); } - -SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, cpu_mp_unleash, NULL); diff --git a/sys/ia64/ia64/nexus.c b/sys/ia64/ia64/nexus.c index 53f23cb29e7..c232d393e20 100644 --- a/sys/ia64/ia64/nexus.c +++ b/sys/ia64/ia64/nexus.c @@ -65,9 +65,6 @@ #include -#include -#include - #include "clock_if.h" static MALLOC_DEFINE(M_NEXUSDEV, "nexusdev", "Nexus device"); @@ -191,12 +188,6 @@ static int nexus_attach(device_t dev) { - /* - * Mask the legacy PICs - we will use the I/O SAPIC for interrupt. - */ - outb(IO_ICU1+1, 0xff); - outb(IO_ICU2+1, 0xff); - if (acpi_identify() == 0) BUS_ADD_CHILD(dev, 10, "acpi", 0); clock_register(dev, 1000); diff --git a/sys/ia64/ia64/physmem.c b/sys/ia64/ia64/physmem.c new file mode 100644 index 00000000000..11ee840fff3 --- /dev/null +++ b/sys/ia64/ia64/physmem.c @@ -0,0 +1,258 @@ +/*- + * Copyright (c) 2012 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include + +static u_int phys_avail_segs; + +vm_paddr_t phys_avail[2 * VM_PHYSSEG_MAX + 2]; + +vm_paddr_t paddr_max; + +long realmem; + +static u_int +ia64_physmem_find(vm_paddr_t base, vm_paddr_t lim) +{ + u_int idx; + + for (idx = 0; phys_avail[idx + 1] != 0; idx += 2) { + if (phys_avail[idx] >= lim || + phys_avail[idx + 1] > base) + break; + } + return (idx); +} + +static int +ia64_physmem_insert(u_int idx, vm_paddr_t base, vm_paddr_t lim) +{ + u_int ridx; + + if (phys_avail_segs == VM_PHYSSEG_MAX) + return (ENOMEM); + + ridx = phys_avail_segs * 2; + while (idx < ridx) { + phys_avail[ridx + 1] = phys_avail[ridx - 1]; + phys_avail[ridx] = phys_avail[ridx - 2]; + ridx -= 2; + } + phys_avail[idx] = base; + phys_avail[idx + 1] = lim; + phys_avail_segs++; + return (0); +} + +static int +ia64_physmem_remove(u_int idx) +{ + + if (phys_avail_segs == 0) + return (ENOENT); + do { + phys_avail[idx] = phys_avail[idx + 2]; + phys_avail[idx + 1] = phys_avail[idx + 3]; + idx += 2; + } while (phys_avail[idx + 1] != 0); + phys_avail_segs--; + return (0); +} + +int +ia64_physmem_add(vm_paddr_t base, vm_size_t len) +{ + vm_paddr_t lim; + u_int idx; + + realmem += len; + + lim = base + len; + idx = ia64_physmem_find(base, lim); + if (phys_avail[idx] == lim) { + phys_avail[idx] = base; + return (0); + } + if (idx > 0 && phys_avail[idx - 1] == base) { + phys_avail[idx - 1] = lim; + return (0); + } + return (ia64_physmem_insert(idx, base, lim)); +} + +int +ia64_physmem_delete(vm_paddr_t base, vm_size_t len) +{ + vm_paddr_t lim; + u_int idx; + + lim = base + len; + idx = ia64_physmem_find(base, lim); + if (phys_avail[idx] >= lim || phys_avail[idx + 1] == 0) + return (ENOENT); + if (phys_avail[idx] < base && phys_avail[idx + 1] > lim) { + len = phys_avail[idx + 1] - lim; + phys_avail[idx + 1] = base; + base = lim; + lim = base + len; + return (ia64_physmem_insert(idx + 2, base, lim)); + } else { + if (phys_avail[idx] == base) + phys_avail[idx] = lim; + if (phys_avail[idx + 1] == lim) + phys_avail[idx + 1] = base; + if (phys_avail[idx] >= phys_avail[idx + 1]) + return (ia64_physmem_remove(idx)); + } + return (0); +} + +int +ia64_physmem_fini(void) +{ + vm_paddr_t base, lim, size; + u_int idx; + + idx = 0; + while (phys_avail[idx + 1] != 0) { + base = round_page(phys_avail[idx]); + lim = trunc_page(phys_avail[idx + 1]); + if (base < lim) { + phys_avail[idx] = base; + phys_avail[idx + 1] = lim; + size = lim - base; + physmem += atop(size); + paddr_max = lim; + idx += 2; + } else + ia64_physmem_remove(idx); + } + + /* + * Round realmem to a multple of 128MB. Hopefully that compensates + * for any loss of DRAM that isn't accounted for in the memory map. + * I'm thinking legacy BIOS or VGA here. In any case, it's ok if + * we got it wrong, because we don't actually use realmem. It's + * just for show... + */ + size = 1U << 27; + realmem = (realmem + size - 1) & ~(size - 1); + realmem = atop(realmem); + return (0); +} + +int +ia64_physmem_init(void) +{ + + /* Nothing to do just yet. */ + return (0); +} + +int +ia64_physmem_track(vm_paddr_t base, vm_size_t len) +{ + + realmem += len; + return (0); +} + +void * +ia64_physmem_alloc(vm_size_t len, vm_size_t align) +{ + vm_paddr_t base, lim, pa; + void *ptr; + u_int idx; + + if (phys_avail_segs == 0) + return (NULL); + + len = round_page(len); + + /* + * Try and allocate with least effort. + */ + idx = phys_avail_segs * 2; + while (idx > 0) { + idx -= 2; + base = phys_avail[idx]; + lim = phys_avail[idx + 1]; + + if (lim - base < len) + continue; + + /* First try from the end. */ + pa = lim - len; + if ((pa & (align - 1)) == 0) { + if (pa == base) + ia64_physmem_remove(idx); + else + phys_avail[idx + 1] = pa; + goto gotit; + } + + /* Try from the start next. */ + pa = base; + if ((pa & (align - 1)) == 0) { + if (pa + len == lim) + ia64_physmem_remove(idx); + else + phys_avail[idx] += len; + goto gotit; + } + } + + /* + * Find a good segment and split it up. + */ + idx = phys_avail_segs * 2; + while (idx > 0) { + idx -= 2; + base = phys_avail[idx]; + lim = phys_avail[idx + 1]; + + pa = (base + align - 1) & ~(align - 1); + if (pa + len <= lim) { + ia64_physmem_delete(pa, len); + goto gotit; + } + } + + /* Out of luck. */ + return (NULL); + + gotit: + ptr = (void *)IA64_PHYS_TO_RR7(pa); + bzero(ptr, len); + return (ptr); +} diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c index 5ba58563887..ff4ec531f1e 100644 --- a/sys/ia64/ia64/pmap.c +++ b/sys/ia64/ia64/pmap.c @@ -243,36 +243,6 @@ static int pmap_remove_vhpt(vm_offset_t va); static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m); -vm_offset_t -pmap_steal_memory(vm_size_t size) -{ - vm_size_t bank_size; - vm_offset_t pa, va; - - size = round_page(size); - - bank_size = phys_avail[1] - phys_avail[0]; - while (size > bank_size) { - int i; - for (i = 0; phys_avail[i+2]; i+= 2) { - phys_avail[i] = phys_avail[i+2]; - phys_avail[i+1] = phys_avail[i+3]; - } - phys_avail[i] = 0; - phys_avail[i+1] = 0; - if (!phys_avail[0]) - panic("pmap_steal_memory: out of memory"); - bank_size = phys_avail[1] - phys_avail[0]; - } - - pa = phys_avail[0]; - phys_avail[0] += size; - - va = IA64_PHYS_TO_RR7(pa); - bzero((caddr_t) va, size); - return va; -} - static void pmap_initialize_vhpt(vm_offset_t vhpt) { @@ -289,21 +259,23 @@ pmap_initialize_vhpt(vm_offset_t vhpt) } #ifdef SMP -MALLOC_DECLARE(M_SMP); - vm_offset_t pmap_alloc_vhpt(void) { vm_offset_t vhpt; + vm_page_t m; vm_size_t size; size = 1UL << pmap_vhpt_log2size; - vhpt = (uintptr_t)contigmalloc(size, M_SMP, 0, 0UL, ~0UL, size, 0UL); - if (vhpt != 0) { - vhpt = IA64_PHYS_TO_RR7(ia64_tpa(vhpt)); + m = vm_page_alloc_contig(NULL, 0, VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ | + VM_ALLOC_WIRED, atop(size), 0UL, ~0UL, size, 0UL, + VM_MEMATTR_DEFAULT); + if (m != NULL) { + vhpt = IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(m)); pmap_initialize_vhpt(vhpt); + return (vhpt); } - return (vhpt); + return (0); } #endif @@ -316,7 +288,7 @@ pmap_bootstrap() struct ia64_pal_result res; vm_offset_t base; size_t size; - int i, j, count, ridbits; + int i, ridbits; /* * Query the PAL Code to find the loop parameters for the @@ -378,7 +350,7 @@ pmap_bootstrap() pmap_ridmax = (1 << ridbits); pmap_ridmapsz = pmap_ridmax / 64; - pmap_ridmap = (uint64_t *)pmap_steal_memory(pmap_ridmax / 8); + pmap_ridmap = ia64_physmem_alloc(pmap_ridmax / 8, PAGE_SIZE); pmap_ridmap[0] |= 0xff; pmap_rididx = 0; pmap_ridcount = 8; @@ -387,14 +359,10 @@ pmap_bootstrap() /* * Allocate some memory for initial kernel 'page tables'. */ - ia64_kptdir = (void *)pmap_steal_memory(PAGE_SIZE); + ia64_kptdir = ia64_physmem_alloc(PAGE_SIZE, PAGE_SIZE); nkpt = 0; kernel_vm_end = VM_MIN_KERNEL_ADDRESS; - for (i = 0; phys_avail[i+2]; i+= 2) - ; - count = i+2; - /* * Determine a valid (mappable) VHPT size. */ @@ -408,35 +376,18 @@ pmap_bootstrap() if (pmap_vhpt_log2size & 1) pmap_vhpt_log2size--; - base = 0; size = 1UL << pmap_vhpt_log2size; - for (i = 0; i < count; i += 2) { - base = (phys_avail[i] + size - 1) & ~(size - 1); - if (base + size <= phys_avail[i+1]) - break; - } - if (!phys_avail[i]) + base = (uintptr_t)ia64_physmem_alloc(size, size); + if (base == 0) panic("Unable to allocate VHPT"); - if (base != phys_avail[i]) { - /* Split this region. */ - for (j = count; j > i; j -= 2) { - phys_avail[j] = phys_avail[j-2]; - phys_avail[j+1] = phys_avail[j-2+1]; - } - phys_avail[i+1] = base; - phys_avail[i+2] = base + size; - } else - phys_avail[i] = base + size; - - base = IA64_PHYS_TO_RR7(base); PCPU_SET(md.vhpt, base); if (bootverbose) printf("VHPT: address=%#lx, size=%#lx\n", base, size); pmap_vhpt_nbuckets = size / sizeof(struct ia64_lpte); - pmap_vhpt_bucket = (void *)pmap_steal_memory(pmap_vhpt_nbuckets * - sizeof(struct ia64_bucket)); + pmap_vhpt_bucket = ia64_physmem_alloc(pmap_vhpt_nbuckets * + sizeof(struct ia64_bucket), PAGE_SIZE); for (i = 0; i < pmap_vhpt_nbuckets; i++) { /* Stolen memory is zeroed. */ mtx_init(&pmap_vhpt_bucket[i].mutex, "VHPT bucket lock", NULL, diff --git a/sys/ia64/include/_stdint.h b/sys/ia64/include/_stdint.h index e36c6598861..cb3b1a23059 100644 --- a/sys/ia64/include/_stdint.h +++ b/sys/ia64/include/_stdint.h @@ -149,12 +149,6 @@ /* Limit of size_t. */ #define SIZE_MAX UINT64_MAX -#ifndef WCHAR_MIN /* Also possibly defined in */ -/* Limits of wchar_t. */ -#define WCHAR_MIN INT32_MIN -#define WCHAR_MAX INT32_MAX -#endif - /* Limits of wint_t. */ #define WINT_MIN INT32_MIN #define WINT_MAX INT32_MAX diff --git a/sys/ia64/include/_types.h b/sys/ia64/include/_types.h index 66ac0ccb6c4..2876648d667 100644 --- a/sys/ia64/include/_types.h +++ b/sys/ia64/include/_types.h @@ -96,6 +96,10 @@ typedef __int64_t __vm_ooffset_t; typedef __uint64_t __vm_paddr_t; typedef __uint64_t __vm_pindex_t; typedef __uint64_t __vm_size_t; +typedef int __wchar_t; + +#define __WCHAR_MIN __INT_MIN /* min value for a wchar_t */ +#define __WCHAR_MAX __INT_MAX /* max value for a wchar_t */ /* * Unusual type definitions. diff --git a/sys/ia64/include/elf.h b/sys/ia64/include/elf.h index 7b772207d93..34135ac4105 100644 --- a/sys/ia64/include/elf.h +++ b/sys/ia64/include/elf.h @@ -95,6 +95,7 @@ __ElfType(Auxinfo); #define AT_NCPUS 19 /* Number of CPUs. */ #define AT_PAGESIZES 20 /* Pagesizes. */ #define AT_PAGESIZESLEN 21 /* Number of pagesizes. */ +#define AT_TIMEKEEP 22 /* Pointer to timehands. */ #define AT_STACKPROT 23 /* Initial stack protection. */ #define AT_COUNT 24 /* Count of defined aux entry types. */ diff --git a/sys/ia64/include/in_cksum.h b/sys/ia64/include/in_cksum.h index 09920062a0a..4fe1b4023f7 100644 --- a/sys/ia64/include/in_cksum.h +++ b/sys/ia64/include/in_cksum.h @@ -39,6 +39,7 @@ #define in_cksum(m, len) in_cksum_skip(m, len, 0) +#if defined(IPVERSION) && (IPVERSION == 4) /* * It it useful to have an Internet checksum routine which is inlineable * and optimized specifically for the task of computing IP header checksums @@ -65,9 +66,12 @@ in_cksum_update(struct ip *ip) } while(0) #endif +#endif #ifdef _KERNEL +#if defined(IPVERSION) && (IPVERSION == 4) u_int in_cksum_hdr(const struct ip *ip); +#endif u_short in_addword(u_short sum, u_short b); u_short in_pseudo(u_int sum, u_int b, u_int c); u_short in_cksum_skip(struct mbuf *m, int len, int skip); diff --git a/sys/ia64/include/md_var.h b/sys/ia64/include/md_var.h index 82869362b8c..9c7638ed439 100644 --- a/sys/ia64/include/md_var.h +++ b/sys/ia64/include/md_var.h @@ -61,6 +61,7 @@ ia64_bsp_adjust(uint64_t bsp, int nslots) #ifdef _KERNEL struct _special; +struct pcpu; struct thread; struct trapframe; @@ -73,14 +74,14 @@ struct ia64_init_return { }; extern uint64_t ia64_lapic_addr; - -extern long Maxmem; +extern vm_paddr_t paddr_max; extern u_int busdma_swi_pending; void *acpi_find_table(const char *sig); void busdma_swi(void); int copyout_regstack(struct thread *, uint64_t *, uint64_t *); void cpu_mp_add(u_int, u_int, u_int); +void cpu_pcpu_setup(struct pcpu *, u_int, u_int); int do_ast(struct trapframe *); void ia32_trap(int, struct trapframe *); int ia64_count_cpus(void); @@ -93,6 +94,12 @@ int ia64_highfp_save(struct thread *); int ia64_highfp_save_ipi(void); struct ia64_init_return ia64_init(void); u_int ia64_itc_freq(void); +int ia64_physmem_add(vm_paddr_t, vm_size_t); +void *ia64_physmem_alloc(vm_size_t, vm_size_t); +int ia64_physmem_delete(vm_paddr_t, vm_size_t); +int ia64_physmem_fini(void); +int ia64_physmem_init(void); +int ia64_physmem_track(vm_paddr_t, vm_size_t); void ia64_probe_sapics(void); void ia64_sync_icache(vm_offset_t, vm_size_t); void interrupt(struct trapframe *); diff --git a/sys/ia64/include/param.h b/sys/ia64/include/param.h index d996441f624..aa837d8c5ec 100644 --- a/sys/ia64/include/param.h +++ b/sys/ia64/include/param.h @@ -110,9 +110,6 @@ #define atop(x) ((unsigned long)(x) >> PAGE_SHIFT) #define ptoa(x) ((unsigned long)(x) << PAGE_SHIFT) -#define ia64_btop(x) ((unsigned long)(x) >> PAGE_SHIFT) -#define ia64_ptob(x) ((unsigned long)(x) << PAGE_SHIFT) - #define pgtok(x) ((x) * (PAGE_SIZE / 1024)) #endif /* !_IA64_INCLUDE_PARAM_H_ */ diff --git a/sys/ia64/include/pcb.h b/sys/ia64/include/pcb.h index 59334bfa5d8..dac7169b3f4 100644 --- a/sys/ia64/include/pcb.h +++ b/sys/ia64/include/pcb.h @@ -65,10 +65,10 @@ struct trapframe; void makectx(struct trapframe *, struct pcb *); void restorectx(struct pcb *) __dead2; -int swapctx(struct pcb *old, struct pcb *new); +int swapctx(struct pcb *old, struct pcb *new) __returns_twice; void ia32_restorectx(struct pcb *); -void ia32_savectx(struct pcb *); +void ia32_savectx(struct pcb *) __returns_twice; #endif diff --git a/sys/ia64/include/pmap.h b/sys/ia64/include/pmap.h index 2b89df0e250..3c4539f6d14 100644 --- a/sys/ia64/include/pmap.h +++ b/sys/ia64/include/pmap.h @@ -118,6 +118,7 @@ extern int pmap_vhpt_log2size; #define pmap_page_get_memattr(m) ((m)->md.memattr) #define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list)) +#define pmap_page_is_write_mapped(m) (((m)->aflags & PGA_WRITEABLE) != 0) #define pmap_mapbios(pa, sz) pmap_mapdev(pa, sz) #define pmap_unmapbios(va, sz) pmap_unmapdev(va, sz) diff --git a/sys/ia64/include/vdso.h b/sys/ia64/include/vdso.h new file mode 100644 index 00000000000..4571daa299d --- /dev/null +++ b/sys/ia64/include/vdso.h @@ -0,0 +1,41 @@ +/*- + * Copyright 2012 Konstantin Belousov . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _IA64_VDSO_H +#define _IA64_VDSO_H + +#define VDSO_TIMEHANDS_MD \ + uint32_t th_res[8]; + +#ifdef _KERNEL +#ifdef COMPAT_FREEBSD32 + +#define VDSO_TIMEHANDS_MD32 VDSO_TIMEHANDS_MD + +#endif +#endif +#endif diff --git a/sys/kern/capabilities.conf b/sys/kern/capabilities.conf index 4a62643623e..82eeb07ebe2 100644 --- a/sys/kern/capabilities.conf +++ b/sys/kern/capabilities.conf @@ -445,13 +445,17 @@ olio_listio faccessat fstatat fchmodat +fchownat futimesat +linkat mkdirat -rmdirat mkfifoat mknodat openat +readlinkat renameat +symlinkat +unlinkat ## ## Allow entry into open(2). This system call will fail, since access to the diff --git a/sys/kern/dtio_kdtrace.c b/sys/kern/dtio_kdtrace.c new file mode 100644 index 00000000000..cfac3700edb --- /dev/null +++ b/sys/kern/dtio_kdtrace.c @@ -0,0 +1,232 @@ +/*- + * Copyright (c) 2012 Advanced Computing Technologies LLC + * Written by George Neville-Neil gnn@freebsd.org + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include +#include "../sys/dtrace_bsd.h" + + +static int dtio_unload(void); +static void dtio_getargdesc(void *, dtrace_id_t, void *, + dtrace_argdesc_t *); +static void dtio_provide(void *, dtrace_probedesc_t *); +static void dtio_destroy(void *, dtrace_id_t, void *); +static void dtio_enable(void *, dtrace_id_t, void *); +static void dtio_disable(void *, dtrace_id_t, void *); +static void dtio_load(void *); + +static dtrace_pattr_t dtio_attr = { +{ DTRACE_STABILITY_STABLE, DTRACE_STABILITY_STABLE, DTRACE_CLASS_COMMON }, +{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, +{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, +{ DTRACE_STABILITY_STABLE, DTRACE_STABILITY_STABLE, DTRACE_CLASS_COMMON }, +{ DTRACE_STABILITY_STABLE, DTRACE_STABILITY_STABLE, DTRACE_CLASS_COMMON }, +}; + +static char *genunix = "genunix"; + +/* + * Name strings. + */ +static char *dtio_start_str = "start"; +static char *dtio_done_str = "done"; +static char *dtio_wait_start_str = "wait-start"; +static char *dtio_wait_done_str = "wait-done"; + +static dtrace_pops_t dtio_pops = { + dtio_provide, + NULL, + dtio_enable, + dtio_disable, + NULL, + NULL, + dtio_getargdesc, + NULL, + NULL, + dtio_destroy +}; + +static dtrace_provider_id_t dtio_id; + +extern uint32_t dtio_start_id; +extern uint32_t dtio_done_id; +extern uint32_t dtio_wait_start_id; +extern uint32_t dtio_wait_done_id; + +static void +dtio_getargdesc(void *arg, dtrace_id_t id, void *parg, + dtrace_argdesc_t *desc) +{ + const char *p = NULL; + + switch (desc->dtargd_ndx) { + case 0: + p = "struct bio *"; + break; + case 1: + p = "struct devstat *"; + break; + default: + desc->dtargd_ndx = DTRACE_ARGNONE; + } + + if (p != NULL) + strlcpy(desc->dtargd_native, p, sizeof(desc->dtargd_native)); +} + +static void +dtio_provide(void *arg, dtrace_probedesc_t *desc) +{ + if (desc != NULL) + return; + + if (dtrace_probe_lookup(dtio_id, genunix, NULL, + dtio_start_str) == 0) { + dtio_start_id = dtrace_probe_create(dtio_id, genunix, NULL, + dtio_start_str, 0, NULL); + } + if (dtrace_probe_lookup(dtio_id, genunix, NULL, dtio_done_str) == 0) { + dtio_done_id = dtrace_probe_create(dtio_id, genunix, NULL, + dtio_done_str, 0, NULL); + } + if (dtrace_probe_lookup(dtio_id, genunix, NULL, + dtio_wait_start_str) == 0) { + dtio_wait_start_id = dtrace_probe_create(dtio_id, genunix, + NULL, + dtio_wait_start_str, + 0, NULL); + } + if (dtrace_probe_lookup(dtio_id, genunix, NULL, + dtio_wait_done_str) == 0) { + dtio_wait_done_id = dtrace_probe_create(dtio_id, genunix, NULL, + dtio_wait_done_str, 0, NULL); + } + +} + +static void +dtio_destroy(void *arg, dtrace_id_t id, void *parg) +{ +} + +static void +dtio_enable(void *arg, dtrace_id_t id, void *parg) +{ + if (id == dtio_start_id) + dtrace_io_start_probe = + (dtrace_io_start_probe_func_t)dtrace_probe; + else if (id == dtio_done_id) + dtrace_io_done_probe = + (dtrace_io_done_probe_func_t)dtrace_probe; + else if (id == dtio_wait_start_id) + dtrace_io_wait_start_probe = + (dtrace_io_wait_start_probe_func_t)dtrace_probe; + else if (id == dtio_wait_done_id) + dtrace_io_wait_done_probe = + (dtrace_io_wait_done_probe_func_t)dtrace_probe; + else + printf("dtrace io provider: unknown ID\n"); + +} + +static void +dtio_disable(void *arg, dtrace_id_t id, void *parg) +{ + if (id == dtio_start_id) + dtrace_io_start_probe = NULL; + else if (id == dtio_done_id) + dtrace_io_done_probe = NULL; + else if (id == dtio_wait_start_id) + dtrace_io_wait_start_probe = NULL; + else if (id == dtio_wait_done_id) + dtrace_io_wait_done_probe = NULL; + else + printf("dtrace io provider: unknown ID\n"); + +} + +static void +dtio_load(void *dummy) +{ + if (dtrace_register("io", &dtio_attr, DTRACE_PRIV_USER, NULL, + &dtio_pops, NULL, &dtio_id) != 0) + return; +} + + +static int +dtio_unload() +{ + dtrace_io_start_probe = NULL; + dtrace_io_done_probe = NULL; + dtrace_io_wait_start_probe = NULL; + dtrace_io_wait_done_probe = NULL; + + return (dtrace_unregister(dtio_id)); +} + +static int +dtio_modevent(module_t mod __unused, int type, void *data __unused) +{ + int error = 0; + + switch (type) { + case MOD_LOAD: + break; + + case MOD_UNLOAD: + break; + + case MOD_SHUTDOWN: + break; + + default: + error = EOPNOTSUPP; + break; + } + + return (error); +} + +SYSINIT(dtio_load, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, + dtio_load, NULL); +SYSUNINIT(dtio_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, + dtio_unload, NULL); + +DEV_MODULE(dtio, dtio_modevent, NULL); +MODULE_VERSION(dtio, 1); +MODULE_DEPEND(dtio, dtrace, 1, 1, 1); +MODULE_DEPEND(dtio, opensolaris, 1, 1, 1); diff --git a/sys/kern/imgact_aout.c b/sys/kern/imgact_aout.c index 3908da7bd24..3ade6a22d34 100644 --- a/sys/kern/imgact_aout.c +++ b/sys/kern/imgact_aout.c @@ -174,9 +174,9 @@ exec_aout_imgact(struct image_params *imgp) * 0x64 for Linux, 0x86 for *BSD, 0x00 for BSDI. * NetBSD is in network byte order.. ugh. */ - if (((a_out->a_magic >> 16) & 0xff) != 0x86 && - ((a_out->a_magic >> 16) & 0xff) != 0 && - ((((int)ntohl(a_out->a_magic)) >> 16) & 0xff) != 0x86) + if (((a_out->a_midmag >> 16) & 0xff) != 0x86 && + ((a_out->a_midmag >> 16) & 0xff) != 0 && + ((((int)ntohl(a_out->a_midmag)) >> 16) & 0xff) != 0x86) return -1; /* @@ -184,7 +184,7 @@ exec_aout_imgact(struct image_params *imgp) * We do two cases: host byte order and network byte order * (for NetBSD compatibility) */ - switch ((int)(a_out->a_magic & 0xffff)) { + switch ((int)(a_out->a_midmag & 0xffff)) { case ZMAGIC: virtual_offset = 0; if (a_out->a_text) { @@ -203,7 +203,7 @@ exec_aout_imgact(struct image_params *imgp) break; default: /* NetBSD compatibility */ - switch ((int)(ntohl(a_out->a_magic) & 0xffff)) { + switch ((int)(ntohl(a_out->a_midmag) & 0xffff)) { case ZMAGIC: case QMAGIC: virtual_offset = PAGE_SIZE; diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index f9075265ea0..5d0f4941d9d 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -1011,6 +1011,10 @@ __elfN(freebsd_fixup)(register_t **stack_base, struct image_params *imgp) AUXARGS_ENTRY(pos, AT_PAGESIZES, imgp->pagesizes); AUXARGS_ENTRY(pos, AT_PAGESIZESLEN, imgp->pagesizeslen); } + if (imgp->sysent->sv_timekeep_base != 0) { + AUXARGS_ENTRY(pos, AT_TIMEKEEP, + imgp->sysent->sv_timekeep_base); + } AUXARGS_ENTRY(pos, AT_STACKPROT, imgp->sysent->sv_shared_page_obj != NULL && imgp->stack_prot != 0 ? imgp->stack_prot : imgp->sysent->sv_stackprot); diff --git a/sys/kern/imgact_gzip.c b/sys/kern/imgact_gzip.c index f61334a6292..1333abefb0f 100644 --- a/sys/kern/imgact_gzip.c +++ b/sys/kern/imgact_gzip.c @@ -161,7 +161,7 @@ do_aout_hdr(struct imgact_gzip * gz) * Set file/virtual offset based on a.out variant. We do two cases: * host byte order and network byte order (for NetBSD compatibility) */ - switch ((int) (gz->a_out.a_magic & 0xffff)) { + switch ((int) (gz->a_out.a_midmag & 0xffff)) { case ZMAGIC: gz->virtual_offset = 0; if (gz->a_out.a_text) { @@ -177,7 +177,7 @@ do_aout_hdr(struct imgact_gzip * gz) break; default: /* NetBSD compatibility */ - switch ((int) (ntohl(gz->a_out.a_magic) & 0xffff)) { + switch ((int) (ntohl(gz->a_out.a_midmag) & 0xffff)) { case ZMAGIC: case QMAGIC: gz->virtual_offset = PAGE_SIZE; diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index d6cd3d7b9b7..ba905e0957f 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -158,6 +158,24 @@ sysinit_add(struct sysinit **set, struct sysinit **set_end) newsysinit_end = newset + count; } +#if defined (DDB) && defined(VERBOSE_SYSINIT) +static const char * +symbol_name(vm_offset_t va, db_strategy_t strategy) +{ + const char *name; + c_db_sym_t sym; + db_expr_t offset; + + if (va == 0) + return (NULL); + sym = db_search_symbol(va, strategy, &offset); + if (offset != 0) + return (NULL); + db_symbol_values(sym, &name, NULL); + return (name); +} +#endif + /* * System startup; initialize the world, create process 0, mount root * filesystem, and fork to create init and pagedaemon. Most of the @@ -238,15 +256,16 @@ restart: } if (verbose) { #if defined(DDB) - const char *name; - c_db_sym_t sym; - db_expr_t offset; + const char *func, *data; - sym = db_search_symbol((vm_offset_t)(*sipp)->func, - DB_STGY_PROC, &offset); - db_symbol_values(sym, &name, NULL); - if (name != NULL) - printf(" %s(%p)... ", name, (*sipp)->udata); + func = symbol_name((vm_offset_t)(*sipp)->func, + DB_STGY_PROC); + data = symbol_name((vm_offset_t)(*sipp)->udata, + DB_STGY_ANY); + if (func != NULL && data != NULL) + printf(" %s(&%s)... ", func, data); + else if (func != NULL) + printf(" %s(%p)... ", func, (*sipp)->udata); else #endif printf(" %p(%p)... ", (*sipp)->func, diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index 7ace32607e6..4a4328ad761 100644 --- a/sys/kern/init_sysent.c +++ b/sys/kern/init_sysent.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/kern/syscalls.master 227691 2011-11-19 06:35:15Z ed + * created from FreeBSD: head/sys/kern/syscalls.master 236026 2012-05-25 21:50:48Z ed */ #include "opt_compat.h" @@ -525,19 +525,19 @@ struct sysent sysent[] = { { AS(cpuset_setaffinity_args), (sy_call_t *)sys_cpuset_setaffinity, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 488 = cpuset_setaffinity */ { AS(faccessat_args), (sy_call_t *)sys_faccessat, AUE_FACCESSAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 489 = faccessat */ { AS(fchmodat_args), (sy_call_t *)sys_fchmodat, AUE_FCHMODAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 490 = fchmodat */ - { AS(fchownat_args), (sy_call_t *)sys_fchownat, AUE_FCHOWNAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 491 = fchownat */ + { AS(fchownat_args), (sy_call_t *)sys_fchownat, AUE_FCHOWNAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 491 = fchownat */ { AS(fexecve_args), (sy_call_t *)sys_fexecve, AUE_FEXECVE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 492 = fexecve */ { AS(fstatat_args), (sy_call_t *)sys_fstatat, AUE_FSTATAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 493 = fstatat */ { AS(futimesat_args), (sy_call_t *)sys_futimesat, AUE_FUTIMESAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 494 = futimesat */ - { AS(linkat_args), (sy_call_t *)sys_linkat, AUE_LINKAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 495 = linkat */ + { AS(linkat_args), (sy_call_t *)sys_linkat, AUE_LINKAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 495 = linkat */ { AS(mkdirat_args), (sy_call_t *)sys_mkdirat, AUE_MKDIRAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 496 = mkdirat */ { AS(mkfifoat_args), (sy_call_t *)sys_mkfifoat, AUE_MKFIFOAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 497 = mkfifoat */ { AS(mknodat_args), (sy_call_t *)sys_mknodat, AUE_MKNODAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 498 = mknodat */ { AS(openat_args), (sy_call_t *)sys_openat, AUE_OPENAT_RWTC, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 499 = openat */ - { AS(readlinkat_args), (sy_call_t *)sys_readlinkat, AUE_READLINKAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 500 = readlinkat */ + { AS(readlinkat_args), (sy_call_t *)sys_readlinkat, AUE_READLINKAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 500 = readlinkat */ { AS(renameat_args), (sy_call_t *)sys_renameat, AUE_RENAMEAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 501 = renameat */ - { AS(symlinkat_args), (sy_call_t *)sys_symlinkat, AUE_SYMLINKAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 502 = symlinkat */ - { AS(unlinkat_args), (sy_call_t *)sys_unlinkat, AUE_UNLINKAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 503 = unlinkat */ + { AS(symlinkat_args), (sy_call_t *)sys_symlinkat, AUE_SYMLINKAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 502 = symlinkat */ + { AS(unlinkat_args), (sy_call_t *)sys_unlinkat, AUE_UNLINKAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 503 = unlinkat */ { AS(posix_openpt_args), (sy_call_t *)sys_posix_openpt, AUE_POSIX_OPENPT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 504 = posix_openpt */ { AS(gssd_syscall_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 505 = gssd_syscall */ { AS(jail_get_args), (sy_call_t *)sys_jail_get, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 506 = jail_get */ diff --git a/sys/kern/kern_acct.c b/sys/kern/kern_acct.c index 8e5479baf8b..fda217a045c 100644 --- a/sys/kern/kern_acct.c +++ b/sys/kern/kern_acct.c @@ -122,7 +122,7 @@ static uint32_t encode_timeval(struct timeval); static uint32_t encode_long(long); static void acctwatch(void); static void acct_thread(void *); -static int acct_disable(struct thread *); +static int acct_disable(struct thread *, int); /* * Accounting vnode pointer, saved vnode pointer, and flags for each. @@ -196,7 +196,7 @@ int sys_acct(struct thread *td, struct acct_args *uap) { struct nameidata nd; - int error, flags, vfslocked; + int error, flags, vfslocked, replacing; error = priv_check(td, PRIV_ACCT); if (error) @@ -245,6 +245,13 @@ sys_acct(struct thread *td, struct acct_args *uap) */ sx_xlock(&acct_sx); + /* + * Don't log spurious disable/enable messages if we are + * switching from one accounting file to another due to log + * rotation. + */ + replacing = (acct_vp != NULL && uap->path != NULL); + /* * If accounting was previously enabled, kill the old space-watcher, * close the file, and (if no new file was specified, leave). Reset @@ -254,7 +261,7 @@ sys_acct(struct thread *td, struct acct_args *uap) acct_suspended = 0; if (acct_vp != NULL) { vfslocked = VFS_LOCK_GIANT(acct_vp->v_mount); - error = acct_disable(td); + error = acct_disable(td, !replacing); VFS_UNLOCK_GIANT(vfslocked); } if (uap->path == NULL) { @@ -299,7 +306,8 @@ sys_acct(struct thread *td, struct acct_args *uap) } acct_configured = 1; sx_xunlock(&acct_sx); - log(LOG_NOTICE, "Accounting enabled\n"); + if (!replacing) + log(LOG_NOTICE, "Accounting enabled\n"); return (error); } @@ -308,7 +316,7 @@ sys_acct(struct thread *td, struct acct_args *uap) * our reference to the credential, and clearing the vnode's flags. */ static int -acct_disable(struct thread *td) +acct_disable(struct thread *td, int logging) { int error; @@ -319,7 +327,8 @@ acct_disable(struct thread *td) acct_vp = NULL; acct_cred = NULL; acct_flags = 0; - log(LOG_NOTICE, "Accounting disabled\n"); + if (logging) + log(LOG_NOTICE, "Accounting disabled\n"); return (error); } @@ -574,7 +583,7 @@ acctwatch(void) */ vfslocked = VFS_LOCK_GIANT(acct_vp->v_mount); if (acct_vp->v_type == VBAD) { - (void) acct_disable(NULL); + (void) acct_disable(NULL, 1); VFS_UNLOCK_GIANT(vfslocked); acct_state |= ACCT_EXITREQ; return; diff --git a/sys/kern/kern_clock.c b/sys/kern/kern_clock.c index 57dd632fe5d..5e10200a49a 100644 --- a/sys/kern/kern_clock.c +++ b/sys/kern/kern_clock.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include "opt_kdb.h" #include "opt_device_polling.h" #include "opt_hwpmc_hooks.h" +#include "opt_kdtrace.h" #include "opt_ntp.h" #include "opt_watchdog.h" @@ -56,6 +57,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -88,6 +90,9 @@ SYSINIT(clocks, SI_SUB_CLOCKS, SI_ORDER_FIRST, initclocks, NULL); /* Spin-lock protecting profiling statistics. */ static struct mtx time_lock; +SDT_PROVIDER_DECLARE(sched); +SDT_PROBE_DEFINE2(sched, , , tick, tick, "struct thread *", "struct proc *"); + static int sysctl_kern_cp_time(SYSCTL_HANDLER_ARGS) { @@ -760,6 +765,7 @@ statclock_cnt(int cnt, int usermode) ru->ru_maxrss = rss; KTR_POINT2(KTR_SCHED, "thread", sched_tdname(td), "statclock", "prio:%d", td->td_priority, "stathz:%d", (stathz)?stathz:hz); + SDT_PROBE2(sched, , , tick, td, td->td_proc); thread_lock_flags(td, MTX_QUIET); for ( ; cnt > 0; cnt--) sched_clock(td); diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index 461f008cb3f..31f4683e93c 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -993,9 +993,10 @@ make_dev_physpath_alias(int flags, struct cdev **cdev, struct cdev *pdev, max_parentpath_len = SPECNAMELEN - physpath_len - /*/*/1; parentpath_len = strlen(pdev->si_name); if (max_parentpath_len < parentpath_len) { - printf("make_dev_physpath_alias: WARNING - Unable to alias %s " - "to %s/%s - path too long\n", - pdev->si_name, physpath, pdev->si_name); + if (bootverbose) + printf("WARNING: Unable to alias %s " + "to %s/%s - path too long\n", + pdev->si_name, physpath, pdev->si_name); ret = ENAMETOOLONG; goto out; } diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 76c5db2876b..f8e3f3d076d 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -102,7 +102,7 @@ __FBSDID("$FreeBSD$"); static MALLOC_DEFINE(M_FILEDESC, "filedesc", "Open file descriptor table"); static MALLOC_DEFINE(M_FILEDESC_TO_LEADER, "filedesc_to_leader", - "file desc to leader structures"); + "file desc to leader structures"); static MALLOC_DEFINE(M_SIGIO, "sigio", "sigio structures"); MALLOC_DECLARE(M_FADVISE); @@ -114,20 +114,22 @@ static uma_zone_t file_zone; #define DUP_FIXED 0x1 /* Force fixed allocation */ #define DUP_FCNTL 0x2 /* fcntl()-style errors */ -static int do_dup(struct thread *td, int flags, int old, int new, - register_t *retval); -static int fd_first_free(struct filedesc *, int, int); -static int fd_last_used(struct filedesc *, int, int); -static void fdgrowtable(struct filedesc *, int); +static int closefp(struct filedesc *fdp, int fd, struct file *fp, + struct thread *td, int holdleaders); +static int do_dup(struct thread *td, int flags, int old, int new, + register_t *retval); +static int fd_first_free(struct filedesc *fdp, int low, int size); +static int fd_last_used(struct filedesc *fdp, int size); +static void fdgrowtable(struct filedesc *fdp, int nfd); static void fdunused(struct filedesc *fdp, int fd); static void fdused(struct filedesc *fdp, int fd); -static int fill_vnode_info(struct vnode *vp, struct kinfo_file *kif); -static int fill_socket_info(struct socket *so, struct kinfo_file *kif); -static int fill_pts_info(struct tty *tp, struct kinfo_file *kif); static int fill_pipe_info(struct pipe *pi, struct kinfo_file *kif); static int fill_procdesc_info(struct procdesc *pdp, - struct kinfo_file *kif); + struct kinfo_file *kif); +static int fill_pts_info(struct tty *tp, struct kinfo_file *kif); static int fill_shm_info(struct file *fp, struct kinfo_file *kif); +static int fill_socket_info(struct socket *so, struct kinfo_file *kif); +static int fill_vnode_info(struct vnode *vp, struct kinfo_file *kif); /* * A process is initially started out with NDFILE descriptors stored within @@ -181,14 +183,15 @@ struct filedesc0 { */ volatile int openfiles; /* actual number of open files */ struct mtx sigio_lock; /* mtx to protect pointers to sigio */ -void (*mq_fdclose)(struct thread *td, int fd, struct file *fp); +void (*mq_fdclose)(struct thread *td, int fd, struct file *fp); /* A mutex to protect the association between a proc and filedesc. */ -static struct mtx fdesc_mtx; +static struct mtx fdesc_mtx; /* - * Find the first zero bit in the given bitmap, starting at low and not - * exceeding size - 1. + * If low >= size, just return low. Otherwise find the first zero bit in the + * given bitmap, starting at low and not exceeding size - 1. Return size if + * not found. */ static int fd_first_free(struct filedesc *fdp, int low, int size) @@ -214,19 +217,16 @@ fd_first_free(struct filedesc *fdp, int low, int size) } /* - * Find the highest non-zero bit in the given bitmap, starting at low and - * not exceeding size - 1. + * Find the highest non-zero bit in the given bitmap, starting at 0 and + * not exceeding size - 1. Return -1 if not found. */ static int -fd_last_used(struct filedesc *fdp, int low, int size) +fd_last_used(struct filedesc *fdp, int size) { NDSLOTTYPE *map = fdp->fd_map; NDSLOTTYPE mask; int off, minoff; - if (low >= size) - return (-1); - off = NDSLOT(size); if (size % NDENTRIES) { mask = ~(~(NDSLOTTYPE)0 << (size % NDENTRIES)); @@ -234,17 +234,21 @@ fd_last_used(struct filedesc *fdp, int low, int size) return (off * NDENTRIES + flsl(mask) - 1); --off; } - for (minoff = NDSLOT(low); off >= minoff; --off) + for (minoff = NDSLOT(0); off >= minoff; --off) if (map[off] != 0) return (off * NDENTRIES + flsl(map[off]) - 1); - return (low - 1); + return (-1); } static int fdisused(struct filedesc *fdp, int fd) { - KASSERT(fd >= 0 && fd < fdp->fd_nfiles, - ("file descriptor %d out of range (0, %d)", fd, fdp->fd_nfiles)); + + FILEDESC_LOCK_ASSERT(fdp); + + KASSERT(fd >= 0 && fd < fdp->fd_nfiles, + ("file descriptor %d out of range (0, %d)", fd, fdp->fd_nfiles)); + return ((fdp->fd_map[NDSLOT(fd)] & NDBIT(fd)) != 0); } @@ -256,8 +260,8 @@ fdused(struct filedesc *fdp, int fd) { FILEDESC_XLOCK_ASSERT(fdp); - KASSERT(!fdisused(fdp, fd), - ("fd already used")); + + KASSERT(!fdisused(fdp, fd), ("fd=%d is already used", fd)); fdp->fd_map[NDSLOT(fd)] |= NDBIT(fd); if (fd > fdp->fd_lastfile) @@ -274,16 +278,15 @@ fdunused(struct filedesc *fdp, int fd) { FILEDESC_XLOCK_ASSERT(fdp); - KASSERT(fdisused(fdp, fd), - ("fd is already unused")); - KASSERT(fdp->fd_ofiles[fd] == NULL, - ("fd is still in use")); + + KASSERT(fdisused(fdp, fd), ("fd=%d is already unused", fd)); + KASSERT(fdp->fd_ofiles[fd] == NULL, ("fd=%d is still in use", fd)); fdp->fd_map[NDSLOT(fd)] &= ~NDBIT(fd); if (fd < fdp->fd_freefile) fdp->fd_freefile = fd; if (fd == fdp->fd_lastfile) - fdp->fd_lastfile = fd_last_used(fdp, 0, fd); + fdp->fd_lastfile = fd_last_used(fdp, fd); } /* @@ -427,23 +430,13 @@ sys_fcntl(struct thread *td, struct fcntl_args *uap) return (error); } -static inline struct file * -fdtofp(int fd, struct filedesc *fdp) -{ - struct file *fp; - - FILEDESC_LOCK_ASSERT(fdp); - if ((unsigned)fd >= fdp->fd_nfiles || - (fp = fdp->fd_ofiles[fd]) == NULL) - return (NULL); - return (fp); -} - static inline int fdunwrap(int fd, cap_rights_t rights, struct filedesc *fdp, struct file **fpp) { - *fpp = fdtofp(fd, fdp); + FILEDESC_LOCK_ASSERT(fdp); + + *fpp = fget_locked(fdp, fd); if (*fpp == NULL) return (EBADF); @@ -472,6 +465,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) int vfslocked; u_int old, new; uint64_t bsize; + off_t foffset; vfslocked = 0; error = 0; @@ -492,7 +486,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) case F_GETFD: FILEDESC_SLOCK(fdp); - if ((fp = fdtofp(fd, fdp)) == NULL) { + if ((fp = fget_locked(fdp, fd)) == NULL) { FILEDESC_SUNLOCK(fdp); error = EBADF; break; @@ -504,7 +498,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) case F_SETFD: FILEDESC_XLOCK(fdp); - if ((fp = fdtofp(fd, fdp)) == NULL) { + if ((fp = fget_locked(fdp, fd)) == NULL) { FILEDESC_XUNLOCK(fdp); error = EBADF; break; @@ -613,14 +607,15 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) } flp = (struct flock *)arg; if (flp->l_whence == SEEK_CUR) { - if (fp->f_offset < 0 || + foffset = foffset_get(fp); + if (foffset < 0 || (flp->l_start > 0 && - fp->f_offset > OFF_MAX - flp->l_start)) { + foffset > OFF_MAX - flp->l_start)) { FILEDESC_SUNLOCK(fdp); error = EOVERFLOW; break; } - flp->l_start += fp->f_offset; + flp->l_start += foffset; } /* @@ -675,10 +670,30 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) } VFS_UNLOCK_GIANT(vfslocked); vfslocked = 0; - /* Check for race with close */ + if (error != 0 || flp->l_type == F_UNLCK || + flp->l_type == F_UNLCKSYS) { + fdrop(fp, td); + break; + } + + /* + * Check for a race with close. + * + * The vnode is now advisory locked (or unlocked, but this case + * is not really important) as the caller requested. + * We had to drop the filedesc lock, so we need to recheck if + * the descriptor is still valid, because if it was closed + * in the meantime we need to remove advisory lock from the + * vnode - close on any descriptor leading to an advisory + * locked vnode, removes that lock. + * We will return 0 on purpose in that case, as the result of + * successful advisory lock might have been externally visible + * already. This is fine - effectively we pretend to the caller + * that the closing thread was a bit slower and that the + * advisory lock succeeded before the close. + */ FILEDESC_SLOCK(fdp); - if ((unsigned) fd >= fdp->fd_nfiles || - fp != fdp->fd_ofiles[fd]) { + if (fget_locked(fdp, fd) != fp) { FILEDESC_SUNLOCK(fdp); flp->l_whence = SEEK_SET; flp->l_start = 0; @@ -686,7 +701,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) flp->l_type = F_UNLCK; vfslocked = VFS_LOCK_GIANT(vp->v_mount); (void) VOP_ADVLOCK(vp, (caddr_t)p->p_leader, - F_UNLCK, flp, F_POSIX); + F_UNLCK, flp, F_POSIX); VFS_UNLOCK_GIANT(vfslocked); vfslocked = 0; } else @@ -714,15 +729,16 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) break; } if (flp->l_whence == SEEK_CUR) { + foffset = foffset_get(fp); if ((flp->l_start > 0 && - fp->f_offset > OFF_MAX - flp->l_start) || + foffset > OFF_MAX - flp->l_start) || (flp->l_start < 0 && - fp->f_offset < OFF_MIN - flp->l_start)) { + foffset < OFF_MIN - flp->l_start)) { FILEDESC_SUNLOCK(fdp); error = EOVERFLOW; break; } - flp->l_start += fp->f_offset; + flp->l_start += foffset; } /* * VOP_ADVLOCK() may block. @@ -743,7 +759,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) /* FALLTHROUGH */ case F_READAHEAD: FILEDESC_SLOCK(fdp); - if ((fp = fdtofp(fd, fdp)) == NULL) { + if ((fp = fget_locked(fdp, fd)) == NULL) { FILEDESC_SUNLOCK(fdp); error = EBADF; break; @@ -799,7 +815,7 @@ do_dup(struct thread *td, int flags, int old, int new, struct proc *p; struct file *fp; struct file *delfp; - int error, holdleaders, maxfd; + int error, maxfd; p = td->td_proc; fdp = p->p_fd; @@ -820,7 +836,7 @@ do_dup(struct thread *td, int flags, int old, int new, return (flags & DUP_FCNTL ? EINVAL : EBADF); FILEDESC_XLOCK(fdp); - if (old >= fdp->fd_nfiles || fdp->fd_ofiles[old] == NULL) { + if (fget_locked(fdp, old) == NULL) { FILEDESC_XUNLOCK(fdp); return (EBADF); } @@ -871,44 +887,12 @@ do_dup(struct thread *td, int flags, int old, int new, } } - /* - * If the old file changed out from under us then treat it as a - * bad file descriptor. Userland should do its own locking to - * avoid this case. - */ - if (fdp->fd_ofiles[old] != fp) { - /* we've allocated a descriptor which we won't use */ - if (fdp->fd_ofiles[new] == NULL) - fdunused(fdp, new); - FILEDESC_XUNLOCK(fdp); - fdrop(fp, td); - return (EBADF); - } - KASSERT(old != new, - ("new fd is same as old")); + KASSERT(fp == fdp->fd_ofiles[old], ("old fd has been modified")); + KASSERT(old != new, ("new fd is same as old")); - /* - * Save info on the descriptor being overwritten. We cannot close - * it without introducing an ownership race for the slot, since we - * need to drop the filedesc lock to call closef(). - * - * XXX this duplicates parts of close(). - */ delfp = fdp->fd_ofiles[new]; - holdleaders = 0; - if (delfp != NULL) { - if (td->td_proc->p_fdtol != NULL) { - /* - * Ask fdfree() to sleep to ensure that all relevant - * process leaders can be traversed in closef(). - */ - fdp->fd_holdleaderscount++; - holdleaders = 1; - } - } - /* - * Duplicate the source descriptor + * Duplicate the source descriptor. */ fdp->fd_ofiles[new] = fp; fdp->fd_ofileflags[new] = fdp->fd_ofileflags[old] &~ UF_EXCLOSE; @@ -916,32 +900,13 @@ do_dup(struct thread *td, int flags, int old, int new, fdp->fd_lastfile = new; *retval = new; - /* - * If we dup'd over a valid file, we now own the reference to it - * and must dispose of it using closef() semantics (as if a - * close() were performed on it). - * - * XXX this duplicates parts of close(). - */ if (delfp != NULL) { - knote_fdclose(td, new); - if (delfp->f_type == DTYPE_MQUEUE) - mq_fdclose(td, new, delfp); - FILEDESC_XUNLOCK(fdp); - (void) closef(delfp, td); - if (holdleaders) { - FILEDESC_XLOCK(fdp); - fdp->fd_holdleaderscount--; - if (fdp->fd_holdleaderscount == 0 && - fdp->fd_holdleaderswakeup != 0) { - fdp->fd_holdleaderswakeup = 0; - wakeup(&fdp->fd_holdleaderscount); - } - FILEDESC_XUNLOCK(fdp); - } + (void) closefp(fdp, new, delfp, td, 1); + /* closefp() drops the FILEDESC lock for us. */ } else { FILEDESC_XUNLOCK(fdp); } + return (0); } @@ -1165,55 +1130,27 @@ fgetown(sigiop) } /* - * Close a file descriptor. + * Function drops the filedesc lock on return. */ -#ifndef _SYS_SYSPROTO_H_ -struct close_args { - int fd; -}; -#endif -/* ARGSUSED */ -int -sys_close(td, uap) - struct thread *td; - struct close_args *uap; +static int +closefp(struct filedesc *fdp, int fd, struct file *fp, struct thread *td, + int holdleaders) { - - return (kern_close(td, uap->fd)); -} - -int -kern_close(td, fd) - struct thread *td; - int fd; -{ - struct filedesc *fdp; - struct file *fp, *fp_object; + struct file *fp_object; int error; - int holdleaders; - error = 0; - holdleaders = 0; - fdp = td->td_proc->p_fd; + FILEDESC_XLOCK_ASSERT(fdp); - AUDIT_SYSCLOSE(td, fd); - - FILEDESC_XLOCK(fdp); - if ((unsigned)fd >= fdp->fd_nfiles || - (fp = fdp->fd_ofiles[fd]) == NULL) { - FILEDESC_XUNLOCK(fdp); - return (EBADF); - } - fdp->fd_ofiles[fd] = NULL; - fdp->fd_ofileflags[fd] = 0; - fdunused(fdp, fd); - if (td->td_proc->p_fdtol != NULL) { - /* - * Ask fdfree() to sleep to ensure that all relevant - * process leaders can be traversed in closef(). - */ - fdp->fd_holdleaderscount++; - holdleaders = 1; + if (holdleaders) { + if (td->td_proc->p_fdtol != NULL) { + /* + * Ask fdfree() to sleep to ensure that all relevant + * process leaders can be traversed in closef(). + */ + fdp->fd_holdleaderscount++; + } else { + holdleaders = 0; + } } /* @@ -1247,6 +1184,49 @@ kern_close(td, fd) return (error); } +/* + * Close a file descriptor. + */ +#ifndef _SYS_SYSPROTO_H_ +struct close_args { + int fd; +}; +#endif +/* ARGSUSED */ +int +sys_close(td, uap) + struct thread *td; + struct close_args *uap; +{ + + return (kern_close(td, uap->fd)); +} + +int +kern_close(td, fd) + struct thread *td; + int fd; +{ + struct filedesc *fdp; + struct file *fp; + + fdp = td->td_proc->p_fd; + + AUDIT_SYSCLOSE(td, fd); + + FILEDESC_XLOCK(fdp); + if ((fp = fget_locked(fdp, fd)) == NULL) { + FILEDESC_XUNLOCK(fdp); + return (EBADF); + } + fdp->fd_ofiles[fd] = NULL; + fdp->fd_ofileflags[fd] = 0; + fdunused(fdp, fd); + + /* closefp() drops the FILEDESC lock for us. */ + return (closefp(fdp, fd, fp, td, 1)); +} + /* * Close open file descriptors. */ @@ -1407,6 +1387,7 @@ sys_fpathconf(struct thread *td, struct fpathconf_args *uap) vp = fp->f_vnode; if (vp != NULL) { int vfslocked; + vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); error = VOP_PATHCONF(vp, uap->name, td->td_retval); @@ -1417,7 +1398,7 @@ sys_fpathconf(struct thread *td, struct fpathconf_args *uap) error = EINVAL; } else { td->td_retval[0] = PIPE_BUF; - error = 0; + error = 0; } } else { error = EOPNOTSUPP; @@ -1428,9 +1409,7 @@ out: } /* - * Grow the file table to accomodate (at least) nfd descriptors. This may - * block and drop the filedesc lock, but it will reacquire it before - * returning. + * Grow the file table to accomodate (at least) nfd descriptors. */ static void fdgrowtable(struct filedesc *fdp, int nfd) @@ -1456,7 +1435,6 @@ fdgrowtable(struct filedesc *fdp, int nfd) return; /* allocate a new table and (if required) new bitmaps */ - FILEDESC_XUNLOCK(fdp); ntable = malloc((nnfiles * OFILESIZE) + sizeof(struct freetable), M_FILEDESC, M_ZERO | M_WAITOK); nfileflags = (char *)&ntable[nnfiles]; @@ -1465,20 +1443,7 @@ fdgrowtable(struct filedesc *fdp, int nfd) M_FILEDESC, M_ZERO | M_WAITOK); else nmap = NULL; - FILEDESC_XLOCK(fdp); - /* - * We now have new tables ready to go. Since we dropped the - * filedesc lock to call malloc(), watch out for a race. - */ - onfiles = fdp->fd_nfiles; - if (onfiles >= nnfiles) { - /* we lost the race, but that's OK */ - free(ntable, M_FILEDESC); - if (nmap != NULL) - free(nmap, M_FILEDESC); - return; - } bcopy(fdp->fd_ofiles, ntable, onfiles * sizeof(*ntable)); bcopy(fdp->fd_ofileflags, nfileflags, onfiles); otable = fdp->fd_ofiles; @@ -1512,7 +1477,7 @@ fdalloc(struct thread *td, int minfd, int *result) { struct proc *p = td->td_proc; struct filedesc *fdp = p->p_fd; - int fd = -1, maxfd; + int fd = -1, maxfd, allocfd; #ifdef RACCT int error; #endif @@ -1527,36 +1492,38 @@ fdalloc(struct thread *td, int minfd, int *result) PROC_UNLOCK(p); /* - * Search the bitmap for a free descriptor. If none is found, try - * to grow the file table. Keep at it until we either get a file - * descriptor or run into process or system limits; fdgrowtable() - * may drop the filedesc lock, so we're in a race. + * Search the bitmap for a free descriptor starting at minfd. + * If none is found, grow the file table. */ - for (;;) { - fd = fd_first_free(fdp, minfd, fdp->fd_nfiles); - if (fd >= maxfd) - return (EMFILE); - if (fd < fdp->fd_nfiles) - break; + fd = fd_first_free(fdp, minfd, fdp->fd_nfiles); + if (fd >= maxfd) + return (EMFILE); + if (fd >= fdp->fd_nfiles) { + allocfd = min(fd * 2, maxfd); #ifdef RACCT PROC_LOCK(p); - error = racct_set(p, RACCT_NOFILE, min(fdp->fd_nfiles * 2, maxfd)); + error = racct_set(p, RACCT_NOFILE, allocfd); PROC_UNLOCK(p); if (error != 0) return (EMFILE); #endif - fdgrowtable(fdp, min(fdp->fd_nfiles * 2, maxfd)); + /* + * fd is already equal to first free descriptor >= minfd, so + * we only need to grow the table and we are done. + */ + fdgrowtable(fdp, allocfd); } /* * Perform some sanity checks, then mark the file descriptor as * used and return it to the caller. */ + KASSERT(fd >= 0 && fd < min(maxfd, fdp->fd_nfiles), + ("invalid descriptor %d", fd)); KASSERT(!fdisused(fdp, fd), ("fd_first_free() returned non-free descriptor")); - KASSERT(fdp->fd_ofiles[fd] == NULL, - ("free descriptor isn't")); - fdp->fd_ofileflags[fd] = 0; /* XXX needed? */ + KASSERT(fdp->fd_ofiles[fd] == NULL, ("file descriptor isn't free")); + KASSERT(fdp->fd_ofileflags[fd] == 0, ("file flags are set")); fdused(fdp, fd); *result = fd; return (0); @@ -1571,7 +1538,6 @@ fdavail(struct thread *td, int n) { struct proc *p = td->td_proc; struct filedesc *fdp = td->td_proc->p_fd; - struct file **fpp; int i, lim, last; FILEDESC_LOCK_ASSERT(fdp); @@ -1587,9 +1553,8 @@ fdavail(struct thread *td, int n) if ((i = lim - fdp->fd_nfiles) > 0 && (n -= i) <= 0) return (1); last = min(fdp->fd_nfiles, lim); - fpp = &fdp->fd_ofiles[fdp->fd_freefile]; - for (i = last - fdp->fd_freefile; --i >= 0; fpp++) { - if (*fpp == NULL && --n <= 0) + for (i = fdp->fd_freefile; i < last; i++) { + if (fdp->fd_ofiles[i] == NULL && --n <= 0) return (1); } return (0); @@ -1848,7 +1813,6 @@ void fdfree(struct thread *td) { struct filedesc *fdp; - struct file **fpp; int i, locked; struct filedesc_to_leader *fdtol; struct file *fp; @@ -1875,13 +1839,10 @@ fdfree(struct thread *td) fdtol->fdl_refcount)); if (fdtol->fdl_refcount == 1 && (td->td_proc->p_leader->p_flag & P_ADVLOCK) != 0) { - for (i = 0, fpp = fdp->fd_ofiles; - i <= fdp->fd_lastfile; - i++, fpp++) { - if (*fpp == NULL || - (*fpp)->f_type != DTYPE_VNODE) + for (i = 0; i <= fdp->fd_lastfile; i++) { + fp = fdp->fd_ofiles[i]; + if (fp == NULL || fp->f_type != DTYPE_VNODE) continue; - fp = *fpp; fhold(fp); FILEDESC_XUNLOCK(fdp); lf.l_whence = SEEK_SET; @@ -1891,15 +1852,11 @@ fdfree(struct thread *td) vp = fp->f_vnode; locked = VFS_LOCK_GIANT(vp->v_mount); (void) VOP_ADVLOCK(vp, - (caddr_t)td->td_proc-> - p_leader, - F_UNLCK, - &lf, - F_POSIX); + (caddr_t)td->td_proc->p_leader, F_UNLCK, + &lf, F_POSIX); VFS_UNLOCK_GIANT(locked); FILEDESC_XLOCK(fdp); fdrop(fp, td); - fpp = fdp->fd_ofiles + i; } } retry: @@ -1944,12 +1901,11 @@ fdfree(struct thread *td) if (i > 0) return; - fpp = fdp->fd_ofiles; - for (i = fdp->fd_lastfile; i-- >= 0; fpp++) { - if (*fpp) { + for (i = 0; i <= fdp->fd_lastfile; i++) { + fp = fdp->fd_ofiles[i]; + if (fp != NULL) { FILEDESC_XLOCK(fdp); - fp = *fpp; - *fpp = NULL; + fdp->fd_ofiles[i] = NULL; FILEDESC_XUNLOCK(fdp); (void) closef(fp, td); } @@ -2086,6 +2042,7 @@ void fdcloseexec(struct thread *td) { struct filedesc *fdp; + struct file *fp; int i; /* Certain daemons might not have file descriptors. */ @@ -2093,31 +2050,20 @@ fdcloseexec(struct thread *td) if (fdp == NULL) return; - FILEDESC_XLOCK(fdp); - /* * We cannot cache fd_ofiles or fd_ofileflags since operations * may block and rip them out from under us. */ + FILEDESC_XLOCK(fdp); for (i = 0; i <= fdp->fd_lastfile; i++) { - if (fdp->fd_ofiles[i] != NULL && - (fdp->fd_ofiles[i]->f_type == DTYPE_MQUEUE || + fp = fdp->fd_ofiles[i]; + if (fp != NULL && (fp->f_type == DTYPE_MQUEUE || (fdp->fd_ofileflags[i] & UF_EXCLOSE))) { - struct file *fp; - - knote_fdclose(td, i); - /* - * NULL-out descriptor prior to close to avoid - * a race while close blocks. - */ - fp = fdp->fd_ofiles[i]; fdp->fd_ofiles[i] = NULL; fdp->fd_ofileflags[i] = 0; fdunused(fdp, i); - if (fp->f_type == DTYPE_MQUEUE) - mq_fdclose(td, i, fp); - FILEDESC_XUNLOCK(fdp); - (void) closef(fp, td); + (void) closefp(fdp, i, fp, td, 0); + /* closefp() drops the FILEDESC lock. */ FILEDESC_XLOCK(fdp); } } @@ -2198,7 +2144,7 @@ closef(struct file *fp, struct thread *td) * node, not the capability itself. */ (void)cap_funwrap(fp, 0, &fp_object); - if ((fp_object->f_type == DTYPE_VNODE) && (td != NULL)) { + if (fp_object->f_type == DTYPE_VNODE && td != NULL) { int vfslocked; vp = fp_object->f_vnode; @@ -2209,7 +2155,7 @@ closef(struct file *fp, struct thread *td) lf.l_len = 0; lf.l_type = F_UNLCK; (void) VOP_ADVLOCK(vp, (caddr_t)td->td_proc->p_leader, - F_UNLCK, &lf, F_POSIX); + F_UNLCK, &lf, F_POSIX); } fdtol = td->td_proc->p_fdtol; if (fdtol != NULL) { @@ -2233,8 +2179,8 @@ closef(struct file *fp, struct thread *td) lf.l_type = F_UNLCK; vp = fp_object->f_vnode; (void) VOP_ADVLOCK(vp, - (caddr_t)fdtol->fdl_leader, - F_UNLCK, &lf, F_POSIX); + (caddr_t)fdtol->fdl_leader, F_UNLCK, &lf, + F_POSIX); FILEDESC_XLOCK(fdp); fdtol->fdl_holdcount--; if (fdtol->fdl_holdcount == 0 && @@ -2329,8 +2275,8 @@ _fget(struct thread *td, int fd, struct file **fpp, int flags, struct file *fp; #ifdef CAPABILITIES struct file *fp_fromcap; - int error; #endif + int error; *fpp = NULL; if (td == NULL || (fdp = td->td_proc->p_fd) == NULL) @@ -2369,7 +2315,7 @@ _fget(struct thread *td, int fd, struct file **fpp, int flags, else error = cap_funwrap_mmap(fp, needrights, maxprotp, &fp_fromcap); - if (error) { + if (error != 0) { fdrop(fp, td); return (error); } @@ -2394,14 +2340,30 @@ _fget(struct thread *td, int fd, struct file **fpp, int flags, /* * FREAD and FWRITE failure return EBADF as per POSIX. - * - * Only one flag, or 0, may be specified. */ - if ((flags == FREAD && (fp->f_flag & FREAD) == 0) || - (flags == FWRITE && (fp->f_flag & FWRITE) == 0)) { - fdrop(fp, td); - return (EBADF); + error = 0; + switch (flags) { + case FREAD: + case FWRITE: + if ((fp->f_flag & flags) == 0) + error = EBADF; + break; + case FEXEC: + if ((fp->f_flag & (FREAD | FEXEC)) == 0 || + ((fp->f_flag & FWRITE) != 0)) + error = EBADF; + break; + case 0: + break; + default: + KASSERT(0, ("wrong flags")); } + + if (error != 0) { + fdrop(fp, td); + return (error); + } + *fpp = fp; return (0); } @@ -2498,6 +2460,13 @@ fgetvp_read(struct thread *td, int fd, cap_rights_t rights, struct vnode **vpp) return (_fgetvp(td, fd, FREAD, rights, NULL, vpp)); } +int +fgetvp_exec(struct thread *td, int fd, cap_rights_t rights, struct vnode **vpp) +{ + + return (_fgetvp(td, fd, FEXEC, rights, NULL, vpp)); +} + #ifdef notyet int fgetvp_write(struct thread *td, int fd, cap_rights_t rights, @@ -2647,10 +2616,13 @@ done2: * Duplicate the specified descriptor to a free descriptor. */ int -dupfdopen(struct thread *td, struct filedesc *fdp, int indx, int dfd, int mode, int error) +dupfdopen(struct thread *td, struct filedesc *fdp, int dfd, int mode, int openerror, int *indxp) { - struct file *wfp; struct file *fp; + int error, indx; + + KASSERT(openerror == ENODEV || openerror == ENXIO, + ("unexpected error %d in %s", openerror, __func__)); /* * If the to-be-dup'd fd number is greater than the allowed number @@ -2658,12 +2630,17 @@ dupfdopen(struct thread *td, struct filedesc *fdp, int indx, int dfd, int mode, * closed, then reject. */ FILEDESC_XLOCK(fdp); - if (dfd < 0 || dfd >= fdp->fd_nfiles || - (wfp = fdp->fd_ofiles[dfd]) == NULL) { + if ((fp = fget_locked(fdp, dfd)) == NULL) { FILEDESC_XUNLOCK(fdp); return (EBADF); } + error = fdalloc(td, 0, &indx); + if (error != 0) { + FILEDESC_XUNLOCK(fdp); + return (error); + } + /* * There are two cases of interest here. * @@ -2671,61 +2648,36 @@ dupfdopen(struct thread *td, struct filedesc *fdp, int indx, int dfd, int mode, * * For ENXIO steal away the file structure from (dfd) and store it in * (indx). (dfd) is effectively closed by this operation. - * - * Any other error code is just returned. */ - switch (error) { + switch (openerror) { case ENODEV: /* * Check that the mode the file is being opened for is a * subset of the mode of the existing descriptor. */ - if (((mode & (FREAD|FWRITE)) | wfp->f_flag) != wfp->f_flag) { + if (((mode & (FREAD|FWRITE)) | fp->f_flag) != fp->f_flag) { + fdunused(fdp, indx); FILEDESC_XUNLOCK(fdp); return (EACCES); } - fp = fdp->fd_ofiles[indx]; - fdp->fd_ofiles[indx] = wfp; + fdp->fd_ofiles[indx] = fp; fdp->fd_ofileflags[indx] = fdp->fd_ofileflags[dfd]; - if (fp == NULL) - fdused(fdp, indx); - fhold(wfp); - FILEDESC_XUNLOCK(fdp); - if (fp != NULL) - /* - * We now own the reference to fp that the ofiles[] - * array used to own. Release it. - */ - fdrop(fp, td); - return (0); - + fhold(fp); + break; case ENXIO: /* * Steal away the file pointer from dfd and stuff it into indx. */ - fp = fdp->fd_ofiles[indx]; - fdp->fd_ofiles[indx] = fdp->fd_ofiles[dfd]; + fdp->fd_ofiles[indx] = fp; fdp->fd_ofiles[dfd] = NULL; fdp->fd_ofileflags[indx] = fdp->fd_ofileflags[dfd]; fdp->fd_ofileflags[dfd] = 0; fdunused(fdp, dfd); - if (fp == NULL) - fdused(fdp, indx); - FILEDESC_XUNLOCK(fdp); - - /* - * We now own the reference to fp that the ofiles[] array - * used to own. Release it. - */ - if (fp != NULL) - fdrop(fp, td); - return (0); - - default: - FILEDESC_XUNLOCK(fdp); - return (error); + break; } - /* NOTREACHED */ + FILEDESC_XUNLOCK(fdp); + *indxp = indx; + return (0); } /* @@ -2884,7 +2836,7 @@ sysctl_kern_file(SYSCTL_HANDLER_ARGS) xf.xf_type = fp->f_type; xf.xf_count = fp->f_count; xf.xf_msgcount = 0; - xf.xf_offset = fp->f_offset; + xf.xf_offset = foffset_get(fp); xf.xf_flag = fp->f_flag; error = SYSCTL_OUT(req, &xf, sizeof(xf)); if (error) @@ -3089,7 +3041,7 @@ sysctl_kern_proc_ofiledesc(SYSCTL_HANDLER_ARGS) kif->kf_flags |= KF_FLAG_DIRECT; if (fp->f_flag & FHASLOCK) kif->kf_flags |= KF_FLAG_HASLOCK; - kif->kf_offset = fp->f_offset; + kif->kf_offset = foffset_get(fp); if (vp != NULL) { vref(vp); switch (vp->v_type) { @@ -3433,7 +3385,7 @@ sysctl_kern_proc_filedesc(SYSCTL_HANDLER_ARGS) } refcnt = fp->f_count; fflags = fp->f_flag; - offset = fp->f_offset; + offset = foffset_get(fp); /* * Create sysctl entry. diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 443d902b104..b25c678cdb9 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -692,7 +692,7 @@ sys_kqueue(struct thread *td, struct kqueue_args *uap) if (error) goto done2; - /* An extra reference on `nfp' has been held for us by falloc(). */ + /* An extra reference on `fp' has been held for us by falloc(). */ kq = malloc(sizeof *kq, M_KQUEUE, M_WAITOK | M_ZERO); mtx_init(&kq->kq_lock, "kqueue", NULL, MTX_DEF|MTX_DUPOK); TAILQ_INIT(&kq->kq_head); diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index dac4703e6af..90f7311b820 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -443,8 +443,10 @@ interpret: /* * Some might argue that CAP_READ and/or CAP_MMAP should also * be required here; such arguments will be entertained. + * + * Descriptors opened only with O_EXEC or O_RDONLY are allowed. */ - error = fgetvp_read(td, args->fd, CAP_FEXECVE, &binvp); + error = fgetvp_exec(td, args->fd, CAP_FEXECVE, &binvp); if (error) goto exec_fail; vfslocked = VFS_LOCK_GIANT(binvp->v_mount); @@ -1511,64 +1513,3 @@ exec_unregister(execsw_arg) execsw = newexecsw; return (0); } - -static vm_object_t shared_page_obj; -static int shared_page_free; - -int -shared_page_fill(int size, int align, const char *data) -{ - vm_page_t m; - struct sf_buf *s; - vm_offset_t sk; - int res; - - VM_OBJECT_LOCK(shared_page_obj); - m = vm_page_grab(shared_page_obj, 0, VM_ALLOC_RETRY); - res = roundup(shared_page_free, align); - if (res + size >= IDX_TO_OFF(shared_page_obj->size)) - res = -1; - else { - VM_OBJECT_UNLOCK(shared_page_obj); - s = sf_buf_alloc(m, SFB_DEFAULT); - sk = sf_buf_kva(s); - bcopy(data, (void *)(sk + res), size); - shared_page_free = res + size; - sf_buf_free(s); - VM_OBJECT_LOCK(shared_page_obj); - } - vm_page_wakeup(m); - VM_OBJECT_UNLOCK(shared_page_obj); - return (res); -} - -static void -shared_page_init(void *dummy __unused) -{ - vm_page_t m; - - shared_page_obj = vm_pager_allocate(OBJT_PHYS, 0, PAGE_SIZE, - VM_PROT_DEFAULT, 0, NULL); - VM_OBJECT_LOCK(shared_page_obj); - m = vm_page_grab(shared_page_obj, 0, VM_ALLOC_RETRY | VM_ALLOC_NOBUSY | - VM_ALLOC_ZERO); - m->valid = VM_PAGE_BITS_ALL; - VM_OBJECT_UNLOCK(shared_page_obj); -} - -SYSINIT(shp, SI_SUB_EXEC, SI_ORDER_FIRST, (sysinit_cfunc_t)shared_page_init, - NULL); - -void -exec_sysvec_init(void *param) -{ - struct sysentvec *sv; - - sv = (struct sysentvec *)param; - - if ((sv->sv_flags & SV_SHP) == 0) - return; - sv->sv_shared_page_obj = shared_page_obj; - sv->sv_sigcode_base = sv->sv_shared_page_base + - shared_page_fill(*(sv->sv_szsigcode), 16, sv->sv_sigcode); -} diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 449d3d32746..6cb95cdd7f5 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -475,7 +475,6 @@ do_fork(struct thread *td, int flags, struct proc *p2, struct thread *td2, bcopy(&p2->p_comm, &td2->td_name, sizeof(td2->td_name)); td2->td_sigstk = td->td_sigstk; - td2->td_sigmask = td->td_sigmask; td2->td_flags = TDF_INMEM; td2->td_lend_user_pri = PRI_MAX; @@ -922,8 +921,10 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp, */ *procp = newproc; #ifdef PROCDESC - if (flags & RFPROCDESC) + if (flags & RFPROCDESC) { procdesc_finit(newproc->p_procdesc, fp_procdesc); + fdrop(fp_procdesc, td); + } #endif racct_proc_fork_done(newproc); return (0); @@ -939,14 +940,16 @@ fail: #ifdef MAC mac_proc_destroy(newproc); #endif -fail1: racct_proc_exit(newproc); +fail1: if (vm2 != NULL) vmspace_free(vm2); uma_zfree(proc_zone, newproc); #ifdef PROCDESC - if (((flags & RFPROCDESC) != 0) && (fp_procdesc != NULL)) + if (((flags & RFPROCDESC) != 0) && (fp_procdesc != NULL)) { + fdclose(td->td_proc->p_fd, fp_procdesc, *procdescp, td); fdrop(fp_procdesc, td); + } #endif pause("fork", hz / 2); return (error); diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c index b782b977500..4639e3c64f7 100644 --- a/sys/kern/kern_jail.c +++ b/sys/kern/kern_jail.c @@ -1811,6 +1811,16 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags) } } +#ifdef RACCT + if (!created) { + sx_sunlock(&allprison_lock); + prison_racct_modify(pr); + sx_slock(&allprison_lock); + } +#endif + + td->td_retval[0] = pr->pr_id; + /* * Now that it is all there, drop the temporary reference from existing * prisons. Or add a reference to newly created persistent prisons @@ -1832,12 +1842,6 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags) sx_sunlock(&allprison_lock); } -#ifdef RACCT - if (!created) - prison_racct_modify(pr); -#endif - - td->td_retval[0] = pr->pr_id; goto done_errmsg; done_deref_locked: @@ -4491,8 +4495,11 @@ prison_racct_modify(struct prison *pr) sx_slock(&allproc_lock); sx_xlock(&allprison_lock); - if (strcmp(pr->pr_name, pr->pr_prison_racct->prr_name) == 0) + if (strcmp(pr->pr_name, pr->pr_prison_racct->prr_name) == 0) { + sx_xunlock(&allprison_lock); + sx_sunlock(&allproc_lock); return; + } oldprr = pr->pr_prison_racct; pr->pr_prison_racct = NULL; diff --git a/sys/kern/kern_kthread.c b/sys/kern/kern_kthread.c index 9dcdeb00406..d8bbebd8ca6 100644 --- a/sys/kern/kern_kthread.c +++ b/sys/kern/kern_kthread.c @@ -271,7 +271,6 @@ kthread_add(void (*func)(void *), void *arg, struct proc *p, bzero(&newtd->td_startzero, __rangeof(struct thread, td_startzero, td_endzero)); -/* XXX check if we should zero. */ bcopy(&oldtd->td_startcopy, &newtd->td_startcopy, __rangeof(struct thread, td_startcopy, td_endcopy)); @@ -295,7 +294,6 @@ kthread_add(void (*func)(void *), void *arg, struct proc *p, /* this code almost the same as create_thread() in kern_thr.c */ PROC_LOCK(p); p->p_flag |= P_HADTHREADS; - newtd->td_sigmask = oldtd->td_sigmask; /* XXX dubious */ thread_link(newtd, p); thread_lock(oldtd); /* let the scheduler know about these things. */ diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c index c1b6f56fed2..18428c0dfdf 100644 --- a/sys/kern/kern_malloc.c +++ b/sys/kern/kern_malloc.c @@ -1000,6 +1000,8 @@ DB_SHOW_COMMAND(malloc, db_show_malloc) db_printf("%18s %12ju %12juK %12ju\n", mtp->ks_shortdesc, allocs - frees, (alloced - freed + 1023) / 1024, allocs); + if (db_pager_quit) + break; } } @@ -1029,6 +1031,8 @@ DB_SHOW_COMMAND(multizone_matches, db_show_multizone_matches) if (mtip->mti_zone != subzone) continue; db_printf("%s\n", mtp->ks_shortdesc); + if (db_pager_quit) + break; } } #endif /* MALLOC_DEBUG_MAXZONES > 1 */ diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index cf7657668f0..153b310e855 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -878,6 +878,9 @@ fill_kinfo_proc_only(struct proc *p, struct kinfo_proc *kp) kp->ki_childtime = kp->ki_childstime; timevaladd(&kp->ki_childtime, &kp->ki_childutime); + FOREACH_THREAD_IN_PROC(p, td0) + kp->ki_cow += td0->td_cow; + tp = NULL; if (p->p_pgrp) { kp->ki_pgid = p->p_pgrp->pg_id; @@ -990,6 +993,7 @@ fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp, int preferthread) kp->ki_runtime = cputick2usec(td->td_rux.rux_runtime); kp->ki_pctcpu = sched_pctcpu(td); kp->ki_estcpu = td->td_estcpu; + kp->ki_cow = td->td_cow; } /* We can't get this anymore but ps etc never used it anyway. */ @@ -1132,6 +1136,7 @@ freebsd32_kinfo_proc_out(const struct kinfo_proc *ki, struct kinfo_proc32 *ki32) CP(*ki, *ki32, ki_estcpu); CP(*ki, *ki32, ki_slptime); CP(*ki, *ki32, ki_swtime); + CP(*ki, *ki32, ki_cow); CP(*ki, *ki32, ki_runtime); TV_CP(*ki, *ki32, ki_start); TV_CP(*ki, *ki32, ki_childtime); diff --git a/sys/kern/kern_racct.c b/sys/kern/kern_racct.c index 081b312df57..534780fe77f 100644 --- a/sys/kern/kern_racct.c +++ b/sys/kern/kern_racct.c @@ -573,6 +573,9 @@ out: PROC_UNLOCK(child); PROC_UNLOCK(parent); + if (error != 0) + racct_proc_exit(child); + return (error); } diff --git a/sys/kern/kern_rangelock.c b/sys/kern/kern_rangelock.c new file mode 100644 index 00000000000..1b4dfd63966 --- /dev/null +++ b/sys/kern/kern_rangelock.c @@ -0,0 +1,246 @@ +/*- + * Copyright (c) 2009 Konstantin Belousov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice unmodified, this list of conditions, and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include + +struct rl_q_entry { + TAILQ_ENTRY(rl_q_entry) rl_q_link; + off_t rl_q_start, rl_q_end; + int rl_q_flags; +}; + +static uma_zone_t rl_entry_zone; + +static void +rangelock_sys_init(void) +{ + + rl_entry_zone = uma_zcreate("rl_entry", sizeof(struct rl_q_entry), + NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); +} +SYSINIT(vfs, SI_SUB_LOCK, SI_ORDER_ANY, rangelock_sys_init, NULL); + +static struct rl_q_entry * +rlqentry_alloc(void) +{ + + return (uma_zalloc(rl_entry_zone, M_WAITOK)); +} + +void +rlqentry_free(struct rl_q_entry *rleq) +{ + + uma_zfree(rl_entry_zone, rleq); +} + +void +rangelock_init(struct rangelock *lock) +{ + + TAILQ_INIT(&lock->rl_waiters); + lock->rl_currdep = NULL; +} + +void +rangelock_destroy(struct rangelock *lock) +{ + + KASSERT(TAILQ_EMPTY(&lock->rl_waiters), ("Dangling waiters")); +} + +/* + * Verifies the supplied rl_q_entries for compatibility. Returns true + * if the rangelock queue entries are not compatible, false if they are. + * + * Two entries are compatible if their ranges do not overlap, or both + * entries are for read. + */ +static int +rangelock_incompatible(const struct rl_q_entry *e1, + const struct rl_q_entry *e2) +{ + + if ((e1->rl_q_flags & RL_LOCK_TYPE_MASK) == RL_LOCK_READ && + (e2->rl_q_flags & RL_LOCK_TYPE_MASK) == RL_LOCK_READ) + return (0); + if (e1->rl_q_start < e2->rl_q_end && e1->rl_q_end > e2->rl_q_start) + return (1); + return (0); +} + +/* + * Recalculate the lock->rl_currdep after an unlock. + */ +static void +rangelock_calc_block(struct rangelock *lock) +{ + struct rl_q_entry *entry, *entry1, *whead; + + if (lock->rl_currdep == TAILQ_FIRST(&lock->rl_waiters) && + lock->rl_currdep != NULL) + lock->rl_currdep = TAILQ_NEXT(lock->rl_currdep, rl_q_link); + for (entry = lock->rl_currdep; entry != NULL; + entry = TAILQ_NEXT(entry, rl_q_link)) { + TAILQ_FOREACH(entry1, &lock->rl_waiters, rl_q_link) { + if (rangelock_incompatible(entry, entry1)) + goto out; + if (entry1 == entry) + break; + } + } +out: + lock->rl_currdep = entry; + TAILQ_FOREACH(whead, &lock->rl_waiters, rl_q_link) { + if (whead == lock->rl_currdep) + break; + if (!(whead->rl_q_flags & RL_LOCK_GRANTED)) { + whead->rl_q_flags |= RL_LOCK_GRANTED; + wakeup(whead); + } + } +} + +static void +rangelock_unlock_locked(struct rangelock *lock, struct rl_q_entry *entry, + struct mtx *ilk) +{ + + MPASS(lock != NULL && entry != NULL && ilk != NULL); + mtx_assert(ilk, MA_OWNED); + KASSERT(entry != lock->rl_currdep, ("stuck currdep")); + + TAILQ_REMOVE(&lock->rl_waiters, entry, rl_q_link); + rangelock_calc_block(lock); + mtx_unlock(ilk); + if (curthread->td_rlqe == NULL) + curthread->td_rlqe = entry; + else + rlqentry_free(entry); +} + +void +rangelock_unlock(struct rangelock *lock, void *cookie, struct mtx *ilk) +{ + + MPASS(lock != NULL && cookie != NULL && ilk != NULL); + + mtx_lock(ilk); + rangelock_unlock_locked(lock, cookie, ilk); +} + +/* + * Unlock the sub-range of granted lock. + */ +void * +rangelock_unlock_range(struct rangelock *lock, void *cookie, off_t start, + off_t end, struct mtx *ilk) +{ + struct rl_q_entry *entry; + + MPASS(lock != NULL && cookie != NULL && ilk != NULL); + entry = cookie; + KASSERT(entry->rl_q_flags & RL_LOCK_GRANTED, + ("Unlocking non-granted lock")); + KASSERT(entry->rl_q_start == start, ("wrong start")); + KASSERT(entry->rl_q_end >= end, ("wrong end")); + + mtx_lock(ilk); + if (entry->rl_q_end == end) { + rangelock_unlock_locked(lock, cookie, ilk); + return (NULL); + } + entry->rl_q_end = end; + rangelock_calc_block(lock); + mtx_unlock(ilk); + return (cookie); +} + +/* + * Add the lock request to the queue of the pending requests for + * rangelock. Sleep until the request can be granted. + */ +static void * +rangelock_enqueue(struct rangelock *lock, off_t start, off_t end, int mode, + struct mtx *ilk) +{ + struct rl_q_entry *entry; + struct thread *td; + + MPASS(lock != NULL && ilk != NULL); + + td = curthread; + if (td->td_rlqe != NULL) { + entry = td->td_rlqe; + td->td_rlqe = NULL; + } else + entry = rlqentry_alloc(); + MPASS(entry != NULL); + entry->rl_q_flags = mode; + entry->rl_q_start = start; + entry->rl_q_end = end; + + mtx_lock(ilk); + /* + * XXXKIB TODO. Check that a thread does not try to enqueue a + * lock that is incompatible with another request from the same + * thread. + */ + + TAILQ_INSERT_TAIL(&lock->rl_waiters, entry, rl_q_link); + if (lock->rl_currdep == NULL) + lock->rl_currdep = entry; + rangelock_calc_block(lock); + while (!(entry->rl_q_flags & RL_LOCK_GRANTED)) + msleep(entry, ilk, 0, "range", 0); + mtx_unlock(ilk); + return (entry); +} + +void * +rangelock_rlock(struct rangelock *lock, off_t start, off_t end, struct mtx *ilk) +{ + + return (rangelock_enqueue(lock, start, end, RL_LOCK_READ, ilk)); +} + +void * +rangelock_wlock(struct rangelock *lock, off_t start, off_t end, struct mtx *ilk) +{ + + return (rangelock_enqueue(lock, start, end, RL_LOCK_WRITE, ilk)); +} diff --git a/sys/kern/kern_sharedpage.c b/sys/kern/kern_sharedpage.c new file mode 100644 index 00000000000..619304a1e00 --- /dev/null +++ b/sys/kern/kern_sharedpage.c @@ -0,0 +1,240 @@ +/*- + * Copyright (c) 2010, 2012 Konstantin Belousov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_compat.h" +#include "opt_vm.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static struct sx shared_page_alloc_sx; +static vm_object_t shared_page_obj; +static int shared_page_free; +char *shared_page_mapping; + +void +shared_page_write(int base, int size, const void *data) +{ + + bcopy(data, shared_page_mapping + base, size); +} + +static int +shared_page_alloc_locked(int size, int align) +{ + int res; + + res = roundup(shared_page_free, align); + if (res + size >= IDX_TO_OFF(shared_page_obj->size)) + res = -1; + else + shared_page_free = res + size; + return (res); +} + +int +shared_page_alloc(int size, int align) +{ + int res; + + sx_xlock(&shared_page_alloc_sx); + res = shared_page_alloc_locked(size, align); + sx_xunlock(&shared_page_alloc_sx); + return (res); +} + +int +shared_page_fill(int size, int align, const void *data) +{ + int res; + + sx_xlock(&shared_page_alloc_sx); + res = shared_page_alloc_locked(size, align); + if (res != -1) + shared_page_write(res, size, data); + sx_xunlock(&shared_page_alloc_sx); + return (res); +} + +static void +shared_page_init(void *dummy __unused) +{ + vm_page_t m; + vm_offset_t addr; + + sx_init(&shared_page_alloc_sx, "shpsx"); + shared_page_obj = vm_pager_allocate(OBJT_PHYS, 0, PAGE_SIZE, + VM_PROT_DEFAULT, 0, NULL); + VM_OBJECT_LOCK(shared_page_obj); + m = vm_page_grab(shared_page_obj, 0, VM_ALLOC_RETRY | VM_ALLOC_NOBUSY | + VM_ALLOC_ZERO); + m->valid = VM_PAGE_BITS_ALL; + VM_OBJECT_UNLOCK(shared_page_obj); + addr = kmem_alloc_nofault(kernel_map, PAGE_SIZE); + pmap_qenter(addr, &m, 1); + shared_page_mapping = (char *)addr; +} + +SYSINIT(shp, SI_SUB_EXEC, SI_ORDER_FIRST, (sysinit_cfunc_t)shared_page_init, + NULL); + +static void +timehands_update(struct sysentvec *sv) +{ + struct vdso_timehands th; + struct vdso_timekeep *tk; + uint32_t enabled, idx; + + enabled = tc_fill_vdso_timehands(&th); + tk = (struct vdso_timekeep *)(shared_page_mapping + + sv->sv_timekeep_off); + idx = sv->sv_timekeep_curr; + atomic_store_rel_32(&tk->tk_th[idx].th_gen, 0); + if (++idx >= VDSO_TH_NUM) + idx = 0; + sv->sv_timekeep_curr = idx; + if (++sv->sv_timekeep_gen == 0) + sv->sv_timekeep_gen = 1; + th.th_gen = 0; + if (enabled) + tk->tk_th[idx] = th; + tk->tk_enabled = enabled; + atomic_store_rel_32(&tk->tk_th[idx].th_gen, sv->sv_timekeep_gen); + tk->tk_current = idx; +} + +#ifdef COMPAT_FREEBSD32 +static void +timehands_update32(struct sysentvec *sv) +{ + struct vdso_timekeep32 *tk; + struct vdso_timehands32 th; + uint32_t enabled, idx; + + enabled = tc_fill_vdso_timehands32(&th); + tk = (struct vdso_timekeep32 *)(shared_page_mapping + + sv->sv_timekeep_off); + idx = sv->sv_timekeep_curr; + atomic_store_rel_32(&tk->tk_th[idx].th_gen, 0); + if (++idx >= VDSO_TH_NUM) + idx = 0; + sv->sv_timekeep_curr = idx; + if (++sv->sv_timekeep_gen == 0) + sv->sv_timekeep_gen = 1; + th.th_gen = 0; + if (enabled) + tk->tk_th[idx] = th; + tk->tk_enabled = enabled; + atomic_store_rel_32(&tk->tk_th[idx].th_gen, sv->sv_timekeep_gen); + tk->tk_current = idx; +} +#endif + +/* + * This is hackish, but easiest way to avoid creating list structures + * that needs to be iterated over from the hardclock interrupt + * context. + */ +static struct sysentvec *host_sysentvec; +#ifdef COMPAT_FREEBSD32 +static struct sysentvec *compat32_sysentvec; +#endif + +void +timekeep_push_vdso(void) +{ + + if (host_sysentvec != NULL && host_sysentvec->sv_timekeep_base != 0) + timehands_update(host_sysentvec); +#ifdef COMPAT_FREEBSD32 + if (compat32_sysentvec != NULL && + compat32_sysentvec->sv_timekeep_base != 0) + timehands_update32(compat32_sysentvec); +#endif +} + +void +exec_sysvec_init(void *param) +{ + struct sysentvec *sv; + int tk_base; + uint32_t tk_ver; + + sv = (struct sysentvec *)param; + + if ((sv->sv_flags & SV_SHP) == 0) + return; + sv->sv_shared_page_obj = shared_page_obj; + sv->sv_sigcode_base = sv->sv_shared_page_base + + shared_page_fill(*(sv->sv_szsigcode), 16, sv->sv_sigcode); + if ((sv->sv_flags & SV_ABI_MASK) != SV_ABI_FREEBSD) + return; + tk_ver = VDSO_TK_VER_CURR; +#ifdef COMPAT_FREEBSD32 + if ((sv->sv_flags & SV_ILP32) != 0) { + tk_base = shared_page_alloc(sizeof(struct vdso_timekeep32) + + sizeof(struct vdso_timehands32) * VDSO_TH_NUM, 16); + KASSERT(tk_base != -1, ("tk_base -1 for 32bit")); + shared_page_write(tk_base + offsetof(struct vdso_timekeep32, + tk_ver), sizeof(uint32_t), &tk_ver); + KASSERT(compat32_sysentvec == 0, + ("Native compat32 already registered")); + compat32_sysentvec = sv; + } else { +#endif + tk_base = shared_page_alloc(sizeof(struct vdso_timekeep) + + sizeof(struct vdso_timehands) * VDSO_TH_NUM, 16); + KASSERT(tk_base != -1, ("tk_base -1 for native")); + shared_page_write(tk_base + offsetof(struct vdso_timekeep, + tk_ver), sizeof(uint32_t), &tk_ver); + KASSERT(host_sysentvec == 0, ("Native already registered")); + host_sysentvec = sv; +#ifdef COMPAT_FREEBSD32 + } +#endif + sv->sv_timekeep_base = sv->sv_shared_page_base + tk_base; + sv->sv_timekeep_off = tk_base; + timekeep_push_vdso(); +} diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c index 9da342db5ae..d676136bba9 100644 --- a/sys/kern/kern_shutdown.c +++ b/sys/kern/kern_shutdown.c @@ -66,9 +66,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#ifdef SW_WATCHDOG #include -#endif #include @@ -151,7 +149,7 @@ static struct dumperinfo dumper; /* our selected dumper */ /* Context information for dump-debuggers. */ static struct pcb dumppcb; /* Registers. */ -static lwpid_t dumptid; /* Thread ID. */ +lwpid_t dumptid; /* Thread ID. */ static void poweroff_wait(void *, int); static void shutdown_halt(void *junk, int howto); @@ -334,9 +332,7 @@ kern_reboot(int howto) waittime = 0; -#ifdef SW_WATCHDOG wdog_kern_pat(WD_LASTVAL); -#endif sys_sync(curthread, NULL); /* @@ -362,9 +358,8 @@ kern_reboot(int howto) if (nbusy < pbusy) iter = 0; pbusy = nbusy; -#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); -#endif sys_sync(curthread, NULL); #ifdef PREEMPTION diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 52a0c405713..2685a8b1384 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -2436,9 +2436,10 @@ ptracestop(struct thread *td, int sig) } stopme: thread_suspend_switch(td); - if (!(p->p_flag & P_TRACED)) { + if (p->p_xthread == td) + p->p_xthread = NULL; + if (!(p->p_flag & P_TRACED)) break; - } if (td->td_dbgflags & TDB_SUSPEND) { if (p->p_flag & P_SINGLE_EXIT) break; diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c index 85b11f9f94e..e2e4081bf89 100644 --- a/sys/kern/kern_synch.c +++ b/sys/kern/kern_synch.c @@ -37,6 +37,7 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_kdtrace.h" #include "opt_ktrace.h" #include "opt_sched.h" @@ -51,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -105,6 +107,20 @@ SYSCTL_INT(_kern, OID_AUTO, fscale, CTLFLAG_RD, 0, FSCALE, ""); static void loadav(void *arg); +SDT_PROVIDER_DECLARE(sched); +SDT_PROBE_DEFINE(sched, , , preempt, preempt); + +/* + * These probes reference Solaris features that are not implemented in FreeBSD. + * Create the probes anyway for compatibility with existing D scripts; they'll + * just never fire. + */ +SDT_PROBE_DEFINE(sched, , , cpucaps_sleep, cpucaps-sleep); +SDT_PROBE_DEFINE(sched, , , cpucaps_wakeup, cpucaps-wakeup); +SDT_PROBE_DEFINE(sched, , , schedctl_nopreempt, schedctl-nopreempt); +SDT_PROBE_DEFINE(sched, , , schedctl_preempt, schedctl-preempt); +SDT_PROBE_DEFINE(sched, , , schedctl_yield, schedctl-yield); + void sleepinit(void) { @@ -462,6 +478,7 @@ mi_switch(int flags, struct thread *newtd) "prio:%d", td->td_priority, "wmesg:\"%s\"", td->td_wmesg, "lockname:\"%s\"", td->td_lockname); #endif + SDT_PROBE0(sched, , , preempt); #ifdef XEN PT_UPDATES_FLUSH(); #endif diff --git a/sys/kern/kern_tc.c b/sys/kern/kern_tc.c index e272fdd64ba..4a75af55076 100644 --- a/sys/kern/kern_tc.c +++ b/sys/kern/kern_tc.c @@ -16,6 +16,7 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_compat.h" #include "opt_ntp.h" #include "opt_ffclock.h" @@ -32,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include /* * A large step happens on boot. This constant detects such steps. @@ -1360,6 +1362,7 @@ tc_windup(void) #endif timehands = th; + timekeep_push_vdso(); } /* Report or change the active timecounter hardware. */ @@ -1386,6 +1389,7 @@ sysctl_kern_timecounter_hardware(SYSCTL_HANDLER_ARGS) (void)newtc->tc_get_timecount(newtc); timecounter = newtc; + timekeep_push_vdso(); return (0); } return (EINVAL); @@ -1844,3 +1848,63 @@ cputick2usec(uint64_t tick) } cpu_tick_f *cpu_ticks = tc_cpu_ticks; + +static int vdso_th_enable = 1; +static int +sysctl_fast_gettime(SYSCTL_HANDLER_ARGS) +{ + int old_vdso_th_enable, error; + + old_vdso_th_enable = vdso_th_enable; + error = sysctl_handle_int(oidp, &old_vdso_th_enable, 0, req); + if (error != 0) + return (error); + vdso_th_enable = old_vdso_th_enable; + timekeep_push_vdso(); + return (0); +} +SYSCTL_PROC(_kern_timecounter, OID_AUTO, fast_gettime, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, + NULL, 0, sysctl_fast_gettime, "I", "Enable fast time of day"); + +uint32_t +tc_fill_vdso_timehands(struct vdso_timehands *vdso_th) +{ + struct timehands *th; + uint32_t enabled; + + th = timehands; + vdso_th->th_algo = VDSO_TH_ALGO_1; + vdso_th->th_scale = th->th_scale; + vdso_th->th_offset_count = th->th_offset_count; + vdso_th->th_counter_mask = th->th_counter->tc_counter_mask; + vdso_th->th_offset = th->th_offset; + vdso_th->th_boottime = boottimebin; + enabled = cpu_fill_vdso_timehands(vdso_th); + if (!vdso_th_enable) + enabled = 0; + return (enabled); +} + +#ifdef COMPAT_FREEBSD32 +uint32_t +tc_fill_vdso_timehands32(struct vdso_timehands32 *vdso_th32) +{ + struct timehands *th; + uint32_t enabled; + + th = timehands; + vdso_th32->th_algo = VDSO_TH_ALGO_1; + *(uint64_t *)&vdso_th32->th_scale[0] = th->th_scale; + vdso_th32->th_offset_count = th->th_offset_count; + vdso_th32->th_counter_mask = th->th_counter->tc_counter_mask; + vdso_th32->th_offset.sec = th->th_offset.sec; + *(uint64_t *)&vdso_th32->th_offset.frac[0] = th->th_offset.frac; + vdso_th32->th_boottime.sec = boottimebin.sec; + *(uint64_t *)&vdso_th32->th_boottime.frac[0] = boottimebin.frac; + enabled = cpu_fill_vdso_timehands32(vdso_th32); + if (!vdso_th_enable) + enabled = 0; + return (enabled); +} +#endif diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c index ee0da022404..4270b41fd0c 100644 --- a/sys/kern/kern_thr.c +++ b/sys/kern/kern_thr.c @@ -252,7 +252,6 @@ create_thread(struct thread *td, mcontext_t *ctx, PROC_LOCK(td->td_proc); td->td_proc->p_flag |= P_HADTHREADS; - newtd->td_sigmask = td->td_sigmask; thread_link(newtd, p); bcopy(p->p_comm, newtd->td_name, sizeof(newtd->td_name)); thread_lock(td); diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c index d4c5c4c8d2e..69a416e07f7 100644 --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -27,6 +27,7 @@ */ #include "opt_witness.h" +#include "opt_kdtrace.h" #include "opt_hwpmc_hooks.h" #include @@ -38,7 +39,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include +#include #include #include #include @@ -59,6 +62,10 @@ __FBSDID("$FreeBSD$"); #include #include +SDT_PROVIDER_DECLARE(proc); +SDT_PROBE_DEFINE(proc, , , lwp_exit, lwp-exit); + + /* * thread related storage. */ @@ -199,6 +206,7 @@ thread_init(void *mem, int size, int flags) td->td_sleepqueue = sleepq_alloc(); td->td_turnstile = turnstile_alloc(); + td->td_rlqe = NULL; EVENTHANDLER_INVOKE(thread_init, td); td->td_sched = (struct td_sched *)&td[1]; umtx_thread_init(td); @@ -216,6 +224,7 @@ thread_fini(void *mem, int size) td = (struct thread *)mem; EVENTHANDLER_INVOKE(thread_fini, td); + rlqentry_free(td->td_rlqe); turnstile_free(td->td_turnstile); sleepq_free(td->td_sleepqueue); umtx_thread_fini(td); diff --git a/sys/kern/kern_timeout.c b/sys/kern/kern_timeout.c index 5e1d4f37369..967d4e0e1d6 100644 --- a/sys/kern/kern_timeout.c +++ b/sys/kern/kern_timeout.c @@ -437,6 +437,181 @@ callout_cc_add(struct callout *c, struct callout_cpu *cc, int to_ticks, } } +static void +callout_cc_del(struct callout *c, struct callout_cpu *cc) +{ + + if (cc->cc_next == c) + cc->cc_next = TAILQ_NEXT(c, c_links.tqe); + if (c->c_flags & CALLOUT_LOCAL_ALLOC) { + c->c_func = NULL; + SLIST_INSERT_HEAD(&cc->cc_callfree, c, c_links.sle); + } +} + +static struct callout * +softclock_call_cc(struct callout *c, struct callout_cpu *cc, int *mpcalls, + int *lockcalls, int *gcalls) +{ + void (*c_func)(void *); + void *c_arg; + struct lock_class *class; + struct lock_object *c_lock; + int c_flags, sharedlock; +#ifdef SMP + struct callout_cpu *new_cc; + void (*new_func)(void *); + void *new_arg; + int new_cpu, new_ticks; +#endif +#ifdef DIAGNOSTIC + struct bintime bt1, bt2; + struct timespec ts2; + static uint64_t maxdt = 36893488147419102LL; /* 2 msec */ + static timeout_t *lastfunc; +#endif + + cc->cc_next = TAILQ_NEXT(c, c_links.tqe); + class = (c->c_lock != NULL) ? LOCK_CLASS(c->c_lock) : NULL; + sharedlock = (c->c_flags & CALLOUT_SHAREDLOCK) ? 0 : 1; + c_lock = c->c_lock; + c_func = c->c_func; + c_arg = c->c_arg; + c_flags = c->c_flags; + if (c->c_flags & CALLOUT_LOCAL_ALLOC) + c->c_flags = CALLOUT_LOCAL_ALLOC; + else + c->c_flags &= ~CALLOUT_PENDING; + cc->cc_curr = c; + cc->cc_cancel = 0; + CC_UNLOCK(cc); + if (c_lock != NULL) { + class->lc_lock(c_lock, sharedlock); + /* + * The callout may have been cancelled + * while we switched locks. + */ + if (cc->cc_cancel) { + class->lc_unlock(c_lock); + goto skip; + } + /* The callout cannot be stopped now. */ + cc->cc_cancel = 1; + + if (c_lock == &Giant.lock_object) { + (*gcalls)++; + CTR3(KTR_CALLOUT, "callout %p func %p arg %p", + c, c_func, c_arg); + } else { + (*lockcalls)++; + CTR3(KTR_CALLOUT, "callout lock %p func %p arg %p", + c, c_func, c_arg); + } + } else { + (*mpcalls)++; + CTR3(KTR_CALLOUT, "callout mpsafe %p func %p arg %p", + c, c_func, c_arg); + } +#ifdef DIAGNOSTIC + binuptime(&bt1); +#endif + THREAD_NO_SLEEPING(); + SDT_PROBE(callout_execute, kernel, , callout_start, c, 0, 0, 0, 0); + c_func(c_arg); + SDT_PROBE(callout_execute, kernel, , callout_end, c, 0, 0, 0, 0); + THREAD_SLEEPING_OK(); +#ifdef DIAGNOSTIC + binuptime(&bt2); + bintime_sub(&bt2, &bt1); + if (bt2.frac > maxdt) { + if (lastfunc != c_func || bt2.frac > maxdt * 2) { + bintime2timespec(&bt2, &ts2); + printf( + "Expensive timeout(9) function: %p(%p) %jd.%09ld s\n", + c_func, c_arg, (intmax_t)ts2.tv_sec, ts2.tv_nsec); + } + maxdt = bt2.frac; + lastfunc = c_func; + } +#endif + CTR1(KTR_CALLOUT, "callout %p finished", c); + if ((c_flags & CALLOUT_RETURNUNLOCKED) == 0) + class->lc_unlock(c_lock); +skip: + CC_LOCK(cc); + /* + * If the current callout is locally allocated (from + * timeout(9)) then put it on the freelist. + * + * Note: we need to check the cached copy of c_flags because + * if it was not local, then it's not safe to deref the + * callout pointer. + */ + if (c_flags & CALLOUT_LOCAL_ALLOC) { + KASSERT(c->c_flags == CALLOUT_LOCAL_ALLOC, + ("corrupted callout")); + c->c_func = NULL; + SLIST_INSERT_HEAD(&cc->cc_callfree, c, c_links.sle); + } + cc->cc_curr = NULL; + if (cc->cc_waiting) { + /* + * There is someone waiting for the + * callout to complete. + * If the callout was scheduled for + * migration just cancel it. + */ + if (cc_cme_migrating(cc)) + cc_cme_cleanup(cc); + cc->cc_waiting = 0; + CC_UNLOCK(cc); + wakeup(&cc->cc_waiting); + CC_LOCK(cc); + } else if (cc_cme_migrating(cc)) { +#ifdef SMP + /* + * If the callout was scheduled for + * migration just perform it now. + */ + new_cpu = cc->cc_migration_cpu; + new_ticks = cc->cc_migration_ticks; + new_func = cc->cc_migration_func; + new_arg = cc->cc_migration_arg; + cc_cme_cleanup(cc); + + /* + * Handle deferred callout stops + */ + if ((c->c_flags & CALLOUT_DFRMIGRATION) == 0) { + CTR3(KTR_CALLOUT, + "deferred cancelled %p func %p arg %p", + c, new_func, new_arg); + callout_cc_del(c, cc); + goto nextc; + } + + c->c_flags &= ~CALLOUT_DFRMIGRATION; + + /* + * It should be assert here that the + * callout is not destroyed but that + * is not easy. + */ + new_cc = callout_cpu_switch(c, cc, new_cpu); + callout_cc_add(c, new_cc, new_ticks, new_func, new_arg, + new_cpu); + CC_UNLOCK(new_cc); + CC_LOCK(cc); +#else + panic("migration should not happen"); +#endif + } +#ifdef SMP +nextc: +#endif + return (cc->cc_next); +} + /* * The callout mechanism is based on the work of Adam M. Costello and * George Varghese, published in a technical report entitled "Redesigning @@ -465,12 +640,6 @@ softclock(void *arg) int mpcalls; int lockcalls; int gcalls; -#ifdef DIAGNOSTIC - struct bintime bt1, bt2; - struct timespec ts2; - static uint64_t maxdt = 36893488147419102LL; /* 2 msec */ - static timeout_t *lastfunc; -#endif #ifndef MAX_SOFTCLOCK_STEPS #define MAX_SOFTCLOCK_STEPS 100 /* Maximum allowed value of steps. */ @@ -492,7 +661,7 @@ softclock(void *arg) cc->cc_softticks++; bucket = &cc->cc_callwheel[curticks & callwheelmask]; c = TAILQ_FIRST(bucket); - while (c) { + while (c != NULL) { depth++; if (c->c_time != curticks) { c = TAILQ_NEXT(c, c_links.tqe); @@ -507,160 +676,10 @@ softclock(void *arg) steps = 0; } } else { - void (*c_func)(void *); - void *c_arg; - struct lock_class *class; - struct lock_object *c_lock; - int c_flags, sharedlock; - - cc->cc_next = TAILQ_NEXT(c, c_links.tqe); TAILQ_REMOVE(bucket, c, c_links.tqe); - class = (c->c_lock != NULL) ? - LOCK_CLASS(c->c_lock) : NULL; - sharedlock = (c->c_flags & CALLOUT_SHAREDLOCK) ? - 0 : 1; - c_lock = c->c_lock; - c_func = c->c_func; - c_arg = c->c_arg; - c_flags = c->c_flags; - if (c->c_flags & CALLOUT_LOCAL_ALLOC) { - c->c_flags = CALLOUT_LOCAL_ALLOC; - } else { - c->c_flags = - (c->c_flags & ~CALLOUT_PENDING); - } - cc->cc_curr = c; - cc->cc_cancel = 0; - CC_UNLOCK(cc); - if (c_lock != NULL) { - class->lc_lock(c_lock, sharedlock); - /* - * The callout may have been cancelled - * while we switched locks. - */ - if (cc->cc_cancel) { - class->lc_unlock(c_lock); - goto skip; - } - /* The callout cannot be stopped now. */ - cc->cc_cancel = 1; - - if (c_lock == &Giant.lock_object) { - gcalls++; - CTR3(KTR_CALLOUT, - "callout %p func %p arg %p", - c, c_func, c_arg); - } else { - lockcalls++; - CTR3(KTR_CALLOUT, "callout lock" - " %p func %p arg %p", - c, c_func, c_arg); - } - } else { - mpcalls++; - CTR3(KTR_CALLOUT, - "callout mpsafe %p func %p arg %p", - c, c_func, c_arg); - } -#ifdef DIAGNOSTIC - binuptime(&bt1); -#endif - THREAD_NO_SLEEPING(); - SDT_PROBE(callout_execute, kernel, , - callout_start, c, 0, 0, 0, 0); - c_func(c_arg); - SDT_PROBE(callout_execute, kernel, , - callout_end, c, 0, 0, 0, 0); - THREAD_SLEEPING_OK(); -#ifdef DIAGNOSTIC - binuptime(&bt2); - bintime_sub(&bt2, &bt1); - if (bt2.frac > maxdt) { - if (lastfunc != c_func || - bt2.frac > maxdt * 2) { - bintime2timespec(&bt2, &ts2); - printf( - "Expensive timeout(9) function: %p(%p) %jd.%09ld s\n", - c_func, c_arg, - (intmax_t)ts2.tv_sec, - ts2.tv_nsec); - } - maxdt = bt2.frac; - lastfunc = c_func; - } -#endif - CTR1(KTR_CALLOUT, "callout %p finished", c); - if ((c_flags & CALLOUT_RETURNUNLOCKED) == 0) - class->lc_unlock(c_lock); - skip: - CC_LOCK(cc); - /* - * If the current callout is locally - * allocated (from timeout(9)) - * then put it on the freelist. - * - * Note: we need to check the cached - * copy of c_flags because if it was not - * local, then it's not safe to deref the - * callout pointer. - */ - if (c_flags & CALLOUT_LOCAL_ALLOC) { - KASSERT(c->c_flags == - CALLOUT_LOCAL_ALLOC, - ("corrupted callout")); - c->c_func = NULL; - SLIST_INSERT_HEAD(&cc->cc_callfree, c, - c_links.sle); - } - cc->cc_curr = NULL; - if (cc->cc_waiting) { - - /* - * There is someone waiting for the - * callout to complete. - * If the callout was scheduled for - * migration just cancel it. - */ - if (cc_cme_migrating(cc)) - cc_cme_cleanup(cc); - cc->cc_waiting = 0; - CC_UNLOCK(cc); - wakeup(&cc->cc_waiting); - CC_LOCK(cc); - } else if (cc_cme_migrating(cc)) { -#ifdef SMP - struct callout_cpu *new_cc; - void (*new_func)(void *); - void *new_arg; - int new_cpu, new_ticks; - - /* - * If the callout was scheduled for - * migration just perform it now. - */ - new_cpu = cc->cc_migration_cpu; - new_ticks = cc->cc_migration_ticks; - new_func = cc->cc_migration_func; - new_arg = cc->cc_migration_arg; - cc_cme_cleanup(cc); - - /* - * It should be assert here that the - * callout is not destroyed but that - * is not easy. - */ - new_cc = callout_cpu_switch(c, cc, - new_cpu); - callout_cc_add(c, new_cc, new_ticks, - new_func, new_arg, new_cpu); - CC_UNLOCK(new_cc); - CC_LOCK(cc); -#else - panic("migration should not happen"); -#endif - } + c = softclock_call_cc(c, cc, &mpcalls, + &lockcalls, &gcalls); steps = 0; - c = cc->cc_next; } } } @@ -814,6 +833,7 @@ callout_reset_on(struct callout *c, int to_ticks, void (*ftn)(void *), cc->cc_migration_ticks = to_ticks; cc->cc_migration_func = ftn; cc->cc_migration_arg = arg; + c->c_flags |= CALLOUT_DFRMIGRATION; CTR5(KTR_CALLOUT, "migration of %p func %p arg %p in %d to %u deferred", c, c->c_func, c->c_arg, to_ticks, cpu); @@ -984,6 +1004,12 @@ again: CC_UNLOCK(cc); KASSERT(!sq_locked, ("sleepqueue chain locked")); return (1); + } else if ((c->c_flags & CALLOUT_DFRMIGRATION) != 0) { + c->c_flags &= ~CALLOUT_DFRMIGRATION; + CTR3(KTR_CALLOUT, "postponing stop %p func %p arg %p", + c, c->c_func, c->c_arg); + CC_UNLOCK(cc); + return (1); } CTR3(KTR_CALLOUT, "failed to stop %p func %p arg %p", c, c->c_func, c->c_arg); @@ -996,19 +1022,12 @@ again: c->c_flags &= ~(CALLOUT_ACTIVE | CALLOUT_PENDING); - if (cc->cc_next == c) { - cc->cc_next = TAILQ_NEXT(c, c_links.tqe); - } - TAILQ_REMOVE(&cc->cc_callwheel[c->c_time & callwheelmask], c, - c_links.tqe); - CTR3(KTR_CALLOUT, "cancelled %p func %p arg %p", c, c->c_func, c->c_arg); + TAILQ_REMOVE(&cc->cc_callwheel[c->c_time & callwheelmask], c, + c_links.tqe); + callout_cc_del(c, cc); - if (c->c_flags & CALLOUT_LOCAL_ALLOC) { - c->c_func = NULL; - SLIST_INSERT_HEAD(&cc->cc_callfree, c, c_links.sle); - } CC_UNLOCK(cc); return (1); } diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c index 1bd1cdd5ef5..84fdb1f5c0c 100644 --- a/sys/kern/sched_4bsd.c +++ b/sys/kern/sched_4bsd.c @@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -244,12 +245,31 @@ SYSCTL_INT(_kern_sched, OID_AUTO, followon, CTLFLAG_RW, "allow threads to share a quantum"); #endif +SDT_PROVIDER_DEFINE(sched); + +SDT_PROBE_DEFINE3(sched, , , change_pri, change-pri, "struct thread *", + "struct proc *", "uint8_t"); +SDT_PROBE_DEFINE3(sched, , , dequeue, dequeue, "struct thread *", + "struct proc *", "void *"); +SDT_PROBE_DEFINE4(sched, , , enqueue, enqueue, "struct thread *", + "struct proc *", "void *", "int"); +SDT_PROBE_DEFINE4(sched, , , lend_pri, lend-pri, "struct thread *", + "struct proc *", "uint8_t", "struct thread *"); +SDT_PROBE_DEFINE2(sched, , , load_change, load-change, "int", "int"); +SDT_PROBE_DEFINE2(sched, , , off_cpu, off-cpu, "struct thread *", + "struct proc *"); +SDT_PROBE_DEFINE(sched, , , on_cpu, on-cpu); +SDT_PROBE_DEFINE(sched, , , remain_cpu, remain-cpu); +SDT_PROBE_DEFINE2(sched, , , surrender, surrender, "struct thread *", + "struct proc *"); + static __inline void sched_load_add(void) { sched_tdcnt++; KTR_COUNTER0(KTR_SCHED, "load", "global load", sched_tdcnt); + SDT_PROBE2(sched, , , load_change, NOCPU, sched_tdcnt); } static __inline void @@ -258,6 +278,7 @@ sched_load_rem(void) sched_tdcnt--; KTR_COUNTER0(KTR_SCHED, "load", "global load", sched_tdcnt); + SDT_PROBE2(sched, , , load_change, NOCPU, sched_tdcnt); } /* * Arrange to reschedule if necessary, taking the priorities and @@ -795,10 +816,13 @@ sched_priority(struct thread *td, u_char prio) KTR_POINT3(KTR_SCHED, "thread", sched_tdname(td), "priority change", "prio:%d", td->td_priority, "new prio:%d", prio, KTR_ATTR_LINKED, sched_tdname(curthread)); + SDT_PROBE3(sched, , , change_pri, td, td->td_proc, prio); if (td != curthread && prio > td->td_priority) { KTR_POINT3(KTR_SCHED, "thread", sched_tdname(curthread), "lend prio", "prio:%d", td->td_priority, "new prio:%d", prio, KTR_ATTR_LINKED, sched_tdname(td)); + SDT_PROBE4(sched, , , lend_pri, td, td->td_proc, prio, + curthread); } THREAD_LOCK_ASSERT(td, MA_OWNED); if (td->td_priority == prio) @@ -987,6 +1011,9 @@ sched_switch(struct thread *td, struct thread *newtd, int flags) if (PMC_PROC_IS_USING_PMCS(td->td_proc)) PMC_SWITCH_CONTEXT(td, PMC_FN_CSW_OUT); #endif + + SDT_PROBE2(sched, , , off_cpu, td, td->td_proc); + /* I feel sleepy */ lock_profile_release_lock(&sched_lock.lock_object); #ifdef KDTRACE_HOOKS @@ -1018,11 +1045,14 @@ sched_switch(struct thread *td, struct thread *newtd, int flags) * needed to, or the thread_wait() or wait() will * need to reap it. */ + + SDT_PROBE0(sched, , , on_cpu); #ifdef HWPMC_HOOKS if (PMC_PROC_IS_USING_PMCS(td->td_proc)) PMC_SWITCH_CONTEXT(td, PMC_FN_CSW_IN); #endif - } + } else + SDT_PROBE0(sched, , , remain_cpu); #ifdef SMP if (td->td_flags & TDF_IDLETD) @@ -1223,6 +1253,8 @@ sched_add(struct thread *td, int flags) sched_tdname(curthread)); KTR_POINT1(KTR_SCHED, "thread", sched_tdname(curthread), "wokeup", KTR_ATTR_LINKED, sched_tdname(td)); + SDT_PROBE4(sched, , , enqueue, td, td->td_proc, NULL, + flags & SRQ_PREEMPTED); /* @@ -1315,6 +1347,8 @@ sched_add(struct thread *td, int flags) sched_tdname(curthread)); KTR_POINT1(KTR_SCHED, "thread", sched_tdname(curthread), "wokeup", KTR_ATTR_LINKED, sched_tdname(td)); + SDT_PROBE4(sched, , , enqueue, td, td->td_proc, NULL, + flags & SRQ_PREEMPTED); /* * Now that the thread is moving to the run-queue, set the lock @@ -1362,6 +1396,7 @@ sched_rem(struct thread *td) KTR_STATE2(KTR_SCHED, "thread", sched_tdname(td), "runq rem", "prio:%d", td->td_priority, KTR_ATTR_LINKED, sched_tdname(curthread)); + SDT_PROBE3(sched, , , dequeue, td, td->td_proc, NULL); if ((td->td_flags & TDF_NOLOAD) == 0) sched_load_rem(); @@ -1425,6 +1460,8 @@ sched_choose(void) void sched_preempt(struct thread *td) { + + SDT_PROBE2(sched, , , surrender, td, td->td_proc); thread_lock(td); if (td->td_critnest > 1) td->td_owepreempt = 1; diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c index 7e5af09eaa5..726362d3af2 100644 --- a/sys/kern/sched_ule.c +++ b/sys/kern/sched_ule.c @@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -76,7 +77,7 @@ dtrace_vtime_switch_func_t dtrace_vtime_switch_func; #include #include -#if defined(__powerpc__) && defined(E500) +#if defined(__powerpc__) && defined(BOOKE_E500) #error "This architecture is not currently compatible with ULE" #endif @@ -327,6 +328,24 @@ static void sched_initticks(void *dummy); SYSINIT(sched_initticks, SI_SUB_CLOCKS, SI_ORDER_THIRD, sched_initticks, NULL); +SDT_PROVIDER_DEFINE(sched); + +SDT_PROBE_DEFINE3(sched, , , change_pri, change-pri, "struct thread *", + "struct proc *", "uint8_t"); +SDT_PROBE_DEFINE3(sched, , , dequeue, dequeue, "struct thread *", + "struct proc *", "void *"); +SDT_PROBE_DEFINE4(sched, , , enqueue, enqueue, "struct thread *", + "struct proc *", "void *", "int"); +SDT_PROBE_DEFINE4(sched, , , lend_pri, lend-pri, "struct thread *", + "struct proc *", "uint8_t", "struct thread *"); +SDT_PROBE_DEFINE2(sched, , , load_change, load-change, "int", "int"); +SDT_PROBE_DEFINE2(sched, , , off_cpu, off-cpu, "struct thread *", + "struct proc *"); +SDT_PROBE_DEFINE(sched, , , on_cpu, on-cpu); +SDT_PROBE_DEFINE(sched, , , remain_cpu, remain-cpu); +SDT_PROBE_DEFINE2(sched, , , surrender, surrender, "struct thread *", + "struct proc *"); + /* * Print the threads waiting on a run-queue. */ @@ -509,6 +528,7 @@ tdq_load_add(struct tdq *tdq, struct thread *td) if ((td->td_flags & TDF_NOLOAD) == 0) tdq->tdq_sysload++; KTR_COUNTER0(KTR_SCHED, "load", tdq->tdq_loadname, tdq->tdq_load); + SDT_PROBE2(sched, , , load_change, (int)TDQ_ID(tdq), tdq->tdq_load); } /* @@ -528,6 +548,7 @@ tdq_load_rem(struct tdq *tdq, struct thread *td) if ((td->td_flags & TDF_NOLOAD) == 0) tdq->tdq_sysload--; KTR_COUNTER0(KTR_SCHED, "load", tdq->tdq_loadname, tdq->tdq_load); + SDT_PROBE2(sched, , , load_change, (int)TDQ_ID(tdq), tdq->tdq_load); } /* @@ -1625,10 +1646,13 @@ sched_thread_priority(struct thread *td, u_char prio) KTR_POINT3(KTR_SCHED, "thread", sched_tdname(td), "prio", "prio:%d", td->td_priority, "new prio:%d", prio, KTR_ATTR_LINKED, sched_tdname(curthread)); + SDT_PROBE3(sched, , , change_pri, td, td->td_proc, prio); if (td != curthread && prio > td->td_priority) { KTR_POINT3(KTR_SCHED, "thread", sched_tdname(curthread), "lend prio", "prio:%d", td->td_priority, "new prio:%d", prio, KTR_ATTR_LINKED, sched_tdname(td)); + SDT_PROBE4(sched, , , lend_pri, td, td->td_proc, prio, + curthread); } ts = td->td_sched; THREAD_LOCK_ASSERT(td, MA_OWNED); @@ -1879,6 +1903,7 @@ sched_switch(struct thread *td, struct thread *newtd, int flags) if (PMC_PROC_IS_USING_PMCS(td->td_proc)) PMC_SWITCH_CONTEXT(td, PMC_FN_CSW_OUT); #endif + SDT_PROBE2(sched, , , off_cpu, td, td->td_proc); lock_profile_release_lock(&TDQ_LOCKPTR(tdq)->lock_object); TDQ_LOCKPTR(tdq)->mtx_lock = (uintptr_t)newtd; sched_pctcpu_update(newtd->td_sched, 0); @@ -1903,12 +1928,16 @@ sched_switch(struct thread *td, struct thread *newtd, int flags) tdq = TDQ_CPU(cpuid); lock_profile_obtain_lock_success( &TDQ_LOCKPTR(tdq)->lock_object, 0, 0, __FILE__, __LINE__); + + SDT_PROBE0(sched, , , on_cpu); #ifdef HWPMC_HOOKS if (PMC_PROC_IS_USING_PMCS(td->td_proc)) PMC_SWITCH_CONTEXT(td, PMC_FN_CSW_IN); #endif - } else + } else { thread_unblock_switch(td, mtx); + SDT_PROBE0(sched, , , remain_cpu); + } /* * Assert that all went well and return. */ @@ -2102,6 +2131,8 @@ sched_preempt(struct thread *td) { struct tdq *tdq; + SDT_PROBE2(sched, , , surrender, td, td->td_proc); + thread_lock(td); tdq = TDQ_SELF(); TDQ_LOCK_ASSERT(tdq, MA_OWNED); @@ -2330,6 +2361,8 @@ sched_add(struct thread *td, int flags) sched_tdname(curthread)); KTR_POINT1(KTR_SCHED, "thread", sched_tdname(curthread), "wokeup", KTR_ATTR_LINKED, sched_tdname(td)); + SDT_PROBE4(sched, , , enqueue, td, td->td_proc, NULL, + flags & SRQ_PREEMPTED); THREAD_LOCK_ASSERT(td, MA_OWNED); /* * Recalculate the priority before we select the target cpu or @@ -2375,6 +2408,7 @@ sched_rem(struct thread *td) KTR_STATE1(KTR_SCHED, "thread", sched_tdname(td), "runq rem", "prio:%d", td->td_priority); + SDT_PROBE3(sched, , , dequeue, td, td->td_proc, NULL); tdq = TDQ_CPU(td->td_sched->ts_cpu); TDQ_LOCK_ASSERT(tdq, MA_OWNED); MPASS(td->td_lock == TDQ_LOCKPTR(tdq)); diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index e72ab771cff..def16526f38 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -1810,6 +1810,8 @@ device_add_child_ordered(device_t dev, u_int order, const char *name, int unit) PDEBUG(("%s at %s with order %u as unit %d", name, DEVICENAME(dev), order, unit)); + KASSERT(name != NULL || unit == -1, + ("child device with wildcard name and specific unit number")); child = make_device(dev, name, unit); if (child == NULL) diff --git a/sys/kern/subr_devstat.c b/sys/kern/subr_devstat.c index bbbfdbfcaa0..20e6e025d13 100644 --- a/sys/kern/subr_devstat.c +++ b/sys/kern/subr_devstat.c @@ -29,6 +29,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_kdtrace.h" + #include #include #include @@ -44,6 +46,54 @@ __FBSDID("$FreeBSD$"); #include +#ifdef KDTRACE_HOOKS +#include + +dtrace_io_start_probe_func_t dtrace_io_start_probe; +dtrace_io_done_probe_func_t dtrace_io_done_probe; +dtrace_io_wait_start_probe_func_t dtrace_io_wait_start_probe; +dtrace_io_wait_done_probe_func_t dtrace_io_wait_done_probe; + +uint32_t dtio_start_id; +uint32_t dtio_done_id; +uint32_t dtio_wait_start_id; +uint32_t dtio_wait_done_id; + +#define DTRACE_DEVSTAT_START() \ + if (dtrace_io_start_probe != NULL) \ + (*dtrace_io_start_probe)(dtio_start_id, NULL, ds); + +#define DTRACE_DEVSTAT_BIO_START() \ + if (dtrace_io_start_probe != NULL) \ + (*dtrace_io_start_probe)(dtio_start_id, bp, ds); + +#define DTRACE_DEVSTAT_DONE() \ + if (dtrace_io_done_probe != NULL) \ + (*dtrace_io_done_probe)(dtio_done_id, NULL, ds); + +#define DTRACE_DEVSTAT_BIO_DONE() \ + if (dtrace_io_done_probe != NULL) \ + (*dtrace_io_done_probe)(dtio_done_id, bp, ds); + +#define DTRACE_DEVSTAT_WAIT_START() \ + if (dtrace_io_wait_start_probe != NULL) \ + (*dtrace_io_wait_start_probe)(dtio_wait_start_id, NULL, ds); + +#define DTRACE_DEVSTAT_WAIT_DONE() \ + if (dtrace_io_wait_done_probe != NULL) \ + (*dtrace_io_wait_done_probe)(dtio_wait_done_id, NULL, ds); + +#else /* ! KDTRACE_HOOKS */ + +#define DTRACE_DEVSTAT_START() + +#define DTRACE_DEVSTAT_DONE() + +#define DTRACE_DEVSTAT_WAIT_START() + +#define DTRACE_DEVSTAT_WAIT_DONE() +#endif /* KDTRACE_HOOKS */ + static int devstat_num_devs; static long devstat_generation = 1; static int devstat_version = DEVSTAT_VERSION; @@ -227,6 +277,7 @@ devstat_start_transaction(struct devstat *ds, struct bintime *now) } ds->start_count++; atomic_add_rel_int(&ds->sequence0, 1); + DTRACE_DEVSTAT_START(); } void @@ -241,6 +292,7 @@ devstat_start_transaction_bio(struct devstat *ds, struct bio *bp) binuptime(&bp->bio_t0); devstat_start_transaction(ds, &bp->bio_t0); + DTRACE_DEVSTAT_BIO_START(); } /* @@ -312,6 +364,7 @@ devstat_end_transaction(struct devstat *ds, uint32_t bytes, ds->end_count++; atomic_add_rel_int(&ds->sequence0, 1); + DTRACE_DEVSTAT_DONE(); } void @@ -334,6 +387,7 @@ devstat_end_transaction_bio(struct devstat *ds, struct bio *bp) devstat_end_transaction(ds, bp->bio_bcount - bp->bio_resid, DEVSTAT_TAG_SIMPLE, flg, NULL, &bp->bio_t0); + DTRACE_DEVSTAT_BIO_DONE(); } /* diff --git a/sys/kern/subr_dummy_vdso_tc.c b/sys/kern/subr_dummy_vdso_tc.c new file mode 100644 index 00000000000..9c845014f50 --- /dev/null +++ b/sys/kern/subr_dummy_vdso_tc.c @@ -0,0 +1,49 @@ +/*- + * Copyright 2012 Konstantin Belousov . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_compat.h" + +#include +#include + +uint32_t +cpu_fill_vdso_timehands(struct vdso_timehands *vdso_th) +{ + + return (0); +} + +#ifdef COMPAT_FREEBSD32 +uint32_t +cpu_fill_vdso_timehands32(struct vdso_timehands32 *vdso_th32) +{ + + return (0); +} +#endif diff --git a/sys/kern/subr_firmware.c b/sys/kern/subr_firmware.c index 2081987c6ff..20ab76e282b 100644 --- a/sys/kern/subr_firmware.c +++ b/sys/kern/subr_firmware.c @@ -198,7 +198,7 @@ firmware_register(const char *imagename, const void *data, size_t datasize, free(str, M_TEMP); return NULL; } - bzero(frp, sizeof(frp)); /* start from a clean record */ + bzero(frp, sizeof(*frp)); /* start from a clean record */ frp->fw.name = str; frp->fw.data = data; frp->fw.datasize = datasize; diff --git a/sys/kern/subr_rman.c b/sys/kern/subr_rman.c index db8eb2fe0de..e43dfcff0da 100644 --- a/sys/kern/subr_rman.c +++ b/sys/kern/subr_rman.c @@ -161,6 +161,7 @@ int rman_manage_region(struct rman *rm, u_long start, u_long end) { struct resource_i *r, *s, *t; + int rv = 0; DPRINTF(("rman_manage_region: <%s> request: start %#lx, end %#lx\n", rm->rm_descr, start, end)); @@ -188,13 +189,17 @@ rman_manage_region(struct rman *rm, u_long start, u_long end) TAILQ_INSERT_TAIL(&rm->rm_list, r, r_link); } else { /* Check for any overlap with the current region. */ - if (r->r_start <= s->r_end && r->r_end >= s->r_start) - return EBUSY; + if (r->r_start <= s->r_end && r->r_end >= s->r_start) { + rv = EBUSY; + goto out; + } /* Check for any overlap with the next region. */ t = TAILQ_NEXT(s, r_link); - if (t && r->r_start <= t->r_end && r->r_end >= t->r_start) - return EBUSY; + if (t && r->r_start <= t->r_end && r->r_end >= t->r_start) { + rv = EBUSY; + goto out; + } /* * See if this region can be merged with the next region. If @@ -225,9 +230,9 @@ rman_manage_region(struct rman *rm, u_long start, u_long end) TAILQ_INSERT_BEFORE(s, r, r_link); } } - +out: mtx_unlock(rm->rm_mtx); - return 0; + return rv; } int diff --git a/sys/kern/subr_sleepqueue.c b/sys/kern/subr_sleepqueue.c index bbf79db8833..b868289e720 100644 --- a/sys/kern/subr_sleepqueue.c +++ b/sys/kern/subr_sleepqueue.c @@ -64,6 +64,7 @@ __FBSDID("$FreeBSD$"); #include "opt_sleepqueue_profiling.h" #include "opt_ddb.h" +#include "opt_kdtrace.h" #include "opt_sched.h" #include @@ -75,6 +76,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -166,6 +168,9 @@ static int sleepq_resume_thread(struct sleepqueue *sq, struct thread *td, static void sleepq_switch(void *wchan, int pri); static void sleepq_timeout(void *arg); +SDT_PROBE_DECLARE(sched, , , sleep); +SDT_PROBE_DECLARE(sched, , , wakeup); + /* * Early initialization of sleep queues that is called from the sleepinit() * SYSINIT. @@ -534,6 +539,7 @@ sleepq_switch(void *wchan, int pri) MPASS(td->td_sleepqueue == NULL); sched_sleep(td, pri); thread_lock_set(td, &sc->sc_lock); + SDT_PROBE0(sched, , , sleep); TD_SET_SLEEPING(td); mi_switch(SW_VOL | SWT_SLEEPQ, NULL); KASSERT(TD_IS_RUNNING(td), ("running but not TDS_RUNNING")); @@ -715,6 +721,8 @@ sleepq_resume_thread(struct sleepqueue *sq, struct thread *td, int pri) sc = SC_LOOKUP(sq->sq_wchan); mtx_assert(&sc->sc_lock, MA_OWNED); + SDT_PROBE2(sched, , , wakeup, td, td->td_proc); + /* Remove the thread from the queue. */ sq->sq_blockedcnt[td->td_sqqueue]--; TAILQ_REMOVE(&sq->sq_blocked[td->td_sqqueue], td, td_slpq); diff --git a/sys/kern/subr_smp.c b/sys/kern/subr_smp.c index 5dd0c556b5b..4c73b6101dd 100644 --- a/sys/kern/subr_smp.c +++ b/sys/kern/subr_smp.c @@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$"); #ifdef SMP volatile cpuset_t stopped_cpus; volatile cpuset_t started_cpus; +volatile cpuset_t suspended_cpus; cpuset_t hlt_cpus_mask; cpuset_t logical_cpus_mask; @@ -207,9 +208,10 @@ generic_stop_cpus(cpuset_t map, u_int type) #endif static volatile u_int stopping_cpu = NOCPU; int i; + volatile cpuset_t *cpus; KASSERT( -#if defined(__amd64__) +#if defined(__amd64__) || defined(__i386__) type == IPI_STOP || type == IPI_STOP_HARD || type == IPI_SUSPEND, #else type == IPI_STOP || type == IPI_STOP_HARD, @@ -231,8 +233,15 @@ generic_stop_cpus(cpuset_t map, u_int type) /* send the stop IPI to all CPUs in map */ ipi_selected(map, type); +#if defined(__amd64__) || defined(__i386__) + if (type == IPI_SUSPEND) + cpus = &suspended_cpus; + else +#endif + cpus = &stopped_cpus; + i = 0; - while (!CPU_SUBSET(&stopped_cpus, &map)) { + while (!CPU_SUBSET(cpus, &map)) { /* spin */ cpu_spinwait(); i++; @@ -260,7 +269,7 @@ stop_cpus_hard(cpuset_t map) return (generic_stop_cpus(map, IPI_STOP_HARD)); } -#if defined(__amd64__) +#if defined(__amd64__) || defined(__i386__) int suspend_cpus(cpuset_t map) { diff --git a/sys/kern/subr_syscall.c b/sys/kern/subr_syscall.c index 5b485959370..5aee684285b 100644 --- a/sys/kern/subr_syscall.c +++ b/sys/kern/subr_syscall.c @@ -182,6 +182,12 @@ syscallret(struct thread *td, int error, struct syscall_args *sa __unused) KASSERT(td->td_locks == 0, ("System call %s returning with %d locks held", syscallname(p, sa->code), td->td_locks)); + KASSERT((td->td_pflags & TDP_NOFAULTING) == 0, + ("System call %s returning with pagefaults disabled", + syscallname(p, sa->code))); + KASSERT((td->td_pflags & TDP_NOSLEEPING) == 0, + ("System call %s returning with sleep disabled", + syscallname(p, sa->code))); /* * Handle reschedule and other end-of-syscall issues diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c index e57ab9eb5a1..095bbdf73b1 100644 --- a/sys/kern/subr_trap.c +++ b/sys/kern/subr_trap.c @@ -44,7 +44,6 @@ #include __FBSDID("$FreeBSD$"); -#include "opt_capsicum.h" #include "opt_hwpmc_hooks.h" #include "opt_ktrace.h" #include "opt_kdtrace.h" diff --git a/sys/kern/subr_turnstile.c b/sys/kern/subr_turnstile.c index c3370db4f08..76fb9640036 100644 --- a/sys/kern/subr_turnstile.c +++ b/sys/kern/subr_turnstile.c @@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$"); #include "opt_ddb.h" +#include "opt_kdtrace.h" #include "opt_turnstile_profiling.h" #include "opt_sched.h" @@ -73,6 +74,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -167,6 +169,11 @@ static void turnstile_dtor(void *mem, int size, void *arg); static int turnstile_init(void *mem, int size, int flags); static void turnstile_fini(void *mem, int size); +SDT_PROVIDER_DECLARE(sched); +SDT_PROBE_DEFINE(sched, , , sleep, sleep); +SDT_PROBE_DEFINE2(sched, , , wakeup, wakeup, "struct thread *", + "struct proc *"); + /* * Walks the chain of turnstiles and their owners to propagate the priority * of the thread being blocked to all the threads holding locks that have to @@ -740,6 +747,8 @@ turnstile_wait(struct turnstile *ts, struct thread *owner, int queue) CTR4(KTR_LOCK, "%s: td %d blocked on [%p] %s", __func__, td->td_tid, lock, lock->lo_name); + SDT_PROBE0(sched, , , sleep); + THREAD_LOCKPTR_ASSERT(td, &ts->ts_lock); mi_switch(SW_VOL | SWT_TURNSTILE, NULL); @@ -916,6 +925,7 @@ turnstile_unpend(struct turnstile *ts, int owner_type) while (!TAILQ_EMPTY(&pending_threads)) { td = TAILQ_FIRST(&pending_threads); TAILQ_REMOVE(&pending_threads, td, td_lockq); + SDT_PROBE2(sched, , , wakeup, td, td->td_proc); thread_lock(td); THREAD_LOCKPTR_ASSERT(td, &ts->ts_lock); MPASS(td->td_proc->p_magic == P_MAGIC); diff --git a/sys/kern/subr_witness.c b/sys/kern/subr_witness.c index 52045b6802f..aeaa3d28a4c 100644 --- a/sys/kern/subr_witness.c +++ b/sys/kern/subr_witness.c @@ -564,7 +564,7 @@ static struct witness_order_list_entry order_lists[] = { */ { "bpf global lock", &lock_class_mtx_sleep }, { "bpf interface lock", &lock_class_rw }, - { "bpf cdev lock", &lock_class_rw }, + { "bpf cdev lock", &lock_class_mtx_sleep }, { NULL, NULL }, /* * NFS server @@ -593,19 +593,22 @@ static struct witness_order_list_entry order_lists[] = { /* * CDEV */ - { "system map", &lock_class_mtx_sleep }, - { "vm page queue mutex", &lock_class_mtx_sleep }, + { "vm map (system)", &lock_class_mtx_sleep }, + { "vm page queue", &lock_class_mtx_sleep }, { "vnode interlock", &lock_class_mtx_sleep }, { "cdev", &lock_class_mtx_sleep }, { NULL, NULL }, /* * VM - * */ + { "vm map (user)", &lock_class_sx }, { "vm object", &lock_class_mtx_sleep }, - { "page lock", &lock_class_mtx_sleep }, - { "vm page queue mutex", &lock_class_mtx_sleep }, + { "vm page", &lock_class_mtx_sleep }, + { "vm page queue", &lock_class_mtx_sleep }, + { "pmap pv global", &lock_class_rw }, { "pmap", &lock_class_mtx_sleep }, + { "pmap pv list", &lock_class_rw }, + { "vm page free queue", &lock_class_mtx_sleep }, { NULL, NULL }, /* * kqueue/VFS interaction diff --git a/sys/kern/sys_capability.c b/sys/kern/sys_capability.c index b6d19bbeb39..fa763561682 100644 --- a/sys/kern/sys_capability.c +++ b/sys/kern/sys_capability.c @@ -51,12 +51,12 @@ * anonymous, rather than named, POSIX shared memory objects. */ -#include "opt_capsicum.h" -#include "opt_ktrace.h" - #include __FBSDID("$FreeBSD$"); +#include "opt_capsicum.h" +#include "opt_ktrace.h" + #include #include #include diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 5d667ee563b..cfaf9fc61a2 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -1255,7 +1255,7 @@ sys_poll(td, uap) struct pollfd *bits; struct pollfd smallbits[32]; struct timeval atv, rtv, ttv; - int error = 0, timo; + int error, timo; u_int nfds; size_t ni; diff --git a/sys/kern/sys_procdesc.c b/sys/kern/sys_procdesc.c index 08d345f2ef3..0bf79b8fb79 100644 --- a/sys/kern/sys_procdesc.c +++ b/sys/kern/sys_procdesc.c @@ -338,7 +338,7 @@ procdesc_reap(struct proc *p) /* * procdesc_close() - last close on a process descriptor. If the process is - * still running, terminate with SIGKILL (unless PD_DAEMON is set) and let + * still running, terminate with SIGKILL (unless PDF_DAEMON is set) and let * init(8) clean up the mess; if not, we have to clean up the zombie ourselves. */ static int @@ -386,7 +386,7 @@ procdesc_close(struct file *fp, struct thread *td) */ p->p_sigparent = SIGCHLD; proc_reparent(p, initproc); - if ((pd->pd_flags & PD_DAEMON) == 0) + if ((pd->pd_flags & PDF_DAEMON) == 0) kern_psignal(p, SIGKILL); PROC_UNLOCK(p); sx_xunlock(&proctree_lock); diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 9c6c204feca..10209ec6ff4 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -635,7 +635,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) struct iovec iov; struct uio uio; struct proc *curp, *p, *pp; - struct thread *td2 = NULL; + struct thread *td2 = NULL, *td3; struct ptrace_io_desc *piod = NULL; struct ptrace_lwpinfo *pl; int error, write, tmp, num; @@ -953,10 +953,8 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) td2->td_xsig = data; if (req == PT_DETACH) { - struct thread *td3; - FOREACH_THREAD_IN_PROC(p, td3) { + FOREACH_THREAD_IN_PROC(p, td3) td3->td_dbgflags &= ~TDB_SUSPEND; - } } /* * unsuspend all threads, to not let a thread run, @@ -967,6 +965,8 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) p->p_flag &= ~(P_STOPPED_TRACE|P_STOPPED_SIG|P_WAITED); thread_unsuspend(p); PROC_SUNLOCK(p); + if (req == PT_ATTACH) + kern_psignal(p, data); } else { if (data) kern_psignal(p, data); diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c index dd82db7ec83..a2ea5c8bcdb 100644 --- a/sys/kern/syscalls.c +++ b/sys/kern/syscalls.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/kern/syscalls.master 227691 2011-11-19 06:35:15Z ed + * created from FreeBSD: head/sys/kern/syscalls.master 236026 2012-05-25 21:50:48Z ed */ const char *syscallnames[] = { diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index e10af89a2b5..f62dad7642d 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -916,9 +916,9 @@ 512 AUE_SHMCTL NOSTD { int shmctl(int shmid, int cmd, \ struct shmid_ds *buf); } 513 AUE_LPATHCONF STD { int lpathconf(char *path, int name); } -514 AUE_CAP_NEW STD { int cap_new(int fd, u_int64_t rights); } +514 AUE_CAP_NEW STD { int cap_new(int fd, uint64_t rights); } 515 AUE_CAP_GETRIGHTS STD { int cap_getrights(int fd, \ - u_int64_t *rightsp); } + uint64_t *rightsp); } 516 AUE_CAP_ENTER STD { int cap_enter(void); } 517 AUE_CAP_GETMODE STD { int cap_getmode(u_int *modep); } 518 AUE_PDFORK STD { int pdfork(int *fdp, int flags); } diff --git a/sys/kern/systrace_args.c b/sys/kern/systrace_args.c index 4a5d72a983f..522954bef55 100644 --- a/sys/kern/systrace_args.c +++ b/sys/kern/systrace_args.c @@ -3121,7 +3121,7 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) case 514: { struct cap_new_args *p = params; iarg[0] = p->fd; /* int */ - uarg[1] = p->rights; /* u_int64_t */ + uarg[1] = p->rights; /* uint64_t */ *n_args = 2; break; } @@ -3129,7 +3129,7 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) case 515: { struct cap_getrights_args *p = params; iarg[0] = p->fd; /* int */ - uarg[1] = (intptr_t) p->rightsp; /* u_int64_t * */ + uarg[1] = (intptr_t) p->rightsp; /* uint64_t * */ *n_args = 2; break; } @@ -8434,7 +8434,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 1: - p = "u_int64_t"; + p = "uint64_t"; break; default: break; @@ -8447,7 +8447,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) p = "int"; break; case 1: - p = "u_int64_t *"; + p = "uint64_t *"; break; default: break; diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 8ca6bdf6a7c..e9c0fb6fe55 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -219,9 +219,15 @@ ttydev_leave(struct tty *tp) static int ttydev_open(struct cdev *dev, int oflags, int devtype, struct thread *td) { - struct tty *tp = dev->si_drv1; + struct tty *tp; int error = 0; + while ((tp = dev->si_drv1) == NULL) { + error = tsleep(&dev->si_drv1, PCATCH, "ttdrv1", 1); + if (error != EWOULDBLOCK) + return (error); + } + tty_lock(tp); if (tty_gone(tp)) { /* Device is already gone. */ @@ -738,9 +744,14 @@ static struct cdevsw ttydev_cdevsw = { static int ttyil_open(struct cdev *dev, int oflags, int devtype, struct thread *td) { - struct tty *tp = dev->si_drv1; + struct tty *tp; int error = 0; + while ((tp = dev->si_drv1) == NULL) { + error = tsleep(&dev->si_drv1, PCATCH, "ttdrv1", 1); + if (error != EWOULDBLOCK) + return (error); + } tty_lock(tp); if (tty_gone(tp)) error = ENODEV; @@ -1203,6 +1214,7 @@ tty_makedev(struct tty *tp, struct ucred *cred, const char *fmt, ...) dev = make_dev_cred(&ttydev_cdevsw, 0, cred, uid, gid, mode, "%s%s", prefix, name); dev->si_drv1 = tp; + wakeup(&dev->si_drv1); tp->t_dev = dev; /* Slave call-in devices. */ @@ -1211,12 +1223,14 @@ tty_makedev(struct tty *tp, struct ucred *cred, const char *fmt, ...) uid, gid, mode, "%s%s.init", prefix, name); dev_depends(tp->t_dev, dev); dev->si_drv1 = tp; + wakeup(&dev->si_drv1); dev->si_drv2 = &tp->t_termios_init_in; dev = make_dev_cred(&ttyil_cdevsw, TTYUNIT_LOCK, cred, uid, gid, mode, "%s%s.lock", prefix, name); dev_depends(tp->t_dev, dev); dev->si_drv1 = tp; + wakeup(&dev->si_drv1); dev->si_drv2 = &tp->t_termios_lock_in; } @@ -1226,6 +1240,7 @@ tty_makedev(struct tty *tp, struct ucred *cred, const char *fmt, ...) UID_UUCP, GID_DIALER, 0660, "cua%s", name); dev_depends(tp->t_dev, dev); dev->si_drv1 = tp; + wakeup(&dev->si_drv1); /* Slave call-out devices. */ if (tp->t_flags & TF_INITLOCK) { @@ -1234,6 +1249,7 @@ tty_makedev(struct tty *tp, struct ucred *cred, const char *fmt, ...) UID_UUCP, GID_DIALER, 0660, "cua%s.init", name); dev_depends(tp->t_dev, dev); dev->si_drv1 = tp; + wakeup(&dev->si_drv1); dev->si_drv2 = &tp->t_termios_init_out; dev = make_dev_cred(&ttyil_cdevsw, @@ -1241,6 +1257,7 @@ tty_makedev(struct tty *tp, struct ucred *cred, const char *fmt, ...) UID_UUCP, GID_DIALER, 0660, "cua%s.lock", name); dev_depends(tp->t_dev, dev); dev->si_drv1 = tp; + wakeup(&dev->si_drv1); dev->si_drv2 = &tp->t_termios_lock_out; } } @@ -1817,9 +1834,6 @@ ttyhook_register(struct tty **rtp, struct proc *p, int fd, { struct tty *tp; struct file *fp; -#ifdef CAPABILITIES - struct file *fp_cap; -#endif struct cdev *dev; struct cdevsw *cdp; struct filedesc *fdp; @@ -1838,10 +1852,9 @@ ttyhook_register(struct tty **rtp, struct proc *p, int fd, } #ifdef CAPABILITIES - fp_cap = fp; - error = cap_funwrap(fp_cap, CAP_TTYHOOK, &fp); + error = cap_funwrap(fp, CAP_TTYHOOK, &fp); if (error) - return (error); + goto done1; #endif /* diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index f18afeca2b2..88876fe1d8f 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -635,7 +635,7 @@ sofree(struct socket *so) so->so_qstate & SQ_COMP, so->so_qstate & SQ_INCOMP)); if (so->so_options & SO_ACCEPTCONN) { KASSERT((TAILQ_EMPTY(&so->so_comp)), ("sofree: so_comp populated")); - KASSERT((TAILQ_EMPTY(&so->so_incomp)), ("sofree: so_comp populated")); + KASSERT((TAILQ_EMPTY(&so->so_incomp)), ("sofree: so_incomp populated")); } SOCK_UNLOCK(so); ACCEPT_UNLOCK(); diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 4502e434da2..00f45e0877a 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -134,8 +134,7 @@ getsock_cap(struct filedesc *fdp, int fd, cap_rights_t rights, int error; #endif - fp = NULL; - if ((fdp == NULL) || ((fp = fget_unlocked(fdp, fd)) == NULL)) + if (fdp == NULL || (fp = fget_unlocked(fdp, fd)) == NULL) return (EBADF); #ifdef CAPABILITIES /* @@ -179,7 +178,6 @@ sys_socket(td, uap) int protocol; } */ *uap; { - struct filedesc *fdp; struct socket *so; struct file *fp; int fd, error; @@ -191,7 +189,6 @@ sys_socket(td, uap) if (error) return (error); #endif - fdp = td->td_proc->p_fd; error = falloc(td, &fp, &fd, 0); if (error) return (error); @@ -199,7 +196,7 @@ sys_socket(td, uap) error = socreate(uap->domain, &so, uap->type, uap->protocol, td->td_ucred, td); if (error) { - fdclose(fdp, fp, fd, td); + fdclose(td->td_proc->p_fd, fp, fd, td); } else { finit(fp, FREAD | FWRITE, DTYPE_SOCKET, so, &socketops); td->td_retval[0] = fd; @@ -1962,6 +1959,7 @@ kern_sendfile(struct thread *td, struct sendfile_args *uap, * and takes care of the overall progress. */ for (off = uap->offset, rem = uap->nbytes; ; ) { + struct mbuf *mtail = NULL; int loopbytes = 0; int space = 0; int done = 0; @@ -2181,10 +2179,13 @@ retry_space: m0->m_len = xfsize; /* Append to mbuf chain. */ - if (m != NULL) - m_cat(m, m0); + if (mtail != NULL) + mtail->m_next = m0; + else if (m != NULL) + m_last(m)->m_next = m0; else m = m0; + mtail = m0; /* Keep track of bits processed. */ loopbytes += xfsize; @@ -2309,25 +2310,23 @@ sys_sctp_peeloff(td, uap) } */ *uap; { #if (defined(INET) || defined(INET6)) && defined(SCTP) - struct filedesc *fdp; struct file *nfp = NULL; int error; struct socket *head, *so; int fd; u_int fflag; - fdp = td->td_proc->p_fd; AUDIT_ARG_FD(uap->sd); error = fgetsock(td, uap->sd, CAP_PEELOFF, &head, &fflag); if (error) goto done2; if (head->so_proto->pr_protocol != IPPROTO_SCTP) { error = EOPNOTSUPP; - goto done2; + goto done; } error = sctp_can_peel_off(head, (sctp_assoc_t)uap->name); if (error) - goto done2; + goto done; /* * At this point we know we do have a assoc to pull * we proceed to get the fd setup. This may block @@ -2374,7 +2373,7 @@ noconnection: * out from under us. */ if (error) - fdclose(fdp, nfp, fd, td); + fdclose(td->td_proc->p_fd, nfp, fd, td); /* * Release explicitly held references before returning. diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 72cc483da26..504d5810b9a 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -1872,7 +1872,7 @@ unp_internalize(struct mbuf **controlp, struct thread *td) FILEDESC_SLOCK(fdescp); for (i = 0; i < oldfds; i++) { fd = *fdp++; - if ((unsigned)fd >= fdescp->fd_nfiles || + if (fd < 0 || fd >= fdescp->fd_nfiles || fdescp->fd_ofiles[fd] == NULL) { FILEDESC_SUNLOCK(fdescp); error = EBADF; diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 4eac76d133a..626847c6fd3 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -2640,8 +2640,8 @@ loop: if (bp != NULL) { int lockflags; /* - * Buffer is in-core. If the buffer is not busy, it must - * be on a queue. + * Buffer is in-core. If the buffer is not busy nor managed, + * it must be on a queue. */ lockflags = LK_EXCLUSIVE | LK_SLEEPFAIL | LK_INTERLOCK; @@ -2671,9 +2671,13 @@ loop: bp->b_flags &= ~B_CACHE; else if ((bp->b_flags & (B_VMIO | B_INVAL)) == 0) bp->b_flags |= B_CACHE; - BO_LOCK(bo); - bremfree(bp); - BO_UNLOCK(bo); + if (bp->b_flags & B_MANAGED) + MPASS(bp->b_qindex == QUEUE_NONE); + else { + BO_LOCK(bo); + bremfree(bp); + BO_UNLOCK(bo); + } /* * check for size inconsistancies for non-VMIO case. @@ -3991,7 +3995,9 @@ DB_SHOW_COMMAND(buffer, db_show_buffer) } db_printf("buf at %p\n", bp); - db_printf("b_flags = 0x%b\n", (u_int)bp->b_flags, PRINT_BUF_FLAGS); + db_printf("b_flags = 0x%b, b_xflags=0x%b, b_vflags=0x%b\n", + (u_int)bp->b_flags, PRINT_BUF_FLAGS, (u_int)bp->b_xflags, + PRINT_BUF_XFLAGS, (u_int)bp->b_vflags, PRINT_BUF_VFLAGS); db_printf( "b_error = %d, b_bufsize = %ld, b_bcount = %ld, b_resid = %ld\n" "b_bufobj = (%p), b_data = %p, b_blkno = %jd, b_lblkno = %jd, " diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index 4e627658388..b807db892bd 100644 --- a/sys/kern/vfs_default.c +++ b/sys/kern/vfs_default.c @@ -343,8 +343,8 @@ dirent_exists(struct vnode *vp, const char *dirname, struct thread *td) if (error) goto out; - if ((dp->d_type != DT_WHT) && - !strcmp(dp->d_name, dirname)) { + if (dp->d_type != DT_WHT && dp->d_fileno != 0 && + strcmp(dp->d_name, dirname) == 0) { found = 1; goto out; } @@ -646,8 +646,17 @@ loop2: if ((bp->b_vflags & BV_SCANNED) != 0) continue; bp->b_vflags |= BV_SCANNED; - if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL)) - continue; + if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL)) { + if (ap->a_waitfor != MNT_WAIT) + continue; + if (BUF_LOCK(bp, + LK_EXCLUSIVE | LK_INTERLOCK | LK_SLEEPFAIL, + BO_MTX(bo)) != 0) { + BO_LOCK(bo); + goto loop1; + } + BO_LOCK(bo); + } BO_UNLOCK(bo); KASSERT(bp->b_bufobj == bo, ("bp %p wrong b_bufobj %p should be %p", diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index a06ba3146de..1d6136aed28 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -73,9 +73,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#ifdef SW_WATCHDOG #include -#endif #include @@ -1027,6 +1025,7 @@ alloc: if ((mp->mnt_kern_flag & MNTK_NOKNOTE) != 0) vp->v_vflag |= VV_NOKNOTE; } + rangelock_init(&vp->v_rl); *vpp = vp; return (0); @@ -1868,10 +1867,10 @@ sched_sync(void) LIST_INSERT_HEAD(next, bo, bo_synclist); continue; } -#ifdef SW_WATCHDOG + if (first_printf == 0) wdog_kern_pat(WD_LASTVAL); -#endif + } if (!LIST_EMPTY(gslp)) { mtx_unlock(&sync_mtx); @@ -2468,6 +2467,7 @@ vdropl(struct vnode *vp) /* XXX Elsewhere we detect an already freed vnode via NULL v_op. */ vp->v_op = NULL; #endif + rangelock_destroy(&vp->v_rl); lockdestroy(vp->v_vnlock); mtx_destroy(&vp->v_interlock); mtx_destroy(BO_MTX(bo)); diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 04005041f12..66ab5a31975 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1093,8 +1093,7 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, struct file *fp; struct vnode *vp; int cmode; - struct file *nfp; - int type, indx = -1, error, error_open; + int type, indx = -1, error; struct flock lf; struct nameidata nd; int vfslocked; @@ -1111,19 +1110,22 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, if (flags & O_EXEC) { if (flags & O_ACCMODE) return (EINVAL); - } else if ((flags & O_ACCMODE) == O_ACCMODE) + } else if ((flags & O_ACCMODE) == O_ACCMODE) { return (EINVAL); - else + } else { flags = FFLAGS(flags); + } /* - * allocate the file descriptor, but don't install a descriptor yet + * Allocate the file descriptor, but don't install a descriptor yet. */ - error = falloc_noinstall(td, &nfp); + error = falloc_noinstall(td, &fp); if (error) return (error); - /* An extra reference on `nfp' has been held for us by falloc_noinstall(). */ - fp = nfp; + /* + * An extra reference on `fp' has been held for us by + * falloc_noinstall(). + */ /* Set the flags early so the finit in devfs can pick them up. */ fp->f_flag = flags & FMASK; cmode = ((mode &~ fdp->fd_cmask) & ALLPERMS) &~ S_ISTXT; @@ -1141,36 +1143,24 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, goto success; /* - * handle special fdopen() case. bleh. dupfdopen() is - * responsible for dropping the old contents of ofiles[indx] - * if it succeeds. + * Handle special fdopen() case. bleh. * * Don't do this for relative (capability) lookups; we don't * understand exactly what would happen, and we don't think * that it ever should. */ - if ((nd.ni_strictrelative == 0) && + if (nd.ni_strictrelative == 0 && (error == ENODEV || error == ENXIO) && - (td->td_dupfd >= 0)) { - /* XXX from fdopen */ - error_open = error; - if ((error = finstall(td, fp, &indx, flags)) != 0) - goto bad_unlocked; - if ((error = dupfdopen(td, fdp, indx, td->td_dupfd, - flags, error_open)) == 0) + td->td_dupfd >= 0) { + error = dupfdopen(td, fdp, td->td_dupfd, flags, error, + &indx); + if (error == 0) goto success; } - /* - * Clean up the descriptor, but only if another thread hadn't - * replaced or closed it. - */ - if (indx != -1) - fdclose(fdp, fp, indx, td); - fdrop(fp, td); if (error == ERESTART) error = EINTR; - return (error); + goto bad_unlocked; } td->td_dupfd = 0; vfslocked = NDHASGIANT(&nd); @@ -1206,7 +1196,7 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, if ((flags & FNONBLOCK) == 0) type |= F_WAIT; if ((error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK, &lf, - type)) != 0) + type)) != 0) goto bad; atomic_set_int(&fp->f_flag, FHASLOCK); } @@ -1247,10 +1237,8 @@ success: bad: VFS_UNLOCK_GIANT(vfslocked); bad_unlocked: - if (indx != -1) - fdclose(fdp, fp, indx, td); + KASSERT(indx == -1, ("indx=%d, should be -1", indx)); fdrop(fp, td); - td->td_retval[0] = -1; return (error); } @@ -1993,7 +1981,7 @@ sys_lseek(td, uap) struct file *fp; struct vnode *vp; struct vattr vattr; - off_t offset, size; + off_t foffset, offset, size; int error, noneg; int vfslocked; @@ -2005,18 +1993,19 @@ sys_lseek(td, uap) return (ESPIPE); } vp = fp->f_vnode; + foffset = foffset_lock(fp, 0); vfslocked = VFS_LOCK_GIANT(vp->v_mount); noneg = (vp->v_type != VCHR); offset = uap->offset; switch (uap->whence) { case L_INCR: if (noneg && - (fp->f_offset < 0 || - (offset > 0 && fp->f_offset > OFF_MAX - offset))) { + (foffset < 0 || + (offset > 0 && foffset > OFF_MAX - offset))) { error = EOVERFLOW; break; } - offset += fp->f_offset; + offset += foffset; break; case L_XTND: vn_lock(vp, LK_SHARED | LK_RETRY); @@ -2056,12 +2045,12 @@ sys_lseek(td, uap) error = EINVAL; if (error != 0) goto drop; - fp->f_offset = offset; VFS_KNOTE_UNLOCKED(vp, 0); - *(off_t *)(td->td_retval) = fp->f_offset; + *(off_t *)(td->td_retval) = offset; drop: fdrop(fp, td); VFS_UNLOCK_GIANT(vfslocked); + foffset_unlock(fp, offset, error != 0 ? FOF_NOUPDATE : 0); return (error); } @@ -3994,6 +3983,7 @@ kern_ogetdirentries(struct thread *td, struct ogetdirentries_args *uap, caddr_t dirbuf; int error, eofflag, readcnt, vfslocked; long loff; + off_t foffset; /* XXX arbitrary sanity limit on `count'. */ if (uap->count > 64 * 1024) @@ -4006,10 +3996,12 @@ kern_ogetdirentries(struct thread *td, struct ogetdirentries_args *uap, return (EBADF); } vp = fp->f_vnode; + foffset = foffset_lock(fp, 0); unionread: vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type != VDIR) { VFS_UNLOCK_GIANT(vfslocked); + foffset_unlock(fp, foffset, 0); fdrop(fp, td); return (EINVAL); } @@ -4022,12 +4014,13 @@ unionread: auio.uio_td = td; auio.uio_resid = uap->count; vn_lock(vp, LK_SHARED | LK_RETRY); - loff = auio.uio_offset = fp->f_offset; + loff = auio.uio_offset = foffset; #ifdef MAC error = mac_vnode_check_readdir(td->td_ucred, vp); if (error) { VOP_UNLOCK(vp, 0); VFS_UNLOCK_GIANT(vfslocked); + foffset_unlock(fp, foffset, FOF_NOUPDATE); fdrop(fp, td); return (error); } @@ -4036,7 +4029,7 @@ unionread: if (vp->v_mount->mnt_maxsymlinklen <= 0) { error = VOP_READDIR(vp, &auio, fp->f_cred, &eofflag, NULL, NULL); - fp->f_offset = auio.uio_offset; + foffset = auio.uio_offset; } else # endif { @@ -4048,7 +4041,7 @@ unionread: kiov.iov_base = dirbuf; error = VOP_READDIR(vp, &kuio, fp->f_cred, &eofflag, NULL, NULL); - fp->f_offset = kuio.uio_offset; + foffset = kuio.uio_offset; if (error == 0) { readcnt = uap->count - kuio.uio_resid; edp = (struct dirent *)&dirbuf[readcnt]; @@ -4086,6 +4079,7 @@ unionread: if (error) { VOP_UNLOCK(vp, 0); VFS_UNLOCK_GIANT(vfslocked); + foffset_unlock(fp, foffset, 0); fdrop(fp, td); return (error); } @@ -4097,13 +4091,14 @@ unionread: VREF(vp); fp->f_vnode = vp; fp->f_data = vp; - fp->f_offset = 0; + foffset = 0; vput(tvp); VFS_UNLOCK_GIANT(vfslocked); goto unionread; } VOP_UNLOCK(vp, 0); VFS_UNLOCK_GIANT(vfslocked); + foffset_unlock(fp, foffset, 0); fdrop(fp, td); td->td_retval[0] = uap->count - auio.uio_resid; if (error == 0) @@ -4136,7 +4131,8 @@ sys_getdirentries(td, uap) long base; int error; - error = kern_getdirentries(td, uap->fd, uap->buf, uap->count, &base); + error = kern_getdirentries(td, uap->fd, uap->buf, uap->count, &base, + NULL, UIO_USERSPACE); if (error) return (error); if (uap->basep != NULL) @@ -4146,7 +4142,7 @@ sys_getdirentries(td, uap) int kern_getdirentries(struct thread *td, int fd, char *buf, u_int count, - long *basep) + long *basep, ssize_t *residp, enum uio_seg bufseg) { struct vnode *vp; struct file *fp; @@ -4155,6 +4151,7 @@ kern_getdirentries(struct thread *td, int fd, char *buf, u_int count, int vfslocked; long loff; int error, eofflag; + off_t foffset; AUDIT_ARG_FD(fd); if (count > IOSIZE_MAX) @@ -4168,6 +4165,7 @@ kern_getdirentries(struct thread *td, int fd, char *buf, u_int count, return (EBADF); } vp = fp->f_vnode; + foffset = foffset_lock(fp, 0); unionread: vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type != VDIR) { @@ -4180,18 +4178,18 @@ unionread: auio.uio_iov = &aiov; auio.uio_iovcnt = 1; auio.uio_rw = UIO_READ; - auio.uio_segflg = UIO_USERSPACE; + auio.uio_segflg = bufseg; auio.uio_td = td; vn_lock(vp, LK_SHARED | LK_RETRY); AUDIT_ARG_VNODE1(vp); - loff = auio.uio_offset = fp->f_offset; + loff = auio.uio_offset = foffset; #ifdef MAC error = mac_vnode_check_readdir(td->td_ucred, vp); if (error == 0) #endif error = VOP_READDIR(vp, &auio, fp->f_cred, &eofflag, NULL, NULL); - fp->f_offset = auio.uio_offset; + foffset = auio.uio_offset; if (error) { VOP_UNLOCK(vp, 0); VFS_UNLOCK_GIANT(vfslocked); @@ -4205,7 +4203,7 @@ unionread: VREF(vp); fp->f_vnode = vp; fp->f_data = vp; - fp->f_offset = 0; + foffset = 0; vput(tvp); VFS_UNLOCK_GIANT(vfslocked); goto unionread; @@ -4213,8 +4211,11 @@ unionread: VOP_UNLOCK(vp, 0); VFS_UNLOCK_GIANT(vfslocked); *basep = loff; + if (residp != NULL) + *residp = auio.uio_resid; td->td_retval[0] = count - auio.uio_resid; fail: + foffset_unlock(fp, foffset, 0); fdrop(fp, td); return (error); } @@ -4334,12 +4335,10 @@ getvnode(struct filedesc *fdp, int fd, cap_rights_t rights, struct file *fp; #ifdef CAPABILITIES struct file *fp_fromcap; -#endif int error; +#endif - error = 0; - fp = NULL; - if ((fdp == NULL) || (fp = fget_unlocked(fdp, fd)) == NULL) + if (fdp == NULL || (fp = fget_unlocked(fdp, fd)) == NULL) return (EBADF); #ifdef CAPABILITIES /* @@ -4481,24 +4480,19 @@ sys_fhopen(td, uap) int flags; } */ *uap; { - struct proc *p = td->td_proc; struct mount *mp; struct vnode *vp; struct fhandle fhp; - struct vattr vat; - struct vattr *vap = &vat; struct flock lf; struct file *fp; - register struct filedesc *fdp = p->p_fd; int fmode, error, type; - accmode_t accmode; - struct file *nfp; int vfslocked; int indx; error = priv_check(td, PRIV_VFS_FHOPEN); if (error) return (error); + indx = -1; fmode = FFLAGS(uap->flags); /* why not allow a non-read/write open for our lockd? */ if (((fmode & (FREAD | FWRITE)) == 0) || (fmode & O_CREAT)) @@ -4514,109 +4508,42 @@ sys_fhopen(td, uap) /* now give me my vnode, it gets returned to me locked */ error = VFS_FHTOVP(mp, &fhp.fh_fid, LK_EXCLUSIVE, &vp); vfs_unbusy(mp); - if (error) - goto out; + if (error) { + VFS_UNLOCK_GIANT(vfslocked); + return (error); + } + + error = falloc_noinstall(td, &fp); + if (error) { + vput(vp); + VFS_UNLOCK_GIANT(vfslocked); + return (error); + } /* - * from now on we have to make sure not - * to forget about the vnode - * any error that causes an abort must vput(vp) - * just set error = err and 'goto bad;'. + * An extra reference on `fp' has been held for us by + * falloc_noinstall(). */ - /* - * from vn_open - */ - if (vp->v_type == VLNK) { - error = EMLINK; - goto bad; - } - if (vp->v_type == VSOCK) { - error = EOPNOTSUPP; - goto bad; - } - if (vp->v_type != VDIR && fmode & O_DIRECTORY) { - error = ENOTDIR; - goto bad; - } - accmode = 0; - if (fmode & (FWRITE | O_TRUNC)) { - if (vp->v_type == VDIR) { - error = EISDIR; - goto bad; - } - error = vn_writechk(vp); - if (error) - goto bad; - accmode |= VWRITE; - } - if (fmode & FREAD) - accmode |= VREAD; - if ((fmode & O_APPEND) && (fmode & FWRITE)) - accmode |= VAPPEND; -#ifdef MAC - error = mac_vnode_check_open(td->td_ucred, vp, accmode); - if (error) - goto bad; +#ifdef INVARIANTS + td->td_dupfd = -1; #endif - if (accmode) { - error = VOP_ACCESS(vp, accmode, td->td_ucred, td); - if (error) - goto bad; - } - if (fmode & O_TRUNC) { - vfs_ref(mp); - VOP_UNLOCK(vp, 0); /* XXX */ - if ((error = vn_start_write(NULL, &mp, V_WAIT | PCATCH)) != 0) { - vrele(vp); - vfs_rel(mp); - goto out; - } - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); /* XXX */ - vfs_rel(mp); -#ifdef MAC - /* - * We don't yet have fp->f_cred, so use td->td_ucred, which - * should be right. - */ - error = mac_vnode_check_write(td->td_ucred, td->td_ucred, vp); - if (error == 0) { -#endif - VATTR_NULL(vap); - vap->va_size = 0; - error = VOP_SETATTR(vp, vap, td->td_ucred); -#ifdef MAC - } -#endif - vn_finished_write(mp); - if (error) - goto bad; - } - error = VOP_OPEN(vp, fmode, td->td_ucred, td, NULL); - if (error) - goto bad; + error = vn_open_vnode(vp, fmode, td->td_ucred, td, fp); + if (error) { + KASSERT(fp->f_ops == &badfileops, + ("VOP_OPEN in fhopen() set f_ops")); + KASSERT(td->td_dupfd < 0, + ("fhopen() encountered fdopen()")); - if (fmode & FWRITE) { - vp->v_writecount++; - CTR3(KTR_VFS, "%s: vp %p v_writecount increased to %d", - __func__, vp, vp->v_writecount); - } - - /* - * end of vn_open code - */ - - if ((error = falloc(td, &nfp, &indx, fmode)) != 0) { - if (fmode & FWRITE) { - vp->v_writecount--; - CTR3(KTR_VFS, "%s: vp %p v_writecount decreased to %d", - __func__, vp, vp->v_writecount); - } + vput(vp); goto bad; } - /* An extra reference on `nfp' has been held for us by falloc(). */ - fp = nfp; - nfp->f_vnode = vp; - finit(nfp, fmode & FMASK, DTYPE_VNODE, vp, &vnops); +#ifdef INVARIANTS + td->td_dupfd = 0; +#endif + fp->f_vnode = vp; + fp->f_seqcount = 1; + finit(fp, fmode & FMASK, DTYPE_VNODE, vp, &vnops); + VOP_UNLOCK(vp, 0); if (fmode & (O_EXLOCK | O_SHLOCK)) { lf.l_whence = SEEK_SET; lf.l_start = 0; @@ -4628,36 +4555,22 @@ sys_fhopen(td, uap) type = F_FLOCK; if ((fmode & FNONBLOCK) == 0) type |= F_WAIT; - VOP_UNLOCK(vp, 0); if ((error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK, &lf, - type)) != 0) { - /* - * The lock request failed. Normally close the - * descriptor but handle the case where someone might - * have dup()d or close()d it when we weren't looking. - */ - fdclose(fdp, fp, indx, td); - - /* - * release our private reference - */ - fdrop(fp, td); - goto out; - } - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + type)) != 0) + goto bad; atomic_set_int(&fp->f_flag, FHASLOCK); } + if (fmode & O_TRUNC) { + error = fo_truncate(fp, 0, td->td_ucred, td); + if (error) + goto bad; + } - VOP_UNLOCK(vp, 0); - fdrop(fp, td); - VFS_UNLOCK_GIANT(vfslocked); - td->td_retval[0] = indx; - return (0); - + error = finstall(td, fp, &indx, fmode); bad: - vput(vp); -out: VFS_UNLOCK_GIANT(vfslocked); + fdrop(fp, td); + td->td_retval[0] = indx; return (error); } @@ -4679,16 +4592,28 @@ sys_fhstat(td, uap) } */ *uap; { struct stat sb; - fhandle_t fh; + struct fhandle fh; + int error; + + error = copyin(uap->u_fhp, &fh, sizeof(fh)); + if (error != 0) + return (error); + error = kern_fhstat(td, fh, &sb); + if (error != 0) + return (error); + error = copyout(&sb, uap->sb, sizeof(sb)); + return (error); +} + +int +kern_fhstat(struct thread *td, struct fhandle fh, struct stat *sb) +{ struct mount *mp; struct vnode *vp; int vfslocked; int error; error = priv_check(td, PRIV_VFS_FHSTAT); - if (error) - return (error); - error = copyin(uap->u_fhp, &fh, sizeof(fhandle_t)); if (error) return (error); if ((mp = vfs_busyfs(&fh.fh_fsid)) == NULL) @@ -4700,12 +4625,9 @@ sys_fhstat(td, uap) VFS_UNLOCK_GIANT(vfslocked); return (error); } - error = vn_stat(vp, &sb, td->td_ucred, NOCRED, td); + error = vn_stat(vp, sb, td->td_ucred, NOCRED, td); vput(vp); VFS_UNLOCK_GIANT(vfslocked); - if (error) - return (error); - error = copyout(&sb, uap->sb, sizeof(sb)); return (error); } @@ -4960,6 +4882,8 @@ kern_posix_fadvise(struct thread *td, int fd, off_t offset, off_t len, new->fa_advice = advice; new->fa_start = offset; new->fa_end = end; + new->fa_prevstart = 0; + new->fa_prevend = 0; fp->f_advice = new; new = fa; } diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index d4b60f1c16c..b5dcadf2d34 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -65,10 +66,15 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include +#include #include +#include static fo_rdwr_t vn_read; static fo_rdwr_t vn_write; +static fo_rdwr_t vn_io_fault; static fo_truncate_t vn_truncate; static fo_ioctl_t vn_ioctl; static fo_poll_t vn_poll; @@ -77,8 +83,8 @@ static fo_stat_t vn_statfile; static fo_close_t vn_closefile; struct fileops vnops = { - .fo_read = vn_read, - .fo_write = vn_write, + .fo_read = vn_io_fault, + .fo_write = vn_io_fault, .fo_truncate = vn_truncate, .fo_ioctl = vn_ioctl, .fo_poll = vn_poll, @@ -102,7 +108,8 @@ vn_open(ndp, flagp, cmode, fp) } /* - * Common code for vnode open operations. + * Common code for vnode open operations via a name lookup. + * Lookup the vnode and invoke VOP_CREATE if needed. * Check permissions, and call the VOP_OPEN or VOP_CREATE routine. * * Note that this does NOT free nameidata for the successful case, @@ -118,7 +125,6 @@ vn_open_cred(struct nameidata *ndp, int *flagp, int cmode, u_int vn_open_flags, struct vattr vat; struct vattr *vap = &vat; int fmode, error; - accmode_t accmode; int vfslocked, mpsafe; mpsafe = ndp->ni_cnd.cn_flags & MPSAFE; @@ -199,24 +205,44 @@ restart: vfslocked = NDHASGIANT(ndp); vp = ndp->ni_vp; } - if (vp->v_type == VLNK) { - error = EMLINK; + error = vn_open_vnode(vp, fmode, cred, td, fp); + if (error) goto bad; - } - if (vp->v_type == VSOCK) { - error = EOPNOTSUPP; - goto bad; - } - if (vp->v_type != VDIR && fmode & O_DIRECTORY) { - error = ENOTDIR; - goto bad; - } + *flagp = fmode; + if (!mpsafe) + VFS_UNLOCK_GIANT(vfslocked); + return (0); +bad: + NDFREE(ndp, NDF_ONLY_PNBUF); + vput(vp); + VFS_UNLOCK_GIANT(vfslocked); + *flagp = fmode; + ndp->ni_vp = NULL; + return (error); +} + +/* + * Common code for vnode open operations once a vnode is located. + * Check permissions, and call the VOP_OPEN routine. + */ +int +vn_open_vnode(struct vnode *vp, int fmode, struct ucred *cred, + struct thread *td, struct file *fp) +{ + accmode_t accmode; + int error; + + VFS_ASSERT_GIANT(vp->v_mount); + if (vp->v_type == VLNK) + return (EMLINK); + if (vp->v_type == VSOCK) + return (EOPNOTSUPP); + if (vp->v_type != VDIR && fmode & O_DIRECTORY) + return (ENOTDIR); accmode = 0; if (fmode & (FWRITE | O_TRUNC)) { - if (vp->v_type == VDIR) { - error = EISDIR; - goto bad; - } + if (vp->v_type == VDIR) + return (EISDIR); accmode |= VWRITE; } if (fmode & FREAD) @@ -228,40 +254,30 @@ restart: #ifdef MAC error = mac_vnode_check_open(cred, vp, accmode); if (error) - goto bad; + return (error); #endif if ((fmode & O_CREAT) == 0) { if (accmode & VWRITE) { error = vn_writechk(vp); if (error) - goto bad; + return (error); } if (accmode) { error = VOP_ACCESS(vp, accmode, cred, td); if (error) - goto bad; + return (error); } } if ((error = VOP_OPEN(vp, fmode, cred, td, fp)) != 0) - goto bad; + return (error); if (fmode & FWRITE) { vp->v_writecount++; CTR3(KTR_VFS, "%s: vp %p v_writecount increased to %d", __func__, vp, vp->v_writecount); } - *flagp = fmode; - ASSERT_VOP_LOCKED(vp, "vn_open_cred"); - if (!mpsafe) - VFS_UNLOCK_GIANT(vfslocked); + ASSERT_VOP_LOCKED(vp, "vn_open_vnode"); return (0); -bad: - NDFREE(ndp, NDF_ONLY_PNBUF); - vput(vp); - VFS_UNLOCK_GIANT(vfslocked); - *flagp = fmode; - ndp->ni_vp = NULL; - return (error); } /* @@ -367,47 +383,19 @@ sequential_heuristic(struct uio *uio, struct file *fp) * Package up an I/O request on a vnode into a uio and do it. */ int -vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, active_cred, file_cred, - aresid, td) - enum uio_rw rw; - struct vnode *vp; - void *base; - int len; - off_t offset; - enum uio_seg segflg; - int ioflg; - struct ucred *active_cred; - struct ucred *file_cred; - ssize_t *aresid; - struct thread *td; +vn_rdwr(enum uio_rw rw, struct vnode *vp, void *base, int len, off_t offset, + enum uio_seg segflg, int ioflg, struct ucred *active_cred, + struct ucred *file_cred, ssize_t *aresid, struct thread *td) { struct uio auio; struct iovec aiov; struct mount *mp; struct ucred *cred; + void *rl_cookie; int error, lock_flags; VFS_ASSERT_GIANT(vp->v_mount); - if ((ioflg & IO_NODELOCKED) == 0) { - mp = NULL; - if (rw == UIO_WRITE) { - if (vp->v_type != VCHR && - (error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) - != 0) - return (error); - if (MNT_SHARED_WRITES(mp) || - ((mp == NULL) && MNT_SHARED_WRITES(vp->v_mount))) { - lock_flags = LK_SHARED; - } else { - lock_flags = LK_EXCLUSIVE; - } - vn_lock(vp, lock_flags | LK_RETRY); - } else - vn_lock(vp, LK_SHARED | LK_RETRY); - - } - ASSERT_VOP_LOCKED(vp, "IO_NODELOCKED with no vp lock held"); auio.uio_iov = &aiov; auio.uio_iovcnt = 1; aiov.iov_base = base; @@ -418,6 +406,33 @@ vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, active_cred, file_cred, auio.uio_rw = rw; auio.uio_td = td; error = 0; + + if ((ioflg & IO_NODELOCKED) == 0) { + if (rw == UIO_READ) { + rl_cookie = vn_rangelock_rlock(vp, offset, + offset + len); + } else { + rl_cookie = vn_rangelock_wlock(vp, offset, + offset + len); + } + mp = NULL; + if (rw == UIO_WRITE) { + if (vp->v_type != VCHR && + (error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) + != 0) + goto out; + if (MNT_SHARED_WRITES(mp) || + ((mp == NULL) && MNT_SHARED_WRITES(vp->v_mount))) + lock_flags = LK_SHARED; + else + lock_flags = LK_EXCLUSIVE; + } else + lock_flags = LK_SHARED; + vn_lock(vp, lock_flags | LK_RETRY); + } else + rl_cookie = NULL; + + ASSERT_VOP_LOCKED(vp, "IO_NODELOCKED with no vp lock held"); #ifdef MAC if ((ioflg & IO_NOMACCHECK) == 0) { if (rw == UIO_READ) @@ -429,7 +444,7 @@ vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, active_cred, file_cred, } #endif if (error == 0) { - if (file_cred) + if (file_cred != NULL) cred = file_cred; else cred = active_cred; @@ -444,10 +459,13 @@ vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, active_cred, file_cred, if (auio.uio_resid && error == 0) error = EIO; if ((ioflg & IO_NODELOCKED) == 0) { - if (rw == UIO_WRITE && vp->v_type != VCHR) - vn_finished_write(mp); VOP_UNLOCK(vp, 0); + if (mp != NULL) + vn_finished_write(mp); } + out: + if (rl_cookie != NULL) + vn_rangelock_unlock(vp, rl_cookie); return (error); } @@ -509,6 +527,110 @@ vn_rdwr_inchunks(rw, vp, base, len, offset, segflg, ioflg, active_cred, return (error); } +off_t +foffset_lock(struct file *fp, int flags) +{ + struct mtx *mtxp; + off_t res; + + KASSERT((flags & FOF_OFFSET) == 0, ("FOF_OFFSET passed")); + +#if OFF_MAX <= LONG_MAX + /* + * Caller only wants the current f_offset value. Assume that + * the long and shorter integer types reads are atomic. + */ + if ((flags & FOF_NOLOCK) != 0) + return (fp->f_offset); +#endif + + /* + * According to McKusick the vn lock was protecting f_offset here. + * It is now protected by the FOFFSET_LOCKED flag. + */ + mtxp = mtx_pool_find(mtxpool_sleep, fp); + mtx_lock(mtxp); + if ((flags & FOF_NOLOCK) == 0) { + while (fp->f_vnread_flags & FOFFSET_LOCKED) { + fp->f_vnread_flags |= FOFFSET_LOCK_WAITING; + msleep(&fp->f_vnread_flags, mtxp, PUSER -1, + "vofflock", 0); + } + fp->f_vnread_flags |= FOFFSET_LOCKED; + } + res = fp->f_offset; + mtx_unlock(mtxp); + return (res); +} + +void +foffset_unlock(struct file *fp, off_t val, int flags) +{ + struct mtx *mtxp; + + KASSERT((flags & FOF_OFFSET) == 0, ("FOF_OFFSET passed")); + +#if OFF_MAX <= LONG_MAX + if ((flags & FOF_NOLOCK) != 0) { + if ((flags & FOF_NOUPDATE) == 0) + fp->f_offset = val; + if ((flags & FOF_NEXTOFF) != 0) + fp->f_nextoff = val; + return; + } +#endif + + mtxp = mtx_pool_find(mtxpool_sleep, fp); + mtx_lock(mtxp); + if ((flags & FOF_NOUPDATE) == 0) + fp->f_offset = val; + if ((flags & FOF_NEXTOFF) != 0) + fp->f_nextoff = val; + if ((flags & FOF_NOLOCK) == 0) { + KASSERT((fp->f_vnread_flags & FOFFSET_LOCKED) != 0, + ("Lost FOFFSET_LOCKED")); + if (fp->f_vnread_flags & FOFFSET_LOCK_WAITING) + wakeup(&fp->f_vnread_flags); + fp->f_vnread_flags = 0; + } + mtx_unlock(mtxp); +} + +void +foffset_lock_uio(struct file *fp, struct uio *uio, int flags) +{ + + if ((flags & FOF_OFFSET) == 0) + uio->uio_offset = foffset_lock(fp, flags); +} + +void +foffset_unlock_uio(struct file *fp, struct uio *uio, int flags) +{ + + if ((flags & FOF_OFFSET) == 0) + foffset_unlock(fp, uio->uio_offset, flags); +} + +static int +get_advice(struct file *fp, struct uio *uio) +{ + struct mtx *mtxp; + int ret; + + ret = POSIX_FADV_NORMAL; + if (fp->f_advice == NULL) + return (ret); + + mtxp = mtx_pool_find(mtxpool_sleep, fp); + mtx_lock(mtxp); + if (uio->uio_offset >= fp->f_advice->fa_start && + uio->uio_offset + uio->uio_resid <= fp->f_advice->fa_end) + ret = fp->f_advice->fa_advice; + mtx_unlock(mtxp); + return (ret); +} + /* * File table vnode read routine. */ @@ -521,44 +643,22 @@ vn_read(fp, uio, active_cred, flags, td) struct thread *td; { struct vnode *vp; - int error, ioflag; struct mtx *mtxp; + int error, ioflag; int advice, vfslocked; - off_t offset; + off_t offset, start, end; KASSERT(uio->uio_td == td, ("uio_td %p is not td %p", uio->uio_td, td)); - mtxp = NULL; + KASSERT(flags & FOF_OFFSET, ("No FOF_OFFSET")); vp = fp->f_vnode; ioflag = 0; if (fp->f_flag & FNONBLOCK) ioflag |= IO_NDELAY; if (fp->f_flag & O_DIRECT) ioflag |= IO_DIRECT; - advice = POSIX_FADV_NORMAL; + advice = get_advice(fp, uio); vfslocked = VFS_LOCK_GIANT(vp->v_mount); - /* - * According to McKusick the vn lock was protecting f_offset here. - * It is now protected by the FOFFSET_LOCKED flag. - */ - if ((flags & FOF_OFFSET) == 0 || fp->f_advice != NULL) { - mtxp = mtx_pool_find(mtxpool_sleep, fp); - mtx_lock(mtxp); - if ((flags & FOF_OFFSET) == 0) { - while (fp->f_vnread_flags & FOFFSET_LOCKED) { - fp->f_vnread_flags |= FOFFSET_LOCK_WAITING; - msleep(&fp->f_vnread_flags, mtxp, PUSER -1, - "vnread offlock", 0); - } - fp->f_vnread_flags |= FOFFSET_LOCKED; - uio->uio_offset = fp->f_offset; - } - if (fp->f_advice != NULL && - uio->uio_offset >= fp->f_advice->fa_start && - uio->uio_offset + uio->uio_resid <= fp->f_advice->fa_end) - advice = fp->f_advice->fa_advice; - mtx_unlock(mtxp); - } vn_lock(vp, LK_SHARED | LK_RETRY); switch (advice) { @@ -578,20 +678,42 @@ vn_read(fp, uio, active_cred, flags, td) if (error == 0) #endif error = VOP_READ(vp, uio, ioflag, fp->f_cred); - if ((flags & FOF_OFFSET) == 0) { - fp->f_offset = uio->uio_offset; - mtx_lock(mtxp); - if (fp->f_vnread_flags & FOFFSET_LOCK_WAITING) - wakeup(&fp->f_vnread_flags); - fp->f_vnread_flags = 0; - mtx_unlock(mtxp); - } fp->f_nextoff = uio->uio_offset; VOP_UNLOCK(vp, 0); if (error == 0 && advice == POSIX_FADV_NOREUSE && - offset != uio->uio_offset) - error = VOP_ADVISE(vp, offset, uio->uio_offset - 1, - POSIX_FADV_DONTNEED); + offset != uio->uio_offset) { + /* + * Use POSIX_FADV_DONTNEED to flush clean pages and + * buffers for the backing file after a + * POSIX_FADV_NOREUSE read(2). To optimize the common + * case of using POSIX_FADV_NOREUSE with sequential + * access, track the previous implicit DONTNEED + * request and grow this request to include the + * current read(2) in addition to the previous + * DONTNEED. With purely sequential access this will + * cause the DONTNEED requests to continously grow to + * cover all of the previously read regions of the + * file. This allows filesystem blocks that are + * accessed by multiple calls to read(2) to be flushed + * once the last read(2) finishes. + */ + start = offset; + end = uio->uio_offset - 1; + mtxp = mtx_pool_find(mtxpool_sleep, fp); + mtx_lock(mtxp); + if (fp->f_advice != NULL && + fp->f_advice->fa_advice == POSIX_FADV_NOREUSE) { + if (start != 0 && fp->f_advice->fa_prevend + 1 == start) + start = fp->f_advice->fa_prevstart; + else if (fp->f_advice->fa_prevstart != 0 && + fp->f_advice->fa_prevstart == end + 1) + end = fp->f_advice->fa_prevend; + fp->f_advice->fa_prevstart = start; + fp->f_advice->fa_prevend = end; + } + mtx_unlock(mtxp); + error = VOP_ADVISE(vp, start, end, POSIX_FADV_DONTNEED); + } VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -609,12 +731,14 @@ vn_write(fp, uio, active_cred, flags, td) { struct vnode *vp; struct mount *mp; - int error, ioflag, lock_flags; struct mtx *mtxp; + int error, ioflag, lock_flags; int advice, vfslocked; + off_t offset, start, end; KASSERT(uio->uio_td == td, ("uio_td %p is not td %p", uio->uio_td, td)); + KASSERT(flags & FOF_OFFSET, ("No FOF_OFFSET")); vp = fp->f_vnode; vfslocked = VFS_LOCK_GIANT(vp->v_mount); if (vp->v_type == VREG) @@ -633,6 +757,8 @@ vn_write(fp, uio, active_cred, flags, td) if (vp->v_type != VCHR && (error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) goto unlock; + + advice = get_advice(fp, uio); if ((MNT_SHARED_WRITES(mp) || ((mp == NULL) && MNT_SHARED_WRITES(vp->v_mount))) && @@ -643,74 +769,360 @@ vn_write(fp, uio, active_cred, flags, td) } vn_lock(vp, lock_flags | LK_RETRY); - if ((flags & FOF_OFFSET) == 0) - uio->uio_offset = fp->f_offset; - advice = POSIX_FADV_NORMAL; - if (fp->f_advice != NULL) { - mtxp = mtx_pool_find(mtxpool_sleep, fp); - mtx_lock(mtxp); - if (fp->f_advice != NULL && - uio->uio_offset >= fp->f_advice->fa_start && - uio->uio_offset + uio->uio_resid <= fp->f_advice->fa_end) - advice = fp->f_advice->fa_advice; - mtx_unlock(mtxp); - } switch (advice) { case POSIX_FADV_NORMAL: case POSIX_FADV_SEQUENTIAL: + case POSIX_FADV_NOREUSE: ioflag |= sequential_heuristic(uio, fp); break; case POSIX_FADV_RANDOM: /* XXX: Is this correct? */ break; - case POSIX_FADV_NOREUSE: - /* - * Request the underlying FS to discard the buffers - * and pages after the I/O is complete. - */ - ioflag |= IO_DIRECT; - break; } + offset = uio->uio_offset; #ifdef MAC error = mac_vnode_check_write(active_cred, fp->f_cred, vp); if (error == 0) #endif error = VOP_WRITE(vp, uio, ioflag, fp->f_cred); - if ((flags & FOF_OFFSET) == 0) - fp->f_offset = uio->uio_offset; fp->f_nextoff = uio->uio_offset; VOP_UNLOCK(vp, 0); if (vp->v_type != VCHR) vn_finished_write(mp); + if (error == 0 && advice == POSIX_FADV_NOREUSE && + offset != uio->uio_offset) { + /* + * Use POSIX_FADV_DONTNEED to flush clean pages and + * buffers for the backing file after a + * POSIX_FADV_NOREUSE write(2). To optimize the + * common case of using POSIX_FADV_NOREUSE with + * sequential access, track the previous implicit + * DONTNEED request and grow this request to include + * the current write(2) in addition to the previous + * DONTNEED. With purely sequential access this will + * cause the DONTNEED requests to continously grow to + * cover all of the previously written regions of the + * file. + * + * Note that the blocks just written are almost + * certainly still dirty, so this only works when + * VOP_ADVISE() calls from subsequent writes push out + * the data written by this write(2) once the backing + * buffers are clean. However, as compared to forcing + * IO_DIRECT, this gives much saner behavior. Write + * clustering is still allowed, and clean pages are + * merely moved to the cache page queue rather than + * outright thrown away. This means a subsequent + * read(2) can still avoid hitting the disk if the + * pages have not been reclaimed. + * + * This does make POSIX_FADV_NOREUSE largely useless + * with non-sequential access. However, sequential + * access is the more common use case and the flag is + * merely advisory. + */ + start = offset; + end = uio->uio_offset - 1; + mtxp = mtx_pool_find(mtxpool_sleep, fp); + mtx_lock(mtxp); + if (fp->f_advice != NULL && + fp->f_advice->fa_advice == POSIX_FADV_NOREUSE) { + if (start != 0 && fp->f_advice->fa_prevend + 1 == start) + start = fp->f_advice->fa_prevstart; + else if (fp->f_advice->fa_prevstart != 0 && + fp->f_advice->fa_prevstart == end + 1) + end = fp->f_advice->fa_prevend; + fp->f_advice->fa_prevstart = start; + fp->f_advice->fa_prevend = end; + } + mtx_unlock(mtxp); + error = VOP_ADVISE(vp, start, end, POSIX_FADV_DONTNEED); + } + unlock: VFS_UNLOCK_GIANT(vfslocked); return (error); } +static const int io_hold_cnt = 16; +static int vn_io_fault_enable = 1; +SYSCTL_INT(_debug, OID_AUTO, vn_io_fault_enable, CTLFLAG_RW, + &vn_io_fault_enable, 0, "Enable vn_io_fault lock avoidance"); +static unsigned long vn_io_faults_cnt; +SYSCTL_LONG(_debug, OID_AUTO, vn_io_faults, CTLFLAG_RD, + &vn_io_faults_cnt, 0, "Count of vn_io_fault lock avoidance triggers"); + +/* + * The vn_io_fault() is a wrapper around vn_read() and vn_write() to + * prevent the following deadlock: + * + * Assume that the thread A reads from the vnode vp1 into userspace + * buffer buf1 backed by the pages of vnode vp2. If a page in buf1 is + * currently not resident, then system ends up with the call chain + * vn_read() -> VOP_READ(vp1) -> uiomove() -> [Page Fault] -> + * vm_fault(buf1) -> vnode_pager_getpages(vp2) -> VOP_GETPAGES(vp2) + * which establishes lock order vp1->vn_lock, then vp2->vn_lock. + * If, at the same time, thread B reads from vnode vp2 into buffer buf2 + * backed by the pages of vnode vp1, and some page in buf2 is not + * resident, we get a reversed order vp2->vn_lock, then vp1->vn_lock. + * + * To prevent the lock order reversal and deadlock, vn_io_fault() does + * not allow page faults to happen during VOP_READ() or VOP_WRITE(). + * Instead, it first tries to do the whole range i/o with pagefaults + * disabled. If all pages in the i/o buffer are resident and mapped, + * VOP will succeed (ignoring the genuine filesystem errors). + * Otherwise, we get back EFAULT, and vn_io_fault() falls back to do + * i/o in chunks, with all pages in the chunk prefaulted and held + * using vm_fault_quick_hold_pages(). + * + * Filesystems using this deadlock avoidance scheme should use the + * array of the held pages from uio, saved in the curthread->td_ma, + * instead of doing uiomove(). A helper function + * vn_io_fault_uiomove() converts uiomove request into + * uiomove_fromphys() over td_ma array. + * + * Since vnode locks do not cover the whole i/o anymore, rangelocks + * make the current i/o request atomic with respect to other i/os and + * truncations. + */ +static int +vn_io_fault(struct file *fp, struct uio *uio, struct ucred *active_cred, + int flags, struct thread *td) +{ + vm_page_t ma[io_hold_cnt + 2]; + struct uio *uio_clone, short_uio; + struct iovec short_iovec[1]; + fo_rdwr_t *doio; + struct vnode *vp; + void *rl_cookie; + struct mount *mp; + vm_page_t *prev_td_ma; + int cnt, error, save, saveheld, prev_td_ma_cnt; + vm_offset_t addr, end; + vm_prot_t prot; + size_t len, resid; + ssize_t adv; + + if (uio->uio_rw == UIO_READ) + doio = vn_read; + else + doio = vn_write; + vp = fp->f_vnode; + foffset_lock_uio(fp, uio, flags); + + if (uio->uio_segflg != UIO_USERSPACE || vp->v_type != VREG || + ((mp = vp->v_mount) != NULL && + (mp->mnt_kern_flag & MNTK_NO_IOPF) == 0) || + !vn_io_fault_enable) { + error = doio(fp, uio, active_cred, flags | FOF_OFFSET, td); + goto out_last; + } + + /* + * The UFS follows IO_UNIT directive and replays back both + * uio_offset and uio_resid if an error is encountered during the + * operation. But, since the iovec may be already advanced, + * uio is still in an inconsistent state. + * + * Cache a copy of the original uio, which is advanced to the redo + * point using UIO_NOCOPY below. + */ + uio_clone = cloneuio(uio); + resid = uio->uio_resid; + + short_uio.uio_segflg = UIO_USERSPACE; + short_uio.uio_rw = uio->uio_rw; + short_uio.uio_td = uio->uio_td; + + if (uio->uio_rw == UIO_READ) { + prot = VM_PROT_WRITE; + rl_cookie = vn_rangelock_rlock(vp, uio->uio_offset, + uio->uio_offset + uio->uio_resid); + } else { + prot = VM_PROT_READ; + if ((fp->f_flag & O_APPEND) != 0 || (flags & FOF_OFFSET) == 0) + /* For appenders, punt and lock the whole range. */ + rl_cookie = vn_rangelock_wlock(vp, 0, OFF_MAX); + else + rl_cookie = vn_rangelock_wlock(vp, uio->uio_offset, + uio->uio_offset + uio->uio_resid); + } + + save = vm_fault_disable_pagefaults(); + error = doio(fp, uio, active_cred, flags | FOF_OFFSET, td); + if (error != EFAULT) + goto out; + + atomic_add_long(&vn_io_faults_cnt, 1); + uio_clone->uio_segflg = UIO_NOCOPY; + uiomove(NULL, resid - uio->uio_resid, uio_clone); + uio_clone->uio_segflg = uio->uio_segflg; + + saveheld = curthread_pflags_set(TDP_UIOHELD); + prev_td_ma = td->td_ma; + prev_td_ma_cnt = td->td_ma_cnt; + + while (uio_clone->uio_resid != 0) { + len = uio_clone->uio_iov->iov_len; + if (len == 0) { + KASSERT(uio_clone->uio_iovcnt >= 1, + ("iovcnt underflow")); + uio_clone->uio_iov++; + uio_clone->uio_iovcnt--; + continue; + } + + addr = (vm_offset_t)uio_clone->uio_iov->iov_base; + end = round_page(addr + len); + cnt = howmany(end - trunc_page(addr), PAGE_SIZE); + /* + * A perfectly misaligned address and length could cause + * both the start and the end of the chunk to use partial + * page. +2 accounts for such a situation. + */ + if (cnt > io_hold_cnt + 2) { + len = io_hold_cnt * PAGE_SIZE; + KASSERT(howmany(round_page(addr + len) - + trunc_page(addr), PAGE_SIZE) <= io_hold_cnt + 2, + ("cnt overflow")); + } + cnt = vm_fault_quick_hold_pages(&td->td_proc->p_vmspace->vm_map, + addr, len, prot, ma, io_hold_cnt + 2); + if (cnt == -1) { + error = EFAULT; + break; + } + short_uio.uio_iov = &short_iovec[0]; + short_iovec[0].iov_base = (void *)addr; + short_uio.uio_iovcnt = 1; + short_uio.uio_resid = short_iovec[0].iov_len = len; + short_uio.uio_offset = uio_clone->uio_offset; + td->td_ma = ma; + td->td_ma_cnt = cnt; + + error = doio(fp, &short_uio, active_cred, flags | FOF_OFFSET, + td); + vm_page_unhold_pages(ma, cnt); + adv = len - short_uio.uio_resid; + + uio_clone->uio_iov->iov_base = + (char *)uio_clone->uio_iov->iov_base + adv; + uio_clone->uio_iov->iov_len -= adv; + uio_clone->uio_resid -= adv; + uio_clone->uio_offset += adv; + + uio->uio_resid -= adv; + uio->uio_offset += adv; + + if (error != 0 || adv == 0) + break; + } + td->td_ma = prev_td_ma; + td->td_ma_cnt = prev_td_ma_cnt; + curthread_pflags_restore(saveheld); +out: + vm_fault_enable_pagefaults(save); + vn_rangelock_unlock(vp, rl_cookie); + free(uio_clone, M_IOV); +out_last: + foffset_unlock_uio(fp, uio, flags); + return (error); +} + +/* + * Helper function to perform the requested uiomove operation using + * the held pages for io->uio_iov[0].iov_base buffer instead of + * copyin/copyout. Access to the pages with uiomove_fromphys() + * instead of iov_base prevents page faults that could occur due to + * pmap_collect() invalidating the mapping created by + * vm_fault_quick_hold_pages(), or pageout daemon, page laundry or + * object cleanup revoking the write access from page mappings. + * + * Filesystems specified MNTK_NO_IOPF shall use vn_io_fault_uiomove() + * instead of plain uiomove(). + */ +int +vn_io_fault_uiomove(char *data, int xfersize, struct uio *uio) +{ + struct uio transp_uio; + struct iovec transp_iov[1]; + struct thread *td; + size_t adv; + int error, pgadv; + + td = curthread; + if ((td->td_pflags & TDP_UIOHELD) == 0 || + uio->uio_segflg != UIO_USERSPACE) + return (uiomove(data, xfersize, uio)); + + KASSERT(uio->uio_iovcnt == 1, ("uio_iovcnt %d", uio->uio_iovcnt)); + transp_iov[0].iov_base = data; + transp_uio.uio_iov = &transp_iov[0]; + transp_uio.uio_iovcnt = 1; + if (xfersize > uio->uio_resid) + xfersize = uio->uio_resid; + transp_uio.uio_resid = transp_iov[0].iov_len = xfersize; + transp_uio.uio_offset = 0; + transp_uio.uio_segflg = UIO_SYSSPACE; + /* + * Since transp_iov points to data, and td_ma page array + * corresponds to original uio->uio_iov, we need to invert the + * direction of the i/o operation as passed to + * uiomove_fromphys(). + */ + switch (uio->uio_rw) { + case UIO_WRITE: + transp_uio.uio_rw = UIO_READ; + break; + case UIO_READ: + transp_uio.uio_rw = UIO_WRITE; + break; + } + transp_uio.uio_td = uio->uio_td; + error = uiomove_fromphys(td->td_ma, + ((vm_offset_t)uio->uio_iov->iov_base) & PAGE_MASK, + xfersize, &transp_uio); + adv = xfersize - transp_uio.uio_resid; + pgadv = + (((vm_offset_t)uio->uio_iov->iov_base + adv) >> PAGE_SHIFT) - + (((vm_offset_t)uio->uio_iov->iov_base) >> PAGE_SHIFT); + td->td_ma += pgadv; + KASSERT(td->td_ma_cnt >= pgadv, ("consumed pages %d %d", td->td_ma_cnt, + pgadv)); + td->td_ma_cnt -= pgadv; + uio->uio_iov->iov_base = (char *)uio->uio_iov->iov_base + adv; + uio->uio_iov->iov_len -= adv; + uio->uio_resid -= adv; + uio->uio_offset += adv; + return (error); +} + /* * File table truncate routine. */ static int -vn_truncate(fp, length, active_cred, td) - struct file *fp; - off_t length; - struct ucred *active_cred; - struct thread *td; +vn_truncate(struct file *fp, off_t length, struct ucred *active_cred, + struct thread *td) { struct vattr vattr; struct mount *mp; struct vnode *vp; + void *rl_cookie; int vfslocked; int error; vp = fp->f_vnode; + + /* + * Lock the whole range for truncation. Otherwise split i/o + * might happen partly before and partly after the truncation. + */ + rl_cookie = vn_rangelock_wlock(vp, 0, OFF_MAX); vfslocked = VFS_LOCK_GIANT(vp->v_mount); error = vn_start_write(vp, &mp, V_WAIT | PCATCH); - if (error) { - VFS_UNLOCK_GIANT(vfslocked); - return (error); - } + if (error) + goto out1; vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); if (vp->v_type == VDIR) { error = EISDIR; @@ -730,7 +1142,9 @@ vn_truncate(fp, length, active_cred, td) out: VOP_UNLOCK(vp, 0); vn_finished_write(mp); +out1: VFS_UNLOCK_GIANT(vfslocked); + vn_rangelock_unlock(vp, rl_cookie); return (error); } @@ -1466,3 +1880,56 @@ vn_pages_remove(struct vnode *vp, vm_pindex_t start, vm_pindex_t end) vm_object_page_remove(object, start, end, 0); VM_OBJECT_UNLOCK(object); } + +int +vn_bmap_seekhole(struct vnode *vp, u_long cmd, off_t *off, struct ucred *cred) +{ + struct vattr va; + daddr_t bn, bnp; + uint64_t bsize; + off_t noff; + int error; + + KASSERT(cmd == FIOSEEKHOLE || cmd == FIOSEEKDATA, + ("Wrong command %lu", cmd)); + + if (vn_lock(vp, LK_SHARED) != 0) + return (EBADF); + if (vp->v_type != VREG) { + error = ENOTTY; + goto unlock; + } + error = VOP_GETATTR(vp, &va, cred); + if (error != 0) + goto unlock; + noff = *off; + if (noff >= va.va_size) { + error = ENXIO; + goto unlock; + } + bsize = vp->v_mount->mnt_stat.f_iosize; + for (bn = noff / bsize; noff < va.va_size; bn++, noff += bsize) { + error = VOP_BMAP(vp, bn, NULL, &bnp, NULL, NULL); + if (error == EOPNOTSUPP) { + error = ENOTTY; + goto unlock; + } + if ((bnp == -1 && cmd == FIOSEEKHOLE) || + (bnp != -1 && cmd == FIOSEEKDATA)) { + noff = bn * bsize; + if (noff < *off) + noff = *off; + goto unlock; + } + } + if (noff > va.va_size) + noff = va.va_size; + /* noff == va.va_size. There is an implicit hole at the end of file. */ + if (cmd == FIOSEEKDATA) + error = ENXIO; +unlock: + VOP_UNLOCK(vp, 0); + if (error == 0) + *off = noff; + return (error); +} diff --git a/sys/libkern/iconv.c b/sys/libkern/iconv.c index 92b04c2864e..dcdb1192ef3 100644 --- a/sys/libkern/iconv.c +++ b/sys/libkern/iconv.c @@ -84,9 +84,11 @@ iconv_mod_unload(void) struct iconv_cspair *csp; sx_xlock(&iconv_lock); - while ((csp = TAILQ_FIRST(&iconv_cslist)) != NULL) { - if (csp->cp_refcount) + TAILQ_FOREACH(csp, &iconv_cslist, cp_link) { + if (csp->cp_refcount) { + sx_xunlock(&iconv_lock); return EBUSY; + } } while ((csp = TAILQ_FIRST(&iconv_cslist)) != NULL) @@ -133,6 +135,7 @@ iconv_register_converter(struct iconv_converter_class *dcp) static int iconv_unregister_converter(struct iconv_converter_class *dcp) { + dcp->refs--; if (dcp->refs > 1) { ICDEBUG("converter have %d referenses left\n", dcp->refs); return EBUSY; @@ -549,9 +552,7 @@ int iconv_lookupcp(char **cpp, const char *s) { if (cpp == NULL) { - ICDEBUG("warning a NULL list passed\n", ""); /* XXX ISO variadic macros cannot - leave out the - variadic args */ + ICDEBUG("warning a NULL list passed\n", ""); return ENOENT; } for (; *cpp; cpp++) diff --git a/sys/libkern/iconv_ucs.c b/sys/libkern/iconv_ucs.c index c6f28236a74..30810ebab15 100644 --- a/sys/libkern/iconv_ucs.c +++ b/sys/libkern/iconv_ucs.c @@ -457,8 +457,6 @@ utf8_to_ucs4(const char *src, size_t *utf8width, size_t srclen) /* out of utf-16 range or having illegal bits */ return (0); } - if (w == 0) - return (0); if (srclen < w) return (0); diff --git a/sys/mips/atheros/ar71xx_chip.c b/sys/mips/atheros/ar71xx_chip.c index 18181aef169..2a257166c44 100644 --- a/sys/mips/atheros/ar71xx_chip.c +++ b/sys/mips/atheros/ar71xx_chip.c @@ -176,27 +176,57 @@ ar71xx_chip_set_mii_speed(uint32_t unit, uint32_t speed) ATH_WRITE_REG(reg, val); } -/* Speed is either 10, 100 or 1000 */ -static void -ar71xx_chip_set_pll_ge(int unit, int speed) +void +ar71xx_chip_set_mii_if(uint32_t unit, uint32_t mii_mode) { - uint32_t pll; + uint32_t val, reg, mii_if; - switch (speed) { - case 10: - pll = PLL_ETH_INT_CLK_10; + switch (unit) { + case 0: + reg = AR71XX_MII0_CTRL; + if (mii_mode == AR71XX_MII_MODE_GMII) + mii_if = MII0_CTRL_IF_GMII; + else if (mii_mode == AR71XX_MII_MODE_MII) + mii_if = MII0_CTRL_IF_MII; + else if (mii_mode == AR71XX_MII_MODE_RGMII) + mii_if = MII0_CTRL_IF_RGMII; + else if (mii_mode == AR71XX_MII_MODE_RMII) + mii_if = MII0_CTRL_IF_RMII; + else { + printf("%s: invalid MII mode (%d) for unit %d\n", + __func__, mii_mode, unit); + return; + } break; - case 100: - pll = PLL_ETH_INT_CLK_100; - break; - case 1000: - pll = PLL_ETH_INT_CLK_1000; + case 1: + reg = AR71XX_MII1_CTRL; + if (mii_mode == AR71XX_MII_MODE_RGMII) + mii_if = MII1_CTRL_IF_RGMII; + else if (mii_mode == AR71XX_MII_MODE_RMII) + mii_if = MII1_CTRL_IF_RMII; + else { + printf("%s: invalid MII mode (%d) for unit %d\n", + __func__, mii_mode, unit); + return; + } break; default: - printf("%s%d: invalid speed %d\n", - __func__, unit, speed); + printf("%s: invalid MII unit set for arge unit: %d\n", + __func__, unit); return; } + + val = ATH_READ_REG(reg); + val &= ~(MII_CTRL_IF_MASK << MII_CTRL_IF_SHIFT); + val |= (mii_if & MII_CTRL_IF_MASK) << MII_CTRL_IF_SHIFT; + ATH_WRITE_REG(reg, val); +} + +/* Speed is either 10, 100 or 1000 */ +static void +ar71xx_chip_set_pll_ge(int unit, int speed, uint32_t pll) +{ + switch (unit) { case 0: ar71xx_write_pll(AR71XX_PLL_SEC_CONFIG, @@ -242,7 +272,24 @@ ar71xx_chip_ddr_flush_ip2(void) static uint32_t ar71xx_chip_get_eth_pll(unsigned int mac, int speed) { - return 0; + uint32_t pll; + + switch (speed) { + case 10: + pll = PLL_ETH_INT_CLK_10; + break; + case 100: + pll = PLL_ETH_INT_CLK_100; + break; + case 1000: + pll = PLL_ETH_INT_CLK_1000; + break; + default: + printf("%s%d: invalid speed %d\n", __func__, mac, speed); + pll = 0; + } + + return (pll); } static void @@ -278,6 +325,7 @@ struct ar71xx_cpu_def ar71xx_chip_def = { &ar71xx_chip_device_stopped, &ar71xx_chip_set_pll_ge, &ar71xx_chip_set_mii_speed, + &ar71xx_chip_set_mii_if, &ar71xx_chip_ddr_flush_ge, &ar71xx_chip_get_eth_pll, &ar71xx_chip_ddr_flush_ip2, diff --git a/sys/mips/atheros/ar71xx_chip.h b/sys/mips/atheros/ar71xx_chip.h index 4869f3110f6..a9b4804299d 100644 --- a/sys/mips/atheros/ar71xx_chip.h +++ b/sys/mips/atheros/ar71xx_chip.h @@ -31,5 +31,6 @@ extern struct ar71xx_cpu_def ar71xx_chip_def; extern void ar71xx_chip_set_mii_speed(uint32_t unit, uint32_t speed); +extern void ar71xx_chip_set_mii_if(uint32_t unit, uint32_t mii_if); #endif diff --git a/sys/mips/atheros/ar71xx_cpudef.h b/sys/mips/atheros/ar71xx_cpudef.h index ce472f51a2e..c384d4c6066 100644 --- a/sys/mips/atheros/ar71xx_cpudef.h +++ b/sys/mips/atheros/ar71xx_cpudef.h @@ -35,8 +35,9 @@ struct ar71xx_cpu_def { void (* ar71xx_chip_device_stop) (uint32_t); void (* ar71xx_chip_device_start) (uint32_t); int (* ar71xx_chip_device_stopped) (uint32_t); - void (* ar71xx_chip_set_pll_ge) (int, int); + void (* ar71xx_chip_set_pll_ge) (int, int, uint32_t); void (* ar71xx_chip_set_mii_speed) (uint32_t, uint32_t); + void (* ar71xx_chip_set_mii_if) (uint32_t, ar71xx_mii_mode); void (* ar71xx_chip_ddr_flush_ge) (int); uint32_t (* ar71xx_chip_get_eth_pll) (unsigned int, int); @@ -80,9 +81,9 @@ static inline int ar71xx_device_stopped(uint32_t mask) return ar71xx_cpu_ops->ar71xx_chip_device_stopped(mask); } -static inline void ar71xx_device_set_pll_ge(int unit, int speed) +static inline void ar71xx_device_set_pll_ge(int unit, int speed, uint32_t pll) { - ar71xx_cpu_ops->ar71xx_chip_set_pll_ge(unit, speed); + ar71xx_cpu_ops->ar71xx_chip_set_pll_ge(unit, speed, pll); } static inline void ar71xx_device_set_mii_speed(int unit, int speed) @@ -90,11 +91,21 @@ static inline void ar71xx_device_set_mii_speed(int unit, int speed) ar71xx_cpu_ops->ar71xx_chip_set_mii_speed(unit, speed); } +static inline void ar71xx_device_set_mii_if(int unit, ar71xx_mii_mode mii_cfg) +{ + ar71xx_cpu_ops->ar71xx_chip_set_mii_if(unit, mii_cfg); +} + static inline void ar71xx_device_flush_ddr_ge(int unit) { ar71xx_cpu_ops->ar71xx_chip_ddr_flush_ge(unit); } +static inline uint32_t ar71xx_device_get_eth_pll(unsigned int unit, int speed) +{ + return (ar71xx_cpu_ops->ar71xx_chip_get_eth_pll(unit, speed)); +} + static inline void ar71xx_init_usb_peripheral(void) { ar71xx_cpu_ops->ar71xx_chip_init_usb_peripheral(); diff --git a/sys/mips/atheros/ar71xxreg.h b/sys/mips/atheros/ar71xxreg.h index e6c4eb72bff..7d6d6b2f5a4 100644 --- a/sys/mips/atheros/ar71xxreg.h +++ b/sys/mips/atheros/ar71xxreg.h @@ -267,26 +267,40 @@ #define AR91XX_REV_ID_REVISION_MASK 0x3 #define AR91XX_REV_ID_REVISION_SHIFT 2 +typedef enum { + AR71XX_MII_MODE_NONE = 0, + AR71XX_MII_MODE_GMII, + AR71XX_MII_MODE_MII, + AR71XX_MII_MODE_RGMII, + AR71XX_MII_MODE_RMII, +} ar71xx_mii_mode; + /* * AR71xx MII control region */ #define AR71XX_MII0_CTRL 0x18070000 -#define AR71XX_MII1_CTRL 0x18070004 #define MII_CTRL_SPEED_SHIFT 4 #define MII_CTRL_SPEED_MASK 3 -#define MII_CTRL_SPEED_10 0 -#define MII_CTRL_SPEED_100 1 -#define MII_CTRL_SPEED_1000 2 +#define MII_CTRL_SPEED_10 0 +#define MII_CTRL_SPEED_100 1 +#define MII_CTRL_SPEED_1000 2 +#define MII_CTRL_IF_MASK 3 +#define MII_CTRL_IF_SHIFT 0 +#define MII0_CTRL_IF_GMII 0 +#define MII0_CTRL_IF_MII 1 +#define MII0_CTRL_IF_RGMII 2 +#define MII0_CTRL_IF_RMII 3 + +#define AR71XX_MII1_CTRL 0x18070004 + +#define MII1_CTRL_IF_RGMII 0 +#define MII1_CTRL_IF_RMII 1 /* * GigE adapters region */ #define AR71XX_MAC0_BASE 0x19000000 #define AR71XX_MAC1_BASE 0x1A000000 -/* - * All 5 PHYs accessible only through MAC0 register space - */ -#define AR71XX_MII_BASE 0x19000000 #define AR71XX_MAC_CFG1 0x00 #define MAC_CFG1_SOFT_RESET (1 << 31) diff --git a/sys/mips/atheros/ar724x_chip.c b/sys/mips/atheros/ar724x_chip.c index d56a26c73da..4067ef85f2e 100644 --- a/sys/mips/atheros/ar724x_chip.c +++ b/sys/mips/atheros/ar724x_chip.c @@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -130,8 +131,15 @@ ar724x_chip_set_mii_speed(uint32_t unit, uint32_t speed) return; } +/* + * XXX TODO: set the PLL for arge0 only on AR7242. + * The PLL/clock requirements are different. + * + * Otherwise, it's a NULL function for AR7240, AR7241 and + * AR7242 arge1. + */ static void -ar724x_chip_set_pll_ge(int unit, int speed) +ar724x_chip_set_pll_ge(int unit, int speed, uint32_t pll) { switch (unit) { @@ -177,7 +185,7 @@ static uint32_t ar724x_chip_get_eth_pll(unsigned int mac, int speed) { - return 0; + return (0); } static void @@ -229,6 +237,7 @@ struct ar71xx_cpu_def ar724x_chip_def = { &ar724x_chip_device_stopped, &ar724x_chip_set_pll_ge, &ar724x_chip_set_mii_speed, + &ar71xx_chip_set_mii_if, &ar724x_chip_ddr_flush_ge, &ar724x_chip_get_eth_pll, &ar724x_chip_ddr_flush_ip2, diff --git a/sys/mips/atheros/ar91xx_chip.c b/sys/mips/atheros/ar91xx_chip.c index c88518f1cb2..fa0e2357910 100644 --- a/sys/mips/atheros/ar91xx_chip.c +++ b/sys/mips/atheros/ar91xx_chip.c @@ -112,25 +112,9 @@ ar91xx_chip_device_stopped(uint32_t mask) } static void -ar91xx_chip_set_pll_ge(int unit, int speed) +ar91xx_chip_set_pll_ge(int unit, int speed, uint32_t pll) { - uint32_t pll; - switch(speed) { - case 10: - pll = AR91XX_PLL_VAL_10; - break; - case 100: - pll = AR91XX_PLL_VAL_100; - break; - case 1000: - pll = AR91XX_PLL_VAL_1000; - break; - default: - printf("%s%d: invalid speed %d\n", - __func__, unit, speed); - return; - } switch (unit) { case 0: ar71xx_write_pll(AR91XX_PLL_REG_ETH_CONFIG, @@ -178,8 +162,24 @@ ar91xx_chip_ddr_flush_ip2(void) static uint32_t ar91xx_chip_get_eth_pll(unsigned int mac, int speed) { + uint32_t pll; - return 0; + switch(speed) { + case 10: + pll = AR91XX_PLL_VAL_10; + break; + case 100: + pll = AR91XX_PLL_VAL_100; + break; + case 1000: + pll = AR91XX_PLL_VAL_1000; + break; + default: + printf("%s%d: invalid speed %d\n", __func__, mac, speed); + pll = 0; + } + + return (pll); } static void @@ -211,6 +211,7 @@ struct ar71xx_cpu_def ar91xx_chip_def = { &ar91xx_chip_device_stopped, &ar91xx_chip_set_pll_ge, &ar71xx_chip_set_mii_speed, + &ar71xx_chip_set_mii_if, &ar91xx_chip_ddr_flush_ge, &ar91xx_chip_get_eth_pll, &ar91xx_chip_ddr_flush_ip2, diff --git a/sys/mips/atheros/if_arge.c b/sys/mips/atheros/if_arge.c index 407da143e70..6c6398299e0 100644 --- a/sys/mips/atheros/if_arge.c +++ b/sys/mips/atheros/if_arge.c @@ -35,6 +35,8 @@ __FBSDID("$FreeBSD$"); #include "opt_device_polling.h" #endif +#include "opt_arge.h" + #include #include #include @@ -72,8 +74,18 @@ __FBSDID("$FreeBSD$"); #include #include +#include "opt_arge.h" + +#if defined(ARGE_MDIO) +#include +#include +#include "mdio_if.h" +#endif + + MODULE_DEPEND(arge, ether, 1, 1, 1); MODULE_DEPEND(arge, miibus, 1, 1, 1); +MODULE_VERSION(arge, 1); #include "miibus_if.h" @@ -89,8 +101,17 @@ typedef enum { ARGE_DBG_RX = 0x00000008, ARGE_DBG_ERR = 0x00000010, ARGE_DBG_RESET = 0x00000020, + ARGE_DBG_PLL = 0x00000040, } arge_debug_flags; +static const char * arge_miicfg_str[] = { + "NONE", + "GMII", + "MII", + "RGMII", + "RMII" +}; + #ifdef ARGE_DEBUG #define ARGEDEBUG(_sc, _m, ...) \ do { \ @@ -136,6 +157,8 @@ static void arge_intr(void *); static int arge_intr_filter(void *); static void arge_tick(void *); +static void arge_hinted_child(device_t bus, const char *dname, int dunit); + /* * ifmedia callbacks for multiPHY MAC */ @@ -162,6 +185,10 @@ static device_method_t arge_methods[] = { DEVMETHOD(miibus_writereg, arge_miibus_writereg), DEVMETHOD(miibus_statchg, arge_miibus_statchg), + /* bus interface */ + DEVMETHOD(bus_add_child, device_add_child_ordered), + DEVMETHOD(bus_hinted_child, arge_hinted_child), + DEVMETHOD_END }; @@ -176,6 +203,37 @@ static devclass_t arge_devclass; DRIVER_MODULE(arge, nexus, arge_driver, arge_devclass, 0, 0); DRIVER_MODULE(miibus, arge, miibus_driver, miibus_devclass, 0, 0); +#if defined(ARGE_MDIO) +static int argemdio_probe(device_t); +static int argemdio_attach(device_t); +static int argemdio_detach(device_t); + +/* + * Declare an additional, separate driver for accessing the MDIO bus. + */ +static device_method_t argemdio_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, argemdio_probe), + DEVMETHOD(device_attach, argemdio_attach), + DEVMETHOD(device_detach, argemdio_detach), + + /* bus interface */ + DEVMETHOD(bus_add_child, device_add_child_ordered), + + /* MDIO access */ + DEVMETHOD(mdio_readreg, arge_miibus_readreg), + DEVMETHOD(mdio_writereg, arge_miibus_writereg), +}; + +DEFINE_CLASS_0(argemdio, argemdio_driver, argemdio_methods, + sizeof(struct arge_softc)); +static devclass_t argemdio_devclass; + +DRIVER_MODULE(miiproxy, arge, miiproxy_driver, miiproxy_devclass, 0, 0); +DRIVER_MODULE(argemdio, nexus, argemdio_driver, argemdio_devclass, 0, 0); +DRIVER_MODULE(mdio, argemdio, mdio_driver, mdio_devclass, 0, 0); +#endif + /* * RedBoot passes MAC address to entry point as environment * variable. platfrom_start parses it and stores in this variable @@ -235,17 +293,84 @@ arge_attach_sysctl(device_t dev) #endif } +static void +arge_reset_mac(struct arge_softc *sc) +{ + uint32_t reg; + + /* Step 1. Soft-reset MAC */ + ARGE_SET_BITS(sc, AR71XX_MAC_CFG1, MAC_CFG1_SOFT_RESET); + DELAY(20); + + /* Step 2. Punt the MAC core from the central reset register */ + ar71xx_device_stop(sc->arge_mac_unit == 0 ? RST_RESET_GE0_MAC : + RST_RESET_GE1_MAC); + DELAY(100); + ar71xx_device_start(sc->arge_mac_unit == 0 ? RST_RESET_GE0_MAC : + RST_RESET_GE1_MAC); + + /* Step 3. Reconfigure MAC block */ + ARGE_WRITE(sc, AR71XX_MAC_CFG1, + MAC_CFG1_SYNC_RX | MAC_CFG1_RX_ENABLE | + MAC_CFG1_SYNC_TX | MAC_CFG1_TX_ENABLE); + + reg = ARGE_READ(sc, AR71XX_MAC_CFG2); + reg |= MAC_CFG2_ENABLE_PADCRC | MAC_CFG2_LENGTH_FIELD ; + ARGE_WRITE(sc, AR71XX_MAC_CFG2, reg); + + ARGE_WRITE(sc, AR71XX_MAC_MAX_FRAME_LEN, 1536); +} + +static void +arge_reset_miibus(struct arge_softc *sc) +{ + + /* Reset MII bus */ + ARGE_WRITE(sc, AR71XX_MAC_MII_CFG, MAC_MII_CFG_RESET); + DELAY(100); + ARGE_WRITE(sc, AR71XX_MAC_MII_CFG, MAC_MII_CFG_CLOCK_DIV_28); + DELAY(100); +} + +static void +arge_fetch_pll_config(struct arge_softc *sc) +{ + long int val; + + if (resource_long_value(device_get_name(sc->arge_dev), + device_get_unit(sc->arge_dev), + "pll_10", &val) == 0) { + sc->arge_pllcfg.pll_10 = val; + device_printf(sc->arge_dev, "%s: pll_10 = 0x%x\n", + __func__, (int) val); + } + if (resource_long_value(device_get_name(sc->arge_dev), + device_get_unit(sc->arge_dev), + "pll_100", &val) == 0) { + sc->arge_pllcfg.pll_100 = val; + device_printf(sc->arge_dev, "%s: pll_100 = 0x%x\n", + __func__, (int) val); + } + if (resource_long_value(device_get_name(sc->arge_dev), + device_get_unit(sc->arge_dev), + "pll_1000", &val) == 0) { + sc->arge_pllcfg.pll_1000 = val; + device_printf(sc->arge_dev, "%s: pll_1000 = 0x%x\n", + __func__, (int) val); + } +} + static int arge_attach(device_t dev) { - uint8_t eaddr[ETHER_ADDR_LEN]; struct ifnet *ifp; struct arge_softc *sc; - int error = 0, rid, phymask; - uint32_t reg, rnd; - int is_base_mac_empty, i, phys_total; + int error = 0, rid; + uint32_t rnd; + int is_base_mac_empty, i; uint32_t hint; long eeprom_mac_addr = 0; + int miicfg = 0; sc = device_get_softc(dev); sc->arge_dev = dev; @@ -276,22 +401,37 @@ arge_attach(device_t dev) ("if_arge: Only MAC0 and MAC1 supported")); /* - * Get which PHY of 5 available we should use for this unit + * Fetch the PLL configuration. + */ + arge_fetch_pll_config(sc); + + /* + * Get the MII configuration, if applicable. */ if (resource_int_value(device_get_name(dev), device_get_unit(dev), - "phymask", &phymask) != 0) { + "miimode", &miicfg) == 0) { + /* XXX bounds check? */ + device_printf(dev, "%s: overriding MII mode to '%s'\n", + __func__, arge_miicfg_str[miicfg]); + sc->arge_miicfg = miicfg; + } + + /* + * Get which PHY of 5 available we should use for this unit + */ + if (resource_int_value(device_get_name(dev), device_get_unit(dev), + "phymask", &sc->arge_phymask) != 0) { /* * Use port 4 (WAN) for GE0. For any other port use * its PHY the same as its unit number */ if (sc->arge_mac_unit == 0) - phymask = (1 << 4); + sc->arge_phymask = (1 << 4); else /* Use all phys up to 4 */ - phymask = (1 << 4) - 1; + sc->arge_phymask = (1 << 4) - 1; - device_printf(dev, "No PHY specified, using mask %d\n", - phymask); + device_printf(dev, "No PHY specified, using mask %d\n", sc->arge_phymask); } /* @@ -316,8 +456,6 @@ arge_attach(device_t dev) else sc->arge_duplex_mode = 0; - sc->arge_phymask = phymask; - mtx_init(&sc->arge_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, MTX_DEF); callout_init_mtx(&sc->arge_stat_callout, &sc->arge_mtx, 0); @@ -325,8 +463,8 @@ arge_attach(device_t dev) /* Map control/status registers. */ sc->arge_rid = 0; - sc->arge_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, - &sc->arge_rid, RF_ACTIVE); + sc->arge_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, + &sc->arge_rid, RF_ACTIVE | RF_SHAREABLE); if (sc->arge_res == NULL) { device_printf(dev, "couldn't map memory\n"); @@ -374,8 +512,8 @@ arge_attach(device_t dev) is_base_mac_empty = 1; for (i = 0; i < ETHER_ADDR_LEN; i++) { - eaddr[i] = ar711_base_mac[i] & 0xff; - if (eaddr[i] != 0) + sc->arge_eaddr[i] = ar711_base_mac[i] & 0xff; + if (sc->arge_eaddr[i] != 0) is_base_mac_empty = 0; } @@ -388,59 +526,44 @@ arge_attach(device_t dev) "Generating random ethernet address.\n"); rnd = arc4random(); - eaddr[0] = 'b'; - eaddr[1] = 's'; - eaddr[2] = 'd'; - eaddr[3] = (rnd >> 24) & 0xff; - eaddr[4] = (rnd >> 16) & 0xff; - eaddr[5] = (rnd >> 8) & 0xff; + sc->arge_eaddr[0] = 'b'; + sc->arge_eaddr[1] = 's'; + sc->arge_eaddr[2] = 'd'; + sc->arge_eaddr[3] = (rnd >> 24) & 0xff; + sc->arge_eaddr[4] = (rnd >> 16) & 0xff; + sc->arge_eaddr[5] = (rnd >> 8) & 0xff; } - if (sc->arge_mac_unit != 0) - eaddr[5] += sc->arge_mac_unit; + sc->arge_eaddr[5] += sc->arge_mac_unit; if (arge_dma_alloc(sc) != 0) { error = ENXIO; goto fail; } + /* + * Don't do this for the MDIO bus case - it's already done + * as part of the MDIO bus attachment. + */ +#if !defined(ARGE_MDIO) /* Initialize the MAC block */ + arge_reset_mac(sc); + arge_reset_miibus(sc); +#endif - /* Step 1. Soft-reset MAC */ - ARGE_SET_BITS(sc, AR71XX_MAC_CFG1, MAC_CFG1_SOFT_RESET); - DELAY(20); - - /* Step 2. Punt the MAC core from the central reset register */ - ar71xx_device_stop(sc->arge_mac_unit == 0 ? RST_RESET_GE0_MAC : - RST_RESET_GE1_MAC); - DELAY(100); - ar71xx_device_start(sc->arge_mac_unit == 0 ? RST_RESET_GE0_MAC : - RST_RESET_GE1_MAC); - - /* Step 3. Reconfigure MAC block */ - ARGE_WRITE(sc, AR71XX_MAC_CFG1, - MAC_CFG1_SYNC_RX | MAC_CFG1_RX_ENABLE | - MAC_CFG1_SYNC_TX | MAC_CFG1_TX_ENABLE); - - reg = ARGE_READ(sc, AR71XX_MAC_CFG2); - reg |= MAC_CFG2_ENABLE_PADCRC | MAC_CFG2_LENGTH_FIELD ; - ARGE_WRITE(sc, AR71XX_MAC_CFG2, reg); - - ARGE_WRITE(sc, AR71XX_MAC_MAX_FRAME_LEN, 1536); - - /* Reset MII bus */ - ARGE_WRITE(sc, AR71XX_MAC_MII_CFG, MAC_MII_CFG_RESET); - DELAY(100); - ARGE_WRITE(sc, AR71XX_MAC_MII_CFG, MAC_MII_CFG_CLOCK_DIV_28); - DELAY(100); + /* Configure MII mode, just for convienence */ + if (sc->arge_miicfg != 0) + ar71xx_device_set_mii_if(sc->arge_mac_unit, sc->arge_miicfg); /* * Set all Ethernet address registers to the same initial values * set all four addresses to 66-88-aa-cc-dd-ee */ - ARGE_WRITE(sc, AR71XX_MAC_STA_ADDR1, - (eaddr[2] << 24) | (eaddr[3] << 16) | (eaddr[4] << 8) | eaddr[5]); - ARGE_WRITE(sc, AR71XX_MAC_STA_ADDR2, (eaddr[0] << 8) | eaddr[1]); + ARGE_WRITE(sc, AR71XX_MAC_STA_ADDR1, (sc->arge_eaddr[2] << 24) + | (sc->arge_eaddr[3] << 16) | (sc->arge_eaddr[4] << 8) + | sc->arge_eaddr[5]); + ARGE_WRITE(sc, AR71XX_MAC_STA_ADDR2, (sc->arge_eaddr[0] << 8) + | sc->arge_eaddr[1]); ARGE_WRITE(sc, AR71XX_MAC_FIFO_CFG0, FIFO_CFG0_ALL << FIFO_CFG0_ENABLE_SHIFT); @@ -463,31 +586,30 @@ arge_attach(device_t dev) ARGE_WRITE(sc, AR71XX_MAC_FIFO_RX_FILTMASK, FIFO_RX_FILTMASK_DEFAULT); - /* - * Check if we have single-PHY MAC or multi-PHY - */ - phys_total = 0; - for (i = 0; i < ARGE_NPHY; i++) - if (phymask & (1 << i)) - phys_total ++; +#if defined(ARGE_MDIO) + sc->arge_miiproxy = mii_attach_proxy(sc->arge_dev); +#endif - if (phys_total == 0) { - error = EINVAL; - goto fail; - } - - if (phys_total == 1) { - /* Do MII setup. */ - error = mii_attach(dev, &sc->arge_miibus, ifp, - arge_ifmedia_upd, arge_ifmedia_sts, BMSR_DEFCAPMASK, - MII_PHY_ANY, MII_OFFSET_ANY, 0); - if (error != 0) { - device_printf(dev, "attaching PHYs failed\n"); - goto fail; + device_printf(sc->arge_dev, "finishing attachment, phymask %04x" + ", proxy %s \n", sc->arge_phymask, sc->arge_miiproxy == NULL ? + "null" : "set"); + for (i = 0; i < ARGE_NPHY; i++) { + if (((1 << i) & sc->arge_phymask) != 0) { + error = mii_attach(sc->arge_miiproxy != NULL ? + sc->arge_miiproxy : sc->arge_dev, + &sc->arge_miibus, sc->arge_ifp, + arge_ifmedia_upd, arge_ifmedia_sts, + BMSR_DEFCAPMASK, i, MII_OFFSET_ANY, 0); + if (error != 0) { + device_printf(sc->arge_dev, "unable to attach" + " PHY %d: %d\n", i, error); + goto fail; + } } } - else { - ifmedia_init(&sc->arge_ifmedia, 0, + if (sc->arge_miibus == NULL) { + /* no PHY, so use hard-coded values */ + ifmedia_init(&sc->arge_ifmedia, 0, arge_multiphy_mediachange, arge_multiphy_mediastatus); ifmedia_add(&sc->arge_ifmedia, @@ -499,23 +621,23 @@ arge_attach(device_t dev) } /* Call MI attach routine. */ - ether_ifattach(ifp, eaddr); + ether_ifattach(sc->arge_ifp, sc->arge_eaddr); /* Hook interrupt last to avoid having to lock softc */ - error = bus_setup_intr(dev, sc->arge_irq, INTR_TYPE_NET | INTR_MPSAFE, + error = bus_setup_intr(sc->arge_dev, sc->arge_irq, INTR_TYPE_NET | INTR_MPSAFE, arge_intr_filter, arge_intr, sc, &sc->arge_intrhand); if (error) { - device_printf(dev, "couldn't set up irq\n"); - ether_ifdetach(ifp); + device_printf(sc->arge_dev, "couldn't set up irq\n"); + ether_ifdetach(sc->arge_ifp); goto fail; } /* setup sysctl variables */ - arge_attach_sysctl(dev); + arge_attach_sysctl(sc->arge_dev); fail: - if (error) + if (error) arge_detach(dev); return (error); @@ -548,6 +670,9 @@ arge_detach(device_t dev) if (sc->arge_miibus) device_delete_child(dev, sc->arge_miibus); + if (sc->arge_miiproxy) + device_delete_child(dev, sc->arge_miiproxy); + bus_generic_detach(dev); if (sc->arge_intrhand) @@ -598,6 +723,13 @@ arge_shutdown(device_t dev) return (0); } +static void +arge_hinted_child(device_t bus, const char *dname, int dunit) +{ + BUS_ADD_CHILD(bus, 0, dname, dunit); + device_printf(bus, "hinted child %s%d\n", dname, dunit); +} + static int arge_miibus_readreg(device_t dev, int phy, int reg) { @@ -606,16 +738,13 @@ arge_miibus_readreg(device_t dev, int phy, int reg) uint32_t addr = (phy << MAC_MII_PHY_ADDR_SHIFT) | (reg & MAC_MII_REG_MASK); - if ((sc->arge_phymask & (1 << phy)) == 0) - return (0); - mtx_lock(&miibus_mtx); - ARGE_MII_WRITE(AR71XX_MAC_MII_CMD, MAC_MII_CMD_WRITE); - ARGE_MII_WRITE(AR71XX_MAC_MII_ADDR, addr); - ARGE_MII_WRITE(AR71XX_MAC_MII_CMD, MAC_MII_CMD_READ); + ARGE_MDIO_WRITE(sc, AR71XX_MAC_MII_CMD, MAC_MII_CMD_WRITE); + ARGE_MDIO_WRITE(sc, AR71XX_MAC_MII_ADDR, addr); + ARGE_MDIO_WRITE(sc, AR71XX_MAC_MII_CMD, MAC_MII_CMD_READ); i = ARGE_MII_TIMEOUT; - while ((ARGE_MII_READ(AR71XX_MAC_MII_INDICATOR) & + while ((ARGE_MDIO_READ(sc, AR71XX_MAC_MII_INDICATOR) & MAC_MII_INDICATOR_BUSY) && (i--)) DELAY(5); @@ -626,8 +755,8 @@ arge_miibus_readreg(device_t dev, int phy, int reg) return (-1); } - result = ARGE_MII_READ(AR71XX_MAC_MII_STATUS) & MAC_MII_STATUS_MASK; - ARGE_MII_WRITE(AR71XX_MAC_MII_CMD, MAC_MII_CMD_WRITE); + result = ARGE_MDIO_READ(sc, AR71XX_MAC_MII_STATUS) & MAC_MII_STATUS_MASK; + ARGE_MDIO_WRITE(sc, AR71XX_MAC_MII_CMD, MAC_MII_CMD_WRITE); mtx_unlock(&miibus_mtx); ARGEDEBUG(sc, ARGE_DBG_MII, @@ -645,19 +774,15 @@ arge_miibus_writereg(device_t dev, int phy, int reg, int data) uint32_t addr = (phy << MAC_MII_PHY_ADDR_SHIFT) | (reg & MAC_MII_REG_MASK); - - if ((sc->arge_phymask & (1 << phy)) == 0) - return (-1); - - ARGEDEBUG(sc, ARGE_DBG_MII, "%s: phy=%d, reg=%02x, value=%04x\n", - __func__, phy, reg, data); + ARGEDEBUG(sc, ARGE_DBG_MII, "%s: phy=%d, reg=%02x, value=%04x\n", __func__, + phy, reg, data); mtx_lock(&miibus_mtx); - ARGE_MII_WRITE(AR71XX_MAC_MII_ADDR, addr); - ARGE_MII_WRITE(AR71XX_MAC_MII_CONTROL, data); + ARGE_MDIO_WRITE(sc, AR71XX_MAC_MII_ADDR, addr); + ARGE_MDIO_WRITE(sc, AR71XX_MAC_MII_CONTROL, data); i = ARGE_MII_TIMEOUT; - while ((ARGE_MII_READ(AR71XX_MAC_MII_INDICATOR) & + while ((ARGE_MDIO_READ(sc, AR71XX_MAC_MII_INDICATOR) & MAC_MII_INDICATOR_BUSY) && (i--)) DELAY(5); @@ -709,10 +834,13 @@ arge_update_link_locked(struct arge_softc *sc) if (mii->mii_media_status & IFM_ACTIVE) { media = IFM_SUBTYPE(mii->mii_media_active); - if (media != IFM_NONE) { sc->arge_link_status = 1; duplex = mii->mii_media_active & IFM_GMASK; + ARGEDEBUG(sc, ARGE_DBG_MII, "%s: media=%d, duplex=%d\n", + __func__, + media, + duplex); arge_set_pll(sc, media, duplex); } } else { @@ -724,9 +852,11 @@ static void arge_set_pll(struct arge_softc *sc, int media, int duplex) { uint32_t cfg, ifcontrol, rx_filtmask; - uint32_t fifo_tx; + uint32_t fifo_tx, pll; int if_speed; + ARGEDEBUG(sc, ARGE_DBG_PLL, "set_pll(%04x, %s)\n", media, + duplex == IFM_FDX ? "full" : "half"); cfg = ARGE_READ(sc, AR71XX_MAC_CFG2); cfg &= ~(MAC_CFG2_IFACE_MODE_1000 | MAC_CFG2_IFACE_MODE_10_100 @@ -763,6 +893,8 @@ arge_set_pll(struct arge_softc *sc, int media, int duplex) "Unknown media %d\n", media); } + ARGEDEBUG(sc, ARGE_DBG_PLL, "%s: if_speed=%d\n", __func__, if_speed); + switch (ar71xx_soc) { case AR71XX_SOC_AR7240: case AR71XX_SOC_AR7241: @@ -783,8 +915,36 @@ arge_set_pll(struct arge_softc *sc, int media, int duplex) rx_filtmask); ARGE_WRITE(sc, AR71XX_MAC_FIFO_TX_THRESHOLD, fifo_tx); - /* set PLL registers */ - ar71xx_device_set_pll_ge(sc->arge_mac_unit, if_speed); + /* fetch PLL registers */ + pll = ar71xx_device_get_eth_pll(sc->arge_mac_unit, if_speed); + ARGEDEBUG(sc, ARGE_DBG_PLL, "%s: pll=0x%x\n", __func__, pll); + + /* Override if required by platform data */ + if (if_speed == 10 && sc->arge_pllcfg.pll_10 != 0) + pll = sc->arge_pllcfg.pll_10; + else if (if_speed == 100 && sc->arge_pllcfg.pll_100 != 0) + pll = sc->arge_pllcfg.pll_100; + else if (if_speed == 1000 && sc->arge_pllcfg.pll_1000 != 0) + pll = sc->arge_pllcfg.pll_1000; + ARGEDEBUG(sc, ARGE_DBG_PLL, "%s: final pll=0x%x\n", __func__, pll); + + /* XXX ensure pll != 0 */ + ar71xx_device_set_pll_ge(sc->arge_mac_unit, if_speed, pll); + + /* set MII registers */ + /* + * This was introduced to match what the Linux ag71xx ethernet + * driver does. For the AR71xx case, it does set the port + * MII speed. However, if this is done, non-gigabit speeds + * are not at all reliable when speaking via RGMII through + * 'bridge' PHY port that's pretending to be a local PHY. + * + * Until that gets root caused, and until an AR71xx + normal + * PHY board is tested, leave this disabled. + */ +#if 0 + ar71xx_device_set_mii_speed(sc->arge_mac_unit, if_speed); +#endif } @@ -1990,3 +2150,48 @@ arge_multiphy_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) sc->arge_duplex_mode; } +#if defined(ARGE_MDIO) +static int +argemdio_probe(device_t dev) +{ + device_set_desc(dev, "Atheros AR71xx built-in ethernet interface, MDIO controller"); + return (0); +} + +static int +argemdio_attach(device_t dev) +{ + struct arge_softc *sc; + int error = 0; + + sc = device_get_softc(dev); + sc->arge_dev = dev; + sc->arge_mac_unit = device_get_unit(dev); + sc->arge_rid = 0; + sc->arge_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, + &sc->arge_rid, RF_ACTIVE | RF_SHAREABLE); + if (sc->arge_res == NULL) { + device_printf(dev, "couldn't map memory\n"); + error = ENXIO; + goto fail; + } + + /* Reset MAC - required for AR71xx MDIO to successfully occur */ + arge_reset_mac(sc); + /* Reset MII bus */ + arge_reset_miibus(sc); + + bus_generic_probe(dev); + bus_enumerate_hinted_children(dev); + error = bus_generic_attach(dev); +fail: + return (error); +} + +static int +argemdio_detach(device_t dev) +{ + return (0); +} + +#endif diff --git a/sys/mips/atheros/if_argevar.h b/sys/mips/atheros/if_argevar.h index c1df6781b26..9add6740ec1 100644 --- a/sys/mips/atheros/if_argevar.h +++ b/sys/mips/atheros/if_argevar.h @@ -67,15 +67,10 @@ #define ARGE_CLEAR_BITS(sc, reg, bits) \ ARGE_WRITE(sc, reg, ARGE_READ(sc, (reg)) & ~(bits)) -/* - * MII registers access macros - */ -#define ARGE_MII_READ(reg) \ - *((volatile uint32_t *)MIPS_PHYS_TO_KSEG1((AR71XX_MII_BASE + reg))) - -#define ARGE_MII_WRITE(reg, val) \ - *((volatile uint32_t *)MIPS_PHYS_TO_KSEG1((AR71XX_MII_BASE + reg))) = (val) - +#define ARGE_MDIO_WRITE(_sc, _reg, _val) \ + ARGE_WRITE((_sc), (_reg), (_val)) +#define ARGE_MDIO_READ(_sc, _reg) \ + ARGE_READ((_sc), (_reg)) #define ARGE_DESC_EMPTY (1 << 31) #define ARGE_DESC_MORE (1 << 24) @@ -123,6 +118,15 @@ struct arge_ring_data { bus_addr_t arge_tx_ring_paddr; }; +/* + * Allow PLL values to be overridden. + */ +struct arge_pll_data { + uint32_t pll_10; + uint32_t pll_100; + uint32_t pll_1000; +}; + struct arge_softc { struct ifnet *arge_ifp; /* interface info */ device_t arge_dev; @@ -132,11 +136,16 @@ struct arge_softc { */ uint32_t arge_media_type; uint32_t arge_duplex_mode; + uint32_t arge_phymask; + uint8_t arge_eaddr[ETHER_ADDR_LEN]; struct resource *arge_res; int arge_rid; struct resource *arge_irq; void *arge_intrhand; device_t arge_miibus; + device_t arge_miiproxy; + ar71xx_mii_mode arge_miicfg; + struct arge_pll_data arge_pllcfg; bus_dma_tag_t arge_parent_tag; bus_dma_tag_t arge_tag; struct mtx arge_mtx; @@ -148,7 +157,6 @@ struct arge_softc { int arge_detach; uint32_t arge_intr_status; int arge_mac_unit; - int arge_phymask; int arge_if_flags; uint32_t arge_debug; struct { diff --git a/sys/mips/cavium/uart_bus_octeonusart.c b/sys/mips/cavium/uart_bus_octeonusart.c index 25deabe5b10..4284c1b0f1a 100644 --- a/sys/mips/cavium/uart_bus_octeonusart.c +++ b/sys/mips/cavium/uart_bus_octeonusart.c @@ -61,11 +61,8 @@ __FBSDID("$FreeBSD$"); extern struct uart_class uart_oct16550_class; - static int uart_octeon_probe(device_t dev); -extern struct uart_class octeon_uart_class; - static device_method_t uart_octeon_methods[] = { /* Device interface */ DEVMETHOD(device_probe, uart_octeon_probe), diff --git a/sys/mips/conf/AP93 b/sys/mips/conf/AP93 new file mode 100644 index 00000000000..202a7cf98cf --- /dev/null +++ b/sys/mips/conf/AP93 @@ -0,0 +1,138 @@ +# +# AP93 -- Kernel configuration file for FreeBSD/mips for Atheros AP93 reference +# board (AR7240) +# +# $FreeBSD$ +# + +ident AP93 + +# XXX The default load address in the Uboot environment is 0x80010000 +makeoptions KERNLOADADDR=0x80050000 +options HZ=1000 + +# The AP93 has 64mb of RAM; hard-code that +options AR71XX_REALMEM=64*1024*1024 + +# It's UBOOT, not Redboot - without this, things will hang at startup +options AR71XX_ENV_UBOOT + +makeoptions MODULES_OVERRIDE="ath ath_pci ath_ahb bridgestp if_bridge if_gif if_gre random wlan wlan_acl wlan_amrr wlan_ccmp wlan_rssadapt wlan_tkip wlan_wep wlan_xauth usb ar71xx" + +hints "AP93.hints" +include "../atheros/std.ar71xx" + +makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols +makeoptions MODULES_OVERRIDE="" + +options DDB +options KDB + +options SCHED_4BSD #4BSD scheduler +options INET #InterNETworking +# Can't do IPv6 - it just doesn't fit. +# options INET6 +# options NFSCL #Network Filesystem Client +options PSEUDOFS #Pseudo-filesystem framework +options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions +options ALQ + +# Debugging for use in -current +options DEADLKRES +options INVARIANTS +options INVARIANT_SUPPORT +options WITNESS +options WITNESS_SKIPSPIN +options FFS #Berkeley Fast Filesystem + +# Support uncompress lzma rootfs +device geom_uncompress +options GEOM_UNCOMPRESS +options ROOTDEVNAME=\"ufs:/dev/map/rootfs.uncompress\" + +# PCI bus +device pci +device ar724x_pci +# Enable the AR71xx EEPROM PCI(e) workaround +options AR71XX_ATH_EEPROM + +# NVRAM U-Boot Environment -> Kernel environment +device nvram2env + +# Wireless NIC cards +options IEEE80211_DEBUG +options IEEE80211_SUPPORT_MESH +options IEEE80211_SUPPORT_TDMA +options IEEE80211_ALQ + +device wlan # 802.11 support +device wlan_wep # 802.11 WEP support +device wlan_ccmp # 802.11 CCMP support +device wlan_tkip # 802.11 TKIP support +device wlan_xauth # 802.11 hostap support + +device ath # Atheros pci/cardbus NIC's +device ath_pci # PCI/PCIe bus glue +options ATH_DEBUG +options ATH_ENABLE_11N +options ATH_DIAGAPI +device firmware +options ATH_EEPROM_FIRMWARE + +device ath_hal +options AH_SUPPORT_AR5416 +options AH_DEBUG +options AH_DEBUG_ALQ + +device ath_rate_sample + +device mii +device arge +device miiproxy +options ARGE_DEBUG +options ARGE_MDIO +device etherswitch +device arswitch + +# USB devices - (todo: does AR7240 have OHCI, or just EHCI?) + +#device usb +options USB_EHCI_BIG_ENDIAN_DESC # handle big-endian byte order +options USB_DEBUG +options USB_HOST_ALIGN=32 +#device ehci + +# Mass storage +#device scbus +#device umass +#device da + +# Read MSDOS formatted disks +options GEOM_PART_BSD +options GEOM_PART_MBR +#options MSDOSFS + +# GPIO Bus +#device gpio +#device gpioled + +# SPI and flash +device spibus +device ar71xx_spi +device mx25l + +# The flash is statically partitioned; add in that +device geom_map + +device ar71xx_wdog + +# Serial +device uart + +# Network twiddling +device loop +device ether +device md +device bpf +device random +device if_bridge diff --git a/sys/mips/conf/AP93.hints b/sys/mips/conf/AP93.hints new file mode 100644 index 00000000000..0fe3431563a --- /dev/null +++ b/sys/mips/conf/AP93.hints @@ -0,0 +1,196 @@ +# $FreeBSD$ + +hint.apb.0.at="nexus0" +hint.apb.0.irq=4 + +# uart0 +hint.uart.0.at="apb0" +# see atheros/uart_cpu_ar71xx.c why +3 +hint.uart.0.maddr=0x18020003 +hint.uart.0.msize=0x18 +hint.uart.0.irq=3 + +# arge0 MDIO bus +hint.argemdio.0.at="nexus0" +hint.argemdio.0.maddr=0x19000000 +hint.argemdio.0.msize=0x1000 +hint.argemdio.0.order=0 + +# arge1 MDIO bus doesn't exist on the AR7240 + +# arge0: MII; dedicated PHY 4 on switch, connected via internal switch +# MDIO bus. + +hint.arge.0.at="nexus0" +hint.arge.0.maddr=0x19000000 +hint.arge.0.msize=0x1000 +hint.arge.0.irq=2 +# hint.arge.0.eeprommac=0x83fe9ff0 +hint.arge.0.phymask=0x10 # PHY 4 +# hint.arge.0.miimode=2 # MII +hint.arge.0.mdio=mdioproxy1 # Hanging off the arswitch MDIO bus + +# arge1: connected to the LAN switch MAC, at 1000BaseTX / GMII. +hint.arge.1.at="nexus0" +hint.arge.1.maddr=0x1A000000 +hint.arge.1.msize=0x1000 +hint.arge.1.irq=3 + +hint.arge.1.phymask=0x0 +# hint.arge.1.miimode=1 # GMII +hint.arge.1.media=1000 # Force to 1000BaseTX/full +hint.arge.1.fduplex=1 + +# +# AR7240 switch config +# +hint.arswitch.0.is_7240=1 # We need to be explicitly told this +hint.arswitch.0.numphys=4 # 4 active switch PHYs (PHY 0 -> 3) +hint.arswitch.0.phy4cpu=1 # Yes, PHY 4 == dedicated PHY +hint.arswitch.0.is_rgmii=0 # No, not RGMII +hint.arswitch.0.is_gmii=0 # No, not GMII + +# ath0 hint - pcie slot 0 +hint.pcib.0.bus.0.0.0.ath_fixup_addr=0x1fff1000 +hint.pcib.0.bus.0.0.0.ath_fixup_size=4096 + +# ehci - note the 0x100 offset for the AR913x/AR724x +hint.ehci.0.at="nexus0" +hint.ehci.0.maddr=0x1b000100 +hint.ehci.0.msize=0x00ffff00 +hint.ehci.0.irq=1 + +# pci +hint.pcib.0.at="nexus0" +hint.pcib.0.irq=0 + +# ath +hint.ath.0.eeprom_firmware="pcib.0.bus.0.0.0.eeprom_firmware" + +# GPIO +hint.gpio.0.at="apb0" +hint.gpio.0.maddr=0x18040000 +hint.gpio.0.msize=0x1000 +hint.gpio.0.irq=2 + +# Signal leds +hint.gpioled.0.at="gpiobus0" +hint.gpioled.0.name="sig1" +hint.gpioled.0.pins=0x0001 # pin 0 +hint.gpioled.1.at="gpiobus0" +hint.gpioled.1.name="sig2" +hint.gpioled.1.pins=0x0002 # pin 1 +hint.gpioled.2.at="gpiobus0" +hint.gpioled.2.name="sig3" +hint.gpioled.2.pins=0x0800 # pin 11 +hint.gpioled.3.at="gpiobus0" +hint.gpioled.3.name="sig4" +hint.gpioled.3.pins=0x0080 # pin 7 + +# SPI controller/bus +hint.spi.0.at="nexus0" +hint.spi.0.maddr=0x1f000000 +hint.spi.0.msize=0x10 + +# SPI flash +hint.mx25l.0.at="spibus0" +hint.mx25l.0.cs=0 + +# Watchdog +hint.ar71xx_wdog.0.at="nexus0" + +# nvram mapping - XXX ? +hint.nvram.0.base=0x1f030000 +hint.nvram.0.maxsize=0x2000 +hint.nvram.0.flags=3 # 1 = No check, 2 = Format Generic +hint.nvram.1.base=0x1f032000 +hint.nvram.1.maxsize=0x4000 +hint.nvram.1.flags=3 # 1 = No check, 2 = Format Generic + +# GEOM_MAP +# +# From my AP93 environment: +# +# 256k - uboot +# 256k - uboot-env +# 3072k - spare-rootfs +# 1024k - spare-uImage +# 3072k - rootfs +# 1024k - uImage +# 64k - mib0 +# 64k - mib1 +# 4096k - ct +# 3392k - var +# 64k - ART + +# To make it useful for FreeBSD for now, treat spare rootfs, spare +# uimage and rootfs as 'rootfs'. + +hint.map.0.at="flash/spi0" +hint.map.0.start=0x00000000 +hint.map.0.end=0x00040000 +hint.map.0.name="uboot" +hint.map.0.readonly=1 + +hint.map.1.at="flash/spi0" +hint.map.1.start=0x00040000 +hint.map.1.end=0x00080000 +hint.map.1.name="uboot-env" +hint.map.1.readonly=1 + +hint.map.2.at="flash/spi0" +hint.map.2.start=0x00080000 +# hint.map.2.end=0x00380000 +hint.map.2.end=0x00780000 +# hint.map.2.name="spare-rootfs" +hint.map.2.name="rootfs" +hint.map.2.readonly=1 + +#hint.map.3.at="flash/spi0" +#hint.map.3.start=0x00380000 +#hint.map.3.end=0x00480000 +#hint.map.3.name="spare-uImage" +#hint.map.3.readonly=1 + +#hint.map.4.at="flash/spi0" +#hint.map.4.start=0x00480000 +#hint.map.4.end=0x00780000 +#hint.map.4.name="rootfs" +#hint.map.4.readonly=1 + +hint.map.3.at="flash/spi0" +hint.map.3.start=0x00780000 +hint.map.3.end=0x00880000 +hint.map.3.name="uImage" +hint.map.3.readonly=1 + +hint.map.4.at="flash/spi0" +hint.map.4.start=0x00880000 +hint.map.4.end=0x00890000 +hint.map.4.name="mib0" +hint.map.4.readonly=1 + +hint.map.5.at="flash/spi0" +hint.map.5.start=0x00890000 +hint.map.5.end=0x008a0000 +hint.map.5.name="mib1" +hint.map.5.readonly=1 + +hint.map.6.at="flash/spi0" +hint.map.6.start=0x008a0000 +hint.map.6.end=0x00ca0000 +hint.map.6.name="ct" +hint.map.6.readonly=1 + +hint.map.7.at="flash/spi0" +hint.map.7.start=0x00ca0000 +hint.map.7.end=0x00ff0000 +hint.map.7.name="var" +hint.map.7.readonly=1 + +hint.map.8.at="flash/spi0" +hint.map.8.start=0x00ff0000 +hint.map.8.end=0x01000000 # 64k ART +hint.map.8.name="ART" +hint.map.8.readonly=1 + diff --git a/sys/mips/conf/AP96 b/sys/mips/conf/AP96 index 8b5fb9f1989..4a0d59ed38c 100644 --- a/sys/mips/conf/AP96 +++ b/sys/mips/conf/AP96 @@ -40,3 +40,10 @@ options ROOTDEVNAME=\"ufs:map/rootfs.uzip\" options AR71XX_ATH_EEPROM # Fetch EEPROM/PCI config from flash options ATH_EEPROM_FIRMWARE # Use EEPROM from flash device firmware # Used by the above + +# Options required for miiproxy and mdiobus +options ARGE_MDIO # Export an MDIO bus separate from arge +device miiproxy # MDIO bus <-> MII PHY rendezvous + +device etherswitch +device arswitch diff --git a/sys/mips/conf/AP96.hints b/sys/mips/conf/AP96.hints index 63ce1baf733..c0778bc98cf 100644 --- a/sys/mips/conf/AP96.hints +++ b/sys/mips/conf/AP96.hints @@ -1,15 +1,29 @@ # $FreeBSD$ -# TODO: RGMII -hint.arge.0.phymask=0x0f -hint.arge.0.media=1000 -hint.arge.0.fduplex=1 +# arge0 MDIO bus - there's no arge1 MDIO bus for AR71xx +hint.argemdio.0.at="nexus0" +hint.argemdio.0.maddr=0x19000000 +hint.argemdio.0.msize=0x1000 +hint.argemdio.0.order=0 +# This creates an automatic mdioproxy0! + + +# The switch automatically probes off of mdio0, and will +# create an mdioproxy1. + +# TODO: RGMII +hint.arge.0.phymask=0x0 # Nothing attached here (XXX?) +hint.arge.0.media=1000 +hint.arge.0.fduplex=1 +hint.arge.0.miimode=3 # RGMII # TODO: RGMII -# TODO: pll_1000 = 0x1f000000 hint.arge.1.phymask=0x10 -# hint.arge.1.media=1000 -# hint.arge.1.fduplex=1 +# hint.arge.1.pll_1000 = 0x1f000000 +# For now, rendezouvs this on the arge0 mdiobus. +# Later, this will rendezvous via the AR8316 switch. +hint.arge.1.miimode=3 # RGMII +hint.arge.1.mdio=mdioproxy1 # off the switch mdiobus # ath0 - slot 17 hint.pcib.0.bus.0.17.0.ath_fixup_addr=0x1fff1000 diff --git a/sys/mips/conf/GXEMUL b/sys/mips/conf/GXEMUL new file mode 100644 index 00000000000..ea5862287cc --- /dev/null +++ b/sys/mips/conf/GXEMUL @@ -0,0 +1,63 @@ +# +# GXEMUL "oldtestmips" sample kernel configuration. +# +# $FreeBSD$ +# + +ident GXEMUL + +machine mips mips64 +cpu CPU_MIPS4KC + +options HZ=100 + +makeoptions ARCH_FLAGS="-march=mips64 -mabi=64" + +makeoptions KERNLOADADDR=0xffffffff80100000 + +include "../gxemul/std.gxemul" + +hints "GXEMUL.hints" #Default places to look for devices. + +makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols + +makeoptions MODULES_OVERRIDE="" + +options DDB +options KDB + +# Make an SMP-capable kernel by default +options SMP # Symmetric MultiProcessor Kernel + +options SCHED_ULE +options INET # InterNETworking +options INET6 # IPv6 communications protocols + +options FFS #Berkeley Fast Filesystem + +# Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver +options INVARIANTS #Enable calls of extra sanity checking +options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS +#options WITNESS #Enable checks to detect deadlocks and cycles +#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed + +options ROOTDEVNAME=\"ufs:gxemul_disk0\" + +device gxemul_cons +device gxemul_disk +device gxemul_ether + +# Pseudo devices. +device loop # Network loopback +device random # Entropy device +device ether # Ethernet support +device tun # Packet tunnel. +device md # Memory "disks" +device gif # IPv6 and IPv4 tunneling +device faith # IPv6-to-IPv4 relaying (translation) + +# The `bpf' device enables the Berkeley Packet Filter. +# Be aware of the administrative consequences of enabling this! +# Note that 'bpf' is required for DHCP. +device bpf # Berkeley packet filter diff --git a/sys/mips/conf/GXEMUL.hints b/sys/mips/conf/GXEMUL.hints new file mode 100644 index 00000000000..e8c0da7a1d7 --- /dev/null +++ b/sys/mips/conf/GXEMUL.hints @@ -0,0 +1 @@ +# $FreeBSD$ diff --git a/sys/mips/conf/OCTEON1 b/sys/mips/conf/OCTEON1 index 0e7493d3965..aa6490bdabe 100644 --- a/sys/mips/conf/OCTEON1 +++ b/sys/mips/conf/OCTEON1 @@ -135,7 +135,7 @@ device da # Direct Access (disks) device sa # Sequential Access (tape etc) device cd # CD device pass # Passthrough device (direct ATA/SCSI access) -device ses # SCSI Environmental Services (and SAF-TE) +device ses # Enclosure Services (SES and SAF-TE) # RAID controllers interfaced to the SCSI subsystem device amr # AMI MegaRAID diff --git a/sys/mips/conf/RSPRO b/sys/mips/conf/RSPRO index 8684f070c41..5374b367ae2 100644 --- a/sys/mips/conf/RSPRO +++ b/sys/mips/conf/RSPRO @@ -21,6 +21,12 @@ options GEOM_PART_BSD options GEOM_PART_MBR options MSDOSFS +# For etherswitch support +options ARGE_MDIO +device miiproxy +device etherswitch +device arswitch + # Boot off of flash options ROOTDEVNAME=\"ufs:redboot/rootfs.uzip\" diff --git a/sys/mips/conf/RSPRO.hints b/sys/mips/conf/RSPRO.hints index 68edb2840e1..3be5d1361ca 100644 --- a/sys/mips/conf/RSPRO.hints +++ b/sys/mips/conf/RSPRO.hints @@ -1,10 +1,27 @@ # $FreeBSD$ -hint.arge.0.phymask=0x10 +# arge0 mdio bus +hint.argemdio.0.at="nexus0" +hint.argemdio.0.maddr=0x19000000 +hint.argemdio.0.msize=0x1000 +hint.argemdio.0.order=0 -hint.arge.1.media=1000 -hint.arge.1.fduplex=1 -hint.arge.1.phymask=0x0e +# arge0: dedicated switch port +hint.arge.0.phymask=0x10 # PHY4 +hint.arge.0.miimode=3 # RGMII +hint.arge.0.mdio=mdioproxy1 # .. off of the switch mdiobus + +# arge1: nail to 1000/full, RGMII - connected to the switch +hint.arge.1.media=1000 # Map to 1000/full +hint.arge.1.fduplex=1 # +hint.arge.1.phymask=0x0 # no directly mapped PHYs +hint.arge.1.miimode=3 # RGMII + +hint.arswitch.0.is_7240=0 +hint.arswitch.0.numphys=4 +hint.arswitch.0.phy4cpu=1 +hint.arswitch.0.is_rgmii=1 +hint.arswitch.0.is_gmii=0 # Don't flip on anything that isn't already enabled. # This includes leaving the SPI CS1/CS2 pins as GPIO pins as they're diff --git a/sys/mips/conf/TP-WN1043ND b/sys/mips/conf/TP-WN1043ND index d81a6f6d872..c05b870626e 100644 --- a/sys/mips/conf/TP-WN1043ND +++ b/sys/mips/conf/TP-WN1043ND @@ -15,6 +15,18 @@ hints "TP-WN1043ND.hints" # Force the board memory - 32mb options AR71XX_REALMEM=32*1024*1024 +# i2c GPIO bus +device gpioiic +device iicbb +device iicbus +device iic + +# ethernet switch device +device etherswitch + +# RTL8366RB support +device rtl8366rb + # read MSDOS formatted disks - USB options MSDOSFS options GEOM_PART_BSD diff --git a/sys/mips/conf/TP-WN1043ND.hints b/sys/mips/conf/TP-WN1043ND.hints index dce3feab9a9..01c5a8f3094 100644 --- a/sys/mips/conf/TP-WN1043ND.hints +++ b/sys/mips/conf/TP-WN1043ND.hints @@ -4,7 +4,8 @@ # $FreeBSD$ # Hard-code the PHY for now, until there's switch phy support. -hint.arge.0.phymask=0x000c +# hint.arge.0.phymask=0x000c +hint.arge.0.phymask=0x0000 hint.arge.0.media=1000 hint.arge.0.fduplex=1 # Where is the MAC address stored in flash for this particular unit. @@ -81,7 +82,7 @@ hint.map.4.readonly=1 # Don't flip on anything that isn't already enabled. # This includes leaving the SPI CS1/CS2 pins as GPIO pins as they're # not used here. -hint.gpio.0.function_set=0x00000000 +hint.gpio.0.function_set=0x00002000 hint.gpio.0.function_clear=0x00000000 # These are the GPIO LEDs and buttons which can be software controlled. @@ -101,9 +102,9 @@ hint.gpio.0.pinmask=0x001c02ae # Pin 20 - "GPIO20" # LEDs are configured separately and driven by the LED device -hint.gpioled.0.at="gpiobus0" -hint.gpioled.0.name="usb" -hint.gpioled.0.pins=0x0002 +#hint.gpioled.0.at="gpiobus0" +#hint.gpioled.0.name="usb" +#hint.gpioled.0.pins=0x0002 hint.gpioled.1.at="gpiobus0" hint.gpioled.1.name="system" @@ -116,3 +117,17 @@ hint.gpioled.2.pins=0x0020 hint.gpioled.3.at="gpiobus0" hint.gpioled.3.name="wlan" hint.gpioled.3.pins=0x0200 + +# GPIO I2C bus +hint.gpioiic.0.at="gpiobus0" +hint.gpioiic.0.pins=0xc0000 +hint.gpioiic.0.scl=1 +hint.gpioiic.0.sda=0 + +# I2C bus +# Don't be strict about I2C protocol - the relaxed semantics are required +# by the realtek switch PHY. +hint.iicbus.0.strict=0 + +# Bit bang bus - override default delay +#hint.iicbb.0.udelay=3 diff --git a/sys/mips/gxemul/files.gxemul b/sys/mips/gxemul/files.gxemul new file mode 100644 index 00000000000..7ad293cb324 --- /dev/null +++ b/sys/mips/gxemul/files.gxemul @@ -0,0 +1,8 @@ +# $FreeBSD$ +dev/gxemul/cons/gxemul_cons.c optional gxemul_cons +mips/gxemul/gxemul_machdep.c standard +mips/mips/intr_machdep.c standard +mips/mips/tick.c standard + +dev/gxemul/disk/gxemul_disk.c optional gxemul_disk +dev/gxemul/ether/if_gx.c optional gxemul_ether diff --git a/sys/mips/gxemul/gxemul_machdep.c b/sys/mips/gxemul/gxemul_machdep.c new file mode 100644 index 00000000000..8996919d3e6 --- /dev/null +++ b/sys/mips/gxemul/gxemul_machdep.c @@ -0,0 +1,238 @@ +/*- + * Copyright (c) 2006 Wojciech A. Koszek + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +__FBSDID("$FreeBSD$"); + +#include "opt_ddb.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifdef SMP +#include +#include +#endif + +#include + +extern int *edata; +extern int *end; + +void +platform_cpu_init() +{ + /* Nothing special */ +} + +static void +mips_init(void) +{ + int i; + + for (i = 0; i < 10; i++) { + phys_avail[i] = 0; + } + + /* phys_avail regions are in bytes */ + phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); + phys_avail[1] = ctob(realmem); + + dump_avail[0] = phys_avail[0]; + dump_avail[1] = phys_avail[1]; + + physmem = realmem; + + init_param1(); + init_param2(physmem); + mips_cpu_init(); + pmap_bootstrap(); + mips_proc0_init(); + mutex_init(); + kdb_init(); +#ifdef KDB + if (boothowto & RB_KDB) + kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); +#endif +} + +/* + * Perform a board-level soft-reset. + * + * XXXRW: Does gxemul have a moral equivalent to board-level reset? + */ +void +platform_reset(void) +{ + + panic("%s: not yet", __func__); +} + +void +platform_start(__register_t a0, __register_t a1, __register_t a2, + __register_t a3) +{ + vm_offset_t kernend; + uint64_t platform_counter_freq; + int argc = a0; + char **argv = (char **)a1; + char **envp = (char **)a2; + int i; + + /* clear the BSS and SBSS segments */ + kernend = (vm_offset_t)&end; + memset(&edata, 0, kernend - (vm_offset_t)(&edata)); + + mips_postboot_fixup(); + + mips_pcpu0_init(); + + /* + * XXXRW: Support for the gxemul real-time clock required in order to + * usefully determine our emulated timer frequency. Go with something + * classic as the default in the mean time. + */ + platform_counter_freq = MIPS_DEFAULT_HZ; + mips_timer_early_init(platform_counter_freq); + + cninit(); + printf("entry: platform_start()\n"); + + bootverbose = 1; + if (bootverbose) { + printf("cmd line: "); + for (i = 0; i < argc; i++) + printf("%s ", argv[i]); + printf("\n"); + + if (envp != NULL) { + printf("envp:\n"); + for (i = 0; envp[i]; i += 2) + printf("\t%s = %s\n", envp[i], envp[i+1]); + } else { + printf("no envp.\n"); + } + } + + realmem = btoc(GXEMUL_MP_DEV_READ(GXEMUL_MP_DEV_MEMORY)); + mips_init(); + + mips_timer_init_params(platform_counter_freq, 0); +} + +#ifdef SMP +void +platform_ipi_send(int cpuid) +{ + GXEMUL_MP_DEV_WRITE(GXEMUL_MP_DEV_IPI_ONE, (1 << 16) | cpuid); +} + +void +platform_ipi_clear(void) +{ + GXEMUL_MP_DEV_WRITE(GXEMUL_MP_DEV_IPI_READ, 0); +} + +int +platform_ipi_intrnum(void) +{ + return (GXEMUL_MP_DEV_IPI_INTERRUPT - 2); +} + +struct cpu_group * +platform_smp_topo(void) +{ + return (smp_topo_none()); +} + +void +platform_init_ap(int cpuid) +{ + int ipi_int_mask, clock_int_mask; + + /* + * Unmask the clock and ipi interrupts. + */ + clock_int_mask = hard_int_mask(5); + ipi_int_mask = hard_int_mask(platform_ipi_intrnum()); + set_intr_mask(ipi_int_mask | clock_int_mask); +} + +void +platform_cpu_mask(cpuset_t *mask) +{ + unsigned i, n; + + n = GXEMUL_MP_DEV_READ(GXEMUL_MP_DEV_NCPUS); + CPU_ZERO(mask); + for (i = 0; i < n; i++) + CPU_SET(i, mask); +} + +int +platform_processor_id(void) +{ + return (GXEMUL_MP_DEV_READ(GXEMUL_MP_DEV_WHOAMI)); +} + +int +platform_start_ap(int cpuid) +{ + GXEMUL_MP_DEV_WRITE(GXEMUL_MP_DEV_STARTADDR, (intptr_t)mpentry); + GXEMUL_MP_DEV_WRITE(GXEMUL_MP_DEV_START, cpuid); + return (0); +} +#endif /* SMP */ diff --git a/sys/mips/gxemul/mpreg.h b/sys/mips/gxemul/mpreg.h new file mode 100644 index 00000000000..e09946d88e1 --- /dev/null +++ b/sys/mips/gxemul/mpreg.h @@ -0,0 +1,55 @@ +/*- + * Copyright (c) 2004-2012 Juli Mallett + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _MIPS_GXEMUL_MPREG_H_ +#define _MIPS_GXEMUL_MPREG_H_ + +#define GXEMUL_MP_DEV_BASE 0x11000000 + +#define GXEMUL_MP_DEV_WHOAMI 0x0000 +#define GXEMUL_MP_DEV_NCPUS 0x0010 +#define GXEMUL_MP_DEV_START 0x0020 +#define GXEMUL_MP_DEV_STARTADDR 0x0030 +#define GXEMUL_MP_DEV_STACK 0x0070 +#define GXEMUL_MP_DEV_RANDOM 0x0080 +#define GXEMUL_MP_DEV_MEMORY 0x0090 +#define GXEMUL_MP_DEV_IPI_ONE 0x00a0 +#define GXEMUL_MP_DEV_IPI_MANY 0x00b0 +#define GXEMUL_MP_DEV_IPI_READ 0x00c0 +#define GXEMUL_MP_DEV_CYCLES 0x00d0 + +#define GXEMUL_MP_DEV_FUNCTION(f) \ + (volatile uint64_t *)MIPS_PHYS_TO_DIRECT_UNCACHED(GXEMUL_MP_DEV_BASE + (f)) +#define GXEMUL_MP_DEV_READ(f) \ + (volatile uint64_t)*GXEMUL_MP_DEV_FUNCTION(f) +#define GXEMUL_MP_DEV_WRITE(f, v) \ + *GXEMUL_MP_DEV_FUNCTION(f) = (v) + +#define GXEMUL_MP_DEV_IPI_INTERRUPT (6) + +#endif /* !_MIPS_GXEMUL_MPREG_H */ diff --git a/sys/mips/gxemul/std.gxemul b/sys/mips/gxemul/std.gxemul new file mode 100644 index 00000000000..7fad324025d --- /dev/null +++ b/sys/mips/gxemul/std.gxemul @@ -0,0 +1,4 @@ +# $FreeBSD$ +files "../gxemul/files.gxemul" + +cpu CPU_MIPS4KC diff --git a/sys/mips/include/_stdint.h b/sys/mips/include/_stdint.h index cf183733b22..510b8eae32c 100644 --- a/sys/mips/include/_stdint.h +++ b/sys/mips/include/_stdint.h @@ -186,12 +186,6 @@ #define SIG_ATOMIC_MIN INT32_MIN #define SIG_ATOMIC_MAX INT32_MAX -#ifndef WCHAR_MIN /* Also possibly defined in */ -/* Limits of wchar_t. */ -#define WCHAR_MIN INT32_MIN -#define WCHAR_MAX INT32_MAX -#endif - /* Limits of wint_t. */ #define WINT_MIN INT32_MIN #define WINT_MAX INT32_MAX diff --git a/sys/mips/include/_types.h b/sys/mips/include/_types.h index a92f7fb2363..ba0ee302aec 100644 --- a/sys/mips/include/_types.h +++ b/sys/mips/include/_types.h @@ -145,6 +145,10 @@ typedef __uint32_t __vm_paddr_t; typedef __int64_t __vm_ooffset_t; typedef __uint64_t __vm_pindex_t; +typedef int __wchar_t; + +#define __WCHAR_MIN __INT_MIN /* min value for a wchar_t */ +#define __WCHAR_MAX __INT_MAX /* max value for a wchar_t */ /* * Unusual type definitions. diff --git a/sys/mips/include/elf.h b/sys/mips/include/elf.h index 1c3d44d20da..be4d024fe5c 100644 --- a/sys/mips/include/elf.h +++ b/sys/mips/include/elf.h @@ -278,6 +278,7 @@ __ElfType(Auxinfo); #define AT_NCPUS 19 /* Number of CPUs. */ #define AT_PAGESIZES 20 /* Pagesizes. */ #define AT_PAGESIZESLEN 21 /* Number of pagesizes. */ +#define AT_TIMEKEEP 22 /* Pointer to timehands. */ #define AT_STACKPROT 23 /* Initial stack protection. */ #define AT_COUNT 24 /* Count of defined aux entry types. */ diff --git a/sys/mips/include/in_cksum.h b/sys/mips/include/in_cksum.h index 37d88e2e1a8..633efa1ff21 100644 --- a/sys/mips/include/in_cksum.h +++ b/sys/mips/include/in_cksum.h @@ -40,6 +40,7 @@ #define in_cksum(m, len) in_cksum_skip(m, len, 0) +#if defined(IPVERSION) && (IPVERSION == 4) /* * It it useful to have an Internet checksum routine which is inlineable * and optimized specifically for the task of computing IP header checksums @@ -66,9 +67,12 @@ in_cksum_update(struct ip *ip) } while(0) #endif +#endif #ifdef _KERNEL +#if defined(IPVERSION) && (IPVERSION == 4) u_int in_cksum_hdr(const struct ip *ip); +#endif u_short in_addword(u_short sum, u_short b); u_short in_pseudo(u_int sum, u_int b, u_int c); u_short in_cksum_skip(struct mbuf *m, int len, int skip); diff --git a/sys/mips/include/pcb.h b/sys/mips/include/pcb.h index 99113396277..52589f54d40 100644 --- a/sys/mips/include/pcb.h +++ b/sys/mips/include/pcb.h @@ -78,7 +78,7 @@ struct pcb extern struct pcb *curpcb; /* the current running pcb */ void makectx(struct trapframe *, struct pcb *); -int savectx(struct pcb *); +int savectx(struct pcb *) __returns_twice; #endif #endif /* !_MACHINE_PCB_H_ */ diff --git a/sys/mips/include/pmap.h b/sys/mips/include/pmap.h index 35d414a211d..fbe8dd34dbb 100644 --- a/sys/mips/include/pmap.h +++ b/sys/mips/include/pmap.h @@ -151,6 +151,7 @@ extern vm_paddr_t dump_avail[PHYS_AVAIL_ENTRIES + 2]; #define pmap_page_get_memattr(m) VM_MEMATTR_DEFAULT #define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list)) +#define pmap_page_is_write_mapped(m) (((m)->aflags & PGA_WRITEABLE) != 0) #define pmap_page_set_memattr(m, ma) (void)0 void pmap_bootstrap(void); diff --git a/sys/mips/include/vdso.h b/sys/mips/include/vdso.h new file mode 100644 index 00000000000..082df1ae52b --- /dev/null +++ b/sys/mips/include/vdso.h @@ -0,0 +1,41 @@ +/*- + * Copyright 2012 Konstantin Belousov . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _MIPS_VDSO_H +#define _MIPS_VDSO_H + +#define VDSO_TIMEHANDS_MD \ + uint32_t th_res[8]; + +#ifdef _KERNEL +#ifdef COMPAT_FREEBSD32 + +#define VDSO_TIMEHANDS_MD32 VDSO_TIMEHANDS_MD + +#endif +#endif +#endif diff --git a/sys/mips/mips/bus_space_generic.c b/sys/mips/mips/bus_space_generic.c index 14f611ffe52..88c5ffe7e69 100644 --- a/sys/mips/mips/bus_space_generic.c +++ b/sys/mips/mips/bus_space_generic.c @@ -99,8 +99,8 @@ static struct bus_space generic_space = { generic_bs_subregion, /* allocation/deallocation */ - NULL, - NULL, + generic_bs_alloc, + generic_bs_free, /* barrier */ generic_bs_barrier, @@ -109,91 +109,91 @@ static struct bus_space generic_space = { generic_bs_r_1, generic_bs_r_2, generic_bs_r_4, - NULL, + generic_bs_r_8, /* read multiple */ generic_bs_rm_1, generic_bs_rm_2, generic_bs_rm_4, - NULL, + generic_bs_rm_8, /* read region */ generic_bs_rr_1, generic_bs_rr_2, generic_bs_rr_4, - NULL, + generic_bs_rr_8, /* write (single) */ generic_bs_w_1, generic_bs_w_2, generic_bs_w_4, - NULL, + generic_bs_w_8, /* write multiple */ generic_bs_wm_1, generic_bs_wm_2, generic_bs_wm_4, - NULL, + generic_bs_wm_8, /* write region */ - NULL, + generic_bs_wr_1, generic_bs_wr_2, generic_bs_wr_4, - NULL, + generic_bs_wr_8, /* set multiple */ - NULL, - NULL, - NULL, - NULL, + generic_bs_sm_1, + generic_bs_sm_2, + generic_bs_sm_4, + generic_bs_sm_8, /* set region */ - NULL, + generic_bs_sr_1, generic_bs_sr_2, generic_bs_sr_4, - NULL, + generic_bs_sr_8, /* copy */ - NULL, + generic_bs_c_1, generic_bs_c_2, - NULL, - NULL, + generic_bs_c_4, + generic_bs_c_8, /* read (single) stream */ generic_bs_r_1, generic_bs_r_2, generic_bs_r_4, - NULL, + generic_bs_r_8, /* read multiple stream */ generic_bs_rm_1, generic_bs_rm_2, generic_bs_rm_4, - NULL, + generic_bs_rm_8, /* read region stream */ generic_bs_rr_1, generic_bs_rr_2, generic_bs_rr_4, - NULL, + generic_bs_rr_8, /* write (single) stream */ generic_bs_w_1, generic_bs_w_2, generic_bs_w_4, - NULL, + generic_bs_w_8, /* write multiple stream */ generic_bs_wm_1, generic_bs_wm_2, generic_bs_wm_4, - NULL, + generic_bs_wm_8, /* write region stream */ - NULL, + generic_bs_wr_1, generic_bs_wr_2, generic_bs_wr_4, - NULL, + generic_bs_wr_8, }; /* Ultra-gross kludge */ @@ -253,6 +253,22 @@ generic_bs_subregion(void *t __unused, bus_space_handle_t handle, return (0); } +int +generic_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend, + bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags, + bus_addr_t *bpap, bus_space_handle_t *bshp) +{ + + panic("%s: not implemented", __func__); +} + +void +generic_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size) +{ + + panic("%s: not implemented", __func__); +} + uint8_t generic_bs_r_1(void *t, bus_space_handle_t handle, bus_size_t offset) @@ -277,6 +293,12 @@ generic_bs_r_4(void *t, bus_space_handle_t handle, return (rd32(handle + offset)); } +uint64_t +generic_bs_r_8(void *t, bus_space_handle_t handle, bus_size_t offset) +{ + + panic("%s: not implemented", __func__); +} void generic_bs_rm_1(void *t, bus_space_handle_t bsh, @@ -307,6 +329,13 @@ generic_bs_rm_4(void *t, bus_space_handle_t bsh, *addr++ = rd32(baddr); } +void +generic_bs_rm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, + uint64_t *addr, size_t count) +{ + + panic("%s: not implemented", __func__); +} /* * Read `count' 1, 2, 4, or 8 byte quantities from bus space @@ -349,6 +378,14 @@ generic_bs_rr_4(void *t, bus_space_handle_t bsh, } } +void +generic_bs_rr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, + uint64_t *addr, size_t count) +{ + + panic("%s: not implemented", __func__); +} + /* * Write the 1, 2, 4, or 8 byte value `value' to bus space * described by tag/handle/offset. @@ -377,6 +414,14 @@ generic_bs_w_4(void *t, bus_space_handle_t bsh, wr32(bsh + offset, value); } +void +generic_bs_w_8(void *t, bus_space_handle_t bsh, bus_size_t offset, + uint64_t value) +{ + + panic("%s: not implemented", __func__); +} + /* * Write `count' 1, 2, 4, or 8 byte quantities from the buffer * provided to bus space described by tag/handle/offset. @@ -411,6 +456,14 @@ generic_bs_wm_4(void *t, bus_space_handle_t bsh, wr32(baddr, *addr++); } +void +generic_bs_wm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, + const uint64_t *addr, size_t count) +{ + + panic("%s: not implemented", __func__); +} + /* * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided * to bus space described by tag/handle starting at `offset'. @@ -451,6 +504,14 @@ generic_bs_wr_4(void *t, bus_space_handle_t bsh, } } +void +generic_bs_wr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, + const uint64_t *addr, size_t count) +{ + + panic("%s: not implemented", __func__); +} + /* * Write the 1, 2, 4, or 8 byte value `val' to bus space described * by tag/handle/offset `count' times. @@ -485,6 +546,14 @@ generic_bs_sm_4(void *t, bus_space_handle_t bsh, wr32(addr, value); } +void +generic_bs_sm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, + uint64_t value, size_t count) +{ + + panic("%s: not implemented", __func__); +} + /* * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described * by tag/handle starting at `offset'. @@ -519,6 +588,14 @@ generic_bs_sr_4(void *t, bus_space_handle_t bsh, wr32(addr, value); } +void +generic_bs_sr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, + uint64_t value, size_t count) +{ + + panic("%s: not implemented", __func__); +} + /* * Copy `count' 1, 2, 4, or 8 byte values from bus space starting * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. @@ -583,6 +660,14 @@ generic_bs_c_4(void *t, bus_space_handle_t bsh1, } } +void +generic_bs_c_8(void *t, bus_space_handle_t bsh1, bus_size_t off1, + bus_space_handle_t bsh2, bus_size_t off2, size_t count) +{ + + panic("%s: not implemented", __func__); +} + void generic_bs_barrier(void *t __unused, bus_space_handle_t bsh __unused, diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c index 5b3888ec578..d00f1a347fb 100644 --- a/sys/mips/mips/pmap.c +++ b/sys/mips/mips/pmap.c @@ -765,6 +765,7 @@ pmap_extract(pmap_t pmap, vm_offset_t va) vm_page_t pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) { + pt_entry_t *ptep; pt_entry_t pte; vm_page_t m; vm_paddr_t pa; @@ -773,8 +774,9 @@ pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) pa = 0; PMAP_LOCK(pmap); retry: - pte = *pmap_pte(pmap, va); - if (pte != 0 && pte_test(&pte, PTE_V) && + ptep = pmap_pte(pmap, va); + if ((ptep != NULL) && ((pte = *ptep) != 0) && + pte_test(&pte, PTE_V) && (pte_test(&pte, PTE_D) || (prot & VM_PROT_WRITE) == 0)) { if (vm_page_pa_tryrelock(pmap, TLBLO_PTE_TO_PA(pte), &pa)) goto retry; diff --git a/sys/mips/nlm/board.c b/sys/mips/nlm/board.c index b4b0439dd37..c6fd59d4921 100644 --- a/sys/mips/nlm/board.c +++ b/sys/mips/nlm/board.c @@ -362,6 +362,8 @@ nlm_print_processor_info(void) revstr = "A2"; break; case 3: revstr = "B0"; break; + case 4: + revstr = "B1"; break; default: revstr = "??"; break; } diff --git a/sys/mips/nlm/dev/net/mdio.c b/sys/mips/nlm/dev/net/mdio.c index 362312fcd6d..ed2abe4b693 100644 --- a/sys/mips/nlm/dev/net/mdio.c +++ b/sys/mips/nlm/dev/net/mdio.c @@ -38,6 +38,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include + /* Internal MDIO READ/WRITE Routines */ int nlm_int_gmac_mdio_read(uint64_t nae_base, int bus, int block, @@ -176,12 +178,7 @@ nlm_gmac_mdio_read(uint64_t nae_base, int bus, int block, int intf_type, int phyaddr, int regidx) { uint32_t mdio_ld_cmd; - uint32_t val; - - val = EXT_G_MDIO_CMD_SP | - (phyaddr << EXT_G_MDIO_PHYADDR_POS) | - (regidx << EXT_G_MDIO_REGADDR_POS) | - EXT_G_MDIO_DIV; + uint32_t ctrlval; mdio_ld_cmd = nlm_read_nae_reg(nae_base, NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL + bus * 4))); @@ -195,14 +192,22 @@ nlm_gmac_mdio_read(uint64_t nae_base, int bus, int block, EXT_G_MDIO_STAT_MBSY); } - nlm_write_nae_reg(nae_base, + ctrlval = EXT_G_MDIO_CMD_SP | + (phyaddr << EXT_G_MDIO_PHYADDR_POS) | + (regidx << EXT_G_MDIO_REGADDR_POS); + if (nlm_is_xlp8xx_ax() || nlm_is_xlp8xx_b0() || nlm_is_xlp3xx_ax()) + ctrlval |= EXT_G_MDIO_DIV; + else + ctrlval |= EXT_G_MDIO_DIV_WITH_HW_DIV64; + + nlm_write_nae_reg(nae_base, NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), - val); + ctrlval); nlm_write_nae_reg(nae_base, NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), - val | (1<<18)); - + ctrlval | (1<<18)); + DELAY(1000); /* poll master busy bit until it is not busy */ while(nlm_read_nae_reg(nae_base, NAE_REG(block, intf_type, (EXT_G0_MDIO_RD_STAT + bus * 4))) & @@ -210,7 +215,7 @@ nlm_gmac_mdio_read(uint64_t nae_base, int bus, int block, nlm_write_nae_reg(nae_base, NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), - val); + ctrlval); /* Read the data back */ return nlm_read_nae_reg(nae_base, @@ -236,11 +241,6 @@ nlm_gmac_mdio_write(uint64_t nae_base, int bus, int block, uint32_t mdio_ld_cmd; uint32_t ctrlval; - ctrlval = EXT_G_MDIO_CMD_SP | - (phyaddr << EXT_G_MDIO_PHYADDR_POS) | - (regidx << EXT_G_MDIO_REGADDR_POS) | - EXT_G_MDIO_DIV; - mdio_ld_cmd = nlm_read_nae_reg(nae_base, NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL + bus * 4))); if (mdio_ld_cmd & EXT_G_MDIO_CMD_LCD) { @@ -258,6 +258,14 @@ nlm_gmac_mdio_write(uint64_t nae_base, int bus, int block, NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL_DATA+bus*4)), val); + ctrlval = EXT_G_MDIO_CMD_SP | + (phyaddr << EXT_G_MDIO_PHYADDR_POS) | + (regidx << EXT_G_MDIO_REGADDR_POS); + if (nlm_is_xlp8xx_ax() || nlm_is_xlp8xx_b0() || nlm_is_xlp3xx_ax()) + ctrlval |= EXT_G_MDIO_DIV; + else + ctrlval |= EXT_G_MDIO_DIV_WITH_HW_DIV64; + nlm_write_nae_reg(nae_base, NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), ctrlval); @@ -265,6 +273,7 @@ nlm_gmac_mdio_write(uint64_t nae_base, int bus, int block, nlm_write_nae_reg(nae_base, NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), ctrlval | EXT_G_MDIO_CMD_LCD); + DELAY(1000); /* poll master busy bit until it is not busy */ while(nlm_read_nae_reg(nae_base, @@ -291,11 +300,17 @@ int nlm_gmac_mdio_reset(uint64_t nae_base, int bus, int block, int intf_type) { + uint32_t ctrlval; + + if (nlm_is_xlp8xx_ax() || nlm_is_xlp8xx_b0() || nlm_is_xlp3xx_ax()) + ctrlval = EXT_G_MDIO_DIV; + else + ctrlval = EXT_G_MDIO_DIV_WITH_HW_DIV64; + nlm_write_nae_reg(nae_base, - NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), - EXT_G_MDIO_MMRST | EXT_G_MDIO_DIV); + NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL + bus * 4)), + EXT_G_MDIO_MMRST | ctrlval); nlm_write_nae_reg(nae_base, - NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL+bus*4)), - EXT_G_MDIO_DIV); + NAE_REG(block, intf_type, (EXT_G0_MDIO_CTRL + bus * 4)), ctrlval); return (0); } diff --git a/sys/mips/nlm/hal/mdio.h b/sys/mips/nlm/hal/mdio.h index 6288391c79b..a1e720b6d65 100644 --- a/sys/mips/nlm/hal/mdio.h +++ b/sys/mips/nlm/hal/mdio.h @@ -81,6 +81,7 @@ #define EXT_G_MDIO_CMD_SC 0x00080000 #define EXT_G_MDIO_MMRST 0x00100000 #define EXT_G_MDIO_DIV 0x0000001E +#define EXT_G_MDIO_DIV_WITH_HW_DIV64 0x00000010 #define EXT_G_MDIO_RD_STAT_MASK 0x0000FFFF #define EXT_G_MDIO_STAT_LFV 0x00010000 diff --git a/sys/mips/nlm/xlp.h b/sys/mips/nlm/xlp.h index 3414aed3b43..832c9519a33 100644 --- a/sys/mips/nlm/xlp.h +++ b/sys/mips/nlm/xlp.h @@ -57,6 +57,7 @@ #define XLP_REVISION_A1 0x01 #define XLP_REVISION_A2 0x02 #define XLP_REVISION_B0 0x03 +#define XLP_REVISION_B1 0x04 #ifndef LOCORE /* @@ -87,6 +88,16 @@ static __inline int nlm_is_xlp3xx(void) return (nlm_processor_id() == CHIP_PROCESSOR_ID_XLP_3XX); } +static __inline int nlm_is_xlp3xx_ax(void) +{ + uint32_t procid = mips_rd_prid(); + int prid = (procid >> 8) & 0xff; + int rev = procid & 0xff; + + return (prid == CHIP_PROCESSOR_ID_XLP_3XX && + rev < XLP_REVISION_B0); +} + static __inline int nlm_is_xlp4xx(void) { int prid = nlm_processor_id(); @@ -116,5 +127,17 @@ static __inline int nlm_is_xlp8xx_ax(void) (rev < XLP_REVISION_B0)); } +static __inline int nlm_is_xlp8xx_b0(void) +{ + uint32_t procid = mips_rd_prid(); + int prid = (procid >> 8) & 0xff; + int rev = procid & 0xff; + + return ((prid == CHIP_PROCESSOR_ID_XLP_8XX || + prid == CHIP_PROCESSOR_ID_XLP_432 || + prid == CHIP_PROCESSOR_ID_XLP_416) && + rev == XLP_REVISION_B0); +} + #endif /* LOCORE */ #endif /* __NLM_XLP_H__ */ diff --git a/sys/mips/nlm/xlp_pci.c b/sys/mips/nlm/xlp_pci.c index bd4fd4c67f2..0610a156f4f 100644 --- a/sys/mips/nlm/xlp_pci.c +++ b/sys/mips/nlm/xlp_pci.c @@ -507,13 +507,13 @@ xlp_pcib_hardware_swap_enable(int node, int link) nlm_write_pci_reg(linkpcibase, PCIE_BYTE_SWAP_MEM_BASE, bar); bar = nlm_read_bridge_reg(bbase, BRIDGE_PCIEMEM_LIMIT0 + link); - nlm_write_pci_reg(linkpcibase, PCIE_BYTE_SWAP_MEM_LIM, bar); + nlm_write_pci_reg(linkpcibase, PCIE_BYTE_SWAP_MEM_LIM, bar | 0xFFF); bar = nlm_read_bridge_reg(bbase, BRIDGE_PCIEIO_BASE0 + link); nlm_write_pci_reg(linkpcibase, PCIE_BYTE_SWAP_IO_BASE, bar); bar = nlm_read_bridge_reg(bbase, BRIDGE_PCIEIO_LIMIT0 + link); - nlm_write_pci_reg(linkpcibase, PCIE_BYTE_SWAP_IO_LIM, bar); + nlm_write_pci_reg(linkpcibase, PCIE_BYTE_SWAP_IO_LIM, bar | 0xFFF); } static int diff --git a/sys/mips/rmi/rootfs_list.txt b/sys/mips/rmi/rootfs_list.txt index 5cfd2e99a0b..989b333bb31 100644 --- a/sys/mips/rmi/rootfs_list.txt +++ b/sys/mips/rmi/rootfs_list.txt @@ -1,3 +1,5 @@ +# $FreeBSD$ +# # This is the list of files that # should be in your rootfs (copy it from # the build world nfsmount dir. When the rge0 @@ -321,7 +323,6 @@ ./etc/ssh/moduli ./etc/ssl ./etc/ssl/openssl.cnf -./etc/auth.conf ./etc/crontab ./etc/devd.conf ./etc/devfs.conf diff --git a/sys/modules/Makefile b/sys/modules/Makefile index 8f4e948dea7..8be3e7f4de4 100644 --- a/sys/modules/Makefile +++ b/sys/modules/Makefile @@ -5,7 +5,8 @@ # Modules that include binary-only blobs of microcode should be selectable by # MK_SOURCELESS_UCODE option (see below). -SUBDIR= ${_3dfx} \ +SUBDIR= \ + ${_3dfx} \ ${_3dfx_linux} \ ${_aac} \ accf_data \ @@ -88,6 +89,7 @@ SUBDIR= ${_3dfx} \ ${_dpms} \ ${_dpt} \ ${_drm} \ + ${_drm2} \ ${_dtrace} \ dummynet \ ${_ed} \ @@ -105,6 +107,7 @@ SUBDIR= ${_3dfx} \ fdc \ fdescfs \ ${_fe} \ + filemon \ firewire \ firmware \ ${_fxp} \ @@ -218,6 +221,8 @@ SUBDIR= ${_3dfx} \ ${_mwlfw} \ mxge \ my \ + ${_nandfs} \ + ${_nandsim} \ ${_ncp} \ ${_ncv} \ ${_ndis} \ @@ -310,6 +315,7 @@ SUBDIR= ${_3dfx} \ ${_ti} \ tl \ tmpfs \ + ${_toecore} \ ${_tpm} \ trm \ ${_twa} \ @@ -385,6 +391,7 @@ _random= random .if (${MK_INET_SUPPORT} != "no" || ${MK_INET6_SUPPORT} != "no") || \ defined(ALL_MODULES) _carp= carp +_toecore= toecore .endif .if ${MK_INET_SUPPORT} != "no" || defined(ALL_MODULES) @@ -400,6 +407,11 @@ _ipdivert= ipdivert _ipfw= ipfw .endif +.if ${MK_NAND} != "no" || defined(ALL_MODULES) +_nandfs= nandfs +_nandsim= nandsim +.endif + .if ${MK_NETGRAPH} != "no" || defined(ALL_MODULES) _netgraph= netgraph .endif @@ -457,6 +469,7 @@ _cyclic= cyclic .endif _dpms= dpms _drm= drm +_drm2= drm2 .if ${MK_CDDL} != "no" || defined(ALL_MODULES) _dtrace= dtrace .endif @@ -628,6 +641,7 @@ _cyclic= cyclic .endif _dpms= dpms _drm= drm +_drm2= drm2 .if ${MK_CDDL} != "no" || defined(ALL_MODULES) _dtrace= dtrace .endif diff --git a/sys/modules/acpi/Makefile b/sys/modules/acpi/Makefile index 9390064811b..04c6dfce79f 100644 --- a/sys/modules/acpi/Makefile +++ b/sys/modules/acpi/Makefile @@ -1,6 +1,6 @@ # $FreeBSD$ -SUBDIR= acpi_asus acpi_fujitsu acpi_hp acpi_ibm \ +SUBDIR= acpi_asus acpi_asus_wmi acpi_fujitsu acpi_hp acpi_ibm \ acpi_panasonic acpi_sony acpi_toshiba acpi_video \ acpi_dock acpi_wmi aibs diff --git a/sys/modules/acpi/acpi_asus_wmi/Makefile b/sys/modules/acpi/acpi_asus_wmi/Makefile new file mode 100644 index 00000000000..a5ff32a22ef --- /dev/null +++ b/sys/modules/acpi/acpi_asus_wmi/Makefile @@ -0,0 +1,9 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../../dev/acpi_support + +KMOD= acpi_asus_wmi +CFLAGS+=-I${.CURDIR}/../../../dev/acpi_support +SRCS= acpi_asus_wmi.c opt_acpi.h acpi_if.h acpi_wmi_if.h device_if.h bus_if.h + +.include diff --git a/sys/modules/aesni/Makefile b/sys/modules/aesni/Makefile index aed56b81d5c..9e25a4684f5 100644 --- a/sys/modules/aesni/Makefile +++ b/sys/modules/aesni/Makefile @@ -4,7 +4,7 @@ KMOD= aesni SRCS= aesni.c aesni_wrap.c -SRCS+= aesencdec_$(MACHINE_CPUARCH).S aeskeys_$(MACHINE_CPUARCH).S +SRCS+= aesencdec_${MACHINE_CPUARCH}.S aeskeys_${MACHINE_CPUARCH}.S SRCS+= device_if.h bus_if.h opt_bus.h cryptodev_if.h .include diff --git a/sys/modules/agp/Makefile b/sys/modules/agp/Makefile index 9e2865730ea..17c8128ce8f 100644 --- a/sys/modules/agp/Makefile +++ b/sys/modules/agp/Makefile @@ -33,4 +33,16 @@ EXPORT_SYMS= agp_find_device \ agp_unbind_memory \ agp_memory_info + +.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64" +EXPORT_SYMS+= intel_gtt_clear_range \ + intel_gtt_insert_pages \ + intel_gtt_get \ + intel_gtt_chipset_flush \ + intel_gtt_unmap_memory \ + intel_gtt_map_memory \ + intel_gtt_insert_sg_entries \ + intel_gtt_get_bridge_device +.endif + .include diff --git a/sys/modules/ath/Makefile b/sys/modules/ath/Makefile index 5cbfeda19d5..44be449e33c 100644 --- a/sys/modules/ath/Makefile +++ b/sys/modules/ath/Makefile @@ -36,7 +36,8 @@ ATH_RATE?= sample # tx rate control algorithm KMOD= if_ath SRCS= if_ath.c if_ath_debug.c if_ath_keycache.c if_ath_sysctl.c -SRCS+= if_ath_tx.c if_ath_tx_ht.c if_ath_led.c +SRCS+= if_ath_tx.c if_ath_tx_ht.c if_ath_led.c if_ath_rx.c if_ath_tdma.c +SRCS+= if_ath_beacon.c if_ath_rx_edma.c # NB: v3 eeprom support used by both AR5211 and AR5212; just include it SRCS+= ah_osdep.c ah.c ah_regdomain.c ah_eeprom_v3.c SRCS+= device_if.h bus_if.h pci_if.h opt_inet.h opt_ath.h opt_ah.h opt_wlan.h diff --git a/sys/modules/bwi/Makefile b/sys/modules/bwi/Makefile index cdd5c9037dd..7daf14076e8 100644 --- a/sys/modules/bwi/Makefile +++ b/sys/modules/bwi/Makefile @@ -5,7 +5,7 @@ KMOD = if_bwi SRCS = if_bwi.c if_bwi_pci.c bwimac.c bwiphy.c bwirf.c -SRCS += device_if.h bus_if.h pci_if.h opt_inet.h opt_bwi.h +SRCS += device_if.h bus_if.h pci_if.h opt_inet.h opt_bwi.h opt_wlan.h opt_bwi.h: echo '#define BWI_DEBUG 1' > opt_bwi.h diff --git a/sys/modules/cam/Makefile b/sys/modules/cam/Makefile index 35b36d84a65..30c03ff550c 100644 --- a/sys/modules/cam/Makefile +++ b/sys/modules/cam/Makefile @@ -14,7 +14,7 @@ SRCS+= opt_scsi.h SRCS+= opt_cd.h SRCS+= opt_pt.h SRCS+= opt_sa.h -SRCS+= opt_ses.h +SRCS+= opt_enc.h SRCS+= device_if.h bus_if.h vnode_if.h SRCS+= cam.c .if exists($S/${MACHINE}/${MACHINE}/cam_machdep.c) @@ -26,7 +26,9 @@ SRCS+= scsi_da.c SRCS+= scsi_pass.c SRCS+= scsi_pt.c SRCS+= scsi_sa.c -SRCS+= scsi_ses.c +SRCS+= scsi_enc.c +SRCS+= scsi_enc_ses.c +SRCS+= scsi_enc_safte.c SRCS+= scsi_sg.c SRCS+= scsi_targ_bh.c scsi_target.c SRCS+= scsi_xpt.c diff --git a/sys/modules/cxgb/Makefile b/sys/modules/cxgb/Makefile index a6af8179daf..325c7050120 100644 --- a/sys/modules/cxgb/Makefile +++ b/sys/modules/cxgb/Makefile @@ -1,39 +1,12 @@ # $FreeBSD$ SUBDIR= cxgb -SUBDIR+= ${_toecore} +SUBDIR+= cxgb_t3fw SUBDIR+= ${_tom} SUBDIR+= ${_iw_cxgb} -SUBDIR+= cxgb_t3fw -.if defined(SYSDIR) -_sysdir = ${SYSDIR} -.endif - -# Based on bsd.kmod.mk but we don't modify SYSDIR in this one. -.for _dir in ${.CURDIR}/../.. ${.CURDIR}/../../.. ${.CURDIR}/../../../.. \ - /sys /usr/src/sys -.if !defined(_sysdir) && exists(${_dir}/kern/) && exists(${_dir}/conf/kmod.mk) -_sysdir = ${_dir} -.endif -.endfor -.if !defined(_sysdir) || !exists(${_sysdir}/kern/) || \ - !exists(${_sysdir}/conf/kmod.mk) -.error "can't find kernel source tree" -.endif - -_toe_header = ${_sysdir}/netinet/toedev.h - -.if exists(${_toe_header}) -_toecore = toecore -#_tom = tom -.endif - -.if ${MACHINE_CPUARCH} == "i386" && exists(${_toe_header}) -_iw_cxgb = iw_cxgb -.endif - -.if ${MACHINE_CPUARCH} == "amd64" && exists(${_toe_header}) -_iw_cxgb = iw_cxgb +.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" +_tom= tom +_iw_cxgb= iw_cxgb .endif .include diff --git a/sys/modules/cxgb/cxgb/Makefile b/sys/modules/cxgb/cxgb/Makefile index 9a433b200bc..8807eced4f2 100644 --- a/sys/modules/cxgb/cxgb/Makefile +++ b/sys/modules/cxgb/cxgb/Makefile @@ -1,16 +1,31 @@ # $FreeBSD$ +.include + CXGB = ${.CURDIR}/../../../dev/cxgb .PATH: ${CXGB} ${CXGB}/common ${CXGB}/sys KMOD= if_cxgb SRCS= cxgb_mc5.c cxgb_vsc8211.c cxgb_ael1002.c cxgb_mv88e1xxx.c SRCS+= cxgb_xgmac.c cxgb_vsc7323.c cxgb_t3_hw.c cxgb_main.c cxgb_aq100x.c -SRCS+= cxgb_sge.c cxgb_offload.c cxgb_tn1010.c +SRCS+= cxgb_sge.c cxgb_tn1010.c SRCS+= device_if.h bus_if.h pci_if.h -SRCS+= opt_inet.h opt_zero.h opt_sched.h +SRCS+= opt_inet.h opt_inet6.h opt_zero.h opt_sched.h SRCS+= uipc_mvec.c CFLAGS+= -g -DDEFAULT_JUMBO -I${CXGB} +.if !defined(KERNBUILDDIR) +.if ${MK_INET_SUPPORT} != "no" +opt_inet.h: + @echo "#define INET 1" > ${.TARGET} + @echo "#define TCP_OFFLOAD 1" >> ${.TARGET} +.endif + +.if ${MK_INET6_SUPPORT} != "no" +opt_inet6.h: + @echo "#define INET6 1" > ${.TARGET} +.endif +.endif + .include diff --git a/sys/modules/cxgb/iw_cxgb/Makefile b/sys/modules/cxgb/iw_cxgb/Makefile index 2cf2ef8ec60..f633bd5c663 100644 --- a/sys/modules/cxgb/iw_cxgb/Makefile +++ b/sys/modules/cxgb/iw_cxgb/Makefile @@ -1,5 +1,7 @@ # $FreeBSD$ +.include + CXGB = ${.CURDIR}/../../../dev/cxgb .PATH: ${CXGB}/ulp/iw_cxgb @@ -8,8 +10,15 @@ SRCS= iw_cxgb.c iw_cxgb_cm.c iw_cxgb_hal.c SRCS+= iw_cxgb_provider.c iw_cxgb_qp.c iw_cxgb_resource.c SRCS+= iw_cxgb_ev.c iw_cxgb_mem.c iw_cxgb_dbg.c iw_cxgb_cq.c SRCS+= bus_if.h device_if.h opt_sched.h pci_if.h pcib_if.h opt_ktr.h -SRCS+= opt_inet.h -CFLAGS+= -g -I${CXGB} -#CFLAGS+= -DDEBUG +SRCS+= opt_inet.h opt_ofed.h vnode_if.h +CFLAGS+= -I${CXGB} -I${.CURDIR}/../../../ofed/include -DLINUX_TYPES_DEFINED + +.if !defined(KERNBUILDDIR) +.if ${MK_INET_SUPPORT} != "no" +opt_inet.h: + echo "#define INET 1" > ${.TARGET} + echo "#define TCP_OFFLOAD 1" >> ${.TARGET} +.endif +.endif .include diff --git a/sys/modules/cxgb/toecore/Makefile b/sys/modules/cxgb/toecore/Makefile deleted file mode 100644 index 43425196a87..00000000000 --- a/sys/modules/cxgb/toecore/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -# $FreeBSD$ - -CXGB = ${.CURDIR}/../../../dev/cxgb -.PATH: ${CXGB}/ulp/toecore - -KMOD= toecore -SRCS= toedev.c -SRCS+= device_if.h bus_if.h pci_if.h opt_sched.h opt_inet.h -CFLAGS+= -g -I${CXGB} - -.include diff --git a/sys/modules/cxgb/tom/Makefile b/sys/modules/cxgb/tom/Makefile index 4c226705e40..8b08fe273e1 100644 --- a/sys/modules/cxgb/tom/Makefile +++ b/sys/modules/cxgb/tom/Makefile @@ -1,15 +1,25 @@ # $FreeBSD$ +.include + CXGB = ${.CURDIR}/../../../dev/cxgb .PATH: ${CXGB}/ulp/tom -KMOD= tom -SRCS= cxgb_tom.c cxgb_cpl_io.c cxgb_listen.c cxgb_tom_sysctl.c cxgb_cpl_socket.c -SRCS+= cxgb_ddp.c cxgb_vm.c cxgb_l2t.c cxgb_tcp_offload.c +KMOD= t3_tom +SRCS= cxgb_tom.c cxgb_cpl_io.c cxgb_listen.c cxgb_l2t.c SRCS+= opt_compat.h opt_inet.h opt_inet6.h opt_ipsec.h SRCS+= opt_tcpdebug.h opt_ddb.h opt_sched.h opt_global.h opt_ktr.h SRCS+= device_if.h bus_if.h pci_if.h CFLAGS+= -g -I${CXGB} #CFLAGS+= -DDEBUG_PRINT -DDEBUG + +.if !defined(KERNBUILDDIR) +.if ${MK_INET_SUPPORT} != "no" +opt_inet.h: + echo "#define INET 1" > ${.TARGET} + echo "#define TCP_OFFLOAD 1" >> ${.TARGET} +.endif +.endif + .include diff --git a/sys/modules/cxgbe/Makefile b/sys/modules/cxgbe/Makefile index 1d69f761422..5ec8dccd3c0 100644 --- a/sys/modules/cxgbe/Makefile +++ b/sys/modules/cxgbe/Makefile @@ -4,5 +4,10 @@ SUBDIR = if_cxgbe SUBDIR+= firmware +SUBDIR+= ${_tom} + +.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" +_tom= tom +.endif .include diff --git a/sys/modules/cxgbe/if_cxgbe/Makefile b/sys/modules/cxgbe/if_cxgbe/Makefile index e4e69e6acb9..701abbef94f 100644 --- a/sys/modules/cxgbe/if_cxgbe/Makefile +++ b/sys/modules/cxgbe/if_cxgbe/Makefile @@ -9,7 +9,7 @@ KMOD = if_cxgbe SRCS = t4_main.c t4_sge.c t4_l2t.c SRCS+= t4_hw.c SRCS+= device_if.h bus_if.h pci_if.h -SRCS+= opt_inet.h +SRCS+= opt_inet.h opt_inet6.h SRCS+= opt_ofed.h CFLAGS+= -I${CXGBE} diff --git a/sys/modules/cxgbe/tom/Makefile b/sys/modules/cxgbe/tom/Makefile new file mode 100644 index 00000000000..647984dd488 --- /dev/null +++ b/sys/modules/cxgbe/tom/Makefile @@ -0,0 +1,15 @@ +# +# $FreeBSD$ +# + +CXGBE = ${.CURDIR}/../../../dev/cxgbe +.PATH: ${CXGBE}/tom + +KMOD = t4_tom +SRCS = t4_tom.c t4_connect.c t4_listen.c t4_cpl_io.c t4_tom_l2t.c +SRCS+= device_if.h bus_if.h pci_if.h +SRCS+= opt_inet.h + +CFLAGS+= -I${CXGBE} + +.include diff --git a/sys/modules/drm2/Makefile b/sys/modules/drm2/Makefile new file mode 100644 index 00000000000..f8411e3df4a --- /dev/null +++ b/sys/modules/drm2/Makefile @@ -0,0 +1,9 @@ +# $FreeBSD$ + +.include + +SUBDIR = \ + drm2 \ + i915kms + +.include diff --git a/sys/modules/drm2/Makefile.inc b/sys/modules/drm2/Makefile.inc new file mode 100644 index 00000000000..265f86d1ed5 --- /dev/null +++ b/sys/modules/drm2/Makefile.inc @@ -0,0 +1,3 @@ +# $FreeBSD$ + +.include "../Makefile.inc" diff --git a/sys/modules/drm2/drm2/Makefile b/sys/modules/drm2/drm2/Makefile new file mode 100644 index 00000000000..e73528b0662 --- /dev/null +++ b/sys/modules/drm2/drm2/Makefile @@ -0,0 +1,39 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../../dev/drm2 +KMOD = drm2 +SRCS = \ + drm_agpsupport.c \ + drm_auth.c \ + drm_bufs.c \ + drm_context.c \ + drm_crtc.c \ + drm_crtc_helper.c \ + drm_dma.c \ + drm_dp_iic_helper.c \ + drm_drawable.c \ + drm_drv.c \ + drm_edid.c \ + drm_fb_helper.c \ + drm_fops.c \ + drm_gem.c \ + drm_gem_names.c \ + drm_hashtab.c \ + drm_ioctl.c \ + drm_irq.c \ + drm_linux_list_sort.c \ + drm_lock.c \ + drm_memory.c \ + drm_mm.c \ + drm_modes.c \ + drm_pci.c \ + drm_scatter.c \ + drm_sman.c \ + drm_stub.c \ + drm_sysctl.c \ + drm_vm.c + +SRCS +=device_if.h bus_if.h pci_if.h device_if.h iicbus_if.h opt_drm.h \ + opt_vm.h + +.include diff --git a/sys/modules/drm2/i915kms/Makefile b/sys/modules/drm2/i915kms/Makefile new file mode 100644 index 00000000000..611d31f7478 --- /dev/null +++ b/sys/modules/drm2/i915kms/Makefile @@ -0,0 +1,34 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../../dev/drm2/i915 +KMOD = i915kms +SRCS = \ + i915_debug.c \ + i915_dma.c \ + i915_drv.c \ + i915_gem.c \ + i915_gem_execbuffer.c \ + i915_gem_evict.c \ + i915_gem_gtt.c \ + i915_gem_tiling.c \ + i915_irq.c \ + i915_suspend.c \ + intel_bios.c \ + intel_crt.c \ + intel_display.c \ + intel_dp.c \ + intel_fb.c \ + intel_hdmi.c \ + intel_iic.c \ + intel_lvds.c \ + intel_modes.c \ + intel_opregion.c \ + intel_overlay.c \ + intel_panel.c \ + intel_ringbuffer.c \ + intel_sdvo.c \ + intel_sprite.c \ + intel_tv.c +SRCS += device_if.h bus_if.h pci_if.h iicbus_if.h iicbb_if.h opt_drm.h + +.include diff --git a/sys/modules/dtrace/Makefile b/sys/modules/dtrace/Makefile index f8f3785651a..02423e93f34 100644 --- a/sys/modules/dtrace/Makefile +++ b/sys/modules/dtrace/Makefile @@ -9,6 +9,7 @@ SUBDIR= dtmalloc \ dtrace \ dtraceall \ dtrace_test \ + dtio \ prototype \ sdt \ systrace diff --git a/sys/modules/dtrace/dtio/Makefile b/sys/modules/dtrace/dtio/Makefile new file mode 100644 index 00000000000..ff68ce456cc --- /dev/null +++ b/sys/modules/dtrace/dtio/Makefile @@ -0,0 +1,13 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../../kern + +KMOD= dtio +SRCS= dtio_kdtrace.c \ + vnode_if.h + +CFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris \ + -I${.CURDIR}/../../../cddl/contrib/opensolaris/uts/common \ + -I${.CURDIR}/../../.. + +.include diff --git a/sys/modules/dtrace/dtraceall/dtraceall.c b/sys/modules/dtrace/dtraceall/dtraceall.c index 61896bf4e80..9d7a23de56b 100644 --- a/sys/modules/dtrace/dtraceall/dtraceall.c +++ b/sys/modules/dtrace/dtraceall/dtraceall.c @@ -65,6 +65,7 @@ MODULE_VERSION(dtraceall, 1); MODULE_DEPEND(dtraceall, cyclic, 1, 1, 1); MODULE_DEPEND(dtraceall, opensolaris, 1, 1, 1); MODULE_DEPEND(dtraceall, dtrace, 1, 1, 1); +MODULE_DEPEND(dtraceall, dtio, 1, 1, 1); MODULE_DEPEND(dtraceall, dtmalloc, 1, 1, 1); MODULE_DEPEND(dtraceall, dtnfscl, 1, 1, 1); MODULE_DEPEND(dtraceall, dtnfsclient, 1, 1, 1); diff --git a/sys/modules/em/Makefile b/sys/modules/em/Makefile index b74ddf101f9..870d48af53d 100644 --- a/sys/modules/em/Makefile +++ b/sys/modules/em/Makefile @@ -9,7 +9,7 @@ CORE_SRC = if_em.c e1000_osdep.c # undefined when using modular driver if not needed LEGACY_SRC += if_lem.c COMMON_SHARED = e1000_api.c e1000_phy.c e1000_nvm.c e1000_mac.c \ - e1000_manage.c e1000_vf.c e1000_mbx.c + e1000_manage.c e1000_vf.c e1000_mbx.c e1000_i210.c PCIE_SHARED = e1000_80003es2lan.c e1000_ich8lan.c e1000_82571.c e1000_82575.c LEGACY_SHARED = e1000_82540.c e1000_82542.c e1000_82541.c e1000_82543.c diff --git a/sys/modules/filemon/Makefile b/sys/modules/filemon/Makefile new file mode 100644 index 00000000000..3bb5351c777 --- /dev/null +++ b/sys/modules/filemon/Makefile @@ -0,0 +1,11 @@ +# $FreeBSD$ + +MAINTAINER= obrien@FreeBSD.org + +.PATH: ${.CURDIR}/../../dev/filemon + +KMOD= filemon +SRCS= ${KMOD}.c +SRCS+= vnode_if.h opt_compat.h opt_capsicum.h + +.include diff --git a/sys/modules/geom/geom_raid/Makefile b/sys/modules/geom/geom_raid/Makefile index 26c3532c0c2..2092a640928 100644 --- a/sys/modules/geom/geom_raid/Makefile +++ b/sys/modules/geom/geom_raid/Makefile @@ -9,7 +9,7 @@ SRCS+= bus_if.h device_if.h SRCS+= g_raid_md_if.h g_raid_md_if.c SRCS+= g_raid_tr_if.h g_raid_tr_if.c -SRCS+= md_intel.c md_jmicron.c md_nvidia.c md_promise.c md_sii.c +SRCS+= md_ddf.c md_intel.c md_jmicron.c md_nvidia.c md_promise.c md_sii.c SRCS+= tr_concat.c tr_raid0.c tr_raid1.c tr_raid1e.c tr_raid5.c diff --git a/sys/modules/igb/Makefile b/sys/modules/igb/Makefile index a66c32a40dc..45b7ec2ed5b 100644 --- a/sys/modules/igb/Makefile +++ b/sys/modules/igb/Makefile @@ -6,7 +6,7 @@ SRCS += if_igb.c $(SHARED_SRCS) SHARED_SRCS = e1000_api.c e1000_phy.c e1000_nvm.c e1000_mac.c e1000_manage.c SHARED_SRCS += e1000_80003es2lan.c e1000_82542.c e1000_82541.c e1000_82543.c SHARED_SRCS += e1000_82540.c e1000_ich8lan.c e1000_82571.c e1000_osdep.c -SHARED_SRCS += e1000_82575.c e1000_vf.c e1000_mbx.c +SHARED_SRCS += e1000_82575.c e1000_vf.c e1000_mbx.c e1000_i210.c CFLAGS += -I${.CURDIR}/../../dev/e1000 -DSMP diff --git a/sys/modules/ixgbe/Makefile b/sys/modules/ixgbe/Makefile index c18821f288c..1bc64a0bcd4 100644 --- a/sys/modules/ixgbe/Makefile +++ b/sys/modules/ixgbe/Makefile @@ -1,11 +1,28 @@ #$FreeBSD$ + +.include + .PATH: ${.CURDIR}/../../dev/ixgbe + KMOD = ixgbe SRCS = device_if.h bus_if.h pci_if.h +SRCS += opt_inet.h opt_inet6.h SRCS += ixgbe.c ixv.c # Shared source SRCS += ixgbe_common.c ixgbe_api.c ixgbe_phy.c ixgbe_mbx.c ixgbe_vf.c SRCS += ixgbe_82599.c ixgbe_82598.c ixgbe_x540.c CFLAGS+= -I${.CURDIR}/../../dev/ixgbe -DSMP -DIXGBE_FDIR +.if !defined(KERNBUILDDIR) +.if ${MK_INET_SUPPORT} != "no" +opt_inet.h: + @echo "#define INET 1" > ${.TARGET} +.endif + +.if ${MK_INET6_SUPPORT} != "no" +opt_inet6.h: + @echo "#define INET6 1" > ${.TARGET} +.endif +.endif + .include diff --git a/sys/modules/linux/Makefile b/sys/modules/linux/Makefile index 891d8a89f40..95f59207c63 100644 --- a/sys/modules/linux/Makefile +++ b/sys/modules/linux/Makefile @@ -13,8 +13,8 @@ SRCS= linux_fork.c linux${SFX}_dummy.c linux_emul.c linux_file.c \ linux${SFX}_machdep.c linux_mib.c linux_misc.c linux_signal.c \ linux_socket.c linux_stats.c linux_sysctl.c linux${SFX}_sysent.c \ linux${SFX}_sysvec.c linux_uid16.c linux_util.c linux_time.c \ - opt_inet6.h opt_compat.h opt_posix.h opt_usb.h vnode_if.h \ - device_if.h bus_if.h assym.s + opt_inet6.h opt_compat.h opt_kdtrace.h opt_posix.h opt_usb.h \ + vnode_if.h device_if.h bus_if.h assym.s # XXX: for assym.s SRCS+= opt_kstack_pages.h opt_nfs.h opt_compat.h opt_hwpmc_hooks.h diff --git a/sys/modules/mwl/Makefile b/sys/modules/mwl/Makefile index 8971eb1b06e..f2c40d79cb5 100644 --- a/sys/modules/mwl/Makefile +++ b/sys/modules/mwl/Makefile @@ -33,7 +33,7 @@ KMOD= if_mwl SRCS= if_mwl.c if_mwl_pci.c mwlhal.c -SRCS+= device_if.h bus_if.h pci_if.h opt_inet.h opt_mwl.h +SRCS+= device_if.h bus_if.h pci_if.h opt_inet.h opt_mwl.h opt_wlan.h opt_mwl.h: echo '#define MWL_DEBUG 1'> $@ diff --git a/sys/modules/nand/Makefile b/sys/modules/nand/Makefile new file mode 100644 index 00000000000..321388bc3c8 --- /dev/null +++ b/sys/modules/nand/Makefile @@ -0,0 +1,13 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../dev/nand + +KMOD = nand +SRCS= nand.c nand_bbt.c nand_cdev.c nand_generic.c nand_geom.c \ + nand_id.c nandbus.c nandbus_if.c nand_if.c nfc_if.c \ + nand_if.h device_if.h bus_if.h nfc_if.h nandbus_if.h + +MFILES= kern/bus_if.m kern/device_if.m dev/nand/nfc_if.m \ + dev/nand/nand_if.m dev/nand/nandbus_if.m + +.include diff --git a/sys/modules/nandfs/Makefile b/sys/modules/nandfs/Makefile new file mode 100644 index 00000000000..3c675391fa3 --- /dev/null +++ b/sys/modules/nandfs/Makefile @@ -0,0 +1,12 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../fs/nandfs + +KMOD= nandfs +SRCS= vnode_if.h \ + bmap.c nandfs_bmap.c nandfs_dir.c nandfs_subr.c nandfs_vfsops.c \ + nandfs_vnops.c nandfs_alloc.c nandfs_cpfile.c nandfs_dat.c \ + nandfs_ifile.c nandfs_segment.c nandfs_sufile.c nandfs_buffer.c \ + nandfs_cleaner.c + +.include diff --git a/sys/modules/nandsim/Makefile b/sys/modules/nandsim/Makefile new file mode 100644 index 00000000000..1dc95014811 --- /dev/null +++ b/sys/modules/nandsim/Makefile @@ -0,0 +1,11 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../dev/nand + +KMOD= nandsim +SRCS= nandsim.c nandsim_chip.c nandsim_swap.c nandsim_ctrl.c nandsim_log.c\ + bus_if.h device_if.h vnode_if.h nfc_if.h nand_if.h +MFILES= kern/bus_if.m kern/device_if.m\ + dev/nand/nfc_if.m dev/nand/nand_if.m + +.include diff --git a/sys/modules/netmap/Makefile b/sys/modules/netmap/Makefile new file mode 100644 index 00000000000..b58bfdb2517 --- /dev/null +++ b/sys/modules/netmap/Makefile @@ -0,0 +1,14 @@ +# $FreeBSD$ +# +# Compile netmap as a module, useful if you want a netmap bridge +# or loadable drivers. + +.PATH: ${.CURDIR}/../../dev/netmap +.PATH.h: ${.CURDIR}/../../net +KMOD = netmap +SRCS = device_if.h bus_if.h opt_netmap.h +SRCS += netmap.c netmap.h netmap_kern.h + +netmap.o: netmap_mem2.c + +.include diff --git a/sys/modules/ral/Makefile b/sys/modules/ral/Makefile index 6a3b269f5bb..cc5d3421dbd 100644 --- a/sys/modules/ral/Makefile +++ b/sys/modules/ral/Makefile @@ -3,7 +3,7 @@ .PATH: ${.CURDIR}/../../dev/ral KMOD= if_ral -SRCS= rt2560.c rt2661.c if_ral_pci.c +SRCS= rt2560.c rt2661.c rt2860.c if_ral_pci.c SRCS+= device_if.h bus_if.h pci_if.h .include diff --git a/sys/modules/rdma/krping/Makefile b/sys/modules/rdma/krping/Makefile index 5e4871b865f..1bbc0e4a7b3 100644 --- a/sys/modules/rdma/krping/Makefile +++ b/sys/modules/rdma/krping/Makefile @@ -5,6 +5,8 @@ RDMA= ${.CURDIR}/../../../contrib/rdma/krping KMOD= krping SRCS= krping.c krping_dev.c getopt.c -SRCS+= bus_if.h device_if.h opt_sched.h pci_if.h pcib_if.h +SRCS+= bus_if.h device_if.h pci_if.h pcib_if.h vnode_if.h +SRCS+= opt_sched.h opt_inet.h opt_inet6.h +CFLAGS+= -I${.CURDIR}/../../../ofed/include .include diff --git a/sys/modules/toecore/Makefile b/sys/modules/toecore/Makefile new file mode 100644 index 00000000000..ab2a857d4de --- /dev/null +++ b/sys/modules/toecore/Makefile @@ -0,0 +1,9 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../netinet + +KMOD= toecore +SRCS= toecore.c +SRCS+= opt_ofed.h opt_inet.h opt_inet6.h + +.include diff --git a/sys/modules/wpi/Makefile b/sys/modules/wpi/Makefile index b6dbbc6bab9..1e2383ff1ab 100644 --- a/sys/modules/wpi/Makefile +++ b/sys/modules/wpi/Makefile @@ -3,6 +3,6 @@ .PATH: ${.CURDIR}/../../dev/wpi KMOD = if_wpi -SRCS = if_wpi.c device_if.h bus_if.h pci_if.h +SRCS = if_wpi.c device_if.h bus_if.h pci_if.h opt_wlan.h .include diff --git a/sys/modules/zfs/Makefile b/sys/modules/zfs/Makefile index 122ce446c8e..002392a570d 100644 --- a/sys/modules/zfs/Makefile +++ b/sys/modules/zfs/Makefile @@ -13,6 +13,7 @@ SRCS+= avl.c .PATH: ${SUNW}/common/nvpair SRCS+= nvpair.c SRCS+= nvpair_alloc_fixed.c +SRCS+= fnvpair.c .PATH: ${.CURDIR}/../../cddl/contrib/opensolaris/common/unicode SRCS+= u8_textprep.c diff --git a/sys/net/bpf.c b/sys/net/bpf.c index 8b387a2dd94..7098cf19f79 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -147,6 +147,7 @@ static int bpf_bpfd_cnt; static void bpf_attachd(struct bpf_d *, struct bpf_if *); static void bpf_detachd(struct bpf_d *); +static void bpf_detachd_locked(struct bpf_d *); static void bpf_freed(struct bpf_d *); static int bpf_movein(struct uio *, int, struct ifnet *, struct mbuf **, struct sockaddr *, int *, struct bpf_insn *); @@ -158,7 +159,7 @@ static void catchpacket(struct bpf_d *, u_char *, u_int, u_int, void (*)(struct bpf_d *, caddr_t, u_int, void *, u_int), struct bintime *); static void reset_d(struct bpf_d *); -static int bpf_setf(struct bpf_d *, struct bpf_program *, u_long cmd); +static int bpf_setf(struct bpf_d *, struct bpf_program *, u_long cmd); static int bpf_getdltlist(struct bpf_d *, struct bpf_dltlist *); static int bpf_setdlt(struct bpf_d *, u_int); static void filt_bpfdetach(struct knote *); @@ -206,6 +207,37 @@ static struct filterops bpfread_filtops = { .f_event = filt_bpfread, }; +eventhandler_tag bpf_ifdetach_cookie = NULL; + +/* + * LOCKING MODEL USED BY BPF: + * Locks: + * 1) global lock (BPF_LOCK). Mutex, used to protect interface addition/removal, + * some global counters and every bpf_if reference. + * 2) Interface lock. Rwlock, used to protect list of BPF descriptors and their filters. + * 3) Descriptor lock. Mutex, used to protect BPF buffers and various structure fields + * used by bpf_mtap code. + * + * Lock order: + * + * Global lock, interface lock, descriptor lock + * + * We have to acquire interface lock before descriptor main lock due to BPF_MTAP[2] + * working model. In many places (like bpf_detachd) we start with BPF descriptor + * (and we need to at least rlock it to get reliable interface pointer). This + * gives us potential LOR. As a result, we use global lock to protect from bpf_if + * change in every such place. + * + * Changing d->bd_bif is protected by 1) global lock, 2) interface lock and + * 3) descriptor main wlock. + * Reading bd_bif can be protected by any of these locks, typically global lock. + * + * Changing read/write BPF filter is protected by the same three locks, + * the same applies for reading. + * + * Sleeping in global lock is not allowed due to bpfdetach() using it. + */ + /* * Wrapper functions for various buffering methods. If the set of buffer * modes expands, we will probably want to introduce a switch data structure @@ -216,7 +248,7 @@ bpf_append_bytes(struct bpf_d *d, caddr_t buf, u_int offset, void *src, u_int len) { - BPFD_WLOCK_ASSERT(d); + BPFD_LOCK_ASSERT(d); switch (d->bd_bufmode) { case BPF_BUFMODE_BUFFER: @@ -236,7 +268,7 @@ bpf_append_mbuf(struct bpf_d *d, caddr_t buf, u_int offset, void *src, u_int len) { - BPFD_WLOCK_ASSERT(d); + BPFD_LOCK_ASSERT(d); switch (d->bd_bufmode) { case BPF_BUFMODE_BUFFER: @@ -258,7 +290,7 @@ static void bpf_buf_reclaimed(struct bpf_d *d) { - BPFD_WLOCK_ASSERT(d); + BPFD_LOCK_ASSERT(d); switch (d->bd_bufmode) { case BPF_BUFMODE_BUFFER: @@ -317,7 +349,7 @@ static void bpf_buffull(struct bpf_d *d) { - BPFD_WLOCK_ASSERT(d); + BPFD_LOCK_ASSERT(d); switch (d->bd_bufmode) { case BPF_BUFMODE_ZBUF: @@ -333,7 +365,7 @@ void bpf_bufheld(struct bpf_d *d) { - BPFD_WLOCK_ASSERT(d); + BPFD_LOCK_ASSERT(d); switch (d->bd_bufmode) { case BPF_BUFMODE_ZBUF: @@ -577,6 +609,18 @@ bad: static void bpf_attachd(struct bpf_d *d, struct bpf_if *bp) { + int op_w; + + BPF_LOCK_ASSERT(); + + /* + * Save sysctl value to protect from sysctl change + * between reads + */ + op_w = V_bpf_optimize_writers; + + if (d->bd_bif != NULL) + bpf_detachd_locked(d); /* * Point d at bp, and add d to the interface's list. * Since there are many applicaiotns using BPF for @@ -584,11 +628,13 @@ bpf_attachd(struct bpf_d *d, struct bpf_if *bp) * we can delay adding d to the list of active listeners until * some filter is configured. */ - d->bd_bif = bp; BPFIF_WLOCK(bp); + BPFD_LOCK(d); - if (V_bpf_optimize_writers != 0) { + d->bd_bif = bp; + + if (op_w != 0) { /* Add to writers-only list */ LIST_INSERT_HEAD(&bp->bif_wlist, d, bd_next); /* @@ -600,16 +646,15 @@ bpf_attachd(struct bpf_d *d, struct bpf_if *bp) } else LIST_INSERT_HEAD(&bp->bif_dlist, d, bd_next); + BPFD_UNLOCK(d); BPFIF_WUNLOCK(bp); - BPF_LOCK(); bpf_bpfd_cnt++; - BPF_UNLOCK(); CTR3(KTR_NET, "%s: bpf_attach called by pid %d, adding to %s list", __func__, d->bd_pid, d->bd_writer ? "writer" : "active"); - if (V_bpf_optimize_writers == 0) + if (op_w == 0) EVENTHANDLER_INVOKE(bpf_track, bp->bif_ifp, bp->bif_dlt, 1); } @@ -622,10 +667,23 @@ bpf_upgraded(struct bpf_d *d) { struct bpf_if *bp; + BPF_LOCK_ASSERT(); + bp = d->bd_bif; + /* + * Filter can be set several times without specifying interface. + * Mark d as reader and exit. + */ + if (bp == NULL) { + BPFD_LOCK(d); + d->bd_writer = 0; + BPFD_UNLOCK(d); + return; + } + BPFIF_WLOCK(bp); - BPFD_WLOCK(d); + BPFD_LOCK(d); /* Remove from writers-only list */ LIST_REMOVE(d, bd_next); @@ -633,7 +691,7 @@ bpf_upgraded(struct bpf_d *d) /* Mark d as reader */ d->bd_writer = 0; - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); BPFIF_WUNLOCK(bp); CTR2(KTR_NET, "%s: upgrade required by pid %d", __func__, d->bd_pid); @@ -646,6 +704,14 @@ bpf_upgraded(struct bpf_d *d) */ static void bpf_detachd(struct bpf_d *d) +{ + BPF_LOCK(); + bpf_detachd_locked(d); + BPF_UNLOCK(); +} + +static void +bpf_detachd_locked(struct bpf_d *d) { int error; struct bpf_if *bp; @@ -655,9 +721,12 @@ bpf_detachd(struct bpf_d *d) BPF_LOCK_ASSERT(); - bp = d->bd_bif; + /* Check if descriptor is attached */ + if ((bp = d->bd_bif) == NULL) + return; + BPFIF_WLOCK(bp); - BPFD_WLOCK(d); + BPFD_LOCK(d); /* Save bd_writer value */ error = d->bd_writer; @@ -669,10 +738,9 @@ bpf_detachd(struct bpf_d *d) ifp = bp->bif_ifp; d->bd_bif = NULL; - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); BPFIF_WUNLOCK(bp); - /* We're already protected by global lock. */ bpf_bpfd_cnt--; /* Call event handler iff d is attached */ @@ -710,16 +778,13 @@ bpf_dtor(void *data) { struct bpf_d *d = data; - BPFD_WLOCK(d); + BPFD_LOCK(d); if (d->bd_state == BPF_WAITING) callout_stop(&d->bd_callout); d->bd_state = BPF_IDLE; - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); funsetown(&d->bd_sigio); - BPF_LOCK(); - if (d->bd_bif) - bpf_detachd(d); - BPF_UNLOCK(); + bpf_detachd(d); #ifdef MAC mac_bpfdesc_destroy(d); #endif /* MAC */ @@ -739,7 +804,7 @@ static int bpfopen(struct cdev *dev, int flags, int fmt, struct thread *td) { struct bpf_d *d; - int error; + int error, size; d = malloc(sizeof(*d), M_BPF, M_WAITOK | M_ZERO); error = devfs_set_cdevpriv(d, bpf_dtor); @@ -762,9 +827,13 @@ bpfopen(struct cdev *dev, int flags, int fmt, struct thread *td) mac_bpfdesc_init(d); mac_bpfdesc_create(td->td_ucred, d); #endif - rw_init(&d->bd_lock, "bpf cdev lock"); - callout_init_rw(&d->bd_callout, &d->bd_lock, 0); - knlist_init_rw_reader(&d->bd_sel.si_note, &d->bd_lock); + mtx_init(&d->bd_lock, devtoname(dev), "bpf cdev lock", MTX_DEF); + callout_init_mtx(&d->bd_callout, &d->bd_lock, 0); + knlist_init_mtx(&d->bd_sel.si_note, &d->bd_lock); + + /* Allocate default buffers */ + size = d->bd_bufsize; + bpf_buffer_ioctl_sblen(d, &size); return (0); } @@ -793,10 +862,10 @@ bpfread(struct cdev *dev, struct uio *uio, int ioflag) non_block = ((ioflag & O_NONBLOCK) != 0); - BPFD_WLOCK(d); + BPFD_LOCK(d); BPF_PID_REFRESH_CUR(d); if (d->bd_bufmode != BPF_BUFMODE_BUFFER) { - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); return (EOPNOTSUPP); } if (d->bd_state == BPF_WAITING) @@ -832,18 +901,18 @@ bpfread(struct cdev *dev, struct uio *uio, int ioflag) * it before using it again. */ if (d->bd_bif == NULL) { - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); return (ENXIO); } if (non_block) { - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); return (EWOULDBLOCK); } - error = rw_sleep(d, &d->bd_lock, PRINET|PCATCH, + error = msleep(d, &d->bd_lock, PRINET|PCATCH, "bpf", d->bd_rtout); if (error == EINTR || error == ERESTART) { - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); return (error); } if (error == EWOULDBLOCK) { @@ -861,7 +930,7 @@ bpfread(struct cdev *dev, struct uio *uio, int ioflag) break; if (d->bd_slen == 0) { - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); return (0); } ROTATE_BUFFERS(d); @@ -871,7 +940,7 @@ bpfread(struct cdev *dev, struct uio *uio, int ioflag) /* * At this point, we know we have something in the hold slot. */ - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); /* * Move data from hold buffer into user space. @@ -884,12 +953,12 @@ bpfread(struct cdev *dev, struct uio *uio, int ioflag) */ error = bpf_uiomove(d, d->bd_hbuf, d->bd_hlen, uio); - BPFD_WLOCK(d); + BPFD_LOCK(d); d->bd_fbuf = d->bd_hbuf; d->bd_hbuf = NULL; d->bd_hlen = 0; bpf_buf_reclaimed(d); - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); return (error); } @@ -901,7 +970,7 @@ static __inline void bpf_wakeup(struct bpf_d *d) { - BPFD_WLOCK_ASSERT(d); + BPFD_LOCK_ASSERT(d); if (d->bd_state == BPF_WAITING) { callout_stop(&d->bd_callout); d->bd_state = BPF_IDLE; @@ -919,7 +988,7 @@ bpf_timed_out(void *arg) { struct bpf_d *d = (struct bpf_d *)arg; - BPFD_WLOCK_ASSERT(d); + BPFD_LOCK_ASSERT(d); if (callout_pending(&d->bd_callout) || !callout_active(&d->bd_callout)) return; @@ -934,7 +1003,7 @@ static int bpf_ready(struct bpf_d *d) { - BPFD_WLOCK_ASSERT(d); + BPFD_LOCK_ASSERT(d); if (!bpf_canfreebuf(d) && d->bd_hlen != 0) return (1); @@ -959,6 +1028,7 @@ bpfwrite(struct cdev *dev, struct uio *uio, int ioflag) BPF_PID_REFRESH_CUR(d); d->bd_wcount++; + /* XXX: locking required */ if (d->bd_bif == NULL) { d->bd_wdcount++; return (ENXIO); @@ -979,6 +1049,7 @@ bpfwrite(struct cdev *dev, struct uio *uio, int ioflag) bzero(&dst, sizeof(dst)); m = NULL; hlen = 0; + /* XXX: bpf_movein() can sleep */ error = bpf_movein(uio, (int)d->bd_bif->bif_dlt, ifp, &m, &dst, &hlen, d->bd_wfilter); if (error) { @@ -1005,11 +1076,11 @@ bpfwrite(struct cdev *dev, struct uio *uio, int ioflag) CURVNET_SET(ifp->if_vnet); #ifdef MAC - BPFD_WLOCK(d); + BPFD_LOCK(d); mac_bpfdesc_create_mbuf(d, m); if (mc != NULL) mac_bpfdesc_create_mbuf(d, mc); - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); #endif error = (*ifp->if_output)(ifp, m, &dst, NULL); @@ -1038,7 +1109,7 @@ static void reset_d(struct bpf_d *d) { - BPFD_WLOCK_ASSERT(d); + BPFD_LOCK_ASSERT(d); if ((d->bd_hbuf != NULL) && (d->bd_bufmode != BPF_BUFMODE_ZBUF || bpf_canfreebuf(d))) { @@ -1105,12 +1176,12 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, /* * Refresh PID associated with this descriptor. */ - BPFD_WLOCK(d); + BPFD_LOCK(d); BPF_PID_REFRESH(d, td); if (d->bd_state == BPF_WAITING) callout_stop(&d->bd_callout); d->bd_state = BPF_IDLE; - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); if (d->bd_locked == 1) { switch (cmd) { @@ -1158,7 +1229,9 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, case BIOCGDLTLIST32: case BIOCGRTIMEOUT32: case BIOCSRTIMEOUT32: + BPFD_LOCK(d); d->bd_compat32 = 1; + BPFD_UNLOCK(d); } #endif @@ -1176,11 +1249,11 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, { int n; - BPFD_WLOCK(d); + BPFD_LOCK(d); n = d->bd_slen; if (d->bd_hbuf) n += d->bd_hlen; - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); *(int *)addr = n; break; @@ -1203,7 +1276,9 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, * Get buffer len [for read()]. */ case BIOCGBLEN: + BPFD_LOCK(d); *(u_int *)addr = d->bd_bufsize; + BPFD_UNLOCK(d); break; /* @@ -1231,9 +1306,9 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, * Flush read packet buffer. */ case BIOCFLUSH: - BPFD_WLOCK(d); + BPFD_LOCK(d); reset_d(d); - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); break; /* @@ -1258,10 +1333,12 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, * Get current data link type. */ case BIOCGDLT: + BPF_LOCK(); if (d->bd_bif == NULL) error = EINVAL; else *(u_int *)addr = d->bd_bif->bif_dlt; + BPF_UNLOCK(); break; /* @@ -1276,6 +1353,7 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, list32 = (struct bpf_dltlist32 *)addr; dltlist.bfl_len = list32->bfl_len; dltlist.bfl_list = PTRIN(list32->bfl_list); + BPF_LOCK(); if (d->bd_bif == NULL) error = EINVAL; else { @@ -1283,31 +1361,37 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, if (error == 0) list32->bfl_len = dltlist.bfl_len; } + BPF_UNLOCK(); break; } #endif case BIOCGDLTLIST: + BPF_LOCK(); if (d->bd_bif == NULL) error = EINVAL; else error = bpf_getdltlist(d, (struct bpf_dltlist *)addr); + BPF_UNLOCK(); break; /* * Set data link type. */ case BIOCSDLT: + BPF_LOCK(); if (d->bd_bif == NULL) error = EINVAL; else error = bpf_setdlt(d, *(u_int *)addr); + BPF_UNLOCK(); break; /* * Get interface name. */ case BIOCGETIF: + BPF_LOCK(); if (d->bd_bif == NULL) error = EINVAL; else { @@ -1317,13 +1401,16 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, strlcpy(ifr->ifr_name, ifp->if_xname, sizeof(ifr->ifr_name)); } + BPF_UNLOCK(); break; /* * Set interface. */ case BIOCSETIF: + BPF_LOCK(); error = bpf_setif(d, (struct ifreq *)addr); + BPF_UNLOCK(); break; /* @@ -1406,7 +1493,9 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, * Set immediate mode. */ case BIOCIMMEDIATE: + BPFD_LOCK(d); d->bd_immediate = *(u_int *)addr; + BPFD_UNLOCK(d); break; case BIOCVERSION: @@ -1422,21 +1511,27 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, * Get "header already complete" flag */ case BIOCGHDRCMPLT: + BPFD_LOCK(d); *(u_int *)addr = d->bd_hdrcmplt; + BPFD_UNLOCK(d); break; /* * Set "header already complete" flag */ case BIOCSHDRCMPLT: + BPFD_LOCK(d); d->bd_hdrcmplt = *(u_int *)addr ? 1 : 0; + BPFD_UNLOCK(d); break; /* * Get packet direction flag */ case BIOCGDIRECTION: + BPFD_LOCK(d); *(u_int *)addr = d->bd_direction; + BPFD_UNLOCK(d); break; /* @@ -1451,7 +1546,9 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, case BPF_D_IN: case BPF_D_INOUT: case BPF_D_OUT: + BPFD_LOCK(d); d->bd_direction = direction; + BPFD_UNLOCK(d); break; default: error = EINVAL; @@ -1463,7 +1560,9 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, * Get packet timestamp format and resolution. */ case BIOCGTSTAMP: + BPFD_LOCK(d); *(u_int *)addr = d->bd_tstamp; + BPFD_UNLOCK(d); break; /* @@ -1482,26 +1581,38 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, break; case BIOCFEEDBACK: + BPFD_LOCK(d); d->bd_feedback = *(u_int *)addr; + BPFD_UNLOCK(d); break; case BIOCLOCK: + BPFD_LOCK(d); d->bd_locked = 1; + BPFD_UNLOCK(d); break; case FIONBIO: /* Non-blocking I/O */ break; case FIOASYNC: /* Send signal on receive packets */ + BPFD_LOCK(d); d->bd_async = *(int *)addr; + BPFD_UNLOCK(d); break; case FIOSETOWN: + /* + * XXX: Add some sort of locking here? + * fsetown() can sleep. + */ error = fsetown(*(int *)addr, &d->bd_sigio); break; case FIOGETOWN: + BPFD_LOCK(d); *(int *)addr = fgetown(&d->bd_sigio); + BPFD_UNLOCK(d); break; /* This is deprecated, FIOSETOWN should be used instead. */ @@ -1522,16 +1633,23 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, if (sig >= NSIG) error = EINVAL; - else + else { + BPFD_LOCK(d); d->bd_sig = sig; + BPFD_UNLOCK(d); + } break; } case BIOCGRSIG: + BPFD_LOCK(d); *(u_int *)addr = d->bd_sig; + BPFD_UNLOCK(d); break; case BIOCGETBUFMODE: + BPFD_LOCK(d); *(u_int *)addr = d->bd_bufmode; + BPFD_UNLOCK(d); break; case BIOCSETBUFMODE: @@ -1556,15 +1674,15 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, return (EINVAL); } - BPFD_WLOCK(d); + BPFD_LOCK(d); if (d->bd_sbuf != NULL || d->bd_hbuf != NULL || d->bd_fbuf != NULL || d->bd_bif != NULL) { - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); CURVNET_RESTORE(); return (EBUSY); } d->bd_bufmode = *(u_int *)addr; - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); break; case BIOCGETZMAX: @@ -1586,123 +1704,130 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, /* * Set d's packet filter program to fp. If this file already has a filter, * free it and replace it. Returns EINVAL for bogus requests. + * + * Note we need global lock here to serialize bpf_setf() and bpf_setif() calls + * since reading d->bd_bif can't be protected by d or interface lock due to + * lock order. + * + * Additionally, we have to acquire interface write lock due to bpf_mtap() uses + * interface read lock to read all filers. + * */ static int bpf_setf(struct bpf_d *d, struct bpf_program *fp, u_long cmd) { - struct bpf_insn *fcode, *old; - u_int wfilter, flen, size; -#ifdef BPF_JITTER - bpf_jit_filter *ofunc; -#endif - int need_upgrade; #ifdef COMPAT_FREEBSD32 - struct bpf_program32 *fp32; struct bpf_program fp_swab; + struct bpf_program32 *fp32; +#endif + struct bpf_insn *fcode, *old; +#ifdef BPF_JITTER + bpf_jit_filter *jfunc, *ofunc; +#endif + size_t size; + u_int flen; + int need_upgrade; - if (cmd == BIOCSETWF32 || cmd == BIOCSETF32 || cmd == BIOCSETFNR32) { +#ifdef COMPAT_FREEBSD32 + switch (cmd) { + case BIOCSETF32: + case BIOCSETWF32: + case BIOCSETFNR32: fp32 = (struct bpf_program32 *)fp; fp_swab.bf_len = fp32->bf_len; fp_swab.bf_insns = (struct bpf_insn *)(uintptr_t)fp32->bf_insns; fp = &fp_swab; - if (cmd == BIOCSETWF32) + switch (cmd) { + case BIOCSETF32: + cmd = BIOCSETF; + break; + case BIOCSETWF32: cmd = BIOCSETWF; + break; + } + break; } #endif + + fcode = NULL; +#ifdef BPF_JITTER + jfunc = ofunc = NULL; +#endif + need_upgrade = 0; + + /* + * Check new filter validness before acquiring any locks. + * Allocate memory for new filter, if needed. + */ + flen = fp->bf_len; + if (flen > bpf_maxinsns || (fp->bf_insns == NULL && flen != 0)) + return (EINVAL); + size = flen * sizeof(*fp->bf_insns); + if (size > 0) { + /* We're setting up new filter. Copy and check actual data. */ + fcode = malloc(size, M_BPF, M_WAITOK); + if (copyin(fp->bf_insns, fcode, size) != 0 || + !bpf_validate(fcode, flen)) { + free(fcode, M_BPF); + return (EINVAL); + } +#ifdef BPF_JITTER + /* Filter is copied inside fcode and is perfectly valid. */ + jfunc = bpf_jitter(fcode, flen); +#endif + } + + BPF_LOCK(); + + /* + * Set up new filter. + * Protect filter change by interface lock. + * Additionally, we are protected by global lock here. + */ + if (d->bd_bif != NULL) + BPFIF_WLOCK(d->bd_bif); + BPFD_LOCK(d); if (cmd == BIOCSETWF) { old = d->bd_wfilter; - wfilter = 1; -#ifdef BPF_JITTER - ofunc = NULL; -#endif + d->bd_wfilter = fcode; } else { - wfilter = 0; old = d->bd_rfilter; + d->bd_rfilter = fcode; #ifdef BPF_JITTER ofunc = d->bd_bfilter; + d->bd_bfilter = jfunc; #endif - } - if (fp->bf_insns == NULL) { - if (fp->bf_len != 0) - return (EINVAL); - /* - * Protect filter change by interface lock, too. - * The same lock order is used by bpf_detachd(). - */ - BPFIF_WLOCK(d->bd_bif); - BPFD_WLOCK(d); - if (wfilter) - d->bd_wfilter = NULL; - else { - d->bd_rfilter = NULL; -#ifdef BPF_JITTER - d->bd_bfilter = NULL; -#endif - if (cmd == BIOCSETF) - reset_d(d); - } - BPFD_WUNLOCK(d); - BPFIF_WUNLOCK(d->bd_bif); - if (old != NULL) - free((caddr_t)old, M_BPF); -#ifdef BPF_JITTER - if (ofunc != NULL) - bpf_destroy_jit_filter(ofunc); -#endif - return (0); - } - flen = fp->bf_len; - if (flen > bpf_maxinsns) - return (EINVAL); - - need_upgrade = 0; - size = flen * sizeof(*fp->bf_insns); - fcode = (struct bpf_insn *)malloc(size, M_BPF, M_WAITOK); - if (copyin((caddr_t)fp->bf_insns, (caddr_t)fcode, size) == 0 && - bpf_validate(fcode, (int)flen)) { - /* - * Protect filter change by interface lock, too - * The same lock order is used by bpf_detachd(). - */ - BPFIF_WLOCK(d->bd_bif); - BPFD_WLOCK(d); - if (wfilter) - d->bd_wfilter = fcode; - else { - d->bd_rfilter = fcode; -#ifdef BPF_JITTER - d->bd_bfilter = bpf_jitter(fcode, flen); -#endif - if (cmd == BIOCSETF) - reset_d(d); + if (cmd == BIOCSETF) + reset_d(d); + if (fcode != NULL) { /* * Do not require upgrade by first BIOCSETF - * (used to set snaplen) by pcap_open_live() + * (used to set snaplen) by pcap_open_live(). */ - if ((d->bd_writer != 0) && (--d->bd_writer == 0)) + if (d->bd_writer != 0 && --d->bd_writer == 0) need_upgrade = 1; CTR4(KTR_NET, "%s: filter function set by pid %d, " "bd_writer counter %d, need_upgrade %d", __func__, d->bd_pid, d->bd_writer, need_upgrade); } - BPFD_WUNLOCK(d); + } + BPFD_UNLOCK(d); + if (d->bd_bif != NULL) BPFIF_WUNLOCK(d->bd_bif); - if (old != NULL) - free((caddr_t)old, M_BPF); + if (old != NULL) + free(old, M_BPF); #ifdef BPF_JITTER - if (ofunc != NULL) - bpf_destroy_jit_filter(ofunc); + if (ofunc != NULL) + bpf_destroy_jit_filter(ofunc); #endif - /* Move d to active readers list */ - if (need_upgrade != 0) - bpf_upgraded(d); + /* Move d to active readers list. */ + if (need_upgrade) + bpf_upgraded(d); - return (0); - } - free((caddr_t)fcode, M_BPF); - return (EINVAL); + BPF_UNLOCK(); + return (0); } /* @@ -1716,28 +1841,30 @@ bpf_setif(struct bpf_d *d, struct ifreq *ifr) struct bpf_if *bp; struct ifnet *theywant; + BPF_LOCK_ASSERT(); + theywant = ifunit(ifr->ifr_name); if (theywant == NULL || theywant->if_bpf == NULL) return (ENXIO); bp = theywant->if_bpf; + /* Check if interface is not being detached from BPF */ + BPFIF_RLOCK(bp); + if (bp->flags & BPFIF_FLAG_DYING) { + BPFIF_RUNLOCK(bp); + return (ENXIO); + } + BPFIF_RUNLOCK(bp); + /* * Behavior here depends on the buffering model. If we're using * kernel memory buffers, then we can allocate them here. If we're * using zero-copy, then the user process must have registered * buffers by the time we get here. If not, return an error. - * - * XXXRW: There are locking issues here with multi-threaded use: what - * if two threads try to set the interface at once? */ switch (d->bd_bufmode) { case BPF_BUFMODE_BUFFER: - if (d->bd_sbuf == NULL) - bpf_buffer_alloc(d); - KASSERT(d->bd_sbuf != NULL, ("bpf_setif: bd_sbuf NULL")); - break; - case BPF_BUFMODE_ZBUF: if (d->bd_sbuf == NULL) return (EINVAL); @@ -1746,18 +1873,11 @@ bpf_setif(struct bpf_d *d, struct ifreq *ifr) default: panic("bpf_setif: bufmode %d", d->bd_bufmode); } - if (bp != d->bd_bif) { - if (d->bd_bif) - /* - * Detach if attached to something else. - */ - bpf_detachd(d); - + if (bp != d->bd_bif) bpf_attachd(d, bp); - } - BPFD_WLOCK(d); + BPFD_LOCK(d); reset_d(d); - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); return (0); } @@ -1781,7 +1901,7 @@ bpfpoll(struct cdev *dev, int events, struct thread *td) * Refresh PID associated with this descriptor. */ revents = events & (POLLOUT | POLLWRNORM); - BPFD_WLOCK(d); + BPFD_LOCK(d); BPF_PID_REFRESH(d, td); if (events & (POLLIN | POLLRDNORM)) { if (bpf_ready(d)) @@ -1796,7 +1916,7 @@ bpfpoll(struct cdev *dev, int events, struct thread *td) } } } - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); return (revents); } @@ -1816,12 +1936,12 @@ bpfkqfilter(struct cdev *dev, struct knote *kn) /* * Refresh PID associated with this descriptor. */ - BPFD_WLOCK(d); + BPFD_LOCK(d); BPF_PID_REFRESH_CUR(d); kn->kn_fop = &bpfread_filtops; kn->kn_hook = d; knlist_add(&d->bd_sel.si_note, kn, 1); - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); return (0); } @@ -1840,7 +1960,7 @@ filt_bpfread(struct knote *kn, long hint) struct bpf_d *d = (struct bpf_d *)kn->kn_hook; int ready; - BPFD_WLOCK_ASSERT(d); + BPFD_LOCK_ASSERT(d); ready = bpf_ready(d); if (ready) { kn->kn_data = d->bd_slen; @@ -1946,7 +2066,7 @@ bpf_tap(struct bpf_if *bp, u_char *pkt, u_int pktlen) /* * Filter matches. Let's to acquire write lock. */ - BPFD_WLOCK(d); + BPFD_LOCK(d); d->bd_fcount++; if (gottime < bpf_ts_quality(d->bd_tstamp)) @@ -1956,7 +2076,7 @@ bpf_tap(struct bpf_if *bp, u_char *pkt, u_int pktlen) #endif catchpacket(d, pkt, pktlen, slen, bpf_append_bytes, &bt); - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); } } BPFIF_RUNLOCK(bp); @@ -2005,7 +2125,7 @@ bpf_mtap(struct bpf_if *bp, struct mbuf *m) #endif slen = bpf_filter(d->bd_rfilter, (u_char *)m, pktlen, 0); if (slen != 0) { - BPFD_WLOCK(d); + BPFD_LOCK(d); d->bd_fcount++; if (gottime < bpf_ts_quality(d->bd_tstamp)) @@ -2015,7 +2135,7 @@ bpf_mtap(struct bpf_if *bp, struct mbuf *m) #endif catchpacket(d, (u_char *)m, pktlen, slen, bpf_append_mbuf, &bt); - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); } } BPFIF_RUNLOCK(bp); @@ -2061,7 +2181,7 @@ bpf_mtap2(struct bpf_if *bp, void *data, u_int dlen, struct mbuf *m) ++d->bd_rcount; slen = bpf_filter(d->bd_rfilter, (u_char *)&mb, pktlen, 0); if (slen != 0) { - BPFD_WLOCK(d); + BPFD_LOCK(d); d->bd_fcount++; if (gottime < bpf_ts_quality(d->bd_tstamp)) @@ -2071,7 +2191,7 @@ bpf_mtap2(struct bpf_if *bp, void *data, u_int dlen, struct mbuf *m) #endif catchpacket(d, (u_char *)&mb, pktlen, slen, bpf_append_mbuf, &bt); - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); } } BPFIF_RUNLOCK(bp); @@ -2166,7 +2286,7 @@ catchpacket(struct bpf_d *d, u_char *pkt, u_int pktlen, u_int snaplen, int do_timestamp; int tstype; - BPFD_WLOCK_ASSERT(d); + BPFD_LOCK_ASSERT(d); /* * Detect whether user space has released a buffer back to us, and if @@ -2313,7 +2433,7 @@ bpf_freed(struct bpf_d *d) } if (d->bd_wfilter != NULL) free((caddr_t)d->bd_wfilter, M_BPF); - rw_destroy(&d->bd_lock); + mtx_destroy(&d->bd_lock); } /* @@ -2361,10 +2481,9 @@ bpfattach2(struct ifnet *ifp, u_int dlt, u_int hdrlen, struct bpf_if **driverp) } /* - * Detach bpf from an interface. This involves detaching each descriptor - * associated with the interface, and leaving bd_bif NULL. Notify each - * descriptor as it's detached so that any sleepers wake up and get - * ENXIO. + * Detach bpf from an interface. This involves detaching each descriptor + * associated with the interface. Notify each descriptor as it's detached + * so that any sleepers wake up and get ENXIO. */ void bpfdetach(struct ifnet *ifp) @@ -2377,31 +2496,45 @@ bpfdetach(struct ifnet *ifp) ndetached = 0; #endif + BPF_LOCK(); /* Find all bpf_if struct's which reference ifp and detach them. */ do { - BPF_LOCK(); LIST_FOREACH(bp, &bpf_iflist, bif_next) { if (ifp == bp->bif_ifp) break; } if (bp != NULL) LIST_REMOVE(bp, bif_next); - BPF_UNLOCK(); if (bp != NULL) { #ifdef INVARIANTS ndetached++; #endif while ((d = LIST_FIRST(&bp->bif_dlist)) != NULL) { - bpf_detachd(d); - BPFD_WLOCK(d); + bpf_detachd_locked(d); + BPFD_LOCK(d); bpf_wakeup(d); - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); } - rw_destroy(&bp->bif_lock); - free(bp, M_BPF); + /* Free writer-only descriptors */ + while ((d = LIST_FIRST(&bp->bif_wlist)) != NULL) { + bpf_detachd_locked(d); + BPFD_LOCK(d); + bpf_wakeup(d); + BPFD_UNLOCK(d); + } + + /* + * Delay freing bp till interface is detached + * and all routes through this interface are removed. + * Mark bp as detached to restrict new consumers. + */ + BPFIF_WLOCK(bp); + bp->flags |= BPFIF_FLAG_DYING; + BPFIF_WUNLOCK(bp); } } while (bp != NULL); + BPF_UNLOCK(); #ifdef INVARIANTS if (ndetached == 0) @@ -2409,6 +2542,37 @@ bpfdetach(struct ifnet *ifp) #endif } +/* + * Interface departure handler. + * Note departure event does not guarantee interface is going down. + */ +static void +bpf_ifdetach(void *arg __unused, struct ifnet *ifp) +{ + struct bpf_if *bp; + + BPF_LOCK(); + if ((bp = ifp->if_bpf) == NULL) { + BPF_UNLOCK(); + return; + } + + /* Check if bpfdetach() was called previously */ + if ((bp->flags & BPFIF_FLAG_DYING) == 0) { + BPF_UNLOCK(); + return; + } + + CTR3(KTR_NET, "%s: freing BPF instance %p for interface %p", + __func__, bp, ifp); + + ifp->if_bpf = NULL; + BPF_UNLOCK(); + + rw_destroy(&bp->bif_lock); + free(bp, M_BPF); +} + /* * Get a list of available data link type of the interface. */ @@ -2419,24 +2583,22 @@ bpf_getdltlist(struct bpf_d *d, struct bpf_dltlist *bfl) struct ifnet *ifp; struct bpf_if *bp; + BPF_LOCK_ASSERT(); + ifp = d->bd_bif->bif_ifp; n = 0; error = 0; - BPF_LOCK(); LIST_FOREACH(bp, &bpf_iflist, bif_next) { if (bp->bif_ifp != ifp) continue; if (bfl->bfl_list != NULL) { - if (n >= bfl->bfl_len) { - BPF_UNLOCK(); + if (n >= bfl->bfl_len) return (ENOMEM); - } error = copyout(&bp->bif_dlt, bfl->bfl_list + n, sizeof(u_int)); } n++; } - BPF_UNLOCK(); bfl->bfl_len = n; return (error); } @@ -2451,22 +2613,23 @@ bpf_setdlt(struct bpf_d *d, u_int dlt) struct ifnet *ifp; struct bpf_if *bp; + BPF_LOCK_ASSERT(); + if (d->bd_bif->bif_dlt == dlt) return (0); ifp = d->bd_bif->bif_ifp; - BPF_LOCK(); + LIST_FOREACH(bp, &bpf_iflist, bif_next) { if (bp->bif_ifp == ifp && bp->bif_dlt == dlt) break; } - BPF_UNLOCK(); + if (bp != NULL) { opromisc = d->bd_promisc; - bpf_detachd(d); bpf_attachd(d, bp); - BPFD_WLOCK(d); + BPFD_LOCK(d); reset_d(d); - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); if (opromisc) { error = ifpromisc(bp->bif_ifp, 1); if (error) @@ -2491,6 +2654,11 @@ bpf_drvinit(void *unused) dev = make_dev(&bpf_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "bpf"); /* For compatibility */ make_dev_alias(dev, "bpf0"); + + /* Register interface departure handler */ + bpf_ifdetach_cookie = EVENTHANDLER_REGISTER( + ifnet_departure_event, bpf_ifdetach, NULL, + EVENTHANDLER_PRI_ANY); } /* @@ -2508,20 +2676,23 @@ bpf_zero_counters(void) LIST_FOREACH(bp, &bpf_iflist, bif_next) { BPFIF_RLOCK(bp); LIST_FOREACH(bd, &bp->bif_dlist, bd_next) { - BPFD_WLOCK(bd); + BPFD_LOCK(bd); bd->bd_rcount = 0; bd->bd_dcount = 0; bd->bd_fcount = 0; bd->bd_wcount = 0; bd->bd_wfcount = 0; bd->bd_zcopy = 0; - BPFD_WUNLOCK(bd); + BPFD_UNLOCK(bd); } BPFIF_RUNLOCK(bp); } BPF_UNLOCK(); } +/* + * Fill filter statistics + */ static void bpfstats_fill_xbpf(struct xbpf_d *d, struct bpf_d *bd) { @@ -2529,6 +2700,7 @@ bpfstats_fill_xbpf(struct xbpf_d *d, struct bpf_d *bd) bzero(d, sizeof(*d)); BPFD_LOCK_ASSERT(bd); d->bd_structsize = sizeof(*d); + /* XXX: reading should be protected by global lock */ d->bd_immediate = bd->bd_immediate; d->bd_promisc = bd->bd_promisc; d->bd_hdrcmplt = bd->bd_hdrcmplt; @@ -2553,6 +2725,9 @@ bpfstats_fill_xbpf(struct xbpf_d *d, struct bpf_d *bd) d->bd_bufmode = bd->bd_bufmode; } +/* + * Handle `netstat -B' stats request + */ static int bpf_stats_sysctl(SYSCTL_HANDLER_ARGS) { @@ -2602,15 +2777,15 @@ bpf_stats_sysctl(SYSCTL_HANDLER_ARGS) /* Send writers-only first */ LIST_FOREACH(bd, &bp->bif_wlist, bd_next) { xbd = &xbdbuf[index++]; - BPFD_RLOCK(bd); + BPFD_LOCK(bd); bpfstats_fill_xbpf(xbd, bd); - BPFD_RUNLOCK(bd); + BPFD_UNLOCK(bd); } LIST_FOREACH(bd, &bp->bif_dlist, bd_next) { xbd = &xbdbuf[index++]; - BPFD_RLOCK(bd); + BPFD_LOCK(bd); bpfstats_fill_xbpf(xbd, bd); - BPFD_RUNLOCK(bd); + BPFD_UNLOCK(bd); } BPFIF_RUNLOCK(bp); } diff --git a/sys/net/bpf.h b/sys/net/bpf.h index 0cd9656e182..a7986be3cec 100644 --- a/sys/net/bpf.h +++ b/sys/net/bpf.h @@ -279,6 +279,24 @@ struct bpf_zbuf_header { */ #define DLT_SYMANTEC_FIREWALL 99 +/* + * Values between 100 and 103 are used in capture file headers as + * link-layer header type LINKTYPE_ values corresponding to DLT_ types + * that differ between platforms; don't use those values for new DLT_ + * new types. + */ + +/* + * Values starting with 104 are used for newly-assigned link-layer + * header type values; for those link-layer header types, the DLT_ + * value returned by pcap_datalink() and passed to pcap_open_dead(), + * and the LINKTYPE_ value that appears in capture files, are the + * same. + * + * DLT_MATCHING_MIN is the lowest such value; DLT_MATCHING_MAX is + * the highest such value. + */ +#define DLT_MATCHING_MIN 104 /* * This value was defined by libpcap 0.5; platforms that have defined @@ -978,8 +996,110 @@ struct bpf_zbuf_header { * Raw IPv4/IPv6; different from DLT_RAW in that the DLT_ value specifies * whether it's v4 or v6. Requested by Darren Reed . */ -#define DLT_IPV4 228 -#define DLT_IPV6 229 +#define DLT_IPV4 228 +#define DLT_IPV6 229 + +/* + * IEEE 802.15.4, exactly as it appears in the spec (no padding, no + * nothing), and with no FCS at the end of the frame; requested by + * Jon Smirl . + */ +#define DLT_IEEE802_15_4_NOFCS 230 + +/* + * Raw D-Bus: + * + * http://www.freedesktop.org/wiki/Software/dbus + * + * messages: + * + * http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-messages + * + * starting with the endianness flag, followed by the message type, etc., + * but without the authentication handshake before the message sequence: + * + * http://dbus.freedesktop.org/doc/dbus-specification.html#auth-protocol + * + * Requested by Martin Vidner . + */ +#define DLT_DBUS 231 + +/* + * Juniper-private data link type, as per request from + * Hannes Gredler . + */ +#define DLT_JUNIPER_VS 232 +#define DLT_JUNIPER_SRX_E2E 233 +#define DLT_JUNIPER_FIBRECHANNEL 234 + +/* + * DVB-CI (DVB Common Interface for communication between a PC Card + * module and a DVB receiver). See + * + * http://www.kaiser.cx/pcap-dvbci.html + * + * for the specification. + * + * Requested by Martin Kaiser . + */ +#define DLT_DVB_CI 235 + +/* + * Variant of 3GPP TS 27.010 multiplexing protocol (similar to, but + * *not* the same as, 27.010). Requested by Hans-Christoph Schemmel + * . + */ +#define DLT_MUX27010 236 + +/* + * STANAG 5066 D_PDUs. Requested by M. Baris Demiray + * . + */ +#define DLT_STANAG_5066_D_PDU 237 + +/* + * Juniper-private data link type, as per request from + * Hannes Gredler . + */ +#define DLT_JUNIPER_ATM_CEMIC 238 + +/* + * NetFilter LOG messages + * (payload of netlink NFNL_SUBSYS_ULOG/NFULNL_MSG_PACKET packets) + * + * Requested by Jakub Zawadzki + */ +#define DLT_NFLOG 239 + +/* + * Hilscher Gesellschaft fuer Systemautomation mbH link-layer type + * for Ethernet packets with a 4-byte pseudo-header and always + * with the payload including the FCS, as supplied by their + * netANALYZER hardware and software. + * + * Requested by Holger P. Frommer + */ +#define DLT_NETANALYZER 240 + +/* + * Hilscher Gesellschaft fuer Systemautomation mbH link-layer type + * for Ethernet packets with a 4-byte pseudo-header and FCS and + * with the Ethernet header preceded by 7 bytes of preamble and + * 1 byte of SFD, as supplied by their netANALYZER hardware and + * software. + * + * Requested by Holger P. Frommer + */ +#define DLT_NETANALYZER_TRANSPARENT 241 + +/* + * IP-over-Infiniband, as specified by RFC 4391. + * + * Requested by Petr Sumbera . + */ +#define DLT_IPOIB 242 + +#define DLT_MATCHING_MAX 242 /* highest value in the "matching" range */ /* * DLT and savefile link type values are split into a class and @@ -1105,6 +1225,7 @@ struct bpf_if { struct ifnet *bif_ifp; /* corresponding interface */ struct rwlock bif_lock; /* interface lock */ LIST_HEAD(, bpf_d) bif_wlist; /* writer-only list */ + int flags; /* Interface flags */ #endif }; diff --git a/sys/net/bpf_buffer.c b/sys/net/bpf_buffer.c index 869e70b385b..64bb982aab2 100644 --- a/sys/net/bpf_buffer.c +++ b/sys/net/bpf_buffer.c @@ -93,21 +93,6 @@ static int bpf_maxbufsize = BPF_MAXBUFSIZE; SYSCTL_INT(_net_bpf, OID_AUTO, maxbufsize, CTLFLAG_RW, &bpf_maxbufsize, 0, "Maximum capture buffer in bytes"); -void -bpf_buffer_alloc(struct bpf_d *d) -{ - - KASSERT(d->bd_fbuf == NULL, ("bpf_buffer_alloc: bd_fbuf != NULL")); - KASSERT(d->bd_sbuf == NULL, ("bpf_buffer_alloc: bd_sbuf != NULL")); - KASSERT(d->bd_hbuf == NULL, ("bpf_buffer_alloc: bd_hbuf != NULL")); - - d->bd_fbuf = (caddr_t)malloc(d->bd_bufsize, M_BPF, M_WAITOK); - d->bd_sbuf = (caddr_t)malloc(d->bd_bufsize, M_BPF, M_WAITOK); - d->bd_hbuf = NULL; - d->bd_slen = 0; - d->bd_hlen = 0; -} - /* * Simple data copy to the current kernel buffer. */ @@ -183,19 +168,43 @@ int bpf_buffer_ioctl_sblen(struct bpf_d *d, u_int *i) { u_int size; + caddr_t fbuf, sbuf; - BPFD_WLOCK(d); - if (d->bd_bif != NULL) { - BPFD_WUNLOCK(d); - return (EINVAL); - } size = *i; if (size > bpf_maxbufsize) *i = size = bpf_maxbufsize; else if (size < BPF_MINBUFSIZE) *i = size = BPF_MINBUFSIZE; + + /* Allocate buffers immediately */ + fbuf = (caddr_t)malloc(size, M_BPF, M_WAITOK); + sbuf = (caddr_t)malloc(size, M_BPF, M_WAITOK); + + BPFD_LOCK(d); + if (d->bd_bif != NULL) { + /* Interface already attached, unable to change buffers */ + BPFD_UNLOCK(d); + free(fbuf, M_BPF); + free(sbuf, M_BPF); + return (EINVAL); + } + + /* Free old buffers if set */ + if (d->bd_fbuf != NULL) + free(d->bd_fbuf, M_BPF); + if (d->bd_sbuf != NULL) + free(d->bd_sbuf, M_BPF); + + /* Fill in new data */ d->bd_bufsize = size; - BPFD_WUNLOCK(d); + d->bd_fbuf = fbuf; + d->bd_sbuf = sbuf; + + d->bd_hbuf = NULL; + d->bd_slen = 0; + d->bd_hlen = 0; + + BPFD_UNLOCK(d); return (0); } diff --git a/sys/net/bpf_buffer.h b/sys/net/bpf_buffer.h index 733137fe162..c1dc1f3a227 100644 --- a/sys/net/bpf_buffer.h +++ b/sys/net/bpf_buffer.h @@ -36,7 +36,6 @@ #error "no user-serviceable parts inside" #endif -void bpf_buffer_alloc(struct bpf_d *d); void bpf_buffer_append_bytes(struct bpf_d *d, caddr_t buf, u_int offset, void *src, u_int len); void bpf_buffer_append_mbuf(struct bpf_d *d, caddr_t buf, u_int offset, diff --git a/sys/net/bpf_zerocopy.c b/sys/net/bpf_zerocopy.c index b060f4d3612..1b326290626 100644 --- a/sys/net/bpf_zerocopy.c +++ b/sys/net/bpf_zerocopy.c @@ -515,14 +515,14 @@ bpf_zerocopy_ioctl_rotzbuf(struct thread *td, struct bpf_d *d, struct zbuf *bzh; bzero(bz, sizeof(*bz)); - BPFD_WLOCK(d); + BPFD_LOCK(d); if (d->bd_hbuf == NULL && d->bd_slen != 0) { ROTATE_BUFFERS(d); bzh = (struct zbuf *)d->bd_hbuf; bz->bz_bufa = (void *)bzh->zb_uaddr; bz->bz_buflen = d->bd_hlen; } - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); return (0); } @@ -570,10 +570,10 @@ bpf_zerocopy_ioctl_setzbuf(struct thread *td, struct bpf_d *d, * We only allow buffers to be installed once, so atomically check * that no buffers are currently installed and install new buffers. */ - BPFD_WLOCK(d); + BPFD_LOCK(d); if (d->bd_hbuf != NULL || d->bd_sbuf != NULL || d->bd_fbuf != NULL || d->bd_bif != NULL) { - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); zbuf_free(zba); zbuf_free(zbb); return (EINVAL); @@ -593,6 +593,6 @@ bpf_zerocopy_ioctl_setzbuf(struct thread *td, struct bpf_d *d, * shared management region. */ d->bd_bufsize = bz->bz_buflen - sizeof(struct bpf_zbuf_header); - BPFD_WUNLOCK(d); + BPFD_UNLOCK(d); return (0); } diff --git a/sys/net/bpfdesc.h b/sys/net/bpfdesc.h index f01a0e16dcd..6d58cc37e62 100644 --- a/sys/net/bpfdesc.h +++ b/sys/net/bpfdesc.h @@ -88,7 +88,7 @@ struct bpf_d { int bd_sig; /* signal to send upon packet reception */ struct sigio * bd_sigio; /* information for async I/O */ struct selinfo bd_sel; /* bsd select info */ - struct rwlock bd_lock; /* per-descriptor lock */ + struct mtx bd_lock; /* per-descriptor lock */ struct callout bd_callout; /* for BPF timeouts with select */ struct label *bd_label; /* MAC label for descriptor */ u_int64_t bd_fcount; /* number of packets which matched filter */ @@ -107,12 +107,9 @@ struct bpf_d { #define BPF_WAITING 1 /* waiting for read timeout in select */ #define BPF_TIMED_OUT 2 /* read timeout has expired in select */ -#define BPFD_RLOCK(bd) rw_rlock(&(bd)->bd_lock) -#define BPFD_RUNLOCK(bd) rw_runlock(&(bd)->bd_lock) -#define BPFD_WLOCK(bd) rw_wlock(&(bd)->bd_lock) -#define BPFD_WUNLOCK(bd) rw_wunlock(&(bd)->bd_lock) -#define BPFD_WLOCK_ASSERT(bd) rw_assert(&(bd)->bd_lock, RA_WLOCKED) -#define BPFD_LOCK_ASSERT(bd) rw_assert(&(bd)->bd_lock, RA_LOCKED) +#define BPFD_LOCK(bd) mtx_lock(&(bd)->bd_lock) +#define BPFD_UNLOCK(bd) mtx_unlock(&(bd)->bd_lock) +#define BPFD_LOCK_ASSERT(bd) mtx_assert(&(bd)->bd_lock, MA_OWNED) #define BPF_PID_REFRESH(bd, td) (bd)->bd_pid = (td)->td_proc->p_pid #define BPF_PID_REFRESH_CUR(bd) (bd)->bd_pid = curthread->td_proc->p_pid @@ -159,4 +156,6 @@ struct xbpf_d { #define BPFIF_WLOCK(bif) rw_wlock(&(bif)->bif_lock) #define BPFIF_WUNLOCK(bif) rw_wunlock(&(bif)->bif_lock) +#define BPFIF_FLAG_DYING 1 /* Reject new bpf consumers */ + #endif diff --git a/sys/net/flowtable.c b/sys/net/flowtable.c index 8501b1875d8..0e50377d994 100644 --- a/sys/net/flowtable.c +++ b/sys/net/flowtable.c @@ -619,6 +619,7 @@ flow_to_route(struct flentry *fle, struct route *ro) sin->sin_addr.s_addr = hashkey[2]; ro->ro_rt = __DEVOLATILE(struct rtentry *, fle->f_rt); ro->ro_lle = __DEVOLATILE(struct llentry *, fle->f_lle); + ro->ro_flags |= RT_NORTREF; } #endif /* INET */ @@ -826,7 +827,7 @@ flow_to_route_in6(struct flentry *fle, struct route_in6 *ro) memcpy(&sin6->sin6_addr, &hashkey[5], sizeof (struct in6_addr)); ro->ro_rt = __DEVOLATILE(struct rtentry *, fle->f_rt); ro->ro_lle = __DEVOLATILE(struct llentry *, fle->f_lle); - + ro->ro_flags |= RT_NORTREF; } #endif /* INET6 */ diff --git a/sys/net/ieee8023ad_lacp.c b/sys/net/ieee8023ad_lacp.c index 137e27313c3..b2a6a7daf15 100644 --- a/sys/net/ieee8023ad_lacp.c +++ b/sys/net/ieee8023ad_lacp.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include /* hz */ #include /* for net/if.h */ #include +#include #include #include #include @@ -168,7 +169,8 @@ static void lacp_enable_distributing(struct lacp_port *); static int lacp_xmit_lacpdu(struct lacp_port *); static int lacp_xmit_marker(struct lacp_port *); -#if defined(LACP_DEBUG) +/* Debugging */ + static void lacp_dump_lacpdu(const struct lacpdu *); static const char *lacp_format_partner(const struct lacp_peerinfo *, char *, size_t); @@ -184,10 +186,14 @@ static const char *lacp_format_portid(const struct lacp_portid *, char *, size_t); static void lacp_dprintf(const struct lacp_port *, const char *, ...) __attribute__((__format__(__printf__, 2, 3))); -#define LACP_DPRINTF(a) lacp_dprintf a -#else -#define LACP_DPRINTF(a) /* nothing */ -#endif + +static int lacp_debug = 0; +SYSCTL_INT(_net, OID_AUTO, lacp_debug, CTLFLAG_RW | CTLFLAG_TUN, + &lacp_debug, 0, "Enable LACP debug logging (1=debug, 2=trace)"); +TUNABLE_INT("net.lacp_debug", &lacp_debug); + +#define LACP_DPRINTF(a) if (lacp_debug > 0) { lacp_dprintf a ; } +#define LACP_TRACE(a) if (lacp_debug > 1) { lacp_dprintf(a,"%s\n",__func__); } /* * partner administration variables. @@ -290,10 +296,10 @@ lacp_pdu_input(struct lacp_port *lp, struct mbuf *m) goto bad; } -#if defined(LACP_DEBUG) - LACP_DPRINTF((lp, "lacpdu receive\n")); - lacp_dump_lacpdu(du); -#endif /* defined(LACP_DEBUG) */ + if (lacp_debug > 0) { + lacp_dprintf(lp, "lacpdu receive\n"); + lacp_dump_lacpdu(du); + } LACP_LOCK(lsc); lacp_sm_rx(lp, du); @@ -370,10 +376,10 @@ lacp_xmit_lacpdu(struct lacp_port *lp) sizeof(du->ldu_collector)); du->ldu_collector.lci_maxdelay = 0; -#if defined(LACP_DEBUG) - LACP_DPRINTF((lp, "lacpdu transmit\n")); - lacp_dump_lacpdu(du); -#endif /* defined(LACP_DEBUG) */ + if (lacp_debug > 0) { + lacp_dprintf(lp, "lacpdu transmit\n"); + lacp_dump_lacpdu(du); + } m->m_flags |= M_MCAST; @@ -647,9 +653,7 @@ lacp_disable_distributing(struct lacp_port *lp) { struct lacp_aggregator *la = lp->lp_aggregator; struct lacp_softc *lsc = lp->lp_lsc; -#if defined(LACP_DEBUG) char buf[LACP_LAGIDSTR_MAX+1]; -#endif /* defined(LACP_DEBUG) */ LACP_LOCK_ASSERT(lsc); @@ -684,9 +688,7 @@ lacp_enable_distributing(struct lacp_port *lp) { struct lacp_aggregator *la = lp->lp_aggregator; struct lacp_softc *lsc = lp->lp_lsc; -#if defined(LACP_DEBUG) char buf[LACP_LAGIDSTR_MAX+1]; -#endif /* defined(LACP_DEBUG) */ LACP_LOCK_ASSERT(lsc); @@ -720,7 +722,8 @@ lacp_transit_expire(void *vp) LACP_LOCK_ASSERT(lsc); - LACP_DPRINTF((NULL, "%s\n", __func__)); + LACP_TRACE(NULL); + lsc->lsc_suppress_distributing = FALSE; } @@ -838,7 +841,8 @@ lacp_suppress_distributing(struct lacp_softc *lsc, struct lacp_aggregator *la) return; } - LACP_DPRINTF((NULL, "%s\n", __func__)); + LACP_TRACE(NULL); + lsc->lsc_suppress_distributing = TRUE; /* send a marker frame down each port to verify the queues are empty */ @@ -908,11 +912,9 @@ lacp_select_active_aggregator(struct lacp_softc *lsc) struct lacp_aggregator *la; struct lacp_aggregator *best_la = NULL; uint64_t best_speed = 0; -#if defined(LACP_DEBUG) char buf[LACP_LAGIDSTR_MAX+1]; -#endif /* defined(LACP_DEBUG) */ - LACP_DPRINTF((NULL, "%s:\n", __func__)); + LACP_TRACE(NULL); TAILQ_FOREACH(la, &lsc->lsc_aggregators, la_q) { uint64_t speed; @@ -946,7 +948,6 @@ lacp_select_active_aggregator(struct lacp_softc *lsc) KASSERT(best_la == NULL || !TAILQ_EMPTY(&best_la->la_ports), ("invalid aggregator list")); -#if defined(LACP_DEBUG) if (lsc->lsc_active_aggregator != best_la) { LACP_DPRINTF((NULL, "active aggregator changed\n")); LACP_DPRINTF((NULL, "old %s\n", @@ -957,7 +958,6 @@ lacp_select_active_aggregator(struct lacp_softc *lsc) } LACP_DPRINTF((NULL, "new %s\n", lacp_format_lagid_aggregator(best_la, buf, sizeof(buf)))); -#endif /* defined(LACP_DEBUG) */ if (lsc->lsc_active_aggregator != best_la) { sc->sc_ifp->if_baudrate = best_speed; @@ -1040,9 +1040,7 @@ lacp_compose_key(struct lacp_port *lp) static void lacp_aggregator_addref(struct lacp_softc *lsc, struct lacp_aggregator *la) { -#if defined(LACP_DEBUG) char buf[LACP_LAGIDSTR_MAX+1]; -#endif LACP_DPRINTF((NULL, "%s: lagid=%s, refcnt %d -> %d\n", __func__, @@ -1058,9 +1056,7 @@ lacp_aggregator_addref(struct lacp_softc *lsc, struct lacp_aggregator *la) static void lacp_aggregator_delref(struct lacp_softc *lsc, struct lacp_aggregator *la) { -#if defined(LACP_DEBUG) char buf[LACP_LAGIDSTR_MAX+1]; -#endif LACP_DPRINTF((NULL, "%s: lagid=%s, refcnt %d -> %d\n", __func__, @@ -1195,9 +1191,7 @@ lacp_select(struct lacp_port *lp) { struct lacp_softc *lsc = lp->lp_lsc; struct lacp_aggregator *la; -#if defined(LACP_DEBUG) char buf[LACP_LAGIDSTR_MAX+1]; -#endif if (lp->lp_aggregator) { return; @@ -1278,7 +1272,8 @@ lacp_sm_mux(struct lacp_port *lp) enum lacp_selected selected = lp->lp_selected; struct lacp_aggregator *la; - /* LACP_DPRINTF((lp, "%s: state %d\n", __func__, lp->lp_mux_state)); */ + if (lacp_debug > 1) + lacp_dprintf(lp, "%s: state %d\n", __func__, lp->lp_mux_state); re_eval: la = lp->lp_aggregator; @@ -1387,9 +1382,7 @@ static void lacp_sm_mux_timer(struct lacp_port *lp) { struct lacp_aggregator *la = lp->lp_aggregator; -#if defined(LACP_DEBUG) char buf[LACP_LAGIDSTR_MAX+1]; -#endif KASSERT(la->la_pending > 0, ("no pending event")); @@ -1537,11 +1530,9 @@ lacp_sm_rx_record_pdu(struct lacp_port *lp, const struct lacpdu *du) { boolean_t active; uint8_t oldpstate; -#if defined(LACP_DEBUG) char buf[LACP_STATESTR_MAX+1]; -#endif - /* LACP_DPRINTF((lp, "%s\n", __func__)); */ + LACP_TRACE(lp); oldpstate = lp->lp_partner.lip_state; @@ -1576,7 +1567,8 @@ lacp_sm_rx_record_pdu(struct lacp_port *lp, const struct lacpdu *du) static void lacp_sm_rx_update_ntt(struct lacp_port *lp, const struct lacpdu *du) { - /* LACP_DPRINTF((lp, "%s\n", __func__)); */ + + LACP_TRACE(lp); if (lacp_compare_peerinfo(&lp->lp_actor, &du->ldu_partner) || !LACP_STATE_EQ(lp->lp_state, du->ldu_partner.lip_state, @@ -1591,7 +1583,7 @@ lacp_sm_rx_record_default(struct lacp_port *lp) { uint8_t oldpstate; - /* LACP_DPRINTF((lp, "%s\n", __func__)); */ + LACP_TRACE(lp); oldpstate = lp->lp_partner.lip_state; lp->lp_partner = lacp_partner_admin; @@ -1603,7 +1595,8 @@ static void lacp_sm_rx_update_selected_from_peerinfo(struct lacp_port *lp, const struct lacp_peerinfo *info) { - /* LACP_DPRINTF((lp, "%s\n", __func__)); */ + + LACP_TRACE(lp); if (lacp_compare_peerinfo(&lp->lp_partner, info) || !LACP_STATE_EQ(lp->lp_partner.lip_state, info->lip_state, @@ -1616,7 +1609,8 @@ lacp_sm_rx_update_selected_from_peerinfo(struct lacp_port *lp, static void lacp_sm_rx_update_selected(struct lacp_port *lp, const struct lacpdu *du) { - /* LACP_DPRINTF((lp, "%s\n", __func__)); */ + + LACP_TRACE(lp); lacp_sm_rx_update_selected_from_peerinfo(lp, &du->ldu_actor); } @@ -1624,7 +1618,8 @@ lacp_sm_rx_update_selected(struct lacp_port *lp, const struct lacpdu *du) static void lacp_sm_rx_update_default_selected(struct lacp_port *lp) { - /* LACP_DPRINTF((lp, "%s\n", __func__)); */ + + LACP_TRACE(lp); lacp_sm_rx_update_selected_from_peerinfo(lp, &lacp_partner_admin); } @@ -1812,7 +1807,7 @@ tlv_check(const void *p, size_t size, const struct tlvhdr *tlv, return (0); } -#if defined(LACP_DEBUG) +/* Debugging */ const char * lacp_format_mac(const uint8_t *mac, char *buf, size_t buflen) { @@ -1942,4 +1937,3 @@ lacp_dprintf(const struct lacp_port *lp, const char *fmt, ...) vprintf(fmt, va); va_end(va); } -#endif diff --git a/sys/net/if.h b/sys/net/if.h index 47292cb2998..d420d26a5ca 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -153,7 +153,6 @@ struct if_data { #define IFF_STATICARP 0x80000 /* (n) static ARP */ #define IFF_DYING 0x200000 /* (n) interface is winding down */ #define IFF_RENAMING 0x400000 /* (n) interface is being renamed */ - /* * Old names for driver flags so that user space tools can continue to use * the old (portable) names. @@ -230,6 +229,10 @@ struct if_data { #define IFCAP_VLAN_HWTSO 0x40000 /* can do IFCAP_TSO on VLANs */ #define IFCAP_LINKSTATE 0x80000 /* the runtime link state is dynamic */ #define IFCAP_NETMAP 0x100000 /* netmap mode supported/enabled */ +#define IFCAP_RXCSUM_IPV6 0x200000 /* can offload checksum on IPv6 RX */ +#define IFCAP_TXCSUM_IPV6 0x400000 /* can offload checksum on IPv6 TX */ + +#define IFCAP_HWCSUM_IPV6 (IFCAP_RXCSUM_IPV6 | IFCAP_TXCSUM_IPV6) #define IFCAP_HWCSUM (IFCAP_RXCSUM | IFCAP_TXCSUM) #define IFCAP_TSO (IFCAP_TSO4 | IFCAP_TSO6) diff --git a/sys/net/if_bridge.c b/sys/net/if_bridge.c index 271ef307228..7f44bc261e0 100644 --- a/sys/net/if_bridge.c +++ b/sys/net/if_bridge.c @@ -334,6 +334,7 @@ static int bridge_ip6_checkbasic(struct mbuf **mp); static int bridge_fragment(struct ifnet *, struct mbuf *, struct ether_header *, int, struct llc *); static void bridge_linkstate(struct ifnet *ifp); +static void bridge_linkcheck(struct bridge_softc *sc); extern void (*bridge_linkstate_p)(struct ifnet *ifp); @@ -964,6 +965,7 @@ bridge_delete_member(struct bridge_softc *sc, struct bridge_iflist *bif, EVENTHANDLER_INVOKE(iflladdr_event, sc->sc_ifp); } + bridge_linkcheck(sc); bridge_mutecaps(sc); /* recalcuate now this interface is removed */ bridge_rtdelete(sc, ifs, IFBF_FLUSHALL); KASSERT(bif->bif_addrcnt == 0, @@ -993,7 +995,6 @@ bridge_delete_member(struct bridge_softc *sc, struct bridge_iflist *bif, bridge_set_ifcap(sc, bif, bif->bif_savedcaps); } bstp_destroy(&bif->bif_stp); /* prepare to free */ - bridge_linkstate(ifs); BRIDGE_LOCK(sc); free(bif, M_DEVBUF); } @@ -1092,18 +1093,17 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg) /* Set interface capabilities to the intersection set of all members */ bridge_mutecaps(sc); + bridge_linkcheck(sc); - BRIDGE_UNLOCK(sc); - /* Update the linkstate for the bridge */ - bridge_linkstate(ifs); /* Place the interface into promiscuous mode */ switch (ifs->if_type) { case IFT_ETHER: case IFT_L2VLAN: + BRIDGE_UNLOCK(sc); error = ifpromisc(ifs, 1); + BRIDGE_LOCK(sc); break; } - BRIDGE_LOCK(sc); if (error) bridge_delete_member(sc, bif, 0); out: @@ -1811,8 +1811,10 @@ bridge_enqueue(struct bridge_softc *sc, struct ifnet *dst_ifp, struct mbuf *m) m->m_flags &= ~M_VLANTAG; } - if (err == 0) - dst_ifp->if_transmit(dst_ifp, m); + if ((err = dst_ifp->if_transmit(dst_ifp, m))) { + m_freem(m0); + break; + } } if (err == 0) { @@ -3486,8 +3488,7 @@ static void bridge_linkstate(struct ifnet *ifp) { struct bridge_softc *sc = ifp->if_bridge; - struct bridge_iflist *bif, *bif2; - int new_link, hasls; + struct bridge_iflist *bif; BRIDGE_LOCK(sc); bif = bridge_lookup_member_if(sc, ifp); @@ -3495,13 +3496,26 @@ bridge_linkstate(struct ifnet *ifp) BRIDGE_UNLOCK(sc); return; } + bridge_linkcheck(sc); + BRIDGE_UNLOCK(sc); + + bstp_linkstate(&bif->bif_stp); +} + +static void +bridge_linkcheck(struct bridge_softc *sc) +{ + struct bridge_iflist *bif; + int new_link, hasls; + + BRIDGE_LOCK_ASSERT(sc); new_link = LINK_STATE_DOWN; hasls = 0; /* Our link is considered up if at least one of our ports is active */ - LIST_FOREACH(bif2, &sc->sc_iflist, bif_next) { - if (bif2->bif_ifp->if_capabilities & IFCAP_LINKSTATE) + LIST_FOREACH(bif, &sc->sc_iflist, bif_next) { + if (bif->bif_ifp->if_capabilities & IFCAP_LINKSTATE) hasls++; - if (bif2->bif_ifp->if_link_state == LINK_STATE_UP) { + if (bif->bif_ifp->if_link_state == LINK_STATE_UP) { new_link = LINK_STATE_UP; break; } @@ -3511,8 +3525,4 @@ bridge_linkstate(struct ifnet *ifp) new_link = LINK_STATE_UP; } if_link_state_change(sc->sc_ifp, new_link); - BRIDGE_UNLOCK(sc); - - bstp_linkstate(&bif->bif_stp); } - diff --git a/sys/net/if_dl.h b/sys/net/if_dl.h index 8d88623db85..64f4b56d76e 100644 --- a/sys/net/if_dl.h +++ b/sys/net/if_dl.h @@ -67,6 +67,7 @@ struct sockaddr_dl { }; #define LLADDR(s) ((caddr_t)((s)->sdl_data + (s)->sdl_nlen)) +#define LLINDEX(s) ((s)->sdl_index) #ifndef _KERNEL diff --git a/sys/net/if_epair.c b/sys/net/if_epair.c index fe22ed75e7e..2a67e1805a9 100644 --- a/sys/net/if_epair.c +++ b/sys/net/if_epair.c @@ -904,39 +904,41 @@ epair_clone_destroy(struct if_clone *ifc, struct ifnet *ifp) if_link_state_change(oifp, LINK_STATE_DOWN); ifp->if_drv_flags &= ~IFF_DRV_RUNNING; oifp->if_drv_flags &= ~IFF_DRV_RUNNING; - ether_ifdetach(oifp); - ether_ifdetach(ifp); - /* - * Wait for all packets to be dispatched to if_input. - * The numbers can only go down as the interfaces are - * detached so there is no need to use atomics. - */ - DPRINTF("sca refcnt=%u scb refcnt=%u\n", sca->refcount, scb->refcount); - EPAIR_REFCOUNT_ASSERT(sca->refcount == 1 && scb->refcount == 1, - ("%s: ifp=%p sca->refcount!=1: %d || ifp=%p scb->refcount!=1: %d", - __func__, ifp, sca->refcount, oifp, scb->refcount)); /* - * Get rid of our second half. + * Get rid of our second half. As the other of the two + * interfaces may reside in a different vnet, we need to + * switch before freeing them. */ + CURVNET_SET_QUIET(oifp->if_vnet); + ether_ifdetach(oifp); + /* + * Wait for all packets to be dispatched to if_input. + * The numbers can only go down as the interface is + * detached so there is no need to use atomics. + */ + DPRINTF("scb refcnt=%u\n", scb->refcount); + EPAIR_REFCOUNT_ASSERT(scb->refcount == 1, + ("%s: ifp=%p scb->refcount!=1: %d", __func__, oifp, scb->refcount)); oifp->if_softc = NULL; error = if_clone_destroyif(ifc, oifp); if (error) panic("%s: if_clone_destroyif() for our 2nd iface failed: %d", __func__, error); - - /* - * Finish cleaning up. Free them and release the unit. - * As the other of the two interfaces my reside in a different vnet, - * we need to switch before freeing them. - */ - CURVNET_SET_QUIET(oifp->if_vnet); if_free(oifp); - CURVNET_RESTORE(); - if_free(ifp); - ifmedia_removeall(&sca->media); ifmedia_removeall(&scb->media); free(scb, M_EPAIR); + CURVNET_RESTORE(); + + ether_ifdetach(ifp); + /* + * Wait for all packets to be dispatched to if_input. + */ + DPRINTF("sca refcnt=%u\n", sca->refcount); + EPAIR_REFCOUNT_ASSERT(sca->refcount == 1, + ("%s: ifp=%p sca->refcount!=1: %d", __func__, ifp, sca->refcount)); + if_free(ifp); + ifmedia_removeall(&sca->media); free(sca, M_EPAIR); ifc_free_unit(ifc, unit); diff --git a/sys/net/if_gif.c b/sys/net/if_gif.c index 350611d758f..783607b1e1d 100644 --- a/sys/net/if_gif.c +++ b/sys/net/if_gif.c @@ -342,26 +342,82 @@ gif_encapcheck(m, off, proto, arg) return 0; } } +#ifdef INET +#define GIF_HDR_LEN (ETHER_HDR_LEN + sizeof (struct ip)) +#endif +#ifdef INET6 +#define GIF_HDR_LEN6 (ETHER_HDR_LEN + sizeof (struct ip6_hdr)) +#endif static void gif_start(struct ifnet *ifp) { struct gif_softc *sc; struct mbuf *m; + uint32_t af; + int error = 0; sc = ifp->if_softc; - + GIF_LOCK(sc); ifp->if_drv_flags |= IFF_DRV_OACTIVE; - for (;;) { - IFQ_DEQUEUE(&ifp->if_snd, m); + while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) { + + IFQ_DRV_DEQUEUE(&ifp->if_snd, m); if (m == 0) break; - gif_output(ifp, m, sc->gif_pdst, NULL); +#ifdef ALTQ + /* Take out those altq bytes we add in gif_output */ +#ifdef INET + if (sc->gif_psrc->sa_family == AF_INET) + m->m_pkthdr.len -= GIF_HDR_LEN; +#endif +#ifdef INET6 + if (sc->gif_psrc->sa_family == AF_INET6) + m->m_pkthdr.len -= GIF_HDR_LEN6; +#endif +#endif + /* + * Now pull back the af that we + * stashed in the csum_data. + */ + af = m->m_pkthdr.csum_data; + + if (ifp->if_bridge) + af = AF_LINK; + + BPF_MTAP2(ifp, &af, sizeof(af), m); + ifp->if_opackets++; + +/* Done by IFQ_HANDOFF */ +/* ifp->if_obytes += m->m_pkthdr.len;*/ + /* override to IPPROTO_ETHERIP for bridged traffic */ + + M_SETFIB(m, sc->gif_fibnum); + /* inner AF-specific encapsulation */ + /* XXX should we check if our outer source is legal? */ + /* dispatch to output logic based on outer AF */ + switch (sc->gif_psrc->sa_family) { +#ifdef INET + case AF_INET: + error = in_gif_output(ifp, af, m); + break; +#endif +#ifdef INET6 + case AF_INET6: + error = in6_gif_output(ifp, af, m); + break; +#endif + default: + m_freem(m); + error = ENETDOWN; + } + if (error) + ifp->if_oerrors++; } ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - + GIF_UNLOCK(sc); return; } @@ -376,8 +432,7 @@ gif_output(ifp, m, dst, ro) struct m_tag *mtag; int error = 0; int gif_called; - u_int32_t af; - + uint32_t af; #ifdef MAC error = mac_ifnet_check_transmit(ifp, m); if (error) { @@ -426,55 +481,45 @@ gif_output(ifp, m, dst, ro) m_tag_prepend(m, mtag); m->m_flags &= ~(M_BCAST|M_MCAST); - - GIF_LOCK(sc); - - if (!(ifp->if_flags & IFF_UP) || - sc->gif_psrc == NULL || sc->gif_pdst == NULL) { - GIF_UNLOCK(sc); - m_freem(m); - error = ENETDOWN; - goto end; - } - /* BPF writes need to be handled specially. */ if (dst->sa_family == AF_UNSPEC) { bcopy(dst->sa_data, &af, sizeof(af)); dst->sa_family = af; } - af = dst->sa_family; - BPF_MTAP2(ifp, &af, sizeof(af), m); - ifp->if_opackets++; - ifp->if_obytes += m->m_pkthdr.len; - - /* override to IPPROTO_ETHERIP for bridged traffic */ - if (ifp->if_bridge) - af = AF_LINK; - - M_SETFIB(m, sc->gif_fibnum); - /* inner AF-specific encapsulation */ - - /* XXX should we check if our outer source is legal? */ - - /* dispatch to output logic based on outer AF */ - switch (sc->gif_psrc->sa_family) { + /* + * Now save the af in the inbound pkt csum + * data, this is a cheat since we are using + * the inbound csum_data field to carry the + * af over to the gif_start() routine, avoiding + * using yet another mtag. + */ + m->m_pkthdr.csum_data = af; + if (!(ifp->if_flags & IFF_UP) || + sc->gif_psrc == NULL || sc->gif_pdst == NULL) { + m_freem(m); + error = ENETDOWN; + goto end; + } +#ifdef ALTQ + /* + * Make altq aware of the bytes we will add + * when we actually send it. + */ #ifdef INET - case AF_INET: - error = in_gif_output(ifp, af, m); - break; + if (sc->gif_psrc->sa_family == AF_INET) + m->m_pkthdr.len += GIF_HDR_LEN; #endif #ifdef INET6 - case AF_INET6: - error = in6_gif_output(ifp, af, m); - break; + if (sc->gif_psrc->sa_family == AF_INET6) + m->m_pkthdr.len += GIF_HDR_LEN6; #endif - default: - m_freem(m); - error = ENETDOWN; - } - - GIF_UNLOCK(sc); +#endif + /* + * Queue message on interface, update output statistics if + * successful, and start output if interface not yet active. + */ + IFQ_HANDOFF(ifp, m, error); end: if (error) ifp->if_oerrors++; diff --git a/sys/net/if_lagg.c b/sys/net/if_lagg.c index b7beb86a9b8..95ac185bc4f 100644 --- a/sys/net/if_lagg.c +++ b/sys/net/if_lagg.c @@ -516,8 +516,13 @@ lagg_port_create(struct lagg_softc *sc, struct ifnet *ifp) return (ENOSPC); /* Check if port has already been associated to a lagg */ - if (ifp->if_lagg != NULL) + if (ifp->if_lagg != NULL) { + /* Port is already in the current lagg? */ + lp = (struct lagg_port *)ifp->if_lagg; + if (lp->lp_softc == sc) + return (EEXIST); return (EBUSY); + } /* XXX Disallow non-ethernet interfaces (this should be any of 802) */ if (ifp->if_type != IFT_ETHER) @@ -764,28 +769,18 @@ fallback: return (EINVAL); } +/* + * For direct output to child ports. + */ static int lagg_port_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct route *ro) { struct lagg_port *lp = ifp->if_lagg; - struct ether_header *eh; - short type = 0; switch (dst->sa_family) { case pseudo_AF_HDRCMPLT: case AF_UNSPEC: - eh = (struct ether_header *)dst->sa_data; - type = eh->ether_type; - break; - } - - /* - * Only allow ethernet types required to initiate or maintain the link, - * aggregated frames take a different path. - */ - switch (ntohs(type)) { - case ETHERTYPE_PAE: /* EAPOL PAE/802.1x */ return ((*lp->lp_output)(ifp, m, dst, ro)); } @@ -802,6 +797,9 @@ lagg_port_ifdetach(void *arg __unused, struct ifnet *ifp) if ((lp = ifp->if_lagg) == NULL) return; + /* If the ifnet is just being renamed, don't do anything. */ + if (ifp->if_flags & IFF_RENAMING) + return; sc = lp->lp_softc; diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c index 78d2de21e52..8d371eb172e 100644 --- a/sys/net/if_loop.c +++ b/sys/net/if_loop.c @@ -92,7 +92,9 @@ #endif #define LO_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP | CSUM_SCTP) -#define LO_CSUM_SET (CSUM_DATA_VALID | CSUM_PSEUDO_HDR | \ +#define LO_CSUM_FEATURES6 (CSUM_TCP_IPV6 | CSUM_UDP_IPV6 | CSUM_SCTP_IPV6) +#define LO_CSUM_SET (CSUM_DATA_VALID | CSUM_DATA_VALID_IPV6 | \ + CSUM_PSEUDO_HDR | \ CSUM_IP_CHECKED | CSUM_IP_VALID | \ CSUM_SCTP_VALID) @@ -143,8 +145,9 @@ lo_clone_create(struct if_clone *ifc, int unit, caddr_t params) ifp->if_ioctl = loioctl; ifp->if_output = looutput; ifp->if_snd.ifq_maxlen = ifqmaxlen; - ifp->if_capabilities = ifp->if_capenable = IFCAP_HWCSUM; - ifp->if_hwassist = LO_CSUM_FEATURES; + ifp->if_capabilities = ifp->if_capenable = + IFCAP_HWCSUM | IFCAP_HWCSUM_IPV6; + ifp->if_hwassist = LO_CSUM_FEATURES | LO_CSUM_FEATURES6; if_attach(ifp); bpfattach(ifp, DLT_NULL, sizeof(u_int32_t)); if (V_loif == NULL) @@ -252,7 +255,14 @@ looutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, m->m_pkthdr.csum_flags = LO_CSUM_SET; } m->m_pkthdr.csum_flags &= ~LO_CSUM_FEATURES; + break; case AF_INET6: + if (ifp->if_capenable & IFCAP_RXCSUM_IPV6) { + m->m_pkthdr.csum_data = 0xffff; + m->m_pkthdr.csum_flags = LO_CSUM_SET; + } + m->m_pkthdr.csum_flags &= ~LO_CSUM_FEATURES6; + break; case AF_IPX: case AF_APPLETALK: break; @@ -436,10 +446,15 @@ loioctl(struct ifnet *ifp, u_long cmd, caddr_t data) ifp->if_capenable ^= IFCAP_RXCSUM; if ((mask & IFCAP_TXCSUM) != 0) ifp->if_capenable ^= IFCAP_TXCSUM; + if ((mask & IFCAP_RXCSUM_IPV6) != 0) + ifp->if_capenable ^= IFCAP_RXCSUM_IPV6; + if ((mask & IFCAP_TXCSUM_IPV6) != 0) + ifp->if_capenable ^= IFCAP_TXCSUM_IPV6; + ifp->if_hwassist = 0; if (ifp->if_capenable & IFCAP_TXCSUM) ifp->if_hwassist = LO_CSUM_FEATURES; - else - ifp->if_hwassist = 0; + if (ifp->if_capenable & IFCAP_TXCSUM_IPV6) + ifp->if_hwassist |= LO_CSUM_FEATURES6; break; default: diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c index 4ff5a49f598..201f9761350 100644 --- a/sys/net/if_tap.c +++ b/sys/net/if_tap.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -64,8 +65,10 @@ #include #include #include -#include +#include #include +#include +#include #include @@ -214,6 +217,7 @@ tap_destroy(struct tap_softc *tp) KASSERT(!(tp->tap_flags & TAP_OPEN), ("%s flags is out of sync", ifp->if_xname)); + CURVNET_SET(ifp->if_vnet); seldrain(&tp->tap_rsel); knlist_destroy(&tp->tap_rsel.si_note); destroy_dev(tp->tap_dev); @@ -222,6 +226,7 @@ tap_destroy(struct tap_softc *tp) mtx_destroy(&tp->tap_mtx); free(tp, M_TAP); + CURVNET_RESTORE(); } static void @@ -363,6 +368,7 @@ tapclone(void *arg, struct ucred *cred, char *name, int namelen, struct cdev **d if (unit == -1) append_unit = 1; + CURVNET_SET(CRED_TO_VNET(cred)); /* find any existing device, or allocate new unit number */ i = clone_create(&tapclones, &tap_cdevsw, &unit, dev, extra); if (i) { @@ -381,6 +387,7 @@ tapclone(void *arg, struct ucred *cred, char *name, int namelen, struct cdev **d } if_clone_create(name, namelen, NULL); + CURVNET_RESTORE(); } /* tapclone */ @@ -521,6 +528,7 @@ tapclose(struct cdev *dev, int foo, int bar, struct thread *td) /* junk all pending output */ mtx_lock(&tp->tap_mtx); + CURVNET_SET(ifp->if_vnet); IF_DRAIN(&ifp->if_snd); /* @@ -544,6 +552,8 @@ tapclose(struct cdev *dev, int foo, int bar, struct thread *td) } if_link_state_change(ifp, LINK_STATE_DOWN); + CURVNET_RESTORE(); + funsetown(&tp->tap_sigio); selwakeuppri(&tp->tap_rsel, PZERO+1); KNOTE_LOCKED(&tp->tap_rsel.si_note, 0); @@ -593,7 +603,8 @@ tapifioctl(struct ifnet *ifp, u_long cmd, caddr_t data) struct tap_softc *tp = ifp->if_softc; struct ifreq *ifr = (struct ifreq *)data; struct ifstat *ifs = NULL; - int dummy; + struct ifmediareq *ifmr = NULL; + int dummy, error = 0; switch (cmd) { case SIOCSIFFLAGS: /* XXX -- just like vmnet does */ @@ -601,6 +612,22 @@ tapifioctl(struct ifnet *ifp, u_long cmd, caddr_t data) case SIOCDELMULTI: break; + case SIOCGIFMEDIA: + ifmr = (struct ifmediareq *)data; + dummy = ifmr->ifm_count; + ifmr->ifm_count = 1; + ifmr->ifm_status = IFM_AVALID; + ifmr->ifm_active = IFM_ETHER; + if (tp->tap_flags & TAP_OPEN) + ifmr->ifm_status |= IFM_ACTIVE; + ifmr->ifm_current = ifmr->ifm_active; + if (dummy >= 1) { + int media = IFM_ETHER; + error = copyout(&media, ifmr->ifm_ulist, + sizeof(int)); + } + break; + case SIOCSIFMTU: ifp->if_mtu = ifr->ifr_mtu; break; @@ -617,11 +644,11 @@ tapifioctl(struct ifnet *ifp, u_long cmd, caddr_t data) break; default: - return (ether_ioctl(ifp, cmd, data)); - /* NOT REACHED */ + error = ether_ioctl(ifp, cmd, data); + break; } - return (0); + return (error); } /* tapifioctl */ @@ -945,7 +972,9 @@ tapwrite(struct cdev *dev, struct uio *uio, int flag) } /* Pass packet up to parent. */ + CURVNET_SET(ifp->if_vnet); (*ifp->if_input)(ifp, m); + CURVNET_RESTORE(); ifp->if_ipackets ++; /* ibytes are counted in parent */ return (0); diff --git a/sys/net/if_var.h b/sys/net/if_var.h index ab078b8dd85..3d57953c47c 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -712,6 +712,8 @@ drbr_inuse(struct ifnet *ifp, struct buf_ring *br) #define IF_MINMTU 72 #define IF_MAXMTU 65535 +#define TOEDEV(ifp) ((ifp)->if_llsoftc) + #endif /* _KERNEL */ /* diff --git a/sys/net/if_vlan.c b/sys/net/if_vlan.c index 95ed455c4ff..122568084cd 100644 --- a/sys/net/if_vlan.c +++ b/sys/net/if_vlan.c @@ -746,8 +746,8 @@ vlan_modevent(module_t mod, int type, void *data) vlan_trunk_cap_p = NULL; vlan_trunkdev_p = NULL; vlan_tag_p = NULL; - vlan_cookie_p = vlan_cookie; - vlan_setcookie_p = vlan_setcookie; + vlan_cookie_p = NULL; + vlan_setcookie_p = NULL; vlan_devat_p = NULL; VLAN_LOCK_DESTROY(); if (bootverbose) @@ -1503,6 +1503,22 @@ vlan_capabilities(struct ifvlan *ifv) ifp->if_capenable &= ~(p->if_capenable & IFCAP_TSO); ifp->if_hwassist &= ~(p->if_hwassist & CSUM_TSO); } + + /* + * If the parent interface can offload TCP connections over VLANs then + * propagate its TOE capability to the VLAN interface. + * + * All TOE drivers in the tree today can deal with VLANs. If this + * changes then IFCAP_VLAN_TOE should be promoted to a full capability + * with its own bit. + */ +#define IFCAP_VLAN_TOE IFCAP_TOE + if (p->if_capabilities & IFCAP_VLAN_TOE) + ifp->if_capabilities |= p->if_capabilities & IFCAP_TOE; + if (p->if_capenable & IFCAP_VLAN_TOE) { + TOEDEV(ifp) = TOEDEV(p); + ifp->if_capenable |= p->if_capenable & IFCAP_TOE; + } } static void diff --git a/sys/net/route.h b/sys/net/route.h index 1de222a06b1..f12ed810d55 100644 --- a/sys/net/route.h +++ b/sys/net/route.h @@ -54,7 +54,8 @@ struct route { struct sockaddr ro_dst; }; -#define RT_CACHING_CONTEXT 0x1 +#define RT_CACHING_CONTEXT 0x1 /* XXX: not used anywhere */ +#define RT_NORTREF 0x2 /* doesn't hold reference on ro_rt */ /* * These numbers are used by reliable protocols for determining @@ -341,6 +342,18 @@ struct rt_addrinfo { RTFREE_LOCKED(_rt); \ } while (0) +#define RO_RTFREE(_ro) do { \ + if ((_ro)->ro_rt) { \ + if ((_ro)->ro_flags & RT_NORTREF) { \ + (_ro)->ro_flags &= ~RT_NORTREF; \ + (_ro)->ro_rt = NULL; \ + } else { \ + RT_LOCK((_ro)->ro_rt); \ + RTFREE_LOCKED((_ro)->ro_rt); \ + } \ + } \ +} while (0) + struct radix_node_head *rt_tables_get_rnh(int, int); struct ifmultiaddr; diff --git a/sys/net80211/_ieee80211.h b/sys/net80211/_ieee80211.h index 3793c661f86..5120d413188 100644 --- a/sys/net80211/_ieee80211.h +++ b/sys/net80211/_ieee80211.h @@ -242,6 +242,8 @@ struct ieee80211_channel { (((_c)->ic_flags & (IEEE80211_CHAN_OFDM | IEEE80211_CHAN_DYN)) != 0) #define IEEE80211_IS_CHAN_CCK(_c) \ (((_c)->ic_flags & (IEEE80211_CHAN_CCK | IEEE80211_CHAN_DYN)) != 0) +#define IEEE80211_IS_CHAN_DYN(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_DYN) == IEEE80211_CHAN_DYN) #define IEEE80211_IS_CHAN_GFSK(_c) \ (((_c)->ic_flags & IEEE80211_CHAN_GFSK) != 0) #define IEEE80211_IS_CHAN_TURBO(_c) \ diff --git a/sys/net80211/ieee80211.h b/sys/net80211/ieee80211.h index c43c71b3573..eec75376881 100644 --- a/sys/net80211/ieee80211.h +++ b/sys/net80211/ieee80211.h @@ -333,6 +333,8 @@ struct ieee80211_action { #define IEEE80211_ACTION_CAT_BA 3 /* BA */ #define IEEE80211_ACTION_CAT_HT 7 /* HT */ #define IEEE80211_ACTION_CAT_MESH 13 /* Mesh */ +#define IEEE80211_ACTION_CAT_SELF_PROT 15 /* Self-protected */ +/* 16 - 125 reserved */ #define IEEE80211_ACTION_CAT_VENDOR 127 /* Vendor Specific */ #define IEEE80211_ACTION_HT_TXCHWIDTH 0 /* recommended xmit chan width*/ @@ -732,7 +734,7 @@ enum { IEEE80211_ELEMID_MESHAWAKEW = 119, IEEE80211_ELEMID_MESHBEACONT = 120, /* 121-124 MMCAOP not implemented yet */ - IEEE80211_ELEMID_MESHPANN = 125, /* XXX: is GANN now, not used */ + IEEE80211_ELEMID_MESHGANN = 125, IEEE80211_ELEMID_MESHRANN = 126, /* 127 Extended Capabilities */ /* 128-129 reserved */ diff --git a/sys/net80211/ieee80211_action.c b/sys/net80211/ieee80211_action.c index aa2d9bd96cf..44543b69b6a 100644 --- a/sys/net80211/ieee80211_action.c +++ b/sys/net80211/ieee80211_action.c @@ -94,7 +94,7 @@ ieee80211_send_action_register(int cat, int act, ieee80211_send_action_func *f) break; ht_send_action[act] = f; return 0; - case IEEE80211_ACTION_CAT_MESHPEERING: + case IEEE80211_ACTION_CAT_SELF_PROT: if (act >= N(meshpl_send_action)) break; meshpl_send_action[act] = f; @@ -144,7 +144,7 @@ ieee80211_send_action(struct ieee80211_node *ni, int cat, int act, void *sa) if (act < N(ht_send_action)) f = ht_send_action[act]; break; - case IEEE80211_ACTION_CAT_MESHPEERING: + case IEEE80211_ACTION_CAT_SELF_PROT: if (act < N(meshpl_send_action)) f = meshpl_send_action[act]; break; @@ -215,7 +215,7 @@ ieee80211_recv_action_register(int cat, int act, ieee80211_recv_action_func *f) break; ht_recv_action[act] = f; return 0; - case IEEE80211_ACTION_CAT_MESHPEERING: + case IEEE80211_ACTION_CAT_SELF_PROT: if (act >= N(meshpl_recv_action)) break; meshpl_recv_action[act] = f; @@ -269,7 +269,7 @@ ieee80211_recv_action(struct ieee80211_node *ni, if (ia->ia_action < N(ht_recv_action)) f = ht_recv_action[ia->ia_action]; break; - case IEEE80211_ACTION_CAT_MESHPEERING: + case IEEE80211_ACTION_CAT_SELF_PROT: if (ia->ia_action < N(meshpl_recv_action)) f = meshpl_recv_action[ia->ia_action]; break; diff --git a/sys/net80211/ieee80211_ddb.c b/sys/net80211/ieee80211_ddb.c index 9fd83620c8e..c8695719054 100644 --- a/sys/net80211/ieee80211_ddb.c +++ b/sys/net80211/ieee80211_ddb.c @@ -870,8 +870,10 @@ _db_show_mesh(const struct ieee80211_mesh_state *ms) TAILQ_FOREACH(rt, &ms->ms_routes, rt_next) { db_printf("entry %d:\tdest: %6D nexthop: %6D metric: %u", i, rt->rt_dest, ":", rt->rt_nexthop, ":", rt->rt_metric); + db_printf("\tlifetime: %u lastseq: %u priv: %p\n", - rt->rt_lifetime, rt->rt_lastmseq, rt->rt_priv); + ieee80211_mesh_rt_update(rt, 0), + rt->rt_lastmseq, rt->rt_priv); i++; } } diff --git a/sys/net80211/ieee80211_ht.c b/sys/net80211/ieee80211_ht.c index 9134b8dcbd6..61344670203 100644 --- a/sys/net80211/ieee80211_ht.c +++ b/sys/net80211/ieee80211_ht.c @@ -2166,6 +2166,9 @@ ieee80211_ampdu_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap, } } +/* XXX */ +static void bar_start_timer(struct ieee80211_tx_ampdu *tap); + static void bar_timeout(void *arg) { @@ -2184,11 +2187,34 @@ bar_timeout(void *arg) return; /* XXX ? */ if (tap->txa_attempts >= ieee80211_bar_maxtries) { + struct ieee80211com *ic = ni->ni_ic; + ni->ni_vap->iv_stats.is_ampdu_bar_tx_fail++; + /* + * If (at least) the last BAR TX timeout was due to + * an ieee80211_send_bar() failures, then we need + * to make sure we notify the driver that a BAR + * TX did occur and fail. This gives the driver + * a chance to undo any queue pause that may + * have occured. + */ + ic->ic_bar_response(ni, tap, 1); ieee80211_ampdu_stop(ni, tap, IEEE80211_REASON_TIMEOUT); } else { ni->ni_vap->iv_stats.is_ampdu_bar_tx_retry++; - ieee80211_send_bar(ni, tap, tap->txa_seqpending); + if (ieee80211_send_bar(ni, tap, tap->txa_seqpending) != 0) { + /* + * If ieee80211_send_bar() fails here, the + * timer may have stopped and/or the pending + * flag may be clear. Because of this, + * fake the BARPEND and reset the timer. + * A retransmission attempt will then occur + * during the next timeout. + */ + /* XXX locking */ + tap->txa_flags |= IEEE80211_AGGR_BARPEND; + bar_start_timer(tap); + } } } diff --git a/sys/net80211/ieee80211_hwmp.c b/sys/net80211/ieee80211_hwmp.c index ff49d9e67b1..3a7b94fdcac 100644 --- a/sys/net80211/ieee80211_hwmp.c +++ b/sys/net80211/ieee80211_hwmp.c @@ -89,7 +89,8 @@ static void hwmp_recv_preq(struct ieee80211vap *, struct ieee80211_node *, static int hwmp_send_preq(struct ieee80211_node *, const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN], - struct ieee80211_meshpreq_ie *); + struct ieee80211_meshpreq_ie *, + struct timeval *, struct timeval *); static void hwmp_recv_prep(struct ieee80211vap *, struct ieee80211_node *, const struct ieee80211_frame *, const struct ieee80211_meshprep_ie *); @@ -104,6 +105,9 @@ static int hwmp_send_perr(struct ieee80211_node *, const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN], struct ieee80211_meshperr_ie *); +static void hwmp_senderror(struct ieee80211vap *, + const uint8_t [IEEE80211_ADDR_LEN], + struct ieee80211_mesh_route *, int); static void hwmp_recv_rann(struct ieee80211vap *, struct ieee80211_node *, const struct ieee80211_frame *, const struct ieee80211_meshrann_ie *); @@ -143,8 +147,7 @@ typedef uint32_t ieee80211_hwmp_seq; #define HWMP_SEQ_GT(a, b) ((int32_t)((a)-(b)) > 0) #define HWMP_SEQ_GEQ(a, b) ((int32_t)((a)-(b)) >= 0) -/* The longer one of the lifetime should be stored as new lifetime */ -#define MESH_ROUTE_LIFETIME_MAX(a, b) (a > b ? a : b) +#define HWMP_SEQ_MAX(a, b) (a > b ? a : b) /* * Private extension of ieee80211_mesh_route. @@ -153,14 +156,16 @@ struct ieee80211_hwmp_route { ieee80211_hwmp_seq hr_seq; /* last HWMP seq seen from dst*/ ieee80211_hwmp_seq hr_preqid; /* last PREQ ID seen from dst */ ieee80211_hwmp_seq hr_origseq; /* seq. no. on our latest PREQ*/ - int hr_preqretries; + struct timeval hr_lastpreq; /* last time we sent a PREQ */ + struct timeval hr_lastrootconf; /* last sent PREQ root conf */ + int hr_preqretries; /* number of discoveries */ + int hr_lastdiscovery; /* last discovery in ticks */ }; struct ieee80211_hwmp_state { ieee80211_hwmp_seq hs_seq; /* next seq to be used */ ieee80211_hwmp_seq hs_preqid; /* next PREQ ID to be used */ - struct timeval hs_lastpreq; /* last time we sent a PREQ */ - struct timeval hs_lastperr; /* last time we sent a PERR */ int hs_rootmode; /* proactive HWMP */ + struct timeval hs_lastperr; /* last time we sent a PERR */ struct callout hs_roottimer; uint8_t hs_maxhops; /* max hop count */ }; @@ -170,13 +175,19 @@ static SYSCTL_NODE(_net_wlan, OID_AUTO, hwmp, CTLFLAG_RD, 0, static int ieee80211_hwmp_targetonly = 0; SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, targetonly, CTLTYPE_INT | CTLFLAG_RW, &ieee80211_hwmp_targetonly, 0, "Set TO bit on generated PREQs"); -static int ieee80211_hwmp_replyforward = 1; -SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, replyforward, CTLTYPE_INT | CTLFLAG_RW, - &ieee80211_hwmp_replyforward, 0, "Set RF bit on generated PREQs"); static int ieee80211_hwmp_pathtimeout = -1; SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, pathlifetime, CTLTYPE_INT | CTLFLAG_RW, &ieee80211_hwmp_pathtimeout, 0, ieee80211_sysctl_msecs_ticks, "I", "path entry lifetime (ms)"); +static int ieee80211_hwmp_maxpreq_retries = -1; +SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, maxpreq_retries, CTLTYPE_INT | CTLFLAG_RW, + &ieee80211_hwmp_maxpreq_retries, 0, ieee80211_sysctl_msecs_ticks, "I", + "maximum number of preq retries"); +static int ieee80211_hwmp_net_diameter_traversaltime = -1; +SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, net_diameter_traversal_time, + CTLTYPE_INT | CTLFLAG_RW, &ieee80211_hwmp_net_diameter_traversaltime, 0, + ieee80211_sysctl_msecs_ticks, "I", + "estimate travelse time across the MBSS (ms)"); static int ieee80211_hwmp_roottimeout = -1; SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, roottimeout, CTLTYPE_INT | CTLFLAG_RW, &ieee80211_hwmp_roottimeout, 0, ieee80211_sysctl_msecs_ticks, "I", @@ -189,6 +200,11 @@ static int ieee80211_hwmp_rannint = -1; SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, rannint, CTLTYPE_INT | CTLFLAG_RW, &ieee80211_hwmp_rannint, 0, ieee80211_sysctl_msecs_ticks, "I", "root announcement interval (ms)"); +static struct timeval ieee80211_hwmp_rootconfint = { 0, 0 }; +static int ieee80211_hwmp_rootconfint_internal = -1; +SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, rootconfint, CTLTYPE_INT | CTLFLAG_RD, + &ieee80211_hwmp_rootconfint_internal, 0, ieee80211_sysctl_msecs_ticks, "I", + "root confirmation interval (ms) (read-only)"); #define IEEE80211_HWMP_DEFAULT_MAXHOPS 31 @@ -199,6 +215,7 @@ static struct ieee80211_mesh_proto_path mesh_proto_hwmp = { .mpp_ie = IEEE80211_MESHCONF_PATH_HWMP, .mpp_discover = hwmp_discover, .mpp_peerdown = hwmp_peerdown, + .mpp_senderror = hwmp_senderror, .mpp_vattach = hwmp_vattach, .mpp_vdetach = hwmp_vdetach, .mpp_newstate = hwmp_newstate, @@ -212,10 +229,25 @@ SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, inact, CTLTYPE_INT | CTLFLAG_RW, static void ieee80211_hwmp_init(void) { + /* Default values as per amendment */ ieee80211_hwmp_pathtimeout = msecs_to_ticks(5*1000); ieee80211_hwmp_roottimeout = msecs_to_ticks(5*1000); ieee80211_hwmp_rootint = msecs_to_ticks(2*1000); ieee80211_hwmp_rannint = msecs_to_ticks(1*1000); + ieee80211_hwmp_rootconfint_internal = msecs_to_ticks(2*1000); + ieee80211_hwmp_maxpreq_retries = 3; + /* + * (TU): A measurement of time equal to 1024 μs, + * 500 TU is 512 ms. + */ + ieee80211_hwmp_net_diameter_traversaltime = msecs_to_ticks(512); + + /* + * NB: I dont know how to make SYSCTL_PROC that calls ms to ticks + * and return a struct timeval... + */ + ieee80211_hwmp_rootconfint.tv_usec = + ieee80211_hwmp_rootconfint_internal * 1000; /* * Register action frame handler. @@ -537,6 +569,7 @@ hwmp_recv_action_meshpath(struct ieee80211_node *ni, } memcpy(&rann, mrann, sizeof(rann)); rann.rann_seq = LE_READ_4(&mrann->rann_seq); + rann.rann_interval = LE_READ_4(&mrann->rann_interval); rann.rann_metric = LE_READ_4(&mrann->rann_metric); hwmp_recv_rann(vap, ni, wh, &rann); found++; @@ -808,8 +841,8 @@ hwmp_rootmode_cb(void *arg) "%s", "send broadcast PREQ"); preq.preq_flags = IEEE80211_MESHPREQ_FLAGS_AM; - if (ms->ms_flags & IEEE80211_MESHFLAGS_PORTAL) - preq.preq_flags |= IEEE80211_MESHPREQ_FLAGS_PR; + if (ms->ms_flags & IEEE80211_MESHFLAGS_GATE) + preq.preq_flags |= IEEE80211_MESHPREQ_FLAGS_GATE; if (hs->hs_rootmode == IEEE80211_HWMP_ROOTMODE_PROACTIVE) preq.preq_flags |= IEEE80211_MESHPREQ_FLAGS_PP; preq.preq_hopcount = 0; @@ -822,10 +855,11 @@ hwmp_rootmode_cb(void *arg) preq.preq_tcount = 1; IEEE80211_ADDR_COPY(PREQ_TADDR(0), broadcastaddr); PREQ_TFLAGS(0) = IEEE80211_MESHPREQ_TFLAGS_TO | - IEEE80211_MESHPREQ_TFLAGS_RF; + IEEE80211_MESHPREQ_TFLAGS_USN; PREQ_TSEQ(0) = 0; vap->iv_stats.is_hwmp_rootreqs++; - hwmp_send_preq(vap->iv_bss, vap->iv_myaddr, broadcastaddr, &preq); + hwmp_send_preq(vap->iv_bss, vap->iv_myaddr, broadcastaddr, &preq, + NULL, NULL); /* NB: we enforce rate check ourself */ hwmp_rootmode_setup(vap); } #undef PREQ_TFLAGS @@ -848,12 +882,13 @@ hwmp_rootmode_rann_cb(void *arg) "%s", "send broadcast RANN"); rann.rann_flags = 0; - if (ms->ms_flags & IEEE80211_MESHFLAGS_PORTAL) - rann.rann_flags |= IEEE80211_MESHRANN_FLAGS_PR; + if (ms->ms_flags & IEEE80211_MESHFLAGS_GATE) + rann.rann_flags |= IEEE80211_MESHFLAGS_GATE; rann.rann_hopcount = 0; rann.rann_ttl = ms->ms_ttl; IEEE80211_ADDR_COPY(rann.rann_addr, vap->iv_myaddr); rann.rann_seq = ++hs->hs_seq; + rann.rann_interval = ieee80211_hwmp_rannint; rann.rann_metric = IEEE80211_MESHLMETRIC_INITIALVAL; vap->iv_stats.is_hwmp_rootrann++; @@ -869,13 +904,14 @@ hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni, const struct ieee80211_frame *wh, const struct ieee80211_meshpreq_ie *preq) { struct ieee80211_mesh_state *ms = vap->iv_mesh; - struct ieee80211_mesh_route *rt = NULL; struct ieee80211_mesh_route *rtorig = NULL; + struct ieee80211_mesh_route *rtorig_ext = NULL; struct ieee80211_mesh_route *rttarg = NULL; struct ieee80211_hwmp_route *hrorig = NULL; struct ieee80211_hwmp_route *hrtarg = NULL; struct ieee80211_hwmp_state *hs = vap->iv_hwmp; struct ieee80211_meshprep_ie prep; + ieee80211_hwmp_seq preqid; /* last seen preqid for orig */ if (ni == vap->iv_bss || ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED) @@ -888,16 +924,21 @@ hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni, return; IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "received PREQ, source %6D", preq->preq_origaddr, ":"); + "received PREQ, orig %6D, targ(0) %6D", preq->preq_origaddr, ":", + PREQ_TADDR(0), ":"); /* - * Acceptance criteria: if the PREQ is not for us or not broadcast + * Acceptance criteria: (if the PREQ is not for us or not broadcast, + * or an external mac address not proxied by us), * AND forwarding is disabled, discard this PREQ. - * XXX: need to check PROXY */ - if ((!IEEE80211_ADDR_EQ(vap->iv_myaddr, PREQ_TADDR(0)) || - !IEEE80211_IS_MULTICAST(PREQ_TADDR(0))) && - !(ms->ms_flags & IEEE80211_MESHFLAGS_FWD)) { + rttarg = ieee80211_mesh_rt_find(vap, PREQ_TADDR(0)); + if (!(ms->ms_flags & IEEE80211_MESHFLAGS_FWD) && + (!IEEE80211_ADDR_EQ(vap->iv_myaddr, PREQ_TADDR(0)) || + !IEEE80211_IS_MULTICAST(PREQ_TADDR(0)) || + (rttarg != NULL && + rttarg->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY && + IEEE80211_ADDR_EQ(vap->iv_myaddr, rttarg->rt_mesh_gate)))) { IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_HWMP, preq->preq_origaddr, NULL, "%s", "not accepting PREQ"); return; @@ -906,7 +947,6 @@ hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni, * Acceptance criteria: if unicast addressed * AND no valid forwarding for Target of PREQ, discard this PREQ. */ - rttarg = ieee80211_mesh_rt_find(vap, PREQ_TADDR(0)); if(rttarg != NULL) hrtarg = IEEE80211_MESH_ROUTE_PRIV(rttarg, struct ieee80211_hwmp_route); @@ -926,19 +966,26 @@ hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni, rtorig = ieee80211_mesh_rt_find(vap, preq->preq_origaddr); if (rtorig == NULL) { rtorig = ieee80211_mesh_rt_add(vap, preq->preq_origaddr); + if (rtorig == NULL) { + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, + "unable to add orig path to %6D", + preq->preq_origaddr, ":"); + vap->iv_stats.is_mesh_rtaddfailed++; + return; + } IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "adding originator %6D", preq->preq_origaddr, ":"); } - if (rtorig == NULL) { - /* XXX stat */ - return; - } hrorig = IEEE80211_MESH_ROUTE_PRIV(rtorig, struct ieee80211_hwmp_route); + /* record last seen preqid */ + preqid = hrorig->hr_preqid; + hrorig->hr_preqid = HWMP_SEQ_MAX(hrorig->hr_preqid, preq->preq_id); + /* Data creation and update of forwarding information * according to Table 11C-8 for originator mesh STA. */ - if(HWMP_SEQ_GT(preq->preq_origseq, hrorig->hr_seq) || + if (HWMP_SEQ_GT(preq->preq_origseq, hrorig->hr_seq) || (HWMP_SEQ_EQ(preq->preq_origseq, hrorig->hr_seq) && preq->preq_metric < rtorig->rt_metric)) { hrorig->hr_seq = preq->preq_origseq; @@ -946,17 +993,19 @@ hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni, rtorig->rt_metric = preq->preq_metric + ms->ms_pmetric->mpm_metric(ni); rtorig->rt_nhops = preq->preq_hopcount + 1; - rtorig->rt_lifetime = MESH_ROUTE_LIFETIME_MAX( - preq->preq_lifetime, rtorig->rt_lifetime); + ieee80211_mesh_rt_update(rtorig, preq->preq_lifetime); /* path to orig is valid now */ rtorig->rt_flags |= IEEE80211_MESHRT_FLAGS_VALID; - }else if(hrtarg != NULL && - HWMP_SEQ_EQ(hrtarg->hr_seq, PREQ_TSEQ(0)) && - (rtorig->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0) { + }else if ((hrtarg != NULL && + HWMP_SEQ_EQ(hrtarg->hr_seq, PREQ_TSEQ(0)) && + ((rtorig->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0)) || + preqid >= preq->preq_id) { IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "discard PREQ from %6D, old seq no %u <= %u", + "discard PREQ from %6D, old seqno %u <= %u," + " or old preqid %u < %u", preq->preq_origaddr, ":", - preq->preq_origseq, hrorig->hr_seq); + preq->preq_origseq, hrorig->hr_seq, + preq->preq_id, preqid); return; } @@ -967,68 +1016,86 @@ hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni, /* * Check if the PREQ is addressed to us. + * or a Proxy currently supplied by us. */ - if (IEEE80211_ADDR_EQ(vap->iv_myaddr, PREQ_TADDR(0))) { - IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "reply to %6D", preq->preq_origaddr, ":"); + if (IEEE80211_ADDR_EQ(vap->iv_myaddr, PREQ_TADDR(0)) || + (rttarg != NULL && + rttarg->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY && + rttarg->rt_flags & IEEE80211_MESHRT_FLAGS_VALID)) { + /* + * When we are the target we shall update our own HWMP seq + * number with max of (current and preq->seq) + 1 + */ + hs->hs_seq = HWMP_SEQ_MAX(hs->hs_seq, PREQ_TSEQ(0)) + 1; + + prep.prep_flags = 0; + if (rttarg != NULL && /* if NULL it means we are the target */ + rttarg->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY) { + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, + "reply for proxy %6D", rttarg->rt_dest, ":"); + prep.prep_flags |= IEEE80211_MESHPREP_FLAGS_AE; + IEEE80211_ADDR_COPY(prep.prep_target_ext_addr, + rttarg->rt_dest); + /* update proxy seqno to HWMP seqno */ + rttarg->rt_ext_seq = hs->hs_seq; + } /* * Build and send a PREP frame. */ - prep.prep_flags = 0; prep.prep_hopcount = 0; prep.prep_ttl = ms->ms_ttl; IEEE80211_ADDR_COPY(prep.prep_targetaddr, vap->iv_myaddr); - prep.prep_targetseq = ++hs->hs_seq; + prep.prep_targetseq = hs->hs_seq; prep.prep_lifetime = preq->preq_lifetime; prep.prep_metric = IEEE80211_MESHLMETRIC_INITIALVAL; IEEE80211_ADDR_COPY(prep.prep_origaddr, preq->preq_origaddr); prep.prep_origseq = preq->preq_origseq; + + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, + "reply to %6D", preq->preq_origaddr, ":"); hwmp_send_prep(ni, vap->iv_myaddr, wh->i_addr2, &prep); - /* - * Build the reverse path, if we don't have it already. - */ - rt = ieee80211_mesh_rt_find(vap, preq->preq_origaddr); - if (rt == NULL) - hwmp_discover(vap, preq->preq_origaddr, NULL); - else if ((rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0) - hwmp_discover(vap, rt->rt_dest, NULL); return; } + /* we may update our proxy information for the orig external */ + else if (preq->preq_flags & IEEE80211_MESHPREQ_FLAGS_AE) { + rtorig_ext = + ieee80211_mesh_rt_find(vap, preq->preq_orig_ext_addr); + if (rtorig_ext == NULL) { + rtorig_ext = ieee80211_mesh_rt_add(vap, + preq->preq_orig_ext_addr); + if (rtorig_ext == NULL) { + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, + "unable to add orig ext proxy to %6D", + preq->preq_orig_ext_addr, ":"); + vap->iv_stats.is_mesh_rtaddfailed++; + return; + } + IEEE80211_ADDR_COPY(rtorig_ext->rt_mesh_gate, + preq->preq_origaddr); + } + rtorig_ext->rt_ext_seq = preq->preq_origseq; + ieee80211_mesh_rt_update(rtorig_ext, preq->preq_lifetime); + } /* * Proactive PREQ: reply with a proactive PREP to the * root STA if requested. */ if (IEEE80211_ADDR_EQ(PREQ_TADDR(0), broadcastaddr) && - (PREQ_TFLAGS(0) & - ((IEEE80211_MESHPREQ_TFLAGS_TO|IEEE80211_MESHPREQ_TFLAGS_RF) == - (IEEE80211_MESHPREQ_TFLAGS_TO|IEEE80211_MESHPREQ_TFLAGS_RF)))) { - uint8_t rootmac[IEEE80211_ADDR_LEN]; - - IEEE80211_ADDR_COPY(rootmac, preq->preq_origaddr); - rt = ieee80211_mesh_rt_find(vap, rootmac); - if (rt == NULL) { - rt = ieee80211_mesh_rt_add(vap, rootmac); - if (rt == NULL) { - IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "unable to add root mesh path to %6D", - rootmac, ":"); - vap->iv_stats.is_mesh_rtaddfailed++; - return; - } - } + (PREQ_TFLAGS(0) & IEEE80211_MESHPREQ_TFLAGS_TO)) { IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "root mesh station @ %6D", rootmac, ":"); + "root mesh station @ %6D", preq->preq_origaddr, ":"); /* * Reply with a PREP if we don't have a path to the root * or if the root sent us a proactive PREQ. */ - if ((rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0 || + if ((rtorig->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0 || (preq->preq_flags & IEEE80211_MESHPREQ_FLAGS_PP)) { prep.prep_flags = 0; prep.prep_hopcount = 0; prep.prep_ttl = ms->ms_ttl; - IEEE80211_ADDR_COPY(prep.prep_origaddr, rootmac); + IEEE80211_ADDR_COPY(prep.prep_origaddr, + preq->preq_origaddr); prep.prep_origseq = preq->preq_origseq; prep.prep_lifetime = preq->preq_lifetime; prep.prep_metric = IEEE80211_MESHLMETRIC_INITIALVAL; @@ -1036,109 +1103,69 @@ hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni, vap->iv_myaddr); prep.prep_targetseq = ++hs->hs_seq; hwmp_send_prep(vap->iv_bss, vap->iv_myaddr, - broadcastaddr, &prep); + rtorig->rt_nexthop, &prep); } - hwmp_discover(vap, rootmac, NULL); - return; } - rt = ieee80211_mesh_rt_find(vap, PREQ_TADDR(0)); /* * Forwarding and Intermediate reply for PREQs with 1 target. */ - if (preq->preq_tcount == 1) { + if ((preq->preq_tcount == 1) && (preq->preq_ttl > 1) && + (ms->ms_flags & IEEE80211_MESHFLAGS_FWD)) { struct ieee80211_meshpreq_ie ppreq; /* propagated PREQ */ memcpy(&ppreq, preq, sizeof(ppreq)); + /* * We have a valid route to this node. */ - if (rt != NULL && - (rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID)) { - if (preq->preq_ttl > 1 && - preq->preq_hopcount < hs->hs_maxhops) { - IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "forward PREQ from %6D", - preq->preq_origaddr, ":"); - /* - * Propagate the original PREQ. - * PREQ is unicast now to rt->rt_nexthop - */ - ppreq.preq_flags &= - ~IEEE80211_MESHPREQ_FLAGS_AM; - ppreq.preq_hopcount += 1; - ppreq.preq_ttl -= 1; - ppreq.preq_metric += - ms->ms_pmetric->mpm_metric(ni); - /* - * Set TO and unset RF bits because we are - * going to send a PREP next. - */ - ppreq.preq_targets[0].target_flags |= - IEEE80211_MESHPREQ_TFLAGS_TO; - ppreq.preq_targets[0].target_flags &= - ~IEEE80211_MESHPREQ_TFLAGS_RF; - hwmp_send_preq(ni, vap->iv_myaddr, - rt->rt_nexthop, &ppreq); - } + if (rttarg != NULL && + (rttarg->rt_flags & IEEE80211_MESHRT_FLAGS_VALID)) { /* * Check if we can send an intermediate Path Reply, - * i.e., Target Only bit is not set. + * i.e., Target Only bit is not set and target is not + * the MAC broadcast address. */ - if (!(PREQ_TFLAGS(0) & IEEE80211_MESHPREQ_TFLAGS_TO)) { + if (!(PREQ_TFLAGS(0) & IEEE80211_MESHPREQ_TFLAGS_TO) && + !IEEE80211_ADDR_EQ(PREQ_TADDR(0), broadcastaddr)) { struct ieee80211_meshprep_ie prep; IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "intermediate reply for PREQ from %6D", preq->preq_origaddr, ":"); prep.prep_flags = 0; - prep.prep_hopcount = rt->rt_nhops + 1; + prep.prep_hopcount = rttarg->rt_nhops; prep.prep_ttl = ms->ms_ttl; IEEE80211_ADDR_COPY(&prep.prep_targetaddr, PREQ_TADDR(0)); - prep.prep_targetseq = hrorig->hr_seq; + prep.prep_targetseq = hrtarg->hr_seq; prep.prep_lifetime = preq->preq_lifetime; - prep.prep_metric = rt->rt_metric + - ms->ms_pmetric->mpm_metric(ni); + prep.prep_metric =rttarg->rt_metric; IEEE80211_ADDR_COPY(&prep.prep_origaddr, preq->preq_origaddr); prep.prep_origseq = hrorig->hr_seq; hwmp_send_prep(ni, vap->iv_myaddr, - broadcastaddr, &prep); - } - /* - * We have no information about this path, - * propagate the PREQ. - */ - } else if (preq->preq_ttl > 1 && - preq->preq_hopcount < hs->hs_maxhops) { - if (rt == NULL) { - rt = ieee80211_mesh_rt_add(vap, PREQ_TADDR(0)); - if (rt == NULL) { - IEEE80211_NOTE(vap, - IEEE80211_MSG_HWMP, ni, - "unable to add PREQ path to %6D", - PREQ_TADDR(0), ":"); - vap->iv_stats.is_mesh_rtaddfailed++; - return; - } - } - rt->rt_metric = preq->preq_metric; - rt->rt_lifetime = preq->preq_lifetime; - hrorig = IEEE80211_MESH_ROUTE_PRIV(rt, - struct ieee80211_hwmp_route); - hrorig->hr_seq = preq->preq_origseq; - hrorig->hr_preqid = preq->preq_id; + rtorig->rt_nexthop, &prep); - IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "forward PREQ from %6D", - preq->preq_origaddr, ":"); - ppreq.preq_hopcount += 1; - ppreq.preq_ttl -= 1; - ppreq.preq_metric += ms->ms_pmetric->mpm_metric(ni); - hwmp_send_preq(ni, vap->iv_myaddr, broadcastaddr, - &ppreq); + /* + * Set TO and unset RF bits because we have + * sent a PREP. + */ + ppreq.preq_targets[0].target_flags |= + IEEE80211_MESHPREQ_TFLAGS_TO; + } } + + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, + "forward PREQ from %6D", + preq->preq_origaddr, ":"); + ppreq.preq_hopcount += 1; + ppreq.preq_ttl -= 1; + ppreq.preq_metric += ms->ms_pmetric->mpm_metric(ni); + + /* don't do PREQ ratecheck when we propagate */ + hwmp_send_preq(ni, vap->iv_myaddr, broadcastaddr, + &ppreq, NULL, NULL); } } #undef PREQ_TFLAGS @@ -1149,16 +1176,19 @@ static int hwmp_send_preq(struct ieee80211_node *ni, const uint8_t sa[IEEE80211_ADDR_LEN], const uint8_t da[IEEE80211_ADDR_LEN], - struct ieee80211_meshpreq_ie *preq) + struct ieee80211_meshpreq_ie *preq, + struct timeval *last, struct timeval *minint) { - struct ieee80211_hwmp_state *hs = ni->ni_vap->iv_hwmp; /* * Enforce PREQ interval. + * NB: Proactive ROOT PREQs rate is handled by cb task. */ - if (ratecheck(&hs->hs_lastpreq, &ieee80211_hwmp_preqminint) == 0) - return EALREADY; - getmicrouptime(&hs->hs_lastpreq); + if (last != NULL && minint != NULL) { + if (ratecheck(last, minint) == 0) + return EALREADY; /* XXX: we should postpone */ + getmicrouptime(last); + } /* * mesh preq action frame format @@ -1180,62 +1210,70 @@ static void hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni, const struct ieee80211_frame *wh, const struct ieee80211_meshprep_ie *prep) { +#define IS_PROXY(rt) (rt->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY) +#define PROXIED_BY_US(rt) \ + (IEEE80211_ADDR_EQ(vap->iv_myaddr, rt->rt_mesh_gate)) struct ieee80211_mesh_state *ms = vap->iv_mesh; struct ieee80211_hwmp_state *hs = vap->iv_hwmp; struct ieee80211_mesh_route *rt = NULL; + struct ieee80211_mesh_route *rtorig = NULL; + struct ieee80211_mesh_route *rtext = NULL; struct ieee80211_hwmp_route *hr; struct ieee80211com *ic = vap->iv_ic; struct ifnet *ifp = vap->iv_ifp; struct mbuf *m, *next; uint32_t metric = 0; + const uint8_t *addr; - /* - * Acceptance criteria: if the corresponding PREQ was not generated - * by us and forwarding is disabled, discard this PREP. - */ if (ni == vap->iv_bss || ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED) return; - if (!IEEE80211_ADDR_EQ(vap->iv_myaddr, prep->prep_origaddr) && - !(ms->ms_flags & IEEE80211_MESHFLAGS_FWD)) - return; IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "received PREP from %6D", prep->prep_targetaddr, ":"); + "received PREP, orig %6D, targ %6D", prep->prep_origaddr, ":", + prep->prep_targetaddr, ":"); - rt = ieee80211_mesh_rt_find(vap, prep->prep_targetaddr); - if (rt == NULL) { - /* - * If we have no entry this could be a reply to a root PREQ. - * XXX: not true anymore cause we dont create entry for target - * when propagating PREQs like the old code did. - */ - if (hs->hs_rootmode != IEEE80211_HWMP_ROOTMODE_DISABLED) { - rt = ieee80211_mesh_rt_add(vap, prep->prep_targetaddr); - if (rt == NULL) { - IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, - ni, "unable to add PREP path to %6D", - prep->prep_targetaddr, ":"); - vap->iv_stats.is_mesh_rtaddfailed++; - return; - } - IEEE80211_ADDR_COPY(rt->rt_nexthop, wh->i_addr2); - rt->rt_nhops = prep->prep_hopcount; - rt->rt_lifetime = prep->prep_lifetime; - rt->rt_metric = prep->prep_metric; - rt->rt_flags |= IEEE80211_MESHRT_FLAGS_VALID; - IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "add root path to %6D nhops %d metric %lu (PREP)", - prep->prep_targetaddr, ":", - rt->rt_nhops, rt->rt_metric); - return; - } + /* + * Acceptance criteria: (If the corresponding PREP was not generated + * by us OR not generated by an external mac that is not proxied by us) + * AND forwarding is disabled, discard this PREP. + */ + rtorig = ieee80211_mesh_rt_find(vap, prep->prep_origaddr); + if ((!IEEE80211_ADDR_EQ(vap->iv_myaddr, prep->prep_origaddr) || + (rtorig != NULL && IS_PROXY(rtorig) && !PROXIED_BY_US(rtorig))) && + !(ms->ms_flags & IEEE80211_MESHFLAGS_FWD)){ + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, + "discard PREP, orig(%6D) not proxied or generated by us", + prep->prep_origaddr, ":"); return; } + + /* PREP ACCEPTED */ + /* - * Sequence number validation. + * If accepted shall create or update the active forwarding information + * it maintains for the target mesh STA of the PREP (according to the + * rules defined in 13.10.8.4). If the conditions for creating or + * updating the forwarding information have not been met in those + * rules, no further steps are applied to the PREP. + * [OPTIONAL]: update forwarding information to TA if metric improves. */ + rt = ieee80211_mesh_rt_find(vap, prep->prep_targetaddr); + if (rt == NULL) { + rt = ieee80211_mesh_rt_add(vap, prep->prep_targetaddr); + if (rt == NULL) { + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, + "unable to add PREP path to %6D", + prep->prep_targetaddr, ":"); + vap->iv_stats.is_mesh_rtaddfailed++; + return; + } + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, + "adding target %6D", prep->prep_targetaddr, ":"); + } hr = IEEE80211_MESH_ROUTE_PRIV(rt, struct ieee80211_hwmp_route); + /* update path metric */ + metric = prep->prep_metric + ms->ms_pmetric->mpm_metric(ni); if ((rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID)) { if (HWMP_SEQ_LT(prep->prep_targetseq, hr->hr_seq)) { IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, @@ -1244,7 +1282,7 @@ hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni, prep->prep_targetseq, hr->hr_seq); return; } else if (HWMP_SEQ_LEQ(prep->prep_targetseq, hr->hr_seq) && - prep->prep_metric > rt->rt_metric) { + metric > rt->rt_metric) { IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "discard PREP from %6D, new metric %u > %u", prep->prep_targetaddr, ":", @@ -1253,13 +1291,46 @@ hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni, } } + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, + "%s path to %6D, hopcount %d:%d metric %d:%d", + rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID ? + "prefer" : "update", + prep->prep_targetaddr, ":", + rt->rt_nhops, prep->prep_hopcount, + rt->rt_metric, metric); + hr->hr_seq = prep->prep_targetseq; + hr->hr_preqretries = 0; + IEEE80211_ADDR_COPY(rt->rt_nexthop, ni->ni_macaddr); + rt->rt_metric = metric; + rt->rt_nhops = prep->prep_hopcount + 1; + ieee80211_mesh_rt_update(rt, prep->prep_lifetime); + if (rt->rt_flags & IEEE80211_MESHRT_FLAGS_DISCOVER) { + /* discovery complete */ + rt->rt_flags &= ~IEEE80211_MESHRT_FLAGS_DISCOVER; + } + rt->rt_flags |= IEEE80211_MESHRT_FLAGS_VALID; /* mark valid */ + /* - * If it's NOT for us, propagate the PREP. + * If it's NOT for us, propagate the PREP */ if (!IEEE80211_ADDR_EQ(vap->iv_myaddr, prep->prep_origaddr) && - prep->prep_ttl > 1 && prep->prep_hopcount < hs->hs_maxhops) { + prep->prep_ttl > 1 && + prep->prep_hopcount < hs->hs_maxhops) { struct ieee80211_meshprep_ie pprep; /* propagated PREP */ + /* + * NB: We should already have setup the path to orig + * mesh STA when we propagated PREQ to target mesh STA, + * no PREP is generated without a corresponding PREQ. + * XXX: for now just ignore. + */ + if (rtorig == NULL) { + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, + "received PREP for an unknown orig(%6D)", + prep->prep_origaddr, ":"); + return; + } + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "propagate PREP from %6D", prep->prep_targetaddr, ":"); @@ -1268,54 +1339,53 @@ hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni, pprep.prep_hopcount += 1; pprep.prep_ttl -= 1; pprep.prep_metric += ms->ms_pmetric->mpm_metric(ni); - hwmp_send_prep(ni, vap->iv_myaddr, broadcastaddr, &pprep); + hwmp_send_prep(ni, vap->iv_myaddr, rtorig->rt_nexthop, &pprep); + + /* precursor list for the Target Mesh STA Address is updated */ } - hr = IEEE80211_MESH_ROUTE_PRIV(rt, struct ieee80211_hwmp_route); - if (rt->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY) { - /* NB: never clobber a proxy entry */; - IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "discard PREP for %6D, route is marked PROXY", - prep->prep_targetaddr, ":"); - vap->iv_stats.is_hwmp_proxy++; - /* NB: first path discovery always fails */ - } else if (hr->hr_origseq == 0 || - prep->prep_origseq == hr->hr_origseq) { - /* - * Check if we already have a path to this node. - * If we do, check if this path reply contains a - * better route. - */ - if ((rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0 || - (prep->prep_hopcount < rt->rt_nhops || - prep->prep_metric < rt->rt_metric)) { - hr->hr_origseq = prep->prep_origseq; - metric = prep->prep_metric + - ms->ms_pmetric->mpm_metric(ni); - IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "%s path to %6D, hopcount %d:%d metric %d:%d", - rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID ? - "prefer" : "update", - prep->prep_origaddr, ":", - rt->rt_nhops, prep->prep_hopcount, - rt->rt_metric, prep->prep_metric); - IEEE80211_ADDR_COPY(rt->rt_nexthop, wh->i_addr2); - rt->rt_nhops = prep->prep_hopcount + 1; - rt->rt_lifetime = prep->prep_lifetime; - rt->rt_metric = metric; - rt->rt_flags |= IEEE80211_MESHRT_FLAGS_VALID; - } else { - IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "ignore PREP for %6D, hopcount %d:%d metric %d:%d", - prep->prep_targetaddr, ":", - rt->rt_nhops, prep->prep_hopcount, - rt->rt_metric, prep->prep_metric); + + /* + * Check if we received a PREP w/ AE and store target external address. + * We may store target external address if recevied PREP w/ AE + * and we are not final destination + */ + if (prep->prep_flags & IEEE80211_MESHPREP_FLAGS_AE) { + rtext = ieee80211_mesh_rt_find(vap, + prep->prep_target_ext_addr); + if (rtext == NULL) { + rtext = ieee80211_mesh_rt_add(vap, + prep->prep_target_ext_addr); + if (rtext == NULL) { + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, + "unable to add PREP path to proxy %6D", + prep->prep_targetaddr, ":"); + vap->iv_stats.is_mesh_rtaddfailed++; + return; + } } - } else { IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "discard PREP for %6D, wrong orig seqno %u != %u", - prep->prep_targetaddr, ":", prep->prep_origseq, - hr->hr_origseq); - vap->iv_stats.is_hwmp_wrongseq++; + "%s path to %6D, hopcount %d:%d metric %d:%d", + rtext->rt_flags & IEEE80211_MESHRT_FLAGS_VALID ? + "prefer" : "update", + prep->prep_target_ext_addr, ":", + rtext->rt_nhops, prep->prep_hopcount, + rtext->rt_metric, metric); + + rtext->rt_flags = IEEE80211_MESHRT_FLAGS_PROXY | + IEEE80211_MESHRT_FLAGS_VALID; + IEEE80211_ADDR_COPY(rtext->rt_dest, + prep->prep_target_ext_addr); + IEEE80211_ADDR_COPY(rtext->rt_mesh_gate, + prep->prep_targetaddr); + IEEE80211_ADDR_COPY(rtext->rt_nexthop, wh->i_addr2); + rtext->rt_metric = metric; + rtext->rt_lifetime = prep->prep_lifetime; + rtext->rt_nhops = prep->prep_hopcount + 1; + rtext->rt_ext_seq = prep->prep_origseq; /* new proxy seq */ + /* + * XXX: proxy entries have no HWMP priv data, + * nullify them to be sure? + */ } /* * Check for frames queued awaiting path discovery. @@ -1324,9 +1394,11 @@ hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni, * stuck back on the stageq because there won't be * a path. */ + addr = prep->prep_flags & IEEE80211_MESHPREP_FLAGS_AE ? + prep->prep_target_ext_addr : prep->prep_targetaddr; m = ieee80211_ageq_remove(&ic->ic_stageq, (struct ieee80211_node *)(uintptr_t) - ieee80211_mac_hash(ic, rt->rt_dest)); + ieee80211_mac_hash(ic, addr)); /* either dest or ext_dest */ for (; m != NULL; m = next) { next = m->m_nextpkt; m->m_nextpkt = NULL; @@ -1334,6 +1406,8 @@ hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni, "flush queued frame %p len %d", m, m->m_pkthdr.len); ifp->if_transmit(ifp, m); } +#undef IS_PROXY +#undef PROXIED_BY_US } static int @@ -1386,7 +1460,7 @@ hwmp_peerdown(struct ieee80211_node *ni) PERR_DFLAGS(0) |= IEEE80211_MESHPERR_DFLAGS_USN; PERR_DFLAGS(0) |= IEEE80211_MESHPERR_DFLAGS_RC; IEEE80211_ADDR_COPY(PERR_DADDR(0), rt->rt_dest); - PERR_DSEQ(0) = hr->hr_seq; + PERR_DSEQ(0) = ++hr->hr_seq; PERR_DRCODE(0) = IEEE80211_REASON_MESH_PERR_DEST_UNREACH; /* NB: flush everything passing through peer */ ieee80211_mesh_rt_flush_peer(vap, ni->ni_macaddr); @@ -1397,60 +1471,117 @@ hwmp_peerdown(struct ieee80211_node *ni) #undef PERR_DSEQ #undef PERR_DRCODE -#define PERR_DFLAGS(n) perr->perr_dests[n].dest_flags -#define PERR_DADDR(n) perr->perr_dests[n].dest_addr -#define PERR_DSEQ(n) perr->perr_dests[n].dest_seq -#define PERR_DRCODE(n) perr->perr_dests[n].dest_rcode +#define PERR_DFLAGS(n) perr->perr_dests[n].dest_flags +#define PERR_DADDR(n) perr->perr_dests[n].dest_addr +#define PERR_DSEQ(n) perr->perr_dests[n].dest_seq +#define PERR_DEXTADDR(n) perr->perr_dests[n].dest_ext_addr +#define PERR_DRCODE(n) perr->perr_dests[n].dest_rcode static void hwmp_recv_perr(struct ieee80211vap *vap, struct ieee80211_node *ni, const struct ieee80211_frame *wh, const struct ieee80211_meshperr_ie *perr) { struct ieee80211_mesh_state *ms = vap->iv_mesh; struct ieee80211_mesh_route *rt = NULL; + struct ieee80211_mesh_route *rt_ext = NULL; struct ieee80211_hwmp_route *hr; - struct ieee80211_meshperr_ie pperr; - int i, forward = 0; + struct ieee80211_meshperr_ie *pperr = NULL; + int i, j = 0, forward = 0; + + if (ni == vap->iv_bss || + ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED) + return; + + IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, + "received PERR from %6D", wh->i_addr2, ":"); /* - * Acceptance criteria: check if we received a PERR from a - * neighbor and forwarding is enabled. + * if forwarding is true, prepare pperr */ - if (ni == vap->iv_bss || - ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED || - !(ms->ms_flags & IEEE80211_MESHFLAGS_FWD)) - return; + if (ms->ms_flags & IEEE80211_MESHFLAGS_FWD) { + forward = 1; + pperr = malloc(sizeof(*perr) + 31*sizeof(*perr->perr_dests), + M_80211_MESH_PERR, M_NOWAIT); /* XXX: magic number, 32 err dests */ + } + /* - * Find all routing entries that match and delete them. + * Acceptance criteria: check if we have forwarding information + * stored about destination, and that nexthop == TA of this PERR. + * NB: we also build a new PERR to propagate in case we should forward. */ for (i = 0; i < perr->perr_ndests; i++) { rt = ieee80211_mesh_rt_find(vap, PERR_DADDR(i)); - if (rt == NULL) + if (rt == NULL || rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) continue; + if (!IEEE80211_ADDR_EQ(rt->rt_nexthop, wh->i_addr2)) + continue; + + /* found and accepted a PERR ndest element, process it... */ + if (forward) + memcpy(&pperr->perr_dests[j], &perr->perr_dests[i], + sizeof(*perr->perr_dests)); hr = IEEE80211_MESH_ROUTE_PRIV(rt, struct ieee80211_hwmp_route); - if (!(PERR_DFLAGS(0) & IEEE80211_MESHPERR_DFLAGS_USN) && - HWMP_SEQ_GEQ(PERR_DSEQ(i), hr->hr_seq)) { - ieee80211_mesh_rt_del(vap, rt->rt_dest); - ieee80211_mesh_rt_flush_peer(vap, rt->rt_dest); - rt = NULL; - forward = 1; + switch(PERR_DFLAGS(i)) { + case (IEEE80211_REASON_MESH_PERR_NO_FI): + if (PERR_DSEQ(i) == 0) { + hr->hr_seq++; + if (forward) { + pperr->perr_dests[j].dest_seq = + hr->hr_seq; + } + } else { + hr->hr_seq = PERR_DSEQ(i); + } + rt->rt_flags &= ~IEEE80211_MESHRT_FLAGS_VALID; + j++; + break; + case (IEEE80211_REASON_MESH_PERR_DEST_UNREACH): + if(HWMP_SEQ_GT(PERR_DSEQ(i), hr->hr_seq)) { + hr->hr_seq = PERR_DSEQ(i); + rt->rt_flags &= ~IEEE80211_MESHRT_FLAGS_VALID; + j++; + } + break; + case (IEEE80211_REASON_MESH_PERR_NO_PROXY): + rt_ext = ieee80211_mesh_rt_find(vap, PERR_DEXTADDR(i)); + if (rt_ext != NULL) { + rt_ext->rt_flags &= + ~IEEE80211_MESHRT_FLAGS_VALID; + j++; + } + break; + default: + IEEE80211_DISCARD(vap, IEEE80211_MSG_HWMP, wh, NULL, + "PERR, unknown reason code %u\n", PERR_DFLAGS(i)); + goto done; /* XXX: stats?? */ } + ieee80211_mesh_rt_flush_peer(vap, rt->rt_dest); + KASSERT(j < 32, ("PERR, error ndest >= 32 (%u)", j)); } + if (j == 0) { + IEEE80211_DISCARD(vap, IEEE80211_MSG_HWMP, wh, NULL, "%s", + "PERR not accepted"); + goto done; /* XXX: stats?? */ + } + /* * Propagate the PERR if we previously found it on our routing table. - * XXX handle ndest > 1 */ if (forward && perr->perr_ttl > 1) { IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "propagate PERR from %6D", wh->i_addr2, ":"); - memcpy(&pperr, perr, sizeof(*perr)); - pperr.perr_ttl--; + pperr->perr_ndests = j; + pperr->perr_ttl--; hwmp_send_perr(vap->iv_bss, vap->iv_myaddr, broadcastaddr, - &pperr); + pperr); } +done: + if (pperr != NULL) + free(pperr, M_80211_MESH_PERR); } #undef PERR_DFLAGS -#undef PEER_DADDR +#undef PERR_DADDR #undef PERR_DSEQ +#undef PERR_DEXTADDR #undef PERR_DRCODE static int @@ -1493,6 +1624,64 @@ hwmp_send_perr(struct ieee80211_node *ni, return hwmp_send_action(ni, sa, da, (uint8_t *)perr, perr->perr_len+2); } +/* + * Called from the rest of the net80211 code (mesh code for example). + * NB: IEEE80211_REASON_MESH_PERR_DEST_UNREACH can be trigger by the fact that + * a mesh STA is unable to forward an MSDU/MMPDU to a next-hop mesh STA. + */ +#define PERR_DFLAGS(n) perr.perr_dests[n].dest_flags +#define PERR_DADDR(n) perr.perr_dests[n].dest_addr +#define PERR_DSEQ(n) perr.perr_dests[n].dest_seq +#define PERR_DEXTADDR(n) perr.perr_dests[n].dest_ext_addr +#define PERR_DRCODE(n) perr.perr_dests[n].dest_rcode +static void +hwmp_senderror(struct ieee80211vap *vap, + const uint8_t addr[IEEE80211_ADDR_LEN], + struct ieee80211_mesh_route *rt, int rcode) +{ + struct ieee80211_mesh_state *ms = vap->iv_mesh; + struct ieee80211_hwmp_route *hr = NULL; + struct ieee80211_meshperr_ie perr; + + if (rt != NULL) + hr = IEEE80211_MESH_ROUTE_PRIV(rt, + struct ieee80211_hwmp_route); + + perr.perr_ndests = 1; + perr.perr_ttl = ms->ms_ttl; + PERR_DFLAGS(0) = 0; + PERR_DRCODE(0) = rcode; + + switch (rcode) { + case IEEE80211_REASON_MESH_PERR_NO_FI: + IEEE80211_ADDR_COPY(PERR_DADDR(0), addr); + PERR_DSEQ(0) = 0; /* reserved */ + break; + case IEEE80211_REASON_MESH_PERR_NO_PROXY: + KASSERT(rt != NULL, ("no proxy info for sending PERR")); + KASSERT(rt->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY, + ("route is not marked proxy")); + PERR_DFLAGS(0) |= IEEE80211_MESHPERR_FLAGS_AE; + IEEE80211_ADDR_COPY(PERR_DADDR(0), vap->iv_myaddr); + PERR_DSEQ(0) = rt->rt_ext_seq; + IEEE80211_ADDR_COPY(PERR_DEXTADDR(0), addr); + break; + case IEEE80211_REASON_MESH_PERR_DEST_UNREACH: + KASSERT(rt != NULL, ("no route info for sending PERR")); + IEEE80211_ADDR_COPY(PERR_DADDR(0), addr); + PERR_DSEQ(0) = hr->hr_seq; + break; + default: + KASSERT(0, ("unknown reason code for HWMP PERR (%u)", rcode)); + } + hwmp_send_perr(vap->iv_bss, vap->iv_myaddr, broadcastaddr, &perr); +} +#undef PERR_DFLAGS +#undef PEER_DADDR +#undef PERR_DSEQ +#undef PERR_DEXTADDR +#undef PERR_DRCODE + static void hwmp_recv_rann(struct ieee80211vap *vap, struct ieee80211_node *ni, const struct ieee80211_frame *wh, const struct ieee80211_meshrann_ie *rann) @@ -1501,7 +1690,9 @@ hwmp_recv_rann(struct ieee80211vap *vap, struct ieee80211_node *ni, struct ieee80211_hwmp_state *hs = vap->iv_hwmp; struct ieee80211_mesh_route *rt = NULL; struct ieee80211_hwmp_route *hr; + struct ieee80211_meshpreq_ie preq; struct ieee80211_meshrann_ie prann; + uint32_t metric = 0; if (ni == vap->iv_bss || ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED || @@ -1509,27 +1700,74 @@ hwmp_recv_rann(struct ieee80211vap *vap, struct ieee80211_node *ni, return; rt = ieee80211_mesh_rt_find(vap, rann->rann_addr); - /* - * Discover the path to the root mesh STA. - * If we already know it, propagate the RANN element. - */ + if (rt != NULL && rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) { + hr = IEEE80211_MESH_ROUTE_PRIV(rt, struct ieee80211_hwmp_route); + + /* Acceptance criteria: if RANN.seq < stored seq, discard RANN */ + if (HWMP_SEQ_LT(rann->rann_seq, hr->hr_seq)) { + IEEE80211_DISCARD(vap, IEEE80211_MSG_HWMP, wh, NULL, + "RANN seq %u < %u", rann->rann_seq, hr->hr_seq); + return; + } + + /* Acceptance criteria: if RANN.seq == stored seq AND + * RANN.metric > stored metric, discard RANN */ + if (HWMP_SEQ_EQ(rann->rann_seq, hr->hr_seq) && + rann->rann_metric > rt->rt_metric) { + IEEE80211_DISCARD(vap, IEEE80211_MSG_HWMP, wh, NULL, + "RANN metric %u > %u", rann->rann_metric, rt->rt_metric); + return; + } + } + + /* RANN ACCEPTED */ + + ieee80211_hwmp_rannint = rann->rann_interval; /* XXX: mtx lock? */ + metric = rann->rann_metric + ms->ms_pmetric->mpm_metric(ni); + if (rt == NULL) { - hwmp_discover(vap, rann->rann_addr, NULL); - return; + rt = ieee80211_mesh_rt_add(vap, rann->rann_addr); + if (rt == NULL) { + IEEE80211_DISCARD(vap, IEEE80211_MSG_HWMP, wh, NULL, + "unable to add mac for RANN root %6D", + rann->rann_addr, ":"); + vap->iv_stats.is_mesh_rtaddfailed++; + return; + } } hr = IEEE80211_MESH_ROUTE_PRIV(rt, struct ieee80211_hwmp_route); - if (HWMP_SEQ_GT(rann->rann_seq, hr->hr_seq)) { + /* discovery timeout */ + ieee80211_mesh_rt_update(rt, + ticks_to_msecs(ieee80211_hwmp_roottimeout)); + + preq.preq_flags = IEEE80211_MESHPREQ_FLAGS_AM; + preq.preq_hopcount = 0; + preq.preq_ttl = ms->ms_ttl; + preq.preq_id = 0; /* reserved */ + IEEE80211_ADDR_COPY(preq.preq_origaddr, vap->iv_myaddr); + preq.preq_origseq = ++hs->hs_seq; + preq.preq_lifetime = ieee80211_hwmp_roottimeout; + preq.preq_metric = IEEE80211_MESHLMETRIC_INITIALVAL; + preq.preq_tcount = 1; + preq.preq_targets[0].target_flags = IEEE80211_MESHPREQ_TFLAGS_TO; + /* NB: IEEE80211_MESHPREQ_TFLAGS_USN = 0 implicitly implied */ + IEEE80211_ADDR_COPY(preq.preq_targets[0].target_addr, rann->rann_addr); + preq.preq_targets[0].target_seq = rann->rann_seq; + /* XXX: if rootconfint have not passed, we built this preq in vain */ + hwmp_send_preq(vap->iv_bss, vap->iv_myaddr, wh->i_addr2, &preq, + &hr->hr_lastrootconf, &ieee80211_hwmp_rootconfint); + + /* propagate a RANN */ + if (rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID && + rann->rann_ttl > 1 && + ms->ms_flags & IEEE80211_MESHFLAGS_FWD) { hr->hr_seq = rann->rann_seq; - if (rann->rann_ttl > 1 && - rann->rann_hopcount < hs->hs_maxhops && - (ms->ms_flags & IEEE80211_MESHFLAGS_FWD)) { - memcpy(&prann, rann, sizeof(prann)); - prann.rann_hopcount += 1; - prann.rann_ttl -= 1; - prann.rann_metric += ms->ms_pmetric->mpm_metric(ni); - hwmp_send_rann(vap->iv_bss, vap->iv_myaddr, - broadcastaddr, &prann); - } + memcpy(&prann, rann, sizeof(prann)); + prann.rann_hopcount += 1; + prann.rann_ttl -= 1; + prann.rann_metric += ms->ms_pmetric->mpm_metric(ni); + hwmp_send_rann(vap->iv_bss, vap->iv_myaddr, + broadcastaddr, &prann); } } @@ -1557,6 +1795,64 @@ hwmp_send_rann(struct ieee80211_node *ni, #define PREQ_TFLAGS(n) preq.preq_targets[n].target_flags #define PREQ_TADDR(n) preq.preq_targets[n].target_addr #define PREQ_TSEQ(n) preq.preq_targets[n].target_seq +static void +hwmp_rediscover_cb(void *arg) +{ + struct ieee80211_mesh_route *rt = arg; + struct ieee80211vap *vap = rt->rt_vap; + struct ieee80211_hwmp_state *hs = vap->iv_hwmp; + struct ieee80211_mesh_state *ms = vap->iv_mesh; + struct ieee80211_hwmp_route *hr; + struct ieee80211_meshpreq_ie preq; /* Optimize: storing first preq? */ + + if ((rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID)) + return ; /* nothing to do */ + + hr = IEEE80211_MESH_ROUTE_PRIV(rt, struct ieee80211_hwmp_route); + if (hr->hr_preqretries >= + ieee80211_hwmp_maxpreq_retries) { + IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY, + rt->rt_dest, NULL, "%s", + "no valid path , max number of discovery, send GATE"); + /* TODO: send to known gates */ + vap->iv_stats.is_mesh_fwd_nopath++; + rt->rt_flags = 0; /* Mark invalid */ + return ; /* XXX: flush queue? */ + } + + hr->hr_preqretries++; + + + IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_HWMP, rt->rt_dest, + "start path rediscovery , target seq %u", hr->hr_seq); + /* + * Try to discover the path for this node. + * Group addressed PREQ Case A + */ + preq.preq_flags = 0; + preq.preq_hopcount = 0; + preq.preq_ttl = ms->ms_ttl; + preq.preq_id = ++hs->hs_preqid; + IEEE80211_ADDR_COPY(preq.preq_origaddr, vap->iv_myaddr); + preq.preq_origseq = hr->hr_origseq; + preq.preq_lifetime = ticks_to_msecs(ieee80211_hwmp_pathtimeout); + preq.preq_metric = IEEE80211_MESHLMETRIC_INITIALVAL; + preq.preq_tcount = 1; + IEEE80211_ADDR_COPY(PREQ_TADDR(0), rt->rt_dest); + PREQ_TFLAGS(0) = 0; + if (ieee80211_hwmp_targetonly) + PREQ_TFLAGS(0) |= IEEE80211_MESHPREQ_TFLAGS_TO; + PREQ_TFLAGS(0) |= IEEE80211_MESHPREQ_TFLAGS_USN; + PREQ_TSEQ(0) = 0; /* RESERVED when USN flag is set */ + /* XXX check return value */ + hwmp_send_preq(vap->iv_bss, vap->iv_myaddr, + broadcastaddr, &preq, &hr->hr_lastpreq, + &ieee80211_hwmp_preqminint); + callout_reset(&rt->rt_discovery, + ieee80211_hwmp_net_diameter_traversaltime * 2, + hwmp_rediscover_cb, rt); +} + static struct ieee80211_node * hwmp_discover(struct ieee80211vap *vap, const uint8_t dest[IEEE80211_ADDR_LEN], struct mbuf *m) @@ -1591,12 +1887,29 @@ hwmp_discover(struct ieee80211vap *vap, hr = IEEE80211_MESH_ROUTE_PRIV(rt, struct ieee80211_hwmp_route); if ((rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0) { + if (hr->hr_lastdiscovery != 0 && + (ticks - hr->hr_lastdiscovery < + (ieee80211_hwmp_net_diameter_traversaltime * 2))) { + IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY, + dest, NULL, "%s", + "too frequent discovery requeust"); + /* XXX: stats? */ + goto done; + } + hr->hr_lastdiscovery = ticks; + if (hr->hr_preqretries >= + ieee80211_hwmp_maxpreq_retries) { + IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY, + dest, NULL, "%s", + "no valid path , max number of discovery"); + vap->iv_stats.is_mesh_fwd_nopath++; + goto done; + } + rt->rt_flags = IEEE80211_MESHRT_FLAGS_DISCOVER; + hr->hr_preqretries++; if (hr->hr_origseq == 0) hr->hr_origseq = ++hs->hs_seq; rt->rt_metric = IEEE80211_MESHLMETRIC_INITIALVAL; - rt->rt_lifetime = - ticks_to_msecs(ieee80211_hwmp_pathtimeout); - /* XXX check preq retries */ sendpreq = 1; IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_HWMP, dest, "start path discovery (src %s), target seq %u", @@ -1607,26 +1920,29 @@ hwmp_discover(struct ieee80211vap *vap, * Try to discover the path for this node. * Group addressed PREQ Case A */ - preq.preq_flags = IEEE80211_MESHPREQ_FLAGS_AM; + preq.preq_flags = 0; preq.preq_hopcount = 0; preq.preq_ttl = ms->ms_ttl; preq.preq_id = ++hs->hs_preqid; IEEE80211_ADDR_COPY(preq.preq_origaddr, vap->iv_myaddr); preq.preq_origseq = hr->hr_origseq; - preq.preq_lifetime = rt->rt_lifetime; - preq.preq_metric = rt->rt_metric; + preq.preq_lifetime = + ticks_to_msecs(ieee80211_hwmp_pathtimeout); + preq.preq_metric = IEEE80211_MESHLMETRIC_INITIALVAL; preq.preq_tcount = 1; IEEE80211_ADDR_COPY(PREQ_TADDR(0), dest); PREQ_TFLAGS(0) = 0; if (ieee80211_hwmp_targetonly) PREQ_TFLAGS(0) |= IEEE80211_MESHPREQ_TFLAGS_TO; - if (ieee80211_hwmp_replyforward) - PREQ_TFLAGS(0) |= IEEE80211_MESHPREQ_TFLAGS_RF; PREQ_TFLAGS(0) |= IEEE80211_MESHPREQ_TFLAGS_USN; - PREQ_TSEQ(0) = hr->hr_seq; + PREQ_TSEQ(0) = 0; /* RESERVED when USN flag is set */ /* XXX check return value */ hwmp_send_preq(vap->iv_bss, vap->iv_myaddr, - broadcastaddr, &preq); + broadcastaddr, &preq, &hr->hr_lastpreq, + &ieee80211_hwmp_preqminint); + callout_reset(&rt->rt_discovery, + ieee80211_hwmp_net_diameter_traversaltime * 2, + hwmp_rediscover_cb, rt); } if (rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) ni = ieee80211_find_txnode(vap, rt->rt_nexthop); diff --git a/sys/net80211/ieee80211_input.c b/sys/net80211/ieee80211_input.c index b4c4e75a0fa..76b3bedf12b 100644 --- a/sys/net80211/ieee80211_input.c +++ b/sys/net80211/ieee80211_input.c @@ -792,6 +792,24 @@ ieee80211_parse_action(struct ieee80211_node *ni, struct mbuf *m) return EINVAL; } break; + case IEEE80211_ACTION_CAT_SELF_PROT: + /* If TA or RA group address discard silently */ + if (IEEE80211_IS_MULTICAST(wh->i_addr1) || + IEEE80211_IS_MULTICAST(wh->i_addr2)) + return EINVAL; + /* + * XXX: Should we verify complete length now or it is + * to varying in sizes? + */ + switch (ia->ia_action) { + case IEEE80211_ACTION_MESHPEERING_CONFIRM: + case IEEE80211_ACTION_MESHPEERING_CLOSE: + /* is not a peering candidate (yet) */ + if (ni == vap->iv_bss) + return EINVAL; + break; + } + break; #endif } return 0; diff --git a/sys/net80211/ieee80211_ioctl.h b/sys/net80211/ieee80211_ioctl.h index 7fa895ad837..2214b333f6e 100644 --- a/sys/net80211/ieee80211_ioctl.h +++ b/sys/net80211/ieee80211_ioctl.h @@ -339,8 +339,9 @@ enum { struct ieee80211req_mesh_route { uint8_t imr_flags; -#define IEEE80211_MESHRT_FLAGS_VALID 0x01 -#define IEEE80211_MESHRT_FLAGS_PROXY 0x02 +#define IEEE80211_MESHRT_FLAGS_DISCOVER 0x01 +#define IEEE80211_MESHRT_FLAGS_VALID 0x02 +#define IEEE80211_MESHRT_FLAGS_PROXY 0x04 uint8_t imr_dest[IEEE80211_ADDR_LEN]; uint8_t imr_nexthop[IEEE80211_ADDR_LEN]; uint16_t imr_nhops; @@ -709,6 +710,7 @@ struct ieee80211req { #define IEEE80211_IOC_MESH_PR_SIG 178 /* mesh sig protocol */ #define IEEE80211_IOC_MESH_PR_CC 179 /* mesh congestion protocol */ #define IEEE80211_IOC_MESH_PR_AUTH 180 /* mesh auth protocol */ +#define IEEE80211_IOC_MESH_GATE 181 /* mesh gate XXX: 173? */ #define IEEE80211_IOC_HWMP_ROOTMODE 190 /* HWMP root mode */ #define IEEE80211_IOC_HWMP_MAXHOPS 191 /* number of hops before drop */ diff --git a/sys/net80211/ieee80211_mesh.c b/sys/net80211/ieee80211_mesh.c index 53addfbd74c..f0ffc02efd4 100644 --- a/sys/net80211/ieee80211_mesh.c +++ b/sys/net80211/ieee80211_mesh.c @@ -138,6 +138,10 @@ static const struct ieee80211_mesh_proto_metric mesh_metric_airtime = { static struct ieee80211_mesh_proto_path mesh_proto_paths[4]; static struct ieee80211_mesh_proto_metric mesh_proto_metrics[4]; +#define RT_ENTRY_LOCK(rt) mtx_lock(&(rt)->rt_lock) +#define RT_ENTRY_LOCK_ASSERT(rt) mtx_assert(&(rt)->rt_lock, MA_OWNED) +#define RT_ENTRY_UNLOCK(rt) mtx_unlock(&(rt)->rt_lock) + #define MESH_RT_LOCK(ms) mtx_lock(&(ms)->ms_rt_lock) #define MESH_RT_LOCK_ASSERT(ms) mtx_assert(&(ms)->ms_rt_lock, MA_OWNED) #define MESH_RT_UNLOCK(ms) mtx_unlock(&(ms)->ms_rt_lock) @@ -146,6 +150,9 @@ MALLOC_DEFINE(M_80211_MESH_PREQ, "80211preq", "802.11 MESH Path Request frame"); MALLOC_DEFINE(M_80211_MESH_PREP, "80211prep", "802.11 MESH Path Reply frame"); MALLOC_DEFINE(M_80211_MESH_PERR, "80211perr", "802.11 MESH Path Error frame"); +/* The longer one of the lifetime should be stored as new lifetime */ +#define MESH_ROUTE_LIFETIME_MAX(a, b) (a > b ? a : b) + MALLOC_DEFINE(M_80211_MESH_RT, "80211mesh", "802.11s routing table"); /* @@ -168,9 +175,10 @@ mesh_rt_find_locked(struct ieee80211_mesh_state *ms, } static struct ieee80211_mesh_route * -mesh_rt_add_locked(struct ieee80211_mesh_state *ms, +mesh_rt_add_locked(struct ieee80211vap *vap, const uint8_t dest[IEEE80211_ADDR_LEN]) { + struct ieee80211_mesh_state *ms = vap->iv_mesh; struct ieee80211_mesh_route *rt; KASSERT(!IEEE80211_ADDR_EQ(broadcastaddr, dest), @@ -181,9 +189,12 @@ mesh_rt_add_locked(struct ieee80211_mesh_state *ms, rt = malloc(ALIGN(sizeof(struct ieee80211_mesh_route)) + ms->ms_ppath->mpp_privlen, M_80211_MESH_RT, M_NOWAIT | M_ZERO); if (rt != NULL) { + rt->rt_vap = vap; IEEE80211_ADDR_COPY(rt->rt_dest, dest); rt->rt_priv = (void *)ALIGN(&rt[1]); - rt->rt_crtime = ticks; + mtx_init(&rt->rt_lock, "MBSS_RT", "802.11s route entry", MTX_DEF); + callout_init(&rt->rt_discovery, CALLOUT_MPSAFE); + rt->rt_updtime = ticks; /* create time */ TAILQ_INSERT_TAIL(&ms->ms_routes, rt, rt_next); } return rt; @@ -215,11 +226,55 @@ ieee80211_mesh_rt_add(struct ieee80211vap *vap, ("%s: adding self to the routing table", __func__)); MESH_RT_LOCK(ms); - rt = mesh_rt_add_locked(ms, dest); + rt = mesh_rt_add_locked(vap, dest); MESH_RT_UNLOCK(ms); return rt; } +/* + * Update the route lifetime and returns the updated lifetime. + * If new_lifetime is zero and route is timedout it will be invalidated. + * new_lifetime is in msec + */ +int +ieee80211_mesh_rt_update(struct ieee80211_mesh_route *rt, int new_lifetime) +{ + int timesince, now; + uint32_t lifetime = 0; + + KASSERT(rt != NULL, ("route is NULL")); + + now = ticks; + RT_ENTRY_LOCK(rt); + + /* dont clobber a proxy entry gated by us */ + if (rt->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY && rt->rt_nhops == 0) { + RT_ENTRY_UNLOCK(rt); + return rt->rt_lifetime; + } + + timesince = ticks_to_msecs(now - rt->rt_updtime); + rt->rt_updtime = now; + if (timesince >= rt->rt_lifetime) { + if (new_lifetime != 0) { + rt->rt_lifetime = new_lifetime; + } + else { + rt->rt_flags &= ~IEEE80211_MESHRT_FLAGS_VALID; + rt->rt_lifetime = 0; + } + } else { + /* update what is left of lifetime */ + rt->rt_lifetime = rt->rt_lifetime - timesince; + rt->rt_lifetime = MESH_ROUTE_LIFETIME_MAX( + new_lifetime, rt->rt_lifetime); + } + lifetime = rt->rt_lifetime; + RT_ENTRY_UNLOCK(rt); + + return lifetime; +} + /* * Add a proxy route (as needed) for the specified destination. */ @@ -233,7 +288,7 @@ ieee80211_mesh_proxy_check(struct ieee80211vap *vap, MESH_RT_LOCK(ms); rt = mesh_rt_find_locked(ms, dest); if (rt == NULL) { - rt = mesh_rt_add_locked(ms, dest); + rt = mesh_rt_add_locked(vap, dest); if (rt == NULL) { IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_MESH, dest, "%s", "unable to add proxy entry"); @@ -241,12 +296,14 @@ ieee80211_mesh_proxy_check(struct ieee80211vap *vap, } else { IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_MESH, dest, "%s", "add proxy entry"); + IEEE80211_ADDR_COPY(rt->rt_mesh_gate, vap->iv_myaddr); IEEE80211_ADDR_COPY(rt->rt_nexthop, vap->iv_myaddr); rt->rt_flags |= IEEE80211_MESHRT_FLAGS_VALID | IEEE80211_MESHRT_FLAGS_PROXY; } - /* XXX assert PROXY? */ } else if ((rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0) { + KASSERT(rt->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY, + ("no proxy flag for poxy entry")); struct ieee80211com *ic = vap->iv_ic; /* * Fix existing entry created by received frames from @@ -271,6 +328,13 @@ static __inline void mesh_rt_del(struct ieee80211_mesh_state *ms, struct ieee80211_mesh_route *rt) { TAILQ_REMOVE(&ms->ms_routes, rt, rt_next); + /* + * Grab the lock before destroying it, to be sure no one else + * is holding the route. + */ + RT_ENTRY_LOCK(rt); + callout_drain(&rt->rt_discovery); + mtx_destroy(&rt->rt_lock); free(rt, M_80211_MESH_RT); } @@ -284,6 +348,13 @@ ieee80211_mesh_rt_del(struct ieee80211vap *vap, MESH_RT_LOCK(ms); TAILQ_FOREACH_SAFE(rt, &ms->ms_routes, rt_next, next) { if (IEEE80211_ADDR_EQ(rt->rt_dest, dest)) { + if (rt->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY) { + ms->ms_ppath->mpp_senderror(vap, dest, rt, + IEEE80211_REASON_MESH_PERR_NO_PROXY); + } else { + ms->ms_ppath->mpp_senderror(vap, dest, rt, + IEEE80211_REASON_MESH_PERR_DEST_UNREACH); + } mesh_rt_del(ms, rt); MESH_RT_UNLOCK(ms); return; @@ -335,8 +406,11 @@ mesh_rt_flush_invalid(struct ieee80211vap *vap) return; MESH_RT_LOCK(ms); TAILQ_FOREACH_SAFE(rt, &ms->ms_routes, rt_next, next) { - if ((rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0 && - ticks - rt->rt_crtime >= ms->ms_ppath->mpp_inact) + /* Discover paths will be deleted by their own callout */ + if (rt->rt_flags & IEEE80211_MESHRT_FLAGS_DISCOVER) + continue; + ieee80211_mesh_rt_update(rt, 0); + if ((rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0) mesh_rt_del(ms, rt); } MESH_RT_UNLOCK(ms); @@ -430,25 +504,25 @@ ieee80211_mesh_init(void) /* * Register action frame handlers. */ - ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPEERING, + ieee80211_recv_action_register(IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_OPEN, mesh_recv_action_meshpeering_open); - ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPEERING, + ieee80211_recv_action_register(IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, mesh_recv_action_meshpeering_confirm); - ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPEERING, + ieee80211_recv_action_register(IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, mesh_recv_action_meshpeering_close); ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESH, IEEE80211_ACTION_MESH_LMETRIC, mesh_recv_action_meshlmetric); - ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESHPEERING, + ieee80211_send_action_register(IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_OPEN, mesh_send_action_meshpeering_open); - ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESHPEERING, + ieee80211_send_action_register(IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, mesh_send_action_meshpeering_confirm); - ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESHPEERING, + ieee80211_send_action_register(IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, mesh_send_action_meshpeering_close); ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESH, @@ -485,7 +559,7 @@ mesh_vdetach_peers(void *arg, struct ieee80211_node *ni) args[1] = ni->ni_mllid; args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); } @@ -856,9 +930,14 @@ mesh_forward(struct ieee80211vap *vap, struct mbuf *m, struct ieee80211_node *ni; int err; - if (mc->mc_ttl == 0) { + /* + * mesh ttl of 1 means we are the last one receving it, + * according to amendment we decrement and then check if + * 0, if so we dont forward. + */ + if (mc->mc_ttl < 1) { IEEE80211_NOTE_FRAME(vap, IEEE80211_MSG_MESH, wh, - "%s", "frame not fwd'd, ttl 0"); + "%s", "frame not fwd'd, ttl 1"); vap->iv_stats.is_mesh_fwd_ttl++; return; } @@ -898,8 +977,16 @@ mesh_forward(struct ieee80211vap *vap, struct mbuf *m, } else { ni = mesh_find_txnode(vap, whcopy->i_addr3); if (ni == NULL) { + /* + * [Optional] any of the following three actions: + * o silently discard + * o trigger a path discovery + * o inform TA that meshDA is unknown. + */ IEEE80211_NOTE_FRAME(vap, IEEE80211_MSG_MESH, wh, "%s", "frame not fwd'd, no path"); + ms->ms_ppath->mpp_senderror(vap, whcopy->i_addr3, NULL, + IEEE80211_REASON_MESH_PERR_NO_FI); vap->iv_stats.is_mesh_fwd_nopath++; m_freem(mcopy); return; @@ -926,9 +1013,10 @@ mesh_forward(struct ieee80211vap *vap, struct mbuf *m, static struct mbuf * mesh_decap(struct ieee80211vap *vap, struct mbuf *m, int hdrlen, int meshdrlen) { -#define WHDIR(wh) ((wh)->i_fc[1] & IEEE80211_FC1_DIR_MASK) +#define WHDIR(wh) ((wh)->i_fc[1] & IEEE80211_FC1_DIR_MASK) +#define MC01(mc) ((const struct ieee80211_meshcntl_ae01 *)mc) uint8_t b[sizeof(struct ieee80211_qosframe_addr4) + - sizeof(struct ieee80211_meshcntl_ae11)]; + sizeof(struct ieee80211_meshcntl_ae10)]; const struct ieee80211_qosframe_addr4 *wh; const struct ieee80211_meshcntl_ae10 *mc; struct ether_header *eh; @@ -962,13 +1050,14 @@ mesh_decap(struct ieee80211vap *vap, struct mbuf *m, int hdrlen, int meshdrlen) m_adj(m, hdrlen - sizeof(*eh)); } eh = mtod(m, struct ether_header *); - ae = mc->mc_flags & 3; + ae = mc->mc_flags & IEEE80211_MESH_AE_MASK; if (WHDIR(wh) == IEEE80211_FC1_DIR_FROMDS) { IEEE80211_ADDR_COPY(eh->ether_dhost, wh->i_addr1); - if (ae == 0) { + if (ae == IEEE80211_MESH_AE_00) { IEEE80211_ADDR_COPY(eh->ether_shost, wh->i_addr3); - } else if (ae == 1) { - IEEE80211_ADDR_COPY(eh->ether_shost, mc->mc_addr4); + } else if (ae == IEEE80211_MESH_AE_01) { + IEEE80211_ADDR_COPY(eh->ether_shost, + MC01(mc)->mc_addr4); } else { IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY, (const struct ieee80211_frame *)wh, NULL, @@ -978,12 +1067,12 @@ mesh_decap(struct ieee80211vap *vap, struct mbuf *m, int hdrlen, int meshdrlen) return NULL; } } else { - if (ae == 0) { + if (ae == IEEE80211_MESH_AE_00) { IEEE80211_ADDR_COPY(eh->ether_dhost, wh->i_addr3); IEEE80211_ADDR_COPY(eh->ether_shost, wh->i_addr4); - } else if (ae == 2) { - IEEE80211_ADDR_COPY(eh->ether_dhost, mc->mc_addr4); - IEEE80211_ADDR_COPY(eh->ether_shost, mc->mc_addr5); + } else if (ae == IEEE80211_MESH_AE_10) { + IEEE80211_ADDR_COPY(eh->ether_dhost, mc->mc_addr5); + IEEE80211_ADDR_COPY(eh->ether_shost, mc->mc_addr6); } else { IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY, (const struct ieee80211_frame *)wh, NULL, @@ -1005,7 +1094,8 @@ mesh_decap(struct ieee80211vap *vap, struct mbuf *m, int hdrlen, int meshdrlen) eh->ether_type = htons(m->m_pkthdr.len - sizeof(*eh)); } return m; -#undef WDIR +#undef WDIR +#undef MC01 } /* @@ -1021,12 +1111,13 @@ mesh_isucastforme(struct ieee80211vap *vap, const struct ieee80211_frame *wh, KASSERT((wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS, ("bad dir 0x%x:0x%x", wh->i_fc[0], wh->i_fc[1])); - KASSERT(ae == 0 || ae == 2, ("bad AE %d", ae)); - if (ae == 2) { /* ucast w/ proxy */ + KASSERT(ae == IEEE80211_MESH_AE_00 || ae == IEEE80211_MESH_AE_10, + ("bad AE %d", ae)); + if (ae == IEEE80211_MESH_AE_10) { /* ucast w/ proxy */ const struct ieee80211_meshcntl_ae10 *mc10 = (const struct ieee80211_meshcntl_ae10 *) mc; struct ieee80211_mesh_route *rt = - ieee80211_mesh_rt_find(vap, mc10->mc_addr4); + ieee80211_mesh_rt_find(vap, mc10->mc_addr5); /* check for proxy route to ourself */ return (rt != NULL && (rt->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY)); @@ -1034,19 +1125,172 @@ mesh_isucastforme(struct ieee80211vap *vap, const struct ieee80211_frame *wh, return IEEE80211_ADDR_EQ(wh->i_addr3, vap->iv_myaddr); } +/* + * Verifies transmitter, updates lifetime, precursor list and forwards data. + * > 0 means we have forwarded data and no need to process locally + * == 0 means we want to process locally (and we may have forwarded data + * < 0 means there was an error and data should be discarded + */ +static int +mesh_recv_indiv_data_to_fwrd(struct ieee80211vap *vap, struct mbuf *m, + struct ieee80211_frame *wh, const struct ieee80211_meshcntl *mc) +{ + struct ieee80211_qosframe_addr4 *qwh; + struct ieee80211_mesh_state *ms = vap->iv_mesh; + struct ieee80211_mesh_route *rt_meshda, *rt_meshsa; + + qwh = (struct ieee80211_qosframe_addr4 *)wh; + + /* + * TODO: + * o verify addr2 is a legitimate transmitter + * o lifetime of precursor of addr3 (addr2) is max(init, curr) + * o lifetime of precursor of addr4 (nexthop) is max(init, curr) + */ + + /* set lifetime of addr3 (meshDA) to initial value */ + rt_meshda = ieee80211_mesh_rt_find(vap, qwh->i_addr3); + if (rt_meshda == NULL) { + IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_MESH, qwh->i_addr2, + "no route to meshDA(%6D)", qwh->i_addr3, ":"); + /* + * [Optional] any of the following three actions: + * o silently discard [X] + * o trigger a path discovery [ ] + * o inform TA that meshDA is unknown. [ ] + */ + /* XXX: stats */ + return (-1); + } + + ieee80211_mesh_rt_update(rt_meshda, ticks_to_msecs( + ms->ms_ppath->mpp_inact)); + + /* set lifetime of addr4 (meshSA) to initial value */ + rt_meshsa = ieee80211_mesh_rt_find(vap, qwh->i_addr4); + KASSERT(rt_meshsa != NULL, ("no route")); + ieee80211_mesh_rt_update(rt_meshsa, ticks_to_msecs( + ms->ms_ppath->mpp_inact)); + + mesh_forward(vap, m, mc); + return (1); /* dont process locally */ +} + +/* + * Verifies transmitter, updates lifetime, precursor list and process data + * locally, if data is is proxy with AE = 10 it could mean data should go + * on another mesh path or data should be forwarded to the DS. + * + * > 0 means we have forwarded data and no need to process locally + * == 0 means we want to process locally (and we may have forwarded data + * < 0 means there was an error and data should be discarded + */ +static int +mesh_recv_indiv_data_to_me(struct ieee80211vap *vap, struct mbuf *m, + struct ieee80211_frame *wh, const struct ieee80211_meshcntl *mc) +{ + struct ieee80211_qosframe_addr4 *qwh; + const struct ieee80211_meshcntl_ae10 *mc10; + struct ieee80211_mesh_state *ms = vap->iv_mesh; + struct ieee80211_mesh_route *rt; + int ae; + + qwh = (struct ieee80211_qosframe_addr4 *)wh; + mc10 = (const struct ieee80211_meshcntl_ae10 *)mc; + + /* + * TODO: + * o verify addr2 is a legitimate transmitter + * o lifetime of precursor entry is max(init, curr) + */ + + /* set lifetime of addr4 (meshSA) to initial value */ + rt = ieee80211_mesh_rt_find(vap, qwh->i_addr4); + KASSERT(rt != NULL, ("no route")); + ieee80211_mesh_rt_update(rt, ticks_to_msecs(ms->ms_ppath->mpp_inact)); + rt = NULL; + + ae = mc10->mc_flags & IEEE80211_MESH_AE_MASK; + KASSERT(ae == IEEE80211_MESH_AE_00 || + ae == IEEE80211_MESH_AE_10, ("bad AE %d", ae)); + if (ae == IEEE80211_MESH_AE_10) { + if (IEEE80211_ADDR_EQ(mc10->mc_addr5, qwh->i_addr3)) { + return (0); /* process locally */ + } + + rt = ieee80211_mesh_rt_find(vap, mc10->mc_addr5); + if (rt != NULL && + (rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) && + (rt->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY) == 0) { + /* + * Forward on another mesh-path, according to + * amendment as specified in 9.32.4.1 + */ + IEEE80211_ADDR_COPY(qwh->i_addr3, mc10->mc_addr5); + mesh_forward(vap, m, + (const struct ieee80211_meshcntl *)mc10); + return (1); /* dont process locally */ + } + /* + * All other cases: forward of MSDUs from the MBSS to DS indiv. + * addressed according to 13.11.3.2. + */ + } + return (0); /* process locally */ +} + +/* + * Try to forward the group addressed data on to other mesh STAs, and + * also to the DS. + * + * > 0 means we have forwarded data and no need to process locally + * == 0 means we want to process locally (and we may have forwarded data + * < 0 means there was an error and data should be discarded + */ +static int +mesh_recv_group_data(struct ieee80211vap *vap, struct mbuf *m, + struct ieee80211_frame *wh, const struct ieee80211_meshcntl *mc) +{ +#define MC01(mc) ((const struct ieee80211_meshcntl_ae01 *)mc) + struct ieee80211_mesh_state *ms = vap->iv_mesh; + + mesh_forward(vap, m, mc); + + if(mc->mc_ttl > 0) { + if (mc->mc_flags & IEEE80211_MESH_AE_01) { + /* + * Forward of MSDUs from the MBSS to DS group addressed + * (according to 13.11.3.2) + * This happens by delivering the packet, and a bridge + * will sent it on another port member. + */ + if (ms->ms_flags & IEEE80211_MESHFLAGS_GATE && + ms->ms_flags & IEEE80211_MESHFLAGS_FWD) + IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_MESH, + MC01(mc)->mc_addr4, "%s", + "forward from MBSS to the DS"); + } + } + return (0); /* process locally */ +#undef MC01 +} + static int mesh_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) { #define HAS_SEQ(type) ((type & 0x4) == 0) +#define MC01(mc) ((const struct ieee80211_meshcntl_ae01 *)mc) +#define MC10(mc) ((const struct ieee80211_meshcntl_ae10 *)mc) struct ieee80211vap *vap = ni->ni_vap; struct ieee80211com *ic = ni->ni_ic; struct ifnet *ifp = vap->iv_ifp; struct ieee80211_frame *wh; const struct ieee80211_meshcntl *mc; - int hdrspace, meshdrlen, need_tap; - uint8_t dir, type, subtype; + int hdrspace, meshdrlen, need_tap, error; + uint8_t dir, type, subtype, ae; uint32_t seq; - uint8_t *addr, qos[2]; + const uint8_t *addr; + uint8_t qos[2]; ieee80211_seq rxseq; KASSERT(ni != NULL, ("null node")); @@ -1135,7 +1379,7 @@ mesh_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) ni->ni_mlstate); vap->iv_stats.is_mesh_nolink++; goto out; - } + } if (dir != IEEE80211_FC1_DIR_FROMDS && dir != IEEE80211_FC1_DIR_DSTODS) { IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT, @@ -1217,12 +1461,28 @@ mesh_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) */ mc = (const struct ieee80211_meshcntl *) (mtod(m, const uint8_t *) + hdrspace); + ae = mc->mc_flags & IEEE80211_MESH_AE_MASK; meshdrlen = sizeof(struct ieee80211_meshcntl) + - (mc->mc_flags & 3) * IEEE80211_ADDR_LEN; + ae * IEEE80211_ADDR_LEN; hdrspace += meshdrlen; + + /* pull complete hdrspace = ieee80211_hdrspace + meshcontrol */ + if ((meshdrlen > sizeof(struct ieee80211_meshcntl)) && + (m->m_len < hdrspace) && + ((m = m_pullup(m, hdrspace)) == NULL)) { + IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY, + ni->ni_macaddr, NULL, + "data too short: expecting %u", hdrspace); + vap->iv_stats.is_rx_tooshort++; + goto out; /* XXX */ + } + /* XXX: are we sure there is no reallocating after m_pullup? */ + seq = LE_READ_4(mc->mc_seq); if (IEEE80211_IS_MULTICAST(wh->i_addr1)) addr = wh->i_addr3; + else if (ae == IEEE80211_MESH_AE_01) + addr = MC01(mc)->mc_addr4; else addr = ((struct ieee80211_qosframe_addr4 *)wh)->i_addr4; if (IEEE80211_ADDR_EQ(vap->iv_myaddr, addr)) { @@ -1236,17 +1496,22 @@ mesh_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) goto out; } - /* - * Potentially forward packet. See table s36 (p140) - * for the rules. XXX tap fwd'd packets not for us? - */ - if (dir == IEEE80211_FC1_DIR_FROMDS || - !mesh_isucastforme(vap, wh, mc)) { - mesh_forward(vap, m, mc); - if (dir == IEEE80211_FC1_DIR_DSTODS) - goto out; - /* NB: fall thru to deliver mcast frames locally */ - } + /* This code "routes" the frame to the right control path */ + if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { + if (IEEE80211_ADDR_EQ(vap->iv_myaddr, wh->i_addr3)) + error = + mesh_recv_indiv_data_to_me(vap, m, wh, mc); + else if (IEEE80211_IS_MULTICAST(wh->i_addr3)) + error = mesh_recv_group_data(vap, m, wh, mc); + else + error = mesh_recv_indiv_data_to_fwrd(vap, m, + wh, mc); + } else + error = mesh_recv_group_data(vap, m, wh, mc); + if (error < 0) + goto err; + else if (error > 0) + goto out; if (ieee80211_radiotap_active_vap(vap)) ieee80211_radiotap_rx(vap, m); @@ -1328,6 +1593,9 @@ out: m_freem(m); } return type; +#undef HAS_SEQ +#undef MC01 +#undef MC10 } static void @@ -1338,6 +1606,7 @@ mesh_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m0, int subtype, struct ieee80211_mesh_state *ms = vap->iv_mesh; struct ieee80211com *ic = ni->ni_ic; struct ieee80211_frame *wh; + struct ieee80211_mesh_route *rt; uint8_t *frm, *efrm; wh = mtod(m0, struct ieee80211_frame *); @@ -1430,20 +1699,41 @@ mesh_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m0, int subtype, * XXX backoff on repeated failure */ if (ni != vap->iv_bss && - (ms->ms_flags & IEEE80211_MESHFLAGS_AP) && - ni->ni_mlstate == IEEE80211_NODE_MESH_IDLE) { - uint16_t args[1]; + (ms->ms_flags & IEEE80211_MESHFLAGS_AP)) { + switch (ni->ni_mlstate) { + case IEEE80211_NODE_MESH_IDLE: + { + uint16_t args[1]; - ni->ni_mlpid = mesh_generateid(vap); - if (ni->ni_mlpid == 0) - return; - mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENSNT); - args[0] = ni->ni_mlpid; - ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, - IEEE80211_ACTION_MESHPEERING_OPEN, args); - ni->ni_mlrcnt = 0; - mesh_peer_timeout_setup(ni); + ni->ni_mlpid = mesh_generateid(vap); + if (ni->ni_mlpid == 0) + return; + mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENSNT); + args[0] = ni->ni_mlpid; + ieee80211_send_action(ni, + IEEE80211_ACTION_CAT_SELF_PROT, + IEEE80211_ACTION_MESHPEERING_OPEN, args); + ni->ni_mlrcnt = 0; + mesh_peer_timeout_setup(ni); + break; + } + case IEEE80211_NODE_MESH_ESTABLISHED: + { + /* + * Valid beacon from a peer mesh STA + * bump TA lifetime + */ + rt = ieee80211_mesh_rt_find(vap, wh->i_addr2); + if(rt != NULL) { + ieee80211_mesh_rt_update(rt, + ticks_to_msecs( + ms->ms_ppath->mpp_inact)); + } + break; + } + default: + break; /* ignore */ + } } break; } @@ -1573,8 +1863,7 @@ mesh_recv_ctl(struct ieee80211_node *ni, struct mbuf *m, int subtype) } /* - * Parse meshpeering action ie's for open+confirm frames; the - * important bits are returned in the supplied structure. + * Parse meshpeering action ie's for MPM frames */ static const struct ieee80211_meshpeer_ie * mesh_parse_meshpeering_action(struct ieee80211_node *ni, @@ -1584,7 +1873,9 @@ mesh_parse_meshpeering_action(struct ieee80211_node *ni, { struct ieee80211vap *vap = ni->ni_vap; const struct ieee80211_meshpeer_ie *mpie; + uint16_t args[3]; const uint8_t *meshid, *meshconf, *meshpeer; + uint8_t sendclose = 0; /* 1 = MPM frame rejected, close will be sent */ meshid = meshconf = meshpeer = NULL; while (efrm - frm > 1) { @@ -1600,15 +1891,28 @@ mesh_parse_meshpeering_action(struct ieee80211_node *ni, meshpeer = frm; mpie = (const struct ieee80211_meshpeer_ie *) frm; memset(mp, 0, sizeof(*mp)); + mp->peer_len = mpie->peer_len; + mp->peer_proto = LE_READ_2(&mpie->peer_proto); mp->peer_llinkid = LE_READ_2(&mpie->peer_llinkid); - /* NB: peer link ID is optional on these frames */ - if (subtype == IEEE80211_MESH_PEER_LINK_CLOSE && - mpie->peer_len == 8) { - mp->peer_linkid = 0; - mp->peer_rcode = LE_READ_2(&mpie->peer_linkid); - } else { - mp->peer_linkid = LE_READ_2(&mpie->peer_linkid); - mp->peer_rcode = LE_READ_2(&mpie->peer_rcode); + switch (subtype) { + case IEEE80211_ACTION_MESHPEERING_CONFIRM: + mp->peer_linkid = + LE_READ_2(&mpie->peer_linkid); + break; + case IEEE80211_ACTION_MESHPEERING_CLOSE: + /* NB: peer link ID is optional */ + if (mpie->peer_len == + (IEEE80211_MPM_BASE_SZ + 2)) { + mp->peer_linkid = 0; + mp->peer_rcode = + LE_READ_2(&mpie->peer_linkid); + } else { + mp->peer_linkid = + LE_READ_2(&mpie->peer_linkid); + mp->peer_rcode = + LE_READ_2(&mpie->peer_rcode); + } + break; } break; } @@ -1616,22 +1920,46 @@ mesh_parse_meshpeering_action(struct ieee80211_node *ni, } /* - * Verify the contents of the frame. Action frames with - * close subtype don't have a Mesh Configuration IE. - * If if fails validation, close the peer link. + * Verify the contents of the frame. + * If it fails validation, close the peer link. */ - KASSERT(meshpeer != NULL && - subtype != IEEE80211_ACTION_MESHPEERING_CLOSE, - ("parsing close action")); - - if (mesh_verify_meshid(vap, meshid) || - mesh_verify_meshpeer(vap, subtype, meshpeer) || - mesh_verify_meshconf(vap, meshconf)) { - uint16_t args[3]; + if (mesh_verify_meshpeer(vap, subtype, (const uint8_t *)mp)) { + sendclose = 1; + IEEE80211_DISCARD(vap, + IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH, + wh, NULL, "%s", "MPM validation failed"); + } + /* If meshid is not the same reject any frames type. */ + if (sendclose == 0 && mesh_verify_meshid(vap, meshid)) { + sendclose = 1; IEEE80211_DISCARD(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH, wh, NULL, "%s", "not for our mesh"); + if (subtype == IEEE80211_ACTION_MESHPEERING_CLOSE) { + /* + * Standard not clear about this, if we dont ignore + * there will be an endless loop between nodes sending + * CLOSE frames between each other with wrong meshid. + * Discard and timers will bring FSM to IDLE state. + */ + return NULL; + } + } + + /* + * Close frames are accepted if meshid is the same. + * Verify the other two types. + */ + if (sendclose == 0 && subtype != IEEE80211_ACTION_MESHPEERING_CLOSE && + mesh_verify_meshconf(vap, meshconf)) { + sendclose = 1; + IEEE80211_DISCARD(vap, + IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH, + wh, NULL, "%s", "configuration missmatch"); + } + + if (sendclose) { vap->iv_stats.is_rx_mgtdiscard++; switch (ni->ni_mlstate) { case IEEE80211_NODE_MESH_IDLE: @@ -1644,9 +1972,17 @@ mesh_parse_meshpeering_action(struct ieee80211_node *ni, case IEEE80211_NODE_MESH_CONFIRMRCV: args[0] = ni->ni_mlpid; args[1] = ni->ni_mllid; - args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; + /* Reason codes for rejection */ + switch (subtype) { + case IEEE80211_ACTION_MESHPEERING_OPEN: + args[2] = IEEE80211_REASON_MESH_CPVIOLATION; + break; + case IEEE80211_ACTION_MESHPEERING_CONFIRM: + args[2] = IEEE80211_REASON_MESH_INCONS_PARAMS; + break; + } ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -1655,6 +1991,7 @@ mesh_parse_meshpeering_action(struct ieee80211_node *ni, } return NULL; } + return (const struct ieee80211_meshpeer_ie *) mp; } @@ -1664,6 +2001,7 @@ mesh_recv_action_meshpeering_open(struct ieee80211_node *ni, const uint8_t *frm, const uint8_t *efrm) { struct ieee80211vap *vap = ni->ni_vap; + struct ieee80211_mesh_state *ms = vap->iv_mesh; struct ieee80211_meshpeer_ie ie; const struct ieee80211_meshpeer_ie *meshpeer; uint16_t args[3]; @@ -1681,6 +2019,19 @@ mesh_recv_action_meshpeering_open(struct ieee80211_node *ni, switch (ni->ni_mlstate) { case IEEE80211_NODE_MESH_IDLE: + /* Reject open request if reached our maximum neighbor count */ + if (ms->ms_neighbors >= IEEE80211_MESH_MAX_NEIGHBORS) { + args[0] = meshpeer->peer_llinkid; + args[1] = 0; + args[2] = IEEE80211_REASON_MESH_MAX_PEERS; + ieee80211_send_action(ni, + IEEE80211_ACTION_CAT_SELF_PROT, + IEEE80211_ACTION_MESHPEERING_CLOSE, + args); + /* stay in IDLE state */ + return (0); + } + /* Open frame accepted */ mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENRCV); ni->ni_mllid = meshpeer->peer_llinkid; ni->ni_mlpid = mesh_generateid(vap); @@ -1689,13 +2040,13 @@ mesh_recv_action_meshpeering_open(struct ieee80211_node *ni, args[0] = ni->ni_mlpid; /* Announce we're open too... */ ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_OPEN, args); /* ...and confirm the link. */ args[0] = ni->ni_mlpid; args[1] = ni->ni_mllid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, args); mesh_peer_timeout_setup(ni); @@ -1707,7 +2058,7 @@ mesh_recv_action_meshpeering_open(struct ieee80211_node *ni, args[1] = ni->ni_mlpid; args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -1718,7 +2069,7 @@ mesh_recv_action_meshpeering_open(struct ieee80211_node *ni, args[0] = ni->ni_mlpid; args[1] = ni->ni_mllid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, args); break; @@ -1728,7 +2079,7 @@ mesh_recv_action_meshpeering_open(struct ieee80211_node *ni, args[0] = ni->ni_mlpid; args[1] = ni->ni_mllid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, args); /* NB: don't setup/clear any timeout */ @@ -1740,7 +2091,7 @@ mesh_recv_action_meshpeering_open(struct ieee80211_node *ni, args[1] = ni->ni_mllid; args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); mesh_linkchange(ni, @@ -1753,7 +2104,7 @@ mesh_recv_action_meshpeering_open(struct ieee80211_node *ni, args[0] = ni->ni_mlpid; args[1] = ni->ni_mllid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, args); mesh_peer_timeout_stop(ni); @@ -1764,7 +2115,7 @@ mesh_recv_action_meshpeering_open(struct ieee80211_node *ni, args[1] = ni->ni_mlpid; args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -1774,16 +2125,17 @@ mesh_recv_action_meshpeering_open(struct ieee80211_node *ni, args[0] = ni->ni_mlpid; args[1] = ni->ni_mllid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CONFIRM, args); break; case IEEE80211_NODE_MESH_HOLDING: args[0] = ni->ni_mlpid; args[1] = meshpeer->peer_llinkid; - args[2] = IEEE80211_REASON_MESH_MAX_RETRIES; + /* Standard not clear about what the reaason code should be */ + args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); break; @@ -1819,13 +2171,15 @@ mesh_recv_action_meshpeering_confirm(struct ieee80211_node *ni, break; case IEEE80211_NODE_MESH_OPENSNT: mesh_linkchange(ni, IEEE80211_NODE_MESH_CONFIRMRCV); + mesh_peer_timeout_setup(ni); break; case IEEE80211_NODE_MESH_HOLDING: args[0] = ni->ni_mlpid; args[1] = meshpeer->peer_llinkid; - args[2] = IEEE80211_REASON_MESH_MAX_RETRIES; + /* Standard not clear about what the reaason code should be */ + args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); break; @@ -1835,7 +2189,7 @@ mesh_recv_action_meshpeering_confirm(struct ieee80211_node *ni, args[1] = ni->ni_mllid; args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -1858,8 +2212,23 @@ mesh_recv_action_meshpeering_close(struct ieee80211_node *ni, const struct ieee80211_frame *wh, const uint8_t *frm, const uint8_t *efrm) { + struct ieee80211_meshpeer_ie ie; + const struct ieee80211_meshpeer_ie *meshpeer; uint16_t args[3]; + /* +2 for action + code */ + meshpeer = mesh_parse_meshpeering_action(ni, wh, frm+2, efrm, &ie, + IEEE80211_ACTION_MESHPEERING_CLOSE); + if (meshpeer == NULL) { + return 0; + } + + /* + * XXX: check reason code, for example we could receive + * IEEE80211_REASON_MESH_MAX_PEERS then we should not attempt + * to peer again. + */ + IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH, ni, "%s", "recv PEER CLOSE"); @@ -1875,7 +2244,7 @@ mesh_recv_action_meshpeering_close(struct ieee80211_node *ni, args[1] = ni->ni_mllid; args[2] = IEEE80211_REASON_MESH_CLOSE_RCVD; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -1883,7 +2252,7 @@ mesh_recv_action_meshpeering_close(struct ieee80211_node *ni, break; case IEEE80211_NODE_MESH_HOLDING: mesh_linkchange(ni, IEEE80211_NODE_MESH_IDLE); - mesh_peer_timeout_setup(ni); + mesh_peer_timeout_stop(ni); break; } return 0; @@ -1991,7 +2360,7 @@ mesh_send_action_meshpeering_open(struct ieee80211_node *ni, frm = ieee80211_add_xrates(frm, rs); frm = ieee80211_add_meshid(frm, vap); frm = ieee80211_add_meshconf(frm, vap); - frm = ieee80211_add_meshpeer(frm, IEEE80211_MESH_PEER_LINK_OPEN, + frm = ieee80211_add_meshpeer(frm, IEEE80211_ACTION_MESHPEERING_OPEN, args[0], 0, 0); m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); return mesh_send_action(ni, m); @@ -2059,7 +2428,7 @@ mesh_send_action_meshpeering_confirm(struct ieee80211_node *ni, frm = ieee80211_add_meshid(frm, vap); frm = ieee80211_add_meshconf(frm, vap); frm = ieee80211_add_meshpeer(frm, - IEEE80211_MESH_PEER_LINK_CONFIRM, + IEEE80211_ACTION_MESHPEERING_CONFIRM, args[0], args[1], 0); m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); return mesh_send_action(ni, m); @@ -2101,16 +2470,14 @@ mesh_send_action_meshpeering_close(struct ieee80211_node *ni, * mesh peer close action frame format: * [1] category * [1] action - * [2] reason code * [tlv] mesh id * [tlv] mesh peer link mgmt */ *frm++ = category; *frm++ = action; - ADDSHORT(frm, args[2]); /* reason code */ frm = ieee80211_add_meshid(frm, vap); frm = ieee80211_add_meshpeer(frm, - IEEE80211_MESH_PEER_LINK_CLOSE, + IEEE80211_ACTION_MESHPEERING_CLOSE, args[0], args[1], args[2]); m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); return mesh_send_action(ni, m); @@ -2234,7 +2601,7 @@ mesh_peer_timeout_cb(void *arg) args[0] = ni->ni_mlpid; args[2] = IEEE80211_REASON_MESH_MAX_RETRIES; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_CLOSE, args); ni->ni_mlrcnt = 0; mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); @@ -2242,26 +2609,20 @@ mesh_peer_timeout_cb(void *arg) } else { args[0] = ni->ni_mlpid; ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, + IEEE80211_ACTION_CAT_SELF_PROT, IEEE80211_ACTION_MESHPEERING_OPEN, args); ni->ni_mlrcnt++; mesh_peer_timeout_backoff(ni); } break; case IEEE80211_NODE_MESH_CONFIRMRCV: - if (ni->ni_mlrcnt == ieee80211_mesh_maxretries) { - args[0] = ni->ni_mlpid; - args[2] = IEEE80211_REASON_MESH_CONFIRM_TIMEOUT; - ieee80211_send_action(ni, - IEEE80211_ACTION_CAT_MESHPEERING, - IEEE80211_ACTION_MESHPEERING_CLOSE, args); - ni->ni_mlrcnt = 0; - mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); - mesh_peer_timeout_setup(ni); - } else { - ni->ni_mlrcnt++; - mesh_peer_timeout_setup(ni); - } + args[0] = ni->ni_mlpid; + args[2] = IEEE80211_REASON_MESH_CONFIRM_TIMEOUT; + ieee80211_send_action(ni, + IEEE80211_ACTION_CAT_SELF_PROT, + IEEE80211_ACTION_MESHPEERING_CLOSE, args); + mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); + mesh_peer_timeout_setup(ni); break; case IEEE80211_NODE_MESH_HOLDING: mesh_linkchange(ni, IEEE80211_NODE_MESH_IDLE); @@ -2337,22 +2698,31 @@ mesh_verify_meshpeer(struct ieee80211vap *vap, uint8_t subtype, const struct ieee80211_meshpeer_ie *meshpeer = (const struct ieee80211_meshpeer_ie *) ie; - if (meshpeer == NULL || meshpeer->peer_len < 6 || - meshpeer->peer_len > 10) + if (meshpeer == NULL || + meshpeer->peer_len < IEEE80211_MPM_BASE_SZ || + meshpeer->peer_len > IEEE80211_MPM_MAX_SZ) return 1; + if (meshpeer->peer_proto != IEEE80211_MPPID_MPM) { + IEEE80211_DPRINTF(vap, + IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH, + "Only MPM protocol is supported (proto: 0x%02X)", + meshpeer->peer_proto); + return 1; + } switch (subtype) { - case IEEE80211_MESH_PEER_LINK_OPEN: - if (meshpeer->peer_len != 6) + case IEEE80211_ACTION_MESHPEERING_OPEN: + if (meshpeer->peer_len != IEEE80211_MPM_BASE_SZ) return 1; break; - case IEEE80211_MESH_PEER_LINK_CONFIRM: - if (meshpeer->peer_len != 8) + case IEEE80211_ACTION_MESHPEERING_CONFIRM: + if (meshpeer->peer_len != IEEE80211_MPM_BASE_SZ + 2) return 1; break; - case IEEE80211_MESH_PEER_LINK_CLOSE: - if (meshpeer->peer_len < 8) + case IEEE80211_ACTION_MESHPEERING_CLOSE: + if (meshpeer->peer_len < IEEE80211_MPM_BASE_SZ + 2) return 1; - if (meshpeer->peer_len == 8 && meshpeer->peer_linkid != 0) + if (meshpeer->peer_len == (IEEE80211_MPM_BASE_SZ + 2) && + meshpeer->peer_linkid != 0) return 1; if (meshpeer->peer_rcode == 0) return 1; @@ -2398,9 +2768,10 @@ ieee80211_add_meshconf(uint8_t *frm, struct ieee80211vap *vap) *frm++ = IEEE80211_MESHCONF_SYNC_NEIGHOFF; *frm++ = IEEE80211_MESHCONF_AUTH_DISABLED; /* NB: set the number of neighbors before the rest */ - *frm = (ms->ms_neighbors > 15 ? 15 : ms->ms_neighbors) << 1; - if (ms->ms_flags & IEEE80211_MESHFLAGS_PORTAL) - *frm |= IEEE80211_MESHCONF_FORM_MP; + *frm = (ms->ms_neighbors > IEEE80211_MESH_MAX_NEIGHBORS ? + IEEE80211_MESH_MAX_NEIGHBORS : ms->ms_neighbors) << 1; + if (ms->ms_flags & IEEE80211_MESHFLAGS_GATE) + *frm |= IEEE80211_MESHCONF_FORM_GATE; frm += 1; caps = 0; if (ms->ms_flags & IEEE80211_MESHFLAGS_AP) @@ -2418,34 +2789,29 @@ uint8_t * ieee80211_add_meshpeer(uint8_t *frm, uint8_t subtype, uint16_t localid, uint16_t peerid, uint16_t reason) { - /* XXX change for AH */ - static const uint8_t meshpeerproto[4] = IEEE80211_MESH_PEER_PROTO; KASSERT(localid != 0, ("localid == 0")); *frm++ = IEEE80211_ELEMID_MESHPEER; switch (subtype) { - case IEEE80211_MESH_PEER_LINK_OPEN: - *frm++ = 6; /* length */ - memcpy(frm, meshpeerproto, 4); - frm += 4; - ADDSHORT(frm, localid); /* local ID */ + case IEEE80211_ACTION_MESHPEERING_OPEN: + *frm++ = IEEE80211_MPM_BASE_SZ; /* length */ + ADDSHORT(frm, IEEE80211_MPPID_MPM); /* proto */ + ADDSHORT(frm, localid); /* local ID */ break; - case IEEE80211_MESH_PEER_LINK_CONFIRM: + case IEEE80211_ACTION_MESHPEERING_CONFIRM: KASSERT(peerid != 0, ("sending peer confirm without peer id")); - *frm++ = 8; /* length */ - memcpy(frm, meshpeerproto, 4); - frm += 4; - ADDSHORT(frm, localid); /* local ID */ - ADDSHORT(frm, peerid); /* peer ID */ + *frm++ = IEEE80211_MPM_BASE_SZ + 2; /* length */ + ADDSHORT(frm, IEEE80211_MPPID_MPM); /* proto */ + ADDSHORT(frm, localid); /* local ID */ + ADDSHORT(frm, peerid); /* peer ID */ break; - case IEEE80211_MESH_PEER_LINK_CLOSE: + case IEEE80211_ACTION_MESHPEERING_CLOSE: if (peerid) - *frm++ = 10; /* length */ + *frm++ = IEEE80211_MPM_MAX_SZ; /* length */ else - *frm++ = 8; /* length */ - memcpy(frm, meshpeerproto, 4); - frm += 4; + *frm++ = IEEE80211_MPM_BASE_SZ + 2; /* length */ + ADDSHORT(frm, IEEE80211_MPPID_MPM); /* proto */ ADDSHORT(frm, localid); /* local ID */ if (peerid) ADDSHORT(frm, peerid); /* peer ID */ @@ -2465,7 +2831,7 @@ ieee80211_add_meshpeer(uint8_t *frm, uint8_t subtype, uint16_t localid, */ #define IEEE80211_MESH_MAXOVERHEAD \ (sizeof(struct ieee80211_qosframe_addr4) \ - + sizeof(struct ieee80211_meshcntl_ae11) \ + + sizeof(struct ieee80211_meshcntl_ae10) \ + sizeof(struct llc) \ + IEEE80211_ADDR_LEN \ + IEEE80211_WEP_IVLEN \ @@ -2597,6 +2963,9 @@ mesh_ioctl_get80211(struct ieee80211vap *vap, struct ieee80211req *ireq) case IEEE80211_IOC_MESH_FWRD: ireq->i_val = (ms->ms_flags & IEEE80211_MESHFLAGS_FWD) != 0; break; + case IEEE80211_IOC_MESH_GATE: + ireq->i_val = (ms->ms_flags & IEEE80211_MESHFLAGS_GATE) != 0; + break; case IEEE80211_IOC_MESH_TTL: ireq->i_val = ms->ms_ttl; break; @@ -2625,15 +2994,16 @@ mesh_ioctl_get80211(struct ieee80211vap *vap, struct ieee80211req *ireq) break; imr = (struct ieee80211req_mesh_route *) (p + off); - imr->imr_flags = rt->rt_flags; IEEE80211_ADDR_COPY(imr->imr_dest, rt->rt_dest); IEEE80211_ADDR_COPY(imr->imr_nexthop, rt->rt_nexthop); imr->imr_metric = rt->rt_metric; imr->imr_nhops = rt->rt_nhops; - imr->imr_lifetime = rt->rt_lifetime; + imr->imr_lifetime = + ieee80211_mesh_rt_update(rt, 0); imr->imr_lastmseq = rt->rt_lastmseq; + imr->imr_flags = rt->rt_flags; /* last */ off += sizeof(*imr); } MESH_RT_UNLOCK(ms); @@ -2711,6 +3081,12 @@ mesh_ioctl_set80211(struct ieee80211vap *vap, struct ieee80211req *ireq) else ms->ms_flags &= ~IEEE80211_MESHFLAGS_FWD; break; + case IEEE80211_IOC_MESH_GATE: + if (ireq->i_val) + ms->ms_flags |= IEEE80211_MESHFLAGS_GATE; + else + ms->ms_flags &= ~IEEE80211_MESHFLAGS_GATE; + break; case IEEE80211_IOC_MESH_TTL: ms->ms_ttl = (uint8_t) ireq->i_val; break; diff --git a/sys/net80211/ieee80211_mesh.h b/sys/net80211/ieee80211_mesh.h index 58d7608e868..f1610125f84 100644 --- a/sys/net80211/ieee80211_mesh.h +++ b/sys/net80211/ieee80211_mesh.h @@ -32,6 +32,7 @@ #define _NET80211_IEEE80211_MESH_H_ #define IEEE80211_MESH_DEFAULT_TTL 31 +#define IEEE80211_MESH_MAX_NEIGHBORS 15 /* * NB: all structures are __packed so sizeof works on arm, et. al. @@ -97,7 +98,7 @@ enum { }; /* Mesh Formation Info */ -#define IEEE80211_MESHCONF_FORM_MP 0x01 /* Connected to Portal */ +#define IEEE80211_MESHCONF_FORM_GATE 0x01 /* Connected to Gate */ #define IEEE80211_MESHCONF_FORM_NNEIGH_MASK 0x7E /* Number of Neighbours */ #define IEEE80211_MESHCONF_FORM_SA 0xF0 /* indicating 802.1X auth */ @@ -140,32 +141,24 @@ struct ieee80211_meshcngst_ie { } __packed; /* Peer Link Management */ +#define IEEE80211_MPM_BASE_SZ (4) +#define IEEE80211_MPM_MAX_SZ (8) struct ieee80211_meshpeer_ie { uint8_t peer_ie; /* IEEE80211_ELEMID_MESHPEER */ uint8_t peer_len; - uint8_t peer_proto[4]; /* Peer Management Protocol */ + uint16_t peer_proto; /* Peer Management Protocol */ uint16_t peer_llinkid; /* Local Link ID */ uint16_t peer_linkid; /* Peer Link ID */ uint16_t peer_rcode; } __packed; +/* Mesh Peering Protocol Identifier field value */ enum { - IEEE80211_MESH_PEER_LINK_OPEN = 0, - IEEE80211_MESH_PEER_LINK_CONFIRM = 1, - IEEE80211_MESH_PEER_LINK_CLOSE = 2, - /* values 3-255 are reserved */ + IEEE80211_MPPID_MPM = 0, /* Mesh peering management */ + IEEE80211_MPPID_AUTH_MPM = 1, /* Auth. mesh peering exchange */ + /* 2-65535 reserved */ }; -/* Mesh Peering Management Protocol */ -#define IEEE80211_MESH_PEER_PROTO_OUI 0x00, 0x0f, 0xac -#define IEEE80211_MESH_PEER_PROTO_VALUE 0x2a -#define IEEE80211_MESH_PEER_PROTO { IEEE80211_MESH_PEER_PROTO_OUI, \ - IEEE80211_MESH_PEER_PROTO_VALUE } -/* Abbreviated Handshake Protocol */ -#define IEEE80211_MESH_PEER_PROTO_AH_OUI 0x00, 0x0f, 0xac -#define IEEE80211_MESH_PEER_PROTO_AH_VALUE 0x2b -#define IEEE80211_MESH_PEER_PROTO_AH { IEEE80211_MESH_PEER_PROTO_AH_OUI, \ - IEEE80211_MESH_PEER_PROTO_AH_VALUE } #ifdef notyet /* Mesh Channel Switch Annoucement */ struct ieee80211_meshcsa_ie { @@ -200,9 +193,9 @@ struct ieee80211_meshbeacont_ie { } __packed; #endif -/* Portal (MP) Annoucement */ -struct ieee80211_meshpann_ie { - uint8_t pann_ie; /* IEEE80211_ELEMID_MESHPANN */ +/* Gate (GANN) Annoucement */ +struct ieee80211_meshgann_ie { + uint8_t pann_ie; /* IEEE80211_ELEMID_MESHGANN */ uint8_t pann_len; uint8_t pann_flags; uint8_t pann_hopcount; @@ -217,7 +210,7 @@ struct ieee80211_meshrann_ie { uint8_t rann_ie; /* IEEE80211_ELEMID_MESHRANN */ uint8_t rann_len; uint8_t rann_flags; -#define IEEE80211_MESHRANN_FLAGS_PR 0x01 /* Portal Role */ +#define IEEE80211_MESHRANN_FLAGS_GATE 0x01 /* Mesh Gate */ uint8_t rann_hopcount; uint8_t rann_ttl; uint8_t rann_addr[IEEE80211_ADDR_LEN]; @@ -236,8 +229,8 @@ struct ieee80211_meshpreq_ie { uint8_t preq_ie; /* IEEE80211_ELEMID_MESHPREQ */ uint8_t preq_len; uint8_t preq_flags; -#define IEEE80211_MESHPREQ_FLAGS_PR 0x01 /* Portal Role */ -#define IEEE80211_MESHPREQ_FLAGS_AM 0x02 /* 0 = ucast / 1 = bcast */ +#define IEEE80211_MESHPREQ_FLAGS_GATE 0x01 /* Mesh Gate */ +#define IEEE80211_MESHPREQ_FLAGS_AM 0x02 /* 0 = bcast / 1 = ucast */ #define IEEE80211_MESHPREQ_FLAGS_PP 0x04 /* Proactive PREP */ #define IEEE80211_MESHPREQ_FLAGS_AE 0x40 /* Address Extension */ uint8_t preq_hopcount; @@ -253,7 +246,6 @@ struct ieee80211_meshpreq_ie { struct { uint8_t target_flags; #define IEEE80211_MESHPREQ_TFLAGS_TO 0x01 /* Target Only */ -#define IEEE80211_MESHPREQ_TFLAGS_RF 0x02 /* Reply and Forward */ #define IEEE80211_MESHPREQ_TFLAGS_USN 0x04 /* Unknown HWMP seq number */ uint8_t target_addr[IEEE80211_ADDR_LEN]; uint32_t target_seq; /* HWMP Sequence Number */ @@ -331,9 +323,9 @@ struct ieee80211_meshpuc_ie { /* * 802.11s Action Frames + * XXX: these are wrong, and some of them should be + * under MESH category while PROXY is under MULTIHOP category. */ -#define IEEE80211_ACTION_CAT_MESHPEERING 30 /* XXX Linux */ -/* XXX: these need to be looked into */ #define IEEE80211_ACTION_CAT_INTERWORK 15 #define IEEE80211_ACTION_CAT_RESOURCE 16 #define IEEE80211_ACTION_CAT_PROXY 17 @@ -342,10 +334,11 @@ struct ieee80211_meshpuc_ie { * Mesh Peering Action codes. */ enum { - IEEE80211_ACTION_MESHPEERING_OPEN = 0, - IEEE80211_ACTION_MESHPEERING_CONFIRM = 1, - IEEE80211_ACTION_MESHPEERING_CLOSE = 2, - /* 3-255 reserved */ + /* 0 reserved */ + IEEE80211_ACTION_MESHPEERING_OPEN = 1, + IEEE80211_ACTION_MESHPEERING_CONFIRM = 2, + IEEE80211_ACTION_MESHPEERING_CLOSE = 3, + /* 4-255 reserved */ }; /* @@ -366,14 +359,6 @@ enum { /* 11-255 reserved */ }; -/* - * Mesh Portal Annoucement Action codes. - */ -enum { - IEEE80211_ACTION_MESHPANN = 0, - /* 1-255 reserved */ -}; - /* * Different mesh control structures based on the AE * (Address Extension) bits. @@ -396,37 +381,51 @@ struct ieee80211_meshcntl_ae10 { uint8_t mc_flags; /* Address Extension 10 */ uint8_t mc_ttl; /* TTL */ uint8_t mc_seq[4]; /* Sequence No. */ - uint8_t mc_addr4[IEEE80211_ADDR_LEN]; - uint8_t mc_addr5[IEEE80211_ADDR_LEN]; -} __packed; - -struct ieee80211_meshcntl_ae11 { - uint8_t mc_flags; /* Address Extension 11 */ - uint8_t mc_ttl; /* TTL */ - uint8_t mc_seq[4]; /* Sequence No. */ - uint8_t mc_addr4[IEEE80211_ADDR_LEN]; uint8_t mc_addr5[IEEE80211_ADDR_LEN]; uint8_t mc_addr6[IEEE80211_ADDR_LEN]; } __packed; +#define IEEE80211_MESH_AE_MASK 0x03 +enum { + IEEE80211_MESH_AE_00 = 0, /* MC has no AE subfield */ + IEEE80211_MESH_AE_01 = 1, /* MC contain addr4 */ + IEEE80211_MESH_AE_10 = 2, /* MC contain addr5 & addr6 */ + IEEE80211_MESH_AE_11 = 3, /* RESERVED */ +}; + #ifdef _KERNEL MALLOC_DECLARE(M_80211_MESH_PREQ); MALLOC_DECLARE(M_80211_MESH_PREP); MALLOC_DECLARE(M_80211_MESH_PERR); MALLOC_DECLARE(M_80211_MESH_RT); +/* + * Basic forwarding information: + * o Destination MAC + * o Next-hop MAC + * o Precursor list (not implemented yet) + * o Path timeout + * The rest is part of the active Mesh path selection protocol. + * XXX: to be moved out later. + */ struct ieee80211_mesh_route { TAILQ_ENTRY(ieee80211_mesh_route) rt_next; - int rt_crtime; /* creation time */ + struct ieee80211vap *rt_vap; + struct mtx rt_lock; /* fine grained route lock */ + struct callout rt_discovery; /* discovery timeout */ + int rt_updtime; /* last update time */ uint8_t rt_dest[IEEE80211_ADDR_LEN]; + uint8_t rt_mesh_gate[IEEE80211_ADDR_LEN]; /* meshDA */ uint8_t rt_nexthop[IEEE80211_ADDR_LEN]; uint32_t rt_metric; /* path metric */ uint16_t rt_nhops; /* number of hops */ uint16_t rt_flags; -#define IEEE80211_MESHRT_FLAGS_VALID 0x01 /* patch discovery complete */ -#define IEEE80211_MESHRT_FLAGS_PROXY 0x02 /* proxy entry */ - uint32_t rt_lifetime; +#define IEEE80211_MESHRT_FLAGS_DISCOVER 0x01 /* path discovery */ +#define IEEE80211_MESHRT_FLAGS_VALID 0x02 /* path discovery complete */ +#define IEEE80211_MESHRT_FLAGS_PROXY 0x04 /* proxy entry */ + uint32_t rt_lifetime; /* route timeout */ uint32_t rt_lastmseq; /* last seq# seen dest */ + uint32_t rt_ext_seq; /* proxy seq number */ void *rt_priv; /* private data */ }; #define IEEE80211_MESH_ROUTE_PRIV(rt, cast) ((cast *)rt->rt_priv) @@ -445,6 +444,9 @@ struct ieee80211_mesh_proto_path { const uint8_t [IEEE80211_ADDR_LEN], struct mbuf *); void (*mpp_peerdown)(struct ieee80211_node *); + void (*mpp_senderror)(struct ieee80211vap *, + const uint8_t [IEEE80211_ADDR_LEN], + struct ieee80211_mesh_route *, int); void (*mpp_vattach)(struct ieee80211vap *); void (*mpp_vdetach)(struct ieee80211vap *); int (*mpp_newstate)(struct ieee80211vap *, @@ -491,7 +493,7 @@ struct ieee80211_mesh_state { uint16_t ms_neighbors; uint8_t ms_ttl; /* mesh ttl set in packets */ #define IEEE80211_MESHFLAGS_AP 0x01 /* accept peers */ -#define IEEE80211_MESHFLAGS_PORTAL 0x02 /* mesh portal role */ +#define IEEE80211_MESHFLAGS_GATE 0x02 /* mesh gate role */ #define IEEE80211_MESHFLAGS_FWD 0x04 /* forward packets */ uint8_t ms_flags; struct mtx ms_rt_lock; @@ -514,6 +516,7 @@ void ieee80211_mesh_rt_del(struct ieee80211vap *, void ieee80211_mesh_rt_flush(struct ieee80211vap *); void ieee80211_mesh_rt_flush_peer(struct ieee80211vap *, const uint8_t [IEEE80211_ADDR_LEN]); +int ieee80211_mesh_rt_update(struct ieee80211_mesh_route *rt, int); void ieee80211_mesh_proxy_check(struct ieee80211vap *, const uint8_t [IEEE80211_ADDR_LEN]); @@ -548,7 +551,7 @@ ieee80211_mesh_isproxyena(struct ieee80211vap *vap) { struct ieee80211_mesh_state *ms = vap->iv_mesh; return (ms->ms_flags & - (IEEE80211_MESHFLAGS_AP | IEEE80211_MESHFLAGS_PORTAL)) != 0; + (IEEE80211_MESHFLAGS_AP | IEEE80211_MESHFLAGS_GATE)) != 0; } /* diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c index 7723763046e..7430c34aedd 100644 --- a/sys/net80211/ieee80211_output.c +++ b/sys/net80211/ieee80211_output.c @@ -254,7 +254,7 @@ ieee80211_start(struct ifnet *ifp) if (!ieee80211_mesh_isproxyena(vap)) { IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_OUTPUT | - IEEE80211_MSG_MESH, + IEEE80211_MSG_MESH, eh->ether_dhost, NULL, "%s", "proxy not enabled"); vap->iv_stats.is_mesh_notproxy++; @@ -363,7 +363,6 @@ ieee80211_start(struct ifnet *ifp) continue; } } - error = parent->if_transmit(parent, m); if (error != 0) { /* NB: IFQ_HANDOFF reclaims mbuf */ @@ -556,7 +555,6 @@ ieee80211_send_setup( break; case IEEE80211_M_MBSS: #ifdef IEEE80211_SUPPORT_MESH - /* XXX add support for proxied addresses */ if (IEEE80211_IS_MULTICAST(da)) { wh->i_fc[1] = IEEE80211_FC1_DIR_FROMDS; /* XXX next hop */ @@ -1016,10 +1014,13 @@ ieee80211_encap(struct ieee80211vap *vap, struct ieee80211_node *ni, struct mbuf *m) { #define WH4(wh) ((struct ieee80211_frame_addr4 *)(wh)) +#define MC01(mc) ((struct ieee80211_meshcntl_ae01 *)mc) struct ieee80211com *ic = ni->ni_ic; #ifdef IEEE80211_SUPPORT_MESH struct ieee80211_mesh_state *ms = vap->iv_mesh; struct ieee80211_meshcntl_ae10 *mc; + struct ieee80211_mesh_route *rt = NULL; + int dir = -1; #endif struct ether_header eh; struct ieee80211_frame *wh; @@ -1100,21 +1101,40 @@ ieee80211_encap(struct ieee80211vap *vap, struct ieee80211_node *ni, * w/ 4-address format and address extension mode 10 */ is4addr = 0; /* NB: don't use, disable */ - if (!IEEE80211_IS_MULTICAST(eh.ether_dhost)) - hdrsize += IEEE80211_ADDR_LEN; /* unicast are 4-addr */ - meshhdrsize = sizeof(struct ieee80211_meshcntl); - /* XXX defines for AE modes */ - if (IEEE80211_ADDR_EQ(eh.ether_shost, vap->iv_myaddr)) { - if (!IEEE80211_IS_MULTICAST(eh.ether_dhost)) - meshae = 0; - else - meshae = 4; /* NB: pseudo */ - } else if (IEEE80211_IS_MULTICAST(eh.ether_dhost)) { - meshae = 1; - meshhdrsize += 1*IEEE80211_ADDR_LEN; + if (!IEEE80211_IS_MULTICAST(eh.ether_dhost)) { + rt = ieee80211_mesh_rt_find(vap, eh.ether_dhost); + KASSERT(rt != NULL, ("route is NULL")); + dir = IEEE80211_FC1_DIR_DSTODS; + hdrsize += IEEE80211_ADDR_LEN; + if (rt->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY) { + if (IEEE80211_ADDR_EQ(rt->rt_mesh_gate, + vap->iv_myaddr)) { + IEEE80211_NOTE_MAC(vap, + IEEE80211_MSG_MESH, + eh.ether_dhost, + "%s", "trying to send to ourself"); + goto bad; + } + meshae = IEEE80211_MESH_AE_10; + meshhdrsize = + sizeof(struct ieee80211_meshcntl_ae10); + } else { + meshae = IEEE80211_MESH_AE_00; + meshhdrsize = + sizeof(struct ieee80211_meshcntl); + } } else { - meshae = 2; - meshhdrsize += 2*IEEE80211_ADDR_LEN; + dir = IEEE80211_FC1_DIR_FROMDS; + if (!IEEE80211_ADDR_EQ(eh.ether_shost, vap->iv_myaddr)) { + /* proxy group */ + meshae = IEEE80211_MESH_AE_01; + meshhdrsize = + sizeof(struct ieee80211_meshcntl_ae01); + } else { + /* group */ + meshae = IEEE80211_MESH_AE_00; + meshhdrsize = sizeof(struct ieee80211_meshcntl); + } } } else { #endif @@ -1215,44 +1235,52 @@ ieee80211_encap(struct ieee80211vap *vap, struct ieee80211_node *ni, /* NB: offset by hdrspace to deal with DATAPAD */ mc = (struct ieee80211_meshcntl_ae10 *) (mtod(m, uint8_t *) + hdrspace); + wh->i_fc[1] = dir; switch (meshae) { - case 0: /* ucast, no proxy */ - wh->i_fc[1] = IEEE80211_FC1_DIR_DSTODS; - IEEE80211_ADDR_COPY(wh->i_addr1, ni->ni_macaddr); - IEEE80211_ADDR_COPY(wh->i_addr2, vap->iv_myaddr); - IEEE80211_ADDR_COPY(wh->i_addr3, eh.ether_dhost); - IEEE80211_ADDR_COPY(WH4(wh)->i_addr4, eh.ether_shost); + case IEEE80211_MESH_AE_00: /* no proxy */ mc->mc_flags = 0; - qos = ((struct ieee80211_qosframe_addr4 *) wh)->i_qos; + if (dir == IEEE80211_FC1_DIR_DSTODS) { /* ucast */ + IEEE80211_ADDR_COPY(wh->i_addr1, + ni->ni_macaddr); + IEEE80211_ADDR_COPY(wh->i_addr2, + vap->iv_myaddr); + IEEE80211_ADDR_COPY(wh->i_addr3, + eh.ether_dhost); + IEEE80211_ADDR_COPY(WH4(wh)->i_addr4, + eh.ether_shost); + qos =((struct ieee80211_qosframe_addr4 *) + wh)->i_qos; + } else if (dir == IEEE80211_FC1_DIR_FROMDS) { + /* mcast */ + IEEE80211_ADDR_COPY(wh->i_addr1, + eh.ether_dhost); + IEEE80211_ADDR_COPY(wh->i_addr2, + vap->iv_myaddr); + IEEE80211_ADDR_COPY(wh->i_addr3, + eh.ether_shost); + qos = ((struct ieee80211_qosframe *) + wh)->i_qos; + } break; - case 4: /* mcast, no proxy */ - wh->i_fc[1] = IEEE80211_FC1_DIR_FROMDS; - IEEE80211_ADDR_COPY(wh->i_addr1, eh.ether_dhost); - IEEE80211_ADDR_COPY(wh->i_addr2, vap->iv_myaddr); - IEEE80211_ADDR_COPY(wh->i_addr3, eh.ether_shost); - mc->mc_flags = 0; /* NB: AE is really 0 */ - qos = ((struct ieee80211_qosframe *) wh)->i_qos; - break; - case 1: /* mcast, proxy */ + case IEEE80211_MESH_AE_01: /* mcast, proxy */ wh->i_fc[1] = IEEE80211_FC1_DIR_FROMDS; IEEE80211_ADDR_COPY(wh->i_addr1, eh.ether_dhost); IEEE80211_ADDR_COPY(wh->i_addr2, vap->iv_myaddr); IEEE80211_ADDR_COPY(wh->i_addr3, vap->iv_myaddr); mc->mc_flags = 1; - IEEE80211_ADDR_COPY(mc->mc_addr4, eh.ether_shost); + IEEE80211_ADDR_COPY(MC01(mc)->mc_addr4, + eh.ether_shost); qos = ((struct ieee80211_qosframe *) wh)->i_qos; break; - case 2: /* ucast, proxy */ - wh->i_fc[1] = IEEE80211_FC1_DIR_DSTODS; - IEEE80211_ADDR_COPY(wh->i_addr1, ni->ni_macaddr); + case IEEE80211_MESH_AE_10: /* ucast, proxy */ + KASSERT(rt != NULL, ("route is NULL")); + IEEE80211_ADDR_COPY(wh->i_addr1, rt->rt_nexthop); IEEE80211_ADDR_COPY(wh->i_addr2, vap->iv_myaddr); - /* XXX not right, need MeshDA */ - IEEE80211_ADDR_COPY(wh->i_addr3, eh.ether_dhost); - /* XXX assume are MeshSA */ + IEEE80211_ADDR_COPY(wh->i_addr3, rt->rt_mesh_gate); IEEE80211_ADDR_COPY(WH4(wh)->i_addr4, vap->iv_myaddr); - mc->mc_flags = 2; - IEEE80211_ADDR_COPY(mc->mc_addr4, eh.ether_dhost); - IEEE80211_ADDR_COPY(mc->mc_addr5, eh.ether_shost); + mc->mc_flags = IEEE80211_MESH_AE_10; + IEEE80211_ADDR_COPY(mc->mc_addr5, eh.ether_dhost); + IEEE80211_ADDR_COPY(mc->mc_addr6, eh.ether_shost); qos = ((struct ieee80211_qosframe_addr4 *) wh)->i_qos; break; default: @@ -1285,9 +1313,9 @@ ieee80211_encap(struct ieee80211vap *vap, struct ieee80211_node *ni, if (ic->ic_wme.wme_wmeChanParams.cap_wmeParams[ac].wmep_noackPolicy) qos[0] |= IEEE80211_QOS_ACKPOLICY_NOACK; #ifdef IEEE80211_SUPPORT_MESH - if (vap->iv_opmode == IEEE80211_M_MBSS) { - qos[1] |= IEEE80211_QOS_MC; - } else + if (vap->iv_opmode == IEEE80211_M_MBSS) + qos[1] = IEEE80211_QOS_MC; + else #endif qos[1] = 0; wh->i_fc[0] |= IEEE80211_FC0_SUBTYPE_QOS; @@ -1363,6 +1391,7 @@ bad: m_freem(m); return NULL; #undef WH4 +#undef MC01 } /* diff --git a/sys/net80211/ieee80211_radiotap.c b/sys/net80211/ieee80211_radiotap.c index 4aa5f5be44c..f06f7e019a5 100644 --- a/sys/net80211/ieee80211_radiotap.c +++ b/sys/net80211/ieee80211_radiotap.c @@ -47,12 +47,23 @@ __FBSDID("$FreeBSD$"); #include -static int radiotap_offset(struct ieee80211_radiotap_header *, int); +static int radiotap_offset(struct ieee80211_radiotap_header *, int, int); void ieee80211_radiotap_attach(struct ieee80211com *ic, struct ieee80211_radiotap_header *th, int tlen, uint32_t tx_radiotap, struct ieee80211_radiotap_header *rh, int rlen, uint32_t rx_radiotap) +{ + ieee80211_radiotap_attachv(ic, th, tlen, 0, tx_radiotap, + rh, rlen, 0, rx_radiotap); +} + +void +ieee80211_radiotap_attachv(struct ieee80211com *ic, + struct ieee80211_radiotap_header *th, + int tlen, int n_tx_v, uint32_t tx_radiotap, + struct ieee80211_radiotap_header *rh, + int rlen, int n_rx_v, uint32_t rx_radiotap) { #define B(_v) (1<<(_v)) int off; @@ -63,9 +74,9 @@ ieee80211_radiotap_attach(struct ieee80211com *ic, /* calculate offset to channel data */ off = -1; if (tx_radiotap & B(IEEE80211_RADIOTAP_CHANNEL)) - off = radiotap_offset(th, IEEE80211_RADIOTAP_CHANNEL); + off = radiotap_offset(th, n_tx_v, IEEE80211_RADIOTAP_CHANNEL); else if (tx_radiotap & B(IEEE80211_RADIOTAP_XCHANNEL)) - off = radiotap_offset(th, IEEE80211_RADIOTAP_XCHANNEL); + off = radiotap_offset(th, n_tx_v, IEEE80211_RADIOTAP_XCHANNEL); if (off == -1) { if_printf(ic->ic_ifp, "%s: no tx channel, radiotap 0x%x\n", __func__, tx_radiotap); @@ -79,9 +90,9 @@ ieee80211_radiotap_attach(struct ieee80211com *ic, /* calculate offset to channel data */ off = -1; if (rx_radiotap & B(IEEE80211_RADIOTAP_CHANNEL)) - off = radiotap_offset(rh, IEEE80211_RADIOTAP_CHANNEL); + off = radiotap_offset(rh, n_rx_v, IEEE80211_RADIOTAP_CHANNEL); else if (rx_radiotap & B(IEEE80211_RADIOTAP_XCHANNEL)) - off = radiotap_offset(rh, IEEE80211_RADIOTAP_XCHANNEL); + off = radiotap_offset(rh, n_rx_v, IEEE80211_RADIOTAP_XCHANNEL); if (off == -1) { if_printf(ic->ic_ifp, "%s: no rx channel, radiotap 0x%x\n", __func__, rx_radiotap); @@ -260,7 +271,8 @@ ieee80211_radiotap_rx_all(struct ieee80211com *ic, struct mbuf *m) * known -1 is returned. */ static int -radiotap_offset(struct ieee80211_radiotap_header *rh, int item) +radiotap_offset(struct ieee80211_radiotap_header *rh, + int n_vendor_attributes, int item) { static const struct { size_t align, width; @@ -334,6 +346,8 @@ radiotap_offset(struct ieee80211_radiotap_header *rh, int item) int off, i; off = sizeof(struct ieee80211_radiotap_header); + off += n_vendor_attributes * (sizeof(uint32_t)); + for (i = 0; i < IEEE80211_RADIOTAP_EXT; i++) { if ((present & (1<f.r.r_dst; - rt = rtalloc1_fib((struct sockaddr *)&sin, 0, 0, r->fib); - if (rt != NULL) { - fle->f.fle_o_ifx = rt->rt_ifp->if_index; + if ((flags & NG_NETFLOW_CONF_NODSTLOOKUP) == 0) { + bzero(&sin, sizeof(sin)); + sin.sin_len = sizeof(struct sockaddr_in); + sin.sin_family = AF_INET; + sin.sin_addr = fle->f.r.r_dst; + rt = rtalloc1_fib((struct sockaddr *)&sin, 0, 0, r->fib); + if (rt != NULL) { + fle->f.fle_o_ifx = rt->rt_ifp->if_index; - if (rt->rt_flags & RTF_GATEWAY && - rt->rt_gateway->sa_family == AF_INET) - fle->f.next_hop = - ((struct sockaddr_in *)(rt->rt_gateway))->sin_addr; + if (rt->rt_flags & RTF_GATEWAY && + rt->rt_gateway->sa_family == AF_INET) + fle->f.next_hop = + ((struct sockaddr_in *)(rt->rt_gateway))->sin_addr; - if (rt_mask(rt)) - fle->f.dst_mask = bitcount32(((struct sockaddr_in *) - rt_mask(rt))->sin_addr.s_addr); - else if (rt->rt_flags & RTF_HOST) - /* Give up. We can't determine mask :( */ - fle->f.dst_mask = 32; + if (rt_mask(rt)) + fle->f.dst_mask = bitcount32(((struct sockaddr_in *) + rt_mask(rt))->sin_addr.s_addr); + else if (rt->rt_flags & RTF_HOST) + /* Give up. We can't determine mask :( */ + fle->f.dst_mask = 32; - RTFREE_LOCKED(rt); + RTFREE_LOCKED(rt); + } } /* Do route lookup on source address, to fill in src_mask. */ - bzero(&sin, sizeof(sin)); - sin.sin_len = sizeof(struct sockaddr_in); - sin.sin_family = AF_INET; - sin.sin_addr = fle->f.r.r_src; - rt = rtalloc1_fib((struct sockaddr *)&sin, 0, 0, r->fib); - if (rt != NULL) { - if (rt_mask(rt)) - fle->f.src_mask = bitcount32(((struct sockaddr_in *) - rt_mask(rt))->sin_addr.s_addr); - else if (rt->rt_flags & RTF_HOST) - /* Give up. We can't determine mask :( */ - fle->f.src_mask = 32; + if ((flags & NG_NETFLOW_CONF_NOSRCLOOKUP) == 0) { + bzero(&sin, sizeof(sin)); + sin.sin_len = sizeof(struct sockaddr_in); + sin.sin_family = AF_INET; + sin.sin_addr = fle->f.r.r_src; + rt = rtalloc1_fib((struct sockaddr *)&sin, 0, 0, r->fib); + if (rt != NULL) { + if (rt_mask(rt)) + fle->f.src_mask = bitcount32(((struct sockaddr_in *) + rt_mask(rt))->sin_addr.s_addr); + else if (rt->rt_flags & RTF_HOST) + /* Give up. We can't determine mask :( */ + fle->f.src_mask = 32; - RTFREE_LOCKED(rt); + RTFREE_LOCKED(rt); + } } /* Push new flow at the and of hash. */ @@ -410,10 +414,10 @@ hash_insert(priv_p priv, struct flow_hash_entry *hsh, struct flow_rec *r, bitcount32((x).__u6_addr.__u6_addr32[1]) + \ bitcount32((x).__u6_addr.__u6_addr32[2]) + \ bitcount32((x).__u6_addr.__u6_addr32[3]) -/* XXX: Do we need inline here ? */ -static __inline int +#define RT_MASK6(x) (ipv6_masklen(((struct sockaddr_in6 *)rt_mask(x))->sin6_addr)) +static int hash6_insert(priv_p priv, struct flow_hash_entry *hsh6, struct flow6_rec *r, - int plen, uint8_t tcp_flags) + int plen, uint8_t flags, uint8_t tcp_flags) { struct flow6_entry *fle6; struct sockaddr_in6 *src, *dst; @@ -445,49 +449,55 @@ hash6_insert(priv_p priv, struct flow_hash_entry *hsh6, struct flow6_rec *r, * First we do route table lookup on destination address. So we can * fill in out_ifx, dst_mask, nexthop, and dst_as in future releases. */ - bzero(&rin6, sizeof(struct route_in6)); - dst = (struct sockaddr_in6 *)&rin6.ro_dst; - dst->sin6_len = sizeof(struct sockaddr_in6); - dst->sin6_family = AF_INET6; - dst->sin6_addr = r->dst.r_dst6; + if ((flags & NG_NETFLOW_CONF_NODSTLOOKUP) == 0) + { + bzero(&rin6, sizeof(struct route_in6)); + dst = (struct sockaddr_in6 *)&rin6.ro_dst; + dst->sin6_len = sizeof(struct sockaddr_in6); + dst->sin6_family = AF_INET6; + dst->sin6_addr = r->dst.r_dst6; - rin6.ro_rt = rtalloc1_fib((struct sockaddr *)dst, 0, 0, r->fib); + rin6.ro_rt = rtalloc1_fib((struct sockaddr *)dst, 0, 0, r->fib); - if (rin6.ro_rt != NULL) { - rt = rin6.ro_rt; - fle6->f.fle_o_ifx = rt->rt_ifp->if_index; + if (rin6.ro_rt != NULL) { + rt = rin6.ro_rt; + fle6->f.fle_o_ifx = rt->rt_ifp->if_index; - if (rt->rt_flags & RTF_GATEWAY && - rt->rt_gateway->sa_family == AF_INET6) - fle6->f.n.next_hop6 = - ((struct sockaddr_in6 *)(rt->rt_gateway))->sin6_addr; + if (rt->rt_flags & RTF_GATEWAY && + rt->rt_gateway->sa_family == AF_INET6) + fle6->f.n.next_hop6 = + ((struct sockaddr_in6 *)(rt->rt_gateway))->sin6_addr; - if (rt_mask(rt)) - fle6->f.dst_mask = ipv6_masklen(((struct sockaddr_in6 *)rt_mask(rt))->sin6_addr); - else - fle6->f.dst_mask = 128; + if (rt_mask(rt)) + fle6->f.dst_mask = RT_MASK6(rt); + else + fle6->f.dst_mask = 128; - RTFREE_LOCKED(rt); + RTFREE_LOCKED(rt); + } } - /* Do route lookup on source address, to fill in src_mask. */ - bzero(&rin6, sizeof(struct route_in6)); - src = (struct sockaddr_in6 *)&rin6.ro_dst; - src->sin6_len = sizeof(struct sockaddr_in6); - src->sin6_family = AF_INET6; - src->sin6_addr = r->src.r_src6; + if ((flags & NG_NETFLOW_CONF_NODSTLOOKUP) == 0) + { + /* Do route lookup on source address, to fill in src_mask. */ + bzero(&rin6, sizeof(struct route_in6)); + src = (struct sockaddr_in6 *)&rin6.ro_dst; + src->sin6_len = sizeof(struct sockaddr_in6); + src->sin6_family = AF_INET6; + src->sin6_addr = r->src.r_src6; - rin6.ro_rt = rtalloc1_fib((struct sockaddr *)src, 0, 0, r->fib); + rin6.ro_rt = rtalloc1_fib((struct sockaddr *)src, 0, 0, r->fib); - if (rin6.ro_rt != NULL) { - rt = rin6.ro_rt; + if (rin6.ro_rt != NULL) { + rt = rin6.ro_rt; - if (rt_mask(rt)) - fle6->f.src_mask = ipv6_masklen(((struct sockaddr_in6 *)rt_mask(rt))->sin6_addr); - else - fle6->f.src_mask = 128; + if (rt_mask(rt)) + fle6->f.src_mask = RT_MASK6(rt); + else + fle6->f.src_mask = 128; - RTFREE_LOCKED(rt); + RTFREE_LOCKED(rt); + } } /* Push new flow at the and of hash. */ @@ -495,6 +505,8 @@ hash6_insert(priv_p priv, struct flow_hash_entry *hsh6, struct flow6_rec *r, return (0); } +#undef ipv6_masklen +#undef RT_MASK6 #endif @@ -651,7 +663,7 @@ ng_netflow_cache_flush(priv_p priv) /* Insert packet from into flow cache. */ int ng_netflow_flow_add(priv_p priv, fib_export_p fe, struct ip *ip, caddr_t upper_ptr, uint8_t upper_proto, - uint8_t is_frag, unsigned int src_if_index) + uint8_t flags, unsigned int src_if_index) { register struct flow_entry *fle, *fle1; struct flow_hash_entry *hsh; @@ -770,7 +782,7 @@ ng_netflow_flow_add(priv_p priv, fib_export_p fe, struct ip *ip, caddr_t upper_p } } } else /* A new flow entry. */ - error = hash_insert(priv, hsh, &r, plen, tcp_flags); + error = hash_insert(priv, hsh, &r, plen, flags, tcp_flags); mtx_unlock(&hsh->mtx); @@ -781,7 +793,7 @@ ng_netflow_flow_add(priv_p priv, fib_export_p fe, struct ip *ip, caddr_t upper_p /* Insert IPv6 packet from into flow cache. */ int ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t upper_ptr, uint8_t upper_proto, - uint8_t is_frag, unsigned int src_if_index) + uint8_t flags, unsigned int src_if_index) { register struct flow_entry *fle = NULL, *fle1; register struct flow6_entry *fle6; @@ -811,7 +823,7 @@ ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t #if 0 r.r_tos = ip->ip_tos; #endif - if (is_frag == 0) { + if ((flags & NG_NETFLOW_IS_FRAG) == 0) { switch(upper_proto) { case IPPROTO_TCP: { @@ -896,7 +908,7 @@ ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t } } } else /* A new flow entry. */ - error = hash6_insert(priv, hsh, &r, plen, tcp_flags); + error = hash6_insert(priv, hsh, &r, plen, flags, tcp_flags); mtx_unlock(&hsh->mtx); diff --git a/sys/netgraph/netflow/netflow_v9.c b/sys/netgraph/netflow/netflow_v9.c index 31304d78ab6..b918feb9cc9 100644 --- a/sys/netgraph/netflow/netflow_v9.c +++ b/sys/netgraph/netflow/netflow_v9.c @@ -222,7 +222,7 @@ export9_send(priv_p priv, fib_export_p fe, item_p item, struct netflow_v9_packet header->unix_secs = htonl(ts.tv_sec); header->seq_num = htonl(atomic_fetchadd_32(&fe->flow9_seq, 1)); header->count = htons(t->count); - header->source_id = htonl(NG_NODE_ID(priv->node)); + header->source_id = htonl(fe->domain_id); if (priv->export9 != NULL) NG_FWD_ITEM_HOOK_FLAGS(error, item, priv->export9, flags); @@ -416,16 +416,14 @@ get_export9_dgram(priv_p priv, fib_export_p fe, struct netflow_v9_packet_opt **t * Check if we need to insert templates into packet */ - struct timespec ts; struct netflow_v9_flowset_header *fl; - getnanotime(&ts); - if ((ts.tv_sec >= priv->templ_time + fe->templ_last_ts) || + if ((time_uptime >= priv->templ_time + fe->templ_last_ts) || (fe->sent_packets >= priv->templ_packets + fe->templ_last_pkt)) { - atomic_store_rel_32(&fe->templ_last_ts, ts.tv_sec); - atomic_store_rel_32(&fe->templ_last_pkt, fe->sent_packets); - + fe->templ_last_ts = time_uptime; + fe->templ_last_pkt = fe->sent_packets; + fl = priv->v9_flowsets[0]; m_append(m, ntohs(fl->length), (void *)fl); t->flow_header = m->m_len; diff --git a/sys/netgraph/netflow/ng_netflow.c b/sys/netgraph/netflow/ng_netflow.c index 727136283b8..1cb617913ec 100644 --- a/sys/netgraph/netflow/ng_netflow.c +++ b/sys/netgraph/netflow/ng_netflow.c @@ -560,8 +560,8 @@ ng_netflow_rcvdata (hook_p hook, item_p item) struct ip6_hdr *ip6 = NULL; struct m_tag *mtag; int pullup_len = 0, off; - uint8_t upper_proto = 0, is_frag = 0; - int error = 0, bypass = 0, acct = 0; + uint8_t acct = 0, bypass = 0, flags = 0, upper_proto = 0; + int error = 0, l3_off = 0; unsigned int src_if_index; caddr_t upper_ptr = NULL; fib_export_p fe; @@ -619,6 +619,9 @@ ng_netflow_rcvdata (hook_p hook, item_p item) } } + /* Import configuration flags related to flow creation */ + flags = iface->info.conf & NG_NETFLOW_FLOW_FLAGS; + NGI_GET_M(item, m); m_old = m; @@ -666,6 +669,7 @@ ng_netflow_rcvdata (hook_p hook, item_p item) M_CHECK(sizeof(struct ip)); eh = mtod(m, struct ether_header *); ip = (struct ip *)(eh + 1); + l3_off = sizeof(struct ether_header); break; #ifdef INET6 case ETHERTYPE_IPV6: @@ -676,6 +680,7 @@ ng_netflow_rcvdata (hook_p hook, item_p item) M_CHECK(sizeof(struct ip6_hdr)); eh = mtod(m, struct ether_header *); ip6 = (struct ip6_hdr *)(eh + 1); + l3_off = sizeof(struct ether_header); break; #endif case ETHERTYPE_VLAN: @@ -686,6 +691,7 @@ ng_netflow_rcvdata (hook_p hook, item_p item) sizeof(struct ether_header)); evh = mtod(m, struct ether_vlan_header *); etype = ntohs(evh->evl_proto); + l3_off = sizeof(struct ether_vlan_header); if (etype == ETHERTYPE_IP) { M_CHECK(sizeof(struct ip)); @@ -707,12 +713,13 @@ ng_netflow_rcvdata (hook_p hook, item_p item) case DLT_RAW: /* IP packets */ M_CHECK(sizeof(struct ip)); ip = mtod(m, struct ip *); + /* l3_off is already zero */ #ifdef INET6 /* If INET6 is not defined IPv6 packets will be discarded in ng_netflow_flow_add() */ if (ip->ip_v == IP6VERSION) { /* IPv6 packet */ ip = NULL; - M_CHECK(sizeof(struct ip6_hdr)); + M_CHECK(sizeof(struct ip6_hdr) - sizeof(struct ip)); ip6 = mtod(m, struct ip6_hdr *); } #endif @@ -755,7 +762,7 @@ ng_netflow_rcvdata (hook_p hook, item_p item) } } else if (ip != NULL) { /* Nothing to save except upper layer proto, since this is packet fragment */ - is_frag = 1; + flags |= NG_NETFLOW_IS_FRAG; upper_proto = ip->ip_p; if ((ip->ip_v != IPVERSION) || ((ip->ip_hl << 2) < sizeof(struct ip))) @@ -817,14 +824,17 @@ ng_netflow_rcvdata (hook_p hook, item_p item) upper_proto = ip6f->ip6f_nxt; hdr_off = sizeof(struct ip6_frag); off += hdr_off; - is_frag = 1; + flags |= NG_NETFLOW_IS_FRAG; goto loopend; #if 0 case IPPROTO_NONE: goto loopend; #endif - /* Any unknow header (new extension or IPv6/IPv4 header for tunnels) */ + /* + * Any unknow header (new extension or IPv6/IPv4 + * header for tunnels) ends loop. + */ default: goto loopend; } @@ -842,56 +852,11 @@ loopend: /* Just in case of real reallocation in M_CHECK() / m_pullup() */ if (m != m_old) { atomic_fetchadd_32(&priv->info.nfinfo_realloc_mbuf, 1); - ip = NULL; - ip6 = NULL; - switch (iface->info.ifinfo_dlt) { - case DLT_EN10MB: /* Ethernet */ - { - struct ether_header *eh; - - eh = mtod(m, struct ether_header *); - switch (ntohs(eh->ether_type)) { - case ETHERTYPE_IP: - ip = (struct ip *)(eh + 1); - break; -#ifdef INET6 - case ETHERTYPE_IPV6: - ip6 = (struct ip6_hdr *)(eh + 1); - break; -#endif - case ETHERTYPE_VLAN: - { - struct ether_vlan_header *evh; - - evh = mtod(m, struct ether_vlan_header *); - if (ntohs(evh->evl_proto) == ETHERTYPE_IP) { - ip = (struct ip *)(evh + 1); - break; -#ifdef INET6 - } else if (ntohs(evh->evl_proto) == ETHERTYPE_IPV6) { - ip6 = (struct ip6_hdr *)(evh + 1); - break; -#endif - } - } - default: - panic("ng_netflow entered deadcode"); - } - break; - } - case DLT_RAW: /* IP packets */ - ip = mtod(m, struct ip *); -#ifdef INET6 - if (ip->ip_v == IP6VERSION) { - /* IPv6 packet */ - ip = NULL; - ip6 = mtod(m, struct ip6_hdr *); - } -#endif - break; - default: - panic("ng_netflow entered deadcode"); - } + /* Restore ip/ipv6 pointer */ + if (ip != NULL) + ip = (struct ip *)(mtod(m, caddr_t) + l3_off); + else if (ip6 != NULL) + ip6 = (struct ip6_hdr *)(mtod(m, caddr_t) + l3_off); } upper_ptr = (caddr_t)(mtod(m, caddr_t) + off); @@ -924,10 +889,10 @@ loopend: } if (ip != NULL) - error = ng_netflow_flow_add(priv, fe, ip, upper_ptr, upper_proto, is_frag, src_if_index); + error = ng_netflow_flow_add(priv, fe, ip, upper_ptr, upper_proto, flags, src_if_index); #ifdef INET6 else if (ip6 != NULL) - error = ng_netflow_flow6_add(priv, fe, ip6, upper_ptr, upper_proto, is_frag, src_if_index); + error = ng_netflow_flow6_add(priv, fe, ip6, upper_ptr, upper_proto, flags, src_if_index); #endif else goto bypass; diff --git a/sys/netgraph/netflow/ng_netflow.h b/sys/netgraph/netflow/ng_netflow.h index bab04c77976..ee56c281c19 100644 --- a/sys/netgraph/netflow/ng_netflow.h +++ b/sys/netgraph/netflow/ng_netflow.h @@ -111,10 +111,16 @@ struct ng_netflow_settimeouts { uint32_t active_timeout; /* flow active timeout */ }; -#define NG_NETFLOW_CONF_INGRESS 1 -#define NG_NETFLOW_CONF_EGRESS 2 -#define NG_NETFLOW_CONF_ONCE 4 -#define NG_NETFLOW_CONF_THISONCE 8 +#define NG_NETFLOW_CONF_INGRESS 0x01 /* Account on ingress */ +#define NG_NETFLOW_CONF_EGRESS 0x02 /* Account on egress */ +#define NG_NETFLOW_CONF_ONCE 0x04 /* Add tag to account only once */ +#define NG_NETFLOW_CONF_THISONCE 0x08 /* Account once in current node */ +#define NG_NETFLOW_CONF_NOSRCLOOKUP 0x10 /* No radix lookup on src */ +#define NG_NETFLOW_CONF_NODSTLOOKUP 0x20 /* No radix lookup on dst */ + +#define NG_NETFLOW_IS_FRAG 0x01 +#define NG_NETFLOW_FLOW_FLAGS (NG_NETFLOW_CONF_NOSRCLOOKUP|\ + NG_NETFLOW_CONF_NODSTLOOKUP) /* This structure is passed to NGM_NETFLOW_SETCONFIG */ struct ng_netflow_setconfig { diff --git a/sys/netgraph/ng_ksocket.c b/sys/netgraph/ng_ksocket.c index d2e3a26400d..cacb524f3a4 100644 --- a/sys/netgraph/ng_ksocket.c +++ b/sys/netgraph/ng_ksocket.c @@ -524,7 +524,9 @@ ng_ksocket_constructor(node_p node) priv_p priv; /* Allocate private structure */ - priv = malloc(sizeof(*priv), M_NETGRAPH_KSOCKET, M_WAITOK | M_ZERO); + priv = malloc(sizeof(*priv), M_NETGRAPH_KSOCKET, M_NOWAIT | M_ZERO); + if (priv == NULL) + return (ENOMEM); LIST_INIT(&priv->embryos); /* cross link them */ diff --git a/sys/netinet/icmp_var.h b/sys/netinet/icmp_var.h index 30da6a26242..d939cc2e6d8 100644 --- a/sys/netinet/icmp_var.h +++ b/sys/netinet/icmp_var.h @@ -102,7 +102,8 @@ extern int badport_bandlim(int); #define BANDLIM_RST_CLOSEDPORT 3 /* No connection, and no listeners */ #define BANDLIM_RST_OPENPORT 4 /* No connection, listener */ #define BANDLIM_ICMP6_UNREACH 5 -#define BANDLIM_MAX 5 +#define BANDLIM_SCTP_OOTB 6 +#define BANDLIM_MAX 6 #endif #endif diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index bdb4efca8ff..d6a7fd11f92 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -180,6 +180,17 @@ arptimer(void *arg) callout_active(&lle->la_timer)) { callout_stop(&lle->la_timer); LLE_REMREF(lle); + + if (lle->la_flags != LLE_DELETED) { + int evt; + + if (lle->la_flags & LLE_VALID) + evt = LLENTRY_EXPIRED; + else + evt = LLENTRY_TIMEDOUT; + EVENTHANDLER_INVOKE(lle_event, lle, evt); + } + pkts_dropped = llentry_free(lle); ARPSTAT_ADD(dropped, pkts_dropped); ARPSTAT_INC(timeouts); @@ -726,7 +737,7 @@ match: (void)memcpy(&la->ll_addr, ar_sha(ah), ifp->if_addrlen); la->la_flags |= LLE_VALID; - EVENTHANDLER_INVOKE(arp_update_event, la); + EVENTHANDLER_INVOKE(lle_event, la, LLENTRY_RESOLVED); if (!(la->la_flags & LLE_STATIC)) { int canceled; diff --git a/sys/netinet/if_ether.h b/sys/netinet/if_ether.h index 8d44d3587c0..e37a9642e0f 100644 --- a/sys/netinet/if_ether.h +++ b/sys/netinet/if_ether.h @@ -122,8 +122,14 @@ void arp_ifinit2(struct ifnet *, struct ifaddr *, u_char *); void arp_ifscrub(struct ifnet *, uint32_t); #include -typedef void (*llevent_arp_update_fn)(void *, struct llentry *); -EVENTHANDLER_DECLARE(arp_update_event, llevent_arp_update_fn); +enum { + LLENTRY_RESOLVED, + LLENTRY_TIMEDOUT, + LLENTRY_DELETED, + LLENTRY_EXPIRED, +}; +typedef void (*lle_event_fn)(void *, struct llentry *, int); +EVENTHANDLER_DECLARE(lle_event, lle_event_fn); #endif diff --git a/sys/netinet/igmp.c b/sys/netinet/igmp.c index 4c0b105fa55..94c00a11275 100644 --- a/sys/netinet/igmp.c +++ b/sys/netinet/igmp.c @@ -2285,13 +2285,11 @@ igmp_change_state(struct in_multi *inm) */ KASSERT(inm->inm_ifma != NULL, ("%s: no ifma", __func__)); ifp = inm->inm_ifma->ifma_ifp; - if (ifp != NULL) { - /* - * Sanity check that netinet's notion of ifp is the - * same as net's. - */ - KASSERT(inm->inm_ifp == ifp, ("%s: bad ifp", __func__)); - } + /* + * Sanity check that netinet's notion of ifp is the + * same as net's. + */ + KASSERT(inm->inm_ifp == ifp, ("%s: bad ifp", __func__)); IGMP_LOCK(); diff --git a/sys/netinet/in.c b/sys/netinet/in.c index c1cbcb1ea6e..1beddd64621 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -1469,7 +1469,7 @@ in_lltable_lookup(struct lltable *llt, u_int flags, const struct sockaddr *l3add if (!(lle->la_flags & LLE_IFADDR) || (flags & LLE_IFADDR)) { LLE_WLOCK(lle); lle->la_flags = LLE_DELETED; - EVENTHANDLER_INVOKE(arp_update_event, lle); + EVENTHANDLER_INVOKE(lle_event, lle, LLENTRY_DELETED); LLE_WUNLOCK(lle); #ifdef DIAGNOSTIC log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle); diff --git a/sys/netinet/in.h b/sys/netinet/in.h index 52844f05898..40f59529586 100644 --- a/sys/netinet/in.h +++ b/sys/netinet/in.h @@ -241,6 +241,7 @@ __END_DECLS #define IPPROTO_PIM 103 /* Protocol Independent Mcast */ #define IPPROTO_CARP 112 /* CARP */ #define IPPROTO_PGM 113 /* PGM */ +#define IPPROTO_MPLS 137 /* MPLS-in-IP */ #define IPPROTO_PFSYNC 240 /* PFSYNC */ /* 255: Reserved */ /* BSD Private, local use, namespace incursion, no longer used */ @@ -461,6 +462,7 @@ __END_DECLS #define IP_RECVTTL 65 /* bool; receive IP TTL w/dgram */ #define IP_MINTTL 66 /* minimum TTL for packet or drop */ #define IP_DONTFRAG 67 /* don't fragment packet */ +#define IP_RECVTOS 68 /* bool; receive IP TOS w/dgram */ /* IPv4 Source Filter Multicast API [RFC3678] */ #define IP_ADD_SOURCE_MEMBERSHIP 70 /* join a source-specific group */ diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index e509610470c..dd1460f585b 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -2295,6 +2295,10 @@ db_print_inpflags(int inp_flags) db_printf("%sINP_DONTFRAG", comma ? ", " : ""); comma = 1; } + if (inp_flags & INP_RECVTOS) { + db_printf("%sINP_RECVTOS", comma ? ", " : ""); + comma = 1; + } if (inp_flags & IN6P_IPV6_V6ONLY) { db_printf("%sIN6P_IPV6_V6ONLY", comma ? ", " : ""); comma = 1; diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h index c17213b1106..4945b0f1794 100644 --- a/sys/netinet/in_pcb.h +++ b/sys/netinet/in_pcb.h @@ -509,6 +509,7 @@ void inp_4tuple_get(struct inpcb *inp, uint32_t *laddr, uint16_t *lp, #define INP_DONTFRAG 0x00000800 /* don't fragment packet */ #define INP_BINDANY 0x00001000 /* allow bind to any address */ #define INP_INHASHLIST 0x00002000 /* in_pcbinshash() has been called */ +#define INP_RECVTOS 0x00004000 /* receive incoming IP TOS */ #define IN6P_IPV6_V6ONLY 0x00008000 /* restrict AF_INET6 socket for v6 */ #define IN6P_PKTINFO 0x00010000 /* receive IP6 dst and I/F */ #define IN6P_HOPLIMIT 0x00020000 /* receive hoplimit */ @@ -528,7 +529,7 @@ void inp_4tuple_get(struct inpcb *inp, uint32_t *laddr, uint16_t *lp, #define IN6P_MTU 0x80000000 /* receive path MTU */ #define INP_CONTROLOPTS (INP_RECVOPTS|INP_RECVRETOPTS|INP_RECVDSTADDR|\ - INP_RECVIF|INP_RECVTTL|\ + INP_RECVIF|INP_RECVTTL|INP_RECVTOS|\ IN6P_PKTINFO|IN6P_HOPLIMIT|IN6P_HOPOPTS|\ IN6P_DSTOPTS|IN6P_RTHDR|IN6P_RTHDRDSTOPTS|\ IN6P_TCLASS|IN6P_AUTOFLOWLABEL|IN6P_RFC2292|\ diff --git a/sys/netinet/ip.h b/sys/netinet/ip.h index 4fab5cdf20d..79afeb8ffa2 100644 --- a/sys/netinet/ip.h +++ b/sys/netinet/ip.h @@ -91,6 +91,31 @@ struct ip { #define IPTOS_PREC_PRIORITY 0x20 #define IPTOS_PREC_ROUTINE 0x00 +/* + * Definitions for DiffServ Codepoints as per RFC2474 + */ +#define IPTOS_DSCP_CS0 0x00 +#define IPTOS_DSCP_CS1 0x20 +#define IPTOS_DSCP_AF11 0x28 +#define IPTOS_DSCP_AF12 0x30 +#define IPTOS_DSCP_AF13 0x38 +#define IPTOS_DSCP_CS2 0x40 +#define IPTOS_DSCP_AF21 0x48 +#define IPTOS_DSCP_AF22 0x50 +#define IPTOS_DSCP_AF23 0x58 +#define IPTOS_DSCP_CS3 0x60 +#define IPTOS_DSCP_AF31 0x68 +#define IPTOS_DSCP_AF32 0x70 +#define IPTOS_DSCP_AF33 0x78 +#define IPTOS_DSCP_CS4 0x80 +#define IPTOS_DSCP_AF41 0x88 +#define IPTOS_DSCP_AF42 0x90 +#define IPTOS_DSCP_AF43 0x98 +#define IPTOS_DSCP_CS5 0xa0 +#define IPTOS_DSCP_EF 0xb8 +#define IPTOS_DSCP_CS6 0xc0 +#define IPTOS_DSCP_CS7 0xe0 + /* * ECN (Explicit Congestion Notification) codepoints in RFC3168 mapped to the * lower 2 bits of the TOS field. diff --git a/sys/netinet/ip_carp.c b/sys/netinet/ip_carp.c index 2b92aaa381a..c5e275832c9 100644 --- a/sys/netinet/ip_carp.c +++ b/sys/netinet/ip_carp.c @@ -696,7 +696,7 @@ carp_prepare_ad(struct mbuf *m, struct carp_softc *sc, struct carp_header *ch) CARPSTATS_INC(carps_onomem); return (ENOMEM); } - bcopy(&sc, (caddr_t)(mtag + 1), sizeof(struct carp_softc *)); + bcopy(&sc, mtag + 1, sizeof(sc)); m_tag_prepend(m, mtag); return (0); @@ -1061,13 +1061,12 @@ carp_macmatch6(struct ifnet *ifp, struct mbuf *m, const struct in6_addr *taddr) IF_ADDR_RUNLOCK(ifp); mtag = m_tag_get(PACKET_TAG_CARP, - sizeof(struct ifnet *), M_NOWAIT); + sizeof(struct carp_softc *), M_NOWAIT); if (mtag == NULL) /* Better a bit than nothing. */ return (LLADDR(&sc->sc_addr)); - bcopy(&ifp, (caddr_t)(mtag + 1), - sizeof(struct ifnet *)); + bcopy(&sc, mtag + 1, sizeof(sc)); m_tag_prepend(m, mtag); return (LLADDR(&sc->sc_addr)); @@ -1391,7 +1390,7 @@ carp_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *sa) if (mtag == NULL) return (0); - bcopy(mtag + 1, &sc, sizeof(struct carp_softc *)); + bcopy(mtag + 1, &sc, sizeof(sc)); /* Set the source MAC address to the Virtual Router MAC Address. */ switch (ifp->if_type) { diff --git a/sys/netinet/ip_icmp.c b/sys/netinet/ip_icmp.c index 55c28b2bfc2..3260197e7a2 100644 --- a/sys/netinet/ip_icmp.c +++ b/sys/netinet/ip_icmp.c @@ -965,7 +965,8 @@ badport_bandlim(int which) { "icmp tstamp response" }, { "closed port RST response" }, { "open port RST response" }, - { "icmp6 unreach response" } + { "icmp6 unreach response" }, + { "sctp ootb response" } }; /* diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c index 728b50b558a..e9388a0f78d 100644 --- a/sys/netinet/ip_input.c +++ b/sys/netinet/ip_input.c @@ -1495,8 +1495,7 @@ ip_forward(struct mbuf *m, int srcrt) if (error == EMSGSIZE && ro.ro_rt) mtu = ro.ro_rt->rt_rmx.rmx_mtu; - if (ro.ro_rt) - RTFREE(ro.ro_rt); + RO_RTFREE(&ro); if (error) IPSTAT_INC(ips_cantforward); @@ -1684,6 +1683,12 @@ makedummy: if (*mp) mp = &(*mp)->m_next; } + if (inp->inp_flags & INP_RECVTOS) { + *mp = sbcreatecontrol((caddr_t) &ip->ip_tos, + sizeof(u_char), IP_RECVTOS, IPPROTO_IP); + if (*mp) + mp = &(*mp)->m_next; + } } /* diff --git a/sys/netinet/ip_mroute.c b/sys/netinet/ip_mroute.c index d7c23cd0532..9250be5fc00 100644 --- a/sys/netinet/ip_mroute.c +++ b/sys/netinet/ip_mroute.c @@ -924,7 +924,6 @@ add_vif(struct vifctl *vifcp) vifp->v_pkt_out = 0; vifp->v_bytes_in = 0; vifp->v_bytes_out = 0; - bzero(&vifp->v_route, sizeof(vifp->v_route)); /* Adjust numvifs up if the vifi is higher than numvifs */ if (V_numvifs <= vifcp->vifc_vifi) @@ -1702,7 +1701,7 @@ send_packet(struct vif *vifp, struct mbuf *m) * should get rejected because they appear to come from * the loopback interface, thus preventing looping. */ - error = ip_output(m, NULL, &vifp->v_route, IP_FORWARDING, &imo, NULL); + error = ip_output(m, NULL, NULL, IP_FORWARDING, &imo, NULL); CTR3(KTR_IPMF, "%s: vif %td err %d", __func__, (ptrdiff_t)(vifp - V_viftable), error); } diff --git a/sys/netinet/ip_mroute.h b/sys/netinet/ip_mroute.h index c54c75aa0f0..e945b92c161 100644 --- a/sys/netinet/ip_mroute.h +++ b/sys/netinet/ip_mroute.h @@ -262,7 +262,6 @@ struct vif { u_long v_pkt_out; /* # pkts out on interface */ u_long v_bytes_in; /* # bytes in on interface */ u_long v_bytes_out; /* # bytes out on interface */ - struct route v_route; /* cached route */ }; #ifdef _KERNEL diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c index a9008c525af..cc38dcf0fe6 100644 --- a/sys/netinet/ip_output.c +++ b/sys/netinet/ip_output.c @@ -105,6 +105,10 @@ extern struct protosw inetsw[]; * ip_len and ip_off are in host format. * The mbuf chain containing the packet will be freed. * The mbuf opt, if present, will not be freed. + * If route ro is present and has ro_rt initialized, route lookup would be + * skipped and ro->ro_rt would be used. If ro is present but ro->ro_rt is NULL, + * then result of route lookup is stored in ro->ro_rt. + * * In the IP forwarding case, the packet will arrive with options already * inserted, so must have a NULL opt pointer. */ @@ -119,7 +123,6 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags, int mtu; int n; /* scratchpad */ int error = 0; - int nortfree = 0; struct sockaddr_in *dst; struct in_ifaddr *ia = NULL; int isbroadcast, sw_csum; @@ -146,24 +149,23 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags, if (ro == NULL) { ro = &iproute; bzero(ro, sizeof (*ro)); + } #ifdef FLOWTABLE - { - struct flentry *fle; + if (ro->ro_rt == NULL) { + struct flentry *fle; - /* - * The flow table returns route entries valid for up to 30 - * seconds; we rely on the remainder of ip_output() taking no - * longer than that long for the stability of ro_rt. The - * flow ID assignment must have happened before this point. - */ - if ((fle = flowtable_lookup_mbuf(V_ip_ft, m, AF_INET)) != NULL) { - flow_to_route(fle, ro); - nortfree = 1; - } - } -#endif + /* + * The flow table returns route entries valid for up to 30 + * seconds; we rely on the remainder of ip_output() taking no + * longer than that long for the stability of ro_rt. The + * flow ID assignment must have happened before this point. + */ + fle = flowtable_lookup_mbuf(V_ip_ft, m, AF_INET); + if (fle != NULL) + flow_to_route(fle, ro); } +#endif if (opt) { int len = 0; @@ -209,10 +211,9 @@ again: !RT_LINK_IS_UP(rte->rt_ifp) || dst->sin_family != AF_INET || dst->sin_addr.s_addr != ip->ip_dst.s_addr)) { - if (!nortfree) - RTFREE(rte); - rte = ro->ro_rt = (struct rtentry *)NULL; - ro->ro_lle = (struct llentry *)NULL; + RO_RTFREE(ro); + ro->ro_lle = NULL; + rte = NULL; } #ifdef IPFIREWALL_FORWARD if (rte == NULL && fwd_tag == NULL) { @@ -672,9 +673,8 @@ passout: IPSTAT_INC(ips_fragmented); done: - if (ro == &iproute && ro->ro_rt && !nortfree) { - RTFREE(ro->ro_rt); - } + if (ro == &iproute) + RO_RTFREE(ro); if (ia != NULL) ifa_free(&ia->ia_ifa); return (error); @@ -984,6 +984,7 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt) case IP_FAITH: case IP_ONESBCAST: case IP_DONTFRAG: + case IP_RECVTOS: error = sooptcopyin(sopt, &optval, sizeof optval, sizeof optval); if (error) @@ -1047,6 +1048,9 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt) case IP_BINDANY: OPTSET(INP_BINDANY); break; + case IP_RECVTOS: + OPTSET(INP_RECVTOS); + break; } break; #undef OPTSET @@ -1156,6 +1160,7 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt) case IP_ONESBCAST: case IP_DONTFRAG: case IP_BINDANY: + case IP_RECVTOS: switch (sopt->sopt_name) { case IP_TOS: @@ -1214,6 +1219,9 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt) case IP_BINDANY: optval = OPTBIT(INP_BINDANY); break; + case IP_RECVTOS: + optval = OPTBIT(INP_RECVTOS); + break; } error = sooptcopyout(sopt, &optval, sizeof optval); break; diff --git a/sys/netinet/ipfw/ip_dummynet.c b/sys/netinet/ipfw/ip_dummynet.c index e23ba3afe16..928176e24f7 100644 --- a/sys/netinet/ipfw/ip_dummynet.c +++ b/sys/netinet/ipfw/ip_dummynet.c @@ -97,7 +97,7 @@ find_sched_type(int type, char *name) struct dn_alg *d; SLIST_FOREACH(d, &dn_cfg.schedlist, next) { - if (d->type == type || (name && !strcmp(d->name, name))) + if (d->type == type || (name && !strcasecmp(d->name, name))) return d; } return NULL; /* not found */ diff --git a/sys/netinet/ipfw/ip_fw_log.c b/sys/netinet/ipfw/ip_fw_log.c index b9ed6b36da1..14eb2a24690 100644 --- a/sys/netinet/ipfw/ip_fw_log.c +++ b/sys/netinet/ipfw/ip_fw_log.c @@ -44,8 +44,11 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include /* for ETHERTYPE_IP */ #include +#include #include #include /* for IFT_ETHER */ #include /* for BPF */ @@ -90,6 +93,15 @@ ipfw_log_bpf(int onoff) } #else /* !WITHOUT_BPF */ static struct ifnet *log_if; /* hook to attach to bpf */ +static struct rwlock log_if_lock; +#define LOGIF_LOCK_INIT(x) rw_init(&log_if_lock, "ipfw log_if lock") +#define LOGIF_LOCK_DESTROY(x) rw_destroy(&log_if_lock) +#define LOGIF_RLOCK(x) rw_rlock(&log_if_lock) +#define LOGIF_RUNLOCK(x) rw_runlock(&log_if_lock) +#define LOGIF_WLOCK(x) rw_wlock(&log_if_lock) +#define LOGIF_WUNLOCK(x) rw_wunlock(&log_if_lock) + +#define IPFWNAME "ipfw" /* we use this dummy function for all ifnet callbacks */ static int @@ -116,37 +128,105 @@ ipfw_log_start(struct ifnet* ifp) static const u_char ipfwbroadcastaddr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +static int +ipfw_log_clone_match(struct if_clone *ifc, const char *name) +{ + + return (strncmp(name, IPFWNAME, sizeof(IPFWNAME) - 1) == 0); +} + +static int +ipfw_log_clone_create(struct if_clone *ifc, char *name, size_t len, + caddr_t params) +{ + int error; + int unit; + struct ifnet *ifp; + + error = ifc_name2unit(name, &unit); + if (error) + return (error); + + error = ifc_alloc_unit(ifc, &unit); + if (error) + return (error); + + ifp = if_alloc(IFT_ETHER); + if (ifp == NULL) { + ifc_free_unit(ifc, unit); + return (ENOSPC); + } + ifp->if_dname = IPFWNAME; + ifp->if_dunit = unit; + snprintf(ifp->if_xname, IFNAMSIZ, "%s%d", IPFWNAME, unit); + strlcpy(name, ifp->if_xname, len); + ifp->if_mtu = 65536; + ifp->if_flags = IFF_UP | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_init = (void *)log_dummy; + ifp->if_ioctl = log_dummy; + ifp->if_start = ipfw_log_start; + ifp->if_output = ipfw_log_output; + ifp->if_addrlen = 6; + ifp->if_hdrlen = 14; + ifp->if_broadcastaddr = ipfwbroadcastaddr; + ifp->if_baudrate = IF_Mbps(10); + + LOGIF_WLOCK(); + if (log_if == NULL) + log_if = ifp; + else { + LOGIF_WUNLOCK(); + if_free(ifp); + ifc_free_unit(ifc, unit); + return (EEXIST); + } + LOGIF_WUNLOCK(); + if_attach(ifp); + bpfattach(ifp, DLT_EN10MB, 14); + + return (0); +} + +static int +ipfw_log_clone_destroy(struct if_clone *ifc, struct ifnet *ifp) +{ + int unit; + + if (ifp == NULL) + return (0); + + LOGIF_WLOCK(); + if (log_if != NULL && ifp == log_if) + log_if = NULL; + else { + LOGIF_WUNLOCK(); + return (EINVAL); + } + LOGIF_WUNLOCK(); + + unit = ifp->if_dunit; + bpfdetach(ifp); + if_detach(ifp); + if_free(ifp); + ifc_free_unit(ifc, unit); + + return (0); +} + +static struct if_clone ipfw_log_cloner = IFC_CLONE_INITIALIZER( + IPFWNAME, NULL, IF_MAXUNIT, + NULL, ipfw_log_clone_match, ipfw_log_clone_create, ipfw_log_clone_destroy); + void ipfw_log_bpf(int onoff) { - struct ifnet *ifp; if (onoff) { - if (log_if) - return; - ifp = if_alloc(IFT_ETHER); - if (ifp == NULL) - return; - if_initname(ifp, "ipfw", 0); - ifp->if_mtu = 65536; - ifp->if_flags = IFF_UP | IFF_SIMPLEX | IFF_MULTICAST; - ifp->if_init = (void *)log_dummy; - ifp->if_ioctl = log_dummy; - ifp->if_start = ipfw_log_start; - ifp->if_output = ipfw_log_output; - ifp->if_addrlen = 6; - ifp->if_hdrlen = 14; - if_attach(ifp); - ifp->if_broadcastaddr = ipfwbroadcastaddr; - ifp->if_baudrate = IF_Mbps(10); - bpfattach(ifp, DLT_EN10MB, 14); - log_if = ifp; + LOGIF_LOCK_INIT(); + if_clone_attach(&ipfw_log_cloner); } else { - if (log_if) { - ether_ifdetach(log_if); - if_free(log_if); - } - log_if = NULL; + if_clone_detach(&ipfw_log_cloner); + LOGIF_LOCK_DESTROY(); } } #endif /* !WITHOUT_BPF */ @@ -166,9 +246,11 @@ ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, if (V_fw_verbose == 0) { #ifndef WITHOUT_BPF - - if (log_if == NULL || log_if->if_bpf == NULL) + LOGIF_RLOCK(); + if (log_if == NULL || log_if->if_bpf == NULL) { + LOGIF_RUNLOCK(); return; + } if (args->eh) /* layer2, use orig hdr */ BPF_MTAP2(log_if, args->eh, ETHER_HDR_LEN, m); @@ -177,6 +259,7 @@ ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, * more info in the header. */ BPF_MTAP2(log_if, "DDDDDDSSSSSS\x08\x00", ETHER_HDR_LEN, m); + LOGIF_RUNLOCK(); #endif /* !WITHOUT_BPF */ return; } diff --git a/sys/netinet/ipfw/ip_fw_table.c b/sys/netinet/ipfw/ip_fw_table.c index 9de5d53d18a..68a6220195c 100644 --- a/sys/netinet/ipfw/ip_fw_table.c +++ b/sys/netinet/ipfw/ip_fw_table.c @@ -153,6 +153,9 @@ ipfw_add_table_entry(struct ip_fw_chain *ch, uint16_t tbl, void *paddr, case IPFW_TABLE_CIDR: if (plen == sizeof(in_addr_t)) { #ifdef INET + /* IPv4 case */ + if (mlen > 32) + return (EINVAL); ent = malloc(sizeof(*ent), M_IPFW_TBL, M_WAITOK | M_ZERO); ent->value = value; /* Set 'total' structure length */ @@ -341,9 +344,12 @@ ipfw_del_table_entry(struct ip_fw_chain *ch, uint16_t tbl, void *paddr, struct xaddr_iface ifname, ifmask; memset(&ifname, 0, sizeof(ifname)); + /* Include last \0 into comparison */ + mlen++; + /* Set 'total' structure length */ - KEY_LEN(ifname) = mlen; - KEY_LEN(ifmask) = mlen; + KEY_LEN(ifname) = KEY_LEN_IFACE + mlen; + KEY_LEN(ifmask) = KEY_LEN_IFACE + mlen; /* Assume direct match */ /* FIXME: Add interface pattern matching */ #if 0 @@ -565,7 +571,8 @@ ipfw_lookup_table_extended(struct ip_fw_chain *ch, uint16_t tbl, void *paddr, break; case IPFW_TABLE_INTERFACE: - KEY_LEN(iface) = strlcpy(iface.ifname, (char *)paddr, IF_NAMESIZE); + KEY_LEN(iface) = KEY_LEN_IFACE + + strlcpy(iface.ifname, (char *)paddr, IF_NAMESIZE) + 1; /* Assume direct match */ /* FIXME: Add interface pattern matching */ xent = (struct table_xentry *)(rnh->rnh_lookup(&iface, NULL, rnh)); diff --git a/sys/netinet/libalias/alias_sctp.h b/sys/netinet/libalias/alias_sctp.h index 99d54cebedb..bb6db271a49 100644 --- a/sys/netinet/libalias/alias_sctp.h +++ b/sys/netinet/libalias/alias_sctp.h @@ -92,7 +92,6 @@ #ifndef _KERNEL #include #include -#include #endif //#ifdef _KERNEL diff --git a/sys/netinet/libalias/libalias.3 b/sys/netinet/libalias/libalias.3 index b82b0875e41..1837c2957fc 100644 --- a/sys/netinet/libalias/libalias.3 +++ b/sys/netinet/libalias/libalias.3 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 04, 2011 +.Dd July 4, 2011 .Dt LIBALIAS 3 .Os .Sh NAME @@ -201,11 +201,10 @@ is closed. If this mode bit is set, traffic on the local network which does not originate from unregistered address spaces will be ignored. Standard Class A, B and C unregistered addresses are: -.Bd -literal -offset indent +.Pp 10.0.0.0 -> 10.255.255.255 (Class A subnet) 172.16.0.0 -> 172.31.255.255 (Class B subnets) 192.168.0.0 -> 192.168.255.255 (Class C subnets) -.Ed .Pp This option is useful in the case that the packet aliasing host has both registered and unregistered subnets on different interfaces. @@ -499,14 +498,13 @@ call. New traffic generated by any of the local machines, designated in the several function calls, will be aliased to the same address. Consider the following example: -.Bd -literal -offset indent +.Pp LibAliasRedirectAddr(la, inet_aton("192.168.0.2"), inet_aton("141.221.254.101")); LibAliasRedirectAddr(la, inet_aton("192.168.0.3"), inet_aton("141.221.254.101")); LibAliasRedirectAddr(la, inet_aton("192.168.0.4"), inet_aton("141.221.254.101")); -.Ed .Pp Any outgoing connections such as .Xr telnet 1 @@ -919,7 +917,7 @@ added support for PPTP and LSNAT as well as general hacking. .An Paolo Pisati Aq piso@FreeBSD.org made the library modular, moving support for all protocols (except for IP, TCP and UDP) to external modules. -.Sh ACKNOWLEDGMENTS +.Sh ACKNOWLEDGEMENTS Listed below, in approximate chronological order, are individuals who have provided valuable comments and/or debugging assistance. .Bd -ragged -offset indent @@ -1277,10 +1275,10 @@ struct dll { .Ed .Bl -inset .It Va name -is the name of the module +is the name of the module. .It Va handle is a pointer to the module obtained through -.Xr dlopen 3 +.Xr dlopen 3 . .El Whenever a module is loaded in userland, an entry is added to .Va dll_chain , diff --git a/sys/netinet/sctp.h b/sys/netinet/sctp.h index d8158919744..669b02a9f78 100644 --- a/sys/netinet/sctp.h +++ b/sys/netinet/sctp.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -29,7 +29,6 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp.h,v 1.18 2005/03/06 16:04:16 itojun Exp $ */ #include __FBSDID("$FreeBSD$"); @@ -37,6 +36,7 @@ __FBSDID("$FreeBSD$"); #ifndef _NETINET_SCTP_H_ #define _NETINET_SCTP_H_ + #include @@ -265,8 +265,6 @@ struct sctp_paramhdr { #define SCTP_PEELOFF 0x0000800a /* the real worker for sctp_getaddrlen() */ #define SCTP_GET_ADDR_LEN 0x0000800b -/* temporary workaround for Apple listen() issue, no args used */ -#define SCTP_LISTEN_FIX 0x0000800c /* Debug things that need to be purged */ #define SCTP_SET_INITIAL_DBG_SEQ 0x00009f00 @@ -511,35 +509,38 @@ struct sctp_error_unrecognized_chunk { /* * PCB Features (in sctp_features bitmask) */ -#define SCTP_PCB_FLAGS_DO_NOT_PMTUD 0x00000001 -#define SCTP_PCB_FLAGS_EXT_RCVINFO 0x00000002 /* deprecated */ -#define SCTP_PCB_FLAGS_DONOT_HEARTBEAT 0x00000004 -#define SCTP_PCB_FLAGS_FRAG_INTERLEAVE 0x00000008 -#define SCTP_PCB_FLAGS_INTERLEAVE_STRMS 0x00000010 -#define SCTP_PCB_FLAGS_DO_ASCONF 0x00000020 -#define SCTP_PCB_FLAGS_AUTO_ASCONF 0x00000040 -#define SCTP_PCB_FLAGS_ZERO_COPY_ACTIVE 0x00000080 +#define SCTP_PCB_FLAGS_DO_NOT_PMTUD 0x00000001 +#define SCTP_PCB_FLAGS_EXT_RCVINFO 0x00000002 /* deprecated */ +#define SCTP_PCB_FLAGS_DONOT_HEARTBEAT 0x00000004 +#define SCTP_PCB_FLAGS_FRAG_INTERLEAVE 0x00000008 +#define SCTP_PCB_FLAGS_INTERLEAVE_STRMS 0x00000010 +#define SCTP_PCB_FLAGS_DO_ASCONF 0x00000020 +#define SCTP_PCB_FLAGS_AUTO_ASCONF 0x00000040 +#define SCTP_PCB_FLAGS_ZERO_COPY_ACTIVE 0x00000080 /* socket options */ -#define SCTP_PCB_FLAGS_NODELAY 0x00000100 -#define SCTP_PCB_FLAGS_AUTOCLOSE 0x00000200 -#define SCTP_PCB_FLAGS_RECVDATAIOEVNT 0x00000400 /* deprecated */ -#define SCTP_PCB_FLAGS_RECVASSOCEVNT 0x00000800 -#define SCTP_PCB_FLAGS_RECVPADDREVNT 0x00001000 -#define SCTP_PCB_FLAGS_RECVPEERERR 0x00002000 -#define SCTP_PCB_FLAGS_RECVSENDFAILEVNT 0x00004000 -#define SCTP_PCB_FLAGS_RECVSHUTDOWNEVNT 0x00008000 -#define SCTP_PCB_FLAGS_ADAPTATIONEVNT 0x00010000 -#define SCTP_PCB_FLAGS_PDAPIEVNT 0x00020000 -#define SCTP_PCB_FLAGS_AUTHEVNT 0x00040000 -#define SCTP_PCB_FLAGS_STREAM_RESETEVNT 0x00080000 -#define SCTP_PCB_FLAGS_NO_FRAGMENT 0x00100000 -#define SCTP_PCB_FLAGS_EXPLICIT_EOR 0x00400000 -#define SCTP_PCB_FLAGS_NEEDS_MAPPED_V4 0x00800000 -#define SCTP_PCB_FLAGS_MULTIPLE_ASCONFS 0x01000000 -#define SCTP_PCB_FLAGS_PORTREUSE 0x02000000 -#define SCTP_PCB_FLAGS_DRYEVNT 0x04000000 -#define SCTP_PCB_FLAGS_RECVRCVINFO 0x08000000 -#define SCTP_PCB_FLAGS_RECVNXTINFO 0x10000000 +#define SCTP_PCB_FLAGS_NODELAY 0x00000100 +#define SCTP_PCB_FLAGS_AUTOCLOSE 0x00000200 +#define SCTP_PCB_FLAGS_RECVDATAIOEVNT 0x00000400 /* deprecated */ +#define SCTP_PCB_FLAGS_RECVASSOCEVNT 0x00000800 +#define SCTP_PCB_FLAGS_RECVPADDREVNT 0x00001000 +#define SCTP_PCB_FLAGS_RECVPEERERR 0x00002000 +#define SCTP_PCB_FLAGS_RECVSENDFAILEVNT 0x00004000 /* deprecated */ +#define SCTP_PCB_FLAGS_RECVSHUTDOWNEVNT 0x00008000 +#define SCTP_PCB_FLAGS_ADAPTATIONEVNT 0x00010000 +#define SCTP_PCB_FLAGS_PDAPIEVNT 0x00020000 +#define SCTP_PCB_FLAGS_AUTHEVNT 0x00040000 +#define SCTP_PCB_FLAGS_STREAM_RESETEVNT 0x00080000 +#define SCTP_PCB_FLAGS_NO_FRAGMENT 0x00100000 +#define SCTP_PCB_FLAGS_EXPLICIT_EOR 0x00400000 +#define SCTP_PCB_FLAGS_NEEDS_MAPPED_V4 0x00800000 +#define SCTP_PCB_FLAGS_MULTIPLE_ASCONFS 0x01000000 +#define SCTP_PCB_FLAGS_PORTREUSE 0x02000000 +#define SCTP_PCB_FLAGS_DRYEVNT 0x04000000 +#define SCTP_PCB_FLAGS_RECVRCVINFO 0x08000000 +#define SCTP_PCB_FLAGS_RECVNXTINFO 0x10000000 +#define SCTP_PCB_FLAGS_ASSOC_RESETEVNT 0x20000000 +#define SCTP_PCB_FLAGS_STREAM_CHANGEEVNT 0x40000000 +#define SCTP_PCB_FLAGS_RECVNSENDFAILEVNT 0x80000000 /*- * mobility_features parameters (by micchie).Note @@ -547,14 +548,16 @@ struct sctp_error_unrecognized_chunk { * sctp_mobility_features flags.. not the sctp_features * flags. */ -#define SCTP_MOBILITY_BASE 0x00000001 -#define SCTP_MOBILITY_FASTHANDOFF 0x00000002 -#define SCTP_MOBILITY_PRIM_DELETED 0x00000004 +#define SCTP_MOBILITY_BASE 0x00000001 +#define SCTP_MOBILITY_FASTHANDOFF 0x00000002 +#define SCTP_MOBILITY_PRIM_DELETED 0x00000004 #define SCTP_SMALLEST_PMTU 512 /* smallest pmtu allowed when disabling PMTU * discovery */ +#undef SCTP_PACKED + #include /* This dictates the size of the packet @@ -606,7 +609,4 @@ struct sctp_error_unrecognized_chunk { #define SCTP_LOG_AT_SEND_2_OUTQ 0x08000000 #define SCTP_LOG_TRY_ADVANCE 0x10000000 - -#undef SCTP_PACKED - #endif /* !_NETINET_SCTP_H_ */ diff --git a/sys/netinet/sctp_asconf.c b/sys/netinet/sctp_asconf.c index ec030d504aa..1a1aa96dd3a 100644 --- a/sys/netinet/sctp_asconf.c +++ b/sys/netinet/sctp_asconf.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,10 +30,9 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_asconf.c,v 1.24 2005/03/06 16:04:16 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); + #include #include #include @@ -49,63 +48,10 @@ __FBSDID("$FreeBSD$"); * SCTP_DEBUG_ASCONF1: protocol info, general info and errors * SCTP_DEBUG_ASCONF2: detailed info */ -#ifdef SCTP_DEBUG -#endif /* SCTP_DEBUG */ -static void -sctp_asconf_get_source_ip(struct mbuf *m, struct sockaddr *sa) -{ - struct ip *iph; - -#ifdef INET - struct sockaddr_in *sin; - -#endif -#ifdef INET6 - struct sockaddr_in6 *sin6; - -#endif - - iph = mtod(m, struct ip *); - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - { - /* IPv4 source */ - sin = (struct sockaddr_in *)sa; - bzero(sin, sizeof(*sin)); - sin->sin_family = AF_INET; - sin->sin_len = sizeof(struct sockaddr_in); - sin->sin_port = 0; - sin->sin_addr.s_addr = iph->ip_src.s_addr; - break; - } -#endif -#ifdef INET6 - case (IPV6_VERSION >> 4): - { - /* IPv6 source */ - struct ip6_hdr *ip6; - - sin6 = (struct sockaddr_in6 *)sa; - bzero(sin6, sizeof(*sin6)); - sin6->sin6_family = AF_INET6; - sin6->sin6_len = sizeof(struct sockaddr_in6); - sin6->sin6_port = 0; - ip6 = mtod(m, struct ip6_hdr *); - sin6->sin6_addr = ip6->ip6_src; - break; - } -#endif /* INET6 */ - default: - break; - } - return; -} - /* - * draft-ietf-tsvwg-addip-sctp + * RFC 5061 * * An ASCONF parameter queue exists per asoc which holds the pending address * operations. Lists are updated upon receipt of ASCONF-ACK. @@ -197,12 +143,12 @@ sctp_asconf_error_response(uint32_t id, uint16_t cause, uint8_t * error_tlv, } static struct mbuf * -sctp_process_asconf_add_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, +sctp_process_asconf_add_ip(struct sockaddr *src, struct sctp_asconf_paramhdr *aph, struct sctp_tcb *stcb, int send_hb, int response_required) { struct sctp_nets *net; struct mbuf *m_reply = NULL; - struct sockaddr_storage sa_source, sa_store; + struct sockaddr_storage sa_store; struct sctp_paramhdr *ph; uint16_t param_type, param_length, aparam_length; struct sockaddr *sa; @@ -282,11 +228,10 @@ sctp_process_asconf_add_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, /* if 0.0.0.0/::0, add the source address instead */ if (zero_address && SCTP_BASE_SYSCTL(sctp_nat_friendly)) { - sa = (struct sockaddr *)&sa_source; - sctp_asconf_get_source_ip(m, sa); + sa = src; SCTPDBG(SCTP_DEBUG_ASCONF1, "process_asconf_add_ip: using source addr "); - SCTPDBG_ADDR(SCTP_DEBUG_ASCONF1, sa); + SCTPDBG_ADDR(SCTP_DEBUG_ASCONF1, src); } /* add the address */ if (bad_address) { @@ -346,11 +291,12 @@ sctp_asconf_del_remote_addrs_except(struct sctp_tcb *stcb, struct sockaddr *src) } static struct mbuf * -sctp_process_asconf_delete_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, +sctp_process_asconf_delete_ip(struct sockaddr *src, + struct sctp_asconf_paramhdr *aph, struct sctp_tcb *stcb, int response_required) { struct mbuf *m_reply = NULL; - struct sockaddr_storage sa_source, sa_store; + struct sockaddr_storage sa_store; struct sctp_paramhdr *ph; uint16_t param_type, param_length, aparam_length; struct sockaddr *sa; @@ -368,9 +314,6 @@ sctp_process_asconf_delete_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, #endif - /* get the source IP address for src and 0.0.0.0/::0 delete checks */ - sctp_asconf_get_source_ip(m, (struct sockaddr *)&sa_source); - aparam_length = ntohs(aph->ph.param_length); ph = (struct sctp_paramhdr *)(aph + 1); param_type = ntohs(ph->param_type); @@ -427,7 +370,7 @@ sctp_process_asconf_delete_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, } /* make sure the source address is not being deleted */ - if (sctp_cmpaddr(sa, (struct sockaddr *)&sa_source)) { + if (sctp_cmpaddr(sa, src)) { /* trying to delete the source address! */ SCTPDBG(SCTP_DEBUG_ASCONF1, "process_asconf_delete_ip: tried to delete source addr\n"); m_reply = sctp_asconf_error_response(aph->correlation_id, @@ -437,8 +380,7 @@ sctp_process_asconf_delete_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, } /* if deleting 0.0.0.0/::0, delete all addresses except src addr */ if (zero_address && SCTP_BASE_SYSCTL(sctp_nat_friendly)) { - result = sctp_asconf_del_remote_addrs_except(stcb, - (struct sockaddr *)&sa_source); + result = sctp_asconf_del_remote_addrs_except(stcb, src); if (result) { /* src address did not exist? */ @@ -478,12 +420,12 @@ sctp_process_asconf_delete_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, } static struct mbuf * -sctp_process_asconf_set_primary(struct mbuf *m, +sctp_process_asconf_set_primary(struct sockaddr *src, struct sctp_asconf_paramhdr *aph, struct sctp_tcb *stcb, int response_required) { struct mbuf *m_reply = NULL; - struct sockaddr_storage sa_source, sa_store; + struct sockaddr_storage sa_store; struct sctp_paramhdr *ph; uint16_t param_type, param_length, aparam_length; struct sockaddr *sa; @@ -553,11 +495,10 @@ sctp_process_asconf_set_primary(struct mbuf *m, /* if 0.0.0.0/::0, use the source address instead */ if (zero_address && SCTP_BASE_SYSCTL(sctp_nat_friendly)) { - sa = (struct sockaddr *)&sa_source; - sctp_asconf_get_source_ip(m, sa); + sa = src; SCTPDBG(SCTP_DEBUG_ASCONF1, "process_asconf_set_primary: using source addr "); - SCTPDBG_ADDR(SCTP_DEBUG_ASCONF1, sa); + SCTPDBG_ADDR(SCTP_DEBUG_ASCONF1, src); } /* set the primary address */ if (sctp_set_primary_addr(stcb, sa, NULL) == 0) { @@ -629,6 +570,7 @@ sctp_process_asconf_set_primary(struct mbuf *m, */ void sctp_handle_asconf(struct mbuf *m, unsigned int offset, + struct sockaddr *src, struct sctp_asconf_chunk *cp, struct sctp_tcb *stcb, int first) { @@ -765,13 +707,13 @@ sctp_handle_asconf(struct mbuf *m, unsigned int offset, switch (param_type) { case SCTP_ADD_IP_ADDRESS: asoc->peer_supports_asconf = 1; - m_result = sctp_process_asconf_add_ip(m, aph, stcb, + m_result = sctp_process_asconf_add_ip(src, aph, stcb, (cnt < SCTP_BASE_SYSCTL(sctp_hb_maxburst)), error); cnt++; break; case SCTP_DEL_IP_ADDRESS: asoc->peer_supports_asconf = 1; - m_result = sctp_process_asconf_delete_ip(m, aph, stcb, + m_result = sctp_process_asconf_delete_ip(src, aph, stcb, error); break; case SCTP_ERROR_CAUSE_IND: @@ -779,7 +721,7 @@ sctp_handle_asconf(struct mbuf *m, unsigned int offset, break; case SCTP_SET_PRIM_ADDR: asoc->peer_supports_asconf = 1; - m_result = sctp_process_asconf_set_primary(m, aph, + m_result = sctp_process_asconf_set_primary(src, aph, stcb, error); break; case SCTP_NAT_VTAGS: @@ -859,70 +801,16 @@ send_reply: * this could happen if the source address was just newly * added */ - struct ip *iph; - struct sctphdr *sh; - struct sockaddr_storage from_store; - struct sockaddr *from = (struct sockaddr *)&from_store; - SCTPDBG(SCTP_DEBUG_ASCONF1, "handle_asconf: looking up net for IP source address\n"); - /* pullup already done, IP options already stripped */ - iph = mtod(m, struct ip *); - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - { - struct sockaddr_in *from4; - - sh = (struct sctphdr *)((caddr_t)iph + sizeof(*iph)); - from4 = (struct sockaddr_in *)&from_store; - bzero(from4, sizeof(*from4)); - from4->sin_family = AF_INET; - from4->sin_len = sizeof(struct sockaddr_in); - from4->sin_addr.s_addr = iph->ip_src.s_addr; - from4->sin_port = sh->src_port; - break; - } -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - { - struct ip6_hdr *ip6; - struct sockaddr_in6 *from6; - - ip6 = mtod(m, struct ip6_hdr *); - sh = (struct sctphdr *)((caddr_t)ip6 + sizeof(*ip6)); - from6 = (struct sockaddr_in6 *)&from_store; - bzero(from6, sizeof(*from6)); - from6->sin6_family = AF_INET6; - from6->sin6_len = sizeof(struct sockaddr_in6); - from6->sin6_addr = ip6->ip6_src; - from6->sin6_port = sh->src_port; - /* - * Get the scopes in properly to the sin6 - * addr's - */ - /* we probably don't need these operations */ - (void)sa6_recoverscope(from6); - sa6_embedscope(from6, - MODULE_GLOBAL(ip6_use_defzone)); - - break; - } -#endif - default: - /* unknown address type */ - from = NULL; - } - if (from != NULL) { - SCTPDBG(SCTP_DEBUG_ASCONF1, "Looking for IP source: "); - SCTPDBG_ADDR(SCTP_DEBUG_ASCONF1, from); - /* look up the from address */ - stcb->asoc.last_control_chunk_from = sctp_findnet(stcb, from); + SCTPDBG(SCTP_DEBUG_ASCONF1, "Looking for IP source: "); + SCTPDBG_ADDR(SCTP_DEBUG_ASCONF1, src); + /* look up the from address */ + stcb->asoc.last_control_chunk_from = sctp_findnet(stcb, src); #ifdef SCTP_DEBUG - if (stcb->asoc.last_control_chunk_from == NULL) - SCTPDBG(SCTP_DEBUG_ASCONF1, "handle_asconf: IP source address not found?!\n"); -#endif + if (stcb->asoc.last_control_chunk_from == NULL) { + SCTPDBG(SCTP_DEBUG_ASCONF1, "handle_asconf: IP source address not found?!\n"); } +#endif } } @@ -1789,8 +1677,7 @@ sctp_handle_asconf_ack(struct mbuf *m, int offset, */ if (serial_num == (asoc->asconf_seq_out + 1)) { SCTPDBG(SCTP_DEBUG_ASCONF1, "handle_asconf_ack: got unexpected next serial number! Aborting asoc!\n"); - sctp_abort_an_association(stcb->sctp_ep, stcb, - SCTP_CAUSE_ILLEGAL_ASCONF_ACK, NULL, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, NULL, SCTP_SO_NOT_LOCKED); *abort_no_unlock = 1; return; } diff --git a/sys/netinet/sctp_asconf.h b/sys/netinet/sctp_asconf.h index 1b9ac865bfa..183c99b4b98 100644 --- a/sys/netinet/sctp_asconf.h +++ b/sys/netinet/sctp_asconf.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,8 +30,6 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_asconf.h,v 1.8 2005/03/06 16:04:16 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); @@ -48,8 +46,8 @@ extern void sctp_asconf_cleanup(struct sctp_tcb *, struct sctp_nets *); extern struct mbuf *sctp_compose_asconf(struct sctp_tcb *, int *, int); extern void -sctp_handle_asconf(struct mbuf *, unsigned int, struct sctp_asconf_chunk *, - struct sctp_tcb *, int i); +sctp_handle_asconf(struct mbuf *, unsigned int, struct sockaddr *, + struct sctp_asconf_chunk *, struct sctp_tcb *, int); extern void sctp_handle_asconf_ack(struct mbuf *, int, struct sctp_asconf_ack_chunk *, diff --git a/sys/netinet/sctp_auth.c b/sys/netinet/sctp_auth.c index b5bae4dfee4..532538aaba1 100644 --- a/sys/netinet/sctp_auth.c +++ b/sys/netinet/sctp_auth.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -284,16 +284,16 @@ sctp_print_key(sctp_key_t * key, const char *str) uint32_t i; if (key == NULL) { - printf("%s: [Null key]\n", str); + SCTP_PRINTF("%s: [Null key]\n", str); return; } - printf("%s: len %u, ", str, key->keylen); + SCTP_PRINTF("%s: len %u, ", str, key->keylen); if (key->keylen) { for (i = 0; i < key->keylen; i++) - printf("%02x", key->key[i]); - printf("\n"); + SCTP_PRINTF("%02x", key->key[i]); + SCTP_PRINTF("\n"); } else { - printf("[Null key]\n"); + SCTP_PRINTF("[Null key]\n"); } } @@ -303,16 +303,16 @@ sctp_show_key(sctp_key_t * key, const char *str) uint32_t i; if (key == NULL) { - printf("%s: [Null key]\n", str); + SCTP_PRINTF("%s: [Null key]\n", str); return; } - printf("%s: len %u, ", str, key->keylen); + SCTP_PRINTF("%s: len %u, ", str, key->keylen); if (key->keylen) { for (i = 0; i < key->keylen; i++) - printf("%02x", key->key[i]); - printf("\n"); + SCTP_PRINTF("%02x", key->key[i]); + SCTP_PRINTF("\n"); } else { - printf("[Null key]\n"); + SCTP_PRINTF("[Null key]\n"); } } @@ -1801,7 +1801,7 @@ sctp_handle_auth(struct sctp_tcb *stcb, struct sctp_auth_chunk *auth, * shared_key_id, (void * *)stcb->asoc.authinfo.recv_keyid); */ - sctp_notify_authentication(stcb, SCTP_AUTH_NEWKEY, + sctp_notify_authentication(stcb, SCTP_AUTH_NEW_KEY, shared_key_id, stcb->asoc.authinfo.recv_keyid, SCTP_SO_NOT_LOCKED); /* compute a new recv assoc key and cache it */ diff --git a/sys/netinet/sctp_auth.h b/sys/netinet/sctp_auth.h index 7034ba0fa23..eac89f6fca8 100644 --- a/sys/netinet/sctp_auth.h +++ b/sys/netinet/sctp_auth.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -33,8 +33,8 @@ #include __FBSDID("$FreeBSD$"); -#ifndef __SCTP_AUTH_H__ -#define __SCTP_AUTH_H__ +#ifndef _NETINET_SCTP_AUTH_H_ +#define _NETINET_SCTP_AUTH_H_ /* digest lengths */ diff --git a/sys/netinet/sctp_bsd_addr.c b/sys/netinet/sctp_bsd_addr.c index 394d1ec5e73..14b1b685d68 100644 --- a/sys/netinet/sctp_bsd_addr.c +++ b/sys/netinet/sctp_bsd_addr.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,8 +30,6 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_output.c,v 1.46 2005/03/06 16:04:17 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); @@ -424,11 +422,12 @@ sctp_get_mbuf_for_msg(unsigned int space_needed, int want_header, #ifdef SCTP_PACKET_LOGGING void -sctp_packet_log(struct mbuf *m, int length) +sctp_packet_log(struct mbuf *m) { int *lenat, thisone; void *copyto; uint32_t *tick_tock; + int length; int total_len; int grabbed_lock = 0; int value, newval, thisend, thisbegin; @@ -438,6 +437,7 @@ sctp_packet_log(struct mbuf *m, int length) * (value) -ticks of log (ticks) o -ip packet o -as logged - * where this started (thisbegin) x <--end points here */ + length = SCTP_HEADER_LEN(m); total_len = SCTP_SIZE32((length + (4 * sizeof(int)))); /* Log a packet to the buffer. */ if (total_len > SCTP_PACKET_LOG_SIZE) { @@ -483,7 +483,7 @@ again_locked: } /* Sanity check */ if (thisend >= SCTP_PACKET_LOG_SIZE) { - printf("Insanity stops a log thisbegin:%d thisend:%d writers:%d lock:%d end:%d\n", + SCTP_PRINTF("Insanity stops a log thisbegin:%d thisend:%d writers:%d lock:%d end:%d\n", thisbegin, thisend, SCTP_BASE_VAR(packet_log_writers), diff --git a/sys/netinet/sctp_bsd_addr.h b/sys/netinet/sctp_bsd_addr.h index 1c3fe3c5b7d..24660ca569c 100644 --- a/sys/netinet/sctp_bsd_addr.h +++ b/sys/netinet/sctp_bsd_addr.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -33,8 +33,9 @@ #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_bsd_addr_h__ -#define __sctp_bsd_addr_h__ +#ifndef _NETINET_SCTP_BSD_ADDR_H_ +#define _NETINET_SCTP_BSD_ADDR_H_ + #include #if defined(_KERNEL) || defined(__Userspace__) @@ -52,7 +53,7 @@ void sctp_gather_internal_ifa_flags(struct sctp_ifa *ifa); #ifdef SCTP_PACKET_LOGGING -void sctp_packet_log(struct mbuf *m, int length); +void sctp_packet_log(struct mbuf *m); int sctp_copy_out_packet_log(uint8_t * target, int length); #endif diff --git a/sys/netinet/sctp_cc_functions.c b/sys/netinet/sctp_cc_functions.c index cd0cbba6d58..121f40d26eb 100644 --- a/sys/netinet/sctp_cc_functions.c +++ b/sys/netinet/sctp_cc_functions.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,6 +30,9 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + #include #include #include @@ -44,8 +47,6 @@ #include #include #include -#include -__FBSDID("$FreeBSD$"); #define SHIFT_MPTCP_MULTI_N 40 #define SHIFT_MPTCP_MULTI_Z 16 @@ -1594,9 +1595,7 @@ sctp_hs_cwnd_increase(struct sctp_tcb *stcb, struct sctp_nets *net) cur_val = net->cwnd >> 10; indx = SCTP_HS_TABLE_SIZE - 1; -#ifdef SCTP_DEBUG - printf("HS CC CAlled.\n"); -#endif + if (cur_val < sctp_cwnd_adjust[0].cwnd) { /* normal mode */ if (net->net_ack > net->mtu) { diff --git a/sys/netinet/sctp_constants.h b/sys/netinet/sctp_constants.h index e53d6994470..dd70bcb0f27 100644 --- a/sys/netinet/sctp_constants.h +++ b/sys/netinet/sctp_constants.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,13 +30,11 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_constants.h,v 1.17 2005/03/06 16:04:17 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_constants_h__ -#define __sctp_constants_h__ +#ifndef _NETINET_SCTP_CONSTANTS_H_ +#define _NETINET_SCTP_CONSTANTS_H_ /* IANA assigned port number for SCTP over UDP encapsulation */ /* For freebsd we cannot bind the port at @@ -348,7 +346,7 @@ __FBSDID("$FreeBSD$"); #define SCTP_NO_FR_UNLESS_SEGMENT_SMALLER 1 /* default max I can burst out after a fast retransmit, 0 disables it */ -#define SCTP_DEF_MAX_BURST 0 +#define SCTP_DEF_MAX_BURST 4 #define SCTP_DEF_HBMAX_BURST 4 #define SCTP_DEF_FRMAX_BURST 4 @@ -460,18 +458,6 @@ __FBSDID("$FreeBSD$"); #define SCTP_HAS_NAT_SUPPORT 0xc007 #define SCTP_NAT_VTAGS 0xc008 -/* Notification error codes */ -#define SCTP_NOTIFY_DATAGRAM_UNSENT 0x0001 -#define SCTP_NOTIFY_DATAGRAM_SENT 0x0002 -#define SCTP_FAILED_THRESHOLD 0x0004 -#define SCTP_HEARTBEAT_SUCCESS 0x0008 -#define SCTP_RESPONSE_TO_USER_REQ 0x0010 -#define SCTP_INTERNAL_ERROR 0x0020 -#define SCTP_SHUTDOWN_GUARD_EXPIRES 0x0040 -#define SCTP_RECEIVED_SACK 0x0080 -#define SCTP_PEER_FAULTY 0x0100 -#define SCTP_ICMP_REFUSED 0x0200 - /* bits for TOS field */ #define SCTP_ECT0_BIT 0x02 #define SCTP_ECT1_BIT 0x01 @@ -755,35 +741,29 @@ __FBSDID("$FreeBSD$"); #define SCTP_NOTIFY_ASSOC_DOWN 2 #define SCTP_NOTIFY_INTERFACE_DOWN 3 #define SCTP_NOTIFY_INTERFACE_UP 4 -#define SCTP_NOTIFY_DG_FAIL 5 -#define SCTP_NOTIFY_STRDATA_ERR 6 -#define SCTP_NOTIFY_ASSOC_ABORTED 7 -#define SCTP_NOTIFY_PEER_OPENED_STREAM 8 -#define SCTP_NOTIFY_STREAM_OPENED_OK 9 +#define SCTP_NOTIFY_SENT_DG_FAIL 5 +#define SCTP_NOTIFY_UNSENT_DG_FAIL 6 +#define SCTP_NOTIFY_SPECIAL_SP_FAIL 7 +#define SCTP_NOTIFY_ASSOC_LOC_ABORTED 8 +#define SCTP_NOTIFY_ASSOC_REM_ABORTED 9 #define SCTP_NOTIFY_ASSOC_RESTART 10 -#define SCTP_NOTIFY_HB_RESP 11 -#define SCTP_NOTIFY_ASCONF_SUCCESS 12 -#define SCTP_NOTIFY_ASCONF_FAILED 13 -#define SCTP_NOTIFY_PEER_SHUTDOWN 14 -#define SCTP_NOTIFY_ASCONF_ADD_IP 15 -#define SCTP_NOTIFY_ASCONF_DELETE_IP 16 -#define SCTP_NOTIFY_ASCONF_SET_PRIMARY 17 -#define SCTP_NOTIFY_PARTIAL_DELVIERY_INDICATION 18 -#define SCTP_NOTIFY_INTERFACE_CONFIRMED 20 -#define SCTP_NOTIFY_STR_RESET_RECV 21 -#define SCTP_NOTIFY_STR_RESET_SEND 22 -#define SCTP_NOTIFY_STR_RESET_FAILED_OUT 23 -#define SCTP_NOTIFY_STR_RESET_FAILED_IN 24 -#define SCTP_NOTIFY_AUTH_NEW_KEY 25 -#define SCTP_NOTIFY_AUTH_FREE_KEY 26 -#define SCTP_NOTIFY_SPECIAL_SP_FAIL 27 -#define SCTP_NOTIFY_NO_PEER_AUTH 28 -#define SCTP_NOTIFY_SENDER_DRY 29 -#define SCTP_NOTIFY_STR_RESET_ADD_OK 30 -#define SCTP_NOTIFY_STR_RESET_ADD_FAIL 31 -#define SCTP_NOTIFY_STR_RESET_INSTREAM_ADD_OK 32 -#define SCTP_NOTIFY_MAX 32 - +#define SCTP_NOTIFY_PEER_SHUTDOWN 11 +#define SCTP_NOTIFY_ASCONF_ADD_IP 12 +#define SCTP_NOTIFY_ASCONF_DELETE_IP 13 +#define SCTP_NOTIFY_ASCONF_SET_PRIMARY 14 +#define SCTP_NOTIFY_PARTIAL_DELVIERY_INDICATION 15 +#define SCTP_NOTIFY_INTERFACE_CONFIRMED 16 +#define SCTP_NOTIFY_STR_RESET_RECV 17 +#define SCTP_NOTIFY_STR_RESET_SEND 18 +#define SCTP_NOTIFY_STR_RESET_FAILED_OUT 19 +#define SCTP_NOTIFY_STR_RESET_FAILED_IN 20 +#define SCTP_NOTIFY_STR_RESET_DENIED_OUT 21 +#define SCTP_NOTIFY_STR_RESET_DENIED_IN 22 +#define SCTP_NOTIFY_AUTH_NEW_KEY 23 +#define SCTP_NOTIFY_AUTH_FREE_KEY 24 +#define SCTP_NOTIFY_NO_PEER_AUTH 25 +#define SCTP_NOTIFY_SENDER_DRY 26 +#define SCTP_NOTIFY_REMOTE_ERROR 27 /* This is the value for messages that are NOT completely * copied down where we will start to split the message. diff --git a/sys/netinet/sctp_crc32.c b/sys/netinet/sctp_crc32.c index 1b514b1f39c..e7d5c9bb13e 100644 --- a/sys/netinet/sctp_crc32.c +++ b/sys/netinet/sctp_crc32.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,9 +30,6 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_crc32.c,v 1.12 2005/03/06 16:04:17 itojun Exp $ */ - - #include __FBSDID("$FreeBSD$"); @@ -124,7 +121,9 @@ void sctp_delayed_cksum(struct mbuf *m, uint32_t offset) { #if defined(SCTP_WITH_NO_CSUM) +#ifdef INVARIANTS panic("sctp_delayed_cksum() called when using no SCTP CRC."); +#endif #else uint32_t checksum; @@ -134,7 +133,7 @@ sctp_delayed_cksum(struct mbuf *m, uint32_t offset) offset += offsetof(struct sctphdr, checksum); if (offset + sizeof(uint32_t) > (uint32_t) (m->m_len)) { - printf("sctp_delayed_cksum(): m->len: %d, off: %d.\n", + SCTP_PRINTF("sctp_delayed_cksum(): m->len: %d, off: %d.\n", (uint32_t) m->m_len, offset); /* * XXX this shouldn't happen, but if it does, the correct diff --git a/sys/netinet/sctp_crc32.h b/sys/netinet/sctp_crc32.h index 0f22cab59c4..3f98be41c48 100644 --- a/sys/netinet/sctp_crc32.h +++ b/sys/netinet/sctp_crc32.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,13 +30,11 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_crc32.h,v 1.5 2004/08/17 04:06:16 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); -#ifndef __crc32c_h__ -#define __crc32c_h__ +#ifndef _NETINET_SCTP_CRC32_H_ +#define _NETINET_SCTP_CRC32_H_ #if defined(_KERNEL) #if !defined(SCTP_WITH_NO_CSUM) diff --git a/sys/netinet/sctp_dtrace_declare.h b/sys/netinet/sctp_dtrace_declare.h index 1dcb835e12f..930a547c578 100644 --- a/sys/netinet/sctp_dtrace_declare.h +++ b/sys/netinet/sctp_dtrace_declare.h @@ -1,6 +1,6 @@ /*- - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -28,9 +28,13 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ + #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_dtrace_declare_h__ + +#ifndef _NETINET_SCTP_DTRACE_DECLARE_H_ +#define _NETINET_SCTP_DTRACE_DECLARE_H_ + #include "opt_kdtrace.h" #include #include diff --git a/sys/netinet/sctp_dtrace_define.h b/sys/netinet/sctp_dtrace_define.h index 34929dd9141..5247b02dc9b 100644 --- a/sys/netinet/sctp_dtrace_define.h +++ b/sys/netinet/sctp_dtrace_define.h @@ -1,6 +1,6 @@ /*- - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -28,9 +28,13 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ + #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_dtrace_define_h__ + +#ifndef _NETINET_SCTP_DTRACE_DEFINE_H_ +#define _NETINET_SCTP_DTRACE_DEFINE_H_ + #include "opt_kdtrace.h" #include #include diff --git a/sys/netinet/sctp_header.h b/sys/netinet/sctp_header.h index 1d92b656a29..a26e9b45fbd 100644 --- a/sys/netinet/sctp_header.h +++ b/sys/netinet/sctp_header.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,13 +30,11 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_header.h,v 1.14 2005/03/06 16:04:17 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_header_h__ -#define __sctp_header_h__ +#ifndef _NETINET_SCTP_HEADER_H_ +#define _NETINET_SCTP_HEADER_H_ #include #include @@ -499,12 +497,13 @@ struct sctp_stream_reset_add_strm { uint16_t reserved; } SCTP_PACKED; -#define SCTP_STREAM_RESET_NOTHING 0x00000000 /* Nothing for me to do */ -#define SCTP_STREAM_RESET_PERFORMED 0x00000001 /* Did it */ -#define SCTP_STREAM_RESET_REJECT 0x00000002 /* refused to do it */ -#define SCTP_STREAM_RESET_ERROR_STR 0x00000003 /* bad Stream no */ -#define SCTP_STREAM_RESET_TRY_LATER 0x00000004 /* collision, try again */ -#define SCTP_STREAM_RESET_BAD_SEQNO 0x00000005 /* bad str-reset seq no */ +#define SCTP_STREAM_RESET_RESULT_NOTHING_TO_DO 0x00000000 /* XXX: unused */ +#define SCTP_STREAM_RESET_RESULT_PERFORMED 0x00000001 +#define SCTP_STREAM_RESET_RESULT_DENIED 0x00000002 +#define SCTP_STREAM_RESET_RESULT_ERR__WRONG_SSN 0x00000003 /* XXX: unused */ +#define SCTP_STREAM_RESET_RESULT_ERR_IN_PROGRESS 0x00000004 +#define SCTP_STREAM_RESET_RESULT_ERR_BAD_SEQNO 0x00000005 +#define SCTP_STREAM_RESET_RESULT_IN_PROGRESS 0x00000006 /* XXX: unused */ /* * convience structures, note that if you are making a request for specific diff --git a/sys/netinet/sctp_indata.c b/sys/netinet/sctp_indata.c index d7b9d9c6903..449c825cee6 100644 --- a/sys/netinet/sctp_indata.c +++ b/sys/netinet/sctp_indata.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,8 +30,6 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_indata.c,v 1.36 2005/03/06 16:04:17 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); @@ -328,7 +326,7 @@ sctp_mark_non_revokable(struct sctp_association *asoc, uint32_t tsn) } SCTP_CALC_TSN_TO_GAP(gap, tsn, asoc->mapping_array_base_tsn); if (!SCTP_IS_TSN_PRESENT(asoc->mapping_array, gap)) { - printf("gap:%x tsn:%x\n", gap, tsn); + SCTP_PRINTF("gap:%x tsn:%x\n", gap, tsn); sctp_print_mapping_array(asoc); #ifdef INVARIANTS panic("Things are really messed up now!!"); @@ -607,9 +605,7 @@ protocol_error: *ippp = ((control->sinfo_stream << 16) | control->sinfo_ssn); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_1; - sctp_abort_an_association(stcb->sctp_ep, stcb, - SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return; @@ -892,8 +888,7 @@ sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_2; - sctp_abort_an_association(stcb->sctp_ep, stcb, - SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; } else if (asoc->fragmented_delivery_inprogress && (chk->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG) == SCTP_DATA_FIRST_FRAG) { @@ -924,8 +919,7 @@ sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, *ippp = ((chk->rec.data.stream_number << 16) | chk->rec.data.stream_seq); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_3; - sctp_abort_an_association(stcb->sctp_ep, stcb, - SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; } else if (asoc->fragmented_delivery_inprogress) { /* @@ -961,8 +955,7 @@ sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, *ippp = ((chk->rec.data.stream_number << 16) | chk->rec.data.stream_seq); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_4; - sctp_abort_an_association(stcb->sctp_ep, - stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; } else if ((asoc->fragment_flags & SCTP_DATA_UNORDERED) != SCTP_DATA_UNORDERED && @@ -995,8 +988,7 @@ sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_5; - sctp_abort_an_association(stcb->sctp_ep, - stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; } } @@ -1090,8 +1082,7 @@ sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_6; - sctp_abort_an_association(stcb->sctp_ep, - stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return; } @@ -1127,9 +1118,7 @@ sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, *ippp = ((chk->rec.data.stream_number << 16) | chk->rec.data.stream_seq); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_7; - sctp_abort_an_association(stcb->sctp_ep, - stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return; } @@ -1166,9 +1155,7 @@ sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, *ippp = ((chk->rec.data.stream_number << 16) | chk->rec.data.stream_seq); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_8; - sctp_abort_an_association(stcb->sctp_ep, - stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return; } @@ -1202,9 +1189,7 @@ sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_9; - sctp_abort_an_association(stcb->sctp_ep, - stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return; } @@ -1247,9 +1232,7 @@ sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, *ippp = ((chk->rec.data.stream_number << 16) | chk->rec.data.stream_seq); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_10; - sctp_abort_an_association(stcb->sctp_ep, - stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return; } @@ -1289,9 +1272,7 @@ sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_11; - sctp_abort_an_association(stcb->sctp_ep, - stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return; } @@ -1328,9 +1309,7 @@ sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_12; - sctp_abort_an_association(stcb->sctp_ep, - stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return; } @@ -1367,9 +1346,7 @@ sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, *ippp = ((chk->rec.data.stream_number << 16) | chk->rec.data.stream_seq); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_13; - sctp_abort_an_association(stcb->sctp_ep, - stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return; } @@ -1531,7 +1508,7 @@ sctp_process_a_data_chunk(struct sctp_tcb *stcb, struct sctp_association *asoc, struct mbuf *op_err; op_err = sctp_generate_invmanparam(SCTP_CAUSE_OUT_OF_RESC); - sctp_abort_an_association(stcb->sctp_ep, stcb, 0, op_err, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return (0); } @@ -1552,7 +1529,7 @@ sctp_process_a_data_chunk(struct sctp_tcb *stcb, struct sctp_association *asoc, */ if (stcb->sctp_socket->so_rcv.sb_cc) { /* some to read, wake-up */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; so = SCTP_INP_SO(stcb->sctp_ep); @@ -1568,7 +1545,7 @@ sctp_process_a_data_chunk(struct sctp_tcb *stcb, struct sctp_association *asoc, } #endif sctp_sorwakeup(stcb->sctp_ep, stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } @@ -1678,8 +1655,7 @@ sctp_process_a_data_chunk(struct sctp_tcb *stcb, struct sctp_association *asoc, } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_14; - sctp_abort_an_association(stcb->sctp_ep, stcb, - SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return (0); } @@ -1942,9 +1918,7 @@ failed_pdapi_express_del: *ippp = ((strmno << 16) | strmseq); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_15; - sctp_abort_an_association(stcb->sctp_ep, stcb, - SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return (0); } else { @@ -1980,9 +1954,7 @@ failed_pdapi_express_del: *ippp = ((strmno << 16) | strmseq); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_16; - sctp_abort_an_association(stcb->sctp_ep, - stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return (0); } @@ -2027,9 +1999,7 @@ failed_pdapi_express_del: *ippp = ((strmno << 16) | strmseq); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_17; - sctp_abort_an_association(stcb->sctp_ep, - stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return (0); } @@ -2308,7 +2278,7 @@ sctp_slide_mapping_arrays(struct sctp_tcb *stcb) #ifdef INVARIANTS for (i = 0; i < asoc->mapping_array_size; i++) { if ((asoc->mapping_array[i]) || (asoc->nr_mapping_array[i])) { - printf("Error Mapping array's not clean at clear\n"); + SCTP_PRINTF("Error Mapping array's not clean at clear\n"); sctp_print_mapping_array(asoc); } } @@ -2330,7 +2300,7 @@ sctp_slide_mapping_arrays(struct sctp_tcb *stcb) #ifdef INVARIANTS panic("impossible slide"); #else - printf("impossible slide lgap:%x slide_end:%x slide_from:%x? at:%d\n", + SCTP_PRINTF("impossible slide lgap:%x slide_end:%x slide_from:%x? at:%d\n", lgap, slide_end, slide_from, at); return; #endif @@ -2339,7 +2309,7 @@ sctp_slide_mapping_arrays(struct sctp_tcb *stcb) #ifdef INVARIANTS panic("would overrun buffer"); #else - printf("Gak, would have overrun map end:%d slide_end:%d\n", + SCTP_PRINTF("Gak, would have overrun map end:%d slide_end:%d\n", asoc->mapping_array_size, slide_end); slide_end = asoc->mapping_array_size; #endif @@ -2546,8 +2516,11 @@ doit_again: int sctp_process_data(struct mbuf **mm, int iphlen, int *offset, int length, - struct sctphdr *sh, struct sctp_inpcb *inp, struct sctp_tcb *stcb, - struct sctp_nets *net, uint32_t * high_tsn) + struct sockaddr *src, struct sockaddr *dst, + struct sctphdr *sh, struct sctp_inpcb *inp, + struct sctp_tcb *stcb, struct sctp_nets *net, uint32_t * high_tsn, + uint8_t use_mflowid, uint32_t mflowid, + uint32_t vrf_id, uint16_t port) { struct sctp_data_chunk *ch, chunk_buf; struct sctp_association *asoc; @@ -2654,8 +2627,10 @@ sctp_process_data(struct mbuf **mm, int iphlen, int *offset, int length, } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_19; - sctp_abort_association(inp, stcb, m, iphlen, sh, - op_err, 0, net->port); + sctp_abort_association(inp, stcb, m, iphlen, + src, dst, sh, op_err, + use_mflowid, mflowid, + vrf_id, port); return (2); } #ifdef SCTP_AUDITING_ENABLED @@ -2719,7 +2694,12 @@ sctp_process_data(struct mbuf **mm, int iphlen, int *offset, int length, struct mbuf *op_err; op_err = sctp_generate_invmanparam(SCTP_CAUSE_PROTOCOL_VIOLATION); - sctp_abort_association(inp, stcb, m, iphlen, sh, op_err, 0, net->port); + sctp_abort_association(inp, stcb, + m, iphlen, + src, dst, + sh, op_err, + use_mflowid, mflowid, + vrf_id, port); return (2); } break; @@ -2784,7 +2764,7 @@ sctp_process_data(struct mbuf **mm, int iphlen, int *offset, int length, /* * we need to report rwnd overrun drops. */ - sctp_send_packet_dropped(stcb, net, *mm, iphlen, 0); + sctp_send_packet_dropped(stcb, net, *mm, length, iphlen, 0); } if (num_chunks) { /* @@ -3222,8 +3202,7 @@ sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc, if (timevalcmp(&now, &tp1->rec.data.timetodrop, >)) { /* Yes so drop it */ if (tp1->data != NULL) { - (void)sctp_release_pr_sctp_chunk(stcb, tp1, - (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT), + (void)sctp_release_pr_sctp_chunk(stcb, tp1, 1, SCTP_SO_NOT_LOCKED); } continue; @@ -3480,8 +3459,7 @@ sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc, if (tp1->snd_count > tp1->rec.data.timetodrop.tv_sec) { /* Yes, so drop it */ if (tp1->data != NULL) { - (void)sctp_release_pr_sctp_chunk(stcb, tp1, - (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT), + (void)sctp_release_pr_sctp_chunk(stcb, tp1, 1, SCTP_SO_NOT_LOCKED); } /* Make sure to flag we had a FR */ @@ -3489,7 +3467,10 @@ sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc, continue; } } - /* printf("OK, we are now ready to FR this guy\n"); */ + /* + * SCTP_PRINTF("OK, we are now ready to FR this + * guy\n"); + */ if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { sctp_log_fr(tp1->rec.data.TSN_seq, tp1->snd_count, 0, SCTP_FR_MARKED); @@ -3557,7 +3538,7 @@ sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc, tot_retrans++; /* mark the sending seq for possible subsequent FR's */ /* - * printf("Marking TSN for FR new value %x\n", + * SCTP_PRINTF("Marking TSN for FR new value %x\n", * (uint32_t)tpi->rec.data.TSN_seq); */ if (TAILQ_EMPTY(&asoc->send_queue)) { @@ -3657,8 +3638,7 @@ sctp_try_advance_peer_ack_point(struct sctp_tcb *stcb, /* Yes so drop it */ if (tp1->data) { (void)sctp_release_pr_sctp_chunk(stcb, tp1, - (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT), - SCTP_SO_NOT_LOCKED); + 1, SCTP_SO_NOT_LOCKED); } } else { /* @@ -3709,11 +3689,10 @@ sctp_fs_audit(struct sctp_association *asoc) TAILQ_FOREACH(chk, &asoc->sent_queue, sctp_next) { if (chk->sent < SCTP_DATAGRAM_RESEND) { - printf("Chk TSN:%u size:%d inflight cnt:%d\n", + SCTP_PRINTF("Chk TSN:%u size:%d inflight cnt:%d\n", chk->rec.data.TSN_seq, chk->send_size, - chk->snd_count - ); + chk->snd_count); inflight++; } else if (chk->sent == SCTP_DATAGRAM_RESEND) { resend++; @@ -3730,7 +3709,7 @@ sctp_fs_audit(struct sctp_association *asoc) #ifdef INVARIANTS panic("Flight size-express incorrect? \n"); #else - printf("asoc->total_flight:%d cnt:%d\n", + SCTP_PRINTF("asoc->total_flight:%d cnt:%d\n", entry_flight, entry_cnt); SCTP_PRINTF("Flight size-express incorrect F:%d I:%d R:%d Ab:%d ACK:%d\n", @@ -3876,7 +3855,7 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack, *ippp = htonl(SCTP_FROM_SCTP_INDATA + SCTP_LOC_25); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_25; - sctp_abort_an_association(stcb->sctp_ep, stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); return; #endif } @@ -3895,7 +3874,7 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack, TAILQ_FOREACH_SAFE(tp1, &asoc->sent_queue, sctp_next, tp2) { if (SCTP_TSN_GE(cumack, tp1->rec.data.TSN_seq)) { if (tp1->sent == SCTP_DATAGRAM_UNSENT) { - printf("Warning, an unsent is now acked?\n"); + SCTP_PRINTF("Warning, an unsent is now acked?\n"); } if (tp1->sent < SCTP_DATAGRAM_ACKED) { /* @@ -4005,7 +3984,7 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack, } /* sa_ignore NO_NULL_CHK */ if (stcb->sctp_socket) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif @@ -4014,7 +3993,7 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack, /* sa_ignore NO_NULL_CHK */ sctp_wakeup_log(stcb, 1, SCTP_WAKESND_FROM_SACK); } -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(stcb->sctp_ep); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -4028,7 +4007,7 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack, } #endif sctp_sowwakeup_locked(stcb->sctp_ep, stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } else { @@ -4050,7 +4029,7 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack, /* addr came good */ net->dest_state |= SCTP_ADDR_REACHABLE; sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, - SCTP_RECEIVED_SACK, (void *)net, SCTP_SO_NOT_LOCKED); + 0, (void *)net, SCTP_SO_NOT_LOCKED); } if (net == stcb->asoc.primary_destination) { if (stcb->asoc.alternate) { @@ -4238,7 +4217,7 @@ again: *ippp = htonl(SCTP_FROM_SCTP_INDATA + SCTP_LOC_24); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_24; - sctp_abort_an_association(stcb->sctp_ep, stcb, SCTP_RESPONSE_TO_USER_REQ, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); } else { struct sctp_nets *netp; @@ -4437,10 +4416,10 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, * no way, we have not even sent this TSN out yet. * Peer is hopelessly messed up with us. */ - printf("NEW cum_ack:%x send_s:%x is smaller or equal\n", + SCTP_PRINTF("NEW cum_ack:%x send_s:%x is smaller or equal\n", cum_ack, send_s); if (tp1) { - printf("Got send_s from tsn:%x + 1 of tp1:%p\n", + SCTP_PRINTF("Got send_s from tsn:%x + 1 of tp1:%p\n", tp1->rec.data.TSN_seq, tp1); } hopeless_peer: @@ -4461,7 +4440,7 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, *ippp = htonl(SCTP_FROM_SCTP_INDATA + SCTP_LOC_25); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_25; - sctp_abort_an_association(stcb->sctp_ep, stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); return; } } @@ -4681,10 +4660,8 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, * peer is either confused or we are under * attack. We must abort. */ - printf("Hopeless peer! biggest_tsn_acked:%x largest seq:%x\n", - biggest_tsn_acked, - send_s); - + SCTP_PRINTF("Hopeless peer! biggest_tsn_acked:%x largest seq:%x\n", + biggest_tsn_acked, send_s); goto hopeless_peer; } } @@ -4719,7 +4696,7 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, } if (tp1->sent == SCTP_DATAGRAM_UNSENT) { /* no more sent on list */ - printf("Warning, tp1->sent == %d and its now acked?\n", + SCTP_PRINTF("Warning, tp1->sent == %d and its now acked?\n", tp1->sent); } TAILQ_REMOVE(&asoc->sent_queue, tp1, sctp_next); @@ -4759,7 +4736,7 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, } /* sa_ignore NO_NULL_CHK */ if ((wake_him) && (stcb->sctp_socket)) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif @@ -4767,7 +4744,7 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_WAKE_LOGGING_ENABLE) { sctp_wakeup_log(stcb, wake_him, SCTP_WAKESND_FROM_SACK); } -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(stcb->sctp_ep); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -4781,7 +4758,7 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, } #endif sctp_sowwakeup_locked(stcb->sctp_ep, stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } else { @@ -4859,7 +4836,7 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, /* addr came good */ net->dest_state |= SCTP_ADDR_REACHABLE; sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, - SCTP_RECEIVED_SACK, (void *)net, SCTP_SO_NOT_LOCKED); + 0, (void *)net, SCTP_SO_NOT_LOCKED); } if (net == stcb->asoc.primary_destination) { if (stcb->asoc.alternate) { @@ -4966,7 +4943,7 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, *ippp = htonl(SCTP_FROM_SCTP_INDATA + SCTP_LOC_31); } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_31; - sctp_abort_an_association(stcb->sctp_ep, stcb, SCTP_RESPONSE_TO_USER_REQ, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); return; } else { struct sctp_nets *netp; @@ -5421,8 +5398,7 @@ sctp_handle_forward_tsn(struct sctp_tcb *stcb, *ippp = new_cum_tsn; } stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_33; - sctp_abort_an_association(stcb->sctp_ep, stcb, - SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); return; } SCTP_STAT_INCR(sctps_fwdtsn_map_over); diff --git a/sys/netinet/sctp_indata.h b/sys/netinet/sctp_indata.h index fc0136be0f8..5eaa1f4ba41 100644 --- a/sys/netinet/sctp_indata.h +++ b/sys/netinet/sctp_indata.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,13 +30,11 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_indata.h,v 1.9 2005/03/06 16:04:17 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_indata_h__ -#define __sctp_indata_h__ +#ifndef _NETINET_SCTP_INDATA_H_ +#define _NETINET_SCTP_INDATA_H_ #if defined(_KERNEL) || defined(__Userspace__) @@ -113,9 +111,13 @@ void sctp_update_acked(struct sctp_tcb *, struct sctp_shutdown_chunk *, int *); int -sctp_process_data(struct mbuf **, int, int *, int, struct sctphdr *, +sctp_process_data(struct mbuf **, int, int *, int, + struct sockaddr *src, struct sockaddr *dst, + struct sctphdr *, struct sctp_inpcb *, struct sctp_tcb *, - struct sctp_nets *, uint32_t *); + struct sctp_nets *, uint32_t *, + uint8_t, uint32_t, + uint32_t, uint16_t); void sctp_slide_mapping_arrays(struct sctp_tcb *stcb); diff --git a/sys/netinet/sctp_input.c b/sys/netinet/sctp_input.c index b138c7bec02..6d2ec6d4ac7 100644 --- a/sys/netinet/sctp_input.c +++ b/sys/netinet/sctp_input.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,8 +30,6 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_input.c,v 1.27 2005/03/06 16:04:17 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); @@ -82,9 +80,12 @@ sctp_stop_all_cookie_timers(struct sctp_tcb *stcb) /* INIT handler */ static void -sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh, - struct sctp_init_chunk *cp, struct sctp_inpcb *inp, struct sctp_tcb *stcb, - int *abort_no_unlock, uint32_t vrf_id, uint16_t port) +sctp_handle_init(struct mbuf *m, int iphlen, int offset, + struct sockaddr *src, struct sockaddr *dst, struct sctphdr *sh, + struct sctp_init_chunk *cp, struct sctp_inpcb *inp, + struct sctp_tcb *stcb, int *abort_no_unlock, + uint8_t use_mflowid, uint32_t mflowid, + uint32_t vrf_id, uint16_t port) { struct sctp_init *init; struct mbuf *op_err; @@ -97,7 +98,8 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh, /* validate length */ if (ntohs(cp->ch.chunk_length) < sizeof(struct sctp_init_chunk)) { op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM); - sctp_abort_association(inp, stcb, m, iphlen, sh, op_err, + sctp_abort_association(inp, stcb, m, iphlen, src, dst, sh, op_err, + use_mflowid, mflowid, vrf_id, port); if (stcb) *abort_no_unlock = 1; @@ -108,7 +110,8 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh, if (init->initiate_tag == 0) { /* protocol error... send abort */ op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM); - sctp_abort_association(inp, stcb, m, iphlen, sh, op_err, + sctp_abort_association(inp, stcb, m, iphlen, src, dst, sh, op_err, + use_mflowid, mflowid, vrf_id, port); if (stcb) *abort_no_unlock = 1; @@ -117,7 +120,8 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh, if (ntohl(init->a_rwnd) < SCTP_MIN_RWND) { /* invalid parameter... send abort */ op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM); - sctp_abort_association(inp, stcb, m, iphlen, sh, op_err, + sctp_abort_association(inp, stcb, m, iphlen, src, dst, sh, op_err, + use_mflowid, mflowid, vrf_id, port); if (stcb) *abort_no_unlock = 1; @@ -126,7 +130,8 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh, if (init->num_inbound_streams == 0) { /* protocol error... send abort */ op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM); - sctp_abort_association(inp, stcb, m, iphlen, sh, op_err, + sctp_abort_association(inp, stcb, m, iphlen, src, dst, sh, op_err, + use_mflowid, mflowid, vrf_id, port); if (stcb) *abort_no_unlock = 1; @@ -135,7 +140,8 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh, if (init->num_outbound_streams == 0) { /* protocol error... send abort */ op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM); - sctp_abort_association(inp, stcb, m, iphlen, sh, op_err, + sctp_abort_association(inp, stcb, m, iphlen, src, dst, sh, op_err, + use_mflowid, mflowid, vrf_id, port); if (stcb) *abort_no_unlock = 1; @@ -144,7 +150,9 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh, if (sctp_validate_init_auth_params(m, offset + sizeof(*cp), offset + ntohs(cp->ch.chunk_length))) { /* auth parameter(s) error... send abort */ - sctp_abort_association(inp, stcb, m, iphlen, sh, NULL, vrf_id, port); + sctp_abort_association(inp, stcb, m, iphlen, src, dst, sh, NULL, + use_mflowid, mflowid, + vrf_id, port); if (stcb) *abort_no_unlock = 1; goto outnow; @@ -171,7 +179,9 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh, * state :-) */ if (SCTP_BASE_SYSCTL(sctp_blackhole) == 0) { - sctp_send_abort(m, iphlen, sh, 0, NULL, vrf_id, port); + sctp_send_abort(m, iphlen, src, dst, sh, 0, NULL, + use_mflowid, mflowid, + vrf_id, port); } goto outnow; } @@ -182,7 +192,10 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh, sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_CONTROL_PROC, SCTP_SO_NOT_LOCKED); } else { SCTPDBG(SCTP_DEBUG_INPUT3, "sctp_handle_init: sending INIT-ACK\n"); - sctp_send_initiate_ack(inp, stcb, m, iphlen, offset, sh, cp, vrf_id, port, + sctp_send_initiate_ack(inp, stcb, m, iphlen, offset, src, dst, + sh, cp, + use_mflowid, mflowid, + vrf_id, port, ((stcb == NULL) ? SCTP_HOLDS_LOCK : SCTP_NOT_LOCKED)); } outnow: @@ -300,8 +313,8 @@ sctp_process_init(struct sctp_init_chunk *cp, struct sctp_tcb *stcb) asoc->send_queue_cnt--; if (chk->data != NULL) { sctp_free_bufspace(stcb, asoc, chk, 1); - sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb, - SCTP_NOTIFY_DATAGRAM_UNSENT, chk, SCTP_SO_NOT_LOCKED); + sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, + 0, chk, SCTP_SO_NOT_LOCKED); if (chk->data) { sctp_m_freem(chk->data); chk->data = NULL; @@ -318,8 +331,7 @@ sctp_process_init(struct sctp_init_chunk *cp, struct sctp_tcb *stcb) TAILQ_REMOVE(&outs->outqueue, sp, next); asoc->stream_queue_cnt--; sctp_ulp_notify(SCTP_NOTIFY_SPECIAL_SP_FAIL, - stcb, SCTP_NOTIFY_DATAGRAM_UNSENT, - sp, SCTP_SO_NOT_LOCKED); + stcb, 0, sp, SCTP_SO_NOT_LOCKED); if (sp->data) { sctp_m_freem(sp->data); sp->data = NULL; @@ -410,8 +422,11 @@ sctp_process_init(struct sctp_init_chunk *cp, struct sctp_tcb *stcb) */ static int sctp_process_init_ack(struct mbuf *m, int iphlen, int offset, - struct sctphdr *sh, struct sctp_init_ack_chunk *cp, struct sctp_tcb *stcb, - struct sctp_nets *net, int *abort_no_unlock, uint32_t vrf_id) + struct sockaddr *src, struct sockaddr *dst, struct sctphdr *sh, + struct sctp_init_ack_chunk *cp, struct sctp_tcb *stcb, + struct sctp_nets *net, int *abort_no_unlock, + uint8_t use_mflowid, uint32_t mflowid, + uint32_t vrf_id) { struct sctp_association *asoc; struct mbuf *op_err; @@ -428,7 +443,7 @@ sctp_process_init_ack(struct mbuf *m, int iphlen, int offset, &abort_flag, (struct sctp_chunkhdr *)cp, &nat_friendly); if (abort_flag) { /* Send an abort and notify peer */ - sctp_abort_an_association(stcb->sctp_ep, stcb, SCTP_CAUSE_PROTOCOL_VIOLATION, op_err, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); *abort_no_unlock = 1; return (-1); } @@ -442,14 +457,16 @@ sctp_process_init_ack(struct mbuf *m, int iphlen, int offset, initack_limit = offset + ntohs(cp->ch.chunk_length); /* load all addresses */ if ((retval = sctp_load_addresses_from_init(stcb, m, - (offset + sizeof(struct sctp_init_chunk)), initack_limit, sh, - NULL))) { + (offset + sizeof(struct sctp_init_chunk)), initack_limit, + src, dst, NULL))) { /* Huh, we should abort */ SCTPDBG(SCTP_DEBUG_INPUT1, "Load addresses from INIT causes an abort %d\n", retval); - sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, sh, - NULL, 0, net->port); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, NULL, + use_mflowid, mflowid, + vrf_id, net->port); *abort_no_unlock = 1; return (-1); } @@ -523,7 +540,9 @@ sctp_process_init_ack(struct mbuf *m, int iphlen, int offset, mp->resv = 0; } sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, - sh, op_err, vrf_id, net->port); + src, dst, sh, op_err, + use_mflowid, mflowid, + vrf_id, net->port); *abort_no_unlock = 1; } return (retval); @@ -632,7 +651,7 @@ sctp_handle_heartbeat_ack(struct sctp_heartbeat_chunk *cp, if (!(r_net->dest_state & SCTP_ADDR_REACHABLE)) { r_net->dest_state |= SCTP_ADDR_REACHABLE; sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, - SCTP_HEARTBEAT_SUCCESS, (void *)r_net, SCTP_SO_NOT_LOCKED); + 0, (void *)r_net, SCTP_SO_NOT_LOCKED); } if (r_net->dest_state & SCTP_ADDR_PF) { r_net->dest_state &= ~SCTP_ADDR_PF; @@ -739,61 +758,51 @@ sctp_handle_nat_missing_state(struct sctp_tcb *stcb, static void -sctp_handle_abort(struct sctp_abort_chunk *cp, +sctp_handle_abort(struct sctp_abort_chunk *abort, struct sctp_tcb *stcb, struct sctp_nets *net) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif uint16_t len; + uint16_t error; SCTPDBG(SCTP_DEBUG_INPUT2, "sctp_handle_abort: handling ABORT\n"); if (stcb == NULL) return; - len = ntohs(cp->ch.chunk_length); + len = ntohs(abort->ch.chunk_length); if (len > sizeof(struct sctp_chunkhdr)) { /* * Need to check the cause codes for our two magic nat * aborts which don't kill the assoc necessarily. */ - struct sctp_abort_chunk *cpnext; struct sctp_missing_nat_state *natc; - uint16_t cause; - cpnext = cp; - cpnext++; - natc = (struct sctp_missing_nat_state *)cpnext; - cause = ntohs(natc->cause); - if (cause == SCTP_CAUSE_NAT_COLLIDING_STATE) { + natc = (struct sctp_missing_nat_state *)(abort + 1); + error = ntohs(natc->cause); + if (error == SCTP_CAUSE_NAT_COLLIDING_STATE) { SCTPDBG(SCTP_DEBUG_INPUT2, "Received Colliding state abort flags:%x\n", - cp->ch.chunk_flags); + abort->ch.chunk_flags); if (sctp_handle_nat_colliding_state(stcb)) { return; } - } else if (cause == SCTP_CAUSE_NAT_MISSING_STATE) { + } else if (error == SCTP_CAUSE_NAT_MISSING_STATE) { SCTPDBG(SCTP_DEBUG_INPUT2, "Received missing state abort flags:%x\n", - cp->ch.chunk_flags); + abort->ch.chunk_flags); if (sctp_handle_nat_missing_state(stcb, net)) { return; } } + } else { + error = 0; } /* stop any receive timers */ sctp_timer_stop(SCTP_TIMER_TYPE_RECV, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_INPUT + SCTP_LOC_6); /* notify user of the abort and clean up... */ - sctp_abort_notification(stcb, 0, SCTP_SO_NOT_LOCKED); + sctp_abort_notification(stcb, 1, error, abort, SCTP_SO_NOT_LOCKED); /* free the tcb */ -#if defined(SCTP_PANIC_ON_ABORT) - printf("stcb:%p state:%d rport:%d net:%p\n", - stcb, stcb->asoc.state, stcb->rport, net); - if (!(stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET)) { - panic("Received an ABORT"); - } else { - printf("No panic its in state %x closed\n", stcb->asoc.state); - } -#endif SCTP_STAT_INCR_COUNTER32(sctps_aborted); if ((SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_OPEN) || (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { @@ -802,7 +811,7 @@ sctp_handle_abort(struct sctp_abort_chunk *cp, #ifdef SCTP_ASOCLOG_OF_TSNS sctp_print_out_track_log(stcb); #endif -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(stcb->sctp_ep); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -813,7 +822,7 @@ sctp_handle_abort(struct sctp_abort_chunk *cp, stcb->asoc.state |= SCTP_STATE_WAS_ABORTED; (void)sctp_free_assoc(stcb->sctp_ep, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_6); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif SCTPDBG(SCTP_DEBUG_INPUT2, "sctp_handle_abort: finished\n"); @@ -855,7 +864,7 @@ sctp_handle_shutdown(struct sctp_shutdown_chunk *cp, struct sctp_association *asoc; int some_on_streamwheel; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif @@ -887,7 +896,7 @@ sctp_handle_shutdown(struct sctp_shutdown_chunk *cp, asoc->control_pdapi->pdapi_aborted = 1; asoc->control_pdapi = NULL; SCTP_INP_READ_UNLOCK(stcb->sctp_ep); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(stcb->sctp_ep); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -901,7 +910,7 @@ sctp_handle_shutdown(struct sctp_shutdown_chunk *cp, } #endif sctp_sorwakeup(stcb->sctp_ep, stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } @@ -961,7 +970,7 @@ sctp_handle_shutdown_ack(struct sctp_shutdown_ack_chunk *cp SCTP_UNUSED, { struct sctp_association *asoc; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; so = SCTP_INP_SO(stcb->sctp_ep); @@ -995,7 +1004,7 @@ sctp_handle_shutdown_ack(struct sctp_shutdown_ack_chunk *cp SCTP_UNUSED, asoc->control_pdapi->pdapi_aborted = 1; asoc->control_pdapi = NULL; SCTP_INP_READ_UNLOCK(stcb->sctp_ep); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); SCTP_SOCKET_LOCK(so, 1); @@ -1008,7 +1017,7 @@ sctp_handle_shutdown_ack(struct sctp_shutdown_ack_chunk *cp SCTP_UNUSED, } #endif sctp_sorwakeup(stcb->sctp_ep, stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } @@ -1016,7 +1025,7 @@ sctp_handle_shutdown_ack(struct sctp_shutdown_ack_chunk *cp SCTP_UNUSED, if (!TAILQ_EMPTY(&asoc->send_queue) || !TAILQ_EMPTY(&asoc->sent_queue) || !stcb->asoc.ss_functions.sctp_ss_is_empty(stcb, asoc)) { - sctp_report_all_outbound(stcb, 0, SCTP_SO_NOT_LOCKED); + sctp_report_all_outbound(stcb, 0, 0, SCTP_SO_NOT_LOCKED); } /* stop the timer */ sctp_timer_stop(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_INPUT + SCTP_LOC_9); @@ -1032,7 +1041,7 @@ sctp_handle_shutdown_ack(struct sctp_shutdown_ack_chunk *cp SCTP_UNUSED, } SCTP_STAT_INCR_COUNTER32(sctps_shutdown); /* free the TCB but first save off the ep */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); SCTP_SOCKET_LOCK(so, 1); @@ -1041,7 +1050,7 @@ sctp_handle_shutdown_ack(struct sctp_shutdown_ack_chunk *cp SCTP_UNUSED, #endif (void)sctp_free_assoc(stcb->sctp_ep, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_10); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } @@ -1122,12 +1131,12 @@ sctp_handle_error(struct sctp_chunkhdr *ch, { int chklen; struct sctp_paramhdr *phdr; - uint16_t error_type; + uint16_t error, error_type; uint16_t error_len; struct sctp_association *asoc; int adjust; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif @@ -1137,6 +1146,7 @@ sctp_handle_error(struct sctp_chunkhdr *ch, phdr = (struct sctp_paramhdr *)((caddr_t)ch + sizeof(struct sctp_chunkhdr)); chklen = ntohs(ch->chunk_length) - sizeof(struct sctp_chunkhdr); + error = 0; while ((size_t)chklen >= sizeof(struct sctp_paramhdr)) { /* Process an Error Cause */ error_type = ntohs(phdr->param_type); @@ -1147,6 +1157,10 @@ sctp_handle_error(struct sctp_chunkhdr *ch, chklen, error_len); return (0); } + if (error == 0) { + /* report the first error cause */ + error = error_type; + } switch (error_type) { case SCTP_CAUSE_INVALID_STREAM: case SCTP_CAUSE_MISSING_PARAM: @@ -1183,9 +1197,9 @@ sctp_handle_error(struct sctp_chunkhdr *ch, asoc->stale_cookie_count++; if (asoc->stale_cookie_count > asoc->max_init_times) { - sctp_abort_notification(stcb, 0, SCTP_SO_NOT_LOCKED); + sctp_abort_notification(stcb, 0, 0, NULL, SCTP_SO_NOT_LOCKED); /* now free the asoc */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(stcb->sctp_ep); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -1195,7 +1209,7 @@ sctp_handle_error(struct sctp_chunkhdr *ch, #endif (void)sctp_free_assoc(stcb->sctp_ep, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_11); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif return (-1); @@ -1263,13 +1277,17 @@ sctp_handle_error(struct sctp_chunkhdr *ch, chklen -= adjust; phdr = (struct sctp_paramhdr *)((caddr_t)phdr + adjust); } + sctp_ulp_notify(SCTP_NOTIFY_REMOTE_ERROR, stcb, error, ch, SCTP_SO_NOT_LOCKED); return (0); } static int sctp_handle_init_ack(struct mbuf *m, int iphlen, int offset, - struct sctphdr *sh, struct sctp_init_ack_chunk *cp, struct sctp_tcb *stcb, - struct sctp_nets *net, int *abort_no_unlock, uint32_t vrf_id) + struct sockaddr *src, struct sockaddr *dst, struct sctphdr *sh, + struct sctp_init_ack_chunk *cp, struct sctp_tcb *stcb, + struct sctp_nets *net, int *abort_no_unlock, + uint8_t use_mflowid, uint32_t mflowid, + uint32_t vrf_id) { struct sctp_init_ack *init_ack; struct mbuf *op_err; @@ -1285,8 +1303,10 @@ sctp_handle_init_ack(struct mbuf *m, int iphlen, int offset, if (ntohs(cp->ch.chunk_length) < sizeof(struct sctp_init_ack_chunk)) { /* Invalid length */ op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM); - sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, sh, - op_err, 0, net->port); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, + use_mflowid, mflowid, + vrf_id, net->port); *abort_no_unlock = 1; return (-1); } @@ -1295,32 +1315,40 @@ sctp_handle_init_ack(struct mbuf *m, int iphlen, int offset, if (init_ack->initiate_tag == 0) { /* protocol error... send an abort */ op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM); - sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, sh, - op_err, 0, net->port); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, + use_mflowid, mflowid, + vrf_id, net->port); *abort_no_unlock = 1; return (-1); } if (ntohl(init_ack->a_rwnd) < SCTP_MIN_RWND) { /* protocol error... send an abort */ op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM); - sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, sh, - op_err, 0, net->port); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, + use_mflowid, mflowid, + vrf_id, net->port); *abort_no_unlock = 1; return (-1); } if (init_ack->num_inbound_streams == 0) { /* protocol error... send an abort */ op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM); - sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, sh, - op_err, 0, net->port); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, + use_mflowid, mflowid, + vrf_id, net->port); *abort_no_unlock = 1; return (-1); } if (init_ack->num_outbound_streams == 0) { /* protocol error... send an abort */ op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM); - sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, sh, - op_err, 0, net->port); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, + use_mflowid, mflowid, + vrf_id, net->port); *abort_no_unlock = 1; return (-1); } @@ -1342,8 +1370,10 @@ sctp_handle_init_ack(struct mbuf *m, int iphlen, int offset, sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_CONFIRMED, stcb, 0, (void *)stcb->asoc.primary_destination, SCTP_SO_NOT_LOCKED); } - if (sctp_process_init_ack(m, iphlen, offset, sh, cp, stcb, - net, abort_no_unlock, vrf_id) < 0) { + if (sctp_process_init_ack(m, iphlen, offset, src, dst, sh, cp, stcb, + net, abort_no_unlock, + use_mflowid, mflowid, + vrf_id) < 0) { /* error in parsing parameters */ return (-1); } @@ -1394,10 +1424,12 @@ sctp_handle_init_ack(struct mbuf *m, int iphlen, int offset, static struct sctp_tcb * sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, + struct sockaddr *src, struct sockaddr *dst, struct sctphdr *sh, struct sctp_state_cookie *cookie, int cookie_len, struct sctp_inpcb *inp, struct sctp_nets **netp, struct sockaddr *init_src, int *notification, int auth_skipped, uint32_t auth_offset, uint32_t auth_len, + uint8_t use_mflowid, uint32_t mflowid, uint32_t vrf_id, uint16_t port); @@ -1409,10 +1441,13 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, */ static struct sctp_tcb * sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, + struct sockaddr *src, struct sockaddr *dst, struct sctphdr *sh, struct sctp_state_cookie *cookie, int cookie_len, struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets **netp, struct sockaddr *init_src, int *notification, - uint32_t vrf_id, int auth_skipped, uint32_t auth_offset, uint32_t auth_len, uint16_t port) + int auth_skipped, uint32_t auth_offset, uint32_t auth_len, + uint8_t use_mflowid, uint32_t mflowid, + uint32_t vrf_id, uint16_t port) { struct sctp_association *asoc; struct sctp_init_chunk *init_cp, init_buf; @@ -1449,7 +1484,8 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, ph = mtod(op_err, struct sctp_paramhdr *); ph->param_type = htons(SCTP_CAUSE_COOKIE_IN_SHUTDOWN); ph->param_length = htons(sizeof(struct sctp_paramhdr)); - sctp_send_operr_to(m, iphlen, op_err, cookie->peers_vtag, + sctp_send_operr_to(src, dst, sh, cookie->peers_vtag, op_err, + use_mflowid, mflowid, vrf_id, net->port); if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 2; @@ -1551,7 +1587,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) && (inp->sctp_socket->so_qlimit == 0) ) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif @@ -1563,7 +1599,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, */ stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(stcb->sctp_ep); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -1576,7 +1612,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, } #endif soisconnected(stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } @@ -1613,7 +1649,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, */ if (sctp_load_addresses_from_init(stcb, m, init_offset + sizeof(struct sctp_init_chunk), - initack_offset, sh, init_src)) { + initack_offset, src, dst, init_src)) { if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 4; return (NULL); @@ -1674,7 +1710,9 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, ph = mtod(op_err, struct sctp_paramhdr *); ph->param_type = htons(SCTP_CAUSE_NAT_COLLIDING_STATE); ph->param_length = htons(sizeof(struct sctp_paramhdr)); - sctp_send_abort(m, iphlen, sh, 0, op_err, vrf_id, port); + sctp_send_abort(m, iphlen, src, dst, sh, 0, op_err, + use_mflowid, mflowid, + vrf_id, port); return (NULL); } if ((ntohl(initack_cp->init.initiate_tag) == asoc->my_vtag) && @@ -1755,7 +1793,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, } if (sctp_load_addresses_from_init(stcb, m, init_offset + sizeof(struct sctp_init_chunk), - initack_offset, sh, init_src)) { + initack_offset, src, dst, init_src)) { if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 10; return (NULL); @@ -1767,13 +1805,13 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) && (inp->sctp_socket->so_qlimit == 0)) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(stcb->sctp_ep); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -1786,7 +1824,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, } #endif soisconnected(stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } @@ -1836,9 +1874,11 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, * cookie_new code since we are allowing a duplicate * association. I hope this works... */ - return (sctp_process_cookie_new(m, iphlen, offset, sh, cookie, cookie_len, + return (sctp_process_cookie_new(m, iphlen, offset, src, dst, + sh, cookie, cookie_len, inp, netp, init_src, notification, auth_skipped, auth_offset, auth_len, + use_mflowid, mflowid, vrf_id, port)); } /* @@ -1899,7 +1939,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, /* send up all the data */ SCTP_TCB_SEND_LOCK(stcb); - sctp_report_all_outbound(stcb, 1, SCTP_SO_NOT_LOCKED); + sctp_report_all_outbound(stcb, 0, 1, SCTP_SO_NOT_LOCKED); for (i = 0; i < stcb->asoc.streamoutcnt; i++) { stcb->asoc.strmout[i].stream_no = i; stcb->asoc.strmout[i].next_sequence_sent = 0; @@ -1940,7 +1980,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, if (sctp_load_addresses_from_init(stcb, m, init_offset + sizeof(struct sctp_init_chunk), - initack_offset, sh, init_src)) { + initack_offset, src, dst, init_src)) { if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 14; @@ -1969,12 +2009,14 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset, * cookie-echo chunk length: length of the cookie chunk to: where the init * was from returns a new TCB */ -struct sctp_tcb * +static struct sctp_tcb * sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, + struct sockaddr *src, struct sockaddr *dst, struct sctphdr *sh, struct sctp_state_cookie *cookie, int cookie_len, struct sctp_inpcb *inp, struct sctp_nets **netp, struct sockaddr *init_src, int *notification, int auth_skipped, uint32_t auth_offset, uint32_t auth_len, + uint8_t use_mflowid, uint32_t mflowid, uint32_t vrf_id, uint16_t port) { struct sctp_tcb *stcb; @@ -1996,7 +2038,7 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, struct sockaddr_in6 *sin6; #endif -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; so = SCTP_INP_SO(inp); @@ -2069,7 +2111,9 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, op_err = sctp_generate_invmanparam(SCTP_CAUSE_OUT_OF_RESC); sctp_abort_association(inp, (struct sctp_tcb *)NULL, m, iphlen, - sh, op_err, vrf_id, port); + src, dst, sh, op_err, + use_mflowid, mflowid, + vrf_id, port); return (NULL); } /* get the correct sctp_nets */ @@ -2095,15 +2139,17 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, atomic_add_int(&stcb->asoc.refcnt, 1); op_err = sctp_generate_invmanparam(SCTP_CAUSE_OUT_OF_RESC); sctp_abort_association(inp, (struct sctp_tcb *)NULL, m, iphlen, - sh, op_err, vrf_id, port); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) + src, dst, sh, op_err, + use_mflowid, mflowid, + vrf_id, port); +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_TCB_UNLOCK(stcb); SCTP_SOCKET_LOCK(so, 1); SCTP_TCB_LOCK(stcb); #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_16); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif atomic_subtract_int(&stcb->asoc.refcnt, 1); @@ -2128,13 +2174,13 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, retval = 0; if (retval < 0) { atomic_add_int(&stcb->asoc.refcnt, 1); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_TCB_UNLOCK(stcb); SCTP_SOCKET_LOCK(so, 1); SCTP_TCB_LOCK(stcb); #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_16); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif atomic_subtract_int(&stcb->asoc.refcnt, 1); @@ -2142,16 +2188,16 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, } /* load all addresses */ if (sctp_load_addresses_from_init(stcb, m, - init_offset + sizeof(struct sctp_init_chunk), initack_offset, sh, - init_src)) { + init_offset + sizeof(struct sctp_init_chunk), initack_offset, + src, dst, init_src)) { atomic_add_int(&stcb->asoc.refcnt, 1); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_TCB_UNLOCK(stcb); SCTP_SOCKET_LOCK(so, 1); SCTP_TCB_LOCK(stcb); #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_17); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif atomic_subtract_int(&stcb->asoc.refcnt, 1); @@ -2174,13 +2220,13 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, SCTPDBG(SCTP_DEBUG_AUTH1, "COOKIE-ECHO: AUTH failed\n"); atomic_add_int(&stcb->asoc.refcnt, 1); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_TCB_UNLOCK(stcb); SCTP_SOCKET_LOCK(so, 1); SCTP_TCB_LOCK(stcb); #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_18); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif atomic_subtract_int(&stcb->asoc.refcnt, 1); @@ -2237,13 +2283,13 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, #endif default: atomic_add_int(&stcb->asoc.refcnt, 1); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_TCB_UNLOCK(stcb); SCTP_SOCKET_LOCK(so, 1); SCTP_TCB_LOCK(stcb); #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_19); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif atomic_subtract_int(&stcb->asoc.refcnt, 1); @@ -2264,7 +2310,7 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, * a bit of protection is worth having.. */ stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); SCTP_SOCKET_LOCK(so, 1); @@ -2276,7 +2322,7 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, } #endif soisconnected(stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } else if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) && @@ -2339,10 +2385,13 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset, */ static struct mbuf * sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, + struct sockaddr *src, struct sockaddr *dst, struct sctphdr *sh, struct sctp_cookie_echo_chunk *cp, struct sctp_inpcb **inp_p, struct sctp_tcb **stcb, struct sctp_nets **netp, int auth_skipped, uint32_t auth_offset, uint32_t auth_len, - struct sctp_tcb **locked_tcb, uint32_t vrf_id, uint16_t port) + struct sctp_tcb **locked_tcb, + uint8_t use_mflowid, uint32_t mflowid, + uint32_t vrf_id, uint16_t port) { struct sctp_state_cookie *cookie; struct sctp_tcb *l_stcb = *stcb; @@ -2353,13 +2402,10 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, uint8_t calc_sig[SCTP_SIGNATURE_SIZE], tmp_sig[SCTP_SIGNATURE_SIZE]; uint8_t *sig; uint8_t cookie_ok = 0; - unsigned int size_of_pkt, sig_offset, cookie_offset; + unsigned int sig_offset, cookie_offset; unsigned int cookie_len; struct timeval now; struct timeval time_expires; - struct sockaddr_storage dest_store; - struct sockaddr *localep_sa = (struct sockaddr *)&dest_store; - struct ip *iph; int notification = 0; struct sctp_nets *netl; int had_a_existing_tcb = 0; @@ -2380,47 +2426,6 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, if (inp_p == NULL) { return (NULL); } - /* First get the destination address setup too. */ - iph = mtod(m, struct ip *); - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - { - /* its IPv4 */ - struct sockaddr_in *lsin; - - lsin = (struct sockaddr_in *)(localep_sa); - memset(lsin, 0, sizeof(*lsin)); - lsin->sin_family = AF_INET; - lsin->sin_len = sizeof(*lsin); - lsin->sin_port = sh->dest_port; - lsin->sin_addr.s_addr = iph->ip_dst.s_addr; - size_of_pkt = SCTP_GET_IPV4_LENGTH(iph); - break; - } -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - { - /* its IPv6 */ - struct ip6_hdr *ip6; - struct sockaddr_in6 *lsin6; - - lsin6 = (struct sockaddr_in6 *)(localep_sa); - memset(lsin6, 0, sizeof(*lsin6)); - lsin6->sin6_family = AF_INET6; - lsin6->sin6_len = sizeof(struct sockaddr_in6); - ip6 = mtod(m, struct ip6_hdr *); - lsin6->sin6_port = sh->dest_port; - lsin6->sin6_addr = ip6->ip6_dst; - size_of_pkt = SCTP_GET_IPV6_LENGTH(ip6) + iphlen; - break; - } -#endif - default: - return (NULL); - } - cookie = &cp->cookie; cookie_offset = offset + sizeof(struct sctp_chunkhdr); cookie_len = ntohs(cp->ch.chunk_length); @@ -2437,11 +2442,10 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, */ return (NULL); } - if (cookie_len > size_of_pkt || - cookie_len < sizeof(struct sctp_cookie_echo_chunk) + + if (cookie_len < sizeof(struct sctp_cookie_echo_chunk) + sizeof(struct sctp_init_chunk) + sizeof(struct sctp_init_ack_chunk) + SCTP_SIGNATURE_SIZE) { - /* cookie too long! or too small */ + /* cookie too small */ return (NULL); } /* @@ -2449,11 +2453,6 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, * calculated in the sctp_hmac_m() call). */ sig_offset = offset + cookie_len - SCTP_SIGNATURE_SIZE; - if (sig_offset > size_of_pkt) { - /* packet not correct size! */ - /* XXX this may already be accounted for earlier... */ - return (NULL); - } m_sig = m_split(m, sig_offset, M_DONTWAIT); if (m_sig == NULL) { /* out of memory or ?? */ @@ -2577,7 +2576,8 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, if (tim == 0) tim = now.tv_usec - cookie->time_entered.tv_usec; scm->time_usec = htonl(tim); - sctp_send_operr_to(m, iphlen, op_err, cookie->peers_vtag, + sctp_send_operr_to(src, dst, sh, cookie->peers_vtag, op_err, + use_mflowid, mflowid, vrf_id, port); return (NULL); } @@ -2620,7 +2620,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, } if ((*stcb == NULL) && to) { /* Yep, lets check */ - *stcb = sctp_findassociation_ep_addr(inp_p, to, netp, localep_sa, NULL); + *stcb = sctp_findassociation_ep_addr(inp_p, to, netp, dst, NULL); if (*stcb == NULL) { /* * We should have only got back the same inp. If we @@ -2663,23 +2663,29 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, cookie_len -= SCTP_SIGNATURE_SIZE; if (*stcb == NULL) { /* this is the "normal" case... get a new TCB */ - *stcb = sctp_process_cookie_new(m, iphlen, offset, sh, cookie, - cookie_len, *inp_p, netp, to, ¬ification, - auth_skipped, auth_offset, auth_len, vrf_id, port); + *stcb = sctp_process_cookie_new(m, iphlen, offset, src, dst, sh, + cookie, cookie_len, *inp_p, + netp, to, ¬ification, + auth_skipped, auth_offset, auth_len, + use_mflowid, mflowid, + vrf_id, port); } else { /* this is abnormal... cookie-echo on existing TCB */ had_a_existing_tcb = 1; - *stcb = sctp_process_cookie_existing(m, iphlen, offset, sh, + *stcb = sctp_process_cookie_existing(m, iphlen, offset, + src, dst, sh, cookie, cookie_len, *inp_p, *stcb, netp, to, - ¬ification, vrf_id, auth_skipped, auth_offset, auth_len, port); + ¬ification, auth_skipped, auth_offset, auth_len, + use_mflowid, mflowid, + vrf_id, port); } if (*stcb == NULL) { /* still no TCB... must be bad cookie-echo */ return (NULL); } - if ((*netp != NULL) && (m->m_flags & M_FLOWID)) { - (*netp)->flowid = m->m_pkthdr.flowid; + if ((*netp != NULL) && (use_mflowid != 0)) { + (*netp)->flowid = mflowid; #ifdef INVARIANTS (*netp)->flowidset = 1; #endif @@ -2744,7 +2750,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, if (so == NULL) { struct mbuf *op_err; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *pcb_so; #endif @@ -2752,8 +2758,10 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, SCTPDBG(SCTP_DEBUG_INPUT1, "process_cookie_new: no room for another socket!\n"); op_err = sctp_generate_invmanparam(SCTP_CAUSE_OUT_OF_RESC); sctp_abort_association(*inp_p, NULL, m, iphlen, - sh, op_err, vrf_id, port); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) + src, dst, sh, op_err, + use_mflowid, mflowid, + vrf_id, port); +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) pcb_so = SCTP_INP_SO(*inp_p); atomic_add_int(&(*stcb)->asoc.refcnt, 1); SCTP_TCB_UNLOCK((*stcb)); @@ -2762,7 +2770,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, atomic_subtract_int(&(*stcb)->asoc.refcnt, 1); #endif (void)sctp_free_assoc(*inp_p, *stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_20); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(pcb_so, 1); #endif return (NULL); @@ -2852,13 +2860,13 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, * Pull it from the incomplete queue and wake the * guy */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) atomic_add_int(&(*stcb)->asoc.refcnt, 1); SCTP_TCB_UNLOCK((*stcb)); SCTP_SOCKET_LOCK(so, 1); #endif soisconnected(so); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_TCB_LOCK((*stcb)); atomic_subtract_int(&(*stcb)->asoc.refcnt, 1); SCTP_SOCKET_UNLOCK(so, 1); @@ -2916,12 +2924,12 @@ sctp_handle_cookie_ack(struct sctp_cookie_ack_chunk *cp SCTP_UNUSED, sctp_ulp_notify(SCTP_NOTIFY_ASSOC_UP, stcb, 0, NULL, SCTP_SO_NOT_LOCKED); if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(stcb->sctp_ep); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -2932,7 +2940,7 @@ sctp_handle_cookie_ack(struct sctp_cookie_ack_chunk *cp SCTP_UNUSED, if ((stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) == 0) { soisconnected(stcb->sctp_socket); } -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } @@ -3160,7 +3168,7 @@ sctp_handle_shutdown_complete(struct sctp_shutdown_complete_chunk *cp SCTP_UNUSE { struct sctp_association *asoc; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif @@ -3186,7 +3194,7 @@ sctp_handle_shutdown_complete(struct sctp_shutdown_complete_chunk *cp SCTP_UNUSE if (!TAILQ_EMPTY(&asoc->send_queue) || !TAILQ_EMPTY(&asoc->sent_queue) || !stcb->asoc.ss_functions.sctp_ss_is_empty(stcb, asoc)) { - sctp_report_all_outbound(stcb, 0, SCTP_SO_NOT_LOCKED); + sctp_report_all_outbound(stcb, 0, 0, SCTP_SO_NOT_LOCKED); } } /* stop the timer */ @@ -3195,7 +3203,7 @@ sctp_handle_shutdown_complete(struct sctp_shutdown_complete_chunk *cp SCTP_UNUSE /* free the TCB */ SCTPDBG(SCTP_DEBUG_INPUT2, "sctp_handle_shutdown_complete: calls free-asoc\n"); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(stcb->sctp_ep); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -3204,7 +3212,7 @@ sctp_handle_shutdown_complete(struct sctp_shutdown_complete_chunk *cp SCTP_UNUSE atomic_subtract_int(&stcb->asoc.refcnt, 1); #endif (void)sctp_free_assoc(stcb->sctp_ep, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_23); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif return; @@ -3599,9 +3607,11 @@ sctp_handle_stream_reset_response(struct sctp_tcb *stcb, asoc->stream_reset_out_is_outstanding = 0; if (asoc->stream_reset_outstanding) asoc->stream_reset_outstanding--; - if (action == SCTP_STREAM_RESET_PERFORMED) { + if (action == SCTP_STREAM_RESET_RESULT_PERFORMED) { /* do it */ sctp_reset_out_streams(stcb, number_entries, srparam->list_of_streams); + } else if (action == SCTP_STREAM_RESET_RESULT_DENIED) { + sctp_ulp_notify(SCTP_NOTIFY_STR_RESET_DENIED_OUT, stcb, number_entries, srparam->list_of_streams, SCTP_SO_NOT_LOCKED); } else { sctp_ulp_notify(SCTP_NOTIFY_STR_RESET_FAILED_OUT, stcb, number_entries, srparam->list_of_streams, SCTP_SO_NOT_LOCKED); } @@ -3610,7 +3620,10 @@ sctp_handle_stream_reset_response(struct sctp_tcb *stcb, number_entries = (lparm_len - sizeof(struct sctp_stream_reset_in_request)) / sizeof(uint16_t); if (asoc->stream_reset_outstanding) asoc->stream_reset_outstanding--; - if (action != SCTP_STREAM_RESET_PERFORMED) { + if (action == SCTP_STREAM_RESET_RESULT_DENIED) { + sctp_ulp_notify(SCTP_NOTIFY_STR_RESET_DENIED_IN, stcb, + number_entries, srparam->list_of_streams, SCTP_SO_NOT_LOCKED); + } else if (action != SCTP_STREAM_RESET_RESULT_PERFORMED) { sctp_ulp_notify(SCTP_NOTIFY_STR_RESET_FAILED_IN, stcb, number_entries, srparam->list_of_streams, SCTP_SO_NOT_LOCKED); } @@ -3626,20 +3639,26 @@ sctp_handle_stream_reset_response(struct sctp_tcb *stcb, stcb->asoc.strm_pending_add_size = 0; if (asoc->stream_reset_outstanding) asoc->stream_reset_outstanding--; - if (action == SCTP_STREAM_RESET_PERFORMED) { + if (action == SCTP_STREAM_RESET_RESULT_PERFORMED) { /* Put the new streams into effect */ stcb->asoc.streamoutcnt += num_stream; sctp_notify_stream_reset_add(stcb, stcb->asoc.streamincnt, stcb->asoc.streamoutcnt, 0); + } else if (action == SCTP_STREAM_RESET_RESULT_DENIED) { + sctp_notify_stream_reset_add(stcb, stcb->asoc.streamincnt, stcb->asoc.streamoutcnt, + SCTP_STREAM_CHANGE_DENIED); } else { sctp_notify_stream_reset_add(stcb, stcb->asoc.streamincnt, stcb->asoc.streamoutcnt, - SCTP_STREAM_CHANGED_DENIED); + SCTP_STREAM_CHANGE_FAILED); } } else if (type == SCTP_STR_RESET_ADD_IN_STREAMS) { if (asoc->stream_reset_outstanding) asoc->stream_reset_outstanding--; - if (action != SCTP_STREAM_RESET_PERFORMED) { + if (action == SCTP_STREAM_RESET_RESULT_DENIED) { sctp_notify_stream_reset_add(stcb, stcb->asoc.streamincnt, stcb->asoc.streamoutcnt, - SCTP_STREAM_CHANGED_DENIED); + SCTP_STREAM_CHANGE_DENIED); + } else if (action != SCTP_STREAM_RESET_RESULT_PERFORMED) { + sctp_notify_stream_reset_add(stcb, stcb->asoc.streamincnt, stcb->asoc.streamoutcnt, + SCTP_STREAM_CHANGE_FAILED); } } else if (type == SCTP_STR_RESET_TSN_REQUEST) { /** @@ -3655,7 +3674,7 @@ sctp_handle_stream_reset_response(struct sctp_tcb *stcb, /* huh ? */ return (0); } - if (action == SCTP_STREAM_RESET_PERFORMED) { + if (action == SCTP_STREAM_RESET_RESULT_PERFORMED) { resp = (struct sctp_stream_reset_response_tsn *)respin; asoc->stream_reset_outstanding--; fwdtsn.ch.chunk_length = htons(sizeof(struct sctp_forward_tsn_chunk)); @@ -3682,9 +3701,12 @@ sctp_handle_stream_reset_response(struct sctp_tcb *stcb, sctp_reset_out_streams(stcb, 0, (uint16_t *) NULL); sctp_reset_in_stream(stcb, 0, (uint16_t *) NULL); sctp_notify_stream_reset_tsn(stcb, stcb->asoc.sending_seq, (stcb->asoc.mapping_array_base_tsn + 1), 0); + } else if (action == SCTP_STREAM_RESET_RESULT_DENIED) { + sctp_notify_stream_reset_tsn(stcb, stcb->asoc.sending_seq, (stcb->asoc.mapping_array_base_tsn + 1), + SCTP_ASSOC_RESET_DENIED); } else { sctp_notify_stream_reset_tsn(stcb, stcb->asoc.sending_seq, (stcb->asoc.mapping_array_base_tsn + 1), - SCTP_STREAM_RESET_FAILED); + SCTP_ASSOC_RESET_FAILED); } } /* get rid of the request and get the request flags */ @@ -3714,10 +3736,12 @@ sctp_handle_str_reset_request_in(struct sctp_tcb *stcb, seq = ntohl(req->request_seq); if (asoc->str_reset_seq_in == seq) { - if (trunc) { + asoc->last_reset_action[1] = asoc->last_reset_action[0]; + if (!(asoc->local_strreset_support & SCTP_ENABLE_RESET_STREAM_REQ)) { + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; + } else if (trunc) { /* Can't do it, since they exceeded our buffer size */ - asoc->last_reset_action[1] = asoc->last_reset_action[0]; - asoc->last_reset_action[0] = SCTP_STREAM_RESET_REJECT; + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; } else if (stcb->asoc.stream_reset_out_is_outstanding == 0) { len = ntohs(req->ph.param_length); number_entries = ((len - sizeof(struct sctp_stream_reset_in_request)) / sizeof(uint16_t)); @@ -3725,9 +3749,7 @@ sctp_handle_str_reset_request_in(struct sctp_tcb *stcb, temp = ntohs(req->list_of_streams[i]); req->list_of_streams[i] = temp; } - /* move the reset action back one */ - asoc->last_reset_action[1] = asoc->last_reset_action[0]; - asoc->last_reset_action[0] = SCTP_STREAM_RESET_PERFORMED; + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_PERFORMED; sctp_add_stream_reset_out(chk, number_entries, req->list_of_streams, asoc->str_reset_seq_out, seq, (asoc->sending_seq - 1)); @@ -3737,8 +3759,7 @@ sctp_handle_str_reset_request_in(struct sctp_tcb *stcb, stcb->asoc.stream_reset_outstanding++; } else { /* Can't do it, since we have sent one out */ - asoc->last_reset_action[1] = asoc->last_reset_action[0]; - asoc->last_reset_action[0] = SCTP_STREAM_RESET_TRY_LATER; + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_ERR_IN_PROGRESS; } sctp_add_stream_reset_result(chk, seq, asoc->last_reset_action[0]); asoc->str_reset_seq_in++; @@ -3747,7 +3768,7 @@ sctp_handle_str_reset_request_in(struct sctp_tcb *stcb, } else if (asoc->str_reset_seq_in - 2 == seq) { sctp_add_stream_reset_result(chk, seq, asoc->last_reset_action[1]); } else { - sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_BAD_SEQNO); + sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_RESULT_ERR_BAD_SEQNO); } } @@ -3769,53 +3790,49 @@ sctp_handle_str_reset_request_tsn(struct sctp_tcb *stcb, seq = ntohl(req->request_seq); if (asoc->str_reset_seq_in == seq) { - fwdtsn.ch.chunk_length = htons(sizeof(struct sctp_forward_tsn_chunk)); - fwdtsn.ch.chunk_type = SCTP_FORWARD_CUM_TSN; - fwdtsn.ch.chunk_flags = 0; - fwdtsn.new_cumulative_tsn = htonl(stcb->asoc.highest_tsn_inside_map + 1); - sctp_handle_forward_tsn(stcb, &fwdtsn, &abort_flag, NULL, 0); - if (abort_flag) { - return (1); + asoc->last_reset_action[1] = stcb->asoc.last_reset_action[0]; + if (!(asoc->local_strreset_support & SCTP_ENABLE_CHANGE_ASSOC_REQ)) { + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; + } else { + fwdtsn.ch.chunk_length = htons(sizeof(struct sctp_forward_tsn_chunk)); + fwdtsn.ch.chunk_type = SCTP_FORWARD_CUM_TSN; + fwdtsn.ch.chunk_flags = 0; + fwdtsn.new_cumulative_tsn = htonl(stcb->asoc.highest_tsn_inside_map + 1); + sctp_handle_forward_tsn(stcb, &fwdtsn, &abort_flag, NULL, 0); + if (abort_flag) { + return (1); + } + asoc->highest_tsn_inside_map += SCTP_STREAM_RESET_TSN_DELTA; + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MAP_LOGGING_ENABLE) { + sctp_log_map(0, 10, asoc->highest_tsn_inside_map, SCTP_MAP_SLIDE_RESULT); + } + asoc->tsn_last_delivered = asoc->cumulative_tsn = asoc->highest_tsn_inside_map; + asoc->mapping_array_base_tsn = asoc->highest_tsn_inside_map + 1; + memset(asoc->mapping_array, 0, asoc->mapping_array_size); + asoc->highest_tsn_inside_nr_map = asoc->highest_tsn_inside_map; + memset(asoc->nr_mapping_array, 0, asoc->mapping_array_size); + atomic_add_int(&asoc->sending_seq, 1); + /* save off historical data for retrans */ + asoc->last_sending_seq[1] = asoc->last_sending_seq[0]; + asoc->last_sending_seq[0] = asoc->sending_seq; + asoc->last_base_tsnsent[1] = asoc->last_base_tsnsent[0]; + asoc->last_base_tsnsent[0] = asoc->mapping_array_base_tsn; + sctp_reset_out_streams(stcb, 0, (uint16_t *) NULL); + sctp_reset_in_stream(stcb, 0, (uint16_t *) NULL); + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_PERFORMED; + sctp_notify_stream_reset_tsn(stcb, asoc->sending_seq, (asoc->mapping_array_base_tsn + 1), 0); } - stcb->asoc.highest_tsn_inside_map += SCTP_STREAM_RESET_TSN_DELTA; - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MAP_LOGGING_ENABLE) { - sctp_log_map(0, 10, asoc->highest_tsn_inside_map, SCTP_MAP_SLIDE_RESULT); - } - stcb->asoc.tsn_last_delivered = stcb->asoc.cumulative_tsn = stcb->asoc.highest_tsn_inside_map; - stcb->asoc.mapping_array_base_tsn = stcb->asoc.highest_tsn_inside_map + 1; - memset(stcb->asoc.mapping_array, 0, stcb->asoc.mapping_array_size); - stcb->asoc.highest_tsn_inside_nr_map = stcb->asoc.highest_tsn_inside_map; - memset(stcb->asoc.nr_mapping_array, 0, stcb->asoc.mapping_array_size); - atomic_add_int(&stcb->asoc.sending_seq, 1); - /* save off historical data for retrans */ - stcb->asoc.last_sending_seq[1] = stcb->asoc.last_sending_seq[0]; - stcb->asoc.last_sending_seq[0] = stcb->asoc.sending_seq; - stcb->asoc.last_base_tsnsent[1] = stcb->asoc.last_base_tsnsent[0]; - stcb->asoc.last_base_tsnsent[0] = stcb->asoc.mapping_array_base_tsn; - - sctp_add_stream_reset_result_tsn(chk, - ntohl(req->request_seq), - SCTP_STREAM_RESET_PERFORMED, - stcb->asoc.sending_seq, - stcb->asoc.mapping_array_base_tsn); - sctp_reset_out_streams(stcb, 0, (uint16_t *) NULL); - sctp_reset_in_stream(stcb, 0, (uint16_t *) NULL); - stcb->asoc.last_reset_action[1] = stcb->asoc.last_reset_action[0]; - stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_PERFORMED; - sctp_notify_stream_reset_tsn(stcb, stcb->asoc.sending_seq, (stcb->asoc.mapping_array_base_tsn + 1), 0); + sctp_add_stream_reset_result_tsn(chk, seq, asoc->last_reset_action[0], + asoc->last_sending_seq[0], asoc->last_base_tsnsent[0]); asoc->str_reset_seq_in++; } else if (asoc->str_reset_seq_in - 1 == seq) { sctp_add_stream_reset_result_tsn(chk, seq, asoc->last_reset_action[0], - stcb->asoc.last_sending_seq[0], - stcb->asoc.last_base_tsnsent[0] - ); + asoc->last_sending_seq[0], asoc->last_base_tsnsent[0]); } else if (asoc->str_reset_seq_in - 2 == seq) { sctp_add_stream_reset_result_tsn(chk, seq, asoc->last_reset_action[1], - stcb->asoc.last_sending_seq[1], - stcb->asoc.last_base_tsnsent[1] - ); + asoc->last_sending_seq[1], asoc->last_base_tsnsent[1]); } else { - sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_BAD_SEQNO); + sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_RESULT_ERR_BAD_SEQNO); } return (0); } @@ -3846,12 +3863,14 @@ sctp_handle_str_reset_request_out(struct sctp_tcb *stcb, /* move the reset action back one */ asoc->last_reset_action[1] = asoc->last_reset_action[0]; - if (trunc) { - asoc->last_reset_action[0] = SCTP_STREAM_RESET_REJECT; + if (!(asoc->local_strreset_support & SCTP_ENABLE_RESET_STREAM_REQ)) { + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; + } else if (trunc) { + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; } else if (SCTP_TSN_GE(asoc->cumulative_tsn, tsn)) { /* we can do it now */ sctp_reset_in_stream(stcb, number_entries, req->list_of_streams); - asoc->last_reset_action[0] = SCTP_STREAM_RESET_PERFORMED; + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_PERFORMED; } else { /* * we must queue it up and thus wait for the TSN's @@ -3865,8 +3884,8 @@ sctp_handle_str_reset_request_out(struct sctp_tcb *stcb, siz, SCTP_M_STRESET); if (liste == NULL) { /* gak out of memory */ - sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_REJECT); - asoc->last_reset_action[0] = SCTP_STREAM_RESET_REJECT; + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; + sctp_add_stream_reset_result(chk, seq, asoc->last_reset_action[0]); return; } liste->tsn = tsn; @@ -3874,7 +3893,7 @@ sctp_handle_str_reset_request_out(struct sctp_tcb *stcb, memcpy(&liste->req, req, (sizeof(struct sctp_stream_reset_out_request) + (number_entries * sizeof(uint16_t)))); TAILQ_INSERT_TAIL(&asoc->resetHead, liste, next_resp); - asoc->last_reset_action[0] = SCTP_STREAM_RESET_PERFORMED; + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_PERFORMED; } sctp_add_stream_reset_result(chk, seq, asoc->last_reset_action[0]); asoc->str_reset_seq_in++; @@ -3891,7 +3910,7 @@ sctp_handle_str_reset_request_out(struct sctp_tcb *stcb, */ sctp_add_stream_reset_result(chk, seq, asoc->last_reset_action[1]); } else { - sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_BAD_SEQNO); + sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_RESULT_ERR_BAD_SEQNO); } } @@ -3914,12 +3933,14 @@ sctp_handle_str_reset_add_strm(struct sctp_tcb *stcb, struct sctp_tmit_chunk *ch /* Now what would be the new total? */ if (asoc->str_reset_seq_in == seq) { num_stream += stcb->asoc.streamincnt; - if ((num_stream > stcb->asoc.max_inbound_streams) || + stcb->asoc.last_reset_action[1] = stcb->asoc.last_reset_action[0]; + if (!(asoc->local_strreset_support & SCTP_ENABLE_CHANGE_ASSOC_REQ)) { + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; + } else if ((num_stream > stcb->asoc.max_inbound_streams) || (num_stream > 0xffff)) { /* We must reject it they ask for to many */ denied: - stcb->asoc.last_reset_action[1] = stcb->asoc.last_reset_action[0]; - stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_REJECT; + stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; } else { /* Ok, we can do that :-) */ struct sctp_stream_in *oldstrm; @@ -3955,8 +3976,7 @@ sctp_handle_str_reset_add_strm(struct sctp_tcb *stcb, struct sctp_tmit_chunk *ch SCTP_FREE(oldstrm, SCTP_M_STRMI); /* update the size */ stcb->asoc.streamincnt = num_stream; - stcb->asoc.last_reset_action[1] = stcb->asoc.last_reset_action[0]; - stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_PERFORMED; + stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_RESULT_PERFORMED; sctp_notify_stream_reset_add(stcb, stcb->asoc.streamincnt, stcb->asoc.streamoutcnt, 0); } sctp_add_stream_reset_result(chk, seq, asoc->last_reset_action[0]); @@ -3974,7 +3994,7 @@ sctp_handle_str_reset_add_strm(struct sctp_tcb *stcb, struct sctp_tmit_chunk *ch */ sctp_add_stream_reset_result(chk, seq, asoc->last_reset_action[1]); } else { - sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_BAD_SEQNO); + sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_RESULT_ERR_BAD_SEQNO); } } @@ -3996,10 +4016,12 @@ sctp_handle_str_reset_add_out_strm(struct sctp_tcb *stcb, struct sctp_tmit_chunk num_stream = ntohs(str_add->number_of_streams); /* Now what would be the new total? */ if (asoc->str_reset_seq_in == seq) { - if (stcb->asoc.stream_reset_outstanding) { + stcb->asoc.last_reset_action[1] = stcb->asoc.last_reset_action[0]; + if (!(asoc->local_strreset_support & SCTP_ENABLE_CHANGE_ASSOC_REQ)) { + asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; + } else if (stcb->asoc.stream_reset_outstanding) { /* We must reject it we have something pending */ - stcb->asoc.last_reset_action[1] = stcb->asoc.last_reset_action[0]; - stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_REJECT; + stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_RESULT_ERR_IN_PROGRESS; } else { /* Ok, we can do that :-) */ int mychk; @@ -4007,14 +4029,12 @@ sctp_handle_str_reset_add_out_strm(struct sctp_tcb *stcb, struct sctp_tmit_chunk mychk = stcb->asoc.streamoutcnt; mychk += num_stream; if (mychk < 0x10000) { - stcb->asoc.last_reset_action[1] = stcb->asoc.last_reset_action[0]; - stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_PERFORMED; + stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_RESULT_PERFORMED; if (sctp_send_str_reset_req(stcb, 0, NULL, 0, 0, 0, 1, num_stream, 0, 1)) { - stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_REJECT; + stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; } } else { - stcb->asoc.last_reset_action[1] = stcb->asoc.last_reset_action[0]; - stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_REJECT; + stcb->asoc.last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; } } sctp_add_stream_reset_result(chk, seq, stcb->asoc.last_reset_action[0]); @@ -4032,7 +4052,7 @@ sctp_handle_str_reset_add_out_strm(struct sctp_tcb *stcb, struct sctp_tmit_chunk */ sctp_add_stream_reset_result(chk, seq, asoc->last_reset_action[1]); } else { - sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_BAD_SEQNO); + sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_RESULT_ERR_BAD_SEQNO); } } @@ -4046,7 +4066,6 @@ __attribute__((noinline)) int chk_length, param_len, ptype; struct sctp_paramhdr pstore; uint8_t cstore[SCTP_CHUNK_BUFFER_SIZE]; - uint32_t seq = 0; int num_req = 0; int trunc = 0; @@ -4124,7 +4143,7 @@ strres_nochunk: seq = ntohl(req_out->response_seq); if (seq == stcb->asoc.str_reset_seq_out) { /* implicit ack */ - (void)sctp_handle_stream_reset_response(stcb, seq, SCTP_STREAM_RESET_PERFORMED, NULL); + (void)sctp_handle_stream_reset_response(stcb, seq, SCTP_STREAM_RESET_RESULT_PERFORMED, NULL); } } sctp_handle_str_reset_request_out(stcb, chk, req_out, trunc); @@ -4355,8 +4374,10 @@ __attribute__((noinline)) #endif static struct sctp_tcb * sctp_process_control(struct mbuf *m, int iphlen, int *offset, int length, + struct sockaddr *src, struct sockaddr *dst, struct sctphdr *sh, struct sctp_chunkhdr *ch, struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets **netp, int *fwd_tsn_seen, + uint8_t use_mflowid, uint32_t mflowid, uint32_t vrf_id, uint16_t port) { struct sctp_association *asoc; @@ -4379,7 +4400,7 @@ __attribute__((noinline)) int auth_skipped = 0; int asconf_cnt = 0; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif @@ -4470,7 +4491,9 @@ __attribute__((noinline)) if (asconf_len < sizeof(struct sctp_asconf_paramhdr)) break; stcb = sctp_findassociation_ep_asconf(m, - *offset, sh, &inp, netp, vrf_id); + *offset, + dst, + sh, &inp, netp, vrf_id); if (stcb != NULL) break; asconf_offset += SCTP_SIZE32(asconf_len); @@ -4512,7 +4535,8 @@ __attribute__((noinline)) } if (stcb == NULL) { /* no association, so it's out of the blue... */ - sctp_handle_ootb(m, iphlen, *offset, sh, inp, NULL, + sctp_handle_ootb(m, iphlen, *offset, src, dst, sh, inp, + use_mflowid, mflowid, vrf_id, port); *offset = length; if (locked_tcb) { @@ -4549,8 +4573,10 @@ __attribute__((noinline)) if (locked_tcb) { SCTP_TCB_UNLOCK(locked_tcb); } - sctp_handle_ootb(m, iphlen, *offset, sh, inp, - NULL, vrf_id, port); + sctp_handle_ootb(m, iphlen, *offset, src, dst, + sh, inp, + use_mflowid, mflowid, + vrf_id, port); return (NULL); } } else { @@ -4690,8 +4716,10 @@ process_control_chunks: /* The INIT chunk must be the only chunk. */ if ((num_chunks > 1) || (length - *offset > (int)SCTP_SIZE32(chk_length))) { - sctp_abort_association(inp, stcb, m, - iphlen, sh, NULL, vrf_id, port); + sctp_abort_association(inp, stcb, m, iphlen, + src, dst, sh, NULL, + use_mflowid, mflowid, + vrf_id, port); *offset = length; return (NULL); } @@ -4700,14 +4728,18 @@ process_control_chunks: struct mbuf *op_err; op_err = sctp_generate_invmanparam(SCTP_CAUSE_OUT_OF_RESC); - sctp_abort_association(inp, stcb, m, - iphlen, sh, op_err, vrf_id, port); + sctp_abort_association(inp, stcb, m, iphlen, + src, dst, sh, op_err, + use_mflowid, mflowid, + vrf_id, port); *offset = length; return (NULL); } - sctp_handle_init(m, iphlen, *offset, sh, + sctp_handle_init(m, iphlen, *offset, src, dst, sh, (struct sctp_init_chunk *)ch, inp, - stcb, &abort_no_unlock, vrf_id, port); + stcb, &abort_no_unlock, + use_mflowid, mflowid, + vrf_id, port); *offset = length; if ((!abort_no_unlock) && (locked_tcb)) { SCTP_TCB_UNLOCK(locked_tcb); @@ -4729,7 +4761,7 @@ process_control_chunks: } *offset = length; if (stcb) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(inp); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -4738,7 +4770,7 @@ process_control_chunks: atomic_subtract_int(&stcb->asoc.refcnt, 1); #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_27); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } @@ -4755,8 +4787,13 @@ process_control_chunks: return (NULL); } if ((netp) && (*netp)) { - ret = sctp_handle_init_ack(m, iphlen, *offset, sh, - (struct sctp_init_ack_chunk *)ch, stcb, *netp, &abort_no_unlock, vrf_id); + ret = sctp_handle_init_ack(m, iphlen, *offset, + src, dst, sh, + (struct sctp_init_ack_chunk *)ch, + stcb, *netp, + &abort_no_unlock, + use_mflowid, mflowid, + vrf_id); } else { ret = -1; } @@ -5061,8 +5098,10 @@ process_control_chunks: struct mbuf *op_err; op_err = sctp_generate_invmanparam(SCTP_CAUSE_OUT_OF_RESC); - sctp_abort_association(inp, stcb, m, - iphlen, sh, op_err, vrf_id, port); + sctp_abort_association(inp, stcb, m, iphlen, + src, dst, sh, op_err, + use_mflowid, mflowid, + vrf_id, port); } *offset = length; return (NULL); @@ -5087,13 +5126,17 @@ process_control_chunks: if (netp) { ret_buf = sctp_handle_cookie_echo(m, iphlen, - *offset, sh, + *offset, + src, dst, + sh, (struct sctp_cookie_echo_chunk *)ch, &inp, &stcb, netp, auth_skipped, auth_offset, auth_len, &locked_tcb, + use_mflowid, + mflowid, vrf_id, port); } else { @@ -5141,7 +5184,7 @@ process_control_chunks: if ((stcb) && (stcb->asoc.total_output_queue_size)) { ; } else if (stcb) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(inp); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -5150,7 +5193,7 @@ process_control_chunks: atomic_subtract_int(&stcb->asoc.refcnt, 1); #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_27); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif *offset = length; @@ -5248,7 +5291,7 @@ process_control_chunks: __LINE__); } stcb->asoc.overall_error_count = 0; - sctp_handle_asconf(m, *offset, + sctp_handle_asconf(m, *offset, src, (struct sctp_asconf_chunk *)ch, stcb, asconf_cnt == 0); asconf_cnt++; } @@ -5304,7 +5347,7 @@ process_control_chunks: *fwd_tsn_seen = 1; if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { /* We are not interested anymore */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(inp); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -5313,7 +5356,7 @@ process_control_chunks: atomic_subtract_int(&stcb->asoc.refcnt, 1); #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_29); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif *offset = length; @@ -5349,7 +5392,7 @@ process_control_chunks: } if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { /* We are not interested anymore */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(inp); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -5358,7 +5401,7 @@ process_control_chunks: atomic_subtract_int(&stcb->asoc.refcnt, 1); #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_30); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif *offset = length; @@ -5544,26 +5587,144 @@ __attribute__((noinline)) * common input chunk processing (v4 and v6) */ void -sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, - int length, struct sctphdr *sh, struct sctp_chunkhdr *ch, - struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net, - uint8_t ecn_bits, uint32_t vrf_id, uint16_t port) +sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, int length, + struct sockaddr *src, struct sockaddr *dst, + struct sctphdr *sh, struct sctp_chunkhdr *ch, +#if !defined(SCTP_WITH_NO_CSUM) + uint8_t compute_crc, +#endif + uint8_t ecn_bits, + uint8_t use_mflowid, uint32_t mflowid, + uint32_t vrf_id, uint16_t port) { - /* - * Control chunk processing - */ uint32_t high_tsn; int fwd_tsn_seen = 0, data_processed = 0; struct mbuf *m = *mm; int un_sent; int cnt_ctrl_ready = 0; + struct sctp_inpcb *inp, *inp_decr = NULL; + struct sctp_tcb *stcb = NULL; + struct sctp_nets *net = NULL; SCTP_STAT_INCR(sctps_recvdatagrams); #ifdef SCTP_AUDITING_ENABLED sctp_audit_log(0xE0, 1); sctp_auditing(0, inp, stcb, net); #endif +#if !defined(SCTP_WITH_NO_CSUM) + if (compute_crc != 0) { + uint32_t check, calc_check; + check = sh->checksum; + sh->checksum = 0; + calc_check = sctp_calculate_cksum(m, iphlen); + sh->checksum = check; + if (calc_check != check) { + SCTPDBG(SCTP_DEBUG_INPUT1, "Bad CSUM on SCTP packet calc_check:%x check:%x m:%p mlen:%d iphlen:%d\n", + calc_check, check, m, length, iphlen); + stcb = sctp_findassociation_addr(m, offset, src, dst, + sh, ch, &inp, &net, vrf_id); + if ((net != NULL) && (port != 0)) { + if (net->port == 0) { + sctp_pathmtu_adjustment(stcb, net->mtu - sizeof(struct udphdr)); + } + net->port = port; + } + if ((net != NULL) && (use_mflowid != 0)) { + net->flowid = mflowid; +#ifdef INVARIANTS + net->flowidset = 1; +#endif + } + if ((inp != NULL) && (stcb != NULL)) { + sctp_send_packet_dropped(stcb, net, m, length, iphlen, 1); + sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_INPUT_ERROR, SCTP_SO_NOT_LOCKED); + } else if ((inp != NULL) && (stcb == NULL)) { + inp_decr = inp; + } + SCTP_STAT_INCR(sctps_badsum); + SCTP_STAT_INCR_COUNTER32(sctps_checksumerrors); + goto out; + } + } +#endif + /* Destination port of 0 is illegal, based on RFC4960. */ + if (sh->dest_port == 0) { + SCTP_STAT_INCR(sctps_hdrops); + goto out; + } + stcb = sctp_findassociation_addr(m, offset, src, dst, + sh, ch, &inp, &net, vrf_id); + if ((net != NULL) && (port != 0)) { + if (net->port == 0) { + sctp_pathmtu_adjustment(stcb, net->mtu - sizeof(struct udphdr)); + } + net->port = port; + } + if ((net != NULL) && (use_mflowid != 0)) { + net->flowid = mflowid; +#ifdef INVARIANTS + net->flowidset = 1; +#endif + } + if (inp == NULL) { + SCTP_STAT_INCR(sctps_noport); + if (badport_bandlim(BANDLIM_SCTP_OOTB) < 0) { + goto out; + } + if (ch->chunk_type == SCTP_SHUTDOWN_ACK) { + sctp_send_shutdown_complete2(src, dst, sh, + use_mflowid, mflowid, + vrf_id, port); + goto out; + } + if (ch->chunk_type == SCTP_SHUTDOWN_COMPLETE) { + goto out; + } + if (ch->chunk_type != SCTP_ABORT_ASSOCIATION) { + if ((SCTP_BASE_SYSCTL(sctp_blackhole) == 0) || + ((SCTP_BASE_SYSCTL(sctp_blackhole) == 1) && + (ch->chunk_type != SCTP_INIT))) { + sctp_send_abort(m, iphlen, src, dst, + sh, 0, NULL, + use_mflowid, mflowid, + vrf_id, port); + } + } + goto out; + } else if (stcb == NULL) { + inp_decr = inp; + } +#ifdef IPSEC + /*- + * I very much doubt any of the IPSEC stuff will work but I have no + * idea, so I will leave it in place. + */ + if (inp != NULL) { + switch (dst->sa_family) { +#ifdef INET + case AF_INET: + if (ipsec4_in_reject(m, &inp->ip_inp.inp)) { + MODULE_GLOBAL(ipsec4stat).in_polvio++; + SCTP_STAT_INCR(sctps_hdrops); + goto out; + } + break; +#endif +#ifdef INET6 + case AF_INET6: + if (ipsec6_in_reject(m, &inp->ip_inp.inp)) { + MODULE_GLOBAL(ipsec6stat).in_polvio++; + SCTP_STAT_INCR(sctps_hdrops); + goto out; + } + break; +#endif + default: + break; + } + } +#endif SCTPDBG(SCTP_DEBUG_INPUT1, "Ok, Common input processing called, m:%p iphlen:%d offset:%d length:%d stcb:%p\n", m, iphlen, offset, length, stcb); if (stcb) { @@ -5582,16 +5743,21 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, * NOT respond to any packet.. its OOTB. */ SCTP_TCB_UNLOCK(stcb); - sctp_handle_ootb(m, iphlen, offset, sh, inp, NULL, + stcb = NULL; + sctp_handle_ootb(m, iphlen, offset, src, dst, sh, inp, + use_mflowid, mflowid, vrf_id, port); - goto out_now; + goto out; } } if (IS_SCTP_CONTROL(ch)) { /* process the control portion of the SCTP packet */ /* sa_ignore NO_NULL_CHK */ - stcb = sctp_process_control(m, iphlen, &offset, length, sh, ch, - inp, stcb, &net, &fwd_tsn_seen, vrf_id, port); + stcb = sctp_process_control(m, iphlen, &offset, length, + src, dst, sh, ch, + inp, stcb, &net, &fwd_tsn_seen, + use_mflowid, mflowid, + vrf_id, port); if (stcb) { /* * This covers us if the cookie-echo was there and @@ -5621,20 +5787,19 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, sctp_auth_is_required_chunk(SCTP_DATA, stcb->asoc.local_auth_chunks)) { /* "silently" ignore */ SCTP_STAT_INCR(sctps_recvauthmissing); - SCTP_TCB_UNLOCK(stcb); - goto out_now; + goto out; } if (stcb == NULL) { /* out of the blue DATA chunk */ - sctp_handle_ootb(m, iphlen, offset, sh, inp, NULL, + sctp_handle_ootb(m, iphlen, offset, src, dst, sh, inp, + use_mflowid, mflowid, vrf_id, port); - goto out_now; + goto out; } if (stcb->asoc.my_vtag != ntohl(sh->v_tag)) { /* v_tag mismatch! */ SCTP_STAT_INCR(sctps_badvtag); - SCTP_TCB_UNLOCK(stcb); - goto out_now; + goto out; } } @@ -5644,7 +5809,7 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, * packet while processing control, or we're done with this * packet (done or skip rest of data), so we drop it... */ - goto out_now; + goto out; } /* * DATA chunk processing @@ -5695,10 +5860,10 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, /* * We consider OOTB any data sent during asoc setup. */ - sctp_handle_ootb(m, iphlen, offset, sh, inp, NULL, + sctp_handle_ootb(m, iphlen, offset, src, dst, sh, inp, + use_mflowid, mflowid, vrf_id, port); - SCTP_TCB_UNLOCK(stcb); - goto out_now; + goto out; /* sa_ignore NOTREACHED */ break; case SCTP_STATE_EMPTY: /* should not happen */ @@ -5706,8 +5871,7 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, case SCTP_STATE_SHUTDOWN_RECEIVED: /* This is a peer error */ case SCTP_STATE_SHUTDOWN_ACK_SENT: default: - SCTP_TCB_UNLOCK(stcb); - goto out_now; + goto out; /* sa_ignore NOTREACHED */ break; case SCTP_STATE_OPEN: @@ -5715,14 +5879,18 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, break; } /* plow through the data chunks while length > offset */ - retval = sctp_process_data(mm, iphlen, &offset, length, sh, - inp, stcb, net, &high_tsn); + retval = sctp_process_data(mm, iphlen, &offset, length, + src, dst, sh, + inp, stcb, net, &high_tsn, + use_mflowid, mflowid, + vrf_id, port); if (retval == 2) { /* * The association aborted, NO UNLOCK needed since * the association is destroyed. */ - goto out_now; + stcb = NULL; + goto out; } data_processed = 1; /* @@ -5779,10 +5947,20 @@ trigger_send: sctp_audit_log(0xE0, 3); sctp_auditing(2, inp, stcb, net); #endif - SCTP_TCB_UNLOCK(stcb); -out_now: +out: + if (stcb != NULL) { + SCTP_TCB_UNLOCK(stcb); + } + if (inp_decr != NULL) { + /* reduce ref-count */ + SCTP_INP_WLOCK(inp_decr); + SCTP_INP_DECR_REF(inp_decr); + SCTP_INP_WUNLOCK(inp_decr); + } #ifdef INVARIANTS - sctp_validate_no_locks(inp); + if (inp != NULL) { + sctp_validate_no_locks(inp); + } #endif return; } @@ -5792,9 +5970,9 @@ static void sctp_print_mbuf_chain(struct mbuf *m) { for (; m; m = SCTP_BUF_NEXT(m)) { - printf("%p: m_len = %ld\n", m, SCTP_BUF_LEN(m)); + SCTP_PRINTF("%p: m_len = %ld\n", m, SCTP_BUF_LEN(m)); if (SCTP_BUF_IS_EXTENDED(m)) - printf("%p: extend_size = %d\n", m, SCTP_BUF_EXTEND_SIZE(m)); + SCTP_PRINTF("%p: extend_size = %d\n", m, SCTP_BUF_EXTEND_SIZE(m)); } } @@ -5808,33 +5986,25 @@ sctp_input_with_port(struct mbuf *i_pak, int off, uint16_t port) int iphlen; uint32_t vrf_id = 0; uint8_t ecn_bits; + struct sockaddr_in src, dst; struct ip *ip; struct sctphdr *sh; - struct sctp_inpcb *inp = NULL; - struct sctp_nets *net; - struct sctp_tcb *stcb = NULL; struct sctp_chunkhdr *ch; - int refcount_up = 0; - int length, mlen, offset; + int length, offset; #if !defined(SCTP_WITH_NO_CSUM) - uint32_t check, calc_check; + uint8_t compute_crc; #endif + uint32_t mflowid; + uint8_t use_mflowid; + iphlen = off; if (SCTP_GET_PKT_VRFID(i_pak, vrf_id)) { SCTP_RELEASE_PKT(i_pak); return; } - mlen = SCTP_HEADER_LEN(i_pak); - iphlen = off; m = SCTP_HEADER_TO_CHAIN(i_pak); - - net = NULL; - SCTP_STAT_INCR(sctps_recvpackets); - SCTP_STAT_INCR_COUNTER64(sctps_inpackets); - - #ifdef SCTP_MBUF_LOGGING /* Log in any input mbufs */ if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { @@ -5847,208 +6017,85 @@ sctp_input_with_port(struct mbuf *i_pak, int off, uint16_t port) } } #endif -#ifdef SCTP_PACKET_LOGGING - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) - sctp_packet_log(m, mlen); +#ifdef SCTP_PACKET_LOGGING + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) { + sctp_packet_log(m); + } #endif - /* - * Must take out the iphlen, since mlen expects this (only effect lb - * case) - */ - mlen -= iphlen; - - /* - * Get IP, SCTP, and first chunk header together in first mbuf. - */ - ip = mtod(m, struct ip *); - offset = iphlen + sizeof(*sh) + sizeof(*ch); - if (SCTP_BUF_LEN(m) < offset) { - if ((m = m_pullup(m, offset)) == 0) { - SCTP_STAT_INCR(sctps_hdrops); - return; - } - ip = mtod(m, struct ip *); - } - /* validate mbuf chain length with IP payload length */ - if (mlen < (SCTP_GET_IPV4_LENGTH(ip) - iphlen)) { - SCTP_STAT_INCR(sctps_hdrops); - goto bad; - } - sh = (struct sctphdr *)((caddr_t)ip + iphlen); - ch = (struct sctp_chunkhdr *)((caddr_t)sh + sizeof(*sh)); - SCTPDBG(SCTP_DEBUG_INPUT1, - "sctp_input() length:%d iphlen:%d\n", mlen, iphlen); - - /* SCTP does not allow broadcasts or multicasts */ - if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) { - goto bad; - } - if (SCTP_IS_IT_BROADCAST(ip->ip_dst, m)) { - /* - * We only look at broadcast if its a front state, All - * others we will not have a tcb for anyway. - */ - goto bad; - } - /* validate SCTP checksum */ SCTPDBG(SCTP_DEBUG_CRCOFFLOAD, "sctp_input(): Packet of length %d received on %s with csum_flags 0x%x.\n", m->m_pkthdr.len, if_name(m->m_pkthdr.rcvif), m->m_pkthdr.csum_flags); + if (m->m_flags & M_FLOWID) { + mflowid = m->m_pkthdr.flowid; + use_mflowid = 1; + } else { + mflowid = 0; + use_mflowid = 0; + } + SCTP_STAT_INCR(sctps_recvpackets); + SCTP_STAT_INCR_COUNTER64(sctps_inpackets); + /* Get IP, SCTP, and first chunk header together in the first mbuf. */ + offset = iphlen + sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr); + if (SCTP_BUF_LEN(m) < offset) { + if ((m = m_pullup(m, offset)) == NULL) { + SCTP_STAT_INCR(sctps_hdrops); + return; + } + } + ip = mtod(m, struct ip *); + sh = (struct sctphdr *)((caddr_t)ip + iphlen); + ch = (struct sctp_chunkhdr *)((caddr_t)sh + sizeof(struct sctphdr)); + offset -= sizeof(struct sctp_chunkhdr); + memset(&src, 0, sizeof(struct sockaddr_in)); + src.sin_family = AF_INET; + src.sin_len = sizeof(struct sockaddr_in); + src.sin_port = sh->src_port; + src.sin_addr = ip->ip_src; + memset(&dst, 0, sizeof(struct sockaddr_in)); + dst.sin_family = AF_INET; + dst.sin_len = sizeof(struct sockaddr_in); + dst.sin_port = sh->dest_port; + dst.sin_addr = ip->ip_dst; + length = ip->ip_len + iphlen; + /* Validate mbuf chain length with IP payload length. */ + if (SCTP_HEADER_LEN(m) != length) { + SCTPDBG(SCTP_DEBUG_INPUT1, + "sctp_input() length:%d reported length:%d\n", length, SCTP_HEADER_LEN(m)); + SCTP_STAT_INCR(sctps_hdrops); + goto out; + } + /* SCTP does not allow broadcasts or multicasts */ + if (IN_MULTICAST(ntohl(dst.sin_addr.s_addr))) { + goto out; + } + if (SCTP_IS_IT_BROADCAST(dst.sin_addr, m)) { + goto out; + } + ecn_bits = ip->ip_tos; #if defined(SCTP_WITH_NO_CSUM) SCTP_STAT_INCR(sctps_recvnocrc); #else if (m->m_pkthdr.csum_flags & CSUM_SCTP_VALID) { SCTP_STAT_INCR(sctps_recvhwcrc); - goto sctp_skip_csum_4; + compute_crc = 0; + } else { + SCTP_STAT_INCR(sctps_recvswcrc); + compute_crc = 1; } - check = sh->checksum; /* save incoming checksum */ - sh->checksum = 0; /* prepare for calc */ - calc_check = sctp_calculate_cksum(m, iphlen); - sh->checksum = check; - SCTP_STAT_INCR(sctps_recvswcrc); - if (calc_check != check) { - SCTPDBG(SCTP_DEBUG_INPUT1, "Bad CSUM on SCTP packet calc_check:%x check:%x m:%p mlen:%d iphlen:%d\n", - calc_check, check, m, mlen, iphlen); - - stcb = sctp_findassociation_addr(m, - offset - sizeof(*ch), - sh, ch, &inp, &net, - vrf_id); - if ((net) && (port)) { - if (net->port == 0) { - sctp_pathmtu_adjustment(stcb, net->mtu - sizeof(struct udphdr)); - } - net->port = port; - } - if ((net != NULL) && (m->m_flags & M_FLOWID)) { - net->flowid = m->m_pkthdr.flowid; -#ifdef INVARIANTS - net->flowidset = 1; #endif - } - if ((inp) && (stcb)) { - sctp_send_packet_dropped(stcb, net, m, iphlen, 1); - sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_INPUT_ERROR, SCTP_SO_NOT_LOCKED); - } else if ((inp != NULL) && (stcb == NULL)) { - refcount_up = 1; - } - SCTP_STAT_INCR(sctps_badsum); - SCTP_STAT_INCR_COUNTER32(sctps_checksumerrors); - goto bad; - } -sctp_skip_csum_4: + sctp_common_input_processing(&m, iphlen, offset, length, + (struct sockaddr *)&src, + (struct sockaddr *)&dst, + sh, ch, +#if !defined(SCTP_WITH_NO_CSUM) + compute_crc, #endif - /* destination port of 0 is illegal, based on RFC2960. */ - if (sh->dest_port == 0) { - SCTP_STAT_INCR(sctps_hdrops); - goto bad; - } - /* - * Locate pcb and tcb for datagram sctp_findassociation_addr() wants - * IP/SCTP/first chunk header... - */ - stcb = sctp_findassociation_addr(m, offset - sizeof(*ch), - sh, ch, &inp, &net, vrf_id); - if ((net) && (port)) { - if (net->port == 0) { - sctp_pathmtu_adjustment(stcb, net->mtu - sizeof(struct udphdr)); - } - net->port = port; - } - if ((net != NULL) && (m->m_flags & M_FLOWID)) { - net->flowid = m->m_pkthdr.flowid; -#ifdef INVARIANTS - net->flowidset = 1; -#endif - } - /* inp's ref-count increased && stcb locked */ - if (inp == NULL) { - struct sctp_init_chunk *init_chk, chunk_buf; - - SCTP_STAT_INCR(sctps_noport); -#ifdef ICMP_BANDLIM - /* - * we use the bandwidth limiting to protect against sending - * too many ABORTS all at once. In this case these count the - * same as an ICMP message. - */ - if (badport_bandlim(0) < 0) - goto bad; -#endif /* ICMP_BANDLIM */ - SCTPDBG(SCTP_DEBUG_INPUT1, - "Sending a ABORT from packet entry!\n"); - if (ch->chunk_type == SCTP_INITIATION) { - /* - * we do a trick here to get the INIT tag, dig in - * and get the tag from the INIT and put it in the - * common header. - */ - init_chk = (struct sctp_init_chunk *)sctp_m_getptr(m, - iphlen + sizeof(*sh), sizeof(*init_chk), - (uint8_t *) & chunk_buf); - if (init_chk != NULL) - sh->v_tag = init_chk->init.initiate_tag; - } - if (ch->chunk_type == SCTP_SHUTDOWN_ACK) { - sctp_send_shutdown_complete2(m, sh, vrf_id, port); - goto bad; - } - if (ch->chunk_type == SCTP_SHUTDOWN_COMPLETE) { - goto bad; - } - if (ch->chunk_type != SCTP_ABORT_ASSOCIATION) { - if ((SCTP_BASE_SYSCTL(sctp_blackhole) == 0) || - ((SCTP_BASE_SYSCTL(sctp_blackhole) == 1) && - (ch->chunk_type != SCTP_INIT))) { - sctp_send_abort(m, iphlen, sh, 0, NULL, vrf_id, port); - } - } - goto bad; - } else if (stcb == NULL) { - refcount_up = 1; - } -#ifdef IPSEC - /* - * I very much doubt any of the IPSEC stuff will work but I have no - * idea, so I will leave it in place. - */ - if (inp && ipsec4_in_reject(m, &inp->ip_inp.inp)) { - MODULE_GLOBAL(ipsec4stat).in_polvio++; - SCTP_STAT_INCR(sctps_hdrops); - goto bad; - } -#endif /* IPSEC */ - - /* - * common chunk processing - */ - length = ip->ip_len + iphlen; - offset -= sizeof(struct sctp_chunkhdr); - - ecn_bits = ip->ip_tos; - - /* sa_ignore NO_NULL_CHK */ - sctp_common_input_processing(&m, iphlen, offset, length, sh, ch, - inp, stcb, net, ecn_bits, vrf_id, port); - /* inp's ref-count reduced && stcb unlocked */ - if (m) { - sctp_m_freem(m); - } - if ((inp) && (refcount_up)) { - /* reduce ref-count */ - SCTP_INP_DECR_REF(inp); - } - return; -bad: - if (stcb) { - SCTP_TCB_UNLOCK(stcb); - } - if ((inp) && (refcount_up)) { - /* reduce ref-count */ - SCTP_INP_DECR_REF(inp); - } + ecn_bits, + use_mflowid, mflowid, + vrf_id, port); +out: if (m) { sctp_m_freem(m); } @@ -6078,15 +6125,14 @@ sctp_input(struct mbuf *m, int off) * No flow id built by lower layers fix it so we * create one. */ - ip = mtod(m, struct ip *); - offset = off + sizeof(*sh); + offset = off + sizeof(struct sctphdr); if (SCTP_BUF_LEN(m) < offset) { - if ((m = m_pullup(m, offset)) == 0) { + if ((m = m_pullup(m, offset)) == NULL) { SCTP_STAT_INCR(sctps_hdrops); return; } - ip = mtod(m, struct ip *); } + ip = mtod(m, struct ip *); sh = (struct sctphdr *)((caddr_t)ip + off); tag = htonl(sh->v_tag); flowid = tag ^ ntohs(sh->dest_port) ^ ntohs(sh->src_port); diff --git a/sys/netinet/sctp_input.h b/sys/netinet/sctp_input.h index 9a9a420cb4b..9b91ec6fc3c 100644 --- a/sys/netinet/sctp_input.h +++ b/sys/netinet/sctp_input.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,19 +30,23 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_input.h,v 1.6 2005/03/06 16:04:17 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_input_h__ -#define __sctp_input_h__ +#ifndef _NETINET_SCTP_INPUT_H_ +#define _NETINET_SCTP_INPUT_H_ #if defined(_KERNEL) || defined(__Userspace__) void sctp_common_input_processing(struct mbuf **, int, int, int, - struct sctphdr *, struct sctp_chunkhdr *, struct sctp_inpcb *, - struct sctp_tcb *, struct sctp_nets *, uint8_t, uint32_t, uint16_t); + struct sockaddr *, struct sockaddr *, + struct sctphdr *, struct sctp_chunkhdr *, +#if !defined(SCTP_WITH_NO_CSUM) + uint8_t, +#endif + uint8_t, + uint8_t, uint32_t, + uint32_t, uint16_t); struct sctp_stream_reset_out_request * sctp_find_stream_reset(struct sctp_tcb *stcb, uint32_t seq, diff --git a/sys/netinet/sctp_lock_bsd.h b/sys/netinet/sctp_lock_bsd.h index fcdcf4a6261..35cdf5f802f 100644 --- a/sys/netinet/sctp_lock_bsd.h +++ b/sys/netinet/sctp_lock_bsd.h @@ -1,9 +1,7 @@ -#ifndef __sctp_lock_bsd_h__ -#define __sctp_lock_bsd_h__ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -32,6 +30,12 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ +#include +__FBSDID("$FreeBSD$"); + +#ifndef _NETINET_SCTP_LOCK_BSD_H_ +#define _NETINET_SCTP_LOCK_BSD_H_ + /* * General locking concepts: The goal of our locking is to of course provide * consistency and yet minimize overhead. We will attempt to use @@ -70,9 +74,6 @@ * SCTP_INP_INFO_RLOCK() and then when we want to add a new association to * the SCTP_BASE_INFO() list's we will do a SCTP_INP_INFO_WLOCK(). */ -#include -__FBSDID("$FreeBSD$"); - extern struct sctp_foo_stuff sctp_logoff[]; extern int sctp_logoff_stuff; diff --git a/sys/netinet/sctp_os.h b/sys/netinet/sctp_os.h index b3a7cf481d5..dc6049b6487 100644 --- a/sys/netinet/sctp_os.h +++ b/sys/netinet/sctp_os.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2006-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -29,10 +29,12 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ + #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_os_h__ -#define __sctp_os_h__ + +#ifndef _NETINET_SCTP_OS_H_ +#define _NETINET_SCTP_OS_H_ /* * General kernel memory allocation: diff --git a/sys/netinet/sctp_os_bsd.h b/sys/netinet/sctp_os_bsd.h index 215b93dbd52..9cb77b688c2 100644 --- a/sys/netinet/sctp_os_bsd.h +++ b/sys/netinet/sctp_os_bsd.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2006-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -29,10 +29,12 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ + #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_os_bsd_h__ -#define __sctp_os_bsd_h__ + +#ifndef _NETINET_SCTP_OS_BSD_H_ +#define _NETINET_SCTP_OS_BSD_H_ /* * includes */ @@ -157,12 +159,13 @@ MALLOC_DECLARE(SCTP_M_MCORE); */ #define USER_ADDR_NULL (NULL) /* FIX ME: temp */ +#define SCTP_PRINTF(params...) printf(params) #if defined(SCTP_DEBUG) #define SCTPDBG(level, params...) \ { \ do { \ if (SCTP_BASE_SYSCTL(sctp_debug_on) & level ) { \ - printf(params); \ + SCTP_PRINTF(params); \ } \ } while (0); \ } @@ -174,20 +177,10 @@ MALLOC_DECLARE(SCTP_M_MCORE); } \ } while (0); \ } -#define SCTPDBG_PKT(level, iph, sh) \ -{ \ - do { \ - if (SCTP_BASE_SYSCTL(sctp_debug_on) & level) { \ - sctp_print_address_pkt(iph, sh); \ - } \ - } while (0); \ -} #else #define SCTPDBG(level, params...) #define SCTPDBG_ADDR(level, addr) -#define SCTPDBG_PKT(level, iph, sh) #endif -#define SCTP_PRINTF(params...) printf(params) #ifdef SCTP_LTRACE_CHUNKS #define SCTP_LTRACE_CHK(a, b, c, d) if(SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LTRACE_CHUNK_ENABLE) SCTP_CTR6(KTR_SUBSYS, "SCTP:%d[%d]:%x-%x-%x-%x", SCTP_LOG_CHUNK_PROC, 0, a, b, c, d) @@ -196,12 +189,14 @@ MALLOC_DECLARE(SCTP_M_MCORE); #endif #ifdef SCTP_LTRACE_ERRORS -#define SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, file, err) if(SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LTRACE_ERROR_ENABLE) \ - printf("mbuf:%p inp:%p stcb:%p net:%p file:%x line:%d error:%d\n", \ - m, inp, stcb, net, file, __LINE__, err); -#define SCTP_LTRACE_ERR_RET(inp, stcb, net, file, err) if(SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LTRACE_ERROR_ENABLE) \ - printf("inp:%p stcb:%p net:%p file:%x line:%d error:%d\n", \ - inp, stcb, net, file, __LINE__, err); +#define SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, file, err) \ + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LTRACE_ERROR_ENABLE) \ + SCTP_PRINTF("mbuf:%p inp:%p stcb:%p net:%p file:%x line:%d error:%d\n", \ + m, inp, stcb, net, file, __LINE__, err); +#define SCTP_LTRACE_ERR_RET(inp, stcb, net, file, err) \ + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LTRACE_ERROR_ENABLE) \ + SCTP_PRINTF("inp:%p stcb:%p net:%p file:%x line:%d error:%d\n", \ + inp, stcb, net, file, __LINE__, err); #else #define SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, file, err) #define SCTP_LTRACE_ERR_RET(inp, stcb, net, file, err) @@ -361,7 +356,7 @@ typedef struct callout sctp_os_timer_t; */ #define SCTP_HEADER_TO_CHAIN(m) (m) #define SCTP_DETACH_HEADER_FROM_CHAIN(m) -#define SCTP_HEADER_LEN(m) (m->m_pkthdr.len) +#define SCTP_HEADER_LEN(m) ((m)->m_pkthdr.len) #define SCTP_GET_HEADER_FOR_OUTPUT(o_pak) 0 #define SCTP_RELEASE_HEADER(m) #define SCTP_RELEASE_PKT(m) sctp_m_freem(m) @@ -390,10 +385,6 @@ typedef struct callout sctp_os_timer_t; * its a NOP. */ -/* Macro's for getting length from V6/V4 header */ -#define SCTP_GET_IPV4_LENGTH(iph) (iph->ip_len) -#define SCTP_GET_IPV6_LENGTH(ip6) (ntohs(ip6->ip6_plen)) - /* get the v6 hop limit */ #define SCTP_GET_HLIM(inp, ro) in6_selecthlim((struct in6pcb *)&inp->ip_inp.inp, (ro ? (ro->ro_rt ? (ro->ro_rt->rt_ifp) : (NULL)) : (NULL))); diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c index a8927b6c591..10e39599d98 100644 --- a/sys/netinet/sctp_output.c +++ b/sys/netinet/sctp_output.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,8 +30,6 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_output.c,v 1.46 2005/03/06 16:04:17 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); @@ -3062,7 +3060,7 @@ again_with_private_addresses_allowed: continue; } } else { - printf("Stcb is null - no print\n"); + SCTP_PRINTF("Stcb is null - no print\n"); } atomic_add_int(&sifa->refcount, 1); goto out; @@ -3430,7 +3428,7 @@ sctp_find_cmsg(int c_type, void *data, struct mbuf *control, size_t cpsize) } m_copydata(control, at + CMSG_ALIGN(sizeof(struct cmsghdr)), sizeof(struct sctp_authinfo), (caddr_t)&authinfo); sndrcvinfo->sinfo_keynumber_valid = 1; - sndrcvinfo->sinfo_keynumber = authinfo.auth_keyid; + sndrcvinfo->sinfo_keynumber = authinfo.auth_keynumber; break; default: return (found); @@ -3815,8 +3813,7 @@ sctp_handle_no_route(struct sctp_tcb *stcb, if ((net->dest_state & SCTP_ADDR_REACHABLE) && stcb) { SCTPDBG(SCTP_DEBUG_OUTPUT1, "no route takes interface %p down\n", net); sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, - stcb, - SCTP_FAILED_THRESHOLD, + stcb, 0, (void *)net, so_locked); net->dest_state &= ~SCTP_ADDR_REACHABLE; @@ -3862,13 +3859,13 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, uint16_t dest_port, uint32_t v_tag, uint16_t port, -#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) - int so_locked SCTP_UNUSED, -#else - int so_locked, -#endif union sctp_sockstore *over_addr, - struct mbuf *init + uint8_t use_mflowid, uint32_t mflowid, +#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) + int so_locked SCTP_UNUSED +#else + int so_locked +#endif ) /* nofragment_flag to tell if IP_DF should be set (IPv4 only) */ { @@ -3895,7 +3892,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, struct udphdr *udp = NULL; uint8_t tos_value; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so = NULL; #endif @@ -3954,8 +3951,8 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, m->m_pkthdr.flowid = net->flowid; m->m_flags |= M_FLOWID; } else { - if ((init != NULL) && (init->m_flags & M_FLOWID)) { - m->m_pkthdr.flowid = init->m_pkthdr.flowid; + if (use_mflowid != 0) { + m->m_pkthdr.flowid = mflowid; m->m_flags |= M_FLOWID; } } @@ -4110,23 +4107,13 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, sctp_m_freem(m); return (ENOMEM); } -#ifdef SCTP_PACKET_LOGGING - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) - sctp_packet_log(m, packet_length); -#endif SCTP_ATTACH_CHAIN(o_pak, m, packet_length); if (port) { #if defined(SCTP_WITH_NO_CSUM) SCTP_STAT_INCR(sctps_sendnocrc); #else - if (!(SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback) && - (stcb) && - (stcb->asoc.loopback_scope))) { - sctphdr->checksum = sctp_calculate_cksum(m, sizeof(struct ip) + sizeof(struct udphdr)); - SCTP_STAT_INCR(sctps_sendswcrc); - } else { - SCTP_STAT_INCR(sctps_sendnocrc); - } + sctphdr->checksum = sctp_calculate_cksum(m, sizeof(struct ip) + sizeof(struct udphdr)); + SCTP_STAT_INCR(sctps_sendswcrc); #endif if (V_udp_cksum) { SCTP_ENABLE_UDP_CSUM(o_pak); @@ -4140,15 +4127,19 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, SCTP_STAT_INCR(sctps_sendhwcrc); #endif } +#ifdef SCTP_PACKET_LOGGING + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) + sctp_packet_log(o_pak); +#endif /* send it out. table id is taken from stcb */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) if ((SCTP_BASE_SYSCTL(sctp_output_unlocked)) && (so_locked)) { so = SCTP_INP_SO(inp); SCTP_SOCKET_UNLOCK(so, 0); } #endif SCTP_IP_OUTPUT(ret, o_pak, ro, stcb, vrf_id); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) if ((SCTP_BASE_SYSCTL(sctp_output_unlocked)) && (so_locked)) { atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -4165,10 +4156,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, SCTPDBG(SCTP_DEBUG_OUTPUT3, "IP output returns %d\n", ret); if (net == NULL) { /* free tempy routes */ - if (ro->ro_rt) { - RTFREE(ro->ro_rt); - ro->ro_rt = NULL; - } + RO_RTFREE(ro); } else { /* * PMTU check versus smallest asoc MTU goes @@ -4252,8 +4240,8 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, m->m_pkthdr.flowid = net->flowid; m->m_flags |= M_FLOWID; } else { - if ((init != NULL) && (init->m_flags & M_FLOWID)) { - m->m_pkthdr.flowid = init->m_pkthdr.flowid; + if (use_mflowid != 0) { + m->m_pkthdr.flowid = mflowid; m->m_flags |= M_FLOWID; } } @@ -4468,23 +4456,13 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); return (ENOMEM); } -#ifdef SCTP_PACKET_LOGGING - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) - sctp_packet_log(m, packet_length); -#endif SCTP_ATTACH_CHAIN(o_pak, m, packet_length); if (port) { #if defined(SCTP_WITH_NO_CSUM) SCTP_STAT_INCR(sctps_sendnocrc); #else - if (!(SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback) && - (stcb) && - (stcb->asoc.loopback_scope))) { - sctphdr->checksum = sctp_calculate_cksum(m, sizeof(struct ip6_hdr) + sizeof(struct udphdr)); - SCTP_STAT_INCR(sctps_sendswcrc); - } else { - SCTP_STAT_INCR(sctps_sendnocrc); - } + sctphdr->checksum = sctp_calculate_cksum(m, sizeof(struct ip6_hdr) + sizeof(struct udphdr)); + SCTP_STAT_INCR(sctps_sendswcrc); #endif if ((udp->uh_sum = in6_cksum(o_pak, IPPROTO_UDP, sizeof(struct ip6_hdr), packet_length - sizeof(struct ip6_hdr))) == 0) { udp->uh_sum = 0xffff; @@ -4493,20 +4471,24 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, #if defined(SCTP_WITH_NO_CSUM) SCTP_STAT_INCR(sctps_sendnocrc); #else - m->m_pkthdr.csum_flags = CSUM_SCTP; + m->m_pkthdr.csum_flags = CSUM_SCTP_IPV6; m->m_pkthdr.csum_data = 0; SCTP_STAT_INCR(sctps_sendhwcrc); #endif } /* send it out. table id is taken from stcb */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) if ((SCTP_BASE_SYSCTL(sctp_output_unlocked)) && (so_locked)) { so = SCTP_INP_SO(inp); SCTP_SOCKET_UNLOCK(so, 0); } +#endif +#ifdef SCTP_PACKET_LOGGING + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) + sctp_packet_log(o_pak); #endif SCTP_IP6_OUTPUT(ret, o_pak, (struct route_in6 *)ro, &ifp, stcb, vrf_id); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) if ((SCTP_BASE_SYSCTL(sctp_output_unlocked)) && (so_locked)) { atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -4528,9 +4510,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, } if (net == NULL) { /* Now if we had a temp route free it */ - if (ro->ro_rt) { - RTFREE(ro->ro_rt); - } + RO_RTFREE(ro); } else { /* * PMTU check versus smallest asoc MTU goes @@ -4856,7 +4836,9 @@ sctp_send_initiate(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int so_locked (struct sockaddr *)&net->ro._l_addr, m, 0, NULL, 0, 0, 0, 0, inp->sctp_lport, stcb->rport, htonl(0), - net->port, so_locked, NULL, NULL); + net->port, NULL, + 0, 0, + so_locked); SCTPDBG(SCTP_DEBUG_OUTPUT4, "lowlevel_output - %d\n", ret); SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); (void)SCTP_GETTIME_TIMEVAL(&net->last_sent_time); @@ -5202,7 +5184,7 @@ invalid_size: static int sctp_are_there_new_addresses(struct sctp_association *asoc, - struct mbuf *in_initpkt, int offset) + struct mbuf *in_initpkt, int offset, struct sockaddr *src) { /* * Given a INIT packet, look through the packet to verify that there @@ -5217,7 +5199,6 @@ sctp_are_there_new_addresses(struct sctp_association *asoc, uint16_t ptype, plen; uint8_t fnd; struct sctp_nets *net; - struct ip *iph; #ifdef INET struct sockaddr_in sin4, *sa4; @@ -5225,7 +5206,6 @@ sctp_are_there_new_addresses(struct sctp_association *asoc, #endif #ifdef INET6 struct sockaddr_in6 sin6, *sa6; - struct ip6_hdr *ip6h; #endif @@ -5239,37 +5219,18 @@ sctp_are_there_new_addresses(struct sctp_association *asoc, sin6.sin6_family = AF_INET6; sin6.sin6_len = sizeof(sin6); #endif - sa_touse = NULL; /* First what about the src address of the pkt ? */ - iph = mtod(in_initpkt, struct ip *); - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - /* source addr is IPv4 */ - sin4.sin_addr = iph->ip_src; - sa_touse = (struct sockaddr *)&sin4; - break; -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - /* source addr is IPv6 */ - ip6h = mtod(in_initpkt, struct ip6_hdr *); - sin6.sin6_addr = ip6h->ip6_src; - sa_touse = (struct sockaddr *)&sin6; - break; -#endif - default: - return (1); - } - fnd = 0; TAILQ_FOREACH(net, &asoc->nets, sctp_next) { sa = (struct sockaddr *)&net->ro._l_addr; - if (sa->sa_family == sa_touse->sa_family) { + if (sa->sa_family == src->sa_family) { #ifdef INET if (sa->sa_family == AF_INET) { + struct sockaddr_in *src4; + sa4 = (struct sockaddr_in *)sa; - if (sa4->sin_addr.s_addr == sin4.sin_addr.s_addr) { + src4 = (struct sockaddr_in *)src; + if (sa4->sin_addr.s_addr == src4->sin_addr.s_addr) { fnd = 1; break; } @@ -5277,8 +5238,11 @@ sctp_are_there_new_addresses(struct sctp_association *asoc, #endif #ifdef INET6 if (sa->sa_family == AF_INET6) { + struct sockaddr_in6 *src6; + sa6 = (struct sockaddr_in6 *)sa; - if (SCTP6_ARE_ADDR_EQUAL(sa6, &sin6)) { + src6 = (struct sockaddr_in6 *)src; + if (SCTP6_ARE_ADDR_EQUAL(sa6, src6)) { fnd = 1; break; } @@ -5385,8 +5349,11 @@ sctp_are_there_new_addresses(struct sctp_association *asoc, */ void sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb, - struct mbuf *init_pkt, int iphlen, int offset, struct sctphdr *sh, - struct sctp_init_chunk *init_chk, uint32_t vrf_id, uint16_t port, int hold_inp_lock) + struct mbuf *init_pkt, int iphlen, int offset, + struct sockaddr *src, struct sockaddr *dst, + struct sctphdr *sh, struct sctp_init_chunk *init_chk, + uint8_t use_mflowid, uint32_t mflowid, + uint32_t vrf_id, uint16_t port, int hold_inp_lock) { struct sctp_association *asoc; struct mbuf *m, *m_at, *m_tmp, *m_cookie, *op_err, *mp_last; @@ -5395,20 +5362,18 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_ecn_supported_param *ecn; struct sctp_prsctp_supported_param *prsctp; struct sctp_supported_chunk_types_param *pr_supported; - union sctp_sockstore store, store1, *over_addr; + union sctp_sockstore *over_addr; #ifdef INET - struct sockaddr_in *sin, *to_sin; + struct sockaddr_in *dst4 = (struct sockaddr_in *)dst; + struct sockaddr_in *src4 = (struct sockaddr_in *)src; + struct sockaddr_in *sin; #endif #ifdef INET6 - struct sockaddr_in6 *sin6, *to_sin6; - -#endif - struct ip *iph; - -#ifdef INET6 - struct ip6_hdr *ip6; + struct sockaddr_in6 *dst6 = (struct sockaddr_in6 *)dst; + struct sockaddr_in6 *src6 = (struct sockaddr_in6 *)src; + struct sockaddr_in6 *sin6; #endif struct sockaddr *to; @@ -5423,21 +5388,24 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int nat_friendly = 0; struct socket *so; - if (stcb) + if (stcb) { asoc = &stcb->asoc; - else + } else { asoc = NULL; + } mp_last = NULL; if ((asoc != NULL) && (SCTP_GET_STATE(asoc) != SCTP_STATE_COOKIE_WAIT) && - (sctp_are_there_new_addresses(asoc, init_pkt, offset))) { + (sctp_are_there_new_addresses(asoc, init_pkt, offset, src))) { /* new addresses, out of here in non-cookie-wait states */ /* * Send a ABORT, we don't add the new address error clause * though we even set the T bit and copy in the 0 tag.. this * looks no different than if no listener was present. */ - sctp_send_abort(init_pkt, iphlen, sh, 0, NULL, vrf_id, port); + sctp_send_abort(init_pkt, iphlen, src, dst, sh, 0, NULL, + use_mflowid, mflowid, + vrf_id, port); return; } abort_flag = 0; @@ -5446,8 +5414,10 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb, &abort_flag, (struct sctp_chunkhdr *)init_chk, &nat_friendly); if (abort_flag) { do_a_abort: - sctp_send_abort(init_pkt, iphlen, sh, - init_chk->init.initiate_tag, op_err, vrf_id, port); + sctp_send_abort(init_pkt, iphlen, src, dst, sh, + init_chk->init.initiate_tag, op_err, + use_mflowid, mflowid, + vrf_id, port); return; } m = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_DONTWAIT, 1, MT_DATA); @@ -5509,61 +5479,20 @@ do_a_abort: #else stc.ipv4_scope = 0; #endif - /* now for scope setup */ - memset((caddr_t)&store, 0, sizeof(store)); - memset((caddr_t)&store1, 0, sizeof(store1)); -#ifdef INET - sin = &store.sin; - to_sin = &store1.sin; -#endif -#ifdef INET6 - sin6 = &store.sin6; - to_sin6 = &store1.sin6; -#endif - iph = mtod(init_pkt, struct ip *); - /* establish the to_addr's */ - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - to_sin->sin_port = sh->dest_port; - to_sin->sin_family = AF_INET; - to_sin->sin_len = sizeof(struct sockaddr_in); - to_sin->sin_addr = iph->ip_dst; - break; -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - ip6 = mtod(init_pkt, struct ip6_hdr *); - to_sin6->sin6_addr = ip6->ip6_dst; - to_sin6->sin6_scope_id = 0; - to_sin6->sin6_port = sh->dest_port; - to_sin6->sin6_family = AF_INET6; - to_sin6->sin6_len = sizeof(struct sockaddr_in6); - break; -#endif - default: - goto do_a_abort; - break; - } - if (net == NULL) { - to = (struct sockaddr *)&store; - switch (iph->ip_v) { + to = src; + switch (dst->sa_family) { #ifdef INET - case IPVERSION: + case AF_INET: { - sin->sin_family = AF_INET; - sin->sin_len = sizeof(struct sockaddr_in); - sin->sin_port = sh->src_port; - sin->sin_addr = iph->ip_src; /* lookup address */ - stc.address[0] = sin->sin_addr.s_addr; + stc.address[0] = src4->sin_addr.s_addr; stc.address[1] = 0; stc.address[2] = 0; stc.address[3] = 0; stc.addr_type = SCTP_IPV4_ADDRESS; /* local from address */ - stc.laddress[0] = to_sin->sin_addr.s_addr; + stc.laddress[0] = dst4->sin_addr.s_addr; stc.laddress[1] = 0; stc.laddress[2] = 0; stc.laddress[3] = 0; @@ -5571,14 +5500,14 @@ do_a_abort: /* scope_id is only for v6 */ stc.scope_id = 0; #ifndef SCTP_DONT_DO_PRIVADDR_SCOPE - if (IN4_ISPRIVATE_ADDRESS(&sin->sin_addr)) { + if (IN4_ISPRIVATE_ADDRESS(&src4->sin_addr)) { stc.ipv4_scope = 1; } #else stc.ipv4_scope = 1; #endif /* SCTP_DONT_DO_PRIVADDR_SCOPE */ /* Must use the address in this case */ - if (sctp_is_address_on_local_host((struct sockaddr *)sin, vrf_id)) { + if (sctp_is_address_on_local_host(src, vrf_id)) { stc.loopback_scope = 1; stc.ipv4_scope = 1; stc.site_scope = 1; @@ -5588,32 +5517,17 @@ do_a_abort: } #endif #ifdef INET6 - case IPV6_VERSION >> 4: + case AF_INET6: { - ip6 = mtod(init_pkt, struct ip6_hdr *); - sin6->sin6_family = AF_INET6; - sin6->sin6_len = sizeof(struct sockaddr_in6); - sin6->sin6_port = sh->src_port; - sin6->sin6_addr = ip6->ip6_src; - /* lookup address */ - memcpy(&stc.address, &sin6->sin6_addr, - sizeof(struct in6_addr)); - sin6->sin6_scope_id = 0; stc.addr_type = SCTP_IPV6_ADDRESS; - stc.scope_id = 0; - if (sctp_is_address_on_local_host((struct sockaddr *)sin6, vrf_id)) { - /* - * FIX ME: does this have scope from - * rcvif? - */ - (void)sa6_recoverscope(sin6); - stc.scope_id = sin6->sin6_scope_id; - sa6_embedscope(sin6, MODULE_GLOBAL(ip6_use_defzone)); + memcpy(&stc.address, &src6->sin6_addr, sizeof(struct in6_addr)); + stc.scope_id = in6_getscope(&src6->sin6_addr); + if (sctp_is_address_on_local_host(src, vrf_id)) { stc.loopback_scope = 1; stc.local_scope = 0; stc.site_scope = 1; stc.ipv4_scope = 1; - } else if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) { + } else if (IN6_IS_ADDR_LINKLOCAL(&src6->sin6_addr)) { /* * If the new destination is a * LINK_LOCAL we must have common @@ -5638,14 +5552,7 @@ do_a_abort: * pull out the scope_id from * incoming pkt */ - /* - * FIX ME: does this have scope from - * rcvif? - */ - (void)sa6_recoverscope(sin6); - stc.scope_id = sin6->sin6_scope_id; - sa6_embedscope(sin6, MODULE_GLOBAL(ip6_use_defzone)); - } else if (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr)) { + } else if (IN6_IS_ADDR_SITELOCAL(&src6->sin6_addr)) { /* * If the new destination is * SITE_LOCAL then we must have site @@ -5653,7 +5560,7 @@ do_a_abort: */ stc.site_scope = 1; } - memcpy(&stc.laddress, &to_sin6->sin6_addr, sizeof(struct in6_addr)); + memcpy(&stc.laddress, &dst6->sin6_addr, sizeof(struct in6_addr)); stc.laddr_type = SCTP_IPV6_ADDRESS; break; } @@ -5733,7 +5640,7 @@ do_a_abort: if (net->src_addr_selected == 0) { /* * strange case here, the INIT should have - * did the selection. + * done the selection. */ net->ro._s_addr = sctp_source_address_selection(inp, stcb, (sctp_route_t *) & net->ro, @@ -6041,7 +5948,7 @@ do_a_abort: } } if (stc.loopback_scope) { - over_addr = &store1; + over_addr = (union sctp_sockstore *)dst; } else { over_addr = NULL; } @@ -6049,7 +5956,9 @@ do_a_abort: (void)sctp_lowlevel_chunk_output(inp, NULL, NULL, to, m, 0, NULL, 0, 0, 0, 0, inp->sctp_lport, sh->src_port, init_chk->init.initiate_tag, - port, SCTP_SO_NOT_LOCKED, over_addr, init_pkt); + port, over_addr, + use_mflowid, mflowid, + SCTP_SO_NOT_LOCKED); SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); } @@ -6092,14 +6001,14 @@ sctp_prune_prsctp(struct sctp_tcb *stcb, * if the mbuf is here */ int ret_spc; - int cause; + uint8_t sent; if (chk->sent > SCTP_DATAGRAM_UNSENT) - cause = SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT; + sent = 1; else - cause = SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_UNSENT; + sent = 0; ret_spc = sctp_release_pr_sctp_chunk(stcb, chk, - cause, + sent, SCTP_SO_LOCKED); freed_spc += ret_spc; if (freed_spc >= dataout) { @@ -6122,8 +6031,7 @@ sctp_prune_prsctp(struct sctp_tcb *stcb, int ret_spc; ret_spc = sctp_release_pr_sctp_chunk(stcb, chk, - SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_UNSENT, - SCTP_SO_LOCKED); + 0, SCTP_SO_LOCKED); freed_spc += ret_spc; if (freed_spc >= dataout) { @@ -6573,9 +6481,7 @@ sctp_sendall_iterator(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr, * dis-appearing on us. */ atomic_add_int(&stcb->asoc.refcnt, 1); - sctp_abort_an_association(inp, stcb, - SCTP_RESPONSE_TO_USER_REQ, - m, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(inp, stcb, m, SCTP_SO_NOT_LOCKED); /* * sctp_abort_an_association calls sctp_free_asoc() * free association will NOT free it since we @@ -6669,7 +6575,6 @@ sctp_sendall_iterator(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr, abort_anyway: atomic_add_int(&stcb->asoc.refcnt, 1); sctp_abort_an_association(stcb->sctp_ep, stcb, - SCTP_RESPONSE_TO_USER_REQ, NULL, SCTP_SO_NOT_LOCKED); atomic_add_int(&stcb->asoc.refcnt, -1); goto no_chunk_output; @@ -8135,7 +8040,9 @@ again_one_more_time: no_fragmentflg, 0, asconf, inp->sctp_lport, stcb->rport, htonl(stcb->asoc.peer_vtag), - net->port, so_locked, NULL, NULL))) { + net->port, NULL, + 0, 0, + so_locked))) { if (error == ENOBUFS) { asoc->ifp_had_enobuf = 1; SCTP_STAT_INCR(sctps_lowlevelerr); @@ -8407,7 +8314,9 @@ again_one_more_time: no_fragmentflg, 0, asconf, inp->sctp_lport, stcb->rport, htonl(stcb->asoc.peer_vtag), - net->port, so_locked, NULL, NULL))) { + net->port, NULL, + 0, 0, + so_locked))) { if (error == ENOBUFS) { asoc->ifp_had_enobuf = 1; SCTP_STAT_INCR(sctps_lowlevelerr); @@ -8746,7 +8655,9 @@ no_data_fill: asconf, inp->sctp_lport, stcb->rport, htonl(stcb->asoc.peer_vtag), - net->port, so_locked, NULL, NULL))) { + net->port, NULL, + 0, 0, + so_locked))) { /* error, we could not output */ if (error == ENOBUFS) { SCTP_STAT_INCR(sctps_lowlevelerr); @@ -9448,7 +9359,9 @@ sctp_chunk_retransmission(struct sctp_inpcb *inp, auth_offset, auth, stcb->asoc.authinfo.active_keyid, no_fragmentflg, 0, 0, inp->sctp_lport, stcb->rport, htonl(stcb->asoc.peer_vtag), - chk->whoTo->port, so_locked, NULL, NULL))) { + chk->whoTo->port, NULL, + 0, 0, + so_locked))) { SCTP_STAT_INCR(sctps_lowlevelerr); return (error); } @@ -9493,7 +9406,7 @@ sctp_chunk_retransmission(struct sctp_inpcb *inp, continue; } if (chk->data == NULL) { - printf("TSN:%x chk->snd_count:%d chk->sent:%d can't retran - no data\n", + SCTP_PRINTF("TSN:%x chk->snd_count:%d chk->sent:%d can't retran - no data\n", chk->rec.data.TSN_seq, chk->snd_count, chk->sent); continue; } @@ -9504,7 +9417,7 @@ sctp_chunk_retransmission(struct sctp_inpcb *inp, chk->snd_count, SCTP_BASE_SYSCTL(sctp_max_retran_chunk)); atomic_add_int(&stcb->asoc.refcnt, 1); - sctp_abort_an_association(stcb->sctp_ep, stcb, 0, NULL, so_locked); + sctp_abort_an_association(stcb->sctp_ep, stcb, NULL, so_locked); SCTP_TCB_LOCK(stcb); atomic_subtract_int(&stcb->asoc.refcnt, 1); return (SCTP_RETRAN_EXIT); @@ -9713,7 +9626,9 @@ one_chunk_around: auth_offset, auth, auth_keyid, no_fragmentflg, 0, 0, inp->sctp_lport, stcb->rport, htonl(stcb->asoc.peer_vtag), - net->port, so_locked, NULL, NULL))) { + net->port, NULL, + 0, 0, + so_locked))) { /* error, we could not output */ SCTP_STAT_INCR(sctps_lowlevelerr); return (error); @@ -10831,7 +10746,9 @@ sctp_send_abort_tcb(struct sctp_tcb *stcb, struct mbuf *operr, int so_locked (struct sockaddr *)&net->ro._l_addr, m_out, auth_offset, auth, stcb->asoc.authinfo.active_keyid, 1, 0, 0, stcb->sctp_ep->sctp_lport, stcb->rport, htonl(stcb->asoc.peer_vtag), - stcb->asoc.primary_destination->port, so_locked, NULL, NULL); + stcb->asoc.primary_destination->port, NULL, + 0, 0, + so_locked); SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); } @@ -10868,183 +10785,213 @@ sctp_send_shutdown_complete(struct sctp_tcb *stcb, m_shutdown_comp, 0, NULL, 0, 1, 0, 0, stcb->sctp_ep->sctp_lport, stcb->rport, htonl(vtag), - net->port, SCTP_SO_NOT_LOCKED, NULL, NULL); + net->port, NULL, + 0, 0, + SCTP_SO_NOT_LOCKED); SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); return; } -void -sctp_send_shutdown_complete2(struct mbuf *m, struct sctphdr *sh, +static void +sctp_send_resp_msg(struct sockaddr *src, struct sockaddr *dst, + struct sctphdr *sh, uint32_t vtag, + uint8_t type, struct mbuf *cause, + uint8_t use_mflowid, uint32_t mflowid, uint32_t vrf_id, uint16_t port) { - /* formulate and SEND a SHUTDOWN-COMPLETE */ struct mbuf *o_pak; struct mbuf *mout; - struct ip *iph; - struct udphdr *udp = NULL; - int offset_out, len, mlen; - struct sctp_shutdown_complete_msg *comp_cp; + struct sctphdr *shout; + struct sctp_chunkhdr *ch; + struct udphdr *udp; + int len, cause_len, padding_len, ret; #ifdef INET - struct ip *iph_out; + struct sockaddr_in *src_sin, *dst_sin; + struct ip *ip; #endif #ifdef INET6 - struct ip6_hdr *ip6, *ip6_out; + struct sockaddr_in6 *src_sin6, *dst_sin6; + struct ip6_hdr *ip6; #endif - iph = mtod(m, struct ip *); - switch (iph->ip_v) { + /* Compute the length of the cause and add final padding. */ + cause_len = 0; + if (cause != NULL) { + struct mbuf *m_at, *m_last = NULL; + + for (m_at = cause; m_at; m_at = SCTP_BUF_NEXT(m_at)) { + if (SCTP_BUF_NEXT(m_at) == NULL) + m_last = m_at; + cause_len += SCTP_BUF_LEN(m_at); + } + padding_len = cause_len % 4; + if (padding_len != 0) { + padding_len = 4 - padding_len; + } + if (padding_len != 0) { + if (sctp_add_pad_tombuf(m_last, padding_len)) { + sctp_m_freem(cause); + return; + } + } + } else { + padding_len = 0; + } + /* Get an mbuf for the header. */ + len = sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr); + switch (dst->sa_family) { #ifdef INET - case IPVERSION: - len = (sizeof(struct ip) + sizeof(struct sctp_shutdown_complete_msg)); + case AF_INET: + len += sizeof(struct ip); break; #endif #ifdef INET6 - case IPV6_VERSION >> 4: - len = (sizeof(struct ip6_hdr) + sizeof(struct sctp_shutdown_complete_msg)); + case AF_INET6: + len += sizeof(struct ip6_hdr); break; #endif default: - return; + break; } if (port) { len += sizeof(struct udphdr); } mout = sctp_get_mbuf_for_msg(len + max_linkhdr, 1, M_DONTWAIT, 1, MT_DATA); if (mout == NULL) { + if (cause) { + sctp_m_freem(cause); + } return; } SCTP_BUF_RESV_UF(mout, max_linkhdr); SCTP_BUF_LEN(mout) = len; - SCTP_BUF_NEXT(mout) = NULL; - if (m->m_flags & M_FLOWID) { - mout->m_pkthdr.flowid = m->m_pkthdr.flowid; + SCTP_BUF_NEXT(mout) = cause; + if (use_mflowid != 0) { + mout->m_pkthdr.flowid = mflowid; mout->m_flags |= M_FLOWID; } #ifdef INET - iph_out = NULL; + ip = NULL; #endif #ifdef INET6 - ip6_out = NULL; + ip6 = NULL; #endif - offset_out = 0; - - switch (iph->ip_v) { + switch (dst->sa_family) { #ifdef INET - case IPVERSION: - iph_out = mtod(mout, struct ip *); - - /* Fill in the IP header for the ABORT */ - iph_out->ip_v = IPVERSION; - iph_out->ip_hl = (sizeof(struct ip) / 4); - iph_out->ip_tos = (u_char)0; - iph_out->ip_id = 0; - iph_out->ip_off = 0; - iph_out->ip_ttl = MAXTTL; + case AF_INET: + src_sin = (struct sockaddr_in *)src; + dst_sin = (struct sockaddr_in *)dst; + ip = mtod(mout, struct ip *); + ip->ip_v = IPVERSION; + ip->ip_hl = (sizeof(struct ip) >> 2); + ip->ip_tos = 0; + ip->ip_id = ip_newid(); + ip->ip_off = 0; + ip->ip_ttl = MODULE_GLOBAL(ip_defttl); if (port) { - iph_out->ip_p = IPPROTO_UDP; + ip->ip_p = IPPROTO_UDP; } else { - iph_out->ip_p = IPPROTO_SCTP; + ip->ip_p = IPPROTO_SCTP; } - iph_out->ip_src.s_addr = iph->ip_dst.s_addr; - iph_out->ip_dst.s_addr = iph->ip_src.s_addr; - - /* let IP layer calculate this */ - iph_out->ip_sum = 0; - offset_out += sizeof(*iph_out); - comp_cp = (struct sctp_shutdown_complete_msg *)( - (caddr_t)iph_out + offset_out); + ip->ip_src.s_addr = dst_sin->sin_addr.s_addr; + ip->ip_dst.s_addr = src_sin->sin_addr.s_addr; + ip->ip_sum = 0; + len = sizeof(struct ip); + shout = (struct sctphdr *)((caddr_t)ip + len); break; #endif #ifdef INET6 - case IPV6_VERSION >> 4: - ip6 = (struct ip6_hdr *)iph; - ip6_out = mtod(mout, struct ip6_hdr *); - - /* Fill in the IPv6 header for the ABORT */ - ip6_out->ip6_flow = ip6->ip6_flow; - ip6_out->ip6_hlim = MODULE_GLOBAL(ip6_defhlim); - if (port) { - ip6_out->ip6_nxt = IPPROTO_UDP; - } else { - ip6_out->ip6_nxt = IPPROTO_SCTP; + case AF_INET6: + src_sin6 = (struct sockaddr_in6 *)src; + dst_sin6 = (struct sockaddr_in6 *)dst; + ip6 = mtod(mout, struct ip6_hdr *); + ip6->ip6_flow = htonl(0x60000000); + if (V_ip6_auto_flowlabel) { + ip6->ip6_flow |= (htonl(ip6_randomflowlabel()) & IPV6_FLOWLABEL_MASK); } - ip6_out->ip6_src = ip6->ip6_dst; - ip6_out->ip6_dst = ip6->ip6_src; - /* - * ?? The old code had both the iph len + payload, I think - * this is wrong and would never have worked - */ - ip6_out->ip6_plen = sizeof(struct sctp_shutdown_complete_msg); - offset_out += sizeof(*ip6_out); - comp_cp = (struct sctp_shutdown_complete_msg *)( - (caddr_t)ip6_out + offset_out); + ip6->ip6_hlim = MODULE_GLOBAL(ip6_defhlim); + if (port) { + ip6->ip6_nxt = IPPROTO_UDP; + } else { + ip6->ip6_nxt = IPPROTO_SCTP; + } + ip6->ip6_src = dst_sin6->sin6_addr; + ip6->ip6_dst = src_sin6->sin6_addr; + len = sizeof(struct ip6_hdr); + shout = (struct sctphdr *)((caddr_t)ip6 + len); break; -#endif /* INET6 */ +#endif default: - /* Currently not supported. */ - sctp_m_freem(mout); - return; + len = 0; + shout = mtod(mout, struct sctphdr *); + break; } if (port) { if (htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)) == 0) { sctp_m_freem(mout); return; } - udp = (struct udphdr *)comp_cp; + udp = (struct udphdr *)shout; udp->uh_sport = htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)); udp->uh_dport = port; - udp->uh_ulen = htons(sizeof(struct sctp_shutdown_complete_msg) + sizeof(struct udphdr)); + udp->uh_sum = 0; + udp->uh_ulen = htons(sizeof(struct udphdr) + + sizeof(struct sctphdr) + + sizeof(struct sctp_chunkhdr) + + cause_len + padding_len); + len += sizeof(struct udphdr); + shout = (struct sctphdr *)((caddr_t)shout + sizeof(struct udphdr)); + } else { + udp = NULL; + } + shout->src_port = sh->dest_port; + shout->dest_port = sh->src_port; + shout->checksum = 0; + if (vtag) { + shout->v_tag = htonl(vtag); + } else { + shout->v_tag = sh->v_tag; + } + len += sizeof(struct sctphdr); + ch = (struct sctp_chunkhdr *)((caddr_t)shout + sizeof(struct sctphdr)); + ch->chunk_type = type; + if (vtag) { + ch->chunk_flags = 0; + } else { + ch->chunk_flags = SCTP_HAD_NO_TCB; + } + ch->chunk_length = htons(sizeof(struct sctp_chunkhdr) + cause_len); + len += sizeof(struct sctp_chunkhdr); + len += cause_len + padding_len; + + if (SCTP_GET_HEADER_FOR_OUTPUT(o_pak)) { + sctp_m_freem(mout); + return; + } + SCTP_ATTACH_CHAIN(o_pak, mout, len); + switch (dst->sa_family) { #ifdef INET - if (iph_out) { + case AF_INET: + if (port) { if (V_udp_cksum) { - udp->uh_sum = in_pseudo(iph_out->ip_src.s_addr, iph_out->ip_dst.s_addr, udp->uh_ulen + htons(IPPROTO_UDP)); + udp->uh_sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr, udp->uh_ulen + htons(IPPROTO_UDP)); } else { udp->uh_sum = 0; } } -#endif - offset_out += sizeof(struct udphdr); - comp_cp = (struct sctp_shutdown_complete_msg *)((caddr_t)comp_cp + sizeof(struct udphdr)); - } - if (SCTP_GET_HEADER_FOR_OUTPUT(o_pak)) { - /* no mbuf's */ - sctp_m_freem(mout); - return; - } - /* Now copy in and fill in the ABORT tags etc. */ - comp_cp->sh.src_port = sh->dest_port; - comp_cp->sh.dest_port = sh->src_port; - comp_cp->sh.checksum = 0; - comp_cp->sh.v_tag = sh->v_tag; - comp_cp->shut_cmp.ch.chunk_flags = SCTP_HAD_NO_TCB; - comp_cp->shut_cmp.ch.chunk_type = SCTP_SHUTDOWN_COMPLETE; - comp_cp->shut_cmp.ch.chunk_length = htons(sizeof(struct sctp_shutdown_complete_chunk)); - -#ifdef INET - if (iph_out != NULL) { - sctp_route_t ro; - int ret; - - mlen = SCTP_BUF_LEN(mout); - bzero(&ro, sizeof ro); - /* set IPv4 length */ - iph_out->ip_len = mlen; -#ifdef SCTP_PACKET_LOGGING - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) - sctp_packet_log(mout, mlen); -#endif + ip->ip_len = len; if (port) { #if defined(SCTP_WITH_NO_CSUM) SCTP_STAT_INCR(sctps_sendnocrc); #else - comp_cp->sh.checksum = sctp_calculate_cksum(mout, offset_out); + shout->checksum = sctp_calculate_cksum(mout, sizeof(struct ip) + sizeof(struct udphdr)); SCTP_STAT_INCR(sctps_sendswcrc); #endif if (V_udp_cksum) { - SCTP_ENABLE_UDP_CSUM(mout); + SCTP_ENABLE_UDP_CSUM(o_pak); } } else { #if defined(SCTP_WITH_NO_CSUM) @@ -11055,59 +11002,66 @@ sctp_send_shutdown_complete2(struct mbuf *m, struct sctphdr *sh, SCTP_STAT_INCR(sctps_sendhwcrc); #endif } - SCTP_ATTACH_CHAIN(o_pak, mout, mlen); - /* out it goes */ - SCTP_IP_OUTPUT(ret, o_pak, &ro, NULL, vrf_id); - - /* Free the route if we got one back */ - if (ro.ro_rt) - RTFREE(ro.ro_rt); - } +#ifdef SCTP_PACKET_LOGGING + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) { + sctp_packet_log(o_pak); + } +#endif + SCTP_IP_OUTPUT(ret, o_pak, NULL, NULL, vrf_id); + break; #endif #ifdef INET6 - if (ip6_out != NULL) { - struct route_in6 ro; - int ret; - struct ifnet *ifp = NULL; - - bzero(&ro, sizeof(ro)); - mlen = SCTP_BUF_LEN(mout); -#ifdef SCTP_PACKET_LOGGING - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) - sctp_packet_log(mout, mlen); -#endif - SCTP_ATTACH_CHAIN(o_pak, mout, mlen); + case AF_INET6: + ip6->ip6_plen = len - sizeof(struct ip6_hdr); if (port) { #if defined(SCTP_WITH_NO_CSUM) SCTP_STAT_INCR(sctps_sendnocrc); #else - comp_cp->sh.checksum = sctp_calculate_cksum(mout, sizeof(struct ip6_hdr) + sizeof(struct udphdr)); + shout->checksum = sctp_calculate_cksum(mout, sizeof(struct ip6_hdr) + sizeof(struct udphdr)); SCTP_STAT_INCR(sctps_sendswcrc); #endif - if ((udp->uh_sum = in6_cksum(o_pak, IPPROTO_UDP, sizeof(struct ip6_hdr), mlen - sizeof(struct ip6_hdr))) == 0) { + if ((udp->uh_sum = in6_cksum(o_pak, IPPROTO_UDP, sizeof(struct ip6_hdr), len - sizeof(struct ip6_hdr))) == 0) { udp->uh_sum = 0xffff; } } else { #if defined(SCTP_WITH_NO_CSUM) SCTP_STAT_INCR(sctps_sendnocrc); #else - mout->m_pkthdr.csum_flags = CSUM_SCTP; + mout->m_pkthdr.csum_flags = CSUM_SCTP_IPV6; mout->m_pkthdr.csum_data = 0; SCTP_STAT_INCR(sctps_sendhwcrc); #endif } - SCTP_IP6_OUTPUT(ret, o_pak, &ro, &ifp, NULL, vrf_id); - - /* Free the route if we got one back */ - if (ro.ro_rt) - RTFREE(ro.ro_rt); - } +#ifdef SCTP_PACKET_LOGGING + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) { + sctp_packet_log(o_pak); + } #endif + SCTP_IP6_OUTPUT(ret, o_pak, NULL, NULL, NULL, vrf_id); + break; +#endif + default: + SCTPDBG(SCTP_DEBUG_OUTPUT1, "Unknown protocol (TSNH) type %d\n", + dst->sa_family); + sctp_m_freem(mout); + SCTP_LTRACE_ERR_RET_PKT(mout, NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EFAULT); + return; + } SCTP_STAT_INCR(sctps_sendpackets); SCTP_STAT_INCR_COUNTER64(sctps_outpackets); SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); return; +} +void +sctp_send_shutdown_complete2(struct sockaddr *src, struct sockaddr *dst, + struct sctphdr *sh, + uint8_t use_mflowid, uint32_t mflowid, + uint32_t vrf_id, uint16_t port) +{ + sctp_send_resp_msg(src, dst, sh, 0, SCTP_SHUTDOWN_COMPLETE, NULL, + use_mflowid, mflowid, + vrf_id, port); } void @@ -11278,21 +11232,14 @@ sctp_send_ecn_echo(struct sctp_tcb *stcb, struct sctp_nets *net, void sctp_send_packet_dropped(struct sctp_tcb *stcb, struct sctp_nets *net, - struct mbuf *m, int iphlen, int bad_crc) + struct mbuf *m, int len, int iphlen, int bad_crc) { struct sctp_association *asoc; struct sctp_pktdrop_chunk *drp; struct sctp_tmit_chunk *chk; uint8_t *datap; - int len; int was_trunc = 0; - struct ip *iph; - -#ifdef INET6 - struct ip6_hdr *ip6h; - -#endif - int fullsz = 0, extra = 0; + int fullsz = 0; long spc; int offset; struct sctp_chunkhdr *ch, chunk_buf; @@ -11317,28 +11264,8 @@ sctp_send_packet_dropped(struct sctp_tcb *stcb, struct sctp_nets *net, return; } chk->copy_by_ref = 0; - iph = mtod(m, struct ip *); - if (iph == NULL) { - sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED); - return; - } - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - /* IPv4 */ - len = chk->send_size = iph->ip_len; - break; -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - /* IPv6 */ - ip6h = mtod(m, struct ip6_hdr *); - len = chk->send_size = htons(ip6h->ip6_plen); - break; -#endif - default: - return; - } + len -= iphlen; + chk->send_size = len; /* Validate that we do not have an ABORT in here. */ offset = iphlen + sizeof(struct sctphdr); ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset, @@ -11374,7 +11301,7 @@ sctp_send_packet_dropped(struct sctp_tcb *stcb, struct sctp_nets *net, /* * only send 1 mtu worth, trim off the excess on the end. */ - fullsz = len - extra; + fullsz = len; len = min(stcb->asoc.smallest_mtu, MCLBYTES) - SCTP_MAX_OVERHEAD; was_trunc = 1; } @@ -11938,545 +11865,33 @@ skip_stuff: } void -sctp_send_abort(struct mbuf *m, int iphlen, struct sctphdr *sh, uint32_t vtag, - struct mbuf *err_cause, uint32_t vrf_id, uint16_t port) +sctp_send_abort(struct mbuf *m, int iphlen, struct sockaddr *src, struct sockaddr *dst, + struct sctphdr *sh, uint32_t vtag, struct mbuf *cause, + uint8_t use_mflowid, uint32_t mflowid, + uint32_t vrf_id, uint16_t port) { - /*- - * Formulate the abort message, and send it back down. - */ - struct mbuf *o_pak; - struct mbuf *mout; - struct sctp_abort_msg *abm; - struct ip *iph; - struct udphdr *udp; - int iphlen_out, len; - -#ifdef INET - struct ip *iph_out; - -#endif -#ifdef INET6 - struct ip6_hdr *ip6, *ip6_out; - -#endif - - /* don't respond to ABORT with ABORT */ + /* Don't respond to an ABORT with an ABORT. */ if (sctp_is_there_an_abort_here(m, iphlen, &vtag)) { - if (err_cause) - sctp_m_freem(err_cause); + if (cause) + sctp_m_freem(cause); return; } - iph = mtod(m, struct ip *); - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - len = (sizeof(struct ip) + sizeof(struct sctp_abort_msg)); - break; -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - len = (sizeof(struct ip6_hdr) + sizeof(struct sctp_abort_msg)); - break; -#endif - default: - if (err_cause) { - sctp_m_freem(err_cause); - } - return; - } - if (port) { - len += sizeof(struct udphdr); - } - mout = sctp_get_mbuf_for_msg(len + max_linkhdr, 1, M_DONTWAIT, 1, MT_DATA); - if (mout == NULL) { - if (err_cause) { - sctp_m_freem(err_cause); - } - return; - } - SCTP_BUF_RESV_UF(mout, max_linkhdr); - SCTP_BUF_LEN(mout) = len; - SCTP_BUF_NEXT(mout) = err_cause; - if (m->m_flags & M_FLOWID) { - mout->m_pkthdr.flowid = m->m_pkthdr.flowid; - mout->m_flags |= M_FLOWID; - } -#ifdef INET - iph_out = NULL; -#endif -#ifdef INET6 - ip6_out = NULL; -#endif - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - iph_out = mtod(mout, struct ip *); - - /* Fill in the IP header for the ABORT */ - iph_out->ip_v = IPVERSION; - iph_out->ip_hl = (sizeof(struct ip) / 4); - iph_out->ip_tos = (u_char)0; - iph_out->ip_id = 0; - iph_out->ip_off = 0; - iph_out->ip_ttl = MAXTTL; - if (port) { - iph_out->ip_p = IPPROTO_UDP; - } else { - iph_out->ip_p = IPPROTO_SCTP; - } - iph_out->ip_src.s_addr = iph->ip_dst.s_addr; - iph_out->ip_dst.s_addr = iph->ip_src.s_addr; - /* let IP layer calculate this */ - iph_out->ip_sum = 0; - - iphlen_out = sizeof(*iph_out); - abm = (struct sctp_abort_msg *)((caddr_t)iph_out + iphlen_out); - break; -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - ip6 = (struct ip6_hdr *)iph; - ip6_out = mtod(mout, struct ip6_hdr *); - - /* Fill in the IP6 header for the ABORT */ - ip6_out->ip6_flow = ip6->ip6_flow; - ip6_out->ip6_hlim = MODULE_GLOBAL(ip6_defhlim); - if (port) { - ip6_out->ip6_nxt = IPPROTO_UDP; - } else { - ip6_out->ip6_nxt = IPPROTO_SCTP; - } - ip6_out->ip6_src = ip6->ip6_dst; - ip6_out->ip6_dst = ip6->ip6_src; - - iphlen_out = sizeof(*ip6_out); - abm = (struct sctp_abort_msg *)((caddr_t)ip6_out + iphlen_out); - break; -#endif /* INET6 */ - default: - /* Currently not supported */ - sctp_m_freem(mout); - return; - } - - udp = (struct udphdr *)abm; - if (port) { - if (htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)) == 0) { - sctp_m_freem(mout); - return; - } - udp->uh_sport = htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)); - udp->uh_dport = port; - /* set udp->uh_ulen later */ - udp->uh_sum = 0; - iphlen_out += sizeof(struct udphdr); - abm = (struct sctp_abort_msg *)((caddr_t)abm + sizeof(struct udphdr)); - } - abm->sh.src_port = sh->dest_port; - abm->sh.dest_port = sh->src_port; - abm->sh.checksum = 0; - if (vtag == 0) { - abm->sh.v_tag = sh->v_tag; - abm->msg.ch.chunk_flags = SCTP_HAD_NO_TCB; - } else { - abm->sh.v_tag = htonl(vtag); - abm->msg.ch.chunk_flags = 0; - } - abm->msg.ch.chunk_type = SCTP_ABORT_ASSOCIATION; - - if (err_cause) { - struct mbuf *m_tmp = err_cause; - int err_len = 0; - - /* get length of the err_cause chain */ - while (m_tmp != NULL) { - err_len += SCTP_BUF_LEN(m_tmp); - m_tmp = SCTP_BUF_NEXT(m_tmp); - } - len = SCTP_BUF_LEN(mout) + err_len; - if (err_len % 4) { - /* need pad at end of chunk */ - uint32_t cpthis = 0; - int padlen; - - padlen = 4 - (len % 4); - m_copyback(mout, len, padlen, (caddr_t)&cpthis); - len += padlen; - } - abm->msg.ch.chunk_length = htons(sizeof(abm->msg.ch) + err_len); - } else { - len = SCTP_BUF_LEN(mout); - abm->msg.ch.chunk_length = htons(sizeof(abm->msg.ch)); - } - - if (SCTP_GET_HEADER_FOR_OUTPUT(o_pak)) { - /* no mbuf's */ - sctp_m_freem(mout); - return; - } -#ifdef INET - if (iph_out != NULL) { - sctp_route_t ro; - int ret; - - /* zap the stack pointer to the route */ - bzero(&ro, sizeof ro); - if (port) { - udp->uh_ulen = htons(len - sizeof(struct ip)); - if (V_udp_cksum) { - udp->uh_sum = in_pseudo(iph_out->ip_src.s_addr, iph_out->ip_dst.s_addr, udp->uh_ulen + htons(IPPROTO_UDP)); - } else { - udp->uh_sum = 0; - } - } - SCTPDBG(SCTP_DEBUG_OUTPUT2, "sctp_send_abort calling ip_output:\n"); - SCTPDBG_PKT(SCTP_DEBUG_OUTPUT2, iph_out, &abm->sh); - /* set IPv4 length */ - iph_out->ip_len = len; - /* out it goes */ -#ifdef SCTP_PACKET_LOGGING - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) - sctp_packet_log(mout, len); -#endif - SCTP_ATTACH_CHAIN(o_pak, mout, len); - if (port) { -#if defined(SCTP_WITH_NO_CSUM) - SCTP_STAT_INCR(sctps_sendnocrc); -#else - abm->sh.checksum = sctp_calculate_cksum(mout, iphlen_out); - SCTP_STAT_INCR(sctps_sendswcrc); -#endif - if (V_udp_cksum) { - SCTP_ENABLE_UDP_CSUM(o_pak); - } - } else { -#if defined(SCTP_WITH_NO_CSUM) - SCTP_STAT_INCR(sctps_sendnocrc); -#else - mout->m_pkthdr.csum_flags = CSUM_SCTP; - mout->m_pkthdr.csum_data = 0; - SCTP_STAT_INCR(sctps_sendhwcrc); -#endif - } - SCTP_IP_OUTPUT(ret, o_pak, &ro, NULL, vrf_id); - - /* Free the route if we got one back */ - if (ro.ro_rt) - RTFREE(ro.ro_rt); - } -#endif -#ifdef INET6 - if (ip6_out != NULL) { - struct route_in6 ro; - int ret; - struct ifnet *ifp = NULL; - - /* zap the stack pointer to the route */ - bzero(&ro, sizeof(ro)); - if (port) { - udp->uh_ulen = htons(len - sizeof(struct ip6_hdr)); - } - SCTPDBG(SCTP_DEBUG_OUTPUT2, "sctp_send_abort calling ip6_output:\n"); - SCTPDBG_PKT(SCTP_DEBUG_OUTPUT2, (struct ip *)ip6_out, &abm->sh); - ip6_out->ip6_plen = len - sizeof(*ip6_out); -#ifdef SCTP_PACKET_LOGGING - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) - sctp_packet_log(mout, len); -#endif - SCTP_ATTACH_CHAIN(o_pak, mout, len); - if (port) { -#if defined(SCTP_WITH_NO_CSUM) - SCTP_STAT_INCR(sctps_sendnocrc); -#else - abm->sh.checksum = sctp_calculate_cksum(mout, sizeof(struct ip6_hdr) + sizeof(struct udphdr)); - SCTP_STAT_INCR(sctps_sendswcrc); -#endif - if ((udp->uh_sum = in6_cksum(o_pak, IPPROTO_UDP, sizeof(struct ip6_hdr), len - sizeof(struct ip6_hdr))) == 0) { - udp->uh_sum = 0xffff; - } - } else { -#if defined(SCTP_WITH_NO_CSUM) - SCTP_STAT_INCR(sctps_sendnocrc); -#else - mout->m_pkthdr.csum_flags = CSUM_SCTP; - mout->m_pkthdr.csum_data = 0; - SCTP_STAT_INCR(sctps_sendhwcrc); -#endif - } - SCTP_IP6_OUTPUT(ret, o_pak, &ro, &ifp, NULL, vrf_id); - - /* Free the route if we got one back */ - if (ro.ro_rt) - RTFREE(ro.ro_rt); - } -#endif - SCTP_STAT_INCR(sctps_sendpackets); - SCTP_STAT_INCR_COUNTER64(sctps_outpackets); - SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); + sctp_send_resp_msg(src, dst, sh, vtag, SCTP_ABORT_ASSOCIATION, cause, + use_mflowid, mflowid, + vrf_id, port); + return; } void -sctp_send_operr_to(struct mbuf *m, int iphlen, struct mbuf *scm, uint32_t vtag, +sctp_send_operr_to(struct sockaddr *src, struct sockaddr *dst, + struct sctphdr *sh, uint32_t vtag, struct mbuf *cause, + uint8_t use_mflowid, uint32_t mflowid, uint32_t vrf_id, uint16_t port) { - struct mbuf *o_pak; - struct sctphdr *sh, *sh_out; - struct sctp_chunkhdr *ch; - struct ip *iph; - struct udphdr *udp = NULL; - struct mbuf *mout; - int iphlen_out, len; - -#ifdef INET - struct ip *iph_out; - -#endif -#ifdef INET6 - struct ip6_hdr *ip6, *ip6_out; - -#endif - - iph = mtod(m, struct ip *); - sh = (struct sctphdr *)((caddr_t)iph + iphlen); - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - len = (sizeof(struct ip) + sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr)); - break; -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - len = (sizeof(struct ip6_hdr) + sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr)); - break; -#endif - default: - if (scm) { - sctp_m_freem(scm); - } - return; - } - if (port) { - len += sizeof(struct udphdr); - } - mout = sctp_get_mbuf_for_msg(len + max_linkhdr, 1, M_DONTWAIT, 1, MT_DATA); - if (mout == NULL) { - if (scm) { - sctp_m_freem(scm); - } - return; - } - SCTP_BUF_RESV_UF(mout, max_linkhdr); - SCTP_BUF_LEN(mout) = len; - SCTP_BUF_NEXT(mout) = scm; - if (m->m_flags & M_FLOWID) { - mout->m_pkthdr.flowid = m->m_pkthdr.flowid; - mout->m_flags |= M_FLOWID; - } -#ifdef INET - iph_out = NULL; -#endif -#ifdef INET6 - ip6_out = NULL; -#endif - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - iph_out = mtod(mout, struct ip *); - - /* Fill in the IP header for the ABORT */ - iph_out->ip_v = IPVERSION; - iph_out->ip_hl = (sizeof(struct ip) / 4); - iph_out->ip_tos = (u_char)0; - iph_out->ip_id = 0; - iph_out->ip_off = 0; - iph_out->ip_ttl = MAXTTL; - if (port) { - iph_out->ip_p = IPPROTO_UDP; - } else { - iph_out->ip_p = IPPROTO_SCTP; - } - iph_out->ip_src.s_addr = iph->ip_dst.s_addr; - iph_out->ip_dst.s_addr = iph->ip_src.s_addr; - /* let IP layer calculate this */ - iph_out->ip_sum = 0; - - iphlen_out = sizeof(struct ip); - sh_out = (struct sctphdr *)((caddr_t)iph_out + iphlen_out); - break; -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - ip6 = (struct ip6_hdr *)iph; - ip6_out = mtod(mout, struct ip6_hdr *); - - /* Fill in the IP6 header for the ABORT */ - ip6_out->ip6_flow = ip6->ip6_flow; - ip6_out->ip6_hlim = MODULE_GLOBAL(ip6_defhlim); - if (port) { - ip6_out->ip6_nxt = IPPROTO_UDP; - } else { - ip6_out->ip6_nxt = IPPROTO_SCTP; - } - ip6_out->ip6_src = ip6->ip6_dst; - ip6_out->ip6_dst = ip6->ip6_src; - - iphlen_out = sizeof(struct ip6_hdr); - sh_out = (struct sctphdr *)((caddr_t)ip6_out + iphlen_out); - break; -#endif /* INET6 */ - default: - /* Currently not supported */ - sctp_m_freem(mout); - return; - } - - udp = (struct udphdr *)sh_out; - if (port) { - if (htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)) == 0) { - sctp_m_freem(mout); - return; - } - udp->uh_sport = htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)); - udp->uh_dport = port; - /* set udp->uh_ulen later */ - udp->uh_sum = 0; - iphlen_out += sizeof(struct udphdr); - sh_out = (struct sctphdr *)((caddr_t)udp + sizeof(struct udphdr)); - } - sh_out->src_port = sh->dest_port; - sh_out->dest_port = sh->src_port; - sh_out->v_tag = vtag; - sh_out->checksum = 0; - - ch = (struct sctp_chunkhdr *)((caddr_t)sh_out + sizeof(struct sctphdr)); - ch->chunk_type = SCTP_OPERATION_ERROR; - ch->chunk_flags = 0; - - if (scm) { - struct mbuf *m_tmp = scm; - int cause_len = 0; - - /* get length of the err_cause chain */ - while (m_tmp != NULL) { - cause_len += SCTP_BUF_LEN(m_tmp); - m_tmp = SCTP_BUF_NEXT(m_tmp); - } - len = SCTP_BUF_LEN(mout) + cause_len; - if (cause_len % 4) { - /* need pad at end of chunk */ - uint32_t cpthis = 0; - int padlen; - - padlen = 4 - (len % 4); - m_copyback(mout, len, padlen, (caddr_t)&cpthis); - len += padlen; - } - ch->chunk_length = htons(sizeof(struct sctp_chunkhdr) + cause_len); - } else { - len = SCTP_BUF_LEN(mout); - ch->chunk_length = htons(sizeof(struct sctp_chunkhdr)); - } - - if (SCTP_GET_HEADER_FOR_OUTPUT(o_pak)) { - /* no mbuf's */ - sctp_m_freem(mout); - return; - } -#ifdef INET - if (iph_out != NULL) { - sctp_route_t ro; - int ret; - - /* zap the stack pointer to the route */ - bzero(&ro, sizeof ro); - if (port) { - udp->uh_ulen = htons(len - sizeof(struct ip)); - if (V_udp_cksum) { - udp->uh_sum = in_pseudo(iph_out->ip_src.s_addr, iph_out->ip_dst.s_addr, udp->uh_ulen + htons(IPPROTO_UDP)); - } else { - udp->uh_sum = 0; - } - } - /* set IPv4 length */ - iph_out->ip_len = len; - /* out it goes */ -#ifdef SCTP_PACKET_LOGGING - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) - sctp_packet_log(mout, len); -#endif - SCTP_ATTACH_CHAIN(o_pak, mout, len); - if (port) { -#if defined(SCTP_WITH_NO_CSUM) - SCTP_STAT_INCR(sctps_sendnocrc); -#else - sh_out->checksum = sctp_calculate_cksum(mout, iphlen_out); - SCTP_STAT_INCR(sctps_sendswcrc); -#endif - if (V_udp_cksum) { - SCTP_ENABLE_UDP_CSUM(o_pak); - } - } else { -#if defined(SCTP_WITH_NO_CSUM) - SCTP_STAT_INCR(sctps_sendnocrc); -#else - mout->m_pkthdr.csum_flags = CSUM_SCTP; - mout->m_pkthdr.csum_data = 0; - SCTP_STAT_INCR(sctps_sendhwcrc); -#endif - } - SCTP_IP_OUTPUT(ret, o_pak, &ro, NULL, vrf_id); - - /* Free the route if we got one back */ - if (ro.ro_rt) - RTFREE(ro.ro_rt); - } -#endif -#ifdef INET6 - if (ip6_out != NULL) { - struct route_in6 ro; - int ret; - struct ifnet *ifp = NULL; - - /* zap the stack pointer to the route */ - bzero(&ro, sizeof(ro)); - if (port) { - udp->uh_ulen = htons(len - sizeof(struct ip6_hdr)); - } - ip6_out->ip6_plen = len - sizeof(*ip6_out); -#ifdef SCTP_PACKET_LOGGING - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) - sctp_packet_log(mout, len); -#endif - SCTP_ATTACH_CHAIN(o_pak, mout, len); - if (port) { -#if defined(SCTP_WITH_NO_CSUM) - SCTP_STAT_INCR(sctps_sendnocrc); -#else - sh_out->checksum = sctp_calculate_cksum(mout, sizeof(struct ip6_hdr) + sizeof(struct udphdr)); - SCTP_STAT_INCR(sctps_sendswcrc); -#endif - if ((udp->uh_sum = in6_cksum(o_pak, IPPROTO_UDP, sizeof(struct ip6_hdr), len - sizeof(struct ip6_hdr))) == 0) { - udp->uh_sum = 0xffff; - } - } else { -#if defined(SCTP_WITH_NO_CSUM) - SCTP_STAT_INCR(sctps_sendnocrc); -#else - mout->m_pkthdr.csum_flags = CSUM_SCTP; - mout->m_pkthdr.csum_data = 0; - SCTP_STAT_INCR(sctps_sendhwcrc); -#endif - } - SCTP_IP6_OUTPUT(ret, o_pak, &ro, &ifp, NULL, vrf_id); - - /* Free the route if we got one back */ - if (ro.ro_rt) - RTFREE(ro.ro_rt); - } -#endif - SCTP_STAT_INCR(sctps_sendpackets); - SCTP_STAT_INCR_COUNTER64(sctps_outpackets); - SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); + sctp_send_resp_msg(src, dst, sh, vtag, SCTP_OPERATION_ERROR, cause, + use_mflowid, mflowid, + vrf_id, port); + return; } static struct mbuf * @@ -13138,9 +12553,7 @@ sctp_lower_sosend(struct socket *so, atomic_add_int(&stcb->asoc.refcnt, -1); free_cnt_applied = 0; /* release this lock, otherwise we hang on ourselves */ - sctp_abort_an_association(stcb->sctp_ep, stcb, - SCTP_RESPONSE_TO_USER_REQ, - mm, SCTP_SO_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, mm, SCTP_SO_LOCKED); /* now relock the stcb so everything is sane */ hold_tcblock = 0; stcb = NULL; @@ -13617,8 +13030,7 @@ skip_preblock: dataless_eof: /* EOF thing ? */ if ((srcv->sinfo_flags & SCTP_EOF) && - (got_all_of_the_send == 1) && - (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE)) { + (got_all_of_the_send == 1)) { int cnt; SCTP_STAT_INCR(sctps_sends_with_eof); @@ -13695,7 +13107,6 @@ dataless_eof: free_cnt_applied = 0; } sctp_abort_an_association(stcb->sctp_ep, stcb, - SCTP_RESPONSE_TO_USER_REQ, NULL, SCTP_SO_LOCKED); /* * now relock the stcb so everything @@ -13840,7 +13251,7 @@ out_unlocked: if (inp) { sctp_validate_no_locks(inp); } else { - printf("Warning - inp is NULL so cant validate locks\n"); + SCTP_PRINTF("Warning - inp is NULL so cant validate locks\n"); } #endif if (top) { diff --git a/sys/netinet/sctp_output.h b/sys/netinet/sctp_output.h index ba30947f475..b91d476cc9f 100644 --- a/sys/netinet/sctp_output.h +++ b/sys/netinet/sctp_output.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,13 +30,11 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_output.h,v 1.14 2005/03/06 16:04:18 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_output_h__ -#define __sctp_output_h__ +#ifndef _NETINET_SCTP_OUTPUT_H_ +#define _NETINET_SCTP_OUTPUT_H_ #include @@ -85,8 +83,11 @@ sctp_send_initiate(struct sctp_inpcb *, struct sctp_tcb *, int ); void -sctp_send_initiate_ack(struct sctp_inpcb *, struct sctp_tcb *, - struct mbuf *, int, int, struct sctphdr *, struct sctp_init_chunk *, +sctp_send_initiate_ack(struct sctp_inpcb *, struct sctp_tcb *, struct mbuf *, + int, int, + struct sockaddr *, struct sockaddr *, + struct sctphdr *, struct sctp_init_chunk *, + uint8_t, uint32_t, uint32_t, uint16_t, int); struct mbuf * @@ -117,7 +118,9 @@ void sctp_send_shutdown_ack(struct sctp_tcb *, struct sctp_nets *); void sctp_send_shutdown_complete(struct sctp_tcb *, struct sctp_nets *, int); void -sctp_send_shutdown_complete2(struct mbuf *, struct sctphdr *, +sctp_send_shutdown_complete2(struct sockaddr *, struct sockaddr *, + struct sctphdr *, + uint8_t, uint32_t, uint32_t, uint16_t); void sctp_send_asconf(struct sctp_tcb *, struct sctp_nets *, int addr_locked); @@ -162,7 +165,7 @@ void sctp_send_ecn_echo(struct sctp_tcb *, struct sctp_nets *, uint32_t); void sctp_send_packet_dropped(struct sctp_tcb *, struct sctp_nets *, struct mbuf *, - int, int); + int, int, int); @@ -203,14 +206,20 @@ sctp_send_str_reset_req(struct sctp_tcb *stcb, uint16_t adding_i, uint8_t from_peer); void -sctp_send_abort(struct mbuf *, int, struct sctphdr *, uint32_t, - struct mbuf *, uint32_t, uint16_t); +sctp_send_abort(struct mbuf *, int, struct sockaddr *, struct sockaddr *, + struct sctphdr *, uint32_t, struct mbuf *, + uint8_t, uint32_t, + uint32_t, uint16_t); -void sctp_send_operr_to(struct mbuf *, int, struct mbuf *, uint32_t, uint32_t, uint16_t); +void +sctp_send_operr_to(struct sockaddr *, struct sockaddr *, + struct sctphdr *, uint32_t, struct mbuf *, + uint8_t, uint32_t, + uint32_t, uint16_t); #endif /* _KERNEL || __Userspace__ */ -#if defined(_KERNEL) || defined (__Userspace__) +#if defined(_KERNEL) || defined(__Userspace__) int sctp_sosend(struct socket *so, struct sockaddr *addr, diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c index f81d638e1ae..e9d99ed69d1 100644 --- a/sys/netinet/sctp_pcb.c +++ b/sys/netinet/sctp_pcb.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,8 +30,6 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_pcb.c,v 1.38 2005/03/06 16:04:18 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); @@ -1893,7 +1891,7 @@ sctp_pcb_findep(struct sockaddr *nam, int find_tcp_pool, int have_lock, * need to change the *to to some other struct like a mbuf... */ struct sctp_tcb * -sctp_findassociation_addr_sa(struct sockaddr *to, struct sockaddr *from, +sctp_findassociation_addr_sa(struct sockaddr *from, struct sockaddr *to, struct sctp_inpcb **inp_p, struct sctp_nets **netp, int find_tcp_pool, uint32_t vrf_id) { @@ -1948,7 +1946,7 @@ sctp_findassociation_addr_sa(struct sockaddr *to, struct sockaddr *from, static struct sctp_tcb * sctp_findassociation_special_addr(struct mbuf *m, int offset, struct sctphdr *sh, struct sctp_inpcb **inp_p, struct sctp_nets **netp, - struct sockaddr *dest) + struct sockaddr *dst) { struct sctp_paramhdr *phdr, parm_buf; struct sctp_tcb *retval; @@ -2002,7 +2000,7 @@ sctp_findassociation_special_addr(struct mbuf *m, int offset, memcpy(&sin4.sin_addr, &p4->addr, sizeof(p4->addr)); /* look it up */ retval = sctp_findassociation_ep_addr(inp_p, - (struct sockaddr *)&sin4, netp, dest, NULL); + (struct sockaddr *)&sin4, netp, dst, NULL); if (retval != NULL) { return (retval); } @@ -2023,7 +2021,7 @@ sctp_findassociation_special_addr(struct mbuf *m, int offset, memcpy(&sin6.sin6_addr, &p6->addr, sizeof(p6->addr)); /* look it up */ retval = sctp_findassociation_ep_addr(inp_p, - (struct sockaddr *)&sin6, netp, dest, NULL); + (struct sockaddr *)&sin6, netp, dst, NULL); if (retval != NULL) { return (retval); } @@ -2146,105 +2144,17 @@ sctp_findassoc_by_vtag(struct sockaddr *from, struct sockaddr *to, uint32_t vtag */ struct sctp_tcb * sctp_findassociation_addr(struct mbuf *m, int offset, + struct sockaddr *src, struct sockaddr *dst, struct sctphdr *sh, struct sctp_chunkhdr *ch, struct sctp_inpcb **inp_p, struct sctp_nets **netp, uint32_t vrf_id) { int find_tcp_pool; - struct ip *iph; struct sctp_tcb *retval; - struct sockaddr_storage to_store, from_store; - struct sockaddr *to = (struct sockaddr *)&to_store; - struct sockaddr *from = (struct sockaddr *)&from_store; struct sctp_inpcb *inp; - iph = mtod(m, struct ip *); - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - { - /* its IPv4 */ - struct sockaddr_in *from4; - - from4 = (struct sockaddr_in *)&from_store; - bzero(from4, sizeof(*from4)); - from4->sin_family = AF_INET; - from4->sin_len = sizeof(struct sockaddr_in); - from4->sin_addr.s_addr = iph->ip_src.s_addr; - from4->sin_port = sh->src_port; - break; - } -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - { - /* its IPv6 */ - struct ip6_hdr *ip6; - struct sockaddr_in6 *from6; - - ip6 = mtod(m, struct ip6_hdr *); - from6 = (struct sockaddr_in6 *)&from_store; - bzero(from6, sizeof(*from6)); - from6->sin6_family = AF_INET6; - from6->sin6_len = sizeof(struct sockaddr_in6); - from6->sin6_addr = ip6->ip6_src; - from6->sin6_port = sh->src_port; - /* Get the scopes in properly to the sin6 addr's */ - /* we probably don't need these operations */ - (void)sa6_recoverscope(from6); - sa6_embedscope(from6, MODULE_GLOBAL(ip6_use_defzone)); - break; - } -#endif - default: - /* Currently not supported. */ - return (NULL); - } - - - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - { - /* its IPv4 */ - struct sockaddr_in *to4; - - to4 = (struct sockaddr_in *)&to_store; - bzero(to4, sizeof(*to4)); - to4->sin_family = AF_INET; - to4->sin_len = sizeof(struct sockaddr_in); - to4->sin_addr.s_addr = iph->ip_dst.s_addr; - to4->sin_port = sh->dest_port; - break; - } -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - { - /* its IPv6 */ - struct ip6_hdr *ip6; - struct sockaddr_in6 *to6; - - ip6 = mtod(m, struct ip6_hdr *); - to6 = (struct sockaddr_in6 *)&to_store; - bzero(to6, sizeof(*to6)); - to6->sin6_family = AF_INET6; - to6->sin6_len = sizeof(struct sockaddr_in6); - to6->sin6_addr = ip6->ip6_dst; - to6->sin6_port = sh->dest_port; - /* Get the scopes in properly to the sin6 addr's */ - /* we probably don't need these operations */ - (void)sa6_recoverscope(to6); - sa6_embedscope(to6, MODULE_GLOBAL(ip6_use_defzone)); - break; - } -#endif - default: - /* TSNH */ - break; - } if (sh->v_tag) { /* we only go down this path if vtag is non-zero */ - retval = sctp_findassoc_by_vtag(from, to, ntohl(sh->v_tag), + retval = sctp_findassoc_by_vtag(src, dst, ntohl(sh->v_tag), inp_p, netp, sh->src_port, sh->dest_port, 0, vrf_id, 0); if (retval) { return (retval); @@ -2259,11 +2169,11 @@ sctp_findassociation_addr(struct mbuf *m, int offset, find_tcp_pool = 1; } if (inp_p) { - retval = sctp_findassociation_addr_sa(to, from, inp_p, netp, + retval = sctp_findassociation_addr_sa(src, dst, inp_p, netp, find_tcp_pool, vrf_id); inp = *inp_p; } else { - retval = sctp_findassociation_addr_sa(to, from, &inp, netp, + retval = sctp_findassociation_addr_sa(src, dst, &inp, netp, find_tcp_pool, vrf_id); } SCTPDBG(SCTP_DEBUG_PCB1, "retval:%p inp:%p\n", retval, inp); @@ -2286,7 +2196,7 @@ sctp_findassociation_addr(struct mbuf *m, int offset, return (NULL); } retval = sctp_findassociation_special_addr(m, - offset, sh, &inp, netp, to); + offset, sh, &inp, netp, dst); if (inp_p != NULL) { *inp_p = inp; } @@ -2302,12 +2212,11 @@ sctp_findassociation_addr(struct mbuf *m, int offset, */ struct sctp_tcb * sctp_findassociation_ep_asconf(struct mbuf *m, int offset, - struct sctphdr *sh, struct sctp_inpcb **inp_p, struct sctp_nets **netp, uint32_t vrf_id) + struct sockaddr *dst, struct sctphdr *sh, + struct sctp_inpcb **inp_p, struct sctp_nets **netp, uint32_t vrf_id) { struct sctp_tcb *stcb; - struct sockaddr_storage local_store, remote_store; - struct sockaddr *to; - struct ip *iph; + struct sockaddr_storage remote_store; struct sctp_paramhdr parm_buf, *phdr; int ptype; int zero_address = 0; @@ -2317,42 +2226,11 @@ sctp_findassociation_ep_asconf(struct mbuf *m, int offset, #endif #ifdef INET6 - struct ip6_hdr *ip6; struct sockaddr_in6 *sin6; #endif - memset(&local_store, 0, sizeof(local_store)); memset(&remote_store, 0, sizeof(remote_store)); - to = (struct sockaddr *)&local_store; - /* First get the destination address setup too. */ - iph = mtod(m, struct ip *); - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - /* its IPv4 */ - sin = (struct sockaddr_in *)&local_store; - sin->sin_family = AF_INET; - sin->sin_len = sizeof(*sin); - sin->sin_port = sh->dest_port; - sin->sin_addr.s_addr = iph->ip_dst.s_addr; - break; -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - /* its IPv6 */ - ip6 = mtod(m, struct ip6_hdr *); - sin6 = (struct sockaddr_in6 *)&local_store; - sin6->sin6_family = AF_INET6; - sin6->sin6_len = sizeof(*sin6); - sin6->sin6_port = sh->dest_port; - sin6->sin6_addr = ip6->ip6_dst; - break; -#endif - default: - return NULL; - } - phdr = sctp_get_next_param(m, offset + sizeof(struct sctp_asconf_chunk), &parm_buf, sizeof(struct sctp_paramhdr)); if (phdr == NULL) { @@ -2423,16 +2301,16 @@ sctp_findassociation_ep_asconf(struct mbuf *m, int offset, } if (zero_address) { - stcb = sctp_findassoc_by_vtag(NULL, to, ntohl(sh->v_tag), inp_p, + stcb = sctp_findassoc_by_vtag(NULL, dst, ntohl(sh->v_tag), inp_p, netp, sh->src_port, sh->dest_port, 1, vrf_id, 0); /* - * printf("findassociation_ep_asconf: zero lookup address - * finds stcb 0x%x\n", (uint32_t)stcb); + * SCTP_PRINTF("findassociation_ep_asconf: zero lookup + * address finds stcb 0x%x\n", (uint32_t)stcb); */ } else { stcb = sctp_findassociation_ep_addr(inp_p, (struct sockaddr *)&remote_store, netp, - to, NULL); + dst, NULL); } return (stcb); } @@ -3426,9 +3304,6 @@ sctp_inpcb_free(struct sctp_inpcb *inp, int immediate, int from) *ippp = htonl(SCTP_FROM_SCTP_PCB + SCTP_LOC_3); } asoc->sctp_ep->last_abort_code = SCTP_FROM_SCTP_PCB + SCTP_LOC_3; -#if defined(SCTP_PANIC_ON_ABORT) - panic("inpcb_free does an abort"); -#endif sctp_send_abort_tcb(asoc, op_err, SCTP_SO_LOCKED); SCTP_STAT_INCR_COUNTER32(sctps_aborted); if ((SCTP_GET_STATE(&asoc->asoc) == SCTP_STATE_OPEN) || @@ -3520,10 +3395,6 @@ sctp_inpcb_free(struct sctp_inpcb *inp, int immediate, int from) *ippp = htonl(SCTP_FROM_SCTP_PCB + SCTP_LOC_5); } asoc->sctp_ep->last_abort_code = SCTP_FROM_SCTP_PCB + SCTP_LOC_5; -#if defined(SCTP_PANIC_ON_ABORT) - panic("inpcb_free does an abort"); -#endif - sctp_send_abort_tcb(asoc, op_err, SCTP_SO_LOCKED); SCTP_STAT_INCR_COUNTER32(sctps_aborted); if ((SCTP_GET_STATE(&asoc->asoc) == SCTP_STATE_OPEN) || @@ -3604,9 +3475,6 @@ sctp_inpcb_free(struct sctp_inpcb *inp, int immediate, int from) } asoc->sctp_ep->last_abort_code = SCTP_FROM_SCTP_PCB + SCTP_LOC_7; -#if defined(SCTP_PANIC_ON_ABORT) - panic("inpcb_free does an abort"); -#endif sctp_send_abort_tcb(asoc, op_err, SCTP_SO_LOCKED); SCTP_STAT_INCR_COUNTER32(sctps_aborted); } else if (asoc->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { @@ -5000,8 +4868,7 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre if (so) { /* Still an open socket - report */ sctp_ulp_notify(SCTP_NOTIFY_SPECIAL_SP_FAIL, stcb, - SCTP_NOTIFY_DATAGRAM_UNSENT, - (void *)sp, SCTP_SO_LOCKED); + 0, (void *)sp, SCTP_SO_LOCKED); } if (sp->data) { sctp_m_freem(sp->data); @@ -5061,8 +4928,8 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre if (chk->data) { if (so) { /* Still a socket? */ - sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb, - SCTP_NOTIFY_DATAGRAM_UNSENT, chk, SCTP_SO_LOCKED); + sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, + 0, chk, SCTP_SO_LOCKED); } if (chk->data) { sctp_m_freem(chk->data); @@ -5085,8 +4952,8 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre if (chk->data) { if (so) { /* Still a socket? */ - sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb, - SCTP_NOTIFY_DATAGRAM_SENT, chk, SCTP_SO_LOCKED); + sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, + 0, chk, SCTP_SO_LOCKED); } if (chk->data) { sctp_m_freem(chk->data); @@ -5745,7 +5612,7 @@ skip_sleep: if (v6 == 0) { sctp_input_with_port(m, off, 0); } else { - printf("V6 not yet supported\n"); + SCTP_PRINTF("V6 not yet supported\n"); sctp_m_freem(m); } CURVNET_RESTORE(); @@ -6096,7 +5963,8 @@ sctp_pcb_finish(void) int sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, - int offset, int limit, struct sctphdr *sh, + int offset, int limit, + struct sockaddr *src, struct sockaddr *dst, struct sockaddr *altsa) { /* @@ -6108,13 +5976,10 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, */ struct sctp_inpcb *inp; struct sctp_nets *net, *nnet, *net_tmp; - struct ip *iph; struct sctp_paramhdr *phdr, parm_buf; struct sctp_tcb *stcb_tmp; uint16_t ptype, plen; struct sockaddr *sa; - struct sockaddr_storage dest_store; - struct sockaddr *local_sa = (struct sockaddr *)&dest_store; uint8_t random_store[SCTP_PARAM_BUFFER_SIZE]; struct sctp_auth_random *p_random = NULL; uint16_t random_len = 0; @@ -6153,65 +6018,10 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, sin6.sin6_len = sizeof(struct sockaddr_in6); sin6.sin6_port = stcb->rport; #endif - iph = mtod(m, struct ip *); - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - { - /* its IPv4 */ - struct sockaddr_in *sin_2; - - sin_2 = (struct sockaddr_in *)(local_sa); - memset(sin_2, 0, sizeof(sin)); - sin_2->sin_family = AF_INET; - sin_2->sin_len = sizeof(sin); - sin_2->sin_port = sh->dest_port; - sin_2->sin_addr.s_addr = iph->ip_dst.s_addr; - if (altsa) { - /* - * For cookies we use the src address NOT - * from the packet but from the original - * INIT. - */ - sa = altsa; - } else { - sin.sin_addr = iph->ip_src; - sa = (struct sockaddr *)&sin; - } - break; - } -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - { - /* its IPv6 */ - struct ip6_hdr *ip6; - struct sockaddr_in6 *sin6_2; - - ip6 = mtod(m, struct ip6_hdr *); - sin6_2 = (struct sockaddr_in6 *)(local_sa); - memset(sin6_2, 0, sizeof(sin6)); - sin6_2->sin6_family = AF_INET6; - sin6_2->sin6_len = sizeof(struct sockaddr_in6); - sin6_2->sin6_port = sh->dest_port; - sin6_2->sin6_addr = ip6->ip6_dst; - if (altsa) { - /* - * For cookies we use the src address NOT - * from the packet but from the original - * INIT. - */ - sa = altsa; - } else { - sin6.sin6_addr = ip6->ip6_src; - sa = (struct sockaddr *)&sin6; - } - break; - } -#endif - default: - return (-1); - break; + if (altsa) { + sa = altsa; + } else { + sa = src; } /* Turn off ECN until we get through all params */ ecn_allowed = 0; @@ -6222,7 +6032,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, /* does the source address already exist? if so skip it */ inp = stcb->sctp_ep; atomic_add_int(&stcb->asoc.refcnt, 1); - stcb_tmp = sctp_findassociation_ep_addr(&inp, sa, &net_tmp, local_sa, stcb); + stcb_tmp = sctp_findassociation_ep_addr(&inp, sa, &net_tmp, dst, stcb); atomic_add_int(&stcb->asoc.refcnt, -1); if ((stcb_tmp == NULL && inp == stcb->sctp_ep) || inp == NULL) { @@ -6276,8 +6086,8 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, ptype = ntohs(phdr->param_type); plen = ntohs(phdr->param_length); /* - * printf("ptype => %0x, plen => %d\n", (uint32_t)ptype, - * (int)plen); + * SCTP_PRINTF("ptype => %0x, plen => %d\n", + * (uint32_t)ptype, (int)plen); */ if (offset + plen > limit) { break; @@ -6312,7 +6122,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, inp = stcb->sctp_ep; atomic_add_int(&stcb->asoc.refcnt, 1); stcb_tmp = sctp_findassociation_ep_addr(&inp, sa, &net, - local_sa, stcb); + dst, stcb); atomic_add_int(&stcb->asoc.refcnt, -1); if ((stcb_tmp == NULL && inp == stcb->sctp_ep) || @@ -6357,7 +6167,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, * abort this guy */ sctp_abort_an_association(stcb_tmp->sctp_ep, - stcb_tmp, 1, NULL, 0); + stcb_tmp, NULL, SCTP_SO_NOT_LOCKED); goto add_it_now; } SCTP_TCB_UNLOCK(stcb_tmp); @@ -6402,7 +6212,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, inp = stcb->sctp_ep; atomic_add_int(&stcb->asoc.refcnt, 1); stcb_tmp = sctp_findassociation_ep_addr(&inp, sa, &net, - local_sa, stcb); + dst, stcb); atomic_add_int(&stcb->asoc.refcnt, -1); if (stcb_tmp == NULL && (inp == stcb->sctp_ep || inp == NULL)) { @@ -6448,7 +6258,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, * abort this guy */ sctp_abort_an_association(stcb_tmp->sctp_ep, - stcb_tmp, 1, NULL, 0); + stcb_tmp, NULL, SCTP_SO_NOT_LOCKED); goto add_it_now6; } SCTP_TCB_UNLOCK(stcb_tmp); diff --git a/sys/netinet/sctp_pcb.h b/sys/netinet/sctp_pcb.h index 325f76869fe..e41665818f9 100644 --- a/sys/netinet/sctp_pcb.h +++ b/sys/netinet/sctp_pcb.h @@ -1,7 +1,8 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * @@ -29,13 +30,11 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_pcb.h,v 1.21 2005/07/16 01:18:47 suz Exp $ */ - #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_pcb_h__ -#define __sctp_pcb_h__ +#ifndef _NETINET_SCTP_PCB_H_ +#define _NETINET_SCTP_PCB_H_ #include #include @@ -529,6 +528,7 @@ sctp_inpcb_bind(struct socket *, struct sockaddr *, struct sctp_tcb * sctp_findassociation_addr(struct mbuf *, int, + struct sockaddr *, struct sockaddr *, struct sctphdr *, struct sctp_chunkhdr *, struct sctp_inpcb **, struct sctp_nets **, uint32_t vrf_id); @@ -559,7 +559,7 @@ sctp_findassociation_ep_asocid(struct sctp_inpcb *, sctp_assoc_t, int); struct sctp_tcb * -sctp_findassociation_ep_asconf(struct mbuf *, int, +sctp_findassociation_ep_asconf(struct mbuf *, int, struct sockaddr *, struct sctphdr *, struct sctp_inpcb **, struct sctp_nets **, uint32_t vrf_id); int sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id); @@ -604,8 +604,8 @@ void sctp_add_local_addr_restricted(struct sctp_tcb *, struct sctp_ifa *); void sctp_del_local_addr_restricted(struct sctp_tcb *, struct sctp_ifa *); int -sctp_load_addresses_from_init(struct sctp_tcb *, struct mbuf *, int, - int, struct sctphdr *, struct sockaddr *); +sctp_load_addresses_from_init(struct sctp_tcb *, struct mbuf *, int, int, + struct sockaddr *, struct sockaddr *, struct sockaddr *); int sctp_set_primary_addr(struct sctp_tcb *, struct sockaddr *, diff --git a/sys/netinet/sctp_peeloff.c b/sys/netinet/sctp_peeloff.c index fb9391a7312..2b156e20c00 100644 --- a/sys/netinet/sctp_peeloff.c +++ b/sys/netinet/sctp_peeloff.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,11 +30,9 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ - -/* $KAME: sctp_peeloff.c,v 1.13 2005/03/06 16:04:18 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); + #include #include #include diff --git a/sys/netinet/sctp_peeloff.h b/sys/netinet/sctp_peeloff.h index e552f560ab3..49c38ab4273 100644 --- a/sys/netinet/sctp_peeloff.h +++ b/sys/netinet/sctp_peeloff.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,13 +30,11 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_peeloff.h,v 1.6 2005/03/06 16:04:18 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_peeloff_h__ -#define __sctp_peeloff_h__ +#ifndef _NETINET_SCTP_PEELOFF_H_ +#define _NETINET_SCTP_PEELOFF_H_ diff --git a/sys/netinet/sctp_ss_functions.c b/sys/netinet/sctp_ss_functions.c index e58664747f7..a2568adbf6b 100644 --- a/sys/netinet/sctp_ss_functions.c +++ b/sys/netinet/sctp_ss_functions.c @@ -1,7 +1,7 @@ /*- - * Copyright (c) 2010-2011, by Michael Tuexen. All rights reserved. - * Copyright (c) 2010-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2010-2011, by Robin Seggelmann. All rights reserved. + * Copyright (c) 2010-2012, by Michael Tuexen. All rights reserved. + * Copyright (c) 2010-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2010-2012, by Robin Seggelmann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/sys/netinet/sctp_structs.h b/sys/netinet/sctp_structs.h index 37116911012..4bd0ca966bd 100644 --- a/sys/netinet/sctp_structs.h +++ b/sys/netinet/sctp_structs.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,13 +30,11 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_structs.h,v 1.13 2005/03/06 16:04:18 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_structs_h__ -#define __sctp_structs_h__ +#ifndef _NETINET_SCTP_STRUCTS_H_ +#define _NETINET_SCTP_STRUCTS_H_ #include #include diff --git a/sys/netinet/sctp_sysctl.c b/sys/netinet/sctp_sysctl.c index 2186832dc04..19b8779b116 100644 --- a/sys/netinet/sctp_sysctl.c +++ b/sys/netinet/sctp_sysctl.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -55,9 +55,6 @@ sctp_init_sysctls() SCTP_BASE_SYSCTL(sctp_multiple_asconfs) = SCTPCTL_MULTIPLEASCONFS_DEFAULT; SCTP_BASE_SYSCTL(sctp_ecn_enable) = SCTPCTL_ECN_ENABLE_DEFAULT; SCTP_BASE_SYSCTL(sctp_strict_sacks) = SCTPCTL_STRICT_SACKS_DEFAULT; -#if !defined(SCTP_WITH_NO_CSUM) - SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback) = SCTPCTL_LOOPBACK_NOCSUM_DEFAULT; -#endif SCTP_BASE_SYSCTL(sctp_peer_chunk_oh) = SCTPCTL_PEER_CHKOH_DEFAULT; SCTP_BASE_SYSCTL(sctp_max_burst_default) = SCTPCTL_MAXBURST_DEFAULT; SCTP_BASE_SYSCTL(sctp_fr_max_burst_default) = SCTPCTL_FRMAXBURST_DEFAULT; @@ -604,9 +601,6 @@ sysctl_sctp_check(SYSCTL_HANDLER_ARGS) RANGECHK(SCTP_BASE_SYSCTL(sctp_auto_asconf), SCTPCTL_AUTOASCONF_MIN, SCTPCTL_AUTOASCONF_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_ecn_enable), SCTPCTL_ECN_ENABLE_MIN, SCTPCTL_ECN_ENABLE_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_strict_sacks), SCTPCTL_STRICT_SACKS_MIN, SCTPCTL_STRICT_SACKS_MAX); -#if !defined(SCTP_WITH_NO_CSUM) - RANGECHK(SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback), SCTPCTL_LOOPBACK_NOCSUM_MIN, SCTPCTL_LOOPBACK_NOCSUM_MAX); -#endif RANGECHK(SCTP_BASE_SYSCTL(sctp_peer_chunk_oh), SCTPCTL_PEER_CHKOH_MIN, SCTPCTL_PEER_CHKOH_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_max_burst_default), SCTPCTL_MAXBURST_MIN, SCTPCTL_MAXBURST_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_fr_max_burst_default), SCTPCTL_FRMAXBURST_MIN, SCTPCTL_FRMAXBURST_MAX); @@ -671,7 +665,7 @@ sysctl_sctp_check(SYSCTL_HANDLER_ARGS) #ifdef SCTP_DEBUG RANGECHK(SCTP_BASE_SYSCTL(sctp_debug_on), SCTPCTL_DEBUG_MIN, SCTPCTL_DEBUG_MAX); #endif -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) RANGECHK(SCTP_BASE_SYSCTL(sctp_output_unlocked), SCTPCTL_OUTPUT_UNLOCKED_MIN, SCTPCTL_OUTPUT_UNLOCKED_MAX); #endif } @@ -870,11 +864,6 @@ SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, strict_sacks, CTLTYPE_UINT | CTLFLAG_ &SCTP_BASE_SYSCTL(sctp_strict_sacks), 0, sysctl_sctp_check, "IU", SCTPCTL_STRICT_SACKS_DESC); -#if !defined(SCTP_WITH_NO_CSUM) -SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, loopback_nocsum, CTLTYPE_UINT | CTLFLAG_RW, - &SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback), 0, sysctl_sctp_check, "IU", - SCTPCTL_LOOPBACK_NOCSUM_DESC); -#endif SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, peer_chkoh, CTLTYPE_UINT | CTLFLAG_RW, &SCTP_BASE_SYSCTL(sctp_peer_chunk_oh), 0, sysctl_sctp_check, "IU", @@ -1136,7 +1125,7 @@ SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, debug, CTLTYPE_UINT | CTLFLAG_RW, #endif -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, output_unlocked, CTLTYPE_UINT | CTLFLAG_RW, &SCTP_BASE_SYSCTL(sctp_output_unlocked), 0, sysctl_sctp_check, "IU", SCTPCTL_OUTPUT_UNLOCKED_DESC); diff --git a/sys/netinet/sctp_sysctl.h b/sys/netinet/sctp_sysctl.h index cbb28269c93..4ec37157258 100644 --- a/sys/netinet/sctp_sysctl.h +++ b/sys/netinet/sctp_sysctl.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -33,8 +33,8 @@ #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_sysctl_h__ -#define __sctp_sysctl_h__ +#ifndef _NETINET_SCTP_SYSCTL_H_ +#define _NETINET_SCTP_SYSCTL_H_ #include #include @@ -47,9 +47,6 @@ struct sctp_sysctl { uint32_t sctp_ecn_enable; uint32_t sctp_fr_max_burst_default; uint32_t sctp_strict_sacks; -#if !defined(SCTP_WITH_NO_CSUM) - uint32_t sctp_no_csum_on_loopback; -#endif uint32_t sctp_peer_chunk_oh; uint32_t sctp_max_burst_default; uint32_t sctp_max_chunks_on_queue; @@ -377,7 +374,7 @@ struct sctp_sysctl { #define SCTPCTL_ABC_L_VAR_DESC "SCTP ABC max increase per SACK (L)" #define SCTPCTL_ABC_L_VAR_MIN 0 #define SCTPCTL_ABC_L_VAR_MAX 0xFFFFFFFF -#define SCTPCTL_ABC_L_VAR_DEFAULT 1 +#define SCTPCTL_ABC_L_VAR_DEFAULT 2 /* max_chained_mbufs: Default max number of small mbufs on a chain */ #define SCTPCTL_MAX_CHAINED_MBUFS_DESC "Default max number of small mbufs on a chain" @@ -534,7 +531,7 @@ struct sctp_sysctl { #endif -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) #define SCTPCTL_OUTPUT_UNLOCKED_DESC "Unlock socket when sending packets down to IP." #define SCTPCTL_OUTPUT_UNLOCKED_MIN 0 #define SCTPCTL_OUTPUT_UNLOCKED_MAX 1 diff --git a/sys/netinet/sctp_timer.c b/sys/netinet/sctp_timer.c index 10ae21e5775..b3336434f22 100644 --- a/sys/netinet/sctp_timer.c +++ b/sys/netinet/sctp_timer.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,8 +30,6 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_timer.c,v 1.29 2005/03/06 16:04:18 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); @@ -101,8 +99,7 @@ sctp_threshold_management(struct sctp_inpcb *inp, struct sctp_tcb *stcb, net->dest_state &= ~SCTP_ADDR_REQ_PRIMARY; net->dest_state &= ~SCTP_ADDR_PF; sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, - stcb, - SCTP_FAILED_THRESHOLD, + stcb, 0, (void *)net, SCTP_SO_NOT_LOCKED); } } else if ((net->pf_threshold < net->failure_threshold) && @@ -167,7 +164,7 @@ sctp_threshold_management(struct sctp_inpcb *inp, struct sctp_tcb *stcb, *ippp = htonl(SCTP_FROM_SCTP_TIMER + SCTP_LOC_1); } inp->last_abort_code = SCTP_FROM_SCTP_TIMER + SCTP_LOC_1; - sctp_abort_an_association(inp, stcb, SCTP_FAILED_THRESHOLD, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(inp, stcb, oper, SCTP_SO_NOT_LOCKED); return (1); } return (0); @@ -615,7 +612,7 @@ start_again: if (chk->data) { (void)sctp_release_pr_sctp_chunk(stcb, chk, - (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT), + 1, SCTP_SO_NOT_LOCKED); cnt_abandoned++; } @@ -628,7 +625,7 @@ start_again: if (chk->data) { (void)sctp_release_pr_sctp_chunk(stcb, chk, - (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT), + 1, SCTP_SO_NOT_LOCKED); cnt_abandoned++; } @@ -1066,8 +1063,7 @@ sctp_cookie_timer(struct sctp_inpcb *inp, *ippp = htonl(SCTP_FROM_SCTP_TIMER + SCTP_LOC_3); } inp->last_abort_code = SCTP_FROM_SCTP_TIMER + SCTP_LOC_4; - sctp_abort_an_association(inp, stcb, SCTP_INTERNAL_ERROR, - oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(inp, stcb, oper, SCTP_SO_NOT_LOCKED); } else { #ifdef INVARIANTS panic("Cookie timer expires in wrong state?"); diff --git a/sys/netinet/sctp_timer.h b/sys/netinet/sctp_timer.h index 6f5b35aca3e..fd9df804f13 100644 --- a/sys/netinet/sctp_timer.h +++ b/sys/netinet/sctp_timer.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,12 +30,11 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_timer.h,v 1.6 2005/03/06 16:04:18 itojun Exp $ */ #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_timer_h__ -#define __sctp_timer_h__ +#ifndef _NETINET_SCTP_TIMER_H_ +#define _NETINET_SCTP_TIMER_H_ #if defined(_KERNEL) || defined(__Userspace__) diff --git a/sys/netinet/sctp_uio.h b/sys/netinet/sctp_uio.h index 31b0136954b..95b89785431 100644 --- a/sys/netinet/sctp_uio.h +++ b/sys/netinet/sctp_uio.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,12 +30,11 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_uio.h,v 1.11 2005/03/06 16:04:18 itojun Exp $ */ #include __FBSDID("$FreeBSD$"); -#ifndef __sctp_uio_h__ -#define __sctp_uio_h__ +#ifndef _NETINET_SCTP_UIO_H_ +#define _NETINET_SCTP_UIO_H_ #if ! defined(_KERNEL) @@ -169,7 +168,7 @@ struct sctp_default_prinfo { }; struct sctp_authinfo { - uint16_t auth_keyid; + uint16_t auth_keynumber; }; struct sctp_rcvinfo { @@ -296,16 +295,23 @@ struct sctp_assoc_change { uint16_t sac_outbound_streams; uint16_t sac_inbound_streams; sctp_assoc_t sac_assoc_id; + uint8_t sac_info[]; }; /* sac_state values */ -#define SCTP_COMM_UP 0x0001 -#define SCTP_COMM_LOST 0x0002 -#define SCTP_RESTART 0x0003 -#define SCTP_SHUTDOWN_COMP 0x0004 -#define SCTP_CANT_STR_ASSOC 0x0005 - +#define SCTP_COMM_UP 0x0001 +#define SCTP_COMM_LOST 0x0002 +#define SCTP_RESTART 0x0003 +#define SCTP_SHUTDOWN_COMP 0x0004 +#define SCTP_CANT_STR_ASSOC 0x0005 +/* sac_info values */ +#define SCTP_ASSOC_SUPPORTS_PR 0x01 +#define SCTP_ASSOC_SUPPORTS_AUTH 0x02 +#define SCTP_ASSOC_SUPPORTS_ASCONF 0x03 +#define SCTP_ASSOC_SUPPORTS_MULTIBUF 0x04 +#define SCTP_ASSOC_SUPPORTS_RE_CONFIG 0x05 +#define SCTP_ASSOC_SUPPORTS_MAX 0x05 /* * Address event */ @@ -343,7 +349,7 @@ struct sctp_remote_error { uint8_t sre_data[4]; }; -/* data send failure event */ +/* data send failure event (deprecated) */ struct sctp_send_failed { uint16_t ssf_type; uint16_t ssf_flags; @@ -354,6 +360,17 @@ struct sctp_send_failed { uint8_t ssf_data[]; }; +/* data send failure event (not deprecated) */ +struct sctp_send_failed_event { + uint16_t ssfe_type; + uint16_t ssfe_flags; + uint32_t ssfe_length; + uint32_t ssfe_error; + struct sctp_sndinfo ssfe_info; + sctp_assoc_t ssfe_assoc_id; + uint8_t ssfe_data[]; +}; + /* flag that indicates state of data */ #define SCTP_DATA_UNSENT 0x0001 /* inqueue never on wire */ #define SCTP_DATA_SENT 0x0002 /* on wire at failure */ @@ -424,7 +441,8 @@ struct sctp_authkey_event { }; /* indication values */ -#define SCTP_AUTH_NEWKEY 0x0001 +#define SCTP_AUTH_NEW_KEY 0x0001 +#define SCTP_AUTH_NEWKEY SCTP_AUTH_NEW_KEY #define SCTP_AUTH_NO_AUTH 0x0002 #define SCTP_AUTH_FREE_KEY 0x0003 @@ -453,7 +471,6 @@ struct sctp_stream_reset_event { #define SCTP_STREAM_RESET_OUTGOING_SSN 0x0002 #define SCTP_STREAM_RESET_DENIED 0x0004 #define SCTP_STREAM_RESET_FAILED 0x0008 -#define SCTP_STREAM_CHANGED_DENIED 0x0010 /* * Assoc reset event - subscribe to SCTP_ASSOC_RESET_EVENT @@ -506,29 +523,29 @@ union sctp_notification { struct sctp_pdapi_event sn_pdapi_event; struct sctp_authkey_event sn_auth_event; struct sctp_sender_dry_event sn_sender_dry_event; + struct sctp_send_failed_event sn_send_failed_event; struct sctp_stream_reset_event sn_strreset_event; struct sctp_assoc_reset_event sn_assocreset_event; struct sctp_stream_change_event sn_strchange_event; - }; /* notification types */ -#define SCTP_ASSOC_CHANGE 0x0001 -#define SCTP_PEER_ADDR_CHANGE 0x0002 -#define SCTP_REMOTE_ERROR 0x0003 -#define SCTP_SEND_FAILED 0x0004 -#define SCTP_SHUTDOWN_EVENT 0x0005 -#define SCTP_ADAPTATION_INDICATION 0x0006 +#define SCTP_ASSOC_CHANGE 0x0001 +#define SCTP_PEER_ADDR_CHANGE 0x0002 +#define SCTP_REMOTE_ERROR 0x0003 +#define SCTP_SEND_FAILED 0x0004 +#define SCTP_SHUTDOWN_EVENT 0x0005 +#define SCTP_ADAPTATION_INDICATION 0x0006 /* same as above */ -#define SCTP_ADAPTION_INDICATION 0x0006 -#define SCTP_PARTIAL_DELIVERY_EVENT 0x0007 -#define SCTP_AUTHENTICATION_EVENT 0x0008 -#define SCTP_STREAM_RESET_EVENT 0x0009 -#define SCTP_SENDER_DRY_EVENT 0x000a -#define SCTP_NOTIFICATIONS_STOPPED_EVENT 0x000b /* we don't send this */ -#define SCTP_ASSOC_RESET_EVENT 0x000c -#define SCTP_STREAM_CHANGE_EVENT 0x000d - +#define SCTP_ADAPTION_INDICATION 0x0006 +#define SCTP_PARTIAL_DELIVERY_EVENT 0x0007 +#define SCTP_AUTHENTICATION_EVENT 0x0008 +#define SCTP_STREAM_RESET_EVENT 0x0009 +#define SCTP_SENDER_DRY_EVENT 0x000a +#define SCTP_NOTIFICATIONS_STOPPED_EVENT 0x000b /* we don't send this */ +#define SCTP_ASSOC_RESET_EVENT 0x000c +#define SCTP_STREAM_CHANGE_EVENT 0x000d +#define SCTP_SEND_FAILED_EVENT 0x000e /* * socket option structs */ @@ -607,13 +624,6 @@ struct sctp_getaddresses { struct sockaddr addr[1]; }; -struct sctp_setstrm_timeout { - sctp_assoc_t ssto_assoc_id; - uint32_t ssto_timeout; - uint32_t ssto_streamid_start; - uint32_t ssto_streamid_end; -}; - struct sctp_status { sctp_assoc_t sstat_assoc_id; int32_t sstat_state; @@ -666,6 +676,7 @@ struct sctp_authkeyid { /* SCTP_PEER_AUTH_CHUNKS / SCTP_LOCAL_AUTH_CHUNKS */ struct sctp_authchunks { sctp_assoc_t gauth_assoc_id; + uint32_t gauth_number_of_chunks; uint8_t gauth_chunks[]; }; diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index e6f60451e29..dc01f2dbb46 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,10 +30,9 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_usrreq.c,v 1.48 2005/03/07 23:26:08 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); + #include #include #include @@ -79,7 +78,6 @@ sctp_init(void) * now I will just copy. */ SCTP_BASE_SYSCTL(sctp_recvspace) = SCTP_BASE_SYSCTL(sctp_sendspace); - SCTP_BASE_VAR(first_time) = 0; SCTP_BASE_VAR(sctp_pcb_initialized) = 0; sctp_pcb_init(); @@ -88,8 +86,6 @@ sctp_init(void) SCTP_BASE_VAR(packet_log_end) = 0; bzero(&SCTP_BASE_VAR(packet_log_buffer), SCTP_PACKET_LOG_SIZE); #endif - - } void @@ -228,15 +224,13 @@ sctp_notify(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif - /* protection */ - int reason; struct icmp *icmph; - + /* protection */ if ((inp == NULL) || (stcb == NULL) || (net == NULL) || (sh == NULL) || (to == NULL)) { if (stcb) @@ -275,7 +269,7 @@ sctp_notify(struct sctp_inpcb *inp, net->dest_state &= ~SCTP_ADDR_REACHABLE; net->dest_state &= ~SCTP_ADDR_PF; sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, - stcb, SCTP_FAILED_THRESHOLD, + stcb, 0, (void *)net, SCTP_SO_NOT_LOCKED); } SCTP_TCB_UNLOCK(stcb); @@ -288,9 +282,8 @@ sctp_notify(struct sctp_inpcb *inp, * now is dead. In either case treat it like a OOTB abort * with no TCB */ - reason = SCTP_PEER_FAULTY; - sctp_abort_notification(stcb, reason, SCTP_SO_NOT_LOCKED); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) + sctp_abort_notification(stcb, 1, 0, NULL, SCTP_SO_NOT_LOCKED); +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(inp); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -299,7 +292,7 @@ sctp_notify(struct sctp_inpcb *inp, atomic_subtract_int(&stcb->asoc.refcnt, 1); #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_USRREQ + SCTP_LOC_2); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); /* SCTP_TCB_UNLOCK(stcb); MT: I think this is not needed. */ #endif @@ -352,8 +345,8 @@ sctp_ctlinput(cmd, sa, vip) * 'from' holds our local endpoint address. Thus we reverse * the to and the from in the lookup. */ - stcb = sctp_findassociation_addr_sa((struct sockaddr *)&from, - (struct sockaddr *)&to, + stcb = sctp_findassociation_addr_sa((struct sockaddr *)&to, + (struct sockaddr *)&from, &inp, &net, 1, vrf_id); if (stcb != NULL && inp && (inp->sctp_socket != NULL)) { if (cmd != PRC_MSGSIZE) { @@ -404,8 +397,8 @@ sctp_getcred(SYSCTL_HANDLER_ARGS) if (error) return (error); - stcb = sctp_findassociation_addr_sa(sintosa(&addrs[0]), - sintosa(&addrs[1]), + stcb = sctp_findassociation_addr_sa(sintosa(&addrs[1]), + sintosa(&addrs[0]), &inp, &net, 1, vrf_id); if (stcb == NULL || inp == NULL || inp->sctp_socket == NULL) { if ((inp != NULL) && (stcb == NULL)) { @@ -783,9 +776,6 @@ sctp_disconnect(struct socket *so) ph->param_type = htons(SCTP_CAUSE_USER_INITIATED_ABT); ph->param_length = htons(SCTP_BUF_LEN(err)); } -#if defined(SCTP_PANIC_ON_ABORT) - panic("disconnect does an abort"); -#endif sctp_send_abort_tcb(stcb, err, SCTP_SO_LOCKED); SCTP_STAT_INCR_COUNTER32(sctps_aborted); } @@ -891,10 +881,6 @@ sctp_disconnect(struct socket *so) ippp = (uint32_t *) (ph + 1); *ippp = htonl(SCTP_FROM_SCTP_USRREQ + SCTP_LOC_4); } -#if defined(SCTP_PANIC_ON_ABORT) - panic("disconnect does an abort"); -#endif - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_USRREQ + SCTP_LOC_4; sctp_send_abort_tcb(stcb, op_err, SCTP_SO_LOCKED); SCTP_STAT_INCR_COUNTER32(sctps_aborted); @@ -1106,12 +1092,8 @@ sctp_shutdown(struct socket *so) ippp = (uint32_t *) (ph + 1); *ippp = htonl(SCTP_FROM_SCTP_USRREQ + SCTP_LOC_6); } -#if defined(SCTP_PANIC_ON_ABORT) - panic("shutdown does an abort"); -#endif stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_USRREQ + SCTP_LOC_6; sctp_abort_an_association(stcb->sctp_ep, stcb, - SCTP_RESPONSE_TO_USER_REQ, op_err, SCTP_SO_LOCKED); goto skip_unlock; } else { @@ -2882,6 +2864,7 @@ flags_out: } else { /* copy in the chunks */ (void)sctp_serialize_auth_chunks(chklist, sac->gauth_chunks); + sac->gauth_number_of_chunks = (uint32_t) size; *optsize = sizeof(struct sctp_authchunks) + size; } SCTP_TCB_UNLOCK(stcb); @@ -2900,6 +2883,7 @@ flags_out: } else { /* copy in the chunks */ (void)sctp_serialize_auth_chunks(chklist, sac->gauth_chunks); + sac->gauth_number_of_chunks = (uint32_t) size; *optsize = sizeof(struct sctp_authchunks) + size; } SCTP_INP_RUNLOCK(inp); @@ -2930,6 +2914,7 @@ flags_out: } else { /* copy in the chunks */ (void)sctp_serialize_auth_chunks(chklist, sac->gauth_chunks); + sac->gauth_number_of_chunks = (uint32_t) size; *optsize = sizeof(struct sctp_authchunks) + size; } SCTP_TCB_UNLOCK(stcb); @@ -2983,6 +2968,15 @@ flags_out: SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOTSUP); error = ENOTSUP; break; + case SCTP_ASSOC_RESET_EVENT: + event_type = SCTP_PCB_FLAGS_ASSOC_RESETEVNT; + break; + case SCTP_STREAM_CHANGE_EVENT: + event_type = SCTP_PCB_FLAGS_STREAM_CHANGEEVNT; + break; + case SCTP_SEND_FAILED_EVENT: + event_type = SCTP_PCB_FLAGS_RECVNSENDFAILEVNT; + break; default: event_type = 0; SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); @@ -3290,6 +3284,33 @@ flags_out: } break; } + case SCTP_ENABLE_STREAM_RESET: + { + struct sctp_assoc_value *av; + + SCTP_CHECK_AND_CAST(av, optval, struct sctp_assoc_value, *optsize); + SCTP_FIND_STCB(inp, stcb, av->assoc_id); + + if (stcb) { + av->assoc_value = (uint32_t) stcb->asoc.local_strreset_support; + SCTP_TCB_UNLOCK(stcb); + } else { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC)) { + SCTP_INP_RLOCK(inp); + av->assoc_value = (uint32_t) inp->local_strreset_support; + SCTP_INP_RUNLOCK(inp); + } else { + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); + error = EINVAL; + } + } + if (error == 0) { + *optsize = sizeof(struct sctp_assoc_value); + } + break; + } default: SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOPROTOOPT); error = ENOPROTOOPT; @@ -4090,7 +4111,6 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, case SCTP_ENABLE_STREAM_RESET: { struct sctp_assoc_value *av; - uint8_t set_value = 0; SCTP_CHECK_AND_CAST(av, optval, struct sctp_assoc_value, optsize); if (av->assoc_value & (~SCTP_ENABLE_VALUE_MASK)) { @@ -4098,10 +4118,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, error = EINVAL; break; } - set_value = av->assoc_value & SCTP_ENABLE_VALUE_MASK; SCTP_FIND_STCB(inp, stcb, av->assoc_id); if (stcb) { - stcb->asoc.local_strreset_support = set_value; + stcb->asoc.local_strreset_support = (uint8_t) av->assoc_value; SCTP_TCB_UNLOCK(stcb); } else { if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || @@ -4109,7 +4128,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, (av->assoc_id == SCTP_FUTURE_ASSOC) || (av->assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); - inp->local_strreset_support = set_value; + inp->local_strreset_support = (uint8_t) av->assoc_value; SCTP_INP_WUNLOCK(inp); } if ((av->assoc_id == SCTP_CURRENT_ASSOC) || @@ -4117,7 +4136,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, SCTP_INP_RLOCK(inp); LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) { SCTP_TCB_LOCK(stcb); - stcb->asoc.local_strreset_support = set_value; + stcb->asoc.local_strreset_support = (uint8_t) av->assoc_value; SCTP_TCB_UNLOCK(stcb); } SCTP_INP_RUNLOCK(inp); @@ -4133,7 +4152,6 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, SCTP_CHECK_AND_CAST(strrst, optval, struct sctp_reset_streams, optsize); SCTP_FIND_STCB(inp, stcb, strrst->srs_assoc_id); - if (stcb == NULL) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOENT); error = ENOENT; @@ -4148,15 +4166,6 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, SCTP_TCB_UNLOCK(stcb); break; } - if (!(stcb->asoc.local_strreset_support & SCTP_ENABLE_RESET_STREAM_REQ)) { - /* - * User did not enable the operation. - */ - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EPERM); - error = EPERM; - SCTP_TCB_UNLOCK(stcb); - break; - } if (stcb->asoc.stream_reset_outstanding) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EALREADY); error = EALREADY; @@ -4215,6 +4224,21 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, error = ENOENT; break; } + if (stcb->asoc.peer_supports_strreset == 0) { + /* + * Peer does not support the chunk type. + */ + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EOPNOTSUPP); + error = EOPNOTSUPP; + SCTP_TCB_UNLOCK(stcb); + break; + } + if (stcb->asoc.stream_reset_outstanding) { + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EALREADY); + error = EALREADY; + SCTP_TCB_UNLOCK(stcb); + break; + } if ((stradd->sas_outstrms == 0) && (stradd->sas_instrms == 0)) { error = EINVAL; @@ -4278,15 +4302,6 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, SCTP_TCB_UNLOCK(stcb); break; } - if (!(stcb->asoc.local_strreset_support & SCTP_ENABLE_RESET_ASSOC_REQ)) { - /* - * User did not enable the operation. - */ - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EPERM); - error = EPERM; - SCTP_TCB_UNLOCK(stcb); - break; - } if (stcb->asoc.stream_reset_outstanding) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EALREADY); error = EALREADY; @@ -4810,12 +4825,12 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, if (net->dest_state & SCTP_ADDR_REACHABLE) { if (net->error_count > paddrp->spp_pathmaxrxt) { net->dest_state &= ~SCTP_ADDR_REACHABLE; - sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, 0, net, SCTP_SO_LOCKED); } } else { if (net->error_count <= paddrp->spp_pathmaxrxt) { net->dest_state |= SCTP_ADDR_REACHABLE; - sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, 0, net, SCTP_SO_LOCKED); } } net->failure_threshold = paddrp->spp_pathmaxrxt; @@ -4853,12 +4868,12 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, if (net->dest_state & SCTP_ADDR_REACHABLE) { if (net->error_count > paddrp->spp_pathmaxrxt) { net->dest_state &= ~SCTP_ADDR_REACHABLE; - sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, 0, net, SCTP_SO_LOCKED); } } else { if (net->error_count <= paddrp->spp_pathmaxrxt) { net->dest_state |= SCTP_ADDR_REACHABLE; - sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, 0, net, SCTP_SO_LOCKED); } } net->failure_threshold = paddrp->spp_pathmaxrxt; @@ -5379,6 +5394,15 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOTSUP); error = ENOTSUP; break; + case SCTP_ASSOC_RESET_EVENT: + event_type = SCTP_PCB_FLAGS_ASSOC_RESETEVNT; + break; + case SCTP_STREAM_CHANGE_EVENT: + event_type = SCTP_PCB_FLAGS_STREAM_CHANGEEVNT; + break; + case SCTP_SEND_FAILED_EVENT: + event_type = SCTP_PCB_FLAGS_RECVNSENDFAILEVNT; + break; default: event_type = 0; SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); @@ -5655,12 +5679,12 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, if (net->dest_state & SCTP_ADDR_REACHABLE) { if (net->failure_threshold > thlds->spt_pathmaxrxt) { net->dest_state &= ~SCTP_ADDR_REACHABLE; - sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, 0, net, SCTP_SO_LOCKED); } } else { if (net->failure_threshold <= thlds->spt_pathmaxrxt) { net->dest_state |= SCTP_ADDR_REACHABLE; - sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, 0, net, SCTP_SO_LOCKED); } } net->failure_threshold = thlds->spt_pathmaxrxt; @@ -5684,12 +5708,12 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, if (net->dest_state & SCTP_ADDR_REACHABLE) { if (net->failure_threshold > thlds->spt_pathmaxrxt) { net->dest_state &= ~SCTP_ADDR_REACHABLE; - sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, 0, net, SCTP_SO_LOCKED); } } else { if (net->failure_threshold <= thlds->spt_pathmaxrxt) { net->dest_state |= SCTP_ADDR_REACHABLE; - sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, 0, net, SCTP_SO_LOCKED); } } net->failure_threshold = thlds->spt_pathmaxrxt; @@ -5809,7 +5833,6 @@ sctp_ctloutput(struct socket *so, struct sockopt *sopt) { void *optval = NULL; size_t optsize = 0; - struct sctp_inpcb *inp; void *p; int error = 0; @@ -5819,7 +5842,7 @@ sctp_ctloutput(struct socket *so, struct sockopt *sopt) if (INP_CHECK_SOCKAF(so, AF_INET6)) error = ip6_ctloutput(so, sopt); #endif /* INET6 */ -#if defined(INET) && defined (INET6) +#if defined(INET) && defined(INET6) else #endif #ifdef INET @@ -5827,12 +5850,11 @@ sctp_ctloutput(struct socket *so, struct sockopt *sopt) #endif return (error); } - inp = (struct sctp_inpcb *)so->so_pcb; optsize = sopt->sopt_valsize; if (optsize) { SCTP_MALLOC(optval, void *, optsize, SCTP_M_SOCKOPT); if (optval == NULL) { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOBUFS); + SCTP_LTRACE_ERR_RET(so->so_pcb, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOBUFS); return (ENOBUFS); } error = sooptcopyin(sopt, optval, optsize, optsize); @@ -5847,7 +5869,7 @@ sctp_ctloutput(struct socket *so, struct sockopt *sopt) } else if (sopt->sopt_dir == SOPT_GET) { error = sctp_getopt(so, sopt->sopt_name, optval, &optsize, p); } else { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); + SCTP_LTRACE_ERR_RET(so->so_pcb, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); error = EINVAL; } if ((error == 0) && (optval != NULL)) { @@ -6454,7 +6476,6 @@ sctp_peeraddr(struct socket *so, struct sockaddr **addr) return (0); } -#ifdef INET struct pr_usrreqs sctp_usrreqs = { .pru_abort = sctp_abort, .pru_accept = sctp_accept, @@ -6477,4 +6498,3 @@ struct pr_usrreqs sctp_usrreqs = { }; #endif -#endif diff --git a/sys/netinet/sctp_var.h b/sys/netinet/sctp_var.h index 8108e79b31e..3862b90b5b7 100644 --- a/sys/netinet/sctp_var.h +++ b/sys/netinet/sctp_var.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,8 +30,6 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp_var.h,v 1.24 2005/03/06 16:04:19 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c index b3fe72889b5..c89eb82f022 100644 --- a/sys/netinet/sctputil.c +++ b/sys/netinet/sctputil.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,8 +30,6 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctputil.c,v 1.37 2005/03/07 23:26:09 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); @@ -1127,7 +1125,7 @@ sctp_print_mapping_array(struct sctp_association *asoc) { unsigned int i, limit; - printf("Mapping array size: %d, baseTSN: %8.8x, cumAck: %8.8x, highestTSN: (%8.8x, %8.8x).\n", + SCTP_PRINTF("Mapping array size: %d, baseTSN: %8.8x, cumAck: %8.8x, highestTSN: (%8.8x, %8.8x).\n", asoc->mapping_array_size, asoc->mapping_array_base_tsn, asoc->cumulative_tsn, @@ -1138,23 +1136,23 @@ sctp_print_mapping_array(struct sctp_association *asoc) break; } } - printf("Renegable mapping array (last %d entries are zero):\n", asoc->mapping_array_size - limit); + SCTP_PRINTF("Renegable mapping array (last %d entries are zero):\n", asoc->mapping_array_size - limit); for (i = 0; i < limit; i++) { - printf("%2.2x%c", asoc->mapping_array[i], ((i + 1) % 16) ? ' ' : '\n'); + SCTP_PRINTF("%2.2x%c", asoc->mapping_array[i], ((i + 1) % 16) ? ' ' : '\n'); } if (limit % 16) - printf("\n"); + SCTP_PRINTF("\n"); for (limit = asoc->mapping_array_size; limit > 1; limit--) { if (asoc->nr_mapping_array[limit - 1]) { break; } } - printf("Non renegable mapping array (last %d entries are zero):\n", asoc->mapping_array_size - limit); + SCTP_PRINTF("Non renegable mapping array (last %d entries are zero):\n", asoc->mapping_array_size - limit); for (i = 0; i < limit; i++) { - printf("%2.2x%c", asoc->nr_mapping_array[i], ((i + 1) % 16) ? ' ' : '\n'); + SCTP_PRINTF("%2.2x%c", asoc->nr_mapping_array[i], ((i + 1) % 16) ? ' ' : '\n'); } if (limit % 16) - printf("\n"); + SCTP_PRINTF("\n"); } int @@ -1292,7 +1290,7 @@ select_a_new_ep: goto no_stcb; } /* If we reach here huh? */ - printf("Unknown it ctl flag %x\n", + SCTP_PRINTF("Unknown it ctl flag %x\n", sctp_it_ctl.iterator_flags); sctp_it_ctl.iterator_flags = 0; } @@ -1414,7 +1412,7 @@ sctp_timeout_handler(void *t) struct sctp_nets *net; struct sctp_timer *tmr; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif @@ -1725,8 +1723,7 @@ sctp_timeout_handler(void *t) break; } SCTP_STAT_INCR(sctps_timoshutdownguard); - sctp_abort_an_association(inp, stcb, - SCTP_SHUTDOWN_GUARD_EXPIRES, NULL, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(inp, stcb, NULL, SCTP_SO_NOT_LOCKED); /* no need to unlock on tcb its gone */ goto out_decr; @@ -1780,7 +1777,7 @@ sctp_timeout_handler(void *t) /* Can we free it yet? */ SCTP_INP_DECR_REF(inp); sctp_timer_stop(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL, SCTP_FROM_SCTPUTIL + SCTP_LOC_1); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(inp); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -1789,7 +1786,7 @@ sctp_timeout_handler(void *t) atomic_subtract_int(&stcb->asoc.refcnt, 1); #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTPUTIL + SCTP_LOC_2); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif /* @@ -2576,15 +2573,13 @@ sctp_pad_lastmbuf(struct mbuf *m, int padval, struct mbuf *last_mbuf) /* find the last mbuf in chain and pad it */ struct mbuf *m_at; - m_at = m; if (last_mbuf) { return (sctp_add_pad_tombuf(last_mbuf, padval)); } else { - while (m_at) { + for (m_at = m; m_at; m_at = SCTP_BUF_NEXT(m_at)) { if (SCTP_BUF_NEXT(m_at) == NULL) { return (sctp_add_pad_tombuf(m_at, padval)); } - m_at = SCTP_BUF_NEXT(m_at); } } SCTP_LTRACE_ERR_RET_PKT(m, NULL, NULL, NULL, SCTP_FROM_SCTPUTIL, EFAULT); @@ -2592,8 +2587,8 @@ sctp_pad_lastmbuf(struct mbuf *m, int padval, struct mbuf *last_mbuf) } static void -sctp_notify_assoc_change(uint32_t event, struct sctp_tcb *stcb, - uint32_t error, int so_locked +sctp_notify_assoc_change(uint16_t state, struct sctp_tcb *stcb, + uint16_t error, struct sctp_abort_chunk *abort, uint8_t from_peer, int so_locked #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) SCTP_UNUSED #endif @@ -2602,111 +2597,133 @@ sctp_notify_assoc_change(uint32_t event, struct sctp_tcb *stcb, struct mbuf *m_notify; struct sctp_assoc_change *sac; struct sctp_queued_to_read *control; + size_t notif_len, abort_len; + unsigned int i; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif + if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVASSOCEVNT)) { + notif_len = sizeof(struct sctp_assoc_change); + if (abort != NULL) { + abort_len = htons(abort->ch.chunk_length); + } else { + abort_len = 0; + } + if ((state == SCTP_COMM_UP) || (state == SCTP_RESTART)) { + notif_len += SCTP_ASSOC_SUPPORTS_MAX; + } else if ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC)) { + notif_len += abort_len; + } + m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_DONTWAIT, 1, MT_DATA); + if (m_notify == NULL) { + /* Retry with smaller value. */ + notif_len = sizeof(struct sctp_assoc_change); + m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_DONTWAIT, 1, MT_DATA); + if (m_notify == NULL) { + goto set_error; + } + } + SCTP_BUF_NEXT(m_notify) = NULL; + sac = mtod(m_notify, struct sctp_assoc_change *); + sac->sac_type = SCTP_ASSOC_CHANGE; + sac->sac_flags = 0; + sac->sac_length = sizeof(struct sctp_assoc_change); + sac->sac_state = state; + sac->sac_error = error; + /* XXX verify these stream counts */ + sac->sac_outbound_streams = stcb->asoc.streamoutcnt; + sac->sac_inbound_streams = stcb->asoc.streamincnt; + sac->sac_assoc_id = sctp_get_associd(stcb); + if (notif_len > sizeof(struct sctp_assoc_change)) { + if ((state == SCTP_COMM_UP) || (state == SCTP_RESTART)) { + i = 0; + if (stcb->asoc.peer_supports_prsctp) { + sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_PR; + } + if (stcb->asoc.peer_supports_auth) { + sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_AUTH; + } + if (stcb->asoc.peer_supports_asconf) { + sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_ASCONF; + } + sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_MULTIBUF; + if (stcb->asoc.peer_supports_strreset) { + sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_RE_CONFIG; + } + sac->sac_length += i; + } else if ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC)) { + memcpy(sac->sac_info, abort, abort_len); + sac->sac_length += abort_len; + } + } + SCTP_BUF_LEN(m_notify) = sac->sac_length; + control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, + 0, 0, stcb->asoc.context, 0, 0, 0, + m_notify); + if (control != NULL) { + control->length = SCTP_BUF_LEN(m_notify); + /* not that we need this */ + control->tail_mbuf = m_notify; + control->spec_flags = M_NOTIFICATION; + sctp_add_to_readq(stcb->sctp_ep, stcb, + control, + &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, + so_locked); + } else { + sctp_m_freem(m_notify); + } + } /* - * For TCP model AND UDP connected sockets we will send an error up - * when an ABORT comes in. + * For 1-to-1 style sockets, we send up and error when an ABORT + * comes in. */ +set_error: if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) && - ((event == SCTP_COMM_LOST) || (event == SCTP_CANT_STR_ASSOC))) { - if (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_COOKIE_WAIT) { - SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ECONNREFUSED); - stcb->sctp_socket->so_error = ECONNREFUSED; + ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC))) { + if (from_peer) { + if (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_COOKIE_WAIT) { + SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ECONNREFUSED); + stcb->sctp_socket->so_error = ECONNREFUSED; + } else { + SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ECONNRESET); + stcb->sctp_socket->so_error = ECONNRESET; + } } else { - SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ECONNRESET); - stcb->sctp_socket->so_error = ECONNRESET; + SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ECONNABORTED); + stcb->sctp_socket->so_error = ECONNABORTED; } - /* Wake ANY sleepers */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - so = SCTP_INP_SO(stcb->sctp_ep); - if (!so_locked) { - atomic_add_int(&stcb->asoc.refcnt, 1); - SCTP_TCB_UNLOCK(stcb); - SCTP_SOCKET_LOCK(so, 1); - SCTP_TCB_LOCK(stcb); - atomic_subtract_int(&stcb->asoc.refcnt, 1); - if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { - SCTP_SOCKET_UNLOCK(so, 1); - return; - } + } + /* Wake ANY sleepers */ +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) + so = SCTP_INP_SO(stcb->sctp_ep); + if (!so_locked) { + atomic_add_int(&stcb->asoc.refcnt, 1); + SCTP_TCB_UNLOCK(stcb); + SCTP_SOCKET_LOCK(so, 1); + SCTP_TCB_LOCK(stcb); + atomic_subtract_int(&stcb->asoc.refcnt, 1); + if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { + SCTP_SOCKET_UNLOCK(so, 1); + return; } + } #endif + if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) && + ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC))) { socantrcvmore(stcb->sctp_socket); - sorwakeup(stcb->sctp_socket); - sowwakeup(stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - if (!so_locked) { - SCTP_SOCKET_UNLOCK(so, 1); - } + } + sorwakeup(stcb->sctp_socket); + sowwakeup(stcb->sctp_socket); +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) + if (!so_locked) { + SCTP_SOCKET_UNLOCK(so, 1); + } #endif - } - if (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVASSOCEVNT)) { - /* event not enabled */ - return; - } - m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_assoc_change), 0, M_DONTWAIT, 1, MT_DATA); - if (m_notify == NULL) - /* no space left */ - return; - SCTP_BUF_LEN(m_notify) = 0; - - sac = mtod(m_notify, struct sctp_assoc_change *); - sac->sac_type = SCTP_ASSOC_CHANGE; - sac->sac_flags = 0; - sac->sac_length = sizeof(struct sctp_assoc_change); - sac->sac_state = event; - sac->sac_error = error; - /* XXX verify these stream counts */ - sac->sac_outbound_streams = stcb->asoc.streamoutcnt; - sac->sac_inbound_streams = stcb->asoc.streamincnt; - sac->sac_assoc_id = sctp_get_associd(stcb); - SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_assoc_change); - SCTP_BUF_NEXT(m_notify) = NULL; - control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, - 0, 0, stcb->asoc.context, 0, 0, 0, - m_notify); - if (control == NULL) { - /* no memory */ - sctp_m_freem(m_notify); - return; - } - control->length = SCTP_BUF_LEN(m_notify); - /* not that we need this */ - control->tail_mbuf = m_notify; - control->spec_flags = M_NOTIFICATION; - sctp_add_to_readq(stcb->sctp_ep, stcb, - control, - &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, - so_locked); - if (event == SCTP_COMM_LOST) { - /* Wake up any sleeper */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - so = SCTP_INP_SO(stcb->sctp_ep); - if (!so_locked) { - atomic_add_int(&stcb->asoc.refcnt, 1); - SCTP_TCB_UNLOCK(stcb); - SCTP_SOCKET_LOCK(so, 1); - SCTP_TCB_LOCK(stcb); - atomic_subtract_int(&stcb->asoc.refcnt, 1); - if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { - SCTP_SOCKET_UNLOCK(so, 1); - return; - } - } -#endif - sctp_sowwakeup(stcb->sctp_ep, stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - if (!so_locked) { - SCTP_SOCKET_UNLOCK(so, 1); - } -#endif - } } static void @@ -2789,7 +2806,7 @@ sctp_notify_peer_addr_change(struct sctp_tcb *stcb, uint32_t state, static void -sctp_notify_send_failed(struct sctp_tcb *stcb, uint32_t error, +sctp_notify_send_failed(struct sctp_tcb *stcb, uint8_t sent, uint32_t error, struct sctp_tmit_chunk *chk, int so_locked #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) SCTP_UNUSED @@ -2798,39 +2815,68 @@ sctp_notify_send_failed(struct sctp_tcb *stcb, uint32_t error, { struct mbuf *m_notify; struct sctp_send_failed *ssf; + struct sctp_send_failed_event *ssfe; struct sctp_queued_to_read *control; int length; if ((stcb == NULL) || - sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSENDFAILEVNT)) { + (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSENDFAILEVNT) && + sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT))) { /* event not enabled */ return; } - m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_send_failed), 0, M_DONTWAIT, 1, MT_DATA); + if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) { + length = sizeof(struct sctp_send_failed_event); + } else { + length = sizeof(struct sctp_send_failed); + } + m_notify = sctp_get_mbuf_for_msg(length, 0, M_DONTWAIT, 1, MT_DATA); if (m_notify == NULL) /* no space left */ return; - length = sizeof(struct sctp_send_failed) + chk->send_size; + length += chk->send_size; length -= sizeof(struct sctp_data_chunk); SCTP_BUF_LEN(m_notify) = 0; - ssf = mtod(m_notify, struct sctp_send_failed *); - ssf->ssf_type = SCTP_SEND_FAILED; - if (error == SCTP_NOTIFY_DATAGRAM_UNSENT) - ssf->ssf_flags = SCTP_DATA_UNSENT; - else - ssf->ssf_flags = SCTP_DATA_SENT; - ssf->ssf_length = length; - ssf->ssf_error = error; - /* not exactly what the user sent in, but should be close :) */ - bzero(&ssf->ssf_info, sizeof(ssf->ssf_info)); - ssf->ssf_info.sinfo_stream = chk->rec.data.stream_number; - ssf->ssf_info.sinfo_ssn = chk->rec.data.stream_seq; - ssf->ssf_info.sinfo_flags = chk->rec.data.rcv_flags; - ssf->ssf_info.sinfo_ppid = chk->rec.data.payloadtype; - ssf->ssf_info.sinfo_context = chk->rec.data.context; - ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb); - ssf->ssf_assoc_id = sctp_get_associd(stcb); - + if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) { + ssfe = mtod(m_notify, struct sctp_send_failed_event *); + ssfe->ssfe_type = SCTP_SEND_FAILED_EVENT; + if (sent) { + ssfe->ssfe_flags = SCTP_DATA_SENT; + } else { + ssfe->ssfe_flags = SCTP_DATA_UNSENT; + } + ssfe->ssfe_length = length; + ssfe->ssfe_error = error; + /* not exactly what the user sent in, but should be close :) */ + bzero(&ssfe->ssfe_info, sizeof(ssfe->ssfe_info)); + ssfe->ssfe_info.snd_sid = chk->rec.data.stream_number; + ssfe->ssfe_info.snd_flags = chk->rec.data.rcv_flags; + ssfe->ssfe_info.snd_ppid = chk->rec.data.payloadtype; + ssfe->ssfe_info.snd_context = chk->rec.data.context; + ssfe->ssfe_info.snd_assoc_id = sctp_get_associd(stcb); + ssfe->ssfe_assoc_id = sctp_get_associd(stcb); + SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_send_failed_event); + } else { + ssf = mtod(m_notify, struct sctp_send_failed *); + ssf->ssf_type = SCTP_SEND_FAILED; + if (sent) { + ssf->ssf_flags = SCTP_DATA_SENT; + } else { + ssf->ssf_flags = SCTP_DATA_UNSENT; + } + ssf->ssf_length = length; + ssf->ssf_error = error; + /* not exactly what the user sent in, but should be close :) */ + bzero(&ssf->ssf_info, sizeof(ssf->ssf_info)); + ssf->ssf_info.sinfo_stream = chk->rec.data.stream_number; + ssf->ssf_info.sinfo_ssn = chk->rec.data.stream_seq; + ssf->ssf_info.sinfo_flags = chk->rec.data.rcv_flags; + ssf->ssf_info.sinfo_ppid = chk->rec.data.payloadtype; + ssf->ssf_info.sinfo_context = chk->rec.data.context; + ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb); + ssf->ssf_assoc_id = sctp_get_associd(stcb); + SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_send_failed); + } if (chk->data) { /* * trim off the sctp chunk header(it should be there) @@ -2842,7 +2888,6 @@ sctp_notify_send_failed(struct sctp_tcb *stcb, uint32_t error, } } SCTP_BUF_NEXT(m_notify) = chk->data; - SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_send_failed); /* Steal off the mbuf */ chk->data = NULL; /* @@ -2882,43 +2927,69 @@ sctp_notify_send_failed2(struct sctp_tcb *stcb, uint32_t error, { struct mbuf *m_notify; struct sctp_send_failed *ssf; + struct sctp_send_failed_event *ssfe; struct sctp_queued_to_read *control; int length; if ((stcb == NULL) || - sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSENDFAILEVNT)) { + (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSENDFAILEVNT) && + sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT))) { /* event not enabled */ return; } - length = sizeof(struct sctp_send_failed) + sp->length; - m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_send_failed), 0, M_DONTWAIT, 1, MT_DATA); - if (m_notify == NULL) + if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) { + length = sizeof(struct sctp_send_failed_event); + } else { + length = sizeof(struct sctp_send_failed); + } + m_notify = sctp_get_mbuf_for_msg(length, 0, M_DONTWAIT, 1, MT_DATA); + if (m_notify == NULL) { /* no space left */ return; - SCTP_BUF_LEN(m_notify) = 0; - ssf = mtod(m_notify, struct sctp_send_failed *); - ssf->ssf_type = SCTP_SEND_FAILED; - if (error == SCTP_NOTIFY_DATAGRAM_UNSENT) - ssf->ssf_flags = SCTP_DATA_UNSENT; - else - ssf->ssf_flags = SCTP_DATA_SENT; - ssf->ssf_length = length; - ssf->ssf_error = error; - /* not exactly what the user sent in, but should be close :) */ - bzero(&ssf->ssf_info, sizeof(ssf->ssf_info)); - ssf->ssf_info.sinfo_stream = sp->stream; - ssf->ssf_info.sinfo_ssn = sp->strseq; - if (sp->some_taken) { - ssf->ssf_info.sinfo_flags = SCTP_DATA_LAST_FRAG; - } else { - ssf->ssf_info.sinfo_flags = SCTP_DATA_NOT_FRAG; } - ssf->ssf_info.sinfo_ppid = sp->ppid; - ssf->ssf_info.sinfo_context = sp->context; - ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb); - ssf->ssf_assoc_id = sctp_get_associd(stcb); + length += sp->length; + SCTP_BUF_LEN(m_notify) = 0; + if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) { + ssfe = mtod(m_notify, struct sctp_send_failed_event *); + ssfe->ssfe_type = SCTP_SEND_FAILED; + ssfe->ssfe_flags = SCTP_DATA_UNSENT; + ssfe->ssfe_length = length; + ssfe->ssfe_error = error; + /* not exactly what the user sent in, but should be close :) */ + bzero(&ssfe->ssfe_info, sizeof(ssfe->ssfe_info)); + ssfe->ssfe_info.snd_sid = sp->stream; + if (sp->some_taken) { + ssfe->ssfe_info.snd_flags = SCTP_DATA_LAST_FRAG; + } else { + ssfe->ssfe_info.snd_flags = SCTP_DATA_NOT_FRAG; + } + ssfe->ssfe_info.snd_ppid = sp->ppid; + ssfe->ssfe_info.snd_context = sp->context; + ssfe->ssfe_info.snd_assoc_id = sctp_get_associd(stcb); + ssfe->ssfe_assoc_id = sctp_get_associd(stcb); + SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_send_failed_event); + } else { + ssf = mtod(m_notify, struct sctp_send_failed *); + ssf->ssf_type = SCTP_SEND_FAILED; + ssf->ssf_flags = SCTP_DATA_UNSENT; + ssf->ssf_length = length; + ssf->ssf_error = error; + /* not exactly what the user sent in, but should be close :) */ + bzero(&ssf->ssf_info, sizeof(ssf->ssf_info)); + ssf->ssf_info.sinfo_stream = sp->stream; + ssf->ssf_info.sinfo_ssn = sp->strseq; + if (sp->some_taken) { + ssf->ssf_info.sinfo_flags = SCTP_DATA_LAST_FRAG; + } else { + ssf->ssf_info.sinfo_flags = SCTP_DATA_NOT_FRAG; + } + ssf->ssf_info.sinfo_ppid = sp->ppid; + ssf->ssf_info.sinfo_context = sp->context; + ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb); + ssf->ssf_assoc_id = sctp_get_associd(stcb); + SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_send_failed); + } SCTP_BUF_NEXT(m_notify) = sp->data; - SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_send_failed); /* Steal off the mbuf */ sp->data = NULL; @@ -3063,7 +3134,7 @@ sctp_notify_partial_delivery_indication(struct sctp_tcb *stcb, uint32_t error, } if (stcb->sctp_ep && stcb->sctp_socket) { /* This should always be the case */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; so = SCTP_INP_SO(stcb->sctp_ep); @@ -3080,7 +3151,7 @@ sctp_notify_partial_delivery_indication(struct sctp_tcb *stcb, uint32_t error, } #endif sctp_sorwakeup(stcb->sctp_ep, stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) if (!so_locked) { SCTP_SOCKET_UNLOCK(so, 1); } @@ -3102,7 +3173,7 @@ sctp_notify_shutdown_event(struct sctp_tcb *stcb) if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { /* mark socket closed for read/write and wakeup! */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; so = SCTP_INP_SO(stcb->sctp_ep); @@ -3117,7 +3188,7 @@ sctp_notify_shutdown_event(struct sctp_tcb *stcb) } #endif socantsendmore(stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } @@ -3214,7 +3285,8 @@ sctp_notify_stream_reset_add(struct sctp_tcb *stcb, uint16_t numberin, uint16_t struct sctp_stream_change_event *stradd; int len; - if (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_STREAM_RESETEVNT)) { + if ((stcb == NULL) || + (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_STREAM_CHANGEEVNT))) { /* event not enabled */ return; } @@ -3275,7 +3347,8 @@ sctp_notify_stream_reset_tsn(struct sctp_tcb *stcb, uint32_t sending_tsn, uint32 struct sctp_assoc_reset_event *strasoc; int len; - if (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_STREAM_RESETEVNT)) { + if ((stcb == NULL) || + (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_ASSOC_RESETEVNT))) { /* event not enabled */ return; } @@ -3333,7 +3406,8 @@ sctp_notify_stream_reset(struct sctp_tcb *stcb, struct sctp_stream_reset_event *strreset; int len; - if (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_STREAM_RESETEVNT)) { + if ((stcb == NULL) || + (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_STREAM_RESETEVNT))) { /* event not enabled */ return; } @@ -3386,6 +3460,63 @@ sctp_notify_stream_reset(struct sctp_tcb *stcb, } +static void +sctp_notify_remote_error(struct sctp_tcb *stcb, uint16_t error, struct sctp_error_chunk *chunk) +{ + struct mbuf *m_notify; + struct sctp_remote_error *sre; + struct sctp_queued_to_read *control; + size_t notif_len, chunk_len; + + if ((stcb == NULL) || + sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVPEERERR)) { + return; + } + if (chunk != NULL) { + chunk_len = htons(chunk->ch.chunk_length); + } else { + chunk_len = 0; + } + notif_len = sizeof(struct sctp_remote_error) + chunk_len; + m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_DONTWAIT, 1, MT_DATA); + if (m_notify == NULL) { + /* Retry with smaller value. */ + notif_len = sizeof(struct sctp_remote_error); + m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_DONTWAIT, 1, MT_DATA); + if (m_notify == NULL) { + return; + } + } + SCTP_BUF_NEXT(m_notify) = NULL; + sre = mtod(m_notify, struct sctp_remote_error *); + sre->sre_type = SCTP_REMOTE_ERROR; + sre->sre_flags = 0; + sre->sre_length = sizeof(struct sctp_remote_error); + sre->sre_error = error; + sre->sre_assoc_id = sctp_get_associd(stcb); + if (notif_len > sizeof(struct sctp_remote_error)) { + memcpy(sre->sre_data, chunk, chunk_len); + sre->sre_length += chunk_len; + } + SCTP_BUF_LEN(m_notify) = sre->sre_length; + control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, + 0, 0, stcb->asoc.context, 0, 0, 0, + m_notify); + if (control != NULL) { + control->length = SCTP_BUF_LEN(m_notify); + /* not that we need this */ + control->tail_mbuf = m_notify; + control->spec_flags = M_NOTIFICATION; + sctp_add_to_readq(stcb->sctp_ep, stcb, + control, + &stcb->sctp_socket->so_rcv, 1, + SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); + } else { + sctp_m_freem(m_notify); + } +} + + void sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, uint32_t error, void *data, int so_locked @@ -3416,7 +3547,7 @@ sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, switch (notification) { case SCTP_NOTIFY_ASSOC_UP: if (stcb->asoc.assoc_up_sent == 0) { - sctp_notify_assoc_change(SCTP_COMM_UP, stcb, error, so_locked); + sctp_notify_assoc_change(SCTP_COMM_UP, stcb, error, NULL, 0, so_locked); stcb->asoc.assoc_up_sent = 1; } if (stcb->asoc.adaptation_needed && (stcb->asoc.adaptation_sent == 0)) { @@ -3428,7 +3559,7 @@ sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, } break; case SCTP_NOTIFY_ASSOC_DOWN: - sctp_notify_assoc_change(SCTP_SHUTDOWN_COMP, stcb, error, so_locked); + sctp_notify_assoc_change(SCTP_SHUTDOWN_COMP, stcb, error, NULL, 0, so_locked); break; case SCTP_NOTIFY_INTERFACE_DOWN: { @@ -3461,8 +3592,12 @@ sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, sctp_notify_send_failed2(stcb, error, (struct sctp_stream_queue_pending *)data, so_locked); break; - case SCTP_NOTIFY_DG_FAIL: - sctp_notify_send_failed(stcb, error, + case SCTP_NOTIFY_SENT_DG_FAIL: + sctp_notify_send_failed(stcb, 1, error, + (struct sctp_tmit_chunk *)data, so_locked); + break; + case SCTP_NOTIFY_UNSENT_DG_FAIL: + sctp_notify_send_failed(stcb, 0, error, (struct sctp_tmit_chunk *)data, so_locked); break; case SCTP_NOTIFY_PARTIAL_DELVIERY_INDICATION: @@ -3474,29 +3609,29 @@ sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, sctp_notify_partial_delivery_indication(stcb, error, val, so_locked); break; } - case SCTP_NOTIFY_STRDATA_ERR: - break; - case SCTP_NOTIFY_ASSOC_ABORTED: + case SCTP_NOTIFY_ASSOC_LOC_ABORTED: if ((stcb) && (((stcb->asoc.state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_WAIT) || ((stcb->asoc.state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_ECHOED))) { - sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, so_locked); + sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, 0, so_locked); } else { - sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, so_locked); + sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, 0, so_locked); } break; - case SCTP_NOTIFY_PEER_OPENED_STREAM: - break; - case SCTP_NOTIFY_STREAM_OPENED_OK: + case SCTP_NOTIFY_ASSOC_REM_ABORTED: + if ((stcb) && (((stcb->asoc.state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_WAIT) || + ((stcb->asoc.state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_ECHOED))) { + sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, 1, so_locked); + } else { + sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, 1, so_locked); + } break; case SCTP_NOTIFY_ASSOC_RESTART: - sctp_notify_assoc_change(SCTP_RESTART, stcb, error, so_locked); + sctp_notify_assoc_change(SCTP_RESTART, stcb, error, NULL, 0, so_locked); if (stcb->asoc.peer_supports_auth == 0) { sctp_ulp_notify(SCTP_NOTIFY_NO_PEER_AUTH, stcb, 0, NULL, so_locked); } break; - case SCTP_NOTIFY_HB_RESP: - break; case SCTP_NOTIFY_STR_RESET_SEND: sctp_notify_stream_reset(stcb, error, ((uint16_t *) data), SCTP_STREAM_RESET_OUTGOING_SSN); break; @@ -3507,10 +3642,18 @@ sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, sctp_notify_stream_reset(stcb, error, ((uint16_t *) data), (SCTP_STREAM_RESET_OUTGOING_SSN | SCTP_STREAM_RESET_FAILED)); break; + case SCTP_NOTIFY_STR_RESET_DENIED_OUT: + sctp_notify_stream_reset(stcb, error, ((uint16_t *) data), + (SCTP_STREAM_RESET_OUTGOING_SSN | SCTP_STREAM_RESET_DENIED)); + break; case SCTP_NOTIFY_STR_RESET_FAILED_IN: sctp_notify_stream_reset(stcb, error, ((uint16_t *) data), (SCTP_STREAM_RESET_INCOMING | SCTP_STREAM_RESET_FAILED)); break; + case SCTP_NOTIFY_STR_RESET_DENIED_IN: + sctp_notify_stream_reset(stcb, error, ((uint16_t *) data), + (SCTP_STREAM_RESET_INCOMING | SCTP_STREAM_RESET_DENIED)); + break; case SCTP_NOTIFY_ASCONF_ADD_IP: sctp_notify_peer_addr_change(stcb, SCTP_ADDR_ADDED, data, error); @@ -3523,15 +3666,11 @@ sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, sctp_notify_peer_addr_change(stcb, SCTP_ADDR_MADE_PRIM, data, error); break; - case SCTP_NOTIFY_ASCONF_SUCCESS: - break; - case SCTP_NOTIFY_ASCONF_FAILED: - break; case SCTP_NOTIFY_PEER_SHUTDOWN: sctp_notify_shutdown_event(stcb); break; case SCTP_NOTIFY_AUTH_NEW_KEY: - sctp_notify_authentication(stcb, SCTP_AUTH_NEWKEY, error, + sctp_notify_authentication(stcb, SCTP_AUTH_NEW_KEY, error, (uint16_t) (uintptr_t) data, so_locked); break; @@ -3548,6 +3687,9 @@ sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, case SCTP_NOTIFY_SENDER_DRY: sctp_notify_sender_dry_event(stcb, so_locked); break; + case SCTP_NOTIFY_REMOTE_ERROR: + sctp_notify_remote_error(stcb, error, data); + break; default: SCTPDBG(SCTP_DEBUG_UTIL1, "%s: unknown notification %xh (%u)\n", __FUNCTION__, notification, notification); @@ -3556,7 +3698,7 @@ sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, } void -sctp_report_all_outbound(struct sctp_tcb *stcb, int holds_lock, int so_locked +sctp_report_all_outbound(struct sctp_tcb *stcb, uint16_t error, int holds_lock, int so_locked #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) SCTP_UNUSED #endif @@ -3591,8 +3733,8 @@ sctp_report_all_outbound(struct sctp_tcb *stcb, int holds_lock, int so_locked asoc->sent_queue_cnt--; if (chk->data != NULL) { sctp_free_bufspace(stcb, asoc, chk, 1); - sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb, - SCTP_NOTIFY_DATAGRAM_SENT, chk, so_locked); + sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, + error, chk, so_locked); if (chk->data) { sctp_m_freem(chk->data); chk->data = NULL; @@ -3607,8 +3749,8 @@ sctp_report_all_outbound(struct sctp_tcb *stcb, int holds_lock, int so_locked asoc->send_queue_cnt--; if (chk->data != NULL) { sctp_free_bufspace(stcb, asoc, chk, 1); - sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb, - SCTP_NOTIFY_DATAGRAM_UNSENT, chk, so_locked); + sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, + error, chk, so_locked); if (chk->data) { sctp_m_freem(chk->data); chk->data = NULL; @@ -3628,7 +3770,7 @@ sctp_report_all_outbound(struct sctp_tcb *stcb, int holds_lock, int so_locked sctp_free_spbufspace(stcb, asoc, sp); if (sp->data) { sctp_ulp_notify(SCTP_NOTIFY_SPECIAL_SP_FAIL, stcb, - SCTP_NOTIFY_DATAGRAM_UNSENT, (void *)sp, so_locked); + error, (void *)sp, so_locked); if (sp->data) { sctp_m_freem(sp->data); sp->data = NULL; @@ -3650,7 +3792,8 @@ sctp_report_all_outbound(struct sctp_tcb *stcb, int holds_lock, int so_locked } void -sctp_abort_notification(struct sctp_tcb *stcb, int error, int so_locked +sctp_abort_notification(struct sctp_tcb *stcb, uint8_t from_peer, uint16_t error, + struct sctp_abort_chunk *abort, int so_locked #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) SCTP_UNUSED #endif @@ -3670,18 +3813,25 @@ sctp_abort_notification(struct sctp_tcb *stcb, int error, int so_locked return; } /* Tell them we lost the asoc */ - sctp_report_all_outbound(stcb, 1, so_locked); - sctp_ulp_notify(SCTP_NOTIFY_ASSOC_ABORTED, stcb, error, NULL, so_locked); + sctp_report_all_outbound(stcb, error, 1, so_locked); + if (from_peer) { + sctp_ulp_notify(SCTP_NOTIFY_ASSOC_REM_ABORTED, stcb, error, abort, so_locked); + } else { + sctp_ulp_notify(SCTP_NOTIFY_ASSOC_LOC_ABORTED, stcb, error, abort, so_locked); + } } void sctp_abort_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, - struct mbuf *m, int iphlen, struct sctphdr *sh, struct mbuf *op_err, + struct mbuf *m, int iphlen, + struct sockaddr *src, struct sockaddr *dst, + struct sctphdr *sh, struct mbuf *op_err, + uint8_t use_mflowid, uint32_t mflowid, uint32_t vrf_id, uint16_t port) { uint32_t vtag; -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif @@ -3690,15 +3840,17 @@ sctp_abort_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, if (stcb != NULL) { /* We have a TCB to abort, send notification too */ vtag = stcb->asoc.peer_vtag; - sctp_abort_notification(stcb, 0, SCTP_SO_NOT_LOCKED); + sctp_abort_notification(stcb, 0, 0, NULL, SCTP_SO_NOT_LOCKED); /* get the assoc vrf id and table id */ vrf_id = stcb->asoc.vrf_id; stcb->asoc.state |= SCTP_STATE_WAS_ABORTED; } - sctp_send_abort(m, iphlen, sh, vtag, op_err, vrf_id, port); + sctp_send_abort(m, iphlen, src, dst, sh, vtag, op_err, + use_mflowid, mflowid, + vrf_id, port); if (stcb != NULL) { /* Ok, now lets free it */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(inp); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -3712,7 +3864,7 @@ sctp_abort_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, SCTP_STAT_DECR_GAUGE32(sctps_currestab); } (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTPUTIL + SCTP_LOC_4); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } @@ -3784,19 +3936,19 @@ none_in: void sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, - int error, struct mbuf *op_err, + struct mbuf *op_err, int so_locked #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) SCTP_UNUSED #endif ) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(inp); #endif if (stcb == NULL) { @@ -3812,12 +3964,10 @@ sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, stcb->asoc.state |= SCTP_STATE_WAS_ABORTED; } /* notify the ulp */ - if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) - sctp_abort_notification(stcb, error, so_locked); + if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) { + sctp_abort_notification(stcb, 0, 0, NULL, so_locked); + } /* notify the peer */ -#if defined(SCTP_PANIC_ON_ABORT) - panic("aborting an association"); -#endif sctp_send_abort_tcb(stcb, op_err, so_locked); SCTP_STAT_INCR_COUNTER32(sctps_aborted); if ((SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_OPEN) || @@ -3828,7 +3978,7 @@ sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, #ifdef SCTP_ASOCLOG_OF_TSNS sctp_print_out_track_log(stcb); #endif -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) if (!so_locked) { atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -3838,7 +3988,7 @@ sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, } #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTPUTIL + SCTP_LOC_5); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) if (!so_locked) { SCTP_SOCKET_UNLOCK(so, 1); } @@ -3846,8 +3996,11 @@ sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, } void -sctp_handle_ootb(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh, - struct sctp_inpcb *inp, struct mbuf *op_err, uint32_t vrf_id, uint16_t port) +sctp_handle_ootb(struct mbuf *m, int iphlen, int offset, + struct sockaddr *src, struct sockaddr *dst, + struct sctphdr *sh, struct sctp_inpcb *inp, + uint8_t use_mflowid, uint32_t mflowid, + uint32_t vrf_id, uint16_t port) { struct sctp_chunkhdr *ch, chunk_buf; unsigned int chk_length; @@ -3890,7 +4043,9 @@ sctp_handle_ootb(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh, */ return; case SCTP_SHUTDOWN_ACK: - sctp_send_shutdown_complete2(m, sh, vrf_id, port); + sctp_send_shutdown_complete2(src, dst, sh, + use_mflowid, mflowid, + vrf_id, port); return; default: break; @@ -3902,7 +4057,9 @@ sctp_handle_ootb(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh, if ((SCTP_BASE_SYSCTL(sctp_blackhole) == 0) || ((SCTP_BASE_SYSCTL(sctp_blackhole) == 1) && (contains_init_chunk == 0))) { - sctp_send_abort(m, iphlen, sh, 0, op_err, vrf_id, port); + sctp_send_abort(m, iphlen, src, dst, sh, 0, NULL, + use_mflowid, mflowid, + vrf_id, port); } } @@ -4092,62 +4249,6 @@ sctp_print_address(struct sockaddr *sa) } } -void -sctp_print_address_pkt(struct ip *iph, struct sctphdr *sh) -{ - switch (iph->ip_v) { -#ifdef INET - case IPVERSION: - { - struct sockaddr_in lsa, fsa; - - bzero(&lsa, sizeof(lsa)); - lsa.sin_len = sizeof(lsa); - lsa.sin_family = AF_INET; - lsa.sin_addr = iph->ip_src; - lsa.sin_port = sh->src_port; - bzero(&fsa, sizeof(fsa)); - fsa.sin_len = sizeof(fsa); - fsa.sin_family = AF_INET; - fsa.sin_addr = iph->ip_dst; - fsa.sin_port = sh->dest_port; - SCTP_PRINTF("src: "); - sctp_print_address((struct sockaddr *)&lsa); - SCTP_PRINTF("dest: "); - sctp_print_address((struct sockaddr *)&fsa); - break; - } -#endif -#ifdef INET6 - case IPV6_VERSION >> 4: - { - struct ip6_hdr *ip6; - struct sockaddr_in6 lsa6, fsa6; - - ip6 = (struct ip6_hdr *)iph; - bzero(&lsa6, sizeof(lsa6)); - lsa6.sin6_len = sizeof(lsa6); - lsa6.sin6_family = AF_INET6; - lsa6.sin6_addr = ip6->ip6_src; - lsa6.sin6_port = sh->src_port; - bzero(&fsa6, sizeof(fsa6)); - fsa6.sin6_len = sizeof(fsa6); - fsa6.sin6_family = AF_INET6; - fsa6.sin6_addr = ip6->ip6_dst; - fsa6.sin6_port = sh->dest_port; - SCTP_PRINTF("src: "); - sctp_print_address((struct sockaddr *)&lsa6); - SCTP_PRINTF("dest: "); - sctp_print_address((struct sockaddr *)&fsa6); - break; - } -#endif - default: - /* TSNH */ - break; - } -} - void sctp_pull_off_control_to_new_inp(struct sctp_inpcb *old_inp, struct sctp_inpcb *new_inp, @@ -4320,7 +4421,7 @@ sctp_add_to_readq(struct sctp_inpcb *inp, if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_ZERO_COPY_ACTIVE)) { SCTP_ZERO_COPY_EVENT(inp, inp->sctp_socket); } else { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; so = SCTP_INP_SO(inp); @@ -4341,7 +4442,7 @@ sctp_add_to_readq(struct sctp_inpcb *inp, } #endif sctp_sorwakeup(inp, inp->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) if (!so_locked) { SCTP_SOCKET_UNLOCK(so, 1); } @@ -4474,7 +4575,7 @@ get_out: if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_ZERO_COPY_ACTIVE)) { SCTP_ZERO_COPY_EVENT(inp, inp->sctp_socket); } else { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; so = SCTP_INP_SO(inp); @@ -4493,7 +4594,7 @@ get_out: } #endif sctp_sorwakeup(inp, inp->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); #endif } @@ -4566,7 +4667,7 @@ sctp_free_bufspace(struct sctp_tcb *stcb, struct sctp_association *asoc, int sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1, - int reason, int so_locked + uint8_t sent, int so_locked #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) SCTP_UNUSED #endif @@ -4593,7 +4694,11 @@ sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1, sctp_free_bufspace(stcb, &stcb->asoc, tp1, 1); stcb->asoc.peers_rwnd += tp1->send_size; stcb->asoc.peers_rwnd += SCTP_BASE_SYSCTL(sctp_peer_chunk_oh); - sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb, reason, tp1, so_locked); + if (sent) { + sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, 0, tp1, so_locked); + } else { + sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, 0, tp1, so_locked); + } if (tp1->data) { sctp_m_freem(tp1->data); tp1->data = NULL; @@ -4640,7 +4745,11 @@ sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1, chk = tp1; ret_sz += tp1->book_size; sctp_free_bufspace(stcb, &stcb->asoc, tp1, 1); - sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb, reason, tp1, so_locked); + if (sent) { + sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, 0, tp1, so_locked); + } else { + sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, 0, tp1, so_locked); + } if (tp1->data) { sctp_m_freem(tp1->data); tp1->data = NULL; @@ -4742,7 +4851,7 @@ sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1, SCTP_TCB_SEND_UNLOCK(stcb); } if (do_wakeup_routine) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; so = SCTP_INP_SO(stcb->sctp_ep); @@ -4760,7 +4869,7 @@ sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1, } #endif sctp_sowwakeup(stcb->sctp_ep, stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) if (!so_locked) { SCTP_SOCKET_UNLOCK(so, 1); } @@ -5115,7 +5224,7 @@ restart_nosblocks: (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { goto out; } - if (so->so_rcv.sb_state & SBS_CANTRCVMORE) { + if ((so->so_rcv.sb_state & SBS_CANTRCVMORE) && (so->so_rcv.sb_cc == 0)) { if (so->so_error) { error = so->so_error; if ((in_flags & MSG_PEEK) == 0) @@ -5123,7 +5232,6 @@ restart_nosblocks: goto out; } else { if (so->so_rcv.sb_cc == 0) { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, ENOTCONN); /* indicate EOF */ error = 0; goto out; @@ -5392,7 +5500,7 @@ found_one: #ifdef INVARIANTS panic("refcnt already incremented"); #else - printf("refcnt already incremented?\n"); + SCTP_PRINTF("refcnt already incremented?\n"); #endif } else { atomic_add_int(&stcb->asoc.refcnt, 1); @@ -6675,83 +6783,61 @@ sctp_recv_udp_tunneled_packet(struct mbuf *m, int off, struct inpcb *ignored) struct ip *iph; struct mbuf *sp, *last; struct udphdr *uhdr; - uint16_t port = 0; - int header_size = sizeof(struct udphdr) + sizeof(struct sctphdr); + uint16_t port; - /* - * Split out the mbuf chain. Leave the IP header in m, place the - * rest in the sp. - */ if ((m->m_flags & M_PKTHDR) == 0) { /* Can't handle one that is not a pkt hdr */ goto out; } - /* pull the src port */ + /* Pull the src port */ iph = mtod(m, struct ip *); uhdr = (struct udphdr *)((caddr_t)iph + off); - port = uhdr->uh_sport; + /* + * Split out the mbuf chain. Leave the IP header in m, place the + * rest in the sp. + */ sp = m_split(m, off, M_DONTWAIT); if (sp == NULL) { /* Gak, drop packet, we can't do a split */ goto out; } - if (sp->m_pkthdr.len < header_size) { - /* Gak, packet can't have an SCTP header in it - to small */ + if (sp->m_pkthdr.len < sizeof(struct udphdr) + sizeof(struct sctphdr)) { + /* Gak, packet can't have an SCTP header in it - too small */ m_freem(sp); goto out; } - /* ok now pull up the UDP header and SCTP header together */ - sp = m_pullup(sp, header_size); + /* Now pull up the UDP header and SCTP header together */ + sp = m_pullup(sp, sizeof(struct udphdr) + sizeof(struct sctphdr)); if (sp == NULL) { /* Gak pullup failed */ goto out; } - /* trim out the UDP header */ + /* Trim out the UDP header */ m_adj(sp, sizeof(struct udphdr)); /* Now reconstruct the mbuf chain */ - /* 1) find last one */ - last = m; - while (last->m_next != NULL) { - last = last->m_next; - } + for (last = m; last->m_next; last = last->m_next); last->m_next = sp; m->m_pkthdr.len += sp->m_pkthdr.len; - last = m; - while (last != NULL) { - last = last->m_next; - } - /* Now its ready for sctp_input or sctp6_input */ iph = mtod(m, struct ip *); switch (iph->ip_v) { #ifdef INET case IPVERSION: - { - uint16_t len; - - /* its IPv4 */ - len = SCTP_GET_IPV4_LENGTH(iph); - len -= sizeof(struct udphdr); - SCTP_GET_IPV4_LENGTH(iph) = len; - sctp_input_with_port(m, off, port); - break; - } + iph->ip_len -= sizeof(struct udphdr); + sctp_input_with_port(m, off, port); + break; #endif #ifdef INET6 case IPV6_VERSION >> 4: - { - /* its IPv6 - NOT supported */ - goto out; - break; + /* Not yet supported. */ + goto out; + break; - } #endif default: - { - m_freem(m); - break; - } + goto out; + break; } return; out: diff --git a/sys/netinet/sctputil.h b/sys/netinet/sctputil.h index 495b17adcf6..3ced6c5c8f3 100644 --- a/sys/netinet/sctputil.h +++ b/sys/netinet/sctputil.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -30,14 +30,11 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ - -/* $KAME: sctputil.h,v 1.15 2005/03/06 16:04:19 itojun Exp $ */ - #include __FBSDID("$FreeBSD$"); -#ifndef __sctputil_h__ -#define __sctputil_h__ +#ifndef _NETINET_SCTP_UTIL_H_ +#define _NETINET_SCTP_UTIL_H_ #if defined(_KERNEL) || defined(__Userspace__) @@ -170,7 +167,7 @@ sctp_pull_off_control_to_new_inp(struct sctp_inpcb *old_inp, void sctp_stop_timers_for_shutdown(struct sctp_tcb *); void -sctp_report_all_outbound(struct sctp_tcb *, int, int +sctp_report_all_outbound(struct sctp_tcb *, uint16_t, int, int #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) SCTP_UNUSED #endif @@ -179,7 +176,8 @@ sctp_report_all_outbound(struct sctp_tcb *, int, int int sctp_expand_mapping_array(struct sctp_association *, uint32_t); void -sctp_abort_notification(struct sctp_tcb *, int, int +sctp_abort_notification(struct sctp_tcb *, uint8_t, uint16_t, + struct sctp_abort_chunk *, int #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) SCTP_UNUSED #endif @@ -187,13 +185,16 @@ sctp_abort_notification(struct sctp_tcb *, int, int /* We abort responding to an IP packet for some reason */ void -sctp_abort_association(struct sctp_inpcb *, struct sctp_tcb *, - struct mbuf *, int, struct sctphdr *, struct mbuf *, uint32_t, uint16_t); +sctp_abort_association(struct sctp_inpcb *, struct sctp_tcb *, struct mbuf *, + int, struct sockaddr *, struct sockaddr *, + struct sctphdr *, struct mbuf *, + uint8_t, uint32_t, + uint32_t, uint16_t); /* We choose to abort via user input */ void -sctp_abort_an_association(struct sctp_inpcb *, struct sctp_tcb *, int, +sctp_abort_an_association(struct sctp_inpcb *, struct sctp_tcb *, struct mbuf *, int #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) SCTP_UNUSED @@ -201,8 +202,11 @@ sctp_abort_an_association(struct sctp_inpcb *, struct sctp_tcb *, int, ); void -sctp_handle_ootb(struct mbuf *, int, int, struct sctphdr *, - struct sctp_inpcb *, struct mbuf *, uint32_t, uint16_t); +sctp_handle_ootb(struct mbuf *, int, int, + struct sockaddr *, struct sockaddr *, + struct sctphdr *, struct sctp_inpcb *, + uint8_t, uint32_t, + uint32_t, uint16_t); int sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr, @@ -239,11 +243,10 @@ struct sockaddr_in6 * int sctp_cmpaddr(struct sockaddr *, struct sockaddr *); void sctp_print_address(struct sockaddr *); -void sctp_print_address_pkt(struct ip *, struct sctphdr *); int sctp_release_pr_sctp_chunk(struct sctp_tcb *, struct sctp_tmit_chunk *, - int, int + uint8_t, int #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) SCTP_UNUSED #endif @@ -383,7 +386,5 @@ sctp_auditing(int, struct sctp_inpcb *, struct sctp_tcb *, void sctp_audit_log(uint8_t, uint8_t); #endif - - #endif /* _KERNEL */ #endif diff --git a/sys/netinet/tcp_hostcache.c b/sys/netinet/tcp_hostcache.c index f9b78e6208c..5e5f799049c 100644 --- a/sys/netinet/tcp_hostcache.c +++ b/sys/netinet/tcp_hostcache.c @@ -624,7 +624,7 @@ sysctl_tcp_hc_list(SYSCTL_HANDLER_ARGS) msec(hc_entry->rmx_rtt * (RTM_RTTUNIT / (hz * TCP_RTT_SCALE))), msec(hc_entry->rmx_rttvar * - (RTM_RTTUNIT / (hz * TCP_RTT_SCALE))), + (RTM_RTTUNIT / (hz * TCP_RTTVAR_SCALE))), hc_entry->rmx_bandwidth * 8, hc_entry->rmx_cwnd, hc_entry->rmx_sendpipe, diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index 7c8310f280b..6d8ebee89ff 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -105,6 +105,9 @@ __FBSDID("$FreeBSD$"); #ifdef TCPDEBUG #include #endif /* TCPDEBUG */ +#ifdef TCP_OFFLOAD +#include +#endif #ifdef IPSEC #include @@ -512,6 +515,8 @@ tcp6_input(struct mbuf **mp, int *offp, int proto) (caddr_t)&ip6->ip6_dst - (caddr_t)ip6); return IPPROTO_DONE; } + if (ia6) + ifa_free(&ia6->ia_ifa); tcp_input(m, *offp); return IPPROTO_DONE; @@ -577,13 +582,31 @@ tcp_input(struct mbuf *m, int off0) #ifdef INET6 if (isipv6) { /* IP6_EXTHDR_CHECK() is already done at tcp6_input(). */ + + if (m->m_len < (sizeof(*ip6) + sizeof(*th))) { + m = m_pullup(m, sizeof(*ip6) + sizeof(*th)); + if (m == NULL) { + TCPSTAT_INC(tcps_rcvshort); + return; + } + } + ip6 = mtod(m, struct ip6_hdr *); + th = (struct tcphdr *)((caddr_t)ip6 + off0); tlen = sizeof(*ip6) + ntohs(ip6->ip6_plen) - off0; - if (in6_cksum(m, IPPROTO_TCP, off0, tlen)) { + if (m->m_pkthdr.csum_flags & CSUM_DATA_VALID_IPV6) { + if (m->m_pkthdr.csum_flags & CSUM_PSEUDO_HDR) + th->th_sum = m->m_pkthdr.csum_data; + else + th->th_sum = in6_cksum_pseudo(ip6, tlen, + IPPROTO_TCP, m->m_pkthdr.csum_data); + th->th_sum ^= 0xffff; + } else + th->th_sum = in6_cksum(m, IPPROTO_TCP, off0, tlen); + if (th->th_sum) { TCPSTAT_INC(tcps_rcvbadsum); goto drop; } - th = (struct tcphdr *)((caddr_t)ip6 + off0); /* * Be proactive about unspecified IPv6 address in source. @@ -938,6 +961,14 @@ relocked: goto dropwithreset; } +#ifdef TCP_OFFLOAD + if (tp->t_flags & TF_TOE) { + tcp_offload_input(tp, m); + m = NULL; /* consumed by the TOE driver */ + goto dropunlock; + } +#endif + /* * We've identified a valid inpcb, but it could be that we need an * inpcbinfo write lock but don't hold it. In this case, attempt to @@ -1222,7 +1253,8 @@ relocked: rstreason = BANDLIM_RST_OPENPORT; goto dropwithreset; } - ifa_free(&ia6->ia_ifa); + if (ia6) + ifa_free(&ia6->ia_ifa); } #endif /* INET6 */ /* @@ -1299,7 +1331,7 @@ relocked: (void *)tcp_saveipgen, &tcp_savetcp, 0); #endif tcp_dooptions(&to, optp, optlen, TO_SYN); - syncache_add(&inc, &to, th, inp, &so, m); + syncache_add(&inc, &to, th, inp, &so, m, NULL, NULL); /* * Entry added to syncache and mbuf consumed. * Everything already unlocked by syncache_add(). @@ -3542,7 +3574,6 @@ tcp_mssopt(struct in_conninfo *inc) if (inc->inc_flags & INC_ISIPV6) { mss = V_tcp_v6mssdflt; maxmtu = tcp_maxmtu6(inc, NULL); - thcmtu = tcp_hc_getmtu(inc); /* IPv4 and IPv6 */ min_protoh = sizeof(struct ip6_hdr) + sizeof(struct tcphdr); } #endif @@ -3553,10 +3584,13 @@ tcp_mssopt(struct in_conninfo *inc) { mss = V_tcp_mssdflt; maxmtu = tcp_maxmtu(inc, NULL); - thcmtu = tcp_hc_getmtu(inc); /* IPv4 and IPv6 */ min_protoh = sizeof(struct tcpiphdr); } #endif +#if defined(INET6) || defined(INET) + thcmtu = tcp_hc_getmtu(inc); /* IPv4 and IPv6 */ +#endif + if (maxmtu && thcmtu) mss = min(maxmtu, thcmtu) - min_protoh; else if (maxmtu || thcmtu) diff --git a/sys/netinet/tcp_lro.c b/sys/netinet/tcp_lro.c index 6569eda67a4..3718e4d034a 100644 --- a/sys/netinet/tcp_lro.c +++ b/sys/netinet/tcp_lro.c @@ -1,397 +1,615 @@ -/****************************************************************************** +/*- + * Copyright (c) 2007, Myricom Inc. + * Copyright (c) 2008, Intel Corporation. + * Copyright (c) 2012 The FreeBSD Foundation + * All rights reserved. + * + * Portions of this software were developed by Bjoern Zeeb + * under sponsorship from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ -Copyright (c) 2007, Myricom Inc. -Copyright (c) 2008, Intel Corporation. -All rights reserved. +#include +__FBSDID("$FreeBSD$"); -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Myricom Inc, nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - 3. Neither the name of the Intel Corporation, nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -$FreeBSD$ -***************************************************************************/ +#include "opt_inet.h" +#include "opt_inet6.h" #include #include -#include #include #include #include #include +#include #include -#include +#include #include #include +#include #include +#include #include #include -#include +#include + #include +#ifndef LRO_ENTRIES +#define LRO_ENTRIES 8 /* # of LRO entries per RX queue. */ +#endif -static uint16_t do_csum_data(uint16_t *raw, int len) -{ - uint32_t csum; - csum = 0; - while (len > 0) { - csum += *raw; - raw++; - csum += *raw; - raw++; - len -= 4; - } - csum = (csum >> 16) + (csum & 0xffff); - csum = (csum >> 16) + (csum & 0xffff); - return (uint16_t)csum; -} +#define TCP_LRO_UPDATE_CSUM 1 +#ifndef TCP_LRO_UPDATE_CSUM +#define TCP_LRO_INVALID_CSUM 0x0000 +#endif -/* - * Allocate and init the LRO data structures - */ int -tcp_lro_init(struct lro_ctrl *cntl) +tcp_lro_init(struct lro_ctrl *lc) { - struct lro_entry *lro; - int i, error = 0; + struct lro_entry *le; + int error, i; - SLIST_INIT(&cntl->lro_free); - SLIST_INIT(&cntl->lro_active); - - cntl->lro_bad_csum = 0; - cntl->lro_queued = 0; - cntl->lro_flushed = 0; + lc->lro_bad_csum = 0; + lc->lro_queued = 0; + lc->lro_flushed = 0; + lc->lro_cnt = 0; + SLIST_INIT(&lc->lro_free); + SLIST_INIT(&lc->lro_active); + error = 0; for (i = 0; i < LRO_ENTRIES; i++) { - lro = (struct lro_entry *) malloc(sizeof (struct lro_entry), - M_DEVBUF, M_NOWAIT | M_ZERO); - if (lro == NULL) { + le = (struct lro_entry *)malloc(sizeof(*le), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (le == NULL) { if (i == 0) error = ENOMEM; break; } - cntl->lro_cnt = i; - SLIST_INSERT_HEAD(&cntl->lro_free, lro, next); + lc->lro_cnt = i + 1; + SLIST_INSERT_HEAD(&lc->lro_free, le, next); } return (error); } void -tcp_lro_free(struct lro_ctrl *cntl) +tcp_lro_free(struct lro_ctrl *lc) { - struct lro_entry *entry; + struct lro_entry *le; - while (!SLIST_EMPTY(&cntl->lro_free)) { - entry = SLIST_FIRST(&cntl->lro_free); - SLIST_REMOVE_HEAD(&cntl->lro_free, next); - free(entry, M_DEVBUF); + while (!SLIST_EMPTY(&lc->lro_free)) { + le = SLIST_FIRST(&lc->lro_free); + SLIST_REMOVE_HEAD(&lc->lro_free, next); + free(le, M_DEVBUF); } } +#ifdef TCP_LRO_UPDATE_CSUM +static uint16_t +tcp_lro_csum_th(struct tcphdr *th) +{ + uint32_t ch; + uint16_t *p, l; + + ch = th->th_sum = 0x0000; + l = th->th_off; + p = (uint16_t *)th; + while (l > 0) { + ch += *p; + p++; + ch += *p; + p++; + l--; + } + while (ch > 0xffff) + ch = (ch >> 16) + (ch & 0xffff); + + return (ch & 0xffff); +} + +static uint16_t +tcp_lro_rx_csum_fixup(struct lro_entry *le, void *l3hdr, struct tcphdr *th, + uint16_t tcp_data_len, uint16_t csum) +{ + uint32_t c; + uint16_t cs; + + c = csum; + + /* Remove length from checksum. */ + switch (le->eh_type) { +#ifdef INET6 + case ETHERTYPE_IPV6: + { + struct ip6_hdr *ip6; + + ip6 = (struct ip6_hdr *)l3hdr; + if (le->append_cnt == 0) + cs = ip6->ip6_plen; + else { + uint32_t cx; + + cx = ntohs(ip6->ip6_plen); + cs = in6_cksum_pseudo(ip6, cx, ip6->ip6_nxt, 0); + } + break; + } +#endif +#ifdef INET + case ETHERTYPE_IP: + { + struct ip *ip4; + + ip4 = (struct ip *)l3hdr; + if (le->append_cnt == 0) + cs = ip4->ip_len; + else { + cs = in_addword(ntohs(ip4->ip_len) - sizeof(*ip4), + IPPROTO_TCP); + cs = in_pseudo(ip4->ip_src.s_addr, ip4->ip_dst.s_addr, + htons(cs)); + } + break; + } +#endif + default: + cs = 0; /* Keep compiler happy. */ + } + + cs = ~cs; + c += cs; + + /* Remove TCP header csum. */ + cs = ~tcp_lro_csum_th(th); + c += cs; + while (c > 0xffff) + c = (c >> 16) + (c & 0xffff); + + return (c & 0xffff); +} +#endif + void -tcp_lro_flush(struct lro_ctrl *cntl, struct lro_entry *lro) +tcp_lro_flush(struct lro_ctrl *lc, struct lro_entry *le) { - struct ifnet *ifp; - struct ip *ip; - struct tcphdr *tcp; - uint32_t *ts_ptr; - uint32_t tcplen, tcp_csum; + if (le->append_cnt > 0) { + struct tcphdr *th; + uint16_t p_len; - if (lro->append_cnt) { - /* incorporate the new len into the ip header and - * re-calculate the checksum */ - ip = lro->ip; - ip->ip_len = htons(lro->len - ETHER_HDR_LEN); - ip->ip_sum = 0; - ip->ip_sum = 0xffff ^ - do_csum_data((uint16_t*)ip, - sizeof (*ip)); + p_len = htons(le->p_len); + switch (le->eh_type) { +#ifdef INET6 + case ETHERTYPE_IPV6: + { + struct ip6_hdr *ip6; - lro->m_head->m_pkthdr.csum_flags = CSUM_IP_CHECKED | - CSUM_IP_VALID | CSUM_DATA_VALID | CSUM_PSEUDO_HDR; - lro->m_head->m_pkthdr.csum_data = 0xffff; - lro->m_head->m_pkthdr.len = lro->len; - - /* incorporate the latest ack into the tcp header */ - tcp = (struct tcphdr *) (ip + 1); - tcp->th_ack = lro->ack_seq; - tcp->th_win = lro->window; - /* incorporate latest timestamp into the tcp header */ - if (lro->timestamp) { - ts_ptr = (uint32_t *)(tcp + 1); - ts_ptr[1] = htonl(lro->tsval); - ts_ptr[2] = lro->tsecr; + ip6 = le->le_ip6; + ip6->ip6_plen = p_len; + th = (struct tcphdr *)(ip6 + 1); + le->m_head->m_pkthdr.csum_flags = CSUM_DATA_VALID | + CSUM_PSEUDO_HDR; + le->p_len += ETHER_HDR_LEN + sizeof(*ip6); + break; } - /* - * update checksum in tcp header by re-calculating the - * tcp pseudoheader checksum, and adding it to the checksum - * of the tcp payload data - */ - tcp->th_sum = 0; - tcplen = lro->len - sizeof(*ip) - ETHER_HDR_LEN; - tcp_csum = lro->data_csum; - tcp_csum += in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr, - htons(tcplen + IPPROTO_TCP)); - tcp_csum += do_csum_data((uint16_t*)tcp, - tcp->th_off << 2); - tcp_csum = (tcp_csum & 0xffff) + (tcp_csum >> 16); - tcp_csum = (tcp_csum & 0xffff) + (tcp_csum >> 16); - tcp->th_sum = 0xffff ^ tcp_csum; +#endif +#ifdef INET + case ETHERTYPE_IP: + { + struct ip *ip4; +#ifdef TCP_LRO_UPDATE_CSUM + uint32_t cl; + uint16_t c; +#endif + + ip4 = le->le_ip4; +#ifdef TCP_LRO_UPDATE_CSUM + /* Fix IP header checksum for new length. */ + c = ~ip4->ip_sum; + cl = c; + c = ~ip4->ip_len; + cl += c + p_len; + while (cl > 0xffff) + cl = (cl >> 16) + (cl & 0xffff); + c = cl; + ip4->ip_sum = ~c; +#else + ip4->ip_sum = TCP_LRO_INVALID_CSUM; +#endif + ip4->ip_len = p_len; + th = (struct tcphdr *)(ip4 + 1); + le->m_head->m_pkthdr.csum_flags = CSUM_DATA_VALID | + CSUM_PSEUDO_HDR | CSUM_IP_CHECKED | CSUM_IP_VALID; + le->p_len += ETHER_HDR_LEN; + break; + } +#endif + default: + th = NULL; /* Keep compiler happy. */ + } + le->m_head->m_pkthdr.csum_data = 0xffff; + le->m_head->m_pkthdr.len = le->p_len; + + /* Incorporate the latest ACK into the TCP header. */ + th->th_ack = le->ack_seq; + th->th_win = le->window; + /* Incorporate latest timestamp into the TCP header. */ + if (le->timestamp != 0) { + uint32_t *ts_ptr; + + ts_ptr = (uint32_t *)(th + 1); + ts_ptr[1] = htonl(le->tsval); + ts_ptr[2] = le->tsecr; + } +#ifdef TCP_LRO_UPDATE_CSUM + /* Update the TCP header checksum. */ + le->ulp_csum += p_len; + le->ulp_csum += tcp_lro_csum_th(th); + while (le->ulp_csum > 0xffff) + le->ulp_csum = (le->ulp_csum >> 16) + + (le->ulp_csum & 0xffff); + th->th_sum = (le->ulp_csum & 0xffff); + th->th_sum = ~th->th_sum; +#else + th->th_sum = TCP_LRO_INVALID_CSUM; +#endif } - ifp = cntl->ifp; - (*ifp->if_input)(cntl->ifp, lro->m_head); - cntl->lro_queued += lro->append_cnt + 1; - cntl->lro_flushed++; - lro->m_head = NULL; - lro->timestamp = 0; - lro->append_cnt = 0; - SLIST_INSERT_HEAD(&cntl->lro_free, lro, next); + + (*lc->ifp->if_input)(lc->ifp, le->m_head); + lc->lro_queued += le->append_cnt + 1; + lc->lro_flushed++; + bzero(le, sizeof(*le)); + SLIST_INSERT_HEAD(&lc->lro_free, le, next); } -int -tcp_lro_rx(struct lro_ctrl *cntl, struct mbuf *m_head, uint32_t csum) +#ifdef INET6 +static int +tcp_lro_rx_ipv6(struct lro_ctrl *lc, struct mbuf *m, struct ip6_hdr *ip6, + struct tcphdr **th) { - struct ether_header *eh; - struct ip *ip; - struct tcphdr *tcp; - uint32_t *ts_ptr; - struct mbuf *m_nxt, *m_tail; - struct lro_entry *lro; - int hlen, ip_len, tcp_hdr_len, tcp_data_len, tot_len; - int opt_bytes, trim, csum_flags; - uint32_t seq, tmp_csum, device_mtu; + /* XXX-BZ we should check the flow-label. */ - eh = mtod(m_head, struct ether_header *); - if (eh->ether_type != htons(ETHERTYPE_IP)) - return 1; - ip = (struct ip *) (eh + 1); - if (ip->ip_p != IPPROTO_TCP) - return 1; - - /* ensure there are no options */ - if ((ip->ip_hl << 2) != sizeof (*ip)) - return -1; + /* XXX-BZ We do not yet support ext. hdrs. */ + if (ip6->ip6_nxt != IPPROTO_TCP) + return (TCP_LRO_NOT_SUPPORTED); - /* .. and the packet is not fragmented */ - if (ip->ip_off & htons(IP_MF|IP_OFFMASK)) - return -1; + /* Find the TCP header. */ + *th = (struct tcphdr *)(ip6 + 1); - /* verify that the IP header checksum is correct */ - csum_flags = m_head->m_pkthdr.csum_flags; + return (0); +} +#endif + +#ifdef INET +static int +tcp_lro_rx_ipv4(struct lro_ctrl *lc, struct mbuf *m, struct ip *ip4, + struct tcphdr **th) +{ + int csum_flags; + uint16_t csum; + + if (ip4->ip_p != IPPROTO_TCP) + return (TCP_LRO_NOT_SUPPORTED); + + /* Ensure there are no options. */ + if ((ip4->ip_hl << 2) != sizeof (*ip4)) + return (TCP_LRO_CANNOT); + + /* .. and the packet is not fragmented. */ + if (ip4->ip_off & htons(IP_MF|IP_OFFMASK)) + return (TCP_LRO_CANNOT); + + /* Legacy IP has a header checksum that needs to be correct. */ + csum_flags = m->m_pkthdr.csum_flags; if (csum_flags & CSUM_IP_CHECKED) { if (__predict_false((csum_flags & CSUM_IP_VALID) == 0)) { - cntl->lro_bad_csum++; - return -1; + lc->lro_bad_csum++; + return (TCP_LRO_CANNOT); } } else { - tmp_csum = do_csum_data((uint16_t *)ip, sizeof (*ip)); - if (__predict_false((tmp_csum ^ 0xffff) != 0)) { - cntl->lro_bad_csum++; - return -1; - } - } - - /* find the TCP header */ - tcp = (struct tcphdr *) (ip + 1); - - /* Get the TCP checksum if we dont have it */ - if (!csum) - csum = tcp->th_sum; - - /* ensure no bits set besides ack or psh */ - if ((tcp->th_flags & ~(TH_ACK | TH_PUSH)) != 0) - return -1; - - /* check for timestamps. Since the only option we handle are - timestamps, we only have to handle the simple case of - aligned timestamps */ - - opt_bytes = (tcp->th_off << 2) - sizeof (*tcp); - tcp_hdr_len = sizeof (*tcp) + opt_bytes; - ts_ptr = (uint32_t *)(tcp + 1); - if (opt_bytes != 0) { - if (__predict_false(opt_bytes != TCPOLEN_TSTAMP_APPA) || - (*ts_ptr != ntohl(TCPOPT_NOP<<24|TCPOPT_NOP<<16| - TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP))) - return -1; - } - - ip_len = ntohs(ip->ip_len); - tcp_data_len = ip_len - (tcp->th_off << 2) - sizeof (*ip); - - - /* - * If frame is padded beyond the end of the IP packet, - * then we must trim the extra bytes off the end. - */ - tot_len = m_head->m_pkthdr.len; - trim = tot_len - (ip_len + ETHER_HDR_LEN); - if (trim != 0) { - if (trim < 0) { - /* truncated packet */ - return -1; - } - m_adj(m_head, -trim); - tot_len = m_head->m_pkthdr.len; - } - - m_nxt = m_head; - m_tail = NULL; /* -Wuninitialized */ - while (m_nxt != NULL) { - m_tail = m_nxt; - m_nxt = m_tail->m_next; - } - - hlen = ip_len + ETHER_HDR_LEN - tcp_data_len; - seq = ntohl(tcp->th_seq); - - SLIST_FOREACH(lro, &cntl->lro_active, next) { - if (lro->source_port == tcp->th_sport && - lro->dest_port == tcp->th_dport && - lro->source_ip == ip->ip_src.s_addr && - lro->dest_ip == ip->ip_dst.s_addr) { - /* Flush now if appending will result in overflow. */ - if (lro->len > (65535 - tcp_data_len)) { - SLIST_REMOVE(&cntl->lro_active, lro, - lro_entry, next); - tcp_lro_flush(cntl, lro); - break; - } - - /* Try to append it */ - - if (__predict_false(seq != lro->next_seq || - (tcp_data_len == 0 && - lro->ack_seq == tcp->th_ack))) { - /* out of order packet or dup ack */ - SLIST_REMOVE(&cntl->lro_active, lro, - lro_entry, next); - tcp_lro_flush(cntl, lro); - return -1; - } - - if (opt_bytes) { - uint32_t tsval = ntohl(*(ts_ptr + 1)); - /* make sure timestamp values are increasing */ - if (__predict_false(lro->tsval > tsval || - *(ts_ptr + 2) == 0)) { - return -1; - } - lro->tsval = tsval; - lro->tsecr = *(ts_ptr + 2); - } - - lro->next_seq += tcp_data_len; - lro->ack_seq = tcp->th_ack; - lro->window = tcp->th_win; - lro->append_cnt++; - if (tcp_data_len == 0) { - m_freem(m_head); - return 0; - } - /* subtract off the checksum of the tcp header - * from the hardware checksum, and add it to the - * stored tcp data checksum. Byteswap the checksum - * if the total length so far is odd - */ - tmp_csum = do_csum_data((uint16_t*)tcp, - tcp_hdr_len); - csum = csum + (tmp_csum ^ 0xffff); - csum = (csum & 0xffff) + (csum >> 16); - csum = (csum & 0xffff) + (csum >> 16); - if (lro->len & 0x1) { - /* Odd number of bytes so far, flip bytes */ - csum = ((csum << 8) | (csum >> 8)) & 0xffff; - } - csum = csum + lro->data_csum; - csum = (csum & 0xffff) + (csum >> 16); - csum = (csum & 0xffff) + (csum >> 16); - lro->data_csum = csum; - - lro->len += tcp_data_len; - - /* adjust mbuf so that m->m_data points to - the first byte of the payload */ - m_adj(m_head, hlen); - /* append mbuf chain */ - lro->m_tail->m_next = m_head; - /* advance the last pointer */ - lro->m_tail = m_tail; - /* flush packet if required */ - device_mtu = cntl->ifp->if_mtu; - if (lro->len > (65535 - device_mtu)) { - SLIST_REMOVE(&cntl->lro_active, lro, - lro_entry, next); - tcp_lro_flush(cntl, lro); - } - return 0; + csum = in_cksum_hdr(ip4); + if (__predict_false((csum ^ 0xffff) != 0)) { + lc->lro_bad_csum++; + return (TCP_LRO_CANNOT); } } - if (SLIST_EMPTY(&cntl->lro_free)) - return -1; + /* Find the TCP header (we assured there are no IP options). */ + *th = (struct tcphdr *)(ip4 + 1); - /* start a new chain */ - lro = SLIST_FIRST(&cntl->lro_free); - SLIST_REMOVE_HEAD(&cntl->lro_free, next); - SLIST_INSERT_HEAD(&cntl->lro_active, lro, next); - lro->source_port = tcp->th_sport; - lro->dest_port = tcp->th_dport; - lro->source_ip = ip->ip_src.s_addr; - lro->dest_ip = ip->ip_dst.s_addr; - lro->next_seq = seq + tcp_data_len; - lro->mss = tcp_data_len; - lro->ack_seq = tcp->th_ack; - lro->window = tcp->th_win; - - /* save the checksum of just the TCP payload by - * subtracting off the checksum of the TCP header from - * the entire hardware checksum - * Since IP header checksum is correct, checksum over - * the IP header is -0. Substracting -0 is unnecessary. - */ - tmp_csum = do_csum_data((uint16_t*)tcp, tcp_hdr_len); - csum = csum + (tmp_csum ^ 0xffff); - csum = (csum & 0xffff) + (csum >> 16); - csum = (csum & 0xffff) + (csum >> 16); - lro->data_csum = csum; - - lro->ip = ip; - /* record timestamp if it is present */ - if (opt_bytes) { - lro->timestamp = 1; - lro->tsval = ntohl(*(ts_ptr + 1)); - lro->tsecr = *(ts_ptr + 2); - } - lro->len = tot_len; - lro->m_head = m_head; - lro->m_tail = m_tail; - return 0; + return (0); } +#endif + +int +tcp_lro_rx(struct lro_ctrl *lc, struct mbuf *m, uint32_t csum) +{ + struct lro_entry *le; + struct ether_header *eh; +#ifdef INET6 + struct ip6_hdr *ip6 = NULL; /* Keep compiler happy. */ +#endif +#ifdef INET + struct ip *ip4 = NULL; /* Keep compiler happy. */ +#endif + struct tcphdr *th; + void *l3hdr = NULL; /* Keep compiler happy. */ + uint32_t *ts_ptr; + tcp_seq seq; + int error, ip_len, l; + uint16_t eh_type, tcp_data_len; + + /* We expect a contiguous header [eh, ip, tcp]. */ + + eh = mtod(m, struct ether_header *); + eh_type = ntohs(eh->ether_type); + switch (eh_type) { +#ifdef INET6 + case ETHERTYPE_IPV6: + { + CURVNET_SET(lc->ifp->if_vnet); + if (V_ip6_forwarding != 0) { + /* XXX-BZ stats but changing lro_ctrl is a problem. */ + CURVNET_RESTORE(); + return (TCP_LRO_CANNOT); + } + CURVNET_RESTORE(); + l3hdr = ip6 = (struct ip6_hdr *)(eh + 1); + error = tcp_lro_rx_ipv6(lc, m, ip6, &th); + if (error != 0) + return (error); + tcp_data_len = ntohs(ip6->ip6_plen); + ip_len = sizeof(*ip6) + tcp_data_len; + break; + } +#endif +#ifdef INET + case ETHERTYPE_IP: + { + CURVNET_SET(lc->ifp->if_vnet); + if (V_ipforwarding != 0) { + /* XXX-BZ stats but changing lro_ctrl is a problem. */ + CURVNET_RESTORE(); + return (TCP_LRO_CANNOT); + } + CURVNET_RESTORE(); + l3hdr = ip4 = (struct ip *)(eh + 1); + error = tcp_lro_rx_ipv4(lc, m, ip4, &th); + if (error != 0) + return (error); + ip_len = ntohs(ip4->ip_len); + tcp_data_len = ip_len - sizeof(*ip4); + break; + } +#endif + /* XXX-BZ what happens in case of VLAN(s)? */ + default: + return (TCP_LRO_NOT_SUPPORTED); + } + + /* + * If the frame is padded beyond the end of the IP packet, then we must + * trim the extra bytes off. + */ + l = m->m_pkthdr.len - (ETHER_HDR_LEN + ip_len); + if (l != 0) { + if (l < 0) + /* Truncated packet. */ + return (TCP_LRO_CANNOT); + + m_adj(m, -l); + } + + /* + * Check TCP header constraints. + */ + /* Ensure no bits set besides ACK or PSH. */ + if ((th->th_flags & ~(TH_ACK | TH_PUSH)) != 0) + return (TCP_LRO_CANNOT); + + /* XXX-BZ We lose a AKC|PUSH flag concatinating multiple segments. */ + /* XXX-BZ Ideally we'd flush on PUSH? */ + + /* + * Check for timestamps. + * Since the only option we handle are timestamps, we only have to + * handle the simple case of aligned timestamps. + */ + l = (th->th_off << 2); + tcp_data_len -= l; + l -= sizeof(*th); + ts_ptr = (uint32_t *)(th + 1); + if (l != 0 && (__predict_false(l != TCPOLEN_TSTAMP_APPA) || + (*ts_ptr != ntohl(TCPOPT_NOP<<24|TCPOPT_NOP<<16| + TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP)))) + return (TCP_LRO_CANNOT); + + /* If the driver did not pass in the checksum, set it now. */ + if (csum == 0x0000) + csum = th->th_sum; + + seq = ntohl(th->th_seq); + + /* Try to find a matching previous segment. */ + SLIST_FOREACH(le, &lc->lro_active, next) { + if (le->eh_type != eh_type) + continue; + if (le->source_port != th->th_sport || + le->dest_port != th->th_dport) + continue; + switch (eh_type) { +#ifdef INET6 + case ETHERTYPE_IPV6: + if (bcmp(&le->source_ip6, &ip6->ip6_src, + sizeof(struct in6_addr)) != 0 || + bcmp(&le->dest_ip6, &ip6->ip6_dst, + sizeof(struct in6_addr)) != 0) + continue; + break; +#endif +#ifdef INET + case ETHERTYPE_IP: + if (le->source_ip4 != ip4->ip_src.s_addr || + le->dest_ip4 != ip4->ip_dst.s_addr) + continue; + break; +#endif + } + + /* Flush now if appending will result in overflow. */ + if (le->p_len > (65535 - tcp_data_len)) { + SLIST_REMOVE(&lc->lro_active, le, lro_entry, next); + tcp_lro_flush(lc, le); + break; + } + + /* Try to append the new segment. */ + if (__predict_false(seq != le->next_seq || + (tcp_data_len == 0 && le->ack_seq == th->th_ack))) { + /* Out of order packet or duplicate ACK. */ + SLIST_REMOVE(&lc->lro_active, le, lro_entry, next); + tcp_lro_flush(lc, le); + return (TCP_LRO_CANNOT); + } + + if (l != 0) { + uint32_t tsval = ntohl(*(ts_ptr + 1)); + /* Make sure timestamp values are increasing. */ + /* XXX-BZ flip and use TSTMP_GEQ macro for this? */ + if (__predict_false(le->tsval > tsval || + *(ts_ptr + 2) == 0)) + return (TCP_LRO_CANNOT); + le->tsval = tsval; + le->tsecr = *(ts_ptr + 2); + } + + le->next_seq += tcp_data_len; + le->ack_seq = th->th_ack; + le->window = th->th_win; + le->append_cnt++; + +#ifdef TCP_LRO_UPDATE_CSUM + le->ulp_csum += tcp_lro_rx_csum_fixup(le, l3hdr, th, + tcp_data_len, ~csum); +#endif + + if (tcp_data_len == 0) { + m_freem(m); + return (0); + } + + le->p_len += tcp_data_len; + + /* + * Adjust the mbuf so that m_data points to the first byte of + * the ULP payload. Adjust the mbuf to avoid complications and + * append new segment to existing mbuf chain. + */ + m_adj(m, m->m_pkthdr.len - tcp_data_len); + m->m_flags &= ~M_PKTHDR; + + le->m_tail->m_next = m; + le->m_tail = m_last(m); + + /* + * If a possible next full length packet would cause an + * overflow, pro-actively flush now. + */ + if (le->p_len > (65535 - lc->ifp->if_mtu)) { + SLIST_REMOVE(&lc->lro_active, le, lro_entry, next); + tcp_lro_flush(lc, le); + } + + return (0); + } + + /* Try to find an empty slot. */ + if (SLIST_EMPTY(&lc->lro_free)) + return (TCP_LRO_CANNOT); + + /* Start a new segment chain. */ + le = SLIST_FIRST(&lc->lro_free); + SLIST_REMOVE_HEAD(&lc->lro_free, next); + SLIST_INSERT_HEAD(&lc->lro_active, le, next); + + /* Start filling in details. */ + switch (eh_type) { +#ifdef INET6 + case ETHERTYPE_IPV6: + le->le_ip6 = ip6; + le->source_ip6 = ip6->ip6_src; + le->dest_ip6 = ip6->ip6_dst; + le->eh_type = eh_type; + le->p_len = m->m_pkthdr.len - ETHER_HDR_LEN - sizeof(*ip6); + break; +#endif +#ifdef INET + case ETHERTYPE_IP: + le->le_ip4 = ip4; + le->source_ip4 = ip4->ip_src.s_addr; + le->dest_ip4 = ip4->ip_dst.s_addr; + le->eh_type = eh_type; + le->p_len = m->m_pkthdr.len - ETHER_HDR_LEN; + break; +#endif + } + le->source_port = th->th_sport; + le->dest_port = th->th_dport; + + le->next_seq = seq + tcp_data_len; + le->ack_seq = th->th_ack; + le->window = th->th_win; + if (l != 0) { + le->timestamp = 1; + le->tsval = ntohl(*(ts_ptr + 1)); + le->tsecr = *(ts_ptr + 2); + } + +#ifdef TCP_LRO_UPDATE_CSUM + /* + * Do not touch the csum of the first packet. However save the + * "adjusted" checksum of just the source and destination addresses, + * the next header and the TCP payload. The length and TCP header + * parts may change, so we remove those from the saved checksum and + * re-add with final values on tcp_lro_flush() if needed. + */ + KASSERT(le->ulp_csum == 0, ("%s: le=%p le->ulp_csum=0x%04x\n", + __func__, le, le->ulp_csum)); + + le->ulp_csum = tcp_lro_rx_csum_fixup(le, l3hdr, th, tcp_data_len, + ~csum); + th->th_sum = csum; /* Restore checksum on first packet. */ +#endif + + le->m_head = m; + le->m_tail = m_last(m); + + return (0); +} + +/* end */ diff --git a/sys/netinet/tcp_lro.h b/sys/netinet/tcp_lro.h index a5e8f9d25a1..b3a501798aa 100644 --- a/sys/netinet/tcp_lro.h +++ b/sys/netinet/tcp_lro.h @@ -1,67 +1,75 @@ -/******************************************************************************* +/*- + * Copyright (c) 2006, Myricom Inc. + * Copyright (c) 2008, Intel Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ -Copyright (c) 2006, Myricom Inc. -Copyright (c) 2008, Intel Corporation. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Myricom Inc, nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - 2. Neither the name of the Intel Corporation, nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - -$FreeBSD$ - -***************************************************************************/ #ifndef _TCP_LRO_H_ #define _TCP_LRO_H_ -struct lro_entry; struct lro_entry { - SLIST_ENTRY(lro_entry) next; - struct mbuf *m_head; - struct mbuf *m_tail; - int timestamp; - struct ip *ip; - uint32_t tsval; - uint32_t tsecr; - uint32_t source_ip; - uint32_t dest_ip; - uint32_t next_seq; - uint32_t ack_seq; - uint32_t len; - uint32_t data_csum; - uint16_t window; - uint16_t source_port; - uint16_t dest_port; - uint16_t append_cnt; - uint16_t mss; - + SLIST_ENTRY(lro_entry) next; + struct mbuf *m_head; + struct mbuf *m_tail; + union { + struct ip *ip4; + struct ip6_hdr *ip6; + } leip; + union { + in_addr_t s_ip4; + struct in6_addr s_ip6; + } lesource; + union { + in_addr_t d_ip4; + struct in6_addr d_ip6; + } ledest; + uint16_t source_port; + uint16_t dest_port; + uint16_t eh_type; /* EthernetHeader type. */ + uint16_t append_cnt; + uint32_t p_len; /* IP header payload length. */ + uint32_t ulp_csum; /* TCP, etc. checksum. */ + uint32_t next_seq; /* tcp_seq */ + uint32_t ack_seq; /* tcp_seq */ + uint32_t tsval; + uint32_t tsecr; + uint16_t window; + uint16_t timestamp; /* flag, not a TCP hdr field. */ }; SLIST_HEAD(lro_head, lro_entry); +#define le_ip4 leip.ip4 +#define le_ip6 leip.ip6 +#define source_ip4 lesource.s_ip4 +#define dest_ip4 ledest.d_ip4 +#define source_ip6 lesource.s_ip6 +#define dest_ip6 ledest.d_ip6 + +/* NB: This is part of driver structs. */ struct lro_ctrl { struct ifnet *ifp; int lro_queued; @@ -73,13 +81,12 @@ struct lro_ctrl { struct lro_head lro_free; }; - int tcp_lro_init(struct lro_ctrl *); void tcp_lro_free(struct lro_ctrl *); void tcp_lro_flush(struct lro_ctrl *, struct lro_entry *); int tcp_lro_rx(struct lro_ctrl *, struct mbuf *, uint32_t); -/* Number of LRO entries - these are per rx queue */ -#define LRO_ENTRIES 8 +#define TCP_LRO_CANNOT -1 +#define TCP_LRO_NOT_SUPPORTED 1 #endif /* _TCP_LRO_H_ */ diff --git a/sys/netinet/tcp_offload.c b/sys/netinet/tcp_offload.c index 899a37c7fa3..b7724181820 100644 --- a/sys/netinet/tcp_offload.c +++ b/sys/netinet/tcp_offload.c @@ -1,145 +1,176 @@ /*- - * Copyright (c) 2007, Chelsio Inc. + * Copyright (c) 2012 Chelsio Communications, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Neither the name of the Chelsio Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + #include #include #include -#include -#include -#include #include #include #include - +#include #include -#include -#include #include -#include - #include -#include #include #include #include #include -#include +#define TCPOUTFLAGS +#include +#include -uint32_t toedev_registration_count; +int registered_toedevs; +/* + * Provide an opportunity for a TOE driver to offload. + */ int tcp_offload_connect(struct socket *so, struct sockaddr *nam) { struct ifnet *ifp; - struct toedev *tdev; + struct toedev *tod; struct rtentry *rt; - int error; + int error = EOPNOTSUPP; - if (toedev_registration_count == 0) - return (EINVAL); - - /* - * Look up the route used for the connection to - * determine if it uses an interface capable of - * offloading the connection. - */ - rt = rtalloc1(nam, 0 /*report*/, 0 /*ignflags*/); - if (rt) + INP_WLOCK_ASSERT(sotoinpcb(so)); + KASSERT(nam->sa_family == AF_INET || nam->sa_family == AF_INET6, + ("%s: called with sa_family %d", __func__, nam->sa_family)); + + if (registered_toedevs == 0) + return (error); + + rt = rtalloc1(nam, 0, 0); + if (rt) RT_UNLOCK(rt); - else + else return (EHOSTUNREACH); ifp = rt->rt_ifp; - if ((ifp->if_capenable & IFCAP_TOE) == 0) { - error = EINVAL; - goto fail; - } - - tdev = TOEDEV(ifp); - if (tdev == NULL) { - error = EPERM; - goto fail; - } - - if (tdev->tod_can_offload(tdev, so) == 0) { - error = EPERM; - goto fail; - } - - return (tdev->tod_connect(tdev, so, rt, nam)); -fail: + + if (nam->sa_family == AF_INET && !(ifp->if_capenable & IFCAP_TOE4)) + goto done; + if (nam->sa_family == AF_INET6 && !(ifp->if_capenable & IFCAP_TOE6)) + goto done; + + tod = TOEDEV(ifp); + if (tod != NULL) + error = tod->tod_connect(tod, so, rt, nam); +done: RTFREE(rt); return (error); } +void +tcp_offload_listen_start(struct tcpcb *tp) +{ -/* - * This file contains code as a short-term staging area before it is moved in - * to sys/netinet/tcp_offload.c - */ + INP_WLOCK_ASSERT(tp->t_inpcb); + + EVENTHANDLER_INVOKE(tcp_offload_listen_start, tp); +} void -tcp_offload_twstart(struct tcpcb *tp) +tcp_offload_listen_stop(struct tcpcb *tp) { - INP_INFO_WLOCK(&V_tcbinfo); - INP_WLOCK(tp->t_inpcb); - tcp_twstart(tp); - INP_INFO_WUNLOCK(&V_tcbinfo); + INP_WLOCK_ASSERT(tp->t_inpcb); + + EVENTHANDLER_INVOKE(tcp_offload_listen_stop, tp); } -struct tcpcb * -tcp_offload_close(struct tcpcb *tp) +void +tcp_offload_input(struct tcpcb *tp, struct mbuf *m) { + struct toedev *tod = tp->tod; - INP_INFO_WLOCK(&V_tcbinfo); - INP_WLOCK(tp->t_inpcb); - tp = tcp_close(tp); - INP_INFO_WUNLOCK(&V_tcbinfo); - if (tp) - INP_WUNLOCK(tp->t_inpcb); + KASSERT(tod != NULL, ("%s: tp->tod is NULL, tp %p", __func__, tp)); + INP_WLOCK_ASSERT(tp->t_inpcb); - return (tp); + tod->tod_input(tod, tp, m); } -struct tcpcb * -tcp_offload_drop(struct tcpcb *tp, int error) +int +tcp_offload_output(struct tcpcb *tp) { + struct toedev *tod = tp->tod; + int error, flags; - INP_INFO_WLOCK(&V_tcbinfo); - INP_WLOCK(tp->t_inpcb); - tp = tcp_drop(tp, error); - INP_INFO_WUNLOCK(&V_tcbinfo); - if (tp) - INP_WUNLOCK(tp->t_inpcb); + KASSERT(tod != NULL, ("%s: tp->tod is NULL, tp %p", __func__, tp)); + INP_WLOCK_ASSERT(tp->t_inpcb); - return (tp); + flags = tcp_outflags[tp->t_state]; + + if (flags & TH_RST) { + /* XXX: avoid repeated calls like we do for FIN */ + error = tod->tod_send_rst(tod, tp); + } else if ((flags & TH_FIN || tp->t_flags & TF_NEEDFIN) && + (tp->t_flags & TF_SENTFIN) == 0) { + error = tod->tod_send_fin(tod, tp); + if (error == 0) + tp->t_flags |= TF_SENTFIN; + } else + error = tod->tod_output(tod, tp); + + return (error); } +void +tcp_offload_rcvd(struct tcpcb *tp) +{ + struct toedev *tod = tp->tod; + + KASSERT(tod != NULL, ("%s: tp->tod is NULL, tp %p", __func__, tp)); + INP_WLOCK_ASSERT(tp->t_inpcb); + + tod->tod_rcvd(tod, tp); +} + +void +tcp_offload_ctloutput(struct tcpcb *tp, int sopt_dir, int sopt_name) +{ + struct toedev *tod = tp->tod; + + KASSERT(tod != NULL, ("%s: tp->tod is NULL, tp %p", __func__, tp)); + INP_WLOCK_ASSERT(tp->t_inpcb); + + tod->tod_ctloutput(tod, tp, sopt_dir, sopt_name); +} + +void +tcp_offload_detach(struct tcpcb *tp) +{ + struct toedev *tod = tp->tod; + + KASSERT(tod != NULL, ("%s: tp->tod is NULL, tp %p", __func__, tp)); + INP_WLOCK_ASSERT(tp->t_inpcb); + + tod->tod_pcb_detach(tod, tp); +} diff --git a/sys/netinet/tcp_offload.h b/sys/netinet/tcp_offload.h index 313185f6ea6..a0523665848 100644 --- a/sys/netinet/tcp_offload.h +++ b/sys/netinet/tcp_offload.h @@ -1,30 +1,30 @@ /*- - * Copyright (c) 2007, Chelsio Inc. + * Copyright (c) 2012 Chelsio Communications, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Neither the name of the Chelsio Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. * * $FreeBSD$ + * */ #ifndef _NETINET_TCP_OFFLOAD_H_ @@ -34,321 +34,15 @@ #error "no user-serviceable parts inside" #endif -/* - * A driver publishes that it provides offload services - * by setting IFCAP_TOE in the ifnet. The offload connect - * will bypass any further work if the interface that a - * connection would use does not support TCP offload. - * - * The TOE API assumes that the tcp offload engine can offload the - * the entire connection from set up to teardown, with some provision - * being made to allowing the software stack to handle time wait. If - * the device does not meet these criteria, it is the driver's responsibility - * to overload the functions that it needs to in tcp_usrreqs and make - * its own calls to tcp_output if it needs to do so. - * - * There is currently no provision for the device advertising the congestion - * control algorithms it supports as there is currently no API for querying - * an operating system for the protocols that it has loaded. This is a desirable - * future extension. - * - * - * - * It is assumed that individuals deploying TOE will want connections - * to be offloaded without software changes so all connections on an - * interface providing TOE are offloaded unless the SO_NO_OFFLOAD - * flag is set on the socket. - * - * - * The toe_usrreqs structure constitutes the TOE driver's - * interface to the TCP stack for functionality that doesn't - * interact directly with userspace. If one wants to provide - * (optional) functionality to do zero-copy to/from - * userspace one still needs to override soreceive/sosend - * with functions that fault in and pin the user buffers. - * - * + tu_send - * - tells the driver that new data may have been added to the - * socket's send buffer - the driver should not fail if the - * buffer is in fact unchanged - * - the driver is responsible for providing credits (bytes in the send window) - * back to the socket by calling sbdrop() as segments are acknowledged. - * - The driver expects the inpcb lock to be held - the driver is expected - * not to drop the lock. Hence the driver is not allowed to acquire the - * pcbinfo lock during this call. - * - * + tu_rcvd - * - returns credits to the driver and triggers window updates - * to the peer (a credit as used here is a byte in the peer's receive window) - * - the driver is expected to determine how many bytes have been - * consumed and credit that back to the card so that it can grow - * the window again by maintaining its own state between invocations. - * - In principle this could be used to shrink the window as well as - * grow the window, although it is not used for that now. - * - this function needs to correctly handle being called any number of - * times without any bytes being consumed from the receive buffer. - * - The driver expects the inpcb lock to be held - the driver is expected - * not to drop the lock. Hence the driver is not allowed to acquire the - * pcbinfo lock during this call. - * - * + tu_disconnect - * - tells the driver to send FIN to peer - * - driver is expected to send the remaining data and then do a clean half close - * - disconnect implies at least half-close so only send, reset, and detach - * are legal - * - the driver is expected to handle transition through the shutdown - * state machine and allow the stack to support SO_LINGER. - * - The driver expects the inpcb lock to be held - the driver is expected - * not to drop the lock. Hence the driver is not allowed to acquire the - * pcbinfo lock during this call. - * - * + tu_reset - * - closes the connection and sends a RST to peer - * - driver is expectd to trigger an RST and detach the toepcb - * - no further calls are legal after reset - * - The driver expects the inpcb lock to be held - the driver is expected - * not to drop the lock. Hence the driver is not allowed to acquire the - * pcbinfo lock during this call. - * - * The following fields in the tcpcb are expected to be referenced by the driver: - * + iss - * + rcv_nxt - * + rcv_wnd - * + snd_isn - * + snd_max - * + snd_nxt - * + snd_una - * + t_flags - * + t_inpcb - * + t_maxseg - * + t_toe - * - * The following fields in the inpcb are expected to be referenced by the driver: - * + inp_lport - * + inp_fport - * + inp_laddr - * + inp_fport - * + inp_socket - * + inp_ip_tos - * - * The following fields in the socket are expected to be referenced by the - * driver: - * + so_comp - * + so_error - * + so_linger - * + so_options - * + so_rcv - * + so_snd - * + so_state - * + so_timeo - * - * These functions all return 0 on success and can return the following errors - * as appropriate: - * + EPERM: - * + ENOBUFS: memory allocation failed - * + EMSGSIZE: MTU changed during the call - * + EHOSTDOWN: - * + EHOSTUNREACH: - * + ENETDOWN: - * * ENETUNREACH: the peer is no longer reachable - * - * + tu_detach - * - tells driver that the socket is going away so disconnect - * the toepcb and free appropriate resources - * - allows the driver to cleanly handle the case of connection state - * outliving the socket - * - no further calls are legal after detach - * - the driver is expected to provide its own synchronization between - * detach and receiving new data. - * - * + tu_syncache_event - * - even if it is not actually needed, the driver is expected to - * call syncache_add for the initial SYN and then syncache_expand - * for the SYN,ACK - * - tells driver that a connection either has not been added or has - * been dropped from the syncache - * - the driver is expected to maintain state that lives outside the - * software stack so the syncache needs to be able to notify the - * toe driver that the software stack is not going to create a connection - * for a received SYN - * - The driver is responsible for any synchronization required between - * the syncache dropping an entry and the driver processing the SYN,ACK. - * - */ -struct toe_usrreqs { - int (*tu_send)(struct tcpcb *tp); - int (*tu_rcvd)(struct tcpcb *tp); - int (*tu_disconnect)(struct tcpcb *tp); - int (*tu_reset)(struct tcpcb *tp); - void (*tu_detach)(struct tcpcb *tp); - void (*tu_syncache_event)(int event, void *toep); -}; +extern int registered_toedevs; -/* - * Proxy for struct tcpopt between TOE drivers and TCP functions. - */ -struct toeopt { - u_int64_t to_flags; /* see tcpopt in tcp_var.h */ - u_int16_t to_mss; /* maximum segment size */ - u_int8_t to_wscale; /* window scaling */ +int tcp_offload_connect(struct socket *, struct sockaddr *); +void tcp_offload_listen_start(struct tcpcb *); +void tcp_offload_listen_stop(struct tcpcb *); +void tcp_offload_input(struct tcpcb *, struct mbuf *); +int tcp_offload_output(struct tcpcb *); +void tcp_offload_rcvd(struct tcpcb *); +void tcp_offload_ctloutput(struct tcpcb *, int, int); +void tcp_offload_detach(struct tcpcb *); - u_int8_t _pad1; /* explicit pad for 64bit alignment */ - u_int32_t _pad2; /* explicit pad for 64bit alignment */ - u_int64_t _pad3[4]; /* TBD */ -}; - -#define TOE_SC_ENTRY_PRESENT 1 /* 4-tuple already present */ -#define TOE_SC_DROP 2 /* connection was timed out */ - -/* - * Because listen is a one-to-many relationship (a socket can be listening - * on all interfaces on a machine some of which may be using different TCP - * offload devices), listen uses a publish/subscribe mechanism. The TCP - * offload driver registers a listen notification function with the stack. - * When a listen socket is created all TCP offload devices are notified - * so that they can do the appropriate set up to offload connections on the - * port to which the socket is bound. When the listen socket is closed, - * the offload devices are notified so that they will stop listening on that - * port and free any associated resources as well as sending RSTs on any - * connections in the SYN_RCVD state. - * - */ - -typedef void (*tcp_offload_listen_start_fn)(void *, struct tcpcb *); -typedef void (*tcp_offload_listen_stop_fn)(void *, struct tcpcb *); - -EVENTHANDLER_DECLARE(tcp_offload_listen_start, tcp_offload_listen_start_fn); -EVENTHANDLER_DECLARE(tcp_offload_listen_stop, tcp_offload_listen_stop_fn); - -/* - * Check if the socket can be offloaded by the following steps: - * - determine the egress interface - * - check the interface for TOE capability and TOE is enabled - * - check if the device has resources to offload the connection - */ -int tcp_offload_connect(struct socket *so, struct sockaddr *nam); - -/* - * The tcp_output_* routines are wrappers around the toe_usrreqs calls - * which trigger packet transmission. In the non-offloaded case they - * translate to tcp_output. The tcp_offload_* routines notify TOE - * of specific events. I the non-offloaded case they are no-ops. - * - * Listen is a special case because it is a 1 to many relationship - * and there can be more than one offload driver in the system. - */ - -/* - * Connection is offloaded - */ -#define tp_offload(tp) ((tp)->t_flags & TF_TOE) - -/* - * hackish way of allowing this file to also be included by TOE - * which needs to be kept ignorant of socket implementation details - */ -#ifdef _SYS_SOCKETVAR_H_ -/* - * The socket has not been marked as "do not offload" - */ -#define SO_OFFLOADABLE(so) ((so->so_options & SO_NO_OFFLOAD) == 0) - -static __inline int -tcp_output_connect(struct socket *so, struct sockaddr *nam) -{ - struct tcpcb *tp = sototcpcb(so); - int error; - - /* - * If offload has been disabled for this socket or the - * connection cannot be offloaded just call tcp_output - * to start the TCP state machine. - */ -#ifndef TCP_OFFLOAD_DISABLE - if (!SO_OFFLOADABLE(so) || (error = tcp_offload_connect(so, nam)) != 0) -#endif - error = tcp_output(tp); - return (error); -} - -static __inline int -tcp_output_send(struct tcpcb *tp) -{ - -#ifndef TCP_OFFLOAD_DISABLE - if (tp_offload(tp)) - return (tp->t_tu->tu_send(tp)); #endif - return (tcp_output(tp)); -} - -static __inline int -tcp_output_rcvd(struct tcpcb *tp) -{ - -#ifndef TCP_OFFLOAD_DISABLE - if (tp_offload(tp)) - return (tp->t_tu->tu_rcvd(tp)); -#endif - return (tcp_output(tp)); -} - -static __inline int -tcp_output_disconnect(struct tcpcb *tp) -{ - -#ifndef TCP_OFFLOAD_DISABLE - if (tp_offload(tp)) - return (tp->t_tu->tu_disconnect(tp)); -#endif - return (tcp_output(tp)); -} - -static __inline int -tcp_output_reset(struct tcpcb *tp) -{ - -#ifndef TCP_OFFLOAD_DISABLE - if (tp_offload(tp)) - return (tp->t_tu->tu_reset(tp)); -#endif - return (tcp_output(tp)); -} - -static __inline void -tcp_offload_detach(struct tcpcb *tp) -{ - -#ifndef TCP_OFFLOAD_DISABLE - if (tp_offload(tp)) - tp->t_tu->tu_detach(tp); -#endif -} - -static __inline void -tcp_offload_listen_open(struct tcpcb *tp) -{ - -#ifndef TCP_OFFLOAD_DISABLE - if (SO_OFFLOADABLE(tp->t_inpcb->inp_socket)) - EVENTHANDLER_INVOKE(tcp_offload_listen_start, tp); -#endif -} - -static __inline void -tcp_offload_listen_close(struct tcpcb *tp) -{ - -#ifndef TCP_OFFLOAD_DISABLE - EVENTHANDLER_INVOKE(tcp_offload_listen_stop, tp); -#endif -} -#undef SO_OFFLOADABLE -#endif /* _SYS_SOCKETVAR_H_ */ -#undef tp_offload - -void tcp_offload_twstart(struct tcpcb *tp); -struct tcpcb *tcp_offload_close(struct tcpcb *tp); -struct tcpcb *tcp_offload_drop(struct tcpcb *tp, int error); - -#endif /* _NETINET_TCP_OFFLOAD_H_ */ diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c index 645fb37a997..1881c546812 100644 --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -75,6 +75,9 @@ __FBSDID("$FreeBSD$"); #ifdef TCPDEBUG #include #endif +#ifdef TCP_OFFLOAD +#include +#endif #ifdef IPSEC #include @@ -191,6 +194,11 @@ tcp_output(struct tcpcb *tp) INP_WLOCK_ASSERT(tp->t_inpcb); +#ifdef TCP_OFFLOAD + if (tp->t_flags & TF_TOE) + return (tcp_offload_output(tp)); +#endif + /* * Determine length of data that should be transmitted, * and flags that will be used. @@ -1047,19 +1055,24 @@ send: * checksum extended header and data. */ m->m_pkthdr.len = hdrlen + len; /* in6_cksum() need this */ + m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum); #ifdef INET6 - if (isipv6) + if (isipv6) { /* * ip6_plen is not need to be filled now, and will be filled * in ip6_output. */ - th->th_sum = in6_cksum(m, IPPROTO_TCP, sizeof(struct ip6_hdr), - sizeof(struct tcphdr) + optlen + len); + m->m_pkthdr.csum_flags = CSUM_TCP_IPV6; + th->th_sum = in6_cksum_pseudo(ip6, sizeof(struct tcphdr) + + optlen + len, IPPROTO_TCP, 0); + } +#endif +#if defined(INET6) && defined(INET) else -#endif /* INET6 */ +#endif +#ifdef INET { m->m_pkthdr.csum_flags = CSUM_TCP; - m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum); th->th_sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr, htons(sizeof(struct tcphdr) + IPPROTO_TCP + len + optlen)); @@ -1067,6 +1080,7 @@ send: KASSERT(ip->ip_v == IPVERSION, ("%s: IP version incorrect: %d", __func__, ip->ip_v)); } +#endif /* * Enable TSO and specify the size of the segments. diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index 561749a2708..9d35e0ab9bb 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -85,7 +85,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #ifdef INET6 #include #endif @@ -96,6 +95,9 @@ __FBSDID("$FreeBSD$"); #ifdef INET6 #include #endif +#ifdef TCP_OFFLOAD +#include +#endif #ifdef IPSEC #include @@ -573,8 +575,7 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr *th, struct mbuf *m, ip6->ip6_flow = 0; ip6->ip6_vfc = IPV6_VERSION; ip6->ip6_nxt = IPPROTO_TCP; - ip6->ip6_plen = htons((u_short)(sizeof (struct tcphdr) + - tlen)); + ip6->ip6_plen = 0; /* Set in ip6_output(). */ tlen += sizeof (struct ip6_hdr) + sizeof (struct tcphdr); } #endif @@ -619,12 +620,13 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr *th, struct mbuf *m, else nth->th_win = htons((u_short)win); nth->th_urp = 0; + + m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum); #ifdef INET6 if (isipv6) { - nth->th_sum = 0; - nth->th_sum = in6_cksum(m, IPPROTO_TCP, - sizeof(struct ip6_hdr), - tlen - sizeof(struct ip6_hdr)); + m->m_pkthdr.csum_flags = CSUM_TCP_IPV6; + nth->th_sum = in6_cksum_pseudo(ip6, + tlen - sizeof(struct ip6_hdr), IPPROTO_TCP, 0); ip6->ip6_hlim = in6_selecthlim(tp != NULL ? tp->t_inpcb : NULL, NULL); } @@ -634,10 +636,9 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr *th, struct mbuf *m, #endif #ifdef INET { + m->m_pkthdr.csum_flags = CSUM_TCP; nth->th_sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr, htons((u_short)(tlen - sizeof(struct ip) + ip->ip_p))); - m->m_pkthdr.csum_flags = CSUM_TCP; - m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum); } #endif /* INET */ #ifdef TCPDEBUG @@ -825,7 +826,7 @@ tcp_drop(struct tcpcb *tp, int errno) if (TCPS_HAVERCVDSYN(tp->t_state)) { tp->t_state = TCPS_CLOSED; - (void) tcp_output_reset(tp); + (void) tcp_output(tp); TCPSTAT_INC(tcps_drops); } else TCPSTAT_INC(tcps_conndrops); @@ -925,8 +926,12 @@ tcp_discardcb(struct tcpcb *tp) /* free the reassembly queue, if any */ tcp_reass_flush(tp); + +#ifdef TCP_OFFLOAD /* Disconnect offload device, if any. */ - tcp_offload_detach(tp); + if (tp->t_flags & TF_TOE) + tcp_offload_detach(tp); +#endif tcp_free_sackholes(tp); @@ -955,9 +960,10 @@ tcp_close(struct tcpcb *tp) INP_INFO_WLOCK_ASSERT(&V_tcbinfo); INP_WLOCK_ASSERT(inp); - /* Notify any offload devices of listener close */ +#ifdef TCP_OFFLOAD if (tp->t_state == TCPS_LISTEN) - tcp_offload_listen_close(tp); + tcp_offload_listen_stop(tp); +#endif in_pcbdrop(inp); TCPSTAT_INC(tcps_closed); KASSERT(inp->inp_socket != NULL, ("tcp_close: inp_socket NULL")); @@ -1696,7 +1702,7 @@ tcp_mtudisc(struct inpcb *inp, int mtuoffer) tp->snd_recover = tp->snd_max; if (tp->t_flags & TF_SACK_PERMIT) EXIT_FASTRECOVERY(tp->t_flags); - tcp_output_send(tp); + tcp_output(tp); return (inp); } diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c index 8df7ce0d082..0f7637d1393 100644 --- a/sys/netinet/tcp_syncache.c +++ b/sys/netinet/tcp_syncache.c @@ -81,10 +81,12 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #ifdef INET6 #include #endif +#ifdef TCP_OFFLOAD +#include +#endif #ifdef IPSEC #include @@ -110,10 +112,8 @@ SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, syncookies_only, CTLFLAG_RW, &VNET_NAME(tcp_syncookiesonly), 0, "Use only TCP SYN cookies"); -#ifdef TCP_OFFLOAD_DISABLE -#define TOEPCB_ISSET(sc) (0) -#else -#define TOEPCB_ISSET(sc) ((sc)->sc_toepcb != NULL) +#ifdef TCP_OFFLOAD +#define ADDED_BY_TOE(sc) ((sc)->sc_tod != NULL) #endif static void syncache_drop(struct syncache *, struct syncache_head *); @@ -332,6 +332,14 @@ syncache_insert(struct syncache *sc, struct syncache_head *sch) TAILQ_INSERT_HEAD(&sch->sch_bucket, sc, sc_hash); sch->sch_length++; +#ifdef TCP_OFFLOAD + if (ADDED_BY_TOE(sc)) { + struct toedev *tod = sc->sc_tod; + + tod->tod_syncache_added(tod, sc->sc_todctx); + } +#endif + /* Reinitialize the bucket row's timer. */ if (sch->sch_length == 1) sch->sch_nextc = ticks + INT_MAX; @@ -356,10 +364,14 @@ syncache_drop(struct syncache *sc, struct syncache_head *sch) TAILQ_REMOVE(&sch->sch_bucket, sc, sc_hash); sch->sch_length--; -#ifndef TCP_OFFLOAD_DISABLE - if (sc->sc_tu) - sc->sc_tu->tu_syncache_event(TOE_SC_DROP, sc->sc_toepcb); -#endif +#ifdef TCP_OFFLOAD + if (ADDED_BY_TOE(sc)) { + struct toedev *tod = sc->sc_tod; + + tod->tod_syncache_removed(tod, sc->sc_todctx); + } +#endif + syncache_free(sc); V_tcp_syncache.cache_count--; } @@ -846,6 +858,18 @@ syncache_socket(struct syncache *sc, struct socket *lso, struct mbuf *m) if (sc->sc_rxmits > 1) tp->snd_cwnd = tp->t_maxseg; +#ifdef TCP_OFFLOAD + /* + * Allow a TOE driver to install its hooks. Note that we hold the + * pcbinfo lock too and that prevents tcp_usr_accept from accepting a + * new connection before the TOE driver has done its thing. + */ + if (ADDED_BY_TOE(sc)) { + struct toedev *tod = sc->sc_tod; + + tod->tod_offload_socket(tod, sc->sc_todctx, so); + } +#endif /* * Copy and activate timers. */ @@ -926,6 +950,13 @@ syncache_expand(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th, /* Pull out the entry to unlock the bucket row. */ TAILQ_REMOVE(&sch->sch_bucket, sc, sc_hash); sch->sch_length--; +#ifdef TCP_OFFLOAD + if (ADDED_BY_TOE(sc)) { + struct toedev *tod = sc->sc_tod; + + tod->tod_syncache_removed(tod, sc->sc_todctx); + } +#endif V_tcp_syncache.cache_count--; SCH_UNLOCK(sch); } @@ -934,7 +965,7 @@ syncache_expand(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th, * Segment validation: * ACK must match our initial sequence number + 1 (the SYN|ACK). */ - if (th->th_ack != sc->sc_iss + 1 && !TOEPCB_ISSET(sc)) { + if (th->th_ack != sc->sc_iss + 1) { if ((s = tcp_log_addrs(inc, th, NULL, NULL))) log(LOG_DEBUG, "%s; %s: ACK %u != ISS+1 %u, segment " "rejected\n", s, __func__, th->th_ack, sc->sc_iss); @@ -945,9 +976,8 @@ syncache_expand(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th, * The SEQ must fall in the window starting at the received * initial receive sequence number + 1 (the SYN). */ - if ((SEQ_LEQ(th->th_seq, sc->sc_irs) || - SEQ_GT(th->th_seq, sc->sc_irs + sc->sc_wnd)) && - !TOEPCB_ISSET(sc)) { + if (SEQ_LEQ(th->th_seq, sc->sc_irs) || + SEQ_GT(th->th_seq, sc->sc_irs + sc->sc_wnd)) { if ((s = tcp_log_addrs(inc, th, NULL, NULL))) log(LOG_DEBUG, "%s; %s: SEQ %u != IRS+1 %u, segment " "rejected\n", s, __func__, th->th_seq, sc->sc_irs); @@ -964,8 +994,7 @@ syncache_expand(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th, * If timestamps were negotiated the reflected timestamp * must be equal to what we actually sent in the SYN|ACK. */ - if ((to->to_flags & TOF_TS) && to->to_tsecr != sc->sc_ts && - !TOEPCB_ISSET(sc)) { + if ((to->to_flags & TOF_TS) && to->to_tsecr != sc->sc_ts) { if ((s = tcp_log_addrs(inc, th, NULL, NULL))) log(LOG_DEBUG, "%s; %s: TSECR %u != TS %u, " "segment rejected\n", @@ -993,25 +1022,6 @@ failed: return (0); } -int -tcp_offload_syncache_expand(struct in_conninfo *inc, struct toeopt *toeo, - struct tcphdr *th, struct socket **lsop, struct mbuf *m) -{ - struct tcpopt to; - int rc; - - bzero(&to, sizeof(struct tcpopt)); - to.to_mss = toeo->to_mss; - to.to_wscale = toeo->to_wscale; - to.to_flags = toeo->to_flags; - - INP_INFO_WLOCK(&V_tcbinfo); - rc = syncache_expand(inc, &to, th, lsop, m); - INP_INFO_WUNLOCK(&V_tcbinfo); - - return (rc); -} - /* * Given a LISTEN socket and an inbound SYN request, add * this to the syn cache, and send back a segment: @@ -1025,10 +1035,10 @@ tcp_offload_syncache_expand(struct in_conninfo *inc, struct toeopt *toeo, * consume all available buffer space if it were ACKed. By not ACKing * the data, we avoid this DoS scenario. */ -static void -_syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th, - struct inpcb *inp, struct socket **lsop, struct mbuf *m, - struct toe_usrreqs *tu, void *toepcb) +void +syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th, + struct inpcb *inp, struct socket **lsop, struct mbuf *m, void *tod, + void *todctx) { struct tcpcb *tp; struct socket *so; @@ -1114,11 +1124,6 @@ _syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th, sc = syncache_lookup(inc, &sch); /* returns locked entry */ SCH_LOCK_ASSERT(sch); if (sc != NULL) { -#ifndef TCP_OFFLOAD_DISABLE - if (sc->sc_tu) - sc->sc_tu->tu_syncache_event(TOE_SC_ENTRY_PRESENT, - sc->sc_toepcb); -#endif TCPSTAT_INC(tcps_sc_dupsyn); if (ipopts) { /* @@ -1151,7 +1156,7 @@ _syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th, s, __func__); free(s, M_TCPLOG); } - if (!TOEPCB_ISSET(sc) && syncache_respond(sc) == 0) { + if (syncache_respond(sc) == 0) { sc->sc_rxmits = 0; syncache_timeout(sc, sch, 1); TCPSTAT_INC(tcps_sndacks); @@ -1202,9 +1207,9 @@ _syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th, sc->sc_ip_tos = ip_tos; sc->sc_ip_ttl = ip_ttl; } -#ifndef TCP_OFFLOAD_DISABLE - sc->sc_tu = tu; - sc->sc_toepcb = toepcb; +#ifdef TCP_OFFLOAD + sc->sc_tod = tod; + sc->sc_todctx = todctx; #endif sc->sc_irs = th->th_seq; sc->sc_iss = arc4random(); @@ -1299,7 +1304,7 @@ _syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th, /* * Do a standard 3-way handshake. */ - if (TOEPCB_ISSET(sc) || syncache_respond(sc) == 0) { + if (syncache_respond(sc) == 0) { if (V_tcp_syncookies && V_tcp_syncookiesonly && sc != &scs) syncache_free(sc); else if (sc != &scs) @@ -1473,11 +1478,12 @@ syncache_respond(struct syncache *sc) optlen = 0; M_SETFIB(m, sc->sc_inc.inc_fibnum); + m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum); #ifdef INET6 if (sc->sc_inc.inc_flags & INC_ISIPV6) { - th->th_sum = 0; - th->th_sum = in6_cksum(m, IPPROTO_TCP, hlen, - tlen + optlen - hlen); + m->m_pkthdr.csum_flags = CSUM_TCP_IPV6; + th->th_sum = in6_cksum_pseudo(ip6, tlen + optlen - hlen, + IPPROTO_TCP, 0); ip6->ip6_hlim = in6_selecthlim(NULL, NULL); error = ip6_output(m, NULL, NULL, 0, NULL, NULL, NULL); } @@ -1487,41 +1493,24 @@ syncache_respond(struct syncache *sc) #endif #ifdef INET { + m->m_pkthdr.csum_flags = CSUM_TCP; th->th_sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr, htons(tlen + optlen - hlen + IPPROTO_TCP)); - m->m_pkthdr.csum_flags = CSUM_TCP; - m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum); +#ifdef TCP_OFFLOAD + if (ADDED_BY_TOE(sc)) { + struct toedev *tod = sc->sc_tod; + + error = tod->tod_syncache_respond(tod, sc->sc_todctx, m); + + return (error); + } +#endif error = ip_output(m, sc->sc_ipopts, NULL, 0, NULL, NULL); } #endif return (error); } -void -syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th, - struct inpcb *inp, struct socket **lsop, struct mbuf *m) -{ - _syncache_add(inc, to, th, inp, lsop, m, NULL, NULL); -} - -void -tcp_offload_syncache_add(struct in_conninfo *inc, struct toeopt *toeo, - struct tcphdr *th, struct inpcb *inp, struct socket **lsop, - struct toe_usrreqs *tu, void *toepcb) -{ - struct tcpopt to; - - bzero(&to, sizeof(struct tcpopt)); - to.to_mss = toeo->to_mss; - to.to_wscale = toeo->to_wscale; - to.to_flags = toeo->to_flags; - - INP_INFO_WLOCK(&V_tcbinfo); - INP_WLOCK(inp); - - _syncache_add(inc, &to, th, inp, lsop, NULL, tu, toepcb); -} - /* * The purpose of SYN cookies is to avoid keeping track of all SYN's we * receive and to be able to handle SYN floods from bogus source addresses diff --git a/sys/netinet/tcp_syncache.h b/sys/netinet/tcp_syncache.h index 5783b6d1090..d18ee07dc6b 100644 --- a/sys/netinet/tcp_syncache.h +++ b/sys/netinet/tcp_syncache.h @@ -34,8 +34,6 @@ #define _NETINET_TCP_SYNCACHE_H_ #ifdef _KERNEL -struct toeopt; - void syncache_init(void); #ifdef VIMAGE void syncache_destroy(void); @@ -43,14 +41,9 @@ void syncache_destroy(void); void syncache_unreach(struct in_conninfo *, struct tcphdr *); int syncache_expand(struct in_conninfo *, struct tcpopt *, struct tcphdr *, struct socket **, struct mbuf *); -int tcp_offload_syncache_expand(struct in_conninfo *inc, struct toeopt *toeo, - struct tcphdr *th, struct socket **lsop, struct mbuf *m); void syncache_add(struct in_conninfo *, struct tcpopt *, - struct tcphdr *, struct inpcb *, struct socket **, struct mbuf *); -void tcp_offload_syncache_add(struct in_conninfo *, struct toeopt *, - struct tcphdr *, struct inpcb *, struct socket **, - struct toe_usrreqs *tu, void *toepcb); - + struct tcphdr *, struct inpcb *, struct socket **, struct mbuf *, + void *, void *); void syncache_chkrst(struct in_conninfo *, struct tcphdr *); void syncache_badack(struct in_conninfo *); int syncache_pcbcount(void); @@ -75,10 +68,10 @@ struct syncache { u_int8_t sc_requested_s_scale:4, sc_requested_r_scale:4; u_int16_t sc_flags; -#ifndef TCP_OFFLOAD_DISABLE - struct toe_usrreqs *sc_tu; /* TOE operations */ - void *sc_toepcb; /* TOE protocol block */ -#endif +#if defined(TCP_OFFLOAD) || !defined(TCP_OFFLOAD_DISABLE) + struct toedev *sc_tod; /* entry added by this TOE */ + void *sc_todctx; /* TOE driver context */ +#endif struct label *sc_label; /* MAC label reference */ struct ucred *sc_cred; /* cred cache for jail checks */ diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c index 9c3c74925be..b3ddacc6b7d 100644 --- a/sys/netinet/tcp_timer.c +++ b/sys/netinet/tcp_timer.c @@ -602,6 +602,11 @@ tcp_timer_activate(struct tcpcb *tp, int timer_type, u_int delta) struct inpcb *inp = tp->t_inpcb; int cpu = INP_CPU(inp); +#ifdef TCP_OFFLOAD + if (tp->t_flags & TF_TOE) + return; +#endif + switch (timer_type) { case TT_DELACK: t_callout = &tp->t_timers->tt_delack; diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c index 894e926e9e5..397aaae9733 100644 --- a/sys/netinet/tcp_timewait.c +++ b/sys/netinet/tcp_timewait.c @@ -574,10 +574,12 @@ tcp_twrespond(struct tcptw *tw, int flags) th->th_flags = flags; th->th_win = htons(tw->last_win); + m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum); #ifdef INET6 if (isipv6) { - th->th_sum = in6_cksum(m, IPPROTO_TCP, sizeof(struct ip6_hdr), - sizeof(struct tcphdr) + optlen); + m->m_pkthdr.csum_flags = CSUM_TCP_IPV6; + th->th_sum = in6_cksum_pseudo(ip6, + sizeof(struct tcphdr) + optlen, IPPROTO_TCP, 0); ip6->ip6_hlim = in6_selecthlim(inp, NULL); error = ip6_output(m, inp->in6p_outputopts, NULL, (tw->tw_so_options & SO_DONTROUTE), NULL, NULL, inp); @@ -588,10 +590,9 @@ tcp_twrespond(struct tcptw *tw, int flags) #endif #ifdef INET { + m->m_pkthdr.csum_flags = CSUM_TCP; th->th_sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr, htons(sizeof(struct tcphdr) + optlen + IPPROTO_TCP)); - m->m_pkthdr.csum_flags = CSUM_TCP; - m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum); ip->ip_len = m->m_pkthdr.len; if (V_path_mtu_discovery) ip->ip_off |= IP_DF; diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index a9045f31483..b69961e222b 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -87,7 +87,9 @@ __FBSDID("$FreeBSD$"); #ifdef TCPDEBUG #include #endif +#ifdef TCP_OFFLOAD #include +#endif /* * TCP protocol interface to socket abstraction. @@ -367,7 +369,9 @@ tcp_usr_listen(struct socket *so, int backlog, struct thread *td) if (error == 0) { tp->t_state = TCPS_LISTEN; solisten_proto(so, backlog); - tcp_offload_listen_open(tp); +#ifdef TCP_OFFLOAD + tcp_offload_listen_start(tp); +#endif } SOCK_UNLOCK(so); @@ -409,6 +413,9 @@ tcp6_usr_listen(struct socket *so, int backlog, struct thread *td) if (error == 0) { tp->t_state = TCPS_LISTEN; solisten_proto(so, backlog); +#ifdef TCP_OFFLOAD + tcp_offload_listen_start(tp); +#endif } SOCK_UNLOCK(so); @@ -459,7 +466,13 @@ tcp_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td) TCPDEBUG1(); if ((error = tcp_connect(tp, nam, td)) != 0) goto out; - error = tcp_output_connect(so, nam); +#ifdef TCP_OFFLOAD + if (registered_toedevs > 0 && + (error = tcp_offload_connect(so, nam)) == 0) + goto out; +#endif + tcp_timer_activate(tp, TT_KEEP, TP_KEEPINIT(tp)); + error = tcp_output(tp); out: TCPDEBUG2(PRU_CONNECT); INP_WUNLOCK(inp); @@ -519,7 +532,12 @@ tcp6_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td) goto out; if ((error = tcp_connect(tp, (struct sockaddr *)&sin, td)) != 0) goto out; - error = tcp_output_connect(so, nam); +#ifdef TCP_OFFLOAD + if (registered_toedevs > 0 && + (error = tcp_offload_connect(so, nam)) == 0) + goto out; +#endif + error = tcp_output(tp); goto out; } #endif @@ -530,7 +548,13 @@ tcp6_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td) goto out; if ((error = tcp6_connect(tp, nam, td)) != 0) goto out; - error = tcp_output_connect(so, nam); +#ifdef TCP_OFFLOAD + if (registered_toedevs > 0 && + (error = tcp_offload_connect(so, nam)) == 0) + goto out; +#endif + tcp_timer_activate(tp, TT_KEEP, TP_KEEPINIT(tp)); + error = tcp_output(tp); out: TCPDEBUG2(PRU_CONNECT); @@ -709,7 +733,7 @@ tcp_usr_shutdown(struct socket *so) socantsendmore(so); tcp_usrclosed(tp); if (!(inp->inp_flags & INP_DROPPED)) - error = tcp_output_disconnect(tp); + error = tcp_output(tp); out: TCPDEBUG2(PRU_SHUTDOWN); @@ -739,7 +763,11 @@ tcp_usr_rcvd(struct socket *so, int flags) } tp = intotcpcb(inp); TCPDEBUG1(); - tcp_output_rcvd(tp); +#ifdef TCP_OFFLOAD + if (tp->t_flags & TF_TOE) + tcp_offload_rcvd(tp); +#endif + tcp_output(tp); out: TCPDEBUG2(PRU_RCVD); @@ -835,7 +863,7 @@ tcp_usr_send(struct socket *so, int flags, struct mbuf *m, if (!(inp->inp_flags & INP_DROPPED)) { if (flags & PRUS_MORETOCOME) tp->t_flags |= TF_MORETOCOME; - error = tcp_output_send(tp); + error = tcp_output(tp); if (flags & PRUS_MORETOCOME) tp->t_flags &= ~TF_MORETOCOME; } @@ -884,7 +912,7 @@ tcp_usr_send(struct socket *so, int flags, struct mbuf *m, } tp->snd_up = tp->snd_una + so->so_snd.sb_cc; tp->t_flags |= TF_FORCEDATA; - error = tcp_output_send(tp); + error = tcp_output(tp); tp->t_flags &= ~TF_FORCEDATA; } out: @@ -1119,7 +1147,6 @@ tcp_connect(struct tcpcb *tp, struct sockaddr *nam, struct thread *td) soisconnecting(so); TCPSTAT_INC(tcps_connattempt); tp->t_state = TCPS_SYN_SENT; - tcp_timer_activate(tp, TT_KEEP, TP_KEEPINIT(tp)); tp->iss = tcp_new_isn(tp); tcp_sendseqinit(tp); @@ -1192,7 +1219,6 @@ tcp6_connect(struct tcpcb *tp, struct sockaddr *nam, struct thread *td) soisconnecting(so); TCPSTAT_INC(tcps_connattempt); tp->t_state = TCPS_SYN_SENT; - tcp_timer_activate(tp, TT_KEEP, TP_KEEPINIT(tp)); tp->iss = tcp_new_isn(tp); tcp_sendseqinit(tp); @@ -1323,9 +1349,9 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt) tp->t_flags |= TF_SIGNATURE; else tp->t_flags &= ~TF_SIGNATURE; - INP_WUNLOCK(inp); - break; + goto unlock_and_done; #endif /* TCP_SIGNATURE */ + case TCP_NODELAY: case TCP_NOOPT: INP_WUNLOCK(inp); @@ -1351,6 +1377,13 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt) tp->t_flags |= opt; else tp->t_flags &= ~opt; +unlock_and_done: +#ifdef TCP_OFFLOAD + if (tp->t_flags & TF_TOE) { + tcp_offload_ctloutput(tp, sopt->sopt_dir, + sopt->sopt_name); + } +#endif INP_WUNLOCK(inp); break; @@ -1369,8 +1402,7 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt) if (TCPS_HAVEESTABLISHED(tp->t_state)) error = tcp_output(tp); } - INP_WUNLOCK(inp); - break; + goto unlock_and_done; case TCP_MAXSEG: INP_WUNLOCK(inp); @@ -1385,8 +1417,7 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt) tp->t_maxseg = optval; else error = EINVAL; - INP_WUNLOCK(inp); - break; + goto unlock_and_done; case TCP_INFO: INP_WUNLOCK(inp); @@ -1438,8 +1469,7 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt) } } CC_LIST_RUNLOCK(); - INP_WUNLOCK(inp); - break; + goto unlock_and_done; case TCP_KEEPIDLE: case TCP_KEEPINTVL: @@ -1491,8 +1521,7 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt) TP_KEEPINIT(tp)); break; } - INP_WUNLOCK(inp); - break; + goto unlock_and_done; default: INP_WUNLOCK(inp); @@ -1635,7 +1664,7 @@ tcp_disconnect(struct tcpcb *tp) sbflush(&so->so_rcv); tcp_usrclosed(tp); if (!(inp->inp_flags & INP_DROPPED)) - tcp_output_disconnect(tp); + tcp_output(tp); } } @@ -1658,7 +1687,9 @@ tcp_usrclosed(struct tcpcb *tp) switch (tp->t_state) { case TCPS_LISTEN: - tcp_offload_listen_close(tp); +#ifdef TCP_OFFLOAD + tcp_offload_listen_stop(tp); +#endif /* FALLTHROUGH */ case TCPS_CLOSED: tp->t_state = TCPS_CLOSED; diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h index 3b8bdf7d58e..90ecca14700 100644 --- a/sys/netinet/tcp_var.h +++ b/sys/netinet/tcp_var.h @@ -194,7 +194,7 @@ struct tcpcb { int t_rttlow; /* smallest observerved RTT */ u_int32_t rfbuf_ts; /* recv buffer autoscaling timestamp */ int rfbuf_cnt; /* recv buffer autoscaling byte count */ - struct toe_usrreqs *t_tu; /* offload operations vector */ + struct toedev *tod; /* toedev handling this connection */ int t_sndrexmitpack; /* retransmit packets sent */ int t_rcvoopack; /* out-of-order packets received */ void *t_toe; /* TOE pcb pointer */ diff --git a/sys/netinet/toecore.c b/sys/netinet/toecore.c new file mode 100644 index 00000000000..4b4efb79ee1 --- /dev/null +++ b/sys/netinet/toecore.c @@ -0,0 +1,575 @@ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * Written by: Navdeep Parhar + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_inet.h" +#include "opt_inet6.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#define TCPSTATES +#include +#include +#include +#include +#include +#include +#include + +static struct mtx toedev_lock; +static TAILQ_HEAD(, toedev) toedev_list; +static eventhandler_tag listen_start_eh; +static eventhandler_tag listen_stop_eh; +static eventhandler_tag lle_event_eh; +static eventhandler_tag route_redirect_eh; + +static int +toedev_connect(struct toedev *tod __unused, struct socket *so __unused, + struct rtentry *rt __unused, struct sockaddr *nam __unused) +{ + + return (ENOTSUP); +} + +static int +toedev_listen_start(struct toedev *tod __unused, struct tcpcb *tp __unused) +{ + + return (ENOTSUP); +} + +static int +toedev_listen_stop(struct toedev *tod __unused, struct tcpcb *tp __unused) +{ + + return (ENOTSUP); +} + +static void +toedev_input(struct toedev *tod __unused, struct tcpcb *tp __unused, + struct mbuf *m) +{ + + m_freem(m); + return; +} + +static void +toedev_rcvd(struct toedev *tod __unused, struct tcpcb *tp __unused) +{ + + return; +} + +static int +toedev_output(struct toedev *tod __unused, struct tcpcb *tp __unused) +{ + + return (ENOTSUP); +} + +static void +toedev_pcb_detach(struct toedev *tod __unused, struct tcpcb *tp __unused) +{ + + return; +} + +static void +toedev_l2_update(struct toedev *tod __unused, struct ifnet *ifp __unused, + struct sockaddr *sa __unused, uint8_t *lladdr __unused, + uint16_t vtag __unused) +{ + + return; +} + +static void +toedev_route_redirect(struct toedev *tod __unused, struct ifnet *ifp __unused, + struct rtentry *rt0 __unused, struct rtentry *rt1 __unused) +{ + + return; +} + +static void +toedev_syncache_added(struct toedev *tod __unused, void *ctx __unused) +{ + + return; +} + +static void +toedev_syncache_removed(struct toedev *tod __unused, void *ctx __unused) +{ + + return; +} + +static int +toedev_syncache_respond(struct toedev *tod __unused, void *ctx __unused, + struct mbuf *m) +{ + + m_freem(m); + return (0); +} + +static void +toedev_offload_socket(struct toedev *tod __unused, void *ctx __unused, + struct socket *so __unused) +{ + + return; +} + +static void +toedev_ctloutput(struct toedev *tod __unused, struct tcpcb *tp __unused, + int sopt_dir __unused, int sopt_name __unused) +{ + + return; +} + +/* + * Inform one or more TOE devices about a listening socket. + */ +static void +toe_listen_start(struct inpcb *inp, void *arg) +{ + struct toedev *t, *tod; + struct tcpcb *tp; + + INP_WLOCK_ASSERT(inp); + KASSERT(inp->inp_pcbinfo == &V_tcbinfo, + ("%s: inp is not a TCP inp", __func__)); + + if (inp->inp_flags & (INP_DROPPED | INP_TIMEWAIT)) + return; + + tp = intotcpcb(inp); + if (tp->t_state != TCPS_LISTEN) + return; + + t = arg; + mtx_lock(&toedev_lock); + TAILQ_FOREACH(tod, &toedev_list, link) { + if (t == NULL || t == tod) + tod->tod_listen_start(tod, tp); + } + mtx_unlock(&toedev_lock); +} + +static void +toe_listen_start_event(void *arg __unused, struct tcpcb *tp) +{ + struct inpcb *inp = tp->t_inpcb; + + INP_WLOCK_ASSERT(inp); + KASSERT(tp->t_state == TCPS_LISTEN, + ("%s: t_state %s", __func__, tcpstates[tp->t_state])); + + toe_listen_start(inp, NULL); +} + +static void +toe_listen_stop_event(void *arg __unused, struct tcpcb *tp) +{ + struct toedev *tod; +#ifdef INVARIANTS + struct inpcb *inp = tp->t_inpcb; +#endif + + INP_WLOCK_ASSERT(inp); + KASSERT(tp->t_state == TCPS_LISTEN, + ("%s: t_state %s", __func__, tcpstates[tp->t_state])); + + mtx_lock(&toedev_lock); + TAILQ_FOREACH(tod, &toedev_list, link) + tod->tod_listen_stop(tod, tp); + mtx_unlock(&toedev_lock); +} + +/* + * Fill up a freshly allocated toedev struct with reasonable defaults. + */ +void +init_toedev(struct toedev *tod) +{ + + tod->tod_softc = NULL; + + /* + * Provide no-op defaults so that the kernel can call any toedev + * function without having to check whether the TOE driver supplied one + * or not. + */ + tod->tod_connect = toedev_connect; + tod->tod_listen_start = toedev_listen_start; + tod->tod_listen_stop = toedev_listen_stop; + tod->tod_input = toedev_input; + tod->tod_rcvd = toedev_rcvd; + tod->tod_output = toedev_output; + tod->tod_send_rst = toedev_output; + tod->tod_send_fin = toedev_output; + tod->tod_pcb_detach = toedev_pcb_detach; + tod->tod_l2_update = toedev_l2_update; + tod->tod_route_redirect = toedev_route_redirect; + tod->tod_syncache_added = toedev_syncache_added; + tod->tod_syncache_removed = toedev_syncache_removed; + tod->tod_syncache_respond = toedev_syncache_respond; + tod->tod_offload_socket = toedev_offload_socket; + tod->tod_ctloutput = toedev_ctloutput; +} + +/* + * Register an active TOE device with the system. This allows it to receive + * notifications from the kernel. + */ +int +register_toedev(struct toedev *tod) +{ + struct toedev *t; + + mtx_lock(&toedev_lock); + TAILQ_FOREACH(t, &toedev_list, link) { + if (t == tod) { + mtx_unlock(&toedev_lock); + return (EEXIST); + } + } + + TAILQ_INSERT_TAIL(&toedev_list, tod, link); + registered_toedevs++; + mtx_unlock(&toedev_lock); + + inp_apply_all(toe_listen_start, tod); + + return (0); +} + +/* + * Remove the TOE device from the global list of active TOE devices. It is the + * caller's responsibility to ensure that the TOE device is quiesced prior to + * this call. + */ +int +unregister_toedev(struct toedev *tod) +{ + struct toedev *t, *t2; + int rc = ENODEV; + + mtx_lock(&toedev_lock); + TAILQ_FOREACH_SAFE(t, &toedev_list, link, t2) { + if (t == tod) { + TAILQ_REMOVE(&toedev_list, tod, link); + registered_toedevs--; + rc = 0; + break; + } + } + KASSERT(registered_toedevs >= 0, + ("%s: registered_toedevs (%d) < 0", __func__, registered_toedevs)); + mtx_unlock(&toedev_lock); + return (rc); +} + +void +toe_syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th, + struct inpcb *inp, void *tod, void *todctx) +{ + struct socket *lso = inp->inp_socket; + + INP_INFO_WLOCK_ASSERT(&V_tcbinfo); + INP_WLOCK_ASSERT(inp); + + syncache_add(inc, to, th, inp, &lso, NULL, tod, todctx); +} + +int +toe_syncache_expand(struct in_conninfo *inc, struct tcpopt *to, + struct tcphdr *th, struct socket **lsop) +{ + + INP_INFO_WLOCK_ASSERT(&V_tcbinfo); + + return (syncache_expand(inc, to, th, lsop, NULL)); +} + +/* + * General purpose check to see if a 4-tuple is in use by the kernel. If a TCP + * header (presumably for an incoming SYN) is also provided, an existing 4-tuple + * in TIME_WAIT may be assassinated freeing it up for re-use. + * + * Note that the TCP header must have been run through tcp_fields_to_host() or + * equivalent. + */ +int +toe_4tuple_check(struct in_conninfo *inc, struct tcphdr *th, struct ifnet *ifp) +{ + struct inpcb *inp; + + if (inc->inc_flags & INC_ISIPV6) + return (ENOSYS); /* XXX: implement */ + + inp = in_pcblookup(&V_tcbinfo, inc->inc_faddr, inc->inc_fport, + inc->inc_laddr, inc->inc_lport, INPLOOKUP_WLOCKPCB, ifp); + if (inp != NULL) { + INP_WLOCK_ASSERT(inp); + + if ((inp->inp_flags & INP_TIMEWAIT) && th != NULL) { + + INP_INFO_WLOCK_ASSERT(&V_tcbinfo); /* for twcheck */ + if (!tcp_twcheck(inp, NULL, th, NULL, 0)) + return (EADDRINUSE); + } else { + INP_WUNLOCK(inp); + return (EADDRINUSE); + } + } + + return (0); +} + +static void +toe_lle_event(void *arg __unused, struct llentry *lle, int evt) +{ + struct toedev *tod; + struct ifnet *ifp; + struct sockaddr *sa; + uint8_t *lladdr; + uint16_t vtag; + + LLE_WLOCK_ASSERT(lle); + + ifp = lle->lle_tbl->llt_ifp; + sa = L3_ADDR(lle); + + KASSERT(sa->sa_family == AF_INET || sa->sa_family == AF_INET6, + ("%s: lle_event %d for lle %p but sa %p !INET && !INET6", + __func__, evt, lle, sa)); + + /* + * Not interested if the interface's TOE capability is not enabled. + */ + if ((sa->sa_family == AF_INET && !(ifp->if_capenable & IFCAP_TOE4)) || + (sa->sa_family == AF_INET6 && !(ifp->if_capenable & IFCAP_TOE6))) + return; + + tod = TOEDEV(ifp); + if (tod == NULL) + return; + + vtag = 0xfff; + if (evt != LLENTRY_RESOLVED) { + + /* + * LLENTRY_TIMEDOUT, LLENTRY_DELETED, LLENTRY_EXPIRED all mean + * this entry is going to be deleted. + */ + + lladdr = NULL; + } else { + + KASSERT(lle->la_flags & LLE_VALID, + ("%s: %p resolved but not valid?", __func__, lle)); + + lladdr = (uint8_t *)&lle->ll_addr; +#ifdef VLAN_TAG + VLAN_TAG(ifp, &vtag); +#endif + } + + tod->tod_l2_update(tod, ifp, sa, lladdr, vtag); +} + +/* + * XXX: implement. + */ +static void +toe_route_redirect_event(void *arg __unused, struct rtentry *rt0, + struct rtentry *rt1, struct sockaddr *sa) +{ + + return; +} + +/* + * Returns 0 or EWOULDBLOCK on success (any other value is an error). 0 means + * lladdr and vtag are valid on return, EWOULDBLOCK means the TOE driver's + * tod_l2_update will be called later, when the entry is resolved or times out. + */ +int +toe_l2_resolve(struct toedev *tod, struct ifnet *ifp, struct sockaddr *sa, + uint8_t *lladdr, uint16_t *vtag) +{ + struct llentry *lle; + int rc; + + switch (sa->sa_family) { +#ifdef INET + case AF_INET: + rc = arpresolve(ifp, NULL, NULL, sa, lladdr, &lle); + break; +#endif +#ifdef INET6 + case AF_INET6: + rc = nd6_storelladdr(ifp, NULL, sa, lladdr, &lle); + break; +#endif + default: + return (EPROTONOSUPPORT); + } + + if (rc == 0) { +#ifdef VLAN_TAG + if (VLAN_TAG(ifp, vtag) != 0) +#endif + *vtag = 0xfff; + } + + return (rc); +} + +void +toe_connect_failed(struct toedev *tod, struct tcpcb *tp, int err) +{ + struct inpcb *inp = tp->t_inpcb; + + INP_WLOCK_ASSERT(inp); + KASSERT(tp->t_flags & TF_TOE, + ("%s: tp %p not offloaded.", __func__, tp)); + + if (!(inp->inp_flags & INP_DROPPED)) { + if (err == EAGAIN) { + + /* + * Temporary failure during offload, take this PCB back. + * Detach from the TOE driver and do the rest of what + * TCP's pru_connect would have done if the connection + * wasn't offloaded. + */ + + tod->tod_pcb_detach(tod, tp); + KASSERT(!(tp->t_flags & TF_TOE), + ("%s: tp %p still offloaded.", __func__, tp)); + tcp_timer_activate(tp, TT_KEEP, TP_KEEPINIT(tp)); + (void) tcp_output(tp); + } else { + + INP_INFO_WLOCK_ASSERT(&V_tcbinfo); + tp = tcp_drop(tp, err); + if (tp == NULL) + INP_WLOCK(inp); /* re-acquire */ + } + } + INP_WLOCK_ASSERT(inp); +} + +static int +toecore_load(void) +{ + + mtx_init(&toedev_lock, "toedev lock", NULL, MTX_DEF); + TAILQ_INIT(&toedev_list); + + listen_start_eh = EVENTHANDLER_REGISTER(tcp_offload_listen_start, + toe_listen_start_event, NULL, EVENTHANDLER_PRI_ANY); + listen_stop_eh = EVENTHANDLER_REGISTER(tcp_offload_listen_stop, + toe_listen_stop_event, NULL, EVENTHANDLER_PRI_ANY); + lle_event_eh = EVENTHANDLER_REGISTER(lle_event, toe_lle_event, NULL, + EVENTHANDLER_PRI_ANY); + route_redirect_eh = EVENTHANDLER_REGISTER(route_redirect_event, + toe_route_redirect_event, NULL, EVENTHANDLER_PRI_ANY); + + return (0); +} + +static int +toecore_unload(void) +{ + + mtx_lock(&toedev_lock); + if (!TAILQ_EMPTY(&toedev_list)) { + mtx_unlock(&toedev_lock); + return (EBUSY); + } + + EVENTHANDLER_DEREGISTER(tcp_offload_listen_start, listen_start_eh); + EVENTHANDLER_DEREGISTER(tcp_offload_listen_stop, listen_stop_eh); + EVENTHANDLER_DEREGISTER(lle_event, lle_event_eh); + EVENTHANDLER_DEREGISTER(route_redirect_event, route_redirect_eh); + + mtx_unlock(&toedev_lock); + mtx_destroy(&toedev_lock); + + return (0); +} + +static int +toecore_mod_handler(module_t mod, int cmd, void *arg) +{ + + if (cmd == MOD_LOAD) + return (toecore_load()); + + if (cmd == MOD_UNLOAD) + return (toecore_unload()); + + return (EOPNOTSUPP); +} + +static moduledata_t mod_data= { + "toecore", + toecore_mod_handler, + 0 +}; + +MODULE_VERSION(toecore, 1); +DECLARE_MODULE(toecore, mod_data, SI_SUB_EXEC, SI_ORDER_ANY); diff --git a/sys/netinet/toecore.h b/sys/netinet/toecore.h new file mode 100644 index 00000000000..a38182574e2 --- /dev/null +++ b/sys/netinet/toecore.h @@ -0,0 +1,130 @@ +/*- + * Copyright (c) 2012 Chelsio Communications, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _NETINET_TOE_H_ +#define _NETINET_TOE_H_ + +#ifndef _KERNEL +#error "no user-serviceable parts inside" +#endif + +struct tcpopt; +struct tcphdr; +struct in_conninfo; + +struct toedev { + TAILQ_ENTRY(toedev) link; /* glue for toedev_list */ + void *tod_softc; /* TOE driver private data */ + + /* + * Active open. If a failure occurs, it is reported back by the driver + * via toe_connect_failed. + */ + int (*tod_connect)(struct toedev *, struct socket *, struct rtentry *, + struct sockaddr *); + + /* Passive open. */ + int (*tod_listen_start)(struct toedev *, struct tcpcb *); + int (*tod_listen_stop)(struct toedev *, struct tcpcb *); + + /* + * The kernel uses this routine to pass on any frame it receives for an + * offloaded connection to the TOE driver. This is an unusual event. + */ + void (*tod_input)(struct toedev *, struct tcpcb *, struct mbuf *); + + /* + * This is called by the kernel during pru_rcvd for an offloaded TCP + * connection and provides an opportunity for the TOE driver to manage + * its rx window and credits. + */ + void (*tod_rcvd)(struct toedev *, struct tcpcb *); + + /* + * Transmit routine. The kernel calls this to have the TOE driver + * evaluate whether there is data to be transmitted, and transmit it. + */ + int (*tod_output)(struct toedev *, struct tcpcb *); + + /* Immediate teardown: send RST to peer. */ + int (*tod_send_rst)(struct toedev *, struct tcpcb *); + + /* Initiate orderly disconnect by sending FIN to the peer. */ + int (*tod_send_fin)(struct toedev *, struct tcpcb *); + + /* Called to indicate that the kernel is done with this TCP PCB. */ + void (*tod_pcb_detach)(struct toedev *, struct tcpcb *); + + /* + * The kernel calls this once it has information about an L2 entry that + * the TOE driver enquired about previously (via toe_l2_resolve). + */ + void (*tod_l2_update)(struct toedev *, struct ifnet *, + struct sockaddr *, uint8_t *, uint16_t); + + /* XXX. Route has been redirected. */ + void (*tod_route_redirect)(struct toedev *, struct ifnet *, + struct rtentry *, struct rtentry *); + + /* Syncache interaction. */ + void (*tod_syncache_added)(struct toedev *, void *); + void (*tod_syncache_removed)(struct toedev *, void *); + int (*tod_syncache_respond)(struct toedev *, void *, struct mbuf *); + void (*tod_offload_socket)(struct toedev *, void *, struct socket *); + + /* TCP socket option */ + void (*tod_ctloutput)(struct toedev *, struct tcpcb *, int, int); +}; + +#include +typedef void (*tcp_offload_listen_start_fn)(void *, struct tcpcb *); +typedef void (*tcp_offload_listen_stop_fn)(void *, struct tcpcb *); +EVENTHANDLER_DECLARE(tcp_offload_listen_start, tcp_offload_listen_start_fn); +EVENTHANDLER_DECLARE(tcp_offload_listen_stop, tcp_offload_listen_stop_fn); + +void init_toedev(struct toedev *); +int register_toedev(struct toedev *); +int unregister_toedev(struct toedev *); + +/* + * General interface for looking up L2 information for an IP address. If an + * answer is not available right away then the TOE driver's tod_l2_update will + * be called later. + */ +int toe_l2_resolve(struct toedev *, struct ifnet *, struct sockaddr *, + uint8_t *, uint16_t *); + +void toe_connect_failed(struct toedev *, struct tcpcb *, int); + +void toe_syncache_add(struct in_conninfo *, struct tcpopt *, struct tcphdr *, + struct inpcb *, void *, void *); +int toe_syncache_expand(struct in_conninfo *, struct tcpopt *, struct tcphdr *, + struct socket **); + +int toe_4tuple_check(struct in_conninfo *, struct tcphdr *, struct ifnet *); +#endif diff --git a/sys/netinet/toedev.h b/sys/netinet/toedev.h deleted file mode 100644 index 7edaca126fa..00000000000 --- a/sys/netinet/toedev.h +++ /dev/null @@ -1,162 +0,0 @@ -/*- - * Copyright (c) 2007, Chelsio Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Neither the name of the Chelsio Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _NETINET_TOEDEV_H_ -#define _NETINET_TOEDEV_H_ - -#ifndef _KERNEL -#error "no user-serviceable parts inside" -#endif - -extern uint32_t toedev_registration_count; - -/* Parameter values for offload_get_phys_egress(). */ -enum { - TOE_OPEN, - TOE_FAILOVER, -}; - -/* Parameter values for toe_failover(). */ -enum { - TOE_ACTIVE_SLAVE, - TOE_LINK_DOWN, - TOE_LINK_UP, - TOE_RELEASE, - TOE_RELEASE_ALL, -}; - -#define TOENAMSIZ 16 - -/* Get the toedev associated with a ifnet. */ -#define TOEDEV(ifp) ((ifp)->if_llsoftc) - -struct offload_id { - unsigned int id; - unsigned long data; -}; - -struct ifnet; -struct rt_entry; -struct tom_info; -struct sysctl_oid; -struct socket; -struct mbuf; - -struct toedev { - TAILQ_ENTRY(toedev) entry; - char tod_name[TOENAMSIZ]; /* TOE device name */ - unsigned int tod_ttid; /* TOE type id */ - unsigned long tod_flags; /* device flags */ - unsigned int tod_mtu; /* max TX offloaded data */ - unsigned int tod_nconn; /* max # of offloaded - * connections - */ - struct ifnet *tod_lldev; /* first interface */ - const struct tom_info *tod_offload_mod; /* TCP offload module */ - - /* - * This TOE device is capable of offloading the connection for socket so - */ - int (*tod_can_offload)(struct toedev *dev, struct socket *so); - - /* - * Establish a connection to nam using the TOE device dev - */ - int (*tod_connect)(struct toedev *dev, struct socket *so, - struct rtentry *rt, struct sockaddr *nam); - /* - * Send an mbuf down to the toe device - */ - int (*tod_send)(struct toedev *dev, struct mbuf *m); - /* - * Receive an array of mbufs from the TOE device dev - */ - int (*tod_recv)(struct toedev *dev, struct mbuf **m, int n); - /* - * Device specific ioctl interface - */ - int (*tod_ctl)(struct toedev *dev, unsigned int req, void *data); - /* - * Update L2 entry in toedev - */ - void (*tod_arp_update)(struct toedev *dev, struct rtentry *neigh); - /* - * Failover from one toe device to another - */ - void (*tod_failover)(struct toedev *dev, struct ifnet *bond_ifp, - struct ifnet *ndev, int event); - void *tod_priv; /* driver private data */ - void *tod_l2opt; /* optional layer 2 data */ - void *tod_l3opt; /* optional layer 3 data */ - void *tod_l4opt; /* optional layer 4 data */ - void *tod_ulp; /* upper lever protocol */ -}; - -struct tom_info { - TAILQ_ENTRY(tom_info) entry; - int (*ti_attach)(struct toedev *dev, - const struct offload_id *entry); - int (*ti_detach)(struct toedev *dev); - const char *ti_name; - const struct offload_id *ti_id_table; -}; - -static __inline void -init_offload_dev(struct toedev *dev) -{ -} - -int register_tom(struct tom_info *t); -int unregister_tom(struct tom_info *t); -int register_toedev(struct toedev *dev, const char *name); -int unregister_toedev(struct toedev *dev); -int activate_offload(struct toedev *dev); -int toe_send(struct toedev *dev, struct mbuf *m); -void toe_arp_update(struct rtentry *rt); -struct ifnet *offload_get_phys_egress(struct ifnet *ifp, - struct socket *so, int context); -int toe_receive_mbuf(struct toedev *dev, struct mbuf **m, int n); - -static __inline void -toe_neigh_update(struct ifnet *ifp) -{ -} - -static __inline void -toe_failover(struct ifnet *bond_ifp, struct ifnet *fail_ifp, int event) -{ -} - -static __inline int -toe_enslave(struct ifnet *bond_ifp, struct ifnet *slave_ifp) -{ - return (0); -} - -#endif /* _NETINET_TOEDEV_H_ */ diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 2056bafee1f..9f947a69367 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -956,6 +956,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr, int ipflags; u_short fport, lport; int unlock_udbinfo; + u_char tos; /* * udp_output() may need to temporarily bind or connect the current @@ -971,12 +972,15 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr, } src.sin_family = 0; + INP_RLOCK(inp); + tos = inp->inp_ip_tos; if (control != NULL) { /* * XXX: Currently, we assume all the optional information is * stored in a single mbuf. */ if (control->m_next) { + INP_RUNLOCK(inp); m_freem(control); m_freem(m); return (EINVAL); @@ -1008,6 +1012,14 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr, *(struct in_addr *)CMSG_DATA(cm); break; + case IP_TOS: + if (cm->cmsg_len != CMSG_LEN(sizeof(u_char))) { + error = EINVAL; + break; + } + tos = *(u_char *)CMSG_DATA(cm); + break; + default: error = ENOPROTOOPT; break; @@ -1018,6 +1030,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr, m_freem(control); } if (error) { + INP_RUNLOCK(inp); m_freem(m); return (error); } @@ -1039,7 +1052,6 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr, * XXXRW: Check that hash locking update here is correct. */ sin = (struct sockaddr_in *)addr; - INP_RLOCK(inp); if (sin != NULL && (inp->inp_laddr.s_addr == INADDR_ANY && inp->inp_lport == 0)) { INP_RUNLOCK(inp); @@ -1223,7 +1235,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr, ui->ui_sum = 0; ((struct ip *)ui)->ip_len = sizeof (struct udpiphdr) + len; ((struct ip *)ui)->ip_ttl = inp->inp_ip_ttl; /* XXX */ - ((struct ip *)ui)->ip_tos = inp->inp_ip_tos; /* XXX */ + ((struct ip *)ui)->ip_tos = tos; /* XXX */ UDPSTAT_INC(udps_opackets); if (unlock_udbinfo == UH_WLOCKED) diff --git a/sys/netinet6/frag6.c b/sys/netinet6/frag6.c index 1523133d3db..b2e8e047bd5 100644 --- a/sys/netinet6/frag6.c +++ b/sys/netinet6/frag6.c @@ -221,6 +221,19 @@ frag6_input(struct mbuf **mp, int *offp, int proto) /* offset now points to data portion */ offset += sizeof(struct ip6_frag); + /* + * XXX-BZ RFC XXXX (draft-gont-6man-ipv6-atomic-fragments) + * Handle "atomic" fragments (offset and m bit set to 0) upfront, + * unrelated to any reassembly. Just skip the fragment header. + */ + if ((ip6f->ip6f_offlg & ~IP6F_RESERVED_MASK) == 0) { + /* XXX-BZ we want dedicated counters for this. */ + V_ip6stat.ip6s_reassembled++; + in6_ifstat_inc(dstifp, ifs6_reass_ok); + *offp = offset; + return (ip6f->ip6f_nxt); + } + IP6Q_LOCK(); /* diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c index 967d01a43a5..a1e19d9cae9 100644 --- a/sys/netinet6/icmp6.c +++ b/sys/netinet6/icmp6.c @@ -2418,23 +2418,23 @@ icmp6_redirect_input(struct mbuf *m, int off) if (rt) { if (rt->rt_gateway == NULL || rt->rt_gateway->sa_family != AF_INET6) { + RTFREE_LOCKED(rt); nd6log((LOG_ERR, "ICMP6 redirect rejected; no route " "with inet6 gateway found for redirect dst: %s\n", icmp6_redirect_diag(&src6, &reddst6, &redtgt6))); - RTFREE_LOCKED(rt); goto bad; } gw6 = &(((struct sockaddr_in6 *)rt->rt_gateway)->sin6_addr); if (bcmp(&src6, gw6, sizeof(struct in6_addr)) != 0) { + RTFREE_LOCKED(rt); nd6log((LOG_ERR, "ICMP6 redirect rejected; " "not equal to gw-for-src=%s (must be same): " "%s\n", ip6_sprintf(ip6buf, gw6), icmp6_redirect_diag(&src6, &reddst6, &redtgt6))); - RTFREE_LOCKED(rt); goto bad; } } else { diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index ca491b8e4c3..960b887fbf0 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -1330,6 +1330,7 @@ in6_purgeaddr_mc(struct ifnet *ifp, struct in6_ifaddr *ia, struct ifaddr *ifa0) struct sockaddr_in6 mltaddr, mltmask; struct in6_multi_mship *imm; struct rtentry *rt; + struct sockaddr_in6 sin6; int error; /* @@ -1356,6 +1357,21 @@ in6_purgeaddr_mc(struct ifnet *ifp, struct in6_ifaddr *ia, struct ifaddr *ifa0) if ((error = in6_setscope(&mltaddr.sin6_addr, ifp, NULL)) != 0) return (error); + /* + * As for the mltaddr above, proactively prepare the sin6 to avoid + * rtentry un- and re-locking. + */ + if (ifa0 != NULL) { + bzero(&sin6, sizeof(sin6)); + sin6.sin6_len = sizeof(sin6); + sin6.sin6_family = AF_INET6; + memcpy(&sin6.sin6_addr, &satosin6(ifa0->ifa_addr)->sin6_addr, + sizeof(sin6.sin6_addr)); + error = in6_setscope(&sin6.sin6_addr, ifa0->ifa_ifp, NULL); + if (error != 0) + return (error); + } + rt = in6_rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL, RT_DEFAULT_FIB); if (rt != NULL && rt->rt_gateway != NULL && (memcmp(&satosin6(rt->rt_gateway)->sin6_addr, @@ -1382,15 +1398,7 @@ in6_purgeaddr_mc(struct ifnet *ifp, struct in6_ifaddr *ia, struct ifaddr *ifa0) /* * Replace the gateway of the route. */ - struct sockaddr_in6 sa; - - bzero(&sa, sizeof(sa)); - sa.sin6_len = sizeof(struct sockaddr_in6); - sa.sin6_family = AF_INET6; - memcpy(&sa.sin6_addr, &satosin6(ifa0->ifa_addr)->sin6_addr, - sizeof(sa.sin6_addr)); - in6_setscope(&sa.sin6_addr, ifa0->ifa_ifp, NULL); - memcpy(rt->rt_gateway, &sa, sizeof(sa)); + memcpy(rt->rt_gateway, &sin6, sizeof(sin6)); RTFREE_LOCKED(rt); } } else { @@ -1432,15 +1440,7 @@ in6_purgeaddr_mc(struct ifnet *ifp, struct in6_ifaddr *ia, struct ifaddr *ifa0) /* * Replace the gateway of the route. */ - struct sockaddr_in6 sa; - - bzero(&sa, sizeof(sa)); - sa.sin6_len = sizeof(struct sockaddr_in6); - sa.sin6_family = AF_INET6; - memcpy(&sa.sin6_addr, &satosin6(ifa0->ifa_addr)->sin6_addr, - sizeof(sa.sin6_addr)); - in6_setscope(&sa.sin6_addr, ifa0->ifa_ifp, NULL); - memcpy(rt->rt_gateway, &sa, sizeof(sa)); + memcpy(rt->rt_gateway, &sin6, sizeof(sin6)); RTFREE_LOCKED(rt); } } else { @@ -1667,14 +1667,19 @@ in6_lifaddr_ioctl(struct socket *so, u_long cmd, caddr_t data, hostid = IFA_IN6(ifa); /* prefixlen must be <= 64. */ - if (64 < iflr->prefixlen) + if (64 < iflr->prefixlen) { + if (ifa != NULL) + ifa_free(ifa); return EINVAL; + } prefixlen = iflr->prefixlen; /* hostid part must be zero. */ sin6 = (struct sockaddr_in6 *)&iflr->addr; if (sin6->sin6_addr.s6_addr32[2] != 0 || sin6->sin6_addr.s6_addr32[3] != 0) { + if (ifa != NULL) + ifa_free(ifa); return EINVAL; } } else @@ -2265,14 +2270,20 @@ in6_ifawithifp(struct ifnet *ifp, struct in6_addr *dst) IF_ADDR_RUNLOCK(ifp); return (struct in6_ifaddr *)ifa; } - IF_ADDR_RUNLOCK(ifp); /* use the last-resort values, that are, deprecated addresses */ - if (dep[0]) + if (dep[0]) { + ifa_ref((struct ifaddr *)dep[0]); + IF_ADDR_RUNLOCK(ifp); return dep[0]; - if (dep[1]) + } + if (dep[1]) { + ifa_ref((struct ifaddr *)dep[1]); + IF_ADDR_RUNLOCK(ifp); return dep[1]; + } + IF_ADDR_RUNLOCK(ifp); return NULL; } diff --git a/sys/netinet6/in6.h b/sys/netinet6/in6.h index f0cf4f42c99..f910e701b9f 100644 --- a/sys/netinet6/in6.h +++ b/sys/netinet6/in6.h @@ -632,7 +632,9 @@ struct ip6_mtuinfo { #ifdef _KERNEL struct cmsghdr; +struct ip6_hdr; +int in6_cksum_pseudo(struct ip6_hdr *, uint32_t, uint8_t, uint16_t); int in6_cksum __P((struct mbuf *, u_int8_t, u_int32_t, u_int32_t)); int in6_localaddr __P((struct in6_addr *)); int in6_localip(struct in6_addr *); diff --git a/sys/netinet6/in6_cksum.c b/sys/netinet6/in6_cksum.c index 9cb97bd7e84..da8a2e6bf3c 100644 --- a/sys/netinet6/in6_cksum.c +++ b/sys/netinet6/in6_cksum.c @@ -80,6 +80,66 @@ __FBSDID("$FreeBSD$"); #define ADDCARRY(x) (x > 65535 ? x -= 65535 : x) #define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; (void)ADDCARRY(sum);} +static int +_in6_cksum_pseudo(struct ip6_hdr *ip6, uint32_t len, uint8_t nxt, uint16_t csum) +{ + int sum; + uint16_t scope, *w; + union { + u_int16_t phs[4]; + struct { + u_int32_t ph_len; + u_int8_t ph_zero[3]; + u_int8_t ph_nxt; + } __packed ph; + } uph; + + sum = csum; + + /* + * First create IP6 pseudo header and calculate a summary. + */ + uph.ph.ph_len = htonl(len); + uph.ph.ph_zero[0] = uph.ph.ph_zero[1] = uph.ph.ph_zero[2] = 0; + uph.ph.ph_nxt = nxt; + + /* Payload length and upper layer identifier. */ + sum += uph.phs[0]; sum += uph.phs[1]; + sum += uph.phs[2]; sum += uph.phs[3]; + + /* IPv6 source address. */ + scope = in6_getscope(&ip6->ip6_src); + w = (u_int16_t *)&ip6->ip6_src; + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; + if (scope != 0) + sum -= scope; + + /* IPv6 destination address. */ + scope = in6_getscope(&ip6->ip6_dst); + w = (u_int16_t *)&ip6->ip6_dst; + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; + if (scope != 0) + sum -= scope; + + return (sum); +} + +int +in6_cksum_pseudo(struct ip6_hdr *ip6, uint32_t len, uint8_t nxt, uint16_t csum) +{ + int sum; + union { + u_int16_t s[2]; + u_int32_t l; + } l_util; + + sum = _in6_cksum_pseudo(ip6, len, nxt, csum); + REDUCE; + return (sum); +} + /* * m MUST contain a contiguous IP6 header. * off is an offset where TCP/UDP/ICMP6 header starts. @@ -89,12 +149,10 @@ __FBSDID("$FreeBSD$"); int in6_cksum(struct mbuf *m, u_int8_t nxt, u_int32_t off, u_int32_t len) { - u_int16_t *w; - int sum = 0; - int mlen = 0; - int byte_swapped = 0; struct ip6_hdr *ip6; - struct in6_addr in6; + u_int16_t *w, scope; + int byte_swapped, mlen; + int sum; union { u_int16_t phs[4]; struct { @@ -112,43 +170,39 @@ in6_cksum(struct mbuf *m, u_int8_t nxt, u_int32_t off, u_int32_t len) u_int32_t l; } l_util; - /* sanity check */ - if (m->m_pkthdr.len < off + len) { - panic("in6_cksum: mbuf len (%d) < off+len (%d+%d)", - m->m_pkthdr.len, off, len); - } - - bzero(&uph, sizeof(uph)); + /* Sanity check. */ + KASSERT(m->m_pkthdr.len >= off + len, ("%s: mbuf len (%d) < off(%d)+" + "len(%d)", __func__, m->m_pkthdr.len, off, len)); /* * First create IP6 pseudo header and calculate a summary. */ - ip6 = mtod(m, struct ip6_hdr *); uph.ph.ph_len = htonl(len); + uph.ph.ph_zero[0] = uph.ph.ph_zero[1] = uph.ph.ph_zero[2] = 0; uph.ph.ph_nxt = nxt; - /* - * IPv6 source address. - * XXX: we'd like to avoid copying the address, but we can't due to - * the possibly embedded scope zone ID. - */ - in6 = ip6->ip6_src; - in6_clearscope(&in6); - w = (u_int16_t *)&in6; - sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; - sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; - - /* IPv6 destination address */ - in6 = ip6->ip6_dst; - in6_clearscope(&in6); - w = (u_int16_t *)&in6; - sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; - sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; - - /* Payload length and upper layer identifier */ - sum += uph.phs[0]; sum += uph.phs[1]; + /* Payload length and upper layer identifier. */ + sum = uph.phs[0]; sum += uph.phs[1]; sum += uph.phs[2]; sum += uph.phs[3]; + ip6 = mtod(m, struct ip6_hdr *); + + /* IPv6 source address. */ + scope = in6_getscope(&ip6->ip6_src); + w = (u_int16_t *)&ip6->ip6_src; + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; + if (scope != 0) + sum -= scope; + + /* IPv6 destination address. */ + scope = in6_getscope(&ip6->ip6_dst); + w = (u_int16_t *)&ip6->ip6_dst; + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; + if (scope != 0) + sum -= scope; + /* * Secondly calculate a summary of the first mbuf excluding offset. */ @@ -167,14 +221,16 @@ in6_cksum(struct mbuf *m, u_int8_t nxt, u_int32_t off, u_int32_t len) /* * Force to even boundary. */ - if ((1 & (long) w) && (mlen > 0)) { + if ((1 & (long)w) && (mlen > 0)) { REDUCE; sum <<= 8; s_util.c[0] = *(u_char *)w; w = (u_int16_t *)((char *)w + 1); mlen--; byte_swapped = 1; - } + } else + byte_swapped = 0; + /* * Unroll the loop to make overhead from * branches &c small. diff --git a/sys/netinet6/in6_src.c b/sys/netinet6/in6_src.c index 18a19666948..e704759060d 100644 --- a/sys/netinet6/in6_src.c +++ b/sys/netinet6/in6_src.c @@ -597,6 +597,7 @@ selectroute(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts, if (ron->ro_rt == NULL) { in6_rtalloc(ron, fibnum); /* multi path case? */ if (ron->ro_rt == NULL) { + /* XXX-BZ WT.? */ if (ron->ro_rt) { RTFREE(ron->ro_rt); ron->ro_rt = NULL; @@ -873,8 +874,7 @@ in6_selecthlim(struct inpcb *in6p, struct ifnet *ifp) RTFREE(ro6.ro_rt); if (lifp) return (ND_IFINFO(lifp)->chlim); - } else - return (V_ip6_defhlim); + } } return (V_ip6_defhlim); } diff --git a/sys/netinet6/ip6_forward.c b/sys/netinet6/ip6_forward.c index bae418ae2af..3321a95bf42 100644 --- a/sys/netinet6/ip6_forward.c +++ b/sys/netinet6/ip6_forward.c @@ -581,15 +581,13 @@ skip_routing: m->m_flags |= M_FASTFWD_OURS; if (m->m_pkthdr.rcvif == NULL) m->m_pkthdr.rcvif = V_loif; - if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { + if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA_IPV6) { m->m_pkthdr.csum_flags |= - CSUM_DATA_VALID | CSUM_PSEUDO_HDR; + CSUM_DATA_VALID_IPV6 | CSUM_PSEUDO_HDR; m->m_pkthdr.csum_data = 0xffff; } - m->m_pkthdr.csum_flags |= - CSUM_IP_CHECKED | CSUM_IP_VALID; #ifdef SCTP - if (m->m_pkthdr.csum_flags & CSUM_SCTP) + if (m->m_pkthdr.csum_flags & CSUM_SCTP_IPV6) m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID; #endif error = netisr_queue(NETISR_IPV6, m); @@ -603,15 +601,15 @@ skip_routing: if (m->m_flags & M_FASTFWD_OURS) { if (m->m_pkthdr.rcvif == NULL) m->m_pkthdr.rcvif = V_loif; - if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { + if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA_IPV6) { m->m_pkthdr.csum_flags |= - CSUM_DATA_VALID | CSUM_PSEUDO_HDR; + CSUM_DATA_VALID_IPV6 | CSUM_PSEUDO_HDR; m->m_pkthdr.csum_data = 0xffff; } #ifdef SCTP - if (m->m_pkthdr.csum_flags & CSUM_SCTP) - m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID; -#endif + if (m->m_pkthdr.csum_flags & CSUM_SCTP_IPV6) + m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID; +#endif error = netisr_queue(NETISR_IPV6, m); goto out; } diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c index 4fde2ff9510..f5ec27a2799 100644 --- a/sys/netinet6/ip6_input.c +++ b/sys/netinet6/ip6_input.c @@ -146,6 +146,9 @@ RW_SYSINIT(in6_ifaddr_lock, &in6_ifaddr_lock, "in6_ifaddr_lock"); static void ip6_init2(void *); static struct ip6aux *ip6_setdstifaddr(struct mbuf *, struct in6_ifaddr *); +static struct ip6aux *ip6_addaux(struct mbuf *); +static struct ip6aux *ip6_findaux(struct mbuf *m); +static void ip6_delaux (struct mbuf *); static int ip6_hopopts_input(u_int32_t *, u_int32_t *, struct mbuf **, int *); #ifdef PULLDOWN_TEST static struct mbuf *ip6_pullexthdr(struct mbuf *, size_t, int); @@ -328,6 +331,83 @@ ip6_init2(void *dummy) /* This must be after route_init(), which is now SI_ORDER_THIRD */ SYSINIT(netinet6init2, SI_SUB_PROTO_DOMAIN, SI_ORDER_MIDDLE, ip6_init2, NULL); +static int +ip6_input_hbh(struct mbuf *m, uint32_t *plen, uint32_t *rtalert, int *off, + int *nxt, int *ours) +{ + struct ip6_hdr *ip6; + struct ip6_hbh *hbh; + + if (ip6_hopopts_input(plen, rtalert, &m, off)) { +#if 0 /*touches NULL pointer*/ + in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard); +#endif + goto out; /* m have already been freed */ + } + + /* adjust pointer */ + ip6 = mtod(m, struct ip6_hdr *); + + /* + * if the payload length field is 0 and the next header field + * indicates Hop-by-Hop Options header, then a Jumbo Payload + * option MUST be included. + */ + if (ip6->ip6_plen == 0 && *plen == 0) { + /* + * Note that if a valid jumbo payload option is + * contained, ip6_hopopts_input() must set a valid + * (non-zero) payload length to the variable plen. + */ + V_ip6stat.ip6s_badoptions++; + in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard); + in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr); + icmp6_error(m, ICMP6_PARAM_PROB, + ICMP6_PARAMPROB_HEADER, + (caddr_t)&ip6->ip6_plen - (caddr_t)ip6); + goto out; + } +#ifndef PULLDOWN_TEST + /* ip6_hopopts_input() ensures that mbuf is contiguous */ + hbh = (struct ip6_hbh *)(ip6 + 1); +#else + IP6_EXTHDR_GET(hbh, struct ip6_hbh *, m, sizeof(struct ip6_hdr), + sizeof(struct ip6_hbh)); + if (hbh == NULL) { + V_ip6stat.ip6s_tooshort++; + goto out; + } +#endif + *nxt = hbh->ip6h_nxt; + + /* + * If we are acting as a router and the packet contains a + * router alert option, see if we know the option value. + * Currently, we only support the option value for MLD, in which + * case we should pass the packet to the multicast routing + * daemon. + */ + if (*rtalert != ~0) { + switch (*rtalert) { + case IP6OPT_RTALERT_MLD: + if (V_ip6_forwarding) + *ours = 1; + break; + default: + /* + * RFC2711 requires unrecognized values must be + * silently ignored. + */ + break; + } + } + + return (0); + +out: + return (1); +} + void ip6_input(struct mbuf *m) { @@ -799,19 +879,23 @@ passin: * as our interface address (e.g. multicast addresses, addresses * within FAITH prefixes and such). */ - if (deliverifp && !ip6_getdstifaddr(m)) { + if (deliverifp) { struct in6_ifaddr *ia6; - ia6 = in6_ifawithifp(deliverifp, &ip6->ip6_dst); - if (ia6) { - if (!ip6_setdstifaddr(m, ia6)) { - /* - * XXX maybe we should drop the packet here, - * as we could not provide enough information - * to the upper layers. - */ - } + if ((ia6 = ip6_getdstifaddr(m)) != NULL) { ifa_free(&ia6->ia_ifa); + } else { + ia6 = in6_ifawithifp(deliverifp, &ip6->ip6_dst); + if (ia6) { + if (!ip6_setdstifaddr(m, ia6)) { + /* + * XXX maybe we should drop the packet here, + * as we could not provide enough information + * to the upper layers. + */ + } + ifa_free(&ia6->ia_ifa); + } } } @@ -822,71 +906,11 @@ passin: */ plen = (u_int32_t)ntohs(ip6->ip6_plen); if (ip6->ip6_nxt == IPPROTO_HOPOPTS) { - struct ip6_hbh *hbh; + int error; - if (ip6_hopopts_input(&plen, &rtalert, &m, &off)) { -#if 0 /*touches NULL pointer*/ - in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard); -#endif - goto out; /* m have already been freed */ - } - - /* adjust pointer */ - ip6 = mtod(m, struct ip6_hdr *); - - /* - * if the payload length field is 0 and the next header field - * indicates Hop-by-Hop Options header, then a Jumbo Payload - * option MUST be included. - */ - if (ip6->ip6_plen == 0 && plen == 0) { - /* - * Note that if a valid jumbo payload option is - * contained, ip6_hopopts_input() must set a valid - * (non-zero) payload length to the variable plen. - */ - V_ip6stat.ip6s_badoptions++; - in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard); - in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr); - icmp6_error(m, ICMP6_PARAM_PROB, - ICMP6_PARAMPROB_HEADER, - (caddr_t)&ip6->ip6_plen - (caddr_t)ip6); + error = ip6_input_hbh(m, &plen, &rtalert, &off, &nxt, &ours); + if (error != 0) goto out; - } -#ifndef PULLDOWN_TEST - /* ip6_hopopts_input() ensures that mbuf is contiguous */ - hbh = (struct ip6_hbh *)(ip6 + 1); -#else - IP6_EXTHDR_GET(hbh, struct ip6_hbh *, m, sizeof(struct ip6_hdr), - sizeof(struct ip6_hbh)); - if (hbh == NULL) { - V_ip6stat.ip6s_tooshort++; - goto out; - } -#endif - nxt = hbh->ip6h_nxt; - - /* - * If we are acting as a router and the packet contains a - * router alert option, see if we know the option value. - * Currently, we only support the option value for MLD, in which - * case we should pass the packet to the multicast routing - * daemon. - */ - if (rtalert != ~0) { - switch (rtalert) { - case IP6OPT_RTALERT_MLD: - if (V_ip6_forwarding) - ours = 1; - break; - default: - /* - * RFC2711 requires unrecognized values must be - * silently ignored. - */ - break; - } - } } else nxt = ip6->ip6_nxt; @@ -1297,19 +1321,28 @@ ip6_savecontrol_v4(struct inpcb *inp, struct mbuf *m, struct mbuf **mp, } #endif - if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) { - if (v4only != NULL) - *v4only = 1; - return (mp); - } - #define IS2292(inp, x, y) (((inp)->inp_flags & IN6P_RFC2292) ? (x) : (y)) /* RFC 2292 sec. 5 */ if ((inp->inp_flags & IN6P_PKTINFO) != 0) { struct in6_pktinfo pi6; - bcopy(&ip6->ip6_dst, &pi6.ipi6_addr, sizeof(struct in6_addr)); - in6_clearscope(&pi6.ipi6_addr); /* XXX */ + if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) { +#ifdef INET + struct ip *ip; + + ip = mtod(m, struct ip *); + pi6.ipi6_addr.s6_addr32[0] = 0; + pi6.ipi6_addr.s6_addr32[1] = 0; + pi6.ipi6_addr.s6_addr32[2] = IPV6_ADDR_INT32_SMP; + pi6.ipi6_addr.s6_addr32[3] = ip->ip_dst.s_addr; +#else + /* We won't hit this code */ + bzero(&pi6.ipi6_addr, sizeof(struct in6_addr)); +#endif + } else { + bcopy(&ip6->ip6_dst, &pi6.ipi6_addr, sizeof(struct in6_addr)); + in6_clearscope(&pi6.ipi6_addr); /* XXX */ + } pi6.ipi6_ifindex = (m && m->m_pkthdr.rcvif) ? m->m_pkthdr.rcvif->if_index : 0; @@ -1321,8 +1354,21 @@ ip6_savecontrol_v4(struct inpcb *inp, struct mbuf *m, struct mbuf **mp, } if ((inp->inp_flags & IN6P_HOPLIMIT) != 0) { - int hlim = ip6->ip6_hlim & 0xff; + int hlim; + if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) { +#ifdef INET + struct ip *ip; + + ip = mtod(m, struct ip *); + hlim = ip->ip_ttl; +#else + /* We won't hit this code */ + hlim = 0; +#endif + } else { + hlim = ip6->ip6_hlim & 0xff; + } *mp = sbcreatecontrol((caddr_t) &hlim, sizeof(int), IS2292(inp, IPV6_2292HOPLIMIT, IPV6_HOPLIMIT), IPPROTO_IPV6); @@ -1330,8 +1376,40 @@ ip6_savecontrol_v4(struct inpcb *inp, struct mbuf *m, struct mbuf **mp, mp = &(*mp)->m_next; } - if (v4only != NULL) - *v4only = 0; + if ((inp->inp_flags & IN6P_TCLASS) != 0) { + int tclass; + + if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) { +#ifdef INET + struct ip *ip; + + ip = mtod(m, struct ip *); + tclass = ip->ip_tos; +#else + /* We won't hit this code */ + tclass = 0; +#endif + } else { + u_int32_t flowinfo; + + flowinfo = (u_int32_t)ntohl(ip6->ip6_flow & IPV6_FLOWINFO_MASK); + flowinfo >>= 20; + tclass = flowinfo & 0xff; + } + *mp = sbcreatecontrol((caddr_t) &tclass, sizeof(int), + IPV6_TCLASS, IPPROTO_IPV6); + if (*mp) + mp = &(*mp)->m_next; + } + + if (v4only != NULL) { + if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) { + *v4only = 1; + } else { + *v4only = 0; + } + } + return (mp); } @@ -1345,20 +1423,6 @@ ip6_savecontrol(struct inpcb *in6p, struct mbuf *m, struct mbuf **mp) if (v4only) return; - if ((in6p->inp_flags & IN6P_TCLASS) != 0) { - u_int32_t flowinfo; - int tclass; - - flowinfo = (u_int32_t)ntohl(ip6->ip6_flow & IPV6_FLOWINFO_MASK); - flowinfo >>= 20; - - tclass = flowinfo & 0xff; - *mp = sbcreatecontrol((caddr_t) &tclass, sizeof(tclass), - IPV6_TCLASS, IPPROTO_IPV6); - if (*mp) - mp = &(*mp)->m_next; - } - /* * IPV6_HOPOPTS socket option. Recall that we required super-user * privilege for the option (see ip6_ctloutput), but it might be too @@ -1772,7 +1836,7 @@ ip6_lasthdr(struct mbuf *m, int off, int proto, int *nxtp) } } -struct ip6aux * +static struct ip6aux * ip6_addaux(struct mbuf *m) { struct m_tag *mtag; @@ -1789,7 +1853,7 @@ ip6_addaux(struct mbuf *m) return mtag ? (struct ip6aux *)(mtag + 1) : NULL; } -struct ip6aux * +static struct ip6aux * ip6_findaux(struct mbuf *m) { struct m_tag *mtag; @@ -1798,7 +1862,7 @@ ip6_findaux(struct mbuf *m) return mtag ? (struct ip6aux *)(mtag + 1) : NULL; } -void +static void ip6_delaux(struct mbuf *m) { struct m_tag *mtag; diff --git a/sys/netinet6/ip6_ipsec.c b/sys/netinet6/ip6_ipsec.c index e8689172dbb..757f1cc7b52 100644 --- a/sys/netinet6/ip6_ipsec.c +++ b/sys/netinet6/ip6_ipsec.c @@ -291,6 +291,7 @@ ip6_ipsec_output(struct mbuf **m, struct inpcb *inp, int *flags, int *error, /* * Do delayed checksums now because we send before * this is done in the normal processing path. + * XXX-BZ CSUM_DELAY_DATA_IPV6? */ if ((*m)->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { ipseclog((LOG_DEBUG, diff --git a/sys/netinet6/ip6_mroute.c b/sys/netinet6/ip6_mroute.c index 98bf0ac65ef..8ecd60e8861 100644 --- a/sys/netinet6/ip6_mroute.c +++ b/sys/netinet6/ip6_mroute.c @@ -717,7 +717,6 @@ add_m6if(struct mif6ctl *mifcp) mifp->m6_pkt_out = 0; mifp->m6_bytes_in = 0; mifp->m6_bytes_out = 0; - bzero(&mifp->m6_route, sizeof(mifp->m6_route)); /* Adjust nummifs up if the mifi is higher than nummifs */ if (nummifs <= mifcp->mif6c_mifi) @@ -1576,11 +1575,8 @@ phyint_send(struct ip6_hdr *ip6, struct mif6 *mifp, struct mbuf *m) struct mbuf *mb_copy; struct ifnet *ifp = mifp->m6_ifp; int error = 0; - struct sockaddr_in6 *dst6; u_long linkmtu; - dst6 = &mifp->m6_route.ro_dst; - /* * Make a new reference to the packet; make sure that * the IPv6 header is actually copied, not just referenced, @@ -1610,8 +1606,8 @@ phyint_send(struct ip6_hdr *ip6, struct mif6 *mifp, struct mbuf *m) /* XXX: ip6_output will override ip6->ip6_hlim */ im6o.im6o_multicast_hlim = ip6->ip6_hlim; im6o.im6o_multicast_loop = 1; - error = ip6_output(mb_copy, NULL, &mifp->m6_route, - IPV6_FORWARDING, &im6o, NULL, NULL); + error = ip6_output(mb_copy, NULL, NULL, IPV6_FORWARDING, &im6o, + NULL, NULL); #ifdef MRT6DEBUG if (V_mrt6debug & DEBUG_XMIT) @@ -1626,10 +1622,13 @@ phyint_send(struct ip6_hdr *ip6, struct mif6 *mifp, struct mbuf *m) * loop back a copy now. */ if (in6_mcast_loop) { - dst6->sin6_len = sizeof(struct sockaddr_in6); - dst6->sin6_family = AF_INET6; - dst6->sin6_addr = ip6->ip6_dst; - ip6_mloopback(ifp, m, &mifp->m6_route.ro_dst); + struct sockaddr_in6 dst6; + + bzero(&dst6, sizeof(dst6)); + dst6.sin6_len = sizeof(struct sockaddr_in6); + dst6.sin6_family = AF_INET6; + dst6.sin6_addr = ip6->ip6_dst; + ip6_mloopback(ifp, m, &dst6); } /* @@ -1638,15 +1637,18 @@ phyint_send(struct ip6_hdr *ip6, struct mif6 *mifp, struct mbuf *m) */ linkmtu = IN6_LINKMTU(ifp); if (mb_copy->m_pkthdr.len <= linkmtu || linkmtu < IPV6_MMTU) { - dst6->sin6_len = sizeof(struct sockaddr_in6); - dst6->sin6_family = AF_INET6; - dst6->sin6_addr = ip6->ip6_dst; + struct sockaddr_in6 dst6; + + bzero(&dst6, sizeof(dst6)); + dst6.sin6_len = sizeof(struct sockaddr_in6); + dst6.sin6_family = AF_INET6; + dst6.sin6_addr = ip6->ip6_dst; /* * We just call if_output instead of nd6_output here, since * we need no ND for a multicast forwarded packet...right? */ error = (*ifp->if_output)(ifp, mb_copy, - (struct sockaddr *)&mifp->m6_route.ro_dst, NULL); + (struct sockaddr *)&dst6, NULL); #ifdef MRT6DEBUG if (V_mrt6debug & DEBUG_XMIT) log(LOG_DEBUG, "phyint_send on mif %d err %d\n", diff --git a/sys/netinet6/ip6_mroute.h b/sys/netinet6/ip6_mroute.h index 701d53458f7..d2df0dbea50 100644 --- a/sys/netinet6/ip6_mroute.h +++ b/sys/netinet6/ip6_mroute.h @@ -212,7 +212,6 @@ struct mif6 { u_quad_t m6_pkt_out; /* # pkts out on interface */ u_quad_t m6_bytes_in; /* # bytes in on interface */ u_quad_t m6_bytes_out; /* # bytes out on interface */ - struct route_in6 m6_route; /* cached route */ #ifdef notyet u_int m6_rsvp_on; /* RSVP listening on this vif */ struct socket *m6_rsvpd; /* RSVP daemon socket */ diff --git a/sys/netinet6/ip6_output.c b/sys/netinet6/ip6_output.c index d15d7c2791a..e1569b0375a 100644 --- a/sys/netinet6/ip6_output.c +++ b/sys/netinet6/ip6_output.c @@ -83,6 +83,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include + #include #include #include @@ -182,12 +184,38 @@ static int copypktopts(struct ip6_pktopts *, struct ip6_pktopts *, int); }\ } while (/*CONSTCOND*/ 0) +static void +in6_delayed_cksum(struct mbuf *m, uint32_t plen, u_short offset) +{ + u_short csum; + + csum = in_cksum_skip(m, offset + plen, offset); + if (m->m_pkthdr.csum_flags & CSUM_UDP_IPV6 && csum == 0) + csum = 0xffff; + offset += m->m_pkthdr.csum_data; /* checksum offset */ + + if (offset + sizeof(u_short) > m->m_len) { + printf("%s: delayed m_pullup, m->len: %d off: %d\n", + __func__, m->m_len, offset); + /* + * XXX this should not happen, but if it does, the correct + * behavior may be to insert the checksum in the appropriate + * next mbuf in the chain. + */ + return; + } + *(u_short *)(m->m_data + offset) = csum; +} + /* * IP6 output. The packet in mbuf chain m contains a skeletal IP6 * header (with pri, len, nxt, hlim, src, dst). * This function may modify ver and hlim only. * The mbuf chain containing the packet will be freed. * The mbuf opt, if present, will not be freed. + * If route_in6 ro is present and has ro_rt initialized, route lookup would be + * skipped and ro->ro_rt would be used. If ro is present but ro->ro_rt is NULL, + * then result of route lookup is stored in ro->ro_rt. * * type of "mtu": rt_rmx.rmx_mtu is u_long, ifnet.ifr_mtu is int, and * nd_ifinfo.linkmtu is u_int32_t. so we use u_long to hold largest one, @@ -218,12 +246,9 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt, struct in6_addr finaldst, src0, dst0; u_int32_t zone; struct route_in6 *ro_pmtu = NULL; - int flevalid = 0; int hdrsplit = 0; int needipsec = 0; -#ifdef SCTP - int sw_csum; -#endif + int sw_csum, tso; #ifdef IPSEC struct ipsec_output_state state; struct ip6_rthdr *rh = NULL; @@ -483,22 +508,20 @@ skip_ipsec2:; ro = &opt->ip6po_route; dst = (struct sockaddr_in6 *)&ro->ro_dst; #ifdef FLOWTABLE - if (ro == &ip6route) { + if (ro->ro_rt == NULL) { struct flentry *fle; - + /* * The flow table returns route entries valid for up to 30 * seconds; we rely on the remainder of ip_output() taking no * longer than that long for the stability of ro_rt. The * flow ID assignment must have happened before this point. */ - if ((fle = flowtable_lookup_mbuf(V_ip6_ft, m, AF_INET6)) != NULL) { + fle = flowtable_lookup_mbuf(V_ip6_ft, m, AF_INET6); + if (fle != NULL) flow_to_route_in6(fle, ro); - if (ro->ro_rt != NULL && ro->ro_lle != NULL) - flevalid = 1; - } } -#endif +#endif again: /* * if specified, try to fill in the traffic class field. @@ -604,7 +627,7 @@ again: dst_sa.sin6_family = AF_INET6; dst_sa.sin6_len = sizeof(dst_sa); dst_sa.sin6_addr = ip6->ip6_dst; - if (flevalid) { + if (ro->ro_rt) { rt = ro->ro_rt; ifp = ro->ro_rt->rt_ifp; } else if ((error = in6_selectroute_fib(&dst_sa, opt, im6o, ro, @@ -644,7 +667,7 @@ again: /* * The outgoing interface must be in the zone of source and - * destination addresses. + * destination addresses. */ origifp = ifp; @@ -670,7 +693,7 @@ again: goto badscope; } - /* We should use ia_ifp to support the case of + /* We should use ia_ifp to support the case of * sending packets to an address of our own. */ if (ia != NULL && ia->ia_ifp) @@ -862,15 +885,13 @@ again: m->m_flags |= M_FASTFWD_OURS; if (m->m_pkthdr.rcvif == NULL) m->m_pkthdr.rcvif = V_loif; - if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { + if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA_IPV6) { m->m_pkthdr.csum_flags |= - CSUM_DATA_VALID | CSUM_PSEUDO_HDR; + CSUM_DATA_VALID_IPV6 | CSUM_PSEUDO_HDR; m->m_pkthdr.csum_data = 0xffff; } - m->m_pkthdr.csum_flags |= - CSUM_IP_CHECKED | CSUM_IP_VALID; #ifdef SCTP - if (m->m_pkthdr.csum_flags & CSUM_SCTP) + if (m->m_pkthdr.csum_flags & CSUM_SCTP_IPV6) m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID; #endif error = netisr_queue(NETISR_IPV6, m); @@ -884,15 +905,15 @@ again: if (m->m_flags & M_FASTFWD_OURS) { if (m->m_pkthdr.rcvif == NULL) m->m_pkthdr.rcvif = V_loif; - if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { + if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA_IPV6) { m->m_pkthdr.csum_flags |= - CSUM_DATA_VALID | CSUM_PSEUDO_HDR; + CSUM_DATA_VALID_IPV6 | CSUM_PSEUDO_HDR; m->m_pkthdr.csum_data = 0xffff; } #ifdef SCTP - if (m->m_pkthdr.csum_flags & CSUM_SCTP) - m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID; -#endif + if (m->m_pkthdr.csum_flags & CSUM_SCTP_IPV6) + m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID; +#endif error = netisr_queue(NETISR_IPV6, m); goto done; } @@ -927,16 +948,32 @@ passout: * 4: if dontfrag == 1 && alwaysfrag == 1 * error, as we cannot handle this conflicting request */ + sw_csum = m->m_pkthdr.csum_flags; + if (!hdrsplit) { + tso = ((sw_csum & ifp->if_hwassist & CSUM_TSO) != 0) ? 1 : 0; + sw_csum &= ~ifp->if_hwassist; + } else + tso = 0; + /* + * If we added extension headers, we will not do TSO and calculate the + * checksums ourselves for now. + * XXX-BZ Need a framework to know when the NIC can handle it, even + * with ext. hdrs. + */ + if (sw_csum & CSUM_DELAY_DATA_IPV6) { + sw_csum &= ~CSUM_DELAY_DATA_IPV6; + in6_delayed_cksum(m, plen, sizeof(struct ip6_hdr)); + } #ifdef SCTP - sw_csum = m->m_pkthdr.csum_flags & ~ifp->if_hwassist; - if (sw_csum & CSUM_SCTP) { + if (sw_csum & CSUM_SCTP_IPV6) { + sw_csum &= ~CSUM_SCTP_IPV6; sctp_delayed_cksum(m, sizeof(struct ip6_hdr)); - sw_csum &= ~CSUM_SCTP; } #endif + m->m_pkthdr.csum_flags &= ifp->if_hwassist; tlen = m->m_pkthdr.len; - if (opt && (opt->ip6po_flags & IP6PO_DONTFRAG)) + if ((opt && (opt->ip6po_flags & IP6PO_DONTFRAG)) || tso) dontfrag = 1; else dontfrag = 0; @@ -945,7 +982,7 @@ passout: error = EMSGSIZE; goto bad; } - if (dontfrag && tlen > IN6_LINKMTU(ifp)) { /* case 2-b */ + if (dontfrag && tlen > IN6_LINKMTU(ifp) && !tso) { /* case 2-b */ /* * Even if the DONTFRAG option is specified, we cannot send the * packet when the data length is larger than the MTU of the @@ -1033,6 +1070,22 @@ passout: goto bad; } + + /* + * If the interface will not calculate checksums on + * fragmented packets, then do it here. + * XXX-BZ handle the hw offloading case. Need flags. + */ + if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA_IPV6) { + in6_delayed_cksum(m, plen, hlen); + m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA_IPV6; + } +#ifdef SCTP + if (m->m_pkthdr.csum_flags & CSUM_SCTP_IPV6) { + sctp_delayed_cksum(m, hlen); + m->m_pkthdr.csum_flags &= ~CSUM_SCTP_IPV6; + } +#endif mnext = &m->m_nextpkt; /* @@ -1129,13 +1182,10 @@ sendorfree: V_ip6stat.ip6s_fragmented++; done: - if (ro == &ip6route && ro->ro_rt && flevalid == 0) { - /* brace necessary for RTFREE */ - RTFREE(ro->ro_rt); - } else if (ro_pmtu == &ip6route && ro_pmtu->ro_rt && - ((flevalid == 0) || (ro_pmtu != ro))) { - RTFREE(ro_pmtu->ro_rt); - } + if (ro == &ip6route) + RO_RTFREE(ro); + if (ro_pmtu == &ip6route) + RO_RTFREE(ro_pmtu); #ifdef IPSEC if (sp != NULL) KEY_FREESP(&sp); diff --git a/sys/netinet6/ip6_var.h b/sys/netinet6/ip6_var.h index a778b17bca5..9a532fce6da 100644 --- a/sys/netinet6/ip6_var.h +++ b/sys/netinet6/ip6_var.h @@ -388,9 +388,9 @@ char * ip6_get_prevhdr __P((struct mbuf *, int)); int ip6_nexthdr __P((struct mbuf *, int, int, int *)); int ip6_lasthdr __P((struct mbuf *, int, int, int *)); -struct ip6aux *ip6_addaux __P((struct mbuf *)); +#ifdef __notyet__ struct ip6aux *ip6_findaux __P((struct mbuf *)); -void ip6_delaux __P((struct mbuf *)); +#endif extern int (*ip6_mforward)(struct ip6_hdr *, struct ifnet *, struct mbuf *); diff --git a/sys/netinet6/mld6.c b/sys/netinet6/mld6.c index 065ed7e6e5b..ba850b2a38b 100644 --- a/sys/netinet6/mld6.c +++ b/sys/netinet6/mld6.c @@ -833,7 +833,7 @@ mld_v2_input_query(struct ifnet *ifp, const struct ip6_hdr *ip6, mld = (struct mldv2_query *)(mtod(m, uint8_t *) + off); maxdelay = ntohs(mld->mld_maxdelay); /* in 1/10ths of a second */ - if (maxdelay >= 32678) { + if (maxdelay >= 32768) { maxdelay = (MLD_MRC_MANT(maxdelay) | 0x1000) << (MLD_MRC_EXP(maxdelay) + 3); } @@ -867,16 +867,10 @@ mld_v2_input_query(struct ifnet *ifp, const struct ip6_hdr *ip6, */ if (IN6_IS_ADDR_UNSPECIFIED(&mld->mld_addr)) { /* - * General Queries SHOULD be directed to ff02::1. * A general query with a source list has undefined * behaviour; discard it. */ - struct in6_addr dst; - - dst = ip6->ip6_dst; - in6_clearscope(&dst); - if (!IN6_ARE_ADDR_EQUAL(&dst, &in6addr_linklocal_allnodes) || - nsrc > 0) + if (nsrc > 0) return (EINVAL); is_general_query = 1; } else { @@ -2203,6 +2197,7 @@ mld_final_leave(struct in6_multi *inm, struct mld_ifinfo *mli) #endif mld_v1_transmit_report(inm, MLD_LISTENER_DONE); inm->in6m_state = MLD_NOT_MEMBER; + V_current_state_timers_running6 = 1; } else if (mli->mli_version == MLD_VERSION_2) { /* * Stop group timer and all pending reports. diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index 8d296b23a20..592eb90a1ed 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -174,9 +174,7 @@ nd6_ifattach(struct ifnet *ifp) { struct nd_ifinfo *nd; - nd = (struct nd_ifinfo *)malloc(sizeof(*nd), M_IP6NDP, M_WAITOK); - bzero(nd, sizeof(*nd)); - + nd = (struct nd_ifinfo *)malloc(sizeof(*nd), M_IP6NDP, M_WAITOK|M_ZERO); nd->initialized = 1; nd->chlim = IPV6_DEFHLIM; @@ -284,10 +282,9 @@ nd6_option(union nd_opts *ndopts) struct nd_opt_hdr *nd_opt; int olen; - if (ndopts == NULL) - panic("ndopts == NULL in nd6_option"); - if (ndopts->nd_opts_last == NULL) - panic("uninitialized ndopts in nd6_option"); + KASSERT(ndopts != NULL, ("%s: ndopts == NULL", __func__)); + KASSERT(ndopts->nd_opts_last != NULL, ("%s: uninitialized ndopts", + __func__)); if (ndopts->nd_opts_search == NULL) return NULL; if (ndopts->nd_opts_done) @@ -335,10 +332,9 @@ nd6_options(union nd_opts *ndopts) struct nd_opt_hdr *nd_opt; int i = 0; - if (ndopts == NULL) - panic("ndopts == NULL in nd6_options"); - if (ndopts->nd_opts_last == NULL) - panic("uninitialized ndopts in nd6_options"); + KASSERT(ndopts != NULL, ("%s: ndopts == NULL", __func__)); + KASSERT(ndopts->nd_opts_last != NULL, ("%s: uninitialized ndopts", + __func__)); if (ndopts->nd_opts_search == NULL) return 0; @@ -1174,11 +1170,13 @@ done: void nd6_rtrequest(int req, struct rtentry *rt, struct rt_addrinfo *info) { - struct sockaddr_in6 *gateway = (struct sockaddr_in6 *)rt->rt_gateway; + struct sockaddr_in6 *gateway; struct nd_defrouter *dr; - struct ifnet *ifp = rt->rt_ifp; + struct ifnet *ifp; RT_LOCK_ASSERT(rt); + gateway = (struct sockaddr_in6 *)rt->rt_gateway; + ifp = rt->rt_ifp; switch (req) { case RTM_ADD: @@ -1547,10 +1545,8 @@ nd6_cache_lladdr(struct ifnet *ifp, struct in6_addr *from, char *lladdr, IF_AFDATA_UNLOCK_ASSERT(ifp); - if (ifp == NULL) - panic("ifp == NULL in nd6_cache_lladdr"); - if (from == NULL) - panic("from == NULL in nd6_cache_lladdr"); + KASSERT(ifp != NULL, ("%s: ifp == NULL", __func__)); + KASSERT(from != NULL, ("%s: from == NULL", __func__)); /* nothing must be updated for unspecified address */ if (IN6_IS_ADDR_UNSPECIFIED(from)) @@ -2074,6 +2070,8 @@ nd6_output_lle(struct ifnet *ifp, struct ifnet *origifp, struct mbuf *m0, } return (error); } + /* Reset layer specific mbuf flags to avoid confusing lower layers. */ + m->m_flags &= ~(M_PROTOFLAGS); if ((ifp->if_flags & IFF_LOOPBACK) != 0) { return ((*ifp->if_output)(origifp, m, (struct sockaddr *)dst, NULL)); @@ -2239,7 +2237,6 @@ clear_llinfo_pqueue(struct llentry *ln) for (m_hold = ln->la_hold; m_hold; m_hold = m_hold_next) { m_hold_next = m_hold->m_nextpkt; - m_hold->m_nextpkt = NULL; m_freem(m_hold); } @@ -2262,128 +2259,101 @@ SYSCTL_VNET_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_MAXQLEN, nd6_maxqueuelen, static int nd6_sysctl_drlist(SYSCTL_HANDLER_ARGS) { - int error; - char buf[1024] __aligned(4); - struct in6_defrouter *d, *de; + struct in6_defrouter d; struct nd_defrouter *dr; + int error; if (req->newptr) - return EPERM; - error = 0; + return (EPERM); + bzero(&d, sizeof(d)); + d.rtaddr.sin6_family = AF_INET6; + d.rtaddr.sin6_len = sizeof(d.rtaddr); + + /* + * XXX locking + */ TAILQ_FOREACH(dr, &V_nd_defrouter, dr_entry) { - d = (struct in6_defrouter *)buf; - de = (struct in6_defrouter *)(buf + sizeof(buf)); - - if (d + 1 <= de) { - bzero(d, sizeof(*d)); - d->rtaddr.sin6_family = AF_INET6; - d->rtaddr.sin6_len = sizeof(d->rtaddr); - d->rtaddr.sin6_addr = dr->rtaddr; - error = sa6_recoverscope(&d->rtaddr); - if (error != 0) - return (error); - d->flags = dr->flags; - d->rtlifetime = dr->rtlifetime; - d->expire = dr->expire; - d->if_index = dr->ifp->if_index; - } else - panic("buffer too short"); - - error = SYSCTL_OUT(req, buf, sizeof(*d)); - if (error) - break; + d.rtaddr.sin6_addr = dr->rtaddr; + error = sa6_recoverscope(&d.rtaddr); + if (error != 0) + return (error); + d.flags = dr->flags; + d.rtlifetime = dr->rtlifetime; + d.expire = dr->expire; + d.if_index = dr->ifp->if_index; + error = SYSCTL_OUT(req, &d, sizeof(d)); + if (error != 0) + return (error); } - - return (error); + return (0); } static int nd6_sysctl_prlist(SYSCTL_HANDLER_ARGS) { - int error; - char buf[1024] __aligned(4); - struct in6_prefix *p, *pe; + struct in6_prefix p; + struct sockaddr_in6 s6; struct nd_prefix *pr; + struct nd_pfxrouter *pfr; + time_t maxexpire; + int error; char ip6buf[INET6_ADDRSTRLEN]; if (req->newptr) - return EPERM; - error = 0; + return (EPERM); + bzero(&p, sizeof(p)); + p.origin = PR_ORIG_RA; + bzero(&s6, sizeof(s6)); + s6.sin6_family = AF_INET6; + s6.sin6_len = sizeof(s6); + + /* + * XXX locking + */ LIST_FOREACH(pr, &V_nd_prefix, ndpr_entry) { - u_short advrtrs; - size_t advance; - struct sockaddr_in6 *sin6, *s6; - struct nd_pfxrouter *pfr; - - p = (struct in6_prefix *)buf; - pe = (struct in6_prefix *)(buf + sizeof(buf)); - - if (p + 1 <= pe) { - bzero(p, sizeof(*p)); - sin6 = (struct sockaddr_in6 *)(p + 1); - - p->prefix = pr->ndpr_prefix; - if (sa6_recoverscope(&p->prefix)) { + p.prefix = pr->ndpr_prefix; + if (sa6_recoverscope(&p.prefix)) { + log(LOG_ERR, "scope error in prefix list (%s)\n", + ip6_sprintf(ip6buf, &p.prefix.sin6_addr)); + /* XXX: press on... */ + } + p.raflags = pr->ndpr_raf; + p.prefixlen = pr->ndpr_plen; + p.vltime = pr->ndpr_vltime; + p.pltime = pr->ndpr_pltime; + p.if_index = pr->ndpr_ifp->if_index; + if (pr->ndpr_vltime == ND6_INFINITE_LIFETIME) + p.expire = 0; + else { + /* XXX: we assume time_t is signed. */ + maxexpire = (-1) & + ~((time_t)1 << ((sizeof(maxexpire) * 8) - 1)); + if (pr->ndpr_vltime < maxexpire - pr->ndpr_lastupdate) + p.expire = pr->ndpr_lastupdate + + pr->ndpr_vltime; + else + p.expire = maxexpire; + } + p.refcnt = pr->ndpr_refcnt; + p.flags = pr->ndpr_stateflags; + p.advrtrs = 0; + LIST_FOREACH(pfr, &pr->ndpr_advrtrs, pfr_entry) + p.advrtrs++; + error = SYSCTL_OUT(req, &p, sizeof(p)); + if (error != 0) + return (error); + LIST_FOREACH(pfr, &pr->ndpr_advrtrs, pfr_entry) { + s6.sin6_addr = pfr->router->rtaddr; + if (sa6_recoverscope(&s6)) log(LOG_ERR, "scope error in prefix list (%s)\n", - ip6_sprintf(ip6buf, &p->prefix.sin6_addr)); - /* XXX: press on... */ - } - p->raflags = pr->ndpr_raf; - p->prefixlen = pr->ndpr_plen; - p->vltime = pr->ndpr_vltime; - p->pltime = pr->ndpr_pltime; - p->if_index = pr->ndpr_ifp->if_index; - if (pr->ndpr_vltime == ND6_INFINITE_LIFETIME) - p->expire = 0; - else { - time_t maxexpire; - - /* XXX: we assume time_t is signed. */ - maxexpire = (-1) & - ~((time_t)1 << - ((sizeof(maxexpire) * 8) - 1)); - if (pr->ndpr_vltime < - maxexpire - pr->ndpr_lastupdate) { - p->expire = pr->ndpr_lastupdate + - pr->ndpr_vltime; - } else - p->expire = maxexpire; - } - p->refcnt = pr->ndpr_refcnt; - p->flags = pr->ndpr_stateflags; - p->origin = PR_ORIG_RA; - advrtrs = 0; - LIST_FOREACH(pfr, &pr->ndpr_advrtrs, pfr_entry) { - if ((void *)&sin6[advrtrs + 1] > (void *)pe) { - advrtrs++; - continue; - } - s6 = &sin6[advrtrs]; - bzero(s6, sizeof(*s6)); - s6->sin6_family = AF_INET6; - s6->sin6_len = sizeof(*sin6); - s6->sin6_addr = pfr->router->rtaddr; - if (sa6_recoverscope(s6)) { - log(LOG_ERR, - "scope error in " - "prefix list (%s)\n", - ip6_sprintf(ip6buf, - &pfr->router->rtaddr)); - } - advrtrs++; - } - p->advrtrs = advrtrs; - } else - panic("buffer too short"); - - advance = sizeof(*p) + sizeof(*sin6) * advrtrs; - error = SYSCTL_OUT(req, buf, advance); - if (error) - break; + ip6_sprintf(ip6buf, &pfr->router->rtaddr)); + error = SYSCTL_OUT(req, &s6, sizeof(s6)); + if (error != 0) + return (error); + } } - - return (error); + return (0); } diff --git a/sys/netinet6/nd6.h b/sys/netinet6/nd6.h index c44e7048b8c..eb0bd44ccda 100644 --- a/sys/netinet6/nd6.h +++ b/sys/netinet6/nd6.h @@ -79,7 +79,7 @@ struct nd_ifinfo { #define ND6_IFF_PERFORMNUD 0x1 #define ND6_IFF_ACCEPT_RTADV 0x2 -#define ND6_IFF_PREFER_SOURCE 0x4 /* XXX: not related to ND. */ +#define ND6_IFF_PREFER_SOURCE 0x4 /* Not used in FreeBSD. */ #define ND6_IFF_IFDISABLED 0x8 /* IPv6 operation is disabled due to * DAD failure. (XXX: not ND-specific) */ diff --git a/sys/netinet6/nd6_nbr.c b/sys/netinet6/nd6_nbr.c index 4b80dc270f0..a203558f8f0 100644 --- a/sys/netinet6/nd6_nbr.c +++ b/sys/netinet6/nd6_nbr.c @@ -595,9 +595,9 @@ nd6_ns_output(struct ifnet *ifp, const struct in6_addr *daddr6, icmp6_ifstat_inc(ifp, ifs6_out_neighborsolicit); ICMP6STAT_INC(icp6s_outhist[ND_NEIGHBOR_SOLICIT]); - if (ro.ro_rt) { /* we don't cache this route. */ - RTFREE(ro.ro_rt); - } + /* We don't cache this route. */ + RO_RTFREE(&ro); + return; bad: @@ -1124,9 +1124,9 @@ nd6_na_output_fib(struct ifnet *ifp, const struct in6_addr *daddr6_0, icmp6_ifstat_inc(ifp, ifs6_out_neighboradvert); ICMP6STAT_INC(icp6s_outhist[ND_NEIGHBOR_ADVERT]); - if (ro.ro_rt) { /* we don't cache this route. */ - RTFREE(ro.ro_rt); - } + /* We don't cache this route. */ + RO_RTFREE(&ro); + return; bad: diff --git a/sys/netinet6/route6.c b/sys/netinet6/route6.c index 1311437cbc6..ac0c7e6ff9f 100644 --- a/sys/netinet6/route6.c +++ b/sys/netinet6/route6.c @@ -62,6 +62,7 @@ route6_input(struct mbuf **mp, int *offp, int proto) struct mbuf *m = *mp; struct ip6_rthdr *rh; int off = *offp, rhlen; +#ifdef __notyet__ struct ip6aux *ip6a; ip6a = ip6_findaux(m); @@ -73,6 +74,7 @@ route6_input(struct mbuf **mp, int *offp, int proto) return IPPROTO_DONE; } } +#endif #ifndef PULLDOWN_TEST IP6_EXTHDR_CHECK(m, off, sizeof(*rh), IPPROTO_DONE); diff --git a/sys/netinet6/scope6.c b/sys/netinet6/scope6.c index 8189d87c5bc..7a1a04b25ce 100644 --- a/sys/netinet6/scope6.c +++ b/sys/netinet6/scope6.c @@ -494,3 +494,16 @@ in6_clearscope(struct in6_addr *in6) return (modified); } + +/* + * Return the scope identifier or zero. + */ +uint16_t +in6_getscope(struct in6_addr *in6) +{ + + if (IN6_IS_SCOPE_LINKLOCAL(in6) || IN6_IS_ADDR_MC_INTFACELOCAL(in6)) + return (in6->s6_addr16[1]); + + return (0); +} diff --git a/sys/netinet6/scope6_var.h b/sys/netinet6/scope6_var.h index 8ec6f105181..2248037f085 100644 --- a/sys/netinet6/scope6_var.h +++ b/sys/netinet6/scope6_var.h @@ -54,6 +54,7 @@ int sa6_embedscope __P((struct sockaddr_in6 *, int)); int sa6_recoverscope __P((struct sockaddr_in6 *)); int in6_setscope __P((struct in6_addr *, struct ifnet *, u_int32_t *)); int in6_clearscope __P((struct in6_addr *)); +uint16_t in6_getscope(struct in6_addr *); #endif /* _KERNEL */ #endif /* _NETINET6_SCOPE6_VAR_H_ */ diff --git a/sys/netinet6/sctp6_usrreq.c b/sys/netinet6/sctp6_usrreq.c index c1196260eb2..28e07461c41 100644 --- a/sys/netinet6/sctp6_usrreq.c +++ b/sys/netinet6/sctp6_usrreq.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -29,7 +29,6 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp6_usrreq.c,v 1.38 2005/08/24 08:08:56 suz Exp $ */ #include __FBSDID("$FreeBSD$"); @@ -69,233 +68,129 @@ int sctp6_input(struct mbuf **i_pak, int *offp, int proto) { struct mbuf *m; + int iphlen; + uint32_t vrf_id; + uint8_t ecn_bits; + struct sockaddr_in6 src, dst; struct ip6_hdr *ip6; struct sctphdr *sh; - struct sctp_inpcb *in6p = NULL; - struct sctp_nets *net; - int refcount_up = 0; - uint32_t vrf_id = 0; - -#ifdef IPSEC - struct inpcb *in6p_ip; - -#endif struct sctp_chunkhdr *ch; - int length, offset, iphlen; - uint8_t ecn_bits; - struct sctp_tcb *stcb = NULL; - int pkt_len = 0; + int length, offset; #if !defined(SCTP_WITH_NO_CSUM) - uint32_t check, calc_check; + uint8_t compute_crc; #endif - int off = *offp; + uint32_t mflowid; + uint8_t use_mflowid; uint16_t port = 0; - /* get the VRF and table id's */ + iphlen = *offp; if (SCTP_GET_PKT_VRFID(*i_pak, vrf_id)) { SCTP_RELEASE_PKT(*i_pak); - return (-1); + return (IPPROTO_DONE); } m = SCTP_HEADER_TO_CHAIN(*i_pak); - pkt_len = SCTP_HEADER_LEN((*i_pak)); +#ifdef SCTP_MBUF_LOGGING + /* Log in any input mbufs */ + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { + struct mbuf *mat; -#ifdef SCTP_PACKET_LOGGING - sctp_packet_log(m, pkt_len); + for (mat = m; mat; mat = SCTP_BUF_NEXT(mat)) { + if (SCTP_BUF_IS_EXTENDED(mat)) { + sctp_log_mb(mat, SCTP_MBUF_INPUT); + } + } + } #endif +#ifdef SCTP_PACKET_LOGGING + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) { + sctp_packet_log(m); + } +#endif + SCTPDBG(SCTP_DEBUG_CRCOFFLOAD, + "sctp6_input(): Packet of length %d received on %s with csum_flags 0x%x.\n", + m->m_pkthdr.len, + if_name(m->m_pkthdr.rcvif), + m->m_pkthdr.csum_flags); + if (m->m_flags & M_FLOWID) { + mflowid = m->m_pkthdr.flowid; + use_mflowid = 1; + } else { + mflowid = 0; + use_mflowid = 0; + } + SCTP_STAT_INCR(sctps_recvpackets); + SCTP_STAT_INCR_COUNTER64(sctps_inpackets); + /* Get IP, SCTP, and first chunk header together in the first mbuf. */ + offset = iphlen + sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr); ip6 = mtod(m, struct ip6_hdr *); - /* Ensure that (sctphdr + sctp_chunkhdr) in a row. */ - IP6_EXTHDR_GET(sh, struct sctphdr *, m, off, - (int)(sizeof(*sh) + sizeof(*ch))); + IP6_EXTHDR_GET(sh, struct sctphdr *, m, iphlen, + (int)(sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr))); if (sh == NULL) { SCTP_STAT_INCR(sctps_hdrops); return (IPPROTO_DONE); } ch = (struct sctp_chunkhdr *)((caddr_t)sh + sizeof(struct sctphdr)); - iphlen = off; - offset = iphlen + sizeof(*sh) + sizeof(*ch); - SCTPDBG(SCTP_DEBUG_INPUT1, - "sctp6_input() length:%d iphlen:%d\n", pkt_len, iphlen); - - -#if defined(NFAITH) && NFAITH > 0 - - if (faithprefix_p != NULL && (*faithprefix_p) (&ip6->ip6_dst)) { + offset -= sizeof(struct sctp_chunkhdr); + memset(&src, 0, sizeof(struct sockaddr_in6)); + src.sin6_family = AF_INET6; + src.sin6_len = sizeof(struct sockaddr_in6); + src.sin6_port = sh->src_port; + src.sin6_addr = ip6->ip6_src; + if (in6_setscope(&src.sin6_addr, m->m_pkthdr.rcvif, NULL) != 0) { + goto out; + } + memset(&dst, 0, sizeof(struct sockaddr_in6)); + dst.sin6_family = AF_INET6; + dst.sin6_len = sizeof(struct sockaddr_in6); + dst.sin6_port = sh->dest_port; + dst.sin6_addr = ip6->ip6_dst; + if (in6_setscope(&dst.sin6_addr, m->m_pkthdr.rcvif, NULL) != 0) { + goto out; + } + if (faithprefix_p != NULL && (*faithprefix_p) (&dst.sin6_addr)) { /* XXX send icmp6 host/port unreach? */ - goto bad; + goto out; + } + length = ntohs(ip6->ip6_plen) + iphlen; + /* Validate mbuf chain length with IP payload length. */ + if (SCTP_HEADER_LEN(m) != length) { + SCTPDBG(SCTP_DEBUG_INPUT1, + "sctp6_input() length:%d reported length:%d\n", length, SCTP_HEADER_LEN(m)); + SCTP_STAT_INCR(sctps_hdrops); + goto out; } -#endif /* NFAITH defined and > 0 */ - SCTP_STAT_INCR(sctps_recvpackets); - SCTP_STAT_INCR_COUNTER64(sctps_inpackets); - SCTPDBG(SCTP_DEBUG_INPUT1, "V6 input gets a packet iphlen:%d pktlen:%d\n", - iphlen, pkt_len); if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) { - /* No multi-cast support in SCTP */ - goto bad; + goto out; } - /* destination port of 0 is illegal, based on RFC2960. */ - if (sh->dest_port == 0) - goto bad; - - SCTPDBG(SCTP_DEBUG_CRCOFFLOAD, - "sctp_input(): Packet of length %d received on %s with csum_flags 0x%x.\n", - m->m_pkthdr.len, - if_name(m->m_pkthdr.rcvif), - m->m_pkthdr.csum_flags); + ecn_bits = ((ntohl(ip6->ip6_flow) >> 20) & 0x000000ff); #if defined(SCTP_WITH_NO_CSUM) SCTP_STAT_INCR(sctps_recvnocrc); #else if (m->m_pkthdr.csum_flags & CSUM_SCTP_VALID) { SCTP_STAT_INCR(sctps_recvhwcrc); - goto sctp_skip_csum; + compute_crc = 0; + } else { + SCTP_STAT_INCR(sctps_recvswcrc); + compute_crc = 1; } - check = sh->checksum; /* save incoming checksum */ - if ((check == 0) && (SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback)) && - (IN6_ARE_ADDR_EQUAL(&ip6->ip6_src, &ip6->ip6_dst))) { - SCTP_STAT_INCR(sctps_recvnocrc); - goto sctp_skip_csum; - } - sh->checksum = 0; /* prepare for calc */ - calc_check = sctp_calculate_cksum(m, iphlen); - SCTP_STAT_INCR(sctps_recvswcrc); - if (calc_check != check) { - SCTPDBG(SCTP_DEBUG_INPUT1, "Bad CSUM on SCTP packet calc_check:%x check:%x m:%p phlen:%d\n", - calc_check, check, m, iphlen); - stcb = sctp_findassociation_addr(m, offset - sizeof(*ch), - sh, ch, &in6p, &net, vrf_id); - if ((net) && (port)) { - if (net->port == 0) { - sctp_pathmtu_adjustment(stcb, net->mtu - sizeof(struct udphdr)); - } - net->port = port; - } - if ((net != NULL) && (m->m_flags & M_FLOWID)) { - net->flowid = m->m_pkthdr.flowid; -#ifdef INVARIANTS - net->flowidset = 1; #endif - } - /* in6p's ref-count increased && stcb locked */ - if ((in6p) && (stcb)) { - sctp_send_packet_dropped(stcb, net, m, iphlen, 1); - sctp_chunk_output((struct sctp_inpcb *)in6p, stcb, SCTP_OUTPUT_FROM_INPUT_ERROR, SCTP_SO_NOT_LOCKED); - } else if ((in6p != NULL) && (stcb == NULL)) { - refcount_up = 1; - } - SCTP_STAT_INCR(sctps_badsum); - SCTP_STAT_INCR_COUNTER32(sctps_checksumerrors); - goto bad; - } - sh->checksum = calc_check; - -sctp_skip_csum: + sctp_common_input_processing(&m, iphlen, offset, length, + (struct sockaddr *)&src, + (struct sockaddr *)&dst, + sh, ch, +#if !defined(SCTP_WITH_NO_CSUM) + compute_crc, #endif - net = NULL; - /* - * Locate pcb and tcb for datagram sctp_findassociation_addr() wants - * IP/SCTP/first chunk header... - */ - stcb = sctp_findassociation_addr(m, offset - sizeof(*ch), - sh, ch, &in6p, &net, vrf_id); - if ((net) && (port)) { - if (net->port == 0) { - sctp_pathmtu_adjustment(stcb, net->mtu - sizeof(struct udphdr)); - } - net->port = port; - } - if ((net != NULL) && (m->m_flags & M_FLOWID)) { - net->flowid = m->m_pkthdr.flowid; -#ifdef INVARIANTS - net->flowidset = 1; -#endif - } - /* in6p's ref-count increased */ - if (in6p == NULL) { - struct sctp_init_chunk *init_chk, chunk_buf; - - SCTP_STAT_INCR(sctps_noport); - if (ch->chunk_type == SCTP_INITIATION) { - /* - * we do a trick here to get the INIT tag, dig in - * and get the tag from the INIT and put it in the - * common header. - */ - init_chk = (struct sctp_init_chunk *)sctp_m_getptr(m, - iphlen + sizeof(*sh), sizeof(*init_chk), - (uint8_t *) & chunk_buf); - if (init_chk) - sh->v_tag = init_chk->init.initiate_tag; - else - sh->v_tag = 0; - } - if (ch->chunk_type == SCTP_SHUTDOWN_ACK) { - sctp_send_shutdown_complete2(m, sh, vrf_id, port); - goto bad; - } - if (ch->chunk_type == SCTP_SHUTDOWN_COMPLETE) { - goto bad; - } - if (ch->chunk_type != SCTP_ABORT_ASSOCIATION) { - if ((SCTP_BASE_SYSCTL(sctp_blackhole) == 0) || - ((SCTP_BASE_SYSCTL(sctp_blackhole) == 1) && - (ch->chunk_type != SCTP_INIT))) { - sctp_send_abort(m, iphlen, sh, 0, NULL, vrf_id, port); - } - } - goto bad; - } else if (stcb == NULL) { - refcount_up = 1; - } -#ifdef IPSEC - /* - * Check AH/ESP integrity. - */ - in6p_ip = (struct inpcb *)in6p; - if (in6p_ip && (ipsec6_in_reject(m, in6p_ip))) { -/* XXX */ - MODULE_GLOBAL(ipsec6stat).in_polvio++; - goto bad; - } -#endif /* IPSEC */ - - /* - * CONTROL chunk processing - */ - offset -= sizeof(*ch); - ecn_bits = ((ntohl(ip6->ip6_flow) >> 20) & 0x000000ff); - - /* Length now holds the total packet length payload + iphlen */ - length = ntohs(ip6->ip6_plen) + iphlen; - - /* sa_ignore NO_NULL_CHK */ - sctp_common_input_processing(&m, iphlen, offset, length, sh, ch, - in6p, stcb, net, ecn_bits, vrf_id, port); - /* inp's ref-count reduced && stcb unlocked */ - /* XXX this stuff below gets moved to appropriate parts later... */ - if (m) + ecn_bits, + use_mflowid, mflowid, + vrf_id, port); +out: + if (m) { sctp_m_freem(m); - if ((in6p) && refcount_up) { - /* reduce ref-count */ - SCTP_INP_WLOCK(in6p); - SCTP_INP_DECR_REF(in6p); - SCTP_INP_WUNLOCK(in6p); } return (IPPROTO_DONE); - -bad: - if (stcb) { - SCTP_TCB_UNLOCK(stcb); - } - if ((in6p) && refcount_up) { - /* reduce ref-count */ - SCTP_INP_WLOCK(in6p); - SCTP_INP_DECR_REF(in6p); - SCTP_INP_WUNLOCK(in6p); - } - if (m) - sctp_m_freem(m); - return (IPPROTO_DONE); } @@ -384,14 +279,12 @@ sctp6_notify(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so; #endif + /* protection */ - int reason; - - if ((inp == NULL) || (stcb == NULL) || (net == NULL) || (sh == NULL) || (to == NULL)) { if (stcb) @@ -428,8 +321,7 @@ sctp6_notify(struct sctp_inpcb *inp, net->dest_state &= ~SCTP_ADDR_REACHABLE; net->dest_state &= ~SCTP_ADDR_PF; sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, - stcb, SCTP_FAILED_THRESHOLD, - (void *)net, SCTP_SO_NOT_LOCKED); + stcb, 0, (void *)net, SCTP_SO_NOT_LOCKED); } SCTP_TCB_UNLOCK(stcb); } else if ((icmph->icmp6_code == ICMP_UNREACH_PROTOCOL) || @@ -441,9 +333,8 @@ sctp6_notify(struct sctp_inpcb *inp, * now is dead. In either case treat it like a OOTB abort * with no TCB */ - reason = SCTP_PEER_FAULTY; - sctp_abort_notification(stcb, reason, SCTP_SO_NOT_LOCKED); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) + sctp_abort_notification(stcb, 1, 0, NULL, SCTP_SO_NOT_LOCKED); +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) so = SCTP_INP_SO(inp); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -452,7 +343,7 @@ sctp6_notify(struct sctp_inpcb *inp, atomic_subtract_int(&stcb->asoc.refcnt, 1); #endif (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_USRREQ + SCTP_LOC_2); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) +#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) SCTP_SOCKET_UNLOCK(so, 1); /* SCTP_TCB_UNLOCK(stcb); MT: I think this is not needed. */ #endif @@ -516,8 +407,8 @@ sctp6_ctlinput(int cmd, struct sockaddr *pktdst, void *d) final.sin6_family = AF_INET6; final.sin6_addr = ((struct sockaddr_in6 *)pktdst)->sin6_addr; final.sin6_port = sh.dest_port; - stcb = sctp_findassociation_addr_sa((struct sockaddr *)ip6cp->ip6c_src, - (struct sockaddr *)&final, + stcb = sctp_findassociation_addr_sa((struct sockaddr *)&final, + (struct sockaddr *)ip6cp->ip6c_src, &inp, &net, 1, vrf_id); /* inp's ref-count increased && stcb locked */ if (stcb != NULL && inp && (inp->sctp_socket != NULL)) { @@ -584,8 +475,8 @@ sctp6_getcred(SYSCTL_HANDLER_ARGS) if (error) return (error); - stcb = sctp_findassociation_addr_sa(sin6tosa(&addrs[0]), - sin6tosa(&addrs[1]), + stcb = sctp_findassociation_addr_sa(sin6tosa(&addrs[1]), + sin6tosa(&addrs[0]), &inp, &net, 1, vrf_id); if (stcb == NULL || inp == NULL || inp->sctp_socket == NULL) { if ((inp != NULL) && (stcb == NULL)) { diff --git a/sys/netinet6/sctp6_var.h b/sys/netinet6/sctp6_var.h index 711caa1c54d..de0065d7245 100644 --- a/sys/netinet6/sctp6_var.h +++ b/sys/netinet6/sctp6_var.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. - * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. + * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. + * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -29,14 +29,13 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ -/* $KAME: sctp6_var.h,v 1.7 2004/08/17 04:06:22 itojun Exp $ */ - -#ifndef _NETINET6_SCTP6_VAR_H_ -#define _NETINET6_SCTP6_VAR_H_ #include __FBSDID("$FreeBSD$"); +#ifndef _NETINET6_SCTP6_VAR_H_ +#define _NETINET6_SCTP6_VAR_H_ + #if defined(_KERNEL) SYSCTL_DECL(_net_inet6_sctp6); diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c index 2a4c0a55a46..c43d958f082 100644 --- a/sys/netinet6/udp6_usrreq.c +++ b/sys/netinet6/udp6_usrreq.c @@ -185,6 +185,7 @@ udp6_input(struct mbuf **mp, int *offp, int proto) #ifdef IPFIREWALL_FORWARD struct m_tag *fwd_tag; #endif + uint16_t uh_sum; ifp = m->m_pkthdr.rcvif; ip6 = mtod(m, struct ip6_hdr *); @@ -228,7 +229,18 @@ udp6_input(struct mbuf **mp, int *offp, int proto) UDPSTAT_INC(udps_nosum); goto badunlocked; } - if (in6_cksum(m, IPPROTO_UDP, off, ulen) != 0) { + + if (m->m_pkthdr.csum_flags & CSUM_DATA_VALID_IPV6) { + if (m->m_pkthdr.csum_flags & CSUM_PSEUDO_HDR) + uh_sum = m->m_pkthdr.csum_data; + else + uh_sum = in6_cksum_pseudo(ip6, ulen, + IPPROTO_UDP, m->m_pkthdr.csum_data); + uh_sum ^= 0xffff; + } else + uh_sum = in6_cksum(m, IPPROTO_UDP, off, ulen); + + if (uh_sum != 0) { UDPSTAT_INC(udps_badsum); goto badunlocked; } @@ -771,10 +783,9 @@ udp6_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr6, ip6->ip6_src = *laddr; ip6->ip6_dst = *faddr; - if ((udp6->uh_sum = in6_cksum(m, IPPROTO_UDP, - sizeof(struct ip6_hdr), plen)) == 0) { - udp6->uh_sum = 0xffff; - } + udp6->uh_sum = in6_cksum_pseudo(ip6, plen, IPPROTO_UDP, 0); + m->m_pkthdr.csum_flags = CSUM_UDP_IPV6; + m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum); flags = 0; diff --git a/sys/netncp/ncp_nls.h b/sys/netncp/ncp_nls.h index 0180a92a0fb..628190de22d 100644 --- a/sys/netncp/ncp_nls.h +++ b/sys/netncp/ncp_nls.h @@ -52,9 +52,11 @@ struct ncp_nlstables { #define NCP_NLS_AS_IS 1 #define NCP_NLS_AS_IS_NAME "asis" #define NCP_NLS_KOI_866 2 -#define NCP_NLS_SE 3 #define NCP_NLS_KOI_866_NAME "koi2cp866" +#define NCP_NLS_SE 3 #define NCP_NLS_SE_NAME "se" +#define NCP_NLS_DE 4 +#define NCP_NLS_DE_NAME "de" extern struct ncp_nlstables ncp_nls; /* active nls */ diff --git a/sys/netsmb/smb_dev.c b/sys/netsmb/smb_dev.c index 6867804f57d..86b27533f21 100644 --- a/sys/netsmb/smb_dev.c +++ b/sys/netsmb/smb_dev.c @@ -375,7 +375,7 @@ nsmb_getfp(struct filedesc* fdp, int fd, int flag) struct file* fp; FILEDESC_SLOCK(fdp); - if (((u_int)fd) >= fdp->fd_nfiles || + if (fd < 0 || fd >= fdp->fd_nfiles || (fp = fdp->fd_ofiles[fd]) == NULL || (fp->f_flag & flag) == 0) { FILEDESC_SUNLOCK(fdp); diff --git a/sys/netsmb/smb_trantcp.c b/sys/netsmb/smb_trantcp.c index c8984510bf7..ce52544da62 100644 --- a/sys/netsmb/smb_trantcp.c +++ b/sys/netsmb/smb_trantcp.c @@ -523,8 +523,10 @@ smb_nbst_connect(struct smb_vc *vcp, struct sockaddr *sap, struct thread *td) return error; getnanotime(&ts2); timespecsub(&ts2, &ts1); - if (ts2.tv_sec == 0 && ts2.tv_sec == 0) + if (ts2.tv_sec == 0) { ts2.tv_sec = 1; + ts2.tv_nsec = 0; + } nbp->nbp_timo = ts2; timespecadd(&nbp->nbp_timo, &ts2); timespecadd(&nbp->nbp_timo, &ts2); diff --git a/sys/nfsclient/nfs_bio.c b/sys/nfsclient/nfs_bio.c index 90fe96ee0df..2ffd82258f7 100644 --- a/sys/nfsclient/nfs_bio.c +++ b/sys/nfsclient/nfs_bio.c @@ -275,7 +275,11 @@ nfs_putpages(struct vop_putpages_args *ap) vp = ap->a_vp; np = VTONFS(vp); td = curthread; /* XXX */ - cred = curthread->td_ucred; /* XXX */ + /* Set the cred to n_writecred for the write rpcs. */ + if (np->n_writecred != NULL) + cred = crhold(np->n_writecred); + else + cred = crhold(curthread->td_ucred); /* XXX */ nmp = VFSTONFS(vp->v_mount); pages = ap->a_m; count = ap->a_count; @@ -339,6 +343,7 @@ nfs_putpages(struct vop_putpages_args *ap) iomode = NFSV3WRITE_FILESYNC; error = (nmp->nm_rpcops->nr_writerpc)(vp, &uio, cred, &iomode, &must_commit); + crfree(cred); pmap_qremove(kva, npages); relpbuf(bp, &nfs_pbuf_freecnt); diff --git a/sys/nfsclient/nfs_node.c b/sys/nfsclient/nfs_node.c index afe3341ba6c..3805f6c38fe 100644 --- a/sys/nfsclient/nfs_node.c +++ b/sys/nfsclient/nfs_node.c @@ -270,6 +270,8 @@ nfs_reclaim(struct vop_reclaim_args *ap) free((caddr_t)dp2, M_NFSDIROFF); } } + if (np->n_writecred != NULL) + crfree(np->n_writecred); if (np->n_fhsize > NFS_SMALLFH) { free((caddr_t)np->n_fhp, M_NFSBIGFH); } diff --git a/sys/nfsclient/nfs_subs.c b/sys/nfsclient/nfs_subs.c index 0d306c07541..fb6cbe81ce7 100644 --- a/sys/nfsclient/nfs_subs.c +++ b/sys/nfsclient/nfs_subs.c @@ -865,7 +865,6 @@ nfs_clearcommit(struct mount *mp) struct buf *bp, *nbp; struct bufobj *bo; - MNT_ILOCK(mp); MNT_VNODE_FOREACH_ALL(vp, mp, nvp) { bo = &vp->v_bufobj; vholdl(vp); diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c index b2586c3d7ec..91727036d21 100644 --- a/sys/nfsclient/nfs_vfsops.c +++ b/sys/nfsclient/nfs_vfsops.c @@ -1452,6 +1452,7 @@ nfs_sync(struct mount *mp, int waitfor) MNT_IUNLOCK(mp); return (EBADF); } + MNT_IUNLOCK(mp); /* * Force stale buffer cache information to be flushed. diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c index 872317b60a2..ca9edad5f35 100644 --- a/sys/nfsclient/nfs_vnops.c +++ b/sys/nfsclient/nfs_vnops.c @@ -507,6 +507,7 @@ nfs_open(struct vop_open_args *ap) struct vattr vattr; int error; int fmode = ap->a_mode; + struct ucred *cred; if (vp->v_type != VREG && vp->v_type != VDIR && vp->v_type != VLNK) return (EOPNOTSUPP); @@ -563,7 +564,22 @@ nfs_open(struct vop_open_args *ap) } np->n_directio_opens++; } + + /* + * If this is an open for writing, capture a reference to the + * credentials, so they can be used by nfs_putpages(). Using + * these write credentials is preferable to the credentials of + * whatever thread happens to be doing the VOP_PUTPAGES() since + * the write RPCs are less likely to fail with EACCES. + */ + if ((fmode & FWRITE) != 0) { + cred = np->n_writecred; + np->n_writecred = crhold(ap->a_cred); + } else + cred = NULL; mtx_unlock(&np->n_mtx); + if (cred != NULL) + crfree(cred); vnode_create_vobject(vp, vattr.va_size, ap->a_td); return (0); } diff --git a/sys/nfsclient/nfsnode.h b/sys/nfsclient/nfsnode.h index 60e5613127e..c6fa73e7605 100644 --- a/sys/nfsclient/nfsnode.h +++ b/sys/nfsclient/nfsnode.h @@ -128,6 +128,7 @@ struct nfsnode { uint32_t n_namelen; int n_directio_opens; int n_directio_asyncwr; + struct ucred *n_writecred; /* Cred. for putpages */ }; #define n_atim n_un1.nf_atim diff --git a/sys/ofed/drivers/infiniband/core/cma.c b/sys/ofed/drivers/infiniband/core/cma.c index 750d2d54c8e..9867f100136 100644 --- a/sys/ofed/drivers/infiniband/core/cma.c +++ b/sys/ofed/drivers/infiniband/core/cma.c @@ -59,10 +59,10 @@ static int tavor_quirk = 0; module_param_named(tavor_quirk, tavor_quirk, int, 0644); MODULE_PARM_DESC(tavor_quirk, "Tavor performance quirk: limit MTU to 1K if > 0"); -int unify_tcp_port_space = 0; +int unify_tcp_port_space = 1; module_param(unify_tcp_port_space, int, 0644); MODULE_PARM_DESC(unify_tcp_port_space, "Unify the host TCP and RDMA port " - "space allocation (default=0)"); + "space allocation (default=1)"); #define CMA_CM_RESPONSE_TIMEOUT 20 #define CMA_MAX_CM_RETRIES 15 @@ -1478,6 +1478,7 @@ static int cma_iw_listen(struct rdma_id_private *id_priv, int backlog) struct sockaddr_in *sin; id_priv->cm_id.iw = iw_create_cm_id(id_priv->id.device, + id_priv->sock, iw_conn_req_handler, id_priv); if (IS_ERR(id_priv->cm_id.iw)) @@ -2055,7 +2056,16 @@ static int cma_bind_addr(struct rdma_cm_id *id, struct sockaddr *src_addr, ((struct sockaddr_in6 *) dst_addr)->sin6_scope_id; } } - return rdma_bind_addr(id, src_addr); + if (!cma_any_addr(src_addr)) + return rdma_bind_addr(id, src_addr); + else { + struct sockaddr_in addr_in; + + memset(&addr_in, 0, sizeof addr_in); + addr_in.sin_family = dst_addr->sa_family; + addr_in.sin_len = sizeof addr_in; + return rdma_bind_addr(id, (struct sockaddr *) &addr_in); + } } int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr, @@ -2247,6 +2257,7 @@ static int cma_get_tcp_port(struct rdma_id_private *id_priv) sock_release(sock); return ret; } + size = ip_addr_size((struct sockaddr *) &id_priv->id.route.addr.src_addr); ret = sock_getname(sock, (struct sockaddr *) &id_priv->id.route.addr.src_addr, @@ -2255,6 +2266,7 @@ static int cma_get_tcp_port(struct rdma_id_private *id_priv) sock_release(sock); return ret; } + id_priv->sock = sock; return 0; } @@ -2604,7 +2616,8 @@ static int cma_connect_iw(struct rdma_id_private *id_priv, int ret; struct iw_cm_conn_param iw_param; - cm_id = iw_create_cm_id(id_priv->id.device, cma_iw_handler, id_priv); + cm_id = iw_create_cm_id(id_priv->id.device, id_priv->sock, + cma_iw_handler, id_priv); if (IS_ERR(cm_id)) { ret = PTR_ERR(cm_id); goto out; diff --git a/sys/ofed/drivers/infiniband/core/iwcm.c b/sys/ofed/drivers/infiniband/core/iwcm.c index 625fec5a741..b13e53a3369 100644 --- a/sys/ofed/drivers/infiniband/core/iwcm.c +++ b/sys/ofed/drivers/infiniband/core/iwcm.c @@ -189,6 +189,7 @@ static void rem_ref(struct iw_cm_id *cm_id) static int cm_event_handler(struct iw_cm_id *cm_id, struct iw_cm_event *event); struct iw_cm_id *iw_create_cm_id(struct ib_device *device, + struct socket *so, iw_cm_handler cm_handler, void *context) { @@ -205,6 +206,7 @@ struct iw_cm_id *iw_create_cm_id(struct ib_device *device, cm_id_priv->id.event_handler = cm_event_handler; cm_id_priv->id.add_ref = add_ref; cm_id_priv->id.rem_ref = rem_ref; + cm_id_priv->id.so = so; spin_lock_init(&cm_id_priv->lock); atomic_set(&cm_id_priv->refcount, 1); init_waitqueue_head(&cm_id_priv->connect_wait); @@ -629,6 +631,7 @@ static void cm_conn_req_handler(struct iwcm_id_private *listen_id_priv, spin_unlock_irqrestore(&listen_id_priv->lock, flags); cm_id = iw_create_cm_id(listen_id_priv->id.device, + iw_event->so, listen_id_priv->id.cm_handler, listen_id_priv->id.context); /* If the cm_id could not be created, ignore the request */ diff --git a/sys/ofed/include/linux/net.h b/sys/ofed/include/linux/net.h index 6e2aff39524..f47acf938fe 100644 --- a/sys/ofed/include/linux/net.h +++ b/sys/ofed/include/linux/net.h @@ -48,12 +48,12 @@ sock_getname(struct socket *so, struct sockaddr *addr, int *sockaddr_len, int error; nam = NULL; - if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0) - return (-ENOTCONN); + if (peer) { + if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0) + return (-ENOTCONN); - if (peer) error = (*so->so_proto->pr_usrreqs->pru_peeraddr)(so, nam); - else + } else error = (*so->so_proto->pr_usrreqs->pru_sockaddr)(so, nam); if (error) return (-error); diff --git a/sys/ofed/include/linux/workqueue.h b/sys/ofed/include/linux/workqueue.h index c59b4ae3ce9..77443fea0ab 100644 --- a/sys/ofed/include/linux/workqueue.h +++ b/sys/ofed/include/linux/workqueue.h @@ -129,7 +129,7 @@ _create_workqueue_common(char *name, int cpus) wq = kmalloc(sizeof(*wq), M_WAITOK); wq->taskqueue = taskqueue_create((name), M_WAITOK, taskqueue_thread_enqueue, &wq->taskqueue); - taskqueue_start_threads(&wq->taskqueue, cpus, PWAIT, (name)); + taskqueue_start_threads(&wq->taskqueue, cpus, PWAIT, "%s", name); return (wq); } diff --git a/sys/ofed/include/net/netevent.h b/sys/ofed/include/net/netevent.h index db5b50ef604..c7bbc5fd552 100644 --- a/sys/ofed/include/net/netevent.h +++ b/sys/ofed/include/net/netevent.h @@ -42,7 +42,7 @@ enum netevent_notif_type { struct llentry; static inline void -_handle_arp_update_event(void *arg, struct llentry *lle) +_handle_arp_update_event(void *arg, struct llentry *lle, int evt __unused) { struct notifier_block *nb; @@ -54,7 +54,7 @@ static inline int register_netevent_notifier(struct notifier_block *nb) { nb->tags[NETEVENT_NEIGH_UPDATE] = EVENTHANDLER_REGISTER( - arp_update_event, _handle_arp_update_event, nb, 0); + lle_event, _handle_arp_update_event, nb, 0); return (0); } @@ -62,8 +62,7 @@ static inline int unregister_netevent_notifier(struct notifier_block *nb) { - EVENTHANDLER_DEREGISTER(arp_update_event, - nb->tags[NETEVENT_NEIGH_UPDATE]); + EVENTHANDLER_DEREGISTER(lle_event, nb->tags[NETEVENT_NEIGH_UPDATE]); return (0); } diff --git a/sys/ofed/include/rdma/iw_cm.h b/sys/ofed/include/rdma/iw_cm.h index cbb822e8d79..412320e0899 100644 --- a/sys/ofed/include/rdma/iw_cm.h +++ b/sys/ofed/include/rdma/iw_cm.h @@ -63,6 +63,7 @@ struct iw_cm_event { void *private_data; u8 private_data_len; void *provider_data; + struct socket *so; }; /** @@ -98,6 +99,7 @@ struct iw_cm_id { /* Used by provider to add and remove refs on IW cm_id */ void (*add_ref)(struct iw_cm_id *); void (*rem_ref)(struct iw_cm_id *); + struct socket *so; }; struct iw_cm_conn_param { @@ -139,7 +141,7 @@ struct iw_cm_verbs { * returned IW CM identifier. * @context: User specified context associated with the id. */ -struct iw_cm_id *iw_create_cm_id(struct ib_device *device, +struct iw_cm_id *iw_create_cm_id(struct ib_device *device, struct socket *so, iw_cm_handler cm_handler, void *context); /** diff --git a/sys/pc98/conf/GENERIC b/sys/pc98/conf/GENERIC index c5784d75bc0..8f3d9b66f3d 100644 --- a/sys/pc98/conf/GENERIC +++ b/sys/pc98/conf/GENERIC @@ -110,7 +110,7 @@ device da # Direct Access (disks) device sa # Sequential Access (tape etc) device cd # CD device pass # Passthrough device (direct ATA/SCSI access) -device ses # SCSI Environmental Services (and SAF-TE) +device ses # Enclosure Services (SES and SAF-TE) # keyboard driver device pckbd # PC98 keyboard diff --git a/sys/pc98/include/vdso.h b/sys/pc98/include/vdso.h new file mode 100644 index 00000000000..b81c455a92a --- /dev/null +++ b/sys/pc98/include/vdso.h @@ -0,0 +1,6 @@ +/*- + * This file is in the public domain. + */ +/* $FreeBSD$ */ + +#include diff --git a/sys/pc98/pc98/machdep.c b/sys/pc98/pc98/machdep.c index 1aeb76513bf..38b7a283f5a 100644 --- a/sys/pc98/pc98/machdep.c +++ b/sys/pc98/pc98/machdep.c @@ -73,6 +73,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -151,7 +152,6 @@ extern void dblfault_handler(void); extern void printcpuinfo(void); /* XXX header file */ extern void finishidentcpu(void); extern void panicifcpuunsupported(void); -extern void initializecpu(void); #define CS_SECURE(cs) (ISPL(cs) == SEL_UPL) #define EFL_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0) @@ -217,6 +217,8 @@ struct pcpu __pcpu[MAXCPU]; struct mtx icu_lock; +struct mem_range_softc mem_range_softc; + static void cpu_startup(dummy) void *dummy; @@ -272,12 +274,10 @@ cpu_startup(dummy) vm_pager_bufferinit(); cpu_setregs(); -#ifdef SMP /* * Add BSP as an interrupt target. */ intr_add_cpu(0); -#endif } /* diff --git a/sys/powerpc/aim/locore32.S b/sys/powerpc/aim/locore32.S index 9ad74fa49f5..80c3c086517 100644 --- a/sys/powerpc/aim/locore32.S +++ b/sys/powerpc/aim/locore32.S @@ -164,13 +164,14 @@ __start: bl OF_initial_setup - lis 4,end@ha - addi 4,4,end@l - mr 5,4 - lis 3,kernel_text@ha addi 3,3,kernel_text@l + lis 4,end@ha + addi 4,4,end@l + add 4,4,3 + mr 5,4 + /* Restore the argument pointer and length */ mr 6,20 mr 7,21 diff --git a/sys/powerpc/aim/locore64.S b/sys/powerpc/aim/locore64.S index 83d904801d6..65c4999a1e2 100644 --- a/sys/powerpc/aim/locore64.S +++ b/sys/powerpc/aim/locore64.S @@ -164,13 +164,14 @@ ASENTRY_NOPROF(__start) bl OF_initial_setup nop - lis 4,end@ha - addi 4,4,end@l - mr 5,4 - lis 3,kernbase@ha addi 3,3,kernbase@l + lis 4,end@ha + addi 4,4,end@l + add 4,4,3 + mr 5,4 + /* Restore the argument pointer and length */ mr 6,20 mr 7,21 diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c index 50aaa757200..93dfb46fe42 100644 --- a/sys/powerpc/aim/mmu_oea.c +++ b/sys/powerpc/aim/mmu_oea.c @@ -125,6 +125,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -204,6 +205,17 @@ struct pvo_head *moea_pvo_table; /* pvo entries by pteg index */ struct pvo_head moea_pvo_kunmanaged = LIST_HEAD_INITIALIZER(moea_pvo_kunmanaged); /* list of unmanaged pages */ +/* + * Isolate the global pv list lock from data and other locks to prevent false + * sharing within the cache. + */ +static struct { + struct rwlock lock; + char padding[CACHE_LINE_SIZE - sizeof(struct rwlock)]; +} pvh_global __aligned(CACHE_LINE_SIZE); + +#define pvh_global_lock pvh_global.lock + uma_zone_t moea_upvo_zone; /* zone for pvo entries for unmanaged pages */ uma_zone_t moea_mpvo_zone; /* zone for pvo entries for managed pages */ @@ -288,8 +300,8 @@ void moea_init(mmu_t); boolean_t moea_is_modified(mmu_t, vm_page_t); boolean_t moea_is_prefaultable(mmu_t, pmap_t, vm_offset_t); boolean_t moea_is_referenced(mmu_t, vm_page_t); -boolean_t moea_ts_referenced(mmu_t, vm_page_t); -vm_offset_t moea_map(mmu_t, vm_offset_t *, vm_offset_t, vm_offset_t, int); +int moea_ts_referenced(mmu_t, vm_page_t); +vm_offset_t moea_map(mmu_t, vm_offset_t *, vm_paddr_t, vm_paddr_t, int); boolean_t moea_page_exists_quick(mmu_t, pmap_t, vm_page_t); int moea_page_wired_mappings(mmu_t, vm_page_t); void moea_pinit(mmu_t, pmap_t); @@ -308,14 +320,14 @@ void moea_activate(mmu_t, struct thread *); void moea_deactivate(mmu_t, struct thread *); void moea_cpu_bootstrap(mmu_t, int); void moea_bootstrap(mmu_t, vm_offset_t, vm_offset_t); -void *moea_mapdev(mmu_t, vm_offset_t, vm_size_t); +void *moea_mapdev(mmu_t, vm_paddr_t, vm_size_t); void *moea_mapdev_attr(mmu_t, vm_offset_t, vm_size_t, vm_memattr_t); void moea_unmapdev(mmu_t, vm_offset_t, vm_size_t); -vm_offset_t moea_kextract(mmu_t, vm_offset_t); +vm_paddr_t moea_kextract(mmu_t, vm_offset_t); void moea_kenter_attr(mmu_t, vm_offset_t, vm_offset_t, vm_memattr_t); -void moea_kenter(mmu_t, vm_offset_t, vm_offset_t); +void moea_kenter(mmu_t, vm_offset_t, vm_paddr_t); void moea_page_set_memattr(mmu_t mmu, vm_page_t m, vm_memattr_t ma); -boolean_t moea_dev_direct_mapped(mmu_t, vm_offset_t, vm_size_t); +boolean_t moea_dev_direct_mapped(mmu_t, vm_paddr_t, vm_size_t); static void moea_sync_icache(mmu_t, pmap_t, vm_offset_t, vm_size_t); static mmu_method_t moea_methods[] = { @@ -455,7 +467,7 @@ static __inline void moea_attr_clear(vm_page_t m, int ptebit) { - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); m->md.mdpg_attrs &= ~ptebit; } @@ -470,7 +482,7 @@ static __inline void moea_attr_save(vm_page_t m, int ptebit) { - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); m->md.mdpg_attrs |= ptebit; } @@ -857,7 +869,12 @@ moea_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) for (i = 0; i < 16; i++) kernel_pmap->pm_sr[i] = EMPTY_SEGMENT + i; CPU_FILL(&kernel_pmap->pm_active); - LIST_INIT(&kernel_pmap->pmap_pvo); + RB_INIT(&kernel_pmap->pmap_pvo); + + /* + * Initialize the global pv list lock. + */ + rw_init(&pvh_global_lock, "pmap pv global"); /* * Set up the Open Firmware mappings @@ -1066,10 +1083,10 @@ moea_enter(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, boolean_t wired) { - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); moea_enter_locked(pmap, va, m, prot, wired); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -1102,7 +1119,7 @@ moea_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, pvo_flags = PVO_MANAGED; } if (pmap_bootstrapped) - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0 || VM_OBJECT_LOCKED(m->object), @@ -1166,14 +1183,14 @@ moea_enter_object(mmu_t mmu, pmap_t pm, vm_offset_t start, vm_offset_t end, psize = atop(end - start); m = m_start; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pm); while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { moea_enter_locked(pm, start + ptoa(diff), m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), FALSE); m = TAILQ_NEXT(m, listq); } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pm); } @@ -1182,11 +1199,11 @@ moea_enter_quick(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot) { - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pm); moea_enter_locked(pm, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), FALSE); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pm); } @@ -1252,15 +1269,20 @@ moea_init(mmu_t mmu) boolean_t moea_is_referenced(mmu_t mmu, vm_page_t m) { + boolean_t rv; KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea_is_referenced: page %p is not managed", m)); - return (moea_query_bit(m, PTE_REF)); + rw_wlock(&pvh_global_lock); + rv = moea_query_bit(m, PTE_REF); + rw_wunlock(&pvh_global_lock); + return (rv); } boolean_t moea_is_modified(mmu_t mmu, vm_page_t m) { + boolean_t rv; KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea_is_modified: page %p is not managed", m)); @@ -1274,7 +1296,10 @@ moea_is_modified(mmu_t mmu, vm_page_t m) if ((m->oflags & VPO_BUSY) == 0 && (m->aflags & PGA_WRITEABLE) == 0) return (FALSE); - return (moea_query_bit(m, PTE_CHG)); + rw_wlock(&pvh_global_lock); + rv = moea_query_bit(m, PTE_CHG); + rw_wunlock(&pvh_global_lock); + return (rv); } boolean_t @@ -1296,7 +1321,9 @@ moea_clear_reference(mmu_t mmu, vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea_clear_reference: page %p is not managed", m)); + rw_wlock(&pvh_global_lock); moea_clear_bit(m, PTE_REF); + rw_wunlock(&pvh_global_lock); } void @@ -1316,7 +1343,9 @@ moea_clear_modify(mmu_t mmu, vm_page_t m) */ if ((m->aflags & PGA_WRITEABLE) == 0) return; + rw_wlock(&pvh_global_lock); moea_clear_bit(m, PTE_CHG); + rw_wunlock(&pvh_global_lock); } /* @@ -1342,7 +1371,7 @@ moea_remove_write(mmu_t mmu, vm_page_t m) if ((m->oflags & VPO_BUSY) == 0 && (m->aflags & PGA_WRITEABLE) == 0) return; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); lo = moea_attr_fetch(m); powerpc_sync(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { @@ -1368,7 +1397,7 @@ moea_remove_write(mmu_t mmu, vm_page_t m) vm_page_dirty(m); } vm_page_aflag_clear(m, PGA_WRITEABLE); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* @@ -1383,13 +1412,17 @@ moea_remove_write(mmu_t mmu, vm_page_t m) * should be tested and standardized at some point in the future for * optimal aging of shared pages. */ -boolean_t +int moea_ts_referenced(mmu_t mmu, vm_page_t m) { + int count; KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea_ts_referenced: page %p is not managed", m)); - return (moea_clear_bit(m, PTE_REF)); + rw_wlock(&pvh_global_lock); + count = moea_clear_bit(m, PTE_REF); + rw_wunlock(&pvh_global_lock); + return (count); } /* @@ -1409,7 +1442,7 @@ moea_page_set_memattr(mmu_t mmu, vm_page_t m, vm_memattr_t ma) return; } - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); pvo_head = vm_page_to_pvoh(m); lo = moea_calc_wimg(VM_PAGE_TO_PHYS(m), ma); @@ -1429,14 +1462,14 @@ moea_page_set_memattr(mmu_t mmu, vm_page_t m, vm_memattr_t ma) PMAP_UNLOCK(pmap); } m->md.mdpg_cache_attrs = ma; - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* * Map a wired page into kernel virtual address space. */ void -moea_kenter(mmu_t mmu, vm_offset_t va, vm_offset_t pa) +moea_kenter(mmu_t mmu, vm_offset_t va, vm_paddr_t pa) { moea_kenter_attr(mmu, va, pa, VM_MEMATTR_DEFAULT); @@ -1471,7 +1504,7 @@ moea_kenter_attr(mmu_t mmu, vm_offset_t va, vm_offset_t pa, vm_memattr_t ma) * Extract the physical page address associated with the given kernel virtual * address. */ -vm_offset_t +vm_paddr_t moea_kextract(mmu_t mmu, vm_offset_t va) { struct pvo_entry *pvo; @@ -1512,8 +1545,8 @@ moea_kremove(mmu_t mmu, vm_offset_t va) * first usable address after the mapped region. */ vm_offset_t -moea_map(mmu_t mmu, vm_offset_t *virt, vm_offset_t pa_start, - vm_offset_t pa_end, int prot) +moea_map(mmu_t mmu, vm_offset_t *virt, vm_paddr_t pa_start, + vm_paddr_t pa_end, int prot) { vm_offset_t sva, va; @@ -1543,7 +1576,7 @@ moea_page_exists_quick(mmu_t mmu, pmap_t pmap, vm_page_t m) ("moea_page_exists_quick: page %p is not managed", m)); loops = 0; rv = FALSE; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { if (pvo->pvo_pmap == pmap) { rv = TRUE; @@ -1552,7 +1585,7 @@ moea_page_exists_quick(mmu_t mmu, pmap_t pmap, vm_page_t m) if (++loops >= 16) break; } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (rv); } @@ -1569,11 +1602,11 @@ moea_page_wired_mappings(mmu_t mmu, vm_page_t m) count = 0; if ((m->oflags & VPO_UNMANAGED) != 0) return (count); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) if ((pvo->pvo_vaddr & PVO_WIRED) != 0) count++; - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (count); } @@ -1587,7 +1620,7 @@ moea_pinit(mmu_t mmu, pmap_t pmap) KASSERT((int)pmap < VM_MIN_KERNEL_ADDRESS, ("moea_pinit: virt pmap")); PMAP_LOCK_INIT(pmap); - LIST_INIT(&pmap->pmap_pvo); + RB_INIT(&pmap->pmap_pvo); entropy = 0; __asm __volatile("mftb %0" : "=r"(entropy)); @@ -1661,9 +1694,8 @@ void moea_protect(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) { - struct pvo_entry *pvo; + struct pvo_entry *pvo, *tpvo, key; struct pte *pt; - int pteidx; KASSERT(pm == &curproc->p_vmspace->vm_pmap || pm == kernel_pmap, ("moea_protect: non current pmap")); @@ -1673,13 +1705,12 @@ moea_protect(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva, return; } - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pm); - for (; sva < eva; sva += PAGE_SIZE) { - pvo = moea_pvo_find_va(pm, sva, &pteidx); - if (pvo == NULL) - continue; - + key.pvo_vaddr = sva; + for (pvo = RB_NFIND(pvo_tree, &pm->pmap_pvo, &key); + pvo != NULL && PVO_VADDR(pvo) < eva; pvo = tpvo) { + tpvo = RB_NEXT(pvo_tree, &pm->pmap_pvo, pvo); if ((prot & VM_PROT_EXECUTE) == 0) pvo->pvo_vaddr &= ~PVO_EXECUTABLE; @@ -1687,7 +1718,7 @@ moea_protect(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva, * Grab the PTE pointer before we diddle with the cached PTE * copy. */ - pt = moea_pvo_to_pte(pvo, pteidx); + pt = moea_pvo_to_pte(pvo, -1); /* * Change the protection of the page. */ @@ -1702,7 +1733,7 @@ moea_protect(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva, mtx_unlock(&moea_table_mutex); } } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pm); } @@ -1766,26 +1797,18 @@ moea_release(mmu_t mmu, pmap_t pmap) void moea_remove(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva) { - struct pvo_entry *pvo, *tpvo; - int pteidx; + struct pvo_entry *pvo, *tpvo, key; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pm); - if ((eva - sva)/PAGE_SIZE < 10) { - for (; sva < eva; sva += PAGE_SIZE) { - pvo = moea_pvo_find_va(pm, sva, &pteidx); - if (pvo != NULL) - moea_pvo_remove(pvo, pteidx); - } - } else { - LIST_FOREACH_SAFE(pvo, &pm->pmap_pvo, pvo_plink, tpvo) { - if (PVO_VADDR(pvo) < sva || PVO_VADDR(pvo) >= eva) - continue; - moea_pvo_remove(pvo, -1); - } + key.pvo_vaddr = sva; + for (pvo = RB_NFIND(pvo_tree, &pm->pmap_pvo, &key); + pvo != NULL && PVO_VADDR(pvo) < eva; pvo = tpvo) { + tpvo = RB_NEXT(pvo_tree, &pm->pmap_pvo, pvo); + moea_pvo_remove(pvo, -1); } PMAP_UNLOCK(pm); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* @@ -1799,7 +1822,7 @@ moea_remove_all(mmu_t mmu, vm_page_t m) struct pvo_entry *pvo, *next_pvo; pmap_t pmap; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); pvo_head = vm_page_to_pvoh(m); for (pvo = LIST_FIRST(pvo_head); pvo != NULL; pvo = next_pvo) { next_pvo = LIST_NEXT(pvo, pvo_vlink); @@ -1809,12 +1832,12 @@ moea_remove_all(mmu_t mmu, vm_page_t m) moea_pvo_remove(pvo, -1); PMAP_UNLOCK(pmap); } - if ((m->aflags & PGA_WRITEABLE) && moea_is_modified(mmu, m)) { + if ((m->aflags & PGA_WRITEABLE) && moea_query_bit(m, PTE_CHG)) { moea_attr_clear(m, PTE_CHG); vm_page_dirty(m); } vm_page_aflag_clear(m, PGA_WRITEABLE); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* @@ -1946,7 +1969,7 @@ moea_pvo_enter(pmap_t pm, uma_zone_t zone, struct pvo_head *pvo_head, /* * Add to pmap list */ - LIST_INSERT_HEAD(&pm->pmap_pvo, pvo, pvo_plink); + RB_INSERT(pvo_tree, &pm->pmap_pvo, pvo); /* * Remember if the list was empty and therefore will be the first @@ -2017,7 +2040,7 @@ moea_pvo_remove(struct pvo_entry *pvo, int pteidx) * Remove this PVO from the PV and pmap lists. */ LIST_REMOVE(pvo, pvo_vlink); - LIST_REMOVE(pvo, pvo_plink); + RB_REMOVE(pvo_tree, &pvo->pvo_pmap->pmap_pvo, pvo); /* * Remove this from the overflow list and return it to the pool @@ -2286,10 +2309,10 @@ moea_query_bit(vm_page_t m, int ptebit) struct pvo_entry *pvo; struct pte *pt; + rw_assert(&pvh_global_lock, RA_WLOCKED); if (moea_attr_fetch(m) & ptebit) return (TRUE); - vm_page_lock_queues(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { /* @@ -2298,7 +2321,6 @@ moea_query_bit(vm_page_t m, int ptebit) */ if (pvo->pvo_pte.pte.pte_lo & ptebit) { moea_attr_save(m, ptebit); - vm_page_unlock_queues(); return (TRUE); } } @@ -2322,13 +2344,11 @@ moea_query_bit(vm_page_t m, int ptebit) mtx_unlock(&moea_table_mutex); if (pvo->pvo_pte.pte.pte_lo & ptebit) { moea_attr_save(m, ptebit); - vm_page_unlock_queues(); return (TRUE); } } } - vm_page_unlock_queues(); return (FALSE); } @@ -2339,7 +2359,7 @@ moea_clear_bit(vm_page_t m, int ptebit) struct pvo_entry *pvo; struct pte *pt; - vm_page_lock_queues(); + rw_assert(&pvh_global_lock, RA_WLOCKED); /* * Clear the cached value. @@ -2373,7 +2393,6 @@ moea_clear_bit(vm_page_t m, int ptebit) pvo->pvo_pte.pte.pte_lo &= ~ptebit; } - vm_page_unlock_queues(); return (count); } @@ -2418,7 +2437,7 @@ moea_bat_mapped(int idx, vm_offset_t pa, vm_size_t size) } boolean_t -moea_dev_direct_mapped(mmu_t mmu, vm_offset_t pa, vm_size_t size) +moea_dev_direct_mapped(mmu_t mmu, vm_paddr_t pa, vm_size_t size) { int i; @@ -2441,7 +2460,7 @@ moea_dev_direct_mapped(mmu_t mmu, vm_offset_t pa, vm_size_t size) * NOT real memory. */ void * -moea_mapdev(mmu_t mmu, vm_offset_t pa, vm_size_t size) +moea_mapdev(mmu_t mmu, vm_paddr_t pa, vm_size_t size) { return (moea_mapdev_attr(mmu, pa, size, VM_MEMATTR_DEFAULT)); diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c index 624e088a0fa..31ca7c2c328 100644 --- a/sys/powerpc/aim/mmu_oea64.c +++ b/sys/powerpc/aim/mmu_oea64.c @@ -223,8 +223,6 @@ u_int moea64_pteg_mask; * PVO data. */ struct pvo_head *moea64_pvo_table; /* pvo entries by pteg index */ -struct pvo_head moea64_pvo_kunmanaged = /* list of unmanaged pages */ - LIST_HEAD_INITIALIZER(moea64_pvo_kunmanaged); uma_zone_t moea64_upvo_zone; /* zone for pvo entries for unmanaged pages */ uma_zone_t moea64_mpvo_zone; /* zone for pvo entries for managed pages */ @@ -307,8 +305,8 @@ void moea64_init(mmu_t); boolean_t moea64_is_modified(mmu_t, vm_page_t); boolean_t moea64_is_prefaultable(mmu_t, pmap_t, vm_offset_t); boolean_t moea64_is_referenced(mmu_t, vm_page_t); -boolean_t moea64_ts_referenced(mmu_t, vm_page_t); -vm_offset_t moea64_map(mmu_t, vm_offset_t *, vm_offset_t, vm_offset_t, int); +int moea64_ts_referenced(mmu_t, vm_page_t); +vm_offset_t moea64_map(mmu_t, vm_offset_t *, vm_paddr_t, vm_paddr_t, int); boolean_t moea64_page_exists_quick(mmu_t, pmap_t, vm_page_t); int moea64_page_wired_mappings(mmu_t, vm_page_t); void moea64_pinit(mmu_t, pmap_t); @@ -326,14 +324,14 @@ void moea64_zero_page_area(mmu_t, vm_page_t, int, int); void moea64_zero_page_idle(mmu_t, vm_page_t); void moea64_activate(mmu_t, struct thread *); void moea64_deactivate(mmu_t, struct thread *); -void *moea64_mapdev(mmu_t, vm_offset_t, vm_size_t); +void *moea64_mapdev(mmu_t, vm_paddr_t, vm_size_t); void *moea64_mapdev_attr(mmu_t, vm_offset_t, vm_size_t, vm_memattr_t); void moea64_unmapdev(mmu_t, vm_offset_t, vm_size_t); -vm_offset_t moea64_kextract(mmu_t, vm_offset_t); +vm_paddr_t moea64_kextract(mmu_t, vm_offset_t); void moea64_page_set_memattr(mmu_t, vm_page_t m, vm_memattr_t ma); void moea64_kenter_attr(mmu_t, vm_offset_t, vm_offset_t, vm_memattr_t ma); -void moea64_kenter(mmu_t, vm_offset_t, vm_offset_t); -boolean_t moea64_dev_direct_mapped(mmu_t, vm_offset_t, vm_size_t); +void moea64_kenter(mmu_t, vm_offset_t, vm_paddr_t); +boolean_t moea64_dev_direct_mapped(mmu_t, vm_paddr_t, vm_size_t); static void moea64_sync_icache(mmu_t, pmap_t, vm_offset_t, vm_size_t); static mmu_method_t moea64_methods[] = { @@ -622,8 +620,8 @@ moea64_setup_direct_map(mmu_t mmup, vm_offset_t kernelstart, pte_lo |= LPTE_G; moea64_pvo_enter(mmup, kernel_pmap, moea64_upvo_zone, - &moea64_pvo_kunmanaged, pa, pa, - pte_lo, PVO_WIRED | PVO_LARGE); + NULL, pa, pa, pte_lo, + PVO_WIRED | PVO_LARGE); } } PMAP_UNLOCK(kernel_pmap); @@ -820,7 +818,7 @@ moea64_mid_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) kernel_pmap->pmap_phys = kernel_pmap; CPU_FILL(&kernel_pmap->pm_active); - LIST_INIT(&kernel_pmap->pmap_pvo); + RB_INIT(&kernel_pmap->pmap_pvo); PMAP_LOCK_INIT(kernel_pmap); @@ -1179,7 +1177,7 @@ moea64_enter(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, int error; if (!moea64_initialized) { - pvo_head = &moea64_pvo_kunmanaged; + pvo_head = NULL; pg = NULL; zone = moea64_upvo_zone; pvo_flags = 0; @@ -1197,7 +1195,7 @@ moea64_enter(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, /* XXX change the pvo head for fake pages */ if ((m->oflags & VPO_UNMANAGED) != 0) { pvo_flags &= ~PVO_MANAGED; - pvo_head = &moea64_pvo_kunmanaged; + pvo_head = NULL; zone = moea64_upvo_zone; } @@ -1315,7 +1313,6 @@ moea64_extract(mmu_t mmu, pmap_t pm, vm_offset_t va) struct pvo_entry *pvo; vm_paddr_t pa; - LOCK_TABLE_RD(); PMAP_LOCK(pm); pvo = moea64_pvo_find_va(pm, va); if (pvo == NULL) @@ -1323,7 +1320,6 @@ moea64_extract(mmu_t mmu, pmap_t pm, vm_offset_t va) else pa = (pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN) | (va - PVO_VADDR(pvo)); - UNLOCK_TABLE_RD(); PMAP_UNLOCK(pm); return (pa); } @@ -1333,37 +1329,6 @@ moea64_extract(mmu_t mmu, pmap_t pm, vm_offset_t va) * pmap and virtual address pair if that mapping permits the given * protection. */ - -extern int pa_tryrelock_restart; - -static int -vm_page_pa_tryrelock_moea64(pmap_t pmap, vm_paddr_t pa, vm_paddr_t *locked) -{ - /* - * This is a duplicate of vm_page_pa_tryrelock(), but with proper - * handling of the table lock - */ - vm_paddr_t lockpa; - - lockpa = *locked; - *locked = pa; - if (lockpa) { - PA_LOCK_ASSERT(lockpa, MA_OWNED); - if (PA_LOCKPTR(pa) == PA_LOCKPTR(lockpa)) - return (0); - PA_UNLOCK(lockpa); - } - if (PA_TRYLOCK(pa)) - return (0); - UNLOCK_TABLE_RD(); - PMAP_UNLOCK(pmap); - atomic_add_int(&pa_tryrelock_restart, 1); - PA_LOCK(pa); - LOCK_TABLE_RD(); - PMAP_LOCK(pmap); - return (EAGAIN); -} - vm_page_t moea64_extract_and_hold(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_prot_t prot) { @@ -1373,21 +1338,19 @@ moea64_extract_and_hold(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_prot_t prot) m = NULL; pa = 0; - LOCK_TABLE_RD(); PMAP_LOCK(pmap); retry: pvo = moea64_pvo_find_va(pmap, va & ~ADDR_POFF); if (pvo != NULL && (pvo->pvo_pte.lpte.pte_hi & LPTE_VALID) && ((pvo->pvo_pte.lpte.pte_lo & LPTE_PP) == LPTE_RW || (prot & VM_PROT_WRITE) == 0)) { - if (vm_page_pa_tryrelock_moea64(pmap, + if (vm_page_pa_tryrelock(pmap, pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN, &pa)) goto retry; m = PHYS_TO_VM_PAGE(pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN); vm_page_hold(m); } PA_UNLOCK_COND(pa); - UNLOCK_TABLE_RD(); PMAP_UNLOCK(pmap); return (m); } @@ -1435,8 +1398,7 @@ moea64_uma_page_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) PMAP_LOCK(kernel_pmap); moea64_pvo_enter(installed_mmu, kernel_pmap, moea64_upvo_zone, - &moea64_pvo_kunmanaged, va, VM_PAGE_TO_PHYS(m), LPTE_M, - PVO_WIRED | PVO_BOOTSTRAP); + NULL, va, VM_PAGE_TO_PHYS(m), LPTE_M, PVO_WIRED | PVO_BOOTSTRAP); if (needed_lock) PMAP_UNLOCK(kernel_pmap); @@ -1510,12 +1472,10 @@ moea64_is_prefaultable(mmu_t mmu, pmap_t pmap, vm_offset_t va) struct pvo_entry *pvo; boolean_t rv; - LOCK_TABLE_RD(); PMAP_LOCK(pmap); pvo = moea64_pvo_find_va(pmap, va & ~ADDR_POFF); rv = pvo == NULL || (pvo->pvo_pte.lpte.pte_hi & LPTE_VALID) == 0; PMAP_UNLOCK(pmap); - UNLOCK_TABLE_RD(); return (rv); } @@ -1610,7 +1570,7 @@ moea64_remove_write(mmu_t mmu, vm_page_t m) * should be tested and standardized at some point in the future for * optimal aging of shared pages. */ -boolean_t +int moea64_ts_referenced(mmu_t mmu, vm_page_t m) { @@ -1671,7 +1631,7 @@ moea64_kenter_attr(mmu_t mmu, vm_offset_t va, vm_offset_t pa, vm_memattr_t ma) LOCK_TABLE_WR(); PMAP_LOCK(kernel_pmap); error = moea64_pvo_enter(mmu, kernel_pmap, moea64_upvo_zone, - &moea64_pvo_kunmanaged, va, pa, pte_lo, PVO_WIRED); + NULL, va, pa, pte_lo, PVO_WIRED); PMAP_UNLOCK(kernel_pmap); UNLOCK_TABLE_WR(); @@ -1681,7 +1641,7 @@ moea64_kenter_attr(mmu_t mmu, vm_offset_t va, vm_offset_t pa, vm_memattr_t ma) } void -moea64_kenter(mmu_t mmu, vm_offset_t va, vm_offset_t pa) +moea64_kenter(mmu_t mmu, vm_offset_t va, vm_paddr_t pa) { moea64_kenter_attr(mmu, va, pa, VM_MEMATTR_DEFAULT); @@ -1691,7 +1651,7 @@ moea64_kenter(mmu_t mmu, vm_offset_t va, vm_offset_t pa) * Extract the physical page address associated with the given kernel virtual * address. */ -vm_offset_t +vm_paddr_t moea64_kextract(mmu_t mmu, vm_offset_t va) { struct pvo_entry *pvo; @@ -1704,13 +1664,11 @@ moea64_kextract(mmu_t mmu, vm_offset_t va) if (va < VM_MIN_KERNEL_ADDRESS) return (va); - LOCK_TABLE_RD(); PMAP_LOCK(kernel_pmap); pvo = moea64_pvo_find_va(kernel_pmap, va); KASSERT(pvo != NULL, ("moea64_kextract: no addr found for %#" PRIxPTR, va)); pa = (pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN) | (va - PVO_VADDR(pvo)); - UNLOCK_TABLE_RD(); PMAP_UNLOCK(kernel_pmap); return (pa); } @@ -1734,8 +1692,8 @@ moea64_kremove(mmu_t mmu, vm_offset_t va) * first usable address after the mapped region. */ vm_offset_t -moea64_map(mmu_t mmu, vm_offset_t *virt, vm_offset_t pa_start, - vm_offset_t pa_end, int prot) +moea64_map(mmu_t mmu, vm_offset_t *virt, vm_paddr_t pa_start, + vm_paddr_t pa_end, int prot) { vm_offset_t sva, va; @@ -1857,7 +1815,7 @@ void moea64_pinit(mmu_t mmu, pmap_t pmap) { PMAP_LOCK_INIT(pmap); - LIST_INIT(&pmap->pmap_pvo); + RB_INIT(&pmap->pmap_pvo); pmap->pm_slb_tree_root = slb_alloc_tree(); pmap->pm_slb = slb_alloc_user_cache(); @@ -1871,7 +1829,7 @@ moea64_pinit(mmu_t mmu, pmap_t pmap) uint32_t hash; PMAP_LOCK_INIT(pmap); - LIST_INIT(&pmap->pmap_pvo); + RB_INIT(&pmap->pmap_pvo); if (pmap_bootstrapped) pmap->pmap_phys = (pmap_t)moea64_kextract(mmu, @@ -1967,7 +1925,7 @@ void moea64_protect(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) { - struct pvo_entry *pvo, *tpvo; + struct pvo_entry *pvo, *tpvo, key; CTR4(KTR_PMAP, "moea64_protect: pm=%p sva=%#x eva=%#x prot=%#x", pm, sva, eva, prot); @@ -1982,26 +1940,11 @@ moea64_protect(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva, LOCK_TABLE_RD(); PMAP_LOCK(pm); - if ((eva - sva)/PAGE_SIZE < pm->pm_stats.resident_count) { - while (sva < eva) { - #ifdef __powerpc64__ - if (pm != kernel_pmap && - user_va_to_slb_entry(pm, sva) == NULL) { - sva = roundup2(sva + 1, SEGMENT_LENGTH); - continue; - } - #endif - pvo = moea64_pvo_find_va(pm, sva); - if (pvo != NULL) - moea64_pvo_protect(mmu, pm, pvo, prot); - sva += PAGE_SIZE; - } - } else { - LIST_FOREACH_SAFE(pvo, &pm->pmap_pvo, pvo_plink, tpvo) { - if (PVO_VADDR(pvo) < sva || PVO_VADDR(pvo) >= eva) - continue; - moea64_pvo_protect(mmu, pm, pvo, prot); - } + key.pvo_vaddr = sva; + for (pvo = RB_NFIND(pvo_tree, &pm->pmap_pvo, &key); + pvo != NULL && PVO_VADDR(pvo) < eva; pvo = tpvo) { + tpvo = RB_NEXT(pvo_tree, &pm->pmap_pvo, pvo); + moea64_pvo_protect(mmu, pm, pvo, prot); } UNLOCK_TABLE_RD(); PMAP_UNLOCK(pm); @@ -2080,7 +2023,7 @@ moea64_remove_pages(mmu_t mmu, pmap_t pm) LOCK_TABLE_WR(); PMAP_LOCK(pm); - LIST_FOREACH_SAFE(pvo, &pm->pmap_pvo, pvo_plink, tpvo) { + RB_FOREACH_SAFE(pvo, pvo_tree, &pm->pmap_pvo, tpvo) { if (!(pvo->pvo_vaddr & PVO_WIRED)) moea64_pvo_remove(mmu, pvo); } @@ -2094,7 +2037,7 @@ moea64_remove_pages(mmu_t mmu, pmap_t pm) void moea64_remove(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva) { - struct pvo_entry *pvo, *tpvo; + struct pvo_entry *pvo, *tpvo, key; /* * Perform an unsynchronized read. This is, however, safe. @@ -2104,26 +2047,11 @@ moea64_remove(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva) LOCK_TABLE_WR(); PMAP_LOCK(pm); - if ((eva - sva)/PAGE_SIZE < pm->pm_stats.resident_count) { - while (sva < eva) { - #ifdef __powerpc64__ - if (pm != kernel_pmap && - user_va_to_slb_entry(pm, sva) == NULL) { - sva = roundup2(sva + 1, SEGMENT_LENGTH); - continue; - } - #endif - pvo = moea64_pvo_find_va(pm, sva); - if (pvo != NULL) - moea64_pvo_remove(mmu, pvo); - sva += PAGE_SIZE; - } - } else { - LIST_FOREACH_SAFE(pvo, &pm->pmap_pvo, pvo_plink, tpvo) { - if (PVO_VADDR(pvo) < sva || PVO_VADDR(pvo) >= eva) - continue; - moea64_pvo_remove(mmu, pvo); - } + key.pvo_vaddr = sva; + for (pvo = RB_NFIND(pvo_tree, &pm->pmap_pvo, &key); + pvo != NULL && PVO_VADDR(pvo) < eva; pvo = tpvo) { + tpvo = RB_NEXT(pvo_tree, &pm->pmap_pvo, pvo); + moea64_pvo_remove(mmu, pvo); } UNLOCK_TABLE_WR(); PMAP_UNLOCK(pm); @@ -2275,12 +2203,6 @@ moea64_pvo_enter(mmu_t mmu, pmap_t pm, uma_zone_t zone, moea64_bpvo_pool_index++; bootstrap = 1; } else { - /* - * Note: drop the table lock around the UMA allocation in - * case the UMA allocator needs to manipulate the page - * table. The mapping we are working with is already - * protected by the PMAP lock. - */ pvo = uma_zalloc(zone, M_NOWAIT); } @@ -2297,7 +2219,7 @@ moea64_pvo_enter(mmu_t mmu, pmap_t pm, uma_zone_t zone, if (flags & PVO_WIRED) pvo->pvo_vaddr |= PVO_WIRED; - if (pvo_head != &moea64_pvo_kunmanaged) + if (pvo_head != NULL) pvo->pvo_vaddr |= PVO_MANAGED; if (bootstrap) pvo->pvo_vaddr |= PVO_BOOTSTRAP; @@ -2310,15 +2232,17 @@ moea64_pvo_enter(mmu_t mmu, pmap_t pm, uma_zone_t zone, /* * Add to pmap list */ - LIST_INSERT_HEAD(&pm->pmap_pvo, pvo, pvo_plink); + RB_INSERT(pvo_tree, &pm->pmap_pvo, pvo); /* * Remember if the list was empty and therefore will be the first * item. */ - if (LIST_FIRST(pvo_head) == NULL) - first = 1; - LIST_INSERT_HEAD(pvo_head, pvo, pvo_vlink); + if (pvo_head != NULL) { + if (LIST_FIRST(pvo_head) == NULL) + first = 1; + LIST_INSERT_HEAD(pvo_head, pvo, pvo_vlink); + } if (pvo->pvo_vaddr & PVO_WIRED) { pvo->pvo_pte.lpte.pte_hi |= LPTE_WIRED; @@ -2381,10 +2305,9 @@ moea64_pvo_remove(mmu_t mmu, struct pvo_entry *pvo) pvo->pvo_pmap->pm_stats.wired_count--; /* - * Remove this PVO from the PV and pmap lists. + * Remove this PVO from the pmap list. */ - LIST_REMOVE(pvo, pvo_vlink); - LIST_REMOVE(pvo, pvo_plink); + RB_REMOVE(pvo_tree, &pvo->pvo_pmap->pmap_pvo, pvo); /* * Remove this from the overflow list and return it to the pool @@ -2398,6 +2321,7 @@ moea64_pvo_remove(mmu_t mmu, struct pvo_entry *pvo) pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN); if ((pvo->pvo_vaddr & PVO_MANAGED) == PVO_MANAGED && pg != NULL) { + LIST_REMOVE(pvo, pvo_vlink); if ((pvo->pvo_pte.lpte.pte_lo & LPTE_PP) != LPTE_BR) { if (pvo->pvo_pte.lpte.pte_lo & LPTE_CHG) vm_page_dirty(pg); @@ -2421,41 +2345,10 @@ moea64_pvo_remove(mmu_t mmu, struct pvo_entry *pvo) static struct pvo_entry * moea64_pvo_find_va(pmap_t pm, vm_offset_t va) { - struct pvo_entry *pvo; - int ptegidx; - uint64_t vsid; - #ifdef __powerpc64__ - uint64_t slbv; + struct pvo_entry key; - if (pm == kernel_pmap) { - slbv = kernel_va_to_slbv(va); - } else { - struct slb *slb; - slb = user_va_to_slb_entry(pm, va); - /* The page is not mapped if the segment isn't */ - if (slb == NULL) - return NULL; - slbv = slb->slbv; - } - - vsid = (slbv & SLBV_VSID_MASK) >> SLBV_VSID_SHIFT; - if (slbv & SLBV_L) - va &= ~moea64_large_page_mask; - else - va &= ~ADDR_POFF; - ptegidx = va_to_pteg(vsid, va, slbv & SLBV_L); - #else - va &= ~ADDR_POFF; - vsid = va_to_vsid(pm, va); - ptegidx = va_to_pteg(vsid, va, 0); - #endif - - LIST_FOREACH(pvo, &moea64_pvo_table[ptegidx], pvo_olink) { - if (pvo->pvo_pmap == pm && PVO_VADDR(pvo) == va) - break; - } - - return (pvo); + key.pvo_vaddr = va & ~ADDR_POFF; + return (RB_FIND(pvo_tree, &pm->pmap_pvo, &key)); } static boolean_t @@ -2547,23 +2440,23 @@ moea64_clear_bit(mmu_t mmu, vm_page_t m, u_int64_t ptebit) } boolean_t -moea64_dev_direct_mapped(mmu_t mmu, vm_offset_t pa, vm_size_t size) +moea64_dev_direct_mapped(mmu_t mmu, vm_paddr_t pa, vm_size_t size) { - struct pvo_entry *pvo; + struct pvo_entry *pvo, key; vm_offset_t ppa; int error = 0; - LOCK_TABLE_RD(); PMAP_LOCK(kernel_pmap); - for (ppa = pa & ~ADDR_POFF; ppa < pa + size; ppa += PAGE_SIZE) { - pvo = moea64_pvo_find_va(kernel_pmap, ppa); + key.pvo_vaddr = ppa = pa & ~ADDR_POFF; + for (pvo = RB_FIND(pvo_tree, &kernel_pmap->pmap_pvo, &key); + ppa < pa + size; ppa += PAGE_SIZE, + pvo = RB_NEXT(pvo_tree, &kernel_pmap->pmap_pvo, pvo)) { if (pvo == NULL || (pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN) != ppa) { error = EFAULT; break; } } - UNLOCK_TABLE_RD(); PMAP_UNLOCK(kernel_pmap); return (error); @@ -2600,7 +2493,7 @@ moea64_mapdev_attr(mmu_t mmu, vm_offset_t pa, vm_size_t size, vm_memattr_t ma) } void * -moea64_mapdev(mmu_t mmu, vm_offset_t pa, vm_size_t size) +moea64_mapdev(mmu_t mmu, vm_paddr_t pa, vm_size_t size) { return moea64_mapdev_attr(mmu, pa, size, VM_MEMATTR_DEFAULT); @@ -2626,7 +2519,6 @@ moea64_sync_icache(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_size_t sz) vm_paddr_t pa; vm_size_t len; - LOCK_TABLE_RD(); PMAP_LOCK(pm); while (sz > 0) { lim = round_page(va); @@ -2640,6 +2532,5 @@ moea64_sync_icache(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_size_t sz) va += len; sz -= len; } - UNLOCK_TABLE_RD(); PMAP_UNLOCK(pm); } diff --git a/sys/powerpc/aim/moea64_native.c b/sys/powerpc/aim/moea64_native.c index 93187ca60a6..3da2f5ad3f9 100644 --- a/sys/powerpc/aim/moea64_native.c +++ b/sys/powerpc/aim/moea64_native.c @@ -133,36 +133,31 @@ __FBSDID("$FreeBSD$"); #define VSID_HASH_MASK 0x0000007fffffffffULL -/* - * The tlbie instruction must be executed in 64-bit mode - * so we have to twiddle MSR[SF] around every invocation. - * Just to add to the fun, exceptions must be off as well - * so that we can't trap in 64-bit mode. What a pain. - */ -static struct mtx tlbie_mutex; - static __inline void TLBIE(uint64_t vpn) { #ifndef __powerpc64__ register_t vpn_hi, vpn_lo; register_t msr; - register_t scratch; + register_t scratch, intr; #endif + static volatile u_int tlbie_lock = 0; + vpn <<= ADDR_PIDX_SHFT; vpn &= ~(0xffffULL << 48); + /* Hobo spinlock: we need stronger guarantees than mutexes provide */ + while (!atomic_cmpset_int(&tlbie_lock, 0, 1)); + isync(); /* Flush instruction queue once lock acquired */ + #ifdef __powerpc64__ - mtx_lock(&tlbie_mutex); __asm __volatile("tlbie %0" :: "r"(vpn) : "memory"); - mtx_unlock(&tlbie_mutex); - __asm __volatile("eieio; tlbsync; ptesync"); + __asm __volatile("eieio; tlbsync; ptesync" ::: "memory"); #else vpn_hi = (uint32_t)(vpn >> 32); vpn_lo = (uint32_t)vpn; - /* Note: spin mutex is to disable exceptions while fiddling MSR */ - mtx_lock_spin(&tlbie_mutex); + intr = intr_disable(); __asm __volatile("\ mfmsr %0; \ mr %1, %0; \ @@ -179,8 +174,11 @@ TLBIE(uint64_t vpn) { ptesync;" : "=r"(msr), "=r"(scratch) : "r"(vpn_hi), "r"(vpn_lo), "r"(32), "r"(1) : "memory"); - mtx_unlock_spin(&tlbie_mutex); + intr_restore(intr); #endif + + /* No barriers or special ops -- taken care of by ptesync above */ + tlbie_lock = 0; } #define DISABLE_TRANS(msr) msr = mfmsr(); mtmsr(msr & ~PSL_DR) @@ -261,9 +259,9 @@ moea64_pte_clear_native(mmu_t mmu, uintptr_t pt_cookie, struct lpte *pvo_pt, * As shown in Section 7.6.3.2.3 */ pt->pte_lo &= ~ptebit; - sched_pin(); + critical_enter(); TLBIE(vpn); - sched_unpin(); + critical_exit(); } static void @@ -297,12 +295,12 @@ moea64_pte_unset_native(mmu_t mmu, uintptr_t pt_cookie, struct lpte *pvo_pt, * Invalidate the pte. */ isync(); - sched_pin(); + critical_enter(); pvo_pt->pte_hi &= ~LPTE_VALID; pt->pte_hi &= ~LPTE_VALID; PTESYNC(); TLBIE(vpn); - sched_unpin(); + critical_exit(); /* * Save the reg & chg bits. @@ -405,15 +403,6 @@ moea64_bootstrap_native(mmu_t mmup, vm_offset_t kernelstart, CTR1(KTR_PMAP, "moea64_bootstrap: PTEG table at %p", moea64_pteg_table); - /* - * Initialize the TLBIE lock. TLBIE can only be executed by one CPU. - */ -#ifdef __powerpc64__ - mtx_init(&tlbie_mutex, "tlbie", NULL, MTX_DEF); -#else - mtx_init(&tlbie_mutex, "tlbie", NULL, MTX_SPIN); -#endif - moea64_mid_bootstrap(mmup, kernelstart, kernelend); /* diff --git a/sys/powerpc/aim/slb.c b/sys/powerpc/aim/slb.c index 7f4b2ef8cd8..162c7fb4198 100644 --- a/sys/powerpc/aim/slb.c +++ b/sys/powerpc/aim/slb.c @@ -139,7 +139,7 @@ make_new_leaf(uint64_t esid, uint64_t slbv, struct slbtnode *parent) * that a lockless searcher always sees a valid path through * the tree. */ - powerpc_sync(); + mb(); idx = esid2idx(esid, parent->ua_level); parent->u.ua_child[idx] = child; @@ -187,7 +187,7 @@ make_intermediate(uint64_t esid, struct slbtnode *parent) idx = esid2idx(child->ua_base, inter->ua_level); inter->u.ua_child[idx] = child; setbit(&inter->ua_alloc, idx); - powerpc_sync(); + mb(); /* Set up parent to point to intermediate node ... */ idx = esid2idx(inter->ua_base, parent->ua_level); diff --git a/sys/powerpc/aim/swtch32.S b/sys/powerpc/aim/swtch32.S index 76bb0f40435..fa87aba63c3 100644 --- a/sys/powerpc/aim/swtch32.S +++ b/sys/powerpc/aim/swtch32.S @@ -124,7 +124,8 @@ cpu_switchin: blocked_loop: lwz %r7,TD_LOCK(%r2) cmpw %r6,%r7 - beq blocked_loop + beq- blocked_loop + isync #endif mfsprg %r7,0 /* Get the pcpu pointer */ diff --git a/sys/powerpc/aim/swtch64.S b/sys/powerpc/aim/swtch64.S index 857ae40b177..ab6f5327895 100644 --- a/sys/powerpc/aim/swtch64.S +++ b/sys/powerpc/aim/swtch64.S @@ -150,7 +150,8 @@ cpu_switchin: blocked_loop: ld %r7,TD_LOCK(%r13) cmpd %r6,%r7 - beq blocked_loop + beq- blocked_loop + isync #endif mfsprg %r7,0 /* Get the pcpu pointer */ diff --git a/sys/powerpc/booke/locore.S b/sys/powerpc/booke/locore.S index 293eec34bdd..16a919629af 100644 --- a/sys/powerpc/booke/locore.S +++ b/sys/powerpc/booke/locore.S @@ -218,7 +218,7 @@ done_mapping: mr %r3, %r30 mr %r4, %r31 - /* Prepare e500 core */ + /* Prepare core */ bl booke_init /* Switch to thread0.td_kstack now */ @@ -242,14 +242,20 @@ done_mapping: __boot_page: bl 1f - .globl kernload_ap -kernload_ap: + .globl bp_trace +bp_trace: + .long 0 + + .globl bp_kernload +bp_kernload: .long 0 /* * Initial configuration */ 1: + mflr %r31 /* r31 hold the address of bp_trace */ + /* Set HIDs */ lis %r3, HID0_E500_DEFAULT_SET@h ori %r3, %r3, HID0_E500_DEFAULT_SET@l @@ -318,15 +324,15 @@ kernload_ap: mtspr SPR_MAS2, %r3 isync - /* Retrieve kernel load [physical] address from kernload_ap */ + /* Retrieve kernel load [physical] address from bp_kernload */ bl 4f 4: mflr %r3 rlwinm %r3, %r3, 0, 0, 19 - lis %r4, kernload_ap@h - ori %r4, %r4, kernload_ap@l + lis %r4, bp_kernload@h + ori %r4, %r4, bp_kernload@l lis %r5, __boot_page@h ori %r5, %r5, __boot_page@l - sub %r4, %r4, %r5 /* offset of kernload_ap within __boot_page */ + sub %r4, %r4, %r5 /* offset of bp_kernload within __boot_page */ lwzx %r3, %r4, %r3 /* Set RPN and protection */ diff --git a/sys/powerpc/booke/machdep.c b/sys/powerpc/booke/machdep.c index 82a37e14100..ad49831047c 100644 --- a/sys/powerpc/booke/machdep.c +++ b/sys/powerpc/booke/machdep.c @@ -1,5 +1,5 @@ /*- - * Copyright (C) 2006 Semihalf, Marian Balakowicz + * Copyright (C) 2006-2012 Semihalf * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -129,6 +129,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -138,8 +139,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include - #ifdef DDB extern vm_offset_t ksym_start, ksym_end; #endif @@ -158,11 +157,6 @@ extern unsigned char __sbss_start[]; extern unsigned char __sbss_end[]; extern unsigned char _end[]; -extern void dcache_enable(void); -extern void dcache_inval(void); -extern void icache_enable(void); -extern void icache_inval(void); - /* * Bootinfo is passed to us by legacy loaders. Save the address of the * structure to handle backward compatibility. @@ -185,8 +179,8 @@ SYSCTL_INT(_machdep, CPU_CACHELINE, cacheline_size, int hw_direct_map = 0; -static void cpu_e500_startup(void *); -SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_e500_startup, NULL); +static void cpu_booke_startup(void *); +SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_booke_startup, NULL); void print_kernel_section_addr(void); void print_kenv(void); @@ -195,7 +189,7 @@ u_int booke_init(uint32_t, uint32_t); extern int elf32_nxstack; static void -cpu_e500_startup(void *dummy) +cpu_booke_startup(void *dummy) { int indx, size; @@ -286,7 +280,6 @@ booke_init(uint32_t arg1, uint32_t arg2) struct pcpu *pc; void *kmdp, *mdp; vm_offset_t dtbp, end; - uint32_t csr; kmdp = NULL; @@ -359,9 +352,9 @@ booke_init(uint32_t arg1, uint32_t arg2) while (1); OF_interpret("perform-fixup", 0); - - /* Initialize TLB1 handling */ - tlb1_init(fdt_immr_pa); + + /* Set up TLB initially */ + booke_init_tlb(fdt_immr_pa); /* Reset Time Base */ mttb(0); @@ -392,20 +385,20 @@ booke_init(uint32_t arg1, uint32_t arg2) debugf(" boothowto = 0x%08x\n", boothowto); debugf(" kernel ccsrbar = 0x%08x\n", CCSRBAR_VA); debugf(" MSR = 0x%08x\n", mfmsr()); +#if defined(BOOKE_E500) debugf(" HID0 = 0x%08x\n", mfspr(SPR_HID0)); debugf(" HID1 = 0x%08x\n", mfspr(SPR_HID1)); debugf(" BUCSR = 0x%08x\n", mfspr(SPR_BUCSR)); - - __asm __volatile("msync; isync"); - csr = ccsr_read4(OCP85XX_L2CTL); - debugf(" L2CTL = 0x%08x\n", csr); +#endif debugf(" dtbp = 0x%08x\n", (uint32_t)dtbp); print_kernel_section_addr(); print_kenv(); +#if defined(BOOKE_E500) //tlb1_print_entries(); //tlb1_print_tlbentries(); +#endif kdb_init(); @@ -421,8 +414,10 @@ booke_init(uint32_t arg1, uint32_t arg2) pmap_mmu_install(MMU_TYPE_BOOKE, 0); pmap_bootstrap((uintptr_t)kernel_text, end); debugf("MSR = 0x%08x\n", mfmsr()); +#if defined(BOOKE_E500) //tlb1_print_entries(); //tlb1_print_tlbentries(); +#endif /* Initialize params/tunables that are derived from memsize. */ init_param2(physmem); @@ -441,29 +436,8 @@ booke_init(uint32_t arg1, uint32_t arg2) mtmsr(mfmsr() | PSL_ME); isync(); - /* Enable D-cache if applicable */ - csr = mfspr(SPR_L1CSR0); - if ((csr & L1CSR0_DCE) == 0) { - dcache_inval(); - dcache_enable(); - } - - csr = mfspr(SPR_L1CSR0); - if ((boothowto & RB_VERBOSE) != 0 || (csr & L1CSR0_DCE) == 0) - printf("L1 D-cache %sabled\n", - (csr & L1CSR0_DCE) ? "en" : "dis"); - - /* Enable L1 I-cache if applicable. */ - csr = mfspr(SPR_L1CSR1); - if ((csr & L1CSR1_ICE) == 0) { - icache_inval(); - icache_enable(); - } - - csr = mfspr(SPR_L1CSR1); - if ((boothowto & RB_VERBOSE) != 0 || (csr & L1CSR1_ICE) == 0) - printf("L1 I-cache %sabled\n", - (csr & L1CSR1_ICE) ? "en" : "dis"); + /* Enable L1 caches */ + booke_enable_l1_cache(); debugf("%s: SP = 0x%08x\n", __func__, ((uintptr_t)thread0.td_pcb - 16) & ~15); @@ -499,7 +473,24 @@ cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t sz) void cpu_flush_dcache(void *ptr, size_t len) { - /* TBD */ + register_t addr, off; + + /* + * Align the address to a cacheline and adjust the length + * accordingly. Then round the length to a multiple of the + * cacheline for easy looping. + */ + addr = (uintptr_t)ptr; + off = addr & (cacheline_size - 1); + addr -= off; + len = (len + off + cacheline_size - 1) & ~(cacheline_size - 1); + + while (len > 0) { + __asm __volatile ("dcbf 0,%0" :: "r"(addr)); + __asm __volatile ("sync"); + addr += cacheline_size; + len -= cacheline_size; + } } void @@ -538,7 +529,8 @@ cpu_halt(void) { mtmsr(mfmsr() & ~(PSL_CE | PSL_EE | PSL_ME | PSL_DE)); - while (1); + while (1) + ; } int diff --git a/sys/powerpc/booke/machdep_e500.c b/sys/powerpc/booke/machdep_e500.c new file mode 100644 index 00000000000..85805a278a6 --- /dev/null +++ b/sys/powerpc/booke/machdep_e500.c @@ -0,0 +1,158 @@ +/*- + * Copyright (c) 2011-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include + +#include + +#include + +extern void dcache_enable(void); +extern void dcache_inval(void); +extern void icache_enable(void); +extern void icache_inval(void); +extern void l2cache_enable(void); +extern void l2cache_inval(void); + +void +booke_init_tlb(vm_paddr_t fdt_immr_pa) +{ + + /* Initialize TLB1 handling */ + tlb1_init(fdt_immr_pa); +} + +void +booke_enable_l1_cache(void) +{ + uint32_t csr; + + /* Enable D-cache if applicable */ + csr = mfspr(SPR_L1CSR0); + if ((csr & L1CSR0_DCE) == 0) { + dcache_inval(); + dcache_enable(); + } + + csr = mfspr(SPR_L1CSR0); + if ((boothowto & RB_VERBOSE) != 0 || (csr & L1CSR0_DCE) == 0) + printf("L1 D-cache %sabled\n", + (csr & L1CSR0_DCE) ? "en" : "dis"); + + /* Enable L1 I-cache if applicable. */ + csr = mfspr(SPR_L1CSR1); + if ((csr & L1CSR1_ICE) == 0) { + icache_inval(); + icache_enable(); + } + + csr = mfspr(SPR_L1CSR1); + if ((boothowto & RB_VERBOSE) != 0 || (csr & L1CSR1_ICE) == 0) + printf("L1 I-cache %sabled\n", + (csr & L1CSR1_ICE) ? "en" : "dis"); +} + +#if 0 +void +booke_enable_l2_cache(void) +{ + uint32_t csr; + + /* Enable L2 cache on E500mc */ + if ((((mfpvr() >> 16) & 0xFFFF) == FSL_E500mc) || + (((mfpvr() >> 16) & 0xFFFF) == FSL_E5500)) { + csr = mfspr(SPR_L2CSR0); + if ((csr & L2CSR0_L2E) == 0) { + l2cache_inval(); + l2cache_enable(); + } + + csr = mfspr(SPR_L2CSR0); + if ((boothowto & RB_VERBOSE) != 0 || (csr & L2CSR0_L2E) == 0) + printf("L2 cache %sabled\n", + (csr & L2CSR0_L2E) ? "en" : "dis"); + } +} + +void +booke_enable_l3_cache(void) +{ + uint32_t csr, size, ver; + + /* Enable L3 CoreNet Platform Cache (CPC) */ + ver = SVR_VER(mfspr(SPR_SVR)); + if (ver == SVR_P2041 || ver == SVR_P2041E || ver == SVR_P3041 || + ver == SVR_P3041E || ver == SVR_P5020 || ver == SVR_P5020E) { + csr = ccsr_read4(OCP85XX_CPC_CSR0); + if ((csr & OCP85XX_CPC_CSR0_CE) == 0) { + l3cache_inval(); + l3cache_enable(); + } + + csr = ccsr_read4(OCP85XX_CPC_CSR0); + if ((boothowto & RB_VERBOSE) != 0 || + (csr & OCP85XX_CPC_CSR0_CE) == 0) { + size = OCP85XX_CPC_CFG0_SZ_K(ccsr_read4(OCP85XX_CPC_CFG0)); + printf("L3 Corenet Platform Cache: %d KB %sabled\n", + size, (csr & OCP85XX_CPC_CSR0_CE) == 0 ? + "dis" : "en"); + } + } +} + +void +booke_disable_l2_cache(void) +{ +} + +static void +l3cache_inval(void) +{ + + /* Flash invalidate the CPC and clear all the locks */ + ccsr_write4(OCP85XX_CPC_CSR0, OCP85XX_CPC_CSR0_FI | + OCP85XX_CPC_CSR0_LFC); + while (ccsr_read4(OCP85XX_CPC_CSR0) & (OCP85XX_CPC_CSR0_FI | + OCP85XX_CPC_CSR0_LFC)) + ; +} + +static void +l3cache_enable(void) +{ + + ccsr_write4(OCP85XX_CPC_CSR0, OCP85XX_CPC_CSR0_CE | + OCP85XX_CPC_CSR0_PE); + /* Read back to sync write */ + ccsr_read4(OCP85XX_CPC_CSR0); +} +#endif diff --git a/sys/powerpc/booke/machdep_ppc4xx.c b/sys/powerpc/booke/machdep_ppc4xx.c new file mode 100644 index 00000000000..69a1e2e7a97 --- /dev/null +++ b/sys/powerpc/booke/machdep_ppc4xx.c @@ -0,0 +1,219 @@ +/*- + * Copyright (c) 2011-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include + +#include +#include + +#include + +#define OCP_ADDR_WORDLO(addr) ((uint32_t)((uint64_t)(addr) & 0xFFFFFFFF)) +#define OCP_ADDR_WORDHI(addr) ((uint32_t)((uint64_t)(addr) >> 32)) + +extern void tlb_write(u_int, uint32_t, uint32_t, uint32_t, tlbtid_t, uint32_t, + uint32_t); +extern void tlb_read(u_int, uint32_t *, uint32_t *, uint32_t *, uint32_t *, + uint32_t *, uint32_t *); + +unsigned int tlb_static_entries; +unsigned int tlb_current_entry = TLB_SIZE; +unsigned int tlb_misses = 0; +unsigned int tlb_invals = 0; + +void tlb_map(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t); +void tlb_map_mem(uint32_t, uint32_t, uint32_t); +void tlb_dump(void); + +void +booke_init_tlb(vm_paddr_t fdt_immr_pa) +{ + + /* Map register space */ + tlb_map(APM86XXX_DEEP_SLEEP_VA, + OCP_ADDR_WORDLO(APM86XXX_DEEP_SLEEP_PA), + OCP_ADDR_WORDHI(APM86XXX_DEEP_SLEEP_PA), TLB_VALID | TLB_SIZE_16M, + TLB_SW | TLB_SR | TLB_I | TLB_G); + + tlb_map(APM86XXX_CSR_VA, OCP_ADDR_WORDLO(APM86XXX_CSR_PA), + OCP_ADDR_WORDHI(APM86XXX_CSR_PA), TLB_VALID | TLB_SIZE_16M, + TLB_SW | TLB_SR | TLB_I | TLB_G); + + tlb_map(APM86XXX_PRIMARY_FABRIC_VA, + OCP_ADDR_WORDLO(APM86XXX_PRIMARY_FABRIC_PA), + OCP_ADDR_WORDHI(APM86XXX_PRIMARY_FABRIC_PA), + TLB_VALID | TLB_SIZE_16M, + TLB_SW | TLB_SR | TLB_I | TLB_G); + + tlb_map(APM86XXX_AHB_VA, OCP_ADDR_WORDLO(APM86XXX_AHB_PA), + OCP_ADDR_WORDHI(APM86XXX_AHB_PA), + TLB_VALID | TLB_SIZE_16M, + TLB_SW | TLB_SR | TLB_I | TLB_G); + + /* Map MailBox space */ + tlb_map(APM86XXX_MBOX_VA, OCP_ADDR_WORDLO(APM86XXX_MBOX_PA), + OCP_ADDR_WORDHI(APM86XXX_MBOX_PA), + TLB_VALID | TLB_SIZE_4K, + TLB_UX | TLB_UW | TLB_UR | + TLB_SX | TLB_SW | TLB_SR | + TLB_I | TLB_G); + + tlb_map(APM86XXX_MBOX_VA + 0x1000, + OCP_ADDR_WORDLO(APM86XXX_MBOX_PA) + 0x1000, + OCP_ADDR_WORDHI(APM86XXX_MBOX_PA), + TLB_VALID | TLB_SIZE_4K, + TLB_UX | TLB_UW | TLB_UR | + TLB_SX | TLB_SW | TLB_SR | + TLB_I | TLB_G); + + tlb_map(APM86XXX_MBOX_VA + 0x2000, + OCP_ADDR_WORDLO(APM86XXX_MBOX_PA)+ 0x2000, + OCP_ADDR_WORDHI(APM86XXX_MBOX_PA), + TLB_VALID | TLB_SIZE_4K, + TLB_UX | TLB_UW | TLB_UR | + TLB_SX | TLB_SW | TLB_SR | + TLB_I | TLB_G); +} + +void +booke_enable_l1_cache(void) +{ +} + +void +booke_enable_l2_cache(void) +{ +} + +void +booke_enable_l3_cache(void) +{ +} + +void +booke_disable_l2_cache(void) +{ + uint32_t ccr1,l2cr0; + + /* Disable L2 cache op broadcast */ + ccr1 = mfspr(SPR_CCR1); + ccr1 &= ~CCR1_L2COBE; + mtspr(SPR_CCR1, ccr1); + + /* Set L2 array size to 0 i.e. disable L2 cache */ + mtdcr(DCR_L2DCDCRAI, DCR_L2CR0); + l2cr0 = mfdcr(DCR_L2DCDCRDI); + l2cr0 &= ~L2CR0_AS; + mtdcr(DCR_L2DCDCRDI, l2cr0); +} + +void tlb_map(uint32_t epn, uint32_t rpn, uint32_t erpn, uint32_t flags, + uint32_t perms) +{ + + tlb_write(++tlb_static_entries, epn, rpn, erpn, 0, flags, perms); +} + +static void tlb_dump_entry(u_int entry) +{ + uint32_t epn, rpn, erpn, tid, flags, perms; + const char *size; + + tlb_read(entry, &epn, &rpn, &erpn, &tid, &flags, &perms); + + switch (flags & TLB_SIZE_MASK) { + case TLB_SIZE_1K: + size = " 1k"; + break; + case TLB_SIZE_4K: + size = " 4k"; + break; + case TLB_SIZE_16K: + size = " 16k"; + break; + case TLB_SIZE_256K: + size = "256k"; + break; + case TLB_SIZE_1M: + size = " 1M"; + break; + case TLB_SIZE_16M: + size = " 16M"; + break; + case TLB_SIZE_256M: + size = "256M"; + break; + case TLB_SIZE_1G: + size = " 1G"; + break; + default: + size = "????"; + break; + } + + + printf("TLB[%02u]: 0x%08X => " + "0x%01X_%08X %s %c %c %s %s %s %s %s " + "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c (%u)\n", + entry, epn, erpn, rpn, size, + (flags & TLB_TS) ? '1' : '0', + (flags & TLB_VALID) ? 'V' : '.', + (perms & TLB_WL1) ? "WL1" : "___", + (perms & TLB_IL1I) ? "IL1I" : "____", + (perms & TLB_IL1D) ? "IL1D" : "____", + (perms & TLB_IL2I) ? "IL2I" : "____", + (perms & TLB_IL2D) ? "IL2D" : "____", + (perms & TLB_U0) ? '1' : '.', + (perms & TLB_U1) ? '2' : '.', + (perms & TLB_U2) ? '3' : '.', + (perms & TLB_U3) ? '4' : '.', + (perms & TLB_W) ? 'W' : '.', + (perms & TLB_I) ? 'I' : '.', + (perms & TLB_M) ? 'M' : '.', + (perms & TLB_G) ? 'G' : '.', + (perms & TLB_E) ? 'E' : '.', + (perms & TLB_UX) ? 'x' : '.', + (perms & TLB_UW) ? 'w' : '.', + (perms & TLB_UR) ? 'r' : '.', + (perms & TLB_SX) ? 'X' : '.', + (perms & TLB_SW) ? 'W' : '.', + (perms & TLB_SR) ? 'R' : '.', + tid); +} + +void tlb_dump(void) +{ + int i; + + for (i = 0; i < TLB_SIZE; i++) + tlb_dump_entry(i); +} diff --git a/sys/powerpc/booke/platform_bare.c b/sys/powerpc/booke/platform_bare.c index f04bf9656bd..ebc5e1188f8 100644 --- a/sys/powerpc/booke/platform_bare.c +++ b/sys/powerpc/booke/platform_bare.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2008-2009 Semihalf, Rafal Jaworowski + * Copyright (c) 2008-2012 Semihalf. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -56,7 +56,8 @@ __FBSDID("$FreeBSD$"); #ifdef SMP extern void *ap_pcpu; extern uint8_t __boot_page[]; /* Boot page body */ -extern uint32_t kernload_ap; /* Kernel physical load address */ +extern uint32_t bp_kernload; /* Kernel physical load address */ +extern uint32_t bp_trace; /* AP boot trace field */ #endif extern uint32_t *bootinfo; @@ -72,10 +73,10 @@ static int bare_smp_next_cpu(platform_t, struct cpuref *cpuref); static int bare_smp_get_bsp(platform_t, struct cpuref *cpuref); static int bare_smp_start_cpu(platform_t, struct pcpu *cpu); -static void e500_reset(platform_t); +static void booke_reset(platform_t); static platform_method_t bare_methods[] = { - PLATFORMMETHOD(platform_probe, bare_probe), + PLATFORMMETHOD(platform_probe, bare_probe), PLATFORMMETHOD(platform_mem_regions, bare_mem_regions), PLATFORMMETHOD(platform_timebase_freq, bare_timebase_freq), @@ -84,7 +85,7 @@ static platform_method_t bare_methods[] = { PLATFORMMETHOD(platform_smp_get_bsp, bare_smp_get_bsp), PLATFORMMETHOD(platform_smp_start_cpu, bare_smp_start_cpu), - PLATFORMMETHOD(platform_reset, e500_reset), + PLATFORMMETHOD(platform_reset, booke_reset), { 0, 0 } }; @@ -100,26 +101,16 @@ PLATFORM_DEF(bare_platform); static int bare_probe(platform_t plat) { - uint32_t ver, sr; + phandle_t cpus, child; + uint32_t sr; int i, law_max, tgt; - ver = SVR_VER(mfspr(SPR_SVR)); - switch (ver & ~0x0008) { /* Mask Security Enabled bit */ - case SVR_P4080: - maxcpu = 8; - break; - case SVR_P4040: - maxcpu = 4; - break; - case SVR_MPC8572: - case SVR_P1020: - case SVR_P2020: - maxcpu = 2; - break; - default: + if ((cpus = OF_finddevice("/cpus")) != 0) { + for (maxcpu = 0, child = OF_child(cpus); child != 0; + child = OF_peer(child), maxcpu++) + ; + } else maxcpu = 1; - break; - } /* * Clear local access windows. Skip DRAM entries, so we don't shoot @@ -152,9 +143,9 @@ bare_mem_regions(platform_t plat, struct mem_region **phys, int *physsz, int i, rv; rv = fdt_get_mem_regions(avail_regions, availsz, &memsize); - if (rv != 0) - return; + panic("%s: could not retrieve mem regions from the 'memory' " + "node, error: %d", __func__, rv); for (i = 0; i < *availsz; i++) { if (avail_regions[i].mr_start < 1048576) { @@ -262,8 +253,8 @@ bare_smp_start_cpu(platform_t plat, struct pcpu *pc) eebpcr = ccsr_read4(OCP85XX_EEBPCR); if ((eebpcr & (1 << (pc->pc_cpuid + 24))) != 0) { - printf("%s: CPU=%d already out of hold-off state!\n", - __func__, pc->pc_cpuid); + printf("SMP: CPU %d already out of hold-off state!\n", + pc->pc_cpuid); return (ENXIO); } @@ -273,12 +264,13 @@ bare_smp_start_cpu(platform_t plat, struct pcpu *pc) /* * Set BPTR to the physical address of the boot page */ - bptr = ((uint32_t)__boot_page - KERNBASE) + kernload_ap; + bptr = ((uint32_t)__boot_page - KERNBASE) + bp_kernload; ccsr_write4(OCP85XX_BPTR, (bptr >> 12) | 0x80000000); /* * Release AP from hold-off state */ + bp_trace = 0; eebpcr |= (1 << (pc->pc_cpuid + 24)); ccsr_write4(OCP85XX_EEBPCR, eebpcr); __asm __volatile("isync; msync"); @@ -287,6 +279,16 @@ bare_smp_start_cpu(platform_t plat, struct pcpu *pc) while (!pc->pc_awake && timeout--) DELAY(1000); /* wait 1ms */ + /* + * Disable boot page translation so that the 4K page at the default + * address (= 0xfffff000) isn't permanently remapped and thus not + * usable otherwise. + */ + ccsr_write4(OCP85XX_BPTR, 0); + + if (!pc->pc_awake) + printf("SMP: CPU %d didn't wake up (trace code %#x).\n", + pc->pc_awake, bp_trace); return ((pc->pc_awake) ? 0 : EBUSY); #else /* No SMP support */ @@ -295,7 +297,7 @@ bare_smp_start_cpu(platform_t plat, struct pcpu *pc) } static void -e500_reset(platform_t plat) +booke_reset(platform_t plat) { /* @@ -316,6 +318,7 @@ e500_reset(platform_t plat) mtspr(SPR_DBCR0, mfspr(SPR_DBCR0) | DBCR0_IDM | DBCR0_RST_SYSTEM); printf("Reset failed...\n"); - while (1); + while (1) + ; } diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c index 712967fc767..060a7f2f3f8 100644 --- a/sys/powerpc/booke/pmap.c +++ b/sys/powerpc/booke/pmap.c @@ -101,10 +101,6 @@ __FBSDID("$FreeBSD$"); #define TODO panic("%s: not implemented", __func__); -#include "opt_sched.h" -#ifndef SCHED_4BSD -#error "e500 only works with SCHED_4BSD which uses a global scheduler lock." -#endif extern struct mtx sched_lock; extern int dumpsys_minidump; @@ -115,7 +111,7 @@ extern unsigned char _end[]; extern uint32_t *bootinfo; #ifdef SMP -extern uint32_t kernload_ap; +extern uint32_t bp_kernload; #endif vm_paddr_t kernload; @@ -290,8 +286,8 @@ static void mmu_booke_init(mmu_t); static boolean_t mmu_booke_is_modified(mmu_t, vm_page_t); static boolean_t mmu_booke_is_prefaultable(mmu_t, pmap_t, vm_offset_t); static boolean_t mmu_booke_is_referenced(mmu_t, vm_page_t); -static boolean_t mmu_booke_ts_referenced(mmu_t, vm_page_t); -static vm_offset_t mmu_booke_map(mmu_t, vm_offset_t *, vm_offset_t, vm_offset_t, +static int mmu_booke_ts_referenced(mmu_t, vm_page_t); +static vm_offset_t mmu_booke_map(mmu_t, vm_offset_t *, vm_paddr_t, vm_paddr_t, int); static int mmu_booke_mincore(mmu_t, pmap_t, vm_offset_t, vm_paddr_t *); @@ -316,12 +312,12 @@ static void mmu_booke_zero_page_idle(mmu_t, vm_page_t); static void mmu_booke_activate(mmu_t, struct thread *); static void mmu_booke_deactivate(mmu_t, struct thread *); static void mmu_booke_bootstrap(mmu_t, vm_offset_t, vm_offset_t); -static void *mmu_booke_mapdev(mmu_t, vm_offset_t, vm_size_t); +static void *mmu_booke_mapdev(mmu_t, vm_paddr_t, vm_size_t); static void mmu_booke_unmapdev(mmu_t, vm_offset_t, vm_size_t); -static vm_offset_t mmu_booke_kextract(mmu_t, vm_offset_t); -static void mmu_booke_kenter(mmu_t, vm_offset_t, vm_offset_t); +static vm_paddr_t mmu_booke_kextract(mmu_t, vm_offset_t); +static void mmu_booke_kenter(mmu_t, vm_offset_t, vm_paddr_t); static void mmu_booke_kremove(mmu_t, vm_offset_t); -static boolean_t mmu_booke_dev_direct_mapped(mmu_t, vm_offset_t, vm_size_t); +static boolean_t mmu_booke_dev_direct_mapped(mmu_t, vm_paddr_t, vm_size_t); static void mmu_booke_sync_icache(mmu_t, pmap_t, vm_offset_t, vm_size_t); static vm_offset_t mmu_booke_dumpsys_map(mmu_t, struct pmap_md *, @@ -967,10 +963,9 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, vm_offset_t kernelend) debugf("mmu_booke_bootstrap: entered\n"); #ifdef SMP - kernload_ap = kernload; + bp_kernload = kernload; #endif - /* Initialize invalidation mutex */ mtx_init(&tlbivax_mutex, "tlbivax", NULL, MTX_SPIN); @@ -981,8 +976,13 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, vm_offset_t kernelend) * Align kernel start and end address (kernel image). * Note that kernel end does not necessarily relate to kernsize. * kernsize is the size of the kernel that is actually mapped. + * Also note that "start - 1" is deliberate. With SMP, the + * entry point is exactly a page from the actual load address. + * As such, trunc_page() has no effect and we're off by a page. + * Since we always have the ELF header between the load address + * and the entry point, we can safely subtract 1 to compensate. */ - kernstart = trunc_page(start); + kernstart = trunc_page(start - 1); data_start = round_page(kernelend); data_end = data_start; @@ -1233,9 +1233,9 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, vm_offset_t kernelend) * entries, but for pte_vatopa() to work correctly with kernel area * addresses. */ - for (va = KERNBASE; va < data_end; va += PAGE_SIZE) { + for (va = kernstart; va < data_end; va += PAGE_SIZE) { pte = &(kernel_pmap->pm_pdir[PDIR_IDX(va)][PTBL_IDX(va)]); - pte->rpn = kernload + (va - KERNBASE); + pte->rpn = kernload + (va - kernstart); pte->flags = PTE_M | PTE_SR | PTE_SW | PTE_SX | PTE_WIRED | PTE_VALID; } @@ -1387,7 +1387,7 @@ mmu_booke_qremove(mmu_t mmu, vm_offset_t sva, int count) * Map a wired page into kernel virtual address space. */ static void -mmu_booke_kenter(mmu_t mmu, vm_offset_t va, vm_offset_t pa) +mmu_booke_kenter(mmu_t mmu, vm_offset_t va, vm_paddr_t pa) { unsigned int pdir_idx = PDIR_IDX(va); unsigned int ptbl_idx = PTBL_IDX(va); @@ -1397,9 +1397,7 @@ mmu_booke_kenter(mmu_t mmu, vm_offset_t va, vm_offset_t pa) KASSERT(((va >= VM_MIN_KERNEL_ADDRESS) && (va <= VM_MAX_KERNEL_ADDRESS)), ("mmu_booke_kenter: invalid va")); - flags = 0; - flags |= (PTE_SR | PTE_SW | PTE_SX | PTE_WIRED | PTE_VALID); - flags |= PTE_M; + flags = PTE_M | PTE_SR | PTE_SW | PTE_SX | PTE_WIRED | PTE_VALID; pte = &(kernel_pmap->pm_pdir[pdir_idx][ptbl_idx]); @@ -1812,8 +1810,8 @@ mmu_booke_remove_all(mmu_t mmu, vm_page_t m) * Map a range of physical addresses into kernel virtual address space. */ static vm_offset_t -mmu_booke_map(mmu_t mmu, vm_offset_t *virt, vm_offset_t pa_start, - vm_offset_t pa_end, int prot) +mmu_booke_map(mmu_t mmu, vm_offset_t *virt, vm_paddr_t pa_start, + vm_paddr_t pa_end, int prot) { vm_offset_t sva = *virt; vm_offset_t va = sva; @@ -2439,7 +2437,7 @@ mmu_booke_page_wired_mappings(mmu_t mmu, vm_page_t m) } static int -mmu_booke_dev_direct_mapped(mmu_t mmu, vm_offset_t pa, vm_size_t size) +mmu_booke_dev_direct_mapped(mmu_t mmu, vm_paddr_t pa, vm_size_t size) { int i; vm_offset_t va; @@ -2597,7 +2595,7 @@ mmu_booke_scan_md(mmu_t mmu, struct pmap_md *prev) * for mapping device memory, NOT real memory. */ static void * -mmu_booke_mapdev(mmu_t mmu, vm_offset_t pa, vm_size_t size) +mmu_booke_mapdev(mmu_t mmu, vm_paddr_t pa, vm_size_t size) { void *res; uintptr_t va; @@ -3044,6 +3042,10 @@ tlb1_init(vm_offset_t ccsrbar) /* Map in CCSRBAR. */ tlb1_set_entry(CCSRBAR_VA, ccsrbar, CCSRBAR_SIZE, _TLB_ENTRY_IO); + /* Purge the remaining entries */ + for (i = tlb1_idx; i < TLB1_ENTRIES; i++) + tlb1_write_entry(i); + /* Setup TLB miss defaults */ set_mas4_defaults(); } diff --git a/sys/powerpc/booke/trap.c b/sys/powerpc/booke/trap.c index 091fce08f1f..cd2ab3865bd 100644 --- a/sys/powerpc/booke/trap.c +++ b/sys/powerpc/booke/trap.c @@ -143,6 +143,13 @@ trap(struct trapframe *frame) int sig, type, user; ksiginfo_t ksi; +#ifdef KDB + if (kdb_active) { + kdb_reenter(); + return; + } +#endif + PCPU_INC(cnt.v_trap); td = curthread; diff --git a/sys/powerpc/booke/trap_subr.S b/sys/powerpc/booke/trap_subr.S index c3b856a6bc9..33976ca159e 100644 --- a/sys/powerpc/booke/trap_subr.S +++ b/sys/powerpc/booke/trap_subr.S @@ -668,7 +668,7 @@ tlb_fill_entry: lwarx %r21, %r23, %r25 /* get pte->flags */ oris %r21, %r21, PTE_REFERENCED@h /* set referenced bit */ - andi. %r22, %r21, (PTE_UW | PTE_UW)@l /* check if writable */ + andi. %r22, %r21, (PTE_SW | PTE_UW)@l /* check if writable */ beq 2f oris %r21, %r21, PTE_MODIFIED@h /* set modified bit */ 2: diff --git a/sys/powerpc/conf/DEFAULTS b/sys/powerpc/conf/DEFAULTS index 4faf6c1f581..9d933b3a69e 100644 --- a/sys/powerpc/conf/DEFAULTS +++ b/sys/powerpc/conf/DEFAULTS @@ -8,9 +8,7 @@ device mem # Memory and kernel memory devices # UART chips on this platform device uart_ns8250 -device uart_z8530 -options GEOM_PART_APM options GEOM_PART_MBR options NEW_PCIB diff --git a/sys/powerpc/conf/GENERIC b/sys/powerpc/conf/GENERIC index 4cce5ff1650..4ca103a50ec 100644 --- a/sys/powerpc/conf/GENERIC +++ b/sys/powerpc/conf/GENERIC @@ -21,14 +21,14 @@ cpu AIM ident GENERIC -machine powerpc powerpc +machine powerpc powerpc makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols # Platform support options POWERMAC #NewWorld Apple PowerMacs options PSIM #GDB PSIM ppc simulator -options MAMBO #IBM Mambo Full System Simulator +options MAMBO #IBM Mambo Full System Simulator options SCHED_ULE #ULE scheduler options PREEMPTION #Enable kernel thread preemption @@ -49,6 +49,7 @@ options MSDOSFS #MSDOS Filesystem options CD9660 #ISO 9660 Filesystem options PROCFS #Process filesystem (requires PSEUDOFS) options PSEUDOFS #Pseudo-filesystem framework +options GEOM_PART_APM #Apple Partition Maps. options GEOM_PART_GPT #GUID Partition Tables. options GEOM_LABEL #Provides labelization options COMPAT_FREEBSD4 #Keep this for a while @@ -82,7 +83,7 @@ options WITNESS #Enable checks to detect deadlocks and cycles options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed options MALLOC_DEBUG_MAXZONES=8 # Separate malloc(9) zones -# To make an SMP kernel, the next line is needed +# Make an SMP-capable kernel by default options SMP # Symmetric MultiProcessor Kernel # CPU frequency control @@ -107,6 +108,7 @@ options AHC_REG_PRETTY_PRINT # Print register bitfields in debug device isp # Qlogic family device ispfw # Firmware module for Qlogic host adapters device mpt # LSI-Logic MPT-Fusion +device mps # LSI-Logic MPT-Fusion 2 device sym # NCR/Symbios/LSI Logic 53C8XX/53C1010/53C1510D # ATA/SCSI peripherals @@ -126,6 +128,7 @@ makeoptions SC_DFLT_FONT=cp437 # Serial (COM) ports device scc device uart +device uart_z8530 # PCI Ethernet NICs that use the common MII bus controller code. device miibus # MII bus support diff --git a/sys/powerpc/conf/GENERIC64 b/sys/powerpc/conf/GENERIC64 index f9df7fdb481..e7577bee7d0 100644 --- a/sys/powerpc/conf/GENERIC64 +++ b/sys/powerpc/conf/GENERIC64 @@ -21,14 +21,14 @@ cpu AIM ident GENERIC -machine powerpc powerpc64 +machine powerpc powerpc64 makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols # Platform support options POWERMAC #NewWorld Apple PowerMacs -options PS3 #Sony Playstation 3 -options MAMBO #IBM Mambo Full System Simulator +options PS3 #Sony Playstation 3 +options MAMBO #IBM Mambo Full System Simulator options SCHED_ULE #ULE scheduler options PREEMPTION #Enable kernel thread preemption @@ -49,6 +49,7 @@ options MSDOSFS #MSDOS Filesystem options CD9660 #ISO 9660 Filesystem options PROCFS #Process filesystem (requires PSEUDOFS) options PSEUDOFS #Pseudo-filesystem framework +options GEOM_PART_APM #Apple Partition Maps. options GEOM_PART_GPT #GUID Partition Tables. options GEOM_LABEL #Provides labelization options COMPAT_FREEBSD32 #Compatible with FreeBSD/powerpc binaries @@ -67,8 +68,11 @@ options AUDIT # Security event auditing options MAC # TrustedBSD MAC Framework options INCLUDE_CONFIG_FILE # Include this file in kernel -# Debugging for use in -current -options KDB #Enable the kernel debugger +# Debugging support. Always need this: +options KDB # Enable kernel debugger support. +# For minimum debugger support (stable branch) use: +#options KDB_TRACE # Print a stack trace for a panic. +# For full debugger support use this instead: options DDB #Support DDB #options DEADLKRES #Enable the deadlock resolver options INVARIANTS #Enable calls of extra sanity checking @@ -102,6 +106,7 @@ options AHC_REG_PRETTY_PRINT # Print register bitfields in debug device isp # Qlogic family device ispfw # Firmware module for Qlogic host adapters device mpt # LSI-Logic MPT-Fusion +device mps # LSI-Logic MPT-Fusion 2 device sym # NCR/Symbios/LSI Logic 53C8XX/53C1010/53C1510D # ATA/SCSI peripherals @@ -121,6 +126,7 @@ makeoptions SC_DFLT_FONT=cp437 # Serial (COM) ports device scc device uart +device uart_z8530 # Ethernet hardware device glc # Sony Playstation 3 Ethernet @@ -170,8 +176,8 @@ device cue # CATC USB Ethernet device kue # Kawasaki LSI USB Ethernet # Wireless NIC cards -options IEEE80211_SUPPORT_MESH -options AH_SUPPORT_AR5416 +options IEEE80211_SUPPORT_MESH +options AH_SUPPORT_AR5416 # FireWire support device firewire # FireWire bus code diff --git a/sys/powerpc/conf/MPC85XX b/sys/powerpc/conf/MPC85XX index e7774b2d5ee..00b0dcaf262 100644 --- a/sys/powerpc/conf/MPC85XX +++ b/sys/powerpc/conf/MPC85XX @@ -4,7 +4,8 @@ # $FreeBSD$ # -cpu E500 +cpu BOOKE +cpu BOOKE_E500 ident MPC85XX machine powerpc powerpc diff --git a/sys/powerpc/conf/NOTES b/sys/powerpc/conf/NOTES index 0045763cd40..33a04488670 100644 --- a/sys/powerpc/conf/NOTES +++ b/sys/powerpc/conf/NOTES @@ -14,7 +14,8 @@ # # You must specify at least one CPU (the one you intend to run on). cpu AIM -#cpu E500 +#cpu BOOKE_E500 +#cpu BOOKE_PPC440 options FPU_EMU diff --git a/sys/powerpc/include/_stdint.h b/sys/powerpc/include/_stdint.h index a014ac69f51..6ad1fd257d4 100644 --- a/sys/powerpc/include/_stdint.h +++ b/sys/powerpc/include/_stdint.h @@ -189,12 +189,6 @@ #define SIZE_MAX UINT32_MAX #endif -#ifndef WCHAR_MIN /* Also possibly defined in */ -/* Limits of wchar_t. */ -#define WCHAR_MIN INT32_MIN -#define WCHAR_MAX INT32_MAX -#endif - /* Limits of wint_t. */ #define WINT_MIN INT32_MIN #define WINT_MAX INT32_MAX diff --git a/sys/powerpc/include/_types.h b/sys/powerpc/include/_types.h index 8c09ae741f5..55ec0617318 100644 --- a/sys/powerpc/include/_types.h +++ b/sys/powerpc/include/_types.h @@ -133,6 +133,10 @@ typedef __uint32_t __vm_size_t; #endif typedef __int64_t __vm_ooffset_t; typedef __uint64_t __vm_pindex_t; +typedef int __wchar_t; + +#define __WCHAR_MIN __INT_MIN /* min value for a wchar_t */ +#define __WCHAR_MAX __INT_MAX /* max value for a wchar_t */ /* * Unusual type definitions. diff --git a/sys/powerpc/include/atomic.h b/sys/powerpc/include/atomic.h index c88c3fa39a5..c2a9921836e 100644 --- a/sys/powerpc/include/atomic.h +++ b/sys/powerpc/include/atomic.h @@ -36,26 +36,28 @@ #error this file needs sys/cdefs.h as a prerequisite #endif -/* NOTE: lwsync is equivalent to sync on systems without lwsync */ -#define mb() __asm __volatile("lwsync" : : : "memory") -#ifdef __powerpc64__ -#define rmb() __asm __volatile("lwsync" : : : "memory") -#define wmb() __asm __volatile("lwsync" : : : "memory") -#else -#define rmb() __asm __volatile("lwsync" : : : "memory") -#define wmb() __asm __volatile("eieio" : : : "memory") -#endif - /* * The __ATOMIC_REL/ACQ() macros provide memory barriers only in conjunction - * with the atomic lXarx/stXcx. sequences below. See Appendix B.2 of Book II - * of the architecture manual. + * with the atomic lXarx/stXcx. sequences below. They are not exposed outside + * of this file. See also Appendix B.2 of Book II of the architecture manual. + * + * Note that not all Book-E processors accept the light-weight sync variant. + * In particular, early models of E500 cores are known to wedge. Bank on all + * 64-bit capable CPUs to accept lwsync properly and pressimize 32-bit CPUs + * to use the heavier-weight sync. */ + #ifdef __powerpc64__ +#define mb() __asm __volatile("lwsync" : : : "memory") +#define rmb() __asm __volatile("lwsync" : : : "memory") +#define wmb() __asm __volatile("lwsync" : : : "memory") #define __ATOMIC_REL() __asm __volatile("lwsync" : : : "memory") -#define __ATOMIC_ACQ() __asm __volatile("lwsync" : : : "memory") +#define __ATOMIC_ACQ() __asm __volatile("isync" : : : "memory") #else -#define __ATOMIC_REL() __asm __volatile("lwsync" : : : "memory") +#define mb() __asm __volatile("sync" : : : "memory") +#define rmb() __asm __volatile("sync" : : : "memory") +#define wmb() __asm __volatile("sync" : : : "memory") +#define __ATOMIC_REL() __asm __volatile("sync" : : : "memory") #define __ATOMIC_ACQ() __asm __volatile("isync" : : : "memory") #endif @@ -688,4 +690,7 @@ atomic_fetchadd_long(volatile u_long *p, u_long v) #define atomic_fetchadd_64 atomic_fetchadd_long #endif +#undef __ATOMIC_REL +#undef __ATOMIC_ACQ + #endif /* ! _MACHINE_ATOMIC_H_ */ diff --git a/sys/powerpc/include/cpu.h b/sys/powerpc/include/cpu.h index 73b1f500857..66d21eb79ac 100644 --- a/sys/powerpc/include/cpu.h +++ b/sys/powerpc/include/cpu.h @@ -99,6 +99,6 @@ void fork_trampoline(void); void swi_vm(void *); /* XXX the following should not be here. */ -void savectx(struct pcb *); +void savectx(struct pcb *) __returns_twice; #endif /* _MACHINE_CPU_H_ */ diff --git a/sys/powerpc/include/elf.h b/sys/powerpc/include/elf.h index f5d287c0d80..0e81b4a7c9f 100644 --- a/sys/powerpc/include/elf.h +++ b/sys/powerpc/include/elf.h @@ -106,8 +106,9 @@ __ElfType(Auxinfo); #define AT_PAGESIZES 18 /* Pagesizes. */ #define AT_PAGESIZESLEN 19 /* Number of pagesizes. */ #define AT_STACKPROT 21 /* Initial stack protection. */ +#define AT_TIMEKEEP 22 /* Pointer to timehands. */ -#define AT_COUNT 22 /* Count of defined aux entry types. */ +#define AT_COUNT 23 /* Count of defined aux entry types. */ /* * Relocation types. diff --git a/sys/powerpc/include/hid.h b/sys/powerpc/include/hid.h index 0b73415433e..63123903835 100644 --- a/sys/powerpc/include/hid.h +++ b/sys/powerpc/include/hid.h @@ -78,6 +78,8 @@ #define HID0_E500_SEL_TBCLK 0x00002000 /* Select Time Base clock */ #define HID0_E500_MAS7UPDEN 0x00000080 /* Enable MAS7 update (e500v2) */ +#define HID0_E500MC_L2MMU_MHD 0x40000000 /* L2MMU Multiple Hit Detection */ + #define HID0_BITMASK \ "\20" \ "\040EMCP\037DBP\036EBA\035EBD\034BCLK\033EICE\032ECLK\031PAR" \ @@ -105,6 +107,20 @@ "\027NAP\025DPM\023TG\022HANGDETECT\021NHR\020INORDER" \ "\016TBCTRL\015TBEN\012CIABREN\011HDICEEN\001ENATTN" +#define HID0_E500MC_BITMASK \ + "\20" \ + "\040EMCP\037EN_L2MMU_MHD\036b2\035b3\034b4\033b5\032b6\031b7" \ + "\030b8\027b9\026b10\025b11\024b12\023b13\022b14\021b15" \ + "\020b16\017b17\016b18\015b19\014b20\013b21\012b22\011b23" \ + "\010EN_MAS7_UPDATE\007DCFA\006b26\005CIGLSO\004b28\003b29\002b30\001NOPTI" + +#define HID0_E5500_BITMASK \ + "\20" \ + "\040EMCP\037EN_L2MMU_MHD\036b2\035b3\034b4\033b5\032b6\031b7" \ + "\030b8\027b9\026b10\025b11\024b12\023b13\022b14\021b15" \ + "\020b16\017b17\016b18\015b19\014b20\013b21\012b22\011b23" \ + "\010b24\007DCFA\006b26\005CIGLSO\004b28\003b29\002b30\001NOPTI" + /* * HID0 bit definitions per cpu model * @@ -142,6 +158,40 @@ * 30 - - - NOPDST NOPDST NOPDST NOPDST - * 31 NOOPTI - NOOPTI NOPTI NOPTI NOPTI NOPTI NOPTI * + * bit e500mc e5500 + * 0 EMCP EMCP + * 1 EN_L2MMU_MHD EN_L2MMU_MHD + * 2 - - + * 3 - - + * 4 - - + * 5 - - + * 6 - - + * 7 - - + * 8 - - + * 9 - - + * 10 - - + * 11 - - + * 12 - - + * 13 - - + * 14 - - + * 15 - - + * 16 - - + * 17 - - + * 18 - - + * 19 - - + * 20 - - + * 21 - - + * 22 - - + * 23 - - + * 24 EN_MAS7_UPDATE - + * 25 DCFA DCFA + * 26 - - + * 27 CIGLSO CIGLSO + * 28 - - + * 29 - - + * 30 - - + * 31 NOPTI NOPTI + * * 604: ECP = Enable cache parity checking * 604: SIE = Serial instruction execution disable * 7450: TBEN = Time Base Enable @@ -160,6 +210,9 @@ #define HID0_E500_DEFAULT_SET (HID0_EMCP | HID0_E500_TBEN) #define HID1_E500_DEFAULT_SET (HID1_E500_ABE | HID1_E500_ASTME) +#define HID0_E500MC_DEFAULT_SET (HID0_EMCP | HID0_E500MC_L2MMU_MHD | \ + HID0_E500_MAS7UPDEN) +#define HID0_E5500_DEFAULT_SET (HID0_EMCP | HID0_E500MC_L2MMU_MHD) #define HID5_970_DCBZ_SIZE_HI 0x00000080UL /* dcbz does a 32-byte store */ #define HID4_970_DISABLE_LG_PG 0x00000004ULL /* disables large pages */ diff --git a/sys/powerpc/include/in_cksum.h b/sys/powerpc/include/in_cksum.h index 09920062a0a..4fe1b4023f7 100644 --- a/sys/powerpc/include/in_cksum.h +++ b/sys/powerpc/include/in_cksum.h @@ -39,6 +39,7 @@ #define in_cksum(m, len) in_cksum_skip(m, len, 0) +#if defined(IPVERSION) && (IPVERSION == 4) /* * It it useful to have an Internet checksum routine which is inlineable * and optimized specifically for the task of computing IP header checksums @@ -65,9 +66,12 @@ in_cksum_update(struct ip *ip) } while(0) #endif +#endif #ifdef _KERNEL +#if defined(IPVERSION) && (IPVERSION == 4) u_int in_cksum_hdr(const struct ip *ip); +#endif u_short in_addword(u_short sum, u_short b); u_short in_pseudo(u_int sum, u_int b, u_int c); u_short in_cksum_skip(struct mbuf *m, int len, int skip); diff --git a/sys/powerpc/include/machdep.h b/sys/powerpc/include/machdep.h new file mode 100644 index 00000000000..401a4a1bccd --- /dev/null +++ b/sys/powerpc/include/machdep.h @@ -0,0 +1,39 @@ +/*- + * Copyright (c) 2011-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _POWERPC_MACHDEP_H_ +#define _POWERPC_MACHDEP_H_ + +void booke_disable_l2_cache(void); +void booke_enable_l1_cache(void); +void booke_enable_l2_cache(void); +void booke_enable_l3_cache(void); +void booke_enable_bpred(void); +void booke_init_tlb(vm_paddr_t); + +#endif /* _POWERPC_MACHDEP_H_ */ diff --git a/sys/powerpc/include/pcpu.h b/sys/powerpc/include/pcpu.h index 62094f8d310..bd146617750 100644 --- a/sys/powerpc/include/pcpu.h +++ b/sys/powerpc/include/pcpu.h @@ -115,7 +115,7 @@ struct pmap; PCPU_MD_COMMON_FIELDS \ PCPU_MD_AIM_FIELDS #endif -#ifdef E500 +#if defined(BOOKE) #define PCPU_MD_FIELDS \ PCPU_MD_COMMON_FIELDS \ PCPU_MD_BOOKE_FIELDS diff --git a/sys/powerpc/include/pio.h b/sys/powerpc/include/pio.h index 0994ed18e0c..b09e68a43e8 100644 --- a/sys/powerpc/include/pio.h +++ b/sys/powerpc/include/pio.h @@ -39,7 +39,12 @@ * I/O macros. */ -#define powerpc_iomb() __asm __volatile("eieio" : : : "memory") +/* + * Use sync so that bus space operations cannot sneak out the bottom of + * mutex-protected sections (mutex release does not guarantee completion of + * accesses to caching-inhibited memory on some systems) + */ +#define powerpc_iomb() __asm __volatile("sync" : : : "memory") static __inline void __outb(volatile u_int8_t *a, u_int8_t v) diff --git a/sys/powerpc/include/pmap.h b/sys/powerpc/include/pmap.h index b2a36834c90..f50ff118da0 100644 --- a/sys/powerpc/include/pmap.h +++ b/sys/powerpc/include/pmap.h @@ -94,7 +94,7 @@ typedef struct pmap *pmap_t; struct pvo_entry { LIST_ENTRY(pvo_entry) pvo_vlink; /* Link to common virt page */ LIST_ENTRY(pvo_entry) pvo_olink; /* Link to overflow entry */ - LIST_ENTRY(pvo_entry) pvo_plink; /* Link to pmap entries */ + RB_ENTRY(pvo_entry) pvo_plink; /* Link to pmap entries */ union { struct pte pte; /* 32 bit PTE */ struct lpte lpte; /* 64 bit PTE */ @@ -104,6 +104,9 @@ struct pvo_entry { uint64_t pvo_vpn; /* Virtual page number */ }; LIST_HEAD(pvo_head, pvo_entry); +RB_HEAD(pvo_tree, pvo_entry); +int pvo_vaddr_compare(struct pvo_entry *, struct pvo_entry *); +RB_PROTOTYPE(pvo_tree, pvo_entry, pvo_plink, pvo_vaddr_compare); #define PVO_PTEGIDX_MASK 0x007UL /* which PTEG slot */ #define PVO_PTEGIDX_VALID 0x008UL /* slot is valid */ @@ -136,7 +139,7 @@ struct pmap { struct pmap *pmap_phys; struct pmap_statistics pm_stats; - struct pvo_head pmap_pvo; + struct pvo_tree pmap_pvo; }; struct md_page { @@ -220,17 +223,19 @@ extern struct pmap kernel_pmap_store; #define PMAP_TRYLOCK(pmap) mtx_trylock(&(pmap)->pm_mtx) #define PMAP_UNLOCK(pmap) mtx_unlock(&(pmap)->pm_mtx) +#define pmap_page_is_write_mapped(m) (((m)->aflags & PGA_WRITEABLE) != 0) + void pmap_bootstrap(vm_offset_t, vm_offset_t); -void pmap_kenter(vm_offset_t va, vm_offset_t pa); +void pmap_kenter(vm_offset_t va, vm_paddr_t pa); void pmap_kenter_attr(vm_offset_t va, vm_offset_t pa, vm_memattr_t); void pmap_kremove(vm_offset_t); -void *pmap_mapdev(vm_offset_t, vm_size_t); +void *pmap_mapdev(vm_paddr_t, vm_size_t); void *pmap_mapdev_attr(vm_offset_t, vm_size_t, vm_memattr_t); void pmap_unmapdev(vm_offset_t, vm_size_t); void pmap_page_set_memattr(vm_page_t, vm_memattr_t); void pmap_deactivate(struct thread *); -vm_offset_t pmap_kextract(vm_offset_t); -int pmap_dev_direct_mapped(vm_offset_t, vm_size_t); +vm_paddr_t pmap_kextract(vm_offset_t); +int pmap_dev_direct_mapped(vm_paddr_t, vm_size_t); boolean_t pmap_mmu_install(char *name, int prio); #define vtophys(va) pmap_kextract((vm_offset_t)(va)) diff --git a/sys/powerpc/include/profile.h b/sys/powerpc/include/profile.h index cde97ed7ebc..eb11fc96d38 100644 --- a/sys/powerpc/include/profile.h +++ b/sys/powerpc/include/profile.h @@ -172,12 +172,13 @@ __asm( " .globl _mcount \n" \ #define __PROFILE_VECTOR_BASE EXC_RST #define __PROFILE_VECTOR_TOP (EXC_LAST + 0x100) #endif /* AIM */ -#ifdef E500 +#if defined(BOOKE) extern char interrupt_vector_base[]; extern char interrupt_vector_top[]; #define __PROFILE_VECTOR_BASE (uintfptr_t)interrupt_vector_base #define __PROFILE_VECTOR_TOP (uintfptr_t)interrupt_vector_top -#endif /* E500 */ +#endif /* BOOKE_E500 || BOOKE_PPC4XX */ + #endif /* !COMPILING_LINT */ #ifndef __PROFILE_VECTOR_BASE diff --git a/sys/powerpc/include/psl.h b/sys/powerpc/include/psl.h index 92bfa6ca215..b519266b860 100644 --- a/sys/powerpc/include/psl.h +++ b/sys/powerpc/include/psl.h @@ -35,7 +35,7 @@ #ifndef _MACHINE_PSL_H_ #define _MACHINE_PSL_H_ -#if defined(E500) +#if defined(BOOKE_E500) /* * Machine State Register (MSR) - e500 core * @@ -67,7 +67,29 @@ #define PSL_KERNSET (PSL_CE | PSL_ME | PSL_EE) #define PSL_USERSET (PSL_KERNSET | PSL_PR) -#else /* if defined(E500) */ +#elif defined(BOOKE_PPC4XX) +/* + * Machine State Register (MSR) - PPC4xx core + */ +#define PSL_WE (0x80000000 >> 13) /* Wait State Enable */ +#define PSL_CE (0x80000000 >> 14) /* Critical Interrupt Enable */ +#define PSL_EE (0x80000000 >> 16) /* External Interrupt Enable */ +#define PSL_PR (0x80000000 >> 17) /* Problem State */ +#define PSL_FP (0x80000000 >> 18) /* Floating Point Available */ +#define PSL_ME (0x80000000 >> 19) /* Machine Check Enable */ +#define PSL_FE0 (0x80000000 >> 20) /* Floating-point exception mode 0 */ +#define PSL_DWE (0x80000000 >> 21) /* Debug Wait Enable */ +#define PSL_DE (0x80000000 >> 22) /* Debug interrupt Enable */ +#define PSL_FE1 (0x80000000 >> 23) /* Floating-point exception mode 1 */ +#define PSL_IS (0x80000000 >> 26) /* Instruction Address Space */ +#define PSL_DS (0x80000000 >> 27) /* Data Address Space */ + +#define PSL_KERNSET (PSL_CE | PSL_ME | PSL_EE | PSL_FP) +#define PSL_USERSET (PSL_KERNSET | PSL_PR) + +#define PSL_FE_DFLT 0x00000000UL /* default == none */ + +#else /* if defined(BOOKE_*) */ /* * Machine State Register (MSR) * @@ -127,5 +149,5 @@ #define PSL_USERSTATIC (PSL_USERSET | PSL_IP | 0x87c0008c) -#endif /* if defined(E500) */ +#endif /* if defined(BOOKE_E500) */ #endif /* _MACHINE_PSL_H_ */ diff --git a/sys/powerpc/include/pte.h b/sys/powerpc/include/pte.h index 67cd5fdc257..b5d2ecfdbfa 100644 --- a/sys/powerpc/include/pte.h +++ b/sys/powerpc/include/pte.h @@ -163,7 +163,7 @@ extern u_int dsisr(void); #endif /* _KERNEL */ #endif /* LOCORE */ -#else +#else /* BOOKE */ #include @@ -224,6 +224,8 @@ typedef struct pte pte_t; /* RPN mask, TLB0 4K pages */ #define PTE_PA_MASK PAGE_MASK +#if defined(BOOKE_E500) + /* PTE bits assigned to MAS2, MAS3 flags */ #define PTE_W MAS2_W #define PTE_I MAS2_I @@ -241,6 +243,26 @@ typedef struct pte pte_t; #define PTE_MAS3_MASK ((MAS3_UX | MAS3_SX | MAS3_UW \ | MAS3_SW | MAS3_UR | MAS3_SR) << PTE_MAS3_SHIFT) +#elif defined(BOOKE_PPC4XX) + +#define PTE_WL1 TLB_WL1 +#define PTE_IL2I TLB_IL2I +#define PTE_IL2D TLB_IL2D + +#define PTE_W TLB_W +#define PTE_I TLB_I +#define PTE_M TLB_M +#define PTE_G TLB_G + +#define PTE_UX TLB_UX +#define PTE_SX TLB_SX +#define PTE_UW TLB_UW +#define PTE_SW TLB_SW +#define PTE_UR TLB_UR +#define PTE_SR TLB_SR + +#endif + /* Other PTE flags */ #define PTE_VALID 0x80000000 /* Valid */ #define PTE_MODIFIED 0x40000000 /* Modified */ @@ -256,6 +278,5 @@ typedef struct pte pte_t; #define PTE_ISMODIFIED(pte) ((pte)->flags & PTE_MODIFIED) #define PTE_ISREFERENCED(pte) ((pte)->flags & PTE_REFERENCED) -#endif /* #elif defined(E500) */ - +#endif /* BOOKE_PPC4XX */ #endif /* _MACHINE_PTE_H_ */ diff --git a/sys/powerpc/include/spr.h b/sys/powerpc/include/spr.h index e35698760fc..79fad45f28f 100644 --- a/sys/powerpc/include/spr.h +++ b/sys/powerpc/include/spr.h @@ -115,9 +115,9 @@ #define SRR1_ISI_NOEXECUTE 0x10000000 /* Memory marked no-execute */ #define SRR1_ISI_PP 0x08000000 /* PP bits forbid access */ #define SPR_DECAR 0x036 /* ..8 Decrementer auto reload */ -#define SPR_EIE 0x050 /* ..8 Exception Interrupt ??? */ -#define SPR_EID 0x051 /* ..8 Exception Interrupt ??? */ -#define SPR_NRI 0x052 /* ..8 Exception Interrupt ??? */ +#define SPR_EIE 0x050 /* ..8 Exception Interrupt ??? */ +#define SPR_EID 0x051 /* ..8 Exception Interrupt ??? */ +#define SPR_NRI 0x052 /* ..8 Exception Interrupt ??? */ #define SPR_USPRG0 0x100 /* 4.. User SPR General 0 */ #define SPR_VRSAVE 0x100 /* .6. AltiVec VRSAVE */ #define SPR_SPRG0 0x110 /* 468 SPR General 0 */ @@ -184,6 +184,8 @@ #define MPC8245 0x8081 #define FSL_E500v1 0x8020 #define FSL_E500v2 0x8021 +#define FSL_E500mc 0x8023 +#define FSL_E5500 0x8024 #define SPR_IBAT0U 0x210 /* .68 Instruction BAT Reg 0 Upper */ #define SPR_IBAT0U 0x210 /* .6. Instruction BAT Reg 0 Upper */ @@ -202,49 +204,49 @@ #define SPR_DBAT2L 0x21d /* .6. Data BAT Reg 2 Lower */ #define SPR_DBAT3U 0x21e /* .6. Data BAT Reg 3 Upper */ #define SPR_DBAT3L 0x21f /* .6. Data BAT Reg 3 Lower */ -#define SPR_IC_CST 0x230 /* ..8 Instruction Cache CSR */ -#define IC_CST_IEN 0x80000000 /* I cache is ENabled (RO) */ -#define IC_CST_CMD_INVALL 0x0c000000 /* I cache invalidate all */ -#define IC_CST_CMD_UNLOCKALL 0x0a000000 /* I cache unlock all */ -#define IC_CST_CMD_UNLOCK 0x08000000 /* I cache unlock block */ -#define IC_CST_CMD_LOADLOCK 0x06000000 /* I cache load & lock block */ -#define IC_CST_CMD_DISABLE 0x04000000 /* I cache disable */ -#define IC_CST_CMD_ENABLE 0x02000000 /* I cache enable */ -#define IC_CST_CCER1 0x00200000 /* I cache error type 1 (RO) */ -#define IC_CST_CCER2 0x00100000 /* I cache error type 2 (RO) */ -#define IC_CST_CCER3 0x00080000 /* I cache error type 3 (RO) */ +#define SPR_IC_CST 0x230 /* ..8 Instruction Cache CSR */ +#define IC_CST_IEN 0x80000000 /* I cache is ENabled (RO) */ +#define IC_CST_CMD_INVALL 0x0c000000 /* I cache invalidate all */ +#define IC_CST_CMD_UNLOCKALL 0x0a000000 /* I cache unlock all */ +#define IC_CST_CMD_UNLOCK 0x08000000 /* I cache unlock block */ +#define IC_CST_CMD_LOADLOCK 0x06000000 /* I cache load & lock block */ +#define IC_CST_CMD_DISABLE 0x04000000 /* I cache disable */ +#define IC_CST_CMD_ENABLE 0x02000000 /* I cache enable */ +#define IC_CST_CCER1 0x00200000 /* I cache error type 1 (RO) */ +#define IC_CST_CCER2 0x00100000 /* I cache error type 2 (RO) */ +#define IC_CST_CCER3 0x00080000 /* I cache error type 3 (RO) */ #define SPR_IBAT4U 0x230 /* .6. Instruction BAT Reg 4 Upper */ -#define SPR_IC_ADR 0x231 /* ..8 Instruction Cache Address */ +#define SPR_IC_ADR 0x231 /* ..8 Instruction Cache Address */ #define SPR_IBAT4L 0x231 /* .6. Instruction BAT Reg 4 Lower */ -#define SPR_IC_DAT 0x232 /* ..8 Instruction Cache Data */ +#define SPR_IC_DAT 0x232 /* ..8 Instruction Cache Data */ #define SPR_IBAT5U 0x232 /* .6. Instruction BAT Reg 5 Upper */ #define SPR_IBAT5L 0x233 /* .6. Instruction BAT Reg 5 Lower */ #define SPR_IBAT6U 0x234 /* .6. Instruction BAT Reg 6 Upper */ #define SPR_IBAT6L 0x235 /* .6. Instruction BAT Reg 6 Lower */ #define SPR_IBAT7U 0x236 /* .6. Instruction BAT Reg 7 Upper */ #define SPR_IBAT7L 0x237 /* .6. Instruction BAT Reg 7 Lower */ -#define SPR_DC_CST 0x230 /* ..8 Data Cache CSR */ -#define DC_CST_DEN 0x80000000 /* D cache ENabled (RO) */ -#define DC_CST_DFWT 0x40000000 /* D cache Force Write-Thru (RO) */ -#define DC_CST_LES 0x20000000 /* D cache Little Endian Swap (RO) */ -#define DC_CST_CMD_FLUSH 0x0e000000 /* D cache invalidate all */ -#define DC_CST_CMD_INVALL 0x0c000000 /* D cache invalidate all */ -#define DC_CST_CMD_UNLOCKALL 0x0a000000 /* D cache unlock all */ -#define DC_CST_CMD_UNLOCK 0x08000000 /* D cache unlock block */ -#define DC_CST_CMD_CLRLESWAP 0x07000000 /* D cache clr little-endian swap */ -#define DC_CST_CMD_LOADLOCK 0x06000000 /* D cache load & lock block */ -#define DC_CST_CMD_SETLESWAP 0x05000000 /* D cache set little-endian swap */ -#define DC_CST_CMD_DISABLE 0x04000000 /* D cache disable */ -#define DC_CST_CMD_CLRFWT 0x03000000 /* D cache clear forced write-thru */ -#define DC_CST_CMD_ENABLE 0x02000000 /* D cache enable */ -#define DC_CST_CMD_SETFWT 0x01000000 /* D cache set forced write-thru */ -#define DC_CST_CCER1 0x00200000 /* D cache error type 1 (RO) */ -#define DC_CST_CCER2 0x00100000 /* D cache error type 2 (RO) */ -#define DC_CST_CCER3 0x00080000 /* D cache error type 3 (RO) */ +#define SPR_DC_CST 0x230 /* ..8 Data Cache CSR */ +#define DC_CST_DEN 0x80000000 /* D cache ENabled (RO) */ +#define DC_CST_DFWT 0x40000000 /* D cache Force Write-Thru (RO) */ +#define DC_CST_LES 0x20000000 /* D cache Little Endian Swap (RO) */ +#define DC_CST_CMD_FLUSH 0x0e000000 /* D cache invalidate all */ +#define DC_CST_CMD_INVALL 0x0c000000 /* D cache invalidate all */ +#define DC_CST_CMD_UNLOCKALL 0x0a000000 /* D cache unlock all */ +#define DC_CST_CMD_UNLOCK 0x08000000 /* D cache unlock block */ +#define DC_CST_CMD_CLRLESWAP 0x07000000 /* D cache clr little-endian swap */ +#define DC_CST_CMD_LOADLOCK 0x06000000 /* D cache load & lock block */ +#define DC_CST_CMD_SETLESWAP 0x05000000 /* D cache set little-endian swap */ +#define DC_CST_CMD_DISABLE 0x04000000 /* D cache disable */ +#define DC_CST_CMD_CLRFWT 0x03000000 /* D cache clear forced write-thru */ +#define DC_CST_CMD_ENABLE 0x02000000 /* D cache enable */ +#define DC_CST_CMD_SETFWT 0x01000000 /* D cache set forced write-thru */ +#define DC_CST_CCER1 0x00200000 /* D cache error type 1 (RO) */ +#define DC_CST_CCER2 0x00100000 /* D cache error type 2 (RO) */ +#define DC_CST_CCER3 0x00080000 /* D cache error type 3 (RO) */ #define SPR_DBAT4U 0x238 /* .6. Data BAT Reg 4 Upper */ -#define SPR_DC_ADR 0x231 /* ..8 Data Cache Address */ +#define SPR_DC_ADR 0x231 /* ..8 Data Cache Address */ #define SPR_DBAT4L 0x239 /* .6. Data BAT Reg 4 Lower */ -#define SPR_DC_DAT 0x232 /* ..8 Data Cache Data */ +#define SPR_DC_DAT 0x232 /* ..8 Data Cache Data */ #define SPR_DBAT5U 0x23a /* .6. Data BAT Reg 5 Upper */ #define SPR_DBAT5L 0x23b /* .6. Data BAT Reg 5 Lower */ #define SPR_DBAT6U 0x23c /* .6. Data BAT Reg 6 Upper */ @@ -252,46 +254,46 @@ #define SPR_DBAT7U 0x23e /* .6. Data BAT Reg 7 Upper */ #define SPR_DBAT7L 0x23f /* .6. Data BAT Reg 7 Lower */ #define SPR_MI_CTR 0x310 /* ..8 IMMU control */ -#define Mx_CTR_GPM 0x80000000 /* Group Protection Mode */ -#define Mx_CTR_PPM 0x40000000 /* Page Protection Mode */ -#define Mx_CTR_CIDEF 0x20000000 /* Cache-Inhibit DEFault */ -#define MD_CTR_WTDEF 0x20000000 /* Write-Through DEFault */ -#define Mx_CTR_RSV4 0x08000000 /* Reserve 4 TLB entries */ -#define MD_CTR_TWAM 0x04000000 /* TableWalk Assist Mode */ -#define Mx_CTR_PPCS 0x02000000 /* Priv/user state compare mode */ -#define Mx_CTR_TLB_INDX 0x000001f0 /* TLB index mask */ -#define Mx_CTR_TLB_INDX_BITPOS 8 /* TLB index shift */ +#define Mx_CTR_GPM 0x80000000 /* Group Protection Mode */ +#define Mx_CTR_PPM 0x40000000 /* Page Protection Mode */ +#define Mx_CTR_CIDEF 0x20000000 /* Cache-Inhibit DEFault */ +#define MD_CTR_WTDEF 0x20000000 /* Write-Through DEFault */ +#define Mx_CTR_RSV4 0x08000000 /* Reserve 4 TLB entries */ +#define MD_CTR_TWAM 0x04000000 /* TableWalk Assist Mode */ +#define Mx_CTR_PPCS 0x02000000 /* Priv/user state compare mode */ +#define Mx_CTR_TLB_INDX 0x000001f0 /* TLB index mask */ +#define Mx_CTR_TLB_INDX_BITPOS 8 /* TLB index shift */ #define SPR_MI_AP 0x312 /* ..8 IMMU access protection */ -#define Mx_GP_SUPER(n) (0 << (2*(15-(n)))) /* access is supervisor */ -#define Mx_GP_PAGE (1 << (2*(15-(n)))) /* access is page protect */ -#define Mx_GP_SWAPPED (2 << (2*(15-(n)))) /* access is swapped */ -#define Mx_GP_USER (3 << (2*(15-(n)))) /* access is user */ +#define Mx_GP_SUPER(n) (0 << (2*(15-(n)))) /* access is supervisor */ +#define Mx_GP_PAGE (1 << (2*(15-(n)))) /* access is page protect */ +#define Mx_GP_SWAPPED (2 << (2*(15-(n)))) /* access is swapped */ +#define Mx_GP_USER (3 << (2*(15-(n)))) /* access is user */ #define SPR_MI_EPN 0x313 /* ..8 IMMU effective number */ -#define Mx_EPN_EPN 0xfffff000 /* Effective Page Number mask */ -#define Mx_EPN_EV 0x00000020 /* Entry Valid */ -#define Mx_EPN_ASID 0x0000000f /* Address Space ID */ +#define Mx_EPN_EPN 0xfffff000 /* Effective Page Number mask */ +#define Mx_EPN_EV 0x00000020 /* Entry Valid */ +#define Mx_EPN_ASID 0x0000000f /* Address Space ID */ #define SPR_MI_TWC 0x315 /* ..8 IMMU tablewalk control */ -#define MD_TWC_L2TB 0xfffff000 /* Level-2 Tablewalk Base */ -#define Mx_TWC_APG 0x000001e0 /* Access Protection Group */ -#define Mx_TWC_G 0x00000010 /* Guarded memory */ -#define Mx_TWC_PS 0x0000000c /* Page Size (L1) */ -#define MD_TWC_WT 0x00000002 /* Write-Through */ -#define Mx_TWC_V 0x00000001 /* Entry Valid */ +#define MD_TWC_L2TB 0xfffff000 /* Level-2 Tablewalk Base */ +#define Mx_TWC_APG 0x000001e0 /* Access Protection Group */ +#define Mx_TWC_G 0x00000010 /* Guarded memory */ +#define Mx_TWC_PS 0x0000000c /* Page Size (L1) */ +#define MD_TWC_WT 0x00000002 /* Write-Through */ +#define Mx_TWC_V 0x00000001 /* Entry Valid */ #define SPR_MI_RPN 0x316 /* ..8 IMMU real (phys) page number */ -#define Mx_RPN_RPN 0xfffff000 /* Real Page Number */ -#define Mx_RPN_PP 0x00000ff0 /* Page Protection */ -#define Mx_RPN_SPS 0x00000008 /* Small Page Size */ -#define Mx_RPN_SH 0x00000004 /* SHared page */ -#define Mx_RPN_CI 0x00000002 /* Cache Inhibit */ -#define Mx_RPN_V 0x00000001 /* Valid */ +#define Mx_RPN_RPN 0xfffff000 /* Real Page Number */ +#define Mx_RPN_PP 0x00000ff0 /* Page Protection */ +#define Mx_RPN_SPS 0x00000008 /* Small Page Size */ +#define Mx_RPN_SH 0x00000004 /* SHared page */ +#define Mx_RPN_CI 0x00000002 /* Cache Inhibit */ +#define Mx_RPN_V 0x00000001 /* Valid */ #define SPR_MD_CTR 0x318 /* ..8 DMMU control */ #define SPR_M_CASID 0x319 /* ..8 CASID */ -#define M_CASID 0x0000000f /* Current AS Id */ +#define M_CASID 0x0000000f /* Current AS Id */ #define SPR_MD_AP 0x31a /* ..8 DMMU access protection */ #define SPR_MD_EPN 0x31b /* ..8 DMMU effective number */ #define SPR_M_TWB 0x31c /* ..8 MMU tablewalk base */ -#define M_TWB_L1TB 0xfffff000 /* level-1 translation base */ -#define M_TWB_L1INDX 0x00000ffc /* level-1 index */ +#define M_TWB_L1TB 0xfffff000 /* level-1 translation base */ +#define M_TWB_L1INDX 0x00000ffc /* level-1 index */ #define SPR_MD_TWC 0x31d /* ..8 DMMU tablewalk control */ #define SPR_MD_RPN 0x31e /* ..8 DMMU real (phys) page number */ #define SPR_MD_TW 0x31f /* ..8 MMU tablewalk scratch */ @@ -307,8 +309,8 @@ #define SPR_UMMCR1 0x3ac /* .6. User Monitor Mode Control Register 1 */ #define SPR_ZPR 0x3b0 /* 4.. Zone Protection Register */ #define SPR_MMCR2 0x3b0 /* .6. Monitor Mode Control Register 2 */ -#define SPR_MMCR2_THRESHMULT_32 0x80000000 /* Multiply MMCR0 threshold by 32 */ -#define SPR_MMCR2_THRESHMULT_2 0x00000000 /* Multiply MMCR0 threshold by 2 */ +#define SPR_MMCR2_THRESHMULT_32 0x80000000 /* Multiply MMCR0 threshold by 32 */ +#define SPR_MMCR2_THRESHMULT_2 0x00000000 /* Multiply MMCR0 threshold by 2 */ #define SPR_PID 0x3b1 /* 4.. Process ID */ #define SPR_PMC5 0x3b1 /* .6. Performance Counter Register 5 */ #define SPR_PMC6 0x3b2 /* .6. Performance Counter Register 6 */ @@ -323,14 +325,14 @@ #define SPR_970MMCR1 0x31e /* ... Monitor Mode Control Register 1 (PPC 970) */ #define SPR_970MMCRA 0x312 /* ... Monitor Mode Control Register 2 (PPC 970) */ #define SPR_970MMCR0 0x31b /* ... Monitor Mode Control Register 0 (PPC 970) */ -#define SPR_970PMC1 0x313 /* ... PMC 1 */ -#define SPR_970PMC2 0x314 /* ... PMC 2 */ -#define SPR_970PMC3 0x315 /* ... PMC 3 */ -#define SPR_970PMC4 0x316 /* ... PMC 4 */ -#define SPR_970PMC5 0x317 /* ... PMC 5 */ -#define SPR_970PMC6 0x318 /* ... PMC 6 */ -#define SPR_970PMC7 0x319 /* ... PMC 7 */ -#define SPR_970PMC8 0x31a /* ... PMC 8 */ +#define SPR_970PMC1 0x313 /* ... PMC 1 */ +#define SPR_970PMC2 0x314 /* ... PMC 2 */ +#define SPR_970PMC3 0x315 /* ... PMC 3 */ +#define SPR_970PMC4 0x316 /* ... PMC 4 */ +#define SPR_970PMC5 0x317 /* ... PMC 5 */ +#define SPR_970PMC6 0x318 /* ... PMC 6 */ +#define SPR_970PMC7 0x319 /* ... PMC 7 */ +#define SPR_970PMC8 0x31a /* ... PMC 8 */ #define SPR_MMCR0_FC 0x80000000 /* Freeze counters */ #define SPR_MMCR0_FCS 0x40000000 /* Freeze counters in supervisor mode */ @@ -421,6 +423,7 @@ #define SPR_SRR3 0x3df /* 4.. Save/Restore Register 3 */ #define SPR_HID0 0x3f0 /* ..8 Hardware Implementation Register 0 */ #define SPR_HID1 0x3f1 /* ..8 Hardware Implementation Register 1 */ +#define SPR_HID2 0x3f3 /* ..8 Hardware Implementation Register 2 */ #define SPR_HID4 0x3f4 /* ..8 Hardware Implementation Register 4 */ #define SPR_HID5 0x3f6 /* ..8 Hardware Implementation Register 5 */ #define SPR_HID6 0x3f9 /* ..8 Hardware Implementation Register 6 */ @@ -452,7 +455,7 @@ #define SPR_DAC1 0x3f6 /* 4.. Data Address Compare 1 */ #define SPR_DAC2 0x3f7 /* 4.. Data Address Compare 2 */ #define SPR_PIR 0x3ff /* .6. Processor Identification Register */ -#elif defined(E500) +#elif defined(BOOKE) #define SPR_PIR 0x11e /* ..8 Processor Identification Register */ #define SPR_DBSR 0x130 /* ..8 Debug Status Register */ #define DBSR_IDE 0x80000000 /* Imprecise debug event. */ @@ -554,7 +557,6 @@ #define L2CR_L2DRO 0x00000100 /* 23: L2DLL rollover checkstop enable. */ #define L2CR_L2IP 0x00000001 /* 31: L2 global invalidate in */ /* progress (read only). */ - #define SPR_L3CR 0x3fa /* .6. L3 Control Register */ #define L3CR_L3E 0x80000000 /* 0: L3 enable */ #define L3CR_L3PE 0x40000000 /* 1: L3 data parity enable */ @@ -582,15 +584,15 @@ #define SPR_ICCR 0x3fb /* 4.. Instruction Cache Cachability Register */ #define SPR_THRM1 0x3fc /* .6. Thermal Management Register */ #define SPR_THRM2 0x3fd /* .6. Thermal Management Register */ -#define SPR_THRM_TIN 0x80000000 /* Thermal interrupt bit (RO) */ -#define SPR_THRM_TIV 0x40000000 /* Thermal interrupt valid (RO) */ -#define SPR_THRM_THRESHOLD(x) ((x) << 23) /* Thermal sensor threshold */ -#define SPR_THRM_TID 0x00000004 /* Thermal interrupt direction */ -#define SPR_THRM_TIE 0x00000002 /* Thermal interrupt enable */ -#define SPR_THRM_VALID 0x00000001 /* Valid bit */ +#define SPR_THRM_TIN 0x80000000 /* Thermal interrupt bit (RO) */ +#define SPR_THRM_TIV 0x40000000 /* Thermal interrupt valid (RO) */ +#define SPR_THRM_THRESHOLD(x) ((x) << 23) /* Thermal sensor threshold */ +#define SPR_THRM_TID 0x00000004 /* Thermal interrupt direction */ +#define SPR_THRM_TIE 0x00000002 /* Thermal interrupt enable */ +#define SPR_THRM_VALID 0x00000001 /* Valid bit */ #define SPR_THRM3 0x3fe /* .6. Thermal Management Register */ -#define SPR_THRM_TIMER(x) ((x) << 1) /* Sampling interval timer */ -#define SPR_THRM_ENABLE 0x00000001 /* TAU Enable */ +#define SPR_THRM_TIMER(x) ((x) << 1) /* Sampling interval timer */ +#define SPR_THRM_ENABLE 0x00000001 /* TAU Enable */ #define SPR_FPECR 0x3fe /* .6. Floating-Point Exception Cause Register */ /* Time Base Register declarations */ @@ -600,7 +602,7 @@ #define TBR_TBWU 0x11d /* 468 Time Base Upper - supervisor, write */ /* Performance counter declarations */ -#define PMC_OVERFLOW 0x80000000 /* Counter has overflowed */ +#define PMC_OVERFLOW 0x80000000 /* Counter has overflowed */ /* The first five countable [non-]events are common to many PMC's */ #define PMCN_NONE 0 /* Count nothing */ @@ -616,7 +618,7 @@ #if defined(AIM) -#define SPR_ESR 0x3d4 /* 4.. Exception Syndrome Register */ +#define SPR_ESR 0x3d4 /* 4.. Exception Syndrome Register */ #define ESR_MCI 0x80000000 /* Machine check - instruction */ #define ESR_PIL 0x08000000 /* Program interrupt - illegal */ #define ESR_PPR 0x04000000 /* Program interrupt - privileged */ @@ -626,7 +628,9 @@ #define ESR_DIZ 0x00800000 /* Data/instruction storage interrupt - zone fault */ #define ESR_U0F 0x00008000 /* Data storage interrupt - U0 fault */ -#elif defined(E500) +#elif defined(BOOKE) + +#define SPR_MCSR 0x23c /* ..8 Machine Check Syndrome register */ #define SPR_ESR 0x003e /* ..8 Exception Syndrome Register */ #define ESR_PIL 0x08000000 /* Program interrupt - illegal */ @@ -643,6 +647,19 @@ #define SPR_MCSRR0 0x23a /* ..8 570 Machine check SRR0 */ #define SPR_MCSRR1 0x23b /* ..8 571 Machine check SRR1 */ +#define SPR_MMUCR 0x3b2 /* 4.. MMU Control Register */ +#define MMUCR_SWOA (0x80000000 >> 7) +#define MMUCR_U1TE (0x80000000 >> 9) +#define MMUCR_U2SWOAE (0x80000000 >> 10) +#define MMUCR_DULXE (0x80000000 >> 12) +#define MMUCR_IULXE (0x80000000 >> 13) +#define MMUCR_STS (0x80000000 >> 15) +#define MMUCR_STID_MASK (0xFF000000 >> 24) + +#define SPR_MMUCSR0 0x3f4 /* ..8 1012 MMU Control and Status Register 0 */ +#define MMUCSR0_L2TLB0_FI 0x04 /* TLB0 flash invalidate */ +#define MMUCSR0_L2TLB1_FI 0x02 /* TLB1 flash invalidate */ + #define SPR_SVR 0x3ff /* ..8 1023 System Version Register */ #define SVR_MPC8533 0x8034 #define SVR_MPC8533E 0x803c @@ -662,10 +679,16 @@ #define SVR_P2010E 0x80eb #define SVR_P2020 0x80e2 #define SVR_P2020E 0x80ea +#define SVR_P2041 0x8210 +#define SVR_P2041E 0x8218 +#define SVR_P3041 0x8211 +#define SVR_P3041E 0x8219 #define SVR_P4040 0x8200 #define SVR_P4040E 0x8208 #define SVR_P4080 0x8201 #define SVR_P4080E 0x8209 +#define SVR_P5020 0x8220 +#define SVR_P5020E 0x8228 #define SVR_VER(svr) (((svr) >> 16) & 0xffff) #define SPR_PID0 0x030 /* ..8 Process ID Register 0 */ @@ -708,6 +731,18 @@ #define SPR_MAS5 0x275 /* ..8 MMU Assist Register 5 Book-E */ #define SPR_MAS6 0x276 /* ..8 MMU Assist Register 6 Book-E/e500 */ #define SPR_MAS7 0x3B0 /* ..8 MMU Assist Register 7 Book-E/e500 */ +#define SPR_MAS8 0x155 /* ..8 MMU Assist Register 8 Book-E/e500 */ + +#define SPR_L1CFG0 0x203 /* ..8 L1 cache configuration register 0 */ +#define SPR_L1CFG1 0x204 /* ..8 L1 cache configuration register 1 */ + +#define SPR_CCR1 0x378 +#define CCR1_L2COBE 0x00000040 + +#define DCR_L2DCDCRAI 0x0000 /* L2 D-Cache DCR Address Pointer */ +#define DCR_L2DCDCRDI 0x0001 /* L2 D-Cache DCR Data Indirect */ +#define DCR_L2CR0 0x00 /* L2 Cache Configuration Register 0 */ +#define L2CR0_AS 0x30000000 #define SPR_L1CSR0 0x3F2 /* ..8 L1 Cache Control and Status Register 0 */ #define L1CSR0_DCPE 0x00010000 /* Data Cache Parity Enable */ @@ -716,13 +751,20 @@ #define L1CSR0_DCE 0x00000001 /* Data Cache Enable */ #define SPR_L1CSR1 0x3F3 /* ..8 L1 Cache Control and Status Register 1 */ #define L1CSR1_ICPE 0x00010000 /* Instruction Cache Parity Enable */ +#define L1CSR1_ICUL 0x00000400 /* Instr Cache Unable to Lock */ #define L1CSR1_ICLFR 0x00000100 /* Instruction Cache Lock Bits Flash Reset */ #define L1CSR1_ICFI 0x00000002 /* Instruction Cache Flash Invalidate */ #define L1CSR1_ICE 0x00000001 /* Instruction Cache Enable */ +#define SPR_L2CSR0 0x3F9 /* ..8 L2 Cache Control and Status Register 0 */ +#define L2CSR0_L2E 0x80000000 /* L2 Cache Enable */ +#define L2CSR0_L2PE 0x40000000 /* L2 Cache Parity Enable */ +#define L2CSR0_L2FI 0x00200000 /* L2 Cache Flash Invalidate */ +#define L2CSR0_L2LFC 0x00000400 /* L2 Cache Lock Flags Clear */ + #define SPR_BUCSR 0x3F5 /* ..8 Branch Unit Control and Status Register */ #define BUCSR_BPEN 0x00000001 /* Branch Prediction Enable */ +#define BUCSR_BBFI 0x00000200 /* Branch Buffer Flash Invalidate */ -#endif /* #elif defined(E500) */ - +#endif /* BOOKE */ #endif /* !_POWERPC_SPR_H_ */ diff --git a/sys/powerpc/include/tlb.h b/sys/powerpc/include/tlb.h index 56f55211c80..7e0d909a074 100644 --- a/sys/powerpc/include/tlb.h +++ b/sys/powerpc/include/tlb.h @@ -1,5 +1,5 @@ /*- - * Copyright (C) 2006 Semihalf, Marian Balakowicz + * Copyright (C) 2006-2012 Semihalf. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,6 +30,8 @@ #ifndef _MACHINE_TLB_H_ #define _MACHINE_TLB_H_ +#if defined(BOOKE_E500) + /* PowerPC E500 MAS registers */ #define MAS0_TLBSEL(x) ((x << 28) & 0x10000000) #define MAS0_ESEL(x) ((x << 16) & 0x000F0000) @@ -122,6 +124,73 @@ #define _TLB_ENTRY_MEM (0) #endif +#if !defined(LOCORE) +typedef struct tlb_entry { + uint32_t mas1; + uint32_t mas2; + uint32_t mas3; +} tlb_entry_t; + +void tlb0_print_tlbentries(void); + +void tlb1_inval_entry(unsigned int); +void tlb1_init(vm_offset_t); +void tlb1_print_entries(void); +void tlb1_print_tlbentries(void); +#endif /* !LOCORE */ + +#elif defined(BOOKE_PPC4XX) + +/* TLB Words */ +#define TLB_PAGEID 0 +#define TLB_XLAT 1 +#define TLB_ATTRIB 2 + +/* Page identification fields */ +#define TLB_EPN_MASK (0xFFFFFC00 >> 0) +#define TLB_VALID (0x80000000 >> 22) +#define TLB_TS (0x80000000 >> 23) +#define TLB_SIZE_1K (0x00000000 >> 24) +#define TLB_SIZE_MASK (0xF0000000 >> 24) + +/* Translation fields */ +#define TLB_RPN_MASK (0xFFFFFC00 >> 0) +#define TLB_ERPN_MASK (0xF0000000 >> 28) + +/* Storage attribute and access control fields */ +#define TLB_WL1 (0x80000000 >> 11) +#define TLB_IL1I (0x80000000 >> 12) +#define TLB_IL1D (0x80000000 >> 13) +#define TLB_IL2I (0x80000000 >> 14) +#define TLB_IL2D (0x80000000 >> 15) +#define TLB_U0 (0x80000000 >> 16) +#define TLB_U1 (0x80000000 >> 17) +#define TLB_U2 (0x80000000 >> 18) +#define TLB_U3 (0x80000000 >> 19) +#define TLB_W (0x80000000 >> 20) +#define TLB_I (0x80000000 >> 21) +#define TLB_M (0x80000000 >> 22) +#define TLB_G (0x80000000 >> 23) +#define TLB_E (0x80000000 >> 24) +#define TLB_UX (0x80000000 >> 26) +#define TLB_UW (0x80000000 >> 27) +#define TLB_UR (0x80000000 >> 28) +#define TLB_SX (0x80000000 >> 29) +#define TLB_SW (0x80000000 >> 30) +#define TLB_SR (0x80000000 >> 31) +#define TLB_SIZE 64 + +#define TLB_SIZE_4K (0x10000000 >> 24) +#define TLB_SIZE_16K (0x20000000 >> 24) +#define TLB_SIZE_64K (0x30000000 >> 24) +#define TLB_SIZE_256K (0x40000000 >> 24) +#define TLB_SIZE_1M (0x50000000 >> 24) +#define TLB_SIZE_16M (0x70000000 >> 24) +#define TLB_SIZE_256M (0x90000000 >> 24) +#define TLB_SIZE_1G (0xA0000000 >> 24) + +#endif /* BOOKE_E500 */ + #define TID_KERNEL 0 /* TLB TID to use for kernel (shared) translations */ #define TID_KRESERVED 1 /* Number of TIDs reserved for kernel */ #define TID_URESERVED 0 /* Number of TIDs reserved for user */ @@ -132,22 +201,11 @@ #define TLB_UNLOCKED 0 #if !defined(LOCORE) -typedef struct tlb_entry { - uint32_t mas1; - uint32_t mas2; - uint32_t mas3; -} tlb_entry_t; typedef int tlbtid_t; + struct pmap; -void tlb0_print_tlbentries(void); - -void tlb1_inval_entry(unsigned int); -void tlb1_init(vm_offset_t); -void tlb1_print_entries(void); -void tlb1_print_tlbentries(void); - void tlb_lock(uint32_t *); void tlb_unlock(uint32_t *); diff --git a/sys/powerpc/include/trap.h b/sys/powerpc/include/trap.h index 61543b47a1d..75accf300f6 100644 --- a/sys/powerpc/include/trap.h +++ b/sys/powerpc/include/trap.h @@ -2,7 +2,7 @@ #if defined(AIM) #include -#elif defined(E500) +#elif defined(BOOKE) #include #endif diff --git a/sys/powerpc/include/vdso.h b/sys/powerpc/include/vdso.h new file mode 100644 index 00000000000..0bdafd98283 --- /dev/null +++ b/sys/powerpc/include/vdso.h @@ -0,0 +1,41 @@ +/*- + * Copyright 2012 Konstantin Belousov . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _POWERPC_VDSO_H +#define _POWERPC_VDSO_H + +#define VDSO_TIMEHANDS_MD \ + uint32_t th_res[8]; + +#ifdef _KERNEL +#ifdef COMPAT_FREEBSD32 + +#define VDSO_TIMEHANDS_MD32 VDSO_TIMEHANDS_MD + +#endif +#endif +#endif diff --git a/sys/powerpc/include/vmparam.h b/sys/powerpc/include/vmparam.h index 36afd1fed90..8368a4179dc 100644 --- a/sys/powerpc/include/vmparam.h +++ b/sys/powerpc/include/vmparam.h @@ -78,7 +78,7 @@ #endif #define SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE) #else /* LOCORE */ -#if !defined(__powerpc64__) && defined(E500) +#if !defined(__powerpc64__) && defined(BOOKE) #define VM_MIN_ADDRESS 0 #define VM_MAXUSER_ADDRESS 0x7ffff000 #endif diff --git a/sys/powerpc/mpc85xx/fsl_sdhc.c b/sys/powerpc/mpc85xx/fsl_sdhc.c new file mode 100644 index 00000000000..ecd6572524b --- /dev/null +++ b/sys/powerpc/mpc85xx/fsl_sdhc.c @@ -0,0 +1,1306 @@ +/*- + * Copyright (c) 2011-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Driver for Freescale integrated eSDHC controller. + * Limitations: + * - No support for multi-block transfers. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "opt_platform.h" + +#include "mmcbr_if.h" + +#include "fsl_sdhc.h" + +#define DEBUG +#undef DEBUG +#ifdef DEBUG +#define DPRINTF(fmt, arg...) printf("DEBUG %s(): " fmt, __FUNCTION__, ##arg) +#else +#define DPRINTF(fmt, arg...) +#endif + + +/***************************************************************************** + * Register the driver + *****************************************************************************/ +/* Forward declarations */ +static int fsl_sdhc_probe(device_t); +static int fsl_sdhc_attach(device_t); +static int fsl_sdhc_detach(device_t); + +static int fsl_sdhc_read_ivar(device_t, device_t, int, uintptr_t *); +static int fsl_sdhc_write_ivar(device_t, device_t, int, uintptr_t); + +static int fsl_sdhc_update_ios(device_t, device_t); +static int fsl_sdhc_request(device_t, device_t, struct mmc_request *); +static int fsl_sdhc_get_ro(device_t, device_t); +static int fsl_sdhc_acquire_host(device_t, device_t); +static int fsl_sdhc_release_host(device_t, device_t); + +static device_method_t fsl_sdhc_methods[] = { + /* device_if */ + DEVMETHOD(device_probe, fsl_sdhc_probe), + DEVMETHOD(device_attach, fsl_sdhc_attach), + DEVMETHOD(device_detach, fsl_sdhc_detach), + + /* Bus interface */ + DEVMETHOD(bus_read_ivar, fsl_sdhc_read_ivar), + DEVMETHOD(bus_write_ivar, fsl_sdhc_write_ivar), + + /* OFW bus interface */ + DEVMETHOD(ofw_bus_get_compat, ofw_bus_gen_get_compat), + DEVMETHOD(ofw_bus_get_model, ofw_bus_gen_get_model), + DEVMETHOD(ofw_bus_get_name, ofw_bus_gen_get_name), + DEVMETHOD(ofw_bus_get_node, ofw_bus_gen_get_node), + DEVMETHOD(ofw_bus_get_type, ofw_bus_gen_get_type), + + /* mmcbr_if */ + DEVMETHOD(mmcbr_update_ios, fsl_sdhc_update_ios), + DEVMETHOD(mmcbr_request, fsl_sdhc_request), + DEVMETHOD(mmcbr_get_ro, fsl_sdhc_get_ro), + DEVMETHOD(mmcbr_acquire_host, fsl_sdhc_acquire_host), + DEVMETHOD(mmcbr_release_host, fsl_sdhc_release_host), + + {0, 0}, +}; + +/* kobj_class definition */ +static driver_t fsl_sdhc_driver = { + "sdhci", + fsl_sdhc_methods, + sizeof(struct fsl_sdhc_softc) +}; + +static devclass_t fsl_sdhc_devclass; + +DRIVER_MODULE(sdhci, simplebus, fsl_sdhc_driver, fsl_sdhc_devclass, 0, 0); + + +/***************************************************************************** + * Private methods + *****************************************************************************/ +static inline int +read4(struct fsl_sdhc_softc *sc, unsigned int offset) +{ + + return bus_space_read_4(sc->bst, sc->bsh, offset); +} + +static inline void +write4(struct fsl_sdhc_softc *sc, unsigned int offset, int value) +{ + + bus_space_write_4(sc->bst, sc->bsh, offset, value); +} + +static inline void +set_bit(struct fsl_sdhc_softc *sc, uint32_t offset, uint32_t mask) +{ + uint32_t x = read4(sc, offset); + + write4(sc, offset, x | mask); +} + +static inline void +clear_bit(struct fsl_sdhc_softc *sc, uint32_t offset, uint32_t mask) +{ + uint32_t x = read4(sc, offset); + + write4(sc, offset, x & ~mask); +} + +static int +wait_for_bit_clear(struct fsl_sdhc_softc *sc, enum sdhc_reg_off reg, + uint32_t bit) +{ + uint32_t timeout = 10; + uint32_t stat; + + stat = read4(sc, reg); + while (stat & bit) { + if (timeout == 0) { + return (-1); + } + --timeout; + DELAY(1000); + stat = read4(sc, reg); + } + + return (0); +} + +static int +wait_for_free_line(struct fsl_sdhc_softc *sc, enum sdhc_line line) +{ + uint32_t timeout = 100; + uint32_t stat; + + stat = read4(sc, SDHC_PRSSTAT); + while (stat & line) { + if (timeout == 0) { + return (-1); + } + --timeout; + DELAY(1000); + stat = read4(sc, SDHC_PRSSTAT); + } + + return (0); +} + +static uint32_t +get_platform_clock(struct fsl_sdhc_softc *sc) +{ + device_t self, parent; + phandle_t node; + uint32_t clock; + + self = sc->self; + node = ofw_bus_get_node(self); + + /* Get sdhci node properties */ + if((OF_getprop(node, "clock-frequency", (void *)&clock, + sizeof(clock)) <= 0) || (clock == 0)) { + + /* + * Trying to get clock from parent device (soc) if correct + * clock cannot be acquired from sdhci node. + */ + parent = device_get_parent(self); + node = ofw_bus_get_node(parent); + + /* Get soc properties */ + if ((OF_getprop(node, "bus-frequency", (void *)&clock, + sizeof(clock)) <= 0) || (clock == 0)) { + device_printf(self,"Cannot acquire correct sdhci " + "frequency from DTS.\n"); + + return (0); + } + } + + DPRINTF("Acquired clock: %d from DTS\n", clock); + + return (clock); +} + +/** + * Set clock driving card. + * @param sc + * @param clock Desired clock frequency in Hz + */ +static void +set_clock(struct fsl_sdhc_softc *sc, uint32_t clock) +{ + uint32_t base_clock; + uint32_t divisor, prescaler = 1; + uint32_t round = 0; + + if (clock == sc->slot.clock) + return; + + if (clock == 0) { + clear_bit(sc, SDHC_SYSCTL, MASK_CLOCK_CONTROL | SYSCTL_PEREN | + SYSCTL_HCKEN | SYSCTL_IPGEN); + return; + } + + base_clock = sc->platform_clock; + round = base_clock & 0x2; + base_clock >>= 2; + base_clock += round; + round = 0; + + /* SD specification 1.1 doesn't allow frequences above 50 MHz */ + if (clock > FSL_SDHC_MAX_CLOCK) + clock = FSL_SDHC_MAX_CLOCK; + + /* + * divisor = ceil(base_clock / clock) + * TODO: Reconsider symmetric rounding here instead of ceiling. + */ + divisor = (base_clock + clock - 1) / clock; + + while (divisor > 16) { + round = divisor & 0x1; + divisor >>= 1; + + prescaler <<= 1; + } + divisor += round - 1; + + /* Turn off the clock. */ + clear_bit(sc, SDHC_SYSCTL, MASK_CLOCK_CONTROL); + + /* Write clock settings. */ + set_bit(sc, SDHC_SYSCTL, (prescaler << SHIFT_SDCLKFS) | + (divisor << SHIFT_DVS)); + + /* + * Turn on clocks. + * TODO: This actually disables clock automatic gating off feature of + * the controller which eventually should be enabled but as for now + * it prevents controller from generating card insertion/removal + * interrupts correctly. + */ + set_bit(sc, SDHC_SYSCTL, SYSCTL_PEREN | SYSCTL_HCKEN | SYSCTL_IPGEN); + + sc->slot.clock = clock; + + DPRINTF("given clock = %d, computed clock = %d\n", clock, + (base_clock / prescaler) / (divisor + 1)); +} + +static inline void +send_80_clock_ticks(struct fsl_sdhc_softc *sc) +{ + int err; + + err = wait_for_free_line(sc, SDHC_CMD_LINE | SDHC_DAT_LINE); + if (err != 0) { + device_printf(sc->self, "Can't acquire data/cmd lines\n"); + return; + } + + set_bit(sc, SDHC_SYSCTL, SYSCTL_INITA); + err = wait_for_bit_clear(sc, SDHC_SYSCTL, SYSCTL_INITA); + if (err != 0) { + device_printf(sc->self, "Can't send 80 clocks to the card.\n"); + } +} + +static void +set_bus_width(struct fsl_sdhc_softc *sc, enum mmc_bus_width width) +{ + + DPRINTF("setting bus width to %d\n", width); + switch (width) { + case bus_width_1: + set_bit(sc, SDHC_PROCTL, DTW_1); + break; + case bus_width_4: + set_bit(sc, SDHC_PROCTL, DTW_4); + break; + case bus_width_8: + set_bit(sc, SDHC_PROCTL, DTW_8); + break; + default: + device_printf(sc->self, "Unsupported bus width\n"); + } +} + +static void +reset_controller_all(struct fsl_sdhc_softc *sc) +{ + uint32_t count = 5; + + set_bit(sc, SDHC_SYSCTL, SYSCTL_RSTA); + while (read4(sc, SDHC_SYSCTL) & SYSCTL_RSTA) { + DELAY(FSL_SDHC_RESET_DELAY); + --count; + if (count == 0) { + device_printf(sc->self, + "Can't reset the controller\n"); + return; + } + } +} + +static void +reset_controller_dat_cmd(struct fsl_sdhc_softc *sc) +{ + int err; + + set_bit(sc, SDHC_SYSCTL, SYSCTL_RSTD | SYSCTL_RSTC); + err = wait_for_bit_clear(sc, SDHC_SYSCTL, SYSCTL_RSTD | SYSCTL_RSTC); + if (err != 0) { + device_printf(sc->self, "Can't reset data & command part!\n"); + return; + } +} + +static void +init_controller(struct fsl_sdhc_softc *sc) +{ + + /* Enable interrupts. */ +#ifdef FSL_SDHC_NO_DMA + write4(sc, SDHC_IRQSTATEN, MASK_IRQ_ALL & ~IRQ_DINT & ~IRQ_DMAE); + write4(sc, SDHC_IRQSIGEN, MASK_IRQ_ALL & ~IRQ_DINT & ~IRQ_DMAE); +#else + write4(sc, SDHC_IRQSTATEN, MASK_IRQ_ALL & ~IRQ_BRR & ~IRQ_BWR); + write4(sc, SDHC_IRQSIGEN, MASK_IRQ_ALL & ~IRQ_BRR & ~IRQ_BWR); + + /* Write DMA address */ + write4(sc, SDHC_DSADDR, sc->dma_phys); + + /* Enable snooping and fix for AHB2MAG bypass. */ + write4(sc, SDHC_DCR, DCR_SNOOP | DCR_AHB2MAG_BYPASS); +#endif + /* Set data timeout. */ + set_bit(sc, SDHC_SYSCTL, 0xe << SHIFT_DTOCV); + + /* Set water-mark levels (FIFO buffer size). */ + write4(sc, SDHC_WML, (FSL_SDHC_FIFO_BUF_WORDS << 16) | + FSL_SDHC_FIFO_BUF_WORDS); +} + +static void +init_mmc_host_struct(struct fsl_sdhc_softc *sc) +{ + struct mmc_host *host = &sc->mmc_host; + + /* Clear host structure. */ + bzero(host, sizeof(struct mmc_host)); + + /* Calculate minimum and maximum operating frequencies. */ + host->f_min = sc->platform_clock / FSL_SDHC_MAX_DIV; + host->f_max = FSL_SDHC_MAX_CLOCK; + + /* Set operation conditions (voltage). */ + host->host_ocr = MMC_OCR_320_330 | MMC_OCR_330_340; + + /* Set additional host controller capabilities. */ + host->caps = MMC_CAP_4_BIT_DATA; + + /* Set mode. */ + host->mode = mode_sd; +} + +static void +card_detect_task(void *arg, int pending) +{ + struct fsl_sdhc_softc *sc = (struct fsl_sdhc_softc *)arg; + int err; + int insert; + + insert = read4(sc, SDHC_PRSSTAT) & PRSSTAT_CINS; + + mtx_lock(&sc->mtx); + + if (insert) { + if (sc->child != NULL) { + mtx_unlock(&sc->mtx); + return; + } + + sc->child = device_add_child(sc->self, "mmc", -1); + if (sc->child == NULL) { + device_printf(sc->self, "Couldn't add MMC bus!\n"); + mtx_unlock(&sc->mtx); + return; + } + + /* Initialize MMC bus host structure. */ + init_mmc_host_struct(sc); + device_set_ivars(sc->child, &sc->mmc_host); + + } else { + if (sc->child == NULL) { + mtx_unlock(&sc->mtx); + return; + } + } + + mtx_unlock(&sc->mtx); + + if (insert) { + if ((err = device_probe_and_attach(sc->child)) != 0) { + device_printf(sc->self, "MMC bus failed on probe " + "and attach! error %d\n", err); + device_delete_child(sc->self, sc->child); + sc->child = NULL; + } + } else { + if (device_delete_child(sc->self, sc->child) != 0) + device_printf(sc->self, "Could not delete MMC bus!\n"); + sc->child = NULL; + } +} + +static void +card_detect_delay(void *arg) +{ + struct fsl_sdhc_softc *sc = arg; + + taskqueue_enqueue(taskqueue_swi_giant, &sc->card_detect_task); +} + +static void +finalize_request(struct fsl_sdhc_softc *sc) +{ + + DPRINTF("finishing request %x\n", sc->request); + + sc->request->done(sc->request); + sc->request = NULL; +} + +/** + * Read response from card. + * @todo Implement Auto-CMD responses being held in R3 for multi-block xfers. + * @param sc + */ +static void +get_response(struct fsl_sdhc_softc *sc) +{ + struct mmc_command *cmd = sc->request->cmd; + int i; + uint32_t val; + uint8_t ext = 0; + + if (cmd->flags & MMC_RSP_136) { + /* CRC is stripped, need to shift one byte left. */ + for (i = 0; i < 4; i++) { + val = read4(sc, SDHC_CMDRSP0 + i * 4); + cmd->resp[3 - i] = (val << 8) + ext; + ext = val >> 24; + } + } else { + cmd->resp[0] = read4(sc, SDHC_CMDRSP0); + } +} + +#ifdef FSL_SDHC_NO_DMA +/** + * Read all content of a fifo buffer. + * @warning Assumes data buffer is 32-bit aligned. + * @param sc + */ +static void +read_block_pio(struct fsl_sdhc_softc *sc) +{ + struct mmc_data *data = sc->request->cmd->data; + size_t left = min(FSL_SDHC_FIFO_BUF_SIZE, data->len); + uint8_t *buf = data->data; + uint32_t word; + + buf += sc->data_offset; + bus_space_read_multi_4(sc->bst, sc->bsh, SDHC_DATPORT, (uint32_t *)buf, + left >> 2); + + sc->data_offset += left; + + /* Handle 32-bit unaligned size case. */ + left &= 0x3; + if (left > 0) { + buf = (uint8_t *)data->data + (sc->data_offset & ~0x3); + word = read4(sc, SDHC_DATPORT); + while (left > 0) { + *(buf++) = word; + word >>= 8; + --left; + } + } +} + +/** + * Write a fifo buffer. + * @warning Assumes data buffer size is 32-bit aligned. + * @param sc + */ +static void +write_block_pio(struct fsl_sdhc_softc *sc) +{ + struct mmc_data *data = sc->request->cmd->data; + size_t left = min(FSL_SDHC_FIFO_BUF_SIZE, data->len); + uint8_t *buf = data->data; + uint32_t word = 0; + + DPRINTF("sc->data_offset %d\n", sc->data_offset); + + buf += sc->data_offset; + bus_space_write_multi_4(sc->bst, sc->bsh, SDHC_DATPORT, (uint32_t *)buf, + left >> 2); + + sc->data_offset += left; + + /* Handle 32-bit unaligned size case. */ + left &= 0x3; + if (left > 0) { + buf = (uint8_t *)data->data + (sc->data_offset & ~0x3); + while (left > 0) { + word += *(buf++); + word <<= 8; + --left; + } + write4(sc, SDHC_DATPORT, word); + } +} + +static void +pio_read_transfer(struct fsl_sdhc_softc *sc) +{ + + while (read4(sc, SDHC_PRSSTAT) & PRSSTAT_BREN) { + read_block_pio(sc); + + /* + * TODO: should we check here whether data_offset >= data->len? + */ + } +} + +static void +pio_write_transfer(struct fsl_sdhc_softc *sc) +{ + + while (read4(sc, SDHC_PRSSTAT) & PRSSTAT_BWEN) { + write_block_pio(sc); + + /* + * TODO: should we check here whether data_offset >= data->len? + */ + } +} +#endif /* FSL_SDHC_USE_DMA */ + +static inline void +handle_command_intr(struct fsl_sdhc_softc *sc, uint32_t irq_stat) +{ + struct mmc_command *cmd = sc->request->cmd; + + /* Handle errors. */ + if (irq_stat & IRQ_CTOE) { + cmd->error = MMC_ERR_TIMEOUT; + } else if (irq_stat & IRQ_CCE) { + cmd->error = MMC_ERR_BADCRC; + } else if (irq_stat & (IRQ_CEBE | IRQ_CIE)) { + cmd->error = MMC_ERR_FIFO; + } + + if (cmd->error) { + device_printf(sc->self, "Error interrupt occured\n"); + reset_controller_dat_cmd(sc); + return; + } + + if (sc->command_done) + return; + + if (irq_stat & IRQ_CC) { + sc->command_done = 1; + + if (cmd->flags & MMC_RSP_PRESENT) + get_response(sc); + } +} + +static inline void +handle_data_intr(struct fsl_sdhc_softc *sc, uint32_t irq_stat) +{ + struct mmc_command *cmd = sc->request->cmd; + + /* Handle errors. */ + if (irq_stat & IRQ_DTOE) { + cmd->error = MMC_ERR_TIMEOUT; + } else if (irq_stat & (IRQ_DCE | IRQ_DEBE)) { + cmd->error = MMC_ERR_BADCRC; + } else if (irq_stat & IRQ_ERROR_DATA_MASK) { + cmd->error = MMC_ERR_FAILED; + } + + if (cmd->error) { + device_printf(sc->self, "Error interrupt occured\n"); + sc->data_done = 1; + reset_controller_dat_cmd(sc); + return; + } + + if (sc->data_done) + return; + +#ifdef FSL_SDHC_NO_DMA + if (irq_stat & IRQ_BRR) { + pio_read_transfer(sc); + } + + if (irq_stat & IRQ_BWR) { + pio_write_transfer(sc); + } +#else + if (irq_stat & IRQ_DINT) { + struct mmc_data *data = sc->request->cmd->data; + + /* Synchronize DMA. */ + if (data->flags & MMC_DATA_READ) { + bus_dmamap_sync(sc->dma_tag, sc->dma_map, + BUS_DMASYNC_POSTREAD); + memcpy(data->data, sc->dma_mem, data->len); + } else { + bus_dmamap_sync(sc->dma_tag, sc->dma_map, + BUS_DMASYNC_POSTWRITE); + } + + /* + * TODO: For multiple block transfers, address of dma memory + * in DSADDR register should be set to the beginning of the + * segment here. Also offset to data pointer should be handled. + */ + } +#endif + + if (irq_stat & IRQ_TC) + sc->data_done = 1; +} + +static void +interrupt_handler(void *arg) +{ + struct fsl_sdhc_softc *sc = (struct fsl_sdhc_softc *)arg; + uint32_t irq_stat; + + mtx_lock(&sc->mtx); + + irq_stat = read4(sc, SDHC_IRQSTAT); + + /* Card interrupt. */ + if (irq_stat & IRQ_CINT) { + DPRINTF("Card interrupt recievied\n"); + + } + + /* Card insertion interrupt. */ + if (irq_stat & IRQ_CINS) { + clear_bit(sc, SDHC_IRQSIGEN, IRQ_CINS); + clear_bit(sc, SDHC_IRQSTATEN, IRQ_CINS); + set_bit(sc, SDHC_IRQSIGEN, IRQ_CRM); + set_bit(sc, SDHC_IRQSTATEN, IRQ_CRM); + + callout_reset(&sc->card_detect_callout, hz / 2, + card_detect_delay, sc); + } + + /* Card removal interrupt. */ + if (irq_stat & IRQ_CRM) { + clear_bit(sc, SDHC_IRQSIGEN, IRQ_CRM); + clear_bit(sc, SDHC_IRQSTATEN, IRQ_CRM); + set_bit(sc, SDHC_IRQSIGEN, IRQ_CINS); + set_bit(sc, SDHC_IRQSTATEN, IRQ_CINS); + + callout_stop(&sc->card_detect_callout); + taskqueue_enqueue(taskqueue_swi_giant, &sc->card_detect_task); + } + + /* Handle request interrupts. */ + if (sc->request) { + handle_command_intr(sc, irq_stat); + handle_data_intr(sc, irq_stat); + + /* + * Finalize request when transfer is done successfully + * or was interrupted due to error. + */ + if ((sc->data_done && sc->command_done) || + (sc->request->cmd->error)) + finalize_request(sc); + } + + /* Clear status register. */ + write4(sc, SDHC_IRQSTAT, irq_stat); + + mtx_unlock(&sc->mtx); +} + +#ifndef FSL_SDHC_NO_DMA +static void +dma_get_phys_addr(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +{ + + if (error != 0) + return; + + /* Get first segment's physical address. */ + *(bus_addr_t *)arg = segs->ds_addr; +} + +static int +init_dma(struct fsl_sdhc_softc *sc) +{ + device_t self = sc->self; + int err; + + err = bus_dma_tag_create(bus_get_dma_tag(self), + FSL_SDHC_DMA_BLOCK_SIZE, 0, BUS_SPACE_MAXADDR_32BIT, + BUS_SPACE_MAXADDR, NULL, NULL, FSL_SDHC_DMA_BLOCK_SIZE, 1, + FSL_SDHC_DMA_BLOCK_SIZE, BUS_DMA_ALLOCNOW, NULL, NULL, + &sc->dma_tag); + + if (err) { + device_printf(self, "Could not create DMA tag!\n"); + return (-1); + } + + err = bus_dmamem_alloc(sc->dma_tag, (void **)&(sc->dma_mem), + BUS_DMA_NOWAIT | BUS_DMA_NOCACHE, &sc->dma_map); + if (err) { + device_printf(self, "Could not allocate DMA memory!\n"); + goto fail1; + } + + err = bus_dmamap_load(sc->dma_tag, sc->dma_map, (void *)sc->dma_mem, + FSL_SDHC_DMA_BLOCK_SIZE, dma_get_phys_addr, &sc->dma_phys, 0); + if (err) { + device_printf(self, "Could not load DMA map!\n"); + goto fail2; + } + + return (0); + +fail2: + bus_dmamem_free(sc->dma_tag, sc->dma_mem, sc->dma_map); +fail1: + bus_dma_tag_destroy(sc->dma_tag); + + return (-1); +} +#endif /* FSL_SDHC_NO_DMA */ + +static uint32_t +set_xfertyp_register(const struct mmc_command *cmd) +{ + uint32_t xfertyp = 0; + + /* Set command index. */ + xfertyp |= cmd->opcode << CMDINX_SHIFT; + + /* Set command type. */ + if (cmd->opcode == MMC_STOP_TRANSMISSION) + xfertyp |= CMDTYP_ABORT; + + /* Set data preset select. */ + if (cmd->data) { + xfertyp |= XFERTYP_DPSEL; + + /* Set transfer direction. */ + if (cmd->data->flags & MMC_DATA_READ) + xfertyp |= XFERTYP_DTDSEL; + } + + /* Set command index check. */ + if (cmd->flags & MMC_RSP_OPCODE) + xfertyp |= XFERTYP_CICEN; + + /* Set command CRC check. */ + if (cmd->flags & MMC_RSP_CRC) + xfertyp |= XFERTYP_CCCEN; + + /* Set response type */ + if (!(cmd->flags & MMC_RSP_PRESENT)) + xfertyp |= RSPTYP_NONE; + else if (cmd->flags & MMC_RSP_136) + xfertyp |= RSPTYP_136; + else if (cmd->flags & MMC_RSP_BUSY) + xfertyp |= RSPTYP_48_BUSY; + else + xfertyp |= RSPTYP_48; + +#ifndef FSL_SDHC_NO_DMA + /* Enable DMA */ + xfertyp |= XFERTYP_DMAEN; +#endif + + return (xfertyp); +} + +static uint32_t +set_blkattr_register(const struct mmc_data *data) +{ + + if (data->len <= FSL_SDHC_MAX_BLOCK_SIZE) { + /* One block transfer. */ + return (BLKATTR_BLOCK_COUNT(1) | ((data->len) & + BLKATTR_BLKSZE)); + } + + /* TODO: Write code here for multi-block transfers. */ + return (0); +} + +/** + * Initiate data transfer. Interrupt handler will finalize it. + * @todo Implement multi-block transfers. + * @param sc + * @param cmd + */ +static int +start_data(struct fsl_sdhc_softc *sc, struct mmc_data *data) +{ + uint32_t reg; + + if ((uint32_t)data->data & 0x3) { + device_printf(sc->self, "32-bit unaligned data pointer in " + "request\n"); + return (-1); + } + + sc->data_done = 0; + +#ifdef FSL_SDHC_NO_DMA + sc->data_ptr = data->data; + sc->data_offset = 0; +#else + /* Write DMA address register. */ + write4(sc, SDHC_DSADDR, sc->dma_phys); + + /* Synchronize DMA. */ + if (data->flags & MMC_DATA_READ) { + bus_dmamap_sync(sc->dma_tag, sc->dma_map, + BUS_DMASYNC_PREREAD); + } else { + memcpy(sc->dma_mem, data->data, data->len); + bus_dmamap_sync(sc->dma_tag, sc->dma_map, + BUS_DMASYNC_PREWRITE); + } +#endif + /* Set block size and count. */ + reg = set_blkattr_register(data); + if (reg == 0) { + device_printf(sc->self, "Requested unsupported multi-block " + "transfer.\n"); + return (-1); + } + write4(sc, SDHC_BLKATTR, reg); + + return (0); +} + +static int +start_command(struct fsl_sdhc_softc *sc, struct mmc_command *cmd) +{ + struct mmc_request *req = sc->request; + uint32_t mask; + uint32_t xfertyp; + int err; + + DPRINTF("opcode %d, flags 0x%08x\n", cmd->opcode, cmd->flags); + DPRINTF("PRSSTAT = 0x%08x\n", read4(sc, SDHC_PRSSTAT)); + + sc->command_done = 0; + + cmd->error = MMC_ERR_NONE; + + /* TODO: should we check here for card presence and clock settings? */ + + /* Always wait for free CMD line. */ + mask = SDHC_CMD_LINE; + /* Wait for free DAT if we have data or busy signal. */ + if (cmd->data || (cmd->flags & MMC_RSP_BUSY)) + mask |= SDHC_DAT_LINE; + /* We shouldn't wait for DAT for stop commands. */ + if (cmd == req->stop) + mask &= ~SDHC_DAT_LINE; + err = wait_for_free_line(sc, mask); + if (err != 0) { + device_printf(sc->self, "Controller never released inhibit " + "bit(s).\n"); + reset_controller_dat_cmd(sc); + cmd->error = MMC_ERR_FAILED; + sc->request = NULL; + req->done(req); + return (-1); + } + + xfertyp = set_xfertyp_register(cmd); + + if (cmd->data != NULL) { + err = start_data(sc, cmd->data); + if (err != 0) { + device_printf(sc->self, + "Data transfer request failed\n"); + reset_controller_dat_cmd(sc); + cmd->error = MMC_ERR_FAILED; + sc->request = NULL; + req->done(req); + return (-1); + } + } + + write4(sc, SDHC_CMDARG, cmd->arg); + write4(sc, SDHC_XFERTYP, xfertyp); + + DPRINTF("XFERTYP = 0x%08x\n", xfertyp); + DPRINTF("CMDARG = 0x%08x\n", cmd->arg); + + return (0); +} + +#ifdef DEBUG +static void +dump_registers(struct fsl_sdhc_softc *sc) +{ + printf("PRSSTAT = 0x%08x\n", read4(sc, SDHC_PRSSTAT)); + printf("PROCTL = 0x%08x\n", read4(sc, SDHC_PROCTL)); + printf("PMUXCR = 0x%08x\n", ccsr_read4(OCP85XX_PMUXCR)); + printf("HOSTCAPBLT = 0x%08x\n", read4(sc, SDHC_HOSTCAPBLT)); + printf("IRQSTAT = 0x%08x\n", read4(sc, SDHC_IRQSTAT)); + printf("IRQSTATEN = 0x%08x\n", read4(sc, SDHC_IRQSTATEN)); + printf("IRQSIGEN = 0x%08x\n", read4(sc, SDHC_IRQSIGEN)); + printf("WML = 0x%08x\n", read4(sc, SDHC_WML)); + printf("DSADDR = 0x%08x\n", read4(sc, SDHC_DSADDR)); + printf("XFERTYP = 0x%08x\n", read4(sc, SDHC_XFERTYP)); + printf("ECMCR = 0x%08x\n", ccsr_read4(OCP85XX_ECMCR)); + printf("DCR = 0x%08x\n", read4(sc, SDHC_DCR)); +} +#endif + +/***************************************************************************** + * Public methods + *****************************************************************************/ +/* + * Device interface methods. + */ +static int +fsl_sdhc_probe(device_t self) +{ + static const char *desc = + "Freescale Enhanced Secure Digital Host Controller"; + + if (!ofw_bus_is_compatible(self, "fsl,p2020-esdhc") && + !ofw_bus_is_compatible(self, "fsl,esdhc")) + return (ENXIO); + + device_set_desc(self, desc); + + return (BUS_PROBE_VENDOR); +} + +static int +fsl_sdhc_attach(device_t self) +{ + struct fsl_sdhc_softc *sc; + + sc = device_get_softc(self); + + sc->self = self; + + mtx_init(&sc->mtx, device_get_nameunit(self), NULL, MTX_DEF); + + /* Setup memory resource */ + sc->mem_rid = 0; + sc->mem_resource = bus_alloc_resource_any(self, SYS_RES_MEMORY, + &sc->mem_rid, RF_ACTIVE); + if (sc->mem_resource == NULL) { + device_printf(self, "Could not allocate memory.\n"); + goto fail; + } + sc->bst = rman_get_bustag(sc->mem_resource); + sc->bsh = rman_get_bushandle(sc->mem_resource); + + /* Setup interrupt resource. */ + sc->irq_rid = 0; + sc->irq_resource = bus_alloc_resource_any(self, SYS_RES_IRQ, + &sc->irq_rid, RF_ACTIVE); + if (sc->irq_resource == NULL) { + device_printf(self, "Could not allocate interrupt.\n"); + goto fail; + } + if (bus_setup_intr(self, sc->irq_resource, INTR_TYPE_MISC | + INTR_MPSAFE, NULL, interrupt_handler, sc, &sc->ihl) != 0) { + device_printf(self, "Could not setup interrupt.\n"); + goto fail; + } + + /* Setup DMA. */ +#ifndef FSL_SDHC_NO_DMA + if (init_dma(sc) != 0) { + device_printf(self, "Could not setup DMA\n"); + } +#endif + sc->bus_busy = 0; + sc->platform_clock = get_platform_clock(sc); + if (sc->platform_clock == 0) { + device_printf(self, "Could not get platform clock.\n"); + goto fail; + } + sc->command_done = 1; + sc->data_done = 1; + + /* Init card detection task. */ + TASK_INIT(&sc->card_detect_task, 0, card_detect_task, sc); + callout_init(&sc->card_detect_callout, 1); + + reset_controller_all(sc); + init_controller(sc); + set_clock(sc, 400000); + send_80_clock_ticks(sc); + +#ifdef DEBUG + dump_registers(sc); +#endif + + return (0); + +fail: + fsl_sdhc_detach(self); + return (ENXIO); +} + +static int +fsl_sdhc_detach(device_t self) +{ + struct fsl_sdhc_softc *sc = device_get_softc(self); + int err; + + if (sc->child) + device_delete_child(self, sc->child); + + taskqueue_drain(taskqueue_swi_giant, &sc->card_detect_task); + +#ifndef FSL_SDHC_NO_DMA + bus_dmamap_unload(sc->dma_tag, sc->dma_map); + bus_dmamem_free(sc->dma_tag, sc->dma_mem, sc->dma_map); + bus_dma_tag_destroy(sc->dma_tag); +#endif + + if (sc->ihl != NULL) { + err = bus_teardown_intr(self, sc->irq_resource, sc->ihl); + if (err) + return (err); + } + if (sc->irq_resource != NULL) { + err = bus_release_resource(self, SYS_RES_IRQ, sc->irq_rid, + sc->irq_resource); + if (err) + return (err); + + } + if (sc->mem_resource != NULL) { + err = bus_release_resource(self, SYS_RES_MEMORY, sc->mem_rid, + sc->mem_resource); + if (err) + return (err); + } + + mtx_destroy(&sc->mtx); + + return (0); +} + + +/* + * Bus interface methods. + */ +static int +fsl_sdhc_read_ivar(device_t self, device_t child, int index, + uintptr_t *result) +{ + struct mmc_host *host = device_get_ivars(child); + + switch (index) { + case MMCBR_IVAR_BUS_MODE: + *(int *)result = host->ios.bus_mode; + break; + case MMCBR_IVAR_BUS_WIDTH: + *(int *)result = host->ios.bus_width; + break; + case MMCBR_IVAR_CHIP_SELECT: + *(int *)result = host->ios.chip_select; + break; + case MMCBR_IVAR_CLOCK: + *(int *)result = host->ios.clock; + break; + case MMCBR_IVAR_F_MIN: + *(int *)result = host->f_min; + break; + case MMCBR_IVAR_F_MAX: + *(int *)result = host->f_max; + break; + case MMCBR_IVAR_HOST_OCR: + *(int *)result = host->host_ocr; + break; + case MMCBR_IVAR_MODE: + *(int *)result = host->mode; + break; + case MMCBR_IVAR_OCR: + *(int *)result = host->ocr; + break; + case MMCBR_IVAR_POWER_MODE: + *(int *)result = host->ios.power_mode; + break; + case MMCBR_IVAR_VDD: + *(int *)result = host->ios.vdd; + break; + default: + return (EINVAL); + } + + return (0); +} + +static int +fsl_sdhc_write_ivar(device_t self, device_t child, int index, + uintptr_t value) +{ + struct mmc_host *host = device_get_ivars(child); + + switch (index) { + case MMCBR_IVAR_BUS_MODE: + host->ios.bus_mode = value; + break; + case MMCBR_IVAR_BUS_WIDTH: + host->ios.bus_width = value; + break; + case MMCBR_IVAR_CHIP_SELECT: + host->ios.chip_select = value; + break; + case MMCBR_IVAR_CLOCK: + host->ios.clock = value; + break; + case MMCBR_IVAR_MODE: + host->mode = value; + break; + case MMCBR_IVAR_OCR: + host->ocr = value; + break; + case MMCBR_IVAR_POWER_MODE: + host->ios.power_mode = value; + break; + case MMCBR_IVAR_VDD: + host->ios.vdd = value; + break; + case MMCBR_IVAR_HOST_OCR: + case MMCBR_IVAR_F_MIN: + case MMCBR_IVAR_F_MAX: + default: + /* Instance variable not writable. */ + return (EINVAL); + } + + return (0); +} + + +/* + * MMC bridge methods. + */ +static int +fsl_sdhc_update_ios(device_t self, device_t reqdev) +{ + struct fsl_sdhc_softc *sc = device_get_softc(self); + struct mmc_host *host = device_get_ivars(reqdev); + struct mmc_ios *ios = &host->ios; + + mtx_lock(&sc->mtx); + + /* Full reset on bus power down to clear from any state. */ + if (ios->power_mode == power_off) { + reset_controller_all(sc); + init_controller(sc); + } + + set_clock(sc, ios->clock); + set_bus_width(sc, ios->bus_width); + + mtx_unlock(&sc->mtx); + + return (0); +} + +static int +fsl_sdhc_request(device_t self, device_t reqdev, struct mmc_request *req) +{ + struct fsl_sdhc_softc *sc = device_get_softc(self); + int err; + + mtx_lock(&sc->mtx); + + sc->request = req; + err = start_command(sc, req->cmd); + + mtx_unlock(&sc->mtx); + + return (err); +} + +static int +fsl_sdhc_get_ro(device_t self, device_t reqdev) +{ + struct fsl_sdhc_softc *sc = device_get_softc(self); + + /* Wouldn't it be faster using branching (if {}) ?? */ + return (((read4(sc, SDHC_PRSSTAT) & PRSSTAT_WPSPL) >> 19) ^ 0x1); +} + +static int +fsl_sdhc_acquire_host(device_t self, device_t reqdev) +{ + struct fsl_sdhc_softc *sc = device_get_softc(self); + int retval = 0; + + mtx_lock(&sc->mtx); + + while (sc->bus_busy) + retval = mtx_sleep(sc, &sc->mtx, PZERO, "sdhcah", 0); + ++(sc->bus_busy); + + mtx_unlock(&sc->mtx); + + return (retval); +} + +static int +fsl_sdhc_release_host(device_t self, device_t reqdev) +{ + struct fsl_sdhc_softc *sc = device_get_softc(self); + + mtx_lock(&sc->mtx); + --(sc->bus_busy); + mtx_unlock(&sc->mtx); + wakeup(sc); + + return (0); +} diff --git a/sys/powerpc/mpc85xx/fsl_sdhc.h b/sys/powerpc/mpc85xx/fsl_sdhc.h new file mode 100644 index 00000000000..9bd2e3d3c4d --- /dev/null +++ b/sys/powerpc/mpc85xx/fsl_sdhc.h @@ -0,0 +1,297 @@ +/*- + * Copyright (c) 2011-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef FSL_SDHC_H_ +#define FSL_SDHC_H_ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "mmcbr_if.h" + + +/***************************************************************************** + * Private defines + *****************************************************************************/ +struct slot { + uint32_t clock; +}; + +struct fsl_sdhc_softc { + device_t self; + device_t child; + + bus_space_handle_t bsh; + bus_space_tag_t bst; + + struct resource *mem_resource; + int mem_rid; + struct resource *irq_resource; + int irq_rid; + void *ihl; + + bus_dma_tag_t dma_tag; + bus_dmamap_t dma_map; + uint32_t* dma_mem; + bus_addr_t dma_phys; + + struct mtx mtx; + + struct task card_detect_task; + struct callout card_detect_callout; + + struct mmc_host mmc_host; + + struct slot slot; + uint32_t bus_busy; + uint32_t platform_clock; + + struct mmc_request *request; + int data_done; + int command_done; + int use_dma; + uint32_t* data_ptr; + uint32_t data_offset; +}; + +#define FSL_SDHC_RESET_DELAY 50 + +#define FSL_SDHC_BASE_CLOCK_DIV (2) +#define FSL_SDHC_MAX_DIV (FSL_SDHC_BASE_CLOCK_DIV * 256 * 16) +#define FSL_SDHC_MIN_DIV (FSL_SDHC_BASE_CLOCK_DIV * 2) +#define FSL_SDHC_MAX_CLOCK (50000000) + +#define FSL_SDHC_MAX_BLOCK_COUNT (65535) +#define FSL_SDHC_MAX_BLOCK_SIZE (4096) + +#define FSL_SDHC_FIFO_BUF_SIZE (64) /* Water-mark level. */ +#define FSL_SDHC_FIFO_BUF_WORDS (FSL_SDHC_FIFO_BUF_SIZE / 4) + +#define FSL_SDHC_DMA_SEGMENT_SIZE (1024) +#define FSL_SDHC_DMA_ALIGNMENT (4) +#define FSL_SDHC_DMA_BLOCK_SIZE FSL_SDHC_MAX_BLOCK_SIZE + + +/* + * Offsets of SD HC registers + */ +enum sdhc_reg_off { + SDHC_DSADDR = 0x000, + SDHC_BLKATTR = 0x004, + SDHC_CMDARG = 0x008, + SDHC_XFERTYP = 0x00c, + SDHC_CMDRSP0 = 0x010, + SDHC_CMDRSP1 = 0x014, + SDHC_CMDRSP2 = 0x018, + SDHC_CMDRSP3 = 0x01c, + SDHC_DATPORT = 0x020, + SDHC_PRSSTAT = 0x024, + SDHC_PROCTL = 0x028, + SDHC_SYSCTL = 0x02c, + SDHC_IRQSTAT = 0x030, + SDHC_IRQSTATEN = 0x034, + SDHC_IRQSIGEN = 0x038, + SDHC_AUTOC12ERR = 0x03c, + SDHC_HOSTCAPBLT = 0x040, + SDHC_WML = 0x044, + SDHC_FEVT = 0x050, + SDHC_HOSTVER = 0x0fc, + SDHC_DCR = 0x40c +}; + +enum sysctl_bit { + SYSCTL_INITA = 0x08000000, + SYSCTL_RSTD = 0x04000000, + SYSCTL_RSTC = 0x02000000, + SYSCTL_RSTA = 0x01000000, + SYSCTL_DTOCV = 0x000f0000, + SYSCTL_SDCLKFS = 0x0000ff00, + SYSCTL_DVS = 0x000000f0, + SYSCTL_PEREN = 0x00000004, + SYSCTL_HCKEN = 0x00000002, + SYSCTL_IPGEN = 0x00000001 +}; + +#define HEX_LEFT_SHIFT(x) (4 * x) +enum sysctl_shift { + SHIFT_DTOCV = HEX_LEFT_SHIFT(4), + SHIFT_SDCLKFS = HEX_LEFT_SHIFT(2), + SHIFT_DVS = HEX_LEFT_SHIFT(1) +}; + +enum proctl_bit { + PROCTL_WECRM = 0x04000000, + PROCTL_WECINS = 0x02000000, + PROCTL_WECINT = 0x01000000, + PROCTL_RWCTL = 0x00040000, + PROCTL_CREQ = 0x00020000, + PROCTL_SABGREQ = 0x00010000, + PROCTL_CDSS = 0x00000080, + PROCTL_CDTL = 0x00000040, + PROCTL_EMODE = 0x00000030, + PROCTL_D3CD = 0x00000008, + PROCTL_DTW = 0x00000006 +}; + +enum dtw { + DTW_1 = 0x00000000, + DTW_4 = 0x00000002, + DTW_8 = 0x00000004 +}; + +enum prsstat_bit { + PRSSTAT_DLSL = 0xff000000, + PRSSTAT_CLSL = 0x00800000, + PRSSTAT_WPSPL = 0x00080000, + PRSSTAT_CDPL = 0x00040000, + PRSSTAT_CINS = 0x00010000, + PRSSTAT_BREN = 0x00000800, + PRSSTAT_BWEN = 0x00000400, + PRSSTAT_RTA = 0x00000200, + PRSSTAT_WTA = 0x00000100, + PRSSTAT_SDOFF = 0x00000080, + PRSSTAT_PEROFF = 0x00000040, + PRSSTAT_HCKOFF = 0x00000020, + PRSSTAT_IPGOFF = 0x00000010, + PRSSTAT_DLA = 0x00000004, + PRSSTAT_CDIHB = 0x00000002, + PRSSTAT_CIHB = 0x00000001 + +}; + +enum irq_bits { + IRQ_DMAE = 0x10000000, + IRQ_AC12E = 0x01000000, + IRQ_DEBE = 0x00400000, + IRQ_DCE = 0x00200000, + IRQ_DTOE = 0x00100000, + IRQ_CIE = 0x00080000, + IRQ_CEBE = 0x00040000, + IRQ_CCE = 0x00020000, + IRQ_CTOE = 0x00010000, + IRQ_CINT = 0x00000100, + IRQ_CRM = 0x00000080, + IRQ_CINS = 0x00000040, + IRQ_BRR = 0x00000020, + IRQ_BWR = 0x00000010, + IRQ_DINT = 0x00000008, + IRQ_BGE = 0x00000004, + IRQ_TC = 0x00000002, + IRQ_CC = 0x00000001 +}; + +enum irq_masks { + IRQ_ERROR_DATA_MASK = IRQ_DMAE | IRQ_DEBE | IRQ_DCE | IRQ_DTOE, + IRQ_ERROR_CMD_MASK = IRQ_AC12E | IRQ_CIE | IRQ_CTOE | IRQ_CCE | + IRQ_CEBE +}; + +enum dcr_bits { + DCR_PRI = 0x0000c000, + DCR_SNOOP = 0x00000040, + DCR_AHB2MAG_BYPASS = 0x00000020, + DCR_RD_SAFE = 0x00000004, + DCR_RD_PFE = 0x00000002, + DCR_RD_PF_SIZE = 0x00000001 +}; + +#define DCR_PRI_SHIFT (14) + +enum xfertyp_bits { + XFERTYP_CMDINX = 0x3f000000, + XFERTYP_CMDTYP = 0x00c00000, + XFERTYP_DPSEL = 0x00200000, + XFERTYP_CICEN = 0x00100000, + XFERTYP_CCCEN = 0x00080000, + XFERTYP_RSPTYP = 0x00030000, + XFERTYP_MSBSEL = 0x00000020, + XFERTYP_DTDSEL = 0x00000010, + XFERTYP_AC12EN = 0x00000004, + XFERTYP_BCEN = 0x00000002, + XFERTYP_DMAEN = 0x00000001 +}; + +#define CMDINX_SHIFT (24) + +enum xfertyp_cmdtyp { + CMDTYP_NORMAL = 0x00000000, + CMDYTP_SUSPEND = 0x00400000, + CMDTYP_RESUME = 0x00800000, + CMDTYP_ABORT = 0x00c00000 +}; + +enum xfertyp_rsptyp { + RSPTYP_NONE = 0x00000000, + RSPTYP_136 = 0x00010000, + RSPTYP_48 = 0x00020000, + RSPTYP_48_BUSY = 0x00030000 +}; + +enum blkattr_bits { + BLKATTR_BLKSZE = 0x00001fff, + BLKATTR_BLKCNT = 0xffff0000 +}; +#define BLKATTR_BLOCK_COUNT(x) (x << 16) + +enum wml_bits { + WR_WML = 0x00ff0000, + RD_WML = 0x000000ff, +}; + +enum sdhc_bit_mask { + MASK_CLOCK_CONTROL = 0x0000ffff, + MASK_IRQ_ALL = IRQ_DMAE | IRQ_AC12E | IRQ_DEBE | IRQ_DCE | + IRQ_DTOE | IRQ_CIE | IRQ_CEBE | IRQ_CCE | + IRQ_CTOE | IRQ_CINT | IRQ_CRM | IRQ_CINS | + IRQ_BRR | IRQ_BWR | IRQ_DINT | IRQ_BGE | + IRQ_TC | IRQ_CC, +}; + +enum sdhc_line { + SDHC_DAT_LINE = 0x2, + SDHC_CMD_LINE = 0x1 +}; + +#endif /* FSL_SDHC_H_ */ diff --git a/sys/powerpc/mpc85xx/i2c.c b/sys/powerpc/mpc85xx/i2c.c index 5b698f1b957..f21c845c058 100644 --- a/sys/powerpc/mpc85xx/i2c.c +++ b/sys/powerpc/mpc85xx/i2c.c @@ -72,9 +72,6 @@ __FBSDID("$FreeBSD$"); #define I2C_BAUD_RATE_DEF 0x3F #define I2C_DFSSR_DIV 0x10 -#define DEBUG -#undef DEBUG - #ifdef DEBUG #define debugf(fmt, args...) do { printf("%s(): ", __func__); printf(fmt,##args); } while (0) #else diff --git a/sys/powerpc/mpc85xx/lbc.c b/sys/powerpc/mpc85xx/lbc.c index e993bced9ae..cbcd9fc2e66 100644 --- a/sys/powerpc/mpc85xx/lbc.c +++ b/sys/powerpc/mpc85xx/lbc.c @@ -56,9 +56,6 @@ __FBSDID("$FreeBSD$"); #include "ofw_bus_if.h" #include "lbc.h" -#define DEBUG -#undef DEBUG - #ifdef DEBUG #define debugf(fmt, args...) do { printf("%s(): ", __func__); \ printf(fmt,##args); } while (0) @@ -66,20 +63,6 @@ __FBSDID("$FreeBSD$"); #define debugf(fmt, args...) #endif -static __inline void -lbc_write_reg(struct lbc_softc *sc, bus_size_t off, uint32_t val) -{ - - bus_space_write_4(sc->sc_bst, sc->sc_bsh, off, val); -} - -static __inline uint32_t -lbc_read_reg(struct lbc_softc *sc, bus_size_t off) -{ - - return (bus_space_read_4(sc->sc_bst, sc->sc_bsh, off)); -} - static MALLOC_DEFINE(M_LBC, "localbus", "localbus devices information"); static int lbc_probe(device_t); @@ -161,46 +144,123 @@ lbc_address_mask(uint32_t size) static void lbc_banks_unmap(struct lbc_softc *sc) { - int i; + int r; - for (i = 0; i < LBC_DEV_MAX; i++) { - if (sc->sc_banks[i].size == 0) - continue; + r = 0; + while (r < LBC_DEV_MAX) { + if (sc->sc_range[r].size == 0) + return; - law_disable(OCP85XX_TGTIF_LBC, sc->sc_banks[i].pa, - sc->sc_banks[i].size); - pmap_unmapdev(sc->sc_banks[i].va, sc->sc_banks[i].size); + pmap_unmapdev(sc->sc_range[r].kva, sc->sc_range[r].size); + law_disable(OCP85XX_TGTIF_LBC, sc->sc_range[r].addr, + sc->sc_range[r].size); + r++; } } static int lbc_banks_map(struct lbc_softc *sc) { - u_long start, size; - int error, i; + vm_paddr_t end, start; + vm_size_t size; + u_int i, r, ranges, s; + int error; + bzero(sc->sc_range, sizeof(sc->sc_range)); + + /* + * Determine number of discontiguous address ranges to program. + */ + ranges = 0; for (i = 0; i < LBC_DEV_MAX; i++) { - if (sc->sc_banks[i].size == 0) + size = sc->sc_banks[i].size; + if (size == 0) continue; - /* Physical address start/size. */ - start = sc->sc_banks[i].pa; - size = sc->sc_banks[i].size; + start = sc->sc_banks[i].addr; + for (r = 0; r < ranges; r++) { + /* Avoid wrap-around bugs. */ + end = sc->sc_range[r].addr - 1 + sc->sc_range[r].size; + if (start > 0 && end == start - 1) { + sc->sc_range[r].size += size; + break; + } + /* Avoid wrap-around bugs. */ + end = start - 1 + size; + if (sc->sc_range[r].addr > 0 && + end == sc->sc_range[r].addr - 1) { + sc->sc_range[r].addr = start; + sc->sc_range[r].size += size; + break; + } + } + if (r == ranges) { + /* New range; add using insertion sort */ + r = 0; + while (r < ranges && sc->sc_range[r].addr < start) + r++; + for (s = ranges; s > r; s--) + sc->sc_range[s] = sc->sc_range[s-1]; + sc->sc_range[r].addr = start; + sc->sc_range[r].size = size; + ranges++; + } + } - /* - * Configure LAW for this LBC bank (CS) and map its physical - * memory region into KVA. - */ + /* + * Ranges are sorted so quickly go over the list to merge ranges + * that grew toward each other while building the ranges. + */ + r = 0; + while (r < ranges - 1) { + end = sc->sc_range[r].addr + sc->sc_range[r].size; + if (end != sc->sc_range[r+1].addr) { + r++; + continue; + } + sc->sc_range[r].size += sc->sc_range[r+1].size; + for (s = r + 1; s < ranges - 1; s++) + sc->sc_range[s] = sc->sc_range[s+1]; + bzero(&sc->sc_range[s], sizeof(sc->sc_range[s])); + ranges--; + } + + /* + * Configure LAW for the LBC ranges and map the physical memory + * range into KVA. + */ + for (r = 0; r < ranges; r++) { + start = sc->sc_range[r].addr; + size = sc->sc_range[r].size; error = law_enable(OCP85XX_TGTIF_LBC, start, size); if (error) return (error); + sc->sc_range[r].kva = (vm_offset_t)pmap_mapdev(start, size); + } - sc->sc_banks[i].va = (vm_offset_t)pmap_mapdev(start, size); - if (sc->sc_banks[i].va == 0) { - lbc_banks_unmap(sc); - return (ENOSPC); + /* XXX: need something better here? */ + if (ranges == 0) + return (EINVAL); + + /* Assign KVA to banks based on the enclosing range. */ + for (i = 0; i < LBC_DEV_MAX; i++) { + size = sc->sc_banks[i].size; + if (size == 0) + continue; + + start = sc->sc_banks[i].addr; + for (r = 0; r < ranges; r++) { + end = sc->sc_range[r].addr - 1 + sc->sc_range[r].size; + if (start >= sc->sc_range[r].addr && + start - 1 + size <= end) + break; + } + if (r < ranges) { + sc->sc_banks[i].kva = sc->sc_range[r].kva + + (start - sc->sc_range[r].addr); } } + return (0); } @@ -215,12 +275,11 @@ lbc_banks_enable(struct lbc_softc *sc) size = sc->sc_banks[i].size; if (size == 0) continue; + /* * Compute and program BR value. */ - regval = 0; - regval |= sc->sc_banks[i].pa; - + regval = sc->sc_banks[i].addr; switch (sc->sc_banks[i].width) { case 8: regval |= (1 << 11); @@ -240,24 +299,22 @@ lbc_banks_enable(struct lbc_softc *sc) regval |= (sc->sc_banks[i].msel << 5); regval |= (sc->sc_banks[i].atom << 2); regval |= 1; - - lbc_write_reg(sc, LBC85XX_BR(i), regval); + bus_space_write_4(sc->sc_bst, sc->sc_bsh, + LBC85XX_BR(i), regval); /* * Compute and program OR value. */ - regval = 0; - regval |= lbc_address_mask(size); - + regval = lbc_address_mask(size); switch (sc->sc_banks[i].msel) { case LBCRES_MSEL_GPCM: /* TODO Add flag support for option registers */ - regval |= 0x00000ff7; + regval |= 0x0ff7; break; case LBCRES_MSEL_FCM: - printf("FCM mode not supported yet!"); - error = ENOSYS; - goto fail; + /* TODO Add flag support for options register */ + regval |= 0x0796; + break; case LBCRES_MSEL_UPMA: case LBCRES_MSEL_UPMB: case LBCRES_MSEL_UPMC: @@ -265,27 +322,10 @@ lbc_banks_enable(struct lbc_softc *sc) error = ENOSYS; goto fail; } - lbc_write_reg(sc, LBC85XX_OR(i), regval); + bus_space_write_4(sc->sc_bst, sc->sc_bsh, + LBC85XX_OR(i), regval); } - /* - * Initialize configuration register: - * - enable Local Bus - * - set data buffer control signal function - * - disable parity byte select - * - set ECC parity type - * - set bus monitor timing and timer prescale - */ - lbc_write_reg(sc, LBC85XX_LBCR, 0); - - /* - * Initialize clock ratio register: - * - disable PLL bypass mode - * - configure LCLK delay cycles for the assertion of LALE - * - set system clock divider - */ - lbc_write_reg(sc, LBC85XX_LCRR, 0x00030008); - return (0); fail: @@ -348,7 +388,7 @@ fdt_lbc_reg_decode(phandle_t node, struct lbc_softc *sc, reg += addr_cells - 1 + size_cells; /* Calculate address range relative to VA base. */ - start = sc->sc_banks[bank].va + start; + start = sc->sc_banks[bank].kva + start; end = start + count - 1; debugf("reg addr bank = %d, start = %lx, end = %lx, " @@ -364,6 +404,18 @@ out: return (rv); } +static void +lbc_intr(void *arg) +{ + struct lbc_softc *sc = arg; + uint32_t ltesr; + + ltesr = bus_space_read_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LTESR); + sc->sc_ltesr = ltesr; + bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LTESR, ltesr); + wakeup(sc->sc_dev); +} + static int lbc_probe(device_t dev) { @@ -393,14 +445,59 @@ lbc_attach(device_t dev) sc = device_get_softc(dev); sc->sc_dev = dev; - sc->sc_rid = 0; - sc->sc_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_rid, + sc->sc_mrid = 0; + sc->sc_mres = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_mrid, RF_ACTIVE); - if (sc->sc_res == NULL) + if (sc->sc_mres == NULL) return (ENXIO); - sc->sc_bst = rman_get_bustag(sc->sc_res); - sc->sc_bsh = rman_get_bushandle(sc->sc_res); + sc->sc_bst = rman_get_bustag(sc->sc_mres); + sc->sc_bsh = rman_get_bushandle(sc->sc_mres); + + for (bank = 0; bank < LBC_DEV_MAX; bank++) { + bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_BR(bank), 0); + bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_OR(bank), 0); + } + + /* + * Initialize configuration register: + * - enable Local Bus + * - set data buffer control signal function + * - disable parity byte select + * - set ECC parity type + * - set bus monitor timing and timer prescale + */ + bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LBCR, 0); + + /* + * Initialize clock ratio register: + * - disable PLL bypass mode + * - configure LCLK delay cycles for the assertion of LALE + * - set system clock divider + */ + bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LCRR, 0x00030008); + + bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LTEDR, 0); + bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LTESR, ~0); + bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LTEIR, 0x64080001); + + sc->sc_irid = 0; + sc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->sc_irid, + RF_ACTIVE | RF_SHAREABLE); + if (sc->sc_ires != NULL) { + error = bus_setup_intr(dev, sc->sc_ires, + INTR_TYPE_MISC | INTR_MPSAFE, NULL, lbc_intr, sc, + &sc->sc_icookie); + if (error) { + device_printf(dev, "could not activate interrupt\n"); + bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irid, + sc->sc_ires); + sc->sc_ires = NULL; + } + } + + sc->sc_ltesr = ~0; + rangesptr = NULL; rm = &sc->sc_rman; @@ -479,7 +576,7 @@ lbc_attach(device_t dev) debugf("bank = %d, start = %lx, size = %lx\n", bank, start, size); - sc->sc_banks[bank].pa = start + offset; + sc->sc_banks[bank].addr = start + offset; sc->sc_banks[bank].size = size; /* @@ -552,7 +649,7 @@ lbc_attach(device_t dev) fail: free(rangesptr, M_OFWPROP); - bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_rid, sc->sc_res); + bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_mrid, sc->sc_mres); return (error); } @@ -676,3 +773,53 @@ lbc_get_devinfo(device_t bus, device_t child) di = device_get_ivars(child); return (&di->di_ofw); } + +void +lbc_write_reg(device_t child, u_int off, uint32_t val) +{ + device_t dev; + struct lbc_softc *sc; + + dev = device_get_parent(child); + + if (off >= 0x1000) { + device_printf(dev, "%s(%s): invalid offset %#x\n", + __func__, device_get_nameunit(child), off); + return; + } + + sc = device_get_softc(dev); + + if (off == LBC85XX_LTESR && sc->sc_ltesr != ~0u) { + sc->sc_ltesr ^= (val & sc->sc_ltesr); + return; + } + + if (off == LBC85XX_LTEATR && (val & 1) == 0) + sc->sc_ltesr = ~0u; + bus_space_write_4(sc->sc_bst, sc->sc_bsh, off, val); +} + +uint32_t +lbc_read_reg(device_t child, u_int off) +{ + device_t dev; + struct lbc_softc *sc; + uint32_t val; + + dev = device_get_parent(child); + + if (off >= 0x1000) { + device_printf(dev, "%s(%s): invalid offset %#x\n", + __func__, device_get_nameunit(child), off); + return (~0U); + } + + sc = device_get_softc(dev); + + if (off == LBC85XX_LTESR && sc->sc_ltesr != ~0U) + val = sc->sc_ltesr; + else + val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, off); + return (val); +} diff --git a/sys/powerpc/mpc85xx/lbc.h b/sys/powerpc/mpc85xx/lbc.h index ee58607661d..9b3ad9185cc 100644 --- a/sys/powerpc/mpc85xx/lbc.h +++ b/sys/powerpc/mpc85xx/lbc.h @@ -33,10 +33,35 @@ #define LBC_DEV_MAX 8 /* Local access registers */ -#define LBC85XX_BR(n) (8 * n) -#define LBC85XX_OR(n) (4 + (8 * n)) -#define LBC85XX_LBCR (0xd0) -#define LBC85XX_LCRR (0xd4) +#define LBC85XX_BR(n) (0x0 + (8 * n)) /* Base register 0-7 */ +#define LBC85XX_OR(n) (0x4 + (8 * n)) /* Options register 0-7 */ +#define LBC85XX_MAR 0x068 /* UPM address register */ +#define LBC85XX_MAMR 0x070 /* UPMA mode register */ +#define LBC85XX_MBMR 0x074 /* UPMB mode register */ +#define LBC85XX_MCMR 0x078 /* UPMC mode register */ +#define LBC85XX_MRTPR 0x084 /* Memory refresh timer prescaler */ +#define LBC85XX_MDR 0x088 /* UPM data register */ +#define LBC85XX_LSOR 0x090 /* Special operation initiation */ +#define LBC85XX_LURT 0x0a0 /* UPM refresh timer */ +#define LBC85XX_LSRT 0x0a4 /* SDRAM refresh timer */ +#define LBC85XX_LTESR 0x0b0 /* Transfer error status register */ +#define LBC85XX_LTEDR 0x0b4 /* Transfer error disable register */ +#define LBC85XX_LTEIR 0x0b8 /* Transfer error interrupt register */ +#define LBC85XX_LTEATR 0x0bc /* Transfer error attributes register */ +#define LBC85XX_LTEAR 0x0c0 /* Transfer error address register */ +#define LBC85XX_LTECCR 0x0c4 /* Transfer error ECC register */ +#define LBC85XX_LBCR 0x0d0 /* Configuration register */ +#define LBC85XX_LCRR 0x0d4 /* Clock ratio register */ +#define LBC85XX_FMR 0x0e0 /* Flash mode register */ +#define LBC85XX_FIR 0x0e4 /* Flash instruction register */ +#define LBC85XX_FCR 0x0e8 /* Flash command register */ +#define LBC85XX_FBAR 0x0ec /* Flash block address register */ +#define LBC85XX_FPAR 0x0f0 /* Flash page address register */ +#define LBC85XX_FBCR 0x0f4 /* Flash byte count register */ +#define LBC85XX_FECC0 0x100 /* Flash ECC block 0 register */ +#define LBC85XX_FECC1 0x104 /* Flash ECC block 0 register */ +#define LBC85XX_FECC2 0x108 /* Flash ECC block 0 register */ +#define LBC85XX_FECC3 0x10c /* Flash ECC block 0 register */ /* LBC machine select */ #define LBCRES_MSEL_GPCM 0 @@ -55,10 +80,16 @@ #define LBCRES_ATOM_RAWA 1 #define LBCRES_ATOM_WARA 2 +struct lbc_memrange { + vm_paddr_t addr; + vm_size_t size; + vm_offset_t kva; +}; + struct lbc_bank { - u_long pa; /* physical addr of the bank */ - u_long size; /* bank size */ - vm_offset_t va; /* VA of the bank */ + vm_paddr_t addr; /* physical addr of the bank */ + vm_size_t size; /* bank size */ + vm_offset_t kva; /* VA of the bank */ /* * XXX the following bank attributes do not have properties specified @@ -74,17 +105,25 @@ struct lbc_bank { struct lbc_softc { device_t sc_dev; - struct resource *sc_res; + + struct resource *sc_mres; bus_space_handle_t sc_bsh; bus_space_tag_t sc_bst; - int sc_rid; + int sc_mrid; + + int sc_irid; + struct resource *sc_ires; + void *sc_icookie; struct rman sc_rman; int sc_addr_cells; int sc_size_cells; + struct lbc_memrange sc_range[LBC_DEV_MAX]; struct lbc_bank sc_banks[LBC_DEV_MAX]; + + uint32_t sc_ltesr; }; struct lbc_devinfo { @@ -93,4 +132,7 @@ struct lbc_devinfo { int di_bank; }; +uint32_t lbc_read_reg(device_t child, u_int off); +void lbc_write_reg(device_t child, u_int off, uint32_t val); + #endif /* _MACHINE_LBC_H_ */ diff --git a/sys/powerpc/mpc85xx/mpc85xx.c b/sys/powerpc/mpc85xx/mpc85xx.c index e62f952c04a..0db5d5e0efe 100644 --- a/sys/powerpc/mpc85xx/mpc85xx.c +++ b/sys/powerpc/mpc85xx/mpc85xx.c @@ -88,6 +88,9 @@ law_enable(int trgt, u_long addr, u_long size) uint32_t bar, sr; int i, law_max; + if (size == 0) + return (0); + law_max = law_getmax(); bar = _LAW_BAR(addr); sr = _LAW_SR(trgt, size); @@ -168,7 +171,10 @@ law_pci_target(struct resource *res, int *trgt_mem, int *trgt_io) default: rv = ENXIO; } - *trgt_mem = *trgt_io = trgt; + if (rv == 0) { + *trgt_mem = trgt; + *trgt_io = trgt; + } return (rv); } diff --git a/sys/powerpc/mpc85xx/nexus.c b/sys/powerpc/mpc85xx/nexus.c index b0fff6a6499..5220d1e4c72 100644 --- a/sys/powerpc/mpc85xx/nexus.c +++ b/sys/powerpc/mpc85xx/nexus.c @@ -65,6 +65,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include + /* * Device interface */ @@ -75,6 +77,13 @@ static int nexus_activate_resource(device_t, device_t, int, int, static int nexus_deactivate_resource(device_t, device_t, int, int, struct resource *); +static int nexus_config_intr(device_t, int, enum intr_trigger, + enum intr_polarity); +static int nexus_setup_intr(device_t, device_t, struct resource *, int, + driver_filter_t *, driver_intr_t *, void *, void **); +static int nexus_teardown_intr(device_t, device_t, struct resource *, + void *); + static device_method_t nexus_methods[] = { /* Device interface */ DEVMETHOD(device_probe, nexus_probe), @@ -89,8 +98,9 @@ static device_method_t nexus_methods[] = { DEVMETHOD(bus_probe_nomatch, NULL), DEVMETHOD(bus_read_ivar, NULL), DEVMETHOD(bus_write_ivar, NULL), - DEVMETHOD(bus_setup_intr, NULL), - DEVMETHOD(bus_teardown_intr, NULL), + DEVMETHOD(bus_config_intr, nexus_config_intr), + DEVMETHOD(bus_setup_intr, nexus_setup_intr), + DEVMETHOD(bus_teardown_intr, nexus_teardown_intr), DEVMETHOD(bus_alloc_resource, NULL), DEVMETHOD(bus_activate_resource, nexus_activate_resource), DEVMETHOD(bus_deactivate_resource, nexus_deactivate_resource), @@ -143,3 +153,49 @@ nexus_deactivate_resource(device_t bus, device_t child, int type, int rid, /* Not much to be done yet... */ return (rman_deactivate_resource(res)); } + +static int +nexus_config_intr(device_t bus, int irq, enum intr_trigger trig, + enum intr_polarity pol) +{ + + return (powerpc_config_intr(irq, trig, pol)); +} + +static int +nexus_setup_intr(device_t bus, device_t child, struct resource *res, int flags, + driver_filter_t *ifilt, driver_intr_t *ihand, void *arg, void **cookiep) +{ + int error; + + *cookiep = NULL; + + /* somebody tried to setup an irq that failed to allocate! */ + if (res == NULL) + return (EINVAL); + + if ((rman_get_flags(res) & RF_SHAREABLE) == 0) + flags |= INTR_EXCL; + + /* We depend on rman_activate_resource() being idempotent. */ + error = rman_activate_resource(res); + if (error) + return (error); + + error = powerpc_setup_intr(device_get_nameunit(child), + rman_get_start(res), ifilt, ihand, arg, flags, cookiep); + return (error); +} + +static int +nexus_teardown_intr(device_t bus, device_t child, struct resource *res, + void *cookie) +{ + int error; + + if (res == NULL) + return (EINVAL); + + error = powerpc_teardown_intr(cookie); + return (error); +} diff --git a/sys/powerpc/mpc85xx/pci_fdt.c b/sys/powerpc/mpc85xx/pci_fdt.c index 994edbf8a6c..c431d66d0a5 100644 --- a/sys/powerpc/mpc85xx/pci_fdt.c +++ b/sys/powerpc/mpc85xx/pci_fdt.c @@ -816,8 +816,13 @@ fsl_pcib_set_range(struct fsl_pcib_softc *sc, int type, int wnd, u_long start, } *allocp = pci_start + alloc; - *vap = (uintptr_t)pmap_mapdev(start, size); - fsl_pcib_outbound(sc, wnd, type, start, size, pci_start); + if (size > 0) { + *vap = (uintptr_t)pmap_mapdev(start, size); + fsl_pcib_outbound(sc, wnd, type, start, size, pci_start); + } else { + *vap = 0; + fsl_pcib_outbound(sc, wnd, -1, 0, 0, 0); + } return (0); } diff --git a/sys/powerpc/powermac/hrowpic.c b/sys/powerpc/powermac/hrowpic.c index 01421733ad0..6b9e3dc33ce 100644 --- a/sys/powerpc/powermac/hrowpic.c +++ b/sys/powerpc/powermac/hrowpic.c @@ -245,7 +245,7 @@ hrowpic_enable(device_t dev, u_int irq, u_int vector) } static void -hrowpic_eoi(device_t dev __unused, u_int irq __unused) +hrowpic_eoi(device_t dev, u_int irq) { struct hrowpic_softc *sc; int bank; diff --git a/sys/powerpc/powerpc/cpu.c b/sys/powerpc/powerpc/cpu.c index 97011562a8e..d177c8b7aed 100644 --- a/sys/powerpc/powerpc/cpu.c +++ b/sys/powerpc/powerpc/cpu.c @@ -75,13 +75,13 @@ #include static void cpu_6xx_setup(int cpuid, uint16_t vers); -static void cpu_e500_setup(int cpuid, uint16_t vers); static void cpu_970_setup(int cpuid, uint16_t vers); +static void cpu_booke_setup(int cpuid, uint16_t vers); int powerpc_pow_enabled; void (*cpu_idle_hook)(void) = NULL; static void cpu_idle_60x(void); -static void cpu_idle_e500(void); +static void cpu_idle_booke(void); struct cputab { const char *name; @@ -146,9 +146,13 @@ static const struct cputab models[] = { { "Motorola PowerPC 8245", MPC8245, REVFMT_MAJMIN, PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, { "Freescale e500v1 core", FSL_E500v1, REVFMT_MAJMIN, - 0, cpu_e500_setup }, + 0, cpu_booke_setup }, { "Freescale e500v2 core", FSL_E500v2, REVFMT_MAJMIN, - 0, cpu_e500_setup }, + 0, cpu_booke_setup }, + { "Freescale e500mc core", FSL_E500mc, REVFMT_MAJMIN, + 0, cpu_booke_setup }, + { "Freescale e5500 core", FSL_E5500, REVFMT_MAJMIN, + 0, cpu_booke_setup }, { "IBM Cell Broadband Engine", IBMCELLBE, REVFMT_MAJMIN, PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, NULL}, @@ -191,6 +195,8 @@ cpu_setup(u_int cpuid) break; case FSL_E500v1: case FSL_E500v2: + case FSL_E500mc: + case FSL_E5500: maj = (pvr >> 4) & 0xf; min = (pvr >> 0) & 0xf; break; @@ -438,8 +444,9 @@ cpu_6xx_print_cacheinfo(u_int cpuid, uint16_t vers) } static void -cpu_e500_setup(int cpuid, uint16_t vers) +cpu_booke_setup(int cpuid, uint16_t vers) { +#ifdef BOOKE_E500 register_t hid0; hid0 = mfspr(SPR_HID0); @@ -451,9 +458,10 @@ cpu_e500_setup(int cpuid, uint16_t vers) mtspr(SPR_HID0, hid0); printf("cpu%d: HID0 %b\n", cpuid, (int)hid0, HID0_E500_BITMASK); +#endif if (cpu_idle_hook == NULL) - cpu_idle_hook = cpu_idle_e500; + cpu_idle_hook = cpu_idle_booke; } static void @@ -519,6 +527,7 @@ cpu_idle(int busy) CTR2(KTR_SPARE2, "cpu_idle(%d) at %d", busy, curcpu); + if (cpu_idle_hook != NULL) { if (!busy) { critical_enter(); @@ -530,6 +539,7 @@ cpu_idle(int busy) critical_exit(); } } + CTR2(KTR_SPARE2, "cpu_idle(%d) at %d done", busy, curcpu); } @@ -576,7 +586,7 @@ cpu_idle_60x(void) } static void -cpu_idle_e500(void) +cpu_idle_booke(void) { register_t msr; diff --git a/sys/powerpc/powerpc/db_trace.c b/sys/powerpc/powerpc/db_trace.c index 20de0ec4b90..2462308b64c 100644 --- a/sys/powerpc/powerpc/db_trace.c +++ b/sys/powerpc/powerpc/db_trace.c @@ -102,7 +102,7 @@ struct db_variable db_regs[] = { { "dar", DB_OFFSET(cpu.aim.dar), db_frame }, { "dsisr", DB_OFFSET(cpu.aim.dsisr), db_frame }, #endif -#ifdef E500 +#if defined(BOOKE) { "dear", DB_OFFSET(cpu.booke.dear), db_frame }, { "esr", DB_OFFSET(cpu.booke.esr), db_frame }, #endif @@ -243,7 +243,7 @@ db_backtrace(struct thread *td, db_addr_t fp, int count) case EXC_SC: trapstr = "SC"; break; case EXC_EXI: trapstr = "EXI"; break; case EXC_MCHK: trapstr = "MCHK"; break; -#ifndef E500 +#if !defined(BOOKE) case EXC_VEC: trapstr = "VEC"; break; case EXC_FPA: trapstr = "FPA"; break; case EXC_BPT: trapstr = "BPT"; break; diff --git a/sys/powerpc/powerpc/gdb_machdep.c b/sys/powerpc/powerpc/gdb_machdep.c index ebe1250eade..89c28a47c91 100644 --- a/sys/powerpc/powerpc/gdb_machdep.c +++ b/sys/powerpc/powerpc/gdb_machdep.c @@ -84,7 +84,7 @@ gdb_cpu_setreg(int regnum, void *val) int gdb_cpu_signal(int vector, int dummy __unused) { -#ifdef E500 +#if defined(BOOKE) if (vector == EXC_DEBUG || vector == EXC_PGM) return (SIGTRAP); #else diff --git a/sys/powerpc/powerpc/genassym.c b/sys/powerpc/powerpc/genassym.c index e228b10c7a3..904d98622be 100644 --- a/sys/powerpc/powerpc/genassym.c +++ b/sys/powerpc/powerpc/genassym.c @@ -63,7 +63,7 @@ ASSYM(PC_TEMPSAVE, offsetof(struct pcpu, pc_tempsave)); ASSYM(PC_DISISAVE, offsetof(struct pcpu, pc_disisave)); ASSYM(PC_DBSAVE, offsetof(struct pcpu, pc_dbsave)); -#ifdef E500 +#if defined(BOOKE) ASSYM(PC_BOOKE_CRITSAVE, offsetof(struct pcpu, pc_booke_critsave)); ASSYM(PC_BOOKE_MCHKSAVE, offsetof(struct pcpu, pc_booke_mchksave)); ASSYM(PC_BOOKE_TLBSAVE, offsetof(struct pcpu, pc_booke_tlbsave)); @@ -116,15 +116,14 @@ ASSYM(SEGMENT_MASK, SEGMENT_MASK); ASSYM(PM_SR, offsetof(struct pmap, pm_sr)); ASSYM(USER_SR, USER_SR); #endif -#elif defined(E500) +#elif defined(BOOKE) ASSYM(PM_PDIR, offsetof(struct pmap, pm_pdir)); -#endif - -#if defined(E500) ASSYM(PTE_RPN, offsetof(struct pte, rpn)); ASSYM(PTE_FLAGS, offsetof(struct pte, flags)); +#if defined(BOOKE_E500) ASSYM(TLB0_ENTRY_SIZE, sizeof(struct tlb_entry)); #endif +#endif #ifdef __powerpc64__ ASSYM(FSP, 48); @@ -215,18 +214,20 @@ ASSYM(SF_UC, offsetof(struct sigframe, sf_uc)); ASSYM(KERNBASE, KERNBASE); ASSYM(MAXCOMLEN, MAXCOMLEN); -#ifdef E500 +#if defined(BOOKE) +ASSYM(PSL_DE, PSL_DE); +ASSYM(PSL_DS, PSL_DS); +ASSYM(PSL_IS, PSL_IS); +ASSYM(PSL_CE, PSL_CE); +#endif +#if defined(BOOKE_E500) ASSYM(PSL_UCLE, PSL_UCLE); ASSYM(PSL_SPE, PSL_SPE); ASSYM(PSL_WE, PSL_WE); -ASSYM(PSL_CE, PSL_CE); ASSYM(PSL_UBLE, PSL_UBLE); -ASSYM(PSL_DS, PSL_DS); -ASSYM(PSL_IS, PSL_IS); -ASSYM(PSL_DE, PSL_DE); ASSYM(PSL_KERNSET_INIT, PSL_KERNSET_INIT); -#else /* AIM */ +#elif defined(AIM) #ifdef __powerpc64__ ASSYM(PSL_SF, PSL_SF); ASSYM(PSL_HV, PSL_HV); @@ -256,8 +257,9 @@ ASSYM(PSL_FE1, PSL_FE1); ASSYM(PSL_FP, PSL_FP); ASSYM(PSL_ME, PSL_ME); ASSYM(PSL_PR, PSL_PR); +#if defined(BOOKE_E500) ASSYM(PSL_PMM, PSL_PMM); - +#endif ASSYM(PSL_KERNSET, PSL_KERNSET); ASSYM(PSL_USERSET, PSL_USERSET); diff --git a/sys/powerpc/powerpc/mmu_if.m b/sys/powerpc/powerpc/mmu_if.m index 9d5b656cbac..8cd6e521d3d 100644 --- a/sys/powerpc/powerpc/mmu_if.m +++ b/sys/powerpc/powerpc/mmu_if.m @@ -387,7 +387,7 @@ METHOD boolean_t is_referenced { * * @retval int count of referenced bits */ -METHOD boolean_t ts_referenced { +METHOD int ts_referenced { mmu_t _mmu; vm_page_t _pg; }; @@ -761,7 +761,7 @@ METHOD void cpu_bootstrap { */ METHOD void * mapdev { mmu_t _mmu; - vm_offset_t _pa; + vm_paddr_t _pa; vm_size_t _size; }; @@ -818,7 +818,7 @@ METHOD void unmapdev { * * @retval pa physical address corresponding to mapping */ -METHOD vm_offset_t kextract { +METHOD vm_paddr_t kextract { mmu_t _mmu; vm_offset_t _va; }; @@ -833,7 +833,7 @@ METHOD vm_offset_t kextract { METHOD void kenter { mmu_t _mmu; vm_offset_t _va; - vm_offset_t _pa; + vm_paddr_t _pa; }; /** @@ -860,7 +860,7 @@ METHOD void kenter_attr { */ METHOD boolean_t dev_direct_mapped { mmu_t _mmu; - vm_offset_t _pa; + vm_paddr_t _pa; vm_size_t _size; }; diff --git a/sys/powerpc/mpc85xx/openpic_fdt.c b/sys/powerpc/powerpc/openpic_fdt.c similarity index 100% rename from sys/powerpc/mpc85xx/openpic_fdt.c rename to sys/powerpc/powerpc/openpic_fdt.c diff --git a/sys/powerpc/powerpc/platform.c b/sys/powerpc/powerpc/platform.c index 28771343107..169bbc199e1 100644 --- a/sys/powerpc/powerpc/platform.c +++ b/sys/powerpc/powerpc/platform.c @@ -92,7 +92,7 @@ mem_valid(vm_offset_t addr, int len) &aregions, &naregions); for (i = 0; i < npregions; i++) - if ((addr >= pregions[i].mr_start) + if ((addr >= pregions[i].mr_start) && (addr + len <= pregions[i].mr_start + pregions[i].mr_size)) return (0); @@ -116,7 +116,7 @@ platform_timebase_freq(struct cpuref *cpu) { return (PLATFORM_TIMEBASE_FREQ(plat_obj, cpu)); } - + int platform_smp_first_cpu(struct cpuref *cpu) { diff --git a/sys/powerpc/powerpc/pmap_dispatch.c b/sys/powerpc/powerpc/pmap_dispatch.c index 4715a93b5e3..c919196525e 100644 --- a/sys/powerpc/powerpc/pmap_dispatch.c +++ b/sys/powerpc/powerpc/pmap_dispatch.c @@ -76,6 +76,20 @@ vm_offset_t virtual_end; int pmap_bootstrapped; +#ifdef AIM +int +pvo_vaddr_compare(struct pvo_entry *a, struct pvo_entry *b) +{ + if (PVO_VADDR(a) < PVO_VADDR(b)) + return (-1); + else if (PVO_VADDR(a) > PVO_VADDR(b)) + return (1); + return (0); +} +RB_GENERATE(pvo_tree, pvo_entry, pvo_plink, pvo_vaddr_compare); +#endif + + void pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired) { @@ -426,7 +440,7 @@ pmap_cpu_bootstrap(int ap) } void * -pmap_mapdev(vm_offset_t pa, vm_size_t size) +pmap_mapdev(vm_paddr_t pa, vm_size_t size) { CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size); @@ -457,7 +471,7 @@ pmap_unmapdev(vm_offset_t va, vm_size_t size) MMU_UNMAPDEV(mmu_obj, va, size); } -vm_offset_t +vm_paddr_t pmap_kextract(vm_offset_t va) { @@ -466,7 +480,7 @@ pmap_kextract(vm_offset_t va) } void -pmap_kenter(vm_offset_t va, vm_offset_t pa) +pmap_kenter(vm_offset_t va, vm_paddr_t pa) { CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, va, pa); @@ -482,7 +496,7 @@ pmap_kenter_attr(vm_offset_t va, vm_offset_t pa, vm_memattr_t ma) } boolean_t -pmap_dev_direct_mapped(vm_offset_t pa, vm_size_t size) +pmap_dev_direct_mapped(vm_paddr_t pa, vm_size_t size) { CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size); diff --git a/sys/security/mac_mls/mac_mls.c b/sys/security/mac_mls/mac_mls.c index 8ffa76b597f..ff9084e870f 100644 --- a/sys/security/mac_mls/mac_mls.c +++ b/sys/security/mac_mls/mac_mls.c @@ -2028,6 +2028,9 @@ mls_system_check_acct(struct ucred *cred, struct vnode *vp, if (!mls_enabled) return (0); + if (vplabel == NULL) + return (0); + subj = SLOT(cred->cr_label); obj = SLOT(vplabel); diff --git a/sys/sparc64/conf/GENERIC b/sys/sparc64/conf/GENERIC index 7d9bef8ccc0..3a2cfeb736d 100644 --- a/sys/sparc64/conf/GENERIC +++ b/sys/sparc64/conf/GENERIC @@ -26,7 +26,7 @@ makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols # Platforms supported # At this time all platforms are supported, as-is. -options SCHED_ULE # ULE scheduler +options SCHED_4BSD # 4BSD scheduler options PREEMPTION # Enable kernel thread preemption options INET # InterNETworking options INET6 # IPv6 communications protocols @@ -109,6 +109,7 @@ device esp # AMD Am53C974, Sun ESP and FAS families device isp # Qlogic family device ispfw # Firmware module for Qlogic host adapters device mpt # LSI-Logic MPT-Fusion +device mps # LSI-Logic MPT-Fusion 2 device sym # NCR/Symbios/LSI Logic 53C8XX/53C1010/53C1510D # ATA/SCSI peripherals @@ -118,7 +119,7 @@ device da # Direct Access (disks) device sa # Sequential Access (tape etc) device cd # CD device pass # Passthrough device (direct ATA/SCSI access) -device ses # SCSI Environmental Services (and SAF-TE) +device ses # Enclosure Services (SES and SAF-TE) device ctl # CAM Target Layer # RAID controllers @@ -234,35 +235,8 @@ device uhci # UHCI PCI->USB interface device ohci # OHCI PCI->USB interface device ehci # EHCI PCI->USB interface (USB 2.0) device usb # USB Bus (required) -#device udbp # USB Double Bulk Pipe devices (needs netgraph) -device uhid # "Human Interface Devices" device ukbd # Keyboard -device ulpt # Printer device umass # Disks/Mass storage - Requires scbus and da -device ums # Mouse -device urio # Diamond Rio 500 MP3 player -# USB Serial devices -device uark # Technologies ARK3116 based serial adapters -device ubsa # Belkin F5U103 and compatible serial adapters -device uftdi # For FTDI usb serial adapters -device uipaq # Some WinCE based devices -device uplcom # Prolific PL-2303 serial adapters -device uslcom # SI Labs CP2101/CP2102 serial adapters -device uvisor # Visor and Palm devices -device uvscom # USB serial support for DDI pocket's PHS -# USB Ethernet, requires miibus -device aue # ADMtek USB Ethernet -device axe # ASIX Electronics USB Ethernet -device cdce # Generic USB over Ethernet -device cue # CATC USB Ethernet -device kue # Kawasaki LSI USB Ethernet -device rue # RealTek RTL8150 USB Ethernet -device udav # Davicom DM9601E USB -# USB Wireless -device rum # Ralink Technology RT2501USB wireless NICs -device uath # Atheros AR5523 wireless NICs -device ural # Ralink Technology RT2500USB wireless NICs -device zyd # ZyDAS zd1211/zd1211b wireless NICs # FireWire support device firewire # FireWire bus code @@ -278,4 +252,3 @@ device sound # Generic sound driver (required) device snd_audiocs # Crystal Semiconductor CS4231 device snd_es137x # Ensoniq AudioPCI ES137x device snd_t4dwave # Acer Labs M5451 -device snd_uaudio # USB Audio diff --git a/sys/sparc64/include/_stdint.h b/sys/sparc64/include/_stdint.h index e36c6598861..cb3b1a23059 100644 --- a/sys/sparc64/include/_stdint.h +++ b/sys/sparc64/include/_stdint.h @@ -149,12 +149,6 @@ /* Limit of size_t. */ #define SIZE_MAX UINT64_MAX -#ifndef WCHAR_MIN /* Also possibly defined in */ -/* Limits of wchar_t. */ -#define WCHAR_MIN INT32_MIN -#define WCHAR_MAX INT32_MAX -#endif - /* Limits of wint_t. */ #define WINT_MIN INT32_MIN #define WINT_MAX INT32_MAX diff --git a/sys/sparc64/include/_types.h b/sys/sparc64/include/_types.h index 5899401ff29..aa8a299a2f8 100644 --- a/sys/sparc64/include/_types.h +++ b/sys/sparc64/include/_types.h @@ -92,6 +92,10 @@ typedef __int64_t __vm_ooffset_t; typedef __uint64_t __vm_paddr_t; typedef __uint64_t __vm_pindex_t; typedef __uint64_t __vm_size_t; +typedef int __wchar_t; + +#define __WCHAR_MIN __INT_MIN /* min value for a wchar_t */ +#define __WCHAR_MAX __INT_MAX /* max value for a wchar_t */ /* * Unusual type definitions. diff --git a/sys/sparc64/include/elf.h b/sys/sparc64/include/elf.h index f61b8604ae4..448ca66793e 100644 --- a/sys/sparc64/include/elf.h +++ b/sys/sparc64/include/elf.h @@ -90,6 +90,7 @@ __ElfType(Auxinfo); #define AT_NCPUS 19 /* Number of CPUs. */ #define AT_PAGESIZES 20 /* Pagesizes. */ #define AT_PAGESIZESLEN 21 /* Number of pagesizes. */ +#define AT_TIMEKEEP 22 /* Pointer to timehands. */ #define AT_STACKPROT 23 /* Initial stack protection. */ #define AT_COUNT 24 /* Count of defined aux entry types. */ diff --git a/sys/sparc64/include/in_cksum.h b/sys/sparc64/include/in_cksum.h index ae06a4cb997..d5d167f54a0 100644 --- a/sys/sparc64/include/in_cksum.h +++ b/sys/sparc64/include/in_cksum.h @@ -65,6 +65,7 @@ #define in_cksum(m, len) in_cksum_skip(m, len, 0) +#if defined(IPVERSION) && (IPVERSION == 4) static __inline void in_cksum_update(struct ip *ip) { @@ -73,6 +74,7 @@ in_cksum_update(struct ip *ip) __tmp = (int)ip->ip_sum + 1; ip->ip_sum = __tmp + (__tmp >> 16); } +#endif static __inline u_short in_addword(u_short sum, u_short b) @@ -106,6 +108,7 @@ in_pseudo(u_int sum, u_int b, u_int c) return (sum); } +#if defined(IPVERSION) && (IPVERSION == 4) static __inline u_int in_cksum_hdr(struct ip *ip) { @@ -163,6 +166,7 @@ in_cksum_hdr(struct ip *ip) #undef __LD_ADD return (__ret); } +#endif #ifdef _KERNEL u_short in_cksum_skip(struct mbuf *m, int len, int skip); diff --git a/sys/sparc64/include/intr_machdep.h b/sys/sparc64/include/intr_machdep.h index 6e472f7ae60..6803fc627fb 100644 --- a/sys/sparc64/include/intr_machdep.h +++ b/sys/sparc64/include/intr_machdep.h @@ -91,10 +91,10 @@ struct intr_vector { extern ih_func_t *intr_handlers[]; extern struct intr_vector intr_vectors[]; -#ifdef SMP void intr_add_cpu(u_int cpu); -#endif +#ifdef SMP int intr_bind(int vec, u_char cpu); +#endif int intr_describe(int vec, void *ih, const char *descr); void intr_setup(int level, ih_func_t *ihf, int pri, iv_func_t *ivf, void *iva); diff --git a/sys/sparc64/include/pcb.h b/sys/sparc64/include/pcb.h index f23c1f291c2..25a41cccb11 100644 --- a/sys/sparc64/include/pcb.h +++ b/sys/sparc64/include/pcb.h @@ -55,7 +55,7 @@ struct pcb { #ifdef _KERNEL void makectx(struct trapframe *tf, struct pcb *pcb); -int savectx(struct pcb *pcb); +int savectx(struct pcb *pcb) __returns_twice; #endif #endif /* !LOCORE */ diff --git a/sys/sparc64/include/pmap.h b/sys/sparc64/include/pmap.h index 87c56a30372..2ab39019765 100644 --- a/sys/sparc64/include/pmap.h +++ b/sys/sparc64/include/pmap.h @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -79,6 +80,7 @@ struct pmap { #define PMAP_UNLOCK(pmap) mtx_unlock(&(pmap)->pm_mtx) #define pmap_page_get_memattr(m) VM_MEMATTR_DEFAULT +#define pmap_page_is_write_mapped(m) (((m)->aflags & PGA_WRITEABLE) != 0) #define pmap_page_set_memattr(m, ma) (void)0 void pmap_bootstrap(u_int cpu_impl); @@ -101,6 +103,7 @@ void pmap_set_kctx(void); extern struct pmap kernel_pmap_store; #define kernel_pmap (&kernel_pmap_store) +extern struct rwlock tte_list_global_lock; extern vm_paddr_t phys_avail[]; extern vm_offset_t virtual_avail; extern vm_offset_t virtual_end; diff --git a/sys/sparc64/include/vdso.h b/sys/sparc64/include/vdso.h new file mode 100644 index 00000000000..98b291e7d64 --- /dev/null +++ b/sys/sparc64/include/vdso.h @@ -0,0 +1,34 @@ +/*- + * Copyright 2012 Konstantin Belousov . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _SPARC64_VDSO_H +#define _SPARC64_VDSO_H + +#define VDSO_TIMEHANDS_MD \ + uint32_t th_res[8]; + +#endif diff --git a/sys/sparc64/sparc64/intr_machdep.c b/sys/sparc64/sparc64/intr_machdep.c index ed644fce485..73f9fa61b3e 100644 --- a/sys/sparc64/sparc64/intr_machdep.c +++ b/sys/sparc64/sparc64/intr_machdep.c @@ -554,4 +554,11 @@ intr_shuffle_irqs(void *arg __unused) } SYSINIT(intr_shuffle_irqs, SI_SUB_SMP, SI_ORDER_SECOND, intr_shuffle_irqs, NULL); +#else /* !SMP */ +/* Use an empty stub for compatibility. */ +void +intr_add_cpu(u_int cpu __unused) +{ + +} #endif diff --git a/sys/sparc64/sparc64/machdep.c b/sys/sparc64/sparc64/machdep.c index fd5d338bf0c..63be007dec9 100644 --- a/sys/sparc64/sparc64/machdep.c +++ b/sys/sparc64/sparc64/machdep.c @@ -197,12 +197,10 @@ cpu_startup(void *arg) cpu_identify(rdpr(ver), PCPU_GET(clock), curcpu); -#ifdef SMP /* * Add BSP as an interrupt target. */ intr_add_cpu(0); -#endif } void diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c index d7ba44b8350..6d9e43dd3ee 100644 --- a/sys/sparc64/sparc64/pmap.c +++ b/sys/sparc64/sparc64/pmap.c @@ -71,6 +71,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -133,6 +134,11 @@ vm_offset_t vm_max_kernel_address; */ struct pmap kernel_pmap_store; +/* + * Global tte list lock + */ +struct rwlock tte_list_global_lock; + /* * Allocate physical memory for use in pmap_bootstrap. */ @@ -666,6 +672,12 @@ pmap_bootstrap(u_int cpu_impl) pm->pm_context[i] = TLB_CTX_KERNEL; CPU_FILL(&pm->pm_active); + /* + * Initialize the global tte list lock, which is more commonly + * known as the pmap pv global lock. + */ + rw_init(&tte_list_global_lock, "pmap pv global"); + /* * Flush all non-locked TLB entries possibly left over by the * firmware. @@ -876,7 +888,7 @@ pmap_cache_enter(vm_page_t m, vm_offset_t va) struct tte *tp; int color; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&tte_list_global_lock, RA_WLOCKED); KASSERT((m->flags & PG_FICTITIOUS) == 0, ("pmap_cache_enter: fake page")); PMAP_STATS_INC(pmap_ncache_enter); @@ -951,7 +963,7 @@ pmap_cache_remove(vm_page_t m, vm_offset_t va) struct tte *tp; int color; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&tte_list_global_lock, RA_WLOCKED); CTR3(KTR_PMAP, "pmap_cache_remove: m=%p va=%#lx c=%d", m, va, m->md.colors[DCACHE_COLOR(va)]); KASSERT((m->flags & PG_FICTITIOUS) == 0, @@ -1026,7 +1038,7 @@ pmap_kenter(vm_offset_t va, vm_page_t m) vm_page_t om; u_long data; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&tte_list_global_lock, RA_WLOCKED); PMAP_STATS_INC(pmap_nkenter); tp = tsb_kvtotte(va); CTR4(KTR_PMAP, "pmap_kenter: va=%#lx pa=%#lx tp=%p data=%#lx", @@ -1088,7 +1100,7 @@ pmap_kremove(vm_offset_t va) struct tte *tp; vm_page_t m; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&tte_list_global_lock, RA_WLOCKED); PMAP_STATS_INC(pmap_nkremove); tp = tsb_kvtotte(va); CTR3(KTR_PMAP, "pmap_kremove: va=%#lx tp=%p data=%#lx", va, tp, @@ -1139,19 +1151,16 @@ void pmap_qenter(vm_offset_t sva, vm_page_t *m, int count) { vm_offset_t va; - int locked; PMAP_STATS_INC(pmap_nqenter); va = sva; - if (!(locked = mtx_owned(&vm_page_queue_mtx))) - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); while (count-- > 0) { pmap_kenter(va, *m); va += PAGE_SIZE; m++; } - if (!locked) - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); tlb_range_demap(kernel_pmap, sva, va); } @@ -1163,18 +1172,15 @@ void pmap_qremove(vm_offset_t sva, int count) { vm_offset_t va; - int locked; PMAP_STATS_INC(pmap_nqremove); va = sva; - if (!(locked = mtx_owned(&vm_page_queue_mtx))) - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); while (count-- > 0) { pmap_kremove(va); va += PAGE_SIZE; } - if (!locked) - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); tlb_range_demap(kernel_pmap, sva, va); } @@ -1322,7 +1328,7 @@ pmap_remove_tte(struct pmap *pm, struct pmap *pm2, struct tte *tp, vm_page_t m; u_long data; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&tte_list_global_lock, RA_WLOCKED); data = atomic_readandclear_long(&tp->tte_data); if ((data & TD_FAKE) == 0) { m = PHYS_TO_VM_PAGE(TD_PA(data)); @@ -1359,7 +1365,7 @@ pmap_remove(pmap_t pm, vm_offset_t start, vm_offset_t end) pm->pm_context[curcpu], start, end); if (PMAP_REMOVE_DONE(pm)) return; - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); PMAP_LOCK(pm); if (end - start > PMAP_TSB_THRESH) { tsb_foreach(pm, NULL, start, end, pmap_remove_tte); @@ -1372,7 +1378,7 @@ pmap_remove(pmap_t pm, vm_offset_t start, vm_offset_t end) tlb_range_demap(pm, start, end - 1); } PMAP_UNLOCK(pm); - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); } void @@ -1385,7 +1391,7 @@ pmap_remove_all(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_all: page %p is not managed", m)); - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); for (tp = TAILQ_FIRST(&m->md.tte_list); tp != NULL; tp = tpn) { tpn = TAILQ_NEXT(tp, tte_link); if ((tp->tte_data & TD_PV) == 0) @@ -1408,7 +1414,7 @@ pmap_remove_all(vm_page_t m) PMAP_UNLOCK(pm); } vm_page_aflag_clear(m, PGA_WRITEABLE); - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); } static int @@ -1470,10 +1476,10 @@ pmap_enter(pmap_t pm, vm_offset_t va, vm_prot_t access, vm_page_t m, vm_prot_t prot, boolean_t wired) { - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); PMAP_LOCK(pm); pmap_enter_locked(pm, va, m, prot, wired); - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); PMAP_UNLOCK(pm); } @@ -1493,7 +1499,7 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot, vm_page_t real; u_long data; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&tte_list_global_lock, RA_WLOCKED); PMAP_LOCK_ASSERT(pm, MA_OWNED); KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0 || VM_OBJECT_LOCKED(m->object), @@ -1636,14 +1642,14 @@ pmap_enter_object(pmap_t pm, vm_offset_t start, vm_offset_t end, psize = atop(end - start); m = m_start; - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); PMAP_LOCK(pm); while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { pmap_enter_locked(pm, start + ptoa(diff), m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), FALSE); m = TAILQ_NEXT(m, listq); } - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); PMAP_UNLOCK(pm); } @@ -1651,11 +1657,11 @@ void pmap_enter_quick(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot) { - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); PMAP_LOCK(pm); pmap_enter_locked(pm, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), FALSE); - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); PMAP_UNLOCK(pm); } @@ -1721,7 +1727,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, if (dst_addr != src_addr) return; - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); if (dst_pmap < src_pmap) { PMAP_LOCK(dst_pmap); PMAP_LOCK(src_pmap); @@ -1739,7 +1745,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, pmap_copy_tte(src_pmap, dst_pmap, tp, va); tlb_range_demap(dst_pmap, src_addr, src_addr + len - 1); } - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); PMAP_UNLOCK(src_pmap); PMAP_UNLOCK(dst_pmap); } @@ -1938,7 +1944,7 @@ pmap_page_exists_quick(pmap_t pm, vm_page_t m) ("pmap_page_exists_quick: page %p is not managed", m)); loops = 0; rv = FALSE; - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) { if ((tp->tte_data & TD_PV) == 0) continue; @@ -1949,7 +1955,7 @@ pmap_page_exists_quick(pmap_t pm, vm_page_t m) if (++loops >= 16) break; } - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); return (rv); } @@ -1966,11 +1972,11 @@ pmap_page_wired_mappings(vm_page_t m) count = 0; if ((m->oflags & VPO_UNMANAGED) != 0) return (count); - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) if ((tp->tte_data & (TD_PV | TD_WIRED)) == (TD_PV | TD_WIRED)) count++; - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); return (count); } @@ -1997,13 +2003,13 @@ pmap_page_is_mapped(vm_page_t m) rv = FALSE; if ((m->oflags & VPO_UNMANAGED) != 0) return (rv); - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) if ((tp->tte_data & TD_PV) != 0) { rv = TRUE; break; } - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); return (rv); } @@ -2029,7 +2035,7 @@ pmap_ts_referenced(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_ts_referenced: page %p is not managed", m)); count = 0; - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); if ((tp = TAILQ_FIRST(&m->md.tte_list)) != NULL) { tpf = tp; do { @@ -2043,7 +2049,7 @@ pmap_ts_referenced(vm_page_t m) break; } while ((tp = tpn) != NULL && tp != tpf); } - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); return (count); } @@ -2066,7 +2072,7 @@ pmap_is_modified(vm_page_t m) if ((m->oflags & VPO_BUSY) == 0 && (m->aflags & PGA_WRITEABLE) == 0) return (rv); - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) { if ((tp->tte_data & TD_PV) == 0) continue; @@ -2075,7 +2081,7 @@ pmap_is_modified(vm_page_t m) break; } } - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); return (rv); } @@ -2109,7 +2115,7 @@ pmap_is_referenced(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_referenced: page %p is not managed", m)); rv = FALSE; - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) { if ((tp->tte_data & TD_PV) == 0) continue; @@ -2118,7 +2124,7 @@ pmap_is_referenced(vm_page_t m) break; } } - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); return (rv); } @@ -2141,7 +2147,7 @@ pmap_clear_modify(vm_page_t m) */ if ((m->aflags & PGA_WRITEABLE) == 0) return; - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) { if ((tp->tte_data & TD_PV) == 0) continue; @@ -2149,7 +2155,7 @@ pmap_clear_modify(vm_page_t m) if ((data & TD_W) != 0) tlb_page_demap(TTE_GET_PMAP(tp), TTE_GET_VA(tp)); } - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); } void @@ -2160,7 +2166,7 @@ pmap_clear_reference(vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_reference: page %p is not managed", m)); - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) { if ((tp->tte_data & TD_PV) == 0) continue; @@ -2168,7 +2174,7 @@ pmap_clear_reference(vm_page_t m) if ((data & TD_REF) != 0) tlb_page_demap(TTE_GET_PMAP(tp), TTE_GET_VA(tp)); } - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); } void @@ -2189,7 +2195,7 @@ pmap_remove_write(vm_page_t m) if ((m->oflags & VPO_BUSY) == 0 && (m->aflags & PGA_WRITEABLE) == 0) return; - vm_page_lock_queues(); + rw_wlock(&tte_list_global_lock); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) { if ((tp->tte_data & TD_PV) == 0) continue; @@ -2200,7 +2206,7 @@ pmap_remove_write(vm_page_t m) } } vm_page_aflag_clear(m, PGA_WRITEABLE); - vm_page_unlock_queues(); + rw_wunlock(&tte_list_global_lock); } int diff --git a/sys/sparc64/sparc64/tsb.c b/sys/sparc64/sparc64/tsb.c index 0f342596dd0..403043c6403 100644 --- a/sys/sparc64/sparc64/tsb.c +++ b/sys/sparc64/sparc64/tsb.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -131,7 +132,7 @@ tsb_tte_enter(pmap_t pm, vm_page_t m, vm_offset_t va, u_long sz, u_long data) PMAP_STATS_INC(tsb_nenter_u_oc); } - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&tte_list_global_lock, RA_WLOCKED); PMAP_LOCK_ASSERT(pm, MA_OWNED); if (pm == kernel_pmap) { PMAP_STATS_INC(tsb_nenter_k); diff --git a/sys/sys/_types.h b/sys/sys/_types.h index c59afd31cb5..27ecaf4f0e1 100644 --- a/sys/sys/_types.h +++ b/sys/sys/_types.h @@ -80,14 +80,13 @@ typedef int __cpusetid_t; /* cpuset identifier. */ * ANSI C), but they use __ct_rune_t instead of int. * * NOTE: rune_t is not covered by ANSI nor other standards, and should not - * be instantiated outside of lib/libc/locale. Use wchar_t. wchar_t and - * rune_t must be the same type. Also, wint_t must be no narrower than - * wchar_t, and should be able to hold all members of the largest - * character set plus one extra value (WEOF), and must be at least 16 bits. + * be instantiated outside of lib/libc/locale. Use wchar_t. wint_t and + * rune_t must be the same type. Also, wint_t should be able to hold all + * members of the largest character set plus one extra value (WEOF), and + * must be at least 16 bits. */ typedef int __ct_rune_t; /* arg type for ctype funcs */ typedef __ct_rune_t __rune_t; /* rune_t (see above) */ -typedef __ct_rune_t __wchar_t; /* wchar_t (see above) */ typedef __ct_rune_t __wint_t; /* wint_t (see above) */ typedef __uint32_t __dev_t; /* device number */ diff --git a/sys/sys/agpio.h b/sys/sys/agpio.h index 8c1294f6986..78a2ade96d7 100644 --- a/sys/sys/agpio.h +++ b/sys/sys/agpio.h @@ -88,6 +88,7 @@ #define AGPIOC_DEALLOCATE _IOW (AGPIOC_BASE, 7, int) #define AGPIOC_BIND _IOW (AGPIOC_BASE, 8, agp_bind) #define AGPIOC_UNBIND _IOW (AGPIOC_BASE, 9, agp_unbind) +#define AGPIOC_CHIPSET_FLUSH _IO (AGPIOC_BASE, 10) typedef struct _agp_version { u_int16_t major; diff --git a/sys/sys/apm.h b/sys/sys/apm.h index e1b0e85c9c2..a17591db822 100644 --- a/sys/sys/apm.h +++ b/sys/sys/apm.h @@ -56,6 +56,7 @@ struct apm_ent { #define APM_ENT_TYPE_UNUSED "Apple_Free" #define APM_ENT_TYPE_FREEBSD "FreeBSD" +#define APM_ENT_TYPE_FREEBSD_NANDFS "FreeBSD-nandfs" #define APM_ENT_TYPE_FREEBSD_SWAP "FreeBSD-swap" #define APM_ENT_TYPE_FREEBSD_UFS "FreeBSD-UFS" #define APM_ENT_TYPE_FREEBSD_VINUM "FreeBSD-Vinum" diff --git a/sys/sys/ata.h b/sys/sys/ata.h index 4baaafa2469..9b2d867235d 100644 --- a/sys/sys/ata.h +++ b/sys/sys/ata.h @@ -318,6 +318,7 @@ struct ata_params { #define ATA_READ_VERIFY48 0x42 #define ATA_READ_FPDMA_QUEUED 0x60 /* read DMA NCQ */ #define ATA_WRITE_FPDMA_QUEUED 0x61 /* write DMA NCQ */ +#define ATA_SEP_ATTN 0x67 /* SEP request */ #define ATA_SEEK 0x70 /* seek */ #define ATA_PACKET_CMD 0xa0 /* packet command */ #define ATA_ATAPI_IDENTIFY 0xa1 /* get ATAPI params*/ diff --git a/sys/sys/buf.h b/sys/sys/buf.h index 96021eb5ea4..2a367f17695 100644 --- a/sys/sys/buf.h +++ b/sys/sys/buf.h @@ -224,8 +224,8 @@ struct buf { #define B_CLUSTER 0x40000000 /* pagein op, so swap() can count it */ #define B_REMFREE 0x80000000 /* Delayed bremfree */ -#define PRINT_BUF_FLAGS "\20\40remfree\37cluster\36vmio\35ram\34b27" \ - "\33paging\32b25\31b24\30b23\27relbuf\26dirty\25b20" \ +#define PRINT_BUF_FLAGS "\20\40remfree\37cluster\36vmio\35ram\34managed" \ + "\33paging\32needsgiant\31nocopy\30b23\27relbuf\26dirty\25b20" \ "\24b19\23b18\22clusterok\21malloc\20nocache\17b14\16inval" \ "\15b12\14b11\13eintr\12done\11persist\10delwri\7validsuspwrt" \ "\6cache\5deferred\4direct\3async\2needcommit\1age" @@ -239,6 +239,8 @@ struct buf { #define BX_BKGRDMARKER 0x00000020 /* Mark buffer for splay tree */ #define BX_ALTDATA 0x00000040 /* Holds extended data */ +#define PRINT_BUF_XFLAGS "\20\7altdata\6bkgrdmarker\5bkgrdwrite\2clean\1dirty" + #define NOOFFSET (-1LL) /* No buffer offset calculated yet */ /* @@ -249,6 +251,8 @@ struct buf { #define BV_BKGRDWAIT 0x00000004 /* Background write waiting */ #define BV_INFREECNT 0x80000000 /* buf is counted in numfreebufs */ +#define PRINT_BUF_VFLAGS "\20\40infreecnt\3bkgrdwait\2bkgrdinprog\1scanned" + #ifdef _KERNEL /* * Buffer locking diff --git a/sys/sys/callout.h b/sys/sys/callout.h index e45731de33b..95b9a32b292 100644 --- a/sys/sys/callout.h +++ b/sys/sys/callout.h @@ -46,6 +46,7 @@ #define CALLOUT_MPSAFE 0x0008 /* callout handler is mp safe */ #define CALLOUT_RETURNUNLOCKED 0x0010 /* handler returns with mtx unlocked */ #define CALLOUT_SHAREDLOCK 0x0020 /* callout lock held in shared mode */ +#define CALLOUT_DFRMIGRATION 0x0040 /* callout in deferred migration mode */ struct callout_handle { struct callout *callout; diff --git a/sys/sys/cdefs.h b/sys/sys/cdefs.h index 076842d8ebe..f86a7550623 100644 --- a/sys/sys/cdefs.h +++ b/sys/sys/cdefs.h @@ -293,6 +293,18 @@ #define __nonnull(x) #endif +#if __GNUC_PREREQ__(3, 4) +#define __fastcall __attribute__((__fastcall__)) +#else +#define __fastcall +#endif + +#if __GNUC_PREREQ__(4, 1) +#define __returns_twice __attribute__((__returns_twice__)) +#else +#define __returns_twice +#endif + /* XXX: should use `#if __STDC_VERSION__ < 199901'. */ #if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER) #define __func__ NULL diff --git a/sys/sys/disklabel.h b/sys/sys/disklabel.h index 31cefd1eb12..d135afa8fc9 100644 --- a/sys/sys/disklabel.h +++ b/sys/sys/disklabel.h @@ -232,6 +232,7 @@ static const char *dktypenames[] = { #define FS_UDF 24 /* UDF */ #define FS_EFS 26 /* SGI's Extent File system */ #define FS_ZFS 27 /* Sun's ZFS */ +#define FS_NANDFS 30 /* FreeBSD nandfs (NiLFS derived) */ #ifdef FSTYPENAMES static const char *fstypenames[] = { @@ -263,6 +264,9 @@ static const char *fstypenames[] = { "?", "EFS", "ZFS", + "?", + "?", + "nandfs", NULL }; #define FSMAXTYPES (sizeof(fstypenames) / sizeof(fstypenames[0]) - 1) diff --git a/sys/sys/dtrace_bsd.h b/sys/sys/dtrace_bsd.h index eb348b28f18..2198b264db2 100644 --- a/sys/sys/dtrace_bsd.h +++ b/sys/sys/dtrace_bsd.h @@ -38,6 +38,8 @@ struct thread; struct vattr; struct vnode; struct reg; +struct devstat; +struct bio; /* * Cyclic clock function type definition used to hook the cyclic @@ -168,6 +170,23 @@ extern dtrace_nfsclient_nfs23_done_probe_func_t extern dtrace_nfsclient_nfs23_done_probe_func_t dtrace_nfscl_nfs234_done_probe; +/* IO Provider hooks, really hook into devstat */ +typedef void (*dtrace_io_start_probe_func_t)(uint32_t, struct bio *, + struct devstat *); +extern dtrace_io_start_probe_func_t dtrace_io_start_probe; + +typedef void (*dtrace_io_done_probe_func_t)(uint32_t, struct bio *, + struct devstat *); +extern dtrace_io_done_probe_func_t dtrace_io_done_probe; + +typedef void (*dtrace_io_wait_start_probe_func_t)(uint32_t, uintptr_t *, + struct devstat *); +extern dtrace_io_wait_start_probe_func_t dtrace_io_wait_start_probe; + +typedef void (*dtrace_io_wait_done_probe_func_t)(uint32_t, uintptr_t *, + struct devstat *); +extern dtrace_io_wait_done_probe_func_t dtrace_io_wait_done_probe; + /* * Functions which allow the dtrace module to check that the kernel * hooks have been compiled with sufficient space for it's private diff --git a/sys/sys/elf_common.h b/sys/sys/elf_common.h index d08569fc3f0..8f02ef1976c 100644 --- a/sys/sys/elf_common.h +++ b/sys/sys/elf_common.h @@ -480,6 +480,7 @@ typedef struct { #define DF_1_LOADFLTR 0x00000010 /* Immediate loading of filtees */ #define DF_1_NOOPEN 0x00000040 /* Do not allow loading on dlopen() */ #define DF_1_ORIGIN 0x00000080 /* Process $ORIGIN */ +#define DF_1_NODEFLIB 0x00000800 /* Do not search default paths */ /* Values for n_type. Used in core files. */ #define NT_PRSTATUS 1 /* Process status. */ diff --git a/sys/sys/file.h b/sys/sys/file.h index 1489ca06ad7..dc49895fa08 100644 --- a/sys/sys/file.h +++ b/sys/sys/file.h @@ -72,10 +72,25 @@ struct socket; struct file; struct ucred; +#define FOF_OFFSET 0x01 /* Use the offset in uio argument */ +#define FOF_NOLOCK 0x02 /* Do not take FOFFSET_LOCK */ +#define FOF_NEXTOFF 0x04 /* Also update f_nextoff */ +#define FOF_NOUPDATE 0x10 /* Do not update f_offset */ +off_t foffset_lock(struct file *fp, int flags); +void foffset_lock_uio(struct file *fp, struct uio *uio, int flags); +void foffset_unlock(struct file *fp, off_t val, int flags); +void foffset_unlock_uio(struct file *fp, struct uio *uio, int flags); + +static inline off_t +foffset_get(struct file *fp) +{ + + return (foffset_lock(fp, FOF_NOLOCK)); +} + typedef int fo_rdwr_t(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td); -#define FOF_OFFSET 1 /* Use the offset in uio argument */ typedef int fo_truncate_t(struct file *fp, off_t length, struct ucred *active_cred, struct thread *td); typedef int fo_ioctl_t(struct file *fp, u_long com, void *data, @@ -126,6 +141,8 @@ struct fadvise_info { int fa_advice; /* (f) FADV_* type. */ off_t fa_start; /* (f) Region start. */ off_t fa_end; /* (f) Region end. */ + off_t fa_prevstart; /* (f) Previous NOREUSE start. */ + off_t fa_prevend; /* (f) Previous NOREUSE end. */ }; struct file { @@ -221,6 +238,8 @@ fo_chown_t invfo_chown; void finit(struct file *, u_int, short, void *, struct fileops *); int fgetvp(struct thread *td, int fd, cap_rights_t rights, struct vnode **vpp); +int fgetvp_exec(struct thread *td, int fd, cap_rights_t rights, + struct vnode **vpp); int fgetvp_rights(struct thread *td, int fd, cap_rights_t need, cap_rights_t *have, struct vnode **vpp); int fgetvp_read(struct thread *td, int fd, cap_rights_t rights, diff --git a/sys/sys/filedesc.h b/sys/sys/filedesc.h index 1b87bab201d..855d2b3bb0c 100644 --- a/sys/sys/filedesc.h +++ b/sys/sys/filedesc.h @@ -105,12 +105,13 @@ struct filedesc_to_leader { SX_NOTRECURSED) #define FILEDESC_XLOCK_ASSERT(fdp) sx_assert(&(fdp)->fd_sx, SX_XLOCKED | \ SX_NOTRECURSED) +#define FILEDESC_UNLOCK_ASSERT(fdp) sx_assert(&(fdp)->fd_sx, SX_UNLOCKED) struct thread; int closef(struct file *fp, struct thread *td); -int dupfdopen(struct thread *td, struct filedesc *fdp, int indx, int dfd, - int mode, int error); +int dupfdopen(struct thread *td, struct filedesc *fdp, int dfd, int mode, + int openerror, int *indxp); int falloc(struct thread *td, struct file **resultfp, int *resultfd, int flags); int falloc_noinstall(struct thread *td, struct file **resultfp); @@ -141,7 +142,12 @@ static __inline struct file * fget_locked(struct filedesc *fdp, int fd) { - return (fd < 0 || fd >= fdp->fd_nfiles ? NULL : fdp->fd_ofiles[fd]); + FILEDESC_LOCK_ASSERT(fdp); + + if (fd < 0 || fd >= fdp->fd_nfiles) + return (NULL); + + return (fdp->fd_ofiles[fd]); } #endif /* _KERNEL */ diff --git a/sys/sys/gpt.h b/sys/sys/gpt.h index d00135dee9e..507ff1c3c6b 100644 --- a/sys/sys/gpt.h +++ b/sys/sys/gpt.h @@ -79,6 +79,10 @@ struct gpt_ent { {0x024dee41,0x33e7,0x11d3,0x9d,0x69,{0x00,0x08,0xc7,0x81,0xf3,0x9f}} #define GPT_ENT_TYPE_FREEBSD \ {0x516e7cb4,0x6ecf,0x11d6,0x8f,0xf8,{0x00,0x02,0x2d,0x09,0x71,0x2b}} +#define GPT_ENT_TYPE_FREEBSD_BOOT \ + {0x83bd6b9d,0x7f41,0x11dc,0xbe,0x0b,{0x00,0x15,0x60,0xb8,0x4f,0x0f}} +#define GPT_ENT_TYPE_FREEBSD_NANDFS \ + {0x74ba7dd9,0xa689,0x11e1,0xbd,0x04,{0x00,0xe0,0x81,0x28,0x6a,0xcf}} #define GPT_ENT_TYPE_FREEBSD_SWAP \ {0x516e7cb5,0x6ecf,0x11d6,0x8f,0xf8,{0x00,0x02,0x2d,0x09,0x71,0x2b}} #define GPT_ENT_TYPE_FREEBSD_UFS \ @@ -87,8 +91,6 @@ struct gpt_ent { {0x516e7cb8,0x6ecf,0x11d6,0x8f,0xf8,{0x00,0x02,0x2d,0x09,0x71,0x2b}} #define GPT_ENT_TYPE_FREEBSD_ZFS \ {0x516e7cba,0x6ecf,0x11d6,0x8f,0xf8,{0x00,0x02,0x2d,0x09,0x71,0x2b}} -#define GPT_ENT_TYPE_FREEBSD_BOOT \ - {0x83bd6b9d,0x7f41,0x11dc,0xbe,0x0b,{0x00,0x15,0x60,0xb8,0x4f,0x0f}} /* * The following are unused but documented here to avoid reuse. diff --git a/sys/sys/iconv.h b/sys/sys/iconv.h index 671b24e1479..5e59795b6c7 100644 --- a/sys/sys/iconv.h +++ b/sys/sys/iconv.h @@ -240,7 +240,7 @@ int iconv_converter_tolowerstub(int c, void *handle); int iconv_converter_handler(module_t mod, int type, void *data); #ifdef ICONV_DEBUG -#define ICDEBUG(format, ...) printf("%s: "format, __func__ , __VA_ARGS__) +#define ICDEBUG(format, ...) printf("%s: "format, __func__ , ## __VA_ARGS__) #else #define ICDEBUG(format, ...) #endif diff --git a/sys/sys/imgact_aout.h b/sys/sys/imgact_aout.h index ca67cab6584..3eaa8e75a6d 100644 --- a/sys/sys/imgact_aout.h +++ b/sys/sys/imgact_aout.h @@ -119,7 +119,7 @@ struct exec { uint32_t a_trsize; /* text relocation size */ uint32_t a_drsize; /* data relocation size */ }; -#define a_magic a_midmag /* XXX Hack to work with imgact_{aout,gzip}.c */ +#define a_magic a_midmag /* Hack for emulators */ /* a_magic */ #define OMAGIC 0407 /* old impure format */ diff --git a/sys/sys/kernel.h b/sys/sys/kernel.h index 29166460f58..d514cb2f937 100644 --- a/sys/sys/kernel.h +++ b/sys/sys/kernel.h @@ -267,7 +267,7 @@ void sysinit_add(struct sysinit **set, struct sysinit **set_end); /* * Infrastructure for tunable 'constants'. Value may be specified at compile * time or kernel load time. Rules relating tunables together can be placed - * in a SYSINIT function at SI_SUB_TUNABLES with SI_ORDER_LAST. + * in a SYSINIT function at SI_SUB_TUNABLES with SI_ORDER_ANY. * * WARNING: developers should never use the reserved suffixes specified in * loader.conf(5) for any tunables or conflicts will result. diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h index 2a6c8aa165e..38adfaf2ffa 100644 --- a/sys/sys/mbuf.h +++ b/sys/sys/mbuf.h @@ -115,7 +115,7 @@ struct pkthdr { /* variables for ip and tcp reassembly */ void *header; /* pointer to packet header */ int len; /* total packet length */ - uint32_t flowid; /* packet's 4-tuple system + uint32_t flowid; /* packet's 4-tuple system * flow identifier */ /* variables for hardware checksum */ @@ -283,15 +283,24 @@ struct mbuf { #define CSUM_FRAGMENT 0x0010 /* will do IP fragmentation */ #define CSUM_TSO 0x0020 /* will do TSO */ #define CSUM_SCTP 0x0040 /* will csum SCTP */ +#define CSUM_SCTP_IPV6 0x0080 /* will csum IPv6/SCTP */ #define CSUM_IP_CHECKED 0x0100 /* did csum IP */ #define CSUM_IP_VALID 0x0200 /* ... the csum is valid */ #define CSUM_DATA_VALID 0x0400 /* csum_data field is valid */ #define CSUM_PSEUDO_HDR 0x0800 /* csum_data has pseudo hdr */ #define CSUM_SCTP_VALID 0x1000 /* SCTP checksum is valid */ +#define CSUM_UDP_IPV6 0x2000 /* will csum IPv6/UDP */ +#define CSUM_TCP_IPV6 0x4000 /* will csum IPv6/TCP */ +/* CSUM_TSO_IPV6 0x8000 will do IPv6/TSO */ + +/* CSUM_FRAGMENT_IPV6 0x10000 will do IPv6 fragementation */ + +#define CSUM_DELAY_DATA_IPV6 (CSUM_TCP_IPV6 | CSUM_UDP_IPV6) +#define CSUM_DATA_VALID_IPV6 CSUM_DATA_VALID #define CSUM_DELAY_DATA (CSUM_TCP | CSUM_UDP) -#define CSUM_DELAY_IP (CSUM_IP) /* XXX add ipv6 here too? */ +#define CSUM_DELAY_IP (CSUM_IP) /* Only v4, no v6 IP hdr csum */ /* * mbuf types. @@ -418,7 +427,7 @@ static __inline int m_gettype(int size) { int type; - + switch (size) { case MSIZE: type = EXT_MBUF; @@ -448,7 +457,7 @@ static __inline uma_zone_t m_getzone(int size) { uma_zone_t zone; - + switch (size) { case MCLBYTES: zone = zone_clust; @@ -630,7 +639,7 @@ m_free_fast(struct mbuf *m) if (m->m_flags & M_PKTHDR) KASSERT(SLIST_EMPTY(&m->m_pkthdr.tags), ("doing fast free of mbuf with tags")); #endif - + uma_zfree_arg(zone_mbuf, m, (void *)MB_NOTAGS); } @@ -690,7 +699,7 @@ m_cljset(struct mbuf *m, void *cl, int type) { uma_zone_t zone; int size; - + switch (type) { case EXT_CLUSTER: size = MCLBYTES; @@ -742,7 +751,7 @@ m_last(struct mbuf *m) extern void (*m_addr_chg_pf_p)(struct mbuf *m); -static __inline void +static __inline void m_addr_changed(struct mbuf *m) { @@ -1110,7 +1119,7 @@ m_tag_find(struct mbuf *m, int type, struct m_tag *start) #define M_SETFIB(_m, _fib) do { \ _m->m_flags &= ~M_FIB; \ _m->m_flags |= (((_fib) << M_FIBSHIFT) & M_FIB); \ -} while (0) +} while (0) #endif /* _KERNEL */ diff --git a/sys/sys/mdioctl.h b/sys/sys/mdioctl.h index 82ac397530f..5efae790800 100644 --- a/sys/sys/mdioctl.h +++ b/sys/sys/mdioctl.h @@ -79,6 +79,7 @@ struct md_ioctl { #define MDIOCDETACH _IOWR('m', 1, struct md_ioctl) /* detach disk */ #define MDIOCQUERY _IOWR('m', 2, struct md_ioctl) /* query status */ #define MDIOCLIST _IOWR('m', 3, struct md_ioctl) /* query status */ +#define MDIOCRESIZE _IOWR('m', 4, struct md_ioctl) /* resize disk */ #define MD_CLUSTER 0x01 /* Don't cluster */ #define MD_RESERVE 0x02 /* Pre-reserve swap */ diff --git a/sys/sys/mount.h b/sys/sys/mount.h index 319e094ad63..4b83ba44df2 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -148,6 +148,7 @@ struct vfsopt { * Lock reference: * m - mountlist_mtx * i - interlock + * v - vnode freelist mutex * * Unmarked fields are considered stable as long as a ref is held. * @@ -164,8 +165,8 @@ struct mount { int mnt_ref; /* (i) Reference count */ struct vnodelst mnt_nvnodelist; /* (i) list of vnodes */ int mnt_nvnodelistsize; /* (i) # of vnodes */ - struct vnodelst mnt_activevnodelist; /* (i) list of active vnodes */ - int mnt_activevnodelistsize;/* (i) # of active vnodes */ + struct vnodelst mnt_activevnodelist; /* (v) list of active vnodes */ + int mnt_activevnodelistsize;/* (v) # of active vnodes */ int mnt_writeopcount; /* (i) write syscalls pending */ int mnt_kern_flag; /* (i) kernel only flags */ uint64_t mnt_flag; /* (i) flags shared with user */ @@ -369,6 +370,9 @@ void __mnt_vnode_markerfree(struct vnode **mvp, struct mount *mp); #define MNTK_REFEXPIRE 0x00000020 /* refcount expiring is happening */ #define MNTK_EXTENDED_SHARED 0x00000040 /* Allow shared locking for more ops */ #define MNTK_SHARED_WRITES 0x00000080 /* Allow shared locking for writes */ +#define MNTK_NO_IOPF 0x00000100 /* Disallow page faults during reads + and writes. Filesystem shall properly + handle i/o state on EFAULT. */ #define MNTK_NOASYNC 0x00800000 /* disable async */ #define MNTK_UNMOUNT 0x01000000 /* unmount in progress */ #define MNTK_MWAIT 0x02000000 /* waiting for unmount to finish */ diff --git a/sys/sys/param.h b/sys/sys/param.h index 8873ec5f384..ff0a7d274cb 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -58,7 +58,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 1000011 /* Master, propagated to newvers */ +#define __FreeBSD_version 1000014 /* Master, propagated to newvers */ /* * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD, @@ -273,6 +273,7 @@ #ifndef howmany #define howmany(x, y) (((x)+((y)-1))/(y)) #endif +#define nitems(x) (sizeof((x)) / sizeof((x)[0])) #define rounddown(x, y) (((x)/(y))*(y)) #define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) /* to any y */ #define roundup2(x, y) (((x)+((y)-1))&(~((y)-1))) /* if y is powers of two */ diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 0873927b0c6..06df632a8b2 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -213,6 +213,7 @@ struct thread { struct seltd *td_sel; /* Select queue/channel. */ struct sleepqueue *td_sleepqueue; /* (k) Associated sleep queue. */ struct turnstile *td_turnstile; /* (k) Associated turnstile. */ + struct rl_q_entry *td_rlqe; /* (k) Associated range lock entry. */ struct umtx_q *td_umtxq; /* (c?) Link for when we're blocked. */ lwpid_t td_tid; /* (b) Thread ID. */ sigqueue_t td_sigqueue; /* (c) Sigs arrived, not delivered. */ @@ -247,6 +248,7 @@ struct thread { int td_slptick; /* (t) Time at sleep. */ int td_blktick; /* (t) Time spent blocked. */ int td_swvoltick; /* (t) Time at last SW_VOL switch. */ + u_int td_cow; /* (*) Number of copy-on-write faults */ struct rusage td_ru; /* (t) rusage information. */ struct rusage_ext td_rux; /* (t) Internal rusage information. */ uint64_t td_incruntime; /* (t) Cpu ticks to transfer to proc. */ @@ -257,7 +259,6 @@ struct thread { u_int td_uticks; /* (t) Statclock hits in user mode. */ int td_intrval; /* (t) Return value for sleepq. */ sigset_t td_oldsigmask; /* (k) Saved mask from pre sigpause. */ - sigset_t td_sigmask; /* (c) Current signal mask. */ volatile u_int td_generation; /* (k) For detection of preemption */ stack_t td_sigstk; /* (k) Stack ptr and on-stack flag. */ int td_xsig; /* (c) Signal for ptrace */ @@ -271,10 +272,11 @@ struct thread { struct osd td_osd; /* (k) Object specific data. */ struct vm_map_entry *td_map_def_user; /* (k) Deferred entries. */ pid_t td_dbg_forked; /* (c) Child pid for debugger. */ -#define td_endzero td_rqindex +#define td_endzero td_sigmask -/* Copied during fork1() or thread_sched_upcall(). */ +/* Copied during fork1() or create_thread(). */ #define td_startcopy td_endzero + sigset_t td_sigmask; /* (c) Current signal mask. */ u_char td_rqindex; /* (t) Run queue index. */ u_char td_base_pri; /* (t) Thread base kernel priority. */ u_char td_priority; /* (t) Thread active priority. */ @@ -284,7 +286,7 @@ struct thread { #define td_endcopy td_pcb /* - * Fields that must be manually set in fork1() or thread_sched_upcall() + * Fields that must be manually set in fork1() or create_thread() * or already have been set in the allocator, constructor, etc. */ struct pcb *td_pcb; /* (k) Kernel VA of pcb and kstack. */ @@ -311,7 +313,9 @@ struct thread { struct vnet *td_vnet; /* (k) Effective vnet. */ const char *td_vnet_lpush; /* (k) Debugging vnet push / pop. */ struct trapframe *td_intr_frame;/* (k) Frame of the current irq */ - struct proc *td_rfppwait_p; /* (k) The vforked child */ + struct proc *td_rfppwait_p; /* (k) The vforked child */ + struct vm_page **td_ma; /* (k) uio pages held */ + int td_ma_cnt; /* (k) size of *td_ma */ }; struct mtx *thread_lock_block(struct thread *); @@ -419,6 +423,7 @@ do { \ #define TDP_RFPPWAIT 0x02000000 /* Handle RFPPWAIT on syscall exit */ #define TDP_RESETSPUR 0x04000000 /* Reset spurious page fault history. */ #define TDP_NERRNO 0x08000000 /* Last errno is already in td_errno */ +#define TDP_UIOHELD 0x10000000 /* Current uio has pages held in td_ma */ /* * Reasons that the current thread can not be run yet. @@ -622,7 +627,6 @@ struct proc { #define P_SIGEVENT 0x200000 /* Process pending signals changed. */ #define P_SINGLE_BOUNDARY 0x400000 /* Threads should suspend at user boundary. */ #define P_HWPMC 0x800000 /* Process is using HWPMCs */ - #define P_JAILED 0x1000000 /* Process is in jail. */ #define P_ORPHAN 0x2000000 /* Orphaned. */ #define P_INEXEC 0x4000000 /* Process is in execve(). */ diff --git a/sys/sys/rangelock.h b/sys/sys/rangelock.h new file mode 100644 index 00000000000..fb0d2523eee --- /dev/null +++ b/sys/sys/rangelock.h @@ -0,0 +1,78 @@ +/*- + * Copyright (c) 2009 Konstantin Belousov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice unmodified, this list of conditions, and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _SYS_RANGELOCK_H +#define _SYS_RANGELOCK_H + +#include + +#define RL_LOCK_READ 0x0001 +#define RL_LOCK_WRITE 0x0002 +#define RL_LOCK_TYPE_MASK 0x0003 +#define RL_LOCK_GRANTED 0x0004 + +struct rl_q_entry; + +/* + * The structure representing the range lock. Caller may request + * read or write access to the range of bytes. Access is granted if + * all existing lock owners are compatible with the request. Two lock + * owners are compatible if their ranges do not overlap, or both + * owners are for read. + * + * Access to the structure itself is synchronized with the externally + * supplied mutex. + * + * rl_waiters is the queue of lock requests in the order of arrival. + * rl_currdep is the first lock request that cannot be granted now due + * to the preceding requests conflicting with it. + */ +struct rangelock { + TAILQ_HEAD(, rl_q_entry) rl_waiters; + struct rl_q_entry *rl_currdep; +}; + +#ifdef _KERNEL + +struct mtx; + +void rangelock_init(struct rangelock *lock); +void rangelock_destroy(struct rangelock *lock); +void rangelock_unlock(struct rangelock *lock, void *cookie, + struct mtx *ilk); +void *rangelock_unlock_range(struct rangelock *lock, void *cookie, + off_t start, off_t end, struct mtx *ilk); +void *rangelock_rlock(struct rangelock *lock, off_t start, off_t end, + struct mtx *ilk); +void *rangelock_wlock(struct rangelock *lock, off_t start, off_t end, + struct mtx *ilk); +void rlqentry_free(struct rl_q_entry *rlqe); + +#endif /* _KERNEL */ + +#endif /* _SYS_RANGELOCK_H */ diff --git a/sys/sys/sdt.h b/sys/sys/sdt.h index 90d169906d4..e7b5478cdad 100644 --- a/sys/sys/sdt.h +++ b/sys/sys/sdt.h @@ -92,6 +92,7 @@ #define SDT_PROBE_DEFINE4(prov, mod, func, name, sname, arg0, arg1, arg2, arg3) #define SDT_PROBE_DEFINE5(prov, mod, func, name, sname, arg0, arg1, arg2, arg3, arg4) +#define SDT_PROBE0(prov, mod, func, name) #define SDT_PROBE1(prov, mod, func, name, arg0) #define SDT_PROBE2(prov, mod, func, name, arg0, arg1) #define SDT_PROBE3(prov, mod, func, name, arg0, arg1, arg2) @@ -231,6 +232,8 @@ struct sdt_provider { SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3); \ SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4) +#define SDT_PROBE0(prov, mod, func, name) \ + SDT_PROBE(prov, mod, func, name, 0, 0, 0, 0, 0) #define SDT_PROBE1(prov, mod, func, name, arg0) \ SDT_PROBE(prov, mod, func, name, arg0, 0, 0, 0, 0) #define SDT_PROBE2(prov, mod, func, name, arg0, arg1) \ diff --git a/sys/sys/slicer.h b/sys/sys/slicer.h new file mode 100644 index 00000000000..a41861e0455 --- /dev/null +++ b/sys/sys/slicer.h @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _FLASH_SLICER_H_ +#define _FLASH_SLICER_H_ + +#include + +#define FLASH_SLICES_MAX_NUM 8 +#define FLASH_SLICES_MAX_NAME_LEN (32 + 1) + +#define FLASH_SLICES_FLAG_NONE 0 +#define FLASH_SLICES_FLAG_RO 1 /* Read only */ + +struct flash_slice { + off_t base; + off_t size; + char *label; + unsigned int flags; +}; + +#ifdef _KERNEL +int flash_fill_slices(device_t, struct flash_slice *, int *); +#endif /* _KERNEL */ + +#endif /* _FLASH_SLICER_H_ */ diff --git a/sys/sys/smp.h b/sys/sys/smp.h index 66e800873e4..a506669aaae 100644 --- a/sys/sys/smp.h +++ b/sys/sys/smp.h @@ -75,6 +75,7 @@ extern int smp_active; extern int smp_cpus; extern volatile cpuset_t started_cpus; extern volatile cpuset_t stopped_cpus; +extern volatile cpuset_t suspended_cpus; extern cpuset_t hlt_cpus_mask; extern cpuset_t logical_cpus_mask; #endif /* SMP */ @@ -163,7 +164,7 @@ void forward_signal(struct thread *); int restart_cpus(cpuset_t); int stop_cpus(cpuset_t); int stop_cpus_hard(cpuset_t); -#if defined(__amd64__) +#if defined(__amd64__) || defined(__i386__) int suspend_cpus(cpuset_t); #endif void smp_rendezvous_action(void); diff --git a/sys/sys/stdint.h b/sys/sys/stdint.h index aa5ac81d101..762e8795496 100644 --- a/sys/sys/stdint.h +++ b/sys/sys/stdint.h @@ -71,4 +71,8 @@ typedef __uintmax_t uintmax_t; #define __WORDSIZE 32 #endif +/* Limits of wchar_t. */ +#define WCHAR_MIN __WCHAR_MIN +#define WCHAR_MAX __WCHAR_MAX + #endif /* !_SYS_STDINT_H_ */ diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h index a9a1fb23137..321b70a20e6 100644 --- a/sys/sys/syscall.h +++ b/sys/sys/syscall.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/kern/syscalls.master 227691 2011-11-19 06:35:15Z ed + * created from FreeBSD: head/sys/kern/syscalls.master 236026 2012-05-25 21:50:48Z ed */ #define SYS_syscall 0 diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk index 11138862946..7d9e06c0d8d 100644 --- a/sys/sys/syscall.mk +++ b/sys/sys/syscall.mk @@ -1,7 +1,7 @@ # FreeBSD system call names. # DO NOT EDIT-- this file is automatically generated. # $FreeBSD$ -# created from FreeBSD: head/sys/kern/syscalls.master 227691 2011-11-19 06:35:15Z ed +# created from FreeBSD: head/sys/kern/syscalls.master 236026 2012-05-25 21:50:48Z ed MIASM = \ syscall.o \ exit.o \ diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index 08dba2fdb5f..4335550c319 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -89,6 +89,7 @@ int kern_fchmodat(struct thread *td, int fd, char *path, int kern_fchownat(struct thread *td, int fd, char *path, enum uio_seg pathseg, int uid, int gid, int flag); int kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg); +int kern_fhstat(struct thread *td, fhandle_t fh, struct stat *buf); int kern_fhstatfs(struct thread *td, fhandle_t fh, struct statfs *buf); int kern_fstat(struct thread *td, int fd, struct stat *sbp); int kern_fstatfs(struct thread *td, int fd, struct statfs *buf); @@ -96,7 +97,7 @@ int kern_ftruncate(struct thread *td, int fd, off_t length); int kern_futimes(struct thread *td, int fd, struct timeval *tptr, enum uio_seg tptrseg); int kern_getdirentries(struct thread *td, int fd, char *buf, u_int count, - long *basep); + long *basep, ssize_t *residp, enum uio_seg bufseg); int kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize, enum uio_seg bufseg, int flags); int kern_getgroups(struct thread *td, u_int *ngrp, gid_t *groups); diff --git a/sys/sys/sysent.h b/sys/sys/sysent.h index d916cf1388b..c49db41844a 100644 --- a/sys/sys/sysent.h +++ b/sys/sys/sysent.h @@ -124,6 +124,10 @@ struct sysentvec { vm_offset_t sv_shared_page_base; vm_offset_t sv_shared_page_len; vm_offset_t sv_sigcode_base; + vm_offset_t sv_timekeep_base; + int sv_timekeep_off; + int sv_timekeep_curr; + uint32_t sv_timekeep_gen; void *sv_shared_page_obj; void (*sv_schedtail)(struct thread *); }; @@ -256,7 +260,9 @@ int lkmressys(struct thread *, struct nosys_args *); int syscall_thread_enter(struct thread *td, struct sysent *se); void syscall_thread_exit(struct thread *td, struct sysent *se); -int shared_page_fill(int size, int align, const char *data); +int shared_page_alloc(int size, int align); +int shared_page_fill(int size, int align, const void *data); +void shared_page_write(int base, int size, const void *data); void exec_sysvec_init(void *param); #define INIT_SYSENTVEC(name, sv) \ diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h index 84a0ed77a8b..d0163c63186 100644 --- a/sys/sys/sysproto.h +++ b/sys/sys/sysproto.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/kern/syscalls.master 227691 2011-11-19 06:35:15Z ed + * created from FreeBSD: head/sys/kern/syscalls.master 236026 2012-05-25 21:50:48Z ed */ #ifndef _SYS_SYSPROTO_H_ @@ -1669,11 +1669,11 @@ struct lpathconf_args { }; struct cap_new_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; - char rights_l_[PADL_(u_int64_t)]; u_int64_t rights; char rights_r_[PADR_(u_int64_t)]; + char rights_l_[PADL_(uint64_t)]; uint64_t rights; char rights_r_[PADR_(uint64_t)]; }; struct cap_getrights_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; - char rightsp_l_[PADL_(u_int64_t *)]; u_int64_t * rightsp; char rightsp_r_[PADR_(u_int64_t *)]; + char rightsp_l_[PADL_(uint64_t *)]; uint64_t * rightsp; char rightsp_r_[PADR_(uint64_t *)]; }; struct cap_enter_args { register_t dummy; diff --git a/sys/sys/systm.h b/sys/sys/systm.h index 5375ec4f899..fec77d256d3 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -153,7 +153,7 @@ struct uio; struct _jmp_buf; struct trapframe; -int setjmp(struct _jmp_buf *); +int setjmp(struct _jmp_buf *) __returns_twice; void longjmp(struct _jmp_buf *, int) __dead2; int dumpstatus(vm_offset_t addr, off_t count); int nullop(void); diff --git a/sys/sys/ucontext.h b/sys/sys/ucontext.h index 609cdd38ccf..1e504c9e4df 100644 --- a/sys/sys/ucontext.h +++ b/sys/sys/ucontext.h @@ -71,7 +71,7 @@ struct ucontext4 { __BEGIN_DECLS -int getcontext(ucontext_t *); +int getcontext(ucontext_t *) __returns_twice; ucontext_t *getcontextx(void); int setcontext(const ucontext_t *); void makecontext(ucontext_t *, void (*)(void), int, ...); diff --git a/sys/sys/user.h b/sys/sys/user.h index 2c37e9972cd..42733a6ee2a 100644 --- a/sys/sys/user.h +++ b/sys/sys/user.h @@ -159,7 +159,7 @@ struct kinfo_proc { u_int ki_estcpu; /* Time averaged value of ki_cpticks */ u_int ki_slptime; /* Time since last blocked */ u_int ki_swtime; /* Time swapped in or out */ - int ki_spareint1; /* unused (just here for alignment) */ + u_int ki_cow; /* number of copy-on-write faults */ u_int64_t ki_runtime; /* Real time in microsec */ struct timeval ki_start; /* starting time */ struct timeval ki_childtime; /* time used by process children */ diff --git a/sys/sys/vdso.h b/sys/sys/vdso.h new file mode 100644 index 00000000000..653a60605b0 --- /dev/null +++ b/sys/sys/vdso.h @@ -0,0 +1,122 @@ +/*- + * Copyright 2012 Konstantin Belousov . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _SYS_VDSO_H +#define _SYS_VDSO_H + +#include +#include + +struct vdso_timehands { + uint32_t th_algo; + uint32_t th_gen; + uint64_t th_scale; + uint32_t th_offset_count; + uint32_t th_counter_mask; + struct bintime th_offset; + struct bintime th_boottime; + VDSO_TIMEHANDS_MD +}; + +struct vdso_timekeep { + uint32_t tk_ver; + uint32_t tk_enabled; + uint32_t tk_current; + struct vdso_timehands tk_th[]; +}; + +#define VDSO_TK_CURRENT_BUSY 0xffffffff +#define VDSO_TK_VER_1 0x1 +#define VDSO_TK_VER_CURR VDSO_TK_VER_1 +#define VDSO_TH_ALGO_1 0x1 + +#ifndef _KERNEL + +struct timespec; +struct timeval; +struct timezone; + +int __vdso_clock_gettime(clockid_t clock_id, struct timespec *ts); +#pragma weak __vdso_clock_gettime + +int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz); +#pragma weak __vdso_gettimeofday + +u_int __vdso_gettc(const struct vdso_timehands *vdso_th); +#pragma weak __vdso_gettc + +#endif + +#ifdef _KERNEL + +void timekeep_push_vdso(void); + +uint32_t tc_fill_vdso_timehands(struct vdso_timehands *vdso_th); + +/* + * The cpu_fill_vdso_timehands() function should fill MD-part of the + * struct vdso_timehands, which is both machine- and + * timecounter-depended. The return value should be 1 if fast + * userspace timecounter is enabled by hardware, and 0 otherwise. The + * global sysctl enable override is handled by machine-independed code + * after cpu_fill_vdso_timehands() call is made. + */ +uint32_t cpu_fill_vdso_timehands(struct vdso_timehands *vdso_th); + +#define VDSO_TH_NUM 4 + +#ifdef COMPAT_FREEBSD32 +struct bintime32 { + uint32_t sec; + uint32_t frac[2]; +}; + +struct vdso_timehands32 { + uint32_t th_algo; + uint32_t th_gen; + uint32_t th_scale[2]; + uint32_t th_offset_count; + uint32_t th_counter_mask; + struct bintime32 th_offset; + struct bintime32 th_boottime; + VDSO_TIMEHANDS_MD32 +}; + +struct vdso_timekeep32 { + uint32_t tk_ver; + uint32_t tk_enabled; + uint32_t tk_current; + struct vdso_timehands32 tk_th[]; +}; + +uint32_t tc_fill_vdso_timehands32(struct vdso_timehands32 *vdso_th32); +uint32_t cpu_fill_vdso_timehands32(struct vdso_timehands32 *vdso_th32); + +#endif +#endif + +#endif diff --git a/sys/sys/vmmeter.h b/sys/sys/vmmeter.h index 99531a6c84a..c66016c6a92 100644 --- a/sys/sys/vmmeter.h +++ b/sys/sys/vmmeter.h @@ -79,7 +79,7 @@ struct vmmeter { u_int v_pdpages; /* (q) pages analyzed by daemon */ u_int v_tcached; /* (p) total pages cached */ - u_int v_dfree; /* (q) pages freed by daemon */ + u_int v_dfree; /* (p) pages freed by daemon */ u_int v_pfree; /* (p) pages freed by exiting processes */ u_int v_tfree; /* (p) total pages freed */ /* diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 49f6f5b4e0e..1bde8b9d09d 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -164,7 +165,8 @@ struct vnode { */ struct vpollinfo *v_pollinfo; /* i Poll events, p for *v_pi */ struct label *v_label; /* MAC label for vnode */ - struct lockf *v_lockf; /* Byte-level lock list */ + struct lockf *v_lockf; /* Byte-level advisory lock list */ + struct rangelock v_rl; /* Byte-range lock */ }; #endif /* defined(_KERNEL) || defined(_KVM_VNODE) */ @@ -640,6 +642,8 @@ void vunref(struct vnode *); void vn_printf(struct vnode *vp, const char *fmt, ...) __printflike(2,3); #define vprint(label, vp) vn_printf((vp), "%s\n", (label)) int vrecycle(struct vnode *vp); +int vn_bmap_seekhole(struct vnode *vp, u_long cmd, off_t *off, + struct ucred *cred); int vn_close(struct vnode *vp, int flags, struct ucred *file_cred, struct thread *td); void vn_finished_write(struct mount *mp); @@ -650,6 +654,8 @@ int _vn_lock(struct vnode *vp, int flags, char *file, int line); int vn_open(struct nameidata *ndp, int *flagp, int cmode, struct file *fp); int vn_open_cred(struct nameidata *ndp, int *flagp, int cmode, u_int vn_open_flags, struct ucred *cred, struct file *fp); +int vn_open_vnode(struct vnode *vp, int fmode, struct ucred *cred, + struct thread *td, struct file *fp); void vn_pages_remove(struct vnode *vp, vm_pindex_t start, vm_pindex_t end); int vn_pollrecord(struct vnode *vp, struct thread *p, int events); int vn_rdwr(enum uio_rw rw, struct vnode *vp, void *base, @@ -677,6 +683,17 @@ int vn_extattr_rm(struct vnode *vp, int ioflg, int attrnamespace, int vn_vget_ino(struct vnode *vp, ino_t ino, int lkflags, struct vnode **rvp); +int vn_io_fault_uiomove(char *data, int xfersize, struct uio *uio); + +#define vn_rangelock_unlock(vp, cookie) \ + rangelock_unlock(&(vp)->v_rl, (cookie), VI_MTX(vp)) +#define vn_rangelock_unlock_range(vp, cookie, start, end) \ + rangelock_unlock_range(&(vp)->v_rl, (cookie), (start), (end), \ + VI_MTX(vp)) +#define vn_rangelock_rlock(vp, start, end) \ + rangelock_rlock(&(vp)->v_rl, (start), (end), VI_MTX(vp)) +#define vn_rangelock_wlock(vp, start, end) \ + rangelock_wlock(&(vp)->v_rl, (start), (end), VI_MTX(vp)) int vfs_cache_lookup(struct vop_lookup_args *ap); void vfs_timestamp(struct timespec *); diff --git a/sys/sys/vtoc.h b/sys/sys/vtoc.h index 55c80e22521..82c6a57dc13 100644 --- a/sys/sys/vtoc.h +++ b/sys/sys/vtoc.h @@ -51,6 +51,7 @@ #define VTOC_TAG_FREEBSD_UFS 0x0902 #define VTOC_TAG_FREEBSD_VINUM 0x0903 #define VTOC_TAG_FREEBSD_ZFS 0x0904 +#define VTOC_TAG_FREEBSD_NANDFS 0x0905 #define VTOC_FLAG_UNMNT 0x01 /* unmountable partition */ #define VTOC_FLAG_RDONLY 0x10 /* partition is read/only */ diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c index 68ea172ac49..2b3740d4fa5 100644 --- a/sys/ufs/ffs/ffs_alloc.c +++ b/sys/ufs/ffs/ffs_alloc.c @@ -2865,10 +2865,9 @@ buffered_write(fp, uio, active_cred, flags, td) if (ip->i_devvp != devvp) return (EINVAL); fs = ip->i_fs; + foffset_lock_uio(fp, uio, flags); vfslocked = VFS_LOCK_GIANT(ip->i_vnode->v_mount); vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); - if ((flags & FOF_OFFSET) == 0) - uio->uio_offset = fp->f_offset; #ifdef DEBUG if (fsckcmds) { printf("%s: buffered write for block %jd\n", @@ -2893,11 +2892,9 @@ buffered_write(fp, uio, active_cred, flags, td) goto out; } error = bwrite(bp); - if ((flags & FOF_OFFSET) == 0) - fp->f_offset = uio->uio_offset; - fp->f_nextoff = uio->uio_offset; out: VOP_UNLOCK(devvp, 0); VFS_UNLOCK_GIANT(vfslocked); + foffset_unlock_uio(fp, uio, flags | FOF_NEXTOFF); return (error); } diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c index b2bd2bd12fc..3533b0737cb 100644 --- a/sys/ufs/ffs/ffs_softdep.c +++ b/sys/ufs/ffs/ffs_softdep.c @@ -920,7 +920,7 @@ static struct freefrag *allocindir_merge(struct allocindir *, static int bmsafemap_find(struct bmsafemap_hashhead *, struct mount *, int, struct bmsafemap **); static struct bmsafemap *bmsafemap_lookup(struct mount *, struct buf *, - int cg); + int cg, struct bmsafemap *); static int newblk_find(struct newblk_hashhead *, struct mount *, ufs2_daddr_t, int, struct newblk **); static int newblk_lookup(struct mount *, ufs2_daddr_t, int, struct newblk **); @@ -4707,12 +4707,26 @@ softdep_setup_inomapdep(bp, ip, newinum, mode) * Panic if it already exists as something is seriously wrong. * Otherwise add it to the dependency list for the buffer holding * the cylinder group map from which it was allocated. + * + * We have to preallocate a bmsafemap entry in case it is needed + * in bmsafemap_lookup since once we allocate the inodedep, we + * have to finish initializing it before we can FREE_LOCK(). + * By preallocating, we avoid FREE_LOCK() while doing a malloc + * in bmsafemap_lookup. We cannot call bmsafemap_lookup before + * creating the inodedep as it can be freed during the time + * that we FREE_LOCK() while allocating the inodedep. We must + * call workitem_alloc() before entering the locked section as + * it also acquires the lock and we must avoid trying doing so + * recursively. */ + bmsafemap = malloc(sizeof(struct bmsafemap), + M_BMSAFEMAP, M_SOFTDEP_FLAGS); + workitem_alloc(&bmsafemap->sm_list, D_BMSAFEMAP, mp); ACQUIRE_LOCK(&lk); if ((inodedep_lookup(mp, newinum, DEPALLOC | NODELAY, &inodedep))) panic("softdep_setup_inomapdep: dependency %p for new" "inode already exists", inodedep); - bmsafemap = bmsafemap_lookup(mp, bp, ino_to_cg(fs, newinum)); + bmsafemap = bmsafemap_lookup(mp, bp, ino_to_cg(fs, newinum), bmsafemap); if (jaddref) { LIST_INSERT_HEAD(&bmsafemap->sm_jaddrefhd, jaddref, ja_bmdeps); TAILQ_INSERT_TAIL(&inodedep->id_inoreflst, &jaddref->ja_ref, @@ -4786,7 +4800,7 @@ softdep_setup_blkmapdep(bp, mp, newblkno, frags, oldfrags) if (newblk_lookup(mp, newblkno, DEPALLOC, &newblk) != 0) panic("softdep_setup_blkmapdep: found block"); newblk->nb_bmsafemap = bmsafemap = bmsafemap_lookup(mp, bp, - dtog(fs, newblkno)); + dtog(fs, newblkno), NULL); if (jnewblk) { jnewblk->jn_dep = (struct worklist *)newblk; LIST_INSERT_HEAD(&bmsafemap->sm_jnewblkhd, jnewblk, jn_deps); @@ -4827,13 +4841,16 @@ bmsafemap_find(bmsafemaphd, mp, cg, bmsafemapp) * Find the bmsafemap associated with a cylinder group buffer. * If none exists, create one. The buffer must be locked when * this routine is called and this routine must be called with - * splbio interrupts blocked. + * the softdep lock held. To avoid giving up the lock while + * allocating a new bmsafemap, a preallocated bmsafemap may be + * provided. If it is provided but not needed, it is freed. */ static struct bmsafemap * -bmsafemap_lookup(mp, bp, cg) +bmsafemap_lookup(mp, bp, cg, newbmsafemap) struct mount *mp; struct buf *bp; int cg; + struct bmsafemap *newbmsafemap; { struct bmsafemap_hashhead *bmsafemaphd; struct bmsafemap *bmsafemap, *collision; @@ -4843,16 +4860,27 @@ bmsafemap_lookup(mp, bp, cg) mtx_assert(&lk, MA_OWNED); if (bp) LIST_FOREACH(wk, &bp->b_dep, wk_list) - if (wk->wk_type == D_BMSAFEMAP) + if (wk->wk_type == D_BMSAFEMAP) { + if (newbmsafemap) + WORKITEM_FREE(newbmsafemap,D_BMSAFEMAP); return (WK_BMSAFEMAP(wk)); + } fs = VFSTOUFS(mp)->um_fs; bmsafemaphd = BMSAFEMAP_HASH(fs, cg); - if (bmsafemap_find(bmsafemaphd, mp, cg, &bmsafemap) == 1) + if (bmsafemap_find(bmsafemaphd, mp, cg, &bmsafemap) == 1) { + if (newbmsafemap) + WORKITEM_FREE(newbmsafemap, D_BMSAFEMAP); return (bmsafemap); - FREE_LOCK(&lk); - bmsafemap = malloc(sizeof(struct bmsafemap), - M_BMSAFEMAP, M_SOFTDEP_FLAGS); - workitem_alloc(&bmsafemap->sm_list, D_BMSAFEMAP, mp); + } + if (newbmsafemap) { + bmsafemap = newbmsafemap; + } else { + FREE_LOCK(&lk); + bmsafemap = malloc(sizeof(struct bmsafemap), + M_BMSAFEMAP, M_SOFTDEP_FLAGS); + workitem_alloc(&bmsafemap->sm_list, D_BMSAFEMAP, mp); + ACQUIRE_LOCK(&lk); + } bmsafemap->sm_buf = bp; LIST_INIT(&bmsafemap->sm_inodedephd); LIST_INIT(&bmsafemap->sm_inodedepwr); @@ -4862,7 +4890,6 @@ bmsafemap_lookup(mp, bp, cg) LIST_INIT(&bmsafemap->sm_jnewblkhd); LIST_INIT(&bmsafemap->sm_freehd); LIST_INIT(&bmsafemap->sm_freewr); - ACQUIRE_LOCK(&lk); if (bmsafemap_find(bmsafemaphd, mp, cg, &collision) == 1) { WORKITEM_FREE(bmsafemap, D_BMSAFEMAP); return (collision); @@ -10221,7 +10248,7 @@ softdep_setup_blkfree(mp, bp, blkno, frags, wkhd) ACQUIRE_LOCK(&lk); /* Lookup the bmsafemap so we track when it is dirty. */ fs = VFSTOUFS(mp)->um_fs; - bmsafemap = bmsafemap_lookup(mp, bp, dtog(fs, blkno)); + bmsafemap = bmsafemap_lookup(mp, bp, dtog(fs, blkno), NULL); /* * Detach any jnewblks which have been canceled. They must linger * until the bitmap is cleared again by ffs_blkfree() to prevent @@ -10267,7 +10294,7 @@ softdep_setup_blkfree(mp, bp, blkno, frags, wkhd) * allocation dependency. */ fs = VFSTOUFS(mp)->um_fs; - bmsafemap = bmsafemap_lookup(mp, bp, dtog(fs, blkno)); + bmsafemap = bmsafemap_lookup(mp, bp, dtog(fs, blkno), NULL); end = blkno + frags; LIST_FOREACH(jnewblk, &bmsafemap->sm_jnewblkhd, jn_deps) { /* @@ -10687,6 +10714,7 @@ handle_jwork(wkhd) case D_FREEFRAG: rele_jseg(WK_JSEG(WK_FREEFRAG(wk)->ff_jdep)); WORKITEM_FREE(wk, D_FREEFRAG); + continue; case D_FREEWORK: handle_written_freework(WK_FREEWORK(wk)); continue; diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index 9aff694e83f..fee8012973f 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -1064,7 +1064,7 @@ ffs_mountfs(devvp, mp, td) */ MNT_ILOCK(mp); mp->mnt_kern_flag |= MNTK_MPSAFE | MNTK_LOOKUP_SHARED | - MNTK_EXTENDED_SHARED; + MNTK_EXTENDED_SHARED | MNTK_NO_IOPF; MNT_IUNLOCK(mp); #ifdef UFS_EXTATTR #ifdef UFS_EXTATTR_AUTOSTART diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index 0699eef37b8..ee6733bfd43 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -567,7 +567,7 @@ ffs_read(ap) xfersize = size; } - error = uiomove((char *)bp->b_data + blkoffset, + error = vn_io_fault_uiomove((char *)bp->b_data + blkoffset, (int)xfersize, uio); if (error) break; @@ -738,8 +738,8 @@ ffs_write(ap) if (size < xfersize) xfersize = size; - error = - uiomove((char *)bp->b_data + blkoffset, (int)xfersize, uio); + error = vn_io_fault_uiomove((char *)bp->b_data + blkoffset, + (int)xfersize, uio); /* * If the buffer is not already filled and we encounter an * error while trying to fill it, we have to clear out any @@ -1648,7 +1648,8 @@ vop_setextattr { struct inode *ip; struct fs *fs; uint32_t ealength, ul; - int ealen, olen, eapad1, eapad2, error, i, easize; + ssize_t ealen; + int olen, eapad1, eapad2, error, i, easize; u_char *eae, *p; ip = VTOI(ap->a_vp); @@ -1667,6 +1668,10 @@ vop_setextattr { if (ap->a_vp->v_mount->mnt_flag & MNT_RDONLY) return (EROFS); + ealen = ap->a_uio->uio_resid; + if (ealen < 0 || ealen > lblktosize(fs, NXADDR)) + return (EINVAL); + error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace, ap->a_cred, ap->a_td, VWRITE); if (error) { @@ -1684,7 +1689,6 @@ vop_setextattr { if (error) return (error); - ealen = ap->a_uio->uio_resid; ealength = sizeof(uint32_t) + 3 + strlen(ap->a_name); eapad1 = 8 - (ealength % 8); if (eapad1 == 8) @@ -1712,7 +1716,7 @@ vop_setextattr { easize += (ealength - ul); } } - if (easize > NXADDR * fs->fs_bsize) { + if (easize > lblktosize(fs, NXADDR)) { free(eae, M_TEMP); ffs_close_ea(ap->a_vp, 0, ap->a_cred, ap->a_td); if (ip->i_ea_area != NULL && ip->i_ea_error == 0) diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index f55b51560cc..a271cdfda62 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -102,6 +103,7 @@ static int ufs_chown(struct vnode *, uid_t, gid_t, struct ucred *, struct thread static vop_close_t ufs_close; static vop_create_t ufs_create; static vop_getattr_t ufs_getattr; +static vop_ioctl_t ufs_ioctl; static vop_link_t ufs_link; static int ufs_makeinode(int mode, struct vnode *, struct vnode **, struct componentname *); static vop_markatime_t ufs_markatime; @@ -2504,6 +2506,9 @@ ufs_pathconf(ap) *ap->a_retval = 0; #endif break; + case _PC_MIN_HOLE_SIZE: + *ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_iosize; + break; case _PC_ASYNC_IO: /* _PC_ASYNC_IO should have been handled by upper layers. */ KASSERT(0, ("_PC_ASYNC_IO should not get here")); @@ -2737,6 +2742,20 @@ bad: return (error); } +static int +ufs_ioctl(struct vop_ioctl_args *ap) +{ + + switch (ap->a_command) { + case FIOSEEKDATA: + case FIOSEEKHOLE: + return (vn_bmap_seekhole(ap->a_vp, ap->a_command, + (off_t *)ap->a_data, ap->a_cred)); + default: + return (ENOTTY); + } +} + /* Global vfs data structures for ufs. */ struct vop_vector ufs_vnodeops = { .vop_default = &default_vnodeops, @@ -2751,6 +2770,7 @@ struct vop_vector ufs_vnodeops = { .vop_create = ufs_create, .vop_getattr = ufs_getattr, .vop_inactive = ufs_inactive, + .vop_ioctl = ufs_ioctl, .vop_link = ufs_link, .vop_lookup = vfs_cache_lookup, .vop_markatime = ufs_markatime, diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c index 899369c4442..ad3e914504e 100644 --- a/sys/vm/device_pager.c +++ b/sys/vm/device_pager.c @@ -61,6 +61,7 @@ static void dev_pager_putpages(vm_object_t, vm_page_t *, int, boolean_t, int *); static boolean_t dev_pager_haspage(vm_object_t, vm_pindex_t, int *, int *); +static void dev_pager_free_page(vm_object_t object, vm_page_t m); /* list of device pager objects */ static struct pagerlst dev_pager_object_list; @@ -76,6 +77,14 @@ struct pagerops devicepagerops = { .pgo_haspage = dev_pager_haspage, }; +struct pagerops mgtdevicepagerops = { + .pgo_alloc = dev_pager_alloc, + .pgo_dealloc = dev_pager_dealloc, + .pgo_getpages = dev_pager_getpages, + .pgo_putpages = dev_pager_putpages, + .pgo_haspage = dev_pager_haspage, +}; + static int old_dev_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot, vm_ooffset_t foff, struct ucred *cred, u_short *color); static void old_dev_pager_dtor(void *handle); @@ -102,7 +111,6 @@ cdev_pager_lookup(void *handle) mtx_lock(&dev_pager_mtx); object = vm_pager_object_lookup(&dev_pager_object_list, handle); - vm_object_reference(object); mtx_unlock(&dev_pager_mtx); return (object); } @@ -115,7 +123,7 @@ cdev_pager_allocate(void *handle, enum obj_type tp, struct cdev_pager_ops *ops, vm_pindex_t pindex; u_short color; - if (tp != OBJT_DEVICE) + if (tp != OBJT_DEVICE && tp != OBJT_MGTDEVICE) return (NULL); /* @@ -196,6 +204,24 @@ cdev_pager_free_page(vm_object_t object, vm_page_t m) { VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); + if (object->type == OBJT_MGTDEVICE) { + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("unmanaged %p", m)); + pmap_remove_all(m); + vm_page_lock(m); + vm_page_remove(m); + vm_page_unlock(m); + } else if (object->type == OBJT_DEVICE) + dev_pager_free_page(object, m); +} + +static void +dev_pager_free_page(vm_object_t object, vm_page_t m) +{ + + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); + KASSERT((object->type == OBJT_DEVICE && + (m->oflags & VPO_UNMANAGED) != 0), + ("Managed device or page obj %p m %p", object, m)); TAILQ_REMOVE(&object->un_pager.devp.devp_pglist, m, pageq); vm_page_putfake(m); } @@ -213,11 +239,15 @@ dev_pager_dealloc(object) TAILQ_REMOVE(&dev_pager_object_list, object, pager_object_list); mtx_unlock(&dev_pager_mtx); VM_OBJECT_LOCK(object); - /* - * Free up our fake pages. - */ - while ((m = TAILQ_FIRST(&object->un_pager.devp.devp_pglist)) != NULL) - cdev_pager_free_page(object, m); + + if (object->type == OBJT_DEVICE) { + /* + * Free up our fake pages. + */ + while ((m = TAILQ_FIRST(&object->un_pager.devp.devp_pglist)) + != NULL) + dev_pager_free_page(object, m); + } } static int @@ -240,8 +270,15 @@ dev_pager_getpages(vm_object_t object, vm_page_t *ma, int count, int reqpage) } if (error == VM_PAGER_OK) { - TAILQ_INSERT_TAIL(&object->un_pager.devp.devp_pglist, - ma[reqpage], pageq); + KASSERT((object->type == OBJT_DEVICE && + (ma[reqpage]->oflags & VPO_UNMANAGED) != 0) || + (object->type == OBJT_MGTDEVICE && + (ma[reqpage]->oflags & VPO_UNMANAGED) == 0), + ("Wrong page type %p %p", ma[reqpage], object)); + if (object->type == OBJT_DEVICE) { + TAILQ_INSERT_TAIL(&object->un_pager.devp.devp_pglist, + ma[reqpage], pageq); + } } return (error); diff --git a/sys/vm/pmap.h b/sys/vm/pmap.h index a4f1e707cdb..d06c22bffb1 100644 --- a/sys/vm/pmap.h +++ b/sys/vm/pmap.h @@ -80,10 +80,11 @@ struct pmap_statistics { typedef struct pmap_statistics *pmap_statistics_t; /* - * Each machine dependent implementation is expected to provide: + * Each machine-dependent implementation is required to provide: * * vm_memattr_t pmap_page_get_memattr(vm_page_t); * boolean_t pmap_page_is_mapped(vm_page_t); + * boolean_t pmap_page_is_write_mapped(vm_page_t); * void pmap_page_set_memattr(vm_page_t, vm_memattr_t); */ #include diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index be999cc8c13..3c902e3fd17 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -1593,7 +1593,7 @@ swp_pager_async_iodone(struct buf *bp) * status, then finish the I/O ( which decrements the * busy count and possibly wakes waiter's up ). */ - KASSERT((m->aflags & PGA_WRITEABLE) == 0, + KASSERT(!pmap_page_is_write_mapped(m), ("swp_pager_async_iodone: page %p is not write" " protected", m)); vm_page_undirty(m); diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c index eaa2faf6761..925d2758a70 100644 --- a/sys/vm/uma_core.c +++ b/sys/vm/uma_core.c @@ -272,10 +272,7 @@ SYSCTL_PROC(_vm, OID_AUTO, zone_stats, CTLFLAG_RD|CTLTYPE_STRUCT, static void bucket_enable(void) { - if (cnt.v_free_count < cnt.v_free_min) - bucketdisable = 1; - else - bucketdisable = 0; + bucketdisable = vm_page_count_min(); } /* @@ -2196,6 +2193,7 @@ keg_fetch_slab(uma_keg_t keg, uma_zone_t zone, int flags) zone->uz_flags |= UMA_ZFLAG_FULL; if (flags & M_NOWAIT) break; + zone->uz_sleeps++; msleep(keg, &keg->uk_lock, PVM, "keglimit", 0); continue; } @@ -3384,6 +3382,8 @@ DB_SHOW_COMMAND(uma, db_show_uma) (uintmax_t)kz->uk_size, (intmax_t)(allocs - frees), cachefree, (uintmax_t)allocs, sleeps); + if (db_pager_quit) + return; } } } diff --git a/sys/vm/vm.h b/sys/vm/vm.h index 67cc9226359..241a22541b8 100644 --- a/sys/vm/vm.h +++ b/sys/vm/vm.h @@ -83,7 +83,7 @@ typedef u_char vm_prot_t; /* protection codes */ #define VM_PROT_DEFAULT VM_PROT_ALL enum obj_type { OBJT_DEFAULT, OBJT_SWAP, OBJT_VNODE, OBJT_DEVICE, OBJT_PHYS, - OBJT_DEAD, OBJT_SG }; + OBJT_DEAD, OBJT_SG, OBJT_MGTDEVICE }; typedef u_char objtype_t; union vm_map_object; diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index b1a0d0c5df4..e3a29f00398 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -118,9 +118,11 @@ static int prefault_pageorder[] = { static int vm_fault_additional_pages(vm_page_t, int, int, vm_page_t *, int *); static void vm_fault_prefault(pmap_t, vm_offset_t, vm_map_entry_t); -#define VM_FAULT_READ_AHEAD 8 -#define VM_FAULT_READ_BEHIND 7 -#define VM_FAULT_READ (VM_FAULT_READ_AHEAD+VM_FAULT_READ_BEHIND+1) +#define VM_FAULT_READ_BEHIND 8 +#define VM_FAULT_READ_MAX (1 + VM_FAULT_READ_AHEAD_MAX) +#define VM_FAULT_NINCR (VM_FAULT_READ_MAX / VM_FAULT_READ_BEHIND) +#define VM_FAULT_SUM (VM_FAULT_NINCR * (VM_FAULT_NINCR + 1) / 2) +#define VM_FAULT_CACHE_BEHIND (VM_FAULT_READ_BEHIND * VM_FAULT_SUM) struct faultstate { vm_page_t m; @@ -136,6 +138,8 @@ struct faultstate { int vfslocked; }; +static void vm_fault_cache_behind(const struct faultstate *fs, int distance); + static inline void release_page(struct faultstate *fs) { @@ -236,13 +240,13 @@ vm_fault_hold(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, int fault_flags, vm_page_t *m_hold) { vm_prot_t prot; - int is_first_object_locked, result; - boolean_t growstack, wired; + long ahead, behind; + int alloc_req, era, faultcount, nera, reqpage, result; + boolean_t growstack, is_first_object_locked, wired; int map_generation; vm_object_t next_object; - vm_page_t marray[VM_FAULT_READ], mt, mt_prev; + vm_page_t marray[VM_FAULT_READ_MAX]; int hardfault; - int faultcount, ahead, behind, alloc_req; struct faultstate fs; struct vnode *vp; int locked, error; @@ -252,7 +256,7 @@ vm_fault_hold(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, PCPU_INC(cnt.v_vm_faults); fs.vp = NULL; fs.vfslocked = 0; - faultcount = behind = 0; + faultcount = reqpage = 0; RetryFault:; @@ -460,75 +464,47 @@ readrest: */ if (TRYPAGER) { int rv; - int reqpage = 0; u_char behavior = vm_map_entry_behavior(fs.entry); if (behavior == MAP_ENTRY_BEHAV_RANDOM || P_KILLED(curproc)) { - ahead = 0; behind = 0; + ahead = 0; + } else if (behavior == MAP_ENTRY_BEHAV_SEQUENTIAL) { + behind = 0; + ahead = atop(fs.entry->end - vaddr) - 1; + if (ahead > VM_FAULT_READ_AHEAD_MAX) + ahead = VM_FAULT_READ_AHEAD_MAX; + if (fs.pindex == fs.entry->next_read) + vm_fault_cache_behind(&fs, + VM_FAULT_READ_MAX); } else { - behind = (vaddr - fs.entry->start) >> PAGE_SHIFT; + /* + * If this is a sequential page fault, then + * arithmetically increase the number of pages + * in the read-ahead window. Otherwise, reset + * the read-ahead window to its smallest size. + */ + behind = atop(vaddr - fs.entry->start); if (behind > VM_FAULT_READ_BEHIND) behind = VM_FAULT_READ_BEHIND; - - ahead = ((fs.entry->end - vaddr) >> PAGE_SHIFT) - 1; - if (ahead > VM_FAULT_READ_AHEAD) - ahead = VM_FAULT_READ_AHEAD; + ahead = atop(fs.entry->end - vaddr) - 1; + era = fs.entry->read_ahead; + if (fs.pindex == fs.entry->next_read) { + nera = era + behind; + if (nera > VM_FAULT_READ_AHEAD_MAX) + nera = VM_FAULT_READ_AHEAD_MAX; + behind = 0; + if (ahead > nera) + ahead = nera; + if (era == VM_FAULT_READ_AHEAD_MAX) + vm_fault_cache_behind(&fs, + VM_FAULT_CACHE_BEHIND); + } else if (ahead > VM_FAULT_READ_AHEAD_MIN) + ahead = VM_FAULT_READ_AHEAD_MIN; + if (era != ahead) + fs.entry->read_ahead = ahead; } - is_first_object_locked = FALSE; - if ((behavior == MAP_ENTRY_BEHAV_SEQUENTIAL || - (behavior != MAP_ENTRY_BEHAV_RANDOM && - fs.pindex >= fs.entry->lastr && - fs.pindex < fs.entry->lastr + VM_FAULT_READ)) && - (fs.first_object == fs.object || - (is_first_object_locked = VM_OBJECT_TRYLOCK(fs.first_object))) && - fs.first_object->type != OBJT_DEVICE && - fs.first_object->type != OBJT_PHYS && - fs.first_object->type != OBJT_SG) { - vm_pindex_t firstpindex; - - if (fs.first_pindex < 2 * VM_FAULT_READ) - firstpindex = 0; - else - firstpindex = fs.first_pindex - 2 * VM_FAULT_READ; - mt = fs.first_object != fs.object ? - fs.first_m : fs.m; - KASSERT(mt != NULL, ("vm_fault: missing mt")); - KASSERT((mt->oflags & VPO_BUSY) != 0, - ("vm_fault: mt %p not busy", mt)); - mt_prev = vm_page_prev(mt); - - /* - * note: partially valid pages cannot be - * included in the lookahead - NFS piecemeal - * writes will barf on it badly. - */ - while ((mt = mt_prev) != NULL && - mt->pindex >= firstpindex && - mt->valid == VM_PAGE_BITS_ALL) { - mt_prev = vm_page_prev(mt); - if (mt->busy || - (mt->oflags & VPO_BUSY)) - continue; - vm_page_lock(mt); - if (mt->hold_count || - mt->wire_count) { - vm_page_unlock(mt); - continue; - } - pmap_remove_all(mt); - if (mt->dirty != 0) - vm_page_deactivate(mt); - else - vm_page_cache(mt); - vm_page_unlock(mt); - } - ahead += behind; - behind = 0; - } - if (is_first_object_locked) - VM_OBJECT_UNLOCK(fs.first_object); /* * Call the pager to retrieve the data, if any, after @@ -829,6 +805,7 @@ vnode_locked: if (!is_first_object_locked) VM_OBJECT_LOCK(fs.object); PCPU_INC(cnt.v_cow_faults); + curthread->td_cow++; } else { prot &= ~VM_PROT_WRITE; } @@ -899,7 +876,7 @@ vnode_locked: * without holding a write lock on it. */ if (hardfault) - fs.entry->lastr = fs.pindex + faultcount - behind; + fs.entry->next_read = fs.pindex + faultcount - reqpage; if ((prot & VM_PROT_WRITE) != 0 || (fault_flags & VM_FAULT_DIRTY) != 0) { @@ -991,6 +968,60 @@ vnode_locked: return (KERN_SUCCESS); } +/* + * Speed up the reclamation of up to "distance" pages that precede the + * faulting pindex within the first object of the shadow chain. + */ +static void +vm_fault_cache_behind(const struct faultstate *fs, int distance) +{ + vm_object_t first_object, object; + vm_page_t m, m_prev; + vm_pindex_t pindex; + + object = fs->object; + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); + first_object = fs->first_object; + if (first_object != object) { + if (!VM_OBJECT_TRYLOCK(first_object)) { + VM_OBJECT_UNLOCK(object); + VM_OBJECT_LOCK(first_object); + VM_OBJECT_LOCK(object); + } + } + if (first_object->type != OBJT_DEVICE && + first_object->type != OBJT_PHYS && first_object->type != OBJT_SG) { + if (fs->first_pindex < distance) + pindex = 0; + else + pindex = fs->first_pindex - distance; + if (pindex < OFF_TO_IDX(fs->entry->offset)) + pindex = OFF_TO_IDX(fs->entry->offset); + m = first_object != object ? fs->first_m : fs->m; + KASSERT((m->oflags & VPO_BUSY) != 0, + ("vm_fault_cache_behind: page %p is not busy", m)); + m_prev = vm_page_prev(m); + while ((m = m_prev) != NULL && m->pindex >= pindex && + m->valid == VM_PAGE_BITS_ALL) { + m_prev = vm_page_prev(m); + if (m->busy != 0 || (m->oflags & VPO_BUSY) != 0) + continue; + vm_page_lock(m); + if (m->hold_count == 0 && m->wire_count == 0) { + pmap_remove_all(m); + vm_page_aflag_clear(m, PGA_REFERENCED); + if (m->dirty != 0) + vm_page_deactivate(m); + else + vm_page_cache(m); + } + vm_page_unlock(m); + } + } + if (first_object != object) + VM_OBJECT_UNLOCK(first_object); +} + /* * vm_fault_prefault provides a quick way of clustering * pagefaults into a processes address space. It is a "cousin" diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 61986295f8c..aefed47745a 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -241,8 +241,8 @@ vm_map_zinit(void *mem, int size, int flags) map = (vm_map_t)mem; map->nentries = 0; map->size = 0; - mtx_init(&map->system_mtx, "system map", NULL, MTX_DEF | MTX_DUPOK); - sx_init(&map->lock, "user map"); + mtx_init(&map->system_mtx, "vm map (system)", NULL, MTX_DEF | MTX_DUPOK); + sx_init(&map->lock, "vm map (user)"); return (0); } @@ -475,12 +475,14 @@ static void vm_map_process_deferred(void) { struct thread *td; - vm_map_entry_t entry; + vm_map_entry_t entry, next; vm_object_t object; td = curthread; - while ((entry = td->td_map_def_user) != NULL) { - td->td_map_def_user = entry->next; + entry = td->td_map_def_user; + td->td_map_def_user = NULL; + while (entry != NULL) { + next = entry->next; if ((entry->eflags & MAP_ENTRY_VN_WRITECNT) != 0) { /* * Decrement the object's writemappings and @@ -494,6 +496,7 @@ vm_map_process_deferred(void) entry->end); } vm_map_entry_deallocate(entry, FALSE); + entry = next; } } @@ -1300,6 +1303,8 @@ charged: new_entry->protection = prot; new_entry->max_protection = max; new_entry->wired_count = 0; + new_entry->read_ahead = VM_FAULT_READ_AHEAD_INIT; + new_entry->next_read = OFF_TO_IDX(offset); KASSERT(cred == NULL || !ENTRY_CHARGED(new_entry), ("OVERCOMMIT: vm_map_insert leaks vm_map %p", new_entry)); @@ -3526,7 +3531,7 @@ Retry: } rv = vm_map_insert(map, NULL, 0, addr, stack_entry->start, - p->p_sysent->sv_stackprot, VM_PROT_ALL, 0); + next_entry->protection, next_entry->max_protection, 0); /* Adjust the available stack space by the amount we grew. */ if (rv == KERN_SUCCESS) { diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h index 0b7fdf93fa1..056eac5ce67 100644 --- a/sys/vm/vm_map.h +++ b/sys/vm/vm_map.h @@ -112,8 +112,9 @@ struct vm_map_entry { vm_prot_t protection; /* protection code */ vm_prot_t max_protection; /* maximum protection */ vm_inherit_t inheritance; /* inheritance */ + uint8_t read_ahead; /* pages in the read-ahead window */ int wired_count; /* can be paged if = 0 */ - vm_pindex_t lastr; /* last read */ + vm_pindex_t next_read; /* index of the next sequential read */ struct ucred *cred; /* tmp storage for creator ref */ }; @@ -329,6 +330,14 @@ long vmspace_wired_count(struct vmspace *vmspace); #define VM_FAULT_CHANGE_WIRING 1 /* Change the wiring as appropriate */ #define VM_FAULT_DIRTY 2 /* Dirty the page; use w/VM_PROT_COPY */ +/* + * Initially, mappings are slightly sequential. The maximum window size must + * account for the map entry's "read_ahead" field being defined as an uint8_t. + */ +#define VM_FAULT_READ_AHEAD_MIN 7 +#define VM_FAULT_READ_AHEAD_INIT 15 +#define VM_FAULT_READ_AHEAD_MAX min(atop(MAXPHYS) - 1, UINT8_MAX) + /* * The following "find_space" options are supported by vm_map_find() */ diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 881c34419d2..7ff561d52a2 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -1381,6 +1381,12 @@ retry: /* * Transfer any cached pages from orig_object to new_object. + * If swap_pager_copy() found swapped out pages within the + * specified range of orig_object, then it changed + * new_object's type to OBJT_SWAP when it transferred those + * pages to new_object. Otherwise, new_object's type + * should still be OBJT_DEFAULT and orig_object should not + * contain any cached pages within the specified range. */ if (__predict_false(orig_object->cache != NULL)) vm_page_cache_transfer(orig_object, offidxstart, @@ -1719,6 +1725,9 @@ vm_object_collapse(vm_object_t object) * swap_pager_copy() can sleep, in which case * the backing_object's and object's locks are * released and reacquired. + * Since swap_pager_copy() is being asked to + * destroy the source, it will change the + * backing_object's type to OBJT_DEFAULT. */ swap_pager_copy( backing_object, diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h index e6e64f7ae1c..daafd03c507 100644 --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -76,8 +76,21 @@ * * vm_object_t Virtual memory object. * + * The root of cached pages pool is protected by both the per-object mutex + * and the free pages queue mutex. + * On insert in the cache splay tree, the per-object mutex is expected + * to be already held and the free pages queue mutex will be + * acquired during the operation too. + * On remove and lookup from the cache splay tree, only the free + * pages queue mutex is expected to be locked. + * These rules allow for reliably checking for the presence of cached + * pages with only the per-object lock held, thereby reducing contention + * for the free pages queue mutex. + * * List of locks * (c) const until freed + * (o) per-object mutex + * (f) free pages queue mutex * */ @@ -102,7 +115,7 @@ struct vm_object { vm_ooffset_t backing_object_offset;/* Offset in backing object */ TAILQ_ENTRY(vm_object) pager_object_list; /* list of all objects of this pager type */ LIST_HEAD(, vm_reserv) rvq; /* list of reservations */ - vm_page_t cache; /* root of the cache page splay tree */ + vm_page_t cache; /* (o + f) root of the cache page splay tree */ void *handle; union { /* diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 005573297b4..496fce9fcf7 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -121,17 +121,17 @@ struct vpglocks vm_page_queue_free_lock; struct vpglocks pa_lock[PA_LOCK_COUNT]; -vm_page_t vm_page_array = 0; -int vm_page_array_size = 0; -long first_page = 0; -int vm_page_zero_count = 0; +vm_page_t vm_page_array; +long vm_page_array_size; +long first_page; +int vm_page_zero_count; static int boot_pages = UMA_BOOT_PAGES; TUNABLE_INT("vm.boot_pages", &boot_pages); SYSCTL_INT(_vm, OID_AUTO, boot_pages, CTLFLAG_RD, &boot_pages, 0, "number of pages allocated for bootstrapping the VM system"); -int pa_tryrelock_restart; +static int pa_tryrelock_restart; SYSCTL_INT(_vm, OID_AUTO, tryrelock_restart, CTLFLAG_RD, &pa_tryrelock_restart, 0, "Number of tryrelock restarts"); @@ -292,16 +292,13 @@ vm_page_startup(vm_offset_t vaddr) end = phys_avail[biggestone+1]; /* - * Initialize the locks. + * Initialize the page and queue locks. */ - mtx_init(&vm_page_queue_mtx, "vm page queue mutex", NULL, MTX_DEF | + mtx_init(&vm_page_queue_mtx, "vm page queue", NULL, MTX_DEF | MTX_RECURSE); - mtx_init(&vm_page_queue_free_mtx, "vm page queue free mutex", NULL, - MTX_DEF); - - /* Setup page locks. */ + mtx_init(&vm_page_queue_free_mtx, "vm page free queue", NULL, MTX_DEF); for (i = 0; i < PA_LOCK_COUNT; i++) - mtx_init(&pa_lock[i].data, "page lock", NULL, MTX_DEF); + mtx_init(&pa_lock[i].data, "vm page", NULL, MTX_DEF); /* * Initialize the queue headers for the hold queue, the active queue, @@ -633,6 +630,30 @@ vm_page_unhold_pages(vm_page_t *ma, int count) mtx_unlock(mtx); } +vm_page_t +PHYS_TO_VM_PAGE(vm_paddr_t pa) +{ + vm_page_t m; + +#ifdef VM_PHYSSEG_SPARSE + m = vm_phys_paddr_to_vm_page(pa); + if (m == NULL) + m = vm_phys_fictitious_to_vm_page(pa); + return (m); +#elif defined(VM_PHYSSEG_DENSE) + long pi; + + pi = atop(pa); + if (pi >= first_page && (pi - first_page) < vm_page_array_size) { + m = &vm_page_array[pi - first_page]; + return (m); + } + return (vm_phys_fictitious_to_vm_page(pa)); +#else +#error "Either VM_PHYSSEG_DENSE or VM_PHYSSEG_SPARSE must be defined." +#endif +} + /* * vm_page_getfake: * @@ -646,6 +667,22 @@ vm_page_getfake(vm_paddr_t paddr, vm_memattr_t memattr) vm_page_t m; m = uma_zalloc(fakepg_zone, M_WAITOK | M_ZERO); + vm_page_initfake(m, paddr, memattr); + return (m); +} + +void +vm_page_initfake(vm_page_t m, vm_paddr_t paddr, vm_memattr_t memattr) +{ + + if ((m->flags & PG_FICTITIOUS) != 0) { + /* + * The page's memattr might have changed since the + * previous initialization. Update the pmap to the + * new memattr. + */ + goto memattr; + } m->phys_addr = paddr; m->queue = PQ_NONE; /* Fictitious pages don't use "segind". */ @@ -653,8 +690,8 @@ vm_page_getfake(vm_paddr_t paddr, vm_memattr_t memattr) /* Fictitious pages don't use "order" or "pool". */ m->oflags = VPO_BUSY | VPO_UNMANAGED; m->wire_count = 1; +memattr: pmap_page_set_memattr(m, memattr); - return (m); } /* @@ -666,6 +703,7 @@ void vm_page_putfake(vm_page_t m) { + KASSERT((m->oflags & VPO_UNMANAGED) != 0, ("managed %p", m)); KASSERT((m->flags & PG_FICTITIOUS) != 0, ("vm_page_putfake: bad page %p", m)); uma_zfree(fakepg_zone, m); @@ -742,7 +780,7 @@ vm_page_sleep(vm_page_t m, const char *msg) } /* - * vm_page_dirty: + * vm_page_dirty_KBI: [ internal use only ] * * Set all bits in the page's dirty field. * @@ -750,11 +788,14 @@ vm_page_sleep(vm_page_t m, const char *msg) * call is made from the machine-independent layer. * * See vm_page_clear_dirty_mask(). + * + * This function should only be called by vm_page_dirty(). */ void -vm_page_dirty(vm_page_t m) +vm_page_dirty_KBI(vm_page_t m) { + /* These assertions refer to this operation by its public name. */ KASSERT((m->flags & PG_CACHED) == 0, ("vm_page_dirty: page in cache!")); KASSERT(!VM_PAGE_IS_FREE(m), @@ -889,7 +930,7 @@ vm_page_insert(vm_page_t m, vm_object_t object, vm_pindex_t pindex) * Since we are inserting a new and possibly dirty page, * update the object's OBJ_MIGHTBEDIRTY flag. */ - if (m->aflags & PGA_WRITEABLE) + if (pmap_page_is_write_mapped(m)) vm_object_set_writeable_dirty(object); } @@ -2634,11 +2675,11 @@ vm_page_clear_dirty_mask(vm_page_t m, vm_page_bits_t pagebits) /* * If the object is locked and the page is neither VPO_BUSY nor - * PGA_WRITEABLE, then the page's dirty field cannot possibly be + * write mapped, then the page's dirty field cannot possibly be * set by a concurrent pmap operation. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); - if ((m->oflags & VPO_BUSY) == 0 && (m->aflags & PGA_WRITEABLE) == 0) + if ((m->oflags & VPO_BUSY) == 0 && !pmap_page_is_write_mapped(m)) m->dirty &= ~pagebits; else { /* diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h index 928db0f0acc..d9d1a60eb63 100644 --- a/sys/vm/vm_page.h +++ b/sys/vm/vm_page.h @@ -237,20 +237,22 @@ extern struct vpglocks pa_lock[]; #endif #define vm_page_queue_free_mtx vm_page_queue_free_lock.data + /* * These are the flags defined for vm_page. * - * aflags are updated by atomic accesses. Use the vm_page_aflag_set() + * aflags are updated by atomic accesses. Use the vm_page_aflag_set() * and vm_page_aflag_clear() functions to set and clear the flags. * * PGA_REFERENCED may be cleared only if the object containing the page is - * locked. + * locked. It is set by both the MI and MD VM layers. * * PGA_WRITEABLE is set exclusively on managed pages by pmap_enter(). When it - * does so, the page must be VPO_BUSY. + * does so, the page must be VPO_BUSY. The MI VM layer must never access this + * flag directly. Instead, it should call pmap_page_is_write_mapped(). * * PGA_EXECUTABLE may be set by pmap routines, and indicates that a page has - * at least one executable mapping. It is not consumed by the VM layer. + * at least one executable mapping. It is not consumed by the MI VM layer. */ #define PGA_WRITEABLE 0x01 /* page may be mapped writeable */ #define PGA_REFERENCED 0x02 /* page has been referenced */ @@ -262,12 +264,12 @@ extern struct vpglocks pa_lock[]; */ #define PG_CACHED 0x01 /* page is cached */ #define PG_FREE 0x02 /* page is free */ -#define PG_FICTITIOUS 0x04 /* physical page doesn't exist (O) */ +#define PG_FICTITIOUS 0x04 /* physical page doesn't exist */ #define PG_ZERO 0x08 /* page is zeroed */ #define PG_MARKER 0x10 /* special queue marker page */ #define PG_SLAB 0x20 /* object pointer is actually a slab */ #define PG_WINATCFLS 0x40 /* flush dirty page on inactive q */ -#define PG_NODUMP 0x80 /* don't include this page in the dump */ +#define PG_NODUMP 0x80 /* don't include this page in a dump */ /* * Misc constants. @@ -312,7 +314,7 @@ struct vnode; extern int vm_page_zero_count; extern vm_page_t vm_page_array; /* First resident page in table */ -extern int vm_page_array_size; /* number of vm_page_t's */ +extern long vm_page_array_size; /* number of vm_page_t's */ extern long first_page; /* first physical page number */ #define VM_PAGE_IS_FREE(m) (((m)->flags & PG_FREE) != 0) @@ -321,19 +323,7 @@ extern long first_page; /* first physical page number */ vm_page_t vm_phys_paddr_to_vm_page(vm_paddr_t pa); -static __inline vm_page_t PHYS_TO_VM_PAGE(vm_paddr_t pa); - -static __inline vm_page_t -PHYS_TO_VM_PAGE(vm_paddr_t pa) -{ -#ifdef VM_PHYSSEG_SPARSE - return (vm_phys_paddr_to_vm_page(pa)); -#elif defined(VM_PHYSSEG_DENSE) - return (&vm_page_array[atop(pa) - first_page]); -#else -#error "Either VM_PHYSSEG_DENSE or VM_PHYSSEG_SPARSE must be defined." -#endif -} +vm_page_t PHYS_TO_VM_PAGE(vm_paddr_t pa); extern struct vpglocks vm_page_queue_lock; @@ -370,7 +360,6 @@ void vm_page_hold(vm_page_t mem); void vm_page_unhold(vm_page_t mem); void vm_page_free(vm_page_t m); void vm_page_free_zero(vm_page_t m); -void vm_page_dirty(vm_page_t m); void vm_page_wakeup(vm_page_t m); void vm_pageq_remove(vm_page_t m); @@ -391,6 +380,7 @@ void vm_page_dontneed(vm_page_t); void vm_page_deactivate (vm_page_t); vm_page_t vm_page_find_least(vm_object_t, vm_pindex_t); vm_page_t vm_page_getfake(vm_paddr_t paddr, vm_memattr_t memattr); +void vm_page_initfake(vm_page_t m, vm_paddr_t paddr, vm_memattr_t memattr); void vm_page_insert (vm_page_t, vm_object_t, vm_pindex_t); boolean_t vm_page_is_cached(vm_object_t object, vm_pindex_t pindex); vm_page_t vm_page_lookup (vm_object_t, vm_pindex_t); @@ -423,6 +413,7 @@ void vm_page_cowfault (vm_page_t); int vm_page_cowsetup(vm_page_t); void vm_page_cowclear (vm_page_t); +void vm_page_dirty_KBI(vm_page_t m); void vm_page_lock_KBI(vm_page_t m, const char *file, int line); void vm_page_unlock_KBI(vm_page_t m, const char *file, int line); int vm_page_trylock_KBI(vm_page_t m, const char *file, int line); @@ -437,6 +428,28 @@ void vm_page_object_lock_assert(vm_page_t m); #define VM_PAGE_OBJECT_LOCK_ASSERT(m) (void)0 #endif +/* + * vm_page_dirty: + * + * Set all bits in the page's dirty field. + * + * The object containing the specified page must be locked if the + * call is made from the machine-independent layer. + * + * See vm_page_clear_dirty_mask(). + */ +static __inline void +vm_page_dirty(vm_page_t m) +{ + + /* Use vm_page_dirty_KBI() under INVARIANTS to save memory. */ +#if defined(KLD_MODULE) || defined(INVARIANTS) + vm_page_dirty_KBI(m); +#else + m->dirty = VM_PAGE_BITS_ALL; +#endif +} + /* * vm_page_sleep_if_busy: * diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index 812fe4d8fab..11d040d346f 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -503,7 +503,7 @@ vm_pageout_flush(vm_page_t *mc, int count, int flags, int mreq, int *prunlen, vm_page_t mt = mc[i]; KASSERT(pageout_status[i] == VM_PAGER_PEND || - (mt->aflags & PGA_WRITEABLE) == 0, + !pmap_page_is_write_mapped(mt), ("vm_pageout_flush: page %p is not write protected", mt)); switch (pageout_status[i]) { case VM_PAGER_OK: @@ -743,6 +743,7 @@ vm_pageout_scan(int pass) int actcount; int vnodes_skipped = 0; int maxlaunder; + boolean_t queues_locked; /* * Decrease registered cache sizes. @@ -784,6 +785,7 @@ vm_pageout_scan(int pass) if (pass) maxlaunder = 10000; vm_page_lock_queues(); + queues_locked = TRUE; rescan0: addl_page_shortage = addl_page_shortage_init; maxscan = cnt.v_inactive_count; @@ -791,6 +793,8 @@ rescan0: for (m = TAILQ_FIRST(&vm_page_queues[PQ_INACTIVE].pl); m != NULL && maxscan-- > 0 && page_shortage > 0; m = next) { + KASSERT(queues_locked, ("unlocked queues")); + mtx_assert(&vm_page_queue_mtx, MA_OWNED); cnt.v_pdpages++; @@ -805,6 +809,11 @@ rescan0: if (m->flags & PG_MARKER) continue; + KASSERT((m->flags & PG_FICTITIOUS) == 0, + ("Fictitious page %p cannot be in inactive queue", m)); + KASSERT((m->oflags & VPO_UNMANAGED) == 0, + ("Unmanaged page %p cannot be in inactive queue", m)); + /* * Lock the page. */ @@ -831,7 +840,7 @@ rescan0: object = m->object; if (!VM_OBJECT_TRYLOCK(object) && (!vm_pageout_fallback_object_lock(m, &next) || - m->hold_count != 0)) { + m->hold_count != 0)) { VM_OBJECT_UNLOCK(object); vm_page_unlock(m); addl_page_shortage++; @@ -844,6 +853,16 @@ rescan0: continue; } + /* + * We unlock vm_page_queue_mtx, invalidating the + * 'next' pointer. Use our marker to remember our + * place. + */ + TAILQ_INSERT_AFTER(&vm_page_queues[PQ_INACTIVE].pl, + m, &marker, pageq); + vm_page_unlock_queues(); + queues_locked = FALSE; + /* * If the object is not being used, we ignore previous * references. @@ -862,13 +881,13 @@ rescan0: * level VM system not knowing anything about existing * references. */ - } else if (((m->aflags & PGA_REFERENCED) == 0) && - (actcount = pmap_ts_referenced(m))) { + } else if ((m->aflags & PGA_REFERENCED) == 0 && + (actcount = pmap_ts_referenced(m)) != 0) { vm_page_activate(m); vm_page_unlock(m); m->act_count += actcount + ACT_ADVANCE; VM_OBJECT_UNLOCK(object); - continue; + goto relock_queues; } /* @@ -884,7 +903,7 @@ rescan0: vm_page_unlock(m); m->act_count += actcount + ACT_ADVANCE + 1; VM_OBJECT_UNLOCK(object); - continue; + goto relock_queues; } /* @@ -894,7 +913,7 @@ rescan0: * be updated. */ if (m->dirty != VM_PAGE_BITS_ALL && - (m->aflags & PGA_WRITEABLE) != 0) { + pmap_page_is_write_mapped(m)) { /* * Avoid a race condition: Unless write access is * removed from the page, another processor could @@ -919,7 +938,7 @@ rescan0: * Invalid pages can be easily freed */ vm_page_free(m); - cnt.v_dfree++; + PCPU_INC(cnt.v_dfree); --page_shortage; } else if (m->dirty == 0) { /* @@ -942,6 +961,8 @@ rescan0: * the thrash point for a heavily loaded machine. */ m->flags |= PG_WINATCFLS; + vm_page_lock_queues(); + queues_locked = TRUE; vm_page_requeue(m); } else if (maxlaunder > 0) { /* @@ -971,20 +992,12 @@ rescan0: if (!swap_pageouts_ok || (object->flags & OBJ_DEAD)) { vm_page_unlock(m); VM_OBJECT_UNLOCK(object); + vm_page_lock_queues(); + queues_locked = TRUE; vm_page_requeue(m); - continue; + goto relock_queues; } - /* - * Following operations may unlock - * vm_page_queue_mtx, invalidating the 'next' - * pointer. To prevent an inordinate number - * of restarts we use our marker to remember - * our place. - * - */ - TAILQ_INSERT_AFTER(&vm_page_queues[PQ_INACTIVE].pl, - m, &marker, pageq); /* * The object is already known NOT to be dead. It * is possible for the vget() to block the whole @@ -1009,7 +1022,6 @@ rescan0: * of time. */ if (object->type == OBJT_VNODE) { - vm_page_unlock_queues(); vm_page_unlock(m); vp = object->handle; if (vp->v_type == VREG && @@ -1018,7 +1030,6 @@ rescan0: ++pageout_lock_miss; if (object->flags & OBJ_MIGHTBEDIRTY) vnodes_skipped++; - vm_page_lock_queues(); goto unlock_and_continue; } KASSERT(mp != NULL, @@ -1029,7 +1040,6 @@ rescan0: if (vget(vp, LK_EXCLUSIVE | LK_TIMELOCK, curthread)) { VM_OBJECT_LOCK(object); - vm_page_lock_queues(); ++pageout_lock_miss; if (object->flags & OBJ_MIGHTBEDIRTY) vnodes_skipped++; @@ -1039,6 +1049,7 @@ rescan0: VM_OBJECT_LOCK(object); vm_page_lock(m); vm_page_lock_queues(); + queues_locked = TRUE; /* * The page might have been moved to another * queue during potential blocking in vget() @@ -1076,6 +1087,8 @@ rescan0: vnodes_skipped++; goto unlock_and_continue; } + vm_page_unlock_queues(); + queues_locked = FALSE; } /* @@ -1088,32 +1101,37 @@ rescan0: * the (future) cleaned page. Otherwise we could wind * up laundering or cleaning too many pages. */ - vm_page_unlock_queues(); if (vm_pageout_clean(m) != 0) { --page_shortage; --maxlaunder; } - vm_page_lock_queues(); unlock_and_continue: vm_page_lock_assert(m, MA_NOTOWNED); VM_OBJECT_UNLOCK(object); if (mp != NULL) { - vm_page_unlock_queues(); + if (queues_locked) { + vm_page_unlock_queues(); + queues_locked = FALSE; + } if (vp != NULL) vput(vp); VFS_UNLOCK_GIANT(vfslocked); vm_object_deallocate(object); vn_finished_write(mp); - vm_page_lock_queues(); } - next = TAILQ_NEXT(&marker, pageq); - TAILQ_REMOVE(&vm_page_queues[PQ_INACTIVE].pl, - &marker, pageq); vm_page_lock_assert(m, MA_NOTOWNED); - continue; + goto relock_queues; } vm_page_unlock(m); VM_OBJECT_UNLOCK(object); +relock_queues: + if (!queues_locked) { + vm_page_lock_queues(); + queues_locked = TRUE; + } + next = TAILQ_NEXT(&marker, pageq); + TAILQ_REMOVE(&vm_page_queues[PQ_INACTIVE].pl, + &marker, pageq); } /* @@ -1143,6 +1161,10 @@ unlock_and_continue: m = next; continue; } + KASSERT((m->flags & PG_FICTITIOUS) == 0, + ("Fictitious page %p cannot be in active queue", m)); + KASSERT((m->oflags & VPO_UNMANAGED) == 0, + ("Unmanaged page %p cannot be in active queue", m)); if (!vm_pageout_page_lock(m, &next)) { vm_page_unlock(m); m = next; diff --git a/sys/vm/vm_pager.c b/sys/vm/vm_pager.c index eba926ed7c2..6ed64eab6d6 100644 --- a/sys/vm/vm_pager.c +++ b/sys/vm/vm_pager.c @@ -159,7 +159,8 @@ struct pagerops *pagertab[] = { &devicepagerops, /* OBJT_DEVICE */ &physpagerops, /* OBJT_PHYS */ &deadpagerops, /* OBJT_DEAD */ - &sgpagerops /* OBJT_SG */ + &sgpagerops, /* OBJT_SG */ + &mgtdevicepagerops, /* OBJT_MGTDEVICE */ }; static const int npagers = sizeof(pagertab) / sizeof(pagertab[0]); @@ -270,14 +271,15 @@ vm_pager_object_lookup(struct pagerlst *pg_list, void *handle) vm_object_t object; TAILQ_FOREACH(object, pg_list, pager_object_list) { - VM_OBJECT_LOCK(object); - if (object->handle == handle && - (object->flags & OBJ_DEAD) == 0) { - vm_object_reference_locked(object); + if (object->handle == handle) { + VM_OBJECT_LOCK(object); + if ((object->flags & OBJ_DEAD) == 0) { + vm_object_reference_locked(object); + VM_OBJECT_UNLOCK(object); + break; + } VM_OBJECT_UNLOCK(object); - break; } - VM_OBJECT_UNLOCK(object); } return (object); } diff --git a/sys/vm/vm_pager.h b/sys/vm/vm_pager.h index c361be86dd7..bb7a5ecd32d 100644 --- a/sys/vm/vm_pager.h +++ b/sys/vm/vm_pager.h @@ -71,6 +71,7 @@ extern struct pagerops vnodepagerops; extern struct pagerops devicepagerops; extern struct pagerops physpagerops; extern struct pagerops sgpagerops; +extern struct pagerops mgtdevicepagerops; /* * get/put return values diff --git a/sys/vm/vm_phys.c b/sys/vm/vm_phys.c index 8c026e6d8dd..9cfea239e39 100644 --- a/sys/vm/vm_phys.c +++ b/sys/vm/vm_phys.c @@ -87,6 +87,15 @@ static struct vm_phys_seg vm_phys_segs[VM_PHYSSEG_MAX]; static int vm_phys_nsegs; +#define VM_PHYS_FICTITIOUS_NSEGS 8 +static struct vm_phys_fictitious_seg { + vm_paddr_t start; + vm_paddr_t end; + vm_page_t first_page; +} vm_phys_fictitious_segs[VM_PHYS_FICTITIOUS_NSEGS]; +static struct mtx vm_phys_fictitious_reg_mtx; +MALLOC_DEFINE(M_FICT_PAGES, "", ""); + static struct vm_freelist vm_phys_free_queues[VM_RAW_NFREELIST][VM_NFREEPOOL][VM_NFREEORDER]; static struct vm_freelist @@ -366,6 +375,8 @@ vm_phys_init(void) for (flind = 0; flind < vm_nfreelists; flind++) vm_phys_lookup_lists[0][flind] = &vm_phys_free_queues[flind]; #endif + + mtx_init(&vm_phys_fictitious_reg_mtx, "vmfctr", NULL, MTX_DEF); } /* @@ -510,6 +521,112 @@ vm_phys_paddr_to_vm_page(vm_paddr_t pa) return (NULL); } +vm_page_t +vm_phys_fictitious_to_vm_page(vm_paddr_t pa) +{ + struct vm_phys_fictitious_seg *seg; + vm_page_t m; + int segind; + + m = NULL; + for (segind = 0; segind < VM_PHYS_FICTITIOUS_NSEGS; segind++) { + seg = &vm_phys_fictitious_segs[segind]; + if (pa >= seg->start && pa < seg->end) { + m = &seg->first_page[atop(pa - seg->start)]; + KASSERT((m->flags & PG_FICTITIOUS) != 0, + ("%p not fictitious", m)); + break; + } + } + return (m); +} + +int +vm_phys_fictitious_reg_range(vm_paddr_t start, vm_paddr_t end, + vm_memattr_t memattr) +{ + struct vm_phys_fictitious_seg *seg; + vm_page_t fp; + long i, page_count; + int segind; +#ifdef VM_PHYSSEG_DENSE + long pi; + boolean_t malloced; +#endif + + page_count = (end - start) / PAGE_SIZE; + +#ifdef VM_PHYSSEG_DENSE + pi = atop(start); + if (pi >= first_page && atop(end) < vm_page_array_size) { + fp = &vm_page_array[pi - first_page]; + malloced = FALSE; + } else +#endif + { + fp = malloc(page_count * sizeof(struct vm_page), M_FICT_PAGES, + M_WAITOK | M_ZERO); +#ifdef VM_PHYSSEG_DENSE + malloced = TRUE; +#endif + } + for (i = 0; i < page_count; i++) { + vm_page_initfake(&fp[i], start + PAGE_SIZE * i, memattr); + pmap_page_init(&fp[i]); + fp[i].oflags &= ~(VPO_BUSY | VPO_UNMANAGED); + } + mtx_lock(&vm_phys_fictitious_reg_mtx); + for (segind = 0; segind < VM_PHYS_FICTITIOUS_NSEGS; segind++) { + seg = &vm_phys_fictitious_segs[segind]; + if (seg->start == 0 && seg->end == 0) { + seg->start = start; + seg->end = end; + seg->first_page = fp; + mtx_unlock(&vm_phys_fictitious_reg_mtx); + return (0); + } + } + mtx_unlock(&vm_phys_fictitious_reg_mtx); +#ifdef VM_PHYSSEG_DENSE + if (malloced) +#endif + free(fp, M_FICT_PAGES); + return (EBUSY); +} + +void +vm_phys_fictitious_unreg_range(vm_paddr_t start, vm_paddr_t end) +{ + struct vm_phys_fictitious_seg *seg; + vm_page_t fp; + int segind; +#ifdef VM_PHYSSEG_DENSE + long pi; +#endif + +#ifdef VM_PHYSSEG_DENSE + pi = atop(start); +#endif + + mtx_lock(&vm_phys_fictitious_reg_mtx); + for (segind = 0; segind < VM_PHYS_FICTITIOUS_NSEGS; segind++) { + seg = &vm_phys_fictitious_segs[segind]; + if (seg->start == start && seg->end == end) { + seg->start = seg->end = 0; + fp = seg->first_page; + seg->first_page = NULL; + mtx_unlock(&vm_phys_fictitious_reg_mtx); +#ifdef VM_PHYSSEG_DENSE + if (pi < first_page || atop(end) >= vm_page_array_size) +#endif + free(fp, M_FICT_PAGES); + return; + } + } + mtx_unlock(&vm_phys_fictitious_reg_mtx); + KASSERT(0, ("Unregistering not registered fictitious range")); +} + /* * Find the segment containing the given physical address. */ diff --git a/sys/vm/vm_phys.h b/sys/vm/vm_phys.h index 047e4a9b15d..902659b5b25 100644 --- a/sys/vm/vm_phys.h +++ b/sys/vm/vm_phys.h @@ -57,6 +57,10 @@ vm_page_t vm_phys_alloc_contig(u_long npages, vm_paddr_t low, vm_paddr_t high, u_long alignment, vm_paddr_t boundary); vm_page_t vm_phys_alloc_freelist_pages(int flind, int pool, int order); vm_page_t vm_phys_alloc_pages(int pool, int order); +int vm_phys_fictitious_reg_range(vm_paddr_t start, vm_paddr_t end, + vm_memattr_t memattr); +void vm_phys_fictitious_unreg_range(vm_paddr_t start, vm_paddr_t end); +vm_page_t vm_phys_fictitious_to_vm_page(vm_paddr_t pa); void vm_phys_free_contig(vm_page_t m, u_long npages); void vm_phys_free_pages(vm_page_t m, int order); void vm_phys_init(void); diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index c8c57e154c2..9c12be14d23 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -440,7 +440,7 @@ vnode_pager_setsize(vp, nsize) */ vm_page_clear_dirty(m, base, PAGE_SIZE - base); } else if ((nsize & PAGE_MASK) && - __predict_false(object->cache != NULL)) { + vm_page_is_cached(object, OFF_TO_IDX(nsize))) { vm_page_cache_free(object, OFF_TO_IDX(nsize), nobjsize); } @@ -1146,7 +1146,7 @@ vnode_pager_generic_putpages(struct vnode *vp, vm_page_t *ma, int bytecount, m = ma[ncount - 1]; KASSERT(m->busy > 0, ("vnode_pager_generic_putpages: page %p is not busy", m)); - KASSERT((m->aflags & PGA_WRITEABLE) == 0, + KASSERT(!pmap_page_is_write_mapped(m), ("vnode_pager_generic_putpages: page %p is not read-only", m)); vm_page_clear_dirty(m, pgoff, PAGE_SIZE - pgoff); diff --git a/sys/amd64/acpica/acpi_wakeup.c b/sys/x86/acpica/acpi_wakeup.c similarity index 65% rename from sys/amd64/acpica/acpi_wakeup.c rename to sys/x86/acpica/acpi_wakeup.c index a96f1bfc8b1..86235794454 100644 --- a/sys/amd64/acpica/acpi_wakeup.c +++ b/sys/x86/acpica/acpi_wakeup.c @@ -1,6 +1,6 @@ /*- * Copyright (c) 2001 Takanori Watanabe - * Copyright (c) 2001 Mitsuru IWASAKI + * Copyright (c) 2001-2012 Mitsuru IWASAKI * Copyright (c) 2003 Peter Wemm * Copyright (c) 2008-2012 Jung-uk Kim * All rights reserved. @@ -70,25 +70,30 @@ extern int acpi_reset_video; #ifdef SMP extern struct pcb **susppcbs; -extern void **suspfpusave; +static cpuset_t suspcpus; #else static struct pcb **susppcbs; -static void **suspfpusave; #endif -int acpi_restorecpu(uint64_t, vm_offset_t); - static void *acpi_alloc_wakeup_handler(void); static void acpi_stop_beep(void *); #ifdef SMP static int acpi_wakeup_ap(struct acpi_softc *, int); -static void acpi_wakeup_cpus(struct acpi_softc *, const cpuset_t *); +static void acpi_wakeup_cpus(struct acpi_softc *); #endif -#define WAKECODE_VADDR(sc) ((sc)->acpi_wakeaddr + (3 * PAGE_SIZE)) -#define WAKECODE_PADDR(sc) ((sc)->acpi_wakephys + (3 * PAGE_SIZE)) -#define WAKECODE_FIXUP(offset, type, val) do { \ +#ifdef __amd64__ +#define ACPI_PAGETABLES 3 +#else +#define ACPI_PAGETABLES 0 +#endif + +#define WAKECODE_VADDR(sc) \ + ((sc)->acpi_wakeaddr + (ACPI_PAGETABLES * PAGE_SIZE)) +#define WAKECODE_PADDR(sc) \ + ((sc)->acpi_wakephys + (ACPI_PAGETABLES * PAGE_SIZE)) +#define WAKECODE_FIXUP(offset, type, val) do { \ type *addr; \ addr = (type *)(WAKECODE_VADDR(sc) + offset); \ *addr = val; \ @@ -111,59 +116,15 @@ acpi_wakeup_ap(struct acpi_softc *sc, int cpu) int ms; WAKECODE_FIXUP(wakeup_pcb, struct pcb *, susppcbs[cpu]); - WAKECODE_FIXUP(wakeup_fpusave, void *, suspfpusave[cpu]); WAKECODE_FIXUP(wakeup_gdt, uint16_t, susppcbs[cpu]->pcb_gdt.rd_limit); WAKECODE_FIXUP(wakeup_gdt + 2, uint64_t, susppcbs[cpu]->pcb_gdt.rd_base); - WAKECODE_FIXUP(wakeup_cpu, int, cpu); - /* do an INIT IPI: assert RESET */ - lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_EDGE | - APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT, apic_id); + ipi_startup(apic_id, vector); - /* wait for pending status end */ - lapic_ipi_wait(-1); - - /* do an INIT IPI: deassert RESET */ - lapic_ipi_raw(APIC_DEST_ALLESELF | APIC_TRIGMOD_LEVEL | - APIC_LEVEL_DEASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT, 0); - - /* wait for pending status end */ - DELAY(10000); /* wait ~10mS */ - lapic_ipi_wait(-1); - - /* - * next we do a STARTUP IPI: the previous INIT IPI might still be - * latched, (P5 bug) this 1st STARTUP would then terminate - * immediately, and the previously started INIT IPI would continue. OR - * the previous INIT IPI has already run. and this STARTUP IPI will - * run. OR the previous INIT IPI was ignored. and this STARTUP IPI - * will run. - */ - - /* do a STARTUP IPI */ - lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_EDGE | - APIC_LEVEL_DEASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_STARTUP | - vector, apic_id); - lapic_ipi_wait(-1); - DELAY(200); /* wait ~200uS */ - - /* - * finally we do a 2nd STARTUP IPI: this 2nd STARTUP IPI should run IF - * the previous STARTUP IPI was cancelled by a latched INIT IPI. OR - * this STARTUP IPI will be ignored, as only ONE STARTUP IPI is - * recognized after hardware RESET or INIT IPI. - */ - - lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_EDGE | - APIC_LEVEL_DEASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_STARTUP | - vector, apic_id); - lapic_ipi_wait(-1); - DELAY(200); /* wait ~200uS */ - - /* Wait up to 5 seconds for it to start. */ + /* Wait up to 5 seconds for it to resume. */ for (ms = 0; ms < 5000; ms++) { - if (*(int *)(WAKECODE_VADDR(sc) + wakeup_cpu) == 0) + if (!CPU_ISSET(cpu, &suspended_cpus)) return (1); /* return SUCCESS */ DELAY(1000); } @@ -180,7 +141,7 @@ acpi_wakeup_ap(struct acpi_softc *sc, int cpu) #define BIOS_WARM (0x0a) static void -acpi_wakeup_cpus(struct acpi_softc *sc, const cpuset_t *wakeup_cpus) +acpi_wakeup_cpus(struct acpi_softc *sc) { uint32_t mpbioswarmvec; int cpu; @@ -199,7 +160,7 @@ acpi_wakeup_cpus(struct acpi_softc *sc, const cpuset_t *wakeup_cpus) /* Wake up each AP. */ for (cpu = 1; cpu < mp_ncpus; cpu++) { - if (!CPU_ISSET(cpu, wakeup_cpus)) + if (!CPU_ISSET(cpu, &suspcpus)) continue; if (acpi_wakeup_ap(sc, cpu) == 0) { /* restore the warmstart vector */ @@ -220,21 +181,14 @@ acpi_wakeup_cpus(struct acpi_softc *sc, const cpuset_t *wakeup_cpus) int acpi_sleep_machdep(struct acpi_softc *sc, int state) { -#ifdef SMP - cpuset_t wakeup_cpus; -#endif - register_t rf; ACPI_STATUS status; - int ret; - - ret = -1; if (sc->acpi_wakeaddr == 0ul) - return (ret); + return (-1); /* couldn't alloc wake memory */ #ifdef SMP - wakeup_cpus = all_cpus; - CPU_CLR(PCPU_GET(cpuid), &wakeup_cpus); + suspcpus = all_cpus; + CPU_CLR(PCPU_GET(cpuid), &suspcpus); #endif if (acpi_resume_beep != 0) @@ -242,75 +196,87 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state) AcpiSetFirmwareWakingVector(WAKECODE_PADDR(sc)); - rf = intr_disable(); intr_suspend(); if (savectx(susppcbs[0])) { - ctx_fpusave(suspfpusave[0]); +#ifdef __amd64__ + ctx_fpusave(susppcbs[0]->pcb_fpususpend); +#endif #ifdef SMP - if (!CPU_EMPTY(&wakeup_cpus) && - suspend_cpus(wakeup_cpus) == 0) { + if (!CPU_EMPTY(&suspcpus) && suspend_cpus(suspcpus) == 0) { device_printf(sc->acpi_dev, "Failed to suspend APs\n"); - goto out; + return (0); /* couldn't sleep */ } #endif WAKECODE_FIXUP(resume_beep, uint8_t, (acpi_resume_beep != 0)); WAKECODE_FIXUP(reset_video, uint8_t, (acpi_reset_video != 0)); +#ifndef __amd64__ + WAKECODE_FIXUP(wakeup_cr4, register_t, susppcbs[0]->pcb_cr4); +#endif WAKECODE_FIXUP(wakeup_pcb, struct pcb *, susppcbs[0]); - WAKECODE_FIXUP(wakeup_fpusave, void *, suspfpusave[0]); WAKECODE_FIXUP(wakeup_gdt, uint16_t, susppcbs[0]->pcb_gdt.rd_limit); WAKECODE_FIXUP(wakeup_gdt + 2, uint64_t, susppcbs[0]->pcb_gdt.rd_base); - WAKECODE_FIXUP(wakeup_cpu, int, 0); /* Call ACPICA to enter the desired sleep state */ if (state == ACPI_STATE_S4 && sc->acpi_s4bios) status = AcpiEnterSleepStateS4bios(); else status = AcpiEnterSleepState(state, acpi_sleep_flags); - - if (status != AE_OK) { + if (ACPI_FAILURE(status)) { device_printf(sc->acpi_dev, "AcpiEnterSleepState failed - %s\n", AcpiFormatException(status)); - goto out; + return (0); /* couldn't sleep */ } for (;;) ia32_pause(); - } else { - pmap_init_pat(); - load_cr3(susppcbs[0]->pcb_cr3); - initializecpu(); - PCPU_SET(switchtime, 0); - PCPU_SET(switchticks, ticks); -#ifdef SMP - if (!CPU_EMPTY(&wakeup_cpus)) - acpi_wakeup_cpus(sc, &wakeup_cpus); -#endif - ret = 0; } -out: + return (1); /* wakeup successfully */ +} + +int +acpi_wakeup_machdep(struct acpi_softc *sc, int state, int sleep_result, + int intr_enabled) +{ + + if (sleep_result == -1) + return (sleep_result); + + if (!intr_enabled) { + /* Wakeup MD procedures in interrupt disabled context */ + if (sleep_result == 1) { + pmap_init_pat(); + initializecpu(); + PCPU_SET(switchtime, 0); + PCPU_SET(switchticks, ticks); #ifdef SMP - if (!CPU_EMPTY(&wakeup_cpus)) - restart_cpus(wakeup_cpus); + if (!CPU_EMPTY(&suspcpus)) + acpi_wakeup_cpus(sc); #endif + } - mca_resume(); - intr_resume(); - intr_restore(rf); +#ifdef SMP + if (!CPU_EMPTY(&suspcpus)) + restart_cpus(suspcpus); +#endif + mca_resume(); + intr_resume(); - AcpiSetFirmwareWakingVector(0); + AcpiSetFirmwareWakingVector(0); + } else { + /* Wakeup MD procedures in interrupt enabled context */ + if (sleep_result == 1 && mem_range_softc.mr_op != NULL && + mem_range_softc.mr_op->reinit != NULL) + mem_range_softc.mr_op->reinit(&mem_range_softc); + } - if (ret == 0 && mem_range_softc.mr_op != NULL && - mem_range_softc.mr_op->reinit != NULL) - mem_range_softc.mr_op->reinit(&mem_range_softc); - - return (ret); + return (sleep_result); } static void * @@ -326,8 +292,8 @@ acpi_alloc_wakeup_handler(void) * and ROM area (0xa0000 and above). The temporary page tables must be * page-aligned. */ - wakeaddr = contigmalloc(4 * PAGE_SIZE, M_DEVBUF, M_WAITOK, 0x500, - 0xa0000, PAGE_SIZE, 0ul); + wakeaddr = contigmalloc((ACPI_PAGETABLES + 1) * PAGE_SIZE, M_DEVBUF, + M_WAITOK, 0x500, 0xa0000, PAGE_SIZE, 0ul); if (wakeaddr == NULL) { printf("%s: can't alloc wake memory\n", __func__); return (NULL); @@ -335,14 +301,16 @@ acpi_alloc_wakeup_handler(void) if (EVENTHANDLER_REGISTER(power_resume, acpi_stop_beep, NULL, EVENTHANDLER_PRI_LAST) == NULL) { printf("%s: can't register event handler\n", __func__); - contigfree(wakeaddr, 4 * PAGE_SIZE, M_DEVBUF); + contigfree(wakeaddr, (ACPI_PAGETABLES + 1) * PAGE_SIZE, + M_DEVBUF); return (NULL); } susppcbs = malloc(mp_ncpus * sizeof(*susppcbs), M_DEVBUF, M_WAITOK); - suspfpusave = malloc(mp_ncpus * sizeof(void *), M_DEVBUF, M_WAITOK); for (i = 0; i < mp_ncpus; i++) { susppcbs[i] = malloc(sizeof(**susppcbs), M_DEVBUF, M_WAITOK); - suspfpusave[i] = alloc_fpusave(M_WAITOK); +#ifdef __amd64__ + susppcbs[i]->pcb_fpususpend = alloc_fpusave(M_WAITOK); +#endif } return (wakeaddr); @@ -352,8 +320,10 @@ void acpi_install_wakeup_handler(struct acpi_softc *sc) { static void *wakeaddr = NULL; +#ifdef __amd64__ uint64_t *pt4, *pt3, *pt2; int i; +#endif if (wakeaddr != NULL) return; @@ -367,27 +337,27 @@ acpi_install_wakeup_handler(struct acpi_softc *sc) bcopy(wakecode, (void *)WAKECODE_VADDR(sc), sizeof(wakecode)); - /* Patch GDT base address, ljmp targets and page table base address. */ + /* Patch GDT base address, ljmp targets. */ WAKECODE_FIXUP((bootgdtdesc + 2), uint32_t, WAKECODE_PADDR(sc) + bootgdt); WAKECODE_FIXUP((wakeup_sw32 + 2), uint32_t, WAKECODE_PADDR(sc) + wakeup_32); +#ifdef __amd64__ WAKECODE_FIXUP((wakeup_sw64 + 1), uint32_t, WAKECODE_PADDR(sc) + wakeup_64); WAKECODE_FIXUP(wakeup_pagetables, uint32_t, sc->acpi_wakephys); +#endif /* Save pointers to some global data. */ - WAKECODE_FIXUP(wakeup_retaddr, void *, acpi_restorecpu); - WAKECODE_FIXUP(wakeup_kpml4, uint64_t, KPML4phys); - WAKECODE_FIXUP(wakeup_ctx, vm_offset_t, - WAKECODE_VADDR(sc) + wakeup_ctx); - WAKECODE_FIXUP(wakeup_efer, uint64_t, rdmsr(MSR_EFER)); - WAKECODE_FIXUP(wakeup_star, uint64_t, rdmsr(MSR_STAR)); - WAKECODE_FIXUP(wakeup_lstar, uint64_t, rdmsr(MSR_LSTAR)); - WAKECODE_FIXUP(wakeup_cstar, uint64_t, rdmsr(MSR_CSTAR)); - WAKECODE_FIXUP(wakeup_sfmask, uint64_t, rdmsr(MSR_SF_MASK)); - WAKECODE_FIXUP(wakeup_xsmask, uint64_t, xsave_mask); + WAKECODE_FIXUP(wakeup_ret, void *, resumectx); +#ifndef __amd64__ +#ifdef PAE + WAKECODE_FIXUP(wakeup_cr3, register_t, vtophys(kernel_pmap->pm_pdpt)); +#else + WAKECODE_FIXUP(wakeup_cr3, register_t, vtophys(kernel_pmap->pm_pdir)); +#endif +#else /* Build temporary page tables below realmode code. */ pt4 = wakeaddr; pt3 = pt4 + (PAGE_SIZE) / sizeof(uint64_t); @@ -413,8 +383,9 @@ acpi_install_wakeup_handler(struct acpi_softc *sc) pt2[i] = i * (2 * 1024 * 1024); pt2[i] |= PG_V | PG_RW | PG_PS | PG_U; } +#endif if (bootverbose) - device_printf(sc->acpi_dev, "wakeup code va %p pa %p\n", - (void *)sc->acpi_wakeaddr, (void *)sc->acpi_wakephys); + device_printf(sc->acpi_dev, "wakeup code va %#jx pa %#jx\n", + (uintmax_t)sc->acpi_wakeaddr, (uintmax_t)sc->acpi_wakephys); } diff --git a/sys/x86/include/_limits.h b/sys/x86/include/_limits.h index 17303ac3e4e..2f582e1237c 100644 --- a/sys/x86/include/_limits.h +++ b/sys/x86/include/_limits.h @@ -57,7 +57,7 @@ #define __INT_MAX 0x7fffffff /* max value for an int */ #define __INT_MIN (-0x7fffffff - 1) /* min value for an int */ -#ifdef _LP64 +#ifdef __LP64__ #define __ULONG_MAX 0xffffffffffffffff /* max for an unsigned long */ #define __LONG_MAX 0x7fffffffffffffff /* max for a long */ #define __LONG_MIN (-0x7fffffffffffffff - 1) /* min for a long */ @@ -72,7 +72,7 @@ #define __LLONG_MAX 0x7fffffffffffffffLL /* max value for a long long */ #define __LLONG_MIN (-0x7fffffffffffffffLL - 1) /* min for a long long */ -#ifdef _LP64 +#ifdef __LP64__ #define __SSIZE_MAX __LONG_MAX /* max value for a ssize_t */ #define __SIZE_T_MAX __ULONG_MAX /* max value for a size_t */ #define __OFF_MAX __LONG_MAX /* max value for an off_t */ diff --git a/sys/x86/include/_stdint.h b/sys/x86/include/_stdint.h index a9d403705f0..d9ee3166236 100644 --- a/sys/x86/include/_stdint.h +++ b/sys/x86/include/_stdint.h @@ -50,7 +50,7 @@ #define UINT16_C(c) (c) #define UINT32_C(c) (c ## U) -#ifdef _LP64 +#ifdef __LP64__ #define INT64_C(c) (c ## L) #define UINT64_C(c) (c ## UL) #else @@ -81,7 +81,7 @@ #define UINT16_MAX 0xffff #define UINT32_MAX 0xffffffffU -#ifdef _LP64 +#ifdef __LP64__ #define INT64_MIN (-0x7fffffffffffffff-1) #define INT64_MAX 0x7fffffffffffffff #define UINT64_MAX 0xffffffffffffffff @@ -139,7 +139,7 @@ * ISO/IEC 9899:1999 * 7.18.2.4 Limits of integer types capable of holding object pointers */ -#ifdef _LP64 +#ifdef __LP64__ #define INTPTR_MIN INT64_MIN #define INTPTR_MAX INT64_MAX #define UINTPTR_MAX UINT64_MAX @@ -161,7 +161,7 @@ * ISO/IEC 9899:1999 * 7.18.3 Limits of other integer types */ -#ifdef _LP64 +#ifdef __LP64__ /* Limits of ptrdiff_t. */ #define PTRDIFF_MIN INT64_MIN #define PTRDIFF_MAX INT64_MAX @@ -180,12 +180,6 @@ #define SIZE_MAX UINT32_MAX #endif -#ifndef WCHAR_MIN /* Also possibly defined in */ -/* Limits of wchar_t. */ -#define WCHAR_MIN INT32_MIN -#define WCHAR_MAX INT32_MAX -#endif - /* Limits of wint_t. */ #define WINT_MIN INT32_MIN #define WINT_MAX INT32_MAX diff --git a/sys/x86/include/_types.h b/sys/x86/include/_types.h index 33135f0888b..2d6bfbca2bb 100644 --- a/sys/x86/include/_types.h +++ b/sys/x86/include/_types.h @@ -54,7 +54,7 @@ typedef short __int16_t; typedef unsigned short __uint16_t; typedef int __int32_t; typedef unsigned int __uint32_t; -#ifdef _LP64 +#ifdef __LP64__ typedef long __int64_t; typedef unsigned long __uint64_t; #else @@ -73,7 +73,7 @@ typedef unsigned long long __uint64_t; /* * Standard type definitions. */ -#ifdef _LP64 +#ifdef __LP64__ typedef __int32_t __clock_t; /* clock()... */ typedef __int64_t __critical_t; typedef double __double_t; @@ -97,7 +97,7 @@ typedef __int8_t __int_least8_t; typedef __int16_t __int_least16_t; typedef __int32_t __int_least32_t; typedef __int64_t __int_least64_t; -#ifdef _LP64 +#ifdef __LP64__ typedef __int64_t __ptrdiff_t; /* ptr1 - ptr2 */ typedef __int64_t __register_t; typedef __int64_t __segsz_t; /* segment size (in pages) */ @@ -125,7 +125,7 @@ typedef __uint8_t __uint_least8_t; typedef __uint16_t __uint_least16_t; typedef __uint32_t __uint_least32_t; typedef __uint64_t __uint_least64_t; -#ifdef _LP64 +#ifdef __LP64__ typedef __uint64_t __u_register_t; typedef __uint64_t __vm_offset_t; typedef __uint64_t __vm_paddr_t; @@ -142,6 +142,10 @@ typedef __uint32_t __vm_size_t; #endif typedef __int64_t __vm_ooffset_t; typedef __uint64_t __vm_pindex_t; +typedef int __wchar_t; + +#define __WCHAR_MIN __INT_MIN /* min value for a wchar_t */ +#define __WCHAR_MAX __INT_MAX /* max value for a wchar_t */ /* * Unusual type definitions. diff --git a/sys/x86/include/float.h b/sys/x86/include/float.h index be0bed30af2..8af3039d085 100644 --- a/sys/x86/include/float.h +++ b/sys/x86/include/float.h @@ -42,7 +42,7 @@ __END_DECLS #define FLT_RADIX 2 /* b */ #define FLT_ROUNDS __flt_rounds() #if __ISO_C_VISIBLE >= 1999 -#ifdef _LP64 +#ifdef __LP64__ #define FLT_EVAL_METHOD 0 /* no promotions */ #else #define FLT_EVAL_METHOD (-1) /* i387 semantics are...interesting */ diff --git a/sys/x86/include/ptrace.h b/sys/x86/include/ptrace.h index 475e3698402..16a04d1e9f6 100644 --- a/sys/x86/include/ptrace.h +++ b/sys/x86/include/ptrace.h @@ -40,8 +40,10 @@ * PT_GETXSTATE and PT_SETXSTATE. They should not be (re)used. */ -#define PT_GETXMMREGS (PT_FIRSTMACH + 0) /* i386 only */ -#define PT_SETXMMREGS (PT_FIRSTMACH + 1) /* i386 only */ +#ifdef __i386__ +#define PT_GETXMMREGS (PT_FIRSTMACH + 0) +#define PT_SETXMMREGS (PT_FIRSTMACH + 1) +#endif #define PT_GETXSTATE (PT_FIRSTMACH + 2) #define PT_SETXSTATE (PT_FIRSTMACH + 3) diff --git a/sys/x86/include/vdso.h b/sys/x86/include/vdso.h new file mode 100644 index 00000000000..11714205d4e --- /dev/null +++ b/sys/x86/include/vdso.h @@ -0,0 +1,42 @@ +/*- + * Copyright 2012 Konstantin Belousov . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _X86_VDSO_H +#define _X86_VDSO_H + +#define VDSO_TIMEHANDS_MD \ + uint32_t th_x86_shift; \ + uint32_t th_res[7]; + +#ifdef _KERNEL +#ifdef COMPAT_FREEBSD32 + +#define VDSO_TIMEHANDS_MD32 VDSO_TIMEHANDS_MD + +#endif +#endif +#endif diff --git a/sys/x86/x86/dump_machdep.c b/sys/x86/x86/dump_machdep.c index 4e6546d7bfb..5c874f4847b 100644 --- a/sys/x86/x86/dump_machdep.c +++ b/sys/x86/x86/dump_machdep.c @@ -36,9 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#ifdef SW_WATCHDOG #include -#endif #include #include #include @@ -198,9 +196,9 @@ cb_dumpdata(struct md_pa *mdp, int seqnr, void *arg) a = pa + i * PAGE_SIZE; va = pmap_kenter_temporary(trunc_page(a), i); } -#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); -#endif + error = dump_write(di, va, 0, dumplo, sz); if (error) break; diff --git a/sys/x86/x86/intr_machdep.c b/sys/x86/x86/intr_machdep.c index fef227eb878..71e9006f8fd 100644 --- a/sys/x86/x86/intr_machdep.c +++ b/sys/x86/x86/intr_machdep.c @@ -565,4 +565,11 @@ intr_next_cpu(void) return (PCPU_GET(apic_id)); } + +/* Use an empty stub for compatibility. */ +void +intr_add_cpu(u_int cpu __unused) +{ + +} #endif diff --git a/sys/x86/x86/tsc.c b/sys/x86/x86/tsc.c index 4d1618f14b7..085c33916b8 100644 --- a/sys/x86/x86/tsc.c +++ b/sys/x86/x86/tsc.c @@ -27,6 +27,7 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_compat.h" #include "opt_clock.h" #include @@ -41,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -604,3 +606,23 @@ tsc_get_timecount_low(struct timecounter *tc) : "=a" (rv) : "c" ((int)(intptr_t)tc->tc_priv) : "edx"); return (rv); } + +uint32_t +cpu_fill_vdso_timehands(struct vdso_timehands *vdso_th) +{ + + vdso_th->th_x86_shift = (int)(intptr_t)timecounter->tc_priv; + bzero(vdso_th->th_res, sizeof(vdso_th->th_res)); + return (timecounter == &tsc_timecounter); +} + +#ifdef COMPAT_FREEBSD32 +uint32_t +cpu_fill_vdso_timehands32(struct vdso_timehands32 *vdso_th32) +{ + + vdso_th32->th_x86_shift = (int)(intptr_t)timecounter->tc_priv; + bzero(vdso_th32->th_res, sizeof(vdso_th32->th_res)); + return (timecounter == &tsc_timecounter); +} +#endif diff --git a/tools/build/make_check/Makefile b/tools/build/make_check/Makefile index cc8ca6b918c..346b4bb0685 100644 --- a/tools/build/make_check/Makefile +++ b/tools/build/make_check/Makefile @@ -23,7 +23,7 @@ NIL= SMAKE= MAKEFLAGS= ${MAKE} -C ${.CURDIR} all: - @echo '1..17' + @echo '1..16' @${SMAKE} C_check || { cd ${.CURDIR} ; ${MAKE} failure ; } @echo "ok 1 - C_check # Test of -C flag existence detected no regression." @echo 1:${DATA1} 2:${DATA2} 3:${DATA3} 4:${DATA4} 5:${DATA5} | \ @@ -40,26 +40,24 @@ all: @echo "ok 6 - notdef # Test notdef detected no regression." @${SMAKE} modifiers || ${SMAKE} failure @echo "ok 7 - modifiers # Test modifiers detected no regression." - @${SMAKE} funny_targets || ${SMAKE} failure - @echo "ok 8 funny_targets # Test funny_targets detected no regression." @${SMAKE} arith_expr || ${SMAKE} failure - @echo "ok 9 arith_expr # Test arith_expr detected no regression." + @echo "ok 8 arith_expr # Test arith_expr detected no regression." @${SMAKE} PATH_exists || ${SMAKE} failure - @echo "ok 10 PATH_exists # Test PATH_exists detected no regression." + @echo "ok 9 PATH_exists # Test PATH_exists detected no regression." @${SMAKE} double_quotes || ${SMAKE} failure - @echo "ok 11 double_quotes # Test double_quotes detected no regression." + @echo "ok 10 double_quotes # Test double_quotes detected no regression." @! ${SMAKE} double_quotes2 >/dev/null 2>&1 && true || ${SMAKE} failure - @echo "ok 12 double_quotes2 # Test double_quotes2 detected no regression." + @echo "ok 11 double_quotes2 # Test double_quotes2 detected no regression." @${SMAKE} pass_cmd_vars || ${SMAKE} failure - @echo "ok 13 pass_cmd_vars # Test pass_cmd_vars detected no regression." + @echo "ok 12 pass_cmd_vars # Test pass_cmd_vars detected no regression." @${SMAKE} plus_flag || ${SMAKE} failure - @echo "ok 14 plus_flag # Test plus_flag detected no regression." + @echo "ok 13 plus_flag # Test plus_flag detected no regression." @! ${SMAKE} shell >/dev/null 2>&1 && true || ${SMAKE} failure - @echo "ok 15 shell # Test shell detected no regression." + @echo "ok 14 shell # Test shell detected no regression." @${SMAKE} shell_1 || ${SMAKE} failure - @echo "ok 16 shell_1 # Test shell_1 detected no regression." + @echo "ok 15 shell_1 # Test shell_1 detected no regression." @${SMAKE} shell_2 || ${SMAKE} failure - @echo "ok 17 shell_2 # Test shell_2 detected no regression." + @echo "ok 16 shell_2 # Test shell_2 detected no regression." .if make(C_check) C_check: @@ -107,12 +105,6 @@ modifiers: fi .endif -.if make(funny_targets) -funny_targets: colons::target exclamation!target -colons::target: -exclamation!target: -.endif - .if make(arith_expr) arith_expr: # See if arithmetic expression parsing is broken. diff --git a/tools/build/make_check/check.mk b/tools/build/make_check/check.mk new file mode 100644 index 00000000000..f2d666d5ca4 --- /dev/null +++ b/tools/build/make_check/check.mk @@ -0,0 +1,19 @@ +# $FreeBSD$ + +all: + ${MK} ${MK_ARG} + +.if exists(${.OBJDIR}/../../../usr.bin/make/make) +MK= ${.OBJDIR}/../../../usr.bin/make/make +new: + ${MK} ${MK_ARG} 2>&1 | tee out-new + @echo "-=-=-=-=-=-" + make ${MK_ARG} 2>&1 | tee out-old + @echo "-=-=-=-=-=-" + diff -s out-old out-new +.else +MK= make +.endif +MK_ARG= -C ${.CURDIR} + +.include diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc index 92c4068f22b..786381493d6 100644 --- a/tools/build/mk/OptionalObsoleteFiles.inc +++ b/tools/build/mk/OptionalObsoleteFiles.inc @@ -2179,6 +2179,8 @@ OLD_FILES+=usr/share/man/man8/ipfstat.8.gz OLD_FILES+=usr/share/man/man8/ipmon.8.gz OLD_FILES+=usr/share/man/man8/ipnat.8.gz OLD_FILES+=usr/share/man/man8/ippool.8.gz +OLD_FILES+=etc/periodic/security/510.ipfdenied +OLD_FILES+=etc/periodic/security/610.ipf6denied .endif .if ${MK_IPFW} == no @@ -3480,6 +3482,10 @@ OLD_FILES+=usr/share/man/man8/pflogd.8.gz OLD_FILES+=usr/share/man/man8/tftp-proxy.8.gz .endif +.if ${MK_PKGBOOTSTRAP} == no +OLD_FILES+=usr/sbin/pkg +.endif + .if ${MK_PKGTOOLS} == no OLD_FILES+=etc/periodic/daily/490.status-pkg-changes OLD_FILES+=etc/periodic/security/460.chkportsum diff --git a/tools/build/options/WITHOUT_BINUTILS b/tools/build/options/WITHOUT_BINUTILS index 9d57c62d000..3587b8c2e87 100644 --- a/tools/build/options/WITHOUT_BINUTILS +++ b/tools/build/options/WITHOUT_BINUTILS @@ -1,6 +1,6 @@ .\" $FreeBSD$ Set to not install binutils (as, c++-filt, gconv, gnu-ar, gnu-randlib, -ld, nm, objcopy, objdump, readelf, size and strip) +ld, nm, objcopy, objdump, readelf, size and strip). .Bf -symbolic The option does not generally work for build targets, unless some alternative toolchain is enabled. diff --git a/tools/build/options/WITHOUT_ED_CRYPTO b/tools/build/options/WITHOUT_ED_CRYPTO new file mode 100644 index 00000000000..d4572640d4c --- /dev/null +++ b/tools/build/options/WITHOUT_ED_CRYPTO @@ -0,0 +1,4 @@ +.\" $FreeBSD$ +Set to build +.Xr ed 1 +without support for encryption/decryption. diff --git a/tools/build/options/WITHOUT_LS_COLORS b/tools/build/options/WITHOUT_LS_COLORS new file mode 100644 index 00000000000..79896565c1a --- /dev/null +++ b/tools/build/options/WITHOUT_LS_COLORS @@ -0,0 +1,4 @@ +.\" $FreeBSD$ +Set to build +.Xr ls 1 +without support for colors to distinguish file types. diff --git a/tools/build/options/WITHOUT_NAND b/tools/build/options/WITHOUT_NAND new file mode 100644 index 00000000000..67cadaf8d96 --- /dev/null +++ b/tools/build/options/WITHOUT_NAND @@ -0,0 +1,2 @@ +.\" $FreeBSD$ +Set to not build the NAND Flash components. diff --git a/tools/build/options/WITHOUT_PKGBOOTSTRAP b/tools/build/options/WITHOUT_PKGBOOTSTRAP new file mode 100644 index 00000000000..1f98dd58e38 --- /dev/null +++ b/tools/build/options/WITHOUT_PKGBOOTSTRAP @@ -0,0 +1,4 @@ +.\" $FreeBSD$ +Set to not build +.Xr pkg 1 +bootstrap tool diff --git a/tools/build/options/WITHOUT_ZONEINFO b/tools/build/options/WITHOUT_ZONEINFO index d6c1c9d9ca4..582b81fce25 100644 --- a/tools/build/options/WITHOUT_ZONEINFO +++ b/tools/build/options/WITHOUT_ZONEINFO @@ -1,2 +1,2 @@ .\" $FreeBSD$ -Set to not build the timezone database +Set to not build the timezone database. diff --git a/tools/build/options/WITH_CLANG_IS_CC b/tools/build/options/WITH_CLANG_IS_CC index a7511dd4070..40d795b5346 100644 --- a/tools/build/options/WITH_CLANG_IS_CC +++ b/tools/build/options/WITH_CLANG_IS_CC @@ -1,8 +1,6 @@ .\" $FreeBSD$ Set to install the Clang C/C++ compiler as -.Pa /usr/bin/cc -, +.Pa /usr/bin/cc , .Pa /usr/bin/c++ and -.Pa /usr/bin/cpp -. +.Pa /usr/bin/cpp . diff --git a/tools/build/options/WITH_GNU_SORT b/tools/build/options/WITH_GNU_SORT new file mode 100644 index 00000000000..6bd32c92f42 --- /dev/null +++ b/tools/build/options/WITH_GNU_SORT @@ -0,0 +1,2 @@ +.\" $FreeBSD$ +Install GNU-licensed sort as 'sort' instead of BSD sort. diff --git a/tools/build/options/WITH_INSTALL_AS_USER b/tools/build/options/WITH_INSTALL_AS_USER new file mode 100644 index 00000000000..da49014316a --- /dev/null +++ b/tools/build/options/WITH_INSTALL_AS_USER @@ -0,0 +1,9 @@ +.\" $FreeBSD$ +Set to make install targets succeed for non-root users by installing +files with owner and group attributes set to that of the user running +the +.Xr make 1 +command. +The user still has to set the +.Va DESTDIR +variable to point to a directory where the user has write permissions. diff --git a/tools/build/options/WITH_NAND b/tools/build/options/WITH_NAND new file mode 100644 index 00000000000..527d43dce28 --- /dev/null +++ b/tools/build/options/WITH_NAND @@ -0,0 +1,2 @@ +.\" $FreeBSD$ +Set to build the NAND Flash components. diff --git a/tools/build/options/WITH_SHARED_TOOLCHAIN b/tools/build/options/WITH_SHARED_TOOLCHAIN new file mode 100644 index 00000000000..d0ddc792fd8 --- /dev/null +++ b/tools/build/options/WITH_SHARED_TOOLCHAIN @@ -0,0 +1,6 @@ +.\" $FreeBSD$ +Set to build the toolchain binaries shared. +The set includes +.Xr cc 1 , +.Xr make 1 +and necessary utilities like assembler, linker and library archive manager. diff --git a/tools/build/options/makeman b/tools/build/options/makeman index d29fe0a2092..61c077697a5 100755 --- a/tools/build/options/makeman +++ b/tools/build/options/makeman @@ -265,7 +265,7 @@ EOF cat <fifo1 wait || failure $LINENO -(echo >&3) 2>/dev/null && failure $LINENO +(${SH} -c echo >&3) 2>/dev/null && failure $LINENO wait || failure $LINENO test -z "$failures" diff --git a/tools/regression/filemon/Makefile b/tools/regression/filemon/Makefile new file mode 100644 index 00000000000..06d6f64cbbb --- /dev/null +++ b/tools/regression/filemon/Makefile @@ -0,0 +1,28 @@ +# $FreeBSD$ + +PROG= filemontest + +NO_MAN= + +WARNS?= 6 +CFLAGS+= -I${.CURDIR}/../../../sys + +# Cannot use .OBJDIR -- 'filemontest' expects 'test_script.sh' in . +test: ${PROG} clean-test +.for BIN in ${PROG} ${PROG}32 + cd ${.CURDIR} ; \ + for A in 1 2 3 4 5 6 7 8 9 0; do \ + for B in 1 2 3 4 5 6 7 8 9 0; do \ + for C in 1 2 3 4 5 6 7 8 9 0; do \ + test -x ${BIN} && ${.OBJDIR}/${BIN} ;\ + done ;\ + done ;\ + done + @cd ${.CURDIR} ; set +e ; egrep '(Start|Stop) .*\.' filemon_log.* | \ + grep -q -v '\.[0-9][0-9][0-9][0-9][0-9][0-9]$$' || echo "Time stamp format OK" +.endfor + +clean-test: + cd ${.CURDIR} ; rm -f filemon_log.* + +.include diff --git a/tools/regression/filemon/filemontest.c b/tools/regression/filemon/filemontest.c new file mode 100644 index 00000000000..6f0254746b5 --- /dev/null +++ b/tools/regression/filemon/filemontest.c @@ -0,0 +1,80 @@ +/*- + * Copyright (c) 2009-2011, Juniper Networks, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JUNIPER NETWORKS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JUNIPER NETWORKS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include + +#include +#include +#include +#include +#include + +/* + * This simple test of filemon expects a test script called + * "test_script.sh" in the cwd. + */ + +int +main(void) { + char log_name[] = "filemon_log.XXXXXX"; + pid_t child; + int fm_fd, fm_log; + + if ((fm_fd = open("/dev/filemon", O_RDWR)) == -1) + err(1, "open(\"/dev/filemon\", O_RDWR)"); + if ((fm_log = mkstemp(log_name)) == -1) + err(1, "mkstemp(%s)", log_name); + + if (ioctl(fm_fd, FILEMON_SET_FD, &fm_log) == -1) + err(1, "Cannot set filemon log file descriptor"); + + /* Set up these two fd's to close on exec. */ + (void)fcntl(fm_fd, F_SETFD, FD_CLOEXEC); + (void)fcntl(fm_log, F_SETFD, FD_CLOEXEC); + + switch (child = fork()) { + case 0: + child = getpid(); + if (ioctl(fm_fd, FILEMON_SET_PID, &child) == -1) + err(1, "Cannot set filemon PID to %d", child); + system("./test_script.sh"); + break; + case -1: + err(1, "Cannot fork"); + default: + wait(&child); + close(fm_fd); +// printf("Results in %s\n", log_name); + break; + } + return 0; +} diff --git a/tools/regression/filemon/test_script.sh b/tools/regression/filemon/test_script.sh new file mode 100755 index 00000000000..df34ec4a385 --- /dev/null +++ b/tools/regression/filemon/test_script.sh @@ -0,0 +1,43 @@ +#! /bin/sh +# +# Copyright (c) 2011, Juniper Networks, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY JUNIPER NETWORKS AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL JUNIPER NETWORKS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ + +trap 'rm -f $f1 $f2; exit 1' 1 2 3 13 15 +echo shazbot > /dev/null +f1=`mktemp /tmp/filemon_test.XXXXXX` +f2=`mktemp /tmp/ed-script.XXXXXX` +> $f1 +echo "One line to rule them all" >> $f1 +wc -l $f1 > /dev/null +# ed(1)'s /tmp/ed.* buffer file will be opened RW +echo ',s/$/./g' > $f2 +echo 'wq' >>$f2 +ed -s $f1 < $f2 +#echo ",s/$/./\ +#w" | ed -s $f1 +#rm $f1 $f2 +uptime > /dev/null diff --git a/tools/regression/pjdfstest/pjdfstest.c b/tools/regression/pjdfstest/pjdfstest.c index b14d34e9045..c08fafdfdfd 100644 --- a/tools/regression/pjdfstest/pjdfstest.c +++ b/tools/regression/pjdfstest/pjdfstest.c @@ -350,10 +350,10 @@ str2flags(struct flag *tflags, char *sflags) unsigned int i; char *f; - for (f = strtok(sflags, ","); f != NULL; f = strtok(NULL, ",")) { - /* Support magic 'none' flag which just reset all flags. */ - if (strcmp(f, "none") == 0) - return (0); + /* 'none' or '0' means no flags */ + if (strcmp(sflags, "none") == 0 || strcmp(sflags, "0") == 0) + return (0); + for (f = strtok(sflags, ",|"); f != NULL; f = strtok(NULL, ",|")) { for (i = 0; tflags[i].f_str != NULL; i++) { if (strcmp(tflags[i].f_str, f) == 0) break; diff --git a/tools/regression/sysvmsg/msgtest.c b/tools/regression/sysvmsg/msgtest.c index 462dc384640..058a3210664 100644 --- a/tools/regression/sysvmsg/msgtest.c +++ b/tools/regression/sysvmsg/msgtest.c @@ -35,7 +35,7 @@ * Test the SVID-compatible Message Queue facility. */ -#include +#include #include #include #include diff --git a/tools/regression/sysvsem/semtest.c b/tools/regression/sysvsem/semtest.c index b6859bf3a45..8a997d0bf6a 100644 --- a/tools/regression/sysvsem/semtest.c +++ b/tools/regression/sysvsem/semtest.c @@ -35,7 +35,7 @@ * Test the SVID-compatible Semaphore facility. */ -#include +#include #include #include #include diff --git a/tools/regression/sysvshm/shmtest.c b/tools/regression/sysvshm/shmtest.c index 9e5ab1c1635..7c6154512be 100644 --- a/tools/regression/sysvshm/shmtest.c +++ b/tools/regression/sysvshm/shmtest.c @@ -35,7 +35,7 @@ * Test the SVID-compatible Shared Memory facility. */ -#include +#include #include #include #include diff --git a/tools/regression/usr.bin/m4/Makefile b/tools/regression/usr.bin/m4/Makefile index 99036706a81..b937d41a4e4 100644 --- a/tools/regression/usr.bin/m4/Makefile +++ b/tools/regression/usr.bin/m4/Makefile @@ -1,4 +1,4 @@ # $FreeBSD$ all: - @sh ${.CURDIR}/regress.sh ${.CURDIR} + @m4 ${.CURDIR}/../regress.m4 ${.CURDIR}/regress.sh | sh /dev/stdin ${.CURDIR} diff --git a/tools/regression/usr.bin/m4/args.m4 b/tools/regression/usr.bin/m4/args.m4 new file mode 100644 index 00000000000..3ad30f2442e --- /dev/null +++ b/tools/regression/usr.bin/m4/args.m4 @@ -0,0 +1,9 @@ +dnl $FreeBSD$ +dnl $OpenBSD: src/regress/usr.bin/m4/args.m4,v 1.1 2001/10/10 23:23:59 espie Exp $ +dnl Expanding all arguments +define(`A', `first form: $@, second form $*')dnl +define(`B', `C')dnl +A(1,2,`B') +dnl indirection means macro can get called with argc == 2 ! +indir(`A',1,2,`B') +indir(`A') diff --git a/tools/regression/usr.bin/m4/args2.m4 b/tools/regression/usr.bin/m4/args2.m4 new file mode 100644 index 00000000000..3f9ed600fca --- /dev/null +++ b/tools/regression/usr.bin/m4/args2.m4 @@ -0,0 +1,5 @@ +dnl $FreeBSD$ +dnl $OpenBSD: src/regress/usr.bin/m4/args2.m4,v 1.1 2008/08/16 09:57:12 espie Exp $ +dnl Preserving spaces within nested parentheses +define(`foo',`$1')dnl +foo(( check for embedded spaces)) diff --git a/tools/regression/usr.bin/m4/comments.m4 b/tools/regression/usr.bin/m4/comments.m4 new file mode 100644 index 00000000000..d7038c4f636 --- /dev/null +++ b/tools/regression/usr.bin/m4/comments.m4 @@ -0,0 +1,59 @@ +dnl $FreeBSD$ +dnl $OpenBSD: src/regress/usr.bin/m4/comments.m4,v 1.1 2005/09/06 15:33:21 espie Exp $ +dnl checking the way changecom works. +1: normal +define(`comment', `COMMENT')dnl +define(`p', 'XXX')dnl +# this is a comment +>> this is a comment +p this is a comment +p this is a comment q comment too + +2: `changecom(>>)dnl' +changecom(>>)dnl +# this is a comment +>> this is a comment +p this is a comment +p this is a comment q comment too + +3: `changecom dnl' +changecom dnl +# this is a comment +>> this is a comment +p this is a comment +p this is a comment q comment too + +4: `changecom()dnl' +changecom()dnl +# this is a comment +>> this is a comment +p this is a comment +p this is a comment q comment too + +5: `changecom(,)dnl' +changecom(,)dnl +# this is a comment +>> this is a comment +p this is a comment +p this is a comment q comment too + +6: `changecom(`p',q)dnl' +changecom(`p',q)dnl +# this is a comment +>> this is a comment +p this is a comment +p this is a comment q comment too + +7: `changecom(`p')dnl' +changecom(`p')dnl +# this is a comment +>> this is a comment +p this is a comment +p this is a comment q comment too + +8: `changecom(#)dnl' +changecom(#)dnl +# this is a comment +>> this is a comment +p this is a comment +p this is a comment q comment too diff --git a/tools/regression/usr.bin/m4/esyscmd.m4 b/tools/regression/usr.bin/m4/esyscmd.m4 new file mode 100644 index 00000000000..7b1342d39d8 --- /dev/null +++ b/tools/regression/usr.bin/m4/esyscmd.m4 @@ -0,0 +1,43 @@ +dnl $FreeBSD$ +changequote(`{',`}')dnl +dnl +esyscmd({sh -c "m4<>>') +patsubst(`# This is a line to zap +# and a second line +keep this one', `^ *#.* +') +dnl Special case: empty regexp +patsubst(`empty regexp',`',`a ') diff --git a/tools/regression/usr.bin/m4/quotes.m4 b/tools/regression/usr.bin/m4/quotes.m4 new file mode 100644 index 00000000000..c783e22298a --- /dev/null +++ b/tools/regression/usr.bin/m4/quotes.m4 @@ -0,0 +1,58 @@ +dnl $FreeBSD$ +dnl $OpenBSD: src/regress/usr.bin/m4/quotes.m4,v 1.2 2005/09/06 15:33:21 espie Exp $ +dnl Checking the way changequote() is supposed to work +define(`string',`STRING')dnl +1: normal +`quoted string' +[quoted string] +normal string +`half quoted string +going up to that string' + +2: kill quotes +changequote()dnl +`quoted string' +[quoted string] +normal string +`half quoted string +going up to that string' + +3: normal changed quote +changequote([,])dnl +`quoted string' +[quoted string] +normal string +`half quoted string +going up to that string' + +4: empty quotes, kill them too +changequote(,)dnl +`quoted string' +[quoted string] +normal string +`half quoted string +going up to that string' + +5: start quote only +changequote(`)dnl +`quoted string' +[quoted string] +normal string +`half quoted string +going up to that string' + +6: normal quotes are back +changequote +`quoted string' +[quoted string] +normal string +`half quoted string +going up to that string' + +7: start quote+empty end quote +changequote([,)dnl +`quoted string' +[quoted string] +normal string +`half quoted string +going up to that string' diff --git a/tools/regression/usr.bin/m4/redef.m4 b/tools/regression/usr.bin/m4/redef.m4 new file mode 100644 index 00000000000..de01f674b45 --- /dev/null +++ b/tools/regression/usr.bin/m4/redef.m4 @@ -0,0 +1,17 @@ +dnl $FreeBSD$ +dnl $OpenBSD: src/regress/usr.bin/m4/redef.m4,v 1.2 2001/09/27 22:40:58 espie Exp $ +dnl check all properties of builtin are passed on, including args behavior +define(`mybuiltin',defn(`builtin'))dnl +builtin mybuiltin +define(`mydefine',defn(`define'))dnl +mydefine(`mydefn',defn(`defn'))dnl +mydefine(`myundefine',mydefn(`undefine'))dnl +myundefine(`defn')dnl +myundefine(`define')dnl +myundefine(`undefine')dnl +mydefine(`mydef2',mydefn(`mydefine'))dnl +mydefine(`mydef', mydefn(`define'))dnl +myundefine(`mydefine')dnl +mydef2(`A',`B')dnl +mydef(`C',`D')dnl +A C diff --git a/tools/regression/usr.bin/m4/regress.args.out b/tools/regression/usr.bin/m4/regress.args.out new file mode 100644 index 00000000000..aaa890010a5 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.args.out @@ -0,0 +1,3 @@ +first form: 1,2,B, second form 1,2,C +first form: 1,2,B, second form 1,2,C +first form: , second form diff --git a/tools/regression/usr.bin/m4/regress.args2.out b/tools/regression/usr.bin/m4/regress.args2.out new file mode 100644 index 00000000000..74bdbd6e595 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.args2.out @@ -0,0 +1 @@ +( check for embedded spaces) diff --git a/tools/regression/usr.bin/m4/regress.changecom.in b/tools/regression/usr.bin/m4/regress.changecom.in deleted file mode 100644 index 843fa113d7f..00000000000 --- a/tools/regression/usr.bin/m4/regress.changecom.in +++ /dev/null @@ -1,3 +0,0 @@ -changecom -# dnl BSD will show this in output. -# dnl SYSV + GNU will not show this. diff --git a/tools/regression/usr.bin/m4/regress.changecom.out b/tools/regression/usr.bin/m4/regress.changecom.out deleted file mode 100644 index 128a18be04a..00000000000 --- a/tools/regression/usr.bin/m4/regress.changecom.out +++ /dev/null @@ -1,3 +0,0 @@ - -# dnl BSD will show this in output. -# dnl SYSV + GNU will not show this. diff --git a/tools/regression/usr.bin/m4/regress.comments.out b/tools/regression/usr.bin/m4/regress.comments.out new file mode 100644 index 00000000000..157f107a8a2 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.comments.out @@ -0,0 +1,47 @@ +1: normal +# this is a comment +>> this is a COMMENT +'XXX' this is a COMMENT +'XXX' this is a COMMENT q COMMENT too + +2: changecom(>>)dnl +# this is a COMMENT +>> this is a comment +'XXX' this is a COMMENT +'XXX' this is a COMMENT q COMMENT too + +3: changecom dnl + # this is a COMMENT +>> this is a COMMENT +'XXX' this is a COMMENT +'XXX' this is a COMMENT q COMMENT too + +4: changecom()dnl +# this is a COMMENT +>> this is a COMMENT +'XXX' this is a COMMENT +'XXX' this is a COMMENT q COMMENT too + +5: changecom(,)dnl +# this is a COMMENT +>> this is a COMMENT +'XXX' this is a COMMENT +'XXX' this is a COMMENT q COMMENT too + +6: changecom(`p',q)dnl +# this is a COMMENT +>> this is a COMMENT +p this is a comment +p this is a comment q COMMENT too + +7: changecom(`p')dnl +# this is a COMMENT +>> this is a COMMENT +p this is a comment +p this is a comment q comment too + +8: changecom(#)dnl +# this is a comment +>> this is a COMMENT +'XXX' this is a COMMENT +'XXX' this is a COMMENT q COMMENT too diff --git a/tools/regression/usr.bin/m4/regress.esyscmd.out b/tools/regression/usr.bin/m4/regress.esyscmd.out new file mode 100644 index 00000000000..89a1d06578a --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.esyscmd.out @@ -0,0 +1,578 @@ + + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + +hi there a +hi there a + + diff --git a/tools/regression/usr.bin/m4/regress.eval.out b/tools/regression/usr.bin/m4/regress.eval.out new file mode 100644 index 00000000000..7298b3f4384 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.eval.out @@ -0,0 +1,3 @@ +96 +255 +1 diff --git a/tools/regression/usr.bin/m4/regress.ff_after_dnl.out b/tools/regression/usr.bin/m4/regress.ff_after_dnl.out new file mode 100644 index 00000000000..8e51f1ea05c --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.ff_after_dnl.out @@ -0,0 +1,2 @@ + THIS SHOULD SHOW UP (LINE 1) + THIS SHOULD SHOW UP (LINE 5) diff --git a/tools/regression/usr.bin/m4/regress.gchangecom.out b/tools/regression/usr.bin/m4/regress.gchangecom.out deleted file mode 100644 index 00aae57f940..00000000000 --- a/tools/regression/usr.bin/m4/regress.gchangecom.out +++ /dev/null @@ -1,2 +0,0 @@ - -# # \ No newline at end of file diff --git a/tools/regression/usr.bin/m4/regress.gnueval.out b/tools/regression/usr.bin/m4/regress.gnueval.out new file mode 100644 index 00000000000..6d7fd49ca21 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.gnueval.out @@ -0,0 +1,3 @@ +65536 +48 +-64 diff --git a/tools/regression/usr.bin/m4/regress.gnuformat.out b/tools/regression/usr.bin/m4/regress.gnuformat.out new file mode 100644 index 00000000000..3f484d61d4d --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.gnuformat.out @@ -0,0 +1 @@ +a stringa%bpouet bctoolongcdtoolong2d diff --git a/tools/regression/usr.bin/m4/regress.gnupatterns.out b/tools/regression/usr.bin/m4/regress.gnupatterns.out new file mode 100644 index 00000000000..8e311030193 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.gnupatterns.out @@ -0,0 +1,3 @@ +string with a minus to replace with a minus +string with b to replbce with b b +minusstring with a starting + to replace with a minus diff --git a/tools/regression/usr.bin/m4/regress.gnupatterns2.out b/tools/regression/usr.bin/m4/regress.gnupatterns2.out new file mode 100644 index 00000000000..c45944ab60a --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.gnupatterns2.out @@ -0,0 +1 @@ +acosl asinl atanl cosl sinl tanl coshl sinhl tanhl diff --git a/tools/regression/usr.bin/m4/regress.gnuprefix.out b/tools/regression/usr.bin/m4/regress.gnuprefix.out new file mode 100644 index 00000000000..186421d8650 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.gnuprefix.out @@ -0,0 +1,46 @@ +`m4_ifelse' `m4_ifelse' +`m4_dnl' `m4_dnl' +`m4_expr' `m4_expr' +`m4_builtin' `m4_builtin' +`m4_popdef' `m4_popdef' +`m4_eval' `m4_eval' +`m4_len' `m4_len' +`m4_indir' `m4_indir' +`m4_sinclude' `m4_sinclude' +`m4_index' `m4_index' +`m4_traceoff' `m4_traceoff' +`m4___file__' `m4___file__' +`m4_unix' `m4_unix' +`m4_mkstemp' `m4_mkstemp' +`m4_changecom' `m4_changecom' +`m4_defn' `m4_defn' +`m4_decr' `m4_decr' +`m4_translit' `m4_translit' +`m4_patsubst' `m4_patsubst' +`m4_dumpdef' `m4_dumpdef' +`m4___line__' `m4___line__' +`m4_esyscmd' `m4_esyscmd' +`m4_traceon' `m4_traceon' +`m4_incr' `m4_incr' +`m4_shift' `m4_shift' +`m4_syscmd' `m4_syscmd' +`m4_include' `m4_include' +`m4_pushdef' `m4_pushdef' +`m4_paste' `m4_paste' +`m4_regexp' `m4_regexp' +`m4_changequote' `m4_changequote' +`m4_undivert' `m4_undivert' +`m4_m4exit' `m4_m4exit' +`m4_substr' `m4_substr' +`m4_m4wrap' `m4_m4wrap' +`m4_ifdef' `m4_ifdef' +`m4_sysval' `m4_sysval' +`m4_divert' `m4_divert' +`m4_maketemp' `m4_maketemp' +`m4_spaste' `m4_spaste' +`m4_define' `m4_define' +`m4_undefine' `m4_undefine' +`m4_divnum' `m4_divnum' +`m4_errprint' `m4_errprint' +dumpdef() + diff --git a/tools/regression/usr.bin/m4/regress.gnusofterror.out b/tools/regression/usr.bin/m4/regress.gnusofterror.out new file mode 100644 index 00000000000..8baef1b4abc --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.gnusofterror.out @@ -0,0 +1 @@ +abc diff --git a/tools/regression/usr.bin/m4/regress.gnutranslit2.out b/tools/regression/usr.bin/m4/regress.gnutranslit2.out new file mode 100644 index 00000000000..5c88e734a07 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.gnutranslit2.out @@ -0,0 +1,6 @@ +[HAVE_abc def h/] +[HAVE_abc~def~h/] +ABCDEFGHIJ +ABCDEFGHIJ +ABC-0980-ZYX +ABC-0980-ZYX diff --git a/tools/regression/usr.bin/m4/regress.includes.out b/tools/regression/usr.bin/m4/regress.includes.out new file mode 100644 index 00000000000..4a1f4754cfd --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.includes.out @@ -0,0 +1 @@ +hello world diff --git a/tools/regression/usr.bin/m4/regress.m4wrap3.out b/tools/regression/usr.bin/m4/regress.m4wrap3.out new file mode 100644 index 00000000000..51b43f42d14 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.m4wrap3.out @@ -0,0 +1,4 @@ +normal m4 stuff +this is +a string +recurse diff --git a/tools/regression/usr.bin/m4/regress.patterns.out b/tools/regression/usr.bin/m4/regress.patterns.out new file mode 100644 index 00000000000..c273b589d77 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.patterns.out @@ -0,0 +1,6 @@ +quote \s in \string +>>>check whether subst +>>>over several lines +>>>works as expected +keep this one +a ea ma pa ta ya a ra ea ga ea xa p diff --git a/tools/regression/usr.bin/m4/regress.quotes.out b/tools/regression/usr.bin/m4/regress.quotes.out new file mode 100644 index 00000000000..fe5b8a4b45b --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.quotes.out @@ -0,0 +1,49 @@ +m4: unclosed quote: + quotes.m4 at line 55 +1: normal +quoted string +[quoted STRING] +normal STRING +half quoted string +going up to that string + +2: kill quotes +`quoted STRING' +[quoted STRING] +normal STRING +`half quoted STRING +going up to that STRING' + +3: normal changed quote +`quoted STRING' +quoted string +normal STRING +`half quoted STRING +going up to that STRING' + +4: empty quotes, kill them too +`quoted STRING' +[quoted STRING] +normal STRING +`half quoted STRING +going up to that STRING' + +5: start quote only +quoted string'[quoted STRING] +normal STRING +half quoted stringgoing up to that STRING' + +6: normal quotes are back + +quoted string +[quoted STRING] +normal STRING +half quoted string +going up to that string + +7: start quote+empty end quote +`quoted STRING' +quoted string] +normal string +`half quoted string +going up to that string' diff --git a/tools/regression/usr.bin/m4/regress.redef.out b/tools/regression/usr.bin/m4/regress.redef.out new file mode 100644 index 00000000000..ee482f013a8 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.redef.out @@ -0,0 +1,2 @@ +builtin mybuiltin +B C diff --git a/tools/regression/usr.bin/m4/regress.sh b/tools/regression/usr.bin/m4/regress.sh index 9619d520b00..198cfa2540a 100644 --- a/tools/regression/usr.bin/m4/regress.sh +++ b/tools/regression/usr.bin/m4/regress.sh @@ -1,41 +1,31 @@ # $FreeBSD$ -# Go into the regression test directory, handed to us by make(1) -TESTDIR=$1 -if [ -z "$TESTDIR" ]; then - TESTDIR=. -fi -cd $TESTDIR +LC_ALL=C; export LC_ALL -STATUS=0 +echo 1..22 -echo 1..2 +REGRESSION_START($1) -for test in GNU/changecom changecom; do - case "$test" in - GNU/*) - M4="m4 -g" - GNU="g" - test=`basename $test` - ;; - *) - M4="m4" - GNU="" - ;; - esac - case "$test" in - changecom) - $M4 < regress.$test.in | diff -u regress.$GNU$test.out - - ;; - esac - if [ $? -eq 0 ]; then - echo "ok - $test # Test detected no regression, output matches." - else - STATUS=$? - echo "not ok - $test # Test failed: regression detected. See above." - fi -done - -exit $STATUS +REGRESSION_TEST(`args', `m4 args.m4') +REGRESSION_TEST(`args2', `m4 args2.m4') +REGRESSION_TEST(`comments', `m4 comments.m4') +REGRESSION_TEST(`esyscmd', `m4 esyscmd.m4') +REGRESSION_TEST(`eval', `m4 eval.m4') +REGRESSION_TEST(`ff_after_dnl', `uudecode -o /dev/stdout ff_after_dnl.m4.uu | m4') +REGRESSION_TEST(`gnueval', `m4 -g gnueval.m4') +REGRESSION_TEST(`gnuformat', `m4 -g gnuformat.m4') +REGRESSION_TEST(`gnupatterns', `m4 -g gnupatterns.m4') +REGRESSION_TEST(`gnupatterns2', `m4 -g gnupatterns2.m4') +REGRESSION_TEST(`gnuprefix', `m4 -P gnuprefix.m4 2>&1') +REGRESSION_TEST(`gnusofterror', `m4 -g gnusofterror.m4') +REGRESSION_TEST(`gnutranslit2', `m4 -g translit2.m4') +REGRESSION_TEST(`includes', `m4 -I. includes.m4') +REGRESSION_TEST(`m4wrap3', `m4 m4wrap3.m4') +REGRESSION_TEST(`patterns', `m4 patterns.m4') +REGRESSION_TEST(`quotes', `m4 quotes.m4 2>&1') +REGRESSION_TEST(`strangequotes', `uudecode -o /dev/stdout strangequotes.m4.uu | m4') +REGRESSION_TEST(`redef', `m4 redef.m4') +REGRESSION_TEST(`translit', `m4 translit.m4') +REGRESSION_TEST(`translit2', `m4 translit2.m4') REGRESSION_END() diff --git a/tools/regression/usr.bin/m4/regress.strangequotes.out b/tools/regression/usr.bin/m4/regress.strangequotes.out new file mode 100644 index 00000000000..f19297b5829 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.strangequotes.out @@ -0,0 +1 @@ +4 to 5 diff --git a/tools/regression/usr.bin/m4/regress.translit.out b/tools/regression/usr.bin/m4/regress.translit.out new file mode 100644 index 00000000000..54abdd3a6d0 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.translit.out @@ -0,0 +1 @@ +onkp diff --git a/tools/regression/usr.bin/m4/regress.translit2.out b/tools/regression/usr.bin/m4/regress.translit2.out new file mode 100644 index 00000000000..5c561770fa4 --- /dev/null +++ b/tools/regression/usr.bin/m4/regress.translit2.out @@ -0,0 +1,6 @@ +[HAVE_abc def h/] +[HAVE_abc~def~h/] +ABCDEFGHIJ +A12345678J +ABC-0980-ZYX +Abc-0980-Zyx diff --git a/tools/regression/usr.bin/m4/strangequotes.m4.uu b/tools/regression/usr.bin/m4/strangequotes.m4.uu new file mode 100644 index 00000000000..e3d840fb85a --- /dev/null +++ b/tools/regression/usr.bin/m4/strangequotes.m4.uu @@ -0,0 +1,8 @@ +$FreeBSD$ +$OpenBSD: src/regress/usr.bin/m4/strangequotes.m4.uu,v 1.2 2001/09/19 19:15:08 espie Exp $ + +begin 644 strangequotes.m4 +M8VAA;F=E<75O=&4HJRR[*61N;`ID969I;F4HJT&[+""K)#$@=&\@)#*[*61N +*;`I!*#0L(#4I"F4H +` +end diff --git a/tools/regression/usr.bin/m4/translit.m4 b/tools/regression/usr.bin/m4/translit.m4 new file mode 100644 index 00000000000..19af2e1fcce --- /dev/null +++ b/tools/regression/usr.bin/m4/translit.m4 @@ -0,0 +1,4 @@ +dnl $FreeBSD$ +dnl $OpenBSD: src/regress/usr.bin/m4/translit.m4,v 1.1 2010/03/23 20:11:52 espie Exp $ +dnl first one should match, not second one +translit(`onk*', `**', `p_') diff --git a/tools/regression/usr.bin/m4/translit2.m4 b/tools/regression/usr.bin/m4/translit2.m4 new file mode 100644 index 00000000000..ec26c084057 --- /dev/null +++ b/tools/regression/usr.bin/m4/translit2.m4 @@ -0,0 +1,9 @@ +dnl $FreeBSD$ +translit(`[HAVE_abc/def.h +]', ` +/.', `/ ') +translit(`[HAVE_abc/def.h=]', `=/.', `/~~') +translit(`0123456789', `0123456789', `ABCDEFGHIJ') +translit(`0123456789', `[0-9]', `[A-J]') +translit(`abc-0980-zyx', `abcdefghijklmnopqrstuvwxyz', `ABCDEFGHIJKLMNOPQRSTUVWXYZ') +translit(`abc-0980-zyx', `[a-z]', `[A-Z]') diff --git a/tools/regression/usr.bin/make/all.sh b/tools/regression/usr.bin/make/all.sh old mode 100644 new mode 100755 diff --git a/tools/regression/usr.bin/make/common.sh b/tools/regression/usr.bin/make/common.sh index e685ea1197a..f38467f2310 100644 --- a/tools/regression/usr.bin/make/common.sh +++ b/tools/regression/usr.bin/make/common.sh @@ -239,8 +239,10 @@ eval_clean() if [ -n "${TEST_CLEANUP}" ] ; then . ${SRC_DIR}/cleanup fi - rm -rf ${WORK_DIR} - rm -rf ${OUTPUT_DIR} + if [ -z "${NO_TEST_CLEANUP}" ] ; then + rm -rf ${WORK_DIR} + rm -rf ${OUTPUT_DIR} + fi } # diff --git a/tools/regression/usr.bin/make/syntax/funny-targets/Makefile b/tools/regression/usr.bin/make/syntax/funny-targets/Makefile new file mode 100644 index 00000000000..064ab3a9435 --- /dev/null +++ b/tools/regression/usr.bin/make/syntax/funny-targets/Makefile @@ -0,0 +1,14 @@ +# $FreeBSD$ +# +# PR bin/6612 / GRN r102178 +# + +test1: colons::colons::target + +colons::colons::target: + @echo '${.TARGET}' + +test2: exclamation!target + +exclamation!target: + @echo '${.TARGET} diff --git a/tools/regression/usr.bin/make/syntax/funny-targets/expected.status.1 b/tools/regression/usr.bin/make/syntax/funny-targets/expected.status.1 new file mode 100644 index 00000000000..573541ac970 --- /dev/null +++ b/tools/regression/usr.bin/make/syntax/funny-targets/expected.status.1 @@ -0,0 +1 @@ +0 diff --git a/tools/regression/usr.bin/make/syntax/funny-targets/expected.status.2 b/tools/regression/usr.bin/make/syntax/funny-targets/expected.status.2 new file mode 100644 index 00000000000..573541ac970 --- /dev/null +++ b/tools/regression/usr.bin/make/syntax/funny-targets/expected.status.2 @@ -0,0 +1 @@ +0 diff --git a/tools/regression/usr.bin/make/syntax/funny-targets/expected.stderr.1 b/tools/regression/usr.bin/make/syntax/funny-targets/expected.stderr.1 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/regression/usr.bin/make/syntax/funny-targets/expected.stderr.2 b/tools/regression/usr.bin/make/syntax/funny-targets/expected.stderr.2 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/regression/usr.bin/make/syntax/funny-targets/expected.stdout.1 b/tools/regression/usr.bin/make/syntax/funny-targets/expected.stdout.1 new file mode 100644 index 00000000000..09cb2328e9f --- /dev/null +++ b/tools/regression/usr.bin/make/syntax/funny-targets/expected.stdout.1 @@ -0,0 +1 @@ +colons::colons::target diff --git a/tools/regression/usr.bin/make/syntax/funny-targets/expected.stdout.2 b/tools/regression/usr.bin/make/syntax/funny-targets/expected.stdout.2 new file mode 100644 index 00000000000..b2f03648b48 --- /dev/null +++ b/tools/regression/usr.bin/make/syntax/funny-targets/expected.stdout.2 @@ -0,0 +1 @@ +exclamation!target diff --git a/tools/regression/usr.bin/make/syntax/funny-targets/test.t b/tools/regression/usr.bin/make/syntax/funny-targets/test.t new file mode 100644 index 00000000000..ec7e75c7a3a --- /dev/null +++ b/tools/regression/usr.bin/make/syntax/funny-targets/test.t @@ -0,0 +1,14 @@ +#!/bin/sh + +# $FreeBSD$ + +cd `dirname $0` +. ../../common.sh + +# Description +DESC='Target names with "funny" embeded characters.' + +# Run +TEST_N=2 + +eval_cmd $* diff --git a/tools/regression/usr.bin/make/test-new.mk b/tools/regression/usr.bin/make/test-new.mk new file mode 100644 index 00000000000..f200833f81f --- /dev/null +++ b/tools/regression/usr.bin/make/test-new.mk @@ -0,0 +1,9 @@ +# $FreeBSD$ + +NEW_DIR!= make -C ${.CURDIR}/../../../../usr.bin/make -V .OBJDIR + +all: + rm -rf /tmp/${USER}.make.test + env MAKE_PROG=${NEW_DIR}/make ${.SHELL} ./all.sh + +.include diff --git a/tools/regression/usr.bin/make/variables/modifier_t/Makefile b/tools/regression/usr.bin/make/variables/modifier_t/Makefile new file mode 100644 index 00000000000..53844eecf57 --- /dev/null +++ b/tools/regression/usr.bin/make/variables/modifier_t/Makefile @@ -0,0 +1,15 @@ +# $FreeBSD$ +# +# Test the t modifier. +# +# below is missing ' +ASCII= !"\#$$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ + +test1: + @echo '${ASCII}' + +test2: + @echo '${ASCII:tl}' + +test3: + @echo '${ASCII:tu}' diff --git a/tools/regression/usr.bin/make/variables/modifier_t/expected.status.1 b/tools/regression/usr.bin/make/variables/modifier_t/expected.status.1 new file mode 100644 index 00000000000..573541ac970 --- /dev/null +++ b/tools/regression/usr.bin/make/variables/modifier_t/expected.status.1 @@ -0,0 +1 @@ +0 diff --git a/tools/regression/usr.bin/make/variables/modifier_t/expected.status.2 b/tools/regression/usr.bin/make/variables/modifier_t/expected.status.2 new file mode 100644 index 00000000000..573541ac970 --- /dev/null +++ b/tools/regression/usr.bin/make/variables/modifier_t/expected.status.2 @@ -0,0 +1 @@ +0 diff --git a/tools/regression/usr.bin/make/variables/modifier_t/expected.status.3 b/tools/regression/usr.bin/make/variables/modifier_t/expected.status.3 new file mode 100644 index 00000000000..573541ac970 --- /dev/null +++ b/tools/regression/usr.bin/make/variables/modifier_t/expected.status.3 @@ -0,0 +1 @@ +0 diff --git a/tools/regression/usr.bin/make/variables/modifier_t/expected.stderr.1 b/tools/regression/usr.bin/make/variables/modifier_t/expected.stderr.1 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/regression/usr.bin/make/variables/modifier_t/expected.stderr.2 b/tools/regression/usr.bin/make/variables/modifier_t/expected.stderr.2 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/regression/usr.bin/make/variables/modifier_t/expected.stderr.3 b/tools/regression/usr.bin/make/variables/modifier_t/expected.stderr.3 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/regression/usr.bin/make/variables/modifier_t/expected.stdout.1 b/tools/regression/usr.bin/make/variables/modifier_t/expected.stdout.1 new file mode 100644 index 00000000000..dff38fdd07f --- /dev/null +++ b/tools/regression/usr.bin/make/variables/modifier_t/expected.stdout.1 @@ -0,0 +1 @@ +!"#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ diff --git a/tools/regression/usr.bin/make/variables/modifier_t/expected.stdout.2 b/tools/regression/usr.bin/make/variables/modifier_t/expected.stdout.2 new file mode 100644 index 00000000000..71a0f6077ef --- /dev/null +++ b/tools/regression/usr.bin/make/variables/modifier_t/expected.stdout.2 @@ -0,0 +1 @@ +!"#$%&()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ diff --git a/tools/regression/usr.bin/make/variables/modifier_t/expected.stdout.3 b/tools/regression/usr.bin/make/variables/modifier_t/expected.stdout.3 new file mode 100644 index 00000000000..6434c7ba743 --- /dev/null +++ b/tools/regression/usr.bin/make/variables/modifier_t/expected.stdout.3 @@ -0,0 +1 @@ +!"#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~ diff --git a/tools/regression/usr.bin/make/variables/modifier_t/test.t b/tools/regression/usr.bin/make/variables/modifier_t/test.t new file mode 100644 index 00000000000..f564f6ea991 --- /dev/null +++ b/tools/regression/usr.bin/make/variables/modifier_t/test.t @@ -0,0 +1,14 @@ +#!/bin/sh + +# $FreeBSD$ + +cd `dirname $0` +. ../../common.sh + +# Description +DESC="Variable expansion with t modifiers" + +# Run +TEST_N=3 + +eval_cmd $* diff --git a/tools/regression/usr.bin/make/variables/opt_V/Makefile b/tools/regression/usr.bin/make/variables/opt_V/Makefile new file mode 100644 index 00000000000..128e5118bc4 --- /dev/null +++ b/tools/regression/usr.bin/make/variables/opt_V/Makefile @@ -0,0 +1,15 @@ +# $FreeBSD$ +# +# Test the -V option +# + +FOO= foo +FOOBAR= ${FOO}bar + +test1: + @echo "-V FOOBAR" + @${MAKE} -V FOOBAR + +test2: + @echo '-V "$${FOOBAR}"' + @${MAKE} -V '$${FOOBAR}' diff --git a/tools/regression/usr.bin/make/variables/opt_V/expected.status.1 b/tools/regression/usr.bin/make/variables/opt_V/expected.status.1 new file mode 100644 index 00000000000..573541ac970 --- /dev/null +++ b/tools/regression/usr.bin/make/variables/opt_V/expected.status.1 @@ -0,0 +1 @@ +0 diff --git a/tools/regression/usr.bin/make/variables/opt_V/expected.status.2 b/tools/regression/usr.bin/make/variables/opt_V/expected.status.2 new file mode 100644 index 00000000000..573541ac970 --- /dev/null +++ b/tools/regression/usr.bin/make/variables/opt_V/expected.status.2 @@ -0,0 +1 @@ +0 diff --git a/tools/regression/usr.bin/make/variables/opt_V/expected.stderr.1 b/tools/regression/usr.bin/make/variables/opt_V/expected.stderr.1 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/regression/usr.bin/make/variables/opt_V/expected.stderr.2 b/tools/regression/usr.bin/make/variables/opt_V/expected.stderr.2 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/regression/usr.bin/make/variables/opt_V/expected.stdout.1 b/tools/regression/usr.bin/make/variables/opt_V/expected.stdout.1 new file mode 100644 index 00000000000..050db40eed2 --- /dev/null +++ b/tools/regression/usr.bin/make/variables/opt_V/expected.stdout.1 @@ -0,0 +1,2 @@ +-V FOOBAR +foobar diff --git a/tools/regression/usr.bin/make/variables/opt_V/expected.stdout.2 b/tools/regression/usr.bin/make/variables/opt_V/expected.stdout.2 new file mode 100644 index 00000000000..4da2aeffad3 --- /dev/null +++ b/tools/regression/usr.bin/make/variables/opt_V/expected.stdout.2 @@ -0,0 +1,2 @@ +-V "${FOOBAR}" +foobar diff --git a/tools/regression/usr.bin/make/variables/opt_V/test.t b/tools/regression/usr.bin/make/variables/opt_V/test.t new file mode 100644 index 00000000000..32a74b6c4a9 --- /dev/null +++ b/tools/regression/usr.bin/make/variables/opt_V/test.t @@ -0,0 +1,14 @@ +#!/bin/sh + +# $FreeBSD$ + +cd `dirname $0` +. ../../common.sh + +# Description +DESC="Variable expansion using command line '-V'" + +# Run +TEST_N=2 + +eval_cmd $* diff --git a/tools/regression/usr.bin/yacc/Makefile b/tools/regression/usr.bin/yacc/Makefile new file mode 100644 index 00000000000..b937d41a4e4 --- /dev/null +++ b/tools/regression/usr.bin/yacc/Makefile @@ -0,0 +1,4 @@ +# $FreeBSD$ + +all: + @m4 ${.CURDIR}/../regress.m4 ${.CURDIR}/regress.sh | sh /dev/stdin ${.CURDIR} diff --git a/tools/regression/usr.bin/yacc/calc.y b/tools/regression/usr.bin/yacc/calc.y new file mode 100644 index 00000000000..c2e5a898c93 --- /dev/null +++ b/tools/regression/usr.bin/yacc/calc.y @@ -0,0 +1,106 @@ +%{ +# include +# include + +int regs[26]; +int base; + +extern int yylex(void); +static void yyerror(const char *s); + +%} + +%start list + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr '+' expr + { $$ = $1 + $3; } + | expr '-' expr + { $$ = $1 - $3; } + | expr '*' expr + { $$ = $1 * $3; } + | expr '/' expr + { $$ = $1 / $3; } + | expr '%' expr + { $$ = $1 % $3; } + | expr '&' expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | '-' expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/tools/regression/usr.bin/yacc/calc1.y b/tools/regression/usr.bin/yacc/calc1.y new file mode 100644 index 00000000000..ec89736f47a --- /dev/null +++ b/tools/regression/usr.bin/yacc/calc1.y @@ -0,0 +1,305 @@ +%{ + +/* http://dinosaur.compilertools.net/yacc/index.html */ + +#include +#include +#include +#include + +typedef struct interval +{ + double lo, hi; +} +INTERVAL; + +INTERVAL vmul(double, double, INTERVAL); +INTERVAL vdiv(double, double, INTERVAL); + +extern int yylex(void); +static void yyerror(const char *s); + +int dcheck(INTERVAL); + +double dreg[26]; +INTERVAL vreg[26]; + +%} +%expect 18 + +%start line +%union +{ + int ival; + double dval; + INTERVAL vval; +} + +%token DREG VREG /* indices into dreg, vreg arrays */ +%token CONST /* floating point constant */ + +%type dexp /* expression */ +%type vexp /* interval expression */ + + /* precedence information about the operators */ + +%left '+' '-' +%left '*' '/' +%left UMINUS /* precedence for unary minus */ + +%% /* beginning of rules section */ + +lines : /* empty */ + | lines line + ; + +line : dexp '\n' + { + (void) printf("%15.8f\n", $1); + } + | vexp '\n' + { + (void) printf("(%15.8f, %15.8f)\n", $1.lo, $1.hi); + } + | DREG '=' dexp '\n' + { + dreg[$1] = $3; + } + | VREG '=' vexp '\n' + { + vreg[$1] = $3; + } + | error '\n' + { + yyerrok; + } + ; + +dexp : CONST + | DREG + { + $$ = dreg[$1]; + } + | dexp '+' dexp + { + $$ = $1 + $3; + } + | dexp '-' dexp + { + $$ = $1 - $3; + } + | dexp '*' dexp + { + $$ = $1 * $3; + } + | dexp '/' dexp + { + $$ = $1 / $3; + } + | '-' dexp %prec UMINUS + { + $$ = -$2; + } + | '(' dexp ')' + { + $$ = $2; + } + ; + +vexp : dexp + { + $$.hi = $$.lo = $1; + } + | '(' dexp ',' dexp ')' + { + $$.lo = $2; + $$.hi = $4; + if ( $$.lo > $$.hi ) + { + (void) printf("interval out of order\n"); + YYERROR; + } + } + | VREG + { + $$ = vreg[$1]; + } + | vexp '+' vexp + { + $$.hi = $1.hi + $3.hi; + $$.lo = $1.lo + $3.lo; + } + | dexp '+' vexp + { + $$.hi = $1 + $3.hi; + $$.lo = $1 + $3.lo; + } + | vexp '-' vexp + { + $$.hi = $1.hi - $3.lo; + $$.lo = $1.lo - $3.hi; + } + | dexp '-' vexp + { + $$.hi = $1 - $3.lo; + $$.lo = $1 - $3.hi; + } + | vexp '*' vexp + { + $$ = vmul( $1.lo, $1.hi, $3 ); + } + | dexp '*' vexp + { + $$ = vmul ($1, $1, $3 ); + } + | vexp '/' vexp + { + if (dcheck($3)) YYERROR; + $$ = vdiv ( $1.lo, $1.hi, $3 ); + } + | dexp '/' vexp + { + if (dcheck ( $3 )) YYERROR; + $$ = vdiv ($1, $1, $3 ); + } + | '-' vexp %prec UMINUS + { + $$.hi = -$2.lo; + $$.lo = -$2.hi; + } + | '(' vexp ')' + { + $$ = $2; + } + ; + +%% /* beginning of subroutines section */ + +#define BSZ 50 /* buffer size for floating point numbers */ + + /* lexical analysis */ + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) +{ + int c; + + while ((c = getchar()) == ' ') + { /* skip over blanks */ + } + + if (isupper(c)) + { + yylval.ival = c - 'A'; + return (VREG); + } + if (islower(c)) + { + yylval.ival = c - 'a'; + return (DREG); + } + + if (isdigit(c) || c == '.') + { + /* gobble up digits, points, exponents */ + char buf[BSZ + 1], *cp = buf; + int dot = 0, expr = 0; + + for (; (cp - buf) < BSZ; ++cp, c = getchar()) + { + + *cp = c; + if (isdigit(c)) + continue; + if (c == '.') + { + if (dot++ || expr) + return ('.'); /* will cause syntax error */ + continue; + } + + if (c == 'e') + { + if (expr++) + return ('e'); /* will cause syntax error */ + continue; + } + + /* end of number */ + break; + } + *cp = '\0'; + + if ((cp - buf) >= BSZ) + printf("constant too long: truncated\n"); + else + ungetc(c, stdin); /* push back last char read */ + yylval.dval = atof(buf); + return (CONST); + } + return (c); +} + +static INTERVAL +hilo(double a, double b, double c, double d) +{ + /* returns the smallest interval containing a, b, c, and d */ + /* used by *, / routines */ + INTERVAL v; + + if (a > b) + { + v.hi = a; + v.lo = b; + } + else + { + v.hi = b; + v.lo = a; + } + + if (c > d) + { + if (c > v.hi) + v.hi = c; + if (d < v.lo) + v.lo = d; + } + else + { + if (d > v.hi) + v.hi = d; + if (c < v.lo) + v.lo = c; + } + return (v); +} + +INTERVAL +vmul(double a, double b, INTERVAL v) +{ + return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo)); +} + +int +dcheck(INTERVAL v) +{ + if (v.hi >= 0. && v.lo <= 0.) + { + printf("divisor interval contains 0.\n"); + return (1); + } + return (0); +} + +INTERVAL +vdiv(double a, double b, INTERVAL v) +{ + return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo)); +} diff --git a/tools/regression/usr.bin/yacc/calc2.y b/tools/regression/usr.bin/yacc/calc2.y new file mode 100644 index 00000000000..e742ff34c21 --- /dev/null +++ b/tools/regression/usr.bin/yacc/calc2.y @@ -0,0 +1,120 @@ +%parse-param { int regs[26] } +%parse-param { int *base } + +%lex-param { int *base } + +%{ +# include +# include + +#ifdef YYBISON +#define YYLEX_PARAM base +#define YYLEX_DECL() yylex(int *YYLEX_PARAM) +#define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +%} + +%start list + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr '+' expr + { $$ = $1 + $3; } + | expr '-' expr + { $$ = $1 - $3; } + | expr '*' expr + { $$ = $1 * $3; } + | expr '/' expr + { $$ = $1 / $3; } + | expr '%' expr + { $$ = $1 % $3; } + | expr '&' expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | '-' expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; (*base) = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = (*base) * $1 + $2; } + ; + +%% /* start of programs */ + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main (void) +{ + int regs[26]; + int base = 10; + + while(!feof(stdin)) { + yyparse(regs, &base); + } + return 0; +} + +static void +YYERROR_DECL() +{ + fprintf(stderr, "%s\n", s); +} + +int +YYLEX_DECL() +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = (c - '0') % (*base); + return ( DIGIT ); + } + return( c ); +} diff --git a/tools/regression/usr.bin/yacc/calc3.y b/tools/regression/usr.bin/yacc/calc3.y new file mode 100644 index 00000000000..252faa961f4 --- /dev/null +++ b/tools/regression/usr.bin/yacc/calc3.y @@ -0,0 +1,123 @@ +%pure-parser + +%parse-param { int regs[26] } +%parse-param { int *base } + +%lex-param { int *base } + +%{ +# include +# include + +#ifdef YYBISON +#define YYSTYPE int +#define YYLEX_PARAM base +#define YYLEX_DECL() yylex(YYSTYPE *yylval, int *YYLEX_PARAM) +#define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +%} + +%start list + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr '+' expr + { $$ = $1 + $3; } + | expr '-' expr + { $$ = $1 - $3; } + | expr '*' expr + { $$ = $1 * $3; } + | expr '/' expr + { $$ = $1 / $3; } + | expr '%' expr + { $$ = $1 % $3; } + | expr '&' expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | '-' expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; (*base) = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = (*base) * $1 + $2; } + ; + +%% /* start of programs */ + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main (void) +{ + int regs[26]; + int base = 10; + + while(!feof(stdin)) { + yyparse(regs, &base); + } + return 0; +} + +static void +YYERROR_DECL() +{ + fprintf(stderr, "%s\n", s); +} + +int +YYLEX_DECL() +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + *yylval = (c - 'a'); + return ( LETTER ); + } + if( isdigit( c )) { + *yylval = (c - '0') % (*base); + return ( DIGIT ); + } + return( c ); +} diff --git a/tools/regression/usr.bin/yacc/code_calc.y b/tools/regression/usr.bin/yacc/code_calc.y new file mode 100644 index 00000000000..0a99456e7f8 --- /dev/null +++ b/tools/regression/usr.bin/yacc/code_calc.y @@ -0,0 +1,112 @@ +%{ +# include +# include + +int regs[26]; +int base; + +#ifdef YYBISON +int yylex(void); +static void yyerror(const char *s); +#endif + +%} + +%start list + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr '+' expr + { $$ = $1 + $3; } + | expr '-' expr + { $$ = $1 - $3; } + | expr '*' expr + { $$ = $1 * $3; } + | expr '/' expr + { $$ = $1 / $3; } + | expr '%' expr + { $$ = $1 % $3; } + | expr '&' expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | '-' expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/tools/regression/usr.bin/yacc/code_error.y b/tools/regression/usr.bin/yacc/code_error.y new file mode 100644 index 00000000000..bb771567606 --- /dev/null +++ b/tools/regression/usr.bin/yacc/code_error.y @@ -0,0 +1,36 @@ +%{ + +#ifdef YYBISON +int yylex(void); +static void yyerror(const char *); +#endif + +%} +%% +S: error +%% + +#include + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main(void) +{ + printf("yyparse() = %d\n", yyparse()); + return 0; +} + +int +yylex(void) +{ + return -1; +} + +static void +yyerror(const char* s) +{ + printf("%s\n", s); +} diff --git a/tools/regression/usr.bin/yacc/error.y b/tools/regression/usr.bin/yacc/error.y new file mode 100644 index 00000000000..673c68d68e9 --- /dev/null +++ b/tools/regression/usr.bin/yacc/error.y @@ -0,0 +1,28 @@ +%{ +int yylex(void); +static void yyerror(const char *); +%} +%% +S: error +%% + +#include + +int +main(void) +{ + printf("yyparse() = %d\n", yyparse()); + return 0; +} + +int +yylex(void) +{ + return -1; +} + +static void +yyerror(const char* s) +{ + printf("%s\n", s); +} diff --git a/tools/regression/usr.bin/yacc/ftp.y b/tools/regression/usr.bin/yacc/ftp.y new file mode 100644 index 00000000000..42c210bf4ef --- /dev/null +++ b/tools/regression/usr.bin/yacc/ftp.y @@ -0,0 +1,1228 @@ +/* + * Copyright (c) 1985, 1988 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * @(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89 + */ + +/* + * Grammar for FTP commands. + * See RFC 959. + */ + +%{ + +/* sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89"; */ + +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef YYBISON +int yylex(void); +static void yyerror(const char *); +#endif + +extern struct sockaddr_in data_dest; +extern int logged_in; +extern struct passwd *pw; +extern int guest; +extern int logging; +extern int type; +extern int form; +extern int debug; +extern int timeout; +extern int maxtimeout; +extern int pdata; +extern char hostname[], remotehost[]; +extern char proctitle[]; +extern char *globerr; +extern int usedefault; +extern int transflag; +extern char tmpline[]; + +extern char **glob(char *); +extern char *renamefrom(char *); +extern void cwd(const char *); + +extern void dologout(int); +extern void fatal(const char *); +extern void makedir(const char *); +extern void nack(const char *); +extern void pass(const char *); +extern void passive(void); +extern void pwd(void); +extern void removedir(char *); +extern void renamecmd(char *, char *); +extern void retrieve(const char *, const char *); +extern void send_file_list(const char *); +extern void statcmd(void); +extern void statfilecmd(const char *); +extern void store(char *, const char *, int); +extern void user(const char *); + +extern void perror_reply(int, const char *, ...); +extern void reply(int, const char *, ...); +extern void lreply(int, const char *, ...); + +static int cmd_type; +static int cmd_form; +static int cmd_bytesz; +char cbuf[512]; +char *fromname; + +struct tab { + const char *name; + short token; + short state; + short implemented; /* 1 if command is implemented */ + const char *help; +}; + +static char * copy(const char *); + +#ifdef YYBISON +static void sizecmd(char *filename); +static void help(struct tab *ctab, char *s); +struct tab cmdtab[]; +struct tab sitetab[]; +#endif + +static void +yyerror(const char *msg) +{ + perror(msg); +} +%} + +%token + A B C E F I + L N P R S T + + SP CRLF COMMA STRING NUMBER + + USER PASS ACCT REIN QUIT PORT + PASV TYPE STRU MODE RETR STOR + APPE MLFL MAIL MSND MSOM MSAM + MRSQ MRCP ALLO REST RNFR RNTO + ABOR DELE CWD LIST NLST SITE + STAT HELP NOOP MKD RMD PWD + CDUP STOU SMNT SYST SIZE MDTM + + UMASK IDLE CHMOD + + LEXERR + +%start cmd_list + +%% + +cmd_list: /* empty */ + | cmd_list cmd + { + fromname = (char *) 0; + } + | cmd_list rcmd + ; + +cmd: USER SP username CRLF + { + user((char *) $3); + free((char *) $3); + } + | PASS SP password CRLF + { + pass((char *) $3); + free((char *) $3); + } + | PORT SP host_port CRLF + { + usedefault = 0; + if (pdata >= 0) { + (void) close(pdata); + pdata = -1; + } + reply(200, "PORT command successful."); + } + | PASV CRLF + { + passive(); + } + | TYPE SP type_code CRLF + { + switch (cmd_type) { + + case TYPE_A: + if (cmd_form == FORM_N) { + reply(200, "Type set to A."); + type = cmd_type; + form = cmd_form; + } else + reply(504, "Form must be N."); + break; + + case TYPE_E: + reply(504, "Type E not implemented."); + break; + + case TYPE_I: + reply(200, "Type set to I."); + type = cmd_type; + break; + + case TYPE_L: +#if NBBY == 8 + if (cmd_bytesz == 8) { + reply(200, + "Type set to L (byte size 8)."); + type = cmd_type; + } else + reply(504, "Byte size must be 8."); +#else /* NBBY == 8 */ + UNIMPLEMENTED for NBBY != 8 +#endif /* NBBY == 8 */ + } + } + | STRU SP struct_code CRLF + { + switch ($3) { + + case STRU_F: + reply(200, "STRU F ok."); + break; + + default: + reply(504, "Unimplemented STRU type."); + } + } + | MODE SP mode_code CRLF + { + switch ($3) { + + case MODE_S: + reply(200, "MODE S ok."); + break; + + default: + reply(502, "Unimplemented MODE type."); + } + } + | ALLO SP NUMBER CRLF + { + reply(202, "ALLO command ignored."); + } + | ALLO SP NUMBER SP R SP NUMBER CRLF + { + reply(202, "ALLO command ignored."); + } + | RETR check_login SP pathname CRLF + { + if ($2 && $4 != 0) + retrieve((char *) 0, (char *) $4); + if ($4 != 0) + free((char *) $4); + } + | STOR check_login SP pathname CRLF + { + if ($2 && $4 != 0) + store((char *) $4, "w", 0); + if ($4 != 0) + free((char *) $4); + } + | APPE check_login SP pathname CRLF + { + if ($2 && $4 != 0) + store((char *) $4, "a", 0); + if ($4 != 0) + free((char *) $4); + } + | NLST check_login CRLF + { + if ($2) + send_file_list("."); + } + | NLST check_login SP STRING CRLF + { + if ($2 && $4 != 0) + send_file_list((char *) $4); + if ($4 != 0) + free((char *) $4); + } + | LIST check_login CRLF + { + if ($2) + retrieve("/bin/ls -lgA", ""); + } + | LIST check_login SP pathname CRLF + { + if ($2 && $4 != 0) + retrieve("/bin/ls -lgA %s", (char *) $4); + if ($4 != 0) + free((char *) $4); + } + | STAT check_login SP pathname CRLF + { + if ($2 && $4 != 0) + statfilecmd((char *) $4); + if ($4 != 0) + free((char *) $4); + } + | STAT CRLF + { + statcmd(); + } + | DELE check_login SP pathname CRLF + { + if ($2 && $4 != 0) + remove((char *) $4); + if ($4 != 0) + free((char *) $4); + } + | RNTO SP pathname CRLF + { + if (fromname) { + renamecmd(fromname, (char *) $3); + free(fromname); + fromname = (char *) 0; + } else { + reply(503, "Bad sequence of commands."); + } + free((char *) $3); + } + | ABOR CRLF + { + reply(225, "ABOR command successful."); + } + | CWD check_login CRLF + { + if ($2) + cwd(pw->pw_dir); + } + | CWD check_login SP pathname CRLF + { + if ($2 && $4 != 0) + cwd((char *) $4); + if ($4 != 0) + free((char *) $4); + } + | HELP CRLF + { + help(cmdtab, (char *) 0); + } + | HELP SP STRING CRLF + { + register char *cp = (char *)$3; + + if (strncasecmp(cp, "SITE", 4) == 0) { + cp = (char *)$3 + 4; + if (*cp == ' ') + cp++; + if (*cp) + help(sitetab, cp); + else + help(sitetab, (char *) 0); + } else + help(cmdtab, (char *) $3); + } + | NOOP CRLF + { + reply(200, "NOOP command successful."); + } + | MKD check_login SP pathname CRLF + { + if ($2 && $4 != 0) + makedir((char *) $4); + if ($4 != 0) + free((char *) $4); + } + | RMD check_login SP pathname CRLF + { + if ($2 && $4 != 0) + removedir((char *) $4); + if ($4 != 0) + free((char *) $4); + } + | PWD check_login CRLF + { + if ($2) + pwd(); + } + | CDUP check_login CRLF + { + if ($2) + cwd(".."); + } + | SITE SP HELP CRLF + { + help(sitetab, (char *) 0); + } + | SITE SP HELP SP STRING CRLF + { + help(sitetab, (char *) $5); + } + | SITE SP UMASK check_login CRLF + { + int oldmask; + + if ($4) { + oldmask = umask(0); + (void) umask(oldmask); + reply(200, "Current UMASK is %03o", oldmask); + } + } + | SITE SP UMASK check_login SP octal_number CRLF + { + int oldmask; + + if ($4) { + if (($6 == -1) || ($6 > 0777)) { + reply(501, "Bad UMASK value"); + } else { + oldmask = umask($6); + reply(200, + "UMASK set to %03o (was %03o)", + $6, oldmask); + } + } + } + | SITE SP CHMOD check_login SP octal_number SP pathname CRLF + { + if ($4 && ($8 != 0)) { + if ($6 > 0777) + reply(501, + "CHMOD: Mode value must be between 0 and 0777"); + else if (chmod((char *) $8, $6) < 0) + perror_reply(550, (char *) $8); + else + reply(200, "CHMOD command successful."); + } + if ($8 != 0) + free((char *) $8); + } + | SITE SP IDLE CRLF + { + reply(200, + "Current IDLE time limit is %d seconds; max %d", + timeout, maxtimeout); + } + | SITE SP IDLE SP NUMBER CRLF + { + if ($5 < 30 || $5 > maxtimeout) { + reply(501, + "Maximum IDLE time must be between 30 and %d seconds", + maxtimeout); + } else { + timeout = $5; + (void) alarm((unsigned) timeout); + reply(200, + "Maximum IDLE time set to %d seconds", + timeout); + } + } + | STOU check_login SP pathname CRLF + { + if ($2 && $4 != 0) + store((char *) $4, "w", 1); + if ($4 != 0) + free((char *) $4); + } + | SYST CRLF + { +#ifdef unix +#ifdef BSD + reply(215, "UNIX Type: L%d Version: BSD-%d", + NBBY, BSD); +#else /* BSD */ + reply(215, "UNIX Type: L%d", NBBY); +#endif /* BSD */ +#else /* unix */ + reply(215, "UNKNOWN Type: L%d", NBBY); +#endif /* unix */ + } + + /* + * SIZE is not in RFC959, but Postel has blessed it and + * it will be in the updated RFC. + * + * Return size of file in a format suitable for + * using with RESTART (we just count bytes). + */ + | SIZE check_login SP pathname CRLF + { + if ($2 && $4 != 0) + sizecmd((char *) $4); + if ($4 != 0) + free((char *) $4); + } + + /* + * MDTM is not in RFC959, but Postel has blessed it and + * it will be in the updated RFC. + * + * Return modification time of file as an ISO 3307 + * style time. E.g. YYYYMMDDHHMMSS or YYYYMMDDHHMMSS.xxx + * where xxx is the fractional second (of any precision, + * not necessarily 3 digits) + */ + | MDTM check_login SP pathname CRLF + { + if ($2 && $4 != 0) { + struct stat stbuf; + if (stat((char *) $4, &stbuf) < 0) + perror_reply(550, "%s", (char *) $4); + else if ((stbuf.st_mode&S_IFMT) != S_IFREG) { + reply(550, "%s: not a plain file.", + (char *) $4); + } else { + register struct tm *t; + t = gmtime(&stbuf.st_mtime); + reply(213, + "%04d%02d%02d%02d%02d%02d", + 1900 + t->tm_year, + t->tm_mon+1, t->tm_mday, + t->tm_hour, t->tm_min, t->tm_sec); + } + } + if ($4 != 0) + free((char *) $4); + } + | QUIT CRLF + { + reply(221, "Goodbye."); + dologout(0); + } + | error CRLF + { + yyerrok; + } + ; +rcmd: RNFR check_login SP pathname CRLF + { + if ($2 && $4) { + fromname = renamefrom((char *) $4); + if (fromname == (char *) 0 && $4) { + free((char *) $4); + } + } + } + ; + +username: STRING + ; + +password: /* empty */ + { + *(const char **)(&($$)) = ""; + } + | STRING + ; + +byte_size: NUMBER + ; + +host_port: NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA + NUMBER COMMA NUMBER + { + register char *a, *p; + + a = (char *)&data_dest.sin_addr; + a[0] = $1; a[1] = $3; a[2] = $5; a[3] = $7; + p = (char *)&data_dest.sin_port; + p[0] = $9; p[1] = $11; + data_dest.sin_family = AF_INET; + } + ; + +form_code: N + { + $$ = FORM_N; + } + | T + { + $$ = FORM_T; + } + | C + { + $$ = FORM_C; + } + ; + +type_code: A + { + cmd_type = TYPE_A; + cmd_form = FORM_N; + } + | A SP form_code + { + cmd_type = TYPE_A; + cmd_form = $3; + } + | E + { + cmd_type = TYPE_E; + cmd_form = FORM_N; + } + | E SP form_code + { + cmd_type = TYPE_E; + cmd_form = $3; + } + | I + { + cmd_type = TYPE_I; + } + | L + { + cmd_type = TYPE_L; + cmd_bytesz = NBBY; + } + | L SP byte_size + { + cmd_type = TYPE_L; + cmd_bytesz = $3; + } + /* this is for a bug in the BBN ftp */ + | L byte_size + { + cmd_type = TYPE_L; + cmd_bytesz = $2; + } + ; + +struct_code: F + { + $$ = STRU_F; + } + | R + { + $$ = STRU_R; + } + | P + { + $$ = STRU_P; + } + ; + +mode_code: S + { + $$ = MODE_S; + } + | B + { + $$ = MODE_B; + } + | C + { + $$ = MODE_C; + } + ; + +pathname: pathstring + { + /* + * Problem: this production is used for all pathname + * processing, but only gives a 550 error reply. + * This is a valid reply in some cases but not in others. + */ + if (logged_in && $1 && strncmp((char *) $1, "~", 1) == 0) { + *(char **)&($$) = *glob((char *) $1); + if (globerr != 0) { + reply(550, globerr); + $$ = 0; + } + free((char *) $1); + } else + $$ = $1; + } + ; + +pathstring: STRING + ; + +octal_number: NUMBER + { + register int ret, dec, multby, digit; + + /* + * Convert a number that was read as decimal number + * to what it would be if it had been read as octal. + */ + dec = $1; + multby = 1; + ret = 0; + while (dec) { + digit = dec%10; + if (digit > 7) { + ret = -1; + break; + } + ret += digit * multby; + multby *= 8; + dec /= 10; + } + $$ = ret; + } + ; + +check_login: /* empty */ + { + if (logged_in) + $$ = 1; + else { + reply(530, "Please login with USER and PASS."); + $$ = 0; + } + } + ; + +%% + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +extern jmp_buf errcatch; + +static void upper(char *); + +#define CMD 0 /* beginning of command */ +#define ARGS 1 /* expect miscellaneous arguments */ +#define STR1 2 /* expect SP followed by STRING */ +#define STR2 3 /* expect STRING */ +#define OSTR 4 /* optional SP then STRING */ +#define ZSTR1 5 /* SP then optional STRING */ +#define ZSTR2 6 /* optional STRING after SP */ +#define SITECMD 7 /* SITE command */ +#define NSTR 8 /* Number followed by a string */ + +struct tab cmdtab[] = { /* In order defined in RFC 765 */ + { "USER", USER, STR1, 1, " username" }, + { "PASS", PASS, ZSTR1, 1, " password" }, + { "ACCT", ACCT, STR1, 0, "(specify account)" }, + { "SMNT", SMNT, ARGS, 0, "(structure mount)" }, + { "REIN", REIN, ARGS, 0, "(reinitialize server state)" }, + { "QUIT", QUIT, ARGS, 1, "(terminate service)", }, + { "PORT", PORT, ARGS, 1, " b0, b1, b2, b3, b4" }, + { "PASV", PASV, ARGS, 1, "(set server in passive mode)" }, + { "TYPE", TYPE, ARGS, 1, " [ A | E | I | L ]" }, + { "STRU", STRU, ARGS, 1, "(specify file structure)" }, + { "MODE", MODE, ARGS, 1, "(specify transfer mode)" }, + { "RETR", RETR, STR1, 1, " file-name" }, + { "STOR", STOR, STR1, 1, " file-name" }, + { "APPE", APPE, STR1, 1, " file-name" }, + { "MLFL", MLFL, OSTR, 0, "(mail file)" }, + { "MAIL", MAIL, OSTR, 0, "(mail to user)" }, + { "MSND", MSND, OSTR, 0, "(mail send to terminal)" }, + { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" }, + { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" }, + { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" }, + { "MRCP", MRCP, STR1, 0, "(mail recipient)" }, + { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" }, + { "REST", REST, ARGS, 0, "(restart command)" }, + { "RNFR", RNFR, STR1, 1, " file-name" }, + { "RNTO", RNTO, STR1, 1, " file-name" }, + { "ABOR", ABOR, ARGS, 1, "(abort operation)" }, + { "DELE", DELE, STR1, 1, " file-name" }, + { "CWD", CWD, OSTR, 1, "[ directory-name ]" }, + { "XCWD", CWD, OSTR, 1, "[ directory-name ]" }, + { "LIST", LIST, OSTR, 1, "[ path-name ]" }, + { "NLST", NLST, OSTR, 1, "[ path-name ]" }, + { "SITE", SITE, SITECMD, 1, "site-cmd [ arguments ]" }, + { "SYST", SYST, ARGS, 1, "(get type of operating system)" }, + { "STAT", STAT, OSTR, 1, "[ path-name ]" }, + { "HELP", HELP, OSTR, 1, "[ ]" }, + { "NOOP", NOOP, ARGS, 1, "" }, + { "MKD", MKD, STR1, 1, " path-name" }, + { "XMKD", MKD, STR1, 1, " path-name" }, + { "RMD", RMD, STR1, 1, " path-name" }, + { "XRMD", RMD, STR1, 1, " path-name" }, + { "PWD", PWD, ARGS, 1, "(return current directory)" }, + { "XPWD", PWD, ARGS, 1, "(return current directory)" }, + { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" }, + { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" }, + { "STOU", STOU, STR1, 1, " file-name" }, + { "SIZE", SIZE, OSTR, 1, " path-name" }, + { "MDTM", MDTM, OSTR, 1, " path-name" }, + { 0, 0, 0, 0, 0 } +}; + +struct tab sitetab[] = { + { "UMASK", UMASK, ARGS, 1, "[ umask ]" }, + { "IDLE", IDLE, ARGS, 1, "[ maximum-idle-time ]" }, + { "CHMOD", CHMOD, NSTR, 1, " mode file-name" }, + { "HELP", HELP, OSTR, 1, "[ ]" }, + { 0, 0, 0, 0, 0 } +}; + +static struct tab * +lookup(struct tab *p, char *cmd) +{ + + for (; p->name != 0; p++) + if (strcmp(cmd, p->name) == 0) + return (p); + return (0); +} + +#include + +/* + * get_line - a hacked up version of fgets to ignore TELNET escape codes. + */ +static char * +get_line(char *s, int n, FILE *iop) +{ + register int c; + register char *cs; + + cs = s; +/* tmpline may contain saved command from urgent mode interruption */ + for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) { + *cs++ = tmpline[c]; + if (tmpline[c] == '\n') { + *cs = '\0'; + if (debug) + syslog(LOG_DEBUG, "command: %s", s); + tmpline[0] = '\0'; + return(s); + } + if (c == 0) + tmpline[0] = '\0'; + } + while ((c = getc(iop)) != EOF) { + c &= 0377; + if (c == IAC) { + if ((c = getc(iop)) != EOF) { + c &= 0377; + switch (c) { + case WILL: + case WONT: + c = getc(iop); + printf("%c%c%c", IAC, DONT, 0377&c); + (void) fflush(stdout); + continue; + case DO: + case DONT: + c = getc(iop); + printf("%c%c%c", IAC, WONT, 0377&c); + (void) fflush(stdout); + continue; + case IAC: + break; + default: + continue; /* ignore command */ + } + } + } + *cs++ = c; + if (--n <= 0 || c == '\n') + break; + } + if (c == EOF && cs == s) + return (0); + *cs = '\0'; + if (debug) + syslog(LOG_DEBUG, "command: %s", s); + return (s); +} + +static void +toolong(int sig) +{ + time_t now; + + (void) sig; + reply(421, + "Timeout (%d seconds): closing control connection.", timeout); + (void) time(&now); + if (logging) { + syslog(LOG_INFO, + "User %s timed out after %d seconds at %s", + (pw ? pw -> pw_name : "unknown"), timeout, ctime(&now)); + } + dologout(1); +} + +int +yylex(void) +{ + static int cpos, state; + register char *cp, *cp2; + register struct tab *p; + int n; + char c; + + for (;;) { + switch (state) { + + case CMD: + (void) signal(SIGALRM, toolong); + (void) alarm((unsigned) timeout); + if (get_line(cbuf, sizeof(cbuf)-1, stdin) == 0) { + reply(221, "You could at least say goodbye."); + dologout(0); + } + (void) alarm(0); +#ifdef SETPROCTITLE + if (strncasecmp(cbuf, "PASS", 4) != 0) + setproctitle("%s: %s", proctitle, cbuf); +#endif /* SETPROCTITLE */ + if ((cp = strchr(cbuf, '\r'))) { + *cp++ = '\n'; + *cp = '\0'; + } + if ((cp = strpbrk(cbuf, " \n"))) + cpos = cp - cbuf; + if (cpos == 0) + cpos = 4; + c = cbuf[cpos]; + cbuf[cpos] = '\0'; + upper(cbuf); + p = lookup(cmdtab, cbuf); + cbuf[cpos] = c; + if (p != 0) { + if (p->implemented == 0) { + nack(p->name); + longjmp(errcatch,0); + /* NOTREACHED */ + } + state = p->state; + *(const char **)(&yylval) = p->name; + return (p->token); + } + break; + + case SITECMD: + if (cbuf[cpos] == ' ') { + cpos++; + return (SP); + } + cp = &cbuf[cpos]; + if ((cp2 = strpbrk(cp, " \n"))) + cpos = cp2 - cbuf; + c = cbuf[cpos]; + cbuf[cpos] = '\0'; + upper(cp); + p = lookup(sitetab, cp); + cbuf[cpos] = c; + if (p != 0) { + if (p->implemented == 0) { + state = CMD; + nack(p->name); + longjmp(errcatch,0); + /* NOTREACHED */ + } + state = p->state; + *(const char **)(&yylval) = p->name; + return (p->token); + } + state = CMD; + break; + + case OSTR: + if (cbuf[cpos] == '\n') { + state = CMD; + return (CRLF); + } + /* FALLTHROUGH */ + + case STR1: + case ZSTR1: + dostr1: + if (cbuf[cpos] == ' ') { + cpos++; + if (state == OSTR) + state = STR2; + else + ++state; + return (SP); + } + break; + + case ZSTR2: + if (cbuf[cpos] == '\n') { + state = CMD; + return (CRLF); + } + /* FALLTHROUGH */ + + case STR2: + cp = &cbuf[cpos]; + n = strlen(cp); + cpos += n - 1; + /* + * Make sure the string is nonempty and \n terminated. + */ + if (n > 1 && cbuf[cpos] == '\n') { + cbuf[cpos] = '\0'; + *(char **)&yylval = copy(cp); + cbuf[cpos] = '\n'; + state = ARGS; + return (STRING); + } + break; + + case NSTR: + if (cbuf[cpos] == ' ') { + cpos++; + return (SP); + } + if (isdigit(cbuf[cpos])) { + cp = &cbuf[cpos]; + while (isdigit(cbuf[++cpos])) + ; + c = cbuf[cpos]; + cbuf[cpos] = '\0'; + yylval = atoi(cp); + cbuf[cpos] = c; + state = STR1; + return (NUMBER); + } + state = STR1; + goto dostr1; + + case ARGS: + if (isdigit(cbuf[cpos])) { + cp = &cbuf[cpos]; + while (isdigit(cbuf[++cpos])) + ; + c = cbuf[cpos]; + cbuf[cpos] = '\0'; + yylval = atoi(cp); + cbuf[cpos] = c; + return (NUMBER); + } + switch (cbuf[cpos++]) { + + case '\n': + state = CMD; + return (CRLF); + + case ' ': + return (SP); + + case ',': + return (COMMA); + + case 'A': + case 'a': + return (A); + + case 'B': + case 'b': + return (B); + + case 'C': + case 'c': + return (C); + + case 'E': + case 'e': + return (E); + + case 'F': + case 'f': + return (F); + + case 'I': + case 'i': + return (I); + + case 'L': + case 'l': + return (L); + + case 'N': + case 'n': + return (N); + + case 'P': + case 'p': + return (P); + + case 'R': + case 'r': + return (R); + + case 'S': + case 's': + return (S); + + case 'T': + case 't': + return (T); + + } + break; + + default: + fatal("Unknown state in scanner."); + } + yyerror((char *) 0); + state = CMD; + longjmp(errcatch,0); + } +} + +static void +upper(char *s) +{ + while (*s != '\0') { + if (islower(*s)) + *s = toupper(*s); + s++; + } +} + +static char * +copy(const char *s) +{ + char *p; + + p = (char * )malloc(strlen(s) + 1); + if (p == 0) + fatal("Ran out of memory."); + else + (void) strcpy(p, s); + return (p); +} + +static void +help(struct tab *ctab, char *s) +{ + register struct tab *c; + register int width, NCMDS; + const char *help_type; + + if (ctab == sitetab) + help_type = "SITE "; + else + help_type = ""; + width = 0, NCMDS = 0; + for (c = ctab; c->name != 0; c++) { + int len = strlen(c->name); + + if (len > width) + width = len; + NCMDS++; + } + width = (width + 8) &~ 7; + if (s == 0) { + register int i, j, w; + int columns, lines; + + lreply(214, "The following %scommands are recognized %s.", + help_type, "(* =>'s unimplemented)"); + columns = 76 / width; + if (columns == 0) + columns = 1; + lines = (NCMDS + columns - 1) / columns; + for (i = 0; i < lines; i++) { + printf(" "); + for (j = 0; j < columns; j++) { + c = ctab + j * lines + i; + assert(c->name != 0); + printf("%s%c", c->name, + c->implemented ? ' ' : '*'); + if (c + lines >= &ctab[NCMDS]) + break; + w = strlen(c->name) + 1; + while (w < width) { + putchar(' '); + w++; + } + } + printf("\r\n"); + } + (void) fflush(stdout); + reply(214, "Direct comments to ftp-bugs@%s.", hostname); + return; + } + upper(s); + c = lookup(ctab, s); + if (c == (struct tab *)0) { + reply(502, "Unknown command %s.", s); + return; + } + if (c->implemented) + reply(214, "Syntax: %s%s %s", help_type, c->name, c->help); + else + reply(214, "%s%-*s\t%s; unimplemented.", help_type, width, + c->name, c->help); +} + +static void +sizecmd(char *filename) +{ + switch (type) { + case TYPE_L: + case TYPE_I: { + struct stat stbuf; + if (stat(filename, &stbuf) < 0 || + (stbuf.st_mode&S_IFMT) != S_IFREG) + reply(550, "%s: not a plain file.", filename); + else +#ifdef HAVE_LONG_LONG + reply(213, "%llu", (long long) stbuf.st_size); +#else + reply(213, "%lu", stbuf.st_size); +#endif + break;} + case TYPE_A: { + FILE *fin; + register int c, count; + struct stat stbuf; + fin = fopen(filename, "r"); + if (fin == 0) { + perror_reply(550, filename); + return; + } + if (fstat(fileno(fin), &stbuf) < 0 || + (stbuf.st_mode&S_IFMT) != S_IFREG) { + reply(550, "%s: not a plain file.", filename); + (void) fclose(fin); + return; + } + + count = 0; + while((c=getc(fin)) != EOF) { + if (c == '\n') /* will get expanded to \r\n */ + count++; + count++; + } + (void) fclose(fin); + + reply(213, "%ld", count); + break;} + default: + reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]); + } +} diff --git a/tools/regression/usr.bin/yacc/grammar.y b/tools/regression/usr.bin/yacc/grammar.y new file mode 100644 index 00000000000..67555226837 --- /dev/null +++ b/tools/regression/usr.bin/yacc/grammar.y @@ -0,0 +1,1183 @@ +/* $Id: grammar.y,v 1.5 2012/01/15 20:00:59 tom Exp $ + * + * yacc grammar for C function prototype generator + * This was derived from the grammar in Appendix A of + * "The C Programming Language" by Kernighan and Ritchie. + */ +%expect 1 +%{ +#ifdef YYBISON +#include +#define YYSTYPE_IS_DECLARED +#define yyerror yaccError +#endif + +#if defined(YYBISON) || !defined(YYBYACC) +static void yyerror(const char *s); +#endif +%} + +%token '(' '*' '&' + /* identifiers that are not reserved words */ + T_IDENTIFIER T_TYPEDEF_NAME T_DEFINE_NAME + + /* storage class */ + T_AUTO T_EXTERN T_REGISTER T_STATIC T_TYPEDEF + /* This keyword included for compatibility with C++. */ + T_INLINE + /* This keyword included for compatibility with GCC */ + T_EXTENSION + + /* type specifiers */ + T_CHAR T_DOUBLE T_FLOAT T_INT T_VOID + T_LONG T_SHORT T_SIGNED T_UNSIGNED + T_ENUM T_STRUCT T_UNION + /* C9X new types */ + T_Bool T_Complex T_Imaginary + + /* type qualifiers */ + T_TYPE_QUALIFIER + + /* paired square brackets and everything between them: [ ... ] */ + T_BRACKETS + +%token + /* left brace */ + T_LBRACE + /* all input to the matching right brace */ + T_MATCHRBRACE + + /* three periods */ + T_ELLIPSIS + + /* constant expression or paired braces following an equal sign */ + T_INITIALIZER + + /* string literal */ + T_STRING_LITERAL + + /* asm */ + T_ASM + /* ( "string literal" ) following asm keyword */ + T_ASMARG + + /* va_dcl from */ + T_VA_DCL + +%type decl_specifiers decl_specifier +%type storage_class type_specifier type_qualifier +%type struct_or_union_specifier enum_specifier +%type init_declarator_list +%type init_declarator declarator direct_declarator +%type abs_declarator direct_abs_declarator +%type parameter_type_list parameter_list +%type parameter_declaration +%type opt_identifier_list identifier_list +%type struct_or_union pointer opt_type_qualifiers type_qualifier_list + any_id identifier_or_ref +%type enumeration + +%{ +#include +#include +#include + +#define OPT_LINTLIBRARY 1 + +#ifndef TRUE +#define TRUE (1) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +/* #include "cproto.h" */ +#define MAX_TEXT_SIZE 1024 + +/* Prototype styles */ +#if OPT_LINTLIBRARY +#define PROTO_ANSI_LLIB -2 /* form ANSI lint-library source */ +#define PROTO_LINTLIBRARY -1 /* form lint-library source */ +#endif +#define PROTO_NONE 0 /* do not output any prototypes */ +#define PROTO_TRADITIONAL 1 /* comment out parameters */ +#define PROTO_ABSTRACT 2 /* comment out parameter names */ +#define PROTO_ANSI 3 /* ANSI C prototype */ + +typedef int PrototypeStyle; + +typedef char boolean; + +extern boolean types_out; +extern PrototypeStyle proto_style; + +#define ansiLintLibrary() (proto_style == PROTO_ANSI_LLIB) +#define knrLintLibrary() (proto_style == PROTO_LINTLIBRARY) +#define lintLibrary() (knrLintLibrary() || ansiLintLibrary()) + +#if OPT_LINTLIBRARY +#define FUNC_UNKNOWN -1 /* unspecified */ +#else +#define FUNC_UNKNOWN 0 /* unspecified (same as FUNC_NONE) */ +#endif +#define FUNC_NONE 0 /* not a function definition */ +#define FUNC_TRADITIONAL 1 /* traditional style */ +#define FUNC_ANSI 2 /* ANSI style */ +#define FUNC_BOTH 3 /* both styles */ + +typedef int FuncDefStyle; + +/* Source file text */ +typedef struct text { + char text[MAX_TEXT_SIZE]; /* source text */ + long begin; /* offset in temporary file */ +} Text; + +/* Declaration specifier flags */ +#define DS_NONE 0 /* default */ +#define DS_EXTERN 1 /* contains "extern" specifier */ +#define DS_STATIC 2 /* contains "static" specifier */ +#define DS_CHAR 4 /* contains "char" type specifier */ +#define DS_SHORT 8 /* contains "short" type specifier */ +#define DS_FLOAT 16 /* contains "float" type specifier */ +#define DS_INLINE 32 /* contains "inline" specifier */ +#define DS_JUNK 64 /* we're not interested in this declaration */ + +/* This structure stores information about a declaration specifier. */ +typedef struct decl_spec { + unsigned short flags; /* flags defined above */ + char *text; /* source text */ + long begin; /* offset in temporary file */ +} DeclSpec; + +/* This is a list of function parameters. */ +typedef struct _ParameterList { + struct parameter *first; /* pointer to first parameter in list */ + struct parameter *last; /* pointer to last parameter in list */ + long begin_comment; /* begin offset of comment */ + long end_comment; /* end offset of comment */ + char *comment; /* comment at start of parameter list */ +} ParameterList; + +/* This structure stores information about a declarator. */ +typedef struct _Declarator { + char *name; /* name of variable or function */ + char *text; /* source text */ + long begin; /* offset in temporary file */ + long begin_comment; /* begin offset of comment */ + long end_comment; /* end offset of comment */ + FuncDefStyle func_def; /* style of function definition */ + ParameterList params; /* function parameters */ + boolean pointer; /* TRUE if it declares a pointer */ + struct _Declarator *head; /* head function declarator */ + struct _Declarator *func_stack; /* stack of function declarators */ + struct _Declarator *next; /* next declarator in list */ +} Declarator; + +/* This structure stores information about a function parameter. */ +typedef struct parameter { + struct parameter *next; /* next parameter in list */ + DeclSpec decl_spec; + Declarator *declarator; + char *comment; /* comment following the parameter */ +} Parameter; + +/* This is a list of declarators. */ +typedef struct declarator_list { + Declarator *first; /* pointer to first declarator in list */ + Declarator *last; /* pointer to last declarator in list */ +} DeclaratorList; + +/* #include "symbol.h" */ +typedef struct symbol { + struct symbol *next; /* next symbol in list */ + char *name; /* name of symbol */ + char *value; /* value of symbol (for defines) */ + short flags; /* symbol attributes */ +} Symbol; + +/* parser stack entry type */ +typedef union { + Text text; + DeclSpec decl_spec; + Parameter *parameter; + ParameterList param_list; + Declarator *declarator; + DeclaratorList decl_list; +} YYSTYPE; + +/* The hash table length should be a prime number. */ +#define SYM_MAX_HASH 251 + +typedef struct symbol_table { + Symbol *bucket[SYM_MAX_HASH]; /* hash buckets */ +} SymbolTable; + +extern SymbolTable *new_symbol_table /* Create symbol table */ + (void); +extern void free_symbol_table /* Destroy symbol table */ + (SymbolTable *s); +extern Symbol *find_symbol /* Lookup symbol name */ + (SymbolTable *s, const char *n); +extern Symbol *new_symbol /* Define new symbol */ + (SymbolTable *s, const char *n, const char *v, int f); + +/* #include "semantic.h" */ +extern void new_decl_spec (DeclSpec *, const char *, long, int); +extern void free_decl_spec (DeclSpec *); +extern void join_decl_specs (DeclSpec *, DeclSpec *, DeclSpec *); +extern void check_untagged (DeclSpec *); +extern Declarator *new_declarator (const char *, const char *, long); +extern void free_declarator (Declarator *); +extern void new_decl_list (DeclaratorList *, Declarator *); +extern void free_decl_list (DeclaratorList *); +extern void add_decl_list (DeclaratorList *, DeclaratorList *, Declarator *); +extern Parameter *new_parameter (DeclSpec *, Declarator *); +extern void free_parameter (Parameter *); +extern void new_param_list (ParameterList *, Parameter *); +extern void free_param_list (ParameterList *); +extern void add_param_list (ParameterList *, ParameterList *, Parameter *); +extern void new_ident_list (ParameterList *); +extern void add_ident_list (ParameterList *, ParameterList *, const char *); +extern void set_param_types (ParameterList *, DeclSpec *, DeclaratorList *); +extern void gen_declarations (DeclSpec *, DeclaratorList *); +extern void gen_prototype (DeclSpec *, Declarator *); +extern void gen_func_declarator (Declarator *); +extern void gen_func_definition (DeclSpec *, Declarator *); + +extern void init_parser (void); +extern void process_file (FILE *infile, char *name); +extern char *cur_text (void); +extern char *cur_file_name (void); +extern char *implied_typedef (void); +extern void include_file (char *name, int convert); +extern char *supply_parm (int count); +extern char *xstrdup (const char *); +extern int already_declared (char *name); +extern int is_actual_func (Declarator *d); +extern int lint_ellipsis (Parameter *p); +extern int want_typedef (void); +extern void begin_tracking (void); +extern void begin_typedef (void); +extern void copy_typedef (char *s); +extern void ellipsis_varargs (Declarator *d); +extern void end_typedef (void); +extern void flush_varargs (void); +extern void fmt_library (int code); +extern void imply_typedef (const char *s); +extern void indent (FILE *outf); +extern void put_blankline (FILE *outf); +extern void put_body (FILE *outf, DeclSpec *decl_spec, Declarator *declarator); +extern void put_char (FILE *outf, int c); +extern void put_error (void); +extern void put_newline (FILE *outf); +extern void put_padded (FILE *outf, const char *s); +extern void put_string (FILE *outf, const char *s); +extern void track_in (void); + +extern boolean file_comments; +extern FuncDefStyle func_style; +extern char base_file[]; + +extern int yylex (void); + +/* declaration specifier attributes for the typedef statement currently being + * scanned + */ +static int cur_decl_spec_flags; + +/* pointer to parameter list for the current function definition */ +static ParameterList *func_params; + +/* A parser semantic action sets this pointer to the current declarator in + * a function parameter declaration in order to catch any comments following + * the parameter declaration on the same line. If the lexer scans a comment + * and is not NULL, then the comment is attached to the + * declarator. To ignore subsequent comments, the lexer sets this to NULL + * after scanning a comment or end of line. + */ +static Declarator *cur_declarator; + +/* temporary string buffer */ +static char buf[MAX_TEXT_SIZE]; + +/* table of typedef names */ +static SymbolTable *typedef_names; + +/* table of define names */ +static SymbolTable *define_names; + +/* table of type qualifiers */ +static SymbolTable *type_qualifiers; + +/* information about the current input file */ +typedef struct { + char *base_name; /* base input file name */ + char *file_name; /* current file name */ + FILE *file; /* input file */ + unsigned line_num; /* current line number in input file */ + FILE *tmp_file; /* temporary file */ + long begin_comment; /* tmp file offset after last written ) or ; */ + long end_comment; /* tmp file offset after last comment */ + boolean convert; /* if TRUE, convert function definitions */ + boolean changed; /* TRUE if conversion done in this file */ +} IncludeStack; + +static IncludeStack *cur_file; /* current input file */ + +/* #include "yyerror.c" */ + +static int haveAnsiParam (void); + + +/* Flags to enable us to find if a procedure returns a value. + */ +static int return_val; /* nonzero on BRACES iff return-expression found */ + +static const char * +dft_decl_spec (void) +{ + return (lintLibrary() && !return_val) ? "void" : "int"; +} + +static int +haveAnsiParam (void) +{ + Parameter *p; + if (func_params != 0) { + for (p = func_params->first; p != 0; p = p->next) { + if (p->declarator->func_def == FUNC_ANSI) { + return TRUE; + } + } + } + return FALSE; +} +%} +%% + +program + : /* empty */ + | translation_unit + ; + +translation_unit + : external_declaration + | translation_unit external_declaration + ; + +external_declaration + : declaration + | function_definition + | ';' + | linkage_specification + | T_ASM T_ASMARG ';' + | error T_MATCHRBRACE + { + yyerrok; + } + | error ';' + { + yyerrok; + } + ; + +braces + : T_LBRACE T_MATCHRBRACE + ; + +linkage_specification + : T_EXTERN T_STRING_LITERAL braces + { + /* Provide an empty action here so bison will not complain about + * incompatible types in the default action it normally would + * have generated. + */ + } + | T_EXTERN T_STRING_LITERAL declaration + { + /* empty */ + } + ; + +declaration + : decl_specifiers ';' + { +#if OPT_LINTLIBRARY + if (types_out && want_typedef()) { + gen_declarations(&$1, (DeclaratorList *)0); + flush_varargs(); + } +#endif + free_decl_spec(&$1); + end_typedef(); + } + | decl_specifiers init_declarator_list ';' + { + if (func_params != NULL) { + set_param_types(func_params, &$1, &$2); + } else { + gen_declarations(&$1, &$2); +#if OPT_LINTLIBRARY + flush_varargs(); +#endif + free_decl_list(&$2); + } + free_decl_spec(&$1); + end_typedef(); + } + | any_typedef decl_specifiers + { + cur_decl_spec_flags = $2.flags; + free_decl_spec(&$2); + } + opt_declarator_list ';' + { + end_typedef(); + } + ; + +any_typedef + : T_EXTENSION T_TYPEDEF + { + begin_typedef(); + } + | T_TYPEDEF + { + begin_typedef(); + } + ; + +opt_declarator_list + : /* empty */ + | declarator_list + ; + +declarator_list + : declarator + { + int flags = cur_decl_spec_flags; + + /* If the typedef is a pointer type, then reset the short type + * flags so it does not get promoted. + */ + if (strcmp($1->text, $1->name) != 0) + flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT); + new_symbol(typedef_names, $1->name, NULL, flags); + free_declarator($1); + } + | declarator_list ',' declarator + { + int flags = cur_decl_spec_flags; + + if (strcmp($3->text, $3->name) != 0) + flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT); + new_symbol(typedef_names, $3->name, NULL, flags); + free_declarator($3); + } + ; + +function_definition + : decl_specifiers declarator + { + check_untagged(&$1); + if ($2->func_def == FUNC_NONE) { + yyerror("syntax error"); + YYERROR; + } + func_params = &($2->head->params); + func_params->begin_comment = cur_file->begin_comment; + func_params->end_comment = cur_file->end_comment; + } + opt_declaration_list T_LBRACE + { + /* If we're converting to K&R and we've got a nominally K&R + * function which has a parameter which is ANSI (i.e., a prototyped + * function pointer), then we must override the deciphered value of + * 'func_def' so that the parameter will be converted. + */ + if (func_style == FUNC_TRADITIONAL + && haveAnsiParam() + && $2->head->func_def == func_style) { + $2->head->func_def = FUNC_BOTH; + } + + func_params = NULL; + + if (cur_file->convert) + gen_func_definition(&$1, $2); + gen_prototype(&$1, $2); +#if OPT_LINTLIBRARY + flush_varargs(); +#endif + free_decl_spec(&$1); + free_declarator($2); + } + T_MATCHRBRACE + | declarator + { + if ($1->func_def == FUNC_NONE) { + yyerror("syntax error"); + YYERROR; + } + func_params = &($1->head->params); + func_params->begin_comment = cur_file->begin_comment; + func_params->end_comment = cur_file->end_comment; + } + opt_declaration_list T_LBRACE T_MATCHRBRACE + { + DeclSpec decl_spec; + + func_params = NULL; + + new_decl_spec(&decl_spec, dft_decl_spec(), $1->begin, DS_NONE); + if (cur_file->convert) + gen_func_definition(&decl_spec, $1); + gen_prototype(&decl_spec, $1); +#if OPT_LINTLIBRARY + flush_varargs(); +#endif + free_decl_spec(&decl_spec); + free_declarator($1); + } + ; + +opt_declaration_list + : /* empty */ + | T_VA_DCL + | declaration_list + ; + +declaration_list + : declaration + | declaration_list declaration + ; + +decl_specifiers + : decl_specifier + | decl_specifiers decl_specifier + { + join_decl_specs(&$$, &$1, &$2); + free($1.text); + free($2.text); + } + ; + +decl_specifier + : storage_class + | type_specifier + | type_qualifier + ; + +storage_class + : T_AUTO + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_EXTERN + { + new_decl_spec(&$$, $1.text, $1.begin, DS_EXTERN); + } + | T_REGISTER + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_STATIC + { + new_decl_spec(&$$, $1.text, $1.begin, DS_STATIC); + } + | T_INLINE + { + new_decl_spec(&$$, $1.text, $1.begin, DS_INLINE); + } + | T_EXTENSION + { + new_decl_spec(&$$, $1.text, $1.begin, DS_JUNK); + } + ; + +type_specifier + : T_CHAR + { + new_decl_spec(&$$, $1.text, $1.begin, DS_CHAR); + } + | T_DOUBLE + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_FLOAT + { + new_decl_spec(&$$, $1.text, $1.begin, DS_FLOAT); + } + | T_INT + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_LONG + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_SHORT + { + new_decl_spec(&$$, $1.text, $1.begin, DS_SHORT); + } + | T_SIGNED + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_UNSIGNED + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_VOID + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_Bool + { + new_decl_spec(&$$, $1.text, $1.begin, DS_CHAR); + } + | T_Complex + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_Imaginary + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_TYPEDEF_NAME + { + Symbol *s; + s = find_symbol(typedef_names, $1.text); + if (s != NULL) + new_decl_spec(&$$, $1.text, $1.begin, s->flags); + } + | struct_or_union_specifier + | enum_specifier + ; + +type_qualifier + : T_TYPE_QUALIFIER + { + new_decl_spec(&$$, $1.text, $1.begin, DS_NONE); + } + | T_DEFINE_NAME + { + /* This rule allows the nonterminal to scan #define + * names as if they were type modifiers. + */ + Symbol *s; + s = find_symbol(define_names, $1.text); + if (s != NULL) + new_decl_spec(&$$, $1.text, $1.begin, s->flags); + } + ; + +struct_or_union_specifier + : struct_or_union any_id braces + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "%s %s", $1.text, $2.text); + new_decl_spec(&$$, s, $1.begin, DS_NONE); + } + | struct_or_union braces + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "%s {}", $1.text); + new_decl_spec(&$$, s, $1.begin, DS_NONE); + } + | struct_or_union any_id + { + (void)sprintf(buf, "%s %s", $1.text, $2.text); + new_decl_spec(&$$, buf, $1.begin, DS_NONE); + } + ; + +struct_or_union + : T_STRUCT + { + imply_typedef($$.text); + } + | T_UNION + { + imply_typedef($$.text); + } + ; + +init_declarator_list + : init_declarator + { + new_decl_list(&$$, $1); + } + | init_declarator_list ',' init_declarator + { + add_decl_list(&$$, &$1, $3); + } + ; + +init_declarator + : declarator + { + if ($1->func_def != FUNC_NONE && func_params == NULL && + func_style == FUNC_TRADITIONAL && cur_file->convert) { + gen_func_declarator($1); + fputs(cur_text(), cur_file->tmp_file); + } + cur_declarator = $$; + } + | declarator '=' + { + if ($1->func_def != FUNC_NONE && func_params == NULL && + func_style == FUNC_TRADITIONAL && cur_file->convert) { + gen_func_declarator($1); + fputs(" =", cur_file->tmp_file); + } + } + T_INITIALIZER + ; + +enum_specifier + : enumeration any_id braces + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "enum %s", $2.text); + new_decl_spec(&$$, s, $1.begin, DS_NONE); + } + | enumeration braces + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "%s {}", $1.text); + new_decl_spec(&$$, s, $1.begin, DS_NONE); + } + | enumeration any_id + { + (void)sprintf(buf, "enum %s", $2.text); + new_decl_spec(&$$, buf, $1.begin, DS_NONE); + } + ; + +enumeration + : T_ENUM + { + imply_typedef("enum"); + $$ = $1; + } + ; + +any_id + : T_IDENTIFIER + | T_TYPEDEF_NAME + ; + +declarator + : pointer direct_declarator + { + $$ = $2; + (void)sprintf(buf, "%s%s", $1.text, $$->text); + free($$->text); + $$->text = xstrdup(buf); + $$->begin = $1.begin; + $$->pointer = TRUE; + } + | direct_declarator + ; + +direct_declarator + : identifier_or_ref + { + $$ = new_declarator($1.text, $1.text, $1.begin); + } + | '(' declarator ')' + { + $$ = $2; + (void)sprintf(buf, "(%s)", $$->text); + free($$->text); + $$->text = xstrdup(buf); + $$->begin = $1.begin; + } + | direct_declarator T_BRACKETS + { + $$ = $1; + (void)sprintf(buf, "%s%s", $$->text, $2.text); + free($$->text); + $$->text = xstrdup(buf); + } + | direct_declarator '(' parameter_type_list ')' + { + $$ = new_declarator("%s()", $1->name, $1->begin); + $$->params = $3; + $$->func_stack = $1; + $$->head = ($1->func_stack == NULL) ? $$ : $1->head; + $$->func_def = FUNC_ANSI; + } + | direct_declarator '(' opt_identifier_list ')' + { + $$ = new_declarator("%s()", $1->name, $1->begin); + $$->params = $3; + $$->func_stack = $1; + $$->head = ($1->func_stack == NULL) ? $$ : $1->head; + $$->func_def = FUNC_TRADITIONAL; + } + ; + +pointer + : '*' opt_type_qualifiers + { + (void)sprintf($$.text, "*%s", $2.text); + $$.begin = $1.begin; + } + | '*' opt_type_qualifiers pointer + { + (void)sprintf($$.text, "*%s%s", $2.text, $3.text); + $$.begin = $1.begin; + } + ; + +opt_type_qualifiers + : /* empty */ + { + strcpy($$.text, ""); + $$.begin = 0L; + } + | type_qualifier_list + ; + +type_qualifier_list + : type_qualifier + { + (void)sprintf($$.text, "%s ", $1.text); + $$.begin = $1.begin; + free($1.text); + } + | type_qualifier_list type_qualifier + { + (void)sprintf($$.text, "%s%s ", $1.text, $2.text); + $$.begin = $1.begin; + free($2.text); + } + ; + +parameter_type_list + : parameter_list + | parameter_list ',' T_ELLIPSIS + { + add_ident_list(&$$, &$1, "..."); + } + ; + +parameter_list + : parameter_declaration + { + new_param_list(&$$, $1); + } + | parameter_list ',' parameter_declaration + { + add_param_list(&$$, &$1, $3); + } + ; + +parameter_declaration + : decl_specifiers declarator + { + check_untagged(&$1); + $$ = new_parameter(&$1, $2); + } + | decl_specifiers abs_declarator + { + check_untagged(&$1); + $$ = new_parameter(&$1, $2); + } + | decl_specifiers + { + check_untagged(&$1); + $$ = new_parameter(&$1, (Declarator *)0); + } + ; + +opt_identifier_list + : /* empty */ + { + new_ident_list(&$$); + } + | identifier_list + ; + +identifier_list + : any_id + { + new_ident_list(&$$); + add_ident_list(&$$, &$$, $1.text); + } + | identifier_list ',' any_id + { + add_ident_list(&$$, &$1, $3.text); + } + ; + +identifier_or_ref + : any_id + { + $$ = $1; + } + | '&' any_id + { +#if OPT_LINTLIBRARY + if (lintLibrary()) { /* Lint doesn't grok C++ ref variables */ + $$ = $2; + } else +#endif + (void)sprintf($$.text, "&%s", $2.text); + $$.begin = $1.begin; + } + ; + +abs_declarator + : pointer + { + $$ = new_declarator($1.text, "", $1.begin); + } + | pointer direct_abs_declarator + { + $$ = $2; + (void)sprintf(buf, "%s%s", $1.text, $$->text); + free($$->text); + $$->text = xstrdup(buf); + $$->begin = $1.begin; + } + | direct_abs_declarator + ; + +direct_abs_declarator + : '(' abs_declarator ')' + { + $$ = $2; + (void)sprintf(buf, "(%s)", $$->text); + free($$->text); + $$->text = xstrdup(buf); + $$->begin = $1.begin; + } + | direct_abs_declarator T_BRACKETS + { + $$ = $1; + (void)sprintf(buf, "%s%s", $$->text, $2.text); + free($$->text); + $$->text = xstrdup(buf); + } + | T_BRACKETS + { + $$ = new_declarator($1.text, "", $1.begin); + } + | direct_abs_declarator '(' parameter_type_list ')' + { + $$ = new_declarator("%s()", "", $1->begin); + $$->params = $3; + $$->func_stack = $1; + $$->head = ($1->func_stack == NULL) ? $$ : $1->head; + $$->func_def = FUNC_ANSI; + } + | direct_abs_declarator '(' ')' + { + $$ = new_declarator("%s()", "", $1->begin); + $$->func_stack = $1; + $$->head = ($1->func_stack == NULL) ? $$ : $1->head; + $$->func_def = FUNC_ANSI; + } + | '(' parameter_type_list ')' + { + Declarator *d; + + d = new_declarator("", "", $1.begin); + $$ = new_declarator("%s()", "", $1.begin); + $$->params = $2; + $$->func_stack = d; + $$->head = $$; + $$->func_def = FUNC_ANSI; + } + | '(' ')' + { + Declarator *d; + + d = new_declarator("", "", $1.begin); + $$ = new_declarator("%s()", "", $1.begin); + $$->func_stack = d; + $$->head = $$; + $$->func_def = FUNC_ANSI; + } + ; + +%% + +/* lex.yy.c */ +#define BEGIN yy_start = 1 + 2 * + +#define CPP1 1 +#define INIT1 2 +#define INIT2 3 +#define CURLY 4 +#define LEXYACC 5 +#define ASM 6 +#define CPP_INLINE 7 + +extern char *yytext; +extern FILE *yyin, *yyout; + +static int curly; /* number of curly brace nesting levels */ +static int ly_count; /* number of occurances of %% */ +static int inc_depth; /* include nesting level */ +static SymbolTable *included_files; /* files already included */ +static int yy_start = 0; /* start state number */ + +#define grammar_error(s) yaccError(s) + +static void +yaccError (const char *msg) +{ + func_params = NULL; + put_error(); /* tell what line we're on, and what file */ + fprintf(stderr, "%s at token '%s'\n", msg, yytext); +} + +/* Initialize the table of type qualifier keywords recognized by the lexical + * analyzer. + */ +void +init_parser (void) +{ + static const char *keywords[] = { + "const", + "restrict", + "volatile", + "interrupt", +#ifdef vms + "noshare", + "readonly", +#endif +#if defined(MSDOS) || defined(OS2) + "__cdecl", + "__export", + "__far", + "__fastcall", + "__fortran", + "__huge", + "__inline", + "__interrupt", + "__loadds", + "__near", + "__pascal", + "__saveregs", + "__segment", + "__stdcall", + "__syscall", + "_cdecl", + "_cs", + "_ds", + "_es", + "_export", + "_far", + "_fastcall", + "_fortran", + "_huge", + "_interrupt", + "_loadds", + "_near", + "_pascal", + "_saveregs", + "_seg", + "_segment", + "_ss", + "cdecl", + "far", + "huge", + "near", + "pascal", +#ifdef OS2 + "__far16", +#endif +#endif +#ifdef __GNUC__ + /* gcc aliases */ + "__builtin_va_arg", + "__builtin_va_list", + "__const", + "__const__", + "__inline", + "__inline__", + "__restrict", + "__restrict__", + "__volatile", + "__volatile__", +#endif + }; + unsigned i; + + /* Initialize type qualifier table. */ + type_qualifiers = new_symbol_table(); + for (i = 0; i < sizeof(keywords)/sizeof(keywords[0]); ++i) { + new_symbol(type_qualifiers, keywords[i], NULL, DS_NONE); + } +} + +/* Process the C source file. Write function prototypes to the standard + * output. Convert function definitions and write the converted source + * code to a temporary file. + */ +void +process_file (FILE *infile, char *name) +{ + char *s; + + if (strlen(name) > 2) { + s = name + strlen(name) - 2; + if (*s == '.') { + ++s; + if (*s == 'l' || *s == 'y') + BEGIN LEXYACC; +#if defined(MSDOS) || defined(OS2) + if (*s == 'L' || *s == 'Y') + BEGIN LEXYACC; +#endif + } + } + + included_files = new_symbol_table(); + typedef_names = new_symbol_table(); + define_names = new_symbol_table(); + inc_depth = -1; + curly = 0; + ly_count = 0; + func_params = NULL; + yyin = infile; + include_file(strcpy(base_file, name), func_style != FUNC_NONE); + if (file_comments) { +#if OPT_LINTLIBRARY + if (lintLibrary()) { + put_blankline(stdout); + begin_tracking(); + } +#endif + put_string(stdout, "/* "); + put_string(stdout, cur_file_name()); + put_string(stdout, " */\n"); + } + yyparse(); + free_symbol_table(define_names); + free_symbol_table(typedef_names); + free_symbol_table(included_files); +} + +#ifdef NO_LEAKS +void +free_parser(void) +{ + free_symbol_table (type_qualifiers); +#ifdef FLEX_SCANNER + if (yy_current_buffer != 0) + yy_delete_buffer(yy_current_buffer); +#endif +} +#endif diff --git a/tools/regression/usr.bin/yacc/pure_calc.y b/tools/regression/usr.bin/yacc/pure_calc.y new file mode 100644 index 00000000000..3cd04332dcd --- /dev/null +++ b/tools/regression/usr.bin/yacc/pure_calc.y @@ -0,0 +1,116 @@ +%{ +# include +# include + +int regs[26]; +int base; + +#ifdef YYBISON +#define YYSTYPE int +#define YYLEX_PARAM &yylval +#define YYLEX_DECL() yylex(YYSTYPE *yylval) +#define YYERROR_DECL() yyerror(const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +%} + +%start list + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr '+' expr + { $$ = $1 + $3; } + | expr '-' expr + { $$ = $1 - $3; } + | expr '*' expr + { $$ = $1 * $3; } + | expr '/' expr + { $$ = $1 / $3; } + | expr '%' expr + { $$ = $1 % $3; } + | expr '&' expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | '-' expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +#ifdef YYBYACC +static int YYLEX_DECL(); +#endif + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +YYERROR_DECL() +{ + fprintf(stderr, "%s\n", s); +} + +int +YYLEX_DECL() +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + *yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + *yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/tools/regression/usr.bin/yacc/pure_error.y b/tools/regression/usr.bin/yacc/pure_error.y new file mode 100644 index 00000000000..fe7a3c3094f --- /dev/null +++ b/tools/regression/usr.bin/yacc/pure_error.y @@ -0,0 +1,41 @@ +%{ + +#ifdef YYBISON +#define YYSTYPE int +#define YYLEX_PARAM &yylval +#define YYLEX_DECL() yylex(YYSTYPE *yylval) +#define YYERROR_DECL() yyerror(const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +%} + +%% +S: error +%% + +#include + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main(void) +{ + printf("yyparse() = %d\n", yyparse()); + return 0; +} + +int +yylex(YYSTYPE *value) +{ + return value ? 0 : -1; +} + +static void +yyerror(const char* s) +{ + printf("%s\n", s); +} diff --git a/tools/regression/usr.bin/yacc/quote_calc.y b/tools/regression/usr.bin/yacc/quote_calc.y new file mode 100644 index 00000000000..9304dd8a700 --- /dev/null +++ b/tools/regression/usr.bin/yacc/quote_calc.y @@ -0,0 +1,112 @@ +%{ +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +%} + +%start list + +%token OP_ADD "ADD" +%token OP_SUB "SUB" +%token OP_MUL "MUL" +%token OP_DIV "DIV" +%token OP_MOD "MOD" +%token OP_AND "AND" + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr OP_ADD expr + { $$ = $1 + $3; } + | expr OP_SUB expr + { $$ = $1 - $3; } + | expr OP_MUL expr + { $$ = $1 * $3; } + | expr OP_DIV expr + { $$ = $1 / $3; } + | expr OP_MOD expr + { $$ = $1 % $3; } + | expr OP_AND expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | OP_SUB expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/tools/regression/usr.bin/yacc/quote_calc2.y b/tools/regression/usr.bin/yacc/quote_calc2.y new file mode 100644 index 00000000000..ab72a285fcb --- /dev/null +++ b/tools/regression/usr.bin/yacc/quote_calc2.y @@ -0,0 +1,112 @@ +%{ +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +%} + +%start list + +%token OP_ADD "ADD" +%token OP_SUB "SUB" +%token OP_MUL "MUL" +%token OP_DIV "DIV" +%token OP_MOD "MOD" +%token OP_AND "AND" + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr "ADD" expr + { $$ = $1 + $3; } + | expr "SUB" expr + { $$ = $1 - $3; } + | expr "MUL" expr + { $$ = $1 * $3; } + | expr "DIV" expr + { $$ = $1 / $3; } + | expr "MOD" expr + { $$ = $1 % $3; } + | expr "AND" expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | "SUB" expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/tools/regression/usr.bin/yacc/quote_calc3.y b/tools/regression/usr.bin/yacc/quote_calc3.y new file mode 100644 index 00000000000..5feeb4a03ed --- /dev/null +++ b/tools/regression/usr.bin/yacc/quote_calc3.y @@ -0,0 +1,112 @@ +%{ +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +%} + +%start list + +%token OP_ADD "ADD-operator" +%token OP_SUB "SUB-operator" +%token OP_MUL "MUL-operator" +%token OP_DIV "DIV-operator" +%token OP_MOD "MOD-operator" +%token OP_AND "AND-operator" + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr OP_ADD expr + { $$ = $1 + $3; } + | expr OP_SUB expr + { $$ = $1 - $3; } + | expr OP_MUL expr + { $$ = $1 * $3; } + | expr OP_DIV expr + { $$ = $1 / $3; } + | expr OP_MOD expr + { $$ = $1 % $3; } + | expr OP_AND expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | OP_SUB expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/tools/regression/usr.bin/yacc/quote_calc4.y b/tools/regression/usr.bin/yacc/quote_calc4.y new file mode 100644 index 00000000000..34b790e67f1 --- /dev/null +++ b/tools/regression/usr.bin/yacc/quote_calc4.y @@ -0,0 +1,112 @@ +%{ +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +%} + +%start list + +%token OP_ADD "ADD-operator" +%token OP_SUB "SUB-operator" +%token OP_MUL "MUL-operator" +%token OP_DIV "DIV-operator" +%token OP_MOD "MOD-operator" +%token OP_AND "AND-operator" + +%token DIGIT LETTER + +%left '|' +%left '&' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS /* supplies precedence for unary minus */ + +%% /* beginning of rules section */ + +list : /* empty */ + | list stat '\n' + | list error '\n' + { yyerrok ; } + ; + +stat : expr + { printf("%d\n",$1);} + | LETTER '=' expr + { regs[$1] = $3; } + ; + +expr : '(' expr ')' + { $$ = $2; } + | expr "ADD-operator" expr + { $$ = $1 + $3; } + | expr "SUB-operator" expr + { $$ = $1 - $3; } + | expr "MUL-operator" expr + { $$ = $1 * $3; } + | expr "DIV-operator" expr + { $$ = $1 / $3; } + | expr "MOD-operator" expr + { $$ = $1 % $3; } + | expr "AND-operator" expr + { $$ = $1 & $3; } + | expr '|' expr + { $$ = $1 | $3; } + | "SUB-operator" expr %prec UMINUS + { $$ = - $2; } + | LETTER + { $$ = regs[$1]; } + | number + ; + +number: DIGIT + { $$ = $1; base = ($1==0) ? 8 : 10; } + | number DIGIT + { $$ = base * $1 + $2; } + ; + +%% /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} diff --git a/tools/regression/usr.bin/yacc/regress.00.out b/tools/regression/usr.bin/yacc/regress.00.out new file mode 100644 index 00000000000..f78562775d9 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.00.out @@ -0,0 +1,390 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, +}; +static const short yylen[] = { 2, + 0, +}; +static const short yydefred[] = { 1, + 0, +}; +static const short yydgoto[] = { 1, +}; +static const short yysindex[] = { 0, + 0, +}; +static const short yyrindex[] = { 0, + 0, +}; +static const short yygindex[] = { 0, +}; +#define YYTABLESIZE 0 +static const short yytable[] = { 0, +}; +static const short yycheck[] = { -1, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 0 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file", +}; +static const char *yyrule[] = { +"$accept : rule", +"rule :", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.01.out b/tools/regression/usr.bin/yacc/regress.01.out new file mode 100644 index 00000000000..cc4845e1702 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.01.out @@ -0,0 +1,593 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 2 "calc.y" +# include +# include + +int regs[26]; +int base; + +extern int yylex(void); +static void yyerror(const char *s); + +#line 28 "/dev/stdout" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short yylen[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short yydefred[] = { 1, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 3, + 0, 15, 14, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 9, + 10, 11, +}; +static const short yydgoto[] = { 1, + 7, 8, 9, +}; +static const short yysindex[] = { 0, + -40, -7, 0, -55, -38, -38, 1, -29, -247, 0, + -38, 0, 0, 22, 0, -38, -38, -38, -38, -38, + -38, -38, 0, -29, 0, 51, 60, -20, -20, 0, + 0, 0, +}; +static const short yyrindex[] = { 0, + 0, 0, 0, 2, 0, 0, 0, 9, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, -6, 14, 5, 13, 0, + 0, 0, +}; +static const short yygindex[] = { 0, + 0, 65, 0, +}; +#define YYTABLESIZE 220 +static const short yytable[] = { 6, + 16, 6, 10, 13, 5, 11, 5, 22, 17, 23, + 15, 15, 20, 18, 7, 19, 22, 21, 4, 5, + 0, 20, 8, 12, 0, 0, 21, 16, 16, 0, + 0, 16, 16, 16, 13, 16, 0, 16, 15, 15, + 0, 0, 7, 15, 15, 7, 15, 7, 15, 7, + 8, 12, 0, 8, 12, 8, 0, 8, 22, 17, + 0, 0, 25, 20, 18, 0, 19, 0, 21, 13, + 14, 0, 0, 0, 0, 24, 0, 0, 0, 0, + 26, 27, 28, 29, 30, 31, 32, 22, 17, 0, + 0, 0, 20, 18, 16, 19, 22, 21, 0, 0, + 0, 20, 18, 0, 19, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 8, 12, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 3, 12, +}; +static const short yycheck[] = { 40, + 10, 40, 10, 10, 45, 61, 45, 37, 38, 257, + 10, 10, 42, 43, 10, 45, 37, 47, 10, 10, + -1, 42, 10, 10, -1, -1, 47, 37, 38, -1, + -1, 41, 42, 43, 41, 45, -1, 47, 37, 38, + -1, -1, 38, 42, 43, 41, 45, 43, 47, 45, + 38, 38, -1, 41, 41, 43, -1, 45, 37, 38, + -1, -1, 41, 42, 43, -1, 45, -1, 47, 5, + 6, -1, -1, -1, -1, 11, -1, -1, -1, -1, + 16, 17, 18, 19, 20, 21, 22, 37, 38, -1, + -1, -1, 42, 43, 124, 45, 37, 47, -1, -1, + -1, 42, 43, -1, 45, -1, 47, -1, -1, -1, + -1, -1, -1, -1, 124, -1, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 124, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 256, 257, 258, 257, 258, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 259 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr '+' expr", +"expr : expr '-' expr", +"expr : expr '*' expr", +"expr : expr '/' expr", +"expr : expr '%' expr", +"expr : expr '&' expr", +"expr : expr '|' expr", +"expr : '-' expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 66 "calc.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 266 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 28 "calc.y" + { yyerrok ; } +break; +case 4: +#line 32 "calc.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 34 "calc.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 38 "calc.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 40 "calc.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 42 "calc.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 44 "calc.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 46 "calc.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 48 "calc.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 50 "calc.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 52 "calc.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 54 "calc.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 56 "calc.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 61 "calc.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 63 "calc.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 532 "/dev/stdout" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.02.out b/tools/regression/usr.bin/yacc/regress.02.out new file mode 100644 index 00000000000..c0e7a75b356 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.02.out @@ -0,0 +1,835 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 2 "calc1.y" + +/* http://dinosaur.compilertools.net/yacc/index.html */ + +#include +#include +#include +#include + +typedef struct interval +{ + double lo, hi; +} +INTERVAL; + +INTERVAL vmul(double, double, INTERVAL); +INTERVAL vdiv(double, double, INTERVAL); + +extern int yylex(void); +static void yyerror(const char *s); + +int dcheck(INTERVAL); + +double dreg[26]; +INTERVAL vreg[26]; + +#line 31 "calc1.y" +#ifdef YYSTYPE +#undef YYSTYPE_IS_DECLARED +#define YYSTYPE_IS_DECLARED 1 +#endif +#ifndef YYSTYPE_IS_DECLARED +#define YYSTYPE_IS_DECLARED 1 +typedef union +{ + int ival; + double dval; + INTERVAL vval; +} YYSTYPE; +#endif /* !YYSTYPE_IS_DECLARED */ +#line 58 "/dev/stdout" + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define DREG 257 +#define VREG 258 +#define CONST 259 +#define UMINUS 260 +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 3, 3, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, +}; +static const short yylen[] = { 2, + 0, 2, 2, 2, 4, 4, 2, 1, 1, 3, + 3, 3, 3, 2, 3, 1, 5, 1, 3, 3, + 3, 3, 3, 3, 3, 3, 2, 3, +}; +static const short yydefred[] = { 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 7, + 0, 0, 9, 18, 14, 27, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 15, 0, 28, 0, 0, 0, 0, + 12, 24, 13, 26, 0, 0, 23, 25, 14, 0, + 0, 0, 0, 0, 5, 6, 0, 0, 0, 12, + 13, 17, +}; +static const short yydgoto[] = { 7, + 32, 9, 0, +}; +static const short yysindex[] = { -40, + -8, -48, -47, 0, -37, -37, 0, 2, 17, 0, + -34, -37, 0, 0, 0, 0, -25, 90, -37, -37, + -37, -37, 0, -37, -37, -37, -37, 0, -34, -34, + 25, 125, 31, 0, -34, 0, -11, 37, -11, 37, + 0, 0, 0, 0, 37, 37, 0, 0, 0, 111, + -34, -34, -34, -34, 0, 0, 118, 69, 69, 0, + 0, 0, +}; +static const short yyrindex[] = { 0, + 0, 38, 44, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, 0, 0, 0, 51, -3, 56, 61, + 0, 0, 0, 0, 67, 72, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 78, 83, 0, + 0, 0, +}; +static const short yygindex[] = { 0, + 4, 124, 0, +}; +#define YYTABLESIZE 225 +static const short yytable[] = { 6, + 16, 10, 6, 8, 5, 30, 20, 5, 15, 17, + 29, 23, 11, 12, 31, 34, 21, 19, 35, 20, + 0, 22, 37, 39, 41, 43, 28, 0, 0, 0, + 21, 16, 49, 50, 55, 22, 0, 20, 57, 20, + 56, 20, 0, 21, 19, 0, 20, 9, 22, 0, + 0, 0, 0, 18, 58, 59, 60, 61, 26, 24, + 10, 25, 0, 27, 0, 11, 53, 51, 0, 52, + 22, 54, 26, 24, 0, 25, 19, 27, 26, 9, + 9, 21, 9, 27, 9, 18, 18, 10, 18, 0, + 18, 10, 11, 10, 10, 10, 11, 0, 11, 11, + 11, 22, 0, 22, 0, 22, 0, 19, 0, 19, + 53, 19, 21, 0, 21, 54, 21, 0, 10, 0, + 10, 0, 10, 11, 0, 11, 0, 11, 16, 18, + 36, 26, 24, 0, 25, 33, 27, 0, 0, 0, + 0, 0, 38, 40, 42, 44, 0, 45, 46, 47, + 48, 34, 53, 51, 0, 52, 0, 54, 62, 53, + 51, 0, 52, 0, 54, 0, 21, 19, 0, 20, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 4, 13, + 14, 4, 13, 0, 4, +}; +static const short yycheck[] = { 40, + 10, 10, 40, 0, 45, 40, 10, 45, 5, 6, + 45, 10, 61, 61, 11, 41, 42, 43, 44, 45, + -1, 47, 19, 20, 21, 22, 10, -1, -1, -1, + 42, 41, 29, 30, 10, 47, -1, 41, 35, 43, + 10, 45, -1, 42, 43, -1, 45, 10, 47, -1, + -1, -1, -1, 10, 51, 52, 53, 54, 42, 43, + 10, 45, -1, 47, -1, 10, 42, 43, -1, 45, + 10, 47, 42, 43, -1, 45, 10, 47, 42, 42, + 43, 10, 45, 47, 47, 42, 43, 10, 45, -1, + 47, 41, 10, 43, 44, 45, 41, -1, 43, 44, + 45, 41, -1, 43, -1, 45, -1, 41, -1, 43, + 42, 45, 41, -1, 43, 47, 45, -1, 41, -1, + 43, -1, 45, 41, -1, 43, -1, 45, 5, 6, + 41, 42, 43, -1, 45, 12, 47, -1, -1, -1, + -1, -1, 19, 20, 21, 22, -1, 24, 25, 26, + 27, 41, 42, 43, -1, 45, -1, 47, 41, 42, + 43, -1, 45, -1, 47, -1, 42, 43, -1, 45, + -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 256, 257, 258, 259, 257, + 258, 259, 257, -1, 259, +}; +#define YYFINAL 7 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 260 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,"'('","')'","'*'","'+'","','","'-'",0,"'/'",0,0,0,0,0,0,0,0,0, +0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,"DREG","VREG","CONST","UMINUS", +}; +static const char *yyrule[] = { +"$accept : line", +"lines :", +"lines : lines line", +"line : dexp '\\n'", +"line : vexp '\\n'", +"line : DREG '=' dexp '\\n'", +"line : VREG '=' vexp '\\n'", +"line : error '\\n'", +"dexp : CONST", +"dexp : DREG", +"dexp : dexp '+' dexp", +"dexp : dexp '-' dexp", +"dexp : dexp '*' dexp", +"dexp : dexp '/' dexp", +"dexp : '-' dexp", +"dexp : '(' dexp ')'", +"vexp : dexp", +"vexp : '(' dexp ',' dexp ')'", +"vexp : VREG", +"vexp : vexp '+' vexp", +"vexp : dexp '+' vexp", +"vexp : vexp '-' vexp", +"vexp : dexp '-' vexp", +"vexp : vexp '*' vexp", +"vexp : dexp '*' vexp", +"vexp : vexp '/' vexp", +"vexp : dexp '/' vexp", +"vexp : '-' vexp", +"vexp : '(' vexp ')'", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 176 "calc1.y" + /* beginning of subroutines section */ + +#define BSZ 50 /* buffer size for floating point numbers */ + + /* lexical analysis */ + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) +{ + int c; + + while ((c = getchar()) == ' ') + { /* skip over blanks */ + } + + if (isupper(c)) + { + yylval.ival = c - 'A'; + return (VREG); + } + if (islower(c)) + { + yylval.ival = c - 'a'; + return (DREG); + } + + if (isdigit(c) || c == '.') + { + /* gobble up digits, points, exponents */ + char buf[BSZ + 1], *cp = buf; + int dot = 0, expr = 0; + + for (; (cp - buf) < BSZ; ++cp, c = getchar()) + { + + *cp = c; + if (isdigit(c)) + continue; + if (c == '.') + { + if (dot++ || expr) + return ('.'); /* will cause syntax error */ + continue; + } + + if (c == 'e') + { + if (expr++) + return ('e'); /* will cause syntax error */ + continue; + } + + /* end of number */ + break; + } + *cp = '\0'; + + if ((cp - buf) >= BSZ) + printf("constant too long: truncated\n"); + else + ungetc(c, stdin); /* push back last char read */ + yylval.dval = atof(buf); + return (CONST); + } + return (c); +} + +static INTERVAL +hilo(double a, double b, double c, double d) +{ + /* returns the smallest interval containing a, b, c, and d */ + /* used by *, / routines */ + INTERVAL v; + + if (a > b) + { + v.hi = a; + v.lo = b; + } + else + { + v.hi = b; + v.lo = a; + } + + if (c > d) + { + if (c > v.hi) + v.hi = c; + if (d < v.lo) + v.lo = d; + } + else + { + if (d > v.hi) + v.hi = d; + if (c < v.lo) + v.lo = c; + } + return (v); +} + +INTERVAL +vmul(double a, double b, INTERVAL v) +{ + return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo)); +} + +int +dcheck(INTERVAL v) +{ + if (v.hi >= 0. && v.lo <= 0.) + { + printf("divisor interval contains 0.\n"); + return (1); + } + return (0); +} + +INTERVAL +vdiv(double a, double b, INTERVAL v) +{ + return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo)); +} +#line 405 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 57 "calc1.y" + { + (void) printf("%15.8f\n", yystack.l_mark[-1].dval); + } +break; +case 4: +#line 61 "calc1.y" + { + (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi); + } +break; +case 5: +#line 65 "calc1.y" + { + dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval; + } +break; +case 6: +#line 69 "calc1.y" + { + vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval; + } +break; +case 7: +#line 73 "calc1.y" + { + yyerrok; + } +break; +case 9: +#line 80 "calc1.y" + { + yyval.dval = dreg[yystack.l_mark[0].ival]; + } +break; +case 10: +#line 84 "calc1.y" + { + yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval; + } +break; +case 11: +#line 88 "calc1.y" + { + yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval; + } +break; +case 12: +#line 92 "calc1.y" + { + yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval; + } +break; +case 13: +#line 96 "calc1.y" + { + yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval; + } +break; +case 14: +#line 100 "calc1.y" + { + yyval.dval = -yystack.l_mark[0].dval; + } +break; +case 15: +#line 104 "calc1.y" + { + yyval.dval = yystack.l_mark[-1].dval; + } +break; +case 16: +#line 110 "calc1.y" + { + yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval; + } +break; +case 17: +#line 114 "calc1.y" + { + yyval.vval.lo = yystack.l_mark[-3].dval; + yyval.vval.hi = yystack.l_mark[-1].dval; + if ( yyval.vval.lo > yyval.vval.hi ) + { + (void) printf("interval out of order\n"); + YYERROR; + } + } +break; +case 18: +#line 124 "calc1.y" + { + yyval.vval = vreg[yystack.l_mark[0].ival]; + } +break; +case 19: +#line 128 "calc1.y" + { + yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi; + yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo; + } +break; +case 20: +#line 133 "calc1.y" + { + yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi; + yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo; + } +break; +case 21: +#line 138 "calc1.y" + { + yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo; + yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi; + } +break; +case 22: +#line 143 "calc1.y" + { + yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo; + yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi; + } +break; +case 23: +#line 148 "calc1.y" + { + yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval ); + } +break; +case 24: +#line 152 "calc1.y" + { + yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval ); + } +break; +case 25: +#line 156 "calc1.y" + { + if (dcheck(yystack.l_mark[0].vval)) YYERROR; + yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval ); + } +break; +case 26: +#line 161 "calc1.y" + { + if (dcheck ( yystack.l_mark[0].vval )) YYERROR; + yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval ); + } +break; +case 27: +#line 166 "calc1.y" + { + yyval.vval.hi = -yystack.l_mark[0].vval.lo; + yyval.vval.lo = -yystack.l_mark[0].vval.hi; + } +break; +case 28: +#line 171 "calc1.y" + { + yyval.vval = yystack.l_mark[-1].vval; + } +break; +#line 774 "/dev/stdout" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.03.out b/tools/regression/usr.bin/yacc/regress.03.out new file mode 100644 index 00000000000..55ed6aefd46 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.03.out @@ -0,0 +1,607 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 1 + +#line 9 "calc3.y" +# include +# include + +#ifdef YYBISON +#define YYSTYPE int +#define YYLEX_PARAM base +#define YYLEX_DECL() yylex(YYSTYPE *yylval, int *YYLEX_PARAM) +#define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +#line 31 "/dev/stdout" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(int regs[26], int * base) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# ifdef YYLEX_PARAM_TYPE +# define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLEX_PARAM_TYPE YYLEX_PARAM) +# else +# define YYLEX_DECL() yylex(YYSTYPE *yylval, void * YYLEX_PARAM) +# endif +# define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(YYSTYPE *yylval, int * base) +# define YYLEX yylex(&yylval, base) +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(int regs[26], int * base, const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(regs, base, msg) +#endif + +extern int YYPARSE_DECL(); + +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short yylen[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short yydefred[] = { 1, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 3, + 0, 15, 14, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 9, + 10, 11, +}; +static const short yydgoto[] = { 1, + 7, 8, 9, +}; +static const short yysindex[] = { 0, + -40, -7, 0, -55, -38, -38, 1, -29, -247, 0, + -38, 0, 0, 22, 0, -38, -38, -38, -38, -38, + -38, -38, 0, -29, 0, 51, 60, -20, -20, 0, + 0, 0, +}; +static const short yyrindex[] = { 0, + 0, 0, 0, 2, 0, 0, 0, 9, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, -6, 14, 5, 13, 0, + 0, 0, +}; +static const short yygindex[] = { 0, + 0, 65, 0, +}; +#define YYTABLESIZE 220 +static const short yytable[] = { 6, + 16, 6, 10, 13, 5, 11, 5, 22, 17, 23, + 15, 15, 20, 18, 7, 19, 22, 21, 4, 5, + 0, 20, 8, 12, 0, 0, 21, 16, 16, 0, + 0, 16, 16, 16, 13, 16, 0, 16, 15, 15, + 0, 0, 7, 15, 15, 7, 15, 7, 15, 7, + 8, 12, 0, 8, 12, 8, 0, 8, 22, 17, + 0, 0, 25, 20, 18, 0, 19, 0, 21, 13, + 14, 0, 0, 0, 0, 24, 0, 0, 0, 0, + 26, 27, 28, 29, 30, 31, 32, 22, 17, 0, + 0, 0, 20, 18, 16, 19, 22, 21, 0, 0, + 0, 20, 18, 0, 19, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 8, 12, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 3, 12, +}; +static const short yycheck[] = { 40, + 10, 40, 10, 10, 45, 61, 45, 37, 38, 257, + 10, 10, 42, 43, 10, 45, 37, 47, 10, 10, + -1, 42, 10, 10, -1, -1, 47, 37, 38, -1, + -1, 41, 42, 43, 41, 45, -1, 47, 37, 38, + -1, -1, 38, 42, 43, 41, 45, 43, 47, 45, + 38, 38, -1, 41, 41, 43, -1, 45, 37, 38, + -1, -1, 41, 42, 43, -1, 45, -1, 47, 5, + 6, -1, -1, -1, -1, 11, -1, -1, -1, -1, + 16, 17, 18, 19, 20, 21, 22, 37, 38, -1, + -1, -1, 42, 43, 124, 45, 37, 47, -1, -1, + -1, 42, 43, -1, 45, -1, 47, -1, -1, -1, + -1, -1, -1, -1, 124, -1, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 124, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 256, 257, 258, 257, 258, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 259 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr '+' expr", +"expr : expr '-' expr", +"expr : expr '*' expr", +"expr : expr '/' expr", +"expr : expr '%' expr", +"expr : expr '&' expr", +"expr : expr '|' expr", +"expr : '-' expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +#line 76 "calc3.y" + /* start of programs */ + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main (void) +{ + int regs[26]; + int base = 10; + + while(!feof(stdin)) { + yyparse(regs, &base); + } + return 0; +} + +static void +YYERROR_DECL() +{ + fprintf(stderr, "%s\n", s); +} + +int +YYLEX_DECL() +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + *yylval = (c - 'a'); + return ( LETTER ); + } + if( isdigit( c )) { + *yylval = (c - '0') % (*base); + return ( DIGIT ); + } + return( c ); +} +#line 273 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yyerrflag; + int yychar; + YYSTYPE yyval; + YYSTYPE yylval; + + /* variables for the parser stack */ + YYSTACKDATA yystack; + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror(regs, base, "syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 38 "calc3.y" + { yyerrok ; } +break; +case 4: +#line 42 "calc3.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 44 "calc3.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 48 "calc3.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 50 "calc3.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 52 "calc3.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 54 "calc3.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 56 "calc3.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 58 "calc3.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 60 "calc3.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 62 "calc3.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 64 "calc3.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 66 "calc3.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 71 "calc3.y" + { yyval = yystack.l_mark[0]; (*base) = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 73 "calc3.y" + { yyval = (*base) * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 546 "/dev/stdout" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror(regs, base, "yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.04.out b/tools/regression/usr.bin/yacc/regress.04.out new file mode 100644 index 00000000000..d9a20060e67 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.04.out @@ -0,0 +1,599 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 2 "code_calc.y" +# include +# include + +int regs[26]; +int base; + +#ifdef YYBISON +int yylex(void); +static void yyerror(const char *s); +#endif + +#line 30 "/dev/stdout" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short yylen[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short yydefred[] = { 1, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 3, + 0, 15, 14, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 9, + 10, 11, +}; +static const short yydgoto[] = { 1, + 7, 8, 9, +}; +static const short yysindex[] = { 0, + -40, -7, 0, -55, -38, -38, 1, -29, -247, 0, + -38, 0, 0, 22, 0, -38, -38, -38, -38, -38, + -38, -38, 0, -29, 0, 51, 60, -20, -20, 0, + 0, 0, +}; +static const short yyrindex[] = { 0, + 0, 0, 0, 2, 0, 0, 0, 9, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, -6, 14, 5, 13, 0, + 0, 0, +}; +static const short yygindex[] = { 0, + 0, 65, 0, +}; +#define YYTABLESIZE 220 +static const short yytable[] = { 6, + 16, 6, 10, 13, 5, 11, 5, 22, 17, 23, + 15, 15, 20, 18, 7, 19, 22, 21, 4, 5, + 0, 20, 8, 12, 0, 0, 21, 16, 16, 0, + 0, 16, 16, 16, 13, 16, 0, 16, 15, 15, + 0, 0, 7, 15, 15, 7, 15, 7, 15, 7, + 8, 12, 0, 8, 12, 8, 0, 8, 22, 17, + 0, 0, 25, 20, 18, 0, 19, 0, 21, 13, + 14, 0, 0, 0, 0, 24, 0, 0, 0, 0, + 26, 27, 28, 29, 30, 31, 32, 22, 17, 0, + 0, 0, 20, 18, 16, 19, 22, 21, 0, 0, + 0, 20, 18, 0, 19, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 8, 12, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 3, 12, +}; +static const short yycheck[] = { 40, + 10, 40, 10, 10, 45, 61, 45, 37, 38, 257, + 10, 10, 42, 43, 10, 45, 37, 47, 10, 10, + -1, 42, 10, 10, -1, -1, 47, 37, 38, -1, + -1, 41, 42, 43, 41, 45, -1, 47, 37, 38, + -1, -1, 38, 42, 43, 41, 45, 43, 47, 45, + 38, 38, -1, 41, 41, 43, -1, 45, 37, 38, + -1, -1, 41, 42, 43, -1, 45, -1, 47, 5, + 6, -1, -1, -1, -1, 11, -1, -1, -1, -1, + 16, 17, 18, 19, 20, 21, 22, 37, 38, -1, + -1, -1, 42, 43, 124, 45, 37, 47, -1, -1, + -1, 42, 43, -1, 45, -1, 47, -1, -1, -1, + -1, -1, -1, -1, 124, -1, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 124, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 256, 257, 258, 257, 258, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 259 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr '+' expr", +"expr : expr '-' expr", +"expr : expr '*' expr", +"expr : expr '/' expr", +"expr : expr '%' expr", +"expr : expr '&' expr", +"expr : expr '|' expr", +"expr : '-' expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 68 "code_calc.y" + /* start of programs */ + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 272 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 30 "code_calc.y" + { yyerrok ; } +break; +case 4: +#line 34 "code_calc.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 36 "code_calc.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 40 "code_calc.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 42 "code_calc.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 44 "code_calc.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 46 "code_calc.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 48 "code_calc.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 50 "code_calc.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 52 "code_calc.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 54 "code_calc.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 56 "code_calc.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 58 "code_calc.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 63 "code_calc.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 65 "code_calc.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 538 "/dev/stdout" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.05.out b/tools/regression/usr.bin/yacc/regress.05.out new file mode 100644 index 00000000000..3f643db5587 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.05.out @@ -0,0 +1,429 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 2 "code_error.y" + +#ifdef YYBISON +int yylex(void); +static void yyerror(const char *); +#endif + +#line 25 "/dev/stdout" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, +}; +static const short yylen[] = { 2, + 1, +}; +static const short yydefred[] = { 0, + 1, 0, +}; +static const short yydgoto[] = { 2, +}; +static const short yysindex[] = { -256, + 0, 0, +}; +static const short yyrindex[] = { 0, + 0, 0, +}; +static const short yygindex[] = { 0, +}; +#define YYTABLESIZE 0 +static const short yytable[] = { 1, +}; +static const short yycheck[] = { 256, +}; +#define YYFINAL 2 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 0 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file", +}; +static const char *yyrule[] = { +"$accept : S", +"S : error", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 12 "code_error.y" + +#include + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main(void) +{ + printf("yyparse() = %d\n", yyparse()); + return 0; +} + +int +yylex(void) +{ + return -1; +} + +static void +yyerror(const char* s) +{ + printf("%s\n", s); +} +#line 163 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.06.out b/tools/regression/usr.bin/yacc/regress.06.out new file mode 100644 index 00000000000..1dc80eb49b5 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.06.out @@ -0,0 +1,421 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 2 "error.y" +int yylex(void); +static void yyerror(const char *); +#line 21 "/dev/stdout" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, +}; +static const short yylen[] = { 2, + 1, +}; +static const short yydefred[] = { 0, + 1, 0, +}; +static const short yydgoto[] = { 2, +}; +static const short yysindex[] = { -256, + 0, 0, +}; +static const short yyrindex[] = { 0, + 0, 0, +}; +static const short yygindex[] = { 0, +}; +#define YYTABLESIZE 0 +static const short yytable[] = { 1, +}; +static const short yycheck[] = { 256, +}; +#define YYFINAL 2 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 0 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file", +}; +static const char *yyrule[] = { +"$accept : S", +"S : error", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 8 "error.y" + +#include + +int +main(void) +{ + printf("yyparse() = %d\n", yyparse()); + return 0; +} + +int +yylex(void) +{ + return -1; +} + +static void +yyerror(const char* s) +{ + printf("%s\n", s); +} +#line 155 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/usr.bin/yacc/test/ftp.tab.c b/tools/regression/usr.bin/yacc/regress.07.out similarity index 70% rename from usr.bin/yacc/test/ftp.tab.c rename to tools/regression/usr.bin/yacc/regress.07.out index b9758606fa1..de06e38caca 100644 --- a/usr.bin/yacc/test/ftp.tab.c +++ b/tools/regression/usr.bin/yacc/regress.07.out @@ -1,28 +1,23 @@ #ifndef lint -static char const yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; #endif -#include + #define YYBYACC 1 #define YYMAJOR 1 #define YYMINOR 9 -#define YYLEX yylex() -#define YYEMPTY -1 -#define yyclearin (yychar=(YYEMPTY)) -#define yyerrok (yyerrflag=0) -#define YYRECOVERING (yyerrflag!=0) -#if defined(c_plusplus) || defined(__cplusplus) -#include -#else -extern char *getenv(); -extern void *realloc(); -#endif -static int yygrowstack(); + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + #define YYPREFIX "yy" + +#define YYPURE 0 + #line 26 "ftp.y" -#ifndef lint -static char sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89"; -#endif /* not lint */ +/* sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89"; */ #include #include @@ -31,6 +26,8 @@ static char sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89"; #include +#include +#include #include #include #include @@ -38,7 +35,14 @@ static char sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89"; #include #include #include +#include #include +#include + +#ifdef YYBISON +int yylex(void); +static void yyerror(const char *); +#endif extern struct sockaddr_in data_dest; extern int logged_in; @@ -57,7 +61,30 @@ extern char *globerr; extern int usedefault; extern int transflag; extern char tmpline[]; -char **glob(); + +extern char **glob(char *); +extern char *renamefrom(char *); +extern void cwd(const char *); + +extern void dologout(int); +extern void fatal(const char *); +extern void makedir(const char *); +extern void nack(const char *); +extern void pass(const char *); +extern void passive(void); +extern void pwd(void); +extern void removedir(char *); +extern void renamecmd(char *, char *); +extern void retrieve(const char *, const char *); +extern void send_file_list(const char *); +extern void statcmd(void); +extern void statfilecmd(const char *); +extern void store(char *, const char *, int); +extern void user(const char *); + +extern void perror_reply(int, const char *, ...); +extern void reply(int, const char *, ...); +extern void lreply(int, const char *, ...); static int cmd_type; static int cmd_form; @@ -65,8 +92,65 @@ static int cmd_bytesz; char cbuf[512]; char *fromname; -char *index(); -#line 70 "ftp.tab.c" +struct tab { + const char *name; + short token; + short state; + short implemented; /* 1 if command is implemented */ + const char *help; +}; + +static char * copy(const char *); + +#ifdef YYBISON +static void sizecmd(char *filename); +static void help(struct tab *ctab, char *s); +struct tab cmdtab[]; +struct tab sitetab[]; +#endif + +static void +yyerror(const char *msg) +{ + perror(msg); +} +#line 117 "/dev/stdout" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + #define A 257 #define B 258 #define C 259 @@ -131,7 +215,7 @@ char *index(); #define CHMOD 318 #define LEXERR 319 #define YYERRCODE 256 -const short yylhs[] = { -1, +static const short yylhs[] = { -1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -141,7 +225,7 @@ const short yylhs[] = { -1, 6, 6, 6, 7, 7, 7, 8, 8, 8, 10, 14, 11, 9, }; -const short yylen[] = { 2, +static const short yylen[] = { 2, 0, 2, 2, 4, 4, 4, 2, 4, 4, 4, 4, 8, 5, 5, 5, 3, 5, 3, 5, 5, 2, 5, 4, 2, 3, 5, 2, 4, 2, 5, @@ -151,7 +235,7 @@ const short yylen[] = { 2, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, }; -const short yydefred[] = { 1, +static const short yydefred[] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 73, 73, 0, 73, 0, 0, 73, 73, 73, 73, 0, 0, 0, 0, 73, 73, 73, 73, 73, @@ -173,11 +257,11 @@ const short yydefred[] = { 1, 0, 35, 72, 0, 40, 0, 0, 0, 37, 0, 0, 12, 0, 0, 38, 0, 0, 0, 52, }; -const short yydgoto[] = { 1, +static const short yydgoto[] = { 1, 34, 35, 71, 73, 75, 80, 84, 88, 45, 95, 184, 125, 157, 96, }; -const short yysindex[] = { 0, +static const short yysindex[] = { 0, -224, -247, -239, -236, -232, -222, -204, -200, -181, -177, 0, 0, 0, -166, 0, -161, -199, 0, 0, 0, 0, -160, -159, -264, -158, 0, 0, 0, 0, 0, @@ -199,7 +283,7 @@ const short yysindex[] = { 0, -97, 0, 0, -95, 0, -96, -94, -92, 0, -152, -93, 0, -91, -90, 0, -88, -87, -86, 0, }; -const short yyrindex[] = { 0, +static const short yyrindex[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, @@ -221,12 +305,12 @@ const short yyrindex[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -const short yygindex[] = { 0, +static const short yygindex[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, -89, -25, 35, 47, 0, }; #define YYTABLESIZE 190 -const short yytable[] = { 129, +static const short yytable[] = { 129, 130, 131, 104, 134, 59, 60, 76, 136, 137, 77, 138, 78, 79, 105, 106, 107, 98, 99, 146, 123, 148, 149, 36, 124, 150, 151, 152, 46, 47, 37, @@ -247,7 +331,7 @@ const short yytable[] = { 129, 183, 185, 190, 187, 189, 188, 191, 192, 195, 194, 196, 0, 0, 198, 197, 73, 199, 49, 56, 58, }; -const short yycheck[] = { 89, +static const short yycheck[] = { 89, 90, 91, 305, 93, 269, 270, 257, 97, 98, 260, 100, 262, 263, 316, 317, 318, 269, 270, 108, 269, 110, 111, 270, 273, 114, 115, 116, 12, 13, 269, @@ -271,12 +355,11 @@ const short yycheck[] = { 89, #define YYFINAL 1 #ifndef YYDEBUG #define YYDEBUG 0 -#elif YYDEBUG -#include #endif #define YYMAXTOKEN 319 #if YYDEBUG -const char * const yyname[] = { +static const char *yyname[] = { + "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -290,7 +373,7 @@ const char * const yyname[] = { "DELE","CWD","LIST","NLST","SITE","STAT","HELP","NOOP","MKD","RMD","PWD","CDUP", "STOU","SMNT","SYST","SIZE","MDTM","UMASK","IDLE","CHMOD","LEXERR", }; -const char * const yyrule[] = { +static const char *yyrule[] = { "$accept : cmd_list", "cmd_list :", "cmd_list : cmd_list cmd", @@ -365,39 +448,53 @@ const char * const yyrule[] = { "pathstring : STRING", "octal_number : NUMBER", "check_login :", + }; #endif -#ifndef YYSTYPE -typedef int YYSTYPE; -#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ #ifdef YYSTACKSIZE #undef YYMAXDEPTH -#define YYMAXDEPTH YYSTACKSIZE +#define YYMAXDEPTH YYSTACKSIZE #else #ifdef YYMAXDEPTH #define YYSTACKSIZE YYMAXDEPTH #else -#define YYSTACKSIZE 10000 -#define YYMAXDEPTH 10000 +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 #endif #endif -#define YYINITSTACKSIZE 200 -int yydebug; -int yynerrs; -int yyerrflag; -int yychar; -short *yyssp; -YYSTYPE *yyvsp; -YYSTYPE yyval; -YYSTYPE yylval; -short *yyss; -short *yysslim; -YYSTYPE *yyvs; -int yystacksize; -#line 658 "ftp.y" + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 707 "ftp.y" + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif extern jmp_buf errcatch; +static void upper(char *); + #define CMD 0 /* beginning of command */ #define ARGS 1 /* expect miscellaneous arguments */ #define STR1 2 /* expect SP followed by STRING */ @@ -408,14 +505,6 @@ extern jmp_buf errcatch; #define SITECMD 7 /* SITE command */ #define NSTR 8 /* Number followed by a string */ -struct tab { - char *name; - short token; - short state; - short implemented; /* 1 if command is implemented */ - char *help; -}; - struct tab cmdtab[] = { /* In order defined in RFC 765 */ { "USER", USER, STR1, 1, " username" }, { "PASS", PASS, ZSTR1, 1, " password" }, @@ -464,7 +553,7 @@ struct tab cmdtab[] = { /* In order defined in RFC 765 */ { "STOU", STOU, STR1, 1, " file-name" }, { "SIZE", SIZE, OSTR, 1, " path-name" }, { "MDTM", MDTM, OSTR, 1, " path-name" }, - { NULL, 0, 0, 0, 0 } + { 0, 0, 0, 0, 0 } }; struct tab sitetab[] = { @@ -472,16 +561,14 @@ struct tab sitetab[] = { { "IDLE", IDLE, ARGS, 1, "[ maximum-idle-time ]" }, { "CHMOD", CHMOD, NSTR, 1, " mode file-name" }, { "HELP", HELP, OSTR, 1, "[ ]" }, - { NULL, 0, 0, 0, 0 } + { 0, 0, 0, 0, 0 } }; -struct tab * -lookup(p, cmd) - register struct tab *p; - char *cmd; +static struct tab * +lookup(struct tab *p, char *cmd) { - for (; p->name != NULL; p++) + for (; p->name != 0; p++) if (strcmp(cmd, p->name) == 0) return (p); return (0); @@ -490,14 +577,12 @@ lookup(p, cmd) #include /* - * getline - a hacked up version of fgets to ignore TELNET escape codes. + * get_line - a hacked up version of fgets to ignore TELNET escape codes. */ -char * -getline(s, n, iop) - char *s; - register FILE *iop; +static char * +get_line(char *s, int n, FILE *iop) { - register c; + register int c; register char *cs; cs = s; @@ -505,7 +590,7 @@ getline(s, n, iop) for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) { *cs++ = tmpline[c]; if (tmpline[c] == '\n') { - *cs++ = '\0'; + *cs = '\0'; if (debug) syslog(LOG_DEBUG, "command: %s", s); tmpline[0] = '\0'; @@ -544,20 +629,19 @@ getline(s, n, iop) break; } if (c == EOF && cs == s) - return (NULL); - *cs++ = '\0'; + return (0); + *cs = '\0'; if (debug) syslog(LOG_DEBUG, "command: %s", s); return (s); } -static int -toolong() +static void +toolong(int sig) { time_t now; - extern char *ctime(); - extern time_t time(); + (void) sig; reply(421, "Timeout (%d seconds): closing control connection.", timeout); (void) time(&now); @@ -569,14 +653,14 @@ toolong() dologout(1); } -yylex() +int +yylex(void) { static int cpos, state; register char *cp, *cp2; register struct tab *p; int n; - char c, *strpbrk(); - char *copy(); + char c; for (;;) { switch (state) { @@ -584,16 +668,16 @@ yylex() case CMD: (void) signal(SIGALRM, toolong); (void) alarm((unsigned) timeout); - if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) { + if (get_line(cbuf, sizeof(cbuf)-1, stdin) == 0) { reply(221, "You could at least say goodbye."); dologout(0); } (void) alarm(0); #ifdef SETPROCTITLE - if (strncasecmp(cbuf, "PASS", 4) != NULL) + if (strncasecmp(cbuf, "PASS", 4) != 0) setproctitle("%s: %s", proctitle, cbuf); #endif /* SETPROCTITLE */ - if ((cp = index(cbuf, '\r'))) { + if ((cp = strchr(cbuf, '\r'))) { *cp++ = '\n'; *cp = '\0'; } @@ -613,7 +697,7 @@ yylex() /* NOTREACHED */ } state = p->state; - *(char **)&yylval = p->name; + *(const char **)(&yylval) = p->name; return (p->token); } break; @@ -639,7 +723,7 @@ yylex() /* NOTREACHED */ } state = p->state; - *(char **)&yylval = p->name; + *(const char **)(&yylval) = p->name; return (p->token); } state = CMD; @@ -657,7 +741,10 @@ yylex() dostr1: if (cbuf[cpos] == ' ') { cpos++; - state = state == OSTR ? STR2 : ++state; + if (state == OSTR) + state = STR2; + else + ++state; return (SP); } break; @@ -787,8 +874,8 @@ yylex() } } -upper(s) - register char *s; +static void +upper(char *s) { while (*s != '\0') { if (islower(*s)) @@ -797,34 +884,32 @@ upper(s) } } -char * -copy(s) - char *s; +static char * +copy(const char *s) { char *p; - extern char *malloc(), *strcpy(); - p = malloc((unsigned) strlen(s) + 1); - if (p == NULL) + p = (char * )malloc(strlen(s) + 1); + if (p == 0) fatal("Ran out of memory."); - (void) strcpy(p, s); + else + (void) strcpy(p, s); return (p); } -help(ctab, s) - struct tab *ctab; - char *s; +static void +help(struct tab *ctab, char *s) { register struct tab *c; register int width, NCMDS; - char *type; + const char *help_type; if (ctab == sitetab) - type = "SITE "; + help_type = "SITE "; else - type = ""; + help_type = ""; width = 0, NCMDS = 0; - for (c = ctab; c->name != NULL; c++) { + for (c = ctab; c->name != 0; c++) { int len = strlen(c->name); if (len > width) @@ -837,7 +922,7 @@ help(ctab, s) int columns, lines; lreply(214, "The following %scommands are recognized %s.", - type, "(* =>'s unimplemented)"); + help_type, "(* =>'s unimplemented)"); columns = 76 / width; if (columns == 0) columns = 1; @@ -846,6 +931,7 @@ help(ctab, s) printf(" "); for (j = 0; j < columns; j++) { c = ctab + j * lines + i; + assert(c->name != 0); printf("%s%c", c->name, c->implemented ? ' ' : '*'); if (c + lines >= &ctab[NCMDS]) @@ -869,14 +955,14 @@ help(ctab, s) return; } if (c->implemented) - reply(214, "Syntax: %s%s %s", type, c->name, c->help); + reply(214, "Syntax: %s%s %s", help_type, c->name, c->help); else - reply(214, "%s%-*s\t%s; unimplemented.", type, width, + reply(214, "%s%-*s\t%s; unimplemented.", help_type, width, c->name, c->help); } -sizecmd(filename) -char *filename; +static void +sizecmd(char *filename) { switch (type) { case TYPE_L: @@ -886,14 +972,18 @@ char *filename; (stbuf.st_mode&S_IFMT) != S_IFREG) reply(550, "%s: not a plain file.", filename); else +#ifdef HAVE_LONG_LONG + reply(213, "%llu", (long long) stbuf.st_size); +#else reply(213, "%lu", stbuf.st_size); +#endif break;} case TYPE_A: { FILE *fin; register int c, count; struct stat stbuf; fin = fopen(filename, "r"); - if (fin == NULL) { + if (fin == 0) { perror_reply(550, filename); return; } @@ -918,47 +1008,74 @@ char *filename; reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]); } } -#line 920 "ftp.tab.c" +#line 1011 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + /* allocate initial stack or double stack size, up to YYMAXDEPTH */ -static int yygrowstack() +static int yygrowstack(YYSTACKDATA *data) { - int newsize, i; + int i; + unsigned newsize; short *newss; YYSTYPE *newvs; - if ((newsize = yystacksize) == 0) + if ((newsize = data->stacksize) == 0) newsize = YYINITSTACKSIZE; else if (newsize >= YYMAXDEPTH) return -1; else if ((newsize *= 2) > YYMAXDEPTH) newsize = YYMAXDEPTH; - i = yyssp - yyss; - if ((newss = (short *)realloc(yyss, newsize * sizeof *newss)) == NULL) + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) return -1; - yyss = newss; - yyssp = newss + i; - if ((newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs)) == NULL) + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) return -1; - yyvs = newvs; - yyvsp = newvs + i; - yystacksize = newsize; - yysslim = yyss + newsize - 1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; return 0; } -#define YYABORT goto yyabort +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort #define YYREJECT goto yyabort #define YYACCEPT goto yyaccept -#define YYERROR goto yyerrlab +#define YYERROR goto yyerrlab int -yyparse() +YYPARSE_DECL() { - register int yym, yyn, yystate; + int yym, yyn, yystate; #if YYDEBUG - register const char *yys; + const char *yys; - if ((yys = getenv("YYDEBUG"))) + if ((yys = getenv("YYDEBUG")) != 0) { yyn = *yys; if (yyn >= '0' && yyn <= '9') @@ -968,18 +1085,24 @@ yyparse() yynerrs = 0; yyerrflag = 0; - yychar = (-1); + yychar = YYEMPTY; + yystate = 0; - if (yyss == NULL && yygrowstack()) goto yyoverflow; - yyssp = yyss; - yyvsp = yyvs; - *yyssp = yystate = 0; +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; yyloop: - if ((yyn = yydefred[yystate])) goto yyreduce; + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; if (yychar < 0) { - if ((yychar = yylex()) < 0) yychar = 0; + if ((yychar = YYLEX) < 0) yychar = 0; #if YYDEBUG if (yydebug) { @@ -999,13 +1122,14 @@ yyloop: printf("%sdebug: state %d, shifting to state %d\n", YYPREFIX, yystate, yytable[yyn]); #endif - if (yyssp >= yysslim && yygrowstack()) + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) { goto yyoverflow; } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - yychar = (-1); + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; if (yyerrflag > 0) --yyerrflag; goto yyloop; } @@ -1016,36 +1140,35 @@ yyloop: goto yyreduce; } if (yyerrflag) goto yyinrecovery; -#if defined(lint) || defined(__GNUC__) - goto yynewerror; -#endif -yynewerror: + yyerror("syntax error"); -#if defined(lint) || defined(__GNUC__) + goto yyerrlab; -#endif + yyerrlab: ++yynerrs; + yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { - if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, error recovery shifting\ - to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); #endif - if (yyssp >= yysslim && yygrowstack()) + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) { goto yyoverflow; } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; goto yyloop; } else @@ -1053,11 +1176,11 @@ yyinrecovery: #if YYDEBUG if (yydebug) printf("%sdebug: error recovery discarding state %d\n", - YYPREFIX, *yyssp); + YYPREFIX, *yystack.s_mark); #endif - if (yyssp <= yyss) goto yyabort; - --yyssp; - --yyvsp; + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; } } } @@ -1074,9 +1197,10 @@ yyinrecovery: YYPREFIX, yystate, yychar, yys); } #endif - yychar = (-1); + yychar = YYEMPTY; goto yyloop; } + yyreduce: #if YYDEBUG if (yydebug) @@ -1084,32 +1208,35 @@ yyreduce: YYPREFIX, yystate, yyn, yyrule[yyn]); #endif yym = yylen[yyn]; - yyval = yyvsp[1-yym]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); switch (yyn) { case 2: -#line 99 "ftp.y" - { +#line 150 "ftp.y" + { fromname = (char *) 0; } break; case 4: -#line 106 "ftp.y" - { - user((char *) yyvsp[-1]); - free((char *) yyvsp[-1]); +#line 157 "ftp.y" + { + user((char *) yystack.l_mark[-1]); + free((char *) yystack.l_mark[-1]); } break; case 5: -#line 111 "ftp.y" - { - pass((char *) yyvsp[-1]); - free((char *) yyvsp[-1]); +#line 162 "ftp.y" + { + pass((char *) yystack.l_mark[-1]); + free((char *) yystack.l_mark[-1]); } break; case 6: -#line 116 "ftp.y" - { +#line 167 "ftp.y" + { usedefault = 0; if (pdata >= 0) { (void) close(pdata); @@ -1119,14 +1246,14 @@ case 6: } break; case 7: -#line 125 "ftp.y" - { +#line 176 "ftp.y" + { passive(); } break; case 8: -#line 129 "ftp.y" - { +#line 180 "ftp.y" + { switch (cmd_type) { case TYPE_A: @@ -1162,9 +1289,9 @@ case 8: } break; case 9: -#line 164 "ftp.y" - { - switch (yyvsp[-1]) { +#line 215 "ftp.y" + { + switch (yystack.l_mark[-1]) { case STRU_F: reply(200, "STRU F ok."); @@ -1176,9 +1303,9 @@ case 9: } break; case 10: -#line 176 "ftp.y" - { - switch (yyvsp[-1]) { +#line 227 "ftp.y" + { + switch (yystack.l_mark[-1]) { case MODE_S: reply(200, "MODE S ok."); @@ -1190,148 +1317,148 @@ case 10: } break; case 11: -#line 188 "ftp.y" - { +#line 239 "ftp.y" + { reply(202, "ALLO command ignored."); } break; case 12: -#line 192 "ftp.y" - { +#line 243 "ftp.y" + { reply(202, "ALLO command ignored."); } break; case 13: -#line 196 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) - retrieve((char *) 0, (char *) yyvsp[-1]); - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); +#line 247 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + retrieve((char *) 0, (char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 14: -#line 203 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) - store((char *) yyvsp[-1], "w", 0); - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); +#line 254 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + store((char *) yystack.l_mark[-1], "w", 0); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 15: -#line 210 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) - store((char *) yyvsp[-1], "a", 0); - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); +#line 261 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + store((char *) yystack.l_mark[-1], "a", 0); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 16: -#line 217 "ftp.y" - { - if (yyvsp[-1]) +#line 268 "ftp.y" + { + if (yystack.l_mark[-1]) send_file_list("."); } break; case 17: -#line 222 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) - send_file_list((char *) yyvsp[-1]); - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); +#line 273 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + send_file_list((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 18: -#line 229 "ftp.y" - { - if (yyvsp[-1]) +#line 280 "ftp.y" + { + if (yystack.l_mark[-1]) retrieve("/bin/ls -lgA", ""); } break; case 19: -#line 234 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) - retrieve("/bin/ls -lgA %s", (char *) yyvsp[-1]); - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); +#line 285 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + retrieve("/bin/ls -lgA %s", (char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 20: -#line 241 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) - statfilecmd((char *) yyvsp[-1]); - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); +#line 292 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + statfilecmd((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 21: -#line 248 "ftp.y" - { +#line 299 "ftp.y" + { statcmd(); } break; case 22: -#line 252 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) - delete((char *) yyvsp[-1]); - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); +#line 303 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + remove((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 23: -#line 259 "ftp.y" - { +#line 310 "ftp.y" + { if (fromname) { - renamecmd(fromname, (char *) yyvsp[-1]); + renamecmd(fromname, (char *) yystack.l_mark[-1]); free(fromname); fromname = (char *) 0; } else { reply(503, "Bad sequence of commands."); } - free((char *) yyvsp[-1]); + free((char *) yystack.l_mark[-1]); } break; case 24: -#line 270 "ftp.y" - { +#line 321 "ftp.y" + { reply(225, "ABOR command successful."); } break; case 25: -#line 274 "ftp.y" - { - if (yyvsp[-1]) +#line 325 "ftp.y" + { + if (yystack.l_mark[-1]) cwd(pw->pw_dir); } break; case 26: -#line 279 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) - cwd((char *) yyvsp[-1]); - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); +#line 330 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + cwd((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 27: -#line 286 "ftp.y" - { +#line 337 "ftp.y" + { help(cmdtab, (char *) 0); } break; case 28: -#line 290 "ftp.y" - { - register char *cp = (char *)yyvsp[-1]; +#line 341 "ftp.y" + { + register char *cp = (char *)yystack.l_mark[-1]; if (strncasecmp(cp, "SITE", 4) == 0) { - cp = (char *)yyvsp[-1] + 4; + cp = (char *)yystack.l_mark[-1] + 4; if (*cp == ' ') cp++; if (*cp) @@ -1339,65 +1466,65 @@ case 28: else help(sitetab, (char *) 0); } else - help(cmdtab, (char *) yyvsp[-1]); + help(cmdtab, (char *) yystack.l_mark[-1]); } break; case 29: -#line 305 "ftp.y" - { +#line 356 "ftp.y" + { reply(200, "NOOP command successful."); } break; case 30: -#line 309 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) - makedir((char *) yyvsp[-1]); - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); +#line 360 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + makedir((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 31: -#line 316 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) - removedir((char *) yyvsp[-1]); - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); +#line 367 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + removedir((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 32: -#line 323 "ftp.y" - { - if (yyvsp[-1]) +#line 374 "ftp.y" + { + if (yystack.l_mark[-1]) pwd(); } break; case 33: -#line 328 "ftp.y" - { - if (yyvsp[-1]) +#line 379 "ftp.y" + { + if (yystack.l_mark[-1]) cwd(".."); } break; case 34: -#line 333 "ftp.y" - { +#line 384 "ftp.y" + { help(sitetab, (char *) 0); } break; case 35: -#line 337 "ftp.y" - { - help(sitetab, (char *) yyvsp[-1]); +#line 388 "ftp.y" + { + help(sitetab, (char *) yystack.l_mark[-1]); } break; case 36: -#line 341 "ftp.y" - { +#line 392 "ftp.y" + { int oldmask; - if (yyvsp[-1]) { + if (yystack.l_mark[-1]) { oldmask = umask(0); (void) umask(oldmask); reply(200, "Current UMASK is %03o", oldmask); @@ -1405,55 +1532,55 @@ case 36: } break; case 37: -#line 351 "ftp.y" - { +#line 402 "ftp.y" + { int oldmask; - if (yyvsp[-3]) { - if ((yyvsp[-1] == -1) || (yyvsp[-1] > 0777)) { + if (yystack.l_mark[-3]) { + if ((yystack.l_mark[-1] == -1) || (yystack.l_mark[-1] > 0777)) { reply(501, "Bad UMASK value"); } else { - oldmask = umask(yyvsp[-1]); + oldmask = umask(yystack.l_mark[-1]); reply(200, "UMASK set to %03o (was %03o)", - yyvsp[-1], oldmask); + yystack.l_mark[-1], oldmask); } } } break; case 38: -#line 366 "ftp.y" - { - if (yyvsp[-5] && (yyvsp[-1] != NULL)) { - if (yyvsp[-3] > 0777) +#line 417 "ftp.y" + { + if (yystack.l_mark[-5] && (yystack.l_mark[-1] != 0)) { + if (yystack.l_mark[-3] > 0777) reply(501, "CHMOD: Mode value must be between 0 and 0777"); - else if (chmod((char *) yyvsp[-1], yyvsp[-3]) < 0) - perror_reply(550, (char *) yyvsp[-1]); + else if (chmod((char *) yystack.l_mark[-1], yystack.l_mark[-3]) < 0) + perror_reply(550, (char *) yystack.l_mark[-1]); else reply(200, "CHMOD command successful."); } - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 39: -#line 380 "ftp.y" - { +#line 431 "ftp.y" + { reply(200, "Current IDLE time limit is %d seconds; max %d", timeout, maxtimeout); } break; case 40: -#line 386 "ftp.y" - { - if (yyvsp[-1] < 30 || yyvsp[-1] > maxtimeout) { +#line 437 "ftp.y" + { + if (yystack.l_mark[-1] < 30 || yystack.l_mark[-1] > maxtimeout) { reply(501, "Maximum IDLE time must be between 30 and %d seconds", maxtimeout); } else { - timeout = yyvsp[-1]; + timeout = yystack.l_mark[-1]; (void) alarm((unsigned) timeout); reply(200, "Maximum IDLE time set to %d seconds", @@ -1462,17 +1589,17 @@ case 40: } break; case 41: -#line 400 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) - store((char *) yyvsp[-1], "w", 1); - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); +#line 451 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + store((char *) yystack.l_mark[-1], "w", 1); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 42: -#line 407 "ftp.y" - { +#line 458 "ftp.y" + { #ifdef unix #ifdef BSD reply(215, "UNIX Type: L%d Version: BSD-%d", @@ -1486,220 +1613,218 @@ case 42: } break; case 43: -#line 428 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) - sizecmd((char *) yyvsp[-1]); - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); +#line 479 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) + sizecmd((char *) yystack.l_mark[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 44: -#line 445 "ftp.y" - { - if (yyvsp[-3] && yyvsp[-1] != NULL) { +#line 496 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1] != 0) { struct stat stbuf; - if (stat((char *) yyvsp[-1], &stbuf) < 0) - perror_reply(550, "%s", (char *) yyvsp[-1]); + if (stat((char *) yystack.l_mark[-1], &stbuf) < 0) + perror_reply(550, "%s", (char *) yystack.l_mark[-1]); else if ((stbuf.st_mode&S_IFMT) != S_IFREG) { reply(550, "%s: not a plain file.", - (char *) yyvsp[-1]); + (char *) yystack.l_mark[-1]); } else { register struct tm *t; - struct tm *gmtime(); t = gmtime(&stbuf.st_mtime); reply(213, - "%d%02d%02d%02d%02d%02d", - t->tm_year+1900, t->tm_mon+1, t->tm_mday, + "%04d%02d%02d%02d%02d%02d", + 1900 + t->tm_year, + t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); } } - if (yyvsp[-1] != NULL) - free((char *) yyvsp[-1]); + if (yystack.l_mark[-1] != 0) + free((char *) yystack.l_mark[-1]); } break; case 45: -#line 467 "ftp.y" - { +#line 518 "ftp.y" + { reply(221, "Goodbye."); dologout(0); } break; case 46: -#line 472 "ftp.y" - { +#line 523 "ftp.y" + { yyerrok; } break; case 47: -#line 477 "ftp.y" - { - char *renamefrom(); - - if (yyvsp[-3] && yyvsp[-1]) { - fromname = renamefrom((char *) yyvsp[-1]); - if (fromname == (char *) 0 && yyvsp[-1]) { - free((char *) yyvsp[-1]); +#line 528 "ftp.y" + { + if (yystack.l_mark[-3] && yystack.l_mark[-1]) { + fromname = renamefrom((char *) yystack.l_mark[-1]); + if (fromname == (char *) 0 && yystack.l_mark[-1]) { + free((char *) yystack.l_mark[-1]); } } } break; case 49: -#line 493 "ftp.y" - { - *(char **)&(yyval) = ""; +#line 542 "ftp.y" + { + *(const char **)(&(yyval)) = ""; } break; case 52: -#line 504 "ftp.y" - { +#line 553 "ftp.y" + { register char *a, *p; a = (char *)&data_dest.sin_addr; - a[0] = yyvsp[-10]; a[1] = yyvsp[-8]; a[2] = yyvsp[-6]; a[3] = yyvsp[-4]; + a[0] = yystack.l_mark[-10]; a[1] = yystack.l_mark[-8]; a[2] = yystack.l_mark[-6]; a[3] = yystack.l_mark[-4]; p = (char *)&data_dest.sin_port; - p[0] = yyvsp[-2]; p[1] = yyvsp[0]; + p[0] = yystack.l_mark[-2]; p[1] = yystack.l_mark[0]; data_dest.sin_family = AF_INET; } break; case 53: -#line 516 "ftp.y" - { +#line 565 "ftp.y" + { yyval = FORM_N; } break; case 54: -#line 520 "ftp.y" - { +#line 569 "ftp.y" + { yyval = FORM_T; } break; case 55: -#line 524 "ftp.y" - { +#line 573 "ftp.y" + { yyval = FORM_C; } break; case 56: -#line 530 "ftp.y" - { +#line 579 "ftp.y" + { cmd_type = TYPE_A; cmd_form = FORM_N; } break; case 57: -#line 535 "ftp.y" - { +#line 584 "ftp.y" + { cmd_type = TYPE_A; - cmd_form = yyvsp[0]; + cmd_form = yystack.l_mark[0]; } break; case 58: -#line 540 "ftp.y" - { +#line 589 "ftp.y" + { cmd_type = TYPE_E; cmd_form = FORM_N; } break; case 59: -#line 545 "ftp.y" - { +#line 594 "ftp.y" + { cmd_type = TYPE_E; - cmd_form = yyvsp[0]; + cmd_form = yystack.l_mark[0]; } break; case 60: -#line 550 "ftp.y" - { +#line 599 "ftp.y" + { cmd_type = TYPE_I; } break; case 61: -#line 554 "ftp.y" - { +#line 603 "ftp.y" + { cmd_type = TYPE_L; cmd_bytesz = NBBY; } break; case 62: -#line 559 "ftp.y" - { +#line 608 "ftp.y" + { cmd_type = TYPE_L; - cmd_bytesz = yyvsp[0]; + cmd_bytesz = yystack.l_mark[0]; } break; case 63: -#line 565 "ftp.y" - { +#line 614 "ftp.y" + { cmd_type = TYPE_L; - cmd_bytesz = yyvsp[0]; + cmd_bytesz = yystack.l_mark[0]; } break; case 64: -#line 572 "ftp.y" - { +#line 621 "ftp.y" + { yyval = STRU_F; } break; case 65: -#line 576 "ftp.y" - { +#line 625 "ftp.y" + { yyval = STRU_R; } break; case 66: -#line 580 "ftp.y" - { +#line 629 "ftp.y" + { yyval = STRU_P; } break; case 67: -#line 586 "ftp.y" - { +#line 635 "ftp.y" + { yyval = MODE_S; } break; case 68: -#line 590 "ftp.y" - { +#line 639 "ftp.y" + { yyval = MODE_B; } break; case 69: -#line 594 "ftp.y" - { +#line 643 "ftp.y" + { yyval = MODE_C; } break; case 70: -#line 600 "ftp.y" - { +#line 649 "ftp.y" + { /* * Problem: this production is used for all pathname * processing, but only gives a 550 error reply. * This is a valid reply in some cases but not in others. */ - if (logged_in && yyvsp[0] && strncmp((char *) yyvsp[0], "~", 1) == 0) { - *(char **)&(yyval) = *glob((char *) yyvsp[0]); - if (globerr != NULL) { + if (logged_in && yystack.l_mark[0] && strncmp((char *) yystack.l_mark[0], "~", 1) == 0) { + *(char **)&(yyval) = *glob((char *) yystack.l_mark[0]); + if (globerr != 0) { reply(550, globerr); - yyval = NULL; + yyval = 0; } - free((char *) yyvsp[0]); + free((char *) yystack.l_mark[0]); } else - yyval = yyvsp[0]; + yyval = yystack.l_mark[0]; } break; case 72: -#line 622 "ftp.y" - { +#line 671 "ftp.y" + { register int ret, dec, multby, digit; /* * Convert a number that was read as decimal number * to what it would be if it had been read as octal. */ - dec = yyvsp[0]; + dec = yystack.l_mark[0]; multby = 1; ret = 0; while (dec) { @@ -1716,8 +1841,8 @@ case 72: } break; case 73: -#line 647 "ftp.y" - { +#line 696 "ftp.y" + { if (logged_in) yyval = 1; else { @@ -1726,11 +1851,11 @@ case 73: } } break; -#line 1728 "ftp.tab.c" +#line 1854 "/dev/stdout" } - yyssp -= yym; - yystate = *yyssp; - yyvsp -= yym; + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; yym = yylhs[yyn]; if (yystate == 0 && yym == 0) { @@ -1740,11 +1865,11 @@ break; state %d\n", YYPREFIX, YYFINAL); #endif yystate = YYFINAL; - *++yyssp = YYFINAL; - *++yyvsp = yyval; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; if (yychar < 0) { - if ((yychar = yylex()) < 0) yychar = 0; + if ((yychar = YYLEX) < 0) yychar = 0; #if YYDEBUG if (yydebug) { @@ -1767,19 +1892,24 @@ break; #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state %d \ -to state %d\n", YYPREFIX, *yyssp, yystate); +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); #endif - if (yyssp >= yysslim && yygrowstack()) + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) { goto yyoverflow; } - *++yyssp = yystate; - *++yyvsp = yyval; + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; goto yyloop; + yyoverflow: yyerror("yacc stack overflow"); + yyabort: + yyfreestack(&yystack); return (1); + yyaccept: + yyfreestack(&yystack); return (0); } diff --git a/tools/regression/usr.bin/yacc/regress.08.out b/tools/regression/usr.bin/yacc/regress.08.out new file mode 100644 index 00000000000..86e93e7e202 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.08.out @@ -0,0 +1,1945 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 9 "grammar.y" +#ifdef YYBISON +#include +#define YYSTYPE_IS_DECLARED +#define yyerror yaccError +#endif + +#if defined(YYBISON) || !defined(YYBYACC) +static void yyerror(const char *s); +#endif +#line 81 "grammar.y" +#include +#include +#include + +#define OPT_LINTLIBRARY 1 + +#ifndef TRUE +#define TRUE (1) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +/* #include "cproto.h" */ +#define MAX_TEXT_SIZE 1024 + +/* Prototype styles */ +#if OPT_LINTLIBRARY +#define PROTO_ANSI_LLIB -2 /* form ANSI lint-library source */ +#define PROTO_LINTLIBRARY -1 /* form lint-library source */ +#endif +#define PROTO_NONE 0 /* do not output any prototypes */ +#define PROTO_TRADITIONAL 1 /* comment out parameters */ +#define PROTO_ABSTRACT 2 /* comment out parameter names */ +#define PROTO_ANSI 3 /* ANSI C prototype */ + +typedef int PrototypeStyle; + +typedef char boolean; + +extern boolean types_out; +extern PrototypeStyle proto_style; + +#define ansiLintLibrary() (proto_style == PROTO_ANSI_LLIB) +#define knrLintLibrary() (proto_style == PROTO_LINTLIBRARY) +#define lintLibrary() (knrLintLibrary() || ansiLintLibrary()) + +#if OPT_LINTLIBRARY +#define FUNC_UNKNOWN -1 /* unspecified */ +#else +#define FUNC_UNKNOWN 0 /* unspecified (same as FUNC_NONE) */ +#endif +#define FUNC_NONE 0 /* not a function definition */ +#define FUNC_TRADITIONAL 1 /* traditional style */ +#define FUNC_ANSI 2 /* ANSI style */ +#define FUNC_BOTH 3 /* both styles */ + +typedef int FuncDefStyle; + +/* Source file text */ +typedef struct text { + char text[MAX_TEXT_SIZE]; /* source text */ + long begin; /* offset in temporary file */ +} Text; + +/* Declaration specifier flags */ +#define DS_NONE 0 /* default */ +#define DS_EXTERN 1 /* contains "extern" specifier */ +#define DS_STATIC 2 /* contains "static" specifier */ +#define DS_CHAR 4 /* contains "char" type specifier */ +#define DS_SHORT 8 /* contains "short" type specifier */ +#define DS_FLOAT 16 /* contains "float" type specifier */ +#define DS_INLINE 32 /* contains "inline" specifier */ +#define DS_JUNK 64 /* we're not interested in this declaration */ + +/* This structure stores information about a declaration specifier. */ +typedef struct decl_spec { + unsigned short flags; /* flags defined above */ + char *text; /* source text */ + long begin; /* offset in temporary file */ +} DeclSpec; + +/* This is a list of function parameters. */ +typedef struct _ParameterList { + struct parameter *first; /* pointer to first parameter in list */ + struct parameter *last; /* pointer to last parameter in list */ + long begin_comment; /* begin offset of comment */ + long end_comment; /* end offset of comment */ + char *comment; /* comment at start of parameter list */ +} ParameterList; + +/* This structure stores information about a declarator. */ +typedef struct _Declarator { + char *name; /* name of variable or function */ + char *text; /* source text */ + long begin; /* offset in temporary file */ + long begin_comment; /* begin offset of comment */ + long end_comment; /* end offset of comment */ + FuncDefStyle func_def; /* style of function definition */ + ParameterList params; /* function parameters */ + boolean pointer; /* TRUE if it declares a pointer */ + struct _Declarator *head; /* head function declarator */ + struct _Declarator *func_stack; /* stack of function declarators */ + struct _Declarator *next; /* next declarator in list */ +} Declarator; + +/* This structure stores information about a function parameter. */ +typedef struct parameter { + struct parameter *next; /* next parameter in list */ + DeclSpec decl_spec; + Declarator *declarator; + char *comment; /* comment following the parameter */ +} Parameter; + +/* This is a list of declarators. */ +typedef struct declarator_list { + Declarator *first; /* pointer to first declarator in list */ + Declarator *last; /* pointer to last declarator in list */ +} DeclaratorList; + +/* #include "symbol.h" */ +typedef struct symbol { + struct symbol *next; /* next symbol in list */ + char *name; /* name of symbol */ + char *value; /* value of symbol (for defines) */ + short flags; /* symbol attributes */ +} Symbol; + +/* parser stack entry type */ +typedef union { + Text text; + DeclSpec decl_spec; + Parameter *parameter; + ParameterList param_list; + Declarator *declarator; + DeclaratorList decl_list; +} YYSTYPE; + +/* The hash table length should be a prime number. */ +#define SYM_MAX_HASH 251 + +typedef struct symbol_table { + Symbol *bucket[SYM_MAX_HASH]; /* hash buckets */ +} SymbolTable; + +extern SymbolTable *new_symbol_table /* Create symbol table */ + (void); +extern void free_symbol_table /* Destroy symbol table */ + (SymbolTable *s); +extern Symbol *find_symbol /* Lookup symbol name */ + (SymbolTable *s, const char *n); +extern Symbol *new_symbol /* Define new symbol */ + (SymbolTable *s, const char *n, const char *v, int f); + +/* #include "semantic.h" */ +extern void new_decl_spec (DeclSpec *, const char *, long, int); +extern void free_decl_spec (DeclSpec *); +extern void join_decl_specs (DeclSpec *, DeclSpec *, DeclSpec *); +extern void check_untagged (DeclSpec *); +extern Declarator *new_declarator (const char *, const char *, long); +extern void free_declarator (Declarator *); +extern void new_decl_list (DeclaratorList *, Declarator *); +extern void free_decl_list (DeclaratorList *); +extern void add_decl_list (DeclaratorList *, DeclaratorList *, Declarator *); +extern Parameter *new_parameter (DeclSpec *, Declarator *); +extern void free_parameter (Parameter *); +extern void new_param_list (ParameterList *, Parameter *); +extern void free_param_list (ParameterList *); +extern void add_param_list (ParameterList *, ParameterList *, Parameter *); +extern void new_ident_list (ParameterList *); +extern void add_ident_list (ParameterList *, ParameterList *, const char *); +extern void set_param_types (ParameterList *, DeclSpec *, DeclaratorList *); +extern void gen_declarations (DeclSpec *, DeclaratorList *); +extern void gen_prototype (DeclSpec *, Declarator *); +extern void gen_func_declarator (Declarator *); +extern void gen_func_definition (DeclSpec *, Declarator *); + +extern void init_parser (void); +extern void process_file (FILE *infile, char *name); +extern char *cur_text (void); +extern char *cur_file_name (void); +extern char *implied_typedef (void); +extern void include_file (char *name, int convert); +extern char *supply_parm (int count); +extern char *xstrdup (const char *); +extern int already_declared (char *name); +extern int is_actual_func (Declarator *d); +extern int lint_ellipsis (Parameter *p); +extern int want_typedef (void); +extern void begin_tracking (void); +extern void begin_typedef (void); +extern void copy_typedef (char *s); +extern void ellipsis_varargs (Declarator *d); +extern void end_typedef (void); +extern void flush_varargs (void); +extern void fmt_library (int code); +extern void imply_typedef (const char *s); +extern void indent (FILE *outf); +extern void put_blankline (FILE *outf); +extern void put_body (FILE *outf, DeclSpec *decl_spec, Declarator *declarator); +extern void put_char (FILE *outf, int c); +extern void put_error (void); +extern void put_newline (FILE *outf); +extern void put_padded (FILE *outf, const char *s); +extern void put_string (FILE *outf, const char *s); +extern void track_in (void); + +extern boolean file_comments; +extern FuncDefStyle func_style; +extern char base_file[]; + +extern int yylex (void); + +/* declaration specifier attributes for the typedef statement currently being + * scanned + */ +static int cur_decl_spec_flags; + +/* pointer to parameter list for the current function definition */ +static ParameterList *func_params; + +/* A parser semantic action sets this pointer to the current declarator in + * a function parameter declaration in order to catch any comments following + * the parameter declaration on the same line. If the lexer scans a comment + * and is not NULL, then the comment is attached to the + * declarator. To ignore subsequent comments, the lexer sets this to NULL + * after scanning a comment or end of line. + */ +static Declarator *cur_declarator; + +/* temporary string buffer */ +static char buf[MAX_TEXT_SIZE]; + +/* table of typedef names */ +static SymbolTable *typedef_names; + +/* table of define names */ +static SymbolTable *define_names; + +/* table of type qualifiers */ +static SymbolTable *type_qualifiers; + +/* information about the current input file */ +typedef struct { + char *base_name; /* base input file name */ + char *file_name; /* current file name */ + FILE *file; /* input file */ + unsigned line_num; /* current line number in input file */ + FILE *tmp_file; /* temporary file */ + long begin_comment; /* tmp file offset after last written ) or ; */ + long end_comment; /* tmp file offset after last comment */ + boolean convert; /* if TRUE, convert function definitions */ + boolean changed; /* TRUE if conversion done in this file */ +} IncludeStack; + +static IncludeStack *cur_file; /* current input file */ + +/* #include "yyerror.c" */ + +static int haveAnsiParam (void); + + +/* Flags to enable us to find if a procedure returns a value. + */ +static int return_val; /* nonzero on BRACES iff return-expression found */ + +static const char * +dft_decl_spec (void) +{ + return (lintLibrary() && !return_val) ? "void" : "int"; +} + +static int +haveAnsiParam (void) +{ + Parameter *p; + if (func_params != 0) { + for (p = func_params->first; p != 0; p = p->next) { + if (p->declarator->func_def == FUNC_ANSI) { + return TRUE; + } + } + } + return FALSE; +} +#line 305 "/dev/stdout" + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define T_IDENTIFIER 257 +#define T_TYPEDEF_NAME 258 +#define T_DEFINE_NAME 259 +#define T_AUTO 260 +#define T_EXTERN 261 +#define T_REGISTER 262 +#define T_STATIC 263 +#define T_TYPEDEF 264 +#define T_INLINE 265 +#define T_EXTENSION 266 +#define T_CHAR 267 +#define T_DOUBLE 268 +#define T_FLOAT 269 +#define T_INT 270 +#define T_VOID 271 +#define T_LONG 272 +#define T_SHORT 273 +#define T_SIGNED 274 +#define T_UNSIGNED 275 +#define T_ENUM 276 +#define T_STRUCT 277 +#define T_UNION 278 +#define T_Bool 279 +#define T_Complex 280 +#define T_Imaginary 281 +#define T_TYPE_QUALIFIER 282 +#define T_BRACKETS 283 +#define T_LBRACE 284 +#define T_MATCHRBRACE 285 +#define T_ELLIPSIS 286 +#define T_INITIALIZER 287 +#define T_STRING_LITERAL 288 +#define T_ASM 289 +#define T_ASMARG 290 +#define T_VA_DCL 291 +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, 0, 26, 26, 27, 27, 27, 27, 27, 27, + 27, 31, 30, 30, 28, 28, 34, 28, 32, 32, + 33, 33, 35, 35, 37, 38, 29, 39, 29, 36, + 36, 36, 40, 40, 1, 1, 2, 2, 2, 3, + 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 6, 6, 6, 19, 19, 8, 8, 9, + 41, 9, 7, 7, 7, 25, 23, 23, 10, 10, + 11, 11, 11, 11, 11, 20, 20, 21, 21, 22, + 22, 14, 14, 15, 15, 16, 16, 16, 17, 17, + 18, 18, 24, 24, 12, 12, 12, 13, 13, 13, + 13, 13, 13, 13, +}; +static const short yylen[] = { 2, + 0, 1, 1, 2, 1, 1, 1, 1, 3, 2, + 2, 2, 3, 3, 2, 3, 0, 5, 2, 1, + 0, 1, 1, 3, 0, 0, 7, 0, 5, 0, + 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 2, 2, 1, 1, 1, 3, 1, + 0, 4, 3, 2, 2, 1, 1, 1, 2, 1, + 1, 3, 2, 4, 4, 2, 3, 0, 1, 1, + 2, 1, 3, 1, 3, 2, 2, 1, 0, 1, + 1, 3, 1, 2, 1, 2, 1, 3, 2, 1, + 4, 3, 3, 2, +}; +static const short yydefred[] = { 0, + 0, 0, 0, 0, 77, 0, 62, 40, 0, 42, + 43, 20, 44, 0, 46, 47, 48, 49, 54, 50, + 51, 52, 53, 76, 66, 67, 55, 56, 57, 61, + 0, 7, 0, 0, 35, 37, 38, 39, 59, 60, + 28, 0, 0, 0, 103, 81, 0, 0, 3, 5, + 6, 8, 0, 10, 11, 78, 0, 90, 0, 0, + 104, 0, 19, 0, 41, 45, 15, 36, 0, 68, + 0, 0, 0, 83, 0, 0, 64, 0, 0, 74, + 4, 58, 0, 82, 87, 91, 0, 14, 13, 9, + 16, 0, 71, 0, 31, 33, 0, 0, 0, 0, + 0, 94, 0, 0, 101, 12, 63, 73, 0, 0, + 69, 0, 0, 0, 34, 0, 110, 96, 97, 0, + 0, 84, 0, 85, 0, 23, 0, 0, 72, 26, + 29, 114, 0, 0, 0, 109, 0, 93, 95, 102, + 18, 0, 0, 108, 113, 112, 0, 24, 27, 111, +}; +static const short yydgoto[] = { 33, + 87, 35, 36, 37, 38, 39, 40, 69, 70, 41, + 42, 119, 120, 100, 101, 102, 103, 104, 43, 44, + 59, 60, 45, 46, 47, 48, 49, 50, 51, 52, + 77, 53, 127, 109, 128, 97, 94, 143, 72, 98, + 112, +}; +static const short yysindex[] = { -2, + -3, 27, -239, -177, 0, 0, 0, 0, -274, 0, + 0, 0, 0, -246, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -266, 0, 0, 455, 0, 0, 0, 0, 0, 0, + 0, -35, -245, 128, 0, 0, -245, -2, 0, 0, + 0, 0, 642, 0, 0, 0, -15, 0, -12, -239, + 0, 590, 0, -27, 0, 0, 0, 0, -10, 0, + -11, 534, -72, 0, -237, -232, 0, -35, -232, 0, + 0, 0, 642, 0, 0, 0, 455, 0, 0, 0, + 0, 27, 0, 534, 0, 0, -222, 617, 209, 34, + 39, 0, 44, 42, 0, 0, 0, 0, 27, -11, + 0, -200, -196, -195, 0, 174, 0, 0, 0, -33, + 243, 0, 561, 0, -177, 0, 33, 49, 0, 0, + 0, 0, 53, 55, 417, 0, -33, 0, 0, 0, + 0, 27, -188, 0, 0, 0, 57, 0, 0, 0, +}; +static const short yyrindex[] = { 99, + 0, 0, 275, 0, 0, -38, 0, 0, 481, 0, + 0, 0, 0, 509, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 30, 0, 0, 0, 0, 0, 101, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 343, 309, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 98, -182, 62, 0, 0, 133, 0, 64, 379, 0, + 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -182, 0, 0, 0, -180, -19, 0, + 65, 0, 0, 68, 0, 0, 0, 0, 51, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -13, + 19, 0, 0, 0, 0, 0, 0, 52, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +static const short yygindex[] = { 0, + 11, -17, 0, 0, 13, 0, 0, 0, 20, 8, + -43, -1, -8, -89, 0, -9, 0, 0, 0, -44, + 0, 0, 4, 0, 0, 0, 70, -53, 0, 0, + -18, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, +}; +#define YYTABLESIZE 924 +static const short yytable[] = { 58, + 78, 58, 58, 58, 73, 58, 135, 61, 88, 57, + 34, 5, 56, 62, 85, 58, 68, 63, 96, 7, + 58, 98, 78, 64, 98, 84, 134, 107, 80, 3, + 107, 90, 17, 92, 17, 4, 17, 2, 75, 3, + 96, 71, 30, 89, 115, 147, 76, 106, 91, 93, + 79, 75, 70, 17, 121, 55, 32, 107, 34, 105, + 108, 114, 105, 83, 4, 68, 2, 70, 3, 68, + 80, 121, 86, 80, 122, 106, 105, 78, 106, 5, + 56, 68, 123, 99, 124, 125, 129, 130, 80, 131, + 80, 141, 142, 144, 110, 145, 149, 150, 1, 110, + 2, 30, 99, 32, 79, 92, 118, 79, 100, 21, + 22, 111, 137, 139, 133, 113, 126, 81, 0, 0, + 0, 0, 79, 57, 79, 0, 99, 0, 140, 0, + 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, + 0, 70, 0, 0, 0, 99, 0, 0, 0, 148, + 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, + 65, 0, 65, 65, 65, 0, 65, 0, 0, 0, + 0, 0, 0, 0, 5, 6, 7, 8, 65, 10, + 11, 65, 13, 66, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 0, 4, 0, 116, 132, 3, 0, 0, 58, 58, + 58, 58, 58, 58, 58, 78, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 78, 4, 74, 116, 136, + 3, 17, 78, 1, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 4, 54, 116, 5, 56, 0, 31, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 88, 80, 88, 88, 88, 0, 88, 0, + 80, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 89, 79, 89, 89, + 89, 0, 89, 0, 79, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 86, 25, 86, 86, 5, 56, 86, 0, 25, 65, + 65, 65, 65, 65, 65, 65, 0, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 75, 0, 75, 75, + 75, 0, 75, 0, 0, 0, 0, 0, 0, 0, + 5, 6, 7, 8, 65, 10, 11, 75, 13, 66, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 117, 146, 0, 0, + 0, 0, 0, 0, 0, 5, 6, 7, 8, 65, + 10, 11, 0, 13, 66, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 117, 4, 0, 2, 0, 3, 0, 0, 5, + 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 67, 0, 0, 0, 0, 41, 0, + 41, 0, 41, 0, 0, 117, 0, 0, 0, 0, + 0, 88, 88, 0, 0, 0, 0, 0, 0, 41, + 0, 0, 0, 0, 0, 0, 45, 0, 45, 0, + 45, 0, 0, 0, 0, 0, 0, 88, 0, 0, + 0, 0, 0, 0, 0, 89, 89, 45, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 89, 0, 0, 0, 0, 0, 0, 0, 86, + 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 75, 75, 75, 75, 75, + 75, 75, 0, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 7, 8, 65, 10, 11, + 0, 13, 66, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 6, 7, 8, 65, 10, 11, 0, 13, + 66, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 41, 41, 41, + 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 0, 0, 45, 45, 45, 45, 45, + 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 82, 7, 8, 65, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 0, 0, 82, 7, + 8, 65, 10, 11, 95, 13, 66, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 0, 0, 0, 138, 82, 7, 8, + 65, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 0, 75, 82, 7, 8, 65, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 82, + 7, 8, 65, 10, 11, 0, 13, 66, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, +}; +static const short yycheck[] = { 38, + 44, 40, 41, 42, 40, 44, 40, 4, 62, 2, + 0, 257, 258, 288, 59, 3, 34, 264, 72, 259, + 59, 41, 61, 290, 44, 41, 116, 41, 47, 42, + 44, 59, 38, 44, 40, 38, 42, 40, 284, 42, + 94, 34, 282, 62, 98, 135, 43, 285, 59, 61, + 47, 284, 44, 59, 99, 59, 59, 76, 48, 41, + 79, 284, 44, 53, 38, 83, 40, 59, 42, 87, + 41, 116, 60, 44, 41, 41, 73, 121, 44, 257, + 258, 99, 44, 73, 41, 44, 287, 284, 59, 285, + 61, 59, 44, 41, 87, 41, 285, 41, 0, 92, + 0, 284, 41, 284, 41, 41, 99, 44, 41, 59, + 59, 92, 121, 123, 116, 94, 109, 48, -1, -1, + -1, -1, 59, 116, 61, -1, 116, -1, 125, -1, + -1, -1, -1, 123, -1, -1, -1, -1, -1, -1, + -1, 44, -1, -1, -1, 135, -1, -1, -1, 142, + -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, + -1, -1, -1, -1, -1, 38, -1, 40, -1, -1, + 38, -1, 40, 41, 42, -1, 44, -1, -1, -1, + -1, -1, -1, -1, 257, 258, 259, 260, 261, 262, + 263, 59, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + -1, 38, -1, 40, 41, 42, -1, -1, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 38, 283, 40, 283, + 42, 257, 291, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 38, 285, 40, 257, 258, -1, 289, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 38, 284, 40, 41, 42, -1, 44, -1, + 291, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 38, 284, 40, 41, + 42, -1, 44, -1, 291, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 38, 284, 40, 41, 257, 258, 44, -1, 291, 257, + 258, 259, 260, 261, 262, 263, -1, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 38, -1, 40, 41, + 42, -1, 44, -1, -1, -1, -1, -1, -1, -1, + 257, 258, 259, 260, 261, 262, 263, 59, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 41, -1, -1, + -1, -1, -1, -1, -1, 257, 258, 259, 260, 261, + 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 38, -1, 40, -1, 42, -1, -1, 257, + 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 59, -1, -1, -1, -1, 38, -1, + 40, -1, 42, -1, -1, 283, -1, -1, -1, -1, + -1, 257, 258, -1, -1, -1, -1, -1, -1, 59, + -1, -1, -1, -1, -1, -1, 38, -1, 40, -1, + 42, -1, -1, -1, -1, -1, -1, 283, -1, -1, + -1, -1, -1, -1, -1, 257, 258, 59, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 283, -1, -1, -1, -1, -1, -1, -1, 257, + 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 283, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, 258, 259, 260, 261, + 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 258, 259, 260, 261, 262, 263, + -1, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 257, 258, 259, 260, 261, 262, 263, -1, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 257, 258, 259, + 260, 261, 262, 263, -1, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, -1, -1, 257, 258, 259, 260, 261, + 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, -1, -1, 258, 259, + 260, 261, 262, 263, 291, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, -1, -1, -1, 286, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, -1, 284, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 258, + 259, 260, 261, 262, 263, -1, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, +}; +#define YYFINAL 33 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 291 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,"'&'",0,"'('","')'","'*'",0,"','",0,0,0,0,0,0,0,0,0,0,0,0,0,0,"';'",0, +"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +"T_IDENTIFIER","T_TYPEDEF_NAME","T_DEFINE_NAME","T_AUTO","T_EXTERN", +"T_REGISTER","T_STATIC","T_TYPEDEF","T_INLINE","T_EXTENSION","T_CHAR", +"T_DOUBLE","T_FLOAT","T_INT","T_VOID","T_LONG","T_SHORT","T_SIGNED", +"T_UNSIGNED","T_ENUM","T_STRUCT","T_UNION","T_Bool","T_Complex","T_Imaginary", +"T_TYPE_QUALIFIER","T_BRACKETS","T_LBRACE","T_MATCHRBRACE","T_ELLIPSIS", +"T_INITIALIZER","T_STRING_LITERAL","T_ASM","T_ASMARG","T_VA_DCL", +}; +static const char *yyrule[] = { +"$accept : program", +"program :", +"program : translation_unit", +"translation_unit : external_declaration", +"translation_unit : translation_unit external_declaration", +"external_declaration : declaration", +"external_declaration : function_definition", +"external_declaration : ';'", +"external_declaration : linkage_specification", +"external_declaration : T_ASM T_ASMARG ';'", +"external_declaration : error T_MATCHRBRACE", +"external_declaration : error ';'", +"braces : T_LBRACE T_MATCHRBRACE", +"linkage_specification : T_EXTERN T_STRING_LITERAL braces", +"linkage_specification : T_EXTERN T_STRING_LITERAL declaration", +"declaration : decl_specifiers ';'", +"declaration : decl_specifiers init_declarator_list ';'", +"$$1 :", +"declaration : any_typedef decl_specifiers $$1 opt_declarator_list ';'", +"any_typedef : T_EXTENSION T_TYPEDEF", +"any_typedef : T_TYPEDEF", +"opt_declarator_list :", +"opt_declarator_list : declarator_list", +"declarator_list : declarator", +"declarator_list : declarator_list ',' declarator", +"$$2 :", +"$$3 :", +"function_definition : decl_specifiers declarator $$2 opt_declaration_list T_LBRACE $$3 T_MATCHRBRACE", +"$$4 :", +"function_definition : declarator $$4 opt_declaration_list T_LBRACE T_MATCHRBRACE", +"opt_declaration_list :", +"opt_declaration_list : T_VA_DCL", +"opt_declaration_list : declaration_list", +"declaration_list : declaration", +"declaration_list : declaration_list declaration", +"decl_specifiers : decl_specifier", +"decl_specifiers : decl_specifiers decl_specifier", +"decl_specifier : storage_class", +"decl_specifier : type_specifier", +"decl_specifier : type_qualifier", +"storage_class : T_AUTO", +"storage_class : T_EXTERN", +"storage_class : T_REGISTER", +"storage_class : T_STATIC", +"storage_class : T_INLINE", +"storage_class : T_EXTENSION", +"type_specifier : T_CHAR", +"type_specifier : T_DOUBLE", +"type_specifier : T_FLOAT", +"type_specifier : T_INT", +"type_specifier : T_LONG", +"type_specifier : T_SHORT", +"type_specifier : T_SIGNED", +"type_specifier : T_UNSIGNED", +"type_specifier : T_VOID", +"type_specifier : T_Bool", +"type_specifier : T_Complex", +"type_specifier : T_Imaginary", +"type_specifier : T_TYPEDEF_NAME", +"type_specifier : struct_or_union_specifier", +"type_specifier : enum_specifier", +"type_qualifier : T_TYPE_QUALIFIER", +"type_qualifier : T_DEFINE_NAME", +"struct_or_union_specifier : struct_or_union any_id braces", +"struct_or_union_specifier : struct_or_union braces", +"struct_or_union_specifier : struct_or_union any_id", +"struct_or_union : T_STRUCT", +"struct_or_union : T_UNION", +"init_declarator_list : init_declarator", +"init_declarator_list : init_declarator_list ',' init_declarator", +"init_declarator : declarator", +"$$5 :", +"init_declarator : declarator '=' $$5 T_INITIALIZER", +"enum_specifier : enumeration any_id braces", +"enum_specifier : enumeration braces", +"enum_specifier : enumeration any_id", +"enumeration : T_ENUM", +"any_id : T_IDENTIFIER", +"any_id : T_TYPEDEF_NAME", +"declarator : pointer direct_declarator", +"declarator : direct_declarator", +"direct_declarator : identifier_or_ref", +"direct_declarator : '(' declarator ')'", +"direct_declarator : direct_declarator T_BRACKETS", +"direct_declarator : direct_declarator '(' parameter_type_list ')'", +"direct_declarator : direct_declarator '(' opt_identifier_list ')'", +"pointer : '*' opt_type_qualifiers", +"pointer : '*' opt_type_qualifiers pointer", +"opt_type_qualifiers :", +"opt_type_qualifiers : type_qualifier_list", +"type_qualifier_list : type_qualifier", +"type_qualifier_list : type_qualifier_list type_qualifier", +"parameter_type_list : parameter_list", +"parameter_type_list : parameter_list ',' T_ELLIPSIS", +"parameter_list : parameter_declaration", +"parameter_list : parameter_list ',' parameter_declaration", +"parameter_declaration : decl_specifiers declarator", +"parameter_declaration : decl_specifiers abs_declarator", +"parameter_declaration : decl_specifiers", +"opt_identifier_list :", +"opt_identifier_list : identifier_list", +"identifier_list : any_id", +"identifier_list : identifier_list ',' any_id", +"identifier_or_ref : any_id", +"identifier_or_ref : '&' any_id", +"abs_declarator : pointer", +"abs_declarator : pointer direct_abs_declarator", +"abs_declarator : direct_abs_declarator", +"direct_abs_declarator : '(' abs_declarator ')'", +"direct_abs_declarator : direct_abs_declarator T_BRACKETS", +"direct_abs_declarator : T_BRACKETS", +"direct_abs_declarator : direct_abs_declarator '(' parameter_type_list ')'", +"direct_abs_declarator : direct_abs_declarator '(' ')'", +"direct_abs_declarator : '(' parameter_type_list ')'", +"direct_abs_declarator : '(' ')'", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 1014 "grammar.y" + +/* lex.yy.c */ +#define BEGIN yy_start = 1 + 2 * + +#define CPP1 1 +#define INIT1 2 +#define INIT2 3 +#define CURLY 4 +#define LEXYACC 5 +#define ASM 6 +#define CPP_INLINE 7 + +extern char *yytext; +extern FILE *yyin, *yyout; + +static int curly; /* number of curly brace nesting levels */ +static int ly_count; /* number of occurances of %% */ +static int inc_depth; /* include nesting level */ +static SymbolTable *included_files; /* files already included */ +static int yy_start = 0; /* start state number */ + +#define grammar_error(s) yaccError(s) + +static void +yaccError (const char *msg) +{ + func_params = NULL; + put_error(); /* tell what line we're on, and what file */ + fprintf(stderr, "%s at token '%s'\n", msg, yytext); +} + +/* Initialize the table of type qualifier keywords recognized by the lexical + * analyzer. + */ +void +init_parser (void) +{ + static const char *keywords[] = { + "const", + "restrict", + "volatile", + "interrupt", +#ifdef vms + "noshare", + "readonly", +#endif +#if defined(MSDOS) || defined(OS2) + "__cdecl", + "__export", + "__far", + "__fastcall", + "__fortran", + "__huge", + "__inline", + "__interrupt", + "__loadds", + "__near", + "__pascal", + "__saveregs", + "__segment", + "__stdcall", + "__syscall", + "_cdecl", + "_cs", + "_ds", + "_es", + "_export", + "_far", + "_fastcall", + "_fortran", + "_huge", + "_interrupt", + "_loadds", + "_near", + "_pascal", + "_saveregs", + "_seg", + "_segment", + "_ss", + "cdecl", + "far", + "huge", + "near", + "pascal", +#ifdef OS2 + "__far16", +#endif +#endif +#ifdef __GNUC__ + /* gcc aliases */ + "__builtin_va_arg", + "__builtin_va_list", + "__const", + "__const__", + "__inline", + "__inline__", + "__restrict", + "__restrict__", + "__volatile", + "__volatile__", +#endif + }; + unsigned i; + + /* Initialize type qualifier table. */ + type_qualifiers = new_symbol_table(); + for (i = 0; i < sizeof(keywords)/sizeof(keywords[0]); ++i) { + new_symbol(type_qualifiers, keywords[i], NULL, DS_NONE); + } +} + +/* Process the C source file. Write function prototypes to the standard + * output. Convert function definitions and write the converted source + * code to a temporary file. + */ +void +process_file (FILE *infile, char *name) +{ + char *s; + + if (strlen(name) > 2) { + s = name + strlen(name) - 2; + if (*s == '.') { + ++s; + if (*s == 'l' || *s == 'y') + BEGIN LEXYACC; +#if defined(MSDOS) || defined(OS2) + if (*s == 'L' || *s == 'Y') + BEGIN LEXYACC; +#endif + } + } + + included_files = new_symbol_table(); + typedef_names = new_symbol_table(); + define_names = new_symbol_table(); + inc_depth = -1; + curly = 0; + ly_count = 0; + func_params = NULL; + yyin = infile; + include_file(strcpy(base_file, name), func_style != FUNC_NONE); + if (file_comments) { +#if OPT_LINTLIBRARY + if (lintLibrary()) { + put_blankline(stdout); + begin_tracking(); + } +#endif + put_string(stdout, "/* "); + put_string(stdout, cur_file_name()); + put_string(stdout, " */\n"); + } + yyparse(); + free_symbol_table(define_names); + free_symbol_table(typedef_names); + free_symbol_table(included_files); +} + +#ifdef NO_LEAKS +void +free_parser(void) +{ + free_symbol_table (type_qualifiers); +#ifdef FLEX_SCANNER + if (yy_current_buffer != 0) + yy_delete_buffer(yy_current_buffer); +#endif +} +#endif +#line 1004 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 10: +#line 377 "grammar.y" + { + yyerrok; + } +break; +case 11: +#line 381 "grammar.y" + { + yyerrok; + } +break; +case 13: +#line 392 "grammar.y" + { + /* Provide an empty action here so bison will not complain about + * incompatible types in the default action it normally would + * have generated. + */ + } +break; +case 14: +#line 399 "grammar.y" + { + /* empty */ + } +break; +case 15: +#line 406 "grammar.y" + { +#if OPT_LINTLIBRARY + if (types_out && want_typedef()) { + gen_declarations(&yystack.l_mark[-1].decl_spec, (DeclaratorList *)0); + flush_varargs(); + } +#endif + free_decl_spec(&yystack.l_mark[-1].decl_spec); + end_typedef(); + } +break; +case 16: +#line 417 "grammar.y" + { + if (func_params != NULL) { + set_param_types(func_params, &yystack.l_mark[-2].decl_spec, &yystack.l_mark[-1].decl_list); + } else { + gen_declarations(&yystack.l_mark[-2].decl_spec, &yystack.l_mark[-1].decl_list); +#if OPT_LINTLIBRARY + flush_varargs(); +#endif + free_decl_list(&yystack.l_mark[-1].decl_list); + } + free_decl_spec(&yystack.l_mark[-2].decl_spec); + end_typedef(); + } +break; +case 17: +#line 431 "grammar.y" + { + cur_decl_spec_flags = yystack.l_mark[0].decl_spec.flags; + free_decl_spec(&yystack.l_mark[0].decl_spec); + } +break; +case 18: +#line 436 "grammar.y" + { + end_typedef(); + } +break; +case 19: +#line 443 "grammar.y" + { + begin_typedef(); + } +break; +case 20: +#line 447 "grammar.y" + { + begin_typedef(); + } +break; +case 23: +#line 459 "grammar.y" + { + int flags = cur_decl_spec_flags; + + /* If the typedef is a pointer type, then reset the short type + * flags so it does not get promoted. + */ + if (strcmp(yystack.l_mark[0].declarator->text, yystack.l_mark[0].declarator->name) != 0) + flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT); + new_symbol(typedef_names, yystack.l_mark[0].declarator->name, NULL, flags); + free_declarator(yystack.l_mark[0].declarator); + } +break; +case 24: +#line 471 "grammar.y" + { + int flags = cur_decl_spec_flags; + + if (strcmp(yystack.l_mark[0].declarator->text, yystack.l_mark[0].declarator->name) != 0) + flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT); + new_symbol(typedef_names, yystack.l_mark[0].declarator->name, NULL, flags); + free_declarator(yystack.l_mark[0].declarator); + } +break; +case 25: +#line 483 "grammar.y" + { + check_untagged(&yystack.l_mark[-1].decl_spec); + if (yystack.l_mark[0].declarator->func_def == FUNC_NONE) { + yyerror("syntax error"); + YYERROR; + } + func_params = &(yystack.l_mark[0].declarator->head->params); + func_params->begin_comment = cur_file->begin_comment; + func_params->end_comment = cur_file->end_comment; + } +break; +case 26: +#line 494 "grammar.y" + { + /* If we're converting to K&R and we've got a nominally K&R + * function which has a parameter which is ANSI (i.e., a prototyped + * function pointer), then we must override the deciphered value of + * 'func_def' so that the parameter will be converted. + */ + if (func_style == FUNC_TRADITIONAL + && haveAnsiParam() + && yystack.l_mark[-3].declarator->head->func_def == func_style) { + yystack.l_mark[-3].declarator->head->func_def = FUNC_BOTH; + } + + func_params = NULL; + + if (cur_file->convert) + gen_func_definition(&yystack.l_mark[-4].decl_spec, yystack.l_mark[-3].declarator); + gen_prototype(&yystack.l_mark[-4].decl_spec, yystack.l_mark[-3].declarator); +#if OPT_LINTLIBRARY + flush_varargs(); +#endif + free_decl_spec(&yystack.l_mark[-4].decl_spec); + free_declarator(yystack.l_mark[-3].declarator); + } +break; +case 28: +#line 519 "grammar.y" + { + if (yystack.l_mark[0].declarator->func_def == FUNC_NONE) { + yyerror("syntax error"); + YYERROR; + } + func_params = &(yystack.l_mark[0].declarator->head->params); + func_params->begin_comment = cur_file->begin_comment; + func_params->end_comment = cur_file->end_comment; + } +break; +case 29: +#line 529 "grammar.y" + { + DeclSpec decl_spec; + + func_params = NULL; + + new_decl_spec(&decl_spec, dft_decl_spec(), yystack.l_mark[-4].declarator->begin, DS_NONE); + if (cur_file->convert) + gen_func_definition(&decl_spec, yystack.l_mark[-4].declarator); + gen_prototype(&decl_spec, yystack.l_mark[-4].declarator); +#if OPT_LINTLIBRARY + flush_varargs(); +#endif + free_decl_spec(&decl_spec); + free_declarator(yystack.l_mark[-4].declarator); + } +break; +case 36: +#line 560 "grammar.y" + { + join_decl_specs(&yyval.decl_spec, &yystack.l_mark[-1].decl_spec, &yystack.l_mark[0].decl_spec); + free(yystack.l_mark[-1].decl_spec.text); + free(yystack.l_mark[0].decl_spec.text); + } +break; +case 40: +#line 575 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 41: +#line 579 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_EXTERN); + } +break; +case 42: +#line 583 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 43: +#line 587 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_STATIC); + } +break; +case 44: +#line 591 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_INLINE); + } +break; +case 45: +#line 595 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_JUNK); + } +break; +case 46: +#line 602 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_CHAR); + } +break; +case 47: +#line 606 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 48: +#line 610 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_FLOAT); + } +break; +case 49: +#line 614 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 50: +#line 618 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 51: +#line 622 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_SHORT); + } +break; +case 52: +#line 626 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 53: +#line 630 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 54: +#line 634 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 55: +#line 638 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_CHAR); + } +break; +case 56: +#line 642 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 57: +#line 646 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 58: +#line 650 "grammar.y" + { + Symbol *s; + s = find_symbol(typedef_names, yystack.l_mark[0].text.text); + if (s != NULL) + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, s->flags); + } +break; +case 61: +#line 662 "grammar.y" + { + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); + } +break; +case 62: +#line 666 "grammar.y" + { + /* This rule allows the nonterminal to scan #define + * names as if they were type modifiers. + */ + Symbol *s; + s = find_symbol(define_names, yystack.l_mark[0].text.text); + if (s != NULL) + new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, s->flags); + } +break; +case 63: +#line 679 "grammar.y" + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "%s %s", yystack.l_mark[-2].text.text, yystack.l_mark[-1].text.text); + new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-2].text.begin, DS_NONE); + } +break; +case 64: +#line 686 "grammar.y" + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "%s {}", yystack.l_mark[-1].text.text); + new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-1].text.begin, DS_NONE); + } +break; +case 65: +#line 693 "grammar.y" + { + (void)sprintf(buf, "%s %s", yystack.l_mark[-1].text.text, yystack.l_mark[0].text.text); + new_decl_spec(&yyval.decl_spec, buf, yystack.l_mark[-1].text.begin, DS_NONE); + } +break; +case 66: +#line 701 "grammar.y" + { + imply_typedef(yyval.text.text); + } +break; +case 67: +#line 705 "grammar.y" + { + imply_typedef(yyval.text.text); + } +break; +case 68: +#line 712 "grammar.y" + { + new_decl_list(&yyval.decl_list, yystack.l_mark[0].declarator); + } +break; +case 69: +#line 716 "grammar.y" + { + add_decl_list(&yyval.decl_list, &yystack.l_mark[-2].decl_list, yystack.l_mark[0].declarator); + } +break; +case 70: +#line 723 "grammar.y" + { + if (yystack.l_mark[0].declarator->func_def != FUNC_NONE && func_params == NULL && + func_style == FUNC_TRADITIONAL && cur_file->convert) { + gen_func_declarator(yystack.l_mark[0].declarator); + fputs(cur_text(), cur_file->tmp_file); + } + cur_declarator = yyval.declarator; + } +break; +case 71: +#line 732 "grammar.y" + { + if (yystack.l_mark[-1].declarator->func_def != FUNC_NONE && func_params == NULL && + func_style == FUNC_TRADITIONAL && cur_file->convert) { + gen_func_declarator(yystack.l_mark[-1].declarator); + fputs(" =", cur_file->tmp_file); + } + } +break; +case 73: +#line 744 "grammar.y" + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "enum %s", yystack.l_mark[-1].text.text); + new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-2].text.begin, DS_NONE); + } +break; +case 74: +#line 751 "grammar.y" + { + char *s; + if ((s = implied_typedef()) == 0) + (void)sprintf(s = buf, "%s {}", yystack.l_mark[-1].text.text); + new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-1].text.begin, DS_NONE); + } +break; +case 75: +#line 758 "grammar.y" + { + (void)sprintf(buf, "enum %s", yystack.l_mark[0].text.text); + new_decl_spec(&yyval.decl_spec, buf, yystack.l_mark[-1].text.begin, DS_NONE); + } +break; +case 76: +#line 766 "grammar.y" + { + imply_typedef("enum"); + yyval.text = yystack.l_mark[0].text; + } +break; +case 79: +#line 779 "grammar.y" + { + yyval.declarator = yystack.l_mark[0].declarator; + (void)sprintf(buf, "%s%s", yystack.l_mark[-1].text.text, yyval.declarator->text); + free(yyval.declarator->text); + yyval.declarator->text = xstrdup(buf); + yyval.declarator->begin = yystack.l_mark[-1].text.begin; + yyval.declarator->pointer = TRUE; + } +break; +case 81: +#line 792 "grammar.y" + { + yyval.declarator = new_declarator(yystack.l_mark[0].text.text, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin); + } +break; +case 82: +#line 796 "grammar.y" + { + yyval.declarator = yystack.l_mark[-1].declarator; + (void)sprintf(buf, "(%s)", yyval.declarator->text); + free(yyval.declarator->text); + yyval.declarator->text = xstrdup(buf); + yyval.declarator->begin = yystack.l_mark[-2].text.begin; + } +break; +case 83: +#line 804 "grammar.y" + { + yyval.declarator = yystack.l_mark[-1].declarator; + (void)sprintf(buf, "%s%s", yyval.declarator->text, yystack.l_mark[0].text.text); + free(yyval.declarator->text); + yyval.declarator->text = xstrdup(buf); + } +break; +case 84: +#line 811 "grammar.y" + { + yyval.declarator = new_declarator("%s()", yystack.l_mark[-3].declarator->name, yystack.l_mark[-3].declarator->begin); + yyval.declarator->params = yystack.l_mark[-1].param_list; + yyval.declarator->func_stack = yystack.l_mark[-3].declarator; + yyval.declarator->head = (yystack.l_mark[-3].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-3].declarator->head; + yyval.declarator->func_def = FUNC_ANSI; + } +break; +case 85: +#line 819 "grammar.y" + { + yyval.declarator = new_declarator("%s()", yystack.l_mark[-3].declarator->name, yystack.l_mark[-3].declarator->begin); + yyval.declarator->params = yystack.l_mark[-1].param_list; + yyval.declarator->func_stack = yystack.l_mark[-3].declarator; + yyval.declarator->head = (yystack.l_mark[-3].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-3].declarator->head; + yyval.declarator->func_def = FUNC_TRADITIONAL; + } +break; +case 86: +#line 830 "grammar.y" + { + (void)sprintf(yyval.text.text, "*%s", yystack.l_mark[0].text.text); + yyval.text.begin = yystack.l_mark[-1].text.begin; + } +break; +case 87: +#line 835 "grammar.y" + { + (void)sprintf(yyval.text.text, "*%s%s", yystack.l_mark[-1].text.text, yystack.l_mark[0].text.text); + yyval.text.begin = yystack.l_mark[-2].text.begin; + } +break; +case 88: +#line 843 "grammar.y" + { + strcpy(yyval.text.text, ""); + yyval.text.begin = 0L; + } +break; +case 90: +#line 852 "grammar.y" + { + (void)sprintf(yyval.text.text, "%s ", yystack.l_mark[0].decl_spec.text); + yyval.text.begin = yystack.l_mark[0].decl_spec.begin; + free(yystack.l_mark[0].decl_spec.text); + } +break; +case 91: +#line 858 "grammar.y" + { + (void)sprintf(yyval.text.text, "%s%s ", yystack.l_mark[-1].text.text, yystack.l_mark[0].decl_spec.text); + yyval.text.begin = yystack.l_mark[-1].text.begin; + free(yystack.l_mark[0].decl_spec.text); + } +break; +case 93: +#line 868 "grammar.y" + { + add_ident_list(&yyval.param_list, &yystack.l_mark[-2].param_list, "..."); + } +break; +case 94: +#line 875 "grammar.y" + { + new_param_list(&yyval.param_list, yystack.l_mark[0].parameter); + } +break; +case 95: +#line 879 "grammar.y" + { + add_param_list(&yyval.param_list, &yystack.l_mark[-2].param_list, yystack.l_mark[0].parameter); + } +break; +case 96: +#line 886 "grammar.y" + { + check_untagged(&yystack.l_mark[-1].decl_spec); + yyval.parameter = new_parameter(&yystack.l_mark[-1].decl_spec, yystack.l_mark[0].declarator); + } +break; +case 97: +#line 891 "grammar.y" + { + check_untagged(&yystack.l_mark[-1].decl_spec); + yyval.parameter = new_parameter(&yystack.l_mark[-1].decl_spec, yystack.l_mark[0].declarator); + } +break; +case 98: +#line 896 "grammar.y" + { + check_untagged(&yystack.l_mark[0].decl_spec); + yyval.parameter = new_parameter(&yystack.l_mark[0].decl_spec, (Declarator *)0); + } +break; +case 99: +#line 904 "grammar.y" + { + new_ident_list(&yyval.param_list); + } +break; +case 101: +#line 912 "grammar.y" + { + new_ident_list(&yyval.param_list); + add_ident_list(&yyval.param_list, &yyval.param_list, yystack.l_mark[0].text.text); + } +break; +case 102: +#line 917 "grammar.y" + { + add_ident_list(&yyval.param_list, &yystack.l_mark[-2].param_list, yystack.l_mark[0].text.text); + } +break; +case 103: +#line 924 "grammar.y" + { + yyval.text = yystack.l_mark[0].text; + } +break; +case 104: +#line 928 "grammar.y" + { +#if OPT_LINTLIBRARY + if (lintLibrary()) { /* Lint doesn't grok C++ ref variables */ + yyval.text = yystack.l_mark[0].text; + } else +#endif + (void)sprintf(yyval.text.text, "&%s", yystack.l_mark[0].text.text); + yyval.text.begin = yystack.l_mark[-1].text.begin; + } +break; +case 105: +#line 941 "grammar.y" + { + yyval.declarator = new_declarator(yystack.l_mark[0].text.text, "", yystack.l_mark[0].text.begin); + } +break; +case 106: +#line 945 "grammar.y" + { + yyval.declarator = yystack.l_mark[0].declarator; + (void)sprintf(buf, "%s%s", yystack.l_mark[-1].text.text, yyval.declarator->text); + free(yyval.declarator->text); + yyval.declarator->text = xstrdup(buf); + yyval.declarator->begin = yystack.l_mark[-1].text.begin; + } +break; +case 108: +#line 957 "grammar.y" + { + yyval.declarator = yystack.l_mark[-1].declarator; + (void)sprintf(buf, "(%s)", yyval.declarator->text); + free(yyval.declarator->text); + yyval.declarator->text = xstrdup(buf); + yyval.declarator->begin = yystack.l_mark[-2].text.begin; + } +break; +case 109: +#line 965 "grammar.y" + { + yyval.declarator = yystack.l_mark[-1].declarator; + (void)sprintf(buf, "%s%s", yyval.declarator->text, yystack.l_mark[0].text.text); + free(yyval.declarator->text); + yyval.declarator->text = xstrdup(buf); + } +break; +case 110: +#line 972 "grammar.y" + { + yyval.declarator = new_declarator(yystack.l_mark[0].text.text, "", yystack.l_mark[0].text.begin); + } +break; +case 111: +#line 976 "grammar.y" + { + yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-3].declarator->begin); + yyval.declarator->params = yystack.l_mark[-1].param_list; + yyval.declarator->func_stack = yystack.l_mark[-3].declarator; + yyval.declarator->head = (yystack.l_mark[-3].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-3].declarator->head; + yyval.declarator->func_def = FUNC_ANSI; + } +break; +case 112: +#line 984 "grammar.y" + { + yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-2].declarator->begin); + yyval.declarator->func_stack = yystack.l_mark[-2].declarator; + yyval.declarator->head = (yystack.l_mark[-2].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-2].declarator->head; + yyval.declarator->func_def = FUNC_ANSI; + } +break; +case 113: +#line 991 "grammar.y" + { + Declarator *d; + + d = new_declarator("", "", yystack.l_mark[-2].text.begin); + yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-2].text.begin); + yyval.declarator->params = yystack.l_mark[-1].param_list; + yyval.declarator->func_stack = d; + yyval.declarator->head = yyval.declarator; + yyval.declarator->func_def = FUNC_ANSI; + } +break; +case 114: +#line 1002 "grammar.y" + { + Declarator *d; + + d = new_declarator("", "", yystack.l_mark[-1].text.begin); + yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-1].text.begin); + yyval.declarator->func_stack = d; + yyval.declarator->head = yyval.declarator; + yyval.declarator->func_def = FUNC_ANSI; + } +break; +#line 1884 "/dev/stdout" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.09.out b/tools/regression/usr.bin/yacc/regress.09.out new file mode 100644 index 00000000000..5eaf2588b1b --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.09.out @@ -0,0 +1,603 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 2 "pure_calc.y" +# include +# include + +int regs[26]; +int base; + +#ifdef YYBISON +#define YYSTYPE int +#define YYLEX_PARAM &yylval +#define YYLEX_DECL() yylex(YYSTYPE *yylval) +#define YYERROR_DECL() yyerror(const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +#line 34 "/dev/stdout" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define DIGIT 257 +#define LETTER 258 +#define UMINUS 259 +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short yylen[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short yydefred[] = { 1, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 3, + 0, 15, 14, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 9, + 10, 11, +}; +static const short yydgoto[] = { 1, + 7, 8, 9, +}; +static const short yysindex[] = { 0, + -40, -7, 0, -55, -38, -38, 1, -29, -247, 0, + -38, 0, 0, 22, 0, -38, -38, -38, -38, -38, + -38, -38, 0, -29, 0, 51, 60, -20, -20, 0, + 0, 0, +}; +static const short yyrindex[] = { 0, + 0, 0, 0, 2, 0, 0, 0, 9, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, -6, 14, 5, 13, 0, + 0, 0, +}; +static const short yygindex[] = { 0, + 0, 65, 0, +}; +#define YYTABLESIZE 220 +static const short yytable[] = { 6, + 16, 6, 10, 13, 5, 11, 5, 22, 17, 23, + 15, 15, 20, 18, 7, 19, 22, 21, 4, 5, + 0, 20, 8, 12, 0, 0, 21, 16, 16, 0, + 0, 16, 16, 16, 13, 16, 0, 16, 15, 15, + 0, 0, 7, 15, 15, 7, 15, 7, 15, 7, + 8, 12, 0, 8, 12, 8, 0, 8, 22, 17, + 0, 0, 25, 20, 18, 0, 19, 0, 21, 13, + 14, 0, 0, 0, 0, 24, 0, 0, 0, 0, + 26, 27, 28, 29, 30, 31, 32, 22, 17, 0, + 0, 0, 20, 18, 16, 19, 22, 21, 0, 0, + 0, 20, 18, 0, 19, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 8, 12, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 3, 12, +}; +static const short yycheck[] = { 40, + 10, 40, 10, 10, 45, 61, 45, 37, 38, 257, + 10, 10, 42, 43, 10, 45, 37, 47, 10, 10, + -1, 42, 10, 10, -1, -1, 47, 37, 38, -1, + -1, 41, 42, 43, 41, 45, -1, 47, 37, 38, + -1, -1, 38, 42, 43, 41, 45, 43, 47, 45, + 38, 38, -1, 41, 41, 43, -1, 45, 37, 38, + -1, -1, 41, 42, 43, -1, 45, -1, 47, 5, + 6, -1, -1, -1, -1, 11, -1, -1, -1, -1, + 16, 17, 18, 19, 20, 21, 22, 37, 38, -1, + -1, -1, 42, 43, 124, 45, 37, 47, -1, -1, + -1, 42, 43, -1, 45, -1, 47, -1, -1, -1, + -1, -1, -1, -1, 124, -1, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 124, 124, -1, -1, + -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 256, 257, 258, 257, 258, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 259 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr '+' expr", +"expr : expr '-' expr", +"expr : expr '*' expr", +"expr : expr '/' expr", +"expr : expr '%' expr", +"expr : expr '&' expr", +"expr : expr '|' expr", +"expr : '-' expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 72 "pure_calc.y" + /* start of programs */ + +#ifdef YYBYACC +static int YYLEX_DECL(); +#endif + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +YYERROR_DECL() +{ + fprintf(stderr, "%s\n", s); +} + +int +YYLEX_DECL() +{ + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + *yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + *yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 276 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 34 "pure_calc.y" + { yyerrok ; } +break; +case 4: +#line 38 "pure_calc.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 40 "pure_calc.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 44 "pure_calc.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 46 "pure_calc.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 48 "pure_calc.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 50 "pure_calc.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 52 "pure_calc.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 54 "pure_calc.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 56 "pure_calc.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 58 "pure_calc.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 60 "pure_calc.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 62 "pure_calc.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 67 "pure_calc.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 69 "pure_calc.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 542 "/dev/stdout" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.10.out b/tools/regression/usr.bin/yacc/regress.10.out new file mode 100644 index 00000000000..02cba4fe681 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.10.out @@ -0,0 +1,433 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 2 "pure_error.y" + +#ifdef YYBISON +#define YYSTYPE int +#define YYLEX_PARAM &yylval +#define YYLEX_DECL() yylex(YYSTYPE *yylval) +#define YYERROR_DECL() yyerror(const char *s) +int YYLEX_DECL(); +static void YYERROR_DECL(); +#endif + +#line 29 "/dev/stdout" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, +}; +static const short yylen[] = { 2, + 1, +}; +static const short yydefred[] = { 0, + 1, 0, +}; +static const short yydgoto[] = { 2, +}; +static const short yysindex[] = { -256, + 0, 0, +}; +static const short yyrindex[] = { 0, + 0, 0, +}; +static const short yygindex[] = { 0, +}; +#define YYTABLESIZE 0 +static const short yytable[] = { 1, +}; +static const short yycheck[] = { 256, +}; +#define YYFINAL 2 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 0 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file", +}; +static const char *yyrule[] = { +"$accept : S", +"S : error", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 17 "pure_error.y" + +#include + +#ifdef YYBYACC +extern int YYLEX_DECL(); +#endif + +int +main(void) +{ + printf("yyparse() = %d\n", yyparse()); + return 0; +} + +int +yylex(YYSTYPE *value) +{ + return value ? 0 : -1; +} + +static void +yyerror(const char* s) +{ + printf("%s\n", s); +} +#line 167 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.11.out b/tools/regression/usr.bin/yacc/regress.11.out new file mode 100644 index 00000000000..1d6561d5e1b --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.11.out @@ -0,0 +1,613 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 2 "quote_calc.y" +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +#line 28 "/dev/stdout" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define OP_ADD 257 +#define ADD 258 +#define OP_SUB 259 +#define SUB 260 +#define OP_MUL 261 +#define MUL 262 +#define OP_DIV 263 +#define DIV 264 +#define OP_MOD 265 +#define MOD 266 +#define OP_AND 267 +#define AND 268 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short yylen[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short yydefred[] = { 1, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 3, + 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 0, + 0, 0, +}; +static const short yydgoto[] = { 1, + 7, 8, 9, +}; +static const short yysindex[] = { 0, + -38, 5, -36, 0, -51, -36, 7, -121, -248, 0, + 0, -243, -36, -22, 0, -36, -36, -36, -36, -36, + -36, -36, 0, -121, 0, -121, -121, -121, -121, -121, + -121, -243, +}; +static const short yyrindex[] = { 0, + 0, 0, 0, 0, -9, 0, 0, 13, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 0, -3, -2, -1, 1, 2, + 3, -4, +}; +static const short yygindex[] = { 0, + 0, 42, 0, +}; +#define YYTABLESIZE 258 +static const short yytable[] = { 16, + 15, 6, 22, 6, 14, 13, 7, 8, 9, 13, + 10, 11, 12, 16, 10, 17, 15, 18, 25, 19, + 23, 20, 4, 21, 5, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 14, 13, 7, 8, 9, + 0, 10, 11, 12, 12, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 15, 0, 0, 0, 14, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 17, 0, 18, + 0, 19, 0, 20, 0, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 4, 5, 4, 11, 16, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 21, 0, 16, 15, 16, 15, + 16, 15, 16, 15, 16, 15, 16, 15, +}; +static const short yycheck[] = { 10, + 10, 40, 124, 40, 10, 10, 10, 10, 10, 61, + 10, 10, 10, 257, 10, 259, 10, 261, 41, 263, + 269, 265, 10, 267, 10, -1, -1, -1, -1, -1, + 41, -1, -1, -1, -1, 41, 41, 41, 41, 41, + -1, 41, 41, 41, 3, -1, -1, 6, -1, -1, + -1, -1, -1, -1, 13, -1, -1, 16, 17, 18, + 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 124, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 124, 124, -1, -1, -1, 124, 124, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, -1, 259, -1, 261, + -1, 263, -1, 265, -1, 267, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + 259, -1, 259, -1, -1, -1, -1, -1, -1, -1, + 269, 270, 269, 270, 257, -1, 259, -1, 261, -1, + 263, -1, 265, -1, 267, -1, 257, 257, 259, 259, + 261, 261, 263, 263, 265, 265, 267, 267, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 271 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"OP_ADD","\"ADD\"","OP_SUB","\"SUB\"","OP_MUL","\"MUL\"","OP_DIV", +"\"DIV\"","OP_MOD","\"MOD\"","OP_AND","\"AND\"","DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr OP_ADD expr", +"expr : expr OP_SUB expr", +"expr : expr OP_MUL expr", +"expr : expr OP_DIV expr", +"expr : expr OP_MOD expr", +"expr : expr OP_AND expr", +"expr : expr '|' expr", +"expr : OP_SUB expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "quote_calc.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 286 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "quote_calc.y" + { yyerrok ; } +break; +case 4: +#line 39 "quote_calc.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "quote_calc.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "quote_calc.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "quote_calc.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "quote_calc.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "quote_calc.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "quote_calc.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "quote_calc.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "quote_calc.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "quote_calc.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "quote_calc.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "quote_calc.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "quote_calc.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "quote_calc.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 552 "/dev/stdout" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.12.out b/tools/regression/usr.bin/yacc/regress.12.out new file mode 100644 index 00000000000..d3d03b94db7 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.12.out @@ -0,0 +1,613 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 2 "quote_calc2.y" +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +#line 28 "/dev/stdout" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define OP_ADD 257 +#define ADD 258 +#define OP_SUB 259 +#define SUB 260 +#define OP_MUL 261 +#define MUL 262 +#define OP_DIV 263 +#define DIV 264 +#define OP_MOD 265 +#define MOD 266 +#define OP_AND 267 +#define AND 268 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short yylen[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short yydefred[] = { 1, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 3, + 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 0, + 0, 0, +}; +static const short yydgoto[] = { 1, + 7, 8, 9, +}; +static const short yysindex[] = { 0, + -38, 4, -36, 0, -51, -36, 6, -121, -249, 0, + 0, -243, -36, -23, 0, -36, -36, -36, -36, -36, + -36, -36, 0, -121, 0, -121, -121, -121, -121, -121, + -121, -243, +}; +static const short yyrindex[] = { 0, + 0, 0, 0, 0, -9, 0, 0, 12, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 0, -3, -2, -1, 1, 2, + 3, -4, +}; +static const short yygindex[] = { 0, + 0, 42, 0, +}; +#define YYTABLESIZE 259 +static const short yytable[] = { 16, + 15, 6, 22, 6, 14, 13, 7, 8, 9, 13, + 10, 11, 12, 10, 16, 15, 17, 25, 18, 23, + 19, 4, 20, 5, 21, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 14, 13, 7, 8, 9, + 0, 10, 11, 12, 12, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 15, 0, 0, 0, 14, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 17, 0, + 18, 0, 19, 0, 20, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, + 4, 5, 4, 11, 16, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 21, 0, 0, 16, 15, 16, + 15, 16, 15, 16, 15, 16, 15, 16, 15, +}; +static const short yycheck[] = { 10, + 10, 40, 124, 40, 10, 10, 10, 10, 10, 61, + 10, 10, 10, 10, 258, 10, 260, 41, 262, 269, + 264, 10, 266, 10, 268, -1, -1, -1, -1, -1, + 41, -1, -1, -1, -1, 41, 41, 41, 41, 41, + -1, 41, 41, 41, 3, -1, -1, 6, -1, -1, + -1, -1, -1, -1, 13, -1, -1, 16, 17, 18, + 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 124, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 124, 124, -1, -1, -1, 124, 124, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 258, -1, 260, -1, + 262, -1, 264, -1, 266, -1, 268, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + -1, 260, -1, 260, -1, -1, -1, -1, -1, -1, + 269, 270, 269, 270, 258, -1, 260, -1, 262, -1, + 264, -1, 266, -1, 268, -1, -1, 258, 258, 260, + 260, 262, 262, 264, 264, 266, 266, 268, 268, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 271 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"OP_ADD","\"ADD\"","OP_SUB","\"SUB\"","OP_MUL","\"MUL\"","OP_DIV", +"\"DIV\"","OP_MOD","\"MOD\"","OP_AND","\"AND\"","DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr \"ADD\" expr", +"expr : expr \"SUB\" expr", +"expr : expr \"MUL\" expr", +"expr : expr \"DIV\" expr", +"expr : expr \"MOD\" expr", +"expr : expr \"AND\" expr", +"expr : expr '|' expr", +"expr : \"SUB\" expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "quote_calc2.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 286 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "quote_calc2.y" + { yyerrok ; } +break; +case 4: +#line 39 "quote_calc2.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "quote_calc2.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "quote_calc2.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "quote_calc2.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "quote_calc2.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "quote_calc2.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "quote_calc2.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "quote_calc2.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "quote_calc2.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "quote_calc2.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "quote_calc2.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "quote_calc2.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "quote_calc2.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "quote_calc2.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 552 "/dev/stdout" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.13.out b/tools/regression/usr.bin/yacc/regress.13.out new file mode 100644 index 00000000000..fc68da8396c --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.13.out @@ -0,0 +1,608 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 2 "quote_calc3.y" +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +#line 28 "/dev/stdout" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short yylen[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short yydefred[] = { 1, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 3, + 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 0, + 0, 0, +}; +static const short yydgoto[] = { 1, + 7, 8, 9, +}; +static const short yysindex[] = { 0, + -38, 5, -36, 0, -51, -36, 7, -121, -248, 0, + 0, -243, -36, -22, 0, -36, -36, -36, -36, -36, + -36, -36, 0, -121, 0, -121, -121, -121, -121, -121, + -121, -243, +}; +static const short yyrindex[] = { 0, + 0, 0, 0, 0, -9, 0, 0, 13, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 0, -3, -2, -1, 1, 2, + 3, -4, +}; +static const short yygindex[] = { 0, + 0, 42, 0, +}; +#define YYTABLESIZE 258 +static const short yytable[] = { 16, + 15, 6, 22, 6, 14, 13, 7, 8, 9, 13, + 10, 11, 12, 16, 10, 17, 15, 18, 25, 19, + 23, 20, 4, 21, 5, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 14, 13, 7, 8, 9, + 0, 10, 11, 12, 12, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 15, 0, 0, 0, 14, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 17, 0, 18, + 0, 19, 0, 20, 0, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 4, 5, 4, 11, 16, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 21, 0, 16, 15, 16, 15, + 16, 15, 16, 15, 16, 15, 16, 15, +}; +static const short yycheck[] = { 10, + 10, 40, 124, 40, 10, 10, 10, 10, 10, 61, + 10, 10, 10, 257, 10, 259, 10, 261, 41, 263, + 269, 265, 10, 267, 10, -1, -1, -1, -1, -1, + 41, -1, -1, -1, -1, 41, 41, 41, 41, 41, + -1, 41, 41, 41, 3, -1, -1, 6, -1, -1, + -1, -1, -1, -1, 13, -1, -1, 16, 17, 18, + 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 124, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 124, 124, -1, -1, -1, 124, 124, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, -1, 259, -1, 261, + -1, 263, -1, 265, -1, 267, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + 259, -1, 259, -1, -1, -1, -1, -1, -1, -1, + 269, 270, 269, 270, 257, -1, 259, -1, 261, -1, + 263, -1, 265, -1, 267, -1, 257, 257, 259, 259, + 261, 261, 263, 263, 265, 265, 267, 267, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 271 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"OP_ADD","\"ADD-operator\"","OP_SUB","\"SUB-operator\"","OP_MUL", +"\"MUL-operator\"","OP_DIV","\"DIV-operator\"","OP_MOD","\"MOD-operator\"", +"OP_AND","\"AND-operator\"","DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr OP_ADD expr", +"expr : expr OP_SUB expr", +"expr : expr OP_MUL expr", +"expr : expr OP_DIV expr", +"expr : expr OP_MOD expr", +"expr : expr OP_AND expr", +"expr : expr '|' expr", +"expr : OP_SUB expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "quote_calc3.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 281 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "quote_calc3.y" + { yyerrok ; } +break; +case 4: +#line 39 "quote_calc3.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "quote_calc3.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "quote_calc3.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "quote_calc3.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "quote_calc3.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "quote_calc3.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "quote_calc3.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "quote_calc3.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "quote_calc3.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "quote_calc3.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "quote_calc3.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "quote_calc3.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "quote_calc3.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "quote_calc3.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 547 "/dev/stdout" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.14.out b/tools/regression/usr.bin/yacc/regress.14.out new file mode 100644 index 00000000000..96fdb57b6d9 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.14.out @@ -0,0 +1,608 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) + +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 2 "quote_calc4.y" +# include +# include + +int regs[26]; +int base; + +int yylex(void); +static void yyerror(const char *s); + +#line 28 "/dev/stdout" + +#ifndef YYSTYPE +typedef int YYSTYPE; +#endif + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define OP_ADD 257 +#define OP_SUB 259 +#define OP_MUL 261 +#define OP_DIV 263 +#define OP_MOD 265 +#define OP_AND 267 +#define DIGIT 269 +#define LETTER 270 +#define UMINUS 271 +#define YYERRCODE 256 +static const short yylhs[] = { -1, + 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, +}; +static const short yylen[] = { 2, + 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 1, 1, 2, +}; +static const short yydefred[] = { 1, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 3, + 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 6, 0, 0, 0, 0, 0, + 0, 0, +}; +static const short yydgoto[] = { 1, + 7, 8, 9, +}; +static const short yysindex[] = { 0, + -38, 4, -36, 0, -51, -36, 6, -121, -249, 0, + 0, -243, -36, -23, 0, -36, -36, -36, -36, -36, + -36, -36, 0, -121, 0, -121, -121, -121, -121, -121, + -121, -243, +}; +static const short yyrindex[] = { 0, + 0, 0, 0, 0, -9, 0, 0, 12, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 0, -3, -2, -1, 1, 2, + 3, -4, +}; +static const short yygindex[] = { 0, + 0, 42, 0, +}; +#define YYTABLESIZE 259 +static const short yytable[] = { 16, + 15, 6, 22, 6, 14, 13, 7, 8, 9, 13, + 10, 11, 12, 10, 16, 15, 17, 25, 18, 23, + 19, 4, 20, 5, 21, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 14, 13, 7, 8, 9, + 0, 10, 11, 12, 12, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 15, 0, 0, 0, 14, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 17, 0, + 18, 0, 19, 0, 20, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, + 4, 5, 4, 11, 16, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 21, 0, 0, 16, 15, 16, + 15, 16, 15, 16, 15, 16, 15, 16, 15, +}; +static const short yycheck[] = { 10, + 10, 40, 124, 40, 10, 10, 10, 10, 10, 61, + 10, 10, 10, 10, 258, 10, 260, 41, 262, 269, + 264, 10, 266, 10, 268, -1, -1, -1, -1, -1, + 41, -1, -1, -1, -1, 41, 41, 41, 41, 41, + -1, 41, 41, 41, 3, -1, -1, 6, -1, -1, + -1, -1, -1, -1, 13, -1, -1, 16, 17, 18, + 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 124, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 124, 124, -1, -1, -1, 124, 124, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 258, -1, 260, -1, + 262, -1, 264, -1, 266, -1, 268, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + -1, 260, -1, 260, -1, -1, -1, -1, -1, -1, + 269, 270, 269, 270, 258, -1, 260, -1, 262, -1, + 264, -1, 266, -1, 268, -1, -1, 258, 258, 260, + 260, 262, 262, 264, 264, 266, 266, 268, 268, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 271 +#if YYDEBUG +static const char *yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, +0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"OP_ADD","\"ADD-operator\"","OP_SUB","\"SUB-operator\"","OP_MUL", +"\"MUL-operator\"","OP_DIV","\"DIV-operator\"","OP_MOD","\"MOD-operator\"", +"OP_AND","\"AND-operator\"","DIGIT","LETTER","UMINUS", +}; +static const char *yyrule[] = { +"$accept : list", +"list :", +"list : list stat '\\n'", +"list : list error '\\n'", +"stat : expr", +"stat : LETTER '=' expr", +"expr : '(' expr ')'", +"expr : expr \"ADD-operator\" expr", +"expr : expr \"SUB-operator\" expr", +"expr : expr \"MUL-operator\" expr", +"expr : expr \"DIV-operator\" expr", +"expr : expr \"MOD-operator\" expr", +"expr : expr \"AND-operator\" expr", +"expr : expr '|' expr", +"expr : \"SUB-operator\" expr", +"expr : LETTER", +"expr : number", +"number : DIGIT", +"number : number DIGIT", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +typedef struct { + unsigned stacksize; + short *s_base; + short *s_mark; + short *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 73 "quote_calc4.y" + /* start of programs */ + +int +main (void) +{ + while(!feof(stdin)) { + yyparse(); + } + return 0; +} + +static void +yyerror(const char *s) +{ + fprintf(stderr, "%s\n", s); +} + +int +yylex(void) { + /* lexical analysis routine */ + /* returns LETTER for a lower case letter, yylval = 0 through 25 */ + /* return DIGIT for a digit, yylval = 0 through 9 */ + /* all other characters are returned immediately */ + + int c; + + while( (c=getchar()) == ' ' ) { /* skip blanks */ } + + /* c is now nonblank */ + + if( islower( c )) { + yylval = c - 'a'; + return ( LETTER ); + } + if( isdigit( c )) { + yylval = c - '0'; + return ( DIGIT ); + } + return( c ); +} +#line 281 "/dev/stdout" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + short *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = data->s_mark - data->s_base; + newss = (short *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 35 "quote_calc4.y" + { yyerrok ; } +break; +case 4: +#line 39 "quote_calc4.y" + { printf("%d\n",yystack.l_mark[0]);} +break; +case 5: +#line 41 "quote_calc4.y" + { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } +break; +case 6: +#line 45 "quote_calc4.y" + { yyval = yystack.l_mark[-1]; } +break; +case 7: +#line 47 "quote_calc4.y" + { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } +break; +case 8: +#line 49 "quote_calc4.y" + { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } +break; +case 9: +#line 51 "quote_calc4.y" + { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } +break; +case 10: +#line 53 "quote_calc4.y" + { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } +break; +case 11: +#line 55 "quote_calc4.y" + { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } +break; +case 12: +#line 57 "quote_calc4.y" + { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } +break; +case 13: +#line 59 "quote_calc4.y" + { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } +break; +case 14: +#line 61 "quote_calc4.y" + { yyval = - yystack.l_mark[0]; } +break; +case 15: +#line 63 "quote_calc4.y" + { yyval = regs[yystack.l_mark[0]]; } +break; +case 17: +#line 68 "quote_calc4.y" + { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } +break; +case 18: +#line 70 "quote_calc4.y" + { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } +break; +#line 547 "/dev/stdout" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack)) + { + goto yyoverflow; + } + *++yystack.s_mark = (short) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + yyerror("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} diff --git a/tools/regression/usr.bin/yacc/regress.sh b/tools/regression/usr.bin/yacc/regress.sh new file mode 100755 index 00000000000..4517084dde4 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.sh @@ -0,0 +1,26 @@ +# $FreeBSD$ + +LC_ALL=C; export LC_ALL + +echo 1..15 + +REGRESSION_START($1) + +REGRESSION_TEST(`00', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout undefined.y') +REGRESSION_TEST(`01', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout calc.y') +REGRESSION_TEST(`02', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout calc1.y') +REGRESSION_TEST(`03', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout calc3.y') +REGRESSION_TEST(`04', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout code_calc.y') +REGRESSION_TEST(`05', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout code_error.y') +REGRESSION_TEST(`06', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout error.y') +REGRESSION_TEST(`07', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout ftp.y') +REGRESSION_TEST(`08', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout grammar.y') +REGRESSION_TEST(`09', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout pure_calc.y') +REGRESSION_TEST(`10', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout pure_error.y') +REGRESSION_TEST(`11', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout quote_calc.y') +REGRESSION_TEST(`12', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout quote_calc2.y') +REGRESSION_TEST(`13', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout quote_calc3.y') +REGRESSION_TEST(`14', `/usr/obj/usr/src/usr.bin/yacc/yacc -b regress -o /dev/stdout quote_calc4.y') + +REGRESSION_END() + diff --git a/tools/regression/usr.bin/yacc/regress.t b/tools/regression/usr.bin/yacc/regress.t new file mode 100644 index 00000000000..a82aacd9886 --- /dev/null +++ b/tools/regression/usr.bin/yacc/regress.t @@ -0,0 +1,6 @@ +#!/bin/sh +# $FreeBSD$ + +cd `dirname $0` + +m4 ../regress.m4 regress.sh | sh diff --git a/tools/regression/usr.bin/yacc/undefined.y b/tools/regression/usr.bin/yacc/undefined.y new file mode 100644 index 00000000000..33ba005e4f5 --- /dev/null +++ b/tools/regression/usr.bin/yacc/undefined.y @@ -0,0 +1,5 @@ +%type rule +%% +rule: + ; +%% diff --git a/tools/test/auxinfo/auxinfo.c b/tools/test/auxinfo/auxinfo.c index 374bed8b429..a855b543f27 100644 --- a/tools/test/auxinfo/auxinfo.c +++ b/tools/test/auxinfo/auxinfo.c @@ -47,6 +47,13 @@ test_osreldate(void) printf("OSRELDATE: %d\n", getosreldate()); } +static void +test_ncpus(void) +{ + + printf("NCPUs: %ld\n", sysconf(_SC_NPROCESSORS_CONF)); +} + int main(int argc __unused, char *argv[] __unused) { @@ -54,5 +61,6 @@ main(int argc __unused, char *argv[] __unused) test_pagesizes(); test_pagesize(); test_osreldate(); + test_ncpus(); return (0); } diff --git a/tools/test/sort/bigtest/kcmd b/tools/test/sort/bigtest/kcmd new file mode 100755 index 00000000000..f853fd60923 --- /dev/null +++ b/tools/test/sort/bigtest/kcmd @@ -0,0 +1,376 @@ +#!/bin/sh + +# $FreeBSD$ + +rm -rf siks +mkdir -p siks + +export GNUSORT_NUMERIC_COMPATIBILITY=x + +BSDSORT=../sort +GNUSORT=~/coreutils/bin/sort +#GNUSORT=sort + +FILECMP=cmp + +INPUT_FILE=si + +rm -rf test.log + +#ru_RU.ISO-8859-5 en_US.ISO8859-15 zh_HK.Big5HKSCS +# +# ru KOI-8 is an "irregular" locale with non-trivial ordering. +# zh* is a 2-bytes locale + +for lang in ru_RU.KOI8-R C ru_RU.ISO-8859-5 en_US.ISO8859-15 zh_HK.Big5HKSCS +do + + export LANG=${lang} + + for KEYS in -srh -sfrudb -Vs -sM -siz + do + + echo ${LANG} ${KEYS} + + ${BSDSORT} ${KEYS} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.0.0 2>&1 ; then + echo ${LANG} ${KEYS} error >> test.log + fi + ${BSDSORT} -c ${KEYS} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -c error >> test.log + fi + rm siks/res.0.0 + + ${BSDSORT} ${KEYS} -t " " ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -t " " crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -t " " ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.0.0 2>&1 ; then + echo ${LANG} ${KEYS} error -t " " >> test.log + fi + ${BSDSORT} -c -t " " ${KEYS} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo $? ${LANG} ${KEYS} -t " " -c error >> test.log + fi + rm siks/res.0.0 + + ${BSDSORT} ${KEYS} -t "|" ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -t "|" crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -t "|" ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.0.0 2>&1 ; then + echo ${LANG} ${KEYS} error -t "|" >> test.log + fi + ${BSDSORT} -c -t "|" ${KEYS} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -c -t "|" error >> test.log + fi + rm siks/res.0.0 + + ${BSDSORT} ${KEYS} -t '\0' ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -t 0 crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -t '\0' ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.0.0 2>&1 ; then + echo ${LANG} ${KEYS} error -t '\0' >> test.log + fi + ${BSDSORT} -c -t '\0' ${KEYS} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -c -t '\0' error >> test.log + fi + rm siks/res.0.0 + + for f1 in 1 2 3 4 5 6 7 8 9 + do + for c1 in 1 2 3 4 5 10 15 20 25 30 + do + echo ${LANG} ${KEYS} ${f1} ${c1} + + ${BSDSORT} ${KEYS} +${f1}.${c1} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} +${f1}.${c1} crash +- >> test.log + exit + fi + ${GNUSORT} ${KEYS} +${f1}.${c1} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1} 2>&1 ; then + echo ${LANG} ${KEYS} +${f1}.${c1} error +- >> test.log + fi + ${BSDSORT} -c ${KEYS} +${f1}.${c1} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} +${f1}.${c1} -c error +- >> test.log + fi + rm siks/res.${f1}.${c1} + + ${BSDSORT} ${KEYS} -k${f1}.${c1} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -k${f1}.${c1} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1} 2>&1 ; then + echo ${LANG} ${KEYS} -k${f1}.${c1} error >> test.log + fi + ${BSDSORT} -c ${KEYS} -k${f1}.${c1} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1} -c error >> test.log + fi + rm siks/res.${f1}.${c1} + + ${BSDSORT} ${KEYS} -k${f1}.${c1}b ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}b crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -k${f1}.${c1}b ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1} 2>&1 ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}b error >> test.log + fi + ${BSDSORT} -c ${KEYS} -k${f1}.${c1}b siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}b -c error >> test.log + fi + rm siks/res.${f1}.${c1} + + ${BSDSORT} ${KEYS} -t " " -k${f1}.${c1} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -t -k${f1}.${c1} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -t " " -k${f1}.${c1} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1} 2>&1 ; then + echo ${LANG} ${KEYS} -k${f1}.${c1} error -t " " >> test.log + fi + ${BSDSORT} -c -t " " ${KEYS} -k${f1}.${c1} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1} -t " " -c error >> test.log + fi + rm siks/res.${f1}.${c1} + + ${BSDSORT} ${KEYS} -t " " -k${f1}.${c1}n ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}n crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -t " " -k${f1}.${c1}n ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1} 2>&1 ; then + echo ${LANG} ${KEYS} -k${f1}.${c1} error -t " " n >> test.log + fi + ${BSDSORT} -c -t " " ${KEYS} -k${f1}.${c1}n siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1} -c -t " " n error >> test.log + fi + rm siks/res.${f1}.${c1} + + ${BSDSORT} ${KEYS} -t "|" -k${f1}.${c1} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -t "|" -k${f1}.${c1} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -t "|" -k${f1}.${c1} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1} 2>&1 ; then + echo ${LANG} ${KEYS} -k${f1}.${c1} error -t "|" >> test.log + fi + ${BSDSORT} -c -t "|" ${KEYS} -k${f1}.${c1} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1} -c -t "|" error >> test.log + fi + rm siks/res.${f1}.${c1} + + for f2 in 1 2 3 4 5 6 7 8 9 10 + do + for c2 in 0 1 2 3 4 5 10 15 20 25 30 + do + echo ${LANG} ${KEYS} ${f1} ${c1} ${f2} ${c2} + + ${BSDSORT} ${KEYS} +${f1}.${c1} -${f2}.${c2} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} +${f1}.${c1} -${f2}.${c2} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} +${f1}.${c1} -${f2}.${c2} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1}.${f2}.${c2} 2>&1 ; then + echo ${LANG} ${KEYS} +${f1}.${c1} -${f2}.${c2} error +- >> test.log + fi + ${BSDSORT} -c ${KEYS} +${f1}.${c1} -${f2}.${c2} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} +${f1}.${c1} -${f2}.${c2} -c error +- >> test.log + fi + rm siks/res.${f1}.${c1}.${f2}.${c2} + + ${BSDSORT} ${KEYS} -k${f1}.${c1},${f2}.${c2} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1},${f2}.${c2} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -k${f1}.${c1},${f2}.${c2} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1}.${f2}.${c2} 2>&1 ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}.${f2}.${c2} error >> test.log + fi + ${BSDSORT} -c ${KEYS} -k${f1}.${c1},${f2}.${c2} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1},${f2}.${c2} -c error >> test.log + fi + rm siks/res.${f1}.${c1}.${f2}.${c2} + + ${BSDSORT} ${KEYS} -k${f1}.${c1}b,${f2}.${c2} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}b,${f2}.${c2} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -k${f1}.${c1}b,${f2}.${c2} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1}.${f2}.${c2} 2>&1 ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}.b.${f2}.${c2} error >> test.log + fi + ${BSDSORT} -c ${KEYS} -k${f1}.${c1}b,${f2}.${c2} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}b,${f2}.${c2} -c error >> test.log + fi + rm siks/res.${f1}.${c1}.${f2}.${c2} + + ${BSDSORT} ${KEYS} -t " " -k${f1}.${c1},${f2}.${c2} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -t " " -k${f1}.${c1},${f2}.${c2} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -t " " -k${f1}.${c1},${f2}.${c2} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1}.${f2}.${c2} 2>&1 ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}.${f2}.${c2} error -t " " >> test.log + fi + ${BSDSORT} -c -t " " ${KEYS} -k${f1}.${c1},${f2}.${c2} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1},${f2}.${c2} -c -t " " error >> test.log + fi + rm siks/res.${f1}.${c1}.${f2}.${c2} + + ${BSDSORT} ${KEYS} -t " " -k${f1}.${c1}n,${f2}.${c2} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -t " " -k${f1}.${c1}n,${f2}.${c2} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -t " " -k${f1}.${c1}n,${f2}.${c2} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1}.${f2}.${c2} 2>&1 ; then + echo ${LANG} ${KEYS} -t " " -k${f1}.${c1}.${f2}.${c2} error n >> test.log + fi + ${BSDSORT} -c -t " " ${KEYS} -k${f1}.${c1}n,${f2}.${c2} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1},${f2}.${c2} -c -t " " n error >> test.log + fi + rm siks/res.${f1}.${c1}.${f2}.${c2} + + ${BSDSORT} ${KEYS} -t '\0' -k${f1}.${c1}n,${f2}.${c2} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -t '\0' -k${f1}.${c1}n,${f2}.${c2} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -t '\0' -k${f1}.${c1}n,${f2}.${c2} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1}.${f2}.${c2} 2>&1 ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}.${f2}.${c2} error -t '\0' n >> test.log + fi + ${BSDSORT} -c -t '\0' ${KEYS} -k${f1}.${c1}n,${f2}.${c2} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1},${f2}.${c2} -c -t '\0' n error >> test.log + fi + rm siks/res.${f1}.${c1}.${f2}.${c2} + + ${BSDSORT} ${KEYS} -t "|" -k${f1}.${c1},${f2}.${c2} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -t "|" -k${f1}.${c1},${f2}.${c2} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -t "|" -k${f1}.${c1},${f2}.${c2} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1}.${f2}.${c2} 2>&1 ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}.${f2}.${c2} error -t "|" >> test.log + fi + ${BSDSORT} -c -t "|" ${KEYS} -k${f1}.${c1},${f2}.${c2} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1},${f2}.${c2} -c -t "|" error >> test.log + fi + rm siks/res.${f1}.${c1}.${f2}.${c2} + + ${BSDSORT} ${KEYS} -t "|" -k${f1}.${c1},${f2}.${c2} -k${f2}.${c1},${f1}.${c2} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -t "|" -k${f1}.${c1},${f2}.${c2} -k${f2}.${c1},${f1}.${c2} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -t "|" -k${f1}.${c1},${f2}.${c2} -k${f2}.${c1},${f1}.${c2} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1}.${f2}.${c2} 2>&1 ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}.${f2}.${c2} error -t "|" 2k >> test.log + fi + ${BSDSORT} -c -t "|" ${KEYS} -k${f1}.${c1},${f2}.${c2} -k${f2}.${c1},${f1}.${c2} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1},${f2}.${c2} -c -t "|" 2k error >> test.log + fi + rm siks/res.${f1}.${c1}.${f2}.${c2} + + ${BSDSORT} ${KEYS} -k${f1}.${c1}b,${f2}.${c2} -k${f2}.${c1},${f1}.${c2} ${INPUT_FILE} -o siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}b,${f2}.${c2} -k${f2}.${c1},${f1}.${c2} crash >> test.log + exit + fi + ${GNUSORT} ${KEYS} -k${f1}.${c1}b,${f2}.${c2} -k${f2}.${c1},${f1}.${c2} ${INPUT_FILE} -o siks/sik2 + if ! ${FILECMP} siks/sik1 siks/sik2 >siks/res.${f1}.${c1}.${f2}.${c2} 2>&1 ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}.b.${f2}.${c2} error 2k >> test.log + fi + ${BSDSORT} -c ${KEYS} -k${f1}.${c1}b,${f2}.${c2} -k${f2}.${c1},${f1}.${c2} siks/sik1 + ER=$? + if ! [ ${ER} -eq 0 ] ; then + echo ${LANG} ${KEYS} -k${f1}.${c1}b,${f2}.${c2} -c 2k error >> test.log + fi + rm siks/res.${f1}.${c1}.${f2}.${c2} + + done + done + done + done + done +done + diff --git a/tools/test/sort/bigtest/q-1.022.tgz b/tools/test/sort/bigtest/q-1.022.tgz new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/test/sort/bigtest/q-1.024.003. b/tools/test/sort/bigtest/q-1.024.003. new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/test/sort/bigtest/q-1.024.003.tgz b/tools/test/sort/bigtest/q-1.024.003.tgz new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/test/sort/bigtest/q-1.024.009.tgz b/tools/test/sort/bigtest/q-1.024.009.tgz new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/test/sort/bigtest/q-1.024.07.tgz b/tools/test/sort/bigtest/q-1.024.07.tgz new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/test/sort/bigtest/q-1.024.tgz b/tools/test/sort/bigtest/q-1.024.tgz new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/test/sort/bigtest/q-1.23.1.tgz b/tools/test/sort/bigtest/q-1.23.1.tgz new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/test/sort/bigtest/q-1.23.tgz b/tools/test/sort/bigtest/q-1.23.tgz new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/test/sort/bigtest/si b/tools/test/sort/bigtest/si new file mode 100644 index 00000000000..74d1477cfbc Binary files /dev/null and b/tools/test/sort/bigtest/si differ diff --git a/tools/test/sort/bigtest/siks/res.1.1.8.0 b/tools/test/sort/bigtest/siks/res.1.1.8.0 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/test/sort/bigtest/siks/res.6.25.9.15 b/tools/test/sort/bigtest/siks/res.6.25.9.15 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/test/sort/bigtest/siks/res.8.10.10.0 b/tools/test/sort/bigtest/siks/res.8.10.10.0 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/test/sort/bigtest/siks/sik1 b/tools/test/sort/bigtest/siks/sik1 new file mode 100644 index 00000000000..4f41365bbd6 Binary files /dev/null and b/tools/test/sort/bigtest/siks/sik1 differ diff --git a/tools/test/sort/bigtest/siks/sik2 b/tools/test/sort/bigtest/siks/sik2 new file mode 100644 index 00000000000..4f41365bbd6 Binary files /dev/null and b/tools/test/sort/bigtest/siks/sik2 differ diff --git a/tools/test/sort/regression/Makefile b/tools/test/sort/regression/Makefile new file mode 100644 index 00000000000..e7cc101f354 --- /dev/null +++ b/tools/test/sort/regression/Makefile @@ -0,0 +1,31 @@ +# $FreeBSD$ + +TESTFILE= test01 test02 test03 test04 test05 test06 test07 test08 \ + test09 test10 test11 test12 test13 test14 test15 test16 test17 \ + test_nums + +OPTIONS= r f fr fs fu i ir b bs bd bu g gs gu gr n nr M Mr u nu ns + +#SORT?= /usr/local/bin/bsdsort +GNUSORT?=~/coreutils/bin/sort +SORT?= ../sort +CMP?= ${.CURDIR}/cmp.sh + +check: + mkdir -p output +.for f in ${TESTFILE} + @LANG=C;${SORT} data/${f} >output/${f} + @#LANG=C;${GNUSORT} data/${f} >ref/${f} + @${CMP} ref/${f} output/${f} +.endfor +.for opt in ${OPTIONS} +.for f in ${TESTFILE} + @LANG=C;${SORT} -${opt} data/${f} >output/${f}${opt} + @#LANG=C;${GNUSORT} -${opt} data/${f} >ref/${f}${opt} + @${CMP} ref/${f}${opt} output/${f}${opt} +.endfor +.endfor + +CLEANDIRS+= output + +.include diff --git a/tools/test/sort/regression/cmp.sh b/tools/test/sort/regression/cmp.sh new file mode 100755 index 00000000000..44c406a3dc6 --- /dev/null +++ b/tools/test/sort/regression/cmp.sh @@ -0,0 +1,4 @@ +#!/bin/sh +# $FreeBSD$ + +diff $1 $2 | grep '^-' >/dev/null && echo DIFFER: $1 $2 && exit 0 || exit 0 diff --git a/tools/test/sort/regression/data/test01 b/tools/test/sort/regression/data/test01 new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/data/test01 @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/data/test02 b/tools/test/sort/regression/data/test02 new file mode 100644 index 00000000000..b6b65be3cc4 --- /dev/null +++ b/tools/test/sort/regression/data/test02 @@ -0,0 +1,5 @@ +repa A +repa 1 +repa b +repa _ +repa diff --git a/tools/test/sort/regression/data/test03 b/tools/test/sort/regression/data/test03 new file mode 100644 index 00000000000..be3263ff6e2 --- /dev/null +++ b/tools/test/sort/regression/data/test03 @@ -0,0 +1,10 @@ +_bab +Bab +zakó +limonádé +___kád +gyerek +cipõ +alma +_barack +korte diff --git a/tools/test/sort/regression/data/test04 b/tools/test/sort/regression/data/test04 new file mode 100644 index 00000000000..8a8f11a6119 --- /dev/null +++ b/tools/test/sort/regression/data/test04 @@ -0,0 +1,9 @@ +23453252 +56572 +2336 +-124 +543 +543a +-543b +a414 +z123 diff --git a/tools/test/sort/regression/data/test05 b/tools/test/sort/regression/data/test05 new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/data/test05 @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/data/test06 b/tools/test/sort/regression/data/test06 new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/data/test06 @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/data/test07 b/tools/test/sort/regression/data/test07 new file mode 100644 index 00000000000..fbf6168c5a5 --- /dev/null +++ b/tools/test/sort/regression/data/test07 @@ -0,0 +1,4 @@ +gamma +delta +epszilon +zz diff --git a/tools/test/sort/regression/data/test08 b/tools/test/sort/regression/data/test08 new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/data/test08 @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/data/test09 b/tools/test/sort/regression/data/test09 new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/data/test09 @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/data/test10 b/tools/test/sort/regression/data/test10 new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/data/test10 @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/data/test11 b/tools/test/sort/regression/data/test11 new file mode 100644 index 00000000000..9bdb02de1d7 --- /dev/null +++ b/tools/test/sort/regression/data/test11 @@ -0,0 +1,9 @@ +MAY +dec +JAN +feb +mar +APR +kutya +_buff +apre diff --git a/tools/test/sort/regression/data/test12 b/tools/test/sort/regression/data/test12 new file mode 100644 index 00000000000..ec895bf73fa --- /dev/null +++ b/tools/test/sort/regression/data/test12 @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +zfwfgergre 23 +fcergergrd 75 diff --git a/tools/test/sort/regression/data/test13 b/tools/test/sort/regression/data/test13 new file mode 100644 index 00000000000..6a3f3f8ca9b --- /dev/null +++ b/tools/test/sort/regression/data/test13 @@ -0,0 +1,3 @@ +lap +zab +kukac diff --git a/tools/test/sort/regression/data/test14 b/tools/test/sort/regression/data/test14 new file mode 100644 index 00000000000..b051fbfdc44 --- /dev/null +++ b/tools/test/sort/regression/data/test14 @@ -0,0 +1,5 @@ +alma +korte +Alma +Bika +bika diff --git a/tools/test/sort/regression/data/test15 b/tools/test/sort/regression/data/test15 new file mode 100644 index 00000000000..5feb737c7e3 --- /dev/null +++ b/tools/test/sort/regression/data/test15 @@ -0,0 +1,5 @@ +raketa,,8 +alma,,9 +barack,,2 +piros,,13 +citromsarga,,0 diff --git a/tools/test/sort/regression/data/test16 b/tools/test/sort/regression/data/test16 new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/data/test16 @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/data/test17 b/tools/test/sort/regression/data/test17 new file mode 100644 index 00000000000..2da5d6580d0 --- /dev/null +++ b/tools/test/sort/regression/data/test17 @@ -0,0 +1,4 @@ +alma 5 bagoly +alma 6 korte +alma 4 zab +korte 4 barack diff --git a/tools/test/sort/regression/data/test_nums b/tools/test/sort/regression/data/test_nums new file mode 100644 index 00000000000..b7800be206b --- /dev/null +++ b/tools/test/sort/regression/data/test_nums @@ -0,0 +1,16 @@ + 123456789 + 123456789.1234 + 987654321.7654 + 987654321.765400 + -123456789 + -987654321.2345 +-1234567890 +-987654321 +123456789 +987654321 + -1234567890 + 987654321 + -987654321.9876 + -987654321 + 123456789.1234 + 123456789 diff --git a/tools/test/sort/regression/ref/test01 b/tools/test/sort/regression/ref/test01 new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01 @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01M b/tools/test/sort/regression/ref/test01M new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01M @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01Mr b/tools/test/sort/regression/ref/test01Mr new file mode 100644 index 00000000000..52d8bcc2006 --- /dev/null +++ b/tools/test/sort/regression/ref/test01Mr @@ -0,0 +1,3 @@ +root +flyer + diff --git a/tools/test/sort/regression/ref/test01b b/tools/test/sort/regression/ref/test01b new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01b @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01bd b/tools/test/sort/regression/ref/test01bd new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01bd @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01bs b/tools/test/sort/regression/ref/test01bs new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01bs @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01bu b/tools/test/sort/regression/ref/test01bu new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01bu @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01f b/tools/test/sort/regression/ref/test01f new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01f @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01fr b/tools/test/sort/regression/ref/test01fr new file mode 100644 index 00000000000..52d8bcc2006 --- /dev/null +++ b/tools/test/sort/regression/ref/test01fr @@ -0,0 +1,3 @@ +root +flyer + diff --git a/tools/test/sort/regression/ref/test01fs b/tools/test/sort/regression/ref/test01fs new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01fs @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01fu b/tools/test/sort/regression/ref/test01fu new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01fu @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01g b/tools/test/sort/regression/ref/test01g new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01g @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01gr b/tools/test/sort/regression/ref/test01gr new file mode 100644 index 00000000000..52d8bcc2006 --- /dev/null +++ b/tools/test/sort/regression/ref/test01gr @@ -0,0 +1,3 @@ +root +flyer + diff --git a/tools/test/sort/regression/ref/test01gs b/tools/test/sort/regression/ref/test01gs new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01gs @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01gu b/tools/test/sort/regression/ref/test01gu new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/tools/test/sort/regression/ref/test01gu @@ -0,0 +1 @@ + diff --git a/tools/test/sort/regression/ref/test01i b/tools/test/sort/regression/ref/test01i new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01i @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01ir b/tools/test/sort/regression/ref/test01ir new file mode 100644 index 00000000000..52d8bcc2006 --- /dev/null +++ b/tools/test/sort/regression/ref/test01ir @@ -0,0 +1,3 @@ +root +flyer + diff --git a/tools/test/sort/regression/ref/test01n b/tools/test/sort/regression/ref/test01n new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01n @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01nr b/tools/test/sort/regression/ref/test01nr new file mode 100644 index 00000000000..52d8bcc2006 --- /dev/null +++ b/tools/test/sort/regression/ref/test01nr @@ -0,0 +1,3 @@ +root +flyer + diff --git a/tools/test/sort/regression/ref/test01ns b/tools/test/sort/regression/ref/test01ns new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01ns @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test01nu b/tools/test/sort/regression/ref/test01nu new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/tools/test/sort/regression/ref/test01nu @@ -0,0 +1 @@ + diff --git a/tools/test/sort/regression/ref/test01r b/tools/test/sort/regression/ref/test01r new file mode 100644 index 00000000000..52d8bcc2006 --- /dev/null +++ b/tools/test/sort/regression/ref/test01r @@ -0,0 +1,3 @@ +root +flyer + diff --git a/tools/test/sort/regression/ref/test01u b/tools/test/sort/regression/ref/test01u new file mode 100644 index 00000000000..d191815dbe3 --- /dev/null +++ b/tools/test/sort/regression/ref/test01u @@ -0,0 +1,3 @@ + +flyer +root diff --git a/tools/test/sort/regression/ref/test02 b/tools/test/sort/regression/ref/test02 new file mode 100644 index 00000000000..e892a1a8c2d --- /dev/null +++ b/tools/test/sort/regression/ref/test02 @@ -0,0 +1,5 @@ +repa +repa 1 +repa A +repa _ +repa b diff --git a/tools/test/sort/regression/ref/test02M b/tools/test/sort/regression/ref/test02M new file mode 100644 index 00000000000..e892a1a8c2d --- /dev/null +++ b/tools/test/sort/regression/ref/test02M @@ -0,0 +1,5 @@ +repa +repa 1 +repa A +repa _ +repa b diff --git a/tools/test/sort/regression/ref/test02Mr b/tools/test/sort/regression/ref/test02Mr new file mode 100644 index 00000000000..b58ae3036ea --- /dev/null +++ b/tools/test/sort/regression/ref/test02Mr @@ -0,0 +1,5 @@ +repa b +repa _ +repa A +repa 1 +repa diff --git a/tools/test/sort/regression/ref/test02b b/tools/test/sort/regression/ref/test02b new file mode 100644 index 00000000000..e892a1a8c2d --- /dev/null +++ b/tools/test/sort/regression/ref/test02b @@ -0,0 +1,5 @@ +repa +repa 1 +repa A +repa _ +repa b diff --git a/tools/test/sort/regression/ref/test02bd b/tools/test/sort/regression/ref/test02bd new file mode 100644 index 00000000000..14c7373cca5 --- /dev/null +++ b/tools/test/sort/regression/ref/test02bd @@ -0,0 +1,5 @@ +repa _ +repa +repa 1 +repa A +repa b diff --git a/tools/test/sort/regression/ref/test02bs b/tools/test/sort/regression/ref/test02bs new file mode 100644 index 00000000000..e892a1a8c2d --- /dev/null +++ b/tools/test/sort/regression/ref/test02bs @@ -0,0 +1,5 @@ +repa +repa 1 +repa A +repa _ +repa b diff --git a/tools/test/sort/regression/ref/test02bu b/tools/test/sort/regression/ref/test02bu new file mode 100644 index 00000000000..e892a1a8c2d --- /dev/null +++ b/tools/test/sort/regression/ref/test02bu @@ -0,0 +1,5 @@ +repa +repa 1 +repa A +repa _ +repa b diff --git a/tools/test/sort/regression/ref/test02f b/tools/test/sort/regression/ref/test02f new file mode 100644 index 00000000000..3b1ba01ce9d --- /dev/null +++ b/tools/test/sort/regression/ref/test02f @@ -0,0 +1,5 @@ +repa +repa 1 +repa A +repa b +repa _ diff --git a/tools/test/sort/regression/ref/test02fr b/tools/test/sort/regression/ref/test02fr new file mode 100644 index 00000000000..63b91d70ffb --- /dev/null +++ b/tools/test/sort/regression/ref/test02fr @@ -0,0 +1,5 @@ +repa _ +repa b +repa A +repa 1 +repa diff --git a/tools/test/sort/regression/ref/test02fs b/tools/test/sort/regression/ref/test02fs new file mode 100644 index 00000000000..3b1ba01ce9d --- /dev/null +++ b/tools/test/sort/regression/ref/test02fs @@ -0,0 +1,5 @@ +repa +repa 1 +repa A +repa b +repa _ diff --git a/tools/test/sort/regression/ref/test02fu b/tools/test/sort/regression/ref/test02fu new file mode 100644 index 00000000000..3b1ba01ce9d --- /dev/null +++ b/tools/test/sort/regression/ref/test02fu @@ -0,0 +1,5 @@ +repa +repa 1 +repa A +repa b +repa _ diff --git a/tools/test/sort/regression/ref/test02g b/tools/test/sort/regression/ref/test02g new file mode 100644 index 00000000000..e892a1a8c2d --- /dev/null +++ b/tools/test/sort/regression/ref/test02g @@ -0,0 +1,5 @@ +repa +repa 1 +repa A +repa _ +repa b diff --git a/tools/test/sort/regression/ref/test02gr b/tools/test/sort/regression/ref/test02gr new file mode 100644 index 00000000000..b58ae3036ea --- /dev/null +++ b/tools/test/sort/regression/ref/test02gr @@ -0,0 +1,5 @@ +repa b +repa _ +repa A +repa 1 +repa diff --git a/tools/test/sort/regression/ref/test02gs b/tools/test/sort/regression/ref/test02gs new file mode 100644 index 00000000000..b6b65be3cc4 --- /dev/null +++ b/tools/test/sort/regression/ref/test02gs @@ -0,0 +1,5 @@ +repa A +repa 1 +repa b +repa _ +repa diff --git a/tools/test/sort/regression/ref/test02gu b/tools/test/sort/regression/ref/test02gu new file mode 100644 index 00000000000..cb2d50e1d81 --- /dev/null +++ b/tools/test/sort/regression/ref/test02gu @@ -0,0 +1 @@ +repa A diff --git a/tools/test/sort/regression/ref/test02i b/tools/test/sort/regression/ref/test02i new file mode 100644 index 00000000000..e892a1a8c2d --- /dev/null +++ b/tools/test/sort/regression/ref/test02i @@ -0,0 +1,5 @@ +repa +repa 1 +repa A +repa _ +repa b diff --git a/tools/test/sort/regression/ref/test02ir b/tools/test/sort/regression/ref/test02ir new file mode 100644 index 00000000000..b58ae3036ea --- /dev/null +++ b/tools/test/sort/regression/ref/test02ir @@ -0,0 +1,5 @@ +repa b +repa _ +repa A +repa 1 +repa diff --git a/tools/test/sort/regression/ref/test02n b/tools/test/sort/regression/ref/test02n new file mode 100644 index 00000000000..e892a1a8c2d --- /dev/null +++ b/tools/test/sort/regression/ref/test02n @@ -0,0 +1,5 @@ +repa +repa 1 +repa A +repa _ +repa b diff --git a/tools/test/sort/regression/ref/test02nr b/tools/test/sort/regression/ref/test02nr new file mode 100644 index 00000000000..b58ae3036ea --- /dev/null +++ b/tools/test/sort/regression/ref/test02nr @@ -0,0 +1,5 @@ +repa b +repa _ +repa A +repa 1 +repa diff --git a/tools/test/sort/regression/ref/test02ns b/tools/test/sort/regression/ref/test02ns new file mode 100644 index 00000000000..b6b65be3cc4 --- /dev/null +++ b/tools/test/sort/regression/ref/test02ns @@ -0,0 +1,5 @@ +repa A +repa 1 +repa b +repa _ +repa diff --git a/tools/test/sort/regression/ref/test02nu b/tools/test/sort/regression/ref/test02nu new file mode 100644 index 00000000000..cb2d50e1d81 --- /dev/null +++ b/tools/test/sort/regression/ref/test02nu @@ -0,0 +1 @@ +repa A diff --git a/tools/test/sort/regression/ref/test02r b/tools/test/sort/regression/ref/test02r new file mode 100644 index 00000000000..b58ae3036ea --- /dev/null +++ b/tools/test/sort/regression/ref/test02r @@ -0,0 +1,5 @@ +repa b +repa _ +repa A +repa 1 +repa diff --git a/tools/test/sort/regression/ref/test02u b/tools/test/sort/regression/ref/test02u new file mode 100644 index 00000000000..e892a1a8c2d --- /dev/null +++ b/tools/test/sort/regression/ref/test02u @@ -0,0 +1,5 @@ +repa +repa 1 +repa A +repa _ +repa b diff --git a/tools/test/sort/regression/ref/test03 b/tools/test/sort/regression/ref/test03 new file mode 100644 index 00000000000..65dd512bf4f --- /dev/null +++ b/tools/test/sort/regression/ref/test03 @@ -0,0 +1,10 @@ +Bab +___kád +_bab +_barack +alma +cipõ +gyerek +korte +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test03M b/tools/test/sort/regression/ref/test03M new file mode 100644 index 00000000000..65dd512bf4f --- /dev/null +++ b/tools/test/sort/regression/ref/test03M @@ -0,0 +1,10 @@ +Bab +___kád +_bab +_barack +alma +cipõ +gyerek +korte +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test03Mr b/tools/test/sort/regression/ref/test03Mr new file mode 100644 index 00000000000..885636e17c9 --- /dev/null +++ b/tools/test/sort/regression/ref/test03Mr @@ -0,0 +1,10 @@ +zakó +limonádé +korte +gyerek +cipõ +alma +_barack +_bab +___kád +Bab diff --git a/tools/test/sort/regression/ref/test03b b/tools/test/sort/regression/ref/test03b new file mode 100644 index 00000000000..65dd512bf4f --- /dev/null +++ b/tools/test/sort/regression/ref/test03b @@ -0,0 +1,10 @@ +Bab +___kád +_bab +_barack +alma +cipõ +gyerek +korte +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test03bd b/tools/test/sort/regression/ref/test03bd new file mode 100644 index 00000000000..7a43facadf6 --- /dev/null +++ b/tools/test/sort/regression/ref/test03bd @@ -0,0 +1,10 @@ +Bab +alma +_bab +_barack +cipõ +gyerek +___kád +korte +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test03bs b/tools/test/sort/regression/ref/test03bs new file mode 100644 index 00000000000..65dd512bf4f --- /dev/null +++ b/tools/test/sort/regression/ref/test03bs @@ -0,0 +1,10 @@ +Bab +___kád +_bab +_barack +alma +cipõ +gyerek +korte +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test03bu b/tools/test/sort/regression/ref/test03bu new file mode 100644 index 00000000000..65dd512bf4f --- /dev/null +++ b/tools/test/sort/regression/ref/test03bu @@ -0,0 +1,10 @@ +Bab +___kád +_bab +_barack +alma +cipõ +gyerek +korte +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test03f b/tools/test/sort/regression/ref/test03f new file mode 100644 index 00000000000..8249ce4d10e --- /dev/null +++ b/tools/test/sort/regression/ref/test03f @@ -0,0 +1,10 @@ +alma +Bab +cipõ +gyerek +korte +limonádé +zakó +_bab +_barack +___kád diff --git a/tools/test/sort/regression/ref/test03fr b/tools/test/sort/regression/ref/test03fr new file mode 100644 index 00000000000..6f8c1bba377 --- /dev/null +++ b/tools/test/sort/regression/ref/test03fr @@ -0,0 +1,10 @@ +___kád +_barack +_bab +zakó +limonádé +korte +gyerek +cipõ +Bab +alma diff --git a/tools/test/sort/regression/ref/test03fs b/tools/test/sort/regression/ref/test03fs new file mode 100644 index 00000000000..8249ce4d10e --- /dev/null +++ b/tools/test/sort/regression/ref/test03fs @@ -0,0 +1,10 @@ +alma +Bab +cipõ +gyerek +korte +limonádé +zakó +_bab +_barack +___kád diff --git a/tools/test/sort/regression/ref/test03fu b/tools/test/sort/regression/ref/test03fu new file mode 100644 index 00000000000..8249ce4d10e --- /dev/null +++ b/tools/test/sort/regression/ref/test03fu @@ -0,0 +1,10 @@ +alma +Bab +cipõ +gyerek +korte +limonádé +zakó +_bab +_barack +___kád diff --git a/tools/test/sort/regression/ref/test03g b/tools/test/sort/regression/ref/test03g new file mode 100644 index 00000000000..65dd512bf4f --- /dev/null +++ b/tools/test/sort/regression/ref/test03g @@ -0,0 +1,10 @@ +Bab +___kád +_bab +_barack +alma +cipõ +gyerek +korte +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test03gr b/tools/test/sort/regression/ref/test03gr new file mode 100644 index 00000000000..885636e17c9 --- /dev/null +++ b/tools/test/sort/regression/ref/test03gr @@ -0,0 +1,10 @@ +zakó +limonádé +korte +gyerek +cipõ +alma +_barack +_bab +___kád +Bab diff --git a/tools/test/sort/regression/ref/test03gs b/tools/test/sort/regression/ref/test03gs new file mode 100644 index 00000000000..be3263ff6e2 --- /dev/null +++ b/tools/test/sort/regression/ref/test03gs @@ -0,0 +1,10 @@ +_bab +Bab +zakó +limonádé +___kád +gyerek +cipõ +alma +_barack +korte diff --git a/tools/test/sort/regression/ref/test03gu b/tools/test/sort/regression/ref/test03gu new file mode 100644 index 00000000000..28159136c92 --- /dev/null +++ b/tools/test/sort/regression/ref/test03gu @@ -0,0 +1 @@ +_bab diff --git a/tools/test/sort/regression/ref/test03i b/tools/test/sort/regression/ref/test03i new file mode 100644 index 00000000000..65dd512bf4f --- /dev/null +++ b/tools/test/sort/regression/ref/test03i @@ -0,0 +1,10 @@ +Bab +___kád +_bab +_barack +alma +cipõ +gyerek +korte +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test03ir b/tools/test/sort/regression/ref/test03ir new file mode 100644 index 00000000000..885636e17c9 --- /dev/null +++ b/tools/test/sort/regression/ref/test03ir @@ -0,0 +1,10 @@ +zakó +limonádé +korte +gyerek +cipõ +alma +_barack +_bab +___kád +Bab diff --git a/tools/test/sort/regression/ref/test03n b/tools/test/sort/regression/ref/test03n new file mode 100644 index 00000000000..65dd512bf4f --- /dev/null +++ b/tools/test/sort/regression/ref/test03n @@ -0,0 +1,10 @@ +Bab +___kád +_bab +_barack +alma +cipõ +gyerek +korte +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test03nr b/tools/test/sort/regression/ref/test03nr new file mode 100644 index 00000000000..885636e17c9 --- /dev/null +++ b/tools/test/sort/regression/ref/test03nr @@ -0,0 +1,10 @@ +zakó +limonádé +korte +gyerek +cipõ +alma +_barack +_bab +___kád +Bab diff --git a/tools/test/sort/regression/ref/test03ns b/tools/test/sort/regression/ref/test03ns new file mode 100644 index 00000000000..be3263ff6e2 --- /dev/null +++ b/tools/test/sort/regression/ref/test03ns @@ -0,0 +1,10 @@ +_bab +Bab +zakó +limonádé +___kád +gyerek +cipõ +alma +_barack +korte diff --git a/tools/test/sort/regression/ref/test03nu b/tools/test/sort/regression/ref/test03nu new file mode 100644 index 00000000000..28159136c92 --- /dev/null +++ b/tools/test/sort/regression/ref/test03nu @@ -0,0 +1 @@ +_bab diff --git a/tools/test/sort/regression/ref/test03r b/tools/test/sort/regression/ref/test03r new file mode 100644 index 00000000000..885636e17c9 --- /dev/null +++ b/tools/test/sort/regression/ref/test03r @@ -0,0 +1,10 @@ +zakó +limonádé +korte +gyerek +cipõ +alma +_barack +_bab +___kád +Bab diff --git a/tools/test/sort/regression/ref/test03u b/tools/test/sort/regression/ref/test03u new file mode 100644 index 00000000000..65dd512bf4f --- /dev/null +++ b/tools/test/sort/regression/ref/test03u @@ -0,0 +1,10 @@ +Bab +___kád +_bab +_barack +alma +cipõ +gyerek +korte +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test04 b/tools/test/sort/regression/ref/test04 new file mode 100644 index 00000000000..a1c85c24d13 --- /dev/null +++ b/tools/test/sort/regression/ref/test04 @@ -0,0 +1,9 @@ +-124 +-543b +2336 +23453252 +543 +543a +56572 +a414 +z123 diff --git a/tools/test/sort/regression/ref/test04M b/tools/test/sort/regression/ref/test04M new file mode 100644 index 00000000000..a1c85c24d13 --- /dev/null +++ b/tools/test/sort/regression/ref/test04M @@ -0,0 +1,9 @@ +-124 +-543b +2336 +23453252 +543 +543a +56572 +a414 +z123 diff --git a/tools/test/sort/regression/ref/test04Mr b/tools/test/sort/regression/ref/test04Mr new file mode 100644 index 00000000000..a1c3ab39b25 --- /dev/null +++ b/tools/test/sort/regression/ref/test04Mr @@ -0,0 +1,9 @@ +z123 +a414 +56572 +543a +543 +23453252 +2336 +-543b +-124 diff --git a/tools/test/sort/regression/ref/test04b b/tools/test/sort/regression/ref/test04b new file mode 100644 index 00000000000..a1c85c24d13 --- /dev/null +++ b/tools/test/sort/regression/ref/test04b @@ -0,0 +1,9 @@ +-124 +-543b +2336 +23453252 +543 +543a +56572 +a414 +z123 diff --git a/tools/test/sort/regression/ref/test04bd b/tools/test/sort/regression/ref/test04bd new file mode 100644 index 00000000000..9e1811bfed6 --- /dev/null +++ b/tools/test/sort/regression/ref/test04bd @@ -0,0 +1,9 @@ +-124 +2336 +23453252 +543 +543a +-543b +56572 +a414 +z123 diff --git a/tools/test/sort/regression/ref/test04bs b/tools/test/sort/regression/ref/test04bs new file mode 100644 index 00000000000..a1c85c24d13 --- /dev/null +++ b/tools/test/sort/regression/ref/test04bs @@ -0,0 +1,9 @@ +-124 +-543b +2336 +23453252 +543 +543a +56572 +a414 +z123 diff --git a/tools/test/sort/regression/ref/test04bu b/tools/test/sort/regression/ref/test04bu new file mode 100644 index 00000000000..a1c85c24d13 --- /dev/null +++ b/tools/test/sort/regression/ref/test04bu @@ -0,0 +1,9 @@ +-124 +-543b +2336 +23453252 +543 +543a +56572 +a414 +z123 diff --git a/tools/test/sort/regression/ref/test04f b/tools/test/sort/regression/ref/test04f new file mode 100644 index 00000000000..a1c85c24d13 --- /dev/null +++ b/tools/test/sort/regression/ref/test04f @@ -0,0 +1,9 @@ +-124 +-543b +2336 +23453252 +543 +543a +56572 +a414 +z123 diff --git a/tools/test/sort/regression/ref/test04fr b/tools/test/sort/regression/ref/test04fr new file mode 100644 index 00000000000..a1c3ab39b25 --- /dev/null +++ b/tools/test/sort/regression/ref/test04fr @@ -0,0 +1,9 @@ +z123 +a414 +56572 +543a +543 +23453252 +2336 +-543b +-124 diff --git a/tools/test/sort/regression/ref/test04fs b/tools/test/sort/regression/ref/test04fs new file mode 100644 index 00000000000..a1c85c24d13 --- /dev/null +++ b/tools/test/sort/regression/ref/test04fs @@ -0,0 +1,9 @@ +-124 +-543b +2336 +23453252 +543 +543a +56572 +a414 +z123 diff --git a/tools/test/sort/regression/ref/test04fu b/tools/test/sort/regression/ref/test04fu new file mode 100644 index 00000000000..a1c85c24d13 --- /dev/null +++ b/tools/test/sort/regression/ref/test04fu @@ -0,0 +1,9 @@ +-124 +-543b +2336 +23453252 +543 +543a +56572 +a414 +z123 diff --git a/tools/test/sort/regression/ref/test04g b/tools/test/sort/regression/ref/test04g new file mode 100644 index 00000000000..89aa06b43cb --- /dev/null +++ b/tools/test/sort/regression/ref/test04g @@ -0,0 +1,9 @@ +a414 +z123 +-543b +-124 +543 +543a +2336 +56572 +23453252 diff --git a/tools/test/sort/regression/ref/test04gr b/tools/test/sort/regression/ref/test04gr new file mode 100644 index 00000000000..c8569fd41ab --- /dev/null +++ b/tools/test/sort/regression/ref/test04gr @@ -0,0 +1,9 @@ +23453252 +56572 +2336 +543a +543 +-124 +-543b +z123 +a414 diff --git a/tools/test/sort/regression/ref/test04gs b/tools/test/sort/regression/ref/test04gs new file mode 100644 index 00000000000..89aa06b43cb --- /dev/null +++ b/tools/test/sort/regression/ref/test04gs @@ -0,0 +1,9 @@ +a414 +z123 +-543b +-124 +543 +543a +2336 +56572 +23453252 diff --git a/tools/test/sort/regression/ref/test04gu b/tools/test/sort/regression/ref/test04gu new file mode 100644 index 00000000000..47a1b4d9c0b --- /dev/null +++ b/tools/test/sort/regression/ref/test04gu @@ -0,0 +1,7 @@ +a414 +-543b +-124 +543 +2336 +56572 +23453252 diff --git a/tools/test/sort/regression/ref/test04i b/tools/test/sort/regression/ref/test04i new file mode 100644 index 00000000000..a1c85c24d13 --- /dev/null +++ b/tools/test/sort/regression/ref/test04i @@ -0,0 +1,9 @@ +-124 +-543b +2336 +23453252 +543 +543a +56572 +a414 +z123 diff --git a/tools/test/sort/regression/ref/test04ir b/tools/test/sort/regression/ref/test04ir new file mode 100644 index 00000000000..a1c3ab39b25 --- /dev/null +++ b/tools/test/sort/regression/ref/test04ir @@ -0,0 +1,9 @@ +z123 +a414 +56572 +543a +543 +23453252 +2336 +-543b +-124 diff --git a/tools/test/sort/regression/ref/test04n b/tools/test/sort/regression/ref/test04n new file mode 100644 index 00000000000..466f9872af5 --- /dev/null +++ b/tools/test/sort/regression/ref/test04n @@ -0,0 +1,9 @@ +-543b +-124 +a414 +z123 +543 +543a +2336 +56572 +23453252 diff --git a/tools/test/sort/regression/ref/test04nr b/tools/test/sort/regression/ref/test04nr new file mode 100644 index 00000000000..8b607bc6627 --- /dev/null +++ b/tools/test/sort/regression/ref/test04nr @@ -0,0 +1,9 @@ +23453252 +56572 +2336 +543a +543 +z123 +a414 +-124 +-543b diff --git a/tools/test/sort/regression/ref/test04ns b/tools/test/sort/regression/ref/test04ns new file mode 100644 index 00000000000..466f9872af5 --- /dev/null +++ b/tools/test/sort/regression/ref/test04ns @@ -0,0 +1,9 @@ +-543b +-124 +a414 +z123 +543 +543a +2336 +56572 +23453252 diff --git a/tools/test/sort/regression/ref/test04nu b/tools/test/sort/regression/ref/test04nu new file mode 100644 index 00000000000..b7ca9249b2d --- /dev/null +++ b/tools/test/sort/regression/ref/test04nu @@ -0,0 +1,7 @@ +-543b +-124 +a414 +543 +2336 +56572 +23453252 diff --git a/tools/test/sort/regression/ref/test04r b/tools/test/sort/regression/ref/test04r new file mode 100644 index 00000000000..a1c3ab39b25 --- /dev/null +++ b/tools/test/sort/regression/ref/test04r @@ -0,0 +1,9 @@ +z123 +a414 +56572 +543a +543 +23453252 +2336 +-543b +-124 diff --git a/tools/test/sort/regression/ref/test04u b/tools/test/sort/regression/ref/test04u new file mode 100644 index 00000000000..a1c85c24d13 --- /dev/null +++ b/tools/test/sort/regression/ref/test04u @@ -0,0 +1,9 @@ +-124 +-543b +2336 +23453252 +543 +543a +56572 +a414 +z123 diff --git a/tools/test/sort/regression/ref/test05 b/tools/test/sort/regression/ref/test05 new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05 @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05M b/tools/test/sort/regression/ref/test05M new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05M @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05Mr b/tools/test/sort/regression/ref/test05Mr new file mode 100644 index 00000000000..7b667611ecb --- /dev/null +++ b/tools/test/sort/regression/ref/test05Mr @@ -0,0 +1,3 @@ +gamma +beta +alfa diff --git a/tools/test/sort/regression/ref/test05b b/tools/test/sort/regression/ref/test05b new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05b @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05bd b/tools/test/sort/regression/ref/test05bd new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05bd @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05bs b/tools/test/sort/regression/ref/test05bs new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05bs @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05bu b/tools/test/sort/regression/ref/test05bu new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05bu @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05f b/tools/test/sort/regression/ref/test05f new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05f @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05fr b/tools/test/sort/regression/ref/test05fr new file mode 100644 index 00000000000..7b667611ecb --- /dev/null +++ b/tools/test/sort/regression/ref/test05fr @@ -0,0 +1,3 @@ +gamma +beta +alfa diff --git a/tools/test/sort/regression/ref/test05fs b/tools/test/sort/regression/ref/test05fs new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05fs @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05fu b/tools/test/sort/regression/ref/test05fu new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05fu @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05g b/tools/test/sort/regression/ref/test05g new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05g @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05gr b/tools/test/sort/regression/ref/test05gr new file mode 100644 index 00000000000..7b667611ecb --- /dev/null +++ b/tools/test/sort/regression/ref/test05gr @@ -0,0 +1,3 @@ +gamma +beta +alfa diff --git a/tools/test/sort/regression/ref/test05gs b/tools/test/sort/regression/ref/test05gs new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05gs @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05gu b/tools/test/sort/regression/ref/test05gu new file mode 100644 index 00000000000..c3649c3b018 --- /dev/null +++ b/tools/test/sort/regression/ref/test05gu @@ -0,0 +1 @@ +alfa diff --git a/tools/test/sort/regression/ref/test05i b/tools/test/sort/regression/ref/test05i new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05i @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05ir b/tools/test/sort/regression/ref/test05ir new file mode 100644 index 00000000000..7b667611ecb --- /dev/null +++ b/tools/test/sort/regression/ref/test05ir @@ -0,0 +1,3 @@ +gamma +beta +alfa diff --git a/tools/test/sort/regression/ref/test05n b/tools/test/sort/regression/ref/test05n new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05n @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05nr b/tools/test/sort/regression/ref/test05nr new file mode 100644 index 00000000000..7b667611ecb --- /dev/null +++ b/tools/test/sort/regression/ref/test05nr @@ -0,0 +1,3 @@ +gamma +beta +alfa diff --git a/tools/test/sort/regression/ref/test05ns b/tools/test/sort/regression/ref/test05ns new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05ns @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test05nu b/tools/test/sort/regression/ref/test05nu new file mode 100644 index 00000000000..c3649c3b018 --- /dev/null +++ b/tools/test/sort/regression/ref/test05nu @@ -0,0 +1 @@ +alfa diff --git a/tools/test/sort/regression/ref/test05r b/tools/test/sort/regression/ref/test05r new file mode 100644 index 00000000000..7b667611ecb --- /dev/null +++ b/tools/test/sort/regression/ref/test05r @@ -0,0 +1,3 @@ +gamma +beta +alfa diff --git a/tools/test/sort/regression/ref/test05u b/tools/test/sort/regression/ref/test05u new file mode 100644 index 00000000000..48ac074c58b --- /dev/null +++ b/tools/test/sort/regression/ref/test05u @@ -0,0 +1,3 @@ +alfa +beta +gamma diff --git a/tools/test/sort/regression/ref/test06 b/tools/test/sort/regression/ref/test06 new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06 @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06M b/tools/test/sort/regression/ref/test06M new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06M @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06Mr b/tools/test/sort/regression/ref/test06Mr new file mode 100644 index 00000000000..2fcdda01d31 --- /dev/null +++ b/tools/test/sort/regression/ref/test06Mr @@ -0,0 +1,4 @@ +zeta +psi +beta +alfa diff --git a/tools/test/sort/regression/ref/test06b b/tools/test/sort/regression/ref/test06b new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06b @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06bd b/tools/test/sort/regression/ref/test06bd new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06bd @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06bs b/tools/test/sort/regression/ref/test06bs new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06bs @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06bu b/tools/test/sort/regression/ref/test06bu new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06bu @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06f b/tools/test/sort/regression/ref/test06f new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06f @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06fr b/tools/test/sort/regression/ref/test06fr new file mode 100644 index 00000000000..2fcdda01d31 --- /dev/null +++ b/tools/test/sort/regression/ref/test06fr @@ -0,0 +1,4 @@ +zeta +psi +beta +alfa diff --git a/tools/test/sort/regression/ref/test06fs b/tools/test/sort/regression/ref/test06fs new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06fs @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06fu b/tools/test/sort/regression/ref/test06fu new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06fu @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06g b/tools/test/sort/regression/ref/test06g new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06g @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06gr b/tools/test/sort/regression/ref/test06gr new file mode 100644 index 00000000000..2fcdda01d31 --- /dev/null +++ b/tools/test/sort/regression/ref/test06gr @@ -0,0 +1,4 @@ +zeta +psi +beta +alfa diff --git a/tools/test/sort/regression/ref/test06gs b/tools/test/sort/regression/ref/test06gs new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06gs @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06gu b/tools/test/sort/regression/ref/test06gu new file mode 100644 index 00000000000..c3649c3b018 --- /dev/null +++ b/tools/test/sort/regression/ref/test06gu @@ -0,0 +1 @@ +alfa diff --git a/tools/test/sort/regression/ref/test06i b/tools/test/sort/regression/ref/test06i new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06i @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06ir b/tools/test/sort/regression/ref/test06ir new file mode 100644 index 00000000000..2fcdda01d31 --- /dev/null +++ b/tools/test/sort/regression/ref/test06ir @@ -0,0 +1,4 @@ +zeta +psi +beta +alfa diff --git a/tools/test/sort/regression/ref/test06n b/tools/test/sort/regression/ref/test06n new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06n @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06nr b/tools/test/sort/regression/ref/test06nr new file mode 100644 index 00000000000..2fcdda01d31 --- /dev/null +++ b/tools/test/sort/regression/ref/test06nr @@ -0,0 +1,4 @@ +zeta +psi +beta +alfa diff --git a/tools/test/sort/regression/ref/test06ns b/tools/test/sort/regression/ref/test06ns new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06ns @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test06nu b/tools/test/sort/regression/ref/test06nu new file mode 100644 index 00000000000..c3649c3b018 --- /dev/null +++ b/tools/test/sort/regression/ref/test06nu @@ -0,0 +1 @@ +alfa diff --git a/tools/test/sort/regression/ref/test06r b/tools/test/sort/regression/ref/test06r new file mode 100644 index 00000000000..2fcdda01d31 --- /dev/null +++ b/tools/test/sort/regression/ref/test06r @@ -0,0 +1,4 @@ +zeta +psi +beta +alfa diff --git a/tools/test/sort/regression/ref/test06u b/tools/test/sort/regression/ref/test06u new file mode 100644 index 00000000000..581f1b7f166 --- /dev/null +++ b/tools/test/sort/regression/ref/test06u @@ -0,0 +1,4 @@ +alfa +beta +psi +zeta diff --git a/tools/test/sort/regression/ref/test07 b/tools/test/sort/regression/ref/test07 new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07 @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test07M b/tools/test/sort/regression/ref/test07M new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07M @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test07Mr b/tools/test/sort/regression/ref/test07Mr new file mode 100644 index 00000000000..2bd39426403 --- /dev/null +++ b/tools/test/sort/regression/ref/test07Mr @@ -0,0 +1,4 @@ +zz +gamma +epszilon +delta diff --git a/tools/test/sort/regression/ref/test07b b/tools/test/sort/regression/ref/test07b new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07b @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test07bd b/tools/test/sort/regression/ref/test07bd new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07bd @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test07bs b/tools/test/sort/regression/ref/test07bs new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07bs @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test07bu b/tools/test/sort/regression/ref/test07bu new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07bu @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test07f b/tools/test/sort/regression/ref/test07f new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07f @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test07fr b/tools/test/sort/regression/ref/test07fr new file mode 100644 index 00000000000..2bd39426403 --- /dev/null +++ b/tools/test/sort/regression/ref/test07fr @@ -0,0 +1,4 @@ +zz +gamma +epszilon +delta diff --git a/tools/test/sort/regression/ref/test07fs b/tools/test/sort/regression/ref/test07fs new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07fs @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test07fu b/tools/test/sort/regression/ref/test07fu new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07fu @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test07g b/tools/test/sort/regression/ref/test07g new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07g @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test07gr b/tools/test/sort/regression/ref/test07gr new file mode 100644 index 00000000000..2bd39426403 --- /dev/null +++ b/tools/test/sort/regression/ref/test07gr @@ -0,0 +1,4 @@ +zz +gamma +epszilon +delta diff --git a/tools/test/sort/regression/ref/test07gs b/tools/test/sort/regression/ref/test07gs new file mode 100644 index 00000000000..fbf6168c5a5 --- /dev/null +++ b/tools/test/sort/regression/ref/test07gs @@ -0,0 +1,4 @@ +gamma +delta +epszilon +zz diff --git a/tools/test/sort/regression/ref/test07gu b/tools/test/sort/regression/ref/test07gu new file mode 100644 index 00000000000..af17f6cc87e --- /dev/null +++ b/tools/test/sort/regression/ref/test07gu @@ -0,0 +1 @@ +gamma diff --git a/tools/test/sort/regression/ref/test07i b/tools/test/sort/regression/ref/test07i new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07i @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test07ir b/tools/test/sort/regression/ref/test07ir new file mode 100644 index 00000000000..2bd39426403 --- /dev/null +++ b/tools/test/sort/regression/ref/test07ir @@ -0,0 +1,4 @@ +zz +gamma +epszilon +delta diff --git a/tools/test/sort/regression/ref/test07n b/tools/test/sort/regression/ref/test07n new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07n @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test07nr b/tools/test/sort/regression/ref/test07nr new file mode 100644 index 00000000000..2bd39426403 --- /dev/null +++ b/tools/test/sort/regression/ref/test07nr @@ -0,0 +1,4 @@ +zz +gamma +epszilon +delta diff --git a/tools/test/sort/regression/ref/test07ns b/tools/test/sort/regression/ref/test07ns new file mode 100644 index 00000000000..fbf6168c5a5 --- /dev/null +++ b/tools/test/sort/regression/ref/test07ns @@ -0,0 +1,4 @@ +gamma +delta +epszilon +zz diff --git a/tools/test/sort/regression/ref/test07nu b/tools/test/sort/regression/ref/test07nu new file mode 100644 index 00000000000..af17f6cc87e --- /dev/null +++ b/tools/test/sort/regression/ref/test07nu @@ -0,0 +1 @@ +gamma diff --git a/tools/test/sort/regression/ref/test07r b/tools/test/sort/regression/ref/test07r new file mode 100644 index 00000000000..2bd39426403 --- /dev/null +++ b/tools/test/sort/regression/ref/test07r @@ -0,0 +1,4 @@ +zz +gamma +epszilon +delta diff --git a/tools/test/sort/regression/ref/test07u b/tools/test/sort/regression/ref/test07u new file mode 100644 index 00000000000..fadf8da705e --- /dev/null +++ b/tools/test/sort/regression/ref/test07u @@ -0,0 +1,4 @@ +delta +epszilon +gamma +zz diff --git a/tools/test/sort/regression/ref/test08 b/tools/test/sort/regression/ref/test08 new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/ref/test08 @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/ref/test08M b/tools/test/sort/regression/ref/test08M new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/ref/test08M @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/ref/test08Mr b/tools/test/sort/regression/ref/test08Mr new file mode 100644 index 00000000000..a1fe9caf49d --- /dev/null +++ b/tools/test/sort/regression/ref/test08Mr @@ -0,0 +1,4 @@ +bbb +bbb +aaa +aaa diff --git a/tools/test/sort/regression/ref/test08b b/tools/test/sort/regression/ref/test08b new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/ref/test08b @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/ref/test08bd b/tools/test/sort/regression/ref/test08bd new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/ref/test08bd @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/ref/test08bs b/tools/test/sort/regression/ref/test08bs new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/ref/test08bs @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/ref/test08bu b/tools/test/sort/regression/ref/test08bu new file mode 100644 index 00000000000..dbee0265d31 --- /dev/null +++ b/tools/test/sort/regression/ref/test08bu @@ -0,0 +1,2 @@ +aaa +bbb diff --git a/tools/test/sort/regression/ref/test08f b/tools/test/sort/regression/ref/test08f new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/ref/test08f @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/ref/test08fr b/tools/test/sort/regression/ref/test08fr new file mode 100644 index 00000000000..a1fe9caf49d --- /dev/null +++ b/tools/test/sort/regression/ref/test08fr @@ -0,0 +1,4 @@ +bbb +bbb +aaa +aaa diff --git a/tools/test/sort/regression/ref/test08fs b/tools/test/sort/regression/ref/test08fs new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/ref/test08fs @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/ref/test08fu b/tools/test/sort/regression/ref/test08fu new file mode 100644 index 00000000000..dbee0265d31 --- /dev/null +++ b/tools/test/sort/regression/ref/test08fu @@ -0,0 +1,2 @@ +aaa +bbb diff --git a/tools/test/sort/regression/ref/test08g b/tools/test/sort/regression/ref/test08g new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/ref/test08g @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/ref/test08gr b/tools/test/sort/regression/ref/test08gr new file mode 100644 index 00000000000..a1fe9caf49d --- /dev/null +++ b/tools/test/sort/regression/ref/test08gr @@ -0,0 +1,4 @@ +bbb +bbb +aaa +aaa diff --git a/tools/test/sort/regression/ref/test08gs b/tools/test/sort/regression/ref/test08gs new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/ref/test08gs @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/ref/test08gu b/tools/test/sort/regression/ref/test08gu new file mode 100644 index 00000000000..72943a16fb2 --- /dev/null +++ b/tools/test/sort/regression/ref/test08gu @@ -0,0 +1 @@ +aaa diff --git a/tools/test/sort/regression/ref/test08i b/tools/test/sort/regression/ref/test08i new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/ref/test08i @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/ref/test08ir b/tools/test/sort/regression/ref/test08ir new file mode 100644 index 00000000000..a1fe9caf49d --- /dev/null +++ b/tools/test/sort/regression/ref/test08ir @@ -0,0 +1,4 @@ +bbb +bbb +aaa +aaa diff --git a/tools/test/sort/regression/ref/test08n b/tools/test/sort/regression/ref/test08n new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/ref/test08n @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/ref/test08nr b/tools/test/sort/regression/ref/test08nr new file mode 100644 index 00000000000..a1fe9caf49d --- /dev/null +++ b/tools/test/sort/regression/ref/test08nr @@ -0,0 +1,4 @@ +bbb +bbb +aaa +aaa diff --git a/tools/test/sort/regression/ref/test08ns b/tools/test/sort/regression/ref/test08ns new file mode 100644 index 00000000000..8189ab3768d --- /dev/null +++ b/tools/test/sort/regression/ref/test08ns @@ -0,0 +1,4 @@ +aaa +aaa +bbb +bbb diff --git a/tools/test/sort/regression/ref/test08nu b/tools/test/sort/regression/ref/test08nu new file mode 100644 index 00000000000..72943a16fb2 --- /dev/null +++ b/tools/test/sort/regression/ref/test08nu @@ -0,0 +1 @@ +aaa diff --git a/tools/test/sort/regression/ref/test08r b/tools/test/sort/regression/ref/test08r new file mode 100644 index 00000000000..a1fe9caf49d --- /dev/null +++ b/tools/test/sort/regression/ref/test08r @@ -0,0 +1,4 @@ +bbb +bbb +aaa +aaa diff --git a/tools/test/sort/regression/ref/test08u b/tools/test/sort/regression/ref/test08u new file mode 100644 index 00000000000..dbee0265d31 --- /dev/null +++ b/tools/test/sort/regression/ref/test08u @@ -0,0 +1,2 @@ +aaa +bbb diff --git a/tools/test/sort/regression/ref/test09 b/tools/test/sort/regression/ref/test09 new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09 @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09M b/tools/test/sort/regression/ref/test09M new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09M @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09Mr b/tools/test/sort/regression/ref/test09Mr new file mode 100644 index 00000000000..7e5ca48a3d5 --- /dev/null +++ b/tools/test/sort/regression/ref/test09Mr @@ -0,0 +1,9 @@ +zakó +limonádé +kád +korte +gyerek +cipõ +barack +bab +alma diff --git a/tools/test/sort/regression/ref/test09b b/tools/test/sort/regression/ref/test09b new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09b @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09bd b/tools/test/sort/regression/ref/test09bd new file mode 100644 index 00000000000..a40bfb00997 --- /dev/null +++ b/tools/test/sort/regression/ref/test09bd @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +kád +korte +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09bs b/tools/test/sort/regression/ref/test09bs new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09bs @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09bu b/tools/test/sort/regression/ref/test09bu new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09bu @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09f b/tools/test/sort/regression/ref/test09f new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09f @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09fr b/tools/test/sort/regression/ref/test09fr new file mode 100644 index 00000000000..7e5ca48a3d5 --- /dev/null +++ b/tools/test/sort/regression/ref/test09fr @@ -0,0 +1,9 @@ +zakó +limonádé +kád +korte +gyerek +cipõ +barack +bab +alma diff --git a/tools/test/sort/regression/ref/test09fs b/tools/test/sort/regression/ref/test09fs new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09fs @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09fu b/tools/test/sort/regression/ref/test09fu new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09fu @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09g b/tools/test/sort/regression/ref/test09g new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09g @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09gr b/tools/test/sort/regression/ref/test09gr new file mode 100644 index 00000000000..7e5ca48a3d5 --- /dev/null +++ b/tools/test/sort/regression/ref/test09gr @@ -0,0 +1,9 @@ +zakó +limonádé +kád +korte +gyerek +cipõ +barack +bab +alma diff --git a/tools/test/sort/regression/ref/test09gs b/tools/test/sort/regression/ref/test09gs new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09gs @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09gu b/tools/test/sort/regression/ref/test09gu new file mode 100644 index 00000000000..9c9acdc32f5 --- /dev/null +++ b/tools/test/sort/regression/ref/test09gu @@ -0,0 +1 @@ +alma diff --git a/tools/test/sort/regression/ref/test09i b/tools/test/sort/regression/ref/test09i new file mode 100644 index 00000000000..a40bfb00997 --- /dev/null +++ b/tools/test/sort/regression/ref/test09i @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +kád +korte +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09ir b/tools/test/sort/regression/ref/test09ir new file mode 100644 index 00000000000..96e9b7c71a1 --- /dev/null +++ b/tools/test/sort/regression/ref/test09ir @@ -0,0 +1,9 @@ +zakó +limonádé +korte +kád +gyerek +cipõ +barack +bab +alma diff --git a/tools/test/sort/regression/ref/test09n b/tools/test/sort/regression/ref/test09n new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09n @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09nr b/tools/test/sort/regression/ref/test09nr new file mode 100644 index 00000000000..7e5ca48a3d5 --- /dev/null +++ b/tools/test/sort/regression/ref/test09nr @@ -0,0 +1,9 @@ +zakó +limonádé +kád +korte +gyerek +cipõ +barack +bab +alma diff --git a/tools/test/sort/regression/ref/test09ns b/tools/test/sort/regression/ref/test09ns new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09ns @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test09nu b/tools/test/sort/regression/ref/test09nu new file mode 100644 index 00000000000..9c9acdc32f5 --- /dev/null +++ b/tools/test/sort/regression/ref/test09nu @@ -0,0 +1 @@ +alma diff --git a/tools/test/sort/regression/ref/test09r b/tools/test/sort/regression/ref/test09r new file mode 100644 index 00000000000..7e5ca48a3d5 --- /dev/null +++ b/tools/test/sort/regression/ref/test09r @@ -0,0 +1,9 @@ +zakó +limonádé +kád +korte +gyerek +cipõ +barack +bab +alma diff --git a/tools/test/sort/regression/ref/test09u b/tools/test/sort/regression/ref/test09u new file mode 100644 index 00000000000..87ba46010db --- /dev/null +++ b/tools/test/sort/regression/ref/test09u @@ -0,0 +1,9 @@ +alma +bab +barack +cipõ +gyerek +korte +kád +limonádé +zakó diff --git a/tools/test/sort/regression/ref/test10 b/tools/test/sort/regression/ref/test10 new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10 @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10M b/tools/test/sort/regression/ref/test10M new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10M @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10Mr b/tools/test/sort/regression/ref/test10Mr new file mode 100644 index 00000000000..e90d0661c35 --- /dev/null +++ b/tools/test/sort/regression/ref/test10Mr @@ -0,0 +1,2 @@ +beta +alfa diff --git a/tools/test/sort/regression/ref/test10b b/tools/test/sort/regression/ref/test10b new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10b @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10bd b/tools/test/sort/regression/ref/test10bd new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10bd @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10bs b/tools/test/sort/regression/ref/test10bs new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10bs @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10bu b/tools/test/sort/regression/ref/test10bu new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10bu @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10f b/tools/test/sort/regression/ref/test10f new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10f @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10fr b/tools/test/sort/regression/ref/test10fr new file mode 100644 index 00000000000..e90d0661c35 --- /dev/null +++ b/tools/test/sort/regression/ref/test10fr @@ -0,0 +1,2 @@ +beta +alfa diff --git a/tools/test/sort/regression/ref/test10fs b/tools/test/sort/regression/ref/test10fs new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10fs @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10fu b/tools/test/sort/regression/ref/test10fu new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10fu @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10g b/tools/test/sort/regression/ref/test10g new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10g @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10gr b/tools/test/sort/regression/ref/test10gr new file mode 100644 index 00000000000..e90d0661c35 --- /dev/null +++ b/tools/test/sort/regression/ref/test10gr @@ -0,0 +1,2 @@ +beta +alfa diff --git a/tools/test/sort/regression/ref/test10gs b/tools/test/sort/regression/ref/test10gs new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10gs @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10gu b/tools/test/sort/regression/ref/test10gu new file mode 100644 index 00000000000..c3649c3b018 --- /dev/null +++ b/tools/test/sort/regression/ref/test10gu @@ -0,0 +1 @@ +alfa diff --git a/tools/test/sort/regression/ref/test10i b/tools/test/sort/regression/ref/test10i new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10i @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10ir b/tools/test/sort/regression/ref/test10ir new file mode 100644 index 00000000000..e90d0661c35 --- /dev/null +++ b/tools/test/sort/regression/ref/test10ir @@ -0,0 +1,2 @@ +beta +alfa diff --git a/tools/test/sort/regression/ref/test10n b/tools/test/sort/regression/ref/test10n new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10n @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10nr b/tools/test/sort/regression/ref/test10nr new file mode 100644 index 00000000000..e90d0661c35 --- /dev/null +++ b/tools/test/sort/regression/ref/test10nr @@ -0,0 +1,2 @@ +beta +alfa diff --git a/tools/test/sort/regression/ref/test10ns b/tools/test/sort/regression/ref/test10ns new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10ns @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test10nu b/tools/test/sort/regression/ref/test10nu new file mode 100644 index 00000000000..c3649c3b018 --- /dev/null +++ b/tools/test/sort/regression/ref/test10nu @@ -0,0 +1 @@ +alfa diff --git a/tools/test/sort/regression/ref/test10r b/tools/test/sort/regression/ref/test10r new file mode 100644 index 00000000000..e90d0661c35 --- /dev/null +++ b/tools/test/sort/regression/ref/test10r @@ -0,0 +1,2 @@ +beta +alfa diff --git a/tools/test/sort/regression/ref/test10u b/tools/test/sort/regression/ref/test10u new file mode 100644 index 00000000000..3ac346e9e38 --- /dev/null +++ b/tools/test/sort/regression/ref/test10u @@ -0,0 +1,2 @@ +alfa +beta diff --git a/tools/test/sort/regression/ref/test11 b/tools/test/sort/regression/ref/test11 new file mode 100644 index 00000000000..4acaf34c7b1 --- /dev/null +++ b/tools/test/sort/regression/ref/test11 @@ -0,0 +1,9 @@ +APR +JAN +MAY +_buff +apre +dec +feb +kutya +mar diff --git a/tools/test/sort/regression/ref/test11M b/tools/test/sort/regression/ref/test11M new file mode 100644 index 00000000000..f06395bfe59 --- /dev/null +++ b/tools/test/sort/regression/ref/test11M @@ -0,0 +1,9 @@ +_buff +kutya +JAN +feb +mar +APR +apre +MAY +dec diff --git a/tools/test/sort/regression/ref/test11Mr b/tools/test/sort/regression/ref/test11Mr new file mode 100644 index 00000000000..db49070aa42 --- /dev/null +++ b/tools/test/sort/regression/ref/test11Mr @@ -0,0 +1,9 @@ +dec +MAY +apre +APR +mar +feb +JAN +kutya +_buff diff --git a/tools/test/sort/regression/ref/test11b b/tools/test/sort/regression/ref/test11b new file mode 100644 index 00000000000..4acaf34c7b1 --- /dev/null +++ b/tools/test/sort/regression/ref/test11b @@ -0,0 +1,9 @@ +APR +JAN +MAY +_buff +apre +dec +feb +kutya +mar diff --git a/tools/test/sort/regression/ref/test11bd b/tools/test/sort/regression/ref/test11bd new file mode 100644 index 00000000000..1cacbf29bfb --- /dev/null +++ b/tools/test/sort/regression/ref/test11bd @@ -0,0 +1,9 @@ +APR +JAN +MAY +apre +_buff +dec +feb +kutya +mar diff --git a/tools/test/sort/regression/ref/test11bs b/tools/test/sort/regression/ref/test11bs new file mode 100644 index 00000000000..4acaf34c7b1 --- /dev/null +++ b/tools/test/sort/regression/ref/test11bs @@ -0,0 +1,9 @@ +APR +JAN +MAY +_buff +apre +dec +feb +kutya +mar diff --git a/tools/test/sort/regression/ref/test11bu b/tools/test/sort/regression/ref/test11bu new file mode 100644 index 00000000000..4acaf34c7b1 --- /dev/null +++ b/tools/test/sort/regression/ref/test11bu @@ -0,0 +1,9 @@ +APR +JAN +MAY +_buff +apre +dec +feb +kutya +mar diff --git a/tools/test/sort/regression/ref/test11f b/tools/test/sort/regression/ref/test11f new file mode 100644 index 00000000000..bf8f70cbf76 --- /dev/null +++ b/tools/test/sort/regression/ref/test11f @@ -0,0 +1,9 @@ +APR +apre +dec +feb +JAN +kutya +mar +MAY +_buff diff --git a/tools/test/sort/regression/ref/test11fr b/tools/test/sort/regression/ref/test11fr new file mode 100644 index 00000000000..28444941939 --- /dev/null +++ b/tools/test/sort/regression/ref/test11fr @@ -0,0 +1,9 @@ +_buff +MAY +mar +kutya +JAN +feb +dec +apre +APR diff --git a/tools/test/sort/regression/ref/test11fs b/tools/test/sort/regression/ref/test11fs new file mode 100644 index 00000000000..bf8f70cbf76 --- /dev/null +++ b/tools/test/sort/regression/ref/test11fs @@ -0,0 +1,9 @@ +APR +apre +dec +feb +JAN +kutya +mar +MAY +_buff diff --git a/tools/test/sort/regression/ref/test11fu b/tools/test/sort/regression/ref/test11fu new file mode 100644 index 00000000000..bf8f70cbf76 --- /dev/null +++ b/tools/test/sort/regression/ref/test11fu @@ -0,0 +1,9 @@ +APR +apre +dec +feb +JAN +kutya +mar +MAY +_buff diff --git a/tools/test/sort/regression/ref/test11g b/tools/test/sort/regression/ref/test11g new file mode 100644 index 00000000000..4acaf34c7b1 --- /dev/null +++ b/tools/test/sort/regression/ref/test11g @@ -0,0 +1,9 @@ +APR +JAN +MAY +_buff +apre +dec +feb +kutya +mar diff --git a/tools/test/sort/regression/ref/test11gr b/tools/test/sort/regression/ref/test11gr new file mode 100644 index 00000000000..ec3c8a25db9 --- /dev/null +++ b/tools/test/sort/regression/ref/test11gr @@ -0,0 +1,9 @@ +mar +kutya +feb +dec +apre +_buff +MAY +JAN +APR diff --git a/tools/test/sort/regression/ref/test11gs b/tools/test/sort/regression/ref/test11gs new file mode 100644 index 00000000000..9bdb02de1d7 --- /dev/null +++ b/tools/test/sort/regression/ref/test11gs @@ -0,0 +1,9 @@ +MAY +dec +JAN +feb +mar +APR +kutya +_buff +apre diff --git a/tools/test/sort/regression/ref/test11gu b/tools/test/sort/regression/ref/test11gu new file mode 100644 index 00000000000..72b189522b9 --- /dev/null +++ b/tools/test/sort/regression/ref/test11gu @@ -0,0 +1 @@ +MAY diff --git a/tools/test/sort/regression/ref/test11i b/tools/test/sort/regression/ref/test11i new file mode 100644 index 00000000000..4acaf34c7b1 --- /dev/null +++ b/tools/test/sort/regression/ref/test11i @@ -0,0 +1,9 @@ +APR +JAN +MAY +_buff +apre +dec +feb +kutya +mar diff --git a/tools/test/sort/regression/ref/test11ir b/tools/test/sort/regression/ref/test11ir new file mode 100644 index 00000000000..ec3c8a25db9 --- /dev/null +++ b/tools/test/sort/regression/ref/test11ir @@ -0,0 +1,9 @@ +mar +kutya +feb +dec +apre +_buff +MAY +JAN +APR diff --git a/tools/test/sort/regression/ref/test11n b/tools/test/sort/regression/ref/test11n new file mode 100644 index 00000000000..4acaf34c7b1 --- /dev/null +++ b/tools/test/sort/regression/ref/test11n @@ -0,0 +1,9 @@ +APR +JAN +MAY +_buff +apre +dec +feb +kutya +mar diff --git a/tools/test/sort/regression/ref/test11nr b/tools/test/sort/regression/ref/test11nr new file mode 100644 index 00000000000..ec3c8a25db9 --- /dev/null +++ b/tools/test/sort/regression/ref/test11nr @@ -0,0 +1,9 @@ +mar +kutya +feb +dec +apre +_buff +MAY +JAN +APR diff --git a/tools/test/sort/regression/ref/test11ns b/tools/test/sort/regression/ref/test11ns new file mode 100644 index 00000000000..9bdb02de1d7 --- /dev/null +++ b/tools/test/sort/regression/ref/test11ns @@ -0,0 +1,9 @@ +MAY +dec +JAN +feb +mar +APR +kutya +_buff +apre diff --git a/tools/test/sort/regression/ref/test11nu b/tools/test/sort/regression/ref/test11nu new file mode 100644 index 00000000000..72b189522b9 --- /dev/null +++ b/tools/test/sort/regression/ref/test11nu @@ -0,0 +1 @@ +MAY diff --git a/tools/test/sort/regression/ref/test11r b/tools/test/sort/regression/ref/test11r new file mode 100644 index 00000000000..ec3c8a25db9 --- /dev/null +++ b/tools/test/sort/regression/ref/test11r @@ -0,0 +1,9 @@ +mar +kutya +feb +dec +apre +_buff +MAY +JAN +APR diff --git a/tools/test/sort/regression/ref/test11u b/tools/test/sort/regression/ref/test11u new file mode 100644 index 00000000000..4acaf34c7b1 --- /dev/null +++ b/tools/test/sort/regression/ref/test11u @@ -0,0 +1,9 @@ +APR +JAN +MAY +_buff +apre +dec +feb +kutya +mar diff --git a/tools/test/sort/regression/ref/test12 b/tools/test/sort/regression/ref/test12 new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12 @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test12M b/tools/test/sort/regression/ref/test12M new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12M @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test12Mr b/tools/test/sort/regression/ref/test12Mr new file mode 100644 index 00000000000..3a20738cebc --- /dev/null +++ b/tools/test/sort/regression/ref/test12Mr @@ -0,0 +1,3 @@ +zfwfgergre 23 +fcergergrd 75 +ddwqrwerfw 34 diff --git a/tools/test/sort/regression/ref/test12b b/tools/test/sort/regression/ref/test12b new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12b @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test12bd b/tools/test/sort/regression/ref/test12bd new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12bd @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test12bs b/tools/test/sort/regression/ref/test12bs new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12bs @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test12bu b/tools/test/sort/regression/ref/test12bu new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12bu @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test12f b/tools/test/sort/regression/ref/test12f new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12f @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test12fr b/tools/test/sort/regression/ref/test12fr new file mode 100644 index 00000000000..3a20738cebc --- /dev/null +++ b/tools/test/sort/regression/ref/test12fr @@ -0,0 +1,3 @@ +zfwfgergre 23 +fcergergrd 75 +ddwqrwerfw 34 diff --git a/tools/test/sort/regression/ref/test12fs b/tools/test/sort/regression/ref/test12fs new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12fs @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test12fu b/tools/test/sort/regression/ref/test12fu new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12fu @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test12g b/tools/test/sort/regression/ref/test12g new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12g @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test12gr b/tools/test/sort/regression/ref/test12gr new file mode 100644 index 00000000000..3a20738cebc --- /dev/null +++ b/tools/test/sort/regression/ref/test12gr @@ -0,0 +1,3 @@ +zfwfgergre 23 +fcergergrd 75 +ddwqrwerfw 34 diff --git a/tools/test/sort/regression/ref/test12gs b/tools/test/sort/regression/ref/test12gs new file mode 100644 index 00000000000..ec895bf73fa --- /dev/null +++ b/tools/test/sort/regression/ref/test12gs @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +zfwfgergre 23 +fcergergrd 75 diff --git a/tools/test/sort/regression/ref/test12gu b/tools/test/sort/regression/ref/test12gu new file mode 100644 index 00000000000..8f191947ed1 --- /dev/null +++ b/tools/test/sort/regression/ref/test12gu @@ -0,0 +1 @@ +ddwqrwerfw 34 diff --git a/tools/test/sort/regression/ref/test12i b/tools/test/sort/regression/ref/test12i new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12i @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test12ir b/tools/test/sort/regression/ref/test12ir new file mode 100644 index 00000000000..3a20738cebc --- /dev/null +++ b/tools/test/sort/regression/ref/test12ir @@ -0,0 +1,3 @@ +zfwfgergre 23 +fcergergrd 75 +ddwqrwerfw 34 diff --git a/tools/test/sort/regression/ref/test12n b/tools/test/sort/regression/ref/test12n new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12n @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test12nr b/tools/test/sort/regression/ref/test12nr new file mode 100644 index 00000000000..3a20738cebc --- /dev/null +++ b/tools/test/sort/regression/ref/test12nr @@ -0,0 +1,3 @@ +zfwfgergre 23 +fcergergrd 75 +ddwqrwerfw 34 diff --git a/tools/test/sort/regression/ref/test12ns b/tools/test/sort/regression/ref/test12ns new file mode 100644 index 00000000000..ec895bf73fa --- /dev/null +++ b/tools/test/sort/regression/ref/test12ns @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +zfwfgergre 23 +fcergergrd 75 diff --git a/tools/test/sort/regression/ref/test12nu b/tools/test/sort/regression/ref/test12nu new file mode 100644 index 00000000000..8f191947ed1 --- /dev/null +++ b/tools/test/sort/regression/ref/test12nu @@ -0,0 +1 @@ +ddwqrwerfw 34 diff --git a/tools/test/sort/regression/ref/test12r b/tools/test/sort/regression/ref/test12r new file mode 100644 index 00000000000..3a20738cebc --- /dev/null +++ b/tools/test/sort/regression/ref/test12r @@ -0,0 +1,3 @@ +zfwfgergre 23 +fcergergrd 75 +ddwqrwerfw 34 diff --git a/tools/test/sort/regression/ref/test12u b/tools/test/sort/regression/ref/test12u new file mode 100644 index 00000000000..b4d98d8e8d2 --- /dev/null +++ b/tools/test/sort/regression/ref/test12u @@ -0,0 +1,3 @@ +ddwqrwerfw 34 +fcergergrd 75 +zfwfgergre 23 diff --git a/tools/test/sort/regression/ref/test13 b/tools/test/sort/regression/ref/test13 new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13 @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test13M b/tools/test/sort/regression/ref/test13M new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13M @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test13Mr b/tools/test/sort/regression/ref/test13Mr new file mode 100644 index 00000000000..7a73dc37d9e --- /dev/null +++ b/tools/test/sort/regression/ref/test13Mr @@ -0,0 +1,3 @@ +zab +lap +kukac diff --git a/tools/test/sort/regression/ref/test13b b/tools/test/sort/regression/ref/test13b new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13b @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test13bd b/tools/test/sort/regression/ref/test13bd new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13bd @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test13bs b/tools/test/sort/regression/ref/test13bs new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13bs @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test13bu b/tools/test/sort/regression/ref/test13bu new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13bu @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test13f b/tools/test/sort/regression/ref/test13f new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13f @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test13fr b/tools/test/sort/regression/ref/test13fr new file mode 100644 index 00000000000..7a73dc37d9e --- /dev/null +++ b/tools/test/sort/regression/ref/test13fr @@ -0,0 +1,3 @@ +zab +lap +kukac diff --git a/tools/test/sort/regression/ref/test13fs b/tools/test/sort/regression/ref/test13fs new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13fs @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test13fu b/tools/test/sort/regression/ref/test13fu new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13fu @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test13g b/tools/test/sort/regression/ref/test13g new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13g @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test13gr b/tools/test/sort/regression/ref/test13gr new file mode 100644 index 00000000000..7a73dc37d9e --- /dev/null +++ b/tools/test/sort/regression/ref/test13gr @@ -0,0 +1,3 @@ +zab +lap +kukac diff --git a/tools/test/sort/regression/ref/test13gs b/tools/test/sort/regression/ref/test13gs new file mode 100644 index 00000000000..6a3f3f8ca9b --- /dev/null +++ b/tools/test/sort/regression/ref/test13gs @@ -0,0 +1,3 @@ +lap +zab +kukac diff --git a/tools/test/sort/regression/ref/test13gu b/tools/test/sort/regression/ref/test13gu new file mode 100644 index 00000000000..21880cab189 --- /dev/null +++ b/tools/test/sort/regression/ref/test13gu @@ -0,0 +1 @@ +lap diff --git a/tools/test/sort/regression/ref/test13i b/tools/test/sort/regression/ref/test13i new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13i @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test13ir b/tools/test/sort/regression/ref/test13ir new file mode 100644 index 00000000000..7a73dc37d9e --- /dev/null +++ b/tools/test/sort/regression/ref/test13ir @@ -0,0 +1,3 @@ +zab +lap +kukac diff --git a/tools/test/sort/regression/ref/test13n b/tools/test/sort/regression/ref/test13n new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13n @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test13nr b/tools/test/sort/regression/ref/test13nr new file mode 100644 index 00000000000..7a73dc37d9e --- /dev/null +++ b/tools/test/sort/regression/ref/test13nr @@ -0,0 +1,3 @@ +zab +lap +kukac diff --git a/tools/test/sort/regression/ref/test13ns b/tools/test/sort/regression/ref/test13ns new file mode 100644 index 00000000000..6a3f3f8ca9b --- /dev/null +++ b/tools/test/sort/regression/ref/test13ns @@ -0,0 +1,3 @@ +lap +zab +kukac diff --git a/tools/test/sort/regression/ref/test13nu b/tools/test/sort/regression/ref/test13nu new file mode 100644 index 00000000000..21880cab189 --- /dev/null +++ b/tools/test/sort/regression/ref/test13nu @@ -0,0 +1 @@ +lap diff --git a/tools/test/sort/regression/ref/test13r b/tools/test/sort/regression/ref/test13r new file mode 100644 index 00000000000..7a73dc37d9e --- /dev/null +++ b/tools/test/sort/regression/ref/test13r @@ -0,0 +1,3 @@ +zab +lap +kukac diff --git a/tools/test/sort/regression/ref/test13u b/tools/test/sort/regression/ref/test13u new file mode 100644 index 00000000000..6955149b679 --- /dev/null +++ b/tools/test/sort/regression/ref/test13u @@ -0,0 +1,3 @@ +kukac +lap +zab diff --git a/tools/test/sort/regression/ref/test14 b/tools/test/sort/regression/ref/test14 new file mode 100644 index 00000000000..017ab018bea --- /dev/null +++ b/tools/test/sort/regression/ref/test14 @@ -0,0 +1,5 @@ +Alma +Bika +alma +bika +korte diff --git a/tools/test/sort/regression/ref/test14M b/tools/test/sort/regression/ref/test14M new file mode 100644 index 00000000000..017ab018bea --- /dev/null +++ b/tools/test/sort/regression/ref/test14M @@ -0,0 +1,5 @@ +Alma +Bika +alma +bika +korte diff --git a/tools/test/sort/regression/ref/test14Mr b/tools/test/sort/regression/ref/test14Mr new file mode 100644 index 00000000000..0f0ec451901 --- /dev/null +++ b/tools/test/sort/regression/ref/test14Mr @@ -0,0 +1,5 @@ +korte +bika +alma +Bika +Alma diff --git a/tools/test/sort/regression/ref/test14b b/tools/test/sort/regression/ref/test14b new file mode 100644 index 00000000000..017ab018bea --- /dev/null +++ b/tools/test/sort/regression/ref/test14b @@ -0,0 +1,5 @@ +Alma +Bika +alma +bika +korte diff --git a/tools/test/sort/regression/ref/test14bd b/tools/test/sort/regression/ref/test14bd new file mode 100644 index 00000000000..017ab018bea --- /dev/null +++ b/tools/test/sort/regression/ref/test14bd @@ -0,0 +1,5 @@ +Alma +Bika +alma +bika +korte diff --git a/tools/test/sort/regression/ref/test14bs b/tools/test/sort/regression/ref/test14bs new file mode 100644 index 00000000000..017ab018bea --- /dev/null +++ b/tools/test/sort/regression/ref/test14bs @@ -0,0 +1,5 @@ +Alma +Bika +alma +bika +korte diff --git a/tools/test/sort/regression/ref/test14bu b/tools/test/sort/regression/ref/test14bu new file mode 100644 index 00000000000..017ab018bea --- /dev/null +++ b/tools/test/sort/regression/ref/test14bu @@ -0,0 +1,5 @@ +Alma +Bika +alma +bika +korte diff --git a/tools/test/sort/regression/ref/test14f b/tools/test/sort/regression/ref/test14f new file mode 100644 index 00000000000..8477521a284 --- /dev/null +++ b/tools/test/sort/regression/ref/test14f @@ -0,0 +1,5 @@ +Alma +alma +Bika +bika +korte diff --git a/tools/test/sort/regression/ref/test14fr b/tools/test/sort/regression/ref/test14fr new file mode 100644 index 00000000000..5a69859f4c8 --- /dev/null +++ b/tools/test/sort/regression/ref/test14fr @@ -0,0 +1,5 @@ +korte +bika +Bika +alma +Alma diff --git a/tools/test/sort/regression/ref/test14fs b/tools/test/sort/regression/ref/test14fs new file mode 100644 index 00000000000..4a53ff9143f --- /dev/null +++ b/tools/test/sort/regression/ref/test14fs @@ -0,0 +1,5 @@ +alma +Alma +Bika +bika +korte diff --git a/tools/test/sort/regression/ref/test14fu b/tools/test/sort/regression/ref/test14fu new file mode 100644 index 00000000000..6bc5e3a7c4b --- /dev/null +++ b/tools/test/sort/regression/ref/test14fu @@ -0,0 +1,3 @@ +alma +Bika +korte diff --git a/tools/test/sort/regression/ref/test14g b/tools/test/sort/regression/ref/test14g new file mode 100644 index 00000000000..017ab018bea --- /dev/null +++ b/tools/test/sort/regression/ref/test14g @@ -0,0 +1,5 @@ +Alma +Bika +alma +bika +korte diff --git a/tools/test/sort/regression/ref/test14gr b/tools/test/sort/regression/ref/test14gr new file mode 100644 index 00000000000..0f0ec451901 --- /dev/null +++ b/tools/test/sort/regression/ref/test14gr @@ -0,0 +1,5 @@ +korte +bika +alma +Bika +Alma diff --git a/tools/test/sort/regression/ref/test14gs b/tools/test/sort/regression/ref/test14gs new file mode 100644 index 00000000000..b051fbfdc44 --- /dev/null +++ b/tools/test/sort/regression/ref/test14gs @@ -0,0 +1,5 @@ +alma +korte +Alma +Bika +bika diff --git a/tools/test/sort/regression/ref/test14gu b/tools/test/sort/regression/ref/test14gu new file mode 100644 index 00000000000..9c9acdc32f5 --- /dev/null +++ b/tools/test/sort/regression/ref/test14gu @@ -0,0 +1 @@ +alma diff --git a/tools/test/sort/regression/ref/test14i b/tools/test/sort/regression/ref/test14i new file mode 100644 index 00000000000..017ab018bea --- /dev/null +++ b/tools/test/sort/regression/ref/test14i @@ -0,0 +1,5 @@ +Alma +Bika +alma +bika +korte diff --git a/tools/test/sort/regression/ref/test14ir b/tools/test/sort/regression/ref/test14ir new file mode 100644 index 00000000000..0f0ec451901 --- /dev/null +++ b/tools/test/sort/regression/ref/test14ir @@ -0,0 +1,5 @@ +korte +bika +alma +Bika +Alma diff --git a/tools/test/sort/regression/ref/test14n b/tools/test/sort/regression/ref/test14n new file mode 100644 index 00000000000..017ab018bea --- /dev/null +++ b/tools/test/sort/regression/ref/test14n @@ -0,0 +1,5 @@ +Alma +Bika +alma +bika +korte diff --git a/tools/test/sort/regression/ref/test14nr b/tools/test/sort/regression/ref/test14nr new file mode 100644 index 00000000000..0f0ec451901 --- /dev/null +++ b/tools/test/sort/regression/ref/test14nr @@ -0,0 +1,5 @@ +korte +bika +alma +Bika +Alma diff --git a/tools/test/sort/regression/ref/test14ns b/tools/test/sort/regression/ref/test14ns new file mode 100644 index 00000000000..b051fbfdc44 --- /dev/null +++ b/tools/test/sort/regression/ref/test14ns @@ -0,0 +1,5 @@ +alma +korte +Alma +Bika +bika diff --git a/tools/test/sort/regression/ref/test14nu b/tools/test/sort/regression/ref/test14nu new file mode 100644 index 00000000000..9c9acdc32f5 --- /dev/null +++ b/tools/test/sort/regression/ref/test14nu @@ -0,0 +1 @@ +alma diff --git a/tools/test/sort/regression/ref/test14r b/tools/test/sort/regression/ref/test14r new file mode 100644 index 00000000000..0f0ec451901 --- /dev/null +++ b/tools/test/sort/regression/ref/test14r @@ -0,0 +1,5 @@ +korte +bika +alma +Bika +Alma diff --git a/tools/test/sort/regression/ref/test14u b/tools/test/sort/regression/ref/test14u new file mode 100644 index 00000000000..017ab018bea --- /dev/null +++ b/tools/test/sort/regression/ref/test14u @@ -0,0 +1,5 @@ +Alma +Bika +alma +bika +korte diff --git a/tools/test/sort/regression/ref/test15 b/tools/test/sort/regression/ref/test15 new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15 @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15M b/tools/test/sort/regression/ref/test15M new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15M @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15Mr b/tools/test/sort/regression/ref/test15Mr new file mode 100644 index 00000000000..bc3e161b10c --- /dev/null +++ b/tools/test/sort/regression/ref/test15Mr @@ -0,0 +1,5 @@ +raketa,,8 +piros,,13 +citromsarga,,0 +barack,,2 +alma,,9 diff --git a/tools/test/sort/regression/ref/test15b b/tools/test/sort/regression/ref/test15b new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15b @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15bd b/tools/test/sort/regression/ref/test15bd new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15bd @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15bs b/tools/test/sort/regression/ref/test15bs new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15bs @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15bu b/tools/test/sort/regression/ref/test15bu new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15bu @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15f b/tools/test/sort/regression/ref/test15f new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15f @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15fr b/tools/test/sort/regression/ref/test15fr new file mode 100644 index 00000000000..bc3e161b10c --- /dev/null +++ b/tools/test/sort/regression/ref/test15fr @@ -0,0 +1,5 @@ +raketa,,8 +piros,,13 +citromsarga,,0 +barack,,2 +alma,,9 diff --git a/tools/test/sort/regression/ref/test15fs b/tools/test/sort/regression/ref/test15fs new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15fs @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15fu b/tools/test/sort/regression/ref/test15fu new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15fu @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15g b/tools/test/sort/regression/ref/test15g new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15g @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15gr b/tools/test/sort/regression/ref/test15gr new file mode 100644 index 00000000000..bc3e161b10c --- /dev/null +++ b/tools/test/sort/regression/ref/test15gr @@ -0,0 +1,5 @@ +raketa,,8 +piros,,13 +citromsarga,,0 +barack,,2 +alma,,9 diff --git a/tools/test/sort/regression/ref/test15gs b/tools/test/sort/regression/ref/test15gs new file mode 100644 index 00000000000..5feb737c7e3 --- /dev/null +++ b/tools/test/sort/regression/ref/test15gs @@ -0,0 +1,5 @@ +raketa,,8 +alma,,9 +barack,,2 +piros,,13 +citromsarga,,0 diff --git a/tools/test/sort/regression/ref/test15gu b/tools/test/sort/regression/ref/test15gu new file mode 100644 index 00000000000..81efdb59031 --- /dev/null +++ b/tools/test/sort/regression/ref/test15gu @@ -0,0 +1 @@ +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15i b/tools/test/sort/regression/ref/test15i new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15i @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15ir b/tools/test/sort/regression/ref/test15ir new file mode 100644 index 00000000000..bc3e161b10c --- /dev/null +++ b/tools/test/sort/regression/ref/test15ir @@ -0,0 +1,5 @@ +raketa,,8 +piros,,13 +citromsarga,,0 +barack,,2 +alma,,9 diff --git a/tools/test/sort/regression/ref/test15n b/tools/test/sort/regression/ref/test15n new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15n @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15nr b/tools/test/sort/regression/ref/test15nr new file mode 100644 index 00000000000..bc3e161b10c --- /dev/null +++ b/tools/test/sort/regression/ref/test15nr @@ -0,0 +1,5 @@ +raketa,,8 +piros,,13 +citromsarga,,0 +barack,,2 +alma,,9 diff --git a/tools/test/sort/regression/ref/test15ns b/tools/test/sort/regression/ref/test15ns new file mode 100644 index 00000000000..5feb737c7e3 --- /dev/null +++ b/tools/test/sort/regression/ref/test15ns @@ -0,0 +1,5 @@ +raketa,,8 +alma,,9 +barack,,2 +piros,,13 +citromsarga,,0 diff --git a/tools/test/sort/regression/ref/test15nu b/tools/test/sort/regression/ref/test15nu new file mode 100644 index 00000000000..81efdb59031 --- /dev/null +++ b/tools/test/sort/regression/ref/test15nu @@ -0,0 +1 @@ +raketa,,8 diff --git a/tools/test/sort/regression/ref/test15r b/tools/test/sort/regression/ref/test15r new file mode 100644 index 00000000000..bc3e161b10c --- /dev/null +++ b/tools/test/sort/regression/ref/test15r @@ -0,0 +1,5 @@ +raketa,,8 +piros,,13 +citromsarga,,0 +barack,,2 +alma,,9 diff --git a/tools/test/sort/regression/ref/test15u b/tools/test/sort/regression/ref/test15u new file mode 100644 index 00000000000..473a53a257e --- /dev/null +++ b/tools/test/sort/regression/ref/test15u @@ -0,0 +1,5 @@ +alma,,9 +barack,,2 +citromsarga,,0 +piros,,13 +raketa,,8 diff --git a/tools/test/sort/regression/ref/test16 b/tools/test/sort/regression/ref/test16 new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16 @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16M b/tools/test/sort/regression/ref/test16M new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16M @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16Mr b/tools/test/sort/regression/ref/test16Mr new file mode 100644 index 00000000000..e0820412589 --- /dev/null +++ b/tools/test/sort/regression/ref/test16Mr @@ -0,0 +1,2 @@ +z123 +a414 diff --git a/tools/test/sort/regression/ref/test16b b/tools/test/sort/regression/ref/test16b new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16b @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16bd b/tools/test/sort/regression/ref/test16bd new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16bd @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16bs b/tools/test/sort/regression/ref/test16bs new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16bs @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16bu b/tools/test/sort/regression/ref/test16bu new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16bu @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16f b/tools/test/sort/regression/ref/test16f new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16f @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16fr b/tools/test/sort/regression/ref/test16fr new file mode 100644 index 00000000000..e0820412589 --- /dev/null +++ b/tools/test/sort/regression/ref/test16fr @@ -0,0 +1,2 @@ +z123 +a414 diff --git a/tools/test/sort/regression/ref/test16fs b/tools/test/sort/regression/ref/test16fs new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16fs @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16fu b/tools/test/sort/regression/ref/test16fu new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16fu @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16g b/tools/test/sort/regression/ref/test16g new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16g @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16gr b/tools/test/sort/regression/ref/test16gr new file mode 100644 index 00000000000..e0820412589 --- /dev/null +++ b/tools/test/sort/regression/ref/test16gr @@ -0,0 +1,2 @@ +z123 +a414 diff --git a/tools/test/sort/regression/ref/test16gs b/tools/test/sort/regression/ref/test16gs new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16gs @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16gu b/tools/test/sort/regression/ref/test16gu new file mode 100644 index 00000000000..78879291a4c --- /dev/null +++ b/tools/test/sort/regression/ref/test16gu @@ -0,0 +1 @@ +a414 diff --git a/tools/test/sort/regression/ref/test16i b/tools/test/sort/regression/ref/test16i new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16i @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16ir b/tools/test/sort/regression/ref/test16ir new file mode 100644 index 00000000000..e0820412589 --- /dev/null +++ b/tools/test/sort/regression/ref/test16ir @@ -0,0 +1,2 @@ +z123 +a414 diff --git a/tools/test/sort/regression/ref/test16n b/tools/test/sort/regression/ref/test16n new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16n @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16nr b/tools/test/sort/regression/ref/test16nr new file mode 100644 index 00000000000..e0820412589 --- /dev/null +++ b/tools/test/sort/regression/ref/test16nr @@ -0,0 +1,2 @@ +z123 +a414 diff --git a/tools/test/sort/regression/ref/test16ns b/tools/test/sort/regression/ref/test16ns new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16ns @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test16nu b/tools/test/sort/regression/ref/test16nu new file mode 100644 index 00000000000..78879291a4c --- /dev/null +++ b/tools/test/sort/regression/ref/test16nu @@ -0,0 +1 @@ +a414 diff --git a/tools/test/sort/regression/ref/test16r b/tools/test/sort/regression/ref/test16r new file mode 100644 index 00000000000..e0820412589 --- /dev/null +++ b/tools/test/sort/regression/ref/test16r @@ -0,0 +1,2 @@ +z123 +a414 diff --git a/tools/test/sort/regression/ref/test16u b/tools/test/sort/regression/ref/test16u new file mode 100644 index 00000000000..3b9b3a64248 --- /dev/null +++ b/tools/test/sort/regression/ref/test16u @@ -0,0 +1,2 @@ +a414 +z123 diff --git a/tools/test/sort/regression/ref/test17 b/tools/test/sort/regression/ref/test17 new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17 @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17M b/tools/test/sort/regression/ref/test17M new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17M @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17Mr b/tools/test/sort/regression/ref/test17Mr new file mode 100644 index 00000000000..b31e5b68b94 --- /dev/null +++ b/tools/test/sort/regression/ref/test17Mr @@ -0,0 +1,4 @@ +korte 4 barack +alma 6 korte +alma 5 bagoly +alma 4 zab diff --git a/tools/test/sort/regression/ref/test17b b/tools/test/sort/regression/ref/test17b new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17b @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17bd b/tools/test/sort/regression/ref/test17bd new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17bd @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17bs b/tools/test/sort/regression/ref/test17bs new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17bs @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17bu b/tools/test/sort/regression/ref/test17bu new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17bu @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17f b/tools/test/sort/regression/ref/test17f new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17f @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17fr b/tools/test/sort/regression/ref/test17fr new file mode 100644 index 00000000000..b31e5b68b94 --- /dev/null +++ b/tools/test/sort/regression/ref/test17fr @@ -0,0 +1,4 @@ +korte 4 barack +alma 6 korte +alma 5 bagoly +alma 4 zab diff --git a/tools/test/sort/regression/ref/test17fs b/tools/test/sort/regression/ref/test17fs new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17fs @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17fu b/tools/test/sort/regression/ref/test17fu new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17fu @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17g b/tools/test/sort/regression/ref/test17g new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17g @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17gr b/tools/test/sort/regression/ref/test17gr new file mode 100644 index 00000000000..b31e5b68b94 --- /dev/null +++ b/tools/test/sort/regression/ref/test17gr @@ -0,0 +1,4 @@ +korte 4 barack +alma 6 korte +alma 5 bagoly +alma 4 zab diff --git a/tools/test/sort/regression/ref/test17gs b/tools/test/sort/regression/ref/test17gs new file mode 100644 index 00000000000..2da5d6580d0 --- /dev/null +++ b/tools/test/sort/regression/ref/test17gs @@ -0,0 +1,4 @@ +alma 5 bagoly +alma 6 korte +alma 4 zab +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17gu b/tools/test/sort/regression/ref/test17gu new file mode 100644 index 00000000000..4d49f4c81a4 --- /dev/null +++ b/tools/test/sort/regression/ref/test17gu @@ -0,0 +1 @@ +alma 5 bagoly diff --git a/tools/test/sort/regression/ref/test17i b/tools/test/sort/regression/ref/test17i new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17i @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17ir b/tools/test/sort/regression/ref/test17ir new file mode 100644 index 00000000000..b31e5b68b94 --- /dev/null +++ b/tools/test/sort/regression/ref/test17ir @@ -0,0 +1,4 @@ +korte 4 barack +alma 6 korte +alma 5 bagoly +alma 4 zab diff --git a/tools/test/sort/regression/ref/test17n b/tools/test/sort/regression/ref/test17n new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17n @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17nr b/tools/test/sort/regression/ref/test17nr new file mode 100644 index 00000000000..b31e5b68b94 --- /dev/null +++ b/tools/test/sort/regression/ref/test17nr @@ -0,0 +1,4 @@ +korte 4 barack +alma 6 korte +alma 5 bagoly +alma 4 zab diff --git a/tools/test/sort/regression/ref/test17ns b/tools/test/sort/regression/ref/test17ns new file mode 100644 index 00000000000..2da5d6580d0 --- /dev/null +++ b/tools/test/sort/regression/ref/test17ns @@ -0,0 +1,4 @@ +alma 5 bagoly +alma 6 korte +alma 4 zab +korte 4 barack diff --git a/tools/test/sort/regression/ref/test17nu b/tools/test/sort/regression/ref/test17nu new file mode 100644 index 00000000000..4d49f4c81a4 --- /dev/null +++ b/tools/test/sort/regression/ref/test17nu @@ -0,0 +1 @@ +alma 5 bagoly diff --git a/tools/test/sort/regression/ref/test17r b/tools/test/sort/regression/ref/test17r new file mode 100644 index 00000000000..b31e5b68b94 --- /dev/null +++ b/tools/test/sort/regression/ref/test17r @@ -0,0 +1,4 @@ +korte 4 barack +alma 6 korte +alma 5 bagoly +alma 4 zab diff --git a/tools/test/sort/regression/ref/test17u b/tools/test/sort/regression/ref/test17u new file mode 100644 index 00000000000..ff2a9ced237 --- /dev/null +++ b/tools/test/sort/regression/ref/test17u @@ -0,0 +1,4 @@ +alma 4 zab +alma 5 bagoly +alma 6 korte +korte 4 barack diff --git a/tools/test/sort/regression/ref/test_nums b/tools/test/sort/regression/ref/test_nums new file mode 100644 index 00000000000..ece33b4c6d0 --- /dev/null +++ b/tools/test/sort/regression/ref/test_nums @@ -0,0 +1,16 @@ + -1234567890 + -987654321 + -987654321.9876 + 123456789 + 123456789.1234 + 987654321 + -123456789 + -987654321.2345 + 123456789 + 123456789.1234 + 987654321.7654 + 987654321.765400 +-1234567890 +-987654321 +123456789 +987654321 diff --git a/tools/test/sort/regression/ref/test_numsM b/tools/test/sort/regression/ref/test_numsM new file mode 100644 index 00000000000..ece33b4c6d0 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsM @@ -0,0 +1,16 @@ + -1234567890 + -987654321 + -987654321.9876 + 123456789 + 123456789.1234 + 987654321 + -123456789 + -987654321.2345 + 123456789 + 123456789.1234 + 987654321.7654 + 987654321.765400 +-1234567890 +-987654321 +123456789 +987654321 diff --git a/tools/test/sort/regression/ref/test_numsMr b/tools/test/sort/regression/ref/test_numsMr new file mode 100644 index 00000000000..79adf8de0aa --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsMr @@ -0,0 +1,16 @@ +987654321 +123456789 +-987654321 +-1234567890 + 987654321.765400 + 987654321.7654 + 123456789.1234 + 123456789 + -987654321.2345 + -123456789 + 987654321 + 123456789.1234 + 123456789 + -987654321.9876 + -987654321 + -1234567890 diff --git a/tools/test/sort/regression/ref/test_numsb b/tools/test/sort/regression/ref/test_numsb new file mode 100644 index 00000000000..287b99a0d5d --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsb @@ -0,0 +1,16 @@ + -123456789 + -1234567890 +-1234567890 + -987654321 +-987654321 + -987654321.2345 + -987654321.9876 + 123456789 + 123456789 +123456789 + 123456789.1234 + 123456789.1234 + 987654321 +987654321 + 987654321.7654 + 987654321.765400 diff --git a/tools/test/sort/regression/ref/test_numsbd b/tools/test/sort/regression/ref/test_numsbd new file mode 100644 index 00000000000..1bf6a39daa5 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsbd @@ -0,0 +1,16 @@ + 123456789 + -123456789 + 123456789 +123456789 + -1234567890 +-1234567890 + 123456789.1234 + 123456789.1234 + -987654321 + 987654321 +-987654321 +987654321 + -987654321.2345 + 987654321.7654 + 987654321.765400 + -987654321.9876 diff --git a/tools/test/sort/regression/ref/test_numsbs b/tools/test/sort/regression/ref/test_numsbs new file mode 100644 index 00000000000..285d7fe5107 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsbs @@ -0,0 +1,16 @@ + -123456789 +-1234567890 + -1234567890 +-987654321 + -987654321 + -987654321.2345 + -987654321.9876 + 123456789 +123456789 + 123456789 + 123456789.1234 + 123456789.1234 +987654321 + 987654321 + 987654321.7654 + 987654321.765400 diff --git a/tools/test/sort/regression/ref/test_numsbu b/tools/test/sort/regression/ref/test_numsbu new file mode 100644 index 00000000000..c3612d25657 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsbu @@ -0,0 +1,10 @@ + -123456789 +-1234567890 +-987654321 + -987654321.2345 + -987654321.9876 + 123456789 + 123456789.1234 +987654321 + 987654321.7654 + 987654321.765400 diff --git a/tools/test/sort/regression/ref/test_numsf b/tools/test/sort/regression/ref/test_numsf new file mode 100644 index 00000000000..ece33b4c6d0 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsf @@ -0,0 +1,16 @@ + -1234567890 + -987654321 + -987654321.9876 + 123456789 + 123456789.1234 + 987654321 + -123456789 + -987654321.2345 + 123456789 + 123456789.1234 + 987654321.7654 + 987654321.765400 +-1234567890 +-987654321 +123456789 +987654321 diff --git a/tools/test/sort/regression/ref/test_numsfr b/tools/test/sort/regression/ref/test_numsfr new file mode 100644 index 00000000000..79adf8de0aa --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsfr @@ -0,0 +1,16 @@ +987654321 +123456789 +-987654321 +-1234567890 + 987654321.765400 + 987654321.7654 + 123456789.1234 + 123456789 + -987654321.2345 + -123456789 + 987654321 + 123456789.1234 + 123456789 + -987654321.9876 + -987654321 + -1234567890 diff --git a/tools/test/sort/regression/ref/test_numsfs b/tools/test/sort/regression/ref/test_numsfs new file mode 100644 index 00000000000..ece33b4c6d0 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsfs @@ -0,0 +1,16 @@ + -1234567890 + -987654321 + -987654321.9876 + 123456789 + 123456789.1234 + 987654321 + -123456789 + -987654321.2345 + 123456789 + 123456789.1234 + 987654321.7654 + 987654321.765400 +-1234567890 +-987654321 +123456789 +987654321 diff --git a/tools/test/sort/regression/ref/test_numsfu b/tools/test/sort/regression/ref/test_numsfu new file mode 100644 index 00000000000..ece33b4c6d0 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsfu @@ -0,0 +1,16 @@ + -1234567890 + -987654321 + -987654321.9876 + 123456789 + 123456789.1234 + 987654321 + -123456789 + -987654321.2345 + 123456789 + 123456789.1234 + 987654321.7654 + 987654321.765400 +-1234567890 +-987654321 +123456789 +987654321 diff --git a/tools/test/sort/regression/ref/test_numsg b/tools/test/sort/regression/ref/test_numsg new file mode 100644 index 00000000000..bee1175782f --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsg @@ -0,0 +1,16 @@ + -1234567890 +-1234567890 + -987654321.9876 + -987654321.2345 + -987654321 +-987654321 + -123456789 + 123456789 + 123456789 +123456789 + 123456789.1234 + 123456789.1234 + 987654321 +987654321 + 987654321.7654 + 987654321.765400 diff --git a/tools/test/sort/regression/ref/test_numsgr b/tools/test/sort/regression/ref/test_numsgr new file mode 100644 index 00000000000..86fca8f8bf5 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsgr @@ -0,0 +1,16 @@ + 987654321.765400 + 987654321.7654 +987654321 + 987654321 + 123456789.1234 + 123456789.1234 +123456789 + 123456789 + 123456789 + -123456789 +-987654321 + -987654321 + -987654321.2345 + -987654321.9876 +-1234567890 + -1234567890 diff --git a/tools/test/sort/regression/ref/test_numsgs b/tools/test/sort/regression/ref/test_numsgs new file mode 100644 index 00000000000..c4a2d618d03 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsgs @@ -0,0 +1,16 @@ +-1234567890 + -1234567890 + -987654321.9876 + -987654321.2345 +-987654321 + -987654321 + -123456789 + 123456789 +123456789 + 123456789 + 123456789.1234 + 123456789.1234 +987654321 + 987654321 + 987654321.7654 + 987654321.765400 diff --git a/tools/test/sort/regression/ref/test_numsgu b/tools/test/sort/regression/ref/test_numsgu new file mode 100644 index 00000000000..5550dbacee6 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsgu @@ -0,0 +1,9 @@ +-1234567890 + -987654321.9876 + -987654321.2345 +-987654321 + -123456789 + 123456789 + 123456789.1234 +987654321 + 987654321.7654 diff --git a/tools/test/sort/regression/ref/test_numsi b/tools/test/sort/regression/ref/test_numsi new file mode 100644 index 00000000000..ece33b4c6d0 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsi @@ -0,0 +1,16 @@ + -1234567890 + -987654321 + -987654321.9876 + 123456789 + 123456789.1234 + 987654321 + -123456789 + -987654321.2345 + 123456789 + 123456789.1234 + 987654321.7654 + 987654321.765400 +-1234567890 +-987654321 +123456789 +987654321 diff --git a/tools/test/sort/regression/ref/test_numsir b/tools/test/sort/regression/ref/test_numsir new file mode 100644 index 00000000000..79adf8de0aa --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsir @@ -0,0 +1,16 @@ +987654321 +123456789 +-987654321 +-1234567890 + 987654321.765400 + 987654321.7654 + 123456789.1234 + 123456789 + -987654321.2345 + -123456789 + 987654321 + 123456789.1234 + 123456789 + -987654321.9876 + -987654321 + -1234567890 diff --git a/tools/test/sort/regression/ref/test_numsn b/tools/test/sort/regression/ref/test_numsn new file mode 100644 index 00000000000..bee1175782f --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsn @@ -0,0 +1,16 @@ + -1234567890 +-1234567890 + -987654321.9876 + -987654321.2345 + -987654321 +-987654321 + -123456789 + 123456789 + 123456789 +123456789 + 123456789.1234 + 123456789.1234 + 987654321 +987654321 + 987654321.7654 + 987654321.765400 diff --git a/tools/test/sort/regression/ref/test_numsnr b/tools/test/sort/regression/ref/test_numsnr new file mode 100644 index 00000000000..86fca8f8bf5 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsnr @@ -0,0 +1,16 @@ + 987654321.765400 + 987654321.7654 +987654321 + 987654321 + 123456789.1234 + 123456789.1234 +123456789 + 123456789 + 123456789 + -123456789 +-987654321 + -987654321 + -987654321.2345 + -987654321.9876 +-1234567890 + -1234567890 diff --git a/tools/test/sort/regression/ref/test_numsns b/tools/test/sort/regression/ref/test_numsns new file mode 100644 index 00000000000..c4a2d618d03 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsns @@ -0,0 +1,16 @@ +-1234567890 + -1234567890 + -987654321.9876 + -987654321.2345 +-987654321 + -987654321 + -123456789 + 123456789 +123456789 + 123456789 + 123456789.1234 + 123456789.1234 +987654321 + 987654321 + 987654321.7654 + 987654321.765400 diff --git a/tools/test/sort/regression/ref/test_numsnu b/tools/test/sort/regression/ref/test_numsnu new file mode 100644 index 00000000000..5550dbacee6 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsnu @@ -0,0 +1,9 @@ +-1234567890 + -987654321.9876 + -987654321.2345 +-987654321 + -123456789 + 123456789 + 123456789.1234 +987654321 + 987654321.7654 diff --git a/tools/test/sort/regression/ref/test_numsr b/tools/test/sort/regression/ref/test_numsr new file mode 100644 index 00000000000..79adf8de0aa --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsr @@ -0,0 +1,16 @@ +987654321 +123456789 +-987654321 +-1234567890 + 987654321.765400 + 987654321.7654 + 123456789.1234 + 123456789 + -987654321.2345 + -123456789 + 987654321 + 123456789.1234 + 123456789 + -987654321.9876 + -987654321 + -1234567890 diff --git a/tools/test/sort/regression/ref/test_numsu b/tools/test/sort/regression/ref/test_numsu new file mode 100644 index 00000000000..ece33b4c6d0 --- /dev/null +++ b/tools/test/sort/regression/ref/test_numsu @@ -0,0 +1,16 @@ + -1234567890 + -987654321 + -987654321.9876 + 123456789 + 123456789.1234 + 987654321 + -123456789 + -987654321.2345 + 123456789 + 123456789.1234 + 987654321.7654 + 987654321.765400 +-1234567890 +-987654321 +123456789 +987654321 diff --git a/tools/tools/ath/Makefile b/tools/tools/ath/Makefile index 3d603e656d8..8f133629e10 100644 --- a/tools/tools/ath/Makefile +++ b/tools/tools/ath/Makefile @@ -1,7 +1,8 @@ # $FreeBSD$ SUBDIR= arcode athdebug athdecode athkey athpoke athprom athrd athregs -SUBDIR+= athstats ath_prom_read athradar +SUBDIR+= athstats ath_prom_read athradar athaggrstats SUBDIR+= ath_ee_v14_print ath_ee_v4k_print ath_ee_9287_print +SUBDIR+= athsurvey .include diff --git a/tools/tools/ath/athaggrstats/Makefile b/tools/tools/ath/athaggrstats/Makefile new file mode 100644 index 00000000000..91d44f78cfc --- /dev/null +++ b/tools/tools/ath/athaggrstats/Makefile @@ -0,0 +1,26 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../../../sys/dev/ath/ath_hal + +PROG= athaggrstats + +SRCS= main.c statfoo.c athaggrstats.c opt_ah.h ah_osdep.h + +CLEANFILES+= opt_ah.h + +.include <../Makefile.inc> + +CFLAGS+=-DATH_SUPPORT_ANI +CFLAGS+=-DATH_SUPPORT_TDMA + +opt_ah.h: + echo "#define AH_DEBUG 1" > opt_ah.h + echo "#define AH_DEBUG_COUNTRY 1" >> opt_ah.h + echo "#define AH_SUPPORT_AR5416 1" >> opt_ah.h + +ah_osdep.h: + echo 'typedef void *HAL_SOFTC;' >ah_osdep.h + echo 'typedef int HAL_BUS_TAG;' >>ah_osdep.h + echo 'typedef void *HAL_BUS_HANDLE;' >>ah_osdep.h + +.include diff --git a/tools/tools/ath/athaggrstats/athaggrstats.c b/tools/tools/ath/athaggrstats/athaggrstats.c new file mode 100644 index 00000000000..c42d180f41a --- /dev/null +++ b/tools/tools/ath/athaggrstats/athaggrstats.c @@ -0,0 +1,404 @@ +/*- + * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ + +#include "opt_ah.h" + +/* + * ath statistics class. + */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "ah.h" +#include "ah_desc.h" +#include "net80211/ieee80211_ioctl.h" +#include "net80211/ieee80211_radiotap.h" +#include "if_athioctl.h" + +#include "athaggrstats.h" + +#define NOTPRESENT { 0, "", "" } + +#define AFTER(prev) ((prev)+1) + +static const struct fmt athaggrstats[] = { + +#define S_SINGLE_PKT 0 + { 4, "singlepkt", "spkt", "single frames scheduled" }, +#define S_NONBAW_PKT AFTER(S_SINGLE_PKT) + { 5, "nonbawpkt", "nbpkt", "frames outside of the BAW" }, +#define S_AGGR_PKT AFTER(S_NONBAW_PKT) + { 6, "aggrpkt", "aggpkt", "aggregate frames scheduled" }, +#define S_BAW_CLOSED_SINGLE_PKT AFTER(S_AGGR_PKT) + { 8, "bawclosedpkt", "bawclpkt", "single frames due to closed BAW" }, +#define S_LOW_HWQ_SINGLE_PKT AFTER(S_BAW_CLOSED_SINGLE_PKT) + { 6, "lhsinglepkt", "lhspkt", "single frames scheduled due to low HWQ depth" }, +#define S_SCHED_NOPKT AFTER(S_LOW_HWQ_SINGLE_PKT) + { 6, "schednopkt", "snopkt", "sched called with no frames" }, +#define S_RTS_AGGR_LIMITED AFTER(S_SCHED_NOPKT) + { 8, "rtsaggrlimit", "rtslimit", "RTS limited aggregates" }, +#define S_PKT0 AFTER(S_RTS_AGGR_LIMITED) + { 2, "p0", "p0", "" }, +#define S_PKT1 AFTER(S_PKT0) + { 2, "p1", "p1", "" }, +#define S_PKT2 AFTER(S_PKT1) + { 2, "p2", "p2", "" }, +#define S_PKT3 AFTER(S_PKT2) + { 2, "p3", "p3", "" }, +#define S_PKT4 AFTER(S_PKT3) + { 2, "p4", "p4", "" }, +#define S_PKT5 AFTER(S_PKT4) + { 2, "p5", "p5", "" }, +#define S_PKT6 AFTER(S_PKT5) + { 2, "p6", "p6", "" }, +#define S_PKT7 AFTER(S_PKT6) + { 2, "p7", "p7", "" }, +#define S_PKT8 AFTER(S_PKT7) + { 2, "p8", "p8", "" }, +#define S_PKT9 AFTER(S_PKT8) + { 2, "p9", "p9", "" }, +#define S_PKT10 AFTER(S_PKT9) + { 3, "p10", "p10", "" }, +#define S_PKT11 AFTER(S_PKT10) + { 3, "p11", "p11", "" }, +#define S_PKT12 AFTER(S_PKT11) + { 3, "p12", "p12", "" }, +#define S_PKT13 AFTER(S_PKT12) + { 3, "p13", "p13", "" }, +#define S_PKT14 AFTER(S_PKT13) + { 3, "p14", "p14", "" }, +#define S_PKT15 AFTER(S_PKT14) + { 3, "p15", "p15", "" }, +#define S_PKT16 AFTER(S_PKT15) + { 3, "p16", "p16", "" }, +#define S_PKT17 AFTER(S_PKT16) + { 3, "p17", "p17", "" }, +#define S_PKT18 AFTER(S_PKT17) + { 3, "p18", "p18", "" }, +#define S_PKT19 AFTER(S_PKT18) + { 3, "p19", "p19", "" }, +#define S_PKT20 AFTER(S_PKT19) + { 3, "p20", "p20", "" }, +#define S_PKT21 AFTER(S_PKT20) + { 3, "p21", "p21", "" }, +#define S_PKT22 AFTER(S_PKT21) + { 3, "p22", "p22", "" }, +#define S_PKT23 AFTER(S_PKT22) + { 3, "p23", "p23", "" }, +#define S_PKT24 AFTER(S_PKT23) + { 3, "p24", "p24", "" }, +#define S_PKT25 AFTER(S_PKT24) + { 3, "p25", "p25", "" }, +#define S_PKT26 AFTER(S_PKT25) + { 3, "p26", "p26", "" }, +#define S_PKT27 AFTER(S_PKT26) + { 3, "p27", "p27", "" }, +#define S_PKT28 AFTER(S_PKT27) + { 3, "p28", "p28", "" }, +#define S_PKT29 AFTER(S_PKT28) + { 3, "p29", "p29", "" }, +#define S_PKT30 AFTER(S_PKT29) + { 3, "p30", "p30", "" }, +#define S_PKT31 AFTER(S_PKT30) + { 3, "p31", "p31", "" }, +}; + +#define S_LAST S_RTS_AGGR_LIMITED +#define S_MAX (S_PKT31 + 1) + +struct athaggrstatfoo_p { + struct athaggrstatfoo base; + int s; + int optstats; + struct ifreq ifr; + struct ath_diag atd; + struct ath_tx_aggr_stats cur; + struct ath_tx_aggr_stats total; +}; + +static void +ath_setifname(struct athaggrstatfoo *wf0, const char *ifname) +{ + struct athaggrstatfoo_p *wf = (struct athaggrstatfoo_p *) wf0; + + strncpy(wf->ifr.ifr_name, ifname, sizeof (wf->ifr.ifr_name)); +} + +static void +ath_zerostats(struct athaggrstatfoo *wf0) +{ +#if 0 + struct athaggrstatfoo_p *wf = (struct athaggrstatfoo_p *) wf0; + + if (ioctl(wf->s, SIOCZATHSTATS, &wf->ifr) < 0) + err(-1, wf->ifr.ifr_name); +#endif +} + +static void +ath_collect(struct athaggrstatfoo_p *wf, struct ath_tx_aggr_stats *stats) +{ + wf->ifr.ifr_data = (caddr_t) stats; + if (ioctl(wf->s, SIOCGATHAGSTATS, &wf->ifr) < 0) + err(1, wf->ifr.ifr_name); +} + +static void +ath_collect_cur(struct statfoo *sf) +{ + struct athaggrstatfoo_p *wf = (struct athaggrstatfoo_p *) sf; + + ath_collect(wf, &wf->cur); +} + +static void +ath_collect_tot(struct statfoo *sf) +{ + struct athaggrstatfoo_p *wf = (struct athaggrstatfoo_p *) sf; + + ath_collect(wf, &wf->total); +} + +static void +ath_update_tot(struct statfoo *sf) +{ + struct athaggrstatfoo_p *wf = (struct athaggrstatfoo_p *) sf; + + wf->total = wf->cur; +} + +static void +snprintrate(char b[], size_t bs, int rate) +{ + if (rate & IEEE80211_RATE_MCS) + snprintf(b, bs, "MCS%u", rate &~ IEEE80211_RATE_MCS); + else if (rate & 1) + snprintf(b, bs, "%u.5M", rate / 2); + else + snprintf(b, bs, "%uM", rate / 2); +} + +static int +ath_get_curstat(struct statfoo *sf, int s, char b[], size_t bs) +{ + struct athaggrstatfoo_p *wf = (struct athaggrstatfoo_p *) sf; +#define STAT(x) \ + snprintf(b, bs, "%u", wf->cur.aggr_##x - wf->total.aggr_##x); return 1 +#define PKT(x) \ + snprintf(b, bs, "%u", wf->cur.aggr_pkts[x] - wf->total.aggr_pkts[x]); return 1 + + switch (s) { + case S_SINGLE_PKT: STAT(single_pkt); + case S_NONBAW_PKT: STAT(nonbaw_pkt); + case S_AGGR_PKT: STAT(aggr_pkt); + case S_BAW_CLOSED_SINGLE_PKT: STAT(baw_closed_single_pkt); + case S_LOW_HWQ_SINGLE_PKT: STAT(low_hwq_single_pkt); + case S_SCHED_NOPKT: STAT(sched_nopkt); + case S_RTS_AGGR_LIMITED: STAT(rts_aggr_limited); + case S_PKT0: PKT(0); + case S_PKT1: PKT(1); + case S_PKT2: PKT(2); + case S_PKT3: PKT(3); + case S_PKT4: PKT(4); + case S_PKT5: PKT(5); + case S_PKT6: PKT(6); + case S_PKT7: PKT(7); + case S_PKT8: PKT(8); + case S_PKT9: PKT(9); + case S_PKT10: PKT(10); + case S_PKT11: PKT(11); + case S_PKT12: PKT(12); + case S_PKT13: PKT(13); + case S_PKT14: PKT(14); + case S_PKT15: PKT(15); + case S_PKT16: PKT(16); + case S_PKT17: PKT(17); + case S_PKT18: PKT(18); + case S_PKT19: PKT(19); + case S_PKT20: PKT(20); + case S_PKT21: PKT(21); + case S_PKT22: PKT(22); + case S_PKT23: PKT(23); + case S_PKT24: PKT(24); + case S_PKT25: PKT(25); + case S_PKT26: PKT(26); + case S_PKT27: PKT(27); + case S_PKT28: PKT(28); + case S_PKT29: PKT(29); + case S_PKT30: PKT(30); + case S_PKT31: PKT(31); + } + b[0] = '\0'; + return 0; +#undef PKT +#undef STAT +} + +static int +ath_get_totstat(struct statfoo *sf, int s, char b[], size_t bs) +{ + struct athaggrstatfoo_p *wf = (struct athaggrstatfoo_p *) sf; +#define STAT(x) \ + snprintf(b, bs, "%u", wf->total.aggr_##x); return 1 +#define PKT(x) \ + snprintf(b, bs, "%u", wf->total.aggr_pkts[x]); return 1 + + switch (s) { + case S_SINGLE_PKT: STAT(single_pkt); + case S_NONBAW_PKT: STAT(nonbaw_pkt); + case S_AGGR_PKT: STAT(aggr_pkt); + case S_BAW_CLOSED_SINGLE_PKT: STAT(baw_closed_single_pkt); + case S_LOW_HWQ_SINGLE_PKT: STAT(low_hwq_single_pkt); + case S_SCHED_NOPKT: STAT(sched_nopkt); + case S_RTS_AGGR_LIMITED: STAT(rts_aggr_limited); + case S_PKT0: PKT(0); + case S_PKT1: PKT(1); + case S_PKT2: PKT(2); + case S_PKT3: PKT(3); + case S_PKT4: PKT(4); + case S_PKT5: PKT(5); + case S_PKT6: PKT(6); + case S_PKT7: PKT(7); + case S_PKT8: PKT(8); + case S_PKT9: PKT(9); + case S_PKT10: PKT(10); + case S_PKT11: PKT(11); + case S_PKT12: PKT(12); + case S_PKT13: PKT(13); + case S_PKT14: PKT(14); + case S_PKT15: PKT(15); + case S_PKT16: PKT(16); + case S_PKT17: PKT(17); + case S_PKT18: PKT(18); + case S_PKT19: PKT(19); + case S_PKT20: PKT(20); + case S_PKT21: PKT(21); + case S_PKT22: PKT(22); + case S_PKT23: PKT(23); + case S_PKT24: PKT(24); + case S_PKT25: PKT(25); + case S_PKT26: PKT(26); + case S_PKT27: PKT(27); + case S_PKT28: PKT(28); + case S_PKT29: PKT(29); + case S_PKT30: PKT(30); + case S_PKT31: PKT(31); + } + b[0] = '\0'; + return 0; +#undef PKT +#undef STAT +} + +static void +ath_print_verbose(struct statfoo *sf, FILE *fd) +{ + struct athaggrstatfoo_p *wf = (struct athaggrstatfoo_p *) sf; + const struct fmt *f; + char s[32]; + const char *indent; + int i, width; + + width = 0; + for (i = 0; i < S_LAST; i++) { + f = &sf->stats[i]; + if (f->width > width) + width = f->width; + } + for (i = 0; i < S_LAST; i++) { + if (ath_get_totstat(sf, i, s, sizeof(s)) && strcmp(s, "0")) { + indent = ""; + fprintf(fd, "%s%-*s %s\n", indent, width, s, + athaggrstats[i].desc); + } + } + + fprintf(fd, "\nAggregate size profile:\n\n"); + for (i = 0; i < 64; i++) { + fprintf(fd, "%2d: %12u%s", + i, + wf->total.aggr_pkts[i], + (i % 4 == 3) ? "\n" : " "); + } + fprintf(fd, "\n"); +} + +STATFOO_DEFINE_BOUNCE(athaggrstatfoo) + +struct athaggrstatfoo * +athaggrstats_new(const char *ifname, const char *fmtstring) +{ +#define N(a) (sizeof(a) / sizeof(a[0])) + struct athaggrstatfoo_p *wf; + + wf = calloc(1, sizeof(struct athaggrstatfoo_p)); + if (wf != NULL) { + statfoo_init(&wf->base.base, "athaggrstats", + athaggrstats, N(athaggrstats)); + /* override base methods */ + wf->base.base.collect_cur = ath_collect_cur; + wf->base.base.collect_tot = ath_collect_tot; + wf->base.base.get_curstat = ath_get_curstat; + wf->base.base.get_totstat = ath_get_totstat; + wf->base.base.update_tot = ath_update_tot; + wf->base.base.print_verbose = ath_print_verbose; + + /* setup bounce functions for public methods */ + STATFOO_BOUNCE(wf, athaggrstatfoo); + + /* setup our public methods */ + wf->base.setifname = ath_setifname; +#if 0 + wf->base.setstamac = wlan_setstamac; +#endif + wf->base.zerostats = ath_zerostats; + wf->s = socket(AF_INET, SOCK_DGRAM, 0); + if (wf->s < 0) + err(1, "socket"); + + ath_setifname(&wf->base, ifname); + wf->base.setfmt(&wf->base, fmtstring); + } + return &wf->base; +#undef N +} diff --git a/tools/tools/ath/athaggrstats/athaggrstats.h b/tools/tools/ath/athaggrstats/athaggrstats.h new file mode 100644 index 00000000000..8654a6a1f03 --- /dev/null +++ b/tools/tools/ath/athaggrstats/athaggrstats.h @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 2002-2007 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ + +#ifndef _ATHAGGRSTATS_H_ +#define _ATHAGGRSTATS_H_ + +#include "statfoo.h" + +/* + * ath statistics class. + */ +struct athaggrstatfoo { + struct statfoo base; + + STATFOO_DECL_METHODS(struct athaggrstatfoo *); + + /* set the network interface name for collection */ + void (*setifname)(struct athaggrstatfoo *, const char *ifname); + /* set the mac address of the associated station/ap */ + void (*setstamac)(struct athaggrstatfoo *, const uint8_t mac[]); + /* zero in-kernel statistics */ + void (*zerostats)(struct athaggrstatfoo *); +}; + +struct athaggrstatfoo *athaggrstats_new(const char *ifname, + const char *fmtstring); + +#endif /* _ATHAGGRSTATS_H_ */ diff --git a/tools/tools/ath/athaggrstats/main.c b/tools/tools/ath/athaggrstats/main.c new file mode 100644 index 00000000000..75e5dbdbb00 --- /dev/null +++ b/tools/tools/ath/athaggrstats/main.c @@ -0,0 +1,159 @@ +/*- + * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting + * 2012, Adrian Chadd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ + +/* + * Simple Atheros-specific tool to inspect and monitor software queue + * and aggregate statistics. + * + * athaggrstats [-i interface] [-bz] [-l] [-o fmtstring] [interval] + * + * (default interface is ath0). If interval is specified a rolling output + * a la netstat -i is displayed every interval seconds. The format of + * the rolling display can be controlled a la ps. The -l option will + * print a list of all possible statistics for use with the -o option. + */ + +#include +#include +#include +#include +#include +#include + +#include "athaggrstats.h" + +static struct { + const char *tag; + const char *fmt; +} tags[] = { + { "default", + "singlepkt,nonbawpkt,aggrpkt,bawclosedpkt,lhsinglepkt,schednopkt,rtsaggrlimit" + }, +}; + +static const char * +getfmt(const char *tag) +{ +#define N(a) (sizeof(a)/sizeof(a[0])) + int i; + for (i = 0; i < N(tags); i++) + if (strcasecmp(tags[i].tag, tag) == 0) + return tags[i].fmt; + return tag; +#undef N +} + +static int signalled; + +static void +catchalarm(int signo __unused) +{ + signalled = 1; +} + +int +main(int argc, char *argv[]) +{ + struct athaggrstatfoo *wf; + const char *ifname; + int c, banner = 1; + + ifname = getenv("ATH"); + if (ifname == NULL) + ifname = "ath0"; + wf = athaggrstats_new(ifname, getfmt("default")); + while ((c = getopt(argc, argv, "bi:lo:z")) != -1) { + switch (c) { + case 'b': + banner = 0; + break; + case 'i': + wf->setifname(wf, optarg); + break; + case 'l': + wf->print_fields(wf, stdout); + return 0; + case 'o': + wf->setfmt(wf, getfmt(optarg)); + break; + case 'z': + wf->zerostats(wf); + break; + default: + errx(-1, "usage: %s [-a] [-i ifname] [-l] [-o fmt] [-z] [interval]\n", argv[0]); + /*NOTREACHED*/ + } + } + argc -= optind; + argv += optind; + + if (argc > 0) { + u_long interval = strtoul(argv[0], NULL, 0); + int line, omask; + + if (interval < 1) + interval = 1; + signal(SIGALRM, catchalarm); + signalled = 0; + alarm(interval); + banner: + if (banner) + wf->print_header(wf, stdout); + line = 0; + loop: + if (line != 0) { + wf->collect_cur(wf); + wf->print_current(wf, stdout); + wf->update_tot(wf); + } else { + wf->collect_tot(wf); + wf->print_total(wf, stdout); + } + fflush(stdout); + omask = sigblock(sigmask(SIGALRM)); + if (!signalled) + sigpause(0); + sigsetmask(omask); + signalled = 0; + alarm(interval); + line++; + if (line == 21) /* XXX tty line count */ + goto banner; + else + goto loop; + /*NOTREACHED*/ + } else { + wf->collect_tot(wf); + wf->print_verbose(wf, stdout); + } + return 0; +} diff --git a/tools/tools/ath/athaggrstats/statfoo.c b/tools/tools/ath/athaggrstats/statfoo.c new file mode 100644 index 00000000000..eb39e25bbab --- /dev/null +++ b/tools/tools/ath/athaggrstats/statfoo.c @@ -0,0 +1,206 @@ +/*- + * Copyright (c) 2002-2007 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ + +#include +#include + +#include "statfoo.h" + +static void +statfoo_setfmt(struct statfoo *sf, const char *fmt0) +{ +#define N(a) (sizeof(a)/sizeof(a[0])) + char fmt[4096]; + char *fp, *tok; + int i, j; + + j = 0; + strlcpy(fmt, fmt0, sizeof(fmt)); + for (fp = fmt; (tok = strsep(&fp, ", ")) != NULL;) { + for (i = 0; i < sf->nstats; i++) + if (strcasecmp(tok, sf->stats[i].name) == 0) + break; + if (i >= sf->nstats) { + fprintf(stderr, "%s: unknown statistic name \"%s\" " + "skipped\n", sf->name, tok); + continue; + } + if (j+3 > sizeof(sf->fmts)) { + fprintf(stderr, "%s: not enough room for all stats; " + "stopped at %s\n", sf->name, tok); + break; + } + if (j != 0) + sf->fmts[j++] = ' '; + sf->fmts[j++] = FMTS_IS_STAT; + sf->fmts[j++] = i & 0xff; + sf->fmts[j++] = (i >> 8) & 0xff; + } + sf->fmts[j] = '\0'; +#undef N +} + +static void +statfoo_collect(struct statfoo *sf) +{ + fprintf(stderr, "%s: don't know how to collect data\n", sf->name); +} + +static void +statfoo_update_tot(struct statfoo *sf) +{ + fprintf(stderr, "%s: don't know how to update total data\n", sf->name); +} + +static int +statfoo_get(struct statfoo *sf, int s, char b[], size_t bs) +{ + fprintf(stderr, "%s: don't know how to get stat #%u\n", sf->name, s); + return 0; +} + +static void +statfoo_print_header(struct statfoo *sf, FILE *fd) +{ + const unsigned char *cp; + int i; + const struct fmt *f; + + for (cp = sf->fmts; *cp != '\0'; cp++) { + if (*cp == FMTS_IS_STAT) { + i = *(++cp); + i |= ((int) *(++cp)) << 8; + f = &sf->stats[i]; + fprintf(fd, "%*s", f->width, f->label); + } else + putc(*cp, fd); + } + putc('\n', fd); +} + +static void +statfoo_print_current(struct statfoo *sf, FILE *fd) +{ + char buf[32]; + const unsigned char *cp; + int i; + const struct fmt *f; + + for (cp = sf->fmts; *cp != '\0'; cp++) { + if (*cp == FMTS_IS_STAT) { + i = *(++cp); + i |= ((int) *(++cp)) << 8; + f = &sf->stats[i]; + if (sf->get_curstat(sf, i, buf, sizeof(buf))) + fprintf(fd, "%*s", f->width, buf); + } else + putc(*cp, fd); + } + putc('\n', fd); +} + +static void +statfoo_print_total(struct statfoo *sf, FILE *fd) +{ + char buf[32]; + const unsigned char *cp; + const struct fmt *f; + int i; + + for (cp = sf->fmts; *cp != '\0'; cp++) { + if (*cp == FMTS_IS_STAT) { + i = *(++cp); + i |= ((int) *(++cp)) << 8; + f = &sf->stats[i]; + if (sf->get_totstat(sf, i, buf, sizeof(buf))) + fprintf(fd, "%*s", f->width, buf); + } else + putc(*cp, fd); + } + putc('\n', fd); +} + +static void +statfoo_print_verbose(struct statfoo *sf, FILE *fd) +{ + const struct fmt *f; + char s[32]; + int i, width; + + width = 0; + for (i = 0; i < sf->nstats; i++) { + f = &sf->stats[i]; + if (f->width > width) + width = f->width; + } + for (i = 0; i < sf->nstats; i++) { + f = &sf->stats[i]; + if (sf->get_totstat(sf, i, s, sizeof(s)) && strcmp(s, "0")) + fprintf(fd, "%-*s %s\n", width, s, f->desc); + } +} + +static void +statfoo_print_fields(struct statfoo *sf, FILE *fd) +{ + int i, w, width; + + width = 0; + for (i = 0; i < sf->nstats; i++) { + w = strlen(sf->stats[i].name); + if (w > width) + width = w; + } + for (i = 0; i < sf->nstats; i++) { + const struct fmt *f = &sf->stats[i]; + if (f->width != 0) + fprintf(fd, "%-*s %s\n", width, f->name, f->desc); + } +} + +void +statfoo_init(struct statfoo *sf, const char *name, const struct fmt *stats, int nstats) +{ + sf->name = name; + sf->stats = stats; + sf->nstats = nstats; + sf->setfmt = statfoo_setfmt; + sf->collect_cur = statfoo_collect; + sf->collect_tot = statfoo_collect; + sf->update_tot = statfoo_update_tot; + sf->get_curstat = statfoo_get; + sf->get_totstat = statfoo_get; + sf->print_header = statfoo_print_header; + sf->print_current = statfoo_print_current; + sf->print_total = statfoo_print_total; + sf->print_verbose = statfoo_print_verbose; + sf->print_fields = statfoo_print_fields; +} diff --git a/tools/tools/ath/athaggrstats/statfoo.h b/tools/tools/ath/athaggrstats/statfoo.h new file mode 100644 index 00000000000..849a271913c --- /dev/null +++ b/tools/tools/ath/athaggrstats/statfoo.h @@ -0,0 +1,128 @@ +/*- + * Copyright (c) 2002-2007 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ + +#ifndef _STATFOO_H_ +#define _STATFOO_H_ +/* + * Base class for managing+displaying periodically collected statistics. + */ + +/* + * Statistic definition/description. The are defined + * for stats that correspond 1-1 w/ a collected stat + * and for stats that are calculated indirectly. + */ +struct fmt { + int width; /* printed field width */ + const char* name; /* stat field name referenced by user */ + const char* label; /* printed header label */ + const char* desc; /* verbose description */ +}; + +#define STATFOO_DECL_METHODS(_p) \ + /* set the format of the statistics to display */ \ + void (*setfmt)(_p, const char *); \ + /* collect+store ``current statistics'' */ \ + void (*collect_cur)(_p); \ + /* collect+store ``total statistics'' */ \ + void (*collect_tot)(_p); \ + /* update ``total statistics'' if necessary from current */ \ + void (*update_tot)(_p); \ + /* format a statistic from the current stats */ \ + int (*get_curstat)(_p, int, char [], size_t); \ + /* format a statistic from the total stats */ \ + int (*get_totstat)(_p, int, char [], size_t); \ + /* print field headers terminated by a \n */ \ + void (*print_header)(_p, FILE *); \ + /* print current statistics terminated by a \n */ \ + void (*print_current)(_p, FILE *); \ + /* print total statistics terminated by a \n */ \ + void (*print_total)(_p, FILE *); \ + /* print total statistics in a verbose (1 stat/line) format */ \ + void (*print_verbose)(_p, FILE *); \ + /* print available statistics */ \ + void (*print_fields)(_p, FILE *) + +/* + * Statistics base class. This class is not usable; only + * classes derived from it are useful. + */ +struct statfoo { + const char *name; /* statistics name, e.g. wlanstats */ + const struct fmt *stats; /* statistics in class */ + int nstats; /* number of stats */ +#define FMTS_IS_STAT 0x80 /* the following two bytes are the stat id */ + unsigned char fmts[4096]; /* private: compiled stats to display */ + + STATFOO_DECL_METHODS(struct statfoo *); +}; + +void statfoo_init(struct statfoo *, const char *name, + const struct fmt *stats, int nstats); + +#define STATFOO_DEFINE_BOUNCE(_t) \ +static void _t##_setfmt(struct _t *wf, const char *fmt0) \ + { wf->base.setfmt(&wf->base, fmt0); } \ +static void _t##_collect_cur(struct _t *wf) \ + { wf->base.collect_cur(&wf->base); } \ +static void _t##_collect_tot(struct _t *wf) \ + { wf->base.collect_tot(&wf->base); } \ +static void _t##_update_tot(struct _t *wf) \ + { wf->base.update_tot(&wf->base); } \ +static int _t##_get_curstat(struct _t *wf, int s, char b[], size_t bs) \ + { return wf->base.get_curstat(&wf->base, s, b, bs); } \ +static int _t##_get_totstat(struct _t *wf, int s, char b[], size_t bs) \ + { return wf->base.get_totstat(&wf->base, s, b, bs); } \ +static void _t##_print_header(struct _t *wf, FILE *fd) \ + { wf->base.print_header(&wf->base, fd); } \ +static void _t##_print_current(struct _t *wf, FILE *fd) \ + { wf->base.print_current(&wf->base, fd); } \ +static void _t##_print_total(struct _t *wf, FILE *fd) \ + { wf->base.print_total(&wf->base, fd); } \ +static void _t##_print_verbose(struct _t *wf, FILE *fd) \ + { wf->base.print_verbose(&wf->base, fd); } \ +static void _t##_print_fields(struct _t *wf, FILE *fd) \ + { wf->base.print_fields(&wf->base, fd); } + +#define STATFOO_BOUNCE(_p, _t) do { \ + _p->base.setfmt = _t##_setfmt; \ + _p->base.collect_cur = _t##_collect_cur; \ + _p->base.collect_tot = _t##_collect_tot; \ + _p->base.update_tot = _t##_update_tot; \ + _p->base.get_curstat = _t##_get_curstat; \ + _p->base.get_totstat = _t##_get_totstat; \ + _p->base.print_header = _t##_print_header; \ + _p->base.print_current = _t##_print_current; \ + _p->base.print_total = _t##_print_total; \ + _p->base.print_verbose = _t##_print_verbose; \ + _p->base.print_fields = _t##_print_fields; \ +} while (0) +#endif /* _STATFOO_H_ */ diff --git a/tools/tools/ath/athdebug/athdebug.c b/tools/tools/ath/athdebug/athdebug.c index d1c2c148261..4f8f7c8a5c4 100644 --- a/tools/tools/ath/athdebug/athdebug.c +++ b/tools/tools/ath/athdebug/athdebug.c @@ -51,6 +51,7 @@ const char *progname; +/* XXX TODO: include if_ath_debug.h */ enum { ATH_DEBUG_XMIT = 0x00000001, /* basic xmit operation */ ATH_DEBUG_XMIT_DESC = 0x00000002, /* xmit descriptors */ @@ -81,7 +82,7 @@ enum { static struct { const char *name; - u_int bit; + uint64_t bit; } flags[] = { { "xmit", ATH_DEBUG_XMIT }, { "xmit_desc", ATH_DEBUG_XMIT_DESC }, @@ -109,7 +110,7 @@ static struct { { "fatal", ATH_DEBUG_FATAL }, }; -static u_int +static uint64_t getflag(const char *name, int len) { int i; @@ -150,7 +151,7 @@ main(int argc, char *argv[]) const char *cp, *tp; const char *sep; int c, op, i; - u_int32_t debug, ndebug; + uint64_t debug, ndebug; size_t debuglen; char oid[256]; diff --git a/tools/tools/ath/athsurvey/Makefile b/tools/tools/ath/athsurvey/Makefile new file mode 100644 index 00000000000..0b023eebc01 --- /dev/null +++ b/tools/tools/ath/athsurvey/Makefile @@ -0,0 +1,16 @@ +# $FreeBSD$ + +PROG= athsurvey + +.include <../Makefile.inc> + +SRCS= athsurvey.c +SRCS+= opt_ah.h +CLEANFILES+= opt_ah.h + +opt_ah.h: + echo "#define AH_DEBUG 1" > opt_ah.h + echo "#define AH_DEBUG_COUNTRY 1" >> opt_ah.h + echo "#define AH_SUPPORT_AR5416 1" >> opt_ah.h + +.include diff --git a/tools/tools/ath/athsurvey/athsurvey.c b/tools/tools/ath/athsurvey/athsurvey.c new file mode 100644 index 00000000000..e0a4cf30e46 --- /dev/null +++ b/tools/tools/ath/athsurvey/athsurvey.c @@ -0,0 +1,216 @@ +/*- + * Copyright (c) 2012 Adrian Chadd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ +#include "diag.h" + +#include "ah.h" +#include "ah_internal.h" + +#include +#include +#include +#include +#include +#include +#include + +const char *progname; + +static void +usage() +{ + fprintf(stderr, "usage: %s [-i ifname]\n", progname); + exit(-1); +} + +static int +get_survey_stats(int s, const char *ifname, HAL_CHANNEL_SURVEY *hs) +{ + uint16_t eedata; + struct ath_diag atd; + + memset(&atd, '\0', sizeof(atd)); + + atd.ad_id = HAL_DIAG_CHANSURVEY | ATH_DIAG_OUT; + atd.ad_in_size = 0; + atd.ad_in_data = NULL; + atd.ad_out_size = sizeof(HAL_CHANNEL_SURVEY); + atd.ad_out_data = (caddr_t) hs; + strncpy(atd.ad_name, ifname, sizeof(atd.ad_name)); + + if (ioctl(s, SIOCGATHDIAG, &atd) < 0) { + err(1, atd.ad_name); + return (0); + } + return (1); +} + +static void +process_survey_stats(HAL_CHANNEL_SURVEY *hs) +{ + int i; + float tx = 0.0, rx = 0.0, cc = 0.0, cext = 0.0; + float max_tx = 0.0, max_rx = 0.0, max_cc = 0.0, max_cext = 0.0; + uint64_t avg_tx = 0, avg_rx = 0, avg_cc = 0, avg_cext = 0; + float min_tx = 100.0, min_rx = 100.0, min_cc = 100.0, min_cext = 100.0; + int n = 0; + int cycle_count = 0, max_cycle_count = 0; + + /* Calculate a percentage channel busy */ + for (i = 0; i < CHANNEL_SURVEY_SAMPLE_COUNT; i++) { + /* + * Skip samples with no cycle count + */ + if (hs->samples[i].cycle_count == 0) + continue; + n++; + + /* + * Grab cycle count, calculate maximum just for curiousity + */ + cycle_count = hs->samples[i].cycle_count; + if (cycle_count > max_cycle_count) + max_cycle_count = cycle_count; + + /* + * Calculate percentage + */ + tx = (float) hs->samples[i].tx_busy * 100.0 / + hs->samples[i].cycle_count; + rx = (float) hs->samples[i].rx_busy * 100.0 / + hs->samples[i].cycle_count; + cc = (float) hs->samples[i].chan_busy * 100.0 / + hs->samples[i].cycle_count; + cext = (float) hs->samples[i].ext_chan_busy * 100.0 / + hs->samples[i].cycle_count; + + /* + * Update rolling average + * XXX to preserve some accuracy, keep two decimal points + * using "fixed" point math. + */ + avg_tx += (uint64_t) hs->samples[i].tx_busy * 10000 / + hs->samples[i].cycle_count; + avg_rx += (uint64_t) hs->samples[i].rx_busy * 10000 / + hs->samples[i].cycle_count; + avg_cc += (uint64_t) hs->samples[i].chan_busy * 10000 / + hs->samples[i].cycle_count; + avg_cext += (uint64_t) hs->samples[i].ext_chan_busy * 10000 / + hs->samples[i].cycle_count; + + /* + * Update maximum values + */ + if (tx > max_tx) + max_tx = tx; + if (rx > max_rx) + max_rx = rx; + if (cc > max_cc) + max_cc = cc; + if (cext > max_cext) + max_cext = cext; + + /* + * Update minimum values + */ + if (tx < min_tx) + min_tx = tx; + if (rx < min_rx) + min_rx = rx; + if (cc < min_cc) + min_cc = cc; + if (cext < min_cext) + min_cext = cext; + } + + printf("(%4.1f %4.1f %4.1f %4.1f) ", + min_tx, min_rx, min_cc, min_cext); + printf("(%4.1f %4.1f %4.1f %4.1f) ", + n == 0 ? 0.0 : (float) (avg_tx / n) / 100.0, + n == 0 ? 0.0 : (float) (avg_rx / n) / 100.0, + n == 0 ? 0.0 : (float) (avg_cc / n) / 100.0, + n == 0 ? 0.0 : (float) (avg_cext / n) / 100.0); + printf("(%4.1f %4.1f %4.1f %4.1f)\n", + max_tx, max_rx, max_cc, max_cext); +} + +int +main(int argc, char *argv[]) +{ + FILE *fd = NULL; + const char *ifname; + int c, s; + int l = 0; + + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s < 0) + err(1, "socket"); + ifname = getenv("ATH"); + if (!ifname) + ifname = ATH_DEFAULT; + + progname = argv[0]; + while ((c = getopt(argc, argv, "i:")) != -1) + switch (c) { + case 'i': + ifname = optarg; + break; + default: + usage(); + /*NOTREACHED*/ + } + argc -= optind; + argv += optind; + + /* Now, loop over and fetch some statistics .. */ + while (1) { + HAL_CHANNEL_SURVEY hs; + memset(&hs, '\0', sizeof(hs)); + if (get_survey_stats(s, ifname, &hs) == 0) + break; + /* XXX screen height! */ + if (l % 23 == 0) { + printf(" " + "min " + "avg " + "max\n"); + printf(" tx%% rx%% bc%% ec%% "); + printf(" tx%% rx%% bc%% ec%% "); + printf(" tx%% rx%% bc%% ec%%\n"); + } + process_survey_stats(&hs); + sleep(1); + l++; + } + + return (0); +} + + diff --git a/tools/tools/ath/common/dumpregs_5416.c b/tools/tools/ath/common/dumpregs_5416.c index d52c9ca0c25..2ef8e7b5594 100644 --- a/tools/tools/ath/common/dumpregs_5416.c +++ b/tools/tools/ath/common/dumpregs_5416.c @@ -39,7 +39,7 @@ #define N(a) (sizeof(a) / sizeof(a[0])) -#define MAC5416 SREV(13,8), SREV(0xff,0xff) /* XXX */ +#define MAC5416 SREV(13,8), SREV(0xffff,0xffff) /* XXX */ static struct dumpreg ar5416regs[] = { DEFBASIC(AR_CR, "CR"), diff --git a/tools/tools/ifpifa/Makefile b/tools/tools/ifpifa/Makefile new file mode 100644 index 00000000000..2bcf0868fde --- /dev/null +++ b/tools/tools/ifpifa/Makefile @@ -0,0 +1,10 @@ +# $FreeBSD$ + +PROG= ifpifa +NO_MAN= +WARNS?=6 +BINDIR?=/usr/local/bin +DPADD=${LIBKVM} +LDADD=-lkvm + +.include diff --git a/tools/tools/ifpifa/ifpifa.c b/tools/tools/ifpifa/ifpifa.c new file mode 100644 index 00000000000..3f2a8190fde --- /dev/null +++ b/tools/tools/ifpifa/ifpifa.c @@ -0,0 +1,190 @@ +/*- + * Copyright (c) 2012 maksim yevmenkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted providing that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* gcc -Wall -ggdb ifpifa.c -lkvm -o ifpifa */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +__FBSDID("$FreeBSD$"); + +static struct nlist nl[] = { +#define N_IFNET 0 + { .n_name = "_ifnet", }, + { .n_name = NULL, }, +}; + +static int +kread(kvm_t *kd, u_long addr, char *buffer, int size) +{ + if (kd == NULL || buffer == NULL) + return (-1); + + if (kvm_read(kd, addr, buffer, size) != size) { + warnx("kvm_read: %s", kvm_geterr(kd)); + return (-1); + } + + return (0); +} + +int +main(void) +{ + kvm_t *kd; + char errbuf[_POSIX2_LINE_MAX]; + u_long ifnetaddr, ifnetaddr_next; + u_long ifaddraddr, ifaddraddr_next; + struct ifnet ifnet; + struct ifnethead ifnethead; + union { + struct ifaddr ifa; + struct in_ifaddr in; + struct in6_ifaddr in6; + } ifaddr; + union { + struct sockaddr *sa; + struct sockaddr_dl *sal; + struct sockaddr_in *sa4; + struct sockaddr_in6 *sa6; + } sa; + char addr[INET6_ADDRSTRLEN]; + + kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf); + if (kd == NULL) { + warnx("kvm_openfiles: %s", errbuf); + exit(0); + } + + if (kvm_nlist(kd, nl) < 0) { + warnx("kvm_nlist: %s", kvm_geterr(kd)); + goto out; + } + + if (nl[N_IFNET].n_type == 0) { + warnx("kvm_nlist: no namelist"); + goto out; + } + + if (kread(kd, nl[N_IFNET].n_value, + (char *) &ifnethead, sizeof(ifnethead)) != 0) + goto out; + + for (ifnetaddr = (u_long) TAILQ_FIRST(&ifnethead); + ifnetaddr != 0; + ifnetaddr = ifnetaddr_next) { + if (kread(kd, ifnetaddr, (char *) &ifnet, sizeof(ifnet)) != 0) + goto out; + ifnetaddr_next = (u_long) TAILQ_NEXT(&ifnet, if_link); + + printf("%s\n", ifnet.if_xname); + + for (ifaddraddr = (u_long) TAILQ_FIRST(&ifnet.if_addrhead); + ifaddraddr != 0; + ifaddraddr = ifaddraddr_next) { + if (kread(kd, ifaddraddr, + (char *) &ifaddr, sizeof(ifaddr)) != 0) + goto out; + + ifaddraddr_next = (u_long) + TAILQ_NEXT(&ifaddr.ifa, ifa_link); + + sa.sa = (struct sockaddr *)( + (unsigned char *) ifaddr.ifa.ifa_addr - + (unsigned char *) ifaddraddr + + (unsigned char *) &ifaddr); + + switch (sa.sa->sa_family) { + case AF_LINK: + switch (sa.sal->sdl_type) { + case IFT_ETHER: + case IFT_FDDI: + ether_ntoa_r((struct ether_addr * ) + LLADDR(sa.sal), addr); + break; + + case IFT_LOOP: + strcpy(addr, "loopback"); + break; + + default: + snprintf(addr, sizeof(addr), + "", + sa.sal->sdl_type); + break; + } + break; + + case AF_INET: + inet_ntop(AF_INET, &sa.sa4->sin_addr, + addr, sizeof(addr)); + break; + + case AF_INET6: + inet_ntop(AF_INET6, &sa.sa6->sin6_addr, + addr, sizeof(addr)); + break; + + default: + snprintf(addr, sizeof(addr), "family=%d", + sa.sa->sa_family); + break; + } + + printf("\t%s ifa_refcnt=%u\n", + addr, ifaddr.ifa.ifa_refcnt); + } + } +out: + kvm_close(kd); + + return (0); +} + diff --git a/tools/tools/net80211/w00t/redir/buddy.c b/tools/tools/net80211/w00t/redir/buddy.c index 7d66e042d75..02107eca23a 100644 --- a/tools/tools/net80211/w00t/redir/buddy.c +++ b/tools/tools/net80211/w00t/redir/buddy.c @@ -125,7 +125,7 @@ int main(int argc, char *argv[]) int len; int raw; - memset(&s_in, 0, sizeof(&s_in)); + memset(&s_in, 0, sizeof(s_in)); s_in.sin_family = PF_INET; s_in.sin_port = htons(666); s_in.sin_addr.s_addr = INADDR_ANY; diff --git a/tools/tools/net80211/wesside/dics/dics.c b/tools/tools/net80211/wesside/dics/dics.c index 54bc981ebef..cbdff0c0fcf 100644 --- a/tools/tools/net80211/wesside/dics/dics.c +++ b/tools/tools/net80211/wesside/dics/dics.c @@ -332,7 +332,7 @@ int main(int argc, char *argv[]) { sip = argv[1]; - memset(&s_in, 0, sizeof(&s_in)); + memset(&s_in, 0, sizeof(s_in)); us = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s == -1) { perror("socket()"); diff --git a/tools/tools/net80211/wlanstats/main.c b/tools/tools/net80211/wlanstats/main.c index 93843d5158e..928b4b10275 100644 --- a/tools/tools/net80211/wlanstats/main.c +++ b/tools/tools/net80211/wlanstats/main.c @@ -57,7 +57,8 @@ static struct { }, { "ampdu", "input,output,ampdu_reorder,ampdu_oor,rx_dup,ampdu_flush,ampdu_move," - "ampdu_drop,ampdu_bar,ampdu_baroow,ampdu_barmove,rssi,rate" + "ampdu_drop,ampdu_bar,ampdu_baroow,ampdu_barmove,ampdu_bartx," + "ampdu_bartxfail,ampdu_bartxretry,rssi,rate" }, }; diff --git a/tools/tools/netmap/README b/tools/tools/netmap/README index 9a1ba609618..35207904e36 100644 --- a/tools/tools/netmap/README +++ b/tools/tools/netmap/README @@ -9,3 +9,15 @@ This directory contains examples that use netmap testpcap a jumper wire using libnetmap (or libpcap) click* various click examples + +------------------------------------------------------------ +Some performance data as of may 2012 for applications using libpcap. +Throughput is generally in Mpps computed with the 64-byte frames, +using 1 core on a 2.9GHz CPU and 10Gbit/s interface + +Libpcap version -- Application --------------------- +BSD netmap +--------------------------------------------------- + 0.77 3.82 ports/trafshow (version 5) + 0.94 7.7 net-mgmt/ipcad (ip accounting daemon) + 0.9 5.0 net-mgmt/darkstat (ip accounting + graphing) diff --git a/tools/tools/netmap/bridge.c b/tools/tools/netmap/bridge.c index 6e20b634cb2..0e9e4421642 100644 --- a/tools/tools/netmap/bridge.c +++ b/tools/tools/netmap/bridge.c @@ -79,7 +79,7 @@ sigint_h(__unused int sig) static int -do_ioctl(struct my_ring *me, int what) +do_ioctl(struct my_ring *me, unsigned long what) { struct ifreq ifr; int error; @@ -98,7 +98,7 @@ do_ioctl(struct my_ring *me, int what) } error = ioctl(me->fd, what, &ifr); if (error) { - D("ioctl error %d", what); + D("ioctl error 0x%lx", what); return error; } switch (what) { diff --git a/tools/tools/netmap/pcap.c b/tools/tools/netmap/pcap.c index 06bb1731df2..0a67f59342b 100644 --- a/tools/tools/netmap/pcap.c +++ b/tools/tools/netmap/pcap.c @@ -49,6 +49,34 @@ int verbose = 0; __FUNCTION__, __LINE__, ##__VA_ARGS__); \ } while (0) +inline void prefetch (const void *x) +{ + __asm volatile("prefetcht0 %0" :: "m" (*(const unsigned long *)x)); +} + +// XXX only for multiples of 64 bytes, non overlapped. +static inline void +pkt_copy(const void *_src, void *_dst, int l) +{ + const uint64_t *src = _src; + uint64_t *dst = _dst; +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + if (unlikely(l >= 1024)) { + bcopy(src, dst, l); + return; + } + for (; l > 0; l-=64) { + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + } +} /* * We redefine here a number of structures that are in pcap.h @@ -126,6 +154,8 @@ int pcap_setdirection(pcap_t *p, pcap_direction_t d); char *pcap_lookupdev(char *errbuf); int pcap_inject(pcap_t *p, const void *buf, size_t size); int pcap_fileno(pcap_t *p); +const char *pcap_lib_version(void); + struct eproto { const char *s; @@ -171,7 +201,7 @@ struct my_ring { static int -do_ioctl(struct my_ring *me, int what) +do_ioctl(struct my_ring *me, unsigned long what) { struct ifreq ifr; int error; @@ -191,7 +221,7 @@ do_ioctl(struct my_ring *me, int what) } error = ioctl(me->fd, what, &ifr); if (error) { - D("ioctl 0x%x error %d", what, error); + D("ioctl 0x%lx error %d", what, error); return error; } switch (what) { @@ -290,6 +320,11 @@ struct eproto eproto_db[] = { }; +const char *pcap_lib_version(void) +{ + return pcap_version; +} + int pcap_findalldevs(pcap_if_t **alldevsp, __unused char *errbuf) { @@ -479,21 +514,21 @@ pcap_setfilter(__unused pcap_t *p, __unused struct bpf_program *fp) int pcap_datalink(__unused pcap_t *p) { - D(""); + D("returns 1"); return 1; // ethernet } const char * pcap_datalink_val_to_name(int dlt) { - D("%d", dlt); + D("%d returns DLT_EN10MB", dlt); return "DLT_EN10MB"; } const char * pcap_datalink_val_to_description(int dlt) { - D("%d", dlt); + D("%d returns Ethernet link", dlt); return "Ethernet link"; } @@ -504,10 +539,8 @@ pcap_stats(pcap_t *p, struct pcap_stat *ps) struct my_ring *me = p; ND(""); - me->st.ps_recv += 10; *ps = me->st; - sprintf(me->msg, "stats not supported"); - return -1; + return 0; /* accumulate from pcap_dispatch() */ }; char * @@ -525,7 +558,8 @@ pcap_open_live(const char *device, __unused int snaplen, { struct my_ring *me; - D("request to open %s", device); + D("request to open %s snaplen %d promisc %d timeout %dms", + device, snaplen, promisc, to_ms); me = calloc(1, sizeof(*me)); if (me == NULL) { D("failed to allocate struct for %s", device); @@ -610,6 +644,8 @@ pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user) u_int si; ND("cnt %d", cnt); + if (cnt == 0) + cnt = -1; /* scan all rings */ for (si = me->begin; si < me->end; si++) { struct netmap_ring *ring = NETMAP_RXRING(me->nifp, si); @@ -617,6 +653,10 @@ pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user) if (ring->avail == 0) continue; me->hdr.ts = ring->ts; + /* + * XXX a proper prefetch should be done as + * prefetch(i); callback(i-1); ... + */ while ((cnt == -1 || cnt != got) && ring->avail > 0) { u_int i = ring->cur; u_int idx = ring->slot[i].buf_idx; @@ -626,6 +666,7 @@ pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user) sleep(2); } u_char *buf = (u_char *)NETMAP_BUF(ring, idx); + prefetch(buf); me->hdr.len = me->hdr.caplen = ring->slot[i].len; // D("call %p len %d", p, me->hdr.len); callback(user, &me->hdr, buf); @@ -634,6 +675,7 @@ pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user) got++; } } + me->st.ps_recv += got; return got; } @@ -660,7 +702,7 @@ pcap_inject(pcap_t *p, const void *buf, size_t size) } u_char *dst = (u_char *)NETMAP_BUF(ring, idx); ring->slot[i].len = size; - bcopy(buf, dst, size); + pkt_copy(buf, dst, size); ring->cur = NETMAP_RING_NEXT(ring, i); ring->avail--; // if (ring->avail == 0) ioctl(me->fd, NIOCTXSYNC, NULL); diff --git a/tools/tools/netmap/pkt-gen.c b/tools/tools/netmap/pkt-gen.c index 43eeda86e15..e877a85888a 100644 --- a/tools/tools/netmap/pkt-gen.c +++ b/tools/tools/netmap/pkt-gen.c @@ -25,7 +25,7 @@ /* * $FreeBSD$ - * $Id: pkt-gen.c 10637 2012-02-24 16:36:25Z luigi $ + * $Id: pkt-gen.c 10967 2012-05-03 11:29:23Z luigi $ * * Example program to show how to build a multithreaded packet * source/sink using the netmap device. @@ -90,6 +90,36 @@ int verbose = 0; #define SKIP_PAYLOAD 1 /* do not check payload. */ +inline void prefetch (const void *x) +{ + __asm volatile("prefetcht0 %0" :: "m" (*(const unsigned long *)x)); +} + +// XXX only for multiples of 64 bytes, non overlapped. +static inline void +pkt_copy(void *_src, void *_dst, int l) +{ + uint64_t *src = _src; + uint64_t *dst = _dst; +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + if (unlikely(l >= 1024)) { + bcopy(src, dst, l); + return; + } + for (; l > 0; l-=64) { + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + } +} + + #if EXPERIMENTAL /* Wrapper around `rdtsc' to take reliable timestamps flushing the pipeline */ #define netmap_rdtsc(t) \ @@ -140,6 +170,11 @@ struct glob_arg { int npackets; /* total packets to send */ int nthreads; int cpus; + int options; /* testing */ +#define OPT_PREFETCH 1 +#define OPT_ACCESS 2 +#define OPT_COPY 4 +#define OPT_MEMCPY 8 int use_pcap; pcap_t *p; }; @@ -156,6 +191,7 @@ struct targ { struct glob_arg *g; int used; int completed; + int cancel; int fd; struct nmreq nmr; struct netmap_if *nifp; @@ -186,15 +222,8 @@ static int global_nthreads; static void sigint_h(__unused int sig) { - for (int i = 0; i < global_nthreads; i++) { - /* cancel active threads. */ - if (targs[i].used == 0) - continue; - - D("Cancelling thread #%d\n", i); - pthread_cancel(targs[i].thread); - targs[i].used = 0; - } + for (int i = 0; i < global_nthreads; i++) + targs[i].cancel = 1; signal(SIGINT, SIG_DFL); } @@ -394,19 +423,35 @@ check_payload(char *p, int psize) */ static int send_packets(struct netmap_ring *ring, struct pkt *pkt, - int size, u_int count, int fill_all) + int size, u_int count, int options) { u_int sent, cur = ring->cur; if (ring->avail < count) count = ring->avail; +#if 0 + if (options & (OPT_COPY | OPT_PREFETCH) ) { + for (sent = 0; sent < count; sent++) { + struct netmap_slot *slot = &ring->slot[cur]; + char *p = NETMAP_BUF(ring, slot->buf_idx); + + prefetch(p); + cur = NETMAP_RING_NEXT(ring, cur); + } + cur = ring->cur; + } +#endif for (sent = 0; sent < count; sent++) { struct netmap_slot *slot = &ring->slot[cur]; char *p = NETMAP_BUF(ring, slot->buf_idx); - if (fill_all) + if (options & OPT_COPY) + pkt_copy(pkt, p, size); + else if (options & OPT_MEMCPY) memcpy(p, pkt, size); + else if (options & OPT_PREFETCH) + prefetch(p); slot->len = size; if (sent == count - 1) @@ -427,9 +472,14 @@ sender_body(void *data) struct pollfd fds[1]; struct netmap_if *nifp = targ->nifp; struct netmap_ring *txring; - int i, n = targ->g->npackets / targ->g->nthreads, sent = 0; - int fill_all = 1; - + int i, pkts_per_td = targ->g->npackets / targ->g->nthreads, sent = 0; + int continuous = 0; + int options = targ->g->options | OPT_COPY; +D("start"); + if (pkts_per_td == 0) { + continuous = 1; + pkts_per_td = 100000; + } if (setaffinity(targ->thread, targ->affinity)) goto quit; /* setup poll(2) mechanism. */ @@ -444,38 +494,48 @@ sender_body(void *data) void *pkt = &targ->pkt; pcap_t *p = targ->g->p; - for (; sent < n; sent++) { - if (pcap_inject(p, pkt, size) == -1) - break; + for (i = 0; (sent < pkts_per_td && !targ->cancel) || continuous; i++) { + if (pcap_inject(p, pkt, size) != -1) + sent++; + if (i > 10000) { + targ->count = sent; + i = 0; + } } } else { - while (sent < n) { + while (sent < pkts_per_td || continuous) { /* * wait for available room in the send queue(s) */ if (poll(fds, 1, 2000) <= 0) { + if (targ->cancel) + break; D("poll error/timeout on queue %d\n", targ->me); goto quit; } /* * scan our queues and send on those with room */ - if (sent > 100000) - fill_all = 0; - for (i = targ->qfirst; i < targ->qlast; i++) { - int m, limit = MIN(n - sent, targ->g->burst); + if (sent > 100000 && !(targ->g->options & OPT_COPY) ) + options &= ~OPT_COPY; + for (i = targ->qfirst; i < targ->qlast && !targ->cancel; i++) { + int m, limit = targ->g->burst; + if (!continuous && pkts_per_td - sent < limit) + limit = pkts_per_td - sent; txring = NETMAP_TXRING(nifp, i); if (txring->avail == 0) continue; m = send_packets(txring, &targ->pkt, targ->g->pkt_size, - limit, fill_all); + limit, options); sent += m; targ->count = sent; } + if (targ->cancel) + break; } - /* Tell the interface that we have new packets. */ + /* flush any remaining packets */ ioctl(fds[0].fd, NIOCTXSYNC, NULL); /* final part: wait all the TX queues to be empty. */ @@ -549,7 +609,7 @@ receiver_body(void *data) fds[0].events = (POLLIN); /* unbounded wait for the first packet. */ - for (;;) { + while (!targ->cancel) { i = poll(fds, 1, 1000); if (i > 0 && !(fds[0].revents & POLLERR)) break; @@ -559,11 +619,11 @@ receiver_body(void *data) /* main loop, exit after 1s silence */ gettimeofday(&targ->tic, NULL); if (targ->g->use_pcap) { - for (;;) { + while (!targ->cancel) { pcap_dispatch(targ->g->p, targ->g->burst, receive_pcap, NULL); } } else { - while (1) { + while (!targ->cancel) { /* Once we started to receive packets, wait at most 1 seconds before quitting. */ if (poll(fds, 1, 1 * 1000) <= 0) { @@ -600,27 +660,41 @@ quit: return (NULL); } +static char * +scaled_val(double val) +{ + static char buf[64]; + const char *units[] = {"", "K", "M", "G"}; + int i = 0; + + while (val >= 1000 && i < 3) { + val /= 1000; + i++; + } + snprintf(buf, sizeof(buf), "%.2f%s", val, units[i]); + return (buf); +} + static void tx_output(uint64_t sent, int size, double delta) { - double amount = 8.0 * (1.0 * size * sent) / delta; + uint64_t bytes_sent = sent * size; + double bw = 8.0 * bytes_sent / delta; double pps = sent / delta; - char units[4] = { '\0', 'K', 'M', 'G' }; - int aunit = 0, punit = 0; - - while (amount >= 1000) { - amount /= 1000; - aunit += 1; - } - while (pps >= 1000) { - pps /= 1000; - punit += 1; - } + /* + * Assume Ethernet overhead of 24 bytes per packet excluding header: + * FCS 4 bytes + * Preamble 8 bytes + * IFG 12 bytes + */ + double bw_with_overhead = 8.0 * (bytes_sent + sent * 24) / delta; printf("Sent %" PRIu64 " packets, %d bytes each, in %.2f seconds.\n", sent, size, delta); - printf("Speed: %.2f%cpps. Bandwidth: %.2f%cbps.\n", - pps, units[punit], amount, units[aunit]); + printf("Speed: %spps. ", scaled_val(pps)); + printf("Bandwidth: %sbps ", scaled_val(bw)); + printf("(%sbps with overhead).\n", scaled_val(bw_with_overhead)); + } @@ -649,7 +723,7 @@ usage(void) "Usage:\n" "%s arguments\n" "\t-i interface interface name\n" - "\t-t pkts_to_send also forces send mode\n" + "\t-t pkts_to_send also forces send mode, 0 = continuous\n" "\t-r pkts_to_receive also forces receive mode\n" "\t-l pkts_size in bytes excluding CRC\n" "\t-d dst-ip end with %%n to sweep n addresses\n" @@ -672,6 +746,7 @@ int main(int arc, char **argv) { int i, fd; + char pcap_errbuf[PCAP_ERRBUF_SIZE]; struct glob_arg g; @@ -696,12 +771,15 @@ main(int arc, char **argv) g.cpus = 1; while ( (ch = getopt(arc, argv, - "i:t:r:l:d:s:D:S:b:c:p:T:w:v")) != -1) { + "i:t:r:l:d:s:D:S:b:c:o:p:PT:w:v")) != -1) { switch(ch) { default: D("bad option %c %s", ch, optarg); usage(); break; + case 'o': + g.options = atoi(optarg); + break; case 'i': /* interface */ ifname = optarg; break; @@ -775,6 +853,26 @@ main(int arc, char **argv) usage(); } + if (td_body == sender_body && g.src_mac == NULL) { + static char mybuf[20] = "ff:ff:ff:ff:ff:ff"; + /* retrieve source mac address. */ + if (source_hwaddr(ifname, mybuf) == -1) { + D("Unable to retrieve source mac"); + // continue, fail later + } + g.src_mac = mybuf; + } + + if (g.use_pcap) { + D("using pcap on %s", ifname); + g.p = pcap_open_live(ifname, 0, 1, 100, pcap_errbuf); + if (g.p == NULL) { + D("cannot open pcap on %s", ifname); + usage(); + } + mmap_addr = NULL; + fd = -1; + } else { bzero(&nmr, sizeof(nmr)); nmr.nr_version = NETMAP_API; /* @@ -811,16 +909,6 @@ main(int arc, char **argv) // continue, fail later } - if (td_body == sender_body && g.src_mac == NULL) { - static char mybuf[20] = "ff:ff:ff:ff:ff:ff"; - /* retrieve source mac address. */ - if (source_hwaddr(ifname, mybuf) == -1) { - D("Unable to retrieve source mac"); - // continue, fail later - } - g.src_mac = mybuf; - } - /* * Map the netmap shared memory: instead of issuing mmap() * inside the body of the threads, we prefer to keep this @@ -869,8 +957,15 @@ main(int arc, char **argv) D("aborting"); usage(); } + } - + if (g.options) { + D("special options:%s%s%s%s\n", + g.options & OPT_PREFETCH ? " prefetch" : "", + g.options & OPT_ACCESS ? " access" : "", + g.options & OPT_MEMCPY ? " memcpy" : "", + g.options & OPT_COPY ? " copy" : ""); + } /* Wait for PHY reset. */ D("Wait %d secs for phy reset", wait_link); sleep(wait_link); @@ -881,7 +976,12 @@ main(int arc, char **argv) signal(SIGINT, sigint_h); if (g.use_pcap) { - // XXX g.p = pcap_open_live(..); + g.p = pcap_open_live(ifname, 0, 1, 100, NULL); + if (g.p == NULL) { + D("cannot open pcap on %s", ifname); + usage(); + } else + D("using pcap %p on %s", g.p, ifname); } targs = calloc(g.nthreads, sizeof(*targs)); @@ -1018,9 +1118,11 @@ main(int arc, char **argv) rx_output(count, delta_t); } + if (g.use_pcap == 0) { ioctl(fd, NIOCUNREGIF, &nmr); munmap(mmap_addr, nmr.nr_memsize); close(fd); + } return (0); } diff --git a/tools/tools/netrate/netsend/netsend.c b/tools/tools/netrate/netsend/netsend.c index f97594e9636..055825367c0 100644 --- a/tools/tools/netrate/netsend/netsend.c +++ b/tools/tools/netrate/netsend/netsend.c @@ -147,6 +147,7 @@ timing_loop(struct _a *a) long minres_ns = 20000; int ic, gettimeofday_cycles; int cur_port; + uint64_t n, ns; if (clock_getres(CLOCK_REALTIME, &tmptime) == -1) { perror("clock_getres"); @@ -257,6 +258,13 @@ done: printf("send errors: %ld\n", send_errors); printf("approx send rate: %ld pps\n", (send_calls - send_errors) / a->duration); + n = send_calls - send_errors; + if (n > 0) { + ns = (tmptime.tv_sec - starttime.tv_sec) * 1000000000UL + + (tmptime.tv_nsec - starttime.tv_nsec); + n = ns / n; + } + printf("time/packet: %u ns\n", (u_int)n); printf("approx error rate: %ld\n", (send_errors / send_calls)); printf("waited: %lld\n", waited); printf("approx waits/sec: %lld\n", (long long)(waited / a->duration)); diff --git a/tools/tools/syscall_timing/syscall_timing.c b/tools/tools/syscall_timing/syscall_timing.c index 2fb2add241f..175c1bc9bd6 100644 --- a/tools/tools/syscall_timing/syscall_timing.c +++ b/tools/tools/syscall_timing/syscall_timing.c @@ -71,20 +71,24 @@ alarm_handler(int signum) static void benchmark_start(void) { + int error; alarm_fired = 0; if (alarm_timeout) { signal(SIGALRM, alarm_handler); alarm(alarm_timeout); } - assert(clock_gettime(CLOCK_REALTIME, &ts_start) == 0); + error = clock_gettime(CLOCK_REALTIME, &ts_start); + assert(error == 0); } static void benchmark_stop(void) { + int error; - assert(clock_gettime(CLOCK_REALTIME, &ts_end) == 0); + error = clock_gettime(CLOCK_REALTIME, &ts_end); + assert(error == 0); } uintmax_t @@ -141,6 +145,22 @@ test_clock_gettime(uintmax_t num, uintmax_t int_arg, const char *path) return (i); } +uintmax_t +test_gettimeofday(uintmax_t num, uintmax_t int_arg, const char *path) +{ + struct timeval tv; + uintmax_t i; + + benchmark_start(); + for (i = 0; i < num; i++) { + if (alarm_fired) + break; + (void)gettimeofday(&tv, NULL); + } + benchmark_stop(); + return (i); +} + uintmax_t test_pipe(uintmax_t num, uintmax_t int_arg, const char *path) { @@ -608,6 +628,7 @@ static const struct test tests[] = { { "getuid", test_getuid }, { "getppid", test_getppid }, { "clock_gettime", test_clock_gettime }, + { "gettimeofday", test_gettimeofday }, { "pipe", test_pipe }, { "socket_local_stream", test_socket_stream, .t_int = PF_LOCAL }, { "socket_local_dgram", test_socket_dgram, .t_int = PF_LOCAL }, @@ -670,7 +691,7 @@ main(int argc, char *argv[]) const char *path; long long ll; char *endp; - int ch, i, j, k; + int ch, error, i, j, k; uintmax_t iterations, loops; alarm_timeout = 1; @@ -739,7 +760,8 @@ main(int argc, char *argv[]) } } - assert(clock_getres(CLOCK_REALTIME, &ts_res) == 0); + error = clock_getres(CLOCK_REALTIME, &ts_res); + assert(error == 0); printf("Clock resolution: %ju.%09ju\n", (uintmax_t)ts_res.tv_sec, (uintmax_t)ts_res.tv_nsec); printf("test\tloop\ttime\titerations\tperiteration\n"); diff --git a/tools/tools/tinybsd/README b/tools/tools/tinybsd/README index 7f3fc05c118..ff1bf28b3af 100644 --- a/tools/tools/tinybsd/README +++ b/tools/tools/tinybsd/README @@ -256,4 +256,4 @@ TinyBSD is still a project under heavy development, both the script itself and its documentation. In case you'd like to try or use the BETA version of the script, feel free to -download it from the project's official site at http://www.tinybsd.org. +download it from the project's official site at http://code.google.com/p/tinybsd/. diff --git a/tools/tools/zfsboottest/zfsboottest.c b/tools/tools/zfsboottest/zfsboottest.c index 4b29f949429..3058046985d 100644 --- a/tools/tools/zfsboottest/zfsboottest.c +++ b/tools/tools/zfsboottest/zfsboottest.c @@ -89,7 +89,11 @@ main(int argc, char** argv) char buf[512], hash[33]; MD5_CTX ctx; struct stat sb; + struct zfsmount zfsmnt; dnode_phys_t dn; +#if 0 + uint64_t rootobj; +#endif spa_t *spa; off_t off; ssize_t n; @@ -138,14 +142,28 @@ main(int argc, char** argv) exit(1); } - if (zfs_mount_pool(spa)) { - fprintf(stderr, "can't mount pool\n"); + if (zfs_spa_init(spa)) { + fprintf(stderr, "can't init pool\n"); exit(1); } +#if 0 + if (zfs_get_root(spa, &rootobj)) { + fprintf(stderr, "can't get root\n"); + exit(1); + } + + if (zfs_mount(spa, rootobj, &zfsmnt)) { +#else + if (zfs_mount(spa, 0, &zfsmnt)) { + fprintf(stderr, "can't mount\n"); + exit(1); + } +#endif + printf("\n"); for (++i, failures = 0; i < argc; i++) { - if (zfs_lookup(spa, argv[i], &dn)) { + if (zfs_lookup(&zfsmnt, argv[i], &dn)) { fprintf(stderr, "%s: can't lookup\n", argv[i]); failures++; continue; diff --git a/tools/tools/zfsboottest/zfsboottest.sh b/tools/tools/zfsboottest/zfsboottest.sh index e1bcf8bebfd..1707e3f3e63 100755 --- a/tools/tools/zfsboottest/zfsboottest.sh +++ b/tools/tools/zfsboottest/zfsboottest.sh @@ -52,8 +52,7 @@ if [ $? -ne 0 ]; then fi bootfs=`zpool get bootfs "${pool}" | tail -1 | awk '{print $3}'` if [ "${bootfs}" = "-" ]; then - echo "The \"bootfs\" property is not configured for pool \"${pool}\"." >&2 - exit 1 + bootfs="${pool}" fi # Dataset's mountpoint property should be set to 'legacy'. if [ "`zfs get -H -o value mountpoint ${bootfs}`" != "legacy" ]; then @@ -73,11 +72,11 @@ fi # or vfs.root.mountfrom variable set in /boot/loader.conf. egrep -q '^'"${bootfs}"'[[:space:]]+/[[:space:]]+zfs[[:space:]]+' "${mountpoint}/etc/fstab" 2>/dev/null if [ $? -ne 0 ]; then - egrep -q 'vfs.root.mountfrom="?'"${bootfs}"'"?[[:space:]]*$' "${mountpoint}/boot/loader.conf" 2>/dev/null + egrep -q 'vfs.root.mountfrom="?'"zfs:${bootfs}"'"?[[:space:]]*$' "${mountpoint}/boot/loader.conf" 2>/dev/null if [ $? -ne 0 ]; then echo "To be able to boot from \"${bootfs}\", you need to declare" >&2 echo "\"${bootfs}\" as being root file system in ${mountpoint}/etc/fstab" >&2 - echo "or add \"vfs.root.mountfrom\" variable set to \"${bootfs}\" to" >&2 + echo "or add \"vfs.root.mountfrom\" variable set to \"zfs:${bootfs}\" to" >&2 echo "${mountpoint}/boot/loader.conf." >&2 exit 1 fi diff --git a/usr.bin/Makefile b/usr.bin/Makefile index 85fb6e61239..6f60756d9ef 100644 --- a/usr.bin/Makefile +++ b/usr.bin/Makefile @@ -105,6 +105,7 @@ SUBDIR= alias \ mkfifo \ mklocale \ mktemp \ + mkulzma \ mkuzip \ mt \ ncal \ @@ -141,8 +142,10 @@ SUBDIR= alias \ shar \ showmount \ sockstat \ + sort \ split \ stat \ + stdbuf \ su \ systat \ tabs \ diff --git a/usr.bin/ar/Makefile b/usr.bin/ar/Makefile index e37312075ed..e9bb8933643 100644 --- a/usr.bin/ar/Makefile +++ b/usr.bin/ar/Makefile @@ -1,5 +1,7 @@ # $FreeBSD$ +.include + PROG= ar SRCS= ar.c acplex.l acpyacc.y read.c util.c write.c y.tab.h @@ -8,7 +10,9 @@ LDADD= -larchive -lelf CFLAGS+=-I. -I${.CURDIR} +.if ${MK_SHARED_TOOLCHAIN} == "no" NO_SHARED?= yes +.endif LINKS= ${BINDIR}/ar ${BINDIR}/ranlib MLINKS= ar.1 ranlib.1 diff --git a/usr.bin/ar/acpyacc.y b/usr.bin/ar/acpyacc.y index 99a23c755c3..5d15e8db569 100644 --- a/usr.bin/ar/acpyacc.y +++ b/usr.bin/ar/acpyacc.y @@ -54,7 +54,6 @@ struct list { extern int yylex(void); -extern int yyparse(void); static void yyerror(const char *); static void arscp_addlib(char *archive, struct list *list); diff --git a/usr.bin/bc/bc.y b/usr.bin/bc/bc.y index 55df7b33ac3..f7425f24628 100644 --- a/usr.bin/bc/bc.y +++ b/usr.bin/bc/bc.y @@ -69,7 +69,6 @@ struct tree { ssize_t index; }; -int yyparse(void); int yywrap(void); int fileindex; diff --git a/usr.bin/calendar/calendar.1 b/usr.bin/calendar/calendar.1 index 423fca34102..997bb1f30fa 100644 --- a/usr.bin/calendar/calendar.1 +++ b/usr.bin/calendar/calendar.1 @@ -218,7 +218,7 @@ Paskha\fB\et\fROrthodox Easter .Sh FILES .Bl -tag -width calendar.christian -compact .It Pa calendar -file in current directory +file in current directory. .It Pa ~/.calendar .Pa calendar HOME directory. diff --git a/usr.bin/calendar/calendars/calendar.freebsd b/usr.bin/calendar/calendars/calendar.freebsd index c9a2f789b51..301cee950b5 100644 --- a/usr.bin/calendar/calendars/calendar.freebsd +++ b/usr.bin/calendar/calendars/calendar.freebsd @@ -144,6 +144,7 @@ 05/08 Sean Kelly born in Walnut Creek, California, United States, 1982 05/09 Daniel Eischen born in Syracuse, New York, United States, 1963 05/09 Aaron Dalton born in Boise, Idaho, United States, 1973 +05/09 Jase Thew born in Abergavenny, Gwent, United Kingdom, 1974 05/10 Markus Brueffer born in Gronau, Nordrhein-Westfalen, Germany, 1977 05/11 Jesus Rodriguez born in Barcelona, Spain, 1972 05/11 Roman Kurakin born in Moscow, USSR, 1979 @@ -309,6 +310,7 @@ 10/23 Mario Sergio Fujikawa Ferreira born in Brasilia, Distrito Federal, Brazil, 1976 10/25 Eric Melville born in Los Gatos, California, United States, 1980 10/25 Julien Laffaye born in Toulouse, France, 1988 +10/25 Ashish SHUKLA born in Kanpur, India, 1985 10/26 Philip M. Gollucci born in Silver Spring, Maryland, United States, 1979 10/27 Takanori Watanabe born in Numazu, Shizuoka, Japan, 1972 11/05 M. Warner Losh born in Kansas City, Kansas, United States, 1966 @@ -348,6 +350,7 @@ 12/23 Sean Chittenden born in Seattle, Washington, United States, 1979 12/23 Alejandro Pulver born in Buenos Aires, Argentina, 1989 12/24 Guido Falsi born in Firenze, Italy, 1978 +12/25 Niclas Zeising born in Stockholm, Sweden, 1986 12/28 Soren Schmidt born in Maribo, Denmark, 1960 12/28 Ade Lovett born in London, England, 1969 12/28 Marius Strobl born in Cham, Bavaria, Germany, 1978 diff --git a/usr.bin/chat/chat.c b/usr.bin/chat/chat.c index 056af3749f9..86e6cfb3237 100644 --- a/usr.bin/chat/chat.c +++ b/usr.bin/chat/chat.c @@ -408,6 +408,7 @@ chat_logf(const char *fmt, ...) va_start(args, fmt); vfmtmsg(line, sizeof(line), fmt, args); + va_end(args); if (to_log) syslog(LOG_INFO, "%s", line); if (to_stderr) @@ -425,6 +426,7 @@ fatal(int code, const char *fmt, ...) va_start(args, fmt); vfmtmsg(line, sizeof(line), fmt, args); + va_end(args); if (to_log) syslog(LOG_ERR, "%s", line); if (to_stderr) diff --git a/usr.bin/clang/clang/Makefile b/usr.bin/clang/clang/Makefile index 60f1736695b..946dea94dad 100644 --- a/usr.bin/clang/clang/Makefile +++ b/usr.bin/clang/clang/Makefile @@ -41,7 +41,6 @@ LIBDEPS=clangfrontendtool \ clangstaticanalyzercheckers \ clangstaticanalyzercore \ clanganalysis \ - clangindex \ clangarcmigrate \ clangrewrite \ clangedit \ diff --git a/usr.bin/clang/clang/clang.1 b/usr.bin/clang/clang/clang.1 index d6c04202af4..7fd800b5376 100644 --- a/usr.bin/clang/clang/clang.1 +++ b/usr.bin/clang/clang/clang.1 @@ -475,7 +475,7 @@ write temporary files used during the compilation process. .IX Item "CPATH" If this environment variable is present, it is treated as a delimited list of paths to be added to the default system include path list. The -delimiter is the platform dependent delimitor, as used in the \fI\s-1PATH\s0\fR +delimiter is the platform dependent delimiter, as used in the \fI\s-1PATH\s0\fR environment variable. .Sp Empty components in the environment variable are ignored. diff --git a/usr.bin/clang/tblgen/tblgen.1 b/usr.bin/clang/tblgen/tblgen.1 index 753609f9d91..732f25a2bb1 100644 --- a/usr.bin/clang/tblgen/tblgen.1 +++ b/usr.bin/clang/tblgen/tblgen.1 @@ -175,7 +175,7 @@ Print the enumeration list for this class. Print all records to standard output (default). .IP "\fB\-print\-enums\fR" 4 .IX Item "-print-enums" -Print enumeration values for a class +Print enumeration values for a class. .IP "\fB\-print\-sets\fR" 4 .IX Item "-print-sets" Print expanded sets for testing \s-1DAG\s0 exprs. diff --git a/usr.bin/csup/csup.1 b/usr.bin/csup/csup.1 index 5e596815706..5e5d5dd1206 100644 --- a/usr.bin/csup/csup.1 +++ b/usr.bin/csup/csup.1 @@ -311,7 +311,7 @@ will not create it. The default .Ar base directory is -.Pa /usr/local/etc/csup . +.Pa /usr/local/etc/cvsup . .It Cm prefix= Ns Ar prefix This is the directory under which updated files will be placed. By default, it is the same as @@ -656,7 +656,7 @@ from that directory is not required then the line .El .Pp will not work because the file on the server is called -.Ql Makefile,v. +.Ql Makefile,v . A better solution would be .Pp .Bl -item -compact -offset indent diff --git a/usr.bin/ctlstat/ctlstat.8 b/usr.bin/ctlstat/ctlstat.8 index a213cc9470f..27386f8d8ac 100644 --- a/usr.bin/ctlstat/ctlstat.8 +++ b/usr.bin/ctlstat/ctlstat.8 @@ -86,8 +86,8 @@ Notation (JSON) format. No statistics are computed in this mode, only raw numbers are displayed. .It Fl l Ar lun Request statistics for the specified LUN. -This option is incompatible with total ( -.Fl t ) +This option is incompatible with total +.Fl ( t ) mode. .It Fl n Ar numdevs Display statistics for this many devices. diff --git a/usr.bin/cut/cut.1 b/usr.bin/cut/cut.1 index 3ea9362f72b..d4e68760fad 100644 --- a/usr.bin/cut/cut.1 +++ b/usr.bin/cut/cut.1 @@ -68,7 +68,7 @@ The items specified by .Ar list can be in terms of column position or in terms of fields delimited by a special character. -Column numbering starts from 1. +Column and field numbering start from 1. .Pp The .Ar list @@ -78,14 +78,14 @@ number ranges. Number ranges consist of a number, a dash .Pq Sq \- , and a second number -and select the fields or columns from the first number to the second, +and select the columns or fields from the first number to the second, inclusive. Numbers or number ranges may be preceded by a dash, which selects all -fields or columns from 1 to the last number. +columns or fields from 1 to the last number. Numbers or number ranges may be followed by a dash, which selects all -fields or columns from the last number to the end of the line. +columns or fields from the last number to the end of the line. Numbers and number ranges may be repeated, overlapping, and in any order. -It is not an error to select fields or columns not present in the +It is not an error to select columns or fields not present in the input line. .Pp The options are as follows: diff --git a/usr.bin/cut/cut.c b/usr.bin/cut/cut.c index d32d4ab9d20..0a3a2a946b8 100644 --- a/usr.bin/cut/cut.c +++ b/usr.bin/cut/cut.c @@ -164,7 +164,7 @@ get_list(char *list) * set a byte in the positions array to indicate if a field or * column is to be selected; use +1, it's 1-based, not 0-based. * Numbers and number ranges may be overlapping, repeated, and in - * any order. We handle "-3-5" although there's no real reason too. + * any order. We handle "-3-5" although there's no real reason to. */ for (; (p = strsep(&list, ", \t")) != NULL;) { setautostart = start = stop = 0; @@ -187,9 +187,9 @@ get_list(char *list) } } if (*p) - errx(1, "[-cf] list: illegal list value"); + errx(1, "[-bcf] list: illegal list value"); if (!stop || !start) - errx(1, "[-cf] list: values may not include zero"); + errx(1, "[-bcf] list: values may not include zero"); if (maxval < stop) { maxval = stop; needpos(maxval + 1); diff --git a/usr.bin/dc/dc.1 b/usr.bin/dc/dc.1 index 03fc7621a5a..94dba767e65 100644 --- a/usr.bin/dc/dc.1 +++ b/usr.bin/dc/dc.1 @@ -315,7 +315,7 @@ The length of a number is its number of digits, not counting the minus sign and decimal point. .It Ic z The stack level is pushed onto the stack. -.It Cm [ Ns ... Ns Cm ] +.It Cm \&[ Ns ... Ns Cm \&] Puts the bracketed .Tn ASCII string onto the top of the stack. @@ -375,12 +375,12 @@ command. .It Ic \&? A line of input is taken from the input source (usually the terminal) and executed. -.It Ic : Ns Ar r +.It Ic \&: Ns Ar r Pop two values from the stack. The second value on the stack is stored into the array .Ar r indexed by the top of stack. -.It Ic ; Ns Ar r +.It Ic \&; Ns Ar r Pop a value from the stack. The value is used as an index into register .Ar r . diff --git a/usr.bin/fetch/fetch.1 b/usr.bin/fetch/fetch.1 index e6779a4dc54..900c0ee26ee 100644 --- a/usr.bin/fetch/fetch.1 +++ b/usr.bin/fetch/fetch.1 @@ -1,5 +1,5 @@ .\"- -.\" Copyright (c) 2000-2012 Dag-Erling Smørgrav +.\" Copyright (c) 2000-2011 Dag-Erling Smørgrav .\" All rights reserved. .\" Portions Copyright (c) 1999 Massachusetts Institute of Technology; used .\" by permission. @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 28, 2012 +.Dd September 27, 2011 .Dt FETCH 1 .Os .Sh NAME @@ -214,11 +214,6 @@ When the flag is specified, wait this many seconds between successive retries. .El .Pp -.Ar URL -.Bd -literal - :(//((:)?@)?(:)?)?/()? -.Ed -.Pp If .Nm receives a @@ -254,7 +249,7 @@ for a description of additional environment variables, including .Ev HTTP_REFERER , .Ev HTTP_USER_AGENT , .Ev NETRC , -.Ev NO_PROXY and +.Ev NO_PROXY No and .Ev no_proxy . .Sh EXIT STATUS The diff --git a/usr.bin/find/find.1 b/usr.bin/find/find.1 index 2209e4f87c8..8e47084396f 100644 --- a/usr.bin/find/find.1 +++ b/usr.bin/find/find.1 @@ -31,7 +31,7 @@ .\" @(#)find.1 8.7 (Berkeley) 5/9/95 .\" $FreeBSD$ .\" -.Dd September 28, 2011 +.Dd June 13, 2012 .Dt FIND 1 .Os .Sh NAME @@ -126,36 +126,15 @@ as an effective alternative. .It Fl d Cause .Nm -to perform a depth-first traversal, i.e., directories -are visited in post-order and all entries in a directory will be acted -on before the directory itself. -By default, -.Nm -visits directories in pre-order, i.e., before their contents. -Note, the default is -.Em not -a breadth-first traversal. +to perform a depth-first traversal. .Pp -This option is equivalent to the +This option is a BSD-specific equivalent of the .Ic -depth -primary of +primary specified by .St -p1003.1-2001 . -The -.Fl d -option -can be useful when -.Nm -is used with -.Xr cpio 1 -to process files that are contained in directories with unusual permissions. -It ensures that you have write permission while you are placing files in a -directory, then sets the directory's permissions as the last thing. -.It Fl f -Specify a file hierarchy for -.Nm -to traverse. -File hierarchies may also be specified as the operands immediately -following the options. +Refer to its description under +.Sx PRIMARIES +for more information. .It Fl s Cause .Nm @@ -301,7 +280,7 @@ Please refer to the .Ic -atime primary description for information on supported time units. .It Ic -d -Same as +Non-portable, BSD-specific version of .Ic depth . GNU find implements this as a primary in mistaken emulation of .Fx @@ -319,12 +298,37 @@ character in its pathname relative to .Dq Pa \&. for security reasons. Depth-first traversal processing is implied by this option. +The +.Ic -delete +primary will fail to delete a directory if it is not empty. Following symlinks is incompatible with this option. .It Ic -depth Always true; -same as the +same as the non-portable .Fl d option. +Cause +.Nm +to perform a depth-first traversal, i.e., directories +are visited in post-order and all entries in a directory will be acted +on before the directory itself. +By default, +.Nm +visits directories in pre-order, i.e., before their contents. +Note, the default is +.Em not +a breadth-first traversal. +.Pp +The +.Ic -depth +primary +can be useful when +.Nm +is used with +.Xr cpio 1 +to process files that are contained in directories with unusual permissions. +It ensures that you have write permission while you are placing files in a +directory, then sets the directory's permissions as the last thing. .It Ic -depth Ar n True if the depth of the file relative to the starting point of the traversal is diff --git a/usr.bin/find/getdate.y b/usr.bin/find/getdate.y index 81a9c47735e..16ffb6eeff7 100644 --- a/usr.bin/find/getdate.y +++ b/usr.bin/find/getdate.y @@ -60,11 +60,9 @@ __FBSDID("$FreeBSD$"); #include -#define yyparse getdate_yyparse #define yylex getdate_yylex #define yyerror getdate_yyerror -static int yyparse(void); static int yylex(void); static int yyerror(const char *); diff --git a/usr.bin/fstat/Makefile b/usr.bin/fstat/Makefile index c59e123e62c..8ea8da3a473 100644 --- a/usr.bin/fstat/Makefile +++ b/usr.bin/fstat/Makefile @@ -4,7 +4,7 @@ PROG= fstat SRCS= fstat.c fuser.c main.c LINKS= ${BINDIR}/fstat ${BINDIR}/fuser -DPADD= ${LIBKVM} +DPADD= ${LIBKVM} ${LIBUTIL} ${LIBPROCSTAT} LDADD= -lkvm -lutil -lprocstat MAN1= fuser.1 fstat.1 diff --git a/usr.bin/fstat/fstat.c b/usr.bin/fstat/fstat.c index fe225a04d38..265791d1daa 100644 --- a/usr.bin/fstat/fstat.c +++ b/usr.bin/fstat/fstat.c @@ -244,7 +244,7 @@ print_file_info(struct procstat *procstat, struct filestat *fst, for (d = devs; d != NULL; d = d->next) if (d->fsid == vn.vn_fsid) { fsmatch = 1; - if ((unsigned)d->ino == vn.vn_fileid) { + if (d->ino == vn.vn_fileid) { filename = d->name; break; } diff --git a/usr.bin/gprof/gprof.1 b/usr.bin/gprof/gprof.1 index 339e5c86da7..98fd7291496 100644 --- a/usr.bin/gprof/gprof.1 +++ b/usr.bin/gprof/gprof.1 @@ -73,7 +73,7 @@ compiler or linker you can use instead of .Fl l Ns Ar c . Read the given object file (the default is -.Pa a.out) +.Pa a.out ) and establishes the relation between its symbol table and the call graph profile. The default graph profile file name is the name diff --git a/usr.bin/gprof/lookup.c b/usr.bin/gprof/lookup.c index 0f3b76301ab..256136090db 100644 --- a/usr.bin/gprof/lookup.c +++ b/usr.bin/gprof/lookup.c @@ -66,6 +66,12 @@ nllookup( address ) printf( "[nllookup] %d (%d) probes\n" , probes , nname-1 ); } # endif /* DEBUG */ +#if defined(__arm__) + if (nl[middle].name[0] == '$' && + nl[middle-1].value == nl[middle].value) + middle--; +#endif + return &nl[ middle ]; } if ( nl[ middle ].value > address ) { diff --git a/usr.bin/gzip/zmore.1 b/usr.bin/gzip/zmore.1 index 1235d40fcf6..b1f389c98c2 100644 --- a/usr.bin/gzip/zmore.1 +++ b/usr.bin/gzip/zmore.1 @@ -20,7 +20,7 @@ .\" Materiel Command, USAF, under agreement number F39502-99-1-0512. .\" .\" $FreeBSD$ -.Dd February 06, 2011 +.Dd February 6, 2011 .Dt ZMORE 1 .Os .Sh NAME diff --git a/usr.bin/ipcrm/ipcrm.1 b/usr.bin/ipcrm/ipcrm.1 index 2d26335146d..f70eab684e0 100644 --- a/usr.bin/ipcrm/ipcrm.1 +++ b/usr.bin/ipcrm/ipcrm.1 @@ -112,7 +112,7 @@ If the identifier or the key is -1, it will remove all these objects. .Xr ipcs 1 .Sh HISTORY The wiping of all System V IPC objects was first implemented in -.Fx 6.4 and 7.1. +.Fx 6.4 No and 7.1. .Sh AUTHORS The original author was Adam Glass. The wiping of all System V IPC objects was thought up by Callum diff --git a/usr.bin/kdump/kdump.1 b/usr.bin/kdump/kdump.1 index 0b4bcf480b1..f8e87e410ac 100644 --- a/usr.bin/kdump/kdump.1 +++ b/usr.bin/kdump/kdump.1 @@ -28,7 +28,7 @@ .\" @(#)kdump.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd April 20, 2012 +.Dd June 4, 2012 .Dt KDUMP 1 .Os .Sh NAME @@ -86,9 +86,9 @@ string. Suppressing this feature yields a more consistent output format and is easily amenable to further processing. .It Fl p Ar pid -Display only trace events that correspond to the process +Display only trace events that correspond to the process or thread .Ar pid . -This may be useful when there are multiple processes recorded in the +This may be useful when there are multiple processes or threads recorded in the same trace file. .It Fl R Display relative timestamps (time since previous entry). diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c index 57f5ce2ab0e..44ee14e274b 100644 --- a/usr.bin/kdump/kdump.c +++ b/usr.bin/kdump/kdump.c @@ -251,7 +251,8 @@ main(int argc, char *argv[]) } } if (trpoints & (1<" print "#include " print "#include " + print "#include " + print "#include " print "" print ioctl_includes print "" diff --git a/usr.bin/killall/killall.1 b/usr.bin/killall/killall.1 index 45298312c91..7beaadb56fd 100644 --- a/usr.bin/killall/killall.1 +++ b/usr.bin/killall/killall.1 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 25, 2009 +.Dd June 27, 2012 .Dt KILLALL 1 .Os .Sh NAME @@ -34,6 +34,7 @@ .Nm .Op Fl delmsvz .Op Fl help +.Op Fl I .Op Fl j Ar jail .Op Fl u Ar user .Op Fl t Ar tty @@ -71,6 +72,9 @@ processes specified with the option. .It Fl help Give a help on the command usage and exit. +.It Fl I +Request confirmation before attempting to signal each +process. .It Fl l List the names of the available signals and exit, like in .Xr kill 1 . diff --git a/usr.bin/killall/killall.c b/usr.bin/killall/killall.c index 28496a001e7..83e829ac1c6 100644 --- a/usr.bin/killall/killall.c +++ b/usr.bin/killall/killall.c @@ -53,7 +53,7 @@ static void __dead2 usage(void) { - fprintf(stderr, "usage: killall [-delmsvz] [-help] [-j jail]\n"); + fprintf(stderr, "usage: killall [-delmsvz] [-help] [-I] [-j jail]\n"); fprintf(stderr, " [-u user] [-t tty] [-c cmd] [-SIGNAL] [cmd]...\n"); fprintf(stderr, "At least one option or argument to specify processes must be given.\n"); @@ -90,13 +90,14 @@ nosig(char *name) int main(int ac, char **av) { - struct kinfo_proc *procs = NULL, *newprocs; + struct kinfo_proc *procs, *newprocs; struct stat sb; struct passwd *pw; regex_t rgx; regmatch_t pmatch; - int i, j; + int i, j, ch; char buf[256]; + char first; char *user = NULL; char *tty = NULL; char *cmd = NULL; @@ -104,6 +105,7 @@ main(int ac, char **av) int sflag = 0; int dflag = 0; int eflag = 0; + int Iflag = 0; int jflag = 0; int mflag = 0; int zflag = 0; @@ -141,6 +143,9 @@ main(int ac, char **av) if (**av == '-') { ++*av; switch (**av) { + case 'I': + Iflag = 1; + break; case 'j': ++*av; if (**av == '\0') { @@ -273,9 +278,6 @@ main(int ac, char **av) size = 0; mib[0] = CTL_KERN; mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PROC; - mib[3] = 0; - miblen = 3; if (user) { mib[2] = eflag ? KERN_PROC_UID : KERN_PROC_RUID; @@ -285,16 +287,20 @@ main(int ac, char **av) mib[2] = KERN_PROC_TTY; mib[3] = tdev; miblen = 4; + } else { + mib[2] = KERN_PROC_PROC; + mib[3] = 0; + miblen = 3; } + procs = NULL; st = sysctl(mib, miblen, NULL, &size, NULL, 0); do { size += size / 10; newprocs = realloc(procs, size); - if (newprocs == 0) { - if (procs) - free(procs); - errx(1, "could not reallocate memory"); + if (newprocs == NULL) { + free(procs); + err(1, "could not reallocate memory"); } procs = newprocs; st = sysctl(mib, miblen, procs, &size, NULL, 0); @@ -304,7 +310,7 @@ main(int ac, char **av) if (size % sizeof(struct kinfo_proc) != 0) { fprintf(stderr, "proc size mismatch (%zu total, %zu chunks)\n", size, sizeof(struct kinfo_proc)); - fprintf(stderr, "userland out of sync with kernel, recompile libkvm etc\n"); + fprintf(stderr, "userland out of sync with kernel\n"); exit(1); } nprocs = size / sizeof(struct kinfo_proc); @@ -313,7 +319,7 @@ main(int ac, char **av) mypid = getpid(); for (i = 0; i < nprocs; i++) { - if ((procs[i].ki_stat & SZOMB) == SZOMB && !zflag) + if (procs[i].ki_stat == SZOMB && !zflag) continue; thispid = procs[i].ki_pid; strlcpy(thiscmd, procs[i].ki_comm, sizeof(thiscmd)); @@ -382,6 +388,16 @@ main(int ac, char **av) if (matched) break; } + if (matched != 0 && Iflag) { + printf("Send signal %d to %s (pid %d uid %d)? ", + sig, thiscmd, thispid, thisuid); + fflush(stdout); + first = ch = getchar(); + while (ch != '\n' && ch != EOF) + ch = getchar(); + if (first != 'y' && first != 'Y') + matched = 0; + } if (matched == 0) continue; if (dflag) diff --git a/usr.bin/ktrace/ktrace.1 b/usr.bin/ktrace/ktrace.1 index 28a5f7ad21f..1170ae8c175 100644 --- a/usr.bin/ktrace/ktrace.1 +++ b/usr.bin/ktrace/ktrace.1 @@ -28,7 +28,7 @@ .\" @(#)ktrace.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd April 5, 2012 +.Dd May 31, 2012 .Dt KTRACE 1 .Os .Sh NAME @@ -131,7 +131,7 @@ trace requests .It Cm + trace the default set of trace points - -.Cm c , f , i , n , p , s , t , u , y +.Cm c , i , n , p , s , t , u , y .El .It Ar command Execute diff --git a/usr.bin/ktrace/ktrace.h b/usr.bin/ktrace/ktrace.h index 220eb83625a..26ac11439c2 100644 --- a/usr.bin/ktrace/ktrace.h +++ b/usr.bin/ktrace/ktrace.h @@ -32,12 +32,12 @@ #define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \ KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER | \ - KTRFAC_STRUCT | KTRFAC_SYSCTL | KTRFAC_CAPFAIL | \ - KTRFAC_FAULT | KTRFAC_FAULTEND) + KTRFAC_STRUCT | KTRFAC_SYSCTL | KTRFAC_CAPFAIL) #define PROC_ABI_POINTS (KTRFAC_PROCCTOR | KTRFAC_PROCDTOR) -#define ALL_POINTS (DEF_POINTS | KTRFAC_CSW | PROC_ABI_POINTS) +#define ALL_POINTS (DEF_POINTS | KTRFAC_CSW | PROC_ABI_POINTS | \ + KTRFAC_FAULT | KTRFAC_FAULTEND) #define DEF_TRACEFILE "ktrace.out" diff --git a/usr.bin/lastcomm/lastcomm.1 b/usr.bin/lastcomm/lastcomm.1 index 77a49abecb1..10ee896c018 100644 --- a/usr.bin/lastcomm/lastcomm.1 +++ b/usr.bin/lastcomm/lastcomm.1 @@ -28,7 +28,7 @@ .\" From: @(#)lastcomm.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd May 14, 2007 +.Dd May 17, 2012 .Dt LASTCOMM 1 .Os .Sh NAME @@ -38,6 +38,7 @@ .Nm .Op Fl EScesu .Op Fl f Ar file +.Op Cm + Ns Ar format .Op Ar command ...\& .Op Ar user ...\& .Op Ar terminal ...\& @@ -77,6 +78,15 @@ is a single dash reads accounting entries from the standard input. .El .Pp +An operand with a leading plus sign +.Pq Sq + +is followed a user-defined format string which specifies the format +in which to display the process's start or exit date and time. +The format string may contain any of the conversion specifications +described in the +.Xr strftime 3 +manual page, as well as arbitrary text. +.Pp If no options are specified, .Fl cS is assumed. @@ -165,6 +175,7 @@ will print details of each terminating command. .Sh SEE ALSO .Xr last 1 , .Xr sigaction 2 , +.Xr strftime 3 , .Xr acct 5 , .Xr core 5 .Sh HISTORY diff --git a/usr.bin/lastcomm/lastcomm.c b/usr.bin/lastcomm/lastcomm.c index e140c703cdc..b2a0f0f3ffa 100644 --- a/usr.bin/lastcomm/lastcomm.c +++ b/usr.bin/lastcomm/lastcomm.c @@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include "pathnames.h" @@ -82,10 +83,12 @@ main(int argc, char *argv[]) int (*readrec)(FILE *f, struct acctv2 *av2); time_t t; int ch, rv; - const char *acctfile; + const char *acctfile, *format; + char buf[1024]; int flags = 0; acctfile = _PATH_ACCT; + format = NULL; while ((ch = getopt(argc, argv, "f:usecSE")) != -1) switch((char)ch) { case 'f': @@ -126,6 +129,12 @@ main(int argc, char *argv[]) argc -= optind; argv += optind; + if (argc > 0 && **argv == '+') { + format = *argv + 1; /* skip + */ + argc--; + argv++; + } + if (strcmp(acctfile, "-") == 0) { fp = stdin; readrec = readrec_forward; @@ -177,14 +186,24 @@ main(int argc, char *argv[]) /* starting time */ if (flags & AC_BTIME) { - (void)printf(" %.16s", ctime(&ab.ac_btime)); + if (format != NULL) { + (void)strftime(buf, sizeof(buf), format, + localtime(&ab.ac_btime)); + (void)printf(" %s", buf); + } else + (void)printf(" %.16s", ctime(&ab.ac_btime)); } /* exit time (starting time + elapsed time )*/ if (flags & AC_FTIME) { t = ab.ac_btime; t += (time_t)(ab.ac_etime / 1000000); - (void)printf(" %.16s", ctime(&t)); + if (format != NULL) { + (void)strftime(buf, sizeof(buf), format, + localtime(&t)); + (void)printf(" %s", buf); + } else + (void)printf(" %.16s", ctime(&t)); } printf("\n"); } @@ -250,6 +269,7 @@ static void usage(void) { (void)fprintf(stderr, -"usage: lastcomm [-EScesu] [-f file] [command ...] [user ...] [terminal ...]\n"); + "usage: lastcomm [-EScesu] [-f file] [+format] [command ...] " + "[user ...] [terminal ...]\n"); exit(1); } diff --git a/usr.bin/less/defines.h b/usr.bin/less/defines.h index e9ee8c673f0..fe8f1bcd49c 100644 --- a/usr.bin/less/defines.h +++ b/usr.bin/less/defines.h @@ -227,18 +227,12 @@ /* Define to 1 if you have the `fsync' function. */ #define HAVE_FSYNC 1 +/* GNU regex library */ +/* #undef HAVE_GNU_REGEX */ + /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 -/* Define to 1 if you have the `gen' library (-lgen). */ -/* #undef HAVE_LIBGEN */ - -/* Define to 1 if you have the `intl' library (-lintl). */ -/* #undef HAVE_LIBINTL */ - -/* Define to 1 if you have the `PW' library (-lPW). */ -/* #undef HAVE_LIBPW */ - /* Define to 1 if you have the header file. */ #define HAVE_LIMITS_H 1 diff --git a/usr.bin/lex/lex.1 b/usr.bin/lex/lex.1 index 38eecf1126d..c47fbb05306 100644 --- a/usr.bin/lex/lex.1 +++ b/usr.bin/lex/lex.1 @@ -2247,8 +2247,7 @@ automatically anyway. .TP .B \-F specifies that the -.ul -fast +.I fast scanner table representation should be used (and stdio bypassed). This representation is about as fast as the full table representation diff --git a/usr.bin/limits/limits.1 b/usr.bin/limits/limits.1 index 3ec48454557..26e8929374f 100644 --- a/usr.bin/limits/limits.1 +++ b/usr.bin/limits/limits.1 @@ -19,7 +19,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 23, 2011 +.Dd January 23, 2012 .Dt LIMITS 1 .Os .Sh NAME @@ -179,7 +179,7 @@ limits are affected until overridden later with either the or .Fl H options. -.Fl e +.It Fl e Select .Dq "eval mode" formatting for output. diff --git a/usr.bin/login/login.1 b/usr.bin/login/login.1 index d80783db05f..a1a283a33ff 100644 --- a/usr.bin/login/login.1 +++ b/usr.bin/login/login.1 @@ -137,8 +137,6 @@ message-of-the-day system mailboxes .It Pa \&.hushlogin makes login quieter -.It Pa /etc/auth.conf -configure authentication services .It Pa /etc/pam.d/login .Xr pam 8 configuration file diff --git a/usr.bin/m4/parser.y b/usr.bin/m4/parser.y index deda9625547..14959738bdf 100644 --- a/usr.bin/m4/parser.y +++ b/usr.bin/m4/parser.y @@ -17,13 +17,12 @@ * * $FreeBSD$ */ -#include #include +#include #define YYSTYPE int32_t extern int32_t end_result; extern int yylex(void); extern int yyerror(const char *); -extern int yyparse(void); %} %token NUMBER %token ERROR @@ -35,9 +34,9 @@ extern int yyparse(void); %left EQ NE %left '<' LE '>' GE %left LSHIFT RSHIFT -%right EXPONENT %left '+' '-' %left '*' '/' '%' +%right EXPONENT %right UMINUS UPLUS '!' '~' %% diff --git a/usr.bin/mail/popen.c b/usr.bin/mail/popen.c index 18bf7e5a3aa..c4d17461e48 100644 --- a/usr.bin/mail/popen.c +++ b/usr.bin/mail/popen.c @@ -336,12 +336,14 @@ int wait_child(int pid) { sigset_t nset, oset; - struct child *cp = findchild(pid); + struct child *cp; (void)sigemptyset(&nset); (void)sigaddset(&nset, SIGCHLD); (void)sigprocmask(SIG_BLOCK, &nset, &oset); + cp = findchild(pid); + while (!cp->done) (void)sigsuspend(&oset); wait_status = cp->status; diff --git a/usr.bin/make/Makefile b/usr.bin/make/Makefile index 2dc7e583d6b..5442eaa1652 100644 --- a/usr.bin/make/Makefile +++ b/usr.bin/make/Makefile @@ -2,16 +2,20 @@ # $Id: Makefile,v 1.6 1994/06/30 05:33:39 cgd Exp $ # $FreeBSD$ +.include + PROG= make CFLAGS+=-I${.CURDIR} SRCS= arch.c buf.c cond.c dir.c for.c hash.c hash_tables.c job.c \ lst.c main.c make.c parse.c proc.c shell.c str.c suff.c targ.c \ util.c var.c +.if !defined(MK_SHARED_TOOLCHAIN) || ${MK_SHARED_TOOLCHAIN} == "no" NO_SHARED?= YES +.endif # Version has the RYYYYMMDDX format, where R is from RELENG_ -CFLAGS+=-DMAKE_VERSION=\"5201111300\" +CFLAGS+=-DMAKE_VERSION=\"10201205300\" # There is no obvious performance improvement currently. # CFLAGS+=-DUSE_KQUEUE diff --git a/usr.bin/make/make.1 b/usr.bin/make/make.1 index d36a43c6cf6..0495ca7176f 100644 --- a/usr.bin/make/make.1 +++ b/usr.bin/make/make.1 @@ -32,7 +32,7 @@ .\" @(#)make.1 8.8 (Berkeley) 6/13/95 .\" $FreeBSD$ .\" -.Dd November 5, 2011 +.Dd May 30, 2012 .Dt MAKE 1 .Os .Sh NAME @@ -320,6 +320,11 @@ Do not build any targets. Multiple instances of this option may be specified; the variables will be printed one per line, with a blank line for each null or undefined variable. +If +.Ar variable +contains a +.Sq Ic $ +then the value will be expanded before printing. .It Fl v Be extra verbose. Print any extra information. @@ -902,6 +907,7 @@ Replaces each word in the variable with its suffix. Replaces each word in the variable with everything but the last component. .It Cm :L Converts variable to lower-case letters. +(deprecated) .It Cm :M Ns Ar pattern Select only those words that match the rest of the modifier. The standard shell wildcard characters @@ -993,8 +999,13 @@ to be replaced in .Ar new_string . .It Cm :T Replaces each word in the variable with its last component. +.It Cm :tl +Converts variable to lower-case letters. +.It Cm :tu +Converts variable to upper-case letters. .It Cm :U Converts variable to upper-case letters. +(deprecated) .It Cm :u Remove adjacent duplicate words (like .Xr uniq 1 ) . @@ -1661,7 +1672,7 @@ To prevent infinite loops the following source Makefile targets are ignored: .Ic :: targets that have no prerequisites .It -.Ic ! +.Ic \&! targets .It targets that have @@ -1742,6 +1753,19 @@ is set to the same value as .Va .MAKE ; support for this may be removed in the future. .Pp +The use of the +.Cm :L +and +.Cm :U +modifiers are deprecated +in +.Fx 10.0 +and the more portable (among Pmake decedents) +.Cm :tl +and +.Cm :tu +should be used instead. +.Pp Most of the more esoteric features of .Nm should probably be avoided for greater compatibility. diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c index a7babaf259e..477c4a906bc 100644 --- a/usr.bin/make/var.c +++ b/usr.bin/make/var.c @@ -1746,6 +1746,19 @@ ParseModifier(VarParser *vp, char startc, Var *v, Boolean *freeResult) case 'C': newStr = modifier_C(vp, value, v); break; + case 't': + /* :tl :tu for OSF ODE & NetBSD make compatibility */ + switch (vp->ptr[1]) { + case 'l': + vp->ptr++; + goto mod_lower; + break; + case 'u': + vp->ptr++; + goto mod_upper; + break; + } + /* FALLTHROUGH */ default: if (vp->ptr[1] != endc && vp->ptr[1] != ':') { #ifdef SUNSHCMD @@ -1774,6 +1787,7 @@ ParseModifier(VarParser *vp, char startc, Var *v, Boolean *freeResult) switch (vp->ptr[0]) { case 'L': + mod_lower: { const char *cp; Buffer *buf; @@ -1799,6 +1813,7 @@ ParseModifier(VarParser *vp, char startc, Var *v, Boolean *freeResult) vp->ptr++; break; case 'U': + mod_upper: { const char *cp; Buffer *buf; @@ -2578,7 +2593,7 @@ void Var_Print(Lst *vlist, Boolean expandVars) { LstNode *n; - const char *name; + char *name; LST_FOREACH(n, vlist) { name = Lst_Datum(n); @@ -2586,13 +2601,17 @@ Var_Print(Lst *vlist, Boolean expandVars) char *value; char *v; - v = emalloc(strlen(name) + 1 + 3); - sprintf(v, "${%s}", name); - + if (*name == '$') { + v = name; + } else { + v = emalloc(strlen(name) + 1 + 3); + sprintf(v, "${%s}", name); + } value = Buf_Peel(Var_Subst(v, VAR_GLOBAL, FALSE)); printf("%s\n", value); - free(v); + if (v != name) + free(v); free(value); } else { const char *value = Var_Value(name, VAR_GLOBAL); diff --git a/usr.bin/makewhatis/makewhatis.c b/usr.bin/makewhatis/makewhatis.c index f2ae3709d6d..45abc8f1a73 100644 --- a/usr.bin/makewhatis/makewhatis.c +++ b/usr.bin/makewhatis/makewhatis.c @@ -693,7 +693,7 @@ enum { STATE_UNKNOWN, STATE_MANSTYLE, STATE_MDOCNAME, STATE_MDOCDESC }; static void process_page(struct page_info *page, char *section_dir) { - gzFile *in; + gzFile in; char buffer[4096]; char *line; StringList *names; diff --git a/usr.bin/man/man.conf.5 b/usr.bin/man/man.conf.5 index a7db8499f3a..f30a1c0f836 100644 --- a/usr.bin/man/man.conf.5 +++ b/usr.bin/man/man.conf.5 @@ -57,7 +57,7 @@ system for extending the manual set to support additional paths and locales. is intended to be used by the local administrator to set additional policy. .Pp Currently supported configuration variables include: -.Bl -tag -offset indent +.Bl -tag -width 12n -offset indent .It MANCONFIG Overrides the default location to import additional manual configuration files. Defaults to @@ -70,7 +70,8 @@ Indicates support is available for the given locale. .Pp For pages in a given language, overriding the default toolset for display is supported via the following definitions: -.Bl -tag -offset indent -compact +.Pp +.Bl -tag -width 12n -offset indent -compact .It EQN Ns _ Ns Va LANG .It NROFF Ns _ Ns Va LANG .It PIC Ns _ Ns Va LANG @@ -87,7 +88,7 @@ section for how to use these variables. The parser used for this utility is very basic and only supports comment characters (#) at the beginning of a line. .Sh FILES -.Bl -tag -compact +.Bl -tag -width "Pa /usr/local/etc/man.d/*.conf" -compact .It Pa /etc/man.conf System configuration file. .It Pa /usr/local/etc/man.d/*.conf diff --git a/usr.bin/minigzip/Makefile b/usr.bin/minigzip/Makefile index 21b09240844..b2cfc46f577 100644 --- a/usr.bin/minigzip/Makefile +++ b/usr.bin/minigzip/Makefile @@ -1,6 +1,6 @@ # $FreeBSD$ -SRCDIR= ${.CURDIR}/../../lib/libz +SRCDIR= ${.CURDIR}/../../lib/libz/test .PATH: ${SRCDIR} PROG= minigzip diff --git a/usr.bin/minigzip/minigzip.1 b/usr.bin/minigzip/minigzip.1 index ddd2b957a6b..754e98f84c3 100644 --- a/usr.bin/minigzip/minigzip.1 +++ b/usr.bin/minigzip/minigzip.1 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 3, 2002 +.Dd May 22, 2012 .Dt MINIGZIP 1 .Os .Sh NAME @@ -48,7 +48,7 @@ output. The default operation is compression, decompression can be selected by supplying the .Fl d -flag on the commandline. +flag on the command line. .Pp If any .Ar file diff --git a/usr.bin/mkcsmapper/ldef.h b/usr.bin/mkcsmapper/ldef.h index d0adf9a38b1..70c31225d9a 100644 --- a/usr.bin/mkcsmapper/ldef.h +++ b/usr.bin/mkcsmapper/ldef.h @@ -39,4 +39,3 @@ extern int debug; extern int line_number; extern int yyerror(const char *); extern int yylex(void); -extern int yyparse(void); diff --git a/usr.bin/mkcsmapper/lex.l b/usr.bin/mkcsmapper/lex.l index dd46caf5b43..1b87cc0fc01 100644 --- a/usr.bin/mkcsmapper/lex.l +++ b/usr.bin/mkcsmapper/lex.l @@ -57,7 +57,7 @@ int line_number = 1; [\n] { line_number++; } . { } <> { - yyerror("unexpected file end (unterminate comment)\n"); + yyerror("unexpected file end (unterminated comment)\n"); exit(1); } diff --git a/usr.bin/mkesdb/ldef.h b/usr.bin/mkesdb/ldef.h index a14277cc587..0c5e76a25b1 100644 --- a/usr.bin/mkesdb/ldef.h +++ b/usr.bin/mkesdb/ldef.h @@ -30,7 +30,6 @@ extern int line_number; extern int yyerror(const char *); extern int yylex(void); -extern int yyparse(void); struct named_csid { STAILQ_ENTRY(named_csid) ci_entry; diff --git a/usr.bin/mkesdb/lex.l b/usr.bin/mkesdb/lex.l index 033897a9561..7d83e1d5ce3 100644 --- a/usr.bin/mkesdb/lex.l +++ b/usr.bin/mkesdb/lex.l @@ -59,7 +59,7 @@ int line_number = 1; [\n] { line_number++; } . { } <> { - yyerror("unexpected file end (unterminate comment)\n"); + yyerror("unexpected file end (unterminated comment)\n"); exit(1); } diff --git a/usr.bin/mklocale/extern.h b/usr.bin/mklocale/extern.h index c5b70802928..60268cc9085 100644 --- a/usr.bin/mklocale/extern.h +++ b/usr.bin/mklocale/extern.h @@ -33,4 +33,3 @@ */ int yylex(void); -int yyparse(void); diff --git a/usr.bin/mklocale/mklocale.1 b/usr.bin/mklocale/mklocale.1 index c497fa904c1..ceab25a014a 100644 --- a/usr.bin/mklocale/mklocale.1 +++ b/usr.bin/mklocale/mklocale.1 @@ -123,7 +123,7 @@ All are equivalent. .It Dv ">\|\^)\|]" Used to end a mapping. All are equivalent. -.It Dv : +.It Dv ":" Used as a delimiter in mappings. .El .El diff --git a/usr.bin/ncplogin/ncplogout.1 b/usr.bin/ncplogin/ncplogout.1 index bc220a7cf33..14acaf5a891 100644 --- a/usr.bin/ncplogin/ncplogout.1 +++ b/usr.bin/ncplogin/ncplogout.1 @@ -30,7 +30,7 @@ The options are: .Bl -tag -width indent .It Fl S Ar server Specify the name of the -.Tn Netware +.Tn NetWare server to which the connection should be terminated. Can be omitted if there is only one connection active. diff --git a/usr.bin/netstat/inet.c b/usr.bin/netstat/inet.c index 50d2bdd9811..9d8c97e332f 100644 --- a/usr.bin/netstat/inet.c +++ b/usr.bin/netstat/inet.c @@ -461,7 +461,10 @@ protopr(u_long off, const char *name, int af1, int proto) #endif vchar = ((inp->inp_vflag & INP_IPV4) != 0) ? "4 " : " "; - printf("%-3.3s%-2.2s ", name, vchar); + if (istcp && (tp->t_flags & TF_TOE) != 0) + printf("%-3.3s%-2.2s ", "toe", vchar); + else + printf("%-3.3s%-2.2s ", name, vchar); if (Lflag) { char buf1[15]; diff --git a/usr.bin/pamtest/Makefile b/usr.bin/pamtest/Makefile new file mode 100644 index 00000000000..196830070de --- /dev/null +++ b/usr.bin/pamtest/Makefile @@ -0,0 +1,11 @@ +# $FreeBSD$ + +OPENPAM= ${.CURDIR}/../../contrib/openpam +.PATH: ${OPENPAM}/include ${OPENPAM}/bin/pamtest + +PROG= pamtest +SRCS= pamtest.c +DPADD= ${LIBPAM} +LDADD= ${MINUSLPAM} + +.include diff --git a/usr.bin/passwd/passwd.1 b/usr.bin/passwd/passwd.1 index da540cac4a8..dbb5a4d0a45 100644 --- a/usr.bin/passwd/passwd.1 +++ b/usr.bin/passwd/passwd.1 @@ -221,8 +221,6 @@ a Version 7 format password file temporary copy of the password file .It Pa /etc/login.conf login class capabilities database -.It Pa /etc/auth.conf -configure authentication services .El .Sh SEE ALSO .Xr chpass 1 , diff --git a/usr.bin/procstat/Makefile b/usr.bin/procstat/Makefile index 76c6fa3639a..505523e94d5 100644 --- a/usr.bin/procstat/Makefile +++ b/usr.bin/procstat/Makefile @@ -16,6 +16,6 @@ SRCS= procstat.c \ procstat_vm.c LDADD+= -lutil -lprocstat -lkvm -DPADD+= ${LIBUTIL} +DPADD+= ${LIBUTIL} ${LIBPROCSTAT} ${LIBKVM} .include diff --git a/usr.bin/procstat/procstat_rlimit.c b/usr.bin/procstat/procstat_rlimit.c index c5429c4dde9..68230e5abee 100644 --- a/usr.bin/procstat/procstat_rlimit.c +++ b/usr.bin/procstat/procstat_rlimit.c @@ -66,8 +66,8 @@ static struct { #error "Resource limits have grown. Add new entries to rlimit_param[]." #endif -static -const char *humanize_rlimit(int indx, rlim_t limit) +static const char * +humanize_rlimit(int indx, rlim_t limit) { static char buf[14]; int scale; diff --git a/usr.bin/rlogin/rlogin.1 b/usr.bin/rlogin/rlogin.1 index f98fa24acbb..8aea6bd7bdd 100644 --- a/usr.bin/rlogin/rlogin.1 +++ b/usr.bin/rlogin/rlogin.1 @@ -128,7 +128,6 @@ Determines the user's terminal type. .Bl -tag -width /etc/hosts -compact .It Pa /etc/hosts .It Pa /etc/hosts.equiv -.It Pa /etc/auth.conf .It Ev $HOME Ns Pa /.rhosts .El .Sh SEE ALSO @@ -138,7 +137,6 @@ Determines the user's terminal type. .Xr setsockopt 2 , .Xr ruserok 3 , .Xr tty 4 , -.Xr auth.conf 5 , .Xr hosts 5 , .Xr hosts.equiv 5 , .Xr rlogind 8 , diff --git a/usr.bin/rsh/rsh.1 b/usr.bin/rsh/rsh.1 index 6dbb90e517a..7cc64d2b571 100644 --- a/usr.bin/rsh/rsh.1 +++ b/usr.bin/rsh/rsh.1 @@ -125,14 +125,12 @@ to .Sh FILES .Bl -tag -width /etc/hosts -compact .It Pa /etc/hosts -.It Pa /etc/auth.conf .El .Sh SEE ALSO .Xr rlogin 1 , .Xr setsockopt 2 , .Xr rcmd 3 , .Xr ruserok 3 , -.Xr auth.conf 5 , .Xr hosts 5 , .Xr hosts.equiv 5 , .Xr rlogind 8 , diff --git a/usr.bin/sockstat/sockstat.1 b/usr.bin/sockstat/sockstat.1 index f38d9d725d0..8f744ed135a 100644 --- a/usr.bin/sockstat/sockstat.1 +++ b/usr.bin/sockstat/sockstat.1 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 24, 2012 +.Dd May 16, 2012 .Dt SOCKSTAT 1 .Os .Sh NAME @@ -36,6 +36,7 @@ .Sh SYNOPSIS .Nm .Op Fl 46cLlu +.Op Fl j Ar jid .Op Fl p Ar ports .Op Fl P Ar protocols .Sh DESCRIPTION @@ -57,6 +58,8 @@ Show (IPv6) sockets. .It Fl c Show connected sockets. +.It Fl j Ar jid +Show only sockets belonging to the specified jail ID. .It Fl L Only show Internet sockets if the local or foreign addresses are not in the loopback network prefix diff --git a/usr.bin/sockstat/sockstat.c b/usr.bin/sockstat/sockstat.c index 0114cc47822..c80c8335168 100644 --- a/usr.bin/sockstat/sockstat.c +++ b/usr.bin/sockstat/sockstat.c @@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$"); static int opt_4; /* Show IPv4 sockets */ static int opt_6; /* Show IPv6 sockets */ static int opt_c; /* Show connected sockets */ +static int opt_j; /* Show specified jail */ static int opt_L; /* Don't show IPv4 or IPv6 loopback sockets */ static int opt_l; /* Show listening sockets */ static int opt_u; /* Show Unix domain sockets */ @@ -324,6 +325,7 @@ gather_inet(int proto) } inp = &xtp->xt_inp; so = &xtp->xt_socket; + protoname = xtp->xt_tp.t_flags & TF_TOE ? "toe" : "tcp"; break; case IPPROTO_UDP: case IPPROTO_DIVERT: @@ -548,6 +550,27 @@ getprocname(pid_t pid) return (proc.ki_comm); } +static int +getprocjid(pid_t pid) +{ + static struct kinfo_proc proc; + size_t len; + int mib[4]; + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = (int)pid; + len = sizeof proc; + if (sysctl(mib, 4, &proc, &len, NULL, 0) == -1) { + /* Do not warn if the process exits before we get its jid. */ + if (errno != ESRCH) + warn("sysctl()"); + return (-1); + } + return (proc.ki_jid); +} + static int check_ports(struct sock *s) { @@ -643,6 +666,8 @@ display(void) for (xf = xfiles, n = 0; n < nxfiles; ++n, ++xf) { if (xf->xf_data == NULL) continue; + if (opt_j >= 0 && opt_j != getprocjid(xf->xf_pid)) + continue; hash = (int)((uintptr_t)xf->xf_data % HASHSIZE); for (s = sockhash[hash]; s != NULL; s = s->next) if ((void *)s->socket == xf->xf_data) @@ -668,6 +693,8 @@ display(void) pos += xprintf("%d ", xf->xf_fd); displaysock(s, pos); } + if (opt_j >= 0) + return; for (hash = 0; hash < HASHSIZE; hash++) { for (s = sockhash[hash]; s != NULL; s = s->next) { if (s->shown) @@ -706,7 +733,7 @@ static void usage(void) { fprintf(stderr, - "Usage: sockstat [-46cLlu] [-p ports] [-P protocols]\n"); + "Usage: sockstat [-46cLlu] [-j jid] [-p ports] [-P protocols]\n"); exit(1); } @@ -716,7 +743,8 @@ main(int argc, char *argv[]) int protos_defined = -1; int o, i; - while ((o = getopt(argc, argv, "46cLlp:P:uv")) != -1) + opt_j = -1; + while ((o = getopt(argc, argv, "46cj:Llp:P:uv")) != -1) switch (o) { case '4': opt_4 = 1; @@ -727,6 +755,9 @@ main(int argc, char *argv[]) case 'c': opt_c = 1; break; + case 'j': + opt_j = atoi(optarg); + break; case 'L': opt_L = 1; break; diff --git a/usr.bin/sort/Makefile b/usr.bin/sort/Makefile new file mode 100644 index 00000000000..c17f9e30331 --- /dev/null +++ b/usr.bin/sort/Makefile @@ -0,0 +1,45 @@ +# $FreeBSD$ + +.include + +.if ${MK_GNU_SORT} != "yes" +PROG= sort +.else +PROG= bsdsort +CLEANFILES+= bsdsort.1 + +bsdsort.1: sort.1 + cp ${.ALLSRC} ${.TARGET} +.endif + +SRCS= bwstring.c coll.c file.c mem.c radixsort.c sort.c vsort.c + +WARNS= 6 + +sort.1: sort.1.in + /usr/bin/sed ${MAN_SUB} ${.ALLSRC} >${.TARGET} + +CLEANFILES+= sort.1 + +.if defined(WITH_THREADS) +CFLAGS+= -DSORT_THREADS +LDFLAGS+= -lpthread -lmd +MAN_SUB+= -e 's|%%THREADS%%||g' +.else +LDFLAGS+= -lmd +MAN_SUB+= -e 's|%%THREADS%%|\.\\"|g' +.endif + +.if !defined(WITHOUT_NLS) +NLS+= hu_HU.ISO8859-2 +NLSSRCFILES= ${NLS:S@$@.msg@} +MAN_SUB+= -e 's|%%NLS%%||g' +.for lang in ${NLS} +NLSSRCDIR_${lang}= ${.CURDIR}/nls +.endfor +.else +CFLAGS+= -DWITHOUT_NLS +MAN_SUB+= -e 's|%%NLS%%|\.\\"|g' +.endif + +.include diff --git a/usr.bin/sort/bwstring.c b/usr.bin/sort/bwstring.c new file mode 100644 index 00000000000..5733732eac6 --- /dev/null +++ b/usr.bin/sort/bwstring.c @@ -0,0 +1,1154 @@ +/*- + * Copyright (C) 2009 Gabor Kovesdan + * Copyright (C) 2012 Oleg Moskalenko + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bwstring.h" +#include "sort.h" + +bool byte_sort; + +static wchar_t **wmonths; +static unsigned char **cmonths; + +/* initialise months */ + +void +initialise_months(void) +{ + const nl_item item[12] = { ABMON_1, ABMON_2, ABMON_3, ABMON_4, + ABMON_5, ABMON_6, ABMON_7, ABMON_8, ABMON_9, ABMON_10, + ABMON_11, ABMON_12 }; + unsigned char *tmp; + size_t len; + + if (MB_CUR_MAX == 1) { + if (cmonths == NULL) { + unsigned char *m; + + cmonths = sort_malloc(sizeof(unsigned char*) * 12); + for (int i = 0; i < 12; i++) { + cmonths[i] = NULL; + tmp = (unsigned char *) nl_langinfo(item[i]); + if (tmp == NULL) + continue; + if (debug_sort) + printf("month[%d]=%s\n", i, tmp); + len = strlen(tmp); + if (len < 1) + continue; + while (isblank(*tmp)) + ++tmp; + m = sort_malloc(len + 1); + memcpy(m, tmp, len + 1); + m[len] = '\0'; + for (unsigned int j = 0; j < len; j++) + m[j] = toupper(m[j]); + cmonths[i] = m; + } + } + + } else { + if (wmonths == NULL) { + wchar_t *m; + + wmonths = sort_malloc(sizeof(wchar_t *) * 12); + for (int i = 0; i < 12; i++) { + wmonths[i] = NULL; + tmp = (unsigned char *) nl_langinfo(item[i]); + if (tmp == NULL) + continue; + if (debug_sort) + printf("month[%d]=%s\n", i, tmp); + len = strlen(tmp); + if (len < 1) + continue; + while (isblank(*tmp)) + ++tmp; + m = sort_malloc(SIZEOF_WCHAR_STRING(len + 1)); + if (mbstowcs(m, tmp, len) == ((size_t) -1)) + continue; + m[len] = L'\0'; + for (unsigned int j = 0; j < len; j++) + m[j] = towupper(m[j]); + wmonths[i] = m; + } + } + } +} + +/* + * Compare two wide-character strings + */ +static int +wide_str_coll(const wchar_t *s1, const wchar_t *s2) +{ + int ret = 0; + + errno = 0; + ret = wcscoll(s1, s2); + if (errno == EILSEQ) { + errno = 0; + ret = wcscmp(s1, s2); + if (errno != 0) { + for (size_t i = 0; ; ++i) { + wchar_t c1 = s1[i]; + wchar_t c2 = s2[i]; + if (c1 == L'\0') + return ((c2 == L'\0') ? 0 : -1); + if (c2 == L'\0') + return (+1); + if (c1 == c2) + continue; + return ((int)(c1 - c2)); + } + } + } + return (ret); +} + +/* counterparts of wcs functions */ + +void +bwsprintf(FILE *f, struct bwstring *bws, const char *prefix, const char *suffix) +{ + + if (MB_CUR_MAX == 1) + fprintf(f, "%s%s%s", prefix, bws->data.cstr, suffix); + else + fprintf(f, "%s%S%s", prefix, bws->data.wstr, suffix); +} + +const void* bwsrawdata(const struct bwstring *bws) +{ + + return (&(bws->data)); +} + +size_t bwsrawlen(const struct bwstring *bws) +{ + + return ((MB_CUR_MAX == 1) ? bws->len : SIZEOF_WCHAR_STRING(bws->len)); +} + +size_t +bws_memsize(const struct bwstring *bws) +{ + + return ((MB_CUR_MAX == 1) ? (bws->len + 2 + sizeof(struct bwstring)) : + (SIZEOF_WCHAR_STRING(bws->len + 1) + sizeof(struct bwstring))); +} + +void +bws_setlen(struct bwstring *bws, size_t newlen) +{ + + if (bws && newlen != bws->len && newlen <= bws->len) { + bws->len = newlen; + if (MB_CUR_MAX == 1) + bws->data.cstr[newlen] = '\0'; + else + bws->data.wstr[newlen] = L'\0'; + } +} + +/* + * Allocate a new binary string of specified size + */ +struct bwstring * +bwsalloc(size_t sz) +{ + struct bwstring *ret; + + if (MB_CUR_MAX == 1) + ret = sort_malloc(sizeof(struct bwstring) + 1 + sz); + else + ret = sort_malloc(sizeof(struct bwstring) + + SIZEOF_WCHAR_STRING(sz + 1)); + ret->len = sz; + + if (MB_CUR_MAX == 1) + ret->data.cstr[ret->len] = '\0'; + else + ret->data.wstr[ret->len] = L'\0'; + + return (ret); +} + +/* + * Create a copy of binary string. + * New string size equals the length of the old string. + */ +struct bwstring * +bwsdup(const struct bwstring *s) +{ + + if (s == NULL) + return (NULL); + else { + struct bwstring *ret = bwsalloc(s->len); + + if (MB_CUR_MAX == 1) + memcpy(ret->data.cstr, s->data.cstr, (s->len)); + else + memcpy(ret->data.wstr, s->data.wstr, + SIZEOF_WCHAR_STRING(s->len)); + + return (ret); + } +} + +/* + * Create a new binary string from a raw binary buffer. + */ +struct bwstring * +bwssbdup(const wchar_t *str, size_t len) +{ + + if (str == NULL) + return ((len == 0) ? bwsalloc(0) : NULL); + else { + struct bwstring *ret; + + ret = bwsalloc(len); + + if (MB_CUR_MAX == 1) + for (size_t i = 0; i < len; ++i) + ret->data.cstr[i] = (unsigned char) str[i]; + else + memcpy(ret->data.wstr, str, SIZEOF_WCHAR_STRING(len)); + + return (ret); + } +} + +/* + * Create a new binary string from a raw binary buffer. + */ +struct bwstring * +bwscsbdup(const unsigned char *str, size_t len) +{ + struct bwstring *ret; + + ret = bwsalloc(len); + + if (str) { + if (MB_CUR_MAX == 1) + memcpy(ret->data.cstr, str, len); + else { + mbstate_t mbs; + const char *s; + size_t charlen, chars, cptr; + + charlen = chars = 0; + cptr = 0; + s = (const char *) str; + + memset(&mbs, 0, sizeof(mbs)); + + while (cptr < len) { + size_t n = MB_CUR_MAX; + + if (n > len - cptr) + n = len - cptr; + charlen = mbrlen(s + cptr, n, &mbs); + switch (charlen) { + case 0: + /* FALLTHROUGH */ + case (size_t) -1: + /* FALLTHROUGH */ + case (size_t) -2: + ret->data.wstr[chars++] = + (unsigned char) s[cptr]; + ++cptr; + break; + default: + n = mbrtowc(ret->data.wstr + (chars++), + s + cptr, charlen, &mbs); + if ((n == (size_t)-1) || (n == (size_t)-2)) + /* NOTREACHED */ + err(2, "mbrtowc error"); + cptr += charlen; + }; + } + + ret->len = chars; + ret->data.wstr[ret->len] = L'\0'; + } + } + return (ret); +} + +/* + * De-allocate object memory + */ +void +bwsfree(const struct bwstring *s) +{ + + if (s) + sort_free(s); +} + +/* + * Copy content of src binary string to dst. + * If the capacity of the dst string is not sufficient, + * then the data is truncated. + */ +size_t +bwscpy(struct bwstring *dst, const struct bwstring *src) +{ + size_t nums = src->len; + + if (nums > dst->len) + nums = dst->len; + dst->len = nums; + + if (MB_CUR_MAX == 1) { + memcpy(dst->data.cstr, src->data.cstr, nums); + dst->data.cstr[dst->len] = '\0'; + } else { + memcpy(dst->data.wstr, src->data.wstr, + SIZEOF_WCHAR_STRING(nums + 1)); + dst->data.wstr[dst->len] = L'\0'; + } + + return (nums); +} + +/* + * Copy content of src binary string to dst, + * with specified number of symbols to be copied. + * If the capacity of the dst string is not sufficient, + * then the data is truncated. + */ +struct bwstring * +bwsncpy(struct bwstring *dst, const struct bwstring *src, size_t size) +{ + size_t nums = src->len; + + if (nums > dst->len) + nums = dst->len; + if (nums > size) + nums = size; + dst->len = nums; + + if (MB_CUR_MAX == 1) { + memcpy(dst->data.cstr, src->data.cstr, nums); + dst->data.cstr[dst->len] = '\0'; + } else { + memcpy(dst->data.wstr, src->data.wstr, + SIZEOF_WCHAR_STRING(nums + 1)); + dst->data.wstr[dst->len] = L'\0'; + } + + return (dst); +} + +/* + * Copy content of src binary string to dst, + * with specified number of symbols to be copied. + * An offset value can be specified, from the start of src string. + * If the capacity of the dst string is not sufficient, + * then the data is truncated. + */ +struct bwstring * +bwsnocpy(struct bwstring *dst, const struct bwstring *src, size_t offset, + size_t size) +{ + + if (offset >= src->len) { + dst->data.wstr[0] = 0; + dst->len = 0; + } else { + size_t nums = src->len - offset; + + if (nums > dst->len) + nums = dst->len; + if (nums > size) + nums = size; + dst->len = nums; + if (MB_CUR_MAX == 1) { + memcpy(dst->data.cstr, src->data.cstr + offset, + (nums)); + dst->data.cstr[dst->len] = '\0'; + } else { + memcpy(dst->data.wstr, src->data.wstr + offset, + SIZEOF_WCHAR_STRING(nums)); + dst->data.wstr[dst->len] = L'\0'; + } + } + return (dst); +} + +/* + * Write binary string to the file. + * The output is ended either with '\n' (nl == true) + * or '\0' (nl == false). + */ +int +bwsfwrite(struct bwstring *bws, FILE *f, bool zero_ended) +{ + + if (MB_CUR_MAX == 1) { + size_t len = bws->len; + + if (!zero_ended) { + bws->data.cstr[len] = '\n'; + + if (fwrite(bws->data.cstr, len + 1, 1, f) < 1) + err(2, NULL); + + bws->data.cstr[len] = '\0'; + } else if (fwrite(bws->data.cstr, len + 1, 1, f) < 1) + err(2, NULL); + + return (len + 1); + + } else { + wchar_t eols; + int printed = 0; + + eols = zero_ended ? btowc('\0') : btowc('\n'); + + while (printed < (int) BWSLEN(bws)) { + const wchar_t *s = bws->data.wstr + printed; + + if (*s == L'\0') { + int nums; + + nums = fwprintf(f, L"%lc", *s); + + if (nums != 1) + err(2, NULL); + ++printed; + } else { + int nums; + + nums = fwprintf(f, L"%ls", s); + + if (nums < 1) + err(2, NULL); + printed += nums; + } + } + fwprintf(f, L"%lc", eols); + return (printed + 1); + } +} + +/* + * Allocate and read a binary string from file. + * The strings are nl-ended or zero-ended, depending on the sort setting. + */ +struct bwstring * +bwsfgetln(FILE *f, size_t *len, bool zero_ended, struct reader_buffer *rb) +{ + wchar_t eols; + + eols = zero_ended ? btowc('\0') : btowc('\n'); + + if (!zero_ended && (MB_CUR_MAX > 1)) { + wchar_t *ret; + + ret = fgetwln(f, len); + + if (ret == NULL) { + if (!feof(f)) + err(2, NULL); + return (NULL); + } + if (*len > 0) { + if (ret[*len - 1] == eols) + --(*len); + } + return (bwssbdup(ret, *len)); + + } else if (!zero_ended && (MB_CUR_MAX == 1)) { + char *ret; + + ret = fgetln(f, len); + + if (ret == NULL) { + if (!feof(f)) + err(2, NULL); + return (NULL); + } + if (*len > 0) { + if (ret[*len - 1] == '\n') + --(*len); + } + return (bwscsbdup(ret, *len)); + + } else { + wchar_t c = 0; + + *len = 0; + + if (feof(f)) + return (NULL); + + if (2 >= rb->fgetwln_z_buffer_size) { + rb->fgetwln_z_buffer_size += 256; + rb->fgetwln_z_buffer = sort_realloc(rb->fgetwln_z_buffer, + sizeof(wchar_t) * rb->fgetwln_z_buffer_size); + } + rb->fgetwln_z_buffer[*len] = 0; + + if (MB_CUR_MAX == 1) + while (!feof(f)) { + c = fgetc(f); + + if (c == EOF) { + if (*len == 0) + return (NULL); + goto line_read_done; + } + if (c == eols) + goto line_read_done; + + if (*len + 1 >= rb->fgetwln_z_buffer_size) { + rb->fgetwln_z_buffer_size += 256; + rb->fgetwln_z_buffer = sort_realloc(rb->fgetwln_z_buffer, + SIZEOF_WCHAR_STRING(rb->fgetwln_z_buffer_size)); + } + + rb->fgetwln_z_buffer[*len] = c; + rb->fgetwln_z_buffer[++(*len)] = 0; + } + else + while (!feof(f)) { + c = fgetwc(f); + + if (c == WEOF) { + if (*len == 0) + return (NULL); + goto line_read_done; + } + if (c == eols) + goto line_read_done; + + if (*len + 1 >= rb->fgetwln_z_buffer_size) { + rb->fgetwln_z_buffer_size += 256; + rb->fgetwln_z_buffer = sort_realloc(rb->fgetwln_z_buffer, + SIZEOF_WCHAR_STRING(rb->fgetwln_z_buffer_size)); + } + + rb->fgetwln_z_buffer[*len] = c; + rb->fgetwln_z_buffer[++(*len)] = 0; + } + +line_read_done: + /* we do not count the last 0 */ + return (bwssbdup(rb->fgetwln_z_buffer, *len)); + } +} + +int +bwsncmp(const struct bwstring *bws1, const struct bwstring *bws2, + size_t offset, size_t len) +{ + size_t cmp_len, len1, len2; + int res = 0; + + cmp_len = 0; + len1 = bws1->len; + len2 = bws2->len; + + if (len1 <= offset) { + return ((len2 <= offset) ? 0 : -1); + } else { + if (len2 <= offset) + return (+1); + else { + len1 -= offset; + len2 -= offset; + + cmp_len = len1; + + if (len2 < cmp_len) + cmp_len = len2; + + if (len < cmp_len) + cmp_len = len; + + if (MB_CUR_MAX == 1) { + const unsigned char *s1, *s2; + + s1 = bws1->data.cstr + offset; + s2 = bws2->data.cstr + offset; + + res = memcmp(s1, s2, cmp_len); + + } else { + const wchar_t *s1, *s2; + + s1 = bws1->data.wstr + offset; + s2 = bws2->data.wstr + offset; + + res = memcmp(s1, s2, SIZEOF_WCHAR_STRING(cmp_len)); + } + } + } + + if (res == 0) { + if (len1 < cmp_len && len1 < len2) + res = -1; + else if (len2 < cmp_len && len2 < len1) + res = +1; + } + + return (res); +} + +int +bwscmp(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset) +{ + size_t len1, len2, cmp_len; + int res; + + len1 = bws1->len; + len2 = bws2->len; + + len1 -= offset; + len2 -= offset; + + cmp_len = len1; + + if (len2 < cmp_len) + cmp_len = len2; + + res = bwsncmp(bws1, bws2, offset, cmp_len); + + if (res == 0) { + if( len1 < len2) + res = -1; + else if (len2 < len1) + res = +1; + } + + return (res); +} + +int +bws_iterator_cmp(bwstring_iterator iter1, bwstring_iterator iter2, size_t len) +{ + wchar_t c1, c2; + size_t i = 0; + + for (i = 0; i < len; ++i) { + c1 = bws_get_iter_value(iter1); + c2 = bws_get_iter_value(iter2); + if (c1 != c2) + return (c1 - c2); + iter1 = bws_iterator_inc(iter1, 1); + iter2 = bws_iterator_inc(iter2, 1); + } + + return (0); +} + +int +bwscoll(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset) +{ + size_t len1, len2; + + len1 = bws1->len; + len2 = bws2->len; + + if (len1 <= offset) + return ((len2 <= offset) ? 0 : -1); + else { + if (len2 <= offset) + return (+1); + else { + len1 -= offset; + len2 -= offset; + + if (MB_CUR_MAX == 1) { + const unsigned char *s1, *s2; + + s1 = bws1->data.cstr + offset; + s2 = bws2->data.cstr + offset; + + if (byte_sort) { + int res = 0; + + if (len1 > len2) { + res = memcmp(s1, s2, len2); + if (!res) + res = +1; + } else if (len1 < len2) { + res = memcmp(s1, s2, len1); + if (!res) + res = -1; + } else + res = memcmp(s1, s2, len1); + + return (res); + + } else { + int res = 0; + size_t i, maxlen; + + i = 0; + maxlen = len1; + + if (maxlen > len2) + maxlen = len2; + + while (i < maxlen) { + /* goto next non-zero part: */ + while ((i < maxlen) && + !s1[i] && !s2[i]) + ++i; + + if (i >= maxlen) + break; + + if (s1[i] == 0) { + if (s2[i] == 0) + /* NOTREACHED */ + err(2, "bwscoll error 01"); + else + return (-1); + } else if (s2[i] == 0) + return (+1); + + res = strcoll(s1 + i, s2 + i); + if (res) + return (res); + + while ((i < maxlen) && + s1[i] && s2[i]) + ++i; + + if (i >= maxlen) + break; + + if (s1[i] == 0) { + if (s2[i] == 0) { + ++i; + continue; + } else + return (-1); + } else if (s2[i] == 0) + return (+1); + else + /* NOTREACHED */ + err(2, "bwscoll error 02"); + } + + if (len1 < len2) + return (-1); + else if (len1 > len2) + return (+1); + + return (0); + } + } else { + const wchar_t *s1, *s2; + size_t i, maxlen; + int res = 0; + + s1 = bws1->data.wstr + offset; + s2 = bws2->data.wstr + offset; + + i = 0; + maxlen = len1; + + if (maxlen > len2) + maxlen = len2; + + while (i < maxlen) { + + /* goto next non-zero part: */ + while ((i < maxlen) && + !s1[i] && !s2[i]) + ++i; + + if (i >= maxlen) + break; + + if (s1[i] == 0) { + if (s2[i] == 0) + /* NOTREACHED */ + err(2, "bwscoll error 1"); + else + return (-1); + } else if (s2[i] == 0) + return (+1); + + res = wide_str_coll(s1 + i, s2 + i); + if (res) + return (res); + + while ((i < maxlen) && s1[i] && s2[i]) + ++i; + + if (i >= maxlen) + break; + + if (s1[i] == 0) { + if (s2[i] == 0) { + ++i; + continue; + } else + return (-1); + } else if (s2[i] == 0) + return (+1); + else + /* NOTREACHED */ + err(2, "bwscoll error 2"); + } + + if (len1 < len2) + return (-1); + else if (len1 > len2) + return (+1); + + return (0); + } + } + } +} + +/* + * Correction of the system API + */ +double +bwstod(struct bwstring *s0, bool *empty) +{ + double ret = 0; + + if (MB_CUR_MAX == 1) { + unsigned char *end, *s; + char *ep; + + s = s0->data.cstr; + end = s + s0->len; + ep = NULL; + + while (isblank(*s) && s < end) + ++s; + + if (!isprint(*s)) { + *empty = true; + return (0); + } + + ret = strtod(s, &ep); + if ((unsigned char*) ep == s) { + *empty = true; + return (0); + } + } else { + wchar_t *end, *ep, *s; + + s = s0->data.wstr; + end = s + s0->len; + ep = NULL; + + while (iswblank(*s) && s < end) + ++s; + + if (!iswprint(*s)) { + *empty = true; + return (0); + } + + ret = wcstod(s, &ep); + if (ep == s) { + *empty = true; + return (0); + } + } + + *empty = false; + return (ret); +} + +/* + * A helper function for monthcoll. If a line matches + * a month name, it returns (number of the month - 1), + * while if there is no match, it just return -1. + */ + +int +bws_month_score(const struct bwstring *s0) +{ + + if (MB_CUR_MAX == 1) { + const unsigned char *end, *s; + size_t len; + + s = s0->data.cstr; + end = s + s0->len; + + while (isblank(*s) && s < end) + ++s; + + len = strlen(s); + + for (int i = 11; i >= 0; --i) { + if (cmonths[i] && + (s == (unsigned char*)strstr(s, cmonths[i]))) + return (i); + } + + } else { + const wchar_t *end, *s; + size_t len; + + s = s0->data.wstr; + end = s + s0->len; + + while (iswblank(*s) && s < end) + ++s; + + len = wcslen(s); + + for (int i = 11; i >= 0; --i) { + if (wmonths[i] && (s == wcsstr(s, wmonths[i]))) + return (i); + } + } + + return (-1); +} + +/* + * Rips out leading blanks (-b). + */ +struct bwstring * +ignore_leading_blanks(struct bwstring *str) +{ + + if (MB_CUR_MAX == 1) { + unsigned char *dst, *end, *src; + + src = str->data.cstr; + dst = src; + end = src + str->len; + + while (src < end && isblank(*src)) + ++src; + + if (src != dst) { + size_t newlen; + + newlen = BWSLEN(str) - (src - dst); + + while (src < end) { + *dst = *src; + ++dst; + ++src; + } + bws_setlen(str, newlen); + } + } else { + wchar_t *dst, *end, *src; + + src = str->data.wstr; + dst = src; + end = src + str->len; + + while (src < end && iswblank(*src)) + ++src; + + if (src != dst) { + + size_t newlen = BWSLEN(str) - (src - dst); + + while (src < end) { + *dst = *src; + ++dst; + ++src; + } + bws_setlen(str, newlen); + + } + } + return (str); +} + +/* + * Rips out nonprinting characters (-i). + */ +struct bwstring * +ignore_nonprinting(struct bwstring *str) +{ + size_t newlen = str->len; + + if (MB_CUR_MAX == 1) { + unsigned char *dst, *end, *src; + unsigned char c; + + src = str->data.cstr; + dst = src; + end = src + str->len; + + while (src < end) { + c = *src; + if (isprint(c)) { + *dst = c; + ++dst; + ++src; + } else { + ++src; + --newlen; + } + } + } else { + wchar_t *dst, *end, *src; + wchar_t c; + + src = str->data.wstr; + dst = src; + end = src + str->len; + + while (src < end) { + c = *src; + if (iswprint(c)) { + *dst = c; + ++dst; + ++src; + } else { + ++src; + --newlen; + } + } + } + bws_setlen(str, newlen); + + return (str); +} + +/* + * Rips out any characters that are not alphanumeric characters + * nor blanks (-d). + */ +struct bwstring * +dictionary_order(struct bwstring *str) +{ + size_t newlen = str->len; + + if (MB_CUR_MAX == 1) { + unsigned char *dst, *end, *src; + unsigned char c; + + src = str->data.cstr; + dst = src; + end = src + str->len; + + while (src < end) { + c = *src; + if (isalnum(c) || isblank(c)) { + *dst = c; + ++dst; + ++src; + } else { + ++src; + --newlen; + } + } + } else { + wchar_t *dst, *end, *src; + wchar_t c; + + src = str->data.wstr; + dst = src; + end = src + str->len; + + while (src < end) { + c = *src; + if (iswalnum(c) || iswblank(c)) { + *dst = c; + ++dst; + ++src; + } else { + ++src; + --newlen; + } + } + } + bws_setlen(str, newlen); + + return (str); +} + +/* + * Converts string to lower case(-f). + */ +struct bwstring * +ignore_case(struct bwstring *str) +{ + + if (MB_CUR_MAX == 1) { + unsigned char *end, *s; + + s = str->data.cstr; + end = s + str->len; + + while (s < end) { + *s = toupper(*s); + ++s; + } + } else { + wchar_t *end, *s; + + s = str->data.wstr; + end = s + str->len; + + while (s < end) { + *s = towupper(*s); + ++s; + } + } + return (str); +} + +void +bws_disorder_warnx(struct bwstring *s, const char *fn, size_t pos) +{ + + if (MB_CUR_MAX == 1) + warnx("%s:%zu: disorder: %s", fn, pos + 1, s->data.cstr); + else + warnx("%s:%zu: disorder: %ls", fn, pos + 1, s->data.wstr); +} diff --git a/usr.bin/sort/bwstring.h b/usr.bin/sort/bwstring.h new file mode 100644 index 00000000000..828704f5de4 --- /dev/null +++ b/usr.bin/sort/bwstring.h @@ -0,0 +1,142 @@ +/* $FreeBSD$ */ + +/*- + * Copyright (C) 2009 Gabor Kovesdan + * Copyright (C) 2012 Oleg Moskalenko + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if !defined(__BWSTRING_H__) +#define __BWSTRING_H__ + +#include +#include +#include +#include +#include + +#include "mem.h" + +extern bool byte_sort; + +/* wchar_t is of 4 bytes: */ +#define SIZEOF_WCHAR_STRING(LEN) ((LEN)*sizeof(wchar_t)) + +/* + * Binary "wide" string + */ +struct bwstring +{ + size_t len; + union + { + wchar_t wstr[0]; + unsigned char cstr[0]; + } data; +}; + +struct reader_buffer +{ + wchar_t *fgetwln_z_buffer; + size_t fgetwln_z_buffer_size; +}; + +typedef void *bwstring_iterator; + +#define BWSLEN(s) ((s)->len) + +struct bwstring *bwsalloc(size_t sz); + +size_t bwsrawlen(const struct bwstring *bws); +const void* bwsrawdata(const struct bwstring *bws); +void bws_setlen(struct bwstring *bws, size_t newlen); +size_t bws_memsize(const struct bwstring *bws); +double bwstod(struct bwstring *s0, bool *empty); +int bws_month_score(const struct bwstring *s0); + +struct bwstring *ignore_leading_blanks(struct bwstring *str); +struct bwstring *ignore_nonprinting(struct bwstring *str); +struct bwstring *dictionary_order(struct bwstring *str); +struct bwstring *ignore_case(struct bwstring *str); + +void bwsprintf(FILE*, struct bwstring*, const char *prefix, const char *suffix); +void bws_disorder_warnx(struct bwstring *s, const char *fn, size_t pos); + +struct bwstring *bwsdup(const struct bwstring *s); +struct bwstring *bwssbdup(const wchar_t *str, size_t size); +struct bwstring *bwscsbdup(const unsigned char *str, size_t size); +void bwsfree(const struct bwstring *s); +size_t bwscpy(struct bwstring *dst, const struct bwstring *src); +struct bwstring *bwsncpy(struct bwstring *dst, const struct bwstring *src, size_t size); +struct bwstring *bwsnocpy(struct bwstring *dst, const struct bwstring *src, size_t offset, size_t size); +int bwscmp(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset); +int bwsncmp(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset, size_t len); +int bwscoll(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset); +int bwsfwrite(struct bwstring *bws, FILE *f, bool zero_ended); +struct bwstring *bwsfgetln(FILE *file, size_t *len, bool zero_ended, struct reader_buffer *rb); + +static inline bwstring_iterator +bws_begin(struct bwstring *bws) +{ + + return (bwstring_iterator) (&(bws->data)); +} + +static inline bwstring_iterator +bws_end(struct bwstring *bws) +{ + + return ((MB_CUR_MAX == 1) ? + (bwstring_iterator) (bws->data.cstr + bws->len) : + (bwstring_iterator) (bws->data.wstr + bws->len)); +} + +static inline bwstring_iterator +bws_iterator_inc(bwstring_iterator iter, size_t pos) +{ + + if (MB_CUR_MAX == 1) + return ((unsigned char *) iter) + pos; + else + return ((wchar_t*) iter) + pos; +} + +static inline wchar_t +bws_get_iter_value(bwstring_iterator iter) +{ + + if (MB_CUR_MAX == 1) + return *((unsigned char *) iter); + else + return *((wchar_t*) iter); +} + +int +bws_iterator_cmp(bwstring_iterator iter1, bwstring_iterator iter2, size_t len); + +#define BWS_GET(bws, pos) ((MB_CUR_MAX == 1) ? ((bws)->data.cstr[(pos)]) : (bws)->data.wstr[(pos)]) + +void initialise_months(void); + +#endif /* __BWSTRING_H__ */ diff --git a/usr.bin/sort/coll.c b/usr.bin/sort/coll.c new file mode 100644 index 00000000000..b7e1cf2ecd6 --- /dev/null +++ b/usr.bin/sort/coll.c @@ -0,0 +1,1301 @@ +/*- + * Copyright (C) 2009 Gabor Kovesdan + * Copyright (C) 2012 Oleg Moskalenko + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "coll.h" +#include "vsort.h" + +struct key_specs *keys; +size_t keys_num = 0; + +wchar_t symbol_decimal_point = L'.'; +/* there is no default thousands separator in collate rules: */ +wchar_t symbol_thousands_sep = 0; +wchar_t symbol_negative_sign = L'-'; +wchar_t symbol_positive_sign = L'+'; + +static int wstrcoll(struct key_value *kv1, struct key_value *kv2, size_t offset); +static int gnumcoll(struct key_value*, struct key_value *, size_t offset); +static int monthcoll(struct key_value*, struct key_value *, size_t offset); +static int numcoll(struct key_value*, struct key_value *, size_t offset); +static int hnumcoll(struct key_value*, struct key_value *, size_t offset); +static int randomcoll(struct key_value*, struct key_value *, size_t offset); +static int versioncoll(struct key_value*, struct key_value *, size_t offset); + +/* + * Allocate keys array + */ +struct keys_array * +keys_array_alloc(void) +{ + struct keys_array *ka; + size_t sz; + + sz = keys_array_size(); + ka = sort_malloc(sz); + memset(ka, 0, sz); + + return (ka); +} + +/* + * Calculate whether we need key hint space + */ +static size_t +key_hint_size(void) +{ + + return (need_hint ? sizeof(struct key_hint) : 0); +} + +/* + * Calculate keys array size + */ +size_t +keys_array_size(void) +{ + + return (keys_num * (sizeof(struct key_value) + key_hint_size())); +} + +/* + * Clean data of keys array + */ +void +clean_keys_array(const struct bwstring *s, struct keys_array *ka) +{ + + if (ka) { + for (size_t i = 0; i < keys_num; ++i) + if (ka->key[i].k && ka->key[i].k != s) + bwsfree(ka->key[i].k); + memset(ka, 0, keys_array_size()); + } +} + +/* + * Set value of a key in the keys set + */ +void +set_key_on_keys_array(struct keys_array *ka, struct bwstring *s, size_t ind) +{ + + if (ka && keys_num > ind) { + struct key_value *kv; + + kv = &(ka->key[ind]); + + if (kv->k && kv->k != s) + bwsfree(kv->k); + kv->k = s; + } +} + +/* + * Initialize a sort list item + */ +struct sort_list_item * +sort_list_item_alloc(void) +{ + struct sort_list_item *si; + size_t sz; + + sz = sizeof(struct sort_list_item) + keys_array_size(); + si = sort_malloc(sz); + memset(si, 0, sz); + + return (si); +} + +size_t +sort_list_item_size(struct sort_list_item *si) +{ + size_t ret = 0; + + if (si) { + ret = sizeof(struct sort_list_item) + keys_array_size(); + if (si->str) + ret += bws_memsize(si->str); + for (size_t i = 0; i < keys_num; ++i) { + struct key_value *kv; + + kv = &(si->ka.key[i]); + + if (kv->k != si->str) + ret += bws_memsize(kv->k); + } + } + return (ret); +} + +/* + * Calculate key for a sort list item + */ +static void +sort_list_item_make_key(struct sort_list_item *si) +{ + + preproc(si->str, &(si->ka)); +} + +/* + * Set value of a sort list item. + * Return combined string and keys memory size. + */ +void +sort_list_item_set(struct sort_list_item *si, struct bwstring *str) +{ + + if (si) { + clean_keys_array(si->str, &(si->ka)); + if (si->str) { + if (si->str == str) { + /* we are trying to reset the same string */ + return; + } else { + bwsfree(si->str); + si->str = NULL; + } + } + si->str = str; + sort_list_item_make_key(si); + } +} + +/* + * De-allocate a sort list item object memory + */ +void +sort_list_item_clean(struct sort_list_item *si) +{ + + if (si) { + clean_keys_array(si->str, &(si->ka)); + if (si->str) { + bwsfree(si->str); + si->str = NULL; + } + } +} + +/* + * Skip columns according to specs + */ +static size_t +skip_cols_to_start(const struct bwstring *s, size_t cols, size_t start, + bool skip_blanks, bool *empty_key) +{ + if (cols < 1) + return (BWSLEN(s) + 1); + + if (skip_blanks) + while (start < BWSLEN(s) && iswblank(BWS_GET(s,start))) + ++start; + + while (start < BWSLEN(s) && cols > 1) { + --cols; + ++start; + } + + if (start >= BWSLEN(s)) + *empty_key = true; + + return (start); +} + +/* + * Skip fields according to specs + */ +static size_t +skip_fields_to_start(const struct bwstring *s, size_t fields, bool *empty_field) +{ + + if (fields < 2) { + if (BWSLEN(s) == 0) + *empty_field = true; + return (0); + } else if (!(sort_opts_vals.tflag)) { + size_t cpos = 0; + bool pb = true; + + while (cpos < BWSLEN(s)) { + bool isblank; + + isblank = iswblank(BWS_GET(s,cpos)); + + if (isblank && !pb) { + --fields; + if (fields <= 1) + return (cpos); + } + pb = isblank; + ++cpos; + } + if (fields > 1) + *empty_field = true; + return (cpos); + } else { + size_t cpos = 0; + + while (cpos < BWSLEN(s)) { + if (BWS_GET(s,cpos) == sort_opts_vals.field_sep) { + --fields; + if (fields <= 1) + return (cpos + 1); + } + ++cpos; + } + if (fields > 1) + *empty_field = true; + return (cpos); + } +} + +/* + * Find fields start + */ +static void +find_field_start(const struct bwstring *s, struct key_specs *ks, + size_t *field_start, size_t *key_start, bool *empty_field, bool *empty_key) +{ + + *field_start = skip_fields_to_start(s, ks->f1, empty_field); + if (!*empty_field) + *key_start = skip_cols_to_start(s, ks->c1, *field_start, + ks->pos1b, empty_key); + else + *empty_key = true; +} + +/* + * Find end key position + */ +static size_t +find_field_end(const struct bwstring *s, struct key_specs *ks) +{ + size_t f2, next_field_start, pos_end; + bool empty_field, empty_key; + + pos_end = 0; + next_field_start = 0; + empty_field = false; + empty_key = false; + f2 = ks->f2; + + if (f2 == 0) + return (BWSLEN(s) + 1); + else { + if (ks->c2 == 0) { + next_field_start = skip_fields_to_start(s, f2 + 1, + &empty_field); + if ((next_field_start > 0) && sort_opts_vals.tflag && + (sort_opts_vals.field_sep == BWS_GET(s, + next_field_start - 1))) + --next_field_start; + } else + next_field_start = skip_fields_to_start(s, f2, + &empty_field); + } + + if (empty_field || (next_field_start >= BWSLEN(s))) + return (BWSLEN(s) + 1); + + if (ks->c2) { + pos_end = skip_cols_to_start(s, ks->c2, next_field_start, + ks->pos2b, &empty_key); + if (pos_end < BWSLEN(s)) + ++pos_end; + } else + pos_end = next_field_start; + + return (pos_end); +} + +/* + * Cut a field according to the key specs + */ +static struct bwstring * +cut_field(const struct bwstring *s, struct key_specs *ks) +{ + struct bwstring *ret = NULL; + + if (s && ks) { + size_t field_start, key_end, key_start, sz; + bool empty_field, empty_key; + + field_start = 0; + key_start = 0; + empty_field = false; + empty_key = false; + + find_field_start(s, ks, &field_start, &key_start, + &empty_field, &empty_key); + + if (empty_key) + sz = 0; + else { + key_end = find_field_end(s, ks); + sz = (key_end < key_start) ? 0 : (key_end - key_start); + } + + ret = bwsalloc(sz); + if (sz) + bwsnocpy(ret, s, key_start, sz); + } else + ret = bwsalloc(0); + + return (ret); +} + +/* + * Preprocesses a line applying the necessary transformations + * specified by command line options and returns the preprocessed + * string, which can be used to compare. + */ +int +preproc(struct bwstring *s, struct keys_array *ka) +{ + + if (sort_opts_vals.kflag) + for (size_t i = 0; i < keys_num; i++) { + struct bwstring *key; + struct key_specs *kspecs; + struct sort_mods *sm; + + kspecs = &(keys[i]); + key = cut_field(s, kspecs); + + sm = &(kspecs->sm); + if (sm->dflag) + key = dictionary_order(key); + else if (sm->iflag) + key = ignore_nonprinting(key); + if (sm->fflag || sm->Mflag) + key = ignore_case(key); + + set_key_on_keys_array(ka, key, i); + } + else { + struct bwstring *ret = NULL; + struct sort_mods *sm = default_sort_mods; + + if (sm->bflag) { + if (ret == NULL) + ret = bwsdup(s); + ret = ignore_leading_blanks(ret); + } + if (sm->dflag) { + if (ret == NULL) + ret = bwsdup(s); + ret = dictionary_order(ret); + } else if (sm->iflag) { + if (ret == NULL) + ret = bwsdup(s); + ret = ignore_nonprinting(ret); + } + if (sm->fflag || sm->Mflag) { + if (ret == NULL) + ret = bwsdup(s); + ret = ignore_case(ret); + } + if (ret == NULL) + set_key_on_keys_array(ka, s, 0); + else + set_key_on_keys_array(ka, ret, 0); + } + + return 0; +} + +cmpcoll_t +get_sort_func(struct sort_mods *sm) +{ + + if (sm->nflag) + return (numcoll); + else if (sm->hflag) + return (hnumcoll); + else if (sm->gflag) + return (gnumcoll); + else if (sm->Mflag) + return (monthcoll); + else if (sm->Rflag) + return (randomcoll); + else if (sm->Vflag) + return (versioncoll); + else + return (wstrcoll); +} + +/* + * Compares the given strings. Returns a positive number if + * the first precedes the second, a negative number if the second is + * the preceding one, and zero if they are equal. This function calls + * the underlying collate functions, which done the actual comparison. + */ +int +key_coll(struct keys_array *ps1, struct keys_array *ps2, size_t offset) +{ + struct sort_mods *sm; + int res = 0; + + for (size_t i = 0; i < keys_num; ++i) { + sm = &(keys[i].sm); + + if (sm->rflag) + res = sm->func(&(ps2->key[i]), &(ps1->key[i]), offset); + else + res = sm->func(&(ps1->key[i]), &(ps2->key[i]), offset); + + if (res) + break; + + /* offset applies to only the first key */ + offset = 0; + } + return (res); +} + +/* + * Compare two strings. + * Plain symbol-by-symbol comparison. + */ +int +top_level_str_coll(const struct bwstring *s1, const struct bwstring *s2) +{ + + if (default_sort_mods->rflag) { + const struct bwstring *tmp; + + tmp = s1; + s1 = s2; + s2 = tmp; + } + + return (bwscoll(s1, s2, 0)); +} + +/* + * Compare a string and a sort list item, according to the sort specs. + */ +int +str_list_coll(struct bwstring *str1, struct sort_list_item **ss2) +{ + struct keys_array *ka1; + int ret = 0; + + ka1 = keys_array_alloc(); + + preproc(str1, ka1); + + sort_list_item_make_key(*ss2); + + if (debug_sort) { + bwsprintf(stdout, str1, "; s1=<", ">"); + bwsprintf(stdout, (*ss2)->str, ", s2=<", ">"); + } + + ret = key_coll(ka1, &((*ss2)->ka), 0); + + if (debug_sort) + printf("; cmp1=%d", ret); + + clean_keys_array(str1, ka1); + sort_free(ka1); + + if ((ret == 0) && !(sort_opts_vals.sflag) && sort_opts_vals.complex_sort) { + ret = top_level_str_coll(str1, ((*ss2)->str)); + if (debug_sort) + printf("; cmp2=%d", ret); + } + + if (debug_sort) + printf("\n"); + + return (ret); +} + +/* + * Compare two sort list items, according to the sort specs. + */ +int +list_coll_offset(struct sort_list_item **ss1, struct sort_list_item **ss2, + size_t offset) +{ + int ret; + + ret = key_coll(&((*ss1)->ka), &((*ss2)->ka), offset); + + if (debug_sort) { + if (offset) + printf("; offset=%d", (int) offset); + bwsprintf(stdout, ((*ss1)->str), "; s1=<", ">"); + bwsprintf(stdout, ((*ss2)->str), ", s2=<", ">"); + printf("; cmp1=%d\n", ret); + } + + if (ret) + return (ret); + + if (!(sort_opts_vals.sflag) && sort_opts_vals.complex_sort) { + ret = top_level_str_coll(((*ss1)->str), ((*ss2)->str)); + if (debug_sort) + printf("; cmp2=%d\n", ret); + } + + return (ret); +} + +/* + * Compare two sort list items, according to the sort specs. + */ +int +list_coll(struct sort_list_item **ss1, struct sort_list_item **ss2) +{ + + return (list_coll_offset(ss1, ss2, 0)); +} + +#define LSCDEF(N) \ +static int \ +list_coll_##N(struct sort_list_item **ss1, struct sort_list_item **ss2) \ +{ \ + \ + return (list_coll_offset(ss1, ss2, N)); \ +} + +LSCDEF(1) +LSCDEF(2) +LSCDEF(3) +LSCDEF(4) +LSCDEF(5) +LSCDEF(6) +LSCDEF(7) +LSCDEF(8) +LSCDEF(9) +LSCDEF(10) +LSCDEF(11) +LSCDEF(12) +LSCDEF(13) +LSCDEF(14) +LSCDEF(15) +LSCDEF(16) +LSCDEF(17) +LSCDEF(18) +LSCDEF(19) +LSCDEF(20) + +listcoll_t +get_list_call_func(size_t offset) +{ + static const listcoll_t lsarray[] = { list_coll, list_coll_1, + list_coll_2, list_coll_3, list_coll_4, list_coll_5, + list_coll_6, list_coll_7, list_coll_8, list_coll_9, + list_coll_10, list_coll_11, list_coll_12, list_coll_13, + list_coll_14, list_coll_15, list_coll_16, list_coll_17, + list_coll_18, list_coll_19, list_coll_20 }; + + if (offset <= 20) + return (lsarray[offset]); + + return (list_coll); +} + +/* + * Compare two sort list items, only by their original string. + */ +int +list_coll_by_str_only(struct sort_list_item **ss1, struct sort_list_item **ss2) +{ + + return (top_level_str_coll(((*ss1)->str), ((*ss2)->str))); +} + +/* + * Maximum size of a number in the string (before or after decimal point) + */ +#define MAX_NUM_SIZE (128) + +/* + * Set suffix value + */ +static void setsuffix(wchar_t c, unsigned char *si) +{ + switch (c){ + case L'k': + case L'K': + *si = 1; + break; + case L'M': + *si = 2; + break; + case L'G': + *si = 3; + break; + case L'T': + *si = 4; + break; + case L'P': + *si = 5; + break; + case L'E': + *si = 6; + break; + case L'Z': + *si = 7; + break; + case L'Y': + *si = 8; + break; + default: + *si = 0; + }; +} + +/* + * Read string s and parse the string into a fixed-decimal-point number. + * sign equals -1 if the number is negative (explicit plus is not allowed, + * according to GNU sort's "info sort". + * The number part before decimal point is in the smain, after the decimal + * point is in sfrac, tail is the pointer to the remainder of the string. + */ +static int +read_number(struct bwstring *s0, int *sign, wchar_t *smain, int *main_len, wchar_t *sfrac, int *frac_len, unsigned char *si) +{ + bwstring_iterator s; + + s = bws_begin(s0); + + /* always end the fraction with zero, even if we have no fraction */ + sfrac[0] = 0; + + while (iswblank(bws_get_iter_value(s))) + s = bws_iterator_inc(s, 1); + + if (bws_get_iter_value(s) == symbol_negative_sign) { + *sign = -1; + s = bws_iterator_inc(s, 1); + } + + // This is '0', not '\0', do not change this + while (iswdigit(bws_get_iter_value(s)) && + (bws_get_iter_value(s) == L'0')) + s = bws_iterator_inc(s, 1); + + while (bws_get_iter_value(s) && *main_len < MAX_NUM_SIZE) { + if (iswdigit(bws_get_iter_value(s))) { + smain[*main_len] = bws_get_iter_value(s); + s = bws_iterator_inc(s, 1); + *main_len += 1; + } else if (symbol_thousands_sep && + (bws_get_iter_value(s) == symbol_thousands_sep)) + s = bws_iterator_inc(s, 1); + else + break; + } + + smain[*main_len] = 0; + + if (bws_get_iter_value(s) == symbol_decimal_point) { + s = bws_iterator_inc(s, 1); + while (iswdigit(bws_get_iter_value(s)) && + *frac_len < MAX_NUM_SIZE) { + sfrac[*frac_len] = bws_get_iter_value(s); + s = bws_iterator_inc(s, 1); + *frac_len += 1; + } + sfrac[*frac_len] = 0; + + while (*frac_len > 0 && sfrac[*frac_len - 1] == L'0') { + --(*frac_len); + sfrac[*frac_len] = L'\0'; + } + } + + setsuffix(bws_get_iter_value(s),si); + + if ((*main_len + *frac_len) == 0) + *sign = 0; + + return (0); +} + +/* + * Implements string sort. + */ +static int +wstrcoll(struct key_value *kv1, struct key_value *kv2, size_t offset) +{ + + if (debug_sort) { + if (offset) + printf("; offset=%d\n", (int) offset); + bwsprintf(stdout, kv1->k, "; k1=<", ">"); + printf("(%zu)", BWSLEN(kv1->k)); + bwsprintf(stdout, kv2->k, ", k2=<", ">"); + printf("(%zu)", BWSLEN(kv2->k)); + } + + return (bwscoll(kv1->k, kv2->k, offset)); +} + +/* + * Compare two suffixes + */ +static inline int +cmpsuffix(unsigned char si1, unsigned char si2) +{ + + return ((char)si1 - (char)si2); +} + +/* + * Implements numeric sort for -n and -h. + */ +static int +numcoll_impl(struct key_value *kv1, struct key_value *kv2, + size_t offset __unused, bool use_suffix) +{ + struct bwstring *s1, *s2; + wchar_t sfrac1[MAX_NUM_SIZE + 1], sfrac2[MAX_NUM_SIZE + 1]; + wchar_t smain1[MAX_NUM_SIZE + 1], smain2[MAX_NUM_SIZE + 1]; + int cmp_res, frac1, frac2, main1, main2, sign1, sign2; + unsigned char SI1, SI2; + bool e1, e2, key1_read, key2_read; + + s1 = kv1->k; + s2 = kv2->k; + sign1 = sign2 = 0; + main1 = main2 = 0; + frac1 = frac2 = 0; + + cmp_res = 0; + key1_read = key2_read = false; + + if (debug_sort) { + bwsprintf(stdout, s1, "; k1=<", ">"); + bwsprintf(stdout, s2, ", k2=<", ">"); + } + + if (s1 == s2) + return (0); + + if (kv1->hint->status == HS_UNINITIALIZED) { + /* read the number from the string */ + read_number(s1, &sign1, smain1, &main1, sfrac1, &frac1, &SI1); + key1_read = true; + kv1->hint->v.nh.n1 = wcstoull(smain1, NULL, 10); + if(main1 < 1 && frac1 < 1) + kv1->hint->v.nh.empty=true; + kv1->hint->v.nh.si = SI1; + kv1->hint->status = (kv1->hint->v.nh.n1 != ULLONG_MAX) ? + HS_INITIALIZED : HS_ERROR; + kv1->hint->v.nh.neg = (sign1 < 0) ? true : false; + } + + if (kv2->hint->status == HS_UNINITIALIZED) { + /* read the number from the string */ + read_number(s2, &sign2, smain2, &main2, sfrac2, &frac2,&SI2); + key2_read = true; + kv2->hint->v.nh.n1 = wcstoull(smain2, NULL, 10); + if(main2 < 1 && frac2 < 1) + kv2->hint->v.nh.empty=true; + kv2->hint->v.nh.si = SI2; + kv2->hint->status = (kv2->hint->v.nh.n1 != ULLONG_MAX) ? + HS_INITIALIZED : HS_ERROR; + kv2->hint->v.nh.neg = (sign2 < 0) ? true : false; + } + + if (kv1->hint->status == HS_INITIALIZED && kv2->hint->status == + HS_INITIALIZED) { + unsigned long long n1, n2; + bool neg1, neg2; + + e1 = kv1->hint->v.nh.empty; + e2 = kv2->hint->v.nh.empty; + + if (e1 && e2) + return (0); + + neg1 = kv1->hint->v.nh.neg; + neg2 = kv2->hint->v.nh.neg; + + if (neg1 && !neg2) + return (-1); + if (neg2 && !neg1) + return (+1); + + if (e1) + return (neg2 ? +1 : -1); + else if (e2) + return (neg1 ? -1 : +1); + + + if (use_suffix) { + cmp_res = cmpsuffix(kv1->hint->v.nh.si, kv2->hint->v.nh.si); + if (cmp_res) + return (neg1 ? -cmp_res : cmp_res); + } + + n1 = kv1->hint->v.nh.n1; + n2 = kv2->hint->v.nh.n1; + if (n1 < n2) + return (neg1 ? +1 : -1); + else if (n1 > n2) + return (neg1 ? -1 : +1); + } + + /* read the numbers from the strings */ + if (!key1_read) + read_number(s1, &sign1, smain1, &main1, sfrac1, &frac1, &SI1); + if (!key2_read) + read_number(s2, &sign2, smain2, &main2, sfrac2, &frac2, &SI2); + + e1 = ((main1 + frac1) == 0); + e2 = ((main2 + frac2) == 0); + + if (e1 && e2) + return (0); + + /* we know the result if the signs are different */ + if (sign1 < 0 && sign2 >= 0) + return (-1); + if (sign1 >= 0 && sign2 < 0) + return (+1); + + if (e1) + return ((sign2 < 0) ? +1 : -1); + else if (e2) + return ((sign1 < 0) ? -1 : +1); + + if (use_suffix) { + cmp_res = cmpsuffix(SI1, SI2); + if (cmp_res) + return ((sign1 < 0) ? -cmp_res : cmp_res); + } + + /* if both numbers are empty assume that the strings are equal */ + if (main1 < 1 && main2 < 1 && frac1 < 1 && frac2 < 1) + return (0); + + /* + * if the main part is of different size, we know the result + * (because the leading zeros are removed) + */ + if (main1 < main2) + cmp_res = -1; + else if (main1 > main2) + cmp_res = +1; + /* if the sizes are equal then simple non-collate string compare gives the correct result */ + else + cmp_res = wcscmp(smain1, smain2); + + /* check fraction */ + if (!cmp_res) + cmp_res = wcscmp(sfrac1, sfrac2); + + if (!cmp_res) + return (0); + + /* reverse result if the signs are negative */ + if (sign1 < 0 && sign2 < 0) + cmp_res = -cmp_res; + + return (cmp_res); +} + +/* + * Implements numeric sort (-n). + */ +static int +numcoll(struct key_value *kv1, struct key_value *kv2, size_t offset) +{ + + return (numcoll_impl(kv1, kv2, offset, false)); +} + +/* + * Implements 'human' numeric sort (-h). + */ +static int +hnumcoll(struct key_value *kv1, struct key_value *kv2, size_t offset) +{ + + return (numcoll_impl(kv1, kv2, offset, true)); +} + +/* + * Implements random sort (-R). + */ +static int +randomcoll(struct key_value *kv1, struct key_value *kv2, + size_t offset __unused) +{ + struct bwstring *s1, *s2; + MD5_CTX ctx1, ctx2; + char *b1, *b2; + + s1 = kv1->k; + s2 = kv2->k; + + if (debug_sort) { + bwsprintf(stdout, s1, "; k1=<", ">"); + bwsprintf(stdout, s2, ", k2=<", ">"); + } + + if (s1 == s2) + return (0); + + memcpy(&ctx1,&md5_ctx,sizeof(MD5_CTX)); + memcpy(&ctx2,&md5_ctx,sizeof(MD5_CTX)); + + MD5Update(&ctx1, bwsrawdata(s1), bwsrawlen(s1)); + MD5Update(&ctx2, bwsrawdata(s2), bwsrawlen(s2)); + b1 = MD5End(&ctx1, NULL); + b2 = MD5End(&ctx2, NULL); + if (b1 == NULL) { + if (b2 == NULL) + return (0); + else { + sort_free(b2); + return (-1); + } + } else if (b2 == NULL) { + sort_free(b1); + return (+1); + } else { + int cmp_res; + + cmp_res = strcmp(b1,b2); + sort_free(b1); + sort_free(b2); + + if (!cmp_res) + cmp_res = bwscoll(s1, s2, 0); + + return (cmp_res); + } +} + +/* + * Implements version sort (-V). + */ +static int +versioncoll(struct key_value *kv1, struct key_value *kv2, + size_t offset __unused) +{ + struct bwstring *s1, *s2; + + s1 = kv1->k; + s2 = kv2->k; + + if (debug_sort) { + bwsprintf(stdout, s1, "; k1=<", ">"); + bwsprintf(stdout, s2, ", k2=<", ">"); + } + + if (s1 == s2) + return (0); + + return (vcmp(s1, s2)); +} + +/* + * Check for minus infinity + */ +static inline bool +huge_minus(double d, int err1) +{ + + if (err1 == ERANGE) + if (d == -HUGE_VAL || d == -HUGE_VALF || d == -HUGE_VALL) + return (+1); + + return (0); +} + +/* + * Check for plus infinity + */ +static inline bool +huge_plus(double d, int err1) +{ + + if (err1 == ERANGE) + if (d == HUGE_VAL || d == HUGE_VALF || d == HUGE_VALL) + return (+1); + + return (0); +} + +/* + * Check whether a function is a NAN + */ +static bool +is_nan(double d) +{ + + return ((d == NAN) || (isnan(d))); +} + +/* + * Compare two NANs + */ +static int +cmp_nans(double d1, double d2) +{ + + if (d1 < d2) + return (-1); + if (d2 > d2) + return (+1); + return (0); +} + +/* + * Implements general numeric sort (-g). + */ +static int +gnumcoll(struct key_value *kv1, struct key_value *kv2, + size_t offset __unused) +{ + double d1, d2; + int err1, err2; + bool empty1, empty2, key1_read, key2_read; + + d1 = d2 = 0; + err1 = err2 = 0; + key1_read = key2_read = false; + + if (debug_sort) { + bwsprintf(stdout, kv1->k, "; k1=<", ">"); + bwsprintf(stdout, kv2->k, "; k2=<", ">"); + } + + if (kv1->hint->status == HS_UNINITIALIZED) { + errno = 0; + d1 = bwstod(kv1->k, &empty1); + err1 = errno; + + if (empty1) + kv1->hint->v.gh.notnum = true; + else if (err1 == 0) { + kv1->hint->v.gh.d = d1; + kv1->hint->v.gh.nan = is_nan(d1); + kv1->hint->status = HS_INITIALIZED; + } else + kv1->hint->status = HS_ERROR; + + key1_read = true; + } + + if (kv2->hint->status == HS_UNINITIALIZED) { + errno = 0; + d2 = bwstod(kv2->k, &empty2); + err2 = errno; + + if (empty2) + kv2->hint->v.gh.notnum = true; + else if (err2 == 0) { + kv2->hint->v.gh.d = d2; + kv2->hint->v.gh.nan = is_nan(d2); + kv2->hint->status = HS_INITIALIZED; + } else + kv2->hint->status = HS_ERROR; + + key2_read = true; + } + + if (kv1->hint->status == HS_INITIALIZED && + kv2->hint->status == HS_INITIALIZED) { + if (kv1->hint->v.gh.notnum) + return ((kv2->hint->v.gh.notnum) ? 0 : -1); + else if (kv2->hint->v.gh.notnum) + return (+1); + + if (kv1->hint->v.gh.nan) + return ((kv2->hint->v.gh.nan) ? + cmp_nans(kv1->hint->v.gh.d, kv2->hint->v.gh.d) : + -1); + else if (kv2->hint->v.gh.nan) + return (+1); + + d1 = kv1->hint->v.gh.d; + d2 = kv2->hint->v.gh.d; + + if (d1 < d2) + return (-1); + else if (d1 > d2) + return (+1); + else + return (0); + } + + if (!key1_read) { + errno = 0; + d1 = bwstod(kv1->k, &empty1); + err1 = errno; + } + + if (!key2_read) { + errno = 0; + d2 = bwstod(kv2->k, &empty2); + err2 = errno; + } + + /* Non-value case: */ + if (empty1) + return (empty2 ? 0 : -1); + else if (empty2) + return (+1); + + /* NAN case */ + if (is_nan(d1)) + return (is_nan(d2) ? cmp_nans(d1, d2) : -1); + else if (is_nan(d2)) + return (+1); + + /* Infinities */ + if (err1 == ERANGE || err2 == ERANGE) { + /* Minus infinity case */ + if (huge_minus(d1, err1)) { + if (huge_minus(d2, err2)) { + if (d1 < d2) + return (-1); + if (d1 > d2) + return (+1); + return (0); + } else + return (-1); + + } else if (huge_minus(d2, err2)) { + if (huge_minus(d1, err1)) { + if (d1 < d2) + return (-1); + if (d1 > d2) + return (+1); + return (0); + } else + return (+1); + } + + /* Plus infinity case */ + if (huge_plus(d1, err1)) { + if (huge_plus(d2, err2)) { + if (d1 < d2) + return (-1); + if (d1 > d2) + return (+1); + return (0); + } else + return (+1); + } else if (huge_plus(d2, err2)) { + if (huge_plus(d1, err1)) { + if (d1 < d2) + return (-1); + if (d1 > d2) + return (+1); + return (0); + } else + return (-1); + } + } + + if (d1 < d2) + return (-1); + if (d1 > d2) + return (+1); + + return (0); +} + +/* + * Implements month sort (-M). + */ +static int +monthcoll(struct key_value *kv1, struct key_value *kv2, size_t offset __unused) +{ + int val1, val2; + bool key1_read, key2_read; + + val1 = val2 = 0; + key1_read = key2_read = false; + + if (debug_sort) { + bwsprintf(stdout, kv1->k, "; k1=<", ">"); + bwsprintf(stdout, kv2->k, "; k2=<", ">"); + } + + if (kv1->hint->status == HS_UNINITIALIZED) { + kv1->hint->v.Mh.m = bws_month_score(kv1->k); + key1_read = true; + kv1->hint->status = HS_INITIALIZED; + } + + if (kv2->hint->status == HS_UNINITIALIZED) { + kv2->hint->v.Mh.m = bws_month_score(kv2->k); + key2_read = true; + kv2->hint->status = HS_INITIALIZED; + } + + if (kv1->hint->status == HS_INITIALIZED) { + val1 = kv1->hint->v.Mh.m; + key1_read = true; + } + + if (kv2->hint->status == HS_INITIALIZED) { + val2 = kv2->hint->v.Mh.m; + key2_read = true; + } + + if (!key1_read) + val1 = bws_month_score(kv1->k); + if (!key2_read) + val2 = bws_month_score(kv2->k); + + if (val1 == val2) { + return (0); + } + if (val1 < val2) + return (-1); + return (+1); +} diff --git a/usr.bin/sort/coll.h b/usr.bin/sort/coll.h new file mode 100644 index 00000000000..c020e74a824 --- /dev/null +++ b/usr.bin/sort/coll.h @@ -0,0 +1,167 @@ +/* $FreeBSD$ */ + +/*- + * Copyright (C) 2009 Gabor Kovesdan + * Copyright (C) 2012 Oleg Moskalenko + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if !defined(__COLL_H__) +#define __COLL_H__ + +#include "bwstring.h" +#include "sort.h" + +/* + * Sort hint data for -n + */ +struct n_hint +{ + unsigned long long n1; + unsigned char si; + bool empty; + bool neg; +}; + +/* + * Sort hint data for -g + */ +struct g_hint +{ + double d; + bool nan; + bool notnum; +}; + +/* + * Sort hint data for -M + */ +struct M_hint +{ + int m; +}; + +/* + * Status of a sort hint object + */ +typedef enum +{ + HS_ERROR = -1, HS_UNINITIALIZED = 0, HS_INITIALIZED = 1 +} hint_status; + +/* + * Sort hint object + */ +struct key_hint +{ + hint_status status; + union + { + struct n_hint nh; + struct g_hint gh; + struct M_hint Mh; + } v; +}; + +/* + * Key value + */ +struct key_value +{ + struct bwstring *k; /* key string */ + struct key_hint hint[0]; /* key sort hint */ +}; + +/* + * Set of keys container object. + */ +struct keys_array +{ + struct key_value key[0]; +}; + +/* + * Parsed -k option data + */ +struct key_specs +{ + struct sort_mods sm; + size_t c1; + size_t c2; + size_t f1; + size_t f2; + bool pos1b; + bool pos2b; +}; + +/* + * Single entry in sort list. + */ +struct sort_list_item +{ + struct bwstring *str; + struct keys_array ka; +}; + +/* + * Function type, used to compare two list objects + */ +typedef int (*listcoll_t)(struct sort_list_item **ss1, struct sort_list_item **ss2); + +extern struct key_specs *keys; +extern size_t keys_num; + +/* + * Main localised symbols + */ +extern wchar_t symbol_decimal_point; +extern wchar_t symbol_thousands_sep; +extern wchar_t symbol_negative_sign; +extern wchar_t symbol_positive_sign; + +/* funcs */ + +cmpcoll_t get_sort_func(struct sort_mods *sm); + +struct keys_array *keys_array_alloc(void); +size_t keys_array_size(void); +void set_key_on_keys_array(struct keys_array *ka, struct bwstring *s, size_t ind); +void clean_keys_array(const struct bwstring *s, struct keys_array *ka); + +struct sort_list_item *sort_list_item_alloc(void); +void sort_list_item_set(struct sort_list_item *si, struct bwstring *str); +void sort_list_item_clean(struct sort_list_item *si); +size_t sort_list_item_size(struct sort_list_item *si); + +int preproc(struct bwstring *s, struct keys_array *ka); +int top_level_str_coll(const struct bwstring *, const struct bwstring *); +int key_coll(struct keys_array *ks1, struct keys_array *ks2, size_t offset); +int str_list_coll(struct bwstring *str1, struct sort_list_item **ss2); +int list_coll_by_str_only(struct sort_list_item **ss1, struct sort_list_item **ss2); +int list_coll(struct sort_list_item **ss1, struct sort_list_item **ss2); +int list_coll_offset(struct sort_list_item **ss1, struct sort_list_item **ss2, size_t offset); + +listcoll_t get_list_call_func(size_t offset); + +#endif /* __COLL_H__ */ diff --git a/usr.bin/sort/file.c b/usr.bin/sort/file.c new file mode 100644 index 00000000000..3d8a495ecee --- /dev/null +++ b/usr.bin/sort/file.c @@ -0,0 +1,1632 @@ +/*- + * Copyright (C) 2009 Gabor Kovesdan + * Copyright (C) 2012 Oleg Moskalenko + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include +#include +#if defined(SORT_THREADS) +#include +#endif +#include +#include +#include +#include +#include +#include +#include + +#include "coll.h" +#include "file.h" +#include "radixsort.h" + +unsigned long long free_memory = 1000000; +unsigned long long available_free_memory = 1000000; + +bool use_mmap; + +const char *tmpdir = "/var/tmp"; +const char *compress_program; + +size_t max_open_files = 16; + +/* + * How much space we read from file at once + */ +#define READ_CHUNK (4096) + +/* + * File reader structure + */ +struct file_reader +{ + struct reader_buffer rb; + FILE *file; + char *fname; + unsigned char *buffer; + unsigned char *mmapaddr; + unsigned char *mmapptr; + size_t bsz; + size_t cbsz; + size_t mmapsize; + size_t strbeg; + int fd; + char elsymb; +}; + +/* + * Structure to be used in file merge process. + */ +struct file_header +{ + struct file_reader *fr; + struct sort_list_item *si; /* current top line */ + size_t file_pos; +}; + +/* + * List elements of "cleanable" files list. + */ +struct CLEANABLE_FILE +{ + char *fn; + LIST_ENTRY(CLEANABLE_FILE) files; +}; + +/* + * List header of "cleanable" files list. + */ +static LIST_HEAD(CLEANABLE_FILES,CLEANABLE_FILE) tmp_files; + +/* + * Semaphore to protect the tmp file list. + * We use semaphore here because it is signal-safe, according to POSIX. + * And semaphore does not require pthread library. + */ +static sem_t tmp_files_sem; + +static void mt_sort(struct sort_list *list, + int (*sort_func)(void *, size_t, size_t, + int (*)(const void *, const void *)), const char* fn); + +/* + * Init tmp files list + */ +void +init_tmp_files(void) +{ + + LIST_INIT(&tmp_files); + sem_init(&tmp_files_sem, 0, 1); +} + +/* + * Save name of a tmp file for signal cleanup + */ +void +tmp_file_atexit(const char *tmp_file) +{ + + if (tmp_file) { + sem_wait(&tmp_files_sem); + struct CLEANABLE_FILE *item = + sort_malloc(sizeof(struct CLEANABLE_FILE)); + item->fn = sort_strdup(tmp_file); + LIST_INSERT_HEAD(&tmp_files, item, files); + sem_post(&tmp_files_sem); + } +} + +/* + * Clear tmp files + */ +void +clear_tmp_files(void) +{ + struct CLEANABLE_FILE *item; + + sem_wait(&tmp_files_sem); + LIST_FOREACH(item,&tmp_files,files) { + if ((item) && (item->fn)) + unlink(item->fn); + } + sem_post(&tmp_files_sem); +} + +/* + * Check whether a file is a temporary file + */ +static bool +file_is_tmp(const char* fn) +{ + struct CLEANABLE_FILE *item; + bool ret = false; + + if (fn) { + sem_wait(&tmp_files_sem); + LIST_FOREACH(item,&tmp_files,files) { + if ((item) && (item->fn)) + if (strcmp(item->fn, fn) == 0) { + ret = true; + break; + } + } + sem_post(&tmp_files_sem); + } + + return (ret); +} + +/* + * Read zero-terminated line from a file + */ +char * +read_file0_line(struct file0_reader *f0r) +{ + size_t pos = 0; + int c; + + if ((f0r->f == NULL) || feof(f0r->f)) + return (NULL); + + if (f0r->current_line && f0r->current_sz > 0) + f0r->current_line[0] = 0; + + while (!feof(f0r->f)) { + c = fgetc(f0r->f); + if (feof(f0r->f) || (c == -1)) + break; + if ((pos + 1) >= f0r->current_sz) { + size_t newsz = (f0r->current_sz + 2) * 2; + f0r->current_line = sort_realloc(f0r->current_line, + newsz); + f0r->current_sz = newsz; + } + f0r->current_line[pos] = (char)c; + if (c == 0) + break; + else + f0r->current_line[pos + 1] = 0; + ++pos; + } + + return f0r->current_line; +} + +/* + * Generate new temporary file name + */ +char * +new_tmp_file_name(void) +{ + static unsigned int tfcounter = 0; + static const char *fn = ".bsdsort."; + char *ret; + size_t sz; + + sz = strlen(tmpdir) + 1 + strlen(fn) + 32 + 1; + ret = sort_malloc(sz); + + sprintf(ret, "%s/%s%d.%u", tmpdir, fn, (int) getpid(), tfcounter++); + tmp_file_atexit(ret); + return (ret); +} + +/* + * Initialize file list + */ +void +file_list_init(struct file_list *fl, bool tmp) +{ + + if (fl) { + fl->count = 0; + fl->sz = 0; + fl->fns = NULL; + fl->tmp = tmp; + } +} + +/* + * Add a file name to the list + */ +void +file_list_add(struct file_list *fl, char *fn, bool allocate) +{ + + if (fl && fn) { + if (fl->count >= fl->sz || (fl->fns == NULL)) { + fl->sz = (fl->sz) * 2 + 1; + fl->fns = sort_realloc(fl->fns, fl->sz * + sizeof(char *)); + } + fl->fns[fl->count] = allocate ? sort_strdup(fn) : fn; + fl->count += 1; + } +} + +/* + * Populate file list from array of file names + */ +void +file_list_populate(struct file_list *fl, int argc, char **argv, bool allocate) +{ + + if (fl && argv) { + int i; + + for (i = 0; i < argc; i++) + file_list_add(fl, argv[i], allocate); + } +} + +/* + * Clean file list data and delete the files, + * if this is a list of temporary files + */ +void +file_list_clean(struct file_list *fl) +{ + + if (fl) { + if (fl->fns) { + int i; + + for (i = 0; i < fl->count; i++) { + if (fl->fns[i]) { + if (fl->tmp) + unlink(fl->fns[i]); + sort_free(fl->fns[i]); + fl->fns[i] = 0; + } + } + sort_free(fl->fns); + fl->fns = NULL; + } + fl->sz = 0; + fl->count = 0; + fl->tmp = false; + } +} + +/* + * Init sort list + */ +void +sort_list_init(struct sort_list *l) +{ + + if (l) { + l->count = 0; + l->size = 0; + l->memsize = sizeof(struct sort_list); + l->list = NULL; + } +} + +/* + * Add string to sort list + */ +void +sort_list_add(struct sort_list *l, struct bwstring *str) +{ + + if (l && str) { + size_t indx = l->count; + + if ((l->list == NULL) || (indx >= l->size)) { + int newsize = (l->size + 1) + 1024; + + l->list = sort_realloc(l->list, + sizeof(struct sort_list_item*) * newsize); + l->memsize += (newsize - l->size) * + sizeof(struct sort_list_item*); + l->size = newsize; + } + l->list[indx] = sort_list_item_alloc(); + sort_list_item_set(l->list[indx], str); + l->memsize += sort_list_item_size(l->list[indx]); + l->count += 1; + } +} + +/* + * Clean sort list data + */ +void +sort_list_clean(struct sort_list *l) +{ + + if (l) { + if (l->list) { + size_t i; + + for (i = 0; i < l->count; i++) { + struct sort_list_item *item; + + item = l->list[i]; + + if (item) { + sort_list_item_clean(item); + sort_free(item); + l->list[i] = NULL; + } + } + sort_free(l->list); + l->list = NULL; + } + l->count = 0; + l->size = 0; + l->memsize = sizeof(struct sort_list); + } +} + +/* + * Write sort list to file + */ +void +sort_list_dump(struct sort_list *l, const char *fn) +{ + + if (l && fn) { + FILE *f; + + f = openfile(fn, "w"); + if (f == NULL) + err(2, NULL); + + if (l->list) { + size_t i; + if (!(sort_opts_vals.uflag)) { + for (i = 0; i < l->count; ++i) + bwsfwrite(l->list[i]->str, f, + sort_opts_vals.zflag); + } else { + struct sort_list_item *last_printed_item = NULL; + struct sort_list_item *item; + for (i = 0; i < l->count; ++i) { + item = l->list[i]; + if ((last_printed_item == NULL) || + list_coll(&last_printed_item, &item)) { + bwsfwrite(item->str, f, sort_opts_vals.zflag); + last_printed_item = item; + } + } + } + } + + closefile(f, fn); + } +} + +/* + * Checks if the given file is sorted. Stops at the first disorder, + * prints the disordered line and returns 1. + */ +int +check(const char *fn) +{ + struct bwstring *s1, *s2, *s1disorder, *s2disorder; + struct file_reader *fr; + struct keys_array *ka1, *ka2; + int res, pos, posdisorder; + + s1 = s2 = s1disorder = s2disorder = NULL; + ka1 = ka2 = NULL; + + fr = file_reader_init(fn); + + res = 0; + pos = 1; + posdisorder = 1; + + if (fr == NULL) { + err(2, NULL); + goto end; + } + + s1 = file_reader_readline(fr); + if (s1 == NULL) + goto end; + + ka1 = keys_array_alloc(); + preproc(s1, ka1); + + s2 = file_reader_readline(fr); + if (s2 == NULL) + goto end; + + ka2 = keys_array_alloc(); + preproc(s2, ka2); + + for (;;) { + + if (debug_sort) { + bwsprintf(stdout, s2, "s1=<", ">"); + bwsprintf(stdout, s1, "s2=<", ">"); + } + int cmp = key_coll(ka2, ka1, 0); + if (debug_sort) + printf("; cmp1=%d", cmp); + + if (!cmp && sort_opts_vals.complex_sort && + !(sort_opts_vals.uflag) && !(sort_opts_vals.sflag)) { + cmp = top_level_str_coll(s2, s1); + if (debug_sort) + printf("; cmp2=%d", cmp); + } + if (debug_sort) + printf("\n"); + + if ((sort_opts_vals.uflag && (cmp <= 0)) || (cmp < 0)) { + if (!(sort_opts_vals.csilentflag)) { + s2disorder = bwsdup(s2); + posdisorder = pos; + if (debug_sort) + s1disorder = bwsdup(s1); + } + res = 1; + goto end; + } + + pos++; + + clean_keys_array(s1, ka1); + sort_free(ka1); + ka1 = ka2; + ka2 = NULL; + + bwsfree(s1); + s1 = s2; + + s2 = file_reader_readline(fr); + if (s2 == NULL) + goto end; + + ka2 = keys_array_alloc(); + preproc(s2, ka2); + } + +end: + if (ka1) { + clean_keys_array(s1, ka1); + sort_free(ka1); + } + + if (s1) + bwsfree(s1); + + if (ka2) { + clean_keys_array(s2, ka2); + sort_free(ka2); + } + + if (s2) + bwsfree(s2); + + if ((fn == NULL) || (*fn == 0) || (strcmp(fn, "-") == 0)) { + for (;;) { + s2 = file_reader_readline(fr); + if (s2 == NULL) + break; + bwsfree(s2); + } + } + + file_reader_free(fr); + + if (s2disorder) { + bws_disorder_warnx(s2disorder, fn, posdisorder); + if (s1disorder) { + bws_disorder_warnx(s1disorder, fn, posdisorder); + if (s1disorder != s2disorder) + bwsfree(s1disorder); + } + bwsfree(s2disorder); + s1disorder = NULL; + s2disorder = NULL; + } + + if (res) + exit(res); + + return (0); +} + +/* + * Opens a file. If the given filename is "-", stdout will be + * opened. + */ +FILE * +openfile(const char *fn, const char *mode) +{ + FILE *file; + + if (strcmp(fn, "-") == 0) { + return ((mode && mode[0] == 'r') ? stdin : stdout); + } else { + mode_t orig_file_mask = 0; + int is_tmp = file_is_tmp(fn); + + if (is_tmp && (mode[0] == 'w')) + orig_file_mask = umask(S_IWGRP | S_IWOTH | + S_IRGRP | S_IROTH); + + if (is_tmp && (compress_program != NULL)) { + char *cmd; + size_t cmdsz; + + cmdsz = strlen(fn) + 128; + cmd = sort_malloc(cmdsz); + + fflush(stdout); + + if (mode[0] == 'r') + snprintf(cmd, cmdsz - 1, "cat %s | %s -d", + fn, compress_program); + else if (mode[0] == 'w') + snprintf(cmd, cmdsz - 1, "%s > %s", + compress_program, fn); + else + err(2, "%s", getstr(7)); + + if ((file = popen(cmd, mode)) == NULL) + err(2, NULL); + + sort_free(cmd); + + } else + if ((file = fopen(fn, mode)) == NULL) + err(2, NULL); + + if (is_tmp && (mode[0] == 'w')) + umask(orig_file_mask); + } + + return (file); +} + +/* + * Close file + */ +void +closefile(FILE *f, const char *fn) +{ + if (f == NULL) { + ; + } else if (f == stdin) { + ; + } else if (f == stdout) { + fflush(f); + } else { + if (file_is_tmp(fn) && compress_program != NULL) { + if(pclose(f)<0) + err(2,NULL); + } else + fclose(f); + } +} + +/* + * Reads a file into the internal buffer. + */ +struct file_reader * +file_reader_init(const char *fsrc) +{ + struct file_reader *ret; + + if (fsrc == NULL) + fsrc = "-"; + + ret = sort_malloc(sizeof(struct file_reader)); + memset(ret, 0, sizeof(struct file_reader)); + + ret->elsymb = '\n'; + if (sort_opts_vals.zflag) + ret->elsymb = 0; + + ret->fname = sort_strdup(fsrc); + + if (strcmp(fsrc, "-") && (compress_program == NULL) && use_mmap) { + + do { + struct stat stat_buf; + void *addr; + size_t sz = 0; + int fd, flags; + + flags = MAP_NOCORE | MAP_NOSYNC; + addr = MAP_FAILED; + + fd = open(fsrc, O_RDONLY); + if (fd < 0) + err(2, NULL); + + if (fstat(fd, &stat_buf) < 0) { + close(fd); + break; + } + + sz = stat_buf.st_size; + +#if defined(MAP_PREFAULT_READ) + flags |= MAP_PREFAULT_READ; +#endif + + addr = mmap(NULL, sz, PROT_READ, flags, fd, 0); + if (addr == MAP_FAILED) { + close(fd); + break; + } + + ret->fd = fd; + ret->mmapaddr = addr; + ret->mmapsize = sz; + ret->mmapptr = ret->mmapaddr; + + } while (0); + } + + if (ret->mmapaddr == NULL) { + ret->file = openfile(fsrc, "r"); + if (ret->file == NULL) + err(2, NULL); + + if (strcmp(fsrc, "-")) { + ret->cbsz = READ_CHUNK; + ret->buffer = sort_malloc(ret->cbsz); + ret->bsz = 0; + ret->strbeg = 0; + + ret->bsz = fread(ret->buffer, 1, ret->cbsz, ret->file); + if (ret->bsz == 0) { + if (ferror(ret->file)) + err(2, NULL); + } + } + } + + return (ret); +} + +struct bwstring * +file_reader_readline(struct file_reader *fr) +{ + struct bwstring *ret = NULL; + + if (fr->mmapaddr) { + unsigned char *mmapend; + + mmapend = fr->mmapaddr + fr->mmapsize; + if (fr->mmapptr >= mmapend) + return (NULL); + else { + unsigned char *strend; + size_t sz; + + sz = mmapend - fr->mmapptr; + strend = memchr(fr->mmapptr, fr->elsymb, sz); + + if (strend == NULL) { + ret = bwscsbdup(fr->mmapptr, sz); + fr->mmapptr = mmapend; + } else { + ret = bwscsbdup(fr->mmapptr, strend - + fr->mmapptr); + fr->mmapptr = strend + 1; + } + } + + } else if (fr->file != stdin) { + unsigned char *strend; + size_t bsz1, remsz, search_start; + + search_start = 0; + remsz = 0; + strend = NULL; + + if (fr->bsz > fr->strbeg) + remsz = fr->bsz - fr->strbeg; + + /* line read cycle */ + for (;;) { + if (remsz > search_start) + strend = memchr(fr->buffer + fr->strbeg + + search_start, fr->elsymb, remsz - + search_start); + else + strend = NULL; + + if (strend) + break; + if (feof(fr->file)) + break; + + if (fr->bsz != fr->cbsz) + /* NOTREACHED */ + err(2, "File read software error 1"); + + if (remsz > (READ_CHUNK >> 1)) { + search_start = fr->cbsz - fr->strbeg; + fr->cbsz += READ_CHUNK; + fr->buffer = sort_realloc(fr->buffer, + fr->cbsz); + bsz1 = fread(fr->buffer + fr->bsz, 1, + READ_CHUNK, fr->file); + if (bsz1 == 0) { + if (ferror(fr->file)) + err(2, NULL); + break; + } + fr->bsz += bsz1; + remsz += bsz1; + } else { + if (remsz > 0 && fr->strbeg>0) + bcopy(fr->buffer + fr->strbeg, + fr->buffer, remsz); + + fr->strbeg = 0; + search_start = remsz; + bsz1 = fread(fr->buffer + remsz, 1, + fr->cbsz - remsz, fr->file); + if (bsz1 == 0) { + if (ferror(fr->file)) + err(2, NULL); + break; + } + fr->bsz = remsz + bsz1; + remsz = fr->bsz; + } + } + + if (strend == NULL) + strend = fr->buffer + fr->bsz; + + if ((fr->buffer + fr->strbeg <= strend) && + (fr->strbeg < fr->bsz) && (remsz>0)) + ret = bwscsbdup(fr->buffer + fr->strbeg, strend - + fr->buffer - fr->strbeg); + + fr->strbeg = (strend - fr->buffer) + 1; + + } else { + size_t len = 0; + + ret = bwsfgetln(fr->file, &len, sort_opts_vals.zflag, + &(fr->rb)); + } + + return (ret); +} + +static void +file_reader_clean(struct file_reader *fr) +{ + + if (fr) { + if (fr->mmapaddr) + munmap(fr->mmapaddr, fr->mmapsize); + + if (fr->fd) + close(fr->fd); + + if (fr->buffer) + sort_free(fr->buffer); + + if (fr->file) + if (fr->file != stdin) + closefile(fr->file, fr->fname); + + if(fr->fname) + sort_free(fr->fname); + + memset(fr, 0, sizeof(struct file_reader)); + } +} + +void +file_reader_free(struct file_reader *fr) +{ + + if (fr) { + file_reader_clean(fr); + sort_free(fr); + } +} + +int +procfile(const char *fsrc, struct sort_list *list, struct file_list *fl) +{ + struct file_reader *fr; + + fr = file_reader_init(fsrc); + if (fr == NULL) + err(2, NULL); + + /* file browse cycle */ + for (;;) { + struct bwstring *bws; + + bws = file_reader_readline(fr); + + if (bws == NULL) + break; + + sort_list_add(list, bws); + + if (list->memsize >= available_free_memory) { + char *fn; + + fn = new_tmp_file_name(); + sort_list_to_file(list, fn); + file_list_add(fl, fn, false); + sort_list_clean(list); + } + } + + file_reader_free(fr); + + return (0); +} + +/* + * Compare file headers. Files with EOF always go to the end of the list. + */ +static int +file_header_cmp(struct file_header *f1, struct file_header *f2) +{ + + if (f1 == f2) + return (0); + else { + if (f1->fr == NULL) { + return ((f2->fr == NULL) ? 0 : +1); + } else if (f2->fr == NULL) + return (-1); + else { + int ret; + + ret = list_coll(&(f1->si), &(f2->si)); + if (!ret) + return ((f1->file_pos < f2->file_pos) ? -1 : +1); + return (ret); + } + } +} + +/* + * Allocate and init file header structure + */ +static void +file_header_init(struct file_header **fh, const char *fn, size_t file_pos) +{ + + if (fh && fn) { + struct bwstring *line; + + *fh = sort_malloc(sizeof(struct file_header)); + (*fh)->file_pos = file_pos; + (*fh)->fr = file_reader_init(fn); + if ((*fh)->fr == NULL) { + perror(fn); + err(2, "%s", getstr(8)); + } + line = file_reader_readline((*fh)->fr); + if (line == NULL) { + file_reader_free((*fh)->fr); + (*fh)->fr = NULL; + (*fh)->si = NULL; + } else { + (*fh)->si = sort_list_item_alloc(); + sort_list_item_set((*fh)->si, line); + } + } +} + +/* + * Close file + */ +static void +file_header_close(struct file_header **fh) +{ + + if (fh && *fh) { + if ((*fh)->fr) { + file_reader_free((*fh)->fr); + (*fh)->fr = NULL; + } + if ((*fh)->si) { + sort_list_item_clean((*fh)->si); + sort_free((*fh)->si); + (*fh)->si = NULL; + } + sort_free(*fh); + *fh = NULL; + } +} + +/* + * Swap two array elements + */ +static void +file_header_swap(struct file_header **fh, int i1, int i2) +{ + struct file_header *tmp; + + tmp = fh[i1]; + fh[i1] = fh[i2]; + fh[i2] = tmp; +} + +/* heap algorithm ==>> */ + +/* + * See heap sort algorithm + * "Raises" last element to its right place + */ +static void +file_header_heap_swim(struct file_header **fh, int indx) +{ + + if (indx > 0) { + int parent_index; + + parent_index = (indx - 1) >> 1; + + if (file_header_cmp(fh[indx], fh[parent_index]) < 0) { + /* swap child and parent and continue */ + file_header_swap(fh, indx, parent_index); + file_header_heap_swim(fh, parent_index); + } + } +} + +/* + * Sink the top element to its correct position + */ +static void +file_header_heap_sink(struct file_header **fh, int indx, int size) +{ + int left_child_index; + int right_child_index; + + left_child_index = indx + indx + 1; + right_child_index = left_child_index + 1; + + if (left_child_index < size) { + int min_child_index; + + min_child_index = left_child_index; + + if ((right_child_index < size) && + (file_header_cmp(fh[left_child_index], + fh[right_child_index]) > 0)) + min_child_index = right_child_index; + if (file_header_cmp(fh[indx], fh[min_child_index]) > 0) { + file_header_swap(fh, indx, min_child_index); + file_header_heap_sink(fh, min_child_index, size); + } + } +} + +/* <<== heap algorithm */ + +/* + * Adds element to the "left" end + */ +static void +file_header_list_rearrange_from_header(struct file_header **fh, int size) +{ + + file_header_heap_sink(fh, 0, size); +} + +/* + * Adds element to the "right" end + */ +static void +file_header_list_push(struct file_header *f, struct file_header **fh, int size) +{ + + fh[size++] = f; + file_header_heap_swim(fh, size - 1); +} + +struct last_printed +{ + struct bwstring *str; +}; + +/* + * Prints the current line of the file + */ +static void +file_header_print(struct file_header *fh, FILE *f_out, struct last_printed *lp) +{ + + if (fh && fh->fr && f_out && fh->si && fh->si->str) { + if (sort_opts_vals.uflag) { + if ((lp->str == NULL) || (str_list_coll(lp->str, &(fh->si)))) { + bwsfwrite(fh->si->str, f_out, sort_opts_vals.zflag); + if (lp->str) + bwsfree(lp->str); + lp->str = bwsdup(fh->si->str); + } + } else + bwsfwrite(fh->si->str, f_out, sort_opts_vals.zflag); + } +} + +/* + * Read next line + */ +static void +file_header_read_next(struct file_header *fh) +{ + + if (fh && fh->fr) { + struct bwstring *tmp; + + tmp = file_reader_readline(fh->fr); + if (tmp == NULL) { + file_reader_free(fh->fr); + fh->fr = NULL; + if (fh->si) { + sort_list_item_clean(fh->si); + sort_free(fh->si); + fh->si = NULL; + } + } else { + if (fh->si == NULL) + fh->si = sort_list_item_alloc(); + sort_list_item_set(fh->si, tmp); + } + } +} + +/* + * Merge array of "files headers" + */ +static void +file_headers_merge(int fnum, struct file_header **fh, FILE *f_out) +{ + struct last_printed lp; + int i; + + memset(&lp, 0, sizeof(lp)); + + /* + * construct the initial sort structure + */ + for (i = 0; i < fnum; i++) + file_header_list_push(fh[i], fh, i); + + while (fh[0]->fr) { /* unfinished files are always in front */ + /* output the smallest line: */ + file_header_print(fh[0], f_out, &lp); + /* read a new line, if possible: */ + file_header_read_next(fh[0]); + /* re-arrange the list: */ + file_header_list_rearrange_from_header(fh, fnum); + } + + if (lp.str) + bwsfree(lp.str); +} + +/* + * Merges the given files into the output file, which can be + * stdout. + */ +static void +merge_files_array(int argc, char **argv, const char *fn_out) +{ + + if (argv && fn_out) { + struct file_header **fh; + FILE *f_out; + int i; + + f_out = openfile(fn_out, "w"); + + if (f_out == NULL) + err(2, NULL); + + fh = sort_malloc((argc + 1) * sizeof(struct file_header *)); + + for (i = 0; i < argc; i++) + file_header_init(fh + i, argv[i], (size_t) i); + + file_headers_merge(argc, fh, f_out); + + for (i = 0; i < argc; i++) + file_header_close(fh + i); + + sort_free(fh); + + closefile(f_out, fn_out); + } +} + +/* + * Shrinks the file list until its size smaller than max number of opened files + */ +static int +shrink_file_list(struct file_list *fl) +{ + + if ((fl == NULL) || (size_t) (fl->count) < max_open_files) + return (0); + else { + struct file_list new_fl; + int indx = 0; + + file_list_init(&new_fl, true); + while (indx < fl->count) { + char *fnew; + int num; + + num = fl->count - indx; + fnew = new_tmp_file_name(); + + if ((size_t) num >= max_open_files) + num = max_open_files - 1; + merge_files_array(num, fl->fns + indx, fnew); + if (fl->tmp) { + int i; + + for (i = 0; i < num; i++) + unlink(fl->fns[indx + i]); + } + file_list_add(&new_fl, fnew, false); + indx += num; + } + fl->tmp = false; /* already taken care of */ + file_list_clean(fl); + + fl->count = new_fl.count; + fl->fns = new_fl.fns; + fl->sz = new_fl.sz; + fl->tmp = new_fl.tmp; + + return (1); + } +} + +/* + * Merge list of files + */ +void +merge_files(struct file_list *fl, const char *fn_out) +{ + + if (fl && fn_out) { + while (shrink_file_list(fl)); + + merge_files_array(fl->count, fl->fns, fn_out); + } +} + +static const char * +get_sort_method_name(int sm) +{ + + if (sm == SORT_MERGESORT) + return "mergesort"; + else if (sort_opts_vals.sort_method == SORT_RADIXSORT) + return "radixsort"; + else if (sort_opts_vals.sort_method == SORT_HEAPSORT) + return "heapsort"; + else + return "quicksort"; +} + +/* + * Wrapper for qsort + */ +static int sort_qsort(void *list, size_t count, size_t elem_size, + int (*cmp_func)(const void *, const void *)) +{ + + qsort(list, count, elem_size, cmp_func); + return (0); +} + +/* + * Sort list of lines and writes it to the file + */ +void +sort_list_to_file(struct sort_list *list, const char *outfile) +{ + struct sort_mods *sm = &(keys[0].sm); + + if (!(sm->Mflag) && !(sm->Rflag) && !(sm->Vflag) && !(sm->Vflag) && + !(sm->gflag) && !(sm->hflag) && !(sm->nflag)) { + if ((sort_opts_vals.sort_method == SORT_DEFAULT) && byte_sort) + sort_opts_vals.sort_method = SORT_RADIXSORT; + + } else if (sort_opts_vals.sort_method == SORT_RADIXSORT) + err(2, "%s", getstr(9)); + + /* + * to handle stable sort and the unique cases in the + * right order, we need stable basic algorithm + */ + if (sort_opts_vals.sflag) { + switch (sort_opts_vals.sort_method){ + case SORT_MERGESORT: + break; + case SORT_RADIXSORT: + break; + case SORT_DEFAULT: + sort_opts_vals.sort_method = SORT_MERGESORT; + break; + default: + errx(2, "%s", getstr(10)); + }; + } + + if (sort_opts_vals.sort_method == SORT_DEFAULT) + sort_opts_vals.sort_method = DEFAULT_SORT_ALGORITHM; + + if (debug_sort) + printf("sort_method=%s\n", + get_sort_method_name(sort_opts_vals.sort_method)); + + switch (sort_opts_vals.sort_method){ + case SORT_RADIXSORT: + rxsort(list->list, list->count); + sort_list_dump(list, outfile); + break; + case SORT_MERGESORT: + mt_sort(list, mergesort, outfile); + break; + case SORT_HEAPSORT: + mt_sort(list, heapsort, outfile); + break; + case SORT_QSORT: + mt_sort(list, sort_qsort, outfile); + break; + default: + mt_sort(list, DEFAULT_SORT_FUNC, outfile); + break; + } +} + +/******************* MT SORT ************************/ + +#if defined(SORT_THREADS) +/* semaphore to count threads */ +static sem_t mtsem; + +/* current system sort function */ +static int (*g_sort_func)(void *, size_t, size_t, + int(*)(const void *, const void *)); + +/* + * Sort cycle thread (in multi-threaded mode) + */ +static void* +mt_sort_thread(void* arg) +{ + struct sort_list *list = arg; + + g_sort_func(list->list, list->count, sizeof(struct sort_list_item *), + (int(*)(const void *, const void *)) list_coll); + + sem_post(&mtsem); + + return (arg); +} + +/* + * Compare sub-lists. Empty sub-lists always go to the end of the list. + */ +static int +sub_list_cmp(struct sort_list *l1, struct sort_list *l2) +{ + + if (l1 == l2) + return (0); + else { + if (l1->count == 0) { + return ((l2->count == 0) ? 0 : +1); + } else if (l2->count == 0) { + return (-1); + } else { + int ret; + + ret = list_coll(&(l1->list[0]), &(l2->list[0])); + if (!ret) + return ((l1->sub_list_pos < l2->sub_list_pos) ? + -1 : +1); + return (ret); + } + } +} + +/* + * Swap two array elements + */ +static void +sub_list_swap(struct sort_list **sl, int i1, int i2) +{ + struct sort_list *tmp; + + tmp = sl[i1]; + sl[i1] = sl[i2]; + sl[i2] = tmp; +} + +/* heap algorithm ==>> */ + +/* + * See heap sort algorithm + * "Raises" last element to its right place + */ +static void +sub_list_swim(struct sort_list **sl, int indx) +{ + + if (indx > 0) { + int parent_index; + + parent_index = (indx - 1) >> 1; + + if (sub_list_cmp(sl[indx], sl[parent_index]) < 0) { + /* swap child and parent and continue */ + sub_list_swap(sl, indx, parent_index); + sub_list_swim(sl, parent_index); + } + } +} + +/* + * Sink the top element to its correct position + */ +static void +sub_list_sink(struct sort_list **sl, int indx, int size) +{ + int left_child_index; + int right_child_index; + + left_child_index = indx + indx + 1; + right_child_index = left_child_index + 1; + + if (left_child_index < size) { + int min_child_index; + + min_child_index = left_child_index; + + if ((right_child_index < size) && + (sub_list_cmp(sl[left_child_index], + sl[right_child_index]) > 0)) + min_child_index = right_child_index; + if (sub_list_cmp(sl[indx], sl[min_child_index]) > 0) { + sub_list_swap(sl, indx, min_child_index); + sub_list_sink(sl, min_child_index, size); + } + } +} + +/* <<== heap algorithm */ + +/* + * Adds element to the "right" end + */ +static void +sub_list_push(struct sort_list *s, struct sort_list **sl, int size) +{ + + sl[size++] = s; + sub_list_swim(sl, size - 1); +} + +struct last_printed_item +{ + struct sort_list_item *item; +}; + +/* + * Prints the current line of the file + */ +static void +sub_list_header_print(struct sort_list *sl, FILE *f_out, + struct last_printed_item *lp) +{ + + if (sl && sl->count && f_out && sl->list[0]->str) { + if (sort_opts_vals.uflag) { + if ((lp->item == NULL) || (list_coll(&(lp->item), + &(sl->list[0])))) { + bwsfwrite(sl->list[0]->str, f_out, + sort_opts_vals.zflag); + lp->item = sl->list[0]; + } + } else + bwsfwrite(sl->list[0]->str, f_out, + sort_opts_vals.zflag); + } +} + +/* + * Read next line + */ +static void +sub_list_next(struct sort_list *sl) +{ + + if (sl && sl->count) { + sl->list += 1; + sl->count -= 1; + } +} + +/* + * Merge sub-lists to a file + */ +static void +merge_sub_lists(struct sort_list **sl, size_t n, FILE* f_out) +{ + struct last_printed_item lp; + size_t i; + + memset(&lp,0,sizeof(lp)); + + /* construct the initial list: */ + for (i = 0; i < n; i++) + sub_list_push(sl[i], sl, i); + + while (sl[0]->count) { /* unfinished lists are always in front */ + /* output the smallest line: */ + sub_list_header_print(sl[0], f_out, &lp); + /* move to a new line, if possible: */ + sub_list_next(sl[0]); + /* re-arrange the list: */ + sub_list_sink(sl, 0, n); + } +} + +/* + * Merge sub-lists to a file + */ +static void +merge_list_parts(struct sort_list **parts, size_t n, const char *fn) +{ + FILE* f_out; + + f_out = openfile(fn,"w"); + + merge_sub_lists(parts, n, f_out); + + closefile(f_out, fn); +} + +#endif /* defined(SORT_THREADS) */ +/* + * Multi-threaded sort algorithm "driver" + */ +static void +mt_sort(struct sort_list *list, + int(*sort_func)(void *, size_t, size_t, int(*)(const void *, const void *)), + const char* fn) +{ +#if defined(SORT_THREADS) + if (nthreads < 2 || list->count < MT_SORT_THRESHOLD) { + size_t nthreads_save = nthreads; + nthreads = 1; +#endif + /* if single thread or small data, do simple sort */ + sort_func(list->list, list->count, + sizeof(struct sort_list_item *), + (int(*)(const void *, const void *)) list_coll); + sort_list_dump(list, fn); +#if defined(SORT_THREADS) + nthreads = nthreads_save; + } else { + /* multi-threaded sort */ + struct sort_list **parts; + size_t avgsize, cstart, i; + + /* array of sub-lists */ + parts = sort_malloc(sizeof(struct sort_list*) * nthreads); + cstart = 0; + avgsize = list->count / nthreads; + + /* set global system sort function */ + g_sort_func = sort_func; + + /* set sublists */ + for (i = 0; i < nthreads; ++i) { + size_t sz = 0; + + parts[i] = sort_malloc(sizeof(struct sort_list)); + parts[i]->list = list->list + cstart; + parts[i]->memsize = 0; + parts[i]->sub_list_pos = i; + + sz = (i == nthreads - 1) ? list->count - cstart : + avgsize; + + parts[i]->count = sz; + + parts[i]->size = parts[i]->count; + + cstart += sz; + } + + /* init threads counting semaphore */ + sem_init(&mtsem, 0, 0); + + /* start threads */ + for (i = 0; i < nthreads; ++i) { + pthread_t pth; + pthread_attr_t attr; + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_DETACHED); + + for (;;) { + int res = pthread_create(&pth, &attr, + mt_sort_thread, parts[i]); + + if (res >= 0) + break; + if (errno == EAGAIN) { + pthread_yield(); + continue; + } + err(2, NULL); + } + + pthread_attr_destroy(&attr); + } + + /* wait for threads completion */ + for (i = 0; i < nthreads; ++i) { + sem_wait(&mtsem); + } + /* destroy the semaphore - we do not need it anymore */ + sem_destroy(&mtsem); + + /* merge sorted sub-lists to the file */ + merge_list_parts(parts, nthreads, fn); + + /* free sub-lists data */ + for (i = 0; i < nthreads; ++i) { + sort_free(parts[i]); + } + sort_free(parts); + } +#endif /* defined(SORT_THREADS) */ +} diff --git a/usr.bin/sort/file.h b/usr.bin/sort/file.h new file mode 100644 index 00000000000..ac3f4dddf23 --- /dev/null +++ b/usr.bin/sort/file.h @@ -0,0 +1,138 @@ +/* $FreeBSD$ */ + +/*- + * Copyright (C) 2009 Gabor Kovesdan + * Copyright (C) 2012 Oleg Moskalenko + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if !defined(__SORT_FILE_H__) +#define __SORT_FILE_H__ + +#include "coll.h" +#include "sort.h" + +#define SORT_DEFAULT 0 +#define SORT_QSORT 1 +#define SORT_MERGESORT 2 +#define SORT_HEAPSORT 3 +#define SORT_RADIXSORT 4 + +#define DEFAULT_SORT_ALGORITHM SORT_HEAPSORT +#define DEFAULT_SORT_FUNC heapsort + +/* + * List of data to be sorted. + */ +struct sort_list +{ + struct sort_list_item **list; + unsigned long long memsize; + size_t count; + size_t size; + size_t sub_list_pos; +}; + +/* + * File reader object + */ +struct file_reader; + +/* + * List of files to be sorted + */ +struct file_list +{ + char **fns; + int count; + int sz; + bool tmp; +}; + +/* + * Structure for zero-separated file reading (for input files list) + */ +struct file0_reader +{ + char *current_line; + FILE *f; + size_t current_sz; +}; + +/* memory */ + +/**/ + +extern unsigned long long free_memory; +extern unsigned long long available_free_memory; + +/* Are we using mmap ? */ +extern bool use_mmap; + +/* temporary file dir */ + +extern const char *tmpdir; + +/* + * Max number of simultaneously open files (including the output file). + */ +extern size_t max_open_files; + +/* + * Compress program + */ +extern const char* compress_program; + +/* funcs */ + +struct file_reader *file_reader_init(const char *fsrc); +struct bwstring *file_reader_readline(struct file_reader *fr); +void file_reader_free(struct file_reader *fr); + +char *read_file0_line(struct file0_reader *f0r); + +void init_tmp_files(void); +void clear_tmp_files(void); +char *new_tmp_file_name(void); +void tmp_file_atexit(const char *tmp_file); + +void file_list_init(struct file_list *fl, bool tmp); +void file_list_add(struct file_list *fl, char *fn, bool allocate); +void file_list_populate(struct file_list *fl, int argc, char **argv, bool allocate); +void file_list_clean(struct file_list *fl); + +int check(const char *); +void merge_files(struct file_list *fl, const char *fn_out); +FILE *openfile(const char *, const char *); +void closefile(FILE *, const char *); +int procfile(const char *fn, struct sort_list *list, struct file_list *fl); + +void sort_list_init(struct sort_list *l); +void sort_list_add(struct sort_list *l, struct bwstring *str); +void sort_list_clean(struct sort_list *l); +void sort_list_dump(struct sort_list *l, const char *fn); + +void sort_list_to_file(struct sort_list *list, const char *outfile); + +#endif /* __SORT_FILE_H__ */ diff --git a/usr.bin/sort/mem.c b/usr.bin/sort/mem.c new file mode 100644 index 00000000000..999aea2b006 --- /dev/null +++ b/usr.bin/sort/mem.c @@ -0,0 +1,82 @@ +/*- + * Copyright (C) 2009 Gabor Kovesdan + * Copyright (C) 2012 Oleg Moskalenko + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include "mem.h" + +/* + * malloc() wrapper. + */ +void * +sort_malloc(size_t size) +{ + void *ptr; + + if ((ptr = malloc(size)) == NULL) + err(2, NULL); + return (ptr); +} + +/* + * free() wrapper. + */ +void +sort_free(const void *ptr) +{ + + if (ptr) + free(__DECONST(void *, ptr)); +} + +/* + * realloc() wrapper. + */ +void * +sort_realloc(void *ptr, size_t size) +{ + + if ((ptr = realloc(ptr, size)) == NULL) + err(2, NULL); + return (ptr); +} + +char * +sort_strdup(const char *str) +{ + char *dup; + + if ((dup = strdup(str)) == NULL) + err(2, NULL); + return (dup); +} diff --git a/contrib/tcpdump/missing/resolv6.h b/usr.bin/sort/mem.h similarity index 66% rename from contrib/tcpdump/missing/resolv6.h rename to usr.bin/sort/mem.h index ccee03e6c43..13ba4a9aa7a 100644 --- a/contrib/tcpdump/missing/resolv6.h +++ b/usr.bin/sort/mem.h @@ -1,5 +1,8 @@ -/* - * Copyright (C) 1999 WIDE Project. +/* $FreeBSD$ */ + +/*- + * Copyright (C) 2009 Gabor Kovesdan + * Copyright (C) 2012 Oleg Moskalenko * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,14 +13,11 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) @@ -27,10 +27,19 @@ * SUCH DAMAGE. */ +#if !defined(__SORT_MEM_H__) +#define __SORT_MEM_H__ + +#include +#include +#include + /* - * Resolver options for IPv6. - * XXX: this should be in an offical include file. There may be conflicts... + * mem.c */ -#ifndef HAVE_RES_USE_INET6 -#define RES_USE_INET6 0x80000000 /* use/map IPv6 in gethostbyname() */ -#endif +void *sort_malloc(size_t); +void sort_free(const void *ptr); +void *sort_realloc(void *, size_t); +char *sort_strdup(const char *); + +#endif /* __SORT_MEM_H__ */ diff --git a/usr.bin/sort/nls/C.msg b/usr.bin/sort/nls/C.msg new file mode 100644 index 00000000000..541d1d88964 --- /dev/null +++ b/usr.bin/sort/nls/C.msg @@ -0,0 +1,16 @@ +$ $FreeBSD$ +$ +$set 1 +$quote " +1 "mutually exclusive flags" +2 "extra argument not allowed with -c" +3 "Unknown feature" +4 "Wrong memory buffer specification" +5 "0 field in key specs" +6 "0 column in key specs" +7 "Wrong file mode" +8 "Cannot open file for reading" +9 "Radix sort cannot be used with these sort options" +10 "The chosen sort method cannot be used with stable and/or unique sort" +11 "Invalid key position" +12 "Usage: %s [-bcCdfigMmnrsuz] [-kPOS1[,POS2] ... ] [+POS1 [-POS2]] [-S memsize] [-T tmpdir] [-t separator] [-o outfile] [--batch-size size] [--files0-from file] [--heapsort] [--mergesort] [--radixsort] [--qsort] [--nthreads thread_no] [--human-numeric-sort] [--version-sort] [--random-sort [--random-source file]] [--compress-program program] [file ...]\n" diff --git a/usr.bin/sort/nls/hu_HU.ISO8859-2.msg b/usr.bin/sort/nls/hu_HU.ISO8859-2.msg new file mode 100644 index 00000000000..054acc6ad61 --- /dev/null +++ b/usr.bin/sort/nls/hu_HU.ISO8859-2.msg @@ -0,0 +1,16 @@ +$ $FreeBSD$ +$ +$set 1 +$quote " +1 "egymást kizáró opciók" +2 "extra argumentum a -%c opcióval" +3 "Ismeretlen funkció\n" +4 "Rossz memória puffer érték" +5 "0 mezõ a kulcsspecifikációban\n" +6 "0 oszlop a kulcsspecifikációban\n" +7 "Helytelen fájl mód" +8 "A fájl nem nyitható meg olvasásra" +9 "A radix rendezés nem használható a megadott rendezési opciókkal" +10 "A választott rendezési mód nem használható a --stable és --unique opciókkal" +11 "Érvénytelen kulcs pozíció" +12 "Használat: %s [-bcCdfigMmnrsuz] [-kPOS1[,POS2] ... ] [+POS1 [-POS2]] [-S memóriaméret] [-T ideiglenes_könyvtár] [-t elválasztó] [-o kimeneti_fájl] [--batch-size méret] [--files0-from fájl] [--heapsort] [--mergesort] [--radixsort] [--qsort] [--nthreads szálak_száma] [--human-numeric-sort] [--version-sort] [--random-sort [--random-source fájl]] [--compress-program program] [fájl ...]\n" diff --git a/usr.bin/sort/radixsort.c b/usr.bin/sort/radixsort.c new file mode 100644 index 00000000000..d6a97d1e27b --- /dev/null +++ b/usr.bin/sort/radixsort.c @@ -0,0 +1,691 @@ +/*- + * Copyright (C) 2012 Oleg Moskalenko + * Copyright (C) 2012 Gabor Kovesdan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#if defined(SORT_THREADS) +#include +#include +#endif +#include +#include +#include +#include +#include + +#include "coll.h" +#include "radixsort.h" + +#define DEFAULT_SORT_FUNC_RADIXSORT mergesort + +#define TINY_NODE(sl) ((sl)->tosort_num < 65) +#define SMALL_NODE(sl) ((sl)->tosort_num < 5) + +/* are we sorting in reverse order ? */ +static bool reverse_sort; + +/* sort sub-levels array size */ +static const size_t slsz = 256 * sizeof(struct sort_level*); + +/* one sort level structure */ +struct sort_level +{ + struct sort_level **sublevels; + struct sort_list_item **leaves; + struct sort_list_item **sorted; + struct sort_list_item **tosort; + size_t leaves_num; + size_t leaves_sz; + size_t level; + size_t real_sln; + size_t start_position; + size_t sln; + size_t tosort_num; + size_t tosort_sz; +}; + +/* stack of sort levels ready to be sorted */ +struct level_stack { + struct level_stack *next; + struct sort_level *sl; +}; + +static struct level_stack *g_ls; + +#if defined(SORT_THREADS) +/* stack guarding mutex */ +static pthread_mutex_t g_ls_mutex; + +/* counter: how many items are left */ +static size_t sort_left; +/* guarding mutex */ +static pthread_mutex_t sort_left_mutex; + +/* semaphore to count threads */ +static sem_t mtsem; + +/* + * Decrement items counter + */ +static inline void +sort_left_dec(size_t n) +{ + + pthread_mutex_lock(&sort_left_mutex); + sort_left -= n; + pthread_mutex_unlock(&sort_left_mutex); +} + +/* + * Do we have something to sort ? + */ +static inline bool +have_sort_left(void) +{ + bool ret; + + pthread_mutex_lock(&sort_left_mutex); + ret = (sort_left > 0); + pthread_mutex_unlock(&sort_left_mutex); + return (ret); +} + +#else + +#define sort_left_dec(n) + +#endif /* SORT_THREADS */ + +/* + * Push sort level to the stack + */ +static inline void +push_ls(struct sort_level* sl) +{ + struct level_stack *new_ls; + + new_ls = sort_malloc(sizeof(struct level_stack)); + new_ls->sl = sl; + +#if defined(SORT_THREADS) + if (nthreads > 1) + pthread_mutex_lock(&g_ls_mutex); +#endif + + new_ls->next = g_ls; + g_ls = new_ls; + +#if defined(SORT_THREADS) + if (nthreads > 1) + pthread_mutex_unlock(&g_ls_mutex); +#endif +} + +/* + * Pop sort level from the stack (single-threaded style) + */ +static inline struct sort_level* +pop_ls_st(void) +{ + struct sort_level *sl; + + if (g_ls) { + struct level_stack *saved_ls; + + sl = g_ls->sl; + saved_ls = g_ls; + g_ls = g_ls->next; + sort_free(saved_ls); + } else + sl = NULL; + + return (sl); +} + +/* + * Pop sort level from the stack (multi-threaded style) + */ +static inline struct sort_level* +pop_ls_mt(void) +{ + struct level_stack *saved_ls; + struct sort_level *sl; + +#if defined(SORT_THREADS) + pthread_mutex_lock(&g_ls_mutex); +#endif + + if (g_ls) { + sl = g_ls->sl; + saved_ls = g_ls; + g_ls = g_ls->next; + } else { + sl = NULL; + saved_ls = NULL; + } + +#if defined(SORT_THREADS) + pthread_mutex_unlock(&g_ls_mutex); +#endif + + sort_free(saved_ls); + + return (sl); +} + +static void +add_to_sublevel(struct sort_level *sl, struct sort_list_item *item, int indx) +{ + struct sort_level *ssl; + + ssl = sl->sublevels[indx]; + + if (ssl == NULL) { + ssl = sort_malloc(sizeof(struct sort_level)); + memset(ssl, 0, sizeof(struct sort_level)); + + ssl->level = sl->level + 1; + sl->sublevels[indx] = ssl; + + ++(sl->real_sln); + } + + if (++(ssl->tosort_num) > ssl->tosort_sz) { + ssl->tosort_sz = ssl->tosort_num + 128; + ssl->tosort = sort_realloc(ssl->tosort, + sizeof(struct sort_list_item*) * (ssl->tosort_sz)); + } + + ssl->tosort[ssl->tosort_num - 1] = item; +} + +static inline void +add_leaf(struct sort_level *sl, struct sort_list_item *item) +{ + + if (++(sl->leaves_num) > sl->leaves_sz) { + sl->leaves_sz = sl->leaves_num + 128; + sl->leaves = sort_realloc(sl->leaves, + (sizeof(struct sort_list_item*) * (sl->leaves_sz))); + } + sl->leaves[sl->leaves_num - 1] = item; +} + +static inline int +get_wc_index(struct sort_list_item *sli, size_t level) +{ + const struct bwstring *bws; + + bws = sli->ka.key[0].k; + + if ((BWSLEN(bws) > level)) + return (unsigned char) BWS_GET(bws,level); + return (-1); +} + +static void +place_item(struct sort_level *sl, size_t item) +{ + struct sort_list_item *sli; + int c; + + sli = sl->tosort[item]; + c = get_wc_index(sli, sl->level); + + if (c == -1) + add_leaf(sl, sli); + else + add_to_sublevel(sl, sli, c); +} + +static void +free_sort_level(struct sort_level *sl) +{ + + if (sl) { + if (sl->leaves) + sort_free(sl->leaves); + + if (sl->level > 0) + sort_free(sl->tosort); + + if (sl->sublevels) { + struct sort_level *slc; + size_t sln; + + sln = sl->sln; + + for (size_t i = 0; i < sln; ++i) { + slc = sl->sublevels[i]; + if (slc) + free_sort_level(slc); + } + + sort_free(sl->sublevels); + } + + sort_free(sl); + } +} + +static void +run_sort_level_next(struct sort_level *sl) +{ + struct sort_level *slc; + size_t i, sln, tosort_num; + + if (sl->sublevels) { + sort_free(sl->sublevels); + sl->sublevels = NULL; + } + + switch (sl->tosort_num){ + case 0: + goto end; + case (1): + sl->sorted[sl->start_position] = sl->tosort[0]; + sort_left_dec(1); + goto end; + case (2): + if (list_coll_offset(&(sl->tosort[0]), &(sl->tosort[1]), + sl->level) > 0) { + sl->sorted[sl->start_position++] = sl->tosort[1]; + sl->sorted[sl->start_position] = sl->tosort[0]; + } else { + sl->sorted[sl->start_position++] = sl->tosort[0]; + sl->sorted[sl->start_position] = sl->tosort[1]; + } + sort_left_dec(2); + + goto end; + default: + if (TINY_NODE(sl) || (sl->level > 15)) { + listcoll_t func; + + func = get_list_call_func(sl->level); + + sl->leaves = sl->tosort; + sl->leaves_num = sl->tosort_num; + sl->leaves_sz = sl->leaves_num; + sl->leaves = sort_realloc(sl->leaves, + (sizeof(struct sort_list_item *) * + (sl->leaves_sz))); + sl->tosort = NULL; + sl->tosort_num = 0; + sl->tosort_sz = 0; + sl->sln = 0; + sl->real_sln = 0; + if (sort_opts_vals.sflag) { + if (mergesort(sl->leaves, sl->leaves_num, + sizeof(struct sort_list_item *), + (int(*)(const void *, const void *)) func) == -1) + /* NOTREACHED */ + err(2, "Radix sort error 3"); + } else + DEFAULT_SORT_FUNC_RADIXSORT(sl->leaves, sl->leaves_num, + sizeof(struct sort_list_item *), + (int(*)(const void *, const void *)) func); + + memcpy(sl->sorted + sl->start_position, + sl->leaves, sl->leaves_num * + sizeof(struct sort_list_item*)); + + sort_left_dec(sl->leaves_num); + + goto end; + } else { + sl->tosort_sz = sl->tosort_num; + sl->tosort = sort_realloc(sl->tosort, + sizeof(struct sort_list_item*) * (sl->tosort_sz)); + } + } + + sl->sln = 256; + sl->sublevels = sort_malloc(slsz); + memset(sl->sublevels, 0, slsz); + + sl->real_sln = 0; + + tosort_num = sl->tosort_num; + for (i = 0; i < tosort_num; ++i) + place_item(sl, i); + + sort_free(sl->tosort); + sl->tosort = NULL; + sl->tosort_num = 0; + sl->tosort_sz = 0; + + if (sl->leaves_num > 1) { + if (keys_num > 1) { + if (sort_opts_vals.sflag) { + mergesort(sl->leaves, sl->leaves_num, + sizeof(struct sort_list_item *), + (int(*)(const void *, const void *)) list_coll); + } else { + DEFAULT_SORT_FUNC_RADIXSORT(sl->leaves, sl->leaves_num, + sizeof(struct sort_list_item *), + (int(*)(const void *, const void *)) list_coll); + } + } else if (!sort_opts_vals.sflag && sort_opts_vals.complex_sort) { + DEFAULT_SORT_FUNC_RADIXSORT(sl->leaves, sl->leaves_num, + sizeof(struct sort_list_item *), + (int(*)(const void *, const void *)) list_coll_by_str_only); + } + } + + sl->leaves_sz = sl->leaves_num; + sl->leaves = sort_realloc(sl->leaves, (sizeof(struct sort_list_item *) * + (sl->leaves_sz))); + + if (!reverse_sort) { + memcpy(sl->sorted + sl->start_position, sl->leaves, + sl->leaves_num * sizeof(struct sort_list_item*)); + sl->start_position += sl->leaves_num; + sort_left_dec(sl->leaves_num); + + sort_free(sl->leaves); + sl->leaves = NULL; + sl->leaves_num = 0; + sl->leaves_sz = 0; + + sln = sl->sln; + + for (i = 0; i < sln; ++i) { + slc = sl->sublevels[i]; + + if (slc) { + slc->sorted = sl->sorted; + slc->start_position = sl->start_position; + sl->start_position += slc->tosort_num; + if (SMALL_NODE(slc)) + run_sort_level_next(slc); + else + push_ls(slc); + sl->sublevels[i] = NULL; + } + } + + } else { + size_t n; + + sln = sl->sln; + + for (i = 0; i < sln; ++i) { + n = sln - i - 1; + slc = sl->sublevels[n]; + + if (slc) { + slc->sorted = sl->sorted; + slc->start_position = sl->start_position; + sl->start_position += slc->tosort_num; + if (SMALL_NODE(slc)) + run_sort_level_next(slc); + else + push_ls(slc); + sl->sublevels[n] = NULL; + } + } + + memcpy(sl->sorted + sl->start_position, sl->leaves, + sl->leaves_num * sizeof(struct sort_list_item*)); + sort_left_dec(sl->leaves_num); + } + +end: + free_sort_level(sl); +} + +/* + * Single-threaded sort cycle + */ +static void +run_sort_cycle_st(void) +{ + struct sort_level *slc; + + for (;;) { + slc = pop_ls_st(); + if (slc == NULL) { + break; + } + run_sort_level_next(slc); + } +} + +#if defined(SORT_THREADS) + +/* + * Multi-threaded sort cycle + */ +static void +run_sort_cycle_mt(void) +{ + struct sort_level *slc; + + for (;;) { + slc = pop_ls_mt(); + if (slc == NULL) { + if (have_sort_left()) { + pthread_yield(); + continue; + } + break; + } + run_sort_level_next(slc); + } +} + +/* + * Sort cycle thread (in multi-threaded mode) + */ +static void* +sort_thread(void* arg) +{ + + run_sort_cycle_mt(); + + sem_post(&mtsem); + + return (arg); +} + +#endif /* defined(SORT_THREADS) */ + +static void +run_top_sort_level(struct sort_level *sl) +{ + struct sort_level *slc; + + reverse_sort = sort_opts_vals.kflag ? keys[0].sm.rflag : + default_sort_mods->rflag; + + sl->start_position = 0; + sl->sln = 256; + sl->sublevels = sort_malloc(slsz); + memset(sl->sublevels, 0, slsz); + + for (size_t i = 0; i < sl->tosort_num; ++i) + place_item(sl, i); + + if (sl->leaves_num > 1) { + if (keys_num > 1) { + if (sort_opts_vals.sflag) { + mergesort(sl->leaves, sl->leaves_num, + sizeof(struct sort_list_item *), + (int(*)(const void *, const void *)) list_coll); + } else { + DEFAULT_SORT_FUNC_RADIXSORT(sl->leaves, sl->leaves_num, + sizeof(struct sort_list_item *), + (int(*)(const void *, const void *)) list_coll); + } + } else if (!sort_opts_vals.sflag && sort_opts_vals.complex_sort) { + DEFAULT_SORT_FUNC_RADIXSORT(sl->leaves, sl->leaves_num, + sizeof(struct sort_list_item *), + (int(*)(const void *, const void *)) list_coll_by_str_only); + } + } + + if (!reverse_sort) { + memcpy(sl->tosort + sl->start_position, sl->leaves, + sl->leaves_num * sizeof(struct sort_list_item*)); + sl->start_position += sl->leaves_num; + sort_left_dec(sl->leaves_num); + + for (size_t i = 0; i < sl->sln; ++i) { + slc = sl->sublevels[i]; + + if (slc) { + slc->sorted = sl->tosort; + slc->start_position = sl->start_position; + sl->start_position += slc->tosort_num; + push_ls(slc); + sl->sublevels[i] = NULL; + } + } + + } else { + size_t n; + + for (size_t i = 0; i < sl->sln; ++i) { + + n = sl->sln - i - 1; + slc = sl->sublevels[n]; + + if (slc) { + slc->sorted = sl->tosort; + slc->start_position = sl->start_position; + sl->start_position += slc->tosort_num; + push_ls(slc); + sl->sublevels[n] = NULL; + } + } + + memcpy(sl->tosort + sl->start_position, sl->leaves, + sl->leaves_num * sizeof(struct sort_list_item*)); + + sort_left_dec(sl->leaves_num); + } + +#if defined(SORT_THREADS) + if (nthreads < 2) { +#endif + run_sort_cycle_st(); +#if defined(SORT_THREADS) + } else { + size_t i; + + for(i = 0; i < nthreads; ++i) { + pthread_attr_t attr; + pthread_t pth; + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, + PTHREAD_DETACHED); + + for (;;) { + int res = pthread_create(&pth, &attr, + sort_thread, NULL); + if (res >= 0) + break; + if (errno == EAGAIN) { + pthread_yield(); + continue; + } + err(2, NULL); + } + + pthread_attr_destroy(&attr); + } + + for(i = 0; i < nthreads; ++i) + sem_wait(&mtsem); + } +#endif /* defined(SORT_THREADS) */ +} + +static void +run_sort(struct sort_list_item **base, size_t nmemb) +{ + struct sort_level *sl; + +#if defined(SORT_THREADS) + size_t nthreads_save = nthreads; + if (nmemb < MT_SORT_THRESHOLD) + nthreads = 1; + + if (nthreads > 1) { + pthread_mutexattr_t mattr; + + pthread_mutexattr_init(&mattr); + pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_ADAPTIVE_NP); + + pthread_mutex_init(&g_ls_mutex, &mattr); + pthread_mutex_init(&sort_left_mutex, &mattr); + + pthread_mutexattr_destroy(&mattr); + + sem_init(&mtsem, 0, 0); + + } +#endif + + sl = sort_malloc(sizeof(struct sort_level)); + memset(sl, 0, sizeof(struct sort_level)); + + sl->tosort = base; + sl->tosort_num = nmemb; + sl->tosort_sz = nmemb; + +#if defined(SORT_THREADS) + sort_left = nmemb; +#endif + + run_top_sort_level(sl); + + free_sort_level(sl); + +#if defined(SORT_THREADS) + if (nthreads > 1) { + sem_destroy(&mtsem); + pthread_mutex_destroy(&g_ls_mutex); + pthread_mutex_destroy(&sort_left_mutex); + } + nthreads = nthreads_save; +#endif +} + +void +rxsort(struct sort_list_item **base, size_t nmemb) +{ + + run_sort(base, nmemb); +} diff --git a/usr.bin/sort/radixsort.h b/usr.bin/sort/radixsort.h new file mode 100644 index 00000000000..5276d7162c5 --- /dev/null +++ b/usr.bin/sort/radixsort.h @@ -0,0 +1,38 @@ +/* $FreeBSD$ */ + +/*- + * Copyright (C) 2012 Oleg Moskalenko + * Copyright (C) 2012 Gabor Kovesdan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if !defined(__SORT_RADIX_H__) +#define __SORT_RADIX_H__ + +#include "coll.h" +#include "sort.h" + +void rxsort(struct sort_list_item **base, size_t nmemb); + +#endif /* __SORT_RADIX_H__ */ diff --git a/usr.bin/sort/sort.1.in b/usr.bin/sort/sort.1.in new file mode 100644 index 00000000000..f29c9114fee --- /dev/null +++ b/usr.bin/sort/sort.1.in @@ -0,0 +1,638 @@ +.\" $OpenBSD: sort.1,v 1.31 2007/08/21 21:22:37 millert Exp $ +.\" $FreeBSD$ +.\" +.\" Copyright (c) 1991, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" the Institute of Electrical and Electronics Engineers, Inc. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)sort.1 8.1 (Berkeley) 6/6/93 +.\" +.Dd July 3, 2012 +.Dt SORT 1 +.Os +.Sh NAME +.Nm sort +.Nd sort or merge records (lines) of text and binary files +.Sh SYNOPSIS +.Nm sort +.Bk -words +.Op Fl bcCdfghiRMmnrsuVz +.Sm off +.Op Fl k\ \& Ar field1 Op , Ar field2 +.Sm on +.Op Fl S Ar memsize +.Ek +.Op Fl T Ar dir +.Op Fl t Ar char +.Op Fl o Ar output +.Op Ar file ... +.Nm sort +.Fl Fl help +.Nm sort +.Fl Fl version +.Sh DESCRIPTION +The +.Nm +utility sorts text and binary files by lines. +A line is a record separated from the subsequent record by a +newline (default) or NUL \'\\0\' character (-z option). +A record can contain any printable or unprintable characters. +Comparisons are based on one or more sort keys extracted from +each line of input, and are performed lexicographically, +according to the current locale's collating rules and the +specified command-line options that can tune the actual +sorting behavior. +By default, if keys are not given, +.Nm +uses entire lines for comparison. +.Pp +The command line options are as follows: +.Bl -tag -width Ds +.It Fl c, Fl Fl check, Fl C, Fl Fl check=silent|quiet +Check that the single input file is sorted. +If the file is not sorted, +.Nm +produces the appropriate error messages and exits with code 1, +otherwise returns 0. +If +.Fl C +or +.Fl Fl check=silent +is specified, +.Nm +produces no output. +This is a "silent" version of +.Fl c. +.It Fl m , Fl Fl merge +Merge only. +The input files are assumed to be pre-sorted. +If they are not sorted the output order is undefined. +.It Fl o Ar output , Fl Fl output Ns = Ns Ar output +Print the output to the +.Ar output +file instead of the standard output. +.It Fl S Ar size, Fl Fl buffer-size Ns = Ns Ar size +Use +.Ar size +for the maximum size of the memory buffer. +Size modifiers %,b,K,M,G,T,P,E,Z,Y can be used. +If a memory limit is not explicitly specified, +.Nm +takes up to about 90% of available memory. +If the file size is too big to fit into the memory buffer, +the temporary disk files are used to perform the sorting. +.It Fl T Ar dir , Fl Fl temporary-directory Ns = Ns Ar dir +Store temporary files in the directory +.Ar dir . +The default path is the value of the environment variable +.Ev TMPDIR +or +.Pa /var/tmp +if +.Ev TMPDIR +is not defined. +.It Fl u , Fl Fl unique +Unique keys. +Suppress all lines that have a key that is equal to an already +processed one. +This option, similarly to +.Fl s , +implies a stable sort. +If used with +.Fl c +or +.Fl C , +.Nm +also checks that there are no lines with duplicate keys. +.It Fl s +Stable sort. +This option maintains the original record order of records that have +and equal key. +This is a non-standard feature, but it is widely accepted and used. +.It Fl Fl version +Print the version and silently exits. +.It Fl Fl help +Print the help text and silently exits. +.El +.Pp +The following options override the default ordering rules. +When ordering options appear independently of key field +specifications, they apply globally to all sort keys. +When attached to a specific key (see +.Fl k ) , +the ordering options override all global ordering options for +the key they are attahced to. +.Bl -tag -width indent +.It Fl b, Fl Fl ignore-leading-blanks +Ignore leading blank characters when comparing lines. +.It Fl d , Fl Fl dictionary-order +Consider only blank spaces and alphanumeric characters in comparisons. +.It Fl f , Fl Fl ignore-case +Convert all lowercase characters to their uppercase equivalent +before comparison, that is, perform case-independent sorting. +.It Fl g, Fl Fl general-numeric-sort, Fl Fl sort=general-numeric +Sort by general numerical value. +As opposed to +.Fl n , +this option handles general floating points, which have a much +permissive format than those allowed by +. Fl n , +but it has a significant performance drawback. +.It Fl h, Fl Fl human-numeric-sort, Fl Fl sort=human-numeric +Sort by numerical value, but take into account the SI suffix, +if present. +Sort first by numeric sign (negative, zero, or +positive); then by SI suffix (either empty, or `k' or `K', or one +of `MGTPEZY', in that order); and finally by numeric value. +The SI suffix must immediately follow the number. +For example, '12345K' sorts before '1M', because M is "larger" than K. +This sort option is useful for sorting the output of a single invocation +of 'df' command with +.Fl h +or +.Fl H +options (human-readable). +.It Fl i , Fl Fl ignore-nonprinting +Ignore all non-printable characters. +.It Fl M, Fl Fl month-sort, Fl Fl sort=month +Sort by month abbreviations. +Unknown strings are considered smaller than the month names. +.It Fl n , Fl Fl numeric-sort, Fl Fl sort=numeric +Sort fields numerically by arithmetic value. +Fields are supposed to have optional blanks in the beginning, an +optional minus sign, zero or more digits (including decimal point and +possible thousand separators). +.It Fl R, Fl Fl random-sort, Fl Fl sort=random +Sort by a random order. +This is a random permutation of the inputs except that +the equal keys sort together. +It is implemented by hashing the input keys and sorting +the hash values. +The hash function is choosen randomly. +The hash function is randomized by +.Cm /dev/random +content, or by file content if it is specified by +.Fl Fl random-source . +Even if multiple sort fields are specified, +the same random hash function is used for all of them. +.It Fl r , Fl Fl reverse +Sort in reverse order. +.It Fl V, Fl Fl version-sort +Sort version numbers. +The input lines are treated as file names in form +PREFIX VERSION SUFFIX, where SUFFIX matches the regular expression +"(\.([A-Za-z~][A-Za-z0-9~]*)?)*". +The files are compared by their prefixes and versions (leading +zeros are ignored in version numbers, see example below). +If an input string does not match the pattern, then it is compared +using the byte compare function. +All string comparisions are performed in C locale, the locale +environment setting is ignored. +.Bl -tag -width indent +.It Example: +.It $ ls sort* | sort -V +.It sort-1.022.tgz +.It sort-1.23.tgz +.It sort-1.23.1.tgz +.It sort-1.024.tgz +.It sort-1.024.003. +.It sort-1.024.003.tgz +.It sort-1.024.07.tgz +.It sort-1.024.009.tgz +.El +.El +.Pp +The treatment of field separators can be altered using these options: +.Bl -tag -width indent +.It Fl b , Fl Fl ignore-leading-blanks +Ignore leading blank space when determining the start +and end of a restricted sort key (see +.Fl k +). +If +.Fl b +is specified before the first +.Fl k +option, it applies globally to all key specifications. +Otherwise, +.Fl b +can be attached independently to each +.Ar field +argument of the key specifications. +.Fl b . +.It Xo +.Sm off +.Fl k\ \& Ar field1 Op , Ar field2 , Fl Fl key Ns = Ns Ar field1 Op , Ar field2 +.Sm on +.Xc +Define a restricted sort key that has the starting position +.Ar field1 , +and optional ending position +.Ar field2 +of a key field. +The +.Fl k +option may be specified multiple times, +in which case subsequent keys are compared when earlier keys compare equal. +The +.Fl k +option replaces the obsolete options +.Cm \(pl Ns Ar pos1 +and +.Fl Ns Ar pos2 , +but the old notation is also supported. +.It Fl t Ar char , Fl Fl field-separator Ns = Ns Ar char +Use +.Ar char +as a field separator character. +The initial +.Ar char +is not considered to be part of a field when determining key offsets. +Each occurrence of +.Ar char +is significant (for example, +.Dq Ar charchar +delimits an empty field). +If +.Fl t +is not specified, the default field separator is a sequence of +blank space characters, and consecutive blank spaces do +.Em not +delimit an empty field, however, the initial blank space +.Em is +considered part of a field when determining key offsets. +To use NUL as field separator, use +.Fl t +\'\\0\'. +.It Fl z , Fl Fl zero-terminated +Use NUL as record separator. +By default, records in the files are supposed to be separated by +the newline characters. +With this option, NUL (\'\\0\') is used as a record separator character. +.El +.Pp +Other options: +.Bl -tag -width indent +.It Fl Fl batch-size Ns = Ns Ar num +Specify maximum number of files that can be opened by +.Nm +at once. +This option affects behavior when having many input files or using +temporary files. +The default value is 16. +.It Fl Fl compress-program Ns = Ns Ar PROGRAM +Use PROGRAM to compress temporary files. +PROGRAM must compress standard input to standard output, when called +without arguments. +When called with argument +.Fl d +it must decompress standard input to standard output. +If PROGRAM fails, +.Nm +must exit with error. +An example of PROGRAM that can be used here is bzip2. +.It Fl Fl random-source Ns = Ns Ar filename +In random sort, the file content is used as the source of the 'seed' data +for the hash function choice. +Two invocations of random sort with the same seed data will use +the same hash function and will produce the same result if the input is +also identical. +By default, file +.Cm /dev/random +is used. +.It Fl Fl debug +Print some extra information about the sorting process to the +standard output. +%%THREADS%%.It Fl Fl parallel +%%THREADS%%Set the maximum number of execution threads. +%%THREADS%%Default number equals to the number of CPUs. +.It Fl Fl files0-from Ns = Ns Ar filename +Take the input file list from the file +.Ar filename. +The file names must be separated by NUL +(like the output produced by the command "find ... -print0"). +.It Fl Fl radixsort +Try to use radix sort, if the sort specifications allow. +The radix sort can only be used for trivial locales (C and POSIX), +and it cannot be used for numeric or month sort. +Radix sort is very fast and stable. +.It Fl Fl mergesort +Use mergesort. +This is a universal algorithm that can always be used, +but it is not always the fastest. +.It Fl Fl qsort +Try to use quick sort, if the sort specifications allow. +This sort algorithm cannot be used with +.Fl u +and +.Fl s . +.It Fl Fl heapsort +Try to use heap sort, if the sort specifications allow. +This sort algorithm cannot be used with +.Fl u +and +.Fl s . +.It Fl Fl mmap +Try to use file memory mapping system call. +It may increase speed in some cases. +.El +.Pp +The following operands are available: +.Bl -tag -width indent +.It Ar file +The pathname of a file to be sorted, merged, or checked. +If no +.Ar file +operands are specified, or if a +.Ar file +operand is +.Fl , +the standard input is used. +.El +.Pp +A field is defined as a maximal sequence of characters other than the +field separator and record separator (newline by default). +Initial blank spaces are included in the field unless +.Fl b +has been specified; +the first blank space of a sequence of blank spaces acts as the field +separator and is included in the field (unless +.Fl t +is specified). +For example, all blank spaces at the beginning of a line are +considered to be part of the first field. +.Pp +Fields are specified by the +.Sm off +.Fl k\ \& Ar field1 Op , Ar field2 +.Sm on +command-line option. +If +.Ar field2 +is missing, the end of the key defaults to the end of the line. +.Pp +The arguments +.Ar field1 +and +.Ar field2 +have the form +.Em m.n +.Em (m,n > 0) +and can be followed by one or more of the modifiers +.Cm b , d , f , i , +.Cm n , g , M +and +.Cm r , +which correspond to the options discussed above. +When +.Cm b +is specified it applies only to +.Ar field1 +or +.Ar field2 +where it is specified while the rest of the modifiers +apply to the whole key field regardless if they are +specified only with +.Ar field1 +or +.Ar field2 +or both. +A +.Ar field1 +position specified by +.Em m.n +is interpreted as the +.Em n Ns th +character from the beginning of the +.Em m Ns th +field. +A missing +.Em \&.n +in +.Ar field1 +means +.Ql \&.1 , +indicating the first character of the +.Em m Ns th +field; if the +.Fl b +option is in effect, +.Em n +is counted from the first non-blank character in the +.Em m Ns th +field; +.Em m Ns \&.1b +refers to the first non-blank character in the +.Em m Ns th +field. +.No 1\&. Ns Em n +refers to the +.Em n Ns th +character from the beginning of the line; +if +.Em n +is greater than the length of the line, the field is taken to be empty. +.Pp +.Em n Ns th +positions are always counted from the field beginning, even if the field +is shorter than the number of specified positions. +Thus, the key can really start from a position in a subsequent field. +.Pp +A +.Ar field2 +position specified by +.Em m.n +is interpreted as the +.Em n Ns th +character (including separators) from the beginning of the +.Em m Ns th +field. +A missing +.Em \&.n +indicates the last character of the +.Em m Ns th +field; +.Em m += \&0 +designates the end of a line. +Thus the option +.Fl k Ar v.x,w.y +is synonymous with the obsolete option +.Cm \(pl Ns Ar v-\&1.x-\&1 +.Fl Ns Ar w-\&1.y ; +when +.Em y +is omitted, +.Fl k Ar v.x,w +is synonymous with +.Cm \(pl Ns Ar v-\&1.x-\&1 +.Fl Ns Ar w\&.0 . +The obsolete +.Cm \(pl Ns Ar pos1 +.Fl Ns Ar pos2 +option is still supported, except for +.Fl Ns Ar w\&.0b , +which has no +.Fl k +equivalent. +.Sh ENVIRONMENT +.Bl -tag -width Fl +.It Ev LC_COLLATE +Locale settings to be used to determine the collation for +sorting records. +.It Ev LC_CTYPE +Locale settings to be used to case conversion and classification +of characters, that is, which characters are considered +whitespaces, etc. +.It Ev LC_MESSAGES +Locale settings that determine the language of output messages +that +.Nm +prints out. +.It Ev LC_NUMERIC +Locale settings that determine the number format used in numeric sort. +.It Ev LC_TIME +Locale settings that determine the month format used in month sort. +.It Ev LC_ALL +Locale settings that override all of the above locale settings. +This environment variable can be used to set all these settings +to the same value at once. +.It Ev LANG +Used as a last resort to determine different kinds of locale-specific +behavior if neither the respective environment variable, nor +.Ev LC_ALL +are set. +%%NLS%%.It Ev NLSPATH +%%NLS%%Path to NLS catalogs. +.It Ev TMPDIR +Path to the directory in which temporary files will be stored. +Note that +.Ev TMPDIR +may be overridden by the +.Fl T +option. +.It Ev GNUSORT_NUMERIC_COMPATIBILITY +If defined +.Fl t +will not override the locale numeric symbols, that is, thousand +separators and decimal separators. +By default, if we specify +.Fl t +with the same symbol as the thousand separator or decimal point, +the symbol will be treated as the field separator. +Older behavior was less definite; the symbol was treated as both field +separator and numeric separator, simultaneously. +This environment variable enables the old behavior. +.El +.Sh FILES +.Bl -tag -width Pa -compact +.It Pa /var/tmp/.bsdsort.PID.* +Temporary files. +.It Pa /dev/random +Default seed file for the random sort. +.El +.Sh EXIT STATUS +The +.Nm +utility shall exit with one of the following values: +.Pp +.Bl -tag -width flag -compact +.It 0 +Successfully sorted the input files or if used with +.Fl c +or +.Fl C , +the input file already met the sorting criteria. +.It 1 +On disorder (or non-uniqueness) with the +.Fl c +or +.Fl C +options. +.It 2 +An error occurred. +.El +.Sh SEE ALSO +.Xr comm 1 , +.Xr join 1 , +.Xr uniq 1 . +.Sh STANDARDS +The +.Nm +utility is compliant with the +.St -p1003.1-2008 +specification. +.Pp +The flags +.Op Fl ghRMSsTVz +are extensions to the POSIX specification. +.Pp +All long options are extensions to the specification, some of them are +provided for compatibility with GNU versions and some of them are +own extensions. +.Pp +The old key notations +.Cm \(pl Ns Ar pos1 +and +.Fl Ns Ar pos2 +come from older versions of +.Nm +and are still supported but their use is highly discouraged. +.Sh HISTORY +A +.Nm +command first appeared in +.At v3 . +.Sh AUTHORS +Gabor Kovesdan , +.Pp +Oleg Moskalenko +.Sh NOTES +This implementation of +.Nm +has no limits on input line length (other than imposed by available +memory) or any restrictions on bytes allowed within lines. +.Pp +The performance depends highly on locale settings, +efficient choice of sort keys and key complexity. +The fastest sort is with locale C, on whole lines, +with option +.Fl s. +In general, locale C is the fastest, then single-byte +locales follow and multi-byte locales as the slowest but +the correct collation order is always respected. +As for the key specification, the simpler to process the +lines the faster the search will be. +.Pp +When sorting by arithmetic value, using +.Fl n +results in much better performance than +.Fl g +so its use is encouraged +whenever possible. diff --git a/usr.bin/sort/sort.c b/usr.bin/sort/sort.c new file mode 100644 index 00000000000..0668bdfc559 --- /dev/null +++ b/usr.bin/sort/sort.c @@ -0,0 +1,1335 @@ +/*- + * Copyright (C) 2009 Gabor Kovesdan + * Copyright (C) 2012 Oleg Moskalenko + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "coll.h" +#include "file.h" +#include "sort.h" + +#ifndef WITHOUT_NLS +#include +nl_catd catalog; +#endif + +#define OPTIONS "bcCdfghik:Mmno:RrsS:t:T:uVz" + +#define DEFAULT_RANDOM_SORT_SEED_FILE ("/dev/random") +#define MAX_DEFAULT_RANDOM_SEED_DATA_SIZE (1024) + +static bool need_random; +static const char *random_source = DEFAULT_RANDOM_SORT_SEED_FILE; +static const void *random_seed; +static size_t random_seed_size; + +MD5_CTX md5_ctx; + +/* + * Default messages to use when NLS is disabled or no catalogue + * is found. + */ +const char *nlsstr[] = { "", +/* 1*/"mutually exclusive flags", +/* 2*/"extra argument not allowed with -c", +/* 3*/"Unknown feature", +/* 4*/"Wrong memory buffer specification", +/* 5*/"0 field in key specs", +/* 6*/"0 column in key specs", +/* 7*/"Wrong file mode", +/* 8*/"Cannot open file for reading", +/* 9*/"Radix sort cannot be used with these sort options", +/*10*/"The chosen sort method cannot be used with stable and/or unique sort", +/*11*/"Invalid key position", +/*12*/"Usage: %s [-bcCdfigMmnrsuz] [-kPOS1[,POS2] ... ] " + "[+POS1 [-POS2]] [-S memsize] [-T tmpdir] [-t separator] " + "[-o outfile] [--batch-size size] [--files0-from file] " + "[--heapsort] [--mergesort] [--radixsort] [--qsort] " + "[--mmap] " +#if defined(SORT_THREADS) + "[--parallel thread_no] " +#endif + "[--human-numeric-sort] " + "[--version-sort] [--random-sort [--random-source file]] " + "[--compress-program program] [file ...]\n" }; + +struct sort_opts sort_opts_vals; + +bool debug_sort; +bool need_hint; + +#if defined(SORT_THREADS) +size_t ncpu = 1; +size_t nthreads = 1; +#endif + +static bool gnusort_numeric_compatibility; + +static struct sort_mods default_sort_mods_object; +struct sort_mods * const default_sort_mods = &default_sort_mods_object; + +static bool print_symbols_on_debug; + +/* + * Arguments from file (when file0-from option is used: + */ +static int argc_from_file0 = -1; +static char **argv_from_file0; + +/* + * Placeholder symbols for options which have no single-character equivalent + */ +enum +{ + SORT_OPT = CHAR_MAX + 1, + HELP_OPT, + FF_OPT, + BS_OPT, + VERSION_OPT, + DEBUG_OPT, +#if defined(SORT_THREADS) + PARALLEL_OPT, +#endif + RANDOMSOURCE_OPT, + COMPRESSPROGRAM_OPT, + QSORT_OPT, + MERGESORT_OPT, + HEAPSORT_OPT, + RADIXSORT_OPT, + MMAP_OPT +}; + +#define NUMBER_OF_MUTUALLY_EXCLUSIVE_FLAGS 6 +static const char mutually_exclusive_flags[NUMBER_OF_MUTUALLY_EXCLUSIVE_FLAGS] = { 'M', 'n', 'g', 'R', 'h', 'V' }; + +struct option long_options[] = { + { "batch-size", required_argument, NULL, BS_OPT }, + { "buffer-size", required_argument, NULL, 'S' }, + { "check", optional_argument, NULL, 'c' }, + { "check=silent|quiet", optional_argument, NULL, 'C' }, + { "compress-program", required_argument, NULL, COMPRESSPROGRAM_OPT }, + { "debug", no_argument, NULL, DEBUG_OPT }, + { "dictionary-order", no_argument, NULL, 'd' }, + { "field-separator", required_argument, NULL, 't' }, + { "files0-from", required_argument, NULL, FF_OPT }, + { "general-numeric-sort", no_argument, NULL, 'g' }, + { "heapsort", no_argument, NULL, HEAPSORT_OPT }, + { "help",no_argument, NULL, HELP_OPT }, + { "human-numeric-sort", no_argument, NULL, 'h' }, + { "ignore-leading-blanks", no_argument, NULL, 'b' }, + { "ignore-case", no_argument, NULL, 'f' }, + { "ignore-nonprinting", no_argument, NULL, 'i' }, + { "key", required_argument, NULL, 'k' }, + { "merge", no_argument, NULL, 'm' }, + { "mergesort", no_argument, NULL, MERGESORT_OPT }, + { "mmap", no_argument, NULL, MMAP_OPT }, + { "month-sort", no_argument, NULL, 'M' }, + { "numeric-sort", no_argument, NULL, 'n' }, + { "output", required_argument, NULL, 'o' }, +#if defined(SORT_THREADS) + { "parallel", required_argument, NULL, PARALLEL_OPT }, +#endif + { "qsort", no_argument, NULL, QSORT_OPT }, + { "radixsort", no_argument, NULL, RADIXSORT_OPT }, + { "random-sort", no_argument, NULL, 'R' }, + { "random-source", required_argument, NULL, RANDOMSOURCE_OPT }, + { "reverse", no_argument, NULL, 'r' }, + { "sort", required_argument, NULL, SORT_OPT }, + { "stable", no_argument, NULL, 's' }, + { "temporary-directory",required_argument, NULL, 'T' }, + { "unique", no_argument, NULL, 'u' }, + { "version", no_argument, NULL, VERSION_OPT }, + { "version-sort",no_argument, NULL, 'V' }, + { "zero-terminated", no_argument, NULL, 'z' }, + { NULL, no_argument, NULL, 0 } +}; + +void fix_obsolete_keys(int *argc, char **argv); + +/* + * Check where sort modifier is present + */ +static bool +sort_modifier_empty(struct sort_mods *sm) +{ + + if (sm == NULL) + return (true); + return (!(sm->Mflag || sm->Vflag || sm->nflag || sm->gflag || + sm->rflag || sm->Rflag || sm->hflag || sm->dflag || sm->fflag)); +} + +/* + * Print out usage text. + */ +static void +usage(bool opt_err) +{ + struct option *o; + FILE *out; + + out = stdout; + o = &(long_options[0]); + + if (opt_err) + out = stderr; + fprintf(out, getstr(12), getprogname()); + if (opt_err) + exit(2); + exit(0); +} + +/* + * Read input file names from a file (file0-from option). + */ +static void +read_fns_from_file0(const char *fn) +{ + if (fn) { + struct file0_reader f0r; + FILE *f; + + f = fopen(fn, "r"); + if (f == NULL) + err(2, NULL); + + memset(&f0r, 0, sizeof(f0r)); + f0r.f = f; + + while (!feof(f)) { + char *line = read_file0_line(&f0r); + + if (line && *line) { + ++argc_from_file0; + if (argc_from_file0 < 1) + argc_from_file0 = 1; + argv_from_file0 = sort_realloc(argv_from_file0, + argc_from_file0 * sizeof(char *)); + if (argv_from_file0 == NULL) + err(2, NULL); + argv_from_file0[argc_from_file0 - 1] = + sort_strdup(line); + } + } + closefile(f, fn); + } +} + +/* + * Check how much RAM is available for the sort. + */ +static void +set_hw_params(void) +{ +#if defined(SORT_THREADS) + size_t ncpusz; +#endif + size_t pages, psize, psz, pszsz; + + pages = psize = 0; +#if defined(SORT_THREADS) + ncpu = 1; + ncpusz = sizeof(size_t); +#endif + psz = pszsz = sizeof(size_t); + + if (sysctlbyname("vm.stats.vm.v_free_count", &pages, &psz, + NULL, 0) < 0) { + perror("vm.stats.vm.v_free_count"); + return; + } + if (sysctlbyname("vm.stats.vm.v_page_size", &psize, &pszsz, + NULL, 0) < 0) { + perror("vm.stats.vm.v_page_size"); + return; + } +#if defined(SORT_THREADS) + if (sysctlbyname("hw.ncpu", &ncpu, &ncpusz, + NULL, 0) < 0) + ncpu = 1; + else if(ncpu > 32) + ncpu = 32; + + nthreads = ncpu; +#endif + + free_memory = (unsigned long long) pages * (unsigned long long) psize; + available_free_memory = (free_memory * 9) / 10; +} + +/* + * Convert "plain" symbol to wide symbol, with default value. + */ +static void +conv_mbtowc(wchar_t *wc, const char *c, const wchar_t def) +{ + + if (wc && c) { + int res; + + res = mbtowc(wc, c, MB_CUR_MAX); + if (res < 1) + *wc = def; + } +} + +/* + * Set current locale symbols. + */ +static void +set_locale(void) +{ + struct lconv *lc; + const char *locale; + + setlocale(LC_ALL, ""); + + lc = localeconv(); + + if (lc) { + /* obtain LC_NUMERIC info */ + /* Convert to wide char form */ + conv_mbtowc(&symbol_decimal_point, lc->decimal_point, + symbol_decimal_point); + conv_mbtowc(&symbol_thousands_sep, lc->thousands_sep, + symbol_thousands_sep); + conv_mbtowc(&symbol_positive_sign, lc->positive_sign, + symbol_positive_sign); + conv_mbtowc(&symbol_negative_sign, lc->negative_sign, + symbol_negative_sign); + } + + if (getenv("GNUSORT_NUMERIC_COMPATIBILITY")) + gnusort_numeric_compatibility = true; + + locale = setlocale(LC_COLLATE, NULL); + + if (locale) { + char *tmpl; + const char *cclocale; + + tmpl = sort_strdup(locale); + cclocale = setlocale(LC_COLLATE, "C"); + if (cclocale && !strcmp(cclocale, tmpl)) + byte_sort = true; + else { + const char *pclocale; + + pclocale = setlocale(LC_COLLATE, "POSIX"); + if (pclocale && !strcmp(pclocale, tmpl)) + byte_sort = true; + } + setlocale(LC_COLLATE, tmpl); + sort_free(tmpl); + } +} + +/* + * Set directory temporary files. + */ +static void +set_tmpdir(void) +{ + char *td; + + td = getenv("TMPDIR"); + if (td != NULL) + tmpdir = sort_strdup(td); +} + +/* + * Parse -S option. + */ +static unsigned long long +parse_memory_buffer_value(const char *value) +{ + + if (value == NULL) + return (available_free_memory); + else { + char *endptr; + unsigned long long membuf; + + endptr = NULL; + errno = 0; + membuf = strtoll(value, &endptr, 10); + + if (errno != 0) { + warn("%s",getstr(4)); + membuf = available_free_memory; + } else { + switch (*endptr){ + case 'Y': + membuf *= 1024; + /* FALLTHROUGH */ + case 'Z': + membuf *= 1024; + /* FALLTHROUGH */ + case 'E': + membuf *= 1024; + /* FALLTHROUGH */ + case 'P': + membuf *= 1024; + /* FALLTHROUGH */ + case 'T': + membuf *= 1024; + /* FALLTHROUGH */ + case 'G': + membuf *= 1024; + /* FALLTHROUGH */ + case 'M': + membuf *= 1024; + /* FALLTHROUGH */ + case '\0': + case 'K': + membuf *= 1024; + /* FALLTHROUGH */ + case 'b': + break; + case '%': + membuf = (available_free_memory * membuf) / + 100; + break; + default: + fprintf(stderr, "%s: %s\n", strerror(EINVAL), + optarg); + membuf = available_free_memory; + } + } + return (membuf); + } +} + +/* + * Signal handler that clears the temporary files. + */ +static void +sig_handler(int sig __unused, siginfo_t *siginfo __unused, + void *context __unused) +{ + + clear_tmp_files(); + exit(-1); +} + +/* + * Set signal handler on panic signals. + */ +static void +set_signal_handler(void) +{ + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sa.sa_sigaction = &sig_handler; + sa.sa_flags = SA_SIGINFO; + + if (sigaction(SIGTERM, &sa, NULL) < 0) { + perror("sigaction"); + return; + } + if (sigaction(SIGHUP, &sa, NULL) < 0) { + perror("sigaction"); + return; + } + if (sigaction(SIGINT, &sa, NULL) < 0) { + perror("sigaction"); + return; + } + if (sigaction(SIGQUIT, &sa, NULL) < 0) { + perror("sigaction"); + return; + } + if (sigaction(SIGABRT, &sa, NULL) < 0) { + perror("sigaction"); + return; + } + if (sigaction(SIGBUS, &sa, NULL) < 0) { + perror("sigaction"); + return; + } + if (sigaction(SIGSEGV, &sa, NULL) < 0) { + perror("sigaction"); + return; + } + if (sigaction(SIGUSR1, &sa, NULL) < 0) { + perror("sigaction"); + return; + } + if (sigaction(SIGUSR2, &sa, NULL) < 0) { + perror("sigaction"); + return; + } +} + +/* + * Print "unknown" message and exit with status 2. + */ +static void +unknown(const char *what) +{ + + errx(2, "%s: %s", getstr(3), what); +} + +/* + * Check whether contradictory input options are used. + */ +static void +check_mutually_exclusive_flags(char c, bool *mef_flags) +{ + int fo_index, mec; + bool found_others, found_this; + + found_others = found_this =false; + fo_index = 0; + + for (int i = 0; i < NUMBER_OF_MUTUALLY_EXCLUSIVE_FLAGS; i++) { + mec = mutually_exclusive_flags[i]; + + if (mec != c) { + if (mef_flags[i]) { + if (found_this) + errx(1, "%c:%c: %s", c, mec, getstr(1)); + found_others = true; + fo_index = i; + } + } else { + if (found_others) + errx(1, "%c:%c: %s", c, mutually_exclusive_flags[fo_index], getstr(1)); + mef_flags[i] = true; + found_this = true; + } + } +} + +/* + * Initialise sort opts data. + */ +static void +set_sort_opts(void) +{ + + memset(&default_sort_mods_object, 0, + sizeof(default_sort_mods_object)); + memset(&sort_opts_vals, 0, sizeof(sort_opts_vals)); + default_sort_mods_object.func = + get_sort_func(&default_sort_mods_object); +} + +/* + * Set a sort modifier on a sort modifiers object. + */ +static bool +set_sort_modifier(struct sort_mods *sm, int c) +{ + + if (sm) { + switch (c){ + case 'b': + sm->bflag = true; + break; + case 'd': + sm->dflag = true; + break; + case 'f': + sm->fflag = true; + break; + case 'g': + sm->gflag = true; + need_hint = true; + break; + case 'i': + sm->iflag = true; + break; + case 'R': + sm->Rflag = true; + need_random = true; + break; + case 'M': + initialise_months(); + sm->Mflag = true; + need_hint = true; + break; + case 'n': + sm->nflag = true; + need_hint = true; + print_symbols_on_debug = true; + break; + case 'r': + sm->rflag = true; + break; + case 'V': + sm->Vflag = true; + break; + case 'h': + sm->hflag = true; + need_hint = true; + print_symbols_on_debug = true; + break; + default: + return false; + } + sort_opts_vals.complex_sort = true; + sm->func = get_sort_func(sm); + } + return (true); +} + +/* + * Parse POS in -k option. + */ +static int +parse_pos(const char *s, struct key_specs *ks, bool *mef_flags, bool second) +{ + regmatch_t pmatch[4]; + regex_t re; + char *c, *f; + const char *sregexp = "^([0-9]+)(\\.[0-9]+)?([bdfirMngRhV]+)?$"; + size_t len, nmatch; + int ret; + + ret = -1; + nmatch = 4; + c = f = NULL; + + if (regcomp(&re, sregexp, REG_EXTENDED) != 0) + return (-1); + + if (regexec(&re, s, nmatch, pmatch, 0) != 0) + goto end; + + if (pmatch[0].rm_eo <= pmatch[0].rm_so) + goto end; + + if (pmatch[1].rm_eo <= pmatch[1].rm_so) + goto end; + + len = pmatch[1].rm_eo - pmatch[1].rm_so; + f = sort_malloc((len + 1) * sizeof(char)); + + strncpy(f, s + pmatch[1].rm_so, len); + f[len] = '\0'; + + if (second) { + errno = 0; + ks->f2 = (size_t) strtoul(f, NULL, 10); + if (errno != 0) + errx(2, "%s: -k", strerror(errno)); + if (ks->f2 == 0) { + warn("%s",getstr(5)); + goto end; + } + } else { + errno = 0; + ks->f1 = (size_t) strtoul(f, NULL, 10); + if (errno != 0) + errx(2, "%s: -k", strerror(errno)); + if (ks->f1 == 0) { + warn("%s",getstr(5)); + goto end; + } + } + + if (pmatch[2].rm_eo > pmatch[2].rm_so) { + len = pmatch[2].rm_eo - pmatch[2].rm_so - 1; + c = sort_malloc((len + 1) * sizeof(char)); + + strncpy(c, s + pmatch[2].rm_so + 1, len); + c[len] = '\0'; + + if (second) { + errno = 0; + ks->c2 = (size_t) strtoul(c, NULL, 10); + if (errno != 0) + errx(2, "%s: -k", strerror(errno)); + } else { + errno = 0; + ks->c1 = (size_t) strtoul(c, NULL, 10); + if (errno != 0) + errx(2, "%s: -k", strerror(errno)); + if (ks->c1 == 0) { + warn("%s",getstr(6)); + goto end; + } + } + } else { + if (second) + ks->c2 = 0; + else + ks->c1 = 1; + } + + if (pmatch[3].rm_eo > pmatch[3].rm_so) { + regoff_t i = 0; + + for (i = pmatch[3].rm_so; i < pmatch[3].rm_eo; i++) { + check_mutually_exclusive_flags(s[i], mef_flags); + if (s[i] == 'b') { + if (second) + ks->pos2b = true; + else + ks->pos1b = true; + } else if (!set_sort_modifier(&(ks->sm), s[i])) + goto end; + } + } + + ret = 0; + +end: + + if (c) + sort_free(c); + if (f) + sort_free(f); + regfree(&re); + + return (ret); +} + +/* + * Parse -k option value. + */ +static int +parse_k(const char *s, struct key_specs *ks) +{ + int ret = -1; + bool mef_flags[NUMBER_OF_MUTUALLY_EXCLUSIVE_FLAGS] = + { false, false, false, false, false, false }; + + if (s && *s) { + char *sptr; + + sptr = strchr(s, ','); + if (sptr) { + size_t size1; + char *pos1, *pos2; + + size1 = sptr - s; + + if (size1 < 1) + return (-1); + pos1 = sort_malloc((size1 + 1) * sizeof(char)); + + strncpy(pos1, s, size1); + pos1[size1] = '\0'; + + ret = parse_pos(pos1, ks, mef_flags, false); + + sort_free(pos1); + if (ret < 0) + return (ret); + + pos2 = sort_strdup(sptr + 1); + ret = parse_pos(pos2, ks, mef_flags, true); + sort_free(pos2); + } else + ret = parse_pos(s, ks, mef_flags, false); + } + + return (ret); +} + +/* + * Parse POS in +POS -POS option. + */ +static int +parse_pos_obs(const char *s, int *nf, int *nc, char* sopts) +{ + regex_t re; + regmatch_t pmatch[4]; + char *c, *f; + const char *sregexp = "^([0-9]+)(\\.[0-9]+)?([A-Za-z]+)?$"; + int ret; + size_t len, nmatch; + + ret = -1; + nmatch = 4; + c = f = NULL; + *nc = *nf = 0; + + if (regcomp(&re, sregexp, REG_EXTENDED) != 0) + return (-1); + + if (regexec(&re, s, nmatch, pmatch, 0) != 0) + goto end; + + if (pmatch[0].rm_eo <= pmatch[0].rm_so) + goto end; + + if (pmatch[1].rm_eo <= pmatch[1].rm_so) + goto end; + + len = pmatch[1].rm_eo - pmatch[1].rm_so; + f = sort_malloc((len + 1) * sizeof(char)); + + strncpy(f, s + pmatch[1].rm_so, len); + f[len] = '\0'; + + errno = 0; + *nf = (size_t) strtoul(f, NULL, 10); + if (errno != 0) + errx(2, "%s", getstr(11)); + + if (pmatch[2].rm_eo > pmatch[2].rm_so) { + len = pmatch[2].rm_eo - pmatch[2].rm_so - 1; + c = sort_malloc((len + 1) * sizeof(char)); + + strncpy(c, s + pmatch[2].rm_so + 1, len); + c[len] = '\0'; + + errno = 0; + *nc = (size_t) strtoul(c, NULL, 10); + if (errno != 0) + errx(2, "%s", getstr(11)); + } + + if (pmatch[3].rm_eo > pmatch[3].rm_so) { + + len = pmatch[3].rm_eo - pmatch[3].rm_so; + + strncpy(sopts, s + pmatch[3].rm_so, len); + sopts[len] = '\0'; + } + + ret = 0; + +end: + if (c) + sort_free(c); + if (f) + sort_free(f); + regfree(&re); + + return (ret); +} + +/* + * "Translate" obsolete +POS1 -POS2 syntax into new -kPOS1,POS2 syntax + */ +void +fix_obsolete_keys(int *argc, char **argv) +{ + char sopt[129]; + + for (int i = 1; i < *argc; i++) { + char *arg1; + + arg1 = argv[i]; + + if (strlen(arg1) > 1 && arg1[0] == '+') { + int c1, f1; + char sopts1[128]; + + sopts1[0] = 0; + c1 = f1 = 0; + + if (parse_pos_obs(arg1 + 1, &f1, &c1, sopts1) < 0) + continue; + else { + f1 += 1; + c1 += 1; + if (i + 1 < *argc) { + char *arg2 = argv[i + 1]; + + if (strlen(arg2) > 1 && + arg2[0] == '-') { + int c2, f2; + char sopts2[128]; + + sopts2[0] = 0; + c2 = f2 = 0; + + if (parse_pos_obs(arg2 + 1, + &f2, &c2, sopts2) >= 0) { + if (c2 > 0) + f2 += 1; + sprintf(sopt, "-k%d.%d%s,%d.%d%s", + f1, c1, sopts1, f2, c2, sopts2); + argv[i] = sort_strdup(sopt); + for (int j = i + 1; j + 1 < *argc; j++) + argv[j] = argv[j + 1]; + *argc -= 1; + continue; + } + } + } + sprintf(sopt, "-k%d.%d", f1, c1); + argv[i] = sort_strdup(sopt); + } + } + } +} + +/* + * Set random seed + */ +static void +set_random_seed(void) +{ + if (need_random) { + + if (strcmp(random_source, DEFAULT_RANDOM_SORT_SEED_FILE) == 0) { + FILE* fseed; + MD5_CTX ctx; + char rsd[MAX_DEFAULT_RANDOM_SEED_DATA_SIZE]; + size_t sz = 0; + + fseed = openfile(random_source, "r"); + while (!feof(fseed)) { + int cr; + + cr = fgetc(fseed); + if (cr == EOF) + break; + + rsd[sz++] = (char) cr; + + if (sz >= MAX_DEFAULT_RANDOM_SEED_DATA_SIZE) + break; + } + + closefile(fseed, random_source); + + MD5Init(&ctx); + MD5Update(&ctx, rsd, sz); + + random_seed = MD5End(&ctx, NULL); + random_seed_size = strlen(random_seed); + + } else { + MD5_CTX ctx; + char *b; + + MD5Init(&ctx); + b = MD5File(random_source, NULL); + if (b == NULL) + err(2, NULL); + + random_seed = b; + random_seed_size = strlen(b); + } + + MD5Init(&md5_ctx); + if(random_seed_size>0) { + MD5Update(&md5_ctx, random_seed, random_seed_size); + } + } +} + +/* + * Main function. + */ +int +main(int argc, char **argv) +{ + char *outfile, *real_outfile; + int c, result; + bool mef_flags[NUMBER_OF_MUTUALLY_EXCLUSIVE_FLAGS] = + { false, false, false, false, false, false }; + + result = 0; + outfile = sort_strdup("-"); + real_outfile = NULL; + + struct sort_mods *sm = &default_sort_mods_object; + + init_tmp_files(); + + set_signal_handler(); + + set_hw_params(); + set_locale(); + set_tmpdir(); + set_sort_opts(); + +#if 0 + { + static int counter = 0; + char fn[128]; + sprintf(fn, "/var/tmp/debug.sort.%d", counter++); + FILE* f = fopen(fn, "w"); + fprintf(f, ">>sort>>"); + for (int i = 0; i < argc; i++) { + fprintf(f, "<%s>", argv[i]); + } + fprintf(f, "< 1) { + if (optarg[0] != '\\') { + errx(2, "%s: %s\n", + strerror(EINVAL), optarg); + } + optarg += 1; + if (*optarg == '0') { + *optarg = 0; + break; + } + } + sort_opts_vals.tflag = true; + sort_opts_vals.field_sep = btowc(optarg[0]); + if (sort_opts_vals.field_sep == WEOF) { + errno = EINVAL; + err(2, NULL); + } + if (!gnusort_numeric_compatibility) { + if (symbol_decimal_point == sort_opts_vals.field_sep) + symbol_decimal_point = WEOF; + if (symbol_thousands_sep == sort_opts_vals.field_sep) + symbol_thousands_sep = WEOF; + if (symbol_negative_sign == sort_opts_vals.field_sep) + symbol_negative_sign = WEOF; + if (symbol_positive_sign == sort_opts_vals.field_sep) + symbol_positive_sign = WEOF; + } + break; + case 'u': + sort_opts_vals.uflag = true; + /* stable sort for the correct unique val */ + sort_opts_vals.sflag = true; + break; + case 'z': + sort_opts_vals.zflag = true; + break; + case SORT_OPT: + if (optarg) { + if (!strcmp(optarg, "general-numeric")) + set_sort_modifier(sm, 'g'); + else if (!strcmp(optarg, "human-numeric")) + set_sort_modifier(sm, 'h'); + else if (!strcmp(optarg, "numeric")) + set_sort_modifier(sm, 'n'); + else if (!strcmp(optarg, "month")) + set_sort_modifier(sm, 'M'); + else if (!strcmp(optarg, "random")) + set_sort_modifier(sm, 'R'); + else + unknown(optarg); + } + break; +#if defined(SORT_THREADS) + case PARALLEL_OPT: + nthreads = (size_t)(atoi(optarg)); + if (nthreads < 1) + nthreads = 1; + if (nthreads > 1024) + nthreads = 1024; + break; +#endif + case QSORT_OPT: + sort_opts_vals.sort_method = SORT_QSORT; + break; + case MERGESORT_OPT: + sort_opts_vals.sort_method = SORT_MERGESORT; + break; + case MMAP_OPT: + use_mmap = true; + break; + case HEAPSORT_OPT: + sort_opts_vals.sort_method = SORT_HEAPSORT; + break; + case RADIXSORT_OPT: + sort_opts_vals.sort_method = SORT_RADIXSORT; + break; + case RANDOMSOURCE_OPT: + random_source = strdup(optarg); + break; + case COMPRESSPROGRAM_OPT: + compress_program = strdup(optarg); + break; + case FF_OPT: + read_fns_from_file0(optarg); + break; + case BS_OPT: + { + errno = 0; + long mof = strtol(optarg, NULL, 10); + if (errno != 0) + errx(2, "--batch-size: %s", + strerror(errno)); + if (mof >= 2) + max_open_files = (size_t) mof + 1; + } + break; + case VERSION_OPT: + printf("%s\n", VERSION); + exit(EXIT_SUCCESS); + /* NOTREACHED */ + break; + case DEBUG_OPT: + debug_sort = true; + break; + case HELP_OPT: + usage(false); + /* NOTREACHED */ + break; + default: + usage(true); + /* NOTREACHED */ + } + } + } + + argc -= optind; + argv += optind; + +#ifndef WITHOUT_NLS + catalog = catopen("sort", NL_CAT_LOCALE); +#endif + + if (sort_opts_vals.cflag && sort_opts_vals.mflag) + errx(1, "%c:%c: %s", 'm', 'c', getstr(1)); + +#ifndef WITHOUT_NLS + catclose(catalog); +#endif + + if (keys_num == 0) { + keys_num = 1; + keys = sort_realloc(keys, sizeof(struct key_specs)); + memset(&(keys[0]), 0, sizeof(struct key_specs)); + keys[0].c1 = 1; + keys[0].pos1b = default_sort_mods->bflag; + keys[0].pos2b = default_sort_mods->bflag; + memcpy(&(keys[0].sm), default_sort_mods, + sizeof(struct sort_mods)); + } + + for (size_t i = 0; i < keys_num; i++) { + struct key_specs *ks; + + ks = &(keys[i]); + + if (sort_modifier_empty(&(ks->sm)) && !(ks->pos1b) && + !(ks->pos2b)) { + ks->pos1b = sm->bflag; + ks->pos2b = sm->bflag; + memcpy(&(ks->sm), sm, sizeof(struct sort_mods)); + } + + ks->sm.func = get_sort_func(&(ks->sm)); + } + + if (argc_from_file0 >= 0) { + argc = argc_from_file0; + argv = argv_from_file0; + } + + if (debug_sort) { +#if defined(SORT_THREADS) + nthreads = 1; +#endif + printf("Using collate rules of %s locale\n", + setlocale(LC_COLLATE, NULL)); + if (byte_sort) + printf("Byte sort is used\n"); + if (print_symbols_on_debug) { + printf("Decimal Point: <%lc>\n", symbol_decimal_point); + if (symbol_thousands_sep) + printf("Thousands separator: <%lc>\n", + symbol_thousands_sep); + printf("Positive sign: <%lc>\n", symbol_positive_sign); + printf("Negative sign: <%lc>\n", symbol_negative_sign); + } + } + + set_random_seed(); + + /* Case when the outfile equals one of the input files: */ + if (strcmp(outfile, "-")) { + + for(int i = 0; i < argc; ++i) { + if (strcmp(argv[i], outfile) == 0) { + real_outfile = sort_strdup(outfile); + for(;;) { + char* tmp = sort_malloc(strlen(outfile) + + strlen(".tmp") + 1); + + strcpy(tmp, outfile); + strcpy(tmp + strlen(tmp), ".tmp"); + sort_free(outfile); + outfile = tmp; + if (access(outfile, F_OK) < 0) + break; + } + tmp_file_atexit(outfile); + } + } + } + +#if defined(SORT_THREADS) + if ((argc < 1) || (strcmp(outfile, "-") == 0) || (*outfile == 0)) + nthreads = 1; +#endif + + if (!sort_opts_vals.cflag && !sort_opts_vals.mflag) { + struct file_list fl; + struct sort_list list; + + sort_list_init(&list); + file_list_init(&fl, true); + + if (argc < 1) + procfile("-", &list, &fl); + else { + while (argc > 0) { + procfile(*argv, &list, &fl); + --argc; + ++argv; + } + } + + if (fl.count < 1) + sort_list_to_file(&list, outfile); + else { + if (list.count > 0) { + char *flast = new_tmp_file_name(); + + sort_list_to_file(&list, flast); + file_list_add(&fl, flast, false); + } + merge_files(&fl, outfile); + } + + file_list_clean(&fl); + + /* + * We are about to exit the program, so we can ignore + * the clean-up for speed + * + * sort_list_clean(&list); + */ + + } else if (sort_opts_vals.cflag) { + result = (argc == 0) ? (check("-")) : (check(*argv)); + } else if (sort_opts_vals.mflag) { + struct file_list fl; + + file_list_init(&fl, false); + file_list_populate(&fl, argc, argv, true); + merge_files(&fl, outfile); + file_list_clean(&fl); + } + + if (real_outfile) { + unlink(real_outfile); + if (rename(outfile, real_outfile) < 0) + err(2, NULL); + sort_free(real_outfile); + } + + sort_free(outfile); + + return (result); +} diff --git a/usr.bin/sort/sort.h b/usr.bin/sort/sort.h new file mode 100644 index 00000000000..525b62513e5 --- /dev/null +++ b/usr.bin/sort/sort.h @@ -0,0 +1,128 @@ +/* $FreeBSD$ */ + +/*- + * Copyright (C) 2009 Gabor Kovesdan + * Copyright (C) 2012 Oleg Moskalenko + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if !defined(__BSD_SORT_H__) +#define __BSD_SORT_H__ + +#include +#include +#include +#include +#include + +#include +#include + +#define VERSION "2.3-FreeBSD" + +#ifdef WITHOUT_NLS +#define getstr(n) nlsstr[n] +#else +#include + +extern nl_catd catalog; +#define getstr(n) catgets(catalog, 1, n, nlsstr[n]) +#endif + +extern const char *nlsstr[]; + +#if defined(SORT_THREADS) +#define MT_SORT_THRESHOLD (10000) +extern size_t ncpu; +extern size_t nthreads; +#endif + +/* + * If true, we output some debug information. + */ +extern bool debug_sort; + +/* + * MD5 context for random hash function + */ +extern MD5_CTX md5_ctx; + +/* + * sort.c + */ + +/* + * This structure holds main sort options which are NOT affecting the sort ordering. + */ +struct sort_opts +{ + wchar_t field_sep; + int sort_method; + bool cflag; + bool csilentflag; + bool kflag; + bool mflag; + bool sflag; + bool uflag; + bool zflag; + bool tflag; + bool complex_sort; +}; + +/* + * Key value structure forward declaration + */ +struct key_value; + +/* + * Cmp function + */ +typedef int (*cmpcoll_t)(struct key_value *kv1, struct key_value *kv2, size_t offset); + +/* + * This structure holds "sort modifiers" - options which are affecting the sort ordering. + */ +struct sort_mods +{ + cmpcoll_t func; + bool bflag; + bool dflag; + bool fflag; + bool gflag; + bool iflag; + bool Mflag; + bool nflag; + bool rflag; + bool Rflag; + bool Vflag; + bool hflag; +}; + +extern bool need_hint; + +extern struct sort_opts sort_opts_vals; + +extern struct sort_mods * const default_sort_mods; + +#endif /* __BSD_SORT_H__ */ diff --git a/usr.bin/sort/vsort.c b/usr.bin/sort/vsort.c new file mode 100644 index 00000000000..593e54c57b5 --- /dev/null +++ b/usr.bin/sort/vsort.c @@ -0,0 +1,265 @@ +/*- + * Copyright (C) 2012 Oleg Moskalenko + * Copyright (C) 2012 Gabor Kovesdan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include + +#include "sort.h" +#include "vsort.h" + +static inline bool +isdigit_clocale(wchar_t c) +{ + + return (c >= L'0' && c <= L'9'); +} + +static inline bool +isalpha_clocale(wchar_t c) +{ + + return ((c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z')); +} + +static inline bool +isalnum_clocale(wchar_t c) +{ + + return ((c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z') || + (c >= L'0' && c <= L'9')); +} + +/* + * Find string suffix of format: (\.[A-Za-z~][A-Za-z0-9~]*)*$ + * Set length of string before suffix. + */ +static void +find_suffix(bwstring_iterator si, bwstring_iterator se, size_t *len) +{ + wchar_t c; + size_t clen; + bool expect_alpha, sfx; + + sfx = false; + expect_alpha = false; + *len = 0; + clen = 0; + + while ((si < se) && (c = bws_get_iter_value(si))) { + if (expect_alpha) { + expect_alpha = false; + if (!isalpha_clocale(c) && (c != L'~')) + sfx = false; + } else if (c == L'.') { + expect_alpha = true; + if (!sfx) { + sfx = true; + *len = clen; + } + } else if (!isalnum_clocale(c) && (c != L'~')) + sfx = false; + + si = bws_iterator_inc(si, 1); + ++clen; + } + + /* This code must be here to make the implementation compatible + * with WORDING of GNU sort documentation. + * But the GNU sort implementation is not following its own + * documentation. GNU sort allows empty file extensions + * (just dot with nothing after); but the regular expression in + * their documentation does not allow empty file extensions. + * We chose to make our implementation compatible with GNU sort + * implementation. If they will ever fix their bug, this code + * must be uncommented. Or they may choose to fix the info page, + * then the code stays commented. + * + if (expect_alpha) + sfx = false; + */ + + if (!sfx) + *len = clen; +} + +static inline int +cmp_chars(wchar_t c1, wchar_t c2) +{ + + if (c1 == c2) + return (0); + + if (c1 == L'~') + return (-1); + if (c2 == L'~') + return (+1); + + if (isdigit_clocale(c1) || !c1) + return ((isdigit_clocale(c2) || !c2) ? 0 : -1); + + if (isdigit_clocale(c2) || !c2) + return (+1); + + if (isalpha_clocale(c1)) + return ((isalpha_clocale(c2)) ? ((int) c1 - (int) c2) : -1); + + if (isalpha_clocale(c2)) + return (+1); + + return ((int) c1 - (int) c2); +} + +static int +cmpversions(bwstring_iterator si1, bwstring_iterator se1, + bwstring_iterator si2, bwstring_iterator se2) +{ + int cmp, diff; + + while ((si1 < se1) || (si2 < se2)) { + diff = 0; + + while (((si1 < se1) && + !isdigit_clocale(bws_get_iter_value(si1))) || + ((si2 < se2) && !isdigit_clocale(bws_get_iter_value(si2)))) { + wchar_t c1, c2; + + c1 = (si1 < se1) ? bws_get_iter_value(si1) : 0; + c2 = (si2 < se2) ? bws_get_iter_value(si2) : 0; + + cmp = cmp_chars(c1, c2); + if (cmp) + return (cmp); + + if (si1 < se1) + si1 = bws_iterator_inc(si1, 1); + if (si2 < se2) + si2 = bws_iterator_inc(si2, 1); + } + + while (bws_get_iter_value(si1) == L'0') + si1 = bws_iterator_inc(si1, 1); + + while (bws_get_iter_value(si2) == L'0') + si2 = bws_iterator_inc(si2, 1); + + while (isdigit_clocale(bws_get_iter_value(si1)) && + isdigit_clocale(bws_get_iter_value(si2))) { + if (!diff) + diff = ((int)bws_get_iter_value(si1) - + (int)bws_get_iter_value(si2)); + si1 = bws_iterator_inc(si1, 1); + si2 = bws_iterator_inc(si2, 1); + } + + if (isdigit_clocale(bws_get_iter_value(si1))) + return (1); + + if (isdigit_clocale(bws_get_iter_value(si2))) + return (-1); + + if (diff) + return (diff); + } + + return (0); +} + +/* + * Compare two version strings + */ +int +vcmp(struct bwstring *s1, struct bwstring *s2) +{ + bwstring_iterator si1, si2; + wchar_t c1, c2; + size_t len1, len2, slen1, slen2; + int cmp_bytes, cmp_res; + + if (s1 == s2) + return (0); + + cmp_bytes = bwscmp(s1, s2, 0); + if (cmp_bytes == 0) + return (0); + + len1 = slen1 = BWSLEN(s1); + len2 = slen2 = BWSLEN(s2); + + if (slen1 < 1) + return (-1); + if (slen2 < 1) + return (+1); + + si1 = bws_begin(s1); + si2 = bws_begin(s2); + + c1 = bws_get_iter_value(si1); + c2 = bws_get_iter_value(si2); + + if (c1 == L'.' && (slen1 == 1)) + return (-1); + + if (c2 == L'.' && (slen2 == 1)) + return (+1); + + if (slen1 == 2 && c1 == L'.' && + bws_get_iter_value(bws_iterator_inc(si1, 1)) == L'.') + return (-1); + if (slen2 == 2 && c2 == L'.' && + bws_get_iter_value(bws_iterator_inc(si2, 1)) == L'.') + return (+1); + + if (c1 == L'.' && c2 != L'.') + return (-1); + if (c1 != L'.' && c2 == L'.') + return (+1); + + if (c1 == L'.' && c2 == L'.') { + si1 = bws_iterator_inc(si1, 1); + si2 = bws_iterator_inc(si2, 1); + } + + find_suffix(si1, bws_end(s1), &len1); + find_suffix(si2, bws_end(s2), &len2); + + if ((len1 == len2) && (bws_iterator_cmp(si1, si2, len1) == 0)) + return (cmp_bytes); + + cmp_res = cmpversions(si1, bws_iterator_inc(si1, len1), si2, + bws_iterator_inc(si2, len2)); + + if (cmp_res == 0) + cmp_res = cmp_bytes; + + return (cmp_res); +} diff --git a/contrib/tcpdump/missing/addrsize.h b/usr.bin/sort/vsort.h similarity index 70% rename from contrib/tcpdump/missing/addrsize.h rename to usr.bin/sort/vsort.h index 13db4da9159..facd075113e 100644 --- a/contrib/tcpdump/missing/addrsize.h +++ b/usr.bin/sort/vsort.h @@ -1,5 +1,8 @@ -/* - * Copyright (C) 1999 WIDE Project. +/* $FreeBSD$ */ + +/*- + * Copyright (C) 2012 Oleg Moskalenko + * Copyright (C) 2012 Gabor Kovesdan * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,14 +13,11 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) @@ -26,11 +26,12 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -#ifndef INADDRSZ -#define INADDRSZ 4 /* IPv4 T_A */ -#endif -#ifndef IN6ADDRSZ -#define IN6ADDRSZ 16 /* IPv6 T_AAAA */ -#endif +#if !defined(__VSORT_H__) +#define _VSORT_H__ +#include "bwstring.h" + +int vcmp(struct bwstring *s1, struct bwstring *s2); + +#endif diff --git a/usr.bin/stdbuf/Makefile b/usr.bin/stdbuf/Makefile new file mode 100644 index 00000000000..ccf139d3e49 --- /dev/null +++ b/usr.bin/stdbuf/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +PROG= stdbuf +SRCS= stdbuf.c + +WARNS?= 6 + +.include diff --git a/usr.bin/stdbuf/stdbuf.1 b/usr.bin/stdbuf/stdbuf.1 new file mode 100644 index 00000000000..37e569ebe57 --- /dev/null +++ b/usr.bin/stdbuf/stdbuf.1 @@ -0,0 +1,116 @@ +.\" Copyright (c) 2012 Jeremie Le Hen +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code and documentation must retain the above +.\" copyright notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd April 28, 2012 +.Dt STDBUF 1 +.Os +.Sh NAME +.Nm stdbuf +.Nd change standard streams initial buffering +.Sh SYNOPSIS +.Nm +.Op Fl e Ar bufdef +.Op Fl i Ar bufdef +.Op Fl o Ar bufdef +.Op Ar command Op ... +.Sh DESCRIPTION +.Nm +is used to change the initial buffering of standard input, +standard output and/or standard error streams for +.Ar command . +It relies on +.Xr libstdbuf 3 +which is loaded and configured by +.Nm +through environment variables. +.Pp +The options are as follows: +.Bl -tag -width Ds +.It Fl e Ar bufdef +Set initial buffering of the standard error stream for +.Ar command +as defined by +.Ar bufdef +.Pq see Sx BUFFER DEFINITION . +.It Fl i Ar bufdef +Set initial buffering of the standard input stream for +.Ar command +as defined by +.Ar bufdef +.Pq see Sx BUFFER DEFINITION . +.It Fl o Ar bufdef +Set initial buffering of the standard output stream for +.Ar command +as defined by +.Ar bufdef +.Pq see Sx BUFFER DEFINITION . +.El +.Sh BUFFER DEFINITION +Buffer definition is the same as in +.Xr libstdbuf 3 : +.Bl -tag -width size -offset indent +.It Qq 0 +unbuffered +.It Qq L +line buffered +.It Qq B +fully buffered with the default buffer size +.It Ar size +fully buffered with a buffer of +.Ar size +bytes (suffixes 'k', 'M' and 'G' are accepted) +.El +.Sh EXAMPLES +In the following example, the stdout stream of the +.Xr awk 1 +command +will be fully buffered by default because it does not refer +to a terminal. +.Nm +is used to force it to be line-buffered so +.Xr vmstat 8 Ns 's +output will not stall until the full buffer fills. +.Bd -literal -offset indent +# vmstat 1 | stdbuf -o L awk '$2 > 1 || $3 > 1' | cat -n +.Ed +.Sh SEE ALSO +.Xr libstdbuf 3 , +.Xr setvbuf 3 +.Sh HISTORY +The +.Nm +utility first appeared in +.Fx 8.4 . +.Sh AUTHORS +.An -nosplit +The original idea of the +.Nm +command comes from +.An Padraig Brady +who implemented it in the GNU coreutils. +.An Jeremie Le Hen +implemented it on +.Fx . diff --git a/usr.bin/stdbuf/stdbuf.c b/usr.bin/stdbuf/stdbuf.c new file mode 100644 index 00000000000..3831b5e3ba6 --- /dev/null +++ b/usr.bin/stdbuf/stdbuf.c @@ -0,0 +1,110 @@ +/*- + * Copyright (c) 2012 Jeremie Le Hen + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include + +#define LIBSTDBUF "/usr/lib/libstdbuf.so" +#define LIBSTDBUF32 "/usr/lib32/libstdbuf.so" + +extern char *__progname; + +static void +usage(int s) +{ + + fprintf(stderr, "Usage: %s [-e 0|L|] [-i 0|L|] [-o 0|L|] " + " [args ...]\n", __progname); + exit(s); +} + +int +main(int argc, char *argv[]) +{ + char *ibuf, *obuf, *ebuf; + char *preload0, *preload1; + int i; + + ibuf = obuf = ebuf = NULL; + while ((i = getopt(argc, argv, "e:i:o:")) != -1) { + switch (i) { + case 'e': + ebuf = optarg; + break; + case 'i': + ibuf = optarg; + break; + case 'o': + obuf = optarg; + break; + case '?': + default: + usage(1); + break; + } + } + argc -= optind; + argv += optind; + if (argc < 2) + usage(0); + + if (ibuf != NULL && setenv("_STDBUF_I", ibuf, 1) == -1) + warn("Failed to set environment variable: %s=%s", + "_STDBUF_I", ibuf); + if (obuf != NULL && setenv("_STDBUF_O", obuf, 1) == -1) + warn("Failed to set environment variable: %s=%s", + "_STDBUF_O", obuf); + if (ebuf != NULL && setenv("_STDBUF_E", ebuf, 1) == -1) + warn("Failed to set environment variable: %s=%s", + "_STDBUF_E", ebuf); + + preload0 = getenv("LD_PRELOAD"); + if (preload0 == NULL) + i = asprintf(&preload1, "LD_PRELOAD=" LIBSTDBUF); + else + i = asprintf(&preload1, "LD_PRELOAD=%s:%s", preload0, + LIBSTDBUF); + + if (i < 0 || putenv(preload1) == -1) + warn("Failed to set environment variable: LD_PRELOAD"); + + preload0 = getenv("LD_32_PRELOAD"); + if (preload0 == NULL) + i = asprintf(&preload1, "LD_32_PRELOAD=" LIBSTDBUF32); + else + i = asprintf(&preload1, "LD_32_PRELOAD=%s:%s", preload0, + LIBSTDBUF32); + + if (i < 0 || putenv(preload1) == -1) + warn("Failed to set environment variable: LD_32_PRELOAD"); + + execvp(argv[0], argv); + err(2, "%s", argv[0]); +} diff --git a/usr.bin/tftp/tftp.1 b/usr.bin/tftp/tftp.1 index 0107878c4eb..0dfcd426a8c 100644 --- a/usr.bin/tftp/tftp.1 +++ b/usr.bin/tftp/tftp.1 @@ -112,9 +112,9 @@ commands. Enable or disable debugging levels during verbose output. The value of .Ar level can be one of -.Cm packet, simple, options, +.Cm packet , simple , options , or -.Cm access. +.Cm access . .Pp .It Cm get Oo Ar host : Oc Ns Ar file Op Ar localname .It Cm get Xo diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c index 59f663da2a3..6520ae71484 100644 --- a/usr.bin/top/machine.c +++ b/usr.bin/top/machine.c @@ -176,6 +176,12 @@ char *memorynames[] = { "K Free", NULL }; +int arc_stats[7]; +char *arcnames[] = { + "K Total, ", "K MRU, ", "K MFU, ", "K Anon, ", "K Header, ", "K Other", + NULL +}; + int swap_stats[7]; char *swapnames[] = { "K Total, ", "K Used, ", "K Free, ", "% Inuse, ", "K In, ", "K Out", @@ -194,6 +200,7 @@ static struct kinfo_proc *previous_procs; static struct kinfo_proc **previous_pref; static int previous_proc_count = 0; static int previous_proc_count_max = 0; +static int arc_enabled; /* total number of io operations */ static long total_inblock; @@ -239,6 +246,7 @@ static int compare_tid(const void *a, const void *b); static const char *format_nice(const struct kinfo_proc *pp); static void getsysctl(const char *name, void *ptr, size_t len); static int swapmode(int *retavail, int *retfree); +static void update_layout(void); void toggle_pcpustats(void) @@ -246,24 +254,32 @@ toggle_pcpustats(void) if (ncpus == 1) return; + update_layout(); +} + +/* Adjust display based on ncpus and the ARC state. */ +static void +update_layout(void) +{ + + y_mem = 3; + y_arc = 4; + y_swap = 4 + arc_enabled; + y_idlecursor = 5 + arc_enabled; + y_message = 5 + arc_enabled; + y_header = 6 + arc_enabled; + y_procs = 7 + arc_enabled; + Header_lines = 7 + arc_enabled; - /* Adjust display based on ncpus */ if (pcpu_stats) { - y_mem += ncpus - 1; /* 3 */ - y_swap += ncpus - 1; /* 4 */ - y_idlecursor += ncpus - 1; /* 5 */ - y_message += ncpus - 1; /* 5 */ - y_header += ncpus - 1; /* 6 */ - y_procs += ncpus - 1; /* 7 */ - Header_lines += ncpus - 1; /* 7 */ - } else { - y_mem = 3; - y_swap = 4; - y_idlecursor = 5; - y_message = 5; - y_header = 6; - y_procs = 7; - Header_lines = 7; + y_mem += ncpus - 1; + y_arc += ncpus - 1; + y_swap += ncpus - 1; + y_idlecursor += ncpus - 1; + y_message += ncpus - 1; + y_header += ncpus - 1; + y_procs += ncpus - 1; + Header_lines += ncpus - 1; } } @@ -271,6 +287,7 @@ int machine_init(struct statics *statics, char do_unames) { int i, j, empty, pagesize; + uint64_t arc_size; size_t size; struct passwd *pw; @@ -282,6 +299,11 @@ machine_init(struct statics *statics, char do_unames) size != sizeof(smpmode)) smpmode = 0; + size = sizeof(arc_size); + if (sysctlbyname("kstat.zfs.misc.arcstats.size", &arc_size, &size, + NULL, 0) == 0 && arc_size != 0) + arc_enabled = 1; + if (do_unames) { while ((pw = getpwent()) != NULL) { if (strlen(pw->pw_name) > namelength) @@ -322,6 +344,10 @@ machine_init(struct statics *statics, char do_unames) statics->procstate_names = procstatenames; statics->cpustate_names = cpustatenames; statics->memory_names = memorynames; + if (arc_enabled) + statics->arc_names = arcnames; + else + statics->arc_names = NULL; statics->swap_names = swapnames; #ifdef ORDER statics->order_names = ordernames; @@ -356,8 +382,7 @@ machine_init(struct statics *statics, char do_unames) pcpu_cpu_states = calloc(1, size); statics->ncpus = ncpus; - if (pcpu_stats) - toggle_pcpustats(); + update_layout(); /* all done! */ return (0); @@ -408,7 +433,7 @@ get_system_info(struct system_info *si) struct loadavg sysload; int mib[2]; struct timeval boottime; - size_t bt_size; + uint64_t arc_stat, arc_stat2; int i, j; size_t size; @@ -487,6 +512,23 @@ get_system_info(struct system_info *si) swap_stats[6] = -1; } + if (arc_enabled) { + GETSYSCTL("kstat.zfs.misc.arcstats.size", arc_stat); + arc_stats[0] = arc_stat >> 10; + GETSYSCTL("vfs.zfs.mfu_size", arc_stat); + arc_stats[1] = arc_stat >> 10; + GETSYSCTL("vfs.zfs.mru_size", arc_stat); + arc_stats[2] = arc_stat >> 10; + GETSYSCTL("vfs.zfs.anon_size", arc_stat); + arc_stats[3] = arc_stat >> 10; + GETSYSCTL("kstat.zfs.misc.arcstats.hdr_size", arc_stat); + GETSYSCTL("kstat.zfs.misc.arcstats.l2_hdr_size", arc_stat2); + arc_stats[4] = arc_stat + arc_stat2 >> 10; + GETSYSCTL("kstat.zfs.misc.arcstats.other_size", arc_stat); + arc_stats[5] = arc_stat >> 10; + si->arc = arc_stats; + } + /* set arrays and strings */ if (pcpu_stats) { si->cpustates = pcpu_cpu_states; @@ -511,8 +553,8 @@ get_system_info(struct system_info *si) */ mib[0] = CTL_KERN; mib[1] = KERN_BOOTTIME; - bt_size = sizeof(boottime); - if (sysctl(mib, 2, &boottime, &bt_size, NULL, 0) != -1 && + size = sizeof(boottime); + if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) { si->boottime = boottime; } else { diff --git a/usr.bin/top/top.local.1 b/usr.bin/top/top.local.1 index f3b01460b69..864ab8d65c4 100644 --- a/usr.bin/top/top.local.1 +++ b/usr.bin/top/top.local.1 @@ -3,6 +3,7 @@ .SH DESCRIPTION OF MEMORY Mem: 9220K Active, 1M Inact, 3284K Wired, 1M Cache, 2M Buf, 1320K Free +ARC: 2048K Total, 342K MRU, 760K MFU, 272K Anon, 232K Header, 442K Other Swap: 91M Total, 79M Free, 13% Inuse, 80K In, 104K Out .TP .B K: @@ -16,6 +17,7 @@ Gigabyte .TP .B %: 1/100 +.SS Physical Memory Stats .TP .B Active: number of bytes active @@ -24,7 +26,7 @@ number of bytes active number of bytes inactive .TP .B Wired: -number of bytes wired down, including cached file data pages +number of bytes wired down, including BIO-level cached file data pages .TP .B Cache: number of clean bytes caching data that are available for @@ -35,6 +37,27 @@ number of bytes used for BIO-level disk caching .TP .B Free: number of bytes free +.SS ZFS ARC Stats +These stats are only displayed when the ARC is in use. +.TP +.B Total: +number of wired bytes used for the ZFS ARC +.TP +.B MRU: +number of ARC bytes holding most recently used data +.TP +.B MFU: +number of ARC bytes holding most frequently used data +.TP +.B Anon: +number of ARC bytes holding in flight data +.TP +.B Header: +number of ARC bytes holding headers +.TP +.B Other +miscellaneous ARC bytes +.SS Swap Stats .TP .B Total: total available swap usage diff --git a/usr.bin/touch/touch.1 b/usr.bin/touch/touch.1 index 87789ecfa15..6201b28dbd1 100644 --- a/usr.bin/touch/touch.1 +++ b/usr.bin/touch/touch.1 @@ -31,7 +31,7 @@ .\" @(#)touch.1 8.3 (Berkeley) 4/28/95 .\" $FreeBSD$ .\" -.Dd February 4, 2012 +.Dd June 10, 2012 .Dt TOUCH 1 .Os .Sh NAME @@ -43,6 +43,7 @@ .Op Fl achm .Op Fl r Ar file .Op Fl t Ar [[CC]YY]MMDDhhmm[.SS] +.Op Fl d Ar YYYY-MM-DDThh:mm:SS[.frac][tz] .Ar .Sh DESCRIPTION The @@ -61,8 +62,10 @@ individually. Selecting both is equivalent to the default. By default, the timestamps are set to the current time. The +.Fl d +and .Fl t -flag explicitly specifies a different time, and the +flags explicitly specify a different time, and the .Fl r flag specifies to set the times those of the specified file. The @@ -109,6 +112,41 @@ The .Nm utility does not treat this as an error. No error messages are displayed and the exit value is not affected. +.It Fl d +Change the access and modification times to the specified time instead +of the current time of day. +The argument is of the form +.Dq YYYY-MM-DDThh:mm:SS[.frac][tz] +where the letters represent the following: +.Bl -tag -width Ds -compact -offset indent +.It Ar YYYY +The year. +.It Ar MM +The month of the year, from 01 to 12. +.It Ar DD +The day of the month, from 01 to 31. +.It Ar T +The letter +.Li T +or a space. +.It Ar hh +The hour of the day, from 00 to 23. +.It Ar mm +The minute of the hour, from 00 to 59. +.It Ar SS +The second of the minute, from 00 to 61. +.It Ar .frac +An optional fraction, +consisting of a period or a comma followed by one or more digits. +The number of significant digits depends on the kernel configuration and +the filesystem, and may be zero. +.It Ar tz +An optional letter +.Li Z +indicating the time is in +.Tn UTC . +Otherwise, the time is assumed to be in local time. +.El .It Fl h If the file is a symbolic link, change the times of the link itself rather than the file that the link points to. diff --git a/usr.bin/touch/touch.c b/usr.bin/touch/touch.c index 7a613e887d4..d42d9af2c77 100644 --- a/usr.bin/touch/touch.c +++ b/usr.bin/touch/touch.c @@ -45,6 +45,7 @@ static const char sccsid[] = "@(#)touch.c 8.1 (Berkeley) 6/6/93"; #include #include +#include #include #include #include @@ -57,6 +58,7 @@ static const char sccsid[] = "@(#)touch.c 8.1 (Berkeley) 6/6/93"; void stime_arg1(char *, struct timeval *); void stime_arg2(char *, int, struct timeval *); +void stime_darg(char *, struct timeval *); void stime_file(char *, struct timeval *); int timeoffset(char *); void usage(char *); @@ -79,7 +81,7 @@ main(int argc, char *argv[]) if (gettimeofday(&tv[0], NULL)) err(1, "gettimeofday"); - while ((ch = getopt(argc, argv, "A:acfhmr:t:")) != -1) + while ((ch = getopt(argc, argv, "A:acd:fhmr:t:")) != -1) switch(ch) { case 'A': Aflag = timeoffset(optarg); @@ -90,6 +92,10 @@ main(int argc, char *argv[]) case 'c': cflag = 1; break; + case 'd': + timeset = 1; + stime_darg(optarg, tv); + break; case 'f': /* No-op for compatibility. */ break; @@ -320,6 +326,50 @@ stime_arg2(char *arg, int year, struct timeval *tvp) tvp[0].tv_usec = tvp[1].tv_usec = 0; } +void +stime_darg(char *arg, struct timeval *tvp) +{ + struct tm t = { .tm_sec = 0 }; + const char *fmt, *colon; + char *p; + int val, isutc = 0; + + tvp[0].tv_usec = 0; + t.tm_isdst = -1; + colon = strchr(arg, ':'); + if (colon == NULL || strchr(colon + 1, ':') == NULL) + goto bad; + fmt = strchr(arg, 'T') != NULL ? "%Y-%m-%dT%H:%M:%S" : + "%Y-%m-%d %H:%M:%S"; + p = strptime(arg, fmt, &t); + if (p == NULL) + goto bad; + /* POSIX: must have at least one digit after dot */ + if ((*p == '.' || *p == ',') && isdigit((unsigned char)p[1])) { + p++; + val = 100000; + while (isdigit((unsigned char)*p)) { + tvp[0].tv_usec += val * (*p - '0'); + p++; + val /= 10; + } + } + if (*p == 'Z') { + isutc = 1; + p++; + } + if (*p != '\0') + goto bad; + + tvp[0].tv_sec = isutc ? timegm(&t) : mktime(&t); + + tvp[1] = tvp[0]; + return; + +bad: + errx(1, "out of range or illegal time specification: YYYY-MM-DDThh:mm:SS[.frac][tz]"); +} + /* Calculate a time offset in seconds, given an arg of the format [-]HHMMSS. */ int timeoffset(char *arg) @@ -364,7 +414,9 @@ stime_file(char *fname, struct timeval *tvp) void usage(char *myname) { - fprintf(stderr, "usage:\n" "%s [-A [-][[hh]mm]SS] [-achm] [-r file] " - "[-t [[CC]YY]MMDDhhmm[.SS]] file ...\n", myname); + fprintf(stderr, "usage: %s [-A [-][[hh]mm]SS] [-achm] [-r file] " + "[-t [[CC]YY]MMDDhhmm[.SS]]\n" + " [-d YYYY-MM-DDThh:mm:SS[.frac][tz]] " + "file ...\n", myname); exit(1); } diff --git a/usr.bin/unzip/unzip.1 b/usr.bin/unzip/unzip.1 index 82c7fb981e3..04ecd2339c0 100644 --- a/usr.bin/unzip/unzip.1 +++ b/usr.bin/unzip/unzip.1 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 21, 2010 +.Dd May 10, 2012 .Dt UNZIP 1 .Os .Sh NAME @@ -102,6 +102,16 @@ content of the archive. .It Fl x Ar pattern Exclude files matching the pattern .Ar pattern . +.It Fl Z Ar mode +Emulate +.Xr zipinfo 1L +mode. +Enabling +.Xr zipinfo 1L +mode changes the way in which additional arguments are parsed. +Currently only +.Xr zipinfo 1L +mode 1 is supported, which lists the file names one per line. .El .Pp Note that only one of diff --git a/usr.bin/unzip/unzip.c b/usr.bin/unzip/unzip.c index f3c6f9723bd..c43c72a5f08 100644 --- a/usr.bin/unzip/unzip.c +++ b/usr.bin/unzip/unzip.c @@ -865,19 +865,14 @@ unzip(const char *fn) { struct archive *a; struct archive_entry *e; - int fd, ret; + int ret; uintmax_t total_size, file_count, error_count; - if (strcmp(fn, "-") == 0) - fd = STDIN_FILENO; - else if ((fd = open(fn, O_RDONLY)) < 0) - error("%s", fn); - if ((a = archive_read_new()) == NULL) error("archive_read_new failed"); ac(archive_read_support_format_zip(a)); - ac(archive_read_open_fd(a, fd, 8192)); + ac(archive_read_open_filename(a, fn, 8192)); if (!zipinfo_mode) { if (!p_opt && !q_opt) @@ -933,9 +928,6 @@ unzip(const char *fn) ac(archive_read_close(a)); (void)archive_read_finish(a); - if (fd != STDIN_FILENO && close(fd) != 0) - error("%s", fn); - if (t_opt) { if (error_count > 0) { errorx("%d checksum error(s) found.", error_count); @@ -1061,6 +1053,9 @@ main(int argc, char *argv[]) usage(); zipfile = argv[nopts++]; + if (strcmp(zipfile, "-") == 0) + zipfile = NULL; /* STDIN */ + while (nopts < argc && *argv[nopts] != '-') add_pattern(&include, argv[nopts++]); diff --git a/usr.bin/usbhidctl/usbhid.c b/usr.bin/usbhidctl/usbhid.c index 2a28e3e40de..06a79c8d530 100644 --- a/usr.bin/usbhidctl/usbhid.c +++ b/usr.bin/usbhidctl/usbhid.c @@ -182,11 +182,11 @@ usage(void) fprintf(stderr, "usage: %s -f device " - "[-l] [-n] [-r] [-t tablefile] [-v] [-x] name ...\n", + "[-l] [-n] [-r] [-t tablefile] [-v] [-x] [-z] name ...\n", getprogname()); fprintf(stderr, " %s -f device " - "[-l] [-n] [-r] [-t tablefile] [-v] [-x] -a\n", + "[-l] [-n] [-r] [-t tablefile] [-v] [-x] [-z] -a\n", getprogname()); fprintf(stderr, " %s -f device " @@ -304,7 +304,7 @@ dumpdata(int f, report_desc_t rd, int loop) u_char *dbuf; enum hid_kind kind; - kind = 0; + kind = zflag ? 3 : 0; rid = -1; use_rid = !!hid_get_report_id(f); do { diff --git a/usr.bin/usbhidctl/usbhidctl.1 b/usr.bin/usbhidctl/usbhidctl.1 index 56811890782..bb7d9586334 100644 --- a/usr.bin/usbhidctl/usbhidctl.1 +++ b/usr.bin/usbhidctl/usbhidctl.1 @@ -28,7 +28,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd August 01, 2011 +.Dd August 1, 2011 .Dt USBHIDCTL 1 .Os .Sh NAME @@ -47,6 +47,7 @@ .Op Fl l .Op Fl v .Op Fl x +.Op Fl z .Fl a .Nm .Fl f Ar device @@ -55,6 +56,7 @@ .Op Fl n .Op Fl v .Op Fl x +.Op Fl z .Ar item ... .Nm .Fl f Ar device @@ -99,9 +101,8 @@ Only 'output' and 'feature' kinds can be set with this option. .It Fl x Dump data in hexadecimal as well as decimal. .It Fl z -Reset reports to zero before processing -.Fl w -arguments. If not specified, current values will be requested from device. +Reset reports to zero before processing other arguments. +If not specified, current values will be requested from device. .El .Sh SYNTAX .Nm diff --git a/usr.bin/who/who.1 b/usr.bin/who/who.1 index d4e0da93795..e8694930160 100644 --- a/usr.bin/who/who.1 +++ b/usr.bin/who/who.1 @@ -82,7 +82,7 @@ An error occurred. Show idle time for each user in hours and minutes as .Ar hh Ns : Ns Ar mm , .Ql \&. -if the user has been idle less that a minute, and +if the user has been idle less than a minute, and .Dq Li old if the user has been idle more than 24 hours. .It Cm am I diff --git a/usr.bin/whois/whois.1 b/usr.bin/whois/whois.1 index 2484994a4f7..287a42e5bff 100644 --- a/usr.bin/whois/whois.1 +++ b/usr.bin/whois/whois.1 @@ -203,12 +203,12 @@ This option is deprecated; use the option with an argument of .Qq Li RU instead. +.El .Pp The operands specified to .Nm are treated independently and may be used as queries on different whois servers. -.El .Sh EXIT STATUS .Ex -std .Sh EXAMPLES diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c index a920f850457..583348a339e 100644 --- a/usr.bin/xinstall/xinstall.c +++ b/usr.bin/xinstall/xinstall.c @@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -671,11 +672,18 @@ copy(int from_fd, const char *from_name, int to_fd, const char *to_name, if (size <= 8 * 1048576 && trymmap(from_fd) && (p = mmap(NULL, (size_t)size, PROT_READ, MAP_SHARED, from_fd, (off_t)0)) != (char *)MAP_FAILED) { - if ((nw = write(to_fd, p, size)) != size) { + nw = write(to_fd, p, size); + if (nw != size) { serrno = errno; (void)unlink(to_name); - errno = nw > 0 ? EIO : serrno; - err(EX_OSERR, "%s", to_name); + if (nw >= 0) { + errx(EX_OSERR, + "short write to %s: %jd bytes written, %jd bytes asked to write", + to_name, (uintmax_t)nw, (uintmax_t)size); + } else { + errno = serrno; + err(EX_OSERR, "%s", to_name); + } } done_copy = 1; } @@ -684,8 +692,15 @@ copy(int from_fd, const char *from_name, int to_fd, const char *to_name, if ((nw = write(to_fd, buf, nr)) != nr) { serrno = errno; (void)unlink(to_name); - errno = nw > 0 ? EIO : serrno; - err(EX_OSERR, "%s", to_name); + if (nw >= 0) { + errx(EX_OSERR, + "short write to %s: %jd bytes written, %jd bytes asked to write", + to_name, (uintmax_t)nw, + (uintmax_t)size); + } else { + errno = serrno; + err(EX_OSERR, "%s", to_name); + } } if (nr != 0) { serrno = errno; diff --git a/usr.bin/yacc/Makefile b/usr.bin/yacc/Makefile index e8b1024e82b..677486fd732 100644 --- a/usr.bin/yacc/Makefile +++ b/usr.bin/yacc/Makefile @@ -1,11 +1,18 @@ # @(#)Makefile 5.3 (Berkeley) 5/12/90 # $FreeBSD$ +.PATH: ${.CURDIR}/../../contrib/byacc + PROG= yacc -SRCS= closure.c error.c lalr.c lr0.c main.c mkpar.c output.c reader.c \ - skeleton.c symtab.c verbose.c warshall.c -SCRIPTS=yyfix.sh -MAN= yacc.1 yyfix.1 +SRCS= closure.c error.c graph.c lalr.c lr0.c main.c mkpar.c output.c \ + reader.c skeleton.c symtab.c verbose.c warshall.c + +CFLAGS+= -DMIXEDCASE_FILENAMES=1 \ + -DCC_HAS_PROTOS=1 \ + -DHAVE_FCNTL_H=1 \ + -DHAVE_ATEXIT=1 \ + -DHAVE_MKSTEMP=1 + LINKS= ${BINDIR}/yacc ${BINDIR}/byacc MLINKS= yacc.1 byacc.1 diff --git a/usr.bin/yacc/defs.h b/usr.bin/yacc/defs.h deleted file mode 100644 index 507136594ef..00000000000 --- a/usr.bin/yacc/defs.h +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)defs.h 5.6 (Berkeley) 5/24/93 - * $FreeBSD$ - */ - -#include -#include -#include -#include - - -/* machine-dependent definitions */ -/* the following definitions are for the Tahoe */ -/* they might have to be changed for other machines */ - -/* MAXTABLE is the maximum table size */ -/* BITS_PER_WORD is the number of bits in a C unsigned */ -/* WORDSIZE computes the number of words needed to */ -/* store n bits */ -/* BIT returns the value of the n-th bit starting */ -/* from r (0-indexed) */ -/* SETBIT sets the n-th bit starting from r */ - -#define MAXTABLE 32500 -#define BITS_PER_WORD 32 -#define WORDSIZE(n) (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD) -#define BIT(r, n) ((((r)[(n)>>5])>>((n)&31))&1) -#define SETBIT(r, n) ((r)[(n)>>5]|=((unsigned)1<<((n)&31))) - - -/* character names */ - -#define NUL '\0' /* the null character */ -#define NEWLINE '\n' /* line feed */ -#define SP ' ' /* space */ -#define BS '\b' /* backspace */ -#define HT '\t' /* horizontal tab */ -#define VT '\013' /* vertical tab */ -#define CR '\r' /* carriage return */ -#define FF '\f' /* form feed */ -#define QUOTE '\'' /* single quote */ -#define DOUBLE_QUOTE '\"' /* double quote */ -#define BACKSLASH '\\' /* backslash */ - - -/* defines for constructing filenames */ - -#define CODE_SUFFIX ".code.c" -#define DEFINES_SUFFIX ".tab.h" -#define OUTPUT_SUFFIX ".tab.c" -#define VERBOSE_SUFFIX ".output" - - -/* keyword codes */ - -#define TOKEN 0 -#define LEFT 1 -#define RIGHT 2 -#define NONASSOC 3 -#define MARK 4 -#define TEXT 5 -#define TYPE 6 -#define START 7 -#define UNION 8 -#define IDENT 9 -#define EXPECT 10 - - -/* symbol classes */ - -#define UNKNOWN 0 -#define TERM 1 -#define NONTERM 2 - - -/* the undefined value */ - -#define UNDEFINED (-1) - - -/* action codes */ - -#define SHIFT 1 -#define REDUCE 2 - - -/* character macros */ - -#define IS_IDENT(c) (isalnum(c) || (c) == '_' || (c) == '.' || (c) == '$') -#define IS_OCTAL(c) ((c) >= '0' && (c) <= '7') -#define NUMERIC_VALUE(c) ((c) - '0') - - -/* symbol macros */ - -#define ISTOKEN(s) ((s) < start_symbol) -#define ISVAR(s) ((s) >= start_symbol) - - -/* storage allocation macros */ - -#define NEW(t) ((t*)allocate(sizeof(t))) -#define NEW2(n,t) ((t*)allocate((n)*sizeof(t))) - - -/* the structure of a symbol table entry */ - -typedef struct bucket bucket; -struct bucket -{ - struct bucket *link; - struct bucket *next; - char *name; - char *tag; - short value; - short index; - short prec; - char class; - char assoc; -}; - - -/* the structure of the LR(0) state machine */ - -typedef struct core core; -struct core -{ - struct core *next; - struct core *link; - short number; - short accessing_symbol; - short nitems; - short items[1]; -}; - - -/* the structure used to record shifts */ - -typedef struct shifts shifts; -struct shifts -{ - struct shifts *next; - short number; - short nshifts; - short shift[1]; -}; - - -/* the structure used to store reductions */ - -typedef struct reductions reductions; -struct reductions -{ - struct reductions *next; - short number; - short nreds; - short rules[1]; -}; - - -/* the structure used to represent parser actions */ - -typedef struct action action; -struct action -{ - struct action *next; - short symbol; - short number; - short prec; - char action_code; - char assoc; - char suppressed; -}; - - -/* global variables */ - -extern char dflag; -extern char lflag; -extern char rflag; -extern char tflag; -extern char vflag; -extern const char *symbol_prefix; - -extern char *cptr; -extern char *line; -extern int lineno; -extern int outline; - -extern const char *banner[]; -extern const char *tables[]; -extern const char *header[]; -extern const char *body[]; -extern const char *trailer[]; - -extern char *action_file_name; -extern char *code_file_name; -extern char *defines_file_name; -extern const char *input_file_name; -extern char *output_file_name; -extern char *text_file_name; -extern char *union_file_name; -extern char *verbose_file_name; - -extern FILE *action_file; -extern FILE *code_file; -extern FILE *defines_file; -extern FILE *input_file; -extern FILE *output_file; -extern FILE *text_file; -extern FILE *union_file; -extern FILE *verbose_file; - -extern int nitems; -extern int nrules; -extern int nsyms; -extern int ntokens; -extern int nvars; -extern int ntags; - -extern char unionized; - -extern int start_symbol; -extern char **symbol_name; -extern short *symbol_value; -extern short *symbol_prec; -extern char *symbol_assoc; - -extern short *ritem; -extern short *rlhs; -extern short *rrhs; -extern short *rprec; -extern char *rassoc; - -extern short **derives; -extern char *nullable; - -extern bucket *first_symbol; -extern bucket *last_symbol; - -extern int nstates; -extern core *first_state; -extern shifts *first_shift; -extern reductions *first_reduction; -extern short *accessing_symbol; -extern core **state_table; -extern shifts **shift_table; -extern reductions **reduction_table; -extern unsigned *LA; -extern short *LAruleno; -extern short *lookaheads; -extern short *goto_map; -extern short *from_state; -extern short *to_state; - -extern action **parser; -extern int SRexpect; -extern int SRtotal; -extern int RRtotal; -extern short *SRconflicts; -extern short *RRconflicts; -extern short *defred; -extern short *rules_used; -extern short nunused; -extern short final_state; - -/* global functions */ - -void *allocate(size_t); -void closure(short *, int); -void create_symbol_table(void); -void default_action_warning(void); -void dollar_error(int, char *, char *) __dead2; -void dollar_warning(int, int); -void done(int) __dead2; -void fatal(const char *msg) __dead2; -void finalize_closure(void); -void free_parser(void); -void free_symbols(void); -void free_symbol_table(void); -void illegal_character(char *) __dead2; -void illegal_tag(int, char *, char *) __dead2; -void lalr(void); -bucket *lookup(char *); -void lr0(void); -bucket *make_bucket(const char *); -void make_parser(void); -void no_grammar(void) __dead2; -void no_space(void) __dead2; -void open_error(const char *) __dead2; -void output(void); -void over_unionized(char *) __dead2; -void prec_redeclared(void); -void reader(void); -void reflexive_transitive_closure(unsigned *, int); -void reprec_warning(char *); -void restarted_warning(void); -void retyped_warning(char *); -void revalued_warning(char *); -void set_first_derives(void); -void syntax_error(int, char *, char *) __dead2; -void terminal_lhs(int) __dead2; -void terminal_start(char *) __dead2; -void tokenized_start(char *) __dead2; -void undefined_goal(char *) __dead2; -void undefined_symbol_warning(char *); -void unexpected_EOF(void) __dead2; -void unknown_rhs(int) __dead2; -void unterminated_action(int, char *, char *) __dead2; -void unterminated_comment(int, char *, char *) __dead2; -void unterminated_string(int, char *, char *) __dead2; -void unterminated_text(int, char *, char *) __dead2; -void unterminated_union(int, char *, char *) __dead2; -void untyped_lhs(void) __dead2; -void untyped_rhs(int, char *) __dead2; -void used_reserved(char *) __dead2; -void verbose(void); -void write_section(const char **); diff --git a/usr.bin/yacc/error.c b/usr.bin/yacc/error.c deleted file mode 100644 index 928fbd30686..00000000000 --- a/usr.bin/yacc/error.c +++ /dev/null @@ -1,341 +0,0 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if 0 -#ifndef lint -static char sccsid[] = "@(#)error.c 5.3 (Berkeley) 6/1/90"; -#endif -#endif -#include -__FBSDID("$FreeBSD$"); - -/* routines for printing error messages */ - -#include "defs.h" - -static void print_pos(char *, char *); - -void -fatal(const char *msg) -{ - warnx("f - %s", msg); - done(2); -} - - -void -no_space(void) -{ - warnx("f - out of space"); - done(2); -} - - -void -open_error(const char *filename) -{ - warnx("f - cannot open \"%s\"", filename); - done(2); -} - - -void -unexpected_EOF(void) -{ - warnx("e - line %d of \"%s\", unexpected end-of-file", - lineno, input_file_name); - done(1); -} - - -static void -print_pos(char *st_line, char *st_cptr) -{ - char *s; - - if (st_line == 0) return; - for (s = st_line; *s != '\n'; ++s) - { - if (isprint(*s) || *s == '\t') - putc(*s, stderr); - else - putc('?', stderr); - } - putc('\n', stderr); - for (s = st_line; s < st_cptr; ++s) - { - if (*s == '\t') - putc('\t', stderr); - else - putc(' ', stderr); - } - putc('^', stderr); - putc('\n', stderr); -} - - -void -syntax_error(int st_lineno, char *st_line, char *st_cptr) -{ - warnx("e - line %d of \"%s\", syntax error", - st_lineno, input_file_name); - print_pos(st_line, st_cptr); - done(1); -} - - -void -unterminated_comment(int c_lineno, char *c_line, char *c_cptr) -{ - warnx("e - line %d of \"%s\", unmatched /*", - c_lineno, input_file_name); - print_pos(c_line, c_cptr); - done(1); -} - - -void -unterminated_string(int s_lineno, char *s_line, char *s_cptr) -{ - warnx("e - line %d of \"%s\", unterminated string", - s_lineno, input_file_name); - print_pos(s_line, s_cptr); - done(1); -} - - -void -unterminated_text(int t_lineno, char *t_line, char *t_cptr) -{ - warnx("e - line %d of \"%s\", unmatched %%{", - t_lineno, input_file_name); - print_pos(t_line, t_cptr); - done(1); -} - - -void -unterminated_union(int u_lineno, char *u_line, char *u_cptr) -{ - warnx("e - line %d of \"%s\", unterminated %%union declaration", - u_lineno, input_file_name); - print_pos(u_line, u_cptr); - done(1); -} - - -void -over_unionized(char *u_cptr) -{ - warnx("e - line %d of \"%s\", too many %%union declarations", - lineno, input_file_name); - print_pos(line, u_cptr); - done(1); -} - - -void -illegal_tag(int t_lineno, char *t_line, char *t_cptr) -{ - warnx("e - line %d of \"%s\", illegal tag", t_lineno, input_file_name); - print_pos(t_line, t_cptr); - done(1); -} - - -void -illegal_character(char *c_cptr) -{ - warnx("e - line %d of \"%s\", illegal character", lineno, input_file_name); - print_pos(line, c_cptr); - done(1); -} - - -void -used_reserved(char *s) -{ - warnx("e - line %d of \"%s\", illegal use of reserved symbol %s", - lineno, input_file_name, s); - done(1); -} - - -void -tokenized_start(char *s) -{ - warnx("e - line %d of \"%s\", the start symbol %s cannot be \ -declared to be a token", lineno, input_file_name, s); - done(1); -} - - -void -retyped_warning(char *s) -{ - warnx("w - line %d of \"%s\", the type of %s has been redeclared", - lineno, input_file_name, s); -} - - -void -reprec_warning(char *s) -{ - warnx("w - line %d of \"%s\", the precedence of %s has been redeclared", - lineno, input_file_name, s); -} - - -void -revalued_warning(char *s) -{ - warnx("w - line %d of \"%s\", the value of %s has been redeclared", - lineno, input_file_name, s); -} - - -void -terminal_start(char *s) -{ - warnx("e - line %d of \"%s\", the start symbol %s is a token", - lineno, input_file_name, s); - done(1); -} - - -void -restarted_warning(void) -{ - warnx("w - line %d of \"%s\", the start symbol has been redeclared", - lineno, input_file_name); -} - - -void -no_grammar(void) -{ - warnx("e - line %d of \"%s\", no grammar has been specified", - lineno, input_file_name); - done(1); -} - - -void -terminal_lhs(int s_lineno) -{ - warnx("e - line %d of \"%s\", a token appears on the lhs of a production", - s_lineno, input_file_name); - done(1); -} - - -void -prec_redeclared(void) -{ - warnx("w - line %d of \"%s\", conflicting %%prec specifiers", - lineno, input_file_name); -} - - -void -unterminated_action(int a_lineno, char *a_line, char *a_cptr) -{ - warnx("e - line %d of \"%s\", unterminated action", - a_lineno, input_file_name); - print_pos(a_line, a_cptr); - done(1); -} - - -void -dollar_warning(int a_lineno, int i) -{ - warnx("w - line %d of \"%s\", $%d references beyond the \ -end of the current rule", a_lineno, input_file_name, i); -} - - -void -dollar_error(int a_lineno, char *a_line, char *a_cptr) -{ - warnx("e - line %d of \"%s\", illegal $-name", a_lineno, input_file_name); - print_pos(a_line, a_cptr); - done(1); -} - - -void -untyped_lhs(void) -{ - warnx("e - line %d of \"%s\", $$ is untyped", lineno, input_file_name); - done(1); -} - - -void -untyped_rhs(int i, char *s) -{ - warnx("e - line %d of \"%s\", $%d (%s) is untyped", - lineno, input_file_name, i, s); - done(1); -} - - -void -unknown_rhs(int i) -{ - warnx("e - line %d of \"%s\", $%d is untyped", lineno, input_file_name, i); - done(1); -} - - -void -default_action_warning(void) -{ - warnx("w - line %d of \"%s\", the default action assigns an \ -undefined value to $$", lineno, input_file_name); -} - - -void -undefined_goal(char *s) -{ - warnx("e - the start symbol %s is undefined", s); - done(1); -} - - -void -undefined_symbol_warning(char *s) -{ - warnx("w - the symbol %s is undefined", s); -} diff --git a/usr.bin/yacc/lalr.c b/usr.bin/yacc/lalr.c deleted file mode 100644 index 75315ea3ef8..00000000000 --- a/usr.bin/yacc/lalr.c +++ /dev/null @@ -1,701 +0,0 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if 0 -#ifndef lint -static char sccsid[] = "@(#)lalr.c 5.3 (Berkeley) 6/1/90"; -#endif -#endif - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include "defs.h" - -typedef - struct shorts - { - struct shorts *next; - short value; - } - shorts; - -int tokensetsize; -short *lookaheads; -short *LAruleno; -unsigned *LA; -short *accessing_symbol; -core **state_table; -shifts **shift_table; -reductions **reduction_table; -short *goto_map; -short *from_state; -short *to_state; - -static void add_lookback_edge(int, int, int); -static void build_relations(void); -static void compute_FOLLOWS(void); -static void compute_lookaheads(void); -static void digraph(short **); -static void initialize_F(void); -static void initialize_LA(void); -static int map_goto(int, int); -static void set_accessing_symbol(void); -static void set_goto_map(void); -static void set_maxrhs(void); -static void set_reduction_table(void); -static void set_shift_table(void); -static void set_state_table(void); -static short **transpose(short **, int); -static void traverse(int, short **); - -static int infinity; -static int maxrhs; -static int ngotos; -static unsigned *F; -static short **includes; -static shorts **lookback; -static short *INDEX; -static short *VERTICES; -static int top; - - -void -lalr(void) -{ - tokensetsize = WORDSIZE(ntokens); - - set_state_table(); - set_accessing_symbol(); - set_shift_table(); - set_reduction_table(); - set_maxrhs(); - initialize_LA(); - set_goto_map(); - initialize_F(); - build_relations(); - compute_FOLLOWS(); - compute_lookaheads(); -} - - - -static void -set_state_table(void) -{ - core *sp; - - state_table = NEW2(nstates, core *); - for (sp = first_state; sp; sp = sp->next) - state_table[sp->number] = sp; -} - - - -static void -set_accessing_symbol(void) -{ - core *sp; - - accessing_symbol = NEW2(nstates, short); - for (sp = first_state; sp; sp = sp->next) - accessing_symbol[sp->number] = sp->accessing_symbol; -} - - - -static void -set_shift_table(void) -{ - shifts *sp; - - shift_table = NEW2(nstates, shifts *); - for (sp = first_shift; sp; sp = sp->next) - shift_table[sp->number] = sp; -} - - - -static void -set_reduction_table(void) -{ - reductions *rp; - - reduction_table = NEW2(nstates, reductions *); - for (rp = first_reduction; rp; rp = rp->next) - reduction_table[rp->number] = rp; -} - - - -static void -set_maxrhs(void) -{ - short *itemp; - short *item_end; - int length; - int max; - - length = 0; - max = 0; - item_end = ritem + nitems; - for (itemp = ritem; itemp < item_end; itemp++) - { - if (*itemp >= 0) - { - length++; - } - else - { - if (length > max) max = length; - length = 0; - } - } - - maxrhs = max; -} - - - -static void -initialize_LA(void) -{ - int i, j, k; - reductions *rp; - - lookaheads = NEW2(nstates + 1, short); - - k = 0; - for (i = 0; i < nstates; i++) - { - lookaheads[i] = k; - rp = reduction_table[i]; - if (rp) - k += rp->nreds; - } - lookaheads[nstates] = k; - - LA = NEW2(k * tokensetsize, unsigned); - LAruleno = NEW2(k, short); - lookback = NEW2(k, shorts *); - - k = 0; - for (i = 0; i < nstates; i++) - { - rp = reduction_table[i]; - if (rp) - { - for (j = 0; j < rp->nreds; j++) - { - LAruleno[k] = rp->rules[j]; - k++; - } - } - } -} - - -static void -set_goto_map(void) -{ - shifts *sp; - int i; - int symbol; - int k; - short *temp_map; - int state2; - int state1; - - goto_map = NEW2(nvars + 1, short) - ntokens; - temp_map = NEW2(nvars + 1, short) - ntokens; - - ngotos = 0; - for (sp = first_shift; sp; sp = sp->next) - { - for (i = sp->nshifts - 1; i >= 0; i--) - { - symbol = accessing_symbol[sp->shift[i]]; - - if (ISTOKEN(symbol)) break; - - if (ngotos == SHRT_MAX) - fatal("too many gotos"); - - ngotos++; - goto_map[symbol]++; - } - } - - k = 0; - for (i = ntokens; i < nsyms; i++) - { - temp_map[i] = k; - k += goto_map[i]; - } - - for (i = ntokens; i < nsyms; i++) - goto_map[i] = temp_map[i]; - - goto_map[nsyms] = ngotos; - temp_map[nsyms] = ngotos; - - from_state = NEW2(ngotos, short); - to_state = NEW2(ngotos, short); - - for (sp = first_shift; sp; sp = sp->next) - { - state1 = sp->number; - for (i = sp->nshifts - 1; i >= 0; i--) - { - state2 = sp->shift[i]; - symbol = accessing_symbol[state2]; - - if (ISTOKEN(symbol)) break; - - k = temp_map[symbol]++; - from_state[k] = state1; - to_state[k] = state2; - } - } - - free(temp_map + ntokens); -} - - - -/* Map_goto maps a state/symbol pair into its numeric representation. */ - -static int -map_goto(int state, int symbol) -{ - int high; - int low; - int middle; - int s; - - low = goto_map[symbol]; - high = goto_map[symbol + 1]; - - for (;;) - { - assert(low <= high); - middle = (low + high) >> 1; - s = from_state[middle]; - if (s == state) - return (middle); - else if (s < state) - low = middle + 1; - else - high = middle - 1; - } -} - - - -static void -initialize_F(void) -{ - int i; - int j; - int k; - shifts *sp; - short *edge; - unsigned *rowp; - short *rp; - short **reads; - int nedges; - int stateno; - int symbol; - int nwords; - - nwords = ngotos * tokensetsize; - F = NEW2(nwords, unsigned); - - reads = NEW2(ngotos, short *); - edge = NEW2(ngotos + 1, short); - nedges = 0; - - rowp = F; - for (i = 0; i < ngotos; i++) - { - stateno = to_state[i]; - sp = shift_table[stateno]; - - if (sp) - { - k = sp->nshifts; - - for (j = 0; j < k; j++) - { - symbol = accessing_symbol[sp->shift[j]]; - if (ISVAR(symbol)) - break; - SETBIT(rowp, symbol); - } - - for (; j < k; j++) - { - symbol = accessing_symbol[sp->shift[j]]; - if (nullable[symbol]) - edge[nedges++] = map_goto(stateno, symbol); - } - - if (nedges) - { - reads[i] = rp = NEW2(nedges + 1, short); - - for (j = 0; j < nedges; j++) - rp[j] = edge[j]; - - rp[nedges] = -1; - nedges = 0; - } - } - - rowp += tokensetsize; - } - - SETBIT(F, 0); - digraph(reads); - - for (i = 0; i < ngotos; i++) - { - if (reads[i]) - free(reads[i]); - } - - free(reads); - free(edge); -} - - - -static void -build_relations(void) -{ - int i; - int j; - int k; - short *rulep; - short *rp; - shifts *sp; - int length; - int nedges; - int done1; - int state1; - int stateno; - int symbol1; - int symbol2; - short *shortp; - short *edge; - short *states; - short **new_includes; - - includes = NEW2(ngotos, short *); - edge = NEW2(ngotos + 1, short); - states = NEW2(maxrhs + 1, short); - - for (i = 0; i < ngotos; i++) - { - nedges = 0; - state1 = from_state[i]; - symbol1 = accessing_symbol[to_state[i]]; - - for (rulep = derives[symbol1]; *rulep >= 0; rulep++) - { - length = 1; - states[0] = state1; - stateno = state1; - - for (rp = ritem + rrhs[*rulep]; *rp >= 0; rp++) - { - symbol2 = *rp; - sp = shift_table[stateno]; - k = sp->nshifts; - - for (j = 0; j < k; j++) - { - stateno = sp->shift[j]; - if (accessing_symbol[stateno] == symbol2) break; - } - - states[length++] = stateno; - } - - add_lookback_edge(stateno, *rulep, i); - - length--; - done1 = 0; - while (!done1) - { - done1 = 1; - rp--; - if (ISVAR(*rp)) - { - stateno = states[--length]; - edge[nedges++] = map_goto(stateno, *rp); - if (nullable[*rp] && length > 0) done1 = 0; - } - } - } - - if (nedges) - { - includes[i] = shortp = NEW2(nedges + 1, short); - for (j = 0; j < nedges; j++) - shortp[j] = edge[j]; - shortp[nedges] = -1; - } - } - - new_includes = transpose(includes, ngotos); - - for (i = 0; i < ngotos; i++) - if (includes[i]) - free(includes[i]); - - free(includes); - - includes = new_includes; - - free(edge); - free(states); -} - - -static void -add_lookback_edge(int stateno, int ruleno, int gotono) -{ - int i, k; - int found; - shorts *sp; - - i = lookaheads[stateno]; - k = lookaheads[stateno + 1]; - found = 0; - while (!found && i < k) - { - if (LAruleno[i] == ruleno) - found = 1; - else - ++i; - } - assert(found); - - sp = NEW(shorts); - sp->next = lookback[i]; - sp->value = gotono; - lookback[i] = sp; -} - - - -static short ** -transpose(short **R, int n) -{ - short **new_R; - short **temp_R; - short *nedges; - short *sp; - int i; - int k; - - nedges = NEW2(n, short); - - for (i = 0; i < n; i++) - { - sp = R[i]; - if (sp) - { - while (*sp >= 0) - nedges[*sp++]++; - } - } - - new_R = NEW2(n, short *); - temp_R = NEW2(n, short *); - - for (i = 0; i < n; i++) - { - k = nedges[i]; - if (k > 0) - { - sp = NEW2(k + 1, short); - new_R[i] = sp; - temp_R[i] = sp; - sp[k] = -1; - } - } - - free(nedges); - - for (i = 0; i < n; i++) - { - sp = R[i]; - if (sp) - { - while (*sp >= 0) - *temp_R[*sp++]++ = i; - } - } - - free(temp_R); - - return (new_R); -} - - - -static void -compute_FOLLOWS(void) -{ - digraph(includes); -} - - -static void -compute_lookaheads(void) -{ - int i, n; - unsigned *fp1, *fp2, *fp3; - shorts *sp, *next; - unsigned *rowp; - - rowp = LA; - n = lookaheads[nstates]; - for (i = 0; i < n; i++) - { - fp3 = rowp + tokensetsize; - for (sp = lookback[i]; sp; sp = sp->next) - { - fp1 = rowp; - fp2 = F + tokensetsize * sp->value; - while (fp1 < fp3) - *fp1++ |= *fp2++; - } - rowp = fp3; - } - - for (i = 0; i < n; i++) - for (sp = lookback[i]; sp; sp = next) - { - next = sp->next; - free(sp); - } - - free(lookback); - free(F); -} - - -static void -digraph(short **relation) -{ - int i; - - infinity = ngotos + 2; - INDEX = NEW2(ngotos + 1, short); - VERTICES = NEW2(ngotos + 1, short); - top = 0; - - for (i = 0; i < ngotos; i++) - INDEX[i] = 0; - - for (i = 0; i < ngotos; i++) - { - if (INDEX[i] == 0 && relation[i]) - traverse(i, relation); - } - - free(INDEX); - free(VERTICES); -} - - - -static void -traverse(int i, short **R) -{ - unsigned *fp1; - unsigned *fp2; - unsigned *fp3; - int j; - short *rp; - - int height; - unsigned *base; - - VERTICES[++top] = i; - INDEX[i] = height = top; - - base = F + i * tokensetsize; - fp3 = base + tokensetsize; - - rp = R[i]; - if (rp) - { - while ((j = *rp++) >= 0) - { - if (INDEX[j] == 0) - traverse(j, R); - - if (INDEX[i] > INDEX[j]) - INDEX[i] = INDEX[j]; - - fp1 = base; - fp2 = F + j * tokensetsize; - - while (fp1 < fp3) - *fp1++ |= *fp2++; - } - } - - if (INDEX[i] == height) - { - for (;;) - { - j = VERTICES[top--]; - INDEX[j] = infinity; - - if (i == j) - break; - - fp1 = base; - fp2 = F + j * tokensetsize; - - while (fp1 < fp3) - *fp2++ = *fp1++; - } - } -} diff --git a/usr.bin/yacc/main.c b/usr.bin/yacc/main.c deleted file mode 100644 index a5270326883..00000000000 --- a/usr.bin/yacc/main.c +++ /dev/null @@ -1,438 +0,0 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if 0 -#ifndef lint -static char sccsid[] = "@(#)main.c 5.5 (Berkeley) 5/24/93"; -#endif -#endif - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include "defs.h" - -char dflag; -char lflag; -char rflag; -char tflag; -char vflag; - -const char *symbol_prefix; -const char *file_prefix = "y"; -char temp_form[] = "yacc.XXXXXXXXXXX"; - -int lineno; -int outline; - -char *action_file_name; -char *code_file_name; -char *defines_file_name; -const char *input_file_name = ""; -char *output_file_name; -char *text_file_name; -char *union_file_name; -char *verbose_file_name; - -FILE *action_file; /* a temp file, used to save actions associated */ - /* with rules until the parser is written */ -FILE *code_file; /* y.code.c (used when the -r option is specified) */ -FILE *defines_file; /* y.tab.h */ -FILE *input_file; /* the input file */ -FILE *output_file; /* y.tab.c */ -FILE *text_file; /* a temp file, used to save text until all */ - /* symbols have been defined */ -FILE *union_file; /* a temp file, used to save the union */ - /* definition until all symbol have been */ - /* defined */ -FILE *verbose_file; /* y.output */ - -int nitems; -int nrules; -int nsyms; -int ntokens; -int nvars; - -int start_symbol; -char **symbol_name; -short *symbol_value; -short *symbol_prec; -char *symbol_assoc; - -short *ritem; -short *rlhs; -short *rrhs; -short *rprec; -char *rassoc; -short **derives; -char *nullable; - -static void create_file_names(void); -static void getargs(int, char **); -static void onintr(int); -static void open_files(void); -static void set_signals(void); -static void usage(void); - -volatile sig_atomic_t sigdie; - -__dead2 void -done(int k) -{ - if (action_file) { fclose(action_file); unlink(action_file_name); } - if (text_file) { fclose(text_file); unlink(text_file_name); } - if (union_file) { fclose(union_file); unlink(union_file_name); } - if (sigdie) { _exit(k); } - exit(k); -} - - -static void -onintr(int signo __unused) -{ - sigdie = 1; - done(1); -} - - -static void -set_signals(void) -{ -#ifdef SIGINT - if (signal(SIGINT, SIG_IGN) != SIG_IGN) - signal(SIGINT, onintr); -#endif -#ifdef SIGTERM - if (signal(SIGTERM, SIG_IGN) != SIG_IGN) - signal(SIGTERM, onintr); -#endif -#ifdef SIGHUP - if (signal(SIGHUP, SIG_IGN) != SIG_IGN) - signal(SIGHUP, onintr); -#endif -} - - -static void -usage(void) -{ - fprintf(stderr, "%s\n%s\n", - "usage: yacc [-dlrtv] [-b file_prefix] [-o output_filename]", - " [-p symbol_prefix] filename"); - exit(1); -} - - -static void -getargs(int argc, char *argv[]) -{ - int ch; - - while ((ch = getopt(argc, argv, "b:dlo:p:rtvy")) != -1) - { - switch (ch) - { - case 'b': - file_prefix = optarg; - break; - - case 'd': - dflag = 1; - break; - - case 'l': - lflag = 1; - break; - - case 'o': - output_file_name = optarg; - break; - - case 'p': - symbol_prefix = optarg; - break; - - case 'r': - rflag = 1; - break; - - case 't': - tflag = 1; - break; - - case 'v': - vflag = 1; - break; - - case 'y': - /* for bison compatibility -- byacc is already POSIX compatible */ - break; - - default: - usage(); - } - } - - if (optind + 1 != argc) - usage(); - if (strcmp(argv[optind], "-") == 0) - input_file = stdin; - else - input_file_name = argv[optind]; -} - - -void * -allocate(size_t n) -{ - void *p; - - p = NULL; - if (n) - { - p = calloc(1, n); - if (!p) no_space(); - } - return (p); -} - - -static void -create_file_names(void) -{ - int i, len; - const char *tmpdir; - - if (!(tmpdir = getenv("TMPDIR"))) - tmpdir = _PATH_TMP; - - len = strlen(tmpdir); - i = len + strlen(temp_form) + 1; - if (len && tmpdir[len-1] != '/') - ++i; - - action_file_name = malloc(i); - if (action_file_name == 0) no_space(); - text_file_name = malloc(i); - if (text_file_name == 0) no_space(); - union_file_name = malloc(i); - if (union_file_name == 0) no_space(); - - strcpy(action_file_name, tmpdir); - strcpy(text_file_name, tmpdir); - strcpy(union_file_name, tmpdir); - - if (len && tmpdir[len - 1] != '/') - { - action_file_name[len] = '/'; - text_file_name[len] = '/'; - union_file_name[len] = '/'; - ++len; - } - - strcpy(action_file_name + len, temp_form); - strcpy(text_file_name + len, temp_form); - strcpy(union_file_name + len, temp_form); - - action_file_name[len + 5] = 'a'; - text_file_name[len + 5] = 't'; - union_file_name[len + 5] = 'u'; - - if (output_file_name != 0) - { - file_prefix = output_file_name; - len = strlen(file_prefix); - } - else - { - len = strlen(file_prefix); - output_file_name = malloc(len + 7); - if (output_file_name == 0) - no_space(); - strcpy(output_file_name, file_prefix); - strcpy(output_file_name + len, OUTPUT_SUFFIX); - } - - if (rflag) - { - code_file_name = malloc(len + 8); - if (code_file_name == 0) - no_space(); - strcpy(code_file_name, file_prefix); - if (file_prefix == output_file_name) - { - /* - * XXX ".tab.c" here is OUTPUT_SUFFIX, but since its length is - * in various magic numbers, don't bother using the macro. - */ - if (len >= 6 && strcmp(code_file_name + len - 6, ".tab.c") == 0) - strcpy(code_file_name + len - 6, CODE_SUFFIX); - else if (len >= 2 && strcmp(code_file_name + len - 2, ".c") == 0) - strcpy(code_file_name + len - 2, CODE_SUFFIX); - else - strcpy(code_file_name + len, CODE_SUFFIX); - } - else - strcpy(code_file_name + len, CODE_SUFFIX); - } - else - code_file_name = output_file_name; - - if (dflag) - { - defines_file_name = malloc(len + 7); - if (defines_file_name == 0) - no_space(); - strcpy(defines_file_name, file_prefix); - if (file_prefix == output_file_name) - { -#define BISON_DEFINES_SUFFIX ".h" - if (len >= 2 && strcmp(defines_file_name + len - 2, ".c") == 0) - strcpy(defines_file_name + len - 2, BISON_DEFINES_SUFFIX); - else - strcpy(defines_file_name + len, BISON_DEFINES_SUFFIX); - } - else - strcpy(defines_file_name + len, DEFINES_SUFFIX); - } - - if (vflag) - { - verbose_file_name = malloc(len + 8); - if (verbose_file_name == 0) - no_space(); - strcpy(verbose_file_name, file_prefix); - if (file_prefix == output_file_name) - { - if (len >= 6 && strcmp(verbose_file_name + len - 6, ".tab.c") == 0) - strcpy(verbose_file_name + len - 6, VERBOSE_SUFFIX); - else if (len >= 2 && strcmp(verbose_file_name + len - 2, ".c") == 0) - strcpy(verbose_file_name + len - 2, VERBOSE_SUFFIX); - else - strcpy(verbose_file_name + len, VERBOSE_SUFFIX); - } - else - strcpy(verbose_file_name + len, VERBOSE_SUFFIX); - } -} - - -static void -open_files(void) -{ - int fd; - - create_file_names(); - - if (input_file == 0) - { - input_file = fopen(input_file_name, "r"); - if (input_file == 0) - open_error(input_file_name); - } - - fd = mkstemp(action_file_name); - if (fd < 0 || (action_file = fdopen(fd, "w")) == NULL) { - if (fd >= 0) - close(fd); - open_error(action_file_name); - } - fd = mkstemp(text_file_name); - if (fd < 0 || (text_file = fdopen(fd, "w")) == NULL) { - if (fd >= 0) - close(fd); - open_error(text_file_name); - } - fd = mkstemp(union_file_name); - if (fd < 0 || (union_file = fdopen(fd, "w")) == NULL) { - if (fd >= 0) - close(fd); - open_error(union_file_name); - } - - text_file = fopen(text_file_name, "w"); - if (text_file == 0) - open_error(text_file_name); - - if (vflag) - { - verbose_file = fopen(verbose_file_name, "w"); - if (verbose_file == 0) - open_error(verbose_file_name); - } - - if (dflag) - { - defines_file = fopen(defines_file_name, "w"); - if (defines_file == 0) - open_error(defines_file_name); - union_file = fopen(union_file_name, "w"); - if (union_file == 0) - open_error(union_file_name); - } - - output_file = fopen(output_file_name, "w"); - if (output_file == 0) - open_error(output_file_name); - - if (rflag) - { - code_file = fopen(code_file_name, "w"); - if (code_file == 0) - open_error(code_file_name); - } - else - code_file = output_file; -} - - -int -main(int argc, char *argv[]) -{ - set_signals(); - getargs(argc, argv); - open_files(); - reader(); - lr0(); - lalr(); - make_parser(); - verbose(); - output(); - done(0); - /*NOTREACHED*/ - return (0); -} diff --git a/usr.bin/yacc/output.c b/usr.bin/yacc/output.c deleted file mode 100644 index 3abe8af4b4b..00000000000 --- a/usr.bin/yacc/output.c +++ /dev/null @@ -1,1342 +0,0 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if 0 -#ifndef lint -static char sccsid[] = "@(#)output.c 5.7 (Berkeley) 5/24/93"; -#endif -#endif - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include "defs.h" - -static int nvectors; -static int nentries; -static short **froms; -static short **tos; -static short *tally; -static short *width; -static short *state_count; -static short *order; -static short *base; -static short *pos; -static int maxtable; -static short *table; -static short *check; -static int lowzero; -static int high; - -static int default_goto(int); -static void free_itemsets(void); -static void free_reductions(void); -static void free_shifts(void); -static void goto_actions(void); -static int is_C_identifier(char *); -static int matching_vector(int); -static void output_actions(void); -static void output_base(void); -static void output_check(void); -static void output_debug(void); -static void output_defines(void); -static void output_prefix(void); -static void output_rule_data(void); -static void output_semantic_actions(void); -static void output_stored_text(void); -static void output_stype(void); -static void output_table(void); -static void output_trailing_text(void); -static void output_yydefred(void); -static void pack_table(void); -static int pack_vector(int); -static void save_column(int, int); -static void sort_actions(void); -static void token_actions(void); -static int increase_maxtable(int); - -static const char line_format[] = "#line %d \"%s\"\n"; - - -void -output(void) -{ - free_itemsets(); - free_shifts(); - free_reductions(); - output_prefix(); - output_stored_text(); - output_defines(); - output_rule_data(); - output_yydefred(); - output_actions(); - free_parser(); - output_debug(); - output_stype(); - if (rflag) write_section(tables); - write_section(header); - output_trailing_text(); - write_section(body); - output_semantic_actions(); - write_section(trailer); -} - - -static void -output_prefix(void) -{ - if (symbol_prefix == NULL) - symbol_prefix = "yy"; - else - { - ++outline; - fprintf(code_file, "#define yyparse %sparse\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yylex %slex\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yyerror %serror\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yychar %schar\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yyval %sval\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yylval %slval\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yydebug %sdebug\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yynerrs %snerrs\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yyerrflag %serrflag\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yyss %sss\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yyssp %sssp\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yyvs %svs\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yyvsp %svsp\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yylhs %slhs\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yylen %slen\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yydefred %sdefred\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yydgoto %sdgoto\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yysindex %ssindex\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yyrindex %srindex\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yygindex %sgindex\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yytable %stable\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yycheck %scheck\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yyname %sname\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yyrule %srule\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yysslim %ssslim\n", symbol_prefix); - ++outline; - fprintf(code_file, "#define yystacksize %sstacksize\n", symbol_prefix); - } - ++outline; - fprintf(code_file, "#define YYPREFIX \"%s\"\n", symbol_prefix); -} - - -static void -output_rule_data(void) -{ - int i; - int j; - - - fprintf(output_file, "const short %slhs[] = {%42d,", symbol_prefix, - symbol_value[start_symbol]); - - j = 10; - for (i = 3; i < nrules; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - fprintf(output_file, "%5d,", symbol_value[rlhs[i]]); - } - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); - - fprintf(output_file, "const short %slen[] = {%42d,", symbol_prefix, 2); - - j = 10; - for (i = 3; i < nrules; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - j++; - - fprintf(output_file, "%5d,", rrhs[i + 1] - rrhs[i] - 1); - } - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); -} - - -static void -output_yydefred(void) -{ - int i, j; - - fprintf(output_file, "const short %sdefred[] = {%39d,", symbol_prefix, - (defred[0] ? defred[0] - 2 : 0)); - - j = 10; - for (i = 1; i < nstates; i++) - { - if (j < 10) - ++j; - else - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - - fprintf(output_file, "%5d,", (defred[i] ? defred[i] - 2 : 0)); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); -} - - -static void -output_actions(void) -{ - nvectors = 2*nstates + nvars; - - froms = NEW2(nvectors, short *); - tos = NEW2(nvectors, short *); - tally = NEW2(nvectors, short); - width = NEW2(nvectors, short); - - token_actions(); - free(lookaheads); - free(LA); - free(LAruleno); - free(accessing_symbol); - - goto_actions(); - free(goto_map + ntokens); - free(from_state); - free(to_state); - - sort_actions(); - pack_table(); - output_base(); - output_table(); - output_check(); -} - - -static void -token_actions(void) -{ - int i, j; - int shiftcount, reducecount; - int max, min; - short *actionrow, *r, *s; - action *p; - - actionrow = NEW2(2*ntokens, short); - for (i = 0; i < nstates; ++i) - { - if (parser[i]) - { - for (j = 0; j < 2*ntokens; ++j) - actionrow[j] = 0; - - shiftcount = 0; - reducecount = 0; - for (p = parser[i]; p; p = p->next) - { - if (p->suppressed == 0) - { - if (p->action_code == SHIFT) - { - ++shiftcount; - actionrow[p->symbol] = p->number; - } - else if (p->action_code == REDUCE && p->number != defred[i]) - { - ++reducecount; - actionrow[p->symbol + ntokens] = p->number; - } - } - } - - tally[i] = shiftcount; - tally[nstates+i] = reducecount; - width[i] = 0; - width[nstates+i] = 0; - if (shiftcount > 0) - { - froms[i] = r = NEW2(shiftcount, short); - tos[i] = s = NEW2(shiftcount, short); - min = SHRT_MAX; - max = 0; - for (j = 0; j < ntokens; ++j) - { - if (actionrow[j]) - { - if (min > symbol_value[j]) - min = symbol_value[j]; - if (max < symbol_value[j]) - max = symbol_value[j]; - *r++ = symbol_value[j]; - *s++ = actionrow[j]; - } - } - width[i] = max - min + 1; - } - if (reducecount > 0) - { - froms[nstates+i] = r = NEW2(reducecount, short); - tos[nstates+i] = s = NEW2(reducecount, short); - min = SHRT_MAX; - max = 0; - for (j = 0; j < ntokens; ++j) - { - if (actionrow[ntokens+j]) - { - if (min > symbol_value[j]) - min = symbol_value[j]; - if (max < symbol_value[j]) - max = symbol_value[j]; - *r++ = symbol_value[j]; - *s++ = actionrow[ntokens+j] - 2; - } - } - width[nstates+i] = max - min + 1; - } - } - } - free(actionrow); -} - -static void -goto_actions(void) -{ - int i, j, k; - - state_count = NEW2(nstates, short); - - k = default_goto(start_symbol + 1); - fprintf(output_file, "const short %sdgoto[] = {%40d,", symbol_prefix, k); - save_column(start_symbol + 1, k); - - j = 10; - for (i = start_symbol + 2; i < nsyms; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - k = default_goto(i); - fprintf(output_file, "%5d,", k); - save_column(i, k); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); - free(state_count); -} - -static int -default_goto(int symbol) -{ - int i; - int m; - int n; - int default_state; - int max; - - m = goto_map[symbol]; - n = goto_map[symbol + 1]; - - if (m == n) return (0); - - for (i = 0; i < nstates; i++) - state_count[i] = 0; - - for (i = m; i < n; i++) - state_count[to_state[i]]++; - - max = 0; - default_state = 0; - for (i = 0; i < nstates; i++) - { - if (state_count[i] > max) - { - max = state_count[i]; - default_state = i; - } - } - - return (default_state); -} - - - -static void -save_column(int symbol, int default_state) -{ - int i; - int m; - int n; - short *sp; - short *sp1; - short *sp2; - int count; - int symno; - - m = goto_map[symbol]; - n = goto_map[symbol + 1]; - - count = 0; - for (i = m; i < n; i++) - { - if (to_state[i] != default_state) - ++count; - } - if (count == 0) return; - - symno = symbol_value[symbol] + 2*nstates; - - froms[symno] = sp1 = sp = NEW2(count, short); - tos[symno] = sp2 = NEW2(count, short); - - for (i = m; i < n; i++) - { - if (to_state[i] != default_state) - { - *sp1++ = from_state[i]; - *sp2++ = to_state[i]; - } - } - - tally[symno] = count; - width[symno] = sp1[-1] - sp[0] + 1; -} - -static void -sort_actions(void) -{ - int i; - int j; - int k; - int t; - int w; - - order = NEW2(nvectors, short); - nentries = 0; - - for (i = 0; i < nvectors; i++) - { - if (tally[i] > 0) - { - t = tally[i]; - w = width[i]; - j = nentries - 1; - - while (j >= 0 && (width[order[j]] < w)) - j--; - - while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t)) - j--; - - for (k = nentries - 1; k > j; k--) - order[k + 1] = order[k]; - - order[j + 1] = i; - nentries++; - } - } -} - - -static void -pack_table(void) -{ - int i; - int place; - int state; - - base = NEW2(nvectors, short); - pos = NEW2(nentries, short); - - maxtable = 10000; - table = NEW2(maxtable, short); - check = NEW2(maxtable, short); - - lowzero = 0; - high = 0; - - for (i = 0; i < maxtable; i++) - check[i] = -1; - - for (i = 0; i < nentries; i++) - { - state = matching_vector(i); - - if (state < 0) - place = pack_vector(i); - else - place = base[state]; - - pos[i] = place; - base[order[i]] = place; - } - - for (i = 0; i < nvectors; i++) - { - if (froms[i]) - free(froms[i]); - if (tos[i]) - free(tos[i]); - } - - free(froms); - free(tos); - free(pos); -} - - -/* The function matching_vector determines if the vector specified by */ -/* the input parameter matches a previously considered vector. The */ -/* test at the start of the function checks if the vector represents */ -/* a row of shifts over terminal symbols or a row of reductions, or a */ -/* column of shifts over a nonterminal symbol. Berkeley Yacc does not */ -/* check if a column of shifts over a nonterminal symbols matches a */ -/* previously considered vector. Because of the nature of LR parsing */ -/* tables, no two columns can match. Therefore, the only possible */ -/* match would be between a row and a column. Such matches are */ -/* unlikely. Therefore, to save time, no attempt is made to see if a */ -/* column matches a previously considered vector. */ -/* */ -/* Matching_vector is poorly designed. The test could easily be made */ -/* faster. Also, it depends on the vectors being in a specific */ -/* order. */ - -static int -matching_vector(int vector) -{ - int i; - int j; - int k; - int t; - int w; - int match; - int prev; - - i = order[vector]; - if (i >= 2*nstates) - return (-1); - - t = tally[i]; - w = width[i]; - - for (prev = vector - 1; prev >= 0; prev--) - { - j = order[prev]; - if (width[j] != w || tally[j] != t) - return (-1); - - match = 1; - for (k = 0; match && k < t; k++) - { - if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k]) - match = 0; - } - - if (match) - return (j); - } - - return (-1); -} - - - -static int -pack_vector(int vector) -{ - int i, j, k; - int t; - int loc; - int ok; - short *from; - short *to; - - loc = 0; - i = order[vector]; - t = tally[i]; - assert(t); - - from = froms[i]; - to = tos[i]; - - j = lowzero - from[0]; - for (k = 1; k < t; ++k) - if (lowzero - from[k] > j) - j = lowzero - from[k]; - for (;; ++j) - { - if (j == 0) - continue; - ok = 1; - for (k = 0; ok && k < t; k++) - { - loc = j + from[k]; - if (loc >= maxtable) - { - if (loc >= MAXTABLE) - fatal("maximum table size exceeded"); - maxtable = increase_maxtable(loc); - } - - if (check[loc] != -1) - ok = 0; - } - for (k = 0; ok && k < vector; k++) - { - if (pos[k] == j) - ok = 0; - } - if (ok) - { - for (k = 0; k < t; k++) - { - loc = j + from[k]; - table[loc] = to[k]; - check[loc] = from[k]; - if (loc > high) high = loc; - } - - while (check[lowzero] != -1) - { - if (lowzero >= maxtable) - { - if (lowzero >= MAXTABLE) - { - fatal("maximum table size exceeded in check\n"); - } - - maxtable = increase_maxtable(loc); - } - - ++lowzero; - } - - return (j); - } - } -} - - - -static void -output_base(void) -{ - int i, j; - - fprintf(output_file, "const short %ssindex[] = {%39d,", symbol_prefix, - base[0]); - - j = 10; - for (i = 1; i < nstates; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - fprintf(output_file, "%5d,", base[i]); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\nconst short %srindex[] = {%39d,", symbol_prefix, - base[nstates]); - - j = 10; - for (i = nstates + 1; i < 2*nstates; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - fprintf(output_file, "%5d,", base[i]); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\nconst short %sgindex[] = {%39d,", symbol_prefix, - base[2*nstates]); - - j = 10; - for (i = 2*nstates + 1; i < nvectors - 1; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - fprintf(output_file, "%5d,", base[i]); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); - free(base); -} - - - -static void -output_table(void) -{ - int i; - int j; - - ++outline; - fprintf(code_file, "#define YYTABLESIZE %d\n", high); - fprintf(output_file, "const short %stable[] = {%40d,", symbol_prefix, - table[0]); - - j = 10; - for (i = 1; i <= high; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - fprintf(output_file, "%5d,", table[i]); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); - free(table); -} - - - -static void -output_check(void) -{ - int i; - int j; - - fprintf(output_file, "const short %scheck[] = {%40d,", symbol_prefix, - check[0]); - - j = 10; - for (i = 1; i <= high; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - fprintf(output_file, "%5d,", check[i]); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); - free(check); -} - - -static int -is_C_identifier(char *name) -{ - char *s; - int c; - - s = name; - c = *s; - if (c == '"') - { - c = *++s; - if (!isalpha(c) && c != '_' && c != '$') - return (0); - while ((c = *++s) != '"') - { - if (!isalnum(c) && c != '_' && c != '$') - return (0); - } - return (1); - } - - if (!isalpha(c) && c != '_' && c != '$') - return (0); - while ((c = *++s)) - { - if (!isalnum(c) && c != '_' && c != '$') - return (0); - } - return (1); -} - - -static void -output_defines(void) -{ - int c, i; - char *s; - - ++outline; - fprintf(code_file, "#define YYERRCODE %d\n", symbol_value[1]); - - if(dflag) - { - fprintf(defines_file, "#ifndef YYERRCODE\n"); - fprintf(defines_file, "#define YYERRCODE %d\n", symbol_value[1]); - fprintf(defines_file, "#endif\n\n"); - } - for (i = 2; i < ntokens; ++i) - { - s = symbol_name[i]; - if (is_C_identifier(s)) - { - fprintf(code_file, "#define "); - if (dflag) fprintf(defines_file, "#define "); - c = *s; - if (c == '"') - { - while ((c = *++s) != '"') - { - putc(c, code_file); - if (dflag) putc(c, defines_file); - } - } - else - { - do - { - putc(c, code_file); - if (dflag) putc(c, defines_file); - } - while ((c = *++s)); - } - ++outline; - fprintf(code_file, " %d\n", symbol_value[i]); - if (dflag) fprintf(defines_file, " %d\n", symbol_value[i]); - } - } - - if (dflag && unionized) - { - fclose(union_file); - union_file = fopen(union_file_name, "r"); - if (union_file == NULL) open_error(union_file_name); - while ((c = getc(union_file)) != EOF) - putc(c, defines_file); - fprintf(defines_file, " YYSTYPE;\nextern YYSTYPE %slval;\n", - symbol_prefix); - } -} - - -static void -output_stored_text(void) -{ - int c; - FILE *in, *out; - - fclose(text_file); - text_file = fopen(text_file_name, "r"); - if (text_file == NULL) - open_error(text_file_name); - in = text_file; - if ((c = getc(in)) == EOF) - return; - out = code_file; - if (c == '\n') - ++outline; - putc(c, out); - while ((c = getc(in)) != EOF) - { - if (c == '\n') - ++outline; - putc(c, out); - } - if (!lflag) - fprintf(out, line_format, ++outline + 1, code_file_name); -} - - -static void -output_debug(void) -{ - int i, j, k, max; - char **symnam, *s; - static char eof[] = "end-of-file"; - - ++outline; - fprintf(code_file, "#define YYFINAL %d\n", final_state); - outline += 3; - fprintf(code_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n", - tflag); - if (rflag) - fprintf(output_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n", - tflag); - - max = 0; - for (i = 2; i < ntokens; ++i) - if (symbol_value[i] > max) - max = symbol_value[i]; - ++outline; - fprintf(code_file, "#define YYMAXTOKEN %d\n", max); - - symnam = malloc((max+1)*sizeof(char *)); - if (symnam == 0) no_space(); - - /* Note that it is not necessary to initialize the element */ - /* symnam[max]. */ - for (i = 0; i < max; ++i) - symnam[i] = 0; - for (i = ntokens - 1; i >= 2; --i) - symnam[symbol_value[i]] = symbol_name[i]; - symnam[0] = eof; - - if (!rflag) ++outline; - fprintf(output_file, "#if YYDEBUG\n"); - fprintf(output_file, "const char * const %sname[] = {", symbol_prefix); - j = 80; - for (i = 0; i <= max; ++i) - { - if ((s = symnam[i])) - { - if (s[0] == '"') - { - k = 7; - while (*++s != '"') - { - ++k; - if (*s == '\\') - { - k += 2; - if (*++s == '\\') - ++k; - } - } - j += k; - if (j > 80) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = k; - } - fprintf(output_file, "\"\\\""); - s = symnam[i]; - while (*++s != '"') - { - if (*s == '\\') - { - fprintf(output_file, "\\\\"); - if (*++s == '\\') - fprintf(output_file, "\\\\"); - else - putc(*s, output_file); - } - else - putc(*s, output_file); - } - fprintf(output_file, "\\\"\","); - } - else if (s[0] == '\'') - { - if (s[1] == '"') - { - j += 7; - if (j > 80) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 7; - } - fprintf(output_file, "\"'\\\"'\","); - } - else - { - k = 5; - while (*++s != '\'') - { - ++k; - if (*s == '\\') - { - k += 2; - if (*++s == '\\') - ++k; - } - } - j += k; - if (j > 80) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = k; - } - fprintf(output_file, "\"'"); - s = symnam[i]; - while (*++s != '\'') - { - if (*s == '\\') - { - fprintf(output_file, "\\\\"); - if (*++s == '\\') - fprintf(output_file, "\\\\"); - else - putc(*s, output_file); - } - else - putc(*s, output_file); - } - fprintf(output_file, "'\","); - } - } - else - { - k = strlen(s) + 3; - j += k; - if (j > 80) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = k; - } - putc('"', output_file); - do { putc(*s, output_file); } while (*++s); - fprintf(output_file, "\","); - } - } - else - { - j += 2; - if (j > 80) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 2; - } - fprintf(output_file, "0,"); - } - } - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); - free(symnam); - - if (!rflag) ++outline; - fprintf(output_file, "const char * const %srule[] = {\n", symbol_prefix); - for (i = 2; i < nrules; ++i) - { - fprintf(output_file, "\"%s :", symbol_name[rlhs[i]]); - for (j = rrhs[i]; ritem[j] > 0; ++j) - { - s = symbol_name[ritem[j]]; - if (s[0] == '"') - { - fprintf(output_file, " \\\""); - while (*++s != '"') - { - if (*s == '\\') - { - if (s[1] == '\\') - fprintf(output_file, "\\\\\\\\"); - else - fprintf(output_file, "\\\\%c", s[1]); - ++s; - } - else - putc(*s, output_file); - } - fprintf(output_file, "\\\""); - } - else if (s[0] == '\'') - { - if (s[1] == '"') - fprintf(output_file, " '\\\"'"); - else if (s[1] == '\\') - { - if (s[2] == '\\') - fprintf(output_file, " '\\\\\\\\"); - else - fprintf(output_file, " '\\\\%c", s[2]); - s += 2; - while (*++s != '\'') - putc(*s, output_file); - putc('\'', output_file); - } - else - fprintf(output_file, " '%c'", s[1]); - } - else - fprintf(output_file, " %s", s); - } - if (!rflag) ++outline; - fprintf(output_file, "\",\n"); - } - - if (!rflag) outline += 2; - fprintf(output_file, "};\n#endif\n"); -} - - -static void -output_stype(void) -{ - if (!unionized && ntags == 0) - { - outline += 3; - fprintf(code_file, "#ifndef YYSTYPE\ntypedef int YYSTYPE;\n#endif\n"); - } -} - - -static void -output_trailing_text(void) -{ - int c, last; - FILE *in, *out; - - if (line == 0) - return; - - in = input_file; - out = code_file; - c = *cptr; - if (c == '\n') - { - ++lineno; - if ((c = getc(in)) == EOF) - return; - if (!lflag) - { - ++outline; - fprintf(out, line_format, lineno, input_file_name); - } - if (c == '\n') - ++outline; - putc(c, out); - last = c; - } - else - { - if (!lflag) - { - ++outline; - fprintf(out, line_format, lineno, input_file_name); - } - do { putc(c, out); } while ((c = *++cptr) != '\n'); - ++outline; - putc('\n', out); - last = '\n'; - } - - while ((c = getc(in)) != EOF) - { - if (c == '\n') - ++outline; - putc(c, out); - last = c; - } - - if (last != '\n') - { - ++outline; - putc('\n', out); - } - if (!lflag) - fprintf(out, line_format, ++outline + 1, code_file_name); -} - - -static void -output_semantic_actions(void) -{ - int c, last; - FILE *out; - - fclose(action_file); - action_file = fopen(action_file_name, "r"); - if (action_file == NULL) - open_error(action_file_name); - - if ((c = getc(action_file)) == EOF) - return; - - out = code_file; - last = c; - if (c == '\n') - ++outline; - putc(c, out); - while ((c = getc(action_file)) != EOF) - { - if (c == '\n') - ++outline; - putc(c, out); - last = c; - } - - if (last != '\n') - { - ++outline; - putc('\n', out); - } - - if (!lflag) - fprintf(out, line_format, ++outline + 1, code_file_name); -} - - -static void -free_itemsets(void) -{ - core *cp, *next; - - free(state_table); - for (cp = first_state; cp; cp = next) - { - next = cp->next; - free(cp); - } -} - - -static void -free_shifts(void) -{ - shifts *sp, *next; - - free(shift_table); - for (sp = first_shift; sp; sp = next) - { - next = sp->next; - free(sp); - } -} - - - -static void -free_reductions(void) -{ - reductions *rp, *next; - - free(reduction_table); - for (rp = first_reduction; rp; rp = next) - { - next = rp->next; - free(rp); - } -} - -/* - * increase_maxtable - * - * inputs - loc location in table - * output - size increased to - * side effects - table is increase by at least 200 short words - */ - -static int -increase_maxtable(int loc) -{ - int newmax; - int l; - - newmax = maxtable; - - do { newmax += 200; } while (newmax <= loc); - table = realloc(table, newmax*sizeof(short)); - if (table == 0) no_space(); - check = realloc(check, newmax*sizeof(short)); - if (check == 0) no_space(); - for (l = maxtable; l < newmax; ++l) - { - table[l] = 0; - check[l] = -1; - } - - return(newmax); -} diff --git a/usr.bin/yacc/skeleton.c b/usr.bin/yacc/skeleton.c deleted file mode 100644 index 285c281c18b..00000000000 --- a/usr.bin/yacc/skeleton.c +++ /dev/null @@ -1,426 +0,0 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if 0 -#ifndef lint -static char sccsid[] = "@(#)skeleton.c 5.8 (Berkeley) 4/29/95"; -#endif -#endif - -#include -__FBSDID("$FreeBSD$"); - -#include "defs.h" - -/* The definition of yysccsid in the banner should be replaced with */ -/* a #pragma ident directive if the target C compiler supports */ -/* #pragma ident directives. */ -/* */ -/* If the skeleton is changed, the banner should be changed so that */ -/* the altered version can be easily distinguished from the original. */ -/* */ -/* The #defines included with the banner are there because they are */ -/* useful in subsequent code. The macros #defined in the header or */ -/* the body either are not useful outside of semantic actions or */ -/* are conditional. */ - -const char *banner[] = -{ - "#include ", - "#include ", - "#ifndef lint", - "#ifdef __unused", - "__unused", - "#endif", - "static char const ", - "yyrcsid[] = \"$FreeBSD$\";", - "#endif", - "#define YYBYACC 1", - "#define YYMAJOR 1", - "#define YYMINOR 9", - "#define YYLEX yylex()", - "#define YYEMPTY -1", - "#define yyclearin (yychar=(YYEMPTY))", - "#define yyerrok (yyerrflag=0)", - "#define YYRECOVERING() (yyerrflag!=0)", - "#if defined(__cplusplus) || __STDC__", - "static int yygrowstack(void);", - "#else", - "static int yygrowstack();", - "#endif", - 0 -}; - - -const char *tables[] = -{ - "extern const short yylhs[];", - "extern const short yylen[];", - "extern const short yydefred[];", - "extern const short yydgoto[];", - "extern const short yysindex[];", - "extern const short yyrindex[];", - "extern const short yygindex[];", - "extern const short yytable[];", - "extern const short yycheck[];", - "#if YYDEBUG", - "extern char *yyname[];", - "extern char *yyrule[];", - "#endif", - 0 -}; - - -const char *header[] = -{ - "#if YYDEBUG", - "#include ", - "#endif", - "#ifdef YYSTACKSIZE", - "#undef YYMAXDEPTH", - "#define YYMAXDEPTH YYSTACKSIZE", - "#else", - "#ifdef YYMAXDEPTH", - "#define YYSTACKSIZE YYMAXDEPTH", - "#else", - "#define YYSTACKSIZE 10000", - "#define YYMAXDEPTH 10000", - "#endif", - "#endif", - "#define YYINITSTACKSIZE 200", - "int yydebug;", - "int yynerrs;", - "int yyerrflag;", - "int yychar;", - "short *yyssp;", - "YYSTYPE *yyvsp;", - "YYSTYPE yyval;", - "YYSTYPE yylval;", - "short *yyss;", - "short *yysslim;", - "YYSTYPE *yyvs;", - "int yystacksize;", - 0 -}; - - -const char *body[] = -{ - "/* allocate initial stack or double stack size, up to YYMAXDEPTH */", - "#if defined(__cplusplus) || __STDC__", - "static int yygrowstack(void)", - "#else", - "static int yygrowstack()", - "#endif", - "{", - " int newsize, i;", - " short *newss;", - " YYSTYPE *newvs;", - "", - " if ((newsize = yystacksize) == 0)", - " newsize = YYINITSTACKSIZE;", - " else if (newsize >= YYMAXDEPTH)", - " return -1;", - " else if ((newsize *= 2) > YYMAXDEPTH)", - " newsize = YYMAXDEPTH;", - " i = yyssp - yyss;", - " newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :", - " (short *)malloc(newsize * sizeof *newss);", - " if (newss == NULL)", - " return -1;", - " yyss = newss;", - " yyssp = newss + i;", - " newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :", - " (YYSTYPE *)malloc(newsize * sizeof *newvs);", - " if (newvs == NULL)", - " return -1;", - " yyvs = newvs;", - " yyvsp = newvs + i;", - " yystacksize = newsize;", - " yysslim = yyss + newsize - 1;", - " return 0;", - "}", - "", - "#define YYABORT goto yyabort", - "#define YYREJECT goto yyabort", - "#define YYACCEPT goto yyaccept", - "#define YYERROR goto yyerrlab", - "", - "#ifndef YYPARSE_PARAM", - "#if defined(__cplusplus) || __STDC__", - "#define YYPARSE_PARAM_ARG void", - "#define YYPARSE_PARAM_DECL", - "#else /* ! ANSI-C/C++ */", - "#define YYPARSE_PARAM_ARG", - "#define YYPARSE_PARAM_DECL", - "#endif /* ANSI-C/C++ */", - "#else /* YYPARSE_PARAM */", - "#ifndef YYPARSE_PARAM_TYPE", - "#define YYPARSE_PARAM_TYPE void *", - "#endif", - "#if defined(__cplusplus) || __STDC__", - "#define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM", - "#define YYPARSE_PARAM_DECL", - "#else /* ! ANSI-C/C++ */", - "#define YYPARSE_PARAM_ARG YYPARSE_PARAM", - "#define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM;", - "#endif /* ANSI-C/C++ */", - "#endif /* ! YYPARSE_PARAM */", - "", - "int", - "yyparse (YYPARSE_PARAM_ARG)", - " YYPARSE_PARAM_DECL", - "{", - " int yym, yyn, yystate;", - "#if YYDEBUG", - " const char *yys;", - "", - " if ((yys = getenv(\"YYDEBUG\")))", - " {", - " yyn = *yys;", - " if (yyn >= '0' && yyn <= '9')", - " yydebug = yyn - '0';", - " }", - "#endif", - "", - " yynerrs = 0;", - " yyerrflag = 0;", - " yychar = (-1);", - "", - " if (yyss == NULL && yygrowstack()) goto yyoverflow;", - " yyssp = yyss;", - " yyvsp = yyvs;", - " *yyssp = yystate = 0;", - "", - "yyloop:", - " if ((yyn = yydefred[yystate])) goto yyreduce;", - " if (yychar < 0)", - " {", - " if ((yychar = yylex()) < 0) yychar = 0;", - "#if YYDEBUG", - " if (yydebug)", - " {", - " yys = 0;", - " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", - " if (!yys) yys = \"illegal-symbol\";", - " printf(\"%sdebug: state %d, reading %d (%s)\\n\",", - " YYPREFIX, yystate, yychar, yys);", - " }", - "#endif", - " }", - " if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&", - " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)", - " {", - "#if YYDEBUG", - " if (yydebug)", - " printf(\"%sdebug: state %d, shifting to state %d\\n\",", - " YYPREFIX, yystate, yytable[yyn]);", - "#endif", - " if (yyssp >= yysslim && yygrowstack())", - " {", - " goto yyoverflow;", - " }", - " *++yyssp = yystate = yytable[yyn];", - " *++yyvsp = yylval;", - " yychar = (-1);", - " if (yyerrflag > 0) --yyerrflag;", - " goto yyloop;", - " }", - " if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&", - " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)", - " {", - " yyn = yytable[yyn];", - " goto yyreduce;", - " }", - " if (yyerrflag) goto yyinrecovery;", - "#if defined(lint) || defined(__GNUC__)", - " goto yynewerror;", - "#endif", - "yynewerror:", - " yyerror(\"syntax error\");", - "#if defined(lint) || defined(__GNUC__)", - " goto yyerrlab;", - "#endif", - "yyerrlab:", - " ++yynerrs;", - "yyinrecovery:", - " if (yyerrflag < 3)", - " {", - " yyerrflag = 3;", - " for (;;)", - " {", - " if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&", - " yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)", - " {", - "#if YYDEBUG", - " if (yydebug)", - " printf(\"%sdebug: state %d, error recovery shifting\\", - " to state %d\\n\", YYPREFIX, *yyssp, yytable[yyn]);", - "#endif", - " if (yyssp >= yysslim && yygrowstack())", - " {", - " goto yyoverflow;", - " }", - " *++yyssp = yystate = yytable[yyn];", - " *++yyvsp = yylval;", - " goto yyloop;", - " }", - " else", - " {", - "#if YYDEBUG", - " if (yydebug)", - " printf(\"%sdebug: error recovery discarding state %d\ -\\n\",", - " YYPREFIX, *yyssp);", - "#endif", - " if (yyssp <= yyss) goto yyabort;", - " --yyssp;", - " --yyvsp;", - " }", - " }", - " }", - " else", - " {", - " if (yychar == 0) goto yyabort;", - "#if YYDEBUG", - " if (yydebug)", - " {", - " yys = 0;", - " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", - " if (!yys) yys = \"illegal-symbol\";", - " printf(\"%sdebug: state %d, error recovery discards token %d\ - (%s)\\n\",", - " YYPREFIX, yystate, yychar, yys);", - " }", - "#endif", - " yychar = (-1);", - " goto yyloop;", - " }", - "yyreduce:", - "#if YYDEBUG", - " if (yydebug)", - " printf(\"%sdebug: state %d, reducing by rule %d (%s)\\n\",", - " YYPREFIX, yystate, yyn, yyrule[yyn]);", - "#endif", - " yym = yylen[yyn];", - " if (yym)", - " yyval = yyvsp[1-yym];", - " else", - " memset(&yyval, 0, sizeof yyval);", - " switch (yyn)", - " {", - 0 -}; - - -const char *trailer[] = -{ - " }", - " yyssp -= yym;", - " yystate = *yyssp;", - " yyvsp -= yym;", - " yym = yylhs[yyn];", - " if (yystate == 0 && yym == 0)", - " {", - "#if YYDEBUG", - " if (yydebug)", - " printf(\"%sdebug: after reduction, shifting from state 0 to\\", - " state %d\\n\", YYPREFIX, YYFINAL);", - "#endif", - " yystate = YYFINAL;", - " *++yyssp = YYFINAL;", - " *++yyvsp = yyval;", - " if (yychar < 0)", - " {", - " if ((yychar = yylex()) < 0) yychar = 0;", - "#if YYDEBUG", - " if (yydebug)", - " {", - " yys = 0;", - " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", - " if (!yys) yys = \"illegal-symbol\";", - " printf(\"%sdebug: state %d, reading %d (%s)\\n\",", - " YYPREFIX, YYFINAL, yychar, yys);", - " }", - "#endif", - " }", - " if (yychar == 0) goto yyaccept;", - " goto yyloop;", - " }", - " if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&", - " yyn <= YYTABLESIZE && yycheck[yyn] == yystate)", - " yystate = yytable[yyn];", - " else", - " yystate = yydgoto[yym];", - "#if YYDEBUG", - " if (yydebug)", - " printf(\"%sdebug: after reduction, shifting from state %d \\", - "to state %d\\n\", YYPREFIX, *yyssp, yystate);", - "#endif", - " if (yyssp >= yysslim && yygrowstack())", - " {", - " goto yyoverflow;", - " }", - " *++yyssp = yystate;", - " *++yyvsp = yyval;", - " goto yyloop;", - "yyoverflow:", - " yyerror(\"yacc stack overflow\");", - "yyabort:", - " return (1);", - "yyaccept:", - " return (0);", - "}", - 0 -}; - - -void -write_section(const char *section[]) -{ - int c; - int i; - const char *s; - FILE *f; - - f = code_file; - for (i = 0; (s = section[i]); ++i) - { - ++outline; - while ((c = *s)) - { - putc(c, f); - ++s; - } - putc('\n', f); - } -} diff --git a/usr.bin/yacc/symtab.c b/usr.bin/yacc/symtab.c deleted file mode 100644 index ffb81273ce2..00000000000 --- a/usr.bin/yacc/symtab.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if 0 -#ifndef lint -static char sccsid[] = "@(#)symtab.c 5.3 (Berkeley) 6/1/90"; -#endif -#endif - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include "defs.h" - -/* TABLE_SIZE is the number of entries in the symbol table. */ -/* TABLE_SIZE must be a power of two. */ - -#define TABLE_SIZE 1024 - -static int hash(const char *); - -bucket **symbol_table; -bucket *first_symbol; -bucket *last_symbol; - - -static int -hash(const char *name) -{ - const char *s; - int c, k; - - assert(name && *name); - s = name; - k = *s; - while ((c = *++s)) - k = (31*k + c) & (TABLE_SIZE - 1); - - return (k); -} - - -bucket * -make_bucket(const char *name) -{ - bucket *bp; - - assert(name); - bp = malloc(sizeof(bucket)); - if (bp == 0) no_space(); - bp->link = 0; - bp->next = 0; - bp->name = malloc(strlen(name) + 1); - if (bp->name == 0) no_space(); - bp->tag = 0; - bp->value = UNDEFINED; - bp->index = 0; - bp->prec = 0; - bp-> class = UNKNOWN; - bp->assoc = TOKEN; - - if (bp->name == 0) no_space(); - strcpy(bp->name, name); - - return (bp); -} - - -bucket * -lookup(char *name) -{ - bucket *bp, **bpp; - - bpp = symbol_table + hash(name); - bp = *bpp; - - while (bp) - { - if (strcmp(name, bp->name) == 0) return (bp); - bpp = &bp->link; - bp = *bpp; - } - - *bpp = bp = make_bucket(name); - last_symbol->next = bp; - last_symbol = bp; - - return (bp); -} - - -void -create_symbol_table(void) -{ - int i; - bucket *bp; - - symbol_table = malloc(TABLE_SIZE*sizeof(bucket *)); - if (symbol_table == 0) no_space(); - for (i = 0; i < TABLE_SIZE; i++) - symbol_table[i] = 0; - - bp = make_bucket("error"); - bp->index = 1; - bp->class = TERM; - - first_symbol = bp; - last_symbol = bp; - symbol_table[hash("error")] = bp; -} - - -void -free_symbol_table(void) -{ - free(symbol_table); - symbol_table = 0; -} - - -void -free_symbols(void) -{ - bucket *p, *q; - - for (p = first_symbol; p; p = q) - { - q = p->next; - free(p); - } -} diff --git a/usr.bin/yacc/test/error.tab.c b/usr.bin/yacc/test/error.tab.c deleted file mode 100644 index 2e309b8447f..00000000000 --- a/usr.bin/yacc/test/error.tab.c +++ /dev/null @@ -1,317 +0,0 @@ -#ifndef lint -static char const yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; -#endif -#include -#define YYBYACC 1 -#define YYMAJOR 1 -#define YYMINOR 9 -#define YYLEX yylex() -#define YYEMPTY -1 -#define yyclearin (yychar=(YYEMPTY)) -#define yyerrok (yyerrflag=0) -#define YYRECOVERING (yyerrflag!=0) -#if defined(c_plusplus) || defined(__cplusplus) -#include -#else -extern char *getenv(); -extern void *realloc(); -#endif -static int yygrowstack(); -#define YYPREFIX "yy" -#define YYERRCODE 256 -const short yylhs[] = { -1, - 0, -}; -const short yylen[] = { 2, - 1, -}; -const short yydefred[] = { 0, - 1, 0, -}; -const short yydgoto[] = { 2, -}; -const short yysindex[] = { -256, - 0, 0, -}; -const short yyrindex[] = { 0, - 0, 0, -}; -const short yygindex[] = { 0, -}; -#define YYTABLESIZE 0 -const short yytable[] = { 1, -}; -const short yycheck[] = { 256, -}; -#define YYFINAL 2 -#ifndef YYDEBUG -#define YYDEBUG 0 -#elif YYDEBUG -#include -#endif -#define YYMAXTOKEN 0 -#if YYDEBUG -const char * const yyname[] = { -"end-of-file", -}; -const char * const yyrule[] = { -"$accept : S", -"S : error", -}; -#endif -#ifndef YYSTYPE -typedef int YYSTYPE; -#endif -#ifdef YYSTACKSIZE -#undef YYMAXDEPTH -#define YYMAXDEPTH YYSTACKSIZE -#else -#ifdef YYMAXDEPTH -#define YYSTACKSIZE YYMAXDEPTH -#else -#define YYSTACKSIZE 10000 -#define YYMAXDEPTH 10000 -#endif -#endif -#define YYINITSTACKSIZE 200 -int yydebug; -int yynerrs; -int yyerrflag; -int yychar; -short *yyssp; -YYSTYPE *yyvsp; -YYSTYPE yyval; -YYSTYPE yylval; -short *yyss; -short *yysslim; -YYSTYPE *yyvs; -int yystacksize; -#line 4 "error.y" -main(){printf("yyparse() = %d\n",yyparse());} -yylex(){return-1;} -yyerror(s)char*s;{printf("%s\n",s);} -#line 92 "error.tab.c" -/* allocate initial stack or double stack size, up to YYMAXDEPTH */ -static int yygrowstack() -{ - int newsize, i; - short *newss; - YYSTYPE *newvs; - - if ((newsize = yystacksize) == 0) - newsize = YYINITSTACKSIZE; - else if (newsize >= YYMAXDEPTH) - return -1; - else if ((newsize *= 2) > YYMAXDEPTH) - newsize = YYMAXDEPTH; - i = yyssp - yyss; - if ((newss = (short *)realloc(yyss, newsize * sizeof *newss)) == NULL) - return -1; - yyss = newss; - yyssp = newss + i; - if ((newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs)) == NULL) - return -1; - yyvs = newvs; - yyvsp = newvs + i; - yystacksize = newsize; - yysslim = yyss + newsize - 1; - return 0; -} - -#define YYABORT goto yyabort -#define YYREJECT goto yyabort -#define YYACCEPT goto yyaccept -#define YYERROR goto yyerrlab - -int -yyparse() -{ - register int yym, yyn, yystate; -#if YYDEBUG - register const char *yys; - - if ((yys = getenv("YYDEBUG"))) - { - yyn = *yys; - if (yyn >= '0' && yyn <= '9') - yydebug = yyn - '0'; - } -#endif - - yynerrs = 0; - yyerrflag = 0; - yychar = (-1); - - if (yyss == NULL && yygrowstack()) goto yyoverflow; - yyssp = yyss; - yyvsp = yyvs; - *yyssp = yystate = 0; - -yyloop: - if ((yyn = yydefred[yystate])) goto yyreduce; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, reading %d (%s)\n", - YYPREFIX, yystate, yychar, yys); - } -#endif - } - if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, shifting to state %d\n", - YYPREFIX, yystate, yytable[yyn]); -#endif - if (yyssp >= yysslim && yygrowstack()) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - yychar = (-1); - if (yyerrflag > 0) --yyerrflag; - goto yyloop; - } - if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { - yyn = yytable[yyn]; - goto yyreduce; - } - if (yyerrflag) goto yyinrecovery; -#if defined(lint) || defined(__GNUC__) - goto yynewerror; -#endif -yynewerror: - yyerror("syntax error"); -#if defined(lint) || defined(__GNUC__) - goto yyerrlab; -#endif -yyerrlab: - ++yynerrs; -yyinrecovery: - if (yyerrflag < 3) - { - yyerrflag = 3; - for (;;) - { - if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, error recovery shifting\ - to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); -#endif - if (yyssp >= yysslim && yygrowstack()) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - goto yyloop; - } - else - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: error recovery discarding state %d\n", - YYPREFIX, *yyssp); -#endif - if (yyssp <= yyss) goto yyabort; - --yyssp; - --yyvsp; - } - } - } - else - { - if (yychar == 0) goto yyabort; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, error recovery discards token %d (%s)\n", - YYPREFIX, yystate, yychar, yys); - } -#endif - yychar = (-1); - goto yyloop; - } -yyreduce: -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, reducing by rule %d (%s)\n", - YYPREFIX, yystate, yyn, yyrule[yyn]); -#endif - yym = yylen[yyn]; - yyval = yyvsp[1-yym]; - switch (yyn) - { - } - yyssp -= yym; - yystate = *yyssp; - yyvsp -= yym; - yym = yylhs[yyn]; - if (yystate == 0 && yym == 0) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: after reduction, shifting from state 0 to\ - state %d\n", YYPREFIX, YYFINAL); -#endif - yystate = YYFINAL; - *++yyssp = YYFINAL; - *++yyvsp = yyval; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, reading %d (%s)\n", - YYPREFIX, YYFINAL, yychar, yys); - } -#endif - } - if (yychar == 0) goto yyaccept; - goto yyloop; - } - if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yystate) - yystate = yytable[yyn]; - else - yystate = yydgoto[yym]; -#if YYDEBUG - if (yydebug) - printf("%sdebug: after reduction, shifting from state %d \ -to state %d\n", YYPREFIX, *yyssp, yystate); -#endif - if (yyssp >= yysslim && yygrowstack()) - { - goto yyoverflow; - } - *++yyssp = yystate; - *++yyvsp = yyval; - goto yyloop; -yyoverflow: - yyerror("yacc stack overflow"); -yyabort: - return (1); -yyaccept: - return (0); -} diff --git a/usr.bin/yacc/test/error.y b/usr.bin/yacc/test/error.y deleted file mode 100644 index 41148ea92db..00000000000 --- a/usr.bin/yacc/test/error.y +++ /dev/null @@ -1,6 +0,0 @@ -%% -S: error -%% -main(){printf("yyparse() = %d\n",yyparse());} -yylex(){return-1;} -yyerror(s)char*s;{printf("%s\n",s);} diff --git a/usr.bin/yacc/warshall.c b/usr.bin/yacc/warshall.c deleted file mode 100644 index bdcc6e46013..00000000000 --- a/usr.bin/yacc/warshall.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Paul Corbett. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if 0 -#ifndef lint -static char sccsid[] = "@(#)warshall.c 5.4 (Berkeley) 5/24/93"; -#endif -#endif - -#include -__FBSDID("$FreeBSD$"); - -#include "defs.h" - -static void transitive_closure(unsigned *, int); - -static void -transitive_closure(unsigned *R, int n) -{ - int rowsize; - unsigned i; - unsigned *rowj; - unsigned *rp; - unsigned *rend; - unsigned *ccol; - unsigned *relend; - unsigned *cword; - unsigned *rowi; - - rowsize = WORDSIZE(n); - relend = R + n*rowsize; - - cword = R; - i = 0; - rowi = R; - while (rowi < relend) - { - ccol = cword; - rowj = R; - - while (rowj < relend) - { - if (*ccol & (1 << i)) - { - rp = rowi; - rend = rowj + rowsize; - while (rowj < rend) - *rowj++ |= *rp++; - } - else - { - rowj += rowsize; - } - - ccol += rowsize; - } - - if (++i >= BITS_PER_WORD) - { - i = 0; - cword++; - } - - rowi += rowsize; - } -} - -void -reflexive_transitive_closure(unsigned *R, int n) -{ - int rowsize; - unsigned i; - unsigned *rp; - unsigned *relend; - - transitive_closure(R, n); - - rowsize = WORDSIZE(n); - relend = R + n*rowsize; - - i = 0; - rp = R; - while (rp < relend) - { - *rp |= (1 << i); - if (++i >= BITS_PER_WORD) - { - i = 0; - rp++; - } - - rp += rowsize; - } -} diff --git a/usr.bin/yacc/yacc.1 b/usr.bin/yacc/yacc.1 deleted file mode 100644 index 6e5bacba8ff..00000000000 --- a/usr.bin/yacc/yacc.1 +++ /dev/null @@ -1,169 +0,0 @@ -.\" Copyright (c) 1989, 1990 The Regents of the University of California. -.\" All rights reserved. -.\" -.\" This code is derived from software contributed to Berkeley by -.\" Robert Paul Corbett. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)yacc.1 5.8 (Berkeley) 5/24/93 -.\" $FreeBSD$ -.\" $OpenBSD: yacc.1,v 1.14 2001/05/01 17:58:05 aaron Exp $ -.\" -.Dd May 24, 1993 -.Dt YACC 1 -.Os -.Sh NAME -.Nm yacc -.Nd an LALR(1) parser generator -.Sh SYNOPSIS -.Nm -.Op Fl dlrtvy -.Op Fl b Ar file_prefix -.Op Fl o Ar output_filename -.Op Fl p Ar symbol_prefix -.Ar filename -.Sh DESCRIPTION -The -.Nm -utility reads the grammar specification in the file -.Ar filename -and generates an LR(1) parser for it. -The parsers consist of a set of LALR(1) parsing tables and a driver routine -written in the C programming language. -The -.Nm -utility normally writes the parse tables and the driver routine to the file -.Pa y.tab.c . -.Pp -The following options are available: -.Bl -tag -width indent -.It Fl b Ar file_prefix -Change the prefix prepended to the output file names to -the string denoted by -.Ar file_prefix . -The default prefix is the character -.Pa y . -.It Fl d -Cause the header file -.Pa y.tab.h -to be written. -.It Fl l -If the -.Fl l -option is not specified, -.Nm -will insert #line directives in the generated code. -The #line directives let the C compiler relate errors in the -generated code to the user's original code. -If the -.Fl l -option is specified, -.Nm -will not insert the #line directives. -Any #line directives specified by the user will be retained. -.It Fl o Ar output_filename -Cause -.Nm -to write the generated code to -.Ar output_filename -instead of the default file, -.Pa y.tab.c . -.It Fl p Ar symbol_prefix -Change the prefix prepended to yacc-generated symbols to -the string denoted by -.Ar symbol_prefix . -The default prefix is the string -.Pa yy . -.It Fl r -Cause -.Nm -to produce separate files for code and tables. -The code file -is named -.Pa y.code.c , -and the tables file is named -.Pa y.tab.c . -.It Fl t -Change the preprocessor directives generated by -.Nm -so that debugging statements will be incorporated in the compiled code. -.It Fl v -Cause a human-readable description of the generated parser to -be written to the file -.Pa y.output . -.It Fl y -NOOP for bison compatibility. -.Nm -is already designed to be POSIX yacc compatible. -.El -.Sh ENVIRONMENT -.Bl -tag -width ".Ev TMPDIR" -.It Ev TMPDIR -Name of directory where temporary files are to be created. -.El -.Sh TABLES -The names of the tables generated by this version of -.Nm -are -.Va yylhs , yylen , yydefred , yydgoto , yysindex , -.Va yyrindex , yygindex , yytable , -and -.Va yycheck . -Two additional tables, -.Va yyname -and -.Va yyrule , -are created if -.Dv YYDEBUG -is defined and non-zero. -.Sh FILES -.Bl -tag -width "Pa /tmp/yacc.aXXXXXXXXXX" -compact -.It Pa y.code.c -.It Pa y.tab.c -.It Pa y.tab.h -.It Pa y.output -.It Pa /tmp/yacc.aXXXXXXXXXX -.It Pa /tmp/yacc.tXXXXXXXXXX -.It Pa /tmp/yacc.uXXXXXXXXXX -.El -.Sh DIAGNOSTICS -If there are rules that are never reduced, -the number of such rules is reported on standard error. -If there are any -.Tn LALR(1) -conflicts, -the number of conflicts is reported on standard error. -.Sh SEE ALSO -.Xr yyfix 1 -.Sh STANDARDS -The -.Nm -utility conforms to -.St -p1003.2 . -.Sh HISTORY -A -.Nm -command appeared in PWB UNIX. diff --git a/usr.bin/yacc/yyfix.1 b/usr.bin/yacc/yyfix.1 deleted file mode 100644 index 13c5d9225c7..00000000000 --- a/usr.bin/yacc/yyfix.1 +++ /dev/null @@ -1,110 +0,0 @@ -.\" Copyright (c) 1990, 1991 The Regents of the University of California. -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)yyfix.1 5.4 (Berkeley) 3/23/93 -.\" $FreeBSD$ -.\" -.Dd March 23, 1993 -.Dt YYFIX 1 -.Os -.Sh NAME -.Nm yyfix -.Nd extract tables from y.tab.c -.Sh SYNOPSIS -.Nm -.Ar file -.Op Ar tables -.Sh DESCRIPTION -Programs have historically used a script (often named -.Dq :yyfix ) -to extract tables from the -.Xr yacc 1 -generated file -.Pa y.tab.c . -As the names of the tables generated by the current version of -.Xr yacc 1 -are different from those of historical versions of -.Xr yacc 1 , -the shell script -.Nm -is provided to simplify the transition. -.Pp -The first (and required) argument to -.Nm -is the name of the file where the extracted tables should be stored. -.Pp -If further command line arguments are specified, they are taken as -the list of tables to be extracted. -Otherwise, -.Nm -attempts to determine if the -.Pa y.tab.c -file is from an old or new -.Xr yacc 1 , -and extracts the appropriate tables. -.Pp -The tables -.Dq yyexca , -.Dq yyact , -.Dq yypact , -.Dq yypgo , -.Dq yyr1 , -.Dq yyr2 , -.Dq yychk , -and -.Dq yydef -are extracted -from historical versions of -.Xr yacc 1 . -.Pp -The tables -.Dq yylhs , -.Dq yylen , -.Dq yydefred , -.Dq yydgoto , -.Dq yysindex , -.Dq yyrindex , -.Dq yygindex , -.Dq yytable , -.Dq yyname , -.Dq yyrule , -and -.Dq yycheck , -are extracted from the current version of -.Xr yacc 1 . -.Sh FILES -.Bl -tag -width y.tab.c -.It Pa y.tab.c -File from which tables are extracted. -.El -.Sh SEE ALSO -.Xr yacc 1 -.Sh HISTORY -The -.Nm -command first appeared in -.Bx 4.4 . diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile index 68b82e7a060..c16821f7101 100644 --- a/usr.sbin/Makefile +++ b/usr.sbin/Makefile @@ -223,6 +223,11 @@ SUBDIR+= lpr SUBDIR+= manctl .endif +.if ${MK_NAND} != "no" +SUBDIR+= nandsim +SUBDIR+= nandtool +.endif + .if ${MK_NETGRAPH} != "no" SUBDIR+= flowctl SUBDIR+= lmcconfig @@ -254,9 +259,12 @@ SUBDIR+= keyserv SUBDIR+= ftp-proxy .endif +.if ${MK_PKGBOOTSTRAP} != "no" +SUBDIR+= pkg +.endif + .if ${MK_PKGTOOLS} != "no" SUBDIR+= pkg_install -SUBDIR+= pkg .endif # XXX MK_TOOLCHAIN? diff --git a/usr.sbin/acpi/acpidump/acpi.c b/usr.sbin/acpi/acpidump/acpi.c index c273e26c627..8a05ef1e732 100644 --- a/usr.sbin/acpi/acpidump/acpi.c +++ b/usr.sbin/acpi/acpidump/acpi.c @@ -654,16 +654,24 @@ acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp) printf(END_COMMENT); return; } + if(sdp->Revision == 1){ + printf("\tOLD TCPA spec log found. Dumping not supported.\n"); + printf(END_COMMENT); + return; + } vaddr = (unsigned char *)acpi_map_physical(paddr, len); vend = vaddr + len; while (vaddr != NULL) { - if (vaddr + sizeof(struct TCPAevent) >= vend) + if ((vaddr + sizeof(struct TCPAevent) >= vend)|| + (vaddr + sizeof(struct TCPAevent) < vaddr)) break; event = (struct TCPAevent *)(void *)vaddr; if (vaddr + event->event_size >= vend) break; + if (vaddr + event->event_size < vaddr) + break; if (event->event_type == 0 && event->event_size == 0) break; #if 0 @@ -1196,13 +1204,13 @@ aml_disassemble(ACPI_TABLE_HEADER *rsdt, ACPI_TABLE_HEADER *dsdp) if (tmpdir == NULL) tmpdir = _PATH_TMP; strncpy(tmpstr, tmpdir, sizeof(tmpstr)); - strncat(tmpstr, "/acpidump.", sizeof(tmpstr) - strlen(tmpdir)); if (realpath(tmpstr, buf) == NULL) { - perror("realpath tmp file"); + perror("realpath tmp dir"); return; } strncpy(tmpstr, buf, sizeof(tmpstr)); - len = strlen(buf); + strncat(tmpstr, "/acpidump.", sizeof(tmpstr) - strlen(buf)); + len = strlen(tmpstr); tmpext = tmpstr + len; strncpy(tmpext, "XXXXXX", sizeof(tmpstr) - len); fd = mkstemp(tmpstr); diff --git a/usr.sbin/acpi/iasl/Makefile b/usr.sbin/acpi/iasl/Makefile index 58f9429929f..6d31d05b46a 100644 --- a/usr.sbin/acpi/iasl/Makefile +++ b/usr.sbin/acpi/iasl/Makefile @@ -4,8 +4,8 @@ PROG= iasl SRCS= adfile.c adisasm.c adwalk.c # common -SRCS+= dmextern.c dmrestag.c dmtable.c dmtbdump.c dmtbinfo.c \ - getopt.c +SRCS+= ahpredef.c dmextern.c dmrestag.c dmtable.c dmtbdump.c \ + dmtbinfo.c getopt.c # compiler SRCS+= aslanalyze.c aslbtypes.c aslcodegen.c aslcompile.c \ diff --git a/usr.sbin/adduser/rmuser.8 b/usr.sbin/adduser/rmuser.8 index 68a99b59355..e24d5eedf86 100644 --- a/usr.sbin/adduser/rmuser.8 +++ b/usr.sbin/adduser/rmuser.8 @@ -157,7 +157,7 @@ Identifies one or more users to be removed; if not present, interactively asks for one or more users to be removed. .El .Sh FILES -.Bl -tag -compact +.Bl -tag -width "Pa /etc/master.passwd" -compact .It Pa /etc/master.passwd .It Pa /etc/passwd .It Pa /etc/group diff --git a/usr.sbin/ancontrol/ancontrol.c b/usr.sbin/ancontrol/ancontrol.c index 4a114538a19..839cdcb311e 100644 --- a/usr.sbin/ancontrol/ancontrol.c +++ b/usr.sbin/ancontrol/ancontrol.c @@ -1443,7 +1443,7 @@ an_enable_leap_mode(const char *iface, const char *username) caps = (struct an_ltv_caps *)&areq; - if (!caps->an_softcaps & AN_AUTHTYPE_LEAP) { + if (!(caps->an_softcaps & AN_AUTHTYPE_LEAP)) { fprintf(stderr, "Firmware does not support LEAP\n"); exit(1); } diff --git a/usr.sbin/apmd/apmd.8 b/usr.sbin/apmd/apmd.8 index 5bfd9dc390e..633217fd329 100644 --- a/usr.sbin/apmd/apmd.8 +++ b/usr.sbin/apmd/apmd.8 @@ -245,13 +245,13 @@ just as with a command line. The following built-in functions are currently supported: .Bl -item .It -- reject: -.Bd -ragged -offset indent +.Bl -tag -width ".It - reject" +.It - reject Reject last request posted by APM BIOS. This can be used to reject a SUSPEND request when the LCD is closed and put the system in a STANDBY state instead. -.Ed +.El .El .Ed .El diff --git a/usr.sbin/arp/arp.4 b/usr.sbin/arp/arp.4 index d537350d0ce..b7273f2a102 100644 --- a/usr.sbin/arp/arp.4 +++ b/usr.sbin/arp/arp.4 @@ -113,13 +113,13 @@ MIB variable .Va net.link.ether.inet.proxyall to 1. .Sh MIB Variables -The ARP protocol implements a number of configrable variables in +The ARP protocol implements a number of configurable variables in .Va net.link.ether.inet branch of the .Xr sysctl 3 MIB. -.Bl -tag +.Bl -tag -width "useloopback" .It Va max_age How long an ARP entry is held in the cache until it needs to be refreshed. .It Va maxtries diff --git a/usr.sbin/bluetooth/bthidcontrol/bthidcontrol.8 b/usr.sbin/bluetooth/bthidcontrol/bthidcontrol.8 index 7625b39e0e3..690b9422d17 100644 --- a/usr.sbin/bluetooth/bthidcontrol/bthidcontrol.8 +++ b/usr.sbin/bluetooth/bthidcontrol/bthidcontrol.8 @@ -83,7 +83,7 @@ The currently supported node commands in .Nm are: .Pp -.Bl -tag -offset indent -compact +.Bl -tag -width "Forget" -offset indent -compact .It Cm Query .It Cm Dump .It Cm Known diff --git a/usr.sbin/bluetooth/bthidd/parser.y b/usr.sbin/bluetooth/bthidd/parser.y index ca49059a035..50468f4e03a 100644 --- a/usr.sbin/bluetooth/bthidd/parser.y +++ b/usr.sbin/bluetooth/bthidd/parser.y @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -61,7 +62,6 @@ #include "bthid_config.h" - int yyparse (void); int yylex (void); void yyerror (char const *); static int32_t check_hid_device(hid_device_p hid_device); diff --git a/usr.sbin/bluetooth/btpand/btpand.8 b/usr.sbin/bluetooth/btpand/btpand.8 index b9726bf9486..97a0d13fce2 100644 --- a/usr.sbin/bluetooth/btpand/btpand.8 +++ b/usr.sbin/bluetooth/btpand/btpand.8 @@ -128,7 +128,7 @@ and 1 for a PANU server. Set L2CAP connection link mode. Supported modes are: .Pp -.Bl -tag -compact +.Bl -tag -width 8n -compact .It auth require devices to be paired. .It encrypt @@ -151,7 +151,7 @@ Name of .Ar service to provide or connect to, the following services are recognised: .Pp -.Bl -tag -compact +.Bl -tag -width 8n -compact .It GN Group ad-hoc Network. .It NAP @@ -182,7 +182,7 @@ has set up the client or server connection and opened the .Xr tap 4 interface, it will create a pid file and detach. .Sh FILES -.Bl -tag -compact +.Bl -tag -width "Pa /etc/bluetooth/hosts" -compact .It Pa /dev/tap .It Pa /etc/bluetooth/hosts .It Pa /var/run/sdp diff --git a/usr.sbin/bluetooth/hccontrol/hccontrol.8 b/usr.sbin/bluetooth/hccontrol/hccontrol.8 index b98a0fc59b5..54be8237b2c 100644 --- a/usr.sbin/bluetooth/hccontrol/hccontrol.8 +++ b/usr.sbin/bluetooth/hccontrol/hccontrol.8 @@ -81,7 +81,7 @@ The currently supported HCI commands in .Nm are: .Pp -.Bl -tag -offset indent -compact +.Bl -tag -width 40n -offset indent -compact .It Cm Inquiry .It Cm Create_Connection .It Cm Disconnect @@ -148,7 +148,7 @@ The currently supported node commands in .Nm are: .Pp -.Bl -tag -offset indent -compact +.Bl -tag -width 40n -offset indent -compact .It Cm Read_Node_State .It Cm Initialize .It Cm Read_Debug_Level diff --git a/usr.sbin/bluetooth/hcsecd/parser.y b/usr.sbin/bluetooth/hcsecd/parser.y index 385bff257b3..ec91c484cae 100644 --- a/usr.sbin/bluetooth/hcsecd/parser.y +++ b/usr.sbin/bluetooth/hcsecd/parser.y @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include diff --git a/usr.sbin/bluetooth/l2control/l2control.8 b/usr.sbin/bluetooth/l2control/l2control.8 index f2949304882..7636d9422e2 100644 --- a/usr.sbin/bluetooth/l2control/l2control.8 +++ b/usr.sbin/bluetooth/l2control/l2control.8 @@ -77,7 +77,7 @@ The currently supported node commands in .Nm are: .Pp -.Bl -tag -offset indent -compact +.Bl -tag -width "Write_Auto_Disconnect_Timeout" -offset indent -compact .It Cm Read_Node_Flags .It Cm Read_Debug_Level .It Cm Write_Debug_Level diff --git a/usr.sbin/bluetooth/sdpcontrol/sdpcontrol.8 b/usr.sbin/bluetooth/sdpcontrol/sdpcontrol.8 index f0d375a0159..8104bba7ade 100644 --- a/usr.sbin/bluetooth/sdpcontrol/sdpcontrol.8 +++ b/usr.sbin/bluetooth/sdpcontrol/sdpcontrol.8 @@ -86,7 +86,7 @@ The currently supported node commands in .Nm are: .Pp -.Bl -tag -offset indent -compact +.Bl -tag -width "Browse" -offset indent -compact .It Cm Browse .It Cm Search .El diff --git a/usr.sbin/bsdinstall/partedit/diskeditor.c b/usr.sbin/bsdinstall/partedit/diskeditor.c index 94c374b8112..7933caabf03 100644 --- a/usr.sbin/bsdinstall/partedit/diskeditor.c +++ b/usr.sbin/bsdinstall/partedit/diskeditor.c @@ -74,7 +74,7 @@ diskeditor_show(const char *title, const char *cprompt, int x, y; int i; int height, width, min_width; - int partlist_height, partlist_width, min_partlist_width; + int partlist_height, partlist_width; int cur_scroll = 0; int key, fkey; int cur_button = 0, cur_part = 0; @@ -102,7 +102,6 @@ diskeditor_show(const char *title, const char *cprompt, min_width = 50; height = width = 0; partlist_height = 10; - min_partlist_width = 0; dlg_tab_correct_str(prompt); dlg_button_layout(buttons, &min_width); dlg_auto_size(title, prompt, &height, &width, 2, min_width); diff --git a/usr.sbin/bsdinstall/partedit/part_wizard.c b/usr.sbin/bsdinstall/partedit/part_wizard.c index efd4a07c256..e840ac95bce 100644 --- a/usr.sbin/bsdinstall/partedit/part_wizard.c +++ b/usr.sbin/bsdinstall/partedit/part_wizard.c @@ -294,8 +294,6 @@ wizard_makeparts(struct gmesh *mesh, const char *disk) struct gmesh submesh; struct gclass *classp; struct ggeom *gp; - struct gconfig *gc; - const char *scheme; struct gprovider *pp; intmax_t swapsize, available; char swapsizestr[10], rootsizestr[10]; @@ -309,10 +307,6 @@ wizard_makeparts(struct gmesh *mesh, const char *disk) if (strcmp(gp->lg_name, disk) == 0) break; - LIST_FOREACH(gc, &gp->lg_config, lg_config) - if (strcmp(gc->lg_name, "scheme") == 0) - scheme = gc->lg_val; - pp = provider_for_name(mesh, disk); available = gpart_max_free(gp, NULL)*pp->lg_sectorsize; diff --git a/usr.sbin/bsdinstall/scripts/mirrorselect b/usr.sbin/bsdinstall/scripts/mirrorselect index 437f50d86e1..7b9ad653423 100755 --- a/usr.sbin/bsdinstall/scripts/mirrorselect +++ b/usr.sbin/bsdinstall/scripts/mirrorselect @@ -87,7 +87,7 @@ MIRROR=`dialog --backtitle "FreeBSD Installer" \ ftp://ftp.fr.freebsd.org "France"\ ftp://ftp2.fr.freebsd.org "IPv6 France #2"\ ftp://ftp3.fr.freebsd.org "France #3"\ - ftp://ftp4.fr.freebsd.org "France #4"\ + ftp://ftp4.fr.freebsd.org "IPv6 France #4"\ ftp://ftp5.fr.freebsd.org "France #5"\ ftp://ftp6.fr.freebsd.org "France #6"\ ftp://ftp8.fr.freebsd.org "IPv6 France #8"\ diff --git a/usr.sbin/bsnmpd/modules/snmp_netgraph/snmp_netgraph.3 b/usr.sbin/bsnmpd/modules/snmp_netgraph/snmp_netgraph.3 index a315938c805..9d9e5991008 100644 --- a/usr.sbin/bsnmpd/modules/snmp_netgraph/snmp_netgraph.3 +++ b/usr.sbin/bsnmpd/modules/snmp_netgraph/snmp_netgraph.3 @@ -305,7 +305,7 @@ This buffer should be at least .Li NG_NODESIZ bytes long. The function returns the node id or 0 if the -node is not found +node is not found. .Pp The function .Fn ng_node_type @@ -396,7 +396,8 @@ of the node with id .Fa peer . The functions return 0 on success or -1 otherwise. The function -.Fn ng_connect2_tee_id does the same as +.Fn ng_connect2_tee_id +does the same as .Fn ng_connect2_id except, that it puts an unnamed tee node between the two nodes. .Pp diff --git a/usr.sbin/bsnmpd/modules/snmp_wlan/snmp_wlan.3 b/usr.sbin/bsnmpd/modules/snmp_wlan/snmp_wlan.3 index 8282fb8ebe6..6c6af4708e7 100644 --- a/usr.sbin/bsnmpd/modules/snmp_wlan/snmp_wlan.3 +++ b/usr.sbin/bsnmpd/modules/snmp_wlan/snmp_wlan.3 @@ -61,8 +61,8 @@ via .Va wlanParentIfName column. Any optional parameters may be set via the -.Va wlanIfaceOperatingMode, -.Va wlanIfaceFlags, +.Va wlanIfaceOperatingMode , +.Va wlanIfaceFlags , .Va wlanIfaceBssid and .Va wlanIfaceLocalAddress diff --git a/usr.sbin/config/config.h b/usr.sbin/config/config.h index 6d66167ece1..f275749c825 100644 --- a/usr.sbin/config/config.h +++ b/usr.sbin/config/config.h @@ -171,7 +171,6 @@ char *path(const char *); char *raisestr(char *); void remember(const char *); void moveifchanged(const char *, const char *); -int yyparse(void); int yylex(void); void options(void); void makefile(void); diff --git a/usr.sbin/config/main.c b/usr.sbin/config/main.c index 28d4f8abe46..14061c2081c 100644 --- a/usr.sbin/config/main.c +++ b/usr.sbin/config/main.c @@ -91,6 +91,7 @@ static void usage(void); static void cleanheaders(char *); static void kernconfdump(const char *); static void checkversion(void); +extern int yyparse(void); struct hdr_list { char *h_name; diff --git a/usr.sbin/cpucontrol/amd.c b/usr.sbin/cpucontrol/amd.c index be0e0de7829..3ba435c1aab 100644 --- a/usr.sbin/cpucontrol/amd.c +++ b/usr.sbin/cpucontrol/amd.c @@ -160,7 +160,7 @@ amd_update(const char *dev, const char *path) args.data = fw_image; args.size = st.st_size; - error = ioctl(fd, CPUCTL_UPDATE, &args); + error = ioctl(devfd, CPUCTL_UPDATE, &args); if (error < 0) { fprintf(stderr, "failed.\n"); warn("ioctl()"); diff --git a/usr.sbin/cpucontrol/cpucontrol.8 b/usr.sbin/cpucontrol/cpucontrol.8 index 62221c357b5..0998b205659 100644 --- a/usr.sbin/cpucontrol/cpucontrol.8 +++ b/usr.sbin/cpucontrol/cpucontrol.8 @@ -31,7 +31,7 @@ .Nm cpucontrol .Nd control utility for the .Xr cpuctl 4 -device. +device .Sh SYNOPSIS .Nm .Op Fl vh diff --git a/usr.sbin/cpucontrol/cpucontrol.c b/usr.sbin/cpucontrol/cpucontrol.c index 7477007b8f2..8738612fe77 100644 --- a/usr.sbin/cpucontrol/cpucontrol.c +++ b/usr.sbin/cpucontrol/cpucontrol.c @@ -292,7 +292,7 @@ do_update(const char *dev) int error; struct ucode_handler *handler; struct datadir *dir; - DIR *dirfd; + DIR *dirp; struct dirent *direntry; char buf[MAXPATHLEN]; @@ -321,12 +321,12 @@ do_update(const char *dev) * Process every image in specified data directories. */ SLIST_FOREACH(dir, &datadirs, next) { - dirfd = opendir(dir->path); - if (dirfd == NULL) { + dirp = opendir(dir->path); + if (dirp == NULL) { WARNX(1, "skipping directory %s: not accessible", dir->path); continue; } - while ((direntry = readdir(dirfd)) != NULL) { + while ((direntry = readdir(dirp)) != NULL) { if (direntry->d_namlen == 0) continue; error = snprintf(buf, sizeof(buf), "%s/%s", dir->path, @@ -340,7 +340,7 @@ do_update(const char *dev) } handler->update(dev, buf); } - error = closedir(dirfd); + error = closedir(dirp); if (error != 0) WARN(0, "closedir(%s)", dir->path); } diff --git a/usr.sbin/cron/crontab/crontab.5 b/usr.sbin/cron/crontab/crontab.5 index 65b56310c45..458175e7a48 100644 --- a/usr.sbin/cron/crontab/crontab.5 +++ b/usr.sbin/cron/crontab/crontab.5 @@ -17,7 +17,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 28, 2012 +.Dd April 28, 2012 .Dt CRONTAB 5 .Os .Sh NAME @@ -296,10 +296,21 @@ are extensions. .An Paul Vixie Aq paul@vix.com .Sh BUGS If you are in one of the 70-odd countries that observe Daylight -Savings Time, jobs scheduled during the rollback or advance will be -affected. +Savings Time, jobs scheduled during the rollback or advance may be +affected if +.Xr cron 8 +is not started with the +.Fl s +flag. In general, it is not a good idea to schedule jobs during -this period. +this period if +.Xr cron 8 +is not started with the +.Fl s +flag, which is enabled by default. +See +.Xr cron 8 +for more details. .Pp For US timezones (except parts of AZ and HI) the time shift occurs at 2AM local time. diff --git a/usr.sbin/cron/crontab/crontab.c b/usr.sbin/cron/crontab/crontab.c index 3bb54a507af..69c46063344 100644 --- a/usr.sbin/cron/crontab/crontab.c +++ b/usr.sbin/cron/crontab/crontab.c @@ -608,6 +608,15 @@ replace_cmd() { log_it(RealUser, Pid, "REPLACE", User); + /* + * Creating the 'tn' temp file has already updated the + * modification time of the spool directory. Sleep for a + * second to ensure that poke_daemon() sets a later + * modification time. Otherwise, this can race with the cron + * daemon scanning for updated crontabs. + */ + sleep(1); + poke_daemon(); return (0); diff --git a/usr.sbin/crunch/crunchgen/crunched_main.c b/usr.sbin/crunch/crunchgen/crunched_main.c index df40d9d6b8b..f920c1fe853 100644 --- a/usr.sbin/crunch/crunchgen/crunched_main.c +++ b/usr.sbin/crunch/crunchgen/crunched_main.c @@ -22,8 +22,6 @@ * Author: James da Silva, Systems Design and Analysis Group * Computer Science Department * University of Maryland at College Park - * - * $FreeBSD$ */ /* * crunched_main.c - main program for crunched binaries, it branches to a @@ -33,6 +31,10 @@ * or calls one of them based on argv[1]. This allows the testing of * the crunched binary without creating all the links. */ + +#include +__FBSDID("$FreeBSD$"); + #include #include #include @@ -45,7 +47,8 @@ struct stub { extern char *__progname; extern struct stub entry_points[]; -int main(int argc, char **argv, char **envp) +int +main(int argc, char **argv, char **envp) { char *slash, *basename; struct stub *ep; @@ -68,7 +71,8 @@ int main(int argc, char **argv, char **envp) } -int crunched_here(char *path) +int +crunched_here(char *path) { char *slash, *basename; struct stub *ep; @@ -83,7 +87,8 @@ int crunched_here(char *path) } -int crunched_main(int argc, char **argv, char **envp) +int +crunched_main(int argc, char **argv, char **envp) { char *slash; struct stub *ep; @@ -99,7 +104,8 @@ int crunched_main(int argc, char **argv, char **envp) } -int crunched_usage() +int +crunched_usage() { int columns, len; struct stub *ep; @@ -122,4 +128,3 @@ int crunched_usage() } /* end of crunched_main.c */ - diff --git a/usr.sbin/crunch/crunchgen/crunchgen.c b/usr.sbin/crunch/crunchgen/crunchgen.c index 752acc68787..48d6f33cb25 100644 --- a/usr.sbin/crunch/crunchgen/crunchgen.c +++ b/usr.sbin/crunch/crunchgen/crunchgen.c @@ -22,8 +22,6 @@ * Author: James da Silva, Systems Design and Analysis Group * Computer Science Department * University of Maryland at College Park - * - * $FreeBSD$ */ /* * ======================================================================== @@ -32,9 +30,12 @@ * Generates a Makefile and main C file for a crunched executable, * from specs given in a .conf file. */ -#include -#include + +#include +__FBSDID("$FreeBSD$"); + #include +#include #include #include @@ -92,6 +93,7 @@ char outmkname[MAXPATHLEN], outcfname[MAXPATHLEN], execfname[MAXPATHLEN]; char tempfname[MAXPATHLEN], cachename[MAXPATHLEN], curfilename[MAXPATHLEN]; char outhdrname[MAXPATHLEN] ; /* user-supplied header for *.mk */ char *objprefix; /* where are the objects ? */ +char *path_make; int linenum = -1; int goterror = 0; @@ -118,7 +120,8 @@ void parse_conf_file(void); void gen_outputs(void); -int main(int argc, char **argv) +int +main(int argc, char **argv) { char *p; int optc; @@ -127,6 +130,10 @@ int main(int argc, char **argv) readcache = 1; *outmkname = *outcfname = *execfname = '\0'; + path_make = getenv("MAKE"); + if (path_make == NULL || *path_make == '\0') + path_make = "make"; + p = getenv("MAKEOBJDIRPREFIX"); if (p == NULL || *p == '\0') objprefix = "/usr/obj"; /* default */ @@ -218,7 +225,8 @@ int main(int argc, char **argv) } -void usage(void) +void +usage(void) { fprintf(stderr, "%s%s\n\t%s%s\n", "usage: crunchgen [-foq] ", "[-h ] [-m ]", @@ -250,7 +258,8 @@ prog_t *find_prog(char *str); void add_prog(char *progname); -void parse_conf_file(void) +void +parse_conf_file(void) { if (!is_nonempty_file(infilename)) errx(1, "fatal: input file \"%s\" not found", infilename); @@ -263,7 +272,8 @@ void parse_conf_file(void) } -void parse_one_file(char *filename) +void +parse_one_file(char *filename) { char *fieldv[MAXFIELDS]; int fieldc; @@ -329,7 +339,8 @@ void parse_one_file(char *filename) } -void parse_line(char *line, int *fc, char **fv, int nf) +void +parse_line(char *line, int *fc, char **fv, int nf) { char *p; @@ -360,7 +371,8 @@ void parse_line(char *line, int *fc, char **fv, int nf) } -void add_srcdirs(int argc, char **argv) +void +add_srcdirs(int argc, char **argv) { int i; @@ -376,7 +388,8 @@ void add_srcdirs(int argc, char **argv) } -void add_progs(int argc, char **argv) +void +add_progs(int argc, char **argv) { int i; @@ -385,7 +398,8 @@ void add_progs(int argc, char **argv) } -void add_prog(char *progname) +void +add_prog(char *progname) { prog_t *p1, *p2; @@ -426,7 +440,8 @@ void add_prog(char *progname) } -void add_link(int argc, char **argv) +void +add_link(int argc, char **argv) { int i; prog_t *p = find_prog(argv[1]); @@ -447,7 +462,8 @@ void add_link(int argc, char **argv) } -void add_libs(int argc, char **argv) +void +add_libs(int argc, char **argv) { int i; @@ -461,7 +477,8 @@ void add_libs(int argc, char **argv) } -void add_libs_so(int argc, char **argv) +void +add_libs_so(int argc, char **argv) { int i; @@ -475,7 +492,8 @@ void add_libs_so(int argc, char **argv) } -void add_buildopts(int argc, char **argv) +void +add_buildopts(int argc, char **argv) { int i; @@ -484,7 +502,8 @@ void add_buildopts(int argc, char **argv) } -void add_special(int argc, char **argv) +void +add_special(int argc, char **argv) { int i; prog_t *p = find_prog(argv[1]); @@ -586,7 +605,8 @@ char *genident(char *str); char *dir_search(char *progname); -void gen_outputs(void) +void +gen_outputs(void) { prog_t *p; @@ -599,13 +619,15 @@ void gen_outputs(void) gen_output_makefile(); status(""); fprintf(stderr, - "Run \"make -f %s\" to build crunched binary.\n", outmkname); + "Run \"%s -f %s\" to build crunched binary.\n", + path_make, outmkname); } /* * run the makefile for the program to find which objects are necessary */ -void fillin_program(prog_t *p) +void +fillin_program(prog_t *p) { char path[MAXPATHLEN]; char line[MAXLINELEN]; @@ -680,7 +702,8 @@ void fillin_program(prog_t *p) p->goterror = 1; } -void fillin_program_objs(prog_t *p, char *path) +void +fillin_program_objs(prog_t *p, char *path) { char *obj, *cp; int fd, rc; @@ -720,16 +743,16 @@ void fillin_program_objs(prog_t *p, char *path) fprintf(f, "loop:\n\t@echo 'OBJS= '${%s}\n", objvar); fprintf(f, "crunchgen_objs:\n" - "\t@cd %s && make -f %s $(BUILDOPTS) $(%s_OPTS)", - p->srcdir, tempfname, p->ident); + "\t@cd %s && %s -f %s $(BUILDOPTS) $(%s_OPTS)", + p->srcdir, path_make, tempfname, p->ident); for (s = p->buildopts; s != NULL; s = s->next) fprintf(f, " %s", s->str); fprintf(f, " loop\n"); fclose(f); - snprintf(line, MAXLINELEN, "cd %s && make -f %s -B crunchgen_objs", - p->srcdir, tempfname); + snprintf(line, MAXLINELEN, "cd %s && %s -f %s -B crunchgen_objs", + p->srcdir, path_make, tempfname); if ((f = popen(line, "r")) == NULL) { warn("submake pipe"); goterror = 1; @@ -767,7 +790,8 @@ void fillin_program_objs(prog_t *p, char *path) unlink(tempfname); } -void remove_error_progs(void) +void +remove_error_progs(void) { prog_t *p1, *p2; @@ -788,7 +812,8 @@ void remove_error_progs(void) } } -void gen_specials_cache(void) +void +gen_specials_cache(void) { FILE *cachef; prog_t *p; @@ -828,7 +853,8 @@ void gen_specials_cache(void) } -void gen_output_makefile(void) +void +gen_output_makefile(void) { prog_t *p; FILE *outmk; @@ -858,7 +884,8 @@ void gen_output_makefile(void) } -void gen_output_cfile(void) +void +gen_output_cfile(void) { extern char *crunched_skel[]; char **cp; @@ -946,7 +973,8 @@ char *dir_search(char *progname) } -void top_makefile_rules(FILE *outmk) +void +top_makefile_rules(FILE *outmk) { prog_t *p; @@ -1004,7 +1032,8 @@ void top_makefile_rules(FILE *outmk) } -void prog_makefile_rules(FILE *outmk, prog_t *p) +void +prog_makefile_rules(FILE *outmk, prog_t *p) { strlst_t *lst; @@ -1089,7 +1118,8 @@ void prog_makefile_rules(FILE *outmk, prog_t *p) fprintf(outmk, "%s.lo\n", p->name); } -void output_strlst(FILE *outf, strlst_t *lst) +void +output_strlst(FILE *outf, strlst_t *lst) { for (; lst != NULL; lst = lst->next) if ( strlen(lst->str) ) @@ -1104,7 +1134,8 @@ void output_strlst(FILE *outf, strlst_t *lst) * */ -void status(char *str) +void +status(char *str) { static int lastlen = 0; int len, spaces; @@ -1123,13 +1154,15 @@ void status(char *str) } -void out_of_memory(void) +void +out_of_memory(void) { err(1, "%s: %d: out of memory, stopping", infilename, linenum); } -void add_string(strlst_t **listp, char *str) +void +add_string(strlst_t **listp, char *str) { strlst_t *p1, *p2; @@ -1153,7 +1186,8 @@ void add_string(strlst_t **listp, char *str) p1->next = p2; } -int subtract_strlst(strlst_t **lista, strlst_t **listb) +int +subtract_strlst(strlst_t **lista, strlst_t **listb) { int subtract_count = 0; strlst_t *p1; @@ -1166,7 +1200,8 @@ int subtract_strlst(strlst_t **lista, strlst_t **listb) return subtract_count; } -int in_list(strlst_t **listp, char *str) +int +in_list(strlst_t **listp, char *str) { strlst_t *p1; for (p1 = *listp; p1 != NULL; p1 = p1->next) @@ -1175,7 +1210,8 @@ int in_list(strlst_t **listp, char *str) return 0; } -int is_dir(char *pathname) +int +is_dir(char *pathname) { struct stat buf; @@ -1185,7 +1221,8 @@ int is_dir(char *pathname) return S_ISDIR(buf.st_mode); } -int is_nonempty_file(char *pathname) +int +is_nonempty_file(char *pathname) { struct stat buf; diff --git a/usr.sbin/crunch/crunchide/crunchide.c b/usr.sbin/crunch/crunchide/crunchide.c index 32c42dba883..d2b1123bd59 100644 --- a/usr.sbin/crunch/crunchide/crunchide.c +++ b/usr.sbin/crunch/crunchide/crunchide.c @@ -1,5 +1,4 @@ /* $NetBSD: crunchide.c,v 1.8 1997/11/01 06:51:45 lukem Exp $ */ -/* $FreeBSD$ */ /* * Copyright (c) 1997 Christopher G. Demetriou. All rights reserved. * Copyright (c) 1994 University of Maryland @@ -59,20 +58,22 @@ * that the final crunched binary BSS size is the max of all the * component programs' BSS sizes, rather than their sum. */ + #include #ifndef lint __RCSID("$NetBSD: crunchide.c,v 1.8 1997/11/01 06:51:45 lukem Exp $"); #endif +__FBSDID("$FreeBSD$"); +#include +#include +#include #include #include #include #include #include #include -#include -#include -#include #include "extern.h" @@ -89,9 +90,8 @@ int verbose; int main(int, char *[]); -int main(argc, argv) -int argc; -char **argv; +int +main(int argc, char **argv) { int ch, errors; @@ -127,7 +127,8 @@ char **argv; return errors; } -void usage(void) +void +usage(void) { fprintf(stderr, "usage: %s [-k ] [-f ] ...\n", @@ -142,7 +143,8 @@ struct keep { char *sym; } *keep_list; -void add_to_keep_list(char *symbol) +void +add_to_keep_list(char *symbol) { struct keep *newp, *prevp, *curp; int cmp; @@ -167,7 +169,8 @@ void add_to_keep_list(char *symbol) else keep_list = newp; } -int in_keep_list(const char *symbol) +int +in_keep_list(const char *symbol) { struct keep *curp; int cmp; @@ -180,7 +183,8 @@ int in_keep_list(const char *symbol) return curp && cmp == 0; } -void add_file_to_keep_list(char *filename) +void +add_file_to_keep_list(char *filename) { FILE *keepf; char symbol[1024]; @@ -222,7 +226,8 @@ struct { #endif }; -int hide_syms(const char *filename) +int +hide_syms(const char *filename) { int fd, i, n, rv; diff --git a/usr.sbin/crunch/crunchide/exec_elf32.c b/usr.sbin/crunch/crunchide/exec_elf32.c index 2b2e27f82a2..d01fe7e1785 100644 --- a/usr.sbin/crunch/crunchide/exec_elf32.c +++ b/usr.sbin/crunch/crunchide/exec_elf32.c @@ -238,7 +238,7 @@ ELFNAMEEND(hide)(int fd, const char *fn) Elf_Shdr *shdrp = NULL, *symtabshdr, *strtabshdr; Elf_Sym *symtabp = NULL; char *strtabp = NULL; - Elf_Size nsyms, nlocalsyms, ewi; + Elf_Size nsyms, ewi; ssize_t shdrsize; int rv, i, weird; size_t nstrtab_size, nstrtab_nextoff, fn_size; @@ -327,7 +327,6 @@ ELFNAMEEND(hide)(int fd, const char *fn) /* Prepare data structures for symbol movement. */ nsyms = xewtoh(symtabshdr->sh_size) / xewtoh(symtabshdr->sh_entsize); - nlocalsyms = xe32toh(symtabshdr->sh_info); /* move symbols, making them local */ for (ewi = 0; ewi < nsyms; ewi++) { diff --git a/usr.sbin/ctladm/ctladm.8 b/usr.sbin/ctladm/ctladm.8 index ddbe976039d..2e73aebd459 100644 --- a/usr.sbin/ctladm/ctladm.8 +++ b/usr.sbin/ctladm/ctladm.8 @@ -401,7 +401,7 @@ This option and the .Fl m option are mutually exclusive. One of the two must be specified, though. .It Fl P Ar pc -Specify the mode page page control value. Possible values are: +Specify the mode page control value. Possible values are: .Bl -tag -width 2n -compact .It 0 Current values. @@ -542,7 +542,7 @@ List all LUNs registered with CTL. Because this command uses the ioctl port, it will only work when the FETDs (Front End Target Drivers) are enabled. This command is the equivalent of doing a REPORT LUNS on one LUN and then -and then an INQUIRY on each LUN in the system. +an INQUIRY on each LUN in the system. .It Ic delay Delay commands at the given location. There are two places where commands may be delayed currently: before data is transferred @@ -749,7 +749,7 @@ single port. As a general rule, the WWNN should be the same across all ports on the system. .It Fl W Ar wwpn -Set the World Wide Node Name for the given port. +Set the World Wide Port Name for the given port. The .Fl n argument must be specified, since this is only possible to implement on a @@ -939,10 +939,10 @@ Create a LUN using the block backend, specify the file .Pa src/usr.sbin/ctladm/ctladm.8 as the backing store, and specify the .Tn SCSI -VPD page 0x80 and 0x83 serial number ( -.Fl S) -and device ID ( -.Fl d). +VPD page 0x80 and 0x83 serial number +.Fl ( S ) +and device ID +.Fl ( d ) . .Pp .Dl ctladm remove -b block -l 12 .Pp diff --git a/usr.sbin/ctladm/ctladm.c b/usr.sbin/ctladm/ctladm.c index f53e9f12caa..4cdbd42ce4f 100644 --- a/usr.sbin/ctladm/ctladm.c +++ b/usr.sbin/ctladm/ctladm.c @@ -772,7 +772,6 @@ static int cctl_delay(int fd, int target, int lun, int argc, char **argv, char *combinedopt) { - int datamove_delay; struct ctl_io_delay_info delay_info; char *delayloc = NULL; char *delaytype = NULL; @@ -781,7 +780,6 @@ cctl_delay(int fd, int target, int lun, int argc, char **argv, int c; retval = 0; - datamove_delay = 0; memset(&delay_info, 0, sizeof(delay_info)); @@ -3803,7 +3801,7 @@ CTL_DEFAULT_DEV); int main(int argc, char **argv) { - int option_index, c; + int c; ctladm_cmdfunction command; ctladm_cmdargs cmdargs; ctladm_optret optreturn; @@ -3814,10 +3812,9 @@ main(int argc, char **argv) int target, lun; int optstart = 2; int retval, fd; - int retries, timeout; + int retries; int initid; - option_index = 0; retval = 0; cmdargs = CTLADM_ARG_NONE; command = CTLADM_CMD_HELP; @@ -3826,7 +3823,6 @@ main(int argc, char **argv) retries = 0; target = 0; lun = 0; - timeout = 0; initid = 7; if (argc < 2) { diff --git a/usr.sbin/daemon/daemon.8 b/usr.sbin/daemon/daemon.8 index 2f9cb6b761d..14b134af663 100644 --- a/usr.sbin/daemon/daemon.8 +++ b/usr.sbin/daemon/daemon.8 @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 19, 2012 +.Dd June 4, 2012 .Dt DAEMON 8 .Os .Sh NAME @@ -34,7 +34,7 @@ .Nd run detached from the controlling terminal .Sh SYNOPSIS .Nm -.Op Fl cf +.Op Fl cfr .Op Fl p Ar pidfile .Op Fl u Ar user .Ar command arguments ... diff --git a/usr.sbin/daemon/daemon.c b/usr.sbin/daemon/daemon.c index 54d31235861..7c8e9feeba7 100644 --- a/usr.sbin/daemon/daemon.c +++ b/usr.sbin/daemon/daemon.c @@ -217,6 +217,10 @@ wait_child(pid_t pid, sigset_t *mask) } switch (signo) { case SIGCHLD: + if (waitpid(pid, NULL, WNOHANG) == -1) { + warn("waitpid"); + return (-1); + } return (terminate); case SIGTERM: terminate = 1; @@ -236,7 +240,7 @@ static void usage(void) { (void)fprintf(stderr, - "usage: daemon [-cf] [-p pidfile] [-u user] command " + "usage: daemon [-cfr] [-p pidfile] [-u user] command " "arguments ...\n"); exit(1); } diff --git a/usr.sbin/digictl/digictl.8 b/usr.sbin/digictl/digictl.8 index 2ac98ea4e3b..fefefe41cb8 100644 --- a/usr.sbin/digictl/digictl.8 +++ b/usr.sbin/digictl/digictl.8 @@ -53,7 +53,7 @@ is the card number and is the port number. .Pp The following flags are recognized: -.Bl -tag +.Bl -tag -width 10n .It Fl a Cm disable | enable | query Disable, enable or query the .Em ALTPIN diff --git a/usr.sbin/fifolog/lib/getdate.y b/usr.sbin/fifolog/lib/getdate.y index 8e63e811299..53a515c4d17 100644 --- a/usr.sbin/fifolog/lib/getdate.y +++ b/usr.sbin/fifolog/lib/getdate.y @@ -24,11 +24,9 @@ #include "libfifolog.h" -#define yyparse getdate_yyparse #define yylex getdate_yylex #define yyerror getdate_yyerror -static int yyparse(void); static int yylex(void); static int yyerror(const char *); diff --git a/usr.sbin/flowctl/flowctl.8 b/usr.sbin/flowctl/flowctl.8 index 5abeddbd84f..5780e10a62d 100644 --- a/usr.sbin/flowctl/flowctl.8 +++ b/usr.sbin/flowctl/flowctl.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 5, 2011 +.Dd June 8, 2012 .Dt FLOWCTL 8 .Os .Sh NAME @@ -55,12 +55,12 @@ Currently, .Nm supports only one command. .Bl -tag -width ".Cm show" -.It Cm show Op Cm ipv4|ipv6 +.It Cm show Oo Cm ipv4|ipv6 Oc Op Cm human|verbose This command is the analog of the .Dq "show ip cache flow" command of a Cisco router. It dumps the contents of the flow cache in Cisco-like format. -Specifing either +Specifying either .Cm ipv4 or .Cm ipv6 @@ -69,7 +69,9 @@ It has optional parameter .Cm verbose , which is analog of the .Dq "show ip cache verbose flow" -command. +command. Additionally, +.Cm human +parameter can be specify to show selected flows in human-readable format. .El .Sh EXIT STATUS .Ex -std diff --git a/usr.sbin/flowctl/flowctl.c b/usr.sbin/flowctl/flowctl.c index 4bf86f03643..47ddadfdaa2 100644 --- a/usr.sbin/flowctl/flowctl.c +++ b/usr.sbin/flowctl/flowctl.c @@ -52,19 +52,33 @@ static const char rcs_id[] = #include #include -#define CISCO_SH_FLOW_HEADER "SrcIf SrcIPaddress DstIf DstIPaddress Pr SrcP DstP Pkts\n" +#define CISCO_SH_FLOW_HEADER "SrcIf SrcIPaddress " \ +"DstIf DstIPaddress Pr SrcP DstP Pkts\n" #define CISCO_SH_FLOW "%-13s %-15s %-13s %-15s %2u %4.4x %4.4x %6lu\n" -#define CISCO_SH_FLOW6_HEADER "SrcIf SrcIPaddress DstIf DstIPaddress Pr SrcP DstP Pkts\n" -#define CISCO_SH_FLOW6 "%-13s %-30s %-13s %-30s %2u %4.4x %4.4x %6lu\n" +/* human-readable IPv4 header */ +#define CISCO_SH_FLOW_HHEADER "SrcIf SrcIPaddress " \ +"DstIf DstIPaddress Proto SrcPort DstPort Pkts\n" +#define CISCO_SH_FLOW_H "%-13s %-15s %-13s %-15s %5u %8d %8d %8lu\n" -#define CISCO_SH_VERB_FLOW_HEADER "SrcIf SrcIPaddress DstIf DstIPaddress Pr TOS Flgs Pkts\n" \ +#define CISCO_SH_FLOW6_HEADER "SrcIf SrcIPaddress " \ +"DstIf DstIPaddress Pr SrcP DstP Pkts\n" +#define CISCO_SH_FLOW6 "%-13s %-30s %-13s %-30s %2u %4.4x %4.4x %6lu\n" + +/* Human-readable IPv6 headers */ +#define CISCO_SH_FLOW6_HHEADER "SrcIf SrcIPaddress " \ +"DstIf DstIPaddress Proto SrcPort DstPort Pkts\n" +#define CISCO_SH_FLOW6_H "%-13s %-36s %-13s %-36s %5u %8d %8d %8lu\n" + +#define CISCO_SH_VERB_FLOW_HEADER "SrcIf SrcIPaddress " \ +"DstIf DstIPaddress Pr TOS Flgs Pkts\n" \ "Port Msk AS Port Msk AS NextHop B/Pk Active\n" #define CISCO_SH_VERB_FLOW "%-14s %-15s %-14s %-15s %2u %3x %4x %6lu\n" \ "%4.4x /%-2u %-5u %4.4x /%-2u %-5u %-15s %9u %8u\n\n" -#define CISCO_SH_VERB_FLOW6_HEADER "SrcIf SrcIPaddress DstIf DstIPaddress Pr TOS Flgs Pkts\n" \ +#define CISCO_SH_VERB_FLOW6_HEADER "SrcIf SrcIPaddress " \ +"DstIf DstIPaddress Pr TOS Flgs Pkts\n" \ "Port Msk AS Port Msk AS NextHop B/Pk Active\n" #define CISCO_SH_VERB_FLOW6 "%-14s %-30s %-14s %-30s %2u %3x %4x %6lu\n" \ @@ -94,7 +108,7 @@ struct ip_ctl_cmd cmds[] = { {NULL, NULL}, }; -int cs; +int cs, human = 0; char *ng_path; int @@ -182,6 +196,9 @@ ctl_show(int argc, char **argv) if (argc > 0 && !strncmp(argv[0], "verbose", strlen(argv[0]))) verbose = 1; + if (argc > 0 && !strncmp(argv[0], "human", strlen(argv[0]))) + human = 1; + #ifdef INET if (ipv4) { if (verbose) @@ -259,13 +276,14 @@ flow_cache_print(struct ngnf_show_header *resp) errx(EX_SOFTWARE, "%s: version mismatch: %u", __func__, resp->version); - printf(CISCO_SH_FLOW_HEADER); + if (resp->nentries > 0) + printf(human ? CISCO_SH_FLOW_HHEADER : CISCO_SH_FLOW_HEADER); fle = (struct flow_entry_data *)(resp + 1); for (i = 0; i < resp->nentries; i++, fle++) { inet_ntop(AF_INET, &fle->r.r_src, src, sizeof(src)); inet_ntop(AF_INET, &fle->r.r_dst, dst, sizeof(dst)); - printf(CISCO_SH_FLOW, + printf(human ? CISCO_SH_FLOW_H : CISCO_SH_FLOW, if_indextoname(fle->fle_i_ifx, src_if), src, if_indextoname(fle->fle_o_ifx, dst_if), @@ -292,13 +310,14 @@ flow_cache_print6(struct ngnf_show_header *resp) errx(EX_SOFTWARE, "%s: version mismatch: %u", __func__, resp->version); - printf(CISCO_SH_FLOW6_HEADER); + if (resp->nentries > 0) + printf(human ? CISCO_SH_FLOW6_HHEADER : CISCO_SH_FLOW6_HEADER); fle6 = (struct flow6_entry_data *)(resp + 1); for (i = 0; i < resp->nentries; i++, fle6++) { inet_ntop(AF_INET6, &fle6->r.src.r_src6, src6, sizeof(src6)); inet_ntop(AF_INET6, &fle6->r.dst.r_dst6, dst6, sizeof(dst6)); - printf(CISCO_SH_FLOW6, + printf(human ? CISCO_SH_FLOW6_H : CISCO_SH_FLOW6, if_indextoname(fle6->fle_i_ifx, src_if), src6, if_indextoname(fle6->fle_o_ifx, dst_if), diff --git a/usr.sbin/freebsd-update/freebsd-update.8 b/usr.sbin/freebsd-update/freebsd-update.8 index 2d9a4473e1b..472a5f72aba 100644 --- a/usr.sbin/freebsd-update/freebsd-update.8 +++ b/usr.sbin/freebsd-update/freebsd-update.8 @@ -62,7 +62,7 @@ Release Engineering Team, e.g., .Fx 9.0-CURRENT. .Sh OPTIONS -The following options are supported +The following options are supported: .Bl -tag -width "-f conffile" .It Fl b Ar basedir Operate on a system mounted at diff --git a/usr.sbin/fwcontrol/fwcontrol.8 b/usr.sbin/fwcontrol/fwcontrol.8 index 4d67b3a0003..a2767ebc240 100644 --- a/usr.sbin/fwcontrol/fwcontrol.8 +++ b/usr.sbin/fwcontrol/fwcontrol.8 @@ -144,7 +144,7 @@ Hostname will be converted to EUI64 using .Xr eui64 5 . .El .Sh FILES -.Bl -tag +.Bl -tag -width "Pa /dev/fw0.0" .It Pa /dev/fw0.0 .El .Sh EXAMPLES diff --git a/usr.sbin/gssd/gssd.8 b/usr.sbin/gssd/gssd.8 index 02116e5c16e..273a9ff321c 100644 --- a/usr.sbin/gssd/gssd.8 +++ b/usr.sbin/gssd/gssd.8 @@ -40,7 +40,7 @@ The program provides support for the kernel GSS-API implementation. .Pp The options are as follows: -.Bl -tag +.Bl -tag -width indent .It Fl d Run in debug mode. In this mode, diff --git a/usr.sbin/i2c/i2c.8 b/usr.sbin/i2c/i2c.8 index ac71af3de5a..cd269fa6e1a 100644 --- a/usr.sbin/i2c/i2c.8 +++ b/usr.sbin/i2c/i2c.8 @@ -88,7 +88,7 @@ reset the controller. .It Fl s scan the bus for devices. .It Fl v -be verbose +be verbose. .It Fl w Ar 0|8|16 device addressing width (in bits). .El diff --git a/usr.sbin/ifmcstat/ifmcstat.c b/usr.sbin/ifmcstat/ifmcstat.c index d92c0565748..838c83d50bc 100644 --- a/usr.sbin/ifmcstat/ifmcstat.c +++ b/usr.sbin/ifmcstat/ifmcstat.c @@ -387,7 +387,6 @@ ll_addrlist(struct ifaddr *ifap) struct sockaddr sa; struct sockaddr_dl sdl; struct ifaddr *ifap0; - int error; if (af && af != AF_LINK) return; @@ -404,7 +403,7 @@ ll_addrlist(struct ifaddr *ifap) if (sdl.sdl_alen == 0) goto nextifap; addrbuf[0] = '\0'; - error = getnameinfo((struct sockaddr *)&sdl, sdl.sdl_len, + getnameinfo((struct sockaddr *)&sdl, sdl.sdl_len, addrbuf, sizeof(addrbuf), NULL, 0, NI_NUMERICHOST); printf("\tlink %s\n", addrbuf); nextifap: @@ -427,7 +426,7 @@ ll_addrlist(struct ifaddr *ifap) goto nextmulti; KREAD(ifm.ifma_addr, &sdl, struct sockaddr_dl); addrbuf[0] = '\0'; - error = getnameinfo((struct sockaddr *)&sdl, + getnameinfo((struct sockaddr *)&sdl, sdl.sdl_len, addrbuf, sizeof(addrbuf), NULL, 0, NI_NUMERICHOST); printf("\t\tgroup %s refcnt %d\n", diff --git a/usr.sbin/inetd/inetd.c b/usr.sbin/inetd/inetd.c index 7dc77b35594..6b287645187 100644 --- a/usr.sbin/inetd/inetd.c +++ b/usr.sbin/inetd/inetd.c @@ -688,11 +688,11 @@ main(int argc, char **argv) */ if (dofork) { if (sep->se_count++ == 0) - (void)gettimeofday(&sep->se_time, (struct timezone *)NULL); + (void)clock_gettime(CLOCK_MONOTONIC_FAST, &sep->se_time); else if (toomany > 0 && sep->se_count >= toomany) { - struct timeval now; + struct timespec now; - (void)gettimeofday(&now, (struct timezone *)NULL); + (void)clock_gettime(CLOCK_MONOTONIC_FAST, &now); if (now.tv_sec - sep->se_time.tv_sec > CNT_INTVL) { sep->se_time = now; diff --git a/usr.sbin/inetd/inetd.h b/usr.sbin/inetd/inetd.h index e0a83bd9761..06600f8292a 100644 --- a/usr.sbin/inetd/inetd.h +++ b/usr.sbin/inetd/inetd.h @@ -109,7 +109,7 @@ struct servtab { u_int se_rpc_lowvers; /* RPC low version */ u_int se_rpc_highvers; /* RPC high version */ int se_count; /* number started since se_time */ - struct timeval se_time; /* start of se_count */ + struct timespec se_time; /* start of se_count */ struct servtab *se_next; struct se_flags { u_int se_nomapped : 1; diff --git a/usr.sbin/jail/Makefile b/usr.sbin/jail/Makefile index 52d237b3339..00d7ff50b52 100644 --- a/usr.sbin/jail/Makefile +++ b/usr.sbin/jail/Makefile @@ -3,9 +3,14 @@ .include PROG= jail -MAN= jail.8 -DPADD= ${LIBJAIL} ${LIBUTIL} -LDADD= -ljail -lutil +MAN= jail.8 jail.conf.5 +SRCS= jail.c command.c config.c state.c jailp.h jaillex.l jailparse.y y.tab.h + +DPADD= ${LIBJAIL} ${LIBKVM} ${LIBUTIL} ${LIBL} +LDADD= -ljail -lkvm -lutil -ll + +YFLAGS+=-v +CFLAGS+=-I. -I${.CURDIR} .if ${MK_INET6_SUPPORT} != "no" CFLAGS+= -DINET6 @@ -14,4 +19,6 @@ CFLAGS+= -DINET6 CFLAGS+= -DINET .endif +CLEANFILES= y.output + .include diff --git a/usr.sbin/jail/command.c b/usr.sbin/jail/command.c new file mode 100644 index 00000000000..b7d5168d8b4 --- /dev/null +++ b/usr.sbin/jail/command.c @@ -0,0 +1,860 @@ +/*- + * Copyright (c) 2011 James Gritton + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "jailp.h" + +#define DEFAULT_STOP_TIMEOUT 10 +#define PHASH_SIZE 256 + +LIST_HEAD(phhead, phash); + +struct phash { + LIST_ENTRY(phash) le; + struct cfjail *j; + pid_t pid; +}; + +int paralimit = -1; + +extern char **environ; + +static int run_command(struct cfjail *j); +static void add_proc(struct cfjail *j, pid_t pid); +static void clear_procs(struct cfjail *j); +static struct cfjail *find_proc(pid_t pid); +static int term_procs(struct cfjail *j); +static int get_user_info(struct cfjail *j, const char *username, + const struct passwd **pwdp, login_cap_t **lcapp); +static int check_path(struct cfjail *j, const char *pname, const char *path, + int isfile, const char *umount_type); + +static struct cfjails sleeping = TAILQ_HEAD_INITIALIZER(sleeping); +static struct cfjails runnable = TAILQ_HEAD_INITIALIZER(runnable); +static struct cfstring dummystring = { .len = 1 }; +static struct phhead phash[PHASH_SIZE]; +static int kq; + +/* + * Run the next command associated with a jail. + */ +int +next_command(struct cfjail *j) +{ + enum intparam comparam; + int create_failed; + + if (paralimit == 0) { + requeue(j, &runnable); + return 1; + } + create_failed = (j->flags & (JF_STOP | JF_FAILED)) == JF_FAILED; + comparam = *j->comparam; + for (;;) { + if (j->comstring == NULL) { + j->comparam += create_failed ? -1 : 1; + switch ((comparam = *j->comparam)) { + case IP__NULL: + return 0; + case IP_MOUNT_DEVFS: + if (!bool_param(j->intparams[IP_MOUNT_DEVFS])) + continue; + /* FALLTHROUGH */ + case IP__OP: + case IP_STOP_TIMEOUT: + j->comstring = &dummystring; + break; + default: + if (j->intparams[comparam] == NULL) + continue; + j->comstring = create_failed + ? TAILQ_LAST(&j->intparams[comparam]->val, + cfstrings) + : TAILQ_FIRST(&j->intparams[comparam]->val); + } + } else { + j->comstring = j->comstring == &dummystring ? NULL : + create_failed + ? TAILQ_PREV(j->comstring, cfstrings, tq) + : TAILQ_NEXT(j->comstring, tq); + } + if (j->comstring == NULL || j->comstring->len == 0 || + (create_failed && (comparam == IP_EXEC_PRESTART || + comparam == IP_EXEC_START || comparam == IP_COMMAND || + comparam == IP_EXEC_POSTSTART))) + continue; + switch (run_command(j)) { + case -1: + failed(j); + /* FALLTHROUGH */ + case 1: + return 1; + } + } +} + +/* + * Check command exit status + */ +int +finish_command(struct cfjail *j) +{ + int error; + + if (!(j->flags & JF_SLEEPQ)) + return 0; + j->flags &= ~JF_SLEEPQ; + if (*j->comparam == IP_STOP_TIMEOUT) + { + j->flags &= ~JF_TIMEOUT; + j->pstatus = 0; + return 0; + } + paralimit++; + if (!TAILQ_EMPTY(&runnable)) + requeue(TAILQ_FIRST(&runnable), &ready); + error = 0; + if (j->flags & JF_TIMEOUT) { + j->flags &= ~JF_TIMEOUT; + if (*j->comparam != IP_STOP_TIMEOUT) { + jail_warnx(j, "%s: timed out", j->comline); + failed(j); + error = -1; + } else if (verbose > 0) + jail_note(j, "timed out\n"); + } else if (j->pstatus != 0) { + if (WIFSIGNALED(j->pstatus)) + jail_warnx(j, "%s: exited on signal %d", + j->comline, WTERMSIG(j->pstatus)); + else + jail_warnx(j, "%s: failed", j->comline); + j->pstatus = 0; + failed(j); + error = -1; + } + free(j->comline); + j->comline = NULL; + return error; +} + +/* + * Check for finished processes or timeouts. + */ +struct cfjail * +next_proc(int nonblock) +{ + struct kevent ke; + struct timespec ts; + struct timespec *tsp; + struct cfjail *j; + + if (!TAILQ_EMPTY(&sleeping)) { + again: + tsp = NULL; + if ((j = TAILQ_FIRST(&sleeping)) && j->timeout.tv_sec) { + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec = j->timeout.tv_sec - ts.tv_sec; + ts.tv_nsec = j->timeout.tv_nsec - ts.tv_nsec; + if (ts.tv_nsec < 0) { + ts.tv_sec--; + ts.tv_nsec += 1000000000; + } + if (ts.tv_sec < 0 || + (ts.tv_sec == 0 && ts.tv_nsec == 0)) { + j->flags |= JF_TIMEOUT; + clear_procs(j); + return j; + } + tsp = &ts; + } + if (nonblock) { + ts.tv_sec = 0; + ts.tv_nsec = 0; + tsp = &ts; + } + switch (kevent(kq, NULL, 0, &ke, 1, tsp)) { + case -1: + if (errno != EINTR) + err(1, "kevent"); + goto again; + case 0: + if (!nonblock) { + j = TAILQ_FIRST(&sleeping); + j->flags |= JF_TIMEOUT; + clear_procs(j); + return j; + } + break; + case 1: + (void)waitpid(ke.ident, NULL, WNOHANG); + if ((j = find_proc(ke.ident))) { + j->pstatus = ke.data; + return j; + } + goto again; + } + } + return NULL; +} + +/* + * Run a single command for a jail, possible inside the jail. + */ +static int +run_command(struct cfjail *j) +{ + const struct passwd *pwd; + const struct cfstring *comstring, *s; + login_cap_t *lcap; + char **argv; + char *cs, *comcs, *devpath; + const char *jidstr, *conslog, *path, *ruleset, *term, *username; + enum intparam comparam; + size_t comlen; + pid_t pid; + int argc, bg, clean, consfd, down, fib, i, injail, sjuser, timeout; +#if defined(INET) || defined(INET6) + char *addr; +#endif + + static char *cleanenv; + + /* Perform some operations that aren't actually commands */ + comparam = *j->comparam; + down = j->flags & (JF_STOP | JF_FAILED); + switch (comparam) { + case IP_STOP_TIMEOUT: + return term_procs(j); + + case IP__OP: + if (down) { + if (jail_remove(j->jid) < 0 && errno == EPERM) { + jail_warnx(j, "jail_remove: %s", + strerror(errno)); + return -1; + } + if (verbose > 0 || (verbose == 0 && (j->flags & JF_STOP + ? note_remove : j->name != NULL))) + jail_note(j, "removed\n"); + j->jid = -1; + if (j->flags & JF_STOP) + dep_done(j, DF_LIGHT); + else + j->flags &= ~JF_PERSIST; + } else { + if (create_jail(j) < 0) + return -1; + if (iflag) + printf("%d\n", j->jid); + if (verbose >= 0 && (j->name || verbose > 0)) + jail_note(j, "created\n"); + dep_done(j, DF_LIGHT); + } + return 0; + + default: ; + } + /* + * Collect exec arguments. Internal commands for network and + * mounting build their own argument lists. + */ + comstring = j->comstring; + bg = 0; + switch (comparam) { +#ifdef INET + case IP__IP4_IFADDR: + argv = alloca(8 * sizeof(char *)); + *(const char **)&argv[0] = _PATH_IFCONFIG; + if ((cs = strchr(comstring->s, '|'))) { + argv[1] = alloca(cs - comstring->s + 1); + strlcpy(argv[1], comstring->s, cs - comstring->s + 1); + addr = cs + 1; + } else { + *(const char **)&argv[1] = + string_param(j->intparams[IP_INTERFACE]); + addr = comstring->s; + } + *(const char **)&argv[2] = "inet"; + if (!(cs = strchr(addr, '/'))) { + argv[3] = addr; + *(const char **)&argv[4] = "netmask"; + *(const char **)&argv[5] = "255.255.255.255"; + argc = 6; + } else if (strchr(cs + 1, '.')) { + argv[3] = alloca(cs - addr + 1); + strlcpy(argv[3], addr, cs - addr + 1); + *(const char **)&argv[4] = "netmask"; + *(const char **)&argv[5] = cs + 1; + argc = 6; + } else { + argv[3] = addr; + argc = 4; + } + *(const char **)&argv[argc] = down ? "-alias" : "alias"; + argv[argc + 1] = NULL; + break; +#endif + +#ifdef INET6 + case IP__IP6_IFADDR: + argv = alloca(8 * sizeof(char *)); + *(const char **)&argv[0] = _PATH_IFCONFIG; + if ((cs = strchr(comstring->s, '|'))) { + argv[1] = alloca(cs - comstring->s + 1); + strlcpy(argv[1], comstring->s, cs - comstring->s + 1); + addr = cs + 1; + } else { + *(const char **)&argv[1] = + string_param(j->intparams[IP_INTERFACE]); + addr = comstring->s; + } + *(const char **)&argv[2] = "inet6"; + argv[3] = addr; + if (!(cs = strchr(addr, '/'))) { + *(const char **)&argv[4] = "prefixlen"; + *(const char **)&argv[5] = "128"; + argc = 6; + } else + argc = 4; + *(const char **)&argv[argc] = down ? "-alias" : "alias"; + argv[argc + 1] = NULL; + break; +#endif + + case IP_VNET_INTERFACE: + argv = alloca(5 * sizeof(char *)); + *(const char **)&argv[0] = _PATH_IFCONFIG; + argv[1] = comstring->s; + *(const char **)&argv[2] = down ? "-vnet" : "vnet"; + jidstr = string_param(j->intparams[KP_JID]); + *(const char **)&argv[3] = + jidstr ? jidstr : string_param(j->intparams[KP_NAME]); + argv[4] = NULL; + break; + + case IP_MOUNT: + case IP__MOUNT_FROM_FSTAB: + argv = alloca(8 * sizeof(char *)); + comcs = alloca(comstring->len + 1); + strcpy(comcs, comstring->s); + argc = 0; + for (cs = strtok(comcs, " \t\f\v\r\n"); cs && argc < 4; + cs = strtok(NULL, " \t\f\v\r\n")) + argv[argc++] = cs; + if (argc == 0) + return 0; + if (argc < 3) { + jail_warnx(j, "%s: %s: missing information", + j->intparams[comparam]->name, comstring->s); + return -1; + } + if (check_path(j, j->intparams[comparam]->name, argv[1], 0, + down ? argv[2] : NULL) < 0) + return -1; + if (down) { + argv[4] = NULL; + argv[3] = argv[1]; + *(const char **)&argv[0] = "/sbin/umount"; + } else { + if (argc == 4) { + argv[7] = NULL; + argv[6] = argv[1]; + argv[5] = argv[0]; + argv[4] = argv[3]; + *(const char **)&argv[3] = "-o"; + } else { + argv[5] = NULL; + argv[4] = argv[1]; + argv[3] = argv[0]; + } + *(const char **)&argv[0] = _PATH_MOUNT; + } + *(const char **)&argv[1] = "-t"; + break; + + case IP_MOUNT_DEVFS: + argv = alloca(7 * sizeof(char *)); + path = string_param(j->intparams[KP_PATH]); + if (path == NULL) { + jail_warnx(j, "mount.devfs: no path"); + return -1; + } + devpath = alloca(strlen(path) + 5); + sprintf(devpath, "%s/dev", path); + if (check_path(j, "mount.devfs", devpath, 0, + down ? "devfs" : NULL) < 0) + return -1; + if (down) { + *(const char **)&argv[0] = "/sbin/umount"; + argv[1] = devpath; + argv[2] = NULL; + } else { + *(const char **)&argv[0] = _PATH_MOUNT; + *(const char **)&argv[1] = "-t"; + *(const char **)&argv[2] = "devfs"; + ruleset = string_param(j->intparams[KP_DEVFS_RULESET]); + if (!ruleset) + ruleset = "4"; /* devfsrules_jail */ + argv[3] = alloca(11 + strlen(ruleset)); + sprintf(argv[3], "-oruleset=%s", ruleset); + *(const char **)&argv[4] = "."; + argv[5] = devpath; + argv[6] = NULL; + } + break; + + case IP_COMMAND: + if (j->name != NULL) + goto default_command; + argc = 0; + TAILQ_FOREACH(s, &j->intparams[IP_COMMAND]->val, tq) + argc++; + argv = alloca((argc + 1) * sizeof(char *)); + argc = 0; + TAILQ_FOREACH(s, &j->intparams[IP_COMMAND]->val, tq) + argv[argc++] = s->s; + argv[argc] = NULL; + j->comstring = &dummystring; + break; + + default: + default_command: + if ((cs = strpbrk(comstring->s, "!\"$&'()*;<>?[\\]`{|}~")) && + !(cs[0] == '&' && cs[1] == '\0')) { + argv = alloca(4 * sizeof(char *)); + *(const char **)&argv[0] = _PATH_BSHELL; + *(const char **)&argv[1] = "-c"; + argv[2] = comstring->s; + argv[3] = NULL; + } else { + if (cs) { + *cs = 0; + bg = 1; + } + comcs = alloca(comstring->len + 1); + strcpy(comcs, comstring->s); + argc = 0; + for (cs = strtok(comcs, " \t\f\v\r\n"); cs; + cs = strtok(NULL, " \t\f\v\r\n")) + argc++; + argv = alloca((argc + 1) * sizeof(char *)); + strcpy(comcs, comstring->s); + argc = 0; + for (cs = strtok(comcs, " \t\f\v\r\n"); cs; + cs = strtok(NULL, " \t\f\v\r\n")) + argv[argc++] = cs; + argv[argc] = NULL; + } + } + if (argv[0] == NULL) + return 0; + + if (int_param(j->intparams[IP_EXEC_TIMEOUT], &timeout) && + timeout != 0) { + clock_gettime(CLOCK_REALTIME, &j->timeout); + j->timeout.tv_sec += timeout; + } else + j->timeout.tv_sec = 0; + + injail = comparam == IP_EXEC_START || comparam == IP_COMMAND || + comparam == IP_EXEC_STOP; + clean = bool_param(j->intparams[IP_EXEC_CLEAN]); + username = string_param(j->intparams[injail + ? IP_EXEC_JAIL_USER : IP_EXEC_SYSTEM_USER]); + sjuser = bool_param(j->intparams[IP_EXEC_SYSTEM_JAIL_USER]); + + consfd = 0; + if (injail && + (conslog = string_param(j->intparams[IP_EXEC_CONSOLELOG]))) { + if (check_path(j, "exec.consolelog", conslog, 1, NULL) < 0) + return -1; + consfd = + open(conslog, O_WRONLY | O_CREAT | O_APPEND, DEFFILEMODE); + if (consfd < 0) { + jail_warnx(j, "open %s: %s", conslog, strerror(errno)); + return -1; + } + } + + comlen = 0; + for (i = 0; argv[i]; i++) + comlen += strlen(argv[i]) + 1; + j->comline = cs = emalloc(comlen); + for (i = 0; argv[i]; i++) { + strcpy(cs, argv[i]); + if (argv[i + 1]) { + cs += strlen(argv[i]) + 1; + cs[-1] = ' '; + } + } + if (verbose > 0) + jail_note(j, "run command%s%s%s: %s\n", + injail ? " in jail" : "", username ? " as " : "", + username ? username : "", j->comline); + + pid = fork(); + if (pid < 0) + err(1, "fork"); + if (pid > 0) { + if (bg) { + free(j->comline); + j->comline = NULL; + return 0; + } else { + paralimit--; + add_proc(j, pid); + return 1; + } + } + if (bg) + setsid(); + + /* Set up the environment and run the command */ + pwd = NULL; + lcap = NULL; + if ((clean || username) && injail && sjuser && + get_user_info(j, username, &pwd, &lcap) < 0) + exit(1); + if (injail) { + /* jail_attach won't chdir along with its chroot. */ + path = string_param(j->intparams[KP_PATH]); + if (path && chdir(path) < 0) { + jail_warnx(j, "chdir %s: %s", path, strerror(errno)); + exit(1); + } + if (int_param(j->intparams[IP_EXEC_FIB], &fib) && + setfib(fib) < 0) { + jail_warnx(j, "setfib: %s", strerror(errno)); + exit(1); + } + if (jail_attach(j->jid) < 0) { + jail_warnx(j, "jail_attach: %s", strerror(errno)); + exit(1); + } + } + if (clean || username) { + if (!(injail && sjuser) && + get_user_info(j, username, &pwd, &lcap) < 0) + exit(1); + if (clean) { + term = getenv("TERM"); + environ = &cleanenv; + setenv("PATH", "/bin:/usr/bin", 0); + if (term != NULL) + setenv("TERM", term, 1); + } + if (setusercontext(lcap, pwd, pwd->pw_uid, username + ? LOGIN_SETALL & ~LOGIN_SETGROUP & ~LOGIN_SETLOGIN + : LOGIN_SETPATH | LOGIN_SETENV) < 0) { + jail_warnx(j, "setusercontext %s: %s", pwd->pw_name, + strerror(errno)); + exit(1); + } + login_close(lcap); + setenv("USER", pwd->pw_name, 1); + setenv("HOME", pwd->pw_dir, 1); + setenv("SHELL", + *pwd->pw_shell ? pwd->pw_shell : _PATH_BSHELL, 1); + if (clean && chdir(pwd->pw_dir) < 0) { + jail_warnx(j, "chdir %s: %s", + pwd->pw_dir, strerror(errno)); + exit(1); + } + endpwent(); + } + + if (consfd != 0 && (dup2(consfd, 1) < 0 || dup2(consfd, 2) < 0)) { + jail_warnx(j, "exec.consolelog: %s", strerror(errno)); + exit(1); + } + closefrom(3); + execvp(argv[0], argv); + jail_warnx(j, "exec %s: %s", argv[0], strerror(errno)); + exit(1); +} + +/* + * Add a process to the hash, tied to a jail. + */ +static void +add_proc(struct cfjail *j, pid_t pid) +{ + struct kevent ke; + struct cfjail *tj; + struct phash *ph; + + if (!kq && (kq = kqueue()) < 0) + err(1, "kqueue"); + EV_SET(&ke, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, NULL); + if (kevent(kq, &ke, 1, NULL, 0, NULL) < 0) + err(1, "kevent"); + ph = emalloc(sizeof(struct phash)); + ph->j = j; + ph->pid = pid; + LIST_INSERT_HEAD(&phash[pid % PHASH_SIZE], ph, le); + j->nprocs++; + j->flags |= JF_SLEEPQ; + if (j->timeout.tv_sec == 0) + requeue(j, &sleeping); + else { + /* File the jail in the sleep queue acording to its timeout. */ + TAILQ_REMOVE(j->queue, j, tq); + TAILQ_FOREACH(tj, &sleeping, tq) { + if (!tj->timeout.tv_sec || + j->timeout.tv_sec < tj->timeout.tv_sec || + (j->timeout.tv_sec == tj->timeout.tv_sec && + j->timeout.tv_nsec <= tj->timeout.tv_nsec)) { + TAILQ_INSERT_BEFORE(tj, j, tq); + break; + } + } + if (tj == NULL) + TAILQ_INSERT_TAIL(&sleeping, j, tq); + j->queue = &sleeping; + } +} + +/* + * Remove any processes from the hash that correspond to a jail. + */ +static void +clear_procs(struct cfjail *j) +{ + struct kevent ke; + struct phash *ph, *tph; + int i; + + j->nprocs = 0; + for (i = 0; i < PHASH_SIZE; i++) + LIST_FOREACH_SAFE(ph, &phash[i], le, tph) + if (ph->j == j) { + EV_SET(&ke, ph->pid, EVFILT_PROC, EV_DELETE, + NOTE_EXIT, 0, NULL); + (void)kevent(kq, &ke, 1, NULL, 0, NULL); + LIST_REMOVE(ph, le); + free(ph); + } +} + +/* + * Find the jail that corresponds to an exited process. + */ +static struct cfjail * +find_proc(pid_t pid) +{ + struct cfjail *j; + struct phash *ph; + + LIST_FOREACH(ph, &phash[pid % PHASH_SIZE], le) + if (ph->pid == pid) { + j = ph->j; + LIST_REMOVE(ph, le); + free(ph); + return --j->nprocs ? NULL : j; + } + return NULL; +} + +/* + * Send SIGTERM to all processes in a jail and wait for them to die. + */ +static int +term_procs(struct cfjail *j) +{ + struct kinfo_proc *ki; + int i, noted, pcnt, timeout; + + static kvm_t *kd; + + if (!int_param(j->intparams[IP_STOP_TIMEOUT], &timeout)) + timeout = DEFAULT_STOP_TIMEOUT; + else if (timeout == 0) + return 0; + + if (kd == NULL) { + kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL); + if (kd == NULL) + return 0; + } + + ki = kvm_getprocs(kd, KERN_PROC_PROC, 0, &pcnt); + if (ki == NULL) + return 0; + noted = 0; + for (i = 0; i < pcnt; i++) + if (ki[i].ki_jid == j->jid && + kill(ki[i].ki_pid, SIGTERM) == 0) { + add_proc(j, ki[i].ki_pid); + if (verbose > 0) { + if (!noted) { + noted = 1; + jail_note(j, "sent SIGTERM to:"); + } + printf(" %d", ki[i].ki_pid); + } + } + if (noted) + printf("\n"); + if (j->nprocs > 0) { + clock_gettime(CLOCK_REALTIME, &j->timeout); + j->timeout.tv_sec += timeout; + return 1; + } + return 0; +} + +/* + * Look up a user in the passwd and login.conf files. + */ +static int +get_user_info(struct cfjail *j, const char *username, + const struct passwd **pwdp, login_cap_t **lcapp) +{ + const struct passwd *pwd; + + *pwdp = pwd = username ? getpwnam(username) : getpwuid(getuid()); + if (pwd == NULL) { + if (errno) + jail_warnx(j, "getpwnam%s%s: %s", username ? " " : "", + username ? username : "", strerror(errno)); + else if (username) + jail_warnx(j, "%s: no such user", username); + else + jail_warnx(j, "unknown uid %d", getuid()); + return -1; + } + *lcapp = login_getpwclass(pwd); + if (*lcapp == NULL) { + jail_warnx(j, "getpwclass %s: %s", pwd->pw_name, + strerror(errno)); + return -1; + } + /* Set the groups while the group file is still available */ + if (initgroups(pwd->pw_name, pwd->pw_gid) < 0) { + jail_warnx(j, "initgroups %s: %s", pwd->pw_name, + strerror(errno)); + return -1; + } + return 0; +} + +/* + * Make sure a mount or consolelog path is a valid absolute pathname + * with no symlinks. + */ +static int +check_path(struct cfjail *j, const char *pname, const char *path, int isfile, + const char *umount_type) +{ + struct stat st, mpst; + struct statfs stfs; + char *tpath, *p; + const char *jailpath; + size_t jplen; + + if (path[0] != '/') { + jail_warnx(j, "%s: %s: not an absolute pathname", + pname, path); + return -1; + } + /* + * Only check for symlinks in components below the jail's path, + * since that's where the security risk lies. + */ + jailpath = string_param(j->intparams[KP_PATH]); + if (jailpath == NULL) + jailpath = ""; + jplen = strlen(jailpath); + if (!strncmp(path, jailpath, jplen) && path[jplen] == '/') { + tpath = alloca(strlen(path) + 1); + strcpy(tpath, path); + for (p = tpath + jplen; p != NULL; ) { + p = strchr(p + 1, '/'); + if (p) + *p = '\0'; + if (lstat(tpath, &st) < 0) { + if (errno == ENOENT && isfile && !p) + break; + jail_warnx(j, "%s: %s: %s", pname, tpath, + strerror(errno)); + return -1; + } + if (S_ISLNK(st.st_mode)) { + jail_warnx(j, "%s: %s is a symbolic link", + pname, tpath); + return -1; + } + if (p) + *p = '/'; + } + } + if (umount_type != NULL) { + if (stat(path, &st) < 0 || statfs(path, &stfs) < 0) { + jail_warnx(j, "%s: %s: %s", pname, path, + strerror(errno)); + return -1; + } + if (stat(stfs.f_mntonname, &mpst) < 0) { + jail_warnx(j, "%s: %s: %s", pname, stfs.f_mntonname, + strerror(errno)); + return -1; + } + if (st.st_ino != mpst.st_ino) { + jail_warnx(j, "%s: %s: not a mount point", + pname, path); + return -1; + } + if (strcmp(stfs.f_fstypename, umount_type)) { + jail_warnx(j, "%s: %s: not a %s mount", + pname, path, umount_type); + return -1; + } + } + return 0; +} diff --git a/usr.sbin/jail/config.c b/usr.sbin/jail/config.c new file mode 100644 index 00000000000..7a7917d2a5c --- /dev/null +++ b/usr.sbin/jail/config.c @@ -0,0 +1,833 @@ +/*- + * Copyright (c) 2011 James Gritton + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "jailp.h" + +struct ipspec { + const char *name; + unsigned flags; +}; + +extern FILE *yyin; +extern int yynerrs; + +extern int yyparse(void); + +struct cfjails cfjails = TAILQ_HEAD_INITIALIZER(cfjails); + +static void free_param(struct cfparams *pp, struct cfparam *p); +static void free_param_strings(struct cfparam *p); + +static const struct ipspec intparams[] = { + [IP_ALLOW_DYING] = {"allow.dying", PF_INTERNAL | PF_BOOL}, + [IP_COMMAND] = {"command", PF_INTERNAL}, + [IP_DEPEND] = {"depend", PF_INTERNAL}, + [IP_EXEC_CLEAN] = {"exec.clean", PF_INTERNAL | PF_BOOL}, + [IP_EXEC_CONSOLELOG] = {"exec.consolelog", PF_INTERNAL}, + [IP_EXEC_FIB] = {"exec.fib", PF_INTERNAL | PF_INT}, + [IP_EXEC_JAIL_USER] = {"exec.jail_user", PF_INTERNAL}, + [IP_EXEC_POSTSTART] = {"exec.poststart", PF_INTERNAL}, + [IP_EXEC_POSTSTOP] = {"exec.poststop", PF_INTERNAL}, + [IP_EXEC_PRESTART] = {"exec.prestart", PF_INTERNAL}, + [IP_EXEC_PRESTOP] = {"exec.prestop", PF_INTERNAL}, + [IP_EXEC_START] = {"exec.start", PF_INTERNAL}, + [IP_EXEC_STOP] = {"exec.stop", PF_INTERNAL}, + [IP_EXEC_SYSTEM_JAIL_USER]= {"exec.system_jail_user", + PF_INTERNAL | PF_BOOL}, + [IP_EXEC_SYSTEM_USER] = {"exec.system_user", PF_INTERNAL}, + [IP_EXEC_TIMEOUT] = {"exec.timeout", PF_INTERNAL | PF_INT}, +#if defined(INET) || defined(INET6) + [IP_INTERFACE] = {"interface", PF_INTERNAL}, + [IP_IP_HOSTNAME] = {"ip_hostname", PF_INTERNAL | PF_BOOL}, +#endif + [IP_MOUNT] = {"mount", PF_INTERNAL}, + [IP_MOUNT_DEVFS] = {"mount.devfs", PF_INTERNAL | PF_BOOL}, + [IP_MOUNT_FSTAB] = {"mount.fstab", PF_INTERNAL}, + [IP_STOP_TIMEOUT] = {"stop.timeout", PF_INTERNAL | PF_INT}, + [IP_VNET_INTERFACE] = {"vnet.interface", PF_INTERNAL}, +#ifdef INET + [IP__IP4_IFADDR] = {"ip4.addr", PF_INTERNAL | PF_CONV}, +#endif +#ifdef INET6 + [IP__IP6_IFADDR] = {"ip6.addr", PF_INTERNAL | PF_CONV}, +#endif + [IP__MOUNT_FROM_FSTAB] = {"mount.fstab", PF_INTERNAL | PF_CONV}, + [IP__OP] = {NULL, PF_CONV}, + [KP_ALLOW_CHFLAGS] = {"allow.chflags", 0}, + [KP_ALLOW_MOUNT] = {"allow.mount", 0}, + [KP_ALLOW_RAW_SOCKETS] = {"allow.raw_sockets", 0}, + [KP_ALLOW_SET_HOSTNAME]= {"allow.set_hostname", 0}, + [KP_ALLOW_SOCKET_AF] = {"allow.socket_af", 0}, + [KP_ALLOW_SYSVIPC] = {"allow.sysvipc", 0}, + [KP_DEVFS_RULESET] = {"devfs_ruleset", 0}, + [KP_ENFORCE_STATFS] = {"enforce_statfs", 0}, + [KP_HOST_HOSTNAME] = {"host.hostname", 0}, +#ifdef INET + [KP_IP4_ADDR] = {"ip4.addr", 0}, +#endif +#ifdef INET6 + [KP_IP6_ADDR] = {"ip6.addr", 0}, +#endif + [KP_JID] = {"jid", 0}, + [KP_NAME] = {"name", 0}, + [KP_PATH] = {"path", 0}, + [KP_PERSIST] = {"persist", 0}, + [KP_SECURELEVEL] = {"securelevel", 0}, + [KP_VNET] = {"vnet", 0}, +}; + +/* + * Parse the jail configuration file. + */ +void +load_config(void) +{ + struct cfjails wild; + struct cfparams opp; + struct cfjail *j, *tj, *wj; + struct cfparam *p, *vp, *tp; + struct cfstring *s, *vs, *ns; + struct cfvar *v; + char *ep; + size_t varoff; + int did_self, jseq, pgen; + + if (!strcmp(cfname, "-")) { + cfname = "STDIN"; + yyin = stdin; + } else { + yyin = fopen(cfname, "r"); + if (!yyin) + err(1, "%s", cfname); + } + if (yyparse() || yynerrs) + exit(1); + + /* Separate the wildcard jails out from the actual jails. */ + jseq = 0; + TAILQ_INIT(&wild); + TAILQ_FOREACH_SAFE(j, &cfjails, tq, tj) { + j->seq = ++jseq; + if (wild_jail_name(j->name)) + requeue(j, &wild); + } + + TAILQ_FOREACH(j, &cfjails, tq) { + /* Set aside the jail's parameters. */ + TAILQ_INIT(&opp); + TAILQ_CONCAT(&opp, &j->params, tq); + /* + * The jail name implies its "name" or "jid" parameter, + * though they may also be explicitly set later on. + */ + add_param(j, NULL, + strtol(j->name, &ep, 10) && !*ep ? KP_JID : KP_NAME, + j->name); + /* + * Collect parameters for the jail, global parameters/variables, + * and any matching wildcard jails. + */ + did_self = 0; + TAILQ_FOREACH(wj, &wild, tq) { + if (j->seq < wj->seq && !did_self) { + TAILQ_FOREACH(p, &opp, tq) + add_param(j, p, 0, NULL); + did_self = 1; + } + if (wild_jail_match(j->name, wj->name)) + TAILQ_FOREACH(p, &wj->params, tq) + add_param(j, p, 0, NULL); + } + if (!did_self) + TAILQ_FOREACH(p, &opp, tq) + add_param(j, p, 0, NULL); + + /* Resolve any variable substitutions. */ + pgen = 0; + TAILQ_FOREACH(p, &j->params, tq) { + p->gen = ++pgen; + find_vars: + TAILQ_FOREACH(s, &p->val, tq) { + varoff = 0; + while ((v = STAILQ_FIRST(&s->vars))) { + TAILQ_FOREACH(vp, &j->params, tq) + if (!strcmp(vp->name, v->name)) + break; + if (!vp) { + jail_warnx(j, + "%s: variable \"%s\" not found", + p->name, v->name); + bad_var: + j->flags |= JF_FAILED; + TAILQ_FOREACH(vp, &j->params, tq) + if (vp->gen == pgen) + vp->flags |= PF_BAD; + goto free_var; + } + if (vp->flags & PF_BAD) + goto bad_var; + if (vp->gen == pgen) { + jail_warnx(j, "%s: variable loop", + v->name); + goto bad_var; + } + TAILQ_FOREACH(vs, &vp->val, tq) + if (!STAILQ_EMPTY(&vs->vars)) { + vp->gen = pgen; + TAILQ_REMOVE(&j->params, vp, + tq); + TAILQ_INSERT_BEFORE(p, vp, tq); + p = vp; + goto find_vars; + } + vs = TAILQ_FIRST(&vp->val); + if (TAILQ_NEXT(vs, tq) != NULL && + (s->s[0] != '\0' || + STAILQ_NEXT(v, tq))) { + jail_warnx(j, "%s: array cannot be " + "substituted inline", + p->name); + goto bad_var; + } + s->s = erealloc(s->s, s->len + vs->len + 1); + memmove(s->s + v->pos + varoff + vs->len, + s->s + v->pos + varoff, + s->len - (v->pos + varoff) + 1); + memcpy(s->s + v->pos + varoff, vs->s, vs->len); + varoff += vs->len; + s->len += vs->len; + while ((vs = TAILQ_NEXT(vs, tq))) { + ns = emalloc(sizeof(struct cfstring)); + ns->s = estrdup(vs->s); + ns->len = vs->len; + STAILQ_INIT(&ns->vars); + TAILQ_INSERT_AFTER(&p->val, s, ns, tq); + s = ns; + } + free_var: + free(v->name); + STAILQ_REMOVE_HEAD(&s->vars, tq); + free(v); + } + } + } + + /* Free the jail's original parameter list and any variables. */ + while ((p = TAILQ_FIRST(&opp))) + free_param(&opp, p); + TAILQ_FOREACH_SAFE(p, &j->params, tq, tp) + if (p->flags & PF_VAR) + free_param(&j->params, p); + } + while ((wj = TAILQ_FIRST(&wild))) { + free(wj->name); + while ((p = TAILQ_FIRST(&wj->params))) + free_param(&wj->params, p); + TAILQ_REMOVE(&wild, wj, tq); + } +} + +/* + * Create a new jail record. + */ +struct cfjail * +add_jail(void) +{ + struct cfjail *j; + + j = emalloc(sizeof(struct cfjail)); + memset(j, 0, sizeof(struct cfjail)); + TAILQ_INIT(&j->params); + STAILQ_INIT(&j->dep[DEP_FROM]); + STAILQ_INIT(&j->dep[DEP_TO]); + j->queue = &cfjails; + TAILQ_INSERT_TAIL(&cfjails, j, tq); + return j; +} + +/* + * Add a parameter to a jail. + */ +void +add_param(struct cfjail *j, const struct cfparam *p, enum intparam ipnum, + const char *value) +{ + struct cfstrings nss; + struct cfparam *dp, *np; + struct cfstring *s, *ns; + struct cfvar *v, *nv; + const char *name; + char *cs, *tname; + unsigned flags; + + if (j == NULL) { + /* Create a single anonymous jail if one doesn't yet exist. */ + j = TAILQ_LAST(&cfjails, cfjails); + if (j == NULL) + j = add_jail(); + } + TAILQ_INIT(&nss); + if (p != NULL) { + name = p->name; + flags = p->flags; + /* + * Make a copy of the parameter's string list, + * which may be freed if it's overridden later. + */ + TAILQ_FOREACH(s, &p->val, tq) { + ns = emalloc(sizeof(struct cfstring)); + ns->s = estrdup(s->s); + ns->len = s->len; + STAILQ_INIT(&ns->vars); + STAILQ_FOREACH(v, &s->vars, tq) { + nv = emalloc(sizeof(struct cfvar)); + nv->name = strdup(v->name); + nv->pos = v->pos; + STAILQ_INSERT_TAIL(&ns->vars, nv, tq); + } + TAILQ_INSERT_TAIL(&nss, ns, tq); + } + } else { + flags = PF_APPEND; + if (ipnum != IP__NULL) { + name = intparams[ipnum].name; + flags |= intparams[ipnum].flags; + } else if ((cs = strchr(value, '='))) { + tname = alloca(cs - value + 1); + strlcpy(tname, value, cs - value + 1); + name = tname; + value = cs + 1; + } else { + name = value; + value = NULL; + } + if (value != NULL) { + ns = emalloc(sizeof(struct cfstring)); + ns->s = estrdup(value); + ns->len = strlen(value); + STAILQ_INIT(&ns->vars); + TAILQ_INSERT_TAIL(&nss, ns, tq); + } + } + + /* See if this parameter has already been added. */ + if (ipnum != IP__NULL) + dp = j->intparams[ipnum]; + else + TAILQ_FOREACH(dp, &j->params, tq) + if (!(dp->flags & PF_CONV) && equalopts(dp->name, name)) + break; + if (dp != NULL) { + /* Found it - append or replace. */ + if (strcmp(dp->name, name)) { + free(dp->name); + dp->name = estrdup(name); + } + if (!(flags & PF_APPEND) || TAILQ_EMPTY(&nss)) + free_param_strings(dp); + TAILQ_CONCAT(&dp->val, &nss, tq); + dp->flags |= flags; + } else { + /* Not found - add it. */ + np = emalloc(sizeof(struct cfparam)); + np->name = estrdup(name); + TAILQ_INIT(&np->val); + TAILQ_CONCAT(&np->val, &nss, tq); + np->flags = flags; + np->gen = 0; + TAILQ_INSERT_TAIL(&j->params, np, tq); + if (ipnum != IP__NULL) + j->intparams[ipnum] = np; + else + for (ipnum = IP__NULL + 1; ipnum < IP_NPARAM; ipnum++) + if (!(intparams[ipnum].flags & PF_CONV) && + equalopts(name, intparams[ipnum].name)) { + j->intparams[ipnum] = np; + np->flags |= intparams[ipnum].flags; + break; + } + } +} + +/* + * Return if a boolean parameter exists and is true. + */ +int +bool_param(const struct cfparam *p) +{ + const char *cs; + + if (p == NULL) + return 0; + cs = strrchr(p->name, '.'); + return !strncmp(cs ? cs + 1 : p->name, "no", 2) ^ + (TAILQ_EMPTY(&p->val) || + !strcasecmp(TAILQ_LAST(&p->val, cfstrings)->s, "true") || + (strtol(TAILQ_LAST(&p->val, cfstrings)->s, NULL, 10))); +} + +/* + * Set an integer if a parameter if it exists. + */ +int +int_param(const struct cfparam *p, int *ip) +{ + if (p == NULL || TAILQ_EMPTY(&p->val)) + return 0; + *ip = strtol(TAILQ_LAST(&p->val, cfstrings)->s, NULL, 10); + return 1; +} + +/* + * Return the string value of a scalar parameter if it exists. + */ +const char * +string_param(const struct cfparam *p) +{ + return (p && !TAILQ_EMPTY(&p->val) + ? TAILQ_LAST(&p->val, cfstrings)->s : NULL); +} + +/* + * Check syntax and values of internal parameters. Set some internal + * parameters based on the values of others. + */ +int +check_intparams(struct cfjail *j) +{ + struct cfparam *p; + struct cfstring *s; + FILE *f; + const char *val; + char *cs, *ep, *ln; + size_t lnlen; + int error; +#if defined(INET) || defined(INET6) + struct addrinfo hints; + struct addrinfo *ai0, *ai; + const char *hostname; + int gicode, defif, prefix; +#endif +#ifdef INET + struct in_addr addr4; + int ip4ok; + char avalue4[INET_ADDRSTRLEN]; +#endif +#ifdef INET6 + struct in6_addr addr6; + int ip6ok; + char avalue6[INET6_ADDRSTRLEN]; +#endif + + error = 0; + /* Check format of boolan and integer values. */ + TAILQ_FOREACH(p, &j->params, tq) { + if (!TAILQ_EMPTY(&p->val) && (p->flags & (PF_BOOL | PF_INT))) { + val = TAILQ_LAST(&p->val, cfstrings)->s; + if (p->flags & PF_BOOL) { + if (strcasecmp(val, "false") && + strcasecmp(val, "true") && + ((void)strtol(val, &ep, 10), *ep)) { + jail_warnx(j, + "%s: unknown boolean value \"%s\"", + p->name, val); + error = -1; + } + } else { + (void)strtol(val, &ep, 10); + if (ep == val || *ep) { + jail_warnx(j, + "%s: non-integer value \"%s\"", + p->name, val); + error = -1; + } + } + } + } + +#if defined(INET) || defined(INET6) + /* + * The ip_hostname parameter looks up the hostname, and adds parameters + * for any IP addresses it finds. + */ + if (((j->flags & JF_OP_MASK) != JF_STOP || + j->intparams[IP_INTERFACE] != NULL) && + bool_param(j->intparams[IP_IP_HOSTNAME]) && + (hostname = string_param(j->intparams[KP_HOST_HOSTNAME]))) { + j->intparams[IP_IP_HOSTNAME] = NULL; + /* + * Silently ignore unsupported address families from + * DNS lookups. + */ +#ifdef INET + ip4ok = feature_present("inet"); +#endif +#ifdef INET6 + ip6ok = feature_present("inet6"); +#endif + if ( +#if defined(INET) && defined(INET6) + ip4ok || ip6ok +#elif defined(INET) + ip4ok +#elif defined(INET6) + ip6ok +#endif + ) { + /* Look up the hostname (or get the address) */ + memset(&hints, 0, sizeof(hints)); + hints.ai_socktype = SOCK_STREAM; + hints.ai_family = +#if defined(INET) && defined(INET6) + ip4ok ? (ip6ok ? PF_UNSPEC : PF_INET) : PF_INET6; +#elif defined(INET) + PF_INET; +#elif defined(INET6) + PF_INET6; +#endif + gicode = getaddrinfo(hostname, NULL, &hints, &ai0); + if (gicode != 0) { + jail_warnx(j, "host.hostname %s: %s", hostname, + gai_strerror(gicode)); + error = -1; + } else { + /* + * Convert the addresses to ASCII so jailparam + * can convert them back. Errors are not + * expected here. + */ + for (ai = ai0; ai; ai = ai->ai_next) + switch (ai->ai_family) { +#ifdef INET + case AF_INET: + memcpy(&addr4, + &((struct sockaddr_in *) + (void *)ai->ai_addr)-> + sin_addr, sizeof(addr4)); + if (inet_ntop(AF_INET, + &addr4, avalue4, + INET_ADDRSTRLEN) == NULL) + err(1, "inet_ntop"); + add_param(j, NULL, KP_IP4_ADDR, + avalue4); + break; +#endif +#ifdef INET6 + case AF_INET6: + memcpy(&addr6, + &((struct sockaddr_in6 *) + (void *)ai->ai_addr)-> + sin6_addr, sizeof(addr6)); + if (inet_ntop(AF_INET6, + &addr6, avalue6, + INET6_ADDRSTRLEN) == NULL) + err(1, "inet_ntop"); + add_param(j, NULL, KP_IP6_ADDR, + avalue6); + break; +#endif + } + freeaddrinfo(ai0); + } + } + } + + /* + * IP addresses may include an interface to set that address on, + * and a netmask/suffix for that address. + */ + defif = string_param(j->intparams[IP_INTERFACE]) != NULL; +#ifdef INET + if (j->intparams[KP_IP4_ADDR] != NULL) { + TAILQ_FOREACH(s, &j->intparams[KP_IP4_ADDR]->val, tq) { + cs = strchr(s->s, '|'); + if (cs || defif) + add_param(j, NULL, IP__IP4_IFADDR, s->s); + if (cs) { + strcpy(s->s, cs + 1); + s->len -= cs + 1 - s->s; + } + if ((cs = strchr(s->s, '/'))) { + prefix = strtol(cs + 1, &ep, 10); + if (*ep == '.' + ? inet_pton(AF_INET, cs + 1, &addr4) != 1 + : *ep || prefix < 0 || prefix > 32) { + jail_warnx(j, + "ip4.addr: bad netmask \"%s\"", cs); + error = -1; + } + *cs = '\0'; + s->len = cs - s->s + 1; + } + } + } +#endif +#ifdef INET6 + if (j->intparams[KP_IP6_ADDR] != NULL) { + TAILQ_FOREACH(s, &j->intparams[KP_IP6_ADDR]->val, tq) { + cs = strchr(s->s, '|'); + if (cs || defif) + add_param(j, NULL, IP__IP6_IFADDR, s->s); + if (cs) { + strcpy(s->s, cs + 1); + s->len -= cs + 1 - s->s; + } + if ((cs = strchr(s->s, '/'))) { + prefix = strtol(cs + 1, &ep, 10); + if (*ep || prefix < 0 || prefix > 128) { + jail_warnx(j, + "ip6.addr: bad prefixlen \"%s\"", + cs); + error = -1; + } + *cs = '\0'; + s->len = cs - s->s + 1; + } + } + } +#endif +#endif + + /* + * Read mount.fstab file(s), and treat each line as its own mount + * parameter. + */ + if (j->intparams[IP_MOUNT_FSTAB] != NULL) { + TAILQ_FOREACH(s, &j->intparams[IP_MOUNT_FSTAB]->val, tq) { + if (s->len == 0) + continue; + f = fopen(s->s, "r"); + if (f == NULL) { + jail_warnx(j, "mount.fstab: %s: %s", + s->s, strerror(errno)); + error = -1; + continue; + } + while ((ln = fgetln(f, &lnlen))) { + if ((cs = memchr(ln, '#', lnlen - 1))) + lnlen = cs - ln + 1; + if (ln[lnlen - 1] == '\n' || + ln[lnlen - 1] == '#') + ln[lnlen - 1] = '\0'; + else { + cs = alloca(lnlen + 1); + strlcpy(cs, ln, lnlen + 1); + ln = cs; + } + add_param(j, NULL, IP__MOUNT_FROM_FSTAB, ln); + } + fclose(f); + } + } + if (error) + failed(j); + return error; +} + +/* + * Import parameters into libjail's binary jailparam format. + */ +int +import_params(struct cfjail *j) +{ + struct cfparam *p; + struct cfstring *s, *ts; + struct jailparam *jp; + char *value, *cs; + size_t vallen; + int error; + + error = 0; + j->njp = 0; + TAILQ_FOREACH(p, &j->params, tq) + if (!(p->flags & PF_INTERNAL)) + j->njp++; + j->jp = jp = emalloc(j->njp * sizeof(struct jailparam)); + TAILQ_FOREACH(p, &j->params, tq) { + if (p->flags & PF_INTERNAL) + continue; + if (jailparam_init(jp, p->name) < 0) { + error = -1; + jail_warnx(j, "%s", jail_errmsg); + continue; + } + if (TAILQ_EMPTY(&p->val)) + value = NULL; + else if (!jp->jp_elemlen || + !TAILQ_NEXT(TAILQ_FIRST(&p->val), tq)) { + /* + * Scalar parameters silently discard multiple (array) + * values, keeping only the last value added. This + * lets values added from the command line append to + * arrays wthout pre-checking the type. + */ + value = TAILQ_LAST(&p->val, cfstrings)->s; + } else { + /* + * Convert arrays into comma-separated strings, which + * jailparam_import will then convert back into arrays. + */ + vallen = 0; + TAILQ_FOREACH(s, &p->val, tq) + vallen += s->len + 1; + value = alloca(vallen); + cs = value; + TAILQ_FOREACH_SAFE(s, &p->val, tq, ts) { + strcpy(cs, s->s); + if (ts != NULL) { + cs += s->len + 1; + cs[-1] = ','; + } + } + } + if (jailparam_import(jp, value) < 0) { + error = -1; + jail_warnx(j, "%s", jail_errmsg); + } + jp++; + } + if (error) { + jailparam_free(j->jp, j->njp); + free(j->jp); + j->jp = NULL; + failed(j); + } + return error; +} + +/* + * Check if options are equal (with or without the "no" prefix). + */ +int +equalopts(const char *opt1, const char *opt2) +{ + char *p; + + /* "opt" vs. "opt" or "noopt" vs. "noopt" */ + if (strcmp(opt1, opt2) == 0) + return (1); + /* "noopt" vs. "opt" */ + if (strncmp(opt1, "no", 2) == 0 && strcmp(opt1 + 2, opt2) == 0) + return (1); + /* "opt" vs. "noopt" */ + if (strncmp(opt2, "no", 2) == 0 && strcmp(opt1, opt2 + 2) == 0) + return (1); + while ((p = strchr(opt1, '.')) != NULL && + !strncmp(opt1, opt2, ++p - opt1)) { + opt2 += p - opt1; + opt1 = p; + /* "foo.noopt" vs. "foo.opt" */ + if (strncmp(opt1, "no", 2) == 0 && strcmp(opt1 + 2, opt2) == 0) + return (1); + /* "foo.opt" vs. "foo.noopt" */ + if (strncmp(opt2, "no", 2) == 0 && strcmp(opt1, opt2 + 2) == 0) + return (1); + } + return (0); +} + +/* + * See if a jail name matches a wildcard. + */ +int +wild_jail_match(const char *jname, const char *wname) +{ + const char *jc, *jd, *wc, *wd; + + /* + * A non-final "*" component in the wild name matches a single jail + * component, and a final "*" matches one or more jail components. + */ + for (jc = jname, wc = wname; + (jd = strchr(jc, '.')) && (wd = strchr(wc, '.')); + jc = jd + 1, wc = wd + 1) + if (strncmp(jc, wc, jd - jc + 1) && strncmp(wc, "*.", 2)) + return 0; + return (!strcmp(jc, wc) || !strcmp(wc, "*")); +} + +/* + * Return if a jail name is a wildcard. + */ +int +wild_jail_name(const char *wname) +{ + const char *wc; + + for (wc = strchr(wname, '*'); wc; wc = strchr(wc + 1, '*')) + if ((wc == wname || wc[-1] == '.') && + (wc[1] == '\0' || wc[1] == '.')) + return 1; + return 0; +} + +/* + * Free a parameter record and all its strings and variables. + */ +static void +free_param(struct cfparams *pp, struct cfparam *p) +{ + free(p->name); + free_param_strings(p); + TAILQ_REMOVE(pp, p, tq); + free(p); +} + +static void +free_param_strings(struct cfparam *p) +{ + struct cfstring *s; + struct cfvar *v; + + while ((s = TAILQ_FIRST(&p->val))) { + free(s->s); + while ((v = STAILQ_FIRST(&s->vars))) { + free(v->name); + STAILQ_REMOVE_HEAD(&s->vars, tq); + free(v); + } + TAILQ_REMOVE(&p->val, s, tq); + free(s); + } +} diff --git a/usr.sbin/jail/jail.8 b/usr.sbin/jail/jail.8 index eeaf99b7f33..9204686d233 100644 --- a/usr.sbin/jail/jail.8 +++ b/usr.sbin/jail/jail.8 @@ -1,6 +1,5 @@ -.\" .\" Copyright (c) 2000, 2003 Robert N. M. Watson -.\" Copyright (c) 2008 James Gritton +.\" Copyright (c) 2008-2012 James Gritton .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -24,116 +23,68 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" -.\" ---------------------------------------------------------------------------- -.\" "THE BEER-WARE LICENSE" (Revision 42): -.\" wrote this file. As long as you retain this notice you -.\" can do whatever you want with this stuff. If we meet some day, and you think -.\" this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp -.\" ---------------------------------------------------------------------------- -.\" .\" $FreeBSD$ .\" -.Dd February 29, 2012 +.Dd May 23, 2012 .Dt JAIL 8 .Os .Sh NAME .Nm jail -.Nd "create or modify a system jail" +.Nd "manage system jails" .Sh SYNOPSIS .Nm -.Op Fl dhi +.Op Fl dhilqv .Op Fl J Ar jid_file -.Op Fl l u Ar username | Fl U Ar username -.Op Fl c | m -.Op Ar parameter=value ... +.Op Fl u Ar username +.Op Fl U Ar username +.Op Fl cmr +.Ar param Ns = Ns Ar value ... +.Op Cm command Ns = Ns Ar command ... .Nm -.Op Fl hi +.Op Fl dqv +.Op Fl f Ar conf_file +.Op Fl p Ar limit +.Op Fl cmr +.Op Ar jail +.Nm +.Op Fl qv +.Op Fl f Ar conf_file +.Op Fl rR +.Op Cm * | Ar jail ... +.Nm +.Op Fl dhilqv +.Op Fl J Ar jid_file +.Op Fl u Ar username +.Op Fl U Ar username .Op Fl n Ar jailname -.Op Fl J Ar jid_file .Op Fl s Ar securelevel -.Op Fl l u Ar username | Fl U Ar username -.Op Ar path hostname [ip[,..]] command ... -.Nm -.Op Fl r Ar jail +.Op Ar path hostname [ Ar ip Ns [ Ns Ar ,... Ns ]] Ar command ... .Sh DESCRIPTION The .Nm -utility creates a new jail or modifies an existing jail, optionally -imprisoning the current process (and future descendants) inside it. +utility creates new jails, or modifies or removes existing jails. +A jail is specified via parameters on the command line, or in the +.Xr jail.conf 5 +file. .Pp -The options are as follows: +At least one of the options +.Fl c , +.Fl m +or +.Fl r +must be specified. +These options are used alone or in combination describe the operation to +perform: .Bl -tag -width indent -.It Fl d -Allow making changes to a dying jail. -.It Fl h -Resolve the -.Va host.hostname -parameter (or -.Va hostname ) -and add all IP addresses returned by the resolver -to the list of -.Va ip -addresses for this prison. -This may affect default address selection for outgoing IPv4 connections -of prisons. -The address first returned by the resolver for each address family -will be used as primary address. -See the -.Va ip4.addr -and -.Va ip6.addr -parameters further down for details. -.It Fl i -Output the jail identifier of the newly created jail. -.It Fl n Ar jailname -Set the jail's name. -This is deprecated and is equivalent to setting the -.Va name -parameter. -.It Fl J Ar jid_file -Write a -.Ar jid_file -file, containing jail identifier, path, hostname, IP and -command used to start the jail. -.It Fl l -Run program in the clean environment. -The environment is discarded except for -.Ev HOME , SHELL , TERM -and -.Ev USER . -.Ev HOME -and -.Ev SHELL -are set to the target login's default values. -.Ev USER -is set to the target login. -.Ev TERM -is imported from the current environment. -The environment variables from the login class capability database for the -target login are also set. -.It Fl s Ar securelevel -Set the -.Va kern.securelevel -MIB entry to the specified value inside the newly created jail. -This is deprecated and is equivalent to setting the -.Va securelevel -parameter. -.It Fl u Ar username -The user name from host environment as whom the -.Ar command -should run. -.It Fl U Ar username -The user name from jailed environment as whom the -.Ar command -should run. .It Fl c Create a new jail. -The +The jail .Va jid and .Va name -parameters (if specified) must not refer to an existing jail. +parameters (if specified) on the command line, +or any jails +must not refer to an existing jail. .It Fl m Modify an existing jail. One of the @@ -141,27 +92,158 @@ One of the or .Va name parameters must exist and refer to an existing jail. -.It Fl cm -Create a jail if it does not exist, or modify a jail if it does exist. +Some parameters may not be changed on a running jail. .It Fl r Remove the .Ar jail specified by jid or name. All jailed processes are killed, and all children of this jail are also removed. +.It Fl rc +Restart an existing jail. +The jail is first removed and then re-created, as if +.Dq Nm Fl c +and +.Dq Nm Fl r +were run in succession. +.It Fl cm +Create a jail if it does not exist, or modify the jail if it does exist. +.It Fl mr +Modify an existing jail. +The jail may be restarted if necessary to modify parameters than could +not otherwise be changed. +.It Fl cmr +Create a jail if it doesn't exist, or modify (and possibly restart) the +jail if it does exist. .El .Pp -At least one of the -.Fl c , -.Fl m -or +Other available options are: +.Bl -tag -width indent +.It Fl d +Allow making changes to a dying jail, equivalent to the +.Va allow.dying +parameter. +.It Fl f Ar conf_file +Use configuration file +.Ar conf_file +instead of the default +.Pa /etc/jail.conf . +.It Fl h +Resolve the +.Va host.hostname +parameter (or +.Va hostname ) +and add all IP addresses returned by the resolver +to the list of addresses for this prison. +This is equivalent to the +.Va ip_hostname +parameter. +.It Fl i +Output (only) the jail identifier of the newly created jail(s). +This implies the +.Fl q +option. +.It Fl J Ar jid_file +Write a +.Ar jid_file +file, containing parameters used to start the jail. +.It Fl l +Run commands in a clean environment. +This is deprecated and is equivalent to the exec.clean parameter. +.It Fl n Ar jailname +Set the jail's name. +This is deprecated and is equivalent to the +.Va name +parameter. +.It Fl p Ar limit +Limit the number of commands from +.Va exec.* +that can run simultaneously. +.It Fl q +Suppress the message printed whenever a jail is created, modified or removed. +Only error messages will be printed. +.It Fl R +A variation of the .Fl r -options must be specified. +option that removes an existing jail without using the configuration file. +No removal-related parameters for this jail will be used - the jail will +simply be removed. +.It Fl s Ar securelevel +Set the +.Va kern.securelevel +MIB entry to the specified value inside the newly created jail. +This is deprecated and is equivalent to the +.Va securelevel +parameter. +.It Fl u Ar username +The user name from host environment as whom jailed commands should run. +This is deprecated and is equivalent to the +.Va exec.jail_user +and +.Va exec.system_jail_user +parameters. +.It Fl U Ar username +The user name from jailed environment as whom jailed commands should run. +This is deprecated and is equivalent to the +.Va exec.jail_user +parameter. +.It Fl v +Print a message on every operation, such as running commands and +mounting filesystems. +.El .Pp -.Ar Parameters -are listed in +If no arguments are given after the options, the operation (except +remove) will be performed on all jails specified in the +.Xr jail.conf 5 +file. +A single argument of a jail name will operate only on the specified jail. +The +.Fl r +and +.Fl R +options can also remove running jails that aren't in the +.Xr jail.conf 5 +file, specified by name or jid. +.Pp +An argument of +.Dq * +is a wildcard that will operate on all jails, regardless of whether +they appear in +.Xr jail.conf 5 ; +this is the surest way for +.Fl r +to remove all jails. +If hierarchical jails exist, a partial-matching wildcard definition may +be specified. +For example, an argument of +.Dq foo.* +would apply to jails with names like +.Dq foo.bar +and +.Dq foo.bar.baz . +.Pp +A jail may be specified with parameters directly on the command line. +In this case, the +.Xr jail.conf 5 +file will not be used. +For backward compatibility, the command line may also have four fixed +parameters, without names: +.Ar path , +.Ar hostname , +.Ar ip , +and +.Ar command . +This mode will always create a new jail, and the +.Fl c +and +.Fl m +options don't apply (and must not exist). +.Ss Jail Parameters +Parameters in the +.Xr jail.conf 5 +file, or on the command line, are generally in .Dq name=value -form, following the options. +form. Some parameters are boolean, and do not have a value but are set by the name alone with or without a .Dq no @@ -169,41 +251,35 @@ prefix, e.g. .Va persist or .Va nopersist . -Any parameters not set will be given default values, often based on the -current environment. -.Pp -The pseudo-parameter -.Va command -specifies that the current process should enter the new (or modified) jail, -and run the specified command. -It must be the last parameter specified, because it includes not only -the value following the -.Sq = -sign, but also passes the rest of the arguments to the command. -.Pp -Instead of supplying named -.Ar parameters , -four fixed parameters may be supplied in order on the command line: -.Ar path , -.Ar hostname , -.Ar ip , +They can also be given the values +.Dq true and -.Ar command . -As the -.Va jid -and -.Va name -parameters aren't in this list, this mode will always create a new jail, and -the -.Fl c -and -.Fl m -options don't apply (and must not exist). +.Dq false . +Other parameters may have more than one value, specified as a +comma-separated list or with +.Dq += +in the configuration file (see +.Xr jail.conf 5 +for details). .Pp -Jails have a set a core parameters, and modules can add their own jail -parameters. +The +.Nm +utility recognizes two classes of parameters. There are the true jail +parameters that are passed to the kernel when the jail is created, +can be seen with +.Xr jls 8 , +and can (usually) be changed with +.Dq Nm Fl m . +Then there are pseudo-parameters that are only used by +.Nm +itself. +.Pp +Jails have a set a core parameters, and kernel modules can add their own +jail parameters. The current set of available parameters can be retrieved via .Dq Nm sysctl Fl d Va security.jail.param . +Any parameters not set will be given default values, often based on the +current environment. The core parameters are: .Bl -tag -width indent .It Va jid @@ -231,14 +307,21 @@ If no .Va name is supplied, a default is assumed that is the same as the .Va jid . -.It Va path -Directory which is to be the root of the prison. The -.Va command -(if any) is run from this directory, as are commands from -.Xr jexec 8 . +.Va name +parameter is implied by the +.Xr jail.conf 5 +file format, and need not be explicitly set when using the configuration +file. +.It Va path +The directory which is to be the root of the prison. +Any commands run inside the prison, either by +.Nm +or from +.Xr jexec 8 , +are run from this directory. .It Va ip4.addr -A comma-separated list of IPv4 addresses assigned to the prison. +A list of IPv4 addresses assigned to the prison. If this is set, the jail is restricted to using only these addresses. Any attempts to use other addresses fail, and attempts to use wildcard addresses silently use the jailed address instead. @@ -252,7 +335,7 @@ assigned to itself. A boolean option to change the formerly mentioned behaviour and disable IPv4 source address selection for the prison in favour of the primary IPv4 address of the jail. -Source address selection is enabled by default for all jails and a +Source address selection is enabled by default for all jails and the .Va ip4.nosaddrsel setting of a parent jail is not inherited for any child jails. .It Va ip4 @@ -277,8 +360,20 @@ A set of IPv6 options for the prison, the counterparts to and .Va ip4 above. +.It vnet +Create the prison with its own virtual network stack, +with its own network interfaces, addresses, routing table, etc. +The kernel must have been compiled with the +.Sy VIMAGE option +for this to be available. +Possible values are +.Dq inherit +to use the system network stack, possibly with restricted IP addresses, +and +.Dq new +to create a new network stack. .It Va host.hostname -Hostname of the prison. +The hostname of the prison. Other similar parameters are .Va host.domainname , .Va host.hostuuid @@ -314,16 +409,27 @@ permissions are effective and .Va enforce_statfs is set to a value lower than 2. Devfs rules and rulesets cannot be viewed or modified from inside a jail. +.Pp +NOTE: It is important that only appropriate device nodes in devfs be +exposed to a jail; access to disk devices in the jail may permit processes +in the jail to bypass the jail sandboxing by modifying files outside of +the jail. +See +.Xr devfs 8 +for information on how to use devfs rules to limit access to entries +in the per-jail devfs. +A simple devfs ruleset for jails is available as ruleset #4 in +.Pa /etc/defaults/devfs.rules . .It Va children.max The number of child jails allowed to be created by this jail (or by other jails under this jail). This limit is zero by default, indicating the jail is not allowed to create child jails. See the -.Va "Hierarchical Jails" +.Sx "Hierarchical Jails" section for more information. .It Va children.cur -The number of descendents of this jail, including its own child jails +The number of descendants of this jail, including its own child jails and any jails created under them. .It Va enforce_statfs This determines which information processes in a jail are able to get @@ -345,10 +451,13 @@ where the jail's chroot directory is located. .It Va persist Setting this boolean parameter allows a jail to exist without any processes. -Normally, a jail is destroyed as its last process exits. +Normally, a command is run as part of jail creation, and then the jail +is destroyed as its last process exits. A new jail must have either the .Va persist parameter or +.Va exec.start +or .Va command pseudo-parameter set. .It Va cpuset.id @@ -459,6 +568,172 @@ have not had jail functionality added to them. .El .El .Pp +There are pseudo-parameters that aren't passed to the kernel, but are +used by +.Nm +to set up the prison environment, often by running specified commands +when jails are created or removed. +The +.Va exec.* +command parameters are +.Xr sh 1 +command lines that are run in either the system or prison environment. +They may be given multiple values, which run would the specified +commands in sequence. +All commands must succeed (return a zero exit status), or the jail will +not be created or removed. +.Pp +The pseudo-parameters are: +.Bl -tag -width indent +.It Va exec.prestart +Command(s) to run in the system environment before a prison is created. +.It Va exec.start +Command(s) to run in the prison environment when a jail is created. +A typical command to run is +.Dq sh /etc/rc . +.It Va command +A synonym for +.Va exec.start +for use when specifying a prison directly on the command line. +Unlike other parameters whose value is a single string, +.Va command +uses the remainder of the +.Nm +command line as its own arguments. +.It Va exec.poststart +Command(s) to run in the system environment after a jail is created, +and after any +.Va exec.start +commands have completed. +.It Va exec.prestop +Command(s) to run in the system environment before a jail is removed. +.It Va exec.stop +Command(s) to run in the prison environment before a jail is removed, +and after any +.Va exec.prestop +commands have completed. +A typical command to run is +.Dq sh /etc/rc.shutdown . +.It Va exec.poststop +Command(s) to run in the system environment after a jail is removed. +.It Va exec.clean +Run commands in a clean environment. +The environment is discarded except for +.Ev HOME , SHELL , TERM +and +.Ev USER . +.Ev HOME +and +.Ev SHELL +are set to the target login's default values. +.Ev USER +is set to the target login. +.Ev TERM +is imported from the current environment. +The environment variables from the login class capability database for the +target login are also set. +.It Va exec.jail_user +The user to run commands as, when running in the prison environment. +The default is to run the commands as the current user. +.It Va exec.system_jail_user +This boolean option looks for the +.Va exec.jail_user +in the system +.Xr passwd 5 +file, instead of in the prison's file. +.It Va exec.system_user +The user to run commands as, when running in the system environment. +The default is to run the commands as the current user. +.It Va exec.timeout +The maximum amount of time to wait for a command to complete. +If a command is still running after this many seconds have passed, +the jail not be created or removed. +.It Va exec.consolelog +A file to direct command output (stdout and stderr) to. +.It Va exec.fib +The FIB (routing table) to set when running commands inside the prison. +.It Va stop.timeout +The maximum amount of time to wait for a prison's processes to exit +after sending them a +.Dv SIGTERM +signal (which happens after the +.Va exec.stop +commands have completed). +After this many seconds have passed, the prison will be removed, which +will kill any remaining processes. +If this is set to zero, no +.Dv SIGTERM +is sent and the prison is immediately removed. +The default is 10 seconds. +.It Va interface +A network interface to add the prison's IP addresses +.Va ( ip4.addr +and +.Va ip6.addr ) +to. +An alias for each address will be added to the interface before the +prison is created, and will be removed from the interface after the +prison is removed. +.It Op Va ip4.addr +In addition to the IP addresses that are passed to the kernel, and +interface and/or a netmask may also be specified, in the form +.Dq Ar interface Ns | Ns Ar ip-address Ns / Ns Ar netmask . +If an interface is given before the IP address, an alias for the address +will be added to that interface, as it is with the +.Va interface +parameter. If a netmask in either dotted-quad or CIDR form is given +after IP address, it will be used when adding the IP alias. +.It Op Va ip6.addr +In addition to the IP addresses that are passed to the kernel, +and interface and/or a prefix may also be specified, in the form +.Dq Ar interface Ns | Ns Ar ip-address Ns / Ns Ar prefix . +.It Va vnet.interface +A network interface to give to a vnet-enabled jail after is it created. +The interface will automatically be returned when the jail is removed. +.It Va ip_hostname +Resolve the +.Va host.hostname +parameter and add all IP addresses returned by the resolver +to the list of addresses +.Va ( ip4.addr +or +.Va ip6.addr ) +for this prison. +This may affect default address selection for outgoing IPv4 connections +of prisons. +The address first returned by the resolver for each address family +will be used as primary address. +.It Va mount +A filesystem to mount before creating the jail (and to unmount after +removing it), given as a single +.Xr fstab 5 +line. +.It Va mount.fstab +An +.Xr fstab 5 +format file containing filesystems to mount before creating a jail. +.It Va mount.devfs +Mount a +.Xr devfs +filesystem on the chrooted /dev directory, and apply the ruleset in the +.Va devfs_ruleset +parameter (or a default of ruleset 4: devfsrules_jail) +to restrict the devices visible inside the prison. +.It Va allow.dying +Allow making changes to a +.Va dying +jail. +.It Va depend +Specify a jail (or jails) that this jail depends on. +Any such jails must be fully created, up to the last +.Va exec.poststart +command, before any action will taken to create this jail. +When jails are removed the opposite is true: +this jail must be fully removed, up to the last +.Va exec.poststop +command, before the jail(s) it depends on are stopped. +.El +.Sh EXAMPLES Jails are typically set up using one of two philosophies: either to constrain a specific application (possibly running with privilege), or to create a @@ -476,7 +751,6 @@ process. This manual page documents the configuration steps necessary to support either of these steps, although the configuration steps may be refined based on local requirements. -.Sh EXAMPLES .Ss "Setting up a Jail Directory Tree" To set up a jail directory tree containing an entire .Fx @@ -489,20 +763,8 @@ cd /usr/src mkdir -p $D make world DESTDIR=$D make distribution DESTDIR=$D -mount -t devfs devfs $D/dev .Ed .Pp -NOTE: It is important that only appropriate device nodes in devfs be -exposed to a jail; access to disk devices in the jail may permit processes -in the jail to bypass the jail sandboxing by modifying files outside of -the jail. -See -.Xr devfs 8 -for information on how to use devfs rules to limit access to entries -in the per-jail devfs. -A simple devfs ruleset for jails is available as ruleset #4 in -.Pa /etc/defaults/devfs.rules . -.Pp In many cases this example would put far more in the jail than needed. In the other extreme case a jail might contain only one file: the executable to be run in the jail. @@ -520,8 +782,9 @@ Do what was described in to build the jail directory tree. For the sake of this example, we will assume you built it in -.Pa /data/jail/192.0.2.100 , -named for the jailed IP address. +.Pa /data/jail/testjail , +for a jail named +.Dq testjail . Substitute below as needed with your own directory, IP address, and hostname. .Ss "Setting up the Host Environment" @@ -619,7 +882,7 @@ or for running a virtual server. .Pp Start a shell in the jail: .Bd -literal -offset indent -jail -c path=/data/jail/192.0.2.100 host.hostname=testhostname \\ +jail -c path=/data/jail/testjail mount.devfs host.hostname=testhostname \\ ip4.addr=192.0.2.100 command=/bin/sh .Ed .Pp @@ -633,15 +896,6 @@ etc. .Pp .Bl -bullet -offset indent -compact .It -Create an empty -.Pa /etc/fstab -to quell startup warnings about missing fstab (virtual server only) -.It -Disable the port mapper -.Pa ( /etc/rc.conf : -.Li rpcbind_enable="NO" ) -(virtual server only) -.It Configure .Pa /etc/resolv.conf so that name resolution within the jail will work correctly @@ -652,11 +906,6 @@ to quell .Xr sendmail 8 warnings. .It -Disable interface configuration to quell startup warnings about -.Xr ifconfig 8 -.Pq Li network_interfaces="" -(virtual server only) -.It Set a root password, probably different from the real host system .It Set the timezone @@ -674,36 +923,47 @@ If you are not using a virtual server, you may wish to modify .Xr syslogd 8 in the host environment to listen on the syslog socket in the jail environment; in this example, the syslog socket would be stored in -.Pa /data/jail/192.0.2.100/var/run/log . +.Pa /data/jail/testjail/var/run/log . .Pp Exit from the shell, and the jail will be shut down. .Ss "Starting the Jail" You are now ready to restart the jail and bring up the environment with all of its daemons and other programs. -If you are running a single application in the jail, substitute the -command used to start the application for -.Pa /etc/rc -in the examples below. -To start a virtual server environment, -.Pa /etc/rc -is run to launch various daemons and services. -To do this, first bring up the -virtual host interface, and then start the jail's -.Pa /etc/rc -script from within the jail. +Create an entry for the jail in +.Pa /etc/jail.conf : .Bd -literal -offset indent -ifconfig ed0 inet alias 192.0.2.100/32 -mount -t procfs proc /data/jail/192.0.2.100/proc -jail -c path=/data/jail/192.0.2.100 host.hostname=testhostname \\ - ip4.addr=192.0.2.100 command=/bin/sh /etc/rc +testjail { + path = /tmp/jail/testjail; + mount.devfs; + host.hostname = testhostname; + ip4.addr = 192.0.2.100; + interface = ed0; + exec.start = "/bin/sh /etc/rc"; + exec.stop = "/bin/sh /etc/rc.shutdown"; +} .Ed .Pp -A few warnings will be produced, because most -.Xr sysctl 8 -configuration variables cannot be set from within the jail, as they are -global across all jails and the host environment. -However, it should all -work properly. +To start a virtual server environment, +.Pa /etc/rc +is run to launch various daemons and services, and +.Pa /etc/rc.shutdown +is run to shut them down when the jail is removed. +If you are running a single application in the jail, +substitute the command used to start the application for +.Dq /bin/sh /etc/rc ; +there may be some script available to cleanly shut down the application, +or it may be sufficient to go without a stop command, and have +.Nm +send +.Dv SIGTERM +to the application. +.Pp +Start the jail by running: +.Bd -literal -offset indent +jail -c testjail +.Ed +.Pp +A few warnings may be produced; however, it should all work properly. You should be able to see .Xr inetd 8 , .Xr syslogd 8 , @@ -726,15 +986,6 @@ Please refer to the variables in .Xr rc.conf 5 for more information. -The -.Xr rc 8 -jail script provides a flexible system to start/stop jails: -.Bd -literal -/etc/rc.d/jail start -/etc/rc.d/jail stop -/etc/rc.d/jail start myjail -/etc/rc.d/jail stop myjail -.Ed .Ss "Managing the Jail" Normal machine shutdown commands, such as .Xr halt 8 , @@ -742,9 +993,8 @@ Normal machine shutdown commands, such as and .Xr shutdown 8 , cannot be used successfully within the jail. -To kill all processes in a -jail, you may log into the jail and, as root, use one of the following -commands, depending on what you want to accomplish: +To kill all processes from within a jail, you may use one of the +following commands, depending on what you want to accomplish: .Bd -literal -offset indent kill -TERM -1 kill -KILL -1 @@ -754,21 +1004,27 @@ This will send the .Dv SIGTERM or .Dv SIGKILL -signals to all processes in the jail from within the jail. +signals to all processes in the jail - be careful not to run this from +the host environment! +Once all of the jail's processes have died, unless the jail was created +with the +.Va persist +parameter, the jail will be removed. Depending on the intended use of the jail, you may also want to run .Pa /etc/rc.shutdown from within the jail. -To kill processes from outside the jail, use the -.Xr jexec 8 -utility in conjunction with the one of the -.Xr kill 1 -commands above. -You may also remove the jail with +.Pp +To shut down the jail from the outside, simply remove it with .Nm .Ar -r , -which will killall the jail's processes with -.Dv SIGKILL . +which will run any commands specified by +.Va exec.stop , +and then send +.Dv SIGTERM +and eventually +.Dv SIGKILL +to any remaining jailed processes. .Pp The .Pa /proc/ Ns Ar pid Ns Pa /status @@ -888,7 +1144,7 @@ unique jid. .Pp Like the names, a child jail's .Va path -is relative to its creator's own +appears relative to its creator's own .Va path . This is by virtue of the child jail being created in the chrooted environment of the first jail. @@ -900,12 +1156,12 @@ environment of the first jail. .Xr pkill 1 , .Xr ps 1 , .Xr quota 1 , -.Xr chroot 2 , .Xr jail_set 2 , -.Xr jail_attach 2 , +.Xr jail.conf 5 , .Xr procfs 5 , .Xr rc.conf 5 , .Xr sysctl.conf 5 , +.Xr chroot 8 , .Xr devfs 8 , .Xr halt 8 , .Xr inetd 8 , @@ -927,6 +1183,8 @@ utility appeared in .Fx 4.0 . Hierarchical/extensible jails were introduced in .Fx 8.0 . +The configuration file was introduced in +.Fx 9.1 . .Sh AUTHORS .An -nosplit The jail feature was written by @@ -947,14 +1205,10 @@ originally done by for IPv4. .Pp .An James Gritton -added the extensible jail parameters and hierarchical jails. +added the extensible jail parameters, hierarchical jails, +and the configuration file. .Sh BUGS -Jail currently lacks the ability to allow access to -specific jail information via -.Xr ps 1 -as opposed to -.Xr procfs 5 . -Similarly, it might be a good idea to add an +It might be a good idea to add an address alias flag such that daemons listening on all IPs .Pq Dv INADDR_ANY will not bind on that address, which would facilitate building a safe diff --git a/usr.sbin/jail/jail.c b/usr.sbin/jail/jail.c index 69c5e5362c9..78160c00753 100644 --- a/usr.sbin/jail/jail.c +++ b/usr.sbin/jail/jail.c @@ -1,6 +1,6 @@ /*- * Copyright (c) 1999 Poul-Henning Kamp. - * Copyright (c) 2009 James Gritton + * Copyright (c) 2009-2012 James Gritton * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -28,155 +28,190 @@ #include __FBSDID("$FreeBSD$"); -#include -#include +#include +#include #include #include #include #include -#include #include #include -#include -#include -#include -#include -#include -#include +#include #include #include #include #include -static struct jailparam *params; -static char **param_values; -static int nparams; +#include "jailp.h" -#ifdef INET6 -static int ip6_ok; -static char *ip6_addr; -#endif -#ifdef INET -static int ip4_ok; -static char *ip4_addr; -#endif +#define JP_RDTUN(jp) (((jp)->jp_ctltype & CTLFLAG_RDTUN) == CTLFLAG_RDTUN) -#if defined(INET6) || defined(INET) -static void add_ip_addr(char **addrp, char *newaddr); -#endif -#ifdef INET6 -static void add_ip_addr46(char *newaddr); -#endif -static void add_ip_addrinfo(int ai_flags, char *value); -static void quoted_print(FILE *fp, char *str); -static void set_param(const char *name, char *value); -static void usage(void); - -static const char *perm_sysctl[][3] = { - { "security.jail.set_hostname_allowed", - "allow.noset_hostname", "allow.set_hostname" }, - { "security.jail.sysvipc_allowed", - "allow.nosysvipc", "allow.sysvipc" }, - { "security.jail.allow_raw_sockets", - "allow.noraw_sockets", "allow.raw_sockets" }, - { "security.jail.chflags_allowed", - "allow.nochflags", "allow.chflags" }, - { "security.jail.mount_allowed", - "allow.nomount", "allow.mount" }, - { "security.jail.socket_unixiproute_only", - "allow.socket_af", "allow.nosocket_af" }, +struct permspec { + const char *name; + enum intparam ipnum; + int rev; }; -extern char **environ; +const char *cfname; +int iflag; +int note_remove; +int verbose; -#define GET_USER_INFO do { \ - pwd = getpwnam(username); \ - if (pwd == NULL) { \ - if (errno) \ - err(1, "getpwnam: %s", username); \ - else \ - errx(1, "%s: no such user", username); \ - } \ - lcap = login_getpwclass(pwd); \ - if (lcap == NULL) \ - err(1, "getpwclass: %s", username); \ - ngroups = ngroups_max; \ - if (getgrouplist(username, pwd->pw_gid, groups, &ngroups) != 0) \ - err(1, "getgrouplist: %s", username); \ -} while (0) +static void clear_persist(struct cfjail *j); +static int update_jail(struct cfjail *j); +static int rdtun_params(struct cfjail *j, int dofail); +static void running_jid(struct cfjail *j, int dflag); +static void jail_quoted_warnx(const struct cfjail *j, const char *name_msg, + const char *noname_msg); +static int jailparam_set_note(const struct cfjail *j, struct jailparam *jp, + unsigned njp, int flags); +static void print_jail(FILE *fp, struct cfjail *j, int oldcl); +static void print_param(FILE *fp, const struct cfparam *p, int sep, int doname); +static void quoted_print(FILE *fp, char *str); +static void usage(void); + +static struct permspec perm_sysctl[] = { + { "security.jail.set_hostname_allowed", KP_ALLOW_SET_HOSTNAME, 0 }, + { "security.jail.sysvipc_allowed", KP_ALLOW_SYSVIPC, 0 }, + { "security.jail.allow_raw_sockets", KP_ALLOW_RAW_SOCKETS, 0 }, + { "security.jail.chflags_allowed", KP_ALLOW_CHFLAGS, 0 }, + { "security.jail.mount_allowed", KP_ALLOW_MOUNT, 0 }, + { "security.jail.socket_unixiproute_only", KP_ALLOW_SOCKET_AF, 1 }, +}; + +static const enum intparam startcommands[] = { + IP__NULL, +#ifdef INET + IP__IP4_IFADDR, +#endif +#ifdef INET6 + IP__IP6_IFADDR, +#endif + IP_MOUNT, + IP__MOUNT_FROM_FSTAB, + IP_MOUNT_DEVFS, + IP_EXEC_PRESTART, + IP__OP, + IP_VNET_INTERFACE, + IP_EXEC_START, + IP_COMMAND, + IP_EXEC_POSTSTART, + IP__NULL +}; + +static const enum intparam stopcommands[] = { + IP__NULL, + IP_EXEC_PRESTOP, + IP_EXEC_STOP, + IP_STOP_TIMEOUT, + IP__OP, + IP_EXEC_POSTSTOP, + IP_MOUNT_DEVFS, + IP__MOUNT_FROM_FSTAB, + IP_MOUNT, +#ifdef INET6 + IP__IP6_IFADDR, +#endif +#ifdef INET + IP__IP4_IFADDR, +#endif + IP__NULL +}; int main(int argc, char **argv) { - login_cap_t *lcap = NULL; - struct passwd *pwd = NULL; - gid_t *groups; + struct stat st; + FILE *jfp; + struct cfjail *j; + char *JidFile; size_t sysvallen; - int ch, cmdarg, i, jail_set_flags, jid, ngroups, sysval; - int hflag, iflag, Jflag, lflag, rflag, uflag, Uflag; - long ngroups_max; - unsigned pi; - char *jailname, *securelevel, *username, *JidFile; + unsigned op, pi; + int ch, docf, error, i, oldcl, sysval; + int dflag, Rflag; char enforce_statfs[4]; - static char *cleanenv; - const char *shell, *p = NULL; - FILE *fp; +#if defined(INET) || defined(INET6) + char *cs, *ncs; +#endif +#if defined(INET) && defined(INET6) + struct in6_addr addr6; +#endif - hflag = iflag = Jflag = lflag = rflag = uflag = Uflag = - jail_set_flags = 0; - cmdarg = jid = -1; - jailname = securelevel = username = JidFile = cleanenv = NULL; - fp = NULL; + op = 0; + dflag = Rflag = 0; + docf = 1; + cfname = CONF_FILE; + JidFile = NULL; - ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1; - if ((groups = malloc(sizeof(gid_t) * ngroups_max)) == NULL) - err(1, "malloc"); - - while ((ch = getopt(argc, argv, "cdhilmn:r:s:u:U:J:")) != -1) { + while ((ch = getopt(argc, argv, "cdf:hiJ:lmn:p:qrRs:u:U:v")) != -1) { switch (ch) { + case 'c': + op |= JF_START; + break; case 'd': - jail_set_flags |= JAIL_DYING; + dflag = 1; + break; + case 'f': + cfname = optarg; break; case 'h': - hflag = 1; +#if defined(INET) || defined(INET6) + add_param(NULL, NULL, IP_IP_HOSTNAME, NULL); +#endif + docf = 0; break; case 'i': iflag = 1; + verbose = -1; break; case 'J': JidFile = optarg; - Jflag = 1; - break; - case 'n': - jailname = optarg; - break; - case 's': - securelevel = optarg; - break; - case 'u': - username = optarg; - uflag = 1; - break; - case 'U': - username = optarg; - Uflag = 1; break; case 'l': - lflag = 1; - break; - case 'c': - jail_set_flags |= JAIL_CREATE; + add_param(NULL, NULL, IP_EXEC_CLEAN, NULL); + docf = 0; break; case 'm': - jail_set_flags |= JAIL_UPDATE; + op |= JF_SET; + break; + case 'n': + add_param(NULL, NULL, KP_NAME, optarg); + docf = 0; + break; + case 'p': + paralimit = strtol(optarg, NULL, 10); + if (paralimit == 0) + paralimit = -1; + break; + case 'q': + verbose = -1; break; case 'r': - jid = jail_getid(optarg); - if (jid < 0) - errx(1, "%s", jail_errmsg); - rflag = 1; + op |= JF_STOP; + break; + case 'R': + op |= JF_STOP; + Rflag = 1; + break; + case 's': + add_param(NULL, NULL, KP_SECURELEVEL, optarg); + docf = 0; + break; + case 'u': + add_param(NULL, NULL, IP_EXEC_JAIL_USER, optarg); + add_param(NULL, NULL, IP_EXEC_SYSTEM_JAIL_USER, NULL); + docf = 0; + break; + case 'U': + add_param(NULL, NULL, IP_EXEC_JAIL_USER, optarg); + add_param(NULL, NULL, IP_EXEC_SYSTEM_JAIL_USER, + "false"); + docf = 0; + break; + case 'v': + verbose = 1; break; default: usage(); @@ -184,312 +219,745 @@ main(int argc, char **argv) } argc -= optind; argv += optind; - if (rflag) { - if (argc > 0 || iflag || Jflag || lflag || uflag || Uflag) - usage(); - if (jail_remove(jid) < 0) - err(1, "jail_remove"); - exit (0); - } - if (argc == 0) - usage(); - if (uflag && Uflag) - usage(); - if (lflag && username == NULL) - usage(); - if (uflag) - GET_USER_INFO; -#ifdef INET6 - ip6_ok = feature_present("inet6"); -#endif -#ifdef INET - ip4_ok = feature_present("inet"); -#endif - - if (jailname) - set_param("name", jailname); - if (securelevel) - set_param("securelevel", securelevel); - if (jail_set_flags) { - for (i = 0; i < argc; i++) { - if (!strncmp(argv[i], "command=", 8)) { - cmdarg = i; - argv[cmdarg] += 8; - jail_set_flags |= JAIL_ATTACH; - break; - } - if (hflag) { -#ifdef INET - if (!strncmp(argv[i], "ip4.addr=", 9)) { - add_ip_addr(&ip4_addr, argv[i] + 9); - break; - } -#endif -#ifdef INET6 - if (!strncmp(argv[i], "ip6.addr=", 9)) { - add_ip_addr(&ip6_addr, argv[i] + 9); - break; - } -#endif - if (!strncmp(argv[i], "host.hostname=", 14)) - add_ip_addrinfo(0, argv[i] + 14); - } - set_param(NULL, argv[i]); - } - } else { + /* Find out which of the four command line styles this is. */ + oldcl = 0; + if (!op) { + /* Old-style command line with four fixed parameters */ if (argc < 4 || argv[0][0] != '/') - errx(1, "%s\n%s", - "no -c or -m, so this must be an old-style command.", - "But it doesn't look like one."); - set_param("path", argv[0]); - set_param("host.hostname", argv[1]); - if (hflag) - add_ip_addrinfo(0, argv[1]); -#if defined(INET6) || defined(INET) - if (argv[2][0] != '\0') -#ifdef INET6 - add_ip_addr46(argv[2]); -#else - add_ip_addr(&ip4_addr, argv[2]); + usage(); + op = JF_START; + docf = 0; + oldcl = 1; + add_param(NULL, NULL, KP_PATH, argv[0]); + add_param(NULL, NULL, KP_HOST_HOSTNAME, argv[1]); +#if defined(INET) || defined(INET6) + if (argv[2][0] != '\0') { + for (cs = argv[2];; cs = ncs + 1) { + ncs = strchr(cs, ','); + if (ncs) + *ncs = '\0'; + add_param(NULL, NULL, +#if defined(INET) && defined(INET6) + inet_pton(AF_INET6, cs, &addr6) == 1 + ? KP_IP6_ADDR : KP_IP4_ADDR, +#elif defined(INET) + KP_IP4_ADDR, +#elif defined(INET6) + KP_IP6_ADDR, #endif + cs); + if (!ncs) + break; + } + } #endif - cmdarg = 3; - /* Emulate the defaults from security.jail.* sysctls */ + for (i = 3; i < argc; i++) + add_param(NULL, NULL, IP_COMMAND, argv[i]); + /* Emulate the defaults from security.jail.* sysctls. */ sysvallen = sizeof(sysval); if (sysctlbyname("security.jail.jailed", &sysval, &sysvallen, NULL, 0) == 0 && sysval == 0) { for (pi = 0; pi < sizeof(perm_sysctl) / sizeof(perm_sysctl[0]); pi++) { sysvallen = sizeof(sysval); - if (sysctlbyname(perm_sysctl[pi][0], + if (sysctlbyname(perm_sysctl[pi].name, &sysval, &sysvallen, NULL, 0) == 0) - set_param(perm_sysctl[pi] - [sysval ? 2 : 1], NULL); + add_param(NULL, NULL, + perm_sysctl[pi].ipnum, + (sysval ? 1 : 0) ^ + perm_sysctl[pi].rev + ? NULL : "false"); } sysvallen = sizeof(sysval); if (sysctlbyname("security.jail.enforce_statfs", &sysval, &sysvallen, NULL, 0) == 0) { snprintf(enforce_statfs, sizeof(enforce_statfs), "%d", sysval); - set_param("enforce_statfs", enforce_statfs); + add_param(NULL, NULL, KP_ENFORCE_STATFS, + enforce_statfs); + } + } + } else if (op == JF_STOP) { + /* Jail remove, perhaps using the config file */ + if (!docf || argc == 0) + usage(); + if (!Rflag) + for (i = 0; i < argc; i++) + if (strchr(argv[i], '=')) + usage(); + if ((docf = !Rflag && + (!strcmp(cfname, "-") || stat(cfname, &st) == 0))) + load_config(); + note_remove = docf || argc > 1 || wild_jail_name(argv[0]); + } else if (argc > 1 || (argc == 1 && strchr(argv[0], '='))) { + /* Single jail specified on the command line */ + if (Rflag) + usage(); + docf = 0; + for (i = 0; i < argc; i++) { + if (!strncmp(argv[i], "command", 7) && + (argv[i][7] == '\0' || argv[i][7] == '=')) { + if (argv[i][7] == '=') + add_param(NULL, NULL, IP_COMMAND, + argv[i] + 8); + for (i++; i < argc; i++) + add_param(NULL, NULL, IP_COMMAND, + argv[i]); + break; + } + add_param(NULL, NULL, 0, argv[i]); + } + } else { + /* From the config file, perhaps with a specified jail */ + if (Rflag || !docf) + usage(); + load_config(); + } + + /* Find out which jails will be run. */ + dep_setup(docf); + error = 0; + if (op == JF_STOP) { + for (i = 0; i < argc; i++) + if (start_state(argv[i], docf, op, Rflag) < 0) + error = 1; + } else { + if (start_state(argv[0], docf, op, 0) < 0) + exit(1); + } + + jfp = NULL; + if (JidFile != NULL) { + jfp = fopen(JidFile, "w"); + if (jfp == NULL) + err(1, "open %s", JidFile); + setlinebuf(jfp); + } + setlinebuf(stdout); + + /* + * The main loop: Get an available jail and perform the required + * operation on it. When that is done, the jail may be finished, + * or it may go back for the next step. + */ + while ((j = next_jail())) + { + if (j->flags & JF_FAILED) { + error = 1; + if (j->comparam == NULL) { + dep_done(j, 0); + continue; + } + } + if (!(j->flags & JF_PARAMS)) + { + j->flags |= JF_PARAMS; + if (dflag) + add_param(j, NULL, IP_ALLOW_DYING, NULL); + if (check_intparams(j) < 0) + continue; + if ((j->flags & (JF_START | JF_SET)) && + import_params(j) < 0) + continue; + } + if (!j->jid) + running_jid(j, + (j->flags & (JF_SET | JF_DEPEND)) == JF_SET + ? dflag || bool_param(j->intparams[IP_ALLOW_DYING]) + : 0); + if (finish_command(j)) + continue; + + switch (j->flags & JF_OP_MASK) { + /* + * These operations just turn into a different op + * depending on the jail's current status. + */ + case JF_START_SET: + j->flags = j->jid < 0 ? JF_START : JF_SET; + break; + case JF_SET_RESTART: + if (j->jid < 0) { + jail_quoted_warnx(j, "not found", + "no jail specified"); + failed(j); + continue; + } + j->flags = rdtun_params(j, 0) ? JF_RESTART : JF_SET; + if (j->flags == JF_RESTART) + dep_reset(j); + break; + case JF_START_SET_RESTART: + j->flags = j->jid < 0 ? JF_START + : rdtun_params(j, 0) ? JF_RESTART : JF_SET; + if (j->flags == JF_RESTART) + dep_reset(j); + } + + switch (j->flags & JF_OP_MASK) { + case JF_START: + if (j->comparam == NULL) { + if (j->jid > 0 && + !(j->flags & (JF_DEPEND | JF_WILD))) { + jail_quoted_warnx(j, "already exists", + NULL); + failed(j); + continue; + } + if (dep_check(j)) + continue; + if (j->jid > 0) + goto jail_create_done; + j->comparam = startcommands; + j->comstring = NULL; + } + if (next_command(j)) + continue; + jail_create_done: + clear_persist(j); + if (jfp != NULL) + print_jail(jfp, j, oldcl); + dep_done(j, 0); + break; + + case JF_SET: + if (j->jid < 0 && !(j->flags & JF_DEPEND)) { + jail_quoted_warnx(j, "not found", + "no jail specified"); + failed(j); + continue; + } + if (dep_check(j)) + continue; + if (!(j->flags & JF_DEPEND)) { + if (rdtun_params(j, 1) < 0 || + update_jail(j) < 0) + continue; + if (verbose >= 0 && (j->name || verbose > 0)) + jail_note(j, "updated\n"); + } + dep_done(j, 0); + break; + + case JF_STOP: + case JF_RESTART: + if (j->comparam == NULL) { + if (dep_check(j)) + continue; + if (j->jid < 0) { + if (!(j->flags & (JF_DEPEND | JF_WILD)) + && verbose >= 0) + jail_quoted_warnx(j, + "not found", NULL); + goto jail_remove_done; + } + j->comparam = stopcommands; + j->comstring = NULL; + } else if ((j->flags & JF_FAILED) && j->jid > 0) + goto jail_remove_done; + if (next_command(j)) + continue; + jail_remove_done: + dep_done(j, 0); + if ((j->flags & (JF_START | JF_FAILED)) == JF_START) { + j->comparam = NULL; + j->flags &= ~JF_STOP; + dep_reset(j); + requeue(j, j->ndeps ? &depend : &ready); + } + break; + } + } + + if (jfp != NULL) + fclose(jfp); + exit(error); +} + +/* + * Mark a jail's failure for future handling. + */ +void +failed(struct cfjail *j) +{ + j->flags |= JF_FAILED; + TAILQ_REMOVE(j->queue, j, tq); + TAILQ_INSERT_HEAD(&ready, j, tq); + j->queue = &ready; +} + +/* + * Exit slightly more gracefully when out of memory. + */ +void * +emalloc(size_t size) +{ + void *p; + + p = malloc(size); + if (!p) + err(1, "malloc"); + return p; +} + +void * +erealloc(void *ptr, size_t size) +{ + void *p; + + p = realloc(ptr, size); + if (!p) + err(1, "malloc"); + return p; +} + +char * +estrdup(const char *str) +{ + char *ns; + + ns = strdup(str); + if (!ns) + err(1, "malloc"); + return ns; +} + +/* + * Print a message including an optional jail name. + */ +void +jail_note(const struct cfjail *j, const char *fmt, ...) +{ + va_list ap, tap; + char *cs; + size_t len; + + va_start(ap, fmt); + va_copy(tap, ap); + len = vsnprintf(NULL, 0, fmt, tap); + va_end(tap); + cs = alloca(len + 1); + (void)vsnprintf(cs, len + 1, fmt, ap); + va_end(ap); + if (j->name) + printf("%s: %s", j->name, cs); + else + printf("%s", cs); +} + +/* + * Print a warning message including an optional jail name. + */ +void +jail_warnx(const struct cfjail *j, const char *fmt, ...) +{ + va_list ap, tap; + char *cs; + size_t len; + + va_start(ap, fmt); + va_copy(tap, ap); + len = vsnprintf(NULL, 0, fmt, tap); + va_end(tap); + cs = alloca(len + 1); + (void)vsnprintf(cs, len + 1, fmt, ap); + va_end(ap); + if (j->name) + warnx("%s: %s", j->name, cs); + else + warnx("%s", cs); +} + +/* + * Create a new jail. + */ +int +create_jail(struct cfjail *j) +{ + struct iovec jiov[4]; + struct stat st; + struct jailparam *jp, *setparams, *setparams2, *sjp; + const char *path; + int dopersist, ns, jid, dying, didfail; + + /* + * Check the jail's path, with a better error message than jail_set + * gives. + */ + if ((path = string_param(j->intparams[KP_PATH]))) { + if (j->name != NULL && path[0] != '/') { + jail_warnx(j, "path %s: not an absolute pathname", + path); + return -1; + } + if (stat(path, &st) < 0) { + jail_warnx(j, "path %s: %s", path, strerror(errno)); + return -1; + } + if (!S_ISDIR(st.st_mode)) { + jail_warnx(j, "path %s: %s", path, strerror(ENOTDIR)); + return -1; + } + } + + /* + * Copy all the parameters, except that "persist" is always set when + * there are commands to run later. + */ + dopersist = !bool_param(j->intparams[KP_PERSIST]) && + (j->intparams[IP_EXEC_START] || j->intparams[IP_COMMAND] || + j->intparams[IP_EXEC_POSTSTART]); + sjp = setparams = + alloca((j->njp + dopersist) * sizeof(struct jailparam)); + if (dopersist && jailparam_init(sjp++, "persist") < 0) { + jail_warnx(j, "%s", jail_errmsg); + return -1; + } + for (jp = j->jp; jp < j->jp + j->njp; jp++) + if (!dopersist || !equalopts(jp->jp_name, "persist")) + *sjp++ = *jp; + ns = sjp - setparams; + + didfail = 0; + j->jid = jailparam_set_note(j, setparams, ns, JAIL_CREATE); + if (j->jid < 0 && errno == EEXIST && + bool_param(j->intparams[IP_ALLOW_DYING]) && + int_param(j->intparams[KP_JID], &jid) && jid != 0) { + /* + * The jail already exists, but may be dying. + * Make sure it is, in which case an update is appropriate. + */ + *(const void **)&jiov[0].iov_base = "jid"; + jiov[0].iov_len = sizeof("jid"); + jiov[1].iov_base = &jid; + jiov[1].iov_len = sizeof(jid); + *(const void **)&jiov[2].iov_base = "dying"; + jiov[2].iov_len = sizeof("dying"); + jiov[3].iov_base = &dying; + jiov[3].iov_len = sizeof(dying); + if (jail_get(jiov, 4, JAIL_DYING) < 0) { + /* + * It could be that the jail just barely finished + * dying, or it could be that the jid never existed + * but the name does. In either case, another try + * at creating the jail should do the right thing. + */ + if (errno == ENOENT) + j->jid = jailparam_set_note(j, setparams, ns, + JAIL_CREATE); + } else if (dying) { + j->jid = jid; + if (rdtun_params(j, 1) < 0) { + j->jid = -1; + didfail = 1; + } else { + sjp = setparams2 = alloca((j->njp + dopersist) * + sizeof(struct jailparam)); + for (jp = setparams; jp < setparams + ns; jp++) + if (!JP_RDTUN(jp) || + !strcmp(jp->jp_name, "jid")) + *sjp++ = *jp; + j->jid = jailparam_set_note(j, setparams2, + sjp - setparams2, JAIL_UPDATE | JAIL_DYING); + /* + * Again, perhaps the jail just finished dying. + */ + if (j->jid < 0 && errno == ENOENT) + j->jid = jailparam_set_note(j, + setparams, ns, JAIL_CREATE); } } } -#ifdef INET - if (ip4_addr != NULL) - set_param("ip4.addr", ip4_addr); -#endif -#ifdef INET6 - if (ip6_addr != NULL) - set_param("ip6.addr", ip6_addr); -#endif + if (j->jid < 0 && !didfail) { + jail_warnx(j, "%s", jail_errmsg); + failed(j); + } + if (dopersist) { + jailparam_free(setparams, 1); + if (j->jid > 0) + j->flags |= JF_PERSIST; + } + return j->jid; +} - if (Jflag) { - fp = fopen(JidFile, "w"); - if (fp == NULL) - errx(1, "Could not create JidFile: %s", JidFile); +/* + * Remove a temporarily set "persist" parameter. + */ +static void +clear_persist(struct cfjail *j) +{ + struct iovec jiov[4]; + int jid; + + if (!(j->flags & JF_PERSIST)) + return; + j->flags &= ~JF_PERSIST; + *(const void **)&jiov[0].iov_base = "jid"; + jiov[0].iov_len = sizeof("jid"); + jiov[1].iov_base = &j->jid; + jiov[1].iov_len = sizeof(j->jid); + *(const void **)&jiov[2].iov_base = "nopersist"; + jiov[2].iov_len = sizeof("nopersist"); + jiov[3].iov_base = NULL; + jiov[3].iov_len = 0; + jid = jail_set(jiov, 4, JAIL_UPDATE); + if (verbose > 0) + jail_note(j, "jail_set(JAIL_UPDATE) jid=%d nopersist%s%s\n", + j->jid, jid < 0 ? ": " : "", + jid < 0 ? strerror(errno) : ""); +} + +/* + * Set a jail's parameters. + */ +static int +update_jail(struct cfjail *j) +{ + struct jailparam *jp, *setparams, *sjp; + int ns, jid; + + ns = 0; + for (jp = j->jp; jp < j->jp + j->njp; jp++) + if (!JP_RDTUN(jp)) + ns++; + if (ns == 0) + return 0; + sjp = setparams = alloca(++ns * sizeof(struct jailparam)); + if (jailparam_init(sjp, "jid") < 0 || + jailparam_import_raw(sjp, &j->jid, sizeof j->jid) < 0) { + jail_warnx(j, "%s", jail_errmsg); + failed(j); + return -1; } - jid = jailparam_set(params, nparams, - jail_set_flags ? jail_set_flags : JAIL_CREATE | JAIL_ATTACH); - if (jid < 0) - errx(1, "%s", jail_errmsg); - if (iflag) { - printf("%d\n", jid); - fflush(stdout); + for (jp = j->jp; jp < j->jp + j->njp; jp++) + if (!JP_RDTUN(jp)) + *++sjp = *jp; + + jid = jailparam_set_note(j, setparams, ns, + bool_param(j->intparams[IP_ALLOW_DYING]) + ? JAIL_UPDATE | JAIL_DYING : JAIL_UPDATE); + if (jid < 0) { + jail_warnx(j, "%s", jail_errmsg); + failed(j); } - if (Jflag) { - if (jail_set_flags) { - fprintf(fp, "jid=%d", jid); - for (i = 0; i < nparams; i++) - if (strcmp(params[i].jp_name, "jid")) { - fprintf(fp, " %s", - (char *)params[i].jp_name); - if (param_values[i]) { - putc('=', fp); - quoted_print(fp, - param_values[i]); - } - } - fprintf(fp, "\n"); - } else { - for (i = 0; i < nparams; i++) - if (!strcmp(params[i].jp_name, "path")) + jailparam_free(setparams, 1); + return jid; +} + +/* + * Return if a jail set would change any create-only parameters. + */ +static int +rdtun_params(struct cfjail *j, int dofail) +{ + struct jailparam *jp, *rtparams, *rtjp; + int nrt, rval; + + if (j->flags & JF_RDTUN) + return 0; + j->flags |= JF_RDTUN; + nrt = 0; + for (jp = j->jp; jp < j->jp + j->njp; jp++) + if (JP_RDTUN(jp) && strcmp(jp->jp_name, "jid")) + nrt++; + if (nrt == 0) + return 0; + rtjp = rtparams = alloca(++nrt * sizeof(struct jailparam)); + if (jailparam_init(rtjp, "jid") < 0 || + jailparam_import_raw(rtjp, &j->jid, sizeof j->jid) < 0) { + jail_warnx(j, "%s", jail_errmsg); + exit(1); + } + for (jp = j->jp; jp < j->jp + j->njp; jp++) + if (JP_RDTUN(jp) && strcmp(jp->jp_name, "jid")) + *++rtjp = *jp; + rval = 0; + if (jailparam_get(rtparams, nrt, + bool_param(j->intparams[IP_ALLOW_DYING]) ? JAIL_DYING : 0) > 0) { + rtjp = rtparams + 1; + for (jp = j->jp, rtjp = rtparams + 1; rtjp < rtparams + nrt; + jp++) { + if (JP_RDTUN(jp) && strcmp(jp->jp_name, "jid")) { + if (!((jp->jp_flags & (JP_BOOL | JP_NOBOOL)) && + jp->jp_valuelen == 0 && + *(int *)jp->jp_value) && + !(rtjp->jp_valuelen == jp->jp_valuelen && + !memcmp(rtjp->jp_value, jp->jp_value, + jp->jp_valuelen))) { + if (dofail) { + jail_warnx(j, "%s cannot be " + "changed after creation", + jp->jp_name); + failed(j); + rval = -1; + } else + rval = 1; break; -#if defined(INET6) && defined(INET) - fprintf(fp, "%d\t%s\t%s\t%s%s%s\t%s\n", - jid, i < nparams - ? (char *)params[i].jp_value : argv[0], - argv[1], ip4_addr ? ip4_addr : "", - ip4_addr && ip4_addr[0] && ip6_addr && ip6_addr[0] - ? "," : "", ip6_addr ? ip6_addr : "", argv[3]); -#elif defined(INET6) - fprintf(fp, "%d\t%s\t%s\t%s\t%s\n", - jid, i < nparams - ? (char *)params[i].jp_value : argv[0], - argv[1], ip6_addr ? ip6_addr : "", argv[3]); -#elif defined(INET) - fprintf(fp, "%d\t%s\t%s\t%s\t%s\n", - jid, i < nparams - ? (char *)params[i].jp_value : argv[0], - argv[1], ip4_addr ? ip4_addr : "", argv[3]); -#endif + } + rtjp++; + } } - (void)fclose(fp); } - if (cmdarg < 0) - exit(0); - if (username != NULL) { - if (Uflag) - GET_USER_INFO; - if (lflag) { - p = getenv("TERM"); - environ = &cleanenv; + for (rtjp = rtparams + 1; rtjp < rtparams + nrt; rtjp++) + rtjp->jp_name = NULL; + jailparam_free(rtparams, nrt); + return rval; +} + +/* + * Get the jail's jid if it is running. + */ +static void +running_jid(struct cfjail *j, int dflag) +{ + struct iovec jiov[2]; + const char *pval; + char *ep; + int jid; + + if ((pval = string_param(j->intparams[KP_JID]))) { + if (!(jid = strtol(pval, &ep, 10)) || *ep) { + j->jid = -1; + return; } - if (setgroups(ngroups, groups) != 0) - err(1, "setgroups"); - if (setgid(pwd->pw_gid) != 0) - err(1, "setgid"); - if (setusercontext(lcap, pwd, pwd->pw_uid, - LOGIN_SETALL & ~LOGIN_SETGROUP & ~LOGIN_SETLOGIN) != 0) - err(1, "setusercontext"); - login_close(lcap); + *(const void **)&jiov[0].iov_base = "jid"; + jiov[0].iov_len = sizeof("jid"); + jiov[1].iov_base = &jid; + jiov[1].iov_len = sizeof(jid); + } else if ((pval = string_param(j->intparams[KP_NAME]))) { + *(const void **)&jiov[0].iov_base = "name"; + jiov[0].iov_len = sizeof("name"); + jiov[1].iov_len = strlen(pval) + 1; + jiov[1].iov_base = alloca(jiov[1].iov_len); + strcpy(jiov[1].iov_base, pval); + } else { + j->jid = -1; + return; } - if (lflag) { - if (*pwd->pw_shell) - shell = pwd->pw_shell; - else - shell = _PATH_BSHELL; - if (chdir(pwd->pw_dir) < 0) - errx(1, "no home directory"); - setenv("HOME", pwd->pw_dir, 1); - setenv("SHELL", shell, 1); - setenv("USER", pwd->pw_name, 1); - if (p) - setenv("TERM", p, 1); - } - execvp(argv[cmdarg], argv + cmdarg); - err(1, "execvp: %s", argv[cmdarg]); + j->jid = jail_get(jiov, 2, dflag ? JAIL_DYING : 0); } -#if defined(INET6) || defined(INET) static void -add_ip_addr(char **addrp, char *value) +jail_quoted_warnx(const struct cfjail *j, const char *name_msg, + const char *noname_msg) { - int addrlen; - char *addr; + const char *pval; - if (!*addrp) { - *addrp = strdup(value); - if (!*addrp) - err(1, "malloc"); - } else if (value[0]) { - addrlen = strlen(*addrp) + strlen(value) + 2; - addr = malloc(addrlen); - if (!addr) - err(1, "malloc"); - snprintf(addr, addrlen, "%s,%s", *addrp, value); - free(*addrp); - *addrp = addr; - } + if ((pval = j->name) || (pval = string_param(j->intparams[KP_JID])) || + (pval = string_param(j->intparams[KP_NAME]))) + warnx("\"%s\" %s", pval, name_msg); + else + warnx("%s", noname_msg); } -#endif -#ifdef INET6 -static void -add_ip_addr46(char *value) +/* + * Set jail parameters and possible print them out. + */ +static int +jailparam_set_note(const struct cfjail *j, struct jailparam *jp, unsigned njp, + int flags) { - char *p, *np; + char *value; + int jid; + unsigned i; - for (p = value;; p = np + 1) - { - np = strchr(p, ','); - if (np) - *np = '\0'; - add_ip_addrinfo(AI_NUMERICHOST, p); - if (!np) - break; + jid = jailparam_set(jp, njp, flags); + if (verbose > 0) { + jail_note(j, "jail_set(%s%s)", + (flags & (JAIL_CREATE | JAIL_UPDATE)) == JAIL_CREATE + ? "JAIL_CREATE" : "JAIL_UPDATE", + (flags & JAIL_DYING) ? " | JAIL_DYING" : ""); + for (i = 0; i < njp; i++) { + printf(" %s", jp[i].jp_name); + if (jp[i].jp_value == NULL) + continue; + putchar('='); + value = jailparam_export(jp + i); + if (value == NULL) + err(1, "jailparam_export"); + quoted_print(stdout, value); + free(value); + } + if (jid < 0) + printf(": %s", strerror(errno)); + printf("\n"); } + return jid; } -#endif +/* + * Print a jail record. + */ static void -add_ip_addrinfo(int ai_flags, char *value) +print_jail(FILE *fp, struct cfjail *j, int oldcl) { - struct addrinfo hints, *ai0, *ai; - int error; + struct cfparam *p; + + if (oldcl) { + fprintf(fp, "%d\t", j->jid); + print_param(fp, j->intparams[KP_PATH], ',', 0); + putc('\t', fp); + print_param(fp, j->intparams[KP_HOST_HOSTNAME], ',', 0); + putc('\t', fp); #ifdef INET - char avalue4[INET_ADDRSTRLEN]; - struct in_addr addr4; + print_param(fp, j->intparams[KP_IP4_ADDR], ',', 0); +#ifdef INET6 + if (j->intparams[KP_IP4_ADDR] && + !TAILQ_EMPTY(&j->intparams[KP_IP4_ADDR]->val) && + j->intparams[KP_IP6_ADDR] && + !TAILQ_EMPTY(&j->intparams[KP_IP6_ADDR]->val)) + putc(',', fp); +#endif #endif #ifdef INET6 - char avalue6[INET6_ADDRSTRLEN]; - struct in6_addr addr6; + print_param(fp, j->intparams[KP_IP6_ADDR], ',', 0); #endif - - /* Look up the hostname (or get the address) */ - memset(&hints, 0, sizeof(hints)); - hints.ai_socktype = SOCK_STREAM; -#if defined(INET6) && defined(INET) - hints.ai_family = PF_UNSPEC; -#elif defined(INET6) - hints.ai_family = PF_INET6; -#elif defined(INET) - hints.ai_family = PF_INET; -#endif - hints.ai_flags = ai_flags; - error = getaddrinfo(value, NULL, &hints, &ai0); - if (error != 0) - errx(1, "hostname %s: %s", value, gai_strerror(error)); - - /* Convert the addresses to ASCII so set_param can convert them back. */ - for (ai = ai0; ai; ai = ai->ai_next) - switch (ai->ai_family) { -#ifdef INET - case AF_INET: - if (!ip4_ok && (ai_flags & AI_NUMERICHOST) == 0) - break; - memcpy(&addr4, &((struct sockaddr_in *) - (void *)ai->ai_addr)->sin_addr, sizeof(addr4)); - if (inet_ntop(AF_INET, &addr4, avalue4, - INET_ADDRSTRLEN) == NULL) - err(1, "inet_ntop"); - add_ip_addr(&ip4_addr, avalue4); - break; -#endif -#ifdef INET6 - case AF_INET6: - if (!ip6_ok && (ai_flags & AI_NUMERICHOST) == 0) - break; - memcpy(&addr6, &((struct sockaddr_in6 *) - (void *)ai->ai_addr)->sin6_addr, sizeof(addr6)); - if (inet_ntop(AF_INET6, &addr6, avalue6, - INET6_ADDRSTRLEN) == NULL) - err(1, "inet_ntop"); - add_ip_addr(&ip6_addr, avalue6); - break; -#endif - } - freeaddrinfo(ai0); + putc('\t', fp); + print_param(fp, j->intparams[IP_COMMAND], ' ', 0); + } else { + fprintf(fp, "jid=%d", j->jid); + TAILQ_FOREACH(p, &j->params, tq) + if (strcmp(p->name, "jid")) { + putc(' ', fp); + print_param(fp, p, ',', 1); + } + } + putc('\n', fp); } +/* + * Print a parameter value, or a name=value pair. + */ +static void +print_param(FILE *fp, const struct cfparam *p, int sep, int doname) +{ + const struct cfstring *s, *ts; + + if (doname) + fputs(p->name, fp); + if (p == NULL || TAILQ_EMPTY(&p->val)) + return; + if (doname) + putc('=', fp); + TAILQ_FOREACH_SAFE(s, &p->val, tq, ts) { + quoted_print(fp, s->s); + if (ts != NULL) + putc(sep, fp); + } +} + +/* + * Print a string with quotes around spaces. + */ static void quoted_print(FILE *fp, char *str) { int c, qc; char *p = str; - /* An empty string needs quoting. */ - if (!*p) { - fputs("\"\"", fp); - return; - } - - /* - * The value will be surrounded by quotes if it contains spaces - * or quotes. - */ - qc = strchr(p, '\'') ? '"' + qc = !*p ? '"' + : strchr(p, '\'') ? '"' : strchr(p, '"') ? '\'' : strchr(p, ' ') || strchr(p, '\t') ? '"' : 0; @@ -504,72 +972,17 @@ quoted_print(FILE *fp, char *str) putc(qc, fp); } -static void -set_param(const char *name, char *value) -{ - struct jailparam *param; - char path[PATH_MAX]; - int i; - - static int paramlistsize; - - /* Separate the name from the value, if not done already. */ - if (name == NULL) { - name = value; - if ((value = strchr(value, '='))) - *value++ = '\0'; - } - - /* jail_set won't chdir along with its chroot, so do it here. */ - if (!strcmp(name, "path")) { - /* resolve the path with realpath(3) */ - if (realpath(value, path) != NULL) - value = path; - if (chdir(value) < 0) - err(1, "chdir: %s", value); - } - - /* Check for repeat parameters */ - for (i = 0; i < nparams; i++) - if (!strcmp(name, params[i].jp_name)) { - jailparam_free(params + i, 1); - memcpy(params + i, params + i + 1, - (--nparams - i) * sizeof(struct jailparam)); - break; - } - - /* Make sure there is room for the new param record. */ - if (!nparams) { - paramlistsize = 32; - params = malloc(paramlistsize * sizeof(*params)); - param_values = malloc(paramlistsize * sizeof(*param_values)); - if (params == NULL || param_values == NULL) - err(1, "malloc"); - } else if (nparams >= paramlistsize) { - paramlistsize *= 2; - params = realloc(params, paramlistsize * sizeof(*params)); - param_values = realloc(param_values, - paramlistsize * sizeof(*param_values)); - if (params == NULL) - err(1, "realloc"); - } - - /* Look up the paramter. */ - param_values[nparams] = value; - param = params + nparams++; - if (jailparam_init(param, name) < 0 || - jailparam_import(param, value) < 0) - errx(1, "%s", jail_errmsg); -} - static void usage(void) { (void)fprintf(stderr, - "usage: jail [-d] [-h] [-i] [-J jid_file] " - "[-l -u username | -U username]\n" - " [-c | -m] param=value ... [command=command ...]\n" - " jail [-r jail]\n"); + "usage: jail [-dhilqv] [-J jid_file] [-u username] [-U username]\n" + " -[cmr] param=value ... [command=command ...]\n" + " jail [-dqv] [-f file] -[cmr] [jail]\n" + " jail [-qv] [-f file] -[rR] ['*' | jail ...]\n" + " jail [-dhilqv] [-J jid_file] [-u username] [-U username]\n" + " [-n jailname] [-s securelevel]\n" + " path hostname [ip[,...]] command ...\n"); exit(1); } diff --git a/usr.sbin/jail/jail.conf.5 b/usr.sbin/jail/jail.conf.5 new file mode 100644 index 00000000000..2e4882915ca --- /dev/null +++ b/usr.sbin/jail/jail.conf.5 @@ -0,0 +1,231 @@ +.\" Copyright (c) 2012 James Gritton +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd May 23, 2012 +.Dt JAIL.CONF 5 +.Os +.Sh NAME +.Nm jail.conf +.Nd configuration file for +.Xr jail 8 +.Sh DESCRIPTION +A +.Xr jail 8 +configuration file consists of one or more jail definitions statements, +and parameter or variable statements within those jail definitions. +A jail definition statement looks something like a C compound statement. +A parameter statement looks like a C assignment, +including a terminating semicolon. +.Pp +The general syntax of a jail definition is: +.Bd -literal -offset indent +jailname { + parameter = "value"; + parameter = "value"; + ... +} +.Ed +.Pp +Each jail is required to have a +.Va name +at the front of its definition. +This is used by +.Xr jail 8 +to specify a jail on the command line and report the jail status, +and is also passed to the kernel when creating the jail. +.Ss Parameters +A jail is defined by a set of named parameters, specified inside the +jail definition. +See +.Xr jail 8 +for a list of jail parameters passed to the kernel, +as well as internal parameters used when creating and removing jails. +.Pp +A typical parameter has a name and a value. +Some parameters are boolean and may be specified with values of +.Dq true +or +.Dq false , +or as valueless shortcuts, with a +.Dq no +prefix indicating a false value. +For example, these are equivalent: +.Bd -literal -offset indent +allow.mount = "false"; +allow.nomount; +.Ed +.Pp +Other parameters may have more than one value. +A comma-separated list of values may be set in a single statement, +or an existing parameter list may be appended to using +.Dq += : +.Bd -literal -offset indent +ip4.addr = 10.1.1.1, 10.1.1.2, 10.1.1.3; + +ip4.addr = 10.1.1.1; +ip4.addr += 10.1.1.2; +ip4.addr += 10.1.1.3; +.Ed +.Pp +Note the +.Va name +parameter is implicitly set to the name in the jail definition. +.Ss String format +Parameter values, including jail names, can be single tokens or quoted +strings. +A token is any sequence of characters that aren't considered special in +the syntax of the configuration file (such as a semicolon or +whitespace). +If a value contains anything more than letters, numbers, dots, dashes +and underscores, it is advisable to put quote marks around that value. +Either single or double quotes may be used. +.Pp +Special characters may be quoted by preceding them with a backslash. +Common C-style backslash character codes are also supported, including +control characters and octal or hex ASCII codes. +A backslash at the end of a line will ignore the subsequent newline and +continue the string at the start of the next line. +.Ss Variables +A string may use shell-style variable substitution. +A parameter or variable name preceded by a dollar sign, and possibly +enclosed in braces, will be replaced with the value of that parameter or +variable. +For example, a jail's path may be defined in terms of its name or +hostname: +.Bd -literal -offset indent +path = "/var/jail/$name"; + +path = "/var/jail/${host.hostname}"; +.Ed +.Pp +Variable substitution occurs in unquoted tokens or in double-quoted +strings, but not in single-quote strings. +.Pp +A variable is defined in the same way a parameter is, except that the +variable name is preceded with a dollar sign: +.Bd -literal -offset indent +$parentdir = "/var/jail"; +path = "$parentdir/$name"; +.Ed +.Pp +The difference between parameters and variables is that variables are +only used for substitution, while parameters are used both for +substitution and for passing to the kernel. +.Ss Wildcards +A jail definition with a name of +.Dq * +is used to define wildcard parameters. +Every defined jail will contain both the parameters from its own +definition statement, as well as any parameters in a wildcard +definition. +.Pp +Variable substitution is done on a per-jail basis, even when that +substitution is for a parameter defined in a wildcard section. +This is useful for wildcard parameters based on e.g. a jail's name. +.Pp +Later definitions in the configuration file supersede earlier ones, so a +wildcard section placed before (above) a jail definition defines +parameters that could be changed on a per-jail basis. +Or a wildcard section placed after (below) all jails would contain +parameters that always apply to every jail. +Multiple wildcard statements are allowed, and wildcard parameters may +also be specified outside of a jail definition statement. +.Pp +If hierarchical jails are defined, a partial-matching wildcard +definition may be specified. +For example, a definition with a name of +.Dq foo.* +would apply to jails with names like +.Dq foo.bar +and +.Dq foo.bar.baz . +.Ss Comments +The configuration file may contain comments in the common C, C++, and +shell formats: +.Bd -literal -offset indent +/* This is a C style comment. + * It may span multiple lines. + */ + +// This is a C++ style comment. + +# This is a shell style comment. +.Ed +.Pp +Comments are legal wherever whitespace is allowed, i.e. anywhere except +in the middle of a string or a token. +.Sh EXAMPLES +.Bd -literal +# Typical static defaults: +# Use the rc scripts to start and stop jails. Mount jail's /dev. +exec.start = "/bin/sh /etc/rc"; +exec.stop = "/bin/sh /etc/rc.shutdown"; +exec.clean; +mount.devfs; + +# Dynamic wildcard parameter: +# Base the path off the jail name. +path = "/var/jail/$name"; + +# A typical jail. +foo { + host.hostname = "foo.com"; + ip4.addr = 10.1.1.1, 10.1.1.2, 10.1.1.3; +} + +# This jail overrides the defaults defined above. +bar { + exec.start = ''; + exec.stop = ''; + path = /; + mount.nodevfs; + persist; // Required because there are no processes +} +.Ed +.Sh SEE ALSO +.Xr jail_set 2 +.Xr jail 8 +.Xr jls 8 +.Sh HISTORY +The +.Xr jail 8 +utility appeared in +.Fx 4.0 . +The +.Nm +file was added in +.Fx 9.1 . +.Sh AUTHORS +.An -nosplit +The jail feature was written by +.An Poul-Henning Kamp +for R&D Associates +.Pa http://www.rndassociates.com/ +who contributed it to +.Fx . +.Pp +.An James Gritton +added the extensible jail parameters and configuration file. diff --git a/usr.sbin/jail/jaillex.l b/usr.sbin/jail/jaillex.l new file mode 100644 index 00000000000..0a2fcd72a52 --- /dev/null +++ b/usr.sbin/jail/jaillex.l @@ -0,0 +1,233 @@ +%{ +/*- + * Copyright (c) 2011 James Gritton + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include "jailp.h" +#include "y.tab.h" + +#define YY_NO_INPUT +#define YY_NO_UNPUT + +extern int yynerrs; + +static ssize_t text2lval(size_t triml, size_t trimr, int tovar); + +static int instr; +static int lineno = 1; +%} + +%start _ DQ + +%% + + /* Whitespace or equivalent */ +<_>[ \t]+ instr = 0; +<_>#.* ; +<_>\/\/.* ; +<_>\/\*([^*]|(\*+([^*\/])))*\*+\/ { + const char *s; + + for (s = yytext; s < yytext + yyleng; s++) + if (*s == '\n') + lineno++; + instr = 0; + } +<_>\n { + lineno++; + instr = 0; + } + + /* Reserved tokens */ +<_>\+= { + instr = 0; + return PLEQ; + } +<_>[,;={}] { + instr = 0; + return yytext[0]; + } + + /* Atomic (unquoted) strings */ +<_,DQ>[A-Za-z0-9_!%&()\-.:<>?@\[\]^`|~]+ | +<_,DQ>\\(.|\n|[0-7]{1,3}|x[0-9A-Fa-f]{1,2}) | +<_,DQ>[$*+/\\] { + (void)text2lval(0, 0, 0); + return instr ? STR1 : (instr = 1, STR); + } + + /* Single and double quoted strings */ +<_>'([^\'\\]|\\(.|\n))*' { + (void)text2lval(1, 1, 0); + return instr ? STR1 : (instr = 1, STR); + } +<_>\"([^"\\]|\\(.|\n))*\" | +[^\"$\\]([^"\\]|\\(.|\n))*\" { + size_t skip; + ssize_t atvar; + + skip = yytext[0] == '"' ? 1 : 0; + atvar = text2lval(skip, 1, 1); + if (atvar < 0) + BEGIN _; + else { + /* + * The string has a variable inside it. + * Go into DQ mode to get the variable + * and then the rest of the string. + */ + BEGIN DQ; + yyless(atvar); + } + return instr ? STR1 : (instr = 1, STR); + } +\" BEGIN _; + + /* Variables, single-word or bracketed */ +<_,DQ>$[A-Za-z_][A-Za-z_0-9]* { + (void)text2lval(1, 0, 0); + return instr ? VAR1 : (instr = 1, VAR); + } +<_>$\{([^\n{}]|\\(.|\n))*\} | +$\{([^\n\"{}]|\\(.|\n))*\} { + (void)text2lval(2, 1, 0); + return instr ? VAR1 : (instr = 1, VAR); + } + + /* Partially formed bits worth complaining about */ +<_>\/\*([^*]|(\*+([^*\/])))*\** { + warnx("%s line %d: unterminated comment", + cfname, lineno); + yynerrs++; + } +<_>'([^\n'\\]|\\.)* | +<_>\"([^\n\"\\]|\\.)* { + warnx("%s line %d: unterminated string", + cfname, lineno); + yynerrs++; + } +<_>$\{([^\n{}]|\\.)* | +$\{([^\n\"{}]|\\.)* { + warnx("%s line %d: unterminated variable", + cfname, lineno); + yynerrs++; + } + + /* A hack because "<0>" rules aren't allowed */ +<_>. return yytext[0]; +.|\n { + BEGIN _; + yyless(0); + } + +%% + +void +yyerror(const char *s) +{ + if (!yytext) + warnx("%s line %d: %s", cfname, lineno, s); + else if (!yytext[0]) + warnx("%s: unexpected EOF", cfname); + else + warnx("%s line %d: %s: %s", cfname, lineno, yytext, s); +} + +/* + * Copy string from yytext to yylval, handling backslash escapes, + * and optionally stopping at the beginning of a variable. + */ +static ssize_t +text2lval(size_t triml, size_t trimr, int tovar) +{ + char *d; + const char *s, *se; + + yylval.cs = d = emalloc(yyleng - trimr - triml + 1); + se = yytext + (yyleng - trimr); + for (s = yytext + triml; s < se; s++, d++) { + if (*s != '\\') { + if (tovar && *s == '$') { + *d = '\0'; + return s - yytext; + } + if (*s == '\n') + lineno++; + *d = *s; + continue; + } + s++; + if (*s >= '0' && *s <= '7') { + *d = *s - '0'; + if (s + 1 < se && s[1] >= '0' && s[1] <= '7') { + *d = 010 * *d + (*++s - '0'); + if (s + 1 < se && s[1] >= '0' && s[1] <= '7') + *d = 010 * *d + (*++s - '0'); + } + continue; + } + switch (*s) { + case 'a': *d = '\a'; break; + case 'b': *d = '\b'; break; + case 'f': *d = '\f'; break; + case 'n': *d = '\n'; break; + case 'r': *d = '\r'; break; + case 't': *d = '\t'; break; + case 'v': *d = '\v'; break; + case '\n': d--; lineno++; break; + default: *d = *s; break; + case 'x': + *d = 0; + if (s + 1 >= se) + break; + if (s[1] >= '0' && s[1] <= '9') + *d = *++s - '0'; + else if (s[1] >= 'A' && s[1] <= 'F') + *d = *++s + (0xA - 'A'); + else if (s[1] >= 'a' && s[1] <= 'a') + *d = *++s + (0xa - 'a'); + else + break; + if (s + 1 >= se) + break; + if (s[1] >= '0' && s[1] <= '9') + *d = *d * 0x10 + (*++s - '0'); + else if (s[1] >= 'A' && s[1] <= 'F') + *d = *d * 0x10 + (*++s + (0xA - 'A')); + else if (s[1] >= 'a' && s[1] <= 'a') + *d = *d * 0x10 + (*++s + (0xa - 'a')); + } + } + *d = '\0'; + return -1; +} diff --git a/usr.sbin/jail/jailp.h b/usr.sbin/jail/jailp.h new file mode 100644 index 00000000000..ffd35cc8189 --- /dev/null +++ b/usr.sbin/jail/jailp.h @@ -0,0 +1,233 @@ +/*- + * Copyright (c) 2011 James Gritton. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include + +#include + +#define CONF_FILE "/etc/jail.conf" + +#define DEP_FROM 0 +#define DEP_TO 1 + +#define DF_SEEN 0x01 /* Dependency has been followed */ +#define DF_LIGHT 0x02 /* Implied dependency on jail existence only */ +#define DF_NOFAIL 0x04 /* Don't propigate failed jails */ + +#define PF_VAR 0x01 /* This is a variable, not a true parameter */ +#define PF_APPEND 0x02 /* Append to existing parameter list */ +#define PF_BAD 0x04 /* Unable to resolve parameter value */ +#define PF_INTERNAL 0x08 /* Internal parameter, not passed to kernel */ +#define PF_BOOL 0x10 /* Boolean parameter */ +#define PF_INT 0x20 /* Integer parameter */ +#define PF_CONV 0x40 /* Parameter duplicated in converted form */ + +#define JF_START 0x0001 /* -c */ +#define JF_SET 0x0002 /* -m */ +#define JF_STOP 0x0004 /* -r */ +#define JF_DEPEND 0x0008 /* Operation required by dependency */ +#define JF_WILD 0x0010 /* Not specified on the command line */ +#define JF_FAILED 0x0020 /* Operation failed */ +#define JF_PARAMS 0x0040 /* Parameters checked and imported */ +#define JF_RDTUN 0x0080 /* Create-only parameter check has been done */ +#define JF_PERSIST 0x0100 /* Jail is temporarily persistent */ +#define JF_TIMEOUT 0x0200 /* A command (or process kill) timed out */ +#define JF_SLEEPQ 0x0400 /* Waiting on a command and/or timeout */ + +#define JF_OP_MASK (JF_START | JF_SET | JF_STOP) +#define JF_RESTART (JF_START | JF_STOP) +#define JF_START_SET (JF_START | JF_SET) +#define JF_SET_RESTART (JF_SET | JF_STOP) +#define JF_START_SET_RESTART (JF_START | JF_SET | JF_STOP) +#define JF_DO_STOP(js) (((js) & (JF_SET | JF_STOP)) == JF_STOP) + +enum intparam { + IP__NULL = 0, /* Null command */ + IP_ALLOW_DYING, /* Allow making changes to a dying jail */ + IP_COMMAND, /* Command run inside jail at creation */ + IP_DEPEND, /* Jail starts after (stops before) another */ + IP_EXEC_CLEAN, /* Run commands in a clean environment */ + IP_EXEC_CONSOLELOG, /* Redirect optput for commands run in jail */ + IP_EXEC_FIB, /* Run jailed commands with this FIB */ + IP_EXEC_JAIL_USER, /* Run jailed commands as this user */ + IP_EXEC_POSTSTART, /* Commands run outside jail after creating */ + IP_EXEC_POSTSTOP, /* Commands run outside jail after removing */ + IP_EXEC_PRESTART, /* Commands run outside jail before creating */ + IP_EXEC_PRESTOP, /* Commands run outside jail before removing */ + IP_EXEC_START, /* Commands run inside jail on creation */ + IP_EXEC_STOP, /* Commands run inside jail on removal */ + IP_EXEC_SYSTEM_JAIL_USER,/* Get jail_user from system passwd file */ + IP_EXEC_SYSTEM_USER, /* Run non-jailed commands as this user */ + IP_EXEC_TIMEOUT, /* Time to wait for a command to complete */ +#if defined(INET) || defined(INET6) + IP_INTERFACE, /* Add IP addresses to this interface */ + IP_IP_HOSTNAME, /* Get jail IP address(es) from hostname */ +#endif + IP_MOUNT, /* Mount points in fstab(5) form */ + IP_MOUNT_DEVFS, /* Mount /dev under prison root */ + IP_MOUNT_FSTAB, /* A standard fstab(5) file */ + IP_STOP_TIMEOUT, /* Time to wait after sending SIGTERM */ + IP_VNET_INTERFACE, /* Assign interface(s) to vnet jail */ +#ifdef INET + IP__IP4_IFADDR, /* Copy of ip4.addr with interface/netmask */ +#endif +#ifdef INET6 + IP__IP6_IFADDR, /* Copy of ip6.addr with interface/prefixlen */ +#endif + IP__MOUNT_FROM_FSTAB, /* Line from mount.fstab file */ + IP__OP, /* Placeholder for requested operation */ + KP_ALLOW_CHFLAGS, + KP_ALLOW_MOUNT, + KP_ALLOW_RAW_SOCKETS, + KP_ALLOW_SET_HOSTNAME, + KP_ALLOW_SOCKET_AF, + KP_ALLOW_SYSVIPC, + KP_DEVFS_RULESET, + KP_ENFORCE_STATFS, + KP_HOST_HOSTNAME, +#ifdef INET + KP_IP4_ADDR, +#endif +#ifdef INET6 + KP_IP6_ADDR, +#endif + KP_JID, + KP_NAME, + KP_PATH, + KP_PERSIST, + KP_SECURELEVEL, + KP_VNET, + IP_NPARAM +}; + +STAILQ_HEAD(cfvars, cfvar); + +struct cfvar { + STAILQ_ENTRY(cfvar) tq; + char *name; + size_t pos; +}; + +TAILQ_HEAD(cfstrings, cfstring); + +struct cfstring { + TAILQ_ENTRY(cfstring) tq; + char *s; + size_t len; + struct cfvars vars; +}; + +TAILQ_HEAD(cfparams, cfparam); + +struct cfparam { + TAILQ_ENTRY(cfparam) tq; + char *name; + struct cfstrings val; + unsigned flags; + int gen; +}; + +TAILQ_HEAD(cfjails, cfjail); +STAILQ_HEAD(cfdepends, cfdepend); + +struct cfjail { + TAILQ_ENTRY(cfjail) tq; + char *name; + char *comline; + struct cfparams params; + struct cfdepends dep[2]; + struct cfjails *queue; + struct cfparam *intparams[IP_NPARAM]; + struct cfstring *comstring; + struct jailparam *jp; + struct timespec timeout; + const enum intparam *comparam; + unsigned flags; + int jid; + int seq; + int pstatus; + int ndeps; + int njp; + int nprocs; +}; + +struct cfdepend { + STAILQ_ENTRY(cfdepend) tq[2]; + struct cfjail *j[2]; + unsigned flags; +}; + +extern void *emalloc(size_t); +extern void *erealloc(void *, size_t); +extern char *estrdup(const char *); +extern int create_jail(struct cfjail *j); +extern void failed(struct cfjail *j); +extern void jail_note(const struct cfjail *j, const char *fmt, ...); +extern void jail_warnx(const struct cfjail *j, const char *fmt, ...); + +extern int next_command(struct cfjail *j); +extern int finish_command(struct cfjail *j); +extern struct cfjail *next_proc(int nonblock); + +extern void load_config(void); +extern struct cfjail *add_jail(void); +extern void add_param(struct cfjail *j, const struct cfparam *p, + enum intparam ipnum, const char *value); +extern int bool_param(const struct cfparam *p); +extern int int_param(const struct cfparam *p, int *ip); +extern const char *string_param(const struct cfparam *p); +extern int check_intparams(struct cfjail *j); +extern int import_params(struct cfjail *j); +extern int equalopts(const char *opt1, const char *opt2); +extern int wild_jail_name(const char *wname); +extern int wild_jail_match(const char *jname, const char *wname); + +extern void dep_setup(int docf); +extern int dep_check(struct cfjail *j); +extern void dep_done(struct cfjail *j, unsigned flags); +extern void dep_reset(struct cfjail *j); +extern struct cfjail *next_jail(void); +extern int start_state(const char *target, int docf, unsigned state, + int running); +extern void requeue(struct cfjail *j, struct cfjails *queue); + +extern void yyerror(const char *); +extern int yylex(void); + +extern struct cfjails cfjails; +extern struct cfjails ready; +extern struct cfjails depend; +extern const char *cfname; +extern int iflag; +extern int note_remove; +extern int paralimit; +extern int verbose; diff --git a/usr.sbin/jail/jailparse.y b/usr.sbin/jail/jailparse.y new file mode 100644 index 00000000000..2df337fc427 --- /dev/null +++ b/usr.sbin/jail/jailparse.y @@ -0,0 +1,216 @@ +%{ +/*- + * Copyright (c) 2011 James Gritton + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include "jailp.h" + +#ifdef DEBUG +#define YYDEBUG 1 +#endif +%} + +%union { + struct cfjail *j; + struct cfparams *pp; + struct cfparam *p; + struct cfstrings *ss; + struct cfstring *s; + char *cs; +} + +%token PLEQ +%token STR STR1 VAR VAR1 + +%type jail +%type param_l +%type

    param name +%type value +%type string + +%% + +/* + * A config file is a series of jails (containing parameters) and jail-less + * parameters which realy belong to a global pseudo-jail. + */ +conf : + ; + | conf jail + ; + | conf param ';' + { + struct cfjail *j; + + j = TAILQ_LAST(&cfjails, cfjails); + if (!j || strcmp(j->name, "*")) { + j = add_jail(); + j->name = estrdup("*"); + } + TAILQ_INSERT_TAIL(&j->params, $2, tq); + } + | conf ';' + +jail : STR '{' param_l '}' + { + $$ = add_jail(); + $$->name = $1; + TAILQ_CONCAT(&$$->params, $3, tq); + free($3); + } + ; + +param_l : + { + $$ = emalloc(sizeof(struct cfparams)); + TAILQ_INIT($$); + } + | param_l param ';' + { + $$ = $1; + TAILQ_INSERT_TAIL($$, $2, tq); + } + | param_l ';' + ; + +/* + * Parameters have a name and an optional list of value strings, + * which may have "+=" or "=" preceeding them. + */ +param : name + { + $$ = $1; + } + | name '=' value + { + $$ = $1; + TAILQ_CONCAT(&$$->val, $3, tq); + free($3); + } + | name PLEQ value + { + $$ = $1; + TAILQ_CONCAT(&$$->val, $3, tq); + $$->flags |= PF_APPEND; + free($3); + } + | name value + { + $$ = $1; + TAILQ_CONCAT(&$$->val, $2, tq); + free($2); + } + | error + { + } + ; + +/* + * A parameter has a fixed name. A variable definition looks just like a + * parameter except that the name is a variable. + */ +name : STR + { + $$ = emalloc(sizeof(struct cfparam)); + $$->name = $1; + TAILQ_INIT(&$$->val); + $$->flags = 0; + } + | VAR + { + $$ = emalloc(sizeof(struct cfparam)); + $$->name = $1; + TAILQ_INIT(&$$->val); + $$->flags = PF_VAR; + } + ; + +value : string + { + $$ = emalloc(sizeof(struct cfstrings)); + TAILQ_INIT($$); + TAILQ_INSERT_TAIL($$, $1, tq); + } + | value ',' string + { + $$ = $1; + TAILQ_INSERT_TAIL($$, $3, tq); + } + ; + +/* + * Strings may be passed in pieces, because of quoting and/or variable + * interpolation. Reassemble them into a single string. + */ +string : STR + { + $$ = emalloc(sizeof(struct cfstring)); + $$->s = $1; + $$->len = strlen($1); + STAILQ_INIT(&$$->vars); + } + | VAR + { + struct cfvar *v; + + $$ = emalloc(sizeof(struct cfstring)); + $$->s = estrdup(""); + $$->len = 0; + STAILQ_INIT(&$$->vars); + v = emalloc(sizeof(struct cfvar)); + v->name = $1; + v->pos = 0; + STAILQ_INSERT_TAIL(&$$->vars, v, tq); + } + | string STR1 + { + size_t len1; + + $$ = $1; + len1 = strlen($2); + $$->s = erealloc($$->s, $$->len + len1 + 1); + strcpy($$->s + $$->len, $2); + free($2); + $$->len += len1; + } + | string VAR1 + { + struct cfvar *v; + + $$ = $1; + v = emalloc(sizeof(struct cfvar)); + v->name = $2; + v->pos = $$->len; + STAILQ_INSERT_TAIL(&$$->vars, v, tq); + } + ; + +%% diff --git a/usr.sbin/jail/state.c b/usr.sbin/jail/state.c new file mode 100644 index 00000000000..17b2a0c266a --- /dev/null +++ b/usr.sbin/jail/state.c @@ -0,0 +1,469 @@ +/*- + * Copyright (c) 2011 James Gritton + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include + +#include "jailp.h" + +struct cfjails ready = TAILQ_HEAD_INITIALIZER(ready); +struct cfjails depend = TAILQ_HEAD_INITIALIZER(depend); + +static void dep_add(struct cfjail *from, struct cfjail *to, unsigned flags); +static int cmp_jailptr(const void *a, const void *b); +static int cmp_jailptr_name(const void *a, const void *b); +static struct cfjail *find_jail(const char *name); +static int running_jid(const char *name, int flags); + +static struct cfjail **jails_byname; +static size_t njails; + +/* + * Set up jail dependency lists. + */ +void +dep_setup(int docf) +{ + struct cfjail *j, *dj; + struct cfparam *p; + struct cfstring *s; + struct cfdepend *d; + const char *cs; + char *pname; + size_t plen; + int error, deps, ldeps; + + if (!docf) { + /* + * With no config file, let "depend" for a single jail + * look at currently running jails. + */ + if ((j = TAILQ_FIRST(&cfjails)) && + (p = j->intparams[IP_DEPEND])) { + TAILQ_FOREACH(s, &p->val, tq) { + if (running_jid(s->s, 0) < 0) { + warnx("depends on nonexistent jail " + "\"%s\"", s->s); + j->flags |= JF_FAILED; + } + } + } + return; + } + + njails = 0; + TAILQ_FOREACH(j, &cfjails, tq) + njails++; + jails_byname = emalloc(njails * sizeof(struct cfjail *)); + njails = 0; + TAILQ_FOREACH(j, &cfjails, tq) + jails_byname[njails++] = j; + qsort(jails_byname, njails, sizeof(struct cfjail *), cmp_jailptr); + error = 0; + deps = 0; + ldeps = 0; + plen = 0; + pname = NULL; + TAILQ_FOREACH(j, &cfjails, tq) { + if (j->flags & JF_FAILED) + continue; + if ((p = j->intparams[IP_DEPEND])) { + TAILQ_FOREACH(s, &p->val, tq) { + dj = find_jail(s->s); + if (dj != NULL) { + deps++; + dep_add(j, dj, 0); + } else { + jail_warnx(j, + "depends on undefined jail \"%s\"", + s->s); + j->flags |= JF_FAILED; + } + } + } + /* A jail has an implied dependency on its parent. */ + if ((cs = strrchr(j->name, '.'))) + { + if (plen < (size_t)(cs - j->name + 1)) { + plen = (cs - j->name) + 1; + pname = erealloc(pname, plen); + } + strlcpy(pname, j->name, plen); + dj = find_jail(pname); + if (dj != NULL) { + ldeps++; + dep_add(j, dj, DF_LIGHT); + } + } + } + + /* Look for dependency loops. */ + if (deps && (deps > 1 || ldeps)) { + (void)start_state(NULL, 0, 0, 0); + while ((j = TAILQ_FIRST(&ready))) { + requeue(j, &cfjails); + dep_done(j, DF_NOFAIL); + } + while ((j = TAILQ_FIRST(&depend)) != NULL) { + jail_warnx(j, "dependency loop"); + j->flags |= JF_FAILED; + do { + requeue(j, &cfjails); + dep_done(j, DF_NOFAIL); + } while ((j = TAILQ_FIRST(&ready))); + } + TAILQ_FOREACH(j, &cfjails, tq) + STAILQ_FOREACH(d, &j->dep[DEP_FROM], tq[DEP_FROM]) + d->flags &= ~DF_SEEN; + } + if (pname != NULL) + free(pname); +} + +/* + * Return if a jail has dependencies. + */ +int +dep_check(struct cfjail *j) +{ + int reset, depfrom, depto, ndeps, rev; + struct cfjail *dj; + struct cfdepend *d; + + static int bits[] = { 0, 1, 1, 2, 1, 2, 2, 3 }; + + if (j->ndeps == 0) + return 0; + ndeps = 0; + if ((rev = JF_DO_STOP(j->flags))) { + depfrom = DEP_TO; + depto = DEP_FROM; + } else { + depfrom = DEP_FROM; + depto = DEP_TO; + } + STAILQ_FOREACH(d, &j->dep[depfrom], tq[depfrom]) { + if (d->flags & DF_SEEN) + continue; + dj = d->j[depto]; + if (dj->flags & JF_FAILED) { + if (!(j->flags & (JF_DEPEND | JF_FAILED)) && + verbose >= 0) + jail_warnx(j, "skipped"); + j->flags |= JF_FAILED; + continue; + } + /* + * The dependee's state may be set (or changed) as a result of + * being in a dependency it wasn't in earlier. + */ + reset = 0; + if (bits[dj->flags & JF_OP_MASK] <= 1) { + if (!(dj->flags & JF_OP_MASK)) { + reset = 1; + dj->flags |= JF_DEPEND; + requeue(dj, &ready); + } + /* Set or change the dependee's state. */ + switch (j->flags & JF_OP_MASK) { + case JF_START: + dj->flags |= JF_START; + break; + case JF_SET: + if (!(dj->flags & JF_OP_MASK)) + dj->flags |= JF_SET; + else if (dj->flags & JF_STOP) + dj->flags |= JF_START; + break; + case JF_STOP: + case JF_RESTART: + if (!(dj->flags & JF_STOP)) + reset = 1; + dj->flags |= JF_STOP; + if (dj->flags & JF_SET) + dj->flags ^= (JF_START | JF_SET); + break; + } + } + if (reset) + dep_reset(dj); + if (!((d->flags & DF_LIGHT) && + (rev ? dj->jid < 0 : dj->jid > 0))) + ndeps++; + } + if (ndeps == 0) + return 0; + requeue(j, &depend); + return 1; +} + +/* + * Resolve any dependencies from a finished jail. + */ +void +dep_done(struct cfjail *j, unsigned flags) +{ + struct cfjail *dj; + struct cfdepend *d; + int depfrom, depto; + + if (JF_DO_STOP(j->flags)) { + depfrom = DEP_TO; + depto = DEP_FROM; + } else { + depfrom = DEP_FROM; + depto = DEP_TO; + } + STAILQ_FOREACH(d, &j->dep[depto], tq[depto]) { + if ((d->flags & DF_SEEN) | (flags & ~d->flags & DF_LIGHT)) + continue; + d->flags |= DF_SEEN; + dj = d->j[depfrom]; + if (!(flags & DF_NOFAIL) && (j->flags & JF_FAILED) && + (j->flags & (JF_OP_MASK | JF_DEPEND)) != + (JF_SET | JF_DEPEND)) { + if (!(dj->flags & (JF_DEPEND | JF_FAILED)) && + verbose >= 0) + jail_warnx(dj, "skipped"); + dj->flags |= JF_FAILED; + } + if (!--dj->ndeps && dj->queue == &depend) + requeue(dj, &ready); + } +} + +/* + * Count a jail's dependencies and mark them as unseen. + */ +void +dep_reset(struct cfjail *j) +{ + int depfrom; + struct cfdepend *d; + + depfrom = JF_DO_STOP(j->flags) ? DEP_TO : DEP_FROM; + j->ndeps = 0; + STAILQ_FOREACH(d, &j->dep[depfrom], tq[depfrom]) + j->ndeps++; +} + +/* + * Find the next jail ready to do something. + */ +struct cfjail * +next_jail(void) +{ + struct cfjail *j; + + if (!(j = next_proc(!TAILQ_EMPTY(&ready))) && + (j = TAILQ_FIRST(&ready)) && JF_DO_STOP(j->flags) && + (j = TAILQ_LAST(&ready, cfjails)) && !JF_DO_STOP(j->flags)) { + TAILQ_FOREACH_REVERSE(j, &ready, cfjails, tq) + if (JF_DO_STOP(j->flags)) + break; + } + if (j != NULL) + requeue(j, &cfjails); + return j; +} + +/* + * Set jails to the proper start state. + */ +int +start_state(const char *target, int docf, unsigned state, int running) +{ + struct iovec jiov[6]; + struct cfjail *j, *tj; + int jid; + char namebuf[MAXHOSTNAMELEN]; + + if (!target || (!docf && state != JF_STOP) || + (!running && !strcmp(target, "*"))) { + /* + * For a global wildcard (including no target specified), + * set the state on all jails and start with those that + * have no dependencies. + */ + TAILQ_FOREACH_SAFE(j, &cfjails, tq, tj) { + j->flags = (j->flags & JF_FAILED) | state | + (docf ? JF_WILD : 0); + dep_reset(j); + requeue(j, j->ndeps ? &depend : &ready); + } + } else if (wild_jail_name(target)) { + /* + * For targets specified singly, or with a non-global wildcard, + * set their state and call them ready (even if there are + * dependencies). Leave everything else unqueued for now. + */ + if (running) { + /* + * -R matches its wildcards against currently running + * jails, not against the config file. + */ + *(const void **)&jiov[0].iov_base = "lastjid"; + jiov[0].iov_len = sizeof("lastjid"); + jiov[1].iov_base = &jid; + jiov[1].iov_len = sizeof(jid); + *(const void **)&jiov[2].iov_base = "jid"; + jiov[2].iov_len = sizeof("jid"); + jiov[3].iov_base = &jid; + jiov[3].iov_len = sizeof(jid); + *(const void **)&jiov[4].iov_base = "name"; + jiov[4].iov_len = sizeof("name"); + jiov[5].iov_base = &namebuf; + jiov[5].iov_len = sizeof(namebuf); + for (jid = 0; jail_get(jiov, 6, 0) > 0; ) { + if (wild_jail_match(namebuf, target)) { + j = add_jail(); + j->name = estrdup(namebuf); + j->jid = jid; + j->flags = (j->flags & JF_FAILED) | + state | JF_WILD; + dep_reset(j); + requeue(j, &ready); + } + } + } else { + TAILQ_FOREACH_SAFE(j, &cfjails, tq, tj) { + if (wild_jail_match(j->name, target)) { + j->flags = (j->flags & JF_FAILED) | + state | JF_WILD; + dep_reset(j); + requeue(j, &ready); + } + } + } + } else { + j = find_jail(target); + if (j == NULL && state == JF_STOP) { + /* Allow -[rR] to specify a currently running jail. */ + if ((jid = running_jid(target, JAIL_DYING)) > 0) { + j = add_jail(); + j->name = estrdup(target); + j->jid = jid; + } + } + if (j == NULL) { + warnx("\"%s\" not found", target); + return -1; + } + j->flags = (j->flags & JF_FAILED) | state; + dep_reset(j); + requeue(j, &ready); + } + return 0; +} + +/* + * Move a jail to a new list. + */ +void +requeue(struct cfjail *j, struct cfjails *queue) +{ + if (j->queue != queue) { + TAILQ_REMOVE(j->queue, j, tq); + TAILQ_INSERT_TAIL(queue, j, tq); + j->queue = queue; + } +} + +/* + * Add a dependency edge between two jails. + */ +static void +dep_add(struct cfjail *from, struct cfjail *to, unsigned flags) +{ + struct cfdepend *d; + + d = emalloc(sizeof(struct cfdepend)); + d->flags = flags; + d->j[DEP_FROM] = from; + d->j[DEP_TO] = to; + STAILQ_INSERT_TAIL(&from->dep[DEP_FROM], d, tq[DEP_FROM]); + STAILQ_INSERT_TAIL(&to->dep[DEP_TO], d, tq[DEP_TO]); +} + +/* + * Compare jail pointers for qsort/bsearch. + */ +static int +cmp_jailptr(const void *a, const void *b) +{ + return strcmp((*((struct cfjail * const *)a))->name, + ((*(struct cfjail * const *)b))->name); +} + +static int +cmp_jailptr_name(const void *a, const void *b) +{ + return strcmp((const char *)a, ((*(struct cfjail * const *)b))->name); +} + +/* + * Find a jail object by name. + */ +static struct cfjail * +find_jail(const char *name) +{ + struct cfjail **jp; + + jp = bsearch(name, jails_byname, njails, sizeof(struct cfjail *), + cmp_jailptr_name); + return jp ? *jp : NULL; +} + +/* + * Return the named jail's jid if it is running, and -1 if it isn't. + */ +static int +running_jid(const char *name, int flags) +{ + struct iovec jiov[2]; + char *ep; + int jid; + + if ((jid = strtol(name, &ep, 10)) && !*ep) { + *(const void **)&jiov[0].iov_base = "jid"; + jiov[0].iov_len = sizeof("jid"); + jiov[1].iov_base = &jid; + jiov[1].iov_len = sizeof(jid); + } else { + *(const void **)&jiov[0].iov_base = "name"; + jiov[0].iov_len = sizeof("name"); + jiov[1].iov_len = strlen(name) + 1; + jiov[1].iov_base = alloca(jiov[1].iov_len); + strcpy(jiov[1].iov_base, name); + } + return jail_get(jiov, 2, flags); +} diff --git a/usr.sbin/kbdmap/kbdmap.c b/usr.sbin/kbdmap/kbdmap.c index c6348a66ea3..7d5a0d12628 100644 --- a/usr.sbin/kbdmap/kbdmap.c +++ b/usr.sbin/kbdmap/kbdmap.c @@ -327,7 +327,6 @@ show_dialog(struct keymap **km_sorted, int num_keymaps) FILE *fp; char *cmd, *dialog; char tmp_name[] = "/tmp/_kbd_lang.XXXX"; - const char *ext; int fd, i, size; fd = mkstemp(tmp_name); @@ -339,8 +338,6 @@ show_dialog(struct keymap **km_sorted, int num_keymaps) asprintf(&dialog, "/usr/bin/dialog --clear --title \"Keyboard Menu\" " "--menu \"%s\" 0 0 0", menu); - ext = extract_name(dir); - /* start right font, assume that current font is equal * to default font in /etc/rc.conf * diff --git a/usr.sbin/kldxref/ef.c b/usr.sbin/kldxref/ef.c index 276771d1985..b9686d34cda 100644 --- a/usr.sbin/kldxref/ef.c +++ b/usr.sbin/kldxref/ef.c @@ -532,7 +532,7 @@ ef_open(const char *filename, struct elf_file *efile, int verbose) int error; int phlen, res; int nsegs; - Elf_Phdr *phdr, *phdyn, *phphdr, *phlimit; + Elf_Phdr *phdr, *phdyn, *phlimit; if (filename == NULL) return EFTYPE; @@ -576,7 +576,6 @@ ef_open(const char *filename, struct elf_file *efile, int verbose) phlimit = phdr + hdr->e_phnum; nsegs = 0; phdyn = NULL; - phphdr = NULL; while (phdr < phlimit) { if (verbose > 1) ef_print_phdr(phdr); @@ -590,7 +589,6 @@ ef_open(const char *filename, struct elf_file *efile, int verbose) ef->ef_segs[nsegs++] = phdr; break; case PT_PHDR: - phphdr = phdr; break; case PT_DYNAMIC: phdyn = phdr; diff --git a/usr.sbin/lpr/common_source/common.c b/usr.sbin/lpr/common_source/common.c index d28ac1fcdd9..819d7dd1ca8 100644 --- a/usr.sbin/lpr/common_source/common.c +++ b/usr.sbin/lpr/common_source/common.c @@ -130,7 +130,7 @@ getq(const struct printer *pp, struct jobqueue *(*namelist[])) seteuid(uid); return (-1); } - if (fstat(dirp->dd_fd, &stbuf) < 0) + if (fstat(dirfd(dirp), &stbuf) < 0) goto errdone; seteuid(uid); diff --git a/usr.sbin/lpr/lpc/cmds.c b/usr.sbin/lpr/lpc/cmds.c index 71aaa1a0014..44516d8305f 100644 --- a/usr.sbin/lpr/lpc/cmds.c +++ b/usr.sbin/lpr/lpc/cmds.c @@ -163,6 +163,14 @@ generic(void (*specificrtn)(struct printer *_pp), int cmdopts, break; } } + if (argc < 1) { + printf("error: No printer name(s) specified before" + " '-msg'.\n"); + printf("usage: %s {all | printer ...}", + generic_cmdname); + printf(" [-msg ...]\n"); + return; + } } /* call initialization routine, if there is one for this cmd */ @@ -1001,12 +1009,30 @@ setstatus_gi(int argc __unused, char *argv[] __unused) void setstatus_q(struct printer *pp) { + struct stat stbuf; + int not_shown; char lf[MAXPATHLEN]; lock_file_name(pp, lf, sizeof lf); printf("%s:\n", pp->printer); upstat(pp, generic_msg, 1); + + /* + * Warn the user if 'lpq' will not display this new status-message. + * Note that if lock file does not exist, then the queue is enabled + * for both queuing and printing. + */ + not_shown = 1; + if (stat(lf, &stbuf) >= 0) { + if (stbuf.st_mode & LFM_PRINT_DIS) + not_shown = 0; + } + if (not_shown) { + printf("\tnote: This queue currently has printing enabled,\n"); + printf("\t so this -msg will only be shown by 'lpq' if\n"); + printf("\t a job is actively printing on it.\n"); + } } /* diff --git a/usr.sbin/lpr/lpr/lpr.c b/usr.sbin/lpr/lpr/lpr.c index c2f88a07af6..9ae72f6110c 100644 --- a/usr.sbin/lpr/lpr/lpr.c +++ b/usr.sbin/lpr/lpr/lpr.c @@ -846,7 +846,7 @@ mktemps(const struct printer *pp) (void) snprintf(buf, sizeof(buf), "%s/.seq", pp->spool_dir); seteuid(euid); - if ((fd = open(buf, O_RDWR|O_CREAT, 0661)) < 0) { + if ((fd = open(buf, O_RDWR|O_CREAT, 0664)) < 0) { printf("%s: cannot create %s\n", progname, buf); exit(1); } diff --git a/usr.sbin/mfiutil/Makefile b/usr.sbin/mfiutil/Makefile index dbf158d914e..e10035846ad 100644 --- a/usr.sbin/mfiutil/Makefile +++ b/usr.sbin/mfiutil/Makefile @@ -6,7 +6,6 @@ SRCS= mfiutil.c mfi_cmd.c mfi_config.c mfi_drive.c mfi_evt.c mfi_flash.c \ MAN8= mfiutil.8 CFLAGS+= -fno-builtin-strftime -WARNS?=3 DPADD= ${LIBUTIL} LDADD= -lutil diff --git a/usr.sbin/mfiutil/mfi_cmd.c b/usr.sbin/mfiutil/mfi_cmd.c index 7fedfb6b7f5..3cf703af306 100644 --- a/usr.sbin/mfiutil/mfi_cmd.c +++ b/usr.sbin/mfiutil/mfi_cmd.c @@ -301,12 +301,12 @@ mfi_ctrl_get_info(int fd, struct mfi_ctrl_info *info, uint8_t *statusp) } int -mfi_open(int unit) +mfi_open(int unit, int acs) { char path[MAXPATHLEN]; snprintf(path, sizeof(path), "/dev/mfi%d", unit); - return (open(path, O_RDWR)); + return (open(path, acs)); } void diff --git a/usr.sbin/mfiutil/mfi_config.c b/usr.sbin/mfiutil/mfi_config.c index feb285d4a3e..8576bc3325c 100644 --- a/usr.sbin/mfiutil/mfi_config.c +++ b/usr.sbin/mfiutil/mfi_config.c @@ -35,6 +35,7 @@ #endif #include #include +#include #include #ifdef DEBUG #include @@ -151,13 +152,13 @@ mfi_config_lookup_volume(struct mfi_config_data *config, uint8_t target_id) } static int -clear_config(int ac, char **av) +clear_config(int ac __unused, char **av __unused) { struct mfi_ld_list list; int ch, error, fd; u_int i; - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -410,7 +411,7 @@ find_next_volume(struct config_id_state *state) /* Populate an array with drives. */ static void -build_array(int fd, char *arrayp, struct array_info *array_info, +build_array(int fd __unused, char *arrayp, struct array_info *array_info, struct config_id_state *state, int verbose) { struct mfi_array *ar = (struct mfi_array *)arrayp; @@ -575,7 +576,7 @@ create_volume(int ac, char **av) narrays = 0; error = 0; - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -857,7 +858,7 @@ delete_volume(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -925,7 +926,7 @@ add_spare(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -1050,7 +1051,7 @@ remove_spare(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -1196,7 +1197,7 @@ debug_config(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -1233,7 +1234,7 @@ dump(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); diff --git a/usr.sbin/mfiutil/mfi_drive.c b/usr.sbin/mfiutil/mfi_drive.c index 231b070134c..1927facd67a 100644 --- a/usr.sbin/mfiutil/mfi_drive.c +++ b/usr.sbin/mfiutil/mfi_drive.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -71,7 +72,7 @@ mfi_drive_name(struct mfi_pd_info *pinfo, uint16_t device_id, uint32_t def) else snprintf(buf, sizeof(buf), "%2u", device_id); - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { warn("mfi_open"); return (buf); @@ -329,11 +330,13 @@ cam_strvis(char *dst, const char *src, int srclen, int dstlen) const char * mfi_pd_inq_string(struct mfi_pd_info *info) { - struct scsi_inquiry_data *inq_data; + struct scsi_inquiry_data iqd, *inq_data = &iqd; char vendor[16], product[48], revision[16], rstr[12], serial[SID_VENDOR_SPECIFIC_0_SIZE]; static char inq_string[64]; - inq_data = (struct scsi_inquiry_data *)info->inquiry_data; + memcpy(inq_data, info->inquiry_data, + (sizeof (iqd) < sizeof (info->inquiry_data))? + sizeof (iqd) : sizeof (info->inquiry_data)); if (SID_QUAL_IS_VENDOR_UNIQUE(inq_data)) return (NULL); if (SID_TYPE(inq_data) != T_DIRECT) @@ -383,7 +386,7 @@ drive_set_state(char *drive, uint16_t new_state) uint8_t mbox[6]; int error, fd; - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -484,7 +487,7 @@ start_rebuild(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -541,7 +544,7 @@ abort_rebuild(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -597,7 +600,7 @@ drive_progress(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -663,7 +666,7 @@ drive_clear(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -723,7 +726,7 @@ drive_locate(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); diff --git a/usr.sbin/mfiutil/mfi_evt.c b/usr.sbin/mfiutil/mfi_evt.c index dbf82723cbf..c9a1a6dc567 100644 --- a/usr.sbin/mfiutil/mfi_evt.c +++ b/usr.sbin/mfiutil/mfi_evt.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -63,7 +64,7 @@ mfi_get_events(int fd, struct mfi_evt_list *list, int num_events, } static int -show_logstate(int ac, char **av) +show_logstate(int ac, char **av __unused) { struct mfi_evt_log_state info; int error, fd; @@ -73,7 +74,7 @@ show_logstate(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -541,7 +542,7 @@ show_events(int ac, char **av) int ch, error, fd, num_events, verbose; u_int i; - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); diff --git a/usr.sbin/mfiutil/mfi_flash.c b/usr.sbin/mfiutil/mfi_flash.c index 6d07cb0651e..2601025a13f 100644 --- a/usr.sbin/mfiutil/mfi_flash.c +++ b/usr.sbin/mfiutil/mfi_flash.c @@ -150,7 +150,7 @@ flash_adapter(int ac, char **av) goto error; } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); diff --git a/usr.sbin/mfiutil/mfi_patrol.c b/usr.sbin/mfiutil/mfi_patrol.c index dd348ade0dc..c3e47f32b33 100644 --- a/usr.sbin/mfiutil/mfi_patrol.c +++ b/usr.sbin/mfiutil/mfi_patrol.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -74,7 +75,7 @@ patrol_get_props(int fd, struct mfi_pr_properties *prop) } static int -show_patrol(int ac, char **av) +show_patrol(int ac __unused, char **av __unused) { struct mfi_pr_properties prop; struct mfi_pr_status status; @@ -86,7 +87,7 @@ show_patrol(int ac, char **av) int error, fd; u_int i; - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -192,11 +193,11 @@ show_patrol(int ac, char **av) MFI_COMMAND(show, patrol, show_patrol); static int -start_patrol(int ac, char **av) +start_patrol(int ac __unused, char **av __unused) { int error, fd; - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -218,11 +219,11 @@ start_patrol(int ac, char **av) MFI_COMMAND(start, patrol, start_patrol); static int -stop_patrol(int ac, char **av) +stop_patrol(int ac __unused, char **av __unused) { int error, fd; - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -292,7 +293,7 @@ patrol_config(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); diff --git a/usr.sbin/mfiutil/mfi_show.c b/usr.sbin/mfiutil/mfi_show.c index 4f83b52e310..28a26040391 100644 --- a/usr.sbin/mfiutil/mfi_show.c +++ b/usr.sbin/mfiutil/mfi_show.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -50,7 +51,7 @@ format_stripe(char *buf, size_t buflen, uint8_t stripe) } static int -show_adapter(int ac, char **av) +show_adapter(int ac, char **av __unused) { struct mfi_ctrl_info info; char stripe[5]; @@ -61,7 +62,7 @@ show_adapter(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDONLY); if (fd < 0) { error = errno; warn("mfi_open"); @@ -135,7 +136,7 @@ show_adapter(int ac, char **av) MFI_COMMAND(show, adapter, show_adapter); static int -show_battery(int ac, char **av) +show_battery(int ac, char **av __unused) { struct mfi_bbu_capacity_info cap; struct mfi_bbu_design_info design; @@ -148,7 +149,7 @@ show_battery(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDONLY); if (fd < 0) { error = errno; warn("mfi_open"); @@ -224,7 +225,29 @@ show_battery(int ac, char **av) } if (stat.fw_status & MFI_BBU_STATE_DISCHARGE_ACTIVE) { printf("%s DISCHARGING", comma ? "," : ""); + comma = 1; } + if (stat.fw_status & MFI_BBU_STATE_LEARN_CYC_REQ) { + printf("%s LEARN_CYCLE_REQUESTED", comma ? "," : ""); + comma = 1; + } + if (stat.fw_status & MFI_BBU_STATE_LEARN_CYC_ACTIVE) { + printf("%s LEARN_CYCLE_ACTIVE", comma ? "," : ""); + comma = 1; + } + if (stat.fw_status & MFI_BBU_STATE_LEARN_CYC_FAIL) { + printf("%s LEARN_CYCLE_FAIL", comma ? "," : ""); + comma = 1; + } + if (stat.fw_status & MFI_BBU_STATE_LEARN_CYC_TIMEOUT) { + printf("%s LEARN_CYCLE_TIMEOUT", comma ? "," : ""); + comma = 1; + } + if (stat.fw_status & MFI_BBU_STATE_I2C_ERR_DETECT) { + printf("%s I2C_ERROR_DETECT", comma ? "," : ""); + comma = 1; + } + if (!comma) printf(" normal"); printf("\n"); @@ -281,7 +304,7 @@ print_pd(struct mfi_pd_info *info, int state_len) } static int -show_config(int ac, char **av) +show_config(int ac, char **av __unused) { struct mfi_config_data *config; struct mfi_array *ar; @@ -298,7 +321,7 @@ show_config(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDONLY); if (fd < 0) { error = errno; warn("mfi_open"); @@ -387,7 +410,7 @@ show_config(int ac, char **av) MFI_COMMAND(show, config, show_config); static int -show_volumes(int ac, char **av) +show_volumes(int ac, char **av __unused) { struct mfi_ld_list list; struct mfi_ld_info info; @@ -399,7 +422,7 @@ show_volumes(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDONLY); if (fd < 0) { error = errno; warn("mfi_open"); @@ -470,7 +493,7 @@ show_volumes(int ac, char **av) MFI_COMMAND(show, volumes, show_volumes); static int -show_drives(int ac, char **av) +show_drives(int ac, char **av __unused) { struct mfi_pd_list *list; struct mfi_pd_info info; @@ -482,7 +505,7 @@ show_drives(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDONLY); if (fd < 0) { error = errno; warn("mfi_open"); @@ -578,7 +601,7 @@ display_firmware(struct mfi_info_component *comp, const char *tag) } static int -show_firmware(int ac, char **av) +show_firmware(int ac, char **av __unused) { struct mfi_ctrl_info info; struct mfi_info_component header; @@ -590,7 +613,7 @@ show_firmware(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDONLY); if (fd < 0) { error = errno; warn("mfi_open"); @@ -634,7 +657,7 @@ show_firmware(int ac, char **av) MFI_COMMAND(show, firmware, show_firmware); static int -show_progress(int ac, char **av) +show_progress(int ac, char **av __unused) { struct mfi_ld_list llist; struct mfi_pd_list *plist; @@ -650,7 +673,7 @@ show_progress(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDONLY); if (fd < 0) { error = errno; warn("mfi_open"); diff --git a/usr.sbin/mfiutil/mfi_volume.c b/usr.sbin/mfiutil/mfi_volume.c index 836f0453503..49417d0eba8 100644 --- a/usr.sbin/mfiutil/mfi_volume.c +++ b/usr.sbin/mfiutil/mfi_volume.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -294,7 +295,7 @@ volume_cache(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -402,7 +403,7 @@ volume_name(int ac, char **av) return (ENOSPC); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDWR); if (fd < 0) { error = errno; warn("mfi_open"); @@ -453,7 +454,7 @@ volume_progress(int ac, char **av) return (EINVAL); } - fd = mfi_open(mfi_unit); + fd = mfi_open(mfi_unit, O_RDONLY); if (fd < 0) { error = errno; warn("mfi_open"); diff --git a/usr.sbin/mfiutil/mfiutil.c b/usr.sbin/mfiutil/mfiutil.c index 43bb6bbe5d1..7a8833d3181 100644 --- a/usr.sbin/mfiutil/mfiutil.c +++ b/usr.sbin/mfiutil/mfiutil.c @@ -92,10 +92,10 @@ usage(void) } static int -version(int ac, char **av) +version(int ac __unused, char **av __unused) { - printf("mfiutil version 1.0.13"); + printf("mfiutil version 1.0.14"); #ifdef DEBUG printf(" (DEBUG)"); #endif diff --git a/usr.sbin/mfiutil/mfiutil.h b/usr.sbin/mfiutil/mfiutil.h index 232831e036a..bb9366f8769 100644 --- a/usr.sbin/mfiutil/mfiutil.h +++ b/usr.sbin/mfiutil/mfiutil.h @@ -139,7 +139,7 @@ int mfi_lookup_drive(int fd, char *drive, uint16_t *device_id); int mfi_lookup_volume(int fd, const char *name, uint8_t *target_id); int mfi_dcmd_command(int fd, uint32_t opcode, void *buf, size_t bufsize, uint8_t *mbox, size_t mboxlen, uint8_t *statusp); -int mfi_open(int unit); +int mfi_open(int unit, int acs); int mfi_ctrl_get_info(int fd, struct mfi_ctrl_info *info, uint8_t *statusp); int mfi_ld_get_info(int fd, uint8_t target_id, struct mfi_ld_info *info, uint8_t *statusp); diff --git a/usr.sbin/mptutil/mpt_show.c b/usr.sbin/mptutil/mpt_show.c index a5e1a899ffb..153d73e0097 100644 --- a/usr.sbin/mptutil/mpt_show.c +++ b/usr.sbin/mptutil/mpt_show.c @@ -538,7 +538,7 @@ show_physdisks(int ac, char **av) { CONFIG_PAGE_RAID_PHYS_DISK_0 *pinfo; U16 IOCStatus; - int fd, i; + int error, fd, i; if (ac != 1) { warnx("show drives: extra arguments"); diff --git a/usr.sbin/nandsim/Makefile b/usr.sbin/nandsim/Makefile new file mode 100644 index 00000000000..9269ab5de34 --- /dev/null +++ b/usr.sbin/nandsim/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +PROG= nandsim +SRCS= nandsim.c nandsim_rcfile.c nandsim_cfgparse.c +BINDIR= /usr/sbin +MAN= nandsim.8 + +.include diff --git a/usr.sbin/nandsim/nandsim.8 b/usr.sbin/nandsim/nandsim.8 new file mode 100644 index 00000000000..5b318a233da --- /dev/null +++ b/usr.sbin/nandsim/nandsim.8 @@ -0,0 +1,229 @@ +.\" Copyright (c) 2010 Semihalf +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd August 10, 2010 +.Dt NANDSIM 8 +.Os +.Sh NAME +.Nm nandsim +.Nd NAND simulator control program +.Sh SYNOPSIS +.Nm +.Ic status +.Aq ctrl_no | Fl -all | Fl a +.Op Fl v +.Nm +.Ic conf +.Aq filename +.Nm +.Ic start +.Aq ctrl_no +.Nm +.Ic mod +.Aq ctrl_no:cs_no | Fl l Aq loglevel +.Op Fl p Aq prog_time +.Op Fl e Aq erase_time +.Op Fl r Aq read_time +.Op Fl E Aq error_ratio +.Op Fl h +.Nm +.Ic stop +.Aq ctrl_no +.Nm +.Ic error +.Aq ctrl_no:cs_no +.Aq page_num +.Aq column +.Aq length +.Aq pattern +.Nm +.Ic bb +.Aq ctrl_no:cs_no +.Op blk_num,blk_num2,... +.Op Fl U +.Op Fl L +.Nm +.Ic freeze +.Op ctrl_no +.Nm +.Ic log +.Aq ctrl_no | Fl -all | Fl a +.Nm +.Ic stats +.Aq ctrl_no:cs_no +.Aq page_num +.Nm +.Ic dump +.Aq ctrl_no:cs_no +.Aq filename +.Nm +.Ic restore +.Aq ctrl_no:chip_no +.Aq filename +.Nm +.Ic destroy +.Aq ctrl_no[:cs_no] | Fl -all | Fl a +.Nm +.Ic help +.Op Fl v +.Sh COMMAND DESCRIPTION +Controllers and chips are arranged into a simple hierarchy. +There can be up to 4 controllers configured, each with 4 chip select (CS) lines. +A given chip is connected to one of the chip selects. +.Pp +Controllers are specified as +.Aq ctrl_no ; +chip selects are specified as +.Aq cs_no . +.Bl -tag -width periphlist +.It Ic status +Gets controller(s) status. If +.Fl a +or +.Fl -all +flag is specified - command will print status of every controller +currently available. +Optional flag +.Fl v +causes printing complete information about the controller, and all +chips attached to it. +.It Ic conf +Reads simulator configuration from a specified file (this includes +the simulation "layout" i.e. controllers-chips assignments). +Configuration changes for an already started simulation require a +full stop-start cycle in order to take effect i.e.: +.Bl -column +.It nandsim stop ... +.It nandsim destroy ... +.Pp +.It << edit config file >> +.Pp +.It nandsim conf ... +.It nandsim start ... +.El +.It Ic mod +Alters simulator parameters on-the-fly. +If controller number and CS pair is not specified, the general +simulator parameters (not specific to a controller or a chip) will be modified. +Changing chip's parameters requires specifying both controller number and CS +to which the given chip is connected. +Parameters which can be altered: +.Pp +General simulator related: +.Bl -tag -width flag +.It Fl l Aq log_level +change logging level to +.Aq log_level +.El +.Pp +Chip related: +.Bl -tag -width flag +.It Fl p Aq prog_time +change prog time for specified chip to +.Aq prog_time +.It Fl e Aq erase_time +change erase time for specified chip to +.Aq erase_time +.It Fl r Aq read_time +change read time for specified chip to +.Aq read_time +.It Fl E Aq error_ratio +change error ratio for specified chip to +.Aq error_ratio . +Error ratio is a number of errors per million read/write bytes. +.El +.Pp +Additionally, flag +.Fl h +will list parameters which can be altered. +.El +.Bl -tag -width periphlist +.It Ic bb +Marks/unmarks a specified block as bad. +To mark/unmark the bad condition an a block, the following parameters +have to be supplied: controller number, CS number, and at least one +block number. +It is possible to specify multiple blocks, by separating blocks numbers +with a comma. +The following options can be used for the 'bb' command: +.Bl -tag -width flag +.It Fl U +unmark the bad previously marked block as bad. +.It Fl L +list all blocks marked as bad on a given chip. +.El +.It Ic log +Prints activity log of the specified controller to stdout; if +controller number is not specifed, logs for all available +controllers are printed. +.It Ic stats +Print statistics of the selected controller, chip and page. +Statistics includes read count, write count, raw read count, raw +write count, ECC stats (succeeded corrections, failed correction). +.It Ic dump +Dumps a snaphot of a single chip (including data and bad blocks +information, wearout level) into the file. +.It Ic restore +Restores chip state from a dump-file snapshot (produced previously +with the 'dump' command). +.It Ic start +Starts a controller i.e. the simulation. +.It Ic stop +Stops an already started controller; if the controller number is not +supplied, attempts to stop all currently working controllers. +.It Ic destroy +Removes existing active chip/controller and its configuration from +memory and releases the resources. +Specifying flag +.Fl a +or +.Fl -all +causes removal of every chip and controller. +Controller must be stopped in order to be destroyed. +.It Ic error +Directly overwrites a certain number of bytes in the specified page +at a given offset with a supplied pattern (which mimics the +corruption of flash contents). +.It Ic help +Prints synopsis, +.Fl v +gives more verbose output. +.It Ic freeze +Stops simulation of given controller (simulates power-loss). +All commands issues to any chip on this controller are ignored. +.El +.Sh SEE ALSO +.Xr nand 4 , +.Xr nandsim 4 +.Xr nandsim.conf 5 +.Sh HISTORY +The +.Nm +utility first appeared in +.Fx 10.0 . +.Sh AUTHOR +This utility was written by +.An Lukasz Wojcik . diff --git a/usr.sbin/nandsim/nandsim.c b/usr.sbin/nandsim/nandsim.c new file mode 100644 index 00000000000..082085ff550 --- /dev/null +++ b/usr.sbin/nandsim/nandsim.c @@ -0,0 +1,1397 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Control application for the NAND simulator. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "nandsim_cfgparse.h" + +#define SIMDEVICE "/dev/nandsim.ioctl" + +#define error(fmt, args...) do { \ + printf("ERROR: " fmt "\n", ##args); } while (0) + +#define warn(fmt, args...) do { \ + printf("WARNING: " fmt "\n", ##args); } while (0) + +#define DEBUG +#undef DEBUG + +#ifdef DEBUG +#define debug(fmt, args...) do { \ + printf("NANDSIM_CONF:" fmt "\n", ##args); } while (0) +#else +#define debug(fmt, args...) do {} while(0) +#endif + +#define NANDSIM_RAM_LOG_SIZE 16384 + +#define MSG_NOTRUNNING "Controller#%d is not running.Please start" \ + " it first." +#define MSG_RUNNING "Controller#%d is already running!" +#define MSG_CTRLCHIPNEEDED "You have to specify ctrl_no:cs_no pair!" +#define MSG_STATUSACQCTRLCHIP "Could not acquire status for ctrl#%d chip#%d" +#define MSG_STATUSACQCTRL "Could not acquire status for ctrl#%d" +#define MSG_NOCHIP "There is no such chip configured (chip#%d "\ + "at ctrl#%d)!" + +#define MSG_NOCTRL "Controller#%d is not configured!" +#define MSG_NOTCONFIGDCTRLCHIP "Chip connected to ctrl#%d at cs#%d " \ + "is not configured." + +typedef int (commandfunc_t)(int , char **); + +static struct nandsim_command *getcommand(char *); +static int parse_devstring(char *, int *, int *); +static void printchip(struct sim_chip *, uint8_t); +static void printctrl(struct sim_ctrl *); +static int opendev(int *); +static commandfunc_t cmdstatus; +static commandfunc_t cmdconf; +static commandfunc_t cmdstart; +static commandfunc_t cmdstop; +static commandfunc_t cmdmod; +static commandfunc_t cmderror; +static commandfunc_t cmdbb; +static commandfunc_t cmdfreeze; +static commandfunc_t cmdlog; +static commandfunc_t cmdstats; +static commandfunc_t cmddump; +static commandfunc_t cmdrestore; +static commandfunc_t cmddestroy; +static commandfunc_t cmdhelp; +static int checkusage(int, int, char **); +static int is_chip_created(int, int, int *); +static int is_ctrl_created(int, int *); +static int is_ctrl_running(int, int *); +static int assert_chip_connected(int , int); +static int printstats(int, int, uint32_t, int); + +struct nandsim_command { + const char *cmd_name; /* Command name */ + commandfunc_t *commandfunc; /* Ptr to command function */ + uint8_t req_argc; /* Mandatory arguments count */ + const char *usagestring; /* Usage string */ +}; + +static struct nandsim_command commands[] = { + {"status", cmdstatus, 1, + "status [-v]\n" }, + {"conf", cmdconf, 1, + "conf \n" }, + {"start", cmdstart, 1, + "start \n" }, + {"mod", cmdmod, 2, + "mod [-l ] | [-p ]\n" + "\t[-e ] [-r ]\n" + "\t[-E ] | [-h]\n" }, + {"stop", cmdstop, 1, + "stop \n" }, + {"error", cmderror, 5, + "error \n" }, + {"bb", cmdbb, 2, + "bb [blk_num1,blk_num2,..] [-U] [-L]\n" }, + {"freeze", cmdfreeze, 1, + "freeze [ctrl_no]\n" }, + {"log", cmdlog, 1, + "log \n" }, + {"stats", cmdstats, 2, + "stats \n" }, + {"dump", cmddump, 2, + "dump \n" }, + {"restore", cmdrestore, 2, + "restore \n" }, + {"destroy", cmddestroy, 1, + "destroy \n" }, + {"help", cmdhelp, 0, + "help [-v]" }, + {NULL, NULL, 0, NULL}, +}; + + +/* Parse command name, and start appropriate function */ +static struct nandsim_command* +getcommand(char *arg) +{ + struct nandsim_command *opts; + + for (opts = commands; (opts != NULL) && + (opts->cmd_name != NULL); opts++) { + if (strcmp(opts->cmd_name, arg) == 0) + return (opts); + } + return (NULL); +} + +/* + * Parse given string in format :, if possible -- set + * ctrl and/or cs, and return 0 (success) or 1 (in case of error). + * + * ctrl == 0xff && chip == 0xff : '--all' flag specified + * ctrl != 0xff && chip != 0xff : both ctrl & chip were specified + * ctrl != 0xff && chip == 0xff : only ctrl was specified + */ +static int +parse_devstring(char *str, int *ctrl, int *cs) +{ + char *tmpstr; + unsigned int num = 0; + + /* Ignore white spaces at the beginning */ + while (isspace(*str) && (*str != '\0')) + str++; + + *ctrl = 0xff; + *cs = 0xff; + if (strcmp(str, "--all") == 0 || + strcmp(str, "-a") == 0) { + /* If --all or -a is specified, ctl==chip==0xff */ + debug("CTRL=%d CHIP=%d\n", *ctrl, *cs); + return (0); + } + /* Separate token and try to convert it to int */ + tmpstr = (char *)strtok(str, ":"); + if ((tmpstr != NULL) && (*tmpstr != '\0')) { + if (convert_arguint(tmpstr, &num) != 0) + return (1); + + if (num > MAX_SIM_DEV - 1) { + error("Invalid ctrl_no supplied: %s. Valid ctrl_no " + "value must lie between 0 and 3!", tmpstr); + return (1); + } + + *ctrl = num; + tmpstr = (char *)strtok(NULL, ":"); + + if ((tmpstr != NULL) && (*tmpstr != '\0')) { + if (convert_arguint(tmpstr, &num) != 0) + return (1); + + /* Check if chip_no is valid */ + if (num > MAX_CTRL_CS - 1) { + error("Invalid chip_no supplied: %s. Valid " + "chip_no value must lie between 0 and 3!", + tmpstr); + return (1); + } + *cs = num; + } + } else + /* Empty devstring supplied */ + return (1); + + debug("CTRL=%d CHIP=%d\n", *ctrl, *cs); + return (0); +} + +static int +opendev(int *fd) +{ + + *fd = open(SIMDEVICE, O_RDWR); + if (*fd == -1) { + error("Could not open simulator device file (%s)!", + SIMDEVICE); + return (EX_OSFILE); + } + return (EX_OK); +} + +static int +opencdev(int *cdevd, int ctrl, int chip) +{ + char fname[255]; + + sprintf(fname, "/dev/nandsim%d.%d", ctrl, chip); + *cdevd = open(fname, O_RDWR); + if (*cdevd == -1) + return (EX_NOINPUT); + + return (EX_OK); +} + +/* + * Check if given arguments count match requirements. If no, or + * --help (-h) flag is specified -- return 1 (print usage) + */ +static int +checkusage(int gargc, int argsreqd, char **gargv) +{ + + if (gargc < argsreqd + 2 || (gargc >= (argsreqd + 2) && + (strcmp(gargv[1], "--help") == 0 || + strcmp(gargv[1], "-h") == 0))) + return (1); + + return (0); +} + +static int +cmdstatus(int gargc, char **gargv) +{ + int chip = 0, ctl = 0, err = 0, fd, idx, idx2, start, stop; + uint8_t verbose = 0; + struct sim_ctrl ctrlconf; + struct sim_chip chipconf; + + err = parse_devstring(gargv[2], &ctl, &chip); + if (err) { + return (EX_USAGE); + } else if (ctl == 0xff) { + /* Every controller */ + start = 0; + stop = MAX_SIM_DEV-1; + } else { + /* Specified controller only */ + start = ctl; + stop = ctl; + } + + if (opendev(&fd) != EX_OK) + return (EX_OSFILE); + + for (idx = 0; idx < gargc; idx ++) + if (strcmp(gargv[idx], "-v") == 0 || + strcmp(gargv[idx], "--verbose") == 0) + verbose = 1; + + for (idx = start; idx <= stop; idx++) { + ctrlconf.num = idx; + err = ioctl(fd, NANDSIM_STATUS_CTRL, &ctrlconf); + if (err) { + err = EX_SOFTWARE; + error(MSG_STATUSACQCTRL, idx); + continue; + } + + printctrl(&ctrlconf); + + for (idx2 = 0; idx2 < MAX_CTRL_CS; idx2++) { + chipconf.num = idx2; + chipconf.ctrl_num = idx; + + err = ioctl(fd, NANDSIM_STATUS_CHIP, &chipconf); + if (err) { + err = EX_SOFTWARE; + error(MSG_STATUSACQCTRL, idx); + continue; + } + + printchip(&chipconf, verbose); + } + } + close(fd); + return (err); +} + +static int +cmdconf(int gargc __unused, char **gargv) +{ + int err; + + err = parse_config(gargv[2], SIMDEVICE); + if (err) + return (EX_DATAERR); + + return (EX_OK); +} + +static int +cmdstart(int gargc __unused, char **gargv) +{ + int chip = 0, ctl = 0, err = 0, fd, running, state; + + err = parse_devstring(gargv[2], &ctl, &chip); + if (err) + return (EX_USAGE); + + err = is_ctrl_created(ctl, &state); + if (err) { + return (EX_SOFTWARE); + } else if (state == 0) { + error(MSG_NOCTRL, ctl); + return (EX_SOFTWARE); + } + + err = is_ctrl_running(ctl, &running); + if (err) + return (EX_SOFTWARE); + + if (running) { + warn(MSG_RUNNING, ctl); + } else { + if (opendev(&fd) != EX_OK) + return (EX_OSFILE); + + err = ioctl(fd, NANDSIM_START_CTRL, &ctl); + close(fd); + if (err) { + error("Cannot start controller#%d", ctl); + err = EX_SOFTWARE; + } + } + return (err); +} + +static int +cmdstop(int gargc __unused, char **gargv) +{ + int chip = 0, ctl = 0, err = 0, fd, running; + + err = parse_devstring(gargv[2], &ctl, &chip); + if (err) + return (EX_USAGE); + + err = is_ctrl_running(ctl, &running); + if (err) + return (EX_SOFTWARE); + + if (!running) { + error(MSG_NOTRUNNING, ctl); + } else { + if (opendev(&fd) != EX_OK) + return (EX_OSFILE); + + err = ioctl(fd, NANDSIM_STOP_CTRL, &ctl); + close(fd); + if (err) { + error("Cannot stop controller#%d", ctl); + err = EX_SOFTWARE; + } + } + + return (err); +} + +static int +cmdmod(int gargc __unused, char **gargv) +{ + int chip, ctl, err = 0, fd = -1, i; + struct sim_mod mods; + + if (gargc >= 4) { + if (strcmp(gargv[2], "--loglevel") == 0 || strcmp(gargv[2], + "-l") == 0) { + /* Set loglevel (ctrl:chip pair independant) */ + mods.field = SIM_MOD_LOG_LEVEL; + + if (convert_arguint(gargv[3], &mods.new_value) != 0) + return (EX_SOFTWARE); + + if (opendev(&fd) != EX_OK) + return (EX_OSFILE); + + err = ioctl(fd, NANDSIM_MODIFY, &mods); + if (err) { + error("simulator parameter %s could not be " + "modified !", gargv[3]); + close(fd); + return (EX_SOFTWARE); + } + + debug("request : loglevel = %d\n", mods.new_value); + close(fd); + return (EX_OK); + } + } + + err = parse_devstring(gargv[2], &ctl, &chip); + if (err) + return (EX_USAGE); + + else if (chip == 0xff) { + error(MSG_CTRLCHIPNEEDED); + return (EX_USAGE); + } + + if (!assert_chip_connected(ctl, chip)) + return (EX_SOFTWARE); + + if (opendev(&fd) != EX_OK) + return (EX_OSFILE); + + /* Find out which flags were passed */ + for (i = 3; i < gargc; i++) { + + if (convert_arguint(gargv[i + 1], &mods.new_value) != 0) + continue; + + if (strcmp(gargv[i], "--prog-time") == 0 || + strcmp(gargv[i], "-p") == 0) { + + mods.field = SIM_MOD_PROG_TIME; + debug("request : progtime = %d\n", mods.new_value); + + } else if (strcmp(gargv[i], "--erase-time") == 0 || + strcmp(gargv[i], "-e") == 0) { + + mods.field = SIM_MOD_ERASE_TIME; + debug("request : eraseime = %d\n", mods.new_value); + + } else if (strcmp(gargv[i], "--read-time") == 0 || + strcmp(gargv[i], "-r") == 0) { + + mods.field = SIM_MOD_READ_TIME; + debug("request : read_time = %d\n", mods.new_value); + + } else if (strcmp(gargv[i], "--error-ratio") == 0 || + strcmp(gargv[i], "-E") == 0) { + + mods.field = SIM_MOD_ERROR_RATIO; + debug("request : error_ratio = %d\n", mods.new_value); + + } else { + /* Flag not recognized, or nothing specified. */ + error("Unrecognized flag:%s\n", gargv[i]); + if (fd >= 0) + close(fd); + return (EX_USAGE); + } + + mods.chip_num = chip; + mods.ctrl_num = ctl; + + /* Call appropriate ioctl */ + err = ioctl(fd, NANDSIM_MODIFY, &mods); + if (err) { + error("simulator parameter %s could not be modified! ", + gargv[i]); + continue; + } + i++; + } + close(fd); + return (EX_OK); +} + +static int +cmderror(int gargc __unused, char **gargv) +{ + uint32_t page, column, len, pattern; + int chip = 0, ctl = 0, err = 0, fd; + struct sim_error sim_err; + + err = parse_devstring(gargv[2], &ctl, &chip); + if (err) + return (EX_USAGE); + + if (chip == 0xff) { + error(MSG_CTRLCHIPNEEDED); + return (EX_USAGE); + } + + if (convert_arguint(gargv[3], &page) || + convert_arguint(gargv[4], &column) || + convert_arguint(gargv[5], &len) || + convert_arguint(gargv[6], &pattern)) + return (EX_SOFTWARE); + + if (!assert_chip_connected(ctl, chip)) + return (EX_SOFTWARE); + + sim_err.page_num = page; + sim_err.column = column; + sim_err.len = len; + sim_err.pattern = pattern; + sim_err.ctrl_num = ctl; + sim_err.chip_num = chip; + + if (opendev(&fd) != EX_OK) + return (EX_OSFILE); + + err = ioctl(fd, NANDSIM_INJECT_ERROR, &sim_err); + + close(fd); + if (err) { + error("Could not inject error !"); + return (EX_SOFTWARE); + } + return (EX_OK); +} + +static int +cmdbb(int gargc, char **gargv) +{ + struct sim_block_state bs; + struct chip_param_io cparams; + uint32_t blkidx; + int c, cdevd, chip = 0, ctl = 0, err = 0, fd, idx; + uint8_t flagL = 0, flagU = 0; + int *badblocks = NULL; + + /* Check for --list/-L or --unmark/-U flags */ + for (idx = 3; idx < gargc; idx++) { + if (strcmp(gargv[idx], "--list") == 0 || + strcmp(gargv[idx], "-L") == 0) + flagL = idx; + if (strcmp(gargv[idx], "--unmark") == 0 || + strcmp(gargv[idx], "-U") == 0) + flagU = idx; + } + + if (flagL == 2 || flagU == 2 || flagU == 3) + return (EX_USAGE); + + err = parse_devstring(gargv[2], &ctl, &chip); + if (err) { + return (EX_USAGE); + } + if (chip == 0xff || ctl == 0xff) { + error(MSG_CTRLCHIPNEEDED); + return (EX_USAGE); + } + + bs.ctrl_num = ctl; + bs.chip_num = chip; + + if (!assert_chip_connected(ctl, chip)) + return (EX_SOFTWARE); + + if (opencdev(&cdevd, ctl, chip) != EX_OK) + return (EX_OSFILE); + + err = ioctl(cdevd, NAND_IO_GET_CHIP_PARAM, &cparams); + if (err) + return (EX_SOFTWARE); + + close(cdevd); + + bs.ctrl_num = ctl; + bs.chip_num = chip; + + if (opendev(&fd) != EX_OK) + return (EX_OSFILE); + + if (flagL != 3) { + /* + * Flag -L was specified either after blocklist or was not + * specified at all. + */ + c = parse_intarray(gargv[3], &badblocks); + + for (idx = 0; idx < c; idx++) { + bs.block_num = badblocks[idx]; + /* Do not change wearout */ + bs.wearout = -1; + bs.state = (flagU == 0) ? NANDSIM_BAD_BLOCK : + NANDSIM_GOOD_BLOCK; + + err = ioctl(fd, NANDSIM_SET_BLOCK_STATE, &bs); + if (err) { + error("Could not set bad block(%d) for " + "controller (%d)!", + badblocks[idx], ctl); + err = EX_SOFTWARE; + break; + } + } + } + if (flagL != 0) { + /* If flag -L was specified (anywhere) */ + for (blkidx = 0; blkidx < cparams.blocks; blkidx++) { + bs.block_num = blkidx; + /* Do not change the wearout */ + bs.wearout = -1; + err = ioctl(fd, NANDSIM_GET_BLOCK_STATE, &bs); + if (err) { + error("Could not acquire block state"); + err = EX_SOFTWARE; + continue; + } + printf("Block#%d: wear count: %d %s\n", blkidx, + bs.wearout, + (bs.state == NANDSIM_BAD_BLOCK) ? "BAD":"GOOD"); + } + } + close(fd); + return (err); +} + +static int +cmdfreeze(int gargc __unused, char **gargv) +{ + int chip = 0, ctl = 0, err = 0, fd, i, start = 0, state, stop = 0; + struct sim_ctrl_chip ctrlchip; + + err = parse_devstring(gargv[2], &ctl, &chip); + if (err) + return (EX_USAGE); + + if (ctl == 0xff) { + error("You have to specify at least controller number"); + return (EX_USAGE); + } + + if (ctl != 0xff && chip == 0xff) { + start = 0; + stop = MAX_CTRL_CS - 1; + } else { + start = chip; + stop = chip; + } + + ctrlchip.ctrl_num = ctl; + + err = is_ctrl_running(ctl, &state); + if (err) + return (EX_SOFTWARE); + if (state == 0) { + error(MSG_NOTRUNNING, ctl); + return (EX_SOFTWARE); + } + + if (opendev(&fd) != EX_OK) + return (EX_OSFILE); + + for (i = start; i <= stop; i++) { + err = is_chip_created(ctl, i, &state); + if (err) + return (EX_SOFTWARE); + else if (state == 0) { + continue; + } + + ctrlchip.chip_num = i; + err = ioctl(fd, NANDSIM_FREEZE, &ctrlchip); + if (err) { + error("Could not freeze ctrl#%d chip#%d", ctl, i); + close(fd); + return (EX_SOFTWARE); + } + } + close(fd); + return (EX_OK); +} + +static int +cmdlog(int gargc __unused, char **gargv) +{ + struct sim_log log; + int chip = 0, ctl = 0, err = 0, fd, idx, start = 0, stop = 0; + char *logbuf; + + err = parse_devstring(gargv[2], &ctl, &chip); + if (err) + return (EX_USAGE); + + logbuf = (char *)malloc(sizeof(char) * NANDSIM_RAM_LOG_SIZE); + if (logbuf == NULL) { + error("Not enough memory to create log buffer"); + return (EX_SOFTWARE); + } + + memset(logbuf, 0, NANDSIM_RAM_LOG_SIZE); + log.log = logbuf; + log.len = NANDSIM_RAM_LOG_SIZE; + + if (ctl == 0xff) { + start = 0; + stop = MAX_SIM_DEV-1; + } else { + start = ctl; + stop = ctl; + } + + if (opendev(&fd) != EX_OK) { + free(logbuf); + return (EX_OSFILE); + } + + /* Print logs for selected controller(s) */ + for (idx = start; idx <= stop; idx++) { + log.ctrl_num = idx; + + err = ioctl(fd, NANDSIM_PRINT_LOG, &log); + if (err) { + error("Could not get log for controller %d!", idx); + continue; + } + + printf("Logs for controller#%d:\n%s\n", idx, logbuf); + } + + free(logbuf); + close(fd); + return (EX_OK); +} + +static int +cmdstats(int gargc __unused, char **gargv) +{ + int cdevd, chip = 0, ctl = 0, err = 0; + uint32_t pageno = 0; + + err = parse_devstring(gargv[2], &ctl, &chip); + + if (err) + return (EX_USAGE); + + if (chip == 0xff) { + error(MSG_CTRLCHIPNEEDED); + return (EX_USAGE); + } + + if (convert_arguint(gargv[3], &pageno) != 0) + return (EX_USAGE); + + if (!assert_chip_connected(ctl, chip)) + return (EX_SOFTWARE); + + if (opencdev(&cdevd, ctl, chip) != EX_OK) + return (EX_OSFILE); + + err = printstats(ctl, chip, pageno, cdevd); + if (err) { + close(cdevd); + return (EX_SOFTWARE); + } + close(cdevd); + return (EX_OK); +} + +static int +cmddump(int gargc __unused, char **gargv) +{ + struct sim_dump dump; + struct sim_block_state bs; + struct chip_param_io cparams; + int chip = 0, ctl = 0, err = EX_OK, fd, dumpfd; + uint32_t blkidx, bwritten = 0, totalwritten = 0; + void *buf; + + err = parse_devstring(gargv[2], &ctl, &chip); + if (err) + return (EX_USAGE); + + if (chip == 0xff || ctl == 0xff) { + error(MSG_CTRLCHIPNEEDED); + return (EX_USAGE); + } + + if (!assert_chip_connected(ctl, chip)) + return (EX_SOFTWARE); + + if (opencdev(&fd, ctl, chip) != EX_OK) + return (EX_OSFILE); + + err = ioctl(fd, NAND_IO_GET_CHIP_PARAM, &cparams); + if (err) { + error("Cannot get parameters for chip %d:%d", ctl, chip); + close(fd); + return (EX_SOFTWARE); + } + close(fd); + + dump.ctrl_num = ctl; + dump.chip_num = chip; + + dump.len = cparams.pages_per_block * (cparams.page_size + + cparams.oob_size); + + buf = malloc(dump.len); + if (buf == NULL) { + error("Could not allocate memory!"); + return (EX_SOFTWARE); + } + dump.data = buf; + + errno = 0; + dumpfd = open(gargv[3], O_WRONLY | O_CREAT, 0666); + if (dumpfd == -1) { + error("Cannot create dump file."); + free(buf); + return (EX_SOFTWARE); + } + + if (opendev(&fd)) { + close(dumpfd); + free(buf); + return (EX_SOFTWARE); + } + + bs.ctrl_num = ctl; + bs.chip_num = chip; + + /* First uint32_t in file shall contain block count */ + if (write(dumpfd, &cparams, sizeof(cparams)) < (int)sizeof(cparams)) { + error("Error writing to dumpfile!"); + close(fd); + close(dumpfd); + free(buf); + return (EX_SOFTWARE); + } + + /* + * First loop acquires blocks states and writes them to + * the dump file. + */ + for (blkidx = 0; blkidx < cparams.blocks; blkidx++) { + bs.block_num = blkidx; + err = ioctl(fd, NANDSIM_GET_BLOCK_STATE, &bs); + if (err) { + error("Could not get bad block(%d) for " + "controller (%d)!", blkidx, ctl); + close(fd); + close(dumpfd); + free(buf); + return (EX_SOFTWARE); + } + + bwritten = write(dumpfd, &bs, sizeof(bs)); + if (bwritten != sizeof(bs)) { + error("Error writing to dumpfile"); + close(fd); + close(dumpfd); + free(buf); + return (EX_SOFTWARE); + } + } + + /* Second loop dumps the data */ + for (blkidx = 0; blkidx < cparams.blocks; blkidx++) { + debug("Block#%d...", blkidx); + dump.block_num = blkidx; + + err = ioctl(fd, NANDSIM_DUMP, &dump); + if (err) { + error("Could not dump ctrl#%d chip#%d " + "block#%d", ctl, chip, blkidx); + err = EX_SOFTWARE; + break; + } + + bwritten = write(dumpfd, dump.data, dump.len); + if (bwritten != dump.len) { + error("Error writing to dumpfile"); + err = EX_SOFTWARE; + break; + } + debug("OK!\n"); + totalwritten += bwritten; + } + printf("%d out of %d B written.\n", totalwritten, dump.len * blkidx); + + close(fd); + close(dumpfd); + free(buf); + return (err); +} + +static int +cmdrestore(int gargc __unused, char **gargv) +{ + struct sim_dump dump; + struct sim_block_state bs; + struct stat filestat; + int chip = 0, ctl = 0, err = 0, fd, dumpfd = -1; + uint32_t blkidx, blksz, fsize = 0, expfilesz; + void *buf; + struct chip_param_io cparams, dumpcparams; + + err = parse_devstring(gargv[2], &ctl, &chip); + if (err) + return (EX_USAGE); + else if (ctl == 0xff) { + error(MSG_CTRLCHIPNEEDED); + return (EX_USAGE); + } + + if (!assert_chip_connected(ctl, chip)) + return (EX_SOFTWARE); + + /* Get chip geometry */ + if (opencdev(&fd, ctl, chip) != EX_OK) + return (EX_OSFILE); + + err = ioctl(fd, NAND_IO_GET_CHIP_PARAM, &cparams); + if (err) { + error("Cannot get parameters for chip %d:%d", ctl, chip); + close(fd); + return (err); + } + close(fd); + + /* Obtain dump file size */ + errno = 0; + if (stat(gargv[3], &filestat) != 0) { + error("Could not acquire file size! : %s", + strerror(errno)); + return (EX_IOERR); + } + + fsize = filestat.st_size; + blksz = cparams.pages_per_block * (cparams.page_size + + cparams.oob_size); + + /* Expected dump file size for chip */ + expfilesz = cparams.blocks * (blksz + sizeof(bs)) + sizeof(cparams); + + if (fsize != expfilesz) { + error("File size does not match chip geometry (file size: %d" + ", dump size: %d)", fsize, expfilesz); + return (EX_SOFTWARE); + } + + dumpfd = open(gargv[3], O_RDONLY); + if (dumpfd == -1) { + error("Could not open dump file!"); + return (EX_IOERR); + } + + /* Read chip params saved in dumpfile */ + read(dumpfd, &dumpcparams, sizeof(dumpcparams)); + + /* XXX */ + if (bcmp(&dumpcparams, &cparams, sizeof(cparams)) != 0) { + error("Supplied dump is created for a chip with different " + "chip configuration!"); + close(dumpfd); + return (EX_SOFTWARE); + } + + if (opendev(&fd) != EX_OK) { + close(dumpfd); + return (EX_OSFILE); + } + + buf = malloc(blksz); + if (buf == NULL) { + error("Could not allocate memory for block buffer"); + close(dumpfd); + close(fd); + return (EX_SOFTWARE); + } + + dump.ctrl_num = ctl; + dump.chip_num = chip; + dump.data = buf; + /* Restore block states and wearouts */ + for (blkidx = 0; blkidx < cparams.blocks; blkidx++) { + dump.block_num = blkidx; + if (read(dumpfd, &bs, sizeof(bs)) != sizeof(bs)) { + error("Error reading dumpfile"); + close(dumpfd); + close(fd); + free(buf); + return (EX_SOFTWARE); + } + bs.ctrl_num = ctl; + bs.chip_num = chip; + debug("BLKIDX=%d BLOCKS=%d CTRL=%d CHIP=%d STATE=%d\n" + "WEAROUT=%d BS.CTRL_NUM=%d BS.CHIP_NUM=%d\n", + blkidx, cparams.blocks, dump.ctrl_num, dump.chip_num, + bs.state, bs.wearout, bs.ctrl_num, bs.chip_num); + + err = ioctl(fd, NANDSIM_SET_BLOCK_STATE, &bs); + if (err) { + error("Could not set bad block(%d) for " + "controller: %d, chip: %d!", blkidx, ctl, chip); + close(dumpfd); + close(fd); + free(buf); + return (EX_SOFTWARE); + } + } + /* Restore data */ + for (blkidx = 0; blkidx < cparams.blocks; blkidx++) { + errno = 0; + dump.len = read(dumpfd, buf, blksz); + if (errno) { + error("Failed to read block#%d from dumpfile.", blkidx); + err = EX_SOFTWARE; + break; + } + dump.block_num = blkidx; + err = ioctl(fd, NANDSIM_RESTORE, &dump); + if (err) { + error("Could not restore block#%d of ctrl#%d chip#%d" + ": %s", blkidx, ctl, chip, strerror(errno)); + err = EX_SOFTWARE; + break; + } + } + + free(buf); + close(dumpfd); + close(fd); + return (err); + +} + +static int +cmddestroy(int gargc __unused, char **gargv) +{ + int chip = 0, ctl = 0, err = 0, fd, idx, idx2, state; + int chipstart, chipstop, ctrlstart, ctrlstop; + struct sim_chip_destroy chip_destroy; + + err = parse_devstring(gargv[2], &ctl, &chip); + + if (err) + return (EX_USAGE); + + if (ctl == 0xff) { + /* Every chip at every controller */ + ctrlstart = chipstart = 0; + ctrlstop = MAX_SIM_DEV - 1; + chipstop = MAX_CTRL_CS - 1; + } else { + ctrlstart = ctrlstop = ctl; + if (chip == 0xff) { + /* Every chip at selected controller */ + chipstart = 0; + chipstop = MAX_CTRL_CS - 1; + } else + /* Selected chip at selected controller */ + chipstart = chipstop = chip; + } + debug("CTRLSTART=%d CTRLSTOP=%d CHIPSTART=%d CHIPSTOP=%d\n", + ctrlstart, ctrlstop, chipstart, chipstop); + for (idx = ctrlstart; idx <= ctrlstop; idx++) { + err = is_ctrl_created(idx, &state); + if (err) { + error("Could not acquire ctrl#%d state. Cannot " + "destroy controller.", idx); + return (EX_SOFTWARE); + } + if (state == 0) { + continue; + } + err = is_ctrl_running(idx, &state); + if (err) { + error(MSG_STATUSACQCTRL, idx); + return (EX_SOFTWARE); + } + if (state != 0) { + error(MSG_RUNNING, ctl); + return (EX_SOFTWARE); + } + if (opendev(&fd) != EX_OK) + return (EX_OSFILE); + + for (idx2 = chipstart; idx2 <= chipstop; idx2++) { + err = is_chip_created(idx, idx2, &state); + if (err) { + error(MSG_STATUSACQCTRLCHIP, idx2, idx); + continue; + } + if (state == 0) + /* There is no such chip running */ + continue; + chip_destroy.ctrl_num = idx; + chip_destroy.chip_num = idx2; + ioctl(fd, NANDSIM_DESTROY_CHIP, + &chip_destroy); + } + /* If chip isn't explicitly specified -- destroy ctrl */ + if (chip == 0xff) { + err = ioctl(fd, NANDSIM_DESTROY_CTRL, &idx); + if (err) { + error("Could not destroy ctrl#%d", idx); + continue; + } + } + close(fd); + } + return (err); +} + +int +main(int argc, char **argv) +{ + struct nandsim_command *cmdopts; + int retcode = 0; + + if (argc < 2) { + cmdhelp(argc, argv); + retcode = EX_USAGE; + } else { + cmdopts = getcommand(argv[1]); + if (cmdopts != NULL && cmdopts->commandfunc != NULL) { + if (checkusage(argc, cmdopts->req_argc, argv) == 1) { + /* Print command specific usage */ + printf("nandsim %s", cmdopts->usagestring); + return (EX_USAGE); + } + retcode = cmdopts->commandfunc(argc, argv); + + if (retcode == EX_USAGE) { + /* Print command-specific usage */ + printf("nandsim %s", cmdopts->usagestring); + } else if (retcode == EX_OSFILE) { + error("Could not open device file"); + } + + } else { + error("Unknown command!"); + retcode = EX_USAGE; + } + } + return (retcode); +} + +static int +cmdhelp(int gargc __unused, char **gargv __unused) +{ + struct nandsim_command *opts; + + printf("usage: nandsim [command params] [params]\n\n"); + + for (opts = commands; (opts != NULL) && + (opts->cmd_name != NULL); opts++) + printf("nandsim %s", opts->usagestring); + + printf("\n"); + return (EX_OK); +} + +static void +printchip(struct sim_chip *chip, uint8_t verbose) +{ + + if (chip->created == 0) + return; + if (verbose > 0) { + printf("\n[Chip info]\n"); + printf("num= %d\nctrl_num=%d\ndevice_id=%02x" + "\tmanufacturer_id=%02x\ndevice_model=%s\nmanufacturer=" + "%s\ncol_addr_cycles=%d\nrow_addr_cycles=%d" + "\npage_size=%d\noob_size=%d\npages_per_block=%d\n" + "blocks_per_lun=%d\nluns=%d\n\nprog_time=%d\n" + "erase_time=%d\nread_time=%d\n" + "error_ratio=%d\nwear_level=%d\nwrite_protect=%c\n" + "chip_width=%db\n", chip->num, chip->ctrl_num, + chip->device_id, chip->manufact_id,chip->device_model, + chip->manufacturer, chip->col_addr_cycles, + chip->row_addr_cycles, chip->page_size, + chip->oob_size, chip->pgs_per_blk, chip->blks_per_lun, + chip->luns,chip->prog_time, chip->erase_time, + chip->read_time, chip->error_ratio, chip->wear_level, + (chip->is_wp == 0) ? 'N':'Y', chip->width); + } else { + printf("[Chip info]\n"); + printf("\tnum=%d\n\tdevice_model=%s\n\tmanufacturer=%s\n" + "\tpage_size=%d\n\twrite_protect=%s\n", + chip->num, chip->device_model, chip->manufacturer, + chip->page_size, (chip->is_wp == 0) ? "NO":"YES"); + } +} + +static void +printctrl(struct sim_ctrl *ctrl) +{ + int i; + + if (ctrl->created == 0) { + printf(MSG_NOCTRL "\n", ctrl->num); + return; + } + printf("\n[Controller info]\n"); + printf("\trunning: %s\n", ctrl->running ? "yes" : "no"); + printf("\tnum cs: %d\n", ctrl->num_cs); + printf("\tecc: %d\n", ctrl->ecc); + printf("\tlog_filename: %s\n", ctrl->filename); + printf("\tecc_layout:"); + for (i = 0; i < MAX_ECC_BYTES; i++) { + if (ctrl->ecc_layout[i] == 0xffff) + break; + else + printf("%c%d", i%16 ? ' ' : '\n', + ctrl->ecc_layout[i]); + } + printf("\n"); +} + +static int +is_ctrl_running(int ctrl_no, int *running) +{ + struct sim_ctrl ctrl; + int err, fd; + + ctrl.num = ctrl_no; + if (opendev(&fd) != EX_OK) + return (EX_OSFILE); + + err = ioctl(fd, NANDSIM_STATUS_CTRL, &ctrl); + if (err) { + error(MSG_STATUSACQCTRL, ctrl_no); + close(fd); + return (err); + } + *running = ctrl.running; + close(fd); + return (0); +} + +static int +is_ctrl_created(int ctrl_no, int *created) +{ + struct sim_ctrl ctrl; + int err, fd; + + ctrl.num = ctrl_no; + + if (opendev(&fd) != EX_OK) + return (EX_OSFILE); + + err = ioctl(fd, NANDSIM_STATUS_CTRL, &ctrl); + if (err) { + error("Could not acquire conf for ctrl#%d", ctrl_no); + close(fd); + return (err); + } + *created = ctrl.created; + close(fd); + return (0); +} + +static int +is_chip_created(int ctrl_no, int chip_no, int *created) +{ + struct sim_chip chip; + int err, fd; + + chip.ctrl_num = ctrl_no; + chip.num = chip_no; + + if (opendev(&fd) != EX_OK) + return (EX_OSFILE); + + err = ioctl(fd, NANDSIM_STATUS_CHIP, &chip); + if (err) { + error("Could not acquire conf for chip#%d", chip_no); + close(fd); + return (err); + } + *created = chip.created; + close(fd); + return (0); +} + +static int +assert_chip_connected(int ctrl_no, int chip_no) +{ + int created, running; + + if (is_ctrl_created(ctrl_no, &created)) + return (0); + + if (!created) { + error(MSG_NOCTRL, ctrl_no); + return (0); + } + + if (is_chip_created(ctrl_no, chip_no, &created)) + return (0); + + if (!created) { + error(MSG_NOTCONFIGDCTRLCHIP, ctrl_no, chip_no); + return (0); + } + + if (is_ctrl_running(ctrl_no, &running)) + return (0); + + if (!running) { + error(MSG_NOTRUNNING, ctrl_no); + return (0); + } + + return (1); +} + +static int +printstats(int ctrlno, int chipno, uint32_t pageno, int cdevd) +{ + struct page_stat_io pstats; + struct block_stat_io bstats; + struct chip_param_io cparams; + uint32_t blkidx; + int err; + + /* Gather information about chip */ + err = ioctl(cdevd, NAND_IO_GET_CHIP_PARAM, &cparams); + + if (err) { + error("Could not acquire chip info for chip attached to cs#" + "%d, ctrl#%d", chipno, ctrlno); + return (EX_SOFTWARE); + } + + blkidx = (pageno / cparams.pages_per_block); + bstats.block_num = blkidx; + + err = ioctl(cdevd, NAND_IO_BLOCK_STAT, &bstats); + if (err) { + error("Could not acquire block#%d statistics!", blkidx); + return (ENXIO); + } + + printf("Block #%d erased: %d\n", blkidx, bstats.block_erased); + pstats.page_num = pageno; + + err = ioctl(cdevd, NAND_IO_PAGE_STAT, &pstats); + if (err) { + error("Could not acquire page statistics!"); + return (ENXIO); + } + + debug("BLOCKIDX = %d PAGENO (REL. TO BLK) = %d\n", blkidx, + pstats.page_num); + + printf("Page#%d : reads:%d writes:%d \n\traw reads:%d raw writes:%d " + "\n\tecc_succeeded:%d ecc_corrected:%d ecc_failed:%d\n", + pstats.page_num, pstats.page_read, pstats.page_written, + pstats.page_raw_read, pstats.page_raw_written, + pstats.ecc_succeded, pstats.ecc_corrected, pstats.ecc_failed); + return (0); +} diff --git a/usr.sbin/nandsim/nandsim_cfgparse.c b/usr.sbin/nandsim/nandsim_cfgparse.c new file mode 100644 index 00000000000..d6a7cd69720 --- /dev/null +++ b/usr.sbin/nandsim/nandsim_cfgparse.c @@ -0,0 +1,959 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "nandsim_cfgparse.h" + +#define warn(fmt, args...) do { \ + printf("WARNING: " fmt "\n", ##args); } while (0) + +#define error(fmt, args...) do { \ + printf("ERROR: " fmt "\n", ##args); } while (0) + +#define MSG_MANDATORYKEYMISSING "mandatory key \"%s\" value belonging to " \ + "section \"%s\" is missing!\n" + +#define DEBUG +#undef DEBUG + +#ifdef DEBUG +#define debug(fmt, args...) do { \ + printf("NANDSIM_CONF:" fmt "\n", ##args); } while (0) +#else +#define debug(fmt, args...) do {} while(0) +#endif + +#define STRBUFSIZ 2000 + +/* Macros extracts type and type size */ +#define TYPE(x) ((x) & 0xf8) +#define SIZE(x) (((x) & 0x07)) + +/* Erase/Prog/Read time max and min values */ +#define DELAYTIME_MIN 10000 +#define DELAYTIME_MAX 10000000 + +/* Structure holding configuration for controller. */ +static struct sim_ctrl ctrl_conf; +/* Structure holding configuration for chip. */ +static struct sim_chip chip_conf; + +static struct nandsim_key nandsim_ctrl_keys[] = { + {"num_cs", 1, VALUE_UINT | SIZE_8, (void *)&ctrl_conf.num_cs, 0}, + {"ctrl_num", 1, VALUE_UINT | SIZE_8, (void *)&ctrl_conf.num, 0}, + + {"ecc_layout", 1, VALUE_UINTARRAY | SIZE_16, + (void *)&ctrl_conf.ecc_layout, MAX_ECC_BYTES}, + + {"filename", 0, VALUE_STRING, + (void *)&ctrl_conf.filename, FILENAME_SIZE}, + + {"ecc", 0, VALUE_BOOL, (void *)&ctrl_conf.ecc, 0}, + {NULL, 0, 0, NULL, 0}, +}; + +static struct nandsim_key nandsim_chip_keys[] = { + {"chip_cs", 1, VALUE_UINT | SIZE_8, (void *)&chip_conf.num, 0}, + {"chip_ctrl", 1, VALUE_UINT | SIZE_8, (void *)&chip_conf.ctrl_num, + 0}, + {"device_id", 1, VALUE_UINT | SIZE_8, (void *)&chip_conf.device_id, + 0}, + {"manufacturer_id", 1, VALUE_UINT | SIZE_8, + (void *)&chip_conf.manufact_id, 0}, + {"model", 0, VALUE_STRING, (void *)&chip_conf.device_model, + DEV_MODEL_STR_SIZE}, + {"manufacturer", 0, VALUE_STRING, (void *)&chip_conf.manufacturer, + MAN_STR_SIZE}, + {"page_size", 1, VALUE_UINT | SIZE_32, (void *)&chip_conf.page_size, + 0}, + {"oob_size", 1, VALUE_UINT | SIZE_32, (void *)&chip_conf.oob_size, + 0}, + {"pages_per_block", 1, VALUE_UINT | SIZE_32, + (void *)&chip_conf.pgs_per_blk, 0}, + {"blocks_per_lun", 1, VALUE_UINT | SIZE_32, + (void *)&chip_conf.blks_per_lun, 0}, + {"luns", 1, VALUE_UINT | SIZE_32, (void *)&chip_conf.luns, 0}, + {"column_addr_cycle", 1,VALUE_UINT | SIZE_8, + (void *)&chip_conf.col_addr_cycles, 0}, + {"row_addr_cycle", 1, VALUE_UINT | SIZE_8, + (void *)&chip_conf.row_addr_cycles, 0}, + {"program_time", 0, VALUE_UINT | SIZE_32, + (void *)&chip_conf.prog_time, 0}, + {"erase_time", 0, VALUE_UINT | SIZE_32, + (void *)&chip_conf.erase_time, 0}, + {"read_time", 0, VALUE_UINT | SIZE_32, + (void *)&chip_conf.read_time, 0}, + {"width", 1, VALUE_UINT | SIZE_8, (void *)&chip_conf.width, 0}, + {"wear_out", 1, VALUE_UINT | SIZE_32, (void *)&chip_conf.wear_level, + 0}, + {"bad_block_map", 0, VALUE_UINTARRAY | SIZE_32, + (void *)&chip_conf.bad_block_map, MAX_BAD_BLOCKS}, + {NULL, 0, 0, NULL, 0}, +}; + +struct nandsim_section sections[] = { + {"ctrl", (struct nandsim_key *)&nandsim_ctrl_keys}, + {"chip", (struct nandsim_key *)&nandsim_chip_keys}, + {NULL, NULL}, +}; + +static uint8_t logoutputtoint(char *, int *); +static uint8_t validate_chips(struct sim_chip *, int, struct sim_ctrl *, int); +static uint8_t validate_ctrls(struct sim_ctrl *, int); +static int configure_sim(const char *, struct rcfile *); +static int create_ctrls(struct rcfile *, struct sim_ctrl **, int *); +static int create_chips(struct rcfile *, struct sim_chip **, int *); +static void destroy_ctrls(struct sim_ctrl *); +static void destroy_chips(struct sim_chip *); +static int validate_section_config(struct rcfile *, const char *, int); + +int +convert_argint(char *arg, int *value) +{ + + if (arg == NULL || value == NULL) + return (EINVAL); + + errno = 0; + *value = (int)strtol(arg, NULL, 0); + if (*value == 0 && errno != 0) { + error("Cannot convert to number argument \'%s\'", arg); + return (EINVAL); + } + return (0); +} + +int +convert_arguint(char *arg, unsigned int *value) +{ + + if (arg == NULL || value == NULL) + return (EINVAL); + + errno = 0; + *value = (unsigned int)strtol(arg, NULL, 0); + if (*value == 0 && errno != 0) { + error("Cannot convert to number argument \'%s\'", arg); + return (EINVAL); + } + return (0); +} + +/* Parse given ',' separated list of bytes into buffer. */ +int +parse_intarray(char *array, int **buffer) +{ + char *tmp, *tmpstr, *origstr; + unsigned int currbufp = 0, i; + unsigned int count = 0, from = 0, to = 0; + + /* Remove square braces */ + if (array[0] == '[') + array ++; + if (array[strlen(array)-1] == ']') + array[strlen(array)-1] = ','; + + from = strlen(array); + origstr = (char *)malloc(sizeof(char) * from); + strcpy(origstr, array); + + tmpstr = (char *)strtok(array, ","); + /* First loop checks for how big int array we need to allocate */ + while (tmpstr != NULL) { + errno = 0; + if ((tmp = strchr(tmpstr, '-')) != NULL) { + *tmp = ' '; + if (convert_arguint(tmpstr, &from) || + convert_arguint(tmp, &to)) { + free(origstr); + return (EINVAL); + } + + count += to - from + 1; + } else { + if (convert_arguint(tmpstr, &from)) { + free(origstr); + return (EINVAL); + } + count++; + } + tmpstr = (char *)strtok(NULL, ","); + } + + if (count == 0) + goto out; + + /* Allocate buffer of ints */ + tmpstr = (char *)strtok(origstr, ","); + *buffer = malloc(count * sizeof(int)); + + /* Second loop is just inserting converted values into int array */ + while (tmpstr != NULL) { + errno = 0; + if ((tmp = strchr(tmpstr, '-')) != NULL) { + *tmp = ' '; + from = strtol(tmpstr, NULL, 0); + to = strtol(tmp, NULL, 0); + tmpstr = strtok(NULL, ","); + for (i = from; i <= to; i ++) + (*buffer)[currbufp++] = i; + continue; + } + errno = 0; + from = (int)strtol(tmpstr, NULL, 0); + (*buffer)[currbufp++] = from; + tmpstr = (char *)strtok(NULL, ","); + } +out: + free(origstr); + return (count); +} + +/* Convert logoutput strings literals into appropriate ints. */ +static uint8_t +logoutputtoint(char *logoutput, int *output) +{ + int out; + + if (strcmp(logoutput, "file") == 0) + out = NANDSIM_OUTPUT_FILE; + + else if (strcmp(logoutput, "console") == 0) + out = NANDSIM_OUTPUT_CONSOLE; + + else if (strcmp(logoutput, "ram") == 0) + out = NANDSIM_OUTPUT_RAM; + + else if (strcmp(logoutput, "none") == 0) + out = NANDSIM_OUTPUT_NONE; + else + out = -1; + + *output = out; + + if (out == -1) + return (EINVAL); + else + return (0); +} + +static int +configure_sim(const char *devfname, struct rcfile *f) +{ + struct sim_param sim_conf; + char buf[255]; + int err, tmpv, fd; + + err = rc_getint(f, "sim", 0, "log_level", &tmpv); + + if (tmpv < 0 || tmpv > 255 || err) { + error("Bad log level specified (%d)\n", tmpv); + return (ENOTSUP); + } else + sim_conf.log_level = tmpv; + + rc_getstring(f, "sim", 0, "log_output", 255, (char *)&buf); + + tmpv = -1; + err = logoutputtoint((char *)&buf, &tmpv); + if (err) { + error("Log output specified in config file does not seem to " + "be valid (%s)!", (char *)&buf); + return (ENOTSUP); + } + + sim_conf.log_output = tmpv; + + fd = open(devfname, O_RDWR); + if (fd == -1) { + error("could not open simulator device file (%s)!", + devfname); + return (EX_OSFILE); + } + + err = ioctl(fd, NANDSIM_SIM_PARAM, &sim_conf); + if (err) { + error("simulator parameters could not be modified: %s", + strerror(errno)); + close(fd); + return (ENXIO); + } + + close(fd); + return (EX_OK); +} + +static int +create_ctrls(struct rcfile *f, struct sim_ctrl **ctrls, int *cnt) +{ + int count, i; + struct sim_ctrl *ctrlsptr; + + count = rc_getsectionscount(f, "ctrl"); + if (count > MAX_SIM_DEV) { + error("Too many CTRL sections specified(%d)", count); + return (ENOTSUP); + } else if (count == 0) { + error("No ctrl sections specified"); + return (ENOENT); + } + + ctrlsptr = (struct sim_ctrl *)malloc(sizeof(struct sim_ctrl) * count); + if (ctrlsptr == NULL) { + error("Could not allocate memory for ctrl configuration"); + return (ENOMEM); + } + + for (i = 0; i < count; i++) { + bzero((void *)&ctrl_conf, sizeof(ctrl_conf)); + + /* + * ECC layout have to end up with 0xffff, so + * we're filling buffer with 0xff. If ecc_layout is + * defined in config file, values will be overriden. + */ + memset((void *)&ctrl_conf.ecc_layout, 0xff, + sizeof(ctrl_conf.ecc_layout)); + + if (validate_section_config(f, "ctrl", i) != 0) { + free(ctrlsptr); + return (EINVAL); + } + + if (parse_section(f, "ctrl", i) != 0) { + free(ctrlsptr); + return (EINVAL); + } + + memcpy(&ctrlsptr[i], &ctrl_conf, sizeof(ctrl_conf)); + /* Try to create ctrl with config parsed */ + debug("NUM=%d\nNUM_CS=%d\nECC=%d\nFILENAME=%s\nECC_LAYOUT[0]" + "=%d\nECC_LAYOUT[1]=%d\n\n", + ctrlsptr[i].num, ctrlsptr[i].num_cs, ctrlsptr[i].ecc, + ctrlsptr[i].filename, ctrlsptr[i].ecc_layout[0], + ctrlsptr[i].ecc_layout[1]); + } + *cnt = count; + *ctrls = ctrlsptr; + return (0); +} + +static void +destroy_ctrls(struct sim_ctrl *ctrls) +{ + + free(ctrls); +} + +static int +create_chips(struct rcfile *f, struct sim_chip **chips, int *cnt) +{ + struct sim_chip *chipsptr; + int count, i; + + count = rc_getsectionscount(f, "chip"); + if (count > (MAX_CTRL_CS * MAX_SIM_DEV)) { + error("Too many chip sections specified(%d)", count); + return (ENOTSUP); + } else if (count == 0) { + error("No chip sections specified"); + return (ENOENT); + } + + chipsptr = (struct sim_chip *)malloc(sizeof(struct sim_chip) * count); + if (chipsptr == NULL) { + error("Could not allocate memory for chip configuration"); + return (ENOMEM); + } + + for (i = 0; i < count; i++) { + bzero((void *)&chip_conf, sizeof(chip_conf)); + + /* + * Bad block map have to end up with 0xffff, so + * we're filling array with 0xff. If bad block map is + * defined in config file, values will be overriden. + */ + memset((void *)&chip_conf.bad_block_map, 0xff, + sizeof(chip_conf.bad_block_map)); + + if (validate_section_config(f, "chip", i) != 0) { + free(chipsptr); + return (EINVAL); + } + + if (parse_section(f, "chip", i) != 0) { + free(chipsptr); + return (EINVAL); + } + + memcpy(&chipsptr[i], &chip_conf, sizeof(chip_conf)); + + /* Try to create chip with config parsed */ + debug("CHIP:\nNUM=%d\nCTRL_NUM=%d\nDEVID=%d\nMANID=%d\n" + "PAGE_SZ=%d\nOOBSZ=%d\nREAD_T=%d\nDEVMODEL=%s\n" + "MAN=%s\nCOLADDRCYCLES=%d\nROWADDRCYCLES=%d\nCHWIDTH=%d\n" + "PGS/BLK=%d\nBLK/LUN=%d\nLUNS=%d\nERR_RATIO=%d\n" + "WEARLEVEL=%d\nISWP=%d\n\n\n\n", + chipsptr[i].num, chipsptr[i].ctrl_num, + chipsptr[i].device_id, chipsptr[i].manufact_id, + chipsptr[i].page_size, chipsptr[i].oob_size, + chipsptr[i].read_time, chipsptr[i].device_model, + chipsptr[i].manufacturer, chipsptr[i].col_addr_cycles, + chipsptr[i].row_addr_cycles, chipsptr[i].width, + chipsptr[i].pgs_per_blk, chipsptr[i].blks_per_lun, + chipsptr[i].luns, chipsptr[i].error_ratio, + chipsptr[i].wear_level, chipsptr[i].is_wp); + } + *cnt = count; + *chips = chipsptr; + return (0); +} + +static void +destroy_chips(struct sim_chip *chips) +{ + + free(chips); +} + +int +parse_config(char *cfgfname, const char *devfname) +{ + int err = 0, fd; + unsigned int chipsectionscnt, ctrlsectionscnt, i; + struct rcfile *f; + struct sim_chip *chips; + struct sim_ctrl *ctrls; + + err = rc_open(cfgfname, "r", &f); + if (err) { + error("could not open configuration file (%s)", cfgfname); + return (EX_NOINPUT); + } + + /* First, try to configure simulator itself. */ + if (configure_sim(devfname, f) != EX_OK) { + rc_close(f); + return (EINVAL); + } + + debug("SIM CONFIGURED!\n"); + /* Then create controllers' configs */ + if (create_ctrls(f, &ctrls, &ctrlsectionscnt) != 0) { + rc_close(f); + return (ENXIO); + } + debug("CTRLS CONFIG READ!\n"); + + /* Then create chips' configs */ + if (create_chips(f, &chips, &chipsectionscnt) != 0) { + destroy_ctrls(ctrls); + rc_close(f); + return (ENXIO); + } + debug("CHIPS CONFIG READ!\n"); + + if (validate_ctrls(ctrls, ctrlsectionscnt) != 0) { + destroy_ctrls(ctrls); + destroy_chips(chips); + rc_close(f); + return (EX_SOFTWARE); + } + if (validate_chips(chips, chipsectionscnt, ctrls, + ctrlsectionscnt) != 0) { + destroy_ctrls(ctrls); + destroy_chips(chips); + rc_close(f); + return (EX_SOFTWARE); + } + + /* Open device */ + fd = open(devfname, O_RDWR); + if (fd == -1) { + error("could not open simulator device file (%s)!", + devfname); + rc_close(f); + destroy_chips(chips); + destroy_ctrls(ctrls); + return (EX_OSFILE); + } + + debug("SIM CONFIG STARTED!\n"); + + /* At this stage, both ctrls' and chips' configs should be valid */ + for (i = 0; i < ctrlsectionscnt; i++) { + err = ioctl(fd, NANDSIM_CREATE_CTRL, &ctrls[i]); + if (err) { + if (err == EEXIST) + error("Controller#%d already created\n", + ctrls[i].num); + else if (err == EINVAL) + error("Incorrect controler number (%d)\n", + ctrls[i].num); + else + error("Could not created controller#%d\n", + ctrls[i].num); + /* Errors during controller creation stops parsing */ + close(fd); + rc_close(f); + destroy_ctrls(ctrls); + destroy_chips(chips); + return (ENXIO); + } + debug("CTRL#%d CONFIG STARTED!\n", i); + } + + for (i = 0; i < chipsectionscnt; i++) { + err = ioctl(fd, NANDSIM_CREATE_CHIP, &chips[i]); + if (err) { + if (err == EEXIST) + error("Chip#%d for controller#%d already " + "created\n", chips[i].num, + chips[i].ctrl_num); + else if (err == EINVAL) + error("Incorrect chip number (%d:%d)\n", + chips[i].num, chips[i].ctrl_num); + else + error("Could not create chip (%d:%d)\n", + chips[i].num, chips[i].ctrl_num); + error("Could not start chip#%d\n", i); + destroy_chips(chips); + destroy_ctrls(ctrls); + close(fd); + rc_close(f); + return (ENXIO); + } + } + debug("CHIPS CONFIG STARTED!\n"); + + close(fd); + rc_close(f); + destroy_chips(chips); + destroy_ctrls(ctrls); + return (0); +} + +/* + * Function tries to get appropriate value for given key, convert it to + * array of ints (of given size), and perform all the neccesary checks and + * conversions. + */ +static int +get_argument_intarray(const char *sect_name, int sectno, + struct nandsim_key *key, struct rcfile *f) +{ + char strbuf[STRBUFSIZ]; + int *intbuf; + int getres; + uint32_t cnt, i = 0; + + getres = rc_getstring(f, sect_name, sectno, key->keyname, STRBUFSIZ, + (char *)&strbuf); + + if (getres != 0) { + if (key->mandatory != 0) { + error(MSG_MANDATORYKEYMISSING, key->keyname, + sect_name); + return (EINVAL); + } else + /* Non-mandatory key, not present -- skip */ + return (0); + } + cnt = parse_intarray((char *)&strbuf, &intbuf); + cnt = (cnt <= key->maxlength) ? cnt : key->maxlength; + + for (i = 0; i < cnt; i++) { + if (SIZE(key->valuetype) == SIZE_8) + *((uint8_t *)(key->field) + i) = + (uint8_t)intbuf[i]; + else if (SIZE(key->valuetype) == SIZE_16) + *((uint16_t *)(key->field) + i) = + (uint16_t)intbuf[i]; + else + *((uint32_t *)(key->field) + i) = + (uint32_t)intbuf[i]; + } + free(intbuf); + return (0); +} + +/* + * Function tries to get appropriate value for given key, convert it to + * int of certain length. + */ +static int +get_argument_int(const char *sect_name, int sectno, struct nandsim_key *key, + struct rcfile *f) +{ + int getres; + uint32_t val; + + getres = rc_getint(f, sect_name, sectno, key->keyname, &val); + if (getres != 0) { + + if (key->mandatory != 0) { + error(MSG_MANDATORYKEYMISSING, key->keyname, + sect_name); + + return (EINVAL); + } else + /* Non-mandatory key, not present -- skip */ + return (0); + } + if (SIZE(key->valuetype) == SIZE_8) + *(uint8_t *)(key->field) = (uint8_t)val; + else if (SIZE(key->valuetype) == SIZE_16) + *(uint16_t *)(key->field) = (uint16_t)val; + else + *(uint32_t *)(key->field) = (uint32_t)val; + return (0); +} + +/* Function tries to get string value for given key */ +static int +get_argument_string(const char *sect_name, int sectno, + struct nandsim_key *key, struct rcfile *f) +{ + char strbuf[STRBUFSIZ]; + int getres; + + getres = rc_getstring(f, sect_name, sectno, key->keyname, STRBUFSIZ, + strbuf); + + if (getres != 0) { + if (key->mandatory != 0) { + error(MSG_MANDATORYKEYMISSING, key->keyname, + sect_name); + return (1); + } else + /* Non-mandatory key, not present -- skip */ + return (0); + } + strncpy(key->field, (char *)&strbuf, (size_t)(key->maxlength - 1)); + return (0); +} + +/* Function tries to get on/off value for given key */ +static int +get_argument_bool(const char *sect_name, int sectno, struct nandsim_key *key, + struct rcfile *f) +{ + int getres, val; + + getres = rc_getbool(f, sect_name, sectno, key->keyname, &val); + if (getres != 0) { + if (key->mandatory != 0) { + error(MSG_MANDATORYKEYMISSING, key->keyname, + sect_name); + return (1); + } else + /* Non-mandatory key, not present -- skip */ + return (0); + } + *(uint8_t *)key->field = (uint8_t)val; + return (0); +} + +int +parse_section(struct rcfile *f, const char *sect_name, int sectno) +{ + struct nandsim_key *key; + struct nandsim_section *sect = (struct nandsim_section *)§ions; + int getres = 0; + + while (1) { + if (sect == NULL) + return (EINVAL); + + if (strcmp(sect->name, sect_name) == 0) + break; + else + sect++; + } + key = sect->keys; + do { + debug("->Section: %s, Key: %s, type: %d, size: %d", + sect_name, key->keyname, TYPE(key->valuetype), + SIZE(key->valuetype)/2); + + switch (TYPE(key->valuetype)) { + case VALUE_UINT: + /* Single int value */ + getres = get_argument_int(sect_name, sectno, key, f); + + if (getres != 0) + return (getres); + + break; + case VALUE_UINTARRAY: + /* Array of ints */ + getres = get_argument_intarray(sect_name, + sectno, key, f); + + if (getres != 0) + return (getres); + + break; + case VALUE_STRING: + /* Array of chars */ + getres = get_argument_string(sect_name, sectno, key, + f); + + if (getres != 0) + return (getres); + + break; + case VALUE_BOOL: + /* Boolean value (true/false/on/off/yes/no) */ + getres = get_argument_bool(sect_name, sectno, key, + f); + + if (getres != 0) + return (getres); + + break; + } + } while ((++key)->keyname != NULL); + + return (0); +} + +static uint8_t +validate_chips(struct sim_chip *chips, int chipcnt, + struct sim_ctrl *ctrls, int ctrlcnt) +{ + int cchipcnt, i, width, j, id, max; + + cchipcnt = chipcnt; + for (chipcnt -= 1; chipcnt >= 0; chipcnt--) { + if (chips[chipcnt].num >= MAX_CTRL_CS) { + error("chip no. too high (%d)!!\n", + chips[chipcnt].num); + return (EINVAL); + } + + if (chips[chipcnt].ctrl_num >= MAX_SIM_DEV) { + error("controller no. too high (%d)!!\n", + chips[chipcnt].ctrl_num); + return (EINVAL); + } + + if (chips[chipcnt].width != 8 && + chips[chipcnt].width != 16) { + error("invalid width:%d for chip#%d", + chips[chipcnt].width, chips[chipcnt].num); + return (EINVAL); + } + + /* Check if page size is > 512 and if its power of 2 */ + if (chips[chipcnt].page_size < 512 || + (chips[chipcnt].page_size & + (chips[chipcnt].page_size - 1)) != 0) { + error("invalid page size:%d for chip#%d at ctrl#%d!!" + "\n", chips[chipcnt].page_size, + chips[chipcnt].num, + chips[chipcnt].ctrl_num); + return (EINVAL); + } + + /* Check if controller no. ctrl_num is configured */ + for (i = 0, id = -1; i < ctrlcnt && id == -1; i++) + if (ctrls[i].num == chips[chipcnt].ctrl_num) + id = i; + + if (i == ctrlcnt && id == -1) { + error("Missing configuration for controller %d" + " (at least one chip is connected to it)", + chips[chipcnt].ctrl_num); + return (EINVAL); + } else { + /* + * Controller is configured -> check oob_size + * validity + */ + i = 0; + max = ctrls[id].ecc_layout[0]; + while (i < MAX_ECC_BYTES && + ctrls[id].ecc_layout[i] != 0xffff) { + + if (ctrls[id].ecc_layout[i] > max) + max = ctrls[id].ecc_layout[i]; + i++; + } + + if (chips[chipcnt].oob_size < (unsigned)i) { + error("OOB size for chip#%d at ctrl#%d is " + "smaller than ecc layout length!", + chips[chipcnt].num, + chips[chipcnt].ctrl_num); + exit(EINVAL); + } + + if (chips[chipcnt].oob_size < (unsigned)max) { + error("OOB size for chip#%d at ctrl#%d is " + "smaller than maximal ecc position in " + "defined layout!", chips[chipcnt].num, + chips[chipcnt].ctrl_num); + exit(EINVAL); + } + + + } + + if ((chips[chipcnt].erase_time < DELAYTIME_MIN || + chips[chipcnt].erase_time > DELAYTIME_MAX) && + chips[chipcnt].erase_time != 0) { + error("Invalid erase time value for chip#%d at " + "ctrl#%d", + chips[chipcnt].num, + chips[chipcnt].ctrl_num); + return (EINVAL); + } + + if ((chips[chipcnt].prog_time < DELAYTIME_MIN || + chips[chipcnt].prog_time > DELAYTIME_MAX) && + chips[chipcnt].prog_time != 0) { + error("Invalid prog time value for chip#%d at " + "ctr#%d!", + chips[chipcnt].num, + chips[chipcnt].ctrl_num); + return (EINVAL); + } + + if ((chips[chipcnt].read_time < DELAYTIME_MIN || + chips[chipcnt].read_time > DELAYTIME_MAX) && + chips[chipcnt].read_time != 0) { + error("Invalid read time value for chip#%d at " + "ctrl#%d!", + chips[chipcnt].num, + chips[chipcnt].ctrl_num); + return (EINVAL); + } + } + /* Check if chips attached to the same controller, have same width */ + for (i = 0; i < ctrlcnt; i++) { + width = -1; + for (j = 0; j < cchipcnt; j++) { + if (chips[j].ctrl_num == i) { + if (width == -1) { + width = chips[j].width; + } else { + if (width != chips[j].width) { + error("Chips attached to " + "ctrl#%d have different " + "widths!\n", i); + return (EINVAL); + } + } + } + } + } + + return (0); +} + +static uint8_t +validate_ctrls(struct sim_ctrl *ctrl, int ctrlcnt) +{ + for (ctrlcnt -= 1; ctrlcnt >= 0; ctrlcnt--) { + if (ctrl[ctrlcnt].num > MAX_SIM_DEV) { + error("Controller no. too high (%d)!!\n", + ctrl[ctrlcnt].num); + return (EINVAL); + } + if (ctrl[ctrlcnt].num_cs > MAX_CTRL_CS) { + error("Too many CS (%d)!!\n", ctrl[ctrlcnt].num_cs); + return (EINVAL); + } + if (ctrl[ctrlcnt].ecc != 0 && ctrl[ctrlcnt].ecc != 1) { + error("ECC is set to neither 0 nor 1 !\n"); + return (EINVAL); + } + } + + return (0); +} + +static int validate_section_config(struct rcfile *f, const char *sect_name, + int sectno) +{ + struct nandsim_key *key; + struct nandsim_section *sect; + char **keys_tbl; + int i, match; + + for (match = 0, sect = (struct nandsim_section *)§ions; + sect != NULL; sect++) { + if (strcmp(sect->name, sect_name) == 0) { + match = 1; + break; + } + } + + if (match == 0) + return (EINVAL); + + keys_tbl = rc_getkeys(f, sect_name, sectno); + if (keys_tbl == NULL) + return (ENOMEM); + + for (i = 0; keys_tbl[i] != NULL; i++) { + key = sect->keys; + match = 0; + do { + if (strcmp(keys_tbl[i], key->keyname) == 0) { + match = 1; + break; + } + } while ((++key)->keyname != NULL); + + if (match == 0) { + error("Invalid key in config file: %s\n", keys_tbl[i]); + free(keys_tbl); + return (EINVAL); + } + } + + free(keys_tbl); + return (0); +} diff --git a/usr.sbin/nandsim/nandsim_cfgparse.h b/usr.sbin/nandsim/nandsim_cfgparse.h new file mode 100644 index 00000000000..b9c642a3e9d --- /dev/null +++ b/usr.sbin/nandsim/nandsim_cfgparse.h @@ -0,0 +1,86 @@ +/*- + * Copyright (C) 2009-2012 Semihalf + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _NANDSIM_CONFPARSER_H_ +#define _NANDSIM_CONFPARSER_H_ + +#define VALUE_UINT 0x08 +#define VALUE_INT 0x10 +#define VALUE_UINTARRAY 0x18 +#define VALUE_INTARRAY 0x20 +#define VALUE_STRING 0x28 +#define VALUE_CHAR 0x40 +#define VALUE_BOOL 0x48 + +#define SIZE_8 0x01 +#define SIZE_16 0x02 +#define SIZE_32 0x04 + +#include "nandsim_rcfile.h" + +/* + * keyname = name of a key, + * mandatory = is key mandatory in section belonging to, 0=false 1=true + * valuetype = what kind of value is assigned to that key, e.g. + * VALUE_UINT | SIZE_8 -- unsigned uint size 8 bits; + * VALUE_UINTARRAY | SIZE_8 -- array of uints 8-bit long; + * VALUE_BOOL -- 'on', 'off','true','false','yes' or 'no' + * literals; + * VALUE_STRING -- strings + * field = ptr to the field that should hold value for parsed value + * maxlength = contains maximum length of an array (used only with either + * VALUE_STRING or VALUE_(U)INTARRAY value types. + */ +struct nandsim_key { + const char *keyname; + uint8_t mandatory; + uint8_t valuetype; + void *field; + uint32_t maxlength; +}; +struct nandsim_section { + const char *name; + struct nandsim_key *keys; +}; + +struct nandsim_config { + struct sim_param **simparams; + struct sim_chip **simchips; + struct sim_ctrl **simctrls; + int chipcnt; + int ctrlcnt; +}; + +int parse_intarray(char *, int **); +int parse_config(char *, const char *); +int parse_section(struct rcfile *, const char *, int); +int compare_configs(struct nandsim_config *, struct nandsim_config *); +int convert_argint(char *, int *); +int convert_arguint(char *, unsigned int *); + +#endif /* _NANDSIM_CONFPARSER_H_ */ diff --git a/usr.sbin/nandsim/nandsim_rcfile.c b/usr.sbin/nandsim/nandsim_rcfile.c new file mode 100644 index 00000000000..0f99e7b001e --- /dev/null +++ b/usr.sbin/nandsim/nandsim_rcfile.c @@ -0,0 +1,440 @@ +/* + * Copyright (c) 1999, Boris Popov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the author nor the names of any co-contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: FreeBSD: src/lib/libncp/ncpl_rcfile.c,v 1.5 2007/01/09 23:27:39 imp Exp + */ + +#include +__FBSDID("$FreeBSD$"); +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "nandsim_rcfile.h" + +SLIST_HEAD(rcfile_head, rcfile); +static struct rcfile_head pf_head = {NULL}; +static struct rcsection *rc_findsect(struct rcfile *rcp, + const char *sectname, int sect_id); +static struct rcsection *rc_addsect(struct rcfile *rcp, + const char *sectname); +static int rc_sect_free(struct rcsection *rsp); +static struct rckey *rc_sect_findkey(struct rcsection *rsp, + const char *keyname); +static struct rckey *rc_sect_addkey(struct rcsection *rsp, const char *name, + char *value); +static void rc_key_free(struct rckey *p); +static void rc_parse(struct rcfile *rcp); + +static struct rcfile* rc_find(const char *filename); + +/* + * open rcfile and load its content, if already open - return previous handle + */ +int +rc_open(const char *filename, const char *mode,struct rcfile **rcfile) +{ + struct rcfile *rcp; + FILE *f; + rcp = rc_find(filename); + if (rcp) { + *rcfile = rcp; + return (0); + } + f = fopen (filename, mode); + if (f == NULL) + return errno; + rcp = malloc(sizeof(struct rcfile)); + if (rcp == NULL) { + fclose(f); + return ENOMEM; + } + bzero(rcp, sizeof(struct rcfile)); + rcp->rf_name = strdup(filename); + rcp->rf_f = f; + SLIST_INSERT_HEAD(&pf_head, rcp, rf_next); + rc_parse(rcp); + *rcfile = rcp; + return (0); +} + +int +rc_close(struct rcfile *rcp) +{ + struct rcsection *p,*n; + + fclose(rcp->rf_f); + for (p = SLIST_FIRST(&rcp->rf_sect); p; ) { + n = p; + p = SLIST_NEXT(p,rs_next); + rc_sect_free(n); + } + free(rcp->rf_name); + SLIST_REMOVE(&pf_head, rcp, rcfile, rf_next); + free(rcp); + return (0); +} + +static struct rcfile* +rc_find(const char *filename) +{ + struct rcfile *p; + + SLIST_FOREACH(p, &pf_head, rf_next) + if (strcmp (filename, p->rf_name) == 0) + return (p); + return (0); +} + +/* Find section with given name and id */ +static struct rcsection * +rc_findsect(struct rcfile *rcp, const char *sectname, int sect_id) +{ + struct rcsection *p; + + SLIST_FOREACH(p, &rcp->rf_sect, rs_next) + if (strcmp(p->rs_name, sectname) == 0 && p->rs_id == sect_id) + return (p); + return (NULL); +} + +static struct rcsection * +rc_addsect(struct rcfile *rcp, const char *sectname) +{ + struct rcsection *p; + int id = 0; + p = rc_findsect(rcp, sectname, 0); + if (p) { + /* + * If section with that name already exists -- add one more, + * same named, but with different id (higher by one) + */ + while (p != NULL) { + id = p->rs_id + 1; + p = rc_findsect(rcp, sectname, id); + } + } + p = malloc(sizeof(*p)); + if (!p) + return (NULL); + p->rs_name = strdup(sectname); + p->rs_id = id; + SLIST_INIT(&p->rs_keys); + SLIST_INSERT_HEAD(&rcp->rf_sect, p, rs_next); + return (p); +} + +static int +rc_sect_free(struct rcsection *rsp) +{ + struct rckey *p,*n; + + for (p = SLIST_FIRST(&rsp->rs_keys); p; ) { + n = p; + p = SLIST_NEXT(p,rk_next); + rc_key_free(n); + } + free(rsp->rs_name); + free(rsp); + return (0); +} + +static struct rckey * +rc_sect_findkey(struct rcsection *rsp, const char *keyname) +{ + struct rckey *p; + + SLIST_FOREACH(p, &rsp->rs_keys, rk_next) + if (strcmp(p->rk_name, keyname)==0) + return (p); + return (NULL); +} + +static struct rckey * +rc_sect_addkey(struct rcsection *rsp, const char *name, char *value) +{ + struct rckey *p; + p = rc_sect_findkey(rsp, name); + if (p) { + free(p->rk_value); + } else { + p = malloc(sizeof(*p)); + if (!p) + return (NULL); + SLIST_INSERT_HEAD(&rsp->rs_keys, p, rk_next); + p->rk_name = strdup(name); + } + p->rk_value = value ? strdup(value) : strdup(""); + return (p); +} + +static void +rc_key_free(struct rckey *p) +{ + free(p->rk_value); + free(p->rk_name); + free(p); +} + +enum { stNewLine, stHeader, stSkipToEOL, stGetKey, stGetValue}; + +static void +rc_parse(struct rcfile *rcp) +{ + FILE *f = rcp->rf_f; + int state = stNewLine, c; + struct rcsection *rsp = NULL; + struct rckey *rkp = NULL; + char buf[2048]; + char *next = buf, *last = &buf[sizeof(buf)-1]; + + while ((c = getc (f)) != EOF) { + if (c == '\r') + continue; + if (state == stNewLine) { + next = buf; + if (isspace(c)) + continue; /* skip leading junk */ + if (c == '[') { + state = stHeader; + rsp = NULL; + continue; + } + if (c == '#' || c == ';') { + state = stSkipToEOL; + } else { /* something meaningful */ + state = stGetKey; + } + } + if (state == stSkipToEOL || next == last) {/* ignore long lines */ + if (c == '\n') { + state = stNewLine; + next = buf; + } + continue; + } + if (state == stHeader) { + if (c == ']') { + *next = 0; + next = buf; + rsp = rc_addsect(rcp, buf); + state = stSkipToEOL; + } else + *next++ = c; + continue; + } + if (state == stGetKey) { + if (c == ' ' || c == '\t')/* side effect: 'key name='*/ + continue; /* become 'keyname=' */ + if (c == '\n') { /* silently ignore ... */ + state = stNewLine; + continue; + } + if (c != '=') { + *next++ = c; + continue; + } + *next = 0; + if (rsp == NULL) { + fprintf(stderr, "Key '%s' defined before " + "section\n", buf); + state = stSkipToEOL; + continue; + } + rkp = rc_sect_addkey(rsp, buf, NULL); + next = buf; + state = stGetValue; + continue; + } + /* only stGetValue left */ + if (state != stGetValue) { + fprintf(stderr, "Well, I can't parse file " + "'%s'\n",rcp->rf_name); + state = stSkipToEOL; + } + if (c != '\n') { + *next++ = c; + continue; + } + *next = 0; + rkp->rk_value = strdup(buf); + state = stNewLine; + rkp = NULL; + } /* while */ + if (c == EOF && state == stGetValue) { + *next = 0; + rkp->rk_value = strdup(buf); + } +} + +int +rc_getstringptr(struct rcfile *rcp, const char *section, int sect_id, + const char *key, char **dest) +{ + struct rcsection *rsp; + struct rckey *rkp; + + *dest = NULL; + rsp = rc_findsect(rcp, section, sect_id); + if (!rsp) + return (ENOENT); + rkp = rc_sect_findkey(rsp,key); + if (!rkp) + return (ENOENT); + *dest = rkp->rk_value; + return (0); +} + +int +rc_getstring(struct rcfile *rcp, const char *section, int sect_id, + const char *key, unsigned int maxlen, char *dest) +{ + char *value; + int error; + + error = rc_getstringptr(rcp, section, sect_id, key, &value); + if (error) + return (error); + if (strlen(value) >= maxlen) { + fprintf(stderr, "line too long for key '%s' in section '%s'," + "max = %d\n",key, section, maxlen); + return (EINVAL); + } + strcpy(dest,value); + return (0); +} + +int +rc_getint(struct rcfile *rcp, const char *section, int sect_id, + const char *key, int *value) +{ + struct rcsection *rsp; + struct rckey *rkp; + + rsp = rc_findsect(rcp, section, sect_id); + if (!rsp) + return (ENOENT); + rkp = rc_sect_findkey(rsp,key); + if (!rkp) + return (ENOENT); + errno = 0; + *value = strtol(rkp->rk_value,NULL,0); + if (errno) { + fprintf(stderr, "invalid int value '%s' for key '%s' in " + "section '%s'\n",rkp->rk_value,key,section); + return (errno); + } + return (0); +} + +/* + * 1,yes,true + * 0,no,false + */ +int +rc_getbool(struct rcfile *rcp, const char *section, int sect_id, + const char *key, int *value) +{ + struct rcsection *rsp; + struct rckey *rkp; + char *p; + + rsp = rc_findsect(rcp, section, sect_id); + if (!rsp) + return (ENOENT); + rkp = rc_sect_findkey(rsp,key); + if (!rkp) + return (ENOENT); + p = rkp->rk_value; + while (*p && isspace(*p)) p++; + if (*p == '0' || strcasecmp(p,"no") == 0 || + strcasecmp(p, "false") == 0 || + strcasecmp(p, "off") == 0) { + *value = 0; + return (0); + } + if (*p == '1' || strcasecmp(p,"yes") == 0 || + strcasecmp(p, "true") == 0 || + strcasecmp(p, "on") == 0) { + *value = 1; + return (0); + } + fprintf(stderr, "invalid boolean value '%s' for key '%s' in section " + "'%s' \n",p, key, section); + return (EINVAL); +} + +/* Count how many sections with given name exists in configuration. */ +int rc_getsectionscount(struct rcfile *f, const char *sectname) +{ + struct rcsection *p; + int count = 0; + + p = rc_findsect(f, sectname, 0); + if (p) { + while (p != NULL) { + count = p->rs_id + 1; + p = rc_findsect(f, sectname, count); + } + return (count); + } else + return (0); +} + +char ** +rc_getkeys(struct rcfile *rcp, const char *sectname, int sect_id) +{ + struct rcsection *rsp; + struct rckey *p; + char **names_tbl; + int i = 0, count = 0; + + rsp = rc_findsect(rcp, sectname, sect_id); + if (rsp == NULL) + return (NULL); + + SLIST_FOREACH(p, &rsp->rs_keys, rk_next) + count++; + + names_tbl = malloc(sizeof(char *) * (count + 1)); + if (names_tbl == NULL) + return (NULL); + + SLIST_FOREACH(p, &rsp->rs_keys, rk_next) + names_tbl[i++] = p->rk_name; + + names_tbl[i] = NULL; + return (names_tbl); +} + diff --git a/usr.sbin/nandsim/nandsim_rcfile.h b/usr.sbin/nandsim/nandsim_rcfile.h new file mode 100644 index 00000000000..f5c3ce9ac8c --- /dev/null +++ b/usr.sbin/nandsim/nandsim_rcfile.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 1999, Boris Popov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the author nor the names of any co-contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + * + * from: FreeBSD: src/lib/libncp/ncpl_rcfile.c,v 1.5 2007/01/09 23:27:39 imp Exp + */ + +#ifndef _SIMRC_H_ +#define _SIMRC_H_ + +#include + +struct rckey { + SLIST_ENTRY(rckey) rk_next; + char *rk_name; /* key name */ + char *rk_value; /* key value */ +}; + +struct rcsection { + SLIST_ENTRY(rcsection) rs_next; + SLIST_HEAD(rckey_head,rckey) rs_keys; /* key list */ + char *rs_name; /* section name */ + int rs_id; /* allow few same named */ +}; + +struct rcfile { + SLIST_ENTRY(rcfile) rf_next; + SLIST_HEAD(rcsec_head, rcsection) rf_sect; /* sections list */ + char *rf_name; /* file name */ + FILE *rf_f; /* file desc */ +}; + +int rc_open(const char *, const char *,struct rcfile **); +int rc_close(struct rcfile *); +int rc_getstringptr(struct rcfile *, const char *, int, const char *, + char **); +int rc_getstring(struct rcfile *, const char *, int, const char *, + unsigned int, char *); +int rc_getint(struct rcfile *, const char *, int, const char *, int *); +int rc_getbool(struct rcfile *, const char *, int, const char *, int *); +int rc_getsectionscount(struct rcfile *, const char *); +char **rc_getkeys(struct rcfile *, const char *, int); + +#endif /* _SIMRC_H_ */ diff --git a/usr.sbin/nandsim/sample.conf b/usr.sbin/nandsim/sample.conf new file mode 100644 index 00000000000..bc534e109fe --- /dev/null +++ b/usr.sbin/nandsim/sample.conf @@ -0,0 +1,174 @@ +#- +# Copyright (C) 2009-2012 Semihalf +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ + +# +# Sample NANDsim configuration file. +# + +############################################################################# +# +# [sim] General (common) simulator configuration section. +# +[sim] +# log_level=0..255 +log_level=11 + +# log_output=[none, console, ram, file] +# +# When log_output=file is specified, each [ctrl] section must have a +# corresponding 'log_filename' field provided, which specifies log file name +# to be used. +log_output=none + +############################################################################# +# +# [ctrl] Controller configuration section. +# +# There can be a number of controllers defined for simulation, each has a +# dedicated [ctrl] section. With a given controller there are associated +# subordinate NAND chips, which are tied to chip select lines. +# +[ctrl] +# The number of this controller. +# ctrl_num=0..3 +ctrl_num=0 + +# The number of chip selects available at this controller. +# num_cs=1..4 +num_cs=1 + +# ECC enable flag. +# ecc=[on|off] +ecc=on + +# ECC layout. This is the list of byte offsets within OOB area, which comprise +# the ECC contents set. +# +# ecc_layout=[byte1, byte2-byte3, ..byten] +ecc_layout=[0-53] + +# Absolute path to the log file for this controller. +#log_filename=/var/log/nandsim-ctl0.log + + +############################################################################# +# +# [chip] Chip configuration section. +# +# There can be a number of individual NAND chip devices defined for +# simulation, and each has a dedicated [chip] section. +# +# A particular chip needs to be associated with its parent NAND controller by +# specifying the following fields: controller number (chip_ctrl) and the chip +# select line it is connected to (chip_cs). The chip can be connected to only +# a single (and unique) controller:cs pair. +# +[chip] +# The number of parent controller. This has to fit one of the controller +# instance number (ctrl_num from [ctrl] section). +# chip_ctrl=0..3 +chip_ctrl=0 + +# Chip select line. +# chip_cs=0..3 +chip_cs=0 + +# ONFI device identifier. +# device_id=0x00..0xff +device_id=0xd3 + +# ONFI manufacturer identifier. +# manufacturer_id=0x00..0xff +manufacturer_id=0xec + +# Textual description of the chip. +# model="model_name" +model="k9xxg08uxM:1GiB 3,3V 8-bit" + +# Textual name of the chip manufacturer. +# manufacturer="manufacturer name" +manufacturer="SAMSUNG" + +# page_size=[must be power of 2 and >= 512] (in bytes) +page_size=2048 +# oob_size=[>0] +oob_size=64 +# pages_per_block=n*32 +pages_per_block=64 +# blocks_per_lun=[>0] +blocks_per_lun=4096 +# luns=1..N +luns=1 +# column_addr_cycle=[1,2] +column_addr_cycle=2 +# row_addr_cycle=[1,2,3] +row_addr_cycle=3 + +# program_time= (in us) +program_time=0 +# erase_time= (in us) +erase_time=0 +# read_time= (in us) +read_time=0 +# ccs_time= (in us) +#ccs_time=200 + +# Simulate write-protect on the chip. +# write_protect=[yes|no] +#write_protect=no + +# Blocks wear-out threshold. Each block has a counter of program-erase cycles; +# when this counter reaches 'wear_out' value a given block is treated as a bad +# block (access will report error). +# +# Setting wear_out to 0 means that blocks will never wear out. +# +# wear_out=0..100000 +wear_out=50000 + +# Errors per million read/write bytes. This simulates an accidental read/write +# block error, which can happen in real devices with certain probability. Note +# this isn't a bad block condition i.e. the block at which the read/write +# operation is simulated to fail here remains usable, only the operation has +# not succeeded (this is where ECC comes into play and is supposed to correct +# such problems). +# +# error_ratio=0..1000000 +#error_ratio=50 + +# Chip data bus width. All chips connected to the same controller must have +# the same bus width. +# +# width=[8|16] +width=8 + +# Bad block map. NANDsim emulates bad block behavior upon accessing a block +# with number from the specified list. +# +# bad_block_map=[bad_block1, bad_block2-bad_block3, ..bad_blockn] +bad_block_map=[100-200] + diff --git a/usr.sbin/nandtool/Makefile b/usr.sbin/nandtool/Makefile new file mode 100644 index 00000000000..ae9de2dcf4f --- /dev/null +++ b/usr.sbin/nandtool/Makefile @@ -0,0 +1,11 @@ +# $FreeBSD$ + +PROG= nandtool +SRCS= nandtool.c nand_read.c nand_write.c nand_erase.c nand_info.c +SRCS+= nand_readoob.c nand_writeoob.c +BINDIR= /usr/sbin +DPADD= ${LIBGEOM} +LDADD= -lgeom +MAN= nandtool.8 + +.include diff --git a/usr.sbin/nandtool/nand_erase.c b/usr.sbin/nandtool/nand_erase.c new file mode 100644 index 00000000000..50bfaa65ce6 --- /dev/null +++ b/usr.sbin/nandtool/nand_erase.c @@ -0,0 +1,114 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include "nandtool.h" + +int nand_erase(struct cmd_param *params) +{ + struct chip_param_io chip_params; + char *dev; + int fd = -1, ret = 0; + off_t pos, count; + off_t start, nblocks, i; + int block_size, mult; + + if (!(dev = param_get_string(params, "dev"))) { + fprintf(stderr, "Please supply valid 'dev' parameter.\n"); + return (1); + } + + if (param_has_value(params, "count")) + count = param_get_intx(params, "count"); + else + count = 1; + + if ((fd = g_open(dev, 1)) < 0) { + perrorf("Cannot open %s", dev); + return (1); + } + + if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) { + perrorf("Cannot ioctl(NAND_IO_GET_CHIP_PARAM)"); + ret = 1; + goto out; + } + + block_size = chip_params.page_size * chip_params.pages_per_block; + + if (param_has_value(params, "page")) { + pos = chip_params.page_size * param_get_intx(params, "page"); + mult = chip_params.page_size; + } else if (param_has_value(params, "block")) { + pos = block_size * param_get_intx(params, "block"); + mult = block_size; + } else if (param_has_value(params, "pos")) { + pos = param_get_intx(params, "pos"); + mult = 1; + } else { + /* Erase whole chip */ + if (ioctl(fd, DIOCGMEDIASIZE, &count) == -1) { + ret = 1; + goto out; + } + + pos = 0; + mult = 1; + } + + if (pos % block_size) { + fprintf(stderr, "Position must be block-size aligned!\n"); + ret = 1; + goto out; + } + + count *= mult; + start = pos / block_size; + nblocks = count / block_size; + + for (i = 0; i < nblocks; i++) { + if (g_delete(fd, (start + i) * block_size, block_size) == -1) { + perrorf("Cannot erase block %d - probably a bad block", + start + i); + ret = 1; + } + } + +out: + g_close(fd); + + return (ret); +} + diff --git a/usr.sbin/nandtool/nand_info.c b/usr.sbin/nandtool/nand_info.c new file mode 100644 index 00000000000..38fe010ae07 --- /dev/null +++ b/usr.sbin/nandtool/nand_info.c @@ -0,0 +1,86 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include "nandtool.h" + +int nand_info(struct cmd_param *params) +{ + struct chip_param_io chip_params; + int fd = -1, ret = 0; + int block_size; + off_t chip_size, media_size; + const char *dev; + + if ((dev = param_get_string(params, "dev")) == NULL) { + fprintf(stderr, "Please supply 'dev' parameter, eg. " + "'dev=/dev/gnand0'\n"); + return (1); + } + + if ((fd = g_open(dev, 1)) == -1) { + perrorf("Cannot open %s", dev); + return (1); + } + + if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) { + perrorf("Cannot ioctl(NAND_IO_GET_CHIP_PARAM)"); + ret = 1; + goto out; + } + + if (ioctl(fd, DIOCGMEDIASIZE, &media_size) == -1) { + perrorf("Cannot ioctl(DIOCGMEDIASIZE)"); + ret = 1; + goto out; + } + + block_size = chip_params.page_size * chip_params.pages_per_block; + chip_size = block_size * chip_params.blocks; + + printf("Device:\t\t\t%s\n", dev); + printf("Page size:\t\t%d bytes\n", chip_params.page_size); + printf("Block size:\t\t%d bytes (%d KB)\n", block_size, + block_size / 1024); + printf("OOB size per page:\t%d bytes\n", chip_params.oob_size); + printf("Chip size:\t\t%jd MB\n", (uintmax_t)(chip_size / 1024 / 1024)); + printf("Slice size:\t\t%jd MB\n", + (uintmax_t)(media_size / 1024 / 1024)); + +out: + g_close(fd); + + return (ret); +} diff --git a/usr.sbin/nandtool/nand_read.c b/usr.sbin/nandtool/nand_read.c new file mode 100644 index 00000000000..5267b7d1c9b --- /dev/null +++ b/usr.sbin/nandtool/nand_read.c @@ -0,0 +1,139 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include "nandtool.h" + +int nand_read(struct cmd_param *params) +{ + struct chip_param_io chip_params; + int fd = -1, out_fd = -1, done = 0, ret = 0; + char *dev, *out; + int pos, count, mult, block_size; + uint8_t *buf = NULL; + + if (!(dev = param_get_string(params, "dev"))) { + fprintf(stderr, "You must specify 'dev' parameter\n"); + return (1); + } + + if ((out = param_get_string(params, "out"))) { + out_fd = open(out, O_WRONLY|O_CREAT); + if (out_fd == -1) { + perrorf("Cannot open %s for writing", out); + return (1); + } + } + + if ((fd = g_open(dev, 1)) == -1) { + perrorf("Cannot open %s", dev); + ret = 1; + goto out; + } + + if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) { + perrorf("Cannot ioctl(NAND_IO_GET_CHIP_PARAM)"); + ret = 1; + goto out; + } + + block_size = chip_params.page_size * chip_params.pages_per_block; + + if (param_has_value(params, "page")) { + pos = chip_params.page_size * param_get_int(params, "page"); + mult = chip_params.page_size; + } else if (param_has_value(params, "block")) { + pos = block_size * param_get_int(params, "block"); + mult = block_size; + } else if (param_has_value(params, "pos")) { + pos = param_get_int(params, "pos"); + mult = 1; + if (pos % chip_params.page_size) { + fprintf(stderr, "Position must be page-size aligned!\n"); + ret = 1; + goto out; + } + } else { + fprintf(stderr, "You must specify one of: 'block', 'page'," + "'pos' arguments\n"); + ret = 1; + goto out; + } + + if (!(param_has_value(params, "count"))) + count = mult; + else + count = param_get_int(params, "count") * mult; + + if (!(buf = malloc(chip_params.page_size))) { + perrorf("Cannot allocate buffer [size %x]", + chip_params.page_size); + ret = 1; + goto out; + } + + lseek(fd, pos, SEEK_SET); + + while (done < count) { + if ((ret = read(fd, buf, chip_params.page_size)) != + (int32_t)chip_params.page_size) { + perrorf("read error (read %d bytes)", ret); + goto out; + } + + if (out_fd != -1) { + done += ret; + if ((ret = write(out_fd, buf, chip_params.page_size)) != + (int32_t)chip_params.page_size) { + perrorf("write error (written %d bytes)", ret); + ret = 1; + goto out; + } + } else { + hexdumpoffset(buf, chip_params.page_size, done); + done += ret; + } + } + +out: + g_close(fd); + if (out_fd != -1) + close(out_fd); + if (buf) + free(buf); + + return (ret); +} + diff --git a/usr.sbin/nandtool/nand_readoob.c b/usr.sbin/nandtool/nand_readoob.c new file mode 100644 index 00000000000..37fd14b9ff0 --- /dev/null +++ b/usr.sbin/nandtool/nand_readoob.c @@ -0,0 +1,111 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include "nandtool.h" + +int nand_read_oob(struct cmd_param *params) +{ + struct chip_param_io chip_params; + struct nand_oob_rw req; + char *dev, *out; + int fd = -1, fd_out = -1, ret = 0; + int page; + uint8_t *buf = NULL; + + if ((page = param_get_int(params, "page")) < 0) { + fprintf(stderr, "You must supply valid 'page' argument.\n"); + return (1); + } + + if (!(dev = param_get_string(params, "dev"))) { + fprintf(stderr, "You must supply 'dev' argument.\n"); + return (1); + } + + if ((out = param_get_string(params, "out"))) { + if ((fd_out = open(out, O_WRONLY | O_CREAT)) == -1) { + perrorf("Cannot open %s", out); + ret = 1; + goto out; + } + } + + if ((fd = g_open(dev, 1)) == -1) { + perrorf("Cannot open %s", dev); + ret = 1; + goto out; + } + + if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) { + perrorf("Cannot ioctl(NAND_IO_GET_CHIP_PARAM)"); + ret = 1; + goto out; + } + + buf = malloc(chip_params.oob_size); + if (buf == NULL) { + perrorf("Cannot allocate %d bytes\n", chip_params.oob_size); + ret = 1; + goto out; + } + + req.page = page; + req.len = chip_params.oob_size; + req.data = buf; + + if (ioctl(fd, NAND_IO_OOB_READ, &req) == -1) { + perrorf("Cannot read OOB from %s", dev); + ret = 1; + goto out; + } + + if (fd_out != -1) + write(fd_out, buf, chip_params.oob_size); + else + hexdump(buf, chip_params.oob_size); + +out: + close(fd_out); + + if (fd != -1) + g_close(fd); + if (buf) + free(buf); + + return (ret); +} + diff --git a/usr.sbin/nandtool/nand_write.c b/usr.sbin/nandtool/nand_write.c new file mode 100644 index 00000000000..157c6aa94f8 --- /dev/null +++ b/usr.sbin/nandtool/nand_write.c @@ -0,0 +1,143 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include "nandtool.h" + +int nand_write(struct cmd_param *params) +{ + struct chip_param_io chip_params; + char *dev, *file; + int in_fd = -1, ret = 0, done = 0; + int fd, block_size, mult, pos, count; + uint8_t *buf = NULL; + + if (!(dev = param_get_string(params, "dev"))) { + fprintf(stderr, "Please supply 'dev' argument.\n"); + return (1); + } + + if (!(file = param_get_string(params, "in"))) { + fprintf(stderr, "Please supply 'in' argument.\n"); + return (1); + } + + if ((fd = g_open(dev, 1)) == -1) { + perrorf("Cannot open %s", dev); + return (1); + } + + if ((in_fd = open(file, O_RDONLY)) == -1) { + perrorf("Cannot open file %s", file); + ret = 1; + goto out; + } + + if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) { + perrorf("Cannot ioctl(NAND_IO_GET_CHIP_PARAM)"); + ret = 1; + goto out; + } + + block_size = chip_params.page_size * chip_params.pages_per_block; + + if (param_has_value(params, "page")) { + pos = chip_params.page_size * param_get_int(params, "page"); + mult = chip_params.page_size; + } else if (param_has_value(params, "block")) { + pos = block_size * param_get_int(params, "block"); + mult = block_size; + } else if (param_has_value(params, "pos")) { + pos = param_get_int(params, "pos"); + mult = 1; + if (pos % chip_params.page_size) { + fprintf(stderr, "Position must be page-size " + "aligned!\n"); + ret = 1; + goto out; + } + } else { + fprintf(stderr, "You must specify one of: 'block', 'page'," + "'pos' arguments\n"); + ret = 1; + goto out; + } + + if (!(param_has_value(params, "count"))) + count = mult; + else + count = param_get_int(params, "count") * mult; + + if (!(buf = malloc(chip_params.page_size))) { + perrorf("Cannot allocate buffer [size %x]", + chip_params.page_size); + ret = 1; + goto out; + } + + lseek(fd, pos, SEEK_SET); + + while (done < count) { + if ((ret = read(in_fd, buf, chip_params.page_size)) != + (int32_t)chip_params.page_size) { + if (ret > 0) { + /* End of file ahead, truncate here */ + break; + } else { + perrorf("Cannot read from %s", file); + ret = 1; + goto out; + } + } + + if ((ret = write(fd, buf, chip_params.page_size)) != + (int32_t)chip_params.page_size) { + ret = 1; + goto out; + } + + done += ret; + } + +out: + g_close(fd); + if (in_fd != -1) + close(in_fd); + if (buf) + free(buf); + + return (ret); +} + diff --git a/usr.sbin/nandtool/nand_writeoob.c b/usr.sbin/nandtool/nand_writeoob.c new file mode 100644 index 00000000000..53cb32a0e08 --- /dev/null +++ b/usr.sbin/nandtool/nand_writeoob.c @@ -0,0 +1,113 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include "nandtool.h" + +int nand_write_oob(struct cmd_param *params) +{ + struct chip_param_io chip_params; + struct nand_oob_rw req; + char *dev, *in; + int fd = -1, fd_in = -1, ret = 0; + uint8_t *buf = NULL; + int page; + + if (!(dev = param_get_string(params, "dev"))) { + fprintf(stderr, "Please supply valid 'dev' parameter.\n"); + return (1); + } + + if (!(in = param_get_string(params, "in"))) { + fprintf(stderr, "Please supply valid 'in' parameter.\n"); + return (1); + } + + if ((page = param_get_int(params, "page")) < 0) { + fprintf(stderr, "Please supply valid 'page' parameter.\n"); + return (1); + } + + if ((fd = g_open(dev, 1)) == -1) { + perrorf("Cannot open %s", dev); + return (1); + } + + if ((fd_in = open(in, O_RDONLY)) == -1) { + perrorf("Cannot open %s", in); + ret = 1; + goto out; + } + + if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) { + perrorf("Cannot ioctl(NAND_IO_GET_CHIP_PARAM)"); + ret = 1; + goto out; + } + + buf = malloc(chip_params.oob_size); + if (buf == NULL) { + perrorf("Cannot allocate %d bytes\n", chip_params.oob_size); + ret = 1; + goto out; + } + + if (read(fd_in, buf, chip_params.oob_size) == -1) { + perrorf("Cannot read from %s", in); + ret = 1; + goto out; + } + + req.page = page; + req.len = chip_params.oob_size; + req.data = buf; + + if (ioctl(fd, NAND_IO_OOB_PROG, &req) == -1) { + perrorf("Cannot write OOB to %s", dev); + ret = 1; + goto out; + } + +out: + g_close(fd); + if (fd_in != -1) + close(fd_in); + if (buf) + free(buf); + + return (ret); +} + + diff --git a/usr.sbin/nandtool/nandtool.8 b/usr.sbin/nandtool/nandtool.8 new file mode 100644 index 00000000000..8f8f1deffdd --- /dev/null +++ b/usr.sbin/nandtool/nandtool.8 @@ -0,0 +1,184 @@ +.\" Copyright (c) 2010 Semihalf +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd April 10, 2012 +.Dt NANDTOOL 8 +.Os +.Sh NAME +.Nm nandtool +.Nd NAND devices swiss army knife +.Sh SYNOPSIS +.Nm +.Ar command +.Op Ar operands ... +.Sh DESCRIPTION +The +.Nm +utility can be used to perform various operations on +.Xr gnand 4 +devices (read, write, erase, +read and write OOB area and to get info about NAND flash chip). +.Pp +The following commands are available: +.Bl -tag -width ".Cm of Ns = Ns Ar file" +.It Cm read Ns +Read pages from NAND device. +.It Cm write Ns +Write pages to NAND device. +.It Cm erase Ns +Erase blocks. +Requires offset aligned to block granularity. +.It Cm info Ns +Get information about NAND chip (page size, block size, OOB area size, chip size +and media size) +.It Cm readoob Ns +Read OOB area from specified page. +.It Cm writeoob Ns +Write OOB area bound to specified page. +.It Cm help Ns +Get usage info. +.El +.Sh COMMAND read +The following operands are available for +.Nm +.Cm read +command: +.Bl -tag -width ".Cm of Ns = Ns Ar file" +.It Cm dev Ns = Ns Ar +Path to a +.Xr gnand 4 +device node, required for all operations. +.It Cm out Ns = Ns Ar +Output file path. If not specified, page contents +will be dumped to stdout in format similar to +.Xr hexdump 1 +.It Cm page Ns = Ns Ar +Offset on device, expressed as page number. +.It Cm block Ns = Ns Ar +Offset on device, expressed as block number. +.It Cm pos Ns = Ns Ar +Offset on device, expressed in bytes (however, must be aligned +to page granularity). +.It Cm count Ns = Ns Ar +Count of objects (pages, blocks, bytes). +.El +.Sh COMMAND readoob +The following operands are available for +.Nm +.Cm readoob +command: +.Bl -tag -width ".Cm of Ns = Ns Ar file" +.It Cm dev Ns = Ns Ar +Path to NAND device node. +.It Cm page Ns = Ns Ar +Offset on device, expressed as page number. +.It Cm out Ns = Ns Ar +Output file path, optional. +.El +.Sh COMMAND write +The following operands are available for +.Nm +.Cm write +command: +.Bl -tag -width ".Cm of Ns = Ns Ar file" +.It Cm dev Ns = Ns Ar +Path to NAND device node. +.It Cm page Ns = Ns Ar +Offset on device, expressed as page number. +.It Cm block Ns = Ns Ar +Offset on device, expressed as block number. +.It Cm pos Ns = Ns Ar +Offset on device, expressed in bytes (however, must be aligned +to page granularity). +.It Cm in Ns = Ns Ar +Input file path. +.El +.Sh COMMAND writeoob +The following operands are available for +.Nm +.Cm writeoob +command: +.Bl -tag -width ".Cm of Ns = Ns Ar file" +.It Cm dev Ns = Ns Ar +Path to NAND device node. +.It Cm page Ns = Ns Ar +Offset on device, expressed as page number. +.It Cm in Ns = Ns Ar +Input file path. +.El +.Sh COMMAND erase +The following operands are available for +.Nm +.Cm erase +command: +.Bl -tag -width ".Cm of Ns = Ns Ar file" +.It Cm dev Ns = Ns Ar +Path to NAND device node. +.It Cm page Ns = Ns Ar +Offset on device, expressed as page number. +.It Cm block Ns = Ns Ar +Offset on device, expressed as block number. +.It Cm pos Ns = Ns Ar +Offset on device, epressed in bytes (however, must be aligned +to block granularity). +.It Cm count Ns = Ns Ar +Count of objects (pages, blocks, bytes). +.El +.Pp +WARNING: The only required parameter for the \fBerase\fP command is +.Ar dev . +When no other arguments are provided the whole device is erased! +.Sh COMMAND info +There is only one operand available for +.Nm +.Cm info +command: +.Bl -tag -width ".Cm of Ns = Ns Ar file" +.It Cm dev Ns = Ns Ar +Path to NAND device node. +.El +.Sh COMMAND help +There is only one operand available for +.Nm +.Cm help +command: +.Bl -tag -width ".Cm of Ns = Ns Ar file" +.It Cm topic Ns = Ns Ar +Help topic. +.El +.Sh EXIT STATUS +.Ex -std +If the supplied argument +.Ar dev +points to a device node other than gnand or gnand.raw both +.Nm +.Cm readoob +and +.Nm +.Cm writeoob +return error. +.Sh SEE ALSO +.Xr gnand 4 diff --git a/usr.sbin/nandtool/nandtool.c b/usr.sbin/nandtool/nandtool.c new file mode 100644 index 00000000000..bd7075b0438 --- /dev/null +++ b/usr.sbin/nandtool/nandtool.c @@ -0,0 +1,283 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include "nandtool.h" +#include "usage.h" + +int usage(struct cmd_param *); + +static const struct { + const char *name; + const char *usage; + int (*handler)(struct cmd_param *); +} commands[] = { + { "help", nand_help_usage, usage }, + { "read", nand_read_usage, nand_read }, + { "write", nand_write_usage, nand_write }, + { "erase", nand_erase_usage, nand_erase }, + { "readoob", nand_read_oob_usage, nand_read_oob }, + { "writeoob", nand_write_oob_usage, nand_write_oob }, + { "info", nand_info_usage, nand_info }, + { NULL, NULL, NULL }, +}; + +static char * +_param_get_stringx(struct cmd_param *params, const char *name, int doexit) +{ + int i; + + for (i = 0; params[i].name[0] != '\0'; i++) { + if (!strcmp(params[i].name, name)) + return params[i].value; + } + + if (doexit) { + perrorf("Missing parameter %s", name); + exit(1); + } + return (NULL); +} + +char * +param_get_string(struct cmd_param *params, const char *name) +{ + + return (_param_get_stringx(params, name, 0)); +} + +static int +_param_get_intx(struct cmd_param *params, const char *name, int doexit) +{ + int ret; + char *str = _param_get_stringx(params, name, doexit); + + if (!str) + return (-1); + + errno = 0; + ret = (int)strtol(str, (char **)NULL, 10); + if (errno) { + if (doexit) { + perrorf("Invalid value for parameter %s", name); + exit(1); + } + return (-1); + } + + return (ret); +} + +int +param_get_intx(struct cmd_param *params, const char *name) +{ + + return (_param_get_intx(params, name, 1)); +} + +int +param_get_int(struct cmd_param *params, const char *name) +{ + + return (_param_get_intx(params, name, 0)); +} + +int +param_get_boolean(struct cmd_param *params, const char *name) +{ + char *str = param_get_string(params, name); + + if (!str) + return (0); + + if (!strcmp(str, "true") || !strcmp(str, "yes")) + return (1); + + return (0); +} + +int +param_has_value(struct cmd_param *params, const char *name) +{ + int i; + + for (i = 0; params[i].name[0] != '\0'; i++) { + if (!strcmp(params[i].name, name)) + return (1); + } + + return (0); +} + +int +param_get_count(struct cmd_param *params) +{ + int i; + + for (i = 0; params[i].name[0] != '\0'; i++); + + return (i); +} + +void +hexdumpoffset(uint8_t *buf, int length, int off) +{ + int i, j; + for (i = 0; i < length; i += 16) { + printf("%08x: ", off + i); + + for (j = 0; j < 16; j++) + printf("%02x ", buf[i+j]); + + printf("| "); + + for (j = 0; j < 16; j++) { + printf("%c", isalnum(buf[i+j]) + ? buf[i+j] + : '.'); + } + + printf("\n"); + } +} + +void +hexdump(uint8_t *buf, int length) +{ + + hexdumpoffset(buf, length, 0); +} + +void * +xmalloc(size_t len) +{ + void *ret = malloc(len); + + if (!ret) { + fprintf(stderr, "Cannot allocate buffer of %zd bytes. " + "Exiting.\n", len); + exit(EX_OSERR); + } + + return (ret); +} + +void +perrorf(const char *format, ...) +{ + va_list args; + + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + fprintf(stderr, ": %s\n", strerror(errno)); +} + +int +usage(struct cmd_param *params) +{ + int i; + + if (!params || !param_get_count(params)) { + fprintf(stderr, "Usage: nandtool [arguments...]\n"); + fprintf(stderr, "Arguments are in form 'name=value'.\n\n"); + fprintf(stderr, "Available commands:\n"); + + for (i = 0; commands[i].name != NULL; i++) + fprintf(stderr, "\t%s\n", commands[i].name); + + fprintf(stderr, "\n"); + fprintf(stderr, "For information about particular command, " + "type:\n"); + fprintf(stderr, "'nandtool help topic='\n"); + } else if (param_has_value(params, "topic")) { + for (i = 0; commands[i].name != NULL; i++) { + if (!strcmp(param_get_string(params, "topic"), + commands[i].name)) { + fprintf(stderr, commands[i].usage, "nandtool"); + return (0); + } + } + + fprintf(stderr, "No such command\n"); + return (EX_SOFTWARE); + } else { + fprintf(stderr, "Wrong arguments given. Try: 'nandtool help'\n"); + } + + return (EX_USAGE); +} + +int +main(int argc, const char *argv[]) +{ + struct cmd_param *params; + int i, ret, idx; + + if (argc < 2) { + usage(NULL); + return (0); + } + + params = malloc(sizeof(struct cmd_param) * (argc - 1)); + + for (i = 2, idx = 0; i < argc; i++, idx++) { + if (sscanf(argv[i], "%63[^=]=%63s", params[idx].name, + params[idx].value) < 2) { + fprintf(stderr, "Syntax error in argument %d. " + "Argument should be in form 'name=value'.\n", i); + free(params); + return (-1); + } + } + + params[idx].name[0] = '\0'; + params[idx].value[0] = '\0'; + + for (i = 0; commands[i].name != NULL; i++) { + if (!strcmp(commands[i].name, argv[1])) { + ret = commands[i].handler(params); + free(params); + return (ret); + } + } + + free(params); + fprintf(stderr, "Unknown command. Try '%s help'\n", argv[0]); + + return (-1); +} + diff --git a/usr.sbin/nandtool/nandtool.h b/usr.sbin/nandtool/nandtool.h new file mode 100644 index 00000000000..639f95e47d1 --- /dev/null +++ b/usr.sbin/nandtool/nandtool.h @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef __UTILS_H +#define __UTILS_H + +struct cmd_param +{ + char name[64]; + char value[64]; +}; + +char *param_get_string(struct cmd_param *, const char *); +int param_get_int(struct cmd_param *, const char *); +int param_get_intx(struct cmd_param *, const char *); +int param_get_boolean(struct cmd_param *, const char *); +int param_has_value(struct cmd_param *, const char *); +int param_get_count(struct cmd_param *); +void perrorf(const char *, ...); +void hexdumpoffset(uint8_t *, int, int); +void hexdump(uint8_t *, int); +void *xmalloc(size_t); + +/* Command handlers */ +int nand_read(struct cmd_param *); +int nand_write(struct cmd_param *); +int nand_read_oob(struct cmd_param *); +int nand_write_oob(struct cmd_param *); +int nand_erase(struct cmd_param *); +int nand_info(struct cmd_param *); + +#endif /* __UTILS_H */ diff --git a/usr.sbin/nandtool/usage.h b/usr.sbin/nandtool/usage.h new file mode 100644 index 00000000000..74e8543b25c --- /dev/null +++ b/usr.sbin/nandtool/usage.h @@ -0,0 +1,112 @@ +/*- + * Copyright (c) 2010-2012 Semihalf. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef __USAGE_H +#define __USAGE_H + +static const char nand_help_usage[] = + "Usage: %s help topic=\n" + "\n" + "Arguments:\n" + "\tcmd\t- [help|read|write|erase|readoob|writeoob|info]\n" + "\n"; + +static const char nand_read_usage[] = + "Usage: %s read dev= (block|page|pos)=n [count=n]\n" + "\n" + "Arguments:\n" + "\tdev\t- path to gnand device node\n" + "\tblock\t- starting block or\n" + "\tpage\t- starting page or\n" + "\tpos\t- starting position (in bytes, must be page-aligned)\n" + "\tout\t- output file (hexdump to stdout if not supplied)\n" + "\n" + "Note that you can only specify only one of: 'block', 'page', 'pos'\n" + "parameters at once. 'count' parameter is meaningful in terms of used\n" + "unit (page, block or byte).\n"; + +static const char nand_write_usage[] = + "Usage: %s write dev= in= (block|page|pos)=n [count=n]\n" + "\n" + "Arguments:\n" + "\tdev\t- path to gnand device node\n" + "\tin\t- path to input file which be writed to gnand\n" + "\tblock\t- starting block or\n" + "\tpage\t- starting page or\n" + "\tpos\t- starting position (in bytes, must be page-aligned)\n" + "\tcount\t- byte/page/block count\n" + "\n" + ""; + +static const char nand_erase_usage[] = + "Usage: %s erase dev= (block|page|pos)=n [count=n]\n" + "\n" + "Arguments:\n" + "\tdev\t- path to gnand device node\n" + "\tblock\t- starting block or\n" + "\tpage\t- starting page or\n" + "\tpos\t- starting position (in bytes, muse be block-aligned)\n" + "\tcount\t- byte/page/block count\n" + "\n" + "NOTE: position and count for erase operation MUST be block-aligned\n"; + +static const char nand_read_oob_usage[] = + "Usage: %s readoob dev= page=n [out=file] [count=n]\n" + "\n" + "Arguments:\n" + "\tdev\t- path to gnand device node\n" + "\tpage\t- page (page) number\n" + "\tout\t- outut file (hexdump to stdout if not supplied)\n" + "\tcount\t- page count (default is 1)\n" + "\n" + "If you supply count parameter with value other than 1, data will be\n" + "read from subsequent page's OOB areas\n"; + +static const char nand_write_oob_usage[] = + "Usage: %s writeoob dev= in= page=n [count=n]\n" + "\n" + "\tdev\t- path to gnand device node\n" + "\tin\t- path to file containing data which will be written\n" + "\tpage\t- page (page) number\n" + "\n" + "If you supply count parameter with value other than 1, data will be\n" + "written to subsequent page's OOB areas\n"; + +static const char nand_info_usage[] = + "Usage: %s info dev=\n" + "\n" + "Arguments:\n" + "\tdev\t- path to gnand device node\n"; + +static const char nand_stats_usage[] = + "Usage: %s stats dev= (page|block)=\n" + "\n" + "Arguments:\n" + "\tdev\t- path to gnand device node\n"; + +#endif /* __USAGE_H */ diff --git a/usr.sbin/ndiscvt/ndiscvt.8 b/usr.sbin/ndiscvt/ndiscvt.8 index 532de8ec3a8..a9bc916141f 100644 --- a/usr.sbin/ndiscvt/ndiscvt.8 +++ b/usr.sbin/ndiscvt/ndiscvt.8 @@ -187,7 +187,7 @@ been mounted), the extra files can simply be copied to the .Pa /compat/ndis directory, and they will be loaded into the kernel on demand when the -the driver needs them. +driver needs them. .Pp If however the driver is required to bootstrap the system (i.e., if diff --git a/usr.sbin/ndp/ndp.8 b/usr.sbin/ndp/ndp.8 index 76f558ca243..1fb63f815af 100644 --- a/usr.sbin/ndp/ndp.8 +++ b/usr.sbin/ndp/ndp.8 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 2, 2009 +.Dd July 9, 2012 .Dt NDP 8 .Os .\" @@ -192,15 +192,6 @@ on This flag is set by .Va net.inet6.ip6.auto_linklocal sysctl variable. -.It Ic prefer_source -Prefer addresses on the -.Ar interface -as candidates of the source address for outgoing packets. -The default value of this flag is off. -For more details about the entire algorithm of source address -selection, see the -.Pa IMPLEMENTATION -file supplied with the KAME kit. .It Ic disabled Disable IPv6 operation on the interface. When disabled, the interface discards any IPv6 packets diff --git a/usr.sbin/ndp/ndp.c b/usr.sbin/ndp/ndp.c index e245ac2976d..be21d0fc24a 100644 --- a/usr.sbin/ndp/ndp.c +++ b/usr.sbin/ndp/ndp.c @@ -1007,9 +1007,6 @@ ifinfo(ifname, argc, argv) #endif #ifdef ND6_IFF_AUTO_LINKLOCAL SETFLAG("auto_linklocal", ND6_IFF_AUTO_LINKLOCAL); -#endif -#ifdef ND6_IFF_PREFER_SOURCE - SETFLAG("prefer_source", ND6_IFF_PREFER_SOURCE); #endif SETVALUE("basereachable", ND.basereachable); SETVALUE("retrans", ND.retrans); @@ -1083,10 +1080,6 @@ ifinfo(ifname, argc, argv) #ifdef ND6_IFF_AUTO_LINKLOCAL if ((ND.flags & ND6_IFF_AUTO_LINKLOCAL)) printf("auto_linklocal "); -#endif -#ifdef ND6_IFF_PREFER_SOURCE - if ((ND.flags & ND6_IFF_PREFER_SOURCE)) - printf("prefer_source "); #endif } putc('\n', stdout); diff --git a/usr.sbin/newsyslog/newsyslog.8 b/usr.sbin/newsyslog/newsyslog.8 index 0e727e82605..82fe5b79465 100644 --- a/usr.sbin/newsyslog/newsyslog.8 +++ b/usr.sbin/newsyslog/newsyslog.8 @@ -166,7 +166,7 @@ is used. If the .Ar timefmt string is changed the old files created using the previous time format -will not be be automatically removed (unless the new format is very +will not be automatically removed (unless the new format is very similar to the old format). This is also the case when changing from sequential filenames to time based file names, and the other way around. diff --git a/usr.sbin/newsyslog/newsyslog.c b/usr.sbin/newsyslog/newsyslog.c index 7ebdddcf2a2..67a363e5511 100644 --- a/usr.sbin/newsyslog/newsyslog.c +++ b/usr.sbin/newsyslog/newsyslog.c @@ -1451,7 +1451,7 @@ static void delete_oldest_timelog(const struct conf_entry *ent, const char *archive_dir) { char *logfname, *s, *dir, errbuf[80]; - int dirfd, i, logcnt, max_logcnt, valid; + int dir_fd, i, logcnt, max_logcnt, valid; struct oldlog_entry *oldlogs; size_t logfname_len; struct dirent *dp; @@ -1486,7 +1486,7 @@ delete_oldest_timelog(const struct conf_entry *ent, const char *archive_dir) /* First we create a 'list' of all archived logfiles */ if ((dirp = opendir(dir)) == NULL) err(1, "Cannot open log directory '%s'", dir); - dirfd = dirfd(dirp); + dir_fd = dirfd(dirp); while ((dp = readdir(dirp)) != NULL) { if (dp->d_type != DT_REG) continue; @@ -1578,7 +1578,7 @@ delete_oldest_timelog(const struct conf_entry *ent, const char *archive_dir) if (noaction) printf("\trm -f %s/%s\n", dir, oldlogs[i].fname); - else if (unlinkat(dirfd, oldlogs[i].fname, 0) != 0) { + else if (unlinkat(dir_fd, oldlogs[i].fname, 0) != 0) { snprintf(errbuf, sizeof(errbuf), "Could not delet old logfile '%s'", oldlogs[i].fname); @@ -1972,7 +1972,8 @@ do_zipwork(struct zipwork_entry *zwork) else pgm_name++; - if (zwork->zw_swork != NULL && zwork->zw_swork->sw_pidok <= 0) { + if (zwork->zw_swork != NULL && zwork->zw_swork->run_cmd == 0 && + zwork->zw_swork->sw_pidok <= 0) { warnx( "log %s not compressed because daemon(s) not notified", zwork->zw_fname); diff --git a/usr.sbin/newsyslog/newsyslog.conf.5 b/usr.sbin/newsyslog/newsyslog.conf.5 index 589d98f0afa..a053f2f01d5 100644 --- a/usr.sbin/newsyslog/newsyslog.conf.5 +++ b/usr.sbin/newsyslog/newsyslog.conf.5 @@ -155,12 +155,17 @@ The particular format of the time in restricted .Tn ISO 8601 is: .Sm off +.Oo Oo Oo Oo Oo +.Va cc Oc +.Va yy Oc +.Va mm Oc +.Va dd Oc .Oo -.Op Oo Oo Oo Va cc Oc Va yy Oc Va mm Oc Va dd -.Oo -.Li T -.Op Va hh Oo Va mm Oo Va ss Oc Oc Oc -.Oc . +.Li T Oo +.Va hh Oo +.Va mm Oo +.Va ss +.Oc Oc Oc Oc Oc . .Sm on Optional date fields default to the appropriate component of the current date; optional time fields default to midnight; hence if today diff --git a/usr.sbin/nfsd/nfsv4.4 b/usr.sbin/nfsd/nfsv4.4 index 1d206ecc1e3..d2c19ede9bd 100644 --- a/usr.sbin/nfsd/nfsv4.4 +++ b/usr.sbin/nfsd/nfsv4.4 @@ -299,7 +299,7 @@ backup copy of the file .Xr nfsd 8 , .Xr nfsdumpstate 8 , .Xr nfsrevoke 8 , -.Xr nfsuserd 8 , +.Xr nfsuserd 8 .Sh BUGS At this time, there is no recall of delegations for local file system operations. diff --git a/usr.sbin/nscd/cachelib.c b/usr.sbin/nscd/cachelib.c index afdbc0a3fe2..ab95b2939fe 100644 --- a/usr.sbin/nscd/cachelib.c +++ b/usr.sbin/nscd/cachelib.c @@ -726,6 +726,12 @@ cache_read(struct cache_entry_ *entry, const char *key, size_t key_size, TRACE_OUT(cache_read); return (-1); } + /* pretend that entry was not found if confidence is below threshold*/ + if (find_res->confidence < + common_entry->common_params.confidence_threshold) { + TRACE_OUT(cache_read); + return (-1); + } if ((common_entry->common_params.max_lifetime.tv_sec != 0) || (common_entry->common_params.max_lifetime.tv_usec != 0)) { @@ -826,6 +832,24 @@ cache_write(struct cache_entry_ *entry, const char *key, size_t key_size, item = HASHTABLE_GET_ENTRY(&(common_entry->items), hash); find_res = HASHTABLE_ENTRY_FIND(cache_ht_, item, &item_data); if (find_res != NULL) { + if (find_res->confidence < common_entry->common_params.confidence_threshold) { + /* duplicate entry is no error, if confidence is low */ + if ((find_res->value_size == value_size) && + (memcmp(find_res->value, value, value_size) == 0)) { + /* increase confidence on exact match (key and values) */ + find_res->confidence++; + } else { + /* create new entry with low confidence, if value changed */ + free(item_data.value); + item_data.value = malloc(value_size); + assert(item_data.value != NULL); + memcpy(item_data.value, value, value_size); + item_data.value_size = value_size; + find_res->confidence = 1; + } + TRACE_OUT(cache_write); + return (0); + } TRACE_OUT(cache_write); return (-1); } @@ -839,6 +863,8 @@ cache_write(struct cache_entry_ *entry, const char *key, size_t key_size, memcpy(item_data.value, value, value_size); item_data.value_size = value_size; + item_data.confidence = 1; + policy_item = common_entry->policies[0]->create_item_func(); policy_item->key = item_data.key; policy_item->key_size = item_data.key_size; diff --git a/usr.sbin/nscd/cachelib.h b/usr.sbin/nscd/cachelib.h index 37f0041e9d3..9df50e786d2 100644 --- a/usr.sbin/nscd/cachelib.h +++ b/usr.sbin/nscd/cachelib.h @@ -92,6 +92,7 @@ struct common_cache_entry_params { size_t satisf_elemsize; /* if entry size is exceeded, * this number of elements will be left, * others will be deleted */ + int confidence_threshold; /* number matching replies required */ struct timeval max_lifetime; /* if 0 then no check is made */ enum cache_policy_t policy; /* policy used for transformations */ }; @@ -116,6 +117,7 @@ struct cache_ht_item_data_ { size_t value_size; struct cache_policy_item_ *fifo_policy_item; + int confidence; /* incremented for each verification */ }; struct cache_ht_item_ { diff --git a/usr.sbin/nscd/config.c b/usr.sbin/nscd/config.c index 856cf97d8bd..f44e9862d4b 100644 --- a/usr.sbin/nscd/config.c +++ b/usr.sbin/nscd/config.c @@ -209,6 +209,7 @@ create_def_configuration_entry(const char *name) positive_params.max_elemsize = DEFAULT_POSITIVE_ELEMENTS_SIZE; positive_params.satisf_elemsize = DEFAULT_POSITIVE_ELEMENTS_SIZE / 2; positive_params.max_lifetime.tv_sec = DEFAULT_POSITIVE_LIFETIME; + positive_params.confidence_threshold = DEFAULT_POSITIVE_CONF_THRESH; positive_params.policy = CPT_LRU; memcpy(&negative_params, &positive_params, @@ -216,6 +217,7 @@ create_def_configuration_entry(const char *name) negative_params.max_elemsize = DEFAULT_NEGATIVE_ELEMENTS_SIZE; negative_params.satisf_elemsize = DEFAULT_NEGATIVE_ELEMENTS_SIZE / 2; negative_params.max_lifetime.tv_sec = DEFAULT_NEGATIVE_LIFETIME; + negative_params.confidence_threshold = DEFAULT_NEGATIVE_CONF_THRESH; negative_params.policy = CPT_FIFO; memset(&default_common_timeout, 0, sizeof(struct timeval)); diff --git a/usr.sbin/nscd/config.h b/usr.sbin/nscd/config.h index 6c42932772c..29770e64caa 100644 --- a/usr.sbin/nscd/config.h +++ b/usr.sbin/nscd/config.h @@ -44,9 +44,11 @@ #define DEFAULT_POSITIVE_ELEMENTS_SIZE (2048) #define DEFAULT_POSITIVE_LIFETIME (3600) +#define DEFAULT_POSITIVE_CONF_THRESH (1) #define DEFAULT_NEGATIVE_ELEMENTS_SIZE (2048) #define DEFAULT_NEGATIVE_LIFETIME (60) +#define DEFAULT_NEGATIVE_CONF_THRESH (1) /* (2) ??? */ #define DEFAULT_MULTIPART_ELEMENTS_SIZE (1024 * 8) #define DEFAULT_MULITPART_SESSIONS_SIZE (1024) diff --git a/usr.sbin/nscd/nscd.conf.5 b/usr.sbin/nscd/nscd.conf.5 index b5700a4e7b1..b59449b1115 100644 --- a/usr.sbin/nscd/nscd.conf.5 +++ b/usr.sbin/nscd/nscd.conf.5 @@ -102,6 +102,17 @@ The same as the positive-policy, but this one is applied to the negative elements of the given .Ar cachename . The default policy is fifo. +.It Va negative-confidence-threshold Oo Ar cachename Oc Op Ar value +The number of times a query must have failed before the cache accepts +that the element can not be found. +At the default value of 1 each negative query result is cached and +immediately returned from the cache on further queries. +Higher numbers cause queries to be retried at the configured data +sources the given number of times, before the negative result is +returned from the cache on further queries. +This allows to probe for the existence of an entry, and then to create +it if it did not exist, without the negative probe result preventing +access to the new entry for the duration of the negative TTL. .It Va suggested-size Oo Ar cachename Oc Op Ar value This is the internal hash table size. The value should be a prime number for optimum performance. diff --git a/usr.sbin/nscd/parser.c b/usr.sbin/nscd/parser.c index a36821a75e7..533dc79ddb3 100644 --- a/usr.sbin/nscd/parser.c +++ b/usr.sbin/nscd/parser.c @@ -167,6 +167,38 @@ set_negative_time_to_live(struct configuration *config, TRACE_OUT(set_negative_time_to_live); } +static void +set_positive_confidence_threshold(struct configuration *config, + const char *entry_name, int conf_thresh) +{ + struct configuration_entry *entry; + + TRACE_IN(set_positive_conf_thresh); + assert(conf_thresh > 0); + assert(entry_name != NULL); + + entry = find_create_entry(config, entry_name); + assert(entry != NULL); + entry->positive_cache_params.confidence_threshold = conf_thresh; + + TRACE_OUT(set_positive_conf_thresh); +} + +static void +set_negative_confidence_threshold(struct configuration *config, + const char *entry_name, int conf_thresh) +{ + struct configuration_entry *entry; + + TRACE_IN(set_negative_conf_thresh); + assert(conf_thresh > 0); + assert(entry_name != NULL); + entry = find_create_entry(config, entry_name); + assert(entry != NULL); + entry->negative_cache_params.confidence_threshold = conf_thresh; + TRACE_OUT(set_negative_conf_thresh); +} + /* * Hot count is actually the elements size limit. */ @@ -393,6 +425,12 @@ parse_config_file(struct configuration *config, fields[1], value); continue; } else if ((field_count == 3) && + (strcmp(fields[0], "positive-confidence-threshold") == 0) && + ((value = get_number(fields[2], 1, -1)) != -1)) { + set_positive_confidence_threshold(config, + fields[1], value); + continue; + } else if ((field_count == 3) && (strcmp(fields[0], "positive-policy") == 0) && (check_cachename(fields[1]) == 0) && ((value = get_policy(fields[2])) != -1)) { @@ -416,6 +454,12 @@ parse_config_file(struct configuration *config, fields[1], value); continue; } else if ((field_count == 3) && + (strcmp(fields[0], "negative-confidence-threshold") == 0) && + ((value = get_number(fields[2], 1, -1)) != -1)) { + set_negative_confidence_threshold(config, + fields[1], value); + continue; + } else if ((field_count == 3) && (strcmp(fields[0], "negative-policy") == 0) && (check_cachename(fields[1]) == 0) && ((value = get_policy(fields[2])) != -1)) { diff --git a/usr.sbin/ntp/doc/ntp.conf.5 b/usr.sbin/ntp/doc/ntp.conf.5 index c19bc29bb66..1aeed3356e2 100644 --- a/usr.sbin/ntp/doc/ntp.conf.5 +++ b/usr.sbin/ntp/doc/ntp.conf.5 @@ -268,7 +268,7 @@ Options: All packets sent to and received from the server or peer are to include authentication fields encrypted using the autokey scheme described in -.Sx Authentication Options . +.Sx Authentication Commands . .It Cm burst when the server is reachable, send a burst of eight packets instead of the usual one. @@ -305,7 +305,7 @@ default is to include no encryption field. .It Cm minpoll Ar minpoll .It Cm maxpoll Ar maxpoll These options specify the minimum and maximum poll intervals -for NTP messages, as a power of 2 in seconds +for NTP messages, as a power of 2 in seconds. The maximum poll interval defaults to 10 (1,024 s), but can be increased by the .Cm maxpoll @@ -363,7 +363,7 @@ Note that, in order to avoid accidental or malicious disruption in this mode, both the server and client should operate using symmetric-key or public-key authentication as described in -.Sx Authentication Options . +.Sx Authentication Commands . .It Ic manycastserver Ar address ... This command enables reception of manycast client messages to the multicast group address(es) (type m) specified. @@ -376,7 +376,7 @@ Note that, in order to avoid accidental or malicious disruption in this mode, both the server and client should operate using symmetric-key or public-key authentication as described in -.Sx Authentication Options . +.Sx Authentication Commands . .It Ic multicastclient Ar address ... This command enables reception of multicast server messages to the multicast group address(es) (type m) specified. @@ -389,7 +389,7 @@ Note that, in order to avoid accidental or malicious disruption in this mode, both the server and client should operate using symmetric-key or public-key authentication as described in -.Sx Authentication Options . +.Sx Authentication Commands . .El .Sh Authentication Support Authentication support allows the NTP client to verify that the @@ -466,7 +466,7 @@ of these checks and be discarded. Furthermore, the Autokey scheme requires a preliminary protocol exchange to obtain the server certificate, verify its -credentials and initialize the protocol +credentials and initialize the protocol. .Pp The .Cm auth @@ -669,7 +669,7 @@ using the host name, network address and public keys, all of which are bound together by the protocol specifically to deflect masquerade attacks. For this reason Autokey -includes the source and destinatino IP addresses in message digest +includes the source and destination IP addresses in message digest computations and so the same addresses must be available at both the server and client. For this reason operation @@ -796,7 +796,7 @@ The certificate extension fields must not contain either a subject key identifier or a issuer key identifier field; however, an extended key usage field for a trusted host must contain the value -.Cm trustRoot ; . +.Cm trustRoot . Other extension fields are ignored. .Ss Authentication Commands .Bl -tag -width indent @@ -1068,10 +1068,11 @@ following form to the file generation set named The first two fields show the date (Modified Julian Day) and time (seconds and fraction past UTC midnight). The next field shows the peer -address in dotted-quad notation, The final message field includes the +address in dotted-quad notation. +The final message field includes the message type and certain ancillary information. See the -.Sx Authentication Options +.Sx Authentication Commands section for further information. .It Cm loopstats Enables recording of loop filter statistics information. @@ -1155,7 +1156,7 @@ Time in hours since the system was last rebooted. .It Packets received Cm 81965 Total number of packets received. .It Packets processed Cm 0 -Number of packets received in response to previous packets sent +Number of packets received in response to previous packets sent. .It Current version Cm 9546 Number of packets matching the current NTP version. .It Previous version Cm 56 @@ -1461,7 +1462,7 @@ subcommand specifies the minimum average packet spacing, while the .Cm minimum subcommand specifies the minimum packet spacing. -Packets that violate these minima are discarded +Packets that violate these minimum are discarded and a kiss-o'-death packet returned if enabled. The default minimum average and minimum are 5 and 2, respectively. @@ -1775,7 +1776,7 @@ It is often useful to narrow the range of acceptable servers which can be found by manycast client associations. Because manycast servers respond only when the client stratum is equal to or greater than the server stratum, -primary (stratum 1) servers fill find only primary servers +primary (stratum 1) servers will find only primary servers in TTL range, which is probably the most common objective. However, unless configured otherwise, all manycast clients in TTL range will eventually find all primary servers @@ -1955,7 +1956,7 @@ peers remaining. This value defaults to 1, but can be changed to any number from 1 to 15. .It Cm minclock Ar minclock -The clustering algorithm repeatedly casts out outlyer +The clustering algorithm repeatedly casts out outerlayer associations until no more than .Cm minclock associations remain. @@ -1965,7 +1966,7 @@ configured sources. .It Cm minsane Ar minsane This is the minimum number of candidates available to the clock selection algorithm in order to produce -one or more truechimers for the clustering algorithm. +one or more true chimers for the clustering algorithm. If fewer than this number are available, the clock is undisciplined and allowed to run free. The default is 1 diff --git a/usr.sbin/pc-sysinstall/backend/functions-bsdlabel.sh b/usr.sbin/pc-sysinstall/backend/functions-bsdlabel.sh index 3e54df4fe1b..e76721caee5 100755 --- a/usr.sbin/pc-sysinstall/backend/functions-bsdlabel.sh +++ b/usr.sbin/pc-sysinstall/backend/functions-bsdlabel.sh @@ -50,41 +50,39 @@ get_fs_line_xvars() ACTIVEDEV="${1}" LINE="${2}" - echo $LINE | cut -d ' ' -f 4 | grep -q ' (' 2>/dev/null + echo $LINE | cut -d ' ' -f 4 | grep -q '(' 2>/dev/null + if [ $? -ne 0 ] ; then return ; fi + + # See if we are looking for ZFS specific options + echo $LINE | grep -q '^ZFS' 2>/dev/null if [ $? -eq 0 ] ; then + ZTYPE="NONE" + ZFSVARS="`echo $LINE | cut -d ' ' -f 4-20 |cut -d '(' -f 2- | cut -d ')' -f 1 | xargs`" - # See if we are looking for ZFS specific options - echo $LINE | grep -q '^ZFS' 2>/dev/null + echo $ZFSVARS | grep -qE "^(disk|file|mirror|raidz(1|2|3)?|spare|log|cache):" 2>/dev/null if [ $? -eq 0 ] ; then - ZTYPE="NONE" - ZFSVARS="`echo $LINE | cut -d ' ' -f 4 |cut -d '(' -f 2- | cut -d ')' -f 1 | xargs`" - - echo $ZFSVARS | grep -qE "^(disk|file|mirror|raidz(1|2|3)?|spare|log|cache):" 2>/dev/null - if [ $? -eq 0 ] ; then ZTYPE=`echo $ZFSVARS | cut -f1 -d:` ZFSVARS=`echo $ZFSVARS | sed "s|$ZTYPE: ||g" | sed "s|$ZTYPE:||g"` - fi - - # Return the ZFS options - if [ "${ZTYPE}" = "NONE" ] ; then - VAR="${ACTIVEDEV} ${ZFSVARS}" - else - VAR="${ZTYPE} ${ACTIVEDEV} ${ZFSVARS}" - fi - export VAR - return - fi # End of ZFS block - - # See if we are looking for UFS specific newfs options - echo $LINE | grep -q '^UFS' 2>/dev/null - if [ $? -eq 0 ] ; then - FSVARS="`echo $LINE | cut -d '(' -f 2- | cut -d ')' -f 1 | xargs`" - VAR="${FSVARS}" - export VAR - return fi - fi # End of xtra-options block + # Return the ZFS options + if [ "${ZTYPE}" = "NONE" ] ; then + VAR="${ACTIVEDEV} ${ZFSVARS}" + else + VAR="${ZTYPE} ${ACTIVEDEV} ${ZFSVARS}" + fi + export VAR + return + fi # End of ZFS block + + # See if we are looking for UFS specific newfs options + echo $LINE | grep -q '^UFS' 2>/dev/null + if [ $? -eq 0 ] ; then + FSVARS="`echo $LINE | cut -d '(' -f 2- | cut -d ')' -f 1 | xargs`" + VAR="${FSVARS}" + export VAR + return + fi # If we got here, set VAR to empty and export export VAR="" @@ -96,8 +94,10 @@ setup_zfs_mirror_parts() { _nZFS="" + ZTYPE="`echo ${1} | awk '{print $1}'`" + # Using mirroring, setup boot partitions on each disk - _mirrline="`echo ${1} | sed 's|mirror ||g'`" + _mirrline="`echo ${1} | sed 's|mirror ||g' | sed 's|raidz1 ||g' | sed 's|raidz2 ||g' | sed 's|raidz3 ||g' | sed 's|raidz ||g'`" for _zvars in $_mirrline do echo "Looping through _zvars: $_zvars" >>${LOGOUT} @@ -107,15 +107,16 @@ setup_zfs_mirror_parts() is_disk "$_zvars" >/dev/null 2>/dev/null if [ $? -eq 0 ] ; then - echo "Setting up ZFS mirror disk $_zvars" >>${LOGOUT} + echo "Setting up ZFS disk $_zvars" >>${LOGOUT} init_gpt_full_disk "$_zvars" >/dev/null 2>/dev/null - rc_halt "gpart add -t freebsd-zfs ${_zvars}" >/dev/null 2>/dev/null + rc_halt "gpart add -a 4k -t freebsd-zfs ${_zvars}" >/dev/null 2>/dev/null + rc_halt "gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ${_zvars}" >/dev/null 2>/dev/null _nZFS="$_nZFS ${_zvars}p2" else _nZFS="$_nZFS ${_zvars}" fi done - echo "mirror $2 `echo $_nZFS | tr -s ' '`" + echo "$ZTYPE $2 `echo $_nZFS | tr -s ' '`" } ; # Function which creates a unique label name for the specified mount @@ -176,6 +177,8 @@ setup_gpart_partitions() # Lets read in the config file now and setup our partitions if [ "${_pType}" = "gpt" ] ; then CURPART="2" + elif [ "${_pType}" = "apm" ] ; then + CURPART="3" else PARTLETTER="a" CURPART="1" @@ -254,6 +257,9 @@ setup_gpart_partitions() if [ "${CURPART}" = "2" -a "$_pType" = "gpt" ] ; then export FOUNDROOT="0" fi + if [ "${CURPART}" = "3" -a "$_pType" = "apm" ] ; then + export FOUNDROOT="0" + fi if [ "${CURPART}" = "1" -a "$_pType" = "mbr" ] ; then export FOUNDROOT="0" fi @@ -268,6 +274,9 @@ setup_gpart_partitions() if [ "${CURPART}" != "2" -a "${_pType}" = "gpt" ] ; then exit_err "/boot partition must be first partition" fi + if [ "${CURPART}" != "3" -a "${_pType}" = "apm" ] ; then + exit_err "/boot partition must be first partition" + fi if [ "${CURPART}" != "1" -a "${_pType}" = "mbr" ] ; then exit_err "/boot partition must be first partition" fi @@ -287,18 +296,22 @@ setup_gpart_partitions() # Get any extra options for this fs / line if [ "${_pType}" = "gpt" ] ; then get_fs_line_xvars "${_pDisk}p${CURPART}" "${STRING}" + elif [ "${_pType}" = "apm" ] ; then + get_fs_line_xvars "${_pDisk}s${CURPART}" "${STRING}" else get_fs_line_xvars "${_wSlice}${PARTLETTER}" "${STRING}" fi - XTRAOPTS="${VAR}" + XTRAOPTS="$VAR" # Check if using zfs mirror - echo ${XTRAOPTS} | grep -q "mirror" 2>/dev/null + echo ${XTRAOPTS} | grep -q -e "mirror" -e "raidz" if [ $? -eq 0 -a "$FS" = "ZFS" ] ; then if [ "${_pType}" = "gpt" -o "${_pType}" = "gptslice" ] ; then XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${_pDisk}p${CURPART}") + elif [ "${_pType}" = "apm" ] ; then + XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${_pDisk}s${CURPART}") else - XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${_wSlice}") + XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${_wSlice}${PARTLETTER}") fi fi @@ -322,6 +335,9 @@ setup_gpart_partitions() elif [ "${_pType}" = "gptslice" ]; then sleep 2 rc_halt "gpart add ${SOUT} -t ${PARTYPE} ${_wSlice}" + elif [ "${_pType}" = "apm" ]; then + sleep 2 + rc_halt "gpart add ${SOUT} -t ${PARTYPE} ${_pDisk}" else sleep 2 rc_halt "gpart add ${SOUT} -t ${PARTYPE} -i ${CURPART} ${_wSlice}" @@ -351,6 +367,18 @@ setup_gpart_partitions() if [ -n "${ENCPASS}" ] ; then echo "${ENCPASS}" >${PARTDIR}-enc/${_dFile}p${CURPART}-encpass fi + elif [ "${_pType}" = "apm" ] ; then + _dFile="`echo $_pDisk | sed 's|/|-|g'`" + echo "${FS}#${MNT}#${ENC}#${PLABEL}#GPT#${XTRAOPTS}" >${PARTDIR}/${_dFile}s${CURPART} + + # Clear out any headers + sleep 2 + dd if=/dev/zero of=${_pDisk}s${CURPART} count=2048 2>/dev/null + + # If we have a enc password, save it as well + if [ -n "${ENCPASS}" ] ; then + echo "${ENCPASS}" >${PARTDIR}-enc/${_dFile}s${CURPART}-encpass + fi else # MBR Partition or GPT slice _dFile="`echo $_wSlice | sed 's|/|-|g'`" @@ -367,9 +395,10 @@ setup_gpart_partitions() # Increment our parts counter - if [ "$_pType" = "gpt" ] ; then + if [ "$_pType" = "gpt" -o "$_pType" = "apm" ] ; then CURPART=$((CURPART+1)) - # If this is a gpt partition, we can continue and skip the MBR part letter stuff + # If this is a gpt/apm partition, + # we can continue and skip the MBR part letter stuff continue else CURPART=$((CURPART+1)) @@ -436,6 +465,9 @@ populate_disk_label() if [ "$type" = "mbr" ] ; then wrkslice="${diskid}s${slicenum}" fi + if [ "$type" = "apm" ] ; then + wrkslice="${diskid}s${slicenum}" + fi if [ "$type" = "gpt" -o "$type" = "gptslice" ] ; then wrkslice="${diskid}p${slicenum}" fi @@ -473,6 +505,9 @@ setup_disk_label() if [ "$type" = "gpt" -a ! -e "${disk}p${pnum}" ] ; then exit_err "ERROR: The partition ${i} doesn't exist! gpart failure!" fi + if [ "$type" = "apm" -a ! -e "${disk}s${pnum}" ] ; then + exit_err "ERROR: The partition ${i} doesn't exist! gpart failure!" + fi if [ "$type" = "gptslice" -a ! -e "${disk}p${pnum}" ] ; then exit_err "ERROR: The partition ${i} doesn't exist! gpart failure!" fi diff --git a/usr.sbin/pc-sysinstall/backend/functions-disk.sh b/usr.sbin/pc-sysinstall/backend/functions-disk.sh index 03064d5aaf0..8e8cbfdfb73 100755 --- a/usr.sbin/pc-sysinstall/backend/functions-disk.sh +++ b/usr.sbin/pc-sysinstall/backend/functions-disk.sh @@ -464,6 +464,12 @@ setup_disk_slice() # Found our flag to commit this disk setup / lets do sanity check and do it if [ ! -z "${DISK}" -a ! -z "${PTYPE}" ] then + # Make sure we are only installing ppc to full disk + if [ `uname -m` = "powerpc" -o `uname -m` = "powerpc64" ]; then + if [ "$PTYPE" != "all" ] ; then + exit_err "powerpc can only be installed to a full disk" + fi + fi case ${PTYPE} in all) @@ -488,6 +494,12 @@ setup_disk_slice() tmpSLICE="${DISK}p1" fi + if [ `uname -m` = "powerpc" -o `uname -m` = "powerpc64" ] + then + PSCHEME="APM" + tmpSLICE="${DISK}s1" + fi + run_gpart_full "${DISK}" "${BMANAGER}" "${PSCHEME}" ;; @@ -597,6 +609,30 @@ clear_backup_gpt_table() rc_nohalt "dd if=/dev/zero of=${1} bs=1m oseek=`diskinfo ${1} | awk '{print int($3 / (1024*1024)) - 4;}'`" } ; +# Function which runs gpart and creates a single large APM partition scheme +init_apm_full_disk() +{ + _intDISK=$1 + + # Set our sysctl so we can overwrite any geom using drives + sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT} + + # Stop any journaling + stop_gjournal "${_intDISK}" + + # Remove any existing partitions + delete_all_gpart "${_intDISK}" + + sleep 2 + + echo_log "Running gpart on ${_intDISK}" + rc_halt "gpart create -s APM ${_intDISK}" + rc_halt "gpart add -s 800k -t freebsd-boot ${_intDISK}" + + echo_log "Stamping boot sector on ${_intDISK}" + rc_halt "gpart bootcode -p /boot/boot1.hfs -i 1 ${_intDISK}" + +} # Function which runs gpart and creates a single large GPT partition scheme init_gpt_full_disk() @@ -653,6 +689,9 @@ init_mbr_full_disk() echo_log "Cleaning up ${_intDISK}s1" rc_halt "dd if=/dev/zero of=${_intDISK}s1 count=1024" + # Make the partition active + rc_halt "gpart set -a active -i 1 ${_intDISK}" + if [ "$_intBOOT" = "bsd" ] ; then echo_log "Stamping boot0 on ${_intDISK}" rc_halt "gpart bootcode -b /boot/boot0 ${_intDISK}" @@ -670,7 +709,10 @@ run_gpart_full() BOOT=$2 SCHEME=$3 - if [ "$SCHEME" = "MBR" ] ; then + if [ "$SCHEME" = "APM" ] ; then + init_apm_full_disk "$DISK" + slice=`echo "${DISK}:1:apm" | sed 's|/|-|g'` + elif [ "$SCHEME" = "MBR" ] ; then init_mbr_full_disk "$DISK" "$BOOT" slice=`echo "${DISK}:1:mbr" | sed 's|/|-|g'` else @@ -727,6 +769,10 @@ run_gpart_gpt_part() # Init the MBR partition rc_halt "gpart create -s BSD ${DISK}p${slicenum}" + # Stamp the bootloader + sleep 4 + rc_halt "gpart bootcode -b /boot/boot ${DISK}p${slicenum}" + # Set the slice to the format we'll be using for gpart later slice=`echo "${1}:${3}:gptslice" | sed 's|/|-|g'` diff --git a/usr.sbin/pc-sysinstall/backend/functions-localize.sh b/usr.sbin/pc-sysinstall/backend/functions-localize.sh index 7ee898cb3f1..b92e710f196 100755 --- a/usr.sbin/pc-sysinstall/backend/functions-localize.sh +++ b/usr.sbin/pc-sysinstall/backend/functions-localize.sh @@ -168,6 +168,7 @@ localize_key_layout() # Set the keylayout in rc.conf case ${KEYLAYOUT} in am) KEYLAYOUT_CONSOLE="hy.armscii-8" ;; + ca) KEYLAYOUT_CONSOLE="fr_CA.acc.iso" ;; ch) KEYLAYOUT_CONSOLE="swissgerman.iso" ;; cz) KEYLAYOUT_CONSOLE="cz.iso2" ;; de) KEYLAYOUT_CONSOLE="german.iso" ;; diff --git a/usr.sbin/pc-sysinstall/backend/functions-networking.sh b/usr.sbin/pc-sysinstall/backend/functions-networking.sh index d8e3da7499f..1aa08bdd808 100755 --- a/usr.sbin/pc-sysinstall/backend/functions-networking.sh +++ b/usr.sbin/pc-sysinstall/backend/functions-networking.sh @@ -192,7 +192,7 @@ save_manual_nic() # Get the target nic NIC="$1" - get_value_from_cfg netSaveIP + get_value_from_cfg netSaveIP_${NIC} NETIP="${VAL}" if [ "$NETIP" = "DHCP" ] @@ -212,7 +212,7 @@ save_manual_nic() IFARGS="inet ${NETIP}" # Check if we have a netmask to set - get_value_from_cfg netSaveMask + get_value_from_cfg netSaveMask_${NIC} NETMASK="${VAL}" if [ -n "${NETMASK}" ] then @@ -220,7 +220,7 @@ save_manual_nic() fi fi - get_value_from_cfg netSaveIPv6 + get_value_from_cfg netSaveIPv6_${NIC} NETIP6="${VAL}" if [ -n "${NETIP6}" ] then @@ -239,6 +239,12 @@ save_manual_nic() echo "ifconfig_${NIC}_ipv6=\"${IF6ARGS}\"" >>${FSMNT}/etc/rc.conf fi +}; + +# Function which saves a manual gateway router setup to the installed system +save_manual_router() +{ + # Check if we have a default router to set get_value_from_cfg netSaveDefaultRouter NETROUTE="${VAL}" @@ -253,19 +259,30 @@ save_manual_nic() echo "ipv6_defaultrouter=\"${NETROUTE}\"" >>${FSMNT}/etc/rc.conf fi +}; + +save_manual_nameserver() +{ # Check if we have a nameserver to enable : > ${FSMNT}/etc/resolv.conf - get_value_from_cfg netSaveNameServer - NAMESERVER="${VAL}" - if [ -n "${NAMESERVER}" ] + get_value_from_cfg_with_spaces netSaveNameServer + NAMESERVERLIST="${VAL}" + if [ ! -z "${NAMESERVERLIST}" ] then - echo "nameserver ${NAMESERVER}" >>${FSMNT}/etc/resolv.conf + for NAMESERVER in ${NAMESERVERLIST} + do + echo "nameserver ${NAMESERVER}" >>${FSMNT}/etc/resolv.conf + done fi - get_value_from_cfg netSaveIPv6NameServer - NAMESERVER="${VAL}" - if [ -n "${NAMESERVER}" ] + + get_value_from_cfg_with_spaces netSaveIPv6NameServer + NAMESERVERLIST="${VAL}" + if [ ! -z "${NAMESERVERLIST}" ] then - echo "nameserver ${NAMESERVER}" >>${FSMNT}/etc/resolv.conf + for NAMESERVER in ${NAMESERVERLIST} + do + echo "nameserver ${NAMESERVER}" >>${FSMNT}/etc/resolv.conf + done fi }; @@ -454,25 +471,30 @@ save_networking_install() { # Check if we have any networking requested to save - get_value_from_cfg netSaveDev + get_value_from_cfg_with_spaces netSaveDev if [ -z "${VAL}" ] then return 0 fi - NETDEV="${VAL}" - if [ "$NETDEV" = "AUTO-DHCP" ] + NETDEVLIST="${VAL}" + if [ "$NETDEVLIST" = "AUTO-DHCP" ] then save_auto_dhcp - elif [ "$NETDEV" = "IPv6-SLAAC" ] + elif [ "$NETDEVLIST" = "IPv6-SLAAC" ] then save_auto_slaac - elif [ "$NETDEV" = "AUTO-DHCP-SLAAC" ] + elif [ "$NETDEVLIST" = "AUTO-DHCP-SLAAC" ] then save_auto_dhcp save_auto_slaac else - save_manual_nic ${NETDEV} + for NETDEV in ${NETDEVLIST} + do + save_manual_nic ${NETDEV} + done + save_manual_router + save_manual_nameserver fi }; diff --git a/usr.sbin/pc-sysinstall/backend/functions-newfs.sh b/usr.sbin/pc-sysinstall/backend/functions-newfs.sh index 7be9bf3d5b5..1ebf922cdf7 100755 --- a/usr.sbin/pc-sysinstall/backend/functions-newfs.sh +++ b/usr.sbin/pc-sysinstall/backend/functions-newfs.sh @@ -44,6 +44,23 @@ setup_zfs_filesystem() sleep 5 sync + # Check if we have multiple zfs mounts specified + for i in `echo ${PARTMNT} | sed 's|,| |g'` + do + # Check if we ended up with needing a zfs bootable partition + if [ "${i}" = "/" -o "${i}" = "/boot" ] + then + if [ "$HAVEBOOT" = "YES" ] ; then continue ; fi + if [ "${PARTGEOM}" = "MBR" ] ; then + # Lets stamp the proper ZFS boot loader + echo_log "Setting up ZFS boot loader support" + rc_halt "dd if=/boot/zfsboot of=${ROOTSLICE} count=1" + rc_halt "dd if=/boot/zfsboot of=${PART}${EXT} skip=1 seek=1024" + fi + fi + done + + # Check if we have some custom zpool arguments and use them if so if [ ! -z "${ZPOOLOPTS}" ] ; then rc_halt "zpool create -m none -f ${ZPOOLNAME} ${ZPOOLOPTS}" @@ -55,23 +72,13 @@ setup_zfs_filesystem() # Disable atime for this zfs partition, speed increase rc_nohalt "zfs set atime=off ${ZPOOLNAME}" - # Check if we have multiple zfs mounts specified + # Check if we need to set a bootable zpool for i in `echo ${PARTMNT} | sed 's|,| |g'` do - # Check if we ended up with needing a zfs bootable partition - if [ "${i}" = "/" -o "${i}" = "/boot" ] - then + if [ "${i}" = "/" -o "${i}" = "/boot" ] ; then if [ "$HAVEBOOT" = "YES" ] ; then continue ; fi - if [ "${PARTGEOM}" = "MBR" ] - then - # Lets stamp the proper ZFS boot loader - echo_log "Setting up ZFS boot loader support" - rc_halt "zpool set bootfs=${ZPOOLNAME} ${ZPOOLNAME}" - rc_halt "zpool export ${ZPOOLNAME}" - rc_halt "dd if=/boot/zfsboot of=${ROOTSLICE} count=1" - rc_halt "dd if=/boot/zfsboot of=${PART}${EXT} skip=1 seek=1024" - rc_halt "zpool import ${ZPOOLNAME}" - fi + echo_log "Stamping zpool as bootfs" + rc_halt "zpool set bootfs=${ZPOOLNAME} ${ZPOOLNAME}" fi done @@ -90,11 +97,6 @@ setup_filesystems() for PART in `ls ${PARTDIR}` do PARTDEV="`echo $PART | sed 's|-|/|g'`" - if [ ! -e "${PARTDEV}" ] - then - exit_err "ERROR: The partition ${PARTDEV} does not exist. Failure in bsdlabel?" - fi - PARTFS="`cat ${PARTDIR}/${PART} | cut -d '#' -f 1`" PARTMNT="`cat ${PARTDIR}/${PART} | cut -d '#' -f 2`" PARTENC="`cat ${PARTDIR}/${PART} | cut -d '#' -f 3`" @@ -103,6 +105,10 @@ setup_filesystems() PARTXTRAOPTS="`cat ${PARTDIR}/${PART} | cut -d '#' -f 6`" PARTIMAGE="`cat ${PARTDIR}/${PART} | cut -d '#' -f 7`" + if [ ! -e "${PARTDEV}" ] ; then + exit_err "ERROR: The partition ${PARTDEV} does not exist. Failure in bsdlabel?" + fi + # Make sure journaling isn't enabled on this device if [ -e "${PARTDEV}.journal" ] then diff --git a/usr.sbin/pc-sysinstall/backend/functions-parse.sh b/usr.sbin/pc-sysinstall/backend/functions-parse.sh index fecb018130f..ed0a3e681a6 100755 --- a/usr.sbin/pc-sysinstall/backend/functions-parse.sh +++ b/usr.sbin/pc-sysinstall/backend/functions-parse.sh @@ -33,7 +33,7 @@ get_value_from_string() { if [ -n "${1}" ] then - export VAL="`echo ${1} | cut -d '=' -f 2-15`" + export VAL="`echo ${1} | cut -d '=' -f 2-`" else echo "Error: Did we forgot to supply a string to parse?" exit 1 @@ -45,7 +45,7 @@ get_value_from_cfg_with_spaces() { if [ -n "${1}" ] then - export VAL=`grep "^${1}=" ${CFGF} | head -n 1 | cut -d '=' -f 2-15` + export VAL=`grep "^${1}=" ${CFGF} | head -n 1 | cut -d '=' -f 2-` else exit_err "Error: Did we forgot to supply a setting to grab?" fi @@ -57,7 +57,7 @@ get_value_from_cfg() { if [ -n "${1}" ] then - export VAL=`grep "^${1}=" ${CFGF} | head -n 1 | cut -d '=' -f 2-15 | tr -d ' '` + export VAL=`grep "^${1}=" ${CFGF} | head -n 1 | cut -d '=' -f 2- | tr -d ' '` else exit_err "Error: Did we forgot to supply a setting to grab?" fi @@ -71,7 +71,7 @@ if_check_value_exists() then # Get the first occurrence of the setting from the config, strip out whitespace - VAL=`grep "^${1}" ${CFGF} | head -n 1 | cut -d '=' -f 2 | tr -d ' '` + VAL=`grep "^${1}" ${CFGF} | head -n 1 | cut -d '=' -f 2- | tr -d ' '` if [ -z "${VAL}" ] then # This value doesn't exist, lets return @@ -104,7 +104,7 @@ check_value() if [ -n "${1}" -a -n "${2}" ] then # Get the first occurrence of the setting from the config, strip out whitespace - VAL=`grep "^${1}" ${CFGF} | head -n 1 | cut -d '=' -f 2 | tr -d ' '` + VAL=`grep "^${1}" ${CFGF} | head -n 1 | cut -d '=' -f 2- | tr -d ' '` VALID="1" for i in ${2} do @@ -133,7 +133,7 @@ file_sanity_check() grep -q "^${i}=" $CFGF 2>/dev/null if [ $? -eq 0 ] then - LN=`grep "^${i}=" ${CFGF} | head -n 1 | cut -d '=' -f 2 | tr -d ' '` + LN=`grep "^${i}=" ${CFGF} | head -n 1 | cut -d '=' -f 2- | tr -d ' '` if [ -z "${LN}" ] then echo "Error: Config fails sanity test! ${i}= is empty" diff --git a/usr.sbin/pc-sysinstall/backend/functions.sh b/usr.sbin/pc-sysinstall/backend/functions.sh index 9a98ee2bf14..33d0005e408 100755 --- a/usr.sbin/pc-sysinstall/backend/functions.sh +++ b/usr.sbin/pc-sysinstall/backend/functions.sh @@ -208,15 +208,11 @@ fetch_file() FETCHOUTFILE="$2" EXITFAILED="$3" - SIZEFILE="${TMPDIR}/.fetchSize" EXITFILE="${TMPDIR}/.fetchExit" - rm ${SIZEFILE} 2>/dev/null >/dev/null rm ${FETCHOUTFILE} 2>/dev/null >/dev/null - fetch -s "${FETCHFILE}" >${SIZEFILE} - SIZE="`cat ${SIZEFILE}`" - SIZE="`expr ${SIZE} / 1024`" + SIZE=$(( `fetch -s "${FETCHFILE}"` / 1024 )) echo "FETCH: ${FETCHFILE}" echo "FETCH: ${FETCHOUTFILE}" >>${LOGOUT} @@ -276,11 +272,20 @@ get_zpool_name() else # Need to generate a zpool name for this device NUM=`ls ${TMPDIR}/.zpools/ | wc -l | sed 's| ||g'` - NEWNAME="${BASENAME}${NUM}" + + # Is it used in another zpool? + while : + do + NEWNAME="${BASENAME}${NUM}" + zpool import | grep -qw "${NEWNAME}" || break + NUM=$((NUM+1)) + done + + # Now save the new tank name mkdir -p ${TMPDIR}/.zpools/`dirname $DEVICE` echo "$NEWNAME" >${TMPDIR}/.zpools/${DEVICE} echo "${NEWNAME}" - return + return 0 fi }; diff --git a/usr.sbin/pciconf/Makefile b/usr.sbin/pciconf/Makefile index 9fbec00ce0e..32e98487116 100644 --- a/usr.sbin/pciconf/Makefile +++ b/usr.sbin/pciconf/Makefile @@ -2,7 +2,7 @@ # $FreeBSD$ PROG= pciconf -SRCS= pciconf.c cap.c +SRCS= pciconf.c cap.c err.c MAN= pciconf.8 CFLAGS+= -I${.CURDIR}/../../sys diff --git a/usr.sbin/pciconf/cap.c b/usr.sbin/pciconf/cap.c index 605add87787..4eed9ca6196 100644 --- a/usr.sbin/pciconf/cap.c +++ b/usr.sbin/pciconf/cap.c @@ -630,3 +630,59 @@ list_ecaps(int fd, struct pci_conf *p) ecap = read_config(fd, &p->pc_sel, ptr, 4); } } + +/* Find offset of a specific capability. Returns 0 on failure. */ +uint8_t +pci_find_cap(int fd, struct pci_conf *p, uint8_t id) +{ + uint16_t sta; + uint8_t ptr, cap; + + /* Are capabilities present for this device? */ + sta = read_config(fd, &p->pc_sel, PCIR_STATUS, 2); + if (!(sta & PCIM_STATUS_CAPPRESENT)) + return (0); + + switch (p->pc_hdr & PCIM_HDRTYPE) { + case PCIM_HDRTYPE_NORMAL: + case PCIM_HDRTYPE_BRIDGE: + ptr = PCIR_CAP_PTR; + break; + case PCIM_HDRTYPE_CARDBUS: + ptr = PCIR_CAP_PTR_2; + break; + default: + return (0); + } + + ptr = read_config(fd, &p->pc_sel, ptr, 1); + while (ptr != 0 && ptr != 0xff) { + cap = read_config(fd, &p->pc_sel, ptr + PCICAP_ID, 1); + if (cap == id) + return (ptr); + ptr = read_config(fd, &p->pc_sel, ptr + PCICAP_NEXTPTR, 1); + } + return (0); +} + +/* Find offset of a specific extended capability. Returns 0 on failure. */ +uint16_t +pcie_find_cap(int fd, struct pci_conf *p, uint16_t id) +{ + uint32_t ecap; + uint16_t ptr; + + ptr = PCIR_EXTCAP; + ecap = read_config(fd, &p->pc_sel, ptr, 4); + if (ecap == 0xffffffff || ecap == 0) + return (0); + for (;;) { + if (PCI_EXTCAP_ID(ecap) == id) + return (ptr); + ptr = PCI_EXTCAP_NEXTPTR(ecap); + if (ptr == 0) + break; + ecap = read_config(fd, &p->pc_sel, ptr, 4); + } + return (0); +} diff --git a/usr.sbin/pciconf/err.c b/usr.sbin/pciconf/err.c new file mode 100644 index 00000000000..62445b185ef --- /dev/null +++ b/usr.sbin/pciconf/err.c @@ -0,0 +1,167 @@ +/*- + * Copyright (c) 2012 Advanced Computing Technologies LLC + * Written by: John H. Baldwin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static const char rcsid[] = + "$FreeBSD$"; +#endif /* not lint */ + +#include +#include + +#include +#include + +#include + +#include "pciconf.h" + +struct bit_table { + uint32_t mask; + const char *desc; +}; + +/* Error indicators in the PCI status register (PCIR_STATUS). */ +static struct bit_table pci_status[] = { + { PCIM_STATUS_MDPERR, "Master Data Parity Error" }, + { PCIM_STATUS_STABORT, "Sent Target-Abort" }, + { PCIM_STATUS_RTABORT, "Received Target-Abort" }, + { PCIM_STATUS_RMABORT, "Received Master-Abort" }, + { PCIM_STATUS_SERR, "Signalled System Error" }, + { PCIM_STATUS_PERR, "Detected Parity Error" }, + { 0, NULL }, +}; + +/* Valid error indicator bits in PCIR_STATUS. */ +#define PCI_ERRORS (PCIM_STATUS_MDPERR | PCIM_STATUS_STABORT | \ + PCIM_STATUS_RTABORT | PCIM_STATUS_RMABORT | \ + PCIM_STATUS_SERR | PCIM_STATUS_PERR) + +/* Error indicators in the PCI-Express device status register. */ +static struct bit_table pcie_device_status[] = { + { PCIM_EXP_STA_CORRECTABLE_ERROR, "Correctable Error Detected" }, + { PCIM_EXP_STA_NON_FATAL_ERROR, "Non-Fatal Error Detected" }, + { PCIM_EXP_STA_FATAL_ERROR, "Fatal Error Detected" }, + { PCIM_EXP_STA_UNSUPPORTED_REQ, "Unsupported Request Detected" }, + { 0, NULL }, +}; + +/* Valid error indicator bits in the PCI-Express device status register. */ +#define PCIE_ERRORS (PCIM_EXP_STA_CORRECTABLE_ERROR | \ + PCIM_EXP_STA_NON_FATAL_ERROR | \ + PCIM_EXP_STA_FATAL_ERROR | \ + PCIM_EXP_STA_UNSUPPORTED_REQ) + +/* AER Uncorrected errors. */ +static struct bit_table aer_uc[] = { + { PCIM_AER_UC_TRAINING_ERROR, "Link Training Error" }, + { PCIM_AER_UC_DL_PROTOCOL_ERROR, "Data Link Protocol Error" }, + { PCIM_AER_UC_SURPRISE_LINK_DOWN, "Surprise Link Down Error" }, + { PCIM_AER_UC_POISONED_TLP, "Poisoned TLP" }, + { PCIM_AER_UC_FC_PROTOCOL_ERROR, "Flow Control Protocol Error" }, + { PCIM_AER_UC_COMPLETION_TIMEOUT, "Completion Timeout" }, + { PCIM_AER_UC_COMPLETER_ABORT, "Completer Abort" }, + { PCIM_AER_UC_UNEXPECTED_COMPLETION, "Unexpected Completion" }, + { PCIM_AER_UC_RECEIVER_OVERFLOW, "Receiver Overflow Error" }, + { PCIM_AER_UC_MALFORMED_TLP, "Malformed TLP" }, + { PCIM_AER_UC_ECRC_ERROR, "ECRC Error" }, + { PCIM_AER_UC_UNSUPPORTED_REQUEST, "Unsupported Request" }, + { PCIM_AER_UC_ACS_VIOLATION, "ACS Violation" }, + { 0, NULL }, +}; + +/* AER Corrected errors. */ +static struct bit_table aer_cor[] = { + { PCIM_AER_COR_RECEIVER_ERROR, "Receiver Error" }, + { PCIM_AER_COR_BAD_TLP, "Bad TLP" }, + { PCIM_AER_COR_BAD_DLLP, "Bad DLLP" }, + { PCIM_AER_COR_REPLAY_ROLLOVER, "REPLAY_NUM Rollover" }, + { PCIM_AER_COR_REPLAY_TIMEOUT, "Replay Timer Timeout" }, + { PCIM_AER_COR_ADVISORY_NF_ERROR, "Advisory Non-Fatal Error" }, + { 0, NULL }, +}; + +static void +print_bits(const char *header, struct bit_table *table, uint32_t mask) +{ + int first; + + first = 1; + for (; table->desc != NULL; table++) + if (mask & table->mask) { + if (first) { + printf("%14s = ", header); + first = 0; + } else + printf(" "); + printf("%s\n", table->desc); + mask &= ~table->mask; + } + if (mask != 0) { + if (first) + printf("%14s = ", header); + else + printf(" "); + printf("Unknown: 0x%08x\n", mask); + } +} + +void +list_errors(int fd, struct pci_conf *p) +{ + uint32_t mask, severity; + uint16_t sta, aer; + uint8_t pcie; + + /* First check for standard PCI errors. */ + sta = read_config(fd, &p->pc_sel, PCIR_STATUS, 2); + print_bits("PCI errors", pci_status, sta & PCI_ERRORS); + + /* See if this is a PCI-express device. */ + pcie = pci_find_cap(fd, p, PCIY_EXPRESS); + if (pcie == 0) + return; + + /* Check for PCI-e errors. */ + sta = read_config(fd, &p->pc_sel, pcie + PCIR_EXPRESS_DEVICE_STA, 2); + print_bits("PCI-e errors", pcie_device_status, sta & PCIE_ERRORS); + + /* See if this device supports AER. */ + aer = pcie_find_cap(fd, p, PCIZ_AER); + if (aer == 0) + return; + + /* Check for uncorrected errors. */ + mask = read_config(fd, &p->pc_sel, aer + PCIR_AER_UC_STATUS, 4); + severity = read_config(fd, &p->pc_sel, aer + PCIR_AER_UC_SEVERITY, 4); + print_bits("Fatal", aer_uc, mask & severity); + print_bits("Non-fatal", aer_uc, mask & ~severity); + + /* Check for corrected errors. */ + mask = read_config(fd, &p->pc_sel, aer + PCIR_AER_COR_STATUS, 4); + print_bits("Corrected", aer_cor, mask); +} diff --git a/usr.sbin/pciconf/pciconf.8 b/usr.sbin/pciconf/pciconf.8 index 6b7729144d0..b416abc5409 100644 --- a/usr.sbin/pciconf/pciconf.8 +++ b/usr.sbin/pciconf/pciconf.8 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 7, 2007 +.Dd June 1, 2012 .Dt PCICONF 8 .Os .Sh NAME @@ -33,7 +33,7 @@ .Nd diagnostic utility for the PCI bus .Sh SYNOPSIS .Nm -.Fl l Op Fl bcv +.Fl l Op Fl bcev .Nm .Fl a Ar selector .Nm @@ -167,6 +167,15 @@ capability in config space in hexadecimal. The format of the text after the equals sign is capability-specific. .Pp If the +.Fl e +option is supplied, +.Nm +will list any errors reported for this device in standard PCI error registers. +Errors are checked for in the PCI status register, +the PCI-express device status register, +and the Advanced Error Reporting status registers. +.Pp +If the .Fl v option is supplied, .Nm diff --git a/usr.sbin/pciconf/pciconf.c b/usr.sbin/pciconf/pciconf.c index 919cc8574d4..76e478b7c8a 100644 --- a/usr.sbin/pciconf/pciconf.c +++ b/usr.sbin/pciconf/pciconf.c @@ -68,7 +68,7 @@ struct pci_vendor_info TAILQ_HEAD(,pci_vendor_info) pci_vendors; static void list_bars(int fd, struct pci_conf *p); -static void list_devs(int verbose, int bars, int caps); +static void list_devs(int verbose, int bars, int caps, int errors); static void list_verbose(struct pci_conf *p); static const char *guess_class(struct pci_conf *p); static const char *guess_subclass(struct pci_conf *p); @@ -83,7 +83,7 @@ static void usage(void) { fprintf(stderr, "%s\n%s\n%s\n%s\n", - "usage: pciconf -l [-bcv]", + "usage: pciconf -l [-bcev]", " pciconf -a selector", " pciconf -r [-b | -h] selector addr[:addr2]", " pciconf -w [-b | -h] selector addr value"); @@ -94,12 +94,14 @@ int main(int argc, char **argv) { int c; - int listmode, readmode, writemode, attachedmode, bars, caps, verbose; + int listmode, readmode, writemode, attachedmode; + int bars, caps, errors, verbose; int byte, isshort; - listmode = readmode = writemode = attachedmode = bars = caps = verbose = byte = isshort = 0; + listmode = readmode = writemode = attachedmode = 0; + bars = caps = errors = verbose = byte = isshort = 0; - while ((c = getopt(argc, argv, "abchlrwv")) != -1) { + while ((c = getopt(argc, argv, "abcehlrwv")) != -1) { switch(c) { case 'a': attachedmode = 1; @@ -114,6 +116,10 @@ main(int argc, char **argv) caps = 1; break; + case 'e': + errors = 1; + break; + case 'h': isshort = 1; break; @@ -146,7 +152,7 @@ main(int argc, char **argv) usage(); if (listmode) { - list_devs(verbose, bars, caps); + list_devs(verbose, bars, caps, errors); } else if (attachedmode) { chkattached(argv[optind]); } else if (readmode) { @@ -163,7 +169,7 @@ main(int argc, char **argv) } static void -list_devs(int verbose, int bars, int caps) +list_devs(int verbose, int bars, int caps, int errors) { int fd; struct pci_conf_io pc; @@ -173,7 +179,7 @@ list_devs(int verbose, int bars, int caps) if (verbose) load_vendors(); - fd = open(_PATH_DEVPCI, caps ? O_RDWR : O_RDONLY, 0); + fd = open(_PATH_DEVPCI, (caps || errors) ? O_RDWR : O_RDONLY, 0); if (fd < 0) err(1, "%s", _PATH_DEVPCI); @@ -223,6 +229,8 @@ list_devs(int verbose, int bars, int caps) list_bars(fd, p); if (caps) list_caps(fd, p); + if (errors) + list_errors(fd, p); } } while (pc.status == PCI_GETCONF_MORE_DEVS); diff --git a/usr.sbin/pciconf/pciconf.h b/usr.sbin/pciconf/pciconf.h index 2e87c63cab4..042c4a1bc23 100644 --- a/usr.sbin/pciconf/pciconf.h +++ b/usr.sbin/pciconf/pciconf.h @@ -34,6 +34,9 @@ #define __PCICONF_H__ void list_caps(int fd, struct pci_conf *p); +void list_errors(int fd, struct pci_conf *p); +uint8_t pci_find_cap(int fd, struct pci_conf *p, uint8_t id); +uint16_t pcie_find_cap(int fd, struct pci_conf *p, uint16_t id); uint32_t read_config(int fd, struct pcisel *sel, long reg, int width); #endif diff --git a/usr.sbin/pkg/pkg.c b/usr.sbin/pkg/pkg.c index a4730afc18a..b6c0207ed06 100644 --- a/usr.sbin/pkg/pkg.c +++ b/usr.sbin/pkg/pkg.c @@ -282,7 +282,10 @@ static int bootstrap_pkg(void) { FILE *remote; + FILE *config; + char *site; char url[MAXPATHLEN]; + char conf[MAXPATHLEN]; char abi[BUFSIZ]; char tmppkg[MAXPATHLEN]; char buf[10240]; @@ -290,7 +293,6 @@ bootstrap_pkg(void) int fd, retry, ret; struct url_stat st; off_t done, r; - time_t begin_dl; time_t now; time_t last; @@ -298,6 +300,7 @@ bootstrap_pkg(void) last = 0; ret = -1; remote = NULL; + config = NULL; printf("Bootstrapping pkg please wait\n"); @@ -307,7 +310,7 @@ bootstrap_pkg(void) } if (getenv("PACKAGESITE") != NULL) - snprintf(url, MAXPATHLEN, "%s/pkg.txz", getenv("PACKAGESITE")); + snprintf(url, MAXPATHLEN, "%s/Latest/pkg.txz", getenv("PACKAGESITE")); else snprintf(url, MAXPATHLEN, "%s/%s/latest/Latest/pkg.txz", getenv("PACKAGEROOT") ? getenv("PACKAGEROOT") : _PKGS_URL, @@ -331,7 +334,6 @@ bootstrap_pkg(void) if (remote == NULL) goto fetchfail; - begin_dl = time(NULL); while (done < st.size) { if ((r = fread(buf, 1, sizeof(buf), remote)) < 1) break; @@ -353,12 +355,34 @@ bootstrap_pkg(void) if ((ret = extract_pkg_static(fd, pkgstatic, MAXPATHLEN)) == 0) ret = install_pkg_static(pkgstatic, tmppkg); + snprintf(conf, MAXPATHLEN, "%s/etc/pkg.conf", + getenv("LOCALBASE") ? getenv("LOCALBASE") : _LOCALBASE); + + if (access(conf, R_OK) == -1) { + site = strrchr(url, '/'); + if (site == NULL) + goto cleanup; + site[0] = '\0'; + site = strrchr(url, '/'); + if (site == NULL) + goto cleanup; + site[0] = '\0'; + + config = fopen(conf, "w+"); + if (config == NULL) + goto cleanup; + fprintf(config, "packagesite: %s\n", url); + fclose(config); + } + goto cleanup; fetchfail: warnx("Error fetching %s: %s", url, fetchLastErrString); cleanup: + if (remote != NULL) + fclose(remote); close(fd); unlink(tmppkg); diff --git a/usr.sbin/pkg_install/add/main.c b/usr.sbin/pkg_install/add/main.c index 31ffae5e42e..39c1247a6b9 100644 --- a/usr.sbin/pkg_install/add/main.c +++ b/usr.sbin/pkg_install/add/main.c @@ -234,10 +234,17 @@ main(int argc, char **argv) remotepkg = temppackageroot; if (!((ptr = strrchr(remotepkg, '.')) && ptr[1] == 't' && (ptr[2] == 'b' || ptr[2] == 'g' || ptr[2] == 'x') && - ptr[3] == 'z' && !ptr[4])) - if (strlcat(remotepkg, ".tbz", - sizeof(temppackageroot)) >= sizeof(temppackageroot)) - errx(1, "package name too long"); + ptr[3] == 'z' && !ptr[4])) { + if (getenv("PACKAGESUFFIX")) { + if (strlcat(remotepkg, getenv("PACKAGESUFFIX"), + sizeof(temppackageroot)) >= sizeof(temppackageroot)) + errx(1, "package name too long"); + } else { + if (strlcat(remotepkg, ".tbz", + sizeof(temppackageroot)) >= sizeof(temppackageroot)) + errx(1, "package name too long"); + } + } } if (!strcmp(*argv, "-")) /* stdin? */ pkgs[ch] = (char *)"-"; diff --git a/usr.sbin/pkg_install/add/perform.c b/usr.sbin/pkg_install/add/perform.c index 1b88888313c..24637eba92d 100644 --- a/usr.sbin/pkg_install/add/perform.c +++ b/usr.sbin/pkg_install/add/perform.c @@ -307,8 +307,12 @@ pkg_do(char *pkg) *sep = '\0'; strlcat(subpkg, "/All/", sizeof subpkg); strlcat(subpkg, p->name, sizeof subpkg); - if ((ext = strrchr(pkg, '.')) == NULL) - ext = ".tbz"; + if ((ext = strrchr(pkg, '.')) == NULL) { + if (getenv("PACKAGESUFFIX")) + ext = getenv("PACKAGESUFFIX"); + else + ext = ".tbz"; + } strlcat(subpkg, ext, sizeof subpkg); pkg_do(subpkg); } @@ -345,8 +349,13 @@ pkg_do(char *pkg) const char *ext; ext = strrchr(pkg_fullname, '.'); - if (ext == NULL) - ext = ".tbz"; + if (ext == NULL) { + if (getenv("PACKAGESUFFIX")) { + ext = getenv("PACKAGESUFFIX"); + } else { + ext = ".tbz"; + } + } snprintf(path, FILENAME_MAX, "%s/%s%s", getenv("_TOP"), p->name, ext); if (fexists(path)) cp = path; diff --git a/usr.sbin/pkg_install/add/pkg_add.1 b/usr.sbin/pkg_install/add/pkg_add.1 index 71963d184e5..d146441dfa5 100644 --- a/usr.sbin/pkg_install/add/pkg_add.1 +++ b/usr.sbin/pkg_install/add/pkg_add.1 @@ -553,6 +553,11 @@ The environment variable specifies an alternative location to save downloaded packages to when .Fl K option is used. +.Pp +The environment variable +.Ev PACKAGESUFFIX +specifies an alternative file extension to use when fetching remote +packages. Default is .tbz .Sh FILES .Bl -tag -width /var/db/pkg -compact .It Pa /var/tmp diff --git a/usr.sbin/pkg_install/lib/exec.c b/usr.sbin/pkg_install/lib/exec.c index 364737633c9..c95ac47fa9d 100644 --- a/usr.sbin/pkg_install/lib/exec.c +++ b/usr.sbin/pkg_install/lib/exec.c @@ -47,6 +47,7 @@ vsystem(const char *fmt, ...) va_start(args, fmt); if (vsnprintf(cmd, maxargs, fmt, args) > maxargs) { warnx("vsystem args are too long"); + va_end(args); return 1; } #ifdef DEBUG @@ -82,6 +83,7 @@ vpipe(const char *fmt, ...) va_start(args, fmt); if (vsnprintf(cmd, maxargs, fmt, args) > maxargs) { warnx("vsystem args are too long"); + va_end(args); return NULL; } #ifdef DEBUG diff --git a/usr.sbin/pkg_install/lib/file.c b/usr.sbin/pkg_install/lib/file.c index 79d4df704d0..98413c6c5bf 100644 --- a/usr.sbin/pkg_install/lib/file.c +++ b/usr.sbin/pkg_install/lib/file.c @@ -140,7 +140,7 @@ fileFindByPath(const char *base, const char *fname) { static char tmp[FILENAME_MAX]; char *cp; - const char *suffixes[] = {".tbz", ".tgz", ".tar", NULL}; + const char *suffixes[] = {".tbz", ".tgz", ".tar", ".txz", NULL}; int i; if (fexists(fname) && isfile(fname)) { diff --git a/usr.sbin/pkg_install/lib/lib.h b/usr.sbin/pkg_install/lib/lib.h index fcf051e971a..7890254636c 100644 --- a/usr.sbin/pkg_install/lib/lib.h +++ b/usr.sbin/pkg_install/lib/lib.h @@ -99,7 +99,7 @@ * Version of the package tools - increase whenever you make a change * in the code that is not cosmetic only. */ -#define PKG_INSTALL_VERSION 20100403 +#define PKG_INSTALL_VERSION 20120530 #define PKG_WRAPCONF_FNAME "/var/db/pkg_install.conf" #define main(argc, argv) real_main(argc, argv) diff --git a/usr.sbin/pkg_install/lib/msg.c b/usr.sbin/pkg_install/lib/msg.c index 2b0ee07f1cd..57c84d321af 100644 --- a/usr.sbin/pkg_install/lib/msg.c +++ b/usr.sbin/pkg_install/lib/msg.c @@ -71,5 +71,6 @@ y_or_n(Boolean def, const char *msg, ...) ch = (def) ? 'Y' : 'N'; } fclose(tty) ; + va_end(args); return (ch == 'Y') ? TRUE : FALSE; } diff --git a/usr.sbin/pkg_install/lib/plist.c b/usr.sbin/pkg_install/lib/plist.c index f760c619f64..a1b5c559aa4 100644 --- a/usr.sbin/pkg_install/lib/plist.c +++ b/usr.sbin/pkg_install/lib/plist.c @@ -286,7 +286,8 @@ read_plist(Package *pkg, FILE *fp) if (*cp == '\0') { cp = NULL; if (cmd == PLIST_PKGDEP) { - warnx("corrupted record (pkgdep line without argument), ignoring"); + warnx("corrupted record for package %s (pkgdep line without " + "argument), ignoring", pkg->name); cmd = FAIL; } goto bottom; diff --git a/usr.sbin/pkg_install/lib/url.c b/usr.sbin/pkg_install/lib/url.c index 0097a915b6c..80d306c7b96 100644 --- a/usr.sbin/pkg_install/lib/url.c +++ b/usr.sbin/pkg_install/lib/url.c @@ -73,7 +73,10 @@ fileGetURL(const char *base, const char *spec, int keep_package) *(cp + 1) = '\0'; strcat(cp, "All/"); strcat(cp, spec); - strcat(cp, ".tbz"); + if (getenv("PACKAGESUFFIX")) + strcat(cp, getenv("PACKAGESUFFIX")); + else + strcat(cp, ".tbz"); } else return NULL; @@ -85,7 +88,10 @@ fileGetURL(const char *base, const char *spec, int keep_package) */ strcpy(fname, hint); strcat(fname, spec); - strcat(fname, ".tbz"); + if (getenv("PACKAGESUFFIX")) + strcat(fname, getenv("PACKAGESUFFIX")); + else + strcat(fname, ".tbz"); } } else diff --git a/usr.sbin/pkg_install/updating/pkg_updating.1 b/usr.sbin/pkg_install/updating/pkg_updating.1 index 999d1f944bc..9d12724d84e 100644 --- a/usr.sbin/pkg_install/updating/pkg_updating.1 +++ b/usr.sbin/pkg_install/updating/pkg_updating.1 @@ -55,7 +55,7 @@ Location of the ports tree. .It Pa /var/db/pkg Default location of the installed package database. .It Pa /usr/ports -The default ports directory and default location of the UPDATING file +The default ports directory and default location of the UPDATING file. .El .Sh EXAMPLES Shows all entries of all installed ports: diff --git a/usr.sbin/pmcstat/pmcstat.8 b/usr.sbin/pmcstat/pmcstat.8 index 86eba09772b..5555759939a 100644 --- a/usr.sbin/pmcstat/pmcstat.8 +++ b/usr.sbin/pmcstat/pmcstat.8 @@ -263,7 +263,7 @@ Print the sampled PCs with the name, the start and ending addresses of the function within they live. The .Ar pathname -argument is mandatory and indicates where informations will be stored. +argument is mandatory and indicates where the information will be stored. If argument .Ar pathname is a diff --git a/usr.sbin/pmcstat/pmcstat_log.c b/usr.sbin/pmcstat/pmcstat_log.c index 2ac52da58f8..e5fee35a1c4 100644 --- a/usr.sbin/pmcstat/pmcstat_log.c +++ b/usr.sbin/pmcstat/pmcstat_log.c @@ -554,6 +554,14 @@ pmcstat_image_add_symbols(struct pmcstat_image *image, Elf *e, if ((fnname = elf_strptr(e, sh->sh_link, sym.st_name)) == NULL) continue; +#ifdef __arm__ + /* Remove spurious ARM function name. */ + if (fnname[0] == '$' && + (fnname[1] == 'a' || fnname[1] == 't' || + fnname[1] == 'd') && + fnname[2] == '\0') + continue; +#endif symptr->ps_name = pmcstat_string_intern(fnname); symptr->ps_start = sym.st_value - image->pi_vaddr; @@ -564,6 +572,8 @@ pmcstat_image_add_symbols(struct pmcstat_image *image, Elf *e, } image->pi_symcount += newsyms; + if (image->pi_symcount == 0) + return; assert(newsyms <= nfuncsyms); diff --git a/usr.sbin/portsnap/portsnap/portsnap.sh b/usr.sbin/portsnap/portsnap/portsnap.sh index c9d2b165441..033bb55fe07 100644 --- a/usr.sbin/portsnap/portsnap/portsnap.sh +++ b/usr.sbin/portsnap/portsnap/portsnap.sh @@ -143,6 +143,9 @@ parse_cmdline() { cron | extract | fetch | update | alfred) COMMANDS="${COMMANDS} $1" ;; + up) + COMMANDS="${COMMANDS} update" + ;; *) if [ $# -gt 1 ]; then usage; fi if echo ${COMMANDS} | grep -vq extract; then diff --git a/usr.sbin/ppp/throughput.c b/usr.sbin/ppp/throughput.c index 7ecba8ce670..a3e948adda9 100644 --- a/usr.sbin/ppp/throughput.c +++ b/usr.sbin/ppp/throughput.c @@ -115,14 +115,14 @@ throughput_disp(struct pppThroughput *t, struct prompt *prompt) prompt_Printf(prompt, "%llu packets in, %llu packets out\n", t->PacketsIn, t->PacketsOut); if (t->rolling) { - prompt_Printf(prompt, " overall %6qu bytes/sec\n", + prompt_Printf(prompt, " overall %6llu bytes/sec\n", (t->OctetsIn + t->OctetsOut) / divisor); - prompt_Printf(prompt, " %s %6qu bytes/sec in, %6qu bytes/sec out " + prompt_Printf(prompt, " %s %6llu bytes/sec in, %6llu bytes/sec out " "(over the last %d secs)\n", t->downtime ? "average " : "currently", t->in.OctetsPerSecond, t->out.OctetsPerSecond, secs_up > t->SamplePeriod ? t->SamplePeriod : secs_up); - prompt_Printf(prompt, " peak %6qu bytes/sec on %s", + prompt_Printf(prompt, " peak %6llu bytes/sec on %s", t->BestOctetsPerSecond, ctime(&t->BestOctetsPerSecondTime)); } else prompt_Printf(prompt, "Overall %llu bytes/sec\n", @@ -266,7 +266,7 @@ throughput_clear(struct pppThroughput *t, int clear_type, struct prompt *prompt) if ((divisor = throughput_uptime(t)) == 0) divisor = 1; - prompt_Printf(prompt, "overall cleared (was %6qu bytes/sec)\n", + prompt_Printf(prompt, "overall cleared (was %6llu bytes/sec)\n", (t->OctetsIn + t->OctetsOut) / divisor); t->OctetsIn = t->OctetsOut = t->PacketsIn = t->PacketsOut = 0; t->downtime = 0; @@ -274,8 +274,8 @@ throughput_clear(struct pppThroughput *t, int clear_type, struct prompt *prompt) } if (clear_type & THROUGHPUT_CURRENT) { - prompt_Printf(prompt, "current cleared (was %6qu bytes/sec in," - " %6qu bytes/sec out)\n", + prompt_Printf(prompt, "current cleared (was %6llu bytes/sec in," + " %6llu bytes/sec out)\n", t->in.OctetsPerSecond, t->out.OctetsPerSecond); t->in.OctetsPerSecond = t->out.OctetsPerSecond = 0; } @@ -287,7 +287,7 @@ throughput_clear(struct pppThroughput *t, int clear_type, struct prompt *prompt) last = time_buf + strlen(time_buf); if (last > time_buf && *--last == '\n') *last = '\0'; - prompt_Printf(prompt, "peak cleared (was %6qu bytes/sec on %s)\n", + prompt_Printf(prompt, "peak cleared (was %6llu bytes/sec on %s)\n", t->BestOctetsPerSecond, time_buf); t->BestOctetsPerSecond = 0; time(&t->BestOctetsPerSecondTime); diff --git a/usr.sbin/rarpd/Makefile b/usr.sbin/rarpd/Makefile index 7f34457697e..52a9f92d768 100644 --- a/usr.sbin/rarpd/Makefile +++ b/usr.sbin/rarpd/Makefile @@ -4,6 +4,9 @@ PROG= rarpd MAN= rarpd.8 +DPADD= ${LIBUTIL} +LDADD= -lutil + WARNS?= 3 # This breaks with format strings returned by expand_syslog_m().. argh! #FORMAT_AUDIT?= 1 diff --git a/usr.sbin/rarpd/rarpd.8 b/usr.sbin/rarpd/rarpd.8 index 8552b69689a..3c75de0032f 100644 --- a/usr.sbin/rarpd/rarpd.8 +++ b/usr.sbin/rarpd/rarpd.8 @@ -16,7 +16,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 16, 2001 +.Dd July 9, 2012 .Dt RARPD 8 .Os .Sh NAME @@ -27,9 +27,11 @@ .Fl a .Op Fl dfsv .Op Fl t Ar directory +.Op Fl P Ar pidfile .Nm .Op Fl dfsv .Op Fl t Ar directory +.Op Fl P Ar pidfile .Ar interface .Sh DESCRIPTION The @@ -92,6 +94,15 @@ instead of via .Xr syslog 3 . .It Fl f Run in the foreground. +.It Fl P +Specify the pathname of the PID file. +If not specified, +.Pa /var/run/rarpd.pid +or +.Pa /var/run/rarpd.ifname.pid +will be used depending on the +.Fl a +flag or the specified interface name. .It Fl s Supply a response to any RARP request for which an ethernet to IP address mapping exists; do not depend on the existence of @@ -115,6 +126,7 @@ Enable verbose syslogging. .It Pa /etc/ethers .It Pa /etc/hosts .It Pa /tftpboot +.It Pa /var/run/rarpd.pid .El .Sh SEE ALSO .Xr bpf 4 diff --git a/usr.sbin/rarpd/rarpd.c b/usr.sbin/rarpd/rarpd.c index 25d98c6e0b5..f10a7da527f 100644 --- a/usr.sbin/rarpd/rarpd.c +++ b/usr.sbin/rarpd/rarpd.c @@ -27,8 +27,8 @@ __FBSDID("$FreeBSD$"); /* * rarpd - Reverse ARP Daemon * - * Usage: rarpd -a [-dfsv] [-t directory] [hostname] - * rarpd [-dfsv] [-t directory] interface [hostname] + * Usage: rarpd -a [-dfsv] [-t directory] [-P pidfile] [hostname] + * rarpd [-dfsv] [-t directory] [-P pidfile] interface [hostname] * * 'hostname' is optional solely for backwards compatibility with Sun's rarpd. * Currently, the argument is ignored. @@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include /* Cast a struct sockaddr to a struct sockaddr_in */ #define SATOSIN(sa) ((struct sockaddr_in *)(sa)) @@ -99,6 +100,11 @@ int sflag; /* ignore /tftpboot */ static u_char zero[6]; +static char pidfile_buf[PATH_MAX]; +static char *pidfile; +#define RARPD_PIDFILE "/var/run/rarpd.%s.pid" +static struct pidfh *pidfile_fh; + static int bpf_open(void); static in_addr_t choose_ipaddr(in_addr_t **, in_addr_t, in_addr_t); static char *eatoa(u_char *); @@ -140,7 +146,7 @@ main(int argc, char *argv[]) openlog(name, LOG_PID | LOG_CONS, LOG_DAEMON); opterr = 0; - while ((op = getopt(argc, argv, "adfst:v")) != -1) + while ((op = getopt(argc, argv, "adfsP:t:v")) != -1) switch (op) { case 'a': ++aflag; @@ -158,6 +164,12 @@ main(int argc, char *argv[]) ++sflag; break; + case 'P': + strncpy(pidfile_buf, optarg, sizeof(pidfile_buf) - 1); + pidfile_buf[sizeof(pidfile_buf) - 1] = '\0'; + pidfile = pidfile_buf; + break; + case 't': tftp_dir = optarg; break; @@ -181,10 +193,23 @@ main(int argc, char *argv[]) init(ifname); if (!fflag) { + if (pidfile == NULL && ifname != NULL && aflag == 0) { + snprintf(pidfile_buf, sizeof(pidfile_buf) - 1, + RARPD_PIDFILE, ifname); + pidfile_buf[sizeof(pidfile_buf) - 1] = '\0'; + pidfile = pidfile_buf; + } + /* If pidfile == NULL, /var/run/.pid will be used. */ + pidfile_fh = pidfile_open(pidfile, 0600, NULL); + if (pidfile_fh == NULL) + logmsg(LOG_ERR, "Cannot open or create pidfile: %s", + (pidfile == NULL) ? "/var/run/rarpd.pid" : pidfile); if (daemon(0,0)) { logmsg(LOG_ERR, "cannot fork"); + pidfile_remove(pidfile_fh); exit(1); } + pidfile_write(pidfile_fh); } rarp_loop(); return(0); @@ -234,6 +259,7 @@ init_one(struct ifaddrs *ifa, char *target, int pass1) ii = (struct if_info *)malloc(sizeof(*ii)); if (ii == NULL) { logmsg(LOG_ERR, "malloc: %m"); + pidfile_remove(pidfile_fh); exit(1); } bzero(ii, sizeof(*ii)); @@ -251,6 +277,7 @@ init_one(struct ifaddrs *ifa, char *target, int pass1) ii2 = (struct if_info *)malloc(sizeof(*ii2)); if (ii2 == NULL) { logmsg(LOG_ERR, "malloc: %m"); + pidfile_remove(pidfile_fh); exit(1); } memcpy(ii2, ii, sizeof(*ii2)); @@ -273,8 +300,11 @@ init_one(struct ifaddrs *ifa, char *target, int pass1) case AF_LINK: ll = (struct sockaddr_dl *)ifa->ifa_addr; - if (ll->sdl_type == IFT_ETHER) + switch (ll->sdl_type) { + case IFT_ETHER: + case IFT_L2VLAN: bcopy(LLADDR(ll), ii->ii_eaddr, 6); + } break; } } @@ -293,6 +323,7 @@ init(char *target) error = getifaddrs(&ifhead); if (error) { logmsg(LOG_ERR, "getifaddrs: %m"); + pidfile_remove(pidfile_fh); exit(1); } /* @@ -339,8 +370,8 @@ static void usage(void) { (void)fprintf(stderr, "%s\n%s\n", - "usage: rarpd -a [-dfsv] [-t directory]", - " rarpd [-dfsv] [-t directory] interface"); + "usage: rarpd -a [-dfsv] [-t directory] [-P pidfile]", + " rarpd [-dfsv] [-t directory] [-P pidfile] interface"); exit(1); } @@ -361,6 +392,7 @@ bpf_open(void) if (fd == -1) { logmsg(LOG_ERR, "%s: %m", device); + pidfile_remove(pidfile_fh); exit(1); } return fd; @@ -399,12 +431,12 @@ rarp_open(char *device) immediate = 1; if (ioctl(fd, BIOCIMMEDIATE, &immediate) == -1) { logmsg(LOG_ERR, "BIOCIMMEDIATE: %m"); - exit(1); + goto rarp_open_err; } strlcpy(ifr.ifr_name, device, sizeof(ifr.ifr_name)); if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) == -1) { logmsg(LOG_ERR, "BIOCSETIF: %m"); - exit(1); + goto rarp_open_err; } /* * Check that the data link layer is an Ethernet; this code won't @@ -412,20 +444,24 @@ rarp_open(char *device) */ if (ioctl(fd, BIOCGDLT, (caddr_t)&dlt) == -1) { logmsg(LOG_ERR, "BIOCGDLT: %m"); - exit(1); + goto rarp_open_err; } if (dlt != DLT_EN10MB) { logmsg(LOG_ERR, "%s is not an ethernet", device); - exit(1); + goto rarp_open_err; } /* * Set filter program. */ if (ioctl(fd, BIOCSETF, (caddr_t)&filter) == -1) { logmsg(LOG_ERR, "BIOCSETF: %m"); - exit(1); + goto rarp_open_err; } return fd; + +rarp_open_err: + pidfile_remove(pidfile_fh); + exit(1); } /* @@ -480,16 +516,16 @@ rarp_loop(void) if (iflist == NULL) { logmsg(LOG_ERR, "no interfaces"); - exit(1); + goto rarpd_loop_err; } if (ioctl(iflist->ii_fd, BIOCGBLEN, (caddr_t)&bufsize) == -1) { logmsg(LOG_ERR, "BIOCGBLEN: %m"); - exit(1); + goto rarpd_loop_err; } buf = malloc(bufsize); if (buf == NULL) { logmsg(LOG_ERR, "malloc: %m"); - exit(1); + goto rarpd_loop_err; } while (1) { @@ -509,7 +545,7 @@ rarp_loop(void) if (errno == EINTR) continue; logmsg(LOG_ERR, "select: %m"); - exit(1); + goto rarpd_loop_err; } for (ii = iflist; ii != NULL; ii = ii->ii_next) { fd = ii->ii_fd; @@ -537,6 +573,11 @@ rarp_loop(void) } } #undef bhp + return; + +rarpd_loop_err: + pidfile_remove(pidfile_fh); + exit(1); } /* @@ -562,12 +603,12 @@ rarp_bootable(in_addr_t addr) else { if (chdir(tftp_dir) == -1) { logmsg(LOG_ERR, "chdir: %s: %m", tftp_dir); - exit(1); + goto rarp_bootable_err; } d = opendir("."); if (d == NULL) { logmsg(LOG_ERR, "opendir: %m"); - exit(1); + goto rarp_bootable_err; } dd = d; } @@ -575,6 +616,10 @@ rarp_bootable(in_addr_t addr) if (strncmp(dent->d_name, ipname, 8) == 0) return 1; return 0; + +rarp_bootable_err: + pidfile_remove(pidfile_fh); + exit(1); } /* @@ -678,6 +723,7 @@ update_arptab(u_char *ep, in_addr_t ipaddr) r = socket(PF_ROUTE, SOCK_RAW, 0); if (r == -1) { logmsg(LOG_ERR, "raw route socket: %m"); + pidfile_remove(pidfile_fh); exit(1); } pid = getpid(); diff --git a/usr.sbin/rpc.lockd/kern.c b/usr.sbin/rpc.lockd/kern.c index e0f63ab3442..4775ab6af35 100644 --- a/usr.sbin/rpc.lockd/kern.c +++ b/usr.sbin/rpc.lockd/kern.c @@ -595,7 +595,7 @@ show(LOCKD_MSG *mp) syslog(LOG_DEBUG, "fh_len %d, fh %s\n", (int)mp->lm_fh_len, buf); /* Show flock structure. */ - syslog(LOG_DEBUG, "start %qu; len %qu; pid %lu; type %d; whence %d\n", + syslog(LOG_DEBUG, "start %llu; len %llu; pid %lu; type %d; whence %d\n", (unsigned long long)mp->lm_fl.l_start, (unsigned long long)mp->lm_fl.l_len, (u_long)mp->lm_fl.l_pid, mp->lm_fl.l_type, mp->lm_fl.l_whence); diff --git a/usr.sbin/rtadvctl/rtadvctl.8 b/usr.sbin/rtadvctl/rtadvctl.8 index f779c987e15..be3eefea7c5 100644 --- a/usr.sbin/rtadvctl/rtadvctl.8 +++ b/usr.sbin/rtadvctl/rtadvctl.8 @@ -31,7 +31,8 @@ .Sh NAME .Nm rtadvctl .Nd control program for -.Xr rtadvd 8 daemon +.Xr rtadvd 8 +daemon .Sh SYNOPSIS .Nm .Op Fl v diff --git a/usr.sbin/rtadvd/rtadvd.8 b/usr.sbin/rtadvd/rtadvd.8 index 4b74eb4ed0c..ad39887dbc7 100644 --- a/usr.sbin/rtadvd/rtadvd.8 +++ b/usr.sbin/rtadvd/rtadvd.8 @@ -140,7 +140,7 @@ option, which enables routing renumbering protocol support. .It Fl p Specify an alternative file in which to store the process ID. The default is -.Pa /var/run/rtadvd.pid. +.Pa /var/run/rtadvd.pid . .It Fl R Accept router renumbering requests. If you enable it, certain IPsec setup is suggested for security reasons. diff --git a/usr.sbin/rtprio/rtprio.c b/usr.sbin/rtprio/rtprio.c index bb72985f199..a0b67ea8276 100644 --- a/usr.sbin/rtprio/rtprio.c +++ b/usr.sbin/rtprio/rtprio.c @@ -109,9 +109,12 @@ main(int argc, char *argv[]) if (argv[2][0] == '-') { proc = parseint(argv[2], "pid"); proc = abs(proc); - if (rtprio(RTP_SET, proc, &rtp) != 0) - err(1, "RTP_SET"); - } else { + } + + if (rtprio(RTP_SET, proc, &rtp) != 0) + err(1, "RTP_SET"); + + if (proc == 0) { execvp(argv[2], &argv[2]); err(1, "execvp: %s", argv[2]); } diff --git a/usr.sbin/setfib/setfib.1 b/usr.sbin/setfib/setfib.1 index f36792caa0a..f0143db9340 100644 --- a/usr.sbin/setfib/setfib.1 +++ b/usr.sbin/setfib/setfib.1 @@ -45,7 +45,7 @@ with an different routing table. The table number .Dq Ar fib will be used by default for all sockets started by this -process or descendents. +process or descendants. .Sh ENVIRONMENT The .Ev PATH diff --git a/usr.sbin/smbmsg/smbmsg.8 b/usr.sbin/smbmsg/smbmsg.8 index 1a616f751f4..39caa6745b8 100644 --- a/usr.sbin/smbmsg/smbmsg.8 +++ b/usr.sbin/smbmsg/smbmsg.8 @@ -70,7 +70,7 @@ and writeable, respectively. The only valid additional option for this modus of operation (besides the .Fl p -option that choses the modus) is +option that chooses the modus) is .Fl f Ar dev . See below for a description. .Pp diff --git a/usr.sbin/syslogd/syslogd.8 b/usr.sbin/syslogd/syslogd.8 index df94ded2be0..5b175a6fd71 100644 --- a/usr.sbin/syslogd/syslogd.8 +++ b/usr.sbin/syslogd/syslogd.8 @@ -344,7 +344,7 @@ therefore, they must be created manually before running The date and time are taken from the received message. If the format of the timestamp field is incorrect, time obtained from the local host is used instead. -This can be overriden by the +This can be overridden by the .Fl T flag. .Sh FILES diff --git a/usr.sbin/tcpdump/tcpdump/Makefile b/usr.sbin/tcpdump/tcpdump/Makefile index eef16c72f25..84fa1f631f8 100644 --- a/usr.sbin/tcpdump/tcpdump/Makefile +++ b/usr.sbin/tcpdump/tcpdump/Makefile @@ -8,10 +8,11 @@ TCPDUMP_DISTDIR?= ${.CURDIR}/../../../contrib/tcpdump PROG= tcpdump SRCS = addrtoname.c af.c checksum.c cpack.c gmpls.c oui.c gmt2local.c \ - ipproto.c nlpid.c l2vpn.c machdep.c parsenfsfh.c \ - print-802_11.c print-ap1394.c print-ah.c print-arcnet.c \ + ipproto.c nlpid.c l2vpn.c machdep.c parsenfsfh.c in_cksum.c \ + print-802_11.c print-802_15_4.c print-ap1394.c print-ah.c print-arcnet.c \ print-aodv.c print-arp.c print-ascii.c print-atalk.c print-atm.c \ - print-beep.c print-bfd.c print-bgp.c print-bootp.c print-cdp.c \ + print-beep.c print-bfd.c print-bgp.c print-bootp.c print-bt.c \ + print-carp.c print-cdp.c \ print-cfm.c print-chdlc.c print-cip.c print-cnfp.c print-dccp.c \ print-decnet.c print-domain.c print-dtp.c print-dvmrp.c print-enc.c \ print-egp.c print-eap.c print-eigrp.c \ @@ -24,8 +25,9 @@ SRCS = addrtoname.c af.c checksum.c cpack.c gmpls.c oui.c gmt2local.c \ print-lwapp.c print-lwres.c print-mobile.c print-mpls.c print-msdp.c \ print-mpcp.c \ print-nfs.c print-ntp.c print-null.c print-olsr.c print-ospf.c \ - print-pgm.c print-pim.c print-ppp.c print-pppoe.c \ + print-pgm.c print-pim.c print-ppi.c print-ppp.c print-pppoe.c \ print-pptp.c print-radius.c print-raw.c print-rip.c \ + print-rpki-rtr.c \ print-rrcp.c print-rsvp.c print-rx.c print-sctp.c print-sflow.c \ print-sip.c print-sl.c print-sll.c \ print-slow.c print-snmp.c print-stp.c print-sunatm.c print-sunrpc.c \ @@ -43,7 +45,8 @@ CFLAGS+= -D_U_="__attribute__((unused))" .if ${MK_INET6_SUPPORT} != "no" SRCS+= print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c \ - print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c + print-icmp6.c print-babel.c print-frag6.c print-rt6.c print-ospf6.c \ + print-dhcp6.c CFLAGS+= -DINET6 .endif .if ${MACHINE_CPUARCH} != "i386" diff --git a/usr.sbin/tcpdump/tcpdump/config.h b/usr.sbin/tcpdump/tcpdump/config.h index 16374051c50..b13055dcfc9 100644 --- a/usr.sbin/tcpdump/tcpdump/config.h +++ b/usr.sbin/tcpdump/tcpdump/config.h @@ -13,12 +13,6 @@ /* Define if you enable support for the libsmi. */ /* #undef LIBSMI */ -/* define if you have struct __res_state_ext */ -/* #undef HAVE_RES_STATE_EXT */ - -/* define if your struct __res_state has the nsort member */ -/* #undef HAVE_NEW_RES_STATE */ - /* define if you have the addrinfo function. */ #define HAVE_ADDRINFO 1 @@ -28,15 +22,6 @@ /* define ifyou have the h_errno variable. */ #define HAVE_H_ERRNO 1 -/* define if IN6ADDRSZ is defined (XXX not used!) */ -#define HAVE_IN6ADDRSZ 1 - -/* define if INADDRSZ is defined (XXX not used!) */ -#define HAVE_INADDRSZ 1 - -/* define if RES_USE_INET6 is defined */ -#define HAVE_RES_USE_INET6 1 - /* define if you have struct sockaddr_storage */ #define HAVE_SOCKADDR_STORAGE 1 @@ -73,9 +58,6 @@ /* define if you have getrpcbynumber() */ #define HAVE_GETRPCBYNUMBER 1 -/* AIX hack. */ -/* #undef _SUN */ - /* Workaround for missing 64-bit formats */ /* #undef PRId64 */ /* #undef PRIo64 */ @@ -113,6 +95,9 @@ /* Define to 1 if you have the header file. */ #define HAVE_FCNTL_H 1 +/* Define to 1 if you have the `fork' function. */ +#define HAVE_FORK 1 + /* Define to 1 if you have the `getnameinfo' function. */ #define HAVE_GETNAMEINFO 1 @@ -173,6 +158,9 @@ /* Define to 1 if you have the `pcap_lib_version' function. */ #define HAVE_PCAP_LIB_VERSION 1 +/* Define to 1 if you have the `pcap_set_tstamp_type' function. */ +#define HAVE_PCAP_SET_TSTAMP_TYPE 1 + /* Define to 1 if you have the header file. */ /* #undef HAVE_PCAP_USB_H */ @@ -182,6 +170,9 @@ /* Define to 1 if you have the header file. */ #define HAVE_RPC_RPCENT_H 1 +/* Define to 1 if you have the header file. */ +#define HAVE_RPC_RPC_H 1 + /* Define to 1 if you have the `setlinebuf' function. */ #define HAVE_SETLINEBUF 1 @@ -245,6 +236,9 @@ /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 +/* Define to 1 if you have the `vfork' function. */ +#define HAVE_VFORK 1 + /* Define to 1 if you have the `vfprintf' function. */ #define HAVE_VFPRINTF 1 @@ -284,21 +278,6 @@ /* return value of signal handlers */ #define RETSIGVAL -/* The size of `char', as computed by sizeof. */ -#undef SIZEOF_CHAR - -/* The size of `int', as computed by sizeof. */ -#undef SIZEOF_INT - -/* The size of `long', as computed by sizeof. */ -#undef SIZEOF_LONG - -/* The size of `long long', as computed by sizeof. */ -#undef SIZEOF_LONG_LONG - -/* The size of `short', as computed by sizeof. */ -#undef SIZEOF_SHORT - /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 @@ -311,6 +290,9 @@ /* needed on HP-UX */ /* #undef _HPUX_SOURCE */ +/* define on AIX to get certain functions */ +/* #undef _SUN */ + /* define if your compiler allows __attribute__((format)) to be applied to function pointers */ #define __ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS 1 diff --git a/usr.sbin/tcpdump/tcpdump/tcpdump.1 b/usr.sbin/tcpdump/tcpdump/tcpdump.1 index 61f5727ef71..5034bb1be52 100644 --- a/usr.sbin/tcpdump/tcpdump/tcpdump.1 +++ b/usr.sbin/tcpdump/tcpdump/tcpdump.1 @@ -30,7 +30,7 @@ tcpdump \- dump traffic on a network .na .B tcpdump [ -.B \-AbdDefIKlLnNOpqRStuUvxX +.B \-AbdDefhHIJKlLnNOpqRStuUvxX ] [ .B \-B .I buffer_size @@ -57,6 +57,10 @@ tcpdump \- dump traffic on a network .I interface ] [ +.B \-j +.I tstamp_type +] +[ .B \-m .I module ] @@ -272,7 +276,7 @@ The default is \fBdes-cbc\fP. The ability to decrypt packets is only present if \fItcpdump\fP was compiled with cryptography enabled. .IP -\fIsecret\fP is the ASCII text for ESP secret key. +\fIsecret\fP is the ASCII text for ESP secret key. If preceded by 0x, then a hex value will be read. .IP The option assumes RFC2406 ESP, not RFC1827 ESP. @@ -284,7 +288,7 @@ you make it visible to others, via and other occasions. .IP In addition to the above syntax, the syntax \fIfile name\fP may be used -to have tcpdump read the provided file in. The file is opened upon +to have tcpdump read the provided file in. The file is opened upon receiving the first ESP packet, so any special permissions that tcpdump may have been given should already have been given up. .TP @@ -320,6 +324,13 @@ If used in conjunction with the .B \-C option, filenames will take the form of `\fIfile\fP'. .TP +.B \-h +Print the tcpdump and libpcap version strings, print a usage message, +and exit. +.TP +.B \-H +Attempt to detect 802.11s draft mesh headers. +.TP .B \-i Listen on \fIinterface\fP. If unspecified, \fItcpdump\fP searches the system interface list for the @@ -360,6 +371,18 @@ monitor mode will be shown; if is specified, only those link-layer types available when in monitor mode will be shown. .TP +.B \-j +Set the time stamp type for the capture to \fItstamp_type\fP. The names +to use for the time stamp types are given in +.BR pcap-tstamp-type (7); +not all the types listed there will necessarily be valid for any given +interface. +.TP +.B \-J +List the supported time stamp types for the interface and exit. If the +time stamp type cannot be set for the interface, no time stamp types are +listed. +.TP .B \-K Don't attempt to verify IP, TCP, or UDP checksums. This is useful for interfaces that perform some or all of those checksum calculation in @@ -540,16 +563,16 @@ See for a description of the file format. .TP .B \-W -Used in conjunction with the -.B \-C +Used in conjunction with the +.B \-C option, this will limit the number of files created to the specified number, and begin overwriting files -from the beginning, thus creating a 'rotating' buffer. +from the beginning, thus creating a 'rotating' buffer. In addition, it will name the files with enough leading 0s to support the maximum number of files, allowing them to sort correctly. .IP -Used in conjunction with the +Used in conjunction with the .B \-G option, this will limit the number of rotated dump files that get created, exiting with status 0 when reaching the limit. If used with @@ -559,7 +582,7 @@ as well, the behavior will result in cyclical files per timeslice. .B \-x When parsing and printing, in addition to printing the headers of each packet, print the data of -each packet (minus its link level header) in hex. +each packet (minus its link level header) in hex. The smaller of the entire packet or .I snaplen bytes will be printed. Note that this is the entire link-layer @@ -616,7 +639,10 @@ savefile name as the only argument, make the flags & arguments arrangements and execute the command that you want. .TP .B \-Z -Drops privileges (if root) and changes user ID to +If +.I tcpdump +is running as root, after opening the capture device or input savefile, +but before opening any savefiles for output, change the user ID to .I user and the group ID to the primary group of .IR user . @@ -872,8 +898,8 @@ The general format of a tcp protocol line is: \fISrc\fP and \fIdst\fP are the source and destination IP addresses and ports. \fIFlags\fP are some combination of S (SYN), -F (FIN), P (PUSH), R (RST), W (ECN CWR) or E (ECN-Echo), or a single -`.' (no flags). +F (FIN), P (PUSH), R (RST), U (URG), W (ECN CWR), E (ECN-Echo) or +`.' (ACK), or `none' if no flags are set. \fIData-seqno\fP describes the portion of sequence space covered by the data in this packet (see example below). \fIAck\fP is sequence number of the next data expected the other @@ -920,8 +946,7 @@ bytes and there was a max-segment-size option requesting an mss of Csam replies with a similar packet except it includes a piggy-backed ack for rtsg's SYN. Rtsg then acks csam's SYN. -The `.' means no -flags were set. +The `.' means the ACK flag was set. The packet contained no data so there is no data sequence number. Note that the ack sequence number is a small integer (1). @@ -1156,7 +1181,7 @@ tcp-push, tcp-act, tcp-urg. .PP This can be demonstrated as: .RS -.B +.B tcpdump -i xl0 'tcp[tcpflags] & tcp-push != 0' .RE .PP @@ -1267,7 +1292,6 @@ RA, \fInot\fP set) and `|' (truncated message, TC, set). If the `question' section doesn't contain exactly one entry, `[\fIn\fPq]' is printed. - .HD SMB/CIFS decoding .LP @@ -1275,19 +1299,18 @@ SMB/CIFS decoding on UDP/137, UDP/138 and TCP/139. Some primitive decoding of IPX and NetBEUI SMB data is also done. - +.LP By default a fairly minimal decode is done, with a much more detailed decode done if -v is used. Be warned that with -v a single SMB packet may take up a page or more, so only use -v if you really want all the gory details. - -For information on SMB packet formats and what all te fields mean see +.LP +For information on SMB packet formats and what all the fields mean see www.cifs.org or the pub/samba/specs/ directory on your favorite samba.org mirror site. The SMB patches were written by Andrew Tridgell (tridge@samba.org). - .HD NFS Requests and Replies .LP @@ -1413,11 +1436,11 @@ not be useful to people who are not familiar with the workings of AFS and RX. .LP If the -v (verbose) flag is given twice, acknowledgement packets and -additional header information is printed, such as the RX call ID, +additional header information is printed, such as the the RX call ID, call number, sequence number, serial number, and the RX packet flags. .LP If the -v flag is given twice, additional information is printed, -such as the RX call ID, serial number, and the RX packet flags. +such as the the RX call ID, serial number, and the RX packet flags. The MTU negotiation information is also printed from RX ack packets. .LP If the -v flag is given three times, the security index and service id @@ -1640,7 +1663,7 @@ Ethernet interface removed the packet from the wire and when the kernel serviced the `new packet' interrupt. .SH "SEE ALSO" stty(1), pcap(3PCAP), bpf(4), nit(4P), pcap-savefile(5), -pcap-filter(7) +pcap-filter(7), pcap-tstamp-type(7) .SH AUTHORS The original authors are: .LP diff --git a/usr.sbin/traceroute6/traceroute6.c b/usr.sbin/traceroute6/traceroute6.c index a1fc8f67029..3f116dc3d18 100644 --- a/usr.sbin/traceroute6/traceroute6.c +++ b/usr.sbin/traceroute6/traceroute6.c @@ -1448,7 +1448,8 @@ usage() { fprintf(stderr, -"usage: traceroute6 [-dIlnNrUv] [-f firsthop] [-g gateway] [-m hoplimit]\n" -" [-p port] [-q probes] [-s src] [-w waittime] target [datalen]\n"); +"usage: traceroute6 [-adIlnNrUv] [-A as_server] [-f firsthop] [-g gateway]\n" +" [-m hoplimit] [-p port] [-q probes] [-s src] [-w waittime] target\n" +" [datalen]\n"); exit(1); } diff --git a/usr.sbin/usbdump/usbdump.c b/usr.sbin/usbdump/usbdump.c index 1e8d171763b..7e7eae923ee 100644 --- a/usr.sbin/usbdump/usbdump.c +++ b/usr.sbin/usbdump/usbdump.c @@ -795,6 +795,8 @@ main(int argc, char *argv[]) int o; int filt_unit; int filt_ep; + int s; + int ifindex; const char *optstring; char *pp; @@ -887,9 +889,20 @@ main(int argc, char *argv[]) /* clear ifr structure */ memset(&ifr, 0, sizeof(ifr)); + /* Try to create usbusN interface if it is not available. */ + s = socket(AF_LOCAL, SOCK_DGRAM, 0); + if (s < 0) + errx(EXIT_FAILURE, "Could not open a socket"); + ifindex = if_nametoindex(i_arg); + if (ifindex == 0) { + (void)strlcpy(ifr.ifr_name, i_arg, sizeof(ifr.ifr_name)); + if (ioctl(s, SIOCIFCREATE2, &ifr) < 0) + errx(EXIT_FAILURE, "Invalid bus interface: %s", i_arg); + } + for ( ; v >= USBPF_HDR_LEN; v >>= 1) { (void)ioctl(fd, BIOCSBLEN, (caddr_t)&v); - (void)strncpy(ifr.ifr_name, i_arg, sizeof(ifr.ifr_name)); + (void)strlcpy(ifr.ifr_name, i_arg, sizeof(ifr.ifr_name)); if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) >= 0) break; } @@ -930,6 +943,17 @@ main(int argc, char *argv[]) printf("%d packets received by filter\n", us.bs_recv); printf("%d packets dropped by kernel\n", us.bs_drop); + /* + * Destroy the usbusN interface only if it was created by + * usbdump(8). Ignore when it was already destroyed. + */ + if (ifindex == 0 && if_nametoindex(i_arg) > 0) { + (void)strlcpy(ifr.ifr_name, i_arg, sizeof(ifr.ifr_name)); + if (ioctl(s, SIOCIFDESTROY, &ifr) < 0) + warn("SIOCIFDESTROY ioctl failed"); + } + close(s); + if (p->fd > 0) close(p->fd); if (p->rfd > 0) diff --git a/usr.sbin/utx/utx.8 b/usr.sbin/utx/utx.8 index 6154dca3bef..c3e71e259df 100644 --- a/usr.sbin/utx/utx.8 +++ b/usr.sbin/utx/utx.8 @@ -94,7 +94,7 @@ database, its use is limited to the super-user. .Sh SEE ALSO .Xr getent 1 , .Xr w 1 , -.Xr pututxline 3 . +.Xr pututxline 3 .Sh HISTORY The .Nm diff --git a/usr.sbin/vidcontrol/vidcontrol.c b/usr.sbin/vidcontrol/vidcontrol.c index b2e41bf8d6b..630de7495e8 100644 --- a/usr.sbin/vidcontrol/vidcontrol.c +++ b/usr.sbin/vidcontrol/vidcontrol.c @@ -1192,15 +1192,13 @@ set_terminal_mode(char *arg) fprintf(stderr, "\033[=T"); else if (strcmp(arg, "cons25") == 0) fprintf(stderr, "\033[=1T"); - else - usage(); } int main(int argc, char **argv) { - char *font, *type; + char *font, *type, *termmode; int dumpmod, dumpopt, opt; int reterr; @@ -1212,6 +1210,7 @@ main(int argc, char **argv) err(1, "must be on a virtual console"); dumpmod = 0; dumpopt = DUMP_FBF; + termmode = NULL; while ((opt = getopt(argc, argv, "b:Cc:df:g:h:Hi:l:LM:m:pPr:S:s:T:t:x")) != -1) switch(opt) { @@ -1283,7 +1282,10 @@ main(int argc, char **argv) set_console(optarg); break; case 'T': - set_terminal_mode(optarg); + if (strcmp(optarg, "xterm") != 0 && + strcmp(optarg, "cons25") != 0) + usage(); + termmode = optarg; break; case 't': set_screensaver_timeout(optarg); @@ -1306,6 +1308,8 @@ main(int argc, char **argv) } video_mode(argc, argv, &optind); + if (termmode != NULL) + set_terminal_mode(termmode); get_normal_colors(argc, argv, &optind); diff --git a/usr.sbin/wpa/Makefile.crypto b/usr.sbin/wpa/Makefile.crypto new file mode 100644 index 00000000000..e1ac445b3bb --- /dev/null +++ b/usr.sbin/wpa/Makefile.crypto @@ -0,0 +1,121 @@ +# $FreeBSD$ + +.if ${MK_OPENSSL} != "no" && !defined(RELEASE_CRUNCH) +SRCS+= crypto_openssl.c +DPADD+= ${LIBSSL} ${LIBCRYPTO} +LDADD+= -lssl -lcrypto +.else +CFLAGS+=-DCONFIG_CRYPTO_INTERNAL +SRCS+= crypto_internal.c +CONFIG_INTERNAL_AES=y +CONFIG_INTERNAL_DES=y +CONFIG_INTERNAL_MD4=y +CONFIG_INTERNAL_MD5=y +CONFIG_INTERNAL_RC4=y +CONFIG_INTERNAL_SHA1=y +CONFIG_INTERNAL_SHA256=y +CONFIG_INTERNAL_TLS=y +NEED_AES_ENC=true +.endif + +.if defined(TLS_FUNCS) +NEED_TLS_PRF=y +.if defined(CONFIG_INTERNAL_TLS) +CFLAGS+=-DCONFIG_INTERNAL_LIBTOMMATH \ + -DCONFIG_TLS_INTERNAL_CLIENT +SRCS+= asn1.c \ + bignum.c \ + crypto_internal-cipher.c \ + crypto_internal-modexp.c \ + crypto_internal-rsa.c \ + pkcs1.c \ + pkcs5.c \ + pkcs8.c \ + rsa.c \ + tls_internal.c \ + tlsv1_common.c \ + tlsv1_record.c \ + tlsv1_cred.c \ + tlsv1_client.c \ + tlsv1_client_write.c \ + tlsv1_client_read.c \ + x509v3.c +NEED_DES=y +NEED_MD4=y +NEED_RC4=y +.else +CFLAGS+=-DEAP_TLS_OPENSSL +SRCS+= tls_openssl.c +.endif +.endif + +.if defined(CONFIG_INTERNAL_AES) +SRCS+= aes-internal.c \ + aes-internal-dec.c \ + aes-internal-enc.c +.endif + +.if defined(NEED_AES_CBC) +SRCS+= aes-cbc.c +.endif + +.if defined(NEED_AES_EAX) +SRCS+= aes-eax.c +NEED_AES_CTR=y +.endif + +.if defined(NEED_AES_CTR) +SRCS+= aes-ctr.c +.endif + +.if defined(NEED_AES_ENCBLOCK) +SRCS+= aes-encblock.c +.endif + +.if defined(NEED_AES_OMAC1) +SRCS+= aes-omac1.c +.endif + +.if defined(NEED_DES) +.if defined(CONFIG_INTERNAL_DES) +SRCS+= des-internal.c +.endif +.endif + +.if defined(NEED_MD4) +.if defined(CONFIG_INTERNAL_MD4) +SRCS+= md4-internal.c +.endif +.endif + +.if defined(CONFIG_INTERNAL_MD5) +SRCS+= md5-internal.c +.endif + +.if defined(NEED_FIPS186_2_PRF) +.if defined(CONFIG_INTERNAL_SHA1) +SRCS+= fips_prf_internal.c +.else +SRCS+= fips_prf_openssl.c +.endif +.endif + +.if defined(CONFIG_INTERNAL_RC4) +SRCS+= rc4.c +.endif + +.if defined(CONFIG_INTERNAL_SHA1) +SRCS+= sha1-internal.c +.endif + +.if defined(NEED_SHA256) +CFLAGS+=-DCONFIG_SHA256 +SRCS+= sha256.c +.if defined(CONFIG_INTERNAL_SHA256) +SRCS+= sha256-internal.c +.endif +.endif + +.if defined(NEED_TLS_PRF) +SRCS+= sha1-tlsprf.c +.endif diff --git a/usr.sbin/wpa/Makefile.inc b/usr.sbin/wpa/Makefile.inc index 2f9b9cee174..bbd55fcb770 100644 --- a/usr.sbin/wpa/Makefile.inc +++ b/usr.sbin/wpa/Makefile.inc @@ -7,17 +7,26 @@ WPA_SUPPLICANT_DISTDIR?=${WPA_DISTDIR}/wpa_supplicant HOSTAPD_DISTDIR?= ${WPA_DISTDIR}/hostapd .PATH.c:${.CURDIR}/.. \ + ${WPA_DISTDIR}/src/ap \ ${WPA_DISTDIR}/src/common \ ${WPA_DISTDIR}/src/crypto \ + ${WPA_DISTDIR}/src/eapol_auth \ ${WPA_DISTDIR}/src/eap_common \ + ${WPA_DISTDIR}/src/eap_peer \ + ${WPA_DISTDIR}/src/eap_server \ ${WPA_DISTDIR}/src/eapol_supp \ ${WPA_DISTDIR}/src/l2_packet \ + ${WPA_DISTDIR}/src/radius \ + ${WPA_DISTDIR}/src/rsn_supp \ + ${WPA_DISTDIR}/src/tls \ ${WPA_DISTDIR}/src/utils CFLAGS+=-I${.CURDIR} +CFLAGS+=-I${HOSTAPD_DISTDIR} CFLAGS+=-I${WPA_DISTDIR}/src CFLAGS+=-I${WPA_DISTDIR}/src/common CFLAGS+=-I${WPA_DISTDIR}/src/crypto +CFLAGS+=-I${WPA_DISTDIR}/src/drivers CFLAGS+=-I${WPA_DISTDIR}/src/l2_packet CFLAGS+=-I${WPA_DISTDIR}/src/utils diff --git a/usr.sbin/wpa/hostapd/Makefile b/usr.sbin/wpa/hostapd/Makefile index 55a1e061185..273c12785a3 100644 --- a/usr.sbin/wpa/hostapd/Makefile +++ b/usr.sbin/wpa/hostapd/Makefile @@ -3,32 +3,58 @@ .include "${.CURDIR}/../Makefile.inc" .PATH.c:${HOSTAPD_DISTDIR} \ - ${WPA_DISTDIR}/src/ap \ - ${WPA_DISTDIR}/src/eap_server \ - ${WPA_DISTDIR}/src/eap_common \ - ${WPA_DISTDIR}/src/eapol_auth \ - ${WPA_DISTDIR}/src/drivers \ - ${WPA_DISTDIR}/src/radius \ - ${WPA_DISTDIR} + ${WPA_DISTDIR}/src/drivers PROG= hostapd -SRCS= accounting.c aes-wrap.c ap_config.c \ - ap_drv_ops.c ap_mlme.c authsrv.c \ - chap.c common.c config_file.c ctrl_iface.c crypto_openssl.c \ - ctrl_iface_ap.c drivers.c drv_callbacks.c dump_state.c \ - eap_common.c eap_peap_common.c eap_register.c eap_server.c \ - eap_server_gtc.c eap_server_identity.c eap_server_md5.c \ - eap_server_methods.c eap_server_mschapv2.c eap_server_peap.c \ - eap_server_tls.c eap_server_tls_common.c eap_server_ttls.c \ - eapol_auth_dump.c eapol_auth_sm.c eloop.c hostapd.c ieee802_11_auth.c \ - ieee802_11_common.c ieee802_11_ht.c ieee802_1x.c ip_addr.c \ - md5.c main.c ms_funcs.c peerkey_auth.c pmksa_cache_auth.c \ - preauth_auth.c radius.c radius_client.c sta_info.c \ - sha1-pbkdf2.c sha1-tlsprf.c sha1-tprf.c sha1.c \ - tkip_countermeasures.c utils.c \ - vlan_init.c wpa_auth.c wpa_auth_glue.c wpa_auth_ie.c wpa_common.c \ - wpa_debug.c wpabuf.c -SRCS+= l2_packet_freebsd.c driver_freebsd.c os_unix.c +SRCS= accounting.c \ + aes-wrap.c \ + ap_config.c \ + ap_drv_ops.c \ + ap_mlme.c \ + authsrv.c \ + base64.c \ + chap.c \ + common.c \ + config_file.c \ + ctrl_iface.c \ + ctrl_iface_ap.c \ + drivers.c \ + drv_callbacks.c \ + eap_common.c \ + eap_peap_common.c \ + eap_register.c \ + eapol_auth_dump.c \ + eapol_auth_sm.c \ + eap_server.c \ + eap_server_methods.c \ + eloop.c \ + hostapd.c \ + ieee802_11_auth.c \ + ieee802_11_common.c \ + ieee802_1x.c \ + ip_addr.c \ + main.c \ + md5.c \ + ms_funcs.c \ + os_unix.c \ + peerkey_auth.c \ + pmksa_cache_auth.c \ + preauth_auth.c \ + radius.c \ + radius_client.c \ + sha1-pbkdf2.c \ + sha1.c \ + sta_info.c \ + tkip_countermeasures.c \ + utils.c \ + vlan_init.c \ + wpa_auth.c \ + wpa_auth_glue.c \ + wpa_auth_ie.c \ + wpa_common.c \ + wpa_debug.c \ + wpabuf.c +SRCS+= l2_packet_freebsd.c driver_freebsd.c MAN= hostapd.8 hostapd.conf.5 @@ -38,16 +64,17 @@ FILESDIR= ${SHAREDIR}/examples/hostapd FILES= hostapd.conf hostapd.eap_user hostapd.wpa_psk .endif -CFLAGS+= -I${HOSTAPD_DISTDIR} -I${WPA_DISTDIR}/src/drivers - -CFLAGS+= -DCONFIG_DRIVER_BSD -DHOSTAPD -CFLAGS+= -DCONFIG_DRIVER_RADIUS_ACL +CFLAGS+=-DCONFIG_DRIVER_BSD \ + -DHOSTAPD \ + -DCONFIG_DRIVER_RADIUS_ACL \ + -DCONFIG_RSN_PREAUTH \ + -DCONFIG_PEERKEY .if ${MK_INET6} != "no" CFLAGS+= -DCONFIG_IPV6 .endif #CFLAGS+= -g -DPADD+= ${LIBPCAP} ${LIBSSL} -LDADD+= -lpcap -lssl +DPADD+= ${LIBPCAP} +LDADD+= -lpcap # User customizations for wpa_supplicant/hostapd build environment CFLAGS+=${HOSTAPD_CFLAGS} @@ -55,74 +82,63 @@ CFLAGS+=${HOSTAPD_CFLAGS} LDADD+=${HOSTAPD_LDADD} #LDFLAGS+=${HOSTAPD_LDFLAGS} -.if !empty(CFLAGS:M*-DEAP_SERVER) -#SRCS+= eap.c eap_methods.c eap_identity.c +CFLAGS+=-DDPKCS12_FUNCS \ + -DEAP_SERVER \ + -DEAP_SERVER_GTC \ + -DEAP_SERVER_IDENTITY \ + -DEAP_SERVER_MD5 \ + -DEAP_SERVER_MSCHAPV2 \ + -DEAP_SERVER_PEAP \ + -DEAP_SERVER_TLS \ + -DEAP_SERVER_TTLS \ + -DEAP_TLS_FUNCS \ + -DCONFIG_NO_DUMP_STATE +SRCS+= dump_state.c \ + eap_server_gtc.c \ + eap_server_identity.c \ + eap_server_md5.c \ + eap_server_mschapv2.c \ + eap_server_peap.c \ + eap_server_tls.c \ + eap_server_tls_common.c \ + eap_server_ttls.c +TLS_FUNCS=y +NEED_SHA256=y -.if ${MK_OPENSSL} != "no" && !defined(RELEASE_CRUNCH) - -CFLAGS+=-DEAP_TLS -DEAP_PEAP -DEAP_MSCHAPv2 -DEAP_PSK \ - -DEAP_TLS_FUNCS -DEAP_TLS_OPENSSL -SRCS+= crypto_openssl.c -SRCS+= eap_tls.c eap_peap.c eap_peap_common.c eap_mschapv2.c \ - eap_psk.c eap_psk_common.c \ - eap_tls_common.c tls_openssl.c ms_funcs.c chap.c - -CFLAGS+=-DEAP_TTLS -DEAP_MD5 -SRCS+= eap_ttls.c eap_md5.c - -.if !empty(CFLAGS:M*-DEAP_GTC) -SRCS+= eap_gtc.c +.if !empty(CFLAGS:M*-DEAP_SERVER_AKA) +SRCS+= eap_server_aka.c +NEED_SIM_COMMON=y .endif -.if !empty(CFLAGS:M*-DEAP_AKA) -NEED_SIM_COMMON= true -SRCS+= eap_aka.c -.endif - -.if !empty(CFLAGS:M*-DEAP_SIM) -NEED_SIM_COMMON= true -SRCS+= eap_sim.c +.if !empty(CFLAGS:M*-DEAP_SERVER_SIM) +SRCS+= eap_server_sim.c +NEED_SIM_COMMON=y .endif .if defined(NEED_SIM_COMMON) -SRCS+= eap_sim_common.c eap_sim_db.c +SRCS+= eap_sim_common.c \ + eap_sim_db.c +NEED_AES_CBC=y +NEED_FIPS186_2_PRF=y .endif -.if !empty(CFLAGS:M*-DEAP_GPSK) +.if !empty(CFLAGS:M*-DEAP_SERVER_GPSK) CFLAGS+=-DEAP_GPSK_SHA256 -SRCS+= eap_gpsk.c eap_gpsk_common.c -NEED_SHA256= true +SRCS+= eap_server_gpsk.c \ + eap_gpsk_common.c +NEED_AES_OMAC1=y .endif -.if !empty(CFLAGS:M*-DEAP_PAX) -SRCS+= eap_pax.c eap_pax_common.c +.if !empty(CFLAGS:M*-DEAP_SERVER_PAX) +SRCS+= eap_server_pax.c \ + eap_pax_common.c .endif -.if !empty(CFLAGS:M*-DEAP_SAKE) -SRCS+= eap_sake.c eap_sake_common.c +.if !empty(CFLAGS:M*-DEAP_SERVER_SAKE) +SRCS+= eap_server_sake.c \ + eap_sake_common.c .endif -DPADD+= ${LIBSSL} ${LIBCRYPTO} -LDADD+= -lssl -lcrypto -.else -NEED_TLS_NONE= true -.endif - -.else -NEED_TLS_NONE= true -.endif - -.if defined(NEED_SHA256) -CFLAGS+=-DINTERNAL_SHA256 -SRCS+= sha256.c -.endif - -.if defined(NEED_TLS_NONE) -CFLAGS+= -DEAP_TLS_NONE -CFLAGS+= -DINTERNAL_AES -CFLAGS+= -DINTERNAL_SHA1 -CFLAGS+= -DINTERNAL_MD5 -SRCS+= tls_none.c -.endif +.include "${.CURDIR}/../Makefile.crypto" .include diff --git a/usr.sbin/wpa/hostapd/hostapd.conf.5 b/usr.sbin/wpa/hostapd/hostapd.conf.5 index a4608016a8e..08a04fe9282 100644 --- a/usr.sbin/wpa/hostapd/hostapd.conf.5 +++ b/usr.sbin/wpa/hostapd/hostapd.conf.5 @@ -67,7 +67,8 @@ The following parameters are recognized: Interface name. Should be set in .Dq hostap -mode. +mode. Make certain that there are no spaces after the interface name, +or hostapd will complain that the interface does not exist. .It Va debug Debugging mode: 0 = no, 1 = minimal, 2 = verbose, 3 = msg dumps, 4 = excessive. @@ -171,8 +172,8 @@ will be converted to PSK. This conversion uses SSID so the PSK changes when ASCII passphrase is used and the SSID is changed. .It Va wpa_psk_file -Optionally, WPA PSKs can be read from a separate text file (containing a -list of (PSK,MAC address) pairs. +Optionally, WPA PSKs can be read from a separate text file containing a +list of PSK and MAC address pairs. .It Va wpa_key_mgmt Set of accepted key management algorithms (WPA-PSK, WPA-EAP, or both). .It Va wpa_pairwise diff --git a/usr.sbin/wpa/ndis_events/ndis_events.8 b/usr.sbin/wpa/ndis_events/ndis_events.8 index eacb017a0cb..9cc2bcdca94 100644 --- a/usr.sbin/wpa/ndis_events/ndis_events.8 +++ b/usr.sbin/wpa/ndis_events/ndis_events.8 @@ -71,7 +71,7 @@ When it detects an event that was generated by an interface, it transmits it via UDP packet on the loopback interface, where .Xr wpa_supplicant 8 -is presumeably listening. +is presumably listening. The standard .Xr wpa_supplicant 8 distribution includes its own version of this utility for use with diff --git a/usr.sbin/wpa/wpa_supplicant/Makefile b/usr.sbin/wpa/wpa_supplicant/Makefile index 3a8584ac389..6c352abf2c2 100644 --- a/usr.sbin/wpa/wpa_supplicant/Makefile +++ b/usr.sbin/wpa/wpa_supplicant/Makefile @@ -3,23 +3,44 @@ .include "${.CURDIR}/../Makefile.inc" .PATH.c:${WPA_SUPPLICANT_DISTDIR} \ - ${WPA_DISTDIR}/src/drivers \ - ${WPA_DISTDIR}/src/eap_peer \ - ${WPA_DISTDIR}/src/rsn_supp \ - ${WPA_DISTDIR}/src/crypto + ${WPA_DISTDIR}/src/drivers PROG= wpa_supplicant -SRCS= aes-cbc.c aes-ctr.c aes-eax.c aes-encblock.c \ - aes-internal.c aes-omac1.c aes-unwrap.c \ - aes-wrap.c bss.c blacklist.c common.c config.c ctrl_iface.c \ - ctrl_iface_unix.c drivers.c eloop.c events.c l2_packet_freebsd.c main.c\ - md5.c notify.c preauth.c pmksa_cache.c scan.c \ - sha1-pbkdf2.c sha1-tlsprf.c sha1-tprf.c sha1.c \ - wpa.c wpa_common.c wpa_debug.c wpa_ie.c wpa_supplicant.c \ - wpabuf.c wpas_glue.c \ - driver_ndis.c Packet32.c \ +SRCS= aes-unwrap.c \ + base64.c \ + blacklist.c \ + bss.c \ + common.c \ + config.c \ + config_file.c \ + ctrl_iface.c \ + ctrl_iface_unix.c \ + driver_ndis.c \ driver_wired.c \ - driver_freebsd.c os_unix.c + drivers.c \ + eap_register.c \ + eloop.c \ + events.c \ + main.c \ + md5.c \ + notify.c \ + os_unix.c \ + peerkey.c \ + pmksa_cache.c \ + preauth.c \ + scan.c \ + sha1-pbkdf2.c \ + sha1.c \ + wpa.c \ + wpa_common.c \ + wpa_debug.c \ + wpa_ie.c \ + wpa_supplicant.c \ + wpabuf.c \ + wpas_glue.c +SRCS+= driver_freebsd.c \ + l2_packet_freebsd.c \ + Packet32.c MAN= wpa_supplicant.8 wpa_supplicant.conf.5 @@ -29,23 +50,19 @@ FILESDIR= ${SHAREDIR}/examples/etc FILES= wpa_supplicant.conf .endif -CFLAGS+=-I${WPA_SUPPLICANT_DISTDIR} -CFLAGS+=-I${WPA_DISTDIR}/src/drivers -CFLAGS+=-I${WPA_DISTDIR}/src/rsn_supp - -CFLAGS+= -DCONFIG_DRIVER_BSD -CFLAGS+= -DCONFIG_DRIVER_NDIS -CFLAGS+= -DCONFIG_DRIVER_WIRED -CFLAGS+= -DCONFIG_TERMINATE_ONLASTIF -CFLAGS+= -DCONFIG_DEBUG_SYSLOG +CFLAGS+=-DCONFIG_BACKEND_FILE \ + -DCONFIG_DEBUG_SYSLOG \ + -DCONFIG_DRIVER_BSD \ + -DCONFIG_DRIVER_NDIS \ + -DCONFIG_DRIVER_WIRED \ + -DCONFIG_PEERKEY \ + -DCONFIG_SMARTCARD \ + -DCONFIG_TERMINATE_ONLASTIF \ + -DPKCS12_FUNCS #CFLAGS+= -g DPADD+= ${LIBPCAP} LDADD+= -lpcap -# NB: we only support wpa_supplicant.conf file -SRCS+= config_file.c base64.c -CFLAGS+=-DCONFIG_BACKEND_FILE - # User customizations to the wpa_supplicant build environment CFLAGS+=${WPA_SUPPLICANT_CFLAGS} #DPADD+=${WPA_SUPPLICANT_DPADD} @@ -53,43 +70,58 @@ LDADD+=${WPA_SUPPLICANT_LDADD} #LDFLAGS+=${WPA_SUPPLICANT_LDFLAGS} .if ${MK_WPA_SUPPLICANT_EAPOL} != "no" -SRCS+= eapol_supp_sm.c eap.c eap_common.c eap_methods.c eap_register.c -CFLAGS+= -DIEEE8021X_EAPOL - -.if ${MK_OPENSSL} != "no" && !defined(RELEASE_CRUNCH) -CFLAGS+=-DEAP_TLS -DEAP_PEAP -DEAP_MSCHAPv2 -DEAP_LEAP -DEAP_PSK \ - -DEAP_TLV -DEAP_TLS_FUNCS -DEAP_TLS_OPENSSL -SRCS+= chap.c crypto_openssl.c \ +CFLAGS+=-DEAP_GTC \ + -DEAP_LEAP \ + -DEAP_MD5 \ + -DEAP_MSCHAPv2 \ + -DEAP_OTP \ + -DEAP_PEAP \ + -DEAP_PSK \ + -DEAP_TLS \ + -DEAP_TTLS \ + -DIEEE8021X_EAPOL +SRCS+= chap.c \ + eap.c \ + eap_common.c \ + eap_gtc.c \ eap_leap.c \ + eap_md5.c \ + eap_methods.c \ eap_mschapv2.c \ - eap_peap.c eap_peap_common.c \ - eap_psk.c eap_psk_common.c \ - eap_tls.c eap_tls_common.c \ - mschapv2.c ms_funcs.c tls_openssl.c - -CFLAGS+=-DEAP_TTLS -DEAP_MD5 -SRCS+= eap_ttls.c eap_md5.c - -.if !empty(CFLAGS:M*-DEAP_GTC) -SRCS+= eap_gtc.c -.endif - -.if !empty(CFLAGS:M*-DEAP_OTP) -SRCS+= eap_otp.c + eap_otp.c \ + eap_peap.c \ + eap_peap_common.c \ + eap_psk.c \ + eap_psk_common.c \ + eap_tls.c \ + eap_tls_common.c \ + eap_ttls.c \ + eapol_supp_sm.c \ + ms_funcs.c \ + mschapv2.c +TLS_FUNCS=y +NEED_AES_EAX=y +NEED_AES_ENCBLOCK=y +NEED_AES_OMAC1=y +NEED_SHA256=y .endif .if !empty(CFLAGS:M*-DEAP_AKA) -NEED_SIM_COMMON= true SRCS+= eap_aka.c +NEED_SIM_COMMON=y +NEED_AES_CBC=y .endif .if !empty(CFLAGS:M*-DEAP_SIM) -NEED_SIM_COMMON= true SRCS+= eap_sim.c +NEED_SIM_COMMON=y +NEED_AES_CBC=y .endif .if defined(NEED_SIM_COMMON) SRCS+= eap_sim_common.c +NEED_FIPS186_2_PRF=y +.endif # PC/SC interface for smartcards (USIM, GSM SIM) # GSM/UMTS authentication algorithm (for EAP-SIM/EAP-AKA) @@ -103,52 +135,24 @@ SRCS+= pcsc_funcs.c DPADD+=${LIBPTHREAD} LDADD+=-lpcsclite -lpthread .endif -.endif .if !empty(CFLAGS:M*-DEAP_GPSK) CFLAGS+=-DEAP_GPSK_SHA256 -SRCS+= eap_gpsk.c eap_gpsk_common.c -NEED_SHA256= true +SRCS+= eap_gpsk.c \ + eap_gpsk_common.c +NEED_AES_OMAC1=y .endif .if !empty(CFLAGS:M*-DEAP_PAX) -SRCS+= eap_pax.c eap_pax_common.c +SRCS+= eap_pax.c \ + eap_pax_common.c .endif .if !empty(CFLAGS:M*-DEAP_SAKE) -SRCS+= eap_sake.c eap_sake_common.c +SRCS+= eap_sake.c \ + eap_sake_common.c .endif -# NB: requires patch to openssl -#CFLAGS+= -DEAP_FAST -#SRCS+= eap_fast.c - -NEED_LIBSSL= true -.else -CFLAGS+= -DEAP_TLS_NONE -SRCS+= tls_none.c -.endif - -.endif - -# -# Configure crypto/cipher support. -# -# EAPOL support requires openssl in which case we use their -# cipher code. Otherwise we use our internal versions. -# -.if !defined(NEED_LIBSSL) -CFLAGS+= -DINTERNAL_AES -CFLAGS+= -DINTERNAL_SHA1 -CFLAGS+= -DINTERNAL_MD5 -.else -DPADD+= ${LIBSSL} ${LIBCRYPTO} -LDADD+= -lssl -lcrypto -.endif - -.if defined(NEED_SHA256) -CFLAGS+=-DINTERNAL_SHA256 -SRCS+= sha256.c -.endif +.include "${.CURDIR}/../Makefile.crypto" .include diff --git a/usr.sbin/wpa/wpa_supplicant/wpa_supplicant.conf.5 b/usr.sbin/wpa/wpa_supplicant/wpa_supplicant.conf.5 index d37847e6c2c..5d6914fccb9 100644 --- a/usr.sbin/wpa/wpa_supplicant/wpa_supplicant.conf.5 +++ b/usr.sbin/wpa/wpa_supplicant/wpa_supplicant.conf.5 @@ -316,7 +316,7 @@ This can be used to achieve forward secrecy. If the .Va dh_file is in DSA parameters format, it will be automatically converted -into DH params. +into DH parameters. .It Va subject_match Substring to be matched against the subject of the authentication server certificate. @@ -370,7 +370,7 @@ TLS Message Length field in all TLS messages even if they are not fragmented. .It Li sim_min_num_chal=3 can be used to configure EAP-SIM to require three -challenges (by default, it accepts 2 or 3) +challenges (by default, it accepts 2 or 3). .It Li fast_provisioning=1 option enables in-line provisioning of EAP-FAST credentials (PAC).

    A&:ICVPTC,L**@XNU[]B4PRBC)U=6.ZI'DF-8I;)'C$] -MEEL9P5LE*VKX7!^,(^I$(X9CU.-E[U%5%K\+Y$(H?"6,8N)ES,B+E/>P'AL; -M5;V%^2G5WN^L(3[:\2S<6>#A\SY+QDDI```D41+/BV%)?$+)QIXY*#Z'&+T[ -M;N5._Y#$J#0<:0ED0-_ -M8E,,HHR=75CNJ1Y)C6*6R1XQ/99;&<%;)2MJ^%P?C"/J1".&8]3C9>]151:_ -M"^1"*'PEC&+B9.2@^AQB].V[E3O^0Q*@T'&D)9$#7*0``'```0`2TQ9Q! -M2+NYH'&>AI065]E:@)`SN -M$K=&==(-`)@!``"8`0```@```$4``91M!P``0!$``,"H`0'`J`$"`?0!]`&` -M!V4.8L$=AYG($```````````(2`B"`````````%X(@``>````'0!`0@,`P`` -M#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"``#G)\Z@LCG*=0A\08<6#*H&)&A;C&G( -M^S?]S!Z$9JF/;#2,RPHJ#B[7OV)3#**,G5U8[JD>28UBELD>,3V66QG!6R4K -M:OA<'XPCZD0CAF/4XV7O4546OPOD0BA\)8QBXF7,R(N4][`>&QM5O87Y*=7> -M[ZPA/MKQ+-Q9X.'S/DO&22D``"11$L^+84E\0LG&GCDH/H<8O3MNY4[_D,2H -M-!QI"61`URD``!P``$`$M,6<04B[N:!QGH:4%E?96H'+=$\````<``!`!4R. -M^V>J"-7;7-^9,TMT5?>O'B0,[Q*W1H/@"P"8`0``F`$```(```!%``&4;0D` -M`$`1``#`J`$!P*@!`@'T`?0!@`=E\#E9-<3I$R8``````````"$@(@@````` -M```!>"(``'@```!T`0$)#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``:R@* -MWG'2Q,%(#V&;-LI2"_7'BI#\@-3-*RS_\+O3JBUG8YTP)H/>;PNH*:@KDF;] -MP7^_F$F_>N9ZA:\=!EJ`JSJ8/^9$[I`59=:]YX65&^^5)U"*T)GC11CFBMU#[X:0I```DL1*+-M7< -M"3OZ*'%/`B"K%V^6HGBE/KV*F_IKEW\8LIP_4S)JI]A5 -MD]NUEO.R=`&?````'```0`4,01H6[^FN9,-`Q+TKL\9LD]D&2^\2MT;`"@\` -MF`$``)@!```"````10`!E&T*``!`$0``P*@!`<"H`0(!]`'T`8`'9?`Y637$ -MZ1,F```````````A("((`````````7@B``!X````=`$!"0P#```,`0``#(`. -M`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P`` -M"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```" -M````"`0```XH``"(``(``&LH"MYQTL3!2`]AFS;*4@OUQXJ0_(#4S2LL__"[ -MTZHM9V.=,":#WF\+J"FH*Y)F_<%_OYA)OWKF>H6O'09:@*LZF#_F1.Z0%676 -MO>>%E1G,'.<;B((E$0"TN89E1VF!!#JI]7,*LG!`YRDI8B/^'OOE2=0BM"9X -MT48YHK=0^^&D*0``)+$2BS;5W`D[^BAQ3P(@JQ=OEJ)XI3Z]BIOZ:Y=_&+*7 -M*0``'```0`2.`*7L/U,R:J?859/;M9;SLG0!GP```!P``$`%#$$:%N_IKF3# -M0,2]*[/&;)/9!DOP$K=&3@H&`)@!``"8`0```@```$4``91M#P``0!$``,"H -M`0'`J`$"`?0!]`&`!V7P.5DUQ.D3)@``````````(2`B"`````````%X(@`` -M>````'0!`0D,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"``!K*`K><=+$P4@/ -M89LVRE(+]<>*D/R`U,TK+/_PN].J+6=CG3`F@]YO"Z@IJ"N29OW!?[^82;]Z -MYGJ%KQT&6H"K.I@_YD3ND!5EUKWGA949S!SG&XB")1$`M+F&94=I@00ZJ?5S -M"K)P0.-%&.:*W4/OAI"D``"2Q$HLVU=P)._HH<4\" -M(*L7;Y:B>*4^O8J;^FN7?QBRERD``!P``$`$C@"E[#]3,FJGV%63V[66\[)T -M`9\````<``!`!0Q!&A;OZ:YDPT#$O2NSQFR3V09+\1*W1O`4!`"8`0``F`$` -M``(```!%``&4;14``$`1``#`J`$!P*@!`@'T`?0!@`=E]7Z9DU&>E,$````` -M`````"$@(@@````````!>"(``'@```!T`0'W#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``J)KPN[80LY(4K$(F=-.T]/5[`F(6'9-:>RBRL[]$"*'K.=8; -M-G'U^%I\B?V8EXZFR5S+WR=M$;BG@(S=&O%`B&K8^.IN6EJ/4=9$*-^66N*R -MNL69T*!5%1[$SW8$`<=/ZKLO\IZAS:.!`$.8S5>GU;08-1)AV-SN>;1!5_P\ -MK87S4I:RZOH"U6-H==AW$#%P(_UY8]'6+\-VSGSL=````'```0`4&Y,-B_QN13%:%EXME+W5B -M3A:D0/$2MT::0@<`F`$``)@!```"````10`!E&T6``!`$0``P*@!`<"H`0(! -M]`'T`8`'9?5^F9-1GI3!```````````A("((`````````7@B``!X````=`$! -M]PP#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0`` -M`P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```( -M`P``!0,```@$```"````"`0```XH``"(``(``*B:\+NV$+.2%*Q")G33M/3U -M>P)B%AV36GLHLK._1`BAZSG6&S9Q]?A:?(G]F)>.ILE6/1UB_#=G*0``'```0`2.C1..[3S9I\-H-G\-H_T'LY\['0```!P` -M`$`%!N3#8O\;D4Q6A9>+92]U8DX6I$#Q$K=&.H0-`)@!``"8`0```@```$4` -M`91M%P``0!$``,"H`0'`J`$"`?0!]`&`!V7U?IF349Z4P0``````````(2`B -M"`````````%X(@``>````'0!`?<,`P``#`$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M``"HFO"[MA"SDA2L0B9TT[3T]7L"8A8=DUI[*+*SOT0(H>LYUALV`C-T:\4"(:MCXZFY:6H]1UD0HWY9:XK*ZQ9G0H%45 -M'L3/=@0!QT_JNR_RGJ'-HX$`0YC-5Z?5M!@U$F'8W.YYM$%7_#RMARD``"1; -MW.^H#=Y?-2EK+J^@+58VAUV'<0,7`C_7ECT=8OPW9RD``!P``$`$CHT3CNT\ -MV:?#:#9_#:/]![.?.QT````<``!`!0;DPV+_&Y%,5H67BV4O=6).%J1`\A*W -M1CR2"P"8`0``F`$```(```!%``&4;24``$`1``#`J`$!P*@!`@'T`?0!@`=E -M\:(:EDZ'#F4``````````"$@(@@````````!>"(``'@```!T`0'X#`,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``C+9#W&NNY#VF5F9DZE>.9(,.65*BP>-E -MXPR:.]RZJZ,C$\^XJ`S.P?71$9I;B0?X<>C>3NQ\X0`AX)S^NKV6P2_`#\`Z -MAG?YX'9(D54#-^(+9\47L'(3^7=$GUNPFQCOPB4T/1"`?,!"E4.*/$:&%.4W.L`R"YL$BG$*4I -M_@@"BUG'X!#"\````'```0`720*KM -M%L/O3?9(90LZ/[V:T=>*/?(2MT:=O`X`F`$``)@!```"````10`!E&TG``!` -M$0``P*@!`<"H`0(!]`'T`8`'9?&B&I9.APYE```````````A("((```````` -M`7@B``!X````=`$!^`P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0`` -M#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```" -M`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``(RV0]QK -MKN0]IE9F9.I7CF2##EE2HL'C9>,,FCO"<_KJ]EL$OP`_`.H9W^>!V2)%5`S?B"V?%%[!R$_EW1)];L)L8 -M[\(E-#W):,IO86PB/YX,-,?I&(-+N_EO^]W2IND2JZD?*0``)#E7D0@'S`0I -M5#BCQ&AA3E-SK`,@N;!(IQ"E*?X(`G,3*0``'```0`1^+"159S1UG6?I01.W -MHM9Q^`0PO````!P``$`%TD"J[1;#[TWV2&4+.C^]FM'7BCWS$K=&V[L%`)@! -M``"8`0```@```$4``91M*```0!$``,"H`0'`J`$"`?0!]`&`!V7QHAJ63H<. -M90``````````(2`B"`````````%X(@``>````'0!`?@,`P``#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"``",MD/<:Z[D/:969F3J5XYD@PY94J+!XV7C#)H[W+JK -MHR,3S[BH#,[!]=$1FEN)!_AQZ-Y.['SA`"'@G/ZZO9;!+\`/P#J&=_G@=DB1 -M50,WX@MGQ1>P##3'Z1B#2[OY;_O= -MTJ;I$JNI'RD``"0Y5Y$(!\P$*50XH\1H84Y3"(``'@` -M``!T`0'Y#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``]B5],M=L^0N?#:T. -MQMGJ1*MA&&PZ;J#Q!Q;Z?1T1X./"^DSM-'^ -M`V-X?(*EMCO&D@>#(PR1Y.I/3H[N%'FY/WPI```DA[3(>B<0@F;"G^`UZXFG -ME^%+X%LB^E7.R.)1.%4E0\XI```<``!`!&NWGG+P_$R>-_;FDM!YDW')"2A! -M````'```0`7NJ[!4X./ZTA+BO7'UUY5"RG_0#/02MT:H]`8`F`$``)@!```" -M````10`!E&TV``!`$0``P*@!`<"H`0(!]`'T`8`'94O-%6LCSZ#3```````` -M```A("((`````````7@B``!X````=`$!^0P#```,`0``#(`.`(`#```,`0`` -M#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```( -M`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH -M``"(``(``/8E?3+7;/D+GPVM#L;9ZD2K81AL.FZ@\0<6^GT=$>#CPOI,W+&8 -ML=0]%86X&%M\O<@8"U!?2^0_6TL$+EHH1JY*#8")4Y)-)><2>'-%&&.=8 -MK^U;F%P9-(GK31_@-C>'R"I;8[QI('@R,,D>3J3TZ.[A1YN3]\ -M*0``)(>TR'HG$()FPI_@->N)IY?A2^!;(OI5SLCB43A5)4/.*0``'```0`1K -MMYYR\/Q,GC?VYI+0>9-QR0DH00```!P``$`%[JNP5.#C^M(2XKUQ]=>50LI_ -MT`ST$K=&]C4-`)@!``"8`0```@```$4``91M.```0!$``,"H`0'`J`$"`?0! -M]`&`!V5+S15K(\^@TP``````````(2`B"`````````%X(@``>````'0!`?D, -M`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``#V)7TRUVSY"Y\-K0[&V>I$JV$8 -M;#INH/$'%OI]'1'@X\+Z3-RQF+'4/16%N!A;?+W(&`M07TA@T_D/UM+!"Y:* -M$:N2@V`B5.2327G$GAS11ACG6*_G+)^MA^SIGM6YA<&32)ZTT?X#8WA\@J6V -M.\:2!X,C#)'DZD].CNX4>;D_?"D``"2'M,AZ)Q""9L*?X#7KB:>7X4O@6R+Z -M5<[(XE$X525#SBD``!P``$`$:[>>ZKL%3@X_K2$N*]"(``'@```!T`0'\#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MLZJ@,VQ%^+X[$(*[B>.I4LQBY@IF`UQ[T11"J+%TR)>!<4;FHPXNGF@1+3Z9 -MNVKRA=<[X752J^Z011Q/EM+\O:^[7-XI```DU:N& -ML@J(GB9UIK:[[+6F/1)EVK+9T.4%\24680UMFLPI```<``!`!-5=6=Z<>#$S -MLQZ712$O5Q>:BR\8````'```0`68XY2-YG=YX:`P.MG;N)1].[26L/42MT:* -M;@X`F`$``)@!```"````10`!E&U```!`$0``P*@!`<"H`0(!]`'T`8`'90M& -M6B[KYXNP```````````A("((`````````7@B``!X````=`$!_`P#```,`0`` -M#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```" -M`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$ -M```"````"`0```XH``"(``(``+.JH#-L1?B^.Q""NXGCJ5+,8N8*9@-<>]$4 -M0JBQ=,B7@7%&YJ,.+IYH$2T^F;MJ\H77.^%U4JOG)4G1W7,:H*=P]8:O\9PI -M!,%$#`"5U/[4D-.95@6GXE^EUEC.MP#<"O0[5=84QLC`ANFF:-5'8H9W527N -MD$4<3Y;2_+VONUS>*0``)-6KAK(*B)XF=::VN^RUICT29=JRV=#E!?$E%F$- -M;9K,*0``'```0`3575G>G'@Q,[,>ET4A+U<7FHLO&````!P``$`%F..4C>9W -M>>&@,#K9V[B4?3NTEK#V$K=&I6T%`)@!``"8`0```@```$4``91M0@``0!$` -M`,"H`0'`J`$"`?0!]`&`!V4+1EHNZ^>+L```````````(2`B"`````````%X -M(@``>````'0!`?P,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"``"SJJ`S;$7X -MOCL0@KN)XZE2S&+F"F8#7'O1%$*HL73(EX%Q1N:C#BZ>:!$M/IF[:O*%USOA -M=5*KYR5)T=US&J"G)G6F -MMKOLM:8]$F7:LMG0Y07Q)19A#6V:S"D``!P``$`$U5U9WIQX,3.S'I=%(2]7 -M%YJ++Q@````<``!`!9CCE(WF=WGAH#`ZV=NXE'T[M):P]Q*W1H5Y`P"8`0`` -MF`$```(```!%``&4;4H``$`1``#`J`$!P*@!`@'T`?0!@`=E_55LP`@=01$` -M`````````"$@(@@````````!>"(``'@```!T`0']#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@```=$%$IU?P@O6'=BT03'J_,`<],5-C\X4B*R6VO\QB^=6 -M4I[4G0/"GPR'@AEH/M+->8I'GUZ%=&Q>%8;6Q8JF+4$A0>(G(Y*H[$\=H9\2 -MC->J7>1EJ6B=2:!1)7E*:^Z)B)66/*2&/&^R8SZ73A![BZ,"'XG8!5;8N.W1 -MYCTKT?,I```D14K*X.,R*A*^J=<.G8(Q=L3JN'B)U7@MI6O=>ELM\&HI```< -M``!`!&=T:M!KGP;O?)DJP6!V@+-+_HA:````'```0`5W^JG^N#-L+2P)\/"" -MTT!HN[^<8_<2MT8AI@8`F`$``)@!```"````10`!E&U+``!`$0``P*@!`<"H -M`0(!]`'T`8`'9?U5;,`('4$1```````````A("((`````````7@B``!X```` -M=`$!_0P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```( -M`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$# -M```(`P``!0,```@$```"````"`0```XH``"(``(```'1!1*=7\(+UAW8M$$Q -MZOS`'/3%38_.%(BLEMK_,8OG5E*>U)T#PI\,AX(9:#[2S7F*1Y]>A71L7A6& -MUL6*IBU!(4'B)R.2J.Q/':&?$HS7JEWD9:EHG4F@425Y2FONB8B5ECRDACQO -MLF,^ETX0>XNC`A^)V`56V+CMT>8]*]'S*0``)$5*RN#C,BH2OJG7#IV",7;$ -MZKAXB=5X+:5KW7I;+?!J*0``'```0`1G=&K0:Y\&[WR9*L%@=H"S2_Z(6@`` -M`!P``$`%=_JI_K@S;"TL"?#P@M-`:+N_G&/W$K=&U><,`)@!``"8`0```@`` -M`$4``91M40``0!$``,"H`0'`J`$"`?0!]`&`!V7]56S`"!U!$0`````````` -M(2`B"`````````%X(@``>````'0!`?T,`P``#`$```R`#@"``P``#`$```R` -M#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(` -M``0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*``` -MB``"```!T042G5_""]8=V+1!,>K\P!STQ4V/SA2(K);:_S&+YU92GM2=`\*? -M#(>"&6@^TLUYBD>?7H5T;%X5AM;%BJ8M02%!XB4IK[HF(E98\I(8\;[)C/I=.$'N+HP(?B=@%5MBX[='F/2O1\RD` -M`"1%2LK@XS(J$KZIUPZ=@C%VQ.JX>(G5>"VE:]UZ6RWP:BD``!P``$`$9W1J -MT&N?!N]\F2K!8':`LTO^B%H````<``!`!7?ZJ?ZX,VPM+`GP\(+30&B[OYQC -M^!*W1I/T"@"8`0``F`$```(```!%``&4;54``$`1``#`J`$!P*@!`@'T`?0! -M@`=E]""QR9U:%+H``````````"$@(@@````````!>"(``'@```!T`0'^#`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``,Y+;2T;LF]ONCP.6'LHN((?D'@P2 -M/\]SN&ZAT6O:,R50T&?I7]6"IF&^DTG0?B%4@4:)*BQ5]B'9XHZ9;PC$M'I1 -M[:!/R:.CHU[&'T[7Q59!Y=#+9-5CGHC,T=;D#$/?O\]5(E+6B70RB -M!'&G@14%B2"Z3^V@YM[.V2@I```DI=NS%2*EYSSQ;3=^]_%1JIA#K$V#(1?, -M\KNQS/*ZL:PI```<``!`!*:.71GU^8IP&")VPA;9=_2ADT__````'```0`4L -M($Y**.F6\(Q+1Z4>V@3\FCHZ->QA].U\560>70RV358YZ(S-'6 -MY`Q#W[_/52)7(N'6OWBUHET,H@1QIX$5!8D@ND_MH.;>SMDH*0``)*7;LQ4B -MI><\\6TW?O?Q4:J80ZQ-@R$7S/*[L````'0!`?X,`P``#`$```R` -M#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,` -M``@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!``` -M`@````@$```.*```B``"```SDMM+1NR;V^Z/`Y8>RBX@A^0>#!(_SW.X;J'1 -M:]HS)5#09^E?U8*F8;Z32=!^(52!1HDJ+%7V(=GBCIEO",2T>E'MH$_)HZ.C -M7L8?3M?%5D'ET,MDU6.>B,S1UN0,0]^_SU4B5R+AUK]XM:)=#*($<:>!%06) -M(+I/[:#FWL[9*"D``"2EV[,5(J7G//%M-W[W\5&JF$.L38,A%\SRN[',\KJQ -MK"D``!P``$`$IHY=&?7YBG`8(G;"%MEW]*&33_\````<``!`!2P@3DIRRNA3 -M9:WRLHV,ST);H?70^A*W1H,K`P"8`0``F`$```(```!%``&4;64``$`1``#` -MJ`$!P*@!`@'T`?0!@`=E-<4"\C"D'G(``````````"$@(@@````````!>"(` -M`'@```!T`0'_#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``&I;$BK`.,&QO -M,_]-J6?G33*DY$([TB$]&0_XSG/L1AZU#(*Y:UP:!>]C'@AAA+^/YC!8QK;% -MB].BO,&4\IZ;U?8(&J2+`0`WA5RT[JDX*]"E,J'1Y\DY_DNHG2.V0_-E[RW2 -M/S,;E@,EB@BJA1O)[L9VO);:G%?[=FN!$9W#\``I```D6N9?@@0C:F(VGO6J -MH_Z-^-BKK3V@;B0PY,MO0U@+`-@I```<``!`!(,8G1U8VG82N-^RA[V]P_T% -MTA8R````'```0`7GU8F/96/H`AV6.<>\T2?EJI`)/OH2MT826`8`F`$``)@! -M```"````10`!E&UJ``!`$0``P*@!`<"H`0(!]`'T`8`'937%`O(PI!YR```` -M```````A("((`````````7@B``!X````=`$!_PP#```,`0``#(`.`(`#```, -M`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$# -M```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0` -M``XH``"(``(``!J6Q(JP#C!L;S/_3:EGYTTRI.1".](A/1D/^,YS[$8>M0R" -MN6M<&@7O8QX(882_C^8P6,:VQ8O3HKS!E/*>F]7V"!JDBP$`-X5?).?Y+J)TCMD/S9>\MTC\S&Y8#)8H(JH4;R>[&=KR6VIQ7^W9K@1&= -MP_``*0``)%KF7X($(VIB-I[UJJ/^C?C8JZT]H&XD,.3+;T-8"P#8*0``'``` -M0`2#&)T=6-IV$KC?LH>]O<@``````````(2`B"`````````%X(@``>````'0! -M`?\,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$` -M``,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P`` -M"`,```4#```(!````@````@$```.*```B``"```:EL2*L`XP;&\S_TVI9^=- -M,J3D0CO2(3T9#_C.<^Q&'K4,@KEK7!H%[V,>"&&$OX_F,%C&ML6+TZ*\P93R -MGIO5]@@:I(L!`#>%7+3NJ3@KT*4RH='GR3G^2ZB=([9#\V7O+=(_,QN6`R6* -M"*J%&\GNQG:\EMJ<5_MV:X$1G]:JC_HWXV*NM -M/:!N)##DRV]#6`L`V"D``!P``$`$@QB='5C:=A*XW[*'O;W#_072%C(````< -M``!`!>?5B8]E8^@"'98YQ[S1)^6JD`D^^Q*W1E>F"@"8`0``F`$```(```!% -M``&4;7D``$`1``#`J`$!P*@!`@'T`?0!@`=E>U<>BM&;C5X``````````"$@ -M(@@````````!>"(``'@```!T`0$!#`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``FUA9Y:!F9!2M,#J&_//_%__"A_AHLOZ7Z)UX -M"1@3G58I;D<]U<@%M1U)L1J')>Q">L9R0]R70'9>?/7,HE&/L2 -MMT8>T@T`F`$``)@!```"````10`!E&U\``!`$0``P*@!`<"H`0(!]`'T`8`' -M97M7'HK1FXU>```````````A("((`````````7@B``!X````=`$!`0P#```, -M`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@" -M```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,` -M``@$```"````"`0```XH``"(``(``)M86>6@9F04K3`ZAG.@WP1&;R4WW[@: -M2D5$1#KRN5CC*4F/Z?#6?1/5L0]>,KJ3JC9L`D8$YU6*6Y'/=7(!;4=2;$7(W&0/3_11)5\ -MYYO@URK^BBI!RO/HIH9+*0``)`"_8O45:%5FRV:WTBN6W$[9+VF?H#!83_2C -M0#>^,4P#*0``'```0`0EKT````'0!`0$,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$` -M``R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P`` -M`@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``";6%GE -MH&9D%*TP.H9SH-\$1F\E-]^X&DI%1$0Z\KE8XRE)C^GPUGT3U;$/7C*ZDZHV -M;'(B/A#3M$8G_3%4ZXRQHD39"?V)LI[\\_\7_\*'^&BR_I?HG7@)&!.=5BEN -M1SW5R`6U'4FQ%R-QD#T_T425?.>;X-=H````<``!`!9ZH"(``'@```!T`0$"#`,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``;[?5);,/#*/Z6%3Z/,#YYG@A2]0S9")SH&R!\^Q4 -M:X5ZZ'`>0:BB:P2O>JJC#M^!0`F,8AER4+8P:8F@<;;=?GOMC!'@5N_B8L^/ -M?W*US1-U$QQ_H.=CFLV<>(;HPWQ/@^6.,!,*@@<($H-M$@(!K5=E#X->+LUI -MUB5Y3V\WAXPI```DR&;T9`\=K]@QE&W6JY`V^\>R@HHFO*I02F(16`BV5@,I -M```<``!`!+^A_VHTN5A>V!D&IK]SAZD]G58V````'```0`68KQMWBQTRRA#4 -M`/":-MO*RL/.Z?T2MT;#"08`F`$``)@!```"````10`!E&V*``!`$0``P*@! -M`<"H`0(!]`'T`8`'96?R1O?4KD1Z```````````A("((`````````7@B``!X -M````=`$!`@P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`# -M```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,` -M``$#```(`P``!0,```@$```"````"`0```XH``"(``(``&^WU26S#PRC^EA4 -M^CS`^>9X(4O4,V0BNAP'D&HHFL$KWJJHP[?@4`)C&(94]O-X>,*0``),AF]&0/':_8,91MUJN0 -M-OO'LH**)KRJ4$IB$5@(ME8#*0``'```0`2_H?]J-+E87M@9!J:_I/9U6 -M-@```!P``$`%F*\;=XL=,LH0U`#PFC;;RLK#SNG]$K=&8TL,`)@!``"8`0`` -M`@```$4``91MEP``0!$``,"H`0'`J`$"`?0!]`&`!V5G\D;WU*Y$>@`````` -M````(2`B"`````````%X(@``>````'0!`0(,`P``#`$```R`#@"``P``#`$` -M``R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P`` -M"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```. -M*```B``"``!OM]4ELP\,H_I85/H\P/GF>"%+U#-D(G.@;('S[%1KA7KH^V,$>!6[^)BSX]_' -MC"D``"3(9O1D#QVOV#&4;=:KD#;[Q[*"BB:\JE!*8A%8"+96`RD``!P``$`$ -MOZ'_:C2Y6%[8&0:FOW.'J3V=5C8````<``!`!9BO&W>+'3+*$-0`\)HVV\K* -MP\[I_A*W1B95"@"8`0``F`$```(```!%``&4;9T``$`1``#`J`$!P*@!`@'T -M`?0!@`=EC;-:LPUC`M0``````````"$@(@@````````!>"(``'@```!T`0$# -M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``)`CJHJ"&PZ63;QT&UP&U1'4) -MC==I//XPP&:M!DHW@>1X=[]_%B]]'K8RH[[1HR%0_&ET/IE\,5MS+D5!!6+R -MN+*X_\_@U'-.7;AO+_[B&FIL"'YF][I,00\;J#+DO+ -M?[/NHN2'$QJ`:S`I```<``!`!/CC;TC?^,_U-*KH,$A,X:\U;NWD````'``` -M0`5=]@%ZRPYFFP;I$0:%.#.]SV/8OOX2MT:K@PT`F`$``)@!```"````10`! -ME&V>``!`$0``P*@!`<"H`0(!]`'T`8`'98VS6K,-8P+4```````````A("(( -M`````````7@B``!X````=`$!`PP#```,`0``#(`.`(`#```,`0``#(`.`0`# -M```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,` -M``@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(` -M`"0(ZJ*@AL.EDV\=!M'>_?Q8O?1ZV,J.^ -MT:,A4/QI=#Z9?#%;Z3$$/&Z@RY+RW^S[J+DAQ,:@&LP*0``'```0`3XXV](W_C/ -M]32JZ#!(3.&O-6[MY````!P``$`%7?8!>LL.9IL&Z1$&A3@SO<]CV+[_$K=& -M&(,$`)@!``"8`0```@```$4``91MHP``0!$``,"H`0'`J`$"`?0!]`&`!V6- -MLUJS#6,"U```````````(2`B"`````````%X(@``>````'0!`0,,`P``#`$` -M``R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@`` -M`@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```( -M!````@````@$```.*```B``"```D".JBH(;#I9-O'0;7`;5$=0F-UVD\_C#` -M9JT&2C>!Y'AWOW\6+WT>MC*COM&C(5#\:70^F7PQ6W,N14$%8O*XLKC_S^#4 -ME*: -MM"?L#26:9O`/8/6%U2D``"3IXO_N(::FP(?F;WNDQ!#QNH,N2\M_L^ZBY(<3 -M&H!K,"D``!P``$`$^.-O2-_XS_4TJN@P2$SAKS5N[>0````<``!`!5WV`7K+ -M#F:;!ND1!H4X,[W/8]B^`!.W1G./`@"8`0``F`$```(```!%``&4;:\``$`1 -M``#`J`$!P*@!`@'T`?0!@`=E<,;E<@I`PY$``````````"$@(@@````````! -M>"(``'@```!T`0$$#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``KE.S+T!E -MT$XPJDQ8%I+9-WX:K=F.I[(]HD1;4D0338Q6`N4.J',?F51/Y^JR]#(EEEPT -M"`H(WA6.$E+;!"I>L?967.DMU,SMB/K)C(0KL&,<&#R+$XOEQ[5.:=W.Y%]L -M_)@2Z`5S=D;9`.P(W,`41(#AD"CEVA?%P`/^9]Z@-D(I```D5^M-J^J.AL,8 -M0S4;P%S_D)3)%&AF,B6F$(:MSM"TM!4I```<``!`!*J-`;ZT>/@Y("4WQPM_ -MBUJFJKZ&````'```0`6&P,GE9\M:I!SOD$]@UKWJ)?>1?``3MT:.NP4`F`$` -M`)@!```"````10`!E&VR``!`$0``P*@!`<"H`0(!]`'T`8`'97#&Y7(*0,.1 -M```````````A("((`````````7@B``!X````=`$!!`P#```,`0``#(`.`(`# -M```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(` -M``$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"```` -M"`0```XH``"(``(``*Y3LR]`9=!.,*I,6!:2V3=^&JW9CJ>R/:)$6U)$$TV, -M5@+E#JAS'YE43^?JLO0R)99<-`@*"-X5CA)2VP0J7K'V5ESI+=3,[8CZR8R$ -M*[!C'!@\BQ.+Y<>U3FG=SN1?;/R8$N@%H#9"*0``)%?K3:OJCH;#&$,U&\!<_Y"4R11H9C(EIA"&K<[0M+05*0`` -M'```0`2JC0&^M'CX.2`E-\<+?XM:IJJ^A@```!P``$`%AL#)Y6?+6J0<[Y!/ -M8-:]ZB7WD7P`$[=&)_T+`)@!``"8`0```@```$4``91MN@``0!$``,"H`0'` -MJ`$"`?0!]`&`!V5PQN5R"D##D0``````````(2`B"`````````%X(@``>``` -M`'0!`00,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"``"N4[,O0&703C"J3%@6 -MDMDW?AJMV8ZGLCVB1%M21!--C%8"Y0ZH%8X2 -M4ML$*EZQ]E95GRUJD'.^03V#6O>HE]Y%\`1.W1I`*"@"8`0``F`$```(` -M``!%``&4;=(``$`1``#`J`$!P*@!`@'T`?0!@`=EU/ZI.@R5L*8````````` -M`"$@(@@````````!>"(``'@```!T`0$'#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``,QD2V%";MNAT&[1:5D=4PSHQ^(S6*4;5\E4A!/A#FL,RULW&C\55 -ME'1TYP9%3G@Z\3(0(Q/H!4]1RUD(*-O[G8K'\/E;G,>UFWLZB7YN2YV7D6W: -M2^8UQ!>8M(Z.),>Z%2>)($QJ(I -M```D)@&:^5/>6:KPNVON1\"/5)99'FFR.*/(&ADWZKX"F_,I```<``!`!%@) -MQ4@>N=7QU%P.8A7>>+YF=V43````'```0`5SV-9#'I7!WZ*0,+2M`X"#:+E! -MZP$3MT9\-0T`F`$``)@!```"````10`!E&W4``!`$0``P*@!`<"H`0(!]`'T -M`8`'9=3^J3H,E;"F```````````A("((`````````7@B``!X````=`$!!PP# -M```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,` -M``@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P`` -M!0,```@$```"````"`0```XH``"(``(``#,9$MA0F[;H=!NT6E9'5,,Z,?B, -MUBE&U?)5(03X0YK#,M;-QH_%591T=.<&14YX.O$R$",3Z`5/4L"$[=&&C4$`)@!``"8`0```@```$4``91M -MU0``0!$``,"H`0'`J`$"`?0!]`&`!V74_JDZ#)6PI@``````````(2`B"``` -M``````%X(@``>````'0!`0<,`P``#`$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"```S -M&1+84)NVZ'0;M%I61U3#.C'XC-8I1M7R52$$^$.:PS+6S<:/Q564='3G!D5. -M>#KQ,A`C$^@%3U'+60@HV_N=BL?P^5NSJ)?FY+G9>1;=I+YC7$%YBT -MCHXDQ[IR\-V\AH[,ATZ5?YKG!!N;G+/*3]+OL4#5X5)XD@3&HBD``"0F`9KY -M4]Y9JO"[:^Y'P(]4EED>:;(XH\@:&3?JO@*;\RD``!P``$`$6`G%2!ZYU?'4 -M7`YB%=YXOF9W91,````<``!`!7/8UD,>E<'?HI`PM*T#@(-HN4'K`Q.W1B<_ -M`@"8`0``F`$```(```!%``&4;=8``$`1``#`J`$!P*@!`@'T`?0!@`=E,L]8 -M>P:U&5T``````````"$@(@@````````!>"(``'@```!T`0$(#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``19G`*8.P02*/=D44`.$/6/AF%7Q%5U5^8?\[ -MRPB1Q.\K0;"S4-L-()``1%S\="8))T;T;9FJY_,2IS.X)`7NW`>O5-+X6WMA -MLHH.O#!!A`Z[.]>S=:W4%\2O\T$1L\;;>K5BINBTP@35;2*]7!@`M77M*LX^ -MW\JOII_O=Y=7M88I```D$\/;^1=KM`L]PH`1&[".4`C'-6,^Y*J8@-@UIO:- -MXY@I```<``!`!&DP==D,4`Y<^UO7127&QL]/OOY"````'```0`68&>^4E3?? -M_`4XD4V8GWD.0-&4E@,3MT8S;04`F`$``)@!```"````10`!E&W7``!`$0`` -MP*@!`<"H`0(!]`'T`8`'93+/6'L&M1E=```````````A("((`````````7@B -M``!X````=`$!"`P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`. -M`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P`` -M"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``$69P"F#L$$B -MCW9%%`#A#UCX9A5\15=5?F'_.\L(D<3O*T&PLU#;#2"0`$1<_'0F"2=&]&V9 -MJN?S$J75[6&*0``)!/#V_D7:[0+/<*` -M$1NPCE`(QS5C/N2JF(#8-:;VC>.8*0``'```0`1I,'79#%`.7/M;UT4EQL;/ -M3[[^0@```!P``$`%F!GOE)4WW_P%.)%-F)]Y#D#1E)8#$[=&VJX+`)@!``"8 -M`0```@```$4``91MV```0!$``,"H`0'`J`$"`?0!]`&`!V4RSUA[!K4970`` -M````````(2`B"`````````%X(@``>````'0!`0@,`P``#`$```R`#@"``P`` -M#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```! -M`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$ -M```.*```B``"``!%F<`I@[!!(H]V110`X0]8^&85?$5757YA_SO+")'$[RM! -ML+-0VPT@D`!$7/QT)@DG1O1MF:KG\Q*G,[@D!>[V&RB@Z\,$&$ -M#KL[U[-UK=07Q*_S01&SQMMZM6*FZ+3"!-5M(KU<&`"U=>TJSC[?RJ^FG^]W -MEU>UABD``"03P]OY%VNT"SW"@!$;L(Y0",0Y`T926!!.W1B&["0"8`0``F`$```(```!%``&4;=D``$`1``#`J`$!P*@! -M`@'T`?0!@`=EUP.6OR<961X``````````"$@(@@````````!>"(``'@```!T -M`0$)#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``*)XO)L*V!41FI$N*;S6! -MP^*,'EARRTD_B3^UB?("HZ!/FRIT;@LA<"8T&;=[@QGESU,6,V@>MMH?/W^\ -M9E9SHQ-SEM)];^'7Q;1?VY'O3S\'EO3KP&04TSG]W8[:"5'LM3$(X;>]2!>, -MPEDH@:4;:MLF(&CQ0X&Q -M_7S?#<6YB&R2IL'EU```````````A -M("((`````````7@B``!X````=`$!"0P#```,`0``#(`.`(`#```,`0``#(`. -M`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@`` -M!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"( -M``(``"B>+R;"M@5$9J1+BF\U@X,9Y<]3%C-H'K;:'S]_O&96!C1(E`!`% -M$[=&HN8#`)@!``"8`0```@```$4``91MVP``0!$``,"H`0'`J`$"`?0!]`&` -M!V77`Y:_)QE9'@``````````(2`B"`````````%X(@``>````'0!`0D,`P`` -M#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"```HGB\FPK8%1&:D2XIO-8'#XHP>6'++ -M23^)/[6)\@*CH$^;*G1N"R%P)C09MWN#&>7/4Q8S:!ZVVA\_?[QF5G.C$W.6 -MTGUOX=?%M%_;D>]//P>6].O`9!33.?W=CMH)4>RU,0CAM[U(%XS"62B!I1MJ -MVR8@:/%!R=(!F?3<&5H(4BD``"2V7;GQ->CB4DW5JX_!V:Q[@;']?-\-Q;F( -M;)*FP>75RBD``!P``$`$2_RH.H/W\L_ZQH3IE0C!-SO.1=,````<``!`!3?< -M+.)0"NKAC"@D1&,W@8T2)0`0!A.W1O#R`0"8`0``F`$```(```!%``&4;=T` -M`$`1``#`J`$!P*@!`@'T`?0!@`=E]'M'"(``'@```!T`0'_#`,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``PKQY -M,'?U=TP+C:3T8[7^3\3BXT7\3W,G/KH#OI.T!^#-Z.6\1?S\V]S5V!`0<3S& -M1>TQH(@D"NLS6^#JE'T+RN[T]@"'Y6(7F&:B[EX\1,-.V1)%'N"U\MBZOMD/ -M)BGM".S"([JM-<@1T.M#]FRGU_D\I7;0LX=8A[M;#RT@\&\I```D4V.F(14^ -MIH*U2_@Q!L66$VN@SEI5D"'")T6A_3L?^T``!`$0``P*@!`<"H`0(!]`'T`8`'9?1[1W.% -M=T81```````````A("((`````````7@B``!X````=`$!_PP#```,`0``#(`. -M`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P`` -M"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```" -M````"`0```XH``"(``(``,*\>3!W]7=,"XVD]&.U_D_$XN-%_$]S)SZZ`[Z3 -MM`?@S>CEO$7\_-O/$3#3MD211[@M?+8NK[9#R8I[0CLPB.ZK37($=#K0_9LI]?Y/*5VT+.' -M6(>[6P\M(/!O*0``)%-CIB$5/J:"M4OX,0;%EA-KH,Y:59`APB=%H?T['_M' -M*0``'```0`1FC5R=#L5P,EL(DT`P)Q/>F><[I````!P``$`%]9VEI^5@_^CS -M#H`9,J28@)]*_I,&$[=&!&$+`)@!``"8`0```@```$4``91MWP``0!$``,"H -M`0'`J`$"`?0!]`&`!V7T>T=SA7=&$0``````````(2`B"`````````%X(@`` -M>````'0!`?\,`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"``#"O'DP=_5W3`N- -MI/1CM?Y/Q.+C1?Q/89J+N7CQ$PT[9$D4>X+7RV+J^V0\F*>T([,(C -MNJTUR!'0ZT/V;*?7^3RE=M"SAUB'NUL/+2#P;RD``"138Z8A%3ZF@K5+^#$& -MQ983:Z#.6E60(<(G1:'].Q_[1RD``!P``$`$9HU$``$`1``#`J`$!P*@!`@'T`?0!@`=E2?2_U@V5\\P````` -M`````"$@(@@````````!>"(``'@```!T`0&`#`,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``;[@[K8JU)R*%;>TR.^M5>-.&N#G3/W!JO2B5^;N.O<"WUNE( -M6E3?^AEBV!V+>;._!YI.!C0)WQ[;[J8ZS-X';04:5(D,*[7GNRE7-P8,DP\9 -MN4V\5`"_X>9MJ+8O5QZX3&Y5[+\@=Q]P]X4HS.K#< -MYK4I```DL@DR@(!!3E7LO'%!W&L!H<\]P)S`^QU!92^]6KJ`$]LI```<``!` -M!!!O[YM@)IT\@_X,;/$)C?>6_"4V````'```0`7K6J-W-H?8+GX_`I>[E=J$ -M:.UH9`<3MT81F0P`F`$``)@!```"````10`!E&WB``!`$0``P*@!`<"H`0(! -M]`'T`8`'94GTO]8-E?/,```````````A("((`````````7@B``!X````=`$! -M@`P#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0`` -M`P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```( -M`P``!0,```@$```"````"`0```XH``"(``(``&^X.ZV*M2:3@8T"=\>V^ZF.LS> -M!VT%&E2)#"NUY[LI5S<&#),/&;E-O%0`O^'F;:BV+U<>N$QN5>R_('%*,SJPW.:U*0``)+(),H"`04Y5[+QQ0=QK`:'//<"< -MP/L=064OO5JZ@!/;*0``'```0`00;^^;8":=/(/^#&SQ"8WWEOPE-@```!P` -M`$`%ZUJC=S:'V"Y^/P*7NY7:A&CM:&0($[=&7Y@#`)@!``"8`0```@```$4` -M`91MXP``0!$``,"H`0'`J`$"`?0!]`&`!V5)]+_6#97SS```````````(2`B -M"`````````%X(@``>````'0!`8`,`P``#`$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M``!ON#NMBK4G(H5M[3([ZU5XTX:X.=,_<&J]*)7YNXZ]P+?6Z4A:5-_Z&6+8 -M'8MYL[\'FDX&-`G?'MONICK,W@=M!1I4B0PKM>>[*5R\<4'<:P&ASSW`G,#['4%E+[U:NH`3VRD``!P``$`$$&_OFV`F -MG3R#_@QL\0F-]Y;\)38````<``!`!>M:HW0``$`1``#`J`$!P*@!`@'T`?0!@`=E -M-E(9L,5Z3PH``````````"$@(@@````````!>"(``'@```!T`0$```,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``PO+>&5=;:_M>XYHE,IOYW\.:[I6CD%A` -M-,>_6[,68^?0D@Q2=RI:5=-SBD6N'>I_1$$331VV[X8,-&PNO_V^910@ZDGU -M.@`N[DETLQAHA\Q)UL4?V'R:937AHV#4F#\((#1(2I+1JFNC,.+9RG./@O\K -M68=G05:^?,MBO5Y?9C(I```D]`D4.\VF&2NYKP@Y3!\*'2?*6?_X%PS9K@F3 -MGR@`:T@I```<``!`!)/8O?2J^!SG':A6YPS22&E0BW2G````'```0`4E:MA" -M)!P-@"E07,R0KL=80K[J90D3MT;/T`0`F`$``)@!```"````10`!E&WE``!` -M$0``P*@!`<"H`0(!]`'T`8`'9392&;#%>D\*```````````A("((```````` -M`7@B``!X````=`$!```#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0`` -M#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```" -M`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``,+RWAE7 -M6VO[7N.:)3*;^=_#FNZ5HY!80#3'OUNS%F/GT)(,4G7V8R*0``)/0)%#O-IADK -MN:\(.4P?"ATGREG_^!<,V:X)DY\H`&M(*0``'```0`23V+WTJO@````'0!`0```P``#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"``#"\MX95UMK^U[CFB4RF_G?PYKNE:.06$`TQ[];LQ9C -MY]"2#%)W*EI5TW.*1:X=ZG]$01--';;OA@PT;"Z__;YE%"#J2?4Z`"[N272S -M&&B'S$G6Q1_8?)IE->&C8-28/P@@-$A*DM&J:Z,PXMG*"0"8`0``F`$```(```!%``&4;><``$`1``#`J`$! -MP*@!`@'T`?0!@`=EIQA;?"*9C38``````````"$@(@@````````!>"(``'@` -M``!T`0$``0,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``IETU:R=5%E&(&5ZK -M,@&U054"H!4\(P6-S9JTC0WY6)!&Z^=V`"(X<;?BAPZFBT`*MEX3R5`HU-SY -MLD[!Q:F#;KRBG@9#*0L[G[JB)2^FOSS=H;_P#,(E"5PTO1"`SAZ/^JB7>!C$ -M_/[R/W2;T<0JZHY\`B/*.<)%YI!J/PQUD?HI```DQEKK8%T9?JN?/?E3JI7T -M9#7PS(U<;PPG9H$A"`;\D@DI```<``!`!"IQ@=Q#G_PA^PT2WVV -M````'```0`7\OD4@0GS>JAI/2*)@P("P9Z490@H3MT;82@P`F`$``)@!```" -M````10`!E&WH``!`$0``P*@!`<"H`0(!]`'T`8`'9:<86WPBF8TV```````` -M```A("((`````````7@B``!X````=`$!``$#```,`0``#(`.`(`#```,`0`` -M#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```( -M`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH -M``"(``(``*9=-6LG5191B!E>JS(!M4%5`J`5/",%C$\E0*-3<^;).P<6I@VZ\HIX&0RD+.Y^ZHB4OIK\\W:&_ -M\`S")0E<-+T0@,X>C_JHEW@8Q/S^\C]TF]'$*NJ.?`(CRCG"1>:0:C\,=9'Z -M*0``),9:ZV!=&7ZKGSWY4ZJ5]&0U\,R-7&\,)V:!(0@&_)()*0``'```0`0J -M<8'<0YW+K2R+TH7O\(?L-$M]M@```!P``$`%_+Y%($)\WJH:3TBB8,"`L&>E -M&4(+$[=&+$H#`)@!``"8`0```@```$4``91MZ0``0!$``,"H`0'`J`$"`?0! -M]`&`!V6G&%M\(IF--@``````````(2`B"`````````%X(@``>````'0!`0`! -M`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``"F735K)U4648@97JLR`;5!50*@ -M%3PC!8W-FK2-#?E8D$;KYW8`(CAQM^*'#J:+0`JV7A/)4"C4W/FR3L'%J8-N -MO**>!D,I"SN?NJ(E+Z:_/-VAO_`,PB4)7#2]$(#.'H_ZJ)=X&,3\_O(_=)O1 -MQ"KJCGP"(\HYPD7FD&H_#'61^BD``"3&6NM@71E^JY\]^5.JE?1D-?#,C5QO -M#"=F@2$(!OR2"2D``!P``$`$*G&!W$.=RZTLB]*%[_"'[#1+?;8````<``!` -M!?R^12!"?-ZJ&D](HF#`@+!GI1E"#!.W1O5P`0"8`0``F`$```(```!%``&4 -M;?D``$`1``#`J`$!P*@!`@'T`?0!@`=E5+`_?1Y7]@<``````````"$@(@@` -M```````!>"(``'@```!T`0$``@,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M7ADG[1C.[F)/=_31JFJ\/H$J&<_()*ZZZSX%M%L*D -M8GJ9KK=DZA````'```0`7MI9=P31W,PPD":TN5_8'```````````A("((`````````7@B``!X````=`$!``(#```,`0`` -M#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```" -M`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$ -M```"````"`0```XH``"(``(``%X9'+U+A_\'S`K)C8R53=7I^T8SNYB3W?TT -M:IJO#Z!*AG/R"2NNNL^!;1;"I&)ZF7,*E4C^4"'1XG4780^. -M4/BX*%,55\+P6+PM*A)<&"Z[U40WRPI#52?1,AX/TO$KOJ';A\Q5G#KZ0=W+ -MD:"30A8==>V#AF=/*0``)#Z./Y*9$D`>9I(Z=CM9HPPXK7W\.$]B)Q12.L43 -M?/\X*0``'```0`2MM`O`I\!I)R'JW)Q0YN,'JW9.H0```!P``$`%[:67<$T= -MS,,)`FM+G)0#S:A^#><,$[=&5.L*`)@!``"8`0```@```$4``91M^P``0!$` -M`,"H`0'`J`$"`?0!]`&`!V54L#]]'E?V!P``````````(2`B"`````````%X -M(@``>````'0!`0`"`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"``!>&1R]2X?_ -M!\P*R8V,E4W5Z?M&,[N8D]W]-&J:KP^@2H9S\@DKKKK/@6T6PJ1B>IES',#H -MI?8'37X'BI5(_E`AT>)U%V$/CE#XN"A3%5?"\%B\+2H27!@NN]5$-\L*0U4G -MT3(>#]+Q*[ZAVX?,59PZ^D'=RY&@DT(6'77M@X9G3RD``"0^CC^2F1)`'F:2 -M.G8[6:,,.*U]_#A/8B<44CK%$WS_."D``!P``$`$K;0+P*?`:2VEEW!-'"(``'@```!T`0$``P,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``[1A!I#VT0WJ.(AC,A(?);>UCK\18.R=^Q':[.FOY/`VU -M9&W6F[RW=N<&%,X+2S(:B`8:L4@?P-DL`"J4JDJHDI```< -M``!`!-C&F),2()U#(%$1H^J-G:`^:+T=````'```0`4:`.`$<,\<0LQG`*!! -M3)V:YW*=8PT3MT:H(PP`F`$``)@!```"````10`!E&W^``!`$0``P*@!`<"H -M`0(!]`'T`8`'9;?L+E3M-.QX```````````A("((`````````7@B``!X```` -M=`$!``,#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```( -M`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$# -M```(`P``!0,```@$```"````"`0```XH``"(``(``.T80:0]M$-ZCB(8S(2' -MR6WM8Z_$6#LG?L1VNSIK^3P-M61MUIN\MW;G!A3."TLR&H@&&K'*2%.F'TMR -M1;Z5B@`4-D9(N8.;?OI.];V-"FN,3Y]Y[[?+IO6\^/SVEME980,LVFTP,6=R -M?`02M,VS1DEDM`Z&2@L%00[`58O\-6QC*0``)*^QN?H[ZA/Z=56K%SH%IY4P -MZ"S'E('\#9+``JE*I*J)*0``'```0`38QIB3$B"=0R!1$:/JC9V@/FB]'0`` -M`!P``$`%&@#@!'#/'$+,9P"@04R=FN=RG6,.$[=&'2,#`)@!``"8`0```@`` -M`$4``91M_P``0!$``,"H`0'`J`$"`?0!]`&`!V6W["Y4[33L>``````````` -M(2`B"`````````%X(@``>````'0!`0`#`P``#`$```R`#@"``P``#`$```R` -M#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(` -M``0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*``` -MB``"``#M&$&D/;1#>HXB&,R$A\EM[6.OQ%@[)W[$=KLZ:_D\#;5D;=:;O+=V -MYP84S@M+,AJ(!AJQRDA3IA]+>^W -MRZ;UO/C\]I;966$#+-IM,#%G5,.@LQY2!_`V2P`*I2J2JB2D``!P``$`$V,:8 -MDQ(@G4,@41&CZHV=H#YHO1T````<``!`!1H`X`1PSQQ"S&<`H$%,G9KG"(``'@```!T`0$`!`,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``M?0=8#=^N_&@SUW4&[O_U1H98`+VB-5YR/:@;L%7P(%13 -M,;6/!OGU@Y;Z*/$2J;XN,*G#JB5$%#0A%4YWU?*HSU'S(Y;W+@'38#STBJKI -M]@VX#U*?:D\/(BQR%/V6-P$I```D$#V;=.37/]<1"UA/J>6+-BYR_J-Z*K@# -M9ZY$3,1>Z5?7+SO\$#ZJ<;!-6,='#K.V0 -MS'J&6`"]HC5>BJX`W*D$'5AHSZ-$"5I`./````'0!`0`$`P``#`$```R` -M#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,` -M``@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!``` -M`@````@$```.*```B``"``"U]!U@-WZ[\:#/7=0;N__5%S>4S5&GF>N1$S$7 -MNE7UR\[_!`^JG&P35C'1PZSMD,QZAE@`O:(U7G(]J!NP5?`@5%,QM8\&^?6# -MEOHH\1*IOBXPJ<.J)404-"$53G?5\JC/4?,CEO -M:BD``!P``$`$MC_KY`"U;!6ZN#"#(6]]BN@;3F`````<``!`!7)&,7RD'A!U -M8:,^C1`E:0#CW-.U$!.W1C6I"`"8`0``F`$```(```!%``&4;@,``$`1``#` -MJ`$!P*@!`@'T`?0!@`=E-#H<@XJQTFT``````````"$@(@@````````!>"(` -M`'@```!T`0$`!P,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``?3A<+&Y<@^P7 -M4O52O:5\D7[3#DZ#*N`LQ-']C&[\(#N&41#6ZD6!KB/Z2=EMG7R!BZQY^Y,G -MV:)^?A!\<*D/U1WAY9$7<:UB^N.BIPI'*L+<2"W5&,^B)Z"10/C%MEHK=XMX -M#_54JBVY]PT@-J+&O43S75"^LEH*-9]P)D^,/X0I```D1)A`M#.3C(BS1:.R -M6.E03*`@[N?>XH()`?N3)]FB?GX0?'"I#]4=X>61%W&M8OKCHJ<*1RK" -MW$@MU1C/HB>@D4#XQ;9:*W>+>`_U5*HMN?<-(#:BQKU$\UU0OK):"C6?<"9/ -MC#^$*0``)$280+0SDXR(LT6CLECI4$R@(.[GWN*""0'+P````'0! -M`0`'`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$` -M``,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P`` -M"`,```4#```(!````@````@$```.*```B``"``!].%PL;ER#[!=2]5*]I7R1 -M?M,.3H,JX"S$T?V,;OP@.X91$-;J18&N(_I)V6V=?(&+K'G[DR?9HGY^$'QP -MJ0_5'>'ED1=QK6+ZXZ*G"D"(``'@```!T`0$`"`,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``P;T:]E$02XCYO*\TJ#WE&8093XO1J0_ND:R2K,D!DT,GD;1?Y4#.WLNN4';(F1/[WU -M&U)U8]LA$BI,+=(+5MNS.HUK.TKJ,C%]U(?%T'5QS#AO5M\@6UFWD\@I```D -MV3?/+A!;$XB3D[`0<;R];TWN?I>=^$UT>PX!GC?LS/,I```<``!`!.Q@X2Q? -M#$)"JR$VH[/Z9YPD\'M+````'```0`6?HW'WT>LRIA6-U4,Z%W^P6OU'BO-*@]Y1F$&4^+T:D/[I&LDJS)`9 -M-#)Y&T7^5`SM[+KE!VR)D3^]]1M2=6/;(1(J3"W2"U;;LSJ-:SM*ZC(Q?=2' -MQ=!U<<)/![2P```!P``$`%GZ-Q -MW,\SKFQ)Q2=-^DH=/[&4SE42$[=&TTX*`)@!``"8`0```@```$4``91N"``` -M0!$``,"H`0'`J`$"`?0!]`&`!V7!>^1G'7##[P``````````(2`B"``````` -M``%X(@``>````'0!`0`(`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$` -M``R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P`` -M`@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``#!O1KV -M41!+B/F]R9VS!T[CL@N*"BJ]2]:U*XVJJ#:WM]'K,J85C=5#.A=_L%K]1XKS -M2H/>49A!E/B]&I#^Z1K)*LR0&30R>1M%_E0,[>RZY0=LB9$_O?4;4G5CVR$2 -M*DPMT@M6V[,ZC6L[2NHR,7W4A\70=7',.&]6WR!;6;>3R"D``"39-\\N$%L3 -MB).3L!!QO+UO3>Y^EYWX371[#@&>-^S,\RD``!P``$`$[&#A+%\,0D*K(3:C -ML_IGG"3P>TL````<``!`!9^C<=S/,ZYL2<4G3?I*'3^QE,Y5$Q.W1J-="`"8 -M`0``F`$```(```!%``&4;AL``$`1``#`J`$!P*@!`@'T`?0!@`=E]9S48[ZQ -M`F@``````````"$@(@@````````!>"(``'@```!T`0$`"0,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``K38\*#:U.?#>RWA>I/G!X$\\Q,GVKAM$/3.^=CP_ -M#\!F@LL4!V`E?5I+HC75",`6*&V\ET43Y0Y3G+AS.)N'H@0'#-+8/$/!9MAZ -MV-$XZ.@SZ0B*:MT@B[L:]AVL@T,;0<#);_JI7/0Y@DRTF<7#H`YX;0*AN=9&QQE*?THI -M```<``!`!)FEB];52EC/^_90RA6`1D\G1.?6````'```0`50F#,7&P0-BG1^ -MXHAK,4+WQB@@HQ,3MT:.APL`F`$``)@!```"````10`!E&X=``!`$0``P*@! -M`<"H`0(!]`'T`8`'9?6!//,3)]JX;1#TSOG8\/P_`9H++%`=@)7U:2Z(UU0C`%BAMO)=%$^4. -M4YRXMC1..CH,^D(BFK=((N[&O8=K(-#&T'`R6_Z -MJ5ST.8),M)G%PZ`.>&T'-B:"HY&B:UL[P%9C*0``)#W-$Y:C@;"T8'X9K"=0 -M0)H8)2JN).'BH;G61L<92G]**0``'```0`29I8O6U4I8S_OV4,H5@$9/)T3G -MU@```!P``$`%4)@S%QL$#8IT?N*(:S%"]\8H(*,4$[=&L88"`)@!``"8`0`` -M`@```$4``91N(0``0!$``,"H`0'`J`$"`?0!]`&`!V7UG-1COK$":``````` -M````(2`B"`````````%X(@``>````'0!`0`)`P``#`$```R`#@"``P``#`$` -M``R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P`` -M"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```. -M*```B``"``"M-CPH-K4Y\-[+>%ZD^<'@3SS$R?:N&T0],[YV/#\/P&:"RQ0' -M8"5]6DNB-=4(P!8H;;R711/E#E.B!`<,TM@\0\%FV'K8T3CHZ#/I -M"(IJW2"+NQKV':R#0QM!P,EO^JE<]#F"3+29Q<.@#GAM!S8F@J.1HFM;.\!6 -M8RD``"0]S1.6HX&PM&!^&:PG4$":&"4JKB3AXJ&YUD;'&4I_2BD``!P``$`$ -MF:6+UM5*6,_[]E#*%8!&3R=$Y]8````<``!`!5"8,Q<;!`V*='[BB&LQ0O?& -M*""C%1.W1N20``"8`0``F`$```(```!%``&4;B(``$`1``#`J`$!P*@!`@'T -M`?0!@`=E$[X*D(`5^*8``````````"$@(@@````````!>"(``'@```!T`0$` -M`P,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``5L`!?-6\?'O/$VLP&9@`V0LY -M*$>RNBZ=1J01.2_F%%B2MZ5F9[H*'O/)G#]IU7VW>CL^$?Z2;I&1_L!4I$-! -M'^A*Z-S+2I/#=O0^>_!L+Y*RJNLIEE;8=C\;WK57-R]"._)*P*RV'LF8 -M$^$;R8&]GGO,@I4I```<``!`!">R3$-$PXRPJ4P'MWDD%*7WK[AI````'``` -M0`4[*6*Q20+0UC.Z7;$H+C-,I#RDP143MT8@OP,`F`$``)@!```"````10`! -ME&XG``!`$0``P*@!`<"H`0(!]`'T`8`'91.^"I"`%?BF```````````A("(( -M`````````7@B``!X````=`$!``,#```,`0``#(`.`(`#```,`0``#(`.`0`# -M```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,` -M``@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(` -M`%;``7S5O'Q[SQ-K,!F8`-D+.2A'LKHNG4:D$3DOYA18DK>E9F>Z"A[SR9P_ -M:=5]MWH[/A'^DFZ1D?[`5*1#01_H2NC_Y/#@=AX,0\@@Z5L!MW6A(A.P0F@??9)*0``)+B" -M&[=Q:9$^&:+.46MWBL"LMA[)F!/A&\F!O9Y[S(*5*0``'```0`0GLDQ#1,., -ML*E,![=Y)!2E]Z^X:0```!P``$`%.REBL4D"T-8SNEVQ*"XS3*0\I,$5$[=& -MH@`*`)@!``"8`0```@```$4``91N+```0!$``,"H`0'`J`$"`?0!]`&`!V43 -MO@J0@!7XI@``````````(2`B"`````````%X(@``>````'0!`0`#`P``#`$` -M``R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@`` -M`@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```( -M!````@````@$```.*```B``"``!6P`%\U;Q\>\\3:S`9F`#9"SDH1[*Z+IU& -MI!$Y+^846)*WI69GN@H>\\FM5#$/((.E -M;`;=UH2(3L$)H'WV22D``"2X@ANW<6F1/AFBSE%K=XK`K+8>R9@3X1O)@;V> -M>\R"E2D``!P``$`$)[),0T3#C+"I3`>W>204I?>ON&D````<``!`!3LI8K%) -M`M#6,[I=L2@N,TRD/*3!%A.W1DL."`"8`0``F`$```(```!%``&4;C0``$`1 -M``#`J`$!P*@!`@'T`?0!@`=EA/IUV/3)9MD``````````"$@(@@````````! -M>"(``'@```!T`0$`!`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``Q?H"?Z)6 -MZ='^!V?XLJ*S8*J/7.X&!9?A\SSH?R4=<5]XY*"#B:DAT7Q2G=_#?OS.2MP9 -ME=83>YGBS:`45D#0H^>13[N.(MA344X-*@D4MW>[`O#I##B5J6FM%0WM//T" -MWX!6`LV*8Y$.VI$(2.M(&`+Z5>9VXQYT'7Q_,4NM-?8I```D<(H]F6*.W3P^ -MIX>:J3)"I[SF]+>C0)':<$@O85;)!0XI```<``!`!*!0AYS2L"NIP\HFYR%! -M\-Y;0JZ,````'```0`5),<,^<2Q62/-H\FO.C`DQ<)8&6Q83MT8..0L`F`$` -M`)@!```"````10`!E&XV``!`$0``P*@!`<"H`0(!]`'T`8`'983Z==CTR6;9 -M```````````A("((`````````7@B``!X````=`$!``0#```,`0``#(`.`(`# -M```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(` -M``$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"```` -M"`0```XH``"(``(``,7Z`G^B5NG1_@=G^+*BLV"JCUSN!@67X?,\Z'\E'7%? -M>.2@@XFI(=%\4IW?PW[\SDK<&976$WN9XLV@%%9`T*/GD4^[CB+84U%.#2H) -M%+=WNP+PZ0PXE:EIK14-[3S]`M^`5@+-BF.1#MJ1"$CK2!@"^E7F=N,>=!U\ -M?S%+K37V*0``)'"*/9EBCMT\/J>'FJDR0J>\YO2WHT"1VG!(+V%6R04.*0`` -M'```0`2@4(>6T*NC````!P``$`%23'#/G$L5DCS:/)K -MSHP),7"6!EL7$[=&@3@"`)@!``"8`0```@```$4``91N.0``0!$``,"H`0'` -MJ`$"`?0!]`&`!V6$^G78],EFV0``````````(2`B"`````````%X(@``>``` -M`'0!`0`$`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"``#%^@)_HE;IT?X'9_BR -MHK-@JH]<[@8%E^'S/.A_)1UQ7WCDH(.)J2'1?%*=W\-^_,Y*W!F5UA-[F>+- -MH!160-"CYY%/NXXBV%-13@TJ"12W=[L"\.D,.)6I::T5#>T\_0+?@%8"S8IC -MD0[:D0A(ZT@8`OI5YG;C'G0=?'\Q2ZTU]BD``"1PBCV98H[=/#ZGAYJI,D*G -MO.;TMZ-`D=IP2"]A5LD%#BD``!P``$`$H%"'G-*P*ZG#RB;G(4'PWEM"KHP` -M```<``!`!4DQPSYQ+%9(\VCR:\Z,"3%PE@9;&!.W1E]&``"8`0``F`$```(` -M``!%``&4;D```$`1``#`J`$!P*@!`@'T`?0!@`=E%SR3M1:FP=8````````` -M`"$@(@@````````!>"(``'@```!T`0$`!0,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``<;QRVXK8.D\^K!>>ANF*_&`UC:%4&NQ5;+$Q]*7C;XD42M*>"!,4H76%&\Z4)#5N'A5!KL56RQ,?2G+A5=DCBHM0()B>E6:4 -MUK*XJ_I'2*=@6(*]/.KYD24"*0``)-PN-K87EXW,I/NXO=0B$T848?,F[\TD -M]>(X2JM6NS+G*0``'```0`1V+W[Q3>TS%T,+$C._&3\GRR)TY@```!P``$`% -M[W1TL:N)>4K$`8@.ITN@Y\1ZX_(8$[=&4K()`)@!``"8`0```@```$4``91N -M0@``0!$``,"H`0'`J`$"`?0!]`&`!V47/).U%J;!U@``````````(2`B"``` -M``````%X(@``>````'0!`0`%`P``#`$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``!Q -MO'+;BM@Z3SZL%YZ&Z8K\8#6-IRMUI\7R^5EFN2OA()EB2,)`MV8(2VX>U2CC -M9B#VRS7U9>'!4A7!('!*LV%UBN@ZGF^)%$K2G@@3%*%UA1O.E"0U;AX50:[% -M5LL3'TIRX579(XJ+4""8GI5FE-:RN*OZ1TBG8%B"O3SJ^9$E`BD``"3<+C:V -M%Y>-S*3[N+W4(A-&%&'S)N_-)/7B.$JK5KLRYRD``!P``$`$=B]^\4WM,Q=# -M"Q(SOQD_)\LB=.8````<``!`!>]T=+&KB7E*Q`&(#J=+H.?$>N/R&1.W1AN^ -M!P"8`0``F`$```(```!%``&4;D0``$`1``#`J`$!P*@!`@'T`?0!@`=E=-1L -M,,7"UTP``````````"$@(@@````````!>"(``'@```!T`0$`"`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``('68/\_DVDXUY[K1@C%4*A*U88B2-MFE8@>0 -M1KG2\`3,JT$I9V:,WE6975+Y[W6/_]&T]QL*-[ZOLZN?_WXVL3VQG;%E%AT- -M+DP0GH#^IH_CU!?:H695CMH)\LJ`0=99J*^-]%5!#P'QU$.6]H3*H,E?CL,I -MAC+A(-`YL2',-G\I```D#HV#>ZT8(Q5"H2M6&(DC;9I6('D$:YTO`$S*M!*6=FC-Y5F5U2^>]UC__1M/<; -M"C>^K[.KG_]^-K$]L9VQ918=#2Y,$)Z`_J:/X]07VJ%F58[:"?+*@$'66:BO -MC?1500\!\=1#EO:$RJ#)7X[#*88RX2#0.;$AS#9_*0``)`Z-@W.7P'>@Q\BY -MS09T$SG,/+UEE>=&\I@R)%TYL?%H*0``'```0`0E4-J73;;Z1UYJ;!T589IV -M%F248````!P``$`%I8^;Y_OR>11118[FJ`+W1X[.'````'0!`0`(`P``#`$```R`#@"``P`` -M#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```! -M`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$ -M```.*```B``"```@=9@_S^3:3C7GNM&",50J$K5AB)(VV:5B!Y!&N=+P!,RK -M02EG9HS>59E=4OGO=8__T;3W&PHWOJ^SJY__?C:Q/;&=L646'0TN3!">@/ZF -MC^/4%]JA9E6.V@GRRH!!UEFHKXWT54$/`?'40Y;VA,J@R5^.PRF&,N$@T#FQ -M(:FP=%6&:=A9DE&`````<``!`!:6/F^?[\GD4446.YJ@" -M]T>.SAW-&A.W1F,X#P"8`0``F`$```(```!%``&4;E$``$`1``#`J`$!P*@! -M`@'T`?0!@`=E^GC!EZ,+PI<``````````"$@(@@````````!>"(``'@```!T -M`0$`"0,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``/$7> -MEN?E%2*B926>='E=0_IJ7`6-[FTUA1[@QL4$9:O`D+8R9$=@M0.AN98K#TZT -MDV4]$3*8!O5?7B-V>^WJ@50U)QVOH)HVQZ(R+3VOCP06:+8)#`1,3.G7R/-@>JQL3MT:*(@,`F`$``)@!```"```` -M10`!E&Y3``!`$0``P*@!`<"H`0(!]`'T`8`'9?IXP9>C"\*7```````````A -M("((`````````7@B``!X````=`$!``D#```,`0``#(`.`(`#```,`0``#(`. -M`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@`` -M!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"( -M``(``#Q%W#Q7-Z8B/,42A]NGGI;GY14BHF4EGG1Y74/Z:EP%C>YM-84>X,;% -M!&6KP)"V,F1'8+4#H;F6*P].M)-E/1$RF`;U7UXC=GOMZH%4-2<=KZ":-L>B -M,BT]KX\$%FBV"0P$3$SIW(=T1N,MX0`D-GXX9*NKG=(NIM!:<14J`KIK*0`` -M)$9<0J=JVU%=6FAQ]!R-I>T+%!Z2A#XU((38V0C23VTE*0``'```0`0`#>6< -M!MQ8^[?*N'V%A;#/&Q)FQP```!P``$`%8ZX.SCQ51#N,RVBP9I7E\CS8'JL; -M$[=&&V0)`)@!``"8`0```@```$4``91N5```0!$``,"H`0'`J`$"`?0!]`&` -M!V7Z>,&7HPO"EP``````````(2`B"`````````%X(@``>````'0!`0`)`P`` -M#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"```\1=P\5S>F(CS%$H?;IYZ6Y^45(J)E -M)9YT>5U#^FI(W9[[>J!5#4G':^@FC;'HC(M/:^/!!9HM@D,!$Q,Z=R'=$;C+>$`)#9^ -M.&2KJYW2+J;06G$5*@*Z:RD``"1&7$*G:MM175IHDH0^-2"$ -MV-D(TD]M)2D``!P``$`$``WEG`;<6/NWRKA]A86PSQL29L<````<``!`!6.N -M#LX\540[C,MHL&:5Y?(\V!ZK'!.W1N-Q!P"8`0``F`$```(```!%``&4;ET` -M`$`1``#`J`$!P*@!`@'T`?0!@`=E>9I]X`\$$?$``````````"$@(@@````` -M```!>"(``'@```!T`0$`"@,```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``9&[Q -MX.?8-I=+.!(7H]*]QL'0='54!_7_W^$E/VY!%A[]Z?P35->9EAL]$>=^)P9C -ME[E*+30;*NL,!3.>I\:_O7%VN8[6#!R08$]E?9?0.O`GBQLEM[NP&]V\0SCI -MU3,E;$95;LQLB7=+$"6T1<6]X>B^$@J]HMX)+/[1^T)0ZN`I```D9HHT/6_; -M!8[%QL>PQQ&/-G.OTLY2A]&'DS^X8>OQ?VHI```<``!`!'0_'M]I&_G@;<@. -M,H258ML;*.7+````'```0`48W21+Q/^U@[DZZ5?M(GB-+>JQXAP3MT:=G`H` -MF`$``)@!```"````10`!E&Y>``!`$0``P*@!`<"H`0(!]`'T`8`'97F:?>`/ -M!!'Q```````````A("((`````````7@B``!X````=`$!``H#```,`0``#(`. -M`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P`` -M"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```" -M````"`0```XH``"(``(``&1N\>#GV#:72S@2%Z/2O<;!T'1U5`?U_]_A)3]N -M018>_>G\$U37F98;/1'G?B<&8Y>Y2BTT&RKK#`4SGJ?&O[UQ=KF.U@P[L!O=O$,XZ=4S)6Q&56[,;(EW2Q`EM$7%O>'HOA(*O:+> -M"2S^T?M"4.K@*0``)&:*-#UOVP6.Q<;'L,<1CS9SK]+.4H?1AY,_N&'K\7]J -M*0``'```0`1T/Q[?:1OYX&W(#C*$E6+;&RCERP```!P``$`%&-TD2\3_M8.Y -M.NE7[2)XC2WJL>(=$[=&W9L!`)@!``"8`0```@```$4``91N7P``0!$``,"H -M`0'`J`$"`?0!]`&`!V5YFGW@#P01\0``````````(2`B"`````````%X(@`` -M>````'0!`0`*`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"``!D;O'@Y]@VETLX -M$A>CTKW&P=!T=50']?_?X24_;D$6'OWI_!-4UYF6&ST1YWXG!F.7N4HM-!LJ -MZPP%,YZGQK^]<7:YCM8,')!@3V5]E]`Z\">+&R6WN[`;W;Q#..G5,R5L1E5N -MS&R)=TL0);1%Q;WAZ+X2"KVBW@DL_M'[0E#JX"D``"1FBC0];]L%CL7&Q[#' -M$8\V3/[AAZ_%_:BD``!P``$`$=#\>WVD;^>!MR`XRA)5BVQLH -MY(TMZK'B'1.W1@/K#@"8`0``F`$` -M``(```!%``&4;F```$`1``#`J`$!P*@!`@'T`?0!@`=EJHU7TT[0UCD````` -M`````"$@(@@````````!>"(``'@```!T`0$`"P,```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``,Z]!_!5BR]W3]]"9P)!(Q$V&'\V%Z+>.B@[WWCQ+.1T4,&6CPL3H!"\@.4/*:U;&`8"8 -MX4\I```D.,822%]O^Q$FS^FCG>S*]"HT4SHHR!/6Y_8@@@XSW$$I```<``!` -M!(,A5J%\RY1IE%_O:RH%CPJF#\)+````'```0`5FAD876WDORGD<3UDP>:R' -M6);O-!X3MT9[U`(`F`$``)@!```"````10`!E&YC``!`$0``P*@!`<"H`0(! -M]`'T`8`'9:J-5]-.T-8Y```````````A("((`````````7@B``!X````=`$! -M``L#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0`` -M`P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```( -M`P``!0,```@$```"````"`0```XH``"(``(``#.O0?P58LO=T_?0F<"02,1- -MAA_-A>BWCHH'-UE^-Z?>*[-96`XI&#`NF&[QLXFV+Z!42Z\G&MBAG:3/0@3C -MX*)C.EZG:72X;*7Q,R``BK+#/4MTTK96Q#:=$=T(L4@Z?-N@H/GN]]X\2SD= -M%#!EH\+$Z`0O(#E#RFM6Q@&`F.%/*0``)#C&$DA?;_L1)L_IHYWLRO0J-%,Z -M*,@3UN?V(((.,]Q!*0``'```0`2#(5:A?,N4:91?[VLJ!8\*I@_"2P```!P` -M`$`%9H9&%UMY+\IY'$]9,'FLAUB6[S0>$[=&"Q8)`)@!``"8`0```@```$4` -M`91N:P``0!$``,"H`0'`J`$"`?0!]`&`!V6JC5?33M#6.0``````````(2`B -M"`````````%X(@``>````'0!`0`+`P``#`$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M```SKT'\%6++W=/WT)G`D$C$388?S87HMXZ*!S=9?C>GWBNS65@.*1@P+IAN -M\;.)MB^@5$NO)QK8H9VDST($X^"B8SI>IVETN&RE\3,@`(JRPSU+=-*V5L0V -MG1'="+%(.GS;H*#Y[O?>/$LY'10P9:/"Q.@$+R`Y0\IK5L8!@)CA3RD``"0X -MQA)(7V_[$2;/Z:.=[,KT*C13.BC($];G]B""#C/<02D``!P``$`$@R%6H7S+ -ME&F47^]K*@6/"J8/PDL````<``!`!6:&1A=;>2_*>1Q/63!YK(=8EN\T'Q.W -M1B(B!P"8`0``F`$```(```!%``&4;G<``$`1``#`J`$!P*@!`@'T`?0!@`=E -M;11P('J$`"0``````````"$@(@@````````!>"(``'@```!T`0$`#0,```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``F>Z:XW*'%.W1H(V=/DZ`@0<-@0:U(C^6>/\FFPF3<(\1AFQW`SZ!?2_E'1%BI\8^IZHEY<1 -M$/"VO._)AS-0@FU#=O$I```DV4R'5VO#H3=EK=S:@NW0O%$K2$,8'M>0DL;[ -M-;B0")Y8I/4BJ[2P.[S818!%%.M+]0MP6"3$.GB(_EGC_)IL)DW"/$89 -ML=P,^@7TOY1T18J?&/J>J)>7$1#PMKSOR8@``0!$``,"H`0'`J`$"`?0!]`&`!V5M%'`@>H0` -M)```````````(2`B"`````````%X(@``>````'0!`0`-`P``#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"``"9[IKCUY"2QOLUN)`(ERD` -M`!P``$`$=B!O.6J!.7%5"#!&CFC/+F?;A7$````<``!`!5=7R*^%9(>2M2A@ -M.$S&7['^,("-(!.W1G6<#@"8`0``F`$```(```!%``&4;GL``$`1``#`J`$! -MP*@!`@'T`?0!@`=E#$\;H2=>V_8``````````"$@(@@````````!>"(``'@` -M``!T`0$`#@,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``Y@H0)YQ#>MMWQ^0P -M+**;?FJ%N*M+-OFV):*%71N(OR983M&D=_?AQ,A"([B#^./MY07R= -MFNC?"I>$S!LN/JF^C*BXR%MFTT)J/VL,KX9K>Y]OD6%ZSJ*I@V1O&U79=Q7` -M````'```0`605^V0^V1P`@/C>!IYQT4.TMU$]"$3MT8@A@(`F`$``)@!```" -M````10`!E&Y\``!`$0``P*@!`<"H`0(!]`'T`8`'90Q/&Z$G7MOV```````` -M```A("((`````````7@B``!X````=`$!``X#```,`0``#(`.`(`#```,`0`` -M#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```( -M`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH -M``"(``(``.8*$"><0WK;=\?D,"RBFWYJA;BK2S;YMB6BA5T7,]]FUGKB+\F6 -M$[1I'?WX<3(0B.X@_CC[>4%\G9KHWPJ7A,P;+CZIOHRHN,A;9M-":CW,+G4K -M=-F4$#1T))M",\&P>;%73R_/Z^39R>E"//BQ#YI3\7,'MK#*^&:WN?;Y%A>G -M*0``),JG$!=,IJNG/?^,HR")OJ8,Z;I;^HL`SU9L&0;ZFZCH*0``'```0`2K -MXDLI`)M3'LZBJ8-D;QM5V7<5P````!P``$`%D%?MD/MD<`(#XW@:><=%#M+= -M1/0A$[=&R<<(`)@!``"8`0```@```$4``91N?0``0!$``,"H`0'`J`$"`?0! -M]`&`!V4,3QNA)U[;]@``````````(2`B"`````````%X(@``>````'0!`0`. -M`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``#F"A`GG$-ZVW?'Y#`LHIM^:H6X -MJTLV^;8EHH5=%S/?9M9ZXB_)EA.T:1W]^'$R$(CN(/XX^WE!?)V:Z-\*EX3, -M&RX^J;Z,J+C(6V;30FH]S"YU*W39E!`T="2;0C/!L'FQ5T\OS^ODV"(``'@```!T`0$`#P,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M2XJ2[Z>G3%0,*(?^V.VK:X;K[LF\P8S2H -M(Y-&Q1='F91OK()HRE9P4#H.08844P"+T>[6;7-X417-C.AOW3KRTPC^[2$# -M\3\(I@@^50/\T/KS;*JJNB8\P+I;VHO2&1UYOT?Z52JQ9QU!&>LI```DR:L] -M#;#+8IXPG%L"%%"LMV,Z$@#G,53<_%"Z[3O4L@T167R(3MT8> -M``H`F`$``)@!```"````10`!E&Z)``!`$0``P*@!`<"H`0(!]`'T`8`'91#& -M1%'+\Y!1```````````A("((`````````7@B``!X````=`$!``\#```,`0`` -M#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```" -M`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$ -M```"````"`0```XH``"(``(``$N*DN^GITQ4#"B'_MCMJVG-_2>@K71XQ,@; -M+X7(0*ZRL8H[7N&Z^[)O,&,TJ".31L471YF4;ZR":,I6<%`Z#D&&%%,`B]'N -MUFUS>%$5S8SH;]TZ\M,(_NTA`_$_"*8(/E4#_-#Z\VRJJKHF/,"Z6]J+TAD= -M>;]'^E4JL6<=01GK*0``),FK/0VPRV*>,)Q;`A10K+=C.A(`YS%4W/Q0NNT[ -MU+('*0``'```0`1IM9T=H?C:J^`(:O&4"G2*N!*>+@```!P``$`%.&@NM1>V -MA\\.:*R/_S/CGWM$5E\C$[=&=/\``)@!``"8`0```@```$4``91NB@``0!$` -M`,"H`0'`J`$"`?0!]`&`!V40QD11R_.040``````````(2`B"`````````%X -M(@``>````'0!`0`/`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"``!+BI+OIZ=, -M5`PHA_[8[:MIS?TGH*UT>,3(&R^%R$"NLK&*.U[ANONR;S!C-*@CDT;%%T>9 -ME&^L@FC*5G!0.@Y!AA13`(O1[M9M[_D` -M`````````"$@(@@````````!>"(``'@```!T`0$`$`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``GZRXN(LB,Z!LE&PUXZL-=/)IM96*\@N,"P>:.6^[W>+M -M"^KDVT?R$`]NF<;O3%.X)<:OY$K1X!VFWD0BWYR_D8Z`^S4`*2H/,,BJ\7IT -M][88,[_L2WLKU)WQ[/WI750JO4M-C_I`CLU(%/36D]K5T.=KSR[-$5+,X6:% -MT/Y7<,@I```DA1_$)?Z\^8^<_/QP4T]S)K`$"5E1B,<5AA0FW*"&8H@I```< -M``!`!*[_`3KX6#Z_U?P -MH*Q$LB:1^203MT8-.`(`F`$``)@!```"````10`!E&Z2``!`$0``P*@!`<"H -M`0(!]`'T`8`'9:D!4YX2'N_Y```````````A("((`````````7@B``!X```` -M=`$!`!`#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```( -M`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$# -M```(`P``!0,```@$```"````"`0```XH``"(``(``)^LN+B+(C.@;)1L->.K -M#73R:;65BO(+C`L'FCEON]WB[0OJY-M'\A`/;IG&[TQ3N"7&K^1*T>`=IMY$ -M(M^V&#._[$M[*]2=\>S]Z5U4*KU+38_Z0([- -M2!3TUI/:U=#G:\\NS1%2S.%FA=#^5W#(*0``)(4?Q"7^O/F/G/S\<%-/$A[O^0`````````` -M(2`B"`````````%X(@``>````'0!`0`0`P``#`$```R`#@"``P``#`$```R` -M#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(` -M``0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*``` -MB``"``"?K+BXBR(SH&R4;#7CJPUT\FFUE8KR"XP+!YHY;[O=XNT+ZN3;1_(0 -M#VZ9QN],4[@EQJ_D2M'@':;>1"+?G+^1CH#[-0`I*@\PR*KQ>G3WMA@SO^Q+ -M>RO4G?'L_>E=5"J]2TV/^D".S4@4]-:3VM70YVO/+LT14LSA9H70_E=PR"D` -M`"2%'\0E_KSYCYS\_'!33W,FL`0)65&(QQ6&%";"(``'@```!T`0$`$P,` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``4\)NGR%:?#Y!_,/M:+N;ISH7XM\! -M9^!A#_MP*5YEUJP>!-:E;CW+,YA).4_*\.O!)1]QJR[N?R1;10H,GW7SNC]8 -MW>Z[12#^S:GF"CQ:Z=YA.1H9(G[15SP9S`4R>]\KM+,7V&P$D&'1K'\D6M7=)O4._D6Z_.Y%KV+<41:81"FK -MN9=:L'@36I6X]RS.823E/RO#K -MP24?<:LN[G\D6T4*#)]U\[H_6-WNNT4@_LVIY@H\6NG>83D:&2)^T5<\&8FFM -MH09+4_L`)XGG+P```!P``$`%:CV8;`ZA!DLRRE)BPUICB-`6H=(F$[=&0;$` -M`)@!``"8`0```@```$4``91NHP``0!$``,"H`0'`J`$"`?0!]`&`!V4BA/*U -M!U&#!```````````(2`B"`````````%X(@``>````'0!`0`3`P``#`$```R` -M#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,` -M``@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!``` -M`@````@$```.*```B``"``!3PFZ?(5I\/D'\P^UHNYNG.A?BWP%GX&$/^W`I -M7F76K!X$UJ5N/8*/%KIWF$Y&ADB?M%7/!G,!3)[WRNTLQ?8;`208=&L=R*\L_@[U[R1:U=T -MF]0[^1;K\[D6MRD``"2TI8#/`SMQQ(Y8'UH@D#9[8MQ1%IA$*:NYR40JJS2^ -M:2D``!P``$`$403'F)IG(F\7K:$&2U/[`">)YR\````<``!`!6H]F&P.H09+ -M,LI28L-:8XC0%J'2)A.W1IG]#0"8`0``F`$```(```!%``&4;J@``$`1``#` -MJ`$!P*@!`@'T`?0!@`=ERT^7%Q3Z*F0``````````"$@(@@````````!>"(` -M`'@```!T`0$`%`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``WR!-ADMSME%G -MF"/@J7QQW"?,EF?DZ-<@EGW:$P7!$N")F;LQK3S9Q_H*3-")7@KMJ\Y@.HND -MO:-)*NZT:TOI&/%G\L'['6/$=-I59C&Q;W_YMPOK:I"X"`>_!7-T+18\31F0 -M`PUF',4/:)ACTHE"J:QM#=5ZZW1O'!^JUX0&[6(I```DE?PZ>[6Z4F[@0)(: -M;ED#![+@W!@%R3@"P:NB&A\10W8I```<``!`!"Z.[`L]C4DLE41MLM&".?3* -M`.=K````'```0`7\.#QK^=]/$SB2.#(!IW\`XI)PKB<3MT;6Z0$`F`$``)@! -M```"````10`!E&ZK``!`$0``P*@!`<"H`0(!]`'T`8`'9RX-P8!````'0! -M`0`4`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$` -M``,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P`` -M"`,```4#```(!````@````@$```.*```B``"``#?($V&2W.V46>8(^"I?''< -M)\R69^3HUR"6?=H3!<$2X(F9NS&M/-G'^@I,T(E>"NVKSF`ZBZ2]HTDJ[K1K -M2^D8\6?RP?L=8\1TVE5F,;%O?_FW"^MJD+@(![\%"(``'@```!T`0$`%0,```P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``+7)?/#BE2*9W.[C?@50"47)U@:6=]U*>+!4LQR"COLT;!_&+!*I7Z%1P -MT^:$ZVQM\.)W#@C#>ZID@?&($-"YY@G>;)*GF"TJZWPI```D -M^OA*+R/H@0RZ1>_^T2"*S<"-8SP0*`:&"NDP>_(WJ8\I```<``!`!)1YL,J5 -MZBNVO,RN_E9PJ"E)D,;?````'```0`7#`S"OB!X?2^_\U(E.(,&D'OU6"R@3 -MMT;N8PD`F`$``)@!```"````10`!E&Z[``!`$0``P*@!`<"H`0(!]`'T`8`' -M981+@OKH]II2```````````A("((`````````7@B``!X````=`$!`!4#```, -M`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@" -M```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,` -M``@$```"````"`0```XH``"(``(``"UR7SPXI4BF=SNXWX%4`E%R=8&EG?=2 -MGBP5+,<@H[[-&P?QBP2J5^A4<-/FA.ML;?#B=PX(PWNJ9('QB!#0N>8)WFR2 -MIY@G+C;A^C*T+BO?49#G5[Y>;1V0J+I)K58N<*T9,N%Z`Z:YR,DH>_GS_-ET -M/W^FPN^15GM*NM\*0``)/KX2B\CZ($,ND7O_M$@BLW`C6,\$"@&A@KI -M,'OR-ZF/*0``'```0`24>;#*E>HKMKS,KOY6<*@I29#&WP```!P``$`%PP,P -MKX@>'TOO_-2)3B#!I![]5@LI$[=&$V,``)@!``"8`0```@```$4``91NO@`` -M0!$``,"H`0'`J`$"`?0!]`&`!V6$2X+ZZ/::4@``````````(2`B"``````` -M``%X(@``>````'0!`0`5`P``#`$```R`#@"``P``#`$```R`#@$``P``#`$` -M``R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P`` -M`@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"```M8)RXVX?HRM"XKWU&0YU>^7FT=D*BZ2:U6 -M+G"M&3+A>@.FNICRD``!P``$`$E'FPRI7J*[:\S*[^ -M5G"H*4F0QM\````<``!`!<,#,*^('A]+[_S4B4X@P:0>_58+*1.W1M>Q#0"8 -M`0``F`$```(```!%``&4;L0``$`1``#`J`$!P*@!`@'T`?0!@`=E+;JZ)+U% -M0(,``````````"$@(@@````````!>"(``'@```!T`0$`_P,```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``2LVHN)*GV=H,+QZ`N)[,)F`BJ+-!324E4<)_]++/ -M8+XWE[&M/HN(U=CG';6 -M7Q3#)WMDHH&#U,&N#0`EPPT!:)(55_:HF21`?%"*7GT71]^YV<4GE;)?2:V/ -M#N$+(!-^E.0G.C'^$6P4S2H3MT:,FP$`F`$``)@!```"````10`!E&[%``!`$0``P*@! -M`<"H`0(!]`'T`8`'92VZNB2]14"#```````````A("((`````````7@B``!X -M````=`$!`/\#```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`# -M```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,` -M``$#```(`P``!0,```@$```"````"`0```XH``"(``(``$K-J+B2I]G:#"\> -M@+B>S"9@(JBS04TE)5'"?_2RSV"^-Y7+2G&P-DYZ.9=3VQA5GU:\35,(_*4Y -M/%*F&!`.7#'NQK3Z+B-78YQVUE\4PR=[9**!@]3!K@T`)<,-`6B2%5?VJ)DD -M0'Q0BEY]%T??N=G%)Y6R7TFMCP[A"R')$"W1*0``)`F44"+[RO=>E'@3?I3D -M',XI;R.GUUA,HRR1$)(H??S&*0``'```0`1K)ZS?BFWIW,,9ND.^PU'T:2;M -M-0```!P``$`%;\(E[M)G[!ZPI^(?7CHQ_A%L%,TJ$[=&*=T'`)@!``"8`0`` -M`@```$4``91NR@``0!$``,"H`0'`J`$"`?0!]`&`!V4MNKHDO45`@P`````` -M````(2`B"`````````%X(@``>````'0!`0#_`P``#`$```R`#@"``P``#`$` -M``R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P`` -M"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```. -M*```B``"``!*S:BXDJ?9V@PO'H"XGLPF8"*HLT%-)251PG_TLL]@OC>5RTIQ -ML#9.>CF74]L859]6O$U3"/RE.3Q2IA@0#EPQ[L:T^BXC5V.<=M9?%,,G>V2B -M@8/4P:X-`"7##0%HDA57]JB9)$!\4(I>?1='W[G9Q2>5LE])K8\.X0LAR1`M -MT2D``"0)E%`B^\KW7I1X$WZ4Y!S.*6\CI]=83*,LD1"2*'W\QBD``!P``$`$ -M:R>LWXIMZ=S#&;I#OL-1]&DF[34````<``!`!6_")>[29^P>L*?B'UXZ,?X1 -M;!3-*Q.W1JGH!0"8`0``F`$```(```!%``&4;M@``$`1``#`J`$!P*@!`@'T -M`?0!@`=E/V`_:D6GF3,``````````"$@(@@````````!>"(``'@```!T`0$` -M@`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``!:)MO:WLS4$-J\*2IW]&T1P1 -M;3GC0W$2?J?,V5#LZ%5L]LG.%,>#R)J3S -M+:)G[![#K\DJAY/N"YY]/5;#/`1X````'``` -M0`5[5]4L$S.M64XU7=A^B47EK(JAA2L3MT:?%0D`F`$``)@!```"````10`! -ME&[;``!`$0``P*@!`<"H`0(!]`'T`8`'93]@/VI%IYDS```````````A("(( -M`````````7@B``!X````=`$!`(`#```,`0``#(`.`(`#```,`0``#(`.`0`# -M```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,` -M``@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(` -M``6B;;VM[,U!#:O"DJ=_1M$<$6TYXT-Q$GZGS-E0W`3D>J%=VRGP)'(%KE:9 -MT5D^S*X*A6E_G^S$4:,^],>(N"HMNK5BPZ_)*H>3[@N>?3U6PW(9*0``)-NJ -MD&`ZKND&T.-GR=QP[[_"\CW!9V("FG"HX5FZ3B03*0``'```0`22E^#%Y[XW -M%EP2/8G8-YY$7CP$>````!P``$`%>U?5+!,SK5E.-5W8?HE%Y:R*H84L$[=& -M_A0``)@!``"8`0```@```$4``91O6@``0!$``,"H`0'`J`$"`?0!]`&`!V4_ -M8#]J1:>9,P``````````(2`B"`````````%X(@``>````'0!`0"``P``#`$` -M``R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@`` -M`@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```( -M!````@````@$```.*```B``"```%HFV]K>S-00VKPI*G?T;1'!%M.>-#<1)^ -MI\S94-P$Y'JA7=LI\"1R!:Y6F=%9/LRN"H5I?Y_LQ%&C/O3'B+@J+;JU8G+) -MN\Y#6$F^\!7*JVP2-I8"-GY&4,K>_!KUZSH56SVR>^-Q9<$CV)V#>>1%X\!'@````<``!`!7M7U2P3 -M,ZU93C5=V'Z)1>6LBJ&%+!.W1M-@#0"8`0``F`$```(```!%``&4;UL``$`1 -M``#`J`$!P*@!`@'T`?0!@`=EXX]=?34"7<(``````````"$@(@@````````! -M>"(``'@```!T`0$`#`````P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``:2[VB/;6 -M2'A]VN]'B0),`N6U-1H'I^\;#2?'TYY6;;C7SY;$:AA1_XL7)6KZ8?<6ND^#K\>Y(FXS*/&8,H; -MBB4#'FF#5G5!R.PP;OZW.@"GRX.EZ,I[)A_/*?)4D -MS*\K]:KS````'```0`7EX#RTITEUM-&A*?G14S4)S+8&;BT3MT9;30$`F`$` -M`)@!```"````10`!E&]<``!`$0``P*@!`<"H`0(!]`'T`8`'9>./77TU`EW" -M```````````A("((`````````7@B``!X````=`$!``P````,`0``#(`.`(`# -M```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(` -M``$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"```` -M"`0```XH``"(``(``&DN]HCVUDAX?=KO1XD"3`+EM34:!Z?O&PTGQ].>5FVX -MW,U.F@^`OZU9,B_6X`ZW(1!QOC5H:_`?Q$!\+-^NW6\67E\^6Q&H84?^+%R5 -MJ^F'W%KI/@Z_'N2)N,RCQF#*&XHE`QYI@U9U0C*>R8? -MSW)1_]17*0``)`J8O?I%O[B?E-`"<8!Z=>P0[G0D,G6(PWD)@RQCPJ2L*0`` -M'```0`1UPG#=`[]=)"VWBGR5),RO*_6J\P```!P``$`%Y>`\M*=)=;31H2GY -MT5,U"``` -M`'0!`0`,````#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"``!I+O:(]M9(>'W:[T>) -M`DP"Y;4U&@>G[QL-)\?3GE9MN-S-3IH/@+^M63(OUN`.MR$0<;XU:&OP'\1` -M?"S?KMUO%EY?/EL1J&%'_BQ:8-6 -M=4'([#!N_KG7L -M$.YT)#)UB,-Y"8,L8\*DK"D``!P``$`$=<)PW0._720MMXI\E23,KROUJO,` -M```<``!`!>7@/+2G276TT:$I^=%3-0G,M@9N+A.W1FR:!0"8`0``F`$```(` -M``!%``&4;VL``$`1``#`J`$!P*@!`@'T`?0!@`=E4UM^=966N1@````````` -M`"$@(@@````````!>"(``'@```!T`0$`#`$```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``K8SP%\"2N2S5<`)A7L(-A![5_BN#1?AGN&6E66XH>/L'Y##/Q=_GG8 -M?"X3MT9?QP@`F`$``)@!```"````10`!E&]L``!`$0``P*@!`<"H`0(!]`'T -M`8`'95-;?G65EKD8```````````A("((`````````7@B``!X````=`$!``P! -M```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,` -M``@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P`` -M!0,```@$```"````"`0```XH``"(``(``*V,\!?`DKDLU7`"85['-HI(Z"7$KU?XK@T7X9[AEI5EN*'C -M[!^0PS\7?YW(B_YB"F+STH_3J9])4V`[\/T#K=YH,,^:>33.Q"5"_9?G%Z9) -M&"SFW"[[\[]*>%%KW.^!1%OO*0``)&,=>/D;=+MN1YC````'0!`0`,`0``#`$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``"M -MC/`7P)*Y+-5P`F%>QS7(Z0XBDZNH[2K[!8[EF\6GJ*2.@EQ*W,Z-1KH'0T'5 -MAX@V$'M7^*X-%^&>X9:59;BAX^P?D,,_%W^=R(O^8@IB\]*/TZF?25-@._#] -M`ZW>:##/FGDTSL0E0OV7YQ>F21@LYMPN^_._2GA1:]SO@41;[RD``"1C'7CY -M&W2[;D>8W,12B2HP,SJ;+P&JB0\6]O$^#L1?B>AZ=A\+Q.W1B(1 -M#0"8`0``F`$```(```!%``&4;VX``$`1``#`J`$!P*@!`@'T`?0!@`=EH[;8 -MDK)JX^D``````````"$@(@@````````!>"(``'@```!T`0$`#`(```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``._[#\QG?O8Z7$U]9']<0!C+643GF!JJ\]2O1 -M>'"-'8[W:?2XF95/C/MO%?N60,^]WA3%>QS8QY%-SO;7:Z.E!*1+=;6\(ONR -M*LA`A%7^`;!5[D:<`&;N#@"TV`"%>%&FNESF)585>#!0%*C)^R&13>);MRZ.K6?HA[.:T*,&+V$+\ZD+0-RM -MF)8I```<``!`!*'F(0#6*-^&2,!>1",GZV!6C_YD````'```0`5O_PFM8D'Y -MC'[^$#?,%\/?&A:<^3`3MT8I_P``F`$``)@!```"````10`!E&]O``!`$0`` -MP*@!`<"H`0(!]`'T`8`'9:.VV)*R:N/I```````````A("((`````````7@B -M``!X````=`$!``P"```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`. -M`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P`` -M"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``#O^P_,9W[V. -MEQ-?61_7$`8RUE$YY@:JO/4KT7APC1V.]VGTN)F53XS[;Q7[ED#/O=X4Q7L< -MV,>13<[VUVNCI02D2W6UO"+[LBK(0(15_@&P5>Y&G`!F[@X`M-@`A7A1IKI< -MYB56%7@P4!2HR?LAD4WB7(9*,QZ+[([R:,P+^1)**0``)%-)U5NH[@6WF[SFM"C!B]A"_.I"T#````'0!`0`,`@``#`$```R`#@"``P`` -M#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```! -M`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$ -M```.*```B``"```[_L/S&=^]CI<37UD?UQ`&,M91.>8&JKSU*]%X<(T=CO=I -M]+B9E4^,^V\5^Y9`S[W>%,5['-C'D4W.]M=KHZ4$I$MUM;PB^[(JR$"$5?X! -ML%7N1IP`9NX.`+38`(5X4::Z7.8E5A5X,%`4J,G[(9%-XER&2C,>B^R.\FC, -M"_D22BD``"132=5;J.X%MYNW+HZM9^B'LYK0HP8O80OSJ0M`W*V8EBD``!P` -M`$`$H>8A`-8HWX9(P%Y$(R?K8%:/_F0````<``!`!6__":UB0?F,?OX0-\P7 -MP]\:%ISY,1.W1CI-!0"8`0``F`$```(```!%``&4;W(``$`1``#`J`$!P*@! -M`@'T`?0!@`=EK560S/8G_WH``````````"$@(@@````````!>"(``'@```!T -M`0$`#`0```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``43$P5?7B@GL(VNMZ`*7Q -MAT;RL&&;HO(\K_JV<6Y;6U[781S'&]_Y<[::^DY-J0[Q_3,B4DMS.O8B/1<# -M2UE3+-G?BFQ0FV*-A-RAL-N<;63;$?T@HXO_!;L1X<;A+0XYEKJ&K_?+9*(! -MQ+'U2O;%F,'HFUR/??#H1US88-9"DZTI```DFC[D2AX2$@)VU;KX5(4*!3F0 -MI76`FLBBJ.Q=,R_.,L@I```<``!`!%'4RVZ!A#\A/.%QZ2WQP9U,_XM&```` -M'```0`4JIY+R3@AR43%<:`O&\(2$`CUS_#$3MT8N>0@`F`$``)@!```"```` -M10`!E&]S``!`$0``P*@!`<"H`0(!]`'T`8`'9:U5D,SV)_]Z```````````A -M("((`````````7@B``!X````=`$!``P$```,`0``#(`.`(`#```,`0``#(`. -M`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@`` -M!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"( -M``(``%$Q,%7UXH)["-KK>@"E\8=&\K!AFZ+R/*_ZMG%N6UM>UV$'&X2T..9:ZAJ_WRV2B`<2Q]4KVQ9C!Z)M$A("=M6Z^%2%"@4YD*5U@)K(HJCL73,OSC+(*0``'```0`11U,MN -M@80_(3SA<>DM\<&=3/^+1@```!P``$`%*J>2\DX(```0!$``,"H`0'`J`$"`?0!]`&` -M!V6M59#,]B?_>@``````````(2`B"`````````%X(@``>````'0!`0`,!``` -M#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"``!1,3!5]>*">PC:ZWH`I?&'1O*P89NB -M\CRO^K9Q;EM;7M=A',<;W_ESMIKZ3DVI#O'],R)22W,Z]B(]%P-+65,LV=^* -M;%";8HV$W*&PVYQM9-L1_2"CB_\%NQ'AQN$M#CF6NH:O]\MDH@'$L?5*]L68 -MP>B;7(]]\.A'7-A@UD*3K2D``"2:/N1*'A(2`G;5NOA4A0H%.9"E=8":R**H -M[%TS+\XRR"D``!P``$`$4=3+;H&$/R$\X7'I+?'!G4S_BT8````<``!`!2JG -MDO)."')1,5QH"\;PA(0"/7/\,A.W1N/$#`"8`0``F`$```(```!%``&4;X,` -M`$`1``#`J`$!P*@!`@'T`?0!@`=E?Q3.@T=ML3(``````````"$@(@@````` -M```!>"(``'@```!T`0$`#`0```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``_VZ2 -M&LDZ#>4#(A&QC'Q_X2H)`0&4QCP"&"[B5"!;JR"O_XE;%EBS;U$%^#F83V,* -M7U4A;80<6*&)^)5AB%&T3!7]"<'DBZK_1B[8SEN'5'_*]X/U".F/+)5MO^%U -MRR7L4-X&$,@KL3T-F43GQR+HC/IG-6SBG/`+'*RAG1://8`I```DM=`O(_5[CH"P.4J_I&D:0SN2^CC7DB",&C:C`(I```<``!`!'9!!>7-0\:R[Z[" -M?C&P"PB_FJR#````'```0`5>>7#]0CICRR5;;_A=!A#(*[$]#9E$Y\XZ`L#E*OZ1I&D,[DOHXUY(@C!HVHP" -M*0``'```0`1V007ES4/&LN^NPGXQL`L(OYJL@P```!P``$`%7GEW.8\N$>01 -M6\NF=-KD"Q(?*STS$[=&FO(&`)@!``"8`0```@```$4``91OC@``0!$``,"H -M`0'`J`$"`?0!]`&`!V5_%,Z#1VVQ,@``````````(2`B"`````````%X(@`` -M>````'0!`0`,!```#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"``#_;I(:R3H-Y0,B -M$;&,?'_A*@D!`93&/`(8+N)4(%NK(*__B5L66+-O407X.9A/8PI?52%MA!Q8 -MH8GXE6&(4;1,%?T)P>2+JO]&+MC.6X=4?\KW@_4(Z8\LE6V_X77+)>Q0W@80 -MR"NQ/0V91.?'(NB,^F2((P:-J,`BD``!P``$`$=D$%Y"(``'@```!T`0$`#`<```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``-$Z_)=\!`9V;MJ,>M081L,QO&IH>_U+/GP)R%^MD@B"\-KJX -MODK?8]D^9=H9&B;1P>;L7+FL:U15J%^#LD*CU/R09!/B4H=I_+_]:MR.)&$3+:M!N'053IDY!QM'[ -M"PPI```DF4>.=$FM+Y^64]2Z83(I**`,;5]3XN651X"\7P^=AY`I```<``!` -M!'RB58:R!8UI>8F4_LCR*$SV,WLS````'```0`4R/`*<0NM#A_#.YW>$[!,8 -MPH>>]C03MT85*P@`F`$``)@!```"````10`!E&^=``!`$0``P*@!`<"H`0(! -M]`'T`8`'98,G#RI1TX4,```````````A("((`````````7@B``!X````=`$! -M``P'```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0`` -M`P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```( -M`P``!0,```@$```"````"`0```XH``"(``(``#1.OR7?`0&=F[:C'K4&$;#, -M;QJ:'O]2SY\"`O%\/G8>0*0``'```0`1\HE6&L@6-:7F)E/[(\BA,]C-[,P```!P` -M`$`%,CP"G$+K0X?PSN=WA.P3&,*'GO8T$[=&;6P.`)@!``"8`0```@```$4` -M`91OH0``0!$``,"H`0'`J`$"`?0!]`&`!V6#)P\J4=.%#```````````(2`B -M"`````````%X(@``>````'0!`0`,!P``#`$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M```T3K\EWP$!G9NVHQZU!A&PS&\:FA[_4L^?`G(7ZV2"(+PVNKB^2M]CV3YE -MVAD:)M'!YNQ^K,X=NKJ4T:VB+(\EX^ -M)2AVG\O]R7*^C0<[+M^7V^25[UJW(XD81,MJT&X=!5.F3D'&T?L+#"D``"29 -M1XYT2:TOGY93U+IA,BDHH`QM7U/BY95'@+Q?#YV'D"D``!P``$`$?*)5AK(% -MC6EYB93^R/(H3/8S>S,````<``!`!3(\`IQ"ZT.'\,[G=X3L$QC"AY[V-1.W -M1DEZ#`"8`0``F`$```(```!%``&4;ZH``$`1``#`J`$!P*@!`@'T`?0!@`=E -MB1@RG%1ZW=\``````````"$@(@@````````!>"(``'@```!T`0$`#`@```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``YEUPCYD'IGT&(L6?+%QI/#2$`&(>:7"5 -MXE@EY.AC7P>8F4?V#QW\\!KUL=!.=;BT2[PG7:YVF+;41\J\SX'?N7NL8%&'M8:UI/[L1G -MJ-859=0I```<``!`!%V$5Y?VRHS2"6UR9O;.>,XIVPQU````'```0`4S_(_- -M_DE$L?8EET*H@WCO=TMC.C83MT;`8@``F`$``)@!```"````10`!E&^M``!` -M$0``P*@!`<"H`0(!]`'T`8`'98D8,IQ4>MW?```````````A("((```````` -M`7@B``!X````=`$!``P(```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0`` -M#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```" -M`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``.9=<(^9 -M!Z9]!B+%GRQ<:3PTA`!B'FEPE>)8)>3H8U\'F)E']@\=_/`:];'03G6XM$N\ -M''_.:DPR,)D%\&DQQ3IFW;G?AOU90A&'Q?C$%S]_G%0\NVD2JI<,M^HM!@Y* -M$DJL-*W-OHYJN?M65/5\-MO>*0``)'IUVN=IBVU$ -M?*O,^!W[E[K&!1A[6&M:3^[$9ZC6%674*0``'```0`1=A%>7]LJ,T@EM````'0!`0`,"```#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"``#F77"/F0>F?08BQ9\L7&D\-(0`8AYI<)7B6"7DZ&-? -M!YB91_8/'?SP&O6QT$YUN+1+O!Q_SFI,,C"9!?!I,<4Z9MVYWX;]64(1A\7X -MQ!<_?YQ4/+MI$JJ7#+?J+08.2A)*K#2MS;Z.:KGW+C_F=&&6X;$\H[X$2=7K -M5E3U?#;;WBD``"1Z==KG:8MM1'RKS/@=^Y>ZQ@48>UAK6D_NQ&>HUA5EU"D` -M`!P``$`$7817E_;*C-();7)F]LYXSBG;#'4````<``!`!3/\C\W^242Q]B67 -M0JB#>.]W2V,Z-Q.W1B&Q!`"8`0``F`$```(```!%``&4;[@``$`1``#`J`$! -MP*@!`@'T`?0!@`=E\+,U=K='8&\``````````"$@(@@````````!>"(``'@` -M``!T`0$`#`D```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``#O+Y[YA8&Q2)`&8= -METE&:N==46#6I<.]')"G5#[PY7(=_(%B,L>Z]G._U8OJDBY.$2)/13<3MT:9W`<`F`$``)@!```" -M````10`!E&^Y``!`$0``P*@!`<"H`0(!]`'T`8`'9?"S-7:W1V!O```````` -M```A("((`````````7@B``!X````=`$!``P)```,`0``#(`.`(`#```,`0`` -M#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```( -M`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH -M``"(``(```[R^>^86!L4B0!F'9=)1FKG75%@UJ7#O1R0IU0^\.5R'?R!8C+' -MNO9SO]6+ZI(N7,MYD^<])S:L@>1+.!#VTVMOG#U22Z+>B[?U51OS>SUC&>7G -M*/57%P(TG7_Q>.>#%X:('WQ'V.R,76=H@K9JP"\Z&=@:CK(X:-U<'ZGX]X?W -M*0``)#FL6-)V;U.X3HQ5\UX+9OE`[T"%XY8?O"M"=)[>F9UL*0``'```0`1( -MVETN"@^X.Q2[\:7P:<;$&S6)B````!P``$`%,12+TFF&:]Y7/9V'CA$B -M3T4W$[=&0!X.`)@!``"8`0```@```$4``91ON@``0!$``,"H`0'`J`$"`?0! -M]`&`!V7PLS5VMT=@;P``````````(2`B"`````````%X(@``>````'0!`0`, -M"0``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"```.\OGOF%@;%(D`9AV7249JYUU1 -M8-:EP[T9/G/2&B!]\1]CLC%UG:(*V -M:L`O.AG8&HZR.&C=7!^I^/>']RD``"0YK%C2=F]3N$Z,5?->"V;Y0.]`A>.6 -M'[PK0G2>WIF=;"D``!P``$`$2-I=+@H/N#L4N_&E\&G&Q!LUB8@````<``!` -M!3$4B])IAFO>5W(SWCV=AXX1(D]%.!.W1K`J#`"8`0``F`$```(```!%``&4 -M;[\``$`1``#`J`$!P*@!`@'T`?0!@`=EEORT.M:R#C8``````````"$@(@@` -M```````!>"(``'@```!T`0$`#/H```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MGY72G!J5(3G(PUK<),T]\DYP2:=O-#`6&#OO"YQ=E]&OW$!!T1V?/^P<."[I -M!YFL0RS3NA$"E(VL+86M$8^Y?2$QB*,XC[X<>K[Z*Y/:X)K+R\JSH"S4>T^R -MIU#6^Y]'ULSD'J(]EW[)\!'J6\-`=S@NH.:.KB5"F2-#!0(HNB`I```D-(RS -M+:)M"(_/Q>2E%I58PEG9X)S`EZW*2VKJ.KX6J7,I```<``!`!'$+&ZT9C4/^ -MCCI)G'0J7^0TPEM*````'```0`5'##K'A$]`+I9?943;@W9K/P2/C#D3MT9I -M%```F`$``)@!```"````10`!E&_!``!`$0``P*@!`<"H`0(!]`'T`8`'99;\ -MM#K6L@XV```````````A("((`````````7@B``!X````=`$!``SZ```,`0`` -M#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```" -M`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$ -M```"````"`0```XH``"(``(``)^5TIP:E2$YR,-:W"3-/?).<$FG;S0P%A@[ -M[PN<79?1K]Q`0=$=GS_L'#@NZ0>9K$,LT[H1`I2-K"V%K1&/N7TA,8BC.(^^ -M''J^^BN3VN":R\O*LZ`LU'M/LJ=0UON?1];,Y!ZB/9=^R?`1ZEO#0'"MRDMJZCJ^ -M%JES*0``'```0`1Q"QNM&8U#_HXZ29QT*E_D-,);2@```!P``$`%1PPZQX1/ -M0"Z67V5$VX-V:S\$CXPY$[=&'58&`)@!``"8`0```@```$4``91OQP``0!$` -M`,"H`0'`J`$"`?0!]`&`!V66_+0ZUK(.-@``````````(2`B"`````````%X -M(@``>````'0!`0`,^@``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"``"?E=*<&I4A -M.HCV7?LGP$>I;PT!W."Z@YHZN)4*9(T,%`BBZ("D``"0TC+,MHFT(C\_% -MY*46E5C"6=G@G,"7K$3T`NEE]E1-N#=FL_!(^,.A.W1B5B!`"8`0`` -MF`$```(```!%``&4;](``$`1``#`J`$!P*@!`@'T`?0!@`=EZ8T%SM[T*_,` -M`````````"$@(@@````````!>"(``'@```!T`0$`#/L```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``W)#P-3C5!MG&X]@M'-Q5R4HE)DT>8^?"Q/ZE)XB.'$:< -MHHGJ=][\W7#*C3$,\>911U"Y7,SYS:4@CW/$U5>_X+C%`[&8*#M^H)AQM!/! -M_XX2N-8I```D>Y_;N&OWGT"ZK#"ZI!SUH2GB<"@DZ1>V5OZ`&,`>+NPI```< -M``!`!"5OB\Q(6.8B>[/^W%AV%\[2-L(@````'```0`4B+R?W4#:P4`5W.)*( -M%N544STXO3H3MT:?C@<`F`$``)@!```"````10`!E&_:``!`$0``P*@!`<"H -M`0(!]`'T`8`'9>F-!<[>]"OS```````````A("((`````````7@B``!X```` -M=`$!``S[```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```( -M`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$# -M```(`P``!0,```@$```"````"`0```XH``"(``(``-R0\#4XU0;9QN/8+1S7 -M)9,KB+Q#N`]I.4:09Z&QNKO'96XVL]:%1%XKC77&3/FOVR#X9[J)=S/U*)GL -M5(CAQ&G**)ZG?>_-UPRHTQ#/'F44=0N5S,^````'0!`0`,^P``#`$```R`#@"``P``#`$```R` -M#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(` -M``0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*``` -MB``"``#AL;J[QV5N-K/6A41> -M*XUUQDSYK]L@^&>ZB7IWWOS= -M<,J-,0SQYE%'4+E?0+JL,+JD'/6A*>)P*"3I%[96_H`8P!XN["D``!P``$`$)6^+ -MS$A8YB)[L_[<6'87SM(VPB`````<``!`!2(O)_=0-K!0!7NHC)G)?%)4``````````"$@(@@````````!>"(``'@```!T`0$`#/P` -M``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P`` -M"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```% -M`P``"`0```(````(!```#B@``(@``@``HESGO+?B_'.CZ%VMX([[WM,SL@+` -MVSL1J&?Q7D@+>O;3K&T`8)AWQ]8N&D^:H],!DDR^5?X?7QW\.Y^X#1"VF_!& -MNH26&2KU`O+`2&>U6VMM8/7)8LQE0F2$#EX7F^IQL:)#`P&@V>=2\?29'VE5 -M]L5G&>M*F?R)_>,XE+T=1-,I```DJ=T[1$YFCI*C/A5;O.)(%J*,,@J5[H#: -M+L94JJD&W\LI```<``!`!%/H.(Z@1*+K>^2]EQR`3".^][3,[("P-L[$:AG\5Y("WKVTZQM`&"8=\?6+AI/FJ/3 -M`9),OE7^'U\=_#N?N`T0MIOP1KJ$EADJ]0+RP$AGM5MK;6#UR6+,94)DA`Y> -M%YOJ<;&B0P,!H-GG4O'TF1]I5?;%9QGK2IG\B?WC.)2]'433*0``)*G=.T1. -M9HZ2HSX56[SB2!:BC#(*E>Z`VB[&5*JI!M_+*0``'```0`13Z#B.H$2BZWOD -MO9<<@$W,_U=FXP```!P``$`%.).U)F\YH_S'W!9%P?L0RR+M+]L\$[=&U@<& -M`)@!``"8`0```@```$4``91O[```0!$``,"H`0'`J`$"`?0!]`&`!V5ZZB,F -M````'0!`0`,_```#`$```R` -M#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,` -M``@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!``` -M`@````@$```.*```B``"``"B7.>\M^+\TS.R`L#;.Q&H9_%> -M2`MZ]M.L;0!@F'?'UBX:3YJCTP&23+Y5_A]?'?P[G[@-$+:;\$:ZA)89*O4" -M\L!(9[5;:VU@];ZG&QHD,#`:#9YU+Q])D?:57VQ6<9ZTJ9 -M_(G]XSB4O1U$TRD``"2IW3M$3F:.DJ,^%5N\XD@6HHPR"I7N@-HNQE2JJ0;? -MRRD``!P``$`$4^@XCJ!$HNM[Y+V7'(!-S/]79N,````<``!`!3B3M29O.:/\ -MQ]P61<'[$,LB[2_;/1.W1B80!`"8`0``F`$```(```!%``&4;^T``$`1``#` -MJ`$!P*@!`@'T`?0!@`=ESA,W*QJ[0L,``````````"$@(@@````````!>"(` -M`'@```!T`0$`#/\```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``A>)<$$IV,?>E -M."'1A=7&]N@Q*B*V*7C__Q4'4="VNYU\QB?R*J*5"EE][X;XX+_L>T8,JYP` -M"0KP.A.5)+T,R4]6U@8U>HS_]V-=^D%-+Q.E]!P!OJ)DER7X8&J&+9&H"\W[ -M<+[PUZOEG5E4^TH.J//7_""U\&U73(A1@"CE9)\<^M -M\[:[````'```0`5Y(;E;C*%*654I:=6KGRN$7A/\Z3T3MT9)0`<`F`$``)@! -M```"````10`!E&_N``!`$0``P*@!`<"H`0(!]`'T`8`'9^&^."_['M&#*N<``D*\#H3E22]#,E/5M8&-7J,__=C7?I!32\3 -MI?0<`;ZB9)KY9U95/M*#JCSU_P@M?!M5TR(48'* -M3"FR*0``)%4#36(VP9O(F@0DY\9@M:W^TNA<@/B35=L:!0&)S//<*0``'``` -M0`1OG]C=C(B1O;H'@HY62?'/K?.VNP```!P``$`%>2&Y6XRA2EE5*6G5JY\K -MA%X3_.D]$[=&_8$-`)@!``"8`0```@```$4``91O]```0!$``,"H`0'`J`$" -M`?0!]`&`!V7.$S````'0! -M`0`,_P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$` -M``,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P`` -M"`,```4#```(!````@````@$```.*```B``"``"%XEP02G8Q]Z4X(=&%U<;V -MZ#$J(K8I>/__%0=1T+:[G7S&)_(JHI4*67WOAOC@O^Q[1@RKG``)"O`Z$Y4D -MO0S)3U;6!C5ZC/_W8UWZ04TO$Z7T'`&^HF27)?A@:H8MD:@+S?MPOO#7J^6= -M653[2@ZH\]?\(+7P;5=,B%&!RDPILBD``"15`TUB-L&;R)H$).?&8+6M_M+H -M7(#XDU7;&@4!B$_SI/A.W1H*6"P"8`0``F`$```(```!% -M``&4;_\``$`1``#`J`$!P*@!`@'T`?0!@`=E47_$74;MIX<``````````"$@ -M(@@````````!>"(``'@```!T`0$`#`````P!```,@`X`@`,```P!```,@`X! -M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$ -M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@` -M`@``]%?U?=&CHR[CIRRV!QGDFGJUDX3H9B1V-Y\8@8EL,%>TW*_^9.WQ4')% -M*USVFBT7[5QS/4BI5)!EZ&X0V/J,/-U(QCBQ!&:+'#I^X_HU`.$E[335I5MB -M8#Y(@$UD=,Z.>MB;5\P^M'!$$/PA-G8*#0"38Z74^&Y*LU`2*^QXQ2HI```D -M9CHB`7#(:6)KMAS@4R*ABE?_>U2BKDLLRM=)9>1__!PI```<``!`!"_T!5[I -M\\680&O^IDD%8BDY='+X````'```0`6Y'E@W^<1?%UKN)@K)=TK-EAZ6P3X3 -MMT9-N@X`F`$``)@!```"````10`!E'````!`$0``P*@!`<"H`0(!]`'T`8`' -M95%_Q%U&[:>'```````````A("((`````````7@B``!X````=`$!``P````, -M`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@" -M```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,` -M``@$```"````"`0```XH``"(``(``/17]7W1HZ,NXZ?&(&);#!7M-RO_F3M\5!R12M<]IHM%^U<AN$-CZC#S=2,8X -ML01FBQPZ?N/Z-0#A)>TTU:5;8F`^2(!-9'3.CGK8FU?,/K1P1!#\(39V"@T` -MDV.EU/AN2K-0$BOL>,4J*0``)&8Z(@%PR&EB:[8Z?/%F$!K_J9)!6(I.71R^````!P``$`%N1Y8 -M-_G$7Q=:[B8*R7=*S98>EL$_$[=&K;D%`)@!``"8`0```@```$4``91P'P`` -M0!$``,"H`0'`J`$"`?0!]`&`!V51?\1=1NVGAP``````````(2`B"``````` -M``%X(@``>````'0!`0`,````#`$```R`#@"``P``#`$```R`#@$``P``#`$` -M``R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P`` -M`@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``#T5_5] -MT:.C+N.G++8'&>2:>K63A.AF)'8WGQB!B6PP5[36#?YQ%\76NXF"LEW2LV6'I;!0!.W1OSM`P"8 -M`0``F`$```(```!%``&4<+X``$`1``#`J`$!P*@!`@'T`?0!@`=EHDV/[5Y< -MX$H``````````"$@(@@````````!>"(``'@```!T`0$`#`$```P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``:_NLW\CV:T682BR6`?S5KN%['7-<5)C/CQ1+'NI9 -MS,:<#W^;&)F//SE88XQ3!GNMI`HK[5(G<&5C_XW3N8%$#O\ -M,@/)GI4?N\XI```D'+UH!IK>V[[[D:R!B:_2Y)+#XR-W@1OX7V)`DV6['(8I -M```<``!`!,P$BG&K^P-O^4?'&`(CDT<.AR04````'```0`5I\F'I,VE3:0J? -MLP2X/\<^4J#HOT`3MT8]&@<`F`$``)@!```"````10`!E'),``!`$0``P*@! -M`<"H`0(!]`'T`8`'9:)-C^U>7.!*```````````A("((`````````7@B``!X -M````=`$!``P!```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`# -M```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,` -M``$#```(`P``!0,```@$```"````"`0```XH``"(``(``&O[K-_(]FM%F$HL -ME@'\U:[A>QUS7%28SX\42Q[J6").*HUH!)1'`U+!E_%:@5OP+ZD[_-K5W!T9KB4 -MA!\O5>5N2S3A?I:'````'0!`0`,`0``#`$```R`#@"``P``#`$` -M``R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P`` -M"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```. -M*```B``"``!K^ZS?R/9K19A*+)8!_-6NX7L=ZEG,QIP/?YL8 -MF8\_.5ACC%,&>ZVD"BOM4B=P96/_C=.Y@40.]P&C8YJC$,G@B3BJ-:`241P- -M2P9?Q6H%;\"^I._S:U=P=&:XE(0?+U7E;DLTX7Z6AW.7XL63A[PR`\F>E1^[ -MSBD``"0!&_A?8D"39;LDS:5-I"I^S!+@_QSY2 -MH.B_01.W1J*M"P"8`0``F`$```(```!%``&4=````$`1``#`J`$!P*@!`@'T -M`?0!@`=EB?#`//PC(>(``````````"$@(@@````````!>"(``'@```!T`0$` -M#`(```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``2%TZ3A_!]1EU!'^21D3O*WW4 -MZ=CBSTR/#0%1PSUA?OC4!'=T80NRQ,>M\7XE5A[*LND -M61NQ:\EC>8;6SH$I```<``!`!(QI,Z1P&>X.272:_//RKPR`7_!S";#FXDQQA?V>.TV%Y4$3MT9QX0X`F`$``)@!```"````10`! -ME'11``!`$0``P*@!`<"H`0(!]`'T`8`'98GPP#S\(R'B```````````A("(( -M`````````7@B``!X````=`$!``P"```,`0``#(`.`(`#```,`0``#(`.`0`# -M```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,` -M``@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(` -M`$A=.DX?W,0H@U["BF4CANV0.L/JW^*8T&ZQ)EZJL0Z;8A -MV3TM$M$),*QR7Y>8!8_PZDHD)+'@?7)FIV`IY^$2COQF5\7`JG\W658J+_M& -M2O5BU&RF%7D9=01_DD9$[RM]U.G8XL],CPT!4<,]87[XU`1W=&$'*0``))F$ -M)("RL["GKLL3'K?%^)58>RK+I%D;L6O)8WF&ULZ!*0``'```0`2,:3.D5"$[=& -MD^$%`)@!``"8`0```@```$4``91V0```0!$``,"H`0'`J`$"`?0!]`&`!V6) -M\,`\_",AX@``````````(2`B"`````````%X(@``>````'0!`0`,`@``#`$` -M``R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@`` -M`@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```( -M!````@````@$```.*```B``"``!(73I.']S$*(->PHIE(X;MD#K#ZM_BF-!N -ML29>JK$.FW*A$N:M^UF$/87F(=D]+1+1"3"L?A$H[\9E?%P*I_-UE6*B_[1DKU8M1LIA5Y&74$?Y)&1.\K?=3IV.+/3(\- -M`5'#/6%^^-0$=W1A!RD``"29A"2`LK.PIZ[+$QZWQ?B56'LJRZ19&[%KR6-Y -MAM;.@2D``!P``$`$C&DSI'`9[@Y)=)K\\_*O!R[BK9P````<``!`!2?-[(!? -M\',)L.;B3'&%_9X[387E0Q.W1I7M`P"8`0``F`$```(```!%``&4=S,``$`1 -M``#`J`$!P*@!`@'T`?0!@`=E>JBJG&>TP2X``````````"$@(@@````````! -M>"(``'@```!T`0$`#`0```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``/--/$(*# -M/TL3[%F".=TG[X`)?Z@L -MFNJ\(]PWT,_H!+#J86'S$?[`MU@/LMN!'+JA52Y]ZAI,QE,F=Q2UDVW\(!,. -M^E'X6"T#E,3144%4+LIUH4HV0J-;0=;/_,$'F)091RTI```D5B[#$P2="X`7 -M4C,(,GJ0P?]-H7>2F2,FUC'Q]5BQ(.PI```<``!`!#G@EX/(CS+;6M)LYK\4 -M2(!JH1-S````'```0`6R;]KI.Q]D)FQR%":E2REZ\ACS/D,3MT9/&@<`F`$` -M`)@!```"````10`!E'=```!`$0``P*@!`<"H`0(!]`'T`8`'97JHJIQGM,$N -M```````````A("((`````````7@B``!X````=`$!``P$```,`0``#(`.`(`# -M```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(` -M``$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"```` -M"`0```XH``"(``(``#S33Q""@S]+$^Q9@CG=)^^`"7+B2W,`PB],H?@#R?KD -M*<[]BE2:?NYE$R\#N:U%GG^H+)KJO"/<-]#/Z`2PZF%A\Q'^P+=8#[+;@1RZ -MH54N?>H:3,93)G<4M9-M_"`3#OI1^%@M`Y3$T5%!5"[*=:%*-D*C6T'6S_S! -M!YB4&4#R(\RVUK2;.:_%$B`:J$3O(8\SY#$[=&I5H-`)@!``"8`0```@```$4``91W3@``0!$``,"H`0'` -MJ`$"`?0!]`&`!V5ZJ*J<9[3!+@``````````(2`B"`````````%X(@``>``` -M`'0!`0`,!```#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P`` -M"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```! -M`P``"`,```4#```(!````@````@$```.*```B``"```\TT\0@H,_2Q/L68(Y -MW2?O@`ERXDMS`,(O3*'X`\GZY"G._8I4FG[N91,O`[FM19Y_J"R:ZKPCW#?0 -MS^@$L.IA8?,1_L"W6`^RVX$8E!E'+2D``"16+L,3!)T+@!=2,P@R>I#! -M_TVA=Y*9(R;6,?'U6+$@["D``!P``$`$.>"7@\B/,MM:TFSFOQ1(@&JA$W,` -M```<``!`!;)OVND['V0F;'(4)J5+*7KR&/,^1!.W1L]L"P"8`0``F`$```(` -M``!%``&4=UD``$`1``#`J`$!P*@!`@'T`?0!@`=E):DG8K.)Y7H````````` -M`"$@(@@````````!>"(``'@```!T`0$`#`4```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``7ZZNE4?P71B]'W=SA2>BIZ_V(NOBG9PR+W#DR-!PIZV*?_N8=],Q -MU,C99`"G=X)"?*E7;]C#_CL9/E+UE<7+P99X'>8&>(1)47,NSC;][/2-:G-8 -M3=7QR'.DZ`6G<-Z>,@YUH_18W<4)=/KG@_TM]1L32XI -M```DU-!\W\[ZMDAOKG6MC&<`]8K5Z```````````A("((`````````7@B``!X````=`$!``P% -M```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,` -M``@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P`` -M!0,```@$```"````"`0```XH``"(``(``%^NKI5'\%T8O1]WO]B+K -MXIV<,B]PY,C0<*>MBG_[F'?3,=3(V60`IW>"0GRI5V_8P_X[&3Y2]97%R\&6 -M>!WF!GB$25%S+LXV_>STC6IS6$W5\GC(.=:/T7*-QFT\ZZ_P> -M^YZCGF-W%"73ZYX/]+?4;$TN*0``)-30?-_.^K9(;ZYUK8QG`/6*W,%'R\EH -MQ`-\68EIM;6P*0``'```0`0**K.CW688&J%^!WQ.^E*-PC1_&@```!P``$`% -MJD#61W&1-8@``````````(2`B"``` -M``````%X(@``>````'0!`0`,!0``#`$```R`#@"``P``#`$```R`#@$``P`` -M#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```( -M`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``"``!? -MKJZ51_!=&+T?=W.%)Z*GK_8BZ^*=G#(O<.3(T'"GK8I_^YAWTS'4R-ED`*=W -M@D)\J5=OV,/^.QD^4O65QHYYC=Q0ET^N>#_2WU&Q-+BD``"34T'S? -MSOJV2&^N=:V,9P#UBMS!1\O):,0#?%F):;6UL"D``!P``$`$"BJSH]UF&!JA -M?@=\3OI2C<(T?QH````<``!`!:I`UD=QD36',DI#?_O&,_^7)\T.1A.W1CJ? -M`P"8`0``F`$```(```!%``&4>&,``$`1``#`J`$!P*@!`@'T`?0!@`=E4!%O -M![K>D9(``````````"$@(@@````````!>"(``'@```!T`0$`#`8```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``;%B554[4SFU<+.@(MA1Y9[',%W> -MW;,J@,#L,V[:-;*_>VI+HTS@]$$$H>&[Y=!JY6PL]#"A)3"CCHN>*(V"D[IY -MA6GL62P%3#H-IG4I```D":J"ZA=F5;9L'>R4M34]N5+>[CY-H<(DG02=^9%1)PT83MT;LR@8`F`$``)@!```"````10`!E'AH``!`$0`` -MP*@!`<"H`0(!]`'T`8`'95`1;P>ZWI&2```````````A("((`````````7@B -M``!X````=`$!``P&```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`. -M`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P`` -M"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``&Q8E55.U,Q@ -MUIM7"SH"+84>6>W-0:SKAR)4&$4L'?E?*7SH0!=5SX&""S7[K@V$RU1]U;3V -M=+E(LU?)-M5`9/M%*E@GAS!=WMVS*H#`[#-NVC6ROWMJ2Z-,X/1!!*'AN^70 -M:N5L+/0PH24PHXZ+GBB-@I.Z>85I[%DL!4PZ#:9U*0``)`FJ@NH79E6V;!WL -ME+4U/;E2WNX^7)9?GX99I)6`"=6**0``'```0`1@Z:11SN^SOG;TPV`H!:]5 -M:C@[-0```!P``$`%J````'0!`0`,!@``#`$```R`#@"``P`` -M#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```! -M`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@````@$ -M```.*```B``"``!L6)553M3,8-:;5PLZ`BV%'EGMS4&LZXQ9+`5, -M.@VF=2D``"0)JH+J%V95MFP=[)2U-3VY4M[N/ER67Y^&6:25@`G5BBD``!P` -M`$`$8.FD4<[OL[YV],-@*`6O56HX.S4````<``!`!:G*EO0<2*,1XVAPB2=! -M)WYD5$G#1Q.W1H48"P"8`0``F`$```(```!%``&4>-P``$`1``#`J`$!P*@! -M`@'T`?0!@`=EH?9U[BO1HH```````````"$@(@@````````!>"(``'@```!T -M`0$`#`<```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``#03"`XNE/='J;U#6&[-L -M&,\IASOZLIF52^"YN0T,%V+(79QTY*IO".001'S;X'_M5%%]I>,=`L5J4S,A -M1H_O>"-I]?`+@6CN+@"VLRQ?/FE@`QXXL'W?:[CX),:K=I+_PPPN);1E"+!> -M8B5,[U7A(B**EAJHR_?:;;<.)AQ/[@7 -MRV=8G72I(N=F-'R]IAXKT:*````````````A -M("((`````````7@B``!X````=`$!``P'```,`0``#(`.`(`#```,`0``#(`. -M`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@`` -M!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"( -M``(```T$P@.+I3W1ZF]0UANS;!C/*8<[^K*9E4O@N;D-#!=BR%V<=.2J;PCD -M$$1\V^!_[511?:7C'0+%:E,S(4:/[W@C:?7P"X%H[BX`MK,L7SYI8`,>.+!] -MWVNX^"3&JW:2_\,,+B6T90BP7F(E3.]5X2(BBI8:J,OWVFW'ZV]5\^#>*0`` -M)`PAZ2'<>=73QFWFW#B8<3^X%\MG6)UTJ2+G9C1\O:87*0``'```0`1M.##. -ME&?=&N$\CVZ2Q8LWQ.[/3P```!P``$`%^HD!&U7+,/P?/.[TF1:QQ"L8(W-( -M$[=&-T0%`)@!``"8`0```@```$4``91Y-@``0!$``,"H`0'`J`$"`?0!]`&` -M!V6A]G7N*]&B@```````````(2`B"`````````%X(@``>````'0!`0`,!P`` -M#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```( -M`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4# -M```(!````@````@$```.*```B``"```-!,(#BZ4]T>IO4-8;LVP8SRF'._JR -MF95+X+FY#0P78LA=G'3DJF\(Y!!$?-O@?^U447VEXQT"Q6I3,R%&C^]X(VGU -M\`N!:.XN`+:S+%\^:6`#'CBP?=]KN/@DQJMVDO_##"XEM&4(L%YB)4SO5>$B -M(HJ6&JC+]]IMQ^MO5?/@WBD``"0,(>DAW'G5T\9MYMPXF'$_N!?+9UB==*DB -MYV8T?+VF%RD``!P``$`$;3@PSI1GW1KA/(]NDL6+-\3NST\````<``!`!?J) -M`1M5RS#\'SSN])D6L<0K&"-S21.W1J51`P"8`0``F`$```(```!%``&4>4<` -M`$`1``#`J`$!P*@!`@'T`?0!@`=ETT4OPV"8@M$``````````"$@(@@````` -M```!>"(``'@```!T`0$`#`H```P!```,@`X`@`,```P!```,@`X!``,```P! -M```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,` -M``(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``&$&M -M6#GCJM3BU.-HX3P7J8@8WP4W=7`%I==OJEP@-M>D8+96YS(H+*2O9B&=\OQ0 -M:I$]8-AM60A5K27NW/K^E5*RI/<[PF.IT&03W/6&`$@-J/O<%N,.G5@D1>IG -MUKI'')6F.WHKY)_"'3UXX9>^(FF7@[`J[LP`:>YAU2`IZ#0I```DT(92!9`7 -M>E@+$H;ZE(SQ4VN'0RKM=B1))-VEV9H$JZ4I```<``!`!)Y5>*!8OF1=O9K( -MO%X+KTN1`S(I````'```0`4$WL!1,MEV'LO]5?2B')`/0J&L>TD3MT:C?`8` -MF`$``)@!```"````10`!E'E*``!`$0``P*@!`<"H`0(!]`'T`8`'9=-%+\-@ -MF(+1```````````A("((`````````7@B``!X````=`$!``P*```,`0``#(`. -M`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P`` -M"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```" -M````"`0```XH``"(``(``!A!K5@YXZK4XM3C:.$\%ZF(&-\%-W5P!:77;ZI< -M(#;7I&"V5N.&7OB)IEX.P*N[, -M`&GN8=4@*>@T*0``)-"&4@60%WI8"Q*&^I2,\5-KAT,J[78D223=I=F:!*NE -M*0``'```0`2>57B@6+YD7;V:R+Q>"Z]+D0,R*0```!P``$`%!-[`43+9=A[+ -M_57THAR0#T*AK'M)$[=&-;X,`)@!``"8`0```@```$4``91Y4P``0!$``,"H -M`0'`J`$"`?0!]`&`!V7312_#8)B"T0``````````(2`B"`````````%X(@`` -M>````'0!`0`,"@``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#` -M`P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@# -M```!`P``"`,```4#```(!````@````@$```.*```B``"```80:U8.>.JU.+4 -MXVCA/!>IB!C?!3=U<`6EUV^J7"`VUZ1@ME;G,B@LI*]F(9WR_%!JD3U@V&U9 -M"%6M)>[<^OZ54K*D]SO"8ZG09!/<]88`2`VH^]P6XPZ=6"1%ZF?6ND<BODG\(=/7CAE[XB:9>#L"KNS`!I[F'5("GH-"D``"30AE(%D!=Z6`L2AOJ4 -MC/%3:X=#*NUV)$DDW:79F@2KI2D``!P``$`$GE5XH%B^9%V]FLB\7@NO2Y$# -M,BD````<``!`!03>P%$RV78>R_U5]*(5X``$`1``#`J`$!P*@!`@'T`?0!@`=E"(``'@```!T`0$`#`L```P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``R2GYLT&K:CP]OF8Q7[ZZW#!1$=?CCUG#J"^1?M_K6N290=(2`^ZP]S'%'3^[@2( -MN1\I```D/LB!$O#HCU+./,IJZF>/O0B#J-^1-EFVSWE75BIXSZ?[!````'```0`5+7&:N#T)M%',&\`W9[)JL -MH/]IM$H3MT:C]@T`F`$``)@!```"````10`!E'EA``!`$0``P*@!`<"H`0(! -M]`'T`8`'97(;7*=R,*&R```````````A("((`````````7@B``!X````=`$! -M``P+```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0`` -M`P,```@"```"`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```( -M`P``!0,```@$```"````"`0```XH``"(``(``,DI^;-'#Y4,R8Q47;SZ[NU/ -M<8+8#O&Z?@/+HE:B*1U&[.A0]E/YRUS`YQ&,'`3V[?R%4(PC#=E/QI&49;$S -ME8P/Q4M2.#I]6K'^B(_[JSU9Q#"WAJVH\/;YF,5^^NMPP41'7XX]9PZ@OD7[ -M?ZUKDF4'2$@/NL/,^G*0``'```0`0<^R2@N^(!7:,B;B9_R;B"A'G^P0```!P` -M`$`%2UQFK@]";11S!O`-V>R:K*#_:;1+$[=&^O4$`)@!``"8`0```@```$4` -M`91Y:0``0!$``,"H`0'`J`$"`?0!]`&`!V5R&URG````'0!`0`,"P``#`$```R`#@"``P``#`$```R`#@$` -M`P``#`$```R`#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0# -M```(`P```@,```@#```!`P``"`,```4#```(!````@````@$```.*```B``" -M``#)*?FS1P^5#,F,5%V\^N[M3W&"V`[QNGX#RZ)6HBD=1NSH4/93^5=6*GC/IRD``!P``$`$'/LDH+OB -M`5VC(FXF?\FX@H1Y_L$````<``!`!4M<9JX/0FT4"(``'@```!T`0$`#`P```P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``^W5;N`G^%`A;8X^DI+%')NTIB><>&-HE -M@L@'9]`RU"PW^B)'P+T/ZFSUITK`G#5PP5C\3U$(WL9-NQO/8Q]&JQT0/9P5 -M[-ANXQL(S]W8=]I>#9X31MR$+DS$"6^[NONL`>VS=!OX)#$K%5MB1G5*:,X' -M&&YHU8(^08/@J*^NZ!U5CDW#````'```0`6`IDT' -MSGJ):.8]!VQ_CXQ_O]2$H4P3MT:AHP8`F`$``)@!```"````10`!E'T3``!` -M$0``P*@!`<"H`0(!]`'T`8`'96H%GY(/`HI,```````````A("((```````` -M`7@B``!X````=`$!``P,```,`0``#(`.`(`#```,`0``#(`.`0`#```,`0`` -M#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```(`@``!`,```@#```" -M`P``"`,```$#```(`P``!0,```@$```"````"`0```XH``"(``(``/MU6[@) -M_A0(6V./I*2Q1R;M*8GG'AC:)8+(!V?0,M0L-_HB1\"]#^IL]:=*P)PU<,%8 -M_$]1"-[&3;L;SV,?1JL=$#V<%>S8;N,;",_=V'?:7@V>$T;````'0!`0`,#```#`$```R`#@"` -M`P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,#```(`@```@,```@" -M```!`P``"`(```0#```(`P```@,```@#```!`P``"`,```4#```(!````@`` -M``@$```.*```B``"``#[=5NX"?X4"%MCCZ2DL4QDV[&\]C'T:K'1`]G!7LV&[C&PC/ -MW=AWVEX-GA-&W(0N3,0);[NZ^ZP![;-T&_@D,2L56V)&=4IHS@<8;FC5Q\RU -M8`>"IT^T!BD``"28/MU!B,DS_V+-7,/99W>M&993@*3:A_T^PSBL:"MDF2D` -M`!P``$`$K6`1R-=Y@CY!@^"HKZ[H'56.3<,````<``!`!8"F30?.>HEHYCT' -M;'^/C'^_U(2A31.W1H+R"@"8`0``F`$```(```!%``&4?E(``$`1``#`J`$! -MP*@!`@'T`?0!@`=E`)GS&-6\9V<``````````"$@(@@````````!>"(``'@` -M``!T`0$`#/\```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``99MX@#N_^O[+]^.Q -M%.2$C>/^[0V4;:LR$/>Y4D:__)>WI[HP=<4Y:?I\?WH08B$A4D*22?5!6P-F"^\+Q3:.@M(`+]T[7U@X8;-BWYO5/D)/VFT1H -M2_H\;M'&?@4=F_U*P1%<=X,I1+-/F@Z4#14I```D+9**L@B'+V]O$+FP@UM. -M$DY<;HAB1_*MN>^MAH-UBVTI```<``!`!,DX9Z*SG>("U248U\/-HE%-\G.4 -M````'```0`5X.W8UF'BK24J^1SF;;$/L@,W:/4T3MT:)'0X`F`$``)@!```" -M````10`!E'Y3``!`$0``P*@!`<"H`0(!]`'T`8`'90"9\QC5O&=G```````` -M```A("((`````````7@B``!X````=`$!``S_```,`0``#(`.`(`#```,`0`` -M#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```"`P``"`(```$#```( -M`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$```"````"`0```XH -M``"(``(``&6;>(`[O_K^R_?CL13DA(WC_NT-E&VK,A#WN5)&O_R7MZ>Z,'7% -M.6GZ?']W-(JT:6/=E90@V+A;`I.@VWJ$&(A(5)"DDGU05L#9@OO"\4VCH+2` -M"_=.U]8.&&S8M^;U3Y"3]IM$:$OZ/&[1QGX%'9O]2L$17'>#*42S3YH.E`T5 -M*0``)"V2BK((AR]O;Q"YL(-;3A).7&Z(8D?RK;GOK8:#=8MM*0``'```0`3) -M.&>BLYWB`M4E&-?#S:)13?)SE````!P``$`%>#MV-9AXJTE*OD````'0!`0`, -M_P``#`$```R`#@"``P``#`$```R`#@$``P``#`$```R`#@#``P``"`$```,# -M```(`@```@,```@"```!`P``"`(```0#```(`P```@,```@#```!`P``"`,` -M``4#```(!````@````@$```.*```B``"``!EFWB`.[_Z_LOWX[$4Y(2-X_[M -M#91MJS(0][E21K_\E[>GNC!UQ3EI^GQ_=S2*M&ECW964(-BX6P*3H-MZA!B( -M2%20I))]4%;`V8+[PO%-HZ"T@`OW3M?6#AALV+?F]4^0D_:;1&A+^CQNT<9^ -M!1V;_4K!$5QW@RE$LT^:#I0-%2D``"0MDHJR"(*M)2KY'.9ML0^R`S=H]3Q.W1@@H`P"8`0``F`$```(```!%``&4 -M?J<``$`1``#`J`$!P*@!`@'T`?0!@`=E*B!>X3O@UUP``````````"$@(@@` -M```````!>"(``'@```!T`0$`#(````P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -M@IZLP^&WHOKP*4.<7#)048_!N[[UR&05784SV8RHWA6-P9'4!`&2F2%Y679< -MQA5#+T)EMBO;FVAE`I!;1Q4$0T.R:2']*L'2=2'XQ7@S/K]4Q$0>S?NFB7WN -MXHXJ1NII^7<#3<;:UBN4M>MO;%AE/RA%S\@GP-WU38TV^LI?=V$I```DKO;V -M_WUU$V4G(1KF$-37[LY*#*@19GY.<-!`:!%3H04I```<``!`!)'P#T#R%_+Q -M)POEL^OI*)H(U(4P````'```0`6$G=4C/4[)M>UNL0_6AV2\6JBOM4\3MT9C -M508`F`$``)@!```"````10`!E'ZM``!`$0``P*@!`<"H`0(!]`'T`8`'92H@ -M7N$[X-=<```````````A("((`````````7@B``!X````=`$!``R````,`0`` -M#(`.`(`#```,`0``#(`.`0`#```,`0``#(`.`,`#```(`0```P,```@"```" -M`P``"`(```$#```(`@``!`,```@#```"`P``"`,```$#```(`P``!0,```@$ -M```"````"`0```XH``"(``(``(*>K,/AMZ+Z\"E#G%PR4%&/P;N^]5EV7,850R]"9;8KVYMH90*06T<5!$-#LFDA_2K! -MTG4A^,5X,SZ_5,1$'LW[IHE][N*.*D;J:?EW`TW&VM8KE+7K;VQ893\H1<_( -M)\#=]4V--OK*7W=A*0``)*[V]O]]=1-E)R$:YA#4U^[.2@RH$69^3G#00&@1 -M4Z$%*0``'```0`21\`]`\A?R\2<+Y;/KZ2B:"-2%,````!P``$`%A)W5(SU. -MR;7M;K$/UH=DO%JHK[5/$[=&#Y<,`)@!``"8`0```@```$4``91^M0``0!$` -M`,"H`0'`J`$"`?0!]`&`!V4J(%[A.^#77```````````(2`B"`````````%X -M(@``>````'0!`0`,@```#`$```R`#@"``P``#`$```R`#@$``P``#`$```R` -M#@#``P``"`$```,#```(`@```@,```@"```!`P``"`(```0#```(`P```@,` -M``@#```!`P``"`,```4#```(!````@````@$```.*```B``"``""GJS#X;>B -M^O`I0YQ<,E!1C\&[OO7(9!5=A3/9C*C>%8W!D=0$`9*9(7E9=ES&%4,O0F6V -M*]N;:&4"D%M'%01#0[)I(?TJP=)U(?C%>#,^OU3$1![-^Z:)?>[BCBI&ZFGY -M=P--QMK6*Y2UZV]L6&4_*$7/R"?`W?5-C3;ZRE]W82D``"2N]O;_?74392"(``'@```!T`0$`#`,!``P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``PBPTK(W7@X9+RS:0LN`/Q`#;T:)G:.P\IN6R0%,_?KJ$?MB=]BN?*4X"VR7N@@_SG/[),XK@:$+ATJ7#N3B: -M'*I9>(@I```D`-0?%\%CL"+E`A;2<\4E>;)DIAU`3MT;,6`L`N`$``+@!```"```` -M10`!M(&7``!`$0``P*@!`<"H`0(!]`'T`:`'A76+D`]\8F3\```````````I -M("((`````````9@A```@``!`!@````G9]V,J9FVC8+`#>;2<\4E>;)DIAR(` -M`'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X` -MP`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```( -M`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``PBPTK(W7@X9+ -MRS:0LN`/Q`#;T:)G:.P\IN6R0%,_?KJ$?MB=]BN?*4X"VR7N@@_SG/[),XK@:$+ATJ7#N3B:'*I9>(@I```D`-0?%\%CL"+E`AE0L`4`$``%`! -M```"````10`!3(&>``!`$0``P*@!`<"H`0(!]`'T`3@''76+D`]\8F3\M>DU -M++*1HP(A("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```( -M`@```@,```@#```"````"`0```(H``"(``(``'Z=5$+)RNG,Y_YK,"5+0^9\ -MAR>,"7#.:IFV.@9JD_\H;90Q;_0Q.R$,F:00+_KZ&5^1WW%1<@P)%"KNX=D) -MBFM`\8'BTQA19W30@KE.R#,L%<\-Q$N!CWH_"@D,L]>>%9#5'E25UOTHV?"M -MJ@HRNL,\J-=C$@_3/0),WVY%.D!!,35& -M_CEY7XEL*ZL?<6=O12H3L:'Z*UE2A4(ELN&$^"1C7VGQVD!8DU++*1HP(N(",@`````0```)PD``"`DZ",E>IA-Q$)4/^#*;$\4U7B -M2=])\]Y5XA&OM5TA`S4/8#I5\J1---*!Q]2PT:D=TQ8#MKC8H*)@"]RWHC&: -M>L[>:/E:_9>[?:6F632IM;K^98P0ZYP+JECV8$L+#D^O$!N[PA9XFD&P@244 -MVFDU++*1HP(N("0(`````@`` -M`/PA``#@T5TF@;5?G@A<;84Q'Y_!N&X:7WI2K4*(BO^]5%=S#IK*MYU`Q]%F -MUVP52_8O[9<:5JV;<)#>V-_S%.B3CR1`PC^HW#Y)9C>@1$;+L_^HY'X8-(GT.&M%D6T -M-*F`O1D#ZOP,(4VSFX$"_$/^U=J9+^3K'>_C,IIO85SR4.]$]5`AQKZ4R+U* -M25`3MT;!1PP`_````/P````"````10``^(&F``!`$0``P*@!`<"H`0(!]`'T -M`.0&R76+D`]\8F3\M>DU++*1HP(N("0(`````P```-PA``#`HU%9>0DS&_KE -M68'F(21-1Q]T0@_)0J5VW&M&V]91RC9;1E8:]ZOE/MN>9LGI+4XG%H]*+5R/ -M@K+KM02,A0I3>PQF.NR6GSH^L>84;QO*/[:25I,%8=L12HTQQB-G`A%_2[7= -M2C=OQ!38)Z`*]R@*,UQJ-2"+GW.!DJ.Y4!.W1N:)#`!L```` -M;`````(```!%``!H@:H``$`1``#`J`$!P*@!`@'T`?0`5`8Y=8N0#WQB9/RU -MZ34LLI&C`BX@)"`````#````3"D``#!-=:_NB:.TZ>I8?3WY;=D\TP@N5L5? -MHP[.GN6NY2FGGFGK-:_;AX9'B@H25%`3MT8OMPP`/`$``#P!```"````10`! -M.(&K``!`$0``P*@!`<"H`0(!]`'T`20'"76+D`]\8F3\M>DU++*1HP(N("0( -M````!````1PA``$`CVV[9`FD1E3#'YJ5WO)IG9<$$1'!.-HNO0UAHPP;+FW' -M2$@O3EZH#;84T,<2S7NZ^:3)^>LQX37]TS8& -MTHXOFV[]\DR05@JEROE7,4(&78RRJR3FV(CK:%Y)["("W;7./E[/U<@>.JU6 -MX'(_YI]=R]I0\-_D\&;;-"6\I(G`BO(O7O!#/]3CW9E -MM`.$!)PR-'.DZ@F0,Q"GSYPYM):5LP:G3RO=.9$X1,ZT1.!M.SL!4!.W1F[9 -M#`#L````[`````(```!%``#H@:X``$`1``#`J`$!P*@!`@'T`?0`U`:Y=8N0 -M#WQB9/RUZ34LLI&C`BX@)"`````$````S"$``+"0;1?/O:N?>9,RKB6-(SG- -M`Q06)+YQ<-:^ZELNMMVIFMP(I+$A'+B1DJ&"_RR75XC(N4]46/!F=\`D^^;K -M>:G,Q@KBIKA$Y&ND!0$JU8;8G7`1@:=`?JY2<=$SZ6NIG=W$$8_BU;__9\;/ -MJM%;1$9``L.Q@)C:108G26_#A!V-%1G%O6X\$,T@1K?FX!J\8$7X5D.,6OW& -MQ_7+W/ZU&X3E'U@G._J`*][:![M*4!.W1N3C#``<`0``'`$```(```!%``$8 -M@;```$`1``#`J`$!P*@!`@'T`?0!!`?I=8N0#WQB9/RUZ34LLI&C`BX@)`@` -M```%````_"$``.!0^ZQS=35C;N0=H[^E5T;.FUVR,(,I:N"@#:5;'+7UR";, -M_'V"$_^:6$&W,R31S5;_*._*,;+M:V?HM4,=9AL7\<5+W! -M:O/4>?E,9Y3U?64%B&$2,4D54UINKK@5O]Q!/UGSO&,J2;20DP$+J,S&4N+( -MS,A7':!EM#T'V3?"4<`.(NLCJSAJD;'8?96^KCKVCA1`L0_US7[H7MT#D$7Z -M)NX[IOA6\_AL;+8;J3T!Y/@JI/&J0'^+V:)-W8K2BM7V%EEALG#(G"S -MBP>:HM5B4!.W1GL)#0#L````[`````(```!%``#H@;0``$`1``#`J`$!P*@! -M`@'T`?0`U`:Y=8N0#WQB9/RUZ34LLI&C`BX@)"`````%````S"$``+!((Q:I -M_B42`%O)=!#`OE"+(YYK4\Q#O.J]D,D_,0NZ+B,Q8 -M-Z+I?N&E.%0+D\/?Q=E_E.T3]E;&68>">$$4?*N2^`C04!.W1L`V#0`\`0`` -M/`$```(```!%``$X@;4``$`1``#`J`$!P*@!`@'T`?0!)`<)=8N0#WQB9/RU -MZ34LLI&C`BX@)`@````&```!'"$``0#'4SOCS:3.O[%F[F2\W>-RB5./F_I; -M34W8:<8>@P)#,%*6L -M1II4T8!1205E?LA/]BHY6_CB^%.??@8M+!HXYNV%-%%J\#WA5U_/=5SZ,Z?* -MKA4;SO5.^1QHPVO2IG./_-SHGP6HHH:S"2NZF+O<;WNGYE^8VFBG!IL8+@*< -MX*'$04,6^W<3@*9%^AU`#T'7NW!%G-P/=9*/.M'&C([^6^M`C`J[U0$[=&'&4-`!P!```< -M`0```@```$4``1B!O0``0!$``,"H`0'`J`$"`?0!]`$$!^EUBY`/?&)D_+7I -M-2RRD:,"+B`D"`````<```#\(0``X+:\E_"&8)JTY7A,MM9@F3OU">%G%&.474`S0/(!A+ZE[%1FL./] -MD$.][8"-\4QLT]UM):4(-L/8Q@UXX](B!86$BTVH&S,_OYEKC%.$40`7T09J -MUU^\::EE3B+@G#)9"W4#1UXD\*Z%'>U'5"*R&"'VL:UJ1M5!>0M')-,BD/^H -MW=IO'IGSHP4QIEGK77R-F8Y0$[=&KH0-`.P```#L`````@```$4``.B!O@`` -M0!$``,"H`0'`J`$"`?0!]`#4!KEUBY`/?&)D_+7I-2RRD:,"+B`D(`````<` -M``#,(0``L"F4,KR:B<`L24Y)@;AHB5"0&?3/=K1X_Y!/'VT3SC^P><9#Q75XE2QR(CMMM&TS]GZ9QZF@\F4AA(TJCMT#09:&7<6DH9XZ;#*R!R9QS:GKZ=YC1.SD,*:(??;^H_1=T3#?Y0 -M$[=&U-<-`(P!``",`0```@```$4``8B!P@``0!$``,"H`0'`J`$"`?0!]`%T -M!UEUBY`/?&)D_+7I-2RRD:,"+B`D"`````@```%L(0`!4`2&,%2K3"]3B>(0 -MJSE3UK`;`@FTQFA-1`U$?WGW!)%^97[]5Q-B[>9W#!=RK:#)3BCY=W/2^TMZNS66&M0\P>'=9$E -M$+L)TWUNB;6:!%MJ@_:,?5-I534@A[)JC?9B7$DE+<)\H.(=TUH+QJ=YIE45 -MA)K*PLCY%;J3!TR<]%!ROMB&F50P1_"VR=0I0K,PBQ^KZ&"3SIB`I>RZ\+MM -MUK=G3YRP>\#R*3#]+/\2L"%%&?WST0&WFBFM9>/^P\*Y4-5J;6`I@FS;1[_I -M;\#D3I!]7BS3/VIB"##SQ/(I`['DQK='V0)_UHZQIM+X?B;A&"U36X5-DX"U -M:-\G)5H3B^5NQ_`O_]XY>64D85?DCV<]HF(9L'TSJ9SD`OT`C2IM#_DGA+HS -MIG]W7+''4!.W1M0M#@!<`0``7`$```(```!%``%8@<8``$`1``#`J`$!P*@! -M`@'T`?0!1`L>'XW%.6$FMQW1/5B+CK -MC9_N1!CBKHJ%Q,<@O*$VT*)U*@G>,R`LLWWFG[EUA3]MR27;:&J">6BP6;?@ -M,\70C"L[^D%U\+8H5_>D)`%41$?*/5(0+IZ/!#U)<`W<9:KSL@K'FCK>?M+< -MHETBPUT8)YA/?6'_)0="'"\R#._X_(''SS\!^83.)==K+N<_!(N%X8Q3RI.C -M5@RMAB?D//N>(S'AR'3P9HJ96C17.QT*^T/;V>? -M>UK`D0^`9.R15U`3MT;@:PX`?````'P````"````10``>('-``!`$0``P*@! -M`<"H`0(!]`'T`&0&262A\R+$4^'L`\7[7AG:+AXN("4(`````````%PJ``!` -M0I%8T+0KR2>I!$[:VM-P\@9USZWV2LE"N'')RXR95R(_#TCVY7WF-`! -MR_^9\)<`$'MU9\&%;8C14!.W1AI]#@!L````;`````(```!%``!H@P#Q?M>&=HN'BX@)2`````````` -M3````#!MTU('?C$3I6P0PPIZT?,A:%:%!UHC[5JG3CSWH#-(T^+3$G;E8TWQ -MIL$*25`3MT9JE`X`;````&P````"````10``:('/``!`$0``P*@!`<"H`0(! -M]`'T`%0&.62A\R+$4^'L`\7[7AG:+AXN("4(`````0```$PJ```P@,X0"8PN -MR&>C2*!H$[9!2IH8:*N*OUA9;`LPB9$*'2)P[#XTO@YY0$[=&#:@. -M`&P```!L`````@```$4``&B!T```0!$``,"H`0'`J`$"`?0!]`!4!CEDH?,B -MQ%/A[`/%^UX9VBX>+B`E(`````$```!,````,)B\*\G%)0*_"!&/#ABGXB58 -M+F:4"?<0:U_Q641.W1KSL``"8`0``F`$```(` -M``!%``&4@>D``$`1``#`J`$!P*@!`@'T`?0!@`=E(ZXD5#YLX,X````````` -M`"$@(@@````````!>"(``'@```!T`0$`#`,!``P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``-$CL'F;O.9[0RD'?%%OJ]FAA+JSI24PW@+T.Z*&M+3@X&A[S)R`; -M0X_>QQ[]TY><"">;LQI9B&D(2`.U?VB:7_?NA"O7Y:LW*'A4,WB#DG&Y4N(, -MS0B0+O279*TCN@UA^;0*CF7R16((Z59THV&"8%0'F!97`$UAT!*]"F)>R(6W",CS;^BU-9$D4QH[QL%Q+TI```<``!`!(M" -MW[>&ZDB-B.JO/EC"'P-US6*X````'```0`54HURB_7(UL%)1"L&XHQY`-H0R -ME5$3MT;B!`$`7````%P````"````10``6('J``!`$0``P*@!`<"H`0(!]`'T -M`$0&*2.N)%0^;.#.```````````I("(@`````````#P````@``!`!@````EC -MGR3=);`X-8^9"U[RQG@0(X68!%$3MT:S(`$`N`$``+@!```"````10`!M('K -M``!`$0``P*@!`<"H`0(!]`'T`:`'A2.N)%0^;.#.```````````I("((```` -M`````9@A```@``!`!@````ECGR3=);`X-8^9"U[RQG@0(X68!"(``'@```!T -M`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@! -M```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,` -M``@#```%`P``"`0```(````(!```#B@``(@``@``-$CL'F;O.9[0RD'?%%OJ -M]FAA+JSI24PW@+T.Z*&M+3@X&A[S)R`;0X_>QQ[]TY><"">;LQI9B&D(2`.U -M?VB:7_?NA"O7Y:LW*'A4,WB#DG&Y4N(,S0B0+O279*TCN@UA^;0*CF7R16(( -MZ59THV&"8%0'F!97`$UAT!*]"F)>R(6W",C -MS;^BU-9$D4QH[QL%Q+TI```<``!`!(M"W[>&ZDB-B.JO/EC"'P-US6*X```` -M'```0`54HURB_7(UL%)1"L&XHQY`-H0RE5$3MT;]:`$`4`$``%`!```"```` -M10`!3('R``!`$0``P*@!`<"H`0(!]`'T`3@''2.N)%0^;.#.NM"5'$;]Z+\A -M("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,` -M``@#```"````"`0```(H``"(``(``"L7C--P+>:V/RZC0R]A@"_O]XS096D? -M$X.>ITDJ&\QUP^:I!#B@HTTYQ#"14Z/D-^Y-_SW1$^A;D0UE5\0:D]R"V5;D -M;-$61+^?SY!4#[@5@`>A5#F(>@5W!XRZJ@0$%@91A4"I5*^#;7LI@W*J?]*0``)!3_#M"P@=]6I#I(,55GSQE2/Y;PI]&Q.3>? -MUKZ,VUZ>*0``'```0`2-0C%LH`Y$E*>(!YYU#0*J1CIF/P```!P``$`%<>%+ -MVUFECW4!.R6(^3+$T,&(E"U1$[=&,*D!``P!```,`0```@```$4``0B!\P`` -M0!$``,"H`0'`J`$"`?0!]`#T!]DCKB14/FS@SKK0E1Q&_>B_+B`C"`````$` -M``#L(P``T-]R^'"(S/TST`8&G")U;S#Z6$_"9]Q'W%@,%QSZV;?,,LY5`?\^ -M/.@1HX]A%\/62XJ%/XS->8^\_S^<^Q7$IB9[/JGU;3L'*3.Z2G!PP4/Q-"56 -M/X/[G69'(KC*"0U!7U:@*[%>@^\7XKJNDPTF`21@-4AT2ELW-M2-&*W62:%= -M\VG_\<`'TAP]?/9`U!"<\-.W%G8>@>D_5'8DVZ=[[;+;,2]\[E;3P0E($"(M/F[[%^HQ5$3MT8BW0$`O````+P` -M```"````10``N('W``!`$0``P*@!`<"H`0(!]`'T`*0&B2.N)%0^;.#.NM"5 -M'$;]Z+\N(",@`````0```)PD``"`7T1J70?'&'FTR\6TLG4VH1B!\&@[O;A# -M?DKJ&F0R]+P-H0FK'*TL_96KK8)BXI'H?/>-E.%4FJV0:W/4C-^:`02'CAE, -M>STF+5;FE'8A(N(V*L,AT>4C.["(QP9VD=_V>/J-?1@WMJV.(JFNM6L#-H=EJ3 -M#4RL1#([G^U.LT/-]%Q_6NG0Y2=!?BZ;!>@KN$CO&3_NBU^7FM@O.JE_YS$* -MSB(\P^@U!T/DQYJ>VR -M21$N?EAQ,IM86<(B,;^7`?'F=N*P1T\/9E[2"3J%VX_+:-^$`QQE%??,3#U# -M937"<_.]+-4L3V6F?,YT\IE#OH849L3<)>OC&RX5K.YTFUF*.>'+>5$3MT80 -M)P(`_````/P````"````10``^('Y``!`$0``P*@!`<"H`0(!]`'T`.0&R2.N -M)%0^;.#.NM"5'$;]Z+\N("0(`````P```-PA``#`[#W^K[]MTRH]`372[>PP -M9ES&'+]MVYF;`*+(Y<1P+MS_*7\S'Z_WE4+2/0Z7)2^[C3JA65< -M?:T%+7,;3Q]#>BDMUR4U0P/B_,?L"\EPG_LEQQ]^)Q2]#.<;+2KL]4X0SO$> -M)$]*<`/#)8L$PFHJGTY*SV9$\WR^E2_#F6A-\GD_':MTUQ9V?'A1$[=&K#P" -M`&P```!L`````@```$4``&B!^@``0!$``,"H`0'`J`$"`?0!]`!4!CDCKB14 -M/FS@SKK0E1Q&_>B_+B`D(`````(```!,*0``,`N/&D=@O4/P8B<1/>6))/N! -M)GN6S0&!3`8A9&/T$YV,4A*Y_C.FS7XD%;>.41.W1BAA`@!L````;`````(` -M``!%``!H@?X``$`1``#`J`$!P*@!`@'T`?0`5`8Y(ZXD5#YLX,ZZT)4<1OWH -MORX@)"`````#````3"D``##/U[_URTHTHG_MX$I'$M<@,T1)OP>.*SY7`\J$ -M4`V`R3SFXIG=US#)>_MO.U$3MT8#FP(`/`$``#P!```"````10`!.('_``!` -M$0``P*@!`<"H`0(!]`'T`20'"2.N)%0^;.#.NM"5'$;]Z+\N("0(````!``` -M`1PA``$`M`#=>L3#BV+]F_>FP84U$_W0&1KK.MPYGBUU!TR;6#,1K'W88WN\D(%"PSNP`H#PK+C(C>2C832K`OI?L9J\7QMM`F -M1CA@T<^(R:2D1DNLY>[Y0P,A-O:=.(#H#%X4"W%.<]1I;O-")RJ_PWRCT4P9 -M`J'9BX2B\95MQ,<:Q44K,U/)I0;6U)"X0$R%'3![17$.E?5V?G!\@@6?]./U/;>[4S+]%=?+!`73?`6.$XG\CV8CUR==* -MOFRH`:BS3_^%!FT>BM/5F?0G48%5BCEUYDLA["9[>@-041.W1MVG`@`<`0`` -M'`$```(```!%``$8@@```$`1``#`J`$!P*@!`@'T`?0!!`?I(ZXD5#YLX,ZZ -MT)4<1OWHORX@)`@````%````_"$``.`'LQ!-*T"=1)T$XWGC'A?UT\E19N[4 -M#CW5-5&+74O+QN`2^ZC^^2E'+B#H<]&E5/TP=(YU3?#!"-C#/Q -MS\$9`B]P;>_!=*1T@I;H!'!#>8P4X&/WNPQG&5-\RA`]^0F)9I1Q`3B0O<`; -M85PS/P=X6TN8L1,\EO?&4>7AT93-^E.L6LFK;+>>Y>'BYJUKVS&G?C;K[T.M -MHLP_.$&6'>79+81QL,*>>FAB]%%X3@V'LAL,@B"H!6%::,4':`L9M$P^[OOT -M'E*F!BT=>BE84L-8H*FOJ`<.41.W1GG(`@#L````[`````(```!%``#H@@0` -M`$`1``#`J`$!P*@!`@'T`?0`U`:Y(ZXD5#YLX,ZZT)4<1OWHORX@)"`````$ -M````S"$``+`\1`^7$*&]2&".9?@WZ26QTH0DV]' -M41.W1I#R`@#L````[`````(```!%``#H@@4``$`1``#`J`$!P*@!`@'T`?0` -MU`:Y(ZXD5#YLX,ZZT)4<1OWHORX@)"`````%````S"$``+#"O0E\P_`7"[CZ -M20@PQ>TX)*).NGW$/^+Z#VBX=0>E"YMS44?4B*P(XF2GO-D#K-S^WG89`*$=0($+./YI1!&?O> -M_H:*)5\%$5A<(06_FIV"ZO_SK>S@]]AK>1&PZV%@! -M4JK#.XB!;2784SEZAC^2>NL(K[2;5626Y(6&41.W1CDQ`P`\`0``/`$```(` -M``!%``$X@@8``$`1``#`J`$!P*@!`@'T`?0!)`<)(ZXD5#YLX,ZZT)4<1OWH -MORX@)`@````&```!'"$``0!IW[Y52O6ZY+8XCG*PAIGF?:=_>B"%0Z2WJL]MXV/L)@=B:AA%I=9\]Z>>;/5N$'ABZ<50)4[)#) -M30\A25\U2<7.`UMW\L.HC#I&4>IC&BW8)9ITE -M]M7K\^-`!CRPO]L.I=`]PWA)T`X/=;*3ILR,$`<^7(0`BH@)U8HU0E.41[?] -MGL+,!,ECV,;+UI;K:B&'0D<;\-9ZBKTA.):,B)?N:^G[53U#"#6,D;%%%XY1 -M$[=&=S\#`!P!```<`0```@```$4``1B""@``0!$``,"H`0'`J`$"`?0!]`$$ -M!^DCKB14/FS@SKK0E1Q&_>B_+B`D"`````<```#\(0``X*KR#GH5PZ@9,O]* -MI!:-SMG9)&D3BF>IL;LQU0:P5Q9J?KL$B&U;HJ!N"4HH5$+F/,"T.4T]$QOWI)3@UC3`KJ5V_F/97I& -M+)#EI1$[=&TUP#`.P```#L```` -M`@```$4``.B""P``0!$``,"H`0'`J`$"`?0!]`#4!KDCKB14/FS@SKK0E1Q& -M_>B_+B`D(`````8```#,(0``L(TI>W`L*WLX*,$X3GNR!L8F@"9XT"I5+BRB -M9-"_:#'M4*OSNT-:N:T%00*8HX#RU9<'AXLD;]9:>P@J]X/U2PC/!.L)A@,U -MM$HN!T78\:UL!O$C2,"U4(W2A7?R"'G=+_3^&!?N8XLU^`5S@_`$F+XH-[/D -M7=C,>FVQ%D1=\GIJ@WTVKF#W`_W>N3E5[.)[3ZR/BZ`,($X'6(7J_);UAAU& -M_0$P1J`ER^>]KSQ1$[=&Q(8#`.P```#L`````@```$4``.B"#```0!$``,"H -M`0'`J`$"`?0!]`#4!KDCKB14/FS@SKK0E1Q&_>B_+B`D(`````<```#,(0`` -ML%X%/[=)&J,U55VI3JX+`Q/;E,R[.^@"D&0H&"$!>8\@_Q:;'=X<:?=@:8)P -M=1]C2(!Q-ZM'314)RI"):&S8@1PPEQ!V4?07A^@;E"!W8(B19W'M=GB_+B`D"`````@```%L(0`!4"+CG^F=926FD8IED]U&K#E= -MT>?%?,(%QO2ZI;0C,2OY%(_C1Q*+@D_:.DB[149>AC>MC(-_`-]^$$OE.&W4 -MHOE8$;V4`$*=K[`89^.&<-1=J5QOTAD_G,?HC)\Q!AGONX1_X&P:7VK?;7F&WY_;J9F?PI2REKTLHMW"!U%RMVX6V63"IIE@KKF7.)3@J2OT[ -M:^MHY]3Q=N_EX7?DK_,TW_S&5D>F3OG`;?X,>*=IRS],:390;7%S:8T8)KH; -MIQ26DB9Z[&R^@:MK^T*QCAN4]V"M4;O*(B>H7T:N7HF&#CVV7XT3PE%`\;QJ5E -MVP1&1+F+UBY"X\=@QO8U0TQAMT3:>!R^%)U)_3S<8P_V'Y"[AXB$YNLI((SF36'W-LW4+ -MO]K:5OL-JN6W<&7T@CVRK:L+D>8"?]VWPE*N+-OLPWHS[]4,CJ9&>Y#`E%2" -MU@16IN0TD\'#BNRBXPA^"`8US4:G=QJL&5NG5I%KTEQ,%DW*:11 -MYI>_XU$3MT;>CP0`?````'P````"````10``>((4``!`$0``P*@!`<"H`0(! -M]`'T`&0&2=I,%X,J::>BRRRZM8<,Y=4N("4(`````````%PJ``!`+]/>#_H/ -MXG6WN<$(^997W=3N@B=-=A'IDB'K\/-+*'TV%,+DZ1`WYFP6Z<7=L9;]*#TJ -M"DH)$S_*U7JZ41.W1IFH!`!L````;`````(```!%``!H@A4``$`1``#`J`$! -MP*@!`@'T`?0`5`8YVDP7@RIIIZ++++JUAPSEU2X@)2``````````3````#!8 -MB-H<)HR6#JX9K2A%[NJ6*^U,T8WI%$:[&&`M8BW@B^M/148YBE$3 -MMT:JR00`;````&P````"````10``:((6``!`$0``P*@!`<"H`0(!]`'T`%0& -M.=I,%X,J::>BRRRZM8<,Y=4N("4(`````0```$PJ```P6`'@BSS\H/F#*FFGHLLL -MNK6'#.75+B`E(`````$```!,````,%?]!X-*^9B#\+<@`/$(,7,-2C\EIPJ` -M5+*(U:,"(-E]_*O;MJPAU#B5P"0.41.W1BM9!@"8`0``F`$```(```!%``&4 -M@J8``$`1``#`J`$!P*@!`@'T`?0!@`=EG+(0TB=A%W```````````"$@(@@` -M```````!>"(``'@```!T`0$`#`,"``P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MKU]P!8^O_MH6EVY8*%XCT/O]+O:N-PF#)-/%U)9)A?:68?948W25131PO&2@ -M0>GV\Y97"MQ.#2%S=F.&'<8"`=EAKRAYZ@KE%M`RH+$KA\WR7!HD+`CXK>ISN]`5%S0)G$AA'YP!Z_M_>8I```DQ4]5 -M849#-Z0>?1WPNHDB1MBVL]G(=)DF4<5<)7YL3JHI```<``!`!*\T4/HCN0Y$ -MS/6Z&"-&8`>O<)AK_(I;E$3MT;> -M9P8`7````%P````"````10``6(*G``!`$0``P*@!`<"H`0(!]`'T`$0&*9RR -M$-(G81=P```````````I("(@`````````#P````@``!`!@````H.N+TM!1'0 -MGV\Y97"MQ.#2%S=F.&'<8"`=EA -MKRAYZ@KE%M`RH+$KA\WR7!HD+`CXK>I -MSN]`5%S0)G$AA'YP!Z_M_>8I```DQ4]5849#-Z0>?1WPNHDB1MBVL]G(=)DF -M4<5<)7YL3JHI```<``!`!*\T4/HCN0Y$S/6Z&"-&8`>O<)AK_(I;E$3MT8*G08`4`$``%`!```"````10`!3(*I -M``!`$0``P*@!`<"H`0(!]`'T`3@''9RR$-(G81=P*XZRS4.9F`@A("(@```` -M`````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```" -M````"`0```(H``"(``(``!KMY)KM;LE/W-+'/X[XDJQM-]XU["3%&L-5Q&A2 -M5PB-ZT/U/^PJ-76K,.V,N*U6^^"4&]&6W$J_SRT_9W>:Q+^M.C^_!+J29!H/ -M2[&)2*P]P8LP$ZZY]X2P;=Z^[7"S7P*0``)*C#^/.\H?OS435-9$T.ZC*^V4?KHNHH9PI+3CN#9U1\ -M*0``'```0`0_XJ1;X!U3$_U85_1I)8\!RE#)$````!P``$`%#P[Y`IPE9Q]2 -M5"L'9UP]Y2?L(Y51$[=&G]`&``P!```,`0```@```$4``0B"J@``0!$``,"H -M`0'`J`$"`?0!]`#T!]FGG[!`(R)HC[7LI -MW50HQ_RQG"`J*B:Y@S'*`U"KT/@G&:J8_GUM6X'=B&8ORX@N;_>H;)HIM$?A -MVO+_8NK$6-#3)[Z92DFX.S^]ZCF3]$B<),HPV%*V,T*6+MV705GG"0@>4',8 -M=POX81`A:&DGPF4/CRK0C?.@C&0FAKEEK$<3ZL7?<=;K\;J9=O-B/KVH?OB! -M*)#S,-ZQ5!72E&H."*S3NA4G=BL`QR=W+I2YU&GI_>-_`_KG[0D!6YR^>1(Y:86#L#*N. -MR&[_]5$3MT9Q"`<`'`$``!P!```"````10`!&(*L``!`$0``P*@!`<"H`0(! -M]`'T`00'Z9RR$-(G81=P*XZRS4.9F`@N("0(`````@```/PA``#@'-Z`TBP< -MHE\*G_$OL),E%_/DOE@,Q5KNL)64:\20),\+;[3ZG>I&*5F>-E]573;L0WT\ -M](5!T+1G03(H'/?N.4&9VU]V$+-[2X`5.:$/QQ,MQ5P<#_(Z;5O%G.=H9_7P -MDT.[X3#NYBS''1/:,(H0JT?9$M1]G\I*4NUU_GX,\[5$]EW$``5-26R6CC?J -M*[HQ7UB]1MITXI)*^R_2R5(8[`>>$NR!GMF8LUS?NE%7OJC)PGL:_4_ZYE(X -MJ0H]WE?<_5$VT3\8\XA6<%"Z[:N,?JG#>@GP*?H/(1:9G%$3MT:^$P<`_``` -M`/P````"````10``^(*M``!`$0``P*@!`<"H`0(!]`'T`.0&R9RR$-(G81=P -M*XZRS4.9F`@N("0(`````P```-PA``#`R:_JP[(]$JK+9=&8P'U>#J*.O`TD -M\*&2FE+ZXCP[Q;VI""I7)3*_QCC[? -MKRDDI>$85OH)[!P7L"F.V>;8HMY)*)GZ*5`2/MO4GJR8F$,W8\NWV2A2MD+* -MTM"LK/U[U#5L+O66Q5&"T\$2PS/>%QKR\JSA,O<,\>^(6#<`',SYQIX.H1O& -M>H]!VWD])!*FM.D%/>A:#NUXVX':X.C@9I_`)>R`B4[4DPZ3\-GP1A(VAKMY4J\SG.?"ELGC_% -M6/`DED/SF&`E%@I`#ZW>(E)]Y`REU&`^$@-==K2N$NH[L,7CF4+$]SZ$7JC3 -MM`)C1VY)0)&V")#?#3_A<67?;N:D*L4C#B[2#3LWD(*MY`&6B?JL!"BPC(NB -MG%[DE.9IDR:)]M87$T!JP8BI-MSE>&21.<49&01)Z"N,@)@C;`0)8R!XA="= -M7T86V-5Z%"!7>T8>A.(B5Z88*G9"/_Q:9!O!41.W1G==!P`<`0``'`$```(` -M``!%``$8@K,``$`1``#`J`$!P*@!`@'T`?0!!`?IG+(0TB=A%W`KCK+-0YF8 -M""X@)`@````%````_"$``.`E^R*5%HQ)_.``IO%VN9W$0OD.G;!T7)O\:RCU -MQM,J2@BSK!=5IG&92\6.9D_XE'^SX(@)*,FE+#]TGJ[@)'J_(,G-"YMFYRSU>C+;ZH\0:'&5_KQ+ -MVB]*T\MJS1D4M._QFOS!)HB^\P[&UH#&0_\1H-M`6G#Q18TH/_V=Z0GR -MD@N9)MV@;\FJ$8?Z88=J?X_MN1C$NYM-MKSN6DUE#IZJ86"9JR%C41.W1G9S!P#L````[`````(```!%``#H@K0``$`1``#` -MJ`$!P*@!`@'T`?0`U`:YG+(0TB=A%W`KCK+-0YF8""X@)"`````$````S"$` -M`+"3$L!M^8C;M*0V*B%?,1J$/6NA1X%+,7=<3EX9N(U]E':0?!W4$0^GK880 -M[D`C0V:9T:3!7T1C4E41.W1B26 -M!P#L````[`````(```!%``#H@K4``$`1``#`J`$!P*@!`@'T`?0`U`:YG+(0 -MTB=A%W`KCK+-0YF8""X@)"`````%````S"$``+#&.'X?_QIY9MP(Z72C3YD,/`N+,"G)_-VHJB)^FA%L, -M::.@-Z\*@_ARY#SHCWO,&D@J$X5/#/U6?AC?!3?!@/:$UI4UFR#*^R:']%G" -M"#&)$_49#U687E!E(N]R<]PB:X.N41.W1I"S!P`\`0``/`$```(```!%``$X -M@K8``$`1``#`J`$!P*@!`@'T`?0!)`<)G+(0TB=A%W`KCK+-0YF8""X@)`@` -M```&```!'"$``0!0[S";BSDK!LGX+@&8K -MQT2PS2&O"P4O8&UWCN:W:GMDO&6I"7"#9O/@?($+NIV#'UW+U#)MH=8%<+4Z -MX300$T^\N)8)0A<^P$D$N61B+`6\*KLCU4%^C,G%^!.8:@Z2(ZY1$[=&?+\' -M`!P!```<`0```@```$4``1B"MP``0!$``,"H`0'`J`$"`?0!]`$$!^F_X5C/C'56_DT`L(%I2V"4T@&M3N60>25$WUO>O -M?"?0"N\(`#4\I24!8I74$F5V`7^B1%\E;F-'[Q5^4XYTJ*GKAGX3?3YWO7T* -M08F@X@9%"@1VAEYOECFR#J,UOH*NPO"=1&V8+8K/&1YU.LRWK"AEYT$24RZN -M_'G-=<*$3RV>/+V&(4$LUDW+_<0P+N-@O5CF*U%`6C^:2I -M^OOS`_3J">*ET8>LI@UR.LK::@@$J7@&.D/QR[7BZ -M5I(^!E4T2F\Q!!XD`T;.MQ)<,R]S+)X8#\H -MHZE7%\<(?C675>BQ6RX,/9_0D+Z`W!\?_1K?VS0T@._R&N>RP+$4VV/D\]W$ -MK3@%#C-1$[=&1O,'`.P```#L`````@```$4``.B"N0``0!$``,"H`0'`J`$" -M`?0!]`#4!KF[$-HSF)F(V?:6+;;IIDM,2+TEJ:='J/S,C8 -M?C.=FN-OP"([E10(I!!J>F@^>;?.!Q[9=$*PUJK;SUDX+"PL0U8SB/FY[LQ\)RM!!U_ -M\+0E78@+I@.S[FU#W%-N/&G5]"?C!W,=GIWN%%I>LL!1$[=&S!D(`(P!``", -M`0```@```$4``8B"N@``0!$``,"H`0'`J`$"`?0!]`%T!UFR\YJC/K.70%17-LX"M5JMY^ -MD/_EAJ]S0-3\7=G\F.I"0VNGU,_)E<=0S@Y+<'=F+(EEBA$%"(I<6<0J5.W6 -M*W1"2?6^=)"72Q6.SI=]^KM1P5)6\).P6C="#?@4'TD]$3)TABI6VZ#H%9;& -M^>E64D?ZHDK..#7>\XW\8NFW%D/^L,_:Q@=9ZLWZW*M-O^>='N/*L5BTDP_Y -MO#T,+23W&1J`H(L6S7T!*#6!"N3:=^?M=G5PT`RN:UYRK8<,'<89D#%2GMMP -M>"NB4*AYBZ'_`>ZV/`'O&TI[9WE[$2_N86>S62M^,I#WAX>(?- -M%@-,^R%S/#>GI?A?V3^S,9)!R.F\L/E][CQ)W<):JMJOK/)6`LZV-%:^:.%6 -MDYRUPP`6,!%V'/G,61$K493WN#]^XE)^_H.EAHCW-;?$`(EGO0TI41.W1D=. -M"`!<`0``7`$```(```!%``%8@KL``$`1``#`J`$!P*@!`@'T`?0!1`.LD=4!ZD'X?^!F,&.T,3NP@E%XV![2X/=^T>O>Q7 -MV1)60)I"F_0`)PC.^6`$VX_H&&4"6.GLUN:U_N@"Z0??V.Q`%8/WJRFHEH*B9#T))A26XZ`;V[WZ2Y$^;+`- -M!Q$+L$/*_3>/-DN*.$).I?IJ7AR[ESF:!KR,A+9P7N>USWSU)_E!Y13I>-:0 -MRBQQ1O1GP!"4??!AX\03LLD"_G678?]Y7'V\+P(7)RWW*$J*LM'MC(*\``!`$0``P*@!`<"H`0(!]`'T`&0& -M227VP3D4_0@?`CAF-;%Q0_J -M!->_0?1F3%6T0U*!$7O,0Z_P,EN)20X+#1+U5"E2N$'=97DK5$NNDV-A"H4` -MDF-141.W1HR""`!L````;`````(```!%``!H@KT``$`1``#`J`$!P*@!`@'T -M`?0`5`8Y)?;!.13]"!\".&8UL7%!SBX@)2``````````3````#`IHT7>9$DU -M!\@/2.<_4BKE(WP:"(1>%KO,ID(\NB,+4)/BE$'X,)82^Z--3,!K__45_`H0U6R/K51$[=&\9X(`&P```!L`````@`` -M`$4``&B"OP``0!$``,"H`0'`J`$"`?0!]`!4!CDE]L$Y%/T('P(X9C6Q<4'. -M+B`E(`````$```!,````,'34#ZT.'VT4GO4;8V0,541.W1O?M"0"8`0``F`$```(```!%``&4@L,``$`1 -M``#`J`$!P*@!`@'T`?0!@`=ES2"%[][#R\$``````````"$@(@@````````! -M>"(``'@```!T`0$`#`,#``P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``"H\/8;": -MRE/C0W.)1"NPT0I0\&"G;<%$74;>GNG*7P8#-X0E2*KF/+C9G_4*%?4";=04[1DU-*/Z$;>AP\F"%:`I```DLUGHSV_;EA:B -M?/&Q.=&`EWX1GFK=)9J*1+Y)%E(U>BDI```<``!`!':>PJ#7A="O%^[]:$.2 -M3XN>)Z=N````'```0`6[Y:L.N!#:0U&L]I!"'$@BB`RII%$3MT8,_0D`7``` -M`%P````"````10``6(+$``!`$0``P*@!`<"H`0(!]`'T`$0&*_>P\O! -M```````````I("(@`````````#P````@``!`!@````HM?./%FC;MG347UNPY -MA'FA.&T!*U$3MT:C#`H`N`$``+@!```"````10`!M(+%``!`$0``P*@!`<"H -M`0(!]`'T`:`'A_>P\O!```````````I("((`````````9@A```@``!` -M!@````HM?./%FC;MG347UNPYA'FA.&T!*R(``'@```!T`0$`#`,```P!```, -M@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(# -M```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0` -M``(````(!```#B@``(@``@``"H\/8;":RE/C0W.)1"NPT0I0\&"G;<%$74;> -MGNG*7P8#-X0E2*KF/+C9G_4*%?4";=04[1DU -M-*/Z$;>AP\F"%:`I```DLUGHSV_;EA:B?/&Q.=&`EWX1GFK=)9J*1+Y)%E(U -M>BDI```<``!`!':>PJ#7A="O%^[]:$.23XN>)Z=N````'```0`6[Y:L.N!#: -M0U&L]I!"'$@BB`RII%$3MT:&,0H`4`$``%`!```"````10`!3(+&``!`$0`` -MP*@!`<"H`0(!]`'T`3@''_>P\O!4TXMCC(/D0::/O2C_.OJ/C!`52L*10V;4.3HRK)+X1K$8FP?:0T5VHM%22 -M^%'7S1#!]X>WSTDGZ+"X8SPTMMFTL'KBC1R60P^22N1/1UP2I-[`9_5N'S'8 -MMN%P*0``))%)MM$^_AUMQLZJ2(.]K'NGP+]1GC+[[Q_48_IVW(FX.S^Z" -M6S@1O]YC7*WK@<=O%YC"RP'>#QFZ"SQ,#%N*.T=&[LE3$-S1A[%*%1KP:PSD -M8$D.RO\DN0>&+*Z$2P?:RC?25%$3MT;S=PH`O````+P````"````10``N(+( -M``!`$0``P*@!`<"H`0(!]`'T`*0&B_>P\O!4TXMCC(/D0:VB>0!!3F)KH46B-?[%MZ'4#Z^I31$S\WJ -MKNY40"$O1TSA.E"6:SX#1//AF#B7>3GH`=N*9[31`B,%\@_D[IZ'N=SC4^;0,,V,_(@+K>T4N;)L;K."9SO9VKF9$*IE$3 -MMT8YE@H`'`$``!P!```"````10`!&(+)``!`$0``P*@!`<"H`0(!]`'T`00' -MZ_>P\O!4TXMCC(/D0Y:(BJ3%UX'KK$M>14XC*R'><" -MR),%R]I1^BG^%<#:RCZQM\D_08JCQ_Y$"3[`E=UXXCU5H`<):W0Z$]);TJMA -MT`"5;,-[`/POSZ""]Z6;(Q\QI8O4?\7[X^RR&K1MY&3^WJQ7U\^,02*7@]@) -M\G@YG&(+.[8A=8OOUE1](%7:A][-,$H%KR>S[S&_+&\^F.'&$";]%[H45I*B -M$H%/'#G]6JFS;C64@\FKVDQO&&*[89>)2W8HNE$3MT8IH0H`_````/P````" -M````10``^(+*``!`$0``P*@!`<"H`0(!]`'T`.0&R_>P\O!4TXMCC(/ -MD0O+8]\;*RAV&6:*< -MI>4TJD+XSS6D`C]ROE))-S>92)RD^K-#$1S&7FFM_$RKA8SG^Y]L% -MU#;8@NQGW?I5A]F43??041.W1L3'"@!L````;`````(```!%``!H@LP``$`1 -M``#`J`$!P*@!`@'T`?0`5`8YS2"%[][#R\%33BV.,@^1!RX@)"`````#```` -M3"D``#"SCMT_LQ"$9"D=)(J;G#&=!P()_DL<*U,1GF!BQ:=9F8C\1Z>X\#RS -MX)\,\%$3MT;1X@H`/`$``#P!```"````10`!.(+-``!`$0``P*@!`<"H`0(! -M]`'T`20'"_>P\O!4TXMCC(/D0F`36/T\#-AJA1@T'WC:HWWSG]^2J\=`OZV\;5VJ#;!X)5*@=9W.>D?A_#3 -M2K4CCT/&/?/YYS-U#`KXK=HAHVH-':W0M2'-ZT=["!I>!BTE'9H5SS9EVC./ -MS.8(S@``?;C#X.ED7H@E9@Q9>MKY41.W1D[N"@`<`0``'`$```(```!%``$8 -M@LX``$`1``#`J`$!P*@!`@'T`?0!!`?IS2"%[][#R\%33BV.,@^1!RX@)`@` -M```%````_"$``.",XJURN]:2@U4G%8VJ$"OQ$(P;?\BJYVW57IG)4-.V98HP -MCE[,=CK6-K8`U$Q%I/"@3?"M[A-$\NT@HO4;JRN>C#(LP#^$!3-9Y4D\YJ[" -MV]#6V\GNCAEYX5F4L#\UZ"--B$DP*8-8OQQZ@J;GIN[^@OKG>IA -M_@>W=HYWQ9R"IO2=W6W(0DO'UAN5D5X+#)$(Z,6WYDNRCB^9VM*M]]VYW2'L -M0BM,/7V!41.W1F[^"@#L````[`````(```!%``#H@L\``$`1``#`J`$!P*@! -M`@'T`?0`U`:YS2"%[][#R\%33BV.,@^1!RX@)"`````$````S"$``+"@>N$S -MI\1JSPEIH^&XZ@X9AU0'X(K=A-X^C@D4NM(VQ`L@*35_K" -M/YET1>PGNW#'#DHIE*92!P7)+=0:29(AS31K6E2[GL2A+0P8&QE?%J'>4)9L -M>`@/R]]-`<&3AS.)$RCU26^(NB[Q7J`+!.E.::QBFCJ"S$(M8,8>D>$)93*^ -MK"2LB_^>=/-KJDF)-"703M)OO+`$=2\PNV\Y2#4PE_92NB9DG6P`O#>8MN8._W;/2.,H:2D1*+V,M);+\_;P5?R0G3XVN3&Z&?@0KW^*9F6$3IQM&Y-C#]):I -MZR,]G+#[',&`6AW=-&9N41.W1DL]"P`\`0``/`$```(```!%``$X@M$``$`1 -M``#`J`$!P*@!`@'T`?0!)`<)S2"%[][#R\%33BV.,@^1!RX@)`@````&```! -M'"$``0#@TRQ':,,NLWUCJP?L19(T.=J^TV+[`!^ -M@967=6*307`[7)FSWK%I.A:[75"6AHI]=*A'''`O3!WY%Y8BBD -M;U6-B=Q1;"DF0YQ;)^F+$PT+`B^9SO%&O6!\#*>/TQONNI9_`-%!#&1]R*7A -M<9S>B=!7@YV`B&.^IN;FAD%2@(TD8I?$D-(N`I"(_W[^=-')$S"UX+!VAIUQ!Q&1SV<=XP:5H\#%C/0",^`^+>>>G[5410AJ5Y%:&X1.\,5RI]Z2&;4<>7PD"?3R&`W;!N_"8'+. -MH&(+Y&ST9E*^+5CR2[H(FPQG1[F7!C$PAQT';37`KH8^[@\Q\UH]R4P^M(RM -MT/TDBR,>BZ`:,H2A50+G8JP#"(2]R@50GZ5&=$)!!61`G)VO -M4V0*V7RNX,F'8`YRK+6RNM-4<7#_`>/CRUO&HYU)!>/QKBTF:10_V7ZJO0D% -MY1W`Z'P11\U2R\LA5;_:`Q]I,%'@:6O%MB#D$1V]+-$_;^^'\:XF"K:B@*38 -M4>0TZ]'RLZ=Q\Y71HJ&ZU$'^9Y[-K1*/>BB42U'38"C?I;]NFZ)[0[L%U"'[W2K\.^-!$D!EV2ZIZY-LB'.!75-GB;EO$>*!Y_+%E -MQ9QS\<$ZSV]SIYP>B-]#K05BC`*'D_0,8#)1$[=&U9\+`(P!``",`0```@`` -M`$4``8B"U0``0!$``,"H`0'`J`$"`?0!]`%T!UG-((7OWL/+P5-.+8XR#Y$' -M+B`D"`````@```%L(0`!4);_6V=-K<)?YN(RP%3[Q/[O'/FL9XGK.O-OA[/P -M#Q#^TSY8Z5X([+$DJM4$49&HJJS\HL:B?5K+0.!04=%4@]Y')+RS@AHD\P*J -M93,`?8&M9NHCY.%V/-_MPT.G,(HM*G?QFO(8F85WZT&`QT$R8$,[JKD^IDI; -MQ^;A*:*#A([@'SRR*LO,KDA4&C%_%:K$[9L]GMBZX5^3B8,\-F3DH9D<-\6. -M;JIE?3_W7MDZ#RYV@&^.L. -M+78WV-;PY\B'-R,A=[Y:/ZE>N7:-'R)QS+V:'.ZEB727Q3T'C%##5BZ^VJ1S -M$#_)MHX-.^/U:_YF.VQ,Z[!=`"3`07@_B4@W48.JN6>:5!A%(39:0CC-3UJ\F>5MG`P6Q>1T35JRM`[R/GK/ -M1S/9&8!:LKB^E+!9@?6.IHF/1O%U0I^P('0CEE);#>ZM2I%% -MJ7B17SR$KBBC8&EMS4FW[_0[K.<_\_.-7C9K49``(,ABE597[YO1,Z%:FJ8G -M/'5]JHQ32KP3B6U\.==SOGM?922JJ19TVR@V&A%WV8W'R`\I/E$3MT9Y^PL` -M?````'P````"````10``>(+7``!`$0``P*@!`<"H`0(!]`'T`&0&23'?V$L2 -M,&B2FID7&%AJXELN("4(`````````%PJ``!`]@:5I5+UT(Q=394^PAY/2U%< -M1.$"/,!XIQ:CM.O=:)[\1D8D./O4O#IV:-/-87BR#&,&5]1LLA)DV5?Z41.W -M1KT&#`!L````;`````(```!%``!H@M@``$`1``#`J`$!P*@!`@'T`?0`5`8Y -M,=_82Q(P:)*:F1<86&KB6RX@)2``````````3````##^.=NMK!=.E*M3^KW_ -MZY_X6CS*"_@H6,B-,)+NCATDAA4O>J8GI&!>8/(FQE$3MT9D%0P`;````&P` -M```"````10``:(+9``!`$0``P*@!`<"H`0(!]`'T`%0&.3'?V$L2,&B2FID7 -M&%AJXELN("4(`````0```$PJ```PXL4R\H8S(\3?/.Z[@?$)4L?03#.'75L[ -M`Y8@-1ZKQ2@(5&RU8=>-*9+A)J51$[=&Y"(,`&P```!L`````@```$4``&B" -MV@``0!$``,"H`0'`J`$"`?0!]`!4!CDQW]A+$C!HDIJ9%QA8:N);+B`E(``` -M``$```!,````,(L@H9!_(_M`4/+D9F091[&/OO9\;R'EG;QD`0B>($M^[$+= -M7)82O'MZ:;/S41.W1EL?#0"8`0``F`$```(```!%``&4@ML``$`1``#`J`$! -MP*@!`@'T`?0!@`=E9%QOF$I+]3(``````````"$@(@@````````!>"(``'@` -M``!T`0$`#`,$``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``VI]2=2]EK$)0)@PR -M!&7J2/I`JQS<]HP_4+'IG^0I3$6FQBR#$OTP!B3=QR+;IP1K^/(R,JDJI)&R -M@73.T-?MTEM%]4S!1+T=K\.B3%B3\7ZO"+"(T4N_\2Z5"D"L_QJY+B]-^3E2 -MK8O.D@3Z5MTGOE,7`;;,0T'_`R7KL+=J>LHI```D68((PQ((`T`#/.O-=CX@ -M.^_;?U1Z57A4=_]92OX+=W/:I6.T -M````'```0`5F&3*C%UL^@W^T-0'GE7QE@P(K^E$3MT9A+@T`7````%P````" -M````10``6(+<``!`$0``P*@!`<"H`0(!]`'T`$0&*61<;YA*2_4R```````` -M```I("(@`````````#P````@``!`!@````J04GWB<*P2,3F#NIJI?*[W'C08 -M>U$3MT;V/0T`N`$``+@!```"````10`!M(+=``!`$0``P*@!`<"H`0(!]`'T -M`:`'A61<;YA*2_4R```````````I("((`````````9@A```@``!`!@````J0 -M4GWB<*P2,3F#NIJI?*[W'C08>R(``'@```!T`0$`#`,```P!```,@`X`@`,` -M``P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@`` -M`0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````( -M!```#B@``(@``@``VI]2=2]EK$)0)@PR!&7J2/I`JQS<]HP_4+'IG^0I3$6F -MQBR#$OTP!B3=QR+;IP1K^/(R,JDJI)&R@73.T-?MTEM%]4S!1+T=K\.B3%B3 -M\7ZO"+"(T4N_\2Z5"D"L_QJY+B]-^3E2K8O.D@3Z5MTGOE,7`;;,0T'_`R7K -ML+=J>LHI```D68((PQ((`T`#/.O-=CX@.^_;?U1Z57A4=_]92OX+=W/:I6.T````'```0`5F&3*C%UL^@W^T-0'G -ME7QE@P(K^E$3MT8X8@T`4`$``%`!```"````10`!3(+>``!`$0``P*@!`<"H -M`0(!]`'T`3@''61<;YA*2_4R3V-IN&\0-+\A("(@`````````3`B```P```` -M+`$!``0#```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"( -M``(``.R(Q$1 -M1$!A,LK2%P+J&7=))AV?W*X5NF5>GK^RR-,:&^L8-2^Y^.+Z+=$HW*LM:^^T -MFIGP#H6J3QFB,Z.G7FH=J;H98*_JU`&^/=M1`0F_#?7OL!5.5/B-RW`.*0`` -M)+,C>J>(!FBG.7/N[L6OH'`Q;E80J!;G^KJ5YG`PN\Y*M)S]@2#U,?@DAD[ -M]E7X;*?]_['MO#]LK;+?=#1VTBTB$*!RM(!4AQS>`^1.G#F3BD<7$J+L4G8L\4M[%.6N[+<:UY4YC)],OL+W4P@H^>YMGBJ>+M -M&>3J^XCF'.F'PW#GBTFZ\$ -MNOG*Y@[>X-EAG/WTEU$3MT8MJ`T`O````+P````"````10``N(+@``!`$0`` -MP*@!`<"H`0(!]`'T`*0&B61<;YA*2_4R3V-IN&\0-+\N(",@`````0```)PD -M``"`:*GX6SG27[T/!UG!3HB+3>6M?+V7),B'(7@AKRZJ4\6FE#1DC.J'849D -M6`=<>;NL8NI41(3Z3-U%RP;[OG6Y`DJ_\'+ROE%ML>#97_V\;"`KG7X56`_G -M>Z^31R)7TES'&.#FA[];%L^*6Q2DNP6FP11:I"7H[*1C:M[2X%$3MT86QPT` -M'`$``!P!```"````10`!&(+A``!`$0``P*@!`<"H`0(!]`'T`00'Z61<;YA* -M2_4R3V-IN&\0-+\N("0(`````@```/PA``#@5;D4;RP^BMCDPZXJ/NW5RI`K -M/W[6,_@SB,?:OHI034;X-!Y*37UV/ZE?Q@5]@`J^C6*[W7I/VY.0MN@Z?]SK0$60O5M)H`4`_77(<$;/W&$[H9<*7LK'Y; -MG/\5S3V2208R:_2`>B"4895MKY-V?+D&7W?[&=TV.]]&$H2U7;^=TH(8*A3Q -M<_\I%=09$F51]U_**2W:H8!BE>>GF.23:R*OJ#1\5M`7-/^@K#C&AA]?6`$9 -MK763Y]2?1?GE&C'.\Z>ZS5^/+OCX0E$3MT9FT@T`_````/P````"````10`` -M^(+B``!`$0``P*@!`<"H`0(!]`'T`.0&R61<;YA*2_4R3V-IN&\0-+\N("0( -M`````P```-PA``#`,]P==R6Q)X<;^9];4,J%DKLQMF2#W/8&SJSHC"L;&LE\-+XB+.!Q^`L$G?/N@'?"1`:("5:>;(GQ'`@4$%X_,[Q -MZ%W'5"9`RZFXCEYLIW]#G3DH-%`?DH[655@YB<<;\7GDHUUB<2C#/5>9@!0C -M]?_J@1R5,$"`6^%Y;IR.3\!)_@5"!/&OL5G%'D9,DARU>6SPZNCBB_KH)@@\ -M^*;>I$+ECP(@,4NRU<`#%[;+?QBJ9""M45#IS\3M68F+A]3`I5OQ3$@*U#/7 -MO1-,C]X:PZR_?=JDXVZM7=/\8%I4V"<7IL(2P^BSZ-J62C,R&"G@]-LT3'P) -M2O*L!ON;)UP`\23=W>2Z?Z%&!G0`YM0I8&OC%WR0?/*<]]Y7'Y.WVQJ-PR2A -M^O7?-GT'7BRDO4'$Z>NW41.W1ML>#@`<`0``'`$```(```!%``$8@N8``$`1 -M``#`J`$!P*@!`@'T`?0!!`?I9%QOF$I+]3)/8VFX;Q`TORX@)`@````%```` -M_"$``."@SD3)8Y)8=X-O$I>N71DL^W5':KV`ZTZP^RK*8U.0`VJ""(96KNXL -MSVNJKA%E)I,WZU)O_]$6R=M@/;\(Z0)RK`$?_'HR7R3@D>VC'=_YWQ-98.!" -M6;:Q4PW.#+JFMKNPG.3-Z/O.^]QHL$B>M42.CF:V[-/S8+2C%[.I -M6>)=2$;^Y=V=(1!Y#-C4;GC,E1+91!4',RDZ=>C)P4$&HE6_U^$!%#=&(&F%B[^R=MH-"=R/GS7,5C>V:N#$GP+Q@4" -M41.W1K,N#@#L````[`````(```!%``#H@N<``$`1``#`J`$!P*@!`@'T`?0` -MU`:Y9%QOF$I+]3)/8VFX;Q`TORX@)"`````$````S"$``+#`1J$^VN/N*'A) -M-%TSL8Q!3"RVVJ7J!4/ZC++,E^FQB/DL90^P76UE?L=9J0F('H_3&4CU^X47 -M#[17`-<]@D!5=ZHW.75`HV^IQ`UX>MUI^S=6.E,JRW+W'B!4KWVQ#6OL3E3( -M]&"-M<$`H846=&I0N478MI2M4,41I'30)F/\YOD -M*GTL30XP,E7@I:4*D.E&(WBZ6J(OE8-8DZ:<41.W1KQ1#@#L````[`````(` -M``!%``#H@N@``$`1``#`J`$!P*@!`@'T`?0`U`:Y9%QOF$I+]3)/8VFX;Q`T -MORX@)"`````%````S"$``+!IVCHU$@JJ*#17U1>2S0-]R-^_>,]W+Z=M``J\ -M -M1&N1`299B),>4(N9>5=6$*,N"-C]VFH7R5XW)Q_)$#;G,^F_#K#JM[Z:1G3?-4 -M2$\,`LK5?8!N41.W1G1O#@`\`0``/`$```(```!%``$X@ND``$`1``#`J`$! -MP*@!`@'T`?0!)`<)9%QOF$I+]3)/8VFX;Q`TORX@)`@````&```!'"$``0`& -M.SVR>M;T6;/X/#*$7,W,8:6>`Y*E>3PMK`AM^<"E`46_]^@8UY/2*UZT50!:,[I+#':Y -MT\61\P?#7NCF)487ZG6_EK9*I1E86>N;^@%1$[=&5GL.`!P!```<`0```@`` -M`$4``1B"Z@``0!$``,"H`0'`J`$"`?0!]`$$!^ED7&^82DOU,D]C:;AO$#2_ -M+B`D"`````<```#\(0``X"3;]%*S'U)K8RE239#>I'30#BO1GUS>P0ZP -M;J&C/@N)'.5QDD.SF@BY';$TQ%<,/4;6%21RU1M/_R#PY="B_+EV9SO-),HU -MR6Q".7BG,SI2%NPH33`OU]L3<"IH.$*<)%XN^H#_G`1J7+./E.N,U0_0\7T= -MV'H[&.?J\'D:TIJ(0"$]G"5NNZ()#YE1R94H@!>UW[.`W%Q)NJ/1& -M^!;(RL -MJ7@X2\2[I,/A#/#H0M;]3` -M?B*0I,O^_*Q]D*_]X>T$/SL;>M,S(VU)S,22@M%O\F3WF1$,=FI1$[=&8:T. -M`.P```#L`````@```$4``.B"[0``0!$``,"H`0'`J`$"`?0!]`#4!KED7&^8 -M2DOU,D]C:;AO$#2_+B`D(`````<```#,(0``L'>6+=Z/XHL"+H-09*KE3L_? -M`=S>"T#)C[5TR;?D><2?AP&F@<".$VI6&7C$Q'=!0+>RIEM-LT#\* -M\*90CSBFEQTQ&M>$>U!3?1$=2L/&`TLXL\@<:UGKM^M)1$[=&T=,.`(P!``",`0```@```$4``8B" -M[@``0!$``,"H`0'`J`$"`?0!]`%T!UED7&^82DOU,D]C:;AO$#2_+B`D"``` -M``@```%L(0`!4#H#YV'BD+$":"L;74O.C04/K^GF(\*H=X[>YWH[OBR. -M10X##N7R8$QR/1=*[#H`U8H?D\&M5[@>Y!N.TI-ENP"V+\3X)>(#$UF:5\^F -MQG*#?!-L#1='ENE()WY0-^*&Y7*A5;7DO>O\5S3C%>DGRI>EW?1]9E5(O&H' -M'CK&J_!\?43C%(<)N*<\#"+2"-0/CWJ^>KMT0`V0YY$^442Y+L -M00O-R60,`+UD:KR-^MA-(3%XQA-!;[ON<`UY``+=?,(%"N":3^ -MCBT/_AME&Z=B4EF?R^I7/!>CZT"^JF,<(.0:MD8UX`UY!RXH$*G.8$,O^!EW -MD=2@XABK6;?.W=W&>%J0OWZK3-/5)$74*3`W41.W1CX)#P!<`0``7`$```(` -M``!%``%8@N\``$`1``#`J`$!P*@!`@'T`?0!1`S']E]RD'2.E*_$']Q]6=5[!Q1 -M='U&_S)`KA0T=`>_\A`GE$YD/N70:=RYN>( -M=%YG5`S-3>.VUA:KW6`*W2S&/CEK#6%+!A2#%RSC-%\;P'3+?4><'NMPLCO4 -M+YN*TAR6X`=\UNMK$1/?#'_!*.,HL[T95*KM>B[:>F\W[W?/2?=3L+1ZH%\A -M2T]^PD?>.)/A;'3SJ1<-D*N]Q'BA,%(MP)3U>W*10\PY;2-F,Y=])T!U_VX# -M#U(+P``!`$0``P*@!`<"H`0(!]`'T`&0&227ZG]KRFGF#,D++ -M"HMMDW,N("4(`````````%PJ``!`2I2A>]?OIAAAN(PP0#4;#.A@0ID7]5!$ -MO/G7J"8`28BR?`%DPM@%J,L$KBH7F43>Z4_WB'"]WT:UY[(`41.W1D(_#P!L -M````;`````(```!%``!H@O,``$`1``#`J`$!P*@!`@'T`?0`5`8Y)?J?VO*: -M>8,R0LL*BVV3#+W98DB+@W7J_VZ,1](7@Q^'E1E -M+*)#I9$UDK1M@3HIV^12$[=&1!D``&P```!L`````@```$4``&B"]0``0!$` -M`,"H`0'`J`$"`?0!]`!4!CDE^I_:\IIY@S)"RPJ+;9-S+B`E(`````$```!, -M````,(^R0Q6DN"^\!^#\QZ&W"1"-*W>`I^7<3))SK^[8]#03,+_4,6[.E4!) -M:*CJ4A.W1C$7`0"8`0``F`$```(```!%``&4@O8``$`1``#`J`$!P*@!`@'T -M`?0!@`=E1FR2NJ.5`FD``````````"$@(@@````````!>"(``'@```!T`0$` -M#`,'``P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```# -M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@# -M```%`P``"`0```(````(!```#B@``(@``@``@`V;)@21V?C]26``Z.RD+5BI -M\R#PVM5:H)(7PZ?1@`,40"+MYS66E$DY#I"EZQUQ3D$"7=LZ!('03N$+ -M.&NA-1E -M(!))/6^Y\BA9\=DI```<``!`!&'C3Q>28F&V[]ST^L0VS;=3,(WV````'``` -M0`5\%2S2-4!.(*N?F#(1KVY"X-AKME(3MT8Q)P$`7````%P````"````10`` -M6(+W``!`$0``P*@!`<"H`0(!]`'T`$0&*49LDKJCE0)I```````````I("(@ -M`````````#P````@``!`!@````J8)2K-]9N#`9C4Y?ADZ0=QQ=(+FE(3MT;# -M-@$`N`$``+@!```"````10`!M(+X``!`$0``P*@!`<"H`0(!]`'T`:`'A49L -MDKJCE0)I```````````I("((`````````9@A```@``!`!@````J8)2K-]9N# -M`9C4Y?ADZ0=QQ=(+FB(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```, -M@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@" -M```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@` -M`(@``@``@`V;)@21V?C]26``Z.RD+5BI\R#PVM5:H)(7PZ?1@`,40"+M -MYS66E$DY#I"EZQUQ3D$"7=LZ!('03N$+.&NA-1E(!))/6^Y\BA9\=DI```<``!`!&'C -M3Q>28F&V[]ST^L0VS;=3,(WV````'```0`5\%2S2-4!.(*N?F#(1KVY"X-AK -MME(3MT:D6P$`4`$``%`!```"````10`!3(+Y``!`$0``P*@!`<"H`0(!]`'T -M`3@''49LDKJCE0)IAK@;?JI(\!8A("(@`````````3`B```P````+`$!``0# -M```,`0``#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``(YL -M(P"<4AS\Z)43#5JYCV6#*BE2Q<'G9A\A]5<25ZLJ''I[7%C*FP*)-WZXY(N- -MPX?&&J=2B_R(1C"^;-I7DYL"E","Q:SJ$G,PF>@8[%%BRE"*)\RT*KOU9*+K -MAY]1"7!:_R'IKW[+N.[AK,G%,3H("1E5!MQ24`4?$@M8$S3R*0``)*L+`G+D -MS^KP`U7YOR7P/*J)!8E]RQ#0DG=78N5:#$*G*0``'```0`37B])C^B6$&&/= -MZM*UR5_E)_'Y(````!P``$`%2Y37@*?IN=2Q,@GY[C#M'%^Z4WE2$[=&V8@! -M``P!```,`0```@```$4``0B"^@``0!$``,"H`0'`J`$"`?0!]`#T!]E&;)*Z -MHY4":8:X&WZJ2/`6+B`C"`````$```#L(P``T*T'2$)8IB&]8ACLR -MV%)MD]%Y'>!/X8E?PL-UG#5(`+K!A_\D,AVN;3%L4@#IKQ-2#8E,QZF^D>XB -MJ0U?^@5AVN(@U="MQ)YR[AV^&9^^SJ`2,V%*CX1TJ.-J*-MN_ZBV. -MXWJO6EBY,;6T'+_Z.X^6076C(CVO?^@6O3^K@N%`U(3MT;;H@$`O````+P````"````10``N(+[``!`$0``P*@!`<"H -M`0(!]`'T`*0&B49LDKJCE0)IAK@;?JI(\!8N(",@`````0```)PD``"`&(&! -ML6(O[DKW]1#,J>+(MCLQ)HG)1T;3N988V/9N;4X!$6^1:*;P0$`'`$``!P! -M```"````10`!&(+\``!`$0``P*@!`<"H`0(!]`'T`00'Z49LDKJCE0)IAK@; -M?JI(\!8N("0(`````@```/PA``#@==U#A?86TPNJL6P!M!V,OOHD)K=B%28%CF5A); -M.QIO4AQ^T.PU8![X;EFXFT?^8&#D!&S-6"CD`KQ,1*.% -M=-8]8))BG!%ZPS[3`40Q?%(3MT;\S`$`_````/P````"````10``^(+]``!` -M$0``P*@!`<"H`0(!]`'T`.0&R49LDKJCE0)IAK@;?JI(\!8N("0(`````P`` -M`-PA``#`"Y*4:EO@-=],7X$M[871Y)"SX#L[X<=R:GV,,/^F05+[3WY@+^AZ -MVE'JW:*#DVAL2U=R`AI31[QQ#84 -MHN$)5/1>`6C1,(+M//)<:BLB&M__6KS[!'T^)&JHC$"?CD6.7CR.:SNJSBOM -M=.=+,&V!`O7:%F0\8:I2$[=&J=/V43O"`9K/&,Q0Q2:^ -MB/;W]PO.Z-9E8LQMSICSV-K=-?/LK[P8EFT$26+_26U1Z:=@KKWA2FF7O7B. -M"B5P@T!Q4?3R9M$'*3:)-M_2T8_%1:[#51EE>_P\,>JCB=%500#XQ],^*7\` -MP6-CX^C\"_GQ>L(\@`^X2[5Z-8?56"1/)+M6O!_A18]/)N-3:GDW0N0J\$W# -M#@N?L2.SLA$HX\73A^$D5<*EKZF>V-5RQ,OJM_U6TT1$:.HWN932L04A.W1D$:`@`<`0``'`$```(```!%``$8@P$``$`1``#`J`$! -MP*@!`@'T`?0!!`?I1FR2NJ.5`FF&N!M^JDCP%BX@)`@````%````_"$``.`W -M;:Y_*==/KQGJ:;"TD(/Z\&)!G%]7I>0HW*?I]%N>5P93!\2QA\UU1CD`?8TO -M##\(A`R-?0RU(/B'JR@%3=)1FS9?\DV(9D6J#X99%F-KT4CPT33T9^@IH)QD -M-3A@EI.^BO+3<>]ZTU+P"RGI$KUM+MQ,;_'%W6/V+^3-][!TF-P";J1`F14B -M9:+VT^SL[,K7)B)[T?YX68V#I7U`\MK9&-(4VF"?0+Z#-UR]"H -MD"YQ%7=BO4S\/%A)945"-VLTLZFK(;.232NAS>C1R^,I#.VTMO/@\?P@Q -M4TSXD<"5'\NBFD#-;D"QP%6$IG584A.W1LM,`@#L````[`````(```!%``#H -M@P,``$`1``#`J`$!P*@!`@'T`?0`U`:Y1FR2NJ.5`FF&N!M^JDCP%BX@)"`` -M```%````S"$``+`(2&FS'\4!J5EDU$`J&9J#_&(I:\H<0=2B2A8*)IZ4*:F -M0+\G4A.W1I5I`@`\`0``/`$```(```!%``$X@P0``$`1``#`J`$!P*@!`@'T -M`?0!)`<)1FR2NJ.5`FF&N!M^JDCP%BX@)`@````&```!'"$``0!F6A)+1/^) -MWWDG:\&P"X_\GV(%IJU_0IX]8GB8HV^9,99!QC^='7$- -M9&@?Y.RDB3'>Q -M%RV5D16@!J6;"W_X3V%MTD)YT7FL6T+O;!2_+'J7[K&V#3_\PZ>QLFKZ_QR]S&MEQ+?L@MAOE5&+#4VC3"T3!W-?/;5#!+\Y -M`BS0(.>-6FP](>BA*JOTO!_Y%-]2$[=&"G4"`!P!```<`0```@```$4``1B# -M!0``0!$``,"H`0'`J`$"`?0!]`$$!^E&;)*ZHY4":8:X&WZJ2/`6+B`D"``` -M``<```#\(0``X.F>=FU8?WWL]F^_'X"V$:F2'Q+>(@C8YJ&_:V"4)7GH!)GM -MRF^(HKQKV.0Z0IT.`7B8L&QS3CWD(A-]H\G;;=K8>[WIE0:,WUD']-F<2!;JY)^U[6E4+Z8&"<-Q-(MU]YPNB-)I17JA:42W7>.IIW]M.+U? -M5!KCNL];9.+^&3\M@9>3HVOQ/O_90?5'V;-#JD+\2%D$$I^06$QIC;?M";*( -MS`Z$&[0U%/$63S"#S2K,N2XYXGU=]T>7_00@P2;1S"!2$[=&@J@"`.P```#L -M`````@```$4``.B#!P``0!$``,"H`0'`J`$"`?0!]`#4!KE&;)*ZHY4":8:X -M&WZJ2/`6+B`D(`````<```#,(0``L!XLUP--NQ12.O2?UZ:JV)S]> -MBZ:5%3T;&9NEM'3U3?S[7MG&Q)50LN@([%"'QT)?6@1"=:T8_?_)H@.%^*1; -M5>0W8`B\^&*/$C^K%J9'J/]?`C$[`SMK?]^5I>N,#]O0J$ -M=_G/K+Z@L<%UP;X"2N92$[=&,,X"`(P!``",`0```@```$4``8B#"```0!$` -M`,"H`0'`J`$"`?0!]`%T!UE&;)*ZHY4":8:X&WZJ2/`6+B`D"`````@```%L -M(0`!4+//L>6-IA@10HR):H<-UAU%C1QSVXVC7W:FX[4YZJ;D`YI\+R,?HY4) -MH:WG?,=<4EI5=5=1C^8X;Z:$PE=SJ/K&+,^).:B6_HB38@P&>-7`E]@@;41D -MOZ*9R@EVGH*7G`$O:)@WZS+R!W9CD$=)$=,X%V\'CJR3MNIO2T&8;,"`<_J!(K/U@M+YHF*'@Q&W6!]KZG+$]\9%8 -MT6U!J6?2K=7G6<_D\GWU*LZ*0F\7ZH?'"L5@3P)#K;5.3[`2_N#+7.HKQ@D*CYL/N'V&'2_VNVK\/T6 -M3!+$ODOP3Y&5/9J5M$+1&PF`O67/U5HI+FZ^2_#2)<^D7B#59A-SY%-Q"!09 -MXZLUWR=JC-V\Q^<*ZA!YD)D"O(OG4A.W1F,#`P!<`0``7`$```(```!%``%8 -M@PD``$`1``#`J`$!P*@!`@'T`?0!1`N12`NS==ZY!1T&JZ35G>&GD?T -MMZ(%D\O)@QJB\L-RE-3@&F<4NSI#&TV.<6AN'0V.#F363'51-C7;\:23(,*``!`$0``P*@!`<"H`0(!]`'T`&0&2;T%EB]4\L<^=S?BI/#'$(,N -M("4(`````````%PJ``!`B=`^P'&+U1"XHR7"%?\D2/$VO(AH(J8!9=Z!B(*Q -MD-P_0S*I@W>[;M$=]JN$"!7+O+J,Q6P/K3LK'Y1N4A.W1L\U`P!L````;``` -M``(```!%``!H@PL``$`1``#`J`$!P*@!`@'T`?0`5`8YO066+U3RQSYW-^*D -M\,<0@RX@)2``````````3````#"[/[%)\Y+F8'O#DBN5"F<<<,B3(:(L6A.* -M&,DB1)OXFD>-S[5C0T0?+MC7`%(3MT9U1`,`;````&P````"````10``:(,, -M``!`$0``P*@!`<"H`0(!]`'T`%0&.;T%EB]4\L<^=S?BI/#'$(,N("4(```` -M`0```$PJ```P0;;TX5>+H2:_X63=1OMETD1]Y8)'OUTVU)GE$$?*&93L7&"; -M$`YELEK\_XM2$[=&=E(#`&P```!L`````@```$4``&B##0``0!$``,"H`0'` -MJ`$"`?0!]`!4!CF]!98O5/+'/G?*G>E_>G#6UEH\=^:YZ(A:Q;?*&-(*"V9+@(+S9F4A.W -M1G1/!`"8`0``F`$```(```!%``&4@PX``$`1``#`J`$!P*@!`@'T`?0!@`=E -MW18[AP=8\Z4``````````"$@(@@````````!>"(``'@```!T`0$`#`,(``P! -M```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(` -M``(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P`` -M"`0```(````(!```#B@``(@``@``GD3^I_[<7@O?=@X%+B?C]8GY"%TJL36D -MP]VC)[`LTNMU6,)A%.IFS,8/9%E#(`SB2J#!W(H2LLSCCV1/, -MA='`=T4&%-9W^:-;1<\?DQHD]VZ!4C1,^(D3=%^6.1HD.7\>^'Q"'>7.+/LG -M%]NOFMC6@`YN2=D/"JTI```D@26!_>3+Z!\`J#A^1QZ($=$$(]93(]IJLH,4 -MN=(G*2`I```<``!`!)$62KFR$>4XX_W*6\NVNN.OTJC7````'```0`5A>"7; -MU"0NDN7(R)3+39,',\O3N%(3MT:>7@0`7````%P````"````10``6(,/``!` -M$0``P*@!`<"H`0(!]`'T`$0&*=T6.X<'6/.E```````````I("(@```````` -M`#P````@``!`!@````IK@>D00E&K5]Y&,NK?`;1"D*D)+%(3MT;M;00`N`$` -M`+@!```"````10`!M(,0``!`$0``P*@!`<"H`0(!]`'T`:`'A=T6.X<'6/.E -M```````````I("((`````````9@A```@``!`!@````IK@>D00E&K5]Y&,NK? -M`;1"D*D)+"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,` -M``P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P`` -M"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@`` -MGD3^I_[<7@O?=@X%+B?C]8GY"%TJL36DP]VC)[`LTNMU6,)A%.IFS,8/9%E#(`SB2J#!W(H2LLSCCV1/,A='`=T4&%-9W^:-;1<\?DQHD]VZ! -M4C1,^(D3=%^6.1HD.7\>^'Q"'>7.+/LG%]NOFMC6@`YN2=D/"JTI```D@26! -M_>3+Z!\`J#A^1QZ($=$$(]93(]IJLH,4N=(G*2`I```<``!`!)$62KFR$>4X -MX_W*6\NVNN.OTJC7````'```0`5A>"7;U"0NDN7(R)3+39,',\O3N%(3MT8F -MD@0`4`$``%`!```"````10`!3(,1``!`$0``P*@!`<"H`0(!]`'T`3@''=T6 -M.X<'6/.E'J5/>YE`Q_$A("(@`````````3`B```P````+`$!``0#```,`0`` -M#(`.`(`#```(`@```@,```@#```"````"`0```(H``"(``(``)?T2S'ZDLJ@ -M^ZDU_XG5V-V:$]">#XVSHJE&T`K`OR_J7.P;I*0``'```0`3)0J*:OICA#Q!WV^J>^P<9 -MOW;$?P```!P``$`%3KJG[>Q&_+C4'_UQ31.`9/YF=O12$[=&-[\$``P!```, -M`0```@```$4``0B#$@``0!$``,"H`0'`J`$"`?0!]`#T!]G=%CN'!UCSI1ZE -M3WN90,?Q+B`C"`````$```#L(P``T&JXM@_O)QU-S)K=$89??.0&`U,PN.OI,Y\'2[$ -M(Y!_75H+S7FJ4I2EC=NK9SYVYF$JQ`RTUEYYV=!Z!3 -MT]$I??HU115*K1X;3[%1'%DIS>5A\3R4M(83__EC965R>.,80YM: -MO%(3MT;HV`0`O````+P````"````10``N(,3``!`$0``P*@!`<"H`0(!]`'T -M`*0&B=T6.X<'6/.E'J5/>YE`Q_$N(",@`````0```)PD``"`#/(EGS4O_![_ -M?4.\(>7).2CRN1F##I-19V=75"N$`O?[OX -MY=$M3'[&).'CP1(U*D@[9!0#!R-\UQ.C_U(3MT;2]P0`'`$``!P!```"```` -M10`!&(,4``!`$0``P*@!`<"H`0(!]`'T`00'Z=T6.X<'6/.E'J5/>YE`Q_$N -M("0(`````@```/PA``#@YS+OUHM!A9Z'?S@OZ^II.<7@]9-%UQ.TJ,TP_?<9 -M*V&A%UMU\_Z`X69@32[1@N5*<(CY2;)FZ%JV`L`P]+E0#9FJL373Z+9FJLMC -M%>$[[5,"F"'1VJIV8[HS$$9-3GUDJ.!6*CBMKIJERU5#PA%D"IL>;NQYE`Q_$N("0(`````P```-PA``#` -MQ_SU,@_-S84M]Y68+92H8?Y:2:#"*MMLKX86AZ$$=UY4%[/K76F`E@>WW/>4 -MNAORV%R4\JC-,&A!L'W]?.+>*T4H'7Y]J$]WYD!,"LJZ_CR`?G$1ED?J],/. -M)W%(:=B?SQ`>^]*;3W1*!]C$UF/KP*3>?9MJQ8I$)E%Y3Z2%`:^HL95607Z; -M=^ICR_.(J@S)+_=-Y84%OV_`J'$@[;L]]2>\6XT'U]SN(@R<#+8%L_!,TE<= -M@[I+Q`H(IVQ2$[=&7`X%`&P```!L`````@```$4``&B#%@``0!$``,"H`0'` -MJ`$"`?0!]`!4!CG=%CN'!UCSI1ZE3WN90,?Q+B`D(`````(```!,*0``,"BP -MZN1TQ0*[Z8]4J0!=$QQU?D@>ZY&6*$4L$(ML64.07BP>>XA=@)(_ISS]4A.W -M1L8I!0!L````;`````(```!%``!H@Q<``$`1``#`J`$!P*@!`@'T`?0`5`8Y -MW18[AP=8\Z4>I4][F4#'\2X@)"`````#````3"D``##I13R&S\L6Y.J>5(Q( -MJ5]E[I..1MO5UE%K)64F3TM?*BV-E/>#7QV255^J>%(3MT:*1`4`/`$``#P! -M```"````10`!.(,8``!`$0``P*@!`<"H`0(!]`'T`20'"=T6.X<'6/.E'J5/ -M>YE`Q_$N("0(````!````1PA``$`TR1-&:>H#92411_]F_OO;9AFCVY0@X5S -M(VQP#0+AF]?=03-_18*5Q0IW'S9MB?EN,0O-3<)-CN\SUAVPDM,`NVMXP;DN -M5`;KW`V%P1O&XPAO!3F6[_408>$?;!Y7JX%&#-B*A.0X?LPS.6G<$AHX$/R) -MD,I,+U%O,6*+,B`GWR>M;KKRUMJ&AAD+)$\K!RJ?U8=AW)&K"AC_@D3V>F[Y -ML$04<'*,U_)X2)+\,"9];K*OH)%9'"F[85.\I#O_KH3YK1GJV[B/8X'%ZX"V -M@[X;WZ0130WICB/V@-,^).QQ^&A4R^:4@%7X,BAG!3CH/M29'4I4][F4#'\2X@)`@````%````_"$``.")"QWB-#N+ -MKHD>S+YAB-\LB_8Y)1KMTZZ_U26K@<^TY>2DR;90<3VRBSF#]TL<,O6&XS#8 -M[:39`"ADW?JD#*90*%+1V@'.;A9I<&WU-IYK5$ML+G"_^W"I_`1)]00G68:? -MDZ-N+$F2,,62MD+;;*GY25Z[B,S^>K9,ENM@AIFSF..DV=5X*O.H3YR!9%8! -M,WSF1Q/FEWWP -MI4][F4#'\2X@)"`````$````S"$``+`A4C5=]('/?-SWM*XX>#)J20[*](M, -MC^&4\/TO=1@9B$;$.AXQ?1"%]QZH%ME9_Q.J'.J,&MBN`@]JK!:WPX9'1QRJ -MM"2:UFY^A#K7=05M].?":^%N]P/$4_@+?R53QY,32#2=2PQ7^#YM$,.8^_0GX4LI@>LOG9!YQIW@#"S(V)&BDOZLD* -M%J@RRFF_*.M5?H,`00$/4A.W1JB!!0#L````[`````(```!%``#H@QL``$`1 -M``#`J`$!P*@!`@'T`?0`U`:YW18[AP=8\Z4>I4][F4#'\2X@)"`````%```` -MS"$``+!EQB;>$O=:T0;@R0]D(6H8%0%^5B)RS8`-4A.W -M1AZ?!0`\`0``/`$```(```!%``$X@QP``$`1``#`J`$!P*@!`@'T`?0!)`<) -MW18[AP=8\Z4>I4][F4#'\2X@)`@````&```!'"$``0"<_BIBODFS^/@@2AN\ -M("FT,CY,9T$P:K\,8&KIDM<7=Y(3.I"VCP"7?X%8-A1(]?U5Q93@.8[W>EX$ -MKF"*&!MM2#\R#].B%V\]PK"!7?9$VD8R<_?@S,\P7_^18ZJ(BW>^3P$`12[T -MIC;OQG;/M%A5,F;82#\.Z+OB?%NFL'L&U#YFM2M8+V-?/[^JYE86`N,,OKZJ -M`V!%A6["I0D7=Z:ZA;K23G]Z(Y*[$<"(,B,]KB5LGX>>CR*F])LL4M.DF/=A -MH'7VDX0J3^NL7B011S2?>$-L"@LB-ZF/@=PUZ`D,=#P71DD%0"7`P/[[:;\> -M7$)TNWR)$;(7DL#*UFM2$[=&/*L%`!P!```<`0```@```$4``1B#'0``0!$` -M`,"H`0'`J`$"`?0!]`$$!^G=%CN'!UCSI1ZE3WN90,?Q+B`D"`````<```#\ -M(0``X,?U$JP[S)C)XRHPBE0V3H0C'00&[KM1BC'1C9[7!"S37V8] -MCA0J^"#>4$TJ1]\*'$BN9Q+KQ*WR(&$TB\'?ZD/Y>TL9W6'^BI'0LWSQV_:: -M#@F`09"DOPND)?2C!+=6@T+8S6!BD+(-$K'8C`T2?\8#FR(QM,N=.HZRU6*- -M9@?-,-M]06%<>'12*H[06FL+Z*]`NULJ&`)JO,_;.$WUVEM<,8<=YQWA6`5R -M72:MZ^TN(">&BKKY'QJH]+,_BF;D2ZYQNO+TO".L*-7*U$N`&A852 -M$[=&Q;P%`.P```#L`````@```$4``.B#(```0!$``,"H`0'`J`$"`?0!]`#4 -M!KG=%CN'!UCSI1ZE3WN90,?Q+B`D(`````8```#,(0``L!2$)W$7SH%8X0#] -MQ*C@O)[KC[;$]Z:QB0P+./(A\$#?`R[SBLF2S;QN8?11KLP7X$IBJ'AW^,7* -M.D86;0.2_"Q@!$P)_>LB:C,*O-U9:S'Q0IN3_?5!#W34.&E*)XY@2XM$7^T" -MVCK)ZD4`,NGC,Z,*,O;0$:OFF!I%UP>MLS"_[K0+VG^!]GO+(..I<.&J'E;/ -M3W)MUCQ&2,VF#?%(IF[3>/C%18+7),D8^"M2$[=&+>`%`.P```#L`````@`` -M`$4``.B#(0``0!$``,"H`0'`J`$"`?0!]`#4!KG=%CN'!UCSI1ZE3WN90,?Q -M+B`D(`````<```#,(0``L/[F87W9&R>LSCQN2T!(_HF"%T'+D"L28BP_7I&3 -M7`@BB#@H5N3^8_PK2%/G\M#%@4=!^L\6_E>A!F*-O6HX?*2[>`/4+#(\E;O* -M=$61$`X$@').VVT)0A3&+/TNFL#:$,CO\ZFH[)M^HE^L76^=EJ@C.C`\6=ZQ -MLQQD>[2/1":F4_#(K)%XN`K"2]I'*4%=EVD" -MX:'@ZLO92$[=&\@\&`(P!``",`0```@```$4``8B#4P``0!$``,"H`0'` -MJ`$"`?0!]`%T!UG=%CN'!UCSI1ZE3WN90,?Q+B`D"`````@```%L(0`!4$C' -MR_7&;/>W`*QS#AH,D\VB>QY-K_1#%O<>MV?`F?&2#GU';_[D0J5Y3(E,/%B;I7JD60//"DGM4(C#8 -M8Z90-&TR?<-W$U*,]:DC04/7WU6$$;H'1K&&JOA4%T7& -M7'DH/\=XXM`1U%Q-DC?47[6*4(Y??73R:6%E?3=&*K8^"@*N5B)>SOD>DGA; -M8=SWSC@\T7K10I4][F4#'\2X@)"`````(```! -M/"$``2#YCC4.+2@TAN( -MAU:P`\2D5;==,$]7_6Y2Y/O)[VSGYHO,G7L1N8I:4V+7\A%PQBAQX/C4#&SW -MWH'"59\-T;$*NH%3(.^ -M``!`$0``P*@!`<"H`0(!]`'T`&0&20G!DQQP\S8_>K%`Y$\P&%@N("4(```` -M`````%PJ``!`A"$V.JD>B'VGGBI!B\YCK$2>+H'0%=GKC%*9L6+I:C@,JB!3 -M&R_-^H.HP%V8)%MB0Q@[M$M6(8L=AW'F4A.W1KS*!@!L````;`````(```!% -M``!H@[\``$`1``#`J`$!P*@!`@'T`?0`5`8Y"<&3''#S-C]ZL4#D3S`86"X@ -M)2``````````3````##2T"=1BC9QE10S@3A>%X3;WGT_SD%(3MT8PX@8`;````&P````"````10``:(/+``!`$0`` -MP*@!`<"H`0(!]`'T`%0&.0G!DQQP\S8_>K%`Y$\P&%@N("4(`````0```$PJ -M```PB78WYN<>*Y>+-,YUCC8WVS_$FU2I3:$4I[_?+]I?,+UBSJTU>G50>W-% -MMZ]2$[=&908'`&P```!L`````@```$4``&B$$P``0!$``,"H`0'`J`$"`?0! -M]`!4!CD)P9,<!X?Y=.(.HB?R_8S-:H1.B=I,_'/VW\=HV>YY4A.W1K0E"`"8 -M`0``F`$```(```!%``&4A$$``$`1``#`J`$!P*@!`@'T`?0!@`=E;#4V5*QD -ML50``````````"$@(@@````````!>"(``'@```!T`0$`#`,)``P!```,@`X` -M@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```( -M`@```0,```@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(` -M```(!```#B@``(@``@``BB5$W#OQ1MW1$*?3A:*AE/%`-]O+Z$T7A9)0=!U[ -MA5@@>[U!$TZGH%KQL.=3AD`D"@J(X!=:2ZL9GJ7]U0O#V]N5I[TDYC**D&"? -M[7,@">.L.5BD:X,-@T?@-;0OYY7)25LG_TF^>X=0%UPMOX09YFQB)O5(,.AI -M["+0NM7U>S(I```DU/=1-F.%1QACR,7HU(3MT9,1@@`N`$``+@!```" -M````10`!M(1#``!`$0``P*@!`<"H`0(!]`'T`:`'A6PU-E2L9+%4```````` -M```I("((`````````9@A```@``!`!@````ID"C"M?_7NL+>=1-F.%1QACR,7 -MHR(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```, -M@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(# -M```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@``@``BB5$W#OQ -M1MW1$*?3A:*AE/%`-]O+Z$T7A9)0=!U[A5@@>[U!$TZGH%KQL.=3AD`D"@J( -MX!=:2ZL9GJ7]U0O#V]N5I[TDYC**D&"?[7,@">.L.5BD:X,-@T?@-;0OYY7) -M25LG_TF^>X=0%UPMOX09YFQB)O5(,.AI["+0NM7U>S(I```DU/>,A("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`# -M```(`@```@,```@#```"````"`0```(H``"(``(``(FU193STV__T=]N+!X7 -MB,<:M.J@W_FG(#3N@``FTSS_&I)I/XCBC$.^/CC;OVCM4*A(TKE,HLI!1_&C -MJUP)FZH7;.T@I4W:]ZS&P#4$PY<-S&AQI';N,6JW#&&>R@W!U!06AZ^3J*%1 -MZ\B4^5*`!LG:0+7A:9P[CLTOH)C&20J"*0``),[#;.\)LZQ,SL,H(QI-X![_ -MV`.%*R%HXLB0F=.3S0L!*0``'```0`03F5[_Z86:=5VXRPH3`V2MWK]1I@`` -M`!P``$`%#K];:J=]508G/RD;,&H4CG2DZ,U2$[=&>ID(``P!```,`0```@`` -M`$4``0B$10``0!$``,"H`0'`J`$"`?0!]`#T!]EL-394K&2Q5(=[Q804U7GC -M+B`C"`````$```#L(P``T"EGQ-8>(>G(I>#`5GJC5YFC-='0AKRD515QEQ*\ -MTFZ+`$!R,S$3HBAMD8'0E;BQ#=NV,(9'R%/]8[5<5[<_#1($?0],62S)5-:U -MFPAOPNX^1">HRBN;B*2B"0XPXE6[C_\(:@ETDO3O+\8[K_--IOU4J9B\VS8- -M^[)G$SMCN;B\!OY`*IGP&K2?"@C0AO7@EO%X\1FKK$Q&/\Y=?K&6QT;$\78V -M)9IBF[&Y9-@$N&K^V`F?MV.3IHBKR%N8(\%M;KF-ZV[ZX&>,N(",@`````0```)PD``"`\J8J&I(=-_3(/=1VJ$X@ -M[`59.`D770NBW]I]EA"'\DSFN]P'=8:YKJ<'XFM2XV>` -MU-;L>KD^YRSU55$B5UAZO-"$D%Y2OEI"82/U'[6M4V7S,VV]X8GZ5*=;*K:8 -MYWPT8HKDH,#QE0U)A)P*(;=Z)U(3MT;@T0@`'`$``!P!```"````10`!&(1' -M``!`$0``P*@!`<"H`0(!]`'T`00'Z6PU-E2L9+%4AWO%A!35>>,N("0(```` -M`@```/PA``#@`!<:7^DN!\&3!+1N;]:1M&I)-DZ15L9S7?PH_0<"A7MFW[<] -M*F8%#X;=6(H+)>+@-S<$S%(/'F.3U#5V?F5(0`Z\,^YN&OY\(8RV3GIQ;"50 -MM@]9?7B3,(Q_',]GK*>+%LDI[7OTH_ON-:^,IGM)U:]LJ<1JE_^W"D9*9*)! -M93*/<&E%2-'-5Q*ZZ?OQHTOO;*[_FXW1S$"1X8C8(Z:_*>F%0Y5PW;3W5-ZT -M^;`9,:P6'8[L<*2:0OK2]5Y;H!U">P6C:RSNM[]MP->*"C[#6ZFAZL''#8"7 -M$*,@]5(3MT8>,N("0(`````P```-PA``#`3.G0;KQ? -M2DJUT^C.Q%F@N^*]5/I#ZJ*`C,OINDE\Q-R_13F[<72B;@_X4**S-7'`"6=I -M^,"(B'7^/I5\!QV]NGQ?HQV^+186BB*:U]USL\S0SS<,?)QFJA4:3"",N0%\ -M(V,.>*3IR3@#0J.1RRQ&SC9#I>Q*`$Q:>8@@IJ`,)[@FS&3DV(OYQ)4T:KEC -MCP''J@2[P`1"0T^@.KW9KVOF3YET_++=`KY\I8M$%U91L1K%3Q=Z$$S(JZW. -M)%U2$[=&[N<(`&P```!L`````@```$4``&B$20``0!$``,"H`0'`J`$"`?0! -M]`!4!CEL-394K&2Q5(=[Q804U7GC+B`D(`````(```!,*0``,(,I_P1$.6-A -M8U9-*HU)^4^AN.;C4O`!_[(X/P1NDY=15/G?*70=VZ?;Y7WU4A.W1KP#"0!L -M````;`````(```!%``!HA$H``$`1``#`J`$!P*@!`@'T`?0`5`8Y;#4V5*QD -ML52'>\6$%-5YXRX@)"`````#````3"D``#"GLSH^T;C0J407CYO"$65Y-(MT -MJ"67G?]S712[F2N#EFT(Q6E@#N]A>,N -M("0(````!````1PA``$`6%09P)(#\],9NKO[P!D/I@1&;FV8`H3.3M*WO<2A -M4^H;*%?3>?S1T9$X`+.`/`VC+C6L]UK>73X!W=!&>Y/IX2W*N+!ZC5NP\BSO -M9HOKI#UQ:_0O$0JW+AKU7+Y0S(GE+3/R:(],1:(!#W>]>;.>X9 -M>^F;)HTY*9=Y#7C$-Y@A=A-??//$2?\S&8;/,+FE\@ZE`?`KLE\:;<[QP3Q= -MA.7\6$%-5YXRX@)`@````%````_"$``.`=,J)/MH@UK(,]CC0C -M&->3IWP!'@^""OT(PT_6AB'XE<;=GHDSP*DV/X#[2A3E,"-'#_X[X`8W<\%7 -MDC-W?6IZ$00<`HT7ZD]PNU(:JV4XL`IC]4&32)!4<7PEG`Y67V$QWL%FGW-% -M_&_Z%4(&9M6+-!8E'KSI$=_9O95MQ[3X+LO6W=D+L07[CS=6:43]RI/*S-?? -MYRE8G;NT"(ZGA,$ON_DMK;_VE8OJ8*7WLC(2+<82$&:TSFF$P)AM[&:\,=XM -MW+4A.W1A,["0#L````[`````(` -M``!%``#HA$T``$`1``#`J`$!P*@!`@'T`?0`U`:Y;#4V5*QDL52'>\6$%-5Y -MXRX@)"`````$````S"$``+`$6[KSE4.#BO!GTPP?;DYN:GP2)K0(%A;YIT5CX.8@M>`5Z -MH*GS\\B[R+REBS-<8V\"Q$N&QGH[3%C$,:&KF/4MC42A$6%7!)3?WF$N'2)` -MEM&_4=,'6_HT4A.W1B)="0#L````[`````(```!%``#HA$X``$`1``#`J`$! -MP*@!`@'T`?0`U`:Y;#4V5*QDL52'>\6$%-5YXRX@)"`````%````S"$``+#T -M9V7Z?S4U#KM>(>R_52OS]O7U5=-'M^$ZB]N]T@*?.+9&3$J/@9]N?X#V -M3#9'HFZG;9+0AKKT^>U0+^F)!H>/0V`R1IRV(_`8^0#[P"MVPTX3OUM\6$%-5YXRX@)`@````&```!'"$``0#4*QQM&R^&+&_,LQ0`PN7@8YYH -M7H[S_]"9`#+@75\=<.I$W4QJ4TD3=A=AXK(%VE7@RALF*."I)`PZ:1<=^K)4 -M[O;M]OQK1:U$5GH]+,NTV2!#^>-7=C)Z=D]\B&_VX"SW?4OI,R@&NH8_#$)' -M/(X3?7H%O\W_I\X&AN=#3*:@9X[?:D[]VP[X;1!3RGD8(P=MSQT-=KCVQOKX -MX'5+W_M2BU/T@]7]O\1^FQ&2D5PQ'H893S(2062(`X'+&G[-+\?WM]S$R%UU -M=>A6S)].=R^`^8J(60GC0MJ@7 -MZ2N+HQ)![W07Y0^S9+M#M`NG/M":=J5U@A=\FZ):RILMCG`]7`H,%$20>RP -MR!-.WH-R7K34X1I5[EBU5QE1R-M2_(*99P -MG7Q-PK>MV%_.8:K<9B?8\@ECD*S=_6YWN1;_A(ZXAC3>J;?8!]M"3G&;K*<< -MR3AO_E>38L!MNI2:0-7SNT6!;85);)]IRS..F5V\5IL](N?RFMI2$[=&QY4) -M`.P```#L`````@```$4``.B$40``0!$``,"H`0'`J`$"`?0!]`#4!KEL-394 -MK&2Q5(=[Q804U7GC+B`D(`````8```#,(0``L%)JL-*>A8+T87UJ3\3:^T`$ -MVZ:I2F0X3)EDC5:@%<1/8WFW;4+)"0O(7,V?@Y;D@XA#5K51M'^/')MWP]<0 -MCE_,'LTW4=64.&5]<$[2Z6::"$8L7K@6+D])!F`\G>Q@MJVWB'L7`K`ZM-W+ -M?HEL?;U3NIH),V;959#[3#]INMJ?/?/5?B$F;:`D6KU.X(.&.'.DOVZN3B7/ -MC=P?_\B?2>6S#[#`G=2$[=&S[D)`.P```#L`````@```$4``.B$ -M4@``0!$``,"H`0'`J`$"`?0!]`#4!KEL-394K&2Q5(=[Q804U7GC+B`D(``` -M``<```#,(0``L)4<\'2Q(E/EI:?EC95:LU5`ANJ79M3T3C[ -MQ68_;1;:*B%^)G;"/@/O%_7+D&#,%92;Z;`0\).W7+R;T&*)3!./BY'*KZGA -M-]M2$[=&^M\)`(P!``",`0```@```$4``8B$50``0!$``,"H`0'`J`$"`?0! -M]`%T!UEL-394K&2Q5(=[Q804U7GC+B`D"`````@```%L(0`!4$$<`/0LY$FF -M][P89&]C_18FS(4H8'*?GJOM&_H?&%1X:^C:1=$`M(PUM39AMAR;0C^Z4)4& -M9^UFG2)KZ[@L=WQ6CTXXL@IHZBEBI)N#`&:GPA]_*J6S:*R0C=^V]5JXE"Y[ -M*Y7QNC!!Q&&>`+I];E9[[=BW5D$*Y70EW -MXV.B32K+T_*,^2J!;+P04WSOQ?:NEP3E?B^WY#F\PHS)H='<0=.)!,C!U:=' -MV9DE?D6!TN[9,\C[9^VYQ`[I`BO&CGQGPN`77;<>2%*('R7@ME8[AO["5E\< -MG0RTXU!4OL@;R'H5>9F0SX>:RY(((M;A.MD/#%',KF2@3N -MEFX(WU)`:3:H4A.W1B04"@!<`0``7`$```(```!%``%8A%8``$`1``#`J`$! -MP*@!`@'T`?0!1`\6$%-5YXRX@)"`````(```!/"$``2#6 -M]CR#&)G0#?[K`)EM((]\A.*MRLC]H3?N8L""755K:0'_12%7CW%7^4='(SED -M\Z+!),_XV-"0_VZMRH53-JT_-P9;]2-`&UAG&TC;E8?1*],EZY#WW@8-$=Z5 -M>%<*1)T[M?II)XI'Z@=-M"DA:4K?-++@;?0%/2)O`R?BZU6V/HFB<:>[T4+0 -MQ9/PPCW1V?4Z,\F'0H^MT=#>'-BVO,C@Q?/FL=W>IYA7VI.,Q@.4Y,_L5?@Q -M#^D]9>#0VQZU>Z']0W<-<6F_>YOBL##GY#*.CG8C!1F.E*_L::3QGP7J&"\D -MW0AK6R^)U&*3"XS%\J!9?A9ELG4.87L1[4>%,?Z8OBV!4=>PNC@5;D)_6X(L -MXEQO6)S><`>3%\MZ\U(3MT8M.PH`?````'P````"````10``>(17``!`$0`` -MP*@!`<"H`0(!]`'T`&0&29Q\3YTTU51S$MBQ@K%D3?8N("4(`````````%PJ -M``!`(/"5CD^4%3G_>Q1Z&W:<"U$'=>NBWP78\!L/\J6AYL??X6S=@0E)]]I# -M32T<'<,!'K/E>BWLW5>FI"H@4A.W1KM&"@!L````;`````(```!%``!HA%@` -M`$`1``#`J`$!P*@!`@'T`?0`5`8YG'Q/G3355',2V+&"L61-]BX@)2`````` -M````3````#!<.'PD7,,I,!!T&][UEKA%SJ.7^8K-X*(:G'.%!C>07@D%"#-^ -M\)NK6IVH?U(3MT9H50H`;````&P````"````10``:(19``!`$0``P*@!`<"H -M`0(!]`'T`%0&.9Q\3YTTU51S$MBQ@K%D3?8N("4(`````0```$PJ```PJHH< -MF;454NN4`IQ3S4KC>E0"8:GT2C2BSFOD66G2J-34;JI;TB-2$[=& -MB&(*`&P```!L`````@```$4``&B$6@``0!$``,"H`0'`J`$"`?0!]`!4!CF< -M?$^=--54"(``'@```!T`0$`#`/W``P!```,@`X`@`,```P! -M```,@`X!``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,` -M``@"```$`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!``` -M#B@``(@``@``^+(?S7P^;M:_U]L4`@8!0S?,2N&>GI6?U$+/JQ\Z+W%9F4(R -MH2=5KAX,?_-A2LS)03]\@I2=S\.[?KIU'S[_(3)OHZR]Q=X)W(:A_J#V&M?3.U70JL)S$P&YH!-"JRDV<$W#R7P,4_G+CD8I```<``!` -M!`ACZT]E!7.4````'```0`7-891HG,""I3O+.;C&J&+" -M$D]/)%(3MT;#;@L`7````%P````"````10``6(1<``!`$0``P*@!`<"H`0(! -M]`'T`$0&*6>J/D`_N,&-```````````I("(@`````````#P````@``!`!@`` -M``HV_$UXDHU,X00A,+-&&(U(3MT9(?@L`N`$``+@!```"````10`! -MM(1=``!`$0``P*@!`<"H`0(!]`'T`:`'A6>J/D`_N,&-```````````I("(( -M`````````9@A```@``!`!@````HV_$UXDHU,X00A,+-&&(R(``'@` -M``!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,` -M``@!```#`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P`` -M`0,```@#```%`P``"`0```(````(!```#B@``(@``@``^+(?S7P^;M:_U]L4 -M`@8!0S?,2N&>GI6?U$+/JQ\Z+W%9F4(RH2=5KAX,?_-A2LS)03]\@I2=S\.[ -M?KIU'S[_(3)OHZR]Q=X)W(:A_J#V&M?3.U70JL)S$P&Y -MH!-"JRDV<$W#R7P,4_G+CD8I```<``!`!`ACZT]E!7.4 -M````'```0`7-891HG,""I3O+.;C&J&+"$D]/)%(3MT;NH@L`4`$``%`!```" -M````10`!3(1>``!`$0``P*@!`<"H`0(!]`'T`3@''6>J/D`_N,&-B@\DEP\Z -M'Q4A("(@`````````3`B```P````+`$!``0#```,`0``#(`.`(`#```(`@`` -M`@,```@#```"````"`0```(H``"(``(``-3#%I]1R>`'`.4.)BE^^%!ST1Q? -M^=&KAD8+"(@50EX'K`L\#`YL$BSG0'R\J9,&A^XU'%9,*YXVL3D7J:>G'S[LWA^@`WI'+!N/ -MC<5#59$^2R#S7]MDANDC>E;Q*0``)$=@W4/W"^L8P)9:>8TYD?/HBXRSJW22 -MAQ0?/"?B<@DN*0``'```0`3_L[P38BJ;"Q$J@4C_5M3Q2$[=&2=`+``P!```,`0```@```$4``0B$ -M7P``0!$``,"H`0'`J`$"`?0!]`#T!]EGJCY`/[C!C8H/))2(,G+)D@.U@0WKO,2]@T3[YA+6,Y>`E/1 -MOGQAHY7W.@]8VNC'-\^IU>S,XV)#9?;5Y.=73QIC"MXDZBE13 -MG7U'M=UG[M3.`C,2"Q^]F8XOZL&CV^U14Q&U$Z&X'V30">QI<_Z%0GU!/=FP -MQ\44`'H5=VW_H*P@WN:='T3",HCWK#:,L>^O3L*7(R!7.WZ9%_?.ZDWZX-KM -MG-W.SB24@?[N<8;/QG\#<'+NZ-/=YBH7O9EE#?5(3MT8CZ0L`O``` -M`+P````"````10``N(1@``!`$0``P*@!`<"H`0(!]`'T`*0&B6>J/D`_N,&- -MB@\DEP\Z'Q4N(",@`````0```)PD``"`+S]8[8D9I:K(!&IIH)K&%ZFFSXV= -M`48#5ZD?)#"M9^13[>*5/4_64R0U5]M&IAT]B/\BY'2Z@)OOF8O -MA*=#H@V.X4.M;3HJW,MMB8/&]?>!-P\N6:.0@#XGKUDA]P1`%(3MT8#"`P`'`$``!P!```"````10`!&(1A``!`$0`` -MP*@!`<"H`0(!]`'T`00'Z6>J/D`_N,&-B@\DEP\Z'Q4N("0(`````@```/PA -M``#@@A6?]?R7A_)#,YHVQ#YZ:4S1,,"A>\3DN*@EB/(;9(1 -MHG;F_02"13(F,&W`2`\CLRR%)47O@41